ZGlmZiAtLWdpdCBhL0FuZHJvaWQubWsgYi9BbmRyb2lkLm1rCmluZGV4IDVmOGIyMzUuLjdjODQ4YzYgMTAwNjQ0Ci0tLSBhL0FuZHJvaWQubWsKKysrIGIvQW5kcm9pZC5tawpAQCAtMzksNiArMzksOSBAQAogICAgICAgIGNvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9FdmVudExvZ1RhZ3MubG9ndGFncyBcCiAgICAgICAgdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0V2ZW50TG9nVGFncy5sb2d0YWdzIFwKIAorIyBSZW5kZXJTY3JpcHQgZmlsZXMgZm9yIGludGVybmFsIHdpZGdldHMKK0xPQ0FMX1NSQ19GSUxFUyArPSAkKGNhbGwgYWxsLXJlbmRlcnNjcmlwdC1maWxlcy11bmRlciwgY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldCkKKwogIyBUaGUgZm9sbG93aW5nIGZpbHRlcnMgb3V0IGNvZGUgd2UgYXJlIHRlbXBvcmFyaWx5IG5vdCBpbmNsdWRpbmcgYXQgYWxsLgogIyBUT0RPOiBNb3ZlIEFXVCBhbmQgYmVhbnMgKGFuZCBhc3NvY2lhdGVkIGhhcm1vbnkgY29kZSkgYmFjayBpbnRvIGxpYmNvcmUuCiAjIFRPRE86IE1heWJlIHJlbW92ZSBqYXZheC5taWNyb2VkaXRpb24gZW50aXJlbHk/CkBAIC0xMDAsOSArMTAzLDExIEBACiAJY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0lCbHVldG9vdGhDYWxsYmFjay5haWRsIFwKIAljb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvSUJsdWV0b290aEhlYWRzZXQuYWlkbCBcCiAJY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0lCbHVldG9vdGhQYmFwLmFpZGwgXAorCWNvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvSUNsaXBib2FyZC5haWRsIFwKIAljb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0lDb250ZW50U2VydmljZS5haWRsIFwKIAljb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0lJbnRlbnRSZWNlaXZlci5haWRsIFwKIAljb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0lJbnRlbnRTZW5kZXIuYWlkbCBcCisJY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9JT25QcmltYXJ5Q2xpcENoYW5nZWRMaXN0ZW5lci5haWRsIFwKIAljb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0lTeW5jQWRhcHRlci5haWRsIFwKIAljb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0lTeW5jQ29udGV4dC5haWRsIFwKIAljb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0lTeW5jU3RhdHVzT2JzZXJ2ZXIuYWlkbCBcCkBAIC0xMjksNyArMTM0LDYgQEAKICAgICBjb3JlL2phdmEvYW5kcm9pZC9zZXJ2aWNlL3dhbGxwYXBlci9JV2FsbHBhcGVyQ29ubmVjdGlvbi5haWRsIFwKICAgICBjb3JlL2phdmEvYW5kcm9pZC9zZXJ2aWNlL3dhbGxwYXBlci9JV2FsbHBhcGVyRW5naW5lLmFpZGwgXAogICAgIGNvcmUvamF2YS9hbmRyb2lkL3NlcnZpY2Uvd2FsbHBhcGVyL0lXYWxscGFwZXJTZXJ2aWNlLmFpZGwgXAotCWNvcmUvamF2YS9hbmRyb2lkL3RleHQvSUNsaXBib2FyZC5haWRsIFwKIAljb3JlL2phdmEvYW5kcm9pZC92aWV3L2FjY2Vzc2liaWxpdHkvSUFjY2Vzc2liaWxpdHlNYW5hZ2VyLmFpZGwgXAogCWNvcmUvamF2YS9hbmRyb2lkL3ZpZXcvYWNjZXNzaWJpbGl0eS9JQWNjZXNzaWJpbGl0eU1hbmFnZXJDbGllbnQuYWlkbCBcCiAJY29yZS9qYXZhL2FuZHJvaWQvdmlldy9JQXBwbGljYXRpb25Ub2tlbi5haWRsIFwKQEAgLTE1OSw2ICsxNjMsOSBAQAogCWNvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L0lJbnB1dE1ldGhvZENsaWVudC5haWRsIFwKIAljb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9JSW5wdXRNZXRob2RNYW5hZ2VyLmFpZGwgXAogCWNvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L0lJbnB1dE1ldGhvZFNlc3Npb24uYWlkbCBcCisJY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9JUmVtb3RlVmlld3NGYWN0b3J5LmFpZGwgXAorCWxvY2F0aW9uL2phdmEvYW5kcm9pZC9sb2NhdGlvbi9JQ291bnRyeURldGVjdG9yLmFpZGwgXAorCWxvY2F0aW9uL2phdmEvYW5kcm9pZC9sb2NhdGlvbi9JQ291bnRyeUxpc3RlbmVyLmFpZGwgXAogCWxvY2F0aW9uL2phdmEvYW5kcm9pZC9sb2NhdGlvbi9JR2VvY29kZVByb3ZpZGVyLmFpZGwgXAogCWxvY2F0aW9uL2phdmEvYW5kcm9pZC9sb2NhdGlvbi9JR3BzU3RhdHVzTGlzdGVuZXIuYWlkbCBcCiAJbG9jYXRpb24vamF2YS9hbmRyb2lkL2xvY2F0aW9uL0lHcHNTdGF0dXNQcm92aWRlci5haWRsIFwKQEAgLTM0OCw3ICszNTUsNyBAQAogCQkJZnJhbWV3b3JrIFwKIAogZnJhbWV3b3JrX2RvY3NfTE9DQUxfTU9EVUxFX0NMQVNTIDo9IEpBVkFfTElCUkFSSUVTCi1mcmFtZXdvcmtfZG9jc19MT0NBTF9EUk9JRERPQ19IVE1MX0RJUiA6PSAkKExPQ0FMX1BBVEgpL2RvY3MvaHRtbCAkKE9VVF9ET0NTKS9nZW4KK2ZyYW1ld29ya19kb2NzX0xPQ0FMX0RST0lERE9DX0hUTUxfRElSIDo9IGRvY3MvaHRtbAogIyBUaGUgc2luY2UgZmxhZyAoLXNpbmNlIE4ueG1sIEFQSV9MRVZFTCkgaXMgdXNlZCB0byBhZGQgQVBJIExldmVsIGluZm9ybWF0aW9uCiAjIHRvIHRoZSByZWZlcmVuY2UgZG9jdW1lbnRhdGlvbi4gTXVzdCBiZSBpbiBvcmRlciBvZiBvbGRlc3QgdG8gbmV3ZXN0LgogZnJhbWV3b3JrX2RvY3NfTE9DQUxfRFJPSURET0NfT1BUSU9OUyA6PSBcCkBAIC0zNjAsNyArMzY3LDggQEAKICAgICAtc2luY2UgLi9mcmFtZXdvcmtzL2Jhc2UvYXBpLzYueG1sIDYgXAogICAgIC1zaW5jZSAuL2ZyYW1ld29ya3MvYmFzZS9hcGkvNy54bWwgNyBcCiAgICAgLXNpbmNlIC4vZnJhbWV3b3Jrcy9iYXNlL2FwaS84LnhtbCA4IFwKLQkJLWVycm9yIDEgLWVycm9yIDIgLXdhcm5pbmcgMyAtZXJyb3IgNCAtZXJyb3IgNiAtZXJyb3IgOCBcCisgICAgLXNpbmNlIC4vZnJhbWV3b3Jrcy9iYXNlL2FwaS9jdXJyZW50LnhtbCBIQyBcCisJCS1lcnJvciAxMDEgLWVycm9yIDEwMiAtd2FybmluZyAxMDMgLWVycm9yIDEwNCAtZXJyb3IgMTA2IC1lcnJvciAxMDggLXdhcm5pbmcgMTEzIFwKIAkJLW92ZXJ2aWV3ICQoTE9DQUxfUEFUSCkvY29yZS9qYXZhL292ZXJ2aWV3Lmh0bWwKIAogZnJhbWV3b3JrX2RvY3NfTE9DQUxfQURESVRJT05BTF9KQVZBX0RJUjo9JChjYWxsIGludGVybWVkaWF0ZXMtZGlyLWZvcixKQVZBX0xJQlJBUklFUyxmcmFtZXdvcmspCkBAIC00MTYsNyArNDI0LDkgQEAKIAkJLXNhbXBsZWNvZGUgJChzYW1wbGVfZGlyKS9XaWt0aW9uYXJ5U2ltcGxlIFwKIAkJICAgICAgICAgICAgcmVzb3VyY2VzL3NhbXBsZXMvV2lrdGlvbmFyeVNpbXBsZSAiV2lrdGlvbmFyeSAoU2ltcGxpZmllZCkiIFwKIAkJLXNhbXBsZWNvZGUgJChzYW1wbGVfZGlyKS9Wb2ljZVJlY29nbml0aW9uU2VydmljZSBcCi0JCSAgICAgICAgICAgIHJlc291cmNlcy9zYW1wbGVzL1ZvaWNlUmVjb2duaXRpb25TZXJ2aWNlICJWb2ljZSBSZWNvZ25pdGlvbiBTZXJ2aWNlIgorCQkgICAgICAgICAgICByZXNvdXJjZXMvc2FtcGxlcy9Wb2ljZVJlY29nbml0aW9uU2VydmljZSAiVm9pY2UgUmVjb2duaXRpb24gU2VydmljZSIgXAorCQktc2FtcGxlY29kZSAkKHNhbXBsZV9kaXIpL1htbEFkYXB0ZXJzIFwKKwkJICAgICAgICAgICAgcmVzb3VyY2VzL3NhbXBsZXMvWG1sQWRhcHRlcnMgIlhNTCBBZGFwdGVycyIKIAogIyMgU0RLIHZlcnNpb24gaWRlbnRpZmllcnMgdXNlZCBpbiB0aGUgcHVibGlzaGVkIGRvY3MKICAgIyBtYWpvclsubWlub3JdIHZlcnNpb24gZm9yIGN1cnJlbnQgU0RLLiAoZnVsbCByZWxlYXNlcyBvbmx5KQpAQCAtNDY3LDcgKzQ3Nyw4IEBACiAKIGluY2x1ZGUgJChCVUlMRF9EUk9JRERPQykKIAotJChmdWxsX3RhcmdldCk6ICQoZnJhbWV3b3JrX2J1aWx0KQorIyAkKGdlbiksIGkuZS4gZnJhbWV3b3JrLmFpZGwsIGlzIGFsc28gbmVlZGVkIHdoaWxlIGJ1aWxkaW5nIGFnYWluc3QgdGhlIGN1cnJlbnQgc3R1Yi4KKyQoZnVsbF90YXJnZXQpOiAkKGZyYW1ld29ya19idWlsdCkgJChnZW4pCiAkKElOVEVSTkFMX1BMQVRGT1JNX0FQSV9GSUxFKTogJChmdWxsX3RhcmdldCkKICQoY2FsbCBkaXN0LWZvci1nb2FscyxzZGssJChJTlRFUk5BTF9QTEFURk9STV9BUElfRklMRSkpCiAKQEAgLTUzOSw4ICs1NTAsOCBAQAogCiBpbmNsdWRlICQoQlVJTERfRFJPSURET0MpCiAKLSMgZXhwbGljaXRseSBzcGVjaWZ5IHRoYXQgb25saW5lLXNkayBkZXBlbmRzIG9uIGZyYW1ld29yay1yZXMgYW5kIGFueSBnZW5lcmF0ZWQgZG9jcwotJChmdWxsX3RhcmdldCk6IGZyYW1ld29yay1yZXMtcGFja2FnZS10YXJnZXQgJChBTExfR0VORVJBVEVEX0RPQ1MpCisjIGV4cGxpY2l0bHkgc3BlY2lmeSB0aGF0IG9ubGluZS1zZGsgZGVwZW5kcyBvbiBmcmFtZXdvcmstcmVzLgorJChmdWxsX3RhcmdldCk6IGZyYW1ld29yay1yZXMtcGFja2FnZS10YXJnZXQKIAogIyA9PT09IGRvY3MgdGhhdCBoYXZlIGFsbCBvZiB0aGUgc3R1ZmYgdGhhdCdzIEBoaWRkZW4gPT09PT09PT09PT09PT09PT09PT09PT0KIGluY2x1ZGUgJChDTEVBUl9WQVJTKQpAQCAtNTcwLDEwICs1ODEsMTQgQEAKIGV4dF9kaXJzIDo9IFwKIAkuLi8uLi9leHRlcm5hbC9uaXN0LXNpcC9qYXZhIFwKIAkuLi8uLi9leHRlcm5hbC9hcGFjaGUtaHR0cC9zcmMgXAotCS4uLy4uL2V4dGVybmFsL3RhZ3NvdXAvc3JjCisJLi4vLi4vZXh0ZXJuYWwvdGFnc291cC9zcmMgXAorCS4uLy4uL2V4dGVybmFsL2xpYnBob25lbnVtYmVyL2phdmEvc3JjCiAKIGV4dF9zcmNfZmlsZXMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCQoZXh0X2RpcnMpKQogCitleHRfcmVzX2RpcnMgOj0gXAorCS4uLy4uL2V4dGVybmFsL2xpYnBob25lbnVtYmVyL2phdmEvc3JjCisKICMgPT09PSAgdGhlIGxpYnJhcnkgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIApAQCAtNTgxLDcgKzU5Niw3IEBACiAKIExPQ0FMX05PX1NUQU5EQVJEX0xJQlJBUklFUyA6PSB0cnVlCiBMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBjb3JlCi0KK0xPQ0FMX0pBVkFfUkVTT1VSQ0VfRElSUyA6PSAkKGV4dF9yZXNfZGlycykKIExPQ0FMX01PRFVMRSA6PSBleHQKIAogTE9DQUxfTk9fRU1NQV9JTlNUUlVNRU5UIDo9IHRydWUKZGlmZiAtLWdpdCBhL0NsZWFuU3BlYy5tayBiL0NsZWFuU3BlYy5tawppbmRleCA1NjE4ZWFhLi5hOWY0ZDE5IDEwMDY0NAotLS0gYS9DbGVhblNwZWMubWsKKysrIGIvQ2xlYW5TcGVjLm1rCkBAIC02Nyw2ICs2NywxNSBAQAogJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChQUk9EVUNUX09VVCkvb2JqL1NIQVJFRF9MSUJSQVJJRVMvbGlicmV2ZXJiX2ludGVybWVkaWF0ZXMpCiAkKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKFBST0RVQ1RfT1VUKS9vYmovU0hBUkVEX0xJQlJBUklFUy9saWJyZXZlcmJ0ZXN0X2ludGVybWVkaWF0ZXMpCiAkKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKFBST0RVQ1RfT1VUKS9zeXN0ZW0vbGliL3NvdW5kZngvKQorJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBmaW5kIC4gLXR5cGUgZiAtbmFtZSAiKi5ycyIgLXByaW50MCB8IHhhcmdzIC0wIHRvdWNoKQorJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChQUk9EVUNUX09VVCkvb2JqL1NIQVJFRF9MSUJSQVJJRVMvbGliYW5kcm9pZF9ydW50aW1lX2ludGVybWVkaWF0ZXMpCiskKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKFBST0RVQ1RfT1VUKS9vYmovbGliL2xpYmFuZHJvaWRfcnVudGltZS5zbykKKyQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoUFJPRFVDVF9PVVQpL3N5bWJvbHMvc3lzdGVtL2xpYi9saWJhbmRyb2lkX3J1bnRpbWUuc28pCiskKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKFBST0RVQ1RfT1VUKS9zeXN0ZW0vbGliL2xpYmFuZHJvaWRfcnVudGltZS5zbykKKyQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoUFJPRFVDVF9PVVQpL29iai9TSEFSRURfTElCUkFSSUVTL2xpYmh3dWlfaW50ZXJtZWRpYXRlcykKKyQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoUFJPRFVDVF9PVVQpL29iai9saWIvbGliaHd1aS5zbykKKyQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoUFJPRFVDVF9PVVQpL3N5bWJvbHMvc3lzdGVtL2xpYi9saWJod3VpLnNvKQorJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChQUk9EVUNUX09VVCkvc3lzdGVtL2xpYi9saWJod3VpLnNvKQogJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChPVVRfRElSKS90YXJnZXQvY29tbW9uL29iai9KQVZBX0xJQlJBUklFUy9mcmFtZXdvcmtfaW50ZXJtZWRpYXRlcy9zcmMvY29yZS9qYXZhL2FuZHJvaWQvb3Mvc3RvcmFnZS8qKQogCiAjICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpkaWZmIC0tZ2l0IGEvYXBpLzkueG1sIGIvYXBpLzkueG1sCmluZGV4IDQ2ZjA4N2YuLjA4Zjg2ZTEgMTAwNjQ0Ci0tLSBhL2FwaS85LnhtbAorKysgYi9hcGkvOS54bWwKQEAgLTU4NTkzLDE2ICs1ODU5Myw2IEBACiA8cGFyYW1ldGVyIG5hbWU9ImJpdG1hcCIgdHlwZT0iYW5kcm9pZC5ncmFwaGljcy5CaXRtYXAiPgogPC9wYXJhbWV0ZXI+CiA8L2NvbnN0cnVjdG9yPgotPGNvbnN0cnVjdG9yIG5hbWU9IkNhbnZhcyIKLSB0eXBlPSJhbmRyb2lkLmdyYXBoaWNzLkNhbnZhcyIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9ImdsIiB0eXBlPSJqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5vcGVuZ2xlcy5HTCI+Ci08L3BhcmFtZXRlcj4KLTwvY29uc3RydWN0b3I+CiA8bWV0aG9kIG5hbWU9ImNsaXBQYXRoIgogIHJldHVybj0iYm9vbGVhbiIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC01OTUxOSwxNyArNTk1MDksNiBAQAogPHBhcmFtZXRlciBuYW1lPSJwYWludCIgdHlwZT0iYW5kcm9pZC5ncmFwaGljcy5QYWludCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJmcmVlR2xDYWNoZXMiCi0gcmV0dXJuPSJ2b2lkIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJ0cnVlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0Q2xpcEJvdW5kcyIKICByZXR1cm49ImJvb2xlYW4iCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtNTk1NzYsMTcgKzU5NTU1LDYgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iZ2V0R0wiCi0gcmV0dXJuPSJqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5vcGVuZ2xlcy5HTCIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRIZWlnaHQiCiAgcmV0dXJuPSJpbnQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtNTk5NTAsMjEgKzU5OTE4LDYgQEAKIDxwYXJhbWV0ZXIgbmFtZT0ibWF0cml4IiB0eXBlPSJhbmRyb2lkLmdyYXBoaWNzLk1hdHJpeCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJzZXRWaWV3cG9ydCIKLSByZXR1cm49InZvaWQiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9IndpZHRoIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9ImhlaWdodCIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNrZXciCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTc0MTcwLDcgKzc0MTIzLDcgQEAKICB0eXBlPSJmbG9hdCIKICB0cmFuc2llbnQ9ImZhbHNlIgogIHZvbGF0aWxlPSJmYWxzZSIKLSB2YWx1ZT0iMC4wMDEwZiIKKyB2YWx1ZT0iMC4wMDFmIgogIHN0YXRpYz0idHJ1ZSIKICBmaW5hbD0idHJ1ZSIKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKQEAgLTE0Nzc4MiwxNyArMTQ3NzM1LDYgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2NvbnN0cnVjdG9yPgotPG1ldGhvZCBuYW1lPSJhYm9ydFVwZGF0ZXMiCi0gcmV0dXJuPSJ2b2lkIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImNsb3NlIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xNDc4MDQsMzAgKzE0Nzc0Niw2IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9ImNvbW1pdFVwZGF0ZXMiCi0gcmV0dXJuPSJib29sZWFuIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9ImNvbW1pdFVwZGF0ZXMiCi0gcmV0dXJuPSJib29sZWFuIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZXMiIHR5cGU9ImphdmEudXRpbC5NYXAmbHQ7PyBleHRlbmRzIGphdmEubGFuZy5Mb25nLCA/IGV4dGVuZHMgamF2YS51dGlsLk1hcCZsdDtqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuT2JqZWN0Jmd0OyZndDsiPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iY29weVN0cmluZ1RvQnVmZmVyIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xNDc4NTQsMTcgKzE0Nzc3Miw2IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9ImRlbGV0ZVJvdyIKLSByZXR1cm49ImJvb2xlYW4iCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0QmxvYiIKICByZXR1cm49ImJ5dGVbXSIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xNDgwNjEsMTcgKzE0Nzk2OCw2IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9Imhhc1VwZGF0ZXMiCi0gcmV0dXJuPSJib29sZWFuIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImlzQWZ0ZXJMYXN0IgogIHJldHVybj0iYm9vbGVhbiIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xNDgyNzUsMTcgKzE0ODE3MSw2IEBACiA8cGFyYW1ldGVyIG5hbWU9InVyaSIgdHlwZT0iYW5kcm9pZC5uZXQuVXJpIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9InN1cHBvcnRzVXBkYXRlcyIKLSByZXR1cm49ImJvb2xlYW4iCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L21ldGhvZD4KIDxtZXRob2QgbmFtZT0idW5yZWdpc3RlckNvbnRlbnRPYnNlcnZlciIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTQ4MzEyLDEyNCArMTQ4MTk3LDYgQEAKIDxwYXJhbWV0ZXIgbmFtZT0ib2JzZXJ2ZXIiIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2UuRGF0YVNldE9ic2VydmVyIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9InVwZGF0ZUJsb2IiCi0gcmV0dXJuPSJib29sZWFuIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5JbmRleCIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0iYnl0ZVtdIj4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9InVwZGF0ZURvdWJsZSIKLSByZXR1cm49ImJvb2xlYW4iCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkluZGV4IiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJkb3VibGUiPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0idXBkYXRlRmxvYXQiCi0gcmV0dXJuPSJib29sZWFuIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5JbmRleCIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0iZmxvYXQiPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0idXBkYXRlSW50IgotIHJldHVybj0iYm9vbGVhbiIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uSW5kZXgiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJ1cGRhdGVMb25nIgotIHJldHVybj0iYm9vbGVhbiIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uSW5kZXgiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImxvbmciPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0idXBkYXRlU2hvcnQiCi0gcmV0dXJuPSJib29sZWFuIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5JbmRleCIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0ic2hvcnQiPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0idXBkYXRlU3RyaW5nIgotIHJldHVybj0iYm9vbGVhbiIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uSW5kZXgiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0idXBkYXRlVG9OdWxsIgotIHJldHVybj0iYm9vbGVhbiIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uSW5kZXgiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTwvbWV0aG9kPgogPC9jbGFzcz4KIDxjbGFzcyBuYW1lPSJNb2NrRGlhbG9nSW50ZXJmYWNlIgogIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCkBAIC0xNjQ2OTYsNyArMTY0NDYzLDcgQEAKICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgogIHRyYW5zaWVudD0iZmFsc2UiCiAgdm9sYXRpbGU9ImZhbHNlIgotIHZhbHVlPSImcXVvdDsoKGFlcm98YXJwYXxhc2lhfGFbY2RlZmdpbG1ub3Fyc3R1d3h6XSl8KGJpenxiW2FiZGVmZ2hpam1ub3JzdHZ3eXpdKXwoY2F0fGNvbXxjb29wfGNbYWNkZmdoaWtsbW5vcnV2eHl6XSl8ZFtlamttb3pdfChlZHV8ZVtjZWdyc3R1XSl8Zltpamttb3JdfChnb3Z8Z1thYmRlZmdoaWxtbnBxcnN0dXd5XSl8aFtrbW5ydHVdfChpbmZvfGludHxpW2RlbG1ub3Fyc3RdKXwoam9ic3xqW2Vtb3BdKXxrW2VnaGltbnByd3l6XXxsW2FiY2lrcnN0dXZ5XXwobWlsfG1vYml8bXVzZXVtfG1bYWNkZWdoa2xtbm9wcXJzdHV2d3h5el0pfChuYW1lfG5ldHxuW2FjZWZnaWxvcHJ1el0pfChvcmd8b20pfChwcm98cFthZWZnaGtsbW5yc3R3eV0pfHFhfHJbZW9zdXddfHNbYWJjZGVnaGlqa2xtbm9ydHV2eXpdfCh0ZWx8dHJhdmVsfHRbY2RmZ2hqa2xtbm9wcnR2d3pdKXx1W2Fna3N5el18dlthY2VnaW51XXx3W2ZzXXwoeG5cXC1cXC0wendtNTZkfHhuXFwtXFwtMTFiNWJzM2E5YWo2Z3x4blxcLVxcLTgwYWtoYnlrbmo0Znx4blxcLVxcLTl0NGIxMXlpNWF8eG5cXC1cXC1kZWJhMGFkfHhuXFwtXFwtZzZ3MjUxZHx4blxcLVxcLWhnYms2YWo3ZjUzYmJhfHhuXFwtXFwtaGxjajZheWE5ZXNjN2F8eG5cXC1cXC1qeGFscGRscHx4blxcLVxcLWtnYmVjaHR2fHhuXFwtXFwtemNremFoKXx5W2V0dV18elthbXddKSZxdW90OyIKKyB2YWx1ZT0iJnF1b3Q7KChhZXJvfGFycGF8YXNpYXxhW2NkZWZnaWxtbm9xcnN0dXd4el0pfChiaXp8YlthYmRlZmdoaWptbm9yc3R2d3l6XSl8KGNhdHxjb218Y29vcHxjW2FjZGZnaGlrbG1ub3J1dnh5el0pfGRbZWprbW96XXwoZWR1fGVbY2VncnN0dV0pfGZbaWprbW9yXXwoZ292fGdbYWJkZWZnaGlsbW5wcXJzdHV3eV0pfGhba21ucnR1XXwoaW5mb3xpbnR8aVtkZWxtbm9xcnN0XSl8KGpvYnN8altlbW9wXSl8a1tlZ2hpbW5wcnd5el18bFthYmNpa3JzdHV2eV18KG1pbHxtb2JpfG11c2V1bXxtW2FjZGVnaGtsbW5vcHFyc3R1dnd4eXpdKXwobmFtZXxuZXR8blthY2VmZ2lsb3BydXpdKXwob3JnfG9tKXwocHJvfHBbYWVmZ2hrbG1ucnN0d3ldKXxxYXxyW2Vvc3V3XXxzW2FiY2RlZ2hpamtsbW5vcnR1dnl6XXwodGVsfHRyYXZlbHx0W2NkZmdoamtsbW5vcHJ0dnd6XSl8dVthZ2tzeXpdfHZbYWNlZ2ludV18d1tmc118KHhuXFwtXFwtMHp3bTU2ZHx4blxcLVxcLTExYjViczNhOWFqNmd8eG5cXC1cXC04MGFraGJ5a25qNGZ8eG5cXC1cXC05dDRiMTF5aTVhfHhuXFwtXFwtZGViYTBhZHx4blxcLVxcLWc2dzI1MWR8eG5cXC1cXC1oZ2JrNmFqN2Y1M2JiYXx4blxcLVxcLWhsY2o2YXlhOWVzYzdhfHhuXFwtXFwtanhhbHBkbHB8eG5cXC1cXC1rZ2JlY2h0dnx4blxcLVxcLW1nYmFhbTdhOGh8eG5cXC1cXC1tZ2JlcnA0YTVkNGFyfHhuXFwtXFwtd2diaDFjfHhuXFwtXFwtemNremFoKXx5W2V0XXx6W2Ftd10pJnF1b3Q7IgogIHN0YXRpYz0idHJ1ZSIKICBmaW5hbD0idHJ1ZSIKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKQEAgLTE2NDcwNyw3ICsxNjQ0NzQsNyBAQAogIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCiAgdHJhbnNpZW50PSJmYWxzZSIKICB2b2xhdGlsZT0iZmFsc2UiCi0gdmFsdWU9IiZxdW90Oyg/Oig/OmFlcm98YXJwYXxhc2lhfGFbY2RlZmdpbG1ub3Fyc3R1d3h6XSl8KD86Yml6fGJbYWJkZWZnaGlqbW5vcnN0dnd5el0pfCg/OmNhdHxjb218Y29vcHxjW2FjZGZnaGlrbG1ub3J1dnh5el0pfGRbZWprbW96XXwoPzplZHV8ZVtjZWdyc3R1XSl8Zltpamttb3JdfCg/OmdvdnxnW2FiZGVmZ2hpbG1ucHFyc3R1d3ldKXxoW2ttbnJ0dV18KD86aW5mb3xpbnR8aVtkZWxtbm9xcnN0XSl8KD86am9ic3xqW2Vtb3BdKXxrW2VnaGltbnByd3l6XXxsW2FiY2lrcnN0dXZ5XXwoPzptaWx8bW9iaXxtdXNldW18bVthY2RlZ2hrbG1ub3BxcnN0dXZ3eHl6XSl8KD86bmFtZXxuZXR8blthY2VmZ2lsb3BydXpdKXwoPzpvcmd8b20pfCg/OnByb3xwW2FlZmdoa2xtbnJzdHd5XSl8cWF8cltlb3N1d118c1thYmNkZWdoaWprbG1ub3J0dXZ5el18KD86dGVsfHRyYXZlbHx0W2NkZmdoamtsbW5vcHJ0dnd6XSl8dVthZ2tzeXpdfHZbYWNlZ2ludV18d1tmc118KD86eG5cXC1cXC0wendtNTZkfHhuXFwtXFwtMTFiNWJzM2E5YWo2Z3x4blxcLVxcLTgwYWtoYnlrbmo0Znx4blxcLVxcLTl0NGIxMXlpNWF8eG5cXC1cXC1kZWJhMGFkfHhuXFwtXFwtZzZ3MjUxZHx4blxcLVxcLWhnYms2YWo3ZjUzYmJhfHhuXFwtXFwtaGxjajZheWE5ZXNjN2F8eG5cXC1cXC1qeGFscGRscHx4blxcLVxcLWtnYmVjaHR2fHhuXFwtXFwtemNremFoKXx5W2V0dV18elthbXddKSkmcXVvdDsiCisgdmFsdWU9IiZxdW90Oyg/Oig/OmFlcm98YXJwYXxhc2lhfGFbY2RlZmdpbG1ub3Fyc3R1d3h6XSl8KD86Yml6fGJbYWJkZWZnaGlqbW5vcnN0dnd5el0pfCg/OmNhdHxjb218Y29vcHxjW2FjZGZnaGlrbG1ub3J1dnh5el0pfGRbZWprbW96XXwoPzplZHV8ZVtjZWdyc3R1XSl8Zltpamttb3JdfCg/OmdvdnxnW2FiZGVmZ2hpbG1ucHFyc3R1d3ldKXxoW2ttbnJ0dV18KD86aW5mb3xpbnR8aVtkZWxtbm9xcnN0XSl8KD86am9ic3xqW2Vtb3BdKXxrW2VnaGltbnByd3l6XXxsW2FiY2lrcnN0dXZ5XXwoPzptaWx8bW9iaXxtdXNldW18bVthY2RlZ2hrbG1ub3BxcnN0dXZ3eHl6XSl8KD86bmFtZXxuZXR8blthY2VmZ2lsb3BydXpdKXwoPzpvcmd8b20pfCg/OnByb3xwW2FlZmdoa2xtbnJzdHd5XSl8cWF8cltlb3N1d118c1thYmNkZWdoaWprbG1ub3J0dXZ5el18KD86dGVsfHRyYXZlbHx0W2NkZmdoamtsbW5vcHJ0dnd6XSl8dVthZ2tzeXpdfHZbYWNlZ2ludV18d1tmc118KD86eG5cXC1cXC0wendtNTZkfHhuXFwtXFwtMTFiNWJzM2E5YWo2Z3x4blxcLVxcLTgwYWtoYnlrbmo0Znx4blxcLVxcLTl0NGIxMXlpNWF8eG5cXC1cXC1kZWJhMGFkfHhuXFwtXFwtZzZ3MjUxZHx4blxcLVxcLWhnYms2YWo3ZjUzYmJhfHhuXFwtXFwtaGxjajZheWE5ZXNjN2F8eG5cXC1cXC1qeGFscGRscHx4blxcLVxcLWtnYmVjaHR2fHhuXFwtXFwtbWdiYWFtN2E4aHx4blxcLVxcLW1nYmVycDRhNWQ0YXJ8eG5cXC1cXC13Z2JoMWN8eG5cXC1cXC16Y2t6YWgpfHlbZXRdfHpbYW13XSkpJnF1b3Q7IgogIHN0YXRpYz0idHJ1ZSIKICBmaW5hbD0idHJ1ZSIKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKQEAgLTE5NTYyOCw2ICsxOTUzOTUsMzkgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iZGVmU3R5bGUiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KIDwvY29uc3RydWN0b3I+Cis8ZmllbGQgbmFtZT0iQ0hPSUNFX01PREVfTVVMVElQTEUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIyIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkNIT0lDRV9NT0RFX05PTkUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIwIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkNIT0lDRV9NT0RFX1NJTkdMRSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjEiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8bWV0aG9kIG5hbWU9ImFmdGVyVGV4dENoYW5nZWQiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIwNDA4NCwzOSArMjAzODg0LDYgQEAKIDxwYXJhbWV0ZXIgbmFtZT0ieSIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Ci08ZmllbGQgbmFtZT0iQ0hPSUNFX01PREVfTVVMVElQTEUiCi0gdHlwZT0iaW50IgotIHRyYW5zaWVudD0iZmFsc2UiCi0gdm9sYXRpbGU9ImZhbHNlIgotIHZhbHVlPSIyIgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0idHJ1ZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L2ZpZWxkPgotPGZpZWxkIG5hbWU9IkNIT0lDRV9NT0RFX05PTkUiCi0gdHlwZT0iaW50IgotIHRyYW5zaWVudD0iZmFsc2UiCi0gdm9sYXRpbGU9ImZhbHNlIgotIHZhbHVlPSIwIgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0idHJ1ZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L2ZpZWxkPgotPGZpZWxkIG5hbWU9IkNIT0lDRV9NT0RFX1NJTkdMRSIKLSB0eXBlPSJpbnQiCi0gdHJhbnNpZW50PSJmYWxzZSIKLSB2b2xhdGlsZT0iZmFsc2UiCi0gdmFsdWU9IjEiCi0gc3RhdGljPSJ0cnVlIgotIGZpbmFsPSJ0cnVlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvZmllbGQ+CiA8L2NsYXNzPgogPGNsYXNzIG5hbWU9Ikxpc3RWaWV3LkZpeGVkVmlld0luZm8iCiAgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKZGlmZiAtLWdpdCBhL2FwaS9jdXJyZW50LnhtbCBiL2FwaS9jdXJyZW50LnhtbAppbmRleCBmZWZhYWVhLi44ZmYyNjNjIDEwMDY0NAotLS0gYS9hcGkvY3VycmVudC54bWwKKysrIGIvYXBpL2N1cnJlbnQueG1sCkBAIC0xNDgyLDYgKzE0ODIsMjggQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9ImFuaW1hdG9yX2ZhZGVfaW4iCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNzQzMjYwOSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJhbmltYXRvcl9mYWRlX291dCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE3NDMyNjEwIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9ImFudGljaXBhdGVfaW50ZXJwb2xhdG9yIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMjA4OCw2ICsyMTEwLDYxIEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJhY3Rpb25CdXR0b25QYWRkaW5nIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1NDciCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iYWN0aW9uQnV0dG9uU3R5bGUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzU0NSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJhY3Rpb25Ecm9wRG93blN0eWxlIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1NDQiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iYWN0aW9uTW9kZUJhY2tncm91bmQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzU0OSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJhY3Rpb25Nb2RlQ2xvc2VEcmF3YWJsZSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTUwIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9ImFjdGl2aXR5Q2xvc2VFbnRlckFuaW1hdGlvbiIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTIxMzIsNiArMjIwOSwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iYWRhcHRlciIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTIxIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9ImFkZFN0YXRlc0Zyb21DaGlsZHJlbiIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTIxNjUsNiArMjI1MywxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iYWxsQ29udGFjdHNOYW1lIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1MzMiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iYWxsb3dCYWNrdXAiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0yMjUzLDYgKzIzNTIsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9ImFuaW1hdGVGaXJzdFZpZXciCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzU0MiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJhbmltYXRlT25DbGljayIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTIzNDEsNiArMjQ1MSwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iYXMiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzUyNyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJhdXRob3IiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0zMDAxLDYgKzMxMjIsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9ImNvbHVtbiIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTMwIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9ImNvbHVtbkRlbGF5IgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMzE0NCw2ICszMjc2LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJjdXN0b21OYXZpZ2F0aW9uTGF5b3V0IgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1MzkiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iY3ljbGVzIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMzQwOCw2ICszNTUxLDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJkaXNwbGF5T3B0aW9ucyIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTM3IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9ImRpdGhlciIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTM2MDYsNiArMzc2MCwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iZHJvcERvd25TcGlubmVyU3R5bGUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzU0MyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJkcm9wRG93blZlcnRpY2FsT2Zmc2V0IgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtNDE1Niw2ICs0MzIxLDYxIEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJmcmFnbWVudCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTU3IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9ImZyYWdtZW50Q2xvc2VFbnRlckFuaW1hdGlvbiIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTYxIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9ImZyYWdtZW50Q2xvc2VFeGl0QW5pbWF0aW9uIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1NjIiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iZnJhZ21lbnRPcGVuRW50ZXJBbmltYXRpb24iCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzU1OSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJmcmFnbWVudE9wZW5FeGl0QW5pbWF0aW9uIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1NjAiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iZnJlZXplc1RleHQiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC00MTY3LDYgKzQzODcsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9ImZyb20iCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzUyNSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJmcm9tQWxwaGEiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC00MTg5LDYgKzQ0MjAsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9ImZyb21WYWx1ZSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTI4IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9ImZyb21YRGVsdGEiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC00NDc1LDYgKzQ3MTcsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9ImhhcmR3YXJlQWNjZWxlcmF0ZWQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzU0MCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJoYXNDb2RlIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtNDcxNyw2ICs0OTcwLDM5IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJpbWVTdWJ0eXBlRXh0cmFWYWx1ZSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTY2IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9ImltZVN1YnR5cGVMb2NhbGUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzU2NCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJpbWVTdWJ0eXBlTW9kZSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTY1IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9ImltbWVyc2l2ZSIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTY0MjIsNiArNjcwOCwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0ibGlzdENob2ljZUJhY2tncm91bmRJbmRpY2F0b3IiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzU2OCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJsaXN0Q2hvaWNlSW5kaWNhdG9yTXVsdGlwbGUiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC02Njg2LDYgKzY5ODMsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9Im1lYXN1cmVXaXRoTGFyZ2VzdENoaWxkIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1NDEiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0ibWVudUNhdGVnb3J5IgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtNjgxOCw2ICs3MTI2LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJuYXZpZ2F0aW9uTW9kZSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTM2IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9Im5lZ2F0aXZlQnV0dG9uVGV4dCIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTY5ODMsNiArNzMwMiwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0ib3JkZXJpbmciCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzU1NiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJvcmRlcmluZ0Zyb21YbWwiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC03Mzc5LDYgKzc3MDksMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9InByZXZpZXdJbWFnZSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTQ4IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9InByaW9yaXR5IgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtNzUzMyw2ICs3ODc0LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJwcm9wZXJ0eU5hbWUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzU1NSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJwcm90ZWN0aW9uTGV2ZWwiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC04MzAzLDYgKzg2NTUsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9InNlbGVjdGlvbiIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTIyIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9InNldHRpbmdzQWN0aXZpdHkiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC04NDEzLDYgKzg3NzYsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9InNob3dBc0FjdGlvbiIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTQ2IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9InNob3dEZWZhdWx0IgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtODQ5MCw2ICs4ODY0LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJzb3J0T3JkZXIiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzUyMyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJzb3VuZEVmZmVjdHNFbmFibGVkIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtODU0NSw2ICs4OTMwLDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJzcGxpdE1vdGlvbkV2ZW50cyIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTY3IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9InNyYyIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTg4NDIsNiArOTIzOCwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0ic3VidGl0bGUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzUzOCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJzdWdnZXN0QWN0aW9uTXNnIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtOTY3OCw2ICsxMDA4NSwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0idG8iCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzUyNiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJ0b0FscGhhIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtOTcwMCw2ICsxMDExOCwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0idG9WYWx1ZSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTI5IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9InRvWERlbHRhIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtOTg3Niw2ICsxMDMwNSwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0idXJpIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1MjQiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0idXNlTGV2ZWwiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC05OTA5LDYgKzEwMzQ5LDM5IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJ2YWx1ZUZyb20iCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzU1MiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJ2YWx1ZVRvIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1NTMiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0idmFsdWVUeXBlIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1NTQiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0idmFyaWFibGVQYWRkaW5nIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMTAyMTcsNiArMTA2OTAsNjEgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IndpbmRvd0FjdGlvbkJhciIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTM0IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IndpbmRvd0FjdGlvbkJhck92ZXJsYXkiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzU1OCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJ3aW5kb3dBY3Rpb25CYXJTaXplIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1NjMiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0id2luZG93QWN0aW9uQmFyU3R5bGUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzUzNSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJ3aW5kb3dBY3Rpb25Nb2RlT3ZlcmxheSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTUxIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9IndpbmRvd0FuaW1hdGlvblN0eWxlIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMTA0MjYsNiArMTA5NTQsMjggQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IndpdGhDbGFzcyIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTMyIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IndpdGhFeHByZXNzaW9uIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1MzEiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0id3JpdGVQZXJtaXNzaW9uIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMTQwNzUsNiArMTQ2MjUsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9ImhvbWUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjkwODM1MyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJpY29uIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMTQ0NjAsNiArMTUwMjEsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9InNlbGVjdFRleHRNb2RlIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY5MDgzNTQiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0ic2VsZWN0ZWRJY29uIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMTUwMDAsNiArMTU1NzIsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9Imxpc3RfY29udGVudCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE3MzY3MDczIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9InByZWZlcmVuY2VfY2F0ZWdvcnkiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0xNTE0Myw2ICsxNTcyNiwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0ic2ltcGxlX3NlbGVjdGFibGVfbGlzdF9pdGVtIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTczNjcwNzQiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0ic2ltcGxlX3NwaW5uZXJfZHJvcGRvd25faXRlbSIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTE1NTY4LDYgKzE2MTYyLDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJzZWxlY3RUZXh0TW9kZSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE3MDM5NDA4IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9InVua25vd25OYW1lIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMTYwNTgsNiArMTY2NjMsNTAgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlRoZW1lX0RpYWxvZ19Ob0ZyYW1lIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY5NzM5NzIiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iVGhlbWVfSG9sbyIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2OTczOTc0IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlRoZW1lX0hvbG9fTm9BY3Rpb25CYXIiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjk3Mzk3NiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJUaGVtZV9Ib2xvX05vQWN0aW9uQmFyX0Z1bGxzY3JlZW4iCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjk3Mzk3NyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJUaGVtZV9JbnB1dE1ldGhvZCIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTE2MDgwLDYgKzE2NzI5LDM5IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJUaGVtZV9MaWdodF9Ib2xvIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY5NzM5NzUiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iVGhlbWVfTGlnaHRfSG9sb19Ob0FjdGlvbkJhciIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2OTczOTc4IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlRoZW1lX0xpZ2h0X0hvbG9fTm9BY3Rpb25CYXJfRnVsbHNjcmVlbiIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2OTczOTc5IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9IlRoZW1lX0xpZ2h0X05vVGl0bGVCYXIiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0xNjE1Nyw2ICsxNjgzOSwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iVGhlbWVfTm9UaXRsZUJhcl9PdmVybGF5QWN0aW9uTW9kZXMiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjk3Mzk3MyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJUaGVtZV9QYW5lbCIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTE2MjQ1LDYgKzE2OTM4LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJUaGVtZV9XaXRoQWN0aW9uQmFyIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY5NzM5NjkiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iV2lkZ2V0IgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMTYyNjcsNiArMTY5NzEsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IldpZGdldF9BY3Rpb25CdXR0b24iCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjk3Mzk3MSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJXaWRnZXRfQXV0b0NvbXBsZXRlVGV4dFZpZXciCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0xNjY0MSw2ICsxNzM1NiwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iV2lkZ2V0X1NwaW5uZXJfRHJvcERvd24iCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjk3Mzk3MCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJXaWRnZXRfVGFiV2lkZ2V0IgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMTkwNjUsOCArMTk3OTEsMTk4MyBAQAogPC9jb25zdHJ1Y3Rvcj4KIDwvY2xhc3M+CiA8L3BhY2thZ2U+Cis8cGFja2FnZSBuYW1lPSJhbmRyb2lkLmFuaW1hdGlvbiIKKz4KKzxjbGFzcyBuYW1lPSJBbmltYXRhYmxlIgorIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCisgYWJzdHJhY3Q9InRydWUiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGltcGxlbWVudHMgbmFtZT0iamF2YS5sYW5nLkNsb25lYWJsZSI+Cis8L2ltcGxlbWVudHM+Cis8Y29uc3RydWN0b3IgbmFtZT0iQW5pbWF0YWJsZSIKKyB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRhYmxlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImFkZExpc3RlbmVyIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibGlzdGVuZXIiIHR5cGU9ImFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdGFibGUuQW5pbWF0YWJsZUxpc3RlbmVyIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImNhbmNlbCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iY2xvbmUiCisgcmV0dXJuPSJhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRhYmxlIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGV4Y2VwdGlvbiBuYW1lPSJDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5sYW5nLkNsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImVuZCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0TGlzdGVuZXJzIgorIHJldHVybj0iamF2YS51dGlsLkFycmF5TGlzdCZsdDthbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRhYmxlLkFuaW1hdGFibGVMaXN0ZW5lciZndDsiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icmVtb3ZlQWxsTGlzdGVuZXJzIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJyZW1vdmVMaXN0ZW5lciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Imxpc3RlbmVyIiB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRhYmxlLkFuaW1hdGFibGVMaXN0ZW5lciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzdGFydCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzwvY2xhc3M+Cis8aW50ZXJmYWNlIG5hbWU9IkFuaW1hdGFibGUuQW5pbWF0YWJsZUxpc3RlbmVyIgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPG1ldGhvZCBuYW1lPSJvbkFuaW1hdGlvbkNhbmNlbCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYW5pbWF0aW9uIiB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRhYmxlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uQW5pbWF0aW9uRW5kIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhbmltYXRpb24iIHR5cGU9ImFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdGFibGUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25BbmltYXRpb25SZXBlYXQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFuaW1hdGlvbiIgdHlwZT0iYW5kcm9pZC5hbmltYXRpb24uQW5pbWF0YWJsZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbkFuaW1hdGlvblN0YXJ0IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhbmltYXRpb24iIHR5cGU9ImFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdGFibGUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvaW50ZXJmYWNlPgorPGNsYXNzIG5hbWU9IkFuaW1hdGFibGVJbmZsYXRlciIKKyBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iQW5pbWF0YWJsZUluZmxhdGVyIgorIHR5cGU9ImFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdGFibGVJbmZsYXRlciIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJsb2FkQW5pbWF0YWJsZSIKKyByZXR1cm49ImFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdGFibGUiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImlkIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlJlc291cmNlcy5Ob3RGb3VuZEV4Y2VwdGlvbiIgdHlwZT0iYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXMuTm90Rm91bmRFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iQW5pbWF0YWJsZUxpc3RlbmVyQWRhcHRlciIKKyBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxpbXBsZW1lbnRzIG5hbWU9ImFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdGFibGUuQW5pbWF0YWJsZUxpc3RlbmVyIj4KKzwvaW1wbGVtZW50cz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJBbmltYXRhYmxlTGlzdGVuZXJBZGFwdGVyIgorIHR5cGU9ImFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdGFibGVMaXN0ZW5lckFkYXB0ZXIiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0ib25BbmltYXRpb25DYW5jZWwiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhbmltYXRpb24iIHR5cGU9ImFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdGFibGUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25BbmltYXRpb25FbmQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhbmltYXRpb24iIHR5cGU9ImFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdGFibGUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25BbmltYXRpb25SZXBlYXQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhbmltYXRpb24iIHR5cGU9ImFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdGFibGUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25BbmltYXRpb25TdGFydCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFuaW1hdGlvbiIgdHlwZT0iYW5kcm9pZC5hbmltYXRpb24uQW5pbWF0YWJsZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJBbmltYXRvciIKKyBleHRlbmRzPSJhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRhYmxlIgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iQW5pbWF0b3IiCisgdHlwZT0iYW5kcm9pZC5hbmltYXRpb24uQW5pbWF0b3IiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJBbmltYXRvciIKKyB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRvciIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImR1cmF0aW9uIiB0eXBlPSJsb25nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZXMiIHR5cGU9IlQuLi4iPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJhZGRVcGRhdGVMaXN0ZW5lciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Imxpc3RlbmVyIiB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRvci5BbmltYXRvclVwZGF0ZUxpc3RlbmVyIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEFuaW1hdGVkVmFsdWUiCisgcmV0dXJuPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEFuaW1hdGVkVmFsdWUiCisgcmV0dXJuPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwcm9wZXJ0eU5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0Q3VycmVudFBsYXlUaW1lIgorIHJldHVybj0ibG9uZyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXREdXJhdGlvbiIKKyByZXR1cm49ImxvbmciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0RnJhbWVEZWxheSIKKyByZXR1cm49ImxvbmciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRJbnRlcnBvbGF0b3IiCisgcmV0dXJuPSJhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkludGVycG9sYXRvciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRSZXBlYXRDb3VudCIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRSZXBlYXRNb2RlIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFN0YXJ0RGVsYXkiCisgcmV0dXJuPSJsb25nIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImlzUnVubmluZyIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icmVtb3ZlVXBkYXRlTGlzdGVuZXIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJsaXN0ZW5lciIgdHlwZT0iYW5kcm9pZC5hbmltYXRpb24uQW5pbWF0b3IuQW5pbWF0b3JVcGRhdGVMaXN0ZW5lciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJyZXZlcnNlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRDdXJyZW50UGxheVRpbWUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwbGF5VGltZSIgdHlwZT0ibG9uZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXREdXJhdGlvbiIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImR1cmF0aW9uIiB0eXBlPSJsb25nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEV2YWx1YXRvciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5UeXBlRXZhbHVhdG9yIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEZyYW1lRGVsYXkiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImZyYW1lRGVsYXkiIHR5cGU9ImxvbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0SW50ZXJwb2xhdG9yIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImFuZHJvaWQudmlldy5hbmltYXRpb24uSW50ZXJwb2xhdG9yIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFJlcGVhdENvdW50IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRSZXBlYXRNb2RlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRTdGFydERlbGF5IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ic3RhcnREZWxheSIgdHlwZT0ibG9uZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRWYWx1ZXMiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZXMiIHR5cGU9ImFuZHJvaWQuYW5pbWF0aW9uLlByb3BlcnR5VmFsdWVzSG9sZGVyLi4uIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFZhbHVlcyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InZhbHVlcyIgdHlwZT0iVC4uLiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPGZpZWxkIG5hbWU9IklORklOSVRFIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iLTEiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iUkVTVEFSVCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjEiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iUkVWRVJTRSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjIiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8L2NsYXNzPgorPGludGVyZmFjZSBuYW1lPSJBbmltYXRvci5BbmltYXRvclVwZGF0ZUxpc3RlbmVyIgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPG1ldGhvZCBuYW1lPSJvbkFuaW1hdGlvblVwZGF0ZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYW5pbWF0aW9uIiB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRvciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPC9pbnRlcmZhY2U+Cis8Y2xhc3MgbmFtZT0iRG91YmxlRXZhbHVhdG9yIgorIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxpbXBsZW1lbnRzIG5hbWU9ImFuZHJvaWQuYW5pbWF0aW9uLlR5cGVFdmFsdWF0b3IiPgorPC9pbXBsZW1lbnRzPgorPGNvbnN0cnVjdG9yIG5hbWU9IkRvdWJsZUV2YWx1YXRvciIKKyB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5Eb3VibGVFdmFsdWF0b3IiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0iZXZhbHVhdGUiCisgcmV0dXJuPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJmcmFjdGlvbiIgdHlwZT0iZmxvYXQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InN0YXJ0VmFsdWUiIHR5cGU9ImphdmEubGFuZy5PYmplY3QiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImVuZFZhbHVlIiB0eXBlPSJqYXZhLmxhbmcuT2JqZWN0Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2NsYXNzPgorPGNsYXNzIG5hbWU9IkZsb2F0RXZhbHVhdG9yIgorIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxpbXBsZW1lbnRzIG5hbWU9ImFuZHJvaWQuYW5pbWF0aW9uLlR5cGVFdmFsdWF0b3IiPgorPC9pbXBsZW1lbnRzPgorPGNvbnN0cnVjdG9yIG5hbWU9IkZsb2F0RXZhbHVhdG9yIgorIHR5cGU9ImFuZHJvaWQuYW5pbWF0aW9uLkZsb2F0RXZhbHVhdG9yIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImV2YWx1YXRlIgorIHJldHVybj0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZnJhY3Rpb24iIHR5cGU9ImZsb2F0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzdGFydFZhbHVlIiB0eXBlPSJqYXZhLmxhbmcuT2JqZWN0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJlbmRWYWx1ZSIgdHlwZT0iamF2YS5sYW5nLk9iamVjdCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJJbnRFdmFsdWF0b3IiCisgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGltcGxlbWVudHMgbmFtZT0iYW5kcm9pZC5hbmltYXRpb24uVHlwZUV2YWx1YXRvciI+Cis8L2ltcGxlbWVudHM+Cis8Y29uc3RydWN0b3IgbmFtZT0iSW50RXZhbHVhdG9yIgorIHR5cGU9ImFuZHJvaWQuYW5pbWF0aW9uLkludEV2YWx1YXRvciIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJldmFsdWF0ZSIKKyByZXR1cm49ImphdmEubGFuZy5PYmplY3QiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImZyYWN0aW9uIiB0eXBlPSJmbG9hdCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic3RhcnRWYWx1ZSIgdHlwZT0iamF2YS5sYW5nLk9iamVjdCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZW5kVmFsdWUiIHR5cGU9ImphdmEubGFuZy5PYmplY3QiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iS2V5ZnJhbWUiCisgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9IktleWZyYW1lIgorIHR5cGU9ImFuZHJvaWQuYW5pbWF0aW9uLktleWZyYW1lIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZnJhY3Rpb24iIHR5cGU9ImZsb2F0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0iamF2YS5sYW5nLk9iamVjdCI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iS2V5ZnJhbWUiCisgdHlwZT0iYW5kcm9pZC5hbmltYXRpb24uS2V5ZnJhbWUiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJmcmFjdGlvbiIgdHlwZT0iZmxvYXQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IktleWZyYW1lIgorIHR5cGU9ImFuZHJvaWQuYW5pbWF0aW9uLktleWZyYW1lIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZnJhY3Rpb24iIHR5cGU9ImZsb2F0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0iZmxvYXQiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IktleWZyYW1lIgorIHR5cGU9ImFuZHJvaWQuYW5pbWF0aW9uLktleWZyYW1lIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZnJhY3Rpb24iIHR5cGU9ImZsb2F0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0iZG91YmxlIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0iZ2V0RnJhY3Rpb24iCisgcmV0dXJuPSJmbG9hdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRJbnRlcnBvbGF0b3IiCisgcmV0dXJuPSJhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkludGVycG9sYXRvciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRUeXBlIgorIHJldHVybj0iamF2YS5sYW5nLkNsYXNzIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFZhbHVlIgorIHJldHVybj0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRGcmFjdGlvbiIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImZyYWN0aW9uIiB0eXBlPSJmbG9hdCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRJbnRlcnBvbGF0b3IiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJpbnRlcnBvbGF0b3IiIHR5cGU9ImFuZHJvaWQudmlldy5hbmltYXRpb24uSW50ZXJwb2xhdG9yIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFZhbHVlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImphdmEubGFuZy5PYmplY3QiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iUHJvcGVydHlBbmltYXRvciIKKyBleHRlbmRzPSJhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRvciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iUHJvcGVydHlBbmltYXRvciIKKyB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5Qcm9wZXJ0eUFuaW1hdG9yIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iUHJvcGVydHlBbmltYXRvciIKKyB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5Qcm9wZXJ0eUFuaW1hdG9yIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZHVyYXRpb24iIHR5cGU9ImxvbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InRhcmdldCIgdHlwZT0iamF2YS5sYW5nLk9iamVjdCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0icHJvcGVydHlOYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZXMiIHR5cGU9IlQuLi4iPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlByb3BlcnR5QW5pbWF0b3IiCisgdHlwZT0iYW5kcm9pZC5hbmltYXRpb24uUHJvcGVydHlBbmltYXRvciIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImR1cmF0aW9uIiB0eXBlPSJsb25nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ0YXJnZXQiIHR5cGU9ImphdmEubGFuZy5PYmplY3QiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InZhbHVlcyIgdHlwZT0iYW5kcm9pZC5hbmltYXRpb24uUHJvcGVydHlWYWx1ZXNIb2xkZXIuLi4iPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJnZXRQcm9wZXJ0eU5hbWUiCisgcmV0dXJuPSJqYXZhLmxhbmcuU3RyaW5nIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFRhcmdldCIKKyByZXR1cm49ImphdmEubGFuZy5PYmplY3QiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0UHJvcGVydHlOYW1lIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icHJvcGVydHlOYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFRhcmdldCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InRhcmdldCIgdHlwZT0iamF2YS5sYW5nLk9iamVjdCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJQcm9wZXJ0eVZhbHVlc0hvbGRlciIKKyBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iUHJvcGVydHlWYWx1ZXNIb2xkZXIiCisgdHlwZT0iYW5kcm9pZC5hbmltYXRpb24uUHJvcGVydHlWYWx1ZXNIb2xkZXIiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZXMiIHR5cGU9IlQuLi4iPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlByb3BlcnR5VmFsdWVzSG9sZGVyIgorIHR5cGU9ImFuZHJvaWQuYW5pbWF0aW9uLlByb3BlcnR5VmFsdWVzSG9sZGVyIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icHJvcGVydHlOYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZXMiIHR5cGU9IlQuLi4iPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJnZXRHZXR0ZXIiCisgcmV0dXJuPSJqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0UHJvcGVydHlOYW1lIgorIHJldHVybj0iamF2YS5sYW5nLlN0cmluZyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRTZXR0ZXIiCisgcmV0dXJuPSJqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0RXZhbHVhdG9yIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZXZhbHVhdG9yIiB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5UeXBlRXZhbHVhdG9yIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEdldHRlciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImdldHRlciIgdHlwZT0iamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFByb3BlcnR5TmFtZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InByb3BlcnR5TmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRTZXR0ZXIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJzZXR0ZXIiIHR5cGU9ImphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRWYWx1ZXMiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZXMiIHR5cGU9IlQuLi4iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iUkdCRXZhbHVhdG9yIgorIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxpbXBsZW1lbnRzIG5hbWU9ImFuZHJvaWQuYW5pbWF0aW9uLlR5cGVFdmFsdWF0b3IiPgorPC9pbXBsZW1lbnRzPgorPGNvbnN0cnVjdG9yIG5hbWU9IlJHQkV2YWx1YXRvciIKKyB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5SR0JFdmFsdWF0b3IiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0iZXZhbHVhdGUiCisgcmV0dXJuPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJmcmFjdGlvbiIgdHlwZT0iZmxvYXQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InN0YXJ0VmFsdWUiIHR5cGU9ImphdmEubGFuZy5PYmplY3QiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImVuZFZhbHVlIiB0eXBlPSJqYXZhLmxhbmcuT2JqZWN0Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2NsYXNzPgorPGNsYXNzIG5hbWU9IlNlcXVlbmNlciIKKyBleHRlbmRzPSJhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRhYmxlIgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTZXF1ZW5jZXIiCisgdHlwZT0iYW5kcm9pZC5hbmltYXRpb24uU2VxdWVuY2VyIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImdldENoaWxkQW5pbWF0aW9ucyIKKyByZXR1cm49ImphdmEudXRpbC5BcnJheUxpc3QmbHQ7YW5kcm9pZC5hbmltYXRpb24uQW5pbWF0YWJsZSZndDsiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icGxheSIKKyByZXR1cm49ImFuZHJvaWQuYW5pbWF0aW9uLlNlcXVlbmNlci5CdWlsZGVyIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhbmltIiB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRhYmxlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InBsYXlTZXF1ZW50aWFsbHkiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJzZXF1ZW5jZUl0ZW1zIiB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRhYmxlLi4uIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InBsYXlUb2dldGhlciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InNlcXVlbmNlSXRlbXMiIHR5cGU9ImFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdGFibGUuLi4iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0VGFyZ2V0IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idGFyZ2V0IiB0eXBlPSJqYXZhLmxhbmcuT2JqZWN0Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2NsYXNzPgorPGNsYXNzIG5hbWU9IlNlcXVlbmNlci5CdWlsZGVyIgorIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxtZXRob2QgbmFtZT0iYWZ0ZXIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhbmltIiB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRhYmxlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImFmdGVyIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZGVsYXkiIHR5cGU9ImxvbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iYmVmb3JlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYW5pbSIgdHlwZT0iYW5kcm9pZC5hbmltYXRpb24uQW5pbWF0YWJsZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJ3aXRoIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYW5pbSIgdHlwZT0iYW5kcm9pZC5hbmltYXRpb24uQW5pbWF0YWJsZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPC9jbGFzcz4KKzxpbnRlcmZhY2UgbmFtZT0iVHlwZUV2YWx1YXRvciIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8bWV0aG9kIG5hbWU9ImV2YWx1YXRlIgorIHJldHVybj0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJmcmFjdGlvbiIgdHlwZT0iZmxvYXQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InN0YXJ0VmFsdWUiIHR5cGU9ImphdmEubGFuZy5PYmplY3QiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImVuZFZhbHVlIiB0eXBlPSJqYXZhLmxhbmcuT2JqZWN0Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2ludGVyZmFjZT4KKzwvcGFja2FnZT4KIDxwYWNrYWdlIG5hbWU9ImFuZHJvaWQuYXBwIgogPgorPGNsYXNzIG5hbWU9IkFjdGlvbkJhciIKKyBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJBY3Rpb25CYXIiCisgdHlwZT0iYW5kcm9pZC5hcHAuQWN0aW9uQmFyIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImFkZFRhYiIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idGFiIiB0eXBlPSJhbmRyb2lkLmFwcC5BY3Rpb25CYXIuVGFiIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEN1c3RvbU5hdmlnYXRpb25WaWV3IgorIHJldHVybj0iYW5kcm9pZC52aWV3LlZpZXciCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXREaXNwbGF5T3B0aW9ucyIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEhlaWdodCIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldE5hdmlnYXRpb25Nb2RlIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0U2VsZWN0ZWROYXZpZ2F0aW9uSXRlbSIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFN1YnRpdGxlIgorIHJldHVybj0iamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFRpdGxlIgorIHJldHVybj0iamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImhpZGUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaW5zZXJ0VGFiIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ0YWIiIHR5cGU9ImFuZHJvaWQuYXBwLkFjdGlvbkJhci5UYWIiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InBvc2l0aW9uIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaXNTaG93aW5nIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im5ld1RhYiIKKyByZXR1cm49ImFuZHJvaWQuYXBwLkFjdGlvbkJhci5UYWIiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJyZW1vdmVUYWIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InRhYiIgdHlwZT0iYW5kcm9pZC5hcHAuQWN0aW9uQmFyLlRhYiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJyZW1vdmVUYWJBdCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icG9zaXRpb24iIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZWxlY3RUYWIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InRhYiIgdHlwZT0iYW5kcm9pZC5hcHAuQWN0aW9uQmFyLlRhYiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRCYWNrZ3JvdW5kRHJhd2FibGUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImQiIHR5cGU9ImFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0Q3VzdG9tTmF2aWdhdGlvbk1vZGUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InZpZXciIHR5cGU9ImFuZHJvaWQudmlldy5WaWV3Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldERpc3BsYXlPcHRpb25zIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJvcHRpb25zIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0RGlzcGxheU9wdGlvbnMiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im9wdGlvbnMiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibWFzayIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldERyb3Bkb3duTmF2aWdhdGlvbk1vZGUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFkYXB0ZXIiIHR5cGU9ImFuZHJvaWQud2lkZ2V0LlNwaW5uZXJBZGFwdGVyIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJjYWxsYmFjayIgdHlwZT0iYW5kcm9pZC5hcHAuQWN0aW9uQmFyLk5hdmlnYXRpb25DYWxsYmFjayI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXREcm9wZG93bk5hdmlnYXRpb25Nb2RlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhZGFwdGVyIiB0eXBlPSJhbmRyb2lkLndpZGdldC5TcGlubmVyQWRhcHRlciI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iY2FsbGJhY2siIHR5cGU9ImFuZHJvaWQuYXBwLkFjdGlvbkJhci5OYXZpZ2F0aW9uQ2FsbGJhY2siPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImRlZmF1bHRTZWxlY3RlZFBvc2l0aW9uIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0U2VsZWN0ZWROYXZpZ2F0aW9uSXRlbSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icG9zaXRpb24iIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRTdGFuZGFyZE5hdmlnYXRpb25Nb2RlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ0aXRsZSIgdHlwZT0iamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic3VidGl0bGUiIHR5cGU9ImphdmEubGFuZy5DaGFyU2VxdWVuY2UiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0U3RhbmRhcmROYXZpZ2F0aW9uTW9kZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idGl0bGVSZXNJZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzdWJ0aXRsZVJlc0lkIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0U3RhbmRhcmROYXZpZ2F0aW9uTW9kZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idGl0bGUiIHR5cGU9ImphdmEubGFuZy5DaGFyU2VxdWVuY2UiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0U3RhbmRhcmROYXZpZ2F0aW9uTW9kZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idGl0bGVSZXNJZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFN0YW5kYXJkTmF2aWdhdGlvbk1vZGUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0U3VidGl0bGUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InN1YnRpdGxlIiB0eXBlPSJqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFN1YnRpdGxlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJyZXNJZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFRhYk5hdmlnYXRpb25Nb2RlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFRhYk5hdmlnYXRpb25Nb2RlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb250YWluZXJWaWV3SWQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRUaXRsZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idGl0bGUiIHR5cGU9ImphdmEubGFuZy5DaGFyU2VxdWVuY2UiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0VGl0bGUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InJlc0lkIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2hvdyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPGZpZWxkIG5hbWU9IkRJU1BMQVlfSElERV9IT01FIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJESVNQTEFZX1VTRV9MT0dPIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJOQVZJR0FUSU9OX01PREVfQ1VTVE9NIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJOQVZJR0FUSU9OX01PREVfRFJPUERPV05fTElTVCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjEiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iTkFWSUdBVElPTl9NT0RFX1NUQU5EQVJEIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJOQVZJR0FUSU9OX01PREVfVEFCUyIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjIiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8L2NsYXNzPgorPGludGVyZmFjZSBuYW1lPSJBY3Rpb25CYXIuTmF2aWdhdGlvbkNhbGxiYWNrIgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPG1ldGhvZCBuYW1lPSJvbk5hdmlnYXRpb25JdGVtU2VsZWN0ZWQiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Iml0ZW1Qb3NpdGlvbiIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJpdGVtSWQiIHR5cGU9ImxvbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvaW50ZXJmYWNlPgorPGNsYXNzIG5hbWU9IkFjdGlvbkJhci5UYWIiCisgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJBY3Rpb25CYXIuVGFiIgorIHR5cGU9ImFuZHJvaWQuYXBwLkFjdGlvbkJhci5UYWIiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0iZ2V0RnJhZ21lbnQiCisgcmV0dXJuPSJhbmRyb2lkLmFwcC5GcmFnbWVudCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEljb24iCisgcmV0dXJuPSJhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0UG9zaXRpb24iCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRUZXh0IgorIHJldHVybj0iamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNlbGVjdCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRGcmFnbWVudCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZnJhZ21lbnQiIHR5cGU9ImFuZHJvaWQuYXBwLkZyYWdtZW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEljb24iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Imljb24iIHR5cGU9ImFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0VGV4dCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idGV4dCIgdHlwZT0iamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPGZpZWxkIG5hbWU9IklOVkFMSURfUE9TSVRJT04iCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSItMSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzwvY2xhc3M+CiA8Y2xhc3MgbmFtZT0iQWN0aXZpdHkiCiAgZXh0ZW5kcz0iYW5kcm9pZC52aWV3LkNvbnRleHRUaGVtZVdyYXBwZXIiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTkyMTIsNiArMjE5MTMsMzIgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iZXYiIHR5cGU9ImFuZHJvaWQudmlldy5Nb3Rpb25FdmVudCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJmaW5kRnJhZ21lbnRCeUlkIgorIHJldHVybj0iYW5kcm9pZC5hcHAuRnJhZ21lbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaWQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJmaW5kRnJhZ21lbnRCeVRhZyIKKyByZXR1cm49ImFuZHJvaWQuYXBwLkZyYWdtZW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InRhZyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJmaW5kVmlld0J5SWQiCiAgcmV0dXJuPSJhbmRyb2lkLnZpZXcuVmlldyIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xOTI3Nyw2ICsyMjAwNCwxNyBAQAogPHBhcmFtZXRlciBuYW1lPSJjaGlsZCIgdHlwZT0iYW5kcm9pZC5hcHAuQWN0aXZpdHkiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0QWN0aW9uQmFyIgorIHJldHVybj0iYW5kcm9pZC5hcHAuQWN0aW9uQmFyIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldEFwcGxpY2F0aW9uIgogIHJldHVybj0iYW5kcm9pZC5hcHAuQXBwbGljYXRpb24iCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTkzNDMsNiArMjIwODEsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0RnJhZ21lbnRNYW5hZ2VyIgorIHJldHVybj0iYW5kcm9pZC5hcHAuRnJhZ21lbnRNYW5hZ2VyIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldEluc3RhbmNlQ291bnQiCiAgcmV0dXJuPSJsb25nIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE5Mzg3LDYgKzIyMTM2LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldExvYWRlck1hbmFnZXIiCisgcmV0dXJuPSJhbmRyb2lkLmFwcC5Mb2FkZXJNYW5hZ2VyIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldExvY2FsQ2xhc3NOYW1lIgogIHJldHVybj0iamF2YS5sYW5nLlN0cmluZyIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xOTUyMSw2ICsyMjI4MSwyOCBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpbnZhbGlkYXRlT3B0aW9uc01lbnUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImlzQ2hhbmdpbmdDb25maWd1cmF0aW9ucyIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iaXNDaGlsZCIKICByZXR1cm49ImJvb2xlYW4iCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTk2MTYsNiArMjIzOTgsMTkgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iZGF0YSIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkludGVudCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbkF0dGFjaEZyYWdtZW50IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZnJhZ21lbnQiIHR5cGU9ImFuZHJvaWQuYXBwLkZyYWdtZW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9Im9uQXR0YWNoZWRUb1dpbmRvdyIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjAyMDIsNiArMjI5OTcsMTkgQEAKICB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25TdGFydEFjdGlvbk1vZGUiCisgcmV0dXJuPSJhbmRyb2lkLnZpZXcuQWN0aW9uTW9kZSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY2FsbGJhY2siIHR5cGU9ImFuZHJvaWQudmlldy5BY3Rpb25Nb2RlLkNhbGxiYWNrIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9Im9uU3RvcCIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjAzMTUsNiArMjMxMjMsMTcgQEAKIDxwYXJhbWV0ZXIgbmFtZT0idmlldyIgdHlwZT0iYW5kcm9pZC52aWV3LlZpZXciPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib3BlbkZyYWdtZW50VHJhbnNhY3Rpb24iCisgcmV0dXJuPSJhbmRyb2lkLmFwcC5GcmFnbWVudFRyYW5zYWN0aW9uIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ib3Blbk9wdGlvbnNNZW51IgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMDM0MSw2ICsyMzE2MCw0NyBAQAogPHBhcmFtZXRlciBuYW1lPSJleGl0QW5pbSIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InBvcEJhY2tTdGFjayIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJwb3BCYWNrU3RhY2siCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImZsYWdzIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icG9wQmFja1N0YWNrIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJpZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJmbGFncyIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InJlZ2lzdGVyRm9yQ29udGV4dE1lbnUiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIwNzQ1LDYgKzIzNjA1LDE5IEBACiA8cGFyYW1ldGVyIG5hbWU9ImFyZ3MiIHR5cGU9ImFuZHJvaWQub3MuQnVuZGxlIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InN0YXJ0QWN0aW9uTW9kZSIKKyByZXR1cm49ImFuZHJvaWQudmlldy5BY3Rpb25Nb2RlIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjYWxsYmFjayIgdHlwZT0iYW5kcm9pZC52aWV3LkFjdGlvbk1vZGUuQ2FsbGJhY2siPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic3RhcnRBY3Rpdml0eUZvclJlc3VsdCIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjA3NzcsNiArMjM2NTAsMjMgQEAKIDxwYXJhbWV0ZXIgbmFtZT0icmVxdWVzdENvZGUiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzdGFydEFjdGl2aXR5RnJvbUZyYWdtZW50IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZnJhZ21lbnQiIHR5cGU9ImFuZHJvaWQuYXBwLkZyYWdtZW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJpbnRlbnQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5JbnRlbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InJlcXVlc3RDb2RlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic3RhcnRBY3Rpdml0eUlmTmVlZGVkIgogIHJldHVybj0iYm9vbGVhbiIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMTAwOSw2ICsyMzg5OSwxNyBAQAogIHZpc2liaWxpdHk9InByb3RlY3RlZCIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iUE9QX0JBQ0tfU1RBQ0tfSU5DTFVTSVZFIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJSRVNVTFRfQ0FOQ0VMRUQiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0yMzczMiw2ICsyNjYzMywxNyBAQAogPHBhcmFtZXRlciBuYW1lPSJpZCIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEFjdGlvbkJhciIKKyByZXR1cm49ImFuZHJvaWQuYXBwLkFjdGlvbkJhciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRDb250ZXh0IgogIHJldHVybj0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjM4MDksNiArMjY3MjEsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaW52YWxpZGF0ZU9wdGlvbnNNZW51IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJpc1Nob3dpbmciCiAgcmV0dXJuPSJib29sZWFuIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTI0MTcwLDYgKzI3MDkzLDE5IEBACiAgdmlzaWJpbGl0eT0icHJvdGVjdGVkIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uU3RhcnRBY3Rpb25Nb2RlIgorIHJldHVybj0iYW5kcm9pZC52aWV3LkFjdGlvbk1vZGUiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNhbGxiYWNrIiB0eXBlPSJhbmRyb2lkLnZpZXcuQWN0aW9uTW9kZS5DYWxsYmFjayI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJvblN0b3AiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTI0NTc4LDYgKzI3NTE0LDI1MSBAQAogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KIDwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iRGlhbG9nRnJhZ21lbnQiCisgZXh0ZW5kcz0iYW5kcm9pZC5hcHAuRnJhZ21lbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxpbXBsZW1lbnRzIG5hbWU9ImFuZHJvaWQuY29udGVudC5EaWFsb2dJbnRlcmZhY2UuT25DYW5jZWxMaXN0ZW5lciI+Cis8L2ltcGxlbWVudHM+Cis8aW1wbGVtZW50cyBuYW1lPSJhbmRyb2lkLmNvbnRlbnQuRGlhbG9nSW50ZXJmYWNlLk9uRGlzbWlzc0xpc3RlbmVyIj4KKzwvaW1wbGVtZW50cz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJEaWFsb2dGcmFnbWVudCIKKyB0eXBlPSJhbmRyb2lkLmFwcC5EaWFsb2dGcmFnbWVudCIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJkaXNtaXNzIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRDYW5jZWxhYmxlIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXREaWFsb2ciCisgcmV0dXJuPSJhbmRyb2lkLmFwcC5EaWFsb2ciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0U2hvd3NEaWFsb2ciCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFRoZW1lIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uQ2FuY2VsIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZGlhbG9nIiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuRGlhbG9nSW50ZXJmYWNlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uQ3JlYXRlRGlhbG9nIgorIHJldHVybj0iYW5kcm9pZC5hcHAuRGlhbG9nIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJzYXZlZEluc3RhbmNlU3RhdGUiIHR5cGU9ImFuZHJvaWQub3MuQnVuZGxlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uRGlzbWlzcyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImRpYWxvZyIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkRpYWxvZ0ludGVyZmFjZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRDYW5jZWxhYmxlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY2FuY2VsYWJsZSIgdHlwZT0iYm9vbGVhbiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRTaG93c0RpYWxvZyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InNob3dzRGlhbG9nIiB0eXBlPSJib29sZWFuIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFN0eWxlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ic3R5bGUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idGhlbWUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzaG93IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhY3Rpdml0eSIgdHlwZT0iYW5kcm9pZC5hcHAuQWN0aXZpdHkiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InRhZyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzaG93IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibWFuYWdlciIgdHlwZT0iYW5kcm9pZC5hcHAuRnJhZ21lbnRNYW5hZ2VyIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ0YWciIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2hvdyIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idHJhbnNhY3Rpb24iIHR5cGU9ImFuZHJvaWQuYXBwLkZyYWdtZW50VHJhbnNhY3Rpb24iPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InRhZyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPGZpZWxkIG5hbWU9IlNUWUxFX05PUk1BTCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjAiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iU1RZTEVfTk9fRlJBTUUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIyIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlNUWUxFX05PX0lOUFVUIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJTVFlMRV9OT19USVRMRSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjEiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8L2NsYXNzPgogPGNsYXNzIG5hbWU9IkV4cGFuZGFibGVMaXN0QWN0aXZpdHkiCiAgZXh0ZW5kcz0iYW5kcm9pZC5hcHAuQWN0aXZpdHkiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjQ3MzcsNiArMjc5MTgsMTA2OCBAQAogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KIDwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iRnJhZ21lbnQiCisgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGltcGxlbWVudHMgbmFtZT0iYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudENhbGxiYWNrcyI+Cis8L2ltcGxlbWVudHM+Cis8aW1wbGVtZW50cyBuYW1lPSJhbmRyb2lkLnZpZXcuVmlldy5PbkNyZWF0ZUNvbnRleHRNZW51TGlzdGVuZXIiPgorPC9pbXBsZW1lbnRzPgorPGNvbnN0cnVjdG9yIG5hbWU9IkZyYWdtZW50IgorIHR5cGU9ImFuZHJvaWQuYXBwLkZyYWdtZW50IgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImVxdWFscyIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibyIgdHlwZT0iamF2YS5sYW5nLk9iamVjdCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRBY3Rpdml0eSIKKyByZXR1cm49ImFuZHJvaWQuYXBwLkFjdGl2aXR5IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0QXJndW1lbnRzIgorIHJldHVybj0iYW5kcm9pZC5vcy5CdW5kbGUiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRGcmFnbWVudE1hbmFnZXIiCisgcmV0dXJuPSJhbmRyb2lkLmFwcC5GcmFnbWVudE1hbmFnZXIiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRJZCIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldExvYWRlck1hbmFnZXIiCisgcmV0dXJuPSJhbmRyb2lkLmFwcC5Mb2FkZXJNYW5hZ2VyIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFJldGFpbkluc3RhbmNlIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFRhZyIKKyByZXR1cm49ImphdmEubGFuZy5TdHJpbmciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRUYXJnZXRGcmFnbWVudCIKKyByZXR1cm49ImFuZHJvaWQuYXBwLkZyYWdtZW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0VGFyZ2V0UmVxdWVzdENvZGUiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRWaWV3IgorIHJldHVybj0iYW5kcm9pZC52aWV3LlZpZXciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaGFzaENvZGUiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpbnN0YW50aWF0ZSIKKyByZXR1cm49ImFuZHJvaWQuYXBwLkZyYWdtZW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJmbmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpbnN0YW50aWF0ZSIKKyByZXR1cm49ImFuZHJvaWQuYXBwLkZyYWdtZW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJmbmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iYXJncyIgdHlwZT0iYW5kcm9pZC5vcy5CdW5kbGUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaXNBZGRlZCIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpc0hpZGRlbiIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpc1Jlc3VtZWQiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaXNWaXNpYmxlIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uQWN0aXZpdHlDcmVhdGVkIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ic2F2ZWRJbnN0YW5jZVN0YXRlIiB0eXBlPSJhbmRyb2lkLm9zLkJ1bmRsZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbkFjdGl2aXR5UmVzdWx0IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icmVxdWVzdENvZGUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0icmVzdWx0Q29kZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJkYXRhIiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuSW50ZW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uQXR0YWNoIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYWN0aXZpdHkiIHR5cGU9ImFuZHJvaWQuYXBwLkFjdGl2aXR5Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uQ29uZmlndXJhdGlvbkNoYW5nZWQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJuZXdDb25maWciIHR5cGU9ImFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbkNvbnRleHRJdGVtU2VsZWN0ZWQiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJpdGVtIiB0eXBlPSJhbmRyb2lkLnZpZXcuTWVudUl0ZW0iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25DcmVhdGUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJzYXZlZEluc3RhbmNlU3RhdGUiIHR5cGU9ImFuZHJvaWQub3MuQnVuZGxlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uQ3JlYXRlQW5pbWF0YWJsZSIKKyByZXR1cm49ImFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdGFibGUiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InRyYW5zaXQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZW50ZXIiIHR5cGU9ImJvb2xlYW4iPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im5leHRBbmltIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25DcmVhdGVDb250ZXh0TWVudSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im1lbnUiIHR5cGU9ImFuZHJvaWQudmlldy5Db250ZXh0TWVudSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idiIgdHlwZT0iYW5kcm9pZC52aWV3LlZpZXciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im1lbnVJbmZvIiB0eXBlPSJhbmRyb2lkLnZpZXcuQ29udGV4dE1lbnUuQ29udGV4dE1lbnVJbmZvIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uQ3JlYXRlT3B0aW9uc01lbnUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJtZW51IiB0eXBlPSJhbmRyb2lkLnZpZXcuTWVudSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iaW5mbGF0ZXIiIHR5cGU9ImFuZHJvaWQudmlldy5NZW51SW5mbGF0ZXIiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25DcmVhdGVWaWV3IgorIHJldHVybj0iYW5kcm9pZC52aWV3LlZpZXciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImluZmxhdGVyIiB0eXBlPSJhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXIiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRhaW5lciIgdHlwZT0iYW5kcm9pZC52aWV3LlZpZXdHcm91cCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic2F2ZWRJbnN0YW5jZVN0YXRlIiB0eXBlPSJhbmRyb2lkLm9zLkJ1bmRsZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbkRlc3Ryb3kiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uRGVzdHJveVZpZXciCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uRGV0YWNoIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbkhpZGRlbkNoYW5nZWQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJoaWRkZW4iIHR5cGU9ImJvb2xlYW4iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25JbmZsYXRlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYXR0cnMiIHR5cGU9ImFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InNhdmVkSW5zdGFuY2VTdGF0ZSIgdHlwZT0iYW5kcm9pZC5vcy5CdW5kbGUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25Mb3dNZW1vcnkiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uT3B0aW9uc0l0ZW1TZWxlY3RlZCIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Iml0ZW0iIHR5cGU9ImFuZHJvaWQudmlldy5NZW51SXRlbSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbk9wdGlvbnNNZW51Q2xvc2VkIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibWVudSIgdHlwZT0iYW5kcm9pZC52aWV3Lk1lbnUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25QYXVzZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25QcmVwYXJlT3B0aW9uc01lbnUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJtZW51IiB0eXBlPSJhbmRyb2lkLnZpZXcuTWVudSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvblJlc3VtZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25TYXZlSW5zdGFuY2VTdGF0ZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im91dFN0YXRlIiB0eXBlPSJhbmRyb2lkLm9zLkJ1bmRsZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvblN0YXJ0IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvblN0b3AiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InJlZ2lzdGVyRm9yQ29udGV4dE1lbnUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ2aWV3IiB0eXBlPSJhbmRyb2lkLnZpZXcuVmlldyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRBcmd1bWVudHMiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhcmdzIiB0eXBlPSJhbmRyb2lkLm9zLkJ1bmRsZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRIYXNPcHRpb25zTWVudSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Imhhc01lbnUiIHR5cGU9ImJvb2xlYW4iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0UmV0YWluSW5zdGFuY2UiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJyZXRhaW4iIHR5cGU9ImJvb2xlYW4iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0VGFyZ2V0RnJhZ21lbnQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJmcmFnbWVudCIgdHlwZT0iYW5kcm9pZC5hcHAuRnJhZ21lbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InJlcXVlc3RDb2RlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic3RhcnRBY3Rpdml0eSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImludGVudCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkludGVudCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzdGFydEFjdGl2aXR5Rm9yUmVzdWx0IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaW50ZW50IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuSW50ZW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJyZXF1ZXN0Q29kZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InVucmVnaXN0ZXJGb3JDb250ZXh0TWVudSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InZpZXciIHR5cGU9ImFuZHJvaWQudmlldy5WaWV3Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2NsYXNzPgorPGNsYXNzIG5hbWU9IkZyYWdtZW50Lkluc3RhbnRpYXRpb25FeGNlcHRpb24iCisgZXh0ZW5kcz0iYW5kcm9pZC51dGlsLkFuZHJvaWRSdW50aW1lRXhjZXB0aW9uIgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJGcmFnbWVudC5JbnN0YW50aWF0aW9uRXhjZXB0aW9uIgorIHR5cGU9ImFuZHJvaWQuYXBwLkZyYWdtZW50Lkluc3RhbnRpYXRpb25FeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJtc2ciIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImNhdXNlIiB0eXBlPSJqYXZhLmxhbmcuRXhjZXB0aW9uIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzwvY2xhc3M+Cis8aW50ZXJmYWNlIG5hbWU9IkZyYWdtZW50TWFuYWdlciIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8bWV0aG9kIG5hbWU9ImZpbmRGcmFnbWVudEJ5SWQiCisgcmV0dXJuPSJhbmRyb2lkLmFwcC5GcmFnbWVudCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJpZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImZpbmRGcmFnbWVudEJ5VGFnIgorIHJldHVybj0iYW5kcm9pZC5hcHAuRnJhZ21lbnQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idGFnIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEZyYWdtZW50IgorIHJldHVybj0iYW5kcm9pZC5hcHAuRnJhZ21lbnQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYnVuZGxlIiB0eXBlPSJhbmRyb2lkLm9zLkJ1bmRsZSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ia2V5IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9wZW5UcmFuc2FjdGlvbiIKKyByZXR1cm49ImFuZHJvaWQuYXBwLkZyYWdtZW50VHJhbnNhY3Rpb24iCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJwb3BCYWNrU3RhY2siCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icG9wQmFja1N0YWNrIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJuYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJmbGFncyIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InBvcEJhY2tTdGFjayIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaWQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZmxhZ3MiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJwdXRGcmFnbWVudCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYnVuZGxlIiB0eXBlPSJhbmRyb2lkLm9zLkJ1bmRsZSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ia2V5IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJmcmFnbWVudCIgdHlwZT0iYW5kcm9pZC5hcHAuRnJhZ21lbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxmaWVsZCBuYW1lPSJQT1BfQkFDS19TVEFDS19JTkNMVVNJVkUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPC9pbnRlcmZhY2U+Cis8aW50ZXJmYWNlIG5hbWU9IkZyYWdtZW50VHJhbnNhY3Rpb24iCisgYWJzdHJhY3Q9InRydWUiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPG1ldGhvZCBuYW1lPSJhZGQiCisgcmV0dXJuPSJhbmRyb2lkLmFwcC5GcmFnbWVudFRyYW5zYWN0aW9uIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImZyYWdtZW50IiB0eXBlPSJhbmRyb2lkLmFwcC5GcmFnbWVudCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idGFnIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImFkZCIKKyByZXR1cm49ImFuZHJvaWQuYXBwLkZyYWdtZW50VHJhbnNhY3Rpb24iCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGFpbmVyVmlld0lkIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImZyYWdtZW50IiB0eXBlPSJhbmRyb2lkLmFwcC5GcmFnbWVudCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJhZGQiCisgcmV0dXJuPSJhbmRyb2lkLmFwcC5GcmFnbWVudFRyYW5zYWN0aW9uIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRhaW5lclZpZXdJZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJmcmFnbWVudCIgdHlwZT0iYW5kcm9pZC5hcHAuRnJhZ21lbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InRhZyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJhZGRUb0JhY2tTdGFjayIKKyByZXR1cm49ImFuZHJvaWQuYXBwLkZyYWdtZW50VHJhbnNhY3Rpb24iCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJjb21taXQiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJoaWRlIgorIHJldHVybj0iYW5kcm9pZC5hcHAuRnJhZ21lbnRUcmFuc2FjdGlvbiIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJmcmFnbWVudCIgdHlwZT0iYW5kcm9pZC5hcHAuRnJhZ21lbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icmVtb3ZlIgorIHJldHVybj0iYW5kcm9pZC5hcHAuRnJhZ21lbnRUcmFuc2FjdGlvbiIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJmcmFnbWVudCIgdHlwZT0iYW5kcm9pZC5hcHAuRnJhZ21lbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icmVwbGFjZSIKKyByZXR1cm49ImFuZHJvaWQuYXBwLkZyYWdtZW50VHJhbnNhY3Rpb24iCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGFpbmVyVmlld0lkIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImZyYWdtZW50IiB0eXBlPSJhbmRyb2lkLmFwcC5GcmFnbWVudCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJyZXBsYWNlIgorIHJldHVybj0iYW5kcm9pZC5hcHAuRnJhZ21lbnRUcmFuc2FjdGlvbiIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb250YWluZXJWaWV3SWQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZnJhZ21lbnQiIHR5cGU9ImFuZHJvaWQuYXBwLkZyYWdtZW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ0YWciIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0Q3VzdG9tQW5pbWF0aW9ucyIKKyByZXR1cm49ImFuZHJvaWQuYXBwLkZyYWdtZW50VHJhbnNhY3Rpb24iCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZW50ZXIiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZXhpdCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFRyYW5zaXRpb24iCisgcmV0dXJuPSJhbmRyb2lkLmFwcC5GcmFnbWVudFRyYW5zYWN0aW9uIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InRyYW5zaXQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRUcmFuc2l0aW9uU3R5bGUiCisgcmV0dXJuPSJhbmRyb2lkLmFwcC5GcmFnbWVudFRyYW5zYWN0aW9uIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InN0eWxlUmVzIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2hvdyIKKyByZXR1cm49ImFuZHJvaWQuYXBwLkZyYWdtZW50VHJhbnNhY3Rpb24iCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZnJhZ21lbnQiIHR5cGU9ImFuZHJvaWQuYXBwLkZyYWdtZW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8ZmllbGQgbmFtZT0iVFJBTlNJVF9FTlRFUl9NQVNLIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iNDA5NiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJUUkFOU0lUX0VYSVRfTUFTSyIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjgxOTIiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iVFJBTlNJVF9GUkFHTUVOVF9DTE9TRSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjgxOTQiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iVFJBTlNJVF9GUkFHTUVOVF9PUEVOIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iNDA5NyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJUUkFOU0lUX05PTkUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIwIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlRSQU5TSVRfVU5TRVQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSItMSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzwvaW50ZXJmYWNlPgogPGNsYXNzIG5hbWU9Ikluc3RydW1lbnRhdGlvbiIKICBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTI2MTg2LDYgKzMwNDI5LDM3MyBAQAogPC9wYXJhbWV0ZXI+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+CiA8Y2xhc3MgbmFtZT0iTG9jYWxBY3Rpdml0eU1hbmFnZXIiCiAgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yOTkxMCw2ICszNDUyMCwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iVVNFU19QT0xJQ1lfU0VUU19HTE9CQUxfUFJPWFkiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSI1IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9IlVTRVNfUE9MSUNZX1dBVENIX0xPR0lOIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMzAxOTksNiArMzQ4MjAsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0R2xvYmFsUHJveHlBZG1pbiIKKyByZXR1cm49ImFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldE1heGltdW1GYWlsZWRQYXNzd29yZHNGb3JXaXBlIgogIHJldHVybj0iaW50IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTMwMjI1LDYgKzM0ODU3LDE5IEBACiA8cGFyYW1ldGVyIG5hbWU9ImFkbWluIiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZSI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRQYXNzd29yZEhpc3RvcnlMZW5ndGgiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFkbWluIiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRQYXNzd29yZE1heGltdW1MZW5ndGgiCiAgcmV0dXJuPSJpbnQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMzAyNTEsNiArMzQ4OTYsODQgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iYWRtaW4iIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFBhc3N3b3JkTWluaW11bUxldHRlcnMiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFkbWluIiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRQYXNzd29yZE1pbmltdW1Mb3dlckNhc2UiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFkbWluIiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRQYXNzd29yZE1pbmltdW1Ob25MZXR0ZXIiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFkbWluIiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRQYXNzd29yZE1pbmltdW1OdW1lcmljIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhZG1pbiIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0UGFzc3dvcmRNaW5pbXVtU3ltYm9scyIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYWRtaW4iIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFBhc3N3b3JkTWluaW11bVVwcGVyQ2FzZSIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYWRtaW4iIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldFBhc3N3b3JkUXVhbGl0eSIKICByZXR1cm49ImludCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0zMDMyNyw2ICszNTA1MCwyMyBAQAogPHBhcmFtZXRlciBuYW1lPSJmbGFncyIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEdsb2JhbFByb3h5IgorIHJldHVybj0iYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFkbWluIiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0icHJveHlTcGVjIiB0eXBlPSJqYXZhLm5ldC5Qcm94eSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZXhjbHVzaW9uTGlzdCIgdHlwZT0iamF2YS51dGlsLkxpc3QmbHQ7amF2YS5sYW5nLlN0cmluZyZndDsiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0TWF4aW11bUZhaWxlZFBhc3N3b3Jkc0ZvcldpcGUiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTMwMzU3LDYgKzM1MDk3LDIxIEBACiA8cGFyYW1ldGVyIG5hbWU9InRpbWVNcyIgdHlwZT0ibG9uZyI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRQYXNzd29yZEhpc3RvcnlMZW5ndGgiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhZG1pbiIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Imxlbmd0aCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNldFBhc3N3b3JkTWluaW11bUxlbmd0aCIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMzAzNzIsNiArMzUxMjcsOTYgQEAKIDxwYXJhbWV0ZXIgbmFtZT0ibGVuZ3RoIiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0UGFzc3dvcmRNaW5pbXVtTGV0dGVycyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFkbWluIiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibGVuZ3RoIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0UGFzc3dvcmRNaW5pbXVtTG93ZXJDYXNlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYWRtaW4iIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJsZW5ndGgiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRQYXNzd29yZE1pbmltdW1Ob25MZXR0ZXIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhZG1pbiIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Imxlbmd0aCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFBhc3N3b3JkTWluaW11bU51bWVyaWMiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhZG1pbiIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Imxlbmd0aCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFBhc3N3b3JkTWluaW11bVN5bWJvbHMiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhZG1pbiIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Imxlbmd0aCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFBhc3N3b3JkTWluaW11bVVwcGVyQ2FzZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFkbWluIiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibGVuZ3RoIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0UGFzc3dvcmRRdWFsaXR5IgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0zMDQ2Niw2ICszNTMxMSwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iUEFTU1dPUkRfUVVBTElUWV9DT01QTEVYIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMzkzMjE2IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9IlBBU1NXT1JEX1FVQUxJVFlfTlVNRVJJQyIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTMxNDQ5LDYgKzM2MzA1LDY2IEBACiA8cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im5vdGlmeUFwcFdpZGdldFZpZXdEYXRhQ2hhbmdlZCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFwcFdpZGdldElkcyIgdHlwZT0iaW50W10iPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InZpZXdJZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im5vdGlmeUFwcFdpZGdldFZpZXdEYXRhQ2hhbmdlZCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFwcFdpZGdldElkIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InZpZXdJZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InBhcnRpYWxseVVwZGF0ZUFwcFdpZGdldCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFwcFdpZGdldElkcyIgdHlwZT0iaW50W10iPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InZpZXdzIiB0eXBlPSJhbmRyb2lkLndpZGdldC5SZW1vdGVWaWV3cyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJwYXJ0aWFsbHlVcGRhdGVBcHBXaWRnZXQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhcHBXaWRnZXRJZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ2aWV3cyIgdHlwZT0iYW5kcm9pZC53aWRnZXQuUmVtb3RlVmlld3MiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0idXBkYXRlQXBwV2lkZ2V0IgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0zNDA2MCw2ICszODk3Niw3MSBAQAogPC9wYXJhbWV0ZXI+CiA8L2NvbnN0cnVjdG9yPgogPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJBc3luY1Rhc2tMb2FkZXIiCisgZXh0ZW5kcz0iYW5kcm9pZC5jb250ZW50LkxvYWRlciIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iQXN5bmNUYXNrTG9hZGVyIgorIHR5cGU9ImFuZHJvaWQuY29udGVudC5Bc3luY1Rhc2tMb2FkZXIiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImNhbmNlbExvYWQiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImZvcmNlTG9hZCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ibG9hZEluQmFja2dyb3VuZCIKKyByZXR1cm49IkQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbkNhbmNlbGxlZCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImRhdGEiIHR5cGU9IkQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvY2xhc3M+CiA8Y2xhc3MgbmFtZT0iQnJvYWRjYXN0UmVjZWl2ZXIiCiAgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTM0MjkwLDYgKzM5MjcxLDM0OSBAQAogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KIDwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iQ2xpcGJvYXJkTWFuYWdlciIKKyBleHRlbmRzPSJhbmRyb2lkLnRleHQuQ2xpcGJvYXJkTWFuYWdlciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPG1ldGhvZCBuYW1lPSJhZGRQcmltYXJ5Q2xpcENoYW5nZWRMaXN0ZW5lciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9IndoYXQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5DbGlwYm9hcmRNYW5hZ2VyLk9uUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXIiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0UHJpbWFyeUNsaXAiCisgcmV0dXJuPSJhbmRyb2lkLmNvbnRlbnQuQ2xpcHBlZERhdGEiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0VGV4dCIKKyByZXR1cm49ImphdmEubGFuZy5DaGFyU2VxdWVuY2UiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJoYXNQcmltYXJ5Q2xpcCIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaGFzVGV4dCIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJyZW1vdmVQcmltYXJ5Q2xpcENoYW5nZWRMaXN0ZW5lciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9IndoYXQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5DbGlwYm9hcmRNYW5hZ2VyLk9uUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXIiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0UHJpbWFyeUNsaXAiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjbGlwIiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ2xpcHBlZERhdGEiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0VGV4dCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idGV4dCIgdHlwZT0iamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPC9jbGFzcz4KKzxpbnRlcmZhY2UgbmFtZT0iQ2xpcGJvYXJkTWFuYWdlci5PblByaW1hcnlDbGlwQ2hhbmdlZExpc3RlbmVyIgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPG1ldGhvZCBuYW1lPSJvblByaW1hcnlDbGlwQ2hhbmdlZCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPC9pbnRlcmZhY2U+Cis8Y2xhc3MgbmFtZT0iQ2xpcHBlZERhdGEiCisgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGltcGxlbWVudHMgbmFtZT0iYW5kcm9pZC5vcy5QYXJjZWxhYmxlIj4KKzwvaW1wbGVtZW50cz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJDbGlwcGVkRGF0YSIKKyB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ2xpcHBlZERhdGEiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJsYWJlbCIgdHlwZT0iamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iaWNvbiIgdHlwZT0iYW5kcm9pZC5ncmFwaGljcy5CaXRtYXAiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Iml0ZW0iIHR5cGU9ImFuZHJvaWQuY29udGVudC5DbGlwcGVkRGF0YS5JdGVtIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0iYWRkSXRlbSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Iml0ZW0iIHR5cGU9ImFuZHJvaWQuY29udGVudC5DbGlwcGVkRGF0YS5JdGVtIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImRlc2NyaWJlQ29udGVudHMiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0SWNvbiIKKyByZXR1cm49ImFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEl0ZW0iCisgcmV0dXJuPSJhbmRyb2lkLmNvbnRlbnQuQ2xpcHBlZERhdGEuSXRlbSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaW5kZXgiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRJdGVtQ291bnQiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0TGFiZWwiCisgcmV0dXJuPSJqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9IndyaXRlVG9QYXJjZWwiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJkZXN0IiB0eXBlPSJhbmRyb2lkLm9zLlBhcmNlbCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZmxhZ3MiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPGZpZWxkIG5hbWU9IkNSRUFUT1IiCisgdHlwZT0iYW5kcm9pZC5vcy5QYXJjZWxhYmxlLkNyZWF0b3IiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8L2NsYXNzPgorPGNsYXNzIG5hbWU9IkNsaXBwZWREYXRhLkl0ZW0iCisgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iQ2xpcHBlZERhdGEuSXRlbSIKKyB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ2xpcHBlZERhdGEuSXRlbSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InRleHQiIHR5cGU9ImphdmEubGFuZy5DaGFyU2VxdWVuY2UiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IkNsaXBwZWREYXRhLkl0ZW0iCisgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNsaXBwZWREYXRhLkl0ZW0iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJpbnRlbnQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5JbnRlbnQiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IkNsaXBwZWREYXRhLkl0ZW0iCisgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNsaXBwZWREYXRhLkl0ZW0iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ1cmkiIHR5cGU9ImFuZHJvaWQubmV0LlVyaSI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iQ2xpcHBlZERhdGEuSXRlbSIKKyB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ2xpcHBlZERhdGEuSXRlbSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InRleHQiIHR5cGU9ImphdmEubGFuZy5DaGFyU2VxdWVuY2UiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImludGVudCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkludGVudCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idXJpIiB0eXBlPSJhbmRyb2lkLm5ldC5VcmkiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJjb2VyY2VUb1RleHQiCisgcmV0dXJuPSJqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRJbnRlbnQiCisgcmV0dXJuPSJhbmRyb2lkLmNvbnRlbnQuSW50ZW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFRleHQiCisgcmV0dXJuPSJqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFVyaSIKKyByZXR1cm49ImFuZHJvaWQubmV0LlVyaSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPC9jbGFzcz4KIDxpbnRlcmZhY2UgbmFtZT0iQ29tcG9uZW50Q2FsbGJhY2tzIgogIGFic3RyYWN0PSJ0cnVlIgogIHN0YXRpYz0iZmFsc2UiCkBAIC0zNDYxMyw2ICszOTkzNywyMSBAQAogPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZXMiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzW10iPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iY29tcGFyZU1pbWVUeXBlcyIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29uY3JldGVUeXBlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJkZXNpcmVkVHlwZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJkZWxldGUiCiAgcmV0dXJuPSJpbnQiCiAgYWJzdHJhY3Q9InRydWUiCkBAIC0zNDY2Myw2ICs0MDAwMiwyMSBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRTdHJlYW1UeXBlcyIKKyByZXR1cm49ImphdmEubGFuZy5TdHJpbmdbXSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idXJpIiB0eXBlPSJhbmRyb2lkLm5ldC5VcmkiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im1pbWVUeXBlRmlsdGVyIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldFR5cGUiCiAgcmV0dXJuPSJqYXZhLmxhbmcuU3RyaW5nIgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMzQ3OTksNiArNDAxNTMsNDggQEAKIDxleGNlcHRpb24gbmFtZT0iRmlsZU5vdEZvdW5kRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbiI+CiA8L2V4Y2VwdGlvbj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvcGVuUGlwZUhlbHBlciIKKyByZXR1cm49ImFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3IiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InVyaSIgdHlwZT0iYW5kcm9pZC5uZXQuVXJpIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJtaW1lVHlwZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ib3B0cyIgdHlwZT0iYW5kcm9pZC5vcy5CdW5kbGUiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImFyZ3MiIHR5cGU9IlQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImZ1bmMiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZW50UHJvdmlkZXIuUGlwZURhdGFXcml0ZXImbHQ7VCZndDsiPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IkZpbGVOb3RGb3VuZEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib3BlblR5cGVkQXNzZXRGaWxlIgorIHJldHVybj0iYW5kcm9pZC5jb250ZW50LnJlcy5Bc3NldEZpbGVEZXNjcmlwdG9yIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ1cmkiIHR5cGU9ImFuZHJvaWQubmV0LlVyaSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibWltZVR5cGVGaWx0ZXIiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im9wdHMiIHR5cGU9ImFuZHJvaWQub3MuQnVuZGxlIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJGaWxlTm90Rm91bmRFeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InF1ZXJ5IgogIHJldHVybj0iYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IiCiAgYWJzdHJhY3Q9InRydWUiCkBAIC0zNDg1OSw2ICs0MDI1NSwxNyBAQAogPHBhcmFtZXRlciBuYW1lPSJwZXJtaXNzaW9uIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNodXRkb3duIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJ1cGRhdGUiCiAgcmV0dXJuPSJpbnQiCiAgYWJzdHJhY3Q9InRydWUiCkBAIC0zNDg3OSw2ICs0MDI4NiwzNSBAQAogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KIDwvY2xhc3M+Cis8aW50ZXJmYWNlIG5hbWU9IkNvbnRlbnRQcm92aWRlci5QaXBlRGF0YVdyaXRlciIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxtZXRob2QgbmFtZT0id3JpdGVEYXRhVG9QaXBlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJvdXRwdXQiIHR5cGU9ImFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3IiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InVyaSIgdHlwZT0iYW5kcm9pZC5uZXQuVXJpIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJtaW1lVHlwZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ib3B0cyIgdHlwZT0iYW5kcm9pZC5vcy5CdW5kbGUiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImFyZ3MiIHR5cGU9IlQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvaW50ZXJmYWNlPgogPGNsYXNzIG5hbWU9IkNvbnRlbnRQcm92aWRlckNsaWVudCIKICBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTM0OTUxLDYgKzQwMzg3LDIzIEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFN0cmVhbVR5cGVzIgorIHJldHVybj0iamF2YS5sYW5nLlN0cmluZ1tdIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ1cmwiIHR5cGU9ImFuZHJvaWQubmV0LlVyaSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibWltZVR5cGVGaWx0ZXIiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlJlbW90ZUV4Y2VwdGlvbiIgdHlwZT0iYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0VHlwZSIKICByZXR1cm49ImphdmEubGFuZy5TdHJpbmciCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMzUwMjEsNiArNDA0NzQsMjcgQEAKIDxleGNlcHRpb24gbmFtZT0iUmVtb3RlRXhjZXB0aW9uIiB0eXBlPSJhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbiI+CiA8L2V4Y2VwdGlvbj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvcGVuVHlwZWRBc3NldEZpbGVEZXNjcmlwdG9yIgorIHJldHVybj0iYW5kcm9pZC5jb250ZW50LnJlcy5Bc3NldEZpbGVEZXNjcmlwdG9yIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InVyaSIgdHlwZT0iYW5kcm9pZC5uZXQuVXJpIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJtaW1lVHlwZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ib3B0cyIgdHlwZT0iYW5kcm9pZC5vcy5CdW5kbGUiPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IkZpbGVOb3RGb3VuZEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8ZXhjZXB0aW9uIG5hbWU9IlJlbW90ZUV4Y2VwdGlvbiIgdHlwZT0iYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0icXVlcnkiCiAgcmV0dXJuPSJhbmRyb2lkLmRhdGFiYXNlLkN1cnNvciIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0zNTc5MSw2ICs0MTI2NSwyMSBAQAogPHBhcmFtZXRlciBuYW1lPSJhdXRob3JpdHkiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0U3RyZWFtVHlwZXMiCisgcmV0dXJuPSJqYXZhLmxhbmcuU3RyaW5nW10iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InVybCIgdHlwZT0iYW5kcm9pZC5uZXQuVXJpIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJtaW1lVHlwZUZpbHRlciIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRTeW5jQWRhcHRlclR5cGVzIgogIHJldHVybj0iYW5kcm9pZC5jb250ZW50LlN5bmNBZGFwdGVyVHlwZVtdIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTM1OTg4LDYgKzQxNDc3LDI1IEBACiA8ZXhjZXB0aW9uIG5hbWU9IkZpbGVOb3RGb3VuZEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb24iPgogPC9leGNlcHRpb24+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib3BlblR5cGVkQXNzZXRGaWxlRGVzY3JpcHRvciIKKyByZXR1cm49ImFuZHJvaWQuY29udGVudC5yZXMuQXNzZXRGaWxlRGVzY3JpcHRvciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ1cmkiIHR5cGU9ImFuZHJvaWQubmV0LlVyaSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibWltZVR5cGUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im9wdHMiIHR5cGU9ImFuZHJvaWQub3MuQnVuZGxlIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJGaWxlTm90Rm91bmRFeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InF1ZXJ5IgogIHJldHVybj0iYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMzY2NTMsNiArNDIxNjEsMTcgQEAKIDxwYXJhbWV0ZXIgbmFtZT0ia2V5IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImtleVNldCIKKyByZXR1cm49ImphdmEudXRpbC5TZXQmbHQ7amF2YS5sYW5nLlN0cmluZyZndDsiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0icHV0IgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0zNzcwMyw2ICs0MzIyMiwyNSBAQAogPHBhcmFtZXRlciBuYW1lPSJmYWN0b3J5IiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZS5DdXJzb3JGYWN0b3J5Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9wZW5PckNyZWF0ZURhdGFiYXNlIgorIHJldHVybj0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2UiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibW9kZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJmYWN0b3J5IiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZS5DdXJzb3JGYWN0b3J5Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJlcnJvckhhbmRsZXIiIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2UuRGF0YWJhc2VFcnJvckhhbmRsZXIiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0icGVla1dhbGxwYXBlciIKICByZXR1cm49ImFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUiCiAgYWJzdHJhY3Q9InRydWUiCkBAIC0zOTE0MSw2ICs0NDY3OSwyNSBAQAogPHBhcmFtZXRlciBuYW1lPSJmYWN0b3J5IiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZS5DdXJzb3JGYWN0b3J5Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9wZW5PckNyZWF0ZURhdGFiYXNlIgorIHJldHVybj0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2UiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im1vZGUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZmFjdG9yeSIgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2UuQ3Vyc29yRmFjdG9yeSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZXJyb3JIYW5kbGVyIiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLkRhdGFiYXNlRXJyb3JIYW5kbGVyIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InBlZWtXYWxscGFwZXIiCiAgcmV0dXJuPSJhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTM5NDY3LDYgKzQ1MDI0LDIyNSBAQAogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KIDwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iQ3Vyc29yTG9hZGVyIgorIGV4dGVuZHM9ImFuZHJvaWQuY29udGVudC5Bc3luY1Rhc2tMb2FkZXIiCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJDdXJzb3JMb2FkZXIiCisgdHlwZT0iYW5kcm9pZC5jb250ZW50LkN1cnNvckxvYWRlciIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ1cmkiIHR5cGU9ImFuZHJvaWQubmV0LlVyaSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0icHJvamVjdGlvbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZ1tdIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzZWxlY3Rpb24iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InNlbGVjdGlvbkFyZ3MiIHR5cGU9ImphdmEubGFuZy5TdHJpbmdbXSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic29ydE9yZGVyIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0iZGVsaXZlclJlc3VsdCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImN1cnNvciIgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZGVzdHJveSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0UHJvamVjdGlvbiIKKyByZXR1cm49ImphdmEubGFuZy5TdHJpbmdbXSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRTZWxlY3Rpb24iCisgcmV0dXJuPSJqYXZhLmxhbmcuU3RyaW5nIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFNlbGVjdGlvbkFyZ3MiCisgcmV0dXJuPSJqYXZhLmxhbmcuU3RyaW5nW10iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0U29ydE9yZGVyIgorIHJldHVybj0iamF2YS5sYW5nLlN0cmluZyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRVcmkiCisgcmV0dXJuPSJhbmRyb2lkLm5ldC5VcmkiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ibG9hZEluQmFja2dyb3VuZCIKKyByZXR1cm49ImFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uQ2FuY2VsbGVkIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY3Vyc29yIiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLkN1cnNvciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRQcm9qZWN0aW9uIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icHJvamVjdGlvbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZ1tdIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFNlbGVjdGlvbiIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InNlbGVjdGlvbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRTZWxlY3Rpb25BcmdzIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ic2VsZWN0aW9uQXJncyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZ1tdIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFNvcnRPcmRlciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InNvcnRPcmRlciIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRVcmkiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ1cmkiIHR5cGU9ImFuZHJvaWQubmV0LlVyaSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzdGFydExvYWRpbmciCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InN0b3BMb2FkaW5nIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPC9jbGFzcz4KIDxpbnRlcmZhY2UgbmFtZT0iRGlhbG9nSW50ZXJmYWNlIgogIGFic3RyYWN0PSJ0cnVlIgogIHN0YXRpYz0iZmFsc2UiCkBAIC0zOTgyOCw2ICs0NTYwNCw5MyBAQAogPgogPC9tZXRob2Q+CiA8L2ludGVyZmFjZT4KKzxpbnRlcmZhY2UgbmFtZT0iSU9uUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXIiCisgYWJzdHJhY3Q9InRydWUiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGltcGxlbWVudHMgbmFtZT0iYW5kcm9pZC5vcy5JSW50ZXJmYWNlIj4KKzwvaW1wbGVtZW50cz4KKzxtZXRob2QgbmFtZT0iZGlzcGF0Y2hQcmltYXJ5Q2xpcENoYW5nZWQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8ZXhjZXB0aW9uIG5hbWU9IlJlbW90ZUV4Y2VwdGlvbiIgdHlwZT0iYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzwvaW50ZXJmYWNlPgorPGNsYXNzIG5hbWU9IklPblByaW1hcnlDbGlwQ2hhbmdlZExpc3RlbmVyLlN0dWIiCisgZXh0ZW5kcz0iYW5kcm9pZC5vcy5CaW5kZXIiCisgYWJzdHJhY3Q9InRydWUiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8aW1wbGVtZW50cyBuYW1lPSJhbmRyb2lkLmNvbnRlbnQuSU9uUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXIiPgorPC9pbXBsZW1lbnRzPgorPGNvbnN0cnVjdG9yIG5hbWU9IklPblByaW1hcnlDbGlwQ2hhbmdlZExpc3RlbmVyLlN0dWIiCisgdHlwZT0iYW5kcm9pZC5jb250ZW50LklPblByaW1hcnlDbGlwQ2hhbmdlZExpc3RlbmVyLlN0dWIiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0iYXNCaW5kZXIiCisgcmV0dXJuPSJhbmRyb2lkLm9zLklCaW5kZXIiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iYXNJbnRlcmZhY2UiCisgcmV0dXJuPSJhbmRyb2lkLmNvbnRlbnQuSU9uUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXIiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ib2JqIiB0eXBlPSJhbmRyb2lkLm9zLklCaW5kZXIiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25UcmFuc2FjdCIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvZGUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZGF0YSIgdHlwZT0iYW5kcm9pZC5vcy5QYXJjZWwiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InJlcGx5IiB0eXBlPSJhbmRyb2lkLm9zLlBhcmNlbCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZmxhZ3MiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iUmVtb3RlRXhjZXB0aW9uIiB0eXBlPSJhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPC9jbGFzcz4KIDxjbGFzcyBuYW1lPSJJbnRlbnQiCiAgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC00MjA0Niw2ICs0NzkwOSwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iQUNUSU9OX1BBU1RFIgorIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IiZxdW90O2FuZHJvaWQuaW50ZW50LmFjdGlvbi5QQVNURSZxdW90OyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJBQ1RJT05fUElDSyIKICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC00NDQ0NCw2ICs1MDMxOCwxODMgQEAKIDwvcGFyYW1ldGVyPgogPC9jb25zdHJ1Y3Rvcj4KIDwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iTG9hZGVyIgorIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCisgYWJzdHJhY3Q9InRydWUiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9IkxvYWRlciIKKyB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuTG9hZGVyIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJkZWxpdmVyUmVzdWx0IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZGF0YSIgdHlwZT0iRCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJkZXN0cm95IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImZvcmNlTG9hZCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRDb250ZXh0IgorIHJldHVybj0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0SWQiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25Db250ZW50Q2hhbmdlZCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icmVnaXN0ZXJMaXN0ZW5lciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImlkIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Imxpc3RlbmVyIiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuTG9hZGVyLk9uTG9hZENvbXBsZXRlTGlzdGVuZXImbHQ7RCZndDsiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic3RhcnRMb2FkaW5nIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InN0b3BMb2FkaW5nIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InVucmVnaXN0ZXJMaXN0ZW5lciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Imxpc3RlbmVyIiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuTG9hZGVyLk9uTG9hZENvbXBsZXRlTGlzdGVuZXImbHQ7RCZndDsiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iTG9hZGVyLkZvcmNlTG9hZENvbnRlbnRPYnNlcnZlciIKKyBleHRlbmRzPSJhbmRyb2lkLmRhdGFiYXNlLkNvbnRlbnRPYnNlcnZlciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iTG9hZGVyLkZvcmNlTG9hZENvbnRlbnRPYnNlcnZlciIKKyB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuTG9hZGVyLkZvcmNlTG9hZENvbnRlbnRPYnNlcnZlciIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2NvbnN0cnVjdG9yPgorPC9jbGFzcz4KKzxpbnRlcmZhY2UgbmFtZT0iTG9hZGVyLk9uTG9hZENvbXBsZXRlTGlzdGVuZXIiCisgYWJzdHJhY3Q9InRydWUiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8bWV0aG9kIG5hbWU9Im9uTG9hZENvbXBsZXRlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJsb2FkZXIiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Mb2FkZXImbHQ7RCZndDsiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImRhdGEiIHR5cGU9IkQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvaW50ZXJmYWNlPgogPGNsYXNzIG5hbWU9Ik11dGFibGVDb250ZXh0V3JhcHBlciIKICBleHRlbmRzPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dFdyYXBwZXIiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtNDQ5ODMsNiArNTEwMzQsMjEgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iZGVmVmFsdWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0U3RyaW5nU2V0IgorIHJldHVybj0iamF2YS51dGlsLlNldCZsdDtqYXZhLmxhbmcuU3RyaW5nJmd0OyIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJrZXkiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImRlZlZhbHVlcyIgdHlwZT0iamF2YS51dGlsLlNldCZsdDtqYXZhLmxhbmcuU3RyaW5nJmd0OyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJyZWdpc3Rlck9uU2hhcmVkUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTQ1MTE0LDYgKzUxMTgwLDIxIEBACiA8cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InB1dFN0cmluZ1NldCIKKyByZXR1cm49ImFuZHJvaWQuY29udGVudC5TaGFyZWRQcmVmZXJlbmNlcy5FZGl0b3IiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ia2V5IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZXMiIHR5cGU9ImphdmEudXRpbC5TZXQmbHQ7amF2YS5sYW5nLlN0cmluZyZndDsiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0icmVtb3ZlIgogIHJldHVybj0iYW5kcm9pZC5jb250ZW50LlNoYXJlZFByZWZlcmVuY2VzLkVkaXRvciIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTQ1ODMxLDYgKzUxOTEyLDE0NSBAQAogPgogPC9maWVsZD4KIDwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iWG1sRG9jdW1lbnRQcm92aWRlciIKKyBleHRlbmRzPSJhbmRyb2lkLmNvbnRlbnQuQ29udGVudFByb3ZpZGVyIgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iWG1sRG9jdW1lbnRQcm92aWRlciIKKyB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuWG1sRG9jdW1lbnRQcm92aWRlciIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJkZWxldGUiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InVyaSIgdHlwZT0iYW5kcm9pZC5uZXQuVXJpIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzZWxlY3Rpb24iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InNlbGVjdGlvbkFyZ3MiIHR5cGU9ImphdmEubGFuZy5TdHJpbmdbXSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRSZXNvdXJjZVhtbFB1bGxQYXJzZXIiCisgcmV0dXJuPSJvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHJvdGVjdGVkIgorPgorPHBhcmFtZXRlciBuYW1lPSJyZXNvdXJjZVVyaSIgdHlwZT0iYW5kcm9pZC5uZXQuVXJpIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFR5cGUiCisgcmV0dXJuPSJqYXZhLmxhbmcuU3RyaW5nIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ1cmkiIHR5cGU9ImFuZHJvaWQubmV0LlVyaSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRVcmlYbWxQdWxsUGFyc2VyIgorIHJldHVybj0ib3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InByb3RlY3RlZCIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idXJsIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Imluc2VydCIKKyByZXR1cm49ImFuZHJvaWQubmV0LlVyaSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idXJpIiB0eXBlPSJhbmRyb2lkLm5ldC5VcmkiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InZhbHVlcyIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXMiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25DcmVhdGUiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InF1ZXJ5IgorIHJldHVybj0iYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InVyaSIgdHlwZT0iYW5kcm9pZC5uZXQuVXJpIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJwcm9qZWN0aW9uIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nW10iPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InNlbGVjdGlvbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic2VsZWN0aW9uQXJncyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZ1tdIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzb3J0T3JkZXIiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0idXBkYXRlIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ1cmkiIHR5cGU9ImFuZHJvaWQubmV0LlVyaSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idmFsdWVzIiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlcyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic2VsZWN0aW9uIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzZWxlY3Rpb25BcmdzIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nW10iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvY2xhc3M+CiA8L3BhY2thZ2U+CiA8cGFja2FnZSBuYW1lPSJhbmRyb2lkLmNvbnRlbnQucG0iCiA+CkBAIC00NjA5Niw2ICs1MjMxNiwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iRkxBR19IQVJEV0FSRV9BQ0NFTEVSQVRFRCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjEwMjQiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iRkxBR19JTU1FUlNJVkUiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC01MzU1Myw2ICs1OTc4NCwxOSBAQAogPHBhcmFtZXRlciBuYW1lPSJjb2x1bW4iIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRUeXBlIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb2x1bW4iIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRVcGRhdGVkRmllbGQiCiAgcmV0dXJuPSJqYXZhLmxhbmcuT2JqZWN0IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTUzNTYwLDcgKzU5ODA0LDcgQEAKICBzeW5jaHJvbml6ZWQ9ImZhbHNlIgogIHN0YXRpYz0iZmFsc2UiCiAgZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHJvdGVjdGVkIgogPgogPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5JbmRleCIgdHlwZT0iaW50Ij4KQEAgLTUzNjI4LDcgKzU5ODcyLDcgQEAKICBzeW5jaHJvbml6ZWQ9ImZhbHNlIgogIHN0YXRpYz0iZmFsc2UiCiAgZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHJvdGVjdGVkIgogPgogPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5JbmRleCIgdHlwZT0iaW50Ij4KQEAgLTUzOTE0LDcgKzYwMTU4LDcgQEAKICB2b2xhdGlsZT0iZmFsc2UiCiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiCiA+CiA8L2ZpZWxkPgpAQCAtNTQwNTAsNyArNjAyOTQsNyBAQAogIHN5bmNocm9uaXplZD0iZmFsc2UiCiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkluZGV4IiB0eXBlPSJpbnQiPgpAQCAtNTQwNjMsNyArNjAzMDcsNyBAQAogIHN5bmNocm9uaXplZD0iZmFsc2UiCiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkluZGV4IiB0eXBlPSJpbnQiPgpAQCAtNTQwNzYsNyArNjAzMjAsNyBAQAogIHN5bmNocm9uaXplZD0iZmFsc2UiCiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkluZGV4IiB0eXBlPSJpbnQiPgpAQCAtNTQxMDIsNyArNjAzNDYsNyBAQAogIHN5bmNocm9uaXplZD0iZmFsc2UiCiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkluZGV4IiB0eXBlPSJpbnQiPgpAQCAtNTQ1NzYsNiArNjA4MjAsMTkgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uSW5kZXgiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRUeXBlIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkluZGV4IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0V2FudHNBbGxPbk1vdmVDYWxscyIKICByZXR1cm49ImJvb2xlYW4iCiAgYWJzdHJhY3Q9InRydWUiCkBAIC01NDgxNiw2ICs2MTA3Myw2MSBAQAogPHBhcmFtZXRlciBuYW1lPSJvYnNlcnZlciIgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5EYXRhU2V0T2JzZXJ2ZXIiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxmaWVsZCBuYW1lPSJGSUVMRF9UWVBFX0JMT0IiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSI0IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkZJRUxEX1RZUEVfRkxPQVQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIyIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkZJRUxEX1RZUEVfSU5URUdFUiIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjEiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iRklFTERfVFlQRV9OVUxMIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJGSUVMRF9UWVBFX1NUUklORyIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjMiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8L2ludGVyZmFjZT4KIDxjbGFzcyBuYW1lPSJDdXJzb3JJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIgogIGV4dGVuZHM9ImphdmEubGFuZy5JbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIgpAQCAtNTUxNzMsNiArNjE0ODUsMjEgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iY29sIiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0VHlwZSIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icm93IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImlzQmxvYiIKICByZXR1cm49ImJvb2xlYW4iCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtNTUxODAsNyArNjE1MDcsNyBAQAogIHN5bmNocm9uaXplZD0iZmFsc2UiCiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8cGFyYW1ldGVyIG5hbWU9InJvdyIgdHlwZT0iaW50Ij4KQEAgLTU1MTk1LDcgKzYxNTIyLDcgQEAKICBzeW5jaHJvbml6ZWQ9ImZhbHNlIgogIHN0YXRpYz0iZmFsc2UiCiAgZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPHBhcmFtZXRlciBuYW1lPSJyb3ciIHR5cGU9ImludCI+CkBAIC01NTIxMCw3ICs2MTUzNyw3IEBACiAgc3luY2hyb25pemVkPSJmYWxzZSIKICBzdGF0aWM9ImZhbHNlIgogIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDxwYXJhbWV0ZXIgbmFtZT0icm93IiB0eXBlPSJpbnQiPgpAQCAtNTUyMjUsNyArNjE1NTIsNyBAQAogIHN5bmNocm9uaXplZD0iZmFsc2UiCiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8cGFyYW1ldGVyIG5hbWU9InJvdyIgdHlwZT0iaW50Ij4KQEAgLTU1MjQwLDcgKzYxNTY3LDcgQEAKICBzeW5jaHJvbml6ZWQ9ImZhbHNlIgogIHN0YXRpYz0iZmFsc2UiCiAgZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPHBhcmFtZXRlciBuYW1lPSJyb3ciIHR5cGU9ImludCI+CkBAIC01NTY1MSw2ICs2MTk3OCwxOSBAQAogPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5JbmRleCIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFR5cGUiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkluZGV4IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0V2FudHNBbGxPbk1vdmVDYWxscyIKICByZXR1cm49ImJvb2xlYW4iCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtNTU2NjIsNiArNjIwMDIsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0V3JhcHBlZEN1cnNvciIKKyByZXR1cm49ImFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImlzQWZ0ZXJMYXN0IgogIHJldHVybj0iYm9vbGVhbiIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC01NTk3MCw2ICs2MjMyMSwyNyBAQAogPgogPC9tZXRob2Q+CiA8L2NsYXNzPgorPGludGVyZmFjZSBuYW1lPSJEYXRhYmFzZUVycm9ySGFuZGxlciIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8bWV0aG9kIG5hbWU9Im9uQ29ycnVwdGlvbiIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZGJPYmoiIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2ludGVyZmFjZT4KIDxjbGFzcyBuYW1lPSJEYXRhYmFzZVV0aWxzIgogIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtNTYwMDEsNiArNjIzNzMsMjEgQEAKIDxwYXJhbWV0ZXIgbmFtZT0ic3FsU3RyaW5nIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImFwcGVuZFNlbGVjdGlvbkFyZ3MiCisgcmV0dXJuPSJqYXZhLmxhbmcuU3RyaW5nW10iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ib3JpZ2luYWxWYWx1ZXMiIHR5cGU9ImphdmEubGFuZy5TdHJpbmdbXSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibmV3VmFsdWVzIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nW10iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iYXBwZW5kVmFsdWVUb1NxbCIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtNTYwMzMsNiArNjI0MjAsMzggQEAKIDxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImphdmEubGFuZy5PYmplY3QiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iYmxvYkZpbGVEZXNjcmlwdG9yRm9yUXVlcnkiCisgcmV0dXJuPSJhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImRiIiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0icXVlcnkiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InNlbGVjdGlvbkFyZ3MiIHR5cGU9ImphdmEubGFuZy5TdHJpbmdbXSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJibG9iRmlsZURlc2NyaXB0b3JGb3JRdWVyeSIKKyByZXR1cm49ImFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3IiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icHJvZyIgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlU3RhdGVtZW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzZWxlY3Rpb25BcmdzIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nW10iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iY3JlYXRlRGJGcm9tU3FsU3RhdGVtZW50cyIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtNTY0NzAsNiArNjI4ODksMTkgQEAKIDxwYXJhbWV0ZXIgbmFtZT0ibmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRTcWxTdGF0ZW1lbnRUeXBlIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InNxbCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJsb25nRm9yUXVlcnkiCiAgcmV0dXJuPSJsb25nIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTU2NjU2LDYgKzYzMDg4LDgzIEBACiA8cGFyYW1ldGVyIG5hbWU9ImUiIHR5cGU9ImphdmEubGFuZy5FeGNlcHRpb24iPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxmaWVsZCBuYW1lPSJTVEFURU1FTlRfQUJPUlQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSI2IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlNUQVRFTUVOVF9BVFRBQ0giCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIzIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlNUQVRFTUVOVF9CRUdJTiIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjQiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iU1RBVEVNRU5UX0NPTU1JVCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjUiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iU1RBVEVNRU5UX09USEVSIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iNyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJTVEFURU1FTlRfU0VMRUNUIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJTVEFURU1FTlRfVVBEQVRFIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDwvY2xhc3M+CiA8Y2xhc3MgbmFtZT0iRGF0YWJhc2VVdGlscy5JbnNlcnRIZWxwZXIiCiAgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKQEAgLTU2ODkwLDYgKzYzMzk5LDM4IEBACiA+CiA8L2ZpZWxkPgogPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJEZWZhdWx0RGF0YWJhc2VFcnJvckhhbmRsZXIiCisgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8aW1wbGVtZW50cyBuYW1lPSJhbmRyb2lkLmRhdGFiYXNlLkRhdGFiYXNlRXJyb3JIYW5kbGVyIj4KKzwvaW1wbGVtZW50cz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJEZWZhdWx0RGF0YWJhc2VFcnJvckhhbmRsZXIiCisgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5EZWZhdWx0RGF0YWJhc2VFcnJvckhhbmRsZXIiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0ib25Db3JydXB0aW9uIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZGJPYmoiIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2NsYXNzPgogPGNsYXNzIG5hbWU9Ik1hdHJpeEN1cnNvciIKICBleHRlbmRzPSJhbmRyb2lkLmRhdGFiYXNlLkFic3RyYWN0Q3Vyc29yIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTU3MzczLDYgKzYzOTE0LDExNCBAQAogPC9wYXJhbWV0ZXI+CiA8L2NvbnN0cnVjdG9yPgogPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJTUUxpdGVBY2Nlc3NQZXJtRXhjZXB0aW9uIgorIGV4dGVuZHM9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZUV4Y2VwdGlvbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTGl0ZUFjY2Vzc1Blcm1FeGNlcHRpb24iCisgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlQWNjZXNzUGVybUV4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTGl0ZUFjY2Vzc1Blcm1FeGNlcHRpb24iCisgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlQWNjZXNzUGVybUV4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImVycm9yIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iU1FMaXRlQmluZE9yQ29sdW1uSW5kZXhPdXRPZlJhbmdlRXhjZXB0aW9uIgorIGV4dGVuZHM9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZUV4Y2VwdGlvbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTGl0ZUJpbmRPckNvbHVtbkluZGV4T3V0T2ZSYW5nZUV4Y2VwdGlvbiIKKyB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVCaW5kT3JDb2x1bW5JbmRleE91dE9mUmFuZ2VFeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxpdGVCaW5kT3JDb2x1bW5JbmRleE91dE9mUmFuZ2VFeGNlcHRpb24iCisgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlQmluZE9yQ29sdW1uSW5kZXhPdXRPZlJhbmdlRXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZXJyb3IiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJTUUxpdGVCbG9iVG9vQmlnRXhjZXB0aW9uIgorIGV4dGVuZHM9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZUV4Y2VwdGlvbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTGl0ZUJsb2JUb29CaWdFeGNlcHRpb24iCisgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlQmxvYlRvb0JpZ0V4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTGl0ZUJsb2JUb29CaWdFeGNlcHRpb24iCisgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlQmxvYlRvb0JpZ0V4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImVycm9yIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iU1FMaXRlQ2FudE9wZW5EYXRhYmFzZUV4Y2VwdGlvbiIKKyBleHRlbmRzPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVFeGNlcHRpb24iCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxpdGVDYW50T3BlbkRhdGFiYXNlRXhjZXB0aW9uIgorIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZUNhbnRPcGVuRGF0YWJhc2VFeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxpdGVDYW50T3BlbkRhdGFiYXNlRXhjZXB0aW9uIgorIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZUNhbnRPcGVuRGF0YWJhc2VFeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJlcnJvciIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8L2NsYXNzPgogPGNsYXNzIG5hbWU9IlNRTGl0ZUNsb3NhYmxlIgogIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCiAgYWJzdHJhY3Q9InRydWUiCkBAIC01NzQ4NCw3ICs2NDEzMyw3IEBACiAgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlQ3Vyc29yIgogIHN0YXRpYz0iZmFsc2UiCiAgZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPHBhcmFtZXRlciBuYW1lPSJkYiIgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2UiPgpAQCAtNTc0OTYsNiArNjQxNDUsMjAgQEAKIDxwYXJhbWV0ZXIgbmFtZT0icXVlcnkiIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZVF1ZXJ5Ij4KIDwvcGFyYW1ldGVyPgogPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxpdGVDdXJzb3IiCisgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlQ3Vyc29yIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZHJpdmVyIiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVDdXJzb3JEcml2ZXIiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImVkaXRUYWJsZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0icXVlcnkiIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZVF1ZXJ5Ij4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KIDxtZXRob2QgbmFtZT0iZ2V0Q29sdW1uTmFtZXMiCiAgcmV0dXJuPSJqYXZhLmxhbmcuU3RyaW5nW10iCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtNTc2MzMsNiArNjQyOTYsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iYmVnaW5UcmFuc2FjdGlvbk5vbkV4Y2x1c2l2ZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iYmVnaW5UcmFuc2FjdGlvbldpdGhMaXN0ZW5lciIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtNTc2NDYsNiArNjQzMjAsMTkgQEAKIDxwYXJhbWV0ZXIgbmFtZT0idHJhbnNhY3Rpb25MaXN0ZW5lciIgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlVHJhbnNhY3Rpb25MaXN0ZW5lciI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJiZWdpblRyYW5zYWN0aW9uV2l0aExpc3RlbmVyTm9uRXhjbHVzaXZlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idHJhbnNhY3Rpb25MaXN0ZW5lciIgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlVHJhbnNhY3Rpb25MaXN0ZW5lciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJjbG9zZSIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtNTc3MDIsNiArNjQzODksMTcgQEAKIDxwYXJhbWV0ZXIgbmFtZT0id2hlcmVBcmdzIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nW10iPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZW5hYmxlV3JpdGVBaGVhZExvZ2dpbmciCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0idHJ1ZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZW5kVHJhbnNhY3Rpb24iCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTU3NzU4LDYgKzY0NDU2LDE3IEBACiA8cGFyYW1ldGVyIG5hbWU9InRhYmxlcyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRBdHRhY2hlZERicyIKKyByZXR1cm49ImphdmEudXRpbC5BcnJheUxpc3QmbHQ7YW5kcm9pZC51dGlsLlBhaXImbHQ7amF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZyZndDsmZ3Q7IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldE1heGltdW1TaXplIgogIHJldHVybj0ibG9uZyIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC01Nzc5OCw3ICs2NDUwNyw3IEBACiAgc3luY2hyb25pemVkPSJmYWxzZSIKICBzdGF0aWM9ImZhbHNlIgogIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgpAQCAtNTc4NzksNiArNjQ1ODgsMTcgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iY29uZmxpY3RBbGdvcml0aG0iIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpc0RhdGFiYXNlSW50ZWdyaXR5T2siCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImlzRGJMb2NrZWRCeUN1cnJlbnRUaHJlYWQiCiAgcmV0dXJuPSJib29sZWFuIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTU3OTMwLDcgKzY0NjUwLDcgQEAKICBzeW5jaHJvbml6ZWQ9ImZhbHNlIgogIHN0YXRpYz0iZmFsc2UiCiAgZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPHBhcmFtZXRlciBuYW1lPSJ0YWJsZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+CkBAIC01Nzk0NSw3ICs2NDY2NSw3IEBACiAgc3luY2hyb25pemVkPSJmYWxzZSIKICBzdGF0aWM9ImZhbHNlIgogIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDxwYXJhbWV0ZXIgbmFtZT0idGFibGUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgpAQCAtNTc5OTYsNiArNjQ3MTYsMjUgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iZmxhZ3MiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvcGVuRGF0YWJhc2UiCisgcmV0dXJuPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwYXRoIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJmYWN0b3J5IiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZS5DdXJzb3JGYWN0b3J5Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJmbGFncyIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJlcnJvckhhbmRsZXIiIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2UuRGF0YWJhc2VFcnJvckhhbmRsZXIiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ib3Blbk9yQ3JlYXRlRGF0YWJhc2UiCiAgcmV0dXJuPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZSIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC01ODAyNiw2ICs2NDc2NSwyMyBAQAogPHBhcmFtZXRlciBuYW1lPSJmYWN0b3J5IiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZS5DdXJzb3JGYWN0b3J5Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9wZW5PckNyZWF0ZURhdGFiYXNlIgorIHJldHVybj0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2UiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icGF0aCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZmFjdG9yeSIgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2UuQ3Vyc29yRmFjdG9yeSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZXJyb3JIYW5kbGVyIiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLkRhdGFiYXNlRXJyb3JIYW5kbGVyIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InF1ZXJ5IgogIHJldHVybj0iYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtNTgyMTksNiArNjQ5NzUsMTkgQEAKIDxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLlNRTEV4Y2VwdGlvbiI+CiA8L2V4Y2VwdGlvbj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRDb25uZWN0aW9uUG9vbFNpemUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0idHJ1ZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InNpemUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXRMb2NhbGUiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTU4MjQ1LDYgKzY1MDE0LDE5IEBACiA8cGFyYW1ldGVyIG5hbWU9ImxvY2tpbmdFbmFibGVkIiB0eXBlPSJib29sZWFuIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldE1heFNxbENhY2hlU2l6ZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJ0cnVlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY2FjaGVTaXplIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0TWF4aW11bVNpemUiCiAgcmV0dXJuPSJsb25nIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTU4NDQ3LDYgKzY1MjI5LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJNQVhfU1FMX0NBQ0hFX1NJWkUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxMDAiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iTk9fTE9DQUxJWkVEX0NPTExBVE9SUyIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTU4NTQ2LDYgKzY1MzM5LDYwIEBACiA8L3BhcmFtZXRlcj4KIDwvY29uc3RydWN0b3I+CiA8L2NsYXNzPgorPGNsYXNzIG5hbWU9IlNRTGl0ZURhdGFiYXNlTG9ja2VkRXhjZXB0aW9uIgorIGV4dGVuZHM9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZUV4Y2VwdGlvbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTGl0ZURhdGFiYXNlTG9ja2VkRXhjZXB0aW9uIgorIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlTG9ja2VkRXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMaXRlRGF0YWJhc2VMb2NrZWRFeGNlcHRpb24iCisgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2VMb2NrZWRFeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJlcnJvciIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8L2NsYXNzPgorPGNsYXNzIG5hbWU9IlNRTGl0ZURhdGF0eXBlTWlzbWF0Y2hFeGNlcHRpb24iCisgZXh0ZW5kcz0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRXhjZXB0aW9uIgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMaXRlRGF0YXR5cGVNaXNtYXRjaEV4Y2VwdGlvbiIKKyB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhdHlwZU1pc21hdGNoRXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMaXRlRGF0YXR5cGVNaXNtYXRjaEV4Y2VwdGlvbiIKKyB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhdHlwZU1pc21hdGNoRXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZXJyb3IiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPC9jbGFzcz4KIDxjbGFzcyBuYW1lPSJTUUxpdGVEaXNrSU9FeGNlcHRpb24iCiAgZXh0ZW5kcz0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRXhjZXB0aW9uIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTU4NzA1LDYgKzY1NTUyLDI0IEBACiA8cGFyYW1ldGVyIG5hbWU9InZlcnNpb24iIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KIDwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMaXRlT3BlbkhlbHBlciIKKyB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVPcGVuSGVscGVyIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImZhY3RvcnkiIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlLkN1cnNvckZhY3RvcnkiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InZlcnNpb24iIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZXJyb3JIYW5kbGVyIiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLkRhdGFiYXNlRXJyb3JIYW5kbGVyIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KIDxtZXRob2QgbmFtZT0iY2xvc2UiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTU4NzgyLDYgKzY1NjQ3LDMzIEBACiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgogPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJTUUxpdGVPdXRPZk1lbW9yeUV4Y2VwdGlvbiIKKyBleHRlbmRzPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVFeGNlcHRpb24iCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxpdGVPdXRPZk1lbW9yeUV4Y2VwdGlvbiIKKyB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVPdXRPZk1lbW9yeUV4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTGl0ZU91dE9mTWVtb3J5RXhjZXB0aW9uIgorIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZU91dE9mTWVtb3J5RXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZXJyb3IiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPC9jbGFzcz4KIDxjbGFzcyBuYW1lPSJTUUxpdGVQcm9ncmFtIgogIGV4dGVuZHM9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZUNsb3NhYmxlIgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtNTg3OTAsNiArNjU2ODIsMTkgQEAKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Cis8bWV0aG9kIG5hbWU9ImJpbmRBbGxBcmdzQXNTdHJpbmdzIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYmluZEFyZ3MiIHR5cGU9ImphdmEubGFuZy5TdHJpbmdbXSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJiaW5kQmxvYiIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtNTg5MDcsNyArNjU4MTIsNyBAQAogIHN5bmNocm9uaXplZD0iZmFsc2UiCiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0idHJ1ZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgpAQCAtNTkzMzAsNiArNjYyMzUsMzMgQEAKIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+CiA8L2NsYXNzPgorPGNsYXNzIG5hbWU9IlNRTGl0ZVJlYWRPbmx5RGF0YWJhc2VFeGNlcHRpb24iCisgZXh0ZW5kcz0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRXhjZXB0aW9uIgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMaXRlUmVhZE9ubHlEYXRhYmFzZUV4Y2VwdGlvbiIKKyB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVSZWFkT25seURhdGFiYXNlRXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMaXRlUmVhZE9ubHlEYXRhYmFzZUV4Y2VwdGlvbiIKKyB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVSZWFkT25seURhdGFiYXNlRXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZXJyb3IiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPC9jbGFzcz4KIDxjbGFzcyBuYW1lPSJTUUxpdGVTdGF0ZW1lbnQiCiAgZXh0ZW5kcz0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlUHJvZ3JhbSIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC01OTM2MCw2ICs2NjI5MiwyOCBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJleGVjdXRlVXBkYXRlRGVsZXRlIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNpbXBsZVF1ZXJ5Rm9yQmxvYkZpbGVEZXNjcmlwdG9yIgorIHJldHVybj0iYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzaW1wbGVRdWVyeUZvckxvbmciCiAgcmV0dXJuPSJsb25nIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTU5MzgzLDYgKzY2MzM3LDMzIEBACiA+CiA8L21ldGhvZD4KIDwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iU1FMaXRlVGFibGVMb2NrZWRFeGNlcHRpb24iCisgZXh0ZW5kcz0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRXhjZXB0aW9uIgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMaXRlVGFibGVMb2NrZWRFeGNlcHRpb24iCisgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlVGFibGVMb2NrZWRFeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxpdGVUYWJsZUxvY2tlZEV4Y2VwdGlvbiIKKyB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVUYWJsZUxvY2tlZEV4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImVycm9yIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzwvY2xhc3M+CiA8aW50ZXJmYWNlIG5hbWU9IlNRTGl0ZVRyYW5zYWN0aW9uTGlzdGVuZXIiCiAgYWJzdHJhY3Q9InRydWUiCiAgc3RhdGljPSJmYWxzZSIKQEAgLTYyNTgwLDE2ICs2OTU2MSw2IEBACiA8cGFyYW1ldGVyIG5hbWU9ImJpdG1hcCIgdHlwZT0iYW5kcm9pZC5ncmFwaGljcy5CaXRtYXAiPgogPC9wYXJhbWV0ZXI+CiA8L2NvbnN0cnVjdG9yPgotPGNvbnN0cnVjdG9yIG5hbWU9IkNhbnZhcyIKLSB0eXBlPSJhbmRyb2lkLmdyYXBoaWNzLkNhbnZhcyIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9ImdsIiB0eXBlPSJqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5vcGVuZ2xlcy5HTCI+Ci08L3BhcmFtZXRlcj4KLTwvY29uc3RydWN0b3I+CiA8bWV0aG9kIG5hbWU9ImNsaXBQYXRoIgogIHJldHVybj0iYm9vbGVhbiIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC02MzM2Myw3ICs3MDMzNCw3IEBACiA8bWV0aG9kIG5hbWU9ImRyYXdUZXh0IgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCiAgc3luY2hyb25pemVkPSJmYWxzZSIKICBzdGF0aWM9ImZhbHNlIgogIGZpbmFsPSJmYWxzZSIKQEAgLTYzNTA2LDE3ICs3MDQ3Nyw2IEBACiA8cGFyYW1ldGVyIG5hbWU9InBhaW50IiB0eXBlPSJhbmRyb2lkLmdyYXBoaWNzLlBhaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9ImZyZWVHbENhY2hlcyIKLSByZXR1cm49InZvaWQiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9InRydWUiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRDbGlwQm91bmRzIgogIHJldHVybj0iYm9vbGVhbiIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC02MzU3MCw4ICs3MDUzMCw4IEBACiAgc3luY2hyb25pemVkPSJmYWxzZSIKICBzdGF0aWM9ImZhbHNlIgogIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiCiA+CiA8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0SGVpZ2h0IgpAQCAtNjM2MzEsNiArNzA1OTEsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaXNIYXJkd2FyZUFjY2VsZXJhdGVkIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJpc09wYXF1ZSIKICByZXR1cm49ImJvb2xlYW4iCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtNjM5MzcsMjEgKzcwOTA4LDYgQEAKIDxwYXJhbWV0ZXIgbmFtZT0ibWF0cml4IiB0eXBlPSJhbmRyb2lkLmdyYXBoaWNzLk1hdHJpeCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJzZXRWaWV3cG9ydCIKLSByZXR1cm49InZvaWQiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9IndpZHRoIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9ImhlaWdodCIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNrZXciCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTY3MzQ5LDcgKzc0MzA1LDcgQEAKIDxtZXRob2QgbmFtZT0ic2V0U2hhZG93TGF5ZXIiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKICBzeW5jaHJvbml6ZWQ9ImZhbHNlIgogIHN0YXRpYz0iZmFsc2UiCiAgZmluYWw9ImZhbHNlIgpAQCAtNzMzMTYsNiArODAyNzIsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iY29tcHV0ZUNvbnN0YW50U2l6ZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0Q2hhbmdpbmdDb25maWd1cmF0aW9ucyIKICByZXR1cm49ImludCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC03NDIxMCw2ICs4MTE3NywzNiBAQAogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KIDwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iTWlwbWFwRHJhd2FibGUiCisgZXh0ZW5kcz0iYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZUNvbnRhaW5lciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9Ik1pcG1hcERyYXdhYmxlIgorIHR5cGU9ImFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuTWlwbWFwRHJhd2FibGUiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0iYWRkRHJhd2FibGUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJkcmF3YWJsZSIgdHlwZT0iYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPC9jbGFzcz4KIDxjbGFzcyBuYW1lPSJOaW5lUGF0Y2hEcmF3YWJsZSIKICBleHRlbmRzPSJhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTc4NTA3LDcgKzg1NTA0LDcgQEAKICB0eXBlPSJmbG9hdCIKICB0cmFuc2llbnQ9ImZhbHNlIgogIHZvbGF0aWxlPSJmYWxzZSIKLSB2YWx1ZT0iMC4wMDEwZiIKKyB2YWx1ZT0iMC4wMDFmIgogIHN0YXRpYz0idHJ1ZSIKICBmaW5hbD0idHJ1ZSIKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKQEAgLTgwMzg5LDYgKzg3Mzg2LDI0IEBACiA8L3BhcmFtZXRlcj4KIDxwYXJhbWV0ZXIgbmFtZT0ibW9kZUlkIiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9IndpZHRoIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImhlaWdodCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJLZXlib2FyZCIKKyB0eXBlPSJhbmRyb2lkLmlucHV0bWV0aG9kc2VydmljZS5LZXlib2FyZCIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ4bWxMYXlvdXRSZXNJZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJtb2RlSWQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KIDwvY29uc3RydWN0b3I+CiA8Y29uc3RydWN0b3IgbmFtZT0iS2V5Ym9hcmQiCiAgdHlwZT0iYW5kcm9pZC5pbnB1dG1ldGhvZHNlcnZpY2UuS2V5Ym9hcmQiCkBAIC05MjIwOSw2ICs5OTIyNCwyNSBAQAogPHBhcmFtZXRlciBuYW1lPSJwcm9maWxlIiB0eXBlPSJhbmRyb2lkLm1lZGlhLkNhbWNvcmRlclByb2ZpbGUiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0VGltZUxhcHNlUGFyYW1ldGVycyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImVuYWJsZVRpbWVMYXBzZSIgdHlwZT0iYm9vbGVhbiI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idXNlU3RpbGxDYW1lcmFGb3JUaW1lTGFwc2UiIHR5cGU9ImJvb2xlYW4iPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InRpbWVCZXR3ZWVuVGltZUxhcHNlRnJhbWVDYXB0dXJlTXMiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZW5jb2RlckxldmVsIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0VmlkZW9FbmNvZGVyIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC05ODE5Myw2ICsxMDUyMjcsMjEgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0Qm9vbGVhblF1ZXJ5UGFyYW1ldGVyIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ia2V5IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJkZWZhdWx0VmFsdWUiIHR5cGU9ImJvb2xlYW4iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0RW5jb2RlZEF1dGhvcml0eSIKICByZXR1cm49ImphdmEubGFuZy5TdHJpbmciCiAgYWJzdHJhY3Q9InRydWUiCkBAIC0xMjE3MjQsNiArMTI4NzczLDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJIT05FWUNPTUIiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxMDAwMCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDwvY2xhc3M+CiA8Y2xhc3MgbmFtZT0iQnVuZGxlIgogIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCkBAIC0xMjc3NTksNiArMTM0ODE5LDE5IEBACiA8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KIDwvZXhjZXB0aW9uPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImNyZWF0ZVBpcGUiCisgcmV0dXJuPSJhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yW10iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxleGNlcHRpb24gbmFtZT0iSU9FeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uSU9FeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZGVzY3JpYmVDb250ZW50cyIKICByZXR1cm49ImludCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xMjc3NzAsNiArMTM0ODQzLDIzIEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImZyb21EYXRhIgorIHJldHVybj0iYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJkYXRhIiB0eXBlPSJieXRlW10iPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImZyb21Tb2NrZXQiCiAgcmV0dXJuPSJhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTEyOTY2OSw2ICsxMzY3NTksNTMgQEAKIDwvcGFja2FnZT4KIDxwYWNrYWdlIG5hbWU9ImFuZHJvaWQub3Muc3RvcmFnZSIKID4KKzxjbGFzcyBuYW1lPSJTdG9yYWdlRXZlbnRMaXN0ZW5lciIKKyBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTdG9yYWdlRXZlbnRMaXN0ZW5lciIKKyB0eXBlPSJhbmRyb2lkLm9zLnN0b3JhZ2UuU3RvcmFnZUV2ZW50TGlzdGVuZXIiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0ib25TdG9yYWdlU3RhdGVDaGFuZ2VkIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icGF0aCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ib2xkU3RhdGUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im5ld1N0YXRlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uVXNiTWFzc1N0b3JhZ2VDb25uZWN0aW9uQ2hhbmdlZCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbm5lY3RlZCIgdHlwZT0iYm9vbGVhbiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPC9jbGFzcz4KIDxjbGFzcyBuYW1lPSJTdG9yYWdlTWFuYWdlciIKICBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTEyOTY3Nyw2ICsxMzY4MTQsMjggQEAKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Cis8bWV0aG9kIG5hbWU9ImRpc2FibGVVc2JNYXNzU3RvcmFnZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZW5hYmxlVXNiTWFzc1N0b3JhZ2UiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldE1vdW50ZWRPYmJQYXRoIgogIHJldHVybj0iamF2YS5sYW5nLlN0cmluZyIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xMjk3MDUsNiArMTM2ODY0LDI4IEBACiA8ZXhjZXB0aW9uIG5hbWU9IklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiI+CiA8L2V4Y2VwdGlvbj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpc1VzYk1hc3NTdG9yYWdlQ29ubmVjdGVkIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpc1VzYk1hc3NTdG9yYWdlRW5hYmxlZCIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ibW91bnRPYmIiCiAgcmV0dXJuPSJib29sZWFuIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTEyOTcyMCw2ICsxMzY5MDEsMTkgQEAKIDxwYXJhbWV0ZXIgbmFtZT0ia2V5IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InJlZ2lzdGVyTGlzdGVuZXIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJsaXN0ZW5lciIgdHlwZT0iYW5kcm9pZC5vcy5zdG9yYWdlLlN0b3JhZ2VFdmVudExpc3RlbmVyIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InVubW91bnRPYmIiCiAgcmV0dXJuPSJib29sZWFuIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTEyOTczNyw2ICsxMzY5MzEsMTI0IEBACiA8ZXhjZXB0aW9uIG5hbWU9IklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiI+CiA8L2V4Y2VwdGlvbj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJ1bnJlZ2lzdGVyTGlzdGVuZXIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJsaXN0ZW5lciIgdHlwZT0iYW5kcm9pZC5vcy5zdG9yYWdlLlN0b3JhZ2VFdmVudExpc3RlbmVyIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2NsYXNzPgorPGNsYXNzIG5hbWU9IlN0b3JhZ2VSZXN1bHRDb2RlIgorIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTdG9yYWdlUmVzdWx0Q29kZSIKKyB0eXBlPSJhbmRyb2lkLm9zLnN0b3JhZ2UuU3RvcmFnZVJlc3VsdENvZGUiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9jb25zdHJ1Y3Rvcj4KKzxmaWVsZCBuYW1lPSJPcGVyYXRpb25GYWlsZWRJbnRlcm5hbEVycm9yIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iLTEiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iT3BlcmF0aW9uRmFpbGVkTWVkaWFCbGFuayIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9Ii0zIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9Ik9wZXJhdGlvbkZhaWxlZE1lZGlhQ29ycnVwdCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9Ii00IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9Ik9wZXJhdGlvbkZhaWxlZE5vTWVkaWEiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSItMiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJPcGVyYXRpb25GYWlsZWRTdG9yYWdlQnVzeSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9Ii03IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9Ik9wZXJhdGlvbkZhaWxlZFN0b3JhZ2VNb3VudGVkIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iLTYiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iT3BlcmF0aW9uRmFpbGVkU3RvcmFnZU5vdE1vdW50ZWQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSItNSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJPcGVyYXRpb25TdWNjZWVkZWQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIwIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPC9jbGFzcz4KIDwvcGFja2FnZT4KIDxwYWNrYWdlIG5hbWU9ImFuZHJvaWQucHJlZmVyZW5jZSIKQEAgLTEzMDUzMiw2ICsxMzc4NDQsMTQ4IEBACiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgogPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJNdWx0aVNlbGVjdExpc3RQcmVmZXJlbmNlIgorIGV4dGVuZHM9ImFuZHJvaWQucHJlZmVyZW5jZS5EaWFsb2dQcmVmZXJlbmNlIgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iTXVsdGlTZWxlY3RMaXN0UHJlZmVyZW5jZSIKKyB0eXBlPSJhbmRyb2lkLnByZWZlcmVuY2UuTXVsdGlTZWxlY3RMaXN0UHJlZmVyZW5jZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJhdHRycyIgdHlwZT0iYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iTXVsdGlTZWxlY3RMaXN0UHJlZmVyZW5jZSIKKyB0eXBlPSJhbmRyb2lkLnByZWZlcmVuY2UuTXVsdGlTZWxlY3RMaXN0UHJlZmVyZW5jZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0iZmluZEluZGV4T2ZWYWx1ZSIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0RW50cmllcyIKKyByZXR1cm49ImphdmEubGFuZy5DaGFyU2VxdWVuY2VbXSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRFbnRyeVZhbHVlcyIKKyByZXR1cm49ImphdmEubGFuZy5DaGFyU2VxdWVuY2VbXSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRWYWx1ZXMiCisgcmV0dXJuPSJqYXZhLnV0aWwuU2V0Jmx0O2phdmEubGFuZy5TdHJpbmcmZ3Q7IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEVudHJpZXMiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJlbnRyaWVzIiB0eXBlPSJqYXZhLmxhbmcuQ2hhclNlcXVlbmNlW10iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0RW50cmllcyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImVudHJpZXNSZXNJZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEVudHJ5VmFsdWVzIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZW50cnlWYWx1ZXMiIHR5cGU9ImphdmEubGFuZy5DaGFyU2VxdWVuY2VbXSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRFbnRyeVZhbHVlcyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImVudHJ5VmFsdWVzUmVzSWQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRWYWx1ZXMiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZXMiIHR5cGU9ImphdmEudXRpbC5TZXQmbHQ7amF2YS5sYW5nLlN0cmluZyZndDsiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvY2xhc3M+CiA8Y2xhc3MgbmFtZT0iUHJlZmVyZW5jZSIKICBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTEzMDY1MCw2ICsxMzgxMDQsMjggQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0RXh0cmFzIgorIHJldHVybj0iYW5kcm9pZC5vcy5CdW5kbGUiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0RnJhZ21lbnQiCisgcmV0dXJuPSJqYXZhLmxhbmcuU3RyaW5nIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldEludGVudCIKICByZXR1cm49ImFuZHJvaWQuY29udGVudC5JbnRlbnQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTMxMDgyLDYgKzEzODU1OCwxNyBAQAogPHBhcmFtZXRlciBuYW1lPSJkZWZhdWx0VmFsdWUiIHR5cGU9ImphdmEubGFuZy5PYmplY3QiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icGVla0V4dHJhcyIKKyByZXR1cm49ImFuZHJvaWQub3MuQnVuZGxlIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InBlcnNpc3RCb29sZWFuIgogIHJldHVybj0iYm9vbGVhbiIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xMzEyMTIsNiArMTM4Njk5LDE5IEBACiA8cGFyYW1ldGVyIG5hbWU9ImVuYWJsZWQiIHR5cGU9ImJvb2xlYW4iPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0RnJhZ21lbnQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJmcmFnbWVudCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXRJbnRlbnQiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTEzMTUzMCw2ICsxMzkwMzAsOCBAQAogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KKzxpbXBsZW1lbnRzIG5hbWU9ImFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlRnJhZ21lbnQuT25QcmVmZXJlbmNlU3RhcnRGcmFnbWVudENhbGxiYWNrIj4KKzwvaW1wbGVtZW50cz4KIDxjb25zdHJ1Y3RvciBuYW1lPSJQcmVmZXJlbmNlQWN0aXZpdHkiCiAgdHlwZT0iYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2VBY3Rpdml0eSIKICBzdGF0aWM9ImZhbHNlIgpAQCAtMTMxNTQ1LDYgKzEzOTA0Nyw0MjEgQEAKICBzeW5jaHJvbml6ZWQ9ImZhbHNlIgogIHN0YXRpYz0iZmFsc2UiCiAgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJpbnRlbnQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5JbnRlbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iYWRkUHJlZmVyZW5jZXNGcm9tUmVzb3VyY2UiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InByZWZlcmVuY2VzUmVzSWQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJmaW5kUHJlZmVyZW5jZSIKKyByZXR1cm49ImFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImtleSIgdHlwZT0iamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRQcmVmZXJlbmNlTWFuYWdlciIKKyByZXR1cm49ImFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlTWFuYWdlciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFByZWZlcmVuY2VTY3JlZW4iCisgcmV0dXJuPSJhbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZVNjcmVlbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Imhhc0hlYWRlcnMiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImludmFsaWRhdGVIZWFkZXJzIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpc011bHRpUGFuZSIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ibG9hZEhlYWRlcnNGcm9tUmVzb3VyY2UiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJyZXNpZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ0YXJnZXQiIHR5cGU9ImphdmEudXRpbC5MaXN0Jmx0O2FuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlQWN0aXZpdHkuSGVhZGVyJmd0OyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbkJ1aWxkSGVhZGVycyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InRhcmdldCIgdHlwZT0iamF2YS51dGlsLkxpc3QmbHQ7YW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2VBY3Rpdml0eS5IZWFkZXImZ3Q7Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uR2V0SW5pdGlhbEhlYWRlciIKKyByZXR1cm49ImFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlQWN0aXZpdHkuSGVhZGVyIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uSGVhZGVyQ2xpY2siCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJoZWFkZXIiIHR5cGU9ImFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlQWN0aXZpdHkuSGVhZGVyIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJwb3NpdGlvbiIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uSXNIaWRpbmdIZWFkZXJzIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbklzTXVsdGlQYW5lIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvblByZWZlcmVuY2VTdGFydEZyYWdtZW50IgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY2FsbGVyIiB0eXBlPSJhbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZUZyYWdtZW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJwcmVmIiB0eXBlPSJhbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvblByZWZlcmVuY2VUcmVlQ2xpY2siCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InByZWZlcmVuY2VTY3JlZW4iIHR5cGU9ImFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlU2NyZWVuIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJwcmVmZXJlbmNlIiB0eXBlPSJhbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRQcmVmZXJlbmNlU2NyZWVuIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwcmVmZXJlbmNlU2NyZWVuIiB0eXBlPSJhbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZVNjcmVlbiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzdGFydFdpdGhGcmFnbWVudCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImZyYWdtZW50TmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iYXJncyIgdHlwZT0iYW5kcm9pZC5vcy5CdW5kbGUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic3dpdGNoVG9IZWFkZXIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJmcmFnbWVudE5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImFyZ3MiIHR5cGU9ImFuZHJvaWQub3MuQnVuZGxlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8ZmllbGQgbmFtZT0iRVhUUkFfTk9fSEVBREVSUyIKKyB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSImcXVvdDs6YW5kcm9pZDpub19oZWFkZXJzJnF1b3Q7IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkVYVFJBX1NIT1dfRlJBR01FTlQiCisgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iJnF1b3Q7OmFuZHJvaWQ6c2hvd19mcmFnbWVudCZxdW90OyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJFWFRSQV9TSE9XX0ZSQUdNRU5UX0FSR1VNRU5UUyIKKyB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSImcXVvdDs6YW5kcm9pZDpzaG93X2ZyYWdtZW50X2FyZ3MmcXVvdDsiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8L2NsYXNzPgorPGNsYXNzIG5hbWU9IlByZWZlcmVuY2VBY3Rpdml0eS5IZWFkZXIiCisgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iUHJlZmVyZW5jZUFjdGl2aXR5LkhlYWRlciIKKyB0eXBlPSJhbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZUFjdGl2aXR5LkhlYWRlciIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2NvbnN0cnVjdG9yPgorPGZpZWxkIG5hbWU9ImZyYWdtZW50IgorIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJmcmFnbWVudEFyZ3VtZW50cyIKKyB0eXBlPSJhbmRyb2lkLm9zLkJ1bmRsZSIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9Imljb24iCisgdHlwZT0iYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9Imljb25SZXMiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0ic3VtbWFyeSIKKyB0eXBlPSJqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0idGl0bGUiCisgdHlwZT0iamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJQcmVmZXJlbmNlQ2F0ZWdvcnkiCisgZXh0ZW5kcz0iYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2VHcm91cCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9IlByZWZlcmVuY2VDYXRlZ29yeSIKKyB0eXBlPSJhbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZUNhdGVnb3J5IgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImF0dHJzIiB0eXBlPSJhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJkZWZTdHlsZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJQcmVmZXJlbmNlQ2F0ZWdvcnkiCisgdHlwZT0iYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2VDYXRlZ29yeSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJhdHRycyIgdHlwZT0iYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iUHJlZmVyZW5jZUNhdGVnb3J5IgorIHR5cGU9ImFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlQ2F0ZWdvcnkiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8L2NsYXNzPgorPGNsYXNzIG5hbWU9IlByZWZlcmVuY2VGcmFnbWVudCIKKyBleHRlbmRzPSJhbmRyb2lkLmFwcC5GcmFnbWVudCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iUHJlZmVyZW5jZUZyYWdtZW50IgorIHR5cGU9ImFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlRnJhZ21lbnQiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0iYWRkUHJlZmVyZW5jZXNGcm9tSW50ZW50IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KQEAgLTEzMTYyOCw1MSArMTM5NTQ1LDI5IEBACiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgogPC9jbGFzcz4KLTxjbGFzcyBuYW1lPSJQcmVmZXJlbmNlQ2F0ZWdvcnkiCi0gZXh0ZW5kcz0iYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2VHcm91cCIKLSBhYnN0cmFjdD0iZmFsc2UiCis8aW50ZXJmYWNlIG5hbWU9IlByZWZlcmVuY2VGcmFnbWVudC5PblByZWZlcmVuY2VTdGFydEZyYWdtZW50Q2FsbGJhY2siCisgYWJzdHJhY3Q9InRydWUiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8bWV0aG9kIG5hbWU9Im9uUHJlZmVyZW5jZVN0YXJ0RnJhZ21lbnQiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKICBzdGF0aWM9ImZhbHNlIgogIGZpbmFsPSJmYWxzZSIKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Ci08Y29uc3RydWN0b3IgbmFtZT0iUHJlZmVyZW5jZUNhdGVnb3J5IgotIHR5cGU9ImFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlQ2F0ZWdvcnkiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+Cis8cGFyYW1ldGVyIG5hbWU9ImNhbGxlciIgdHlwZT0iYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2VGcmFnbWVudCI+CiA8L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0iYXR0cnMiIHR5cGU9ImFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQiPgorPHBhcmFtZXRlciBuYW1lPSJwcmVmIiB0eXBlPSJhbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZSI+CiA8L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0iZGVmU3R5bGUiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTwvY29uc3RydWN0b3I+Ci08Y29uc3RydWN0b3IgbmFtZT0iUHJlZmVyZW5jZUNhdGVnb3J5IgotIHR5cGU9ImFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlQ2F0ZWdvcnkiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0iYXR0cnMiIHR5cGU9ImFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQiPgotPC9wYXJhbWV0ZXI+Ci08L2NvbnN0cnVjdG9yPgotPGNvbnN0cnVjdG9yIG5hbWU9IlByZWZlcmVuY2VDYXRlZ29yeSIKLSB0eXBlPSJhbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZUNhdGVnb3J5IgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgotPC9wYXJhbWV0ZXI+Ci08L2NvbnN0cnVjdG9yPgotPC9jbGFzcz4KKzwvbWV0aG9kPgorPC9pbnRlcmZhY2U+CiA8Y2xhc3MgbmFtZT0iUHJlZmVyZW5jZUdyb3VwIgogIGV4dGVuZHM9ImFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlIgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMTMyNTcyLDkgKzE0MDQ2Nyw5IEBACiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgotPHBhcmFtZXRlciBuYW1lPSJjIiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KIDwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJzIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzxwYXJhbWV0ZXIgbmFtZT0ic3RyaW5nIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InRydW5jYXRlSGlzdG9yeSIKQEAgLTEzMjk1OCw3ICsxNDA4NTMsNyBAQAogIHZhbHVlPSImcXVvdDt1cmwmcXVvdDsiCiAgc3RhdGljPSJ0cnVlIgogIGZpbmFsPSJ0cnVlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KQEAgLTEzNjAxNyw2ICsxNDM5MTIsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkRJUkVDVE9SWV9QQVJBTV9LRVkiCisgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iJnF1b3Q7ZGlyZWN0b3J5JnF1b3Q7IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPC9jbGFzcz4KIDxjbGFzcyBuYW1lPSJDb250YWN0c0NvbnRyYWN0LkFnZ3JlZ2F0aW9uRXhjZXB0aW9ucyIKICBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgpAQCAtMTM2MjkyLDYgKzE0NDE5OCwxNyBAQAogPHBhcmFtZXRlciBuYW1lPSJ0eXBlIiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxmaWVsZCBuYW1lPSJBRERSRVNTIgorIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IiZxdW90O2RhdGExJnF1b3Q7IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9IkNPTlRFTlRfRklMVEVSX1VSSSIKICB0eXBlPSJhbmRyb2lkLm5ldC5VcmkiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTEzODQzMSw2ICsxNDYzNDgsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlBIT1RPIgorIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IiZxdW90O2RhdGExNSZxdW90OyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDwvY2xhc3M+CiA8aW50ZXJmYWNlIG5hbWU9IkNvbnRhY3RzQ29udHJhY3QuQ29udGFjdHNDb2x1bW5zIgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMTM4NzM2LDYgKzE0NjY2NCwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iSVNfUkVBRF9PTkxZIgorIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IiZxdW90O2lzX3JlYWRfb25seSZxdW90OyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJJU19TVVBFUl9QUklNQVJZIgogIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTEzODgzNiw2ICsxNDY3NzUsMjM4IEBACiA8aW1wbGVtZW50cyBuYW1lPSJhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuU3RhdHVzQ29sdW1ucyI+CiA8L2ltcGxlbWVudHM+CiA8L2ludGVyZmFjZT4KKzxjbGFzcyBuYW1lPSJDb250YWN0c0NvbnRyYWN0LkRpcmVjdG9yeSIKKyBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGltcGxlbWVudHMgbmFtZT0iYW5kcm9pZC5wcm92aWRlci5CYXNlQ29sdW1ucyI+Cis8L2ltcGxlbWVudHM+Cis8bWV0aG9kIG5hbWU9Im5vdGlmeURpcmVjdG9yeUNoYW5nZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icmVzb2x2ZXIiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXIiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxmaWVsZCBuYW1lPSJBQ0NPVU5UX05BTUUiCisgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iJnF1b3Q7YWNjb3VudE5hbWUmcXVvdDsiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iQUNDT1VOVF9UWVBFIgorIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IiZxdW90O2FjY291bnRUeXBlJnF1b3Q7IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkNPTlRFTlRfSVRFTV9UWVBFIgorIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IiZxdW90O3ZuZC5hbmRyb2lkLmN1cnNvci5pdGVtL2NvbnRhY3RfZGlyZWN0b3J5JnF1b3Q7IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkNPTlRFTlRfVFlQRSIKKyB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSImcXVvdDt2bmQuYW5kcm9pZC5jdXJzb3IuZGlyL2NvbnRhY3RfZGlyZWN0b3JpZXMmcXVvdDsiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iQ09OVEVOVF9VUkkiCisgdHlwZT0iYW5kcm9pZC5uZXQuVXJpIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkRFRkFVTFQiCisgdHlwZT0ibG9uZyIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMEwiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iRElSRUNUT1JZX0FVVEhPUklUWSIKKyB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSImcXVvdDthdXRob3JpdHkmcXVvdDsiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iRElTUExBWV9OQU1FIgorIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IiZxdW90O2Rpc3BsYXlOYW1lJnF1b3Q7IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkVYUE9SVF9TVVBQT1JUIgorIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IiZxdW90O2V4cG9ydFN1cHBvcnQmcXVvdDsiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iRVhQT1JUX1NVUFBPUlRfQU5ZX0FDQ09VTlQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIyIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkVYUE9SVF9TVVBQT1JUX05PTkUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIwIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkVYUE9SVF9TVVBQT1JUX1NBTUVfQUNDT1VOVF9PTkxZIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJMT0NBTF9JTlZJU0lCTEUiCisgdHlwZT0ibG9uZyIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMUwiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iUEFDS0FHRV9OQU1FIgorIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IiZxdW90O3BhY2thZ2VOYW1lJnF1b3Q7IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlNIT1JUQ1VUX1NVUFBPUlQiCisgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iJnF1b3Q7c2hvcnRjdXRTdXBwb3J0JnF1b3Q7IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlNIT1JUQ1VUX1NVUFBPUlRfREFUQV9JVEVNU19PTkxZIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJTSE9SVENVVF9TVVBQT1JUX0ZVTEwiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIyIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlNIT1JUQ1VUX1NVUFBPUlRfTk9ORSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjAiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iVFlQRV9SRVNPVVJDRV9JRCIKKyB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSImcXVvdDt0eXBlUmVzb3VyY2VJZCZxdW90OyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzwvY2xhc3M+CiA8Y2xhc3MgbmFtZT0iQ29udGFjdHNDb250cmFjdC5Hcm91cHMiCiAgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xMzg5MTMsNiArMTQ3MDg0LDE3IEBACiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHJvdGVjdGVkIgogPgorPGZpZWxkIG5hbWU9IkFVVE9fQUREIgorIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IiZxdW90O2F1dG9fYWRkJnF1b3Q7IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9IkRFTEVURUQiCiAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMTM4OTI0LDYgKzE0NzEwNiwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iRkFWT1JJVEVTIgorIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IiZxdW90O2Zhdm9yaXRlcyZxdW90OyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJHUk9VUF9WSVNJQkxFIgogIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTEzOTg3MCw2ICsxNDgwNjMsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlJBV19DT05UQUNUX0lTX1JFQURfT05MWSIKKyB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSImcXVvdDtyYXdfY29udGFjdF9pc19yZWFkX29ubHkmcXVvdDsiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8L2ludGVyZmFjZT4KIDxjbGFzcyBuYW1lPSJDb250YWN0c0NvbnRyYWN0LlJhd0NvbnRhY3RzRW50aXR5IgogIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCkBAIC0xNDAwODYsMTEgKzE0ODI5MCwxMSBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Ci08ZmllbGQgbmFtZT0iQ0FQQUJJTElUWV9IQVNfVklERU9fUExBWUJBQ0tfT05MWSIKKzxmaWVsZCBuYW1lPSJDQVBBQklMSVRZX0hBU19WSURFTyIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKICB2b2xhdGlsZT0iZmFsc2UiCi0gdmFsdWU9IjEiCisgdmFsdWU9IjIiCiAgc3RhdGljPSJ0cnVlIgogIGZpbmFsPSJ0cnVlIgogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgpAQCAtMTQwMTAxLDcgKzE0ODMwNSw3IEBACiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCiAgdm9sYXRpbGU9ImZhbHNlIgotIHZhbHVlPSIyIgorIHZhbHVlPSIxIgogIHN0YXRpYz0idHJ1ZSIKICBmaW5hbD0idHJ1ZSIKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKQEAgLTE0OTAwNiw3ICsxNTcyMTAsNyBAQAogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KLTxwYXJhbWV0ZXIgbmFtZT0idGV4dCIgdHlwZT0iYW5kcm9pZC50ZXh0LkVkaXRhYmxlIj4KKzxwYXJhbWV0ZXIgbmFtZT0icyIgdHlwZT0iYW5kcm9pZC50ZXh0LkVkaXRhYmxlIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImJlZm9yZVRleHRDaGFuZ2VkIgpAQCAtMTUzODM3LDYgKzE2MjA0MSwzNiBAQAogPgogPC9tZXRob2Q+CiA8L2NsYXNzPgorPGNsYXNzIG5hbWU9IkxvYWRlclRlc3RDYXNlIgorIGV4dGVuZHM9ImFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2UiCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJMb2FkZXJUZXN0Q2FzZSIKKyB0eXBlPSJhbmRyb2lkLnRlc3QuTG9hZGVyVGVzdENhc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0iZ2V0TG9hZGVyUmVzdWx0U3luY2hyb25vdXNseSIKKyByZXR1cm49IlQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImxvYWRlciIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkxvYWRlciZsdDtUJmd0OyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPC9jbGFzcz4KIDxjbGFzcyBuYW1lPSJNb3JlQXNzZXJ0cyIKICBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE1Njc1Nyw2ICsxNjQ5OTEsMjUgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iZmFjdG9yeSIgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2UuQ3Vyc29yRmFjdG9yeSI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvcGVuT3JDcmVhdGVEYXRhYmFzZSIKKyByZXR1cm49ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJmaWxlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJtb2RlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImZhY3RvcnkiIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlLkN1cnNvckZhY3RvcnkiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImVycm9ySGFuZGxlciIgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5EYXRhYmFzZUVycm9ySGFuZGxlciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJwZWVrV2FsbHBhcGVyIgogIHJldHVybj0iYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xNTcxMDEsMTcgKzE2NTM1NCw2IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9jb25zdHJ1Y3Rvcj4KLTxtZXRob2QgbmFtZT0iYWJvcnRVcGRhdGVzIgotIHJldHVybj0idm9pZCIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJjbG9zZSIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTU3MTIzLDMwICsxNjUzNjUsNiBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJjb21taXRVcGRhdGVzIgotIHJldHVybj0iYm9vbGVhbiIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJjb21taXRVcGRhdGVzIgotIHJldHVybj0iYm9vbGVhbiIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0idmFsdWVzIiB0eXBlPSJqYXZhLnV0aWwuTWFwJmx0Oz8gZXh0ZW5kcyBqYXZhLmxhbmcuTG9uZywgPyBleHRlbmRzIGphdmEudXRpbC5NYXAmbHQ7amF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdCZndDsmZ3Q7Ij4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImNvcHlTdHJpbmdUb0J1ZmZlciIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTU3MTczLDE3ICsxNjUzOTEsNiBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJkZWxldGVSb3ciCi0gcmV0dXJuPSJib29sZWFuIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldEJsb2IiCiAgcmV0dXJuPSJieXRlW10iCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTU3MzY5LDggKzE2NTU3Niw4IEBACiA8cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkluZGV4IiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iZ2V0V2FudHNBbGxPbk1vdmVDYWxscyIKLSByZXR1cm49ImJvb2xlYW4iCis8bWV0aG9kIG5hbWU9ImdldFR5cGUiCisgcmV0dXJuPSJpbnQiCiAgYWJzdHJhY3Q9ImZhbHNlIgogIG5hdGl2ZT0iZmFsc2UiCiAgc3luY2hyb25pemVkPSJmYWxzZSIKQEAgLTE1NzM3OSw4ICsxNjU1ODYsMTAgQEAKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkluZGV4IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iaGFzVXBkYXRlcyIKKzxtZXRob2QgbmFtZT0iZ2V0V2FudHNBbGxPbk1vdmVDYWxscyIKICByZXR1cm49ImJvb2xlYW4iCiAgYWJzdHJhY3Q9ImZhbHNlIgogIG5hdGl2ZT0iZmFsc2UiCkBAIC0xNTc1OTQsMTcgKzE2NTgwMyw2IEBACiA8cGFyYW1ldGVyIG5hbWU9InVyaSIgdHlwZT0iYW5kcm9pZC5uZXQuVXJpIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9InN1cHBvcnRzVXBkYXRlcyIKLSByZXR1cm49ImJvb2xlYW4iCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L21ldGhvZD4KIDxtZXRob2QgbmFtZT0idW5yZWdpc3RlckNvbnRlbnRPYnNlcnZlciIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTU3NjMxLDEyNCArMTY1ODI5LDYgQEAKIDxwYXJhbWV0ZXIgbmFtZT0ib2JzZXJ2ZXIiIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2UuRGF0YVNldE9ic2VydmVyIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9InVwZGF0ZUJsb2IiCi0gcmV0dXJuPSJib29sZWFuIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5JbmRleCIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0iYnl0ZVtdIj4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9InVwZGF0ZURvdWJsZSIKLSByZXR1cm49ImJvb2xlYW4iCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkluZGV4IiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJkb3VibGUiPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0idXBkYXRlRmxvYXQiCi0gcmV0dXJuPSJib29sZWFuIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5JbmRleCIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0iZmxvYXQiPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0idXBkYXRlSW50IgotIHJldHVybj0iYm9vbGVhbiIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uSW5kZXgiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJ1cGRhdGVMb25nIgotIHJldHVybj0iYm9vbGVhbiIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uSW5kZXgiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImxvbmciPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0idXBkYXRlU2hvcnQiCi0gcmV0dXJuPSJib29sZWFuIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5JbmRleCIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0ic2hvcnQiPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0idXBkYXRlU3RyaW5nIgotIHJldHVybj0iYm9vbGVhbiIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uSW5kZXgiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0idXBkYXRlVG9OdWxsIgotIHJldHVybj0iYm9vbGVhbiIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uSW5kZXgiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTwvbWV0aG9kPgogPC9jbGFzcz4KIDxjbGFzcyBuYW1lPSJNb2NrRGlhbG9nSW50ZXJmYWNlIgogIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCkBAIC0xNTk4ODQsMTUgKzE2Nzk2NCwyMyBAQAogPC9jbGFzcz4KIDxjbGFzcyBuYW1lPSJDbGlwYm9hcmRNYW5hZ2VyIgogIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCi0gYWJzdHJhY3Q9ImZhbHNlIgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9IkNsaXBib2FyZE1hbmFnZXIiCisgdHlwZT0iYW5kcm9pZC50ZXh0LkNsaXBib2FyZE1hbmFnZXIiCiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0iZmFsc2UiCiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgorPC9jb25zdHJ1Y3Rvcj4KIDxtZXRob2QgbmFtZT0iZ2V0VGV4dCIKICByZXR1cm49ImphdmEubGFuZy5DaGFyU2VxdWVuY2UiCi0gYWJzdHJhY3Q9ImZhbHNlIgorIGFic3RyYWN0PSJ0cnVlIgogIG5hdGl2ZT0iZmFsc2UiCiAgc3luY2hyb25pemVkPSJmYWxzZSIKICBzdGF0aWM9ImZhbHNlIgpAQCAtMTU5OTAzLDcgKzE2Nzk5MSw3IEBACiA8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iaGFzVGV4dCIKICByZXR1cm49ImJvb2xlYW4iCi0gYWJzdHJhY3Q9ImZhbHNlIgorIGFic3RyYWN0PSJ0cnVlIgogIG5hdGl2ZT0iZmFsc2UiCiAgc3luY2hyb25pemVkPSJmYWxzZSIKICBzdGF0aWM9ImZhbHNlIgpAQCAtMTU5OTE0LDcgKzE2ODAwMiw3IEBACiA8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0VGV4dCIKICByZXR1cm49InZvaWQiCi0gYWJzdHJhY3Q9ImZhbHNlIgorIGFic3RyYWN0PSJ0cnVlIgogIG5hdGl2ZT0iZmFsc2UiCiAgc3luY2hyb25pemVkPSJmYWxzZSIKICBzdGF0aWM9ImZhbHNlIgpAQCAtMTYyNzM5LDYgKzE3MDgyNywyOSBAQAogPHBhcmFtZXRlciBuYW1lPSJraW5kIiB0eXBlPSJqYXZhLmxhbmcuQ2xhc3MmbHQ7VCZndDsiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0VGV4dFJ1bkN1cnNvciIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dFN0YXJ0IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRleHRFbmQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZmxhZ3MiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ib2Zmc2V0IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImN1cnNvck9wdCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJwIiB0eXBlPSJhbmRyb2lkLmdyYXBoaWNzLlBhaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9Imluc2VydCIKICByZXR1cm49ImFuZHJvaWQudGV4dC5TcGFubmFibGVTdHJpbmdCdWlsZGVyIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE2Mzc5OSw3ICsxNzE5MTAsNyBAQAogPgogPHBhcmFtZXRlciBuYW1lPSJ0ZXh0IiB0eXBlPSJqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIj4KIDwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJwIiB0eXBlPSJhbmRyb2lkLnRleHQuVGV4dFBhaW50Ij4KKzxwYXJhbWV0ZXIgbmFtZT0icGFpbnQiIHR5cGU9ImFuZHJvaWQudGV4dC5UZXh0UGFpbnQiPgogPC9wYXJhbWV0ZXI+CiA8cGFyYW1ldGVyIG5hbWU9ImF2YWlsIiB0eXBlPSJmbG9hdCI+CiA8L3BhcmFtZXRlcj4KQEAgLTE3MjE4Niw2ICsxODAyOTcsMTggQEAKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Cis8cGFyYW1ldGVyIG5hbWU9Im5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImNhdXNlIiB0eXBlPSJqYXZhLmxhbmcuVGhyb3dhYmxlIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJBbmRyb2lkRXhjZXB0aW9uIgorIHR5cGU9ImFuZHJvaWQudXRpbC5BbmRyb2lkRXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KIDxwYXJhbWV0ZXIgbmFtZT0iY2F1c2UiIHR5cGU9ImphdmEubGFuZy5FeGNlcHRpb24iPgogPC9wYXJhbWV0ZXI+CiA8L2NvbnN0cnVjdG9yPgpAQCAtMTcyMjIzLDYgKzE4MDM0NiwxOCBAQAogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KKzxwYXJhbWV0ZXIgbmFtZT0ibmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iY2F1c2UiIHR5cGU9ImphdmEubGFuZy5UaHJvd2FibGUiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IkFuZHJvaWRSdW50aW1lRXhjZXB0aW9uIgorIHR5cGU9ImFuZHJvaWQudXRpbC5BbmRyb2lkUnVudGltZUV4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+CiA8cGFyYW1ldGVyIG5hbWU9ImNhdXNlIiB0eXBlPSJqYXZhLmxhbmcuRXhjZXB0aW9uIj4KIDwvcGFyYW1ldGVyPgogPC9jb25zdHJ1Y3Rvcj4KQEAgLTE3MzM4Niw2ICsxODE1MjEsNDgzIEBACiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgogPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJKc29uUmVhZGVyIgorIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGltcGxlbWVudHMgbmFtZT0iamF2YS5pby5DbG9zZWFibGUiPgorPC9pbXBsZW1lbnRzPgorPGNvbnN0cnVjdG9yIG5hbWU9Ikpzb25SZWFkZXIiCisgdHlwZT0iYW5kcm9pZC51dGlsLkpzb25SZWFkZXIiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJpbiIgdHlwZT0iamF2YS5pby5SZWFkZXIiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJiZWdpbkFycmF5IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxleGNlcHRpb24gbmFtZT0iSU9FeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uSU9FeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iYmVnaW5PYmplY3QiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGV4Y2VwdGlvbiBuYW1lPSJJT0V4Y2VwdGlvbiIgdHlwZT0iamF2YS5pby5JT0V4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJjbG9zZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImVuZEFycmF5IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxleGNlcHRpb24gbmFtZT0iSU9FeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uSU9FeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZW5kT2JqZWN0IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxleGNlcHRpb24gbmFtZT0iSU9FeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uSU9FeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaGFzTmV4dCIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im5leHRCb29sZWFuIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxleGNlcHRpb24gbmFtZT0iSU9FeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uSU9FeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ibmV4dERvdWJsZSIKKyByZXR1cm49ImRvdWJsZSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxleGNlcHRpb24gbmFtZT0iSU9FeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uSU9FeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ibmV4dEludCIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxleGNlcHRpb24gbmFtZT0iSU9FeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uSU9FeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ibmV4dExvbmciCisgcmV0dXJuPSJsb25nIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGV4Y2VwdGlvbiBuYW1lPSJJT0V4Y2VwdGlvbiIgdHlwZT0iamF2YS5pby5JT0V4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJuZXh0TmFtZSIKKyByZXR1cm49ImphdmEubGFuZy5TdHJpbmciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im5leHROdWxsIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxleGNlcHRpb24gbmFtZT0iSU9FeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uSU9FeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ibmV4dFN0cmluZyIKKyByZXR1cm49ImphdmEubGFuZy5TdHJpbmciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InBlZWsiCisgcmV0dXJuPSJhbmRyb2lkLnV0aWwuSnNvblRva2VuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGV4Y2VwdGlvbiBuYW1lPSJJT0V4Y2VwdGlvbiIgdHlwZT0iamF2YS5pby5JT0V4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRMZW5pZW50IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibGVuaWVudCIgdHlwZT0iYm9vbGVhbiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJza2lwVmFsdWUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGV4Y2VwdGlvbiBuYW1lPSJJT0V4Y2VwdGlvbiIgdHlwZT0iamF2YS5pby5JT0V4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzeW50YXhFcnJvciIKKyByZXR1cm49ImphdmEuaW8uSU9FeGNlcHRpb24iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im1lc3NhZ2UiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8L2NsYXNzPgorPGNsYXNzIG5hbWU9Ikpzb25Ub2tlbiIKKyBleHRlbmRzPSJqYXZhLmxhbmcuRW51bSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8bWV0aG9kIG5hbWU9InZhbHVlT2YiCisgcmV0dXJuPSJhbmRyb2lkLnV0aWwuSnNvblRva2VuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0idmFsdWVzIgorIHJldHVybj0iYW5kcm9pZC51dGlsLkpzb25Ub2tlbltdIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJKc29uV3JpdGVyIgorIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGltcGxlbWVudHMgbmFtZT0iamF2YS5pby5DbG9zZWFibGUiPgorPC9pbXBsZW1lbnRzPgorPGNvbnN0cnVjdG9yIG5hbWU9Ikpzb25Xcml0ZXIiCisgdHlwZT0iYW5kcm9pZC51dGlsLkpzb25Xcml0ZXIiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJvdXQiIHR5cGU9ImphdmEuaW8uV3JpdGVyIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0iYmVnaW5BcnJheSIKKyByZXR1cm49ImFuZHJvaWQudXRpbC5Kc29uV3JpdGVyIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGV4Y2VwdGlvbiBuYW1lPSJJT0V4Y2VwdGlvbiIgdHlwZT0iamF2YS5pby5JT0V4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJiZWdpbk9iamVjdCIKKyByZXR1cm49ImFuZHJvaWQudXRpbC5Kc29uV3JpdGVyIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGV4Y2VwdGlvbiBuYW1lPSJJT0V4Y2VwdGlvbiIgdHlwZT0iamF2YS5pby5JT0V4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJjbG9zZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImVuZEFycmF5IgorIHJldHVybj0iYW5kcm9pZC51dGlsLkpzb25Xcml0ZXIiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImVuZE9iamVjdCIKKyByZXR1cm49ImFuZHJvaWQudXRpbC5Kc29uV3JpdGVyIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGV4Y2VwdGlvbiBuYW1lPSJJT0V4Y2VwdGlvbiIgdHlwZT0iamF2YS5pby5JT0V4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJmbHVzaCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im5hbWUiCisgcmV0dXJuPSJhbmRyb2lkLnV0aWwuSnNvbldyaXRlciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iSU9FeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uSU9FeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ibnVsbFZhbHVlIgorIHJldHVybj0iYW5kcm9pZC51dGlsLkpzb25Xcml0ZXIiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEluZGVudCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImluZGVudCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJ2YWx1ZSIKKyByZXR1cm49ImFuZHJvaWQudXRpbC5Kc29uV3JpdGVyIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iSU9FeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uSU9FeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0idmFsdWUiCisgcmV0dXJuPSJhbmRyb2lkLnV0aWwuSnNvbldyaXRlciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImJvb2xlYW4iPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InZhbHVlIgorIHJldHVybj0iYW5kcm9pZC51dGlsLkpzb25Xcml0ZXIiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJkb3VibGUiPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InZhbHVlIgorIHJldHVybj0iYW5kcm9pZC51dGlsLkpzb25Xcml0ZXIiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJsb25nIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJJT0V4Y2VwdGlvbiIgdHlwZT0iamF2YS5pby5JT0V4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPC9jbGFzcz4KIDxjbGFzcyBuYW1lPSJMb2ciCiAgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xNzQxMTEsNyArMTgyNzIzLDcgQEAKICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgogIHRyYW5zaWVudD0iZmFsc2UiCiAgdm9sYXRpbGU9ImZhbHNlIgotIHZhbHVlPSImcXVvdDsoKGFlcm98YXJwYXxhc2lhfGFbY2RlZmdpbG1ub3Fyc3R1d3h6XSl8KGJpenxiW2FiZGVmZ2hpam1ub3JzdHZ3eXpdKXwoY2F0fGNvbXxjb29wfGNbYWNkZmdoaWtsbW5vcnV2eHl6XSl8ZFtlamttb3pdfChlZHV8ZVtjZWdyc3R1XSl8Zltpamttb3JdfChnb3Z8Z1thYmRlZmdoaWxtbnBxcnN0dXd5XSl8aFtrbW5ydHVdfChpbmZvfGludHxpW2RlbG1ub3Fyc3RdKXwoam9ic3xqW2Vtb3BdKXxrW2VnaGltbnByd3l6XXxsW2FiY2lrcnN0dXZ5XXwobWlsfG1vYml8bXVzZXVtfG1bYWNkZWdoa2xtbm9wcXJzdHV2d3h5el0pfChuYW1lfG5ldHxuW2FjZWZnaWxvcHJ1el0pfChvcmd8b20pfChwcm98cFthZWZnaGtsbW5yc3R3eV0pfHFhfHJbZW9zdXddfHNbYWJjZGVnaGlqa2xtbm9ydHV2eXpdfCh0ZWx8dHJhdmVsfHRbY2RmZ2hqa2xtbm9wcnR2d3pdKXx1W2Fna3N5el18dlthY2VnaW51XXx3W2ZzXXwoeG5cXC1cXC0wendtNTZkfHhuXFwtXFwtMTFiNWJzM2E5YWo2Z3x4blxcLVxcLTgwYWtoYnlrbmo0Znx4blxcLVxcLTl0NGIxMXlpNWF8eG5cXC1cXC1kZWJhMGFkfHhuXFwtXFwtZzZ3MjUxZHx4blxcLVxcLWhnYms2YWo3ZjUzYmJhfHhuXFwtXFwtaGxjajZheWE5ZXNjN2F8eG5cXC1cXC1qeGFscGRscHx4blxcLVxcLWtnYmVjaHR2fHhuXFwtXFwtemNremFoKXx5W2V0dV18elthbXddKSZxdW90OyIKKyB2YWx1ZT0iJnF1b3Q7KChhZXJvfGFycGF8YXNpYXxhW2NkZWZnaWxtbm9xcnN0dXd4el0pfChiaXp8YlthYmRlZmdoaWptbm9yc3R2d3l6XSl8KGNhdHxjb218Y29vcHxjW2FjZGZnaGlrbG1ub3J1dnh5el0pfGRbZWprbW96XXwoZWR1fGVbY2VncnN0dV0pfGZbaWprbW9yXXwoZ292fGdbYWJkZWZnaGlsbW5wcXJzdHV3eV0pfGhba21ucnR1XXwoaW5mb3xpbnR8aVtkZWxtbm9xcnN0XSl8KGpvYnN8altlbW9wXSl8a1tlZ2hpbW5wcnd5el18bFthYmNpa3JzdHV2eV18KG1pbHxtb2JpfG11c2V1bXxtW2FjZGVnaGtsbW5vcHFyc3R1dnd4eXpdKXwobmFtZXxuZXR8blthY2VmZ2lsb3BydXpdKXwob3JnfG9tKXwocHJvfHBbYWVmZ2hrbG1ucnN0d3ldKXxxYXxyW2Vvc3V3XXxzW2FiY2RlZ2hpamtsbW5vcnR1dnl6XXwodGVsfHRyYXZlbHx0W2NkZmdoamtsbW5vcHJ0dnd6XSl8dVthZ2tzeXpdfHZbYWNlZ2ludV18d1tmc118KHhuXFwtXFwtMHp3bTU2ZHx4blxcLVxcLTExYjViczNhOWFqNmd8eG5cXC1cXC04MGFraGJ5a25qNGZ8eG5cXC1cXC05dDRiMTF5aTVhfHhuXFwtXFwtZGViYTBhZHx4blxcLVxcLWc2dzI1MWR8eG5cXC1cXC1oZ2JrNmFqN2Y1M2JiYXx4blxcLVxcLWhsY2o2YXlhOWVzYzdhfHhuXFwtXFwtanhhbHBkbHB8eG5cXC1cXC1rZ2JlY2h0dnx4blxcLVxcLW1nYmFhbTdhOGh8eG5cXC1cXC1tZ2JlcnA0YTVkNGFyfHhuXFwtXFwtd2diaDFjfHhuXFwtXFwtemNremFoKXx5W2V0XXx6W2Ftd10pJnF1b3Q7IgogIHN0YXRpYz0idHJ1ZSIKICBmaW5hbD0idHJ1ZSIKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKQEAgLTE3NDEyMiw3ICsxODI3MzQsNyBAQAogIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCiAgdHJhbnNpZW50PSJmYWxzZSIKICB2b2xhdGlsZT0iZmFsc2UiCi0gdmFsdWU9IiZxdW90Oyg/Oig/OmFlcm98YXJwYXxhc2lhfGFbY2RlZmdpbG1ub3Fyc3R1d3h6XSl8KD86Yml6fGJbYWJkZWZnaGlqbW5vcnN0dnd5el0pfCg/OmNhdHxjb218Y29vcHxjW2FjZGZnaGlrbG1ub3J1dnh5el0pfGRbZWprbW96XXwoPzplZHV8ZVtjZWdyc3R1XSl8Zltpamttb3JdfCg/OmdvdnxnW2FiZGVmZ2hpbG1ucHFyc3R1d3ldKXxoW2ttbnJ0dV18KD86aW5mb3xpbnR8aVtkZWxtbm9xcnN0XSl8KD86am9ic3xqW2Vtb3BdKXxrW2VnaGltbnByd3l6XXxsW2FiY2lrcnN0dXZ5XXwoPzptaWx8bW9iaXxtdXNldW18bVthY2RlZ2hrbG1ub3BxcnN0dXZ3eHl6XSl8KD86bmFtZXxuZXR8blthY2VmZ2lsb3BydXpdKXwoPzpvcmd8b20pfCg/OnByb3xwW2FlZmdoa2xtbnJzdHd5XSl8cWF8cltlb3N1d118c1thYmNkZWdoaWprbG1ub3J0dXZ5el18KD86dGVsfHRyYXZlbHx0W2NkZmdoamtsbW5vcHJ0dnd6XSl8dVthZ2tzeXpdfHZbYWNlZ2ludV18d1tmc118KD86eG5cXC1cXC0wendtNTZkfHhuXFwtXFwtMTFiNWJzM2E5YWo2Z3x4blxcLVxcLTgwYWtoYnlrbmo0Znx4blxcLVxcLTl0NGIxMXlpNWF8eG5cXC1cXC1kZWJhMGFkfHhuXFwtXFwtZzZ3MjUxZHx4blxcLVxcLWhnYms2YWo3ZjUzYmJhfHhuXFwtXFwtaGxjajZheWE5ZXNjN2F8eG5cXC1cXC1qeGFscGRscHx4blxcLVxcLWtnYmVjaHR2fHhuXFwtXFwtemNremFoKXx5W2V0dV18elthbXddKSkmcXVvdDsiCisgdmFsdWU9IiZxdW90Oyg/Oig/OmFlcm98YXJwYXxhc2lhfGFbY2RlZmdpbG1ub3Fyc3R1d3h6XSl8KD86Yml6fGJbYWJkZWZnaGlqbW5vcnN0dnd5el0pfCg/OmNhdHxjb218Y29vcHxjW2FjZGZnaGlrbG1ub3J1dnh5el0pfGRbZWprbW96XXwoPzplZHV8ZVtjZWdyc3R1XSl8Zltpamttb3JdfCg/OmdvdnxnW2FiZGVmZ2hpbG1ucHFyc3R1d3ldKXxoW2ttbnJ0dV18KD86aW5mb3xpbnR8aVtkZWxtbm9xcnN0XSl8KD86am9ic3xqW2Vtb3BdKXxrW2VnaGltbnByd3l6XXxsW2FiY2lrcnN0dXZ5XXwoPzptaWx8bW9iaXxtdXNldW18bVthY2RlZ2hrbG1ub3BxcnN0dXZ3eHl6XSl8KD86bmFtZXxuZXR8blthY2VmZ2lsb3BydXpdKXwoPzpvcmd8b20pfCg/OnByb3xwW2FlZmdoa2xtbnJzdHd5XSl8cWF8cltlb3N1d118c1thYmNkZWdoaWprbG1ub3J0dXZ5el18KD86dGVsfHRyYXZlbHx0W2NkZmdoamtsbW5vcHJ0dnd6XSl8dVthZ2tzeXpdfHZbYWNlZ2ludV18d1tmc118KD86eG5cXC1cXC0wendtNTZkfHhuXFwtXFwtMTFiNWJzM2E5YWo2Z3x4blxcLVxcLTgwYWtoYnlrbmo0Znx4blxcLVxcLTl0NGIxMXlpNWF8eG5cXC1cXC1kZWJhMGFkfHhuXFwtXFwtZzZ3MjUxZHx4blxcLVxcLWhnYms2YWo3ZjUzYmJhfHhuXFwtXFwtaGxjajZheWE5ZXNjN2F8eG5cXC1cXC1qeGFscGRscHx4blxcLVxcLWtnYmVjaHR2fHhuXFwtXFwtbWdiYWFtN2E4aHx4blxcLVxcLW1nYmVycDRhNWQ0YXJ8eG5cXC1cXC13Z2JoMWN8eG5cXC1cXC16Y2t6YWgpfHlbZXRdfHpbYW13XSkpJnF1b3Q7IgogIHN0YXRpYz0idHJ1ZSIKICBmaW5hbD0idHJ1ZSIKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKQEAgLTE3NDM4OSw2ICsxODMwMDEsMTkgQEAKIDxwYXJhbWV0ZXIgbmFtZT0ia2V5IiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icmVtb3ZlQXQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJpbmRleCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNldFZhbHVlQXQiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE3NTk5NCw2ICsxODQ2MTksMjMxIEBACiA+CiA8L2ZpZWxkPgogPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJBY3Rpb25Nb2RlIgorIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCisgYWJzdHJhY3Q9InRydWUiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9IkFjdGlvbk1vZGUiCisgdHlwZT0iYW5kcm9pZC52aWV3LkFjdGlvbk1vZGUiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0iZmluaXNoIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEN1c3RvbVZpZXciCisgcmV0dXJuPSJhbmRyb2lkLnZpZXcuVmlldyIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldE1lbnUiCisgcmV0dXJuPSJhbmRyb2lkLnZpZXcuTWVudSIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldE1lbnVJbmZsYXRlciIKKyByZXR1cm49ImFuZHJvaWQudmlldy5NZW51SW5mbGF0ZXIiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRTdWJ0aXRsZSIKKyByZXR1cm49ImphdmEubGFuZy5DaGFyU2VxdWVuY2UiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRUaXRsZSIKKyByZXR1cm49ImphdmEubGFuZy5DaGFyU2VxdWVuY2UiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpbnZhbGlkYXRlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEN1c3RvbVZpZXciCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InZpZXciIHR5cGU9ImFuZHJvaWQudmlldy5WaWV3Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFN1YnRpdGxlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJzdWJ0aXRsZSIgdHlwZT0iamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRTdWJ0aXRsZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icmVzSWQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRUaXRsZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idGl0bGUiIHR5cGU9ImphdmEubGFuZy5DaGFyU2VxdWVuY2UiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0VGl0bGUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InJlc0lkIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvY2xhc3M+Cis8aW50ZXJmYWNlIG5hbWU9IkFjdGlvbk1vZGUuQ2FsbGJhY2siCisgYWJzdHJhY3Q9InRydWUiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8bWV0aG9kIG5hbWU9Im9uQWN0aW9uSXRlbUNsaWNrZWQiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im1vZGUiIHR5cGU9ImFuZHJvaWQudmlldy5BY3Rpb25Nb2RlIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJpdGVtIiB0eXBlPSJhbmRyb2lkLnZpZXcuTWVudUl0ZW0iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25DcmVhdGVBY3Rpb25Nb2RlIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJtb2RlIiB0eXBlPSJhbmRyb2lkLnZpZXcuQWN0aW9uTW9kZSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibWVudSIgdHlwZT0iYW5kcm9pZC52aWV3Lk1lbnUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25EZXN0cm95QWN0aW9uTW9kZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibW9kZSIgdHlwZT0iYW5kcm9pZC52aWV3LkFjdGlvbk1vZGUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25QcmVwYXJlQWN0aW9uTW9kZSIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibW9kZSIgdHlwZT0iYW5kcm9pZC52aWV3LkFjdGlvbk1vZGUiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im1lbnUiIHR5cGU9ImFuZHJvaWQudmlldy5NZW51Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2ludGVyZmFjZT4KIDxpbnRlcmZhY2UgbmFtZT0iQ29udGV4dE1lbnUiCiAgYWJzdHJhY3Q9InRydWUiCiAgc3RhdGljPSJmYWxzZSIKQEAgLTE4MTQ4Miw2ICsxOTAzMzIsMTkgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iYWxwaGFDaGFyIiB0eXBlPSJjaGFyIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFNob3dBc0FjdGlvbiIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYWN0aW9uRW51bSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNldFRpdGxlIgogIHJldHVybj0iYW5kcm9pZC52aWV3Lk1lbnVJdGVtIgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMTgxNTM0LDYgKzE5MDM5NywzOSBAQAogPHBhcmFtZXRlciBuYW1lPSJ2aXNpYmxlIiB0eXBlPSJib29sZWFuIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8ZmllbGQgbmFtZT0iU0hPV19BU19BQ1RJT05fQUxXQVlTIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJTSE9XX0FTX0FDVElPTl9JRl9ST09NIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJTSE9XX0FTX0FDVElPTl9ORVZFUiIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjAiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8L2ludGVyZmFjZT4KIDxpbnRlcmZhY2UgbmFtZT0iTWVudUl0ZW0uT25NZW51SXRlbUNsaWNrTGlzdGVuZXIiCiAgYWJzdHJhY3Q9InRydWUiCkBAIC0xODUyOTQsNiArMTk0MTkwLDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEFscGhhIgorIHJldHVybj0iZmxvYXQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0QW5pbWF0aW9uIgogIHJldHVybj0iYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb24iCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTg1NzI3LDYgKzE5NDYzNCwxNyBAQAogPHBhcmFtZXRlciBuYW1lPSJsb2NhdGlvbiIgdHlwZT0iaW50W10iPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0TWF0cml4IgorIHJldHVybj0iYW5kcm9pZC5ncmFwaGljcy5NYXRyaXgiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0TWVhc3VyZWRIZWlnaHQiCiAgcmV0dXJuPSJpbnQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTg1ODU5LDYgKzE5NDc3NywyOCBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRQaXZvdFgiCisgcmV0dXJuPSJmbG9hdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRQaXZvdFkiCisgcmV0dXJuPSJmbG9hdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRSZXNvdXJjZXMiCiAgcmV0dXJuPSJhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlcyIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xODU5MTQsNiArMTk0ODU0LDYxIEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFJvdGF0aW9uIgorIHJldHVybj0iZmxvYXQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0Um90YXRpb25YIgorIHJldHVybj0iZmxvYXQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0Um90YXRpb25ZIgorIHJldHVybj0iZmxvYXQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0U2NhbGVYIgorIHJldHVybj0iZmxvYXQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0U2NhbGVZIgorIHJldHVybj0iZmxvYXQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0U2Nyb2xsQmFyU3R5bGUiCiAgcmV0dXJuPSJpbnQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTg2MDU5LDYgKzE5NTA1NCwyOCBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRUcmFuc2xhdGlvblgiCisgcmV0dXJuPSJmbG9hdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRUcmFuc2xhdGlvblkiCisgcmV0dXJuPSJmbG9hdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRWZXJ0aWNhbEZhZGluZ0VkZ2VMZW5ndGgiCiAgcmV0dXJuPSJpbnQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTg2MTYwLDYgKzE5NTE3NywyOCBAQAogPHBhcmFtZXRlciBuYW1lPSJvdXRSZWN0IiB0eXBlPSJhbmRyb2lkLmdyYXBoaWNzLlJlY3QiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0WCIKKyByZXR1cm49ImZsb2F0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFkiCisgcmV0dXJuPSJmbG9hdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJoYXNGb2N1cyIKICByZXR1cm49ImJvb2xlYW4iCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTg2NDkwLDYgKzE5NTUyOSwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpc1NhdmVGcm9tUGFyZW50RW5hYmxlZCIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iaXNTY3JvbGxiYXJGYWRpbmdFbmFibGVkIgogIHJldHVybj0iYm9vbGVhbiIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xODc0NzksNiArMTk2NTI5LDE5IEBACiA8cGFyYW1ldGVyIG5hbWU9ImV2ZW50IiB0eXBlPSJhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5RXZlbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0QWxwaGEiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhbHBoYSIgdHlwZT0iZmxvYXQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0QW5pbWF0aW9uIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xODc5NDIsNiArMTk3MDA1LDMyIEBACiA8cGFyYW1ldGVyIG5hbWU9ImJvdHRvbSIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFBpdm90WCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBpdm90WCIgdHlwZT0iZmxvYXQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0UGl2b3RZIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icGl2b3RZIiB0eXBlPSJmbG9hdCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXRQcmVzc2VkIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xODc5NTUsNiArMTk3MDQ0LDQ1IEBACiA8cGFyYW1ldGVyIG5hbWU9InByZXNzZWQiIHR5cGU9ImJvb2xlYW4iPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0Um90YXRpb24iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJyb3RhdGlvbiIgdHlwZT0iZmxvYXQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0Um90YXRpb25YIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icm90YXRpb25YIiB0eXBlPSJmbG9hdCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRSb3RhdGlvblkiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJyb3RhdGlvblkiIHR5cGU9ImZsb2F0Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNldFNhdmVFbmFibGVkIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xODc5NjgsNiArMTk3MDk2LDQ1IEBACiA8cGFyYW1ldGVyIG5hbWU9ImVuYWJsZWQiIHR5cGU9ImJvb2xlYW4iPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0U2F2ZUZyb21QYXJlbnRFbmFibGVkIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZW5hYmxlZCIgdHlwZT0iYm9vbGVhbiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRTY2FsZVgiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJzY2FsZVgiIHR5cGU9ImZsb2F0Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFNjYWxlWSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InNjYWxlWSIgdHlwZT0iZmxvYXQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0U2Nyb2xsQmFyU3R5bGUiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE4ODA3NCw2ICsxOTcyNDEsMzIgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iZGVsZWdhdGUiIHR5cGU9ImFuZHJvaWQudmlldy5Ub3VjaERlbGVnYXRlIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFRyYW5zbGF0aW9uWCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InRyYW5zbGF0aW9uWCIgdHlwZT0iZmxvYXQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0VHJhbnNsYXRpb25ZIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idHJhbnNsYXRpb25ZIiB0eXBlPSJmbG9hdCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXRWZXJ0aWNhbEZhZGluZ0VkZ2VFbmFibGVkIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xODgxMzksNiArMTk3MzMyLDMyIEBACiA8cGFyYW1ldGVyIG5hbWU9IndpbGxOb3REcmF3IiB0eXBlPSJib29sZWFuIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFgiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ4IiB0eXBlPSJmbG9hdCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRZIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ieSIgdHlwZT0iZmxvYXQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2hvd0NvbnRleHRNZW51IgogIHJldHVybj0iYm9vbGVhbiIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xODgxNTAsNiArMTk3MzY5LDE5IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InN0YXJ0QWN0aW9uTW9kZSIKKyByZXR1cm49ImFuZHJvaWQudmlldy5BY3Rpb25Nb2RlIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjYWxsYmFjayIgdHlwZT0iYW5kcm9pZC52aWV3LkFjdGlvbk1vZGUuQ2FsbGJhY2siPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic3RhcnRBbmltYXRpb24iCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE5MDQxMiw2ICsxOTk2NDQsMTcgQEAKICB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaXNNb3Rpb25FdmVudFNwbGl0dGluZ0VuYWJsZWQiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9Im1lYXN1cmVDaGlsZCIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTkwODc1LDYgKzIwMDExOCwxOSBAQAogPHBhcmFtZXRlciBuYW1lPSJhbmltYXRpb25MaXN0ZW5lciIgdHlwZT0iYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb24uQW5pbWF0aW9uTGlzdGVuZXIiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0TW90aW9uRXZlbnRTcGxpdHRpbmdFbmFibGVkIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ic3BsaXQiIHR5cGU9ImJvb2xlYW4iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0T25IaWVyYXJjaHlDaGFuZ2VMaXN0ZW5lciIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTkwOTI3LDYgKzIwMDE4MywyMSBAQAogPHBhcmFtZXRlciBuYW1lPSJvcmlnaW5hbFZpZXciIHR5cGU9ImFuZHJvaWQudmlldy5WaWV3Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InN0YXJ0QWN0aW9uTW9kZUZvckNoaWxkIgorIHJldHVybj0iYW5kcm9pZC52aWV3LkFjdGlvbk1vZGUiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im9yaWdpbmFsVmlldyIgdHlwZT0iYW5kcm9pZC52aWV3LlZpZXciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImNhbGxiYWNrIiB0eXBlPSJhbmRyb2lkLnZpZXcuQWN0aW9uTW9kZS5DYWxsYmFjayI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzdGFydExheW91dEFuaW1hdGlvbiIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTkxNjE3LDYgKzIwMDg4OCwyMSBAQAogPHBhcmFtZXRlciBuYW1lPSJvcmlnaW5hbFZpZXciIHR5cGU9ImFuZHJvaWQudmlldy5WaWV3Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InN0YXJ0QWN0aW9uTW9kZUZvckNoaWxkIgorIHJldHVybj0iYW5kcm9pZC52aWV3LkFjdGlvbk1vZGUiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ib3JpZ2luYWxWaWV3IiB0eXBlPSJhbmRyb2lkLnZpZXcuVmlldyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iY2FsbGJhY2siIHR5cGU9ImFuZHJvaWQudmlldy5BY3Rpb25Nb2RlLkNhbGxiYWNrIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8L2ludGVyZmFjZT4KIDxjbGFzcyBuYW1lPSJWaWV3U3R1YiIKICBleHRlbmRzPSJhbmRyb2lkLnZpZXcuVmlldyIKQEAgLTE5MjI5Myw2ICsyMDE1NzksMTkgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaGFzRmVhdHVyZSIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImZlYXR1cmUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJoYXNTb2Z0SW5wdXRNb2RlIgogIHJldHVybj0iYm9vbGVhbiIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xOTIzMDQsNiArMjAxNjAzLDE5IEBACiAgdmlzaWJpbGl0eT0icHJvdGVjdGVkIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImludmFsaWRhdGVQYW5lbE1lbnUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImZlYXR1cmVJZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImlzQWN0aXZlIgogIHJldHVybj0iYm9vbGVhbiIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xOTI4NjUsNiArMjAyMTc3LDI1IEBACiA8cGFyYW1ldGVyIG5hbWU9ImFwcE5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0V2luZG93TWFuYWdlciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9IndtIiB0eXBlPSJhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlciI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iYXBwVG9rZW4iIHR5cGU9ImFuZHJvaWQub3MuSUJpbmRlciI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iYXBwTmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iaGFyZHdhcmVBY2NlbGVyYXRlZCIgdHlwZT0iYm9vbGVhbiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzdXBlckRpc3BhdGNoS2V5RXZlbnQiCiAgcmV0dXJuPSJib29sZWFuIgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMTkyOTY5LDYgKzIwMjMwMCwzOSBAQAogIHZpc2liaWxpdHk9InByb3RlY3RlZCIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iRkVBVFVSRV9BQ1RJT05fQkFSIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iOCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJGRUFUVVJFX0FDVElPTl9CQVJfT1ZFUkxBWSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjkiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iRkVBVFVSRV9BQ1RJT05fTU9ERV9PVkVSTEFZIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTAiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iRkVBVFVSRV9DT05URVhUX01FTlUiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0xOTI5OTEsNiArMjAyMzU1LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJGRUFUVVJFX0hBUkRXQVJFX0FDQ0VMRVJBVEVEIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTEiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iRkVBVFVSRV9JTkRFVEVSTUlOQVRFX1BST0dSRVNTIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMTkzMzUwLDYgKzIwMjcyNSwxOSBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvblN0YXJ0QWN0aW9uTW9kZSIKKyByZXR1cm49ImFuZHJvaWQudmlldy5BY3Rpb25Nb2RlIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNhbGxiYWNrIiB0eXBlPSJhbmRyb2lkLnZpZXcuQWN0aW9uTW9kZS5DYWxsYmFjayI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJvbldpbmRvd0F0dHJpYnV0ZXNDaGFuZ2VkIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTE5MzgzOSw2ICsyMDMyMjcsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkZMQUdfSEFSRFdBUkVfQUNDRUxFUkFURUQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSItMjE0NzQ4MzY0OCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJGTEFHX0lHTk9SRV9DSEVFS19QUkVTU0VTIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMTk1NzI1LDYgKzIwNTEyNCwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRTY2FsZUZhY3RvciIKKyByZXR1cm49ImZsb2F0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHJvdGVjdGVkIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldFN0YXJ0T2Zmc2V0IgogIHJldHVybj0ibG9uZyIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xOTU3NjIsNiArMjA1MTcyLDIzIEBACiA8cGFyYW1ldGVyIG5hbWU9Im91dFRyYW5zZm9ybWF0aW9uIiB0eXBlPSJhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLlRyYW5zZm9ybWF0aW9uIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFRyYW5zZm9ybWF0aW9uIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY3VycmVudFRpbWUiIHR5cGU9ImxvbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im91dFRyYW5zZm9ybWF0aW9uIiB0eXBlPSJhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLlRyYW5zZm9ybWF0aW9uIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzY2FsZSIgdHlwZT0iZmxvYXQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0WkFkanVzdG1lbnQiCiAgcmV0dXJuPSJpbnQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTk5OTc0LDYgKzIwOTQwMSwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRTdWJ0eXBlcyIKKyByZXR1cm49ImphdmEudXRpbC5BcnJheUxpc3QmbHQ7YW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLklucHV0TWV0aG9kSW5mby5JbnB1dE1ldGhvZFN1YnR5cGUmZ3Q7IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImxvYWRJY29uIgogIHJldHVybj0iYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMDAwMjYsNiArMjA5NDY0LDEwOCBAQAogPgogPC9maWVsZD4KIDwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iSW5wdXRNZXRob2RJbmZvLklucHV0TWV0aG9kU3VidHlwZSIKKyBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxpbXBsZW1lbnRzIG5hbWU9ImFuZHJvaWQub3MuUGFyY2VsYWJsZSI+Cis8L2ltcGxlbWVudHM+Cis8bWV0aG9kIG5hbWU9ImRlc2NyaWJlQ29udGVudHMiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0RXh0cmFWYWx1ZSIKKyByZXR1cm49ImphdmEubGFuZy5TdHJpbmciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0SWNvbklkIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldExvY2FsZSIKKyByZXR1cm49ImphdmEubGFuZy5TdHJpbmciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0TW9kZSIKKyByZXR1cm49ImphdmEubGFuZy5TdHJpbmciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0TmFtZSIKKyByZXR1cm49ImphdmEubGFuZy5TdHJpbmciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0id3JpdGVUb1BhcmNlbCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImRlc3QiIHR5cGU9ImFuZHJvaWQub3MuUGFyY2VsIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJwYXJjZWxhYmxlRmxhZ3MiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPGZpZWxkIG5hbWU9IkNSRUFUT1IiCisgdHlwZT0iYW5kcm9pZC5vcy5QYXJjZWxhYmxlLkNyZWF0b3IiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8L2NsYXNzPgogPGNsYXNzIG5hbWU9IklucHV0TWV0aG9kTWFuYWdlciIKICBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIwMzA0MSw2ICsyMTI1ODEsMTcgQEAKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Cis8bWV0aG9kIG5hbWU9ImVuYWJsZVNtb290aFRyYW5zaXRpb24iCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldEFsbG93RmlsZUFjY2VzcyIKICByZXR1cm49ImJvb2xlYW4iCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjAzNjU2LDYgKzIxMzIwNywxOSBAQAogPHBhcmFtZXRlciBuYW1lPSJmbGFnIiB0eXBlPSJib29sZWFuIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEVuYWJsZVNtb290aFRyYW5zaXRpb24iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJlbmFibGUiIHR5cGU9ImJvb2xlYW4iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0RmFudGFzeUZvbnRGYW1pbHkiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIwNDU4OCw2ICsyMTQxNTIsMjIgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iZGVmU3R5bGUiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KIDwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iV2ViVmlldyIKKyB0eXBlPSJhbmRyb2lkLndlYmtpdC5XZWJWaWV3IgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImF0dHJzIiB0eXBlPSJhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJkZWZTdHlsZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJwcml2YXRlQnJvd3NpbmciIHR5cGU9ImJvb2xlYW4iPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgogPG1ldGhvZCBuYW1lPSJhZGRKYXZhc2NyaXB0SW50ZXJmYWNlIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMDQ2MzgsNiArMjE0MjE4LDI4IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImNhblpvb21JbiIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iY2FuWm9vbU91dCIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iY2FwdHVyZVBpY3R1cmUiCiAgcmV0dXJuPSJhbmRyb2lkLmdyYXBoaWNzLlBpY3R1cmUiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjA0OTk3LDYgKzIxNDU5OSwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRWaXNpYmxlVGl0bGVIZWlnaHQiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0Wm9vbUNvbnRyb2xzIgogIHJldHVybj0iYW5kcm9pZC52aWV3LlZpZXciCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjA1MDU0LDYgKzIxNDY2NywxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpc1ByaXZhdGVCcm93c2luZ0VuYWJsZWQiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImxvYWREYXRhIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMDUzNzMsNiArMjE0OTk3LDM2IEBACiA8cGFyYW1ldGVyIG5hbWU9Im91dFN0YXRlIiB0eXBlPSJhbmRyb2lkLm9zLkJ1bmRsZSI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzYXZlV2ViQXJjaGl2ZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImZpbGVuYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNhdmVXZWJBcmNoaXZlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYmFzZW5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImF1dG9uYW1lIiB0eXBlPSJib29sZWFuIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJjYWxsYmFjayIgdHlwZT0iYW5kcm9pZC53ZWJraXQuVmFsdWVDYWxsYmFjayZsdDtqYXZhLmxhbmcuU3RyaW5nJmd0OyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXRDZXJ0aWZpY2F0ZSIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjA2Mzc3LDYgKzIxNjAzMSwxNyBAQAogPHBhcmFtZXRlciBuYW1lPSJhZnRlciIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImNsZWFyQ2hvaWNlcyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iY2xlYXJUZXh0RmlsdGVyIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMDYzOTksNiArMjE2MDY0LDYxIEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldENoZWNrZWRJdGVtQ291bnQiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0Q2hlY2tlZEl0ZW1JZHMiCisgcmV0dXJuPSJsb25nW10iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0Q2hlY2tlZEl0ZW1Qb3NpdGlvbiIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRDaGVja2VkSXRlbVBvc2l0aW9ucyIKKyByZXR1cm49ImFuZHJvaWQudXRpbC5TcGFyc2VCb29sZWFuQXJyYXkiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0Q2hvaWNlTW9kZSIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRMaXN0UGFkZGluZ0JvdHRvbSIKICByZXR1cm49ImludCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMDY1NDIsNiArMjE2MjYyLDE5IEBACiAgdmlzaWJpbGl0eT0icHJvdGVjdGVkIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImlzSXRlbUNoZWNrZWQiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwb3NpdGlvbiIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImlzU2Nyb2xsaW5nQ2FjaGVFbmFibGVkIgogIHJldHVybj0iYm9vbGVhbiIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMDY2MjEsNiArMjE2MzU0LDI4IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uUmVtb3RlQWRhcHRlckNvbm5lY3RlZCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25SZW1vdGVBZGFwdGVyRGlzY29ubmVjdGVkIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJvblJlc3RvcmVJbnN0YW5jZVN0YXRlIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMDY3MjAsNiArMjE2NDc1LDE5IEBACiA8cGFyYW1ldGVyIG5hbWU9InZpZXdzIiB0eXBlPSJqYXZhLnV0aWwuTGlzdCZsdDthbmRyb2lkLnZpZXcuVmlldyZndDsiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0QWRhcHRlciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFkYXB0ZXIiIHR5cGU9ImFuZHJvaWQud2lkZ2V0Lkxpc3RBZGFwdGVyIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNldENhY2hlQ29sb3JIaW50IgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMDY3MzMsNiArMjE2NTAxLDE5IEBACiA8cGFyYW1ldGVyIG5hbWU9ImNvbG9yIiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0Q2hvaWNlTW9kZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNob2ljZU1vZGUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXREcmF3U2VsZWN0b3JPblRvcCIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjA2NzcyLDYgKzIxNjU1MywzNCBAQAogPHBhcmFtZXRlciBuYW1lPSJmaWx0ZXJUZXh0IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEl0ZW1DaGVja2VkIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icG9zaXRpb24iIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImJvb2xlYW4iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0TXVsdGlDaG9pY2VNb2RlTGlzdGVuZXIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJsaXN0ZW5lciIgdHlwZT0iYW5kcm9pZC53aWRnZXQuQWJzTGlzdFZpZXcuTXVsdGlDaG9pY2VNb2RlTGlzdGVuZXIiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0T25TY3JvbGxMaXN0ZW5lciIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjA2Nzk4LDYgKzIxNjYwNywxOSBAQAogPHBhcmFtZXRlciBuYW1lPSJsaXN0ZW5lciIgdHlwZT0iYW5kcm9pZC53aWRnZXQuQWJzTGlzdFZpZXcuUmVjeWNsZXJMaXN0ZW5lciI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRSZW1vdGVWaWV3c0FkYXB0ZXIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJpbnRlbnQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5JbnRlbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0U2Nyb2xsSW5kaWNhdG9ycyIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjA2OTQ3LDYgKzIxNjc2OSwyMSBAQAogPHBhcmFtZXRlciBuYW1lPSJib3VuZFBvc2l0aW9uIiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic21vb3RoU2Nyb2xsVG9Qb3NpdGlvbkZyb21Ub3AiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwb3NpdGlvbiIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJvZmZzZXQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJ2ZXJpZnlEcmF3YWJsZSIKICByZXR1cm49ImJvb2xlYW4iCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjA2OTYwLDYgKzIxNjc5Nyw1MCBAQAogPHBhcmFtZXRlciBuYW1lPSJkciIgdHlwZT0iYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPGZpZWxkIG5hbWU9IkNIT0lDRV9NT0RFX01VTFRJUExFIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJDSE9JQ0VfTU9ERV9NVUxUSVBMRV9NT0RBTCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjMiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iQ0hPSUNFX01PREVfTk9ORSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjAiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iQ0hPSUNFX01PREVfU0lOR0xFIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJUUkFOU0NSSVBUX01PREVfQUxXQVlTX1NDUk9MTCIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTIwNzA1MSw2ICsyMTY5MzIsMzUgQEAKIDwvcGFyYW1ldGVyPgogPC9jb25zdHJ1Y3Rvcj4KIDwvY2xhc3M+Cis8aW50ZXJmYWNlIG5hbWU9IkFic0xpc3RWaWV3Lk11bHRpQ2hvaWNlTW9kZUxpc3RlbmVyIgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGltcGxlbWVudHMgbmFtZT0iYW5kcm9pZC52aWV3LkFjdGlvbk1vZGUuQ2FsbGJhY2siPgorPC9pbXBsZW1lbnRzPgorPG1ldGhvZCBuYW1lPSJvbkl0ZW1DaGVja2VkU3RhdGVDaGFuZ2VkIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJtb2RlIiB0eXBlPSJhbmRyb2lkLnZpZXcuQWN0aW9uTW9kZSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0icG9zaXRpb24iIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iaWQiIHR5cGU9ImxvbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImNoZWNrZWQiIHR5cGU9ImJvb2xlYW4iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvaW50ZXJmYWNlPgogPGludGVyZmFjZSBuYW1lPSJBYnNMaXN0Vmlldy5PblNjcm9sbExpc3RlbmVyIgogIGFic3RyYWN0PSJ0cnVlIgogIHN0YXRpYz0idHJ1ZSIKQEAgLTIwODIyNyw2ICsyMTgxMzcsNTgyIEBACiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgogPC9pbnRlcmZhY2U+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+Cis8L2ZpZWxkPgorPC9jbGFzcz4KIDxjbGFzcyBuYW1lPSJBbHBoYWJldEluZGV4ZXIiCiAgZXh0ZW5kcz0iYW5kcm9pZC5kYXRhYmFzZS5EYXRhU2V0T2JzZXJ2ZXIiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjEwMjE0LDYgKzIyMDcwMCwyMCBAQAogPHBhcmFtZXRlciBuYW1lPSJhdXRvUmVxdWVyeSIgdHlwZT0iYm9vbGVhbiI+CiA8L3BhcmFtZXRlcj4KIDwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iQ3Vyc29yQWRhcHRlciIKKyB0eXBlPSJhbmRyb2lkLndpZGdldC5DdXJzb3JBZGFwdGVyIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImMiIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJmbGFncyIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KIDxtZXRob2QgbmFtZT0iYmluZFZpZXciCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMjEwMzYxLDYgKzIyMDg2MSwyMyBAQAogPHBhcmFtZXRlciBuYW1lPSJhdXRvUmVxdWVyeSIgdHlwZT0iYm9vbGVhbiI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpbml0IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InByb3RlY3RlZCIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImMiIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJmbGFncyIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9Im5ld0Ryb3BEb3duVmlldyIKICByZXR1cm49ImFuZHJvaWQudmlldy5WaWV3IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIxMDQzMiw2ICsyMjA5NDksMjggQEAKIDxwYXJhbWV0ZXIgbmFtZT0iZmlsdGVyUXVlcnlQcm92aWRlciIgdHlwZT0iYW5kcm9pZC53aWRnZXQuRmlsdGVyUXVlcnlQcm92aWRlciI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPGZpZWxkIG5hbWU9IkZMQUdfQVVUT19SRVFVRVJZIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJGTEFHX1JFR0lTVEVSX0NPTlRFTlRfT0JTRVJWRVIiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIyIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPC9jbGFzcz4KIDxjbGFzcyBuYW1lPSJDdXJzb3JUcmVlQWRhcHRlciIKICBleHRlbmRzPSJhbmRyb2lkLndpZGdldC5CYXNlRXhwYW5kYWJsZUxpc3RBZGFwdGVyIgpAQCAtMjEyODcxLDcgKzIyMzQxMCw3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9ImdldFN0cmV0Y2hNb2RlIgorPG1ldGhvZCBuYW1lPSJnZXROdW1Db2x1bW5zIgogIHJldHVybj0iaW50IgogIGFic3RyYWN0PSJmYWxzZSIKICBuYXRpdmU9ImZhbHNlIgpAQCAtMjEyODgyLDggKzIyMzQyMSw4IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9InNldEFkYXB0ZXIiCi0gcmV0dXJuPSJ2b2lkIgorPG1ldGhvZCBuYW1lPSJnZXRTdHJldGNoTW9kZSIKKyByZXR1cm49ImludCIKICBhYnN0cmFjdD0iZmFsc2UiCiAgbmF0aXZlPSJmYWxzZSIKICBzeW5jaHJvbml6ZWQ9ImZhbHNlIgpAQCAtMjEyODkyLDggKzIyMzQzMSw2IEBACiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgotPHBhcmFtZXRlciBuYW1lPSJhZGFwdGVyIiB0eXBlPSJhbmRyb2lkLndpZGdldC5MaXN0QWRhcHRlciI+Ci08L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXRDb2x1bW5XaWR0aCIKICByZXR1cm49InZvaWQiCkBAIC0yMTI5ODYsNiArMjIzNTIzLDE5IEBACiA8cGFyYW1ldGVyIG5hbWU9InZlcnRpY2FsU3BhY2luZyIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNtb290aFNjcm9sbEJ5T2Zmc2V0IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ib2Zmc2V0IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxmaWVsZCBuYW1lPSJBVVRPX0ZJVCIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTIxNDA1Nyw2ICsyMjQ2MDcsMjAgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iYXR0cnMiIHR5cGU9ImFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQiPgogPC9wYXJhbWV0ZXI+CiA8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IkxpbmVhckxheW91dCIKKyB0eXBlPSJhbmRyb2lkLndpZGdldC5MaW5lYXJMYXlvdXQiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iYXR0cnMiIHR5cGU9ImFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImRlZlN0eWxlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgogPG1ldGhvZCBuYW1lPSJnZXRCYXNlbGluZUFsaWduZWRDaGlsZEluZGV4IgogIHJldHVybj0iaW50IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIxNDEwMSw2ICsyMjQ2NjUsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaXNNZWFzdXJlV2l0aExhcmdlc3RDaGlsZEVuYWJsZWQiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9Im9uTGF5b3V0IgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMTQxNzQsNiArMjI0NzQ5LDE5IEBACiA8cGFyYW1ldGVyIG5hbWU9Imhvcml6b250YWxHcmF2aXR5IiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0TWVhc3VyZVdpdGhMYXJnZXN0Q2hpbGRFbmFibGVkIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZW5hYmxlZCIgdHlwZT0iYm9vbGVhbiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXRPcmllbnRhdGlvbiIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjE0MzcwLDYgKzIyNDk1OCw2OTEgQEAKIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+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+CiA8Y2xhc3MgbmFtZT0iTGlzdFZpZXciCiAgZXh0ZW5kcz0iYW5kcm9pZC53aWRnZXQuQWJzTGlzdFZpZXciCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjE0NDc0LDE3ICsyMjU3NDcsNiBAQAogPHBhcmFtZXRlciBuYW1lPSJ2IiB0eXBlPSJhbmRyb2lkLnZpZXcuVmlldyI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJjbGVhckNob2ljZXMiCi0gcmV0dXJuPSJ2b2lkIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImZpbmRWaWV3VHJhdmVyc2FsIgogIHJldHVybj0iYW5kcm9pZC52aWV3LlZpZXciCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjE0NTMzLDUwICsyMjU3OTUsNiBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJnZXRDaGVja2VkSXRlbUlkcyIKLSByZXR1cm49ImxvbmdbXSIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJnZXRDaGVja2VkSXRlbVBvc2l0aW9uIgotIHJldHVybj0iaW50IgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9ImdldENoZWNrZWRJdGVtUG9zaXRpb25zIgotIHJldHVybj0iYW5kcm9pZC51dGlsLlNwYXJzZUJvb2xlYW5BcnJheSIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJnZXRDaG9pY2VNb2RlIgotIHJldHVybj0iaW50IgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldERpdmlkZXIiCiAgcmV0dXJuPSJhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIxNDY0MywxOSArMjI1ODYxLDYgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iaXNJdGVtQ2hlY2tlZCIKLSByZXR1cm49ImJvb2xlYW4iCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9InBvc2l0aW9uIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KIDxtZXRob2QgbmFtZT0icmVtb3ZlRm9vdGVyVmlldyIKICByZXR1cm49ImJvb2xlYW4iCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjE0NjgyLDMyICsyMjU4ODcsNiBAQAogPHBhcmFtZXRlciBuYW1lPSJ2IiB0eXBlPSJhbmRyb2lkLnZpZXcuVmlldyI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJzZXRBZGFwdGVyIgotIHJldHVybj0idm9pZCIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0iYWRhcHRlciIgdHlwZT0iYW5kcm9pZC53aWRnZXQuTGlzdEFkYXB0ZXIiPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0ic2V0Q2hvaWNlTW9kZSIKLSByZXR1cm49InZvaWQiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9ImNob2ljZU1vZGUiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXREaXZpZGVyIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMTQ3NjAsMjEgKzIyNTkzOSw2IEBACiA8cGFyYW1ldGVyIG5hbWU9ImhlYWRlckRpdmlkZXJzRW5hYmxlZCIgdHlwZT0iYm9vbGVhbiI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJzZXRJdGVtQ2hlY2tlZCIKLSByZXR1cm49InZvaWQiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9InBvc2l0aW9uIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJib29sZWFuIj4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNldEl0ZW1zQ2FuRm9jdXMiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIxNDgyNywzOSArMjI1OTkxLDE5IEBACiA8cGFyYW1ldGVyIG5hbWU9InkiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgotPGZpZWxkIG5hbWU9IkNIT0lDRV9NT0RFX01VTFRJUExFIgotIHR5cGU9ImludCIKLSB0cmFuc2llbnQ9ImZhbHNlIgotIHZvbGF0aWxlPSJmYWxzZSIKLSB2YWx1ZT0iMiIKLSBzdGF0aWM9InRydWUiCi0gZmluYWw9InRydWUiCis8bWV0aG9kIG5hbWU9InNtb290aFNjcm9sbEJ5T2Zmc2V0IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KLTwvZmllbGQ+Ci08ZmllbGQgbmFtZT0iQ0hPSUNFX01PREVfTk9ORSIKLSB0eXBlPSJpbnQiCi0gdHJhbnNpZW50PSJmYWxzZSIKLSB2b2xhdGlsZT0iZmFsc2UiCi0gdmFsdWU9IjAiCi0gc3RhdGljPSJ0cnVlIgotIGZpbmFsPSJ0cnVlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvZmllbGQ+Ci08ZmllbGQgbmFtZT0iQ0hPSUNFX01PREVfU0lOR0xFIgotIHR5cGU9ImludCIKLSB0cmFuc2llbnQ9ImZhbHNlIgotIHZvbGF0aWxlPSJmYWxzZSIKLSB2YWx1ZT0iMSIKLSBzdGF0aWM9InRydWUiCi0gZmluYWw9InRydWUiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9maWVsZD4KKzxwYXJhbWV0ZXIgbmFtZT0ib2Zmc2V0IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDwvY2xhc3M+CiA8Y2xhc3MgbmFtZT0iTGlzdFZpZXcuRml4ZWRWaWV3SW5mbyIKICBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgpAQCAtMjE1MzU5LDYgKzIyNjUwMywxMDUgQEAKIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+CiA8L2ludGVyZmFjZT4KKzxjbGFzcyBuYW1lPSJQb3B1cE1lbnUiCisgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9IlBvcHVwTWVudSIKKyB0eXBlPSJhbmRyb2lkLndpZGdldC5Qb3B1cE1lbnUiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iYW5jaG9yIiB0eXBlPSJhbmRyb2lkLnZpZXcuVmlldyI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImRpc21pc3MiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldE1lbnUiCisgcmV0dXJuPSJhbmRyb2lkLnZpZXcuTWVudSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRNZW51SW5mbGF0ZXIiCisgcmV0dXJuPSJhbmRyb2lkLnZpZXcuTWVudUluZmxhdGVyIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldE9uTWVudUl0ZW1DbGlja0xpc3RlbmVyIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibGlzdGVuZXIiIHR5cGU9ImFuZHJvaWQud2lkZ2V0LlBvcHVwTWVudS5Pbk1lbnVJdGVtQ2xpY2tMaXN0ZW5lciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzaG93IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPC9jbGFzcz4KKzxpbnRlcmZhY2UgbmFtZT0iUG9wdXBNZW51Lk9uTWVudUl0ZW1DbGlja0xpc3RlbmVyIgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPG1ldGhvZCBuYW1lPSJvbk1lbnVJdGVtQ2xpY2siCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Iml0ZW0iIHR5cGU9ImFuZHJvaWQudmlldy5NZW51SXRlbSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPC9pbnRlcmZhY2U+CiA8Y2xhc3MgbmFtZT0iUG9wdXBXaW5kb3ciCiAgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMTU0MTAsNiArMjI2NjUzLDIyIEBACiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgorPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iYXR0cnMiIHR5cGU9ImFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImRlZlN0eWxlQXR0ciIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJkZWZTdHlsZVJlcyIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJQb3B1cFdpbmRvdyIKKyB0eXBlPSJhbmRyb2lkLndpZGdldC5Qb3B1cFdpbmRvdyIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+CiA8L2NvbnN0cnVjdG9yPgogPGNvbnN0cnVjdG9yIG5hbWU9IlBvcHVwV2luZG93IgogIHR5cGU9ImFuZHJvaWQud2lkZ2V0LlBvcHVwV2luZG93IgpAQCAtMjE2NDM5LDYgKzIyNzY5OCwxNyBAQAogPHBhcmFtZXRlciBuYW1lPSJleGNsdWRlTWltZXMiIHR5cGU9ImphdmEubGFuZy5TdHJpbmdbXSI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRJbWFnZVRvRGVmYXVsdCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0TW9kZSIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjE3NjU0LDYgKzIyODkyNCwyMyBAQAogPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEludGVudCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InZpZXdJZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJtZXRob2ROYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkludGVudCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXRMb25nIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMTc3MDUsNiArMjI4OTkyLDUxIEBACiA8cGFyYW1ldGVyIG5hbWU9ImluZGV0ZXJtaW5hdGUiIHR5cGU9ImJvb2xlYW4iPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0UmVsYXRpdmVTY3JvbGxQb3NpdGlvbiIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InZpZXdJZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJvZmZzZXQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRSZW1vdGVBZGFwdGVyIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idmlld0lkIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImludGVudCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkludGVudCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRTY3JvbGxQb3NpdGlvbiIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InZpZXdJZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJwb3NpdGlvbiIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNldFNob3J0IgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMTc4MDEsNiArMjI5MTMzLDMyIEBACiA8cGFyYW1ldGVyIG5hbWU9InZpc2liaWxpdHkiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzaG93TmV4dCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InZpZXdJZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNob3dQcmV2aW91cyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InZpZXdJZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9IndyaXRlVG9QYXJjZWwiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIxNzg2Nyw2ICsyMjkyMjUsMTYwIEBACiA8aW1wbGVtZW50cyBuYW1lPSJqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uIj4KIDwvaW1wbGVtZW50cz4KIDwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iUmVtb3RlVmlld3NTZXJ2aWNlIgorIGV4dGVuZHM9ImFuZHJvaWQuYXBwLlNlcnZpY2UiCisgYWJzdHJhY3Q9InRydWUiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9IlJlbW90ZVZpZXdzU2VydmljZSIKKyB0eXBlPSJhbmRyb2lkLndpZGdldC5SZW1vdGVWaWV3c1NlcnZpY2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0ib25CaW5kIgorIHJldHVybj0iYW5kcm9pZC5vcy5JQmluZGVyIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJpbnRlbnQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5JbnRlbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25HZXRWaWV3RmFjdG9yeSIKKyByZXR1cm49ImFuZHJvaWQud2lkZ2V0LlJlbW90ZVZpZXdzU2VydmljZS5SZW1vdGVWaWV3c0ZhY3RvcnkiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaW50ZW50IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuSW50ZW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2NsYXNzPgorPGludGVyZmFjZSBuYW1lPSJSZW1vdGVWaWV3c1NlcnZpY2UuUmVtb3RlVmlld3NGYWN0b3J5IgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPG1ldGhvZCBuYW1lPSJnZXRDb3VudCIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEl0ZW1JZCIKKyByZXR1cm49ImxvbmciCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icG9zaXRpb24iIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRMb2FkaW5nVmlldyIKKyByZXR1cm49ImFuZHJvaWQud2lkZ2V0LlJlbW90ZVZpZXdzIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0Vmlld0F0IgorIHJldHVybj0iYW5kcm9pZC53aWRnZXQuUmVtb3RlVmlld3MiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icG9zaXRpb24iIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRWaWV3VHlwZUNvdW50IgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaGFzU3RhYmxlSWRzIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uQ3JlYXRlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uRGF0YVNldENoYW5nZWQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25EZXN0cm95IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8L2ludGVyZmFjZT4KIDxjbGFzcyBuYW1lPSJSZXNvdXJjZUN1cnNvckFkYXB0ZXIiCiAgZXh0ZW5kcz0iYW5kcm9pZC53aWRnZXQuQ3Vyc29yQWRhcHRlciIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTIxNzkwNSw2ICsyMjk0MTcsMjIgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iYXV0b1JlcXVlcnkiIHR5cGU9ImJvb2xlYW4iPgogPC9wYXJhbWV0ZXI+CiA8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlJlc291cmNlQ3Vyc29yQWRhcHRlciIKKyB0eXBlPSJhbmRyb2lkLndpZGdldC5SZXNvdXJjZUN1cnNvckFkYXB0ZXIiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibGF5b3V0IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImMiIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJmbGFncyIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KIDxtZXRob2QgbmFtZT0ibmV3VmlldyIKICByZXR1cm49ImFuZHJvaWQudmlldy5WaWV3IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIxOTk4NSw2ICsyMzE1MTMsMjggQEAKIDxwYXJhbWV0ZXIgbmFtZT0icHJvbXB0SWQiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPGZpZWxkIG5hbWU9Ik1PREVfRElBTE9HIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJNT0RFX0RST1BET1dOIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDwvY2xhc3M+CiA8aW50ZXJmYWNlIG5hbWU9IlNwaW5uZXJBZGFwdGVyIgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMjIwMDEzLDYgKzIzMTU2MywzNyBAQAogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KIDwvaW50ZXJmYWNlPgorPGNsYXNzIG5hbWU9IlN0YWNrVmlldyIKKyBleHRlbmRzPSJhbmRyb2lkLndpZGdldC5BZGFwdGVyVmlld0FuaW1hdG9yIgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iU3RhY2tWaWV3IgorIHR5cGU9ImFuZHJvaWQud2lkZ2V0LlN0YWNrVmlldyIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTdGFja1ZpZXciCisgdHlwZT0iYW5kcm9pZC53aWRnZXQuU3RhY2tWaWV3IgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImF0dHJzIiB0eXBlPSJhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0Ij4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzwvY2xhc3M+CiA8Y2xhc3MgbmFtZT0iVGFiSG9zdCIKICBleHRlbmRzPSJhbmRyb2lkLndpZGdldC5GcmFtZUxheW91dCIKICBhYnN0cmFjdD0iZmFsc2UiCmRpZmYgLS1naXQgYS9jbWRzL2FtL3NyYy9jb20vYW5kcm9pZC9jb21tYW5kcy9hbS9BbS5qYXZhIGIvY21kcy9hbS9zcmMvY29tL2FuZHJvaWQvY29tbWFuZHMvYW0vQW0uamF2YQppbmRleCAzMDE4ODNmLi40MjY1Y2M1IDEwMDY0NAotLS0gYS9jbWRzL2FtL3NyYy9jb20vYW5kcm9pZC9jb21tYW5kcy9hbS9BbS5qYXZhCisrKyBiL2NtZHMvYW0vc3JjL2NvbS9hbmRyb2lkL2NvbW1hbmRzL2FtL0FtLmphdmEKQEAgLTk4LDYgKzk4LDggQEAKICAgICAgICAgICAgIHNlbmRCcm9hZGNhc3QoKTsKICAgICAgICAgfSBlbHNlIGlmIChvcC5lcXVhbHMoInByb2ZpbGUiKSkgewogICAgICAgICAgICAgcnVuUHJvZmlsZSgpOworICAgICAgICB9IGVsc2UgaWYgKG9wLmVxdWFscygiZHVtcGhlYXAiKSkgeworICAgICAgICAgICAgcnVuRHVtcEhlYXAoKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVua25vd24gY29tbWFuZDogIiArIG9wKTsKICAgICAgICAgfQpAQCAtMTQwLDYgKzE0MiwxMSBAQAogICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IG5leHRBcmdSZXF1aXJlZCgpOwogICAgICAgICAgICAgICAgIGludGVudC5wdXRFeHRyYShrZXksIEludGVnZXIudmFsdWVPZih2YWx1ZSkpOwogICAgICAgICAgICAgICAgIGhhc0ludGVudEluZm8gPSB0cnVlOworICAgICAgICAgICAgfSBlbHNlIGlmIChvcHQuZXF1YWxzKCItLWVsIikpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcga2V5ID0gbmV4dEFyZ1JlcXVpcmVkKCk7CisgICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gbmV4dEFyZ1JlcXVpcmVkKCk7CisgICAgICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKGtleSwgTG9uZy52YWx1ZU9mKHZhbHVlKSk7CisgICAgICAgICAgICAgICAgaGFzSW50ZW50SW5mbyA9IHRydWU7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKG9wdC5lcXVhbHMoIi0tZXoiKSkgewogICAgICAgICAgICAgICAgIFN0cmluZyBrZXkgPSBuZXh0QXJnUmVxdWlyZWQoKTsKICAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBuZXh0QXJnUmVxdWlyZWQoKTsKQEAgLTQyNCw2ICs0MzEsMjggQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIHByaXZhdGUgdm9pZCBydW5EdW1wSGVhcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBib29sZWFuIG1hbmFnZWQgPSAhIi1uIi5lcXVhbHMobmV4dE9wdGlvbigpKTsKKyAgICAgICAgU3RyaW5nIHByb2Nlc3MgPSBuZXh0QXJnUmVxdWlyZWQoKTsKKyAgICAgICAgU3RyaW5nIGhlYXBGaWxlID0gbmV4dEFyZ1JlcXVpcmVkKCk7CisgICAgICAgIFBhcmNlbEZpbGVEZXNjcmlwdG9yIGZkID0gbnVsbDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgZmQgPSBQYXJjZWxGaWxlRGVzY3JpcHRvci5vcGVuKAorICAgICAgICAgICAgICAgICAgICBuZXcgRmlsZShoZWFwRmlsZSksCisgICAgICAgICAgICAgICAgICAgIFBhcmNlbEZpbGVEZXNjcmlwdG9yLk1PREVfQ1JFQVRFIHwKKyAgICAgICAgICAgICAgICAgICAgUGFyY2VsRmlsZURlc2NyaXB0b3IuTU9ERV9UUlVOQ0FURSB8CisgICAgICAgICAgICAgICAgICAgIFBhcmNlbEZpbGVEZXNjcmlwdG9yLk1PREVfUkVBRF9XUklURSk7CisgICAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkVycm9yOiBVbmFibGUgdG8gb3BlbiBmaWxlOiAiICsgaGVhcEZpbGUpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFtQW0uZHVtcEhlYXAocHJvY2VzcywgbWFuYWdlZCwgaGVhcEZpbGUsIGZkKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEFuZHJvaWRFeGNlcHRpb24oIkhFQVAgRFVNUCBGQUlMRUQgb24gcHJvY2VzcyAiICsgcHJvY2Vzcyk7CisgICAgICAgIH0KKyAgICB9CisKICAgICBwcml2YXRlIGNsYXNzIEludGVudFJlY2VpdmVyIGV4dGVuZHMgSUludGVudFJlY2VpdmVyLlN0dWIgewogICAgICAgICBwcml2YXRlIGJvb2xlYW4gbUZpbmlzaGVkID0gZmFsc2U7CiAKQEAgLTU5Myw2ICs2MjIsOCBAQAogICAgICAgICAgICAgICAgICJcbiIgKwogICAgICAgICAgICAgICAgICIgICAgc3RhcnQgcHJvZmlsaW5nOiBhbSBwcm9maWxlIDxQUk9DRVNTPiBzdGFydCA8RklMRT5cbiIgKwogICAgICAgICAgICAgICAgICIgICAgc3RvcCBwcm9maWxpbmc6IGFtIHByb2ZpbGUgPFBST0NFU1M+IHN0b3BcbiIgKworICAgICAgICAgICAgICAgICIgICAgZHVtcCBoZWFwOiBhbSBkdW1waGVhcCBbZmxhZ3NdIDxQUk9DRVNTPiA8RklMRT5cbiIgKworICAgICAgICAgICAgICAgICIgICAgICAgIC1uOiBkdW1wIG5hdGl2ZSBoZWFwIGluc3RlYWQgb2YgbWFuYWdlZCBoZWFwXG4iICsKICAgICAgICAgICAgICAgICAiXG4iICsKICAgICAgICAgICAgICAgICAiICAgIDxJTlRFTlQ+IHNwZWNpZmljYXRpb25zIGluY2x1ZGUgdGhlc2UgZmxhZ3M6XG4iICsKICAgICAgICAgICAgICAgICAiICAgICAgICBbLWEgPEFDVElPTj5dIFstZCA8REFUQV9VUkk+XSBbLXQgPE1JTUVfVFlQRT5dXG4iICsKQEAgLTYwMCw3ICs2MzEsOCBAQAogICAgICAgICAgICAgICAgICIgICAgICAgIFstZXwtLWVzIDxFWFRSQV9LRVk+IDxFWFRSQV9TVFJJTkdfVkFMVUU+IC4uLl1cbiIgKwogICAgICAgICAgICAgICAgICIgICAgICAgIFstLWVzbiA8RVhUUkFfS0VZPiAuLi5dXG4iICsKICAgICAgICAgICAgICAgICAiICAgICAgICBbLS1leiA8RVhUUkFfS0VZPiA8RVhUUkFfQk9PTEVBTl9WQUxVRT4gLi4uXVxuIiArCi0gICAgICAgICAgICAgICAgIiAgICAgICAgWy1lfC0tZWkgPEVYVFJBX0tFWT4gPEVYVFJBX0lOVF9WQUxVRT4gLi4uXVxuIiArCisgICAgICAgICAgICAgICAgIiAgICAgICAgWy0tZWkgPEVYVFJBX0tFWT4gPEVYVFJBX0lOVF9WQUxVRT4gLi4uXVxuIiArCisgICAgICAgICAgICAgICAgIiAgICAgICAgWy0tZWwgPEVYVFJBX0tFWT4gPEVYVFJBX0xPTkdfVkFMVUU+IC4uLl1cbiIgKwogICAgICAgICAgICAgICAgICIgICAgICAgIFstbiA8Q09NUE9ORU5UPl0gWy1mIDxGTEFHUz5dXG4iICsKICAgICAgICAgICAgICAgICAiICAgICAgICBbLS1ncmFudC1yZWFkLXVyaS1wZXJtaXNzaW9uXSBbLS1ncmFudC13cml0ZS11cmktcGVybWlzc2lvbl1cbiIgKwogICAgICAgICAgICAgICAgICIgICAgICAgIFstLWRlYnVnLWxvZy1yZXNvbHV0aW9uXVxuIiArCmRpZmYgLS1naXQgYS9jbWRzL2R1bXBzdGF0ZS9kdW1wc3RhdGUuYyBiL2NtZHMvZHVtcHN0YXRlL2R1bXBzdGF0ZS5jCmluZGV4IDA4MmU3MDQuLjhmMzY0MmMgMTAwNjQ0Ci0tLSBhL2NtZHMvZHVtcHN0YXRlL2R1bXBzdGF0ZS5jCisrKyBiL2NtZHMvZHVtcHN0YXRlL2R1bXBzdGF0ZS5jCkBAIC0zOSw2ICszOSw4IEBACiBzdGF0aWMgY2hhciBjbWRsaW5lX2J1ZlsxNjM4NF0gPSAiKHVua25vd24pIjsKIHN0YXRpYyBjb25zdCBjaGFyICpkdW1wX3RyYWNlc19wYXRoID0gTlVMTDsKIAorc3RhdGljIGNoYXIgc2NyZWVuc2hvdF9wYXRoW1BBVEhfTUFYXSA9ICIiOworCiAvKiBkdW1wcyB0aGUgY3VycmVudCBzeXN0ZW0gc3RhdGUgdG8gc3Rkb3V0ICovCiBzdGF0aWMgdm9pZCBkdW1wc3RhdGUoKSB7CiAgICAgdGltZV90IG5vdyA9IHRpbWUoTlVMTCk7CkBAIC03Niw2ICs3OCwxMiBAQAogICAgIGR1bXBfZmlsZSgiU0xBQiBJTkZPIiwgIi9wcm9jL3NsYWJpbmZvIik7CiAgICAgZHVtcF9maWxlKCJaT05FSU5GTyIsICIvcHJvYy96b25laW5mbyIpOwogCisgICAgaWYgKHNjcmVlbnNob3RfcGF0aFswXSkgeworICAgICAgICBMT0dJKCJ0YWtpbmcgc2NyZWVuc2hvdFxuIik7CisgICAgICAgIHJ1bl9jb21tYW5kKE5VTEwsIDUsICJzdSIsICJyb290IiwgInNjcmVlbnNob3QiLCBzY3JlZW5zaG90X3BhdGgsIE5VTEwpOworICAgICAgICBMT0dJKCJ3cm90ZSBzY3JlZW5zaG90OiAlc1xuIiwgc2NyZWVuc2hvdF9wYXRoKTsKKyAgICB9CisKICAgICBydW5fY29tbWFuZCgiU1lTVEVNIExPRyIsIDIwLCAibG9nY2F0IiwgIi12IiwgInRpbWUiLCAiLWQiLCAiKjp2IiwgTlVMTCk7CiAKICAgICAvKiBzaG93IHRoZSB0cmFjZXMgd2UgY29sbGVjdGVkIGluIG1haW4oKSwgaWYgdGhhdCB3YXMgZG9uZSAqLwpAQCAtMTAzLDYgKzExMSw5IEBACiAgICAgZHVtcF9maWxlKCJORVRXT1JLIFJPVVRFUyIsICIvcHJvYy9uZXQvcm91dGUiKTsKICAgICBkdW1wX2ZpbGUoIkFSUCBDQUNIRSIsICIvcHJvYy9uZXQvYXJwIik7CiAKKyAgICBydW5fY29tbWFuZCgiV0lGSSBORVRXT1JLUyIsIDIwLAorICAgICAgICAgICAgInN1IiwgInJvb3QiLCAid3BhX2NsaSIsICJsaXN0X25ldHdvcmtzIiwgTlVMTCk7CisKICNpZmRlZiBGV0RVTVBfYmNtNDMyOQogICAgIHJ1bl9jb21tYW5kKCJEVU1QIFdJRkkgRklSTVdBUkUgTE9HIiwgNjAsCiAgICAgICAgICAgICAic3UiLCAicm9vdCIsICJkaGR1dGlsIiwgIi1pIiwgImV0aDAiLCAidXBsb2FkIiwgIi9kYXRhL2xvY2FsL3RtcC93bGFuX2NyYXNoLmR1bXAiLCBOVUxMKTsKQEAgLTE2NCwxOCArMTc1LDI1IEBACiB9CiAKIHN0YXRpYyB2b2lkIHVzYWdlKCkgewotICAgIGZwcmludGYoc3RkZXJyLCAidXNhZ2U6IGR1bXBzdGF0ZSBbLWRdIFstbyBmaWxlXSBbLXNdIFstel1cbiIKLSAgICAgICAgICAgICIgIC1kOiBhcHBlbmQgZGF0ZSB0byBmaWxlbmFtZSAocmVxdWlyZXMgLW8pXG4iCisgICAgZnByaW50ZihzdGRlcnIsICJ1c2FnZTogZHVtcHN0YXRlIFstYiBzb3VuZGZpbGVdIFstZSBzb3VuZGZpbGVdIFstbyBmaWxlIFstZF0gWy1wXSBbLXpdXSBbLXNdXG4iCiAgICAgICAgICAgICAiICAtbzogd3JpdGUgdG8gZmlsZSAoaW5zdGVhZCBvZiBzdGRvdXQpXG4iCisgICAgICAgICAgICAiICAtZDogYXBwZW5kIGRhdGUgdG8gZmlsZW5hbWUgKHJlcXVpcmVzIC1vKVxuIgorICAgICAgICAgICAgIiAgLXo6IGd6aXAgb3V0cHV0IChyZXF1aXJlcyAtbylcbiIKKyAgICAgICAgICAgICIgIC1wOiBjYXB0dXJlIHNjcmVlbnNob3QgdG8gZmlsZW5hbWUucG5nIChyZXF1aXJlcyAtbylcbiIKICAgICAgICAgICAgICIgIC1zOiB3cml0ZSBvdXRwdXQgdG8gY29udHJvbCBzb2NrZXQgKGZvciBpbml0KVxuIgotICAgICAgICAgICAgIiAgLXo6IGd6aXAgb3V0cHV0IChyZXF1aXJlcyAtbylcbiIpOworICAgICAgICAgICAgIiAgLWI6IHBsYXkgc291bmQgZmlsZSBpbnN0ZWFkIG9mIHZpYnJhdGUsIGF0IGJlZ2lubmluZyBvZiBqb2JcbiIKKyAgICAgICAgICAgICIgIC1lOiBwbGF5IHNvdW5kIGZpbGUgaW5zdGVhZCBvZiB2aWJyYXRlLCBhdCBlbmQgb2Ygam9iXG4iCisJCSk7CiB9CiAKIGludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pIHsKICAgICBpbnQgZG9fYWRkX2RhdGUgPSAwOwogICAgIGludCBkb19jb21wcmVzcyA9IDA7CiAgICAgY2hhciogdXNlX291dGZpbGUgPSAwOworICAgIGNoYXIqIGJlZ2luX3NvdW5kID0gMDsKKyAgICBjaGFyKiBlbmRfc291bmQgPSAwOwogICAgIGludCB1c2Vfc29ja2V0ID0gMDsKKyAgICBpbnQgZG9fZmIgPSAwOwogCiAgICAgTE9HSSgiYmVnaW5cbiIpOwogCkBAIC0xOTEsMTMgKzIwOSwxNiBAQAogICAgIGR1bXBfdHJhY2VzX3BhdGggPSBkdW1wX3ZtX3RyYWNlcygpOwogCiAgICAgaW50IGM7Ci0gICAgd2hpbGUgKChjID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICJkaG86c3Z6IikpICE9IC0xKSB7CisgICAgd2hpbGUgKChjID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICJiOmRlOmhvOnN2enAiKSkgIT0gLTEpIHsKICAgICAgICAgc3dpdGNoIChjKSB7CisgICAgICAgICAgICBjYXNlICdiJzogYmVnaW5fc291bmQgPSBvcHRhcmc7ICBicmVhazsKICAgICAgICAgICAgIGNhc2UgJ2QnOiBkb19hZGRfZGF0ZSA9IDE7ICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnZSc6IGVuZF9zb3VuZCA9IG9wdGFyZzsgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlICdvJzogdXNlX291dGZpbGUgPSBvcHRhcmc7ICBicmVhazsKICAgICAgICAgICAgIGNhc2UgJ3MnOiB1c2Vfc29ja2V0ID0gMTsgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSAndic6IGJyZWFrOyAgLy8gY29tcGF0aWJpbGl0eSBuby1vcAogICAgICAgICAgICAgY2FzZSAneic6IGRvX2NvbXByZXNzID0gNjsgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdwJzogZG9fZmIgPSAxOyAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgJz8nOiBwcmludGYoIlxuIik7CiAgICAgICAgICAgICBjYXNlICdoJzoKICAgICAgICAgICAgICAgICB1c2FnZSgpOwpAQCAtMjM0LDYgKzI1NSwxMCBAQAogICAgICAgICAgICAgc3RyZnRpbWUoZGF0ZSwgc2l6ZW9mKGRhdGUpLCAiLSVZLSVtLSVkLSVILSVNLSVTIiwgbG9jYWx0aW1lKCZub3cpKTsKICAgICAgICAgICAgIHN0cmxjYXQocGF0aCwgZGF0ZSwgc2l6ZW9mKHBhdGgpKTsKICAgICAgICAgfQorICAgICAgICBpZiAoZG9fZmIpIHsKKyAgICAgICAgICAgIHN0cmxjcHkoc2NyZWVuc2hvdF9wYXRoLCBwYXRoLCBzaXplb2Yoc2NyZWVuc2hvdF9wYXRoKSk7CisgICAgICAgICAgICBzdHJsY2F0KHNjcmVlbnNob3RfcGF0aCwgIi5wbmciLCBzaXplb2Yoc2NyZWVuc2hvdF9wYXRoKSk7CisgICAgICAgIH0KICAgICAgICAgc3RybGNhdChwYXRoLCAiLnR4dCIsIHNpemVvZihwYXRoKSk7CiAgICAgICAgIGlmIChkb19jb21wcmVzcykgc3RybGNhdChwYXRoLCAiLmd6Iiwgc2l6ZW9mKHBhdGgpKTsKICAgICAgICAgc3RybGNweSh0bXBfcGF0aCwgcGF0aCwgc2l6ZW9mKHRtcF9wYXRoKSk7CkBAIC0yNDEsMTYgKzI2NiwxOCBAQAogICAgICAgICBnemlwX3BpZCA9IHJlZGlyZWN0X3RvX2ZpbGUoc3Rkb3V0LCB0bXBfcGF0aCwgZG9fY29tcHJlc3MpOwogICAgIH0KIAotICAgIC8qIGJ6enp6enogKi8KLSAgICBpZiAodmlicmF0b3IpIHsKKyAgICBpZiAoYmVnaW5fc291bmQpIHsKKyAgICAgICAgcGxheV9zb3VuZChiZWdpbl9zb3VuZCk7CisgICAgfSBlbHNlIGlmICh2aWJyYXRvcikgewogICAgICAgICBmcHV0cygiMTUwIiwgdmlicmF0b3IpOwogICAgICAgICBmZmx1c2godmlicmF0b3IpOwogICAgIH0KIAogICAgIGR1bXBzdGF0ZSgpOwogCi0gICAgLyogYnp6eiBienp6IGJ6enogKi8KLSAgICBpZiAodmlicmF0b3IpIHsKKyAgICBpZiAoZW5kX3NvdW5kKSB7CisgICAgICAgIHBsYXlfc291bmQoZW5kX3NvdW5kKTsKKyAgICB9IGVsc2UgaWYgKHZpYnJhdG9yKSB7CiAgICAgICAgIGludCBpOwogICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CiAgICAgICAgICAgICBmcHV0cygiNzVcbiIsIHZpYnJhdG9yKTsKZGlmZiAtLWdpdCBhL2NtZHMvZHVtcHN0YXRlL2R1bXBzdGF0ZS5oIGIvY21kcy9kdW1wc3RhdGUvZHVtcHN0YXRlLmgKaW5kZXggNjgyZWFmZC4uODNiMWQxMSAxMDA2NDQKLS0tIGEvY21kcy9kdW1wc3RhdGUvZHVtcHN0YXRlLmgKKysrIGIvY21kcy9kdW1wc3RhdGUvZHVtcHN0YXRlLmgKQEAgLTQ0LDQgKzQ0LDcgQEAKIC8qIERpc3BsYXlzIGEgYmxvY2tlZCBwcm9jZXNzZXMgaW4ta2VybmVsIHdhaXQgY2hhbm5lbCAqLwogdm9pZCBzaG93X3djaGFuKGludCBwaWQsIGNvbnN0IGNoYXIgKm5hbWUpOwogCisvKiBQbGF5IGEgc291bmQgdmlhIFN0YWdlZnJpZ2h0ICovCit2b2lkIHBsYXlfc291bmQoY29uc3QgY2hhciogcGF0aCk7CisKICNlbmRpZiAvKiBfRFVNUFNUQVRFX0hfICovCmRpZmYgLS1naXQgYS9jbWRzL2R1bXBzdGF0ZS91dGlscy5jIGIvY21kcy9kdW1wc3RhdGUvdXRpbHMuYwppbmRleCBjN2E3OGNjLi5mOTJhY2JiYiAxMDA2NDQKLS0tIGEvY21kcy9kdW1wc3RhdGUvdXRpbHMuYworKysgYi9jbWRzL2R1bXBzdGF0ZS91dGlscy5jCkBAIC00MjksMyArNDI5LDcgQEAKICAgICByZW5hbWUoYW5yX3RyYWNlc19wYXRoLCB0cmFjZXNfcGF0aCk7CiAgICAgcmV0dXJuIGR1bXBfdHJhY2VzX3BhdGg7CiB9CisKK3ZvaWQgcGxheV9zb3VuZChjb25zdCBjaGFyKiBwYXRoKSB7CisgICAgcnVuX2NvbW1hbmQoTlVMTCwgNSwgIi9zeXN0ZW0vYmluL3N0YWdlZnJpZ2h0IiwgIi1vIiwgIi1hIiwgcGF0aCwgTlVMTCk7Cit9CmRpZmYgLS1naXQgYS9jbWRzL3NjcmVlbnNob3QvQW5kcm9pZC5tayBiL2NtZHMvc2NyZWVuc2hvdC9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5YzdhZWIKLS0tIC9kZXYvbnVsbAorKysgYi9jbWRzL3NjcmVlbnNob3QvQW5kcm9pZC5tawpAQCAtMCwwICsxLDE2IEBACitpZm5lcSAoJChUQVJHRVRfU0lNVUxBVE9SKSx0cnVlKQorCitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVMgOj0gc2NyZWVuc2hvdC5jCisKK0xPQ0FMX01PRFVMRSA6PSBzY3JlZW5zaG90CisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliY3V0aWxzIGxpYnoKK0xPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gbGlicG5nCitMT0NBTF9DX0lOQ0xVREVTICs9IGV4dGVybmFsL3psaWIKKworaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCisKK2VuZGlmCmRpZmYgLS1naXQgYS9jbWRzL3NjcmVlbnNob3Qvc2NyZWVuc2hvdC5jIGIvY21kcy9zY3JlZW5zaG90L3NjcmVlbnNob3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmU2NTA3Ci0tLSAvZGV2L251bGwKKysrIGIvY21kcy9zY3JlZW5zaG90L3NjcmVlbnNob3QuYwpAQCAtMCwwICsxLDExOCBAQAorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCisjaW5jbHVkZSA8bGludXgvZmIuaD4KKworI2luY2x1ZGUgPHpsaWIuaD4KKyNpbmNsdWRlIDxsaWJwbmcvcG5nLmg+CisKKyNpbmNsdWRlICJwcml2YXRlL2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcuaCIKKworI2RlZmluZSBMT0dfVEFHICJzY3JlZW5zaG90IgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCit2b2lkIHRha2Vfc2NyZWVuc2hvdChGSUxFICpmYl9pbiwgRklMRSAqZmJfb3V0KSB7CisgICAgaW50IGZiOworICAgIGNoYXIgaW1nYnVmWzB4MTAwMDBdOworICAgIHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyB2aW5mbzsKKyAgICBwbmdfc3RydWN0cCBwbmc7CisgICAgcG5nX2luZm9wIGluZm87CisgICAgdW5zaWduZWQgaW50IHIsYyxyb3dsZW47CisgICAgdW5zaWduZWQgaW50IGJ5dGVzcHAsb2Zmc2V0OworCisgICAgZmIgPSBmaWxlbm8oZmJfaW4pOworICAgIGlmKGZiIDwgMCkgeworICAgICAgICBMT0dFKCJmYWlsZWQgdG8gb3BlbiBmcmFtZWJ1ZmZlclxuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgZmJfaW4gPSBmZG9wZW4oZmIsICJyIik7CisKKyAgICBpZihpb2N0bChmYiwgRkJJT0dFVF9WU0NSRUVOSU5GTywgJnZpbmZvKSA8IDApIHsKKyAgICAgICAgTE9HRSgiZmFpbGVkIHRvIGdldCBmcmFtZWJ1ZmZlciBpbmZvXG4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBmY250bChmYiwgRl9TRVRGRCwgRkRfQ0xPRVhFQyk7CisKKyAgICBwbmcgPSBwbmdfY3JlYXRlX3dyaXRlX3N0cnVjdChQTkdfTElCUE5HX1ZFUl9TVFJJTkcsIE5VTEwsIE5VTEwsIE5VTEwpOworICAgIGlmIChwbmcgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJmYWlsZWQgcG5nX2NyZWF0ZV93cml0ZV9zdHJ1Y3RcbiIpOworICAgICAgICBmY2xvc2UoZmJfaW4pOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgcG5nX2luaXRfaW8ocG5nLCBmYl9vdXQpOworICAgIGluZm8gPSBwbmdfY3JlYXRlX2luZm9fc3RydWN0KHBuZyk7CisgICAgaWYgKGluZm8gPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJmYWlsZWQgcG5nX2NyZWF0ZV9pbmZvX3N0cnVjdFxuIik7CisgICAgICAgIHBuZ19kZXN0cm95X3dyaXRlX3N0cnVjdCgmcG5nLCBOVUxMKTsKKyAgICAgICAgZmNsb3NlKGZiX2luKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoc2V0am1wKHBuZ19qbXBidWYocG5nKSkpIHsKKyAgICAgICAgTE9HRSgiZmFpbGVkIHBuZyBzZXRqbXBcbiIpOworICAgICAgICBwbmdfZGVzdHJveV93cml0ZV9zdHJ1Y3QoJnBuZywgTlVMTCk7CisgICAgICAgIGZjbG9zZShmYl9pbik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBieXRlc3BwID0gdmluZm8uYml0c19wZXJfcGl4ZWwgLyA4OworICAgIHBuZ19zZXRfSUhEUihwbmcsIGluZm8sCisgICAgICAgIHZpbmZvLnhyZXMsIHZpbmZvLnlyZXMsIHZpbmZvLmJpdHNfcGVyX3BpeGVsIC8gNCwgCisgICAgICAgIFBOR19DT0xPUl9UWVBFX1JHQl9BTFBIQSwgUE5HX0lOVEVSTEFDRV9OT05FLAorICAgICAgICBQTkdfQ09NUFJFU1NJT05fVFlQRV9CQVNFLCBQTkdfRklMVEVSX1RZUEVfQkFTRSk7CisgICAgcG5nX3dyaXRlX2luZm8ocG5nLCBpbmZvKTsKKworICAgIHJvd2xlbj12aW5mby54cmVzICogYnl0ZXNwcDsKKyAgICBpZiAocm93bGVuID4gc2l6ZW9mKGltZ2J1ZikpIHsKKyAgICAgICAgTE9HRSgiY3Jhenkgcm93bGVuOiAlZFxuIiwgcm93bGVuKTsKKyAgICAgICAgcG5nX2Rlc3Ryb3lfd3JpdGVfc3RydWN0KCZwbmcsIE5VTEwpOworICAgICAgICBmY2xvc2UoZmJfaW4pOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgb2Zmc2V0ID0gdmluZm8ueG9mZnNldCAqIGJ5dGVzcHAgKyB2aW5mby54cmVzICogdmluZm8ueW9mZnNldCAqIGJ5dGVzcHA7CisgICAgZnNlZWsoZmJfaW4sIG9mZnNldCwgU0VFS19TRVQpOworCisgICAgZm9yKHI9MDsgcjx2aW5mby55cmVzOyByKyspIHsKKyAgICAgICAgaW50IGxlbiA9IGZyZWFkKGltZ2J1ZiwgMSwgcm93bGVuLCBmYl9pbik7CisgICAgICAgIGlmIChsZW4gPD0gMCkgYnJlYWs7CisgICAgICAgIHBuZ193cml0ZV9yb3cocG5nLCAocG5nX2J5dGVwKWltZ2J1Zik7CisgICAgfQorCisgICAgcG5nX3dyaXRlX2VuZChwbmcsIGluZm8pOworICAgIGZjbG9zZShmYl9pbik7CisgICAgcG5nX2Rlc3Ryb3lfd3JpdGVfc3RydWN0KCZwbmcsIE5VTEwpOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqYXJndikgeworICAgIEZJTEUgKnBuZyA9IE5VTEw7CisgICAgRklMRSAqZmJfaW4gPSBOVUxMOworICAgIGlmIChhcmdjIDwgMikgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInVzYWdlOiBzY3JlZW5zaG90IGZpbGVuYW1lLnBuZ1xuIik7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorICAgIGZiX2luID0gZm9wZW4oIi9kZXYvZ3JhcGhpY3MvZmIwIiwgInIiKTsKKyAgICBpZiAoIWZiX2luKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZXJyb3I6IGNvdWxkIG5vdCByZWFkIGZyYW1lYnVmZmVyXG4iKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9CisKKyAgICAvKiBzd2l0Y2ggdG8gbm9uLXJvb3QgdXNlciBhbmQgZ3JvdXAgKi8KKyAgICBnaWRfdCBncm91cHNbXSA9IHsgQUlEX0xPRywgQUlEX1NEQ0FSRF9SVyB9OworICAgIHNldGdyb3VwcyhzaXplb2YoZ3JvdXBzKS9zaXplb2YoZ3JvdXBzWzBdKSwgZ3JvdXBzKTsKKyAgICBzZXR1aWQoQUlEX1NIRUxMKTsKKworICAgIHBuZyA9IGZvcGVuKGFyZ3ZbMV0sICJ3Iik7CisgICAgaWYgKCFwbmcpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJlcnJvcjogd3JpdGluZyBmaWxlICVzOiAlc1xuIiwgYXJndlsxXSwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9CisKKyAgICB0YWtlX3NjcmVlbnNob3QoZmJfaW4sIHBuZyk7CisKKyAgICBleGl0KDApOworfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYWNjb3VudHMvQWNjb3VudE1hbmFnZXJTZXJ2aWNlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hY2NvdW50cy9BY2NvdW50TWFuYWdlclNlcnZpY2UuamF2YQppbmRleCAxZDllMGYxLi5lNmIxYzA4IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9hY2NvdW50cy9BY2NvdW50TWFuYWdlclNlcnZpY2UuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hY2NvdW50cy9BY2NvdW50TWFuYWdlclNlcnZpY2UuamF2YQpAQCAtMzk5LDE5ICszOTksMTkgQEAKIAogICAgIHByaXZhdGUgYm9vbGVhbiBpbnNlcnRBY2NvdW50SW50b0RhdGFiYXNlKEFjY291bnQgYWNjb3VudCwgU3RyaW5nIHBhc3N3b3JkLCBCdW5kbGUgZXh0cmFzKSB7CiAgICAgICAgIFNRTGl0ZURhdGFiYXNlIGRiID0gbU9wZW5IZWxwZXIuZ2V0V3JpdGFibGVEYXRhYmFzZSgpOworICAgICAgICBpZiAoYWNjb3VudCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgYm9vbGVhbiBub0Jyb2FkY2FzdCA9IGFjY291bnQudHlwZS5lcXVhbHMoR09PR0xFX0FDQ09VTlRfVFlQRSkKKyAgICAgICAgICAgICAgICAmJiBleHRyYXMgIT0gbnVsbCAmJiBleHRyYXMuZ2V0Qm9vbGVhbihOT19CUk9BRENBU1RfRkxBRywgZmFsc2UpOworICAgICAgICAvLyBSZW1vdmUgdGhlICdub2Jyb2FkY2FzdCcgZmxhZyBzaW5jZSB3ZSBkb24ndCB3YW50IGl0IHRvIHBlcnNpc3QgaW4gdGhlIGRiLiBJdCBpcyBpbnN0ZWFkCisgICAgICAgIC8vIHVzZWQgYXMgYSBjb250cm9sIHNpZ25hbCB0byBpbmRpY2F0ZSB3aGV0aGVyIG9yIG5vdCB0aGlzIGluc2VydGlvbiBzaG91bGQgcmVzdWx0IGluCisgICAgICAgIC8vIGFuIGFjY291bnRzIGNoYW5nZWQgYnJvYWRjYXN0IGJlaW5nIHNlbnQuCisgICAgICAgIGlmIChleHRyYXMgIT0gbnVsbCkgeworICAgICAgICAgICAgZXh0cmFzLnJlbW92ZShOT19CUk9BRENBU1RfRkxBRyk7CisgICAgICAgIH0KICAgICAgICAgZGIuYmVnaW5UcmFuc2FjdGlvbigpOwogICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKGFjY291bnQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJvb2xlYW4gbm9Ccm9hZGNhc3QgPSBmYWxzZTsKLSAgICAgICAgICAgIGlmIChhY2NvdW50LnR5cGUuZXF1YWxzKEdPT0dMRV9BQ0NPVU5UX1RZUEUpKSB7Ci0gICAgICAgICAgICAgICAgLy8gTG9vayBmb3IgdGhlICdub2Jyb2FkY2FzdCcgZmxhZyBhbmQgcmVtb3ZlIGl0IHNpbmNlIHdlIGRvbid0IHdhbnQgaXQgdG8gcGVyc2lzdAotICAgICAgICAgICAgICAgIC8vIGluIHRoZSBkYi4KLSAgICAgICAgICAgICAgICBub0Jyb2FkY2FzdCA9IGV4dHJhcy5nZXRCb29sZWFuKE5PX0JST0FEQ0FTVF9GTEFHLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgZXh0cmFzLnJlbW92ZShOT19CUk9BRENBU1RfRkxBRyk7Ci0gICAgICAgICAgICB9Ci0KICAgICAgICAgICAgIGxvbmcgbnVtTWF0Y2hlcyA9IERhdGFiYXNlVXRpbHMubG9uZ0ZvclF1ZXJ5KGRiLAogICAgICAgICAgICAgICAgICAgICAic2VsZWN0IGNvdW50KCopIGZyb20gIiArIFRBQkxFX0FDQ09VTlRTCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIFdIRVJFICIgKyBBQ0NPVU5UU19OQU1FICsgIj0/IEFORCAiICsgQUNDT1VOVFNfVFlQRSsgIj0/IiwKQEAgLTQzNiwxMyArNDM2LDEzIEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgZGIuc2V0VHJhbnNhY3Rpb25TdWNjZXNzZnVsKCk7Ci0gICAgICAgICAgICBpZiAoIW5vQnJvYWRjYXN0KSB7Ci0gICAgICAgICAgICAgICAgc2VuZEFjY291bnRzQ2hhbmdlZEJyb2FkY2FzdCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICBkYi5lbmRUcmFuc2FjdGlvbigpOwogICAgICAgICB9CisgICAgICAgIGlmICghbm9Ccm9hZGNhc3QpIHsKKyAgICAgICAgICAgIHNlbmRBY2NvdW50c0NoYW5nZWRCcm9hZGNhc3QoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKICAgICBwcml2YXRlIGxvbmcgaW5zZXJ0RXh0cmEoU1FMaXRlRGF0YWJhc2UgZGIsIGxvbmcgYWNjb3VudElkLCBTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpIHsKQEAgLTE2NTcsNyArMTY1Nyw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJvb2xlYW4gbmVlZHNQcm92aXNpb25pbmc7CiAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgbmVlZHNQcm92aXNpb25pbmcgPSB0ZWxlcGhvbnkuZ2V0Q2RtYU5lZWRzUHJvdmlzaW9uaW5nKCk7CisgICAgICAgICAgICAgICAgICAgIG5lZWRzUHJvdmlzaW9uaW5nID0gdGVsZXBob255Lm5lZWRzT3RhU2VydmljZVByb3Zpc2lvbmluZygpOwogICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgImV4Y2VwdGlvbiB3aGlsZSBjaGVja2luZyBwcm92aXNpb25pbmciLCBlKTsKICAgICAgICAgICAgICAgICAgICAgLy8gZGVmYXVsdCB0byBOT1Qgd2lwaW5nIG91dCB0aGUgcGFzc3dvcmRzCkBAIC0xNjgxLDExICsxNjgxLDExIEBACiAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgZGIuZXhlY1NRTCgiREVMRVRFIGZyb20gIiArIFRBQkxFX0FVVEhUT0tFTlMpOwogICAgICAgICAgICAgICAgICAgICBkYi5leGVjU1FMKCJVUERBVEUgIiArIFRBQkxFX0FDQ09VTlRTICsgIiBTRVQgIiArIEFDQ09VTlRTX1BBU1NXT1JEICsgIiA9ICcnIik7Ci0gICAgICAgICAgICAgICAgICAgIHNlbmRBY2NvdW50c0NoYW5nZWRCcm9hZGNhc3QoKTsKICAgICAgICAgICAgICAgICAgICAgZGIuc2V0VHJhbnNhY3Rpb25TdWNjZXNzZnVsKCk7CiAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgICAgICAgICAgZGIuZW5kVHJhbnNhY3Rpb24oKTsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2VuZEFjY291bnRzQ2hhbmdlZEJyb2FkY2FzdCgpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgc2V0TWV0YVZhbHVlKCJpbXNpIiwgaW1zaSk7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9BbmltYXRhYmxlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hbmltYXRpb24vQW5pbWF0YWJsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0OWNhOGYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hbmltYXRpb24vQW5pbWF0YWJsZS5qYXZhCkBAIC0wLDAgKzEsMTYwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmFuaW1hdGlvbjsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKKy8qKgorICogVGhpcyBpcyB0aGUgc3VwZXJjbGFzcyBmb3IgY2xhc3NlcyB3aGljaCBwcm92aWRlIGJhc2ljIHN1cHBvcnQgZm9yIGFuaW1hdGlvbnMgd2hpY2ggY2FuIGJlCisgKiBzdGFydGVkLCBlbmRlZCwgYW5kIGhhdmUgPGNvZGU+QW5pbWF0YWJsZUxpc3RlbmVyczwvY29kZT4gYWRkZWQgdG8gdGhlbS4KKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFuaW1hdGFibGUgaW1wbGVtZW50cyBDbG9uZWFibGUgeworCisKKyAgICAvKioKKyAgICAgKiBUaGUgc2V0IG9mIGxpc3RlbmVycyB0byBiZSBzZW50IGV2ZW50cyB0aHJvdWdoIHRoZSBsaWZlIG9mIGFuIGFuaW1hdGlvbi4KKyAgICAgKi8KKyAgICBBcnJheUxpc3Q8QW5pbWF0YWJsZUxpc3RlbmVyPiBtTGlzdGVuZXJzID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFN0YXJ0cyB0aGlzIGFuaW1hdGlvbi4gSWYgdGhlIGFuaW1hdGlvbiBoYXMgYSBub256ZXJvIHN0YXJ0RGVsYXksIHRoZSBhbmltYXRpb24gd2lsbCBzdGFydAorICAgICAqIHJ1bm5pbmcgYWZ0ZXIgdGhhdCBkZWxheSBlbGFwc2VzLiBOb3RlIHRoYXQgdGhlIGFuaW1hdGlvbiBkb2VzIG5vdCBzdGFydCBzeW5jaHJvbm91c2x5IHdpdGgKKyAgICAgKiB0aGlzIGNhbGwsIGJlY2F1c2UgYWxsIGFuaW1hdGlvbiBldmVudHMgYXJlIHBvc3RlZCB0byBhIGNlbnRyYWwgdGltaW5nIGxvb3Agc28gdGhhdCBhbmltYXRpb24KKyAgICAgKiB0aW1lcyBhcmUgYWxsIHN5bmNocm9uaXplZCBvbiBhIHNpbmdsZSB0aW1pbmcgcHVsc2Ugb24gdGhlIFVJIHRocmVhZC4gU28gdGhlIGFuaW1hdGlvbiB3aWxsCisgICAgICogc3RhcnQgdGhlIG5leHQgdGltZSB0aGF0IGV2ZW50IGhhbmRsZXIgcHJvY2Vzc2VzIGV2ZW50cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdGFydCgpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYW5jZWxzIHRoZSBhbmltYXRpb24uIFVubGlrZSB7QGxpbmsgI2VuZCgpfSwgPGNvZGU+Y2FuY2VsKCk8L2NvZGU+IGNhdXNlcyB0aGUgYW5pbWF0aW9uIHRvCisgICAgICogc3RvcCBpbiBpdHMgdHJhY2tzLCBzZW5kaW5nIGFuIHtAbGluayBBbmltYXRhYmxlTGlzdGVuZXIjb25BbmltYXRpb25DYW5jZWwoQW5pbWF0YWJsZSl9IHRvCisgICAgICogaXRzIGxpc3RlbmVycywgZm9sbG93ZWQgYnkgYW4ge0BsaW5rIEFuaW1hdGFibGVMaXN0ZW5lciNvbkFuaW1hdGlvbkVuZChBbmltYXRhYmxlKX0gbWVzc2FnZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjYW5jZWwoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogRW5kcyB0aGUgYW5pbWF0aW9uLiBUaGlzIGNhdXNlcyB0aGUgYW5pbWF0aW9uIHRvIGFzc2lnbiB0aGUgZW5kIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSBiZWluZworICAgICAqIGFuaW1hdGVkLCB0aGVuIGNhbGxpbmcgdGhlIHtAbGluayBBbmltYXRhYmxlTGlzdGVuZXIjb25BbmltYXRpb25FbmQoQW5pbWF0YWJsZSl9IG1ldGhvZCBvbgorICAgICAqIGl0cyBsaXN0ZW5lcnMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgZW5kKCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYSBsaXN0ZW5lciB0byB0aGUgc2V0IG9mIGxpc3RlbmVycyB0aGF0IGFyZSBzZW50IGV2ZW50cyB0aHJvdWdoIHRoZSBsaWZlIG9mIGFuCisgICAgICogYW5pbWF0aW9uLCBzdWNoIGFzIHN0YXJ0LCByZXBlYXQsIGFuZCBlbmQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgdGhlIGxpc3RlbmVyIHRvIGJlIGFkZGVkIHRvIHRoZSBjdXJyZW50IHNldCBvZiBsaXN0ZW5lcnMgZm9yIHRoaXMgYW5pbWF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKEFuaW1hdGFibGVMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICBpZiAobUxpc3RlbmVycyA9PSBudWxsKSB7CisgICAgICAgICAgICBtTGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdDxBbmltYXRhYmxlTGlzdGVuZXI+KCk7CisgICAgICAgIH0KKyAgICAgICAgbUxpc3RlbmVycy5hZGQobGlzdGVuZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbW92ZXMgYSBsaXN0ZW5lciBmcm9tIHRoZSBzZXQgbGlzdGVuaW5nIHRvIHRoaXMgYW5pbWF0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGxpc3RlbmVyIHRoZSBsaXN0ZW5lciB0byBiZSByZW1vdmVkIGZyb20gdGhlIGN1cnJlbnQgc2V0IG9mIGxpc3RlbmVycyBmb3IgdGhpcworICAgICAqICAgICAgICAgICAgICAgICBhbmltYXRpb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoQW5pbWF0YWJsZUxpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgIGlmIChtTGlzdGVuZXJzID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBtTGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7CisgICAgICAgIGlmIChtTGlzdGVuZXJzLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICBtTGlzdGVuZXJzID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHNldCBvZiB7QGxpbmsgQW5pbWF0YWJsZUxpc3RlbmVyfSBvYmplY3RzIHRoYXQgYXJlIGN1cnJlbnRseQorICAgICAqIGxpc3RlbmluZyBmb3IgZXZlbnRzIG9uIHRoaXMgPGNvZGU+QW5pbWF0YWJsZTwvY29kZT4gb2JqZWN0LgorICAgICAqCisgICAgICogQHJldHVybiBBcnJheUxpc3Q8QW5pbWF0YWJsZUxpc3RlbmVyPiBUaGUgc2V0IG9mIGxpc3RlbmVycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgQXJyYXlMaXN0PEFuaW1hdGFibGVMaXN0ZW5lcj4gZ2V0TGlzdGVuZXJzKCkgeworICAgICAgICByZXR1cm4gbUxpc3RlbmVyczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmVzIGFsbCBsaXN0ZW5lcnMgZnJvbSB0aGlzIG9iamVjdC4gVGhpcyBpcyBlcXVpdmFsZW50IHRvIGNhbGxpbmcKKyAgICAgKiA8Y29kZT5nZXRMaXN0ZW5lcnMoKTwvY29kZT4gZm9sbG93ZWQgYnkgY2FsbGluZyA8Y29kZT5jbGVhcigpPC9jb2RlPiBvbiB0aGUKKyAgICAgKiByZXR1cm5lZCBsaXN0IG9mIGxpc3RlbmVycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVBbGxMaXN0ZW5lcnMoKSB7CisgICAgICAgIGlmIChtTGlzdGVuZXJzICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1MaXN0ZW5lcnMuY2xlYXIoKTsKKyAgICAgICAgICAgIG1MaXN0ZW5lcnMgPSBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEFuaW1hdGFibGUgY2xvbmUoKSB0aHJvd3MgQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24geworICAgICAgICBmaW5hbCBBbmltYXRhYmxlIGFuaW0gPSAoQW5pbWF0YWJsZSkgc3VwZXIuY2xvbmUoKTsKKyAgICAgICAgaWYgKG1MaXN0ZW5lcnMgIT0gbnVsbCkgeworICAgICAgICAgICAgQXJyYXlMaXN0PEFuaW1hdGFibGVMaXN0ZW5lcj4gb2xkTGlzdGVuZXJzID0gbUxpc3RlbmVyczsKKyAgICAgICAgICAgIGFuaW0ubUxpc3RlbmVycyA9IG5ldyBBcnJheUxpc3Q8QW5pbWF0YWJsZUxpc3RlbmVyPigpOworICAgICAgICAgICAgaW50IG51bUxpc3RlbmVycyA9IG9sZExpc3RlbmVycy5zaXplKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUxpc3RlbmVyczsgKytpKSB7CisgICAgICAgICAgICAgICAgYW5pbS5tTGlzdGVuZXJzLmFkZChvbGRMaXN0ZW5lcnMuZ2V0KGkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYW5pbTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiA8cD5BbiBhbmltYXRpb24gbGlzdGVuZXIgcmVjZWl2ZXMgbm90aWZpY2F0aW9ucyBmcm9tIGFuIGFuaW1hdGlvbi4KKyAgICAgKiBOb3RpZmljYXRpb25zIGluZGljYXRlIGFuaW1hdGlvbiByZWxhdGVkIGV2ZW50cywgc3VjaCBhcyB0aGUgZW5kIG9yIHRoZQorICAgICAqIHJlcGV0aXRpb24gb2YgdGhlIGFuaW1hdGlvbi48L3A+CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgQW5pbWF0YWJsZUxpc3RlbmVyIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIDxwPk5vdGlmaWVzIHRoZSBzdGFydCBvZiB0aGUgYW5pbWF0aW9uLjwvcD4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGFuaW1hdGlvbiBUaGUgc3RhcnRlZCBhbmltYXRpb24uCisgICAgICAgICAqLworICAgICAgICB2b2lkIG9uQW5pbWF0aW9uU3RhcnQoQW5pbWF0YWJsZSBhbmltYXRpb24pOworCisgICAgICAgIC8qKgorICAgICAgICAgKiA8cD5Ob3RpZmllcyB0aGUgZW5kIG9mIHRoZSBhbmltYXRpb24uIFRoaXMgY2FsbGJhY2sgaXMgbm90IGludm9rZWQKKyAgICAgICAgICogZm9yIGFuaW1hdGlvbnMgd2l0aCByZXBlYXQgY291bnQgc2V0IHRvIElORklOSVRFLjwvcD4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGFuaW1hdGlvbiBUaGUgYW5pbWF0aW9uIHdoaWNoIHJlYWNoZWQgaXRzIGVuZC4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgb25BbmltYXRpb25FbmQoQW5pbWF0YWJsZSBhbmltYXRpb24pOworCisgICAgICAgIC8qKgorICAgICAgICAgKiA8cD5Ob3RpZmllcyB0aGUgY2FuY2VsbGF0aW9uIG9mIHRoZSBhbmltYXRpb24uIFRoaXMgY2FsbGJhY2sgaXMgbm90IGludm9rZWQKKyAgICAgICAgICogZm9yIGFuaW1hdGlvbnMgd2l0aCByZXBlYXQgY291bnQgc2V0IHRvIElORklOSVRFLjwvcD4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGFuaW1hdGlvbiBUaGUgYW5pbWF0aW9uIHdoaWNoIHdhcyBjYW5jZWxlZC4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgb25BbmltYXRpb25DYW5jZWwoQW5pbWF0YWJsZSBhbmltYXRpb24pOworCisgICAgICAgIC8qKgorICAgICAgICAgKiA8cD5Ob3RpZmllcyB0aGUgcmVwZXRpdGlvbiBvZiB0aGUgYW5pbWF0aW9uLjwvcD4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGFuaW1hdGlvbiBUaGUgYW5pbWF0aW9uIHdoaWNoIHdhcyByZXBlYXRlZC4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgb25BbmltYXRpb25SZXBlYXQoQW5pbWF0YWJsZSBhbmltYXRpb24pOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9BbmltYXRhYmxlSW5mbGF0ZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9BbmltYXRhYmxlSW5mbGF0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OGZhNzdlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL0FuaW1hdGFibGVJbmZsYXRlci5qYXZhCkBAIC0wLDAgKzEsMjY5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgYW5kcm9pZC5hbmltYXRpb247CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5YbWxSZXNvdXJjZVBhcnNlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlcy5Ob3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OworaW1wb3J0IGFuZHJvaWQudXRpbC5YbWw7CitpbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb25VdGlsczsKK2ltcG9ydCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyOworaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXJFeGNlcHRpb247CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKKy8qKgorICogVGhpcyBjbGFzcyBpcyB1c2VkIHRvIGluc3RhbnRpYXRlIG1lbnUgWE1MIGZpbGVzIGludG8gQW5pbWF0YWJsZSBvYmplY3RzLgorICogPHA+CisgKiBGb3IgcGVyZm9ybWFuY2UgcmVhc29ucywgbWVudSBpbmZsYXRpb24gcmVsaWVzIGhlYXZpbHkgb24gcHJlLXByb2Nlc3Npbmcgb2YKKyAqIFhNTCBmaWxlcyB0aGF0IGlzIGRvbmUgYXQgYnVpbGQgdGltZS4gVGhlcmVmb3JlLCBpdCBpcyBub3QgY3VycmVudGx5IHBvc3NpYmxlCisgKiB0byB1c2UgTWVudUluZmxhdGVyIHdpdGggYW4gWG1sUHVsbFBhcnNlciBvdmVyIGEgcGxhaW4gWE1MIGZpbGUgYXQgcnVudGltZTsKKyAqIGl0IG9ubHkgd29ya3Mgd2l0aCBhbiBYbWxQdWxsUGFyc2VyIHJldHVybmVkIGZyb20gYSBjb21waWxlZCByZXNvdXJjZSAoUi4KKyAqIDxlbT5zb21ldGhpbmc8L2VtPiBmaWxlLikKKyAqLworcHVibGljIGNsYXNzIEFuaW1hdGFibGVJbmZsYXRlciB7CisKKyAgICAvKioKKyAgICAgKiBUaGVzZSBmbGFncyBhcmUgdXNlZCB3aGVuIHBhcnNpbmcgU2VxdWVuY2VyIG9iamVjdHMKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVE9HRVRIRVIgPSAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTRVFVRU5USUFMTFkgPSAxOworCisgICAgLyoqCisgICAgICogRW51bSB2YWx1ZXMgdXNlZCBpbiBYTUwgYXR0cmlidXRlcyB0byBpbmRpY2F0ZSB0aGUgdmFsdWUgZm9yIG1WYWx1ZVR5cGUKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVkFMVUVfVFlQRV9GTE9BVCAgICAgICA9IDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFZBTFVFX1RZUEVfSU5UICAgICAgICAgPSAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBWQUxVRV9UWVBFX0RPVUJMRSAgICAgID0gMjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVkFMVUVfVFlQRV9DT0xPUiAgICAgICA9IDM7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFZBTFVFX1RZUEVfQ1VTVE9NICAgICAgPSA0OworCisgICAgLyoqCisgICAgICogTG9hZHMgYW4ge0BsaW5rIEFuaW1hdGFibGV9IG9iamVjdCBmcm9tIGEgcmVzb3VyY2UKKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IEFwcGxpY2F0aW9uIGNvbnRleHQgdXNlZCB0byBhY2Nlc3MgcmVzb3VyY2VzCisgICAgICogQHBhcmFtIGlkIFRoZSByZXNvdXJjZSBpZCBvZiB0aGUgYW5pbWF0aW9uIHRvIGxvYWQKKyAgICAgKiBAcmV0dXJuIFRoZSBhbmltYXRhYmxlIG9iamVjdCByZWZlcmVuY2UgYnkgdGhlIHNwZWNpZmllZCBpZAorICAgICAqIEB0aHJvd3MgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXMuTm90Rm91bmRFeGNlcHRpb24gd2hlbiB0aGUgYW5pbWF0aW9uIGNhbm5vdCBiZSBsb2FkZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEFuaW1hdGFibGUgbG9hZEFuaW1hdGFibGUoQ29udGV4dCBjb250ZXh0LCBpbnQgaWQpCisgICAgICAgICAgICB0aHJvd3MgTm90Rm91bmRFeGNlcHRpb24geworCisgICAgICAgIFhtbFJlc291cmNlUGFyc2VyIHBhcnNlciA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwYXJzZXIgPSBjb250ZXh0LmdldFJlc291cmNlcygpLmdldEFuaW1hdGlvbihpZCk7CisgICAgICAgICAgICByZXR1cm4gY3JlYXRlQW5pbWF0YWJsZUZyb21YbWwoY29udGV4dCwgcGFyc2VyKTsKKyAgICAgICAgfSBjYXRjaCAoWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgUmVzb3VyY2VzLk5vdEZvdW5kRXhjZXB0aW9uIHJuZiA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBSZXNvdXJjZXMuTm90Rm91bmRFeGNlcHRpb24oIkNhbid0IGxvYWQgYW5pbWF0aW9uIHJlc291cmNlIElEICMweCIgKworICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvSGV4U3RyaW5nKGlkKSk7CisgICAgICAgICAgICBybmYuaW5pdENhdXNlKGV4KTsKKyAgICAgICAgICAgIHRocm93IHJuZjsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIFJlc291cmNlcy5Ob3RGb3VuZEV4Y2VwdGlvbiBybmYgPQorICAgICAgICAgICAgICAgICAgICBuZXcgUmVzb3VyY2VzLk5vdEZvdW5kRXhjZXB0aW9uKCJDYW4ndCBsb2FkIGFuaW1hdGlvbiByZXNvdXJjZSBJRCAjMHgiICsKKyAgICAgICAgICAgICAgICAgICAgSW50ZWdlci50b0hleFN0cmluZyhpZCkpOworICAgICAgICAgICAgcm5mLmluaXRDYXVzZShleCk7CisgICAgICAgICAgICB0aHJvdyBybmY7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAocGFyc2VyICE9IG51bGwpIHBhcnNlci5jbG9zZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgQW5pbWF0YWJsZSBjcmVhdGVBbmltYXRhYmxlRnJvbVhtbChDb250ZXh0IGMsIFhtbFB1bGxQYXJzZXIgcGFyc2VyKQorICAgICAgICAgICAgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKworICAgICAgICByZXR1cm4gY3JlYXRlQW5pbWF0YWJsZUZyb21YbWwoYywgcGFyc2VyLCBYbWwuYXNBdHRyaWJ1dGVTZXQocGFyc2VyKSwgbnVsbCwgMCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgQW5pbWF0YWJsZSBjcmVhdGVBbmltYXRhYmxlRnJvbVhtbChDb250ZXh0IGMsIFhtbFB1bGxQYXJzZXIgcGFyc2VyLAorICAgICAgICAgICAgQXR0cmlidXRlU2V0IGF0dHJzLCBTZXF1ZW5jZXIgcGFyZW50LCBpbnQgc2VxdWVuY2VPcmRlcmluZykKKyAgICAgICAgICAgIHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgQW5pbWF0YWJsZSBhbmltID0gbnVsbDsKKyAgICAgICAgQXJyYXlMaXN0PEFuaW1hdGFibGU+IGNoaWxkQW5pbXMgPSBudWxsOworCisgICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBhcmUgb24gYSBzdGFydCB0YWcuCisgICAgICAgIGludCB0eXBlOworICAgICAgICBpbnQgZGVwdGggPSBwYXJzZXIuZ2V0RGVwdGgoKTsKKworICAgICAgICB3aGlsZSAoKCh0eXBlPXBhcnNlci5uZXh0KCkpICE9IFhtbFB1bGxQYXJzZXIuRU5EX1RBRyB8fCBwYXJzZXIuZ2V0RGVwdGgoKSA+IGRlcHRoKQorICAgICAgICAgICAgICAgJiYgdHlwZSAhPSBYbWxQdWxsUGFyc2VyLkVORF9ET0NVTUVOVCkgeworCisgICAgICAgICAgICBpZiAodHlwZSAhPSBYbWxQdWxsUGFyc2VyLlNUQVJUX1RBRykgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTdHJpbmcgIG5hbWUgPSBwYXJzZXIuZ2V0TmFtZSgpOworCisgICAgICAgICAgICBpZiAobmFtZS5lcXVhbHMoInByb3BlcnR5IikpIHsKKyAgICAgICAgICAgICAgICBhbmltID0gbG9hZFByb3BlcnR5QW5pbWF0b3IoYywgYXR0cnMpOworICAgICAgICAgICAgfSBlbHNlIGlmIChuYW1lLmVxdWFscygiYW5pbWF0b3IiKSkgeworICAgICAgICAgICAgICAgIGFuaW0gPSBsb2FkQW5pbWF0b3IoYywgYXR0cnMsIG51bGwpOworICAgICAgICAgICAgfSBlbHNlIGlmIChuYW1lLmVxdWFscygic2VxdWVuY2VyIikpIHsKKyAgICAgICAgICAgICAgICBhbmltID0gbmV3IFNlcXVlbmNlcigpOworICAgICAgICAgICAgICAgIFR5cGVkQXJyYXkgYSA9IGMub2J0YWluU3R5bGVkQXR0cmlidXRlcyhhdHRycywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLlNlcXVlbmNlcik7CisgICAgICAgICAgICAgICAgaW50IG9yZGVyaW5nID0gYS5nZXRJbnQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuU2VxdWVuY2VyX29yZGVyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgVE9HRVRIRVIpOworICAgICAgICAgICAgICAgIGNyZWF0ZUFuaW1hdGFibGVGcm9tWG1sKGMsIHBhcnNlciwgYXR0cnMsIChTZXF1ZW5jZXIpIGFuaW0sICBvcmRlcmluZyk7CisgICAgICAgICAgICAgICAgYS5yZWN5Y2xlKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJVbmtub3duIGFuaW1hdG9yIG5hbWU6ICIgKyBwYXJzZXIuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHBhcmVudCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKGNoaWxkQW5pbXMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBjaGlsZEFuaW1zID0gbmV3IEFycmF5TGlzdDxBbmltYXRhYmxlPigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjaGlsZEFuaW1zLmFkZChhbmltKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAocGFyZW50ICE9IG51bGwgJiYgY2hpbGRBbmltcyAhPSBudWxsKSB7CisgICAgICAgICAgICBBbmltYXRhYmxlW10gYW5pbXNBcnJheSA9IG5ldyBBbmltYXRhYmxlW2NoaWxkQW5pbXMuc2l6ZSgpXTsKKyAgICAgICAgICAgIGludCBpbmRleCA9IDA7CisgICAgICAgICAgICBmb3IgKEFuaW1hdGFibGUgYSA6IGNoaWxkQW5pbXMpIHsKKyAgICAgICAgICAgICAgICBhbmltc0FycmF5W2luZGV4KytdID0gYTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzZXF1ZW5jZU9yZGVyaW5nID09IFRPR0VUSEVSKSB7CisgICAgICAgICAgICAgICAgcGFyZW50LnBsYXlUb2dldGhlcihhbmltc0FycmF5KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcGFyZW50LnBsYXlTZXF1ZW50aWFsbHkoYW5pbXNBcnJheSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gYW5pbTsKKworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFByb3BlcnR5QW5pbWF0b3IgbG9hZFByb3BlcnR5QW5pbWF0b3IoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpCisgICAgICAgICAgICB0aHJvd3MgTm90Rm91bmRFeGNlcHRpb24geworCisgICAgICAgIFByb3BlcnR5QW5pbWF0b3IgYW5pbSA9IG5ldyBQcm9wZXJ0eUFuaW1hdG9yKCk7CisKKyAgICAgICAgbG9hZEFuaW1hdG9yKGNvbnRleHQsIGF0dHJzLCBhbmltKTsKKworICAgICAgICBUeXBlZEFycmF5IGEgPQorICAgICAgICAgICAgICAgIGNvbnRleHQub2J0YWluU3R5bGVkQXR0cmlidXRlcyhhdHRycywgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuUHJvcGVydHlBbmltYXRvcik7CisKKyAgICAgICAgU3RyaW5nIHByb3BlcnR5TmFtZSA9IGEuZ2V0U3RyaW5nKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLlByb3BlcnR5QW5pbWF0b3JfcHJvcGVydHlOYW1lKTsKKworICAgICAgICBhbmltLnNldFByb3BlcnR5TmFtZShwcm9wZXJ0eU5hbWUpOworCisgICAgICAgIGEucmVjeWNsZSgpOworCisgICAgICAgIHJldHVybiBhbmltOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgYW5pbWF0aW9uIHdob3NlIHBhcmFtZXRlcnMgY29tZSBmcm9tIHRoZSBzcGVjaWZpZWQgY29udGV4dCBhbmQKKyAgICAgKiBhdHRyaWJ1dGVzIHNldC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IHRoZSBhcHBsaWNhdGlvbiBlbnZpcm9ubWVudAorICAgICAqIEBwYXJhbSBhdHRycyB0aGUgc2V0IG9mIGF0dHJpYnV0ZXMgaG9sZGluZyB0aGUgYW5pbWF0aW9uIHBhcmFtZXRlcnMKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBBbmltYXRvciBsb2FkQW5pbWF0b3IoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMsIEFuaW1hdG9yIGFuaW0pCisgICAgICAgICAgICB0aHJvd3MgTm90Rm91bmRFeGNlcHRpb24geworCisgICAgICAgIFR5cGVkQXJyYXkgYSA9CisgICAgICAgICAgICAgICAgY29udGV4dC5vYnRhaW5TdHlsZWRBdHRyaWJ1dGVzKGF0dHJzLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BbmltYXRvcik7CisKKyAgICAgICAgbG9uZyBkdXJhdGlvbiA9IGEuZ2V0SW50KGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuaW1hdG9yX2R1cmF0aW9uLCAwKTsKKworICAgICAgICBsb25nIHN0YXJ0RGVsYXkgPSBhLmdldEludChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BbmltYXRvcl9zdGFydE9mZnNldCwgMCk7CisKKyAgICAgICAgaW50IHZhbHVlVHlwZSA9IGEuZ2V0SW50KGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuaW1hdG9yX3ZhbHVlVHlwZSwKKyAgICAgICAgICAgICAgICBWQUxVRV9UWVBFX0ZMT0FUKTsKKworICAgICAgICBPYmplY3QgdmFsdWVGcm9tID0gbnVsbDsKKyAgICAgICAgT2JqZWN0IHZhbHVlVG8gPSBudWxsOworICAgICAgICBUeXBlRXZhbHVhdG9yIGV2YWx1YXRvciA9IG51bGw7CisKKyAgICAgICAgc3dpdGNoICh2YWx1ZVR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgVkFMVUVfVFlQRV9GTE9BVDoKKyAgICAgICAgICAgICAgICBpZiAoYS5oYXNWYWx1ZShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BbmltYXRvcl92YWx1ZUZyb20pKSB7CisgICAgICAgICAgICAgICAgICAgIHZhbHVlRnJvbSA9IGEuZ2V0RmxvYXQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5pbWF0b3JfdmFsdWVGcm9tLCAwZik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChhLmhhc1ZhbHVlKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuaW1hdG9yX3ZhbHVlVG8pKSB7CisgICAgICAgICAgICAgICAgICAgIHZhbHVlVG8gPSBhLmdldEZsb2F0KGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuaW1hdG9yX3ZhbHVlVG8sIDBmKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFZBTFVFX1RZUEVfQ09MT1I6CisgICAgICAgICAgICAgICAgZXZhbHVhdG9yID0gbmV3IFJHQkV2YWx1YXRvcigpOworICAgICAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaCB0byBwaWNrIHVwIHZhbHVlcworICAgICAgICAgICAgY2FzZSBWQUxVRV9UWVBFX0lOVDoKKyAgICAgICAgICAgICAgICBpZiAoYS5oYXNWYWx1ZShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BbmltYXRvcl92YWx1ZUZyb20pKSB7CisgICAgICAgICAgICAgICAgICAgIHZhbHVlRnJvbSA9IGEuZ2V0SW50ZWdlcihjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BbmltYXRvcl92YWx1ZUZyb20sIDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoYS5oYXNWYWx1ZShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BbmltYXRvcl92YWx1ZVRvKSkgeworICAgICAgICAgICAgICAgICAgICB2YWx1ZVRvID0gYS5nZXRJbnRlZ2VyKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuaW1hdG9yX3ZhbHVlVG8sIDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgVkFMVUVfVFlQRV9ET1VCTEU6CisgICAgICAgICAgICAgICAgaWYgKGEuaGFzVmFsdWUoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5pbWF0b3JfdmFsdWVGcm9tKSkgeworICAgICAgICAgICAgICAgICAgICB2YWx1ZUZyb20gPSAoRG91YmxlKSgoRmxvYXQpKGEuZ2V0RmxvYXQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5pbWF0b3JfdmFsdWVGcm9tLCAwZikpKS5kb3VibGVWYWx1ZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoYS5oYXNWYWx1ZShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BbmltYXRvcl92YWx1ZVRvKSkgeworICAgICAgICAgICAgICAgICAgICB2YWx1ZVRvID0gKERvdWJsZSkoKEZsb2F0KWEuZ2V0RmxvYXQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5pbWF0b3JfdmFsdWVUbywgMGYpKS5kb3VibGVWYWx1ZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgVkFMVUVfVFlQRV9DVVNUT006CisgICAgICAgICAgICAgICAgLy8gVE9ETzogSG93IHRvIGdldCBhbiAnT2JqZWN0JyB2YWx1ZT8KKyAgICAgICAgICAgICAgICBpZiAoYS5oYXNWYWx1ZShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BbmltYXRvcl92YWx1ZUZyb20pKSB7CisgICAgICAgICAgICAgICAgICAgIHZhbHVlRnJvbSA9IGEuZ2V0RmxvYXQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5pbWF0b3JfdmFsdWVGcm9tLCAwZik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChhLmhhc1ZhbHVlKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuaW1hdG9yX3ZhbHVlVG8pKSB7CisgICAgICAgICAgICAgICAgICAgIHZhbHVlVG8gPSBhLmdldEZsb2F0KGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuaW1hdG9yX3ZhbHVlVG8sIDBmKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAoYW5pbSA9PSBudWxsKSB7CisgICAgICAgICAgICBhbmltID0gbmV3IEFuaW1hdG9yKGR1cmF0aW9uLCB2YWx1ZUZyb20sIHZhbHVlVG8pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYW5pbS5zZXREdXJhdGlvbihkdXJhdGlvbik7CisgICAgICAgICAgICBhbmltLnNldFZhbHVlcyh2YWx1ZUZyb20sIHZhbHVlVG8pOworICAgICAgICB9CisKKyAgICAgICAgYW5pbS5zZXRTdGFydERlbGF5KHN0YXJ0RGVsYXkpOworCisgICAgICAgIGlmIChhLmhhc1ZhbHVlKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuaW1hdG9yX3JlcGVhdENvdW50KSkgeworICAgICAgICAgICAgYW5pbS5zZXRSZXBlYXRDb3VudCgKKyAgICAgICAgICAgICAgICAgICAgYS5nZXRJbnQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5pbWF0b3JfcmVwZWF0Q291bnQsIDApKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYS5oYXNWYWx1ZShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BbmltYXRvcl9yZXBlYXRNb2RlKSkgeworICAgICAgICAgICAgYW5pbS5zZXRSZXBlYXRNb2RlKAorICAgICAgICAgICAgICAgICAgICBhLmdldEludChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BbmltYXRvcl9yZXBlYXRNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFuaW1hdG9yLlJFU1RBUlQpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZXZhbHVhdG9yICE9IG51bGwpIHsKKyAgICAgICAgICAgIGFuaW0uc2V0RXZhbHVhdG9yKGV2YWx1YXRvcik7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBpbnQgcmVzSUQgPQorICAgICAgICAgICAgICAgIGEuZ2V0UmVzb3VyY2VJZChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BbmltYXRvcl9pbnRlcnBvbGF0b3IsIDApOworICAgICAgICBpZiAocmVzSUQgPiAwKSB7CisgICAgICAgICAgICBhbmltLnNldEludGVycG9sYXRvcihBbmltYXRpb25VdGlscy5sb2FkSW50ZXJwb2xhdG9yKGNvbnRleHQsIHJlc0lEKSk7CisgICAgICAgIH0KKyAgICAgICAgYS5yZWN5Y2xlKCk7CisKKyAgICAgICAgcmV0dXJuIGFuaW07CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL0FuaW1hdGFibGVMaXN0ZW5lckFkYXB0ZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9BbmltYXRhYmxlTGlzdGVuZXJBZGFwdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjVhODQyYgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9BbmltYXRhYmxlTGlzdGVuZXJBZGFwdGVyLmphdmEKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5hbmltYXRpb247CisKK2ltcG9ydCBhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRhYmxlLkFuaW1hdGFibGVMaXN0ZW5lcjsKKworLyoqCisgKiBUaGlzIGFkYXB0ZXIgY2xhc3MgcHJvdmlkZXMgZW1wdHkgaW1wbGVtZW50YXRpb25zIG9mIHRoZSBtZXRob2RzIGZyb20ge0BsaW5rIEFuaW1hdGFibGVMaXN0ZW5lcn0uCisgKiBBbnkgY3VzdG9tIGxpc3RlbmVyIHRoYXQgY2FyZXMgb25seSBhYm91dCBhIHN1YnNldCBvZiB0aGUgbWV0aG9kcyBvZiB0aGlzIGxpc3RlbmVyIGNhbgorICogc2ltcGx5IHN1YmNsYXNzIHRoaXMgYWRhcHRlciBjbGFzcyBpbnN0ZWFkIG9mIGltcGxlbWVudGluZyB0aGUgaW50ZXJmYWNlIGRpcmVjdGx5LgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQW5pbWF0YWJsZUxpc3RlbmVyQWRhcHRlciBpbXBsZW1lbnRzIEFuaW1hdGFibGVMaXN0ZW5lciB7CisKKyAgICAvKioKKyAgICAgKiBAe2luaGVyaXRkb2N9CisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25DYW5jZWwoQW5pbWF0YWJsZSBhbmltYXRpb24pIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAe2luaGVyaXRkb2N9CisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25FbmQoQW5pbWF0YWJsZSBhbmltYXRpb24pIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAe2luaGVyaXRkb2N9CisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25SZXBlYXQoQW5pbWF0YWJsZSBhbmltYXRpb24pIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAe2luaGVyaXRkb2N9CisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25TdGFydChBbmltYXRhYmxlIGFuaW1hdGlvbikgeworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL0FuaW1hdG9yLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hbmltYXRpb24vQW5pbWF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xODAxN2JhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL0FuaW1hdG9yLmphdmEKQEAgLTAsMCArMSw5MzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYW5pbWF0aW9uOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuTG9vcGVyOworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFjY2VsZXJhdGVEZWNlbGVyYXRlSW50ZXJwb2xhdG9yOworaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uVXRpbHM7CitpbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5JbnRlcnBvbGF0b3I7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworCisvKioKKyAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgYSBzaW1wbGUgdGltaW5nIGVuZ2luZSBmb3IgcnVubmluZyBhbmltYXRpb25zCisgKiB3aGljaCBjYWxjdWxhdGUgYW5pbWF0ZWQgdmFsdWVzIGFuZCBzZXQgdGhlbSBvbiB0YXJnZXQgb2JqZWN0cy4KKyAqCisgKiA8cD5UaGVyZSBpcyBhIHNpbmdsZSB0aW1pbmcgcHVsc2UgdGhhdCBhbGwgYW5pbWF0aW9ucyB1c2UuIEl0IHJ1bnMgaW4gYQorICogY3VzdG9tIGhhbmRsZXIgdG8gZW5zdXJlIHRoYXQgcHJvcGVydHkgY2hhbmdlcyBoYXBwZW4gb24gdGhlIFVJIHRocmVhZC48L3A+CisgKgorICogPHA+QnkgZGVmYXVsdCwgQW5pbWF0b3IgdXNlcyBub24tbGluZWFyIHRpbWUgaW50ZXJwb2xhdGlvbiwgdmlhIHRoZQorICoge0BsaW5rIEFjY2VsZXJhdGVEZWNlbGVyYXRlSW50ZXJwb2xhdG9yfSBjbGFzcywgd2hpY2ggYWNjZWxlcmF0ZXMgaW50byBhbmQgZGVjZWxlcmF0ZXMKKyAqIG91dCBvZiBhbiBhbmltYXRpb24uIFRoaXMgYmVoYXZpb3IgY2FuIGJlIGNoYW5nZWQgYnkgY2FsbGluZworICoge0BsaW5rIEFuaW1hdG9yI3NldEludGVycG9sYXRvcihJbnRlcnBvbGF0b3IpfS48L3A+CisgKi8KK3B1YmxpYyBjbGFzcyBBbmltYXRvcjxUPiBleHRlbmRzIEFuaW1hdGFibGUgeworCisgICAgLyoqCisgICAgICogSW50ZXJuYWwgY29uc3RhbnRzCisgICAgICovCisKKyAgICAvKgorICAgICAqIFRoZSBkZWZhdWx0IGFtb3VudCBvZiB0aW1lIGluIG1zIGJldHdlZW4gYW5pbWF0aW9uIGZyYW1lcworICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgREVGQVVMVF9GUkFNRV9ERUxBWSA9IDMwOworCisgICAgLyoqCisgICAgICogTWVzc2FnZXMgc2VudCB0byB0aW1pbmcgaGFuZGxlcjogU1RBUlQgaXMgc2VudCB3aGVuIGFuIGFuaW1hdGlvbiBmaXJzdCBiZWdpbnMsIEZSQU1FIGlzIHNlbnQKKyAgICAgKiBieSB0aGUgaGFuZGxlciB0byBpdHNlbGYgdG8gcHJvY2VzcyB0aGUgbmV4dCBhbmltYXRpb24gZnJhbWUKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQU5JTUFUSU9OX1NUQVJUID0gMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQU5JTUFUSU9OX0ZSQU1FID0gMTsKKworICAgIC8qKgorICAgICAqIFZhbHVlcyB1c2VkIHdpdGggaW50ZXJuYWwgdmFyaWFibGUgbVBsYXlpbmdTdGF0ZSB0byBpbmRpY2F0ZSB0aGUgY3VycmVudCBzdGF0ZSBvZiBhbgorICAgICAqIGFuaW1hdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RPUFBFRCAgICA9IDA7IC8vIE5vdCB5ZXQgcGxheWluZworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSVU5OSU5HICAgID0gMTsgLy8gUGxheWluZyBub3JtYWxseQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDQU5DRUxFRCAgID0gMjsgLy8gY2FuY2VsKCkgY2FsbGVkIC0gbmVlZCB0byBlbmQgaXQKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRU5ERUQgICAgICA9IDM7IC8vIGVuZCgpIGNhbGxlZCAtIG5lZWQgdG8gZW5kIGl0CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNFRUtFRCAgICAgPSA0OyAvLyBTZWVrZWQgdG8gc29tZSB0aW1lIHZhbHVlCisKKyAgICAvKioKKyAgICAgKiBJbnRlcm5hbCB2YXJpYWJsZXMKKyAgICAgKiBOT1RFOiBUaGlzIG9iamVjdCBpbXBsZW1lbnRzIHRoZSBjbG9uZSgpIG1ldGhvZCwgbWFraW5nIGEgZGVlcCBjb3B5IG9mIGFueSByZWZlcmVuY2VkCisgICAgICogb2JqZWN0cy4gQXMgb3RoZXIgbm9uLXRyaXZpYWwgZmllbGRzIGFyZSBhZGRlZCB0byB0aGlzIGNsYXNzLCBtYWtlIHN1cmUgdG8gYWRkIGxvZ2ljCisgICAgICogdG8gY2xvbmUoKSB0byBtYWtlIGRlZXAgY29waWVzIG9mIHRoZW0uCisgICAgICovCisKKyAgICAvLyBUaGUgZmlyc3QgdGltZSB0aGF0IHRoZSBhbmltYXRpb24ncyBhbmltYXRlRnJhbWUoKSBtZXRob2QgaXMgY2FsbGVkLiBUaGlzIHRpbWUgaXMgdXNlZCB0bworICAgIC8vIGRldGVybWluZSBlbGFwc2VkIHRpbWUgKGFuZCB0aGVyZWZvcmUgdGhlIGVsYXBzZWQgZnJhY3Rpb24pIGluIHN1YnNlcXVlbnQgY2FsbHMKKyAgICAvLyB0byBhbmltYXRlRnJhbWUoKQorICAgIHByaXZhdGUgbG9uZyBtU3RhcnRUaW1lOworCisgICAgLyoqCisgICAgICogU2V0IHdoZW4gc2V0Q3VycmVudFBsYXlUaW1lKCkgaXMgY2FsbGVkLiBJZiBuZWdhdGl2ZSwgYW5pbWF0aW9uIGlzIG5vdCBjdXJyZW50bHkgc2Vla2VkCisgICAgICogdG8gYSB2YWx1ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGxvbmcgbVNlZWtUaW1lID0gLTE7CisKKyAgICAvLyBUaGUgc3RhdGljIHNBbmltYXRpb25IYW5kbGVyIHByb2Nlc3NlcyB0aGUgaW50ZXJuYWwgdGltaW5nIGxvb3Agb24gd2hpY2ggYWxsIGFuaW1hdGlvbnMKKyAgICAvLyBhcmUgYmFzZWQKKyAgICBwcml2YXRlIHN0YXRpYyBBbmltYXRpb25IYW5kbGVyIHNBbmltYXRpb25IYW5kbGVyOworCisgICAgLy8gVGhlIHN0YXRpYyBsaXN0IG9mIGFsbCBhY3RpdmUgYW5pbWF0aW9ucworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEFycmF5TGlzdDxBbmltYXRvcj4gc0FuaW1hdGlvbnMgPSBuZXcgQXJyYXlMaXN0PEFuaW1hdG9yPigpOworCisgICAgLy8gVGhlIHNldCBvZiBhbmltYXRpb25zIHRvIGJlIHN0YXJ0ZWQgb24gdGhlIG5leHQgYW5pbWF0aW9uIGZyYW1lCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQXJyYXlMaXN0PEFuaW1hdG9yPiBzUGVuZGluZ0FuaW1hdGlvbnMgPSBuZXcgQXJyYXlMaXN0PEFuaW1hdG9yPigpOworCisgICAgLy8gVGhlIHRpbWUgaW50ZXJwb2xhdG9yIHRvIGJlIHVzZWQgaWYgbm9uZSBpcyBzZXQgb24gdGhlIGFuaW1hdGlvbgorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEludGVycG9sYXRvciBzRGVmYXVsdEludGVycG9sYXRvciA9IG5ldyBBY2NlbGVyYXRlRGVjZWxlcmF0ZUludGVycG9sYXRvcigpOworCisgICAgLy8gdHlwZSBldmFsdWF0b3JzIGZvciB0aGUgdGhyZWUgcHJpbWl0aXZlIHR5cGVzIGhhbmRsZWQgYnkgdGhpcyBpbXBsZW1lbnRhdGlvbgorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFR5cGVFdmFsdWF0b3Igc0ludEV2YWx1YXRvciA9IG5ldyBJbnRFdmFsdWF0b3IoKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBUeXBlRXZhbHVhdG9yIHNGbG9hdEV2YWx1YXRvciA9IG5ldyBGbG9hdEV2YWx1YXRvcigpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFR5cGVFdmFsdWF0b3Igc0RvdWJsZUV2YWx1YXRvciA9IG5ldyBEb3VibGVFdmFsdWF0b3IoKTsKKworICAgIC8qKgorICAgICAqIFVzZWQgdG8gaW5kaWNhdGUgd2hldGhlciB0aGUgYW5pbWF0aW9uIGlzIGN1cnJlbnRseSBwbGF5aW5nIGluIHJldmVyc2UuIFRoaXMgY2F1c2VzIHRoZQorICAgICAqIGVsYXBzZWQgZnJhY3Rpb24gdG8gYmUgaW52ZXJ0ZWQgdG8gY2FsY3VsYXRlIHRoZSBhcHByb3ByaWF0ZSB2YWx1ZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIG1QbGF5aW5nQmFja3dhcmRzID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIHZhcmlhYmxlIHRyYWNrcyB0aGUgY3VycmVudCBpdGVyYXRpb24gdGhhdCBpcyBwbGF5aW5nLiBXaGVuIG1DdXJyZW50SXRlcmF0aW9uIGV4Y2VlZHMgdGhlCisgICAgICogcmVwZWF0Q291bnQgKGlmIHJlcGVhdENvdW50IT1JTkZJTklURSksIHRoZSBhbmltYXRpb24gZW5kcworICAgICAqLworICAgIHByaXZhdGUgaW50IG1DdXJyZW50SXRlcmF0aW9uID0gMDsKKworICAgIC8qKgorICAgICAqIFRyYWNrcyB3aGV0aGVyIGEgc3RhcnREZWxheSdkIGFuaW1hdGlvbiBoYXMgYmVndW4gcGxheWluZyB0aHJvdWdoIHRoZSBzdGFydERlbGF5LgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBtU3RhcnRlZERlbGF5ID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBUcmFja3MgdGhlIHRpbWUgYXQgd2hpY2ggdGhlIGFuaW1hdGlvbiBiZWdhbiBwbGF5aW5nIHRocm91Z2ggaXRzIHN0YXJ0RGVsYXkuIFRoaXMgaXMKKyAgICAgKiBkaWZmZXJlbnQgZnJvbSB0aGUgbVN0YXJ0VGltZSB2YXJpYWJsZSwgd2hpY2ggaXMgdXNlZCB0byB0cmFjayB3aGVuIHRoZSBhbmltYXRpb24gYmVjYW1lCisgICAgICogYWN0aXZlICh3aGljaCBpcyB3aGVuIHRoZSBzdGFydERlbGF5IGV4cGlyZWQgYW5kIHRoZSBhbmltYXRpb24gd2FzIGFkZGVkIHRvIHRoZSBhY3RpdmUKKyAgICAgKiBhbmltYXRpb25zIGxpc3QpLgorICAgICAqLworICAgIHByaXZhdGUgbG9uZyBtRGVsYXlTdGFydFRpbWU7CisKKyAgICAvKioKKyAgICAgKiBGbGFnIHRoYXQgcmVwcmVzZW50cyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgYW5pbWF0aW9uLiBVc2VkIHRvIGZpZ3VyZSBvdXQgd2hlbiB0byBzdGFydAorICAgICAqIGFuIGFuaW1hdGlvbiAoaWYgc3RhdGUgPT0gU1RPUFBFRCkuIEFsc28gdXNlZCB0byBlbmQgYW4gYW5pbWF0aW9uIHRoYXQKKyAgICAgKiBoYXMgYmVlbiBjYW5jZWwoKSdkIG9yIGVuZCgpJ2Qgc2luY2UgdGhlIGxhc3QgYW5pbWF0aW9uIGZyYW1lLiBQb3NzaWJsZSB2YWx1ZXMgYXJlCisgICAgICogU1RPUFBFRCwgUlVOTklORywgRU5ERUQsIENBTkNFTEVELgorICAgICAqLworICAgIHByaXZhdGUgaW50IG1QbGF5aW5nU3RhdGUgPSBTVE9QUEVEOworCisgICAgLyoqCisgICAgICogSW50ZXJuYWwgY29sbGVjdGlvbnMgdXNlZCB0byBhdm9pZCBzZXQgY29sbGlzaW9ucyBhcyBhbmltYXRpb25zIHN0YXJ0IGFuZCBlbmQgd2hpbGUgYmVpbmcKKyAgICAgKiBwcm9jZXNzZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQXJyYXlMaXN0PEFuaW1hdG9yPiBzRW5kaW5nQW5pbXMgPSBuZXcgQXJyYXlMaXN0PEFuaW1hdG9yPigpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEFycmF5TGlzdDxBbmltYXRvcj4gc0RlbGF5ZWRBbmltcyA9IG5ldyBBcnJheUxpc3Q8QW5pbWF0b3I+KCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQXJyYXlMaXN0PEFuaW1hdG9yPiBzUmVhZHlBbmltcyA9IG5ldyBBcnJheUxpc3Q8QW5pbWF0b3I+KCk7CisKKyAgICAvKioKKyAgICAgKiBGbGFnIHRoYXQgZGVub3RlcyB3aGV0aGVyIHRoZSBhbmltYXRpb24gaXMgc2V0IHVwIGFuZCByZWFkeSB0byBnby4gVXNlZCBieSBzZWVrKCkgdG8KKyAgICAgKiBzZXQgdXAgYW5pbWF0aW9uIHRoYXQgaGFzIG5vdCB5ZXQgYmVlbiBzdGFydGVkLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBtSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKworICAgIC8vCisgICAgLy8gQmFja2luZyB2YXJpYWJsZXMKKyAgICAvLworCisgICAgLy8gSG93IGxvbmcgdGhlIGFuaW1hdGlvbiBzaG91bGQgbGFzdCBpbiBtcworICAgIHByaXZhdGUgbG9uZyBtRHVyYXRpb247CisKKyAgICAvLyBUaGUgYW1vdW50IG9mIHRpbWUgaW4gbXMgdG8gZGVsYXkgc3RhcnRpbmcgdGhlIGFuaW1hdGlvbiBhZnRlciBzdGFydCgpIGlzIGNhbGxlZAorICAgIHByaXZhdGUgbG9uZyBtU3RhcnREZWxheSA9IDA7CisKKyAgICAvLyBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBiZXR3ZWVuIGFuaW1hdGlvbiBmcmFtZXMKKyAgICBwcml2YXRlIHN0YXRpYyBsb25nIHNGcmFtZURlbGF5ID0gREVGQVVMVF9GUkFNRV9ERUxBWTsKKworICAgIC8vIFRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGFuaW1hdGlvbiB3aWxsIHJlcGVhdC4gVGhlIGRlZmF1bHQgaXMgMCwgd2hpY2ggbWVhbnMgdGhlIGFuaW1hdGlvbgorICAgIC8vIHdpbGwgcGxheSBvbmx5IG9uY2UKKyAgICBwcml2YXRlIGludCBtUmVwZWF0Q291bnQgPSAwOworCisgICAgLyoqCisgICAgICogVGhlIHR5cGUgb2YgcmVwZXRpdGlvbiB0aGF0IHdpbGwgb2NjdXIgd2hlbiByZXBlYXRNb2RlIGlzIG5vbnplcm8uIFJFU1RBUlQgbWVhbnMgdGhlCisgICAgICogYW5pbWF0aW9uIHdpbGwgc3RhcnQgZnJvbSB0aGUgYmVnaW5uaW5nIG9uIGV2ZXJ5IG5ldyBjeWNsZS4gUkVWRVJTRSBtZWFucyB0aGUgYW5pbWF0aW9uCisgICAgICogd2lsbCByZXZlcnNlIGRpcmVjdGlvbnMgb24gZWFjaCBpdGVyYXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgbVJlcGVhdE1vZGUgPSBSRVNUQVJUOworCisgICAgLyoqCisgICAgICogVGhlIHRpbWUgaW50ZXJwb2xhdG9yIHRvIGJlIHVzZWQuIFRoZSBlbGFwc2VkIGZyYWN0aW9uIG9mIHRoZSBhbmltYXRpb24gd2lsbCBiZSBwYXNzZWQKKyAgICAgKiB0aHJvdWdoIHRoaXMgaW50ZXJwb2xhdG9yIHRvIGNhbGN1bGF0ZSB0aGUgaW50ZXJwb2xhdGVkIGZyYWN0aW9uLCB3aGljaCBpcyB0aGVuIHVzZWQgdG8KKyAgICAgKiBjYWxjdWxhdGUgdGhlIGFuaW1hdGVkIHZhbHVlcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIEludGVycG9sYXRvciBtSW50ZXJwb2xhdG9yID0gc0RlZmF1bHRJbnRlcnBvbGF0b3I7CisKKyAgICAvKioKKyAgICAgKiBUaGUgc2V0IG9mIGxpc3RlbmVycyB0byBiZSBzZW50IGV2ZW50cyB0aHJvdWdoIHRoZSBsaWZlIG9mIGFuIGFuaW1hdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIEFycmF5TGlzdDxBbmltYXRvclVwZGF0ZUxpc3RlbmVyPiBtVXBkYXRlTGlzdGVuZXJzID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFRoZSBwcm9wZXJ0eS92YWx1ZSBzZXRzIGJlaW5nIGFuaW1hdGVkLgorICAgICAqLworICAgIFByb3BlcnR5VmFsdWVzSG9sZGVyW10gbVZhbHVlczsKKworICAgIC8qKgorICAgICAqIEEgaGFzaG1hcCBvZiB0aGUgUHJvcGVydHlWYWx1ZXNIb2xkZXIgb2JqZWN0cy4gVGhpcyBtYXAgaXMgdXNlZCB0byBsb29rdXAgYW5pbWF0ZWQgdmFsdWVzCisgICAgICogYnkgcHJvcGVydHkgbmFtZSBkdXJpbmcgY2FsbHMgdG8gZ2V0QW5pbWF0ZWRWYWx1ZShTdHJpbmcpLgorICAgICAqLworICAgIEhhc2hNYXA8U3RyaW5nLCBQcm9wZXJ0eVZhbHVlc0hvbGRlcj4gbVZhbHVlc01hcDsKKworICAgIC8qKgorICAgICAqIFB1YmxpYyBjb25zdGFudHMKKyAgICAgKi8KKworICAgIC8qKgorICAgICAqIFdoZW4gdGhlIGFuaW1hdGlvbiByZWFjaGVzIHRoZSBlbmQgYW5kIDxjb2RlPnJlcGVhdENvdW50PC9jb2RlPiBpcyBJTkZJTklURQorICAgICAqIG9yIGEgcG9zaXRpdmUgdmFsdWUsIHRoZSBhbmltYXRpb24gcmVzdGFydHMgZnJvbSB0aGUgYmVnaW5uaW5nLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1RBUlQgPSAxOworICAgIC8qKgorICAgICAqIFdoZW4gdGhlIGFuaW1hdGlvbiByZWFjaGVzIHRoZSBlbmQgYW5kIDxjb2RlPnJlcGVhdENvdW50PC9jb2RlPiBpcyBJTkZJTklURQorICAgICAqIG9yIGEgcG9zaXRpdmUgdmFsdWUsIHRoZSBhbmltYXRpb24gcmV2ZXJzZXMgZGlyZWN0aW9uIG9uIGV2ZXJ5IGl0ZXJhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVZFUlNFID0gMjsKKyAgICAvKioKKyAgICAgKiBUaGlzIHZhbHVlIHVzZWQgdXNlZCB3aXRoIHRoZSB7QGxpbmsgI3NldFJlcGVhdENvdW50KGludCl9IHByb3BlcnR5IHRvIHJlcGVhdAorICAgICAqIHRoZSBhbmltYXRpb24gaW5kZWZpbml0ZWx5LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElORklOSVRFID0gLTE7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IEFuaW1hdG9yIG9iamVjdC4gVGhpcyBkZWZhdWx0IGNvbnN0cnVjdG9yIGlzIHByaW1hcmlseSBmb3IKKyAgICAgKiB1c2UgaW50ZXJuYWxseTsgdGhlIG90aGVyIGNvbnN0cnVjdG9ycyB3aGljaCB0YWtlIHBhcmFtZXRlcnMgYXJlIG1vcmUgZ2VuZXJhbGx5CisgICAgICogdXNlZnVsLgorICAgICAqLworICAgIHB1YmxpYyBBbmltYXRvcigpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGFuIEFuaW1hdG9yIG9iamVjdCB3aXRoIHRoZSBzcGVjaWZpZWQgZHVyYXRpb24gYW5kIHNldCBvZgorICAgICAqIHZhbHVlcy4gSWYgdGhlIHZhbHVlcyBhcmUgYSBzZXQgb2YgUHJvcGVydHlWYWx1ZXNIb2xkZXIgb2JqZWN0cywgdGhlbiB0aGVzZSBvYmplY3RzCisgICAgICogZGVmaW5lIHRoZSBwb3RlbnRpYWxseSBtdWx0aXBsZSBwcm9wZXJ0aWVzIGJlaW5nIGFuaW1hdGVkIGFuZCB0aGUgdmFsdWVzIHRoZSBwcm9wZXJ0aWVzIGFyZQorICAgICAqIGFuaW1hdGVkIGJldHdlZW4uIE90aGVyd2lzZSwgdGhlIHZhbHVlcyBkZWZpbmUgYSBzaW5nbGUgc2V0IG9mIHZhbHVlcyBhbmltYXRlZCBiZXR3ZWVuLgorICAgICAqCisgICAgICogQHBhcmFtIGR1cmF0aW9uIFRoZSBsZW5ndGggb2YgdGhlIGFuaW1hdGlvbiwgaW4gbWlsbGlzZWNvbmRzLgorICAgICAqIEBwYXJhbSB2YWx1ZXMgVGhlIHNldCBvZiB2YWx1ZXMgdG8gYW5pbWF0ZSBiZXR3ZWVuLiBJZiB0aGVzZSB2YWx1ZXMgYXJlIG5vdAorICAgICAqIFByb3BlcnR5VmFsdWVzSG9sZGVyIG9iamVjdHMsIHRoZW4gdGhlcmUgc2hvdWxkIGJlIG1vcmUgdGhhbiBvbmUgdmFsdWUsIHNpbmNlIHRoZSB2YWx1ZXMKKyAgICAgKiBkZXRlcm1pbmUgdGhlIGludGVydmFsIHRvIGFuaW1hdGUgYmV0d2Vlbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgQW5pbWF0b3IobG9uZyBkdXJhdGlvbiwgVC4uLnZhbHVlcykgeworICAgICAgICBtRHVyYXRpb24gPSBkdXJhdGlvbjsKKyAgICAgICAgaWYgKHZhbHVlcy5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICBzZXRWYWx1ZXModmFsdWVzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlcyhQcm9wZXJ0eVZhbHVlc0hvbGRlci4uLiB2YWx1ZXMpIHsKKyAgICAgICAgaW50IG51bVZhbHVlcyA9IHZhbHVlcy5sZW5ndGg7CisgICAgICAgIG1WYWx1ZXMgPSB2YWx1ZXM7CisgICAgICAgIG1WYWx1ZXNNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFByb3BlcnR5VmFsdWVzSG9sZGVyPihudW1WYWx1ZXMpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVZhbHVlczsgKytpKSB7CisgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlc0hvbGRlciB2YWx1ZXNIb2xkZXIgPSAoUHJvcGVydHlWYWx1ZXNIb2xkZXIpIHZhbHVlc1tpXTsKKyAgICAgICAgICAgIG1WYWx1ZXNNYXAucHV0KHZhbHVlc0hvbGRlci5nZXRQcm9wZXJ0eU5hbWUoKSwgdmFsdWVzSG9sZGVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHZhbHVlcyB0byBhbmltYXRlIGJldHdlZW4gZm9yIHRoaXMgYW5pbWF0aW9uLiBJZiA8Y29kZT52YWx1ZXM8L2NvZGU+IGlzCisgICAgICogYSBzZXQgb2YgUHJvcGVydHlWYWx1ZXNIb2xkZXIgb2JqZWN0cywgdGhlc2Ugb2JqZWN0cyB3aWxsIGJlY29tZSB0aGUgc2V0IG9mIHByb3BlcnRpZXMKKyAgICAgKiBhbmltYXRlZCBhbmQgdGhlIHZhbHVlcyB0aGF0IHRob3NlIHByb3BlcnRpZXMgYXJlIGFuaW1hdGVkIGJldHdlZW4uIE90aGVyd2lzZSwgdGhpcyBtZXRob2QKKyAgICAgKiB3aWxsIHNldCBvbmx5IG9uZSBzZXQgb2YgdmFsdWVzIGZvciB0aGUgQW5pbWF0b3IuIEFsc28sIGlmIHRoZSB2YWx1ZXMgYXJlIG5vdAorICAgICAqIFByb3BlcnR5VmFsdWVzSG9sZGVyIG9iamVjdHMgYW5kIGlmIHRoZXJlIGFyZSBhbHJlYWR5IG11bHRpcGxlIHNldHMgb2YKKyAgICAgKiB2YWx1ZXMgZGVmaW5lZCBmb3IgdGhpcyBBbmltYXRvciB2aWEKKyAgICAgKiBtb3JlIHRoYW4gb25lIFByb3BlcnR5VmFsdWVzSG9sZGVyIG9iamVjdHMsIHRoaXMgbWV0aG9kIHdpbGwgc2V0IHRoZSB2YWx1ZXMgZm9yCisgICAgICogdGhlIGZpcnN0IG9mIHRob3NlIG9iamVjdHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsdWVzIFRoZSBzZXQgb2YgdmFsdWVzIHRvIGFuaW1hdGUgYmV0d2Vlbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZXMoVC4uLiB2YWx1ZXMpIHsKKyAgICAgICAgaWYgKG1WYWx1ZXMgPT0gbnVsbCB8fCBtVmFsdWVzLmxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICBzZXRWYWx1ZXMobmV3IFByb3BlcnR5VmFsdWVzSG9sZGVyW117CisgICAgICAgICAgICAgICAgICAgIG5ldyBQcm9wZXJ0eVZhbHVlc0hvbGRlcigiIiwgKE9iamVjdFtdKXZhbHVlcyl9KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFByb3BlcnR5VmFsdWVzSG9sZGVyIHZhbHVlc0hvbGRlciA9IG1WYWx1ZXNbMF07CisgICAgICAgICAgICB2YWx1ZXNIb2xkZXIuc2V0VmFsdWVzKHZhbHVlcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBpbW1lZGlhdGVseSBiZWZvcmUgcHJvY2Vzc2luZyB0aGUgZmlyc3QgYW5pbWF0aW9uCisgICAgICogZnJhbWUgb2YgYW4gYW5pbWF0aW9uLiBJZiB0aGVyZSBpcyBhIG5vbnplcm8gPGNvZGU+c3RhcnREZWxheTwvY29kZT4sIHRoZQorICAgICAqIGZ1bmN0aW9uIGlzIGNhbGxlZCBhZnRlciB0aGF0IGRlbGF5IGVuZHMuCisgICAgICogSXQgdGFrZXMgY2FyZSBvZiB0aGUgZmluYWwgaW5pdGlhbGl6YXRpb24gc3RlcHMgZm9yIHRoZQorICAgICAqIGFuaW1hdGlvbi4KKyAgICAgKgorICAgICAqICA8cD5PdmVycmlkZXMgb2YgdGhpcyBtZXRob2Qgc2hvdWxkIGNhbGwgdGhlIHN1cGVyY2xhc3MgbWV0aG9kIHRvIGVuc3VyZQorICAgICAqICB0aGF0IGludGVybmFsIG1lY2hhbmlzbXMgZm9yIHRoZSBhbmltYXRpb24gYXJlIHNldCB1cCBjb3JyZWN0bHkuPC9wPgorICAgICAqLworICAgIHZvaWQgaW5pdEFuaW1hdGlvbigpIHsKKyAgICAgICAgaW50IG51bVZhbHVlcyA9IG1WYWx1ZXMubGVuZ3RoOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVZhbHVlczsgKytpKSB7CisgICAgICAgICAgICBtVmFsdWVzW2ldLmluaXQoKTsKKyAgICAgICAgfQorICAgICAgICBtQ3VycmVudEl0ZXJhdGlvbiA9IDA7CisgICAgICAgIG1Jbml0aWFsaXplZCA9IHRydWU7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBsZW5ndGggb2YgdGhlIGFuaW1hdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkdXJhdGlvbiBUaGUgbGVuZ3RoIG9mIHRoZSBhbmltYXRpb24sIGluIG1pbGxpc2Vjb25kcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREdXJhdGlvbihsb25nIGR1cmF0aW9uKSB7CisgICAgICAgIG1EdXJhdGlvbiA9IGR1cmF0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGxlbmd0aCBvZiB0aGUgYW5pbWF0aW9uLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgbGVuZ3RoIG9mIHRoZSBhbmltYXRpb24sIGluIG1pbGxpc2Vjb25kcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXREdXJhdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIG1EdXJhdGlvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBwb3NpdGlvbiBvZiB0aGUgYW5pbWF0aW9uIHRvIHRoZSBzcGVjaWZpZWQgcG9pbnQgaW4gdGltZS4gVGhpcyB0aW1lIHNob3VsZAorICAgICAqIGJlIGJldHdlZW4gMCBhbmQgdGhlIHRvdGFsIGR1cmF0aW9uIG9mIHRoZSBhbmltYXRpb24sIGluY2x1ZGluZyBhbnkgcmVwZXRpdGlvbi4gSWYKKyAgICAgKiB0aGUgYW5pbWF0aW9uIGhhcyBub3QgeWV0IGJlZW4gc3RhcnRlZCwgdGhlbiBpdCB3aWxsIG5vdCBhZHZhbmNlIGZvcndhcmQgYWZ0ZXIgaXQgaXMKKyAgICAgKiBzZXQgdG8gdGhpcyB0aW1lOyBpdCB3aWxsIHNpbXBseSBzZXQgdGhlIHRpbWUgdG8gdGhpcyB2YWx1ZSBhbmQgcGVyZm9ybSBhbnkgYXBwcm9wcmlhdGUKKyAgICAgKiBhY3Rpb25zIGJhc2VkIG9uIHRoYXQgdGltZS4gSWYgdGhlIGFuaW1hdGlvbiBpcyBhbHJlYWR5IHJ1bm5pbmcsIHRoZW4gc2V0Q3VycmVudFBsYXlUaW1lKCkKKyAgICAgKiB3aWxsIHNldCB0aGUgY3VycmVudCBwbGF5aW5nIHRpbWUgdG8gdGhpcyB2YWx1ZSBhbmQgY29udGludWUgcGxheWluZyBmcm9tIHRoYXQgcG9pbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGxheVRpbWUgVGhlIHRpbWUsIGluIG1pbGxpc2Vjb25kcywgdG8gd2hpY2ggdGhlIGFuaW1hdGlvbiBpcyBhZHZhbmNlZCBvciByZXdvdW5kLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEN1cnJlbnRQbGF5VGltZShsb25nIHBsYXlUaW1lKSB7CisgICAgICAgIGlmICghbUluaXRpYWxpemVkKSB7CisgICAgICAgICAgICBpbml0QW5pbWF0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgbG9uZyBjdXJyZW50VGltZSA9IEFuaW1hdGlvblV0aWxzLmN1cnJlbnRBbmltYXRpb25UaW1lTWlsbGlzKCk7CisgICAgICAgIGlmIChtUGxheWluZ1N0YXRlICE9IFJVTk5JTkcpIHsKKyAgICAgICAgICAgIG1TZWVrVGltZSA9IHBsYXlUaW1lOworICAgICAgICAgICAgbVBsYXlpbmdTdGF0ZSA9IFNFRUtFRDsKKyAgICAgICAgfQorICAgICAgICBtU3RhcnRUaW1lID0gY3VycmVudFRpbWUgLSBwbGF5VGltZTsKKyAgICAgICAgYW5pbWF0aW9uRnJhbWUoY3VycmVudFRpbWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGN1cnJlbnQgcG9zaXRpb24gb2YgdGhlIGFuaW1hdGlvbiBpbiB0aW1lLCB3aGljaCBpcyBlcXVhbCB0byB0aGUgY3VycmVudAorICAgICAqIHRpbWUgbWludXMgdGhlIHRpbWUgdGhhdCB0aGUgYW5pbWF0aW9uIHN0YXJ0ZWQuIEFuIGFuaW1hdGlvbiB0aGF0IGlzIG5vdCB5ZXQgc3RhcnRlZCB3aWxsCisgICAgICogcmV0dXJuIGEgdmFsdWUgb2YgemVyby4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIGN1cnJlbnQgcG9zaXRpb24gaW4gdGltZSBvZiB0aGUgYW5pbWF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBsb25nIGdldEN1cnJlbnRQbGF5VGltZSgpIHsKKyAgICAgICAgaWYgKCFtSW5pdGlhbGl6ZWQgfHwgbVBsYXlpbmdTdGF0ZSA9PSBTVE9QUEVEKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQW5pbWF0aW9uVXRpbHMuY3VycmVudEFuaW1hdGlvblRpbWVNaWxsaXMoKSAtIG1TdGFydFRpbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBjdXN0b20sIHN0YXRpYyBoYW5kbGVyIGhhbmRsZXMgdGhlIHRpbWluZyBwdWxzZSB0aGF0IGlzIHNoYXJlZCBieQorICAgICAqIGFsbCBhY3RpdmUgYW5pbWF0aW9ucy4gVGhpcyBhcHByb2FjaCBlbnN1cmVzIHRoYXQgdGhlIHNldHRpbmcgb2YgYW5pbWF0aW9uCisgICAgICogdmFsdWVzIHdpbGwgaGFwcGVuIG9uIHRoZSBVSSB0aHJlYWQgYW5kIHRoYXQgYWxsIGFuaW1hdGlvbnMgd2lsbCBzaGFyZQorICAgICAqIHRoZSBzYW1lIHRpbWVzIGZvciBjYWxjdWxhdGluZyB0aGVpciB2YWx1ZXMsIHdoaWNoIG1ha2VzIHN5bmNocm9uaXppbmcKKyAgICAgKiBhbmltYXRpb25zIHBvc3NpYmxlLgorICAgICAqCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQW5pbWF0aW9uSGFuZGxlciBleHRlbmRzIEhhbmRsZXIgeworICAgICAgICAvKioKKyAgICAgICAgICogVGhlcmUgYXJlIG9ubHkgdHdvIG1lc3NhZ2VzIHRoYXQgd2UgY2FyZSBhYm91dDogQU5JTUFUSU9OX1NUQVJUIGFuZAorICAgICAgICAgKiBBTklNQVRJT05fRlJBTUUuIFRoZSBTVEFSVCBtZXNzYWdlIGlzIHNlbnQgd2hlbiBhbiBhbmltYXRpb24ncyBzdGFydCgpCisgICAgICAgICAqIG1ldGhvZCBpcyBjYWxsZWQuIEl0IGNhbm5vdCBzdGFydCBzeW5jaHJvbm91c2x5IHdoZW4gc3RhcnQoKSBpcyBjYWxsZWQKKyAgICAgICAgICogYmVjYXVzZSB0aGUgY2FsbCBtYXkgYmUgb24gdGhlIHdyb25nIHRocmVhZCwgYW5kIGl0IHdvdWxkIGFsc28gbm90IGJlCisgICAgICAgICAqIHN5bmNocm9uaXplZCB3aXRoIG90aGVyIGFuaW1hdGlvbnMgYmVjYXVzZSBpdCB3b3VsZCBub3Qgc3RhcnQgb24gYSBjb21tb24KKyAgICAgICAgICogdGltaW5nIHB1bHNlLiBTbyBlYWNoIGFuaW1hdGlvbiBzZW5kcyBhIFNUQVJUIG1lc3NhZ2UgdG8gdGhlIGhhbmRsZXIsIHdoaWNoCisgICAgICAgICAqIGNhdXNlcyB0aGUgaGFuZGxlciB0byBwbGFjZSB0aGUgYW5pbWF0aW9uIG9uIHRoZSBhY3RpdmUgYW5pbWF0aW9ucyBxdWV1ZSBhbmQKKyAgICAgICAgICogc3RhcnQgcHJvY2Vzc2luZyBmcmFtZXMgZm9yIHRoYXQgYW5pbWF0aW9uLgorICAgICAgICAgKiBUaGUgRlJBTUUgbWVzc2FnZSBpcyB0aGUgb25lIHRoYXQgaXMgc2VudCBvdmVyIGFuZCBvdmVyIHdoaWxlIHRoZXJlIGFyZSBhbnkKKyAgICAgICAgICogYWN0aXZlIGFuaW1hdGlvbnMgdG8gcHJvY2Vzcy4KKyAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7CisgICAgICAgICAgICBib29sZWFuIGNhbGxBZ2FpbiA9IHRydWU7CisgICAgICAgICAgICBzd2l0Y2ggKG1zZy53aGF0KSB7CisgICAgICAgICAgICAgICAgLy8gVE9ETzogc2hvdWxkIHdlIGF2b2lkIHNlbmRpbmcgZnJhbWUgbWVzc2FnZSB3aGVuIHN0YXJ0aW5nIGlmIHdlCisgICAgICAgICAgICAgICAgLy8gd2VyZSBhbHJlYWR5IHJ1bm5pbmc/CisgICAgICAgICAgICAgICAgY2FzZSBBTklNQVRJT05fU1RBUlQ6CisgICAgICAgICAgICAgICAgICAgIGlmIChzQW5pbWF0aW9ucy5zaXplKCkgPiAwIHx8IHNEZWxheWVkQW5pbXMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FsbEFnYWluID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gcGVuZGluZ0FuaW1zIGhvbGRzIGFueSBhbmltYXRpb25zIHRoYXQgaGF2ZSByZXF1ZXN0ZWQgdG8gYmUgc3RhcnRlZAorICAgICAgICAgICAgICAgICAgICAvLyBXZSdyZSBnb2luZyB0byBjbGVhciBzUGVuZGluZ0FuaW1hdGlvbnMsIGJ1dCBzdGFydGluZyBhbmltYXRpb24gbWF5CisgICAgICAgICAgICAgICAgICAgIC8vIGNhdXNlIG1vcmUgdG8gYmUgYWRkZWQgdG8gdGhlIHBlbmRpbmcgbGlzdCAoZm9yIGV4YW1wbGUsIGlmIG9uZSBhbmltYXRpb24KKyAgICAgICAgICAgICAgICAgICAgLy8gc3RhcnRpbmcgdHJpZ2dlcnMgYW5vdGhlciBzdGFydGluZykuIFNvIHdlIGxvb3AgdW50aWwgc1BlbmRpbmdBbmltYXRpb25zCisgICAgICAgICAgICAgICAgICAgIC8vIGlzIGVtcHR5LgorICAgICAgICAgICAgICAgICAgICB3aGlsZSAoc1BlbmRpbmdBbmltYXRpb25zLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5TGlzdDxBbmltYXRvcj4gcGVuZGluZ0NvcHkgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQXJyYXlMaXN0PEFuaW1hdG9yPikgc1BlbmRpbmdBbmltYXRpb25zLmNsb25lKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzUGVuZGluZ0FuaW1hdGlvbnMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCA9IHBlbmRpbmdDb3B5LnNpemUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7ICsraSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFuaW1hdG9yIGFuaW0gPSBwZW5kaW5nQ29weS5nZXQoaSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIGFuaW1hdGlvbiBoYXMgYSBzdGFydERlbGF5LCBwbGFjZSBpdCBvbiB0aGUgZGVsYXllZCBsaXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFuaW0ubVN0YXJ0RGVsYXkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmltLnN0YXJ0QW5pbWF0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc0RlbGF5ZWRBbmltcy5hZGQoYW5pbSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaCB0byBwcm9jZXNzIGZpcnN0IGZyYW1lIG9mIG5ldyBhbmltYXRpb25zCisgICAgICAgICAgICAgICAgY2FzZSBBTklNQVRJT05fRlJBTUU6CisgICAgICAgICAgICAgICAgICAgIC8vIGN1cnJlbnRUaW1lIGhvbGRzIHRoZSBjb21tb24gdGltZSBmb3IgYWxsIGFuaW1hdGlvbnMgcHJvY2Vzc2VkCisgICAgICAgICAgICAgICAgICAgIC8vIGR1cmluZyB0aGlzIGZyYW1lCisgICAgICAgICAgICAgICAgICAgIGxvbmcgY3VycmVudFRpbWUgPSBBbmltYXRpb25VdGlscy5jdXJyZW50QW5pbWF0aW9uVGltZU1pbGxpcygpOworCisgICAgICAgICAgICAgICAgICAgIC8vIEZpcnN0LCBwcm9jZXNzIGFuaW1hdGlvbnMgY3VycmVudGx5IHNpdHRpbmcgb24gdGhlIGRlbGF5ZWQgcXVldWUsIGFkZGluZworICAgICAgICAgICAgICAgICAgICAvLyB0aGVtIHRvIHRoZSBhY3RpdmUgYW5pbWF0aW9ucyBpZiB0aGV5IGFyZSByZWFkeQorICAgICAgICAgICAgICAgICAgICBpbnQgbnVtRGVsYXllZEFuaW1zID0gc0RlbGF5ZWRBbmltcy5zaXplKCk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtRGVsYXllZEFuaW1zOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFuaW1hdG9yIGFuaW0gPSBzRGVsYXllZEFuaW1zLmdldChpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhbmltLmRlbGF5ZWRBbmltYXRpb25GcmFtZShjdXJyZW50VGltZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzUmVhZHlBbmltcy5hZGQoYW5pbSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaW50IG51bVJlYWR5QW5pbXMgPSBzUmVhZHlBbmltcy5zaXplKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChudW1SZWFkeUFuaW1zID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1SZWFkeUFuaW1zOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbmltYXRvciBhbmltID0gc1JlYWR5QW5pbXMuZ2V0KGkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW0uc3RhcnRBbmltYXRpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzRGVsYXllZEFuaW1zLnJlbW92ZShhbmltKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHNSZWFkeUFuaW1zLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBOb3cgcHJvY2VzcyBhbGwgYWN0aXZlIGFuaW1hdGlvbnMuIFRoZSByZXR1cm4gdmFsdWUgZnJvbSBhbmltYXRpb25GcmFtZSgpCisgICAgICAgICAgICAgICAgICAgIC8vIHRlbGxzIHRoZSBoYW5kbGVyIHdoZXRoZXIgaXQgc2hvdWxkIG5vdyBiZSBlbmRlZAorICAgICAgICAgICAgICAgICAgICBpbnQgbnVtQW5pbXMgPSBzQW5pbWF0aW9ucy5zaXplKCk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQW5pbXM7ICsraSkgeworICAgICAgICAgICAgICAgICAgICAgICAgQW5pbWF0b3IgYW5pbSA9IHNBbmltYXRpb25zLmdldChpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhbmltLmFuaW1hdGlvbkZyYW1lKGN1cnJlbnRUaW1lKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNFbmRpbmdBbmltcy5hZGQoYW5pbSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHNFbmRpbmdBbmltcy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNFbmRpbmdBbmltcy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNFbmRpbmdBbmltcy5nZXQoaSkuZW5kQW5pbWF0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBzRW5kaW5nQW5pbXMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZXJlIGFyZSBzdGlsbCBhY3RpdmUgb3IgZGVsYXllZCBhbmltYXRpb25zLCBjYWxsIHRoZSBoYW5kbGVyIGFnYWluCisgICAgICAgICAgICAgICAgICAgIC8vIGFmdGVyIHRoZSBmcmFtZURlbGF5CisgICAgICAgICAgICAgICAgICAgIGlmIChjYWxsQWdhaW4gJiYgKCFzQW5pbWF0aW9ucy5pc0VtcHR5KCkgfHwgIXNEZWxheWVkQW5pbXMuaXNFbXB0eSgpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2VuZEVtcHR5TWVzc2FnZURlbGF5ZWQoQU5JTUFUSU9OX0ZSQU1FLCBzRnJhbWVEZWxheSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgYW1vdW50IG9mIHRpbWUsIGluIG1pbGxpc2Vjb25kcywgdG8gZGVsYXkgc3RhcnRpbmcgdGhlIGFuaW1hdGlvbiBhZnRlcgorICAgICAqIHtAbGluayAjc3RhcnQoKX0gaXMgY2FsbGVkLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byBkZWxheSBydW5uaW5nIHRoZSBhbmltYXRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRTdGFydERlbGF5KCkgeworICAgICAgICByZXR1cm4gbVN0YXJ0RGVsYXk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGFtb3VudCBvZiB0aW1lLCBpbiBtaWxsaXNlY29uZHMsIHRvIGRlbGF5IHN0YXJ0aW5nIHRoZSBhbmltYXRpb24gYWZ0ZXIKKyAgICAgKiB7QGxpbmsgI3N0YXJ0KCl9IGlzIGNhbGxlZC4KKworICAgICAqIEBwYXJhbSBzdGFydERlbGF5IFRoZSBhbW91bnQgb2YgdGhlIGRlbGF5LCBpbiBtaWxsaXNlY29uZHMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTdGFydERlbGF5KGxvbmcgc3RhcnREZWxheSkgeworICAgICAgICB0aGlzLm1TdGFydERlbGF5ID0gc3RhcnREZWxheTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgYW1vdW50IG9mIHRpbWUsIGluIG1pbGxpc2Vjb25kcywgYmV0d2VlbiBlYWNoIGZyYW1lIG9mIHRoZSBhbmltYXRpb24uIFRoaXMgaXMgYQorICAgICAqIHJlcXVlc3RlZCB0aW1lIHRoYXQgdGhlIGFuaW1hdGlvbiB3aWxsIGF0dGVtcHQgdG8gaG9ub3IsIGJ1dCB0aGUgYWN0dWFsIGRlbGF5IGJldHdlZW4KKyAgICAgKiBmcmFtZXMgbWF5IGJlIGRpZmZlcmVudCwgZGVwZW5kaW5nIG9uIHN5c3RlbSBsb2FkIGFuZCBjYXBhYmlsaXRpZXMuIFRoaXMgaXMgYSBzdGF0aWMKKyAgICAgKiBmdW5jdGlvbiBiZWNhdXNlIHRoZSBzYW1lIGRlbGF5IHdpbGwgYmUgYXBwbGllZCB0byBhbGwgYW5pbWF0aW9ucywgc2luY2UgdGhleSBhcmUgYWxsCisgICAgICogcnVuIG9mZiBvZiBhIHNpbmdsZSB0aW1pbmcgbG9vcC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHJlcXVlc3RlZCB0aW1lIGJldHdlZW4gZnJhbWVzLCBpbiBtaWxsaXNlY29uZHMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGxvbmcgZ2V0RnJhbWVEZWxheSgpIHsKKyAgICAgICAgcmV0dXJuIHNGcmFtZURlbGF5OworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBhbW91bnQgb2YgdGltZSwgaW4gbWlsbGlzZWNvbmRzLCBiZXR3ZWVuIGVhY2ggZnJhbWUgb2YgdGhlIGFuaW1hdGlvbi4gVGhpcyBpcyBhCisgICAgICogcmVxdWVzdGVkIHRpbWUgdGhhdCB0aGUgYW5pbWF0aW9uIHdpbGwgYXR0ZW1wdCB0byBob25vciwgYnV0IHRoZSBhY3R1YWwgZGVsYXkgYmV0d2VlbgorICAgICAqIGZyYW1lcyBtYXkgYmUgZGlmZmVyZW50LCBkZXBlbmRpbmcgb24gc3lzdGVtIGxvYWQgYW5kIGNhcGFiaWxpdGllcy4gVGhpcyBpcyBhIHN0YXRpYworICAgICAqIGZ1bmN0aW9uIGJlY2F1c2UgdGhlIHNhbWUgZGVsYXkgd2lsbCBiZSBhcHBsaWVkIHRvIGFsbCBhbmltYXRpb25zLCBzaW5jZSB0aGV5IGFyZSBhbGwKKyAgICAgKiBydW4gb2ZmIG9mIGEgc2luZ2xlIHRpbWluZyBsb29wLgorICAgICAqCisgICAgICogQHBhcmFtIGZyYW1lRGVsYXkgdGhlIHJlcXVlc3RlZCB0aW1lIGJldHdlZW4gZnJhbWVzLCBpbiBtaWxsaXNlY29uZHMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0RnJhbWVEZWxheShsb25nIGZyYW1lRGVsYXkpIHsKKyAgICAgICAgc0ZyYW1lRGVsYXkgPSBmcmFtZURlbGF5OworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBtb3N0IHJlY2VudCB2YWx1ZSBjYWxjdWxhdGVkIGJ5IHRoaXMgPGNvZGU+QW5pbWF0b3I8L2NvZGU+IHdoZW4gdGhlcmUgaXMganVzdCBvbmUKKyAgICAgKiBwcm9wZXJ0eSBiZWluZyBhbmltYXRlZC4gVGhpcyB2YWx1ZSBpcyBvbmx5IHNlbnNpYmxlIHdoaWxlIHRoZSBhbmltYXRpb24gaXMgcnVubmluZy4gVGhlIG1haW4KKyAgICAgKiBwdXJwb3NlIGZvciB0aGlzIHJlYWQtb25seSBwcm9wZXJ0eSBpcyB0byByZXRyaWV2ZSB0aGUgdmFsdWUgZnJvbSB0aGUgPGNvZGU+QW5pbWF0b3I8L2NvZGU+CisgICAgICogZHVyaW5nIGEgY2FsbCB0byB7QGxpbmsgQW5pbWF0b3JVcGRhdGVMaXN0ZW5lciNvbkFuaW1hdGlvblVwZGF0ZShBbmltYXRvcil9LCB3aGljaAorICAgICAqIGlzIGNhbGxlZCBkdXJpbmcgZWFjaCBhbmltYXRpb24gZnJhbWUsIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSB2YWx1ZSBpcyBjYWxjdWxhdGVkLgorICAgICAqCisgICAgICogQHJldHVybiBhbmltYXRlZFZhbHVlIFRoZSB2YWx1ZSBtb3N0IHJlY2VudGx5IGNhbGN1bGF0ZWQgYnkgdGhpcyA8Y29kZT5BbmltYXRvcjwvY29kZT4gZm9yCisgICAgICogdGhlIHNpbmdsZSBwcm9wZXJ0eSBiZWluZyBhbmltYXRlZC4gSWYgdGhlcmUgYXJlIHNldmVyYWwgcHJvcGVydGllcyBiZWluZyBhbmltYXRlZAorICAgICAqIChzcGVjaWZpZWQgYnkgc2V2ZXJhbCBQcm9wZXJ0eVZhbHVlc0hvbGRlciBvYmplY3RzIGluIHRoZSBjb25zdHJ1Y3RvciksIHRoaXMgZnVuY3Rpb24KKyAgICAgKiByZXR1cm5zIHRoZSBhbmltYXRlZCB2YWx1ZSBmb3IgdGhlIGZpcnN0IG9mIHRob3NlIG9iamVjdHMuCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBnZXRBbmltYXRlZFZhbHVlKCkgeworICAgICAgICBpZiAobVZhbHVlcyAhPSBudWxsICYmIG1WYWx1ZXMubGVuZ3RoID4gMCkgeworICAgICAgICAgICAgcmV0dXJuIG1WYWx1ZXNbMF0uZ2V0QW5pbWF0ZWRWYWx1ZSgpOworICAgICAgICB9CisgICAgICAgIC8vIFNob3VsZG4ndCBnZXQgaGVyZTsgc2hvdWxkIGFsd2F5cyBoYXZlIHZhbHVlcyB1bmxlc3MgQW5pbWF0b3Igd2FzIHNldCB1cCB3cm9uZworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgbW9zdCByZWNlbnQgdmFsdWUgY2FsY3VsYXRlZCBieSB0aGlzIDxjb2RlPkFuaW1hdG9yPC9jb2RlPiBmb3IgPGNvZGU+cHJvcGVydHlOYW1lPC9jb2RlPi4KKyAgICAgKiBUaGUgbWFpbiBwdXJwb3NlIGZvciB0aGlzIHJlYWQtb25seSBwcm9wZXJ0eSBpcyB0byByZXRyaWV2ZSB0aGUgdmFsdWUgZnJvbSB0aGUKKyAgICAgKiA8Y29kZT5BbmltYXRvcjwvY29kZT4gZHVyaW5nIGEgY2FsbCB0bworICAgICAqIHtAbGluayBBbmltYXRvclVwZGF0ZUxpc3RlbmVyI29uQW5pbWF0aW9uVXBkYXRlKEFuaW1hdG9yKX0sIHdoaWNoCisgICAgICogaXMgY2FsbGVkIGR1cmluZyBlYWNoIGFuaW1hdGlvbiBmcmFtZSwgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIHZhbHVlIGlzIGNhbGN1bGF0ZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGFuaW1hdGVkVmFsdWUgVGhlIHZhbHVlIG1vc3QgcmVjZW50bHkgY2FsY3VsYXRlZCBmb3IgdGhlIG5hbWVkIHByb3BlcnR5CisgICAgICogYnkgdGhpcyA8Y29kZT5BbmltYXRvcjwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBnZXRBbmltYXRlZFZhbHVlKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKKyAgICAgICAgUHJvcGVydHlWYWx1ZXNIb2xkZXIgdmFsdWVzSG9sZGVyID0gbVZhbHVlc01hcC5nZXQocHJvcGVydHlOYW1lKTsKKyAgICAgICAgaWYgKHZhbHVlc0hvbGRlciAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gdmFsdWVzSG9sZGVyLmdldEFuaW1hdGVkVmFsdWUoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIEF0IGxlYXN0IGF2b2lkIGNyYXNoaW5nIGlmIGNhbGxlZCB3aXRoIGJvZ3VzIHByb3BlcnR5TmFtZQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIGhvdyBtYW55IHRpbWVzIHRoZSBhbmltYXRpb24gc2hvdWxkIGJlIHJlcGVhdGVkLiBJZiB0aGUgcmVwZWF0CisgICAgICogY291bnQgaXMgMCwgdGhlIGFuaW1hdGlvbiBpcyBuZXZlciByZXBlYXRlZC4gSWYgdGhlIHJlcGVhdCBjb3VudCBpcworICAgICAqIGdyZWF0ZXIgdGhhbiAwIG9yIHtAbGluayAjSU5GSU5JVEV9LCB0aGUgcmVwZWF0IG1vZGUgd2lsbCBiZSB0YWtlbgorICAgICAqIGludG8gYWNjb3VudC4gVGhlIHJlcGVhdCBjb3VudCBpcyAwIGJ5IGRlZmF1bHQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG51bWJlciBvZiB0aW1lcyB0aGUgYW5pbWF0aW9uIHNob3VsZCBiZSByZXBlYXRlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlcGVhdENvdW50KGludCB2YWx1ZSkgeworICAgICAgICBtUmVwZWF0Q291bnQgPSB2YWx1ZTsKKyAgICB9CisgICAgLyoqCisgICAgICogRGVmaW5lcyBob3cgbWFueSB0aW1lcyB0aGUgYW5pbWF0aW9uIHNob3VsZCByZXBlYXQuIFRoZSBkZWZhdWx0IHZhbHVlCisgICAgICogaXMgMC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiB0aW1lcyB0aGUgYW5pbWF0aW9uIHNob3VsZCByZXBlYXQsIG9yIHtAbGluayAjSU5GSU5JVEV9CisgICAgICovCisgICAgcHVibGljIGludCBnZXRSZXBlYXRDb3VudCgpIHsKKyAgICAgICAgcmV0dXJuIG1SZXBlYXRDb3VudDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWZpbmVzIHdoYXQgdGhpcyBhbmltYXRpb24gc2hvdWxkIGRvIHdoZW4gaXQgcmVhY2hlcyB0aGUgZW5kLiBUaGlzCisgICAgICogc2V0dGluZyBpcyBhcHBsaWVkIG9ubHkgd2hlbiB0aGUgcmVwZWF0IGNvdW50IGlzIGVpdGhlciBncmVhdGVyIHRoYW4KKyAgICAgKiAwIG9yIHtAbGluayAjSU5GSU5JVEV9LiBEZWZhdWx0cyB0byB7QGxpbmsgI1JFU1RBUlR9LgorICAgICAqCisgICAgICogQHBhcmFtIHZhbHVlIHtAbGluayAjUkVTVEFSVH0gb3Ige0BsaW5rICNSRVZFUlNFfQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlcGVhdE1vZGUoaW50IHZhbHVlKSB7CisgICAgICAgIG1SZXBlYXRNb2RlID0gdmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVmaW5lcyB3aGF0IHRoaXMgYW5pbWF0aW9uIHNob3VsZCBkbyB3aGVuIGl0IHJlYWNoZXMgdGhlIGVuZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gZWl0aGVyIG9uZSBvZiB7QGxpbmsgI1JFVkVSU0V9IG9yIHtAbGluayAjUkVTVEFSVH0KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFJlcGVhdE1vZGUoKSB7CisgICAgICAgIHJldHVybiBtUmVwZWF0TW9kZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgbGlzdGVuZXIgdG8gdGhlIHNldCBvZiBsaXN0ZW5lcnMgdGhhdCBhcmUgc2VudCB1cGRhdGUgZXZlbnRzIHRocm91Z2ggdGhlIGxpZmUgb2YKKyAgICAgKiBhbiBhbmltYXRpb24uIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBvbiBhbGwgbGlzdGVuZXJzIGZvciBldmVyeSBmcmFtZSBvZiB0aGUgYW5pbWF0aW9uLAorICAgICAqIGFmdGVyIHRoZSB2YWx1ZXMgZm9yIHRoZSBhbmltYXRpb24gaGF2ZSBiZWVuIGNhbGN1bGF0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgdGhlIGxpc3RlbmVyIHRvIGJlIGFkZGVkIHRvIHRoZSBjdXJyZW50IHNldCBvZiBsaXN0ZW5lcnMgZm9yIHRoaXMgYW5pbWF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFVwZGF0ZUxpc3RlbmVyKEFuaW1hdG9yVXBkYXRlTGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgaWYgKG1VcGRhdGVMaXN0ZW5lcnMgPT0gbnVsbCkgeworICAgICAgICAgICAgbVVwZGF0ZUxpc3RlbmVycyA9IG5ldyBBcnJheUxpc3Q8QW5pbWF0b3JVcGRhdGVMaXN0ZW5lcj4oKTsKKyAgICAgICAgfQorICAgICAgICBtVXBkYXRlTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVtb3ZlcyBhIGxpc3RlbmVyIGZyb20gdGhlIHNldCBsaXN0ZW5pbmcgdG8gZnJhbWUgdXBkYXRlcyBmb3IgdGhpcyBhbmltYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgdGhlIGxpc3RlbmVyIHRvIGJlIHJlbW92ZWQgZnJvbSB0aGUgY3VycmVudCBzZXQgb2YgdXBkYXRlIGxpc3RlbmVycworICAgICAqIGZvciB0aGlzIGFuaW1hdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVVcGRhdGVMaXN0ZW5lcihBbmltYXRvclVwZGF0ZUxpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgIGlmIChtVXBkYXRlTGlzdGVuZXJzID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBtVXBkYXRlTGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7CisgICAgICAgIGlmIChtVXBkYXRlTGlzdGVuZXJzLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICBtVXBkYXRlTGlzdGVuZXJzID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogVGhlIHRpbWUgaW50ZXJwb2xhdG9yIHVzZWQgaW4gY2FsY3VsYXRpbmcgdGhlIGVsYXBzZWQgZnJhY3Rpb24gb2YgdGhpcyBhbmltYXRpb24uIFRoZQorICAgICAqIGludGVycG9sYXRvciBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGFuaW1hdGlvbiBydW5zIHdpdGggbGluZWFyIG9yIG5vbi1saW5lYXIgbW90aW9uLAorICAgICAqIHN1Y2ggYXMgYWNjZWxlcmF0aW9uIGFuZCBkZWNlbGVyYXRpb24uIFRoZSBkZWZhdWx0IHZhbHVlIGlzCisgICAgICoge0BsaW5rIGFuZHJvaWQudmlldy5hbmltYXRpb24uQWNjZWxlcmF0ZURlY2VsZXJhdGVJbnRlcnBvbGF0b3J9CisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIGludGVycG9sYXRvciB0byBiZSB1c2VkIGJ5IHRoaXMgYW5pbWF0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SW50ZXJwb2xhdG9yKEludGVycG9sYXRvciB2YWx1ZSkgeworICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgbUludGVycG9sYXRvciA9IHZhbHVlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdGltaW5nIGludGVycG9sYXRvciB0aGF0IHRoaXMgQW5pbWF0b3IgdXNlcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIHRpbWluZyBpbnRlcnBvbGF0b3IgZm9yIHRoaXMgQW5pbWF0b3IuCisgICAgICovCisgICAgcHVibGljIEludGVycG9sYXRvciBnZXRJbnRlcnBvbGF0b3IoKSB7CisgICAgICAgIHJldHVybiBtSW50ZXJwb2xhdG9yOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSB0eXBlIGV2YWx1YXRvciB0byBiZSB1c2VkIHdoZW4gY2FsY3VsYXRpbmcgdGhlIGFuaW1hdGVkIHZhbHVlcyBvZiB0aGlzIGFuaW1hdGlvbi4KKyAgICAgKiBUaGUgc3lzdGVtIHdpbGwgYXV0b21hdGljYWxseSBhc3NpZ24gYSBmbG9hdCwgaW50LCBvciBkb3VibGUgZXZhbHVhdG9yIGJhc2VkIG9uIHRoZSB0eXBlCisgICAgICogb2YgPGNvZGU+c3RhcnRWYWx1ZTwvY29kZT4gYW5kIDxjb2RlPmVuZFZhbHVlPC9jb2RlPiBpbiB0aGUgY29uc3RydWN0b3IuIEJ1dCBpZiB0aGVzZSB2YWx1ZXMKKyAgICAgKiBhcmUgbm90IG9uZSBvZiB0aGVzZSBwcmltaXRpdmUgdHlwZXMsIG9yIGlmIGRpZmZlcmVudCBldmFsdWF0aW9uIGlzIGRlc2lyZWQgKHN1Y2ggYXMgaXMKKyAgICAgKiBuZWNlc3Nhcnkgd2l0aCBpbnQgdmFsdWVzIHRoYXQgcmVwcmVzZW50IGNvbG9ycyksIGEgY3VzdG9tIGV2YWx1YXRvciBuZWVkcyB0byBiZSBhc3NpZ25lZC4KKyAgICAgKiBGb3IgZXhhbXBsZSwgd2hlbiBydW5uaW5nIGFuIGFuaW1hdGlvbiBvbiBjb2xvciB2YWx1ZXMsIHRoZSB7QGxpbmsgUkdCRXZhbHVhdG9yfQorICAgICAqIHNob3VsZCBiZSB1c2VkIHRvIGdldCBjb3JyZWN0IFJHQiBjb2xvciBpbnRlcnBvbGF0aW9uLgorICAgICAqCisgICAgICogPHA+SWYgdGhpcyBBbmltYXRvciBoYXMgb25seSBvbmUgc2V0IG9mIHZhbHVlcyBiZWluZyBhbmltYXRlZCBiZXR3ZWVuLCB0aGlzIGV2YWx1YXRvcgorICAgICAqIHdpbGwgYmUgdXNlZCBmb3IgdGhhdCBzZXQuIElmIHRoZXJlIGFyZSBzZXZlcmFsIHNldHMgb2YgdmFsdWVzIGJlaW5nIGFuaW1hdGVkLCB3aGljaCBpcworICAgICAqIHRoZSBjYXNlIGlmIFByb3BlcnR5VmFsdWVzSE9sZGVyIG9iamVjdHMgd2VyZSBzZXQgb24gdGhlIEFuaW1hdG9yLCB0aGVuIHRoZSBldmFsdWF0b3IKKyAgICAgKiBpcyBhc3NpZ25lZCBqdXN0IHRvIHRoZSBmaXJzdCBQcm9wZXJ0eVZhbHVlc0hvbGRlciBvYmplY3QuPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIHZhbHVlIHRoZSBldmFsdWF0b3IgdG8gYmUgdXNlZCB0aGlzIGFuaW1hdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEV2YWx1YXRvcihUeXBlRXZhbHVhdG9yIHZhbHVlKSB7CisgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsICYmIG1WYWx1ZXMgIT0gbnVsbCAmJiBtVmFsdWVzLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgIG1WYWx1ZXNbMF0uc2V0RXZhbHVhdG9yKHZhbHVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFN0YXJ0IHRoZSBhbmltYXRpb24gcGxheWluZy4gVGhpcyB2ZXJzaW9uIG9mIHN0YXJ0KCkgdGFrZXMgYSBib29sZWFuIGZsYWcgdGhhdCBpbmRpY2F0ZXMKKyAgICAgKiB3aGV0aGVyIHRoZSBhbmltYXRpb24gc2hvdWxkIHBsYXkgaW4gcmV2ZXJzZS4gVGhlIGZsYWcgaXMgdXN1YWxseSBmYWxzZSwgYnV0IG1heSBiZSBzZXQKKyAgICAgKiB0byB0cnVlIGlmIGNhbGxlZCBmcm9tIHRoZSByZXZlcnNlKCkgbWV0aG9kLworICAgICAqCisgICAgICogQHBhcmFtIHBsYXlCYWNrd2FyZHMgV2hldGhlciB0aGUgQW5pbWF0b3Igc2hvdWxkIHN0YXJ0IHBsYXlpbmcgaW4gcmV2ZXJzZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgc3RhcnQoYm9vbGVhbiBwbGF5QmFja3dhcmRzKSB7CisgICAgICAgIG1QbGF5aW5nQmFja3dhcmRzID0gcGxheUJhY2t3YXJkczsKKyAgICAgICAgaWYgKChtU3RhcnREZWxheSA9PSAwKSAmJiAoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKSA9PSBMb29wZXIuZ2V0TWFpbkxvb3BlcigpLmdldFRocmVhZCgpKSkgeworICAgICAgICAgICAgLy8gVGhpcyBzZXRzIHRoZSBpbml0aWFsIHZhbHVlIG9mIHRoZSBhbmltYXRpb24sIHByaW9yIHRvIGFjdHVhbGx5IHN0YXJ0aW5nIGl0IHJ1bm5pbmcKKyAgICAgICAgICAgIHNldEN1cnJlbnRQbGF5VGltZShnZXRDdXJyZW50UGxheVRpbWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgbVBsYXlpbmdTdGF0ZSA9IFNUT1BQRUQ7CisgICAgICAgIHNQZW5kaW5nQW5pbWF0aW9ucy5hZGQodGhpcyk7CisgICAgICAgIGlmIChzQW5pbWF0aW9uSGFuZGxlciA9PSBudWxsKSB7CisgICAgICAgICAgICBzQW5pbWF0aW9uSGFuZGxlciA9IG5ldyBBbmltYXRpb25IYW5kbGVyKCk7CisgICAgICAgIH0KKyAgICAgICAgLy8gVE9ETzogZG9lcyB0aGlzIHB1dCB0b28gbWFueSBtZXNzYWdlcyBvbiB0aGUgcXVldWUgaWYgdGhlIGhhbmRsZXIKKyAgICAgICAgLy8gaXMgYWxyZWFkeSBydW5uaW5nPworICAgICAgICBzQW5pbWF0aW9uSGFuZGxlci5zZW5kRW1wdHlNZXNzYWdlKEFOSU1BVElPTl9TVEFSVCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc3RhcnQoKSB7CisgICAgICAgIHN0YXJ0KGZhbHNlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBjYW5jZWwoKSB7CisgICAgICAgIGlmIChtTGlzdGVuZXJzICE9IG51bGwpIHsKKyAgICAgICAgICAgIEFycmF5TGlzdDxBbmltYXRhYmxlTGlzdGVuZXI+IHRtcExpc3RlbmVycyA9CisgICAgICAgICAgICAgICAgICAgIChBcnJheUxpc3Q8QW5pbWF0YWJsZUxpc3RlbmVyPikgbUxpc3RlbmVycy5jbG9uZSgpOworICAgICAgICAgICAgZm9yIChBbmltYXRhYmxlTGlzdGVuZXIgbGlzdGVuZXIgOiB0bXBMaXN0ZW5lcnMpIHsKKyAgICAgICAgICAgICAgICBsaXN0ZW5lci5vbkFuaW1hdGlvbkNhbmNlbCh0aGlzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBKdXN0IHNldCB0aGUgQ0FOQ0VMRUQgZmxhZyAtIHRoaXMgY2F1c2VzIHRoZSBhbmltYXRpb24gdG8gZW5kIHRoZSBuZXh0IHRpbWUgYSBmcmFtZQorICAgICAgICAvLyBpcyBwcm9jZXNzZWQuCisgICAgICAgIG1QbGF5aW5nU3RhdGUgPSBDQU5DRUxFRDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBlbmQoKSB7CisgICAgICAgIC8vIEp1c3Qgc2V0IHRoZSBFTkRFRCBmbGFnIC0gdGhpcyBjYXVzZXMgdGhlIGFuaW1hdGlvbiB0byBlbmQgdGhlIG5leHQgdGltZSBhIGZyYW1lCisgICAgICAgIC8vIGlzIHByb2Nlc3NlZC4KKyAgICAgICAgbVBsYXlpbmdTdGF0ZSA9IEVOREVEOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgd2hldGhlciB0aGlzIEFuaW1hdG9yIGlzIGN1cnJlbnRseSBydW5uaW5nIChoYXZpbmcgYmVlbiBzdGFydGVkIGFuZCBub3QgeWV0IGVuZGVkKS4KKyAgICAgKiBAcmV0dXJuIFdlaHRoZXIgdGhlIEFuaW1hdG9yIGlzIHJ1bm5pbmcuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNSdW5uaW5nKCkgeworICAgICAgICByZXR1cm4gbVBsYXlpbmdTdGF0ZSA9PSBSVU5OSU5HOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBsYXlzIHRoZSBBbmltYXRvciBpbiByZXZlcnNlLiBJZiB0aGUgYW5pbWF0aW9uIGlzIGFscmVhZHkgcnVubmluZywKKyAgICAgKiBpdCB3aWxsIHN0b3AgaXRzZWxmIGFuZCBwbGF5IGJhY2t3YXJkcyBmcm9tIHRoZSBwb2ludCByZWFjaGVkIHdoZW4gcmV2ZXJzZSB3YXMgY2FsbGVkLgorICAgICAqIElmIHRoZSBhbmltYXRpb24gaXMgbm90IGN1cnJlbnRseSBydW5uaW5nLCB0aGVuIGl0IHdpbGwgc3RhcnQgZnJvbSB0aGUgZW5kIGFuZAorICAgICAqIHBsYXkgYmFja3dhcmRzLiBUaGlzIGJlaGF2aW9yIGlzIG9ubHkgc2V0IGZvciB0aGUgY3VycmVudCBhbmltYXRpb247IGZ1dHVyZSBwbGF5aW5nCisgICAgICogb2YgdGhlIGFuaW1hdGlvbiB3aWxsIHVzZSB0aGUgZGVmYXVsdCBiZWhhdmlvciBvZiBwbGF5aW5nIGZvcndhcmQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmV2ZXJzZSgpIHsKKyAgICAgICAgbVBsYXlpbmdCYWNrd2FyZHMgPSAhbVBsYXlpbmdCYWNrd2FyZHM7CisgICAgICAgIGlmIChtUGxheWluZ1N0YXRlID09IFJVTk5JTkcpIHsKKyAgICAgICAgICAgIGxvbmcgY3VycmVudFRpbWUgPSBBbmltYXRpb25VdGlscy5jdXJyZW50QW5pbWF0aW9uVGltZU1pbGxpcygpOworICAgICAgICAgICAgbG9uZyBjdXJyZW50UGxheVRpbWUgPSBjdXJyZW50VGltZSAtIG1TdGFydFRpbWU7CisgICAgICAgICAgICBsb25nIHRpbWVMZWZ0ID0gbUR1cmF0aW9uIC0gY3VycmVudFBsYXlUaW1lOworICAgICAgICAgICAgbVN0YXJ0VGltZSA9IGN1cnJlbnRUaW1lIC0gdGltZUxlZnQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdGFydCh0cnVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxlZCBpbnRlcm5hbGx5IHRvIGVuZCBhbiBhbmltYXRpb24gYnkgcmVtb3ZpbmcgaXQgZnJvbSB0aGUgYW5pbWF0aW9ucyBsaXN0LiBNdXN0IGJlCisgICAgICogY2FsbGVkIG9uIHRoZSBVSSB0aHJlYWQuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGVuZEFuaW1hdGlvbigpIHsKKyAgICAgICAgc0FuaW1hdGlvbnMucmVtb3ZlKHRoaXMpOworICAgICAgICBpZiAobUxpc3RlbmVycyAhPSBudWxsKSB7CisgICAgICAgICAgICBBcnJheUxpc3Q8QW5pbWF0YWJsZUxpc3RlbmVyPiB0bXBMaXN0ZW5lcnMgPQorICAgICAgICAgICAgICAgICAgICAoQXJyYXlMaXN0PEFuaW1hdGFibGVMaXN0ZW5lcj4pIG1MaXN0ZW5lcnMuY2xvbmUoKTsKKyAgICAgICAgICAgIGZvciAoQW5pbWF0YWJsZUxpc3RlbmVyIGxpc3RlbmVyIDogdG1wTGlzdGVuZXJzKSB7CisgICAgICAgICAgICAgICAgbGlzdGVuZXIub25BbmltYXRpb25FbmQodGhpcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbVBsYXlpbmdTdGF0ZSA9IFNUT1BQRUQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIGludGVybmFsbHkgdG8gc3RhcnQgYW4gYW5pbWF0aW9uIGJ5IGFkZGluZyBpdCB0byB0aGUgYWN0aXZlIGFuaW1hdGlvbnMgbGlzdC4gTXVzdCBiZQorICAgICAqIGNhbGxlZCBvbiB0aGUgVUkgdGhyZWFkLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzdGFydEFuaW1hdGlvbigpIHsKKyAgICAgICAgaW5pdEFuaW1hdGlvbigpOworICAgICAgICBzQW5pbWF0aW9ucy5hZGQodGhpcyk7CisgICAgICAgIGlmIChtTGlzdGVuZXJzICE9IG51bGwpIHsKKyAgICAgICAgICAgIEFycmF5TGlzdDxBbmltYXRhYmxlTGlzdGVuZXI+IHRtcExpc3RlbmVycyA9CisgICAgICAgICAgICAgICAgICAgIChBcnJheUxpc3Q8QW5pbWF0YWJsZUxpc3RlbmVyPikgbUxpc3RlbmVycy5jbG9uZSgpOworICAgICAgICAgICAgZm9yIChBbmltYXRhYmxlTGlzdGVuZXIgbGlzdGVuZXIgOiB0bXBMaXN0ZW5lcnMpIHsKKyAgICAgICAgICAgICAgICBsaXN0ZW5lci5vbkFuaW1hdGlvblN0YXJ0KHRoaXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSW50ZXJuYWwgZnVuY3Rpb24gY2FsbGVkIHRvIHByb2Nlc3MgYW4gYW5pbWF0aW9uIGZyYW1lIG9uIGFuIGFuaW1hdGlvbiB0aGF0IGlzIGN1cnJlbnRseQorICAgICAqIHNsZWVwaW5nIHRocm91Z2ggaXRzIDxjb2RlPnN0YXJ0RGVsYXk8L2NvZGU+IHBoYXNlLiBUaGUgcmV0dXJuIHZhbHVlIGluZGljYXRlcyB3aGV0aGVyIGl0CisgICAgICogc2hvdWxkIGJlIHdva2VuIHVwIGFuZCBwdXQgb24gdGhlIGFjdGl2ZSBhbmltYXRpb25zIHF1ZXVlLgorICAgICAqCisgICAgICogQHBhcmFtIGN1cnJlbnRUaW1lIFRoZSBjdXJyZW50IGFuaW1hdGlvbiB0aW1lLCB1c2VkIHRvIGNhbGN1bGF0ZSB3aGV0aGVyIHRoZSBhbmltYXRpb24KKyAgICAgKiBoYXMgZXhjZWVkZWQgaXRzIDxjb2RlPnN0YXJ0RGVsYXk8L2NvZGU+IGFuZCBzaG91bGQgYmUgc3RhcnRlZC4KKyAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGFuaW1hdGlvbidzIDxjb2RlPnN0YXJ0RGVsYXk8L2NvZGU+IGhhcyBiZWVuIGV4Y2VlZGVkIGFuZCB0aGUgYW5pbWF0aW9uCisgICAgICogc2hvdWxkIGJlIGFkZGVkIHRvIHRoZSBzZXQgb2YgYWN0aXZlIGFuaW1hdGlvbnMuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGRlbGF5ZWRBbmltYXRpb25GcmFtZShsb25nIGN1cnJlbnRUaW1lKSB7CisgICAgICAgIGlmICghbVN0YXJ0ZWREZWxheSkgeworICAgICAgICAgICAgbVN0YXJ0ZWREZWxheSA9IHRydWU7CisgICAgICAgICAgICBtRGVsYXlTdGFydFRpbWUgPSBjdXJyZW50VGltZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGxvbmcgZGVsdGFUaW1lID0gY3VycmVudFRpbWUgLSBtRGVsYXlTdGFydFRpbWU7CisgICAgICAgICAgICBpZiAoZGVsdGFUaW1lID4gbVN0YXJ0RGVsYXkpIHsKKyAgICAgICAgICAgICAgICAvLyBzdGFydERlbGF5IGVuZGVkIC0gc3RhcnQgdGhlIGFuaW0gYW5kIHJlY29yZCB0aGUKKyAgICAgICAgICAgICAgICAvLyBtU3RhcnRUaW1lIGFwcHJvcHJpYXRlbHkKKyAgICAgICAgICAgICAgICBtU3RhcnRUaW1lID0gY3VycmVudFRpbWUgLSAoZGVsdGFUaW1lIC0gbVN0YXJ0RGVsYXkpOworICAgICAgICAgICAgICAgIG1QbGF5aW5nU3RhdGUgPSBSVU5OSU5HOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGludGVybmFsIGZ1bmN0aW9uIHByb2Nlc3NlcyBhIHNpbmdsZSBhbmltYXRpb24gZnJhbWUgZm9yIGEgZ2l2ZW4gYW5pbWF0aW9uLiBUaGUKKyAgICAgKiBjdXJyZW50VGltZSBwYXJhbWV0ZXIgaXMgdGhlIHRpbWluZyBwdWxzZSBzZW50IGJ5IHRoZSBoYW5kbGVyLCB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUKKyAgICAgKiBlbGFwc2VkIGR1cmF0aW9uLCBhbmQgdGhlcmVmb3JlCisgICAgICogdGhlIGVsYXBzZWQgZnJhY3Rpb24sIG9mIHRoZSBhbmltYXRpb24uIFRoZSByZXR1cm4gdmFsdWUgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGFuaW1hdGlvbgorICAgICAqIHNob3VsZCBiZSBlbmRlZCAod2hpY2ggaGFwcGVucyB3aGVuIHRoZSBlbGFwc2VkIHRpbWUgb2YgdGhlIGFuaW1hdGlvbiBleGNlZWRzIHRoZQorICAgICAqIGFuaW1hdGlvbidzIGR1cmF0aW9uLCBpbmNsdWRpbmcgdGhlIHJlcGVhdENvdW50KS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjdXJyZW50VGltZSBUaGUgY3VycmVudCB0aW1lLCBhcyB0cmFja2VkIGJ5IHRoZSBzdGF0aWMgdGltaW5nIGhhbmRsZXIKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGFuaW1hdGlvbidzIGR1cmF0aW9uLCBpbmNsdWRpbmcgYW55IHJlcGV0aXRpb25zIGR1ZSB0bworICAgICAqIDxjb2RlPnJlcGVhdENvdW50PC9jb2RlPiBoYXMgYmVlbiBleGNlZWRlZCBhbmQgdGhlIGFuaW1hdGlvbiBzaG91bGQgYmUgZW5kZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGFuaW1hdGlvbkZyYW1lKGxvbmcgY3VycmVudFRpbWUpIHsKKyAgICAgICAgYm9vbGVhbiBkb25lID0gZmFsc2U7CisKKyAgICAgICAgaWYgKG1QbGF5aW5nU3RhdGUgPT0gU1RPUFBFRCkgeworICAgICAgICAgICAgbVBsYXlpbmdTdGF0ZSA9IFJVTk5JTkc7CisgICAgICAgICAgICBpZiAobVNlZWtUaW1lIDwgMCkgeworICAgICAgICAgICAgICAgIG1TdGFydFRpbWUgPSBjdXJyZW50VGltZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbVN0YXJ0VGltZSA9IGN1cnJlbnRUaW1lIC0gbVNlZWtUaW1lOworICAgICAgICAgICAgICAgIC8vIE5vdyB0aGF0IHdlJ3JlIHBsYXlpbmcsIHJlc2V0IHRoZSBzZWVrIHRpbWUKKyAgICAgICAgICAgICAgICBtU2Vla1RpbWUgPSAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzd2l0Y2ggKG1QbGF5aW5nU3RhdGUpIHsKKyAgICAgICAgY2FzZSBSVU5OSU5HOgorICAgICAgICBjYXNlIFNFRUtFRDoKKyAgICAgICAgICAgIGZsb2F0IGZyYWN0aW9uID0gKGZsb2F0KShjdXJyZW50VGltZSAtIG1TdGFydFRpbWUpIC8gbUR1cmF0aW9uOworICAgICAgICAgICAgaWYgKGZyYWN0aW9uID49IDFmKSB7CisgICAgICAgICAgICAgICAgaWYgKG1DdXJyZW50SXRlcmF0aW9uIDwgbVJlcGVhdENvdW50IHx8IG1SZXBlYXRDb3VudCA9PSBJTkZJTklURSkgeworICAgICAgICAgICAgICAgICAgICAvLyBUaW1lIHRvIHJlcGVhdAorICAgICAgICAgICAgICAgICAgICBpZiAobUxpc3RlbmVycyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKEFuaW1hdGFibGVMaXN0ZW5lciBsaXN0ZW5lciA6IG1MaXN0ZW5lcnMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lci5vbkFuaW1hdGlvblJlcGVhdCh0aGlzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICArK21DdXJyZW50SXRlcmF0aW9uOworICAgICAgICAgICAgICAgICAgICBpZiAobVJlcGVhdE1vZGUgPT0gUkVWRVJTRSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbVBsYXlpbmdCYWNrd2FyZHMgPSBtUGxheWluZ0JhY2t3YXJkcyA/IGZhbHNlIDogdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBkb2Vzbid0IGFjY291bnQgZm9yIGZyYWN0aW9uIGdvaW5nIFdheXl5eXkgb3ZlciAxLCBsaWtlIDIrCisgICAgICAgICAgICAgICAgICAgIGZyYWN0aW9uID0gZnJhY3Rpb24gLSAxZjsKKyAgICAgICAgICAgICAgICAgICAgbVN0YXJ0VGltZSArPSBtRHVyYXRpb247CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZG9uZSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGZyYWN0aW9uID0gTWF0aC5taW4oZnJhY3Rpb24sIDEuMGYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtUGxheWluZ0JhY2t3YXJkcykgeworICAgICAgICAgICAgICAgIGZyYWN0aW9uID0gMWYgLSBmcmFjdGlvbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFuaW1hdGVWYWx1ZShmcmFjdGlvbik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBFTkRFRDoKKyAgICAgICAgICAgIC8vIFRoZSBmaW5hbCB2YWx1ZSBzZXQgb24gdGhlIHRhcmdldCB2YXJpZXMsIGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZSBhbmltYXRpb24KKyAgICAgICAgICAgIC8vIHdhcyBzdXBwb3NlZCB0byByZXBlYXQgYW4gb2RkIG51bWJlciBvZiB0aW1lcworICAgICAgICAgICAgaWYgKG1SZXBlYXRDb3VudCA+IDAgJiYgKG1SZXBlYXRDb3VudCAmIDB4MDEpID09IDEpIHsKKyAgICAgICAgICAgICAgICBhbmltYXRlVmFsdWUoMGYpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhbmltYXRlVmFsdWUoMWYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gRmFsbCB0aHJvdWdoIHRvIHNldCBkb25lIGZsYWcKKyAgICAgICAgY2FzZSBDQU5DRUxFRDoKKyAgICAgICAgICAgIGRvbmUgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZG9uZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2l0aCB0aGUgZWxhcHNlZCBmcmFjdGlvbiBvZiB0aGUgYW5pbWF0aW9uIGR1cmluZyBldmVyeQorICAgICAqIGFuaW1hdGlvbiBmcmFtZS4gVGhpcyBmdW5jdGlvbiB0dXJucyB0aGUgZWxhcHNlZCBmcmFjdGlvbiBpbnRvIGFuIGludGVycG9sYXRlZCBmcmFjdGlvbgorICAgICAqIGFuZCB0aGVuIGludG8gYW4gYW5pbWF0ZWQgdmFsdWUgKGZyb20gdGhlIGV2YWx1YXRvci4gVGhlIGZ1bmN0aW9uIGlzIGNhbGxlZCBtb3N0bHkgZHVyaW5nCisgICAgICogYW5pbWF0aW9uIHVwZGF0ZXMsIGJ1dCBpdCBpcyBhbHNvIGNhbGxlZCB3aGVuIHRoZSA8Y29kZT5lbmQoKTwvY29kZT4KKyAgICAgKiBmdW5jdGlvbiBpcyBjYWxsZWQsIHRvIHNldCB0aGUgZmluYWwgdmFsdWUgb24gdGhlIHByb3BlcnR5LgorICAgICAqCisgICAgICogPHA+T3ZlcnJpZGVzIG9mIHRoaXMgbWV0aG9kIG11c3QgY2FsbCB0aGUgc3VwZXJjbGFzcyB0byBwZXJmb3JtIHRoZSBjYWxjdWxhdGlvbgorICAgICAqIG9mIHRoZSBhbmltYXRlZCB2YWx1ZS48L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gZnJhY3Rpb24gVGhlIGVsYXBzZWQgZnJhY3Rpb24gb2YgdGhlIGFuaW1hdGlvbi4KKyAgICAgKi8KKyAgICB2b2lkIGFuaW1hdGVWYWx1ZShmbG9hdCBmcmFjdGlvbikgeworICAgICAgICBmcmFjdGlvbiA9IG1JbnRlcnBvbGF0b3IuZ2V0SW50ZXJwb2xhdGlvbihmcmFjdGlvbik7CisgICAgICAgIGludCBudW1WYWx1ZXMgPSBtVmFsdWVzLmxlbmd0aDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1WYWx1ZXM7ICsraSkgeworICAgICAgICAgICAgbVZhbHVlc1tpXS5jYWxjdWxhdGVWYWx1ZShmcmFjdGlvbik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1VcGRhdGVMaXN0ZW5lcnMgIT0gbnVsbCkgeworICAgICAgICAgICAgaW50IG51bUxpc3RlbmVycyA9IG1VcGRhdGVMaXN0ZW5lcnMuc2l6ZSgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1MaXN0ZW5lcnM7ICsraSkgeworICAgICAgICAgICAgICAgIG1VcGRhdGVMaXN0ZW5lcnMuZ2V0KGkpLm9uQW5pbWF0aW9uVXBkYXRlKHRoaXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEFuaW1hdG9yIGNsb25lKCkgdGhyb3dzIENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgQW5pbWF0b3IgYW5pbSA9IChBbmltYXRvcikgc3VwZXIuY2xvbmUoKTsKKyAgICAgICAgaWYgKG1VcGRhdGVMaXN0ZW5lcnMgIT0gbnVsbCkgeworICAgICAgICAgICAgQXJyYXlMaXN0PEFuaW1hdG9yVXBkYXRlTGlzdGVuZXI+IG9sZExpc3RlbmVycyA9IG1VcGRhdGVMaXN0ZW5lcnM7CisgICAgICAgICAgICBhbmltLm1VcGRhdGVMaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0PEFuaW1hdG9yVXBkYXRlTGlzdGVuZXI+KCk7CisgICAgICAgICAgICBpbnQgbnVtTGlzdGVuZXJzID0gb2xkTGlzdGVuZXJzLnNpemUoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtTGlzdGVuZXJzOyArK2kpIHsKKyAgICAgICAgICAgICAgICBhbmltLm1VcGRhdGVMaXN0ZW5lcnMuYWRkKG9sZExpc3RlbmVycy5nZXQoaSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGFuaW0ubVNlZWtUaW1lID0gLTE7CisgICAgICAgIGFuaW0ubVBsYXlpbmdCYWNrd2FyZHMgPSBmYWxzZTsKKyAgICAgICAgYW5pbS5tQ3VycmVudEl0ZXJhdGlvbiA9IDA7CisgICAgICAgIGFuaW0ubUluaXRpYWxpemVkID0gZmFsc2U7CisgICAgICAgIGFuaW0ubVBsYXlpbmdTdGF0ZSA9IFNUT1BQRUQ7CisgICAgICAgIGFuaW0ubVN0YXJ0ZWREZWxheSA9IGZhbHNlOworICAgICAgICBQcm9wZXJ0eVZhbHVlc0hvbGRlcltdIG9sZFZhbHVlcyA9IG1WYWx1ZXM7CisgICAgICAgIGlmIChvbGRWYWx1ZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgaW50IG51bVZhbHVlcyA9IG9sZFZhbHVlcy5sZW5ndGg7CisgICAgICAgICAgICBhbmltLm1WYWx1ZXMgPSBuZXcgUHJvcGVydHlWYWx1ZXNIb2xkZXJbbnVtVmFsdWVzXTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtVmFsdWVzOyArK2kpIHsKKyAgICAgICAgICAgICAgICBhbmltLm1WYWx1ZXNbaV0gPSBvbGRWYWx1ZXNbaV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhbmltLm1WYWx1ZXNNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFByb3BlcnR5VmFsdWVzSG9sZGVyPihudW1WYWx1ZXMpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1WYWx1ZXM7ICsraSkgeworICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVzSG9sZGVyIHZhbHVlc0hvbGRlciA9IG1WYWx1ZXNbaV07CisgICAgICAgICAgICAgICAgYW5pbS5tVmFsdWVzTWFwLnB1dCh2YWx1ZXNIb2xkZXIuZ2V0UHJvcGVydHlOYW1lKCksIHZhbHVlc0hvbGRlcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGFuaW07CisgICAgfQorCisgICAgLyoqCisgICAgICogSW1wbGVtZW50b3JzIG9mIHRoaXMgaW50ZXJmYWNlIGNhbiBhZGQgdGhlbXNlbHZlcyBhcyB1cGRhdGUgbGlzdGVuZXJzCisgICAgICogdG8gYW4gPGNvZGU+QW5pbWF0b3I8L2NvZGU+IGluc3RhbmNlIHRvIHJlY2VpdmUgY2FsbGJhY2tzIG9uIGV2ZXJ5IGFuaW1hdGlvbgorICAgICAqIGZyYW1lLCBhZnRlciB0aGUgY3VycmVudCBmcmFtZSdzIHZhbHVlcyBoYXZlIGJlZW4gY2FsY3VsYXRlZCBmb3IgdGhhdAorICAgICAqIDxjb2RlPkFuaW1hdG9yPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGludGVyZmFjZSBBbmltYXRvclVwZGF0ZUxpc3RlbmVyIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIDxwPk5vdGlmaWVzIHRoZSBvY2N1cnJlbmNlIG9mIGFub3RoZXIgZnJhbWUgb2YgdGhlIGFuaW1hdGlvbi48L3A+CisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBhbmltYXRpb24gVGhlIGFuaW1hdGlvbiB3aGljaCB3YXMgcmVwZWF0ZWQuCisgICAgICAgICAqLworICAgICAgICB2b2lkIG9uQW5pbWF0aW9uVXBkYXRlKEFuaW1hdG9yIGFuaW1hdGlvbik7CisKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL0RvdWJsZUV2YWx1YXRvci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL0RvdWJsZUV2YWx1YXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0NmViMzcKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hbmltYXRpb24vRG91YmxlRXZhbHVhdG9yLmphdmEKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5hbmltYXRpb247CisKKy8qKgorICogVGhpcyBldmFsdWF0b3IgY2FuIGJlIHVzZWQgdG8gcGVyZm9ybSB0eXBlIGludGVycG9sYXRpb24gYmV0d2VlbiA8Y29kZT5kb3VibGU8L2NvZGU+IHZhbHVlcy4KKyAqLworcHVibGljIGNsYXNzIERvdWJsZUV2YWx1YXRvciBpbXBsZW1lbnRzIFR5cGVFdmFsdWF0b3IgeworICAgIC8qKgorICAgICAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgcmVzdWx0IG9mIGxpbmVhcmx5IGludGVycG9sYXRpbmcgdGhlIHN0YXJ0IGFuZCBlbmQgdmFsdWVzLCB3aXRoCisgICAgICogPGNvZGU+ZnJhY3Rpb248L2NvZGU+IHJlcHJlc2VudGluZyB0aGUgcHJvcG9ydGlvbiBiZXR3ZWVuIHRoZSBzdGFydCBhbmQgZW5kIHZhbHVlcy4gVGhlCisgICAgICogY2FsY3VsYXRpb24gaXMgYSBzaW1wbGUgcGFyYW1ldHJpYyBjYWxjdWxhdGlvbjogPGNvZGU+cmVzdWx0ID0geDAgKyB0ICogKHYxIC0gdjApPC9jb2RlPiwKKyAgICAgKiB3aGVyZSA8Y29kZT54MDwvY29kZT4gaXMgPGNvZGU+c3RhcnRWYWx1ZTwvY29kZT4sIDxjb2RlPngxPC9jb2RlPiBpcyA8Y29kZT5lbmRWYWx1ZTwvY29kZT4sCisgICAgICogYW5kIDxjb2RlPnQ8L2NvZGU+IGlzIDxjb2RlPmZyYWN0aW9uPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmcmFjdGlvbiAgIFRoZSBmcmFjdGlvbiBmcm9tIHRoZSBzdGFydGluZyB0byB0aGUgZW5kaW5nIHZhbHVlcworICAgICAqIEBwYXJhbSBzdGFydFZhbHVlIFRoZSBzdGFydCB2YWx1ZTsgc2hvdWxkIGJlIG9mIHR5cGUgPGNvZGU+ZG91YmxlPC9jb2RlPiBvcgorICAgICAqICAgICAgICAgICAgICAgICAgIDxjb2RlPkRvdWJsZTwvY29kZT4KKyAgICAgKiBAcGFyYW0gZW5kVmFsdWUgICBUaGUgZW5kIHZhbHVlOyBzaG91bGQgYmUgb2YgdHlwZSA8Y29kZT5kb3VibGU8L2NvZGU+IG9yCisgICAgICogICAgICAgICAgICAgICAgICAgPGNvZGU+RG91YmxlPC9jb2RlPgorICAgICAqIEByZXR1cm4gQSBsaW5lYXIgaW50ZXJwb2xhdGlvbiBiZXR3ZWVuIHRoZSBzdGFydCBhbmQgZW5kIHZhbHVlcywgZ2l2ZW4gdGhlCisgICAgICogICAgICAgICA8Y29kZT5mcmFjdGlvbjwvY29kZT4gcGFyYW1ldGVyLgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgZXZhbHVhdGUoZmxvYXQgZnJhY3Rpb24sIE9iamVjdCBzdGFydFZhbHVlLCBPYmplY3QgZW5kVmFsdWUpIHsKKyAgICAgICAgZG91YmxlIHN0YXJ0RG91YmxlID0gKChOdW1iZXIpIHN0YXJ0VmFsdWUpLmRvdWJsZVZhbHVlKCk7CisgICAgICAgIHJldHVybiBzdGFydERvdWJsZSArIGZyYWN0aW9uICogKCgoTnVtYmVyKSBlbmRWYWx1ZSkuZG91YmxlVmFsdWUoKSAtIHN0YXJ0RG91YmxlKTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL0Zsb2F0RXZhbHVhdG9yLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hbmltYXRpb24vRmxvYXRFdmFsdWF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTIwNTRkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL0Zsb2F0RXZhbHVhdG9yLmphdmEKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5hbmltYXRpb247CisKKy8qKgorICogVGhpcyBldmFsdWF0b3IgY2FuIGJlIHVzZWQgdG8gcGVyZm9ybSB0eXBlIGludGVycG9sYXRpb24gYmV0d2VlbiA8Y29kZT5mbG9hdDwvY29kZT4gdmFsdWVzLgorICovCitwdWJsaWMgY2xhc3MgRmxvYXRFdmFsdWF0b3IgaW1wbGVtZW50cyBUeXBlRXZhbHVhdG9yIHsKKworICAgIC8qKgorICAgICAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgcmVzdWx0IG9mIGxpbmVhcmx5IGludGVycG9sYXRpbmcgdGhlIHN0YXJ0IGFuZCBlbmQgdmFsdWVzLCB3aXRoCisgICAgICogPGNvZGU+ZnJhY3Rpb248L2NvZGU+IHJlcHJlc2VudGluZyB0aGUgcHJvcG9ydGlvbiBiZXR3ZWVuIHRoZSBzdGFydCBhbmQgZW5kIHZhbHVlcy4gVGhlCisgICAgICogY2FsY3VsYXRpb24gaXMgYSBzaW1wbGUgcGFyYW1ldHJpYyBjYWxjdWxhdGlvbjogPGNvZGU+cmVzdWx0ID0geDAgKyB0ICogKHYxIC0gdjApPC9jb2RlPiwKKyAgICAgKiB3aGVyZSA8Y29kZT54MDwvY29kZT4gaXMgPGNvZGU+c3RhcnRWYWx1ZTwvY29kZT4sIDxjb2RlPngxPC9jb2RlPiBpcyA8Y29kZT5lbmRWYWx1ZTwvY29kZT4sCisgICAgICogYW5kIDxjb2RlPnQ8L2NvZGU+IGlzIDxjb2RlPmZyYWN0aW9uPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmcmFjdGlvbiAgIFRoZSBmcmFjdGlvbiBmcm9tIHRoZSBzdGFydGluZyB0byB0aGUgZW5kaW5nIHZhbHVlcworICAgICAqIEBwYXJhbSBzdGFydFZhbHVlIFRoZSBzdGFydCB2YWx1ZTsgc2hvdWxkIGJlIG9mIHR5cGUgPGNvZGU+ZmxvYXQ8L2NvZGU+IG9yCisgICAgICogICAgICAgICAgICAgICAgICAgPGNvZGU+RmxvYXQ8L2NvZGU+CisgICAgICogQHBhcmFtIGVuZFZhbHVlICAgVGhlIGVuZCB2YWx1ZTsgc2hvdWxkIGJlIG9mIHR5cGUgPGNvZGU+ZmxvYXQ8L2NvZGU+IG9yIDxjb2RlPkZsb2F0PC9jb2RlPgorICAgICAqIEByZXR1cm4gQSBsaW5lYXIgaW50ZXJwb2xhdGlvbiBiZXR3ZWVuIHRoZSBzdGFydCBhbmQgZW5kIHZhbHVlcywgZ2l2ZW4gdGhlCisgICAgICogICAgICAgICA8Y29kZT5mcmFjdGlvbjwvY29kZT4gcGFyYW1ldGVyLgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgZXZhbHVhdGUoZmxvYXQgZnJhY3Rpb24sIE9iamVjdCBzdGFydFZhbHVlLCBPYmplY3QgZW5kVmFsdWUpIHsKKyAgICAgICAgZmxvYXQgc3RhcnRGbG9hdCA9ICgoTnVtYmVyKSBzdGFydFZhbHVlKS5mbG9hdFZhbHVlKCk7CisgICAgICAgIHJldHVybiBzdGFydEZsb2F0ICsgZnJhY3Rpb24gKiAoKChOdW1iZXIpIGVuZFZhbHVlKS5mbG9hdFZhbHVlKCkgLSBzdGFydEZsb2F0KTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL0ludEV2YWx1YXRvci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL0ludEV2YWx1YXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyODg5MjcKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hbmltYXRpb24vSW50RXZhbHVhdG9yLmphdmEKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5hbmltYXRpb247CisKKy8qKgorICogVGhpcyBldmFsdWF0b3IgY2FuIGJlIHVzZWQgdG8gcGVyZm9ybSB0eXBlIGludGVycG9sYXRpb24gYmV0d2VlbiA8Y29kZT5pbnQ8L2NvZGU+IHZhbHVlcy4KKyAqLworcHVibGljIGNsYXNzIEludEV2YWx1YXRvciBpbXBsZW1lbnRzIFR5cGVFdmFsdWF0b3IgeworCisgICAgLyoqCisgICAgICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSByZXN1bHQgb2YgbGluZWFybHkgaW50ZXJwb2xhdGluZyB0aGUgc3RhcnQgYW5kIGVuZCB2YWx1ZXMsIHdpdGgKKyAgICAgKiA8Y29kZT5mcmFjdGlvbjwvY29kZT4gcmVwcmVzZW50aW5nIHRoZSBwcm9wb3J0aW9uIGJldHdlZW4gdGhlIHN0YXJ0IGFuZCBlbmQgdmFsdWVzLiBUaGUKKyAgICAgKiBjYWxjdWxhdGlvbiBpcyBhIHNpbXBsZSBwYXJhbWV0cmljIGNhbGN1bGF0aW9uOiA8Y29kZT5yZXN1bHQgPSB4MCArIHQgKiAodjEgLSB2MCk8L2NvZGU+LAorICAgICAqIHdoZXJlIDxjb2RlPngwPC9jb2RlPiBpcyA8Y29kZT5zdGFydFZhbHVlPC9jb2RlPiwgPGNvZGU+eDE8L2NvZGU+IGlzIDxjb2RlPmVuZFZhbHVlPC9jb2RlPiwKKyAgICAgKiBhbmQgPGNvZGU+dDwvY29kZT4gaXMgPGNvZGU+ZnJhY3Rpb248L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIGZyYWN0aW9uICAgVGhlIGZyYWN0aW9uIGZyb20gdGhlIHN0YXJ0aW5nIHRvIHRoZSBlbmRpbmcgdmFsdWVzCisgICAgICogQHBhcmFtIHN0YXJ0VmFsdWUgVGhlIHN0YXJ0IHZhbHVlOyBzaG91bGQgYmUgb2YgdHlwZSA8Y29kZT5pbnQ8L2NvZGU+IG9yCisgICAgICogICAgICAgICAgICAgICAgICAgPGNvZGU+SW50ZWdlcjwvY29kZT4KKyAgICAgKiBAcGFyYW0gZW5kVmFsdWUgICBUaGUgZW5kIHZhbHVlOyBzaG91bGQgYmUgb2YgdHlwZSA8Y29kZT5pbnQ8L2NvZGU+IG9yIDxjb2RlPkludGVnZXI8L2NvZGU+CisgICAgICogQHJldHVybiBBIGxpbmVhciBpbnRlcnBvbGF0aW9uIGJldHdlZW4gdGhlIHN0YXJ0IGFuZCBlbmQgdmFsdWVzLCBnaXZlbiB0aGUKKyAgICAgKiAgICAgICAgIDxjb2RlPmZyYWN0aW9uPC9jb2RlPiBwYXJhbWV0ZXIuCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBldmFsdWF0ZShmbG9hdCBmcmFjdGlvbiwgT2JqZWN0IHN0YXJ0VmFsdWUsIE9iamVjdCBlbmRWYWx1ZSkgeworICAgICAgICBpbnQgc3RhcnRJbnQgPSAoKE51bWJlcikgc3RhcnRWYWx1ZSkuaW50VmFsdWUoKTsKKyAgICAgICAgcmV0dXJuIChpbnQpIChzdGFydEludCArIGZyYWN0aW9uICogKCgoTnVtYmVyKSBlbmRWYWx1ZSkuaW50VmFsdWUoKSAtIHN0YXJ0SW50KSk7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9LZXlmcmFtZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL0tleWZyYW1lLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTI4MDBiMwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9LZXlmcmFtZS5qYXZhCkBAIC0wLDAgKzEsMjAzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmFuaW1hdGlvbjsKKworaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uSW50ZXJwb2xhdG9yOworCisvKioKKyAqIFRoaXMgY2xhc3MgaG9sZHMgYSB0aW1lL3ZhbHVlIHBhaXIgZm9yIGFuIGFuaW1hdGlvbi4gVGhlIEtleWZyYW1lIGNsYXNzIGlzIHVzZWQKKyAqIGJ5IHtAbGluayBBbmltYXRvcn0gdG8gZGVmaW5lIHRoZSB2YWx1ZXMgdGhhdCB0aGUgYW5pbWF0aW9uIHRhcmdldCB3aWxsIGhhdmUgb3ZlciB0aGUgY291cnNlCisgKiBvZiB0aGUgYW5pbWF0aW9uLiBBcyB0aGUgdGltZSBwcm9jZWVkcyBmcm9tIG9uZSBrZXlmcmFtZSB0byB0aGUgb3RoZXIsIHRoZSB2YWx1ZSBvZiB0aGUKKyAqIHRhcmdldCBvYmplY3Qgd2lsbCBhbmltYXRlIGJldHdlZW4gdGhlIHZhbHVlIGF0IHRoZSBwcmV2aW91cyBrZXlmcmFtZSBhbmQgdGhlIHZhbHVlIGF0IHRoZQorICogbmV4dCBrZXlmcmFtZS4gRWFjaCBrZXlmcmFtZSBhbHNvIGhvbGRzIGFuIG9wdGlvbiB7QGxpbmsgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5JbnRlcnBvbGF0b3J9CisgKiBvYmplY3QsIHdoaWNoIGRlZmluZXMgdGhlIHRpbWUgaW50ZXJwb2xhdGlvbiBvdmVyIHRoZSBpbnRlcnZhbHVlIHByZWNlZGluZyB0aGUga2V5ZnJhbWUuCisgKi8KK3B1YmxpYyBjbGFzcyBLZXlmcmFtZSB7CisgICAgLyoqCisgICAgICogVGhlIHRpbWUgYXQgd2hpY2ggbVZhbHVlIHdpbGwgaG9sZCB0cnVlLgorICAgICAqLworICAgIHByaXZhdGUgZmxvYXQgbUZyYWN0aW9uOworCisgICAgLyoqCisgICAgICogVGhlIHZhbHVlIG9mIHRoZSBhbmltYXRpb24gYXQgdGhlIHRpbWUgbUZyYWN0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgT2JqZWN0IG1WYWx1ZTsKKworICAgIC8qKgorICAgICAqIFRoZSB0eXBlIG9mIHRoZSB2YWx1ZSBpbiB0aGlzIEtleWZyYW1lLiBUaGlzIHR5cGUgaXMgZGV0ZXJtaW5lZCBhdCBjb25zdHJ1Y3Rpb24gdGltZSwKKyAgICAgKiBiYXNlZCBvbiB0aGUgdHlwZSBvZiB0aGUgPGNvZGU+dmFsdWU8L2NvZGU+IG9iamVjdCBwYXNzZWQgaW50byB0aGUgY29uc3RydWN0b3IuCisgICAgICovCisgICAgcHJpdmF0ZSBDbGFzcyBtVmFsdWVUeXBlOworCisgICAgLyoqCisgICAgICogVGhlIG9wdGlvbmFsIHRpbWUgaW50ZXJwb2xhdG9yIGZvciB0aGUgaW50ZXJ2YWwgcHJlY2VkaW5nIHRoaXMga2V5ZnJhbWUuIEEgbnVsbCBpbnRlcnBvbGF0b3IKKyAgICAgKiAodGhlIGRlZmF1bHQpIHJlc3VsdHMgaW4gbGluZWFyIGludGVycG9sYXRpb24gb3ZlciB0aGUgaW50ZXJ2YWwuCisgICAgICovCisgICAgcHJpdmF0ZSBJbnRlcnBvbGF0b3IgbUludGVycG9sYXRvciA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBQcml2YXRlIGNvbnN0cnVjdG9yLCBjYWxsZWQgZnJvbSB0aGUgcHVibGljIGNvbnN0cnVjdG9ycyB3aXRoIHRoZSBhZGRpdGlvbmFsCisgICAgICogPGNvZGU+dmFsdWVUeXBlPC9jb2RlPiBwYXJhbWV0ZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZnJhY3Rpb24gVGhlIHRpbWUsIGV4cHJlc3NlZCBhcyBhIHZhbHVlIGJldHdlZW4gMCBhbmQgMSwgcmVwcmVzZW50aW5nIHRoZSBmcmFjdGlvbgorICAgICAqIG9mIHRpbWUgZWxhcHNlZCBvZiB0aGUgb3ZlcmFsbCBhbmltYXRpb24gZHVyYXRpb24uCisgICAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0aGF0IHRoZSBvYmplY3Qgd2lsbCBhbmltYXRlIHRvIGFzIHRoZSBhbmltYXRpb24gdGltZSBhcHByb2FjaGVzCisgICAgICogdGhlIHRpbWUgaW4gdGhpcyBrZXlmcmFtZSwgYW5kIHRoZSB0aGUgdmFsdWUgYW5pbWF0ZWQgZnJvbSBhcyB0aGUgdGltZSBwYXNzZXMgdGhlIHRpbWUgaW4KKyAgICAgKiB0aGlzIGtleWZyYW1lLgorICAgICAqIEBwYXJhbSB2YWx1ZVR5cGUgVGhlIHR5cGUgb2YgdGhlIDxjb2RlPnZhbHVlPC9jb2RlPiBvYmplY3QuIFRoaXMgaXMgdXNlZCBieSB0aGUKKyAgICAgKiB7QGxpbmsgI2dldFZhbHVlKCl9IGZ1bmN0aW9ubSwgd2hpY2ggaXMgcXVlcmllZCBieSB7QGxpbmsgQW5pbWF0b3J9IHRvIGRldGVybWluZQorICAgICAqIHRoZSB0eXBlIG9mIHtAbGluayBUeXBlRXZhbHVhdG9yfSB0byB1c2UgdG8gaW50ZXJwb2xhdGUgYmV0d2VlbiB2YWx1ZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBLZXlmcmFtZShmbG9hdCBmcmFjdGlvbiwgT2JqZWN0IHZhbHVlLCBDbGFzcyB2YWx1ZVR5cGUpIHsKKyAgICAgICAgbUZyYWN0aW9uID0gZnJhY3Rpb247CisgICAgICAgIG1WYWx1ZSA9IHZhbHVlOworICAgICAgICBtVmFsdWVUeXBlID0gdmFsdWVUeXBlOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBLZXlmcmFtZSBvYmplY3Qgd2l0aCB0aGUgZ2l2ZW4gdGltZSBhbmQgdmFsdWUuIFRoZSB0aW1lIGRlZmluZXMgdGhlCisgICAgICogdGltZSwgYXMgYSBwcm9wb3J0aW9uIG9mIGFuIG92ZXJhbGwgYW5pbWF0aW9uJ3MgZHVyYXRpb24sIGF0IHdoaWNoIHRoZSB2YWx1ZSB3aWxsIGhvbGQgdHJ1ZQorICAgICAqIGZvciB0aGUgYW5pbWF0aW9uLiBUaGUgdmFsdWUgZm9yIHRoZSBhbmltYXRpb24gYmV0d2VlbiBrZXlmcmFtZXMgd2lsbCBiZSBjYWxjdWxhdGVkIGFzCisgICAgICogYW4gaW50ZXJwb2xhdGlvbiBiZXR3ZWVuIHRoZSB2YWx1ZXMgYXQgdGhvc2Uga2V5ZnJhbWVzLgorICAgICAqCisgICAgICogQHBhcmFtIGZyYWN0aW9uIFRoZSB0aW1lLCBleHByZXNzZWQgYXMgYSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDEsIHJlcHJlc2VudGluZyB0aGUgZnJhY3Rpb24KKyAgICAgKiBvZiB0aW1lIGVsYXBzZWQgb2YgdGhlIG92ZXJhbGwgYW5pbWF0aW9uIGR1cmF0aW9uLgorICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdGhhdCB0aGUgb2JqZWN0IHdpbGwgYW5pbWF0ZSB0byBhcyB0aGUgYW5pbWF0aW9uIHRpbWUgYXBwcm9hY2hlcworICAgICAqIHRoZSB0aW1lIGluIHRoaXMga2V5ZnJhbWUsIGFuZCB0aGUgdGhlIHZhbHVlIGFuaW1hdGVkIGZyb20gYXMgdGhlIHRpbWUgcGFzc2VzIHRoZSB0aW1lIGluCisgICAgICogdGhpcyBrZXlmcmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgS2V5ZnJhbWUoZmxvYXQgZnJhY3Rpb24sIE9iamVjdCB2YWx1ZSkgeworICAgICAgICB0aGlzKGZyYWN0aW9uLCB2YWx1ZSwgT2JqZWN0LmNsYXNzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgS2V5ZnJhbWUgb2JqZWN0IHdpdGggdGhlIGdpdmVuIHRpbWUgYW5kIGludGVnZXIgdmFsdWUuIFRoZSB0aW1lIGRlZmluZXMgdGhlCisgICAgICogdGltZSwgYXMgYSBwcm9wb3J0aW9uIG9mIGFuIG92ZXJhbGwgYW5pbWF0aW9uJ3MgZHVyYXRpb24sIGF0IHdoaWNoIHRoZSB2YWx1ZSB3aWxsIGhvbGQgdHJ1ZQorICAgICAqIGZvciB0aGUgYW5pbWF0aW9uLiBUaGUgdmFsdWUgZm9yIHRoZSBhbmltYXRpb24gYmV0d2VlbiBrZXlmcmFtZXMgd2lsbCBiZSBjYWxjdWxhdGVkIGFzCisgICAgICogYW4gaW50ZXJwb2xhdGlvbiBiZXR3ZWVuIHRoZSB2YWx1ZXMgYXQgdGhvc2Uga2V5ZnJhbWVzLgorICAgICAqCisgICAgICogQHBhcmFtIGZyYWN0aW9uIFRoZSB0aW1lLCBleHByZXNzZWQgYXMgYSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDEsIHJlcHJlc2VudGluZyB0aGUgZnJhY3Rpb24KKyAgICAgKiBvZiB0aW1lIGVsYXBzZWQgb2YgdGhlIG92ZXJhbGwgYW5pbWF0aW9uIGR1cmF0aW9uLgorICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdGhhdCB0aGUgb2JqZWN0IHdpbGwgYW5pbWF0ZSB0byBhcyB0aGUgYW5pbWF0aW9uIHRpbWUgYXBwcm9hY2hlcworICAgICAqIHRoZSB0aW1lIGluIHRoaXMga2V5ZnJhbWUsIGFuZCB0aGUgdGhlIHZhbHVlIGFuaW1hdGVkIGZyb20gYXMgdGhlIHRpbWUgcGFzc2VzIHRoZSB0aW1lIGluCisgICAgICogdGhpcyBrZXlmcmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgS2V5ZnJhbWUoZmxvYXQgZnJhY3Rpb24sIGludCB2YWx1ZSkgeworICAgICAgICB0aGlzKGZyYWN0aW9uLCB2YWx1ZSwgaW50LmNsYXNzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgS2V5ZnJhbWUgb2JqZWN0IHdpdGggdGhlIGdpdmVuIHRpbWUgYW5kIGZsb2F0IHZhbHVlLiBUaGUgdGltZSBkZWZpbmVzIHRoZQorICAgICAqIHRpbWUsIGFzIGEgcHJvcG9ydGlvbiBvZiBhbiBvdmVyYWxsIGFuaW1hdGlvbidzIGR1cmF0aW9uLCBhdCB3aGljaCB0aGUgdmFsdWUgd2lsbCBob2xkIHRydWUKKyAgICAgKiBmb3IgdGhlIGFuaW1hdGlvbi4gVGhlIHZhbHVlIGZvciB0aGUgYW5pbWF0aW9uIGJldHdlZW4ga2V5ZnJhbWVzIHdpbGwgYmUgY2FsY3VsYXRlZCBhcworICAgICAqIGFuIGludGVycG9sYXRpb24gYmV0d2VlbiB0aGUgdmFsdWVzIGF0IHRob3NlIGtleWZyYW1lcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmcmFjdGlvbiBUaGUgdGltZSwgZXhwcmVzc2VkIGFzIGEgdmFsdWUgYmV0d2VlbiAwIGFuZCAxLCByZXByZXNlbnRpbmcgdGhlIGZyYWN0aW9uCisgICAgICogb2YgdGltZSBlbGFwc2VkIG9mIHRoZSBvdmVyYWxsIGFuaW1hdGlvbiBkdXJhdGlvbi4KKyAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRoYXQgdGhlIG9iamVjdCB3aWxsIGFuaW1hdGUgdG8gYXMgdGhlIGFuaW1hdGlvbiB0aW1lIGFwcHJvYWNoZXMKKyAgICAgKiB0aGUgdGltZSBpbiB0aGlzIGtleWZyYW1lLCBhbmQgdGhlIHRoZSB2YWx1ZSBhbmltYXRlZCBmcm9tIGFzIHRoZSB0aW1lIHBhc3NlcyB0aGUgdGltZSBpbgorICAgICAqIHRoaXMga2V5ZnJhbWUuCisgICAgICovCisgICAgcHVibGljIEtleWZyYW1lKGZsb2F0IGZyYWN0aW9uLCBmbG9hdCB2YWx1ZSkgeworICAgICAgICB0aGlzKGZyYWN0aW9uLCB2YWx1ZSwgZmxvYXQuY2xhc3MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBLZXlmcmFtZSBvYmplY3Qgd2l0aCB0aGUgZ2l2ZW4gdGltZSBhbmQgZG91YmxlIHZhbHVlLiBUaGUgdGltZSBkZWZpbmVzIHRoZQorICAgICAqIHRpbWUsIGFzIGEgcHJvcG9ydGlvbiBvZiBhbiBvdmVyYWxsIGFuaW1hdGlvbidzIGR1cmF0aW9uLCBhdCB3aGljaCB0aGUgdmFsdWUgd2lsbCBob2xkIHRydWUKKyAgICAgKiBmb3IgdGhlIGFuaW1hdGlvbi4gVGhlIHZhbHVlIGZvciB0aGUgYW5pbWF0aW9uIGJldHdlZW4ga2V5ZnJhbWVzIHdpbGwgYmUgY2FsY3VsYXRlZCBhcworICAgICAqIGFuIGludGVycG9sYXRpb24gYmV0d2VlbiB0aGUgdmFsdWVzIGF0IHRob3NlIGtleWZyYW1lcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmcmFjdGlvbiBUaGUgdGltZSwgZXhwcmVzc2VkIGFzIGEgdmFsdWUgYmV0d2VlbiAwIGFuZCAxLCByZXByZXNlbnRpbmcgdGhlIGZyYWN0aW9uCisgICAgICogb2YgdGltZSBlbGFwc2VkIG9mIHRoZSBvdmVyYWxsIGFuaW1hdGlvbiBkdXJhdGlvbi4KKyAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRoYXQgdGhlIG9iamVjdCB3aWxsIGFuaW1hdGUgdG8gYXMgdGhlIGFuaW1hdGlvbiB0aW1lIGFwcHJvYWNoZXMKKyAgICAgKiB0aGUgdGltZSBpbiB0aGlzIGtleWZyYW1lLCBhbmQgdGhlIHRoZSB2YWx1ZSBhbmltYXRlZCBmcm9tIGFzIHRoZSB0aW1lIHBhc3NlcyB0aGUgdGltZSBpbgorICAgICAqIHRoaXMga2V5ZnJhbWUuCisgICAgICovCisgICAgcHVibGljIEtleWZyYW1lKGZsb2F0IGZyYWN0aW9uLCBkb3VibGUgdmFsdWUpIHsKKyAgICAgICAgdGhpcyhmcmFjdGlvbiwgdmFsdWUsIGRvdWJsZS5jbGFzcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgdmFsdWUgZm9yIHRoaXMgS2V5ZnJhbWUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSB2YWx1ZSBmb3IgdGhpcyBLZXlmcmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGdldFZhbHVlKCkgeworICAgICAgICByZXR1cm4gbVZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHZhbHVlIGZvciB0aGlzIEtleWZyYW1lLgorICAgICAqCisgICAgICogQHBhcmFtIHZhbHVlIHZhbHVlIGZvciB0aGlzIEtleWZyYW1lLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKE9iamVjdCB2YWx1ZSkgeworICAgICAgICBtVmFsdWUgPSB2YWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSB0aW1lIGZvciB0aGlzIGtleWZyYW1lLCBhcyBhIGZyYWN0aW9uIG9mIHRoZSBvdmVyYWxsIGFuaW1hdGlvbiBkdXJhdGlvbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIHRpbWUgYXNzb2NpYXRlZCB3aXRoIHRoaXMga2V5ZnJhbWUsIGFzIGEgZnJhY3Rpb24gb2YgdGhlIG92ZXJhbGwgYW5pbWF0aW9uCisgICAgICogZHVyYXRpb24uIFRoaXMgc2hvdWxkIGJlIGEgdmFsdWUgYmV0d2VlbiAwIGFuZCAxLgorICAgICAqLworICAgIHB1YmxpYyBmbG9hdCBnZXRGcmFjdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIG1GcmFjdGlvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSB0aW1lIGZvciB0aGlzIGtleWZyYW1lLCBhcyBhIGZyYWN0aW9uIG9mIHRoZSBvdmVyYWxsIGFuaW1hdGlvbiBkdXJhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmcmFjdGlvbiB0aW1lIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGtleWZyYW1lLCBhcyBhIGZyYWN0aW9uIG9mIHRoZSBvdmVyYWxsIGFuaW1hdGlvbgorICAgICAqIGR1cmF0aW9uLiBUaGlzIHNob3VsZCBiZSBhIHZhbHVlIGJldHdlZW4gMCBhbmQgMS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRGcmFjdGlvbihmbG9hdCBmcmFjdGlvbikgeworICAgICAgICBtRnJhY3Rpb24gPSBmcmFjdGlvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBvcHRpb25hbCBpbnRlcnBvbGF0b3IgZm9yIHRoaXMgS2V5ZnJhbWUuIEEgdmFsdWUgb2YgPGNvZGU+bnVsbDwvY29kZT4gaW5kaWNhdGVzCisgICAgICogdGhhdCB0aGVyZSBpcyBubyBpbnRlcnBvbGF0aW9uLCB3aGljaCBpcyB0aGUgc2FtZSBhcyBsaW5lYXIgaW50ZXJwb2xhdGlvbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIG9wdGlvbmFsIGludGVycG9sYXRvciBmb3IgdGhpcyBLZXlmcmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgSW50ZXJwb2xhdG9yIGdldEludGVycG9sYXRvcigpIHsKKyAgICAgICAgcmV0dXJuIG1JbnRlcnBvbGF0b3I7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgb3B0aW9uYWwgaW50ZXJwb2xhdG9yIGZvciB0aGlzIEtleWZyYW1lLiBBIHZhbHVlIG9mIDxjb2RlPm51bGw8L2NvZGU+IGluZGljYXRlcworICAgICAqIHRoYXQgdGhlcmUgaXMgbm8gaW50ZXJwb2xhdGlvbiwgd2hpY2ggaXMgdGhlIHNhbWUgYXMgbGluZWFyIGludGVycG9sYXRpb24uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBvcHRpb25hbCBpbnRlcnBvbGF0b3IgZm9yIHRoaXMgS2V5ZnJhbWUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SW50ZXJwb2xhdG9yKEludGVycG9sYXRvciBpbnRlcnBvbGF0b3IpIHsKKyAgICAgICAgbUludGVycG9sYXRvciA9IGludGVycG9sYXRvcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSB0eXBlIG9mIGtleWZyYW1lLiBUaGlzIGluZm9ybWF0aW9uIGlzIHVzZWQgYnkgQW5pbWF0b3IgdG8gZGV0ZXJtaW5lIHRoZSB0eXBlIG9mCisgICAgICoge0BsaW5rIFR5cGVFdmFsdWF0b3J9IHRvIHVzZSB3aGVuIGNhbGN1bGF0aW5nIHZhbHVlcyBiZXR3ZWVuIGtleWZyYW1lcy4gVGhlIHR5cGUgaXMgYmFzZWQKKyAgICAgKiBvbiB0aGUgdHlwZSBvZiBLZXlmcmFtZSBjcmVhdGVkLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgdHlwZSBvZiB0aGUgdmFsdWUgc3RvcmVkIGluIHRoZSBLZXlmcmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xhc3MgZ2V0VHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIG1WYWx1ZVR5cGU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL0tleWZyYW1lU2V0LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hbmltYXRpb24vS2V5ZnJhbWVTZXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTQ0YjljCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL0tleWZyYW1lU2V0LmphdmEKQEAgLTAsMCArMSw5OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5hbmltYXRpb247CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCitpbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5JbnRlcnBvbGF0b3I7CisKKy8qKgorICogVGhpcyBjbGFzcyBob2xkcyBhIGNvbGxlY3Rpb24gb2YgS2V5ZnJhbWUgb2JqZWN0cyBhbmQgaXMgY2FsbGVkIGJ5IEFuaW1hdG9yIHRvIGNhbGN1bGF0ZQorICogdmFsdWVzIGJldHdlZW4gdGhvc2Uga2V5ZnJhbWVzIGZvciBhIGdpdmVuIGFuaW1hdGlvbi4gVGhlIGNsYXNzIGludGVybmFsIHRvIHRoZSBhbmltYXRpb24KKyAqIHBhY2thZ2UgYmVjYXVzZSBpdCBpcyBhbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWwgb2YgaG93IEtleWZyYW1lcyBhcmUgc3RvcmVkIGFuZCB1c2VkLgorICovCitjbGFzcyBLZXlmcmFtZVNldCB7CisKKyAgICBwcml2YXRlIGludCBtTnVtS2V5ZnJhbWVzOworCisgICAgQXJyYXlMaXN0PEtleWZyYW1lPiBtS2V5ZnJhbWVzOworCisgICAgcHVibGljIEtleWZyYW1lU2V0KEtleWZyYW1lLi4uIGtleWZyYW1lcykgeworICAgICAgICBtS2V5ZnJhbWVzID0gbmV3IEFycmF5TGlzdDxLZXlmcmFtZT4oKTsKKyAgICAgICAgZm9yIChLZXlmcmFtZSBrZXlmcmFtZSA6IGtleWZyYW1lcykgeworICAgICAgICAgICAgbUtleWZyYW1lcy5hZGQoa2V5ZnJhbWUpOworICAgICAgICB9CisgICAgICAgIG1OdW1LZXlmcmFtZXMgPSBtS2V5ZnJhbWVzLnNpemUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBhbmltYXRlZCB2YWx1ZSwgZ2l2ZW4gdGhlIGVsYXBzZWQgZnJhY3Rpb24gb2YgdGhlIGFuaW1hdGlvbiAoaW50ZXJwb2xhdGVkIGJ5IHRoZQorICAgICAqIGFuaW1hdGlvbidzIGludGVycG9sYXRvcikgYW5kIHRoZSBldmFsdWF0b3IgdXNlZCB0byBjYWxjdWxhdGUgaW4tYmV0d2VlbiB2YWx1ZXMuIFRoaXMKKyAgICAgKiBmdW5jdGlvbiBtYXBzIHRoZSBpbnB1dCBmcmFjdGlvbiB0byB0aGUgYXBwcm9wcmlhdGUga2V5ZnJhbWUgaW50ZXJ2YWwgYW5kIGEgZnJhY3Rpb24KKyAgICAgKiBiZXR3ZWVuIHRoZW0gYW5kIHJldHVybnMgdGhlIGludGVycG9sYXRlZCB2YWx1ZS4gTm90ZSB0aGF0IHRoZSBpbnB1dCBmcmFjdGlvbiBtYXkgZmFsbAorICAgICAqIG91dHNpZGUgdGhlIFswLTFdIGJvdW5kcywgaWYgdGhlIGFuaW1hdGlvbidzIGludGVycG9sYXRvciBtYWRlIHRoYXQgaGFwcGVuIChlLmcuLCBhCisgICAgICogc3ByaW5nIGludGVycG9sYXRpb24gdGhhdCBtaWdodCBzZW5kIHRoZSBmcmFjdGlvbiBwYXN0IDEuMCkuIFdlIGhhbmRsZSB0aGlzIHNpdHVhdGlvbiBieQorICAgICAqIGp1c3QgdXNpbmcgdGhlIHR3byBrZXlmcmFtZXMgYXQgdGhlIGFwcHJvcHJpYXRlIGVuZCB3aGVuIHRoZSB2YWx1ZSBpcyBvdXRzaWRlIHRob3NlIGJvdW5kcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmcmFjdGlvbiBUaGUgZWxhcHNlZCBmcmFjdGlvbiBvZiB0aGUgYW5pbWF0aW9uCisgICAgICogQHBhcmFtIGV2YWx1YXRvciBUaGUgdHlwZSBldmFsdWF0b3IgdG8gdXNlIHdoZW4gY2FsY3VsYXRpbmcgdGhlIGludGVycG9sYXRlZCB2YWx1ZXMuCisgICAgICogQHJldHVybiBUaGUgYW5pbWF0ZWQgdmFsdWUuCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBnZXRWYWx1ZShmbG9hdCBmcmFjdGlvbiwgVHlwZUV2YWx1YXRvciBldmFsdWF0b3IpIHsKKyAgICAgICAgLy8gVE9ETzogc3BlY2lhbC1jYXNlIDIta2V5ZnJhbWUgY29tbW9uIGNhc2UKKworICAgICAgICBpZiAoZnJhY3Rpb24gPD0gMGYpIHsKKyAgICAgICAgICAgIGZpbmFsIEtleWZyYW1lIHByZXZLZXlmcmFtZSA9IG1LZXlmcmFtZXMuZ2V0KDApOworICAgICAgICAgICAgZmluYWwgS2V5ZnJhbWUgbmV4dEtleWZyYW1lID0gbUtleWZyYW1lcy5nZXQoMSk7CisgICAgICAgICAgICBmaW5hbCBJbnRlcnBvbGF0b3IgaW50ZXJwb2xhdG9yID0gbmV4dEtleWZyYW1lLmdldEludGVycG9sYXRvcigpOworICAgICAgICAgICAgaWYgKGludGVycG9sYXRvciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZnJhY3Rpb24gPSBpbnRlcnBvbGF0b3IuZ2V0SW50ZXJwb2xhdGlvbihmcmFjdGlvbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmbG9hdCBpbnRlcnZhbEZyYWN0aW9uID0gKGZyYWN0aW9uIC0gcHJldktleWZyYW1lLmdldEZyYWN0aW9uKCkpIC8KKyAgICAgICAgICAgICAgICAobmV4dEtleWZyYW1lLmdldEZyYWN0aW9uKCkgLSBwcmV2S2V5ZnJhbWUuZ2V0RnJhY3Rpb24oKSk7CisgICAgICAgICAgICByZXR1cm4gZXZhbHVhdG9yLmV2YWx1YXRlKGludGVydmFsRnJhY3Rpb24sIHByZXZLZXlmcmFtZS5nZXRWYWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICBuZXh0S2V5ZnJhbWUuZ2V0VmFsdWUoKSk7CisgICAgICAgIH0gZWxzZSBpZiAoZnJhY3Rpb24gPj0gMWYpIHsKKyAgICAgICAgICAgIGZpbmFsIEtleWZyYW1lIHByZXZLZXlmcmFtZSA9IG1LZXlmcmFtZXMuZ2V0KG1OdW1LZXlmcmFtZXMgLSAyKTsKKyAgICAgICAgICAgIGZpbmFsIEtleWZyYW1lIG5leHRLZXlmcmFtZSA9IG1LZXlmcmFtZXMuZ2V0KG1OdW1LZXlmcmFtZXMgLSAxKTsKKyAgICAgICAgICAgIGZpbmFsIEludGVycG9sYXRvciBpbnRlcnBvbGF0b3IgPSBuZXh0S2V5ZnJhbWUuZ2V0SW50ZXJwb2xhdG9yKCk7CisgICAgICAgICAgICBpZiAoaW50ZXJwb2xhdG9yICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmcmFjdGlvbiA9IGludGVycG9sYXRvci5nZXRJbnRlcnBvbGF0aW9uKGZyYWN0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZsb2F0IGludGVydmFsRnJhY3Rpb24gPSAoZnJhY3Rpb24gLSBwcmV2S2V5ZnJhbWUuZ2V0RnJhY3Rpb24oKSkgLworICAgICAgICAgICAgICAgIChuZXh0S2V5ZnJhbWUuZ2V0RnJhY3Rpb24oKSAtIHByZXZLZXlmcmFtZS5nZXRGcmFjdGlvbigpKTsKKyAgICAgICAgICAgIHJldHVybiBldmFsdWF0b3IuZXZhbHVhdGUoaW50ZXJ2YWxGcmFjdGlvbiwgcHJldktleWZyYW1lLmdldFZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgIG5leHRLZXlmcmFtZS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgfQorICAgICAgICBLZXlmcmFtZSBwcmV2S2V5ZnJhbWUgPSBtS2V5ZnJhbWVzLmdldCgwKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBtTnVtS2V5ZnJhbWVzOyArK2kpIHsKKyAgICAgICAgICAgIEtleWZyYW1lIG5leHRLZXlmcmFtZSA9IG1LZXlmcmFtZXMuZ2V0KGkpOworICAgICAgICAgICAgaWYgKGZyYWN0aW9uIDwgbmV4dEtleWZyYW1lLmdldEZyYWN0aW9uKCkpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBJbnRlcnBvbGF0b3IgaW50ZXJwb2xhdG9yID0gbmV4dEtleWZyYW1lLmdldEludGVycG9sYXRvcigpOworICAgICAgICAgICAgICAgIGlmIChpbnRlcnBvbGF0b3IgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBmcmFjdGlvbiA9IGludGVycG9sYXRvci5nZXRJbnRlcnBvbGF0aW9uKGZyYWN0aW9uKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZmxvYXQgaW50ZXJ2YWxGcmFjdGlvbiA9IChmcmFjdGlvbiAtIHByZXZLZXlmcmFtZS5nZXRGcmFjdGlvbigpKSAvCisgICAgICAgICAgICAgICAgICAgIChuZXh0S2V5ZnJhbWUuZ2V0RnJhY3Rpb24oKSAtIHByZXZLZXlmcmFtZS5nZXRGcmFjdGlvbigpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXZhbHVhdG9yLmV2YWx1YXRlKGludGVydmFsRnJhY3Rpb24sIHByZXZLZXlmcmFtZS5nZXRWYWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV4dEtleWZyYW1lLmdldFZhbHVlKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHJldktleWZyYW1lID0gbmV4dEtleWZyYW1lOworICAgICAgICB9CisgICAgICAgIC8vIHNob3VsZG4ndCBnZXQgaGVyZQorICAgICAgICByZXR1cm4gbUtleWZyYW1lcy5nZXQobU51bUtleWZyYW1lcyAtIDEpLmdldFZhbHVlKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL1Byb3BlcnR5QW5pbWF0b3IuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9Qcm9wZXJ0eUFuaW1hdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGE2ZWRjYwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9Qcm9wZXJ0eUFuaW1hdG9yLmphdmEKQEAgLTAsMCArMSwyMjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYW5pbWF0aW9uOworCitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKKworLyoqCisgKiBUaGlzIHN1YmNsYXNzIG9mIHtAbGluayBBbmltYXRvcn0gcHJvdmlkZXMgc3VwcG9ydCBmb3IgYW5pbWF0aW5nIHByb3BlcnRpZXMgb24gdGFyZ2V0IG9iamVjdHMuCisgKiBUaGUgY29uc3RydWN0b3JzIG9mIHRoaXMgY2xhc3MgdGFrZSBwYXJhbWV0ZXJzIHRvIGRlZmluZSB0aGUgdGFyZ2V0IG9iamVjdCB0aGF0IHdpbGwgYmUgYW5pbWF0ZWQKKyAqIGFzIHdlbGwgYXMgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRoYXQgd2lsbCBiZSBhbmltYXRlZC4gQXBwcm9wcmlhdGUgc2V0L2dldCBmdW5jdGlvbnMKKyAqIGFyZSB0aGVuIGRldGVybWluZWQgaW50ZXJuYWxseSBhbmQgdGhlIGFuaW1hdGlvbiB3aWxsIGNhbGwgdGhlc2UgZnVuY3Rpb25zIGFzIG5lY2Vzc2FyeSB0bworICogYW5pbWF0ZSB0aGUgcHJvcGVydHkuCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBQcm9wZXJ0eUFuaW1hdG9yPFQ+IGV4dGVuZHMgQW5pbWF0b3I8VD4geworCisgICAgLy8gVGhlIHRhcmdldCBvYmplY3Qgb24gd2hpY2ggdGhlIHByb3BlcnR5IGV4aXN0cywgc2V0IGluIHRoZSBjb25zdHJ1Y3RvcgorICAgIHByaXZhdGUgT2JqZWN0IG1UYXJnZXQ7CisKKyAgICBwcml2YXRlIFN0cmluZyBtUHJvcGVydHlOYW1lOworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdGhhdCB3aWxsIGJlIGFuaW1hdGVkLiBUaGlzIG5hbWUgaXMgdXNlZCB0byBkZXJpdmUKKyAgICAgKiBhIHNldHRlciBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkIHRvIHNldCBhbmltYXRlZCB2YWx1ZXMuCisgICAgICogRm9yIGV4YW1wbGUsIGEgcHJvcGVydHkgbmFtZSBvZiA8Y29kZT5mb288L2NvZGU+IHdpbGwgcmVzdWx0CisgICAgICogaW4gYSBjYWxsIHRvIHRoZSBmdW5jdGlvbiA8Y29kZT5zZXRGb28oKTwvY29kZT4gb24gdGhlIHRhcmdldCBvYmplY3QuIElmIGVpdGhlcgorICAgICAqIDxjb2RlPnZhbHVlRnJvbTwvY29kZT4gb3IgPGNvZGU+dmFsdWVUbzwvY29kZT4gaXMgbnVsbCwgdGhlbiBhIGdldHRlciBmdW5jdGlvbiB3aWxsCisgICAgICogYWxzbyBiZSBkZXJpdmVkIGFuZCBjYWxsZWQuCisgICAgICoKKyAgICAgKiA8cD5Ob3RlIHRoYXQgdGhlIHNldHRlciBmdW5jdGlvbiBkZXJpdmVkIGZyb20gdGhpcyBwcm9wZXJ0eSBuYW1lCisgICAgICogbXVzdCB0YWtlIHRoZSBzYW1lIHBhcmFtZXRlciB0eXBlIGFzIHRoZQorICAgICAqIDxjb2RlPnZhbHVlRnJvbTwvY29kZT4gYW5kIDxjb2RlPnZhbHVlVG88L2NvZGU+IHByb3BlcnRpZXMsIG90aGVyd2lzZSB0aGUgY2FsbCB0bworICAgICAqIHRoZSBzZXR0ZXIgZnVuY3Rpb24gd2lsbCBmYWlsLjwvcD4KKyAgICAgKgorICAgICAqIDxwPklmIHRoaXMgUHJvcGVydHlBbmltYXRvciBoYXMgYmVlbiBzZXQgdXAgdG8gYW5pbWF0ZSBzZXZlcmFsIHByb3BlcnRpZXMgdG9nZXRoZXIsCisgICAgICogdXNpbmcgbW9yZSB0aGFuIG9uZSBQcm9wZXJ0eVZhbHVlc0hvbGRlciBvYmplY3RzLCB0aGVuIHNldHRpbmcgdGhlIHByb3BlcnR5TmFtZSBzaW1wbHkKKyAgICAgKiBzZXRzIHRoZSBwcm9wZXJ0eU5hbWUgaW4gdGhlIGZpcnN0IG9mIHRob3NlIFByb3BlcnR5VmFsdWVzSG9sZGVyIG9iamVjdHMuPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIHByb3BlcnR5TmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgYmVpbmcgYW5pbWF0ZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHlOYW1lKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKKyAgICAgICAgaWYgKG1WYWx1ZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gbVZhbHVlcyBzaG91bGQgYWx3YXlzIGJlIG5vbi1udWxsCisgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlc0hvbGRlciB2YWx1ZXNIb2xkZXIgPSBtVmFsdWVzWzBdOworICAgICAgICAgICAgU3RyaW5nIG9sZE5hbWUgPSB2YWx1ZXNIb2xkZXIuZ2V0UHJvcGVydHlOYW1lKCk7CisgICAgICAgICAgICB2YWx1ZXNIb2xkZXIuc2V0UHJvcGVydHlOYW1lKHByb3BlcnR5TmFtZSk7CisgICAgICAgICAgICBtVmFsdWVzTWFwLnJlbW92ZShvbGROYW1lKTsKKyAgICAgICAgICAgIG1WYWx1ZXNNYXAucHV0KHByb3BlcnR5TmFtZSwgdmFsdWVzSG9sZGVyKTsKKyAgICAgICAgfQorICAgICAgICBtUHJvcGVydHlOYW1lID0gcHJvcGVydHlOYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRoYXQgd2lsbCBiZSBhbmltYXRlZC4gVGhpcyBuYW1lIHdpbGwgYmUgdXNlZCB0byBkZXJpdmUKKyAgICAgKiBhIHNldHRlciBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkIHRvIHNldCBhbmltYXRlZCB2YWx1ZXMuCisgICAgICogRm9yIGV4YW1wbGUsIGEgcHJvcGVydHkgbmFtZSBvZiA8Y29kZT5mb288L2NvZGU+IHdpbGwgcmVzdWx0CisgICAgICogaW4gYSBjYWxsIHRvIHRoZSBmdW5jdGlvbiA8Y29kZT5zZXRGb28oKTwvY29kZT4gb24gdGhlIHRhcmdldCBvYmplY3QuIElmIGVpdGhlcgorICAgICAqIDxjb2RlPnZhbHVlRnJvbTwvY29kZT4gb3IgPGNvZGU+dmFsdWVUbzwvY29kZT4gaXMgbnVsbCwgdGhlbiBhIGdldHRlciBmdW5jdGlvbiB3aWxsCisgICAgICogYWxzbyBiZSBkZXJpdmVkIGFuZCBjYWxsZWQuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eU5hbWUoKSB7CisgICAgICAgIHJldHVybiBtUHJvcGVydHlOYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIERldGVybWluZSB0aGUgc2V0dGVyIG9yIGdldHRlciBmdW5jdGlvbiB1c2luZyB0aGUgSmF2YUJlYW5zIGNvbnZlbnRpb24gb2Ygc2V0Rm9vIG9yCisgICAgICogZ2V0Rm9vIGZvciBhIHByb3BlcnR5IG5hbWVkICdmb28nLiBUaGlzIGZ1bmN0aW9uIGZpZ3VyZXMgb3V0IHdoYXQgdGhlIG5hbWUgb2YgdGhlCisgICAgICogZnVuY3Rpb24gc2hvdWxkIGJlIGFuZCB1c2VzIHJlZmxlY3Rpb24gdG8gZmluZCB0aGUgTWV0aG9kIHdpdGggdGhhdCBuYW1lIG9uIHRoZQorICAgICAqIHRhcmdldCBvYmplY3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJlZml4ICJzZXQiIG9yICJnZXQiLCBkZXBlbmRpbmcgb24gd2hldGhlciB3ZSBuZWVkIGEgc2V0dGVyIG9yIGdldHRlci4KKyAgICAgKiBAcmV0dXJuIE1ldGhvZCB0aGUgbWV0aG9kIGFzc29jaWF0ZWQgd2l0aCBtUHJvcGVydHlOYW1lLgorICAgICAqLworICAgIHByaXZhdGUgTWV0aG9kIGdldFByb3BlcnR5RnVuY3Rpb24oU3RyaW5nIHByZWZpeCwgQ2xhc3MgdmFsdWVUeXBlKSB7CisgICAgICAgIC8vIFRPRE86IGZhc3RlciBpbXBsZW1lbnRhdGlvbi4uLgorICAgICAgICBNZXRob2QgcmV0dXJuVmFsID0gbnVsbDsKKyAgICAgICAgU3RyaW5nIGZpcnN0TGV0dGVyID0gbVByb3BlcnR5TmFtZS5zdWJzdHJpbmcoMCwgMSk7CisgICAgICAgIFN0cmluZyB0aGVSZXN0ID0gbVByb3BlcnR5TmFtZS5zdWJzdHJpbmcoMSk7CisgICAgICAgIGZpcnN0TGV0dGVyID0gZmlyc3RMZXR0ZXIudG9VcHBlckNhc2UoKTsKKyAgICAgICAgU3RyaW5nIHNldHRlck5hbWUgPSBwcmVmaXggKyBmaXJzdExldHRlciArIHRoZVJlc3Q7CisgICAgICAgIENsYXNzIGFyZ3NbXSA9IG51bGw7CisgICAgICAgIGlmICh2YWx1ZVR5cGUgIT0gbnVsbCkgeworICAgICAgICAgICAgYXJncyA9IG5ldyBDbGFzc1sxXTsKKyAgICAgICAgICAgIGFyZ3NbMF0gPSB2YWx1ZVR5cGU7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVyblZhbCA9IG1UYXJnZXQuZ2V0Q2xhc3MoKS5nZXRNZXRob2Qoc2V0dGVyTmFtZSwgYXJncyk7CisgICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZSgiUHJvcGVydHlBbmltYXRvciIsCisgICAgICAgICAgICAgICAgICAgICJDb3VsZG4ndCBmaW5kIHNldHRlci9nZXR0ZXIgZm9yIHByb3BlcnR5ICIgKyBtUHJvcGVydHlOYW1lICsgIjogIiArIGUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXR1cm5WYWw7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBQcm9wZXJ0eUFuaW1hdG9yIG9iamVjdC4gVGhpcyBkZWZhdWx0IGNvbnN0cnVjdG9yIGlzIHByaW1hcmlseSBmb3IKKyAgICAgKiB1c2UgaW50ZXJuYWxseTsgdGhlIG90aGVyIGNvbnN0cnVjdG9ycyB3aGljaCB0YWtlIHBhcmFtZXRlcnMgYXJlIG1vcmUgZ2VuZXJhbGx5CisgICAgICogdXNlZnVsLgorICAgICAqLworICAgIHB1YmxpYyBQcm9wZXJ0eUFuaW1hdG9yKCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIEEgY29uc3RydWN0b3IgdGhhdCB0YWtlcyBhIHNpbmdsZSBwcm9wZXJ0eSBuYW1lIGFuZCBzZXQgb2YgdmFsdWVzLiBUaGlzIGNvbnN0cnVjdG9yIGlzCisgICAgICogdXNlZCBpbiB0aGUgc2ltcGxlIGNhc2Ugb2YgYW5pbWF0aW5nIGEgc2luZ2xlIHByb3BlcnR5LgorICAgICAqCisgICAgICogQHBhcmFtIGR1cmF0aW9uIFRoZSBsZW5ndGggb2YgdGhlIGFuaW1hdGlvbiwgaW4gbWlsbGlzZWNvbmRzLgorICAgICAqIEBwYXJhbSB0YXJnZXQgVGhlIG9iamVjdCB3aG9zZSBwcm9wZXJ0eSBpcyB0byBiZSBhbmltYXRlZC4gVGhpcyBvYmplY3Qgc2hvdWxkCisgICAgICogaGF2ZSBhIHB1YmxpYyBtZXRob2Qgb24gaXQgY2FsbGVkIDxjb2RlPnNldE5hbWUoKTwvY29kZT4sIHdoZXJlIDxjb2RlPm5hbWU8L2NvZGU+IGlzCisgICAgICogdGhlIHZhbHVlIG9mIHRoZSA8Y29kZT5wcm9wZXJ0eU5hbWU8L2NvZGU+IHBhcmFtZXRlci4KKyAgICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSBiZWluZyBhbmltYXRlZC4KKyAgICAgKiBAcGFyYW0gdmFsdWVzIFRoZSBzZXQgb2YgdmFsdWVzIHRvIGFuaW1hdGUgYmV0d2Vlbi4gSWYgdGhlcmUgaXMgb25seSBvbmUgdmFsdWUsIGl0CisgICAgICogaXMgYXNzdW1lZCB0byBiZSB0aGUgZmluYWwgdmFsdWUgYmVpbmcgYW5pbWF0ZWQgdG8sIGFuZCB0aGUgaW5pdGlhbCB2YWx1ZSB3aWxsIGJlCisgICAgICogZGVyaXZlZCBvbiB0aGUgZmx5LgorICAgICAqLworICAgIHB1YmxpYyBQcm9wZXJ0eUFuaW1hdG9yKGxvbmcgZHVyYXRpb24sIE9iamVjdCB0YXJnZXQsIFN0cmluZyBwcm9wZXJ0eU5hbWUsIFQuLi52YWx1ZXMpIHsKKyAgICAgICAgc3VwZXIoZHVyYXRpb24sIChUW10pIHZhbHVlcyk7CisgICAgICAgIG1UYXJnZXQgPSB0YXJnZXQ7CisgICAgICAgIHNldFByb3BlcnR5TmFtZShwcm9wZXJ0eU5hbWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEEgY29uc3RydWN0b3IgdGhhdCB0YWtlcyA8Y29kZT5Qcm9wZXJ0eVZhbHVlSG9sZGVyPC9jb2RlPiB2YWx1ZXMuIFRoaXMgY29uc3RydWN0b3Igc2hvdWxkCisgICAgICogYmUgdXNlZCB3aGVuIGFuaW1hdGluZyBzZXZlcmFsIHByb3BlcnRpZXMgYXQgb25jZSB3aXRoIHRoZSBzYW1lIFByb3BlcnR5QW5pbWF0b3IsIHNpbmNlCisgICAgICogUHJvcGVydHlWYWx1ZXNIb2xkZXIgYWxsb3dzIHlvdSB0byBhc3NvY2lhdGUgYSBzZXQgb2YgYW5pbWF0aW9uIHZhbHVlcyB3aXRoIGEgcHJvcGVydHkKKyAgICAgKiBuYW1lLgorICAgICAqCisgICAgICogQHBhcmFtIGR1cmF0aW9uIFRoZSBsZW5ndGggb2YgdGhlIGFuaW1hdGlvbiwgaW4gbWlsbGlzZWNvbmRzLgorICAgICAqIEBwYXJhbSB0YXJnZXQgVGhlIG9iamVjdCB3aG9zZSBwcm9wZXJ0eSBpcyB0byBiZSBhbmltYXRlZC4gVGhpcyBvYmplY3Qgc2hvdWxkCisgICAgICogaGF2ZSBwdWJsaWMgbWV0aG9kcyBvbiBpdCBjYWxsZWQgPGNvZGU+c2V0TmFtZSgpPC9jb2RlPiwgd2hlcmUgPGNvZGU+bmFtZTwvY29kZT4gaXMKKyAgICAgKiB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgcGFzc2VkIGluIGFzIHRoZSA8Y29kZT5wcm9wZXJ0eU5hbWU8L2NvZGU+IHBhcmFtZXRlciBmb3IKKyAgICAgKiBlYWNoIG9mIHRoZSBQcm9wZXJ0eVZhbHVlc0hvbGRlciBvYmplY3RzLgorICAgICAqIEBwYXJhbSB2YWx1ZXMgVGhlIFByb3BlcnR5VmFsdWVzSG9sZGVyIG9iamVjdHMgd2hpY2ggaG9sZCBlYWNoIHRoZSBwcm9wZXJ0eSBuYW1lIGFuZCB2YWx1ZXMKKyAgICAgKiB0byBhbmltYXRlIHRoYXQgcHJvcGVydHkgYmV0d2Vlbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgUHJvcGVydHlBbmltYXRvcihsb25nIGR1cmF0aW9uLCBPYmplY3QgdGFyZ2V0LCBQcm9wZXJ0eVZhbHVlc0hvbGRlci4uLnZhbHVlcykgeworICAgICAgICBzdXBlcihkdXJhdGlvbik7CisgICAgICAgIHNldFZhbHVlcyh2YWx1ZXMpOworICAgICAgICBtVGFyZ2V0ID0gdGFyZ2V0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGltbWVkaWF0ZWx5IGJlZm9yZSBwcm9jZXNzaW5nIHRoZSBmaXJzdCBhbmltYXRpb24KKyAgICAgKiBmcmFtZSBvZiBhbiBhbmltYXRpb24uIElmIHRoZXJlIGlzIGEgbm9uemVybyA8Y29kZT5zdGFydERlbGF5PC9jb2RlPiwgdGhlCisgICAgICogZnVuY3Rpb24gaXMgY2FsbGVkIGFmdGVyIHRoYXQgZGVsYXkgZW5kcy4KKyAgICAgKiBJdCB0YWtlcyBjYXJlIG9mIHRoZSBmaW5hbCBpbml0aWFsaXphdGlvbiBzdGVwcyBmb3IgdGhlCisgICAgICogYW5pbWF0aW9uLiBUaGlzIGluY2x1ZGVzIHNldHRpbmcgbUV2YWx1YXRvciwgaWYgdGhlIHVzZXIgaGFzIG5vdCB5ZXQKKyAgICAgKiBzZXQgaXQgdXAsIGFuZCB0aGUgc2V0dGVyL2dldHRlciBtZXRob2RzLCBpZiB0aGUgdXNlciBkaWQgbm90IHN1cHBseQorICAgICAqIHRoZW0uCisgICAgICoKKyAgICAgKiAgPHA+T3ZlcnJpZGVycyBvZiB0aGlzIG1ldGhvZCBzaG91bGQgY2FsbCB0aGUgc3VwZXJjbGFzcyBtZXRob2QgdG8gY2F1c2UKKyAgICAgKiAgaW50ZXJuYWwgbWVjaGFuaXNtcyB0byBiZSBzZXQgdXAgY29ycmVjdGx5LjwvcD4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICB2b2lkIGluaXRBbmltYXRpb24oKSB7CisgICAgICAgIHN1cGVyLmluaXRBbmltYXRpb24oKTsKKyAgICAgICAgaW50IG51bVZhbHVlcyA9IG1WYWx1ZXMubGVuZ3RoOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVZhbHVlczsgKytpKSB7CisgICAgICAgICAgICBtVmFsdWVzW2ldLnNldHVwU2V0dGVyQW5kR2V0dGVyKG1UYXJnZXQpOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUaGUgdGFyZ2V0IG9iamVjdCB3aG9zZSBwcm9wZXJ0eSB3aWxsIGJlIGFuaW1hdGVkIGJ5IHRoaXMgYW5pbWF0aW9uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBvYmplY3QgYmVpbmcgYW5pbWF0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGdldFRhcmdldCgpIHsKKyAgICAgICAgcmV0dXJuIG1UYXJnZXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgdGFyZ2V0IG9iamVjdCB3aG9zZSBwcm9wZXJ0eSB3aWxsIGJlIGFuaW1hdGVkIGJ5IHRoaXMgYW5pbWF0aW9uCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSBvYmplY3QgYmVpbmcgYW5pbWF0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUYXJnZXQoT2JqZWN0IHRhcmdldCkgeworICAgICAgICBtVGFyZ2V0ID0gdGFyZ2V0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aXRoIHRoZSBlbGFwc2VkIGZyYWN0aW9uIG9mIHRoZSBhbmltYXRpb24gZHVyaW5nIGV2ZXJ5CisgICAgICogYW5pbWF0aW9uIGZyYW1lLiBUaGlzIGZ1bmN0aW9uIHR1cm5zIHRoZSBlbGFwc2VkIGZyYWN0aW9uIGludG8gYW4gaW50ZXJwb2xhdGVkIGZyYWN0aW9uCisgICAgICogYW5kIHRoZW4gaW50byBhbiBhbmltYXRlZCB2YWx1ZSAoZnJvbSB0aGUgZXZhbHVhdG9yLiBUaGUgZnVuY3Rpb24gaXMgY2FsbGVkIG1vc3RseSBkdXJpbmcKKyAgICAgKiBhbmltYXRpb24gdXBkYXRlcywgYnV0IGl0IGlzIGFsc28gY2FsbGVkIHdoZW4gdGhlIDxjb2RlPmVuZCgpPC9jb2RlPgorICAgICAqIGZ1bmN0aW9uIGlzIGNhbGxlZCwgdG8gc2V0IHRoZSBmaW5hbCB2YWx1ZSBvbiB0aGUgcHJvcGVydHkuCisgICAgICoKKyAgICAgKiA8cD5PdmVycmlkZXMgb2YgdGhpcyBtZXRob2QgbXVzdCBjYWxsIHRoZSBzdXBlcmNsYXNzIHRvIHBlcmZvcm0gdGhlIGNhbGN1bGF0aW9uCisgICAgICogb2YgdGhlIGFuaW1hdGVkIHZhbHVlLjwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmcmFjdGlvbiBUaGUgZWxhcHNlZCBmcmFjdGlvbiBvZiB0aGUgYW5pbWF0aW9uLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHZvaWQgYW5pbWF0ZVZhbHVlKGZsb2F0IGZyYWN0aW9uKSB7CisgICAgICAgIHN1cGVyLmFuaW1hdGVWYWx1ZShmcmFjdGlvbik7CisgICAgICAgIGludCBudW1WYWx1ZXMgPSBtVmFsdWVzLmxlbmd0aDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1WYWx1ZXM7ICsraSkgeworICAgICAgICAgICAgbVZhbHVlc1tpXS5zZXRBbmltYXRlZFZhbHVlKG1UYXJnZXQpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFByb3BlcnR5QW5pbWF0b3IgY2xvbmUoKSB0aHJvd3MgQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24geworICAgICAgICBmaW5hbCBQcm9wZXJ0eUFuaW1hdG9yIGFuaW0gPSAoUHJvcGVydHlBbmltYXRvcikgc3VwZXIuY2xvbmUoKTsKKyAgICAgICAgcmV0dXJuIGFuaW07CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL1Byb3BlcnR5VmFsdWVzSG9sZGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hbmltYXRpb24vUHJvcGVydHlWYWx1ZXNIb2xkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzgyOWI4Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL1Byb3BlcnR5VmFsdWVzSG9sZGVyLmphdmEKQEAgLTAsMCArMSw1MTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYW5pbWF0aW9uOworCitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuUmVlbnRyYW50UmVhZFdyaXRlTG9jazsKKworLyoqCisgKi8KK3B1YmxpYyBjbGFzcyBQcm9wZXJ0eVZhbHVlc0hvbGRlcjxUPiB7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgYXNzb2NpYXRlZCB3aXRoIHRoZSB2YWx1ZXMuIFRoaXMgbmVlZCBub3QgYmUgYSByZWFsIHByb3BlcnR5LAorICAgICAqIHVubGVzcyB0aGlzIG9iamVjdCBpcyBiZWluZyB1c2VkIHdpdGggUHJvcGVydHlBbmltYXRvci4gQnV0IHRoaXMgaXMgdGhlIG5hbWUgYnkgd2hpY2gKKyAgICAgKiBhbmlhbXRlZCB2YWx1ZXMgYXJlIGxvb2tlZCB1cCB3aXRoIGdldEFuaW1hdGVkVmFsdWUoU3RyaW5nKSBpbiBBbmltYXRvci4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBtUHJvcGVydHlOYW1lOworCisgICAgLyoqCisgICAgICogVGhlIHNldHRlciBmdW5jdGlvbiwgaWYgbmVlZGVkLiBQcm9wZXJ0eUFuaW1hdG9yIGhhbmRzIG9mZiB0aGlzIGZ1bmN0aW9uYWxpdHkgdG8KKyAgICAgKiBQcm9wZXJ0eVZhbHVlc0hvbGRlciwgc2luY2UgaXQgaG9sZHMgYWxsIG9mIHRoZSBwZXItcHJvcGVydHkgaW5mb3JtYXRpb24uIFRoaXMKKyAgICAgKiBwcm9wZXJ0eSBjYW4gYmUgbWFudWFsbHkgc2V0IHZpYSBzZXRTZXR0ZXIoKS4gT3RoZXJ3aXNlLCBpdCBpcyBhdXRvbWF0aWNhbGx5CisgICAgICogZGVyaXZlZCB3aGVuIHRoZSBhbmltYXRpb24gc3RhcnRzIGluIHNldHVwU2V0dGVyQW5kR2V0dGVyKCkgaWYgdXNpbmcgUHJvcGVydHlBbmltYXRvci4KKyAgICAgKi8KKyAgICBwcml2YXRlIE1ldGhvZCBtU2V0dGVyID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFRoZSBnZXR0ZXIgZnVuY3Rpb24sIGlmIG5lZWRlZC4gUHJvcGVydHlBbmltYXRvciBoYW5kcyBvZmYgdGhpcyBmdW5jdGlvbmFsaXR5IHRvCisgICAgICogUHJvcGVydHlWYWx1ZXNIb2xkZXIsIHNpbmNlIGl0IGhvbGRzIGFsbCBvZiB0aGUgcGVyLXByb3BlcnR5IGluZm9ybWF0aW9uLiBUaGlzCisgICAgICogcHJvcGVydHkgY2FuIGJlIG1hbnVhbGx5IHNldCB2aWEgc2V0U2V0dGVyKCkuIE90aGVyd2lzZSwgaXQgaXMgYXV0b21hdGljYWxseQorICAgICAqIGRlcml2ZWQgd2hlbiB0aGUgYW5pbWF0aW9uIHN0YXJ0cyBpbiBzZXR1cFNldHRlckFuZEdldHRlcigpIGlmIHVzaW5nIFByb3BlcnR5QW5pbWF0b3IuCisgICAgICogVGhlIGdldHRlciBpcyBvbmx5IGRlcml2ZWQgYW5kIHVzZWQgaWYgb25lIG9mIHRoZSB2YWx1ZXMgaXMgbnVsbC4KKyAgICAgKi8KKyAgICBwcml2YXRlIE1ldGhvZCBtR2V0dGVyID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFRoZSB0eXBlIG9mIHZhbHVlcyBzdXBwbGllZC4gVGhpcyBpbmZvcm1hdGlvbiBpcyB1c2VkIGJvdGggaW4gZGVyaXZpbmcgdGhlIHNldHRlci9nZXR0ZXIKKyAgICAgKiBmdW5jdGlvbnMgYW5kIGluIGRlcml2aW5nIHRoZSB0eXBlIG9mIFR5cGVFdmFsdWF0b3IuCisgICAgICovCisgICAgcHJpdmF0ZSBDbGFzcyBtVmFsdWVUeXBlOworCisgICAgLyoqCisgICAgICogVGhlIHNldCBvZiBrZXlmcmFtZXMgKHRpbWUvdmFsdWUgcGFpcnMpIHRoYXQgZGVmaW5lIHRoaXMgYW5pbWF0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgS2V5ZnJhbWVTZXQgbUtleWZyYW1lU2V0ID0gbnVsbDsKKworCisgICAgLy8gdHlwZSBldmFsdWF0b3JzIGZvciB0aGUgdGhyZWUgcHJpbWl0aXZlIHR5cGVzIGhhbmRsZWQgYnkgdGhpcyBpbXBsZW1lbnRhdGlvbgorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFR5cGVFdmFsdWF0b3Igc0ludEV2YWx1YXRvciA9IG5ldyBJbnRFdmFsdWF0b3IoKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBUeXBlRXZhbHVhdG9yIHNGbG9hdEV2YWx1YXRvciA9IG5ldyBGbG9hdEV2YWx1YXRvcigpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFR5cGVFdmFsdWF0b3Igc0RvdWJsZUV2YWx1YXRvciA9IG5ldyBEb3VibGVFdmFsdWF0b3IoKTsKKworICAgIC8vIFdlIHRyeSBzZXZlcmFsIGRpZmZlcmVudCB0eXBlcyB3aGVuIHNlYXJjaGluZyBmb3IgYXBwcm9wcmlhdGUgc2V0dGVyL2dldHRlciBmdW5jdGlvbnMuCisgICAgLy8gVGhlIGNhbGxlciBtYXkgaGF2ZSBzdXBwbGllZCB2YWx1ZXMgaW4gYSB0eXBlIHRoYXQgZG9lcyBub3QgbWF0Y2ggdGhlIHNldHRlci9nZXR0ZXIKKyAgICAvLyBmdW5jdGlvbnMgKHN1Y2ggYXMgdGhlIGludGVnZXJzIDAgYW5kIDEgdG8gcmVwcmVzZW50IGZsb2F0aW5nIHBvaW50IHZhbHVlcyBmb3IgYWxwaGEpLgorICAgIC8vIEFsc28sIHRoZSB1c2Ugb2YgZ2VuZXJpY3MgaW4gY29uc3RydWN0b3JzIG1lYW5zIHRoYXQgd2UgZW5kIHVwIHdpdGggdGhlIE9iamVjdCB2ZXJzaW9ucworICAgIC8vIG9mIHByaW1pdGl2ZSB0eXBlcyAoRmxvYXQgdnMuIGZsb2F0KS4gQnV0IG1vc3QgbGlrZWx5LCB0aGUgc2V0dGVyL2dldHRlciBmdW5jdGlvbnMKKyAgICAvLyB3aWxsIHRha2UgcHJpbWl0aXZlIHR5cGVzIGluc3RlYWQuCisgICAgLy8gU28gd2Ugc3VwcGx5IGFuIG9yZGVyZWQgYXJyYXkgb2Ygb3RoZXIgdHlwZXMgdG8gdHJ5IGJlZm9yZSBnaXZpbmcgdXAuCisgICAgcHJpdmF0ZSBzdGF0aWMgQ2xhc3NbXSBGTE9BVF9WQVJJQU5UUyA9IHtmbG9hdC5jbGFzcywgRmxvYXQuY2xhc3MsIGRvdWJsZS5jbGFzcywgaW50LmNsYXNzLAorICAgICAgICAgICAgRG91YmxlLmNsYXNzLCBJbnRlZ2VyLmNsYXNzfTsKKyAgICBwcml2YXRlIHN0YXRpYyBDbGFzc1tdIElOVEVHRVJfVkFSSUFOVFMgPSB7aW50LmNsYXNzLCBJbnRlZ2VyLmNsYXNzLCBmbG9hdC5jbGFzcywgZG91YmxlLmNsYXNzLAorICAgICAgICAgICAgRmxvYXQuY2xhc3MsIERvdWJsZS5jbGFzc307CisgICAgcHJpdmF0ZSBzdGF0aWMgQ2xhc3NbXSBET1VCTEVfVkFSSUFOVFMgPSB7ZG91YmxlLmNsYXNzLCBEb3VibGUuY2xhc3MsIGZsb2F0LmNsYXNzLCBpbnQuY2xhc3MsCisgICAgICAgICAgICBGbG9hdC5jbGFzcywgSW50ZWdlci5jbGFzc307CisKKyAgICAvLyBUaGVzZSBtYXBzIGhvbGQgYWxsIHByb3BlcnR5IGVudHJpZXMgZm9yIGEgcGFydGljdWxhciBjbGFzcy4gVGhpcyBtYXAKKyAgICAvLyBpcyB1c2VkIHRvIHNwZWVkIHVwIHByb3BlcnR5L3NldHRlci9nZXR0ZXIgbG9va3VwcyBmb3IgYSBnaXZlbiBjbGFzcy9wcm9wZXJ0eQorICAgIC8vIGNvbWJpbmF0aW9uLiBObyBuZWVkIHRvIHVzZSByZWZsZWN0aW9uIG9uIHRoZSBjb21iaW5hdGlvbiBtb3JlIHRoYW4gb25jZS4KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBIYXNoTWFwPENsYXNzLCBIYXNoTWFwPFN0cmluZywgTWV0aG9kPj4gc1NldHRlclByb3BlcnR5TWFwID0KKyAgICAgICAgICAgIG5ldyBIYXNoTWFwPENsYXNzLCBIYXNoTWFwPFN0cmluZywgTWV0aG9kPj4oKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBIYXNoTWFwPENsYXNzLCBIYXNoTWFwPFN0cmluZywgTWV0aG9kPj4gc0dldHRlclByb3BlcnR5TWFwID0KKyAgICAgICAgICAgIG5ldyBIYXNoTWFwPENsYXNzLCBIYXNoTWFwPFN0cmluZywgTWV0aG9kPj4oKTsKKworICAgIC8vIFRoaXMgbG9jayBpcyB1c2VkIHRvIGVuc3VyZSB0aGF0IG9ubHkgb25lIHRocmVhZCBpcyBhY2Nlc3NpbmcgdGhlIHByb3BlcnR5IG1hcHMKKyAgICAvLyBhdCBhIHRpbWUuCisgICAgcHJpdmF0ZSBSZWVudHJhbnRSZWFkV3JpdGVMb2NrIHByb3BlcnR5TWFwTG9jayA9IG5ldyBSZWVudHJhbnRSZWFkV3JpdGVMb2NrKCk7CisKKyAgICAvLyBVc2VkIHRvIHBhc3Mgc2luZ2xlIHZhbHVlIHRvIHZhcmFyZ3MgcGFyYW1ldGVyIGluIHNldHRlciBpbnZvY2F0aW9uCisgICAgcHJpdmF0ZSBPYmplY3RbXSBtVG1wVmFsdWVBcnJheSA9IG5ldyBPYmplY3RbMV07CisKKyAgICAvKioKKyAgICAgKiBUaGUgdHlwZSBldmFsdWF0b3IgdXNlZCB0byBjYWxjdWxhdGUgdGhlIGFuaW1hdGVkIHZhbHVlcy4gVGhpcyBldmFsdWF0b3IgaXMgZGV0ZXJtaW5lZAorICAgICAqIGF1dG9tYXRpY2FsbHkgYmFzZWQgb24gdGhlIHR5cGUgb2YgdGhlIHN0YXJ0L2VuZCBvYmplY3RzIHBhc3NlZCBpbnRvIHRoZSBjb25zdHJ1Y3RvciwKKyAgICAgKiBidXQgdGhlIHN5c3RlbSBvbmx5IGtub3dzIGFib3V0IHRoZSBwcmltaXRpdmUgdHlwZXMgaW50LCBkb3VibGUsIGFuZCBmbG9hdC4gQW55IG90aGVyCisgICAgICogdHlwZSB3aWxsIG5lZWQgdG8gc2V0IHRoZSBldmFsdWF0b3IgdG8gYSBjdXN0b20gZXZhbHVhdG9yIGZvciB0aGF0IHR5cGUuCisgICAgICovCisgICAgcHJpdmF0ZSBUeXBlRXZhbHVhdG9yIG1FdmFsdWF0b3I7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdmFsdWUgbW9zdCByZWNlbnRseSBjYWxjdWxhdGVkIGJ5IGNhbGN1bGF0ZVZhbHVlKCkuIFRoaXMgaXMgc2V0IGR1cmluZworICAgICAqIHRoYXQgZnVuY3Rpb24gYW5kIG1pZ2h0IGJlIHJldHJpZXZlZCBsYXRlciBlaXRoZXIgYnkgQW5pbWF0b3IuYW5pbWF0ZWRWYWx1ZSgpIG9yCisgICAgICogYnkgdGhlIHByb3BlcnR5LXNldHRpbmcgbG9naWMgaW4gUHJvcGVydHlBbmltYXRvci5hbmltYXRlZFZhbHVlKCkuCisgICAgICovCisgICAgcHJpdmF0ZSBPYmplY3QgbUFuaW1hdGVkVmFsdWU7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgUHJvcGVydHlWYWx1ZXNIb2xkZXIgb2JqZWN0IHdpdGgganVzdCBhIHNldCBvZiB2YWx1ZXMuIFRoaXMgY29uc3RydWN0b3IKKyAgICAgKiBpcyB0eXBpY2FsbHkgbm90IHVzZWQgd2hlbiBhbmltYXRpbmcgb2JqZWN0cyB3aXRoIFByb3BlcnR5QW5pbWF0b3IsIGJlY2F1c2UgdGhhdAorICAgICAqIG9iamVjdCBuZWVkcyBkaXN0aW5jdCBhbmQgbWVhbmluZ2Z1bCBwcm9wZXJ0eSBuYW1lcy4gU2ltcGxlciBhbmltYXRpb25zIG9mIG9uZQorICAgICAqIHNldCBvZiB2YWx1ZXMgdXNpbmcgQW5pbWF0b3IgbWF5IHVzZSB0aGlzIGNvbnN0cnVjdG9yLCBob3dldmVyLCBiZWNhdXNlIG5vCisgICAgICogZGlzdGluZ3Vpc2hpbmcgbmFtZSBpcyBuZWVkZWQuCisgICAgICogQHBhcmFtIHZhbHVlcyBUaGUgc2V0IG9mIHZhbHVlcyB0byBhbmltYXRlIGJldHdlZW4uIElmIHRoZXJlIGlzIG9ubHkgb25lIHZhbHVlLCBpdAorICAgICAqIGlzIGFzc3VtZWQgdG8gYmUgdGhlIGZpbmFsIHZhbHVlIGJlaW5nIGFuaW1hdGVkIHRvLCBhbmQgdGhlIGluaXRpYWwgdmFsdWUgd2lsbCBiZQorICAgICAqIGRlcml2ZWQgb24gdGhlIGZseS4KKyAgICAgKi8KKyAgICBwdWJsaWMgUHJvcGVydHlWYWx1ZXNIb2xkZXIoVC4uLnZhbHVlcykgeworICAgICAgICB0aGlzKG51bGwsIHZhbHVlcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIFByb3BlcnR5VmFsdWVzSG9sZGVyIG9iamVjdCB3aXRoIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkgbmFtZSBhbmQgc2V0IG9mCisgICAgICogdmFsdWVzLiBUaGVzZSB2YWx1ZXMgY2FuIGJlIG9mIGFueSB0eXBlLCBidXQgdGhlIHR5cGUgc2hvdWxkIGJlIGNvbnNpc3RlbnQgc28gdGhhdAorICAgICAqIGFuIGFwcHJvcHJpYXRlIHtAbGluayBhbmRyb2lkLmFuaW1hdGlvbi5UeXBlRXZhbHVhdG9yfSBjYW4gYmUgZm91bmQgdGhhdCBtYXRjaGVzCisgICAgICogdGhlIGNvbW1vbiB0eXBlLgorICAgICAqIDxwPklmIHRoZXJlIGlzIG9ubHkgb25lIHZhbHVlLCBpdCBpcyBhc3N1bWVkIHRvIGJlIHRoZSBlbmQgdmFsdWUgb2YgYW4gYW5pbWF0aW9uLAorICAgICAqIGFuZCBhbiBpbml0aWFsIHZhbHVlIHdpbGwgYmUgZGVyaXZlZCwgaWYgcG9zc2libGUsIGJ5IGNhbGxpbmcgYSBnZXR0ZXIgZnVuY3Rpb24KKyAgICAgKiBvbiB0aGUgb2JqZWN0LiBBbHNvLCBpZiBhbnkgdmFsdWUgaXMgbnVsbCwgdGhlIHZhbHVlIHdpbGwgYmUgZmlsbGVkIGluIHdoZW4gdGhlIGFuaW1hdGlvbgorICAgICAqIHN0YXJ0cyBpbiB0aGUgc2FtZSB3YXkuIFRoaXMgbWVjaGFuaXNtIG9mIGF1dG9tYXRpY2FsbHkgZ2V0dGluZyBudWxsIHZhbHVlcyBvbmx5IHdvcmtzCisgICAgICogaWYgdGhlIFByb3BlcnR5VmFsdWVzSG9sZGVyIG9iamVjdCBpcyB1c2VkIGluIGNvbmp1bmN0aW9uCisgICAgICoge0BsaW5rIGFuZHJvaWQuYW5pbWF0aW9uLlByb3BlcnR5QW5pbWF0b3J9LCBhbmQgd2l0aCBhIGdldHRlciBmdW5jdGlvbiBlaXRoZXIKKyAgICAgKiBkZXJpdmVkIGF1dG9tYXRpY2FsbHkgZnJvbSA8Y29kZT5wcm9wZXJ0eU5hbWU8L2NvZGU+IG9yIHNldCBleHBsaWNpdGx5IHZpYQorICAgICAqIHtAbGluayAjc2V0R2V0dGVyKGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCl9LCBzaW5jZSBvdGhlcndpc2UgUHJvcGVydHlWYWx1ZXNIb2xkZXIgaGFzCisgICAgICogbm8gd2F5IG9mIGRldGVybWluaW5nIHdoYXQgdGhlIHZhbHVlIHNob3VsZCBiZS4KKyAgICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSBhc3NvY2lhdGVkIHdpdGggdGhpcyBzZXQgb2YgdmFsdWVzLiBUaGlzCisgICAgICogY2FuIGJlIHRoZSBhY3R1YWwgcHJvcGVydHkgbmFtZSB0byBiZSB1c2VkIHdoZW4gdXNpbmcgYSBQcm9wZXJ0eUFuaW1hdG9yIG9iamVjdCwgb3IKKyAgICAgKiBqdXN0IGEgbmFtZSB1c2VkIHRvIGdldCBhbmltYXRlZCB2YWx1ZXMsIHN1Y2ggYXMgaWYgdGhpcyBvYmplY3QgaXMgdXNlZCB3aXRoIGFuCisgICAgICogQW5pbWF0b3Igb2JqZWN0LgorICAgICAqIEBwYXJhbSB2YWx1ZXMgVGhlIHNldCBvZiB2YWx1ZXMgdG8gYW5pbWF0ZSBiZXR3ZWVuLgorICAgICAqLworICAgIHB1YmxpYyBQcm9wZXJ0eVZhbHVlc0hvbGRlcihTdHJpbmcgcHJvcGVydHlOYW1lLCBULi4uIHZhbHVlcykgeworICAgICAgICBtUHJvcGVydHlOYW1lID0gcHJvcGVydHlOYW1lOworICAgICAgICBzZXRWYWx1ZXModmFsdWVzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSB2YWx1ZXMgYmVpbmcgYW5pbWF0ZWQgYmV0d2Vlbi4KKyAgICAgKiBJZiB0aGVyZSBpcyBvbmx5IG9uZSB2YWx1ZSwgaXQgaXMgYXNzdW1lZCB0byBiZSB0aGUgZW5kIHZhbHVlIG9mIGFuIGFuaW1hdGlvbiwKKyAgICAgKiBhbmQgYW4gaW5pdGlhbCB2YWx1ZSB3aWxsIGJlIGRlcml2ZWQsIGlmIHBvc3NpYmxlLCBieSBjYWxsaW5nIGEgZ2V0dGVyIGZ1bmN0aW9uCisgICAgICogb24gdGhlIG9iamVjdC4gQWxzbywgaWYgYW55IHZhbHVlIGlzIG51bGwsIHRoZSB2YWx1ZSB3aWxsIGJlIGZpbGxlZCBpbiB3aGVuIHRoZSBhbmltYXRpb24KKyAgICAgKiBzdGFydHMgaW4gdGhlIHNhbWUgd2F5LiBUaGlzIG1lY2hhbmlzbSBvZiBhdXRvbWF0aWNhbGx5IGdldHRpbmcgbnVsbCB2YWx1ZXMgb25seSB3b3JrcworICAgICAqIGlmIHRoZSBQcm9wZXJ0eVZhbHVlc0hvbGRlciBvYmplY3QgaXMgdXNlZCBpbiBjb25qdW5jdGlvbgorICAgICAqIHtAbGluayBhbmRyb2lkLmFuaW1hdGlvbi5Qcm9wZXJ0eUFuaW1hdG9yfSwgYW5kIHdpdGggYSBnZXR0ZXIgZnVuY3Rpb24gZWl0aGVyCisgICAgICogZGVyaXZlZCBhdXRvbWF0aWNhbGx5IGZyb20gPGNvZGU+cHJvcGVydHlOYW1lPC9jb2RlPiBvciBzZXQgZXhwbGljaXRseSB2aWEKKyAgICAgKiB7QGxpbmsgI3NldEdldHRlcihqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QpfSwgc2luY2Ugb3RoZXJ3aXNlIFByb3BlcnR5VmFsdWVzSG9sZGVyIGhhcworICAgICAqIG5vIHdheSBvZiBkZXRlcm1pbmluZyB3aGF0IHRoZSB2YWx1ZSBzaG91bGQgYmUuCisgICAgICogQHBhcmFtIHZhbHVlcyBUaGUgc2V0IG9mIHZhbHVlcyB0byBhbmltYXRlIGJldHdlZW4uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VmFsdWVzKFQuLi4gdmFsdWVzKSB7CisgICAgICAgIGludCBudW1LZXlmcmFtZXMgPSB2YWx1ZXMubGVuZ3RoOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUtleWZyYW1lczsgKytpKSB7CisgICAgICAgICAgICBpZiAodmFsdWVzW2ldICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBDbGFzcyB0aGlzVmFsdWVUeXBlID0gdmFsdWVzW2ldLmdldENsYXNzKCk7CisgICAgICAgICAgICAgICAgaWYgKG1WYWx1ZVR5cGUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBtVmFsdWVUeXBlID0gdGhpc1ZhbHVlVHlwZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAodGhpc1ZhbHVlVHlwZSAhPSBtVmFsdWVUeXBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVZhbHVlVHlwZSA9PSBJbnRlZ2VyLmNsYXNzICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzVmFsdWVUeXBlID09IEZsb2F0LmNsYXNzIHx8IHRoaXNWYWx1ZVR5cGUgPT0gRG91YmxlLmNsYXNzKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1WYWx1ZVR5cGUgPSB0aGlzVmFsdWVUeXBlOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtVmFsdWVUeXBlID09IEZsb2F0LmNsYXNzICYmIHRoaXNWYWx1ZVR5cGUgPT0gRG91YmxlLmNsYXNzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVZhbHVlVHlwZSA9IHRoaXNWYWx1ZVR5cGU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgS2V5ZnJhbWUga2V5ZnJhbWVzW10gPSBuZXcgS2V5ZnJhbWVbTWF0aC5tYXgobnVtS2V5ZnJhbWVzLDIpXTsKKyAgICAgICAgaWYgKG1WYWx1ZVR5cGUuZXF1YWxzKEtleWZyYW1lLmNsYXNzKSkgeworICAgICAgICAgICAgbVZhbHVlVHlwZSA9ICgoS2V5ZnJhbWUpdmFsdWVzWzBdKS5nZXRUeXBlKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUtleWZyYW1lczsgKytpKSB7CisgICAgICAgICAgICAgICAga2V5ZnJhbWVzW2ldID0gKEtleWZyYW1lKXZhbHVlc1tpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChudW1LZXlmcmFtZXMgPT0gMSkgeworICAgICAgICAgICAgICAgIGtleWZyYW1lc1swXSA9IG5ldyBLZXlmcmFtZSgwZiwgbnVsbCk7CisgICAgICAgICAgICAgICAga2V5ZnJhbWVzWzFdID0gbmV3IEtleWZyYW1lKDFmLCB2YWx1ZXNbMF0pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBrZXlmcmFtZXNbMF0gPSBuZXcgS2V5ZnJhbWUoMGYsIHZhbHVlc1swXSk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBudW1LZXlmcmFtZXM7ICsraSkgeworICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWVzW2ldICE9IG51bGwgJiYgKHZhbHVlc1tpXS5nZXRDbGFzcygpICE9IG1WYWx1ZVR5cGUpKSB7CisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBrZXlmcmFtZXNbaV0gPSBuZXcgS2V5ZnJhbWUoKGZsb2F0KSBpIC8gKG51bUtleWZyYW1lcyAtIDEpLCB2YWx1ZXNbaV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtS2V5ZnJhbWVTZXQgPSBuZXcgS2V5ZnJhbWVTZXQoa2V5ZnJhbWVzKTsKKyAgICB9CisKKworCisgICAgLyoqCisgICAgICogRGV0ZXJtaW5lIHRoZSBzZXR0ZXIgb3IgZ2V0dGVyIGZ1bmN0aW9uIHVzaW5nIHRoZSBKYXZhQmVhbnMgY29udmVudGlvbiBvZiBzZXRGb28gb3IKKyAgICAgKiBnZXRGb28gZm9yIGEgcHJvcGVydHkgbmFtZWQgJ2ZvbycuIFRoaXMgZnVuY3Rpb24gZmlndXJlcyBvdXQgd2hhdCB0aGUgbmFtZSBvZiB0aGUKKyAgICAgKiBmdW5jdGlvbiBzaG91bGQgYmUgYW5kIHVzZXMgcmVmbGVjdGlvbiB0byBmaW5kIHRoZSBNZXRob2Qgd2l0aCB0aGF0IG5hbWUgb24gdGhlCisgICAgICogdGFyZ2V0IG9iamVjdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0YXJnZXRDbGFzcyBUaGUgY2xhc3MgdG8gc2VhcmNoIGZvciB0aGUgbWV0aG9kCisgICAgICogQHBhcmFtIHByZWZpeCAic2V0IiBvciAiZ2V0IiwgZGVwZW5kaW5nIG9uIHdoZXRoZXIgd2UgbmVlZCBhIHNldHRlciBvciBnZXR0ZXIuCisgICAgICogQHBhcmFtIHZhbHVlVHlwZSBUaGUgdHlwZSBvZiB0aGUgcGFyYW1ldGVyIChpbiB0aGUgY2FzZSBvZiBhIHNldHRlcikuIFRoaXMgdHlwZQorICAgICAqIGlzIGRlcml2ZWQgZnJvbSB0aGUgdmFsdWVzIHNldCBvbiB0aGlzIFByb3BlcnR5VmFsdWVzSG9sZGVyLiBUaGlzIHR5cGUgaXMgdXNlZCBhcworICAgICAqIGEgZmlyc3QgZ3Vlc3MgYXQgdGhlIHBhcmFtZXRlciB0eXBlLCBidXQgd2UgY2hlY2sgZm9yIG1ldGhvZHMgd2l0aCBzZXZlcmFsIGRpZmZlcmVudAorICAgICAqIHR5cGVzIHRvIGF2b2lkIHByb2JsZW1zIHdpdGggc2xpZ2h0IG1pcy1tYXRjaGVzIGJldHdlZW4gc3VwcGxpZWQgdmFsdWVzIGFuZCBhY3R1YWwKKyAgICAgKiB2YWx1ZSB0eXBlcyB1c2VkIG9uIHRoZSBzZXR0ZXIuCisgICAgICogQHJldHVybiBNZXRob2QgdGhlIG1ldGhvZCBhc3NvY2lhdGVkIHdpdGggbVByb3BlcnR5TmFtZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIE1ldGhvZCBnZXRQcm9wZXJ0eUZ1bmN0aW9uKENsYXNzIHRhcmdldENsYXNzLCBTdHJpbmcgcHJlZml4LCBDbGFzcyB2YWx1ZVR5cGUpIHsKKyAgICAgICAgLy8gVE9ETzogZmFzdGVyIGltcGxlbWVudGF0aW9uLi4uCisgICAgICAgIE1ldGhvZCByZXR1cm5WYWwgPSBudWxsOworICAgICAgICBTdHJpbmcgZmlyc3RMZXR0ZXIgPSBtUHJvcGVydHlOYW1lLnN1YnN0cmluZygwLCAxKTsKKyAgICAgICAgU3RyaW5nIHRoZVJlc3QgPSBtUHJvcGVydHlOYW1lLnN1YnN0cmluZygxKTsKKyAgICAgICAgZmlyc3RMZXR0ZXIgPSBmaXJzdExldHRlci50b1VwcGVyQ2FzZSgpOworICAgICAgICBTdHJpbmcgbWV0aG9kTmFtZSA9IHByZWZpeCArIGZpcnN0TGV0dGVyICsgdGhlUmVzdDsKKyAgICAgICAgQ2xhc3MgYXJnc1tdID0gbnVsbDsKKyAgICAgICAgaWYgKHZhbHVlVHlwZSA9PSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJldHVyblZhbCA9IHRhcmdldENsYXNzLmdldE1ldGhvZChtZXRob2ROYW1lLCBhcmdzKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLmUoIlByb3BlcnR5VmFsdWVzSG9sZGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZG4ndCBmaW5kIG5vLWFyZyBtZXRob2QgZm9yIHByb3BlcnR5ICIgKyBtUHJvcGVydHlOYW1lICsgIjogIiArIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXJncyA9IG5ldyBDbGFzc1sxXTsKKyAgICAgICAgICAgIENsYXNzIHR5cGVWYXJpYW50c1tdOworICAgICAgICAgICAgaWYgKG1WYWx1ZVR5cGUuZXF1YWxzKEZsb2F0LmNsYXNzKSkgeworICAgICAgICAgICAgICAgIHR5cGVWYXJpYW50cyA9IEZMT0FUX1ZBUklBTlRTOworICAgICAgICAgICAgfSBlbHNlIGlmIChtVmFsdWVUeXBlLmVxdWFscyhJbnRlZ2VyLmNsYXNzKSkgeworICAgICAgICAgICAgICAgIHR5cGVWYXJpYW50cyA9IElOVEVHRVJfVkFSSUFOVFM7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1WYWx1ZVR5cGUuZXF1YWxzKERvdWJsZS5jbGFzcykpIHsKKyAgICAgICAgICAgICAgICB0eXBlVmFyaWFudHMgPSBET1VCTEVfVkFSSUFOVFM7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHR5cGVWYXJpYW50cyA9IG5ldyBDbGFzc1sxXTsKKyAgICAgICAgICAgICAgICB0eXBlVmFyaWFudHNbMF0gPSBtVmFsdWVUeXBlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChDbGFzcyB0eXBlVmFyaWFudCA6IHR5cGVWYXJpYW50cykgeworICAgICAgICAgICAgICAgIGFyZ3NbMF0gPSB0eXBlVmFyaWFudDsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm5WYWwgPSB0YXJnZXRDbGFzcy5nZXRNZXRob2QobWV0aG9kTmFtZSwgYXJncyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWw7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gU3dhbGxvdyB0aGUgZXJyb3IgYW5kIGtlZXAgdHJ5aW5nIG90aGVyIHZhcmlhbnRzCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gSWYgd2UgZ290IGhlcmUsIHRoZW4gbm8gYXBwcm9wcmlhdGUgZnVuY3Rpb24gd2FzIGZvdW5kCisgICAgICAgICAgICBMb2cuZSgiUHJvcGVydHlWYWx1ZXNIb2xkZXIiLAorICAgICAgICAgICAgICAgICAgICAiQ291bGRuJ3QgZmluZCBzZXR0ZXIvZ2V0dGVyIGZvciBwcm9wZXJ0eSAiICsgbVByb3BlcnR5TmFtZSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndpdGggdmFsdWUgdHlwZSAiKyBtVmFsdWVUeXBlKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZXR1cm5WYWw7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBzZXR0ZXIgb3IgZ2V0dGVyIHJlcXVlc3RlZC4gVGhpcyB1dGlsaXR5IGZ1bmN0aW9uIGNoZWNrcyB3aGV0aGVyIHRoZQorICAgICAqIHJlcXVlc3RlZCBtZXRob2QgZXhpc3RzIGluIHRoZSBwcm9wZXJ0eU1hcE1hcCBjYWNoZS4gSWYgbm90LCBpdCBjYWxscyBhbm90aGVyCisgICAgICogdXRpbGl0eSBmdW5jdGlvbiB0byByZXF1ZXN0IHRoZSBNZXRob2QgZnJvbSB0aGUgdGFyZ2V0Q2xhc3MgZGlyZWN0bHkuCisgICAgICogQHBhcmFtIHRhcmdldENsYXNzIFRoZSBDbGFzcyBvbiB3aGljaCB0aGUgcmVxdWVzdGVkIG1ldGhvZCBzaG91bGQgZXhpc3QuCisgICAgICogQHBhcmFtIHByb3BlcnR5TWFwTWFwIFRoZSBjYWNoZSBvZiBzZXR0ZXJzL2dldHRlcnMgZGVyaXZlZCBzbyBmYXIuCisgICAgICogQHBhcmFtIHByZWZpeCAic2V0IiBvciAiZ2V0IiwgZm9yIHRoZSBzZXR0ZXIgb3IgZ2V0dGVyLgorICAgICAqIEBwYXJhbSB2YWx1ZVR5cGUgVGhlIHR5cGUgb2YgcGFyYW1ldGVyIHBhc3NlZCBpbnRvIHRoZSBtZXRob2QgKG51bGwgZm9yIGdldHRlcikuCisgICAgICogQHJldHVybiBNZXRob2QgdGhlIG1ldGhvZCBhc3NvY2lhdGVkIHdpdGggbVByb3BlcnR5TmFtZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIE1ldGhvZCBzZXR1cFNldHRlck9yR2V0dGVyKENsYXNzIHRhcmdldENsYXNzLAorICAgICAgICAgICAgSGFzaE1hcDxDbGFzcywgSGFzaE1hcDxTdHJpbmcsIE1ldGhvZD4+IHByb3BlcnR5TWFwTWFwLAorICAgICAgICAgICAgU3RyaW5nIHByZWZpeCwgQ2xhc3MgdmFsdWVUeXBlKSB7CisgICAgICAgIE1ldGhvZCBzZXR0ZXJPckdldHRlciA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBIYXZlIHRvIGxvY2sgcHJvcGVydHkgbWFwIHByaW9yIHRvIHJlYWRpbmcgaXQsIHRvIGd1YXJkIGFnYWluc3QKKyAgICAgICAgICAgIC8vIGFub3RoZXIgdGhyZWFkIHB1dHRpbmcgc29tZXRoaW5nIGluIHRoZXJlIGFmdGVyIHdlJ3ZlIGNoZWNrZWQgaXQKKyAgICAgICAgICAgIC8vIGJ1dCBiZWZvcmUgd2UndmUgYWRkZWQgYW4gZW50cnkgdG8gaXQKKyAgICAgICAgICAgIC8vIFRPRE86IGNhbiB3ZSBzdG9yZSB0aGUgc2V0dGVyL2dldHRlciBwZXIgQ2xhc3MgaW5zdGVhZCBvZiBwZXIgT2JqZWN0PworICAgICAgICAgICAgcHJvcGVydHlNYXBMb2NrLndyaXRlTG9jaygpLmxvY2soKTsKKyAgICAgICAgICAgIEhhc2hNYXA8U3RyaW5nLCBNZXRob2Q+IHByb3BlcnR5TWFwID0gcHJvcGVydHlNYXBNYXAuZ2V0KHRhcmdldENsYXNzKTsKKyAgICAgICAgICAgIGlmIChwcm9wZXJ0eU1hcCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgc2V0dGVyT3JHZXR0ZXIgPSBwcm9wZXJ0eU1hcC5nZXQobVByb3BlcnR5TmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc2V0dGVyT3JHZXR0ZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHNldHRlck9yR2V0dGVyID0gZ2V0UHJvcGVydHlGdW5jdGlvbih0YXJnZXRDbGFzcywgcHJlZml4LCB2YWx1ZVR5cGUpOworICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eU1hcCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5TWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBNZXRob2Q+KCk7CisgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5TWFwTWFwLnB1dCh0YXJnZXRDbGFzcywgcHJvcGVydHlNYXApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwcm9wZXJ0eU1hcC5wdXQobVByb3BlcnR5TmFtZSwgc2V0dGVyT3JHZXR0ZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgcHJvcGVydHlNYXBMb2NrLndyaXRlTG9jaygpLnVubG9jaygpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzZXR0ZXJPckdldHRlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVdGlsaXR5IGZ1bmN0aW9uIHRvIGdldCB0aGUgc2V0dGVyIGZyb20gdGFyZ2V0Q2xhc3MKKyAgICAgKiBAcGFyYW0gdGFyZ2V0Q2xhc3MgVGhlIENsYXNzIG9uIHdoaWNoIHRoZSByZXF1ZXN0ZWQgbWV0aG9kIHNob3VsZCBleGlzdC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgc2V0dXBTZXR0ZXIoQ2xhc3MgdGFyZ2V0Q2xhc3MpIHsKKyAgICAgICAgbVNldHRlciA9IHNldHVwU2V0dGVyT3JHZXR0ZXIodGFyZ2V0Q2xhc3MsIHNTZXR0ZXJQcm9wZXJ0eU1hcCwgInNldCIsIG1WYWx1ZVR5cGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFV0aWxpdHkgZnVuY3Rpb24gdG8gZ2V0IHRoZSBnZXR0ZXIgZnJvbSB0YXJnZXRDbGFzcworICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzZXR1cEdldHRlcihDbGFzcyB0YXJnZXRDbGFzcykgeworICAgICAgICBtR2V0dGVyID0gc2V0dXBTZXR0ZXJPckdldHRlcih0YXJnZXRDbGFzcywgc0dldHRlclByb3BlcnR5TWFwLCAiZ2V0IiwgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW50ZXJuYWwgZnVuY3Rpb24gKGNhbGxlZCBmcm9tIFByb3BlcnR5QW5pbWF0b3IpIHRvIHNldCB1cCB0aGUgc2V0dGVyIGFuZCBnZXR0ZXIKKyAgICAgKiBwcmlvciB0byBydW5uaW5nIHRoZSBhbmltYXRpb24uIElmIHRoZSBzZXR0ZXIgaGFzIG5vdCBiZWVuIG1hbnVhbGx5IHNldCBmb3IgdGhpcworICAgICAqIG9iamVjdCwgaXQgd2lsbCBiZSBkZXJpdmVkIGF1dG9tYXRpY2FsbHkgZ2l2ZW4gdGhlIHByb3BlcnR5IG5hbWUsIHRhcmdldCBvYmplY3QsIGFuZAorICAgICAqIHR5cGVzIG9mIHZhbHVlcyBzdXBwbGllZC4gSWYgbm8gZ2V0dGVyIGhhcyBiZWVuIHNldCwgaXQgd2lsbCBiZSBzdXBwbGllZCBpZmYgYW55IG9mIHRoZQorICAgICAqIHN1cHBsaWVkIHZhbHVlcyB3YXMgbnVsbC4gSWYgdGhlcmUgaXMgYSBudWxsIHZhbHVlLCB0aGVuIHRoZSBnZXR0ZXIgKHN1cHBsaWVkIG9yIGRlcml2ZWQpCisgICAgICogd2lsbCBiZSBjYWxsZWQgdG8gc2V0IHRob3NlIG51bGwgdmFsdWVzIHRvIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBwcm9wZXJ0eQorICAgICAqIG9uIHRoZSB0YXJnZXQgb2JqZWN0LgorICAgICAqIEBwYXJhbSB0YXJnZXQgVGhlIG9iamVjdCBvbiB3aGljaCB0aGUgc2V0dGVyIChhbmQgcG9zc2libHkgZ2V0dGVyKSBleGlzdC4KKyAgICAgKi8KKyAgICB2b2lkIHNldHVwU2V0dGVyQW5kR2V0dGVyKE9iamVjdCB0YXJnZXQpIHsKKyAgICAgICAgQ2xhc3MgdGFyZ2V0Q2xhc3MgPSB0YXJnZXQuZ2V0Q2xhc3MoKTsKKyAgICAgICAgaWYgKG1TZXR0ZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgc2V0dXBTZXR0ZXIodGFyZ2V0Q2xhc3MpOworICAgICAgICB9CisgICAgICAgIGZvciAoS2V5ZnJhbWUga2YgOiBtS2V5ZnJhbWVTZXQubUtleWZyYW1lcykgeworICAgICAgICAgICAgaWYgKGtmLmdldFZhbHVlKCkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChtR2V0dGVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0dXBHZXR0ZXIodGFyZ2V0Q2xhc3MpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBrZi5zZXRWYWx1ZSgoVCkgbUdldHRlci5pbnZva2UodGFyZ2V0KSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5lKCJQcm9wZXJ0eVZhbHVlc0hvbGRlciIsIGUudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5lKCJQcm9wZXJ0eVZhbHVlc0hvbGRlciIsIGUudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSW50ZXJuYWwgZnVuY3Rpb24gdG8gc2V0IHRoZSB2YWx1ZSBvbiB0aGUgdGFyZ2V0IG9iamVjdCwgdXNpbmcgdGhlIHNldHRlciBzZXQgdXAKKyAgICAgKiBlYXJsaWVyIG9uIHRoaXMgUHJvcGVydHlWYWx1ZXNIb2xkZXIgb2JqZWN0LiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBQcm9wZXJ0eUFuaW1hdG9yCisgICAgICogdG8gaGFuZGxlIHR1cm5pbmcgdGhlIHZhbHVlIGNhbGN1bGF0ZWQgYnkgQW5pbWF0b3IgaW50byBhIHZhbHVlIHNldCBvbiB0aGUgb2JqZWN0CisgICAgICogYWNjb3JkaW5nIHRvIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eS4KKyAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgb2JqZWN0IG9uIHdoaWNoIHRoZSB2YWx1ZSBpcyBzZXQKKyAgICAgKi8KKyAgICB2b2lkIHNldEFuaW1hdGVkVmFsdWUoT2JqZWN0IHRhcmdldCkgeworICAgICAgICBpZiAobVNldHRlciAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1UbXBWYWx1ZUFycmF5WzBdID0gbUFuaW1hdGVkVmFsdWU7CisgICAgICAgICAgICAgICAgbVNldHRlci5pbnZva2UodGFyZ2V0LCBtVG1wVmFsdWVBcnJheSk7CisgICAgICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cuZSgiUHJvcGVydHlWYWx1ZXNIb2xkZXIiLCBlLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLmUoIlByb3BlcnR5VmFsdWVzSG9sZGVyIiwgZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEludGVybmFsIGZ1bmN0aW9uLCBjYWxsZWQgYnkgQW5pbWF0b3IsIHRvIHNldCB1cCB0aGUgVHlwZUV2YWx1YXRvciB0aGF0IHdpbGwgYmUgdXNlZAorICAgICAqIHRvIGNhbGN1bGF0ZSBhbmltYXRlZCB2YWx1ZXMuCisgICAgICovCisgICAgdm9pZCBpbml0KCkgeworICAgICAgICBpZiAobUV2YWx1YXRvciA9PSBudWxsKSB7CisgICAgICAgICAgICBtRXZhbHVhdG9yID0gKG1WYWx1ZVR5cGUgPT0gaW50LmNsYXNzKSA/IHNJbnRFdmFsdWF0b3IgOgorICAgICAgICAgICAgICAgIChtVmFsdWVUeXBlID09IGRvdWJsZS5jbGFzcykgPyBzRG91YmxlRXZhbHVhdG9yIDogc0Zsb2F0RXZhbHVhdG9yOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIFR5cGVFdmFsdWF0b3Igd2lsbCB0aGUgYXV0b21hdGljYWxseSBkZXRlcm1pbmVkIGJhc2VkIG9uIHRoZSB0eXBlIG9mIHZhbHVlcworICAgICAqIHN1cHBsaWVkIHRvIFByb3BlcnR5VmFsdWVzSG9sZGVyLiBUaGUgZXZhbHVhdG9yIGNhbiBiZSBtYW51YWxseSBzZXQsIGhvd2V2ZXIsIGlmIHNvCisgICAgICogZGVzaXJlZC4gVGhpcyBtYXkgYmUgaW1wb3J0YW50IGluIGNhc2VzIHdoZXJlIGVpdGhlciB0aGUgdHlwZSBvZiB0aGUgdmFsdWVzIHN1cHBsaWVkCisgICAgICogZG8gbm90IG1hdGNoIHRoZSB3YXkgdGhhdCB0aGV5IHNob3VsZCBiZSBpbnRlcnBvbGF0ZWQgYmV0d2Vlbiwgb3IgaWYgdGhlIHZhbHVlcworICAgICAqIGFyZSBvZiBhIGN1c3RvbSB0eXBlIG9yIG9uZSBub3QgY3VycmVudGx5IHVuZGVyc3Rvb2QgYnkgdGhlIGFuaW1hdGlvbiBzeXN0ZW0uIEN1cnJlbnRseSwKKyAgICAgKiBvbmx5IHZhbHVlcyBvZiB0eXBlIGZsb2F0LCBkb3VibGUsIGFuZCBpbnQgKGFuZCB0aGVpciBPYmplY3QgZXF1aXZhbGVudHMsIEZsb2F0LCBEb3VibGUsCisgICAgICogYW5kIEludGVnZXIpIGFyZSAgY29ycmVjdGx5IGludGVycG9sYXRlZDsgYWxsIG90aGVyIHR5cGVzIHJlcXVpcmUgc2V0dGluZyBhIFR5cGVFdmFsdWF0b3IuCisgICAgICogQHBhcmFtIGV2YWx1YXRvcgorICAgICAqLworCXB1YmxpYyB2b2lkIHNldEV2YWx1YXRvcihUeXBlRXZhbHVhdG9yIGV2YWx1YXRvcikgeworICAgICAgICBtRXZhbHVhdG9yID0gZXZhbHVhdG9yOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZ1bmN0aW9uIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSB2YWx1ZSBhY2NvcmRpbmcgdG8gdGhlIGV2YWx1YXRvciBzZXQgdXAgZm9yCisgICAgICogdGhpcyBQcm9wZXJ0eVZhbHVlc0hvbGRlciBvYmplY3QuIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IEFuaW1hdG9yLmFuaW1hdGVWYWx1ZSgpLgorICAgICAqCisgICAgICogQHBhcmFtIGZyYWN0aW9uIFRoZSBlbGFwc2VkLCBpbnRlcnBvbGF0ZWQgZnJhY3Rpb24gb2YgdGhlIGFuaW1hdGlvbi4KKyAgICAgKiBAcmV0dXJuIFRoZSBjYWxjdWxhdGVkIHZhbHVlIGF0IHRoaXMgcG9pbnQgaW4gdGhlIGFuaW1hdGlvbi4KKyAgICAgKi8KKyAgICBPYmplY3QgY2FsY3VsYXRlVmFsdWUoZmxvYXQgZnJhY3Rpb24pIHsKKyAgICAgICAgbUFuaW1hdGVkVmFsdWUgPSBtS2V5ZnJhbWVTZXQuZ2V0VmFsdWUoZnJhY3Rpb24sIG1FdmFsdWF0b3IpOworICAgICAgICByZXR1cm4gbUFuaW1hdGVkVmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgPGNvZGU+TWV0aG9kPC9jb2RlPiB0aGF0IGlzIGNhbGxlZCB3aXRoIHRoZSBhbmltYXRlZCB2YWx1ZXMgY2FsY3VsYXRlZAorICAgICAqIGR1cmluZyB0aGUgYW5pbWF0aW9uLiBTZXR0aW5nIHRoZSBzZXR0ZXIgbWV0aG9kIGlzIGFuIGFsdGVybmF0aXZlIHRvIHN1cHBseWluZyBhCisgICAgICoge0BsaW5rICNzZXRQcm9wZXJ0eU5hbWUoU3RyaW5nKSBwcm9wZXJ0eU5hbWV9IGZyb20gd2hpY2ggdGhlIG1ldGhvZCBpcyBkZXJpdmVkLiBUaGlzCisgICAgICogYXBwcm9hY2ggaXMgbW9yZSBkaXJlY3QsIGFuZCBpcyBlc3BlY2lhbGx5IHVzZWZ1bCB3aGVuIGEgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgdGhhdCBkb2VzCisgICAgICogbm90IGNvcnJlc3BvbmQgdG8gdGhlIGNvbnZlbnRpb24gb2YgPGNvZGU+c2V0TmFtZSgpPC9jb2RlPi4gRm9yIGV4YW1wbGUsIGlmIGEgZnVuY3Rpb24KKyAgICAgKiBjYWxsZWQgPGNvZGU+b2Zmc2V0KCk8L2NvZGU+IGlzIHRvIGJlIGNhbGxlZCB3aXRoIHRoZSBhbmltYXRlZCB2YWx1ZXMsIHRoZXJlIGlzIG5vIHdheQorICAgICAqIHRvIHRlbGwgPGNvZGU+UHJvcGVydHlBbmltYXRvcjwvY29kZT4gaG93IHRvIGNhbGwgdGhhdCBmdW5jdGlvbiBzaW1wbHkgdGhyb3VnaCBhIHByb3BlcnR5CisgICAgICogbmFtZSwgc28gYSBzZXR0ZXIgbWV0aG9kIHNob3VsZCBiZSBzdXBwbGllZCBpbnN0ZWFkLgorICAgICAqCisgICAgICogPHA+Tm90ZSB0aGF0IHRoZSBzZXR0ZXIgZnVuY3Rpb24gbXVzdCB0YWtlIHRoZSBzYW1lIHBhcmFtZXRlciB0eXBlIGFzIHRoZQorICAgICAqIDxjb2RlPnZhbHVlRnJvbTwvY29kZT4gYW5kIDxjb2RlPnZhbHVlVG88L2NvZGU+IHByb3BlcnRpZXMsIG90aGVyd2lzZSB0aGUgY2FsbCB0bworICAgICAqIHRoZSBzZXR0ZXIgZnVuY3Rpb24gd2lsbCBmYWlsLjwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZXR0ZXIgVGhlIHNldHRlciBtZXRob2QgdGhhdCBzaG91bGQgYmUgY2FsbGVkIHdpdGggdGhlIGFuaW1hdGVkIHZhbHVlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTZXR0ZXIoTWV0aG9kIHNldHRlcikgeworICAgICAgICBtU2V0dGVyID0gc2V0dGVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIDxjb2RlPk1ldGhvZDwvY29kZT4gdGhhdCBpcyBjYWxsZWQgd2l0aCB0aGUgYW5pbWF0ZWQgdmFsdWVzIGNhbGN1bGF0ZWQKKyAgICAgKiBkdXJpbmcgdGhlIGFuaW1hdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWV0aG9kIGdldFNldHRlcigpIHsKKyAgICAgICAgcmV0dXJuIG1TZXR0ZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgPGNvZGU+TWV0aG9kPC9jb2RlPiB0aGF0IGlzIGNhbGxlZCB0byBnZXQgdW5zdXBwbGllZCA8Y29kZT52YWx1ZUZyb208L2NvZGU+IG9yCisgICAgICogPGNvZGU+dmFsdWVUbzwvY29kZT4gcHJvcGVydGllcy4gU2V0dGluZyB0aGUgZ2V0dGVyIG1ldGhvZCBpcyBhbiBhbHRlcm5hdGl2ZSB0byBzdXBwbHlpbmcgYQorICAgICAqIHtAbGluayAjc2V0UHJvcGVydHlOYW1lKFN0cmluZykgcHJvcGVydHlOYW1lfSBmcm9tIHdoaWNoIHRoZSBtZXRob2QgaXMgZGVyaXZlZC4gVGhpcworICAgICAqIGFwcHJvYWNoIGlzIG1vcmUgZGlyZWN0LCBhbmQgaXMgZXNwZWNpYWxseSB1c2VmdWwgd2hlbiBhIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHRoYXQgZG9lcworICAgICAqIG5vdCBjb3JyZXNwb25kIHRvIHRoZSBjb252ZW50aW9uIG9mIDxjb2RlPnNldE5hbWUoKTwvY29kZT4uIEZvciBleGFtcGxlLCBpZiBhIGZ1bmN0aW9uCisgICAgICogY2FsbGVkIDxjb2RlPm9mZnNldCgpPC9jb2RlPiBpcyB0byBiZSBjYWxsZWQgdG8gZ2V0IGFuIGluaXRpYWwgdmFsdWUsIHRoZXJlIGlzIG5vIHdheQorICAgICAqIHRvIHRlbGwgPGNvZGU+UHJvcGVydHlBbmltYXRvcjwvY29kZT4gaG93IHRvIGNhbGwgdGhhdCBmdW5jdGlvbiBzaW1wbHkgdGhyb3VnaCBhIHByb3BlcnR5CisgICAgICogbmFtZSwgc28gYSBnZXR0ZXIgbWV0aG9kIHNob3VsZCBiZSBzdXBwbGllZCBpbnN0ZWFkLgorICAgICAqCisgICAgICogPHA+Tm90ZSB0aGF0IHRoZSBnZXR0ZXIgbWV0aG9kIGlzIG9ubHkgY2FsbGVkIHdoZXRoZXIgc3VwcGxpZWQgaGVyZSBvciBkZXJpdmVkCisgICAgICogZnJvbSB0aGUgcHJvcGVydHkgbmFtZSwgaWYgb25lIG9mIDxjb2RlPnZhbHVlRnJvbTwvY29kZT4gb3IgPGNvZGU+dmFsdWVUbzwvY29kZT4gYXJlCisgICAgICogbnVsbC4gSWYgYm90aCBvZiB0aG9zZSB2YWx1ZXMgYXJlIG5vbi1udWxsLCB0aGVuIHRoZXJlIGlzIG5vIG5lZWQgdG8gZ2V0IG9uZSBvZiB0aGUKKyAgICAgKiB2YWx1ZXMgYW5kIHRoZSBnZXR0ZXIgaXMgbm90IGNhbGxlZC4KKyAgICAgKgorICAgICAqIDxwPk5vdGUgdGhhdCB0aGUgZ2V0dGVyIGZ1bmN0aW9uIG11c3QgcmV0dXJuIHRoZSBzYW1lIHBhcmFtZXRlciB0eXBlIGFzIHRoZQorICAgICAqIDxjb2RlPnZhbHVlRnJvbTwvY29kZT4gYW5kIDxjb2RlPnZhbHVlVG88L2NvZGU+IHByb3BlcnRpZXMgKHdoaWNoZXZlciBvZiB0aGVtIGFyZQorICAgICAqIG5vbi1udWxsKSwgb3RoZXJ3aXNlIHRoZSBjYWxsIHRvIHRoZSBnZXR0ZXIgZnVuY3Rpb24gd2lsbCBmYWlsLjwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBnZXR0ZXIgVGhlIGdldHRlciBtZXRob2QgdGhhdCBzaG91bGQgYmUgY2FsbGVkIHRvIGdldCBpbml0aWFsIGFuaW1hdGlvbiB2YWx1ZXMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0R2V0dGVyKE1ldGhvZCBnZXR0ZXIpIHsKKyAgICAgICAgbUdldHRlciA9IGdldHRlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSA8Y29kZT5NZXRob2Q8L2NvZGU+IHRoYXQgaXMgY2FsbGVkIHRvIGdldCB1bnN1cHBsaWVkIDxjb2RlPnZhbHVlRnJvbTwvY29kZT4gb3IKKyAgICAgKiA8Y29kZT52YWx1ZVRvPC9jb2RlPiBwcm9wZXJ0aWVzLgorICAgICAqLworICAgIHB1YmxpYyBNZXRob2QgZ2V0R2V0dGVyKCkgeworICAgICAgICByZXR1cm4gbUdldHRlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0aGF0IHdpbGwgYmUgYW5pbWF0ZWQuIFRoaXMgbmFtZSBpcyB1c2VkIHRvIGRlcml2ZQorICAgICAqIGEgc2V0dGVyIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBjYWxsZWQgdG8gc2V0IGFuaW1hdGVkIHZhbHVlcy4KKyAgICAgKiBGb3IgZXhhbXBsZSwgYSBwcm9wZXJ0eSBuYW1lIG9mIDxjb2RlPmZvbzwvY29kZT4gd2lsbCByZXN1bHQKKyAgICAgKiBpbiBhIGNhbGwgdG8gdGhlIGZ1bmN0aW9uIDxjb2RlPnNldEZvbygpPC9jb2RlPiBvbiB0aGUgdGFyZ2V0IG9iamVjdC4gSWYgZWl0aGVyCisgICAgICogPGNvZGU+dmFsdWVGcm9tPC9jb2RlPiBvciA8Y29kZT52YWx1ZVRvPC9jb2RlPiBpcyBudWxsLCB0aGVuIGEgZ2V0dGVyIGZ1bmN0aW9uIHdpbGwKKyAgICAgKiBhbHNvIGJlIGRlcml2ZWQgYW5kIGNhbGxlZC4KKyAgICAgKgorICAgICAqIDxwPk5vdGUgdGhhdCB0aGUgc2V0dGVyIGZ1bmN0aW9uIGRlcml2ZWQgZnJvbSB0aGlzIHByb3BlcnR5IG5hbWUKKyAgICAgKiBtdXN0IHRha2UgdGhlIHNhbWUgcGFyYW1ldGVyIHR5cGUgYXMgdGhlCisgICAgICogPGNvZGU+dmFsdWVGcm9tPC9jb2RlPiBhbmQgPGNvZGU+dmFsdWVUbzwvY29kZT4gcHJvcGVydGllcywgb3RoZXJ3aXNlIHRoZSBjYWxsIHRvCisgICAgICogdGhlIHNldHRlciBmdW5jdGlvbiB3aWxsIGZhaWwuPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIHByb3BlcnR5TmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgYmVpbmcgYW5pbWF0ZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHlOYW1lKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKKyAgICAgICAgbVByb3BlcnR5TmFtZSA9IHByb3BlcnR5TmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0aGF0IHdpbGwgYmUgYW5pbWF0ZWQuIFRoaXMgbmFtZSB3aWxsIGJlIHVzZWQgdG8gZGVyaXZlCisgICAgICogYSBzZXR0ZXIgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZCB0byBzZXQgYW5pbWF0ZWQgdmFsdWVzLgorICAgICAqIEZvciBleGFtcGxlLCBhIHByb3BlcnR5IG5hbWUgb2YgPGNvZGU+Zm9vPC9jb2RlPiB3aWxsIHJlc3VsdAorICAgICAqIGluIGEgY2FsbCB0byB0aGUgZnVuY3Rpb24gPGNvZGU+c2V0Rm9vKCk8L2NvZGU+IG9uIHRoZSB0YXJnZXQgb2JqZWN0LiBJZiBlaXRoZXIKKyAgICAgKiA8Y29kZT52YWx1ZUZyb208L2NvZGU+IG9yIDxjb2RlPnZhbHVlVG88L2NvZGU+IGlzIG51bGwsIHRoZW4gYSBnZXR0ZXIgZnVuY3Rpb24gd2lsbAorICAgICAqIGFsc28gYmUgZGVyaXZlZCBhbmQgY2FsbGVkLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHlOYW1lKCkgeworICAgICAgICByZXR1cm4gbVByb3BlcnR5TmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnRlcm5hbCBmdW5jdGlvbiwgY2FsbGVkIGJ5IEFuaW1hdG9yIGFuZCBQcm9wZXJ0eUFuaW1hdG9yLCB0byByZXRyaWV2ZSB0aGUgdmFsdWUKKyAgICAgKiBtb3N0IHJlY2VudGx5IGNhbGN1bGF0ZWQgaW4gY2FsY3VsYXRlVmFsdWUoKS4KKyAgICAgKiBAcmV0dXJuCisgICAgICovCisgICAgT2JqZWN0IGdldEFuaW1hdGVkVmFsdWUoKSB7CisgICAgICAgIHJldHVybiBtQW5pbWF0ZWRWYWx1ZTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL1JHQkV2YWx1YXRvci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL1JHQkV2YWx1YXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhZTBhZjAKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hbmltYXRpb24vUkdCRXZhbHVhdG9yLmphdmEKQEAgLTAsMCArMSw1OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5hbmltYXRpb247CisKKy8qKgorICogVGhpcyBldmFsdWF0b3IgY2FuIGJlIHVzZWQgdG8gcGVyZm9ybSB0eXBlIGludGVycG9sYXRpb24gYmV0d2VlbiBpbnRlZ2VyCisgKiB2YWx1ZXMgdGhhdCByZXByZXNlbnQgQVJHQiBjb2xvcnMuCisgKi8KK3B1YmxpYyBjbGFzcyBSR0JFdmFsdWF0b3IgaW1wbGVtZW50cyBUeXBlRXZhbHVhdG9yIHsKKworICAgIC8qKgorICAgICAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgY2FsY3VsYXRlZCBpbi1iZXR3ZWVuIHZhbHVlIGZvciBhIGNvbG9yCisgICAgICogZ2l2ZW4gaW50ZWdlcnMgdGhhdCByZXByZXNlbnQgdGhlIHN0YXJ0IGFuZCBlbmQgdmFsdWVzIGluIHRoZSBmb3VyCisgICAgICogYnl0ZXMgb2YgdGhlIDMyLWJpdCBpbnQuIEVhY2ggY2hhbm5lbCBpcyBzZXBhcmF0ZWx5IGxpbmVhcmx5IGludGVycG9sYXRlZAorICAgICAqIGFuZCB0aGUgcmVzdWx0aW5nIGNhbGN1bGF0ZWQgdmFsdWVzIGFyZSByZWNvbWJpbmVkIGludG8gdGhlIHJldHVybiB2YWx1ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmcmFjdGlvbiBUaGUgZnJhY3Rpb24gZnJvbSB0aGUgc3RhcnRpbmcgdG8gdGhlIGVuZGluZyB2YWx1ZXMKKyAgICAgKiBAcGFyYW0gc3RhcnRWYWx1ZSBBIDMyLWJpdCBpbnQgdmFsdWUgcmVwcmVzZW50aW5nIGNvbG9ycyBpbiB0aGUKKyAgICAgKiBzZXBhcmF0ZSBieXRlcyBvZiB0aGUgcGFyYW1ldGVyCisgICAgICogQHBhcmFtIGVuZFZhbHVlIEEgMzItYml0IGludCB2YWx1ZSByZXByZXNlbnRpbmcgY29sb3JzIGluIHRoZQorICAgICAqIHNlcGFyYXRlIGJ5dGVzIG9mIHRoZSBwYXJhbWV0ZXIKKyAgICAgKiBAcmV0dXJuIEEgdmFsdWUgdGhhdCBpcyBjYWxjdWxhdGVkIHRvIGJlIHRoZSBsaW5lYXJseSBpbnRlcnBvbGF0ZWQKKyAgICAgKiByZXN1bHQsIGRlcml2ZWQgYnkgc2VwYXJhdGluZyB0aGUgc3RhcnQgYW5kIGVuZCB2YWx1ZXMgaW50byBzZXBhcmF0ZQorICAgICAqIGNvbG9yIGNoYW5uZWxzIGFuZCBpbnRlcnBvbGF0aW5nIGVhY2ggb25lIHNlcGFyYXRlbHksIHJlY29tYmluaW5nIHRoZQorICAgICAqIHJlc3VsdGluZyB2YWx1ZXMgaW4gdGhlIHNhbWUgd2F5LgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgZXZhbHVhdGUoZmxvYXQgZnJhY3Rpb24sIE9iamVjdCBzdGFydFZhbHVlLCBPYmplY3QgZW5kVmFsdWUpIHsKKyAgICAgICAgaW50IHN0YXJ0SW50ID0gKEludGVnZXIpIHN0YXJ0VmFsdWU7CisgICAgICAgIGludCBzdGFydEEgPSAoc3RhcnRJbnQgPj4gMjQpOworICAgICAgICBpbnQgc3RhcnRSID0gKHN0YXJ0SW50ID4+IDE2KSAmIDB4ZmY7CisgICAgICAgIGludCBzdGFydEcgPSAoc3RhcnRJbnQgPj4gOCkgJiAweGZmOworICAgICAgICBpbnQgc3RhcnRCID0gc3RhcnRJbnQgJiAweGZmOworCisgICAgICAgIGludCBlbmRJbnQgPSAoSW50ZWdlcikgZW5kVmFsdWU7CisgICAgICAgIGludCBlbmRBID0gKGVuZEludCA+PiAyNCk7CisgICAgICAgIGludCBlbmRSID0gKGVuZEludCA+PiAxNikgJiAweGZmOworICAgICAgICBpbnQgZW5kRyA9IChlbmRJbnQgPj4gOCkgJiAweGZmOworICAgICAgICBpbnQgZW5kQiA9IGVuZEludCAmIDB4ZmY7CisKKyAgICAgICAgcmV0dXJuIChpbnQpKChzdGFydEEgKyAoaW50KShmcmFjdGlvbiAqIChlbmRBIC0gc3RhcnRBKSkpIDw8IDI0KSB8CisgICAgICAgICAgICAgICAgKGludCkoKHN0YXJ0UiArIChpbnQpKGZyYWN0aW9uICogKGVuZFIgLSBzdGFydFIpKSkgPDwgMTYpIHwKKyAgICAgICAgICAgICAgICAoaW50KSgoc3RhcnRHICsgKGludCkoZnJhY3Rpb24gKiAoZW5kRyAtIHN0YXJ0RykpKSA8PCA4KSB8CisgICAgICAgICAgICAgICAgKGludCkoKHN0YXJ0QiArIChpbnQpKGZyYWN0aW9uICogKGVuZEIgLSBzdGFydEIpKSkpOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hbmltYXRpb24vU2VxdWVuY2VyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hbmltYXRpb24vU2VxdWVuY2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc0OTQyOQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9TZXF1ZW5jZXIuamF2YQpAQCAtMCwwICsxLDgyMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5hbmltYXRpb247CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7CitpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFuaW1hdGlvblV0aWxzOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKKworLyoqCisgKiBUaGlzIGNsYXNzIHBsYXlzIGEgc2V0IG9mIHtAbGluayBBbmltYXRhYmxlfSBvYmplY3RzIGluIHRoZSBzcGVjaWZpZWQgb3JkZXIuIEFuaW1hdGlvbnMKKyAqIGNhbiBiZSBzZXQgdXAgdG8gcGxheSB0b2dldGhlciwgaW4gc2VxdWVuY2UsIG9yIGFmdGVyIGEgc3BlY2lmaWVkIGRlbGF5LgorICoKKyAqIDxwPlRoZXJlIGFyZSB0d28gZGlmZmVyZW50IGFwcHJvYWNoZXMgdG8gYWRkaW5nIGFuaW1hdGlvbnMgdG8gYSA8Y29kZT5TZXF1ZW5jZXI8L2NvZGU+OgorICogZWl0aGVyIHRoZSB7QGxpbmsgU2VxdWVuY2VyI3BsYXlUb2dldGhlcihBbmltYXRhYmxlW10pIHBsYXlUb2dldGhlcigpfSBvcgorICoge0BsaW5rIFNlcXVlbmNlciNwbGF5U2VxdWVudGlhbGx5KEFuaW1hdGFibGVbXSkgcGxheVNlcXVlbnRpYWxseSgpfSBtZXRob2RzIGNhbiBiZSBjYWxsZWQgdG8gYWRkCisgKiBhIHNldCBvZiBhbmltYXRpb25zIGFsbCBhdCBvbmNlLCBvciB0aGUge0BsaW5rIFNlcXVlbmNlciNwbGF5KEFuaW1hdGFibGUpfSBjYW4gYmUKKyAqIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBtZXRob2RzIGluIHRoZSB7QGxpbmsgYW5kcm9pZC5hbmltYXRpb24uU2VxdWVuY2VyLkJ1aWxkZXIgQnVpbGRlcn0KKyAqIGNsYXNzIHRvIGFkZCBhbmltYXRpb25zCisgKiBvbmUgYnkgb25lLjwvcD4KKyAqCisgKiA8cD5JdCBpcyBwb3NzaWJsZSB0byBzZXQgdXAgYSA8Y29kZT5TZXF1ZW5jZXI8L2NvZGU+IHdpdGggY2lyY3VsYXIgZGVwZW5kZW5jaWVzIGJldHdlZW4KKyAqIGl0cyBhbmltYXRpb25zLiBGb3IgZXhhbXBsZSwgYW4gYW5pbWF0aW9uIGExIGNvdWxkIGJlIHNldCB1cCB0byBzdGFydCBiZWZvcmUgYW5pbWF0aW9uIGEyLCBhMgorICogYmVmb3JlIGEzLCBhbmQgYTMgYmVmb3JlIGExLiBUaGUgcmVzdWx0cyBvZiB0aGlzIGNvbmZpZ3VyYXRpb24gYXJlIHVuZGVmaW5lZCwgYnV0IHdpbGwgdHlwaWNhbGx5CisgKiByZXN1bHQgaW4gbm9uZSBvZiB0aGUgYWZmZWN0ZWQgYW5pbWF0aW9ucyBiZWluZyBwbGF5ZWQuIEJlY2F1c2Ugb2YgdGhpcyAoYW5kIGJlY2F1c2UKKyAqIGNpcmN1bGFyIGRlcGVuZGVuY2llcyBkbyBub3QgbWFrZSBsb2dpY2FsIHNlbnNlIGFueXdheSksIGNpcmN1bGFyIGRlcGVuZGVuY2llcworICogc2hvdWxkIGJlIGF2b2lkZWQsIGFuZCB0aGUgZGVwZW5kZW5jeSBmbG93IG9mIGFuaW1hdGlvbnMgc2hvdWxkIG9ubHkgYmUgaW4gb25lIGRpcmVjdGlvbi4KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFNlcXVlbmNlciBleHRlbmRzIEFuaW1hdGFibGUgeworCisgICAgLyoqCisgICAgICogSW50ZXJuYWwgdmFyaWFibGVzCisgICAgICogTk9URTogVGhpcyBvYmplY3QgaW1wbGVtZW50cyB0aGUgY2xvbmUoKSBtZXRob2QsIG1ha2luZyBhIGRlZXAgY29weSBvZiBhbnkgcmVmZXJlbmNlZAorICAgICAqIG9iamVjdHMuIEFzIG90aGVyIG5vbi10cml2aWFsIGZpZWxkcyBhcmUgYWRkZWQgdG8gdGhpcyBjbGFzcywgbWFrZSBzdXJlIHRvIGFkZCBsb2dpYworICAgICAqIHRvIGNsb25lKCkgdG8gbWFrZSBkZWVwIGNvcGllcyBvZiB0aGVtLgorICAgICAqLworCisgICAgLyoqCisgICAgICogVHJhY2tzIGFuaW1hdGlvbnMgY3VycmVudGx5IGJlaW5nIHBsYXllZCwgc28gdGhhdCB3ZSBrbm93IHdoYXQgdG8KKyAgICAgKiBjYW5jZWwgb3IgZW5kIHdoZW4gY2FuY2VsKCkgb3IgZW5kKCkgaXMgY2FsbGVkIG9uIHRoaXMgU2VxdWVuY2VyCisgICAgICovCisgICAgcHJpdmF0ZSBBcnJheUxpc3Q8QW5pbWF0YWJsZT4gbVBsYXlpbmdTZXQgPSBuZXcgQXJyYXlMaXN0PEFuaW1hdGFibGU+KCk7CisKKyAgICAvKioKKyAgICAgKiBDb250YWlucyBhbGwgbm9kZXMsIG1hcHBlZCB0byB0aGVpciByZXNwZWN0aXZlIEFuaW1hdGFibGVzLiBXaGVuIG5ldworICAgICAqIGRlcGVuZGVuY3kgaW5mb3JtYXRpb24gaXMgYWRkZWQgZm9yIGFuIEFuaW1hdGFibGUsIHdlIHdhbnQgdG8gYWRkIGl0CisgICAgICogdG8gYSBzaW5nbGUgbm9kZSByZXByZXNlbnRpbmcgdGhhdCBBbmltYXRhYmxlLCBub3QgY3JlYXRlIGEgbmV3IE5vZGUKKyAgICAgKiBpZiBvbmUgYWxyZWFkeSBleGlzdHMuCisgICAgICovCisgICAgcHJpdmF0ZSBIYXNoTWFwPEFuaW1hdGFibGUsIE5vZGU+IG1Ob2RlTWFwID0gbmV3IEhhc2hNYXA8QW5pbWF0YWJsZSwgTm9kZT4oKTsKKworICAgIC8qKgorICAgICAqIFNldCBvZiBhbGwgbm9kZXMgY3JlYXRlZCBmb3IgdGhpcyBTZXF1ZW5jZXIuIFRoaXMgbGlzdCBpcyB1c2VkIHVwb24KKyAgICAgKiBzdGFydGluZyB0aGUgc2VxdWVuY2VyLCBhbmQgdGhlIG5vZGVzIGFyZSBwbGFjZWQgaW4gc29ydGVkIG9yZGVyIGludG8gdGhlCisgICAgICogc29ydGVkTm9kZXMgY29sbGVjdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIEFycmF5TGlzdDxOb2RlPiBtTm9kZXMgPSBuZXcgQXJyYXlMaXN0PE5vZGU+KCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgc29ydGVkIGxpc3Qgb2Ygbm9kZXMuIFRoaXMgaXMgdGhlIG9yZGVyIGluIHdoaWNoIHRoZSBhbmltYXRpb25zIHdpbGwKKyAgICAgKiBiZSBwbGF5ZWQuIFRoZSBkZXRhaWxzIGFib3V0IHdoZW4gZXhhY3RseSB0aGV5IHdpbGwgYmUgcGxheWVkIGRlcGVuZAorICAgICAqIG9uIHRoZSBkZXBlbmRlbmN5IHJlbGF0aW9uc2hpcHMgb2YgdGhlIG5vZGVzLgorICAgICAqLworICAgIHByaXZhdGUgQXJyYXlMaXN0PE5vZGU+IG1Tb3J0ZWROb2RlcyA9IG5ldyBBcnJheUxpc3Q8Tm9kZT4oKTsKKworICAgIC8qKgorICAgICAqIEZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBub2RlcyBzaG91bGQgYmUgc29ydGVkIHByaW9yIHRvIHBsYXlpbmcuIFRoaXMKKyAgICAgKiBmbGFnIGFsbG93cyB1cyB0byBjYWNoZSB0aGUgcHJldmlvdXMgc29ydGVkIG5vZGVzIHNvIHRoYXQgaWYgdGhlIHNlcXVlbmNlCisgICAgICogaXMgcmVwbGF5ZWQgd2l0aCBubyBjaGFuZ2VzLCBpdCBkb2VzIG5vdCBoYXZlIHRvIHJlLXNvcnQgdGhlIG5vZGVzIGFnYWluLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBtTmVlZHNTb3J0ID0gdHJ1ZTsKKworICAgIHByaXZhdGUgU2VxdWVuY2VyQW5pbWF0YWJsZUxpc3RlbmVyIG1TZXF1ZW5jZUxpc3RlbmVyID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIEZsYWcgaW5kaWNhdGluZyB0aGF0IHRoZSBTZXF1ZW5jZXIgaGFzIGJlZW4gY2FuY2VsZWQgKGJ5IGNhbGxpbmcgY2FuY2VsKCkgb3IgZW5kKCkpLgorICAgICAqIFRoaXMgZmxhZyBpcyB1c2VkIHRvIGF2b2lkIHN0YXJ0aW5nIG90aGVyIGFuaW1hdGlvbnMgd2hlbiBjdXJyZW50bHktcGxheWluZworICAgICAqIGNoaWxkIGFuaW1hdGlvbnMgb2YgdGhpcyBTZXF1ZW5jZXIgZW5kLgorICAgICAqLworICAgIGJvb2xlYW4gbUNhbmNlbGVkID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHVwIHRoaXMgU2VxdWVuY2VyIHRvIHBsYXkgYWxsIG9mIHRoZSBzdXBwbGllZCBhbmltYXRpb25zIGF0IHRoZSBzYW1lIHRpbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VxdWVuY2VJdGVtcyBUaGUgYW5pbWF0aW9ucyB0aGF0IHdpbGwgYmUgc3RhcnRlZCBzaW11bHRhbmVvdXNseS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwbGF5VG9nZXRoZXIoQW5pbWF0YWJsZS4uLiBzZXF1ZW5jZUl0ZW1zKSB7CisgICAgICAgIGlmIChzZXF1ZW5jZUl0ZW1zICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1OZWVkc1NvcnQgPSB0cnVlOworICAgICAgICAgICAgQnVpbGRlciBidWlsZGVyID0gcGxheShzZXF1ZW5jZUl0ZW1zWzBdKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgc2VxdWVuY2VJdGVtcy5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aChzZXF1ZW5jZUl0ZW1zW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdXAgdGhpcyBTZXF1ZW5jZXIgdG8gcGxheSBlYWNoIG9mIHRoZSBzdXBwbGllZCBhbmltYXRpb25zIHdoZW4gdGhlCisgICAgICogcHJldmlvdXMgYW5pbWF0aW9uIGVuZHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VxdWVuY2VJdGVtcyBUaGUgYW5pYW10aW9ucyB0aGF0IHdpbGwgYmUgc3RhcnRlZCBvbmUgYWZ0ZXIgYW5vdGhlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwbGF5U2VxdWVudGlhbGx5KEFuaW1hdGFibGUuLi4gc2VxdWVuY2VJdGVtcykgeworICAgICAgICBpZiAoc2VxdWVuY2VJdGVtcyAhPSBudWxsKSB7CisgICAgICAgICAgICBtTmVlZHNTb3J0ID0gdHJ1ZTsKKyAgICAgICAgICAgIGlmIChzZXF1ZW5jZUl0ZW1zLmxlbmd0aCA9PSAxKSB7CisgICAgICAgICAgICAgICAgcGxheShzZXF1ZW5jZUl0ZW1zWzBdKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZXF1ZW5jZUl0ZW1zLmxlbmd0aCAtIDE7ICsraSkgeworICAgICAgICAgICAgICAgICAgICBwbGF5KHNlcXVlbmNlSXRlbXNbaV0pLmJlZm9yZShzZXF1ZW5jZUl0ZW1zW2krMV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgbGlzdCBvZiBjaGlsZCBBbmltYXRhYmxlIG9iamVjdHMgY29udHJvbGxlZCBieSB0aGlzCisgICAgICogU2VxdWVuY2VyLiBUaGlzIGlzIGEgY29weSBvZiB0aGUgaW50ZXJuYWwgbGlzdDsgbW9kaWZpY2F0aW9ucyB0byB0aGUgcmV0dXJuZWQgbGlzdAorICAgICAqIHdpbGwgbm90IGFmZmVjdCB0aGUgU2VxdWVuY2VyLCBhbHRob3VnaCBjaGFuZ2VzIHRvIHRoZSB1bmRlcmx5aW5nIEFuaW1hdGFibGUgb2JqZWN0cworICAgICAqIHdpbGwgYWZmZWN0IHRob3NlIG9iamVjdHMgYmVpbmcgbWFuYWdlZCBieSB0aGUgU2VxdWVuY2VyLgorICAgICAqCisgICAgICogQHJldHVybiBBcnJheUxpc3Q8QW5pbWF0YWJsZT4gVGhlIGxpc3Qgb2YgY2hpbGQgYW5pbWF0aW9ucyBvZiB0aGlzIFNlcXVlbmNlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgQXJyYXlMaXN0PEFuaW1hdGFibGU+IGdldENoaWxkQW5pbWF0aW9ucygpIHsKKyAgICAgICAgQXJyYXlMaXN0PEFuaW1hdGFibGU+IGNoaWxkTGlzdCA9IG5ldyBBcnJheUxpc3Q8QW5pbWF0YWJsZT4oKTsKKyAgICAgICAgZm9yIChOb2RlIG5vZGUgOiBtTm9kZXMpIHsKKyAgICAgICAgICAgIGNoaWxkTGlzdC5hZGQobm9kZS5hbmltYXRpb24pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjaGlsZExpc3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgdGFyZ2V0IG9iamVjdCBmb3IgYWxsIGN1cnJlbnQge0BsaW5rICNnZXRDaGlsZEFuaW1hdGlvbnMoKSBjaGlsZCBhbmltYXRpb25zfQorICAgICAqIG9mIHRoaXMgU2VxdWVuY2VyIHRoYXQgdGFrZSB0YXJnZXRzICh7QGxpbmsgYW5kcm9pZC5hbmltYXRpb24uUHJvcGVydHlBbmltYXRvcn0gYW5kCisgICAgICogU2VxdWVuY2VyKS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0YXJnZXQgVGhlIG9iamVjdCBiZWluZyBhbmltYXRlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFRhcmdldChPYmplY3QgdGFyZ2V0KSB7CisgICAgICAgIGZvciAoTm9kZSBub2RlIDogbU5vZGVzKSB7CisgICAgICAgICAgICBBbmltYXRhYmxlIGFuaW1hdGlvbiA9IG5vZGUuYW5pbWF0aW9uOworICAgICAgICAgICAgaWYgKGFuaW1hdGlvbiBpbnN0YW5jZW9mIFNlcXVlbmNlcikgeworICAgICAgICAgICAgICAgICgoU2VxdWVuY2VyKWFuaW1hdGlvbikuc2V0VGFyZ2V0KHRhcmdldCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGFuaW1hdGlvbiBpbnN0YW5jZW9mIFByb3BlcnR5QW5pbWF0b3IpIHsKKyAgICAgICAgICAgICAgICAoKFByb3BlcnR5QW5pbWF0b3IpYW5pbWF0aW9uKS5zZXRUYXJnZXQodGFyZ2V0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIGNyZWF0ZXMgYSA8Y29kZT5CdWlsZGVyPC9jb2RlPiBvYmplY3QsIHdoaWNoIGlzIHVzZWQgdG8KKyAgICAgKiBzZXQgdXAgcGxheWluZyBjb25zdHJhaW50cy4gVGhpcyBpbml0aWFsIDxjb2RlPnBsYXkoKTwvY29kZT4gbWV0aG9kCisgICAgICogdGVsbHMgdGhlIDxjb2RlPkJ1aWxkZXI8L2NvZGU+IHRoZSBhbmltYXRpb24gdGhhdCBpcyB0aGUgZGVwZW5kZW5jeSBmb3IKKyAgICAgKiB0aGUgc3VjY2VlZGluZyBjb21tYW5kcyB0byB0aGUgPGNvZGU+QnVpbGRlcjwvY29kZT4uIEZvciBleGFtcGxlLAorICAgICAqIGNhbGxpbmcgPGNvZGU+cGxheShhMSkud2l0aChhMik8L2NvZGU+IHNldHMgdXAgdGhlIFNlcXVlbmNlIHRvIHBsYXkKKyAgICAgKiA8Y29kZT5hMTwvY29kZT4gYW5kIDxjb2RlPmEyPC9jb2RlPiBhdCB0aGUgc2FtZSB0aW1lLAorICAgICAqIDxjb2RlPnBsYXkoYTEpLmJlZm9yZShhMik8L2NvZGU+IHNldHMgdXAgdGhlIFNlcXVlbmNlIHRvIHBsYXkKKyAgICAgKiA8Y29kZT5hMTwvY29kZT4gZmlyc3QsIGZvbGxvd2VkIGJ5IDxjb2RlPmEyPC9jb2RlPiwgYW5kCisgICAgICogPGNvZGU+cGxheShhMSkuYWZ0ZXIoYTIpPC9jb2RlPiBzZXRzIHVwIHRoZSBTZXF1ZW5jZSB0byBwbGF5CisgICAgICogPGNvZGU+YTI8L2NvZGU+IGZpcnN0LCBmb2xsb3dlZCBieSA8Y29kZT5hMTwvY29kZT4uCisgICAgICoKKyAgICAgKiA8cD5Ob3RlIHRoYXQgPGNvZGU+cGxheSgpPC9jb2RlPiBpcyB0aGUgb25seSB3YXkgdG8gdGVsbCB0aGUKKyAgICAgKiA8Y29kZT5CdWlsZGVyPC9jb2RlPiB0aGUgYW5pbWF0aW9uIHVwb24gd2hpY2ggdGhlIGRlcGVuZGVuY3kgaXMgY3JlYXRlZCwKKyAgICAgKiBzbyBzdWNjZXNzaXZlIGNhbGxzIHRvIHRoZSB2YXJpb3VzIGZ1bmN0aW9ucyBpbiA8Y29kZT5CdWlsZGVyPC9jb2RlPgorICAgICAqIHdpbGwgYWxsIHJlZmVyIHRvIHRoZSBpbml0aWFsIHBhcmFtZXRlciBzdXBwbGllZCBpbiA8Y29kZT5wbGF5KCk8L2NvZGU+CisgICAgICogYXMgdGhlIGRlcGVuZGVuY3kgb2YgdGhlIG90aGVyIGFuaW1hdGlvbnMuIEZvciBleGFtcGxlLCBjYWxsaW5nCisgICAgICogPGNvZGU+cGxheShhMSkuYmVmb3JlKGEyKS5iZWZvcmUoYTMpPC9jb2RlPiB3aWxsIHBsYXkgYm90aCA8Y29kZT5hMjwvY29kZT4KKyAgICAgKiBhbmQgPGNvZGU+YTM8L2NvZGU+IHdoZW4gYTEgZW5kczsgaXQgZG9lcyBub3Qgc2V0IHVwIGEgZGVwZW5kZW5jeSBiZXR3ZWVuCisgICAgICogPGNvZGU+YTI8L2NvZGU+IGFuZCA8Y29kZT5hMzwvY29kZT4uPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIGFuaW0gVGhlIGFuaW1hdGlvbiB0aGF0IGlzIHRoZSBkZXBlbmRlbmN5IHVzZWQgaW4gbGF0ZXIgY2FsbHMgdG8gdGhlCisgICAgICogbWV0aG9kcyBpbiB0aGUgcmV0dXJuZWQgPGNvZGU+QnVpbGRlcjwvY29kZT4gb2JqZWN0LiBBIG51bGwgcGFyYW1ldGVyIHdpbGwgcmVzdWx0CisgICAgICogaW4gYSBudWxsIDxjb2RlPkJ1aWxkZXI8L2NvZGU+IHJldHVybiB2YWx1ZS4KKyAgICAgKiBAcmV0dXJuIEJ1aWxkZXIgVGhlIG9iamVjdCB0aGF0IGNvbnN0cnVjdHMgdGhlIHNlcXVlbmNlIGJhc2VkIG9uIHRoZSBkZXBlbmRlbmNpZXMKKyAgICAgKiBvdXRsaW5lZCBpbiB0aGUgY2FsbHMgdG8gPGNvZGU+cGxheTwvY29kZT4gYW5kIHRoZSBvdGhlciBtZXRob2RzIGluIHRoZQorICAgICAqIDxjb2RlPkJ1aWxkZXI8L2NvZGUgb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyBCdWlsZGVyIHBsYXkoQW5pbWF0YWJsZSBhbmltKSB7CisgICAgICAgIGlmIChhbmltICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1OZWVkc1NvcnQgPSB0cnVlOworICAgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKGFuaW0pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKgorICAgICAqIDxwPk5vdGUgdGhhdCBjYW5jZWxpbmcgYSA8Y29kZT5TZXF1ZW5jZXI8L2NvZGU+IGFsc28gY2FuY2VscyBhbGwgb2YgdGhlIGFuaW1hdGlvbnMgdGhhdCBpdCBpcworICAgICAqIHJlc3BvbnNpYmxlIGZvci48L3A+CisgICAgICovCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgY2FuY2VsKCkgeworICAgICAgICBtQ2FuY2VsZWQgPSB0cnVlOworICAgICAgICBpZiAobUxpc3RlbmVycyAhPSBudWxsKSB7CisgICAgICAgICAgICBBcnJheUxpc3Q8QW5pbWF0YWJsZUxpc3RlbmVyPiB0bXBMaXN0ZW5lcnMgPQorICAgICAgICAgICAgICAgICAgICAoQXJyYXlMaXN0PEFuaW1hdGFibGVMaXN0ZW5lcj4pIG1MaXN0ZW5lcnMuY2xvbmUoKTsKKyAgICAgICAgICAgIGZvciAoQW5pbWF0YWJsZUxpc3RlbmVyIGxpc3RlbmVyIDogdG1wTGlzdGVuZXJzKSB7CisgICAgICAgICAgICAgICAgbGlzdGVuZXIub25BbmltYXRpb25DYW5jZWwodGhpcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1Tb3J0ZWROb2Rlcy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICBmb3IgKE5vZGUgbm9kZSA6IG1Tb3J0ZWROb2RlcykgeworICAgICAgICAgICAgICAgIG5vZGUuYW5pbWF0aW9uLmNhbmNlbCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqCisgICAgICogPHA+Tm90ZSB0aGF0IGVuZGluZyBhIDxjb2RlPlNlcXVlbmNlcjwvY29kZT4gYWxzbyBlbmRzIGFsbCBvZiB0aGUgYW5pbWF0aW9ucyB0aGF0IGl0IGlzCisgICAgICogcmVzcG9uc2libGUgZm9yLjwvcD4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBlbmQoKSB7CisgICAgICAgIG1DYW5jZWxlZCA9IHRydWU7CisgICAgICAgIGlmIChtU29ydGVkTm9kZXMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgZm9yIChOb2RlIG5vZGUgOiBtU29ydGVkTm9kZXMpIHsKKyAgICAgICAgICAgICAgICBub2RlLmFuaW1hdGlvbi5lbmQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKgorICAgICAqIDxwPlN0YXJ0aW5nIHRoaXMgPGNvZGU+U2VxdWVuY2VyPC9jb2RlPiB3aWxsLCBpbiB0dXJuLCBzdGFydCB0aGUgYW5pbWF0aW9ucyBmb3Igd2hpY2gKKyAgICAgKiBpdCBpcyByZXNwb25zaWJsZS4gVGhlIGRldGFpbHMgb2Ygd2hlbiBleGFjdGx5IHRob3NlIGFuaW1hdGlvbnMgYXJlIHN0YXJ0ZWQgZGVwZW5kcyBvbgorICAgICAqIHRoZSBkZXBlbmRlbmN5IHJlbGF0aW9uc2hpcHMgdGhhdCBoYXZlIGJlZW4gc2V0IHVwIGJldHdlZW4gdGhlIGFuaW1hdGlvbnMuCisgICAgICovCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc3RhcnQoKSB7CisgICAgICAgIG1DYW5jZWxlZCA9IGZhbHNlOworCisgICAgICAgIC8vIEZpcnN0LCBzb3J0IHRoZSBub2RlcyAoaWYgbmVjZXNzYXJ5KS4gVGhpcyB3aWxsIGVuc3VyZSB0aGF0IHNvcnRlZE5vZGVzCisgICAgICAgIC8vIGNvbnRhaW5zIHRoZSBhbmltYXRpb24gbm9kZXMgaW4gdGhlIGNvcnJlY3Qgb3JkZXIuCisgICAgICAgIHNvcnROb2RlcygpOworCisgICAgICAgIC8vIG5vZGVzVG9TdGFydCBob2xkcyB0aGUgbGlzdCBvZiBub2RlcyB0byBiZSBzdGFydGVkIGltbWVkaWF0ZWx5LiBXZSBkb24ndCB3YW50IHRvCisgICAgICAgIC8vIHN0YXJ0IHRoZSBhbmltYXRpb25zIGluIHRoZSBsb29wIGRpcmVjdGx5IGJlY2F1c2Ugd2UgZmlyc3QgbmVlZCB0byBzZXQgdXAKKyAgICAgICAgLy8gZGVwZW5kZW5jaWVzIG9uIGFsbCBvZiB0aGUgbm9kZXMuIEZvciBleGFtcGxlLCB3ZSBkb24ndCB3YW50IHRvIHN0YXJ0IGFuIGFuaW1hdGlvbgorICAgICAgICAvLyB3aGVuIHNvbWUgb3RoZXIgYW5pbWF0aW9uIGFsc28gd2FudHMgdG8gc3RhcnQgd2hlbiB0aGUgZmlyc3QgYW5pbWF0aW9uIGJlZ2lucy4KKyAgICAgICAgQXJyYXlMaXN0PE5vZGU+IG5vZGVzVG9TdGFydCA9IG5ldyBBcnJheUxpc3Q8Tm9kZT4oKTsKKyAgICAgICAgZm9yIChOb2RlIG5vZGUgOiBtU29ydGVkTm9kZXMpIHsKKyAgICAgICAgICAgIGlmIChtU2VxdWVuY2VMaXN0ZW5lciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbVNlcXVlbmNlTGlzdGVuZXIgPSBuZXcgU2VxdWVuY2VyQW5pbWF0YWJsZUxpc3RlbmVyKHRoaXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG5vZGUuZGVwZW5kZW5jaWVzID09IG51bGwgfHwgbm9kZS5kZXBlbmRlbmNpZXMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgICAgICBub2Rlc1RvU3RhcnQuYWRkKG5vZGUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmb3IgKERlcGVuZGVuY3kgZGVwZW5kZW5jeSA6IG5vZGUuZGVwZW5kZW5jaWVzKSB7CisgICAgICAgICAgICAgICAgICAgIGRlcGVuZGVuY3kubm9kZS5hbmltYXRpb24uYWRkTGlzdGVuZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IERlcGVuZGVuY3lMaXN0ZW5lcih0aGlzLCBub2RlLCBkZXBlbmRlbmN5LnJ1bGUpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbm9kZS50bXBEZXBlbmRlbmNpZXMgPSAoQXJyYXlMaXN0PERlcGVuZGVuY3k+KSBub2RlLmRlcGVuZGVuY2llcy5jbG9uZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbm9kZS5hbmltYXRpb24uYWRkTGlzdGVuZXIobVNlcXVlbmNlTGlzdGVuZXIpOworICAgICAgICB9CisgICAgICAgIC8vIE5vdyB0aGF0IGFsbCBkZXBlbmRlbmNpZXMgYXJlIHNldCB1cCwgc3RhcnQgdGhlIGFuaW1hdGlvbnMgdGhhdCBzaG91bGQgYmUgc3RhcnRlZC4KKyAgICAgICAgZm9yIChOb2RlIG5vZGUgOiBub2Rlc1RvU3RhcnQpIHsKKyAgICAgICAgICAgIG5vZGUuYW5pbWF0aW9uLnN0YXJ0KCk7CisgICAgICAgICAgICBtUGxheWluZ1NldC5hZGQobm9kZS5hbmltYXRpb24pOworICAgICAgICB9CisgICAgICAgIGlmIChtTGlzdGVuZXJzICE9IG51bGwpIHsKKyAgICAgICAgICAgIEFycmF5TGlzdDxBbmltYXRhYmxlTGlzdGVuZXI+IHRtcExpc3RlbmVycyA9CisgICAgICAgICAgICAgICAgICAgIChBcnJheUxpc3Q8QW5pbWF0YWJsZUxpc3RlbmVyPikgbUxpc3RlbmVycy5jbG9uZSgpOworICAgICAgICAgICAgZm9yIChBbmltYXRhYmxlTGlzdGVuZXIgbGlzdGVuZXIgOiB0bXBMaXN0ZW5lcnMpIHsKKyAgICAgICAgICAgICAgICBsaXN0ZW5lci5vbkFuaW1hdGlvblN0YXJ0KHRoaXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNlcXVlbmNlciBjbG9uZSgpIHRocm93cyBDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFNlcXVlbmNlciBhbmltID0gKFNlcXVlbmNlcikgc3VwZXIuY2xvbmUoKTsKKyAgICAgICAgLyoKKyAgICAgICAgICogVGhlIGJhc2ljIGNsb25lKCkgb3BlcmF0aW9uIGNvcGllcyBhbGwgaXRlbXMuIFRoaXMgZG9lc24ndCB3b3JrIHZlcnkgd2VsbCBmb3IKKyAgICAgICAgICogU2VxdWVuY2VyLCBiZWNhdXNlIGl0IHdpbGwgY29weSByZWZlcmVuY2VzIHRoYXQgbmVlZCB0byBiZSByZWNyZWF0ZWQgYW5kIHN0YXRlCisgICAgICAgICAqIHRoYXQgbWF5IG5vdCBhcHBseS4gV2hhdCB3ZSBuZWVkIHRvIGRvIG5vdyBpcyBwdXQgdGhlIGNsb25lIGluIGFuIHVuaW5pdGlhbGl6ZWQKKyAgICAgICAgICogc3RhdGUsIHdpdGggZnJlc2gsIGVtcHR5IGRhdGEgc3RydWN0dXJlcy4gVGhlbiB3ZSB3aWxsIGJ1aWxkIHVwIHRoZSBub2RlcyBsaXN0CisgICAgICAgICAqIG1hbnVhbGx5LCBhcyB3ZSBjbG9uZSBlYWNoIE5vZGUgKGFuZCBpdHMgYW5pbWF0aW9uKS4gVGhlIGNsb25lIHdpbGwgdGhlbiBiZSBzb3J0ZWQsCisgICAgICAgICAqIGFuZCB3aWxsIHBvcHVsYXRlIGFueSBhcHByb3ByaWF0ZSBsaXN0cywgd2hlbiBpdCBpcyBzdGFydGVkLgorICAgICAgICAgKi8KKyAgICAgICAgYW5pbS5tTmVlZHNTb3J0ID0gdHJ1ZTsKKyAgICAgICAgYW5pbS5tQ2FuY2VsZWQgPSBmYWxzZTsKKyAgICAgICAgYW5pbS5tUGxheWluZ1NldCA9IG5ldyBBcnJheUxpc3Q8QW5pbWF0YWJsZT4oKTsKKyAgICAgICAgYW5pbS5tTm9kZU1hcCA9IG5ldyBIYXNoTWFwPEFuaW1hdGFibGUsIE5vZGU+KCk7CisgICAgICAgIGFuaW0ubU5vZGVzID0gbmV3IEFycmF5TGlzdDxOb2RlPigpOworICAgICAgICBhbmltLm1Tb3J0ZWROb2RlcyA9IG5ldyBBcnJheUxpc3Q8Tm9kZT4oKTsKKworICAgICAgICAvLyBXYWxrIHRocm91Z2ggdGhlIG9sZCBub2RlcyBsaXN0LCBjbG9uaW5nIGVhY2ggbm9kZSBhbmQgYWRkaW5nIGl0IHRvIHRoZSBuZXcgbm9kZW1hcC4KKyAgICAgICAgLy8gT25lIHByb2JsZW0gaXMgdGhhdCB0aGUgb2xkIG5vZGUgZGVwZW5kZW5jaWVzIHBvaW50IHRvIG5vZGVzIGluIHRoZSBvbGQgc2VxdWVuY2VyLgorICAgICAgICAvLyBXZSBuZWVkIHRvIHRyYWNrIHRoZSBvbGQvbmV3IG5vZGVzIGluIG9yZGVyIHRvIHJlY29uc3RydWN0IHRoZSBkZXBlbmRlbmNpZXMgaW4gdGhlIGNsb25lLgorICAgICAgICBIYXNoTWFwPE5vZGUsIE5vZGU+IG5vZGVDbG9uZU1hcCA9IG5ldyBIYXNoTWFwPE5vZGUsIE5vZGU+KCk7IC8vIDxvbGQsIG5ldz4KKyAgICAgICAgZm9yIChOb2RlIG5vZGUgOiBtTm9kZXMpIHsKKyAgICAgICAgICAgIE5vZGUgbm9kZUNsb25lID0gbm9kZS5jbG9uZSgpOworICAgICAgICAgICAgbm9kZUNsb25lTWFwLnB1dChub2RlLCBub2RlQ2xvbmUpOworICAgICAgICAgICAgYW5pbS5tTm9kZXMuYWRkKG5vZGVDbG9uZSk7CisgICAgICAgICAgICBhbmltLm1Ob2RlTWFwLnB1dChub2RlQ2xvbmUuYW5pbWF0aW9uLCBub2RlQ2xvbmUpOworICAgICAgICAgICAgLy8gQ2xlYXIgb3V0IHRoZSBkZXBlbmRlbmNpZXMgaW4gdGhlIGNsb25lOyB3ZSdsbCBzZXQgdGhlc2UgdXAgbWFudWFsbHkgbGF0ZXIKKyAgICAgICAgICAgIG5vZGVDbG9uZS5kZXBlbmRlbmNpZXMgPSBudWxsOworICAgICAgICAgICAgbm9kZUNsb25lLnRtcERlcGVuZGVuY2llcyA9IG51bGw7CisgICAgICAgICAgICBub2RlQ2xvbmUubm9kZURlcGVuZGVudHMgPSBudWxsOworICAgICAgICAgICAgbm9kZUNsb25lLm5vZGVEZXBlbmRlbmNpZXMgPSBudWxsOworICAgICAgICAgICAgLy8gY2xlYXIgb3V0IGFueSBsaXN0ZW5lcnMgdGhhdCB3ZXJlIHNldCB1cCBieSB0aGUgc2VxdWVuY2VyOyB0aGVzZSB3aWxsCisgICAgICAgICAgICAvLyBiZSBzZXQgdXAgd2hlbiB0aGUgY2xvbmUncyBub2RlcyBhcmUgc29ydGVkCisgICAgICAgICAgICBBcnJheUxpc3Q8QW5pbWF0YWJsZUxpc3RlbmVyPiBjbG9uZUxpc3RlbmVycyA9IG5vZGVDbG9uZS5hbmltYXRpb24uZ2V0TGlzdGVuZXJzKCk7CisgICAgICAgICAgICBpZiAoY2xvbmVMaXN0ZW5lcnMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIEFycmF5TGlzdDxBbmltYXRhYmxlTGlzdGVuZXI+IGxpc3RlbmVyc1RvUmVtb3ZlID0gbnVsbDsKKyAgICAgICAgICAgICAgICBmb3IgKEFuaW1hdGFibGVMaXN0ZW5lciBsaXN0ZW5lciA6IGNsb25lTGlzdGVuZXJzKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChsaXN0ZW5lciBpbnN0YW5jZW9mIFNlcXVlbmNlckFuaW1hdGFibGVMaXN0ZW5lcikgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxpc3RlbmVyc1RvUmVtb3ZlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcnNUb1JlbW92ZSA9IG5ldyBBcnJheUxpc3Q8QW5pbWF0YWJsZUxpc3RlbmVyPigpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXJzVG9SZW1vdmUuYWRkKGxpc3RlbmVyKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobGlzdGVuZXJzVG9SZW1vdmUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBmb3IgKEFuaW1hdGFibGVMaXN0ZW5lciBsaXN0ZW5lciA6IGxpc3RlbmVyc1RvUmVtb3ZlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjbG9uZUxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIE5vdyB0aGF0IHdlJ3ZlIGNsb25lZCBhbGwgb2YgdGhlIG5vZGVzLCB3ZSdyZSByZWFkeSB0byB3YWxrIHRocm91Z2ggdGhlaXIKKyAgICAgICAgLy8gZGVwZW5kZW5jaWVzLCBtYXBwaW5nIHRoZSBvbGQgZGVwZW5kZW5jaWVzIHRvIHRoZSBuZXcgbm9kZXMKKyAgICAgICAgZm9yIChOb2RlIG5vZGUgOiBtTm9kZXMpIHsKKyAgICAgICAgICAgIE5vZGUgbm9kZUNsb25lID0gbm9kZUNsb25lTWFwLmdldChub2RlKTsKKyAgICAgICAgICAgIGlmIChub2RlLmRlcGVuZGVuY2llcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZm9yIChEZXBlbmRlbmN5IGRlcGVuZGVuY3kgOiBub2RlLmRlcGVuZGVuY2llcykgeworICAgICAgICAgICAgICAgICAgICBOb2RlIGNsb25lZERlcGVuZGVuY3lOb2RlID0gbm9kZUNsb25lTWFwLmdldChkZXBlbmRlbmN5Lm5vZGUpOworICAgICAgICAgICAgICAgICAgICBEZXBlbmRlbmN5IGNsb25lRGVwZW5kZW5jeSA9IG5ldyBEZXBlbmRlbmN5KGNsb25lZERlcGVuZGVuY3lOb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcGVuZGVuY3kucnVsZSk7CisgICAgICAgICAgICAgICAgICAgIG5vZGVDbG9uZS5hZGREZXBlbmRlbmN5KGNsb25lRGVwZW5kZW5jeSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGFuaW07CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBjbGFzcyBpcyB0aGUgbWVjaGFuaXNtIGJ5IHdoaWNoIGFuaW1hdGlvbnMgYXJlIHN0YXJ0ZWQgYmFzZWQgb24gZXZlbnRzIGluIG90aGVyCisgICAgICogYW5pbWF0aW9ucy4gSWYgYW4gYW5pbWF0aW9uIGhhcyBtdWx0aXBsZSBkZXBlbmRlbmNpZXMgb24gb3RoZXIgYW5pbWF0aW9ucywgdGhlbgorICAgICAqIGFsbCBkZXBlbmRlbmNpZXMgbXVzdCBiZSBzYXRpc2ZpZWQgYmVmb3JlIHRoZSBhbmltYXRpb24gaXMgc3RhcnRlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBEZXBlbmRlbmN5TGlzdGVuZXIgaW1wbGVtZW50cyBBbmltYXRhYmxlTGlzdGVuZXIgeworCisgICAgICAgIHByaXZhdGUgU2VxdWVuY2VyIG1TZXF1ZW5jZXI7CisKKyAgICAgICAgLy8gVGhlIG5vZGUgdXBvbiB3aGljaCB0aGUgZGVwZW5kZW5jeSBpcyBiYXNlZC4KKyAgICAgICAgcHJpdmF0ZSBOb2RlIG1Ob2RlOworCisgICAgICAgIC8vIFRoZSBEZXBlbmRlbmN5IHJ1bGUgKFdJVEggb3IgQUZURVIpIHRoYXQgdGhlIGxpc3RlbmVyIHNob3VsZCB3YWl0IGZvciBvbgorICAgICAgICAvLyB0aGUgbm9kZQorICAgICAgICBwcml2YXRlIGludCBtUnVsZTsKKworICAgICAgICBwdWJsaWMgRGVwZW5kZW5jeUxpc3RlbmVyKFNlcXVlbmNlciBzZXF1ZW5jZXIsIE5vZGUgbm9kZSwgaW50IHJ1bGUpIHsKKyAgICAgICAgICAgIHRoaXMubVNlcXVlbmNlciA9IHNlcXVlbmNlcjsKKyAgICAgICAgICAgIHRoaXMubU5vZGUgPSBub2RlOworICAgICAgICAgICAgdGhpcy5tUnVsZSA9IHJ1bGU7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogSWdub3JlIGNhbmNlbCBldmVudHMgZm9yIG5vdy4gV2UgbWF5IHdhbnQgdG8gaGFuZGxlIHRoaXMgZXZlbnR1YWxseSwKKyAgICAgICAgICogdG8gcHJldmVudCBmb2xsb3ctb24gYW5pbWF0aW9ucyBmcm9tIHJ1bm5pbmcgd2hlbiBzb21lIGRlcGVuZGVuY3kKKyAgICAgICAgICogYW5pbWF0aW9uIGlzIGNhbmNlbGVkLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25DYW5jZWwoQW5pbWF0YWJsZSBhbmltYXRpb24pIHsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBBbiBlbmQgZXZlbnQgaXMgcmVjZWl2ZWQgLSBzZWUgaWYgdGhpcyBpcyBhbiBldmVudCB3ZSBhcmUgbGlzdGVuaW5nIGZvcgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25FbmQoQW5pbWF0YWJsZSBhbmltYXRpb24pIHsKKyAgICAgICAgICAgIGlmIChtUnVsZSA9PSBEZXBlbmRlbmN5LkFGVEVSKSB7CisgICAgICAgICAgICAgICAgc3RhcnRJZlJlYWR5KGFuaW1hdGlvbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogSWdub3JlIHJlcGVhdCBldmVudHMgZm9yIG5vdworICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25SZXBlYXQoQW5pbWF0YWJsZSBhbmltYXRpb24pIHsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBBIHN0YXJ0IGV2ZW50IGlzIHJlY2VpdmVkIC0gc2VlIGlmIHRoaXMgaXMgYW4gZXZlbnQgd2UgYXJlIGxpc3RlbmluZyBmb3IKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQW5pbWF0aW9uU3RhcnQoQW5pbWF0YWJsZSBhbmltYXRpb24pIHsKKyAgICAgICAgICAgIGlmIChtUnVsZSA9PSBEZXBlbmRlbmN5LldJVEgpIHsKKyAgICAgICAgICAgICAgICBzdGFydElmUmVhZHkoYW5pbWF0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDaGVjayB3aGV0aGVyIHRoZSBldmVudCByZWNlaXZlZCBpcyBvbmUgdGhhdCB0aGUgbm9kZSB3YXMgd2FpdGluZyBmb3IuCisgICAgICAgICAqIElmIHNvLCBtYXJrIGl0IGFzIGNvbXBsZXRlIGFuZCBzZWUgd2hldGhlciBpdCdzIHRpbWUgdG8gc3RhcnQKKyAgICAgICAgICogdGhlIGFuaW1hdGlvbi4KKyAgICAgICAgICogQHBhcmFtIGRlcGVuZGVuY3lBbmltYXRpb24gdGhlIGFuaW1hdGlvbiB0aGF0IHNlbnQgdGhlIGV2ZW50LgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSB2b2lkIHN0YXJ0SWZSZWFkeShBbmltYXRhYmxlIGRlcGVuZGVuY3lBbmltYXRpb24pIHsKKyAgICAgICAgICAgIGlmIChtU2VxdWVuY2VyLm1DYW5jZWxlZCkgeworICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBwYXJlbnQgU2VxdWVuY2VyIHdhcyBjYW5jZWxlZCwgdGhlbiBkb24ndCBzdGFydCBhbnkgZGVwZW5kZW50IGFuaW1zCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRGVwZW5kZW5jeSBkZXBlbmRlbmN5VG9SZW1vdmUgPSBudWxsOworICAgICAgICAgICAgZm9yIChEZXBlbmRlbmN5IGRlcGVuZGVuY3kgOiBtTm9kZS50bXBEZXBlbmRlbmNpZXMpIHsKKyAgICAgICAgICAgICAgICBpZiAoZGVwZW5kZW5jeS5ydWxlID09IG1SdWxlICYmCisgICAgICAgICAgICAgICAgICAgICAgICBkZXBlbmRlbmN5Lm5vZGUuYW5pbWF0aW9uID09IGRlcGVuZGVuY3lBbmltYXRpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gcnVsZSBmaXJlZCAtIHJlbW92ZSB0aGUgZGVwZW5kZW5jeSBhbmQgbGlzdGVuZXIgYW5kIGNoZWNrIHRvCisgICAgICAgICAgICAgICAgICAgIC8vIHNlZSB3aGV0aGVyIGl0J3MgdGltZSB0byBzdGFydCB0aGUgYW5pbWF0aW9uCisgICAgICAgICAgICAgICAgICAgIGRlcGVuZGVuY3lUb1JlbW92ZSA9IGRlcGVuZGVuY3k7CisgICAgICAgICAgICAgICAgICAgIGRlcGVuZGVuY3lBbmltYXRpb24ucmVtb3ZlTGlzdGVuZXIodGhpcyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1Ob2RlLnRtcERlcGVuZGVuY2llcy5yZW1vdmUoZGVwZW5kZW5jeVRvUmVtb3ZlKTsKKyAgICAgICAgICAgIGlmIChtTm9kZS50bXBEZXBlbmRlbmNpZXMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgICAgICAvLyBhbGwgZGVwZW5kZW5jaWVzIHNhdGlzZmllZDogc3RhcnQgdGhlIGFuaW1hdGlvbgorICAgICAgICAgICAgICAgIG1Ob2RlLmFuaW1hdGlvbi5zdGFydCgpOworICAgICAgICAgICAgICAgIG1TZXF1ZW5jZXIubVBsYXlpbmdTZXQuYWRkKG1Ob2RlLmFuaW1hdGlvbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgU2VxdWVuY2VyQW5pbWF0YWJsZUxpc3RlbmVyIGltcGxlbWVudHMgQW5pbWF0YWJsZUxpc3RlbmVyIHsKKworICAgICAgICBwcml2YXRlIFNlcXVlbmNlciBtU2VxdWVuY2VyOworCisgICAgICAgIFNlcXVlbmNlckFuaW1hdGFibGVMaXN0ZW5lcihTZXF1ZW5jZXIgc2VxdWVuY2VyKSB7CisgICAgICAgICAgICBtU2VxdWVuY2VyID0gc2VxdWVuY2VyOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25DYW5jZWwoQW5pbWF0YWJsZSBhbmltYXRpb24pIHsKKyAgICAgICAgICAgIGlmIChtUGxheWluZ1NldC5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgICAgIGlmIChtTGlzdGVuZXJzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChBbmltYXRhYmxlTGlzdGVuZXIgbGlzdGVuZXIgOiBtTGlzdGVuZXJzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lci5vbkFuaW1hdGlvbkNhbmNlbChtU2VxdWVuY2VyKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgICAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvbkVuZChBbmltYXRhYmxlIGFuaW1hdGlvbikgeworICAgICAgICAgICAgYW5pbWF0aW9uLnJlbW92ZUxpc3RlbmVyKHRoaXMpOworICAgICAgICAgICAgbVBsYXlpbmdTZXQucmVtb3ZlKGFuaW1hdGlvbik7CisgICAgICAgICAgICBOb2RlIGFuaW1Ob2RlID0gbVNlcXVlbmNlci5tTm9kZU1hcC5nZXQoYW5pbWF0aW9uKTsKKyAgICAgICAgICAgIGFuaW1Ob2RlLmRvbmUgPSB0cnVlOworICAgICAgICAgICAgQXJyYXlMaXN0PE5vZGU+IHNvcnRlZE5vZGVzID0gbVNlcXVlbmNlci5tU29ydGVkTm9kZXM7CisgICAgICAgICAgICBpbnQgbnVtTm9kZXMgPSBzb3J0ZWROb2Rlcy5zaXplKCk7CisgICAgICAgICAgICBpbnQgbm9kZUluZGV4ID0gc29ydGVkTm9kZXMuaW5kZXhPZihhbmltTm9kZSk7CisgICAgICAgICAgICBib29sZWFuIGFsbERvbmUgPSB0cnVlOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IG5vZGVJbmRleCArIDE7IGkgPCBudW1Ob2RlczsgKytpKSB7CisgICAgICAgICAgICAgICAgaWYgKCFzb3J0ZWROb2Rlcy5nZXQoaSkuZG9uZSkgeworICAgICAgICAgICAgICAgICAgICBhbGxEb25lID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChhbGxEb25lKSB7CisgICAgICAgICAgICAgICAgLy8gSWYgdGhpcyB3YXMgdGhlIGxhc3QgY2hpbGQgYW5pbWF0aW9uIHRvIGVuZCwgdGhlbiBub3RpZnkgbGlzdGVuZXJzIHRoYXQgdGhpcworICAgICAgICAgICAgICAgIC8vIHNlcXVlbmNlciBoYXMgZW5kZWQKKyAgICAgICAgICAgICAgICBpZiAobUxpc3RlbmVycyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIEFycmF5TGlzdDxBbmltYXRhYmxlTGlzdGVuZXI+IHRtcExpc3RlbmVycyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEFycmF5TGlzdDxBbmltYXRhYmxlTGlzdGVuZXI+KSBtTGlzdGVuZXJzLmNsb25lKCk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoQW5pbWF0YWJsZUxpc3RlbmVyIGxpc3RlbmVyIDogdG1wTGlzdGVuZXJzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lci5vbkFuaW1hdGlvbkVuZChtU2VxdWVuY2VyKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIE5vdGhpbmcgdG8gZG8KKyAgICAgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25SZXBlYXQoQW5pbWF0YWJsZSBhbmltYXRpb24pIHsKKyAgICAgICAgfQorCisgICAgICAgIC8vIE5vdGhpbmcgdG8gZG8KKyAgICAgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25TdGFydChBbmltYXRhYmxlIGFuaW1hdGlvbikgeworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCBzb3J0cyB0aGUgY3VycmVudCBzZXQgb2Ygbm9kZXMsIGlmIG5lZWRlZC4gVGhlIHNvcnQgaXMgYSBzaW1wbGUKKyAgICAgKiBEZXBlbmRlbmN5R3JhcGggc29ydCwgd2hpY2ggZ29lcyBsaWtlIHRoaXM6CisgICAgICogLSBBbGwgbm9kZXMgd2l0aG91dCBkZXBlbmRlbmNpZXMgYmVjb21lICdyb290cycKKyAgICAgKiAtIHdoaWxlIHJvb3RzIGxpc3QgaXMgbm90IG51bGwKKyAgICAgKiAtICAgZm9yIGVhY2ggcm9vdCByCisgICAgICogLSAgICAgYWRkIHIgdG8gc29ydGVkIGxpc3QKKyAgICAgKiAtICAgICByZW1vdmUgciBhcyBhIGRlcGVuZGVuY3kgZnJvbSBhbnkgb3RoZXIgbm9kZQorICAgICAqIC0gICBhbnkgbm9kZXMgd2l0aCBubyBkZXBlbmRlbmNpZXMgYXJlIGFkZGVkIHRvIHRoZSByb290cyBsaXN0CisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHNvcnROb2RlcygpIHsKKyAgICAgICAgaWYgKG1OZWVkc1NvcnQpIHsKKyAgICAgICAgICAgIG1Tb3J0ZWROb2Rlcy5jbGVhcigpOworICAgICAgICAgICAgQXJyYXlMaXN0PE5vZGU+IHJvb3RzID0gbmV3IEFycmF5TGlzdDxOb2RlPigpOworICAgICAgICAgICAgZm9yIChOb2RlIG5vZGUgOiBtTm9kZXMpIHsKKyAgICAgICAgICAgICAgICBpZiAobm9kZS5kZXBlbmRlbmNpZXMgPT0gbnVsbCB8fCBub2RlLmRlcGVuZGVuY2llcy5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICByb290cy5hZGQobm9kZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgQXJyYXlMaXN0PE5vZGU+IHRtcFJvb3RzID0gbmV3IEFycmF5TGlzdDxOb2RlPigpOworICAgICAgICAgICAgd2hpbGUgKHJvb3RzLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgICAgICBmb3IgKE5vZGUgcm9vdCA6IHJvb3RzKSB7CisgICAgICAgICAgICAgICAgICAgIG1Tb3J0ZWROb2Rlcy5hZGQocm9vdCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChyb290Lm5vZGVEZXBlbmRlbnRzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoTm9kZSBub2RlIDogcm9vdC5ub2RlRGVwZW5kZW50cykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUubm9kZURlcGVuZGVuY2llcy5yZW1vdmUocm9vdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUubm9kZURlcGVuZGVuY2llcy5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXBSb290cy5hZGQobm9kZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJvb3RzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgcm9vdHMuYWRkQWxsKHRtcFJvb3RzKTsKKyAgICAgICAgICAgICAgICB0bXBSb290cy5jbGVhcigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbU5lZWRzU29ydCA9IGZhbHNlOworICAgICAgICAgICAgaWYgKG1Tb3J0ZWROb2Rlcy5zaXplKCkgIT0gbU5vZGVzLnNpemUoKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkNpcmN1bGFyIGRlcGVuZGVuY2llcyBjYW5ub3QgZXhpc3QiCisgICAgICAgICAgICAgICAgICAgICAgICArICIgaW4gU2VxdWVuY2VyIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBEb2Vzbid0IG5lZWQgc29ydGluZywgYnV0IHN0aWxsIG5lZWQgdG8gYWRkIGluIHRoZSBub2RlRGVwZW5kZW5jaWVzIGxpc3QKKyAgICAgICAgICAgIC8vIGJlY2F1c2UgdGhlc2UgZ2V0IHJlbW92ZWQgYXMgdGhlIGV2ZW50IGxpc3RlbmVycyBmaXJlIGFuZCB0aGUgZGVwZW5kZW5jaWVzCisgICAgICAgICAgICAvLyBhcmUgc2F0aXNmaWVkCisgICAgICAgICAgICBmb3IgKE5vZGUgbm9kZSA6IG1Ob2RlcykgeworICAgICAgICAgICAgICAgIGlmIChub2RlLmRlcGVuZGVuY2llcyAhPSBudWxsICYmIG5vZGUuZGVwZW5kZW5jaWVzLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChEZXBlbmRlbmN5IGRlcGVuZGVuY3kgOiBub2RlLmRlcGVuZGVuY2llcykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUubm9kZURlcGVuZGVuY2llcyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5ub2RlRGVwZW5kZW5jaWVzID0gbmV3IEFycmF5TGlzdDxOb2RlPigpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFub2RlLm5vZGVEZXBlbmRlbmNpZXMuY29udGFpbnMoZGVwZW5kZW5jeS5ub2RlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUubm9kZURlcGVuZGVuY2llcy5hZGQoZGVwZW5kZW5jeS5ub2RlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBub2RlLmRvbmUgPSBmYWxzZTsgLy8gYWxzbyByZXNldCBkb25lIGZsYWcKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIERlcGVuZGVuY3kgaG9sZHMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG5vZGUgdGhhdCBzb21lIG90aGVyIG5vZGUgaXMKKyAgICAgKiBkZXBlbmRlbnQgdXBvbiBhbmQgdGhlIG5hdHVyZSBvZiB0aGF0IGRlcGVuZGVuY3kuCisgICAgICoKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBEZXBlbmRlbmN5IHsKKyAgICAgICAgc3RhdGljIGZpbmFsIGludCBXSVRIID0gMDsgLy8gZGVwZW5kZW50IG5vZGUgbXVzdCBzdGFydCB3aXRoIHRoaXMgZGVwZW5kZW5jeSBub2RlCisgICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgQUZURVIgPSAxOyAvLyBkZXBlbmRlbnQgbm9kZSBtdXN0IHN0YXJ0IHdoZW4gdGhpcyBkZXBlbmRlbmN5IG5vZGUgZmluaXNoZXMKKworICAgICAgICAvLyBUaGUgbm9kZSB0aGF0IHRoZSBvdGhlciBub2RlIHdpdGggdGhpcyBEZXBlbmRlbmN5IGlzIGRlcGVuZGVudCB1cG9uCisgICAgICAgIHB1YmxpYyBOb2RlIG5vZGU7CisKKyAgICAgICAgLy8gVGhlIG5hdHVyZSBvZiB0aGUgZGVwZW5kZW5jeSAoV0lUSCBvciBBRlRFUikKKyAgICAgICAgcHVibGljIGludCBydWxlOworCisgICAgICAgIHB1YmxpYyBEZXBlbmRlbmN5KE5vZGUgbm9kZSwgaW50IHJ1bGUpIHsKKyAgICAgICAgICAgIHRoaXMubm9kZSA9IG5vZGU7CisgICAgICAgICAgICB0aGlzLnJ1bGUgPSBydWxlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQSBOb2RlIGlzIGFuIGVtYm9kaW1lbnQgb2YgYm90aCB0aGUgQW5pbWF0YWJsZSB0aGF0IGl0IHdyYXBzIGFzIHdlbGwgYXMKKyAgICAgKiBhbnkgZGVwZW5kZW5jaWVzIHRoYXQgYXJlIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEFuaW1hdGlvbi4gVGhpcyBpbmNsdWRlcworICAgICAqIGJvdGggZGVwZW5kZW5jaWVzIHVwb24gb3RoZXIgbm9kZXMgKGluIHRoZSBkZXBlbmRlbmNpZXMgbGlzdCkgYXMKKyAgICAgKiB3ZWxsIGFzIGRlcGVuZGVuY2llcyBvZiBvdGhlciBub2RlcyB1cG9uIHRoaXMgKGluIHRoZSBub2RlRGVwZW5kZW50cyBsaXN0KS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBOb2RlIGltcGxlbWVudHMgQ2xvbmVhYmxlIHsKKyAgICAgICAgcHVibGljIEFuaW1hdGFibGUgYW5pbWF0aW9uOworCisgICAgICAgIC8qKgorICAgICAgICAgKiAgVGhlc2UgYXJlIHRoZSBkZXBlbmRlbmNpZXMgdGhhdCB0aGlzIG5vZGUncyBhbmltYXRpb24gaGFzIG9uIG90aGVyCisgICAgICAgICAqICBub2Rlcy4gRm9yIGV4YW1wbGUsIGlmIHRoaXMgbm9kZSdzIGFuaW1hdGlvbiBzaG91bGQgYmVnaW4gd2l0aCBzb21lCisgICAgICAgICAqICBvdGhlciBhbmltYXRpb24gZW5kcywgdGhlbiB0aGVyZSB3aWxsIGJlIGFuIGl0ZW0gaW4gdGhpcyBub2RlJ3MKKyAgICAgICAgICogIGRlcGVuZGVuY2llcyBsaXN0IGZvciB0aGF0IG90aGVyIGFuaW1hdGlvbidzIG5vZGUuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQXJyYXlMaXN0PERlcGVuZGVuY3k+IGRlcGVuZGVuY2llcyA9IG51bGw7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIHRtcERlcGVuZGVuY2llcyBpcyBhIHJ1bnRpbWUgZGV0YWlsLiBXZSB1c2UgdGhlIGRlcGVuZGVuY2llcyBsaXN0IGZvciBzb3J0aW5nLgorICAgICAgICAgKiBCdXQgd2UgYWxzbyB1c2UgdGhlIGxpc3QgdG8ga2VlcCB0cmFjayBvZiB3aGVuIG11bHRpcGxlIGRlcGVuZGVuY2llcyBhcmUgc2F0aXNmaWVkLAorICAgICAgICAgKiBidXQgcmVtb3ZpbmcgZWFjaCBkZXBlbmRlbmN5IGFzIGl0IGlzIHNhdGlzZmllZC4gV2UgZG8gbm90IHdhbnQgdG8gcmVtb3ZlCisgICAgICAgICAqIHRoZSBkZXBlbmRlbmN5IGl0c2VsZiBmcm9tIHRoZSBsaXN0LCBiZWNhdXNlIHdlIG5lZWQgdG8gcmV0YWluIHRoYXQgaW5mb3JtYXRpb24KKyAgICAgICAgICogaWYgdGhlIHNlcXVlbmNlciBpcyBsYXVuY2hlZCBpbiB0aGUgZnV0dXJlLiBTbyB3ZSBjcmVhdGUgYSBjb3B5IG9mIHRoZSBkZXBlbmRlbmN5CisgICAgICAgICAqIGxpc3Qgd2hlbiB0aGUgc2VxdWVuY2VyIHN0YXJ0cyBhbmQgdXNlIHRoaXMgdG1wRGVwZW5kZW5jaWVzIGxpc3QgdG8gdHJhY2sgdGhlCisgICAgICAgICAqIGxpc3Qgb2Ygc2F0aXNmaWVkIGRlcGVuZGVuY2llcy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBBcnJheUxpc3Q8RGVwZW5kZW5jeT4gdG1wRGVwZW5kZW5jaWVzID0gbnVsbDsKKworICAgICAgICAvKioKKyAgICAgICAgICogbm9kZURlcGVuZGVuY2llcyBpcyBqdXN0IGEgbGlzdCBvZiB0aGUgbm9kZXMgdGhhdCB0aGlzIE5vZGUgaXMgZGVwZW5kZW50IHVwb24uCisgICAgICAgICAqIFRoaXMgaW5mb3JtYXRpb24gaXMgdXNlZCBpbiBzb3J0Tm9kZXMoKSwgdG8gZGV0ZXJtaW5lIHdoZW4gYSBub2RlIGlzIGEgcm9vdC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBBcnJheUxpc3Q8Tm9kZT4gbm9kZURlcGVuZGVuY2llcyA9IG51bGw7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIG5vZGVEZXBkZW5kZW50cyBpcyB0aGUgbGlzdCBvZiBub2RlcyB0aGF0IGhhdmUgdGhpcyBub2RlIGFzIGEgZGVwZW5kZW5jeS4gVGhpcworICAgICAgICAgKiBpcyBhIHV0aWxpdHkgZmllbGQgdXNlZCBpbiBzb3J0Tm9kZXMgdG8gZmFjaWxpdGF0ZSByZW1vdmluZyB0aGlzIG5vZGUgYXMgYQorICAgICAgICAgKiBkZXBlbmRlbmN5IHdoZW4gaXQgaXMgYSByb290IG5vZGUuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQXJyYXlMaXN0PE5vZGU+IG5vZGVEZXBlbmRlbnRzID0gbnVsbDsKKworICAgICAgICAvKioKKyAgICAgICAgICogRmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGFuaW1hdGlvbiBpbiB0aGlzIG5vZGUgaXMgZmluaXNoZWQuIFRoaXMgZmxhZworICAgICAgICAgKiBpcyB1c2VkIGJ5IFNlcXVlbmNlciB0byBjaGVjaywgYXMgZWFjaCBhbmltYXRpb24gZW5kcywgd2hldGhlciBhbGwgY2hpbGQgYW5pbWF0aW9ucworICAgICAgICAgKiBhcmUgZG9uZSBhbmQgaXQncyB0aW1lIHRvIHNlbmQgb3V0IGFuIGVuZCBldmVudCBmb3IgdGhlIGVudGlyZSBTZXF1ZW5jZXIuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYm9vbGVhbiBkb25lID0gZmFsc2U7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENvbnN0cnVjdHMgdGhlIE5vZGUgd2l0aCB0aGUgYW5pbWF0aW9uIHRoYXQgaXQgZW5jYXBzdWxhdGVzLiBBIE5vZGUgaGFzIG5vCisgICAgICAgICAqIGRlcGVuZGVuY2llcyBieSBkZWZhdWx0OyBkZXBlbmRlbmNpZXMgYXJlIGFkZGVkIHZpYSB0aGUgYWRkRGVwZW5kZW5jeSgpCisgICAgICAgICAqIG1ldGhvZC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGFuaW1hdGlvbiBUaGUgYW5pbWF0aW9uIHRoYXQgdGhlIE5vZGUgZW5jYXBzdWxhdGVzLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIE5vZGUoQW5pbWF0YWJsZSBhbmltYXRpb24pIHsKKyAgICAgICAgICAgIHRoaXMuYW5pbWF0aW9uID0gYW5pbWF0aW9uOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFkZCBhIGRlcGVuZGVuY3kgdG8gdGhpcyBOb2RlLiBUaGUgZGVwZW5kZW5jeSBpbmNsdWRlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUKKyAgICAgICAgICogbm9kZSB0aGF0IHRoaXMgbm9kZSBpcyBkZXBlbmRlbmN5IHVwb24gYW5kIHRoZSBuYXR1cmUgb2YgdGhlIGRlcGVuZGVuY3kuCisgICAgICAgICAqIEBwYXJhbSBkZXBlbmRlbmN5CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBhZGREZXBlbmRlbmN5KERlcGVuZGVuY3kgZGVwZW5kZW5jeSkgeworICAgICAgICAgICAgaWYgKGRlcGVuZGVuY2llcyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgZGVwZW5kZW5jaWVzID0gbmV3IEFycmF5TGlzdDxEZXBlbmRlbmN5PigpOworICAgICAgICAgICAgICAgIG5vZGVEZXBlbmRlbmNpZXMgPSBuZXcgQXJyYXlMaXN0PE5vZGU+KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZXBlbmRlbmNpZXMuYWRkKGRlcGVuZGVuY3kpOworICAgICAgICAgICAgaWYgKCFub2RlRGVwZW5kZW5jaWVzLmNvbnRhaW5zKGRlcGVuZGVuY3kubm9kZSkpIHsKKyAgICAgICAgICAgICAgICBub2RlRGVwZW5kZW5jaWVzLmFkZChkZXBlbmRlbmN5Lm5vZGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgTm9kZSBkZXBlbmRlbmN5Tm9kZSA9IGRlcGVuZGVuY3kubm9kZTsKKyAgICAgICAgICAgIGlmIChkZXBlbmRlbmN5Tm9kZS5ub2RlRGVwZW5kZW50cyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgZGVwZW5kZW5jeU5vZGUubm9kZURlcGVuZGVudHMgPSBuZXcgQXJyYXlMaXN0PE5vZGU+KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZXBlbmRlbmN5Tm9kZS5ub2RlRGVwZW5kZW50cy5hZGQodGhpcyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIE5vZGUgY2xvbmUoKSB0aHJvd3MgQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24geworICAgICAgICAgICAgTm9kZSBub2RlID0gKE5vZGUpIHN1cGVyLmNsb25lKCk7CisgICAgICAgICAgICBub2RlLmFuaW1hdGlvbiA9IChBbmltYXRhYmxlKSBhbmltYXRpb24uY2xvbmUoKTsKKyAgICAgICAgICAgIHJldHVybiBub2RlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIDxjb2RlPkJ1aWxkZXI8L2NvZGU+IG9iamVjdCBpcyBhIHV0aWxpdHkgY2xhc3MgdG8gZmFjaWxpdGF0ZSBhZGRpbmcgYW5pbWF0aW9ucyB0byBhCisgICAgICogPGNvZGU+U2VxdWVuY2VyPC9jb2RlPiBhbG9uZyB3aXRoIHRoZSByZWxhdGlvbnNoaXBzIGJldHdlZW4gdGhlIHZhcmlvdXMgYW5pbWF0aW9ucy4gVGhlCisgICAgICogaW50ZW50aW9uIG9mIHRoZSA8Y29kZT5CdWlsZGVyPC9jb2RlPiBtZXRob2RzLCBhbG9uZyB3aXRoIHRoZSB7QGxpbmsKKyAgICAgKiBTZXF1ZW5jZXIjcGxheShBbmltYXRhYmxlKSBwbGF5KCl9IG1ldGhvZCBvZiA8Y29kZT5TZXF1ZW5jZXI8L2NvZGU+IGlzIHRvIG1ha2UgaXQgcG9zc2libGUgdG8KKyAgICAgKiBleHByZXNzIHRoZSBkZXBlbmRlbmN5IHJlbGF0aW9uc2hpcHMgb2YgYW5pbWF0aW9ucyBpbiBhIG5hdHVyYWwgd2F5LiBEZXZlbG9wZXJzIGNhbiBhbHNvIHVzZQorICAgICAqIHRoZSB7QGxpbmsgU2VxdWVuY2VyI3BsYXlUb2dldGhlcihBbmltYXRhYmxlW10pIHBsYXlUb2dldGhlcigpfSBhbmQge0BsaW5rCisgICAgICogU2VxdWVuY2VyI3BsYXlTZXF1ZW50aWFsbHkoQW5pbWF0YWJsZVtdKSBwbGF5U2VxdWVudGlhbGx5KCl9IG1ldGhvZHMgaWYgdGhlc2Ugc3VpdCB0aGUgbmVlZCwKKyAgICAgKiBidXQgaXQgbWlnaHQgYmUgZWFzaWVyIGluIHNvbWUgc2l0dWF0aW9ucyB0byBleHByZXNzIHRoZSBzZXF1ZW5jZSBvZiBhbmltYXRpb25zIGluIHBhaXJzLgorICAgICAqIDxwLz4KKyAgICAgKiA8cD5UaGUgPGNvZGU+QnVpbGRlcjwvY29kZT4gb2JqZWN0IGNhbm5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSwgYnV0IGlzIHJhdGhlciBjb25zdHJ1Y3RlZAorICAgICAqIGludGVybmFsbHkgdmlhIGEgY2FsbCB0byB7QGxpbmsgU2VxdWVuY2VyI3BsYXkoQW5pbWF0YWJsZSl9LjwvcD4KKyAgICAgKiA8cC8+CisgICAgICogPHA+Rm9yIGV4YW1wbGUsIHRoaXMgc2V0cyB1cCBhIFNlcXVlbmNlciB0byBwbGF5IGFuaW0xIGFuZCBhbmltMiBhdCB0aGUgc2FtZSB0aW1lLCBhbmltMyB0bworICAgICAqIHBsYXkgd2hlbiBhbmltMiBmaW5pc2hlcywgYW5kIGFuaW00IHRvIHBsYXkgd2hlbiBhbmltMyBmaW5pc2hlczo8L3A+CisgICAgICogPHByZT4KKyAgICAgKiAgICAgU2VxdWVuY2VyIHMgPSBuZXcgU2VxdWVuY2VyKCk7CisgICAgICogICAgIHMucGxheShhbmltMSkud2l0aChhbmltMik7CisgICAgICogICAgIHMucGxheShhbmltMikuYmVmb3JlKGFuaW0zKTsKKyAgICAgKiAgICAgcy5wbGF5KGFuaW00KS5hZnRlcihhbmltMyk7CisgICAgICogPC9wcmU+CisgICAgICogPHAvPgorICAgICAqIDxwPk5vdGUgaW4gdGhlIGV4YW1wbGUgdGhhdCBib3RoIHtAbGluayBCdWlsZGVyI2JlZm9yZShBbmltYXRhYmxlKX0gYW5kIHtAbGluaworICAgICAqIEJ1aWxkZXIjYWZ0ZXIoQW5pbWF0YWJsZSl9IGFyZSB1c2VkLiBUaGVzZSBhcmUganVzdCBkaWZmZXJlbnQgd2F5cyBvZiBleHByZXNzaW5nIHRoZSBzYW1lCisgICAgICogcmVsYXRpb25zaGlwIGFuZCBhcmUgcHJvdmlkZWQgdG8gbWFrZSBpdCBlYXNpZXIgdG8gc2F5IHRoaW5ncyBpbiBhIHdheSB0aGF0IGlzIG1vcmUgbmF0dXJhbCwKKyAgICAgKiBkZXBlbmRpbmcgb24gdGhlIHNpdHVhdGlvbi48L3A+CisgICAgICogPHAvPgorICAgICAqIDxwPkl0IGlzIHBvc3NpYmxlIHRvIG1ha2Ugc2V2ZXJhbCBjYWxscyBpbnRvIHRoZSBzYW1lIDxjb2RlPkJ1aWxkZXI8L2NvZGU+IG9iamVjdCB0byBleHByZXNzCisgICAgICogbXVsdGlwbGUgcmVsYXRpb25zaGlwcy4gSG93ZXZlciwgbm90ZSB0aGF0IGl0IGlzIG9ubHkgdGhlIGFuaW1hdGlvbiBwYXNzZWQgaW50byB0aGUgaW5pdGlhbAorICAgICAqIHtAbGluayBTZXF1ZW5jZXIjcGxheShBbmltYXRhYmxlKX0gbWV0aG9kIHRoYXQgaXMgdGhlIGRlcGVuZGVuY3kgaW4gYW55IG9mIHRoZSBzdWNjZXNzaXZlCisgICAgICogY2FsbHMgdG8gdGhlIDxjb2RlPkJ1aWxkZXI8L2NvZGU+IG9iamVjdC4gRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgY29kZSBzdGFydHMgYm90aCBhbmltMgorICAgICAqIGFuZCBhbmltMyB3aGVuIGFuaW0xIGVuZHM7IHRoZXJlIGlzIG5vIGRpcmVjdCBkZXBlbmRlbmN5IHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGFuaW0yIGFuZAorICAgICAqIGFuaW0zOgorICAgICAqIDxwcmU+CisgICAgICogICBTZXF1ZW5jZXIgcyA9IG5ldyBTZXF1ZW5jZXIoKTsKKyAgICAgKiAgIHMucGxheShhbmltMSkuYmVmb3JlKGFuaW0yKS5iZWZvcmUoYW5pbTMpOworICAgICAqIDwvcHJlPgorICAgICAqIElmIHRoZSBkZXNpcmVkIHJlc3VsdCBpcyB0byBwbGF5IGFuaW0xIHRoZW4gYW5pbTIgdGhlbiBhbmltMywgdGhpcyBjb2RlIGV4cHJlc3NlcyB0aGUKKyAgICAgKiByZWxhdGlvbnNoaXAgY29ycmVjdGx5OjwvcD4KKyAgICAgKiA8cHJlPgorICAgICAqICAgU2VxdWVuY2VyIHMgPSBuZXcgU2VxdWVuY2VyKCk7CisgICAgICogICBzLnBsYXkoYW5pbTEpLmJlZm9yZShhbmltMik7CisgICAgICogICBzLnBsYXkoYW5pbTIpLmJlZm9yZShhbmltMyk7CisgICAgICogPC9wcmU+CisgICAgICogPHAvPgorICAgICAqIDxwPk5vdGUgdGhhdCBpdCBpcyBwb3NzaWJsZSB0byBleHByZXNzIHJlbGF0aW9uc2hpcHMgdGhhdCBjYW5ub3QgYmUgcmVzb2x2ZWQgYW5kIHdpbGwgbm90CisgICAgICogcmVzdWx0IGluIHNlbnNpYmxlIHJlc3VsdHMuIEZvciBleGFtcGxlLCA8Y29kZT5wbGF5KGFuaW0xKS5hZnRlcihhbmltMSk8L2NvZGU+IG1ha2VzIG5vCisgICAgICogc2Vuc2UuIEluIGdlbmVyYWwsIGNpcmN1bGFyIGRlcGVuZGVuY2llcyBsaWtlIHRoaXMgb25lIChvciBtb3JlIGluZGlyZWN0IG9uZXMgd2hlcmUgYSBkZXBlbmRzCisgICAgICogb24gYiwgd2hpY2ggZGVwZW5kcyBvbiBjLCB3aGljaCBkZXBlbmRzIG9uIGEpIHNob3VsZCBiZSBhdm9pZGVkLiBPbmx5IGNyZWF0ZSBzZXF1ZW5jZXMgdGhhdAorICAgICAqIGNhbiBib2lsIGRvd24gdG8gYSBzaW1wbGUsIG9uZS13YXkgcmVsYXRpb25zaGlwIG9mIGFuaW1hdGlvbnMgc3RhcnRpbmcgd2l0aCwgYmVmb3JlLCBhbmQKKyAgICAgKiBhZnRlciBvdGhlciwgZGlmZmVyZW50LCBhbmltYXRpb25zLjwvcD4KKyAgICAgKi8KKyAgICBwdWJsaWMgY2xhc3MgQnVpbGRlciB7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoaXMgdHJhY2tzIHRoZSBjdXJyZW50IG5vZGUgYmVpbmcgcHJvY2Vzc2VkLiBJdCBpcyBzdXBwbGllZCB0byB0aGUgcGxheSgpIG1ldGhvZAorICAgICAgICAgKiBvZiBTZXF1ZW5jZXIgYW5kIHBhc3NlZCBpbnRvIHRoZSBjb25zdHJ1Y3RvciBvZiBCdWlsZGVyLgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBOb2RlIG1DdXJyZW50Tm9kZTsKKworICAgICAgICAvKioKKyAgICAgICAgICogcGFja2FnZS1wcml2YXRlIGNvbnN0cnVjdG9yLiBCdWlsZGVycyBhcmUgb25seSBjb25zdHJ1Y3RlZCBieSBTZXF1ZW5jZXIsIHdoZW4gdGhlCisgICAgICAgICAqIHBsYXkoKSBtZXRob2QgaXMgY2FsbGVkLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gYW5pbSBUaGUgYW5pbWF0aW9uIHRoYXQgaXMgdGhlIGRlcGVuZGVuY3kgZm9yIHRoZSBvdGhlciBhbmltYXRpb25zIHBhc3NlZCBpbnRvCisgICAgICAgICAqIHRoZSBvdGhlciBtZXRob2RzIG9mIHRoaXMgQnVpbGRlciBvYmplY3QuCisgICAgICAgICAqLworICAgICAgICBCdWlsZGVyKEFuaW1hdGFibGUgYW5pbSkgeworICAgICAgICAgICAgbUN1cnJlbnROb2RlID0gbU5vZGVNYXAuZ2V0KGFuaW0pOworICAgICAgICAgICAgaWYgKG1DdXJyZW50Tm9kZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUN1cnJlbnROb2RlID0gbmV3IE5vZGUoYW5pbSk7CisgICAgICAgICAgICAgICAgbU5vZGVNYXAucHV0KGFuaW0sIG1DdXJyZW50Tm9kZSk7CisgICAgICAgICAgICAgICAgbU5vZGVzLmFkZChtQ3VycmVudE5vZGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldHMgdXAgdGhlIGdpdmVuIGFuaW1hdGlvbiB0byBwbGF5IGF0IHRoZSBzYW1lIHRpbWUgYXMgdGhlIGFuaW1hdGlvbiBzdXBwbGllZCBpbiB0aGUKKyAgICAgICAgICoge0BsaW5rIFNlcXVlbmNlciNwbGF5KEFuaW1hdGFibGUpfSBjYWxsIHRoYXQgY3JlYXRlZCB0aGlzIDxjb2RlPkJ1aWxkZXI8L2NvZGU+IG9iamVjdC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGFuaW0gVGhlIGFuaW1hdGlvbiB0aGF0IHdpbGwgcGxheSB3aGVuIHRoZSBhbmltYXRpb24gc3VwcGxpZWQgdG8gdGhlCisgICAgICAgICAqIHtAbGluayBTZXF1ZW5jZXIjcGxheShBbmltYXRhYmxlKX0gbWV0aG9kIHN0YXJ0cy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHdpdGgoQW5pbWF0YWJsZSBhbmltKSB7CisgICAgICAgICAgICBOb2RlIG5vZGUgPSBtTm9kZU1hcC5nZXQoYW5pbSk7CisgICAgICAgICAgICBpZiAobm9kZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbm9kZSA9IG5ldyBOb2RlKGFuaW0pOworICAgICAgICAgICAgICAgIG1Ob2RlTWFwLnB1dChhbmltLCBub2RlKTsKKyAgICAgICAgICAgICAgICBtTm9kZXMuYWRkKG5vZGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRGVwZW5kZW5jeSBkZXBlbmRlbmN5ID0gbmV3IERlcGVuZGVuY3kobUN1cnJlbnROb2RlLCBEZXBlbmRlbmN5LldJVEgpOworICAgICAgICAgICAgbm9kZS5hZGREZXBlbmRlbmN5KGRlcGVuZGVuY3kpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldHMgdXAgdGhlIGdpdmVuIGFuaW1hdGlvbiB0byBwbGF5IHdoZW4gdGhlIGFuaW1hdGlvbiBzdXBwbGllZCBpbiB0aGUKKyAgICAgICAgICoge0BsaW5rIFNlcXVlbmNlciNwbGF5KEFuaW1hdGFibGUpfSBjYWxsIHRoYXQgY3JlYXRlZCB0aGlzIDxjb2RlPkJ1aWxkZXI8L2NvZGU+IG9iamVjdAorICAgICAgICAgKiBlbmRzLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gYW5pbSBUaGUgYW5pbWF0aW9uIHRoYXQgd2lsbCBwbGF5IHdoZW4gdGhlIGFuaW1hdGlvbiBzdXBwbGllZCB0byB0aGUKKyAgICAgICAgICoge0BsaW5rIFNlcXVlbmNlciNwbGF5KEFuaW1hdGFibGUpfSBtZXRob2QgZW5kcy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIGJlZm9yZShBbmltYXRhYmxlIGFuaW0pIHsKKyAgICAgICAgICAgIE5vZGUgbm9kZSA9IG1Ob2RlTWFwLmdldChhbmltKTsKKyAgICAgICAgICAgIGlmIChub2RlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBub2RlID0gbmV3IE5vZGUoYW5pbSk7CisgICAgICAgICAgICAgICAgbU5vZGVNYXAucHV0KGFuaW0sIG5vZGUpOworICAgICAgICAgICAgICAgIG1Ob2Rlcy5hZGQobm9kZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBEZXBlbmRlbmN5IGRlcGVuZGVuY3kgPSBuZXcgRGVwZW5kZW5jeShtQ3VycmVudE5vZGUsIERlcGVuZGVuY3kuQUZURVIpOworICAgICAgICAgICAgbm9kZS5hZGREZXBlbmRlbmN5KGRlcGVuZGVuY3kpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldHMgdXAgdGhlIGdpdmVuIGFuaW1hdGlvbiB0byBwbGF5IHdoZW4gdGhlIGFuaW1hdGlvbiBzdXBwbGllZCBpbiB0aGUKKyAgICAgICAgICoge0BsaW5rIFNlcXVlbmNlciNwbGF5KEFuaW1hdGFibGUpfSBjYWxsIHRoYXQgY3JlYXRlZCB0aGlzIDxjb2RlPkJ1aWxkZXI8L2NvZGU+IG9iamVjdAorICAgICAgICAgKiB0byBzdGFydCB3aGVuIHRoZSBhbmltYXRpb24gc3VwcGxpZWQgaW4gdGhpcyBtZXRob2QgY2FsbCBlbmRzLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gYW5pbSBUaGUgYW5pbWF0aW9uIHdob3NlIGVuZCB3aWxsIGNhdXNlIHRoZSBhbmltYXRpb24gc3VwcGxpZWQgdG8gdGhlCisgICAgICAgICAqIHtAbGluayBTZXF1ZW5jZXIjcGxheShBbmltYXRhYmxlKX0gbWV0aG9kIHRvIHBsYXkuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBhZnRlcihBbmltYXRhYmxlIGFuaW0pIHsKKyAgICAgICAgICAgIE5vZGUgbm9kZSA9IG1Ob2RlTWFwLmdldChhbmltKTsKKyAgICAgICAgICAgIGlmIChub2RlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBub2RlID0gbmV3IE5vZGUoYW5pbSk7CisgICAgICAgICAgICAgICAgbU5vZGVNYXAucHV0KGFuaW0sIG5vZGUpOworICAgICAgICAgICAgICAgIG1Ob2Rlcy5hZGQobm9kZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBEZXBlbmRlbmN5IGRlcGVuZGVuY3kgPSBuZXcgRGVwZW5kZW5jeShub2RlLCBEZXBlbmRlbmN5LkFGVEVSKTsKKyAgICAgICAgICAgIG1DdXJyZW50Tm9kZS5hZGREZXBlbmRlbmN5KGRlcGVuZGVuY3kpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldHMgdXAgdGhlIGFuaW1hdGlvbiBzdXBwbGllZCBpbiB0aGUKKyAgICAgICAgICoge0BsaW5rIFNlcXVlbmNlciNwbGF5KEFuaW1hdGFibGUpfSBjYWxsIHRoYXQgY3JlYXRlZCB0aGlzIDxjb2RlPkJ1aWxkZXI8L2NvZGU+IG9iamVjdAorICAgICAgICAgKiB0byBwbGF5IHdoZW4gdGhlIGdpdmVuIGFtb3VudCBvZiB0aW1lIGVsYXBzZXMuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBkZWxheSBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0aGF0IHNob3VsZCBlbGFwc2UgYmVmb3JlIHRoZQorICAgICAgICAgKiBhbmltYXRpb24gc3RhcnRzLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgYWZ0ZXIobG9uZyBkZWxheSkgeworICAgICAgICAgICAgLy8gc2V0dXAgZHVtbXkgQW5pbWF0b3IganVzdCB0byBydW4gdGhlIGNsb2NrCisgICAgICAgICAgICBhZnRlcihuZXcgQW5pbWF0b3IoZGVsYXksIDBmLCAxZikpOworICAgICAgICB9CisKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9UeXBlRXZhbHVhdG9yLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hbmltYXRpb24vVHlwZUV2YWx1YXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxNTBlMDAKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hbmltYXRpb24vVHlwZUV2YWx1YXRvci5qYXZhCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYW5pbWF0aW9uOworCisvKioKKyAqIEludGVyZmFjZSBmb3IgdXNlIHdpdGggdGhlIHtAbGluayBBbmltYXRvciNzZXRFdmFsdWF0b3IoVHlwZUV2YWx1YXRvcil9IGZ1bmN0aW9uLiBFdmFsdWF0b3JzCisgKiBhbGxvdyBkZXZlbG9wZXJzIHRvIGNyZWF0ZSBhbmltYXRpb25zIG9uIGFyYml0cmFyeSBwcm9wZXJ0eSB0eXBlcywgYnkgYWxsb3dpbmcgdGhlbSB0byBzdXBwbHkKKyAqIGN1c3RvbSBldmF1bGF0b3JzIGZvciB0eXBlcyB0aGF0IGFyZSBub3QgYXV0b21hdGljYWxseSB1bmRlcnN0b29kIGFuZCB1c2VkIGJ5IHRoZSBhbmltYXRpb24KKyAqIHN5c3RlbS4KKyAqCisgKiBAc2VlIEFuaW1hdG9yI3NldEV2YWx1YXRvcihUeXBlRXZhbHVhdG9yKQorICovCitwdWJsaWMgaW50ZXJmYWNlIFR5cGVFdmFsdWF0b3IgeworCisgICAgLyoqCisgICAgICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSByZXN1bHQgb2YgbGluZWFybHkgaW50ZXJwb2xhdGluZyB0aGUgc3RhcnQgYW5kIGVuZCB2YWx1ZXMsIHdpdGgKKyAgICAgKiA8Y29kZT5mcmFjdGlvbjwvY29kZT4gcmVwcmVzZW50aW5nIHRoZSBwcm9wb3J0aW9uIGJldHdlZW4gdGhlIHN0YXJ0IGFuZCBlbmQgdmFsdWVzLiBUaGUKKyAgICAgKiBjYWxjdWxhdGlvbiBpcyBhIHNpbXBsZSBwYXJhbWV0cmljIGNhbGN1bGF0aW9uOiA8Y29kZT5yZXN1bHQgPSB4MCArIHQgKiAodjEgLSB2MCk8L2NvZGU+LAorICAgICAqIHdoZXJlIDxjb2RlPngwPC9jb2RlPiBpcyA8Y29kZT5zdGFydFZhbHVlPC9jb2RlPiwgPGNvZGU+eDE8L2NvZGU+IGlzIDxjb2RlPmVuZFZhbHVlPC9jb2RlPiwKKyAgICAgKiBhbmQgPGNvZGU+dDwvY29kZT4gaXMgPGNvZGU+ZnJhY3Rpb248L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIGZyYWN0aW9uICAgVGhlIGZyYWN0aW9uIGZyb20gdGhlIHN0YXJ0aW5nIHRvIHRoZSBlbmRpbmcgdmFsdWVzCisgICAgICogQHBhcmFtIHN0YXJ0VmFsdWUgVGhlIHN0YXJ0IHZhbHVlLgorICAgICAqIEBwYXJhbSBlbmRWYWx1ZSAgIFRoZSBlbmQgdmFsdWUuCisgICAgICogQHJldHVybiBBIGxpbmVhciBpbnRlcnBvbGF0aW9uIGJldHdlZW4gdGhlIHN0YXJ0IGFuZCBlbmQgdmFsdWVzLCBnaXZlbiB0aGUKKyAgICAgKiAgICAgICAgIDxjb2RlPmZyYWN0aW9uPC9jb2RlPiBwYXJhbWV0ZXIuCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBldmFsdWF0ZShmbG9hdCBmcmFjdGlvbiwgT2JqZWN0IHN0YXJ0VmFsdWUsIE9iamVjdCBlbmRWYWx1ZSk7CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hbmltYXRpb24vcGFja2FnZS5odG1sIGIvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL3BhY2thZ2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjY2NjliCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL3BhY2thZ2UuaHRtbApAQCAtMCwwICsxLDYgQEAKKzxodG1sPgorPGJvZHk+CitQcm92aWRlcyBjbGFzc2VzIGZvciBhbmltYXRpbmcgdmFsdWVzIG92ZXIgdGltZSwgYW5kIHNldHRpbmcgdGhvc2UgdmFsdWVzIG9uIHRhcmdldAorb2JqZWN0cy4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9BY3Rpb25CYXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9BY3Rpb25CYXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODA4NmYwCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FjdGlvbkJhci5qYXZhCkBAIC0wLDAgKzEsNDk4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmFwcDsKKworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvdzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5TcGlubmVyQWRhcHRlcjsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBwdWJsaWMgaW50ZXJmYWNlIHRvIHRoZSBjb250ZXh0dWFsIEFjdGlvbkJhci4KKyAqIFRoZSBBY3Rpb25CYXIgYWN0cyBhcyBhIHJlcGxhY2VtZW50IGZvciB0aGUgdGl0bGUgYmFyIGluIEFjdGl2aXRpZXMuCisgKiBJdCBwcm92aWRlcyBmYWNpbGl0aWVzIGZvciBjcmVhdGluZyB0b29sYmFyIGFjdGlvbnMgYXMgd2VsbCBhcworICogbWV0aG9kcyBvZiBuYXZpZ2F0aW5nIGFyb3VuZCBhbiBhcHBsaWNhdGlvbi4gCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBY3Rpb25CYXIgeworICAgIC8qKgorICAgICAqIFN0YW5kYXJkIG5hdmlnYXRpb24gbW9kZS4gQ29uc2lzdHMgb2YgZWl0aGVyIGEgbG9nbyBvciBpY29uCisgICAgICogYW5kIHRpdGxlIHRleHQgd2l0aCBhbiBvcHRpb25hbCBzdWJ0aXRsZS4gQ2xpY2tpbmcgYW55IG9mIHRoZXNlIGVsZW1lbnRzCisgICAgICogd2lsbCBkaXNwYXRjaCBvbkFjdGlvbkl0ZW1TZWxlY3RlZCB0byB0aGUgcmVnaXN0ZXJlZCBDYWxsYmFjayB3aXRoCisgICAgICogYSBNZW51SXRlbSB3aXRoIGl0ZW0gSUQgYW5kcm9pZC5SLmlkLmhvbWUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTkFWSUdBVElPTl9NT0RFX1NUQU5EQVJEID0gMDsKKyAgICAKKyAgICAvKioKKyAgICAgKiBEcm9wZG93biBsaXN0IG5hdmlnYXRpb24gbW9kZS4gSW5zdGVhZCBvZiBzdGF0aWMgdGl0bGUgdGV4dCB0aGlzIG1vZGUKKyAgICAgKiBwcmVzZW50cyBhIGRyb3Bkb3duIG1lbnUgZm9yIG5hdmlnYXRpb24gd2l0aGluIHRoZSBhY3Rpdml0eS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOQVZJR0FUSU9OX01PREVfRFJPUERPV05fTElTVCA9IDE7CisgICAgCisgICAgLyoqCisgICAgICogVGFiIG5hdmlnYXRpb24gbW9kZS4gSW5zdGVhZCBvZiBzdGF0aWMgdGl0bGUgdGV4dCB0aGlzIG1vZGUKKyAgICAgKiBwcmVzZW50cyBhIHNlcmllcyBvZiB0YWJzIGZvciBuYXZpZ2F0aW9uIHdpdGhpbiB0aGUgYWN0aXZpdHkuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTkFWSUdBVElPTl9NT0RFX1RBQlMgPSAyOworICAgIAorICAgIC8qKgorICAgICAqIEN1c3RvbSBuYXZpZ2F0aW9uIG1vZGUuIFRoaXMgbmF2aWdhdGlvbiBtb2RlIGlzIHNldCBpbXBsaWNpdGx5IHdoZW5ldmVyCisgICAgICogYSBjdXN0b20gbmF2aWdhdGlvbiB2aWV3IGlzIHNldC4gU2VlIHtAbGluayAjc2V0Q3VzdG9tTmF2aWdhdGlvbk1vZGUoVmlldyl9LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5BVklHQVRJT05fTU9ERV9DVVNUT00gPSAzOworCisgICAgLyoqCisgICAgICogVXNlIGxvZ28gaW5zdGVhZCBvZiBpY29uIGlmIGF2YWlsYWJsZS4gVGhpcyBmbGFnIHdpbGwgY2F1c2UgYXBwcm9wcmlhdGUKKyAgICAgKiBuYXZpZ2F0aW9uIG1vZGVzIHRvIHVzZSBhIHdpZGVyIGxvZ28gaW4gcGxhY2Ugb2YgdGhlIHN0YW5kYXJkIGljb24uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElTUExBWV9VU0VfTE9HTyA9IDB4MTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBIaWRlICdob21lJyBlbGVtZW50cyBpbiB0aGlzIGFjdGlvbiBiYXIsIGxlYXZpbmcgbW9yZSBzcGFjZSBmb3Igb3RoZXIKKyAgICAgKiBuYXZpZ2F0aW9uIGVsZW1lbnRzLiBUaGlzIGluY2x1ZGVzIGxvZ28gYW5kIGljb24uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElTUExBWV9ISURFX0hPTUUgPSAweDI7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGFjdGlvbiBiYXIgaW50byBjdXN0b20gbmF2aWdhdGlvbiBtb2RlLCBzdXBwbHlpbmcgYSB2aWV3CisgICAgICogZm9yIGN1c3RvbSBuYXZpZ2F0aW9uLgorICAgICAqIAorICAgICAqIEN1c3RvbSBuYXZpZ2F0aW9uIHZpZXdzIGFwcGVhciBiZXR3ZWVuIHRoZSBhcHBsaWNhdGlvbiBpY29uIGFuZAorICAgICAqIGFueSBhY3Rpb24gYnV0dG9ucyBhbmQgbWF5IHVzZSBhbnkgc3BhY2UgYXZhaWxhYmxlIHRoZXJlLiBDb21tb24KKyAgICAgKiB1c2UgY2FzZXMgZm9yIGN1c3RvbSBuYXZpZ2F0aW9uIHZpZXdzIG1pZ2h0IGluY2x1ZGUgYW4gYXV0by1zdWdnZXN0aW5nCisgICAgICogYWRkcmVzcyBiYXIgZm9yIGEgYnJvd3NlciBvciBvdGhlciBuYXZpZ2F0aW9uIG1lY2hhbmlzbXMgdGhhdCBkbyBub3QKKyAgICAgKiB0cmFuc2xhdGUgd2VsbCB0byBwcm92aWRlZCBuYXZpZ2F0aW9uIG1vZGVzLgorICAgICAqIAorICAgICAqIEBwYXJhbSB2aWV3IEN1c3RvbSBuYXZpZ2F0aW9uIHZpZXcgdG8gcGxhY2UgaW4gdGhlIEFjdGlvbkJhci4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRDdXN0b21OYXZpZ2F0aW9uTW9kZShWaWV3IHZpZXcpOworICAgIAorICAgIC8qKgorICAgICAqIFNldCB0aGUgYWN0aW9uIGJhciBpbnRvIGRyb3Bkb3duIG5hdmlnYXRpb24gbW9kZSBhbmQgc3VwcGx5IGFuIGFkYXB0ZXIKKyAgICAgKiB0aGF0IHdpbGwgcHJvdmlkZSB2aWV3cyBmb3IgbmF2aWdhdGlvbiBjaG9pY2VzLgorICAgICAqIAorICAgICAqIEBwYXJhbSBhZGFwdGVyIEFuIGFkYXB0ZXIgdGhhdCB3aWxsIHByb3ZpZGUgdmlld3MgYm90aCB0byBkaXNwbGF5CisgICAgICogICAgICAgICAgICAgICAgdGhlIGN1cnJlbnQgbmF2aWdhdGlvbiBzZWxlY3Rpb24gYW5kIHBvcHVsYXRlIHZpZXdzCisgICAgICogICAgICAgICAgICAgICAgd2l0aGluIHRoZSBkcm9wZG93biBuYXZpZ2F0aW9uIG1lbnUuCisgICAgICogQHBhcmFtIGNhbGxiYWNrIEEgTmF2aWdhdGlvbkNhbGxiYWNrIHRoYXQgd2lsbCByZWNlaXZlIGV2ZW50cyB3aGVuIHRoZSB1c2VyCisgICAgICogICAgICAgICAgICAgICAgIHNlbGVjdHMgYSBuYXZpZ2F0aW9uIGl0ZW0uCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0RHJvcGRvd25OYXZpZ2F0aW9uTW9kZShTcGlubmVyQWRhcHRlciBhZGFwdGVyLAorICAgICAgICAgICAgTmF2aWdhdGlvbkNhbGxiYWNrIGNhbGxiYWNrKTsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgYWN0aW9uIGJhciBpbnRvIGRyb3Bkb3duIG5hdmlnYXRpb24gbW9kZSBhbmQgc3VwcGx5IGFuIGFkYXB0ZXIgdGhhdCB3aWxsCisgICAgICogcHJvdmlkZSB2aWV3cyBmb3IgbmF2aWdhdGlvbiBjaG9pY2VzLgorICAgICAqCisgICAgICogQHBhcmFtIGFkYXB0ZXIgQW4gYWRhcHRlciB0aGF0IHdpbGwgcHJvdmlkZSB2aWV3cyBib3RoIHRvIGRpc3BsYXkgdGhlIGN1cnJlbnQKKyAgICAgKiAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uIHNlbGVjdGlvbiBhbmQgcG9wdWxhdGUgdmlld3Mgd2l0aGluIHRoZSBkcm9wZG93bgorICAgICAqICAgICAgICAgICAgICAgIG5hdmlnYXRpb24gbWVudS4KKyAgICAgKiBAcGFyYW0gY2FsbGJhY2sgQSBOYXZpZ2F0aW9uQ2FsbGJhY2sgdGhhdCB3aWxsIHJlY2VpdmUgZXZlbnRzIHdoZW4gdGhlIHVzZXIKKyAgICAgKiAgICAgICAgICAgICAgICAgc2VsZWN0cyBhIG5hdmlnYXRpb24gaXRlbS4KKyAgICAgKiBAcGFyYW0gZGVmYXVsdFNlbGVjdGVkUG9zaXRpb24gUG9zaXRpb24gd2l0aGluIHRoZSBwcm92aWRlZCBhZGFwdGVyIHRoYXQgc2hvdWxkIGJlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkIGZyb20gdGhlIG91dHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXREcm9wZG93bk5hdmlnYXRpb25Nb2RlKFNwaW5uZXJBZGFwdGVyIGFkYXB0ZXIsCisgICAgICAgICAgICBOYXZpZ2F0aW9uQ2FsbGJhY2sgY2FsbGJhY2ssIGludCBkZWZhdWx0U2VsZWN0ZWRQb3NpdGlvbik7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHNlbGVjdGVkIG5hdmlnYXRpb24gaXRlbSBpbiBkcm9wZG93biBvciB0YWJiZWQgbmF2aWdhdGlvbiBtb2Rlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwb3NpdGlvbiBQb3NpdGlvbiBvZiB0aGUgaXRlbSB0byBzZWxlY3QuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0U2VsZWN0ZWROYXZpZ2F0aW9uSXRlbShpbnQgcG9zaXRpb24pOworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBwb3NpdGlvbiBvZiB0aGUgc2VsZWN0ZWQgbmF2aWdhdGlvbiBpdGVtIGluIGRyb3Bkb3duIG9yIHRhYmJlZCBuYXZpZ2F0aW9uIG1vZGVzLgorICAgICAqCisgICAgICogQHJldHVybiBQb3NpdGlvbiBvZiB0aGUgc2VsZWN0ZWQgaXRlbS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgaW50IGdldFNlbGVjdGVkTmF2aWdhdGlvbkl0ZW0oKTsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgYWN0aW9uIGJhciBpbnRvIHN0YW5kYXJkIG5hdmlnYXRpb24gbW9kZSwgc3VwcGx5aW5nIGEgdGl0bGUgYW5kIHN1YnRpdGxlLgorICAgICAqIAorICAgICAqIFN0YW5kYXJkIG5hdmlnYXRpb24gbW9kZSBpcyBkZWZhdWx0LiBUaGUgdGl0bGUgaXMgYXV0b21hdGljYWxseSBzZXQgdG8gdGhlCisgICAgICogbmFtZSBvZiB5b3VyIEFjdGl2aXR5LiBTdWJ0aXRsZXMgYXJlIGRpc3BsYXllZCB1bmRlcm5lYXRoIHRoZSB0aXRsZSwgdXN1YWxseQorICAgICAqIGluIGEgc21hbGxlciBmb250IG9yIG90aGVyd2lzZSBsZXNzIHByb21pbmVudGx5IHRoYW4gdGhlIHRpdGxlLiBTdWJ0aXRsZXMgYXJlCisgICAgICogZ29vZCBmb3IgZXh0ZW5kZWQgZGVzY3JpcHRpb25zIG9mIGFjdGl2aXR5IHN0YXRlLgorICAgICAqCisgICAgICogQHBhcmFtIHRpdGxlIFRoZSBhY3Rpb24gYmFyJ3MgdGl0bGUuIG51bGwgaXMgdHJlYXRlZCBhcyBhbiBlbXB0eSBzdHJpbmcuCisgICAgICogQHBhcmFtIHN1YnRpdGxlIFRoZSBhY3Rpb24gYmFyJ3Mgc3VidGl0bGUuIG51bGwgd2lsbCByZW1vdmUgdGhlIHN1YnRpdGxlIGVudGlyZWx5LgorICAgICAqCisgICAgICogQHNlZSAjc2V0U3RhbmRhcmROYXZpZ2F0aW9uTW9kZSgpCisgICAgICogQHNlZSAjc2V0U3RhbmRhcmROYXZpZ2F0aW9uTW9kZShDaGFyU2VxdWVuY2UpCisgICAgICogQHNlZSAjc2V0U3RhbmRhcmROYXZpZ2F0aW9uTW9kZShpbnQpCisgICAgICogQHNlZSAjc2V0U3RhbmRhcmROYXZpZ2F0aW9uTW9kZShpbnQsIGludCkKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRTdGFuZGFyZE5hdmlnYXRpb25Nb2RlKENoYXJTZXF1ZW5jZSB0aXRsZSwgQ2hhclNlcXVlbmNlIHN1YnRpdGxlKTsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgYWN0aW9uIGJhciBpbnRvIHN0YW5kYXJkIG5hdmlnYXRpb24gbW9kZSwgc3VwcGx5aW5nIGEgdGl0bGUgYW5kIHN1YnRpdGxlLgorICAgICAqIAorICAgICAqIFN0YW5kYXJkIG5hdmlnYXRpb24gbW9kZSBpcyBkZWZhdWx0LiBUaGUgdGl0bGUgaXMgYXV0b21hdGljYWxseSBzZXQgdG8gdGhlCisgICAgICogbmFtZSBvZiB5b3VyIEFjdGl2aXR5LiBTdWJ0aXRsZXMgYXJlIGRpc3BsYXllZCB1bmRlcm5lYXRoIHRoZSB0aXRsZSwgdXN1YWxseQorICAgICAqIGluIGEgc21hbGxlciBmb250IG9yIG90aGVyd2lzZSBsZXNzIHByb21pbmVudGx5IHRoYW4gdGhlIHRpdGxlLiBTdWJ0aXRsZXMgYXJlCisgICAgICogZ29vZCBmb3IgZXh0ZW5kZWQgZGVzY3JpcHRpb25zIG9mIGFjdGl2aXR5IHN0YXRlLgorICAgICAqCisgICAgICogQHBhcmFtIHRpdGxlUmVzSWQgUmVzb3VyY2UgSUQgb2YgYSB0aXRsZSBzdHJpbmcKKyAgICAgKiBAcGFyYW0gc3VidGl0bGVSZXNJZCBSZXNvdXJjZSBJRCBvZiBhIHN1YnRpdGxlIHN0cmluZworICAgICAqCisgICAgICogQHNlZSAjc2V0U3RhbmRhcmROYXZpZ2F0aW9uTW9kZSgpCisgICAgICogQHNlZSAjc2V0U3RhbmRhcmROYXZpZ2F0aW9uTW9kZShDaGFyU2VxdWVuY2UpCisgICAgICogQHNlZSAjc2V0U3RhbmRhcmROYXZpZ2F0aW9uTW9kZShDaGFyU2VxdWVuY2UsIENoYXJTZXF1ZW5jZSkKKyAgICAgKiBAc2VlICNzZXRTdGFuZGFyZE5hdmlnYXRpb25Nb2RlKGludCkKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRTdGFuZGFyZE5hdmlnYXRpb25Nb2RlKGludCB0aXRsZVJlc0lkLCBpbnQgc3VidGl0bGVSZXNJZCk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGFjdGlvbiBiYXIgaW50byBzdGFuZGFyZCBuYXZpZ2F0aW9uIG1vZGUsIHN1cHBseWluZyBhIHRpdGxlIGFuZCBzdWJ0aXRsZS4KKyAgICAgKiAKKyAgICAgKiBTdGFuZGFyZCBuYXZpZ2F0aW9uIG1vZGUgaXMgZGVmYXVsdC4gVGhlIHRpdGxlIGlzIGF1dG9tYXRpY2FsbHkgc2V0IHRvIHRoZQorICAgICAqIG5hbWUgb2YgeW91ciBBY3Rpdml0eSBvbiBzdGFydHVwIGlmIGFuIGFjdGlvbiBiYXIgaXMgcHJlc2VudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0aXRsZSBUaGUgYWN0aW9uIGJhcidzIHRpdGxlLiBudWxsIGlzIHRyZWF0ZWQgYXMgYW4gZW1wdHkgc3RyaW5nLgorICAgICAqCisgICAgICogQHNlZSAjc2V0U3RhbmRhcmROYXZpZ2F0aW9uTW9kZSgpCisgICAgICogQHNlZSAjc2V0U3RhbmRhcmROYXZpZ2F0aW9uTW9kZShDaGFyU2VxdWVuY2UsIENoYXJTZXF1ZW5jZSkKKyAgICAgKiBAc2VlICNzZXRTdGFuZGFyZE5hdmlnYXRpb25Nb2RlKGludCkKKyAgICAgKiBAc2VlICNzZXRTdGFuZGFyZE5hdmlnYXRpb25Nb2RlKGludCwgaW50KQorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFN0YW5kYXJkTmF2aWdhdGlvbk1vZGUoQ2hhclNlcXVlbmNlIHRpdGxlKTsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgYWN0aW9uIGJhciBpbnRvIHN0YW5kYXJkIG5hdmlnYXRpb24gbW9kZSwgc3VwcGx5aW5nIGEgdGl0bGUgYW5kIHN1YnRpdGxlLgorICAgICAqIAorICAgICAqIFN0YW5kYXJkIG5hdmlnYXRpb24gbW9kZSBpcyBkZWZhdWx0LiBUaGUgdGl0bGUgaXMgYXV0b21hdGljYWxseSBzZXQgdG8gdGhlCisgICAgICogbmFtZSBvZiB5b3VyIEFjdGl2aXR5IG9uIHN0YXJ0dXAgaWYgYW4gYWN0aW9uIGJhciBpcyBwcmVzZW50LgorICAgICAqCisgICAgICogQHBhcmFtIHRpdGxlUmVzSWQgUmVzb3VyY2UgSUQgb2YgYSB0aXRsZSBzdHJpbmcKKyAgICAgKgorICAgICAqIEBzZWUgI3NldFN0YW5kYXJkTmF2aWdhdGlvbk1vZGUoKQorICAgICAqIEBzZWUgI3NldFN0YW5kYXJkTmF2aWdhdGlvbk1vZGUoQ2hhclNlcXVlbmNlKQorICAgICAqIEBzZWUgI3NldFN0YW5kYXJkTmF2aWdhdGlvbk1vZGUoQ2hhclNlcXVlbmNlLCBDaGFyU2VxdWVuY2UpCisgICAgICogQHNlZSAjc2V0U3RhbmRhcmROYXZpZ2F0aW9uTW9kZShpbnQsIGludCkKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRTdGFuZGFyZE5hdmlnYXRpb25Nb2RlKGludCB0aXRsZVJlc0lkKTsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgYWN0aW9uIGJhciBpbnRvIHN0YW5kYXJkIG5hdmlnYXRpb24gbW9kZSwgdXNpbmcgdGhlIGN1cnJlbnRseSBzZXQgdGl0bGUKKyAgICAgKiBhbmQvb3Igc3VidGl0bGUuCisgICAgICoKKyAgICAgKiBTdGFuZGFyZCBuYXZpZ2F0aW9uIG1vZGUgaXMgZGVmYXVsdC4gVGhlIHRpdGxlIGlzIGF1dG9tYXRpY2FsbHkgc2V0IHRvIHRoZSBuYW1lIG9mCisgICAgICogeW91ciBBY3Rpdml0eSBvbiBzdGFydHVwIGlmIGFuIGFjdGlvbiBiYXIgaXMgcHJlc2VudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRTdGFuZGFyZE5hdmlnYXRpb25Nb2RlKCk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGFjdGlvbiBiYXIncyB0aXRsZS4gVGhpcyB3aWxsIG9ubHkgYmUgZGlzcGxheWVkIGluIHN0YW5kYXJkIG5hdmlnYXRpb24gbW9kZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0aXRsZSBUaXRsZSB0byBzZXQKKyAgICAgKgorICAgICAqIEBzZWUgI3NldFRpdGxlKGludCkKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRUaXRsZShDaGFyU2VxdWVuY2UgdGl0bGUpOworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBhY3Rpb24gYmFyJ3MgdGl0bGUuIFRoaXMgd2lsbCBvbmx5IGJlIGRpc3BsYXllZCBpbiBzdGFuZGFyZCBuYXZpZ2F0aW9uIG1vZGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzSWQgUmVzb3VyY2UgSUQgb2YgdGl0bGUgc3RyaW5nIHRvIHNldAorICAgICAqCisgICAgICogQHNlZSAjc2V0VGl0bGUoQ2hhclNlcXVlbmNlKQorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFRpdGxlKGludCByZXNJZCk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGFjdGlvbiBiYXIncyBzdWJ0aXRsZS4gVGhpcyB3aWxsIG9ubHkgYmUgZGlzcGxheWVkIGluIHN0YW5kYXJkIG5hdmlnYXRpb24gbW9kZS4KKyAgICAgKiBTZXQgdG8gbnVsbCB0byBkaXNhYmxlIHRoZSBzdWJ0aXRsZSBlbnRpcmVseS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdWJ0aXRsZSBTdWJ0aXRsZSB0byBzZXQKKyAgICAgKgorICAgICAqIEBzZWUgI3NldFN1YnRpdGxlKGludCkKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRTdWJ0aXRsZShDaGFyU2VxdWVuY2Ugc3VidGl0bGUpOworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBhY3Rpb24gYmFyJ3Mgc3VidGl0bGUuIFRoaXMgd2lsbCBvbmx5IGJlIGRpc3BsYXllZCBpbiBzdGFuZGFyZCBuYXZpZ2F0aW9uIG1vZGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzSWQgUmVzb3VyY2UgSUQgb2Ygc3VidGl0bGUgc3RyaW5nIHRvIHNldAorICAgICAqCisgICAgICogQHNlZSAjc2V0U3VidGl0bGUoQ2hhclNlcXVlbmNlKQorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFN1YnRpdGxlKGludCByZXNJZCk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgZGlzcGxheSBvcHRpb25zLiBUaGlzIGNoYW5nZXMgYWxsIGRpc3BsYXkgb3B0aW9uIGJpdHMgYXQgb25jZS4gVG8gY2hhbmdlCisgICAgICogYSBsaW1pdGVkIHN1YnNldCBvZiBkaXNwbGF5IG9wdGlvbnMsIHNlZSB7QGxpbmsgI3NldERpc3BsYXlPcHRpb25zKGludCwgaW50KX0uCisgICAgICogCisgICAgICogQHBhcmFtIG9wdGlvbnMgQSBjb21iaW5hdGlvbiBvZiB0aGUgYml0cyBkZWZpbmVkIGJ5IHRoZSBESVNQTEFZXyBjb25zdGFudHMKKyAgICAgKiAgICAgICAgICAgICAgICBkZWZpbmVkIGluIEFjdGlvbkJhci4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXREaXNwbGF5T3B0aW9ucyhpbnQgb3B0aW9ucyk7CisgICAgCisgICAgLyoqCisgICAgICogU2V0IHNlbGVjdGVkIGRpc3BsYXkgb3B0aW9ucy4gT25seSB0aGUgb3B0aW9ucyBzcGVjaWZpZWQgYnkgbWFzayB3aWxsIGJlIGNoYW5nZWQuCisgICAgICogVG8gY2hhbmdlIGFsbCBkaXNwbGF5IG9wdGlvbiBiaXRzIGF0IG9uY2UsIHNlZSB7QGxpbmsgI3NldERpc3BsYXlPcHRpb25zKGludCl9LgorICAgICAqIAorICAgICAqIDxwPkV4YW1wbGU6IHNldERpc3BsYXlPcHRpb25zKDAsIERJU1BMQVlfSElERV9IT01FKSB3aWxsIGRpc2FibGUgdGhlCisgICAgICoge0BsaW5rICNESVNQTEFZX0hJREVfSE9NRX0gb3B0aW9uLgorICAgICAqIHNldERpc3BsYXlPcHRpb25zKERJU1BMQVlfSElERV9IT01FLCBESVNQTEFZX0hJREVfSE9NRSB8IERJU1BMQVlfVVNFX0xPR08pCisgICAgICogd2lsbCBlbmFibGUge0BsaW5rICNESVNQTEFZX0hJREVfSE9NRX0gYW5kIGRpc2FibGUge0BsaW5rICNESVNQTEFZX1VTRV9MT0dPfS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gb3B0aW9ucyBBIGNvbWJpbmF0aW9uIG9mIHRoZSBiaXRzIGRlZmluZWQgYnkgdGhlIERJU1BMQVlfIGNvbnN0YW50cworICAgICAqICAgICAgICAgICAgICAgIGRlZmluZWQgaW4gQWN0aW9uQmFyLgorICAgICAqIEBwYXJhbSBtYXNrIEEgYml0IG1hc2sgZGVjbGFyaW5nIHdoaWNoIGRpc3BsYXkgb3B0aW9ucyBzaG91bGQgYmUgY2hhbmdlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXREaXNwbGF5T3B0aW9ucyhpbnQgb3B0aW9ucywgaW50IG1hc2spOworICAgIAorICAgIC8qKgorICAgICAqIFNldCB0aGUgQWN0aW9uQmFyJ3MgYmFja2dyb3VuZC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZCBCYWNrZ3JvdW5kIGRyYXdhYmxlCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0QmFja2dyb3VuZERyYXdhYmxlKERyYXdhYmxlIGQpOworICAgIAorICAgIC8qKgorICAgICAqIEByZXR1cm4gVGhlIGN1cnJlbnQgY3VzdG9tIG5hdmlnYXRpb24gdmlldy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgVmlldyBnZXRDdXN0b21OYXZpZ2F0aW9uVmlldygpOworICAgIAorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgQWN0aW9uQmFyIHRpdGxlIGluIHN0YW5kYXJkIG1vZGUuCisgICAgICogUmV0dXJucyBudWxsIGlmIHtAbGluayAjZ2V0TmF2aWdhdGlvbk1vZGUoKX0gd291bGQgbm90IHJldHVybgorICAgICAqIHtAbGluayAjTkFWSUdBVElPTl9NT0RFX1NUQU5EQVJEfS4gCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBjdXJyZW50IEFjdGlvbkJhciB0aXRsZSBvciBudWxsLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBDaGFyU2VxdWVuY2UgZ2V0VGl0bGUoKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IEFjdGlvbkJhciBzdWJ0aXRsZSBpbiBzdGFuZGFyZCBtb2RlLgorICAgICAqIFJldHVybnMgbnVsbCBpZiB7QGxpbmsgI2dldE5hdmlnYXRpb25Nb2RlKCl9IHdvdWxkIG5vdCByZXR1cm4KKyAgICAgKiB7QGxpbmsgI05BVklHQVRJT05fTU9ERV9TVEFOREFSRH0uIAorICAgICAqCisgICAgICogQHJldHVybiBUaGUgY3VycmVudCBBY3Rpb25CYXIgc3VidGl0bGUgb3IgbnVsbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgQ2hhclNlcXVlbmNlIGdldFN1YnRpdGxlKCk7CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY3VycmVudCBuYXZpZ2F0aW9uIG1vZGUuIFRoZSByZXN1bHQgd2lsbCBiZSBvbmUgb2Y6CisgICAgICogPHVsPgorICAgICAqIDxsaT57QGxpbmsgI05BVklHQVRJT05fTU9ERV9TVEFOREFSRH08L2xpPgorICAgICAqIDxsaT57QGxpbmsgI05BVklHQVRJT05fTU9ERV9EUk9QRE9XTl9MSVNUfTwvbGk+CisgICAgICogPGxpPntAbGluayAjTkFWSUdBVElPTl9NT0RFX1RBQlN9PC9saT4KKyAgICAgKiA8bGk+e0BsaW5rICNOQVZJR0FUSU9OX01PREVfQ1VTVE9NfTwvbGk+CisgICAgICogPC91bD4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIGN1cnJlbnQgbmF2aWdhdGlvbiBtb2RlLgorICAgICAqIAorICAgICAqIEBzZWUgI3NldFN0YW5kYXJkTmF2aWdhdGlvbk1vZGUoKQorICAgICAqIEBzZWUgI3NldFN0YW5kYXJkTmF2aWdhdGlvbk1vZGUoQ2hhclNlcXVlbmNlKQorICAgICAqIEBzZWUgI3NldFN0YW5kYXJkTmF2aWdhdGlvbk1vZGUoQ2hhclNlcXVlbmNlLCBDaGFyU2VxdWVuY2UpCisgICAgICogQHNlZSAjc2V0RHJvcGRvd25OYXZpZ2F0aW9uTW9kZShTcGlubmVyQWRhcHRlcikKKyAgICAgKiBAc2VlICNzZXRUYWJOYXZpZ2F0aW9uTW9kZSgpCisgICAgICogQHNlZSAjc2V0Q3VzdG9tTmF2aWdhdGlvbk1vZGUoVmlldykKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgaW50IGdldE5hdmlnYXRpb25Nb2RlKCk7CisgICAgCisgICAgLyoqCisgICAgICogQHJldHVybiBUaGUgY3VycmVudCBzZXQgb2YgZGlzcGxheSBvcHRpb25zLiAKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgaW50IGdldERpc3BsYXlPcHRpb25zKCk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGFjdGlvbiBiYXIgaW50byB0YWJiZWQgbmF2aWdhdGlvbiBtb2RlLgorICAgICAqCisgICAgICogQHNlZSAjYWRkVGFiKFRhYikKKyAgICAgKiBAc2VlICNpbnNlcnRUYWIoVGFiLCBpbnQpCisgICAgICogQHNlZSAjcmVtb3ZlVGFiKFRhYikKKyAgICAgKiBAc2VlICNyZW1vdmVUYWJBdChpbnQpCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0VGFiTmF2aWdhdGlvbk1vZGUoKTsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgYWN0aW9uIGJhciBpbnRvIHRhYmJlZCBuYXZpZ2F0aW9uIG1vZGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGFpbmVyVmlld0lkIElkIG9mIHRoZSBjb250YWluZXIgdmlldyB3aGVyZSB0YWIgY29udGVudCBmcmFnbWVudHMgc2hvdWxkIGFwcGVhci4KKyAgICAgKgorICAgICAqIEBzZWUgI2FkZFRhYihUYWIpCisgICAgICogQHNlZSAjaW5zZXJ0VGFiKFRhYiwgaW50KQorICAgICAqIEBzZWUgI3JlbW92ZVRhYihUYWIpCisgICAgICogQHNlZSAjcmVtb3ZlVGFiQXQoaW50KQorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFRhYk5hdmlnYXRpb25Nb2RlKGludCBjb250YWluZXJWaWV3SWQpOworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGFuZCByZXR1cm4gYSBuZXcge0BsaW5rIFRhYn0uCisgICAgICogVGhpcyB0YWIgd2lsbCBub3QgYmUgaW5jbHVkZWQgaW4gdGhlIGFjdGlvbiBiYXIgdW50aWwgaXQgaXMgYWRkZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEEgbmV3IFRhYgorICAgICAqCisgICAgICogQHNlZSAjYWRkVGFiKFRhYikKKyAgICAgKiBAc2VlICNpbnNlcnRUYWIoVGFiLCBpbnQpCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IFRhYiBuZXdUYWIoKTsKKworICAgIC8qKgorICAgICAqIEFkZCBhIHRhYiBmb3IgdXNlIGluIHRhYmJlZCBuYXZpZ2F0aW9uIG1vZGUuIFRoZSB0YWIgd2lsbCBiZSBhZGRlZCBhdCB0aGUgZW5kIG9mIHRoZSBsaXN0LgorICAgICAqCisgICAgICogQHBhcmFtIHRhYiBUYWIgdG8gYWRkCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgYWRkVGFiKFRhYiB0YWIpOworCisgICAgLyoqCisgICAgICogSW5zZXJ0IGEgdGFiIGZvciB1c2UgaW4gdGFiYmVkIG5hdmlnYXRpb24gbW9kZS4gVGhlIHRhYiB3aWxsIGJlIGluc2VydGVkIGF0CisgICAgICogPGNvZGU+cG9zaXRpb248L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIHRhYiBUaGUgdGFiIHRvIGFkZAorICAgICAqIEBwYXJhbSBwb3NpdGlvbiBUaGUgbmV3IHBvc2l0aW9uIG9mIHRoZSB0YWIKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBpbnNlcnRUYWIoVGFiIHRhYiwgaW50IHBvc2l0aW9uKTsKKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhIHRhYiBmcm9tIHRoZSBhY3Rpb24gYmFyLgorICAgICAqCisgICAgICogQHBhcmFtIHRhYiBUaGUgdGFiIHRvIHJlbW92ZQorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHJlbW92ZVRhYihUYWIgdGFiKTsKKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhIHRhYiBmcm9tIHRoZSBhY3Rpb24gYmFyLgorICAgICAqCisgICAgICogQHBhcmFtIHBvc2l0aW9uIFBvc2l0aW9uIG9mIHRoZSB0YWIgdG8gcmVtb3ZlCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgcmVtb3ZlVGFiQXQoaW50IHBvc2l0aW9uKTsKKworICAgIC8qKgorICAgICAqIFNlbGVjdCB0aGUgc3BlY2lmaWVkIHRhYi4gSWYgaXQgaXMgbm90IGEgY2hpbGQgb2YgdGhpcyBhY3Rpb24gYmFyIGl0IHdpbGwgYmUgYWRkZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGFiIFRhYiB0byBzZWxlY3QKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZWxlY3RUYWIoVGFiIHRhYik7CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZSB0aGUgY3VycmVudCBoZWlnaHQgb2YgdGhlIEFjdGlvbkJhci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIEFjdGlvbkJhcidzIGhlaWdodAorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0SGVpZ2h0KCk7CisKKyAgICAvKioKKyAgICAgKiBTaG93IHRoZSBBY3Rpb25CYXIgaWYgaXQgaXMgbm90IGN1cnJlbnRseSBzaG93aW5nLgorICAgICAqIElmIHRoZSB3aW5kb3cgaG9zdGluZyB0aGUgQWN0aW9uQmFyIGRvZXMgbm90IGhhdmUgdGhlIGZlYXR1cmUKKyAgICAgKiB7QGxpbmsgV2luZG93I0ZFQVRVUkVfQUNUSU9OX0JBUl9PVkVSTEFZfSBpdCB3aWxsIHJlc2l6ZSBhcHBsaWNhdGlvbgorICAgICAqIGNvbnRlbnQgdG8gZml0IHRoZSBuZXcgc3BhY2UgYXZhaWxhYmxlLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNob3coKTsKKworICAgIC8qKgorICAgICAqIEhpZGUgdGhlIEFjdGlvbkJhciBpZiBpdCBpcyBub3QgY3VycmVudGx5IHNob3dpbmcuCisgICAgICogSWYgdGhlIHdpbmRvdyBob3N0aW5nIHRoZSBBY3Rpb25CYXIgZG9lcyBub3QgaGF2ZSB0aGUgZmVhdHVyZQorICAgICAqIHtAbGluayBXaW5kb3cjRkVBVFVSRV9BQ1RJT05fQkFSX09WRVJMQVl9IGl0IHdpbGwgcmVzaXplIGFwcGxpY2F0aW9uCisgICAgICogY29udGVudCB0byBmaXQgdGhlIG5ldyBzcGFjZSBhdmFpbGFibGUuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgaGlkZSgpOworCisgICAgLyoqCisgICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgQWN0aW9uQmFyIGlzIHNob3dpbmcsIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNTaG93aW5nKCk7CisKKyAgICAvKioKKyAgICAgKiBDYWxsYmFjayBpbnRlcmZhY2UgZm9yIEFjdGlvbkJhciBuYXZpZ2F0aW9uIGV2ZW50cy4gCisgICAgICovCisgICAgcHVibGljIGludGVyZmFjZSBOYXZpZ2F0aW9uQ2FsbGJhY2sgeworICAgICAgICAvKioKKyAgICAgICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW5ldmVyIGEgbmF2aWdhdGlvbiBpdGVtIGluIHlvdXIgYWN0aW9uIGJhcgorICAgICAgICAgKiBpcyBzZWxlY3RlZC4KKyAgICAgICAgICogICAgCisgICAgICAgICAqIEBwYXJhbSBpdGVtUG9zaXRpb24gUG9zaXRpb24gb2YgdGhlIGl0ZW0gY2xpY2tlZC4KKyAgICAgICAgICogQHBhcmFtIGl0ZW1JZCBJRCBvZiB0aGUgaXRlbSBjbGlja2VkLgorICAgICAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGV2ZW50IHdhcyBoYW5kbGVkLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbk5hdmlnYXRpb25JdGVtU2VsZWN0ZWQoaW50IGl0ZW1Qb3NpdGlvbiwgbG9uZyBpdGVtSWQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEEgdGFiIGluIHRoZSBhY3Rpb24gYmFyLgorICAgICAqCisgICAgICogPHA+VGFicyBtYW5hZ2UgdGhlIGhpZGluZyBhbmQgc2hvd2luZyBvZiB7QGxpbmsgRnJhZ21lbnR9cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIFRhYiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBBbiBpbnZhbGlkIHBvc2l0aW9uIGZvciBhIHRhYi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHNlZSAjZ2V0UG9zaXRpb24oKQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5WQUxJRF9QT1NJVElPTiA9IC0xOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm4gdGhlIGN1cnJlbnQgcG9zaXRpb24gb2YgdGhpcyB0YWIgaW4gdGhlIGFjdGlvbiBiYXIuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gQ3VycmVudCBwb3NpdGlvbiwgb3Ige0BsaW5rICNJTlZBTElEX1BPU0lUSU9OfSBpZiB0aGlzIHRhYiBpcyBub3QgY3VycmVudGx5IGluCisgICAgICAgICAqICAgICAgICAgdGhlIGFjdGlvbiBiYXIuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgaW50IGdldFBvc2l0aW9uKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybiB0aGUgaWNvbiBhc3NvY2lhdGVkIHdpdGggdGhpcyB0YWIuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gVGhlIHRhYidzIGljb24KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBEcmF3YWJsZSBnZXRJY29uKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybiB0aGUgdGV4dCBvZiB0aGlzIHRhYi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiBUaGUgdGFiJ3MgdGV4dAorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGFic3RyYWN0IENoYXJTZXF1ZW5jZSBnZXRUZXh0KCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldCB0aGUgaWNvbiBkaXNwbGF5ZWQgb24gdGhpcyB0YWIuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBpY29uIFRoZSBkcmF3YWJsZSB0byB1c2UgYXMgYW4gaWNvbgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0SWNvbihEcmF3YWJsZSBpY29uKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0IHRoZSB0ZXh0IGRpc3BsYXllZCBvbiB0aGlzIHRhYi4gVGV4dCBtYXkgYmUgdHJ1bmNhdGVkIGlmIHRoZXJlIGlzIG5vdAorICAgICAgICAgKiByb29tIHRvIGRpc3BsYXkgdGhlIGVudGlyZSBzdHJpbmcuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSB0ZXh0IFRoZSB0ZXh0IHRvIGRpc3BsYXkKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFRleHQoQ2hhclNlcXVlbmNlIHRleHQpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIHRoZSBmcmFnbWVudCB0aGF0IHdpbGwgYmUgc2hvd24gd2hlbiB0aGlzIHRhYiBpcyBzZWxlY3RlZC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiBGcmFnbWVudCBhc3NvY2lhdGVkIHdpdGggdGhpcyB0YWIKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBGcmFnbWVudCBnZXRGcmFnbWVudCgpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXQgdGhlIGZyYWdtZW50IHRoYXQgd2lsbCBiZSBzaG93biB3aGVuIHRoaXMgdGFiIGlzIHNlbGVjdGVkLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gZnJhZ21lbnQgRnJhZ21lbnQgdG8gYXNzb2NpYXRlIHdpdGggdGhpcyB0YWIKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldEZyYWdtZW50KEZyYWdtZW50IGZyYWdtZW50KTsKKworICAgICAgICAvKioKKyAgICAgICAgICogU2VsZWN0IHRoaXMgdGFiLiBPbmx5IHZhbGlkIGlmIHRoZSB0YWIgaGFzIGJlZW4gYWRkZWQgdG8gdGhlIGFjdGlvbiBiYXIuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZWxlY3QoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQWN0aXZpdHkuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9BY3Rpdml0eS5qYXZhCmluZGV4IGVkNWFmOTEuLjQyNWIyODQgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9BY3Rpdml0eS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9BY3Rpdml0eS5qYXZhCkBAIC0xNiwxOSArMTYsMjEgQEAKIAogcGFja2FnZSBhbmRyb2lkLmFwcDsKIAoraW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLmFwcC5BY3Rpb25CYXJJbXBsOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnBvbGljeS5Qb2xpY3lNYW5hZ2VyOwogCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudENhbGxiYWNrczsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LklJbnRlbnRTZW5kZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50U2VuZGVyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5TaGFyZWRQcmVmZXJlbmNlczsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uQWN0aXZpdHlJbmZvOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CkBAIC0zOSw2ICs0MSw3IEBACiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwogaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlNlbGVjdGlvbjsKIGltcG9ydCBhbmRyb2lkLnRleHQuU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcjsKQEAgLTQ5LDcgKzUyLDkgQEAKIGltcG9ydCBhbmRyb2lkLnV0aWwuRXZlbnRMb2c7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIGltcG9ydCBhbmRyb2lkLnV0aWwuU3BhcnNlQXJyYXk7CitpbXBvcnQgYW5kcm9pZC52aWV3LkFjdGlvbk1vZGU7CiBpbXBvcnQgYW5kcm9pZC52aWV3LkNvbnRleHRNZW51OworaW1wb3J0IGFuZHJvaWQudmlldy5Db250ZXh0TWVudS5Db250ZXh0TWVudUluZm87CiBpbXBvcnQgYW5kcm9pZC52aWV3LkNvbnRleHRUaGVtZVdyYXBwZXI7CiBpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OwogaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKQEAgLTU4LDE3ICs2MywxNSBAQAogaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SXRlbTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXcuT25DcmVhdGVDb250ZXh0TWVudUxpc3RlbmVyOwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cC5MYXlvdXRQYXJhbXM7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3c7CiBpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LkNvbnRleHRNZW51LkNvbnRleHRNZW51SW5mbzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldy5PbkNyZWF0ZUNvbnRleHRNZW51TGlzdGVuZXI7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cC5MYXlvdXRQYXJhbXM7CiBpbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eUV2ZW50OwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3OwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkZyYW1lTGF5b3V0OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkxpbmVhckxheW91dDsKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CkBAIC0xMTAsNiArMTEzLDcgQEAKICAqIAogICogPHA+VG9waWNzIGNvdmVyZWQgaGVyZToKICAqIDxvbD4KKyAqIDxsaT48YSBocmVmPSIjRnJhZ21lbnRzIj5GcmFnbWVudHM8L2E+CiAgKiA8bGk+PGEgaHJlZj0iI0FjdGl2aXR5TGlmZWN5Y2xlIj5BY3Rpdml0eSBMaWZlY3ljbGU8L2E+CiAgKiA8bGk+PGEgaHJlZj0iI0NvbmZpZ3VyYXRpb25DaGFuZ2VzIj5Db25maWd1cmF0aW9uIENoYW5nZXM8L2E+CiAgKiA8bGk+PGEgaHJlZj0iI1N0YXJ0aW5nQWN0aXZpdGllcyI+U3RhcnRpbmcgQWN0aXZpdGllcyBhbmQgR2V0dGluZyBSZXN1bHRzPC9hPgpAQCAtMTE4LDYgKzEyMiwxNCBAQAogICogPGxpPjxhIGhyZWY9IiNQcm9jZXNzTGlmZWN5Y2xlIj5Qcm9jZXNzIExpZmVjeWNsZTwvYT4KICAqIDwvb2w+CiAgKiAKKyAqIDxhIG5hbWU9IkZyYWdtZW50cyI+PC9hPgorICogPGgzPkZyYWdtZW50czwvaDM+CisgKgorICogPHA+U3RhcnRpbmcgd2l0aCB7QGxpbmsgYW5kcm9pZC5vcy5CdWlsZC5WRVJTSU9OX0NPREVTI0hPTkVZQ09NQn0sIEFjdGl2aXR5CisgKiBpbXBsZW1lbnRhdGlvbnMgY2FuIG1ha2UgdXNlIG9mIHRoZSB7QGxpbmsgRnJhZ21lbnR9IGNsYXNzIHRvIGJldHRlcgorICogbW9kdWxhcml6ZSB0aGVpciBjb2RlLCBidWlsZCBtb3JlIHNvcGhpc3RpY2F0ZWQgdXNlciBpbnRlcmZhY2VzIGZvciBsYXJnZXIKKyAqIHNjcmVlbnMsIGFuZCBoZWxwIHNjYWxlIHRoZWlyIGFwcGxpY2F0aW9uIGJldHdlZW4gc21hbGwgYW5kIGxhcmdlIHNjcmVlbnMuCisgKgogICogPGEgbmFtZT0iQWN0aXZpdHlMaWZlY3ljbGUiPjwvYT4KICAqIDxoMz5BY3Rpdml0eSBMaWZlY3ljbGU8L2gzPgogICoKQEAgLTYwNyw2ICs2MTksNyBAQAogICAgIHByaXZhdGUgc3RhdGljIGxvbmcgc0luc3RhbmNlQ291bnQgPSAwOwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdJTkRPV19ISUVSQVJDSFlfVEFHID0gImFuZHJvaWQ6dmlld0hpZXJhcmNoeVN0YXRlIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRlJBR01FTlRTX1RBRyA9ICJhbmRyb2lkOmZyYWdtZW50cyI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNBVkVEX0RJQUxPR19JRFNfS0VZID0gImFuZHJvaWQ6c2F2ZWREaWFsb2dJZHMiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTQVZFRF9ESUFMT0dTX1RBRyA9ICJhbmRyb2lkOnNhdmVkRGlhbG9ncyI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNBVkVEX0RJQUxPR19LRVlfUFJFRklYID0gImFuZHJvaWQ6ZGlhbG9nXyI7CkBAIC02MjgsMTggKzY0MSwyOCBAQAogICAgIHByaXZhdGUgQ29tcG9uZW50TmFtZSBtQ29tcG9uZW50OwogICAgIC8qcGFja2FnZSovIEFjdGl2aXR5SW5mbyBtQWN0aXZpdHlJbmZvOwogICAgIC8qcGFja2FnZSovIEFjdGl2aXR5VGhyZWFkIG1NYWluVGhyZWFkOwotICAgIC8qcGFja2FnZSovIE9iamVjdCBtTGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZTsKLSAgICAvKnBhY2thZ2UqLyBIYXNoTWFwPFN0cmluZyxPYmplY3Q+IG1MYXN0Tm9uQ29uZmlndXJhdGlvbkNoaWxkSW5zdGFuY2VzOwogICAgIEFjdGl2aXR5IG1QYXJlbnQ7CiAgICAgYm9vbGVhbiBtQ2FsbGVkOworICAgIGJvb2xlYW4gbUNoZWNrZWRGb3JMb2FkZXJNYW5hZ2VyOworICAgIGJvb2xlYW4gbVN0YXJ0ZWQ7CiAgICAgcHJpdmF0ZSBib29sZWFuIG1SZXN1bWVkOwogICAgIHByaXZhdGUgYm9vbGVhbiBtU3RvcHBlZDsKICAgICBib29sZWFuIG1GaW5pc2hlZDsKICAgICBib29sZWFuIG1TdGFydGVkQWN0aXZpdHk7CisgICAgLyoqIHRydWUgaWYgdGhlIGFjdGl2aXR5IGlzIGJlaW5nIGRlc3Ryb3llZCBpbiBvcmRlciB0byByZWNyZWF0ZSBpdCB3aXRoIGEgbmV3IGNvbmZpZ3VyYXRpb24gKi8KKyAgICAvKnBhY2thZ2UqLyBib29sZWFuIG1DaGFuZ2luZ0NvbmZpZ3VyYXRpb25zID0gZmFsc2U7CiAgICAgLypwYWNrYWdlKi8gaW50IG1Db25maWdDaGFuZ2VGbGFnczsKICAgICAvKnBhY2thZ2UqLyBDb25maWd1cmF0aW9uIG1DdXJyZW50Q29uZmlnOwogICAgIHByaXZhdGUgU2VhcmNoTWFuYWdlciBtU2VhcmNoTWFuYWdlcjsKIAorICAgIHN0YXRpYyBmaW5hbCBjbGFzcyBOb25Db25maWd1cmF0aW9uSW5zdGFuY2VzIHsKKyAgICAgICAgT2JqZWN0IGFjdGl2aXR5OworICAgICAgICBIYXNoTWFwPFN0cmluZywgT2JqZWN0PiBjaGlsZHJlbjsKKyAgICAgICAgQXJyYXlMaXN0PEZyYWdtZW50PiBmcmFnbWVudHM7CisgICAgICAgIFNwYXJzZUFycmF5PExvYWRlck1hbmFnZXJJbXBsPiBsb2FkZXJzOworICAgIH0KKyAgICAvKiBwYWNrYWdlICovIE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZXMgbUxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2VzOworICAgIAogICAgIHByaXZhdGUgV2luZG93IG1XaW5kb3c7CiAKICAgICBwcml2YXRlIFdpbmRvd01hbmFnZXIgbVdpbmRvd01hbmFnZXI7CkBAIC02NDcsMTAgKzY3MCwxNiBAQAogICAgIC8qcGFja2FnZSovIGJvb2xlYW4gbVdpbmRvd0FkZGVkID0gZmFsc2U7CiAgICAgLypwYWNrYWdlKi8gYm9vbGVhbiBtVmlzaWJsZUZyb21TZXJ2ZXIgPSBmYWxzZTsKICAgICAvKnBhY2thZ2UqLyBib29sZWFuIG1WaXNpYmxlRnJvbUNsaWVudCA9IHRydWU7CisgICAgLypwYWNrYWdlKi8gQWN0aW9uQmFySW1wbCBtQWN0aW9uQmFyID0gbnVsbDsKIAogICAgIHByaXZhdGUgQ2hhclNlcXVlbmNlIG1UaXRsZTsKICAgICBwcml2YXRlIGludCBtVGl0bGVDb2xvciA9IDA7CiAKKyAgICBmaW5hbCBGcmFnbWVudE1hbmFnZXJJbXBsIG1GcmFnbWVudHMgPSBuZXcgRnJhZ21lbnRNYW5hZ2VySW1wbCgpOworICAgIAorICAgIFNwYXJzZUFycmF5PExvYWRlck1hbmFnZXJJbXBsPiBtQWxsTG9hZGVyTWFuYWdlcnM7CisgICAgTG9hZGVyTWFuYWdlckltcGwgbUxvYWRlck1hbmFnZXI7CisgICAgCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgTWFuYWdlZEN1cnNvciB7CiAgICAgICAgIE1hbmFnZWRDdXJzb3IoQ3Vyc29yIGN1cnNvcikgewogICAgICAgICAgICAgbUN1cnNvciA9IGN1cnNvcjsKQEAgLTY3Nyw3ICs3MDYsNyBAQAogICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50W10gRk9DVVNFRF9TVEFURV9TRVQgPSB7Y29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hdHRyLnN0YXRlX2ZvY3VzZWR9OwogCiAgICAgcHJpdmF0ZSBUaHJlYWQgbVVpVGhyZWFkOwotICAgIHByaXZhdGUgZmluYWwgSGFuZGxlciBtSGFuZGxlciA9IG5ldyBIYW5kbGVyKCk7CisgICAgZmluYWwgSGFuZGxlciBtSGFuZGxlciA9IG5ldyBIYW5kbGVyKCk7CiAKICAgICAvLyBVc2VkIGZvciBkZWJ1ZyBvbmx5CiAgICAgLyoKQEAgLTc0OCw2ICs3NzcsMzAgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIExvYWRlck1hbmFnZXIgZm9yIHRoaXMgZnJhZ21lbnQsIGNyZWF0aW5nIGl0IGlmIG5lZWRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTG9hZGVyTWFuYWdlciBnZXRMb2FkZXJNYW5hZ2VyKCkgeworICAgICAgICBpZiAobUxvYWRlck1hbmFnZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG1Mb2FkZXJNYW5hZ2VyOworICAgICAgICB9CisgICAgICAgIG1DaGVja2VkRm9yTG9hZGVyTWFuYWdlciA9IHRydWU7CisgICAgICAgIG1Mb2FkZXJNYW5hZ2VyID0gZ2V0TG9hZGVyTWFuYWdlcigtMSwgbVN0YXJ0ZWQsIHRydWUpOworICAgICAgICByZXR1cm4gbUxvYWRlck1hbmFnZXI7CisgICAgfQorICAgIAorICAgIExvYWRlck1hbmFnZXJJbXBsIGdldExvYWRlck1hbmFnZXIoaW50IGluZGV4LCBib29sZWFuIHN0YXJ0ZWQsIGJvb2xlYW4gY3JlYXRlKSB7CisgICAgICAgIGlmIChtQWxsTG9hZGVyTWFuYWdlcnMgPT0gbnVsbCkgeworICAgICAgICAgICAgbUFsbExvYWRlck1hbmFnZXJzID0gbmV3IFNwYXJzZUFycmF5PExvYWRlck1hbmFnZXJJbXBsPigpOworICAgICAgICB9CisgICAgICAgIExvYWRlck1hbmFnZXJJbXBsIGxtID0gbUFsbExvYWRlck1hbmFnZXJzLmdldChpbmRleCk7CisgICAgICAgIGlmIChsbSA9PSBudWxsICYmIGNyZWF0ZSkgeworICAgICAgICAgICAgbG0gPSBuZXcgTG9hZGVyTWFuYWdlckltcGwoc3RhcnRlZCk7CisgICAgICAgICAgICBtQWxsTG9hZGVyTWFuYWdlcnMucHV0KGluZGV4LCBsbSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGxtOworICAgIH0KKyAgICAKKyAgICAvKioKICAgICAgKiBDYWxscyB7QGxpbmsgYW5kcm9pZC52aWV3LldpbmRvdyNnZXRDdXJyZW50Rm9jdXN9IG9uIHRoZQogICAgICAqIFdpbmRvdyBvZiB0aGlzIEFjdGl2aXR5IHRvIHJldHVybiB0aGUgY3VycmVudGx5IGZvY3VzZWQgdmlldy4KICAgICAgKiAKQEAgLTgwMSw2ICs4NTQsMTUgQEAKICAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CiAgICAgICAgIG1WaXNpYmxlRnJvbUNsaWVudCA9ICFtV2luZG93LmdldFdpbmRvd1N0eWxlKCkuZ2V0Qm9vbGVhbigKICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5XaW5kb3dfd2luZG93Tm9EaXNwbGF5LCBmYWxzZSk7CisgICAgICAgIGlmIChtTGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgbUFsbExvYWRlck1hbmFnZXJzID0gbUxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2VzLmxvYWRlcnM7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNhdmVkSW5zdGFuY2VTdGF0ZSAhPSBudWxsKSB7CisgICAgICAgICAgICBQYXJjZWxhYmxlIHAgPSBzYXZlZEluc3RhbmNlU3RhdGUuZ2V0UGFyY2VsYWJsZShGUkFHTUVOVFNfVEFHKTsKKyAgICAgICAgICAgIG1GcmFnbWVudHMucmVzdG9yZUFsbFN0YXRlKHAsIG1MYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcyAhPSBudWxsCisgICAgICAgICAgICAgICAgICAgID8gbUxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2VzLmZyYWdtZW50cyA6IG51bGwpOworICAgICAgICB9CisgICAgICAgIG1GcmFnbWVudHMuZGlzcGF0Y2hDcmVhdGUoKTsKICAgICAgICAgbUNhbGxlZCA9IHRydWU7CiAgICAgfQogCkBAIC05MzMsNiArOTk1LDEzIEBACiAgICAgICovCiAgICAgcHJvdGVjdGVkIHZvaWQgb25TdGFydCgpIHsKICAgICAgICAgbUNhbGxlZCA9IHRydWU7CisgICAgICAgIG1TdGFydGVkID0gdHJ1ZTsKKyAgICAgICAgaWYgKG1Mb2FkZXJNYW5hZ2VyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1Mb2FkZXJNYW5hZ2VyLmRvU3RhcnQoKTsKKyAgICAgICAgfSBlbHNlIGlmICghbUNoZWNrZWRGb3JMb2FkZXJNYW5hZ2VyKSB7CisgICAgICAgICAgICBtTG9hZGVyTWFuYWdlciA9IGdldExvYWRlck1hbmFnZXIoLTEsIG1TdGFydGVkLCBmYWxzZSk7CisgICAgICAgIH0KKyAgICAgICAgbUNoZWNrZWRGb3JMb2FkZXJNYW5hZ2VyID0gdHJ1ZTsKICAgICB9CiAKICAgICAvKioKQEAgLTEwODUsNiArMTE1NCwxMCBAQAogICAgICAqLwogICAgIHByb3RlY3RlZCB2b2lkIG9uU2F2ZUluc3RhbmNlU3RhdGUoQnVuZGxlIG91dFN0YXRlKSB7CiAgICAgICAgIG91dFN0YXRlLnB1dEJ1bmRsZShXSU5ET1dfSElFUkFSQ0hZX1RBRywgbVdpbmRvdy5zYXZlSGllcmFyY2h5U3RhdGUoKSk7CisgICAgICAgIFBhcmNlbGFibGUgcCA9IG1GcmFnbWVudHMuc2F2ZUFsbFN0YXRlKCk7CisgICAgICAgIGlmIChwICE9IG51bGwpIHsKKyAgICAgICAgICAgIG91dFN0YXRlLnB1dFBhcmNlbGFibGUoRlJBR01FTlRTX1RBRywgcCk7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKQEAgLTE0MDcsNyArMTQ4MCw4IEBACiAgICAgICoge0BsaW5rICNvblJldGFpbk5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZSgpfS4KICAgICAgKi8KICAgICBwdWJsaWMgT2JqZWN0IGdldExhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2UoKSB7Ci0gICAgICAgIHJldHVybiBtTGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZTsKKyAgICAgICAgcmV0dXJuIG1MYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcyAhPSBudWxsCisgICAgICAgICAgICAgICAgPyBtTGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZXMuYWN0aXZpdHkgOiBudWxsOwogICAgIH0KICAgICAKICAgICAvKioKQEAgLTE0MTksNiArMTQ5MywxMSBAQAogICAgICAqIHtAbGluayAjZ2V0TGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZSgpfSBpbiB0aGUgbmV3IGFjdGl2aXR5CiAgICAgICogaW5zdGFuY2UuCiAgICAgICogCisgICAgICogPGVtPklmIHlvdSBhcmUgdGFyZ2V0aW5nIHtAbGluayBhbmRyb2lkLm9zLkJ1aWxkLlZFUlNJT05fQ09ERVMjSE9ORVlDT01CfQorICAgICAqIG9yIGxhdGVyLCBjb25zaWRlciBpbnN0ZWFkIHVzaW5nIGEge0BsaW5rIEZyYWdtZW50fSB3aXRoCisgICAgICoge0BsaW5rIEZyYWdtZW50I3NldFJldGFpbkluc3RhbmNlKGJvb2xlYW4pCisgICAgICogRnJhZ21lbnQuc2V0UmV0YWluSW5zdGFuY2UoYm9vbGVhbn0uPC9lbT4KKyAgICAgKgogICAgICAqIDxwPlRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHB1cmVseSBhcyBhbiBvcHRpbWl6YXRpb24sIGFuZCB5b3UgbXVzdAogICAgICAqIG5vdCByZWx5IG9uIGl0IGJlaW5nIGNhbGxlZC4gIFdoZW4gaXQgaXMgY2FsbGVkLCBhIG51bWJlciBvZiBndWFyYW50ZWVzCiAgICAgICogd2lsbCBiZSBtYWRlIHRvIGhlbHAgb3B0aW1pemUgY29uZmlndXJhdGlvbiBzd2l0Y2hpbmc6CkBAIC0xNDYzLDggKzE1NDIsOSBAQAogICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgb2JqZWN0IHByZXZpb3VzbHkgcmV0dXJuZWQgYnkKICAgICAgKiB7QGxpbmsgI29uUmV0YWluTm9uQ29uZmlndXJhdGlvbkNoaWxkSW5zdGFuY2VzKCl9CiAgICAgICovCi0gICAgSGFzaE1hcDxTdHJpbmcsT2JqZWN0PiBnZXRMYXN0Tm9uQ29uZmlndXJhdGlvbkNoaWxkSW5zdGFuY2VzKCkgewotICAgICAgICByZXR1cm4gbUxhc3ROb25Db25maWd1cmF0aW9uQ2hpbGRJbnN0YW5jZXM7CisgICAgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4gZ2V0TGFzdE5vbkNvbmZpZ3VyYXRpb25DaGlsZEluc3RhbmNlcygpIHsKKyAgICAgICAgcmV0dXJuIG1MYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcyAhPSBudWxsCisgICAgICAgICAgICAgICAgPyBtTGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZXMuY2hpbGRyZW4gOiBudWxsOwogICAgIH0KICAgICAKICAgICAvKioKQEAgLTE0NzgsMTcgKzE1NTgsODggQEAKICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQogICAgIAorICAgIE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZXMgcmV0YWluTm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcygpIHsKKyAgICAgICAgT2JqZWN0IGFjdGl2aXR5ID0gb25SZXRhaW5Ob25Db25maWd1cmF0aW9uSW5zdGFuY2UoKTsKKyAgICAgICAgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4gY2hpbGRyZW4gPSBvblJldGFpbk5vbkNvbmZpZ3VyYXRpb25DaGlsZEluc3RhbmNlcygpOworICAgICAgICBBcnJheUxpc3Q8RnJhZ21lbnQ+IGZyYWdtZW50cyA9IG1GcmFnbWVudHMucmV0YWluTm9uQ29uZmlnKCk7CisgICAgICAgIGJvb2xlYW4gcmV0YWluTG9hZGVycyA9IGZhbHNlOworICAgICAgICBpZiAobUFsbExvYWRlck1hbmFnZXJzICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIHBydW5lIG91dCBhbnkgbG9hZGVyIG1hbmFnZXJzIHRoYXQgd2VyZSBhbHJlYWR5IHN0b3BwZWQgYW5kIHNvCisgICAgICAgICAgICAvLyBoYXZlIG5vdGhpbmcgdXNlZnVsIHRvIHJldGFpbi4KKyAgICAgICAgICAgIGZvciAoaW50IGk9bUFsbExvYWRlck1hbmFnZXJzLnNpemUoKS0xOyBpPj0wOyBpLS0pIHsKKyAgICAgICAgICAgICAgICBMb2FkZXJNYW5hZ2VySW1wbCBsbSA9IG1BbGxMb2FkZXJNYW5hZ2Vycy52YWx1ZUF0KGkpOworICAgICAgICAgICAgICAgIGlmIChsbS5tUmV0YWluaW5nKSB7CisgICAgICAgICAgICAgICAgICAgIHJldGFpbkxvYWRlcnMgPSB0cnVlOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGxtLmRvRGVzdHJveSgpOworICAgICAgICAgICAgICAgICAgICBtQWxsTG9hZGVyTWFuYWdlcnMucmVtb3ZlQXQoaSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChhY3Rpdml0eSA9PSBudWxsICYmIGNoaWxkcmVuID09IG51bGwgJiYgZnJhZ21lbnRzID09IG51bGwgJiYgIXJldGFpbkxvYWRlcnMpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBOb25Db25maWd1cmF0aW9uSW5zdGFuY2VzIG5jaSA9IG5ldyBOb25Db25maWd1cmF0aW9uSW5zdGFuY2VzKCk7CisgICAgICAgIG5jaS5hY3Rpdml0eSA9IGFjdGl2aXR5OworICAgICAgICBuY2kuY2hpbGRyZW4gPSBjaGlsZHJlbjsKKyAgICAgICAgbmNpLmZyYWdtZW50cyA9IGZyYWdtZW50czsKKyAgICAgICAgbmNpLmxvYWRlcnMgPSBtQWxsTG9hZGVyTWFuYWdlcnM7CisgICAgICAgIHJldHVybiBuY2k7CisgICAgfQorICAgIAogICAgIHB1YmxpYyB2b2lkIG9uTG93TWVtb3J5KCkgewogICAgICAgICBtQ2FsbGVkID0gdHJ1ZTsKICAgICB9CiAgICAgCiAgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBGcmFnbWVudE1hbmFnZXIgZm9yIGludGVyYWN0aW5nIHdpdGggZnJhZ21lbnRzIGFzc29jaWF0ZWQKKyAgICAgKiB3aXRoIHRoaXMgYWN0aXZpdHkuCisgICAgICovCisgICAgcHVibGljIEZyYWdtZW50TWFuYWdlciBnZXRGcmFnbWVudE1hbmFnZXIoKSB7CisgICAgICAgIHJldHVybiBtRnJhZ21lbnRzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN0YXJ0IGEgc2VyaWVzIG9mIGVkaXQgb3BlcmF0aW9ucyBvbiB0aGUgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aAorICAgICAqIHRoaXMgYWN0aXZpdHkuCisgICAgICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAjZ2V0RnJhZ21lbnRNYW5hZ2VyfS4KKyAgICAgKi8KKyAgICBARGVwcmVjYXRlZAorICAgIHB1YmxpYyBGcmFnbWVudFRyYW5zYWN0aW9uIG9wZW5GcmFnbWVudFRyYW5zYWN0aW9uKCkgeworICAgICAgICByZXR1cm4gbUZyYWdtZW50cy5vcGVuVHJhbnNhY3Rpb24oKTsKKyAgICB9CisgICAgCisgICAgdm9pZCBpbnZhbGlkYXRlRnJhZ21lbnRJbmRleChpbnQgaW5kZXgpIHsKKyAgICAgICAgLy9Mb2cudihUQUcsICJpbnZhbGlkYXRlRnJhZ21lbnRJbmRleDogaW5kZXg9IiArIGluZGV4KTsKKyAgICAgICAgaWYgKG1BbGxMb2FkZXJNYW5hZ2VycyAhPSBudWxsKSB7CisgICAgICAgICAgICBMb2FkZXJNYW5hZ2VySW1wbCBsbSA9IG1BbGxMb2FkZXJNYW5hZ2Vycy5nZXQoaW5kZXgpOworICAgICAgICAgICAgaWYgKGxtICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBsbS5kb0Rlc3Ryb3koKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1BbGxMb2FkZXJNYW5hZ2Vycy5yZW1vdmUoaW5kZXgpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIENhbGxlZCB3aGVuIGEgRnJhZ21lbnQgaXMgYmVpbmcgYXR0YWNoZWQgdG8gdGhpcyBhY3Rpdml0eSwgaW1tZWRpYXRlbHkKKyAgICAgKiBhZnRlciB0aGUgY2FsbCB0byBpdHMge0BsaW5rIEZyYWdtZW50I29uQXR0YWNoIEZyYWdtZW50Lm9uQXR0YWNoKCl9CisgICAgICogbWV0aG9kIGFuZCBiZWZvcmUge0BsaW5rIEZyYWdtZW50I29uQ3JlYXRlIEZyYWdtZW50Lm9uQ3JlYXRlKCl9LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uQXR0YWNoRnJhZ21lbnQoRnJhZ21lbnQgZnJhZ21lbnQpIHsKKyAgICB9CisgICAgCisgICAgLyoqCiAgICAgICogV3JhcHBlciBhcm91bmQKICAgICAgKiB7QGxpbmsgQ29udGVudFJlc29sdmVyI3F1ZXJ5KGFuZHJvaWQubmV0LlVyaSAsIFN0cmluZ1tdLCBTdHJpbmcsIFN0cmluZ1tdLCBTdHJpbmcpfQogICAgICAqIHRoYXQgZ2l2ZXMgdGhlIHJlc3VsdGluZyB7QGxpbmsgQ3Vyc29yfSB0byBjYWxsCiAgICAgICoge0BsaW5rICNzdGFydE1hbmFnaW5nQ3Vyc29yfSBzbyB0aGF0IHRoZSBhY3Rpdml0eSB3aWxsIG1hbmFnZSBpdHMKICAgICAgKiBsaWZlY3ljbGUgZm9yIHlvdS4KICAgICAgKiAKKyAgICAgKiA8ZW0+SWYgeW91IGFyZSB0YXJnZXRpbmcge0BsaW5rIGFuZHJvaWQub3MuQnVpbGQuVkVSU0lPTl9DT0RFUyNIT05FWUNPTUJ9CisgICAgICogb3IgbGF0ZXIsIGNvbnNpZGVyIGluc3RlYWQgdXNpbmcge0BsaW5rIExvYWRlck1hbmFnZXJ9IGluc3RlYWQsIGF2YWlsYWJsZQorICAgICAqIHZpYSB7QGxpbmsgI2dldExvYWRlck1hbmFnZXIoKX0uPC9lbT4KKyAgICAgKgogICAgICAqIEBwYXJhbSB1cmkgVGhlIFVSSSBvZiB0aGUgY29udGVudCBwcm92aWRlciB0byBxdWVyeS4KICAgICAgKiBAcGFyYW0gcHJvamVjdGlvbiBMaXN0IG9mIGNvbHVtbnMgdG8gcmV0dXJuLgogICAgICAqIEBwYXJhbSBzZWxlY3Rpb24gU1FMIFdIRVJFIGNsYXVzZS4KQEAgLTE1MDAsMTEgKzE2NTEsOCBAQAogICAgICAqIEBzZWUgI3N0YXJ0TWFuYWdpbmdDdXJzb3IKICAgICAgKiBAaGlkZQogICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBDdXJzb3IgbWFuYWdlZFF1ZXJ5KFVyaSB1cmksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gcHJvamVjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2VsZWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzb3J0T3JkZXIpCi0gICAgeworICAgIHB1YmxpYyBmaW5hbCBDdXJzb3IgbWFuYWdlZFF1ZXJ5KFVyaSB1cmksIFN0cmluZ1tdIHByb2plY3Rpb24sIFN0cmluZyBzZWxlY3Rpb24sCisgICAgICAgICAgICBTdHJpbmcgc29ydE9yZGVyKSB7CiAgICAgICAgIEN1cnNvciBjID0gZ2V0Q29udGVudFJlc29sdmVyKCkucXVlcnkodXJpLCBwcm9qZWN0aW9uLCBzZWxlY3Rpb24sIG51bGwsIHNvcnRPcmRlcik7CiAgICAgICAgIGlmIChjICE9IG51bGwpIHsKICAgICAgICAgICAgIHN0YXJ0TWFuYWdpbmdDdXJzb3IoYyk7CkBAIC0xNTE5LDYgKzE2NjcsMTAgQEAKICAgICAgKiB7QGxpbmsgI3N0YXJ0TWFuYWdpbmdDdXJzb3J9IHNvIHRoYXQgdGhlIGFjdGl2aXR5IHdpbGwgbWFuYWdlIGl0cwogICAgICAqIGxpZmVjeWNsZSBmb3IgeW91LgogICAgICAqIAorICAgICAqIDxlbT5JZiB5b3UgYXJlIHRhcmdldGluZyB7QGxpbmsgYW5kcm9pZC5vcy5CdWlsZC5WRVJTSU9OX0NPREVTI0hPTkVZQ09NQn0KKyAgICAgKiBvciBsYXRlciwgY29uc2lkZXIgaW5zdGVhZCB1c2luZyB7QGxpbmsgTG9hZGVyTWFuYWdlcn0gaW5zdGVhZCwgYXZhaWxhYmxlCisgICAgICogdmlhIHtAbGluayAjZ2V0TG9hZGVyTWFuYWdlcigpfS48L2VtPgorICAgICAqCiAgICAgICogQHBhcmFtIHVyaSBUaGUgVVJJIG9mIHRoZSBjb250ZW50IHByb3ZpZGVyIHRvIHF1ZXJ5LgogICAgICAqIEBwYXJhbSBwcm9qZWN0aW9uIExpc3Qgb2YgY29sdW1ucyB0byByZXR1cm4uCiAgICAgICogQHBhcmFtIHNlbGVjdGlvbiBTUUwgV0hFUkUgY2xhdXNlLgpAQCAtMTUzMCwxMiArMTY4Miw4IEBACiAgICAgICogQHNlZSBDb250ZW50UmVzb2x2ZXIjcXVlcnkoYW5kcm9pZC5uZXQuVXJpICwgU3RyaW5nW10sIFN0cmluZywgU3RyaW5nW10sIFN0cmluZykKICAgICAgKiBAc2VlICNzdGFydE1hbmFnaW5nQ3Vyc29yCiAgICAgICovCi0gICAgcHVibGljIGZpbmFsIEN1cnNvciBtYW5hZ2VkUXVlcnkoVXJpIHVyaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSBwcm9qZWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZWxlY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gc2VsZWN0aW9uQXJncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc29ydE9yZGVyKQotICAgIHsKKyAgICBwdWJsaWMgZmluYWwgQ3Vyc29yIG1hbmFnZWRRdWVyeShVcmkgdXJpLCBTdHJpbmdbXSBwcm9qZWN0aW9uLCBTdHJpbmcgc2VsZWN0aW9uLAorICAgICAgICAgICAgU3RyaW5nW10gc2VsZWN0aW9uQXJncywgU3RyaW5nIHNvcnRPcmRlcikgewogICAgICAgICBDdXJzb3IgYyA9IGdldENvbnRlbnRSZXNvbHZlcigpLnF1ZXJ5KHVyaSwgcHJvamVjdGlvbiwgc2VsZWN0aW9uLCBzZWxlY3Rpb25BcmdzLCBzb3J0T3JkZXIpOwogICAgICAgICBpZiAoYyAhPSBudWxsKSB7CiAgICAgICAgICAgICBzdGFydE1hbmFnaW5nQ3Vyc29yKGMpOwpAQCAtMTU0NCw0MCArMTY5Miw2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogV3JhcHBlciBhcm91bmQge0BsaW5rIEN1cnNvciNjb21taXRVcGRhdGVzKCl9IHRoYXQgdGFrZXMgY2FyZSBvZiBub3RpbmcKLSAgICAgKiB0aGF0IHRoZSBDdXJzb3IgbmVlZHMgdG8gYmUgcmVxdWVyaWVkLiAgWW91IGNhbiBjYWxsIHRoaXMgbWV0aG9kIGluCi0gICAgICoge0BsaW5rICNvblBhdXNlfSBvciB7QGxpbmsgI29uU3RvcH0gdG8gaGF2ZSB0aGUgc3lzdGVtIGNhbGwKLSAgICAgKiB7QGxpbmsgQ3Vyc29yI3JlcXVlcnl9IGZvciB5b3UgaWYgdGhlIGFjdGl2aXR5IGlzIGxhdGVyIHJlc3VtZWQuICBUaGlzCi0gICAgICogYWxsb3dzIHlvdSB0byBhdm9pZCBkZXRlcm1pbmcgd2hlbiB0byBkbyB0aGUgcmVxdWVyeSB5b3Vyc2VsZiAod2hpY2ggaXMKLSAgICAgKiByZXF1aXJlZCBmb3IgdGhlIEN1cnNvciB0byBzZWUgYW55IGRhdGEgY2hhbmdlcyB0aGF0IHdlcmUgY29tbWl0dGVkIHdpdGgKLSAgICAgKiBpdCkuCi0gICAgICogCi0gICAgICogQHBhcmFtIGMgVGhlIEN1cnNvciB3aG9zZSBjaGFuZ2VzIGFyZSB0byBiZSBjb21taXR0ZWQuCi0gICAgICogCi0gICAgICogQHNlZSAjbWFuYWdlZFF1ZXJ5KGFuZHJvaWQubmV0LlVyaSAsIFN0cmluZ1tdLCBTdHJpbmcsIFN0cmluZ1tdLCBTdHJpbmcpCi0gICAgICogQHNlZSAjc3RhcnRNYW5hZ2luZ0N1cnNvcgotICAgICAqIEBzZWUgQ3Vyc29yI2NvbW1pdFVwZGF0ZXMoKQotICAgICAqIEBzZWUgQ3Vyc29yI3JlcXVlcnkKLSAgICAgKiBAaGlkZQotICAgICAqLwotICAgIEBEZXByZWNhdGVkCi0gICAgcHVibGljIHZvaWQgbWFuYWdlZENvbW1pdFVwZGF0ZXMoQ3Vyc29yIGMpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTWFuYWdlZEN1cnNvcnMpIHsKLSAgICAgICAgICAgIGZpbmFsIGludCBOID0gbU1hbmFnZWRDdXJzb3JzLnNpemUoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxOOyBpKyspIHsKLSAgICAgICAgICAgICAgICBNYW5hZ2VkQ3Vyc29yIG1jID0gbU1hbmFnZWRDdXJzb3JzLmdldChpKTsKLSAgICAgICAgICAgICAgICBpZiAobWMubUN1cnNvciA9PSBjKSB7Ci0gICAgICAgICAgICAgICAgICAgIGMuY29tbWl0VXBkYXRlcygpOwotICAgICAgICAgICAgICAgICAgICBtYy5tVXBkYXRlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAiQ3Vyc29yICIgKyBjICsgIiBpcyBub3QgY3VycmVudGx5IG1hbmFnZWQiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgogICAgICAqIFRoaXMgbWV0aG9kIGFsbG93cyB0aGUgYWN0aXZpdHkgdG8gdGFrZSBjYXJlIG9mIG1hbmFnaW5nIHRoZSBnaXZlbgogICAgICAqIHtAbGluayBDdXJzb3J9J3MgbGlmZWN5Y2xlIGZvciB5b3UgYmFzZWQgb24gdGhlIGFjdGl2aXR5J3MgbGlmZWN5Y2xlLgogICAgICAqIFRoYXQgaXMsIHdoZW4gdGhlIGFjdGl2aXR5IGlzIHN0b3BwZWQgaXQgd2lsbCBhdXRvbWF0aWNhbGx5IGNhbGwKQEAgLTE1ODUsNiArMTY5OSwxMCBAQAogICAgICAqIGl0IHdpbGwgY2FsbCB7QGxpbmsgQ3Vyc29yI3JlcXVlcnl9IGZvciB5b3UuICBXaGVuIHRoZSBhY3Rpdml0eSBpcwogICAgICAqIGRlc3Ryb3llZCwgYWxsIG1hbmFnZWQgQ3Vyc29ycyB3aWxsIGJlIGNsb3NlZCBhdXRvbWF0aWNhbGx5LgogICAgICAqIAorICAgICAqIDxlbT5JZiB5b3UgYXJlIHRhcmdldGluZyB7QGxpbmsgYW5kcm9pZC5vcy5CdWlsZC5WRVJTSU9OX0NPREVTI0hPTkVZQ09NQn0KKyAgICAgKiBvciBsYXRlciwgY29uc2lkZXIgaW5zdGVhZCB1c2luZyB7QGxpbmsgTG9hZGVyTWFuYWdlcn0gaW5zdGVhZCwgYXZhaWxhYmxlCisgICAgICogdmlhIHtAbGluayAjZ2V0TG9hZGVyTWFuYWdlcigpfS48L2VtPgorICAgICAqCiAgICAgICogQHBhcmFtIGMgVGhlIEN1cnNvciB0byBiZSBtYW5hZ2VkLgogICAgICAqIAogICAgICAqIEBzZWUgI21hbmFnZWRRdWVyeShhbmRyb2lkLm5ldC5VcmkgLCBTdHJpbmdbXSwgU3RyaW5nLCBTdHJpbmdbXSwgU3RyaW5nKQpAQCAtMTY1NSw3ICsxNzczLDU0IEBACiAgICAgcHVibGljIFZpZXcgZmluZFZpZXdCeUlkKGludCBpZCkgewogICAgICAgICByZXR1cm4gZ2V0V2luZG93KCkuZmluZFZpZXdCeUlkKGlkKTsKICAgICB9Ci0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZSBhIHJlZmVyZW5jZSB0byB0aGlzIGFjdGl2aXR5J3MgQWN0aW9uQmFyLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgQWN0aXZpdHkncyBBY3Rpb25CYXIsIG9yIG51bGwgaWYgaXQgZG9lcyBub3QgaGF2ZSBvbmUuCisgICAgICovCisgICAgcHVibGljIEFjdGlvbkJhciBnZXRBY3Rpb25CYXIoKSB7CisgICAgICAgIGluaXRBY3Rpb25CYXIoKTsKKyAgICAgICAgcmV0dXJuIG1BY3Rpb25CYXI7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgQWN0aW9uQmFyLCBsb2NhdGVzIHRoZSBpbmZsYXRlZCBBY3Rpb25CYXJWaWV3LAorICAgICAqIGluaXRpYWxpemVzIHRoZSBBY3Rpb25CYXIgd2l0aCB0aGUgdmlldywgYW5kIHNldHMgbUFjdGlvbkJhci4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgaW5pdEFjdGlvbkJhcigpIHsKKyAgICAgICAgV2luZG93IHdpbmRvdyA9IGdldFdpbmRvdygpOworICAgICAgICBpZiAoaXNDaGlsZCgpIHx8ICF3aW5kb3cuaGFzRmVhdHVyZShXaW5kb3cuRkVBVFVSRV9BQ1RJT05fQkFSKSB8fCBtQWN0aW9uQmFyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgbUFjdGlvbkJhciA9IG5ldyBBY3Rpb25CYXJJbXBsKHRoaXMpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBGaW5kcyBhIGZyYWdtZW50IHRoYXQgd2FzIGlkZW50aWZpZWQgYnkgdGhlIGdpdmVuIGlkIGVpdGhlciB3aGVuIGluZmxhdGVkCisgICAgICogZnJvbSBYTUwgb3IgYXMgdGhlIGNvbnRhaW5lciBJRCB3aGVuIGFkZGVkIGluIGEgdHJhbnNhY3Rpb24uICBUaGlzIG9ubHkKKyAgICAgKiByZXR1cm5zIGZyYWdtZW50cyB0aGF0IGFyZSBjdXJyZW50bHkgYWRkZWQgdG8gdGhlIGFjdGl2aXR5J3MgY29udGVudC4KKyAgICAgKiBAcmV0dXJuIFRoZSBmcmFnbWVudCBpZiBmb3VuZCBvciBudWxsIG90aGVyd2lzZS4KKyAgICAgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rICNnZXRGcmFnbWVudE1hbmFnZXJ9LgorICAgICAqLworICAgIEBEZXByZWNhdGVkCisgICAgcHVibGljIEZyYWdtZW50IGZpbmRGcmFnbWVudEJ5SWQoaW50IGlkKSB7CisgICAgICAgIHJldHVybiBtRnJhZ21lbnRzLmZpbmRGcmFnbWVudEJ5SWQoaWQpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBGaW5kcyBhIGZyYWdtZW50IHRoYXQgd2FzIGlkZW50aWZpZWQgYnkgdGhlIGdpdmVuIHRhZyBlaXRoZXIgd2hlbiBpbmZsYXRlZAorICAgICAqIGZyb20gWE1MIG9yIGFzIHN1cHBsaWVkIHdoZW4gYWRkZWQgaW4gYSB0cmFuc2FjdGlvbi4gIFRoaXMgb25seQorICAgICAqIHJldHVybnMgZnJhZ21lbnRzIHRoYXQgYXJlIGN1cnJlbnRseSBhZGRlZCB0byB0aGUgYWN0aXZpdHkncyBjb250ZW50LgorICAgICAqIEByZXR1cm4gVGhlIGZyYWdtZW50IGlmIGZvdW5kIG9yIG51bGwgb3RoZXJ3aXNlLgorICAgICAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgI2dldEZyYWdtZW50TWFuYWdlcn0uCisgICAgICovCisgICAgQERlcHJlY2F0ZWQKKyAgICBwdWJsaWMgRnJhZ21lbnQgZmluZEZyYWdtZW50QnlUYWcoU3RyaW5nIHRhZykgeworICAgICAgICByZXR1cm4gbUZyYWdtZW50cy5maW5kRnJhZ21lbnRCeVRhZyh0YWcpOworICAgIH0KKyAgICAKICAgICAvKioKICAgICAgKiBTZXQgdGhlIGFjdGl2aXR5IGNvbnRlbnQgZnJvbSBhIGxheW91dCByZXNvdXJjZS4gIFRoZSByZXNvdXJjZSB3aWxsIGJlCiAgICAgICogaW5mbGF0ZWQsIGFkZGluZyBhbGwgdG9wLWxldmVsIHZpZXdzIHRvIHRoZSBhY3Rpdml0eS4KQEAgLTE2NjQsNiArMTgyOSw3IEBACiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0Q29udGVudFZpZXcoaW50IGxheW91dFJlc0lEKSB7CiAgICAgICAgIGdldFdpbmRvdygpLnNldENvbnRlbnRWaWV3KGxheW91dFJlc0lEKTsKKyAgICAgICAgaW5pdEFjdGlvbkJhcigpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTY3NSw2ICsxODQxLDcgQEAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRDb250ZW50VmlldyhWaWV3IHZpZXcpIHsKICAgICAgICAgZ2V0V2luZG93KCkuc2V0Q29udGVudFZpZXcodmlldyk7CisgICAgICAgIGluaXRBY3Rpb25CYXIoKTsKICAgICB9CiAKICAgICAvKioKQEAgLTE2ODcsNiArMTg1NCw3IEBACiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0Q29udGVudFZpZXcoVmlldyB2aWV3LCBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zIHBhcmFtcykgewogICAgICAgICBnZXRXaW5kb3coKS5zZXRDb250ZW50Vmlldyh2aWV3LCBwYXJhbXMpOworICAgICAgICBpbml0QWN0aW9uQmFyKCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xNjk4LDYgKzE4NjYsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGFkZENvbnRlbnRWaWV3KFZpZXcgdmlldywgVmlld0dyb3VwLkxheW91dFBhcmFtcyBwYXJhbXMpIHsKICAgICAgICAgZ2V0V2luZG93KCkuYWRkQ29udGVudFZpZXcodmlldywgcGFyYW1zKTsKKyAgICAgICAgaW5pdEFjdGlvbkJhcigpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTkyMSwxMiArMjA5MCw2NSBAQAogICAgIH0KICAgICAKICAgICAvKioKKyAgICAgKiBGbGFnIGZvciB7QGxpbmsgI3BvcEJhY2tTdGFjayhTdHJpbmcsIGludCl9CisgICAgICogYW5kIHtAbGluayAjcG9wQmFja1N0YWNrKGludCwgaW50KX06IElmIHNldCwgYW5kIHRoZSBuYW1lIG9yIElEIG9mCisgICAgICogYSBiYWNrIHN0YWNrIGVudHJ5IGhhcyBiZWVuIHN1cHBsaWVkLCB0aGVuIGFsbCBtYXRjaGluZyBlbnRyaWVzIHdpbGwKKyAgICAgKiBiZSBjb25zdW1lZCB1bnRpbCBvbmUgdGhhdCBkb2Vzbid0IG1hdGNoIGlzIGZvdW5kIG9yIHRoZSBib3R0b20gb2YKKyAgICAgKiB0aGUgc3RhY2sgaXMgcmVhY2hlZC4gIE90aGVyd2lzZSwgYWxsIGVudHJpZXMgdXAgdG8gYnV0IG5vdCBpbmNsdWRpbmcgdGhhdCBlbnRyeQorICAgICAqIHdpbGwgYmUgcmVtb3ZlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQT1BfQkFDS19TVEFDS19JTkNMVVNJVkUgPSAxPDwwOworCisgICAgLyoqCisgICAgICogUG9wIHRoZSB0b3Agc3RhdGUgb2ZmIHRoZSBiYWNrIHN0YWNrLiAgUmV0dXJucyB0cnVlIGlmIHRoZXJlIHdhcyBvbmUKKyAgICAgKiB0byBwb3AsIGVsc2UgZmFsc2UuCisgICAgICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAjZ2V0RnJhZ21lbnRNYW5hZ2VyfS4KKyAgICAgKi8KKyAgICBARGVwcmVjYXRlZAorICAgIHB1YmxpYyBib29sZWFuIHBvcEJhY2tTdGFjaygpIHsKKyAgICAgICAgcmV0dXJuIG1GcmFnbWVudHMucG9wQmFja1N0YWNrKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUG9wIHRoZSBsYXN0IGZyYWdtZW50IHRyYW5zaXRpb24gZnJvbSB0aGUgbG9jYWwgYWN0aXZpdHkncyBmcmFnbWVudAorICAgICAqIGJhY2sgc3RhY2suICBJZiB0aGVyZSBpcyBub3RoaW5nIHRvIHBvcCwgZmFsc2UgaXMgcmV0dXJuZWQuCisgICAgICogQHBhcmFtIG5hbWUgSWYgbm9uLW51bGwsIHRoaXMgaXMgdGhlIG5hbWUgb2YgYSBwcmV2aW91cyBiYWNrIHN0YXRlCisgICAgICogdG8gbG9vayBmb3I7IGlmIGZvdW5kLCBhbGwgc3RhdGVzIHVwIHRvIHRoYXQgc3RhdGUgd2lsbCBiZSBwb3BwZWQuICBUaGUKKyAgICAgKiB7QGxpbmsgI1BPUF9CQUNLX1NUQUNLX0lOQ0xVU0lWRX0gZmxhZyBjYW4gYmUgdXNlZCB0byBjb250cm9sIHdoZXRoZXIKKyAgICAgKiB0aGUgbmFtZWQgc3RhdGUgaXRzZWxmIGlzIHBvcHBlZC4gSWYgbnVsbCwgb25seSB0aGUgdG9wIHN0YXRlIGlzIHBvcHBlZC4KKyAgICAgKiBAcGFyYW0gZmxhZ3MgRWl0aGVyIDAgb3Ige0BsaW5rICNQT1BfQkFDS19TVEFDS19JTkNMVVNJVkV9LgorICAgICAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgI2dldEZyYWdtZW50TWFuYWdlcn0uCisgICAgICovCisgICAgQERlcHJlY2F0ZWQKKyAgICBwdWJsaWMgYm9vbGVhbiBwb3BCYWNrU3RhY2soU3RyaW5nIG5hbWUsIGludCBmbGFncykgeworICAgICAgICByZXR1cm4gbUZyYWdtZW50cy5wb3BCYWNrU3RhY2sobmFtZSwgZmxhZ3MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBvcCBhbGwgYmFjayBzdGFjayBzdGF0ZXMgdXAgdG8gdGhlIG9uZSB3aXRoIHRoZSBnaXZlbiBpZGVudGlmaWVyLgorICAgICAqIEBwYXJhbSBpZCBJZGVudGlmaWVyIG9mIHRoZSBzdGF0ZWQgdG8gYmUgcG9wcGVkLiBJZiBubyBpZGVudGlmaWVyIGV4aXN0cywKKyAgICAgKiBmYWxzZSBpcyByZXR1cm5lZC4KKyAgICAgKiBUaGUgaWRlbnRpZmllciBpcyB0aGUgbnVtYmVyIHJldHVybmVkIGJ5CisgICAgICoge0BsaW5rIEZyYWdtZW50VHJhbnNhY3Rpb24jY29tbWl0KCkgRnJhZ21lbnRUcmFuc2FjdGlvbi5jb21taXQoKX0uICBUaGUKKyAgICAgKiB7QGxpbmsgI1BPUF9CQUNLX1NUQUNLX0lOQ0xVU0lWRX0gZmxhZyBjYW4gYmUgdXNlZCB0byBjb250cm9sIHdoZXRoZXIKKyAgICAgKiB0aGUgbmFtZWQgc3RhdGUgaXRzZWxmIGlzIHBvcHBlZC4KKyAgICAgKiBAcGFyYW0gZmxhZ3MgRWl0aGVyIDAgb3Ige0BsaW5rICNQT1BfQkFDS19TVEFDS19JTkNMVVNJVkV9LgorICAgICAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgI2dldEZyYWdtZW50TWFuYWdlcn0uCisgICAgICovCisgICAgQERlcHJlY2F0ZWQKKyAgICBwdWJsaWMgYm9vbGVhbiBwb3BCYWNrU3RhY2soaW50IGlkLCBpbnQgZmxhZ3MpIHsKKyAgICAgICAgcmV0dXJuIG1GcmFnbWVudHMucG9wQmFja1N0YWNrKGlkLCBmbGFncyk7CisgICAgfQorICAgIAorICAgIC8qKgogICAgICAqIENhbGxlZCB3aGVuIHRoZSBhY3Rpdml0eSBoYXMgZGV0ZWN0ZWQgdGhlIHVzZXIncyBwcmVzcyBvZiB0aGUgYmFjawogICAgICAqIGtleS4gIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHNpbXBseSBmaW5pc2hlcyB0aGUgY3VycmVudCBhY3Rpdml0eSwKICAgICAgKiBidXQgeW91IGNhbiBvdmVycmlkZSB0aGlzIHRvIGRvIHdoYXRldmVyIHlvdSB3YW50LgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIG9uQmFja1ByZXNzZWQoKSB7Ci0gICAgICAgIGZpbmlzaCgpOworICAgICAgICBpZiAoIW1GcmFnbWVudHMucG9wQmFja1N0YWNrKCkpIHsKKyAgICAgICAgICAgIGZpbmlzaCgpOworICAgICAgICB9CiAgICAgfQogICAgIAogICAgIC8qKgpAQCAtMjE2NCw3ICsyMzg2LDkgQEAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBvbkNyZWF0ZVBhbmVsTWVudShpbnQgZmVhdHVyZUlkLCBNZW51IG1lbnUpIHsKICAgICAgICAgaWYgKGZlYXR1cmVJZCA9PSBXaW5kb3cuRkVBVFVSRV9PUFRJT05TX1BBTkVMKSB7Ci0gICAgICAgICAgICByZXR1cm4gb25DcmVhdGVPcHRpb25zTWVudShtZW51KTsKKyAgICAgICAgICAgIGJvb2xlYW4gc2hvdyA9IG9uQ3JlYXRlT3B0aW9uc01lbnUobWVudSk7CisgICAgICAgICAgICBzaG93IHw9IG1GcmFnbWVudHMuZGlzcGF0Y2hDcmVhdGVPcHRpb25zTWVudShtZW51LCBnZXRNZW51SW5mbGF0ZXIoKSk7CisgICAgICAgICAgICByZXR1cm4gc2hvdzsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQpAQCAtMjE4MSw2ICsyNDA1LDcgQEAKICAgICBwdWJsaWMgYm9vbGVhbiBvblByZXBhcmVQYW5lbChpbnQgZmVhdHVyZUlkLCBWaWV3IHZpZXcsIE1lbnUgbWVudSkgewogICAgICAgICBpZiAoZmVhdHVyZUlkID09IFdpbmRvdy5GRUFUVVJFX09QVElPTlNfUEFORUwgJiYgbWVudSAhPSBudWxsKSB7CiAgICAgICAgICAgICBib29sZWFuIGdvZm9yaXQgPSBvblByZXBhcmVPcHRpb25zTWVudShtZW51KTsKKyAgICAgICAgICAgIGdvZm9yaXQgfD0gbUZyYWdtZW50cy5kaXNwYXRjaFByZXBhcmVPcHRpb25zTWVudShtZW51KTsKICAgICAgICAgICAgIHJldHVybiBnb2Zvcml0ICYmIG1lbnUuaGFzVmlzaWJsZUl0ZW1zKCk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHRydWU7CkBAIC0yMjExLDExICsyNDM2LDE3IEBACiAgICAgICAgICAgICAgICAgLy8gZG9lc24ndCBjYWxsIHRocm91Z2ggdG8gc3VwZXJjbGFzcydzIGltcGxtZWVudGF0aW9uIG9mIGVhY2gKICAgICAgICAgICAgICAgICAvLyBvZiB0aGVzZSBtZXRob2RzIGJlbG93CiAgICAgICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudCg1MDAwMCwgMCwgaXRlbS5nZXRUaXRsZUNvbmRlbnNlZCgpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gb25PcHRpb25zSXRlbVNlbGVjdGVkKGl0ZW0pOworICAgICAgICAgICAgICAgIGlmIChvbk9wdGlvbnNJdGVtU2VsZWN0ZWQoaXRlbSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBtRnJhZ21lbnRzLmRpc3BhdGNoT3B0aW9uc0l0ZW1TZWxlY3RlZChpdGVtKTsKICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgIGNhc2UgV2luZG93LkZFQVRVUkVfQ09OVEVYVF9NRU5VOgogICAgICAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoNTAwMDAsIDEsIGl0ZW0uZ2V0VGl0bGVDb25kZW5zZWQoKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG9uQ29udGV4dEl0ZW1TZWxlY3RlZChpdGVtKTsKKyAgICAgICAgICAgICAgICBpZiAob25Db250ZXh0SXRlbVNlbGVjdGVkKGl0ZW0pKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gbUZyYWdtZW50cy5kaXNwYXRjaENvbnRleHRJdGVtU2VsZWN0ZWQoaXRlbSk7CiAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTIyMzQsNiArMjQ2NSw3IEBACiAgICAgcHVibGljIHZvaWQgb25QYW5lbENsb3NlZChpbnQgZmVhdHVyZUlkLCBNZW51IG1lbnUpIHsKICAgICAgICAgc3dpdGNoIChmZWF0dXJlSWQpIHsKICAgICAgICAgICAgIGNhc2UgV2luZG93LkZFQVRVUkVfT1BUSU9OU19QQU5FTDoKKyAgICAgICAgICAgICAgICBtRnJhZ21lbnRzLmRpc3BhdGNoT3B0aW9uc01lbnVDbG9zZWQobWVudSk7CiAgICAgICAgICAgICAgICAgb25PcHRpb25zTWVudUNsb3NlZChtZW51KTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAKQEAgLTIyNDQsNiArMjQ3NiwxNSBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIERlY2xhcmUgdGhhdCB0aGUgb3B0aW9ucyBtZW51IGhhcyBjaGFuZ2VkLCBzbyBzaG91bGQgYmUgcmVjcmVhdGVkLgorICAgICAqIFRoZSB7QGxpbmsgI29uQ3JlYXRlT3B0aW9uc01lbnUoTWVudSl9IG1ldGhvZCB3aWxsIGJlIGNhbGxlZCB0aGUgbmV4dAorICAgICAqIHRpbWUgaXQgbmVlZHMgdG8gYmUgZGlzcGxheWVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGludmFsaWRhdGVPcHRpb25zTWVudSgpIHsKKyAgICAgICAgbVdpbmRvdy5pbnZhbGlkYXRlUGFuZWxNZW51KFdpbmRvdy5GRUFUVVJFX09QVElPTlNfUEFORUwpOworICAgIH0KKyAgICAKKyAgICAvKioKICAgICAgKiBJbml0aWFsaXplIHRoZSBjb250ZW50cyBvZiB0aGUgQWN0aXZpdHkncyBzdGFuZGFyZCBvcHRpb25zIG1lbnUuICBZb3UKICAgICAgKiBzaG91bGQgcGxhY2UgeW91ciBtZW51IGl0ZW1zIGluIHRvIDx2YXI+bWVudTwvdmFyPi4KICAgICAgKiAKQEAgLTI0NjYsNiArMjcwNyw5IEBACiAgICAgICogYnkgdGhlIGFjdGl2aXR5LiAgVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gY2FsbHMgdGhyb3VnaCB0bwogICAgICAqIHtAbGluayAjb25DcmVhdGVEaWFsb2coaW50KX0gZm9yIGNvbXBhdGliaWxpdHkuCiAgICAgICoKKyAgICAgKiA8ZW0+SWYgeW91IGFyZSB0YXJnZXRpbmcge0BsaW5rIGFuZHJvaWQub3MuQnVpbGQuVkVSU0lPTl9DT0RFUyNIT05FWUNPTUJ9CisgICAgICogb3IgbGF0ZXIsIGNvbnNpZGVyIGluc3RlYWQgdXNpbmcgYSB7QGxpbmsgRGlhbG9nRnJhZ21lbnR9IGluc3RlYWQuPC9lbT4KKyAgICAgKgogICAgICAqIDxwPklmIHlvdSB1c2Uge0BsaW5rICNzaG93RGlhbG9nKGludCl9LCB0aGUgYWN0aXZpdHkgd2lsbCBjYWxsIHRocm91Z2ggdG8KICAgICAgKiB0aGlzIG1ldGhvZCB0aGUgZmlyc3QgdGltZSwgYW5kIGhhbmcgb250byBpdCB0aGVyZWFmdGVyLiAgQW55IGRpYWxvZwogICAgICAqIHRoYXQgaXMgY3JlYXRlZCBieSB0aGlzIG1ldGhvZCB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgc2F2ZWQgYW5kIHJlc3RvcmVkCkBAIC0yNTM4LDYgKzI3ODIsOSBAQAogICAgICAqIHdpbGwgYmUgbWFkZSB3aXRoIHRoZSBzYW1lIGlkIHRoZSBmaXJzdCB0aW1lIHRoaXMgaXMgY2FsbGVkIGZvciBhIGdpdmVuCiAgICAgICogaWQuICBGcm9tIHRoZXJlYWZ0ZXIsIHRoZSBkaWFsb2cgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHNhdmVkIGFuZCByZXN0b3JlZC4KICAgICAgKgorICAgICAqIDxlbT5JZiB5b3UgYXJlIHRhcmdldGluZyB7QGxpbmsgYW5kcm9pZC5vcy5CdWlsZC5WRVJTSU9OX0NPREVTI0hPTkVZQ09NQn0KKyAgICAgKiBvciBsYXRlciwgY29uc2lkZXIgaW5zdGVhZCB1c2luZyBhIHtAbGluayBEaWFsb2dGcmFnbWVudH0gaW5zdGVhZC48L2VtPgorICAgICAqCiAgICAgICogPHA+RWFjaCB0aW1lIGEgZGlhbG9nIGlzIHNob3duLCB7QGxpbmsgI29uUHJlcGFyZURpYWxvZyhpbnQsIERpYWxvZywgQnVuZGxlKX0gd2lsbAogICAgICAqIGJlIG1hZGUgdG8gcHJvdmlkZSBhbiBvcHBvcnR1bml0eSB0byBkbyBhbnkgdGltZWx5IHByZXBhcmF0aW9uLgogICAgICAqCkBAIC0zMDg1LDYgKzMzMzIsMzYgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBUaGlzIGlzIGNhbGxlZCB3aGVuIGEgRnJhZ21lbnQgaW4gdGhpcyBhY3Rpdml0eSBjYWxscyBpdHMgCisgICAgICoge0BsaW5rIEZyYWdtZW50I3N0YXJ0QWN0aXZpdHl9IG9yIHtAbGluayBGcmFnbWVudCNzdGFydEFjdGl2aXR5Rm9yUmVzdWx0fQorICAgICAqIG1ldGhvZC4KKyAgICAgKiAKKyAgICAgKiA8cD5UaGlzIG1ldGhvZCB0aHJvd3Mge0BsaW5rIGFuZHJvaWQuY29udGVudC5BY3Rpdml0eU5vdEZvdW5kRXhjZXB0aW9ufQorICAgICAqIGlmIHRoZXJlIHdhcyBubyBBY3Rpdml0eSBmb3VuZCB0byBydW4gdGhlIGdpdmVuIEludGVudC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZnJhZ21lbnQgVGhlIGZyYWdtZW50IG1ha2luZyB0aGUgY2FsbC4KKyAgICAgKiBAcGFyYW0gaW50ZW50IFRoZSBpbnRlbnQgdG8gc3RhcnQuCisgICAgICogQHBhcmFtIHJlcXVlc3RDb2RlIFJlcGx5IHJlcXVlc3QgY29kZS4gIDwgMCBpZiByZXBseSBpcyBub3QgcmVxdWVzdGVkLiAKKyAgICAgKiAKKyAgICAgKiBAdGhyb3dzIGFuZHJvaWQuY29udGVudC5BY3Rpdml0eU5vdEZvdW5kRXhjZXB0aW9uCisgICAgICogCisgICAgICogQHNlZSBGcmFnbWVudCNzdGFydEFjdGl2aXR5IAorICAgICAqIEBzZWUgRnJhZ21lbnQjc3RhcnRBY3Rpdml0eUZvclJlc3VsdCAKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdGFydEFjdGl2aXR5RnJvbUZyYWdtZW50KEZyYWdtZW50IGZyYWdtZW50LCBJbnRlbnQgaW50ZW50LCAKKyAgICAgICAgICAgIGludCByZXF1ZXN0Q29kZSkgeworICAgICAgICBJbnN0cnVtZW50YXRpb24uQWN0aXZpdHlSZXN1bHQgYXIgPQorICAgICAgICAgICAgbUluc3RydW1lbnRhdGlvbi5leGVjU3RhcnRBY3Rpdml0eSgKKyAgICAgICAgICAgICAgICB0aGlzLCBtTWFpblRocmVhZC5nZXRBcHBsaWNhdGlvblRocmVhZCgpLCBtVG9rZW4sIGZyYWdtZW50LAorICAgICAgICAgICAgICAgIGludGVudCwgcmVxdWVzdENvZGUpOworICAgICAgICBpZiAoYXIgIT0gbnVsbCkgeworICAgICAgICAgICAgbU1haW5UaHJlYWQuc2VuZEFjdGl2aXR5UmVzdWx0KAorICAgICAgICAgICAgICAgIG1Ub2tlbiwgZnJhZ21lbnQubVdobywgcmVxdWVzdENvZGUsCisgICAgICAgICAgICAgICAgYXIuZ2V0UmVzdWx0Q29kZSgpLCBhci5nZXRSZXN1bHREYXRhKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCiAgICAgICogTGlrZSB7QGxpbmsgI3N0YXJ0QWN0aXZpdHlGcm9tQ2hpbGQoQWN0aXZpdHksIEludGVudCwgaW50KX0sIGJ1dAogICAgICAqIHRha2luZyBhIEludGVudFNlbmRlcjsgc2VlCiAgICAgICoge0BsaW5rICNzdGFydEludGVudFNlbmRlckZvclJlc3VsdChJbnRlbnRTZW5kZXIsIGludCwgSW50ZW50LCBpbnQsIGludCwgaW50KX0KQEAgLTMyNDMsNiArMzUyMCwxOSBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIENoZWNrIHRvIHNlZSB3aGV0aGVyIHRoaXMgYWN0aXZpdHkgaXMgaW4gdGhlIHByb2Nlc3Mgb2YgYmVpbmcgZGVzdHJveWVkIGluIG9yZGVyIHRvIGJlCisgICAgICogcmVjcmVhdGVkIHdpdGggYSBuZXcgY29uZmlndXJhdGlvbi4gVGhpcyBpcyBvZnRlbiB1c2VkIGluCisgICAgICoge0BsaW5rICNvblN0b3B9IHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBzdGF0ZSBuZWVkcyB0byBiZSBjbGVhbmVkIHVwIG9yIHdpbGwgYmUgcGFzc2VkCisgICAgICogb24gdG8gdGhlIG5leHQgaW5zdGFuY2Ugb2YgdGhlIGFjdGl2aXR5IHZpYSB7QGxpbmsgI29uUmV0YWluTm9uQ29uZmlndXJhdGlvbkluc3RhbmNlKCl9LgorICAgICAqIAorICAgICAqIEByZXR1cm4gSWYgdGhlIGFjdGl2aXR5IGlzIGJlaW5nIHRvcm4gZG93biBpbiBvcmRlciB0byBiZSByZWNyZWF0ZWQgd2l0aCBhIG5ldyBjb25maWd1cmF0aW9uLAorICAgICAqIHJldHVybnMgdHJ1ZTsgZWxzZSByZXR1cm5zIGZhbHNlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzQ2hhbmdpbmdDb25maWd1cmF0aW9ucygpIHsKKyAgICAgICAgcmV0dXJuIG1DaGFuZ2luZ0NvbmZpZ3VyYXRpb25zOworICAgIH0KKworICAgIC8qKgogICAgICAqIENhbGwgdGhpcyB3aGVuIHlvdXIgYWN0aXZpdHkgaXMgZG9uZSBhbmQgc2hvdWxkIGJlIGNsb3NlZC4gIFRoZQogICAgICAqIEFjdGl2aXR5UmVzdWx0IGlzIHByb3BhZ2F0ZWQgYmFjayB0byB3aG9ldmVyIGxhdW5jaGVkIHlvdSB2aWEKICAgICAgKiBvbkFjdGl2aXR5UmVzdWx0KCkuCkBAIC0zMzQzLDggKzM2MzMsNyBAQAogICAgICAqIEBzZWUgI2NyZWF0ZVBlbmRpbmdSZXN1bHQKICAgICAgKiBAc2VlICNzZXRSZXN1bHQoaW50KQogICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIG9uQWN0aXZpdHlSZXN1bHQoaW50IHJlcXVlc3RDb2RlLCBpbnQgcmVzdWx0Q29kZSwKLSAgICAgICAgICAgIEludGVudCBkYXRhKSB7CisgICAgcHJvdGVjdGVkIHZvaWQgb25BY3Rpdml0eVJlc3VsdChpbnQgcmVxdWVzdENvZGUsIGludCByZXN1bHRDb2RlLCBJbnRlbnQgZGF0YSkgewogICAgIH0KIAogICAgIC8qKgpAQCAtMzcyOCwxNSArNDAxNyw2NSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFN0dWIgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlci5GYWN0b3J5I29uQ3JlYXRlVmlld30gdXNlZCB3aGVuCi0gICAgICogaW5mbGF0aW5nIHdpdGggdGhlIExheW91dEluZmxhdGVyIHJldHVybmVkIGJ5IHtAbGluayAjZ2V0U3lzdGVtU2VydmljZX0uICBUaGlzCi0gICAgICogaW1wbGVtZW50YXRpb24gc2ltcGx5IHJldHVybnMgbnVsbCBmb3IgYWxsIHZpZXcgbmFtZXMuCisgICAgICogU3RhbmRhcmQgaW1wbGVtZW50YXRpb24gb2YKKyAgICAgKiB7QGxpbmsgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyLkZhY3Rvcnkjb25DcmVhdGVWaWV3fSB1c2VkIHdoZW4KKyAgICAgKiBpbmZsYXRpbmcgd2l0aCB0aGUgTGF5b3V0SW5mbGF0ZXIgcmV0dXJuZWQgYnkge0BsaW5rICNnZXRTeXN0ZW1TZXJ2aWNlfS4KKyAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIGhhbmRsZXMgPGZyYWdtZW50PiB0YWdzIHRvIGVtYmVkIGZyYWdtZW50cyBpbnNpZGUKKyAgICAgKiBvZiB0aGUgYWN0aXZpdHkuCiAgICAgICoKICAgICAgKiBAc2VlIGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlciNjcmVhdGVWaWV3CiAgICAgICogQHNlZSBhbmRyb2lkLnZpZXcuV2luZG93I2dldExheW91dEluZmxhdGVyCiAgICAgICovCiAgICAgcHVibGljIFZpZXcgb25DcmVhdGVWaWV3KFN0cmluZyBuYW1lLCBDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgewotICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgaWYgKCEiZnJhZ21lbnQiLmVxdWFscyhuYW1lKSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIFN0cmluZyBmbmFtZSA9IGF0dHJzLmdldEF0dHJpYnV0ZVZhbHVlKG51bGwsICJjbGFzcyIpOworICAgICAgICBUeXBlZEFycmF5IGEgPSAKKyAgICAgICAgICAgIGNvbnRleHQub2J0YWluU3R5bGVkQXR0cmlidXRlcyhhdHRycywgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuRnJhZ21lbnQpOworICAgICAgICBpZiAoZm5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgZm5hbWUgPSBhLmdldFN0cmluZyhjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5GcmFnbWVudF9uYW1lKTsKKyAgICAgICAgfQorICAgICAgICBpbnQgaWQgPSBhLmdldFJlc291cmNlSWQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuRnJhZ21lbnRfaWQsIDApOworICAgICAgICBTdHJpbmcgdGFnID0gYS5nZXRTdHJpbmcoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuRnJhZ21lbnRfdGFnKTsKKyAgICAgICAgYS5yZWN5Y2xlKCk7CisgICAgICAgIAorICAgICAgICBpZiAoaWQgPT0gMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihhdHRycy5nZXRQb3NpdGlvbkRlc2NyaXB0aW9uKCkKKyAgICAgICAgICAgICAgICAgICAgKyAiOiBNdXN0IHNwZWNpZnkgdW5pcXVlIGFuZHJvaWQ6aWQgZm9yICIgKyBmbmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIElmIHdlIHJlc3RvcmVkIGZyb20gYSBwcmV2aW91cyBzdGF0ZSwgd2UgbWF5IGFscmVhZHkgaGF2ZQorICAgICAgICAvLyBpbnN0YW50aWF0ZWQgdGhpcyBmcmFnbWVudCBmcm9tIHRoZSBzdGF0ZSBhbmQgc2hvdWxkIHVzZQorICAgICAgICAvLyB0aGF0IGluc3RhbmNlIGluc3RlYWQgb2YgbWFraW5nIGEgbmV3IG9uZS4KKyAgICAgICAgRnJhZ21lbnQgZnJhZ21lbnQgPSBtRnJhZ21lbnRzLmZpbmRGcmFnbWVudEJ5SWQoaWQpOworICAgICAgICBpZiAoRnJhZ21lbnRNYW5hZ2VySW1wbC5ERUJVRykgTG9nLnYoVEFHLCAib25DcmVhdGVWaWV3OiBpZD0weCIKKyAgICAgICAgICAgICAgICArIEludGVnZXIudG9IZXhTdHJpbmcoaWQpICsgIiBmbmFtZT0iICsgZm5hbWUKKyAgICAgICAgICAgICAgICArICIgZXhpc3Rpbmc9IiArIGZyYWdtZW50KTsKKyAgICAgICAgaWYgKGZyYWdtZW50ID09IG51bGwpIHsKKyAgICAgICAgICAgIGZyYWdtZW50ID0gRnJhZ21lbnQuaW5zdGFudGlhdGUodGhpcywgZm5hbWUpOworICAgICAgICAgICAgZnJhZ21lbnQubUZyb21MYXlvdXQgPSB0cnVlOworICAgICAgICAgICAgZnJhZ21lbnQubUZyYWdtZW50SWQgPSBpZDsKKyAgICAgICAgICAgIGZyYWdtZW50Lm1UYWcgPSB0YWc7CisgICAgICAgICAgICBmcmFnbWVudC5tSW1tZWRpYXRlQWN0aXZpdHkgPSB0aGlzOworICAgICAgICAgICAgLy8gSWYgdGhpcyBmcmFnbWVudCBpcyBuZXdseSBpbnN0YW50aWF0ZWQgKGVpdGhlciByaWdodCBub3csIG9yCisgICAgICAgICAgICAvLyBmcm9tIGxhc3Qgc2F2ZWQgc3RhdGUpLCB0aGVuIGdpdmUgaXQgdGhlIGF0dHJpYnV0ZXMgdG8KKyAgICAgICAgICAgIC8vIGluaXRpYWxpemUgaXRzZWxmLgorICAgICAgICAgICAgaWYgKCFmcmFnbWVudC5tUmV0YWluaW5nKSB7CisgICAgICAgICAgICAgICAgZnJhZ21lbnQub25JbmZsYXRlKGF0dHJzLCBmcmFnbWVudC5tU2F2ZWRGcmFnbWVudFN0YXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1GcmFnbWVudHMuYWRkRnJhZ21lbnQoZnJhZ21lbnQsIHRydWUpOworICAgICAgICB9CisgICAgICAgIGlmIChmcmFnbWVudC5tVmlldyA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJGcmFnbWVudCAiICsgZm5hbWUKKyAgICAgICAgICAgICAgICAgICAgKyAiIGRpZCBub3QgY3JlYXRlIGEgdmlldy4iKTsKKyAgICAgICAgfQorICAgICAgICBmcmFnbWVudC5tVmlldy5zZXRJZChpZCk7CisgICAgICAgIGlmIChmcmFnbWVudC5tVmlldy5nZXRUYWcoKSA9PSBudWxsKSB7CisgICAgICAgICAgICBmcmFnbWVudC5tVmlldy5zZXRUYWcodGFnKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZnJhZ21lbnQubVZpZXc7CiAgICAgfQogCiAgICAgLyoqCkBAIC0zNzc5LDYgKzQxMTgsMjYgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIC8qKgorICAgICAqIFN0YXJ0IGEgY29udGV4dCBtb2RlLgorICAgICAqCisgICAgICogQHBhcmFtIGNhbGxiYWNrIENhbGxiYWNrIHRoYXQgd2lsbCBtYW5hZ2UgbGlmZWN5Y2xlIGV2ZW50cyBmb3IgdGhpcyBjb250ZXh0IG1vZGUKKyAgICAgKiBAcmV0dXJuIFRoZSBDb250ZXh0TW9kZSB0aGF0IHdhcyBzdGFydGVkLCBvciBudWxsIGlmIGl0IHdhcyBjYW5jZWxlZAorICAgICAqCisgICAgICogQHNlZSBBY3Rpb25Nb2RlCisgICAgICovCisgICAgcHVibGljIEFjdGlvbk1vZGUgc3RhcnRBY3Rpb25Nb2RlKEFjdGlvbk1vZGUuQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICAgICAgcmV0dXJuIG1XaW5kb3cuZ2V0RGVjb3JWaWV3KCkuc3RhcnRBY3Rpb25Nb2RlKGNhbGxiYWNrKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQWN0aW9uTW9kZSBvblN0YXJ0QWN0aW9uTW9kZShBY3Rpb25Nb2RlLkNhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgICAgIGluaXRBY3Rpb25CYXIoKTsKKyAgICAgICAgaWYgKG1BY3Rpb25CYXIgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG1BY3Rpb25CYXIuc3RhcnRBY3Rpb25Nb2RlKGNhbGxiYWNrKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0gSW50ZXJuYWwgQVBJIC0tLS0tLS0tLS0tLS0tLS0tLQogICAgIAogICAgIGZpbmFsIHZvaWQgc2V0UGFyZW50KEFjdGl2aXR5IHBhcmVudCkgewpAQCAtMzc4NywyOCArNDE0NiwzMCBAQAogCiAgICAgZmluYWwgdm9pZCBhdHRhY2goQ29udGV4dCBjb250ZXh0LCBBY3Rpdml0eVRocmVhZCBhVGhyZWFkLCBJbnN0cnVtZW50YXRpb24gaW5zdHIsIElCaW5kZXIgdG9rZW4sCiAgICAgICAgICAgICBBcHBsaWNhdGlvbiBhcHBsaWNhdGlvbiwgSW50ZW50IGludGVudCwgQWN0aXZpdHlJbmZvIGluZm8sIENoYXJTZXF1ZW5jZSB0aXRsZSwgCi0gICAgICAgICAgICBBY3Rpdml0eSBwYXJlbnQsIFN0cmluZyBpZCwgT2JqZWN0IGxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2UsCisgICAgICAgICAgICBBY3Rpdml0eSBwYXJlbnQsIFN0cmluZyBpZCwgTm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcyBsYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcywKICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24gY29uZmlnKSB7CiAgICAgICAgIGF0dGFjaChjb250ZXh0LCBhVGhyZWFkLCBpbnN0ciwgdG9rZW4sIDAsIGFwcGxpY2F0aW9uLCBpbnRlbnQsIGluZm8sIHRpdGxlLCBwYXJlbnQsIGlkLAotICAgICAgICAgICAgbGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZSwgbnVsbCwgY29uZmlnKTsKKyAgICAgICAgICAgIGxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2VzLCBjb25maWcpOwogICAgIH0KICAgICAKICAgICBmaW5hbCB2b2lkIGF0dGFjaChDb250ZXh0IGNvbnRleHQsIEFjdGl2aXR5VGhyZWFkIGFUaHJlYWQsCiAgICAgICAgICAgICBJbnN0cnVtZW50YXRpb24gaW5zdHIsIElCaW5kZXIgdG9rZW4sIGludCBpZGVudCwKICAgICAgICAgICAgIEFwcGxpY2F0aW9uIGFwcGxpY2F0aW9uLCBJbnRlbnQgaW50ZW50LCBBY3Rpdml0eUluZm8gaW5mbywKICAgICAgICAgICAgIENoYXJTZXF1ZW5jZSB0aXRsZSwgQWN0aXZpdHkgcGFyZW50LCBTdHJpbmcgaWQsCi0gICAgICAgICAgICBPYmplY3QgbGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZSwKLSAgICAgICAgICAgIEhhc2hNYXA8U3RyaW5nLE9iamVjdD4gbGFzdE5vbkNvbmZpZ3VyYXRpb25DaGlsZEluc3RhbmNlcywKKyAgICAgICAgICAgIE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZXMgbGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZXMsCiAgICAgICAgICAgICBDb25maWd1cmF0aW9uIGNvbmZpZykgewogICAgICAgICBhdHRhY2hCYXNlQ29udGV4dChjb250ZXh0KTsKIAorICAgICAgICBtRnJhZ21lbnRzLmF0dGFjaEFjdGl2aXR5KHRoaXMpOworICAgICAgICAKICAgICAgICAgbVdpbmRvdyA9IFBvbGljeU1hbmFnZXIubWFrZU5ld1dpbmRvdyh0aGlzKTsKICAgICAgICAgbVdpbmRvdy5zZXRDYWxsYmFjayh0aGlzKTsKKyAgICAgICAgbVdpbmRvdy5nZXRMYXlvdXRJbmZsYXRlcigpLnNldEZhY3RvcnkodGhpcyk7CiAgICAgICAgIGlmIChpbmZvLnNvZnRJbnB1dE1vZGUgIT0gV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuU09GVF9JTlBVVF9TVEFURV9VTlNQRUNJRklFRCkgewogICAgICAgICAgICAgbVdpbmRvdy5zZXRTb2Z0SW5wdXRNb2RlKGluZm8uc29mdElucHV0TW9kZSk7CiAgICAgICAgIH0KICAgICAgICAgbVVpVGhyZWFkID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKTsKLQorICAgICAgICAKICAgICAgICAgbU1haW5UaHJlYWQgPSBhVGhyZWFkOwogICAgICAgICBtSW5zdHJ1bWVudGF0aW9uID0gaW5zdHI7CiAgICAgICAgIG1Ub2tlbiA9IHRva2VuOwpAQCAtMzgyMCwxMCArNDE4MSwxMCBAQAogICAgICAgICBtVGl0bGUgPSB0aXRsZTsKICAgICAgICAgbVBhcmVudCA9IHBhcmVudDsKICAgICAgICAgbUVtYmVkZGVkSUQgPSBpZDsKLSAgICAgICAgbUxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2UgPSBsYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlOwotICAgICAgICBtTGFzdE5vbkNvbmZpZ3VyYXRpb25DaGlsZEluc3RhbmNlcyA9IGxhc3ROb25Db25maWd1cmF0aW9uQ2hpbGRJbnN0YW5jZXM7CisgICAgICAgIG1MYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcyA9IGxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2VzOwogCi0gICAgICAgIG1XaW5kb3cuc2V0V2luZG93TWFuYWdlcihudWxsLCBtVG9rZW4sIG1Db21wb25lbnQuZmxhdHRlblRvU3RyaW5nKCkpOworICAgICAgICBtV2luZG93LnNldFdpbmRvd01hbmFnZXIobnVsbCwgbVRva2VuLCBtQ29tcG9uZW50LmZsYXR0ZW5Ub1N0cmluZygpLAorICAgICAgICAgICAgICAgIChpbmZvLmZsYWdzICYgQWN0aXZpdHlJbmZvLkZMQUdfSEFSRFdBUkVfQUNDRUxFUkFURUQpICE9IDApOwogICAgICAgICBpZiAobVBhcmVudCAhPSBudWxsKSB7CiAgICAgICAgICAgICBtV2luZG93LnNldENvbnRhaW5lcihtUGFyZW50LmdldFdpbmRvdygpKTsKICAgICAgICAgfQpAQCAtMzgzNSwxNCArNDE5NiwyNiBAQAogICAgICAgICByZXR1cm4gbVBhcmVudCAhPSBudWxsID8gbVBhcmVudC5nZXRBY3Rpdml0eVRva2VuKCkgOiBtVG9rZW47CiAgICAgfQogCisgICAgZmluYWwgdm9pZCBwZXJmb3JtQ3JlYXRlKEJ1bmRsZSBpY2ljbGUpIHsKKyAgICAgICAgb25DcmVhdGUoaWNpY2xlKTsKKyAgICAgICAgbUZyYWdtZW50cy5kaXNwYXRjaEFjdGl2aXR5Q3JlYXRlZCgpOworICAgIH0KKyAgICAKICAgICBmaW5hbCB2b2lkIHBlcmZvcm1TdGFydCgpIHsKICAgICAgICAgbUNhbGxlZCA9IGZhbHNlOworICAgICAgICBtRnJhZ21lbnRzLmV4ZWNQZW5kaW5nQWN0aW9ucygpOwogICAgICAgICBtSW5zdHJ1bWVudGF0aW9uLmNhbGxBY3Rpdml0eU9uU3RhcnQodGhpcyk7CiAgICAgICAgIGlmICghbUNhbGxlZCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IFN1cGVyTm90Q2FsbGVkRXhjZXB0aW9uKAogICAgICAgICAgICAgICAgICJBY3Rpdml0eSAiICsgbUNvbXBvbmVudC50b1Nob3J0U3RyaW5nKCkgKwogICAgICAgICAgICAgICAgICIgZGlkIG5vdCBjYWxsIHRocm91Z2ggdG8gc3VwZXIub25TdGFydCgpIik7CiAgICAgICAgIH0KKyAgICAgICAgbUZyYWdtZW50cy5kaXNwYXRjaFN0YXJ0KCk7CisgICAgICAgIGlmIChtQWxsTG9hZGVyTWFuYWdlcnMgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChpbnQgaT1tQWxsTG9hZGVyTWFuYWdlcnMuc2l6ZSgpLTE7IGk+PTA7IGktLSkgeworICAgICAgICAgICAgICAgIG1BbGxMb2FkZXJNYW5hZ2Vycy52YWx1ZUF0KGkpLmZpbmlzaFJldGFpbigpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgfQogICAgIAogICAgIGZpbmFsIHZvaWQgcGVyZm9ybVJlc3RhcnQoKSB7CkBAIC0zODUxLDcgKzQyMjQsMTAgQEAKICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxOOyBpKyspIHsKICAgICAgICAgICAgICAgICBNYW5hZ2VkQ3Vyc29yIG1jID0gbU1hbmFnZWRDdXJzb3JzLmdldChpKTsKICAgICAgICAgICAgICAgICBpZiAobWMubVJlbGVhc2VkIHx8IG1jLm1VcGRhdGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1jLm1DdXJzb3IucmVxdWVyeSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoIW1jLm1DdXJzb3IucmVxdWVyeSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHJ5aW5nIHRvIHJlcXVlcnkgYW4gYWxyZWFkeSBjbG9zZWQgY3Vyc29yIik7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgbWMubVJlbGVhc2VkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgIG1jLm1VcGRhdGVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgfQpAQCAtMzg3NCw3ICs0MjUwLDkgQEAKICAgICBmaW5hbCB2b2lkIHBlcmZvcm1SZXN1bWUoKSB7CiAgICAgICAgIHBlcmZvcm1SZXN0YXJ0KCk7CiAgICAgICAgIAotICAgICAgICBtTGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZSA9IG51bGw7CisgICAgICAgIG1GcmFnbWVudHMuZXhlY1BlbmRpbmdBY3Rpb25zKCk7CisgICAgICAgIAorICAgICAgICBtTGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZXMgPSBudWxsOwogICAgICAgICAKICAgICAgICAgLy8gRmlyc3QgY2FsbCBvblJlc3VtZSgpIC1iZWZvcmUtIHNldHRpbmcgbVJlc3VtZWQsIHNvIHdlIGRvbid0CiAgICAgICAgIC8vIHNlbmQgb3V0IGFueSBzdGF0dXMgYmFyIC8gbWVudSBub3RpZmljYXRpb25zIHRoZSBjbGllbnQgbWFrZXMuCkBAIC0zODg5LDYgKzQyNjcsMTAgQEAKICAgICAgICAgLy8gTm93IHJlYWxseSByZXN1bWUsIGFuZCBpbnN0YWxsIHRoZSBjdXJyZW50IHN0YXR1cyBiYXIgYW5kIG1lbnUuCiAgICAgICAgIG1SZXN1bWVkID0gdHJ1ZTsKICAgICAgICAgbUNhbGxlZCA9IGZhbHNlOworICAgICAgICAKKyAgICAgICAgbUZyYWdtZW50cy5kaXNwYXRjaFJlc3VtZSgpOworICAgICAgICBtRnJhZ21lbnRzLmV4ZWNQZW5kaW5nQWN0aW9ucygpOworICAgICAgICAKICAgICAgICAgb25Qb3N0UmVzdW1lKCk7CiAgICAgICAgIGlmICghbUNhbGxlZCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IFN1cGVyTm90Q2FsbGVkRXhjZXB0aW9uKApAQCAtMzg5OCw2ICs0MjgwLDcgQEAKICAgICB9CiAKICAgICBmaW5hbCB2b2lkIHBlcmZvcm1QYXVzZSgpIHsKKyAgICAgICAgbUZyYWdtZW50cy5kaXNwYXRjaFBhdXNlKCk7CiAgICAgICAgIG1DYWxsZWQgPSBmYWxzZTsKICAgICAgICAgb25QYXVzZSgpOwogICAgICAgICBpZiAoIW1DYWxsZWQgJiYgZ2V0QXBwbGljYXRpb25JbmZvKCkudGFyZ2V0U2RrVmVyc2lvbgpAQCAtMzkxNCwxMSArNDI5NywyNCBAQAogICAgIH0KICAgICAKICAgICBmaW5hbCB2b2lkIHBlcmZvcm1TdG9wKCkgeworICAgICAgICBpZiAobVN0YXJ0ZWQpIHsKKyAgICAgICAgICAgIG1TdGFydGVkID0gZmFsc2U7CisgICAgICAgICAgICBpZiAobUxvYWRlck1hbmFnZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmICghbUNoYW5naW5nQ29uZmlndXJhdGlvbnMpIHsKKyAgICAgICAgICAgICAgICAgICAgbUxvYWRlck1hbmFnZXIuZG9TdG9wKCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbUxvYWRlck1hbmFnZXIuZG9SZXRhaW4oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCiAgICAgICAgIGlmICghbVN0b3BwZWQpIHsKICAgICAgICAgICAgIGlmIChtV2luZG93ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBtV2luZG93LmNsb3NlQWxsUGFuZWxzKCk7CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIG1GcmFnbWVudHMuZGlzcGF0Y2hTdG9wKCk7CisgICAgICAgICAgICAKICAgICAgICAgICAgIG1DYWxsZWQgPSBmYWxzZTsKICAgICAgICAgICAgIG1JbnN0cnVtZW50YXRpb24uY2FsbEFjdGl2aXR5T25TdG9wKHRoaXMpOwogICAgICAgICAgICAgaWYgKCFtQ2FsbGVkKSB7CkBAIC0zOTQzLDYgKzQzMzksMTUgQEAKICAgICAgICAgbVJlc3VtZWQgPSBmYWxzZTsKICAgICB9CiAKKyAgICBmaW5hbCB2b2lkIHBlcmZvcm1EZXN0cm95KCkgeworICAgICAgICBtV2luZG93LmRlc3Ryb3koKTsKKyAgICAgICAgbUZyYWdtZW50cy5kaXNwYXRjaERlc3Ryb3koKTsKKyAgICAgICAgb25EZXN0cm95KCk7CisgICAgICAgIGlmIChtTG9hZGVyTWFuYWdlciAhPSBudWxsKSB7CisgICAgICAgICAgICBtTG9hZGVyTWFuYWdlci5kb0Rlc3Ryb3koKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKICAgICBmaW5hbCBib29sZWFuIGlzUmVzdW1lZCgpIHsKICAgICAgICAgcmV0dXJuIG1SZXN1bWVkOwogICAgIH0KQEAgLTM5NTQsNiArNDM1OSwxMSBAQAogICAgICAgICAgICAgKyAiLCByZXNDb2RlPSIgKyByZXN1bHRDb2RlICsgIiwgZGF0YT0iICsgZGF0YSk7CiAgICAgICAgIGlmICh3aG8gPT0gbnVsbCkgewogICAgICAgICAgICAgb25BY3Rpdml0eVJlc3VsdChyZXF1ZXN0Q29kZSwgcmVzdWx0Q29kZSwgZGF0YSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBGcmFnbWVudCBmcmFnID0gbUZyYWdtZW50cy5maW5kRnJhZ21lbnRCeVdobyh3aG8pOworICAgICAgICAgICAgaWYgKGZyYWcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZyYWcub25BY3Rpdml0eVJlc3VsdChyZXF1ZXN0Q29kZSwgcmVzdWx0Q29kZSwgZGF0YSk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQWN0aXZpdHlNYW5hZ2VyTmF0aXZlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQWN0aXZpdHlNYW5hZ2VyTmF0aXZlLmphdmEKaW5kZXggOWE1NWE2Zi4uYTkzMTg0ZCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FjdGl2aXR5TWFuYWdlck5hdGl2ZS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9BY3Rpdml0eU1hbmFnZXJOYXRpdmUuamF2YQpAQCAtMTI5NSw2ICsxMjk1LDE5IEBACiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogCisgICAgICAgIGNhc2UgRFVNUF9IRUFQX1RSQU5TQUNUSU9OOiB7CisgICAgICAgICAgICBkYXRhLmVuZm9yY2VJbnRlcmZhY2UoSUFjdGl2aXR5TWFuYWdlci5kZXNjcmlwdG9yKTsKKyAgICAgICAgICAgIFN0cmluZyBwcm9jZXNzID0gZGF0YS5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgICBib29sZWFuIG1hbmFnZWQgPSBkYXRhLnJlYWRJbnQoKSAhPSAwOworICAgICAgICAgICAgU3RyaW5nIHBhdGggPSBkYXRhLnJlYWRTdHJpbmcoKTsKKyAgICAgICAgICAgIFBhcmNlbEZpbGVEZXNjcmlwdG9yIGZkID0gZGF0YS5yZWFkSW50KCkgIT0gMAorICAgICAgICAgICAgICAgICAgICA/IGRhdGEucmVhZEZpbGVEZXNjcmlwdG9yKCkgOiBudWxsOworICAgICAgICAgICAgYm9vbGVhbiByZXMgPSBkdW1wSGVhcChwcm9jZXNzLCBtYW5hZ2VkLCBwYXRoLCBmZCk7CisgICAgICAgICAgICByZXBseS53cml0ZU5vRXhjZXB0aW9uKCk7CisgICAgICAgICAgICByZXBseS53cml0ZUludChyZXMgPyAxIDogMCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCiAgICAgICAgIH0KICAgICAgICAgCiAgICAgICAgIHJldHVybiBzdXBlci5vblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7CkBAIC0yODc1LDYgKzI4ODgsMjggQEAKICAgICAgICAgZGF0YS5yZWN5Y2xlKCk7CiAgICAgICAgIHJlcGx5LnJlY3ljbGUoKTsKICAgICB9Ci0gICAgCisKKyAgICBwdWJsaWMgYm9vbGVhbiBkdW1wSGVhcChTdHJpbmcgcHJvY2VzcywgYm9vbGVhbiBtYW5hZ2VkLAorICAgICAgICAgICAgU3RyaW5nIHBhdGgsIFBhcmNlbEZpbGVEZXNjcmlwdG9yIGZkKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICAgICAgUGFyY2VsIGRhdGEgPSBQYXJjZWwub2J0YWluKCk7CisgICAgICAgIFBhcmNlbCByZXBseSA9IFBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBY3Rpdml0eU1hbmFnZXIuZGVzY3JpcHRvcik7CisgICAgICAgIGRhdGEud3JpdGVTdHJpbmcocHJvY2Vzcyk7CisgICAgICAgIGRhdGEud3JpdGVJbnQobWFuYWdlZCA/IDEgOiAwKTsKKyAgICAgICAgZGF0YS53cml0ZVN0cmluZyhwYXRoKTsKKyAgICAgICAgaWYgKGZkICE9IG51bGwpIHsKKyAgICAgICAgICAgIGRhdGEud3JpdGVJbnQoMSk7CisgICAgICAgICAgICBmZC53cml0ZVRvUGFyY2VsKGRhdGEsIFBhcmNlbGFibGUuUEFSQ0VMQUJMRV9XUklURV9SRVRVUk5fVkFMVUUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZGF0YS53cml0ZUludCgwKTsKKyAgICAgICAgfQorICAgICAgICBtUmVtb3RlLnRyYW5zYWN0KERVTVBfSEVBUF9UUkFOU0FDVElPTiwgZGF0YSwgcmVwbHksIDApOworICAgICAgICByZXBseS5yZWFkRXhjZXB0aW9uKCk7CisgICAgICAgIGJvb2xlYW4gcmVzID0gcmVwbHkucmVhZEludCgpICE9IDA7CisgICAgICAgIHJlcGx5LnJlY3ljbGUoKTsKKyAgICAgICAgZGF0YS5yZWN5Y2xlKCk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCiAgICAgcHJpdmF0ZSBJQmluZGVyIG1SZW1vdGU7CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQWN0aXZpdHlUaHJlYWQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9BY3Rpdml0eVRocmVhZC5qYXZhCmluZGV4IGMwN2UzZDMuLjRmYjRiY2EgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9BY3Rpdml0eVRocmVhZC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9BY3Rpdml0eVRocmVhZC5qYXZhCkBAIC0zMCw2ICszMCw3IEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLklQYWNrYWdlTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uSW5zdHJ1bWVudGF0aW9uSW5mbzsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyLk5hbWVOb3RGb3VuZEV4Y2VwdGlvbjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUHJvdmlkZXJJbmZvOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5TZXJ2aWNlSW5mbzsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkFzc2V0TWFuYWdlcjsKQEAgLTE5NSw4ICsxOTYsNyBAQAogICAgICAgICBXaW5kb3cgd2luZG93OwogICAgICAgICBBY3Rpdml0eSBwYXJlbnQ7CiAgICAgICAgIFN0cmluZyBlbWJlZGRlZElEOwotICAgICAgICBPYmplY3QgbGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZTsKLSAgICAgICAgSGFzaE1hcDxTdHJpbmcsT2JqZWN0PiBsYXN0Tm9uQ29uZmlndXJhdGlvbkNoaWxkSW5zdGFuY2VzOworICAgICAgICBBY3Rpdml0eS5Ob25Db25maWd1cmF0aW9uSW5zdGFuY2VzIGxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2VzOwogICAgICAgICBib29sZWFuIHBhdXNlZDsKICAgICAgICAgYm9vbGVhbiBzdG9wcGVkOwogICAgICAgICBib29sZWFuIGhpZGVGb3JOb3c7CkBAIC0zNTcsMTEgKzM1NywxNiBAQAogICAgICAgICBQYXJjZWxGaWxlRGVzY3JpcHRvciBmZDsKICAgICB9CiAKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBEdW1wSGVhcERhdGEgeworICAgICAgICBTdHJpbmcgcGF0aDsKKyAgICAgICAgUGFyY2VsRmlsZURlc2NyaXB0b3IgZmQ7CisgICAgfQorCiAgICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBBcHBsaWNhdGlvblRocmVhZCBleHRlbmRzIEFwcGxpY2F0aW9uVGhyZWFkTmF0aXZlIHsKICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQVBfQ09MVU1OID0gIiUxN3MgJThzICU4cyAlOHMgJThzIjsKICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9ORV9DT1VOVF9DT0xVTU4gPSAiJTE3cyAlOGQiOwogICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFdPX0NPVU5UX0NPTFVNTlMgPSAiJTE3cyAlOGQgJTE3cyAlOGQiOwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREJfSU5GT19GT1JNQVQgPSAiICAlOGQgJThkICUxMGQgICVzIjsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERCX0lORk9fRk9STUFUID0gIiAgJTRkICU2ZCAlOGQgJTE0cyAgJXMiOwogCiAgICAgICAgIC8vIEZvcm1hdHRpbmcgZm9yIGNoZWNraW4gc2VydmljZSAtIHVwZGF0ZSB2ZXJzaW9uIGlmIHJvdyBmb3JtYXQgY2hhbmdlcwogICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQUNUSVZJVFlfVEhSRUFEX0NIRUNLSU5fVkVSU0lPTiA9IDE7CkBAIC02MjQsNiArNjI5LDEzIEBACiAgICAgICAgICAgICBxdWV1ZU9yU2VuZE1lc3NhZ2UoSC5QUk9GSUxFUl9DT05UUk9MLCBwY2QsIHN0YXJ0ID8gMSA6IDApOwogICAgICAgICB9CiAKKyAgICAgICAgcHVibGljIHZvaWQgZHVtcEhlYXAoYm9vbGVhbiBtYW5hZ2VkLCBTdHJpbmcgcGF0aCwgUGFyY2VsRmlsZURlc2NyaXB0b3IgZmQpIHsKKyAgICAgICAgICAgIER1bXBIZWFwRGF0YSBkaGQgPSBuZXcgRHVtcEhlYXBEYXRhKCk7CisgICAgICAgICAgICBkaGQucGF0aCA9IHBhdGg7CisgICAgICAgICAgICBkaGQuZmQgPSBmZDsKKyAgICAgICAgICAgIHF1ZXVlT3JTZW5kTWVzc2FnZShILkRVTVBfSEVBUCwgZGhkLCBtYW5hZ2VkID8gMSA6IDApOworICAgICAgICB9CisKICAgICAgICAgcHVibGljIHZvaWQgc2V0U2NoZWR1bGluZ0dyb3VwKGludCBncm91cCkgewogICAgICAgICAgICAgLy8gTm90ZTogZG8gdGhpcyBpbW1lZGlhdGVseSwgc2luY2UgZ29pbmcgaW50byB0aGUgZm9yZWdyb3VuZAogICAgICAgICAgICAgLy8gc2hvdWxkIGhhcHBlbiByZWdhcmRsZXNzIG9mIHdoYXQgcGVuZGluZyB3b3JrIHdlIGhhdmUgdG8gZG8KQEAgLTc2MSw3ICs3NzMsNyBAQAogICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RhdHMuZGJTdGF0cy5zaXplKCk7IGkrKykgewogICAgICAgICAgICAgICAgICAgICBEYlN0YXRzIGRiU3RhdHMgPSBzdGF0cy5kYlN0YXRzLmdldChpKTsKICAgICAgICAgICAgICAgICAgICAgcHJpbnRSb3cocHcsIERCX0lORk9fRk9STUFULCBkYlN0YXRzLnBhZ2VTaXplLCBkYlN0YXRzLmRiU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYlN0YXRzLmxvb2thc2lkZSwgZGJTdGF0cy5kYk5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRiU3RhdHMubG9va2FzaWRlLCBkYlN0YXRzLmNhY2hlLCBkYlN0YXRzLmRiTmFtZSk7CiAgICAgICAgICAgICAgICAgICAgIHB3LnByaW50KCcsJyk7CiAgICAgICAgICAgICAgICAgfQogCkBAIC04MTIsMTEgKzgyNCwxMiBAQAogICAgICAgICAgICAgaW50IE4gPSBzdGF0cy5kYlN0YXRzLnNpemUoKTsKICAgICAgICAgICAgIGlmIChOID4gMCkgewogICAgICAgICAgICAgICAgIHB3LnByaW50bG4oIiBEQVRBQkFTRVMiKTsKLSAgICAgICAgICAgICAgICBwcmludFJvdyhwdywgIiAgJThzICU4cyAlMTBzICAlcyIsICJQYWdlc2l6ZSIsICJEYnNpemUiLCAiTG9va2FzaWRlIiwgIkRibmFtZSIpOworICAgICAgICAgICAgICAgIHByaW50Um93KHB3LCAiICAlNHMgJTZzICU4cyAlMTRzICAlcyIsICJwZ3N6IiwgImRic3oiLCAibGthc2lkZSIsICJjYWNoZSIsCisgICAgICAgICAgICAgICAgICAgICJEYm5hbWUiKTsKICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE47IGkrKykgewogICAgICAgICAgICAgICAgICAgICBEYlN0YXRzIGRiU3RhdHMgPSBzdGF0cy5kYlN0YXRzLmdldChpKTsKICAgICAgICAgICAgICAgICAgICAgcHJpbnRSb3cocHcsIERCX0lORk9fRk9STUFULCBkYlN0YXRzLnBhZ2VTaXplLCBkYlN0YXRzLmRiU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYlN0YXRzLmxvb2thc2lkZSwgZGJTdGF0cy5kYk5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRiU3RhdHMubG9va2FzaWRlLCBkYlN0YXRzLmNhY2hlLCBkYlN0YXRzLmRiTmFtZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCkBAIC04NzQsNiArODg3LDcgQEAKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5BQkxFX0pJVCAgICAgICAgICAgICAgPSAxMzI7CiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJU1BBVENIX1BBQ0tBR0VfQlJPQURDQVNUID0gMTMzOwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQ0hFRFVMRV9DUkFTSCAgICAgICAgICA9IDEzNDsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRFVNUF9IRUFQICAgICAgICAgICAgICAgPSAxMzU7CiAgICAgICAgIFN0cmluZyBjb2RlVG9TdHJpbmcoaW50IGNvZGUpIHsKICAgICAgICAgICAgIGlmIChsb2NhbExPR1YpIHsKICAgICAgICAgICAgICAgICBzd2l0Y2ggKGNvZGUpIHsKQEAgLTkxMiw2ICs5MjYsNyBAQAogICAgICAgICAgICAgICAgICAgICBjYXNlIEVOQUJMRV9KSVQ6IHJldHVybiAiRU5BQkxFX0pJVCI7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgRElTUEFUQ0hfUEFDS0FHRV9CUk9BRENBU1Q6IHJldHVybiAiRElTUEFUQ0hfUEFDS0FHRV9CUk9BRENBU1QiOwogICAgICAgICAgICAgICAgICAgICBjYXNlIFNDSEVEVUxFX0NSQVNIOiByZXR1cm4gIlNDSEVEVUxFX0NSQVNIIjsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBEVU1QX0hFQVA6IHJldHVybiAiRFVNUF9IRUFQIjsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gIih1bmtub3duKSI7CkBAIC0xMDM3LDEzICsxMDUyLDM1IEBACiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgU0NIRURVTEVfQ1JBU0g6CiAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSZW1vdGVTZXJ2aWNlRXhjZXB0aW9uKChTdHJpbmcpbXNnLm9iaik7CisgICAgICAgICAgICAgICAgY2FzZSBEVU1QX0hFQVA6CisgICAgICAgICAgICAgICAgICAgIGhhbmRsZUR1bXBIZWFwKG1zZy5hcmcxICE9IDAsIChEdW1wSGVhcERhdGEpbXNnLm9iaik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgdm9pZCBtYXliZVNuYXBzaG90KCkgewogICAgICAgICAgICAgaWYgKG1Cb3VuZEFwcGxpY2F0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBTYW1wbGluZ1Byb2ZpbGVySW50ZWdyYXRpb24ud3JpdGVTbmFwc2hvdCgKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Cb3VuZEFwcGxpY2F0aW9uLnByb2Nlc3NOYW1lKTsKKyAgICAgICAgICAgICAgICAvLyBjb252ZXJ0IHRoZSAqcHJpdmF0ZSogQWN0aXZpdHlUaHJlYWQuUGFja2FnZUluZm8gdG8gKnB1YmxpYyoga25vd24KKyAgICAgICAgICAgICAgICAvLyBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZUluZm8KKyAgICAgICAgICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUgPSBtQm91bmRBcHBsaWNhdGlvbi5pbmZvLm1QYWNrYWdlTmFtZTsKKyAgICAgICAgICAgICAgICBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZUluZm8gcGFja2FnZUluZm8gPSBudWxsOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIENvbnRleHQgY29udGV4dCA9IGdldFN5c3RlbUNvbnRleHQoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYoY29udGV4dCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJjYW5ub3QgZ2V0IGEgdmFsaWQgY29udGV4dCIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIFBhY2thZ2VNYW5hZ2VyIHBtID0gY29udGV4dC5nZXRQYWNrYWdlTWFuYWdlcigpOworICAgICAgICAgICAgICAgICAgICBpZihwbSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJjYW5ub3QgZ2V0IGEgdmFsaWQgUGFja2FnZU1hbmFnZXIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwYWNrYWdlSW5mbyA9IHBtLmdldFBhY2thZ2VJbmZvKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhY2thZ2VOYW1lLCBQYWNrYWdlTWFuYWdlci5HRVRfQUNUSVZJVElFUyk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoTmFtZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiY2Fubm90IGdldCBwYWNrYWdlIGluZm8gZm9yICIgKyBwYWNrYWdlTmFtZSwgZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFNhbXBsaW5nUHJvZmlsZXJJbnRlZ3JhdGlvbi53cml0ZVNuYXBzaG90KG1Cb3VuZEFwcGxpY2F0aW9uLnByb2Nlc3NOYW1lLCBwYWNrYWdlSW5mbyk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC0xNDM0LDcgKzE0NzEsNyBAQAogCiAgICAgcHVibGljIGZpbmFsIEFjdGl2aXR5IHN0YXJ0QWN0aXZpdHlOb3coQWN0aXZpdHkgcGFyZW50LCBTdHJpbmcgaWQsCiAgICAgICAgIEludGVudCBpbnRlbnQsIEFjdGl2aXR5SW5mbyBhY3Rpdml0eUluZm8sIElCaW5kZXIgdG9rZW4sIEJ1bmRsZSBzdGF0ZSwKLSAgICAgICAgT2JqZWN0IGxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2UpIHsKKyAgICAgICAgQWN0aXZpdHkuTm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcyBsYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcykgewogICAgICAgICBBY3Rpdml0eUNsaWVudFJlY29yZCByID0gbmV3IEFjdGl2aXR5Q2xpZW50UmVjb3JkKCk7CiAgICAgICAgICAgICByLnRva2VuID0gdG9rZW47CiAgICAgICAgICAgICByLmlkZW50ID0gMDsKQEAgLTE0NDMsNyArMTQ4MCw3IEBACiAgICAgICAgICAgICByLnBhcmVudCA9IHBhcmVudDsKICAgICAgICAgICAgIHIuZW1iZWRkZWRJRCA9IGlkOwogICAgICAgICAgICAgci5hY3Rpdml0eUluZm8gPSBhY3Rpdml0eUluZm87Ci0gICAgICAgICAgICByLmxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2UgPSBsYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlOworICAgICAgICAgICAgci5sYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcyA9IGxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2VzOwogICAgICAgICBpZiAobG9jYWxMT0dWKSB7CiAgICAgICAgICAgICBDb21wb25lbnROYW1lIGNvbXBuYW1lID0gaW50ZW50LmdldENvbXBvbmVudCgpOwogICAgICAgICAgICAgU3RyaW5nIG5hbWU7CkBAIC0xNTY1LDE0ICsxNjAyLDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICArIHIuYWN0aXZpdHlJbmZvLm5hbWUgKyAiIHdpdGggY29uZmlnICIgKyBjb25maWcpOwogICAgICAgICAgICAgICAgIGFjdGl2aXR5LmF0dGFjaChhcHBDb250ZXh0LCB0aGlzLCBnZXRJbnN0cnVtZW50YXRpb24oKSwgci50b2tlbiwKICAgICAgICAgICAgICAgICAgICAgICAgIHIuaWRlbnQsIGFwcCwgci5pbnRlbnQsIHIuYWN0aXZpdHlJbmZvLCB0aXRsZSwgci5wYXJlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICByLmVtYmVkZGVkSUQsIHIubGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHIubGFzdE5vbkNvbmZpZ3VyYXRpb25DaGlsZEluc3RhbmNlcywgY29uZmlnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHIuZW1iZWRkZWRJRCwgci5sYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcywgY29uZmlnKTsKIAogICAgICAgICAgICAgICAgIGlmIChjdXN0b21JbnRlbnQgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICBhY3Rpdml0eS5tSW50ZW50ID0gY3VzdG9tSW50ZW50OwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByLmxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2UgPSBudWxsOwotICAgICAgICAgICAgICAgIHIubGFzdE5vbkNvbmZpZ3VyYXRpb25DaGlsZEluc3RhbmNlcyA9IG51bGw7CisgICAgICAgICAgICAgICAgci5sYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcyA9IG51bGw7CiAgICAgICAgICAgICAgICAgYWN0aXZpdHkubVN0YXJ0ZWRBY3Rpdml0eSA9IGZhbHNlOwogICAgICAgICAgICAgICAgIGludCB0aGVtZSA9IHIuYWN0aXZpdHlJbmZvLmdldFRoZW1lUmVzb3VyY2UoKTsKICAgICAgICAgICAgICAgICBpZiAodGhlbWUgIT0gMCkgewpAQCAtMjU0MSw2ICsyNTc2LDkgQEAKICAgICAgICAgICAgIGlmIChmaW5pc2hpbmcpIHsKICAgICAgICAgICAgICAgICByLmFjdGl2aXR5Lm1GaW5pc2hlZCA9IHRydWU7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZ2V0Tm9uQ29uZmlnSW5zdGFuY2UpIHsKKyAgICAgICAgICAgICAgICByLmFjdGl2aXR5Lm1DaGFuZ2luZ0NvbmZpZ3VyYXRpb25zID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmICghci5wYXVzZWQpIHsKICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICByLmFjdGl2aXR5Lm1DYWxsZWQgPSBmYWxzZTsKQEAgLTI1ODEsOCArMjYxOSw4IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoZ2V0Tm9uQ29uZmlnSW5zdGFuY2UpIHsKICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICByLmxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHIuYWN0aXZpdHkub25SZXRhaW5Ob25Db25maWd1cmF0aW9uSW5zdGFuY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgci5sYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gci5hY3Rpdml0eS5yZXRhaW5Ob25Db25maWd1cmF0aW9uSW5zdGFuY2VzKCk7CiAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCFtSW5zdHJ1bWVudGF0aW9uLm9uRXhjZXB0aW9uKHIuYWN0aXZpdHksIGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigKQEAgLTI1OTEsMjIgKzI2MjksMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiOiAiICsgZS50b1N0cmluZygpLCBlKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICByLmxhc3ROb25Db25maWd1cmF0aW9uQ2hpbGRJbnN0YW5jZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHIuYWN0aXZpdHkub25SZXRhaW5Ob25Db25maWd1cmF0aW9uQ2hpbGRJbnN0YW5jZXMoKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoIW1JbnN0cnVtZW50YXRpb24ub25FeGNlcHRpb24oci5hY3Rpdml0eSwgZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIHJldGFpbiBjaGlsZCBhY3Rpdml0aWVzICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzYWZlVG9Db21wb25lbnRTaG9ydFN0cmluZyhyLmludGVudCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiOiAiICsgZS50b1N0cmluZygpLCBlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQogICAgICAgICAgICAgfQogICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICByLmFjdGl2aXR5Lm1DYWxsZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICByLmFjdGl2aXR5Lm9uRGVzdHJveSgpOworICAgICAgICAgICAgICAgIG1JbnN0cnVtZW50YXRpb24uY2FsbEFjdGl2aXR5T25EZXN0cm95KHIuYWN0aXZpdHkpOwogICAgICAgICAgICAgICAgIGlmICghci5hY3Rpdml0eS5tQ2FsbGVkKSB7CiAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTdXBlck5vdENhbGxlZEV4Y2VwdGlvbigKICAgICAgICAgICAgICAgICAgICAgICAgICJBY3Rpdml0eSAiICsgc2FmZVRvQ29tcG9uZW50U2hvcnRTdHJpbmcoci5pbnRlbnQpICsKQEAgLTMwMTgsNiArMzA0NCwyNSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgZmluYWwgdm9pZCBoYW5kbGVEdW1wSGVhcChib29sZWFuIG1hbmFnZWQsIER1bXBIZWFwRGF0YSBkaGQpIHsKKyAgICAgICAgaWYgKG1hbmFnZWQpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgRGVidWcuZHVtcEhwcm9mRGF0YShkaGQucGF0aCwgZGhkLmZkLmdldEZpbGVEZXNjcmlwdG9yKCkpOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIFNsb2cudyhUQUcsICJNYW5hZ2VkIGhlYXAgZHVtcCBmYWlsZWQgb24gcGF0aCAiICsgZGhkLnBhdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiAtLSBjYW4gdGhlIHByb2Nlc3MgYWNjZXNzIHRoaXMgcGF0aD8iKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgZGhkLmZkLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBTbG9nLncoVEFHLCAiRmFpbHVyZSBjbG9zaW5nIHByb2ZpbGUgZmQiLCBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBEZWJ1Zy5kdW1wTmF0aXZlSGVhcChkaGQuZmQuZ2V0RmlsZURlc2NyaXB0b3IoKSk7CisgICAgICAgIH0KKyAgICB9CisKICAgICBmaW5hbCB2b2lkIGhhbmRsZURpc3BhdGNoUGFja2FnZUJyb2FkY2FzdChpbnQgY21kLCBTdHJpbmdbXSBwYWNrYWdlcykgewogICAgICAgICBib29sZWFuIGhhc1BrZ0luZm8gPSBmYWxzZTsKICAgICAgICAgaWYgKHBhY2thZ2VzICE9IG51bGwpIHsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9BcHBsaWNhdGlvbkVycm9yUmVwb3J0LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQXBwbGljYXRpb25FcnJvclJlcG9ydC5qYXZhCmluZGV4IDIzODI1OTYuLjFlMDEyZWIgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9BcHBsaWNhdGlvbkVycm9yUmVwb3J0LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FwcGxpY2F0aW9uRXJyb3JSZXBvcnQuamF2YQpAQCAtMTg0LDcgKzE4NCw3IEBACiAgICAgICAgIGNhbmRpZGF0ZSA9IFN5c3RlbVByb3BlcnRpZXMuZ2V0KERFRkFVTFRfRVJST1JfUkVDRUlWRVJfUFJPUEVSVFkpOwogICAgICAgICByZXR1cm4gZ2V0RXJyb3JSZXBvcnRSZWNlaXZlcihwbSwgcGFja2FnZU5hbWUsIGNhbmRpZGF0ZSk7CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogUmV0dXJuIGFjdGl2aXR5IGluIHJlY2VpdmVyUGFja2FnZSB0aGF0IGhhbmRsZXMgQUNUSU9OX0FQUF9FUlJPUi4KICAgICAgKgpAQCAtNTgxLDYgKzU4MSw5IEBACiAgICAgICAgICAgICBjYXNlIFRZUEVfQkFUVEVSWToKICAgICAgICAgICAgICAgICBiYXR0ZXJ5SW5mby5kdW1wKHB3LCBwcmVmaXgpOwogICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBUWVBFX1JVTk5JTkdfU0VSVklDRToKKyAgICAgICAgICAgICAgICBydW5uaW5nU2VydmljZUluZm8uZHVtcChwdywgcHJlZml4KTsKKyAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9BcHBsaWNhdGlvblRocmVhZE5hdGl2ZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FwcGxpY2F0aW9uVGhyZWFkTmF0aXZlLmphdmEKaW5kZXggMWMyMDA2Mi4uZGMyMTQ1ZiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FwcGxpY2F0aW9uVGhyZWFkTmF0aXZlLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FwcGxpY2F0aW9uVGhyZWFkTmF0aXZlLmphdmEKQEAgLTQwMyw2ICs0MDMsMTcgQEAKICAgICAgICAgICAgIHNjaGVkdWxlQ3Jhc2gobXNnKTsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CisKKyAgICAgICAgY2FzZSBEVU1QX0hFQVBfVFJBTlNBQ1RJT046CisgICAgICAgIHsKKyAgICAgICAgICAgIGRhdGEuZW5mb3JjZUludGVyZmFjZShJQXBwbGljYXRpb25UaHJlYWQuZGVzY3JpcHRvcik7CisgICAgICAgICAgICBib29sZWFuIG1hbmFnZWQgPSBkYXRhLnJlYWRJbnQoKSAhPSAwOworICAgICAgICAgICAgU3RyaW5nIHBhdGggPSBkYXRhLnJlYWRTdHJpbmcoKTsKKyAgICAgICAgICAgIFBhcmNlbEZpbGVEZXNjcmlwdG9yIGZkID0gZGF0YS5yZWFkSW50KCkgIT0gMAorICAgICAgICAgICAgICAgICAgICA/IGRhdGEucmVhZEZpbGVEZXNjcmlwdG9yKCkgOiBudWxsOworICAgICAgICAgICAgZHVtcEhlYXAobWFuYWdlZCwgcGF0aCwgZmQpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIHJldHVybiBzdXBlci5vblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7CkBAIC04MjksNSArODQwLDIyIEBACiAgICAgICAgIGRhdGEucmVjeWNsZSgpOwogICAgICAgICAKICAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBkdW1wSGVhcChib29sZWFuIG1hbmFnZWQsIFN0cmluZyBwYXRoLAorICAgICAgICAgICAgUGFyY2VsRmlsZURlc2NyaXB0b3IgZmQpIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgICAgICBQYXJjZWwgZGF0YSA9IFBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBcHBsaWNhdGlvblRocmVhZC5kZXNjcmlwdG9yKTsKKyAgICAgICAgZGF0YS53cml0ZUludChtYW5hZ2VkID8gMSA6IDApOworICAgICAgICBkYXRhLndyaXRlU3RyaW5nKHBhdGgpOworICAgICAgICBpZiAoZmQgIT0gbnVsbCkgeworICAgICAgICAgICAgZGF0YS53cml0ZUludCgxKTsKKyAgICAgICAgICAgIGZkLndyaXRlVG9QYXJjZWwoZGF0YSwgUGFyY2VsYWJsZS5QQVJDRUxBQkxFX1dSSVRFX1JFVFVSTl9WQUxVRSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkYXRhLndyaXRlSW50KDApOworICAgICAgICB9CisgICAgICAgIG1SZW1vdGUudHJhbnNhY3QoRFVNUF9IRUFQX1RSQU5TQUNUSU9OLCBkYXRhLCBudWxsLAorICAgICAgICAgICAgICAgIElCaW5kZXIuRkxBR19PTkVXQVkpOworICAgICAgICBkYXRhLnJlY3ljbGUoKTsKKyAgICB9CiB9CiAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9CYWNrU3RhY2tFbnRyeS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0JhY2tTdGFja0VudHJ5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTIwZTRmZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9CYWNrU3RhY2tFbnRyeS5qYXZhCkBAIC0wLDAgKzEsNDk5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmFwcDsKKworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsOworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsYWJsZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKworZmluYWwgY2xhc3MgQmFja1N0YWNrU3RhdGUgaW1wbGVtZW50cyBQYXJjZWxhYmxlIHsKKyAgICBmaW5hbCBpbnRbXSBtT3BzOworICAgIGZpbmFsIGludCBtVHJhbnNpdGlvbjsKKyAgICBmaW5hbCBpbnQgbVRyYW5zaXRpb25TdHlsZTsKKyAgICBmaW5hbCBTdHJpbmcgbU5hbWU7CisgICAgZmluYWwgaW50IG1JbmRleDsKKyAgICAKKyAgICBwdWJsaWMgQmFja1N0YWNrU3RhdGUoRnJhZ21lbnRNYW5hZ2VySW1wbCBmbSwgQmFja1N0YWNrRW50cnkgYnNlKSB7CisgICAgICAgIGludCBudW1SZW1vdmVkID0gMDsKKyAgICAgICAgQmFja1N0YWNrRW50cnkuT3Agb3AgPSBic2UubUhlYWQ7CisgICAgICAgIHdoaWxlIChvcCAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAob3AucmVtb3ZlZCAhPSBudWxsKSBudW1SZW1vdmVkICs9IG9wLnJlbW92ZWQuc2l6ZSgpOworICAgICAgICAgICAgb3AgPSBvcC5uZXh0OworICAgICAgICB9CisgICAgICAgIG1PcHMgPSBuZXcgaW50W2JzZS5tTnVtT3AqNSArIG51bVJlbW92ZWRdOworICAgICAgICAKKyAgICAgICAgaWYgKCFic2UubUFkZFRvQmFja1N0YWNrKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJOb3Qgb24gYmFjayBzdGFjayIpOworICAgICAgICB9CisKKyAgICAgICAgb3AgPSBic2UubUhlYWQ7CisgICAgICAgIGludCBwb3MgPSAwOworICAgICAgICB3aGlsZSAob3AgIT0gbnVsbCkgeworICAgICAgICAgICAgbU9wc1twb3MrK10gPSBvcC5jbWQ7CisgICAgICAgICAgICBtT3BzW3BvcysrXSA9IG9wLmZyYWdtZW50Lm1JbmRleDsKKyAgICAgICAgICAgIG1PcHNbcG9zKytdID0gb3AuZW50ZXJBbmltOworICAgICAgICAgICAgbU9wc1twb3MrK10gPSBvcC5leGl0QW5pbTsKKyAgICAgICAgICAgIGlmIChvcC5yZW1vdmVkICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgTiA9IG9wLnJlbW92ZWQuc2l6ZSgpOworICAgICAgICAgICAgICAgIG1PcHNbcG9zKytdID0gTjsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8TjsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIG1PcHNbcG9zKytdID0gb3AucmVtb3ZlZC5nZXQoaSkubUluZGV4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbU9wc1twb3MrK10gPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb3AgPSBvcC5uZXh0OworICAgICAgICB9CisgICAgICAgIG1UcmFuc2l0aW9uID0gYnNlLm1UcmFuc2l0aW9uOworICAgICAgICBtVHJhbnNpdGlvblN0eWxlID0gYnNlLm1UcmFuc2l0aW9uU3R5bGU7CisgICAgICAgIG1OYW1lID0gYnNlLm1OYW1lOworICAgICAgICBtSW5kZXggPSBic2UubUluZGV4OworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgQmFja1N0YWNrU3RhdGUoUGFyY2VsIGluKSB7CisgICAgICAgIG1PcHMgPSBpbi5jcmVhdGVJbnRBcnJheSgpOworICAgICAgICBtVHJhbnNpdGlvbiA9IGluLnJlYWRJbnQoKTsKKyAgICAgICAgbVRyYW5zaXRpb25TdHlsZSA9IGluLnJlYWRJbnQoKTsKKyAgICAgICAgbU5hbWUgPSBpbi5yZWFkU3RyaW5nKCk7CisgICAgICAgIG1JbmRleCA9IGluLnJlYWRJbnQoKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIEJhY2tTdGFja0VudHJ5IGluc3RhbnRpYXRlKEZyYWdtZW50TWFuYWdlckltcGwgZm0pIHsKKyAgICAgICAgQmFja1N0YWNrRW50cnkgYnNlID0gbmV3IEJhY2tTdGFja0VudHJ5KGZtKTsKKyAgICAgICAgaW50IHBvcyA9IDA7CisgICAgICAgIHdoaWxlIChwb3MgPCBtT3BzLmxlbmd0aCkgeworICAgICAgICAgICAgQmFja1N0YWNrRW50cnkuT3Agb3AgPSBuZXcgQmFja1N0YWNrRW50cnkuT3AoKTsKKyAgICAgICAgICAgIG9wLmNtZCA9IG1PcHNbcG9zKytdOworICAgICAgICAgICAgaWYgKEZyYWdtZW50TWFuYWdlckltcGwuREVCVUcpIExvZy52KEZyYWdtZW50TWFuYWdlckltcGwuVEFHLAorICAgICAgICAgICAgICAgICAgICAiQlNFICIgKyBic2UgKyAiIHNldCBiYXNlIGZyYWdtZW50ICMiICsgbU9wc1twb3NdKTsKKyAgICAgICAgICAgIEZyYWdtZW50IGYgPSBmbS5tQWN0aXZlLmdldChtT3BzW3BvcysrXSk7CisgICAgICAgICAgICBvcC5mcmFnbWVudCA9IGY7CisgICAgICAgICAgICBvcC5lbnRlckFuaW0gPSBtT3BzW3BvcysrXTsKKyAgICAgICAgICAgIG9wLmV4aXRBbmltID0gbU9wc1twb3MrK107CisgICAgICAgICAgICBmaW5hbCBpbnQgTiA9IG1PcHNbcG9zKytdOworICAgICAgICAgICAgaWYgKE4gPiAwKSB7CisgICAgICAgICAgICAgICAgb3AucmVtb3ZlZCA9IG5ldyBBcnJheUxpc3Q8RnJhZ21lbnQ+KE4pOworICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxOOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKEZyYWdtZW50TWFuYWdlckltcGwuREVCVUcpIExvZy52KEZyYWdtZW50TWFuYWdlckltcGwuVEFHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCU0UgIiArIGJzZSArICIgc2V0IHJlbW92ZSBmcmFnbWVudCAjIiArIG1PcHNbcG9zXSk7CisgICAgICAgICAgICAgICAgICAgIEZyYWdtZW50IHIgPSBmbS5tQWN0aXZlLmdldChtT3BzW3BvcysrXSk7CisgICAgICAgICAgICAgICAgICAgIG9wLnJlbW92ZWQuYWRkKHIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJzZS5hZGRPcChvcCk7CisgICAgICAgIH0KKyAgICAgICAgYnNlLm1UcmFuc2l0aW9uID0gbVRyYW5zaXRpb247CisgICAgICAgIGJzZS5tVHJhbnNpdGlvblN0eWxlID0gbVRyYW5zaXRpb25TdHlsZTsKKyAgICAgICAgYnNlLm1OYW1lID0gbU5hbWU7CisgICAgICAgIGJzZS5tSW5kZXggPSBtSW5kZXg7CisgICAgICAgIGJzZS5tQWRkVG9CYWNrU3RhY2sgPSB0cnVlOworICAgICAgICBic2UuYnVtcEJhY2tTdGFja05lc3RpbmcoMSk7CisgICAgICAgIHJldHVybiBic2U7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBpbnQgZGVzY3JpYmVDb250ZW50cygpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGVUb1BhcmNlbChQYXJjZWwgZGVzdCwgaW50IGZsYWdzKSB7CisgICAgICAgIGRlc3Qud3JpdGVJbnRBcnJheShtT3BzKTsKKyAgICAgICAgZGVzdC53cml0ZUludChtVHJhbnNpdGlvbik7CisgICAgICAgIGRlc3Qud3JpdGVJbnQobVRyYW5zaXRpb25TdHlsZSk7CisgICAgICAgIGRlc3Qud3JpdGVTdHJpbmcobU5hbWUpOworICAgICAgICBkZXN0LndyaXRlSW50KG1JbmRleCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUGFyY2VsYWJsZS5DcmVhdG9yPEJhY2tTdGFja1N0YXRlPiBDUkVBVE9SCisgICAgICAgICAgICA9IG5ldyBQYXJjZWxhYmxlLkNyZWF0b3I8QmFja1N0YWNrU3RhdGU+KCkgeworICAgICAgICBwdWJsaWMgQmFja1N0YWNrU3RhdGUgY3JlYXRlRnJvbVBhcmNlbChQYXJjZWwgaW4pIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQmFja1N0YWNrU3RhdGUoaW4pOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwdWJsaWMgQmFja1N0YWNrU3RhdGVbXSBuZXdBcnJheShpbnQgc2l6ZSkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBCYWNrU3RhY2tTdGF0ZVtzaXplXTsKKyAgICAgICAgfQorICAgIH07Cit9CisKKy8qKgorICogQGhpZGUgRW50cnkgb2YgYW4gb3BlcmF0aW9uIG9uIHRoZSBmcmFnbWVudCBiYWNrIHN0YWNrLgorICovCitmaW5hbCBjbGFzcyBCYWNrU3RhY2tFbnRyeSBpbXBsZW1lbnRzIEZyYWdtZW50VHJhbnNhY3Rpb24sIFJ1bm5hYmxlIHsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJCYWNrU3RhY2tFbnRyeSI7CisgICAgCisgICAgZmluYWwgRnJhZ21lbnRNYW5hZ2VySW1wbCBtTWFuYWdlcjsKKyAgICAKKyAgICBzdGF0aWMgZmluYWwgaW50IE9QX05VTEwgPSAwOworICAgIHN0YXRpYyBmaW5hbCBpbnQgT1BfQUREID0gMTsKKyAgICBzdGF0aWMgZmluYWwgaW50IE9QX1JFUExBQ0UgPSAyOworICAgIHN0YXRpYyBmaW5hbCBpbnQgT1BfUkVNT1ZFID0gMzsKKyAgICBzdGF0aWMgZmluYWwgaW50IE9QX0hJREUgPSA0OworICAgIHN0YXRpYyBmaW5hbCBpbnQgT1BfU0hPVyA9IDU7CisgICAgCisgICAgc3RhdGljIGZpbmFsIGNsYXNzIE9wIHsKKyAgICAgICAgT3AgbmV4dDsKKyAgICAgICAgT3AgcHJldjsKKyAgICAgICAgaW50IGNtZDsKKyAgICAgICAgRnJhZ21lbnQgZnJhZ21lbnQ7CisgICAgICAgIGludCBlbnRlckFuaW07CisgICAgICAgIGludCBleGl0QW5pbTsKKyAgICAgICAgQXJyYXlMaXN0PEZyYWdtZW50PiByZW1vdmVkOworICAgIH0KKyAgICAKKyAgICBPcCBtSGVhZDsKKyAgICBPcCBtVGFpbDsKKyAgICBpbnQgbU51bU9wOworICAgIGludCBtRW50ZXJBbmltOworICAgIGludCBtRXhpdEFuaW07CisgICAgaW50IG1UcmFuc2l0aW9uOworICAgIGludCBtVHJhbnNpdGlvblN0eWxlOworICAgIGJvb2xlYW4gbUFkZFRvQmFja1N0YWNrOworICAgIFN0cmluZyBtTmFtZTsKKyAgICBib29sZWFuIG1Db21taXR0ZWQ7CisgICAgaW50IG1JbmRleDsKKyAgICAKKyAgICBwdWJsaWMgQmFja1N0YWNrRW50cnkoRnJhZ21lbnRNYW5hZ2VySW1wbCBtYW5hZ2VyKSB7CisgICAgICAgIG1NYW5hZ2VyID0gbWFuYWdlcjsKKyAgICB9CisgICAgCisgICAgdm9pZCBhZGRPcChPcCBvcCkgeworICAgICAgICBpZiAobUhlYWQgPT0gbnVsbCkgeworICAgICAgICAgICAgbUhlYWQgPSBtVGFpbCA9IG9wOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgb3AucHJldiA9IG1UYWlsOworICAgICAgICAgICAgbVRhaWwubmV4dCA9IG9wOworICAgICAgICAgICAgbVRhaWwgPSBvcDsKKyAgICAgICAgfQorICAgICAgICBvcC5lbnRlckFuaW0gPSBtRW50ZXJBbmltOworICAgICAgICBvcC5leGl0QW5pbSA9IG1FeGl0QW5pbTsKKyAgICAgICAgbU51bU9wKys7CisgICAgfQorICAgICAgICAKKyAgICBwdWJsaWMgRnJhZ21lbnRUcmFuc2FjdGlvbiBhZGQoRnJhZ21lbnQgZnJhZ21lbnQsIFN0cmluZyB0YWcpIHsKKyAgICAgICAgZG9BZGRPcCgwLCBmcmFnbWVudCwgdGFnLCBPUF9BREQpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgRnJhZ21lbnRUcmFuc2FjdGlvbiBhZGQoaW50IGNvbnRhaW5lclZpZXdJZCwgRnJhZ21lbnQgZnJhZ21lbnQpIHsKKyAgICAgICAgZG9BZGRPcChjb250YWluZXJWaWV3SWQsIGZyYWdtZW50LCBudWxsLCBPUF9BREQpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgRnJhZ21lbnRUcmFuc2FjdGlvbiBhZGQoaW50IGNvbnRhaW5lclZpZXdJZCwgRnJhZ21lbnQgZnJhZ21lbnQsIFN0cmluZyB0YWcpIHsKKyAgICAgICAgZG9BZGRPcChjb250YWluZXJWaWV3SWQsIGZyYWdtZW50LCB0YWcsIE9QX0FERCk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkb0FkZE9wKGludCBjb250YWluZXJWaWV3SWQsIEZyYWdtZW50IGZyYWdtZW50LCBTdHJpbmcgdGFnLCBpbnQgb3BjbWQpIHsKKyAgICAgICAgaWYgKGZyYWdtZW50Lm1JbW1lZGlhdGVBY3Rpdml0eSAhPSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJGcmFnbWVudCBhbHJlYWR5IGFkZGVkOiAiICsgZnJhZ21lbnQpOworICAgICAgICB9CisgICAgICAgIGZyYWdtZW50Lm1JbW1lZGlhdGVBY3Rpdml0eSA9IG1NYW5hZ2VyLm1BY3Rpdml0eTsKKyAgICAgICAgCisgICAgICAgIGlmICh0YWcgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKGZyYWdtZW50Lm1UYWcgIT0gbnVsbCAmJiAhdGFnLmVxdWFscyhmcmFnbWVudC5tVGFnKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkNhbid0IGNoYW5nZSB0YWcgb2YgZnJhZ21lbnQgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBmcmFnbWVudCArICI6IHdhcyAiICsgZnJhZ21lbnQubVRhZworICAgICAgICAgICAgICAgICAgICAgICAgKyAiIG5vdyAiICsgdGFnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZyYWdtZW50Lm1UYWcgPSB0YWc7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChjb250YWluZXJWaWV3SWQgIT0gMCkgeworICAgICAgICAgICAgaWYgKGZyYWdtZW50Lm1GcmFnbWVudElkICE9IDAgJiYgZnJhZ21lbnQubUZyYWdtZW50SWQgIT0gY29udGFpbmVyVmlld0lkKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQ2FuJ3QgY2hhbmdlIGNvbnRhaW5lciBJRCBvZiBmcmFnbWVudCAiCisgICAgICAgICAgICAgICAgICAgICAgICArIGZyYWdtZW50ICsgIjogd2FzICIgKyBmcmFnbWVudC5tRnJhZ21lbnRJZAorICAgICAgICAgICAgICAgICAgICAgICAgKyAiIG5vdyAiICsgY29udGFpbmVyVmlld0lkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZyYWdtZW50Lm1Db250YWluZXJJZCA9IGZyYWdtZW50Lm1GcmFnbWVudElkID0gY29udGFpbmVyVmlld0lkOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBPcCBvcCA9IG5ldyBPcCgpOworICAgICAgICBvcC5jbWQgPSBvcGNtZDsKKyAgICAgICAgb3AuZnJhZ21lbnQgPSBmcmFnbWVudDsKKyAgICAgICAgYWRkT3Aob3ApOworICAgIH0KKworICAgIHB1YmxpYyBGcmFnbWVudFRyYW5zYWN0aW9uIHJlcGxhY2UoaW50IGNvbnRhaW5lclZpZXdJZCwgRnJhZ21lbnQgZnJhZ21lbnQpIHsKKyAgICAgICAgcmV0dXJuIHJlcGxhY2UoY29udGFpbmVyVmlld0lkLCBmcmFnbWVudCwgbnVsbCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBGcmFnbWVudFRyYW5zYWN0aW9uIHJlcGxhY2UoaW50IGNvbnRhaW5lclZpZXdJZCwgRnJhZ21lbnQgZnJhZ21lbnQsIFN0cmluZyB0YWcpIHsKKyAgICAgICAgaWYgKGNvbnRhaW5lclZpZXdJZCA9PSAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJNdXN0IHVzZSBub24temVybyBjb250YWluZXJWaWV3SWQiKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgZG9BZGRPcChjb250YWluZXJWaWV3SWQsIGZyYWdtZW50LCB0YWcsIE9QX1JFUExBQ0UpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisgICAgCisgICAgcHVibGljIEZyYWdtZW50VHJhbnNhY3Rpb24gcmVtb3ZlKEZyYWdtZW50IGZyYWdtZW50KSB7CisgICAgICAgIGlmIChmcmFnbWVudC5tSW1tZWRpYXRlQWN0aXZpdHkgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiRnJhZ21lbnQgbm90IGFkZGVkOiAiICsgZnJhZ21lbnQpOworICAgICAgICB9CisgICAgICAgIGZyYWdtZW50Lm1JbW1lZGlhdGVBY3Rpdml0eSA9IG51bGw7CisgICAgICAgIAorICAgICAgICBPcCBvcCA9IG5ldyBPcCgpOworICAgICAgICBvcC5jbWQgPSBPUF9SRU1PVkU7CisgICAgICAgIG9wLmZyYWdtZW50ID0gZnJhZ21lbnQ7CisgICAgICAgIGFkZE9wKG9wKTsKKyAgICAgICAgCisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBGcmFnbWVudFRyYW5zYWN0aW9uIGhpZGUoRnJhZ21lbnQgZnJhZ21lbnQpIHsKKyAgICAgICAgaWYgKGZyYWdtZW50Lm1JbW1lZGlhdGVBY3Rpdml0eSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJGcmFnbWVudCBub3QgYWRkZWQ6ICIgKyBmcmFnbWVudCk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIE9wIG9wID0gbmV3IE9wKCk7CisgICAgICAgIG9wLmNtZCA9IE9QX0hJREU7CisgICAgICAgIG9wLmZyYWdtZW50ID0gZnJhZ21lbnQ7CisgICAgICAgIGFkZE9wKG9wKTsKKyAgICAgICAgCisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgRnJhZ21lbnRUcmFuc2FjdGlvbiBzaG93KEZyYWdtZW50IGZyYWdtZW50KSB7CisgICAgICAgIGlmIChmcmFnbWVudC5tSW1tZWRpYXRlQWN0aXZpdHkgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiRnJhZ21lbnQgbm90IGFkZGVkOiAiICsgZnJhZ21lbnQpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBPcCBvcCA9IG5ldyBPcCgpOworICAgICAgICBvcC5jbWQgPSBPUF9TSE9XOworICAgICAgICBvcC5mcmFnbWVudCA9IGZyYWdtZW50OworICAgICAgICBhZGRPcChvcCk7CisgICAgICAgIAorICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisgICAgCisgICAgcHVibGljIEZyYWdtZW50VHJhbnNhY3Rpb24gc2V0Q3VzdG9tQW5pbWF0aW9ucyhpbnQgZW50ZXIsIGludCBleGl0KSB7CisgICAgICAgIG1FbnRlckFuaW0gPSBlbnRlcjsKKyAgICAgICAgbUV4aXRBbmltID0gZXhpdDsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBGcmFnbWVudFRyYW5zYWN0aW9uIHNldFRyYW5zaXRpb24oaW50IHRyYW5zaXRpb24pIHsKKyAgICAgICAgbVRyYW5zaXRpb24gPSB0cmFuc2l0aW9uOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisgICAgCisgICAgcHVibGljIEZyYWdtZW50VHJhbnNhY3Rpb24gc2V0VHJhbnNpdGlvblN0eWxlKGludCBzdHlsZVJlcykgeworICAgICAgICBtVHJhbnNpdGlvblN0eWxlID0gc3R5bGVSZXM7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgRnJhZ21lbnRUcmFuc2FjdGlvbiBhZGRUb0JhY2tTdGFjayhTdHJpbmcgbmFtZSkgeworICAgICAgICBtQWRkVG9CYWNrU3RhY2sgPSB0cnVlOworICAgICAgICBtTmFtZSA9IG5hbWU7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHZvaWQgYnVtcEJhY2tTdGFja05lc3RpbmcoaW50IGFtdCkgeworICAgICAgICBpZiAoIW1BZGRUb0JhY2tTdGFjaykgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmIChGcmFnbWVudE1hbmFnZXJJbXBsLkRFQlVHKSBMb2cudihUQUcsICJCdW1wIG5lc3RpbmcgaW4gIiArIHRoaXMKKyAgICAgICAgICAgICAgICArICIgYnkgIiArIGFtdCk7CisgICAgICAgIE9wIG9wID0gbUhlYWQ7CisgICAgICAgIHdoaWxlIChvcCAhPSBudWxsKSB7CisgICAgICAgICAgICBvcC5mcmFnbWVudC5tQmFja1N0YWNrTmVzdGluZyArPSBhbXQ7CisgICAgICAgICAgICBpZiAoRnJhZ21lbnRNYW5hZ2VySW1wbC5ERUJVRykgTG9nLnYoVEFHLCAiQnVtcCBuZXN0aW5nIG9mICIKKyAgICAgICAgICAgICAgICAgICAgKyBvcC5mcmFnbWVudCArICIgdG8gIiArIG9wLmZyYWdtZW50Lm1CYWNrU3RhY2tOZXN0aW5nKTsKKyAgICAgICAgICAgIGlmIChvcC5yZW1vdmVkICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpPW9wLnJlbW92ZWQuc2l6ZSgpLTE7IGk+PTA7IGktLSkgeworICAgICAgICAgICAgICAgICAgICBGcmFnbWVudCByID0gb3AucmVtb3ZlZC5nZXQoaSk7CisgICAgICAgICAgICAgICAgICAgIHIubUJhY2tTdGFja05lc3RpbmcgKz0gYW10OworICAgICAgICAgICAgICAgICAgICBpZiAoRnJhZ21lbnRNYW5hZ2VySW1wbC5ERUJVRykgTG9nLnYoVEFHLCAiQnVtcCBuZXN0aW5nIG9mICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHIgKyAiIHRvICIgKyByLm1CYWNrU3RhY2tOZXN0aW5nKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvcCA9IG9wLm5leHQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGNvbW1pdCgpIHsKKyAgICAgICAgaWYgKG1Db21taXR0ZWQpIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImNvbW1pdCBhbHJlYWR5IGNhbGxlZCIpOworICAgICAgICBpZiAoRnJhZ21lbnRNYW5hZ2VySW1wbC5ERUJVRykgTG9nLnYoVEFHLCAiQ29tbWl0OiAiICsgdGhpcyk7CisgICAgICAgIG1Db21taXR0ZWQgPSB0cnVlOworICAgICAgICBpZiAobUFkZFRvQmFja1N0YWNrKSB7CisgICAgICAgICAgICBtSW5kZXggPSBtTWFuYWdlci5hbGxvY0JhY2tTdGFja0luZGV4KHRoaXMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUluZGV4ID0gLTE7CisgICAgICAgIH0KKyAgICAgICAgbU1hbmFnZXIuZW5xdWV1ZUFjdGlvbih0aGlzKTsKKyAgICAgICAgcmV0dXJuIG1JbmRleDsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICBpZiAoRnJhZ21lbnRNYW5hZ2VySW1wbC5ERUJVRykgTG9nLnYoVEFHLCAiUnVuOiAiICsgdGhpcyk7CisgICAgICAgIAorICAgICAgICBpZiAobUFkZFRvQmFja1N0YWNrKSB7CisgICAgICAgICAgICBpZiAobUluZGV4IDwgMCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImFkZFRvQmFja1N0YWNrKCkgY2FsbGVkIGFmdGVyIGNvbW1pdCgpIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBidW1wQmFja1N0YWNrTmVzdGluZygxKTsKKworICAgICAgICBPcCBvcCA9IG1IZWFkOworICAgICAgICB3aGlsZSAob3AgIT0gbnVsbCkgeworICAgICAgICAgICAgc3dpdGNoIChvcC5jbWQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIE9QX0FERDogeworICAgICAgICAgICAgICAgICAgICBGcmFnbWVudCBmID0gb3AuZnJhZ21lbnQ7CisgICAgICAgICAgICAgICAgICAgIGYubU5leHRBbmltID0gb3AuZW50ZXJBbmltOworICAgICAgICAgICAgICAgICAgICBtTWFuYWdlci5hZGRGcmFnbWVudChmLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE9QX1JFUExBQ0U6IHsKKyAgICAgICAgICAgICAgICAgICAgRnJhZ21lbnQgZiA9IG9wLmZyYWdtZW50OworICAgICAgICAgICAgICAgICAgICBpZiAobU1hbmFnZXIubUFkZGVkICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxtTWFuYWdlci5tQWRkZWQuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcmFnbWVudCBvbGQgPSBtTWFuYWdlci5tQWRkZWQuZ2V0KGkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChGcmFnbWVudE1hbmFnZXJJbXBsLkRFQlVHKSBMb2cudihUQUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT1BfUkVQTEFDRTogYWRkaW5nPSIgKyBmICsgIiBvbGQ9IiArIG9sZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9sZC5tQ29udGFpbmVySWQgPT0gZi5tQ29udGFpbmVySWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wLnJlbW92ZWQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3AucmVtb3ZlZCA9IG5ldyBBcnJheUxpc3Q8RnJhZ21lbnQ+KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3AucmVtb3ZlZC5hZGQob2xkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkLm1OZXh0QW5pbSA9IG9wLmV4aXRBbmltOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUFkZFRvQmFja1N0YWNrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGQubUJhY2tTdGFja05lc3RpbmcgKz0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChGcmFnbWVudE1hbmFnZXJJbXBsLkRFQlVHKSBMb2cudihUQUcsICJCdW1wIG5lc3Rpbmcgb2YgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG9sZCArICIgdG8gIiArIG9sZC5tQmFja1N0YWNrTmVzdGluZyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1hbmFnZXIucmVtb3ZlRnJhZ21lbnQob2xkLCBtVHJhbnNpdGlvbiwgbVRyYW5zaXRpb25TdHlsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGYubU5leHRBbmltID0gb3AuZW50ZXJBbmltOworICAgICAgICAgICAgICAgICAgICBtTWFuYWdlci5hZGRGcmFnbWVudChmLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE9QX1JFTU9WRTogeworICAgICAgICAgICAgICAgICAgICBGcmFnbWVudCBmID0gb3AuZnJhZ21lbnQ7CisgICAgICAgICAgICAgICAgICAgIGYubU5leHRBbmltID0gb3AuZXhpdEFuaW07CisgICAgICAgICAgICAgICAgICAgIG1NYW5hZ2VyLnJlbW92ZUZyYWdtZW50KGYsIG1UcmFuc2l0aW9uLCBtVHJhbnNpdGlvblN0eWxlKTsKKyAgICAgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgT1BfSElERTogeworICAgICAgICAgICAgICAgICAgICBGcmFnbWVudCBmID0gb3AuZnJhZ21lbnQ7CisgICAgICAgICAgICAgICAgICAgIGYubU5leHRBbmltID0gb3AuZXhpdEFuaW07CisgICAgICAgICAgICAgICAgICAgIG1NYW5hZ2VyLmhpZGVGcmFnbWVudChmLCBtVHJhbnNpdGlvbiwgbVRyYW5zaXRpb25TdHlsZSk7CisgICAgICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE9QX1NIT1c6IHsKKyAgICAgICAgICAgICAgICAgICAgRnJhZ21lbnQgZiA9IG9wLmZyYWdtZW50OworICAgICAgICAgICAgICAgICAgICBmLm1OZXh0QW5pbSA9IG9wLmVudGVyQW5pbTsKKyAgICAgICAgICAgICAgICAgICAgbU1hbmFnZXIuc2hvd0ZyYWdtZW50KGYsIG1UcmFuc2l0aW9uLCBtVHJhbnNpdGlvblN0eWxlKTsKKyAgICAgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5rbm93biBjbWQ6ICIgKyBvcC5jbWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgb3AgPSBvcC5uZXh0OworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBtTWFuYWdlci5tb3ZlVG9TdGF0ZShtTWFuYWdlci5tQ3VyU3RhdGUsIG1UcmFuc2l0aW9uLAorICAgICAgICAgICAgICAgIG1UcmFuc2l0aW9uU3R5bGUsIHRydWUpOworICAgICAgICBpZiAobU1hbmFnZXIubU5lZWRNZW51SW52YWxpZGF0ZSAmJiBtTWFuYWdlci5tQWN0aXZpdHkgIT0gbnVsbCkgeworICAgICAgICAgICAgbU1hbmFnZXIubUFjdGl2aXR5LmludmFsaWRhdGVPcHRpb25zTWVudSgpOworICAgICAgICAgICAgbU1hbmFnZXIubU5lZWRNZW51SW52YWxpZGF0ZSA9IGZhbHNlOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAobUFkZFRvQmFja1N0YWNrKSB7CisgICAgICAgICAgICBtTWFuYWdlci5hZGRCYWNrU3RhY2tTdGF0ZSh0aGlzKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBwb3BGcm9tQmFja1N0YWNrKCkgeworICAgICAgICBpZiAoRnJhZ21lbnRNYW5hZ2VySW1wbC5ERUJVRykgTG9nLnYoVEFHLCAicG9wRnJvbUJhY2tTdGFjazogIiArIHRoaXMpOworCisgICAgICAgIGJ1bXBCYWNrU3RhY2tOZXN0aW5nKC0xKTsKKyAgICAgICAgCisgICAgICAgIE9wIG9wID0gbVRhaWw7CisgICAgICAgIHdoaWxlIChvcCAhPSBudWxsKSB7CisgICAgICAgICAgICBzd2l0Y2ggKG9wLmNtZCkgeworICAgICAgICAgICAgICAgIGNhc2UgT1BfQUREOiB7CisgICAgICAgICAgICAgICAgICAgIEZyYWdtZW50IGYgPSBvcC5mcmFnbWVudDsKKyAgICAgICAgICAgICAgICAgICAgZi5tSW1tZWRpYXRlQWN0aXZpdHkgPSBudWxsOworICAgICAgICAgICAgICAgICAgICBtTWFuYWdlci5yZW1vdmVGcmFnbWVudChmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYWdtZW50TWFuYWdlckltcGwucmV2ZXJzZVRyYW5zaXQobVRyYW5zaXRpb24pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1UcmFuc2l0aW9uU3R5bGUpOworICAgICAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBPUF9SRVBMQUNFOiB7CisgICAgICAgICAgICAgICAgICAgIEZyYWdtZW50IGYgPSBvcC5mcmFnbWVudDsKKyAgICAgICAgICAgICAgICAgICAgZi5tSW1tZWRpYXRlQWN0aXZpdHkgPSBudWxsOworICAgICAgICAgICAgICAgICAgICBtTWFuYWdlci5yZW1vdmVGcmFnbWVudChmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYWdtZW50TWFuYWdlckltcGwucmV2ZXJzZVRyYW5zaXQobVRyYW5zaXRpb24pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1UcmFuc2l0aW9uU3R5bGUpOworICAgICAgICAgICAgICAgICAgICBpZiAob3AucmVtb3ZlZCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8b3AucmVtb3ZlZC5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYWdtZW50IG9sZCA9IG9wLnJlbW92ZWQuZ2V0KGkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYubUltbWVkaWF0ZUFjdGl2aXR5ID0gbU1hbmFnZXIubUFjdGl2aXR5OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1NYW5hZ2VyLmFkZEZyYWdtZW50KG9sZCwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE9QX1JFTU9WRTogeworICAgICAgICAgICAgICAgICAgICBGcmFnbWVudCBmID0gb3AuZnJhZ21lbnQ7CisgICAgICAgICAgICAgICAgICAgIGYubUltbWVkaWF0ZUFjdGl2aXR5ID0gbU1hbmFnZXIubUFjdGl2aXR5OworICAgICAgICAgICAgICAgICAgICBtTWFuYWdlci5hZGRGcmFnbWVudChmLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE9QX0hJREU6IHsKKyAgICAgICAgICAgICAgICAgICAgRnJhZ21lbnQgZiA9IG9wLmZyYWdtZW50OworICAgICAgICAgICAgICAgICAgICBtTWFuYWdlci5zaG93RnJhZ21lbnQoZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcmFnbWVudE1hbmFnZXJJbXBsLnJldmVyc2VUcmFuc2l0KG1UcmFuc2l0aW9uKSwgbVRyYW5zaXRpb25TdHlsZSk7CisgICAgICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE9QX1NIT1c6IHsKKyAgICAgICAgICAgICAgICAgICAgRnJhZ21lbnQgZiA9IG9wLmZyYWdtZW50OworICAgICAgICAgICAgICAgICAgICBtTWFuYWdlci5oaWRlRnJhZ21lbnQoZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcmFnbWVudE1hbmFnZXJJbXBsLnJldmVyc2VUcmFuc2l0KG1UcmFuc2l0aW9uKSwgbVRyYW5zaXRpb25TdHlsZSk7CisgICAgICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OiB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVua25vd24gY21kOiAiICsgb3AuY21kKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIG9wID0gb3AucHJldjsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgbU1hbmFnZXIubW92ZVRvU3RhdGUobU1hbmFnZXIubUN1clN0YXRlLAorICAgICAgICAgICAgICAgIEZyYWdtZW50TWFuYWdlckltcGwucmV2ZXJzZVRyYW5zaXQobVRyYW5zaXRpb24pLCBtVHJhbnNpdGlvblN0eWxlLCB0cnVlKTsKKyAgICAgICAgaWYgKG1NYW5hZ2VyLm1OZWVkTWVudUludmFsaWRhdGUgJiYgbU1hbmFnZXIubUFjdGl2aXR5ICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1NYW5hZ2VyLm1BY3Rpdml0eS5pbnZhbGlkYXRlT3B0aW9uc01lbnUoKTsKKyAgICAgICAgICAgIG1NYW5hZ2VyLm1OZWVkTWVudUludmFsaWRhdGUgPSBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtSW5kZXggPj0gMCkgeworICAgICAgICAgICAgbU1hbmFnZXIuZnJlZUJhY2tTdGFja0luZGV4KG1JbmRleCk7CisgICAgICAgICAgICBtSW5kZXggPSAtMTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiBtTmFtZTsKKyAgICB9CisgICAgCisgICAgcHVibGljIGludCBnZXRUcmFuc2l0aW9uKCkgeworICAgICAgICByZXR1cm4gbVRyYW5zaXRpb247CisgICAgfQorICAgIAorICAgIHB1YmxpYyBpbnQgZ2V0VHJhbnNpdGlvblN0eWxlKCkgeworICAgICAgICByZXR1cm4gbVRyYW5zaXRpb25TdHlsZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQ29udGV4dEltcGwuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9Db250ZXh0SW1wbC5qYXZhCmluZGV4IGU3ZWIwM2UuLmUzNGJhZDIgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9Db250ZXh0SW1wbC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9Db250ZXh0SW1wbC5qYXZhCkBAIC01NiwxMSArNTYsMTQgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkFzc2V0TWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlhtbFJlc291cmNlUGFyc2VyOworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuRGF0YWJhc2VFcnJvckhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2U7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2UuQ3Vyc29yRmFjdG9yeTsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOwogaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuU2Vuc29yTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmxvY2F0aW9uLkNvdW50cnlEZXRlY3RvcjsKK2ltcG9ydCBhbmRyb2lkLmxvY2F0aW9uLklDb3VudHJ5RGV0ZWN0b3I7CiBpbXBvcnQgYW5kcm9pZC5sb2NhdGlvbi5JTG9jYXRpb25NYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQubG9jYXRpb24uTG9jYXRpb25NYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9NYW5hZ2VyOwpAQCAtODksNyArOTIsNyBAQAogaW1wb3J0IGFuZHJvaWQub3MuRmlsZVV0aWxzLkZpbGVTdGF0dXM7CiBpbXBvcnQgYW5kcm9pZC5vcy5zdG9yYWdlLlN0b3JhZ2VNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlRlbGVwaG9ueU1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LkNsaXBib2FyZE1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNsaXBib2FyZE1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkFuZHJvaWRSdW50aW1lRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiBpbXBvcnQgYW5kcm9pZC52aWV3LkNvbnRleHRUaGVtZVdyYXBwZXI7CkBAIC0xNjcsNiArMTcwLDcgQEAKICAgICBwcml2YXRlIHN0YXRpYyBUaHJvdHRsZU1hbmFnZXIgc1Rocm90dGxlTWFuYWdlcjsKICAgICBwcml2YXRlIHN0YXRpYyBXaWZpTWFuYWdlciBzV2lmaU1hbmFnZXI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgTG9jYXRpb25NYW5hZ2VyIHNMb2NhdGlvbk1hbmFnZXI7CisgICAgcHJpdmF0ZSBzdGF0aWMgQ291bnRyeURldGVjdG9yIHNDb3VudHJ5RGV0ZWN0b3I7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSGFzaE1hcDxGaWxlLCBTaGFyZWRQcmVmZXJlbmNlc0ltcGw+IHNTaGFyZWRQcmVmcyA9CiAgICAgICAgICAgICBuZXcgSGFzaE1hcDxGaWxlLCBTaGFyZWRQcmVmZXJlbmNlc0ltcGw+KCk7CiAKQEAgLTU0Miw2ICs1NDYsMTUgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU1FMaXRlRGF0YWJhc2Ugb3Blbk9yQ3JlYXRlRGF0YWJhc2UoU3RyaW5nIG5hbWUsIGludCBtb2RlLCBDdXJzb3JGYWN0b3J5IGZhY3RvcnksCisgICAgICAgICAgICBEYXRhYmFzZUVycm9ySGFuZGxlciBlcnJvckhhbmRsZXIpIHsKKyAgICAgICAgRmlsZSBmID0gdmFsaWRhdGVGaWxlUGF0aChuYW1lLCB0cnVlKTsKKyAgICAgICAgU1FMaXRlRGF0YWJhc2UgZGIgPSBTUUxpdGVEYXRhYmFzZS5vcGVuT3JDcmVhdGVEYXRhYmFzZShmLmdldFBhdGgoKSwgZmFjdG9yeSwgZXJyb3JIYW5kbGVyKTsKKyAgICAgICAgc2V0RmlsZVBlcm1pc3Npb25zRnJvbU1vZGUoZi5nZXRQYXRoKCksIG1vZGUsIDApOworICAgICAgICByZXR1cm4gZGI7CisgICAgfQorCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gZGVsZXRlRGF0YWJhc2UoU3RyaW5nIG5hbWUpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIEZpbGUgZiA9IHZhbGlkYXRlRmlsZVBhdGgobmFtZSwgZmFsc2UpOwpAQCAtNjE5LDcgKzYzMiw4IEBACiAgICAgICAgICAgICAgICAgICAgICsgIiBJcyB0aGlzIHJlYWxseSB3aGF0IHlvdSB3YW50PyIpOwogICAgICAgICB9CiAgICAgICAgIG1NYWluVGhyZWFkLmdldEluc3RydW1lbnRhdGlvbigpLmV4ZWNTdGFydEFjdGl2aXR5KAotICAgICAgICAgICAgZ2V0T3V0ZXJDb250ZXh0KCksIG1NYWluVGhyZWFkLmdldEFwcGxpY2F0aW9uVGhyZWFkKCksIG51bGwsIG51bGwsIGludGVudCwgLTEpOworICAgICAgICAgICAgZ2V0T3V0ZXJDb250ZXh0KCksIG1NYWluVGhyZWFkLmdldEFwcGxpY2F0aW9uVGhyZWFkKCksIG51bGwsCisgICAgICAgICAgICAoQWN0aXZpdHkpbnVsbCwgaW50ZW50LCAtMSk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC05NDMsNiArOTU3LDggQEAKICAgICAgICAgICAgIHJldHVybiBBY2Nlc3NpYmlsaXR5TWFuYWdlci5nZXRJbnN0YW5jZSh0aGlzKTsKICAgICAgICAgfSBlbHNlIGlmIChMT0NBVElPTl9TRVJWSUNFLmVxdWFscyhuYW1lKSkgewogICAgICAgICAgICAgcmV0dXJuIGdldExvY2F0aW9uTWFuYWdlcigpOworICAgICAgICB9IGVsc2UgaWYgKENPVU5UUllfREVURUNUT1IuZXF1YWxzKG5hbWUpKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0Q291bnRyeURldGVjdG9yKCk7CiAgICAgICAgIH0gZWxzZSBpZiAoU0VBUkNIX1NFUlZJQ0UuZXF1YWxzKG5hbWUpKSB7CiAgICAgICAgICAgICByZXR1cm4gZ2V0U2VhcmNoTWFuYWdlcigpOwogICAgICAgICB9IGVsc2UgaWYgKFNFTlNPUl9TRVJWSUNFLmVxdWFscyhuYW1lKSkgewpAQCAtMTEwOSw2ICsxMTI1LDE3IEBACiAgICAgICAgIHJldHVybiBzTG9jYXRpb25NYW5hZ2VyOwogICAgIH0KIAorICAgIHByaXZhdGUgQ291bnRyeURldGVjdG9yIGdldENvdW50cnlEZXRlY3RvcigpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChzU3luYykgeworICAgICAgICAgICAgaWYgKHNDb3VudHJ5RGV0ZWN0b3IgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIElCaW5kZXIgYiA9IFNlcnZpY2VNYW5hZ2VyLmdldFNlcnZpY2UoQ09VTlRSWV9ERVRFQ1RPUik7CisgICAgICAgICAgICAgICAgSUNvdW50cnlEZXRlY3RvciBzZXJ2aWNlID0gSUNvdW50cnlEZXRlY3Rvci5TdHViLmFzSW50ZXJmYWNlKGIpOworICAgICAgICAgICAgICAgIHNDb3VudHJ5RGV0ZWN0b3IgPSBuZXcgQ291bnRyeURldGVjdG9yKHNlcnZpY2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBzQ291bnRyeURldGVjdG9yOworICAgIH0KKwogICAgIHByaXZhdGUgU2VhcmNoTWFuYWdlciBnZXRTZWFyY2hNYW5hZ2VyKCkgewogICAgICAgICBzeW5jaHJvbml6ZWQgKG1TeW5jKSB7CiAgICAgICAgICAgICBpZiAobVNlYXJjaE1hbmFnZXIgPT0gbnVsbCkgewpAQCAtMjc1Nyw2ICsyNzg0LDEzIEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIHYgIT0gbnVsbCA/IHYgOiBkZWZWYWx1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIFNldDxTdHJpbmc+IGdldFN0cmluZ1NldChTdHJpbmcga2V5LCBTZXQ8U3RyaW5nPiBkZWZWYWx1ZXMpIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgICAgIFNldDxTdHJpbmc+IHYgPSAoU2V0PFN0cmluZz4pIG1NYXAuZ2V0KGtleSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHYgIT0gbnVsbCA/IHYgOiBkZWZWYWx1ZXM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgaW50IGdldEludChTdHJpbmcga2V5LCBpbnQgZGVmVmFsdWUpIHsKICAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewpAQCAtMjc5OSw2ICsyODMzLDEyIEBACiAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1YmxpYyBFZGl0b3IgcHV0U3RyaW5nU2V0KFN0cmluZyBrZXksIFNldDxTdHJpbmc+IHZhbHVlcykgeworICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgICAgICAgICBtTW9kaWZpZWQucHV0KGtleSwgdmFsdWVzKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogICAgICAgICAgICAgcHVibGljIEVkaXRvciBwdXRJbnQoU3RyaW5nIGtleSwgaW50IHZhbHVlKSB7CiAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CiAgICAgICAgICAgICAgICAgICAgIG1Nb2RpZmllZC5wdXQoa2V5LCB2YWx1ZSk7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvRGlhbG9nLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvRGlhbG9nLmphdmEKaW5kZXggZGE4YzllNS4uYTBiZTBjZCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0RpYWxvZy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9EaWFsb2cuamF2YQpAQCAtMTYsMTggKzE2LDIxIEBACiAKIHBhY2thZ2UgYW5kcm9pZC5hcHA7CiAKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5hcHAuQWN0aW9uQmFySW1wbDsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5wb2xpY3kuUG9saWN5TWFuYWdlcjsKIAotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5EaWFsb2dJbnRlcmZhY2U7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHRXcmFwcGVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5EaWFsb2dJbnRlcmZhY2U7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKIGltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwogaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuQWN0aW9uTW9kZTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuQ29udGV4dE1lbnU7CitpbXBvcnQgYW5kcm9pZC52aWV3LkNvbnRleHRNZW51LkNvbnRleHRNZW51SW5mbzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuQ29udGV4dFRoZW1lV3JhcHBlcjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuR3Jhdml0eTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7CkBAIC0zNiwxMyArMzksMTIgQEAKIGltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUl0ZW07CiBpbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3Lk9uQ3JlYXRlQ29udGV4dE1lbnVMaXN0ZW5lcjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0NvbmZpZ3VyYXRpb247CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwLkxheW91dFBhcmFtczsKIGltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93OwogaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQudmlldy5Db250ZXh0TWVudS5Db250ZXh0TWVudUluZm87Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXcuT25DcmVhdGVDb250ZXh0TWVudUxpc3RlbmVyOwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXAuTGF5b3V0UGFyYW1zOwogaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlFdmVudDsKIAogaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKQEAgLTc2LDYgKzc4LDcgQEAKICAgICBmaW5hbCBXaW5kb3dNYW5hZ2VyIG1XaW5kb3dNYW5hZ2VyOwogICAgIFdpbmRvdyBtV2luZG93OwogICAgIFZpZXcgbURlY29yOworICAgIHByaXZhdGUgQWN0aW9uQmFySW1wbCBtQWN0aW9uQmFyOwogICAgIC8qKgogICAgICAqIFRoaXMgZmllbGQgc2hvdWxkIGJlIG1hZGUgcHJpdmF0ZSwgc28gaXQgaXMgaGlkZGVuIGZyb20gdGhlIFNESy4KICAgICAgKiB7QGhpZGV9CkBAIC0xNzcsNiArMTgwLDE1IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogUmV0cmlldmUgdGhlIHtAbGluayBBY3Rpb25CYXJ9IGF0dGFjaGVkIHRvIHRoaXMgZGlhbG9nLCBpZiBwcmVzZW50LgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgQWN0aW9uQmFyIGF0dGFjaGVkIHRvIHRoZSBkaWFsb2cgb3IgbnVsbCBpZiBubyBBY3Rpb25CYXIgaXMgcHJlc2VudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQWN0aW9uQmFyIGdldEFjdGlvbkJhcigpIHsKKyAgICAgICAgcmV0dXJuIG1BY3Rpb25CYXI7CisgICAgfQorCisgICAgLyoqCiAgICAgICogU2V0cyB0aGUgQWN0aXZpdHkgdGhhdCBvd25zIHRoaXMgZGlhbG9nLiBBbiBleGFtcGxlIHVzZTogVGhpcyBEaWFsb2cgd2lsbAogICAgICAqIHVzZSB0aGUgc3VnZ2VzdGVkIHZvbHVtZSBjb250cm9sIHN0cmVhbSBvZiB0aGUgQWN0aXZpdHkuCiAgICAgICogCkBAIC0yMTYsNiArMjI4LDkgQEAKICAgICBwdWJsaWMgdm9pZCBzaG93KCkgewogICAgICAgICBpZiAobVNob3dpbmcpIHsKICAgICAgICAgICAgIGlmIChtRGVjb3IgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChtV2luZG93Lmhhc0ZlYXR1cmUoV2luZG93LkZFQVRVUkVfQUNUSU9OX0JBUikpIHsKKyAgICAgICAgICAgICAgICAgICAgbVdpbmRvdy5pbnZhbGlkYXRlUGFuZWxNZW51KFdpbmRvdy5GRUFUVVJFX0FDVElPTl9CQVIpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBtRGVjb3Iuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuOwpAQCAtMjI3LDYgKzI0MiwxMSBAQAogCiAgICAgICAgIG9uU3RhcnQoKTsKICAgICAgICAgbURlY29yID0gbVdpbmRvdy5nZXREZWNvclZpZXcoKTsKKworICAgICAgICBpZiAobUFjdGlvbkJhciA9PSBudWxsICYmIG1XaW5kb3cuaGFzRmVhdHVyZShXaW5kb3cuRkVBVFVSRV9BQ1RJT05fQkFSKSkgeworICAgICAgICAgICAgbUFjdGlvbkJhciA9IG5ldyBBY3Rpb25CYXJJbXBsKHRoaXMpOworICAgICAgICB9CisKICAgICAgICAgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMgbCA9IG1XaW5kb3cuZ2V0QXR0cmlidXRlcygpOwogICAgICAgICBpZiAoKGwuc29mdElucHV0TW9kZQogICAgICAgICAgICAgICAgICYgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuU09GVF9JTlBVVF9JU19GT1JXQVJEX05BVklHQVRJT04pID09IDApIHsKQEAgLTMxMCw3ICszMzAsNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNpbWlsYXIgdG8ge0BsaW5rIEFjdGl2aXR5I29uQ3JlYXRlfSwgeW91IHNob3VsZCBpbml0aWFsaXplZCB5b3VyIGRpYWxvZworICAgICAqIFNpbWlsYXIgdG8ge0BsaW5rIEFjdGl2aXR5I29uQ3JlYXRlfSwgeW91IHNob3VsZCBpbml0aWFsaXplIHlvdXIgZGlhbG9nCiAgICAgICogaW4gdGhpcyBtZXRob2QsIGluY2x1ZGluZyBjYWxsaW5nIHtAbGluayAjc2V0Q29udGVudFZpZXd9LgogICAgICAqIEBwYXJhbSBzYXZlZEluc3RhbmNlU3RhdGUgSWYgdGhpcyBkaWFsb2cgaXMgYmVpbmcgcmVpbml0YWxpemVkIGFmdGVyIGEKICAgICAgKiAgICAgdGhlIGhvc3RpbmcgYWN0aXZpdHkgd2FzIHByZXZpb3VzbHkgc2h1dCBkb3duLCBob2xkcyB0aGUgcmVzdWx0IGZyb20KQEAgLTc3NSw2ICs3OTUsMTMgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBAc2VlIEFjdGl2aXR5I2ludmFsaWRhdGVPcHRpb25zTWVudSgpCisgICAgICovCisgICAgcHVibGljIHZvaWQgaW52YWxpZGF0ZU9wdGlvbnNNZW51KCkgeworICAgICAgICBtV2luZG93LmludmFsaWRhdGVQYW5lbE1lbnUoV2luZG93LkZFQVRVUkVfT1BUSU9OU19QQU5FTCk7CisgICAgfQorCisgICAgLyoqCiAgICAgICogQHNlZSBBY3Rpdml0eSNvbkNyZWF0ZUNvbnRleHRNZW51KENvbnRleHRNZW51LCBWaWV3LCBDb250ZXh0TWVudUluZm8pCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgb25DcmVhdGVDb250ZXh0TWVudShDb250ZXh0TWVudSBtZW51LCBWaWV3IHYsIENvbnRleHRNZW51SW5mbyBtZW51SW5mbykgewpAQCAtODMyLDggKzg1OSwxNSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcHVibGljIEFjdGlvbk1vZGUgb25TdGFydEFjdGlvbk1vZGUoQWN0aW9uTW9kZS5DYWxsYmFjayBjYWxsYmFjaykgeworICAgICAgICBpZiAobUFjdGlvbkJhciAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbUFjdGlvbkJhci5zdGFydEFjdGlvbk1vZGUoY2FsbGJhY2spOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKwogICAgIC8qKgotICAgICAqIEByZXR1cm4gVGhlIGFjdGl2aXR5IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGRpYWxvZywgb3IgbnVsbCBpZiB0aGVyZSBpcyBubyBhc3NvY2FpdGVkIGFjdGl2aXR5LgorICAgICAqIEByZXR1cm4gVGhlIGFjdGl2aXR5IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGRpYWxvZywgb3IgbnVsbCBpZiB0aGVyZSBpcyBubyBhc3NvY2lhdGVkIGFjdGl2aXR5LgogICAgICAqLwogICAgIHByaXZhdGUgQ29tcG9uZW50TmFtZSBnZXRBc3NvY2lhdGVkQWN0aXZpdHkoKSB7CiAgICAgICAgIEFjdGl2aXR5IGFjdGl2aXR5ID0gbU93bmVyQWN0aXZpdHk7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvRGlhbG9nRnJhZ21lbnQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9EaWFsb2dGcmFnbWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4ZGZhYzkKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvRGlhbG9nRnJhZ21lbnQuamF2YQpAQCAtMCwwICsxLDQ1OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5hcHA7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuRGlhbG9nSW50ZXJmYWNlOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3c7CitpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXI7CisKKy8qKgorICogQSBmcmFnbWVudCB0aGF0IGRpc3BsYXlzIGEgZGlhbG9nIHdpbmRvdywgZmxvYXRpbmcgb24gdG9wIG9mIGl0cworICogYWN0aXZpdHkncyB3aW5kb3cuICBUaGlzIGZyYWdtZW50IGNvbnRhaW5zIGEgRGlhbG9nIG9iamVjdCwgd2hpY2ggaXQKKyAqIGRpc3BsYXlzIGFzIGFwcHJvcHJpYXRlIGJhc2VkIG9uIHRoZSBmcmFnbWVudCdzIHN0YXRlLiAgQ29udHJvbCBvZgorICogdGhlIGRpYWxvZyAoZGVjaWRpbmcgd2hlbiB0byBzaG93LCBoaWRlLCBkaXNtaXNzIGl0KSBzaG91bGQgYmUgZG9uZSB0aHJvdWdoCisgKiB0aGUgQVBJIGhlcmUsIG5vdCB3aXRoIGRpcmVjdCBjYWxscyBvbiB0aGUgZGlhbG9nLgorICoKKyAqIDxwPkltcGxlbWVudGF0aW9ucyBzaG91bGQgb3ZlcnJpZGUgdGhpcyBjbGFzcyBhbmQgaW1wbGVtZW50CisgKiB7QGxpbmsgI29uQ3JlYXRlVmlldyhMYXlvdXRJbmZsYXRlciwgVmlld0dyb3VwLCBCdW5kbGUpfSB0byBzdXBwbHkgdGhlCisgKiBjb250ZW50IG9mIHRoZSBkaWFsb2cuICBBbHRlcm5hdGl2ZWx5LCB0aGV5IGNhbiBvdmVycmlkZQorICoge0BsaW5rICNvbkNyZWF0ZURpYWxvZyhCdW5kbGUpfSB0byBjcmVhdGUgYW4gZW50aXJlbHkgY3VzdG9tIGRpYWxvZywgc3VjaAorICogYXMgYW4gQWxlcnREaWFsb2csIHdpdGggaXRzIG93biBjb250ZW50LgorICoKKyAqIDxwPlRvcGljcyBjb3ZlcmVkIGhlcmU6CisgKiA8b2w+CisgKiA8bGk+PGEgaHJlZj0iI0xpZmVjeWNsZSI+TGlmZWN5Y2xlPC9hPgorICogPGxpPjxhIGhyZWY9IiNCYXNpY0RpYWxvZyI+QmFzaWMgRGlhbG9nPC9hPgorICogPGxpPjxhIGhyZWY9IiNBbGVydERpYWxvZyI+QWxlcnQgRGlhbG9nPC9hPgorICogPGxpPjxhIGhyZWY9IiNEaWFsb2dPckVtYmVkIj5TZWxlY3RpbmcgQmV0d2VlbiBEaWFsb2cgb3IgRW1iZWRkaW5nPC9hPgorICogPC9vbD4KKyAqCisgKiA8YSBuYW1lPSJMaWZlY3ljbGUiPjwvYT4KKyAqIDxoMz5MaWZlY3ljbGU8L2gzPgorICoKKyAqIDxwPkRpYWxvZ0ZyYWdtZW50IGRvZXMgdmFyaW91cyB0aGluZ3MgdG8ga2VlcCB0aGUgZnJhZ21lbnQncyBsaWZlY3ljbGUKKyAqIGRyaXZpbmcgaXQsIGluc3RlYWQgb2YgdGhlIERpYWxvZy4gIE5vdGUgdGhhdCBkaWFsb2dzIGFyZSBnZW5lcmFsbHkKKyAqIGF1dG9ub21vdXMgZW50aXRpZXMgLS0gdGhleSBhcmUgdGhlaXIgb3duIHdpbmRvdywgcmVjZWl2aW5nIHRoZWlyIG93bgorICogaW5wdXQgZXZlbnRzLCBhbmQgb2Z0ZW4gZGVjaWRpbmcgb24gdGhlaXIgb3duIHdoZW4gdG8gZGlzYXBwZWFyIChieQorICogcmVjZWl2aW5nIGEgYmFjayBrZXkgZXZlbnQgb3IgdGhlIHVzZXIgY2xpY2tpbmcgb24gYSBidXR0b24pLgorICoKKyAqIDxwPkRpYWxvZ0ZyYWdtZW50IG5lZWRzIHRvIGVuc3VyZSB0aGF0IHdoYXQgaXMgaGFwcGVuaW5nIHdpdGggdGhlIEZyYWdtZW50CisgKiBhbmQgRGlhbG9nIHN0YXRlcyByZW1haW5zIGNvbnNpc3RlbnQuICBUbyBkbyB0aGlzLCBpdCB3YXRjaGVzIGZvciBkaXNtaXNzCisgKiBldmVudHMgZnJvbSB0aGUgZGlhbG9nIGFuZCB0YWtlcyBhcmUgb2YgcmVtb3ZpbmcgaXRzIG93biBzdGF0ZSB3aGVuIHRoZXkKKyAqIGhhcHBlbi4gIFRoaXMgbWVhbnMgeW91IHNob3VsZCB1c2Uge0BsaW5rICNzaG93KEZyYWdtZW50TWFuYWdlciwgU3RyaW5nKX0KKyAqIG9yIHtAbGluayAjc2hvdyhGcmFnbWVudFRyYW5zYWN0aW9uLCBTdHJpbmcpfSB0byBhZGQgYW4gaW5zdGFuY2Ugb2YKKyAqIERpYWxvZ0ZyYWdtZW50IHRvIHlvdXIgVUksIGFzIHRoZXNlIGtlZXAgdHJhY2sgb2YgaG93IERpYWxvZ0ZyYWdtZW50IHNob3VsZAorICogcmVtb3ZlIGl0c2VsZiB3aGVuIHRoZSBkaWFsb2cgaXMgZGlzbWlzc2VkLgorICoKKyAqIDxhIG5hbWU9IkJhc2ljRGlhbG9nIj48L2E+CisgKiA8aDM+QmFzaWMgRGlhbG9nPC9oMz4KKyAqCisgKiA8cD5UaGUgc2ltcGxlc3QgdXNlIG9mIERpYWxvZ0ZyYWdtZW50IGlzIGFzIGEgZmxvYXRpbmcgY29udGFpbmVyIGZvciB0aGUKKyAqIGZyYWdtZW50J3MgdmlldyBoaWVyYXJjaHkuICBBIHNpbXBsZSBpbXBsZW1lbnRhdGlvbiBtYXkgbG9vayBsaWtlIHRoaXM6CisgKgorICoge0BzYW1wbGUgZGV2ZWxvcG1lbnQvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9GcmFnbWVudERpYWxvZy5qYXZhCisgKiAgICAgIGRpYWxvZ30KKyAqCisgKiA8cD5BbiBleGFtcGxlIHNob3dEaWFsb2coKSBtZXRob2Qgb24gdGhlIEFjdGl2aXR5IGNvdWxkIGJlOgorICoKKyAqIHtAc2FtcGxlIGRldmVsb3BtZW50L3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hcHAvRnJhZ21lbnREaWFsb2cuamF2YQorICogICAgICBhZGRfZGlhbG9nfQorICoKKyAqIDxwPlRoaXMgcmVtb3ZlcyBhbnkgY3VycmVudGx5IHNob3duIGRpYWxvZywgY3JlYXRlcyBhIG5ldyBEaWFsb2dGcmFnbWVudAorICogd2l0aCBhbiBhcmd1bWVudCwgYW5kIHNob3dzIGl0IGFzIGEgbmV3IHN0YXRlIG9uIHRoZSBiYWNrIHN0YWNrLiAgV2hlbiB0aGUKKyAqIHRyYW5zYWN0aW9uIGlzIHBvcHBlZCwgdGhlIGN1cnJlbnQgRGlhbG9nRnJhZ21lbnQgYW5kIGl0cyBEaWFsb2cgd2lsbCBiZQorICogZGVzdHJveWVkLCBhbmQgdGhlIHByZXZpb3VzIG9uZSAoaWYgYW55KSByZS1zaG93bi4gIE5vdGUgdGhhdCBpbiB0aGlzIGNhc2UKKyAqIERpYWxvZ0ZyYWdtZW50IHdpbGwgdGFrZSBjYXJlIG9mIHBvcHBpbmcgdGhlIHRyYW5zYWN0aW9uIG9mIHRoZSBEaWFsb2cKKyAqIGlzIGRpc21pc3NlZCBzZXBhcmF0ZWx5IGZyb20gaXQuCisgKgorICogPGEgbmFtZT0iQWxlcnREaWFsb2ciPjwvYT4KKyAqIDxoMz5BbGVydCBEaWFsb2c8L2gzPgorICoKKyAqIDxwPkluc3RlYWQgb2YgKG9yIGluIGFkZGl0aW9uIHRvKSBpbXBsZW1lbnRpbmcge0BsaW5rICNvbkNyZWF0ZVZpZXd9IHRvCisgKiBnZW5lcmF0ZSB0aGUgdmlldyBoaWVyYXJjaHkgaW5zaWRlIG9mIGEgZGlhbG9nLCB5b3UgbWF5IGltcGxlbWVudAorICoge0BsaW5rICNvbkNyZWF0ZURpYWxvZyhCdW5kbGUpfSB0byBjcmVhdGUgeW91ciBvd24gY3VzdG9tIERpYWxvZyBvYmplY3QuCisgKgorICogPHA+VGhpcyBpcyBtb3N0IHVzZWZ1bCBmb3IgY3JlYXRpbmcgYW4ge0BsaW5rIEFsZXJ0RGlhbG9nfSwgYWxsb3dpbmcgeW91CisgKiB0byBkaXNwbGF5IHN0YW5kYXJkIGFsZXJ0cyB0byB0aGUgdXNlciB0aGF0IGFyZSBtYW5hZ2VkIGJ5IGEgZnJhZ21lbnQuCisgKiBBIHNpbXBsZSBleGFtcGxlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgaXM6CisgKgorICoge0BzYW1wbGUgZGV2ZWxvcG1lbnQvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9GcmFnbWVudEFsZXJ0RGlhbG9nLmphdmEKKyAqICAgICAgZGlhbG9nfQorICoKKyAqIDxwPlRoZSBhY3Rpdml0eSBjcmVhdGluZyB0aGlzIGZyYWdtZW50IG1heSBoYXZlIHRoZSBmb2xsb3dpbmcgbWV0aG9kcyB0bworICogc2hvdyB0aGUgZGlhbG9nIGFuZCByZWNlaXZlIHJlc3VsdHMgZnJvbSBpdDoKKyAqCisgKiB7QHNhbXBsZSBkZXZlbG9wbWVudC9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYXBwL0ZyYWdtZW50QWxlcnREaWFsb2cuamF2YQorICogICAgICBhY3Rpdml0eX0KKyAqCisgKiA8cD5Ob3RlIHRoYXQgaW4gdGhpcyBjYXNlIHRoZSBmcmFnbWVudCBpcyBub3QgcGxhY2VkIG9uIHRoZSBiYWNrIHN0YWNrLCBpdAorICogaXMganVzdCBhZGRlZCBhcyBhbiBpbmRlZmluaXRlbHkgcnVubmluZyBmcmFnbWVudC4gIEJlY2F1c2UgZGlhbG9ncyBub3JtYWxseQorICogYXJlIG1vZGFsLCB0aGlzIHdpbGwgc3RpbGwgb3BlcmF0ZSBhcyBhIGJhY2sgc3RhY2ssIHNpbmNlIHRoZSBkaWFsb2cgd2lsbAorICogY2FwdHVyZSB1c2VyIGlucHV0IHVudGlsIGl0IGlzIGRpc21pc3NlZC4gIFdoZW4gaXQgaXMgZGlzbWlzc2VkLCBEaWFsb2dGcmFnbWVudAorICogd2lsbCB0YWtlIGNhcmUgb2YgcmVtb3ZpbmcgaXRzZWxmIGZyb20gaXRzIGZyYWdtZW50IG1hbmFnZXIuCisgKgorICogPGEgbmFtZT0iRGlhbG9nT3JFbWJlZCI+PC9hPgorICogPGgzPlNlbGVjdGluZyBCZXR3ZWVuIERpYWxvZyBvciBFbWJlZGRpbmc8L2gzPgorICoKKyAqIDxwPkEgRGlhbG9nRnJhZ21lbnQgY2FuIHN0aWxsIG9wdGlvbmFsbHkgYmUgdXNlZCBhcyBhIG5vcm1hbCBmcmFnbWVudCwgaWYKKyAqIGRlc2lyZWQuICBUaGlzIGlzIHVzZWZ1bCBpZiB5b3UgaGF2ZSBhIGZyYWdtZW50IHRoYXQgaW4gc29tZSBjYXNlcyBzaG91bGQKKyAqIGJlIHNob3duIGFzIGEgZGlhbG9nIGFuZCBvdGhlcnMgZW1iZWRkZWQgaW4gYSBsYXJnZXIgVUkuICBUaGlzIGJlaGF2aW9yCisgKiB3aWxsIG5vcm1hbGx5IGJlIGF1dG9tYXRpY2FsbHkgc2VsZWN0ZWQgZm9yIHlvdSBiYXNlZCBvbiBob3cgeW91IGFyZSB1c2luZworICogdGhlIGZyYWdtZW50LCBidXQgY2FuIGJlIGN1c3RvbWl6ZWQgd2l0aCB7QGxpbmsgI3NldFNob3dzRGlhbG9nKGJvb2xlYW4pfS4KKyAqCisgKiA8cD5Gb3IgZXhhbXBsZSwgaGVyZSBpcyBhIHNpbXBsZSBkaWFsb2cgZnJhZ21lbnQ6CisgKgorICoge0BzYW1wbGUgZGV2ZWxvcG1lbnQvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9GcmFnbWVudERpYWxvZ09yQWN0aXZpdHkuamF2YQorICogICAgICBkaWFsb2d9CisgKgorICogPHA+QW4gaW5zdGFuY2Ugb2YgdGhpcyBmcmFnbWVudCBjYW4gYmUgY3JlYXRlZCBhbmQgc2hvd24gYXMgYSBkaWFsb2c6CisgKgorICoge0BzYW1wbGUgZGV2ZWxvcG1lbnQvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9GcmFnbWVudERpYWxvZ09yQWN0aXZpdHkuamF2YQorICogICAgICBzaG93X2RpYWxvZ30KKyAqCisgKiA8cD5JdCBjYW4gYWxzbyBiZSBhZGRlZCBhcyBjb250ZW50IGluIGEgdmlldyBoaWVyYXJjaHk6CisgKgorICoge0BzYW1wbGUgZGV2ZWxvcG1lbnQvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9GcmFnbWVudERpYWxvZ09yQWN0aXZpdHkuamF2YQorICogICAgICBlbWJlZH0KKyAqLworcHVibGljIGNsYXNzIERpYWxvZ0ZyYWdtZW50IGV4dGVuZHMgRnJhZ21lbnQKKyAgICAgICAgaW1wbGVtZW50cyBEaWFsb2dJbnRlcmZhY2UuT25DYW5jZWxMaXN0ZW5lciwgRGlhbG9nSW50ZXJmYWNlLk9uRGlzbWlzc0xpc3RlbmVyIHsKKworICAgIC8qKgorICAgICAqIFN0eWxlIGZvciB7QGxpbmsgI3NldFN0eWxlKGludCwgaW50KX06IGEgYmFzaWMsCisgICAgICogbm9ybWFsIGRpYWxvZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVFlMRV9OT1JNQUwgPSAwOworCisgICAgLyoqCisgICAgICogU3R5bGUgZm9yIHtAbGluayAjc2V0U3R5bGUoaW50LCBpbnQpfTogZG9uJ3QgaW5jbHVkZQorICAgICAqIGEgdGl0bGUgYXJlYS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVFlMRV9OT19USVRMRSA9IDE7CisKKyAgICAvKioKKyAgICAgKiBTdHlsZSBmb3Ige0BsaW5rICNzZXRTdHlsZShpbnQsIGludCl9OiBkb24ndCBkcmF3CisgICAgICogYW55IGZyYW1lIGF0IGFsbDsgdGhlIHZpZXcgaGllcmFyY2h5IHJldHVybmVkIGJ5IHtAbGluayAjb25DcmVhdGVWaWV3fQorICAgICAqIGlzIGVudGlyZWx5IHJlc3BvbnNpYmxlIGZvciBkcmF3aW5nIHRoZSBkaWFsb2cuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RZTEVfTk9fRlJBTUUgPSAyOworCisgICAgLyoqCisgICAgICogU3R5bGUgZm9yIHtAbGluayAjc2V0U3R5bGUoaW50LCBpbnQpfTogbGlrZQorICAgICAqIHtAbGluayAjU1RZTEVfTk9fRlJBTUV9LCBidXQgYWxzbyBkaXNhYmxlcyBhbGwgaW5wdXQgdG8gdGhlIGRpYWxvZy4KKyAgICAgKiBUaGUgdXNlciBjYW4gbm90IHRvdWNoIGl0LCBhbmQgaXRzIHdpbmRvdyB3aWxsIG5vdCByZWNlaXZlIGlucHV0IGZvY3VzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUWUxFX05PX0lOUFVUID0gMzsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTQVZFRF9ESUFMT0dfU1RBVEVfVEFHID0gImFuZHJvaWQ6c2F2ZWREaWFsb2dTdGF0ZSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNBVkVEX1NUWUxFID0gImFuZHJvaWQ6c3R5bGUiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTQVZFRF9USEVNRSA9ICJhbmRyb2lkOnRoZW1lIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0FWRURfQ0FOQ0VMQUJMRSA9ICJhbmRyb2lkOmNhbmNlbGFibGUiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTQVZFRF9TSE9XU19ESUFMT0cgPSAiYW5kcm9pZDpzaG93c0RpYWxvZyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNBVkVEX0JBQ0tfU1RBQ0tfSUQgPSAiYW5kcm9pZDpiYWNrU3RhY2tJZCI7CisKKyAgICBpbnQgbVN0eWxlID0gU1RZTEVfTk9STUFMOworICAgIGludCBtVGhlbWUgPSAwOworICAgIGJvb2xlYW4gbUNhbmNlbGFibGUgPSB0cnVlOworICAgIGJvb2xlYW4gbVNob3dzRGlhbG9nID0gdHJ1ZTsKKyAgICBpbnQgbUJhY2tTdGFja0lkID0gLTE7CisKKyAgICBEaWFsb2cgbURpYWxvZzsKKyAgICBib29sZWFuIG1EZXN0cm95ZWQ7CisgICAgYm9vbGVhbiBtUmVtb3ZlZDsKKworICAgIHB1YmxpYyBEaWFsb2dGcmFnbWVudCgpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsIHRvIGN1c3RvbWl6ZSB0aGUgYmFzaWMgYXBwZWFyYW5jZSBhbmQgYmVoYXZpb3Igb2YgdGhlCisgICAgICogZnJhZ21lbnQncyBkaWFsb2cuICBUaGlzIGNhbiBiZSB1c2VkIGZvciBzb21lIGNvbW1vbiBkaWFsb2cgYmVoYXZpb3JzLAorICAgICAqIHRha2luZyBjYXJlIG9mIHNlbGVjdGluZyBmbGFncywgdGhlbWUsIGFuZCBvdGhlciBvcHRpb25zIGZvciB5b3UuICBUaGUKKyAgICAgKiBzYW1lIGVmZmVjdCBjYW4gYmUgYWNoaWV2ZSBieSBtYW51YWxseSBzZXR0aW5nIERpYWxvZyBhbmQgV2luZG93CisgICAgICogYXR0cmlidXRlcyB5b3Vyc2VsZi4gIENhbGxpbmcgdGhpcyBhZnRlciB0aGUgZnJhZ21lbnQncyBEaWFsb2cgaXMKKyAgICAgKiBjcmVhdGVkIHdpbGwgaGF2ZSBubyBlZmZlY3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3R5bGUgU2VsZWN0cyBhIHN0YW5kYXJkIHN0eWxlOiBtYXkgYmUge0BsaW5rICNTVFlMRV9OT1JNQUx9LAorICAgICAqIHtAbGluayAjU1RZTEVfTk9fVElUTEV9LCB7QGxpbmsgI1NUWUxFX05PX0ZSQU1FfSwgb3IKKyAgICAgKiB7QGxpbmsgI1NUWUxFX05PX0lOUFVUfS4KKyAgICAgKiBAcGFyYW0gdGhlbWUgT3B0aW9uYWwgY3VzdG9tIHRoZW1lLiAgSWYgMCwgYW4gYXBwcm9wcmlhdGUgdGhlbWUgKGJhc2VkCisgICAgICogb24gdGhlIHN0eWxlKSB3aWxsIGJlIHNlbGVjdGVkIGZvciB5b3UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U3R5bGUoaW50IHN0eWxlLCBpbnQgdGhlbWUpIHsKKyAgICAgICAgbVN0eWxlID0gc3R5bGU7CisgICAgICAgIGlmIChtU3R5bGUgPT0gU1RZTEVfTk9fRlJBTUUgfHwgbVN0eWxlID09IFNUWUxFX05PX0lOUFVUKSB7CisgICAgICAgICAgICBtVGhlbWUgPSBhbmRyb2lkLlIuc3R5bGUuVGhlbWVfRGlhbG9nX05vRnJhbWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRoZW1lICE9IDApIHsKKyAgICAgICAgICAgIG1UaGVtZSA9IHRoZW1lOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQGRlcHJlY2F0ZWQgUGxlYXNlIHVzZSB7QGxpbmsgI3Nob3coRnJhZ21lbnRNYW5hZ2VyLCBTdHJpbmcpfS4KKyAgICAgKi8KKyAgICBARGVwcmVjYXRlZAorICAgIHB1YmxpYyB2b2lkIHNob3coQWN0aXZpdHkgYWN0aXZpdHksIFN0cmluZyB0YWcpIHsKKyAgICAgICAgRnJhZ21lbnRUcmFuc2FjdGlvbiBmdCA9IGFjdGl2aXR5Lm9wZW5GcmFnbWVudFRyYW5zYWN0aW9uKCk7CisgICAgICAgIGZ0LmFkZCh0aGlzLCB0YWcpOworICAgICAgICBmdC5jb21taXQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEaXNwbGF5IHRoZSBkaWFsb2csIGFkZGluZyB0aGUgZnJhZ21lbnQgdG8gdGhlIGdpdmVuIEZyYWdtZW50TWFuYWdlci4gIFRoaXMKKyAgICAgKiBpcyBhIGNvbnZlbmllbmNlIGZvciBleHBsaWNpdGx5IGNyZWF0aW5nIGEgdHJhbnNhY3Rpb24sIGFkZGluZyB0aGUKKyAgICAgKiBmcmFnbWVudCB0byBpdCB3aXRoIHRoZSBnaXZlbiB0YWcsIGFuZCBjb21taXR0aW5nIGl0LiAgVGhpcyBkb2VzCisgICAgICogPGVtPm5vdDwvZW0+IGFkZCB0aGUgdHJhbnNhY3Rpb24gdG8gdGhlIGJhY2sgc3RhY2suICBXaGVuIHRoZSBmcmFnbWVudAorICAgICAqIGlzIGRpc21pc3NlZCwgYSBuZXcgdHJhbnNhY3Rpb24gd2lsbCBiZSBleGVjdXRlZCB0byByZW1vdmUgaXQgZnJvbQorICAgICAqIHRoZSBhY3Rpdml0eS4KKyAgICAgKiBAcGFyYW0gbWFuYWdlciBUaGUgRnJhZ21lbnRNYW5hZ2VyIHRoaXMgZnJhZ21lbnQgd2lsbCBiZSBhZGRlZCB0by4KKyAgICAgKiBAcGFyYW0gdGFnIFRoZSB0YWcgZm9yIHRoaXMgZnJhZ21lbnQsIGFzIHBlcgorICAgICAqIHtAbGluayBGcmFnbWVudFRyYW5zYWN0aW9uI2FkZChGcmFnbWVudCwgU3RyaW5nKSBGcmFnbWVudFRyYW5zYWN0aW9uLmFkZH0uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2hvdyhGcmFnbWVudE1hbmFnZXIgbWFuYWdlciwgU3RyaW5nIHRhZykgeworICAgICAgICBGcmFnbWVudFRyYW5zYWN0aW9uIGZ0ID0gbWFuYWdlci5vcGVuVHJhbnNhY3Rpb24oKTsKKyAgICAgICAgZnQuYWRkKHRoaXMsIHRhZyk7CisgICAgICAgIGZ0LmNvbW1pdCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIERpc3BsYXkgdGhlIGRpYWxvZywgYWRkaW5nIHRoZSBmcmFnbWVudCB1c2luZyBhbiBleGlzdGluZyB0cmFuc2FjdGlvbgorICAgICAqIGFuZCB0aGVuIGNvbW1pdHRpbmcgdGhlIHRyYW5zYWN0aW9uLgorICAgICAqIEBwYXJhbSB0cmFuc2FjdGlvbiBBbiBleGlzdGluZyB0cmFuc2FjdGlvbiBpbiB3aGljaCB0byBhZGQgdGhlIGZyYWdtZW50LgorICAgICAqIEBwYXJhbSB0YWcgVGhlIHRhZyBmb3IgdGhpcyBmcmFnbWVudCwgYXMgcGVyCisgICAgICoge0BsaW5rIEZyYWdtZW50VHJhbnNhY3Rpb24jYWRkKEZyYWdtZW50LCBTdHJpbmcpIEZyYWdtZW50VHJhbnNhY3Rpb24uYWRkfS4KKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGlkZW50aWZpZXIgb2YgdGhlIGNvbW1pdHRlZCB0cmFuc2FjdGlvbiwgYXMgcGVyCisgICAgICoge0BsaW5rIEZyYWdtZW50VHJhbnNhY3Rpb24jY29tbWl0KCkgRnJhZ21lbnRUcmFuc2FjdGlvbi5jb21taXQoKX0uCisgICAgICovCisgICAgcHVibGljIGludCBzaG93KEZyYWdtZW50VHJhbnNhY3Rpb24gdHJhbnNhY3Rpb24sIFN0cmluZyB0YWcpIHsKKyAgICAgICAgdHJhbnNhY3Rpb24uYWRkKHRoaXMsIHRhZyk7CisgICAgICAgIG1SZW1vdmVkID0gZmFsc2U7CisgICAgICAgIG1CYWNrU3RhY2tJZCA9IHRyYW5zYWN0aW9uLmNvbW1pdCgpOworICAgICAgICByZXR1cm4gbUJhY2tTdGFja0lkOworICAgIH0KKworICAgIC8qKgorICAgICAqIERpc21pc3MgdGhlIGZyYWdtZW50IGFuZCBpdHMgZGlhbG9nLiAgSWYgdGhlIGZyYWdtZW50IHdhcyBhZGRlZCB0byB0aGUKKyAgICAgKiBiYWNrIHN0YWNrLCBhbGwgYmFjayBzdGFjayBzdGF0ZSB1cCB0byBhbmQgaW5jbHVkaW5nIHRoaXMgZW50cnkgd2lsbAorICAgICAqIGJlIHBvcHBlZC4gIE90aGVyd2lzZSwgYSBuZXcgdHJhbnNhY3Rpb24gd2lsbCBiZSBjb21taXR0ZWQgdG8gcmVtb3ZlCisgICAgICogdGhlIGZyYWdtZW50LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGRpc21pc3MoKSB7CisgICAgICAgIGlmIChtRGlhbG9nICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1EaWFsb2cuZGlzbWlzcygpOworICAgICAgICAgICAgbURpYWxvZyA9IG51bGw7CisgICAgICAgIH0KKyAgICAgICAgbVJlbW92ZWQgPSB0cnVlOworICAgICAgICBpZiAobUJhY2tTdGFja0lkID49IDApIHsKKyAgICAgICAgICAgIGdldEZyYWdtZW50TWFuYWdlcigpLnBvcEJhY2tTdGFjayhtQmFja1N0YWNrSWQsCisgICAgICAgICAgICAgICAgICAgIEZyYWdtZW50TWFuYWdlci5QT1BfQkFDS19TVEFDS19JTkNMVVNJVkUpOworICAgICAgICAgICAgbUJhY2tTdGFja0lkID0gLTE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBGcmFnbWVudFRyYW5zYWN0aW9uIGZ0ID0gZ2V0RnJhZ21lbnRNYW5hZ2VyKCkub3BlblRyYW5zYWN0aW9uKCk7CisgICAgICAgICAgICBmdC5yZW1vdmUodGhpcyk7CisgICAgICAgICAgICBmdC5jb21taXQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBEaWFsb2cgZ2V0RGlhbG9nKCkgeworICAgICAgICByZXR1cm4gbURpYWxvZzsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFRoZW1lKCkgeworICAgICAgICByZXR1cm4gbVRoZW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnRyb2wgd2hldGhlciB0aGUgc2hvd24gRGlhbG9nIGlzIGNhbmNlbGFibGUuICBVc2UgdGhpcyBpbnN0ZWFkIG9mCisgICAgICogZGlyZWN0bHkgY2FsbGluZyB7QGxpbmsgRGlhbG9nI3NldENhbmNlbGFibGUoYm9vbGVhbikKKyAgICAgKiBEaWFsb2cuc2V0Q2FuY2VsYWJsZShib29sZWFuKX0sIGJlY2F1c2UgRGlhbG9nRnJhZ21lbnQgbmVlZHMgdG8gY2hhbmdlCisgICAgICogaXRzIGJlaGF2aW9yIGJhc2VkIG9uIHRoaXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2FuY2VsYWJsZSBJZiB0cnVlLCB0aGUgZGlhbG9nIGlzIGNhbmNlbGFibGUuICBUaGUgZGVmYXVsdAorICAgICAqIGlzIHRydWUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2FuY2VsYWJsZShib29sZWFuIGNhbmNlbGFibGUpIHsKKyAgICAgICAgbUNhbmNlbGFibGUgPSBjYW5jZWxhYmxlOworICAgICAgICBpZiAobURpYWxvZyAhPSBudWxsKSBtRGlhbG9nLnNldENhbmNlbGFibGUoY2FuY2VsYWJsZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBjdXJyZW50IHZhbHVlIG9mIHtAbGluayAjc2V0Q2FuY2VsYWJsZShib29sZWFuKX0uCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0Q2FuY2VsYWJsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1DYW5jZWxhYmxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnRyb2xzIHdoZXRoZXIgdGhpcyBmcmFnbWVudCBzaG91bGQgYmUgc2hvd24gaW4gYSBkaWFsb2cuICBJZiBub3QKKyAgICAgKiBzZXQsIG5vIERpYWxvZyB3aWxsIGJlIGNyZWF0ZWQgaW4ge0BsaW5rICNvbkFjdGl2aXR5Q3JlYXRlZChCdW5kbGUpfSwKKyAgICAgKiBhbmQgdGhlIGZyYWdtZW50J3MgdmlldyBoaWVyYXJjaHkgd2lsbCB0aHVzIG5vdCBiZSBhZGRlZCB0byBpdC4gIFRoaXMKKyAgICAgKiBhbGxvd3MgeW91IHRvIGluc3RlYWQgdXNlIGl0IGFzIGEgbm9ybWFsIGZyYWdtZW50IChlbWJlZGRlZCBpbnNpZGUgb2YKKyAgICAgKiBpdHMgYWN0aXZpdHkpLgorICAgICAqCisgICAgICogPHA+VGhpcyBpcyBub3JtYWxseSBzZXQgZm9yIHlvdSBiYXNlZCBvbiB3aGV0aGVyIHRoZSBmcmFnbWVudCBpcworICAgICAqIGFzc29jaWF0ZWQgd2l0aCBhIGNvbnRhaW5lciB2aWV3IElEIHBhc3NlZCB0bworICAgICAqIHtAbGluayBGcmFnbWVudFRyYW5zYWN0aW9uI2FkZChpbnQsIEZyYWdtZW50KSBGcmFnbWVudFRyYW5zYWN0aW9uLmFkZChpbnQsIEZyYWdtZW50KX0uCisgICAgICogSWYgdGhlIGZyYWdtZW50IHdhcyBhZGRlZCB3aXRoIGEgY29udGFpbmVyLCBzZXRTaG93c0RpYWxvZyB3aWxsIGJlCisgICAgICogaW5pdGlhbGl6ZWQgdG8gZmFsc2U7IG90aGVyd2lzZSwgaXQgd2lsbCBiZSB0cnVlLgorICAgICAqCisgICAgICogQHBhcmFtIHNob3dzRGlhbG9nIElmIHRydWUsIHRoZSBmcmFnbWVudCB3aWxsIGJlIGRpc3BsYXllZCBpbiBhIERpYWxvZy4KKyAgICAgKiBJZiBmYWxzZSwgbm8gRGlhbG9nIHdpbGwgYmUgY3JlYXRlZCBhbmQgdGhlIGZyYWdtZW50J3MgdmlldyBoaWVyYXJjaGx5CisgICAgICogbGVmdCB1bmRpc3R1cmJlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTaG93c0RpYWxvZyhib29sZWFuIHNob3dzRGlhbG9nKSB7CisgICAgICAgIG1TaG93c0RpYWxvZyA9IHNob3dzRGlhbG9nOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgY3VycmVudCB2YWx1ZSBvZiB7QGxpbmsgI3NldFNob3dzRGlhbG9nKGJvb2xlYW4pfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRTaG93c0RpYWxvZygpIHsKKyAgICAgICAgcmV0dXJuIG1TaG93c0RpYWxvZzsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisKKyAgICAgICAgbVNob3dzRGlhbG9nID0gbUNvbnRhaW5lcklkID09IDA7CisKKyAgICAgICAgaWYgKHNhdmVkSW5zdGFuY2VTdGF0ZSAhPSBudWxsKSB7CisgICAgICAgICAgICBtU3R5bGUgPSBzYXZlZEluc3RhbmNlU3RhdGUuZ2V0SW50KFNBVkVEX1NUWUxFLCBTVFlMRV9OT1JNQUwpOworICAgICAgICAgICAgbVRoZW1lID0gc2F2ZWRJbnN0YW5jZVN0YXRlLmdldEludChTQVZFRF9USEVNRSwgMCk7CisgICAgICAgICAgICBtQ2FuY2VsYWJsZSA9IHNhdmVkSW5zdGFuY2VTdGF0ZS5nZXRCb29sZWFuKFNBVkVEX0NBTkNFTEFCTEUsIHRydWUpOworICAgICAgICAgICAgbVNob3dzRGlhbG9nID0gc2F2ZWRJbnN0YW5jZVN0YXRlLmdldEJvb2xlYW4oU0FWRURfU0hPV1NfRElBTE9HLCBtU2hvd3NEaWFsb2cpOworICAgICAgICAgICAgbUJhY2tTdGFja0lkID0gc2F2ZWRJbnN0YW5jZVN0YXRlLmdldEludChTQVZFRF9CQUNLX1NUQUNLX0lELCAtMSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgRGlhbG9nIG9uQ3JlYXRlRGlhbG9nKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBEaWFsb2coZ2V0QWN0aXZpdHkoKSwgZ2V0VGhlbWUoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb25DYW5jZWwoRGlhbG9nSW50ZXJmYWNlIGRpYWxvZykgeworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG9uRGlzbWlzcyhEaWFsb2dJbnRlcmZhY2UgZGlhbG9nKSB7CisgICAgICAgIGlmICghbVJlbW92ZWQpIHsKKyAgICAgICAgICAgIGRpc21pc3MoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQWN0aXZpdHlDcmVhdGVkKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25BY3Rpdml0eUNyZWF0ZWQoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKworICAgICAgICBpZiAoIW1TaG93c0RpYWxvZykgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgbURpYWxvZyA9IG9uQ3JlYXRlRGlhbG9nKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIG1EZXN0cm95ZWQgPSBmYWxzZTsKKyAgICAgICAgc3dpdGNoIChtU3R5bGUpIHsKKyAgICAgICAgICAgIGNhc2UgU1RZTEVfTk9fSU5QVVQ6CisgICAgICAgICAgICAgICAgbURpYWxvZy5nZXRXaW5kb3coKS5hZGRGbGFncygKKyAgICAgICAgICAgICAgICAgICAgICAgIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfTk9UX0ZPQ1VTQUJMRSB8CisgICAgICAgICAgICAgICAgICAgICAgICBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX05PVF9UT1VDSEFCTEUpOworICAgICAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaC4uLgorICAgICAgICAgICAgY2FzZSBTVFlMRV9OT19GUkFNRToKKyAgICAgICAgICAgIGNhc2UgU1RZTEVfTk9fVElUTEU6CisgICAgICAgICAgICAgICAgbURpYWxvZy5yZXF1ZXN0V2luZG93RmVhdHVyZShXaW5kb3cuRkVBVFVSRV9OT19USVRMRSk7CisgICAgICAgIH0KKyAgICAgICAgVmlldyB2aWV3ID0gZ2V0VmlldygpOworICAgICAgICBpZiAodmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAodmlldy5nZXRQYXJlbnQoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiRGlhbG9nRnJhZ21lbnQgY2FuIG5vdCBiZSBhdHRhY2hlZCB0byBhIGNvbnRhaW5lciB2aWV3Iik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtRGlhbG9nLnNldENvbnRlbnRWaWV3KHZpZXcpOworICAgICAgICB9CisgICAgICAgIG1EaWFsb2cuc2V0T3duZXJBY3Rpdml0eShnZXRBY3Rpdml0eSgpKTsKKyAgICAgICAgbURpYWxvZy5zZXRDYW5jZWxhYmxlKG1DYW5jZWxhYmxlKTsKKyAgICAgICAgbURpYWxvZy5zZXRPbkNhbmNlbExpc3RlbmVyKHRoaXMpOworICAgICAgICBtRGlhbG9nLnNldE9uRGlzbWlzc0xpc3RlbmVyKHRoaXMpOworICAgICAgICBpZiAoc2F2ZWRJbnN0YW5jZVN0YXRlICE9IG51bGwpIHsKKyAgICAgICAgICAgIEJ1bmRsZSBkaWFsb2dTdGF0ZSA9IHNhdmVkSW5zdGFuY2VTdGF0ZS5nZXRCdW5kbGUoU0FWRURfRElBTE9HX1NUQVRFX1RBRyk7CisgICAgICAgICAgICBpZiAoZGlhbG9nU3RhdGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1EaWFsb2cub25SZXN0b3JlSW5zdGFuY2VTdGF0ZShkaWFsb2dTdGF0ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblN0YXJ0KCkgeworICAgICAgICBzdXBlci5vblN0YXJ0KCk7CisgICAgICAgIGlmIChtRGlhbG9nICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1SZW1vdmVkID0gZmFsc2U7CisgICAgICAgICAgICBtRGlhbG9nLnNob3coKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uU2F2ZUluc3RhbmNlU3RhdGUoQnVuZGxlIG91dFN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uU2F2ZUluc3RhbmNlU3RhdGUob3V0U3RhdGUpOworICAgICAgICBpZiAobURpYWxvZyAhPSBudWxsKSB7CisgICAgICAgICAgICBCdW5kbGUgZGlhbG9nU3RhdGUgPSBtRGlhbG9nLm9uU2F2ZUluc3RhbmNlU3RhdGUoKTsKKyAgICAgICAgICAgIGlmIChkaWFsb2dTdGF0ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgb3V0U3RhdGUucHV0QnVuZGxlKFNBVkVEX0RJQUxPR19TVEFURV9UQUcsIGRpYWxvZ1N0YXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAobVN0eWxlICE9IFNUWUxFX05PUk1BTCkgeworICAgICAgICAgICAgb3V0U3RhdGUucHV0SW50KFNBVkVEX1NUWUxFLCBtU3R5bGUpOworICAgICAgICB9CisgICAgICAgIGlmIChtVGhlbWUgIT0gMCkgeworICAgICAgICAgICAgb3V0U3RhdGUucHV0SW50KFNBVkVEX1RIRU1FLCBtVGhlbWUpOworICAgICAgICB9CisgICAgICAgIGlmICghbUNhbmNlbGFibGUpIHsKKyAgICAgICAgICAgIG91dFN0YXRlLnB1dEJvb2xlYW4oU0FWRURfQ0FOQ0VMQUJMRSwgbUNhbmNlbGFibGUpOworICAgICAgICB9CisgICAgICAgIGlmICghbVNob3dzRGlhbG9nKSB7CisgICAgICAgICAgICBvdXRTdGF0ZS5wdXRCb29sZWFuKFNBVkVEX1NIT1dTX0RJQUxPRywgbVNob3dzRGlhbG9nKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobUJhY2tTdGFja0lkICE9IC0xKSB7CisgICAgICAgICAgICBvdXRTdGF0ZS5wdXRJbnQoU0FWRURfQkFDS19TVEFDS19JRCwgbUJhY2tTdGFja0lkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uU3RvcCgpIHsKKyAgICAgICAgc3VwZXIub25TdG9wKCk7CisgICAgICAgIGlmIChtRGlhbG9nICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1EaWFsb2cuaGlkZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVtb3ZlIGRpYWxvZy4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkRlc3Ryb3lWaWV3KCkgeworICAgICAgICBzdXBlci5vbkRlc3Ryb3lWaWV3KCk7CisgICAgICAgIG1EZXN0cm95ZWQgPSB0cnVlOworICAgICAgICBpZiAobURpYWxvZyAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyBTZXQgcmVtb3ZlZCBoZXJlIGJlY2F1c2UgdGhpcyBkaXNtaXNzYWwgaXMganVzdCB0byBoaWRlCisgICAgICAgICAgICAvLyB0aGUgZGlhbG9nIC0tIHdlIGRvbid0IHdhbnQgdGhpcyB0byBjYXVzZSB0aGUgZnJhZ21lbnQgdG8KKyAgICAgICAgICAgIC8vIGFjdHVhbGx5IGJlIHJlbW92ZWQuCisgICAgICAgICAgICBtUmVtb3ZlZCA9IHRydWU7CisgICAgICAgICAgICBtRGlhbG9nLmRpc21pc3MoKTsKKyAgICAgICAgICAgIG1EaWFsb2cgPSBudWxsOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0ZyYWdtZW50LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvRnJhZ21lbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmNmMzk5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0ZyYWdtZW50LmphdmEKQEAgLTAsMCArMSwxMDg3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmFwcDsKKworaW1wb3J0IGFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdGFibGU7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudENhbGxiYWNrczsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7CitpbXBvcnQgYW5kcm9pZC51dGlsLkFuZHJvaWRSdW50aW1lRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuU3BhcnNlQXJyYXk7CitpbXBvcnQgYW5kcm9pZC52aWV3LkNvbnRleHRNZW51OworaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUluZmxhdGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SXRlbTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworaW1wb3J0IGFuZHJvaWQudmlldy5Db250ZXh0TWVudS5Db250ZXh0TWVudUluZm87CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXcuT25DcmVhdGVDb250ZXh0TWVudUxpc3RlbmVyOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3OworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CisKK2ZpbmFsIGNsYXNzIEZyYWdtZW50U3RhdGUgaW1wbGVtZW50cyBQYXJjZWxhYmxlIHsKKyAgICBmaW5hbCBTdHJpbmcgbUNsYXNzTmFtZTsKKyAgICBmaW5hbCBpbnQgbUluZGV4OworICAgIGZpbmFsIGJvb2xlYW4gbUZyb21MYXlvdXQ7CisgICAgZmluYWwgaW50IG1GcmFnbWVudElkOworICAgIGZpbmFsIGludCBtQ29udGFpbmVySWQ7CisgICAgZmluYWwgU3RyaW5nIG1UYWc7CisgICAgZmluYWwgYm9vbGVhbiBtUmV0YWluSW5zdGFuY2U7CisgICAgZmluYWwgQnVuZGxlIG1Bcmd1bWVudHM7CisgICAgCisgICAgQnVuZGxlIG1TYXZlZEZyYWdtZW50U3RhdGU7CisgICAgCisgICAgRnJhZ21lbnQgbUluc3RhbmNlOworICAgIAorICAgIHB1YmxpYyBGcmFnbWVudFN0YXRlKEZyYWdtZW50IGZyYWcpIHsKKyAgICAgICAgbUNsYXNzTmFtZSA9IGZyYWcuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7CisgICAgICAgIG1JbmRleCA9IGZyYWcubUluZGV4OworICAgICAgICBtRnJvbUxheW91dCA9IGZyYWcubUZyb21MYXlvdXQ7CisgICAgICAgIG1GcmFnbWVudElkID0gZnJhZy5tRnJhZ21lbnRJZDsKKyAgICAgICAgbUNvbnRhaW5lcklkID0gZnJhZy5tQ29udGFpbmVySWQ7CisgICAgICAgIG1UYWcgPSBmcmFnLm1UYWc7CisgICAgICAgIG1SZXRhaW5JbnN0YW5jZSA9IGZyYWcubVJldGFpbkluc3RhbmNlOworICAgICAgICBtQXJndW1lbnRzID0gZnJhZy5tQXJndW1lbnRzOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgRnJhZ21lbnRTdGF0ZShQYXJjZWwgaW4pIHsKKyAgICAgICAgbUNsYXNzTmFtZSA9IGluLnJlYWRTdHJpbmcoKTsKKyAgICAgICAgbUluZGV4ID0gaW4ucmVhZEludCgpOworICAgICAgICBtRnJvbUxheW91dCA9IGluLnJlYWRJbnQoKSAhPSAwOworICAgICAgICBtRnJhZ21lbnRJZCA9IGluLnJlYWRJbnQoKTsKKyAgICAgICAgbUNvbnRhaW5lcklkID0gaW4ucmVhZEludCgpOworICAgICAgICBtVGFnID0gaW4ucmVhZFN0cmluZygpOworICAgICAgICBtUmV0YWluSW5zdGFuY2UgPSBpbi5yZWFkSW50KCkgIT0gMDsKKyAgICAgICAgbUFyZ3VtZW50cyA9IGluLnJlYWRCdW5kbGUoKTsKKyAgICAgICAgbVNhdmVkRnJhZ21lbnRTdGF0ZSA9IGluLnJlYWRCdW5kbGUoKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIEZyYWdtZW50IGluc3RhbnRpYXRlKEFjdGl2aXR5IGFjdGl2aXR5KSB7CisgICAgICAgIGlmIChtSW5zdGFuY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG1JbnN0YW5jZTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgbUluc3RhbmNlID0gRnJhZ21lbnQuaW5zdGFudGlhdGUoYWN0aXZpdHksIG1DbGFzc05hbWUsIG1Bcmd1bWVudHMpOworICAgICAgICAKKyAgICAgICAgaWYgKG1TYXZlZEZyYWdtZW50U3RhdGUgIT0gbnVsbCkgeworICAgICAgICAgICAgbVNhdmVkRnJhZ21lbnRTdGF0ZS5zZXRDbGFzc0xvYWRlcihhY3Rpdml0eS5nZXRDbGFzc0xvYWRlcigpKTsKKyAgICAgICAgICAgIG1JbnN0YW5jZS5tU2F2ZWRGcmFnbWVudFN0YXRlID0gbVNhdmVkRnJhZ21lbnRTdGF0ZTsKKyAgICAgICAgfQorICAgICAgICBtSW5zdGFuY2Uuc2V0SW5kZXgobUluZGV4KTsKKyAgICAgICAgbUluc3RhbmNlLm1Gcm9tTGF5b3V0ID0gbUZyb21MYXlvdXQ7CisgICAgICAgIG1JbnN0YW5jZS5tRnJhZ21lbnRJZCA9IG1GcmFnbWVudElkOworICAgICAgICBtSW5zdGFuY2UubUNvbnRhaW5lcklkID0gbUNvbnRhaW5lcklkOworICAgICAgICBtSW5zdGFuY2UubVRhZyA9IG1UYWc7CisgICAgICAgIG1JbnN0YW5jZS5tUmV0YWluSW5zdGFuY2UgPSBtUmV0YWluSW5zdGFuY2U7CisgICAgICAgIAorICAgICAgICByZXR1cm4gbUluc3RhbmNlOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgaW50IGRlc2NyaWJlQ29udGVudHMoKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlVG9QYXJjZWwoUGFyY2VsIGRlc3QsIGludCBmbGFncykgeworICAgICAgICBkZXN0LndyaXRlU3RyaW5nKG1DbGFzc05hbWUpOworICAgICAgICBkZXN0LndyaXRlSW50KG1JbmRleCk7CisgICAgICAgIGRlc3Qud3JpdGVJbnQobUZyb21MYXlvdXQgPyAxIDogMCk7CisgICAgICAgIGRlc3Qud3JpdGVJbnQobUZyYWdtZW50SWQpOworICAgICAgICBkZXN0LndyaXRlSW50KG1Db250YWluZXJJZCk7CisgICAgICAgIGRlc3Qud3JpdGVTdHJpbmcobVRhZyk7CisgICAgICAgIGRlc3Qud3JpdGVJbnQobVJldGFpbkluc3RhbmNlID8gMSA6IDApOworICAgICAgICBkZXN0LndyaXRlQnVuZGxlKG1Bcmd1bWVudHMpOworICAgICAgICBkZXN0LndyaXRlQnVuZGxlKG1TYXZlZEZyYWdtZW50U3RhdGUpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFBhcmNlbGFibGUuQ3JlYXRvcjxGcmFnbWVudFN0YXRlPiBDUkVBVE9SCisgICAgICAgICAgICA9IG5ldyBQYXJjZWxhYmxlLkNyZWF0b3I8RnJhZ21lbnRTdGF0ZT4oKSB7CisgICAgICAgIHB1YmxpYyBGcmFnbWVudFN0YXRlIGNyZWF0ZUZyb21QYXJjZWwoUGFyY2VsIGluKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEZyYWdtZW50U3RhdGUoaW4pOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwdWJsaWMgRnJhZ21lbnRTdGF0ZVtdIG5ld0FycmF5KGludCBzaXplKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEZyYWdtZW50U3RhdGVbc2l6ZV07CisgICAgICAgIH0KKyAgICB9OworfQorCisvKioKKyAqIEEgRnJhZ21lbnQgaXMgYSBwaWVjZSBvZiBhbiBhcHBsaWNhdGlvbidzIHVzZXIgaW50ZXJmYWNlIG9yIGJlaGF2aW9yCisgKiB0aGF0IGNhbiBiZSBwbGFjZWQgaW4gYW4ge0BsaW5rIEFjdGl2aXR5fS4gIEludGVyYWN0aW9uIHdpdGggZnJhZ21lbnRzCisgKiBpcyBkb25lIHRocm91Z2gge0BsaW5rIEZyYWdtZW50TWFuYWdlcn0sIHdoaWNoIGNhbiBiZSBvYnRhaW5lZCB2aWEKKyAqIHtAbGluayBBY3Rpdml0eSNnZXRGcmFnbWVudE1hbmFnZXIoKSBBY3Rpdml0eS5nZXRGcmFnbWVudE1hbmFnZXIoKX0gYW5kCisgKiB7QGxpbmsgRnJhZ21lbnQjZ2V0RnJhZ21lbnRNYW5hZ2VyKCkgRnJhZ21lbnQuZ2V0RnJhZ21lbnRNYW5hZ2VyKCl9LgorICoKKyAqIDxwPlRoZSBGcmFnbWVudCBjbGFzcyBjYW4gYmUgdXNlZCBtYW55IHdheXMgdG8gYWNoaWV2ZSBhIHdpZGUgdmFyaWV0eSBvZgorICogcmVzdWx0cy4gIEl0IGlzIGNvcmUsIGl0IHJlcHJlc2VudHMgYSBwYXJ0aWN1bGFyIG9wZXJhdGlvbiBvciBpbnRlcmZhY2UKKyAqIHRoYXQgaXMgcnVubmluZyB3aXRoaW4gYSBsYXJnZXIge0BsaW5rIEFjdGl2aXR5fS4gIEEgRnJhZ21lbnQgaXMgY2xvc2VseQorICogdGllZCB0byB0aGUgQWN0aXZpdHkgaXQgaXMgaW4sIGFuZCBjYW4gbm90IGJlIHVzZWQgYXBhcnQgZnJvbSBvbmUuICBUaG91Z2gKKyAqIEZyYWdtZW50IGRlZmluZXMgaXRzIG93biBsaWZlY3ljbGUsIHRoYXQgbGlmZWN5Y2xlIGlzIGRlcGVuZGVudCBvbiBpdHMKKyAqIGFjdGl2aXR5OiBpZiB0aGUgYWN0aXZpdHkgaXMgc3RvcHBlZCwgbm8gZnJhZ21lbnRzIGluc2lkZSBvZiBpdCBjYW4gYmUKKyAqIHN0YXJ0ZWQ7IHdoZW4gdGhlIGFjdGl2aXR5IGlzIGRlc3Ryb3llZCwgYWxsIGZyYWdtZW50cyB3aWxsIGJlIGRlc3Ryb3llZC4KKyAqCisgKiA8cD5BbGwgc3ViY2xhc3NlcyBvZiBGcmFnbWVudCBtdXN0IGluY2x1ZGUgYSBwdWJsaWMgZW1wdHkgY29uc3RydWN0b3IuCisgKiBUaGUgZnJhbWV3b3JrIHdpbGwgb2Z0ZW4gcmUtaW5zdGFudGlhdGUgYSBmcmFnbWVudCBjbGFzcyB3aGVuIG5lZWRlZCwKKyAqIGluIHBhcnRpY3VsYXIgZHVyaW5nIHN0YXRlIHJlc3RvcmUsIGFuZCBuZWVkcyB0byBiZSBhYmxlIHRvIGZpbmQgdGhpcworICogY29uc3RydWN0b3IgdG8gaW5zdGFudGlhdGUgaXQuICBJZiB0aGUgZW1wdHkgY29uc3RydWN0b3IgaXMgbm90IGF2YWlsYWJsZSwKKyAqIGEgcnVudGltZSBleGNlcHRpb24gd2lsbCBvY2N1ciBpbiBzb21lIGNhc2VzIGR1cmluZyBzdGF0ZSByZXN0b3JlLgorICoKKyAqIDxwPlRvcGljcyBjb3ZlcmVkIGhlcmU6CisgKiA8b2w+CisgKiA8bGk+PGEgaHJlZj0iI0xpZmVjeWNsZSI+TGlmZWN5Y2xlPC9hPgorICogPGxpPjxhIGhyZWY9IiNMYXlvdXQiPkxheW91dDwvYT4KKyAqIDxsaT48YSBocmVmPSIjQmFja1N0YWNrIj5CYWNrIFN0YWNrPC9hPgorICogPC9vbD4KKyAqCisgKiA8YSBuYW1lPSJMaWZlY3ljbGUiPjwvYT4KKyAqIDxoMz5MaWZlY3ljbGU8L2gzPgorICoKKyAqIDxwPlRob3VnaCBhIEZyYWdtZW50J3MgbGlmZWN5Y2xlIGlzIHRpZWQgdG8gaXRzIG93bmluZyBhY3Rpdml0eSwgaXQgaGFzCisgKiBpdHMgb3duIHdyaW5rbGUgb24gdGhlIHN0YW5kYXJkIGFjdGl2aXR5IGxpZmVjeWNsZS4gIEl0IGluY2x1ZGVzIGJhc2ljCisgKiBhY3Rpdml0eSBsaWZlY3ljbGUgbWV0aG9kcyBzdWNoIGFzIHtAbGluayAjb25SZXN1bWV9LCBidXQgYWxzbyBpbXBvcnRhbnQKKyAqIGFyZSBtZXRob2RzIHJlbGF0ZWQgdG8gaW50ZXJhY3Rpb25zIHdpdGggdGhlIGFjdGl2aXR5IGFuZCBVSSBnZW5lcmF0aW9uLgorICoKKyAqIDxwPlRoZSBjb3JlIHNlcmllcyBvZiBsaWZlY3ljbGUgbWV0aG9kcyB0aGF0IGFyZSBjYWxsZWQgdG8gYnJpbmcgYSBmcmFnbWVudAorICogdXAgdG8gcmVzdW1lZCBzdGF0ZSAoaW50ZXJhY3Rpbmcgd2l0aCB0aGUgdXNlcikgYXJlOgorICoKKyAqIDxvbD4KKyAqIDxsaT4ge0BsaW5rICNvbkF0dGFjaH0gY2FsbGVkIG9uY2UgdGhlIGZyYWdtZW50IGlzIGFzc29jaWF0ZWQgd2l0aCBpdHMgYWN0aXZpdHkuCisgKiA8bGk+IHtAbGluayAjb25DcmVhdGV9IGNhbGxlZCB0byBkbyBpbml0aWFsIGNyZWF0aW9uIG9mIHRoZSBmcmFnbWVudC4KKyAqIDxsaT4ge0BsaW5rICNvbkNyZWF0ZVZpZXd9IGNyZWF0ZXMgYW5kIHJldHVybnMgdGhlIHZpZXcgaGllcmFyY2h5IGFzc29jaWF0ZWQKKyAqIHdpdGggdGhlIGZyYWdtZW50LgorICogPGxpPiB7QGxpbmsgI29uQWN0aXZpdHlDcmVhdGVkfSB0ZWxscyB0aGUgZnJhZ21lbnQgdGhhdCBpdHMgYWN0aXZpdHkgaGFzCisgKiBjb21wbGV0ZWQgaXRzIG93biB7QGxpbmsgQWN0aXZpdHkjb25DcmVhdGUgQWN0aXZpdHkub25DcmVhYXRlfS4KKyAqIDxsaT4ge0BsaW5rICNvblN0YXJ0fSBtYWtlcyB0aGUgZnJhZ21lbnQgdmlzaWJsZSB0byB0aGUgdXNlciAoYmFzZWQgb24gaXRzCisgKiBjb250YWluaW5nIGFjdGl2aXR5IGJlaW5nIHN0YXJ0ZWQpLgorICogPGxpPiB7QGxpbmsgI29uUmVzdW1lfSBtYWtlcyB0aGUgZnJhZ21lbnQgaW50ZXJhY3Rpbmcgd2l0aCB0aGUgdXNlciAoYmFzZWQgb24gaXRzCisgKiBjb250YWluaW5nIGFjdGl2aXR5IGJlaW5nIHJlc3VtZWQpLgorICogPC9vbD4KKyAqCisgKiA8cD5BcyBhIGZyYWdtZW50IGlzIG5vIGxvbmdlciBiZWluZyB1c2VkLCBpdCBnb2VzIHRocm91Z2ggYSByZXZlcnNlCisgKiBzZXJpZXMgb2YgY2FsbGJhY2tzOgorICoKKyAqIDxvbD4KKyAqIDxsaT4ge0BsaW5rICNvblBhdXNlfSBmcmFnbWVudCBpcyBubyBsb25nZXIgaW50ZXJhY3Rpbmcgd2l0aCB0aGUgdXNlciBlaXRoZXIKKyAqIGJlY2F1c2UgaXRzIGFjdGl2aXR5IGlzIGJlaW5nIHBhdXNlZCBvciBhIGZyYWdtZW50IG9wZXJhdGlvbiBpcyBtb2RpZnlpbmcgaXQKKyAqIGluIHRoZSBhY3Rpdml0eS4KKyAqIDxsaT4ge0BsaW5rICNvblN0b3B9IGZyYWdtZW50IGlzIG5vIGxvbmdlciB2aXNpYmxlIHRvIHRoZSB1c2VyIGVpdGhlcgorICogYmVjYXVzZSBpdHMgYWN0aXZpdHkgaXMgYmVpbmcgc3RvcHBlZCBvciBhIGZyYWdtZW50IG9wZXJhdGlvbiBpcyBtb2RpZnlpbmcgaXQKKyAqIGluIHRoZSBhY3Rpdml0eS4KKyAqIDxsaT4ge0BsaW5rICNvbkRlc3Ryb3lWaWV3fSBhbGxvd3MgdGhlIGZyYWdtZW50IHRvIGNsZWFuIHVwIHJlc291cmNlcworICogYXNzb2NpYXRlZCB3aXRoIGl0cyBWaWV3LgorICogPGxpPiB7QGxpbmsgI29uRGVzdHJveX0gY2FsbGVkIHRvIGRvIGZpbmFsIGNsZWFudXAgb2YgdGhlIGZyYWdtZW50J3Mgc3RhdGUuCisgKiA8bGk+IHtAbGluayAjb25EZXRhY2h9IGNhbGxlZCBpbW1lZGlhdGVseSBwcmlvciB0byB0aGUgZnJhZ21lbnQgbm8gbG9uZ2VyCisgKiBiZWluZyBhc3NvY2lhdGVkIHdpdGggaXRzIGFjdGl2aXR5LgorICogPC9vbD4KKyAqCisgKiA8YSBuYW1lPSJMYXlvdXQiPjwvYT4KKyAqIDxoMz5MYXlvdXQ8L2gzPgorICoKKyAqIDxwPkZyYWdtZW50cyBjYW4gYmUgdXNlZCBhcyBwYXJ0IG9mIHlvdXIgYXBwbGljYXRpb24ncyBsYXlvdXQsIGFsbG93aW5nCisgKiB5b3UgdG8gYmV0dGVyIG1vZHVsYXJpemUgeW91ciBjb2RlIGFuZCBtb3JlIGVhc2lseSBhZGp1c3QgeW91ciB1c2VyCisgKiBpbnRlcmZhY2UgdG8gdGhlIHNjcmVlbiBpdCBpcyBydW5uaW5nIG9uLiAgQXMgYW4gZXhhbXBsZSwgd2UgY2FuIGxvb2sKKyAqIGF0IGEgc2ltcGxlIHByb2dyYW0gY29uc2lzdGluZyBvZiBhIGxpc3Qgb2YgaXRlbXMsIGFuZCBkaXNwbGF5IG9mIHRoZQorICogZGV0YWlscyBvZiBlYWNoIGl0ZW0uPC9wPgorICoKKyAqIDxwPkFuIGFjdGl2aXR5J3MgbGF5b3V0IFhNTCBjYW4gaW5jbHVkZSA8Y29kZT4mbHQ7ZnJhZ21lbnQmZ3Q7PC9jb2RlPiB0YWdzCisgKiB0byBlbWJlZCBmcmFnbWVudCBpbnN0YW5jZXMgaW5zaWRlIG9mIHRoZSBsYXlvdXQuICBGb3IgZXhhbXBsZSwgaGVyZSBpcworICogYSBzaW1wbHkgbGF5b3V0IHRoYXQgZW1iZWRzIG9uZSBmcmFnbWVudDo8L3A+CisgKgorICoge0BzYW1wbGUgZGV2ZWxvcG1lbnQvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2ZyYWdtZW50X2xheW91dC54bWwgbGF5b3V0fQorICoKKyAqIDxwPlRoZSBsYXlvdXQgaXMgaW5zdGFsbGVkIGluIHRoZSBhY3Rpdml0eSBpbiB0aGUgbm9ybWFsIHdheTo8L3A+CisgKgorICoge0BzYW1wbGUgZGV2ZWxvcG1lbnQvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9GcmFnbWVudExheW91dC5qYXZhCisgKiAgICAgIG1haW59CisgKgorICogPHA+VGhlIHRpdGxlcyBmcmFnbWVudCwgc2hvd2luZyBhIGxpc3Qgb2YgdGl0bGVzLCBpcyB2ZXJ5IHNpbXBsZSwgcmVseWluZworICogb24ge0BsaW5rIExpc3RGcmFnbWVudH0gZm9yIG1vc3Qgb2YgaXRzIHdvcmsuICBOb3RlIHRoZSBpbXBsZW1lbnRhdGlvbiBvZgorICogY2xpY2tpbmcgYW4gaXRlbSwgd2hpY2ggY2FuIGVpdGhlciB1cGRhdGUKKyAqIHRoZSBjb250ZW50IG9mIHRoZSBkZXRhaWxzIGZyYWdtZW50IG9yIHN0YXJ0IGEgbmV3IGFjdGl2aXR5IHNob3cgdGhlCisgKiBkZXRhaWxzIGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZSBjdXJyZW50IGFjdGl2aXR5J3MgbGF5b3V0IGNhbiBzaG93IHRoZQorICogZGV0YWlscy48L3A+CisgKgorICoge0BzYW1wbGUgZGV2ZWxvcG1lbnQvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9GcmFnbWVudExheW91dC5qYXZhCisgKiAgICAgIHRpdGxlc30KKyAqCisgKiA8cD5UaGUgZGV0YWlscyBmcmFnbWVudCBzaG93aW5nIHRoZSBjb250ZW50cyBvZiBzZWxlY3RlZCBpdGVtIGhlcmUganVzdAorICogZGlzcGxheXMgYSBzdHJpbmcgb2YgdGV4dCBiYXNlZCBvbiBhbiBpbmRleCBvZiBhIHN0cmluZyBhcnJheSBidWlsdCBpbiB0bworICogdGhlIGFwcDo8L3A+CisgKgorICoge0BzYW1wbGUgZGV2ZWxvcG1lbnQvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9GcmFnbWVudExheW91dC5qYXZhCisgKiAgICAgIGRldGFpbHN9CisgKgorICogPHA+SW4gdGhpcyBjYXNlIHdoZW4gdGhlIHVzZXIgY2xpY2tzIG9uIGEgdGl0bGUsIHRoZXJlIGlzIG5vIGRldGFpbHMKKyAqIGZyYWdtZW50IGluIHRoZSBjdXJyZW50IGFjdGl2aXR5LCBzbyB0aGUgdGl0bGUgdGl0bGUgZnJhZ21lbnQncyBjbGljayBjb2RlIHdpbGwKKyAqIGxhdW5jaCBhIG5ldyBhY3Rpdml0eSB0byBkaXNwbGF5IHRoZSBkZXRhaWxzIGZyYWdtZW50OjwvcD4KKyAqCisgKiB7QHNhbXBsZSBkZXZlbG9wbWVudC9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYXBwL0ZyYWdtZW50TGF5b3V0LmphdmEKKyAqICAgICAgZGV0YWlsc19hY3Rpdml0eX0KKyAqCisgKiA8cD5Ib3dldmVyIHRoZSBzY3JlZW4gbWF5IGJlIGxhcmdlIGVub3VnaCB0byBzaG93IGJvdGggdGhlIGxpc3Qgb2YgdGl0bGVzCisgKiBhbmQgZGV0YWlscyBhYm91dCB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHRpdGxlLiAgVG8gdXNlIHN1Y2ggYSBsYXlvdXQgb24KKyAqIGEgbGFuZHNjYXBlIHNjcmVlbiwgdGhpcyBhbHRlcm5hdGl2ZSBsYXlvdXQgY2FuIGJlIHBsYWNlZCB1bmRlciBsYXlvdXQtbGFuZDo8L3A+CisgKgorICoge0BzYW1wbGUgZGV2ZWxvcG1lbnQvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0LWxhbmQvZnJhZ21lbnRfbGF5b3V0LnhtbCBsYXlvdXR9CisgKgorICogPHA+Tm90ZSBob3cgdGhlIHByaW9yIGNvZGUgd2lsbCBhZGp1c3QgdG8gdGhpcyBhbHRlcm5hdGl2ZSBVSSBmbG93OiB0aGUKKyAqIHRpdGxlcyBmcmFnbWVudCB3aWxsIG5vdyBzaG93IGl0cyB0ZXh0IGluc2lkZSBvZiBpdHMgYWN0aXZpdHksIGFuZCB0aGUKKyAqIGRldGFpbHMgYWN0aXZpdHkgd2lsbCBmaW5pc2ggb2YgaXQgZmluZHMgaXRzZWxmIHJ1bm5pbmcgaW4gYSBjb25maWd1cmF0aW9uCisgKiB3aGVyZSB0aGUgZGV0YWlscyBjYW4gYmUgc2hvd24gaW5saW5lLgorICoKKyAqIDxhIG5hbWU9IkJhY2tTdGFjayI+PC9hPgorICogPGgzPkJhY2sgU3RhY2s8L2gzPgorICoKKyAqIDxwPlRoZSB0cmFuc2FjdGlvbiBpbiB3aGljaCBmcmFnbWVudHMgYXJlIG1vZGlmaWVkIGNhbiBiZSBwbGFjZWQgb24gYW4KKyAqIGludGVybmFsIGJhY2stc3RhY2sgb2YgdGhlIG93bmluZyBhY3Rpdml0eS4gIFdoZW4gdGhlIHVzZXIgcHJlc3NlcyBiYWNrCisgKiBpbiB0aGUgYWN0aXZpdHksIGFueSB0cmFuc2FjdGlvbnMgb24gdGhlIGJhY2sgc3RhY2sgYXJlIHBvcHBlZCBvZmYgYmVmb3JlCisgKiB0aGUgYWN0aXZpdHkgaXRzZWxmIGlzIGZpbmlzaGVkLgorICoKKyAqIDxwPkZvciBleGFtcGxlLCBjb25zaWRlciB0aGlzIHNpbXBsZSBmcmFnbWVudCB0aGF0IGlzIGluc3RhbnRpYXRlZCB3aXRoCisgKiBhbiBpbnRlZ2VyIGFyZ3VtZW50IGFuZCBkaXNwbGF5cyB0aGF0IGluIGEgVGV4dFZpZXcgaW4gaXRzIFVJOjwvcD4KKyAqCisgKiB7QHNhbXBsZSBkZXZlbG9wbWVudC9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYXBwL0ZyYWdtZW50U3RhY2suamF2YQorICogICAgICBmcmFnbWVudH0KKyAqCisgKiA8cD5BIGZ1bmN0aW9uIHRoYXQgY3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgZnJhZ21lbnQsIHJlcGxhY2luZworICogd2hhdGV2ZXIgY3VycmVudCBmcmFnbWVudCBpbnN0YW5jZSBpcyBiZWluZyBzaG93biBhbmQgcHVzaGluZyB0aGF0IGNoYW5nZQorICogb24gdG8gdGhlIGJhY2sgc3RhY2sgY291bGQgYmUgd3JpdHRlbiBhczoKKyAqCisgKiB7QHNhbXBsZSBkZXZlbG9wbWVudC9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYXBwL0ZyYWdtZW50U3RhY2suamF2YQorICogICAgICBhZGRfc3RhY2t9CisgKgorICogPHA+QWZ0ZXIgZWFjaCBjYWxsIHRvIHRoaXMgZnVuY3Rpb24sIGEgbmV3IGVudHJ5IGlzIG9uIHRoZSBzdGFjaywgYW5kCisgKiBwcmVzc2luZyBiYWNrIHdpbGwgcG9wIGl0IHRvIHJldHVybiB0aGUgdXNlciB0byB3aGF0ZXZlciBwcmV2aW91cyBzdGF0ZQorICogdGhlIGFjdGl2aXR5IFVJIHdhcyBpbi4KKyAqLworcHVibGljIGNsYXNzIEZyYWdtZW50IGltcGxlbWVudHMgQ29tcG9uZW50Q2FsbGJhY2tzLCBPbkNyZWF0ZUNvbnRleHRNZW51TGlzdGVuZXIgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEhhc2hNYXA8U3RyaW5nLCBDbGFzczw/Pj4gc0NsYXNzTWFwID0KKyAgICAgICAgICAgIG5ldyBIYXNoTWFwPFN0cmluZywgQ2xhc3M8Pz4+KCk7CisgICAgCisgICAgc3RhdGljIGZpbmFsIGludCBJTklUSUFMSVpJTkcgPSAwOyAgICAgLy8gTm90IHlldCBjcmVhdGVkLgorICAgIHN0YXRpYyBmaW5hbCBpbnQgQ1JFQVRFRCA9IDE7ICAgICAgICAgIC8vIENyZWF0ZWQuCisgICAgc3RhdGljIGZpbmFsIGludCBBQ1RJVklUWV9DUkVBVEVEID0gMjsgLy8gVGhlIGFjdGl2aXR5IGhhcyBmaW5pc2hlZCBpdHMgY3JlYXRpb24uCisgICAgc3RhdGljIGZpbmFsIGludCBTVEFSVEVEID0gMzsgICAgICAgICAgLy8gQ3JlYXRlZCBhbmQgc3RhcnRlZCwgbm90IHJlc3VtZWQuCisgICAgc3RhdGljIGZpbmFsIGludCBSRVNVTUVEID0gNDsgICAgICAgICAgLy8gQ3JlYXRlZCBzdGFydGVkIGFuZCByZXN1bWVkLgorICAgIAorICAgIGludCBtU3RhdGUgPSBJTklUSUFMSVpJTkc7CisgICAgCisgICAgLy8gV2hlbiBpbnN0YW50aWF0ZWQgZnJvbSBzYXZlZCBzdGF0ZSwgdGhpcyBpcyB0aGUgc2F2ZWQgc3RhdGUuCisgICAgQnVuZGxlIG1TYXZlZEZyYWdtZW50U3RhdGU7CisgICAgU3BhcnNlQXJyYXk8UGFyY2VsYWJsZT4gbVNhdmVkVmlld1N0YXRlOworICAgIAorICAgIC8vIEluZGV4IGludG8gYWN0aXZlIGZyYWdtZW50IGFycmF5LgorICAgIGludCBtSW5kZXggPSAtMTsKKyAgICAKKyAgICAvLyBJbnRlcm5hbCB1bmlxdWUgbmFtZSBmb3IgdGhpcyBmcmFnbWVudDsKKyAgICBTdHJpbmcgbVdobzsKKyAgICAKKyAgICAvLyBDb25zdHJ1Y3Rpb24gYXJndW1lbnRzOworICAgIEJ1bmRsZSBtQXJndW1lbnRzOworCisgICAgLy8gVGFyZ2V0IGZyYWdtZW50LgorICAgIEZyYWdtZW50IG1UYXJnZXQ7CisKKyAgICAvLyBUYXJnZXQgcmVxdWVzdCBjb2RlLgorICAgIGludCBtVGFyZ2V0UmVxdWVzdENvZGU7CisKKyAgICAvLyBUcnVlIGlmIHRoZSBmcmFnbWVudCBpcyBpbiB0aGUgbGlzdCBvZiBhZGRlZCBmcmFnbWVudHMuCisgICAgYm9vbGVhbiBtQWRkZWQ7CisgICAgCisgICAgLy8gVHJ1ZSBpZiB0aGUgZnJhZ21lbnQgaXMgaW4gdGhlIHJlc3VtZWQgc3RhdGUuCisgICAgYm9vbGVhbiBtUmVzdW1lZDsKKyAgICAKKyAgICAvLyBTZXQgdG8gdHJ1ZSBpZiB0aGlzIGZyYWdtZW50IHdhcyBpbnN0YW50aWF0ZWQgZnJvbSBhIGxheW91dCBmaWxlLgorICAgIGJvb2xlYW4gbUZyb21MYXlvdXQ7CisgICAgCisgICAgLy8gTnVtYmVyIG9mIGFjdGl2ZSBiYWNrIHN0YWNrIGVudHJpZXMgdGhpcyBmcmFnbWVudCBpcyBpbi4KKyAgICBpbnQgbUJhY2tTdGFja05lc3Rpbmc7CisgICAgCisgICAgLy8gU2V0IGFzIHNvb24gYXMgYSBmcmFnbWVudCBpcyBhZGRlZCB0byBhIHRyYW5zYWN0aW9uIChvciByZW1vdmVkKSwKKyAgICAvLyB0byBiZSBhYmxlIHRvIGRvIHZhbGlkYXRpb24uCisgICAgQWN0aXZpdHkgbUltbWVkaWF0ZUFjdGl2aXR5OworICAgIAorICAgIC8vIEFjdGl2aXR5IHRoaXMgZnJhZ21lbnQgaXMgYXR0YWNoZWQgdG8uCisgICAgQWN0aXZpdHkgbUFjdGl2aXR5OworICAgIAorICAgIC8vIFRoZSBvcHRpb25hbCBpZGVudGlmaWVyIGZvciB0aGlzIGZyYWdtZW50IC0tIGVpdGhlciB0aGUgY29udGFpbmVyIElEIGlmIGl0CisgICAgLy8gd2FzIGR5bmFtaWNhbGx5IGFkZGVkIHRvIHRoZSB2aWV3IGhpZXJhcmNoeSwgb3IgdGhlIElEIHN1cHBsaWVkIGluCisgICAgLy8gbGF5b3V0LgorICAgIGludCBtRnJhZ21lbnRJZDsKKyAgICAKKyAgICAvLyBXaGVuIGEgZnJhZ21lbnQgaXMgYmVpbmcgZHluYW1pY2FsbHkgYWRkZWQgdG8gdGhlIHZpZXcgaGllcmFyY2h5LCB0aGlzCisgICAgLy8gaXMgdGhlIGlkZW50aWZpZXIgb2YgdGhlIHBhcmVudCBjb250YWluZXIgaXQgaXMgYmVpbmcgYWRkZWQgdG8uCisgICAgaW50IG1Db250YWluZXJJZDsKKyAgICAKKyAgICAvLyBUaGUgb3B0aW9uYWwgbmFtZWQgdGFnIGZvciB0aGlzIGZyYWdtZW50IC0tIHVzdWFsbHkgdXNlZCB0byBmaW5kCisgICAgLy8gZnJhZ21lbnRzIHRoYXQgYXJlIG5vdCBwYXJ0IG9mIHRoZSBsYXlvdXQuCisgICAgU3RyaW5nIG1UYWc7CisgICAgCisgICAgLy8gU2V0IHRvIHRydWUgd2hlbiB0aGUgYXBwIGhhcyByZXF1ZXN0ZWQgdGhhdCB0aGlzIGZyYWdtZW50IGJlIGhpZGRlbgorICAgIC8vIGZyb20gdGhlIHVzZXIuCisgICAgYm9vbGVhbiBtSGlkZGVuOworICAgIAorICAgIC8vIElmIHNldCB0aGlzIGZyYWdtZW50IHdvdWxkIGxpa2UgaXRzIGluc3RhbmNlIHJldGFpbmVkIGFjcm9zcworICAgIC8vIGNvbmZpZ3VyYXRpb24gY2hhbmdlcy4KKyAgICBib29sZWFuIG1SZXRhaW5JbnN0YW5jZTsKKyAgICAKKyAgICAvLyBJZiBzZXQgdGhpcyBmcmFnbWVudCBpcyBiZWluZyByZXRhaW5lZCBhY3Jvc3MgdGhlIGN1cnJlbnQgY29uZmlnIGNoYW5nZS4KKyAgICBib29sZWFuIG1SZXRhaW5pbmc7CisgICAgCisgICAgLy8gSWYgc2V0IHRoaXMgZnJhZ21lbnQgaGFzIG1lbnUgaXRlbXMgdG8gY29udHJpYnV0ZS4KKyAgICBib29sZWFuIG1IYXNNZW51OworICAgIAorICAgIC8vIFVzZWQgdG8gdmVyaWZ5IHRoYXQgc3ViY2xhc3NlcyBjYWxsIHRocm91Z2ggdG8gc3VwZXIgY2xhc3MuCisgICAgYm9vbGVhbiBtQ2FsbGVkOworICAgIAorICAgIC8vIElmIGFwcCBoYXMgcmVxdWVzdGVkIGEgc3BlY2lmaWMgYW5pbWF0aW9uLCB0aGlzIGlzIHRoZSBvbmUgdG8gdXNlLgorICAgIGludCBtTmV4dEFuaW07CisgICAgCisgICAgLy8gVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhlIGZyYWdtZW50IGFmdGVyIGR5bmFtaWNhbGx5IGFkZGVkIHRvIFVJLgorICAgIFZpZXdHcm91cCBtQ29udGFpbmVyOworICAgIAorICAgIC8vIFRoZSBWaWV3IGdlbmVyYXRlZCBmb3IgdGhpcyBmcmFnbWVudC4KKyAgICBWaWV3IG1WaWV3OworICAgIAorICAgIExvYWRlck1hbmFnZXJJbXBsIG1Mb2FkZXJNYW5hZ2VyOworICAgIGJvb2xlYW4gbVN0YXJ0ZWQ7CisgICAgYm9vbGVhbiBtQ2hlY2tlZEZvckxvYWRlck1hbmFnZXI7CisgICAgCisgICAgLyoqCisgICAgICogVGhyb3duIGJ5IHtAbGluayBGcmFnbWVudCNpbnN0YW50aWF0ZShDb250ZXh0LCBTdHJpbmcsIEJ1bmRsZSl9IHdoZW4KKyAgICAgKiB0aGVyZSBpcyBhbiBpbnN0YW50aWF0aW9uIGZhaWx1cmUuCisgICAgICovCisgICAgc3RhdGljIHB1YmxpYyBjbGFzcyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGV4dGVuZHMgQW5kcm9pZFJ1bnRpbWVFeGNlcHRpb24geworICAgICAgICBwdWJsaWMgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbihTdHJpbmcgbXNnLCBFeGNlcHRpb24gY2F1c2UpIHsKKyAgICAgICAgICAgIHN1cGVyKG1zZywgY2F1c2UpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4gIDxzdHJvbmc+RXZlcnk8L3N0cm9uZz4gZnJhZ21lbnQgbXVzdCBoYXZlIGFuCisgICAgICogZW1wdHkgY29uc3RydWN0b3IsIHNvIGl0IGNhbiBiZSBpbnN0YW50aWF0ZWQgd2hlbiByZXN0b3JpbmcgaXRzCisgICAgICogYWN0aXZpdHkncyBzdGF0ZS4gIEl0IGlzIHN0cm9uZ2x5IHJlY29tbWVuZGVkIHRoYXQgc3ViY2xhc3NlcyBkbyBub3QKKyAgICAgKiBoYXZlIG90aGVyIGNvbnN0cnVjdG9ycyB3aXRoIHBhcmFtZXRlcnMsIHNpbmNlIHRoZXNlIGNvbnN0cnVjdG9ycworICAgICAqIHdpbGwgbm90IGJlIGNhbGxlZCB3aGVuIHRoZSBmcmFnbWVudCBpcyByZS1pbnN0YW50aWF0ZWQ7IGluc3RlYWQsCisgICAgICogYXJndW1lbnRzIGNhbiBiZSBzdXBwbGllZCBieSB0aGUgY2FsbGVyIHdpdGgge0BsaW5rICNzZXRBcmd1bWVudHN9CisgICAgICogYW5kIGxhdGVyIHJldHJpZXZlZCBieSB0aGUgRnJhZ21lbnQgd2l0aCB7QGxpbmsgI2dldEFyZ3VtZW50c30uCisgICAgICogCisgICAgICogPHA+QXBwbGljYXRpb25zIHNob3VsZCBnZW5lcmFsbHkgbm90IGltcGxlbWVudCBhIGNvbnN0cnVjdG9yLiAgVGhlCisgICAgICogZmlyc3QgcGxhY2UgYXBwbGljYXRpb24gY29kZSBhbiBydW4gd2hlcmUgdGhlIGZyYWdtZW50IGlzIHJlYWR5IHRvCisgICAgICogYmUgdXNlZCBpcyBpbiB7QGxpbmsgI29uQXR0YWNoKEFjdGl2aXR5KX0sIHRoZSBwb2ludCB3aGVyZSB0aGUgZnJhZ21lbnQKKyAgICAgKiBpcyBhY3R1YWxseSBhc3NvY2lhdGVkIHdpdGggaXRzIGFjdGl2aXR5LiAgU29tZSBhcHBsaWNhdGlvbnMgbWF5IGFsc28KKyAgICAgKiB3YW50IHRvIGltcGxlbWVudCB7QGxpbmsgI29uSW5mbGF0ZX0gdG8gcmV0cmlldmUgYXR0cmlidXRlcyBmcm9tIGEKKyAgICAgKiBsYXlvdXQgcmVzb3VyY2UsIHRob3VnaCBzaG91bGQgdGFrZSBjYXJlIGhlcmUgYmVjYXVzZSB0aGlzIGhhcHBlbnMgZm9yCisgICAgICogdGhlIGZyYWdtZW50IGlzIGF0dGFjaGVkIHRvIGl0cyBhY3Rpdml0eS4KKyAgICAgKi8KKyAgICBwdWJsaWMgRnJhZ21lbnQoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogTGlrZSB7QGxpbmsgI2luc3RhbnRpYXRlKENvbnRleHQsIFN0cmluZywgQnVuZGxlKX0gYnV0IHdpdGggYSBudWxsCisgICAgICogYXJndW1lbnQgQnVuZGxlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgRnJhZ21lbnQgaW5zdGFudGlhdGUoQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgZm5hbWUpIHsKKyAgICAgICAgcmV0dXJuIGluc3RhbnRpYXRlKGNvbnRleHQsIGZuYW1lLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgYSBGcmFnbWVudCB3aXRoIHRoZSBnaXZlbiBjbGFzcyBuYW1lLiAgVGhpcyBpcworICAgICAqIHRoZSBzYW1lIGFzIGNhbGxpbmcgaXRzIGVtcHR5IGNvbnN0cnVjdG9yLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgVGhlIGNhbGxpbmcgY29udGV4dCBiZWluZyB1c2VkIHRvIGluc3RhbnRpYXRlIHRoZSBmcmFnbWVudC4KKyAgICAgKiBUaGlzIGlzIGN1cnJlbnRseSBqdXN0IHVzZWQgdG8gZ2V0IGl0cyBDbGFzc0xvYWRlci4KKyAgICAgKiBAcGFyYW0gZm5hbWUgVGhlIGNsYXNzIG5hbWUgb2YgdGhlIGZyYWdtZW50IHRvIGluc3RhbnRpYXRlLgorICAgICAqIEBwYXJhbSBhcmdzIEJ1bmRsZSBvZiBhcmd1bWVudHMgdG8gc3VwcGx5IHRvIHRoZSBmcmFnbWVudCwgd2hpY2ggaXQKKyAgICAgKiBjYW4gcmV0cmlldmUgd2l0aCB7QGxpbmsgI2dldEFyZ3VtZW50cygpfS4gIE1heSBiZSBudWxsLgorICAgICAqIEByZXR1cm4gUmV0dXJucyBhIG5ldyBmcmFnbWVudCBpbnN0YW5jZS4KKyAgICAgKiBAdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb24gSWYgdGhlcmUgaXMgYSBmYWlsdXJlIGluIGluc3RhbnRpYXRpbmcKKyAgICAgKiB0aGUgZ2l2ZW4gZnJhZ21lbnQgY2xhc3MuICBUaGlzIGlzIGEgcnVudGltZSBleGNlcHRpb247IGl0IGlzIG5vdAorICAgICAqIG5vcm1hbGx5IGV4cGVjdGVkIHRvIGhhcHBlbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEZyYWdtZW50IGluc3RhbnRpYXRlKENvbnRleHQgY29udGV4dCwgU3RyaW5nIGZuYW1lLCBCdW5kbGUgYXJncykgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgQ2xhc3M8Pz4gY2xhenogPSBzQ2xhc3NNYXAuZ2V0KGZuYW1lKTsKKyAgICAgICAgICAgIGlmIChjbGF6eiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgLy8gQ2xhc3Mgbm90IGZvdW5kIGluIHRoZSBjYWNoZSwgc2VlIGlmIGl0J3MgcmVhbCwgYW5kIHRyeSB0byBhZGQgaXQKKyAgICAgICAgICAgICAgICBjbGF6eiA9IGNvbnRleHQuZ2V0Q2xhc3NMb2FkZXIoKS5sb2FkQ2xhc3MoZm5hbWUpOworICAgICAgICAgICAgICAgIHNDbGFzc01hcC5wdXQoZm5hbWUsIGNsYXp6KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZyYWdtZW50IGYgPSAoRnJhZ21lbnQpY2xhenoubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgICAgIGlmIChhcmdzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBhcmdzLnNldENsYXNzTG9hZGVyKGYuZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpKTsKKyAgICAgICAgICAgICAgICBmLm1Bcmd1bWVudHMgPSBhcmdzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGY7CisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEluc3RhbnRpYXRpb25FeGNlcHRpb24oIlVuYWJsZSB0byBpbnN0YW50aWF0ZSBmcmFnbWVudCAiICsgZm5hbWUKKyAgICAgICAgICAgICAgICAgICAgKyAiOiBtYWtlIHN1cmUgY2xhc3MgbmFtZSBleGlzdHMsIGlzIHB1YmxpYywgYW5kIGhhcyBhbiIKKyAgICAgICAgICAgICAgICAgICAgKyAiIGVtcHR5IGNvbnN0cnVjdG9yIHRoYXQgaXMgcHVibGljIiwgZSk7CisgICAgICAgIH0gY2F0Y2ggKGphdmEubGFuZy5JbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uKCJVbmFibGUgdG8gaW5zdGFudGlhdGUgZnJhZ21lbnQgIiArIGZuYW1lCisgICAgICAgICAgICAgICAgICAgICsgIjogbWFrZSBzdXJlIGNsYXNzIG5hbWUgZXhpc3RzLCBpcyBwdWJsaWMsIGFuZCBoYXMgYW4iCisgICAgICAgICAgICAgICAgICAgICsgIiBlbXB0eSBjb25zdHJ1Y3RvciB0aGF0IGlzIHB1YmxpYyIsIGUpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uKCJVbmFibGUgdG8gaW5zdGFudGlhdGUgZnJhZ21lbnQgIiArIGZuYW1lCisgICAgICAgICAgICAgICAgICAgICsgIjogbWFrZSBzdXJlIGNsYXNzIG5hbWUgZXhpc3RzLCBpcyBwdWJsaWMsIGFuZCBoYXMgYW4iCisgICAgICAgICAgICAgICAgICAgICsgIiBlbXB0eSBjb25zdHJ1Y3RvciB0aGF0IGlzIHB1YmxpYyIsIGUpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHZvaWQgcmVzdG9yZVZpZXdTdGF0ZSgpIHsKKyAgICAgICAgaWYgKG1TYXZlZFZpZXdTdGF0ZSAhPSBudWxsKSB7CisgICAgICAgICAgICBtVmlldy5yZXN0b3JlSGllcmFyY2h5U3RhdGUobVNhdmVkVmlld1N0YXRlKTsKKyAgICAgICAgICAgIG1TYXZlZFZpZXdTdGF0ZSA9IG51bGw7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgdm9pZCBzZXRJbmRleChpbnQgaW5kZXgpIHsKKyAgICAgICAgbUluZGV4ID0gaW5kZXg7CisgICAgICAgIG1XaG8gPSAiYW5kcm9pZDpmcmFnbWVudDoiICsgbUluZGV4OworICAgfQorICAgIAorICAgIHZvaWQgY2xlYXJJbmRleCgpIHsKKyAgICAgICAgbUluZGV4ID0gLTE7CisgICAgICAgIG1XaG8gPSBudWxsOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTdWJjbGFzc2VzIGNhbiBub3Qgb3ZlcnJpZGUgZXF1YWxzKCkuCisgICAgICovCisgICAgQE92ZXJyaWRlIGZpbmFsIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgeworICAgICAgICByZXR1cm4gc3VwZXIuZXF1YWxzKG8pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN1YmNsYXNzZXMgY2FuIG5vdCBvdmVycmlkZSBoYXNoQ29kZSgpLgorICAgICAqLworICAgIEBPdmVycmlkZSBmaW5hbCBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICByZXR1cm4gc3VwZXIuaGFzaENvZGUoKTsKKyAgICB9CisgICAgCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDEyOCk7CisgICAgICAgIHNiLmFwcGVuZCgiRnJhZ21lbnR7Iik7CisgICAgICAgIHNiLmFwcGVuZChJbnRlZ2VyLnRvSGV4U3RyaW5nKFN5c3RlbS5pZGVudGl0eUhhc2hDb2RlKHRoaXMpKSk7CisgICAgICAgIGlmIChtSW5kZXggPj0gMCkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCIgIyIpOworICAgICAgICAgICAgc2IuYXBwZW5kKG1JbmRleCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1GcmFnbWVudElkICE9IDApIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiIGlkPTB4Iik7CisgICAgICAgICAgICBzYi5hcHBlbmQoSW50ZWdlci50b0hleFN0cmluZyhtRnJhZ21lbnRJZCkpOworICAgICAgICB9CisgICAgICAgIGlmIChtVGFnICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiICIpOworICAgICAgICAgICAgc2IuYXBwZW5kKG1UYWcpOworICAgICAgICB9CisgICAgICAgIHNiLmFwcGVuZCgnfScpOworICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBpZGVudGlmaWVyIHRoaXMgZnJhZ21lbnQgaXMga25vd24gYnkuICBUaGlzIGlzIGVpdGhlcgorICAgICAqIHRoZSBhbmRyb2lkOmlkIHZhbHVlIHN1cHBsaWVkIGluIGEgbGF5b3V0IG9yIHRoZSBjb250YWluZXIgdmlldyBJRAorICAgICAqIHN1cHBsaWVkIHdoZW4gYWRkaW5nIHRoZSBmcmFnbWVudC4KKyAgICAgKi8KKyAgICBmaW5hbCBwdWJsaWMgaW50IGdldElkKCkgeworICAgICAgICByZXR1cm4gbUZyYWdtZW50SWQ7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEdldCB0aGUgdGFnIG5hbWUgb2YgdGhlIGZyYWdtZW50LCBpZiBzcGVjaWZpZWQuCisgICAgICovCisgICAgZmluYWwgcHVibGljIFN0cmluZyBnZXRUYWcoKSB7CisgICAgICAgIHJldHVybiBtVGFnOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTdXBwbHkgdGhlIGNvbnN0cnVjdGlvbiBhcmd1bWVudHMgZm9yIHRoaXMgZnJhZ21lbnQuICBUaGlzIGNhbiBvbmx5CisgICAgICogYmUgY2FsbGVkIGJlZm9yZSB0aGUgZnJhZ21lbnQgaGFzIGJlZW4gYXR0YWNoZWQgdG8gaXRzIGFjdGl2aXR5OyB0aGF0CisgICAgICogaXMsIHlvdSBzaG91bGQgY2FsbCBpdCBpbW1lZGlhdGVseSBhZnRlciBjb25zdHJ1Y3RpbmcgdGhlIGZyYWdtZW50LiAgVGhlCisgICAgICogYXJndW1lbnRzIHN1cHBsaWVkIGhlcmUgd2lsbCBiZSByZXRhaW5lZCBhY3Jvc3MgZnJhZ21lbnQgZGVzdHJveSBhbmQKKyAgICAgKiBjcmVhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBcmd1bWVudHMoQnVuZGxlIGFyZ3MpIHsKKyAgICAgICAgaWYgKG1JbmRleCA+PSAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJGcmFnbWVudCBhbHJlYWR5IGFjdGl2ZSIpOworICAgICAgICB9CisgICAgICAgIG1Bcmd1bWVudHMgPSBhcmdzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgYXJndW1lbnRzIHN1cHBsaWVkIHdoZW4gdGhlIGZyYWdtZW50IHdhcyBpbnN0YW50aWF0ZWQsCisgICAgICogaWYgYW55LgorICAgICAqLworICAgIGZpbmFsIHB1YmxpYyBCdW5kbGUgZ2V0QXJndW1lbnRzKCkgeworICAgICAgICByZXR1cm4gbUFyZ3VtZW50czsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPcHRpb25hbCB0YXJnZXQgZm9yIHRoaXMgZnJhZ21lbnQuICBUaGlzIG1heSBiZSB1c2VkLCBmb3IgZXhhbXBsZSwKKyAgICAgKiBpZiB0aGlzIGZyYWdtZW50IGlzIGJlaW5nIHN0YXJ0ZWQgYnkgYW5vdGhlciwgYW5kIHdoZW4gZG9uZSB3YW50cyB0bworICAgICAqIGdpdmUgYSByZXN1bHQgYmFjayB0byB0aGUgZmlyc3QuICBUaGUgdGFyZ2V0IHNldCBoZXJlIGlzIHJldGFpbmVkCisgICAgICogYWNyb3NzIGluc3RhbmNlcyB2aWEge0BsaW5rIEZyYWdtZW50TWFuYWdlciNwdXRGcmFnbWVudAorICAgICAqIEZyYWdtZW50TWFuYWdlci5wdXRGcmFnbWVudCgpfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmcmFnbWVudCBUaGUgZnJhZ21lbnQgdGhhdCBpcyB0aGUgdGFyZ2V0IG9mIHRoaXMgb25lLgorICAgICAqIEBwYXJhbSByZXF1ZXN0Q29kZSBPcHRpb25hbCByZXF1ZXN0IGNvZGUsIGZvciBjb252ZW5pZW5jZSBpZiB5b3UKKyAgICAgKiBhcmUgZ29pbmcgdG8gY2FsbCBiYWNrIHdpdGgge0BsaW5rICNvbkFjdGl2aXR5UmVzdWx0KGludCwgaW50LCBJbnRlbnQpfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUYXJnZXRGcmFnbWVudChGcmFnbWVudCBmcmFnbWVudCwgaW50IHJlcXVlc3RDb2RlKSB7CisgICAgICAgIG1UYXJnZXQgPSBmcmFnbWVudDsKKyAgICAgICAgbVRhcmdldFJlcXVlc3RDb2RlID0gcmVxdWVzdENvZGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB0YXJnZXQgZnJhZ21lbnQgc2V0IGJ5IHtAbGluayAjc2V0VGFyZ2V0RnJhZ21lbnR9LgorICAgICAqLworICAgIGZpbmFsIHB1YmxpYyBGcmFnbWVudCBnZXRUYXJnZXRGcmFnbWVudCgpIHsKKyAgICAgICAgcmV0dXJuIG1UYXJnZXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB0YXJnZXQgcmVxdWVzdCBjb2RlIHNldCBieSB7QGxpbmsgI3NldFRhcmdldEZyYWdtZW50fS4KKyAgICAgKi8KKyAgICBmaW5hbCBwdWJsaWMgaW50IGdldFRhcmdldFJlcXVlc3RDb2RlKCkgeworICAgICAgICByZXR1cm4gbVRhcmdldFJlcXVlc3RDb2RlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgQWN0aXZpdHkgdGhpcyBmcmFnbWVudCBpcyBjdXJyZW50bHkgYXNzb2NpYXRlZCB3aXRoLgorICAgICAqLworICAgIGZpbmFsIHB1YmxpYyBBY3Rpdml0eSBnZXRBY3Rpdml0eSgpIHsKKyAgICAgICAgcmV0dXJuIG1BY3Rpdml0eTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBGcmFnbWVudE1hbmFnZXIgZm9yIGludGVyYWN0aW5nIHdpdGggZnJhZ21lbnRzIGFzc29jaWF0ZWQKKyAgICAgKiB3aXRoIHRoaXMgZnJhZ21lbnQncyBhY3Rpdml0eS4KKyAgICAgKi8KKyAgICBmaW5hbCBwdWJsaWMgRnJhZ21lbnRNYW5hZ2VyIGdldEZyYWdtZW50TWFuYWdlcigpIHsKKyAgICAgICAgcmV0dXJuIG1BY3Rpdml0eS5tRnJhZ21lbnRzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0cnVlIGlmIHRoZSBmcmFnbWVudCBpcyBjdXJyZW50bHkgYWRkZWQgdG8gaXRzIGFjdGl2aXR5LgorICAgICAqLworICAgIGZpbmFsIHB1YmxpYyBib29sZWFuIGlzQWRkZWQoKSB7CisgICAgICAgIHJldHVybiBtQWN0aXZpdHkgIT0gbnVsbCAmJiBtQWN0aXZpdHkubUZyYWdtZW50cy5tQWRkZWQuY29udGFpbnModGhpcyk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0cnVlIGlmIHRoZSBmcmFnbWVudCBpcyBpbiB0aGUgcmVzdW1lZCBzdGF0ZS4gIFRoaXMgaXMgdHJ1ZQorICAgICAqIGZvciB0aGUgZHVyYXRpb24gb2Yge0BsaW5rICNvblJlc3VtZSgpfSBhbmQge0BsaW5rICNvblBhdXNlKCl9IGFzIHdlbGwuCisgICAgICovCisgICAgZmluYWwgcHVibGljIGJvb2xlYW4gaXNSZXN1bWVkKCkgeworICAgICAgICByZXR1cm4gbVJlc3VtZWQ7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0cnVlIGlmIHRoZSBmcmFnbWVudCBpcyBjdXJyZW50bHkgdmlzaWJsZSB0byB0aGUgdXNlci4gIFRoaXMgbWVhbnMKKyAgICAgKiBpdDogKDEpIGhhcyBiZWVuIGFkZGVkLCAoMikgaGFzIGl0cyB2aWV3IGF0dGFjaGVkIHRvIHRoZSB3aW5kb3csIGFuZCAKKyAgICAgKiAoMykgaXMgbm90IGhpZGRlbi4KKyAgICAgKi8KKyAgICBmaW5hbCBwdWJsaWMgYm9vbGVhbiBpc1Zpc2libGUoKSB7CisgICAgICAgIHJldHVybiBpc0FkZGVkKCkgJiYgIWlzSGlkZGVuKCkgJiYgbVZpZXcgIT0gbnVsbAorICAgICAgICAgICAgICAgICYmIG1WaWV3LmdldFdpbmRvd1Rva2VuKCkgIT0gbnVsbCAmJiBtVmlldy5nZXRWaXNpYmlsaXR5KCkgPT0gVmlldy5WSVNJQkxFOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZnJhZ21lbnQgaGFzIGJlZW4gaGlkZGVuLiAgQnkgZGVmYXVsdCBmcmFnbWVudHMKKyAgICAgKiBhcmUgc2hvd24uICBZb3UgY2FuIGZpbmQgb3V0IGFib3V0IGNoYW5nZXMgdG8gdGhpcyBzdGF0ZSB3aXRoCisgICAgICoge0BsaW5rICNvbkhpZGRlbkNoYW5nZWR9LiAgTm90ZSB0aGF0IHRoZSBoaWRkZW4gc3RhdGUgaXMgb3J0aG9nb25hbAorICAgICAqIHRvIG90aGVyIHN0YXRlcyAtLSB0aGF0IGlzLCB0byBiZSB2aXNpYmxlIHRvIHRoZSB1c2VyLCBhIGZyYWdtZW50CisgICAgICogbXVzdCBiZSBib3RoIHN0YXJ0ZWQgYW5kIG5vdCBoaWRkZW4uCisgICAgICovCisgICAgZmluYWwgcHVibGljIGJvb2xlYW4gaXNIaWRkZW4oKSB7CisgICAgICAgIHJldHVybiBtSGlkZGVuOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgd2hlbiB0aGUgaGlkZGVuIHN0YXRlIChhcyByZXR1cm5lZCBieSB7QGxpbmsgI2lzSGlkZGVuKCl9IG9mCisgICAgICogdGhlIGZyYWdtZW50IGhhcyBjaGFuZ2VkLiAgRnJhZ21lbnRzIHN0YXJ0IG91dCBub3QgaGlkZGVuOyB0aGlzIHdpbGwKKyAgICAgKiBiZSBjYWxsZWQgd2hlbmV2ZXIgdGhlIGZyYWdtZW50IGNoYW5nZXMgc3RhdGUgZnJvbSB0aGF0LgorICAgICAqIEBwYXJhbSBoaWRkZW4gVHJ1ZSBpZiB0aGUgZnJhZ21lbnQgaXMgbm93IGhpZGRlbiwgZmFsc2UgaWYgaXQgaXMgbm90CisgICAgICogdmlzaWJsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvbkhpZGRlbkNoYW5nZWQoYm9vbGVhbiBoaWRkZW4pIHsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQ29udHJvbCB3aGV0aGVyIGEgZnJhZ21lbnQgaW5zdGFuY2UgaXMgcmV0YWluZWQgYWNyb3NzIEFjdGl2aXR5CisgICAgICogcmUtY3JlYXRpb24gKHN1Y2ggYXMgZnJvbSBhIGNvbmZpZ3VyYXRpb24gY2hhbmdlKS4gIFRoaXMgY2FuIG9ubHkKKyAgICAgKiBiZSB1c2VkIHdpdGggZnJhZ21lbnRzIG5vdCBpbiB0aGUgYmFjayBzdGFjay4gIElmIHNldCwgdGhlIGZyYWdtZW50CisgICAgICogbGlmZWN5Y2xlIHdpbGwgYmUgc2xpZ2h0bHkgZGlmZmVyZW50IHdoZW4gYW4gYWN0aXZpdHkgaXMgcmVjcmVhdGVkOgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+IHtAbGluayAjb25EZXN0cm95KCl9IHdpbGwgbm90IGJlIGNhbGxlZCAoYnV0IHtAbGluayAjb25EZXRhY2goKX0gc3RpbGwKKyAgICAgKiB3aWxsIGJlLCBiZWNhdXNlIHRoZSBmcmFnbWVudCBpcyBiZWluZyBkZXRhY2hlZCBmcm9tIGl0cyBjdXJyZW50IGFjdGl2aXR5KS4KKyAgICAgKiA8bGk+IHtAbGluayAjb25DcmVhdGUoQnVuZGxlKX0gd2lsbCBub3QgYmUgY2FsbGVkIHNpbmNlIHRoZSBmcmFnbWVudAorICAgICAqIGlzIG5vdCBiZWluZyByZS1jcmVhdGVkLgorICAgICAqIDxsaT4ge0BsaW5rICNvbkF0dGFjaChBY3Rpdml0eSl9IGFuZCB7QGxpbmsgI29uQWN0aXZpdHlDcmVhdGVkKEJ1bmRsZSl9IDxiPndpbGw8L2I+CisgICAgICogc3RpbGwgYmUgY2FsbGVkLgorICAgICAqIDwvdWw+CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmV0YWluSW5zdGFuY2UoYm9vbGVhbiByZXRhaW4pIHsKKyAgICAgICAgbVJldGFpbkluc3RhbmNlID0gcmV0YWluOworICAgIH0KKyAgICAKKyAgICBmaW5hbCBwdWJsaWMgYm9vbGVhbiBnZXRSZXRhaW5JbnN0YW5jZSgpIHsKKyAgICAgICAgcmV0dXJuIG1SZXRhaW5JbnN0YW5jZTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmVwb3J0IHRoYXQgdGhpcyBmcmFnbWVudCB3b3VsZCBsaWtlIHRvIHBhcnRpY2lwYXRlIGluIHBvcHVsYXRpbmcKKyAgICAgKiB0aGUgb3B0aW9ucyBtZW51IGJ5IHJlY2VpdmluZyBhIGNhbGwgdG8ge0BsaW5rICNvbkNyZWF0ZU9wdGlvbnNNZW51fQorICAgICAqIGFuZCByZWxhdGVkIG1ldGhvZHMuCisgICAgICogCisgICAgICogQHBhcmFtIGhhc01lbnUgSWYgdHJ1ZSwgdGhlIGZyYWdtZW50IGhhcyBtZW51IGl0ZW1zIHRvIGNvbnRyaWJ1dGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SGFzT3B0aW9uc01lbnUoYm9vbGVhbiBoYXNNZW51KSB7CisgICAgICAgIGlmIChtSGFzTWVudSAhPSBoYXNNZW51KSB7CisgICAgICAgICAgICBtSGFzTWVudSA9IGhhc01lbnU7CisgICAgICAgICAgICBpZiAoaXNBZGRlZCgpICYmICFpc0hpZGRlbigpKSB7CisgICAgICAgICAgICAgICAgbUFjdGl2aXR5LmludmFsaWRhdGVPcHRpb25zTWVudSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgTG9hZGVyTWFuYWdlciBmb3IgdGhpcyBmcmFnbWVudCwgY3JlYXRpbmcgaXQgaWYgbmVlZGVkLgorICAgICAqLworICAgIHB1YmxpYyBMb2FkZXJNYW5hZ2VyIGdldExvYWRlck1hbmFnZXIoKSB7CisgICAgICAgIGlmIChtTG9hZGVyTWFuYWdlciAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbUxvYWRlck1hbmFnZXI7CisgICAgICAgIH0KKyAgICAgICAgbUNoZWNrZWRGb3JMb2FkZXJNYW5hZ2VyID0gdHJ1ZTsKKyAgICAgICAgbUxvYWRlck1hbmFnZXIgPSBtQWN0aXZpdHkuZ2V0TG9hZGVyTWFuYWdlcihtSW5kZXgsIG1TdGFydGVkLCB0cnVlKTsKKyAgICAgICAgcmV0dXJuIG1Mb2FkZXJNYW5hZ2VyOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBDYWxsIHtAbGluayBBY3Rpdml0eSNzdGFydEFjdGl2aXR5KEludGVudCl9IG9uIHRoZSBmcmFnbWVudCdzCisgICAgICogY29udGFpbmluZyBBY3Rpdml0eS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdGFydEFjdGl2aXR5KEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgbUFjdGl2aXR5LnN0YXJ0QWN0aXZpdHlGcm9tRnJhZ21lbnQodGhpcywgaW50ZW50LCAtMSk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIENhbGwge0BsaW5rIEFjdGl2aXR5I3N0YXJ0QWN0aXZpdHlGb3JSZXN1bHQoSW50ZW50LCBpbnQpfSBvbiB0aGUgZnJhZ21lbnQncworICAgICAqIGNvbnRhaW5pbmcgQWN0aXZpdHkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RhcnRBY3Rpdml0eUZvclJlc3VsdChJbnRlbnQgaW50ZW50LCBpbnQgcmVxdWVzdENvZGUpIHsKKyAgICAgICAgbUFjdGl2aXR5LnN0YXJ0QWN0aXZpdHlGcm9tRnJhZ21lbnQodGhpcywgaW50ZW50LCByZXF1ZXN0Q29kZSk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJlY2VpdmUgdGhlIHJlc3VsdCBmcm9tIGEgcHJldmlvdXMgY2FsbCB0bworICAgICAqIHtAbGluayAjc3RhcnRBY3Rpdml0eUZvclJlc3VsdChJbnRlbnQsIGludCl9LiAgVGhpcyBmb2xsb3dzIHRoZQorICAgICAqIHJlbGF0ZWQgQWN0aXZpdHkgQVBJIGFzIGRlc2NyaWJlZCB0aGVyZSBpbgorICAgICAqIHtAbGluayBBY3Rpdml0eSNvbkFjdGl2aXR5UmVzdWx0KGludCwgaW50LCBJbnRlbnQpfS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcmVxdWVzdENvZGUgVGhlIGludGVnZXIgcmVxdWVzdCBjb2RlIG9yaWdpbmFsbHkgc3VwcGxpZWQgdG8KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgc3RhcnRBY3Rpdml0eUZvclJlc3VsdCgpLCBhbGxvd2luZyB5b3UgdG8gaWRlbnRpZnkgd2hvIHRoaXMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgcmVzdWx0IGNhbWUgZnJvbS4KKyAgICAgKiBAcGFyYW0gcmVzdWx0Q29kZSBUaGUgaW50ZWdlciByZXN1bHQgY29kZSByZXR1cm5lZCBieSB0aGUgY2hpbGQgYWN0aXZpdHkKKyAgICAgKiAgICAgICAgICAgICAgICAgICB0aHJvdWdoIGl0cyBzZXRSZXN1bHQoKS4KKyAgICAgKiBAcGFyYW0gZGF0YSBBbiBJbnRlbnQsIHdoaWNoIGNhbiByZXR1cm4gcmVzdWx0IGRhdGEgdG8gdGhlIGNhbGxlcgorICAgICAqICAgICAgICAgICAgICAgKHZhcmlvdXMgZGF0YSBjYW4gYmUgYXR0YWNoZWQgdG8gSW50ZW50ICJleHRyYXMiKS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvbkFjdGl2aXR5UmVzdWx0KGludCByZXF1ZXN0Q29kZSwgaW50IHJlc3VsdENvZGUsIEludGVudCBkYXRhKSB7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIENhbGxlZCB3aGVuIGEgZnJhZ21lbnQgaXMgYmVpbmcgY3JlYXRlZCBhcyBwYXJ0IG9mIGEgdmlldyBsYXlvdXQKKyAgICAgKiBpbmZsYXRpb24sIHR5cGljYWxseSBmcm9tIHNldHRpbmcgdGhlIGNvbnRlbnQgdmlldyBvZiBhbiBhY3Rpdml0eS4gIFRoaXMKKyAgICAgKiB3aWxsIGJlIGNhbGxlZCBpbW1lZGlhdGVseSBhZnRlciB0aGUgZnJhZ21lbnQgaXMgY3JlYXRlZCBmcm9tIGEgPGZyYWdtZW50PgorICAgICAqIHRhZyBpbiBhIGxheW91dCBmaWxlLiAgTm90ZSB0aGlzIGlzIDxlbT5iZWZvcmU8L2VtPiB0aGUgZnJhZ21lbnQncworICAgICAqIHtAbGluayAjb25BdHRhY2goQWN0aXZpdHkpfSBoYXMgYmVlbiBjYWxsZWQ7IGFsbCB5b3Ugc2hvdWxkIGRvIGhlcmUgaXMKKyAgICAgKiBwYXJzZSB0aGUgYXR0cmlidXRlcyBhbmQgc2F2ZSB0aGVtIGF3YXkuICBBIGNvbnZlbmllbnQgdGhpbmcgdG8gZG8gaXMKKyAgICAgKiBzaW1wbHkgY29weSB0aGVtIGludG8gYSBCdW5kbGUgdGhhdCBpcyBnaXZlbiB0byB7QGxpbmsgI3NldEFyZ3VtZW50cyhCdW5kbGUpfS4KKyAgICAgKiAKKyAgICAgKiA8cD5UaGlzIGlzIGNhbGxlZCBldmVyeSB0aW1lIHRoZSBmcmFnbWVudCBpcyBpbmZsYXRlZCwgZXZlbiBpZiBpdCBpcworICAgICAqIGJlaW5nIGluZmxhdGVkIGludG8gYSBuZXcgaW5zdGFuY2Ugd2l0aCBzYXZlZCBzdGF0ZS4gIEJlY2F1c2UgYSBmcmFnbWVudCdzCisgICAgICogYXJndW1lbnRzIGFyZSByZXRhaW5lZCBhY3Jvc3MgaW5zdGFuY2VzLCBpdCBtYXkgbWFrZSBubyBzZW5zZSB0byByZS1wYXJzZQorICAgICAqIHRoZSBhdHRyaWJ1dGVzIGludG8gbmV3IGFyZ3VtZW50cy4gIFlvdSBtYXkgd2FudCB0byBmaXJzdCBjaGVjaworICAgICAqIHtAbGluayAjZ2V0QXJndW1lbnRzKCl9IGFuZCBvbmx5IHBhcnNlIHRoZSBhdHRyaWJ1dGVzIGlmIGl0IHJldHVybnMgbnVsbCwKKyAgICAgKiB0aGUgYXNzdW1wdGlvbiBiZWluZyB0aGF0IGlmIGl0IGlzIG5vbi1udWxsIHRob3NlIGFyZSB0aGUgc2FtZSBhcmd1bWVudHMKKyAgICAgKiBmcm9tIHRoZSBmaXJzdCB0aW1lIHRoZSBmcmFnbWVudCB3YXMgaW5mbGF0ZWQuICAoVGhhdCBzYWlkLCB5b3UgbWF5IHdhbnQKKyAgICAgKiB0byBoYXZlIGxheW91dHMgY2hhbmdlIGZvciBkaWZmZXJlbnQgY29uZmlndXJhdGlvbnMgc3VjaCBhcyBsYW5kc2NhcGUKKyAgICAgKiBhbmQgcG9ydHJhaXQsIHdoaWNoIGNhbiBoYXZlIGRpZmZlcmVudCBhdHRyaWJ1dGVzLiAgSWYgc28sIHlvdSB3aWxsIG5lZWQKKyAgICAgKiB0byByZS1wYXJzZSB0aGUgYXR0cmlidXRlcyBlYWNoIHRpbWUgdGhpcyBpcyBjYWxsZWQgdG8gZ2VuZXJhdGUgbmV3CisgICAgICogYXJndW1lbnRzLik8L3A+CisgICAgICogCisgICAgICogQHBhcmFtIGF0dHJzIFRoZSBhdHRyaWJ1dGVzIGF0IHRoZSB0YWcgd2hlcmUgdGhlIGZyYWdtZW50IGlzCisgICAgICogYmVpbmcgY3JlYXRlZC4KKyAgICAgKiBAcGFyYW0gc2F2ZWRJbnN0YW5jZVN0YXRlIElmIHRoZSBmcmFnbWVudCBpcyBiZWluZyByZS1jcmVhdGVkIGZyb20KKyAgICAgKiBhIHByZXZpb3VzIHNhdmVkIHN0YXRlLCB0aGlzIGlzIHRoZSBzdGF0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvbkluZmxhdGUoQXR0cmlidXRlU2V0IGF0dHJzLCBCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIG1DYWxsZWQgPSB0cnVlOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgd2hlbiBhIGZyYWdtZW50IGlzIGZpcnN0IGF0dGFjaGVkIHRvIGl0cyBhY3Rpdml0eS4KKyAgICAgKiB7QGxpbmsgI29uQ3JlYXRlKEJ1bmRsZSl9IHdpbGwgYmUgY2FsbGVkIGFmdGVyIHRoaXMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25BdHRhY2goQWN0aXZpdHkgYWN0aXZpdHkpIHsKKyAgICAgICAgbUNhbGxlZCA9IHRydWU7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIENhbGxlZCB3aGVuIGEgZnJhZ21lbnQgbG9hZHMgYW4gYW5pbWF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBBbmltYXRhYmxlIG9uQ3JlYXRlQW5pbWF0YWJsZShpbnQgdHJhbnNpdCwgYm9vbGVhbiBlbnRlciwgaW50IG5leHRBbmltKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgdG8gZG8gaW5pdGlhbCBjcmVhdGlvbiBvZiBhIGZyYWdtZW50LiAgVGhpcyBpcyBjYWxsZWQgYWZ0ZXIKKyAgICAgKiB7QGxpbmsgI29uQXR0YWNoKEFjdGl2aXR5KX0gYW5kIGJlZm9yZQorICAgICAqIHtAbGluayAjb25DcmVhdGVWaWV3KExheW91dEluZmxhdGVyLCBWaWV3R3JvdXAsIEJ1bmRsZSl9LgorICAgICAqIAorICAgICAqIDxwPk5vdGUgdGhhdCB0aGlzIGNhbiBiZSBjYWxsZWQgd2hpbGUgdGhlIGZyYWdtZW50J3MgYWN0aXZpdHkgaXMKKyAgICAgKiBzdGlsbCBpbiB0aGUgcHJvY2VzcyBvZiBiZWluZyBjcmVhdGVkLiAgQXMgc3VjaCwgeW91IGNhbiBub3QgcmVseQorICAgICAqIG9uIHRoaW5ncyBsaWtlIHRoZSBhY3Rpdml0eSdzIGNvbnRlbnQgdmlldyBoaWVyYXJjaHkgYmVpbmcgaW5pdGlhbGl6ZWQKKyAgICAgKiBhdCB0aGlzIHBvaW50LiAgSWYgeW91IHdhbnQgdG8gZG8gd29yayBvbmNlIHRoZSBhY3Rpdml0eSBpdHNlbGYgaXMKKyAgICAgKiBjcmVhdGVkLCBzZWUge0BsaW5rICNvbkFjdGl2aXR5Q3JlYXRlZChCdW5kbGUpfS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gc2F2ZWRJbnN0YW5jZVN0YXRlIElmIHRoZSBmcmFnbWVudCBpcyBiZWluZyByZS1jcmVhdGVkIGZyb20KKyAgICAgKiBhIHByZXZpb3VzIHNhdmVkIHN0YXRlLCB0aGlzIGlzIHRoZSBzdGF0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIG1DYWxsZWQgPSB0cnVlOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgdG8gaGF2ZSB0aGUgZnJhZ21lbnQgaW5zdGFudGlhdGUgaXRzIHVzZXIgaW50ZXJmYWNlIHZpZXcuCisgICAgICogVGhpcyBpcyBvcHRpb25hbCwgYW5kIG5vbi1ncmFwaGljYWwgZnJhZ21lbnRzIGNhbiByZXR1cm4gbnVsbCAod2hpY2gKKyAgICAgKiBpcyB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbikuICBUaGlzIHdpbGwgYmUgY2FsbGVkIGJldHdlZW4KKyAgICAgKiB7QGxpbmsgI29uQ3JlYXRlKEJ1bmRsZSl9IGFuZCB7QGxpbmsgI29uQWN0aXZpdHlDcmVhdGVkKEJ1bmRsZSl9LgorICAgICAqIAorICAgICAqIDxwPklmIHlvdSByZXR1cm4gYSBWaWV3IGZyb20gaGVyZSwgeW91IHdpbGwgbGF0ZXIgYmUgY2FsbGVkIGluCisgICAgICoge0BsaW5rICNvbkRlc3Ryb3lWaWV3fSB3aGVuIHRoZSB2aWV3IGlzIGJlaW5nIHJlbGVhc2VkLgorICAgICAqIAorICAgICAqIEBwYXJhbSBpbmZsYXRlciBUaGUgTGF5b3V0SW5mbGF0ZXIgb2JqZWN0IHRoYXQgY2FuIGJlIHVzZWQgdG8gaW5mbGF0ZQorICAgICAqIGFueSB2aWV3cyBpbiB0aGUgZnJhZ21lbnQsCisgICAgICogQHBhcmFtIGNvbnRhaW5lciBJZiBub24tbnVsbCwgdGhpcyBpcyB0aGUgcGFyZW50IHZpZXcgdGhhdCB0aGUgZnJhZ21lbnQncworICAgICAqIFVJIHNob3VsZCBiZSBhdHRhY2hlZCB0by4gIFRoZSBmcmFnbWVudCBzaG91bGQgbm90IGFkZCB0aGUgdmlldyBpdHNlbGYsCisgICAgICogYnV0IHRoaXMgY2FuIGJlIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIExheW91dFBhcmFtcyBvZiB0aGUgdmlldy4KKyAgICAgKiBAcGFyYW0gc2F2ZWRJbnN0YW5jZVN0YXRlIElmIG5vbi1udWxsLCB0aGlzIGZyYWdtZW50IGlzIGJlaW5nIHJlLWNvbnN0cnVjdGVkCisgICAgICogZnJvbSBhIHByZXZpb3VzIHNhdmVkIHN0YXRlIGFzIGdpdmVuIGhlcmUuCisgICAgICogCisgICAgICogQHJldHVybiBSZXR1cm4gdGhlIFZpZXcgZm9yIHRoZSBmcmFnbWVudCdzIFVJLCBvciBudWxsLgorICAgICAqLworICAgIHB1YmxpYyBWaWV3IG9uQ3JlYXRlVmlldyhMYXlvdXRJbmZsYXRlciBpbmZsYXRlciwgVmlld0dyb3VwIGNvbnRhaW5lciwKKyAgICAgICAgICAgIEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBWaWV3IGdldFZpZXcoKSB7CisgICAgICAgIHJldHVybiBtVmlldzsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQ2FsbGVkIHdoZW4gdGhlIGZyYWdtZW50J3MgYWN0aXZpdHkgaGFzIGJlZW4gY3JlYXRlZCBhbmQgdGhpcworICAgICAqIGZyYWdtZW50J3MgdmlldyBoaWVyYXJjaHkgaW5zdGFudGlhdGVkLiAgSXQgY2FuIGJlIHVzZWQgdG8gZG8gZmluYWwKKyAgICAgKiBpbml0aWFsaXphdGlvbiBvbmNlIHRoZXNlIHBpZWNlcyBhcmUgaW4gcGxhY2UsIHN1Y2ggYXMgcmV0cmlldmluZworICAgICAqIHZpZXdzIG9yIHJlc3RvcmluZyBzdGF0ZS4gIEl0IGlzIGFsc28gdXNlZnVsIGZvciBmcmFnbWVudHMgdGhhdCB1c2UKKyAgICAgKiB7QGxpbmsgI3NldFJldGFpbkluc3RhbmNlKGJvb2xlYW4pfSB0byByZXRhaW4gdGhlaXIgaW5zdGFuY2UsCisgICAgICogYXMgdGhpcyBjYWxsYmFjayB0ZWxscyB0aGUgZnJhZ21lbnQgd2hlbiBpdCBpcyBmdWxseSBhc3NvY2lhdGVkIHdpdGgKKyAgICAgKiB0aGUgbmV3IGFjdGl2aXR5IGluc3RhbmNlLiAgVGhpcyBpcyBjYWxsZWQgYWZ0ZXIge0BsaW5rICNvbkNyZWF0ZVZpZXd9CisgICAgICogYW5kIGJlZm9yZSB7QGxpbmsgI29uU3RhcnQoKX0uCisgICAgICogCisgICAgICogQHBhcmFtIHNhdmVkSW5zdGFuY2VTdGF0ZSBJZiB0aGUgZnJhZ21lbnQgaXMgYmVpbmcgcmUtY3JlYXRlZCBmcm9tCisgICAgICogYSBwcmV2aW91cyBzYXZlZCBzdGF0ZSwgdGhpcyBpcyB0aGUgc3RhdGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25BY3Rpdml0eUNyZWF0ZWQoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBtQ2FsbGVkID0gdHJ1ZTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQ2FsbGVkIHdoZW4gdGhlIEZyYWdtZW50IGlzIHZpc2libGUgdG8gdGhlIHVzZXIuICBUaGlzIGlzIGdlbmVyYWxseQorICAgICAqIHRpZWQgdG8ge0BsaW5rIEFjdGl2aXR5I29uU3RhcnQoKSBBY3Rpdml0eS5vblN0YXJ0fSBvZiB0aGUgY29udGFpbmluZworICAgICAqIEFjdGl2aXR5J3MgbGlmZWN5Y2xlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uU3RhcnQoKSB7CisgICAgICAgIG1DYWxsZWQgPSB0cnVlOworICAgICAgICBtU3RhcnRlZCA9IHRydWU7CisgICAgICAgIGlmICghbUNoZWNrZWRGb3JMb2FkZXJNYW5hZ2VyKSB7CisgICAgICAgICAgICBtQ2hlY2tlZEZvckxvYWRlck1hbmFnZXIgPSB0cnVlOworICAgICAgICAgICAgbUxvYWRlck1hbmFnZXIgPSBtQWN0aXZpdHkuZ2V0TG9hZGVyTWFuYWdlcihtSW5kZXgsIG1TdGFydGVkLCBmYWxzZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1Mb2FkZXJNYW5hZ2VyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1Mb2FkZXJNYW5hZ2VyLmRvU3RhcnQoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgd2hlbiB0aGUgZnJhZ21lbnQgaXMgdmlzaWJsZSB0byB0aGUgdXNlciBhbmQgYWN0aXZlbHkgcnVubmluZy4KKyAgICAgKiBUaGlzIGlzIGdlbmVyYWxseQorICAgICAqIHRpZWQgdG8ge0BsaW5rIEFjdGl2aXR5I29uUmVzdW1lKCkgQWN0aXZpdHkub25SZXN1bWV9IG9mIHRoZSBjb250YWluaW5nCisgICAgICogQWN0aXZpdHkncyBsaWZlY3ljbGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25SZXN1bWUoKSB7CisgICAgICAgIG1DYWxsZWQgPSB0cnVlOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgdG8gYXNrIHRoZSBmcmFnbWVudCB0byBzYXZlIGl0cyBjdXJyZW50IGR5bmFtaWMgc3RhdGUsIHNvIGl0CisgICAgICogY2FuIGxhdGVyIGJlIHJlY29uc3RydWN0ZWQgaW4gYSBuZXcgaW5zdGFuY2Ugb2YgaXRzIHByb2Nlc3MgaXMKKyAgICAgKiByZXN0YXJ0ZWQuICBJZiBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgZnJhZ21lbnQgbGF0ZXIgbmVlZHMgdG8gYmUKKyAgICAgKiBjcmVhdGVkLCB0aGUgZGF0YSB5b3UgcGxhY2UgaW4gdGhlIEJ1bmRsZSBoZXJlIHdpbGwgYmUgYXZhaWxhYmxlCisgICAgICogaW4gdGhlIEJ1bmRsZSBnaXZlbiB0byB7QGxpbmsgI29uQ3JlYXRlKEJ1bmRsZSl9LAorICAgICAqIHtAbGluayAjb25DcmVhdGVWaWV3KExheW91dEluZmxhdGVyLCBWaWV3R3JvdXAsIEJ1bmRsZSl9LCBhbmQKKyAgICAgKiB7QGxpbmsgI29uQWN0aXZpdHlDcmVhdGVkKEJ1bmRsZSl9LgorICAgICAqCisgICAgICogPHA+VGhpcyBjb3JyZXNwb25kcyB0byB7QGxpbmsgQWN0aXZpdHkjb25TYXZlSW5zdGFuY2VTdGF0ZShCdW5kbGUpCisgICAgICogQWN0aXZpdHkub25uU2F2ZUluc3RhbmNlU3RhdGUoQnVuZGxlKX0gYW5kIG1vc3Qgb2YgdGhlIGRpc2N1c3Npb24gdGhlcmUKKyAgICAgKiBhcHBsaWVzIGhlcmUgYXMgd2VsbC4gIE5vdGUgaG93ZXZlcjogPGVtPnRoaXMgbWV0aG9kIG1heSBiZSBjYWxsZWQKKyAgICAgKiBhdCBhbnkgdGltZSBiZWZvcmUge0BsaW5rICNvbkRlc3Ryb3koKX08L2VtPi4gIFRoZXJlIGFyZSBtYW55IHNpdHVhdGlvbnMKKyAgICAgKiB3aGVyZSBhIGZyYWdtZW50IG1heSBiZSBtb3N0bHkgdG9ybiBkb3duIChzdWNoIGFzIHdoZW4gcGxhY2VkIG9uIHRoZQorICAgICAqIGJhY2sgc3RhY2sgd2l0aCBubyBVSSBzaG93aW5nKSwgYnV0IGl0cyBzdGF0ZSB3aWxsIG5vdCBiZSBzYXZlZCB1bnRpbAorICAgICAqIGl0cyBvd25pbmcgYWN0aXZpdHkgYWN0dWFsbHkgbmVlZHMgdG8gc2F2ZSBpdHMgc3RhdGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gb3V0U3RhdGUgQnVuZGxlIGluIHdoaWNoIHRvIHBsYWNlIHlvdXIgc2F2ZWQgc3RhdGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25TYXZlSW5zdGFuY2VTdGF0ZShCdW5kbGUgb3V0U3RhdGUpIHsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgb25Db25maWd1cmF0aW9uQ2hhbmdlZChDb25maWd1cmF0aW9uIG5ld0NvbmZpZykgeworICAgICAgICBtQ2FsbGVkID0gdHJ1ZTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQ2FsbGVkIHdoZW4gdGhlIEZyYWdtZW50IGlzIG5vIGxvbmdlciByZXN1bWVkLiAgVGhpcyBpcyBnZW5lcmFsbHkKKyAgICAgKiB0aWVkIHRvIHtAbGluayBBY3Rpdml0eSNvblBhdXNlKCkgQWN0aXZpdHkub25QYXVzZX0gb2YgdGhlIGNvbnRhaW5pbmcKKyAgICAgKiBBY3Rpdml0eSdzIGxpZmVjeWNsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvblBhdXNlKCkgeworICAgICAgICBtQ2FsbGVkID0gdHJ1ZTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQ2FsbGVkIHdoZW4gdGhlIEZyYWdtZW50IGlzIG5vIGxvbmdlciBzdGFydGVkLiAgVGhpcyBpcyBnZW5lcmFsbHkKKyAgICAgKiB0aWVkIHRvIHtAbGluayBBY3Rpdml0eSNvblN0b3AoKSBBY3Rpdml0eS5vblN0b3B9IG9mIHRoZSBjb250YWluaW5nCisgICAgICogQWN0aXZpdHkncyBsaWZlY3ljbGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25TdG9wKCkgeworICAgICAgICBtQ2FsbGVkID0gdHJ1ZTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgb25Mb3dNZW1vcnkoKSB7CisgICAgICAgIG1DYWxsZWQgPSB0cnVlOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgd2hlbiB0aGUgdmlldyBwcmV2aW91c2x5IGNyZWF0ZWQgYnkge0BsaW5rICNvbkNyZWF0ZVZpZXd9IGhhcworICAgICAqIGJlZW4gZGV0YWNoZWQgZnJvbSB0aGUgZnJhZ21lbnQuICBUaGUgbmV4dCB0aW1lIHRoZSBmcmFnbWVudCBuZWVkcworICAgICAqIHRvIGJlIGRpc3BsYXllZCwgYSBuZXcgdmlldyB3aWxsIGJlIGNyZWF0ZWQuICBUaGlzIGlzIGNhbGxlZAorICAgICAqIGFmdGVyIHtAbGluayAjb25TdG9wKCl9IGFuZCBiZWZvcmUge0BsaW5rICNvbkRlc3Ryb3koKX0uICBJdCBpcyBjYWxsZWQKKyAgICAgKiA8ZW0+cmVnYXJkbGVzczwvZW0+IG9mIHdoZXRoZXIge0BsaW5rICNvbkNyZWF0ZVZpZXd9IHJldHVybmVkIGEKKyAgICAgKiBub24tbnVsbCB2aWV3LiAgSW50ZXJuYWxseSBpdCBpcyBjYWxsZWQgYWZ0ZXIgdGhlIHZpZXcncyBzdGF0ZSBoYXMKKyAgICAgKiBiZWVuIHNhdmVkIGJ1dCBiZWZvcmUgaXQgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIGl0cyBwYXJlbnQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25EZXN0cm95VmlldygpIHsKKyAgICAgICAgbUNhbGxlZCA9IHRydWU7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIENhbGxlZCB3aGVuIHRoZSBmcmFnbWVudCBpcyBubyBsb25nZXIgaW4gdXNlLiAgVGhpcyBpcyBjYWxsZWQKKyAgICAgKiBhZnRlciB7QGxpbmsgI29uU3RvcCgpfSBhbmQgYmVmb3JlIHtAbGluayAjb25EZXRhY2goKX0uCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25EZXN0cm95KCkgeworICAgICAgICBtQ2FsbGVkID0gdHJ1ZTsKKyAgICAgICAgLy9Mb2cudigiZm9vIiwgIm9uRGVzdHJveTogbUNoZWNrZWRGb3JMb2FkZXJNYW5hZ2VyPSIgKyBtQ2hlY2tlZEZvckxvYWRlck1hbmFnZXIKKyAgICAgICAgLy8gICAgICAgICsgIiBtTG9hZGVyTWFuYWdlcj0iICsgbUxvYWRlck1hbmFnZXIpOworICAgICAgICBpZiAoIW1DaGVja2VkRm9yTG9hZGVyTWFuYWdlcikgeworICAgICAgICAgICAgbUNoZWNrZWRGb3JMb2FkZXJNYW5hZ2VyID0gdHJ1ZTsKKyAgICAgICAgICAgIG1Mb2FkZXJNYW5hZ2VyID0gbUFjdGl2aXR5LmdldExvYWRlck1hbmFnZXIobUluZGV4LCBtU3RhcnRlZCwgZmFsc2UpOworICAgICAgICB9CisgICAgICAgIGlmIChtTG9hZGVyTWFuYWdlciAhPSBudWxsKSB7CisgICAgICAgICAgICBtTG9hZGVyTWFuYWdlci5kb0Rlc3Ryb3koKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxlZCB3aGVuIHRoZSBmcmFnbWVudCBpcyBubyBsb25nZXIgYXR0YWNoZWQgdG8gaXRzIGFjdGl2aXR5LiAgVGhpcworICAgICAqIGlzIGNhbGxlZCBhZnRlciB7QGxpbmsgI29uRGVzdHJveSgpfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvbkRldGFjaCgpIHsKKyAgICAgICAgbUNhbGxlZCA9IHRydWU7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEluaXRpYWxpemUgdGhlIGNvbnRlbnRzIG9mIHRoZSBBY3Rpdml0eSdzIHN0YW5kYXJkIG9wdGlvbnMgbWVudS4gIFlvdQorICAgICAqIHNob3VsZCBwbGFjZSB5b3VyIG1lbnUgaXRlbXMgaW4gdG8gPHZhcj5tZW51PC92YXI+LiAgRm9yIHRoaXMgbWV0aG9kCisgICAgICogdG8gYmUgY2FsbGVkLCB5b3UgbXVzdCBoYXZlIGZpcnN0IGNhbGxlZCB7QGxpbmsgI3NldEhhc09wdGlvbnNNZW51fS4gIFNlZQorICAgICAqIHtAbGluayBBY3Rpdml0eSNvbkNyZWF0ZU9wdGlvbnNNZW51KE1lbnUpIEFjdGl2aXR5Lm9uQ3JlYXRlT3B0aW9uc01lbnV9CisgICAgICogZm9yIG1vcmUgaW5mb3JtYXRpb24uCisgICAgICogCisgICAgICogQHBhcmFtIG1lbnUgVGhlIG9wdGlvbnMgbWVudSBpbiB3aGljaCB5b3UgcGxhY2UgeW91ciBpdGVtcy4KKyAgICAgKiAKKyAgICAgKiBAc2VlICNzZXRIYXNPcHRpb25zTWVudQorICAgICAqIEBzZWUgI29uUHJlcGFyZU9wdGlvbnNNZW51CisgICAgICogQHNlZSAjb25PcHRpb25zSXRlbVNlbGVjdGVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25DcmVhdGVPcHRpb25zTWVudShNZW51IG1lbnUsIE1lbnVJbmZsYXRlciBpbmZsYXRlcikgeworICAgIH0KKworICAgIC8qKgorICAgICAqIFByZXBhcmUgdGhlIFNjcmVlbidzIHN0YW5kYXJkIG9wdGlvbnMgbWVudSB0byBiZSBkaXNwbGF5ZWQuICBUaGlzIGlzCisgICAgICogY2FsbGVkIHJpZ2h0IGJlZm9yZSB0aGUgbWVudSBpcyBzaG93biwgZXZlcnkgdGltZSBpdCBpcyBzaG93bi4gIFlvdSBjYW4KKyAgICAgKiB1c2UgdGhpcyBtZXRob2QgdG8gZWZmaWNpZW50bHkgZW5hYmxlL2Rpc2FibGUgaXRlbXMgb3Igb3RoZXJ3aXNlCisgICAgICogZHluYW1pY2FsbHkgbW9kaWZ5IHRoZSBjb250ZW50cy4gIFNlZQorICAgICAqIHtAbGluayBBY3Rpdml0eSNvblByZXBhcmVPcHRpb25zTWVudShNZW51KSBBY3Rpdml0eS5vblByZXBhcmVPcHRpb25zTWVudX0KKyAgICAgKiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbWVudSBUaGUgb3B0aW9ucyBtZW51IGFzIGxhc3Qgc2hvd24gb3IgZmlyc3QgaW5pdGlhbGl6ZWQgYnkKKyAgICAgKiAgICAgICAgICAgICBvbkNyZWF0ZU9wdGlvbnNNZW51KCkuCisgICAgICogCisgICAgICogQHNlZSAjc2V0SGFzT3B0aW9uc01lbnUKKyAgICAgKiBAc2VlICNvbkNyZWF0ZU9wdGlvbnNNZW51CisgICAgICovCisgICAgcHVibGljIHZvaWQgb25QcmVwYXJlT3B0aW9uc01lbnUoTWVudSBtZW51KSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBob29rIGlzIGNhbGxlZCB3aGVuZXZlciBhbiBpdGVtIGluIHlvdXIgb3B0aW9ucyBtZW51IGlzIHNlbGVjdGVkLgorICAgICAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHNpbXBseSByZXR1cm5zIGZhbHNlIHRvIGhhdmUgdGhlIG5vcm1hbAorICAgICAqIHByb2Nlc3NpbmcgaGFwcGVuIChjYWxsaW5nIHRoZSBpdGVtJ3MgUnVubmFibGUgb3Igc2VuZGluZyBhIG1lc3NhZ2UgdG8KKyAgICAgKiBpdHMgSGFuZGxlciBhcyBhcHByb3ByaWF0ZSkuICBZb3UgY2FuIHVzZSB0aGlzIG1ldGhvZCBmb3IgYW55IGl0ZW1zCisgICAgICogZm9yIHdoaWNoIHlvdSB3b3VsZCBsaWtlIHRvIGRvIHByb2Nlc3Npbmcgd2l0aG91dCB0aG9zZSBvdGhlcgorICAgICAqIGZhY2lsaXRpZXMuCisgICAgICogCisgICAgICogPHA+RGVyaXZlZCBjbGFzc2VzIHNob3VsZCBjYWxsIHRocm91Z2ggdG8gdGhlIGJhc2UgY2xhc3MgZm9yIGl0IHRvCisgICAgICogcGVyZm9ybSB0aGUgZGVmYXVsdCBtZW51IGhhbmRsaW5nLgorICAgICAqIAorICAgICAqIEBwYXJhbSBpdGVtIFRoZSBtZW51IGl0ZW0gdGhhdCB3YXMgc2VsZWN0ZWQuCisgICAgICogCisgICAgICogQHJldHVybiBib29sZWFuIFJldHVybiBmYWxzZSB0byBhbGxvdyBub3JtYWwgbWVudSBwcm9jZXNzaW5nIHRvCisgICAgICogICAgICAgICBwcm9jZWVkLCB0cnVlIHRvIGNvbnN1bWUgaXQgaGVyZS4KKyAgICAgKiAKKyAgICAgKiBAc2VlICNvbkNyZWF0ZU9wdGlvbnNNZW51CisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gb25PcHRpb25zSXRlbVNlbGVjdGVkKE1lbnVJdGVtIGl0ZW0pIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgaG9vayBpcyBjYWxsZWQgd2hlbmV2ZXIgdGhlIG9wdGlvbnMgbWVudSBpcyBiZWluZyBjbG9zZWQgKGVpdGhlciBieSB0aGUgdXNlciBjYW5jZWxpbmcKKyAgICAgKiB0aGUgbWVudSB3aXRoIHRoZSBiYWNrL21lbnUgYnV0dG9uLCBvciB3aGVuIGFuIGl0ZW0gaXMgc2VsZWN0ZWQpLgorICAgICAqICAKKyAgICAgKiBAcGFyYW0gbWVudSBUaGUgb3B0aW9ucyBtZW51IGFzIGxhc3Qgc2hvd24gb3IgZmlyc3QgaW5pdGlhbGl6ZWQgYnkKKyAgICAgKiAgICAgICAgICAgICBvbkNyZWF0ZU9wdGlvbnNNZW51KCkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25PcHRpb25zTWVudUNsb3NlZChNZW51IG1lbnUpIHsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQ2FsbGVkIHdoZW4gYSBjb250ZXh0IG1lbnUgZm9yIHRoZSB7QGNvZGUgdmlld30gaXMgYWJvdXQgdG8gYmUgc2hvd24uCisgICAgICogVW5saWtlIHtAbGluayAjb25DcmVhdGVPcHRpb25zTWVudX0sIHRoaXMgd2lsbCBiZSBjYWxsZWQgZXZlcnkKKyAgICAgKiB0aW1lIHRoZSBjb250ZXh0IG1lbnUgaXMgYWJvdXQgdG8gYmUgc2hvd24gYW5kIHNob3VsZCBiZSBwb3B1bGF0ZWQgZm9yCisgICAgICogdGhlIHZpZXcgKG9yIGl0ZW0gaW5zaWRlIHRoZSB2aWV3IGZvciB7QGxpbmsgQWRhcHRlclZpZXd9IHN1YmNsYXNzZXMsCisgICAgICogdGhpcyBjYW4gYmUgZm91bmQgaW4gdGhlIHtAY29kZSBtZW51SW5mb30pKS4KKyAgICAgKiA8cD4KKyAgICAgKiBVc2Uge0BsaW5rICNvbkNvbnRleHRJdGVtU2VsZWN0ZWQoYW5kcm9pZC52aWV3Lk1lbnVJdGVtKX0gdG8ga25vdyB3aGVuIGFuCisgICAgICogaXRlbSBoYXMgYmVlbiBzZWxlY3RlZC4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBjYWxscyB1cCB0bworICAgICAqIHtAbGluayBBY3Rpdml0eSNvbkNyZWF0ZUNvbnRleHRNZW51IEFjdGl2aXR5Lm9uQ3JlYXRlQ29udGV4dE1lbnV9LCB0aG91Z2gKKyAgICAgKiB5b3UgY2FuIG5vdCBjYWxsIHRoaXMgaW1wbGVtZW50YXRpb24gaWYgeW91IGRvbid0IHdhbnQgdGhhdCBiZWhhdmlvci4KKyAgICAgKiA8cD4KKyAgICAgKiBJdCBpcyBub3Qgc2FmZSB0byBob2xkIG9udG8gdGhlIGNvbnRleHQgbWVudSBhZnRlciB0aGlzIG1ldGhvZCByZXR1cm5zLgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZUNvbnRleHRNZW51KENvbnRleHRNZW51IG1lbnUsIFZpZXcgdiwgQ29udGV4dE1lbnVJbmZvIG1lbnVJbmZvKSB7CisgICAgICAgIGdldEFjdGl2aXR5KCkub25DcmVhdGVDb250ZXh0TWVudShtZW51LCB2LCBtZW51SW5mbyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVnaXN0ZXJzIGEgY29udGV4dCBtZW51IHRvIGJlIHNob3duIGZvciB0aGUgZ2l2ZW4gdmlldyAobXVsdGlwbGUgdmlld3MKKyAgICAgKiBjYW4gc2hvdyB0aGUgY29udGV4dCBtZW51KS4gVGhpcyBtZXRob2Qgd2lsbCBzZXQgdGhlCisgICAgICoge0BsaW5rIE9uQ3JlYXRlQ29udGV4dE1lbnVMaXN0ZW5lcn0gb24gdGhlIHZpZXcgdG8gdGhpcyBmcmFnbWVudCwgc28KKyAgICAgKiB7QGxpbmsgI29uQ3JlYXRlQ29udGV4dE1lbnUoQ29udGV4dE1lbnUsIFZpZXcsIENvbnRleHRNZW51SW5mbyl9IHdpbGwgYmUKKyAgICAgKiBjYWxsZWQgd2hlbiBpdCBpcyB0aW1lIHRvIHNob3cgdGhlIGNvbnRleHQgbWVudS4KKyAgICAgKiAKKyAgICAgKiBAc2VlICN1bnJlZ2lzdGVyRm9yQ29udGV4dE1lbnUoVmlldykKKyAgICAgKiBAcGFyYW0gdmlldyBUaGUgdmlldyB0aGF0IHNob3VsZCBzaG93IGEgY29udGV4dCBtZW51LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyRm9yQ29udGV4dE1lbnUoVmlldyB2aWV3KSB7CisgICAgICAgIHZpZXcuc2V0T25DcmVhdGVDb250ZXh0TWVudUxpc3RlbmVyKHRoaXMpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBQcmV2ZW50cyBhIGNvbnRleHQgbWVudSB0byBiZSBzaG93biBmb3IgdGhlIGdpdmVuIHZpZXcuIFRoaXMgbWV0aG9kIHdpbGwKKyAgICAgKiByZW1vdmUgdGhlIHtAbGluayBPbkNyZWF0ZUNvbnRleHRNZW51TGlzdGVuZXJ9IG9uIHRoZSB2aWV3LgorICAgICAqIAorICAgICAqIEBzZWUgI3JlZ2lzdGVyRm9yQ29udGV4dE1lbnUoVmlldykKKyAgICAgKiBAcGFyYW0gdmlldyBUaGUgdmlldyB0aGF0IHNob3VsZCBzdG9wIHNob3dpbmcgYSBjb250ZXh0IG1lbnUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdW5yZWdpc3RlckZvckNvbnRleHRNZW51KFZpZXcgdmlldykgeworICAgICAgICB2aWV3LnNldE9uQ3JlYXRlQ29udGV4dE1lbnVMaXN0ZW5lcihudWxsKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogVGhpcyBob29rIGlzIGNhbGxlZCB3aGVuZXZlciBhbiBpdGVtIGluIGEgY29udGV4dCBtZW51IGlzIHNlbGVjdGVkLiBUaGUKKyAgICAgKiBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHNpbXBseSByZXR1cm5zIGZhbHNlIHRvIGhhdmUgdGhlIG5vcm1hbCBwcm9jZXNzaW5nCisgICAgICogaGFwcGVuIChjYWxsaW5nIHRoZSBpdGVtJ3MgUnVubmFibGUgb3Igc2VuZGluZyBhIG1lc3NhZ2UgdG8gaXRzIEhhbmRsZXIKKyAgICAgKiBhcyBhcHByb3ByaWF0ZSkuIFlvdSBjYW4gdXNlIHRoaXMgbWV0aG9kIGZvciBhbnkgaXRlbXMgZm9yIHdoaWNoIHlvdQorICAgICAqIHdvdWxkIGxpa2UgdG8gZG8gcHJvY2Vzc2luZyB3aXRob3V0IHRob3NlIG90aGVyIGZhY2lsaXRpZXMuCisgICAgICogPHA+CisgICAgICogVXNlIHtAbGluayBNZW51SXRlbSNnZXRNZW51SW5mbygpfSB0byBnZXQgZXh0cmEgaW5mb3JtYXRpb24gc2V0IGJ5IHRoZQorICAgICAqIFZpZXcgdGhhdCBhZGRlZCB0aGlzIG1lbnUgaXRlbS4KKyAgICAgKiA8cD4KKyAgICAgKiBEZXJpdmVkIGNsYXNzZXMgc2hvdWxkIGNhbGwgdGhyb3VnaCB0byB0aGUgYmFzZSBjbGFzcyBmb3IgaXQgdG8gcGVyZm9ybQorICAgICAqIHRoZSBkZWZhdWx0IG1lbnUgaGFuZGxpbmcuCisgICAgICogCisgICAgICogQHBhcmFtIGl0ZW0gVGhlIGNvbnRleHQgbWVudSBpdGVtIHRoYXQgd2FzIHNlbGVjdGVkLgorICAgICAqIEByZXR1cm4gYm9vbGVhbiBSZXR1cm4gZmFsc2UgdG8gYWxsb3cgbm9ybWFsIGNvbnRleHQgbWVudSBwcm9jZXNzaW5nIHRvCisgICAgICogICAgICAgICBwcm9jZWVkLCB0cnVlIHRvIGNvbnN1bWUgaXQgaGVyZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBvbkNvbnRleHRJdGVtU2VsZWN0ZWQoTWVudUl0ZW0gaXRlbSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIAorICAgIHZvaWQgcGVyZm9ybVN0b3AoKSB7CisgICAgICAgIG9uU3RvcCgpOworICAgICAgICBpZiAobVN0YXJ0ZWQpIHsKKyAgICAgICAgICAgIG1TdGFydGVkID0gZmFsc2U7CisgICAgICAgICAgICBpZiAoIW1DaGVja2VkRm9yTG9hZGVyTWFuYWdlcikgeworICAgICAgICAgICAgICAgIG1DaGVja2VkRm9yTG9hZGVyTWFuYWdlciA9IHRydWU7CisgICAgICAgICAgICAgICAgbUxvYWRlck1hbmFnZXIgPSBtQWN0aXZpdHkuZ2V0TG9hZGVyTWFuYWdlcihtSW5kZXgsIG1TdGFydGVkLCBmYWxzZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobUxvYWRlck1hbmFnZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChtQWN0aXZpdHkgPT0gbnVsbCB8fCAhbUFjdGl2aXR5Lm1DaGFuZ2luZ0NvbmZpZ3VyYXRpb25zKSB7CisgICAgICAgICAgICAgICAgICAgIG1Mb2FkZXJNYW5hZ2VyLmRvU3RvcCgpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1Mb2FkZXJNYW5hZ2VyLmRvUmV0YWluKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0ZyYWdtZW50TWFuYWdlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0ZyYWdtZW50TWFuYWdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2MzIzM2UKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvRnJhZ21lbnRNYW5hZ2VyLmphdmEKQEAgLTAsMCArMSwxMjAxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmFwcDsKKworaW1wb3J0IGFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdGFibGU7CitpbXBvcnQgYW5kcm9pZC5hbmltYXRpb24uQW5pbWF0YWJsZUluZmxhdGVyOworaW1wb3J0IGFuZHJvaWQuYW5pbWF0aW9uLlByb3BlcnR5QW5pbWF0b3I7CitpbXBvcnQgYW5kcm9pZC5hbmltYXRpb24uU2VxdWVuY2VyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxhYmxlOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC51dGlsLlNwYXJzZUFycmF5OworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51OworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SW5mbGF0ZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnVJdGVtOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCisvKioKKyAqIEludGVyZmFjZSBmb3IgaW50ZXJhY3Rpbmcgd2l0aCB7QGxpbmsgRnJhZ21lbnR9IG9iamVjdHMgaW5zaWRlIG9mIGFuCisgKiB7QGxpbmsgQWN0aXZpdHl9CisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgRnJhZ21lbnRNYW5hZ2VyIHsKKyAgICAvKioKKyAgICAgKiBTdGFydCBhIHNlcmllcyBvZiBlZGl0IG9wZXJhdGlvbnMgb24gdGhlIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGgKKyAgICAgKiB0aGlzIEZyYWdtZW50TWFuYWdlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgRnJhZ21lbnRUcmFuc2FjdGlvbiBvcGVuVHJhbnNhY3Rpb24oKTsKKworICAgIC8qKgorICAgICAqIEZpbmRzIGEgZnJhZ21lbnQgdGhhdCB3YXMgaWRlbnRpZmllZCBieSB0aGUgZ2l2ZW4gaWQgZWl0aGVyIHdoZW4gaW5mbGF0ZWQKKyAgICAgKiBmcm9tIFhNTCBvciBhcyB0aGUgY29udGFpbmVyIElEIHdoZW4gYWRkZWQgaW4gYSB0cmFuc2FjdGlvbi4gIFRoaXMgZmlyc3QKKyAgICAgKiBzZWFyY2hlcyB0aHJvdWdoIGZyYWdtZW50cyB0aGF0IGFyZSBjdXJyZW50bHkgYWRkZWQgdG8gdGhlIG1hbmFnZXIncworICAgICAqIGFjdGl2aXR5OyBpZiBubyBzdWNoIGZyYWdtZW50IGlzIGZvdW5kLCB0aGVuIGFsbCBmcmFnbWVudHMgY3VycmVudGx5CisgICAgICogb24gdGhlIGJhY2sgc3RhY2sgYXNzb2NpYXRlZCB3aXRoIHRoaXMgSUQgYXJlIHNlYXJjaGVkLgorICAgICAqIEByZXR1cm4gVGhlIGZyYWdtZW50IGlmIGZvdW5kIG9yIG51bGwgb3RoZXJ3aXNlLgorICAgICAqLworICAgIHB1YmxpYyBGcmFnbWVudCBmaW5kRnJhZ21lbnRCeUlkKGludCBpZCk7CisKKyAgICAvKioKKyAgICAgKiBGaW5kcyBhIGZyYWdtZW50IHRoYXQgd2FzIGlkZW50aWZpZWQgYnkgdGhlIGdpdmVuIHRhZyBlaXRoZXIgd2hlbiBpbmZsYXRlZAorICAgICAqIGZyb20gWE1MIG9yIGFzIHN1cHBsaWVkIHdoZW4gYWRkZWQgaW4gYSB0cmFuc2FjdGlvbi4gIFRoaXMgZmlyc3QKKyAgICAgKiBzZWFyY2hlcyB0aHJvdWdoIGZyYWdtZW50cyB0aGF0IGFyZSBjdXJyZW50bHkgYWRkZWQgdG8gdGhlIG1hbmFnZXIncworICAgICAqIGFjdGl2aXR5OyBpZiBubyBzdWNoIGZyYWdtZW50IGlzIGZvdW5kLCB0aGVuIGFsbCBmcmFnbWVudHMgY3VycmVudGx5CisgICAgICogb24gdGhlIGJhY2sgc3RhY2sgYXJlIHNlYXJjaGVkLgorICAgICAqIEByZXR1cm4gVGhlIGZyYWdtZW50IGlmIGZvdW5kIG9yIG51bGwgb3RoZXJ3aXNlLgorICAgICAqLworICAgIHB1YmxpYyBGcmFnbWVudCBmaW5kRnJhZ21lbnRCeVRhZyhTdHJpbmcgdGFnKTsKKworICAgIC8qKgorICAgICAqIEZsYWcgZm9yIHtAbGluayAjcG9wQmFja1N0YWNrKFN0cmluZywgaW50KX0KKyAgICAgKiBhbmQge0BsaW5rICNwb3BCYWNrU3RhY2soaW50LCBpbnQpfTogSWYgc2V0LCBhbmQgdGhlIG5hbWUgb3IgSUQgb2YKKyAgICAgKiBhIGJhY2sgc3RhY2sgZW50cnkgaGFzIGJlZW4gc3VwcGxpZWQsIHRoZW4gYWxsIG1hdGNoaW5nIGVudHJpZXMgd2lsbAorICAgICAqIGJlIGNvbnN1bWVkIHVudGlsIG9uZSB0aGF0IGRvZXNuJ3QgbWF0Y2ggaXMgZm91bmQgb3IgdGhlIGJvdHRvbSBvZgorICAgICAqIHRoZSBzdGFjayBpcyByZWFjaGVkLiAgT3RoZXJ3aXNlLCBhbGwgZW50cmllcyB1cCB0byBidXQgbm90IGluY2x1ZGluZyB0aGF0IGVudHJ5CisgICAgICogd2lsbCBiZSByZW1vdmVkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBPUF9CQUNLX1NUQUNLX0lOQ0xVU0lWRSA9IDE8PDA7CisKKyAgICAvKioKKyAgICAgKiBQb3AgdGhlIHRvcCBzdGF0ZSBvZmYgdGhlIGJhY2sgc3RhY2suICBSZXR1cm5zIHRydWUgaWYgdGhlcmUgd2FzIG9uZQorICAgICAqIHRvIHBvcCwgZWxzZSBmYWxzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBwb3BCYWNrU3RhY2soKTsKKworICAgIC8qKgorICAgICAqIFBvcCB0aGUgbGFzdCBmcmFnbWVudCB0cmFuc2l0aW9uIGZyb20gdGhlIG1hbmFnZXIncyBmcmFnbWVudAorICAgICAqIGJhY2sgc3RhY2suICBJZiB0aGVyZSBpcyBub3RoaW5nIHRvIHBvcCwgZmFsc2UgaXMgcmV0dXJuZWQuCisgICAgICogQHBhcmFtIG5hbWUgSWYgbm9uLW51bGwsIHRoaXMgaXMgdGhlIG5hbWUgb2YgYSBwcmV2aW91cyBiYWNrIHN0YXRlCisgICAgICogdG8gbG9vayBmb3I7IGlmIGZvdW5kLCBhbGwgc3RhdGVzIHVwIHRvIHRoYXQgc3RhdGUgd2lsbCBiZSBwb3BwZWQuICBUaGUKKyAgICAgKiB7QGxpbmsgI1BPUF9CQUNLX1NUQUNLX0lOQ0xVU0lWRX0gZmxhZyBjYW4gYmUgdXNlZCB0byBjb250cm9sIHdoZXRoZXIKKyAgICAgKiB0aGUgbmFtZWQgc3RhdGUgaXRzZWxmIGlzIHBvcHBlZC4gSWYgbnVsbCwgb25seSB0aGUgdG9wIHN0YXRlIGlzIHBvcHBlZC4KKyAgICAgKiBAcGFyYW0gZmxhZ3MgRWl0aGVyIDAgb3Ige0BsaW5rICNQT1BfQkFDS19TVEFDS19JTkNMVVNJVkV9LgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHBvcEJhY2tTdGFjayhTdHJpbmcgbmFtZSwgaW50IGZsYWdzKTsKKworICAgIC8qKgorICAgICAqIFBvcCBhbGwgYmFjayBzdGFjayBzdGF0ZXMgdXAgdG8gdGhlIG9uZSB3aXRoIHRoZSBnaXZlbiBpZGVudGlmaWVyLgorICAgICAqIEBwYXJhbSBpZCBJZGVudGlmaWVyIG9mIHRoZSBzdGF0ZWQgdG8gYmUgcG9wcGVkLiBJZiBubyBpZGVudGlmaWVyIGV4aXN0cywKKyAgICAgKiBmYWxzZSBpcyByZXR1cm5lZC4KKyAgICAgKiBUaGUgaWRlbnRpZmllciBpcyB0aGUgbnVtYmVyIHJldHVybmVkIGJ5CisgICAgICoge0BsaW5rIEZyYWdtZW50VHJhbnNhY3Rpb24jY29tbWl0KCkgRnJhZ21lbnRUcmFuc2FjdGlvbi5jb21taXQoKX0uICBUaGUKKyAgICAgKiB7QGxpbmsgI1BPUF9CQUNLX1NUQUNLX0lOQ0xVU0lWRX0gZmxhZyBjYW4gYmUgdXNlZCB0byBjb250cm9sIHdoZXRoZXIKKyAgICAgKiB0aGUgbmFtZWQgc3RhdGUgaXRzZWxmIGlzIHBvcHBlZC4KKyAgICAgKiBAcGFyYW0gZmxhZ3MgRWl0aGVyIDAgb3Ige0BsaW5rICNQT1BfQkFDS19TVEFDS19JTkNMVVNJVkV9LgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHBvcEJhY2tTdGFjayhpbnQgaWQsIGludCBmbGFncyk7CisKKyAgICAvKioKKyAgICAgKiBQdXQgYSByZWZlcmVuY2UgdG8gYSBmcmFnbWVudCBpbiBhIEJ1bmRsZS4gIFRoaXMgQnVuZGxlIGNhbiBiZQorICAgICAqIHBlcnNpc3RlZCBhcyBzYXZlZCBzdGF0ZSwgYW5kIHdoZW4gbGF0ZXIgcmVzdG9yaW5nCisgICAgICoge0BsaW5rICNnZXRGcmFnbWVudChCdW5kbGUsIFN0cmluZyl9IHdpbGwgcmV0dXJuIHRoZSBjdXJyZW50CisgICAgICogaW5zdGFuY2Ugb2YgdGhlIHNhbWUgZnJhZ21lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYnVuZGxlIFRoZSBidW5kbGUgaW4gd2hpY2ggdG8gcHV0IHRoZSBmcmFnbWVudCByZWZlcmVuY2UuCisgICAgICogQHBhcmFtIGtleSBUaGUgbmFtZSBvZiB0aGUgZW50cnkgaW4gdGhlIGJ1bmRsZS4KKyAgICAgKiBAcGFyYW0gZnJhZ21lbnQgVGhlIEZyYWdtZW50IHdob3NlIHJlZmVyZW5jZSBpcyB0byBiZSBzdG9yZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcHV0RnJhZ21lbnQoQnVuZGxlIGJ1bmRsZSwgU3RyaW5nIGtleSwgRnJhZ21lbnQgZnJhZ21lbnQpOworCisgICAgLyoqCisgICAgICogUmV0cmlldmUgdGhlIGN1cnJlbnQgRnJhZ21lbnQgaW5zdGFuY2UgZm9yIGEgcmVmZXJlbmNlIHByZXZpb3VzbHkKKyAgICAgKiBwbGFjZWQgd2l0aCB7QGxpbmsgI3B1dEZyYWdtZW50KEJ1bmRsZSwgU3RyaW5nLCBGcmFnbWVudCl9LgorICAgICAqCisgICAgICogQHBhcmFtIGJ1bmRsZSBUaGUgYnVuZGxlIGZyb20gd2hpY2ggdG8gcmV0cmlldmUgdGhlIGZyYWdtZW50IHJlZmVyZW5jZS4KKyAgICAgKiBAcGFyYW0ga2V5IFRoZSBuYW1lIG9mIHRoZSBlbnRyeSBpbiB0aGUgYnVuZGxlLgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgY3VycmVudCBGcmFnbWVudCBpbnN0YW5jZSB0aGF0IGlzIGFzc29jaWF0ZWQgd2l0aAorICAgICAqIHRoZSBnaXZlbiByZWZlcmVuY2UuCisgICAgICovCisgICAgcHVibGljIEZyYWdtZW50IGdldEZyYWdtZW50KEJ1bmRsZSBidW5kbGUsIFN0cmluZyBrZXkpOworfQorCitmaW5hbCBjbGFzcyBGcmFnbWVudE1hbmFnZXJTdGF0ZSBpbXBsZW1lbnRzIFBhcmNlbGFibGUgeworICAgIEZyYWdtZW50U3RhdGVbXSBtQWN0aXZlOworICAgIGludFtdIG1BZGRlZDsKKyAgICBCYWNrU3RhY2tTdGF0ZVtdIG1CYWNrU3RhY2s7CisgICAgCisgICAgcHVibGljIEZyYWdtZW50TWFuYWdlclN0YXRlKCkgeworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgRnJhZ21lbnRNYW5hZ2VyU3RhdGUoUGFyY2VsIGluKSB7CisgICAgICAgIG1BY3RpdmUgPSBpbi5jcmVhdGVUeXBlZEFycmF5KEZyYWdtZW50U3RhdGUuQ1JFQVRPUik7CisgICAgICAgIG1BZGRlZCA9IGluLmNyZWF0ZUludEFycmF5KCk7CisgICAgICAgIG1CYWNrU3RhY2sgPSBpbi5jcmVhdGVUeXBlZEFycmF5KEJhY2tTdGFja1N0YXRlLkNSRUFUT1IpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgaW50IGRlc2NyaWJlQ29udGVudHMoKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlVG9QYXJjZWwoUGFyY2VsIGRlc3QsIGludCBmbGFncykgeworICAgICAgICBkZXN0LndyaXRlVHlwZWRBcnJheShtQWN0aXZlLCBmbGFncyk7CisgICAgICAgIGRlc3Qud3JpdGVJbnRBcnJheShtQWRkZWQpOworICAgICAgICBkZXN0LndyaXRlVHlwZWRBcnJheShtQmFja1N0YWNrLCBmbGFncyk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUGFyY2VsYWJsZS5DcmVhdG9yPEZyYWdtZW50TWFuYWdlclN0YXRlPiBDUkVBVE9SCisgICAgICAgICAgICA9IG5ldyBQYXJjZWxhYmxlLkNyZWF0b3I8RnJhZ21lbnRNYW5hZ2VyU3RhdGU+KCkgeworICAgICAgICBwdWJsaWMgRnJhZ21lbnRNYW5hZ2VyU3RhdGUgY3JlYXRlRnJvbVBhcmNlbChQYXJjZWwgaW4pIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgRnJhZ21lbnRNYW5hZ2VyU3RhdGUoaW4pOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwdWJsaWMgRnJhZ21lbnRNYW5hZ2VyU3RhdGVbXSBuZXdBcnJheShpbnQgc2l6ZSkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBGcmFnbWVudE1hbmFnZXJTdGF0ZVtzaXplXTsKKyAgICAgICAgfQorICAgIH07Cit9CisKKy8qKgorICogQ29udGFpbmVyIGZvciBmcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIGFuIGFjdGl2aXR5LgorICovCitmaW5hbCBjbGFzcyBGcmFnbWVudE1hbmFnZXJJbXBsIGltcGxlbWVudHMgRnJhZ21lbnRNYW5hZ2VyIHsKKyAgICBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IHRydWU7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiRnJhZ21lbnRNYW5hZ2VyIjsKKyAgICAKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFRBUkdFVF9SRVFVRVNUX0NPREVfU1RBVEVfVEFHID0gImFuZHJvaWQ6dGFyZ2V0X3JlcV9zdGF0ZSI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBUQVJHRVRfU1RBVEVfVEFHID0gImFuZHJvaWQ6dGFyZ2V0X3N0YXRlIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFZJRVdfU1RBVEVfVEFHID0gImFuZHJvaWQ6dmlld19zdGF0ZSI7CisKKyAgICBBcnJheUxpc3Q8UnVubmFibGU+IG1QZW5kaW5nQWN0aW9uczsKKyAgICBSdW5uYWJsZVtdIG1UbXBBY3Rpb25zOworICAgIGJvb2xlYW4gbUV4ZWN1dGluZ0FjdGlvbnM7CisgICAgCisgICAgQXJyYXlMaXN0PEZyYWdtZW50PiBtQWN0aXZlOworICAgIEFycmF5TGlzdDxGcmFnbWVudD4gbUFkZGVkOworICAgIEFycmF5TGlzdDxJbnRlZ2VyPiBtQXZhaWxJbmRpY2VzOworICAgIEFycmF5TGlzdDxCYWNrU3RhY2tFbnRyeT4gbUJhY2tTdGFjazsKKyAgICAKKyAgICAvLyBNdXN0IGJlIGFjY2Vzc2VkIHdoaWxlIGxvY2tlZC4KKyAgICBBcnJheUxpc3Q8QmFja1N0YWNrRW50cnk+IG1CYWNrU3RhY2tJbmRpY2VzOworICAgIEFycmF5TGlzdDxJbnRlZ2VyPiBtQXZhaWxCYWNrU3RhY2tJbmRpY2VzOworCisgICAgaW50IG1DdXJTdGF0ZSA9IEZyYWdtZW50LklOSVRJQUxJWklORzsKKyAgICBBY3Rpdml0eSBtQWN0aXZpdHk7CisgICAgCisgICAgYm9vbGVhbiBtTmVlZE1lbnVJbnZhbGlkYXRlOworICAgIAorICAgIC8vIFRlbXBvcmFyeSB2YXJzIGZvciBzdGF0ZSBzYXZlIGFuZCByZXN0b3JlLgorICAgIEJ1bmRsZSBtU3RhdGVCdW5kbGUgPSBudWxsOworICAgIFNwYXJzZUFycmF5PFBhcmNlbGFibGU+IG1TdGF0ZUFycmF5ID0gbnVsbDsKKyAgICAKKyAgICBSdW5uYWJsZSBtRXhlY0NvbW1pdCA9IG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgIGV4ZWNQZW5kaW5nQWN0aW9ucygpOworICAgICAgICB9CisgICAgfTsKKyAgICBwdWJsaWMgRnJhZ21lbnRUcmFuc2FjdGlvbiBvcGVuVHJhbnNhY3Rpb24oKSB7CisgICAgICAgIHJldHVybiBuZXcgQmFja1N0YWNrRW50cnkodGhpcyk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gcG9wQmFja1N0YWNrKCkgeworICAgICAgICByZXR1cm4gcG9wQmFja1N0YWNrU3RhdGUobUFjdGl2aXR5Lm1IYW5kbGVyLCBudWxsLCAtMSwgMCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gcG9wQmFja1N0YWNrKFN0cmluZyBuYW1lLCBpbnQgZmxhZ3MpIHsKKyAgICAgICAgcmV0dXJuIHBvcEJhY2tTdGFja1N0YXRlKG1BY3Rpdml0eS5tSGFuZGxlciwgbmFtZSwgLTEsIGZsYWdzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBwb3BCYWNrU3RhY2soaW50IGlkLCBpbnQgZmxhZ3MpIHsKKyAgICAgICAgaWYgKGlkIDwgMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQmFkIGlkOiAiICsgaWQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBwb3BCYWNrU3RhY2tTdGF0ZShtQWN0aXZpdHkubUhhbmRsZXIsIG51bGwsIGlkLCBmbGFncyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcHV0RnJhZ21lbnQoQnVuZGxlIGJ1bmRsZSwgU3RyaW5nIGtleSwgRnJhZ21lbnQgZnJhZ21lbnQpIHsKKyAgICAgICAgaWYgKGZyYWdtZW50Lm1JbmRleCA8IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkZyYWdtZW50ICIgKyBmcmFnbWVudAorICAgICAgICAgICAgICAgICAgICArICIgaXMgbm90IGN1cnJlbnRseSBpbiB0aGUgRnJhZ21lbnRNYW5hZ2VyIik7CisgICAgICAgIH0KKyAgICAgICAgYnVuZGxlLnB1dEludChrZXksIGZyYWdtZW50Lm1JbmRleCk7CisgICAgfQorCisgICAgcHVibGljIEZyYWdtZW50IGdldEZyYWdtZW50KEJ1bmRsZSBidW5kbGUsIFN0cmluZyBrZXkpIHsKKyAgICAgICAgaW50IGluZGV4ID0gYnVuZGxlLmdldEludChrZXksIC0xKTsKKyAgICAgICAgaWYgKGluZGV4ID09IC0xKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5kZXggPj0gbUFjdGl2ZS5zaXplKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkZyYWdlbWVudCBubyBsb25nZXIgZXhpc3RzIGZvciBrZXkgIgorICAgICAgICAgICAgICAgICAgICArIGtleSArICI6IGluZGV4ICIgKyBpbmRleCk7CisgICAgICAgIH0KKyAgICAgICAgRnJhZ21lbnQgZiA9IG1BY3RpdmUuZ2V0KGluZGV4KTsKKyAgICAgICAgaWYgKGYgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiRnJhZ2VtZW50IG5vIGxvbmdlciBleGlzdHMgZm9yIGtleSAiCisgICAgICAgICAgICAgICAgICAgICsga2V5ICsgIjogaW5kZXggIiArIGluZGV4KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZjsKKyAgICB9CisKKyAgICBBbmltYXRhYmxlIGxvYWRBbmltYXRhYmxlKEZyYWdtZW50IGZyYWdtZW50LCBpbnQgdHJhbnNpdCwgYm9vbGVhbiBlbnRlciwKKyAgICAgICAgICAgIGludCB0cmFuc2l0aW9uU3R5bGUpIHsKKyAgICAgICAgQW5pbWF0YWJsZSBhbmltT2JqID0gZnJhZ21lbnQub25DcmVhdGVBbmltYXRhYmxlKHRyYW5zaXQsIGVudGVyLAorICAgICAgICAgICAgICAgIGZyYWdtZW50Lm1OZXh0QW5pbSk7CisgICAgICAgIGlmIChhbmltT2JqICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBhbmltT2JqOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAoZnJhZ21lbnQubU5leHRBbmltICE9IDApIHsKKyAgICAgICAgICAgIEFuaW1hdGFibGUgYW5pbSA9IEFuaW1hdGFibGVJbmZsYXRlci5sb2FkQW5pbWF0YWJsZShtQWN0aXZpdHksIGZyYWdtZW50Lm1OZXh0QW5pbSk7CisgICAgICAgICAgICBpZiAoYW5pbSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGFuaW07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmICh0cmFuc2l0ID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpbnQgc3R5bGVJbmRleCA9IHRyYW5zaXRUb1N0eWxlSW5kZXgodHJhbnNpdCwgZW50ZXIpOworICAgICAgICBpZiAoc3R5bGVJbmRleCA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAodHJhbnNpdGlvblN0eWxlID09IDAgJiYgbUFjdGl2aXR5LmdldFdpbmRvdygpICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyYW5zaXRpb25TdHlsZSA9IG1BY3Rpdml0eS5nZXRXaW5kb3coKS5nZXRBdHRyaWJ1dGVzKCkud2luZG93QW5pbWF0aW9uczsKKyAgICAgICAgfQorICAgICAgICBpZiAodHJhbnNpdGlvblN0eWxlID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBUeXBlZEFycmF5IGF0dHJzID0gbUFjdGl2aXR5Lm9idGFpblN0eWxlZEF0dHJpYnV0ZXModHJhbnNpdGlvblN0eWxlLAorICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkZyYWdtZW50QW5pbWF0aW9uKTsKKyAgICAgICAgaW50IGFuaW0gPSBhdHRycy5nZXRSZXNvdXJjZUlkKHN0eWxlSW5kZXgsIDApOworICAgICAgICBhdHRycy5yZWN5Y2xlKCk7CisgICAgICAgIAorICAgICAgICBpZiAoYW5pbSA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcmV0dXJuIEFuaW1hdGFibGVJbmZsYXRlci5sb2FkQW5pbWF0YWJsZShtQWN0aXZpdHksIGFuaW0pOworICAgIH0KKyAgICAKKyAgICB2b2lkIG1vdmVUb1N0YXRlKEZyYWdtZW50IGYsIGludCBuZXdTdGF0ZSwgaW50IHRyYW5zaXQsIGludCB0cmFuc2l0aW9uU3R5bGUpIHsKKyAgICAgICAgLy8gRnJhZ21lbnRzIHRoYXQgYXJlIG5vdCBjdXJyZW50bHkgYWRkZWQgd2lsbCBzaXQgaW4gdGhlIG9uQ3JlYXRlKCkgc3RhdGUuCisgICAgICAgIGlmICghZi5tQWRkZWQgJiYgbmV3U3RhdGUgPiBGcmFnbWVudC5DUkVBVEVEKSB7CisgICAgICAgICAgICBuZXdTdGF0ZSA9IEZyYWdtZW50LkNSRUFURUQ7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChmLm1TdGF0ZSA8IG5ld1N0YXRlKSB7CisgICAgICAgICAgICBzd2l0Y2ggKGYubVN0YXRlKSB7CisgICAgICAgICAgICAgICAgY2FzZSBGcmFnbWVudC5JTklUSUFMSVpJTkc6CisgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAibW92ZXRvIENSRUFURUQ6ICIgKyBmKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGYubVNhdmVkRnJhZ21lbnRTdGF0ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmLm1TYXZlZFZpZXdTdGF0ZSA9IGYubVNhdmVkRnJhZ21lbnRTdGF0ZS5nZXRTcGFyc2VQYXJjZWxhYmxlQXJyYXkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYWdtZW50TWFuYWdlckltcGwuVklFV19TVEFURV9UQUcpOworICAgICAgICAgICAgICAgICAgICAgICAgZi5tVGFyZ2V0ID0gZ2V0RnJhZ21lbnQoZi5tU2F2ZWRGcmFnbWVudFN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcmFnbWVudE1hbmFnZXJJbXBsLlRBUkdFVF9TVEFURV9UQUcpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGYubVRhcmdldCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZi5tVGFyZ2V0UmVxdWVzdENvZGUgPSBmLm1TYXZlZEZyYWdtZW50U3RhdGUuZ2V0SW50KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJhZ21lbnRNYW5hZ2VySW1wbC5UQVJHRVRfUkVRVUVTVF9DT0RFX1NUQVRFX1RBRywgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZi5tQWN0aXZpdHkgPSBtQWN0aXZpdHk7CisgICAgICAgICAgICAgICAgICAgIGYubUNhbGxlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBmLm9uQXR0YWNoKG1BY3Rpdml0eSk7CisgICAgICAgICAgICAgICAgICAgIGlmICghZi5tQ2FsbGVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU3VwZXJOb3RDYWxsZWRFeGNlcHRpb24oIkZyYWdtZW50ICIgKyBmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBkaWQgbm90IGNhbGwgdGhyb3VnaCB0byBzdXBlci5vbkF0dGFjaCgpIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbUFjdGl2aXR5Lm9uQXR0YWNoRnJhZ21lbnQoZik7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBpZiAoIWYubVJldGFpbmluZykgeworICAgICAgICAgICAgICAgICAgICAgICAgZi5tQ2FsbGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICBmLm9uQ3JlYXRlKGYubVNhdmVkRnJhZ21lbnRTdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWYubUNhbGxlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTdXBlck5vdENhbGxlZEV4Y2VwdGlvbigiRnJhZ21lbnQgIiArIGYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBkaWQgbm90IGNhbGwgdGhyb3VnaCB0byBzdXBlci5vbkNyZWF0ZSgpIik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZi5tUmV0YWluaW5nID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGlmIChmLm1Gcm9tTGF5b3V0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBGb3IgZnJhZ21lbnRzIHRoYXQgYXJlIHBhcnQgb2YgdGhlIGNvbnRlbnQgdmlldworICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGF5b3V0LCB3ZSBuZWVkIHRvIGluc3RhbnRpYXRlIHRoZSB2aWV3IGltbWVkaWF0ZWx5CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgdGhlIGluZmxhdGVyIHdpbGwgdGFrZSBjYXJlIG9mIGFkZGluZyBpdC4KKyAgICAgICAgICAgICAgICAgICAgICAgIGYubVZpZXcgPSBmLm9uQ3JlYXRlVmlldyhtQWN0aXZpdHkuZ2V0TGF5b3V0SW5mbGF0ZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgZi5tU2F2ZWRGcmFnbWVudFN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmLm1WaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLm1WaWV3LnNldFNhdmVGcm9tUGFyZW50RW5hYmxlZChmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZi5yZXN0b3JlVmlld1N0YXRlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGYubUhpZGRlbikgZi5tVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7IAorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FzZSBGcmFnbWVudC5DUkVBVEVEOgorICAgICAgICAgICAgICAgICAgICBpZiAobmV3U3RhdGUgPiBGcmFnbWVudC5DUkVBVEVEKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgIm1vdmV0byBDT05URU5UOiAiICsgZik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWYubUZyb21MYXlvdXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaWV3R3JvdXAgY29udGFpbmVyID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZi5tQ29udGFpbmVySWQgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXIgPSAoVmlld0dyb3VwKW1BY3Rpdml0eS5maW5kVmlld0J5SWQoZi5tQ29udGFpbmVySWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udGFpbmVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk5ldyB2aWV3IGZvdW5kIGZvciBpZCAweCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKGYubUNvbnRhaW5lcklkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZm9yIGZyYWdtZW50ICIgKyBmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLm1Db250YWluZXIgPSBjb250YWluZXI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZi5tVmlldyA9IGYub25DcmVhdGVWaWV3KG1BY3Rpdml0eS5nZXRMYXlvdXRJbmZsYXRlcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyLCBmLm1TYXZlZEZyYWdtZW50U3RhdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmLm1WaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZi5tVmlldy5zZXRTYXZlRnJvbVBhcmVudEVuYWJsZWQoZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udGFpbmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFuaW1hdGFibGUgYW5pbSA9IGxvYWRBbmltYXRhYmxlKGYsIHRyYW5zaXQsIHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25TdHlsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYW5pbSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFuaW0gaW5zdGFuY2VvZiBTZXF1ZW5jZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTZXF1ZW5jZXIpYW5pbSkuc2V0VGFyZ2V0KGYubVZpZXcpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYW5pbSBpbnN0YW5jZW9mIFByb3BlcnR5QW5pbWF0b3IpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChQcm9wZXJ0eUFuaW1hdG9yKWFuaW0pLnNldFRhcmdldChmLm1WaWV3KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbS5zdGFydCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyLmFkZFZpZXcoZi5tVmlldyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLnJlc3RvcmVWaWV3U3RhdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZi5tSGlkZGVuKSBmLm1WaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBmLm1DYWxsZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGYub25BY3Rpdml0eUNyZWF0ZWQoZi5tU2F2ZWRGcmFnbWVudFN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZi5tQ2FsbGVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFN1cGVyTm90Q2FsbGVkRXhjZXB0aW9uKCJGcmFnbWVudCAiICsgZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGRpZCBub3QgY2FsbCB0aHJvdWdoIHRvIHN1cGVyLm9uUmVhZHkoKSIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZi5tU2F2ZWRGcmFnbWVudFN0YXRlID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhc2UgRnJhZ21lbnQuQUNUSVZJVFlfQ1JFQVRFRDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1N0YXRlID4gRnJhZ21lbnQuQUNUSVZJVFlfQ1JFQVRFRCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJtb3ZldG8gU1RBUlRFRDogIiArIGYpOworICAgICAgICAgICAgICAgICAgICAgICAgZi5tQ2FsbGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICBmLm9uU3RhcnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZi5tQ2FsbGVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFN1cGVyTm90Q2FsbGVkRXhjZXB0aW9uKCJGcmFnbWVudCAiICsgZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGRpZCBub3QgY2FsbCB0aHJvdWdoIHRvIHN1cGVyLm9uU3RhcnQoKSIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FzZSBGcmFnbWVudC5TVEFSVEVEOgorICAgICAgICAgICAgICAgICAgICBpZiAobmV3U3RhdGUgPiBGcmFnbWVudC5TVEFSVEVEKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgIm1vdmV0byBSRVNVTUVEOiAiICsgZik7CisgICAgICAgICAgICAgICAgICAgICAgICBmLm1DYWxsZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGYubVJlc3VtZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgZi5vblJlc3VtZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmLm1DYWxsZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU3VwZXJOb3RDYWxsZWRFeGNlcHRpb24oIkZyYWdtZW50ICIgKyBmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZGlkIG5vdCBjYWxsIHRocm91Z2ggdG8gc3VwZXIub25SZXN1bWUoKSIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoZi5tU3RhdGUgPiBuZXdTdGF0ZSkgeworICAgICAgICAgICAgc3dpdGNoIChmLm1TdGF0ZSkgeworICAgICAgICAgICAgICAgIGNhc2UgRnJhZ21lbnQuUkVTVU1FRDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1N0YXRlIDwgRnJhZ21lbnQuUkVTVU1FRCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJtb3ZlZnJvbSBSRVNVTUVEOiAiICsgZik7CisgICAgICAgICAgICAgICAgICAgICAgICBmLm1DYWxsZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGYub25QYXVzZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmLm1DYWxsZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU3VwZXJOb3RDYWxsZWRFeGNlcHRpb24oIkZyYWdtZW50ICIgKyBmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZGlkIG5vdCBjYWxsIHRocm91Z2ggdG8gc3VwZXIub25QYXVzZSgpIik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBmLm1SZXN1bWVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIEZyYWdtZW50LlNUQVJURUQ6CisgICAgICAgICAgICAgICAgICAgIGlmIChuZXdTdGF0ZSA8IEZyYWdtZW50LlNUQVJURUQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAibW92ZWZyb20gU1RBUlRFRDogIiArIGYpOworICAgICAgICAgICAgICAgICAgICAgICAgZi5tQ2FsbGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICBmLnBlcmZvcm1TdG9wKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWYubUNhbGxlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTdXBlck5vdENhbGxlZEV4Y2VwdGlvbigiRnJhZ21lbnQgIiArIGYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBkaWQgbm90IGNhbGwgdGhyb3VnaCB0byBzdXBlci5vblN0b3AoKSIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FzZSBGcmFnbWVudC5BQ1RJVklUWV9DUkVBVEVEOgorICAgICAgICAgICAgICAgICAgICBpZiAobmV3U3RhdGUgPCBGcmFnbWVudC5BQ1RJVklUWV9DUkVBVEVEKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgIm1vdmVmcm9tIENPTlRFTlQ6ICIgKyBmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmLm1WaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOZWVkIHRvIHNhdmUgdGhlIGN1cnJlbnQgdmlldyBzdGF0ZSBpZiBub3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkb25lIGFscmVhZHkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtQWN0aXZpdHkuaXNGaW5pc2hpbmcoKSAmJiBmLm1TYXZlZEZyYWdtZW50U3RhdGUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYXZlRnJhZ21lbnRWaWV3U3RhdGUoZik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZi5tQ2FsbGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICBmLm9uRGVzdHJveVZpZXcoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZi5tQ2FsbGVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFN1cGVyTm90Q2FsbGVkRXhjZXB0aW9uKCJGcmFnbWVudCAiICsgZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGRpZCBub3QgY2FsbCB0aHJvdWdoIHRvIHN1cGVyLm9uRGVzdHJveWVkVmlldygpIik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZi5tVmlldyAhPSBudWxsICYmIGYubUNvbnRhaW5lciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1DdXJTdGF0ZSA+IEZyYWdtZW50LklOSVRJQUxJWklORykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbmltYXRhYmxlIGFuaW0gPSBsb2FkQW5pbWF0YWJsZShmLCB0cmFuc2l0LCB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25TdHlsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhbmltICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhbmltIGluc3RhbmNlb2YgU2VxdWVuY2VyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTZXF1ZW5jZXIpYW5pbSkuc2V0VGFyZ2V0KGYubVZpZXcpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhbmltIGluc3RhbmNlb2YgUHJvcGVydHlBbmltYXRvcikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUHJvcGVydHlBbmltYXRvcilhbmltKS5zZXRUYXJnZXQoZi5tVmlldyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmltLnN0YXJ0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZi5tQ29udGFpbmVyLnJlbW92ZVZpZXcoZi5tVmlldyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBmLm1Db250YWluZXIgPSBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgZi5tVmlldyA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIEZyYWdtZW50LkNSRUFURUQ6CisgICAgICAgICAgICAgICAgICAgIGlmIChuZXdTdGF0ZSA8IEZyYWdtZW50LkNSRUFURUQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAibW92ZWZyb20gQ1JFQVRFRDogIiArIGYpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmLm1SZXRhaW5pbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLm1DYWxsZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLm9uRGVzdHJveSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZi5tQ2FsbGVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTdXBlck5vdENhbGxlZEV4Y2VwdGlvbigiRnJhZ21lbnQgIiArIGYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZGlkIG5vdCBjYWxsIHRocm91Z2ggdG8gc3VwZXIub25EZXN0cm95KCkiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGYubUNhbGxlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgZi5vbkRldGFjaCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmLm1DYWxsZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU3VwZXJOb3RDYWxsZWRFeGNlcHRpb24oIkZyYWdtZW50ICIgKyBmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZGlkIG5vdCBjYWxsIHRocm91Z2ggdG8gc3VwZXIub25EZXRhY2goKSIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZi5tQWN0aXZpdHkgPSBudWxsOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGYubVN0YXRlID0gbmV3U3RhdGU7CisgICAgfQorICAgIAorICAgIHZvaWQgbW92ZVRvU3RhdGUoaW50IG5ld1N0YXRlLCBib29sZWFuIGFsd2F5cykgeworICAgICAgICBtb3ZlVG9TdGF0ZShuZXdTdGF0ZSwgMCwgMCwgYWx3YXlzKTsKKyAgICB9CisgICAgCisgICAgdm9pZCBtb3ZlVG9TdGF0ZShpbnQgbmV3U3RhdGUsIGludCB0cmFuc2l0LCBpbnQgdHJhbnNpdFN0eWxlLCBib29sZWFuIGFsd2F5cykgeworICAgICAgICBpZiAobUFjdGl2aXR5ID09IG51bGwgJiYgbmV3U3RhdGUgIT0gRnJhZ21lbnQuSU5JVElBTElaSU5HKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJObyBhY3Rpdml0eSIpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAoIWFsd2F5cyAmJiBtQ3VyU3RhdGUgPT0gbmV3U3RhdGUpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgbUN1clN0YXRlID0gbmV3U3RhdGU7CisgICAgICAgIGlmIChtQWN0aXZlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxtQWN0aXZlLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgRnJhZ21lbnQgZiA9IG1BY3RpdmUuZ2V0KGkpOworICAgICAgICAgICAgICAgIGlmIChmICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbW92ZVRvU3RhdGUoZiwgbmV3U3RhdGUsIHRyYW5zaXQsIHRyYW5zaXRTdHlsZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIAorICAgIHZvaWQgbWFrZUFjdGl2ZShGcmFnbWVudCBmKSB7CisgICAgICAgIGlmIChmLm1JbmRleCA+PSAwKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChtQXZhaWxJbmRpY2VzID09IG51bGwgfHwgbUF2YWlsSW5kaWNlcy5zaXplKCkgPD0gMCkgeworICAgICAgICAgICAgaWYgKG1BY3RpdmUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1BY3RpdmUgPSBuZXcgQXJyYXlMaXN0PEZyYWdtZW50PigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZi5zZXRJbmRleChtQWN0aXZlLnNpemUoKSk7CisgICAgICAgICAgICBtQWN0aXZlLmFkZChmKTsKKyAgICAgICAgICAgIAorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZi5zZXRJbmRleChtQXZhaWxJbmRpY2VzLnJlbW92ZShtQXZhaWxJbmRpY2VzLnNpemUoKS0xKSk7CisgICAgICAgICAgICBtQWN0aXZlLnNldChmLm1JbmRleCwgZik7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgdm9pZCBtYWtlSW5hY3RpdmUoRnJhZ21lbnQgZikgeworICAgICAgICBpZiAoZi5tSW5kZXggPCAwKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAiRnJlZWluZyBmcmFnbWVudCBpbmRleCAiICsgZi5tSW5kZXgpOworICAgICAgICBtQWN0aXZlLnNldChmLm1JbmRleCwgbnVsbCk7CisgICAgICAgIGlmIChtQXZhaWxJbmRpY2VzID09IG51bGwpIHsKKyAgICAgICAgICAgIG1BdmFpbEluZGljZXMgPSBuZXcgQXJyYXlMaXN0PEludGVnZXI+KCk7CisgICAgICAgIH0KKyAgICAgICAgbUF2YWlsSW5kaWNlcy5hZGQoZi5tSW5kZXgpOworICAgICAgICBtQWN0aXZpdHkuaW52YWxpZGF0ZUZyYWdtZW50SW5kZXgoZi5tSW5kZXgpOworICAgICAgICBmLmNsZWFySW5kZXgoKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgYWRkRnJhZ21lbnQoRnJhZ21lbnQgZnJhZ21lbnQsIGJvb2xlYW4gbW92ZVRvU3RhdGVOb3cpIHsKKyAgICAgICAgaWYgKG1BZGRlZCA9PSBudWxsKSB7CisgICAgICAgICAgICBtQWRkZWQgPSBuZXcgQXJyYXlMaXN0PEZyYWdtZW50PigpOworICAgICAgICB9CisgICAgICAgIG1BZGRlZC5hZGQoZnJhZ21lbnQpOworICAgICAgICBtYWtlQWN0aXZlKGZyYWdtZW50KTsKKyAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJhZGQ6ICIgKyBmcmFnbWVudCk7CisgICAgICAgIGZyYWdtZW50Lm1BZGRlZCA9IHRydWU7CisgICAgICAgIGlmIChmcmFnbWVudC5tSGFzTWVudSkgeworICAgICAgICAgICAgbU5lZWRNZW51SW52YWxpZGF0ZSA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1vdmVUb1N0YXRlTm93KSB7CisgICAgICAgICAgICBtb3ZlVG9TdGF0ZShmcmFnbWVudCwgbUN1clN0YXRlLCAwLCAwKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCByZW1vdmVGcmFnbWVudChGcmFnbWVudCBmcmFnbWVudCwgaW50IHRyYW5zaXRpb24sIGludCB0cmFuc2l0aW9uU3R5bGUpIHsKKyAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJyZW1vdmU6ICIgKyBmcmFnbWVudCArICIgbmVzdGluZz0iICsgZnJhZ21lbnQubUJhY2tTdGFja05lc3RpbmcpOworICAgICAgICBtQWRkZWQucmVtb3ZlKGZyYWdtZW50KTsKKyAgICAgICAgZmluYWwgYm9vbGVhbiBpbmFjdGl2ZSA9IGZyYWdtZW50Lm1CYWNrU3RhY2tOZXN0aW5nIDw9IDA7CisgICAgICAgIGlmIChmcmFnbWVudC5tSGFzTWVudSkgeworICAgICAgICAgICAgbU5lZWRNZW51SW52YWxpZGF0ZSA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgZnJhZ21lbnQubUFkZGVkID0gZmFsc2U7CisgICAgICAgIG1vdmVUb1N0YXRlKGZyYWdtZW50LCBpbmFjdGl2ZSA/IEZyYWdtZW50LklOSVRJQUxJWklORyA6IEZyYWdtZW50LkNSRUFURUQsCisgICAgICAgICAgICAgICAgdHJhbnNpdGlvbiwgdHJhbnNpdGlvblN0eWxlKTsKKyAgICAgICAgaWYgKGluYWN0aXZlKSB7CisgICAgICAgICAgICBtYWtlSW5hY3RpdmUoZnJhZ21lbnQpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIGhpZGVGcmFnbWVudChGcmFnbWVudCBmcmFnbWVudCwgaW50IHRyYW5zaXRpb24sIGludCB0cmFuc2l0aW9uU3R5bGUpIHsKKyAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJoaWRlOiAiICsgZnJhZ21lbnQpOworICAgICAgICBpZiAoIWZyYWdtZW50Lm1IaWRkZW4pIHsKKyAgICAgICAgICAgIGZyYWdtZW50Lm1IaWRkZW4gPSB0cnVlOworICAgICAgICAgICAgaWYgKGZyYWdtZW50Lm1WaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBBbmltYXRhYmxlIGFuaW0gPSBsb2FkQW5pbWF0YWJsZShmcmFnbWVudCwgdHJhbnNpdGlvbiwgdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25TdHlsZSk7CisgICAgICAgICAgICAgICAgaWYgKGFuaW0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoYW5pbSBpbnN0YW5jZW9mIFNlcXVlbmNlcikgeworICAgICAgICAgICAgICAgICAgICAgICAgKChTZXF1ZW5jZXIpYW5pbSkuc2V0VGFyZ2V0KGZyYWdtZW50Lm1WaWV3KTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhbmltIGluc3RhbmNlb2YgUHJvcGVydHlBbmltYXRvcikgeworICAgICAgICAgICAgICAgICAgICAgICAgKChQcm9wZXJ0eUFuaW1hdG9yKWFuaW0pLnNldFRhcmdldChmcmFnbWVudC5tVmlldyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYW5pbS5zdGFydCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmcmFnbWVudC5tVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZnJhZ21lbnQubUFkZGVkICYmIGZyYWdtZW50Lm1IYXNNZW51KSB7CisgICAgICAgICAgICAgICAgbU5lZWRNZW51SW52YWxpZGF0ZSA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmcmFnbWVudC5vbkhpZGRlbkNoYW5nZWQodHJ1ZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgc2hvd0ZyYWdtZW50KEZyYWdtZW50IGZyYWdtZW50LCBpbnQgdHJhbnNpdGlvbiwgaW50IHRyYW5zaXRpb25TdHlsZSkgeworICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgInNob3c6ICIgKyBmcmFnbWVudCk7CisgICAgICAgIGlmIChmcmFnbWVudC5tSGlkZGVuKSB7CisgICAgICAgICAgICBmcmFnbWVudC5tSGlkZGVuID0gZmFsc2U7CisgICAgICAgICAgICBpZiAoZnJhZ21lbnQubVZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIEFuaW1hdGFibGUgYW5pbSA9IGxvYWRBbmltYXRhYmxlKGZyYWdtZW50LCB0cmFuc2l0aW9uLCB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblN0eWxlKTsKKyAgICAgICAgICAgICAgICBpZiAoYW5pbSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChhbmltIGluc3RhbmNlb2YgU2VxdWVuY2VyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAoKFNlcXVlbmNlcilhbmltKS5zZXRUYXJnZXQoZnJhZ21lbnQubVZpZXcpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFuaW0gaW5zdGFuY2VvZiBQcm9wZXJ0eUFuaW1hdG9yKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAoKFByb3BlcnR5QW5pbWF0b3IpYW5pbSkuc2V0VGFyZ2V0KGZyYWdtZW50Lm1WaWV3KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBhbmltLnN0YXJ0KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZyYWdtZW50Lm1WaWV3LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChmcmFnbWVudC5tQWRkZWQgJiYgZnJhZ21lbnQubUhhc01lbnUpIHsKKyAgICAgICAgICAgICAgICBtTmVlZE1lbnVJbnZhbGlkYXRlID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZyYWdtZW50Lm9uSGlkZGVuQ2hhbmdlZChmYWxzZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHVibGljIEZyYWdtZW50IGZpbmRGcmFnbWVudEJ5SWQoaW50IGlkKSB7CisgICAgICAgIGlmIChtQWN0aXZlICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIEZpcnN0IGxvb2sgdGhyb3VnaCBhZGRlZCBmcmFnbWVudHMuCisgICAgICAgICAgICBmb3IgKGludCBpPW1BZGRlZC5zaXplKCktMTsgaT49MDsgaS0tKSB7CisgICAgICAgICAgICAgICAgRnJhZ21lbnQgZiA9IG1BZGRlZC5nZXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKGYgIT0gbnVsbCAmJiBmLm1GcmFnbWVudElkID09IGlkKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIE5vdyBmb3IgYW55IGtub3duIGZyYWdtZW50LgorICAgICAgICAgICAgZm9yIChpbnQgaT1tQWN0aXZlLnNpemUoKS0xOyBpPj0wOyBpLS0pIHsKKyAgICAgICAgICAgICAgICBGcmFnbWVudCBmID0gbUFjdGl2ZS5nZXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKGYgIT0gbnVsbCAmJiBmLm1GcmFnbWVudElkID09IGlkKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgICAgCisgICAgcHVibGljIEZyYWdtZW50IGZpbmRGcmFnbWVudEJ5VGFnKFN0cmluZyB0YWcpIHsKKyAgICAgICAgaWYgKG1BY3RpdmUgIT0gbnVsbCAmJiB0YWcgIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gRmlyc3QgbG9vayB0aHJvdWdoIGFkZGVkIGZyYWdtZW50cy4KKyAgICAgICAgICAgIGZvciAoaW50IGk9bUFkZGVkLnNpemUoKS0xOyBpPj0wOyBpLS0pIHsKKyAgICAgICAgICAgICAgICBGcmFnbWVudCBmID0gbUFkZGVkLmdldChpKTsKKyAgICAgICAgICAgICAgICBpZiAoZiAhPSBudWxsICYmIHRhZy5lcXVhbHMoZi5tVGFnKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBOb3cgZm9yIGFueSBrbm93biBmcmFnbWVudC4KKyAgICAgICAgICAgIGZvciAoaW50IGk9bUFjdGl2ZS5zaXplKCktMTsgaT49MDsgaS0tKSB7CisgICAgICAgICAgICAgICAgRnJhZ21lbnQgZiA9IG1BY3RpdmUuZ2V0KGkpOworICAgICAgICAgICAgICAgIGlmIChmICE9IG51bGwgJiYgdGFnLmVxdWFscyhmLm1UYWcpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgICAgCisgICAgcHVibGljIEZyYWdtZW50IGZpbmRGcmFnbWVudEJ5V2hvKFN0cmluZyB3aG8pIHsKKyAgICAgICAgaWYgKG1BY3RpdmUgIT0gbnVsbCAmJiB3aG8gIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChpbnQgaT1tQWN0aXZlLnNpemUoKS0xOyBpPj0wOyBpLS0pIHsKKyAgICAgICAgICAgICAgICBGcmFnbWVudCBmID0gbUFjdGl2ZS5nZXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKGYgIT0gbnVsbCAmJiB3aG8uZXF1YWxzKGYubVdobykpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBlbnF1ZXVlQWN0aW9uKFJ1bm5hYmxlIGFjdGlvbikgeworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIGlmIChtUGVuZGluZ0FjdGlvbnMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1QZW5kaW5nQWN0aW9ucyA9IG5ldyBBcnJheUxpc3Q8UnVubmFibGU+KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtUGVuZGluZ0FjdGlvbnMuYWRkKGFjdGlvbik7CisgICAgICAgICAgICBpZiAobVBlbmRpbmdBY3Rpb25zLnNpemUoKSA9PSAxKSB7CisgICAgICAgICAgICAgICAgbUFjdGl2aXR5Lm1IYW5kbGVyLnJlbW92ZUNhbGxiYWNrcyhtRXhlY0NvbW1pdCk7CisgICAgICAgICAgICAgICAgbUFjdGl2aXR5Lm1IYW5kbGVyLnBvc3QobUV4ZWNDb21taXQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIAorICAgIHB1YmxpYyBpbnQgYWxsb2NCYWNrU3RhY2tJbmRleChCYWNrU3RhY2tFbnRyeSBic2UpIHsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBpZiAobUF2YWlsQmFja1N0YWNrSW5kaWNlcyA9PSBudWxsIHx8IG1BdmFpbEJhY2tTdGFja0luZGljZXMuc2l6ZSgpIDw9IDApIHsKKyAgICAgICAgICAgICAgICBpZiAobUJhY2tTdGFja0luZGljZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBtQmFja1N0YWNrSW5kaWNlcyA9IG5ldyBBcnJheUxpc3Q8QmFja1N0YWNrRW50cnk+KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGludCBpbmRleCA9IG1CYWNrU3RhY2tJbmRpY2VzLnNpemUoKTsKKyAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgIlNldHRpbmcgYmFjayBzdGFjayBpbmRleCAiICsgaW5kZXggKyAiIHRvICIgKyBic2UpOworICAgICAgICAgICAgICAgIG1CYWNrU3RhY2tJbmRpY2VzLmFkZChic2UpOworICAgICAgICAgICAgICAgIHJldHVybiBpbmRleDsKKworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSBtQXZhaWxCYWNrU3RhY2tJbmRpY2VzLnJlbW92ZShtQXZhaWxCYWNrU3RhY2tJbmRpY2VzLnNpemUoKS0xKTsKKyAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgIkFkZGluZyBiYWNrIHN0YWNrIGluZGV4ICIgKyBpbmRleCArICIgd2l0aCAiICsgYnNlKTsKKyAgICAgICAgICAgICAgICBtQmFja1N0YWNrSW5kaWNlcy5zZXQoaW5kZXgsIGJzZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGluZGV4OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0QmFja1N0YWNrSW5kZXgoaW50IGluZGV4LCBCYWNrU3RhY2tFbnRyeSBic2UpIHsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBpZiAobUJhY2tTdGFja0luZGljZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1CYWNrU3RhY2tJbmRpY2VzID0gbmV3IEFycmF5TGlzdDxCYWNrU3RhY2tFbnRyeT4oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludCBOID0gbUJhY2tTdGFja0luZGljZXMuc2l6ZSgpOworICAgICAgICAgICAgaWYgKGluZGV4IDwgTikgeworICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAiU2V0dGluZyBiYWNrIHN0YWNrIGluZGV4ICIgKyBpbmRleCArICIgdG8gIiArIGJzZSk7CisgICAgICAgICAgICAgICAgbUJhY2tTdGFja0luZGljZXMuc2V0KGluZGV4LCBic2UpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB3aGlsZSAoTiA8IGluZGV4KSB7CisgICAgICAgICAgICAgICAgICAgIG1CYWNrU3RhY2tJbmRpY2VzLmFkZChudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1BdmFpbEJhY2tTdGFja0luZGljZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbUF2YWlsQmFja1N0YWNrSW5kaWNlcyA9IG5ldyBBcnJheUxpc3Q8SW50ZWdlcj4oKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgIkFkZGluZyBhdmFpbGFibGUgYmFjayBzdGFjayBpbmRleCAiICsgTik7CisgICAgICAgICAgICAgICAgICAgIG1BdmFpbEJhY2tTdGFja0luZGljZXMuYWRkKE4pOworICAgICAgICAgICAgICAgICAgICBOKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAiQWRkaW5nIGJhY2sgc3RhY2sgaW5kZXggIiArIGluZGV4ICsgIiB3aXRoICIgKyBic2UpOworICAgICAgICAgICAgICAgIG1CYWNrU3RhY2tJbmRpY2VzLmFkZChic2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZnJlZUJhY2tTdGFja0luZGV4KGludCBpbmRleCkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIG1CYWNrU3RhY2tJbmRpY2VzLnNldChpbmRleCwgbnVsbCk7CisgICAgICAgICAgICBpZiAobUF2YWlsQmFja1N0YWNrSW5kaWNlcyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUF2YWlsQmFja1N0YWNrSW5kaWNlcyA9IG5ldyBBcnJheUxpc3Q8SW50ZWdlcj4oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAiRnJlZWluZyBiYWNrIHN0YWNrIGluZGV4ICIgKyBpbmRleCk7CisgICAgICAgICAgICBtQXZhaWxCYWNrU3RhY2tJbmRpY2VzLmFkZChpbmRleCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPbmx5IGNhbGwgZnJvbSBtYWluIHRocmVhZCEKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBleGVjUGVuZGluZ0FjdGlvbnMoKSB7CisgICAgICAgIGlmIChtRXhlY3V0aW5nQWN0aW9ucykgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiUmVjdXJzaXZlIGVudHJ5IHRvIGV4ZWNQZW5kaW5nQWN0aW9ucyIpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgaW50IG51bUFjdGlvbnM7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgICAgIGlmIChtUGVuZGluZ0FjdGlvbnMgPT0gbnVsbCB8fCBtUGVuZGluZ0FjdGlvbnMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBudW1BY3Rpb25zID0gbVBlbmRpbmdBY3Rpb25zLnNpemUoKTsKKyAgICAgICAgICAgICAgICBpZiAobVRtcEFjdGlvbnMgPT0gbnVsbCB8fCBtVG1wQWN0aW9ucy5sZW5ndGggPCBudW1BY3Rpb25zKSB7CisgICAgICAgICAgICAgICAgICAgIG1UbXBBY3Rpb25zID0gbmV3IFJ1bm5hYmxlW251bUFjdGlvbnNdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtUGVuZGluZ0FjdGlvbnMudG9BcnJheShtVG1wQWN0aW9ucyk7CisgICAgICAgICAgICAgICAgbVBlbmRpbmdBY3Rpb25zLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgbUFjdGl2aXR5Lm1IYW5kbGVyLnJlbW92ZUNhbGxiYWNrcyhtRXhlY0NvbW1pdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIG1FeGVjdXRpbmdBY3Rpb25zID0gdHJ1ZTsKKyAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxudW1BY3Rpb25zOyBpKyspIHsKKyAgICAgICAgICAgICAgICBtVG1wQWN0aW9uc1tpXS5ydW4oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1FeGVjdXRpbmdBY3Rpb25zID0gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgYWRkQmFja1N0YWNrU3RhdGUoQmFja1N0YWNrRW50cnkgc3RhdGUpIHsKKyAgICAgICAgaWYgKG1CYWNrU3RhY2sgPT0gbnVsbCkgeworICAgICAgICAgICAgbUJhY2tTdGFjayA9IG5ldyBBcnJheUxpc3Q8QmFja1N0YWNrRW50cnk+KCk7CisgICAgICAgIH0KKyAgICAgICAgbUJhY2tTdGFjay5hZGQoc3RhdGUpOworICAgIH0KKyAgICAKKyAgICBib29sZWFuIHBvcEJhY2tTdGFja1N0YXRlKEhhbmRsZXIgaGFuZGxlciwgU3RyaW5nIG5hbWUsIGludCBpZCwgaW50IGZsYWdzKSB7CisgICAgICAgIGlmIChtQmFja1N0YWNrID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAobmFtZSA9PSBudWxsICYmIGlkIDwgMCAmJiAoZmxhZ3MmQWN0aXZpdHkuUE9QX0JBQ0tfU1RBQ0tfSU5DTFVTSVZFKSA9PSAwKSB7CisgICAgICAgICAgICBpbnQgbGFzdCA9IG1CYWNrU3RhY2suc2l6ZSgpLTE7CisgICAgICAgICAgICBpZiAobGFzdCA8IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaW5hbCBCYWNrU3RhY2tFbnRyeSBic3MgPSBtQmFja1N0YWNrLnJlbW92ZShsYXN0KTsKKyAgICAgICAgICAgIGVucXVldWVBY3Rpb24obmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJQb3BwaW5nIGJhY2sgc3RhY2sgc3RhdGU6ICIgKyBic3MpOworICAgICAgICAgICAgICAgICAgICBic3MucG9wRnJvbUJhY2tTdGFjaygpOworICAgICAgICAgICAgICAgICAgICBtb3ZlVG9TdGF0ZShtQ3VyU3RhdGUsIHJldmVyc2VUcmFuc2l0KGJzcy5nZXRUcmFuc2l0aW9uKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJzcy5nZXRUcmFuc2l0aW9uU3R5bGUoKSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnQgaW5kZXggPSAtMTsKKyAgICAgICAgICAgIGlmIChuYW1lICE9IG51bGwgfHwgaWQgPj0gMCkgeworICAgICAgICAgICAgICAgIC8vIElmIGEgbmFtZSBvciBJRCBpcyBzcGVjaWZpZWQsIGxvb2sgZm9yIHRoYXQgcGxhY2UgaW4KKyAgICAgICAgICAgICAgICAvLyB0aGUgc3RhY2suCisgICAgICAgICAgICAgICAgaW5kZXggPSBtQmFja1N0YWNrLnNpemUoKS0xOworICAgICAgICAgICAgICAgIHdoaWxlIChpbmRleCA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIEJhY2tTdGFja0VudHJ5IGJzcyA9IG1CYWNrU3RhY2suZ2V0KGluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCAmJiBuYW1lLmVxdWFscyhic3MuZ2V0TmFtZSgpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGlkID49IDAgJiYgaWQgPT0gYnNzLm1JbmRleCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaW5kZXgtLTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICgoZmxhZ3MmQWN0aXZpdHkuUE9QX0JBQ0tfU1RBQ0tfSU5DTFVTSVZFKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGluZGV4LS07CisgICAgICAgICAgICAgICAgICAgIC8vIENvbnN1bWUgYWxsIGZvbGxvd2luZyBlbnRyaWVzIHRoYXQgbWF0Y2guCisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChpbmRleCA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBCYWNrU3RhY2tFbnRyeSBic3MgPSBtQmFja1N0YWNrLmdldChpbmRleCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWUgIT0gbnVsbCAmJiBuYW1lLmVxdWFscyhic3MuZ2V0TmFtZSgpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKGlkID49IDAgJiYgaWQgPT0gYnNzLm1JbmRleCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleC0tOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaW5kZXggPT0gbUJhY2tTdGFjay5zaXplKCktMSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbmFsIEFycmF5TGlzdDxCYWNrU3RhY2tFbnRyeT4gc3RhdGVzCisgICAgICAgICAgICAgICAgICAgID0gbmV3IEFycmF5TGlzdDxCYWNrU3RhY2tFbnRyeT4oKTsKKyAgICAgICAgICAgIGZvciAoaW50IGk9bUJhY2tTdGFjay5zaXplKCktMTsgaT5pbmRleDsgaS0tKSB7CisgICAgICAgICAgICAgICAgc3RhdGVzLmFkZChtQmFja1N0YWNrLnJlbW92ZShpKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbnF1ZXVlQWN0aW9uKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxzdGF0ZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAiUG9wcGluZyBiYWNrIHN0YWNrIHN0YXRlOiAiICsgc3RhdGVzLmdldChpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZXMuZ2V0KGkpLnBvcEZyb21CYWNrU3RhY2soKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtb3ZlVG9TdGF0ZShtQ3VyU3RhdGUsIHRydWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICAKKyAgICBBcnJheUxpc3Q8RnJhZ21lbnQ+IHJldGFpbk5vbkNvbmZpZygpIHsKKyAgICAgICAgQXJyYXlMaXN0PEZyYWdtZW50PiBmcmFnbWVudHMgPSBudWxsOworICAgICAgICBpZiAobUFjdGl2ZSAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8bUFjdGl2ZS5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIEZyYWdtZW50IGYgPSBtQWN0aXZlLmdldChpKTsKKyAgICAgICAgICAgICAgICBpZiAoZiAhPSBudWxsICYmIGYubVJldGFpbkluc3RhbmNlKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChmcmFnbWVudHMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZnJhZ21lbnRzID0gbmV3IEFycmF5TGlzdDxGcmFnbWVudD4oKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBmcmFnbWVudHMuYWRkKGYpOworICAgICAgICAgICAgICAgICAgICBmLm1SZXRhaW5pbmcgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZnJhZ21lbnRzOworICAgIH0KKyAgICAKKyAgICB2b2lkIHNhdmVGcmFnbWVudFZpZXdTdGF0ZShGcmFnbWVudCBmKSB7CisgICAgICAgIGlmIChmLm1WaWV3ID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAobVN0YXRlQXJyYXkgPT0gbnVsbCkgeworICAgICAgICAgICAgbVN0YXRlQXJyYXkgPSBuZXcgU3BhcnNlQXJyYXk8UGFyY2VsYWJsZT4oKTsKKyAgICAgICAgfQorICAgICAgICBmLm1WaWV3LnNhdmVIaWVyYXJjaHlTdGF0ZShtU3RhdGVBcnJheSk7CisgICAgICAgIGlmIChtU3RhdGVBcnJheS5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICBmLm1TYXZlZFZpZXdTdGF0ZSA9IG1TdGF0ZUFycmF5OworICAgICAgICAgICAgbVN0YXRlQXJyYXkgPSBudWxsOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIFBhcmNlbGFibGUgc2F2ZUFsbFN0YXRlKCkgeworICAgICAgICBpZiAobUFjdGl2ZSA9PSBudWxsIHx8IG1BY3RpdmUuc2l6ZSgpIDw9IDApIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBGaXJzdCBjb2xsZWN0IGFsbCBhY3RpdmUgZnJhZ21lbnRzLgorICAgICAgICBpbnQgTiA9IG1BY3RpdmUuc2l6ZSgpOworICAgICAgICBGcmFnbWVudFN0YXRlW10gYWN0aXZlID0gbmV3IEZyYWdtZW50U3RhdGVbTl07CisgICAgICAgIGJvb2xlYW4gaGF2ZUZyYWdtZW50cyA9IGZhbHNlOworICAgICAgICBmb3IgKGludCBpPTA7IGk8TjsgaSsrKSB7CisgICAgICAgICAgICBGcmFnbWVudCBmID0gbUFjdGl2ZS5nZXQoaSk7CisgICAgICAgICAgICBpZiAoZiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaGF2ZUZyYWdtZW50cyA9IHRydWU7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgRnJhZ21lbnRTdGF0ZSBmcyA9IG5ldyBGcmFnbWVudFN0YXRlKGYpOworICAgICAgICAgICAgICAgIGFjdGl2ZVtpXSA9IGZzOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmIChtU3RhdGVCdW5kbGUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBtU3RhdGVCdW5kbGUgPSBuZXcgQnVuZGxlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGYub25TYXZlSW5zdGFuY2VTdGF0ZShtU3RhdGVCdW5kbGUpOworICAgICAgICAgICAgICAgIGlmICghbVN0YXRlQnVuZGxlLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICBmcy5tU2F2ZWRGcmFnbWVudFN0YXRlID0gbVN0YXRlQnVuZGxlOworICAgICAgICAgICAgICAgICAgICBtU3RhdGVCdW5kbGUgPSBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpZiAoZi5tVmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHNhdmVGcmFnbWVudFZpZXdTdGF0ZShmKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGYubVNhdmVkVmlld1N0YXRlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmcy5tU2F2ZWRGcmFnbWVudFN0YXRlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcy5tU2F2ZWRGcmFnbWVudFN0YXRlID0gbmV3IEJ1bmRsZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZnMubVNhdmVkRnJhZ21lbnRTdGF0ZS5wdXRTcGFyc2VQYXJjZWxhYmxlQXJyYXkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYWdtZW50TWFuYWdlckltcGwuVklFV19TVEFURV9UQUcsIGYubVNhdmVkVmlld1N0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChmLm1UYXJnZXQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoZnMubVNhdmVkRnJhZ21lbnRTdGF0ZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmcy5tU2F2ZWRGcmFnbWVudFN0YXRlID0gbmV3IEJ1bmRsZSgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHB1dEZyYWdtZW50KGZzLm1TYXZlZEZyYWdtZW50U3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJhZ21lbnRNYW5hZ2VySW1wbC5UQVJHRVRfU1RBVEVfVEFHLCBmLm1UYXJnZXQpOworICAgICAgICAgICAgICAgICAgICBpZiAoZi5tVGFyZ2V0UmVxdWVzdENvZGUgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZnMubVNhdmVkRnJhZ21lbnRTdGF0ZS5wdXRJbnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYWdtZW50TWFuYWdlckltcGwuVEFSR0VUX1JFUVVFU1RfQ09ERV9TVEFURV9UQUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYubVRhcmdldFJlcXVlc3RDb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgIlNhdmVkIHN0YXRlIG9mICIgKyBmICsgIjogIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBmcy5tU2F2ZWRGcmFnbWVudFN0YXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKCFoYXZlRnJhZ21lbnRzKSB7CisgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgInNhdmVBbGxTdGF0ZTogbm8gZnJhZ21lbnRzISIpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGludFtdIGFkZGVkID0gbnVsbDsKKyAgICAgICAgQmFja1N0YWNrU3RhdGVbXSBiYWNrU3RhY2sgPSBudWxsOworICAgICAgICAKKyAgICAgICAgLy8gQnVpbGQgbGlzdCBvZiBjdXJyZW50bHkgYWRkZWQgZnJhZ21lbnRzLgorICAgICAgICBOID0gbUFkZGVkLnNpemUoKTsKKyAgICAgICAgaWYgKE4gPiAwKSB7CisgICAgICAgICAgICBhZGRlZCA9IG5ldyBpbnRbTl07CisgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8TjsgaSsrKSB7CisgICAgICAgICAgICAgICAgYWRkZWRbaV0gPSBtQWRkZWQuZ2V0KGkpLm1JbmRleDsKKyAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgInNhdmVBbGxTdGF0ZTogYWRkaW5nIGZyYWdtZW50ICMiICsgaQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiOiAiICsgbUFkZGVkLmdldChpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIE5vdyBzYXZlIGJhY2sgc3RhY2suCisgICAgICAgIGlmIChtQmFja1N0YWNrICE9IG51bGwpIHsKKyAgICAgICAgICAgIE4gPSBtQmFja1N0YWNrLnNpemUoKTsKKyAgICAgICAgICAgIGlmIChOID4gMCkgeworICAgICAgICAgICAgICAgIGJhY2tTdGFjayA9IG5ldyBCYWNrU3RhY2tTdGF0ZVtOXTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8TjsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGJhY2tTdGFja1tpXSA9IG5ldyBCYWNrU3RhY2tTdGF0ZSh0aGlzLCBtQmFja1N0YWNrLmdldChpKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAic2F2ZUFsbFN0YXRlOiBhZGRpbmcgYmFjayBzdGFjayAjIiArIGkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICI6ICIgKyBtQmFja1N0YWNrLmdldChpKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBGcmFnbWVudE1hbmFnZXJTdGF0ZSBmbXMgPSBuZXcgRnJhZ21lbnRNYW5hZ2VyU3RhdGUoKTsKKyAgICAgICAgZm1zLm1BY3RpdmUgPSBhY3RpdmU7CisgICAgICAgIGZtcy5tQWRkZWQgPSBhZGRlZDsKKyAgICAgICAgZm1zLm1CYWNrU3RhY2sgPSBiYWNrU3RhY2s7CisgICAgICAgIHJldHVybiBmbXM7CisgICAgfQorICAgIAorICAgIHZvaWQgcmVzdG9yZUFsbFN0YXRlKFBhcmNlbGFibGUgc3RhdGUsIEFycmF5TGlzdDxGcmFnbWVudD4gbm9uQ29uZmlnKSB7CisgICAgICAgIC8vIElmIHRoZXJlIGlzIG5vIHNhdmVkIHN0YXRlIGF0IGFsbCwgdGhlbiB0aGVyZSBjYW4gbm90IGJlCisgICAgICAgIC8vIGFueSBub25Db25maWcgZnJhZ21lbnRzIGVpdGhlciwgc28gdGhhdCBpcyB0aGF0LgorICAgICAgICBpZiAoc3RhdGUgPT0gbnVsbCkgcmV0dXJuOworICAgICAgICBGcmFnbWVudE1hbmFnZXJTdGF0ZSBmbXMgPSAoRnJhZ21lbnRNYW5hZ2VyU3RhdGUpc3RhdGU7CisgICAgICAgIGlmIChmbXMubUFjdGl2ZSA9PSBudWxsKSByZXR1cm47CisgICAgICAgIAorICAgICAgICAvLyBGaXJzdCByZS1hdHRhY2ggYW55IG5vbi1jb25maWcgaW5zdGFuY2VzIHdlIGFyZSByZXRhaW5pbmcgYmFjaworICAgICAgICAvLyB0byB0aGVpciBzYXZlZCBzdGF0ZSwgc28gd2UgZG9uJ3QgdHJ5IHRvIGluc3RhbnRpYXRlIHRoZW0gYWdhaW4uCisgICAgICAgIGlmIChub25Db25maWcgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPG5vbkNvbmZpZy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIEZyYWdtZW50IGYgPSBub25Db25maWcuZ2V0KGkpOworICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAicmVzdG9yZUFsbFN0YXRlOiByZS1hdHRhY2hpbmcgcmV0YWluZWQgIiArIGYpOworICAgICAgICAgICAgICAgIEZyYWdtZW50U3RhdGUgZnMgPSBmbXMubUFjdGl2ZVtmLm1JbmRleF07CisgICAgICAgICAgICAgICAgZnMubUluc3RhbmNlID0gZjsKKyAgICAgICAgICAgICAgICBmLm1TYXZlZFZpZXdTdGF0ZSA9IG51bGw7CisgICAgICAgICAgICAgICAgZi5tQmFja1N0YWNrTmVzdGluZyA9IDA7CisgICAgICAgICAgICAgICAgZi5tQWRkZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBpZiAoZnMubVNhdmVkRnJhZ21lbnRTdGF0ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGYubVNhdmVkVmlld1N0YXRlID0gZnMubVNhdmVkRnJhZ21lbnRTdGF0ZS5nZXRTcGFyc2VQYXJjZWxhYmxlQXJyYXkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJhZ21lbnRNYW5hZ2VySW1wbC5WSUVXX1NUQVRFX1RBRyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBCdWlsZCB0aGUgZnVsbCBsaXN0IG9mIGFjdGl2ZSBmcmFnbWVudHMsIGluc3RhbnRpYXRpbmcgdGhlbSBmcm9tCisgICAgICAgIC8vIHRoZWlyIHNhdmVkIHN0YXRlLgorICAgICAgICBtQWN0aXZlID0gbmV3IEFycmF5TGlzdDxGcmFnbWVudD4oZm1zLm1BY3RpdmUubGVuZ3RoKTsKKyAgICAgICAgaWYgKG1BdmFpbEluZGljZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgbUF2YWlsSW5kaWNlcy5jbGVhcigpOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGk9MDsgaTxmbXMubUFjdGl2ZS5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgRnJhZ21lbnRTdGF0ZSBmcyA9IGZtcy5tQWN0aXZlW2ldOworICAgICAgICAgICAgaWYgKGZzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBGcmFnbWVudCBmID0gZnMuaW5zdGFudGlhdGUobUFjdGl2aXR5KTsKKyAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgInJlc3RvcmVBbGxTdGF0ZTogYWRkaW5nICMiICsgaSArICI6ICIgKyBmKTsKKyAgICAgICAgICAgICAgICBtQWN0aXZlLmFkZChmKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJyZXN0b3JlQWxsU3RhdGU6IGFkZGluZyAjIiArIGkgKyAiOiAobnVsbCkiKTsKKyAgICAgICAgICAgICAgICBtQWN0aXZlLmFkZChudWxsKTsKKyAgICAgICAgICAgICAgICBpZiAobUF2YWlsSW5kaWNlcyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG1BdmFpbEluZGljZXMgPSBuZXcgQXJyYXlMaXN0PEludGVnZXI+KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAicmVzdG9yZUFsbFN0YXRlOiBhZGRpbmcgYXZhaWwgIyIgKyBpKTsKKyAgICAgICAgICAgICAgICBtQXZhaWxJbmRpY2VzLmFkZChpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gQnVpbGQgdGhlIGxpc3Qgb2YgY3VycmVudGx5IGFkZGVkIGZyYWdtZW50cy4KKyAgICAgICAgaWYgKGZtcy5tQWRkZWQgIT0gbnVsbCkgeworICAgICAgICAgICAgbUFkZGVkID0gbmV3IEFycmF5TGlzdDxGcmFnbWVudD4oZm1zLm1BZGRlZC5sZW5ndGgpOworICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPGZtcy5tQWRkZWQubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBGcmFnbWVudCBmID0gbUFjdGl2ZS5nZXQoZm1zLm1BZGRlZFtpXSk7CisgICAgICAgICAgICAgICAgaWYgKGYgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJObyBpbnN0YW50aWF0ZWQgZnJhZ21lbnQgZm9yIGluZGV4ICMiICsgZm1zLm1BZGRlZFtpXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGYubUFkZGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBmLm1JbW1lZGlhdGVBY3Rpdml0eSA9IG1BY3Rpdml0eTsKKyAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgInJlc3RvcmVBbGxTdGF0ZTogbWFraW5nIGFkZGVkICMiICsgaSArICI6ICIgKyBmKTsKKyAgICAgICAgICAgICAgICBtQWRkZWQuYWRkKGYpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUFkZGVkID0gbnVsbDsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gQnVpbGQgdGhlIGJhY2sgc3RhY2suCisgICAgICAgIGlmIChmbXMubUJhY2tTdGFjayAhPSBudWxsKSB7CisgICAgICAgICAgICBtQmFja1N0YWNrID0gbmV3IEFycmF5TGlzdDxCYWNrU3RhY2tFbnRyeT4oZm1zLm1CYWNrU3RhY2subGVuZ3RoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxmbXMubUJhY2tTdGFjay5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIEJhY2tTdGFja0VudHJ5IGJzZSA9IGZtcy5tQmFja1N0YWNrW2ldLmluc3RhbnRpYXRlKHRoaXMpOworICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAicmVzdG9yZUFsbFN0YXRlOiBhZGRpbmcgYnNlICMiICsgaQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiIChpbmRleCAiICsgYnNlLm1JbmRleCArICIpOiAiICsgYnNlKTsKKyAgICAgICAgICAgICAgICBtQmFja1N0YWNrLmFkZChic2UpOworICAgICAgICAgICAgICAgIGlmIChic2UubUluZGV4ID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0QmFja1N0YWNrSW5kZXgoYnNlLm1JbmRleCwgYnNlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtQmFja1N0YWNrID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBhdHRhY2hBY3Rpdml0eShBY3Rpdml0eSBhY3Rpdml0eSkgeworICAgICAgICBpZiAobUFjdGl2aXR5ICE9IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKKyAgICAgICAgbUFjdGl2aXR5ID0gYWN0aXZpdHk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIGRpc3BhdGNoQ3JlYXRlKCkgeworICAgICAgICBtb3ZlVG9TdGF0ZShGcmFnbWVudC5DUkVBVEVELCBmYWxzZSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIGRpc3BhdGNoQWN0aXZpdHlDcmVhdGVkKCkgeworICAgICAgICBtb3ZlVG9TdGF0ZShGcmFnbWVudC5BQ1RJVklUWV9DUkVBVEVELCBmYWxzZSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIGRpc3BhdGNoU3RhcnQoKSB7CisgICAgICAgIG1vdmVUb1N0YXRlKEZyYWdtZW50LlNUQVJURUQsIGZhbHNlKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgZGlzcGF0Y2hSZXN1bWUoKSB7CisgICAgICAgIG1vdmVUb1N0YXRlKEZyYWdtZW50LlJFU1VNRUQsIGZhbHNlKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgZGlzcGF0Y2hQYXVzZSgpIHsKKyAgICAgICAgbW92ZVRvU3RhdGUoRnJhZ21lbnQuU1RBUlRFRCwgZmFsc2UpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBkaXNwYXRjaFN0b3AoKSB7CisgICAgICAgIG1vdmVUb1N0YXRlKEZyYWdtZW50LkFDVElWSVRZX0NSRUFURUQsIGZhbHNlKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgZGlzcGF0Y2hEZXN0cm95KCkgeworICAgICAgICBtb3ZlVG9TdGF0ZShGcmFnbWVudC5JTklUSUFMSVpJTkcsIGZhbHNlKTsKKyAgICAgICAgbUFjdGl2aXR5ID0gbnVsbDsKKyAgICB9CisgICAgCisgICAgcHVibGljIGJvb2xlYW4gZGlzcGF0Y2hDcmVhdGVPcHRpb25zTWVudShNZW51IG1lbnUsIE1lbnVJbmZsYXRlciBpbmZsYXRlcikgeworICAgICAgICBib29sZWFuIHNob3cgPSBmYWxzZTsKKyAgICAgICAgaWYgKG1BY3RpdmUgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPG1BZGRlZC5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIEZyYWdtZW50IGYgPSBtQWRkZWQuZ2V0KGkpOworICAgICAgICAgICAgICAgIGlmIChmICE9IG51bGwgJiYgIWYubUhpZGRlbiAmJiBmLm1IYXNNZW51KSB7CisgICAgICAgICAgICAgICAgICAgIHNob3cgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBmLm9uQ3JlYXRlT3B0aW9uc01lbnUobWVudSwgaW5mbGF0ZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc2hvdzsKKyAgICB9CisgICAgCisgICAgcHVibGljIGJvb2xlYW4gZGlzcGF0Y2hQcmVwYXJlT3B0aW9uc01lbnUoTWVudSBtZW51KSB7CisgICAgICAgIGJvb2xlYW4gc2hvdyA9IGZhbHNlOworICAgICAgICBpZiAobUFjdGl2ZSAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8bUFkZGVkLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgRnJhZ21lbnQgZiA9IG1BZGRlZC5nZXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKGYgIT0gbnVsbCAmJiAhZi5tSGlkZGVuICYmIGYubUhhc01lbnUpIHsKKyAgICAgICAgICAgICAgICAgICAgc2hvdyA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGYub25QcmVwYXJlT3B0aW9uc01lbnUobWVudSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBzaG93OworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgYm9vbGVhbiBkaXNwYXRjaE9wdGlvbnNJdGVtU2VsZWN0ZWQoTWVudUl0ZW0gaXRlbSkgeworICAgICAgICBpZiAobUFjdGl2ZSAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8bUFkZGVkLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgRnJhZ21lbnQgZiA9IG1BZGRlZC5nZXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKGYgIT0gbnVsbCAmJiAhZi5tSGlkZGVuICYmIGYubUhhc01lbnUpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGYub25PcHRpb25zSXRlbVNlbGVjdGVkKGl0ZW0pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBib29sZWFuIGRpc3BhdGNoQ29udGV4dEl0ZW1TZWxlY3RlZChNZW51SXRlbSBpdGVtKSB7CisgICAgICAgIGlmIChtQWN0aXZlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxtQWRkZWQuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBGcmFnbWVudCBmID0gbUFkZGVkLmdldChpKTsKKyAgICAgICAgICAgICAgICBpZiAoZiAhPSBudWxsICYmICFmLm1IaWRkZW4pIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGYub25Db250ZXh0SXRlbVNlbGVjdGVkKGl0ZW0pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIGRpc3BhdGNoT3B0aW9uc01lbnVDbG9zZWQoTWVudSBtZW51KSB7CisgICAgICAgIGlmIChtQWN0aXZlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxtQWRkZWQuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBGcmFnbWVudCBmID0gbUFkZGVkLmdldChpKTsKKyAgICAgICAgICAgICAgICBpZiAoZiAhPSBudWxsICYmICFmLm1IaWRkZW4gJiYgZi5tSGFzTWVudSkgeworICAgICAgICAgICAgICAgICAgICBmLm9uT3B0aW9uc01lbnVDbG9zZWQobWVudSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIAorICAgIHB1YmxpYyBzdGF0aWMgaW50IHJldmVyc2VUcmFuc2l0KGludCB0cmFuc2l0KSB7CisgICAgICAgIGludCByZXYgPSAwOworICAgICAgICBzd2l0Y2ggKHRyYW5zaXQpIHsKKyAgICAgICAgICAgIGNhc2UgRnJhZ21lbnRUcmFuc2FjdGlvbi5UUkFOU0lUX0ZSQUdNRU5UX09QRU46CisgICAgICAgICAgICAgICAgcmV2ID0gRnJhZ21lbnRUcmFuc2FjdGlvbi5UUkFOU0lUX0ZSQUdNRU5UX0NMT1NFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBGcmFnbWVudFRyYW5zYWN0aW9uLlRSQU5TSVRfRlJBR01FTlRfQ0xPU0U6CisgICAgICAgICAgICAgICAgcmV2ID0gRnJhZ21lbnRUcmFuc2FjdGlvbi5UUkFOU0lUX0ZSQUdNRU5UX09QRU47CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldjsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIHB1YmxpYyBzdGF0aWMgaW50IHRyYW5zaXRUb1N0eWxlSW5kZXgoaW50IHRyYW5zaXQsIGJvb2xlYW4gZW50ZXIpIHsKKyAgICAgICAgaW50IGFuaW1BdHRyID0gLTE7CisgICAgICAgIHN3aXRjaCAodHJhbnNpdCkgeworICAgICAgICAgICAgY2FzZSBGcmFnbWVudFRyYW5zYWN0aW9uLlRSQU5TSVRfRlJBR01FTlRfT1BFTjoKKyAgICAgICAgICAgICAgICBhbmltQXR0ciA9IGVudGVyCisgICAgICAgICAgICAgICAgICAgID8gY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuRnJhZ21lbnRBbmltYXRpb25fZnJhZ21lbnRPcGVuRW50ZXJBbmltYXRpb24KKyAgICAgICAgICAgICAgICAgICAgOiBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5GcmFnbWVudEFuaW1hdGlvbl9mcmFnbWVudE9wZW5FeGl0QW5pbWF0aW9uOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBGcmFnbWVudFRyYW5zYWN0aW9uLlRSQU5TSVRfRlJBR01FTlRfQ0xPU0U6CisgICAgICAgICAgICAgICAgYW5pbUF0dHIgPSBlbnRlcgorICAgICAgICAgICAgICAgICAgICA/IGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkZyYWdtZW50QW5pbWF0aW9uX2ZyYWdtZW50Q2xvc2VFbnRlckFuaW1hdGlvbgorICAgICAgICAgICAgICAgICAgICA6IGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkZyYWdtZW50QW5pbWF0aW9uX2ZyYWdtZW50Q2xvc2VFeGl0QW5pbWF0aW9uOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHJldHVybiBhbmltQXR0cjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvRnJhZ21lbnRUcmFuc2FjdGlvbi5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0ZyYWdtZW50VHJhbnNhY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDU5OGEzCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0ZyYWdtZW50VHJhbnNhY3Rpb24uamF2YQpAQCAtMCwwICsxLDEyNSBAQAorcGFja2FnZSBhbmRyb2lkLmFwcDsKKworLyoqCisgKiBBUEkgZm9yIHBlcmZvcm1pbmcgYSBzZXQgb2YgRnJhZ21lbnQgb3BlcmF0aW9ucy4KKyAqLworcHVibGljIGludGVyZmFjZSBGcmFnbWVudFRyYW5zYWN0aW9uIHsKKyAgICAvKioKKyAgICAgKiBDYWxscyB7QGxpbmsgI2FkZChpbnQsIEZyYWdtZW50LCBTdHJpbmcpfSB3aXRoIGEgMCBjb250YWluZXJWaWV3SWQuCisgICAgICovCisgICAgcHVibGljIEZyYWdtZW50VHJhbnNhY3Rpb24gYWRkKEZyYWdtZW50IGZyYWdtZW50LCBTdHJpbmcgdGFnKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBDYWxscyB7QGxpbmsgI2FkZChpbnQsIEZyYWdtZW50LCBTdHJpbmcpfSB3aXRoIGEgbnVsbCB0YWcuCisgICAgICovCisgICAgcHVibGljIEZyYWdtZW50VHJhbnNhY3Rpb24gYWRkKGludCBjb250YWluZXJWaWV3SWQsIEZyYWdtZW50IGZyYWdtZW50KTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBBZGQgYSBmcmFnbWVudCB0byB0aGUgYWN0aXZpdHkgc3RhdGUuICBUaGlzIGZyYWdtZW50IG1heSBvcHRpb25hbGx5CisgICAgICogYWxzbyBoYXZlIGl0cyB2aWV3IChpZiB7QGxpbmsgRnJhZ21lbnQjb25DcmVhdGVWaWV3IEZyYWdtZW50Lm9uQ3JlYXRlVmlld30KKyAgICAgKiByZXR1cm5zIG5vbi1udWxsKSBpbnRvIGEgY29udGFpbmVyIHZpZXcgb2YgdGhlIGFjdGl2aXR5LgorICAgICAqIAorICAgICAqIEBwYXJhbSBjb250YWluZXJWaWV3SWQgT3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgY29udGFpbmVyIHRoaXMgZnJhZ21lbnQgaXMKKyAgICAgKiB0byBiZSBwbGFjZWQgaW4uICBJZiAwLCBpdCB3aWxsIG5vdCBiZSBwbGFjZWQgaW4gYSBjb250YWluZXIuCisgICAgICogQHBhcmFtIGZyYWdtZW50IFRoZSBmcmFnbWVudCB0byBiZSBhZGRlZC4gIFRoaXMgZnJhZ21lbnQgbXVzdCBub3QgYWxyZWFkeQorICAgICAqIGJlIGFkZGVkIHRvIHRoZSBhY3Rpdml0eS4KKyAgICAgKiBAcGFyYW0gdGFnIE9wdGlvbmFsIHRhZyBuYW1lIGZvciB0aGUgZnJhZ21lbnQsIHRvIGxhdGVyIHJldHJpZXZlIHRoZQorICAgICAqIGZyYWdtZW50IHdpdGgge0BsaW5rIEFjdGl2aXR5I2ZpbmRGcmFnbWVudEJ5VGFnKFN0cmluZykKKyAgICAgKiBBY3Rpdml0eS5maW5kRnJhZ21lbnRCeVRhZyhTdHJpbmcpfS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHNhbWUgRnJhZ21lbnRUcmFuc2FjdGlvbiBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgRnJhZ21lbnRUcmFuc2FjdGlvbiBhZGQoaW50IGNvbnRhaW5lclZpZXdJZCwgRnJhZ21lbnQgZnJhZ21lbnQsIFN0cmluZyB0YWcpOworICAgIAorICAgIC8qKgorICAgICAqIENhbGxzIHtAbGluayAjcmVwbGFjZShpbnQsIEZyYWdtZW50LCBTdHJpbmcpfSB3aXRoIGEgbnVsbCB0YWcuCisgICAgICovCisgICAgcHVibGljIEZyYWdtZW50VHJhbnNhY3Rpb24gcmVwbGFjZShpbnQgY29udGFpbmVyVmlld0lkLCBGcmFnbWVudCBmcmFnbWVudCk7CisgICAgCisgICAgLyoqCisgICAgICogUmVwbGFjZSBhbiBleGlzdGluZyBmcmFnbWVudCB0aGF0IHdhcyBhZGRlZCB0byBhIGNvbnRhaW5lci4gIFRoaXMgaXMKKyAgICAgKiBlc3NlbnRpYWxseSB0aGUgc2FtZSBhcyBjYWxsaW5nIHtAbGluayAjcmVtb3ZlKEZyYWdtZW50KX0gZm9yIGFsbAorICAgICAqIGN1cnJlbnRseSBhZGRlZCBmcmFnbWVudHMgdGhhdCB3ZXJlIGFkZGVkIHdpdGggdGhlIHNhbWUgY29udGFpbmVyVmlld0lkCisgICAgICogYW5kIHRoZW4ge0BsaW5rICNhZGQoaW50LCBGcmFnbWVudCwgU3RyaW5nKX0gd2l0aCB0aGUgc2FtZSBhcmd1bWVudHMKKyAgICAgKiBnaXZlbiBoZXJlLgorICAgICAqIAorICAgICAqIEBwYXJhbSBjb250YWluZXJWaWV3SWQgSWRlbnRpZmllciBvZiB0aGUgY29udGFpbmVyIHdob3NlIGZyYWdtZW50KHMpIGFyZQorICAgICAqIHRvIGJlIHJlcGxhY2VkLgorICAgICAqIEBwYXJhbSBmcmFnbWVudCBUaGUgbmV3IGZyYWdtZW50IHRvIHBsYWNlIGluIHRoZSBjb250YWluZXIuCisgICAgICogQHBhcmFtIHRhZyBPcHRpb25hbCB0YWcgbmFtZSBmb3IgdGhlIGZyYWdtZW50LCB0byBsYXRlciByZXRyaWV2ZSB0aGUKKyAgICAgKiBmcmFnbWVudCB3aXRoIHtAbGluayBBY3Rpdml0eSNmaW5kRnJhZ21lbnRCeVRhZyhTdHJpbmcpCisgICAgICogQWN0aXZpdHkuZmluZEZyYWdtZW50QnlUYWcoU3RyaW5nKX0uCisgICAgICogCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBzYW1lIEZyYWdtZW50VHJhbnNhY3Rpb24gaW5zdGFuY2UuCisgICAgICovCisgICAgcHVibGljIEZyYWdtZW50VHJhbnNhY3Rpb24gcmVwbGFjZShpbnQgY29udGFpbmVyVmlld0lkLCBGcmFnbWVudCBmcmFnbWVudCwgU3RyaW5nIHRhZyk7CisgICAgCisgICAgLyoqCisgICAgICogUmVtb3ZlIGFuIGV4aXN0aW5nIGZyYWdtZW50LiAgSWYgaXQgd2FzIGFkZGVkIHRvIGEgY29udGFpbmVyLCBpdHMgdmlldworICAgICAqIGlzIGFsc28gcmVtb3ZlZCBmcm9tIHRoYXQgY29udGFpbmVyLgorICAgICAqIAorICAgICAqIEBwYXJhbSBmcmFnbWVudCBUaGUgZnJhZ21lbnQgdG8gYmUgcmVtb3ZlZC4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHNhbWUgRnJhZ21lbnRUcmFuc2FjdGlvbiBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgRnJhZ21lbnRUcmFuc2FjdGlvbiByZW1vdmUoRnJhZ21lbnQgZnJhZ21lbnQpOworICAgIAorICAgIC8qKgorICAgICAqIEhpZGVzIGFuIGV4aXN0aW5nIGZyYWdtZW50LiAgVGhpcyBpcyBvbmx5IHJlbGV2YW50IGZvciBmcmFnbWVudHMgd2hvc2UKKyAgICAgKiB2aWV3cyBoYXZlIGJlZW4gYWRkZWQgdG8gYSBjb250YWluZXIsIGFzIHRoaXMgd2lsbCBjYXVzZSB0aGUgdmlldyB0bworICAgICAqIGJlIGhpZGRlbi4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZnJhZ21lbnQgVGhlIGZyYWdtZW50IHRvIGJlIGhpZGRlbi4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHNhbWUgRnJhZ21lbnRUcmFuc2FjdGlvbiBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgRnJhZ21lbnRUcmFuc2FjdGlvbiBoaWRlKEZyYWdtZW50IGZyYWdtZW50KTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBIaWRlcyBhIHByZXZpb3VzbHkgaGlkZGVuIGZyYWdtZW50LiAgVGhpcyBpcyBvbmx5IHJlbGV2YW50IGZvciBmcmFnbWVudHMgd2hvc2UKKyAgICAgKiB2aWV3cyBoYXZlIGJlZW4gYWRkZWQgdG8gYSBjb250YWluZXIsIGFzIHRoaXMgd2lsbCBjYXVzZSB0aGUgdmlldyB0bworICAgICAqIGJlIHNob3duLgorICAgICAqIAorICAgICAqIEBwYXJhbSBmcmFnbWVudCBUaGUgZnJhZ21lbnQgdG8gYmUgc2hvd24uCisgICAgICogCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBzYW1lIEZyYWdtZW50VHJhbnNhY3Rpb24gaW5zdGFuY2UuCisgICAgICovCisgICAgcHVibGljIEZyYWdtZW50VHJhbnNhY3Rpb24gc2hvdyhGcmFnbWVudCBmcmFnbWVudCk7CisgICAgCisgICAgLyoqCisgICAgICogQml0IG1hc2sgdGhhdCBpcyBzZXQgZm9yIGFsbCBlbnRlciB0cmFuc2l0aW9ucy4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgaW50IFRSQU5TSVRfRU5URVJfTUFTSyA9IDB4MTAwMDsKKyAgICAKKyAgICAvKioKKyAgICAgKiBCaXQgbWFzayB0aGF0IGlzIHNldCBmb3IgYWxsIGV4aXQgdHJhbnNpdGlvbnMuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIGludCBUUkFOU0lUX0VYSVRfTUFTSyA9IDB4MjAwMDsKKyAgICAKKyAgICAvKiogTm90IHNldCB1cCBmb3IgYSB0cmFuc2l0aW9uLiAqLworICAgIHB1YmxpYyBmaW5hbCBpbnQgVFJBTlNJVF9VTlNFVCA9IC0xOworICAgIC8qKiBObyBhbmltYXRpb24gZm9yIHRyYW5zaXRpb24uICovCisgICAgcHVibGljIGZpbmFsIGludCBUUkFOU0lUX05PTkUgPSAwOworICAgIC8qKiBGcmFnbWVudCBpcyBiZWluZyBhZGRlZCAqLworICAgIHB1YmxpYyBmaW5hbCBpbnQgVFJBTlNJVF9GUkFHTUVOVF9PUEVOID0gMSB8IFRSQU5TSVRfRU5URVJfTUFTSzsKKyAgICAvKiogRnJhZ21lbnQgaXMgYmVpbmcgcmVtb3ZlZCAqLworICAgIHB1YmxpYyBmaW5hbCBpbnQgVFJBTlNJVF9GUkFHTUVOVF9DTE9TRSA9IDIgfCBUUkFOU0lUX0VYSVRfTUFTSzsKKworICAgIHB1YmxpYyBGcmFnbWVudFRyYW5zYWN0aW9uIHNldEN1c3RvbUFuaW1hdGlvbnMoaW50IGVudGVyLCBpbnQgZXhpdCk7CisgICAgCisgICAgcHVibGljIEZyYWdtZW50VHJhbnNhY3Rpb24gc2V0VHJhbnNpdGlvbihpbnQgdHJhbnNpdCk7CisgICAgcHVibGljIEZyYWdtZW50VHJhbnNhY3Rpb24gc2V0VHJhbnNpdGlvblN0eWxlKGludCBzdHlsZVJlcyk7CisgICAgCisgICAgcHVibGljIEZyYWdtZW50VHJhbnNhY3Rpb24gYWRkVG9CYWNrU3RhY2soU3RyaW5nIG5hbWUpOworCisgICAgLyoqCisgICAgICogU2NoZWR1bGVzIGEgY29tbWl0IG9mIHRoaXMgdHJhbnNhY3Rpb24uICBOb3RlIHRoYXQgdGhlIGNvbW1pdCBkb2VzCisgICAgICogbm90IGhhcHBlbiBpbW1lZGlhdGVseTsgaXQgd2lsbCBiZSBzY2hlZHVsZWQgYXMgd29yayBvbiB0aGUgbWFpbiB0aHJlYWQKKyAgICAgKiB0byBiZSBkb25lIHRoZSBuZXh0IHRpbWUgdGhhdCB0aHJlYWQgaXMgcmVhZHkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGlkZW50aWZpZXIgb2YgdGhpcyB0cmFuc2FjdGlvbidzIGJhY2sgc3RhY2sgZW50cnksCisgICAgICogaWYge0BsaW5rICNhZGRUb0JhY2tTdGFjayhTdHJpbmcpfSBoYWQgYmVlbiBjYWxsZWQuICBPdGhlcndpc2UsIHJldHVybnMKKyAgICAgKiBhIG5lZ2F0aXZlIG51bWJlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGNvbW1pdCgpOworfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0lBY3Rpdml0eU1hbmFnZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9JQWN0aXZpdHlNYW5hZ2VyLmphdmEKaW5kZXggNDE2ZjI4OS4uNTUxNDU4MiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0lBY3Rpdml0eU1hbmFnZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvSUFjdGl2aXR5TWFuYWdlci5qYXZhCkBAIC0zMTcsNyArMzE3LDExIEBACiAgICAgCiAgICAgcHVibGljIHZvaWQgY3Jhc2hBcHBsaWNhdGlvbihpbnQgdWlkLCBpbnQgaW5pdGlhbFBpZCwgU3RyaW5nIHBhY2thZ2VOYW1lLAogICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UpIHRocm93cyBSZW1vdGVFeGNlcHRpb247Ci0gICAgCisKKyAgICAvLyBDYXVzZSB0aGUgc3BlY2lmaWVkIHByb2Nlc3MgdG8gZHVtcCB0aGUgc3BlY2lmaWVkIGhlYXAuCisgICAgcHVibGljIGJvb2xlYW4gZHVtcEhlYXAoU3RyaW5nIHByb2Nlc3MsIGJvb2xlYW4gbWFuYWdlZCwgU3RyaW5nIHBhdGgsCisgICAgICAgIFBhcmNlbEZpbGVEZXNjcmlwdG9yIGZkKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uOworCiAgICAgLyoKICAgICAgKiBQcml2YXRlIG5vbi1CaW5kZXIgaW50ZXJmYWNlcwogICAgICAqLwpAQCAtNTI0LDQgKzUyOCw1IEBACiAgICAgaW50IFNFVF9JTU1FUlNJVkVfVFJBTlNBQ1RJT04gPSBJQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04rMTExOwogICAgIGludCBJU19UT1BfQUNUSVZJVFlfSU1NRVJTSVZFX1RSQU5TQUNUSU9OID0gSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OKzExMjsKICAgICBpbnQgQ1JBU0hfQVBQTElDQVRJT05fVFJBTlNBQ1RJT04gPSBJQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04rMTEzOworICAgIGludCBEVU1QX0hFQVBfVFJBTlNBQ1RJT04gPSBJQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04rMTE0OwogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0lBcHBsaWNhdGlvblRocmVhZC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0lBcHBsaWNhdGlvblRocmVhZC5qYXZhCmluZGV4IGM4ZWYxN2YuLjAzOWJjYjkgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9JQXBwbGljYXRpb25UaHJlYWQuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvSUFwcGxpY2F0aW9uVGhyZWFkLmphdmEKQEAgLTk3LDYgKzk3LDggQEAKICAgICB2b2lkIHNjaGVkdWxlQWN0aXZpdHlDb25maWd1cmF0aW9uQ2hhbmdlZChJQmluZGVyIHRva2VuKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uOwogICAgIHZvaWQgcHJvZmlsZXJDb250cm9sKGJvb2xlYW4gc3RhcnQsIFN0cmluZyBwYXRoLCBQYXJjZWxGaWxlRGVzY3JpcHRvciBmZCkKICAgICAgICAgICAgIHRocm93cyBSZW1vdGVFeGNlcHRpb247CisgICAgdm9pZCBkdW1wSGVhcChib29sZWFuIG1hbmFnZWQsIFN0cmluZyBwYXRoLCBQYXJjZWxGaWxlRGVzY3JpcHRvciBmZCkKKyAgICAgICAgICAgIHRocm93cyBSZW1vdGVFeGNlcHRpb247CiAgICAgdm9pZCBzZXRTY2hlZHVsaW5nR3JvdXAoaW50IGdyb3VwKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uOwogICAgIHZvaWQgZ2V0TWVtb3J5SW5mbyhEZWJ1Zy5NZW1vcnlJbmZvIG91dEluZm8pIHRocm93cyBSZW1vdGVFeGNlcHRpb247CiAgICAgc3RhdGljIGZpbmFsIGludCBQQUNLQUdFX1JFTU9WRUQgPSAwOwpAQCAtMTQwLDQgKzE0Miw1IEBACiAgICAgaW50IFNDSEVEVUxFX1NVSUNJREVfVFJBTlNBQ1RJT04gPSBJQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04rMzI7CiAgICAgaW50IERJU1BBVENIX1BBQ0tBR0VfQlJPQURDQVNUX1RSQU5TQUNUSU9OID0gSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OKzMzOwogICAgIGludCBTQ0hFRFVMRV9DUkFTSF9UUkFOU0FDVElPTiA9IElCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiszNDsKKyAgICBpbnQgRFVNUF9IRUFQX1RSQU5TQUNUSU9OID0gSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OKzM1OwogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0luc3RydW1lbnRhdGlvbi5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0luc3RydW1lbnRhdGlvbi5qYXZhCmluZGV4IGI4YzNhYTMuLjRkNWYzNmEgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9JbnN0cnVtZW50YXRpb24uamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvSW5zdHJ1bWVudGF0aW9uLmphdmEKQEAgLTk5Nyw4ICs5OTcsMTAgQEAKICAgICAgICAgICAgIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gewogICAgICAgICBBY3Rpdml0eSBhY3Rpdml0eSA9IChBY3Rpdml0eSljbGF6ei5uZXdJbnN0YW5jZSgpOwogICAgICAgICBBY3Rpdml0eVRocmVhZCBhVGhyZWFkID0gbnVsbDsKLSAgICAgICAgYWN0aXZpdHkuYXR0YWNoKGNvbnRleHQsIGFUaHJlYWQsIHRoaXMsIHRva2VuLCBhcHBsaWNhdGlvbiwgaW50ZW50LCBpbmZvLCB0aXRsZSwKLSAgICAgICAgICAgICAgICBwYXJlbnQsIGlkLCBsYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlLCBuZXcgQ29uZmlndXJhdGlvbigpKTsKKyAgICAgICAgYWN0aXZpdHkuYXR0YWNoKGNvbnRleHQsIGFUaHJlYWQsIHRoaXMsIHRva2VuLCBhcHBsaWNhdGlvbiwgaW50ZW50LAorICAgICAgICAgICAgICAgIGluZm8sIHRpdGxlLCBwYXJlbnQsIGlkLAorICAgICAgICAgICAgICAgIChBY3Rpdml0eS5Ob25Db25maWd1cmF0aW9uSW5zdGFuY2VzKWxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgbmV3IENvbmZpZ3VyYXRpb24oKSk7CiAgICAgICAgIHJldHVybiBhY3Rpdml0eTsKICAgICB9CiAKQEAgLTEwNTgsMjEgKzEwNjAsMjMgQEAKICAgICB9CiAgICAgCiAgICAgcHVibGljIHZvaWQgY2FsbEFjdGl2aXR5T25EZXN0cm95KEFjdGl2aXR5IGFjdGl2aXR5KSB7Ci0gICAgICBpZiAobVdhaXRpbmdBY3Rpdml0aWVzICE9IG51bGwpIHsKLSAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1TeW5jKSB7Ci0gICAgICAgICAgICAgIGZpbmFsIGludCBOID0gbVdhaXRpbmdBY3Rpdml0aWVzLnNpemUoKTsKLSAgICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPE47IGkrKykgewotICAgICAgICAgICAgICAgICAgZmluYWwgQWN0aXZpdHlXYWl0ZXIgYXcgPSBtV2FpdGluZ0FjdGl2aXRpZXMuZ2V0KGkpOwotICAgICAgICAgICAgICAgICAgZmluYWwgSW50ZW50IGludGVudCA9IGF3LmludGVudDsKLSAgICAgICAgICAgICAgICAgIGlmIChpbnRlbnQuZmlsdGVyRXF1YWxzKGFjdGl2aXR5LmdldEludGVudCgpKSkgewotICAgICAgICAgICAgICAgICAgICAgIGF3LmFjdGl2aXR5ID0gYWN0aXZpdHk7Ci0gICAgICAgICAgICAgICAgICAgICAgbU1lc3NhZ2VRdWV1ZS5hZGRJZGxlSGFuZGxlcihuZXcgQWN0aXZpdHlHb2luZyhhdykpOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgfQorICAgICAgLy8gVE9ETzogdGhlIGZvbGxvd2luZyBibG9jayBjYXVzZXMgaW50ZXJtaXR0ZW50IGhhbmdzIHdoZW4gdXNpbmcgc3RhcnRBY3Rpdml0eQorICAgICAgLy8gdGVtcG9yYXJpbHkgY29tbWVudCBvdXQgdW50aWwgcm9vdCBjYXVzZSBpcyBmaXhlZCAoYnVnIDI2MzA2ODMpCisvLyAgICAgIGlmIChtV2FpdGluZ0FjdGl2aXRpZXMgIT0gbnVsbCkgeworLy8gICAgICAgICAgc3luY2hyb25pemVkIChtU3luYykgeworLy8gICAgICAgICAgICAgIGZpbmFsIGludCBOID0gbVdhaXRpbmdBY3Rpdml0aWVzLnNpemUoKTsKKy8vICAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8TjsgaSsrKSB7CisvLyAgICAgICAgICAgICAgICAgIGZpbmFsIEFjdGl2aXR5V2FpdGVyIGF3ID0gbVdhaXRpbmdBY3Rpdml0aWVzLmdldChpKTsKKy8vICAgICAgICAgICAgICAgICAgZmluYWwgSW50ZW50IGludGVudCA9IGF3LmludGVudDsKKy8vICAgICAgICAgICAgICAgICAgaWYgKGludGVudC5maWx0ZXJFcXVhbHMoYWN0aXZpdHkuZ2V0SW50ZW50KCkpKSB7CisvLyAgICAgICAgICAgICAgICAgICAgICBhdy5hY3Rpdml0eSA9IGFjdGl2aXR5OworLy8gICAgICAgICAgICAgICAgICAgICAgbU1lc3NhZ2VRdWV1ZS5hZGRJZGxlSGFuZGxlcihuZXcgQWN0aXZpdHlHb2luZyhhdykpOworLy8gICAgICAgICAgICAgICAgICB9CisvLyAgICAgICAgICAgICAgfQorLy8gICAgICAgICAgfQorLy8gICAgICB9CiAgICAgICAKLSAgICAgIGFjdGl2aXR5Lm9uRGVzdHJveSgpOworICAgICAgYWN0aXZpdHkucGVyZm9ybURlc3Ryb3koKTsKICAgICAgIAogICAgICAgaWYgKG1BY3Rpdml0eU1vbml0b3JzICE9IG51bGwpIHsKICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1TeW5jKSB7CkBAIC0xMzMxLDcgKzEzMzUsNyBAQAogICAgICAqICAgICAgICAgICAgICAgICAgICAgIGlzIGJlaW5nIHN0YXJ0ZWQuCiAgICAgICogQHBhcmFtIHRva2VuIEludGVybmFsIHRva2VuIGlkZW50aWZ5aW5nIHRvIHRoZSBzeXN0ZW0gd2hvIGlzIHN0YXJ0aW5nIAogICAgICAqICAgICAgICAgICAgICB0aGUgYWN0aXZpdHk7IG1heSBiZSBudWxsLgotICAgICAqIEBwYXJhbSB0YXJnZXQgV2hpY2ggYWN0aXZpdHkgaXMgcGVyZm9ybSB0aGUgc3RhcnQgKGFuZCB0aHVzIHJlY2VpdmluZyAKKyAgICAgKiBAcGFyYW0gdGFyZ2V0IFdoaWNoIGFjdGl2aXR5IGlzIHBlcmZvcm1pbmcgdGhlIHN0YXJ0IChhbmQgdGh1cyByZWNlaXZpbmcgCiAgICAgICogICAgICAgICAgICAgICBhbnkgcmVzdWx0KTsgbWF5IGJlIG51bGwgaWYgdGhpcyBjYWxsIGlzIG5vdCBiZWluZyBtYWRlCiAgICAgICogICAgICAgICAgICAgICBmcm9tIGFuIGFjdGl2aXR5LgogICAgICAqIEBwYXJhbSBpbnRlbnQgVGhlIGFjdHVhbCBJbnRlbnQgdG8gc3RhcnQuCkBAIC0xMzgxLDYgKzEzODUsNjQgQEAKICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQogCisgICAgLyoqCisgICAgICogTGlrZSB7QGxpbmsgI2V4ZWNTdGFydEFjdGl2aXR5KENvbnRleHQsIElCaW5kZXIsIElCaW5kZXIsIEFjdGl2aXR5LCBJbnRlbnQsIGludCl9LAorICAgICAqIGJ1dCBmb3IgY2FsbHMgZnJvbSBhIHsjbGluayBGcmFnbWVudH0uCisgICAgICogCisgICAgICogQHBhcmFtIHdobyBUaGUgQ29udGV4dCBmcm9tIHdoaWNoIHRoZSBhY3Rpdml0eSBpcyBiZWluZyBzdGFydGVkLgorICAgICAqIEBwYXJhbSBjb250ZXh0VGhyZWFkIFRoZSBtYWluIHRocmVhZCBvZiB0aGUgQ29udGV4dCBmcm9tIHdoaWNoIHRoZSBhY3Rpdml0eQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIGlzIGJlaW5nIHN0YXJ0ZWQuCisgICAgICogQHBhcmFtIHRva2VuIEludGVybmFsIHRva2VuIGlkZW50aWZ5aW5nIHRvIHRoZSBzeXN0ZW0gd2hvIGlzIHN0YXJ0aW5nIAorICAgICAqICAgICAgICAgICAgICB0aGUgYWN0aXZpdHk7IG1heSBiZSBudWxsLgorICAgICAqIEBwYXJhbSB0YXJnZXQgV2hpY2ggZnJhZ21lbnQgaXMgcGVyZm9ybWluZyB0aGUgc3RhcnQgKGFuZCB0aHVzIHJlY2VpdmluZyAKKyAgICAgKiAgICAgICAgICAgICAgIGFueSByZXN1bHQpLgorICAgICAqIEBwYXJhbSBpbnRlbnQgVGhlIGFjdHVhbCBJbnRlbnQgdG8gc3RhcnQuCisgICAgICogQHBhcmFtIHJlcXVlc3RDb2RlIElkZW50aWZpZXIgZm9yIHRoaXMgcmVxdWVzdCdzIHJlc3VsdDsgbGVzcyB0aGFuIHplcm8gCisgICAgICogICAgICAgICAgICAgICAgICAgIGlmIHRoZSBjYWxsZXIgaXMgbm90IGV4cGVjdGluZyBhIHJlc3VsdC4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIFRvIGZvcmNlIHRoZSByZXR1cm4gb2YgYSBwYXJ0aWN1bGFyIHJlc3VsdCwgcmV0dXJuIGFuIAorICAgICAqICAgICAgICAgQWN0aXZpdHlSZXN1bHQgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGRlc2lyZWQgZGF0YTsgb3RoZXJ3aXNlCisgICAgICogICAgICAgICByZXR1cm4gbnVsbC4gIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGFsd2F5cyByZXR1cm5zIG51bGwuCisgICAgICogIAorICAgICAqIEB0aHJvd3MgYW5kcm9pZC5jb250ZW50LkFjdGl2aXR5Tm90Rm91bmRFeGNlcHRpb24KKyAgICAgKiAKKyAgICAgKiBAc2VlIEFjdGl2aXR5I3N0YXJ0QWN0aXZpdHkoSW50ZW50KQorICAgICAqIEBzZWUgQWN0aXZpdHkjc3RhcnRBY3Rpdml0eUZvclJlc3VsdChJbnRlbnQsIGludCkKKyAgICAgKiBAc2VlIEFjdGl2aXR5I3N0YXJ0QWN0aXZpdHlGcm9tQ2hpbGQKKyAgICAgKiAKKyAgICAgKiB7QGhpZGV9CisgICAgICovCisgICAgcHVibGljIEFjdGl2aXR5UmVzdWx0IGV4ZWNTdGFydEFjdGl2aXR5KAorICAgICAgICBDb250ZXh0IHdobywgSUJpbmRlciBjb250ZXh0VGhyZWFkLCBJQmluZGVyIHRva2VuLCBGcmFnbWVudCB0YXJnZXQsCisgICAgICAgIEludGVudCBpbnRlbnQsIGludCByZXF1ZXN0Q29kZSkgeworICAgICAgICBJQXBwbGljYXRpb25UaHJlYWQgd2hvVGhyZWFkID0gKElBcHBsaWNhdGlvblRocmVhZCkgY29udGV4dFRocmVhZDsKKyAgICAgICAgaWYgKG1BY3Rpdml0eU1vbml0b3JzICE9IG51bGwpIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVN5bmMpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgTiA9IG1BY3Rpdml0eU1vbml0b3JzLnNpemUoKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8TjsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIEFjdGl2aXR5TW9uaXRvciBhbSA9IG1BY3Rpdml0eU1vbml0b3JzLmdldChpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFtLm1hdGNoKHdobywgbnVsbCwgaW50ZW50KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYW0ubUhpdHMrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhbS5pc0Jsb2NraW5nKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVxdWVzdENvZGUgPj0gMCA/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+IGxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2VzID0KLSAgICAgICAgICAgICAgICBtUGFyZW50LmdldExhc3ROb25Db25maWd1cmF0aW9uQ2hpbGRJbnN0YW5jZXMoKTsKLSAgICAgICAgICAgIE9iamVjdCBpbnN0YW5jZSA9IG51bGw7CisgICAgICAgICAgICBIYXNoTWFwPFN0cmluZywgT2JqZWN0PiBsYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcyA9CisgICAgICAgICAgICAgICAgICAgIG1QYXJlbnQuZ2V0TGFzdE5vbkNvbmZpZ3VyYXRpb25DaGlsZEluc3RhbmNlcygpOworICAgICAgICAgICAgT2JqZWN0IGluc3RhbmNlT2JqID0gbnVsbDsKICAgICAgICAgICAgIGlmIChsYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaW5zdGFuY2UgPSBsYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcy5nZXQoci5pZCk7CisgICAgICAgICAgICAgICAgaW5zdGFuY2VPYmogPSBsYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcy5nZXQoci5pZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBY3Rpdml0eS5Ob25Db25maWd1cmF0aW9uSW5zdGFuY2VzIGluc3RhbmNlID0gbnVsbDsKKyAgICAgICAgICAgIGlmIChpbnN0YW5jZU9iaiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaW5zdGFuY2UgPSBuZXcgQWN0aXZpdHkuTm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcygpOworICAgICAgICAgICAgICAgIGluc3RhbmNlLmFjdGl2aXR5ID0gaW5zdGFuY2VPYmo7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAKICAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gaGF2ZSBhbHdheXMgY3JlYXRlZCB0aGUgYWN0aXZpdHkuCkBAIC0zNDYsNyArMzQ5LDcgQEAKICAgICB9CiAKICAgICBwcml2YXRlIFdpbmRvdyBwZXJmb3JtRGVzdHJveShMb2NhbEFjdGl2aXR5UmVjb3JkIHIsIGJvb2xlYW4gZmluaXNoKSB7Ci0gICAgICAgIFdpbmRvdyB3aW4gPSBudWxsOworICAgICAgICBXaW5kb3cgd2luOwogICAgICAgICB3aW4gPSByLndpbmRvdzsKICAgICAgICAgaWYgKHIuY3VyU3RhdGUgPT0gUkVTVU1FRCAmJiAhZmluaXNoKSB7CiAgICAgICAgICAgICBwZXJmb3JtUGF1c2UociwgZmluaXNoKTsKQEAgLTM4MCw3ICszODMsOCBAQAogICAgICAgICBpZiAociAhPSBudWxsKSB7CiAgICAgICAgICAgICB3aW4gPSBwZXJmb3JtRGVzdHJveShyLCBmaW5pc2gpOwogICAgICAgICAgICAgaWYgKGZpbmlzaCkgewotICAgICAgICAgICAgICAgIG1BY3Rpdml0aWVzLnJlbW92ZShyKTsKKyAgICAgICAgICAgICAgICBtQWN0aXZpdGllcy5yZW1vdmUoaWQpOworICAgICAgICAgICAgICAgIG1BY3Rpdml0eUFycmF5LnJlbW92ZShyKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICByZXR1cm4gd2luOwpAQCAtNDQxLDEwICs0NDUsOCBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGRpc3BhdGNoQ3JlYXRlKEJ1bmRsZSBzdGF0ZSkgewogICAgICAgICBpZiAoc3RhdGUgIT0gbnVsbCkgewotICAgICAgICAgICAgZmluYWwgSXRlcmF0b3I8U3RyaW5nPiBpID0gc3RhdGUua2V5U2V0KCkuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIHdoaWxlIChpLmhhc05leHQoKSkgeworICAgICAgICAgICAgZm9yIChTdHJpbmcgaWQgOiBzdGF0ZS5rZXlTZXQoKSkgewogICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBpZCA9IGkubmV4dCgpOwogICAgICAgICAgICAgICAgICAgICBmaW5hbCBCdW5kbGUgYXN0YXRlID0gc3RhdGUuZ2V0QnVuZGxlKGlkKTsKICAgICAgICAgICAgICAgICAgICAgTG9jYWxBY3Rpdml0eVJlY29yZCByID0gbUFjdGl2aXRpZXMuZ2V0KGlkKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKHIgIT0gbnVsbCkgewpAQCAtNDU3LDkgKzQ1OSw3IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgICAgICAvLyBSZWNvdmVyIGZyb20gLWFsbC0gYXBwIGVycm9ycy4KLSAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLAotICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhjZXB0aW9uIHRocm93biB3aGVuIHJlc3RvcmluZyBMb2NhbEFjdGl2aXR5TWFuYWdlciBzdGF0ZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGUpOworICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJFeGNlcHRpb24gdGhyb3duIHdoZW4gcmVzdG9yaW5nIExvY2FsQWN0aXZpdHlNYW5hZ2VyIHN0YXRlIiwgZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvYWRtaW4vRGV2aWNlQWRtaW5JbmZvLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvYWRtaW4vRGV2aWNlQWRtaW5JbmZvLmphdmEKaW5kZXggMGJjZDY1Yy4uMjIzN2M4MiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL2FkbWluL0RldmljZUFkbWluSW5mby5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9hZG1pbi9EZXZpY2VBZG1pbkluZm8uamF2YQpAQCAtMTAzLDYgKzEwMywxNSBAQAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVTRVNfUE9MSUNZX1dJUEVfREFUQSA9IDQ7CiAKKyAgICAvKioKKyAgICAgKiBBIHR5cGUgb2YgcG9saWN5IHRoYXQgdGhpcyBkZXZpY2UgYWRtaW4gY2FuIHVzZTogYWJsZSB0byBzcGVjaWZ5IHRoZQorICAgICAqIGRldmljZSBHbG9iYWwgUHJveHksIHZpYSB7QGxpbmsgRGV2aWNlUG9saWN5TWFuYWdlciNzZXRHbG9iYWxQcm94eX0uCisgICAgICoKKyAgICAgKiA8cD5UbyBjb250cm9sIHRoaXMgcG9saWN5LCB0aGUgZGV2aWNlIGFkbWluIG11c3QgaGF2ZSBhICJzZXQtZ2xvYmFsLXByb3h5IgorICAgICAqIHRhZyBpbiB0aGUgInVzZXMtcG9saWNpZXMiIHNlY3Rpb24gb2YgaXRzIG1ldGEtZGF0YS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVU0VTX1BPTElDWV9TRVRTX0dMT0JBTF9QUk9YWSA9IDU7CisKICAgICAvKiogQGhpZGUgKi8KICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFBvbGljeUluZm8gewogICAgICAgICBwdWJsaWMgZmluYWwgaW50IGlkZW50OwpAQCAtMTM4LDYgKzE0Nyw5IEBACiAgICAgICAgIHNQb2xpY2llc0Rpc3BsYXlPcmRlci5hZGQobmV3IFBvbGljeUluZm8oVVNFU19QT0xJQ1lfRk9SQ0VfTE9DSywgImZvcmNlLWxvY2siLAogICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3RyaW5nLnBvbGljeWxhYl9mb3JjZUxvY2ssCiAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcucG9saWN5ZGVzY19mb3JjZUxvY2spKTsKKyAgICAgICAgc1BvbGljaWVzRGlzcGxheU9yZGVyLmFkZChuZXcgUG9saWN5SW5mbyhVU0VTX1BPTElDWV9TRVRTX0dMT0JBTF9QUk9YWSwgInNldC1nbG9iYWwtcHJveHkiLAorICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3RyaW5nLnBvbGljeWxhYl9zZXRHbG9iYWxQcm94eSwKKyAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy5wb2xpY3lkZXNjX3NldEdsb2JhbFByb3h5KSk7CiAgICAgICAgIAogICAgICAgICBmb3IgKGludCBpPTA7IGk8c1BvbGljaWVzRGlzcGxheU9yZGVyLnNpemUoKTsgaSsrKSB7CiAgICAgICAgICAgICBQb2xpY3lJbmZvIHBpID0gc1BvbGljaWVzRGlzcGxheU9yZGVyLmdldChpKTsKQEAgLTMyOCw3ICszNDAsNyBAQAogICAgICAqIHRoZSBnaXZlbiBwb2xpY3kgY29udHJvbC4gIFRoZSBwb3NzaWJsZSBwb2xpY3kgaWRlbnRpZmllciBpbnB1dHMgYXJlOgogICAgICAqIHtAbGluayAjVVNFU19QT0xJQ1lfTElNSVRfUEFTU1dPUkR9LCB7QGxpbmsgI1VTRVNfUE9MSUNZX1dBVENIX0xPR0lOfSwKICAgICAgKiB7QGxpbmsgI1VTRVNfUE9MSUNZX1JFU0VUX1BBU1NXT1JEfSwge0BsaW5rICNVU0VTX1BPTElDWV9GT1JDRV9MT0NLfSwKLSAgICAgKiB7QGxpbmsgI1VTRVNfUE9MSUNZX1dJUEVfREFUQX0uCisgICAgICoge0BsaW5rICNVU0VTX1BPTElDWV9XSVBFX0RBVEF9LCB7QGxpbmsgI1VTRVNfUE9MSUNZX1NFVFNfR0xPQkFMX1BST1hZfS4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiB1c2VzUG9saWN5KGludCBwb2xpY3lJZGVudCkgewogICAgICAgICByZXR1cm4gKG1Vc2VzUG9saWNpZXMgJiAoMTw8cG9saWN5SWRlbnQpKSAhPSAwOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL2FkbWluL0RldmljZVBvbGljeU1hbmFnZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9hZG1pbi9EZXZpY2VQb2xpY3lNYW5hZ2VyLmphdmEKaW5kZXggMjk2ZDcwYTQuLjJiN2U0MjcgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9hZG1pbi9EZXZpY2VQb2xpY3lNYW5hZ2VyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL2FkbWluL0RldmljZVBvbGljeU1hbmFnZXIuamF2YQpAQCAtMzIsNiArMzIsOCBAQAogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LkluZXRTb2NrZXRBZGRyZXNzOworaW1wb3J0IGphdmEubmV0LlByb3h5OwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCiAvKioKQEAgLTQ2LDcgKzQ4LDcgQEAKIAogICAgIHByaXZhdGUgZmluYWwgQ29udGV4dCBtQ29udGV4dDsKICAgICBwcml2YXRlIGZpbmFsIElEZXZpY2VQb2xpY3lNYW5hZ2VyIG1TZXJ2aWNlOwotICAgIAorCiAgICAgcHJpdmF0ZSBmaW5hbCBIYW5kbGVyIG1IYW5kbGVyOwogCiAgICAgcHJpdmF0ZSBEZXZpY2VQb2xpY3lNYW5hZ2VyKENvbnRleHQgY29udGV4dCwgSGFuZGxlciBoYW5kbGVyKSB7CkBAIC02MSwxNCArNjMsMTQgQEAKICAgICAgICAgRGV2aWNlUG9saWN5TWFuYWdlciBtZSA9IG5ldyBEZXZpY2VQb2xpY3lNYW5hZ2VyKGNvbnRleHQsIGhhbmRsZXIpOwogICAgICAgICByZXR1cm4gbWUubVNlcnZpY2UgIT0gbnVsbCA/IG1lIDogbnVsbDsKICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBBY3Rpdml0eSBhY3Rpb246IGFzayB0aGUgdXNlciB0byBhZGQgYSBuZXcgZGV2aWNlIGFkbWluaXN0cmF0b3IgdG8gdGhlIHN5c3RlbS4KICAgICAgKiBUaGUgZGVzaXJlZCBwb2xpY3kgaXMgdGhlIENvbXBvbmVudE5hbWUgb2YgdGhlIHBvbGljeSBpbiB0aGUKICAgICAgKiB7QGxpbmsgI0VYVFJBX0RFVklDRV9BRE1JTn0gZXh0cmEgZmllbGQuICBUaGlzIHdpbGwgaW52b2tlIGEgVUkgdG8KICAgICAgKiBicmluZyB0aGUgdXNlciB0aHJvdWdoIGFkZGluZyB0aGUgZGV2aWNlIGFkbWluaXN0cmF0b3IgdG8gdGhlIHN5c3RlbSAob3IKICAgICAgKiBhbGxvd2luZyB0aGVtIHRvIHJlamVjdCBpdCkuCi0gICAgICogCisgICAgICoKICAgICAgKiA8cD5Zb3UgY2FuIG9wdGlvbmFsbHkgaW5jbHVkZSB0aGUge0BsaW5rICNFWFRSQV9BRERfRVhQTEFOQVRJT059CiAgICAgICogZmllbGQgdG8gcHJvdmlkZSB0aGUgdXNlciB3aXRoIGFkZGl0aW9uYWwgZXhwbGFuYXRpb24gKGluIGFkZGl0aW9uCiAgICAgICogdG8geW91ciBjb21wb25lbnQncyBkZXNjcmlwdGlvbikgYWJvdXQgd2hhdCBpcyBiZWluZyBhZGRlZC4KQEAgLTc2LDcgKzc4LDcgQEAKICAgICBAU2RrQ29uc3RhbnQoU2RrQ29uc3RhbnRUeXBlLkFDVElWSVRZX0lOVEVOVF9BQ1RJT04pCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX0FERF9ERVZJQ0VfQURNSU4KICAgICAgICAgICAgID0gImFuZHJvaWQuYXBwLmFjdGlvbi5BRERfREVWSUNFX0FETUlOIjsKLSAgICAKKwogICAgIC8qKgogICAgICAqIEFjdGl2aXR5IGFjdGlvbjogc2VuZCB3aGVuIGFueSBwb2xpY3kgYWRtaW4gY2hhbmdlcyBhIHBvbGljeS4KICAgICAgKiBUaGlzIGlzIGdlbmVyYWxseSB1c2VkIHRvIGZpbmQgb3V0IHdoZW4gYSBuZXcgcG9saWN5IGlzIGluIGVmZmVjdC4KQEAgLTkyLDcgKzk0LDcgQEAKICAgICAgKiBAc2VlICNBQ1RJT05fQUREX0RFVklDRV9BRE1JTgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX0RFVklDRV9BRE1JTiA9ICJhbmRyb2lkLmFwcC5leHRyYS5ERVZJQ0VfQURNSU4iOwotICAgIAorCiAgICAgLyoqCiAgICAgICogQW4gb3B0aW9uYWwgQ2hhclNlcXVlbmNlIHByb3ZpZGluZyBhZGRpdGlvbmFsIGV4cGxhbmF0aW9uIGZvciB3aHkgdGhlCiAgICAgICogYWRtaW4gaXMgYmVpbmcgYWRkZWQuCkBAIC0xMDAsMjIgKzEwMiwyMSBAQAogICAgICAqIEBzZWUgI0FDVElPTl9BRERfREVWSUNFX0FETUlOCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfQUREX0VYUExBTkFUSU9OID0gImFuZHJvaWQuYXBwLmV4dHJhLkFERF9FWFBMQU5BVElPTiI7Ci0gICAgCisKICAgICAvKioKLSAgICAgKiBBY3Rpdml0eSBhY3Rpb246IGhhdmUgdGhlIHVzZXIgZW50ZXIgYSBuZXcgcGFzc3dvcmQuICBUaGlzIGFjdGl2aXR5Ci0gICAgICogc2hvdWxkIGJlIGxhdW5jaGVkIGFmdGVyIHVzaW5nIHtAbGluayAjc2V0UGFzc3dvcmRRdWFsaXR5KENvbXBvbmVudE5hbWUsIGludCl9Ci0gICAgICogb3Ige0BsaW5rICNzZXRQYXNzd29yZE1pbmltdW1MZW5ndGgoQ29tcG9uZW50TmFtZSwgaW50KX0gdG8gaGF2ZSB0aGUKLSAgICAgKiB1c2VyIGVudGVyIGEgbmV3IHBhc3N3b3JkIHRoYXQgbWVldHMgdGhlIGN1cnJlbnQgcmVxdWlyZW1lbnRzLiAgWW91IGNhbgotICAgICAqIHVzZSB7QGxpbmsgI2lzQWN0aXZlUGFzc3dvcmRTdWZmaWNpZW50KCl9IHRvIGRldGVybWluZSB3aGV0aGVyIHlvdSBuZWVkCi0gICAgICogdG8gaGF2ZSB0aGUgdXNlciBzZWxlY3QgYSBuZXcgcGFzc3dvcmQgaW4gb3JkZXIgdG8gbWVldCB0aGUgY3VycmVudAotICAgICAqIGNvbnN0cmFpbnRzLiAgVXBvbiBiZWluZyByZXN1bWVkIGZyb20gdGhpcyBhY3Rpdml0eSwKLSAgICAgKiB5b3UgY2FuIGNoZWNrIHRoZSBuZXcgcGFzc3dvcmQgY2hhcmFjdGVyaXN0aWNzIHRvIHNlZSBpZiB0aGV5IGFyZQotICAgICAqIHN1ZmZpY2llbnQuCisgICAgICogQWN0aXZpdHkgYWN0aW9uOiBoYXZlIHRoZSB1c2VyIGVudGVyIGEgbmV3IHBhc3N3b3JkLiBUaGlzIGFjdGl2aXR5IHNob3VsZAorICAgICAqIGJlIGxhdW5jaGVkIGFmdGVyIHVzaW5nIHtAbGluayAjc2V0UGFzc3dvcmRRdWFsaXR5KENvbXBvbmVudE5hbWUsIGludCl9LAorICAgICAqIG9yIHtAbGluayAjc2V0UGFzc3dvcmRNaW5pbXVtTGVuZ3RoKENvbXBvbmVudE5hbWUsIGludCl9IHRvIGhhdmUgdGhlIHVzZXIKKyAgICAgKiBlbnRlciBhIG5ldyBwYXNzd29yZCB0aGF0IG1lZXRzIHRoZSBjdXJyZW50IHJlcXVpcmVtZW50cy4gWW91IGNhbiB1c2UKKyAgICAgKiB7QGxpbmsgI2lzQWN0aXZlUGFzc3dvcmRTdWZmaWNpZW50KCl9IHRvIGRldGVybWluZSB3aGV0aGVyIHlvdSBuZWVkIHRvCisgICAgICogaGF2ZSB0aGUgdXNlciBzZWxlY3QgYSBuZXcgcGFzc3dvcmQgaW4gb3JkZXIgdG8gbWVldCB0aGUgY3VycmVudAorICAgICAqIGNvbnN0cmFpbnRzLiBVcG9uIGJlaW5nIHJlc3VtZWQgZnJvbSB0aGlzIGFjdGl2aXR5LCB5b3UgY2FuIGNoZWNrIHRoZSBuZXcKKyAgICAgKiBwYXNzd29yZCBjaGFyYWN0ZXJpc3RpY3MgdG8gc2VlIGlmIHRoZXkgYXJlIHN1ZmZpY2llbnQuCiAgICAgICovCiAgICAgQFNka0NvbnN0YW50KFNka0NvbnN0YW50VHlwZS5BQ1RJVklUWV9JTlRFTlRfQUNUSU9OKQogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9TRVRfTkVXX1BBU1NXT1JECiAgICAgICAgICAgICA9ICJhbmRyb2lkLmFwcC5hY3Rpb24uU0VUX05FV19QQVNTV09SRCI7Ci0gICAgCisKICAgICAvKioKICAgICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gYWRtaW5pc3RyYXRvciBjb21wb25lbnQgaXMgY3VycmVudGx5CiAgICAgICogYWN0aXZlIChlbmFibGVkKSBpbiB0aGUgc3lzdGVtLgpAQCAtMTMwLDcgKzEzMSw3IEBACiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIFJldHVybiBhIGxpc3Qgb2YgYWxsIGN1cnJlbnRseSBhY3RpdmUgZGV2aWNlIGFkbWluaXN0cmF0b3IncyBjb21wb25lbnQKICAgICAgKiBuYW1lcy4gIE5vdGUgdGhhdCBpZiB0aGVyZSBhcmUgbm8gYWRtaW5pc3RyYXRvcnMgdGhhbiBudWxsIG1heSBiZQpAQCAtMTQ2LDcgKzE0Nyw3IEBACiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogQGhpZGUKICAgICAgKi8KQEAgLTE2MCw3ICsxNjEsNyBAQAogICAgICAgICB9CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBSZW1vdmUgYSBjdXJyZW50IGFkbWluaXN0cmF0aW9uIGNvbXBvbmVudC4gIFRoaXMgY2FuIG9ubHkgYmUgY2FsbGVkCiAgICAgICogYnkgdGhlIGFwcGxpY2F0aW9uIHRoYXQgb3ducyB0aGUgYWRtaW5pc3RyYXRpb24gY29tcG9uZW50OyBpZiB5b3UKQEAgLTE3NiwyOCArMTc3LDI4IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBDb25zdGFudCBmb3Ige0BsaW5rICNzZXRQYXNzd29yZFF1YWxpdHl9OiB0aGUgcG9saWN5IGhhcyBubyByZXF1aXJlbWVudHMKICAgICAgKiBmb3IgdGhlIHBhc3N3b3JkLiAgTm90ZSB0aGF0IHF1YWxpdHkgY29uc3RhbnRzIGFyZSBvcmRlcmVkIHNvIHRoYXQgaGlnaGVyCiAgICAgICogdmFsdWVzIGFyZSBtb3JlIHJlc3RyaWN0aXZlLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBBU1NXT1JEX1FVQUxJVFlfVU5TUEVDSUZJRUQgPSAwOwotICAgIAorCiAgICAgLyoqCiAgICAgICogQ29uc3RhbnQgZm9yIHtAbGluayAjc2V0UGFzc3dvcmRRdWFsaXR5fTogdGhlIHBvbGljeSByZXF1aXJlcyBzb21lIGtpbmQKICAgICAgKiBvZiBwYXNzd29yZCwgYnV0IGRvZXNuJ3QgY2FyZSB3aGF0IGl0IGlzLiAgTm90ZSB0aGF0IHF1YWxpdHkgY29uc3RhbnRzCiAgICAgICogYXJlIG9yZGVyZWQgc28gdGhhdCBoaWdoZXIgdmFsdWVzIGFyZSBtb3JlIHJlc3RyaWN0aXZlLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBBU1NXT1JEX1FVQUxJVFlfU09NRVRISU5HID0gMHgxMDAwMDsKLSAgICAKKwogICAgIC8qKgogICAgICAqIENvbnN0YW50IGZvciB7QGxpbmsgI3NldFBhc3N3b3JkUXVhbGl0eX06IHRoZSB1c2VyIG11c3QgaGF2ZSBlbnRlcmVkIGEKICAgICAgKiBwYXNzd29yZCBjb250YWluaW5nIGF0IGxlYXN0IG51bWVyaWMgY2hhcmFjdGVycy4gIE5vdGUgdGhhdCBxdWFsaXR5CiAgICAgICogY29uc3RhbnRzIGFyZSBvcmRlcmVkIHNvIHRoYXQgaGlnaGVyIHZhbHVlcyBhcmUgbW9yZSByZXN0cmljdGl2ZS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQQVNTV09SRF9RVUFMSVRZX05VTUVSSUMgPSAweDIwMDAwOwotICAgIAorCiAgICAgLyoqCiAgICAgICogQ29uc3RhbnQgZm9yIHtAbGluayAjc2V0UGFzc3dvcmRRdWFsaXR5fTogdGhlIHVzZXIgbXVzdCBoYXZlIGVudGVyZWQgYQogICAgICAqIHBhc3N3b3JkIGNvbnRhaW5pbmcgYXQgbGVhc3QgYWxwaGFiZXRpYyAob3Igb3RoZXIgc3ltYm9sKSBjaGFyYWN0ZXJzLgpAQCAtMjA1LDcgKzIwNiw3IEBACiAgICAgICogcmVzdHJpY3RpdmUuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEFTU1dPUkRfUVVBTElUWV9BTFBIQUJFVElDID0gMHg0MDAwMDsKLSAgICAKKwogICAgIC8qKgogICAgICAqIENvbnN0YW50IGZvciB7QGxpbmsgI3NldFBhc3N3b3JkUXVhbGl0eX06IHRoZSB1c2VyIG11c3QgaGF2ZSBlbnRlcmVkIGEKICAgICAgKiBwYXNzd29yZCBjb250YWluaW5nIGF0IGxlYXN0IDxlbT5ib3RoPjwvZW0+IG51bWVyaWMgPGVtPmFuZDwvZW0+CkBAIC0yMTMsNyArMjE0LDE5IEBACiAgICAgICogb3JkZXJlZCBzbyB0aGF0IGhpZ2hlciB2YWx1ZXMgYXJlIG1vcmUgcmVzdHJpY3RpdmUuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEFTU1dPUkRfUVVBTElUWV9BTFBIQU5VTUVSSUMgPSAweDUwMDAwOwotICAgIAorCisgICAgLyoqCisgICAgICogQ29uc3RhbnQgZm9yIHtAbGluayAjc2V0UGFzc3dvcmRRdWFsaXR5fTogdGhlIHVzZXIgbXVzdCBoYXZlIGVudGVyZWQgYQorICAgICAqIHBhc3N3b3JkIGNvbnRhaW5pbmcgYXQgbGVhc3QgYSBsZXR0ZXIsIGEgbnVtZXJpY2FsIGRpZ2l0IGFuZCBhIHNwZWNpYWwKKyAgICAgKiBzeW1ib2wsIGJ5IGRlZmF1bHQuIFdpdGggdGhpcyBwYXNzd29yZCBxdWFsaXR5LCBwYXNzd29yZHMgY2FuIGJlCisgICAgICogcmVzdHJpY3RlZCB0byBjb250YWluIHZhcmlvdXMgc2V0cyBvZiBjaGFyYWN0ZXJzLCBsaWtlIGF0IGxlYXN0IGFuCisgICAgICogdXBwZXJjYXNlIGxldHRlciwgZXRjLiBUaGVzZSBhcmUgc3BlY2lmaWVkIHVzaW5nIHZhcmlvdXMgbWV0aG9kcywKKyAgICAgKiBsaWtlIHtAbGluayAjc2V0UGFzc3dvcmRNaW5pbXVtTG93ZXJDYXNlKENvbXBvbmVudE5hbWUsIGludCl9LiBOb3RlCisgICAgICogdGhhdCBxdWFsaXR5IGNvbnN0YW50cyBhcmUgb3JkZXJlZCBzbyB0aGF0IGhpZ2hlciB2YWx1ZXMgYXJlIG1vcmUKKyAgICAgKiByZXN0cmljdGl2ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQQVNTV09SRF9RVUFMSVRZX0NPTVBMRVggPSAweDYwMDAwOworCiAgICAgLyoqCiAgICAgICogQ2FsbGVkIGJ5IGFuIGFwcGxpY2F0aW9uIHRoYXQgaXMgYWRtaW5pc3RlcmluZyB0aGUgZGV2aWNlIHRvIHNldCB0aGUKICAgICAgKiBwYXNzd29yZCByZXN0cmljdGlvbnMgaXQgaXMgaW1wb3NpbmcuICBBZnRlciBzZXR0aW5nIHRoaXMsIHRoZSB1c2VyCkBAIC0yMjIsMjEgKzIzNSwyMSBAQAogICAgICAqIHdpbGwgcmVtYWluIHVudGlsIHRoZSB1c2VyIGhhcyBzZXQgYSBuZXcgb25lLCBzbyB0aGUgY2hhbmdlIGRvZXMgbm90CiAgICAgICogdGFrZSBwbGFjZSBpbW1lZGlhdGVseS4gIFRvIHByb21wdCB0aGUgdXNlciBmb3IgYSBuZXcgcGFzc3dvcmQsIHVzZQogICAgICAqIHtAbGluayAjQUNUSU9OX1NFVF9ORVdfUEFTU1dPUkR9IGFmdGVyIHNldHRpbmcgdGhpcyB2YWx1ZS4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIDxwPlF1YWxpdHkgY29uc3RhbnRzIGFyZSBvcmRlcmVkIHNvIHRoYXQgaGlnaGVyIHZhbHVlcyBhcmUgbW9yZSByZXN0cmljdGl2ZTsKICAgICAgKiB0aHVzIHRoZSBoaWdoZXN0IHJlcXVlc3RlZCBxdWFsaXR5IGNvbnN0YW50IChiZXR3ZWVuIHRoZSBwb2xpY3kgc2V0IGhlcmUsCiAgICAgICogdGhlIHVzZXIncyBwcmVmZXJlbmNlLCBhbmQgYW55IG90aGVyIGNvbnNpZGVyYXRpb25zKSBpcyB0aGUgb25lIHRoYXQKICAgICAgKiBpcyBpbiBlZmZlY3QuCi0gICAgICogCisgICAgICoKICAgICAgKiA8cD5UaGUgY2FsbGluZyBkZXZpY2UgYWRtaW4gbXVzdCBoYXZlIHJlcXVlc3RlZAogICAgICAqIHtAbGluayBEZXZpY2VBZG1pbkluZm8jVVNFU19QT0xJQ1lfTElNSVRfUEFTU1dPUkR9IHRvIGJlIGFibGUgdG8gY2FsbAogICAgICAqIHRoaXMgbWV0aG9kOyBpZiBpdCBoYXMgbm90LCBhIHNlY3VyaXR5IGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEBwYXJhbSBhZG1pbiBXaGljaCB7QGxpbmsgRGV2aWNlQWRtaW5SZWNlaXZlcn0gdGhpcyByZXF1ZXN0IGlzIGFzc29jaWF0ZWQgd2l0aC4KICAgICAgKiBAcGFyYW0gcXVhbGl0eSBUaGUgbmV3IGRlc2lyZWQgcXVhbGl0eS4gIE9uZSBvZgogICAgICAqIHtAbGluayAjUEFTU1dPUkRfUVVBTElUWV9VTlNQRUNJRklFRH0sIHtAbGluayAjUEFTU1dPUkRfUVVBTElUWV9TT01FVEhJTkd9LAogICAgICAqIHtAbGluayAjUEFTU1dPUkRfUVVBTElUWV9OVU1FUklDfSwge0BsaW5rICNQQVNTV09SRF9RVUFMSVRZX0FMUEhBQkVUSUN9LAotICAgICAqIG9yIHtAbGluayAjUEFTU1dPUkRfUVVBTElUWV9BTFBIQU5VTUVSSUN9LgorICAgICAqIHtAbGluayAjUEFTU1dPUkRfUVVBTElUWV9BTFBIQU5VTUVSSUN9IG9yIHtAbGluayAjUEFTU1dPUkRfUVVBTElUWV9DT01QTEVYfS4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZFF1YWxpdHkoQ29tcG9uZW50TmFtZSBhZG1pbiwgaW50IHF1YWxpdHkpIHsKICAgICAgICAgaWYgKG1TZXJ2aWNlICE9IG51bGwpIHsKQEAgLTI0Nyw3ICsyNjAsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogUmV0cmlldmUgdGhlIGN1cnJlbnQgbWluaW11bSBwYXNzd29yZCBxdWFsaXR5IGZvciBhbGwgYWRtaW5zCiAgICAgICogb3IgYSBwYXJ0aWN1bGFyIG9uZS4KQEAgLTI2NCw3ICsyNzcsNyBAQAogICAgICAgICB9CiAgICAgICAgIHJldHVybiBQQVNTV09SRF9RVUFMSVRZX1VOU1BFQ0lGSUVEOwogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIENhbGxlZCBieSBhbiBhcHBsaWNhdGlvbiB0aGF0IGlzIGFkbWluaXN0ZXJpbmcgdGhlIGRldmljZSB0byBzZXQgdGhlCiAgICAgICogbWluaW11bSBhbGxvd2VkIHBhc3N3b3JkIGxlbmd0aC4gIEFmdGVyIHNldHRpbmcgdGhpcywgdGhlIHVzZXIKQEAgLTI3NCwxNCArMjg3LDE0IEBACiAgICAgICogdGFrZSBwbGFjZSBpbW1lZGlhdGVseS4gIFRvIHByb21wdCB0aGUgdXNlciBmb3IgYSBuZXcgcGFzc3dvcmQsIHVzZQogICAgICAqIHtAbGluayAjQUNUSU9OX1NFVF9ORVdfUEFTU1dPUkR9IGFmdGVyIHNldHRpbmcgdGhpcyB2YWx1ZS4gIFRoaXMKICAgICAgKiBjb25zdHJhaW50IGlzIG9ubHkgaW1wb3NlZCBpZiB0aGUgYWRtaW5pc3RyYXRvciBoYXMgYWxzbyByZXF1ZXN0ZWQgZWl0aGVyCi0gICAgICoge0BsaW5rICNQQVNTV09SRF9RVUFMSVRZX05VTUVSSUN9LCB7QGxpbmsgI1BBU1NXT1JEX1FVQUxJVFlfQUxQSEFCRVRJQ30sCi0gICAgICogb3Ige0BsaW5rICNQQVNTV09SRF9RVUFMSVRZX0FMUEhBTlVNRVJJQ30KKyAgICAgKiB7QGxpbmsgI1BBU1NXT1JEX1FVQUxJVFlfTlVNRVJJQ30sIHtAbGluayAjUEFTU1dPUkRfUVVBTElUWV9BTFBIQUJFVElDfQorICAgICAqIHtAbGluayAjUEFTU1dPUkRfUVVBTElUWV9BTFBIQU5VTUVSSUN9LCBvciB7QGxpbmsgI1BBU1NXT1JEX1FVQUxJVFlfQ09NUExFWH0KICAgICAgKiB3aXRoIHtAbGluayAjc2V0UGFzc3dvcmRRdWFsaXR5fS4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIDxwPlRoZSBjYWxsaW5nIGRldmljZSBhZG1pbiBtdXN0IGhhdmUgcmVxdWVzdGVkCiAgICAgICoge0BsaW5rIERldmljZUFkbWluSW5mbyNVU0VTX1BPTElDWV9MSU1JVF9QQVNTV09SRH0gdG8gYmUgYWJsZSB0byBjYWxsCiAgICAgICogdGhpcyBtZXRob2Q7IGlmIGl0IGhhcyBub3QsIGEgc2VjdXJpdHkgZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLgotICAgICAqIAorICAgICAqCiAgICAgICogQHBhcmFtIGFkbWluIFdoaWNoIHtAbGluayBEZXZpY2VBZG1pblJlY2VpdmVyfSB0aGlzIHJlcXVlc3QgaXMgYXNzb2NpYXRlZCB3aXRoLgogICAgICAqIEBwYXJhbSBsZW5ndGggVGhlIG5ldyBkZXNpcmVkIG1pbmltdW0gcGFzc3dvcmQgbGVuZ3RoLiAgQSB2YWx1ZSBvZiAwCiAgICAgICogbWVhbnMgdGhlcmUgaXMgbm8gcmVzdHJpY3Rpb24uCkBAIC0yOTUsNyArMzA4LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIFJldHJpZXZlIHRoZSBjdXJyZW50IG1pbmltdW0gcGFzc3dvcmQgbGVuZ3RoIGZvciBhbGwgYWRtaW5zCiAgICAgICogb3IgYSBwYXJ0aWN1bGFyIG9uZS4KQEAgLTMxMiw3ICszMjUsMzc5IEBACiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQotICAgIAorCisgICAgLyoqCisgICAgICogQ2FsbGVkIGJ5IGFuIGFwcGxpY2F0aW9uIHRoYXQgaXMgYWRtaW5pc3RlcmluZyB0aGUgZGV2aWNlIHRvIHNldCB0aGUKKyAgICAgKiBtaW5pbXVtIG51bWJlciBvZiB1cHBlciBjYXNlIGxldHRlcnMgcmVxdWlyZWQgaW4gdGhlIHBhc3N3b3JkLiBBZnRlcgorICAgICAqIHNldHRpbmcgdGhpcywgdGhlIHVzZXIgd2lsbCBub3QgYmUgYWJsZSB0byBlbnRlciBhIG5ldyBwYXNzd29yZCB0aGF0IGlzCisgICAgICogbm90IGF0IGxlYXN0IGFzIHJlc3RyaWN0aXZlIGFzIHdoYXQgaGFzIGJlZW4gc2V0LiBOb3RlIHRoYXQgdGhlIGN1cnJlbnQKKyAgICAgKiBwYXNzd29yZCB3aWxsIHJlbWFpbiB1bnRpbCB0aGUgdXNlciBoYXMgc2V0IGEgbmV3IG9uZSwgc28gdGhlIGNoYW5nZSBkb2VzCisgICAgICogbm90IHRha2UgcGxhY2UgaW1tZWRpYXRlbHkuIFRvIHByb21wdCB0aGUgdXNlciBmb3IgYSBuZXcgcGFzc3dvcmQsIHVzZQorICAgICAqIHtAbGluayAjQUNUSU9OX1NFVF9ORVdfUEFTU1dPUkR9IGFmdGVyIHNldHRpbmcgdGhpcyB2YWx1ZS4gVGhpcworICAgICAqIGNvbnN0cmFpbnQgaXMgb25seSBpbXBvc2VkIGlmIHRoZSBhZG1pbmlzdHJhdG9yIGhhcyBhbHNvIHJlcXVlc3RlZAorICAgICAqIHtAbGluayAjUEFTU1dPUkRfUVVBTElUWV9DT01QTEVYfSB3aXRoIHtAbGluayAjc2V0UGFzc3dvcmRRdWFsaXR5fS4gVGhlCisgICAgICogZGVmYXVsdCB2YWx1ZSBpcyAwLgorICAgICAqIDxwPgorICAgICAqIFRoZSBjYWxsaW5nIGRldmljZSBhZG1pbiBtdXN0IGhhdmUgcmVxdWVzdGVkCisgICAgICoge0BsaW5rIERldmljZUFkbWluSW5mbyNVU0VTX1BPTElDWV9MSU1JVF9QQVNTV09SRH0gdG8gYmUgYWJsZSB0byBjYWxsCisgICAgICogdGhpcyBtZXRob2Q7IGlmIGl0IGhhcyBub3QsIGEgc2VjdXJpdHkgZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLgorICAgICAqCisgICAgICogQHBhcmFtIGFkbWluIFdoaWNoIHtAbGluayBEZXZpY2VBZG1pblJlY2VpdmVyfSB0aGlzIHJlcXVlc3QgaXMgYXNzb2NpYXRlZAorICAgICAqICAgICAgICAgICAgd2l0aC4KKyAgICAgKiBAcGFyYW0gbGVuZ3RoIFRoZSBuZXcgZGVzaXJlZCBtaW5pbXVtIG51bWJlciBvZiB1cHBlciBjYXNlIGxldHRlcnMKKyAgICAgKiAgICAgICAgICAgIHJlcXVpcmVkIGluIHRoZSBwYXNzd29yZC4gQSB2YWx1ZSBvZiAwIG1lYW5zIHRoZXJlIGlzIG5vCisgICAgICogICAgICAgICAgICByZXN0cmljdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZE1pbmltdW1VcHBlckNhc2UoQ29tcG9uZW50TmFtZSBhZG1pbiwgaW50IGxlbmd0aCkgeworICAgICAgICBpZiAobVNlcnZpY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtU2VydmljZS5zZXRQYXNzd29yZE1pbmltdW1VcHBlckNhc2UoYWRtaW4sIGxlbmd0aCk7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkZhaWxlZCB0YWxraW5nIHdpdGggZGV2aWNlIHBvbGljeSBzZXJ2aWNlIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZSB0aGUgY3VycmVudCBudW1iZXIgb2YgdXBwZXIgY2FzZSBsZXR0ZXJzIHJlcXVpcmVkIGluIHRoZQorICAgICAqIHBhc3N3b3JkIGZvciBhbGwgYWRtaW5zIG9yIGEgcGFydGljdWxhciBvbmUuIFRoaXMgaXMgdGhlIHNhbWUgdmFsdWUgYXMKKyAgICAgKiBzZXQgYnkgeyNsaW5rIHtAbGluayAjc2V0UGFzc3dvcmRNaW5pbXVtVXBwZXJDYXNlKENvbXBvbmVudE5hbWUsIGludCl9CisgICAgICogYW5kIG9ubHkgYXBwbGllcyB3aGVuIHRoZSBwYXNzd29yZCBxdWFsaXR5IGlzCisgICAgICoge0BsaW5rICNQQVNTV09SRF9RVUFMSVRZX0NPTVBMRVh9LgorICAgICAqCisgICAgICogQHBhcmFtIGFkbWluIFRoZSBuYW1lIG9mIHRoZSBhZG1pbiBjb21wb25lbnQgdG8gY2hlY2ssIG9yIG51bGwgdG8KKyAgICAgKiAgICAgICAgICAgIGFnZ3JlZ2F0ZSBhbGwgYWRtaW5zLgorICAgICAqIEByZXR1cm4gVGhlIG1pbmltdW0gbnVtYmVyIG9mIHVwcGVyIGNhc2UgbGV0dGVycyByZXF1aXJlZCBpbiB0aGUKKyAgICAgKiAgICAgICAgIHBhc3N3b3JkLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0UGFzc3dvcmRNaW5pbXVtVXBwZXJDYXNlKENvbXBvbmVudE5hbWUgYWRtaW4pIHsKKyAgICAgICAgaWYgKG1TZXJ2aWNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLmdldFBhc3N3b3JkTWluaW11bVVwcGVyQ2FzZShhZG1pbik7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkZhaWxlZCB0YWxraW5nIHdpdGggZGV2aWNlIHBvbGljeSBzZXJ2aWNlIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIGJ5IGFuIGFwcGxpY2F0aW9uIHRoYXQgaXMgYWRtaW5pc3RlcmluZyB0aGUgZGV2aWNlIHRvIHNldCB0aGUKKyAgICAgKiBtaW5pbXVtIG51bWJlciBvZiBsb3dlciBjYXNlIGxldHRlcnMgcmVxdWlyZWQgaW4gdGhlIHBhc3N3b3JkLiBBZnRlcgorICAgICAqIHNldHRpbmcgdGhpcywgdGhlIHVzZXIgd2lsbCBub3QgYmUgYWJsZSB0byBlbnRlciBhIG5ldyBwYXNzd29yZCB0aGF0IGlzCisgICAgICogbm90IGF0IGxlYXN0IGFzIHJlc3RyaWN0aXZlIGFzIHdoYXQgaGFzIGJlZW4gc2V0LiBOb3RlIHRoYXQgdGhlIGN1cnJlbnQKKyAgICAgKiBwYXNzd29yZCB3aWxsIHJlbWFpbiB1bnRpbCB0aGUgdXNlciBoYXMgc2V0IGEgbmV3IG9uZSwgc28gdGhlIGNoYW5nZSBkb2VzCisgICAgICogbm90IHRha2UgcGxhY2UgaW1tZWRpYXRlbHkuIFRvIHByb21wdCB0aGUgdXNlciBmb3IgYSBuZXcgcGFzc3dvcmQsIHVzZQorICAgICAqIHtAbGluayAjQUNUSU9OX1NFVF9ORVdfUEFTU1dPUkR9IGFmdGVyIHNldHRpbmcgdGhpcyB2YWx1ZS4gVGhpcworICAgICAqIGNvbnN0cmFpbnQgaXMgb25seSBpbXBvc2VkIGlmIHRoZSBhZG1pbmlzdHJhdG9yIGhhcyBhbHNvIHJlcXVlc3RlZAorICAgICAqIHtAbGluayAjUEFTU1dPUkRfUVVBTElUWV9DT01QTEVYfSB3aXRoIHtAbGluayAjc2V0UGFzc3dvcmRRdWFsaXR5fS4gVGhlCisgICAgICogZGVmYXVsdCB2YWx1ZSBpcyAwLgorICAgICAqIDxwPgorICAgICAqIFRoZSBjYWxsaW5nIGRldmljZSBhZG1pbiBtdXN0IGhhdmUgcmVxdWVzdGVkCisgICAgICoge0BsaW5rIERldmljZUFkbWluSW5mbyNVU0VTX1BPTElDWV9MSU1JVF9QQVNTV09SRH0gdG8gYmUgYWJsZSB0byBjYWxsCisgICAgICogdGhpcyBtZXRob2Q7IGlmIGl0IGhhcyBub3QsIGEgc2VjdXJpdHkgZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLgorICAgICAqCisgICAgICogQHBhcmFtIGFkbWluIFdoaWNoIHtAbGluayBEZXZpY2VBZG1pblJlY2VpdmVyfSB0aGlzIHJlcXVlc3QgaXMgYXNzb2NpYXRlZAorICAgICAqICAgICAgICAgICAgd2l0aC4KKyAgICAgKiBAcGFyYW0gbGVuZ3RoIFRoZSBuZXcgZGVzaXJlZCBtaW5pbXVtIG51bWJlciBvZiBsb3dlciBjYXNlIGxldHRlcnMKKyAgICAgKiAgICAgICAgICAgIHJlcXVpcmVkIGluIHRoZSBwYXNzd29yZC4gQSB2YWx1ZSBvZiAwIG1lYW5zIHRoZXJlIGlzIG5vCisgICAgICogICAgICAgICAgICByZXN0cmljdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZE1pbmltdW1Mb3dlckNhc2UoQ29tcG9uZW50TmFtZSBhZG1pbiwgaW50IGxlbmd0aCkgeworICAgICAgICBpZiAobVNlcnZpY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtU2VydmljZS5zZXRQYXNzd29yZE1pbmltdW1Mb3dlckNhc2UoYWRtaW4sIGxlbmd0aCk7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkZhaWxlZCB0YWxraW5nIHdpdGggZGV2aWNlIHBvbGljeSBzZXJ2aWNlIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZSB0aGUgY3VycmVudCBudW1iZXIgb2YgbG93ZXIgY2FzZSBsZXR0ZXJzIHJlcXVpcmVkIGluIHRoZQorICAgICAqIHBhc3N3b3JkIGZvciBhbGwgYWRtaW5zIG9yIGEgcGFydGljdWxhciBvbmUuIFRoaXMgaXMgdGhlIHNhbWUgdmFsdWUgYXMKKyAgICAgKiBzZXQgYnkgeyNsaW5rIHtAbGluayAjc2V0UGFzc3dvcmRNaW5pbXVtTG93ZXJDYXNlKENvbXBvbmVudE5hbWUsIGludCl9CisgICAgICogYW5kIG9ubHkgYXBwbGllcyB3aGVuIHRoZSBwYXNzd29yZCBxdWFsaXR5IGlzCisgICAgICoge0BsaW5rICNQQVNTV09SRF9RVUFMSVRZX0NPTVBMRVh9LgorICAgICAqCisgICAgICogQHBhcmFtIGFkbWluIFRoZSBuYW1lIG9mIHRoZSBhZG1pbiBjb21wb25lbnQgdG8gY2hlY2ssIG9yIG51bGwgdG8KKyAgICAgKiAgICAgICAgICAgIGFnZ3JlZ2F0ZSBhbGwgYWRtaW5zLgorICAgICAqIEByZXR1cm4gVGhlIG1pbmltdW0gbnVtYmVyIG9mIGxvd2VyIGNhc2UgbGV0dGVycyByZXF1aXJlZCBpbiB0aGUKKyAgICAgKiAgICAgICAgIHBhc3N3b3JkLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0UGFzc3dvcmRNaW5pbXVtTG93ZXJDYXNlKENvbXBvbmVudE5hbWUgYWRtaW4pIHsKKyAgICAgICAgaWYgKG1TZXJ2aWNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLmdldFBhc3N3b3JkTWluaW11bUxvd2VyQ2FzZShhZG1pbik7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkZhaWxlZCB0YWxraW5nIHdpdGggZGV2aWNlIHBvbGljeSBzZXJ2aWNlIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIGJ5IGFuIGFwcGxpY2F0aW9uIHRoYXQgaXMgYWRtaW5pc3RlcmluZyB0aGUgZGV2aWNlIHRvIHNldCB0aGUKKyAgICAgKiBtaW5pbXVtIG51bWJlciBvZiBsZXR0ZXJzIHJlcXVpcmVkIGluIHRoZSBwYXNzd29yZC4gQWZ0ZXIgc2V0dGluZyB0aGlzLAorICAgICAqIHRoZSB1c2VyIHdpbGwgbm90IGJlIGFibGUgdG8gZW50ZXIgYSBuZXcgcGFzc3dvcmQgdGhhdCBpcyBub3QgYXQgbGVhc3QgYXMKKyAgICAgKiByZXN0cmljdGl2ZSBhcyB3aGF0IGhhcyBiZWVuIHNldC4gTm90ZSB0aGF0IHRoZSBjdXJyZW50IHBhc3N3b3JkIHdpbGwKKyAgICAgKiByZW1haW4gdW50aWwgdGhlIHVzZXIgaGFzIHNldCBhIG5ldyBvbmUsIHNvIHRoZSBjaGFuZ2UgZG9lcyBub3QgdGFrZQorICAgICAqIHBsYWNlIGltbWVkaWF0ZWx5LiBUbyBwcm9tcHQgdGhlIHVzZXIgZm9yIGEgbmV3IHBhc3N3b3JkLCB1c2UKKyAgICAgKiB7QGxpbmsgI0FDVElPTl9TRVRfTkVXX1BBU1NXT1JEfSBhZnRlciBzZXR0aW5nIHRoaXMgdmFsdWUuIFRoaXMKKyAgICAgKiBjb25zdHJhaW50IGlzIG9ubHkgaW1wb3NlZCBpZiB0aGUgYWRtaW5pc3RyYXRvciBoYXMgYWxzbyByZXF1ZXN0ZWQKKyAgICAgKiB7QGxpbmsgI1BBU1NXT1JEX1FVQUxJVFlfQ09NUExFWH0gd2l0aCB7QGxpbmsgI3NldFBhc3N3b3JkUXVhbGl0eX0uIFRoZQorICAgICAqIGRlZmF1bHQgdmFsdWUgaXMgMS4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgY2FsbGluZyBkZXZpY2UgYWRtaW4gbXVzdCBoYXZlIHJlcXVlc3RlZAorICAgICAqIHtAbGluayBEZXZpY2VBZG1pbkluZm8jVVNFU19QT0xJQ1lfTElNSVRfUEFTU1dPUkR9IHRvIGJlIGFibGUgdG8gY2FsbAorICAgICAqIHRoaXMgbWV0aG9kOyBpZiBpdCBoYXMgbm90LCBhIHNlY3VyaXR5IGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhZG1pbiBXaGljaCB7QGxpbmsgRGV2aWNlQWRtaW5SZWNlaXZlcn0gdGhpcyByZXF1ZXN0IGlzIGFzc29jaWF0ZWQKKyAgICAgKiAgICAgICAgICAgIHdpdGguCisgICAgICogQHBhcmFtIGxlbmd0aCBUaGUgbmV3IGRlc2lyZWQgbWluaW11bSBudW1iZXIgb2YgbGV0dGVycyByZXF1aXJlZCBpbiB0aGUKKyAgICAgKiAgICAgICAgICAgIHBhc3N3b3JkLiBBIHZhbHVlIG9mIDAgbWVhbnMgdGhlcmUgaXMgbm8gcmVzdHJpY3Rpb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UGFzc3dvcmRNaW5pbXVtTGV0dGVycyhDb21wb25lbnROYW1lIGFkbWluLCBpbnQgbGVuZ3RoKSB7CisgICAgICAgIGlmIChtU2VydmljZSAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1TZXJ2aWNlLnNldFBhc3N3b3JkTWluaW11bUxldHRlcnMoYWRtaW4sIGxlbmd0aCk7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkZhaWxlZCB0YWxraW5nIHdpdGggZGV2aWNlIHBvbGljeSBzZXJ2aWNlIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZSB0aGUgY3VycmVudCBudW1iZXIgb2YgbGV0dGVycyByZXF1aXJlZCBpbiB0aGUgcGFzc3dvcmQgZm9yIGFsbAorICAgICAqIGFkbWlucyBvciBhIHBhcnRpY3VsYXIgb25lLiBUaGlzIGlzIHRoZSBzYW1lIHZhbHVlIGFzCisgICAgICogc2V0IGJ5IHsjbGluayB7QGxpbmsgI3NldFBhc3N3b3JkTWluaW11bUxldHRlcnMoQ29tcG9uZW50TmFtZSwgaW50KX0KKyAgICAgKiBhbmQgb25seSBhcHBsaWVzIHdoZW4gdGhlIHBhc3N3b3JkIHF1YWxpdHkgaXMKKyAgICAgKiB7QGxpbmsgI1BBU1NXT1JEX1FVQUxJVFlfQ09NUExFWH0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWRtaW4gVGhlIG5hbWUgb2YgdGhlIGFkbWluIGNvbXBvbmVudCB0byBjaGVjaywgb3IgbnVsbCB0bworICAgICAqICAgICAgICAgICAgYWdncmVnYXRlIGFsbCBhZG1pbnMuCisgICAgICogQHJldHVybiBUaGUgbWluaW11bSBudW1iZXIgb2YgbGV0dGVycyByZXF1aXJlZCBpbiB0aGUgcGFzc3dvcmQuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRQYXNzd29yZE1pbmltdW1MZXR0ZXJzKENvbXBvbmVudE5hbWUgYWRtaW4pIHsKKyAgICAgICAgaWYgKG1TZXJ2aWNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLmdldFBhc3N3b3JkTWluaW11bUxldHRlcnMoYWRtaW4pOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJGYWlsZWQgdGFsa2luZyB3aXRoIGRldmljZSBwb2xpY3kgc2VydmljZSIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxlZCBieSBhbiBhcHBsaWNhdGlvbiB0aGF0IGlzIGFkbWluaXN0ZXJpbmcgdGhlIGRldmljZSB0byBzZXQgdGhlCisgICAgICogbWluaW11bSBudW1iZXIgb2YgbnVtZXJpY2FsIGRpZ2l0cyByZXF1aXJlZCBpbiB0aGUgcGFzc3dvcmQuIEFmdGVyCisgICAgICogc2V0dGluZyB0aGlzLCB0aGUgdXNlciB3aWxsIG5vdCBiZSBhYmxlIHRvIGVudGVyIGEgbmV3IHBhc3N3b3JkIHRoYXQgaXMKKyAgICAgKiBub3QgYXQgbGVhc3QgYXMgcmVzdHJpY3RpdmUgYXMgd2hhdCBoYXMgYmVlbiBzZXQuIE5vdGUgdGhhdCB0aGUgY3VycmVudAorICAgICAqIHBhc3N3b3JkIHdpbGwgcmVtYWluIHVudGlsIHRoZSB1c2VyIGhhcyBzZXQgYSBuZXcgb25lLCBzbyB0aGUgY2hhbmdlIGRvZXMKKyAgICAgKiBub3QgdGFrZSBwbGFjZSBpbW1lZGlhdGVseS4gVG8gcHJvbXB0IHRoZSB1c2VyIGZvciBhIG5ldyBwYXNzd29yZCwgdXNlCisgICAgICoge0BsaW5rICNBQ1RJT05fU0VUX05FV19QQVNTV09SRH0gYWZ0ZXIgc2V0dGluZyB0aGlzIHZhbHVlLiBUaGlzCisgICAgICogY29uc3RyYWludCBpcyBvbmx5IGltcG9zZWQgaWYgdGhlIGFkbWluaXN0cmF0b3IgaGFzIGFsc28gcmVxdWVzdGVkCisgICAgICoge0BsaW5rICNQQVNTV09SRF9RVUFMSVRZX0NPTVBMRVh9IHdpdGgge0BsaW5rICNzZXRQYXNzd29yZFF1YWxpdHl9LiBUaGUKKyAgICAgKiBkZWZhdWx0IHZhbHVlIGlzIDEuCisgICAgICogPHA+CisgICAgICogVGhlIGNhbGxpbmcgZGV2aWNlIGFkbWluIG11c3QgaGF2ZSByZXF1ZXN0ZWQKKyAgICAgKiB7QGxpbmsgRGV2aWNlQWRtaW5JbmZvI1VTRVNfUE9MSUNZX0xJTUlUX1BBU1NXT1JEfSB0byBiZSBhYmxlIHRvIGNhbGwKKyAgICAgKiB0aGlzIG1ldGhvZDsgaWYgaXQgaGFzIG5vdCwgYSBzZWN1cml0eSBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWRtaW4gV2hpY2gge0BsaW5rIERldmljZUFkbWluUmVjZWl2ZXJ9IHRoaXMgcmVxdWVzdCBpcyBhc3NvY2lhdGVkCisgICAgICogICAgICAgICAgICB3aXRoLgorICAgICAqIEBwYXJhbSBsZW5ndGggVGhlIG5ldyBkZXNpcmVkIG1pbmltdW0gbnVtYmVyIG9mIG51bWVyaWNhbCBkaWdpdHMgcmVxdWlyZWQKKyAgICAgKiAgICAgICAgICAgIGluIHRoZSBwYXNzd29yZC4gQSB2YWx1ZSBvZiAwIG1lYW5zIHRoZXJlIGlzIG5vIHJlc3RyaWN0aW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFBhc3N3b3JkTWluaW11bU51bWVyaWMoQ29tcG9uZW50TmFtZSBhZG1pbiwgaW50IGxlbmd0aCkgeworICAgICAgICBpZiAobVNlcnZpY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtU2VydmljZS5zZXRQYXNzd29yZE1pbmltdW1OdW1lcmljKGFkbWluLCBsZW5ndGgpOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJGYWlsZWQgdGFsa2luZyB3aXRoIGRldmljZSBwb2xpY3kgc2VydmljZSIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0cmlldmUgdGhlIGN1cnJlbnQgbnVtYmVyIG9mIG51bWVyaWNhbCBkaWdpdHMgcmVxdWlyZWQgaW4gdGhlIHBhc3N3b3JkCisgICAgICogZm9yIGFsbCBhZG1pbnMgb3IgYSBwYXJ0aWN1bGFyIG9uZS4gVGhpcyBpcyB0aGUgc2FtZSB2YWx1ZSBhcworICAgICAqIHNldCBieSB7I2xpbmsge0BsaW5rICNzZXRQYXNzd29yZE1pbmltdW1OdW1lcmljKENvbXBvbmVudE5hbWUsIGludCl9CisgICAgICogYW5kIG9ubHkgYXBwbGllcyB3aGVuIHRoZSBwYXNzd29yZCBxdWFsaXR5IGlzCisgICAgICoge0BsaW5rICNQQVNTV09SRF9RVUFMSVRZX0NPTVBMRVh9LgorICAgICAqCisgICAgICogQHBhcmFtIGFkbWluIFRoZSBuYW1lIG9mIHRoZSBhZG1pbiBjb21wb25lbnQgdG8gY2hlY2ssIG9yIG51bGwgdG8KKyAgICAgKiAgICAgICAgICAgIGFnZ3JlZ2F0ZSBhbGwgYWRtaW5zLgorICAgICAqIEByZXR1cm4gVGhlIG1pbmltdW0gbnVtYmVyIG9mIG51bWVyaWNhbCBkaWdpdHMgcmVxdWlyZWQgaW4gdGhlIHBhc3N3b3JkLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0UGFzc3dvcmRNaW5pbXVtTnVtZXJpYyhDb21wb25lbnROYW1lIGFkbWluKSB7CisgICAgICAgIGlmIChtU2VydmljZSAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJldHVybiBtU2VydmljZS5nZXRQYXNzd29yZE1pbmltdW1OdW1lcmljKGFkbWluKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiRmFpbGVkIHRhbGtpbmcgd2l0aCBkZXZpY2UgcG9saWN5IHNlcnZpY2UiLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgYnkgYW4gYXBwbGljYXRpb24gdGhhdCBpcyBhZG1pbmlzdGVyaW5nIHRoZSBkZXZpY2UgdG8gc2V0IHRoZQorICAgICAqIG1pbmltdW0gbnVtYmVyIG9mIHN5bWJvbHMgcmVxdWlyZWQgaW4gdGhlIHBhc3N3b3JkLiBBZnRlciBzZXR0aW5nIHRoaXMsCisgICAgICogdGhlIHVzZXIgd2lsbCBub3QgYmUgYWJsZSB0byBlbnRlciBhIG5ldyBwYXNzd29yZCB0aGF0IGlzIG5vdCBhdCBsZWFzdCBhcworICAgICAqIHJlc3RyaWN0aXZlIGFzIHdoYXQgaGFzIGJlZW4gc2V0LiBOb3RlIHRoYXQgdGhlIGN1cnJlbnQgcGFzc3dvcmQgd2lsbAorICAgICAqIHJlbWFpbiB1bnRpbCB0aGUgdXNlciBoYXMgc2V0IGEgbmV3IG9uZSwgc28gdGhlIGNoYW5nZSBkb2VzIG5vdCB0YWtlCisgICAgICogcGxhY2UgaW1tZWRpYXRlbHkuIFRvIHByb21wdCB0aGUgdXNlciBmb3IgYSBuZXcgcGFzc3dvcmQsIHVzZQorICAgICAqIHtAbGluayAjQUNUSU9OX1NFVF9ORVdfUEFTU1dPUkR9IGFmdGVyIHNldHRpbmcgdGhpcyB2YWx1ZS4gVGhpcworICAgICAqIGNvbnN0cmFpbnQgaXMgb25seSBpbXBvc2VkIGlmIHRoZSBhZG1pbmlzdHJhdG9yIGhhcyBhbHNvIHJlcXVlc3RlZAorICAgICAqIHtAbGluayAjUEFTU1dPUkRfUVVBTElUWV9DT01QTEVYfSB3aXRoIHtAbGluayAjc2V0UGFzc3dvcmRRdWFsaXR5fS4gVGhlCisgICAgICogZGVmYXVsdCB2YWx1ZSBpcyAxLgorICAgICAqIDxwPgorICAgICAqIFRoZSBjYWxsaW5nIGRldmljZSBhZG1pbiBtdXN0IGhhdmUgcmVxdWVzdGVkCisgICAgICoge0BsaW5rIERldmljZUFkbWluSW5mbyNVU0VTX1BPTElDWV9MSU1JVF9QQVNTV09SRH0gdG8gYmUgYWJsZSB0byBjYWxsCisgICAgICogdGhpcyBtZXRob2Q7IGlmIGl0IGhhcyBub3QsIGEgc2VjdXJpdHkgZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLgorICAgICAqCisgICAgICogQHBhcmFtIGFkbWluIFdoaWNoIHtAbGluayBEZXZpY2VBZG1pblJlY2VpdmVyfSB0aGlzIHJlcXVlc3QgaXMgYXNzb2NpYXRlZAorICAgICAqICAgICAgICAgICAgd2l0aC4KKyAgICAgKiBAcGFyYW0gbGVuZ3RoIFRoZSBuZXcgZGVzaXJlZCBtaW5pbXVtIG51bWJlciBvZiBzeW1ib2xzIHJlcXVpcmVkIGluIHRoZQorICAgICAqICAgICAgICAgICAgcGFzc3dvcmQuIEEgdmFsdWUgb2YgMCBtZWFucyB0aGVyZSBpcyBubyByZXN0cmljdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZE1pbmltdW1TeW1ib2xzKENvbXBvbmVudE5hbWUgYWRtaW4sIGludCBsZW5ndGgpIHsKKyAgICAgICAgaWYgKG1TZXJ2aWNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbVNlcnZpY2Uuc2V0UGFzc3dvcmRNaW5pbXVtU3ltYm9scyhhZG1pbiwgbGVuZ3RoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiRmFpbGVkIHRhbGtpbmcgd2l0aCBkZXZpY2UgcG9saWN5IHNlcnZpY2UiLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHJpZXZlIHRoZSBjdXJyZW50IG51bWJlciBvZiBzeW1ib2xzIHJlcXVpcmVkIGluIHRoZSBwYXNzd29yZCBmb3IgYWxsCisgICAgICogYWRtaW5zIG9yIGEgcGFydGljdWxhciBvbmUuIFRoaXMgaXMgdGhlIHNhbWUgdmFsdWUgYXMKKyAgICAgKiBzZXQgYnkgeyNsaW5rIHtAbGluayAjc2V0UGFzc3dvcmRNaW5pbXVtU3ltYm9scyhDb21wb25lbnROYW1lLCBpbnQpfQorICAgICAqIGFuZCBvbmx5IGFwcGxpZXMgd2hlbiB0aGUgcGFzc3dvcmQgcXVhbGl0eSBpcworICAgICAqIHtAbGluayAjUEFTU1dPUkRfUVVBTElUWV9DT01QTEVYfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhZG1pbiBUaGUgbmFtZSBvZiB0aGUgYWRtaW4gY29tcG9uZW50IHRvIGNoZWNrLCBvciBudWxsIHRvCisgICAgICogICAgICAgICAgICBhZ2dyZWdhdGUgYWxsIGFkbWlucy4KKyAgICAgKiBAcmV0dXJuIFRoZSBtaW5pbXVtIG51bWJlciBvZiBzeW1ib2xzIHJlcXVpcmVkIGluIHRoZSBwYXNzd29yZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFBhc3N3b3JkTWluaW11bVN5bWJvbHMoQ29tcG9uZW50TmFtZSBhZG1pbikgeworICAgICAgICBpZiAobVNlcnZpY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbVNlcnZpY2UuZ2V0UGFzc3dvcmRNaW5pbXVtU3ltYm9scyhhZG1pbik7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkZhaWxlZCB0YWxraW5nIHdpdGggZGV2aWNlIHBvbGljeSBzZXJ2aWNlIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIGJ5IGFuIGFwcGxpY2F0aW9uIHRoYXQgaXMgYWRtaW5pc3RlcmluZyB0aGUgZGV2aWNlIHRvIHNldCB0aGUKKyAgICAgKiBtaW5pbXVtIG51bWJlciBvZiBub24tbGV0dGVyIGNoYXJhY3RlcnMgKG51bWVyaWNhbCBkaWdpdHMgb3Igc3ltYm9scykKKyAgICAgKiByZXF1aXJlZCBpbiB0aGUgcGFzc3dvcmQuIEFmdGVyIHNldHRpbmcgdGhpcywgdGhlIHVzZXIgd2lsbCBub3QgYmUgYWJsZQorICAgICAqIHRvIGVudGVyIGEgbmV3IHBhc3N3b3JkIHRoYXQgaXMgbm90IGF0IGxlYXN0IGFzIHJlc3RyaWN0aXZlIGFzIHdoYXQgaGFzCisgICAgICogYmVlbiBzZXQuIE5vdGUgdGhhdCB0aGUgY3VycmVudCBwYXNzd29yZCB3aWxsIHJlbWFpbiB1bnRpbCB0aGUgdXNlciBoYXMKKyAgICAgKiBzZXQgYSBuZXcgb25lLCBzbyB0aGUgY2hhbmdlIGRvZXMgbm90IHRha2UgcGxhY2UgaW1tZWRpYXRlbHkuIFRvIHByb21wdAorICAgICAqIHRoZSB1c2VyIGZvciBhIG5ldyBwYXNzd29yZCwgdXNlIHtAbGluayAjQUNUSU9OX1NFVF9ORVdfUEFTU1dPUkR9IGFmdGVyCisgICAgICogc2V0dGluZyB0aGlzIHZhbHVlLiBUaGlzIGNvbnN0cmFpbnQgaXMgb25seSBpbXBvc2VkIGlmIHRoZSBhZG1pbmlzdHJhdG9yCisgICAgICogaGFzIGFsc28gcmVxdWVzdGVkIHtAbGluayAjUEFTU1dPUkRfUVVBTElUWV9DT01QTEVYfSB3aXRoCisgICAgICoge0BsaW5rICNzZXRQYXNzd29yZFF1YWxpdHl9LiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAwLgorICAgICAqIDxwPgorICAgICAqIFRoZSBjYWxsaW5nIGRldmljZSBhZG1pbiBtdXN0IGhhdmUgcmVxdWVzdGVkCisgICAgICoge0BsaW5rIERldmljZUFkbWluSW5mbyNVU0VTX1BPTElDWV9MSU1JVF9QQVNTV09SRH0gdG8gYmUgYWJsZSB0byBjYWxsCisgICAgICogdGhpcyBtZXRob2Q7IGlmIGl0IGhhcyBub3QsIGEgc2VjdXJpdHkgZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLgorICAgICAqCisgICAgICogQHBhcmFtIGFkbWluIFdoaWNoIHtAbGluayBEZXZpY2VBZG1pblJlY2VpdmVyfSB0aGlzIHJlcXVlc3QgaXMgYXNzb2NpYXRlZAorICAgICAqICAgICAgICAgICAgd2l0aC4KKyAgICAgKiBAcGFyYW0gbGVuZ3RoIFRoZSBuZXcgZGVzaXJlZCBtaW5pbXVtIG51bWJlciBvZiBsZXR0ZXJzIHJlcXVpcmVkIGluIHRoZQorICAgICAqICAgICAgICAgICAgcGFzc3dvcmQuIEEgdmFsdWUgb2YgMCBtZWFucyB0aGVyZSBpcyBubyByZXN0cmljdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZE1pbmltdW1Ob25MZXR0ZXIoQ29tcG9uZW50TmFtZSBhZG1pbiwgaW50IGxlbmd0aCkgeworICAgICAgICBpZiAobVNlcnZpY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtU2VydmljZS5zZXRQYXNzd29yZE1pbmltdW1Ob25MZXR0ZXIoYWRtaW4sIGxlbmd0aCk7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkZhaWxlZCB0YWxraW5nIHdpdGggZGV2aWNlIHBvbGljeSBzZXJ2aWNlIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZSB0aGUgY3VycmVudCBudW1iZXIgb2Ygbm9uLWxldHRlciBjaGFyYWN0ZXJzIHJlcXVpcmVkIGluIHRoZQorICAgICAqIHBhc3N3b3JkIGZvciBhbGwgYWRtaW5zIG9yIGEgcGFydGljdWxhciBvbmUuIFRoaXMgaXMgdGhlIHNhbWUgdmFsdWUgYXMKKyAgICAgKiBzZXQgYnkgeyNsaW5rIHtAbGluayAjc2V0UGFzc3dvcmRNaW5pbXVtTm9uTGV0dGVyKENvbXBvbmVudE5hbWUsIGludCl9CisgICAgICogYW5kIG9ubHkgYXBwbGllcyB3aGVuIHRoZSBwYXNzd29yZCBxdWFsaXR5IGlzCisgICAgICoge0BsaW5rICNQQVNTV09SRF9RVUFMSVRZX0NPTVBMRVh9LgorICAgICAqCisgICAgICogQHBhcmFtIGFkbWluIFRoZSBuYW1lIG9mIHRoZSBhZG1pbiBjb21wb25lbnQgdG8gY2hlY2ssIG9yIG51bGwgdG8KKyAgICAgKiAgICAgICAgICAgIGFnZ3JlZ2F0ZSBhbGwgYWRtaW5zLgorICAgICAqIEByZXR1cm4gVGhlIG1pbmltdW0gbnVtYmVyIG9mIGxldHRlcnMgcmVxdWlyZWQgaW4gdGhlIHBhc3N3b3JkLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0UGFzc3dvcmRNaW5pbXVtTm9uTGV0dGVyKENvbXBvbmVudE5hbWUgYWRtaW4pIHsKKyAgICAgICAgaWYgKG1TZXJ2aWNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLmdldFBhc3N3b3JkTWluaW11bU5vbkxldHRlcihhZG1pbik7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkZhaWxlZCB0YWxraW5nIHdpdGggZGV2aWNlIHBvbGljeSBzZXJ2aWNlIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgIC8qKgorICAgKiBDYWxsZWQgYnkgYW4gYXBwbGljYXRpb24gdGhhdCBpcyBhZG1pbmlzdGVyaW5nIHRoZSBkZXZpY2UgdG8gc2V0IHRoZSBsZW5ndGgKKyAgICogb2YgdGhlIHBhc3N3b3JkIGhpc3RvcnkuIEFmdGVyIHNldHRpbmcgdGhpcywgdGhlIHVzZXIgd2lsbCBub3QgYmUgYWJsZSB0bworICAgKiBlbnRlciBhIG5ldyBwYXNzd29yZCB0aGF0IGlzIHRoZSBzYW1lIGFzIGFueSBwYXNzd29yZCBpbiB0aGUgaGlzdG9yeS4gTm90ZQorICAgKiB0aGF0IHRoZSBjdXJyZW50IHBhc3N3b3JkIHdpbGwgcmVtYWluIHVudGlsIHRoZSB1c2VyIGhhcyBzZXQgYSBuZXcgb25lLCBzbworICAgKiB0aGUgY2hhbmdlIGRvZXMgbm90IHRha2UgcGxhY2UgaW1tZWRpYXRlbHkuIFRvIHByb21wdCB0aGUgdXNlciBmb3IgYSBuZXcKKyAgICogcGFzc3dvcmQsIHVzZSB7QGxpbmsgI0FDVElPTl9TRVRfTkVXX1BBU1NXT1JEfSBhZnRlciBzZXR0aW5nIHRoaXMgdmFsdWUuCisgICAqIFRoaXMgY29uc3RyYWludCBpcyBvbmx5IGltcG9zZWQgaWYgdGhlIGFkbWluaXN0cmF0b3IgaGFzIGFsc28gcmVxdWVzdGVkCisgICAqIGVpdGhlciB7QGxpbmsgI1BBU1NXT1JEX1FVQUxJVFlfTlVNRVJJQ30sCisgICAqIHtAbGluayAjUEFTU1dPUkRfUVVBTElUWV9BTFBIQUJFVElDfSwgb3IKKyAgICoge0BsaW5rICNQQVNTV09SRF9RVUFMSVRZX0FMUEhBTlVNRVJJQ30gd2l0aCB7QGxpbmsgI3NldFBhc3N3b3JkUXVhbGl0eX0uCisgICAqCisgICAqIDxwPgorICAgKiBUaGUgY2FsbGluZyBkZXZpY2UgYWRtaW4gbXVzdCBoYXZlIHJlcXVlc3RlZAorICAgKiB7QGxpbmsgRGV2aWNlQWRtaW5JbmZvI1VTRVNfUE9MSUNZX0xJTUlUX1BBU1NXT1JEfSB0byBiZSBhYmxlIHRvIGNhbGwgdGhpcworICAgKiBtZXRob2Q7IGlmIGl0IGhhcyBub3QsIGEgc2VjdXJpdHkgZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLgorICAgKgorICAgKiBAcGFyYW0gYWRtaW4gV2hpY2gge0BsaW5rIERldmljZUFkbWluUmVjZWl2ZXJ9IHRoaXMgcmVxdWVzdCBpcyBhc3NvY2lhdGVkCisgICAqICAgICAgICB3aXRoLgorICAgKiBAcGFyYW0gbGVuZ3RoIFRoZSBuZXcgZGVzaXJlZCBsZW5ndGggb2YgcGFzc3dvcmQgaGlzdG9yeS4gQSB2YWx1ZSBvZiAwCisgICAqICAgICAgICBtZWFucyB0aGVyZSBpcyBubyByZXN0cmljdGlvbi4KKyAgICovCisgICAgcHVibGljIHZvaWQgc2V0UGFzc3dvcmRIaXN0b3J5TGVuZ3RoKENvbXBvbmVudE5hbWUgYWRtaW4sIGludCBsZW5ndGgpIHsKKyAgICAgICAgaWYgKG1TZXJ2aWNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbVNlcnZpY2Uuc2V0UGFzc3dvcmRIaXN0b3J5TGVuZ3RoKGFkbWluLCBsZW5ndGgpOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJGYWlsZWQgdGFsa2luZyB3aXRoIGRldmljZSBwb2xpY3kgc2VydmljZSIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0cmlldmUgdGhlIGN1cnJlbnQgcGFzc3dvcmQgaGlzdG9yeSBsZW5ndGggZm9yIGFsbCBhZG1pbnMKKyAgICAgKiBvciBhIHBhcnRpY3VsYXIgb25lLgorICAgICAqIEBwYXJhbSBhZG1pbiBUaGUgbmFtZSBvZiB0aGUgYWRtaW4gY29tcG9uZW50IHRvIGNoZWNrLCBvciBudWxsIHRvIGFnZ3JlZ2F0ZQorICAgICAqIGFsbCBhZG1pbnMuCisgICAgICogQHJldHVybiBUaGUgbGVuZ3RoIG9mIHRoZSBwYXNzd29yZCBoaXN0b3J5CisgICAgICovCisgICAgcHVibGljIGludCBnZXRQYXNzd29yZEhpc3RvcnlMZW5ndGgoQ29tcG9uZW50TmFtZSBhZG1pbikgeworICAgICAgICBpZiAobVNlcnZpY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbVNlcnZpY2UuZ2V0UGFzc3dvcmRIaXN0b3J5TGVuZ3RoKGFkbWluKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiRmFpbGVkIHRhbGtpbmcgd2l0aCBkZXZpY2UgcG9saWN5IHNlcnZpY2UiLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBSZXR1cm4gdGhlIG1heGltdW0gcGFzc3dvcmQgbGVuZ3RoIHRoYXQgdGhlIGRldmljZSBzdXBwb3J0cyBmb3IgYQogICAgICAqIHBhcnRpY3VsYXIgcGFzc3dvcmQgcXVhbGl0eS4KQEAgLTMyMywxNiArNzA4LDE2IEBACiAgICAgICAgIC8vIEtpbmQtb2YgYXJiaXRyYXJ5LgogICAgICAgICByZXR1cm4gMTY7CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGN1cnJlbnQgcGFzc3dvcmQgdGhlIHVzZXIgaGFzIHNldCBpcyBzdWZmaWNpZW50CiAgICAgICogdG8gbWVldCB0aGUgcG9saWN5IHJlcXVpcmVtZW50cyAocXVhbGl0eSwgbWluaW11bSBsZW5ndGgpIHRoYXQgaGF2ZSBiZWVuCiAgICAgICogcmVxdWVzdGVkLgotICAgICAqIAorICAgICAqCiAgICAgICogPHA+VGhlIGNhbGxpbmcgZGV2aWNlIGFkbWluIG11c3QgaGF2ZSByZXF1ZXN0ZWQKICAgICAgKiB7QGxpbmsgRGV2aWNlQWRtaW5JbmZvI1VTRVNfUE9MSUNZX0xJTUlUX1BBU1NXT1JEfSB0byBiZSBhYmxlIHRvIGNhbGwKICAgICAgKiB0aGlzIG1ldGhvZDsgaWYgaXQgaGFzIG5vdCwgYSBzZWN1cml0eSBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24uCi0gICAgICogCisgICAgICoKICAgICAgKiBAcmV0dXJuIFJldHVybnMgdHJ1ZSBpZiB0aGUgcGFzc3dvcmQgbWVldHMgdGhlIGN1cnJlbnQgcmVxdWlyZW1lbnRzLAogICAgICAqIGVsc2UgZmFsc2UuCiAgICAgICovCkBAIC0zNDYsMTEgKzczMSwxMSBAQAogICAgICAgICB9CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBSZXRyaWV2ZSB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSB1c2VyIGhhcyBmYWlsZWQgYXQgZW50ZXJpbmcgYQogICAgICAqIHBhc3N3b3JkIHNpbmNlIHRoYXQgbGFzdCBzdWNjZXNzZnVsIHBhc3N3b3JkIGVudHJ5LgotICAgICAqIAorICAgICAqCiAgICAgICogPHA+VGhlIGNhbGxpbmcgZGV2aWNlIGFkbWluIG11c3QgaGF2ZSByZXF1ZXN0ZWQKICAgICAgKiB7QGxpbmsgRGV2aWNlQWRtaW5JbmZvI1VTRVNfUE9MSUNZX1dBVENIX0xPR0lOfSB0byBiZSBhYmxlIHRvIGNhbGwKICAgICAgKiB0aGlzIG1ldGhvZDsgaWYgaXQgaGFzIG5vdCwgYSBzZWN1cml0eSBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24uCkBAIC0zNzMsMTQgKzc1OCwxNCBAQAogICAgICAqIHdhdGNoaW5nIGZvciBmYWlsZWQgcGFzc3dvcmRzIGFuZCB3aXBpbmcgdGhlIGRldmljZSwgYW5kIHJlcXVpcmVzCiAgICAgICogdGhhdCB5b3UgcmVxdWVzdCBib3RoIHtAbGluayBEZXZpY2VBZG1pbkluZm8jVVNFU19QT0xJQ1lfV0FUQ0hfTE9HSU59IGFuZAogICAgICAqIHtAbGluayBEZXZpY2VBZG1pbkluZm8jVVNFU19QT0xJQ1lfV0lQRV9EQVRBfX0uCi0gICAgICogCisgICAgICoKICAgICAgKiA8cD5UbyBpbXBsZW1lbnQgYW55IG90aGVyIHBvbGljeSAoZS5nLiB3aXBpbmcgZGF0YSBmb3IgYSBwYXJ0aWN1bGFyCiAgICAgICogYXBwbGljYXRpb24gb25seSwgZXJhc2luZyBvciByZXZva2luZyBjcmVkZW50aWFscywgb3IgcmVwb3J0aW5nIHRoZQogICAgICAqIGZhaWx1cmUgdG8gYSBzZXJ2ZXIpLCB5b3Ugc2hvdWxkIGltcGxlbWVudAogICAgICAqIHtAbGluayBEZXZpY2VBZG1pblJlY2VpdmVyI29uUGFzc3dvcmRGYWlsZWQoQ29udGV4dCwgYW5kcm9pZC5jb250ZW50LkludGVudCl9CiAgICAgICogaW5zdGVhZC4gIERvIG5vdCB1c2UgdGhpcyBBUEksIGJlY2F1c2UgaWYgdGhlIG1heGltdW0gY291bnQgaXMgcmVhY2hlZCwKICAgICAgKiB0aGUgZGV2aWNlIHdpbGwgYmUgd2lwZWQgaW1tZWRpYXRlbHksIGFuZCB5b3VyIGNhbGxiYWNrIHdpbGwgbm90IGJlIGludm9rZWQuCi0gICAgICogCisgICAgICoKICAgICAgKiBAcGFyYW0gYWRtaW4gV2hpY2gge0BsaW5rIERldmljZUFkbWluUmVjZWl2ZXJ9IHRoaXMgcmVxdWVzdCBpcyBhc3NvY2lhdGVkIHdpdGguCiAgICAgICogQHBhcmFtIG51bSBUaGUgbnVtYmVyIG9mIGZhaWxlZCBwYXNzd29yZCBhdHRlbXB0cyBhdCB3aGljaCBwb2ludCB0aGUKICAgICAgKiBkZXZpY2Ugd2lsbCB3aXBlIGl0cyBkYXRhLgpAQCAtMzk0LDcgKzc3OSw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBSZXRyaWV2ZSB0aGUgY3VycmVudCBtYXhpbXVtIG51bWJlciBvZiBsb2dpbiBhdHRlbXB0cyB0aGF0IGFyZSBhbGxvd2VkCiAgICAgICogYmVmb3JlIHRoZSBkZXZpY2Ugd2lwZXMgaXRzZWxmLCBmb3IgYWxsIGFkbWlucwpAQCAtNDEyLDEzICs3OTcsMTMgQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gMDsKICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBGbGFnIGZvciB7QGxpbmsgI3Jlc2V0UGFzc3dvcmR9OiBkb24ndCBhbGxvdyBvdGhlciBhZG1pbnMgdG8gY2hhbmdlCiAgICAgICogdGhlIHBhc3N3b3JkIGFnYWluIHVudGlsIHRoZSB1c2VyIGhhcyBlbnRlcmVkIGl0LgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU0VUX1BBU1NXT1JEX1JFUVVJUkVfRU5UUlkgPSAweDAwMDE7Ci0gICAgCisKICAgICAvKioKICAgICAgKiBGb3JjZSBhIG5ldyBkZXZpY2UgdW5sb2NrIHBhc3N3b3JkICh0aGUgcGFzc3dvcmQgbmVlZGVkIHRvIGFjY2VzcyB0aGUKICAgICAgKiBlbnRpcmUgZGV2aWNlLCBub3QgZm9yIGluZGl2aWR1YWwgYWNjb3VudHMpIG9uIHRoZSB1c2VyLiAgVGhpcyB0YWtlcwpAQCAtNDMxLDExICs4MTYsMTEgQEAKICAgICAgKiB0aGF0IHRoZSBwYXNzd29yZCBtYXkgYmUgYSBzdHJvbmdlciBxdWFsaXR5IChjb250YWluaW5nIGFscGhhbnVtZXJpYwogICAgICAqIGNoYXJhY3RlcnMgd2hlbiB0aGUgcmVxdWVzdGVkIHF1YWxpdHkgaXMgb25seSBudW1lcmljKSwgaW4gd2hpY2ggY2FzZQogICAgICAqIHRoZSBjdXJyZW50bHkgYWN0aXZlIHF1YWxpdHkgd2lsbCBiZSBpbmNyZWFzZWQgdG8gbWF0Y2guCi0gICAgICogCisgICAgICoKICAgICAgKiA8cD5UaGUgY2FsbGluZyBkZXZpY2UgYWRtaW4gbXVzdCBoYXZlIHJlcXVlc3RlZAogICAgICAqIHtAbGluayBEZXZpY2VBZG1pbkluZm8jVVNFU19QT0xJQ1lfUkVTRVRfUEFTU1dPUkR9IHRvIGJlIGFibGUgdG8gY2FsbAogICAgICAqIHRoaXMgbWV0aG9kOyBpZiBpdCBoYXMgbm90LCBhIHNlY3VyaXR5IGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEBwYXJhbSBwYXNzd29yZCBUaGUgbmV3IHBhc3N3b3JkIGZvciB0aGUgdXNlci4KICAgICAgKiBAcGFyYW0gZmxhZ3MgTWF5IGJlIDAgb3Ige0BsaW5rICNSRVNFVF9QQVNTV09SRF9SRVFVSVJFX0VOVFJZfS4KICAgICAgKiBAcmV0dXJuIFJldHVybnMgdHJ1ZSBpZiB0aGUgcGFzc3dvcmQgd2FzIGFwcGxpZWQsIG9yIGZhbHNlIGlmIGl0IGlzCkBAIC00NTEsMTYgKzgzNiwxNiBAQAogICAgICAgICB9CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBDYWxsZWQgYnkgYW4gYXBwbGljYXRpb24gdGhhdCBpcyBhZG1pbmlzdGVyaW5nIHRoZSBkZXZpY2UgdG8gc2V0IHRoZQogICAgICAqIG1heGltdW0gdGltZSBmb3IgdXNlciBhY3Rpdml0eSB1bnRpbCB0aGUgZGV2aWNlIHdpbGwgbG9jay4gIFRoaXMgbGltaXRzCiAgICAgICogdGhlIGxlbmd0aCB0aGF0IHRoZSB1c2VyIGNhbiBzZXQuICBJdCB0YWtlcyBlZmZlY3QgaW1tZWRpYXRlbHkuCi0gICAgICogCisgICAgICoKICAgICAgKiA8cD5UaGUgY2FsbGluZyBkZXZpY2UgYWRtaW4gbXVzdCBoYXZlIHJlcXVlc3RlZAogICAgICAqIHtAbGluayBEZXZpY2VBZG1pbkluZm8jVVNFU19QT0xJQ1lfRk9SQ0VfTE9DS30gdG8gYmUgYWJsZSB0byBjYWxsCiAgICAgICogdGhpcyBtZXRob2Q7IGlmIGl0IGhhcyBub3QsIGEgc2VjdXJpdHkgZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLgotICAgICAqIAorICAgICAqCiAgICAgICogQHBhcmFtIGFkbWluIFdoaWNoIHtAbGluayBEZXZpY2VBZG1pblJlY2VpdmVyfSB0aGlzIHJlcXVlc3QgaXMgYXNzb2NpYXRlZCB3aXRoLgogICAgICAqIEBwYXJhbSB0aW1lTXMgVGhlIG5ldyBkZXNpcmVkIG1heGltdW0gdGltZSB0byBsb2NrIGluIG1pbGxpc2Vjb25kcy4KICAgICAgKiBBIHZhbHVlIG9mIDAgbWVhbnMgdGhlcmUgaXMgbm8gcmVzdHJpY3Rpb24uCkBAIC00NzQsNyArODU5LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIFJldHJpZXZlIHRoZSBjdXJyZW50IG1heGltdW0gdGltZSB0byB1bmxvY2sgZm9yIGFsbCBhZG1pbnMKICAgICAgKiBvciBhIHBhcnRpY3VsYXIgb25lLgpAQCAtNDkxLDExICs4NzYsMTEgQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gMDsKICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBNYWtlIHRoZSBkZXZpY2UgbG9jayBpbW1lZGlhdGVseSwgYXMgaWYgdGhlIGxvY2sgc2NyZWVuIHRpbWVvdXQgaGFzCiAgICAgICogZXhwaXJlZCBhdCB0aGUgcG9pbnQgb2YgdGhpcyBjYWxsLgotICAgICAqIAorICAgICAqCiAgICAgICogPHA+VGhlIGNhbGxpbmcgZGV2aWNlIGFkbWluIG11c3QgaGF2ZSByZXF1ZXN0ZWQKICAgICAgKiB7QGxpbmsgRGV2aWNlQWRtaW5JbmZvI1VTRVNfUE9MSUNZX0ZPUkNFX0xPQ0t9IHRvIGJlIGFibGUgdG8gY2FsbAogICAgICAqIHRoaXMgbWV0aG9kOyBpZiBpdCBoYXMgbm90LCBhIHNlY3VyaXR5IGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4KQEAgLTUwOSwxNiArODk0LDE2IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBBc2sgdGhlIHVzZXIgZGF0ZSBiZSB3aXBlZC4gIFRoaXMgd2lsbCBjYXVzZSB0aGUgZGV2aWNlIHRvIHJlYm9vdCwKICAgICAgKiBlcmFzaW5nIGFsbCB1c2VyIGRhdGEgd2hpbGUgbmV4dCBib290aW5nIHVwLiAgRXh0ZXJuYWwgc3RvcmFnZSBzdWNoCiAgICAgICogYXMgU0QgY2FyZHMgd2lsbCBub3QgYmUgZXJhc2VkLgotICAgICAqIAorICAgICAqCiAgICAgICogPHA+VGhlIGNhbGxpbmcgZGV2aWNlIGFkbWluIG11c3QgaGF2ZSByZXF1ZXN0ZWQKICAgICAgKiB7QGxpbmsgRGV2aWNlQWRtaW5JbmZvI1VTRVNfUE9MSUNZX1dJUEVfREFUQX0gdG8gYmUgYWJsZSB0byBjYWxsCiAgICAgICogdGhpcyBtZXRob2Q7IGlmIGl0IGhhcyBub3QsIGEgc2VjdXJpdHkgZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLgotICAgICAqIAorICAgICAqCiAgICAgICogQHBhcmFtIGZsYWdzIEJpdCBtYXNrIG9mIGFkZGl0aW9uYWwgb3B0aW9uczogY3VycmVudGx5IG11c3QgYmUgMC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCB3aXBlRGF0YShpbnQgZmxhZ3MpIHsKQEAgLTUzMCw3ICs5MTUsOTIgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICAKKworICAgIC8qKgorICAgICAqIENhbGxlZCBieSBhbiBhcHBsaWNhdGlvbiB0aGF0IGlzIGFkbWluaXN0ZXJpbmcgdGhlIGRldmljZSB0byBzZXQgdGhlCisgICAgICogZ2xvYmFsIHByb3h5IGFuZCBleGNsdXNpb24gbGlzdC4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgY2FsbGluZyBkZXZpY2UgYWRtaW4gbXVzdCBoYXZlIHJlcXVlc3RlZAorICAgICAqIHtAbGluayBEZXZpY2VBZG1pbkluZm8jVVNFU19QT0xJQ1lfU0VUU19HTE9CQUxfUFJPWFl9IHRvIGJlIGFibGUgdG8gY2FsbAorICAgICAqIHRoaXMgbWV0aG9kOyBpZiBpdCBoYXMgbm90LCBhIHNlY3VyaXR5IGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4KKyAgICAgKiBPbmx5IHRoZSBmaXJzdCBkZXZpY2UgYWRtaW4gY2FuIHNldCB0aGUgcHJveHkuIElmIGEgc2Vjb25kIGFkbWluIGF0dGVtcHRzCisgICAgICogdG8gc2V0IHRoZSBwcm94eSwgdGhlIHtAbGluayBDb21wb25lbnROYW1lfSBvZiB0aGUgYWRtaW4gb3JpZ2luYWxseSBzZXR0aW5nIHRoZQorICAgICAqIHByb3h5IHdpbGwgYmUgcmV0dXJuZWQuIElmIHN1Y2Nlc3NmdWwgaW4gc2V0dGluZyB0aGUgcHJveHksIG51bGwgd2lsbAorICAgICAqIGJlIHJldHVybmVkLgorICAgICAqIFRoZSBtZXRob2QgY2FuIGJlIGNhbGxlZCByZXBlYXRlZGx5IGJ5IHRoZSBkZXZpY2UgYWRtaW4gYWxyYWR5IHNldHRpbmcgdGhlCisgICAgICogcHJveHkgdG8gdXBkYXRlIHRoZSBwcm94eSBhbmQgZXhjbHVzaW9uIGxpc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWRtaW4gV2hpY2gge0BsaW5rIERldmljZUFkbWluUmVjZWl2ZXJ9IHRoaXMgcmVxdWVzdCBpcyBhc3NvY2lhdGVkCisgICAgICogICAgICAgICAgICB3aXRoLgorICAgICAqIEBwYXJhbSBwcm94eVNwZWMgdGhlIGdsb2JhbCBwcm94eSBkZXNpcmVkLiBNdXN0IGJlIGFuIEhUVFAgUHJveHkuCisgICAgICogICAgICAgICAgICBQYXNzIFByb3h5Lk5PX1BST1hZIHRvIHJlc2V0IHRoZSBwcm94eS4KKyAgICAgKiBAcGFyYW0gZXhjbHVzaW9uTGlzdCBhIGxpc3Qgb2YgZG9tYWlucyB0byBiZSBleGNsdWRlZCBmcm9tIHRoZSBnbG9iYWwgcHJveHkuCisgICAgICogQHJldHVybiByZXR1cm5zIG51bGwgaWYgdGhlIHByb3h5IHdhcyBzdWNjZXNzZnVsbHkgc2V0LCBvciBhIHtAbGluayBDb21wb25lbnROYW1lfQorICAgICAqICAgICAgICAgICAgb2YgdGhlIGRldmljZSBhZG1pbiB0aGF0IHNldHMgdGhldyBwcm94eSBvdGhlcndpc2UuCisgICAgICovCisgICAgcHVibGljIENvbXBvbmVudE5hbWUgc2V0R2xvYmFsUHJveHkoQ29tcG9uZW50TmFtZSBhZG1pbiwgUHJveHkgcHJveHlTcGVjLAorICAgICAgICAgICAgTGlzdDxTdHJpbmc+IGV4Y2x1c2lvbkxpc3QgKSB7CisgICAgICAgIGlmIChwcm94eVNwZWMgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1TZXJ2aWNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGhvc3RTcGVjOworICAgICAgICAgICAgICAgIFN0cmluZyBleGNsU3BlYzsKKyAgICAgICAgICAgICAgICBpZiAocHJveHlTcGVjLmVxdWFscyhQcm94eS5OT19QUk9YWSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaG9zdFNwZWMgPSBudWxsOworICAgICAgICAgICAgICAgICAgICBleGNsU3BlYyA9IG51bGw7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFwcm94eVNwZWMudHlwZSgpLmVxdWFscyhQcm94eS5UeXBlLkhUVFApKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgSW5ldFNvY2tldEFkZHJlc3Mgc2EgPSAoSW5ldFNvY2tldEFkZHJlc3MpcHJveHlTcGVjLmFkZHJlc3MoKTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhvc3ROYW1lID0gc2EuZ2V0SG9zdE5hbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IHBvcnQgPSBzYS5nZXRQb3J0KCk7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgaG9zdEJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgICAgICAgICBob3N0U3BlYyA9IGhvc3RCdWlsZGVyLmFwcGVuZChob3N0TmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoIjoiKS5hcHBlbmQoSW50ZWdlci50b1N0cmluZyhwb3J0KSkudG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4Y2x1c2lvbkxpc3QgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZXhjbFNwZWMgPSAiIjsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgbGlzdEJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBmaXJzdERvbWFpbiA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBleGNsRG9tYWluIDogZXhjbHVzaW9uTGlzdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZmlyc3REb21haW4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdEJ1aWxkZXIgPSBsaXN0QnVpbGRlci5hcHBlbmQoIiwiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdERvbWFpbiA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0QnVpbGRlciA9IGxpc3RCdWlsZGVyLmFwcGVuZChleGNsRG9tYWluLnRyaW0oKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBleGNsU3BlYyA9IGxpc3RCdWlsZGVyLnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZC5uZXQuUHJveHkudmFsaWRhdGUoaG9zdE5hbWUsIEludGVnZXIudG9TdHJpbmcocG9ydCksIGV4Y2xTcGVjKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLnNldEdsb2JhbFByb3h5KGFkbWluLCBob3N0U3BlYywgZXhjbFNwZWMpOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJGYWlsZWQgdGFsa2luZyB3aXRoIGRldmljZSBwb2xpY3kgc2VydmljZSIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGNvbXBvbmVudCBuYW1lIHNldHRpbmcgdGhlIGdsb2JhbCBwcm94eS4KKyAgICAgKiBAcmV0dXJuIENvbXBvbmVudE5hbWUgb2JqZWN0IG9mIHRoZSBkZXZpY2UgYWRtaW4gdGhhdCBzZXQgdGhlIGdsb2JhbCBwcm94eSwgb3IKKyAgICAgKiAgICAgICAgICAgIG51bGwgaWYgbm8gYWRtaW4gaGFzIHNldCB0aGUgcHJveHkuCisgICAgICovCisgICAgcHVibGljIENvbXBvbmVudE5hbWUgZ2V0R2xvYmFsUHJveHlBZG1pbigpIHsKKyAgICAgICAgaWYgKG1TZXJ2aWNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLmdldEdsb2JhbFByb3h5QWRtaW4oKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiRmFpbGVkIHRhbGtpbmcgd2l0aCBkZXZpY2UgcG9saWN5IHNlcnZpY2UiLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBAaGlkZQogICAgICAqLwpAQCAtNTQzLDcgKzEwMTMsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogQGhpZGUKICAgICAgKi8KQEAgLTU1NiwxMCArMTAyNiwxMCBAQAogICAgICAgICAgICAgTG9nLncoVEFHLCAiVW5hYmxlIHRvIHJldHJpZXZlIGRldmljZSBwb2xpY3kgIiArIGNuLCBlKTsKICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIFJlc29sdmVJbmZvIHJpID0gbmV3IFJlc29sdmVJbmZvKCk7CiAgICAgICAgIHJpLmFjdGl2aXR5SW5mbyA9IGFpOwotICAgICAgICAKKwogICAgICAgICB0cnkgewogICAgICAgICAgICAgcmV0dXJuIG5ldyBEZXZpY2VBZG1pbkluZm8obUNvbnRleHQsIHJpKTsKICAgICAgICAgfSBjYXRjaCAoWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiBlKSB7CkBAIC01NzAsNyArMTA0MCw3IEBACiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIEBoaWRlCiAgICAgICovCkBAIC01ODcsMTYgKzEwNTcsMTggQEAKICAgICAvKioKICAgICAgKiBAaGlkZQogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEFjdGl2ZVBhc3N3b3JkU3RhdGUoaW50IHF1YWxpdHksIGludCBsZW5ndGgpIHsKKyAgICBwdWJsaWMgdm9pZCBzZXRBY3RpdmVQYXNzd29yZFN0YXRlKGludCBxdWFsaXR5LCBpbnQgbGVuZ3RoLCBpbnQgbGV0dGVycywgaW50IHVwcGVyY2FzZSwKKyAgICAgICAgICAgIGludCBsb3dlcmNhc2UsIGludCBudW1iZXJzLCBpbnQgc3ltYm9scywgaW50IG5vbmxldHRlcikgewogICAgICAgICBpZiAobVNlcnZpY2UgIT0gbnVsbCkgewogICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBtU2VydmljZS5zZXRBY3RpdmVQYXNzd29yZFN0YXRlKHF1YWxpdHksIGxlbmd0aCk7CisgICAgICAgICAgICAgICAgbVNlcnZpY2Uuc2V0QWN0aXZlUGFzc3dvcmRTdGF0ZShxdWFsaXR5LCBsZW5ndGgsIGxldHRlcnMsIHVwcGVyY2FzZSwgbG93ZXJjYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVycywgc3ltYm9scywgbm9ubGV0dGVyKTsKICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiRmFpbGVkIHRhbGtpbmcgd2l0aCBkZXZpY2UgcG9saWN5IHNlcnZpY2UiLCBlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIEBoaWRlCiAgICAgICovCkBAIC02MDksNyArMTA4MSw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBAaGlkZQogICAgICAqLwpAQCAtNjIyLDQgKzEwOTQsNSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQorCiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvYWRtaW4vSURldmljZVBvbGljeU1hbmFnZXIuYWlkbCBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9hZG1pbi9JRGV2aWNlUG9saWN5TWFuYWdlci5haWRsCmluZGV4IDZmYzRkYzUuLjNmY2Q2ZmMgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9hZG1pbi9JRGV2aWNlUG9saWN5TWFuYWdlci5haWRsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9hZG1pbi9JRGV2aWNlUG9saWN5TWFuYWdlci5haWRsCkBAIC0yNywxMCArMjcsMzEgQEAKIGludGVyZmFjZSBJRGV2aWNlUG9saWN5TWFuYWdlciB7CiAgICAgdm9pZCBzZXRQYXNzd29yZFF1YWxpdHkoaW4gQ29tcG9uZW50TmFtZSB3aG8sIGludCBxdWFsaXR5KTsKICAgICBpbnQgZ2V0UGFzc3dvcmRRdWFsaXR5KGluIENvbXBvbmVudE5hbWUgd2hvKTsKLSAgICAKKwogICAgIHZvaWQgc2V0UGFzc3dvcmRNaW5pbXVtTGVuZ3RoKGluIENvbXBvbmVudE5hbWUgd2hvLCBpbnQgbGVuZ3RoKTsKICAgICBpbnQgZ2V0UGFzc3dvcmRNaW5pbXVtTGVuZ3RoKGluIENvbXBvbmVudE5hbWUgd2hvKTsKKworICAgIHZvaWQgc2V0UGFzc3dvcmRNaW5pbXVtVXBwZXJDYXNlKGluIENvbXBvbmVudE5hbWUgd2hvLCBpbnQgbGVuZ3RoKTsKKyAgICBpbnQgZ2V0UGFzc3dvcmRNaW5pbXVtVXBwZXJDYXNlKGluIENvbXBvbmVudE5hbWUgd2hvKTsKKworICAgIHZvaWQgc2V0UGFzc3dvcmRNaW5pbXVtTG93ZXJDYXNlKGluIENvbXBvbmVudE5hbWUgd2hvLCBpbnQgbGVuZ3RoKTsKKyAgICBpbnQgZ2V0UGFzc3dvcmRNaW5pbXVtTG93ZXJDYXNlKGluIENvbXBvbmVudE5hbWUgd2hvKTsKKworICAgIHZvaWQgc2V0UGFzc3dvcmRNaW5pbXVtTGV0dGVycyhpbiBDb21wb25lbnROYW1lIHdobywgaW50IGxlbmd0aCk7CisgICAgaW50IGdldFBhc3N3b3JkTWluaW11bUxldHRlcnMoaW4gQ29tcG9uZW50TmFtZSB3aG8pOworCisgICAgdm9pZCBzZXRQYXNzd29yZE1pbmltdW1OdW1lcmljKGluIENvbXBvbmVudE5hbWUgd2hvLCBpbnQgbGVuZ3RoKTsKKyAgICBpbnQgZ2V0UGFzc3dvcmRNaW5pbXVtTnVtZXJpYyhpbiBDb21wb25lbnROYW1lIHdobyk7CisKKyAgICB2b2lkIHNldFBhc3N3b3JkTWluaW11bVN5bWJvbHMoaW4gQ29tcG9uZW50TmFtZSB3aG8sIGludCBsZW5ndGgpOworICAgIGludCBnZXRQYXNzd29yZE1pbmltdW1TeW1ib2xzKGluIENvbXBvbmVudE5hbWUgd2hvKTsKKworICAgIHZvaWQgc2V0UGFzc3dvcmRNaW5pbXVtTm9uTGV0dGVyKGluIENvbXBvbmVudE5hbWUgd2hvLCBpbnQgbGVuZ3RoKTsKKyAgICBpbnQgZ2V0UGFzc3dvcmRNaW5pbXVtTm9uTGV0dGVyKGluIENvbXBvbmVudE5hbWUgd2hvKTsKICAgICAKKyAgICB2b2lkIHNldFBhc3N3b3JkSGlzdG9yeUxlbmd0aChpbiBDb21wb25lbnROYW1lIHdobywgaW50IGxlbmd0aCk7CisgICAgaW50IGdldFBhc3N3b3JkSGlzdG9yeUxlbmd0aChpbiBDb21wb25lbnROYW1lIHdobyk7CisKICAgICBib29sZWFuIGlzQWN0aXZlUGFzc3dvcmRTdWZmaWNpZW50KCk7CiAgICAgaW50IGdldEN1cnJlbnRGYWlsZWRQYXNzd29yZEF0dGVtcHRzKCk7CiAgICAgCkBAIC00NSw2ICs2Niw5IEBACiAgICAgdm9pZCBsb2NrTm93KCk7CiAgICAgCiAgICAgdm9pZCB3aXBlRGF0YShpbnQgZmxhZ3MpOworCisgICAgQ29tcG9uZW50TmFtZSBzZXRHbG9iYWxQcm94eShpbiBDb21wb25lbnROYW1lIGFkbWluLCBTdHJpbmcgcHJveHlTcGVjLCBTdHJpbmcgZXhjbHVzaW9uTGlzdCk7CisgICAgQ29tcG9uZW50TmFtZSBnZXRHbG9iYWxQcm94eUFkbWluKCk7CiAgICAgCiAgICAgdm9pZCBzZXRBY3RpdmVBZG1pbihpbiBDb21wb25lbnROYW1lIHBvbGljeVJlY2VpdmVyKTsKICAgICBib29sZWFuIGlzQWRtaW5BY3RpdmUoaW4gQ29tcG9uZW50TmFtZSBwb2xpY3lSZWNlaXZlcik7CkBAIC01Myw3ICs3Nyw4IEBACiAgICAgdm9pZCBnZXRSZW1vdmVXYXJuaW5nKGluIENvbXBvbmVudE5hbWUgcG9saWN5UmVjZWl2ZXIsIGluIFJlbW90ZUNhbGxiYWNrIHJlc3VsdCk7CiAgICAgdm9pZCByZW1vdmVBY3RpdmVBZG1pbihpbiBDb21wb25lbnROYW1lIHBvbGljeVJlY2VpdmVyKTsKICAgICAKLSAgICB2b2lkIHNldEFjdGl2ZVBhc3N3b3JkU3RhdGUoaW50IHF1YWxpdHksIGludCBsZW5ndGgpOworICAgIHZvaWQgc2V0QWN0aXZlUGFzc3dvcmRTdGF0ZShpbnQgcXVhbGl0eSwgaW50IGxlbmd0aCwgaW50IGxldHRlcnMsIGludCB1cHBlcmNhc2UsIGludCBsb3dlcmNhc2UsCisgICAgICAgIGludCBudW1iZXJzLCBpbnQgc3ltYm9scywgaW50IG5vbmxldHRlcik7CiAgICAgdm9pZCByZXBvcnRGYWlsZWRQYXNzd29yZEF0dGVtcHQoKTsKICAgICB2b2lkIHJlcG9ydFN1Y2Nlc3NmdWxQYXNzd29yZEF0dGVtcHQoKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcHdpZGdldC9BcHBXaWRnZXRIb3N0LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHB3aWRnZXQvQXBwV2lkZ2V0SG9zdC5qYXZhCmluZGV4IGIyZmMxM2YuLjc3MzA5NDIgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcHdpZGdldC9BcHBXaWRnZXRIb3N0LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwd2lkZ2V0L0FwcFdpZGdldEhvc3QuamF2YQpAQCAtMzksNiArMzksNyBAQAogCiAgICAgc3RhdGljIGZpbmFsIGludCBIQU5ETEVfVVBEQVRFID0gMTsKICAgICBzdGF0aWMgZmluYWwgaW50IEhBTkRMRV9QUk9WSURFUl9DSEFOR0VEID0gMjsKKyAgICBzdGF0aWMgZmluYWwgaW50IEhBTkRMRV9WSUVXX0RBVEFfQ0hBTkdFRCA9IDM7CiAKICAgICBmaW5hbCBzdGF0aWMgT2JqZWN0IHNTZXJ2aWNlTG9jayA9IG5ldyBPYmplY3QoKTsKICAgICBzdGF0aWMgSUFwcFdpZGdldFNlcnZpY2Ugc1NlcnZpY2U7CkBAIC02MCw2ICs2MSwxMyBAQAogICAgICAgICAgICAgbXNnLm9iaiA9IGluZm87CiAgICAgICAgICAgICBtc2cuc2VuZFRvVGFyZ2V0KCk7CiAgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB2aWV3RGF0YUNoYW5nZWQoaW50IGFwcFdpZGdldElkLCBpbnQgdmlld0lkKSB7CisgICAgICAgICAgICBNZXNzYWdlIG1zZyA9IG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoSEFORExFX1ZJRVdfREFUQV9DSEFOR0VEKTsKKyAgICAgICAgICAgIG1zZy5hcmcxID0gYXBwV2lkZ2V0SWQ7CisgICAgICAgICAgICBtc2cuYXJnMiA9IHZpZXdJZDsKKyAgICAgICAgICAgIG1zZy5zZW5kVG9UYXJnZXQoKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIGNsYXNzIFVwZGF0ZUhhbmRsZXIgZXh0ZW5kcyBIYW5kbGVyIHsKQEAgLTc3LDYgKzg1LDEwIEBACiAgICAgICAgICAgICAgICAgICAgIG9uUHJvdmlkZXJDaGFuZ2VkKG1zZy5hcmcxLCAoQXBwV2lkZ2V0UHJvdmlkZXJJbmZvKW1zZy5vYmopOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FzZSBIQU5ETEVfVklFV19EQVRBX0NIQU5HRUQ6IHsKKyAgICAgICAgICAgICAgICAgICAgdmlld0RhdGFDaGFuZ2VkKG1zZy5hcmcxLCBtc2cuYXJnMik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTI1MCw2ICsyNjIsMTYgQEAKICAgICAgICAgICAgIHYudXBkYXRlQXBwV2lkZ2V0KHZpZXdzKTsKICAgICAgICAgfQogICAgIH0KKworICAgIHZvaWQgdmlld0RhdGFDaGFuZ2VkKGludCBhcHBXaWRnZXRJZCwgaW50IHZpZXdJZCkgeworICAgICAgICBBcHBXaWRnZXRIb3N0VmlldyB2OworICAgICAgICBzeW5jaHJvbml6ZWQgKG1WaWV3cykgeworICAgICAgICAgICAgdiA9IG1WaWV3cy5nZXQoYXBwV2lkZ2V0SWQpOworICAgICAgICB9CisgICAgICAgIGlmICh2ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHYudmlld0RhdGFDaGFuZ2VkKHZpZXdJZCk7CisgICAgICAgIH0KKyAgICB9CiB9CiAKIApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwd2lkZ2V0L0FwcFdpZGdldEhvc3RWaWV3LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHB3aWRnZXQvQXBwV2lkZ2V0SG9zdFZpZXcuamF2YQppbmRleCBiMzNiMDk3Li40ZjhlZTkzIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9hcHB3aWRnZXQvQXBwV2lkZ2V0SG9zdFZpZXcuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHB3aWRnZXQvQXBwV2lkZ2V0SG9zdFZpZXcuamF2YQpAQCAtMjMsMTUgKzIzLDE4IEBACiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Db2xvcjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50OwotaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7Ci1pbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxhYmxlOwogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsOworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsYWJsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOwogaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIGltcG9ydCBhbmRyb2lkLnV0aWwuU3BhcnNlQXJyYXk7CiBpbXBvcnQgYW5kcm9pZC52aWV3LkdyYXZpdHk7CiBpbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQmFzZUFkYXB0ZXI7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuRnJhbWVMYXlvdXQ7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuUmVtb3RlVmlld3M7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CkBAIC0yNTgsNiArMjYxLDIyIEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogUHJvY2VzcyBkYXRhLWNoYW5nZWQgbm90aWZpY2F0aW9ucyBmb3IgdGhlIHNwZWNpZmllZCB2aWV3IGluIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBzZXQgb2Yge0BsaW5rIFJlbW90ZVZpZXdzfSB2aWV3cy4KKyAgICAgKi8KKyAgICB2b2lkIHZpZXdEYXRhQ2hhbmdlZChpbnQgdmlld0lkKSB7CisgICAgICAgIFZpZXcgdiA9IGZpbmRWaWV3QnlJZCh2aWV3SWQpOworICAgICAgICBpZiAoKHYgIT0gbnVsbCkgJiYgKHYgaW5zdGFuY2VvZiBBZGFwdGVyVmlldzw/PikpIHsKKyAgICAgICAgICAgIEFkYXB0ZXJWaWV3PD8+IGFkYXB0ZXJWaWV3ID0gKEFkYXB0ZXJWaWV3PD8+KSB2OworICAgICAgICAgICAgQWRhcHRlciBhZGFwdGVyID0gYWRhcHRlclZpZXcuZ2V0QWRhcHRlcigpOworICAgICAgICAgICAgaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBCYXNlQWRhcHRlcikgeworICAgICAgICAgICAgICAgIEJhc2VBZGFwdGVyIGJhc2VBZGFwdGVyID0gKEJhc2VBZGFwdGVyKSBhZGFwdGVyOworICAgICAgICAgICAgICAgIGJhc2VBZGFwdGVyLm5vdGlmeURhdGFTZXRDaGFuZ2VkKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKICAgICAgKiBCdWlsZCBhIHtAbGluayBDb250ZXh0fSBjbG9uZWQgaW50byBhbm90aGVyIHBhY2thZ2UgbmFtZSwgdXN1YWxseSBmb3IgdGhlCiAgICAgICogcHVycG9zZXMgb2YgcmVhZGluZyByZW1vdGUgcmVzb3VyY2VzLgogICAgICAqLwpAQCAtMjc1LDYgKzI5NCw3IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBkcmF3Q2hpbGQoQ2FudmFzIGNhbnZhcywgVmlldyBjaGlsZCwgbG9uZyBkcmF3aW5nVGltZSkgewogICAgICAgICBpZiAoQ1JPU1NGQURFKSB7CiAgICAgICAgICAgICBpbnQgYWxwaGE7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHB3aWRnZXQvQXBwV2lkZ2V0TWFuYWdlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwd2lkZ2V0L0FwcFdpZGdldE1hbmFnZXIuamF2YQppbmRleCBkMmFiODVlLi4yYTU4M2MxIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9hcHB3aWRnZXQvQXBwV2lkZ2V0TWFuYWdlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcHdpZGdldC9BcHBXaWRnZXRNYW5hZ2VyLmphdmEKQEAgLTIzMyw2ICsyMzMsMTAgQEAKICAgICAvKioKICAgICAgKiBTZXQgdGhlIFJlbW90ZVZpZXdzIHRvIHVzZSBmb3IgdGhlIHNwZWNpZmllZCBhcHBXaWRnZXRJZHMuCiAgICAgICoKKyAgICAgKiBOb3RlIHRoYXQgdGhlIFJlbW90ZVZpZXdzIHBhcmFtZXRlciB3aWxsIGJlIGNhY2hlZCBieSB0aGUgQXBwV2lkZ2V0U2VydmljZSwgYW5kIGhlbmNlIHNob3VsZAorICAgICAqIGNvbnRhaW4gYSBjb21wbGV0ZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgd2lkZ2V0LiBGb3IgcGVyZm9ybWluZyBwYXJ0aWFsIHdpZGdldCB1cGRhdGVzLCBzZWUKKyAgICAgKiB7QGxpbmsgI3BhcnRpYWxseVVwZGF0ZUFwcFdpZGdldChpbnRbXSwgUmVtb3RlVmlld3MpfS4KKyAgICAgKgogICAgICAqIDxwPgogICAgICAqIEl0IGlzIG9rYXkgdG8gY2FsbCB0aGlzIG1ldGhvZCBib3RoIGluc2lkZSBhbiB7QGxpbmsgI0FDVElPTl9BUFBXSURHRVRfVVBEQVRFfSBicm9hZGNhc3QsCiAgICAgICogYW5kIG91dHNpZGUgb2YgdGhlIGhhbmRsZXIuCkBAIC0yNTMsNiArMjU3LDEwIEBACiAgICAgLyoqCiAgICAgICogU2V0IHRoZSBSZW1vdGVWaWV3cyB0byB1c2UgZm9yIHRoZSBzcGVjaWZpZWQgYXBwV2lkZ2V0SWQuCiAgICAgICoKKyAgICAgKiBOb3RlIHRoYXQgdGhlIFJlbW90ZVZpZXdzIHBhcmFtZXRlciB3aWxsIGJlIGNhY2hlZCBieSB0aGUgQXBwV2lkZ2V0U2VydmljZSwgYW5kIGhlbmNlIHNob3VsZAorICAgICAqIGNvbnRhaW4gYSBjb21wbGV0ZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgd2lkZ2V0LiBGb3IgcGVyZm9ybWluZyBwYXJ0aWFsIHdpZGdldCB1cGRhdGVzLCBzZWUKKyAgICAgKiB7QGxpbmsgI3BhcnRpYWxseVVwZGF0ZUFwcFdpZGdldChpbnQsIFJlbW90ZVZpZXdzKX0uCisgICAgICoKICAgICAgKiA8cD4KICAgICAgKiBJdCBpcyBva2F5IHRvIGNhbGwgdGhpcyBtZXRob2QgYm90aCBpbnNpZGUgYW4ge0BsaW5rICNBQ1RJT05fQVBQV0lER0VUX1VQREFURX0gYnJvYWRjYXN0LAogICAgICAqIGFuZCBvdXRzaWRlIG9mIHRoZSBoYW5kbGVyLgpAQCAtMjY2LDYgKzI3NCw1OSBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFBlcmZvcm0gYW4gaW5jcmVtZW50YWwgdXBkYXRlIG9yIGNvbW1hbmQgb24gdGhlIHdpZGdldChzKSBzcGVjaWZpZWQgYnkgYXBwV2lkZ2V0SWRzLgorICAgICAqCisgICAgICogVGhpcyB1cGRhdGUgIGRpZmZlcnMgZnJvbSB7QGxpbmsgI3VwZGF0ZUFwcFdpZGdldChpbnRbXSwgUmVtb3RlVmlld3MpfSBpbiB0aGF0IHRoZQorICAgICAqIFJlbW90ZVZpZXdzIG9iamVjdCB3aGljaCBpcyBwYXNzZWQgaXMgdW5kZXJzdG9vZCB0byBiZSBhbiBpbmNvbXBsZXRlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSAKKyAgICAgKiB3aWRnZXQsIGFuZCBoZW5jZSBpcyBub3QgY2FjaGVkIGJ5IHRoZSBBcHBXaWRnZXRTZXJ2aWNlLiBOb3RlIHRoYXQgYmVjYXVzZSB0aGVzZSB1cGRhdGVzIGFyZSAKKyAgICAgKiBub3QgY2FjaGVkLCBhbnkgc3RhdGUgdGhhdCB0aGV5IG1vZGlmeSB0aGF0IGlzIG5vdCByZXN0b3JlZCBieSByZXN0b3JlSW5zdGFuY2VTdGF0ZSB3aWxsIG5vdAorICAgICAqIHBlcnNpc3QgaW4gdGhlIGNhc2UgdGhhdCB0aGUgd2lkZ2V0cyBhcmUgcmVzdG9yZWQgdXNpbmcgdGhlIGNhY2hlZCB2ZXJzaW9uIGluCisgICAgICogQXBwV2lkZ2V0U2VydmljZS4KKyAgICAgKgorICAgICAqIFVzZSB3aXRoIHtAbGluayBSZW1vdGVWaWV3cyNzaG93TmV4dChpbnQpfSwge0BsaW5rIFJlbW90ZVZpZXdzI3Nob3dQcmV2aW91cyhpbnQpfSwKKyAgICAgKiB7QGxpbmsgUmVtb3RlVmlld3Mjc2V0U2Nyb2xsUG9zaXRpb24oaW50LCBpbnQpfSBhbmQgc2ltaWxhciBjb21tYW5kcy4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIEl0IGlzIG9rYXkgdG8gY2FsbCB0aGlzIG1ldGhvZCBib3RoIGluc2lkZSBhbiB7QGxpbmsgI0FDVElPTl9BUFBXSURHRVRfVVBEQVRFfSBicm9hZGNhc3QsCisgICAgICogYW5kIG91dHNpZGUgb2YgdGhlIGhhbmRsZXIuCisgICAgICogVGhpcyBtZXRob2Qgd2lsbCBvbmx5IHdvcmsgd2hlbiBjYWxsZWQgZnJvbSB0aGUgdWlkIHRoYXQgb3ducyB0aGUgQXBwV2lkZ2V0IHByb3ZpZGVyLgorICAgICAqCisgICAgICogQHBhcmFtIGFwcFdpZGdldElkcyAgICAgVGhlIEFwcFdpZGdldCBpbnN0YW5jZXMgZm9yIHdoaWNoIHRvIHNldCB0aGUgUmVtb3RlVmlld3MuCisgICAgICogQHBhcmFtIHZpZXdzICAgICAgICAgICAgVGhlIFJlbW90ZVZpZXdzIG9iamVjdCBjb250YWluaW5nIHRoZSBpbmNyZW1lbnRhbCB1cGRhdGUgLyBjb21tYW5kLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHBhcnRpYWxseVVwZGF0ZUFwcFdpZGdldChpbnRbXSBhcHBXaWRnZXRJZHMsIFJlbW90ZVZpZXdzIHZpZXdzKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzU2VydmljZS5wYXJ0aWFsbHlVcGRhdGVBcHBXaWRnZXRJZHMoYXBwV2lkZ2V0SWRzLCB2aWV3cyk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigic3lzdGVtIHNlcnZlciBkZWFkPyIsIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUGVyZm9ybSBhbiBpbmNyZW1lbnRhbCB1cGRhdGUgb3IgY29tbWFuZCBvbiB0aGUgd2lkZ2V0IHNwZWNpZmllZCBieSBhcHBXaWRnZXRJZC4KKyAgICAgKgorICAgICAqIFRoaXMgdXBkYXRlICBkaWZmZXJzIGZyb20ge0BsaW5rICN1cGRhdGVBcHBXaWRnZXQoaW50LCBSZW1vdGVWaWV3cyl9IGluIHRoYXQgdGhlIFJlbW90ZVZpZXdzCisgICAgICogb2JqZWN0IHdoaWNoIGlzIHBhc3NlZCBpcyB1bmRlcnN0b29kIHRvIGJlIGFuIGluY29tcGxldGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIHdpZGdldCwgYW5kCisgICAgICogaGVuY2UgaXMgbm90IGNhY2hlZCBieSB0aGUgQXBwV2lkZ2V0U2VydmljZS4gTm90ZSB0aGF0IGJlY2F1c2UgdGhlc2UgdXBkYXRlcyBhcmUgbm90IGNhY2hlZCwKKyAgICAgKiBhbnkgc3RhdGUgdGhhdCB0aGV5IG1vZGlmeSB0aGF0IGlzIG5vdCByZXN0b3JlZCBieSByZXN0b3JlSW5zdGFuY2VTdGF0ZSB3aWxsIG5vdCBwZXJzaXN0IGluCisgICAgICogdGhlIGNhc2UgdGhhdCB0aGUgd2lkZ2V0cyBhcmUgcmVzdG9yZWQgdXNpbmcgdGhlIGNhY2hlZCB2ZXJzaW9uIGluIEFwcFdpZGdldFNlcnZpY2UuCisgICAgICoKKyAgICAgKiBVc2Ugd2l0aCB7QGxpbmsgUmVtb3RlVmlld3Mjc2hvd05leHQoaW50KX0sIHtAbGluayBSZW1vdGVWaWV3cyNzaG93UHJldmlvdXMoaW50KX0sCisgICAgICoge0BsaW5rIFJlbW90ZVZpZXdzI3NldFNjcm9sbFBvc2l0aW9uKGludCwgaW50KX0gYW5kIHNpbWlsYXIgY29tbWFuZHMuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBJdCBpcyBva2F5IHRvIGNhbGwgdGhpcyBtZXRob2QgYm90aCBpbnNpZGUgYW4ge0BsaW5rICNBQ1RJT05fQVBQV0lER0VUX1VQREFURX0gYnJvYWRjYXN0LAorICAgICAqIGFuZCBvdXRzaWRlIG9mIHRoZSBoYW5kbGVyLgorICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgb25seSB3b3JrIHdoZW4gY2FsbGVkIGZyb20gdGhlIHVpZCB0aGF0IG93bnMgdGhlIEFwcFdpZGdldCBwcm92aWRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhcHBXaWRnZXRJZCAgICAgIFRoZSBBcHBXaWRnZXQgaW5zdGFuY2UgZm9yIHdoaWNoIHRvIHNldCB0aGUgUmVtb3RlVmlld3MuCisgICAgICogQHBhcmFtIHZpZXdzICAgICAgICAgICAgVGhlIFJlbW90ZVZpZXdzIG9iamVjdCBjb250YWluaW5nIHRoZSBpbmNyZW1lbnRhbCB1cGRhdGUgLyBjb21tYW5kLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHBhcnRpYWxseVVwZGF0ZUFwcFdpZGdldChpbnQgYXBwV2lkZ2V0SWQsIFJlbW90ZVZpZXdzIHZpZXdzKSB7CisgICAgICAgIHBhcnRpYWxseVVwZGF0ZUFwcFdpZGdldChuZXcgaW50W10geyBhcHBXaWRnZXRJZCB9LCB2aWV3cyk7CisgICAgfQorCisgICAgLyoqCiAgICAgICogU2V0IHRoZSBSZW1vdGVWaWV3cyB0byB1c2UgZm9yIGFsbCBBcHBXaWRnZXQgaW5zdGFuY2VzIGZvciB0aGUgc3VwcGxpZWQgQXBwV2lkZ2V0IHByb3ZpZGVyLgogICAgICAqCiAgICAgICogPHA+CkBAIC0yODgsMTEgKzM0OSw0NiBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIE5vdGlmaWVzIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbiB2aWV3IGluIGFsbCB0aGUgc3BlY2lmaWVkIEFwcFdpZGdldCBpbnN0YW5jZXMKKyAgICAgKiB0byBpbnZhbGlkYXRlIHRoZWlyIGN1cnJlbnRseSBkYXRhLgorICAgICAqCisgICAgICogQHBhcmFtIGFwcFdpZGdldElkcyAgVGhlIEFwcFdpZGdldCBpbnN0YW5jZXMgZm9yIHdoaWNoIHRvIG5vdGlmeSBvZiB2aWV3IGRhdGEgY2hhbmdlcy4KKyAgICAgKiBAcGFyYW0gdmlld0lkICAgICAgICBUaGUgY29sbGVjdGlvbiB2aWV3IGlkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG5vdGlmeUFwcFdpZGdldFZpZXdEYXRhQ2hhbmdlZChpbnRbXSBhcHBXaWRnZXRJZHMsIGludCB2aWV3SWQpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHNTZXJ2aWNlLm5vdGlmeUFwcFdpZGdldFZpZXdEYXRhQ2hhbmdlZChhcHBXaWRnZXRJZHMsIHZpZXdJZCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigic3lzdGVtIHNlcnZlciBkZWFkPyIsIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogTm90aWZpZXMgdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uIHZpZXcgaW4gYWxsIHRoZSBzcGVjaWZpZWQgQXBwV2lkZ2V0IGluc3RhbmNlCisgICAgICogdG8gaW52YWxpZGF0ZSBpdCdzIGN1cnJlbnRseSBkYXRhLgorICAgICAqCisgICAgICogQHBhcmFtIGFwcFdpZGdldElkICBUaGUgQXBwV2lkZ2V0IGluc3RhbmNlIGZvciB3aGljaCB0byBub3RpZnkgb2YgdmlldyBkYXRhIGNoYW5nZXMuCisgICAgICogQHBhcmFtIHZpZXdJZCAgICAgICAgVGhlIGNvbGxlY3Rpb24gdmlldyBpZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBub3RpZnlBcHBXaWRnZXRWaWV3RGF0YUNoYW5nZWQoaW50IGFwcFdpZGdldElkLCBpbnQgdmlld0lkKSB7CisgICAgICAgIG5vdGlmeUFwcFdpZGdldFZpZXdEYXRhQ2hhbmdlZChuZXcgaW50W10geyBhcHBXaWRnZXRJZCB9LCB2aWV3SWQpOworICAgIH0KKworICAgIC8qKgogICAgICAqIFJldHVybiBhIGxpc3Qgb2YgdGhlIEFwcFdpZGdldCBwcm92aWRlcnMgdGhhdCBhcmUgY3VycmVudGx5IGluc3RhbGxlZC4KICAgICAgKi8KICAgICBwdWJsaWMgTGlzdDxBcHBXaWRnZXRQcm92aWRlckluZm8+IGdldEluc3RhbGxlZFByb3ZpZGVycygpIHsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBzU2VydmljZS5nZXRJbnN0YWxsZWRQcm92aWRlcnMoKTsKKyAgICAgICAgICAgIExpc3Q8QXBwV2lkZ2V0UHJvdmlkZXJJbmZvPiBwcm92aWRlcnMgPSBzU2VydmljZS5nZXRJbnN0YWxsZWRQcm92aWRlcnMoKTsKKyAgICAgICAgICAgIGZvciAoQXBwV2lkZ2V0UHJvdmlkZXJJbmZvIGluZm8gOiBwcm92aWRlcnMpIHsKKyAgICAgICAgICAgICAgICAvLyBDb252ZXJ0aW5nIGNvbXBsZXggdG8gZHAuCisgICAgICAgICAgICAgICAgaW5mby5taW5XaWR0aCA9CisgICAgICAgICAgICAgICAgICAgICAgICBUeXBlZFZhbHVlLmNvbXBsZXhUb0RpbWVuc2lvblBpeGVsU2l6ZShpbmZvLm1pbldpZHRoLCBtRGlzcGxheU1ldHJpY3MpOworICAgICAgICAgICAgICAgIGluZm8ubWluSGVpZ2h0ID0KKyAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVkVmFsdWUuY29tcGxleFRvRGltZW5zaW9uUGl4ZWxTaXplKGluZm8ubWluSGVpZ2h0LCBtRGlzcGxheU1ldHJpY3MpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHByb3ZpZGVyczsKICAgICAgICAgfQogICAgICAgICBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJzeXN0ZW0gc2VydmVyIGRlYWQ/IiwgZSk7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHB3aWRnZXQvQXBwV2lkZ2V0UHJvdmlkZXJJbmZvLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHB3aWRnZXQvQXBwV2lkZ2V0UHJvdmlkZXJJbmZvLmphdmEKaW5kZXggY2VlMjg2NS4uMzk2ZTkyZCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwd2lkZ2V0L0FwcFdpZGdldFByb3ZpZGVySW5mby5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcHdpZGdldC9BcHBXaWRnZXRQcm92aWRlckluZm8uamF2YQpAQCAtMTEwLDYgKzExMCwxNyBAQAogICAgICAqIEBoaWRlIFBlbmRpbmcgQVBJIGFwcHJvdmFsCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBvbGROYW1lOworICAgIAorICAgIC8qKgorICAgICAqIEEgcHJldmlldyBvZiB3aGF0IHRoZSBBcHBXaWRnZXQgd2lsbCBsb29rIGxpa2UgYWZ0ZXIgaXQncyBjb25maWd1cmVkLgorICAgICAqIElmIG5vdCBzdXBwbGllZCwgdGhlIEFwcFdpZGdldCdzIGljb24gd2lsbCBiZSB1c2VkLgorICAgICAqCisgICAgICogPHA+VGhpcyBmaWVsZCBjb3JyZXNwb25kcyB0byB0aGUgPGNvZGU+YW5kcm9pZDpwcmV2aWV3SW1hZ2U8L2NvZGU+IGF0dHJpYnV0ZSBpbgorICAgICAqIHRoZSA8Y29kZT4mbHQ7cmVjZWl2ZXImZ3Q7PC9jb2RlPiBlbGVtZW50IGluIHRoZSBBbmRyb2lkTWFuaWZlc3QueG1sIGZpbGUuCisgICAgICogCisgICAgICogQGhpZGUgUGVuZGluZyBBUEkgYXBwcm92YWwKKyAgICAgKi8KKwlwdWJsaWMgaW50IHByZXZpZXdJbWFnZTsKIAogICAgIHB1YmxpYyBBcHBXaWRnZXRQcm92aWRlckluZm8oKSB7CiAgICAgfQpAQCAtMTMwLDYgKzE0MSw3IEBACiAgICAgICAgIH0KICAgICAgICAgdGhpcy5sYWJlbCA9IGluLnJlYWRTdHJpbmcoKTsKICAgICAgICAgdGhpcy5pY29uID0gaW4ucmVhZEludCgpOworICAgICAgICB0aGlzLnByZXZpZXdJbWFnZSA9IGluLnJlYWRJbnQoKTsKICAgICB9CiAKIApAQCAtMTUyLDYgKzE2NCw3IEBACiAgICAgICAgIH0KICAgICAgICAgb3V0LndyaXRlU3RyaW5nKHRoaXMubGFiZWwpOwogICAgICAgICBvdXQud3JpdGVJbnQodGhpcy5pY29uKTsKKyAgICAgICAgb3V0LndyaXRlSW50KHRoaXMucHJldmlld0ltYWdlKTsKICAgICB9CiAKICAgICBwdWJsaWMgaW50IGRlc2NyaWJlQ29udGVudHMoKSB7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoQ2xhc3MuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhDbGFzcy5qYXZhCmluZGV4IGM3ZmVhOWUuLmM4MzgxYzkgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhDbGFzcy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhDbGFzcy5qYXZhCkBAIC0yNTksNiArMjU5LDEyIEBACiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPRklMRV9BMkRQID0gMTsKICAgICAvKiogQGhpZGUgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9GSUxFX09QUCA9IDI7CisgICAgLyoqIEBoaWRlICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPRklMRV9ISUQgPSAzOworICAgIC8qKiBAaGlkZSAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST0ZJTEVfUEFOVSA9IDQ7CisgICAgLyoqIEBoaWRlICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPRklMRV9OQVAgPSA1OwogCiAgICAgLyoqCiAgICAgICogQ2hlY2sgY2xhc3MgYml0cyBmb3IgcG9zc2libGUgYmx1ZXRvb3RoIHByb2ZpbGUgc3VwcG9ydC4KQEAgLTMyNCw2ICszMzAsMTQgQEAKICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAocHJvZmlsZSA9PSBQUk9GSUxFX0hJRCkgeworICAgICAgICAgICAgcmV0dXJuIChnZXREZXZpY2VDbGFzcygpICYgRGV2aWNlLk1ham9yLlBFUklQSEVSQUwpID09IERldmljZS5NYWpvci5QRVJJUEhFUkFMOworICAgICAgICB9IGVsc2UgaWYgKHByb2ZpbGUgPT0gUFJPRklMRV9QQU5VIHx8IHByb2ZpbGUgPT0gUFJPRklMRV9OQVApeworICAgICAgICAgICAgLy8gTm8gZ29vZCB3YXkgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiB0aGUgdHdvLCBiYXNlZCBvbiBjbGFzcyBiaXRzLgorICAgICAgICAgICAgaWYgKGhhc1NlcnZpY2UoU2VydmljZS5ORVRXT1JLSU5HKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIChnZXREZXZpY2VDbGFzcygpICYgRGV2aWNlLk1ham9yLk5FVFdPUktJTkcpID09IERldmljZS5NYWpvci5ORVRXT1JLSU5HOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoRGV2aWNlUGlja2VyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoRGV2aWNlUGlja2VyLmphdmEKaW5kZXggMDVlZWQwZS4uNzQxNTcyMSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aERldmljZVBpY2tlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhEZXZpY2VQaWNrZXIuamF2YQpAQCAtNjMsNCArNjMsOSBAQAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJTFRFUl9UWVBFX0FVRElPID0gMTsKICAgICAvKiogQXNrIGRldmljZSBwaWNrZXIgdG8gc2hvdyBCVCBkZXZpY2VzIHRoYXQgc3VwcG9ydCBPYmplY3QgVHJhbnNmZXIgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSUxURVJfVFlQRV9UUkFOU0ZFUiA9IDI7CisgICAgLyoqIEFzayBkZXZpY2UgcGlja2VyIHRvIHNob3cgQlQgZGV2aWNlcyB0aGF0IHN1cHBvcnQKKyAgICAgKiBQZXJzb25hbCBBcmVhIE5ldHdvcmtpbmcgVXNlciAoUEFOVSkgcHJvZmlsZSovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklMVEVSX1RZUEVfUEFOVSA9IDM7CisgICAgLyoqIEFzayBkZXZpY2UgcGlja2VyIHRvIHNob3cgQlQgZGV2aWNlcyB0aGF0IHN1cHBvcnQgTmV0d29yayBBY2Nlc3MgUG9pbnQgKE5BUCkgcHJvZmlsZSAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJTFRFUl9UWVBFX05BUCA9IDQ7CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoRGV2aWNlUHJvZmlsZVN0YXRlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoRGV2aWNlUHJvZmlsZVN0YXRlLmphdmEKaW5kZXggOGU2NTVlMi4uMWZkNzE1MSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aERldmljZVByb2ZpbGVTdGF0ZS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhEZXZpY2VQcm9maWxlU3RhdGUuamF2YQpAQCAtNTgsMTkgKzU4LDI0IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJCbHVldG9vdGhEZXZpY2VQcm9maWxlU3RhdGUiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREJHID0gdHJ1ZTsgLy9TVE9QU0hJUCAtIENoYW5nZSB0byBmYWxzZQogCisgICAgLy8gVE9ETygpOiBSZXN0cnVjdHVyZSB0aGUgc3RhdGUgbWFjaGluZSB0byBtYWtlIGl0IHNjYWxhYmxlIHdpdGggcmVnYXJkIHRvIHByb2ZpbGVzLgogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTk5FQ1RfSEZQX09VVEdPSU5HID0gMTsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05ORUNUX0hGUF9JTkNPTUlORyA9IDI7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09OTkVDVF9BMkRQX09VVEdPSU5HID0gMzsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05ORUNUX0EyRFBfSU5DT01JTkcgPSA0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTk5FQ1RfSElEX09VVEdPSU5HID0gNTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05ORUNUX0hJRF9JTkNPTUlORyA9IDY7CiAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBESVNDT05ORUNUX0hGUF9PVVRHT0lORyA9IDU7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERJU0NPTk5FQ1RfSEZQX0lOQ09NSU5HID0gNjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBESVNDT05ORUNUX0EyRFBfT1VUR09JTkcgPSA3OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJU0NPTk5FQ1RfQTJEUF9JTkNPTUlORyA9IDg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElTQ09OTkVDVF9IRlBfT1VUR09JTkcgPSA1MDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRElTQ09OTkVDVF9IRlBfSU5DT01JTkcgPSA1MTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBESVNDT05ORUNUX0EyRFBfT1VUR09JTkcgPSA1MjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBESVNDT05ORUNUX0EyRFBfSU5DT01JTkcgPSA1MzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBESVNDT05ORUNUX0hJRF9PVVRHT0lORyA9IDU0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJU0NPTk5FQ1RfSElEX0lOQ09NSU5HID0gNTU7CiAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTlBBSVIgPSA5OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFVVE9fQ09OTkVDVF9QUk9GSUxFUyA9IDEwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRSQU5TSVRJT05fVE9fU1RBQkxFID0gMTE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5QQUlSID0gMTAwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFVVE9fQ09OTkVDVF9QUk9GSUxFUyA9IDEwMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUUkFOU0lUSU9OX1RPX1NUQUJMRSA9IDEwMjsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBVVRPX0NPTk5FQ1RfREVMQVkgPSA2MDAwOyAvLyA2IHNlY3MKIApAQCAtNzksNiArODQsOCBAQAogICAgIHByaXZhdGUgSW5jb21pbmdIYW5kc2ZyZWUgbUluY29taW5nSGFuZHNmcmVlID0gbmV3IEluY29taW5nSGFuZHNmcmVlKCk7CiAgICAgcHJpdmF0ZSBJbmNvbWluZ0EyZHAgbUluY29taW5nQTJkcCA9IG5ldyBJbmNvbWluZ0EyZHAoKTsKICAgICBwcml2YXRlIE91dGdvaW5nQTJkcCBtT3V0Z29pbmdBMmRwID0gbmV3IE91dGdvaW5nQTJkcCgpOworICAgIHByaXZhdGUgT3V0Z29pbmdIaWQgbU91dGdvaW5nSGlkID0gbmV3IE91dGdvaW5nSGlkKCk7CisgICAgcHJpdmF0ZSBJbmNvbWluZ0hpZCBtSW5jb21pbmdIaWQgPSBuZXcgSW5jb21pbmdIaWQoKTsKIAogICAgIHByaXZhdGUgQ29udGV4dCBtQ29udGV4dDsKICAgICBwcml2YXRlIEJsdWV0b290aFNlcnZpY2UgbVNlcnZpY2U7CkBAIC04OSw2ICs5Niw3IEBACiAgICAgcHJpdmF0ZSBCbHVldG9vdGhEZXZpY2UgbURldmljZTsKICAgICBwcml2YXRlIGludCBtSGVhZHNldFN0YXRlOwogICAgIHByaXZhdGUgaW50IG1BMmRwU3RhdGU7CisgICAgcHJpdmF0ZSBpbnQgbUhpZFN0YXRlOwogCiAgICAgcHJpdmF0ZSBCcm9hZGNhc3RSZWNlaXZlciBtQnJvYWRjYXN0UmVjZWl2ZXIgPSBuZXcgQnJvYWRjYXN0UmVjZWl2ZXIoKSB7CiAgICAgICAgIEBPdmVycmlkZQpAQCAtMTI1LDYgKzEzMywxOSBAQAogICAgICAgICAgICAgICAgICAgICBuZXdTdGF0ZSA9PSBCbHVldG9vdGhBMmRwLlNUQVRFX0RJU0NPTk5FQ1RFRCkgewogICAgICAgICAgICAgICAgICAgICBzZW5kTWVzc2FnZShUUkFOU0lUSU9OX1RPX1NUQUJMRSk7CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24uZXF1YWxzKEJsdWV0b290aElucHV0RGV2aWNlLkFDVElPTl9JTlBVVF9ERVZJQ0VfU1RBVEVfQ0hBTkdFRCkpIHsKKyAgICAgICAgICAgICAgICBpbnQgbmV3U3RhdGUgPSBpbnRlbnQuZ2V0SW50RXh0cmEoQmx1ZXRvb3RoSW5wdXREZXZpY2UuRVhUUkFfSU5QVVRfREVWSUNFX1NUQVRFLCAwKTsKKyAgICAgICAgICAgICAgICBpbnQgb2xkU3RhdGUgPQorICAgICAgICAgICAgICAgICAgICBpbnRlbnQuZ2V0SW50RXh0cmEoQmx1ZXRvb3RoSW5wdXREZXZpY2UuRVhUUkFfUFJFVklPVVNfSU5QVVRfREVWSUNFX1NUQVRFLCAwKTsKKyAgICAgICAgICAgICAgICBtSGlkU3RhdGUgPSBuZXdTdGF0ZTsKKyAgICAgICAgICAgICAgICBpZiAob2xkU3RhdGUgPT0gQmx1ZXRvb3RoSW5wdXREZXZpY2UuU1RBVEVfQ09OTkVDVEVEICYmCisgICAgICAgICAgICAgICAgICAgIG5ld1N0YXRlID09IEJsdWV0b290aElucHV0RGV2aWNlLlNUQVRFX0RJU0NPTk5FQ1RFRCkgeworICAgICAgICAgICAgICAgICAgICBzZW5kTWVzc2FnZShESVNDT05ORUNUX0hJRF9JTkNPTUlORyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChuZXdTdGF0ZSA9PSBCbHVldG9vdGhJbnB1dERldmljZS5TVEFURV9DT05ORUNURUQgfHwKKyAgICAgICAgICAgICAgICAgICAgbmV3U3RhdGUgPT0gQmx1ZXRvb3RoSW5wdXREZXZpY2UuU1RBVEVfRElTQ09OTkVDVEVEKSB7CisgICAgICAgICAgICAgICAgICAgIHNlbmRNZXNzYWdlKFRSQU5TSVRJT05fVE9fU1RBQkxFKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbi5lcXVhbHMoQmx1ZXRvb3RoRGV2aWNlLkFDVElPTl9BQ0xfQ09OTkVDVEVEKSkgewogICAgICAgICAgICAgICAgIGlmICghZ2V0Q3VycmVudFN0YXRlKCkuZXF1YWxzKG1Cb25kZWREZXZpY2UpKSB7CiAgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIlN0YXRlIGlzOiAiICsgZ2V0Q3VycmVudFN0YXRlKCkpOwpAQCAtMTY1LDYgKzE4Niw4IEBACiAgICAgICAgIGFkZFN0YXRlKG1JbmNvbWluZ0hhbmRzZnJlZSk7CiAgICAgICAgIGFkZFN0YXRlKG1JbmNvbWluZ0EyZHApOwogICAgICAgICBhZGRTdGF0ZShtT3V0Z29pbmdBMmRwKTsKKyAgICAgICAgYWRkU3RhdGUobU91dGdvaW5nSGlkKTsKKyAgICAgICAgYWRkU3RhdGUobUluY29taW5nSGlkKTsKICAgICAgICAgc2V0SW5pdGlhbFN0YXRlKG1Cb25kZWREZXZpY2UpOwogCiAgICAgICAgIEludGVudEZpbHRlciBmaWx0ZXIgPSBuZXcgSW50ZW50RmlsdGVyKCk7CkBAIC0xNzIsNiArMTk1LDcgQEAKICAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihCbHVldG9vdGhBMmRwLkFDVElPTl9TSU5LX1NUQVRFX0NIQU5HRUQpOwogICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKEJsdWV0b290aEhlYWRzZXQuQUNUSU9OX1NUQVRFX0NIQU5HRUQpOwogICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKEJsdWV0b290aERldmljZS5BQ1RJT05fQUNMX0NPTk5FQ1RFRCk7CisgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oQmx1ZXRvb3RoSW5wdXREZXZpY2UuQUNUSU9OX0lOUFVUX0RFVklDRV9TVEFURV9DSEFOR0VEKTsKIAogICAgICAgICBtQ29udGV4dC5yZWdpc3RlclJlY2VpdmVyKG1Ccm9hZGNhc3RSZWNlaXZlciwgZmlsdGVyKTsKIApAQCAtMjI0LDYgKzI0OCwxNCBAQAogICAgICAgICAgICAgICAgIGNhc2UgRElTQ09OTkVDVF9BMkRQX0lOQ09NSU5HOgogICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obUluY29taW5nQTJkcCk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ09OTkVDVF9ISURfT1VUR09JTkc6CisgICAgICAgICAgICAgICAgY2FzZSBESVNDT05ORUNUX0hJRF9PVVRHT0lORzoKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1PdXRnb2luZ0hpZCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ09OTkVDVF9ISURfSU5DT01JTkc6CisgICAgICAgICAgICAgICAgY2FzZSBESVNDT05ORUNUX0hJRF9JTkNPTUlORzoKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1JbmNvbWluZ0hpZCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgVU5QQUlSOgogICAgICAgICAgICAgICAgICAgICBpZiAobUhlYWRzZXRTdGF0ZSAhPSBCbHVldG9vdGhIZWFkc2V0LlNUQVRFX0RJU0NPTk5FQ1RFRCkgewogICAgICAgICAgICAgICAgICAgICAgICAgc2VuZE1lc3NhZ2UoRElTQ09OTkVDVF9IRlBfT1VUR09JTkcpOwpAQCAtMjMzLDYgKzI2NSwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgc2VuZE1lc3NhZ2UoRElTQ09OTkVDVF9BMkRQX09VVEdPSU5HKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVyTWVzc2FnZShtZXNzYWdlKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1IaWRTdGF0ZSAhPSBCbHVldG9vdGhJbnB1dERldmljZS5TVEFURV9ESVNDT05ORUNURUQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRNZXNzYWdlKERJU0NPTk5FQ1RfSElEX09VVEdPSU5HKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVyTWVzc2FnZShtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NDb21tYW5kKFVOUEFJUik7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMjU0LDYgKzI5MCwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUEyZHBTZXJ2aWNlLmdldENvbm5lY3RlZFNpbmtzKCkubGVuZ3RoID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQTJkcFNlcnZpY2UuY29ubmVjdFNpbmsobURldmljZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVNlcnZpY2UuZ2V0SW5wdXREZXZpY2VQcmlvcml0eShtRGV2aWNlKSA9PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmx1ZXRvb3RoSW5wdXREZXZpY2UuUFJJT1JJVFlfQVVUT19DT05ORUNUKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNlcnZpY2UuY29ubmVjdElucHV0RGV2aWNlKG1EZXZpY2UpOworICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgVFJBTlNJVElPTl9UT19TVEFCTEU6CkBAIC0zNDIsNiArMzgyLDIzIEBACiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVyTWVzc2FnZShkZWZlck1zZyk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDT05ORUNUX0hJRF9PVVRHT0lORzoKKyAgICAgICAgICAgICAgICBjYXNlIERJU0NPTk5FQ1RfSElEX09VVEdPSU5HOgorICAgICAgICAgICAgICAgICAgICBkZWZlck1lc3NhZ2UobWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ09OTkVDVF9ISURfSU5DT01JTkc6CisgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtSW5jb21pbmdIaWQpOworICAgICAgICAgICAgICAgICAgICBpZiAobVN0YXR1cykgeworICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJNc2cud2hhdCA9IG1Db21tYW5kOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJNZXNzYWdlKGRlZmVyTXNnKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIERJU0NPTk5FQ1RfSElEX0lOQ09NSU5HOgorICAgICAgICAgICAgICAgICAgICBpZiAobVN0YXR1cykgeworICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJNc2cud2hhdCA9IG1Db21tYW5kOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJNZXNzYWdlKGRlZmVyTXNnKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsgLy8gaWdub3JlCiAgICAgICAgICAgICAgICAgY2FzZSBVTlBBSVI6CiAgICAgICAgICAgICAgICAgY2FzZSBBVVRPX0NPTk5FQ1RfUFJPRklMRVM6CiAgICAgICAgICAgICAgICAgICAgIGRlZmVyTWVzc2FnZShtZXNzYWdlKTsKQEAgLTQwOSw2ICs0NjYsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhpcyBjYXVzZXMgaW5jb21pbmcgSEZQIHRvIGZhaWwsIGl0IGlzIG1vcmUgb2YgYSBoZWFkc2V0IHByb2JsZW0KICAgICAgICAgICAgICAgICAgICAgLy8gc2luY2UgYm90aCBjb25uZWN0aW9ucyBhcmUgaW5jb21pbmcgb25lcy4KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDT05ORUNUX0hJRF9PVVRHT0lORzoKKyAgICAgICAgICAgICAgICBjYXNlIERJU0NPTk5FQ1RfSElEX09VVEdPSU5HOgorICAgICAgICAgICAgICAgICAgICBkZWZlck1lc3NhZ2UobWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ09OTkVDVF9ISURfSU5DT01JTkc6CisgICAgICAgICAgICAgICAgY2FzZSBESVNDT05ORUNUX0hJRF9JTkNPTUlORzoKKyAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAvLyBpZ25vcmUKICAgICAgICAgICAgICAgICBjYXNlIFVOUEFJUjoKICAgICAgICAgICAgICAgICBjYXNlIEFVVE9fQ09OTkVDVF9QUk9GSUxFUzoKICAgICAgICAgICAgICAgICAgICAgZGVmZXJNZXNzYWdlKG1lc3NhZ2UpOwpAQCAtNDk2LDYgKzU2MCwyMyBAQAogICAgICAgICAgICAgICAgIGNhc2UgRElTQ09OTkVDVF9BMkRQX0lOQ09NSU5HOgogICAgICAgICAgICAgICAgICAgICAvLyBJZ25vcmUsIHdpbGwgYmUgaGFuZGxlZCBieSBCbHVlegogICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENPTk5FQ1RfSElEX09VVEdPSU5HOgorICAgICAgICAgICAgICAgIGNhc2UgRElTQ09OTkVDVF9ISURfT1VUR09JTkc6CisgICAgICAgICAgICAgICAgICAgIGRlZmVyTWVzc2FnZShtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDT05ORUNUX0hJRF9JTkNPTUlORzoKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1JbmNvbWluZ0hpZCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChtU3RhdHVzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZlck1zZy53aGF0ID0gbUNvbW1hbmQ7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZlck1lc3NhZ2UoZGVmZXJNc2cpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgRElTQ09OTkVDVF9ISURfSU5DT01JTkc6CisgICAgICAgICAgICAgICAgICAgIGlmIChtU3RhdHVzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZlck1zZy53aGF0ID0gbUNvbW1hbmQ7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZlck1lc3NhZ2UoZGVmZXJNc2cpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAvLyBpZ25vcmUKICAgICAgICAgICAgICAgICBjYXNlIFVOUEFJUjoKICAgICAgICAgICAgICAgICBjYXNlIEFVVE9fQ09OTkVDVF9QUk9GSUxFUzoKICAgICAgICAgICAgICAgICAgICAgZGVmZXJNZXNzYWdlKG1lc3NhZ2UpOwpAQCAtNTYxLDYgKzY0MiwxMyBAQAogICAgICAgICAgICAgICAgIGNhc2UgRElTQ09OTkVDVF9BMkRQX0lOQ09NSU5HOgogICAgICAgICAgICAgICAgICAgICAvLyBJZ25vcmUsIHdpbGwgYmUgaGFuZGxlZCBieSBCbHVlegogICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENPTk5FQ1RfSElEX09VVEdPSU5HOgorICAgICAgICAgICAgICAgIGNhc2UgRElTQ09OTkVDVF9ISURfT1VUR09JTkc6CisgICAgICAgICAgICAgICAgICAgIGRlZmVyTWVzc2FnZShtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDT05ORUNUX0hJRF9JTkNPTUlORzoKKyAgICAgICAgICAgICAgICBjYXNlIERJU0NPTk5FQ1RfSElEX0lOQ09NSU5HOgorICAgICAgICAgICAgICAgICAgICAgYnJlYWs7IC8vIGlnbm9yZQogICAgICAgICAgICAgICAgIGNhc2UgVU5QQUlSOgogICAgICAgICAgICAgICAgIGNhc2UgQVVUT19DT05ORUNUX1BST0ZJTEVTOgogICAgICAgICAgICAgICAgICAgICBkZWZlck1lc3NhZ2UobWVzc2FnZSk7CkBAIC01NzYsNiArNjY0LDE0MyBAQAogICAgIH0KIAogCisgICAgcHJpdmF0ZSBjbGFzcyBPdXRnb2luZ0hpZCBleHRlbmRzIEhpZXJhcmNoaWNhbFN0YXRlIHsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1TdGF0dXMgPSBmYWxzZTsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbUNvbW1hbmQ7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIGVudGVyKCkgeworICAgICAgICAgICAgbG9nKCJFbnRlcmluZyBPdXRnb2luZ0hpZCBzdGF0ZSB3aXRoOiAiICsgZ2V0Q3VycmVudE1lc3NhZ2UoKS53aGF0KTsKKyAgICAgICAgICAgIG1Db21tYW5kID0gZ2V0Q3VycmVudE1lc3NhZ2UoKS53aGF0OworICAgICAgICAgICAgaWYgKG1Db21tYW5kICE9IENPTk5FQ1RfSElEX09VVEdPSU5HICYmCisgICAgICAgICAgICAgICAgbUNvbW1hbmQgIT0gRElTQ09OTkVDVF9ISURfT1VUR09JTkcpIHsKKyAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJFcnJvcjogT3V0Z29pbmdIaWQgc3RhdGUgd2l0aCBjb21tYW5kOiIgKyBtQ29tbWFuZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtU3RhdHVzID0gcHJvY2Vzc0NvbW1hbmQobUNvbW1hbmQpOworICAgICAgICAgICAgaWYgKCFtU3RhdHVzKSBzZW5kTWVzc2FnZShUUkFOU0lUSU9OX1RPX1NUQUJMRSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc01lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKSB7CisgICAgICAgICAgICBsb2coIk91dGdvaW5nSGlkIFN0YXRlLT5Qcm9jZXNzaW5nIE1lc3NhZ2U6ICIgKyBtZXNzYWdlLndoYXQpOworICAgICAgICAgICAgTWVzc2FnZSBkZWZlck1zZyA9IG5ldyBNZXNzYWdlKCk7CisgICAgICAgICAgICBzd2l0Y2gobWVzc2FnZS53aGF0KSB7CisgICAgICAgICAgICAgICAgLy8gZGVmZXIgYWxsIG91dGdvaW5nIG1lc3NhZ2VzCisgICAgICAgICAgICAgICAgY2FzZSBDT05ORUNUX0hGUF9PVVRHT0lORzoKKyAgICAgICAgICAgICAgICBjYXNlIENPTk5FQ1RfQTJEUF9PVVRHT0lORzoKKyAgICAgICAgICAgICAgICBjYXNlIENPTk5FQ1RfSElEX09VVEdPSU5HOgorICAgICAgICAgICAgICAgIGNhc2UgRElTQ09OTkVDVF9IRlBfT1VUR09JTkc6CisgICAgICAgICAgICAgICAgY2FzZSBESVNDT05ORUNUX0EyRFBfT1VUR09JTkc6CisgICAgICAgICAgICAgICAgY2FzZSBESVNDT05ORUNUX0hJRF9PVVRHT0lORzoKKyAgICAgICAgICAgICAgICAgICAgZGVmZXJNZXNzYWdlKG1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgQ09OTkVDVF9IRlBfSU5DT01JTkc6CisgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtSW5jb21pbmdIYW5kc2ZyZWUpOworICAgICAgICAgICAgICAgIGNhc2UgQ09OTkVDVF9BMkRQX0lOQ09NSU5HOgorICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obUluY29taW5nQTJkcCk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gRG9uJ3QgY2FuY2VsIEhJRCBvdXRnb2luZyBhcyB0aGVyZSBpcyBubyBndWFyYW50ZWUgaXQKKyAgICAgICAgICAgICAgICAgICAgLy8gd2lsbCBnZXQgY2FuY2VsZWQuCisgICAgICAgICAgICAgICAgICAgIC8vIEl0IG1pZ2h0IGFscmVhZHkgYmUgY29ubmVjdGVkIGJ1dCB3ZSBtaWdodCBub3QgaGF2ZSBnb3QgdGhlCisgICAgICAgICAgICAgICAgICAgIC8vIElOUFVUX0RFVklDRV9TVEFURV9DSEFOR0UuIEhlbmNlLCBubyBwb2ludCBkaXNjb25uZWN0aW5nIGhlcmUuCisgICAgICAgICAgICAgICAgICAgIC8vIFRoZSB3b3JzdCBjYXNlLCB0aGUgY29ubmVjdGlvbiB3aWxsIGZhaWwsIHJldHJ5LgorICAgICAgICAgICAgICAgICAgICBpZiAobVN0YXR1cykgeworICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJNc2cud2hhdCA9IG1Db21tYW5kOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJNZXNzYWdlKGRlZmVyTXNnKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENPTk5FQ1RfSElEX0lOQ09NSU5HOgorICAgICAgICAgICAgICAgICAgLy8gQmx1ZXogd2lsbCB0YWtlIGNhcmUgb2YgdGhlIGNvbmZsaWN0cworICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obUluY29taW5nSGlkKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIERJU0NPTk5FQ1RfSEZQX0lOQ09NSU5HOgorICAgICAgICAgICAgICAgIGNhc2UgRElTQ09OTkVDVF9BMkRQX0lOQ09NSU5HOgorICAgICAgICAgICAgICAgICAgICAvLyBBdCB0aGlzIHBvaW50LCB3ZSBhcmUgYWxyZWFkeSBkaXNjb25uZWN0ZWQKKyAgICAgICAgICAgICAgICAgICAgLy8gd2l0aCBIRlAuIFNvbWV0aW1lcyBISUQgY29ubmVjdGlvbiBjYW4KKyAgICAgICAgICAgICAgICAgICAgLy8gZmFpbCBkdWUgdG8gdGhlIGRpc2Nvbm5lY3Rpb24gb2YgSEZQLiBTbyBhZGQgYSByZXRyeQorICAgICAgICAgICAgICAgICAgICAvLyBmb3IgdGhlIEhJRC4KKyAgICAgICAgICAgICAgICAgICAgaWYgKG1TdGF0dXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVyTXNnLndoYXQgPSBtQ29tbWFuZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVyTWVzc2FnZShkZWZlck1zZyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBESVNDT05ORUNUX0hJRF9JTkNPTUlORzoKKyAgICAgICAgICAgICAgICAgICAgLy8gSWdub3JlLCB3aWxsIGJlIGhhbmRsZWQgYnkgQmx1ZXoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIFVOUEFJUjoKKyAgICAgICAgICAgICAgICBjYXNlIEFVVE9fQ09OTkVDVF9QUk9GSUxFUzoKKyAgICAgICAgICAgICAgICAgICAgZGVmZXJNZXNzYWdlKG1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFRSQU5TSVRJT05fVE9fU1RBQkxFOgorICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obUJvbmRlZERldmljZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOT1RfSEFORExFRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBIQU5ETEVEOworICAgICAgICB9CisgICAgfQorCisgIHByaXZhdGUgY2xhc3MgSW5jb21pbmdIaWQgZXh0ZW5kcyBIaWVyYXJjaGljYWxTdGF0ZSB7CisgICAgICBwcml2YXRlIGJvb2xlYW4gbVN0YXR1cyA9IGZhbHNlOworICAgICAgcHJpdmF0ZSBpbnQgbUNvbW1hbmQ7CisKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHJvdGVjdGVkIHZvaWQgZW50ZXIoKSB7CisgICAgICAgICAgbG9nKCJFbnRlcmluZyBJbmNvbWluZ0hpZCBzdGF0ZSB3aXRoOiAiICsgZ2V0Q3VycmVudE1lc3NhZ2UoKS53aGF0KTsKKyAgICAgICAgICBtQ29tbWFuZCA9IGdldEN1cnJlbnRNZXNzYWdlKCkud2hhdDsKKyAgICAgICAgICBpZiAobUNvbW1hbmQgIT0gQ09OTkVDVF9ISURfSU5DT01JTkcgJiYKKyAgICAgICAgICAgICAgbUNvbW1hbmQgIT0gRElTQ09OTkVDVF9ISURfSU5DT01JTkcpIHsKKyAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiRXJyb3I6IEluY29taW5nSGlkIHN0YXRlIHdpdGggY29tbWFuZDoiICsgbUNvbW1hbmQpOworICAgICAgICAgIH0KKyAgICAgICAgICBtU3RhdHVzID0gcHJvY2Vzc0NvbW1hbmQobUNvbW1hbmQpOworICAgICAgICAgIGlmICghbVN0YXR1cykgc2VuZE1lc3NhZ2UoVFJBTlNJVElPTl9UT19TVEFCTEUpOworICAgICAgfQorCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkgeworICAgICAgICAgIGxvZygiSW5jb21pbmdIaWQgU3RhdGUtPlByb2Nlc3NpbmcgTWVzc2FnZTogIiArIG1lc3NhZ2Uud2hhdCk7CisgICAgICAgICAgTWVzc2FnZSBkZWZlck1zZyA9IG5ldyBNZXNzYWdlKCk7CisgICAgICAgICAgc3dpdGNoKG1lc3NhZ2Uud2hhdCkgeworICAgICAgICAgICAgICBjYXNlIENPTk5FQ1RfSEZQX09VVEdPSU5HOgorICAgICAgICAgICAgICBjYXNlIENPTk5FQ1RfSEZQX0lOQ09NSU5HOgorICAgICAgICAgICAgICBjYXNlIERJU0NPTk5FQ1RfSEZQX09VVEdPSU5HOgorICAgICAgICAgICAgICBjYXNlIENPTk5FQ1RfQTJEUF9JTkNPTUlORzoKKyAgICAgICAgICAgICAgY2FzZSBDT05ORUNUX0EyRFBfT1VUR09JTkc6CisgICAgICAgICAgICAgIGNhc2UgRElTQ09OTkVDVF9BMkRQX09VVEdPSU5HOgorICAgICAgICAgICAgICBjYXNlIENPTk5FQ1RfSElEX09VVEdPSU5HOgorICAgICAgICAgICAgICBjYXNlIENPTk5FQ1RfSElEX0lOQ09NSU5HOgorICAgICAgICAgICAgICBjYXNlIERJU0NPTk5FQ1RfSElEX09VVEdPSU5HOgorICAgICAgICAgICAgICAgICAgZGVmZXJNZXNzYWdlKG1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgRElTQ09OTkVDVF9IRlBfSU5DT01JTkc6CisgICAgICAgICAgICAgICAgICAvLyBTaG91bGRuJ3QgaGFwcGVuIGJ1dCBpZiBkb2VzLCB3ZSBjYW4gaGFuZGxlIGl0LgorICAgICAgICAgICAgICAgICAgLy8gRGVwZW5kcyBpZiB0aGUgaGVhZHNldCBjYW4gaGFuZGxlIGl0LgorICAgICAgICAgICAgICAgICAgLy8gSW5jb21pbmcgSElEIHdpbGwgYmUgaGFuZGxlZCBieSBCbHVleiwgRGlzY29ubmVjdCBIRlAKKyAgICAgICAgICAgICAgICAgIC8vIHRoZSBzb2NrZXQgd291bGQgaGF2ZSBhbHJlYWR5IGJlZW4gY2xvc2VkLgorICAgICAgICAgICAgICAgICAgLy8gaWdub3JlCisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSBESVNDT05ORUNUX0hJRF9JTkNPTUlORzoKKyAgICAgICAgICAgICAgY2FzZSBESVNDT05ORUNUX0EyRFBfSU5DT01JTkc6CisgICAgICAgICAgICAgICAgICAvLyBJZ25vcmUsIHdpbGwgYmUgaGFuZGxlZCBieSBCbHVlegorICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgVU5QQUlSOgorICAgICAgICAgICAgICBjYXNlIEFVVE9fQ09OTkVDVF9QUk9GSUxFUzoKKyAgICAgICAgICAgICAgICAgIGRlZmVyTWVzc2FnZShtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIFRSQU5TSVRJT05fVE9fU1RBQkxFOgorICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1Cb25kZWREZXZpY2UpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICByZXR1cm4gTk9UX0hBTkRMRUQ7CisgICAgICAgICAgfQorICAgICAgICAgIHJldHVybiBIQU5ETEVEOworICAgICAgfQorICB9CisKIAogICAgIHN5bmNocm9uaXplZCB2b2lkIGNhbmNlbENvbW1hbmQoaW50IGNvbW1hbmQpIHsKICAgICAgICAgaWYgKGNvbW1hbmQgPT0gQ09OTkVDVF9IRlBfT1VUR09JTkcgKSB7CkBAIC02MTksNiArODQ0LDEwIEBACiAgICAgICAgICAgICBjYXNlIENPTk5FQ1RfQTJEUF9JTkNPTUlORzoKICAgICAgICAgICAgICAgICAvLyBpZ25vcmUsIEJsdWV6IHRha2VzIGNhcmUKICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIGNhc2UgQ09OTkVDVF9ISURfT1VUR09JTkc6CisgICAgICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLmNvbm5lY3RJbnB1dERldmljZUludGVybmFsKG1EZXZpY2UpOworICAgICAgICAgICAgY2FzZSBDT05ORUNUX0hJRF9JTkNPTUlORzoKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgIGNhc2UgRElTQ09OTkVDVF9IRlBfT1VUR09JTkc6CiAgICAgICAgICAgICAgICAgaWYgKCFtSGVhZHNldFNlcnZpY2VDb25uZWN0ZWQpIHsKICAgICAgICAgICAgICAgICAgICAgZGVmZXJIZWFkc2V0TWVzc2FnZShjb21tYW5kKTsKQEAgLTY0NSw2ICs4NzQsMTUgQEAKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1BMmRwU2VydmljZS5kaXNjb25uZWN0U2lua0ludGVybmFsKG1EZXZpY2UpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRElTQ09OTkVDVF9ISURfSU5DT01JTkc6CisgICAgICAgICAgICAgICAgLy8gaWdub3JlCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICBjYXNlIERJU0NPTk5FQ1RfSElEX09VVEdPSU5HOgorICAgICAgICAgICAgICAgIGlmIChtU2VydmljZS5nZXRJbnB1dERldmljZVByaW9yaXR5KG1EZXZpY2UpID09CisgICAgICAgICAgICAgICAgICAgIEJsdWV0b290aElucHV0RGV2aWNlLlBSSU9SSVRZX0FVVE9fQ09OTkVDVCkgeworICAgICAgICAgICAgICAgICAgICBtU2VydmljZS5zZXRJbnB1dERldmljZVByaW9yaXR5KG1EZXZpY2UsIEJsdWV0b290aElucHV0RGV2aWNlLlBSSU9SSVRZX09OKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLmRpc2Nvbm5lY3RJbnB1dERldmljZUludGVybmFsKG1EZXZpY2UpOwogICAgICAgICAgICAgY2FzZSBVTlBBSVI6CiAgICAgICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLnJlbW92ZUJvbmRJbnRlcm5hbChtRGV2aWNlLmdldEFkZHJlc3MoKSk7CiAgICAgICAgICAgICBkZWZhdWx0OgpAQCAtNjUzLDYgKzg5MSw3IEBACiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKKwogICAgIC8qcGFja2FnZSovIEJsdWV0b290aERldmljZSBnZXREZXZpY2UoKSB7CiAgICAgICAgIHJldHVybiBtRGV2aWNlOwogICAgIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhJbnB1dERldmljZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aElucHV0RGV2aWNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc5MzgzOAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhJbnB1dERldmljZS5qYXZhCkBAIC0wLDAgKzEsMjQxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmJsdWV0b290aDsKKworaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5TZGtDb25zdGFudDsKK2ltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uU2RrQ29uc3RhbnQuU2RrQ29uc3RhbnRUeXBlOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm9zLlNlcnZpY2VNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCisvKioKKyAqIFB1YmxpYyBBUEkgZm9yIGNvbnRyb2xsaW5nIHRoZSBCbHVldG9vdGggSElEIChJbnB1dCBEZXZpY2UpIFByb2ZpbGUKKyAqCisgKiBCbHVldG9vdGhJbnB1dERldmljZSBpcyBhIHByb3h5IG9iamVjdCB1c2VkIHRvIG1ha2UgY2FsbHMgdG8gQmx1ZXRvb3RoIFNlcnZpY2UKKyAqIHdoaWNoIGhhbmRsZXMgdGhlIEhJRCBwcm9maWxlLgorICoKKyAqIENyZWF0aW5nIGEgQmx1ZXRvb3RoSW5wdXREZXZpY2Ugb2JqZWN0IHdpbGwgaW5pdGlhdGUgYSBiaW5kaW5nIHdpdGggdGhlCisgKiBCbHVldG9vdGggc2VydmljZS4gVXNlcnMgb2YgdGhpcyBvYmplY3Qgc2hvdWxkIGNhbGwgY2xvc2UoKSB3aGVuIHRoZXkKKyAqIGFyZSBmaW5pc2hlZCwgc28gdGhhdCB0aGlzIHByb3h5IG9iamVjdCBjYW4gdW5iaW5kIGZyb20gdGhlIHNlcnZpY2UuCisgKgorICogQ3VycmVudGx5IHRoZSBCbHVldG9vdGggc2VydmljZSBydW5zIGluIHRoZSBzeXN0ZW0gc2VydmVyIGFuZCB0aGlzCisgKiBwcm94eSBvYmplY3Qgd2lsbCBiZSBpbW1lZGlhdGVseSBib3VuZCB0byB0aGUgc2VydmljZSBvbiBjb25zdHJ1Y3Rpb24uCisgKgorICogIEBoaWRlCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBCbHVldG9vdGhJbnB1dERldmljZSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJCbHVldG9vdGhJbnB1dERldmljZSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBEQkcgPSBmYWxzZTsKKworICAgIC8qKiBpbnQgZXh0cmEgZm9yIEFDVElPTl9JTlBVVF9ERVZJQ0VfU1RBVEVfQ0hBTkdFRCAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX0lOUFVUX0RFVklDRV9TVEFURSA9CisgICAgICAgICJhbmRyb2lkLmJsdWV0b290aC5pbnB1dGRldmljZS5leHRyYS5JTlBVVF9ERVZJQ0VfU1RBVEUiOworICAgIC8qKiBpbnQgZXh0cmEgZm9yIEFDVElPTl9JTlBVVF9ERVZJQ0VfU1RBVEVfQ0hBTkdFRCAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX1BSRVZJT1VTX0lOUFVUX0RFVklDRV9TVEFURSA9CisgICAgICAgICJhbmRyb2lkLmJsdWV0b290aC5pbnB1dGRldmljZS5leHRyYS5QUkVWSU9VU19JTlBVVF9ERVZJQ0VfU1RBVEUiOworCisgICAgLyoqIEluZGljYXRlcyB0aGUgc3RhdGUgb2YgYW4gaW5wdXQgZGV2aWNlIGhhcyBjaGFuZ2VkLgorICAgICAqIFRoaXMgaW50ZW50IHdpbGwgYWx3YXlzIGNvbnRhaW4gRVhUUkFfSU5QVVRfREVWSUNFX1NUQVRFLAorICAgICAqIEVYVFJBX1BSRVZJT1VTX0lOUFVUX0RFVklDRV9TVEFURSBhbmQgQmx1ZXRvb3RoRGV2aWNlLkVYVFJBX0RFVklDRQorICAgICAqIGV4dHJhcy4KKyAgICAgKi8KKyAgICBAU2RrQ29uc3RhbnQoU2RrQ29uc3RhbnRUeXBlLkJST0FEQ0FTVF9JTlRFTlRfQUNUSU9OKQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9JTlBVVF9ERVZJQ0VfU1RBVEVfQ0hBTkdFRCA9CisgICAgICAgICJhbmRyb2lkLmJsdWV0b290aC5pbnB1dGRldmljZS5hY3Rpb24uSU5QVVRfREVWSUNFX1NUQVRFX0NIQU5HRUQiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfRElTQ09OTkVDVEVEID0gMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFURV9DT05ORUNUSU5HICAgPSAxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0NPTk5FQ1RFRCAgICA9IDI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfRElTQ09OTkVDVElORyA9IDM7CisKKyAgICAvKioKKyAgICAgKiBBdXRvIGNvbm5lY3Rpb24sIGluY29taW5nIGFuZCBvdXRnb2luZyBjb25uZWN0aW9uIGFyZSBhbGxvd2VkIGF0IHRoaXMKKyAgICAgKiBwcmlvcml0eSBsZXZlbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUklPUklUWV9BVVRPX0NPTk5FQ1QgPSAxMDAwOworICAgIC8qKgorICAgICAqIEluY29taW5nIGFuZCBvdXRnb2luZyBjb25uZWN0aW9uIGFyZSBhbGxvd2VkIGF0IHRoaXMgcHJpb3JpdHkgbGV2ZWwKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUklPUklUWV9PTiA9IDEwMDsKKyAgICAvKioKKyAgICAgKiBDb25uZWN0aW9ucyB0byB0aGUgZGV2aWNlIGFyZSBub3QgYWxsb3dlZCBhdCB0aGlzIHByaW9yaXR5IGxldmVsLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBSSU9SSVRZX09GRiA9IDA7CisgICAgLyoqCisgICAgICogRGVmYXVsdCBwcmlvcml0eSBsZXZlbCB3aGVuIHRoZSBkZXZpY2UgaXMgdW5wYWlyZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJJT1JJVFlfVU5ERUZJTkVEID0gLTE7CisKKyAgICBwcml2YXRlIGZpbmFsIElCbHVldG9vdGggbVNlcnZpY2U7CisgICAgcHJpdmF0ZSBmaW5hbCBDb250ZXh0IG1Db250ZXh0OworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgQmx1ZXRvb3RoSW5wdXREZXZpY2UgcHJveHkgb2JqZWN0IGZvciBpbnRlcmFjdGluZyB3aXRoIHRoZSBsb2NhbAorICAgICAqIEJsdWV0b290aCBTZXJ2aWNlIHdoaWNoIGhhbmRsZSB0aGUgSElEIHByb2ZpbGUuCisgICAgICogQHBhcmFtIGMgQ29udGV4dAorICAgICAqLworICAgIHB1YmxpYyBCbHVldG9vdGhJbnB1dERldmljZShDb250ZXh0IGMpIHsKKyAgICAgICAgbUNvbnRleHQgPSBjOworCisgICAgICAgIElCaW5kZXIgYiA9IFNlcnZpY2VNYW5hZ2VyLmdldFNlcnZpY2UoQmx1ZXRvb3RoQWRhcHRlci5CTFVFVE9PVEhfU0VSVklDRSk7CisgICAgICAgIGlmIChiICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1TZXJ2aWNlID0gSUJsdWV0b290aC5TdHViLmFzSW50ZXJmYWNlKGIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTG9nLncoVEFHLCAiQmx1ZXRvb3RoIFNlcnZpY2Ugbm90IGF2YWlsYWJsZSEiKTsKKworICAgICAgICAgICAgLy8gSW5zdGVhZCBvZiB0aHJvd2luZyBhbiBleGNlcHRpb24gd2hpY2ggcHJldmVudHMgcGVvcGxlIGZyb20gZ29pbmcKKyAgICAgICAgICAgIC8vIGludG8gV2lyZWxlc3Mgc2V0dGluZ3MgaW4gdGhlIGVtdWxhdG9yLiBMZXQgaXQgY3Jhc2ggbGF0ZXIgd2hlbiBpdCBpcyBhY3R1YWxseSB1c2VkLgorICAgICAgICAgICAgbVNlcnZpY2UgPSBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqIEluaXRpYXRlIGEgY29ubmVjdGlvbiB0byBhbiBJbnB1dCBkZXZpY2UuCisgICAgICoKKyAgICAgKiAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIGZhbHNlIG9uIGVycm9yIGFuZCB0cnVlIGlmIHRoZSBjb25uZWN0aW9uCisgICAgICogIGF0dGVtcHQgaXMgYmVpbmcgbWFkZS4KKyAgICAgKgorICAgICAqICBMaXN0ZW4gZm9yIElOUFVUX0RFVklDRV9TVEFURV9DSEFOR0VEX0FDVElPTiB0byBmaW5kIG91dCB3aGVuIHRoZQorICAgICAqICBjb25uZWN0aW9uIGlzIGNvbXBsZXRlZC4KKyAgICAgKiAgQHBhcmFtIGRldmljZSBSZW1vdGUgQlQgZGV2aWNlLgorICAgICAqICBAcmV0dXJuIGZhbHNlIG9uIGltbWVkaWF0ZSBlcnJvciwgdHJ1ZSBvdGhlcndpc2UKKyAgICAgKiAgQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBjb25uZWN0SW5wdXREZXZpY2UoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgeworICAgICAgICBpZiAoREJHKSBsb2coImNvbm5lY3RJbnB1dERldmljZSgiICsgZGV2aWNlICsgIikiKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBtU2VydmljZS5jb25uZWN0SW5wdXREZXZpY2UoZGV2aWNlKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIiIsIGUpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqIEluaXRpYXRlIGRpc2Nvbm5lY3QgZnJvbSBhbiBJbnB1dCBEZXZpY2UuCisgICAgICogIFRoaXMgZnVuY3Rpb24gcmV0dXJuIGZhbHNlIG9uIGVycm9yIGFuZCB0cnVlIGlmIHRoZSBkaXNjb25uZWN0aW9uCisgICAgICogIGF0dGVtcHQgaXMgYmVpbmcgbWFkZS4KKyAgICAgKgorICAgICAqICBMaXN0ZW4gZm9yIElOUFVUX0RFVklDRV9TVEFURV9DSEFOR0VEX0FDVElPTiB0byBmaW5kIG91dCB3aGVuCisgICAgICogIGRpc2Nvbm5lY3QgaXMgY29tcGxldGVkLgorICAgICAqCisgICAgICogIEBwYXJhbSBkZXZpY2UgUmVtb3RlIEJUIGRldmljZS4KKyAgICAgKiAgQHJldHVybiBmYWxzZSBvbiBpbW1lZGlhdGUgZXJyb3IsIHRydWUgb3RoZXJ3aXNlCisgICAgICogIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZGlzY29ubmVjdElucHV0RGV2aWNlKEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKKyAgICAgICAgaWYgKERCRykgbG9nKCJkaXNjb25uZWN0SW5wdXREZXZpY2UoIiArIGRldmljZSArICIpIik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gbVNlcnZpY2UuZGlzY29ubmVjdElucHV0RGV2aWNlKGRldmljZSk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICIiLCBlKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKiBDaGVjayBpZiBhIHNwZWNpZmllZCBJbnB1dERldmljZSBpcyBjb25uZWN0ZWQuCisgICAgICoKKyAgICAgKiAgQHBhcmFtIGRldmljZSBSZW1vdGUgQlQgZGV2aWNlLgorICAgICAqICBAcmV0dXJuIFRydWUgaWYgY29ubmVjdGVkICwgZmFsc2Ugb3RoZXJ3aXNlIGFuZCBvbiBlcnJvci4KKyAgICAgKiAgQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0lucHV0RGV2aWNlQ29ubmVjdGVkKEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKKyAgICAgICAgaWYgKERCRykgbG9nKCJpc0lucHV0RGV2aWNlQ29ubmVjdGVkKCIgKyBkZXZpY2UgKyAiKSIpOworICAgICAgICBpbnQgc3RhdGUgPSBnZXRJbnB1dERldmljZVN0YXRlKGRldmljZSk7CisgICAgICAgIGlmIChzdGF0ZSA9PSBTVEFURV9DT05ORUNURUQpIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqIENoZWNrIGlmIGFueSBJbnB1dCBEZXZpY2UgaXMgY29ubmVjdGVkLgorICAgICAqCisgICAgICogQHJldHVybiBhIHVubW9kaWZpYWJsZSBzZXQgb2YgY29ubmVjdGVkIElucHV0IERldmljZXMsIG9yIG51bGwgb24gZXJyb3IuCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgU2V0PEJsdWV0b290aERldmljZT4gZ2V0Q29ubmVjdGVkSW5wdXREZXZpY2VzKCkgeworICAgICAgICBpZiAoREJHKSBsb2coImdldENvbm5lY3RlZElucHV0RGV2aWNlcygpIik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlU2V0KAorICAgICAgICAgICAgICAgICAgICBuZXcgSGFzaFNldDxCbHVldG9vdGhEZXZpY2U+KAorICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdChtU2VydmljZS5nZXRDb25uZWN0ZWRJbnB1dERldmljZXMoKSkpKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIiIsIGUpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiogR2V0IHRoZSBzdGF0ZSBvZiBhbiBJbnB1dCBEZXZpY2UuCisgICAgICoKKyAgICAgKiAgQHBhcmFtIGRldmljZSBSZW1vdGUgQlQgZGV2aWNlLgorICAgICAqICBAcmV0dXJuIFRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBJbnB1dCBEZXZpY2UKKyAgICAgKiAgQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldElucHV0RGV2aWNlU3RhdGUoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgeworICAgICAgICBpZiAoREJHKSBsb2coImdldElucHV0RGV2aWNlU3RhdGUoIiArIGRldmljZSArICIpIik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gbVNlcnZpY2UuZ2V0SW5wdXREZXZpY2VTdGF0ZShkZXZpY2UpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiIiwgZSk7CisgICAgICAgICAgICByZXR1cm4gU1RBVEVfRElTQ09OTkVDVEVEOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHByaW9yaXR5IG9mIGFuIGlucHV0IGRldmljZS4KKyAgICAgKgorICAgICAqIFByaW9yaXR5IGlzIGEgbm9uLW5lZ2F0aXZlIGludGVnZXIuIFByaW9yaXR5IGNhbiB0YWtlIHRoZSBmb2xsb3dpbmcKKyAgICAgKiB2YWx1ZXM6CisgICAgICoge0BsaW5rIFBSSU9SSVRZX09OfSwge0BsaW5rIFBSSU9SSVRZX09GRn0sIHtAbGluayBQUklPUklUWV9BVVRPX0NPTk5FQ1R9CisgICAgICoKKyAgICAgKiBAcGFyYW0gZGV2aWNlIFBhaXJlZCBkZXZpY2UuCisgICAgICogQHBhcmFtIHByaW9yaXR5IEludGVnZXIgcHJpb3JpdHkKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgcHJpb3JpdHkgaXMgc2V0LCBmYWxzZSBvbiBlcnJvcgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHNldElucHV0RGV2aWNlUHJpb3JpdHkoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW50IHByaW9yaXR5KSB7CisgICAgICAgIGlmIChEQkcpIGxvZygic2V0SW5wdXREZXZpY2VQcmlvcml0eSgiICsgZGV2aWNlICsgIiwgIiArIHByaW9yaXR5ICsgIikiKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBtU2VydmljZS5zZXRJbnB1dERldmljZVByaW9yaXR5KGRldmljZSwgcHJpb3JpdHkpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiIiwgZSk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHByaW9yaXR5IGFzc29jaWF0ZWQgd2l0aCBhbiBJbnB1dCBEZXZpY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGV2aWNlIElucHV0IERldmljZQorICAgICAqIEByZXR1cm4gbm9uLW5lZ2F0aXZlIHByaW9yaXR5LCBvciBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGVycm9yLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0SW5wdXREZXZpY2VQcmlvcml0eShCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7CisgICAgICAgIGlmIChEQkcpIGxvZygiZ2V0SW5wdXREZXZpY2VQcmlvcml0eSgiICsgZGV2aWNlICsgIikiKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBtU2VydmljZS5nZXRJbnB1dERldmljZVByaW9yaXR5KGRldmljZSk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICIiLCBlKTsKKyAgICAgICAgICAgIHJldHVybiBQUklPUklUWV9PRkY7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGxvZyhTdHJpbmcgbXNnKSB7CisgICAgICAgIExvZy5kKFRBRywgbXNnKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoUGFuLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoUGFuLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTUyNzY1ZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhQYW4uamF2YQpAQCAtMCwwICsxLDE5MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5ibHVldG9vdGg7CisKK2ltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uU2RrQ29uc3RhbnQ7CitpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLlNka0NvbnN0YW50LlNka0NvbnN0YW50VHlwZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLm9zLlNlcnZpY2VNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworLyoqCisgKiBAaGlkZQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgQmx1ZXRvb3RoUGFuIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkJsdWV0b290aFBhbiI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBEQkcgPSBmYWxzZTsKKworICAgIC8qKiBpbnQgZXh0cmEgZm9yIEFDVElPTl9QQU5fU1RBVEVfQ0hBTkdFRCAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX1BBTl9TVEFURSA9CisgICAgICAgICJhbmRyb2lkLmJsdWV0b290aC5wYW4uZXh0cmEuU1RBVEUiOworICAgIC8qKiBpbnQgZXh0cmEgZm9yIEFDVElPTl9QQU5fU1RBVEVfQ0hBTkdFRCAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX1BSRVZJT1VTX1BBTl9TVEFURSA9CisgICAgICAgICJhbmRyb2lkLmJsdWV0b290aC5wYW4uZXh0cmEuUFJFVklPVVNfU1RBVEUiOworCisgICAgLyoqIEluZGljYXRlcyB0aGUgc3RhdGUgb2YgYW4gUEFOIGRldmljZSBoYXMgY2hhbmdlZC4KKyAgICAgKiBUaGlzIGludGVudCB3aWxsIGFsd2F5cyBjb250YWluIEVYVFJBX0RFVklDRV9TVEFURSwKKyAgICAgKiBFWFRSQV9QUkVWSU9VU19ERVZJQ0VfU1RBVEUgYW5kIEJsdWV0b290aERldmljZS5FWFRSQV9ERVZJQ0UKKyAgICAgKiBleHRyYXMuCisgICAgICovCisgICAgQFNka0NvbnN0YW50KFNka0NvbnN0YW50VHlwZS5CUk9BRENBU1RfSU5URU5UX0FDVElPTikKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fUEFOX1NUQVRFX0NIQU5HRUQgPQorICAgICAgICAiYW5kcm9pZC5ibHVldG9vdGgucGFuLmFjdGlvbi5TVEFURV9DSEFOR0VEIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BUF9ST0xFID0gIm5hcCI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFQX0JSSURHRSA9ICJwYW4xIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BWF9DT05ORUNUSU9OUyA9IDc7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFURV9ESVNDT05ORUNURUQgPSAwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0NPTk5FQ1RJTkcgICA9IDE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfQ09OTkVDVEVEICAgID0gMjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFURV9ESVNDT05ORUNUSU5HID0gMzsKKworICAgIHByaXZhdGUgZmluYWwgSUJsdWV0b290aCBtU2VydmljZTsKKyAgICBwcml2YXRlIGZpbmFsIENvbnRleHQgbUNvbnRleHQ7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBCbHVldG9vdGhQYW4gcHJveHkgb2JqZWN0IGZvciBpbnRlcmFjdGluZyB3aXRoIHRoZSBsb2NhbAorICAgICAqIEJsdWV0b290aCBQYW4gc2VydmljZS4KKyAgICAgKiBAcGFyYW0gYyBDb250ZXh0CisgICAgICovCisgICAgcHVibGljIEJsdWV0b290aFBhbihDb250ZXh0IGMpIHsKKyAgICAgICAgbUNvbnRleHQgPSBjOworCisgICAgICAgIElCaW5kZXIgYiA9IFNlcnZpY2VNYW5hZ2VyLmdldFNlcnZpY2UoQmx1ZXRvb3RoQWRhcHRlci5CTFVFVE9PVEhfU0VSVklDRSk7CisgICAgICAgIGlmIChiICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1TZXJ2aWNlID0gSUJsdWV0b290aC5TdHViLmFzSW50ZXJmYWNlKGIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTG9nLncoVEFHLCAiQmx1ZXRvb3RoIFNlcnZpY2Ugbm90IGF2YWlsYWJsZSEiKTsKKworICAgICAgICAgICAgLy8gSW5zdGVhZCBvZiB0aHJvd2luZyBhbiBleGNlcHRpb24gd2hpY2ggcHJldmVudHMgcGVvcGxlIGZyb20gZ29pbmcKKyAgICAgICAgICAgIC8vIGludG8gV2lyZWxlc3Mgc2V0dGluZ3MgaW4gdGhlIGVtdWxhdG9yLiBMZXQgaXQgY3Jhc2ggbGF0ZXIKKyAgICAgICAgICAgIC8vIHdoZW4gaXQgaXMgYWN0dWFsbHkgdXNlZC4KKyAgICAgICAgICAgIG1TZXJ2aWNlID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEluaXRpYXRlIGEgUEFOIGNvbm5lY3Rpb24uCisgICAgICoKKyAgICAgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgZmFsc2Ugb24gZXJyb3IgYW5kIHRydWUgaWYgdGhlIGNvbm5lY3Rpb24KKyAgICAgKiBhdHRlbXB0IGlzIGJlaW5nIG1hZGUuCisgICAgICoKKyAgICAgKiBMaXN0ZW4gZm9yIHtAbGluayAjQUNUSU9OX1BBTl9TVEFURV9DSEFOR0VEfSB0byBmaW5kIG91dCB3aGVuIHRoZQorICAgICAqIGNvbm5lY3Rpb24gaXMgY29tcGxldGVkLgorICAgICAqCisgICAgICogQHBhcmFtIGRldmljZSBSZW1vdGUgQlQgZGV2aWNlLgorICAgICAqIEByZXR1cm4gZmFsc2Ugb24gaW1tZWRpYXRlIGVycm9yLCB0cnVlIG90aGVyd2lzZQorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gY29ubmVjdChCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7CisgICAgICAgIGlmIChEQkcpIGxvZygiY29ubmVjdCgiICsgZGV2aWNlICsgIikiKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBtU2VydmljZS5jb25uZWN0UGFuRGV2aWNlKGRldmljZSk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICIiLCBlKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEluaXRpYXRlIGRpc2Nvbm5lY3QgZnJvbSBQQU4uCisgICAgICoKKyAgICAgKiBUaGlzIGZ1bmN0aW9uIHJldHVybiBmYWxzZSBvbiBlcnJvciBhbmQgdHJ1ZSBpZiB0aGUgZGlzY29ubmVjdGlvbgorICAgICAqIGF0dGVtcHQgaXMgYmVpbmcgbWFkZS4KKyAgICAgKgorICAgICAqIExpc3RlbiBmb3Ige0BsaW5rICNBQ1RJT05fUEFOX1NUQVRFX0NIQU5HRUR9IHRvIGZpbmQgb3V0IHdoZW4KKyAgICAgKiBkaXNjb25uZWN0IGlzIGNvbXBsZXRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkZXZpY2UgUmVtb3RlIEJUIGRldmljZS4KKyAgICAgKiBAcmV0dXJuIGZhbHNlIG9uIGltbWVkaWF0ZSBlcnJvciwgdHJ1ZSBvdGhlcndpc2UKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGRpc2Nvbm5lY3QoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgeworICAgICAgICBpZiAoREJHKSBsb2coImRpc2Nvbm5lY3QoIiArIGRldmljZSArICIpIik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gbVNlcnZpY2UuZGlzY29ubmVjdFBhbkRldmljZShkZXZpY2UpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiIiwgZSk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiogR2V0IHRoZSBzdGF0ZSBvZiBhIFBBTiBEZXZpY2UuCisgICAgKgorICAgICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGFuIGludCByZXByZXNlbnRpbmcgdGhlIHN0YXRlIG9mIHRoZSBQQU4gY29ubmVjdGlvbgorICAgICoKKyAgICAqICBAcGFyYW0gZGV2aWNlIFJlbW90ZSBCVCBkZXZpY2UuCisgICAgKiAgQHJldHVybiBUaGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgUEFOIERldmljZQorICAgICogIEBoaWRlCisgICAgKi8KKyAgIHB1YmxpYyBpbnQgZ2V0UGFuRGV2aWNlU3RhdGUoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgeworICAgICAgIGlmIChEQkcpIGxvZygiZ2V0UGFuRGV2aWNlU3RhdGUoIiArIGRldmljZSArICIpIik7CisgICAgICAgdHJ5IHsKKyAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLmdldFBhbkRldmljZVN0YXRlKGRldmljZSk7CisgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgTG9nLmUoVEFHLCAiIiwgZSk7CisgICAgICAgICAgIHJldHVybiBTVEFURV9ESVNDT05ORUNURUQ7CisgICAgICAgfQorICAgfQorCisgICAvKiogUmV0dXJucyBhIHNldCBvZiBhbGwgdGhlIGNvbm5lY3RlZCBQQU4gRGV2aWNlcworICAgKgorICAgKiBEb2VzIG5vdCBpbmNsdWRlIGRldmljZXMgdGhhdCBhcmUgY3VycmVudGx5IGNvbm5lY3Rpbmcgb3IgZGlzY29ubmVjdGluZworICAgKgorICAgKiBAcmV0dXJuIGEgdW5tb2RpZmlhYmxlIHNldCBvZiBjb25uZWN0ZWQgUEFOIERldmljZXMsIG9yIG51bGwgb24gZXJyb3IuCisgICAqIEBoaWRlCisgICAqLworICAgcHVibGljIFNldDxCbHVldG9vdGhEZXZpY2U+IGdldENvbm5lY3RlZERldmljZXMoKSB7CisgICAgICBpZiAoREJHKSBsb2coImdldENvbm5lY3RlZERldmljZXMiKTsKKyAgICAgIHRyeSB7CisgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNldCgKKyAgICAgICAgICAgICAgICAgIG5ldyBIYXNoU2V0PEJsdWV0b290aERldmljZT4oCisgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdChtU2VydmljZS5nZXRDb25uZWN0ZWRQYW5EZXZpY2VzKCkpKSk7CisgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgIExvZy5lKFRBRywgIiIsIGUpOworICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgfQorICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBsb2coU3RyaW5nIG1zZykgeworICAgICAgICBMb2cuZChUQUcsIG1zZyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Qmx1ZXRvb3RoVGV0aGVyaW5nKGJvb2xlYW4gdmFsdWUsIFN0cmluZyB1dWlkLCBTdHJpbmcgYnJpZGdlKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtU2VydmljZS5zZXRCbHVldG9vdGhUZXRoZXJpbmcodmFsdWUsIHV1aWQsIGJyaWRnZSk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICIiLCBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzVGV0aGVyaW5nT24oKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gbVNlcnZpY2UuaXNUZXRoZXJpbmdPbigpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiIiwgZSk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoUHJvZmlsZVN0YXRlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoUHJvZmlsZVN0YXRlLmphdmEKaW5kZXggOTQ2ZGNhYS4uYWQ3MGQwZCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aFByb2ZpbGVTdGF0ZS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhQcm9maWxlU3RhdGUuamF2YQpAQCAtNDMsOCArNDMsOSBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREJHID0gdHJ1ZTsgLy8gU1RPUFNISVAgLSBjaGFuZ2UgdG8gZmFsc2UuCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJCbHVldG9vdGhQcm9maWxlU3RhdGUiOwogCi0gICAgcHVibGljIHN0YXRpYyBpbnQgSEZQID0gMDsKLSAgICBwdWJsaWMgc3RhdGljIGludCBBMkRQID0gMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBIRlAgPSAwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEEyRFAgPSAxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhJRCA9IDI7CiAKICAgICBwcml2YXRlIHN0YXRpYyBpbnQgVFJBTlNJVElPTl9UT19TVEFCTEUgPSAxMDA7CiAKQEAgLTcwLDYgKzcxLDEyIEBACiAgICAgICAgICAgICAgICAgICAgIG5ld1N0YXRlID09IEJsdWV0b290aEEyZHAuU1RBVEVfRElTQ09OTkVDVEVEKSkgewogICAgICAgICAgICAgICAgICAgICBzZW5kTWVzc2FnZShUUkFOU0lUSU9OX1RPX1NUQUJMRSk7CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24uZXF1YWxzKEJsdWV0b290aElucHV0RGV2aWNlLkFDVElPTl9JTlBVVF9ERVZJQ0VfU1RBVEVfQ0hBTkdFRCkpIHsKKyAgICAgICAgICAgICAgICBpbnQgbmV3U3RhdGUgPSBpbnRlbnQuZ2V0SW50RXh0cmEoQmx1ZXRvb3RoSW5wdXREZXZpY2UuRVhUUkFfSU5QVVRfREVWSUNFX1NUQVRFLCAwKTsKKyAgICAgICAgICAgICAgICBpZiAobVByb2ZpbGUgPT0gSElEICYmIChuZXdTdGF0ZSA9PSBCbHVldG9vdGhJbnB1dERldmljZS5TVEFURV9DT05ORUNURUQgfHwKKyAgICAgICAgICAgICAgICAgICAgbmV3U3RhdGUgPT0gQmx1ZXRvb3RoSW5wdXREZXZpY2UuU1RBVEVfRElTQ09OTkVDVEVEKSkgeworICAgICAgICAgICAgICAgICAgICBzZW5kTWVzc2FnZShUUkFOU0lUSU9OX1RPX1NUQUJMRSk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfTsKQEAgLTg0LDYgKzkxLDcgQEAKICAgICAgICAgSW50ZW50RmlsdGVyIGZpbHRlciA9IG5ldyBJbnRlbnRGaWx0ZXIoKTsKICAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihCbHVldG9vdGhBMmRwLkFDVElPTl9TSU5LX1NUQVRFX0NIQU5HRUQpOwogICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKEJsdWV0b290aEhlYWRzZXQuQUNUSU9OX1NUQVRFX0NIQU5HRUQpOworICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKEJsdWV0b290aElucHV0RGV2aWNlLkFDVElPTl9JTlBVVF9ERVZJQ0VfU1RBVEVfQ0hBTkdFRCk7CiAgICAgICAgIGNvbnRleHQucmVnaXN0ZXJSZWNlaXZlcihtQnJvYWRjYXN0UmVjZWl2ZXIsIGZpbHRlcik7CiAgICAgfQogCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoVXVpZC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aFV1aWQuamF2YQppbmRleCA0MTY0YTNkLi4zZmJmYzcwIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoVXVpZC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhVdWlkLmphdmEKQEAgLTQ5LDEwICs0OSwxOCBAQAogICAgICAgICAgICAgUGFyY2VsVXVpZC5mcm9tU3RyaW5nKCIwMDAwMTEwQy0wMDAwLTEwMDAtODAwMC0wMDgwNUY5QjM0RkIiKTsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFBhcmNlbFV1aWQgT2JleE9iamVjdFB1c2ggPQogICAgICAgICAgICAgUGFyY2VsVXVpZC5mcm9tU3RyaW5nKCIwMDAwMTEwNS0wMDAwLTEwMDAtODAwMC0wMDgwNWY5YjM0ZmIiKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFBhcmNlbFV1aWQgSGlkID0KKyAgICAgICAgICAgIFBhcmNlbFV1aWQuZnJvbVN0cmluZygiMDAwMDExMjQtMDAwMC0xMDAwLTgwMDAtMDA4MDVmOWIzNGZiIik7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBQYXJjZWxVdWlkIFBBTlUgPQorICAgICAgICAgICAgUGFyY2VsVXVpZC5mcm9tU3RyaW5nKCIwMDAwMTExNS0wMDAwLTEwMDAtODAwMC0wMDgwNUY5QjM0RkIiKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFBhcmNlbFV1aWQgTkFQID0KKyAgICAgICAgICAgIFBhcmNlbFV1aWQuZnJvbVN0cmluZygiMDAwMDExMTYtMDAwMC0xMDAwLTgwMDAtMDA4MDVGOUIzNEZCIik7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBQYXJjZWxVdWlkIEJORVAgPQorICAgICAgICAgICAgUGFyY2VsVXVpZC5mcm9tU3RyaW5nKCIwMDAwMDAwZi0wMDAwLTEwMDAtODAwMC0wMDgwNUY5QjM0RkIiKTsKIAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUGFyY2VsVXVpZFtdIFJFU0VSVkVEX1VVSURTID0gewogICAgICAgICBBdWRpb1NpbmssIEF1ZGlvU291cmNlLCBBZHZBdWRpb0Rpc3QsIEhTUCwgSGFuZHNmcmVlLCBBdnJjcENvbnRyb2xsZXIsIEF2cmNwVGFyZ2V0LAotICAgICAgICBPYmV4T2JqZWN0UHVzaH07CisgICAgICAgIE9iZXhPYmplY3RQdXNoLCBQQU5VLCBOQVB9OwogCiAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzQXVkaW9Tb3VyY2UoUGFyY2VsVXVpZCB1dWlkKSB7CiAgICAgICAgIHJldHVybiB1dWlkLmVxdWFscyhBdWRpb1NvdXJjZSk7CkBAIC04Miw2ICs5MCwyMSBAQAogICAgICAgICByZXR1cm4gdXVpZC5lcXVhbHMoQXZyY3BUYXJnZXQpOwogICAgIH0KIAorICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0lucHV0RGV2aWNlKFBhcmNlbFV1aWQgdXVpZCkgeworICAgICAgICByZXR1cm4gdXVpZC5lcXVhbHMoSGlkKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNQYW51KFBhcmNlbFV1aWQgdXVpZCkgeworICAgICAgICByZXR1cm4gdXVpZC5lcXVhbHMoUEFOVSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzTmFwKFBhcmNlbFV1aWQgdXVpZCkgeworICAgICAgICByZXR1cm4gdXVpZC5lcXVhbHMoTkFQKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNCbmVwKFBhcmNlbFV1aWQgdXVpZCkgeworICAgICAgICByZXR1cm4gdXVpZC5lcXVhbHMoQk5FUCk7CisgICAgfQogICAgIC8qKgogICAgICAqIFJldHVybnMgdHJ1ZSBpZiBQYXJjZWxVdWlkIGlzIHByZXNlbnQgaW4gdXVpZEFycmF5CiAgICAgICoKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoLmFpZGwgYi9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvSUJsdWV0b290aC5haWRsCmluZGV4IGVhNzEwMzQuLmY4ZjY3OGIgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoLmFpZGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0lCbHVldG9vdGguYWlkbApAQCAtMTcsNiArMTcsNyBAQAogcGFja2FnZSBhbmRyb2lkLmJsdWV0b290aDsKIAogaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLklCbHVldG9vdGhDYWxsYmFjazsKK2ltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhEZXZpY2U7CiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxVdWlkOwogCiAvKioKQEAgLTcyLDQgKzczLDE5IEBACiAgICAgYm9vbGVhbiBjb25uZWN0SGVhZHNldChTdHJpbmcgYWRkcmVzcyk7CiAgICAgYm9vbGVhbiBkaXNjb25uZWN0SGVhZHNldChTdHJpbmcgYWRkcmVzcyk7CiAgICAgYm9vbGVhbiBub3RpZnlJbmNvbWluZ0Nvbm5lY3Rpb24oU3RyaW5nIGFkZHJlc3MpOworCisgICAgLy8gSElEIHByb2ZpbGUgQVBJcworICAgIGJvb2xlYW4gY29ubmVjdElucHV0RGV2aWNlKGluIEJsdWV0b290aERldmljZSBkZXZpY2UpOworICAgIGJvb2xlYW4gZGlzY29ubmVjdElucHV0RGV2aWNlKGluIEJsdWV0b290aERldmljZSBkZXZpY2UpOworICAgIEJsdWV0b290aERldmljZVtdIGdldENvbm5lY3RlZElucHV0RGV2aWNlcygpOyAgLy8gY2hhbmdlIHRvIFNldDw+IG9uY2UgQUlETCBzdXBwb3J0cworICAgIGludCBnZXRJbnB1dERldmljZVN0YXRlKGluIEJsdWV0b290aERldmljZSBkZXZpY2UpOworICAgIGJvb2xlYW4gc2V0SW5wdXREZXZpY2VQcmlvcml0eShpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBpbnQgcHJpb3JpdHkpOworICAgIGludCBnZXRJbnB1dERldmljZVByaW9yaXR5KGluIEJsdWV0b290aERldmljZSBkZXZpY2UpOworCisgICAgYm9vbGVhbiBpc1RldGhlcmluZ09uKCk7CisgICAgdm9pZCBzZXRCbHVldG9vdGhUZXRoZXJpbmcoYm9vbGVhbiB2YWx1ZSwgU3RyaW5nIHV1aWQsIFN0cmluZyBicmlkZ2UpOworICAgIGludCBnZXRQYW5EZXZpY2VTdGF0ZShpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlKTsKKyAgICBCbHVldG9vdGhEZXZpY2VbXSBnZXRDb25uZWN0ZWRQYW5EZXZpY2VzKCk7CisgICAgYm9vbGVhbiBjb25uZWN0UGFuRGV2aWNlKGluIEJsdWV0b290aERldmljZSBkZXZpY2UpOworICAgIGJvb2xlYW4gZGlzY29ubmVjdFBhbkRldmljZShpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9TY29Tb2NrZXQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9TY29Tb2NrZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY1YTk5YS4uMDAwMDAwMAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvU2NvU29ja2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5ibHVldG9vdGg7Ci0KLWltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwotaW1wb3J0IGFuZHJvaWQub3MuUG93ZXJNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQub3MuUG93ZXJNYW5hZ2VyLldha2VMb2NrOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KLS8qKgotICogVGhlIEFuZHJvaWQgQmx1ZXRvb3RoIEFQSSBpcyBub3QgZmluYWxpemVkLCBhbmQgKndpbGwqIGNoYW5nZS4gVXNlIGF0IHlvdXIKLSAqIG93biByaXNrLgotICoKLSAqIFNpbXBsZSBTQ08gU29ja2V0LgotICogQ3VycmVudGx5IGluIEFuZHJvaWQsIHRoZXJlIGlzIG5vIHN1cHBvcnQgZm9yIHNlbmRpbmcgZGF0YSBvdmVyIGEgU0NPCi0gKiBzb2NrZXQgLSB0aGlzIGlzIG1hbmFnZWQgYnkgdGhlIGhhcmR3YXJlIGxpbmsgdG8gdGhlIEJsdWV0b290aCBDaGlwLiBUaGlzCi0gKiBjbGFzcyBpcyBpbnN0ZWFkIGludGVuZGVkIGZvciBtYW5hZ2VtZW50IG9mIHRoZSBTQ08gc29ja2V0IGxpZmV0aW1lLCAKLSAqIGFuZCBpcyB0YWlsb3JlZCBmb3IgdXNlIHdpdGggdGhlIGhlYWRzZXQgLyBoYW5kc2ZyZWUgcHJvZmlsZXMuCi0gKiBAaGlkZQotICovCi1wdWJsaWMgY2xhc3MgU2NvU29ja2V0IHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlNjb1NvY2tldCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBEQkcgPSB0cnVlOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gVkRCRyA9IGZhbHNlOyAgLy8gZXZlbiBtb3JlIGxvZ2dpbmcKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFX1JFQURZID0gMTsgICAgLy8gUmVhZHkgZm9yIHVzZS4gTm8gdGhyZWFkcyBvciBzb2NrZXRzCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfQUNDRVBUID0gMjsgICAvLyBhY2NlcHQoKSB0aHJlYWQgcnVubmluZwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0NPTk5FQ1RJTkcgPSAzOyAgLy8gY29ubmVjdCgpIHRocmVhZCBydW5uaW5nCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfQ09OTkVDVEVEID0gNDsgICAvLyBjb25uZWN0ZWQsIHdhaXRpbmcgZm9yIGNsb3NlKCkKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFURV9DTE9TRUQgPSA1OyAgIC8vIHdhcyBjb25uZWN0ZWQsIG5vdyBjbG9zZWQuCi0KLSAgICBwcml2YXRlIGludCBtU3RhdGU7Ci0gICAgcHJpdmF0ZSBpbnQgbU5hdGl2ZURhdGE7Ci0gICAgcHJpdmF0ZSBIYW5kbGVyIG1IYW5kbGVyOwotICAgIHByaXZhdGUgaW50IG1BY2NlcHRlZENvZGU7Ci0gICAgcHJpdmF0ZSBpbnQgbUNvbm5lY3RlZENvZGU7Ci0gICAgcHJpdmF0ZSBpbnQgbUNsb3NlZENvZGU7Ci0KLSAgICBwcml2YXRlIFdha2VMb2NrIG1XYWtlTG9jazsgIC8vIGhlbGQgd2hpbGUgaW4gU1RBVEVfQ09OTkVDVElORwotCi0gICAgc3RhdGljIHsKLSAgICAgICAgY2xhc3NJbml0TmF0aXZlKCk7Ci0gICAgfQotICAgIHByaXZhdGUgbmF0aXZlIHN0YXRpYyB2b2lkIGNsYXNzSW5pdE5hdGl2ZSgpOwotCi0gICAgcHVibGljIFNjb1NvY2tldChQb3dlck1hbmFnZXIgcG0sIEhhbmRsZXIgaGFuZGxlciwgaW50IGFjY2VwdGVkQ29kZSwgaW50IGNvbm5lY3RlZENvZGUsCi0gICAgICAgICAgICAgICAgICAgICBpbnQgY2xvc2VkQ29kZSkgewotICAgICAgICBpbml0TmF0aXZlKCk7Ci0gICAgICAgIG1TdGF0ZSA9IFNUQVRFX1JFQURZOwotICAgICAgICBtSGFuZGxlciA9IGhhbmRsZXI7Ci0gICAgICAgIG1BY2NlcHRlZENvZGUgPSBhY2NlcHRlZENvZGU7Ci0gICAgICAgIG1Db25uZWN0ZWRDb2RlID0gY29ubmVjdGVkQ29kZTsKLSAgICAgICAgbUNsb3NlZENvZGUgPSBjbG9zZWRDb2RlOwotICAgICAgICBtV2FrZUxvY2sgPSBwbS5uZXdXYWtlTG9jayhQb3dlck1hbmFnZXIuUEFSVElBTF9XQUtFX0xPQ0ssICJTY29Tb2NrZXQiKTsKLSAgICAgICAgbVdha2VMb2NrLnNldFJlZmVyZW5jZUNvdW50ZWQoZmFsc2UpOwotICAgICAgICBpZiAoVkRCRykgbG9nKHRoaXMgKyAiIFNDTyBPQkpFQ1QgQ1RPUiIpOwotICAgIH0KLSAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIGluaXROYXRpdmUoKTsKLQotICAgIHByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoVkRCRykgbG9nKHRoaXMgKyAiIFNDTyBPQkpFQ1QgRFRPUiIpOwotICAgICAgICAgICAgZGVzdHJveU5hdGl2ZSgpOwotICAgICAgICAgICAgcmVsZWFzZVdha2VMb2NrTm93KCk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBzdXBlci5maW5hbGl6ZSgpOwotICAgICAgICB9Ci0gICAgfQotICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgZGVzdHJveU5hdGl2ZSgpOwotCi0gICAgLyoqIENvbm5lY3QgdGhpcyBTQ08gc29ja2V0IHRvIHRoZSBnaXZlbiBCVCBhZGRyZXNzLgotICAgICAqICBEb2VzIG5vdCBibG9jay4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gY29ubmVjdChTdHJpbmcgYWRkcmVzcywgU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgaWYgKERCRykgbG9nKCJjb25uZWN0KCkgIiArIHRoaXMpOwotICAgICAgICBpZiAobVN0YXRlICE9IFNUQVRFX1JFQURZKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSBsb2coImNvbm5lY3QoKTogQmFkIHN0YXRlIik7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgYWNxdWlyZVdha2VMb2NrKCk7Ci0gICAgICAgIGlmIChjb25uZWN0TmF0aXZlKGFkZHJlc3MsIG5hbWUpKSB7Ci0gICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9DT05ORUNUSU5HOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9DTE9TRUQ7Ci0gICAgICAgICAgICByZWxlYXNlV2FrZUxvY2tOb3coKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLSAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuIGNvbm5lY3ROYXRpdmUoU3RyaW5nIGFkZHJlc3MsIFN0cmluZyBuYW1lKTsKLQotICAgIC8qKiBBY2NlcHQgaW5jb21pbmcgU0NPIGNvbm5lY3Rpb25zLgotICAgICAqICBEb2VzIG5vdCBibG9jay4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gYWNjZXB0KCkgewotICAgICAgICBpZiAoVkRCRykgbG9nKCJhY2NlcHQoKSAiICsgdGhpcyk7Ci0gICAgICAgIGlmIChtU3RhdGUgIT0gU1RBVEVfUkVBRFkpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIGxvZygiQmFkIHN0YXRlIik7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGFjY2VwdE5hdGl2ZSgpKSB7Ci0gICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9BQ0NFUFQ7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX0NMT1NFRDsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLSAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuIGFjY2VwdE5hdGl2ZSgpOwotCi0gICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGNsb3NlKCkgewotICAgICAgICBpZiAoREJHKSBsb2codGhpcyArICIgU0NPIE9CSkVDVCBjbG9zZSgpIG1TdGF0ZSA9ICIgKyBtU3RhdGUpOwotICAgICAgICBhY3F1aXJlV2FrZUxvY2soKTsKLSAgICAgICAgbVN0YXRlID0gU1RBVEVfQ0xPU0VEOwotICAgICAgICBjbG9zZU5hdGl2ZSgpOwotICAgICAgICByZWxlYXNlV2FrZUxvY2soKTsKLSAgICB9Ci0gICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBjbG9zZU5hdGl2ZSgpOwotCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBpbnQgZ2V0U3RhdGUoKSB7Ci0gICAgICAgIHJldHVybiBtU3RhdGU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBvbkNvbm5lY3RlZChpbnQgcmVzdWx0KSB7Ci0gICAgICAgIGlmIChWREJHKSBsb2codGhpcyArICIgb25Db25uZWN0ZWQoKSBtU3RhdGUgPSAiICsgbVN0YXRlICsgIiAiICsgdGhpcyk7Ci0gICAgICAgIGlmIChtU3RhdGUgIT0gU1RBVEVfQ09OTkVDVElORykgewotICAgICAgICAgICAgaWYgKERCRykgbG9nKCJTdHJhbmdlIHN0YXRlLCBjbG9zaW5nICIgKyBtU3RhdGUgKyAiICIgKyB0aGlzKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAocmVzdWx0ID49IDApIHsKLSAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX0NPTk5FQ1RFRDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX0NMT1NFRDsKLSAgICAgICAgfQotICAgICAgICBtSGFuZGxlci5vYnRhaW5NZXNzYWdlKG1Db25uZWN0ZWRDb2RlLCBtU3RhdGUsIC0xLCB0aGlzKS5zZW5kVG9UYXJnZXQoKTsKLSAgICAgICAgcmVsZWFzZVdha2VMb2NrTm93KCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBvbkFjY2VwdGVkKGludCByZXN1bHQpIHsKLSAgICAgICAgaWYgKFZEQkcpIGxvZygib25BY2NlcHRlZCgpICIgKyB0aGlzKTsKLSAgICAgICAgaWYgKG1TdGF0ZSAhPSBTVEFURV9BQ0NFUFQpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIGxvZygiU3RyYW5nZSBzdGF0ZSAiICsgdGhpcyk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJlc3VsdCA+PSAwKSB7Ci0gICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9DT05ORUNURUQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9DTE9TRUQ7Ci0gICAgICAgIH0KLSAgICAgICAgbUhhbmRsZXIub2J0YWluTWVzc2FnZShtQWNjZXB0ZWRDb2RlLCBtU3RhdGUsIC0xLCB0aGlzKS5zZW5kVG9UYXJnZXQoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIG9uQ2xvc2VkKCkgewotICAgICAgICBpZiAoREJHKSBsb2coIm9uQ2xvc2VkKCkgIiArIHRoaXMpOwotICAgICAgICBpZiAobVN0YXRlICE9IFNUQVRFX0NMT1NFRCkgewotICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfQ0xPU0VEOwotICAgICAgICAgICAgbUhhbmRsZXIub2J0YWluTWVzc2FnZShtQ2xvc2VkQ29kZSwgbVN0YXRlLCAtMSwgdGhpcykuc2VuZFRvVGFyZ2V0KCk7Ci0gICAgICAgICAgICByZWxlYXNlV2FrZUxvY2soKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhY3F1aXJlV2FrZUxvY2soKSB7Ci0gICAgICAgIGlmICghbVdha2VMb2NrLmlzSGVsZCgpKSB7Ci0gICAgICAgICAgICBtV2FrZUxvY2suYWNxdWlyZSgpOwotICAgICAgICAgICAgaWYgKFZEQkcpIGxvZygibVdha2VMb2NrLmFjcXVpcmUoKSAiICsgdGhpcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcmVsZWFzZVdha2VMb2NrKCkgewotICAgICAgICBpZiAobVdha2VMb2NrLmlzSGVsZCgpKSB7Ci0gICAgICAgICAgICAvLyBLZWVwIGFwcHMgcHJvY2Vzc29yIGF3YWtlIGZvciBhIGZ1cnRoZXIgMiBzZWNvbmRzLgotICAgICAgICAgICAgLy8gVGhpcyBpcyBhIGhhY2sgdG8gcmVzb2x2ZSBpc3N1ZSBodHRwOi8vYi8xNjE2MjYzIC0gaW4gd2hpY2gKLSAgICAgICAgICAgIC8vIHdlIGFyZSBsZWZ0IGluIGEgODAgbUEgcG93ZXIgc3RhdGUgd2hlbiByZW1vdGVseSB0ZXJtaW5hdGluZyBhCi0gICAgICAgICAgICAvLyBjYWxsIHdoaWxlIGNvbm5lY3RlZCB0byBCVCBoZWFkc2V0ICJIVEMgQkggUzEwMCAiIHdpdGggQTJEUCBhbmQKLSAgICAgICAgICAgIC8vIEhGUCBwcm9maWxlcy4KLSAgICAgICAgICAgIGlmIChWREJHKSBsb2coIm1XYWtlTG9jay5yZWxlYXNlKCkgaW4gMiBzZWMiICsgdGhpcyk7Ci0gICAgICAgICAgICBtV2FrZUxvY2suYWNxdWlyZSgyMDAwKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCByZWxlYXNlV2FrZUxvY2tOb3coKSB7Ci0gICAgICAgIGlmIChtV2FrZUxvY2suaXNIZWxkKCkpIHsKLSAgICAgICAgICAgIGlmIChWREJHKSBsb2coIm1XYWtlTG9jay5yZWxlYXNlKCkgbm93IiArIHRoaXMpOwotICAgICAgICAgICAgbVdha2VMb2NrLnJlbGVhc2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBsb2coU3RyaW5nIG1zZykgewotICAgICAgICBMb2cuZChUQUcsIG1zZyk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Bc3luY1Rhc2tMb2FkZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQXN5bmNUYXNrTG9hZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjE5YzA3MgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQXN5bmNUYXNrTG9hZGVyLmphdmEKQEAgLTAsMCArMSwxMDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuY29udGVudDsKKworaW1wb3J0IGFuZHJvaWQub3MuQXN5bmNUYXNrOworCisvKioKKyAqIEFic3RyYWN0IExvYWRlciB0aGF0IHByb3ZpZGVzIGFuIHtAbGluayBBc3luY1Rhc2t9IHRvIGRvIHRoZSB3b3JrLgorICoKKyAqIEBwYXJhbSA8RD4gdGhlIGRhdGEgdHlwZSB0byBiZSBsb2FkZWQuCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBc3luY1Rhc2tMb2FkZXI8RD4gZXh0ZW5kcyBMb2FkZXI8RD4geworICAgIGZpbmFsIGNsYXNzIExvYWRUYXNrIGV4dGVuZHMgQXN5bmNUYXNrPFZvaWQsIFZvaWQsIEQ+IHsKKworICAgICAgICBwcml2YXRlIEQgcmVzdWx0OworCisgICAgICAgIC8qIFJ1bnMgb24gYSB3b3JrZXIgdGhyZWFkICovCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgRCBkb0luQmFja2dyb3VuZChWb2lkLi4uIHBhcmFtcykgeworICAgICAgICAgICAgcmVzdWx0ID0gQXN5bmNUYXNrTG9hZGVyLnRoaXMubG9hZEluQmFja2dyb3VuZCgpOworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFJ1bnMgb24gdGhlIFVJIHRocmVhZCAqLworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25Qb3N0RXhlY3V0ZShEIGRhdGEpIHsKKyAgICAgICAgICAgIEFzeW5jVGFza0xvYWRlci50aGlzLmRpc3BhdGNoT25Mb2FkQ29tcGxldGUoZGF0YSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25DYW5jZWxsZWQoKSB7CisgICAgICAgICAgICBBc3luY1Rhc2tMb2FkZXIudGhpcy5vbkNhbmNlbGxlZChyZXN1bHQpOworICAgICAgICB9CisgICAgfQorCisgICAgTG9hZFRhc2sgbVRhc2s7CisKKyAgICBwdWJsaWMgQXN5bmNUYXNrTG9hZGVyKENvbnRleHQgY29udGV4dCkgeworICAgICAgICBzdXBlcihjb250ZXh0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGb3JjZSBhbiBhc3luY2hyb25vdXMgbG9hZC4gVW5saWtlIHtAbGluayAjc3RhcnRMb2FkaW5nKCl9IHRoaXMgd2lsbCBpZ25vcmUgYSBwcmV2aW91c2x5CisgICAgICogbG9hZGVkIGRhdGEgc2V0IGFuZCBsb2FkIGEgbmV3IG9uZS4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBmb3JjZUxvYWQoKSB7CisgICAgICAgIGNhbmNlbExvYWQoKTsKKyAgICAgICAgbVRhc2sgPSBuZXcgTG9hZFRhc2soKTsKKyAgICAgICAgbVRhc2suZXhlY3V0ZSgoVm9pZFtdKSBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBdHRlbXB0IHRvIGNhbmNlbCB0aGUgY3VycmVudCBsb2FkIHRhc2suIFNlZSB7QGxpbmsgQXN5bmNUYXNrI2NhbmNlbChib29sZWFuKX0KKyAgICAgKiBmb3IgbW9yZSBpbmZvLgorICAgICAqCisgICAgICogQHJldHVybiA8dHQ+ZmFsc2U8L3R0PiBpZiB0aGUgdGFzayBjb3VsZCBub3QgYmUgY2FuY2VsZWQsCisgICAgICogICAgICAgICB0eXBpY2FsbHkgYmVjYXVzZSBpdCBoYXMgYWxyZWFkeSBjb21wbGV0ZWQgbm9ybWFsbHksIG9yCisgICAgICogICAgICAgICBiZWNhdXNlIHtAbGluayAjc3RhcnRMb2FkaW5nKCl9IGhhc24ndCBiZWVuIGNhbGxlZCwgYW5kCisgICAgICogICAgICAgICA8dHQ+dHJ1ZTwvdHQ+IG90aGVyd2lzZQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGNhbmNlbExvYWQoKSB7CisgICAgICAgIGlmIChtVGFzayAhPSBudWxsKSB7CisgICAgICAgICAgICBib29sZWFuIGNhbmNlbGxlZCA9IG1UYXNrLmNhbmNlbChmYWxzZSk7CisgICAgICAgICAgICBtVGFzayA9IG51bGw7CisgICAgICAgICAgICByZXR1cm4gY2FuY2VsbGVkOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgaWYgdGhlIHRhc2sgd2FzIGNhbmNlbGVkIGJlZm9yZSBpdCB3YXMgY29tcGxldGVkLiAgR2l2ZXMgdGhlIGNsYXNzIGEgY2hhbmNlCisgICAgICogdG8gcHJvcGVybHkgZGlzcG9zZSBvZiB0aGUgcmVzdWx0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uQ2FuY2VsbGVkKEQgZGF0YSkgeworICAgIH0KKworICAgIHZvaWQgZGlzcGF0Y2hPbkxvYWRDb21wbGV0ZShEIGRhdGEpIHsKKyAgICAgICAgbVRhc2sgPSBudWxsOworICAgICAgICBkZWxpdmVyUmVzdWx0KGRhdGEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxlZCBvbiBhIHdvcmtlciB0aHJlYWQgdG8gcGVyZm9ybSB0aGUgYWN0dWFsIGxvYWQuIEltcGxlbWVudGF0aW9ucyBzaG91bGQgbm90IGRlbGl2ZXIgdGhlCisgICAgICogcmVzdWx0cyBkaXJlY3RseSwgYnV0IHNob3VsZCByZXR1cm4gdGhlbSBmcm9tIHRoaXMgbWV0aG9kLCB3aGljaCB3aWxsIGV2ZW50dWFsbHkgZW5kIHVwCisgICAgICogY2FsbGluZyBkZWxpdmVyUmVzdWx0IG9uIHRoZSBVSSB0aHJlYWQuIElmIGltcGxlbWVudGF0aW9ucyBuZWVkIHRvIHByb2Nlc3MKKyAgICAgKiB0aGUgcmVzdWx0cyBvbiB0aGUgVUkgdGhyZWFkIHRoZXkgbWF5IG92ZXJyaWRlIGRlbGl2ZXJSZXN1bHQgYW5kIGRvIHNvCisgICAgICogdGhlcmUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgdGhlIGxvYWQKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgRCBsb2FkSW5CYWNrZ3JvdW5kKCk7Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NsaXBib2FyZE1hbmFnZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ2xpcGJvYXJkTWFuYWdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2ODVjZjMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NsaXBib2FyZE1hbmFnZXIuamF2YQpAQCAtMCwwICsxLDIwMSBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuY29udGVudDsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOworaW1wb3J0IGFuZHJvaWQub3MuU2VydmljZU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKKy8qKgorICogSW50ZXJmYWNlIHRvIHRoZSBjbGlwYm9hcmQgc2VydmljZSwgZm9yIHBsYWNpbmcgYW5kIHJldHJpZXZpbmcgdGV4dCBpbgorICogdGhlIGdsb2JhbCBjbGlwYm9hcmQuCisgKgorICogPHA+CisgKiBZb3UgZG8gbm90IGluc3RhbnRpYXRlIHRoaXMgY2xhc3MgZGlyZWN0bHk7IGluc3RlYWQsIHJldHJpZXZlIGl0IHRocm91Z2gKKyAqIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCNnZXRTeXN0ZW1TZXJ2aWNlfS4KKyAqCisgKiA8cD4KKyAqIFRoZSBDbGlwYm9hcmRNYW5hZ2VyIEFQSSBpdHNlbGYgaXMgdmVyeSBzaW1wbGU6IGl0IGNvbnNpc3RzIG9mIG1ldGhvZHMKKyAqIHRvIGF0b21pY2FsbHkgZ2V0IGFuZCBzZXQgdGhlIGN1cnJlbnQgcHJpbWFyeSBjbGlwYm9hcmQgZGF0YS4gIFRoYXQgZGF0YQorICogaXMgZXhwcmVzc2VkIGFzIGEge0BsaW5rIENsaXBwZWREYXRhfSBvYmplY3QsIHdoaWNoIGRlZmluZXMgdGhlIHByb3RvY29sCisgKiBmb3IgZGF0YSBleGNoYW5nZSBiZXR3ZWVuIGFwcGxpY2F0aW9ucy4KKyAqCisgKiBAc2VlIGFuZHJvaWQuY29udGVudC5Db250ZXh0I2dldFN5c3RlbVNlcnZpY2UKKyAqLworcHVibGljIGNsYXNzIENsaXBib2FyZE1hbmFnZXIgZXh0ZW5kcyBhbmRyb2lkLnRleHQuQ2xpcGJvYXJkTWFuYWdlciB7CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgT2JqZWN0IHNTdGF0aWNMb2NrID0gbmV3IE9iamVjdCgpOworICAgIHByaXZhdGUgc3RhdGljIElDbGlwYm9hcmQgc1NlcnZpY2U7CisKKyAgICBwcml2YXRlIGZpbmFsIENvbnRleHQgbUNvbnRleHQ7CisKKyAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxPblByaW1hcnlDbGlwQ2hhbmdlZExpc3RlbmVyPiBtUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXJzCisgICAgICAgICAgICAgPSBuZXcgQXJyYXlMaXN0PE9uUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXI+KCk7CisKKyAgICBwcml2YXRlIGZpbmFsIElPblByaW1hcnlDbGlwQ2hhbmdlZExpc3RlbmVyLlN0dWIgbVByaW1hcnlDbGlwQ2hhbmdlZFNlcnZpY2VMaXN0ZW5lcgorICAgICAgICAgICAgPSBuZXcgSU9uUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXIuU3R1YigpIHsKKyAgICAgICAgcHVibGljIHZvaWQgZGlzcGF0Y2hQcmltYXJ5Q2xpcENoYW5nZWQoKSB7CisgICAgICAgICAgICBtSGFuZGxlci5zZW5kRW1wdHlNZXNzYWdlKE1TR19SRVBPUlRfUFJJTUFSWV9DTElQX0NIQU5HRUQpOworICAgICAgICB9CisgICAgfTsKKworICAgIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1JFUE9SVF9QUklNQVJZX0NMSVBfQ0hBTkdFRCA9IDE7CisKKyAgICBwcml2YXRlIGZpbmFsIEhhbmRsZXIgbUhhbmRsZXIgPSBuZXcgSGFuZGxlcigpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKKyAgICAgICAgICAgIHN3aXRjaCAobXNnLndoYXQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19SRVBPUlRfUFJJTUFSWV9DTElQX0NIQU5HRUQ6CisgICAgICAgICAgICAgICAgICAgIHJlcG9ydFByaW1hcnlDbGlwQ2hhbmdlZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsKKworICAgIHB1YmxpYyBpbnRlcmZhY2UgT25QcmltYXJ5Q2xpcENoYW5nZWRMaXN0ZW5lciB7CisgICAgICAgIHZvaWQgb25QcmltYXJ5Q2xpcENoYW5nZWQoKTsKKyAgICB9CisKKyAgICBzdGF0aWMgcHJpdmF0ZSBJQ2xpcGJvYXJkIGdldFNlcnZpY2UoKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAoc1N0YXRpY0xvY2spIHsKKyAgICAgICAgICAgIGlmIChzU2VydmljZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHNTZXJ2aWNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgSUJpbmRlciBiID0gU2VydmljZU1hbmFnZXIuZ2V0U2VydmljZSgiY2xpcGJvYXJkIik7CisgICAgICAgICAgICBzU2VydmljZSA9IElDbGlwYm9hcmQuU3R1Yi5hc0ludGVyZmFjZShiKTsKKyAgICAgICAgICAgIHJldHVybiBzU2VydmljZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKiB7QGhpZGV9ICovCisgICAgcHVibGljIENsaXBib2FyZE1hbmFnZXIoQ29udGV4dCBjb250ZXh0LCBIYW5kbGVyIGhhbmRsZXIpIHsKKyAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGN1cnJlbnQgcHJpbWFyeSBjbGlwIG9uIHRoZSBjbGlwYm9hcmQuICBUaGlzIGlzIHRoZSBjbGlwIHRoYXQKKyAgICAgKiBpcyBpbnZvbHZlZCBpbiBub3JtYWwgY3V0IGFuZCBwYXN0ZSBvcGVyYXRpb25zLgorICAgICAqCisgICAgICogQHBhcmFtIGNsaXAgVGhlIGNsaXBwZWQgZGF0YSBpdGVtIHRvIHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQcmltYXJ5Q2xpcChDbGlwcGVkRGF0YSBjbGlwKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBnZXRTZXJ2aWNlKCkuc2V0UHJpbWFyeUNsaXAoY2xpcCk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHByaW1hcnkgY2xpcCBvbiB0aGUgY2xpcGJvYXJkLgorICAgICAqLworICAgIHB1YmxpYyBDbGlwcGVkRGF0YSBnZXRQcmltYXJ5Q2xpcCgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBnZXRTZXJ2aWNlKCkuZ2V0UHJpbWFyeUNsaXAoKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZXJlIGlzIGN1cnJlbnRseSBhIHByaW1hcnkgY2xpcCBvbiB0aGUgY2xpcGJvYXJkLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGhhc1ByaW1hcnlDbGlwKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIGdldFNlcnZpY2UoKS5oYXNQcmltYXJ5Q2xpcCgpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXIoT25QcmltYXJ5Q2xpcENoYW5nZWRMaXN0ZW5lciB3aGF0KSB7CisgICAgICAgIHN5bmNocm9uaXplZCAobVByaW1hcnlDbGlwQ2hhbmdlZExpc3RlbmVycykgeworICAgICAgICAgICAgaWYgKG1QcmltYXJ5Q2xpcENoYW5nZWRMaXN0ZW5lcnMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBnZXRTZXJ2aWNlKCkuYWRkUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVByaW1hcnlDbGlwQ2hhbmdlZFNlcnZpY2VMaXN0ZW5lcik7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXJzLmFkZCh3aGF0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlbW92ZVByaW1hcnlDbGlwQ2hhbmdlZExpc3RlbmVyKE9uUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXIgd2hhdCkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKG1QcmltYXJ5Q2xpcENoYW5nZWRMaXN0ZW5lcnMpIHsKKyAgICAgICAgICAgIG1QcmltYXJ5Q2xpcENoYW5nZWRMaXN0ZW5lcnMucmVtb3ZlKHdoYXQpOworICAgICAgICAgICAgaWYgKG1QcmltYXJ5Q2xpcENoYW5nZWRMaXN0ZW5lcnMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBnZXRTZXJ2aWNlKCkucmVtb3ZlUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVByaW1hcnlDbGlwQ2hhbmdlZFNlcnZpY2VMaXN0ZW5lcik7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rICNnZXRQcmltYXJ5Q2xpcCgpfSBpbnN0ZWFkLiAgVGhpcyByZXRyaWV2ZXMKKyAgICAgKiB0aGUgcHJpbWFyeSBjbGlwIGFuZCB0cmllcyB0byBjb2VyY2UgaXQgdG8gYSBzdHJpbmcuCisgICAgICovCisgICAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXRUZXh0KCkgeworICAgICAgICBDbGlwcGVkRGF0YSBjbGlwID0gZ2V0UHJpbWFyeUNsaXAoKTsKKyAgICAgICAgaWYgKGNsaXAgIT0gbnVsbCAmJiBjbGlwLmdldEl0ZW1Db3VudCgpID4gMCkgeworICAgICAgICAgICAgcmV0dXJuIGNsaXAuZ2V0SXRlbSgwKS5jb2VyY2VUb1RleHQobUNvbnRleHQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgI3NldFByaW1hcnlDbGlwKENsaXBwZWREYXRhKX0gaW5zdGVhZC4gIFRoaXMKKyAgICAgKiBjcmVhdGVzIGEgQ2xpcHBlZEl0ZW0gaG9sZGluZyB0aGUgZ2l2ZW4gdGV4dCBhbmQgc2V0cyBpdCBhcyB0aGUKKyAgICAgKiBwcmltYXJ5IGNsaXAuICBJdCBoYXMgbm8gbGFiZWwgb3IgaWNvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUZXh0KENoYXJTZXF1ZW5jZSB0ZXh0KSB7CisgICAgICAgIHNldFByaW1hcnlDbGlwKG5ldyBDbGlwcGVkRGF0YShudWxsLCBudWxsLCBuZXcgQ2xpcHBlZERhdGEuSXRlbSh0ZXh0KSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgI2hhc1ByaW1hcnlDbGlwKCl9IGluc3RlYWQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaGFzVGV4dCgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBnZXRTZXJ2aWNlKCkuaGFzUHJpbWFyeUNsaXAoKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgcmVwb3J0UHJpbWFyeUNsaXBDaGFuZ2VkKCkgeworICAgICAgICBPYmplY3RbXSBsaXN0ZW5lcnM7CisKKyAgICAgICAgc3luY2hyb25pemVkIChtUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXJzKSB7CisgICAgICAgICAgICBmaW5hbCBpbnQgTiA9IG1QcmltYXJ5Q2xpcENoYW5nZWRMaXN0ZW5lcnMuc2l6ZSgpOworICAgICAgICAgICAgaWYgKE4gPD0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxpc3RlbmVycyA9IG1QcmltYXJ5Q2xpcENoYW5nZWRMaXN0ZW5lcnMudG9BcnJheSgpOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpPGxpc3RlbmVycy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgKChPblByaW1hcnlDbGlwQ2hhbmdlZExpc3RlbmVyKWxpc3RlbmVyc1tpXSkub25QcmltYXJ5Q2xpcENoYW5nZWQoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ2xpcHBlZERhdGEuYWlkbCBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ2xpcHBlZERhdGEuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjQ2NTI2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9DbGlwcGVkRGF0YS5haWRsCkBAIC0wLDAgKzEsMTkgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmNvbnRlbnQ7CisKK3BhcmNlbGFibGUgQ2xpcHBlZERhdGE7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NsaXBwZWREYXRhLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NsaXBwZWREYXRhLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNmMDIzNwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ2xpcHBlZERhdGEuamF2YQpAQCAtMCwwICsxLDM5MCBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuY29udGVudDsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQXNzZXRGaWxlRGVzY3JpcHRvcjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxhYmxlOworaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCisvKioKKyAqIFJlcHJlc2VudGF0aW9uIG9mIGEgY2xpcHBlZCBkYXRhIG9uIHRoZSBjbGlwYm9hcmQuCisgKgorICogPHA+Q2xpcHBlZERhdGEgaXMgYSBjb21wbGV4IHR5cGUgY29udGFpbmluZyBvbmUgb3IgSXRlbSBpbnN0YW5jZXMsCisgKiBlYWNoIG9mIHdoaWNoIGNhbiBob2xkIG9uZSBvciBtb3JlIHJlcHJlc2VudGF0aW9ucyBvZiBhbiBpdGVtIG9mIGRhdGEuCisgKiBGb3IgZGlzcGxheSB0byB0aGUgdXNlciwgaXQgYWxzbyBoYXMgYSBsYWJlbCBhbmQgaWNvbmljIHJlcHJlc2VudGF0aW9uLjwvcD4KKyAqCisgKiA8cD5FYWNoIEl0ZW0gaW5zdGFuY2UgY2FuIGJlIG9uZSBvZiB0aHJlZSBtYWluIGNsYXNzZXMgb2YgZGF0YTogYSBzaW1wbGUKKyAqIENoYXJTZXF1ZW5jZSBvZiB0ZXh0LCBhIHNpbmdsZSBJbnRlbnQgb2JqZWN0LCBvciBhIFVyaS4gIFNlZSB7QGxpbmsgSXRlbX0KKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogPGEgbmFtZT0iSW1wbGVtZW50aW5nUGFzdGUiPjwvYT4KKyAqIDxoMz5JbXBsZW1lbnRpbmcgUGFzdGUgb3IgRHJvcDwvaDM+CisgKgorICogPHA+VG8gaW1wbGVtZW50IGEgcGFzdGUgb3IgZHJvcCBvZiBhIENsaXBwZWREYXRhIG9iamVjdCBpbnRvIGFuIGFwcGxpY2F0aW9uLAorICogdGhlIGFwcGxpY2F0aW9uIG11c3QgY29ycmVjdGx5IGludGVycHJldCB0aGUgZGF0YSBmb3IgaXRzIHVzZS4gIElmIHRoZSB7QGxpbmsgSXRlbX0KKyAqIGl0IGNvbnRhaW5zIGlzIHNpbXBsZSB0ZXh0IG9yIGFuIEludGVudCwgdGhlcmUgaXMgbGl0dGxlIHRvIGJlIGRvbmU6IHRleHQKKyAqIGNhbiBvbmx5IGJlIGludGVycHJldGVkIGFzIHRleHQsIGFuZCBhbiBJbnRlbnQgd2lsbCB0eXBpY2FsbHkgYmUgdXNlZCBmb3IKKyAqIGNyZWF0aW5nIHNob3J0Y3V0cyAoc3VjaCBhcyBwbGFjaW5nIGljb25zIG9uIHRoZSBob21lIHNjcmVlbikgb3Igb3RoZXIKKyAqIGFjdGlvbnMuCisgKgorICogPHA+SWYgYWxsIHlvdSB3YW50IGlzIHRoZSB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjbGlwcGVkIGRhdGEsIHlvdQorICogY2FuIHVzZSB0aGUgY29udmVuaWVuY2UgbWV0aG9kIHtAbGluayBJdGVtI2NvZXJjZVRvVGV4dCBJdGVtLmNvZXJjZVRvVGV4dH0uCisgKgorICogPHA+TW9yZSBjb21wbGljYXRlZCBleGNoYW5nZXMgd2lsbCBiZSBkb25lIHRocm91Z2ggVVJJcywgaW4gcGFydGljdWxhcgorICogImNvbnRlbnQ6IiBVUklzLiAgQSBjb250ZW50IFVSSSBhbGxvd3MgdGhlIHJlY2lwaWVudCBvZiBhIENsaXBwZWREYXRhIGl0ZW0KKyAqIHRvIGludGVyYWN0IGNsb3NlbHkgd2l0aCB0aGUgQ29udGVudFByb3ZpZGVyIGhvbGRpbmcgdGhlIGRhdGEgaW4gb3JkZXIgdG8KKyAqIG5lZ290aWF0ZSB0aGUgdHJhbnNmZXIgb2YgdGhhdCBkYXRhLgorICoKKyAqIDxwPkZvciBleGFtcGxlLCBoZXJlIGlzIHRoZSBwYXN0ZSBmdW5jdGlvbiBvZiBhIHNpbXBsZSBOb3RlUGFkIGFwcGxpY2F0aW9uLgorICogV2hlbiByZXRyaWV2aW5nIHRoZSBkYXRhIGZyb20gdGhlIGNsaXBib2FyZCwgaXQgY2FuIGRvIGVpdGhlciB0d28gdGhpbmdzOgorICogaWYgdGhlIGNsaXBib2FyZCBjb250YWlucyBhIFVSSSByZWZlcmVuY2UgdG8gYW4gZXhpc3Rpbmcgbm90ZSwgaXQgY29waWVzCisgKiB0aGUgZW50aXJlIHN0cnVjdHVyZSBvZiB0aGUgbm90ZSBpbnRvIGEgbmV3IG5vdGU7IG90aGVyd2lzZSwgaXQgc2ltcGx5CisgKiBjb2VyY2VzIHRoZSBjbGlwIGludG8gdGV4dCBhbmQgdXNlcyB0aGF0IGFzIHRoZSBuZXcgbm90ZSdzIGNvbnRlbnRzLgorICoKKyAqIHtAc2FtcGxlIGRldmVsb3BtZW50L3NhbXBsZXMvTm90ZVBhZC9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9ub3RlcGFkL05vdGVFZGl0b3IuamF2YQorICogICAgICBwYXN0ZX0KKyAqCisgKiA8cD5JbiBtYW55IGNhc2VzIGFuIGFwcGxpY2F0aW9uIGNhbiBwYXN0ZSB2YXJpb3VzIHR5cGVzIG9mIHN0cmVhbXMgb2YgZGF0YS4gIEZvcgorICogZXhhbXBsZSwgYW4gZS1tYWlsIGFwcGxpY2F0aW9uIG1heSB3YW50IHRvIGFsbG93IHRoZSB1c2VyIHRvIHBhc3RlIGFuIGltYWdlCisgKiBvciBvdGhlciBiaW5hcnkgZGF0YSBhcyBhbiBhdHRhY2htZW50LiAgVGhpcyBpcyBhY2NvbXBsaXNoZWQgdGhyb3VnaCB0aGUKKyAqIENvbnRlbnRSZXNvbHZlciB7QGxpbmsgQ29udGVudFJlc29sdmVyI2dldFN0cmVhbVR5cGVzKFVyaSwgU3RyaW5nKX0gYW5kCisgKiB7QGxpbmsgQ29udGVudFJlc29sdmVyI29wZW5UeXBlZEFzc2V0RmlsZURlc2NyaXB0b3IoVXJpLCBTdHJpbmcsIGFuZHJvaWQub3MuQnVuZGxlKX0KKyAqIG1ldGhvZHMuICBUaGVzZSBhbGxvdyBhIGNsaWVudCB0byBkaXNjb3ZlciB0aGUgdHlwZShzKSBvZiBkYXRhIHRoYXQgYSBwYXJ0aWN1bGFyCisgKiBjb250ZW50IFVSSSBjYW4gbWFrZSBhdmFpbGFibGUgYXMgYSBzdHJlYW0gYW5kIHJldHJpZXZlIHRoZSBzdHJlYW0gb2YgZGF0YS4KKyAqCisgKiA8cD5Gb3IgZXhhbXBsZSwgdGhlIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBJdGVtI2NvZXJjZVRvVGV4dCBJdGVtLmNvZXJjZVRvVGV4dH0KKyAqIGl0c2VsZiB1c2VzIHRoaXMgdG8gdHJ5IHRvIHJldHJpZXZlIGEgVVJJIGNsaXAgYXMgYSBzdHJlYW0gb2YgdGV4dDoKKyAqCisgKiB7QHNhbXBsZSBmcmFtZXdvcmtzL2Jhc2UvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9DbGlwcGVkRGF0YS5qYXZhIGNvZXJjZVRvVGV4dH0KKyAqCisgKiA8YSBuYW1lPSJJbXBsZW1lbnRpbmdDb3B5Ij48L2E+CisgKiA8aDM+SW1wbGVtZW50aW5nIENvcHkgb3IgRHJhZzwvaDM+CisgKgorICogPHA+VG8gYmUgdGhlIHNvdXJjZSBvZiBhIGNsaXAsIHRoZSBhcHBsaWNhdGlvbiBtdXN0IGNvbnN0cnVjdCBhIENsaXBwZWREYXRhCisgKiBvYmplY3QgdGhhdCBhbnkgcmVjaXBpZW50IGNhbiBpbnRlcnByZXQgYmVzdCBmb3IgdGhlaXIgY29udGV4dC4gIElmIHRoZSBjbGlwCisgKiBpcyB0byBjb250YWluIGEgc2ltcGxlIHRleHQsIEludGVudCwgb3IgVVJJLCB0aGlzIGlzIGVhc3k6IGFuIHtAbGluayBJdGVtfQorICogY29udGFpbmluZyB0aGUgYXBwcm9wcmlhdGUgZGF0YSB0eXBlIGNhbiBiZSBjb25zdHJ1Y3RlZCBhbmQgdXNlZC4KKyAqCisgKiA8cD5Nb3JlIGNvbXBsaWNhdGVkIGRhdGEgdHlwZXMgcmVxdWlyZSB0aGUgaW1wbGVtZW50YXRpb24gb2Ygc3VwcG9ydCBpbgorICogYSBDb250ZW50UHJvdmlkZXIgZm9yIGRlc2NyaWJpbmcgYW5kIGdlbmVyYXRpbmcgdGhlIGRhdGEgZm9yIHRoZSByZWNpcGllbnQuCisgKiBBIGNvbW1vbiBzY2VuYXJpbyBpcyBvbmUgd2hlcmUgYW4gYXBwbGljYXRpb24gcGxhY2VzIG9uIHRoZSBjbGlwYm9hcmQgdGhlCisgKiBjb250ZW50OiBVUkkgb2YgYW4gb2JqZWN0IHRoYXQgdGhlIHVzZXIgaGFzIGNvcGllZCwgd2l0aCB0aGUgZGF0YSBhdCB0aGF0CisgKiBVUkkgY29uc2lzdGluZyBvZiBhIGNvbXBsaWNhdGVkIHN0cnVjdHVyZSB0aGF0IG9ubHkgb3RoZXIgYXBwbGljYXRpb25zIHdpdGgKKyAqIGRpcmVjdCBrbm93bGVkZ2Ugb2YgdGhlIHN0cnVjdHVyZSBjYW4gdXNlLgorICoKKyAqIDxwPkZvciBhcHBsaWNhdGlvbnMgdGhhdCBkbyBub3QgaGF2ZSBpbnRyaW5zaWMga25vd2xlZGdlIG9mIHRoZSBkYXRhIHN0cnVjdHVyZSwKKyAqIHRoZSBjb250ZW50IHByb3ZpZGVyIGhvbGRpbmcgaXQgY2FuIG1ha2UgdGhlIGRhdGEgYXZhaWxhYmxlIGFzIGFuIGFyYml0cmFyeQorICogbnVtYmVyIG9mIHR5cGVzIG9mIGRhdGEgc3RyZWFtcy4gIFRoaXMgaXMgZG9uZSBieSBpbXBsZW1lbnRpbmcgdGhlCisgKiBDb250ZW50UHJvdmlkZXIge0BsaW5rIENvbnRlbnRQcm92aWRlciNnZXRTdHJlYW1UeXBlcyhVcmksIFN0cmluZyl9IGFuZAorICoge0BsaW5rIENvbnRlbnRQcm92aWRlciNvcGVuVHlwZWRBc3NldEZpbGUoVXJpLCBTdHJpbmcsIGFuZHJvaWQub3MuQnVuZGxlKX0KKyAqIG1ldGhvZHMuCisgKgorICogPHA+R29pbmcgYmFjayB0byBvdXIgc2ltcGxlIE5vdGVQYWQgYXBwbGljYXRpb24sIHRoaXMgaXMgdGhlIGltcGxlbWVudGF0aW9uCisgKiBpdCBtYXkgaGF2ZSB0byBjb252ZXJ0IGEgc2luZ2xlIG5vdGUgVVJJIChjb25zaXN0aW5nIG9mIGEgdGl0bGUgYW5kIHRoZSBub3RlCisgKiB0ZXh0KSBpbnRvIGEgc3RyZWFtIG9mIHBsYWluIHRleHQgZGF0YS4KKyAqCisgKiB7QHNhbXBsZSBkZXZlbG9wbWVudC9zYW1wbGVzL05vdGVQYWQvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvbm90ZXBhZC9Ob3RlUGFkUHJvdmlkZXIuamF2YQorICogICAgICBzdHJlYW19CisgKgorICogPHA+VGhlIGNvcHkgb3BlcmF0aW9uIGluIG91ciBOb3RlUGFkIGFwcGxpY2F0aW9uIGlzIG5vdyBqdXN0IGEgc2ltcGxlIG1hdHRlcgorICogb2YgbWFraW5nIGEgY2xpcCBjb250YWluaW5nIHRoZSBVUkkgb2YgdGhlIG5vdGUgYmVpbmcgY29waWVkOgorICoKKyAqIHtAc2FtcGxlIGRldmVsb3BtZW50L3NhbXBsZXMvTm90ZVBhZC9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9ub3RlcGFkL05vdGVzTGlzdC5qYXZhCisgKiAgICAgIGNvcHl9CisgKgorICogPHA+Tm90ZSBpZiBhIHBhc3RlIG9wZXJhdGlvbiBuZWVkcyB0aGlzIGNsaXAgYXMgdGV4dCAoZm9yIGV4YW1wbGUgdG8gcGFzdGUKKyAqIGludG8gYW4gZWRpdG9yKSwgdGhlbiB7QGxpbmsgSXRlbSNjb2VyY2VUb1RleHQoQ29udGV4dCl9IHdpbGwgYXNrIHRoZSBjb250ZW50CisgKiBwcm92aWRlciBmb3IgdGhlIGNsaXAgVVJJIGFzIHRleHQgYW5kIHN1Y2Nlc3NmdWxseSBwYXN0ZSB0aGUgZW50aXJlIG5vdGUuCisgKi8KK3B1YmxpYyBjbGFzcyBDbGlwcGVkRGF0YSBpbXBsZW1lbnRzIFBhcmNlbGFibGUgeworICAgIENoYXJTZXF1ZW5jZSBtTGFiZWw7CisgICAgQml0bWFwIG1JY29uOworCisgICAgZmluYWwgQXJyYXlMaXN0PEl0ZW0+IG1JdGVtcyA9IG5ldyBBcnJheUxpc3Q8SXRlbT4oKTsKKworICAgIC8qKgorICAgICAqIERlc2NyaXB0aW9uIG9mIGEgc2luZ2xlIGl0ZW0gaW4gYSBDbGlwcGVkRGF0YS4KKyAgICAgKgorICAgICAqIDxwPlRoZSB0eXBlcyB0aGFuIGFuIGluZGl2aWR1YWwgaXRlbSBjYW4gY3VycmVudGx5IGNvbnRhaW4gYXJlOjwvcD4KKyAgICAgKgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+IFRleHQ6IGEgYmFzaWMgc3RyaW5nIG9mIHRleHQuICBUaGlzIGlzIGFjdHVhbGx5IGEgQ2hhclNlcXVlbmNlLAorICAgICAqIHNvIGl0IGNhbiBiZSBmb3JtYXR0ZWQgdGV4dCBzdXBwb3J0ZWQgYnkgY29ycmVzcG9uZGluZyBBbmRyb2lkIGJ1aWx0LWluCisgICAgICogc3R5bGUgc3BhbnMuICAoQ3VzdG9tIGFwcGxpY2F0aW9uIHNwYW5zIGFyZSBub3Qgc3VwcG9ydGVkIGFuZCB3aWxsIGJlCisgICAgICogc3RyaXBwZWQgd2hlbiB0cmFuc3BvcnRpbmcgdGhyb3VnaCB0aGUgY2xpcGJvYXJkLikKKyAgICAgKiA8bGk+IEludGVudDogYW4gYXJiaXRyYXJ5IEludGVudCBvYmplY3QuICBBIHR5cGljYWwgdXNlIGlzIHRoZSBzaG9ydGN1dAorICAgICAqIHRvIGNyZWF0ZSB3aGVuIHBhc3RpbmcgYSBjbGlwcGVkIGl0ZW0gb24gdG8gdGhlIGhvbWUgc2NyZWVuLgorICAgICAqIDxsaT4gVXJpOiBhIFVSSSByZWZlcmVuY2UuICBUaGlzIG1heSBiZSBhbnkgVVJJIChzdWNoIGFzIGFuIGh0dHA6IFVSSQorICAgICAqIHJlcHJlc2VudGluZyBhIGJvb2ttYXJrKSwgaG93ZXZlciBpdCBpcyBvZnRlbiBhIGNvbnRlbnQ6IFVSSS4gIFVzaW5nCisgICAgICogY29udGVudCBwcm92aWRlciByZWZlcmVuY2VzIGFzIGNsaXBzIGxpa2UgdGhpcyBhbGxvd3MgYW4gYXBwbGljYXRpb24gdG8KKyAgICAgKiBzaGFyZSBjb21wbGV4IG9yIGxhcmdlIGNsaXBzIHRocm91Z2ggdGhlIHN0YW5kYXJkIGNvbnRlbnQgcHJvdmlkZXIKKyAgICAgKiBmYWNpbGl0aWVzLgorICAgICAqIDwvdWw+CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBJdGVtIHsKKyAgICAgICAgQ2hhclNlcXVlbmNlIG1UZXh0OworICAgICAgICBJbnRlbnQgbUludGVudDsKKyAgICAgICAgVXJpIG1Vcmk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZSBhbiBJdGVtIGNvbnNpc3Rpbmcgb2YgYSBzaW5nbGUgYmxvY2sgb2YgKHBvc3NpYmx5IHN0eWxlZCkgdGV4dC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBJdGVtKENoYXJTZXF1ZW5jZSB0ZXh0KSB7CisgICAgICAgICAgICBtVGV4dCA9IHRleHQ7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlIGFuIEl0ZW0gY29uc2lzdGluZyBvZiBhbiBhcmJpdHJhcnkgSW50ZW50LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEl0ZW0oSW50ZW50IGludGVudCkgeworICAgICAgICAgICAgbUludGVudCA9IGludGVudDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGUgYW4gSXRlbSBjb25zaXN0aW5nIG9mIGFuIGFyYml0cmFyeSBVUkkuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgSXRlbShVcmkgdXJpKSB7CisgICAgICAgICAgICBtVXJpID0gdXJpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZSBhIGNvbXBsZXggSXRlbSwgY29udGFpbmluZyBtdWx0aXBsZSByZXByZXNlbnRhdGlvbnMgb2YKKyAgICAgICAgICogdGV4dCwgaW50ZW50LCBhbmQvb3IgVVJJLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEl0ZW0oQ2hhclNlcXVlbmNlIHRleHQsIEludGVudCBpbnRlbnQsIFVyaSB1cmkpIHsKKyAgICAgICAgICAgIG1UZXh0ID0gdGV4dDsKKyAgICAgICAgICAgIG1JbnRlbnQgPSBpbnRlbnQ7CisgICAgICAgICAgICBtVXJpID0gdXJpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHJpZXZlIHRoZSByYXcgdGV4dCBjb250YWluZWQgaW4gdGhpcyBJdGVtLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXRUZXh0KCkgeworICAgICAgICAgICAgcmV0dXJuIG1UZXh0OworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHJpZXZlIHRoZSByYXcgSW50ZW50IGNvbnRhaW5lZCBpbiB0aGlzIEl0ZW0uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgSW50ZW50IGdldEludGVudCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtSW50ZW50OworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHJpZXZlIHRoZSByYXcgVVJJIGNvbnRhaW5lZCBpbiB0aGlzIEl0ZW0uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgVXJpIGdldFVyaSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtVXJpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFR1cm4gdGhpcyBpdGVtIGludG8gdGV4dCwgcmVnYXJkbGVzcyBvZiB0aGUgdHlwZSBvZiBkYXRhIGl0CisgICAgICAgICAqIGFjdHVhbGx5IGNvbnRhaW5zLgorICAgICAgICAgKgorICAgICAgICAgKiA8cD5UaGUgYWxnb3JpdGhtIGZvciBkZWNpZGluZyB3aGF0IHRleHQgdG8gcmV0dXJuIGlzOgorICAgICAgICAgKiA8dWw+CisgICAgICAgICAqIDxsaT4gSWYge0BsaW5rICNnZXRUZXh0fSBpcyBub24tbnVsbCwgcmV0dXJuIHRoYXQuCisgICAgICAgICAqIDxsaT4gSWYge0BsaW5rICNnZXRVcml9IGlzIG5vbi1udWxsLCB0cnkgdG8gcmV0cmlldmUgaXRzIGRhdGEKKyAgICAgICAgICogYXMgYSB0ZXh0IHN0cmVhbSBmcm9tIGl0cyBjb250ZW50IHByb3ZpZGVyLiAgSWYgdGhpcyBzdWNjZWVkcywgY29weQorICAgICAgICAgKiB0aGUgdGV4dCBpbnRvIGEgU3RyaW5nIGFuZCByZXR1cm4gaXQuICBJZiBpdCBpcyBub3QgYSBjb250ZW50OiBVUkkgb3IKKyAgICAgICAgICogdGhlIGNvbnRlbnQgcHJvdmlkZXIgZG9lcyBub3Qgc3VwcGx5IGEgdGV4dCByZXByZXNlbnRhdGlvbiwgcmV0dXJuCisgICAgICAgICAqIHRoZSByYXcgVVJJIGFzIGEgc3RyaW5nLgorICAgICAgICAgKiA8bGk+IElmIHtAbGluayAjZ2V0SW50ZW50fSBpcyBub24tbnVsbCwgY29udmVydCB0aGF0IHRvIGFuIGludGVudDoKKyAgICAgICAgICogVVJJIGFuZCByZXR1cm5pdC4KKyAgICAgICAgICogPGxpPiBPdGhlcndpc2UsIHJldHVybiBhbiBlbXB0eSBzdHJpbmcuCisgICAgICAgICAqIDwvdWw+CisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjYWxsZXIncyBDb250ZXh0LCBmcm9tIHdoaWNoIGl0cyBDb250ZW50UmVzb2x2ZXIKKyAgICAgICAgICogYW5kIG90aGVyIHRoaW5ncyBjYW4gYmUgcmV0cmlldmVkLgorICAgICAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGl0ZW0ncyB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uLgorICAgICAgICAgKi8KKy8vQkVHSU5fSU5DTFVERShjb2VyY2VUb1RleHQpCisgICAgICAgIHB1YmxpYyBDaGFyU2VxdWVuY2UgY29lcmNlVG9UZXh0KENvbnRleHQgY29udGV4dCkgeworICAgICAgICAgICAgLy8gSWYgdGhpcyBJdGVtIGhhcyBhbiBleHBsaWNpdCB0ZXh0dWFsIHZhbHVlLCBzaW1wbHkgcmV0dXJuIHRoYXQuCisgICAgICAgICAgICBpZiAobVRleHQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBtVGV4dDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gSWYgdGhpcyBJdGVtIGhhcyBhIFVSSSB2YWx1ZSwgdHJ5IHVzaW5nIHRoYXQuCisgICAgICAgICAgICBpZiAobVVyaSAhPSBudWxsKSB7CisKKyAgICAgICAgICAgICAgICAvLyBGaXJzdCBzZWUgaWYgdGhlIFVSSSBjYW4gYmUgb3BlbmVkIGFzIGEgcGxhaW4gdGV4dCBzdHJlYW0KKyAgICAgICAgICAgICAgICAvLyAob2YgYW55IHN1Yi10eXBlKS4gIElmIHNvLCB0aGlzIGlzIHRoZSBiZXN0IHRleHR1YWwKKyAgICAgICAgICAgICAgICAvLyByZXByZXNlbnRhdGlvbiBmb3IgaXQuCisgICAgICAgICAgICAgICAgRmlsZUlucHV0U3RyZWFtIHN0cmVhbSA9IG51bGw7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgLy8gQXNrIGZvciBhIHN0cmVhbSBvZiB0aGUgZGVzaXJlZCB0eXBlLgorICAgICAgICAgICAgICAgICAgICBBc3NldEZpbGVEZXNjcmlwdG9yIGRlc2NyID0gY29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5vcGVuVHlwZWRBc3NldEZpbGVEZXNjcmlwdG9yKG1VcmksICJ0ZXh0LyoiLCBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtID0gZGVzY3IuY3JlYXRlSW5wdXRTdHJlYW0oKTsKKyAgICAgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW1SZWFkZXIgcmVhZGVyID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKHN0cmVhbSwgIlVURi04Iik7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gR290IGl0Li4uICBjb3B5IHRoZSBzdHJlYW0gaW50byBhIGxvY2FsIHN0cmluZyBhbmQgcmV0dXJuIGl0LgorICAgICAgICAgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigxMjgpOworICAgICAgICAgICAgICAgICAgICBjaGFyW10gYnVmZmVyID0gbmV3IGNoYXJbODE5Ml07CisgICAgICAgICAgICAgICAgICAgIGludCBsZW47CisgICAgICAgICAgICAgICAgICAgIHdoaWxlICgobGVuPXJlYWRlci5yZWFkKGJ1ZmZlcikpID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoYnVmZmVyLCAwLCBsZW4pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7CisKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAvLyBVbmFibGUgdG8gb3BlbiBjb250ZW50IFVSSSBhcyB0ZXh0Li4uICBub3QgcmVhbGx5IGFuCisgICAgICAgICAgICAgICAgICAgIC8vIGVycm9yLCBqdXN0IHNvbWV0aGluZyB0byBpZ25vcmUuCisKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFNvbWV0aGluZyBiYWQgaGFzIGhhcHBlbmVkLgorICAgICAgICAgICAgICAgICAgICBMb2cudygiQ2xpcHBlZERhdGEiLCAiRmFpbHVyZSBsb2FkaW5nIHRleHQiLCBlKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUudG9TdHJpbmcoKTsKKworICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdHJlYW0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0uY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIElmIHdlIGNvdWxkbid0IG9wZW4gdGhlIFVSSSBhcyBhIHN0cmVhbSwgdGhlbiB0aGUgVVJJIGl0c2VsZgorICAgICAgICAgICAgICAgIC8vIHByb2JhYmx5IHNlcnZlcyBmYWlybHkgd2VsbCBhcyBhIHRleHR1YWwgcmVwcmVzZW50YXRpb24uCisgICAgICAgICAgICAgICAgcmV0dXJuIG1VcmkudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gRmluYWxseSwgaWYgYWxsIHdlIGhhdmUgaXMgYW4gSW50ZW50LCB0aGVuIHdlIGNhbiBqdXN0IHR1cm4gdGhhdAorICAgICAgICAgICAgLy8gaW50byB0ZXh0LiAgTm90IHRoZSBtb3N0IHVzZXItZnJpZW5kbHkgdGhpbmcsIGJ1dCBpdCdzIHNvbWV0aGluZy4KKyAgICAgICAgICAgIGlmIChtSW50ZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbUludGVudC50b1VyaShJbnRlbnQuVVJJX0lOVEVOVF9TQ0hFTUUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBTaG91bGRuJ3QgZ2V0IGhlcmUsIGJ1dCBqdXN0IGluIGNhc2UuLi4KKyAgICAgICAgICAgIHJldHVybiAiIjsKKyAgICAgICAgfQorLy9FTkRfSU5DTFVERShjb2VyY2VUb1RleHQpCisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IGNsaXAuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGFiZWwgTGFiZWwgdG8gc2hvdyB0byB0aGUgdXNlciBkZXNjcmliaW5nIHRoaXMgY2xpcC4KKyAgICAgKiBAcGFyYW0gaWNvbiBCaXRtYXAgcHJvdmlkaW5nIHRoZSB1c2VyIHdpdGggYW4gaWNvbmluZyByZXByZXNlbnRhdGlvbiBvZgorICAgICAqIHRoZSBjbGlwLgorICAgICAqIEBwYXJhbSBpdGVtIFRoZSBjb250ZW50cyBvZiB0aGUgZmlyc3QgaXRlbSBpbiB0aGUgY2xpcC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xpcHBlZERhdGEoQ2hhclNlcXVlbmNlIGxhYmVsLCBCaXRtYXAgaWNvbiwgSXRlbSBpdGVtKSB7CisgICAgICAgIGlmIChpdGVtID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiaXRlbSBpcyBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgbUxhYmVsID0gbGFiZWw7CisgICAgICAgIG1JY29uID0gaWNvbjsKKyAgICAgICAgbUl0ZW1zLmFkZChpdGVtKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRJdGVtKEl0ZW0gaXRlbSkgeworICAgICAgICBpZiAoaXRlbSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIml0ZW0gaXMgbnVsbCIpOworICAgICAgICB9CisgICAgICAgIG1JdGVtcy5hZGQoaXRlbSk7CisgICAgfQorCisgICAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXRMYWJlbCgpIHsKKyAgICAgICAgcmV0dXJuIG1MYWJlbDsKKyAgICB9CisKKyAgICBwdWJsaWMgQml0bWFwIGdldEljb24oKSB7CisgICAgICAgIHJldHVybiBtSWNvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldEl0ZW1Db3VudCgpIHsKKyAgICAgICAgcmV0dXJuIG1JdGVtcy5zaXplKCk7CisgICAgfQorCisgICAgcHVibGljIEl0ZW0gZ2V0SXRlbShpbnQgaW5kZXgpIHsKKyAgICAgICAgcmV0dXJuIG1JdGVtcy5nZXQoaW5kZXgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgZGVzY3JpYmVDb250ZW50cygpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgd3JpdGVUb1BhcmNlbChQYXJjZWwgZGVzdCwgaW50IGZsYWdzKSB7CisgICAgICAgIFRleHRVdGlscy53cml0ZVRvUGFyY2VsKG1MYWJlbCwgZGVzdCwgZmxhZ3MpOworICAgICAgICBpZiAobUljb24gIT0gbnVsbCkgeworICAgICAgICAgICAgZGVzdC53cml0ZUludCgxKTsKKyAgICAgICAgICAgIG1JY29uLndyaXRlVG9QYXJjZWwoZGVzdCwgZmxhZ3MpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZGVzdC53cml0ZUludCgwKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBpbnQgTiA9IG1JdGVtcy5zaXplKCk7CisgICAgICAgIGRlc3Qud3JpdGVJbnQoTik7CisgICAgICAgIGZvciAoaW50IGk9MDsgaTxOOyBpKyspIHsKKyAgICAgICAgICAgIEl0ZW0gaXRlbSA9IG1JdGVtcy5nZXQoaSk7CisgICAgICAgICAgICBUZXh0VXRpbHMud3JpdGVUb1BhcmNlbChpdGVtLm1UZXh0LCBkZXN0LCBmbGFncyk7CisgICAgICAgICAgICBpZiAoaXRlbS5tSW50ZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBkZXN0LndyaXRlSW50KDEpOworICAgICAgICAgICAgICAgIGl0ZW0ubUludGVudC53cml0ZVRvUGFyY2VsKGRlc3QsIGZsYWdzKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZGVzdC53cml0ZUludCgwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpdGVtLm1VcmkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGRlc3Qud3JpdGVJbnQoMSk7CisgICAgICAgICAgICAgICAgaXRlbS5tVXJpLndyaXRlVG9QYXJjZWwoZGVzdCwgZmxhZ3MpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBkZXN0LndyaXRlSW50KDApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQ2xpcHBlZERhdGEoUGFyY2VsIGluKSB7CisgICAgICAgIG1MYWJlbCA9IFRleHRVdGlscy5DSEFSX1NFUVVFTkNFX0NSRUFUT1IuY3JlYXRlRnJvbVBhcmNlbChpbik7CisgICAgICAgIGlmIChpbi5yZWFkSW50KCkgIT0gMCkgeworICAgICAgICAgICAgbUljb24gPSBCaXRtYXAuQ1JFQVRPUi5jcmVhdGVGcm9tUGFyY2VsKGluKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBpbnQgTiA9IGluLnJlYWRJbnQoKTsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpPE47IGkrKykgeworICAgICAgICAgICAgQ2hhclNlcXVlbmNlIHRleHQgPSBUZXh0VXRpbHMuQ0hBUl9TRVFVRU5DRV9DUkVBVE9SLmNyZWF0ZUZyb21QYXJjZWwoaW4pOworICAgICAgICAgICAgSW50ZW50IGludGVudCA9IGluLnJlYWRJbnQoKSAhPSAwID8gSW50ZW50LkNSRUFUT1IuY3JlYXRlRnJvbVBhcmNlbChpbikgOiBudWxsOworICAgICAgICAgICAgVXJpIHVyaSA9IGluLnJlYWRJbnQoKSAhPSAwID8gVXJpLkNSRUFUT1IuY3JlYXRlRnJvbVBhcmNlbChpbikgOiBudWxsOworICAgICAgICAgICAgbUl0ZW1zLmFkZChuZXcgSXRlbSh0ZXh0LCBpbnRlbnQsIHVyaSkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBQYXJjZWxhYmxlLkNyZWF0b3I8Q2xpcHBlZERhdGE+IENSRUFUT1IgPQorICAgICAgICBuZXcgUGFyY2VsYWJsZS5DcmVhdG9yPENsaXBwZWREYXRhPigpIHsKKworICAgICAgICAgICAgcHVibGljIENsaXBwZWREYXRhIGNyZWF0ZUZyb21QYXJjZWwoUGFyY2VsIHNvdXJjZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ2xpcHBlZERhdGEoc291cmNlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIENsaXBwZWREYXRhW10gbmV3QXJyYXkoaW50IHNpemUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENsaXBwZWREYXRhW3NpemVdOworICAgICAgICAgICAgfQorICAgICAgICB9OworfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Db250ZW50UHJvdmlkZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ29udGVudFByb3ZpZGVyLmphdmEKaW5kZXggZGM0ZTljNC4uODhlMDEyMyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Db250ZW50UHJvdmlkZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NvbnRlbnRQcm92aWRlci5qYXZhCkBAIC0yOCwxMyArMjgsMTYgQEAKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLklDb250ZW50T2JzZXJ2ZXI7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5TUUxFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworaW1wb3J0IGFuZHJvaWQub3MuQXN5bmNUYXNrOwogaW1wb3J0IGFuZHJvaWQub3MuQmluZGVyOwogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3I7CiBpbXBvcnQgYW5kcm9pZC5vcy5Qcm9jZXNzOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogCiAvKioKQEAgLTc2LDYgKzc5LDggQEAKICAqIGNyb3NzLXByb2Nlc3MgY2FsbHMuPC9wPgogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgQ29tcG9uZW50Q2FsbGJhY2tzIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkNvbnRlbnRQcm92aWRlciI7CisKICAgICAvKgogICAgICAqIE5vdGU6IGlmIHlvdSBhZGQgbWV0aG9kcyB0byBDb250ZW50UHJvdmlkZXIsIHlvdSBtdXN0IGFkZCBzaW1pbGFyIG1ldGhvZHMgdG8KICAgICAgKiAgICAgICBNb2NrQ29udGVudFByb3ZpZGVyLgpAQCAtMjQ5LDYgKzI1NCwxOCBAQAogICAgICAgICAgICAgcmV0dXJuIENvbnRlbnRQcm92aWRlci50aGlzLmNhbGwobWV0aG9kLCByZXF1ZXN0LCBhcmdzKTsKICAgICAgICAgfQogCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0U3RyZWFtVHlwZXMoVXJpIHVyaSwgU3RyaW5nIG1pbWVUeXBlRmlsdGVyKSB7CisgICAgICAgICAgICByZXR1cm4gQ29udGVudFByb3ZpZGVyLnRoaXMuZ2V0U3RyZWFtVHlwZXModXJpLCBtaW1lVHlwZUZpbHRlcik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEFzc2V0RmlsZURlc2NyaXB0b3Igb3BlblR5cGVkQXNzZXRGaWxlKFVyaSB1cmksIFN0cmluZyBtaW1lVHlwZSwgQnVuZGxlIG9wdHMpCisgICAgICAgICAgICAgICAgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBlbmZvcmNlUmVhZFBlcm1pc3Npb24odXJpKTsKKyAgICAgICAgICAgIHJldHVybiBDb250ZW50UHJvdmlkZXIudGhpcy5vcGVuVHlwZWRBc3NldEZpbGUodXJpLCBtaW1lVHlwZSwgb3B0cyk7CisgICAgICAgIH0KKwogICAgICAgICBwcml2YXRlIHZvaWQgZW5mb3JjZVJlYWRQZXJtaXNzaW9uKFVyaSB1cmkpIHsKICAgICAgICAgICAgIGZpbmFsIGludCB1aWQgPSBCaW5kZXIuZ2V0Q2FsbGluZ1VpZCgpOwogICAgICAgICAgICAgaWYgKHVpZCA9PSBtTXlVaWQpIHsKQEAgLTc1MCw2ICs3NjcsMTcwIEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogSGVscGVyIHRvIGNvbXBhcmUgdHdvIE1JTUUgdHlwZXMsIHdoZXJlIG9uZSBtYXkgYmUgYSBwYXR0ZXJuLgorICAgICAqIEBwYXJhbSBjb25jcmV0ZVR5cGUgQSBmdWxseS1zcGVjaWZpZWQgTUlNRSB0eXBlLgorICAgICAqIEBwYXJhbSBkZXNpcmVkVHlwZSBBIGRlc2lyZWQgTUlNRSB0eXBlIHRoYXQgbWF5IGJlIGEgcGF0dGVybiBzdWNoIGFzICpcLyouCisgICAgICogQHJldHVybiBSZXR1cm5zIHRydWUgaWYgdGhlIHR3byBNSU1FIHR5cGVzIG1hdGNoLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb21wYXJlTWltZVR5cGVzKFN0cmluZyBjb25jcmV0ZVR5cGUsIFN0cmluZyBkZXNpcmVkVHlwZSkgeworICAgICAgICBmaW5hbCBpbnQgdHlwZUxlbmd0aCA9IGRlc2lyZWRUeXBlLmxlbmd0aCgpOworICAgICAgICBpZiAodHlwZUxlbmd0aCA9PSAzICYmIGRlc2lyZWRUeXBlLmVxdWFscygiKi8qIikpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgaW50IHNsYXNocG9zID0gZGVzaXJlZFR5cGUuaW5kZXhPZignLycpOworICAgICAgICBpZiAoc2xhc2hwb3MgPiAwKSB7CisgICAgICAgICAgICBpZiAodHlwZUxlbmd0aCA9PSBzbGFzaHBvcysyICYmIGRlc2lyZWRUeXBlLmNoYXJBdChzbGFzaHBvcysxKSA9PSAnKicpIHsKKyAgICAgICAgICAgICAgICBpZiAoZGVzaXJlZFR5cGUucmVnaW9uTWF0Y2hlcygwLCBjb25jcmV0ZVR5cGUsIDAsIHNsYXNocG9zKzEpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZGVzaXJlZFR5cGUuZXF1YWxzKGNvbmNyZXRlVHlwZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgYnkgYSBjbGllbnQgdG8gZGV0ZXJtaW5lIHRoZSB0eXBlcyBvZiBkYXRhIHN0cmVhbXMgdGhhdCB0aGlzCisgICAgICogY29udGVudCBwcm92aWRlciBzdXBwb3J0cyBmb3IgdGhlIGdpdmVuIFVSSS4gIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uCisgICAgICogcmV0dXJucyBudWxsLCBtZWFuaW5nIG5vIHR5cGVzLiAgSWYgeW91ciBjb250ZW50IHByb3ZpZGVyIHN0b3JlcyBkYXRhCisgICAgICogb2YgYSBwYXJ0aWN1bGFyIHR5cGUsIHJldHVybiB0aGF0IE1JTUUgdHlwZSBpZiBpdCBtYXRjaGVzIHRoZSBnaXZlbgorICAgICAqIG1pbWVUeXBlRmlsdGVyLiAgSWYgaXQgY2FuIHBlcmZvcm0gdHlwZSBjb252ZXJzaW9ucywgcmV0dXJuIGFuIGFycmF5CisgICAgICogb2YgYWxsIHN1cHBvcnRlZCBNSU1FIHR5cGVzIHRoYXQgbWF0Y2ggbWltZVR5cGVGaWx0ZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXJpIFRoZSBkYXRhIGluIHRoZSBjb250ZW50IHByb3ZpZGVyIGJlaW5nIHF1ZXJpZWQuCisgICAgICogQHBhcmFtIG1pbWVUeXBlRmlsdGVyIFRoZSB0eXBlIG9mIGRhdGEgdGhlIGNsaWVudCBkZXNpcmVzLiAgTWF5IGJlCisgICAgICogYSBwYXR0ZXJuLCBzdWNoIGFzICpcLyogdG8gcmV0cmlldmUgYWxsIHBvc3NpYmxlIGRhdGEgdHlwZXMuCisgICAgICogQHJldHVybiBSZXR1cm5zIG51bGwgaWYgdGhlcmUgYXJlIG5vIHBvc3NpYmxlIGRhdGEgc3RyZWFtcyBmb3IgdGhlCisgICAgICogZ2l2ZW4gbWltZVR5cGVGaWx0ZXIuICBPdGhlcndpc2UgcmV0dXJucyBhbiBhcnJheSBvZiBhbGwgYXZhaWxhYmxlCisgICAgICogY29uY3JldGUgTUlNRSB0eXBlcy4KKyAgICAgKgorICAgICAqIEBzZWUgI2dldFR5cGUoVXJpKQorICAgICAqIEBzZWUgI29wZW5UeXBlZEFzc2V0RmlsZShVcmksIFN0cmluZywgQnVuZGxlKQorICAgICAqIEBzZWUgI2NvbXBhcmVNaW1lVHlwZXMoU3RyaW5nLCBTdHJpbmcpCisgICAgICovCisgICAgcHVibGljIFN0cmluZ1tdIGdldFN0cmVhbVR5cGVzKFVyaSB1cmksIFN0cmluZyBtaW1lVHlwZUZpbHRlcikgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgYnkgYSBjbGllbnQgdG8gb3BlbiBhIHJlYWQtb25seSBzdHJlYW0gY29udGFpbmluZyBkYXRhIG9mIGEKKyAgICAgKiBwYXJ0aWN1bGFyIE1JTUUgdHlwZS4gIFRoaXMgaXMgbGlrZSB7QGxpbmsgI29wZW5Bc3NldEZpbGUoVXJpLCBTdHJpbmcpfSwKKyAgICAgKiBleGNlcHQgdGhlIGZpbGUgY2FuIG9ubHkgYmUgcmVhZC1vbmx5IGFuZCB0aGUgY29udGVudCBwcm92aWRlciBtYXkKKyAgICAgKiBwZXJmb3JtIGRhdGEgY29udmVyc2lvbnMgdG8gZ2VuZXJhdGUgZGF0YSBvZiB0aGUgZGVzaXJlZCB0eXBlLgorICAgICAqCisgICAgICogPHA+VGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gY29tcGFyZXMgdGhlIGdpdmVuIG1pbWVUeXBlIGFnYWluc3QgdGhlCisgICAgICogcmVzdWx0IG9mIHtAbGluayAjZ2V0VHlwZShVcmkpfSBhbmQsIGlmIHRoZSBtYXRjaCwgc2ltcGxlIGNhbGxzCisgICAgICoge0BsaW5rICNvcGVuQXNzZXRGaWxlKFVyaSwgU3RyaW5nKX0uCisgICAgICoKKyAgICAgKiA8cD5TZWUge0BsaW5rIENsaXBwZWREYXRhfSBmb3IgZXhhbXBsZXMgb2YgdGhlIHVzZSBhbmQgaW1wbGVtZW50YXRpb24KKyAgICAgKiBvZiB0aGlzIG1ldGhvZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1cmkgVGhlIGRhdGEgaW4gdGhlIGNvbnRlbnQgcHJvdmlkZXIgYmVpbmcgcXVlcmllZC4KKyAgICAgKiBAcGFyYW0gbWltZVR5cGVGaWx0ZXIgVGhlIHR5cGUgb2YgZGF0YSB0aGUgY2xpZW50IGRlc2lyZXMuICBNYXkgYmUKKyAgICAgKiBhIHBhdHRlcm4sIHN1Y2ggYXMgKlwvKiwgaWYgdGhlIGNhbGxlciBkb2VzIG5vdCBoYXZlIHNwZWNpZmljIHR5cGUKKyAgICAgKiByZXF1aXJlbWVudHM7IGluIHRoaXMgY2FzZSB0aGUgY29udGVudCBwcm92aWRlciB3aWxsIHBpY2sgaXRzIGJlc3QKKyAgICAgKiB0eXBlIG1hdGNoaW5nIHRoZSBwYXR0ZXJuLgorICAgICAqIEBwYXJhbSBvcHRzIEFkZGl0aW9uYWwgb3B0aW9ucyBmcm9tIHRoZSBjbGllbnQuICBUaGUgZGVmaW5pdGlvbnMgb2YKKyAgICAgKiB0aGVzZSBhcmUgc3BlY2lmaWMgdG8gdGhlIGNvbnRlbnQgcHJvdmlkZXIgYmVpbmcgY2FsbGVkLgorICAgICAqCisgICAgICogQHJldHVybiBSZXR1cm5zIGEgbmV3IEFzc2V0RmlsZURlc2NyaXB0b3IgZnJvbSB3aGljaCB0aGUgY2xpZW50IGNhbgorICAgICAqIHJlYWQgZGF0YSBvZiB0aGUgZGVzaXJlZCB0eXBlLgorICAgICAqCisgICAgICogQHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24gVGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBpZiB0aGVyZSBpcworICAgICAqIG5vIGZpbGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBVUkkgb3IgdGhlIG1vZGUgaXMgaW52YWxpZC4KKyAgICAgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uIFRocm93cyBTZWN1cml0eUV4Y2VwdGlvbiBpZiB0aGUgY2FsbGVyIGRvZXMKKyAgICAgKiBub3QgaGF2ZSBwZXJtaXNzaW9uIHRvIGFjY2VzcyB0aGUgZGF0YS4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBUaHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZQorICAgICAqIGNvbnRlbnQgcHJvdmlkZXIgZG9lcyBub3Qgc3VwcG9ydCB0aGUgcmVxdWVzdGVkIE1JTUUgdHlwZS4KKyAgICAgKgorICAgICAqIEBzZWUgI2dldFN0cmVhbVR5cGVzKFVyaSwgU3RyaW5nKQorICAgICAqIEBzZWUgI29wZW5Bc3NldEZpbGUoVXJpLCBTdHJpbmcpCisgICAgICogQHNlZSAjY29tcGFyZU1pbWVUeXBlcyhTdHJpbmcsIFN0cmluZykKKyAgICAgKi8KKyAgICBwdWJsaWMgQXNzZXRGaWxlRGVzY3JpcHRvciBvcGVuVHlwZWRBc3NldEZpbGUoVXJpIHVyaSwgU3RyaW5nIG1pbWVUeXBlRmlsdGVyLCBCdW5kbGUgb3B0cykKKyAgICAgICAgICAgIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24geworICAgICAgICBpZiAoIiovKiIuZXF1YWxzKG1pbWVUeXBlRmlsdGVyKSkgeworICAgICAgICAgICAgLy8gSWYgdGhleSBjYW4gdGFrZSBhbnl0aGluZywgdGhlIHVudHlwZWQgb3BlbiBjYWxsIGlzIGdvb2QgZW5vdWdoLgorICAgICAgICAgICAgcmV0dXJuIG9wZW5Bc3NldEZpbGUodXJpLCAiciIpOworICAgICAgICB9CisgICAgICAgIFN0cmluZyBiYXNlVHlwZSA9IGdldFR5cGUodXJpKTsKKyAgICAgICAgaWYgKGJhc2VUeXBlICE9IG51bGwgJiYgY29tcGFyZU1pbWVUeXBlcyhiYXNlVHlwZSwgbWltZVR5cGVGaWx0ZXIpKSB7CisgICAgICAgICAgICAvLyBVc2Ugb2xkIHVudHlwZWQgb3BlbiBjYWxsIGlmIHRoaXMgcHJvdmlkZXIgaGFzIGEgdHlwZSBmb3IgdGhpcworICAgICAgICAgICAgLy8gVVJJIGFuZCBpdCBtYXRjaGVzIHRoZSByZXF1ZXN0LgorICAgICAgICAgICAgcmV0dXJuIG9wZW5Bc3NldEZpbGUodXJpLCAiciIpOworICAgICAgICB9CisgICAgICAgIHRocm93IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24oIkNhbid0IG9wZW4gIiArIHVyaSArICIgYXMgdHlwZSAiICsgbWltZVR5cGVGaWx0ZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEludGVyZmFjZSB0byB3cml0ZSBhIHN0cmVhbSBvZiBkYXRhIHRvIGEgcGlwZS4gIFVzZSB3aXRoCisgICAgICoge0BsaW5rIENvbnRlbnRQcm92aWRlciNvcGVuUGlwZUhlbHBlcn0uCisgICAgICovCisgICAgcHVibGljIGludGVyZmFjZSBQaXBlRGF0YVdyaXRlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDYWxsZWQgZnJvbSBhIGJhY2tncm91bmQgdGhyZWFkIHRvIHN0cmVhbSBkYXRhIG91dCB0byBhIHBpcGUuCisgICAgICAgICAqIE5vdGUgdGhhdCB0aGUgcGlwZSBpcyBibG9ja2luZywgc28gdGhpcyB0aHJlYWQgY2FuIGJsb2NrIG9uCisgICAgICAgICAqIHdyaXRlcyBmb3IgYW4gYXJiaXRyYXJ5IGFtb3VudCBvZiB0aW1lIGlmIHRoZSBjbGllbnQgaXMgc2xvdworICAgICAgICAgKiBhdCByZWFkaW5nLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gb3V0cHV0IFRoZSBwaXBlIHdoZXJlIGRhdGEgc2hvdWxkIGJlIHdyaXR0ZW4uICBUaGlzIHdpbGwgYmUKKyAgICAgICAgICogY2xvc2VkIGZvciB5b3UgdXBvbiByZXR1cm5pbmcgZnJvbSB0aGlzIGZ1bmN0aW9uLgorICAgICAgICAgKiBAcGFyYW0gdXJpIFRoZSBVUkkgd2hvc2UgZGF0YSBpcyB0byBiZSB3cml0dGVuLgorICAgICAgICAgKiBAcGFyYW0gbWltZVR5cGUgVGhlIGRlc2lyZWQgdHlwZSBvZiBkYXRhIHRvIGJlIHdyaXR0ZW4uCisgICAgICAgICAqIEBwYXJhbSBvcHRzIE9wdGlvbnMgc3VwcGxpZWQgYnkgY2FsbGVyLgorICAgICAgICAgKiBAcGFyYW0gYXJncyBZb3VyIG93biBjdXN0b20gYXJndW1lbnRzLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgd3JpdGVEYXRhVG9QaXBlKFBhcmNlbEZpbGVEZXNjcmlwdG9yIG91dHB1dCwgVXJpIHVyaSwgU3RyaW5nIG1pbWVUeXBlLAorICAgICAgICAgICAgICAgIEJ1bmRsZSBvcHRzLCBUIGFyZ3MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEEgaGVscGVyIGZ1bmN0aW9uIGZvciBpbXBsZW1lbnRpbmcge0BsaW5rICNvcGVuVHlwZWRBc3NldEZpbGV9LCBmb3IKKyAgICAgKiBjcmVhdGluZyBhIGRhdGEgcGlwZSBhbmQgYmFja2dyb3VuZCB0aHJlYWQgYWxsb3dpbmcgeW91IHRvIHN0cmVhbQorICAgICAqIGdlbmVyYXRlZCBkYXRhIGJhY2sgdG8gdGhlIGNsaWVudC4gIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIG5ldworICAgICAqIFBhcmNlbEZpbGVEZXNjcmlwdG9yIHRoYXQgc2hvdWxkIGJlIHJldHVybmVkIHRvIHRoZSBjYWxsZXIgKHRoZSBjYWxsZXIKKyAgICAgKiBpcyByZXNwb25zaWJsZSBmb3IgY2xvc2luZyBpdCkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXJpIFRoZSBVUkkgd2hvc2UgZGF0YSBpcyB0byBiZSB3cml0dGVuLgorICAgICAqIEBwYXJhbSBtaW1lVHlwZSBUaGUgZGVzaXJlZCB0eXBlIG9mIGRhdGEgdG8gYmUgd3JpdHRlbi4KKyAgICAgKiBAcGFyYW0gb3B0cyBPcHRpb25zIHN1cHBsaWVkIGJ5IGNhbGxlci4KKyAgICAgKiBAcGFyYW0gYXJncyBZb3VyIG93biBjdXN0b20gYXJndW1lbnRzLgorICAgICAqIEBwYXJhbSBmdW5jIEludGVyZmFjZSBpbXBsZW1lbnRpbmcgdGhlIGZ1bmN0aW9uIHRoYXQgd2lsbCBhY3R1YWxseQorICAgICAqIHN0cmVhbSB0aGUgZGF0YS4KKyAgICAgKiBAcmV0dXJuIFJldHVybnMgYSBuZXcgUGFyY2VsRmlsZURlc2NyaXB0b3IgaG9sZGluZyB0aGUgcmVhZCBzaWRlIG9mCisgICAgICogdGhlIHBpcGUuICBUaGlzIHNob3VsZCBiZSByZXR1cm5lZCB0byB0aGUgY2FsbGVyIGZvciByZWFkaW5nOyB0aGUgY2FsbGVyCisgICAgICogaXMgcmVzcG9uc2libGUgZm9yIGNsb3NpbmcgaXQgd2hlbiBkb25lLgorICAgICAqLworICAgIHB1YmxpYyA8VD4gUGFyY2VsRmlsZURlc2NyaXB0b3Igb3BlblBpcGVIZWxwZXIoZmluYWwgVXJpIHVyaSwgZmluYWwgU3RyaW5nIG1pbWVUeXBlLAorICAgICAgICAgICAgZmluYWwgQnVuZGxlIG9wdHMsIGZpbmFsIFQgYXJncywgZmluYWwgUGlwZURhdGFXcml0ZXI8VD4gZnVuYykKKyAgICAgICAgICAgIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgZmluYWwgUGFyY2VsRmlsZURlc2NyaXB0b3JbXSBmZHMgPSBQYXJjZWxGaWxlRGVzY3JpcHRvci5jcmVhdGVQaXBlKCk7CisKKyAgICAgICAgICAgIEFzeW5jVGFzazxPYmplY3QsIE9iamVjdCwgT2JqZWN0PiB0YXNrID0gbmV3IEFzeW5jVGFzazxPYmplY3QsIE9iamVjdCwgT2JqZWN0PigpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgT2JqZWN0IGRvSW5CYWNrZ3JvdW5kKE9iamVjdC4uLiBwYXJhbXMpIHsKKyAgICAgICAgICAgICAgICAgICAgZnVuYy53cml0ZURhdGFUb1BpcGUoZmRzWzFdLCB1cmksIG1pbWVUeXBlLCBvcHRzLCBhcmdzKTsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZkc1sxXS5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJGYWlsdXJlIGNsb3NpbmcgcGlwZSIsIGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisgICAgICAgICAgICB0YXNrLmV4ZWN1dGUoKE9iamVjdFtdKW51bGwpOworCisgICAgICAgICAgICByZXR1cm4gZmRzWzBdOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKCJmYWlsdXJlIG1ha2luZyBwaXBlIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKICAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBpbnN0YW5jZSBpcyBhIHRlbXBvcmFyeSBjb250ZW50IHByb3ZpZGVyLgogICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIGluc3RhbmNlIGlzIGEgdGVtcG9yYXJ5IGNvbnRlbnQgcHJvdmlkZXIKICAgICAgKi8KQEAgLTc3NSw2ICs5NTYsMTEgQEAKICAgICAgKiBAcGFyYW0gaW5mbyBSZWdpc3RlcmVkIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgY29udGVudCBwcm92aWRlcgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGF0dGFjaEluZm8oQ29udGV4dCBjb250ZXh0LCBQcm92aWRlckluZm8gaW5mbykgeworICAgICAgICAvKgorICAgICAgICAgKiBXZSBtYXkgYmUgdXNpbmcgQXN5bmNUYXNrIGZyb20gYmluZGVyIHRocmVhZHMuICBNYWtlIGl0IGluaXQgaGVyZQorICAgICAgICAgKiBzbyBpdHMgc3RhdGljIGhhbmRsZXIgaXMgb24gdGhlIG1haW4gdGhyZWFkLgorICAgICAgICAgKi8KKyAgICAgICAgQXN5bmNUYXNrLmluaXQoKTsKIAogICAgICAgICAvKgogICAgICAgICAgKiBPbmx5IGFsbG93IGl0IHRvIGJlIHNldCBvbmNlLCBzbyBhZnRlciB0aGUgY29udGVudCBzZXJ2aWNlIGdpdmVzCkBAIC04MjMsNyArMTAwOSw3IEBACiAgICAgLyoqCiAgICAgICogQGhpZGUgLS0gdW50aWwgaW50ZXJmYWNlIGhhcyBwcm92ZW4gaXRzZWxmCiAgICAgICoKLSAgICAgKiBDYWxsIGFuIHByb3ZpZGVyLWRlZmluZWQgbWV0aG9kLiAgVGhpcyBjYW4gYmUgdXNlZCB0byBpbXBsZW1lbnQKKyAgICAgKiBDYWxsIGEgcHJvdmlkZXItZGVmaW5lZCBtZXRob2QuICBUaGlzIGNhbiBiZSB1c2VkIHRvIGltcGxlbWVudAogICAgICAqIGludGVyZmFjZXMgdGhhdCBhcmUgY2hlYXBlciB0aGFuIHVzaW5nIGEgQ3Vyc29yLgogICAgICAqCiAgICAgICogQHBhcmFtIG1ldGhvZCBNZXRob2QgbmFtZSB0byBjYWxsLiAgT3BhcXVlIHRvIGZyYW1ld29yay4KQEAgLTgzMyw0ICsxMDE5LDMxIEBACiAgICAgcHVibGljIEJ1bmRsZSBjYWxsKFN0cmluZyBtZXRob2QsIFN0cmluZyByZXF1ZXN0LCBCdW5kbGUgYXJncykgewogICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbXBsZW1lbnQgdGhpcyB0byBzaHV0IGRvd24gdGhlIENvbnRlbnRQcm92aWRlciBpbnN0YW5jZS4gWW91IGNhbiB0aGVuCisgICAgICogaW52b2tlIHRoaXMgbWV0aG9kIGluIHVuaXQgdGVzdHMuCisgICAgICogCisgICAgICogPHA+CisgICAgICogQW5kcm9pZCBub3JtYWxseSBoYW5kbGVzIENvbnRlbnRQcm92aWRlciBzdGFydHVwIGFuZCBzaHV0ZG93bgorICAgICAqIGF1dG9tYXRpY2FsbHkuIFlvdSBkbyBub3QgbmVlZCB0byBzdGFydCB1cCBvciBzaHV0IGRvd24gYQorICAgICAqIENvbnRlbnRQcm92aWRlci4gV2hlbiB5b3UgaW52b2tlIGEgdGVzdCBtZXRob2Qgb24gYSBDb250ZW50UHJvdmlkZXIsCisgICAgICogaG93ZXZlciwgYSBDb250ZW50UHJvdmlkZXIgaW5zdGFuY2UgaXMgc3RhcnRlZCBhbmQga2VlcHMgcnVubmluZyBhZnRlcgorICAgICAqIHRoZSB0ZXN0IGZpbmlzaGVzLCBldmVuIGlmIGEgc3VjY2VlZGluZyB0ZXN0IGluc3RhbnRpYXRlcyBhbm90aGVyCisgICAgICogQ29udGVudFByb3ZpZGVyLiBBIGNvbmZsaWN0IGRldmVsb3BzIGJlY2F1c2UgdGhlIHR3byBpbnN0YW5jZXMgYXJlCisgICAgICogdXN1YWxseSBydW5uaW5nIGFnYWluc3QgdGhlIHNhbWUgdW5kZXJseWluZyBkYXRhIHNvdXJjZSAoZm9yIGV4YW1wbGUsIGFuCisgICAgICogc3FsaXRlIGRhdGFiYXNlKS4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogSW1wbGVtZW50aW5nIHNodXREb3duKCkgYXZvaWRzIHRoaXMgY29uZmxpY3QgYnkgcHJvdmlkaW5nIGEgd2F5IHRvCisgICAgICogdGVybWluYXRlIHRoZSBDb250ZW50UHJvdmlkZXIuIFRoaXMgbWV0aG9kIGNhbiBhbHNvIHByZXZlbnQgbWVtb3J5IGxlYWtzCisgICAgICogZnJvbSBtdWx0aXBsZSBpbnN0YW50aWF0aW9ucyBvZiB0aGUgQ29udGVudFByb3ZpZGVyLCBhbmQgaXQgY2FuIGVuc3VyZQorICAgICAqIHVuaXQgdGVzdCBpc29sYXRpb24gYnkgYWxsb3dpbmcgeW91IHRvIGNvbXBsZXRlbHkgY2xlYW4gdXAgdGhlIHRlc3QKKyAgICAgKiBmaXh0dXJlIGJlZm9yZSBtb3Zpbmcgb24gdG8gdGhlIG5leHQgdGVzdC4KKyAgICAgKiA8L3A+CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2h1dGRvd24oKSB7CisgICAgICAgIExvZy53KFRBRywgImltcGxlbWVudCBDb250ZW50UHJvdmlkZXIgc2h1dGRvd24oKSB0byBtYWtlIHN1cmUgYWxsIGRhdGFiYXNlICIgKworICAgICAgICAgICAgICAgICJjb25uZWN0aW9ucyBhcmUgZ3JhY2VmdWxseSBzaHV0ZG93biIpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ29udGVudFByb3ZpZGVyQ2xpZW50LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NvbnRlbnRQcm92aWRlckNsaWVudC5qYXZhCmluZGV4IDA4NThlYTUuLjA1NDAxMDkgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ29udGVudFByb3ZpZGVyQ2xpZW50LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Db250ZW50UHJvdmlkZXJDbGllbnQuamF2YQpAQCAtMTgsNiArMTgsNyBAQAogCiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7CiBpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwogaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3I7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Bc3NldEZpbGVEZXNjcmlwdG9yOwpAQCAtNDMsNTMgKzQ0LDc3IEBACiAgICAgICAgIG1Db250ZW50UmVzb2x2ZXIgPSBjb250ZW50UmVzb2x2ZXI7CiAgICAgfQogCi0gICAgLyoqIHNlZSB7QGxpbmsgQ29udGVudFByb3ZpZGVyI3F1ZXJ5fSAqLworICAgIC8qKiBTZWUge0BsaW5rIENvbnRlbnRQcm92aWRlciNxdWVyeSBDb250ZW50UHJvdmlkZXIucXVlcnl9ICovCiAgICAgcHVibGljIEN1cnNvciBxdWVyeShVcmkgdXJsLCBTdHJpbmdbXSBwcm9qZWN0aW9uLCBTdHJpbmcgc2VsZWN0aW9uLAogICAgICAgICAgICAgU3RyaW5nW10gc2VsZWN0aW9uQXJncywgU3RyaW5nIHNvcnRPcmRlcikgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CiAgICAgICAgIHJldHVybiBtQ29udGVudFByb3ZpZGVyLnF1ZXJ5KHVybCwgcHJvamVjdGlvbiwgc2VsZWN0aW9uLCAgc2VsZWN0aW9uQXJncywgc29ydE9yZGVyKTsKICAgICB9CiAKLSAgICAvKiogc2VlIHtAbGluayBDb250ZW50UHJvdmlkZXIjZ2V0VHlwZX0gKi8KKyAgICAvKiogU2VlIHtAbGluayBDb250ZW50UHJvdmlkZXIjZ2V0VHlwZSBDb250ZW50UHJvdmlkZXIuZ2V0VHlwZX0gKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldFR5cGUoVXJpIHVybCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CiAgICAgICAgIHJldHVybiBtQ29udGVudFByb3ZpZGVyLmdldFR5cGUodXJsKTsKICAgICB9CiAKLSAgICAvKiogc2VlIHtAbGluayBDb250ZW50UHJvdmlkZXIjaW5zZXJ0fSAqLworICAgIC8qKiBTZWUge0BsaW5rIENvbnRlbnRQcm92aWRlciNnZXRTdHJlYW1UeXBlcyBDb250ZW50UHJvdmlkZXIuZ2V0U3RyZWFtVHlwZXN9ICovCisgICAgcHVibGljIFN0cmluZ1tdIGdldFN0cmVhbVR5cGVzKFVyaSB1cmwsIFN0cmluZyBtaW1lVHlwZUZpbHRlcikgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBtQ29udGVudFByb3ZpZGVyLmdldFN0cmVhbVR5cGVzKHVybCwgbWltZVR5cGVGaWx0ZXIpOworICAgIH0KKworICAgIC8qKiBTZWUge0BsaW5rIENvbnRlbnRQcm92aWRlciNpbnNlcnQgQ29udGVudFByb3ZpZGVyLmluc2VydH0gKi8KICAgICBwdWJsaWMgVXJpIGluc2VydChVcmkgdXJsLCBDb250ZW50VmFsdWVzIGluaXRpYWxWYWx1ZXMpCiAgICAgICAgICAgICB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKICAgICAgICAgcmV0dXJuIG1Db250ZW50UHJvdmlkZXIuaW5zZXJ0KHVybCwgaW5pdGlhbFZhbHVlcyk7CiAgICAgfQogCi0gICAgLyoqIHNlZSB7QGxpbmsgQ29udGVudFByb3ZpZGVyI2J1bGtJbnNlcnR9ICovCisgICAgLyoqIFNlZSB7QGxpbmsgQ29udGVudFByb3ZpZGVyI2J1bGtJbnNlcnQgQ29udGVudFByb3ZpZGVyLmJ1bGtJbnNlcnR9ICovCiAgICAgcHVibGljIGludCBidWxrSW5zZXJ0KFVyaSB1cmwsIENvbnRlbnRWYWx1ZXNbXSBpbml0aWFsVmFsdWVzKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKICAgICAgICAgcmV0dXJuIG1Db250ZW50UHJvdmlkZXIuYnVsa0luc2VydCh1cmwsIGluaXRpYWxWYWx1ZXMpOwogICAgIH0KIAotICAgIC8qKiBzZWUge0BsaW5rIENvbnRlbnRQcm92aWRlciNkZWxldGV9ICovCisgICAgLyoqIFNlZSB7QGxpbmsgQ29udGVudFByb3ZpZGVyI2RlbGV0ZSBDb250ZW50UHJvdmlkZXIuZGVsZXRlfSAqLwogICAgIHB1YmxpYyBpbnQgZGVsZXRlKFVyaSB1cmwsIFN0cmluZyBzZWxlY3Rpb24sIFN0cmluZ1tdIHNlbGVjdGlvbkFyZ3MpCiAgICAgICAgICAgICB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKICAgICAgICAgcmV0dXJuIG1Db250ZW50UHJvdmlkZXIuZGVsZXRlKHVybCwgc2VsZWN0aW9uLCBzZWxlY3Rpb25BcmdzKTsKICAgICB9CiAKLSAgICAvKiogc2VlIHtAbGluayBDb250ZW50UHJvdmlkZXIjdXBkYXRlfSAqLworICAgIC8qKiBTZWUge0BsaW5rIENvbnRlbnRQcm92aWRlciN1cGRhdGUgQ29udGVudFByb3ZpZGVyLnVwZGF0ZX0gKi8KICAgICBwdWJsaWMgaW50IHVwZGF0ZShVcmkgdXJsLCBDb250ZW50VmFsdWVzIHZhbHVlcywgU3RyaW5nIHNlbGVjdGlvbiwKICAgICAgICAgICAgIFN0cmluZ1tdIHNlbGVjdGlvbkFyZ3MpIHRocm93cyBSZW1vdGVFeGNlcHRpb24gewogICAgICAgICByZXR1cm4gbUNvbnRlbnRQcm92aWRlci51cGRhdGUodXJsLCB2YWx1ZXMsIHNlbGVjdGlvbiwgc2VsZWN0aW9uQXJncyk7CiAgICAgfQogCi0gICAgLyoqIHNlZSB7QGxpbmsgQ29udGVudFByb3ZpZGVyI29wZW5GaWxlfSAqLworICAgIC8qKgorICAgICAqIFNlZSB7QGxpbmsgQ29udGVudFByb3ZpZGVyI29wZW5GaWxlIENvbnRlbnRQcm92aWRlci5vcGVuRmlsZX0uICBOb3RlIHRoYXQKKyAgICAgKiB0aGlzIDxlbT5kb2VzIG5vdDwvZW0+CisgICAgICogdGFrZSBjYXJlIG9mIG5vbi1jb250ZW50OiBVUklzIHN1Y2ggYXMgZmlsZTouICBJdCBpcyBzdHJvbmdseSByZWNvbW1lbmRlZAorICAgICAqIHlvdSB1c2UgdGhlIHtAbGluayBDb250ZW50UmVzb2x2ZXIjb3BlbkZpbGVEZXNjcmlwdG9yCisgICAgICogQ29udGVudFJlc29sdmVyLm9wZW5GaWxlRGVzY3JpcHRvcn0gQVBJIGluc3RlYWQuCisgICAgICovCiAgICAgcHVibGljIFBhcmNlbEZpbGVEZXNjcmlwdG9yIG9wZW5GaWxlKFVyaSB1cmwsIFN0cmluZyBtb2RlKQogICAgICAgICAgICAgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiwgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKICAgICAgICAgcmV0dXJuIG1Db250ZW50UHJvdmlkZXIub3BlbkZpbGUodXJsLCBtb2RlKTsKICAgICB9CiAKLSAgICAvKiogc2VlIHtAbGluayBDb250ZW50UHJvdmlkZXIjb3BlbkFzc2V0RmlsZX0gKi8KKyAgICAvKioKKyAgICAgKiBTZWUge0BsaW5rIENvbnRlbnRQcm92aWRlciNvcGVuQXNzZXRGaWxlIENvbnRlbnRQcm92aWRlci5vcGVuQXNzZXRGaWxlfS4KKyAgICAgKiBOb3RlIHRoYXQgdGhpcyA8ZW0+ZG9lcyBub3Q8L2VtPgorICAgICAqIHRha2UgY2FyZSBvZiBub24tY29udGVudDogVVJJcyBzdWNoIGFzIGZpbGU6LiAgSXQgaXMgc3Ryb25nbHkgcmVjb21tZW5kZWQKKyAgICAgKiB5b3UgdXNlIHRoZSB7QGxpbmsgQ29udGVudFJlc29sdmVyI29wZW5Bc3NldEZpbGVEZXNjcmlwdG9yCisgICAgICogQ29udGVudFJlc29sdmVyLm9wZW5Bc3NldEZpbGVEZXNjcmlwdG9yfSBBUEkgaW5zdGVhZC4KKyAgICAgKi8KICAgICBwdWJsaWMgQXNzZXRGaWxlRGVzY3JpcHRvciBvcGVuQXNzZXRGaWxlKFVyaSB1cmwsIFN0cmluZyBtb2RlKQogICAgICAgICAgICAgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiwgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKICAgICAgICAgcmV0dXJuIG1Db250ZW50UHJvdmlkZXIub3BlbkFzc2V0RmlsZSh1cmwsIG1vZGUpOwogICAgIH0KIAotICAgICAvKiogc2VlIHtAbGluayBDb250ZW50UHJvdmlkZXIjYXBwbHlCYXRjaH0gKi8KKyAgICAvKiogU2VlIHtAbGluayBDb250ZW50UHJvdmlkZXIjb3BlblR5cGVkQXNzZXRGaWxlIENvbnRlbnRQcm92aWRlci5vcGVuVHlwZWRBc3NldEZpbGV9ICovCisgICAgcHVibGljIGZpbmFsIEFzc2V0RmlsZURlc2NyaXB0b3Igb3BlblR5cGVkQXNzZXRGaWxlRGVzY3JpcHRvcihVcmkgdXJpLAorICAgICAgICAgICAgU3RyaW5nIG1pbWVUeXBlLCBCdW5kbGUgb3B0cykKKyAgICAgICAgICAgIHRocm93cyBSZW1vdGVFeGNlcHRpb24sIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBtQ29udGVudFByb3ZpZGVyLm9wZW5UeXBlZEFzc2V0RmlsZSh1cmksIG1pbWVUeXBlLCBvcHRzKTsKKyAgICB9CisKKyAgICAvKiogU2VlIHtAbGluayBDb250ZW50UHJvdmlkZXIjYXBwbHlCYXRjaCBDb250ZW50UHJvdmlkZXIuYXBwbHlCYXRjaH0gKi8KICAgICBwdWJsaWMgQ29udGVudFByb3ZpZGVyUmVzdWx0W10gYXBwbHlCYXRjaChBcnJheUxpc3Q8Q29udGVudFByb3ZpZGVyT3BlcmF0aW9uPiBvcGVyYXRpb25zKQogICAgICAgICAgICAgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiwgT3BlcmF0aW9uQXBwbGljYXRpb25FeGNlcHRpb24gewogICAgICAgICByZXR1cm4gbUNvbnRlbnRQcm92aWRlci5hcHBseUJhdGNoKG9wZXJhdGlvbnMpOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Db250ZW50UHJvdmlkZXJOYXRpdmUuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ29udGVudFByb3ZpZGVyTmF0aXZlLmphdmEKaW5kZXggZmRiM2QyMC4uZDFhYjhkNSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Db250ZW50UHJvdmlkZXJOYXRpdmUuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NvbnRlbnRQcm92aWRlck5hdGl2ZS5qYXZhCkBAIC0yNTcsNiArMjU3LDM4IEBACiAgICAgICAgICAgICAgICAgICAgIHJlcGx5LndyaXRlQnVuZGxlKHJlc3BvbnNlQnVuZGxlKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBHRVRfU1RSRUFNX1RZUEVTX1RSQU5TQUNUSU9OOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZGF0YS5lbmZvcmNlSW50ZXJmYWNlKElDb250ZW50UHJvdmlkZXIuZGVzY3JpcHRvcik7CisgICAgICAgICAgICAgICAgICAgIFVyaSB1cmwgPSBVcmkuQ1JFQVRPUi5jcmVhdGVGcm9tUGFyY2VsKGRhdGEpOworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbWltZVR5cGVGaWx0ZXIgPSBkYXRhLnJlYWRTdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gdHlwZXMgPSBnZXRTdHJlYW1UeXBlcyh1cmwsIG1pbWVUeXBlRmlsdGVyKTsKKyAgICAgICAgICAgICAgICAgICAgcmVwbHkud3JpdGVOb0V4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgICAgICByZXBseS53cml0ZVN0cmluZ0FycmF5KHR5cGVzKTsKKworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIE9QRU5fVFlQRURfQVNTRVRfRklMRV9UUkFOU0FDVElPTjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGRhdGEuZW5mb3JjZUludGVyZmFjZShJQ29udGVudFByb3ZpZGVyLmRlc2NyaXB0b3IpOworICAgICAgICAgICAgICAgICAgICBVcmkgdXJsID0gVXJpLkNSRUFUT1IuY3JlYXRlRnJvbVBhcmNlbChkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1pbWVUeXBlID0gZGF0YS5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgIEJ1bmRsZSBvcHRzID0gZGF0YS5yZWFkQnVuZGxlKCk7CisKKyAgICAgICAgICAgICAgICAgICAgQXNzZXRGaWxlRGVzY3JpcHRvciBmZDsKKyAgICAgICAgICAgICAgICAgICAgZmQgPSBvcGVuVHlwZWRBc3NldEZpbGUodXJsLCBtaW1lVHlwZSwgb3B0cyk7CisgICAgICAgICAgICAgICAgICAgIHJlcGx5LndyaXRlTm9FeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZkICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5LndyaXRlSW50KDEpOworICAgICAgICAgICAgICAgICAgICAgICAgZmQud3JpdGVUb1BhcmNlbChyZXBseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyY2VsYWJsZS5QQVJDRUxBQkxFX1dSSVRFX1JFVFVSTl9WQUxVRSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXBseS53cml0ZUludCgwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLndyaXRlRXhjZXB0aW9uVG9QYXJjZWwocmVwbHksIGUpOwpAQCAtNTY4LDUgKzYwMCw1MCBAQAogICAgICAgICByZXR1cm4gYnVuZGxlOwogICAgIH0KIAorICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRTdHJlYW1UeXBlcyhVcmkgdXJsLCBTdHJpbmcgbWltZVR5cGVGaWx0ZXIpIHRocm93cyBSZW1vdGVFeGNlcHRpb24KKyAgICB7CisgICAgICAgIFBhcmNlbCBkYXRhID0gUGFyY2VsLm9idGFpbigpOworICAgICAgICBQYXJjZWwgcmVwbHkgPSBQYXJjZWwub2J0YWluKCk7CisKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElDb250ZW50UHJvdmlkZXIuZGVzY3JpcHRvcik7CisKKyAgICAgICAgdXJsLndyaXRlVG9QYXJjZWwoZGF0YSwgMCk7CisgICAgICAgIGRhdGEud3JpdGVTdHJpbmcobWltZVR5cGVGaWx0ZXIpOworCisgICAgICAgIG1SZW1vdGUudHJhbnNhY3QoSUNvbnRlbnRQcm92aWRlci5HRVRfU1RSRUFNX1RZUEVTX1RSQU5TQUNUSU9OLCBkYXRhLCByZXBseSwgMCk7CisKKyAgICAgICAgRGF0YWJhc2VVdGlscy5yZWFkRXhjZXB0aW9uRnJvbVBhcmNlbChyZXBseSk7CisgICAgICAgIFN0cmluZ1tdIG91dCA9IHJlcGx5LmNyZWF0ZVN0cmluZ0FycmF5KCk7CisKKyAgICAgICAgZGF0YS5yZWN5Y2xlKCk7CisgICAgICAgIHJlcGx5LnJlY3ljbGUoKTsKKworICAgICAgICByZXR1cm4gb3V0OworICAgIH0KKworICAgIHB1YmxpYyBBc3NldEZpbGVEZXNjcmlwdG9yIG9wZW5UeXBlZEFzc2V0RmlsZShVcmkgdXJsLCBTdHJpbmcgbWltZVR5cGUsIEJ1bmRsZSBvcHRzKQorICAgICAgICAgICAgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiwgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgICAgUGFyY2VsIGRhdGEgPSBQYXJjZWwub2J0YWluKCk7CisgICAgICAgIFBhcmNlbCByZXBseSA9IFBhcmNlbC5vYnRhaW4oKTsKKworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUNvbnRlbnRQcm92aWRlci5kZXNjcmlwdG9yKTsKKworICAgICAgICB1cmwud3JpdGVUb1BhcmNlbChkYXRhLCAwKTsKKyAgICAgICAgZGF0YS53cml0ZVN0cmluZyhtaW1lVHlwZSk7CisgICAgICAgIGRhdGEud3JpdGVCdW5kbGUob3B0cyk7CisKKyAgICAgICAgbVJlbW90ZS50cmFuc2FjdChJQ29udGVudFByb3ZpZGVyLk9QRU5fVFlQRURfQVNTRVRfRklMRV9UUkFOU0FDVElPTiwgZGF0YSwgcmVwbHksIDApOworCisgICAgICAgIERhdGFiYXNlVXRpbHMucmVhZEV4Y2VwdGlvbldpdGhGaWxlTm90Rm91bmRFeGNlcHRpb25Gcm9tUGFyY2VsKHJlcGx5KTsKKyAgICAgICAgaW50IGhhcyA9IHJlcGx5LnJlYWRJbnQoKTsKKyAgICAgICAgQXNzZXRGaWxlRGVzY3JpcHRvciBmZCA9IGhhcyAhPSAwCisgICAgICAgICAgICAgICAgPyBBc3NldEZpbGVEZXNjcmlwdG9yLkNSRUFUT1IuY3JlYXRlRnJvbVBhcmNlbChyZXBseSkgOiBudWxsOworCisgICAgICAgIGRhdGEucmVjeWNsZSgpOworICAgICAgICByZXBseS5yZWN5Y2xlKCk7CisKKyAgICAgICAgcmV0dXJuIGZkOworICAgIH0KKwogICAgIHByaXZhdGUgSUJpbmRlciBtUmVtb3RlOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Db250ZW50UXVlcnlNYXAuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ29udGVudFF1ZXJ5TWFwLmphdmEKaW5kZXggZGJjYjRhNy4uYzk1NTA5NCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Db250ZW50UXVlcnlNYXAuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NvbnRlbnRRdWVyeU1hcC5qYXZhCkBAIC0xMjksNyArMTI5LDkgQEAKICAgICAvKiogUmVxdWVyaWVzIHRoZSBjdXJzb3IgYW5kIHJlYWRzIHRoZSBjb250ZW50cyBpbnRvIHRoZSBjYWNoZSAqLwogICAgIHB1YmxpYyB2b2lkIHJlcXVlcnkoKSB7CiAgICAgICAgIG1EaXJ0eSA9IGZhbHNlOwotICAgICAgICBtQ3Vyc29yLnJlcXVlcnkoKTsKKyAgICAgICAgaWYgKCFtQ3Vyc29yLnJlcXVlcnkoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigidHJ5aW5nIHRvIHJlcXVlcnkgYW4gYWxyZWFkeSBjbG9zZWQgY3Vyc29yIik7CisgICAgICAgIH0KICAgICAgICAgcmVhZEN1cnNvckludG9DYWNoZSgpOwogICAgICAgICBzZXRDaGFuZ2VkKCk7CiAgICAgICAgIG5vdGlmeU9ic2VydmVycygpOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Db250ZW50UmVzb2x2ZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ29udGVudFJlc29sdmVyLmphdmEKaW5kZXggNjlmNzYxMS4uMjJmZWI5YSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Db250ZW50UmVzb2x2ZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NvbnRlbnRSZXNvbHZlci5qYXZhCkBAIC00NCw5ICs0NCw5IEBACiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogCiAKIC8qKgpAQCAtMTg2LDggKzE4Niw3IEBACiAgICAgICogdXNpbmcgdGhlIGNvbnRlbnQ6Ly8gc2NoZW1lLgogICAgICAqIEByZXR1cm4gQSBNSU1FIHR5cGUgZm9yIHRoZSBjb250ZW50LCBvciBudWxsIGlmIHRoZSBVUkwgaXMgaW52YWxpZCBvciB0aGUgdHlwZSBpcyB1bmtub3duCiAgICAgICovCi0gICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRUeXBlKFVyaSB1cmwpCi0gICAgeworICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0VHlwZShVcmkgdXJsKSB7CiAgICAgICAgIElDb250ZW50UHJvdmlkZXIgcHJvdmlkZXIgPSBhY3F1aXJlUHJvdmlkZXIodXJsKTsKICAgICAgICAgaWYgKHByb3ZpZGVyID09IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybiBudWxsOwpAQCAtMjA0LDYgKzIwMywzOSBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFF1ZXJ5IGZvciB0aGUgcG9zc2libGUgTUlNRSB0eXBlcyBmb3IgdGhlIHJlcHJlc2VudGF0aW9ucyB0aGUgZ2l2ZW4KKyAgICAgKiBjb250ZW50IFVSTCBjYW4gYmUgcmV0dXJuZWQgd2hlbiBvcGVuZWQgYXMgYXMgc3RyZWFtIHdpdGgKKyAgICAgKiB7QGxpbmsgI29wZW5UeXBlZEFzc2V0RmlsZURlc2NyaXB0b3J9LiAgTm90ZSB0aGF0IHRoZSB0eXBlcyBoZXJlIGFyZQorICAgICAqIG5vdCBuZWNlc3NhcmlseSBhIHN1cGVyc2V0IG9mIHRoZSB0eXBlIHJldHVybmVkIGJ5IHtAbGluayAjZ2V0VHlwZX0gLS0KKyAgICAgKiBtYW55IGNvbnRlbnQgcHJvdmlkZXJzIGNhbiBub3QgcmV0dXJuIGEgcmF3IHN0cmVhbSBmb3IgdGhlIHN0cnVjdHVyZWQKKyAgICAgKiBkYXRhIHRoYXQgdGhleSBjb250YWluLgorICAgICAqCisgICAgICogQHBhcmFtIHVybCBBIFVyaSBpZGVudGlmeWluZyBjb250ZW50IChlaXRoZXIgYSBsaXN0IG9yIHNwZWNpZmljIHR5cGUpLAorICAgICAqIHVzaW5nIHRoZSBjb250ZW50Oi8vIHNjaGVtZS4KKyAgICAgKiBAcGFyYW0gbWltZVR5cGVGaWx0ZXIgVGhlIGRlc2lyZWQgTUlNRSB0eXBlLiAgVGhpcyBtYXkgYmUgYSBwYXR0ZXJuLAorICAgICAqIHN1Y2ggYXMgKlwvKiwgdG8gcXVlcnkgZm9yIGFsbCBhdmFpbGFibGUgTUlNRSB0eXBlcyB0aGF0IG1hdGNoIHRoZQorICAgICAqIHBhdHRlcm4uCisgICAgICogQHJldHVybiBSZXR1cm5zIGFuIGFycmF5IG9mIE1JTUUgdHlwZSBzdHJpbmdzIGZvciBhbGwgYXZhaWxhYmxsZQorICAgICAqIGRhdGEgc3RyZWFtcyB0aGF0IG1hdGNoIHRoZSBnaXZlbiBtaW1lVHlwZUZpbHRlci4gIElmIHRoZXJlIGFyZSBub25lLAorICAgICAqIG51bGwgaXMgcmV0dXJuZWQuCisgICAgICovCisgICAgcHVibGljIFN0cmluZ1tdIGdldFN0cmVhbVR5cGVzKFVyaSB1cmwsIFN0cmluZyBtaW1lVHlwZUZpbHRlcikgeworICAgICAgICBJQ29udGVudFByb3ZpZGVyIHByb3ZpZGVyID0gYWNxdWlyZVByb3ZpZGVyKHVybCk7CisgICAgICAgIGlmIChwcm92aWRlciA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIHByb3ZpZGVyLmdldFN0cmVhbVR5cGVzKHVybCwgbWltZVR5cGVGaWx0ZXIpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0gY2F0Y2ggKGphdmEubGFuZy5FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICByZWxlYXNlUHJvdmlkZXIocHJvdmlkZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCiAgICAgICogPHA+CiAgICAgICogUXVlcnkgdGhlIGdpdmVuIFVSSSwgcmV0dXJuaW5nIGEge0BsaW5rIEN1cnNvcn0gb3ZlciB0aGUgcmVzdWx0IHNldC4KICAgICAgKiA8L3A+CkBAIC0zNDksNyArMzgxLDcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBPcGVuIGEgcmF3IGZpbGUgZGVzY3JpcHRvciB0byBhY2Nlc3MgZGF0YSB1bmRlciBhICJjb250ZW50OiIgVVJJLiAgVGhpcworICAgICAqIE9wZW4gYSByYXcgZmlsZSBkZXNjcmlwdG9yIHRvIGFjY2VzcyBkYXRhIHVuZGVyIGEgVVJJLiAgVGhpcwogICAgICAqIGlzIGxpa2Uge0BsaW5rICNvcGVuQXNzZXRGaWxlRGVzY3JpcHRvcihVcmksIFN0cmluZyl9LCBidXQgdXNlcyB0aGUKICAgICAgKiB1bmRlcmx5aW5nIHtAbGluayBDb250ZW50UHJvdmlkZXIjb3BlbkZpbGV9CiAgICAgICogQ29udGVudFByb3ZpZGVyLm9wZW5GaWxlKCl9IG1ldGhvZCwgc28gd2lsbCA8ZW0+bm90PC9lbT4gd29yayB3aXRoCkBAIC0zOTksMTAgKzQzMSw5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogT3BlbiBhIHJhdyBmaWxlIGRlc2NyaXB0b3IgdG8gYWNjZXNzIGRhdGEgdW5kZXIgYSAiY29udGVudDoiIFVSSS4gIFRoaXMKKyAgICAgKiBPcGVuIGEgcmF3IGZpbGUgZGVzY3JpcHRvciB0byBhY2Nlc3MgZGF0YSB1bmRlciBhIFVSSS4gIFRoaXMKICAgICAgKiBpbnRlcmFjdHMgd2l0aCB0aGUgdW5kZXJseWluZyB7QGxpbmsgQ29udGVudFByb3ZpZGVyI29wZW5Bc3NldEZpbGV9Ci0gICAgICogQ29udGVudFByb3ZpZGVyLm9wZW5Bc3NldEZpbGUoKX0gbWV0aG9kIG9mIHRoZSBwcm92aWRlciBhc3NvY2lhdGVkIHdpdGggdGhlCi0gICAgICogZ2l2ZW4gVVJJLCB0byByZXRyaWV2ZSBhbnkgZmlsZSBzdG9yZWQgdGhlcmUuCisgICAgICogbWV0aG9kIG9mIHRoZSBwcm92aWRlciBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIFVSSSwgdG8gcmV0cmlldmUgYW55IGZpbGUgc3RvcmVkIHRoZXJlLgogICAgICAqCiAgICAgICogPGg1PkFjY2VwdHMgdGhlIGZvbGxvd2luZyBVUkkgc2NoZW1lczo8L2g1PgogICAgICAqIDx1bD4KQEAgLTQzNCw2ICs0NjUsMTEgQEAKICAgICAgKiA8L2xpPgogICAgICAqIDwvdWw+CiAgICAgICoKKyAgICAgKiA8cD5Ob3RlIHRoYXQgaWYgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIHJlYWQtb25seSBpbnB1dCAobW9kZSBpcyAiciIpCisgICAgICogb24gYSBjb250ZW50OiBVUkksIGl0IHdpbGwgaW5zdGVhZCBjYWxsIHtAbGluayAjb3BlblR5cGVkQXNzZXRGaWxlRGVzY3JpcHRvcn0KKyAgICAgKiBmb3IgeW91IHdpdGggYSBNSU1FIHR5cGUgb2YgIipcLyoiLiAgVGhpcyBhbGxvd3Mgc3VjaCBjYWxsZXJzIHRvIGJlbmVmaXQKKyAgICAgKiBmcm9tIGFueSBidWlsdC1pbiBkYXRhIGNvbnZlcnNpb24gdGhhdCBhIHByb3ZpZGVyIGltcGxlbWVudHMuCisgICAgICoKICAgICAgKiBAcGFyYW0gdXJpIFRoZSBkZXNpcmVkIFVSSSB0byBvcGVuLgogICAgICAqIEBwYXJhbSBtb2RlIFRoZSBmaWxlIG1vZGUgdG8gdXNlLCBhcyBwZXIge0BsaW5rIENvbnRlbnRQcm92aWRlciNvcGVuQXNzZXRGaWxlCiAgICAgICogQ29udGVudFByb3ZpZGVyLm9wZW5Bc3NldEZpbGV9LgpAQCAtNDYwLDI5ICs0OTYsOTcgQEAKICAgICAgICAgICAgICAgICAgICAgbmV3IEZpbGUodXJpLmdldFBhdGgoKSksIG1vZGVUb01vZGUodXJpLCBtb2RlKSk7CiAgICAgICAgICAgICByZXR1cm4gbmV3IEFzc2V0RmlsZURlc2NyaXB0b3IocGZkLCAwLCAtMSk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBJQ29udGVudFByb3ZpZGVyIHByb3ZpZGVyID0gYWNxdWlyZVByb3ZpZGVyKHVyaSk7Ci0gICAgICAgICAgICBpZiAocHJvdmlkZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24oIk5vIGNvbnRlbnQgcHJvdmlkZXI6ICIgKyB1cmkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBBc3NldEZpbGVEZXNjcmlwdG9yIGZkID0gcHJvdmlkZXIub3BlbkFzc2V0RmlsZSh1cmksIG1vZGUpOwotICAgICAgICAgICAgICAgIGlmKGZkID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVsZWFzZVByb3ZpZGVyKHByb3ZpZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICBpZiAoInIiLmVxdWFscyhtb2RlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBvcGVuVHlwZWRBc3NldEZpbGVEZXNjcmlwdG9yKHVyaSwgIiovKiIsIG51bGwpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBJQ29udGVudFByb3ZpZGVyIHByb3ZpZGVyID0gYWNxdWlyZVByb3ZpZGVyKHVyaSk7CisgICAgICAgICAgICAgICAgaWYgKHByb3ZpZGVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbigiTm8gY29udGVudCBwcm92aWRlcjogIiArIHVyaSk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFBhcmNlbEZpbGVEZXNjcmlwdG9yIHBmZCA9IG5ldyBQYXJjZWxGaWxlRGVzY3JpcHRvcklubmVyKAotICAgICAgICAgICAgICAgICAgICAgICAgZmQuZ2V0UGFyY2VsRmlsZURlc2NyaXB0b3IoKSwgcHJvdmlkZXIpOwotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQXNzZXRGaWxlRGVzY3JpcHRvcihwZmQsIGZkLmdldFN0YXJ0T2Zmc2V0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICBmZC5nZXREZWNsYXJlZExlbmd0aCgpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgQXNzZXRGaWxlRGVzY3JpcHRvciBmZCA9IHByb3ZpZGVyLm9wZW5Bc3NldEZpbGUodXJpLCBtb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYoZmQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVsZWFzZVByb3ZpZGVyKHByb3ZpZGVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIFBhcmNlbEZpbGVEZXNjcmlwdG9yIHBmZCA9IG5ldyBQYXJjZWxGaWxlRGVzY3JpcHRvcklubmVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZkLmdldFBhcmNlbEZpbGVEZXNjcmlwdG9yKCksIHByb3ZpZGVyKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBTdWNjZXNzISAgRG9uJ3QgcmVsZWFzZSB0aGUgcHJvdmlkZXIgd2hlbiBleGl0aW5nLCBsZXQKKyAgICAgICAgICAgICAgICAgICAgLy8gUGFyY2VsRmlsZURlc2NyaXB0b3JJbm5lciBkbyB0aGF0IHdoZW4gaXQgaXMgY2xvc2VkLgorICAgICAgICAgICAgICAgICAgICBwcm92aWRlciA9IG51bGw7CisKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBc3NldEZpbGVEZXNjcmlwdG9yKHBmZCwgZmQuZ2V0U3RhcnRPZmZzZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZC5nZXREZWNsYXJlZExlbmd0aCgpKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKCJEZWFkIGNvbnRlbnQgcHJvdmlkZXI6ICIgKyB1cmkpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHByb3ZpZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlbGVhc2VQcm92aWRlcihwcm92aWRlcik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPcGVuIGEgcmF3IGZpbGUgZGVzY3JpcHRvciB0byBhY2Nlc3MgKHBvdGVudGlhbGx5IHR5cGUgdHJhbnNmb3JtZWQpCisgICAgICogZGF0YSBmcm9tIGEgImNvbnRlbnQ6IiBVUkkuICBUaGlzIGludGVyYWN0cyB3aXRoIHRoZSB1bmRlcmx5aW5nCisgICAgICoge0BsaW5rIENvbnRlbnRQcm92aWRlciNvcGVuVHlwZWRBc3NldEZpbGV9IG1ldGhvZCBvZiB0aGUgcHJvdmlkZXIKKyAgICAgKiBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIFVSSSwgdG8gcmV0cmlldmUgcmV0cmlldmUgYW55IGFwcHJvcHJpYXRlCisgICAgICogZGF0YSBzdHJlYW0gZm9yIHRoZSBkYXRhIHN0b3JlZCB0aGVyZS4KKyAgICAgKgorICAgICAqIDxwPlVubGlrZSB7QGxpbmsgI29wZW5Bc3NldEZpbGVEZXNjcmlwdG9yfSwgdGhpcyBmdW5jdGlvbiBvbmx5IHdvcmtzCisgICAgICogd2l0aCAiY29udGVudDoiIFVSSXMsIGJlY2F1c2UgY29udGVudCBwcm92aWRlcnMgYXJlIHRoZSBvbmx5IGZhY2lsaXR5CisgICAgICogd2l0aCBhbiBhc3NvY2lhdGVkIE1JTUUgdHlwZSB0byBlbnN1cmUgdGhhdCB0aGUgcmV0dXJuZWQgZGF0YSBzdHJlYW0KKyAgICAgKiBpcyBvZiB0aGUgZGVzaXJlZCB0eXBlLgorICAgICAqCisgICAgICogPHA+QWxsIHRleHQvKiBzdHJlYW1zIGFyZSBlbmNvZGVkIGluIFVURi04LgorICAgICAqCisgICAgICogQHBhcmFtIHVyaSBUaGUgZGVzaXJlZCBVUkkgdG8gb3Blbi4KKyAgICAgKiBAcGFyYW0gbWltZVR5cGUgVGhlIGRlc2lyZWQgTUlNRSB0eXBlIG9mIHRoZSByZXR1cm5lZCBkYXRhLiAgVGhpcyBjYW4KKyAgICAgKiBiZSBhIHBhdHRlcm4gc3VjaCBhcyAqXC8qLCB3aGljaCB3aWxsIGFsbG93IHRoZSBjb250ZW50IHByb3ZpZGVyIHRvCisgICAgICogc2VsZWN0IGEgdHlwZSwgdGhvdWdoIHRoZXJlIGlzIG5vIHdheSBmb3IgeW91IHRvIGRldGVybWluZSB3aGF0IHR5cGUKKyAgICAgKiBpdCBpcyByZXR1cm5pbmcuCisgICAgICogQHBhcmFtIG9wdHMgQWRkaXRpb25hbCBwcm92aWRlci1kZXBlbmRlbnQgb3B0aW9ucy4KKyAgICAgKiBAcmV0dXJuIFJldHVybnMgYSBuZXcgUGFyY2VsRmlsZURlc2NyaXB0b3IgZnJvbSB3aGljaCB5b3UgY2FuIHJlYWQgdGhlCisgICAgICogZGF0YSBzdHJlYW0gZnJvbSB0aGUgcHJvdmlkZXIuICBOb3RlIHRoYXQgdGhpcyBtYXkgYmUgYSBwaXBlLCBtZWFuaW5nCisgICAgICogeW91IGNhbid0IHNlZWsgaW4gaXQuICBUaGUgb25seSBzZWVrIHlvdSBzaG91bGQgZG8gaXMgaWYgdGhlCisgICAgICogQXNzZXRGaWxlRGVzY3JpcHRvciBjb250YWlucyBhbiBvZmZzZXQsIHRvIG1vdmUgdG8gdGhhdCBvZmZzZXQgYmVmb3JlCisgICAgICogcmVhZGluZy4gIFlvdSBvd24gdGhpcyBkZXNjcmlwdG9yIGFuZCBhcmUgcmVzcG9uc2libGUgZm9yIGNsb3NpbmcgaXQgd2hlbiBkb25lLgorICAgICAqIEB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIFRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24gb2Ygbm8KKyAgICAgKiBkYXRhIG9mIHRoZSBkZXNpcmVkIHR5cGUgZXhpc3RzIHVuZGVyIHRoZSBVUkkuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIEFzc2V0RmlsZURlc2NyaXB0b3Igb3BlblR5cGVkQXNzZXRGaWxlRGVzY3JpcHRvcihVcmkgdXJpLAorICAgICAgICAgICAgU3RyaW5nIG1pbWVUeXBlLCBCdW5kbGUgb3B0cykgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgIElDb250ZW50UHJvdmlkZXIgcHJvdmlkZXIgPSBhY3F1aXJlUHJvdmlkZXIodXJpKTsKKyAgICAgICAgaWYgKHByb3ZpZGVyID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24oIk5vIGNvbnRlbnQgcHJvdmlkZXI6ICIgKyB1cmkpOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBBc3NldEZpbGVEZXNjcmlwdG9yIGZkID0gcHJvdmlkZXIub3BlblR5cGVkQXNzZXRGaWxlKHVyaSwgbWltZVR5cGUsIG9wdHMpOworICAgICAgICAgICAgaWYgKGZkID09IG51bGwpIHsKICAgICAgICAgICAgICAgICByZWxlYXNlUHJvdmlkZXIocHJvdmlkZXIpOwotICAgICAgICAgICAgICAgIHRocm93IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24oIkRlYWQgY29udGVudCBwcm92aWRlcjogIiArIHVyaSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUGFyY2VsRmlsZURlc2NyaXB0b3IgcGZkID0gbmV3IFBhcmNlbEZpbGVEZXNjcmlwdG9ySW5uZXIoCisgICAgICAgICAgICAgICAgICAgIGZkLmdldFBhcmNlbEZpbGVEZXNjcmlwdG9yKCksIHByb3ZpZGVyKTsKKworICAgICAgICAgICAgLy8gU3VjY2VzcyEgIERvbid0IHJlbGVhc2UgdGhlIHByb3ZpZGVyIHdoZW4gZXhpdGluZywgbGV0CisgICAgICAgICAgICAvLyBQYXJjZWxGaWxlRGVzY3JpcHRvcklubmVyIGRvIHRoYXQgd2hlbiBpdCBpcyBjbG9zZWQuCisgICAgICAgICAgICBwcm92aWRlciA9IG51bGw7CisKKyAgICAgICAgICAgIHJldHVybiBuZXcgQXNzZXRGaWxlRGVzY3JpcHRvcihwZmQsIGZkLmdldFN0YXJ0T2Zmc2V0KCksCisgICAgICAgICAgICAgICAgICAgIGZkLmdldERlY2xhcmVkTGVuZ3RoKCkpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbigiRGVhZCBjb250ZW50IHByb3ZpZGVyOiAiICsgdXJpKTsKKyAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAocHJvdmlkZXIgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIHJlbGVhc2VQcm92aWRlcihwcm92aWRlcik7Ci0gICAgICAgICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHJlbGVhc2VQcm92aWRlcihwcm92aWRlcik7Ci0gICAgICAgICAgICAgICAgdGhyb3cgZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTEzNDIsNyArMTQ0Niw3IEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBDdXJzb3JXcmFwcGVySW5uZXIgZXh0ZW5kcyBDdXJzb3JXcmFwcGVyIHsKLSAgICAgICAgcHJpdmF0ZSBJQ29udGVudFByb3ZpZGVyIG1Db250ZW50UHJvdmlkZXI7CisgICAgICAgIHByaXZhdGUgZmluYWwgSUNvbnRlbnRQcm92aWRlciBtQ29udGVudFByb3ZpZGVyOwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUc9IkN1cnNvcldyYXBwZXJJbm5lciI7CiAgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtQ2xvc2VGbGFnID0gZmFsc2U7CiAKQEAgLTEzNzEsNyArMTQ3NSw3IEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBQYXJjZWxGaWxlRGVzY3JpcHRvcklubmVyIGV4dGVuZHMgUGFyY2VsRmlsZURlc2NyaXB0b3IgewotICAgICAgICBwcml2YXRlIElDb250ZW50UHJvdmlkZXIgbUNvbnRlbnRQcm92aWRlcjsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBJQ29udGVudFByb3ZpZGVyIG1Db250ZW50UHJvdmlkZXI7CiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRz0iUGFyY2VsRmlsZURlc2NyaXB0b3JJbm5lciI7CiAgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtUmVsZWFzZVByb3ZpZGVyRmxhZyA9IGZhbHNlOwogCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NvbnRlbnRWYWx1ZXMuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ29udGVudFZhbHVlcy5qYXZhCmluZGV4IDc1Nzg3Y2QuLmNlMDQ3ZjYgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ29udGVudFZhbHVlcy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ29udGVudFZhbHVlcy5qYXZhCkBAIC00NDYsNiArNDQ2LDE1IEBACiAgICAgICAgIHJldHVybiBtVmFsdWVzLmVudHJ5U2V0KCk7CiAgICAgfQogCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHNldCBvZiBhbGwgb2YgdGhlIGtleXMKKyAgICAgKgorICAgICAqIEByZXR1cm4gYSBzZXQgb2YgYWxsIG9mIHRoZSBrZXlzCisgICAgICovCisgICAgcHVibGljIFNldDxTdHJpbmc+IGtleVNldCgpIHsKKyAgICAgICAgcmV0dXJuIG1WYWx1ZXMua2V5U2V0KCk7CisgICAgfQorCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBQYXJjZWxhYmxlLkNyZWF0b3I8Q29udGVudFZhbHVlcz4gQ1JFQVRPUiA9CiAgICAgICAgICAgICBuZXcgUGFyY2VsYWJsZS5DcmVhdG9yPENvbnRlbnRWYWx1ZXM+KCkgewogICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncyh7ImRlcHJlY2F0aW9uIiwgInVuY2hlY2tlZCJ9KQpAQCAtNDg4LDYgKzQ5NywxMCBAQAogICAgICAgICByZXR1cm4gKEFycmF5TGlzdDxTdHJpbmc+KSBtVmFsdWVzLmdldChrZXkpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIFJldHVybnMgYSBzdHJpbmcgY29udGFpbmluZyBhIGNvbmNpc2UsIGh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIHRoaXMgb2JqZWN0LgorICAgICAqIEByZXR1cm4gYSBwcmludGFibGUgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QuCisgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NvbnRleHQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ29udGV4dC5qYXZhCmluZGV4IDAxMDA1NTAuLjNkMjkzNzkgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ29udGV4dC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ29udGV4dC5qYXZhCkBAIC0yMSwxMCArMjEsMTIgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkFzc2V0TWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5EYXRhYmFzZUVycm9ySGFuZGxlcjsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZTsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZS5DdXJzb3JGYWN0b3J5OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVNjYW5uZXJDb25uZWN0aW9uLk9uU2NhbkNvbXBsZXRlZExpc3RlbmVyOwogaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKIGltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CkBAIC01ODgsNiArNTkwLDMyIEBACiAgICAgICAgICAgICBpbnQgbW9kZSwgQ3Vyc29yRmFjdG9yeSBmYWN0b3J5KTsKIAogICAgIC8qKgorICAgICAqIE9wZW4gYSBuZXcgcHJpdmF0ZSBTUUxpdGVEYXRhYmFzZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBDb250ZXh0J3MKKyAgICAgKiBhcHBsaWNhdGlvbiBwYWNrYWdlLiAgQ3JlYXRlcyB0aGUgZGF0YWJhc2UgZmlsZSBpZiBpdCBkb2Vzbid0IGV4aXN0LgorICAgICAqCisgICAgICogPHA+QWNjZXB0cyBpbnB1dCBwYXJhbTogYSBjb25jcmV0ZSBpbnN0YW5jZSBvZiB7QGxpbmsgRGF0YWJhc2VFcnJvckhhbmRsZXJ9IHRvIGJlCisgICAgICogdXNlZCB0byBoYW5kbGUgY29ycnVwdGlvbiB3aGVuIHNxbGl0ZSByZXBvcnRzIGRhdGFiYXNlIGNvcnJ1cHRpb24uPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgKHVuaXF1ZSBpbiB0aGUgYXBwbGljYXRpb24gcGFja2FnZSkgb2YgdGhlIGRhdGFiYXNlLgorICAgICAqIEBwYXJhbSBtb2RlIE9wZXJhdGluZyBtb2RlLiAgVXNlIDAgb3Ige0BsaW5rICNNT0RFX1BSSVZBVEV9IGZvciB0aGUKKyAgICAgKiAgICAgZGVmYXVsdCBvcGVyYXRpb24sIHtAbGluayAjTU9ERV9XT1JMRF9SRUFEQUJMRX0KKyAgICAgKiAgICAgYW5kIHtAbGluayAjTU9ERV9XT1JMRF9XUklURUFCTEV9IHRvIGNvbnRyb2wgcGVybWlzc2lvbnMuCisgICAgICogQHBhcmFtIGZhY3RvcnkgQW4gb3B0aW9uYWwgZmFjdG9yeSBjbGFzcyB0aGF0IGlzIGNhbGxlZCB0byBpbnN0YW50aWF0ZSBhCisgICAgICogICAgIGN1cnNvciB3aGVuIHF1ZXJ5IGlzIGNhbGxlZC4KKyAgICAgKiBAcGFyYW0gZXJyb3JIYW5kbGVyIHRoZSB7QGxpbmsgRGF0YWJhc2VFcnJvckhhbmRsZXJ9IHRvIGJlIHVzZWQgd2hlbiBzcWxpdGUgcmVwb3J0cyBkYXRhYmFzZQorICAgICAqIGNvcnJ1cHRpb24uIGlmIG51bGwsIHtAbGluayBhbmRyb2lkLmRhdGFiYXNlLkRlZmF1bHREYXRhYmFzZUVycm9ySGFuZGxlcn0gaXMgYXNzdW1lZC4KKyAgICAgKiBAcmV0dXJuIFRoZSBjb250ZW50cyBvZiBhIG5ld2x5IGNyZWF0ZWQgZGF0YWJhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KKyAgICAgKiBAdGhyb3dzIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZUV4Y2VwdGlvbiBpZiB0aGUgZGF0YWJhc2UgZmlsZSBjb3VsZCBub3QgYmUgb3BlbmVkLgorICAgICAqCisgICAgICogQHNlZSAjTU9ERV9QUklWQVRFCisgICAgICogQHNlZSAjTU9ERV9XT1JMRF9SRUFEQUJMRQorICAgICAqIEBzZWUgI01PREVfV09STERfV1JJVEVBQkxFCisgICAgICogQHNlZSAjZGVsZXRlRGF0YWJhc2UKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgU1FMaXRlRGF0YWJhc2Ugb3Blbk9yQ3JlYXRlRGF0YWJhc2UoU3RyaW5nIG5hbWUsCisgICAgICAgICAgICBpbnQgbW9kZSwgQ3Vyc29yRmFjdG9yeSBmYWN0b3J5LCBEYXRhYmFzZUVycm9ySGFuZGxlciBlcnJvckhhbmRsZXIpOworCisgICAgLyoqCiAgICAgICogRGVsZXRlIGFuIGV4aXN0aW5nIHByaXZhdGUgU1FMaXRlRGF0YWJhc2UgYXNzb2NpYXRlZCB3aXRoIHRoaXMgQ29udGV4dCdzCiAgICAgICogYXBwbGljYXRpb24gcGFja2FnZS4KICAgICAgKgpAQCAtMTM1Niw3ICsxMzg0LDE2IEBACiAgICAgICogQHNlZSBhbmRyb2lkLmxvY2F0aW9uLkxvY2F0aW9uTWFuYWdlcgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExPQ0FUSU9OX1NFUlZJQ0UgPSAibG9jYXRpb24iOwotICAgIAorCisgICAgLyoqCisgICAgICogVXNlIHdpdGgge0BsaW5rICNnZXRTeXN0ZW1TZXJ2aWNlfSB0byByZXRyaWV2ZSBhCisgICAgICoge0BsaW5rIGFuZHJvaWQubG9jYXRpb24uQ291bnRyeURldGVjdG9yfSBmb3IgZGV0ZWN0aW5nIHRoZSBjb3VudHJ5IHRoYXQKKyAgICAgKiB0aGUgdXNlciBpcyBpbi4KKyAgICAgKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09VTlRSWV9ERVRFQ1RPUiA9ICJjb3VudHJ5X2RldGVjdG9yIjsKKwogICAgIC8qKgogICAgICAqIFVzZSB3aXRoIHtAbGluayAjZ2V0U3lzdGVtU2VydmljZX0gdG8gcmV0cmlldmUgYSB7QGxpbmsKICAgICAgKiBhbmRyb2lkLmFwcC5TZWFyY2hNYW5hZ2VyfSBmb3IgaGFuZGxpbmcgc2VhcmNoZXMuCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NvbnRleHRXcmFwcGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NvbnRleHRXcmFwcGVyLmphdmEKaW5kZXggYTQ0NzEwOC4uM2Y1ZDIxNSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Db250ZXh0V3JhcHBlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ29udGV4dFdyYXBwZXIuamF2YQpAQCAtMjAsNiArMjAsNyBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkFzc2V0TWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkRhdGFiYXNlRXJyb3JIYW5kbGVyOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlLkN1cnNvckZhY3Rvcnk7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CkBAIC0yMDQsNiArMjA1LDEyIEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNRTGl0ZURhdGFiYXNlIG9wZW5PckNyZWF0ZURhdGFiYXNlKFN0cmluZyBuYW1lLCBpbnQgbW9kZSwgQ3Vyc29yRmFjdG9yeSBmYWN0b3J5LAorICAgICAgICAgICAgRGF0YWJhc2VFcnJvckhhbmRsZXIgZXJyb3JIYW5kbGVyKSB7CisgICAgICAgIHJldHVybiBtQmFzZS5vcGVuT3JDcmVhdGVEYXRhYmFzZShuYW1lLCBtb2RlLCBmYWN0b3J5LCBlcnJvckhhbmRsZXIpOworICAgIH0KKworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGRlbGV0ZURhdGFiYXNlKFN0cmluZyBuYW1lKSB7CiAgICAgICAgIHJldHVybiBtQmFzZS5kZWxldGVEYXRhYmFzZShuYW1lKTsKICAgICB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0N1cnNvckxvYWRlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9DdXJzb3JMb2FkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjU5OWVkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9DdXJzb3JMb2FkZXIuamF2YQpAQCAtMCwwICsxLDE2NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5jb250ZW50OworCitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7CitpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworCisvKioKKyAqIEEgbG9hZGVyIHRoYXQgcXVlcmllcyB0aGUge0BsaW5rIENvbnRlbnRSZXNvbHZlcn0gYW5kIHJldHVybnMgYSB7QGxpbmsgQ3Vyc29yfS4KKyAqLworcHVibGljIGNsYXNzIEN1cnNvckxvYWRlciBleHRlbmRzIEFzeW5jVGFza0xvYWRlcjxDdXJzb3I+IHsKKyAgICBDdXJzb3IgbUN1cnNvcjsKKyAgICBGb3JjZUxvYWRDb250ZW50T2JzZXJ2ZXIgbU9ic2VydmVyOworICAgIGJvb2xlYW4gbVN0b3BwZWQ7CisgICAgVXJpIG1Vcmk7CisgICAgU3RyaW5nW10gbVByb2plY3Rpb247CisgICAgU3RyaW5nIG1TZWxlY3Rpb247CisgICAgU3RyaW5nW10gbVNlbGVjdGlvbkFyZ3M7CisgICAgU3RyaW5nIG1Tb3J0T3JkZXI7CisKKyAgICAvKiBSdW5zIG9uIGEgd29ya2VyIHRocmVhZCAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBDdXJzb3IgbG9hZEluQmFja2dyb3VuZCgpIHsKKyAgICAgICAgQ3Vyc29yIGN1cnNvciA9IGdldENvbnRleHQoKS5nZXRDb250ZW50UmVzb2x2ZXIoKS5xdWVyeShtVXJpLCBtUHJvamVjdGlvbiwgbVNlbGVjdGlvbiwKKyAgICAgICAgICAgICAgICBtU2VsZWN0aW9uQXJncywgbVNvcnRPcmRlcik7CisgICAgICAgIC8vIEVuc3VyZSB0aGUgY3Vyc29yIHdpbmRvdyBpcyBmaWxsZWQKKyAgICAgICAgaWYgKGN1cnNvciAhPSBudWxsKSB7CisgICAgICAgICAgICBjdXJzb3IuZ2V0Q291bnQoKTsKKyAgICAgICAgICAgIGN1cnNvci5yZWdpc3RlckNvbnRlbnRPYnNlcnZlcihtT2JzZXJ2ZXIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJzb3I7CisgICAgfQorCisgICAgLyogUnVucyBvbiB0aGUgVUkgdGhyZWFkICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZGVsaXZlclJlc3VsdChDdXJzb3IgY3Vyc29yKSB7CisgICAgICAgIGlmIChtU3RvcHBlZCkgeworICAgICAgICAgICAgLy8gQW4gYXN5bmMgcXVlcnkgY2FtZSBpbiB3aGlsZSB0aGUgbG9hZGVyIGlzIHN0b3BwZWQKKyAgICAgICAgICAgIGlmIChjdXJzb3IgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGN1cnNvci5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIEN1cnNvciBvbGRDdXJzb3IgPSBtQ3Vyc29yOworICAgICAgICBtQ3Vyc29yID0gY3Vyc29yOworICAgICAgICBzdXBlci5kZWxpdmVyUmVzdWx0KGN1cnNvcik7CisKKyAgICAgICAgaWYgKG9sZEN1cnNvciAhPSBudWxsICYmICFvbGRDdXJzb3IuaXNDbG9zZWQoKSkgeworICAgICAgICAgICAgb2xkQ3Vyc29yLmNsb3NlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgQ3Vyc29yTG9hZGVyKENvbnRleHQgY29udGV4dCwgVXJpIHVyaSwgU3RyaW5nW10gcHJvamVjdGlvbiwgU3RyaW5nIHNlbGVjdGlvbiwKKyAgICAgICAgICAgIFN0cmluZ1tdIHNlbGVjdGlvbkFyZ3MsIFN0cmluZyBzb3J0T3JkZXIpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCk7CisgICAgICAgIG1PYnNlcnZlciA9IG5ldyBGb3JjZUxvYWRDb250ZW50T2JzZXJ2ZXIoKTsKKyAgICAgICAgbVVyaSA9IHVyaTsKKyAgICAgICAgbVByb2plY3Rpb24gPSBwcm9qZWN0aW9uOworICAgICAgICBtU2VsZWN0aW9uID0gc2VsZWN0aW9uOworICAgICAgICBtU2VsZWN0aW9uQXJncyA9IHNlbGVjdGlvbkFyZ3M7CisgICAgICAgIG1Tb3J0T3JkZXIgPSBzb3J0T3JkZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RhcnRzIGFuIGFzeW5jaHJvbm91cyBsb2FkIG9mIHRoZSBjb250YWN0cyBsaXN0IGRhdGEuIFdoZW4gdGhlIHJlc3VsdCBpcyByZWFkeSB0aGUgY2FsbGJhY2tzCisgICAgICogd2lsbCBiZSBjYWxsZWQgb24gdGhlIFVJIHRocmVhZC4gSWYgYSBwcmV2aW91cyBsb2FkIGhhcyBiZWVuIGNvbXBsZXRlZCBhbmQgaXMgc3RpbGwgdmFsaWQKKyAgICAgKiB0aGUgcmVzdWx0IG1heSBiZSBwYXNzZWQgdG8gdGhlIGNhbGxiYWNrcyBpbW1lZGlhdGVseS4KKyAgICAgKgorICAgICAqIE11c3QgYmUgY2FsbGVkIGZyb20gdGhlIFVJIHRocmVhZAorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHN0YXJ0TG9hZGluZygpIHsKKyAgICAgICAgbVN0b3BwZWQgPSBmYWxzZTsKKworICAgICAgICBpZiAobUN1cnNvciAhPSBudWxsKSB7CisgICAgICAgICAgICBkZWxpdmVyUmVzdWx0KG1DdXJzb3IpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yY2VMb2FkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNdXN0IGJlIGNhbGxlZCBmcm9tIHRoZSBVSSB0aHJlYWQKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzdG9wTG9hZGluZygpIHsKKyAgICAgICAgaWYgKG1DdXJzb3IgIT0gbnVsbCAmJiAhbUN1cnNvci5pc0Nsb3NlZCgpKSB7CisgICAgICAgICAgICBtQ3Vyc29yLmNsb3NlKCk7CisgICAgICAgIH0KKyAgICAgICAgbUN1cnNvciA9IG51bGw7CisKKyAgICAgICAgLy8gQXR0ZW1wdCB0byBjYW5jZWwgdGhlIGN1cnJlbnQgbG9hZCB0YXNrIGlmIHBvc3NpYmxlLgorICAgICAgICBjYW5jZWxMb2FkKCk7CisKKyAgICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgYW55IG91dHN0YW5kaW5nIGxvYWRzIGNsZWFuIHRoZW1zZWx2ZXMgdXAgcHJvcGVybHkKKyAgICAgICAgbVN0b3BwZWQgPSB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQ2FuY2VsbGVkKEN1cnNvciBjdXJzb3IpIHsKKyAgICAgICAgaWYgKGN1cnNvciAhPSBudWxsICYmICFjdXJzb3IuaXNDbG9zZWQoKSkgeworICAgICAgICAgICAgY3Vyc29yLmNsb3NlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkZXN0cm95KCkgeworICAgICAgICAvLyBFbnN1cmUgdGhlIGxvYWRlciBpcyBzdG9wcGVkCisgICAgICAgIHN0b3BMb2FkaW5nKCk7CisgICAgfQorCisgICAgcHVibGljIFVyaSBnZXRVcmkoKSB7CisgICAgICAgIHJldHVybiBtVXJpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFVyaShVcmkgdXJpKSB7CisgICAgICAgIG1VcmkgPSB1cmk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZ1tdIGdldFByb2plY3Rpb24oKSB7CisgICAgICAgIHJldHVybiBtUHJvamVjdGlvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQcm9qZWN0aW9uKFN0cmluZ1tdIHByb2plY3Rpb24pIHsKKyAgICAgICAgbVByb2plY3Rpb24gPSBwcm9qZWN0aW9uOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VsZWN0aW9uKCkgeworICAgICAgICByZXR1cm4gbVNlbGVjdGlvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oU3RyaW5nIHNlbGVjdGlvbikgeworICAgICAgICBtU2VsZWN0aW9uID0gc2VsZWN0aW9uOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRTZWxlY3Rpb25BcmdzKCkgeworICAgICAgICByZXR1cm4gbVNlbGVjdGlvbkFyZ3M7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uQXJncyhTdHJpbmdbXSBzZWxlY3Rpb25BcmdzKSB7CisgICAgICAgIG1TZWxlY3Rpb25BcmdzID0gc2VsZWN0aW9uQXJnczsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFNvcnRPcmRlcigpIHsKKyAgICAgICAgcmV0dXJuIG1Tb3J0T3JkZXI7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U29ydE9yZGVyKFN0cmluZyBzb3J0T3JkZXIpIHsKKyAgICAgICAgbVNvcnRPcmRlciA9IHNvcnRPcmRlcjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0lDbGlwYm9hcmQuYWlkbCBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvSUNsaXBib2FyZC5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0NTM0YTkKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0lDbGlwYm9hcmQuYWlkbApAQCAtMCwwICsxLDM4IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5jb250ZW50OworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNsaXBwZWREYXRhOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JT25QcmltYXJ5Q2xpcENoYW5nZWRMaXN0ZW5lcjsKKworLyoqCisgKiBQcm9ncmFtbWluZyBpbnRlcmZhY2UgdG8gdGhlIGNsaXBib2FyZCwgd2hpY2ggYWxsb3dzIGNvcHlpbmcgYW5kIHBhc3RpbmcKKyAqIGJldHdlZW4gYXBwbGljYXRpb25zLgorICoge0BoaWRlfQorICovCitpbnRlcmZhY2UgSUNsaXBib2FyZCB7CisgICAgdm9pZCBzZXRQcmltYXJ5Q2xpcChpbiBDbGlwcGVkRGF0YSBjbGlwKTsKKyAgICBDbGlwcGVkRGF0YSBnZXRQcmltYXJ5Q2xpcCgpOworICAgIGJvb2xlYW4gaGFzUHJpbWFyeUNsaXAoKTsKKyAgICB2b2lkIGFkZFByaW1hcnlDbGlwQ2hhbmdlZExpc3RlbmVyKGluIElPblByaW1hcnlDbGlwQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKTsKKyAgICB2b2lkIHJlbW92ZVByaW1hcnlDbGlwQ2hhbmdlZExpc3RlbmVyKGluIElPblByaW1hcnlDbGlwQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgY2xpcGJvYXJkIGNvbnRhaW5zIHRleHQ7IGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBib29sZWFuIGhhc0NsaXBib2FyZFRleHQoKTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvSUNvbnRlbnRQcm92aWRlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9JQ29udGVudFByb3ZpZGVyLmphdmEKaW5kZXggNjdlNzU4MS4uOGYxMjJjZSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9JQ29udGVudFByb3ZpZGVyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9JQ29udGVudFByb3ZpZGVyLmphdmEKQEAgLTU5LDYgKzU5LDcgQEAKICAgICAgICAgICAgIHRocm93cyBSZW1vdGVFeGNlcHRpb24sIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKICAgICBwdWJsaWMgQ29udGVudFByb3ZpZGVyUmVzdWx0W10gYXBwbHlCYXRjaChBcnJheUxpc3Q8Q29udGVudFByb3ZpZGVyT3BlcmF0aW9uPiBvcGVyYXRpb25zKQogICAgICAgICAgICAgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiwgT3BlcmF0aW9uQXBwbGljYXRpb25FeGNlcHRpb247CisKICAgICAvKioKICAgICAgKiBAaGlkZSAtLSB1bnRpbCBpbnRlcmZhY2UgaGFzIHByb3ZlbiBpdHNlbGYKICAgICAgKgpAQCAtNzEsNiArNzIsMTEgQEAKICAgICAgKi8KICAgICBwdWJsaWMgQnVuZGxlIGNhbGwoU3RyaW5nIG1ldGhvZCwgU3RyaW5nIHJlcXVlc3QsIEJ1bmRsZSBhcmdzKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uOwogCisgICAgLy8gRGF0YSBpbnRlcmNoYW5nZS4KKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0U3RyZWFtVHlwZXMoVXJpIHVybCwgU3RyaW5nIG1pbWVUeXBlRmlsdGVyKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uOworICAgIHB1YmxpYyBBc3NldEZpbGVEZXNjcmlwdG9yIG9wZW5UeXBlZEFzc2V0RmlsZShVcmkgdXJsLCBTdHJpbmcgbWltZVR5cGUsIEJ1bmRsZSBvcHRzKQorICAgICAgICAgICAgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiwgRmlsZU5vdEZvdW5kRXhjZXB0aW9uOworCiAgICAgLyogSVBDIGNvbnN0YW50cyAqLwogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGVzY3JpcHRvciA9ICJhbmRyb2lkLmNvbnRlbnQuSUNvbnRlbnRQcm92aWRlciI7CiAKQEAgLTg0LDQgKzkwLDYgQEAKICAgICBzdGF0aWMgZmluYWwgaW50IE9QRU5fQVNTRVRfRklMRV9UUkFOU0FDVElPTiA9IElCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDE0OwogICAgIHN0YXRpYyBmaW5hbCBpbnQgQVBQTFlfQkFUQ0hfVFJBTlNBQ1RJT04gPSBJQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAxOTsKICAgICBzdGF0aWMgZmluYWwgaW50IENBTExfVFJBTlNBQ1RJT04gPSBJQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAyMDsKKyAgICBzdGF0aWMgZmluYWwgaW50IEdFVF9TVFJFQU1fVFlQRVNfVFJBTlNBQ1RJT04gPSBJQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAyMTsKKyAgICBzdGF0aWMgZmluYWwgaW50IE9QRU5fVFlQRURfQVNTRVRfRklMRV9UUkFOU0FDVElPTiA9IElCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDIyOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9JT25QcmltYXJ5Q2xpcENoYW5nZWRMaXN0ZW5lci5haWRsIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9JT25QcmltYXJ5Q2xpcENoYW5nZWRMaXN0ZW5lci5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiNDJhNDUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0lPblByaW1hcnlDbGlwQ2hhbmdlZExpc3RlbmVyLmFpZGwKQEAgLTAsMCArMSwyMSBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuY29udGVudDsKKworb25ld2F5IGludGVyZmFjZSBJT25QcmltYXJ5Q2xpcENoYW5nZWRMaXN0ZW5lciB7CisgICAgdm9pZCBkaXNwYXRjaFByaW1hcnlDbGlwQ2hhbmdlZCgpOworfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9JbnRlbnQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvSW50ZW50LmphdmEKaW5kZXggMmFjYzRhMC4uNTgxNzRmYiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9JbnRlbnQuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0ludGVudC5qYXZhCkBAIC05ODUsNiArOTg1LDE1IEBACiAgICAgQFNka0NvbnN0YW50KFNka0NvbnN0YW50VHlwZS5BQ1RJVklUWV9JTlRFTlRfQUNUSU9OKQogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9JTlNFUlQgPSAiYW5kcm9pZC5pbnRlbnQuYWN0aW9uLklOU0VSVCI7CiAgICAgLyoqCisgICAgICogQWN0aXZpdHkgQWN0aW9uOiBDcmVhdGUgYSBuZXcgaXRlbSBpbiB0aGUgZ2l2ZW4gY29udGFpbmVyLCBpbml0aWFsaXppbmcgaXQKKyAgICAgKiBmcm9tIHRoZSBjdXJyZW50IGNvbnRlbnRzIG9mIHRoZSBjbGlwYm9hcmQuCisgICAgICogPHA+SW5wdXQ6IHtAbGluayAjZ2V0RGF0YX0gaXMgVVJJIG9mIHRoZSBkaXJlY3RvcnkgKHZuZC5hbmRyb2lkLmN1cnNvci5kaXIvKikKKyAgICAgKiBpbiB3aGljaCB0byBwbGFjZSB0aGUgZGF0YS4KKyAgICAgKiA8cD5PdXRwdXQ6IFVSSSBvZiB0aGUgbmV3IGRhdGEgdGhhdCB3YXMgY3JlYXRlZC4KKyAgICAgKi8KKyAgICBAU2RrQ29uc3RhbnQoU2RrQ29uc3RhbnRUeXBlLkFDVElWSVRZX0lOVEVOVF9BQ1RJT04pCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX1BBU1RFID0gImFuZHJvaWQuaW50ZW50LmFjdGlvbi5QQVNURSI7CisgICAgLyoqCiAgICAgICogQWN0aXZpdHkgQWN0aW9uOiBEZWxldGUgdGhlIGdpdmVuIGRhdGEgZnJvbSBpdHMgY29udGFpbmVyLgogICAgICAqIDxwPklucHV0OiB7QGxpbmsgI2dldERhdGF9IGlzIFVSSSBvZiBkYXRhIHRvIGJlIGRlbGV0ZWQuCiAgICAgICogPHA+T3V0cHV0OiBub3RoaW5nLgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Mb2FkZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvTG9hZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjM0MDk2YQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvTG9hZGVyLmphdmEKQEAgLTAsMCArMSwxNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuY29udGVudDsKKworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ29udGVudE9ic2VydmVyOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKKworLyoqCisgKiBBbiBhYnN0cmFjdCBjbGFzcyB0aGF0IHBlcmZvcm1zIGFzeW5jaHJvbm91cyBsb2FkaW5nIG9mIGRhdGEuIFdoaWxlIExvYWRlcnMgYXJlIGFjdGl2ZQorICogdGhleSBzaG91bGQgbW9uaXRvciB0aGUgc291cmNlIG9mIHRoZWlyIGRhdGEgYW5kIGRlbGl2ZXIgbmV3IHJlc3VsdHMgd2hlbiB0aGUgY29udGVudHMKKyAqIGNoYW5nZS4KKyAqCisgKiBAcGFyYW0gPEQ+IFRoZSByZXN1bHQgcmV0dXJuZWQgd2hlbiB0aGUgbG9hZCBpcyBjb21wbGV0ZQorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgTG9hZGVyPEQ+IHsKKyAgICBpbnQgbUlkOworICAgIE9uTG9hZENvbXBsZXRlTGlzdGVuZXI8RD4gbUxpc3RlbmVyOworICAgIENvbnRleHQgbUNvbnRleHQ7CisKKyAgICBwdWJsaWMgZmluYWwgY2xhc3MgRm9yY2VMb2FkQ29udGVudE9ic2VydmVyIGV4dGVuZHMgQ29udGVudE9ic2VydmVyIHsKKyAgICAgICAgcHVibGljIEZvcmNlTG9hZENvbnRlbnRPYnNlcnZlcigpIHsKKyAgICAgICAgICAgIHN1cGVyKG5ldyBIYW5kbGVyKCkpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGRlbGl2ZXJTZWxmTm90aWZpY2F0aW9ucygpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2hhbmdlKGJvb2xlYW4gc2VsZkNoYW5nZSkgeworICAgICAgICAgICAgb25Db250ZW50Q2hhbmdlZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGludGVyZmFjZSBPbkxvYWRDb21wbGV0ZUxpc3RlbmVyPEQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENhbGxlZCBvbiB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgTG9hZGVyIHdoZW4gdGhlIGxvYWQgaXMgY29tcGxldGUuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBsb2FkZXIgdGhlIGxvYWRlciB0aGF0IGNvbXBsZXRlZCB0aGUgbG9hZAorICAgICAgICAgKiBAcGFyYW0gZGF0YSB0aGUgcmVzdWx0IG9mIHRoZSBsb2FkCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBvbkxvYWRDb21wbGV0ZShMb2FkZXI8RD4gbG9hZGVyLCBEIGRhdGEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN0b3JlcyBhd2F5IHRoZSBhcHBsaWNhdGlvbiBjb250ZXh0IGFzc29jaWF0ZWQgd2l0aCBjb250ZXh0LiBTaW5jZSBMb2FkZXJzIGNhbiBiZSB1c2VkCisgICAgICogYWNyb3NzIG11bHRpcGxlIGFjdGl2aXRpZXMgaXQncyBkYW5nZXJvdXMgdG8gc3RvcmUgdGhlIGNvbnRleHQgZGlyZWN0bHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCB1c2VkIHRvIHJldHJpZXZlIHRoZSBhcHBsaWNhdGlvbiBjb250ZXh0LgorICAgICAqLworICAgIHB1YmxpYyBMb2FkZXIoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIG1Db250ZXh0ID0gY29udGV4dC5nZXRBcHBsaWNhdGlvbkNvbnRleHQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZW5kcyB0aGUgcmVzdWx0IG9mIHRoZSBsb2FkIHRvIHRoZSByZWdpc3RlcmVkIGxpc3RlbmVyLiBTaG91bGQgb25seSBiZSBjYWxsZWQgYnkgc3ViY2xhc3Nlcy4KKyAgICAgKgorICAgICAqIE11c3QgYmUgY2FsbGVkIGZyb20gdGhlIFVJIHRocmVhZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkYXRhIHRoZSByZXN1bHQgb2YgdGhlIGxvYWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkZWxpdmVyUmVzdWx0KEQgZGF0YSkgeworICAgICAgICBpZiAobUxpc3RlbmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1MaXN0ZW5lci5vbkxvYWRDb21wbGV0ZSh0aGlzLCBkYXRhKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gYW4gYXBwbGljYXRpb24gY29udGV4dCByZXRyaWV2ZWQgZnJvbSB0aGUgQ29udGV4dCBwYXNzZWQgdG8gdGhlIGNvbnN0cnVjdG9yLgorICAgICAqLworICAgIHB1YmxpYyBDb250ZXh0IGdldENvbnRleHQoKSB7CisgICAgICAgIHJldHVybiBtQ29udGV4dDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBJRCBvZiB0aGlzIGxvYWRlcgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0SWQoKSB7CisgICAgICAgIHJldHVybiBtSWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVnaXN0ZXJzIGEgY2xhc3MgdGhhdCB3aWxsIHJlY2VpdmUgY2FsbGJhY2tzIHdoZW4gYSBsb2FkIGlzIGNvbXBsZXRlLiBUaGUgY2FsbGJhY2tzIHdpbGwKKyAgICAgKiBiZSBjYWxsZWQgb24gdGhlIFVJIHRocmVhZCBzbyBpdCdzIHNhZmUgdG8gcGFzcyB0aGUgcmVzdWx0cyB0byB3aWRnZXRzLgorICAgICAqCisgICAgICogTXVzdCBiZSBjYWxsZWQgZnJvbSB0aGUgVUkgdGhyZWFkCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVnaXN0ZXJMaXN0ZW5lcihpbnQgaWQsIE9uTG9hZENvbXBsZXRlTGlzdGVuZXI8RD4gbGlzdGVuZXIpIHsKKyAgICAgICAgaWYgKG1MaXN0ZW5lciAhPSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUaGVyZSBpcyBhbHJlYWR5IGEgbGlzdGVuZXIgcmVnaXN0ZXJlZCIpOworICAgICAgICB9CisgICAgICAgIG1MaXN0ZW5lciA9IGxpc3RlbmVyOworICAgICAgICBtSWQgPSBpZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNdXN0IGJlIGNhbGxlZCBmcm9tIHRoZSBVSSB0aHJlYWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB1bnJlZ2lzdGVyTGlzdGVuZXIoT25Mb2FkQ29tcGxldGVMaXN0ZW5lcjxEPiBsaXN0ZW5lcikgeworICAgICAgICBpZiAobUxpc3RlbmVyID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIk5vIGxpc3RlbmVyIHJlZ2lzdGVyIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1MaXN0ZW5lciAhPSBsaXN0ZW5lcikgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQXR0ZW1wdGluZyB0byB1bnJlZ2lzdGVyIHRoZSB3cm9uZyBsaXN0ZW5lciIpOworICAgICAgICB9CisgICAgICAgIG1MaXN0ZW5lciA9IG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RhcnRzIGFuIGFzeW5jaHJvbm91cyBsb2FkIG9mIHRoZSBjb250YWN0cyBsaXN0IGRhdGEuIFdoZW4gdGhlIHJlc3VsdCBpcyByZWFkeSB0aGUgY2FsbGJhY2tzCisgICAgICogd2lsbCBiZSBjYWxsZWQgb24gdGhlIFVJIHRocmVhZC4gSWYgYSBwcmV2aW91cyBsb2FkIGhhcyBiZWVuIGNvbXBsZXRlZCBhbmQgaXMgc3RpbGwgdmFsaWQKKyAgICAgKiB0aGUgcmVzdWx0IG1heSBiZSBwYXNzZWQgdG8gdGhlIGNhbGxiYWNrcyBpbW1lZGlhdGVseS4gVGhlIGxvYWRlciB3aWxsIG1vbml0b3IgdGhlIHNvdXJjZSBvZgorICAgICAqIHRoZSBkYXRhIHNldCBhbmQgbWF5IGRlbGl2ZXIgZnV0dXJlIGNhbGxiYWNrcyBpZiB0aGUgc291cmNlIGNoYW5nZXMuIENhbGxpbmcKKyAgICAgKiB7QGxpbmsgI3N0b3BMb2FkaW5nfSB3aWxsIHN0b3AgdGhlIGRlbGl2ZXJ5IG9mIGNhbGxiYWNrcy4KKyAgICAgKgorICAgICAqIE11c3QgYmUgY2FsbGVkIGZyb20gdGhlIFVJIHRocmVhZAorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHN0YXJ0TG9hZGluZygpOworCisgICAgLyoqCisgICAgICogRm9yY2UgYW4gYXN5bmNocm9ub3VzIGxvYWQuIFVubGlrZSB7QGxpbmsgI3N0YXJ0TG9hZGluZygpfSB0aGlzIHdpbGwgaWdub3JlIGEgcHJldmlvdXNseQorICAgICAqIGxvYWRlZCBkYXRhIHNldCBhbmQgbG9hZCBhIG5ldyBvbmUuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgZm9yY2VMb2FkKCk7CisKKyAgICAvKioKKyAgICAgKiBTdG9wcyBkZWxpdmVyeSBvZiB1cGRhdGVzIHVudGlsIHRoZSBuZXh0IHRpbWUge0BsaW5rICNzdGFydExvYWRpbmcoKX0gaXMgY2FsbGVkCisgICAgICoKKyAgICAgKiBNdXN0IGJlIGNhbGxlZCBmcm9tIHRoZSBVSSB0aHJlYWQKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzdG9wTG9hZGluZygpOworCisgICAgLyoqCisgICAgICogRGVzdHJveXMgdGhlIGxvYWRlciBhbmQgZnJlZXMgaXRzIHJlc291cmNlcywgbWFraW5nIGl0IHVudXNhYmxlLgorICAgICAqCisgICAgICogTXVzdCBiZSBjYWxsZWQgZnJvbSB0aGUgVUkgdGhyZWFkCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgZGVzdHJveSgpOworCisgICAgLyoqCisgICAgICogQ2FsbGVkIHdoZW4ge0BsaW5rIEZvcmNlTG9hZENvbnRlbnRPYnNlcnZlcn0gZGV0ZWN0cyBhIGNoYW5nZS4gIENhbGxzIHtAbGluayAjZm9yY2VMb2FkKCl9CisgICAgICogYnkgZGVmYXVsdC4KKyAgICAgKgorICAgICAqIE11c3QgYmUgY2FsbGVkIGZyb20gdGhlIFVJIHRocmVhZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uQ29udGVudENoYW5nZWQoKSB7CisgICAgICAgIGZvcmNlTG9hZCgpOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L1NoYXJlZFByZWZlcmVuY2VzLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L1NoYXJlZFByZWZlcmVuY2VzLmphdmEKaW5kZXggYTE1ZTI5ZS4uNTg0NzIxNiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9TaGFyZWRQcmVmZXJlbmNlcy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvU2hhcmVkUHJlZmVyZW5jZXMuamF2YQpAQCAtMTcsNiArMTcsNyBAQAogcGFja2FnZSBhbmRyb2lkLmNvbnRlbnQ7CiAKIGltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CiAKIC8qKgogICogSW50ZXJmYWNlIGZvciBhY2Nlc3NpbmcgYW5kIG1vZGlmeWluZyBwcmVmZXJlbmNlIGRhdGEgcmV0dXJuZWQgYnkge0BsaW5rCkBAIC02OSw2ICs3MCwxNyBAQAogICAgICAgICBFZGl0b3IgcHV0U3RyaW5nKFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSk7CiAgICAgICAgIAogICAgICAgICAvKioKKyAgICAgICAgICogU2V0IGEgc2V0IG9mIFN0cmluZyB2YWx1ZXMgaW4gdGhlIHByZWZlcmVuY2VzIGVkaXRvciwgdG8gYmUgd3JpdHRlbgorICAgICAgICAgKiBiYWNrIG9uY2Uge0BsaW5rICNjb21taXR9IGlzIGNhbGxlZC4KKyAgICAgICAgICogCisgICAgICAgICAqIEBwYXJhbSBrZXkgVGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UgdG8gbW9kaWZ5LgorICAgICAgICAgKiBAcGFyYW0gdmFsdWVzIFRoZSBuZXcgdmFsdWVzIGZvciB0aGUgcHJlZmVyZW5jZS4KKyAgICAgICAgICogQHJldHVybiBSZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBzYW1lIEVkaXRvciBvYmplY3QsIHNvIHlvdSBjYW4KKyAgICAgICAgICogY2hhaW4gcHV0IGNhbGxzIHRvZ2V0aGVyLgorICAgICAgICAgKi8KKyAgICAgICAgRWRpdG9yIHB1dFN0cmluZ1NldChTdHJpbmcga2V5LCBTZXQ8U3RyaW5nPiB2YWx1ZXMpOworICAgICAgICAKKyAgICAgICAgLyoqCiAgICAgICAgICAqIFNldCBhbiBpbnQgdmFsdWUgaW4gdGhlIHByZWZlcmVuY2VzIGVkaXRvciwgdG8gYmUgd3JpdHRlbiBiYWNrIG9uY2UKICAgICAgICAgICoge0BsaW5rICNjb21taXR9IGlzIGNhbGxlZC4KICAgICAgICAgICogCkBAIC0xODYsNiArMTk4LDIwIEBACiAgICAgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5LCBTdHJpbmcgZGVmVmFsdWUpOwogICAgIAogICAgIC8qKgorICAgICAqIFJldHJpZXZlIGEgc2V0IG9mIFN0cmluZyB2YWx1ZXMgZnJvbSB0aGUgcHJlZmVyZW5jZXMuCisgICAgICogCisgICAgICogQHBhcmFtIGtleSBUaGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZSB0byByZXRyaWV2ZS4KKyAgICAgKiBAcGFyYW0gZGVmVmFsdWVzIFZhbHVlcyB0byByZXR1cm4gaWYgdGhpcyBwcmVmZXJlbmNlIGRvZXMgbm90IGV4aXN0LgorICAgICAqIAorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgcHJlZmVyZW5jZSB2YWx1ZXMgaWYgdGhleSBleGlzdCwgb3IgZGVmVmFsdWVzLgorICAgICAqIFRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24gaWYgdGhlcmUgaXMgYSBwcmVmZXJlbmNlIHdpdGggdGhpcyBuYW1lCisgICAgICogdGhhdCBpcyBub3QgYSBTZXQuCisgICAgICogCisgICAgICogQHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24KKyAgICAgKi8KKyAgICBTZXQ8U3RyaW5nPiBnZXRTdHJpbmdTZXQoU3RyaW5nIGtleSwgU2V0PFN0cmluZz4gZGVmVmFsdWVzKTsKKyAgICAKKyAgICAvKioKICAgICAgKiBSZXRyaWV2ZSBhbiBpbnQgdmFsdWUgZnJvbSB0aGUgcHJlZmVyZW5jZXMuCiAgICAgICogCiAgICAgICogQHBhcmFtIGtleSBUaGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZSB0byByZXRyaWV2ZS4KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvU3luY01hbmFnZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvU3luY01hbmFnZXIuamF2YQppbmRleCBkMGI2N2NjLi43Zjc0OWJiIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L1N5bmNNYW5hZ2VyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9TeW5jTWFuYWdlci5qYXZhCkBAIC0xNiw2ICsxNiw4IEBACiAKIHBhY2thZ2UgYW5kcm9pZC5jb250ZW50OwogCitpbXBvcnQgY29tLmdvb2dsZS5hbmRyb2lkLmNvbGxlY3QuTWFwczsKKwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLlI7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudXRpbC5BcnJheVV0aWxzOwogCkBAIC01NSw2ICs1Nyw3IEBACiBpbXBvcnQgamF2YS5pby5GaWxlRGVzY3JpcHRvcjsKIGltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKQEAgLTEyNiwxNCArMTI5LDEzIEBACiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU5JVElBTElaQVRJT05fVU5CSU5EX0RFTEFZX01TID0gNTAwMDsKIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTWU5DX1dBS0VfTE9DSyA9ICJTeW5jTWFuYWdlclN5bmNXYWtlTG9jayI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNZTkNfV0FLRV9MT0NLX1BSRUZJWCA9ICJTeW5jV2FrZUxvY2siOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIQU5ETEVfU1lOQ19BTEFSTV9XQUtFX0xPQ0sgPSAiU3luY01hbmFnZXJIYW5kbGVTeW5jQWxhcm1XYWtlTG9jayI7CiAKICAgICBwcml2YXRlIENvbnRleHQgbUNvbnRleHQ7CiAKICAgICBwcml2YXRlIHZvbGF0aWxlIEFjY291bnRbXSBtQWNjb3VudHMgPSBJTklUSUFMX0FDQ09VTlRTX0FSUkFZOwogCi0gICAgdm9sYXRpbGUgcHJpdmF0ZSBQb3dlck1hbmFnZXIuV2FrZUxvY2sgbVN5bmNXYWtlTG9jazsKICAgICB2b2xhdGlsZSBwcml2YXRlIFBvd2VyTWFuYWdlci5XYWtlTG9jayBtSGFuZGxlQWxhcm1XYWtlTG9jazsKICAgICB2b2xhdGlsZSBwcml2YXRlIGJvb2xlYW4gbURhdGFDb25uZWN0aW9uSXNDb25uZWN0ZWQgPSBmYWxzZTsKICAgICB2b2xhdGlsZSBwcml2YXRlIGJvb2xlYW4gbVN0b3JhZ2VJc0xvdyA9IGZhbHNlOwpAQCAtMTk1LDYgKzE5Nyw4IEBACiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBBY2NvdW50W10gSU5JVElBTF9BQ0NPVU5UU19BUlJBWSA9IG5ldyBBY2NvdW50WzBdOwogCisgICAgcHJpdmF0ZSBmaW5hbCBQb3dlck1hbmFnZXIgbVBvd2VyTWFuYWdlcjsKKwogICAgIHB1YmxpYyB2b2lkIG9uQWNjb3VudHNVcGRhdGVkKEFjY291bnRbXSBhY2NvdW50cykgewogICAgICAgICAvLyByZW1lbWJlciBpZiB0aGlzIHdhcyB0aGUgZmlyc3QgdGltZSB0aGlzIHdhcyBjYWxsZWQgYWZ0ZXIgYW4gdXBkYXRlCiAgICAgICAgIGZpbmFsIGJvb2xlYW4ganVzdEJvb3RlZFVwID0gbUFjY291bnRzID09IElOSVRJQUxfQUNDT1VOVFNfQVJSQVk7CkBAIC0zNTYsMTUgKzM2MCwxMyBAQAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgbU5vdGlmaWNhdGlvbk1nciA9IG51bGw7CiAgICAgICAgIH0KLSAgICAgICAgUG93ZXJNYW5hZ2VyIHBtID0gKFBvd2VyTWFuYWdlcikgY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuUE9XRVJfU0VSVklDRSk7Ci0gICAgICAgIG1TeW5jV2FrZUxvY2sgPSBwbS5uZXdXYWtlTG9jayhQb3dlck1hbmFnZXIuUEFSVElBTF9XQUtFX0xPQ0ssIFNZTkNfV0FLRV9MT0NLKTsKLSAgICAgICAgbVN5bmNXYWtlTG9jay5zZXRSZWZlcmVuY2VDb3VudGVkKGZhbHNlKTsKKyAgICAgICAgbVBvd2VyTWFuYWdlciA9IChQb3dlck1hbmFnZXIpIGNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LlBPV0VSX1NFUlZJQ0UpOwogCiAgICAgICAgIC8vIFRoaXMgV2FrZUxvY2sgaXMgdXNlZCB0byBlbnN1cmUgdGhhdCB3ZSBzdGF5IGF3YWtlIGJldHdlZW4gdGhlIHRpbWUgdGhhdCB3ZSByZWNlaXZlCiAgICAgICAgIC8vIGEgc3luYyBhbGFybSBub3RpZmljYXRpb24gYW5kIHdoZW4gd2UgZmluaXNoIHByb2Nlc3NpbmcgaXQuIFdlIG5lZWQgdG8gZG8gdGhpcwogICAgICAgICAvLyBiZWNhdXNlIHdlIGRvbid0IGRvIHRoZSB3b3JrIGluIHRoZSBhbGFybSBoYW5kbGVyLCByYXRoZXIgd2UgZG8gaXQgaW4gYSBtZXNzYWdlCiAgICAgICAgIC8vIGhhbmRsZXIuCi0gICAgICAgIG1IYW5kbGVBbGFybVdha2VMb2NrID0gcG0ubmV3V2FrZUxvY2soUG93ZXJNYW5hZ2VyLlBBUlRJQUxfV0FLRV9MT0NLLAorICAgICAgICBtSGFuZGxlQWxhcm1XYWtlTG9jayA9IG1Qb3dlck1hbmFnZXIubmV3V2FrZUxvY2soUG93ZXJNYW5hZ2VyLlBBUlRJQUxfV0FLRV9MT0NLLAogICAgICAgICAgICAgICAgIEhBTkRMRV9TWU5DX0FMQVJNX1dBS0VfTE9DSyk7CiAgICAgICAgIG1IYW5kbGVBbGFybVdha2VMb2NrLnNldFJlZmVyZW5jZUNvdW50ZWQoZmFsc2UpOwogCkBAIC0xMzAyLDYgKzEzMDQsOSBAQAogICAgICAgICBwdWJsaWMgZmluYWwgU3luY05vdGlmaWNhdGlvbkluZm8gbVN5bmNOb3RpZmljYXRpb25JbmZvID0gbmV3IFN5bmNOb3RpZmljYXRpb25JbmZvKCk7CiAgICAgICAgIHByaXZhdGUgTG9uZyBtQWxhcm1TY2hlZHVsZVRpbWUgPSBudWxsOwogICAgICAgICBwdWJsaWMgZmluYWwgU3luY1RpbWVUcmFja2VyIG1TeW5jVGltZVRyYWNrZXIgPSBuZXcgU3luY1RpbWVUcmFja2VyKCk7CisgICAgICAgIHByaXZhdGUgUG93ZXJNYW5hZ2VyLldha2VMb2NrIG1TeW5jV2FrZUxvY2s7CisgICAgICAgIHByaXZhdGUgZmluYWwgSGFzaE1hcDxQYWlyPFN0cmluZywgU3RyaW5nPiwgIFBvd2VyTWFuYWdlci5XYWtlTG9jaz4gbVdha2VMb2NrcyA9CisgICAgICAgICAgICAgICAgTWFwcy5uZXdIYXNoTWFwKCk7CiAKICAgICAgICAgLy8gdXNlZCB0byB0cmFjayBpZiB3ZSBoYXZlIGluc3RhbGxlZCB0aGUgZXJyb3Igbm90aWZpY2F0aW9uIHNvIHRoYXQgd2UgZG9uJ3QgcmVpbnN0YWxsCiAgICAgICAgIC8vIGl0IGlmIHN5bmMgaXMgc3RpbGwgZmFpbGluZwpAQCAtMTMxNSw2ICsxMzIwLDE4IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAorICAgICAgICBwcml2YXRlIFBvd2VyTWFuYWdlci5XYWtlTG9jayBnZXRTeW5jV2FrZUxvY2soU3RyaW5nIGFjY291bnRUeXBlLCBTdHJpbmcgYXV0aG9yaXR5KSB7CisgICAgICAgICAgICBmaW5hbCBQYWlyPFN0cmluZywgU3RyaW5nPiB3YWtlTG9ja0tleSA9IFBhaXIuY3JlYXRlKGFjY291bnRUeXBlLCBhdXRob3JpdHkpOworICAgICAgICAgICAgUG93ZXJNYW5hZ2VyLldha2VMb2NrIHdha2VMb2NrID0gbVdha2VMb2Nrcy5nZXQod2FrZUxvY2tLZXkpOworICAgICAgICAgICAgaWYgKHdha2VMb2NrID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSA9IFNZTkNfV0FLRV9MT0NLX1BSRUZJWCArICJfIiArIGF1dGhvcml0eSArICJfIiArIGFjY291bnRUeXBlOworICAgICAgICAgICAgICAgIHdha2VMb2NrID0gbVBvd2VyTWFuYWdlci5uZXdXYWtlTG9jayhQb3dlck1hbmFnZXIuUEFSVElBTF9XQUtFX0xPQ0ssIG5hbWUpOworICAgICAgICAgICAgICAgIHdha2VMb2NrLnNldFJlZmVyZW5jZUNvdW50ZWQoZmFsc2UpOworICAgICAgICAgICAgICAgIG1XYWtlTG9ja3MucHV0KHdha2VMb2NrS2V5LCB3YWtlTG9jayk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gd2FrZUxvY2s7CisgICAgICAgIH0KKwogICAgICAgICBwcml2YXRlIHZvaWQgd2FpdFVudGlsUmVhZHlUb1J1bigpIHsKICAgICAgICAgICAgIENvdW50RG93bkxhdGNoIGxhdGNoID0gbVJlYWR5VG9SdW5MYXRjaDsKICAgICAgICAgICAgIGlmIChsYXRjaCAhPSBudWxsKSB7CkBAIC0xNDc3LDggKzE0OTQsOSBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBpc1N5bmNJblByb2dyZXNzID0gbUFjdGl2ZVN5bmNDb250ZXh0ICE9IG51bGw7Ci0gICAgICAgICAgICAgICAgaWYgKCFpc1N5bmNJblByb2dyZXNzKSB7CisgICAgICAgICAgICAgICAgaWYgKCFpc1N5bmNJblByb2dyZXNzICYmIG1TeW5jV2FrZUxvY2sgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICBtU3luY1dha2VMb2NrLnJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgbVN5bmNXYWtlTG9jayA9IG51bGw7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIG1hbmFnZVN5bmNOb3RpZmljYXRpb24oKTsKICAgICAgICAgICAgICAgICBtYW5hZ2VFcnJvck5vdGlmaWNhdGlvbigpOwpAQCAtMTcwNCw3ICsxNzIyLDI2IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBtU3luY1dha2VMb2NrLmFjcXVpcmUoKTsKKyAgICAgICAgICAgIC8vIEZpbmQgdGhlIHdha2Vsb2NrIGZvciB0aGlzIGFjY291bnQgYW5kIGF1dGhvcml0eSBhbmQgc3RvcmUgaXQgaW4gbVN5bmNXYWtlTG9jay4KKyAgICAgICAgICAgIC8vIEJlIHN1cmUgdG8gcmVsZWFzZSB0aGUgcHJldmlvdXMgd2FrZWxvY2sgc28gdGhhdCB3ZSBkb24ndCBlbmQgdXAgd2l0aCBpdCBiZWluZworICAgICAgICAgICAgLy8gaGVsZCB1bnRpbCBpdCBpcyB1c2VkIGFnYWluLgorICAgICAgICAgICAgLy8gVGhlcmUgYXJlIGEgY291cGxlIHRyaWNreSB0aGluZ3MgYWJvdXQgdGhpcyBjb2RlOgorICAgICAgICAgICAgLy8gLSBtYWtlIHN1cmUgdGhhdCB3ZSBhY3F1aXJlIHRoZSBuZXcgd2FrZWxvY2sgYmVmb3JlIHJlbGVhc2luZyB0aGUgb2xkIG9uZSwKKyAgICAgICAgICAgIC8vICAgb3RoZXJ3aXNlIHRoZSBkZXZpY2UgbWlnaHQgZ28gdG8gc2xlZXAgYXMgc29vbiBhcyB3ZSByZWxlYXNlIGl0LgorICAgICAgICAgICAgLy8gLSBzaW5jZSB3ZSB1c2Ugbm9uLXJlZmVyZW5jZSBjb3VudGVkIHdha2Vsb2NrcyB3ZSBoYXZlIHRvIGJlIHN1cmUgbm90IHRvIGRvCisgICAgICAgICAgICAvLyAgIHRoZSByZWxlYXNlIGlmIHRoZSB3YWtlbG9jayBkaWRuJ3QgY2hhbmdlLiBPdGhld2lzZSB3ZSB3b3VsZCBkbyBhbgorICAgICAgICAgICAgLy8gICBhY3F1aXJlIGZvbGxvd2VkIGJ5IGEgcmVsZWFzZSBvbiB0aGUgc2FtZSBsb2NrLCByZXN1bHRpbmcgaW4gbm8gbG9jaworICAgICAgICAgICAgLy8gICBiZWluZyBoZWxkLgorICAgICAgICAgICAgUG93ZXJNYW5hZ2VyLldha2VMb2NrIG9sZFdha2VMb2NrID0gbVN5bmNXYWtlTG9jazsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbVN5bmNXYWtlTG9jayA9IGdldFN5bmNXYWtlTG9jayhvcC5hY2NvdW50LnR5cGUsIG9wLmF1dGhvcml0eSk7CisgICAgICAgICAgICAgICAgbVN5bmNXYWtlTG9jay5hY3F1aXJlKCk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIGlmIChvbGRXYWtlTG9jayAhPSBudWxsICYmIG9sZFdha2VMb2NrICE9IG1TeW5jV2FrZUxvY2spIHsKKyAgICAgICAgICAgICAgICAgICAgb2xkV2FrZUxvY2sucmVsZWFzZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgLy8gbm8gbmVlZCB0byBzY2hlZHVsZSBhbiBhbGFybSwgYXMgdGhhdCB3aWxsIGJlIGRvbmUgYnkgb3VyIGNhbGxlci4KIAogICAgICAgICAgICAgLy8gdGhlIG5leHQgc3RlcCB3aWxsIG9jY3VyIHdoZW4gd2UgZ2V0IGVpdGhlciBhIHRpbWVvdXQgb3IgYQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9YbWxEb2N1bWVudFByb3ZpZGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L1htbERvY3VtZW50UHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTNhZDM4Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9YbWxEb2N1bWVudFByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSw0MzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuY29udGVudDsKKworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5IdHRwRW50aXR5OworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5IdHRwUmVzcG9uc2U7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLkh0dHBTdGF0dXM7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLmNsaWVudC5tZXRob2RzLkh0dHBHZXQ7CitpbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlcjsKK2ltcG9ydCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyRXhjZXB0aW9uOworaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXJGYWN0b3J5OworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlci5PcGVuUmVzb3VyY2VJZFJlc3VsdDsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcjsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLk1hdHJpeEN1cnNvcjsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CitpbXBvcnQgYW5kcm9pZC5uZXQuaHR0cC5BbmRyb2lkSHR0cENsaWVudDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkN1cnNvckFkYXB0ZXI7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkJpdFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU3RhY2s7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CisKKy8qKgorICogQSByZWFkLW9ubHkgY29udGVudCBwcm92aWRlciB3aGljaCBleHRyYWN0cyBkYXRhIG91dCBvZiBhbiBYTUwgZG9jdW1lbnQuCisgKgorICogPHA+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+PSAwKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtQWN0aXZlVGV4dERlcHRoTWFza1tpXS5nZXQoY3VycmVudE5vZGVEZXB0aCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRWYWx1ZXNbaSArIDFdICs9IHBhcnNlci5nZXRUZXh0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBldmVudFR5cGUgPSBwYXJzZXIubmV4dCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9wbS9BY3Rpdml0eUluZm8uamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvcG0vQWN0aXZpdHlJbmZvLmphdmEKaW5kZXggMzY0YzkxZS4uZTIxY2I5NyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9wbS9BY3Rpdml0eUluZm8uamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L3BtL0FjdGl2aXR5SW5mby5qYXZhCkBAIC0xNjYsNiArMTY2LDExIEBACiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19JTU1FUlNJVkUgPSAweDAyMDA7CiAgICAgLyoqCisgICAgICogVmFsdWUgZm9yIHtAbGluayAjZmxhZ3N9OiB0cnVlIHdoZW4gdGhlIGFwcGxpY2F0aW9uJ3MgcmVuZGVyaW5nIHNob3VsZAorICAgICAqIGJlIGhhcmR3YXJlIGFjY2VsZXJhdGVkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfSEFSRFdBUkVfQUNDRUxFUkFURUQgPSAweDA0MDA7CisgICAgLyoqCiAgICAgICogT3B0aW9ucyB0aGF0IGhhdmUgYmVlbiBzZXQgaW4gdGhlIGFjdGl2aXR5IGRlY2xhcmF0aW9uIGluIHRoZQogICAgICAqIG1hbmlmZXN0LgogICAgICAqIFRoZXNlIGluY2x1ZGU6CkBAIC0xNzUsNyArMTgwLDcgQEAKICAgICAgKiB7QGxpbmsgI0ZMQUdfU1RBVEVfTk9UX05FRURFRH0sIHtAbGluayAjRkxBR19FWENMVURFX0ZST01fUkVDRU5UU30sCiAgICAgICoge0BsaW5rICNGTEFHX0FMTE9XX1RBU0tfUkVQQVJFTlRJTkd9LCB7QGxpbmsgI0ZMQUdfTk9fSElTVE9SWX0sCiAgICAgICoge0BsaW5rICNGTEFHX0ZJTklTSF9PTl9DTE9TRV9TWVNURU1fRElBTE9HU30sCi0gICAgICoge0BsaW5rICNGTEFHX0lNTUVSU0lWRX0KKyAgICAgKiB7QGxpbmsgI0ZMQUdfSU1NRVJTSVZFfSwge0BsaW5rICNGTEFHX0hBUkRXQVJFX0FDQ0VMRVJBVEVEfQogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZmxhZ3M7CiAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvcG0vUGFja2FnZVBhcnNlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9wbS9QYWNrYWdlUGFyc2VyLmphdmEKaW5kZXggNDdlNjY4ZC4uN2M2ZTE0MiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9wbS9QYWNrYWdlUGFyc2VyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9wbS9QYWNrYWdlUGFyc2VyLmphdmEKQEAgLTE2LDkgKzE2LDYgQEAKIAogcGFja2FnZSBhbmRyb2lkLmNvbnRlbnQucG07CiAKLWltcG9ydCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyOwotaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXJFeGNlcHRpb247Ci0KIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7CkBAIC0zMCwxNCArMjcsMTQgQEAKIGltcG9ydCBhbmRyb2lkLm9zLkJ1aWxkOwogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwogaW1wb3J0IGFuZHJvaWQub3MuUGF0dGVybk1hdGNoZXI7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5nczsKIGltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwogaW1wb3J0IGFuZHJvaWQudXRpbC5Db25maWc7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkRpc3BsYXlNZXRyaWNzOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlR5cGVkVmFsdWU7Ci0KIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLlhtbFV0aWxzOworaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXI7CitpbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjsKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwpAQCAtNDgsNyArNDUsNiBAQAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuamFyLkphckVudHJ5OwogaW1wb3J0IGphdmEudXRpbC5qYXIuSmFyRmlsZTsKIApAQCAtMTQ5OCwxMiArMTQ5NCwxOCBAQAogICAgICAgICAgICAgYWkubm9uTG9jYWxpemVkTGFiZWwgPSB2LmNvZXJjZVRvU3RyaW5nKCk7CiAgICAgICAgIH0KIAorICAgICAgICBpbnQgZGVmYXVsdFRoZW1lID0gMDsKKyAgICAgICAgaWYgKG93bmVyLmFwcGxpY2F0aW9uSW5mby50YXJnZXRTZGtWZXJzaW9uID49IGFuZHJvaWQub3MuQnVpbGQuVkVSU0lPTl9DT0RFUy5IT05FWUNPTUIpIHsKKyAgICAgICAgICAgIC8vIEFzIG9mIGhvbmV5Y29tYiwgdGhlIGRlZmF1bHQgYXBwbGljYXRpb24gdGhlbWUgaXMgaG9sb2dyYXBoaWMuCisgICAgICAgICAgICBkZWZhdWx0VGhlbWUgPSBhbmRyb2lkLlIuc3R5bGUuVGhlbWVfSG9sbzsKKyAgICAgICAgfQorCiAgICAgICAgIGFpLmljb24gPSBzYS5nZXRSZXNvdXJjZUlkKAogICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuZHJvaWRNYW5pZmVzdEFwcGxpY2F0aW9uX2ljb24sIDApOwogICAgICAgICBhaS5sb2dvID0gc2EuZ2V0UmVzb3VyY2VJZCgKICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BbmRyb2lkTWFuaWZlc3RBcHBsaWNhdGlvbl9sb2dvLCAwKTsKICAgICAgICAgYWkudGhlbWUgPSBzYS5nZXRSZXNvdXJjZUlkKAotICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuZHJvaWRNYW5pZmVzdEFwcGxpY2F0aW9uX3RoZW1lLCAwKTsKKyAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BbmRyb2lkTWFuaWZlc3RBcHBsaWNhdGlvbl90aGVtZSwgZGVmYXVsdFRoZW1lKTsKICAgICAgICAgYWkuZGVzY3JpcHRpb25SZXMgPSBzYS5nZXRSZXNvdXJjZUlkKAogICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuZHJvaWRNYW5pZmVzdEFwcGxpY2F0aW9uX2Rlc2NyaXB0aW9uLCAwKTsKIApAQCAtMTUzNSw2ICsxNTM3LDEwIEBACiAgICAgICAgICAgICBhaS5mbGFncyB8PSBBcHBsaWNhdGlvbkluZm8uRkxBR19WTV9TQUZFX01PREU7CiAgICAgICAgIH0KIAorICAgICAgICBib29sZWFuIGhhcmR3YXJlQWNjZWxlcmF0ZWQgPSBzYS5nZXRCb29sZWFuKAorICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuZHJvaWRNYW5pZmVzdEFwcGxpY2F0aW9uX2hhcmR3YXJlQWNjZWxlcmF0ZWQsCisgICAgICAgICAgICAgICAgZmFsc2UpOworCiAgICAgICAgIGlmIChzYS5nZXRCb29sZWFuKAogICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuZHJvaWRNYW5pZmVzdEFwcGxpY2F0aW9uX2hhc0NvZGUsCiAgICAgICAgICAgICAgICAgdHJ1ZSkpIHsKQEAgLTE2MzIsNyArMTYzOCw4IEBACiAKICAgICAgICAgICAgIFN0cmluZyB0YWdOYW1lID0gcGFyc2VyLmdldE5hbWUoKTsKICAgICAgICAgICAgIGlmICh0YWdOYW1lLmVxdWFscygiYWN0aXZpdHkiKSkgewotICAgICAgICAgICAgICAgIEFjdGl2aXR5IGEgPSBwYXJzZUFjdGl2aXR5KG93bmVyLCByZXMsIHBhcnNlciwgYXR0cnMsIGZsYWdzLCBvdXRFcnJvciwgZmFsc2UpOworICAgICAgICAgICAgICAgIEFjdGl2aXR5IGEgPSBwYXJzZUFjdGl2aXR5KG93bmVyLCByZXMsIHBhcnNlciwgYXR0cnMsIGZsYWdzLCBvdXRFcnJvciwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICBoYXJkd2FyZUFjY2VsZXJhdGVkKTsKICAgICAgICAgICAgICAgICBpZiAoYSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgIG1QYXJzZUVycm9yID0gUGFja2FnZU1hbmFnZXIuSU5TVEFMTF9QQVJTRV9GQUlMRURfTUFOSUZFU1RfTUFMRk9STUVEOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CkBAIC0xNjQxLDcgKzE2NDgsNyBAQAogICAgICAgICAgICAgICAgIG93bmVyLmFjdGl2aXRpZXMuYWRkKGEpOwogCiAgICAgICAgICAgICB9IGVsc2UgaWYgKHRhZ05hbWUuZXF1YWxzKCJyZWNlaXZlciIpKSB7Ci0gICAgICAgICAgICAgICAgQWN0aXZpdHkgYSA9IHBhcnNlQWN0aXZpdHkob3duZXIsIHJlcywgcGFyc2VyLCBhdHRycywgZmxhZ3MsIG91dEVycm9yLCB0cnVlKTsKKyAgICAgICAgICAgICAgICBBY3Rpdml0eSBhID0gcGFyc2VBY3Rpdml0eShvd25lciwgcmVzLCBwYXJzZXIsIGF0dHJzLCBmbGFncywgb3V0RXJyb3IsIHRydWUsIGZhbHNlKTsKICAgICAgICAgICAgICAgICBpZiAoYSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgIG1QYXJzZUVycm9yID0gUGFja2FnZU1hbmFnZXIuSU5TVEFMTF9QQVJTRV9GQUlMRURfTUFOSUZFU1RfTUFMRk9STUVEOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CkBAIC0xNzc2LDcgKzE3ODMsOCBAQAogCiAgICAgcHJpdmF0ZSBBY3Rpdml0eSBwYXJzZUFjdGl2aXR5KFBhY2thZ2Ugb3duZXIsIFJlc291cmNlcyByZXMsCiAgICAgICAgICAgICBYbWxQdWxsUGFyc2VyIHBhcnNlciwgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZmxhZ3MsIFN0cmluZ1tdIG91dEVycm9yLAotICAgICAgICAgICAgYm9vbGVhbiByZWNlaXZlcikgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGJvb2xlYW4gcmVjZWl2ZXIsIGJvb2xlYW4gaGFyZHdhcmVBY2NlbGVyYXRlZCkKKyAgICAgICAgICAgIHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIFR5cGVkQXJyYXkgc2EgPSByZXMub2J0YWluQXR0cmlidXRlcyhhdHRycywKICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BbmRyb2lkTWFuaWZlc3RBY3Rpdml0eSk7CiAKQEAgLTE4ODYsOCArMTg5NCwxNCBAQAogICAgICAgICAgICAgICAgIGZhbHNlKSkgewogICAgICAgICAgICAgYS5pbmZvLmZsYWdzIHw9IEFjdGl2aXR5SW5mby5GTEFHX0lNTUVSU0lWRTsKICAgICAgICAgfQotCisgICAgICAgIAogICAgICAgICBpZiAoIXJlY2VpdmVyKSB7CisgICAgICAgICAgICBpZiAoc2EuZ2V0Qm9vbGVhbigKKyAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5kcm9pZE1hbmlmZXN0QWN0aXZpdHlfaGFyZHdhcmVBY2NlbGVyYXRlZCwKKyAgICAgICAgICAgICAgICAgICAgaGFyZHdhcmVBY2NlbGVyYXRlZCkpIHsKKyAgICAgICAgICAgICAgICBhLmluZm8uZmxhZ3MgfD0gQWN0aXZpdHlJbmZvLkZMQUdfSEFSRFdBUkVfQUNDRUxFUkFURUQ7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGEuaW5mby5sYXVuY2hNb2RlID0gc2EuZ2V0SW50KAogICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BbmRyb2lkTWFuaWZlc3RBY3Rpdml0eV9sYXVuY2hNb2RlLAogICAgICAgICAgICAgICAgICAgICBBY3Rpdml0eUluZm8uTEFVTkNIX01VTFRJUExFKTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvcmVzL0Fzc2V0RmlsZURlc2NyaXB0b3IuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvcmVzL0Fzc2V0RmlsZURlc2NyaXB0b3IuamF2YQppbmRleCBhMzdlNGU4Li4wMWFlMWRhIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L3Jlcy9Bc3NldEZpbGVEZXNjcmlwdG9yLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9yZXMvQXNzZXRGaWxlRGVzY3JpcHRvci5qYXZhCkBAIC0yNSw4ICsyNSw2IEBACiBpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5pby5jaGFubmVscy5GaWxlQ2hhbm5lbDsKIAogLyoqCiAgKiBGaWxlIGRlc2NyaXB0b3Igb2YgYW4gZW50cnkgaW4gdGhlIEFzc2V0TWFuYWdlci4gIFRoaXMgcHJvdmlkZXMgeW91ciBvd24KQEAgLTUxLDcgKzQ5LDcgQEAKICAgICAgKiBAcGFyYW0gc3RhcnRPZmZzZXQgVGhlIGxvY2F0aW9uIHdpdGhpbiB0aGUgZmlsZSB0aGF0IHRoZSBhc3NldCBzdGFydHMuCiAgICAgICogVGhpcyBtdXN0IGJlIDAgaWYgbGVuZ3RoIGlzIFVOS05PV05fTEVOR1RILgogICAgICAqIEBwYXJhbSBsZW5ndGggVGhlIG51bWJlciBvZiBieXRlcyBvZiB0aGUgYXNzZXQsIG9yCi0gICAgICoge0BsaW5rICNVTktOT1dOX0xFTkdUSCBpZiBpdCBleHRlbmRzIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUuCisgICAgICoge0BsaW5rICNVTktOT1dOX0xFTkdUSH0gaWYgaXQgZXh0ZW5kcyB0byB0aGUgZW5kIG9mIHRoZSBmaWxlLgogICAgICAqLwogICAgIHB1YmxpYyBBc3NldEZpbGVEZXNjcmlwdG9yKFBhcmNlbEZpbGVEZXNjcmlwdG9yIGZkLCBsb25nIHN0YXJ0T2Zmc2V0LAogICAgICAgICAgICAgbG9uZyBsZW5ndGgpIHsKQEAgLTEyNSwxMyArMTIzLDYgQEAKICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIG1GZC5jbG9zZSgpOwogICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDaGVja3Mgd2hldGhlciB0aGlzIGZpbGUgZGVzY3JpcHRvciBpcyBmb3IgYSBtZW1vcnkgZmlsZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNNZW1vcnlGaWxlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIE1lbW9yeUZpbGUuaXNNZW1vcnlGaWxlKG1GZC5nZXRGaWxlRGVzY3JpcHRvcigpKTsKLSAgICB9CiAKICAgICAvKioKICAgICAgKiBDcmVhdGUgYW5kIHJldHVybiBhIG5ldyBhdXRvLWNsb3NlIGlucHV0IHN0cmVhbSBmb3IgdGhpcyBhc3NldC4gIFRoaXMKQEAgLTE0MiwxMiArMTMzLDYgQEAKICAgICAgKiBzaG91bGQgb25seSBjYWxsIHRoaXMgb25jZSBmb3IgYSBwYXJ0aWN1bGFyIGFzc2V0LgogICAgICAqLwogICAgIHB1YmxpYyBGaWxlSW5wdXRTdHJlYW0gY3JlYXRlSW5wdXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBpZiAoaXNNZW1vcnlGaWxlKCkpIHsKLSAgICAgICAgICAgIGlmIChtTGVuZ3RoID4gSW50ZWdlci5NQVhfVkFMVUUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkZpbGUgbGVuZ3RoIHRvbyBsYXJnZSBmb3IgYSBtZW1vcnkgZmlsZTogIiArIG1MZW5ndGgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG5ldyBBdXRvQ2xvc2VNZW1vcnlGaWxlSW5wdXRTdHJlYW0obUZkLCAoaW50KW1MZW5ndGgpOwotICAgICAgICB9CiAgICAgICAgIGlmIChtTGVuZ3RoIDwgMCkgewogICAgICAgICAgICAgcmV0dXJuIG5ldyBQYXJjZWxGaWxlRGVzY3JpcHRvci5BdXRvQ2xvc2VJbnB1dFN0cmVhbShtRmQpOwogICAgICAgICB9CkBAIC0yNzYsNjYgKzI2MSw2IEBACiAgICAgICAgICAgICBzdXBlci5yZXNldCgpOwogICAgICAgICB9CiAgICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEFuIGlucHV0IHN0cmVhbSB0aGF0IHJlYWRzIGZyb20gYSBNZW1vcnlGaWxlIGFuZCBjbG9zZXMgaXQgd2hlbiB0aGUgc3RyZWFtIGlzIGNsb3NlZC4KLSAgICAgKiBUaGlzIGV4dGVuZHMgRmlsZUlucHV0U3RyZWFtIGp1c3QgYmVjYXVzZSB7QGxpbmsgI2NyZWF0ZUlucHV0U3RyZWFtfSByZXR1cm5zCi0gICAgICogYSBGaWxlSW5wdXRTdHJlYW0uIEFsbCB0aGUgRmlsZUlucHV0U3RyZWFtIG1ldGhvZHMgYXJlCi0gICAgICogb3ZlcnJpZGRlbiB0byB1c2UgdGhlIE1lbW9yeUZpbGUgaW5zdGVhZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBBdXRvQ2xvc2VNZW1vcnlGaWxlSW5wdXRTdHJlYW0gZXh0ZW5kcyBGaWxlSW5wdXRTdHJlYW0gewotICAgICAgICBwcml2YXRlIFBhcmNlbEZpbGVEZXNjcmlwdG9yIG1QYXJjZWxGZDsKLSAgICAgICAgcHJpdmF0ZSBNZW1vcnlGaWxlIG1GaWxlOwotICAgICAgICBwcml2YXRlIElucHV0U3RyZWFtIG1TdHJlYW07Ci0KLSAgICAgICAgcHVibGljIEF1dG9DbG9zZU1lbW9yeUZpbGVJbnB1dFN0cmVhbShQYXJjZWxGaWxlRGVzY3JpcHRvciBmZCwgaW50IGxlbmd0aCkKLSAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAgICAgc3VwZXIoZmQuZ2V0RmlsZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgICAgICBtUGFyY2VsRmQgPSBmZDsKLSAgICAgICAgICAgIG1GaWxlID0gbmV3IE1lbW9yeUZpbGUoZmQuZ2V0RmlsZURlc2NyaXB0b3IoKSwgbGVuZ3RoLCAiciIpOwotICAgICAgICAgICAgbVN0cmVhbSA9IG1GaWxlLmdldElucHV0U3RyZWFtKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGludCBhdmFpbGFibGUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAgICAgcmV0dXJuIG1TdHJlYW0uYXZhaWxhYmxlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAgICAgbVBhcmNlbEZkLmNsb3NlKCk7ICAvLyBtdXN0IGNsb3NlIFBhcmNlbEZpbGVEZXNjcmlwdG9yLCBub3QganVzdCB0aGUgZmlsZSBkZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzaW5jZSBpdCBjb3VsZCBiZSBhIHN1YmNsYXNzIG9mIFBhcmNlbEZpbGVEZXNjcmlwdG9yLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFLmcuIENvbnRlbnRSZXNvbHZlci5QYXJjZWxGaWxlRGVzY3JpcHRvcklubmVyLmNsb3NlKCkgcmVsZWFzZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYSBjb250ZW50IHByb3ZpZGVyCi0gICAgICAgICAgICBtRmlsZS5jbG9zZSgpOyAgICAgIC8vIHRvIHVubWFwIHRoZSBtZW1vcnkgZmlsZSBmcm9tIHRoZSBhZGRyZXNzIHNwYWNlLgotICAgICAgICAgICAgbVN0cmVhbS5jbG9zZSgpOyAgICAvLyBkb2Vzbid0IGFjdHVhbGx5IGRvIGFueXRoaW5nCi0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEZpbGVDaGFubmVsIGdldENoYW5uZWwoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAgICAgcmV0dXJuIG1TdHJlYW0ucmVhZCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBpbnQgcmVhZChieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgY291bnQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICByZXR1cm4gbVN0cmVhbS5yZWFkKGJ1ZmZlciwgb2Zmc2V0LCBjb3VudCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGludCByZWFkKGJ5dGVbXSBidWZmZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICByZXR1cm4gbVN0cmVhbS5yZWFkKGJ1ZmZlcik7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGxvbmcgc2tpcChsb25nIGNvdW50KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAgICAgcmV0dXJuIG1TdHJlYW0uc2tpcChjb3VudCk7Ci0gICAgICAgIH0KLSAgICB9CiAKICAgICAvKioKICAgICAgKiBBbiBPdXRwdXRTdHJlYW0geW91IGNhbiBjcmVhdGUgb24gYSBQYXJjZWxGaWxlRGVzY3JpcHRvciwgd2hpY2ggd2lsbApAQCAtNDIyLDE1ICszNDcsNCBAQAogICAgICAgICB9CiAgICAgfTsKIAotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4gQXNzZXRGaWxlRGVzY3JpcHRvciBmcm9tIGEgbWVtb3J5IGZpbGUuCi0gICAgICoKLSAgICAgKiBAaGlkZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQXNzZXRGaWxlRGVzY3JpcHRvciBmcm9tTWVtb3J5RmlsZShNZW1vcnlGaWxlIG1lbW9yeUZpbGUpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBQYXJjZWxGaWxlRGVzY3JpcHRvciBmZCA9IG1lbW9yeUZpbGUuZ2V0UGFyY2VsRmlsZURlc2NyaXB0b3IoKTsKLSAgICAgICAgcmV0dXJuIG5ldyBBc3NldEZpbGVEZXNjcmlwdG9yKGZkLCAwLCBtZW1vcnlGaWxlLmxlbmd0aCgpKTsKLSAgICB9Ci0KIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvcmVzL0NvbmZpZ3VyYXRpb24uamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvcmVzL0NvbmZpZ3VyYXRpb24uamF2YQppbmRleCAwMjk1NmJhLi4yZjExMGYwIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L3Jlcy9Db25maWd1cmF0aW9uLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9yZXMvQ29uZmlndXJhdGlvbi5qYXZhCkBAIC0yNjYsMTEgKzI2NiwxOCBAQAogICAgICAgICBzYi5hcHBlbmQoIi8iKTsKICAgICAgICAgc2IuYXBwZW5kKG5hdmlnYXRpb25IaWRkZW4pOwogICAgICAgICBzYi5hcHBlbmQoIiBvcmllbj0iKTsKLSAgICAgICAgc2IuYXBwZW5kKG9yaWVudGF0aW9uKTsKLSAgICAgICAgc2IuYXBwZW5kKCIgbGF5b3V0PSIpOwotICAgICAgICBzYi5hcHBlbmQoc2NyZWVuTGF5b3V0KTsKLSAgICAgICAgc2IuYXBwZW5kKCIgdWlNb2RlPSIpOwotICAgICAgICBzYi5hcHBlbmQodWlNb2RlKTsKKyAgICAgICAgc3dpdGNoKG9yaWVudGF0aW9uKSB7CisgICAgICAgICAgICBjYXNlIE9SSUVOVEFUSU9OX0xBTkRTQ0FQRToKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIkwiKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9SSUVOVEFUSU9OX1BPUlRSQUlUOgorICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiUCIpOyBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKG9yaWVudGF0aW9uKTsKKyAgICAgICAgfQorICAgICAgICBzYi5hcHBlbmQoIiBsYXlvdXQ9MHgiKTsKKyAgICAgICAgc2IuYXBwZW5kKGphdmEubGFuZy5JbnRlZ2VyLnRvSGV4U3RyaW5nKHNjcmVlbkxheW91dCkpOworICAgICAgICBzYi5hcHBlbmQoIiB1aU1vZGU9MHgiKTsKKyAgICAgICAgc2IuYXBwZW5kKGphdmEubGFuZy5JbnRlZ2VyLnRvSGV4U3RyaW5nKHVpTW9kZSkpOwogICAgICAgICBpZiAoc2VxICE9IDApIHsKICAgICAgICAgICAgIHNiLmFwcGVuZCgiIHNlcT0iKTsKICAgICAgICAgICAgIHNiLmFwcGVuZChzZXEpOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9yZXMvUGx1cmFsUnVsZXMuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvcmVzL1BsdXJhbFJ1bGVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkY2UzYzEuLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9yZXMvUGx1cmFsUnVsZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLmNvbnRlbnQucmVzOwotCi1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLQotLyoKLSAqIFl1Y2stby4gIFRoaXMgaXMgbm90IHRoZSByaWdodCB3YXkgdG8gaW1wbGVtZW50IHRoaXMuICBXaGVuIHRoZSBJQ1UgUGx1cmFsUnVsZXMKLSAqIG9iamVjdCBoYXMgYmVlbiBpbnRlZ3JhdGVkIHRvIGFuZHJvaWQsIHdlIHNob3VsZCBzd2l0Y2ggdG8gdGhhdC4gIEZvciBub3csIHl1Y2stby4KLSAqLwotCi1hYnN0cmFjdCBjbGFzcyBQbHVyYWxSdWxlcyB7Ci0KLSAgICBzdGF0aWMgZmluYWwgaW50IFFVQU5USVRZX09USEVSID0gMHgwMDAwOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgUVVBTlRJVFlfWkVSTyAgPSAweDAwMDE7Ci0gICAgc3RhdGljIGZpbmFsIGludCBRVUFOVElUWV9PTkUgICA9IDB4MDAwMjsKLSAgICBzdGF0aWMgZmluYWwgaW50IFFVQU5USVRZX1RXTyAgID0gMHgwMDA0OwotICAgIHN0YXRpYyBmaW5hbCBpbnQgUVVBTlRJVFlfRkVXICAgPSAweDAwMDg7Ci0gICAgc3RhdGljIGZpbmFsIGludCBRVUFOVElUWV9NQU5ZICA9IDB4MDAxMDsKLQotICAgIHN0YXRpYyBmaW5hbCBpbnQgSURfT1RIRVIgPSAweDAxMDAwMDA0OwotCi0gICAgYWJzdHJhY3QgaW50IHF1YW50aXR5Rm9yTnVtYmVyKGludCBuKTsKLQotICAgIGZpbmFsIGludCBhdHRyRm9yTnVtYmVyKGludCBuKSB7Ci0gICAgICAgIHJldHVybiBQbHVyYWxSdWxlcy5hdHRyRm9yUXVhbnRpdHkocXVhbnRpdHlGb3JOdW1iZXIobikpOwotICAgIH0KLQotICAgIHN0YXRpYyBmaW5hbCBpbnQgYXR0ckZvclF1YW50aXR5KGludCBxdWFudGl0eSkgewotICAgICAgICAvLyBzZWUgaW5jbHVkZS91dGlscy9SZXNvdXJjZVR5cGVzLmgKLSAgICAgICAgc3dpdGNoIChxdWFudGl0eSkgewotICAgICAgICAgICAgY2FzZSBRVUFOVElUWV9aRVJPOiByZXR1cm4gMHgwMTAwMDAwNTsKLSAgICAgICAgICAgIGNhc2UgUVVBTlRJVFlfT05FOiAgcmV0dXJuIDB4MDEwMDAwMDY7Ci0gICAgICAgICAgICBjYXNlIFFVQU5USVRZX1RXTzogIHJldHVybiAweDAxMDAwMDA3OwotICAgICAgICAgICAgY2FzZSBRVUFOVElUWV9GRVc6ICByZXR1cm4gMHgwMTAwMDAwODsKLSAgICAgICAgICAgIGNhc2UgUVVBTlRJVFlfTUFOWTogcmV0dXJuIDB4MDEwMDAwMDk7Ci0gICAgICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgIHJldHVybiBJRF9PVEhFUjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgc3RyaW5nRm9yUXVhbnRpdHkoaW50IHF1YW50aXR5KSB7Ci0gICAgICAgIHN3aXRjaCAocXVhbnRpdHkpIHsKLSAgICAgICAgICAgIGNhc2UgUVVBTlRJVFlfWkVSTzoKLSAgICAgICAgICAgICAgICByZXR1cm4gInplcm8iOwotICAgICAgICAgICAgY2FzZSBRVUFOVElUWV9PTkU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJvbmUiOwotICAgICAgICAgICAgY2FzZSBRVUFOVElUWV9UV086Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJ0d28iOwotICAgICAgICAgICAgY2FzZSBRVUFOVElUWV9GRVc6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJmZXciOwotICAgICAgICAgICAgY2FzZSBRVUFOVElUWV9NQU5ZOgotICAgICAgICAgICAgICAgIHJldHVybiAibWFueSI7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHJldHVybiAib3RoZXIiOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdGljIGZpbmFsIFBsdXJhbFJ1bGVzIHJ1bGVGb3JMb2NhbGUoTG9jYWxlIGxvY2FsZSkgewotICAgICAgICBTdHJpbmcgbGFuZyA9IGxvY2FsZS5nZXRMYW5ndWFnZSgpOwotICAgICAgICBpZiAoImNzIi5lcXVhbHMobGFuZykpIHsKLSAgICAgICAgICAgIGlmIChjcyA9PSBudWxsKSBjcyA9IG5ldyBjcygpOwotICAgICAgICAgICAgcmV0dXJuIGNzOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgaWYgKGVuID09IG51bGwpIGVuID0gbmV3IGVuKCk7Ci0gICAgICAgICAgICByZXR1cm4gZW47Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBQbHVyYWxSdWxlcyBjczsKLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBjcyBleHRlbmRzIFBsdXJhbFJ1bGVzIHsKLSAgICAgICAgaW50IHF1YW50aXR5Rm9yTnVtYmVyKGludCBuKSB7Ci0gICAgICAgICAgICBpZiAobiA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFFVQU5USVRZX09ORTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKG4gPj0gMiAmJiBuIDw9IDQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gUVVBTlRJVFlfRkVXOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFFVQU5USVRZX09USEVSOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgUGx1cmFsUnVsZXMgZW47Ci0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgZW4gZXh0ZW5kcyBQbHVyYWxSdWxlcyB7Ci0gICAgICAgIGludCBxdWFudGl0eUZvck51bWJlcihpbnQgbikgewotICAgICAgICAgICAgaWYgKG4gPT0gMSkgewotICAgICAgICAgICAgICAgIHJldHVybiBRVUFOVElUWV9PTkU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gUVVBTlRJVFlfT1RIRVI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvcmVzL1Jlc291cmNlcy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9yZXMvUmVzb3VyY2VzLmphdmEKaW5kZXggYTY1MTNhYS4uOWIyM2MxZSAxMDA3NTUKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9yZXMvUmVzb3VyY2VzLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9yZXMvUmVzb3VyY2VzLmphdmEKQEAgLTE2LDcgKzE2LDYgQEAKIAogcGFja2FnZSBhbmRyb2lkLmNvbnRlbnQucmVzOwogCi0KIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLlhtbFV0aWxzOwogCiBpbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlcjsKQEAgLTQyLDYgKzQxLDggQEAKIGltcG9ydCBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2U7CiBpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKIAoraW1wb3J0IGxpYmNvcmUuaWN1Lk5hdGl2ZVBsdXJhbFJ1bGVzOworCiAvKioKICAqIENsYXNzIGZvciBhY2Nlc3NpbmcgYW4gYXBwbGljYXRpb24ncyByZXNvdXJjZXMuICBUaGlzIHNpdHMgb24gdG9wIG9mIHRoZQogICogYXNzZXQgbWFuYWdlciBvZiB0aGUgYXBwbGljYXRpb24gKGFjY2Vzc2libGUgdGhyb3VnaCBnZXRBc3NldHMoKSkgYW5kCkBAIC01Myw2ICs1NCw4IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVR19DT05GSUcgPSBmYWxzZTsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIFRSQUNFX0ZPUl9QUkVMT0FEID0gZmFsc2U7CiAKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSURfT1RIRVIgPSAweDAxMDAwMDA0OworCiAgICAgLy8gVXNlIHRoZSBjdXJyZW50IFNESyB2ZXJzaW9uIGNvZGUuICBJZiB3ZSBhcmUgYSBkZXZlbG9wbWVudCBidWlsZCwKICAgICAvLyBhbHNvIGFsbG93IHRoZSBwcmV2aW91cyBTREsgdmVyc2lvbiArIDEuCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IHNTZGtWZXJzaW9uID0gQnVpbGQuVkVSU0lPTi5TREtfSU5UCkBAIC05MSw3ICs5NCw3IEBACiAgICAgLypwYWNrYWdlKi8gZmluYWwgQXNzZXRNYW5hZ2VyIG1Bc3NldHM7CiAgICAgcHJpdmF0ZSBmaW5hbCBDb25maWd1cmF0aW9uIG1Db25maWd1cmF0aW9uID0gbmV3IENvbmZpZ3VyYXRpb24oKTsKICAgICAvKnBhY2thZ2UqLyBmaW5hbCBEaXNwbGF5TWV0cmljcyBtTWV0cmljcyA9IG5ldyBEaXNwbGF5TWV0cmljcygpOwotICAgIFBsdXJhbFJ1bGVzIG1QbHVyYWxSdWxlOworICAgIHByaXZhdGUgTmF0aXZlUGx1cmFsUnVsZXMgbVBsdXJhbFJ1bGU7CiAgICAgCiAgICAgcHJpdmF0ZSBDb21wYXRpYmlsaXR5SW5mbyBtQ29tcGF0aWJpbGl0eUluZm87CiAgICAgcHJpdmF0ZSBEaXNwbGF5IG1EZWZhdWx0RGlzcGxheTsKQEAgLTIwOCw5ICsyMTEsMTcgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGNoYXJhY3RlciBzZXF1ZW5jZSBhc3NvY2lhdGVkIHdpdGggYSBwYXJ0aWN1bGFyIHJlc291cmNlIElEIGZvciBhIHBhcnRpY3VsYXIKKyAgICAgKiBudW1lcmljYWwgcXVhbnRpdHkuCisgICAgICoKKyAgICAgKiA8cD5TZWUgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy9yZXNvdXJjZXMvc3RyaW5nLXJlc291cmNlLmh0bWwjUGx1cmFscyI+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/IGV4dGVuZHMgTWFwPFN0cmluZywgT2JqZWN0Pj4gdmFsdWVzKSB7Ci0gICAgICAgIHJldHVybiBtQ3Vyc29yLmNvbW1pdFVwZGF0ZXModmFsdWVzKTsKLSAgICB9Ci0KICAgICBwdWJsaWMgaW50IGdldENvdW50KCkgewogICAgICAgICByZXR1cm4gbUN1cnNvci5nZXRDb3VudCgpOwogICAgIH0KQEAgLTc0LDE0ICs1NSw2IEBACiAgICAgICAgIG1DdXJzb3IuZGVhY3RpdmF0ZSgpOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBkZWxldGVSb3coKSB7Ci0gICAgICAgIHJldHVybiBtQ3Vyc29yLmRlbGV0ZVJvdygpOwotICAgIH0KLQogICAgIHB1YmxpYyBib29sZWFuIG1vdmVUb0ZpcnN0KCkgewogICAgICAgICByZXR1cm4gbUN1cnNvci5tb3ZlVG9GaXJzdCgpOwogICAgIH0KQEAgLTE0NywxNCArMTIwLDYgQEAKICAgICAgICAgcmV0dXJuIG1DdXJzb3IuZ2V0V2FudHNBbGxPbk1vdmVDYWxscygpOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNVcGRhdGVzKCkgewotICAgICAgICByZXR1cm4gbUN1cnNvci5oYXNVcGRhdGVzKCk7Ci0gICAgfQotCiAgICAgcHVibGljIGJvb2xlYW4gaXNBZnRlckxhc3QoKSB7CiAgICAgICAgIHJldHVybiBtQ3Vyc29yLmlzQWZ0ZXJMYXN0KCk7CiAgICAgfQpAQCAtMTcxLDYgKzEzNiwxMCBAQAogICAgICAgICByZXR1cm4gbUN1cnNvci5pc0xhc3QoKTsKICAgICB9CiAKKyAgICBwdWJsaWMgaW50IGdldFR5cGUoaW50IGNvbHVtbkluZGV4KSB7CisgICAgICAgIHJldHVybiBtQ3Vyc29yLmdldFR5cGUoY29sdW1uSW5kZXgpOworICAgIH0KKwogICAgIHB1YmxpYyBib29sZWFuIGlzTnVsbChpbnQgY29sdW1uSW5kZXgpIHsKICAgICAgICAgcmV0dXJuIG1DdXJzb3IuaXNOdWxsKGNvbHVtbkluZGV4KTsKICAgICB9CkBAIC0yMTksMTQgKzE4OCw2IEBACiAgICAgICAgIG1DdXJzb3Iuc2V0Tm90aWZpY2F0aW9uVXJpKGNyLCB1cmkpOyAgICAgICAgCiAgICAgfQogCi0gICAgLyoqCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzVXBkYXRlcygpIHsKLSAgICAgICAgcmV0dXJuIG1DdXJzb3Iuc3VwcG9ydHNVcGRhdGVzKCk7Ci0gICAgfQotCiAgICAgcHVibGljIHZvaWQgdW5yZWdpc3RlckNvbnRlbnRPYnNlcnZlcihDb250ZW50T2JzZXJ2ZXIgb2JzZXJ2ZXIpIHsKICAgICAgICAgbUN1cnNvci51bnJlZ2lzdGVyQ29udGVudE9ic2VydmVyKG9ic2VydmVyKTsgICAgICAgIAogICAgIH0KQEAgLTIzNCw3MiArMTk1LDUgQEAKICAgICBwdWJsaWMgdm9pZCB1bnJlZ2lzdGVyRGF0YVNldE9ic2VydmVyKERhdGFTZXRPYnNlcnZlciBvYnNlcnZlcikgewogICAgICAgICBtQ3Vyc29yLnVucmVnaXN0ZXJEYXRhU2V0T2JzZXJ2ZXIob2JzZXJ2ZXIpOwogICAgIH0KLQotICAgIC8qKgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiB1cGRhdGVEb3VibGUoaW50IGNvbHVtbkluZGV4LCBkb3VibGUgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIG1DdXJzb3IudXBkYXRlRG91YmxlKGNvbHVtbkluZGV4LCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHVwZGF0ZUZsb2F0KGludCBjb2x1bW5JbmRleCwgZmxvYXQgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIG1DdXJzb3IudXBkYXRlRmxvYXQoY29sdW1uSW5kZXgsIHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gdXBkYXRlSW50KGludCBjb2x1bW5JbmRleCwgaW50IHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiBtQ3Vyc29yLnVwZGF0ZUludChjb2x1bW5JbmRleCwgdmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiB1cGRhdGVMb25nKGludCBjb2x1bW5JbmRleCwgbG9uZyB2YWx1ZSkgewotICAgICAgICByZXR1cm4gbUN1cnNvci51cGRhdGVMb25nKGNvbHVtbkluZGV4LCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHVwZGF0ZVNob3J0KGludCBjb2x1bW5JbmRleCwgc2hvcnQgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIG1DdXJzb3IudXBkYXRlU2hvcnQoY29sdW1uSW5kZXgsIHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gdXBkYXRlU3RyaW5nKGludCBjb2x1bW5JbmRleCwgU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiBtQ3Vyc29yLnVwZGF0ZVN0cmluZyhjb2x1bW5JbmRleCwgdmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiB1cGRhdGVCbG9iKGludCBjb2x1bW5JbmRleCwgYnl0ZVtdIHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiBtQ3Vyc29yLnVwZGF0ZUJsb2IoY29sdW1uSW5kZXgsIHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gdXBkYXRlVG9OdWxsKGludCBjb2x1bW5JbmRleCkgewotICAgICAgICByZXR1cm4gbUN1cnNvci51cGRhdGVUb051bGwoY29sdW1uSW5kZXgpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIEN1cnNvciBtQ3Vyc29yOwotICAgIAogfQogCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9EYXRhU2V0T2JzZXJ2YWJsZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvRGF0YVNldE9ic2VydmFibGUuamF2YQppbmRleCA5MjAwZTgxLi41MWM3MmMxIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9EYXRhU2V0T2JzZXJ2YWJsZS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0RhdGFTZXRPYnNlcnZhYmxlLmphdmEKQEAgLTI3LDggKzI3LDEyIEBACiAgICAgICovCiAgICAgcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZCgpIHsKICAgICAgICAgc3luY2hyb25pemVkKG1PYnNlcnZlcnMpIHsKLSAgICAgICAgICAgIGZvciAoRGF0YVNldE9ic2VydmVyIG9ic2VydmVyIDogbU9ic2VydmVycykgewotICAgICAgICAgICAgICAgIG9ic2VydmVyLm9uQ2hhbmdlZCgpOworICAgICAgICAgICAgLy8gc2luY2Ugb25DaGFuZ2VkKCkgaXMgaW1wbGVtZW50ZWQgYnkgdGhlIGFwcCwgaXQgY291bGQgZG8gYW55dGhpbmcsIGluY2x1ZGluZworICAgICAgICAgICAgLy8gcmVtb3ZpbmcgaXRzZWxmIGZyb20ge0BsaW5rIG1PYnNlcnZlcnN9IC0gYW5kIHRoYXQgY291bGQgY2F1c2UgcHJvYmxlbXMgaWYKKyAgICAgICAgICAgIC8vIGFuIGl0ZXJhdG9yIGlzIHVzZWQgb24gdGhlIEFycmF5TGlzdCB7QGxpbmsgbU9ic2VydmVyc30uCisgICAgICAgICAgICAvLyB0byBhdm9pZCBzdWNoIHByb2JsZW1zLCBqdXN0IG1hcmNoIHRocnUgdGhlIGxpc3QgaW4gdGhlIHJldmVyc2Ugb3JkZXIuCisgICAgICAgICAgICBmb3IgKGludCBpID0gbU9ic2VydmVycy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgICAgIG1PYnNlcnZlcnMuZ2V0KGkpLm9uQ2hhbmdlZCgpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtMzksOCArNDMsOCBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIG5vdGlmeUludmFsaWRhdGVkKCkgewogICAgICAgICBzeW5jaHJvbml6ZWQgKG1PYnNlcnZlcnMpIHsKLSAgICAgICAgICAgIGZvciAoRGF0YVNldE9ic2VydmVyIG9ic2VydmVyIDogbU9ic2VydmVycykgewotICAgICAgICAgICAgICAgIG9ic2VydmVyLm9uSW52YWxpZGF0ZWQoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSBtT2JzZXJ2ZXJzLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICAgICAgbU9ic2VydmVycy5nZXQoaSkub25JbnZhbGlkYXRlZCgpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvRGF0YWJhc2VFcnJvckhhbmRsZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0RhdGFiYXNlRXJyb3JIYW5kbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBjNTQ1MgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0RhdGFiYXNlRXJyb3JIYW5kbGVyLmphdmEKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5kYXRhYmFzZTsKKworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlOworCisvKioKKyAqIEFuIGludGVyZmFjZSB0byBsZXQgdGhlIGFwcHMgZGVmaW5lIHRoZSBhY3Rpb25zIHRvIHRha2Ugd2hlbiB0aGUgZm9sbG93aW5nIGVycm9ycyBhcmUgZGV0ZWN0ZWQKKyAqICAgZGF0YWJhc2UgY29ycnVwdGlvbgorICovCitwdWJsaWMgaW50ZXJmYWNlIERhdGFiYXNlRXJyb3JIYW5kbGVyIHsKKworICAgIC8qKgorICAgICAqIGRlZmluZXMgdGhlIG1ldGhvZCB0byBiZSBpbnZva2VkIHdoZW4gZGF0YWJhc2UgY29ycnVwdGlvbiBpcyBkZXRlY3RlZC4KKyAgICAgKiBAcGFyYW0gZGJPYmogdGhlIHtAbGluayBTUUxpdGVEYXRhYmFzZX0gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgZGF0YWJhc2Ugb24gd2hpY2ggY29ycnVwdGlvbgorICAgICAqIGlzIGRldGVjdGVkLgorICAgICAqLworICAgIHZvaWQgb25Db3JydXB0aW9uKFNRTGl0ZURhdGFiYXNlIGRiT2JqKTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0RhdGFiYXNlVXRpbHMuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0RhdGFiYXNlVXRpbHMuamF2YQppbmRleCA5NWZjMWZkLi4zOGQ2NTI2IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9EYXRhYmFzZVV0aWxzLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvRGF0YWJhc2VVdGlscy5qYXZhCkBAIC0zMSw2ICszMSw3IEBACiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlUHJvZ3JhbTsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVTdGF0ZW1lbnQ7CiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvcjsKIGltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Db25maWc7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKQEAgLTUwLDYgKzUxLDIzIEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IGZhbHNlOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gTE9DQUxfTE9HViA9IERFQlVHID8gQ29uZmlnLkxPR0QgOiBDb25maWcuTE9HVjsKIAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIGNvdW50UHJvamVjdGlvbiA9IG5ldyBTdHJpbmdbXXsiY291bnQoKikifTsKKworICAgIC8qKiBPbmUgb2YgdGhlIHZhbHVlcyByZXR1cm5lZCBieSB7QGxpbmsgI2dldFNxbFN0YXRlbWVudFR5cGUoU3RyaW5nKX0uICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVNRU5UX1NFTEVDVCA9IDE7CisgICAgLyoqIE9uZSBvZiB0aGUgdmFsdWVzIHJldHVybmVkIGJ5IHtAbGluayAjZ2V0U3FsU3RhdGVtZW50VHlwZShTdHJpbmcpfS4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFURU1FTlRfVVBEQVRFID0gMjsKKyAgICAvKiogT25lIG9mIHRoZSB2YWx1ZXMgcmV0dXJuZWQgYnkge0BsaW5rICNnZXRTcWxTdGF0ZW1lbnRUeXBlKFN0cmluZyl9LiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFTUVOVF9BVFRBQ0ggPSAzOworICAgIC8qKiBPbmUgb2YgdGhlIHZhbHVlcyByZXR1cm5lZCBieSB7QGxpbmsgI2dldFNxbFN0YXRlbWVudFR5cGUoU3RyaW5nKX0uICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVNRU5UX0JFR0lOID0gNDsKKyAgICAvKiogT25lIG9mIHRoZSB2YWx1ZXMgcmV0dXJuZWQgYnkge0BsaW5rICNnZXRTcWxTdGF0ZW1lbnRUeXBlKFN0cmluZyl9LiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFTUVOVF9DT01NSVQgPSA1OworICAgIC8qKiBPbmUgb2YgdGhlIHZhbHVlcyByZXR1cm5lZCBieSB7QGxpbmsgI2dldFNxbFN0YXRlbWVudFR5cGUoU3RyaW5nKX0uICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVNRU5UX0FCT1JUID0gNjsKKyAgICAvKiogT25lIG9mIHRoZSB2YWx1ZXMgcmV0dXJuZWQgYnkge0BsaW5rICNnZXRTcWxTdGF0ZW1lbnRUeXBlKFN0cmluZyl9LiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFTUVOVF9PVEhFUiA9IDc7CisKICAgICAvKioKICAgICAgKiBTcGVjaWFsIGZ1bmN0aW9uIGZvciB3cml0aW5nIGFuIGV4Y2VwdGlvbiByZXN1bHQgYXQgdGhlIGhlYWRlciBvZgogICAgICAqIGEgcGFyY2VsLCB0byBiZSB1c2VkIHdoZW4gcmV0dXJuaW5nIGFuIGV4Y2VwdGlvbiBmcm9tIGEgdHJhbnNhY3Rpb24uCkBAIC0xOTEsNiArMjA5LDM3IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogUmV0dXJucyBkYXRhIHR5cGUgb2YgdGhlIGdpdmVuIG9iamVjdCdzIHZhbHVlLgorICAgICAqPHA+CisgICAgICogUmV0dXJuZWQgdmFsdWVzIGFyZQorICAgICAqIDx1bD4KKyAgICAgKiAgIDxsaT57QGxpbmsgQ3Vyc29yI0ZJRUxEX1RZUEVfTlVMTH08L2xpPgorICAgICAqICAgPGxpPntAbGluayBDdXJzb3IjRklFTERfVFlQRV9JTlRFR0VSfTwvbGk+CisgICAgICogICA8bGk+e0BsaW5rIEN1cnNvciNGSUVMRF9UWVBFX0ZMT0FUfTwvbGk+CisgICAgICogICA8bGk+e0BsaW5rIEN1cnNvciNGSUVMRF9UWVBFX1NUUklOR308L2xpPgorICAgICAqICAgPGxpPntAbGluayBDdXJzb3IjRklFTERfVFlQRV9CTE9CfTwvbGk+CisgICAgICo8L3VsPgorICAgICAqPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIG9iaiB0aGUgb2JqZWN0IHdob3NlIHZhbHVlIHR5cGUgaXMgdG8gYmUgcmV0dXJuZWQKKyAgICAgKiBAcmV0dXJuIG9iamVjdCB2YWx1ZSB0eXBlCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGludCBnZXRUeXBlT2ZPYmplY3QoT2JqZWN0IG9iaikgeworICAgICAgICBpZiAob2JqID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBDdXJzb3IuRklFTERfVFlQRV9OVUxMOworICAgICAgICB9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIGJ5dGVbXSkgeworICAgICAgICAgICAgcmV0dXJuIEN1cnNvci5GSUVMRF9UWVBFX0JMT0I7CisgICAgICAgIH0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgRmxvYXQgfHwgb2JqIGluc3RhbmNlb2YgRG91YmxlKSB7CisgICAgICAgICAgICByZXR1cm4gQ3Vyc29yLkZJRUxEX1RZUEVfRkxPQVQ7CisgICAgICAgIH0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgTG9uZyB8fCBvYmogaW5zdGFuY2VvZiBJbnRlZ2VyKSB7CisgICAgICAgICAgICByZXR1cm4gQ3Vyc29yLkZJRUxEX1RZUEVfSU5URUdFUjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBDdXJzb3IuRklFTERfVFlQRV9TVFJJTkc7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKICAgICAgKiBBcHBlbmRzIGFuIFNRTCBzdHJpbmcgdG8gdGhlIGdpdmVuIFN0cmluZ0J1aWxkZXIsIGluY2x1ZGluZyB0aGUgb3BlbmluZwogICAgICAqIGFuZCBjbG9zaW5nIHNpbmdsZSBxdW90ZXMuIEFueSBzaW5nbGUgcXVvdGVzIGludGVybmFsIHRvIHNxbFN0cmluZyB3aWxsCiAgICAgICogYmUgZXNjYXBlZC4KQEAgLTY1NiwxNCArNzA1LDggQEAKICAgICAgKiBmaXJzdCBjb2x1bW4gb2YgdGhlIGZpcnN0IHJvdy4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGxvbmcgbG9uZ0ZvclF1ZXJ5KFNRTGl0ZVN0YXRlbWVudCBwcm9nLCBTdHJpbmdbXSBzZWxlY3Rpb25BcmdzKSB7Ci0gICAgICAgIGlmIChzZWxlY3Rpb25BcmdzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGludCBzaXplID0gc2VsZWN0aW9uQXJncy5sZW5ndGg7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICAgICAgICAgIGJpbmRPYmplY3RUb1Byb2dyYW0ocHJvZywgaSArIDEsIHNlbGVjdGlvbkFyZ3NbaV0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGxvbmcgdmFsdWUgPSBwcm9nLnNpbXBsZVF1ZXJ5Rm9yTG9uZygpOwotICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgIHByb2cuYmluZEFsbEFyZ3NBc1N0cmluZ3Moc2VsZWN0aW9uQXJncyk7CisgICAgICAgIHJldHVybiBwcm9nLnNpbXBsZVF1ZXJ5Rm9yTG9uZygpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNjg0LDE0ICs3MjcsMzYgQEAKICAgICAgKiBmaXJzdCBjb2x1bW4gb2YgdGhlIGZpcnN0IHJvdy4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBzdHJpbmdGb3JRdWVyeShTUUxpdGVTdGF0ZW1lbnQgcHJvZywgU3RyaW5nW10gc2VsZWN0aW9uQXJncykgewotICAgICAgICBpZiAoc2VsZWN0aW9uQXJncyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbnQgc2l6ZSA9IHNlbGVjdGlvbkFyZ3MubGVuZ3RoOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgICAgICAgICBiaW5kT2JqZWN0VG9Qcm9ncmFtKHByb2csIGkgKyAxLCBzZWxlY3Rpb25BcmdzW2ldKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgcHJvZy5iaW5kQWxsQXJnc0FzU3RyaW5ncyhzZWxlY3Rpb25BcmdzKTsKKyAgICAgICAgcmV0dXJuIHByb2cuc2ltcGxlUXVlcnlGb3JTdHJpbmcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVdGlsaXR5IG1ldGhvZCB0byBydW4gdGhlIHF1ZXJ5IG9uIHRoZSBkYiBhbmQgcmV0dXJuIHRoZSBibG9iIHZhbHVlIGluIHRoZQorICAgICAqIGZpcnN0IGNvbHVtbiBvZiB0aGUgZmlyc3Qgcm93LgorICAgICAqCisgICAgICogQHJldHVybiBBIHJlYWQtb25seSBmaWxlIGRlc2NyaXB0b3IgZm9yIGEgY29weSBvZiB0aGUgYmxvYiB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFBhcmNlbEZpbGVEZXNjcmlwdG9yIGJsb2JGaWxlRGVzY3JpcHRvckZvclF1ZXJ5KFNRTGl0ZURhdGFiYXNlIGRiLAorICAgICAgICAgICAgU3RyaW5nIHF1ZXJ5LCBTdHJpbmdbXSBzZWxlY3Rpb25BcmdzKSB7CisgICAgICAgIFNRTGl0ZVN0YXRlbWVudCBwcm9nID0gZGIuY29tcGlsZVN0YXRlbWVudChxdWVyeSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gYmxvYkZpbGVEZXNjcmlwdG9yRm9yUXVlcnkocHJvZywgc2VsZWN0aW9uQXJncyk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBwcm9nLmNsb3NlKCk7CiAgICAgICAgIH0KLSAgICAgICAgU3RyaW5nIHZhbHVlID0gcHJvZy5zaW1wbGVRdWVyeUZvclN0cmluZygpOwotICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogVXRpbGl0eSBtZXRob2QgdG8gcnVuIHRoZSBwcmUtY29tcGlsZWQgcXVlcnkgYW5kIHJldHVybiB0aGUgYmxvYiB2YWx1ZSBpbiB0aGUKKyAgICAgKiBmaXJzdCBjb2x1bW4gb2YgdGhlIGZpcnN0IHJvdy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gQSByZWFkLW9ubHkgZmlsZSBkZXNjcmlwdG9yIGZvciBhIGNvcHkgb2YgdGhlIGJsb2IgdmFsdWUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBQYXJjZWxGaWxlRGVzY3JpcHRvciBibG9iRmlsZURlc2NyaXB0b3JGb3JRdWVyeShTUUxpdGVTdGF0ZW1lbnQgcHJvZywKKyAgICAgICAgICAgIFN0cmluZ1tdIHNlbGVjdGlvbkFyZ3MpIHsKKyAgICAgICAgcHJvZy5iaW5kQWxsQXJnc0FzU3RyaW5ncyhzZWxlY3Rpb25BcmdzKTsKKyAgICAgICAgcmV0dXJuIHByb2cuc2ltcGxlUXVlcnlGb3JCbG9iRmlsZURlc2NyaXB0b3IoKTsKICAgICB9CiAKICAgICAvKioKQEAgLTExNTIsNCArMTIxNyw1OSBAQAogICAgICAgICBkYi5zZXRWZXJzaW9uKGRiVmVyc2lvbik7CiAgICAgICAgIGRiLmNsb3NlKCk7CiAgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBvbmUgb2YgdGhlIGZvbGxvd2luZyB3aGljaCByZXByZXNlbnQgdGhlIHR5cGUgb2YgdGhlIGdpdmVuIFNRTCBzdGF0ZW1lbnQuCisgICAgICogPG9sPgorICAgICAqICAgPGxpPntAbGluayAjU1RBVEVNRU5UX1NFTEVDVH08L2xpPgorICAgICAqICAgPGxpPntAbGluayAjU1RBVEVNRU5UX1VQREFURX08L2xpPgorICAgICAqICAgPGxpPntAbGluayAjU1RBVEVNRU5UX0FUVEFDSH08L2xpPgorICAgICAqICAgPGxpPntAbGluayAjU1RBVEVNRU5UX0JFR0lOfTwvbGk+CisgICAgICogICA8bGk+e0BsaW5rICNTVEFURU1FTlRfQ09NTUlUfTwvbGk+CisgICAgICogICA8bGk+e0BsaW5rICNTVEFURU1FTlRfQUJPUlR9PC9saT4KKyAgICAgKiAgIDxsaT57QGxpbmsgI1NUQVRFTUVOVF9PVEhFUn08L2xpPgorICAgICAqIDwvb2w+CisgICAgICogQHBhcmFtIHNxbCB0aGUgU1FMIHN0YXRlbWVudCB3aG9zZSB0eXBlIGlzIHJldHVybmVkIGJ5IHRoaXMgbWV0aG9kCisgICAgICogQHJldHVybiBvbmUgb2YgdGhlIHZhbHVlcyBsaXN0ZWQgYWJvdmUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGludCBnZXRTcWxTdGF0ZW1lbnRUeXBlKFN0cmluZyBzcWwpIHsKKyAgICAgICAgc3FsID0gc3FsLnRyaW0oKTsKKyAgICAgICAgaWYgKHNxbC5sZW5ndGgoKSA8IDMpIHsKKyAgICAgICAgICAgIHJldHVybiBTVEFURU1FTlRfT1RIRVI7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIHByZWZpeFNxbCA9IHNxbC5zdWJzdHJpbmcoMCwgMykudG9VcHBlckNhc2UoKTsKKyAgICAgICAgaWYgKHByZWZpeFNxbC5lcXVhbHMoIlNFTCIpKSB7CisgICAgICAgICAgICByZXR1cm4gU1RBVEVNRU5UX1NFTEVDVDsKKyAgICAgICAgfSBlbHNlIGlmIChwcmVmaXhTcWwuZXF1YWxzKCJJTlMiKSB8fAorICAgICAgICAgICAgICAgIHByZWZpeFNxbC5lcXVhbHMoIlVQRCIpIHx8CisgICAgICAgICAgICAgICAgcHJlZml4U3FsLmVxdWFscygiUkVQIikgfHwKKyAgICAgICAgICAgICAgICBwcmVmaXhTcWwuZXF1YWxzKCJERUwiKSkgeworICAgICAgICAgICAgcmV0dXJuIFNUQVRFTUVOVF9VUERBVEU7CisgICAgICAgIH0gZWxzZSBpZiAocHJlZml4U3FsLmVxdWFscygiQVRUIikpIHsKKyAgICAgICAgICAgIHJldHVybiBTVEFURU1FTlRfQVRUQUNIOworICAgICAgICB9IGVsc2UgaWYgKHByZWZpeFNxbC5lcXVhbHMoIkNPTSIpKSB7CisgICAgICAgICAgICByZXR1cm4gU1RBVEVNRU5UX0NPTU1JVDsKKyAgICAgICAgfSBlbHNlIGlmIChwcmVmaXhTcWwuZXF1YWxzKCJFTkQiKSkgeworICAgICAgICAgICAgcmV0dXJuIFNUQVRFTUVOVF9DT01NSVQ7CisgICAgICAgIH0gZWxzZSBpZiAocHJlZml4U3FsLmVxdWFscygiUk9MIikpIHsKKyAgICAgICAgICAgIHJldHVybiBTVEFURU1FTlRfQUJPUlQ7CisgICAgICAgIH0gZWxzZSBpZiAocHJlZml4U3FsLmVxdWFscygiQkVHIikpIHsKKyAgICAgICAgICAgIHJldHVybiBTVEFURU1FTlRfQkVHSU47CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFNUQVRFTUVOVF9PVEhFUjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBcHBlbmRzIG9uZSBzZXQgb2Ygc2VsZWN0aW9uIGFyZ3MgdG8gYW5vdGhlci4gVGhpcyBpcyB1c2VmdWwgd2hlbiBhZGRpbmcgYSBzZWxlY3Rpb24KKyAgICAgKiBhcmd1bWVudCB0byBhIHVzZXIgcHJvdmlkZWQgc2V0LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nW10gYXBwZW5kU2VsZWN0aW9uQXJncyhTdHJpbmdbXSBvcmlnaW5hbFZhbHVlcywgU3RyaW5nW10gbmV3VmFsdWVzKSB7CisgICAgICAgIGlmIChvcmlnaW5hbFZhbHVlcyA9PSBudWxsIHx8IG9yaWdpbmFsVmFsdWVzLmxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3VmFsdWVzOworICAgICAgICB9CisgICAgICAgIFN0cmluZ1tdIHJlc3VsdCA9IG5ldyBTdHJpbmdbb3JpZ2luYWxWYWx1ZXMubGVuZ3RoICsgbmV3VmFsdWVzLmxlbmd0aCBdOworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KG9yaWdpbmFsVmFsdWVzLCAwLCByZXN1bHQsIDAsIG9yaWdpbmFsVmFsdWVzLmxlbmd0aCk7CisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkobmV3VmFsdWVzLCAwLCByZXN1bHQsIG9yaWdpbmFsVmFsdWVzLmxlbmd0aCwgbmV3VmFsdWVzLmxlbmd0aCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvRGVmYXVsdERhdGFiYXNlRXJyb3JIYW5kbGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9EZWZhdWx0RGF0YWJhc2VFcnJvckhhbmRsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjE5ZTQ4Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvRGVmYXVsdERhdGFiYXNlRXJyb3JIYW5kbGVyLmphdmEKQEAgLTAsMCArMSw5NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGFuZHJvaWQuZGF0YWJhc2U7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlOworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZUV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudXRpbC5QYWlyOworCisvKioKKyAqIERlZmF1bHQgY2xhc3MgdXNlZCBkZWZpbmluZyB0aGUgYWN0aW9ucyB0byB0YWtlIHdoZW4gdGhlIGZvbGxvd2luZyBlcnJvcnMgYXJlIGRldGVjdGVkCisgKiAgIGRhdGFiYXNlIGNvcnJ1cHRpb24KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIERlZmF1bHREYXRhYmFzZUVycm9ySGFuZGxlciBpbXBsZW1lbnRzIERhdGFiYXNlRXJyb3JIYW5kbGVyIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiRGVmYXVsdERhdGFiYXNlRXJyb3JIYW5kbGVyIjsKKworICAgIC8qKgorICAgICAqIGRlZmluZXMgdGhlIGRlZmF1bHQgbWV0aG9kIHRvIGJlIGludm9rZWQgd2hlbiBkYXRhYmFzZSBjb3JydXB0aW9uIGlzIGRldGVjdGVkLgorICAgICAqIEBwYXJhbSBkYk9iaiB0aGUge0BsaW5rIFNRTGl0ZURhdGFiYXNlfSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBkYXRhYmFzZSBvbiB3aGljaCBjb3JydXB0aW9uCisgICAgICogaXMgZGV0ZWN0ZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25Db3JydXB0aW9uKFNRTGl0ZURhdGFiYXNlIGRiT2JqKSB7CisgICAgICAgIExvZy5lKFRBRywgIkNvcnJ1cHRpb24gcmVwb3J0ZWQgYnkgc3FsaXRlIG9uIGRhdGFiYXNlOiAiICsgZGJPYmouZ2V0UGF0aCgpKTsKKworICAgICAgICAvLyBpcyB0aGUgY29ycnVwdGlvbiBkZXRlY3RlZCBldmVuIGJlZm9yZSBkYXRhYmFzZSBjb3VsZCBiZSAnb3BlbmVkJz8KKyAgICAgICAgaWYgKCFkYk9iai5pc09wZW4oKSkgeworICAgICAgICAgICAgLy8gZGF0YWJhc2UgZmlsZXMgYXJlIG5vdCBldmVuIG9wZW5hYmxlLiBkZWxldGUgdGhpcyBkYXRhYmFzZSBmaWxlLgorICAgICAgICAgICAgLy8gTk9URSBpZiB0aGUgZGF0YWJhc2UgaGFzIGF0dGFjaGVkIGRhdGFiYXNlcywgdGhlbiBhbnkgb2YgdGhlbSBjb3VsZCBiZSBjb3JydXB0LgorICAgICAgICAgICAgLy8gYW5kIG5vdCBkZWxldGluZyBhbGwgb2YgdGhlbSBjb3VsZCBjYXVzZSBjb3JydXB0ZWQgZGF0YWJhc2UgZmlsZSB0byByZW1haW4gYW5kIAorICAgICAgICAgICAgLy8gbWFrZSB0aGUgYXBwbGljYXRpb24gY3Jhc2ggb24gZGF0YWJhc2Ugb3BlbiBvcGVyYXRpb24uIFRvIGF2b2lkIHRoaXMgcHJvYmxlbSwKKyAgICAgICAgICAgIC8vIHRoZSBhcHBsaWNhdGlvbiBzaG91bGQgcHJvdmlkZSBpdHMgb3duIHtAbGluayBEYXRhYmFzZUVycm9ySGFuZGxlcn0gaW1wbCBjbGFzcworICAgICAgICAgICAgLy8gdG8gZGVsZXRlIEFMTCBmaWxlcyBvZiB0aGUgZGF0YWJhc2UgKGluY2x1ZGluZyB0aGUgYXR0YWNoZWQgZGF0YWJhc2VzKS4KKyAgICAgICAgICAgIGRlbGV0ZURhdGFiYXNlRmlsZShkYk9iai5nZXRQYXRoKCkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgQXJyYXlMaXN0PFBhaXI8U3RyaW5nLCBTdHJpbmc+PiBhdHRhY2hlZERicyA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBDbG9zZSB0aGUgZGF0YWJhc2UsIHdoaWNoIHdpbGwgY2F1c2Ugc3Vic2VxdWVudCBvcGVyYXRpb25zIHRvIGZhaWwuCisgICAgICAgICAgICAvLyBiZWZvcmUgdGhhdCwgZ2V0IHRoZSBhdHRhY2hlZCBkYXRhYmFzZSBsaXN0IGZpcnN0LgorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBhdHRhY2hlZERicyA9IGRiT2JqLmdldEF0dGFjaGVkRGJzKCk7CisgICAgICAgICAgICB9IGNhdGNoIChTUUxpdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8qIGlnbm9yZSAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBkYk9iai5jbG9zZSgpOworICAgICAgICAgICAgfSBjYXRjaCAoU1FMaXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvKiBpZ25vcmUgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIC8vIERlbGV0ZSBhbGwgZmlsZXMgb2YgdGhpcyBjb3JydXB0IGRhdGFiYXNlIGFuZC9vciBhdHRhY2hlZCBkYXRhYmFzZXMKKyAgICAgICAgICAgIGlmIChhdHRhY2hlZERicyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZm9yIChQYWlyPFN0cmluZywgU3RyaW5nPiBwIDogYXR0YWNoZWREYnMpIHsKKyAgICAgICAgICAgICAgICAgICAgZGVsZXRlRGF0YWJhc2VGaWxlKHAuc2Vjb25kKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIGF0dGFjaGVkRGJzID0gbnVsbCBpcyBwb3NzaWJsZSB3aGVuIHRoZSBkYXRhYmFzZSBpcyBzbyBjb3JydXB0IHRoYXQgZXZlbgorICAgICAgICAgICAgICAgIC8vICJQUkFHTUEgZGF0YWJhc2VfbGlzdDsiIGFsc28gZmFpbHMuIGRlbGV0ZSB0aGUgbWFpbiBkYXRhYmFzZSBmaWxlCisgICAgICAgICAgICAgICAgZGVsZXRlRGF0YWJhc2VGaWxlKGRiT2JqLmdldFBhdGgoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZGVsZXRlRGF0YWJhc2VGaWxlKFN0cmluZyBmaWxlTmFtZSkgeworICAgICAgICBpZiAoZmlsZU5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiOm1lbW9yeToiKSB8fCBmaWxlTmFtZS50cmltKCkubGVuZ3RoKCkgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIExvZy5lKFRBRywgImRlbGV0aW5nIHRoZSBkYXRhYmFzZSBmaWxlOiAiICsgZmlsZU5hbWUpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgbmV3IEZpbGUoZmlsZU5hbWUpLmRlbGV0ZSgpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLyogcHJpbnQgd2FybmluZyBhbmQgaWdub3JlIGV4Y2VwdGlvbiAqLworICAgICAgICAgICAgTG9nLncoVEFHLCAiZGVsZXRlIGZhaWxlZDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0lCdWxrQ3Vyc29yLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9JQnVsa0N1cnNvci5qYXZhCmluZGV4IDQ2NzkwYTMuLjI0NGM4OGYgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0lCdWxrQ3Vyc29yLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvSUJ1bGtDdXJzb3IuamF2YQpAQCAtMTYsMTYgKzE2LDE0IEBACiAKIHBhY2thZ2UgYW5kcm9pZC5kYXRhYmFzZTsKIAotaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwogaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKIGltcG9ydCBhbmRyb2lkLm9zLklJbnRlcmZhY2U7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwogCiAvKioKICAqIFRoaXMgaW50ZXJmYWNlIHByb3ZpZGVzIGEgbG93LWxldmVsIHdheSB0byBwYXNzIGJ1bGsgY3Vyc29yIGRhdGEgYWNyb3NzCi0gKiBib3RoIHByb2Nlc3MgYW5kIGxhbmd1YWdlIGJvdW5kcmllcy4gQXBwbGljYXRpb24gY29kZSBzaG91bGQgdXNlIHRoZSBDdXJzb3IKKyAqIGJvdGggcHJvY2VzcyBhbmQgbGFuZ3VhZ2UgYm91bmRhcmllcy4gQXBwbGljYXRpb24gY29kZSBzaG91bGQgdXNlIHRoZSBDdXJzb3IKICAqIGludGVyZmFjZSBkaXJlY3RseS4KICAqCiAgKiB7QGhpZGV9CkBAIC01NCwxMCArNTIsNiBAQAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRDb2x1bW5OYW1lcygpIHRocm93cyBSZW1vdGVFeGNlcHRpb247CiAKLSAgICBwdWJsaWMgYm9vbGVhbiB1cGRhdGVSb3dzKE1hcDw/IGV4dGVuZHMgTG9uZywgPyBleHRlbmRzIE1hcDxTdHJpbmcsIE9iamVjdD4+IHZhbHVlcykgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbjsKLQotICAgIHB1YmxpYyBib29sZWFuIGRlbGV0ZVJvdyhpbnQgcG9zaXRpb24pIHRocm93cyBSZW1vdGVFeGNlcHRpb247Ci0KICAgICBwdWJsaWMgdm9pZCBkZWFjdGl2YXRlKCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbjsKIAogICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbjsKQEAgLTc2LDggKzcwLDYgQEAKICAgICBzdGF0aWMgZmluYWwgaW50IEdFVF9DVVJTT1JfV0lORE9XX1RSQU5TQUNUSU9OID0gSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OOwogICAgIHN0YXRpYyBmaW5hbCBpbnQgQ09VTlRfVFJBTlNBQ1RJT04gPSBJQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAxOwogICAgIHN0YXRpYyBmaW5hbCBpbnQgR0VUX0NPTFVNTl9OQU1FU19UUkFOU0FDVElPTiA9IElCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDI7Ci0gICAgc3RhdGljIGZpbmFsIGludCBVUERBVEVfUk9XU19UUkFOU0FDVElPTiA9IElCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDM7Ci0gICAgc3RhdGljIGZpbmFsIGludCBERUxFVEVfUk9XX1RSQU5TQUNUSU9OID0gSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNDsKICAgICBzdGF0aWMgZmluYWwgaW50IERFQUNUSVZBVEVfVFJBTlNBQ1RJT04gPSBJQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA1OwogICAgIHN0YXRpYyBmaW5hbCBpbnQgUkVRVUVSWV9UUkFOU0FDVElPTiA9IElCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDY7CiAgICAgc3RhdGljIGZpbmFsIGludCBPTl9NT1ZFX1RSQU5TQUNUSU9OID0gSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNzsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL01hdHJpeEN1cnNvci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvTWF0cml4Q3Vyc29yLmphdmEKaW5kZXggZDVjM2EzMi4uNWMxYjk2OCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvTWF0cml4Q3Vyc29yLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvTWF0cml4Q3Vyc29yLmphdmEKQEAgLTI3Miw2ICsyNzIsMTEgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGdldFR5cGUoaW50IGNvbHVtbikgeworICAgICAgICByZXR1cm4gRGF0YWJhc2VVdGlscy5nZXRUeXBlT2ZPYmplY3QoZ2V0KGNvbHVtbikpOworICAgIH0KKworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGlzTnVsbChpbnQgY29sdW1uKSB7CiAgICAgICAgIHJldHVybiBnZXQoY29sdW1uKSA9PSBudWxsOwogICAgIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL01lcmdlQ3Vyc29yLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9NZXJnZUN1cnNvci5qYXZhCmluZGV4IDcyMmQ3MDcuLjJjMjVkYjcgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL01lcmdlQ3Vyc29yLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvTWVyZ2VDdXJzb3IuamF2YQpAQCAtOTIsMzIgKzkyLDYgQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBkZWxldGVSb3coKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1DdXJzb3IuZGVsZXRlUm93KCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBjb21taXRVcGRhdGVzKCkgewotICAgICAgICBpbnQgbGVuZ3RoID0gbUN1cnNvcnMubGVuZ3RoOwotICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCBsZW5ndGggOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChtQ3Vyc29yc1tpXSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUN1cnNvcnNbaV0uY29tbWl0VXBkYXRlcygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG9uQ2hhbmdlKHRydWUpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhpbnQgY29sdW1uKQogICAgIHsKQEAgLTE1NSw2ICsxMjksMTEgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGdldFR5cGUoaW50IGNvbHVtbikgeworICAgICAgICByZXR1cm4gbUN1cnNvci5nZXRUeXBlKGNvbHVtbik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gaXNOdWxsKGludCBjb2x1bW4pCiAgICAgewogICAgICAgICByZXR1cm4gbUN1cnNvci5pc051bGwoY29sdW1uKTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL1JlcXVlcnlPblVpVGhyZWFkRXhjZXB0aW9uLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9SZXF1ZXJ5T25VaVRocmVhZEV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3YTUwZDgKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9SZXF1ZXJ5T25VaVRocmVhZEV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuZGF0YWJhc2U7CisKKy8qKgorICogQW4gZXhjZXB0aW9uIHRoYXQgaW5kaWNhdGVzIGludm9raW5nIHtAbGluayBDdXJzb3IjcmVxdWVyeSgpfSBvbiBNYWluIHRocmVhZCBjb3VsZCBjYXVzZSBBTlIuCisgKiBUaGlzIGV4Y2VwdGlvbiBzaG91bGQgZW5jb3VyYWdlIGFwcHMgdG8gaW52b2tlIHtAbGluayBDdXJzb3IjcmVxdWVyeSgpfSBpbiBhIGJhY2tncm91bmQgdGhyZWFkLiAKKyAqIEBoaWRlCisgKi8KK3B1YmxpYyBjbGFzcyBSZXF1ZXJ5T25VaVRocmVhZEV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24geworICAgIHB1YmxpYyBSZXF1ZXJ5T25VaVRocmVhZEV4Y2VwdGlvbihTdHJpbmcgcGFja2FnZU5hbWUpIHsKKyAgICAgICAgc3VwZXIoIkluICIgKyBwYWNrYWdlTmFtZSArICIgUmVxdWVyeSBpcyBleGVjdXRpbmcgb24gbWFpbiAoVUkpIHRocmVhZC4gY291bGQgY2F1c2UgQU5SLiAiICsKKyAgICAgICAgICAgICAgICAiZG8gaXQgaW4gYmFja2dyb3VuZCB0aHJlYWQuIik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL0RhdGFiYXNlQ29ubmVjdGlvblBvb2wuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9EYXRhYmFzZUNvbm5lY3Rpb25Qb29sLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTRiMDYwNQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9EYXRhYmFzZUNvbm5lY3Rpb25Qb29sLmphdmEKQEAgLTAsMCArMSwzNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZTsKKworaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKKworLyoqCisgKiBBIGNvbm5lY3Rpb24gcG9vbCB0byBiZSB1c2VkIGJ5IHJlYWRlcnMuCisgKiBOb3RlIHRoYXQgZWFjaCBjb25uZWN0aW9uIGNhbiBiZSB1c2VkIGJ5IG9ubHkgb25lIHJlYWRlciBhdCBhIHRpbWUuCisgKi8KKy8qIHBhY2thZ2UgKi8gY2xhc3MgRGF0YWJhc2VDb25uZWN0aW9uUG9vbCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkRhdGFiYXNlQ29ubmVjdGlvblBvb2wiOworCisgICAgLyoqIFRoZSBkZWZhdWx0IGNvbm5lY3Rpb24gcG9vbCBzaXplLiBJdCBpcyBzZXQgYmFzZWQgb24gdGhlIGFtb3VudCBvZiBtZW1vcnkgdGhlIGRldmljZSBoYXMuCisgICAgICogVE9ETzogc2V0IHRoaXMgd2l0aCAnYSBzeXN0ZW0gY2FsbCcgd2hpY2ggcmV0dXJucyB0aGUgYW1vdW50IG9mIG1lbW9yeSB0aGUgZGV2aWNlIGhhcworICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0NPTk5FQ1RJT05fUE9PTF9TSVpFID0gMTsKKworICAgIC8qKiB0aGUgcG9vbCBzaXplIHNldCBmb3IgdGhpcyB7QGxpbmsgU1FMaXRlRGF0YWJhc2V9ICovCisgICAgcHJpdmF0ZSB2b2xhdGlsZSBpbnQgbU1heFBvb2xTaXplID0gREVGQVVMVF9DT05ORUNUSU9OX1BPT0xfU0laRTsKKworICAgIC8qKiBUaGUgY29ubmVjdGlvbiBwb29sIG9iamVjdHMgYXJlIHN0b3JlZCBpbiB0aGlzIG1lbWJlci4KKyAgICAgKiBUT0RPOiByZXZpc2l0IHRoaXMgZGF0YSBzdHJ1Y3QgYXMgdGhlIG51bWJlciBvZiBwb29sZWQgY29ubmVjdGlvbnMgaW5jcmVhc2UgYmV5b25kCisgICAgICogc2luZ2xlLWRpZ2l0IHZhbHVlcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxQb29sT2JqPiBtUG9vbCA9IG5ldyBBcnJheUxpc3Q8UG9vbE9iaj4obU1heFBvb2xTaXplKTsKKworICAgIC8qKiB0aGUgbWFpbiBkYXRhYmFzZSBjb25uZWN0aW9uIHRvIHdoaWNoIHRoaXMgY29ubmVjdGlvbiBwb29sIGlzIGF0dGFjaGVkICovCisgICAgcHJpdmF0ZSBmaW5hbCBTUUxpdGVEYXRhYmFzZSBtUGFyZW50RGJPYmo7CisKKyAgICAvKiogUmFuZG9tIG51bWJlciBnZW5lcmF0b3IgdXNlZCB0byBwaWNrIGEgZnJlZSBjb25uZWN0aW9uIG91dCBvZiB0aGUgcG9vbCAqLworICAgIHByaXZhdGUgUmFuZG9tIHJhbmQ7IC8vIGxhemlseSBpbml0aWFsaXplZAorCisgICAgLyogcGFja2FnZSAqLyBEYXRhYmFzZUNvbm5lY3Rpb25Qb29sKFNRTGl0ZURhdGFiYXNlIGRiKSB7CisgICAgICAgIHRoaXMubVBhcmVudERiT2JqID0gZGI7CisgICAgICAgIGlmIChMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5ERUJVRykpIHsKKyAgICAgICAgICAgIExvZy5kKFRBRywgIk1heCBQb29sIFNpemU6ICIgKyBtTWF4UG9vbFNpemUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogY2xvc2UgYWxsIGRhdGFiYXNlIGNvbm5lY3Rpb25zIGluIHRoZSBwb29sIC0gZXZlbiBpZiB0aGV5IGFyZSBpbiB1c2UhCisgICAgICovCisgICAgLyogcGFja2FnZSAqLyB2b2lkIGNsb3NlKCkgeworICAgICAgICBzeW5jaHJvbml6ZWQobVBhcmVudERiT2JqKSB7CisgICAgICAgICAgICBpZiAoTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuREVCVUcpKSB7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiQ2xvc2luZyB0aGUgY29ubmVjdGlvbiBwb29sIG9uICIgKyBtUGFyZW50RGJPYmouZ2V0UGF0aCgpICsgdG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGludCBpID0gbVBvb2wuc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgICAgICAgICBtUG9vbC5nZXQoaSkubURiLmNsb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtUG9vbC5jbGVhcigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogZ2V0IGEgZnJlZSBjb25uZWN0aW9uIGZyb20gdGhlIHBvb2wKKyAgICAgKgorICAgICAqIEBwYXJhbSBzcWwgaWYgbm90IG51bGwsIHRyeSB0byBmaW5kIGEgY29ubmVjdGlvbiBpbnRoZSBwb29sIHdoaWNoIGFscmVhZHkgaGFzIGNhY2hlZAorICAgICAqIHRoZSBjb21waWxlZCBzdGF0ZW1lbnQgZm9yIHRoaXMgc3FsLgorICAgICAqIEByZXR1cm4gdGhlIERhdGFiYXNlIGNvbm5lY3Rpb24gdGhhdCB0aGUgY2FsbGVyIGNhbiB1c2UKKyAgICAgKi8KKyAgICAvKiBwYWNrYWdlICovIFNRTGl0ZURhdGFiYXNlIGdldChTdHJpbmcgc3FsKSB7CisgICAgICAgIFNRTGl0ZURhdGFiYXNlIGRiID0gbnVsbDsKKyAgICAgICAgUG9vbE9iaiBwb29sT2JqID0gbnVsbDsKKyAgICAgICAgc3luY2hyb25pemVkKG1QYXJlbnREYk9iaikgeworICAgICAgICAgICAgaW50IHBvb2xTaXplID0gbVBvb2wuc2l6ZSgpOworICAgICAgICAgICAgaWYgKExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLkRFQlVHKSkgeworICAgICAgICAgICAgICAgIGFzc2VydCBzcWwgIT0gbnVsbDsKKyAgICAgICAgICAgICAgICBkb0Fzc2VydHMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChnZXRGcmVlUG9vbFNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgLy8gbm8gZnJlZSAoID0gYXZhaWxhYmxlKSBjb25uZWN0aW9ucworICAgICAgICAgICAgICAgIGlmIChtTWF4UG9vbFNpemUgPT0gcG9vbFNpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gbWF4ZWQgb3V0LiBjYW4ndCBvcGVuIGFueSBtb3JlIGNvbm5lY3Rpb25zLgorICAgICAgICAgICAgICAgICAgICAvLyBsZXQgdGhlIGNhbGxlciB3YWl0IG9uIG9uZSBvZiB0aGUgcG9vbGVkIGNvbm5lY3Rpb25zCisgICAgICAgICAgICAgICAgICAgIC8vIHByZWZlcmFibHkgYSBjb25uZWN0aW9uIGNhY2hpbmcgdGhlIHByZS1jb21waWxlZCBzdGF0ZW1lbnQgb2YgdGhlIGdpdmVuIFNRTAorICAgICAgICAgICAgICAgICAgICBpZiAobU1heFBvb2xTaXplID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBvb2xPYmogPSBtUG9vbC5nZXQoMCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1NYXhQb29sU2l6ZTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1Qb29sLmdldChpKS5tRGIuaXNTcWxJblN0YXRlbWVudENhY2hlKHNxbCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9vbE9iaiA9IG1Qb29sLmdldChpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBvb2xPYmogPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZXJlIGFyZSBubyBkYXRhYmFzZSBjb25uZWN0aW9ucyB3aXRoIHRoZSBnaXZlbiBTUUwgcHJlLWNvbXBpbGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9rIHRvIHJldHVybiBhbnkgb2YgdGhlIGNvbm5lY3Rpb25zLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyYW5kID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZCA9IG5ldyBSYW5kb20oU3lzdGVtQ2xvY2suZWxhcHNlZFJlYWx0aW1lKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb29sT2JqID0gbVBvb2wuZ2V0KHJhbmQubmV4dEludChtTWF4UG9vbFNpemUpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBkYiA9IHBvb2xPYmoubURiOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBhIG5ldyBjb25uZWN0aW9uIGFuZCBhZGQgaXQgdG8gdGhlIHBvb2wsIHNpbmNlIHdlIGhhdmVuJ3QgcmVhY2hlZAorICAgICAgICAgICAgICAgICAgICAvLyBtYXggcG9vbCBzaXplIGFsbG93ZWQKKyAgICAgICAgICAgICAgICAgICAgZGIgPSBtUGFyZW50RGJPYmouY3JlYXRlUG9vbENvbm5lY3Rpb24oKHNob3J0KShwb29sU2l6ZSArIDEpKTsKKyAgICAgICAgICAgICAgICAgICAgcG9vbE9iaiA9IG5ldyBQb29sT2JqKGRiKTsKKyAgICAgICAgICAgICAgICAgICAgbVBvb2wuYWRkKHBvb2xTaXplLCBwb29sT2JqKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIHRoZXJlIGFyZSBmcmVlIGNvbm5lY3Rpb25zIGF2YWlsYWJsZS4gcGljayBvbmUKKyAgICAgICAgICAgICAgICAvLyBwcmVmZXJhYmx5IGEgY29ubmVjdGlvbiBjYWNoaW5nIHRoZSBwcmUtY29tcGlsZWQgc3RhdGVtZW50IG9mIHRoZSBnaXZlbiBTUUwKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBvb2xTaXplOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1Qb29sLmdldChpKS5pc0ZyZWUoKSAmJiBtUG9vbC5nZXQoaSkubURiLmlzU3FsSW5TdGF0ZW1lbnRDYWNoZShzcWwpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwb29sT2JqID0gbVBvb2wuZ2V0KGkpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHBvb2xPYmogPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAvLyBkaWRuJ3QgZmluZCBhIGZyZWUgZGF0YWJhc2UgY29ubmVjdGlvbiB3aXRoIHRoZSBnaXZlbiBTUUwgYWxyZWFkeQorICAgICAgICAgICAgICAgICAgICAvLyBwcmUtY29tcGlsZWQuIHJldHVybiBhIGZyZWUgY29ubmVjdGlvbiAodGhpcyBtZWFucywgdGhlIHNhbWUgU1FMIGNvdWxkIGJlCisgICAgICAgICAgICAgICAgICAgIC8vIHByZS1jb21waWxlZCBvbiBtb3JlIHRoYW4gb25lIGRhdGFiYXNlIGNvbm5lY3Rpb24uIHBvdGVudGlhbCB3YXN0ZWQgbWVtb3J5LikKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwb29sU2l6ZTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVBvb2wuZ2V0KGkpLmlzRnJlZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9vbE9iaiA9IG1Qb29sLmdldChpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkYiA9IHBvb2xPYmoubURiOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhc3NlcnQgcG9vbE9iaiAhPSBudWxsOworICAgICAgICAgICAgYXNzZXJ0IHBvb2xPYmoubURiID09IGRiOworCisgICAgICAgICAgICBwb29sT2JqLmFjcXVpcmUoKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5ERUJVRykpIHsKKyAgICAgICAgICAgIExvZy5kKFRBRywgIkVORCBnZXQtY29ubmVjdGlvbjogIiArIHRvU3RyaW5nKCkgKyBwb29sT2JqLnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBkYjsKKyAgICAgICAgLy8gVE9ETyBpZiBhIHRocmVhZCBhY3F1aXJlcyBhIGNvbm5lY3Rpb24gYW5kIGRpZXMgd2l0aG91dCByZWxlYXNpbmcgdGhlIGNvbm5lY3Rpb24sIHRoZW4KKyAgICAgICAgLy8gdGhlcmUgY291bGQgYmUgYSBjb25uZWN0aW9uIGxlYWsuCisgICAgfQorCisgICAgLyoqCisgICAgICogcmVsZWFzZSB0aGUgZ2l2ZW4gZGF0YWJhc2UgY29ubmVjdGlvbiBiYWNrIHRvIHRoZSBwb29sLgorICAgICAqIEBwYXJhbSBkYiB0aGUgY29ubmVjdGlvbiB0byBiZSByZWxlYXNlZAorICAgICAqLworICAgIC8qIHBhY2thZ2UgKi8gdm9pZCByZWxlYXNlKFNRTGl0ZURhdGFiYXNlIGRiKSB7CisgICAgICAgIFBvb2xPYmogcG9vbE9iajsKKyAgICAgICAgc3luY2hyb25pemVkKG1QYXJlbnREYk9iaikgeworICAgICAgICAgICAgaWYgKExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLkRFQlVHKSkgeworICAgICAgICAgICAgICAgIGFzc2VydCBkYi5tQ29ubmVjdGlvbk51bSA+IDA7CisgICAgICAgICAgICAgICAgZG9Bc3NlcnRzKCk7CisgICAgICAgICAgICAgICAgYXNzZXJ0IG1Qb29sLmdldChkYi5tQ29ubmVjdGlvbk51bSAtIDEpLm1EYiA9PSBkYjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcG9vbE9iaiA9IG1Qb29sLmdldChkYi5tQ29ubmVjdGlvbk51bSAtIDEpOworCisgICAgICAgICAgICBpZiAoTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuREVCVUcpKSB7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiQkVHSU4gcmVsZWFzZS1jb25uOiAiICsgdG9TdHJpbmcoKSArIHBvb2xPYmoudG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChwb29sT2JqLmlzRnJlZSgpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiUmVsZWFzaW5nIG9iamVjdCBhbHJlYWR5IGZyZWVkOiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRiLm1Db25uZWN0aW9uTnVtKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcG9vbE9iai5yZWxlYXNlKCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuREVCVUcpKSB7CisgICAgICAgICAgICBMb2cuZChUQUcsICJFTkQgcmVsZWFzZS1jb25uOiAiICsgdG9TdHJpbmcoKSArIHBvb2xPYmoudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBhbGwgZGF0YWJhc2UgY29ubmVjdGlvbnMgaW4gdGhlIHBvb2wgKGJvdGggZnJlZSBhbmQgYnVzeSBjb25uZWN0aW9ucykuCisgICAgICogVGhpcyBtZXRob2QgaXMgdXNlZCB3aGVuICJhZGIgYnVncmVwb3J0IiBpcyBkb25lLgorICAgICAqLworICAgIC8qIHBhY2thZ2UgKi8gQXJyYXlMaXN0PFNRTGl0ZURhdGFiYXNlPiBnZXRDb25uZWN0aW9uTGlzdCgpIHsKKyAgICAgICAgQXJyYXlMaXN0PFNRTGl0ZURhdGFiYXNlPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTUUxpdGVEYXRhYmFzZT4oKTsKKyAgICAgICAgc3luY2hyb25pemVkKG1QYXJlbnREYk9iaikgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IG1Qb29sLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICAgICAgbGlzdC5hZGQobVBvb2wuZ2V0KGkpLm1EYik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGxpc3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogcGFja2FnZSBsZXZlbCBhY2Nlc3MgZm9yIHRlc3RpbmcgcHVycG9zZXMgb25seS4gb3RoZXJ3aXNlLCBwcml2YXRlIHNob3VsZCBiZSBzdWZmaWNpZW50LgorICAgICAqLworICAgIC8qIHBhY2thZ2UgKi8gaW50IGdldEZyZWVQb29sU2l6ZSgpIHsKKyAgICAgICAgaW50IGNvdW50ID0gMDsKKyAgICAgICAgZm9yIChpbnQgaSA9IG1Qb29sLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICBpZiAobVBvb2wuZ2V0KGkpLmlzRnJlZSgpKSB7CisgICAgICAgICAgICAgICAgY291bnQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY291bnQrKzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBvbmx5IGZvciB0ZXN0aW5nIHB1cnBvc2VzCisgICAgICovCisgICAgLyogcGFja2FnZSAqLyBBcnJheUxpc3Q8UG9vbE9iaj4gZ2V0UG9vbCgpIHsKKyAgICAgICAgcmV0dXJuIG1Qb29sOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVmZiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIGJ1ZmYuYXBwZW5kKCJkYjogIik7CisgICAgICAgIGJ1ZmYuYXBwZW5kKG1QYXJlbnREYk9iai5nZXRQYXRoKCkpOworICAgICAgICBidWZmLmFwcGVuZCgiLCB0b3RhbHNpemUgPSAiKTsKKyAgICAgICAgYnVmZi5hcHBlbmQobVBvb2wuc2l6ZSgpKTsKKyAgICAgICAgYnVmZi5hcHBlbmQoIiwgI2ZyZWUgPSAiKTsKKyAgICAgICAgYnVmZi5hcHBlbmQoZ2V0RnJlZVBvb2xTaXplKCkpOworICAgICAgICBidWZmLmFwcGVuZCgiLCBtYXhwb29sc2l6ZSA9ICIpOworICAgICAgICBidWZmLmFwcGVuZChtTWF4UG9vbFNpemUpOworICAgICAgICBmb3IgKFBvb2xPYmogcCA6IG1Qb29sKSB7CisgICAgICAgICAgICBidWZmLmFwcGVuZCgiXG4iKTsKKyAgICAgICAgICAgIGJ1ZmYuYXBwZW5kKHAudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGJ1ZmYudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZG9Bc3NlcnRzKCkgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1Qb29sLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBtUG9vbC5nZXQoaSkudmVyaWZ5KCk7CisgICAgICAgICAgICBhc3NlcnQgbVBvb2wuZ2V0KGkpLm1EYi5tQ29ubmVjdGlvbk51bSA9PSAoaSArIDEpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogcGFja2FnZSAqLyB2b2lkIHNldE1heFBvb2xTaXplKGludCBzaXplKSB7CisgICAgICAgIHN5bmNocm9uaXplZChtUGFyZW50RGJPYmopIHsKKyAgICAgICAgICAgIG1NYXhQb29sU2l6ZSA9IHNpemU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBwYWNrYWdlICovIGludCBnZXRNYXhQb29sU2l6ZSgpIHsKKyAgICAgICAgc3luY2hyb25pemVkKG1QYXJlbnREYk9iaikgeworICAgICAgICAgICAgcmV0dXJuIG1NYXhQb29sU2l6ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKiBvbmx5IHVzZWQgZm9yIHRlc3RpbmcgcHVycG9zZXMuICovCisgICAgLyogcGFja2FnZSAqLyBib29sZWFuIGlzRGF0YWJhc2VPYmpGcmVlKFNRTGl0ZURhdGFiYXNlIGRiKSB7CisgICAgICAgIHJldHVybiBtUG9vbC5nZXQoZGIubUNvbm5lY3Rpb25OdW0gLSAxKS5pc0ZyZWUoKTsKKyAgICB9CisKKyAgICAvKiogb25seSB1c2VkIGZvciB0ZXN0aW5nIHB1cnBvc2VzLiAqLworICAgIC8qIHBhY2thZ2UgKi8gaW50IGdldFNpemUoKSB7CisgICAgICAgIHJldHVybiBtUG9vbC5zaXplKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogcmVwcmVzZW50cyBvYmplY3RzIGluIHRoZSBjb25uZWN0aW9uIHBvb2wuCisgICAgICogcGFja2FnZS1sZXZlbCBhY2Nlc3MgZm9yIHRlc3RpbmcgcHVycG9zZXMgb25seS4KKyAgICAgKi8KKyAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBjbGFzcyBQb29sT2JqIHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIFNRTGl0ZURhdGFiYXNlIG1EYjsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1GcmVlQnVzeUZsYWcgPSBGUkVFOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIEZSRUUgPSB0cnVlOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIEJVU1kgPSBmYWxzZTsKKworICAgICAgICAvKiogdGhlIG51bWJlciBvZiB0aHJlYWRzIGhvbGRpbmcgdGhpcyBjb25uZWN0aW9uICovCisgICAgICAgIC8vIEBHdWFyZGVkQnkoInRoaXMiKQorICAgICAgICBwcml2YXRlIGludCBtTnVtSG9sZGVycyA9IDA7CisKKyAgICAgICAgLyoqIGNvbnRhaW5zIHRoZSB0aHJlYWRJZHMgb2YgdGhlIHRocmVhZHMgaG9sZGluZyB0aGlzIGNvbm5lY3Rpb24uCisgICAgICAgICAqIHVzZWQgZm9yIGRlYnVnZ2luZyBwdXJwb3NlcyBvbmx5LgorICAgICAgICAgKi8KKyAgICAgICAgLy8gQEd1YXJkZWRCeSgidGhpcyIpCisgICAgICAgIHByaXZhdGUgSGFzaFNldDxMb25nPiBtSG9sZGVySWRzID0gbmV3IEhhc2hTZXQ8TG9uZz4oKTsKKworICAgICAgICBwdWJsaWMgUG9vbE9iaihTUUxpdGVEYXRhYmFzZSBkYikgeworICAgICAgICAgICAgbURiID0gZGI7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGFjcXVpcmUoKSB7CisgICAgICAgICAgICBpZiAoTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuREVCVUcpKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0IGlzRnJlZSgpOworICAgICAgICAgICAgICAgIGxvbmcgaWQgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldElkKCk7CisgICAgICAgICAgICAgICAgYXNzZXJ0ICFtSG9sZGVySWRzLmNvbnRhaW5zKGlkKTsKKyAgICAgICAgICAgICAgICBtSG9sZGVySWRzLmFkZChpZCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1OdW1Ib2xkZXJzKys7CisgICAgICAgICAgICBtRnJlZUJ1c3lGbGFnID0gQlVTWTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgcmVsZWFzZSgpIHsKKyAgICAgICAgICAgIGlmIChMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5ERUJVRykpIHsKKyAgICAgICAgICAgICAgICBsb25nIGlkID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRJZCgpOworICAgICAgICAgICAgICAgIGFzc2VydCBtSG9sZGVySWRzLnNpemUoKSA9PSBtTnVtSG9sZGVyczsKKyAgICAgICAgICAgICAgICBhc3NlcnQgbUhvbGRlcklkcy5jb250YWlucyhpZCk7CisgICAgICAgICAgICAgICAgbUhvbGRlcklkcy5yZW1vdmUoaWQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtTnVtSG9sZGVycy0tOworICAgICAgICAgICAgaWYgKG1OdW1Ib2xkZXJzID09IDApIHsKKyAgICAgICAgICAgICAgICBtRnJlZUJ1c3lGbGFnID0gRlJFRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3luY2hyb25pemVkIGJvb2xlYW4gaXNGcmVlKCkgeworICAgICAgICAgICAgaWYgKExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLkRFQlVHKSkgeworICAgICAgICAgICAgICAgIHZlcmlmeSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIChtRnJlZUJ1c3lGbGFnID09IEZSRUUpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCB2ZXJpZnkoKSB7CisgICAgICAgICAgICBpZiAobUZyZWVCdXN5RmxhZyA9PSBGUkVFKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0IG1OdW1Ib2xkZXJzID09IDA7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGFzc2VydCBtTnVtSG9sZGVycyA+IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogb25seSBmb3IgdGVzdGluZyBwdXJwb3NlcworICAgICAgICAgKi8KKyAgICAgICAgLyogcGFja2FnZSAqLyBzeW5jaHJvbml6ZWQgaW50IGdldE51bUhvbGRlcnMoKSB7CisgICAgICAgICAgICByZXR1cm4gbU51bUhvbGRlcnM7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVmZiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICBidWZmLmFwcGVuZCgiLCBjb25uICMgIik7CisgICAgICAgICAgICBidWZmLmFwcGVuZChtRGIubUNvbm5lY3Rpb25OdW0pOworICAgICAgICAgICAgYnVmZi5hcHBlbmQoIiwgbUNvdW50SG9sZGVycyA9ICIpOworICAgICAgICAgICAgc3luY2hyb25pemVkKHRoaXMpIHsKKyAgICAgICAgICAgICAgICBidWZmLmFwcGVuZChtTnVtSG9sZGVycyk7CisgICAgICAgICAgICAgICAgYnVmZi5hcHBlbmQoIiwgZnJlZUJ1c3lGbGFnID0gIik7CisgICAgICAgICAgICAgICAgYnVmZi5hcHBlbmQobUZyZWVCdXN5RmxhZyk7CisgICAgICAgICAgICAgICAgZm9yIChMb25nIGwgOiBtSG9sZGVySWRzKSB7CisgICAgICAgICAgICAgICAgICAgIGJ1ZmYuYXBwZW5kKCIsIGlkID0gIiArIGwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBidWZmLnRvU3RyaW5nKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvRGF0YWJhc2VPYmplY3ROb3RDbG9zZWRFeGNlcHRpb24uamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9EYXRhYmFzZU9iamVjdE5vdENsb3NlZEV4Y2VwdGlvbi5qYXZhCmluZGV4IDhhYzRjMGYuLmYyOGM3MGYgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9EYXRhYmFzZU9iamVjdE5vdENsb3NlZEV4Y2VwdGlvbi5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9EYXRhYmFzZU9iamVjdE5vdENsb3NlZEV4Y2VwdGlvbi5qYXZhCkBAIC0yMSwxMyArMjEsMTEgQEAKICAqIHRoYXQgaXMgbm90IGV4cGxpY2l0bHkgY2xvc2VkCiAgKiBAaGlkZQogICovCi1wdWJsaWMgY2xhc3MgRGF0YWJhc2VPYmplY3ROb3RDbG9zZWRFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uCi17CitwdWJsaWMgY2xhc3MgRGF0YWJhc2VPYmplY3ROb3RDbG9zZWRFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgcyA9ICJBcHBsaWNhdGlvbiBkaWQgbm90IGNsb3NlIHRoZSBjdXJzb3Igb3IgZGF0YWJhc2Ugb2JqZWN0ICIgKwogICAgICAgICAgICAgInRoYXQgd2FzIG9wZW5lZCBoZXJlIjsKIAotICAgIHB1YmxpYyBEYXRhYmFzZU9iamVjdE5vdENsb3NlZEV4Y2VwdGlvbigpCi0gICAgeworICAgIHB1YmxpYyBEYXRhYmFzZU9iamVjdE5vdENsb3NlZEV4Y2VwdGlvbigpIHsKICAgICAgICAgc3VwZXIocyk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZUFjY2Vzc1Blcm1FeGNlcHRpb24uamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVBY2Nlc3NQZXJtRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjM4ZGE0YgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVBY2Nlc3NQZXJtRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSwyOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGU7CisKKy8qKgorICogVGhpcyBleGNlcHRpb24gY2xhc3MgaXMgdXNlZCB3aGVuIHNxbGl0ZSBjYW4ndCBhY2Nlc3MgdGhlIGRhdGFiYXNlIGZpbGUKKyAqIGR1ZSB0byBsYWNrIG9mIHBlcm1pc3Npb25zIG9uIHRoZSBmaWxlLgorICovCitwdWJsaWMgY2xhc3MgU1FMaXRlQWNjZXNzUGVybUV4Y2VwdGlvbiBleHRlbmRzIFNRTGl0ZUV4Y2VwdGlvbiB7CisgICAgcHVibGljIFNRTGl0ZUFjY2Vzc1Blcm1FeGNlcHRpb24oKSB7fQorCisgICAgcHVibGljIFNRTGl0ZUFjY2Vzc1Blcm1FeGNlcHRpb24oU3RyaW5nIGVycm9yKSB7CisgICAgICAgIHN1cGVyKGVycm9yKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlQmluZE9yQ29sdW1uSW5kZXhPdXRPZlJhbmdlRXhjZXB0aW9uLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlQmluZE9yQ29sdW1uSW5kZXhPdXRPZlJhbmdlRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDFmMmY5YwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVCaW5kT3JDb2x1bW5JbmRleE91dE9mUmFuZ2VFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDI4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZTsKKworLyoqCisgKiBUaHJvd24gaWYgdGhlIHRoZSBiaW5kIG9yIGNvbHVtbiBwYXJhbWV0ZXIgaW5kZXggaXMgb3V0IG9mIHJhbmdlCisgKi8KK3B1YmxpYyBjbGFzcyBTUUxpdGVCaW5kT3JDb2x1bW5JbmRleE91dE9mUmFuZ2VFeGNlcHRpb24gZXh0ZW5kcyBTUUxpdGVFeGNlcHRpb24geworICAgIHB1YmxpYyBTUUxpdGVCaW5kT3JDb2x1bW5JbmRleE91dE9mUmFuZ2VFeGNlcHRpb24oKSB7fQorCisgICAgcHVibGljIFNRTGl0ZUJpbmRPckNvbHVtbkluZGV4T3V0T2ZSYW5nZUV4Y2VwdGlvbihTdHJpbmcgZXJyb3IpIHsKKyAgICAgICAgc3VwZXIoZXJyb3IpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVCbG9iVG9vQmlnRXhjZXB0aW9uLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlQmxvYlRvb0JpZ0V4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4MjY3NmIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlQmxvYlRvb0JpZ0V4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlOworCitwdWJsaWMgY2xhc3MgU1FMaXRlQmxvYlRvb0JpZ0V4Y2VwdGlvbiBleHRlbmRzIFNRTGl0ZUV4Y2VwdGlvbiB7CisgICAgcHVibGljIFNRTGl0ZUJsb2JUb29CaWdFeGNlcHRpb24oKSB7fQorCisgICAgcHVibGljIFNRTGl0ZUJsb2JUb29CaWdFeGNlcHRpb24oU3RyaW5nIGVycm9yKSB7CisgICAgICAgIHN1cGVyKGVycm9yKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlQ2FudE9wZW5EYXRhYmFzZUV4Y2VwdGlvbi5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZUNhbnRPcGVuRGF0YWJhc2VFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjAxNzk2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZUNhbnRPcGVuRGF0YWJhc2VFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDI1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZTsKKworcHVibGljIGNsYXNzIFNRTGl0ZUNhbnRPcGVuRGF0YWJhc2VFeGNlcHRpb24gZXh0ZW5kcyBTUUxpdGVFeGNlcHRpb24geworICAgIHB1YmxpYyBTUUxpdGVDYW50T3BlbkRhdGFiYXNlRXhjZXB0aW9uKCkge30KKworICAgIHB1YmxpYyBTUUxpdGVDYW50T3BlbkRhdGFiYXNlRXhjZXB0aW9uKFN0cmluZyBlcnJvcikgeworICAgICAgICBzdXBlcihlcnJvcik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZUNvbXBpbGVkU3FsLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlQ29tcGlsZWRTcWwuamF2YQppbmRleCAyNWFhOWIzLi5hYTBhNTdkIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlQ29tcGlsZWRTcWwuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlQ29tcGlsZWRTcWwuamF2YQpAQCAtNzgsMjAgKzc4LDEzIEBACiAgICAgICogIGV4aXN0aW5nIGNvbXBpbGVkIFNRTCBwcm9ncmFtIGFscmVhZHkgYXJvdW5kCiAgICAgICovCiAgICAgcHJpdmF0ZSB2b2lkIGNvbXBpbGUoU3RyaW5nIHNxbCwgYm9vbGVhbiBmb3JjZUNvbXBpbGF0aW9uKSB7Ci0gICAgICAgIGlmICghbURhdGFiYXNlLmlzT3BlbigpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJkYXRhYmFzZSAiICsgbURhdGFiYXNlLmdldFBhdGgoKSArICIgYWxyZWFkeSBjbG9zZWQiKTsKLSAgICAgICAgfQorICAgICAgICBtRGF0YWJhc2UudmVyaWZ5TG9ja093bmVyKCk7CiAgICAgICAgIC8vIE9ubHkgY29tcGlsZSBpZiB3ZSBkb24ndCBoYXZlIGEgdmFsaWQgc3RhdGVtZW50IGFscmVhZHkgb3IgdGhlIGNhbGxlciBoYXMKICAgICAgICAgLy8gZXhwbGljaXRseSByZXF1ZXN0ZWQgYSByZWNvbXBpbGUuCiAgICAgICAgIGlmIChmb3JjZUNvbXBpbGF0aW9uKSB7Ci0gICAgICAgICAgICBtRGF0YWJhc2UubG9jaygpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAvLyBOb3RlIHRoYXQgdGhlIG5hdGl2ZV9jb21waWxlKCkgdGFrZXMgY2FyZSBvZiBkZXN0cm95aW5nIGFueSBwcmV2aW91c2x5Ci0gICAgICAgICAgICAgICAgLy8gZXhpc3RpbmcgcHJvZ3JhbXMgYmVmb3JlIGl0IGNvbXBpbGVzLgotICAgICAgICAgICAgICAgIG5hdGl2ZV9jb21waWxlKHNxbCk7Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIG1EYXRhYmFzZS51bmxvY2soKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB0aGUgbmF0aXZlX2NvbXBpbGUoKSB0YWtlcyBjYXJlIG9mIGRlc3Ryb3lpbmcgYW55IHByZXZpb3VzbHkKKyAgICAgICAgICAgIC8vIGV4aXN0aW5nIHByb2dyYW1zIGJlZm9yZSBpdCBjb21waWxlcy4KKyAgICAgICAgICAgIG5hdGl2ZV9jb21waWxlKHNxbCk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTEwMiwxMyArOTUsOCBAQAogICAgICAgICAgICAgaWYgKFNRTGl0ZURlYnVnLkRFQlVHX0FDVElWRV9DVVJTT1JfRklOQUxJWkFUSU9OKSB7CiAgICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAiY2xvc2VkIGFuZCBkZWFsbG9jYXRlZCBEYk9iaiAoaWQjIiArIG5TdGF0ZW1lbnQgKyIpIik7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG1EYXRhYmFzZS5sb2NrKCk7Ci0gICAgICAgICAgICAgICAgbmF0aXZlX2ZpbmFsaXplKCk7Ci0gICAgICAgICAgICAgICAgblN0YXRlbWVudCA9IDA7Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIG1EYXRhYmFzZS51bmxvY2soKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1EYXRhYmFzZS5maW5hbGl6ZVN0YXRlbWVudExhdGVyKG5TdGF0ZW1lbnQpOworICAgICAgICAgICAgblN0YXRlbWVudCA9IDA7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTEzNCw2ICsxMjIsMTAgQEAKICAgICAgICAgbUluVXNlID0gZmFsc2U7CiAgICAgfQogCisgICAgLyogcGFja2FnZSAqLyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBpc0luVXNlKCkgeworICAgICAgICByZXR1cm4gbUluVXNlOworICAgIH0KKwogICAgIC8qKgogICAgICAqIE1ha2Ugc3VyZSB0aGF0IHRoZSBuYXRpdmUgcmVzb3VyY2UgaXMgY2xlYW5lZCB1cC4KICAgICAgKi8KQEAgLTE0Miw5ICsxMzQsNiBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgaWYgKG5TdGF0ZW1lbnQgPT0gMCkgcmV0dXJuOwogICAgICAgICAgICAgLy8gZmluYWxpemVyIHNob3VsZCBORVZFUiBnZXQgY2FsbGVkCi0gICAgICAgICAgICBpZiAoU1FMaXRlRGVidWcuREVCVUdfQUNUSVZFX0NVUlNPUl9GSU5BTElaQVRJT04pIHsKLSAgICAgICAgICAgICAgICBMb2cudihUQUcsICIqKiB3YXJuaW5nICoqIEZpbmFsaXplZCBEYk9iaiAoaWQjIiArIG5TdGF0ZW1lbnQgKyAiKSIpOwotICAgICAgICAgICAgfQogICAgICAgICAgICAgaW50IGxlbiA9IG1TcWxTdG10Lmxlbmd0aCgpOwogICAgICAgICAgICAgTG9nLncoVEFHLCAiUmVsZWFzaW5nIHN0YXRlbWVudCBpbiBhIGZpbmFsaXplci4gUGxlYXNlIGVuc3VyZSAiICsKICAgICAgICAgICAgICAgICAgICAgInRoYXQgeW91IGV4cGxpY2l0bHkgY2FsbCBjbG9zZSgpIG9uIHlvdXIgY3Vyc29yOiAiICsKQEAgLTE2Miw1ICsxNTEsNCBAQAogICAgICAqIEBwYXJhbSBzcWwgVGhlIFNRTCB0byBjb21waWxlLgogICAgICAqLwogICAgIHByaXZhdGUgZmluYWwgbmF0aXZlIHZvaWQgbmF0aXZlX2NvbXBpbGUoU3RyaW5nIHNxbCk7Ci0gICAgcHJpdmF0ZSBmaW5hbCBuYXRpdmUgdm9pZCBuYXRpdmVfZmluYWxpemUoKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVDb250ZW50SGVscGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlQ29udGVudEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODAwZDg2Li4wMDAwMDAwCi0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVDb250ZW50SGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZTsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQXNzZXRGaWxlRGVzY3JpcHRvcjsKLWltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcjsKLWltcG9ydCBhbmRyb2lkLm9zLk1lbW9yeUZpbGU7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi0vKioKLSAqIFNvbWUgaGVscGVyIGZ1bmN0aW9ucyBmb3IgdXNpbmcgU1FMaXRlIGRhdGFiYXNlIHRvIGltcGxlbWVudCBjb250ZW50IHByb3ZpZGVycy4KLSAqCi0gKiBAaGlkZQotICovCi1wdWJsaWMgY2xhc3MgU1FMaXRlQ29udGVudEhlbHBlciB7Ci0KLSAgICAvKioKLSAgICAgKiBSdW5zIGFuIFNRTGl0ZSBxdWVyeSBhbmQgcmV0dXJucyBhbiBBc3NldEZpbGVEZXNjcmlwdG9yIGZvciB0aGUKLSAgICAgKiBibG9iIGluIGNvbHVtbiAwIG9mIHRoZSBmaXJzdCByb3cuIElmIHRoZSBmaXJzdCBjb2x1bW4gZG9lcwotICAgICAqIG5vdCBjb250YWluIGEgYmxvYiwgYW4gdW5zcGVjaWZpZWQgZXhjZXB0aW9uIGlzIHRocm93bi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBkYiBIYW5kbGUgdG8gYSByZWFkYWJsZSBkYXRhYmFzZS4KLSAgICAgKiBAcGFyYW0gc3FsIFNRTCBxdWVyeSwgcG9zc2libHkgd2l0aCBxdWVyeSBhcmd1bWVudHMuCi0gICAgICogQHBhcmFtIHNlbGVjdGlvbkFyZ3MgUXVlcnkgYXJndW1lbnQgdmFsdWVzLCBvciB7QGNvZGUgbnVsbH0gZm9yIG5vIGFyZ3VtZW50LgotICAgICAqIEByZXR1cm4gSWYgbm8gZXhjZXB0aW9uIGlzIHRocm93biwgYSBub24tbnVsbCBBc3NldEZpbGVEZXNjcmlwdG9yIGlzIHJldHVybmVkLgotICAgICAqIEB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIElmIHRoZSBxdWVyeSByZXR1cm5zIG5vIHJlc3VsdHMgb3IgdGhlCi0gICAgICogICAgICAgICB2YWx1ZSBvZiBjb2x1bW4gMCBpcyBOVUxMLCBvciBpZiB0aGVyZSBpcyBhbiBlcnJvciBjcmVhdGluZyB0aGUKLSAgICAgKiAgICAgICAgIGFzc2V0IGZpbGUgZGVzY3JpcHRvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEFzc2V0RmlsZURlc2NyaXB0b3IgZ2V0QmxvYkNvbHVtbkFzQXNzZXRGaWxlKFNRTGl0ZURhdGFiYXNlIGRiLCBTdHJpbmcgc3FsLAotICAgICAgICAgICAgU3RyaW5nW10gc2VsZWN0aW9uQXJncykgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBNZW1vcnlGaWxlIGZpbGUgPSBzaW1wbGVRdWVyeUZvckJsb2JNZW1vcnlGaWxlKGRiLCBzcWwsIHNlbGVjdGlvbkFyZ3MpOwotICAgICAgICAgICAgaWYgKGZpbGUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24oIk5vIHJlc3VsdHMuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gQXNzZXRGaWxlRGVzY3JpcHRvci5mcm9tTWVtb3J5RmlsZShmaWxlKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24oZXgudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSdW5zIGFuIFNRTGl0ZSBxdWVyeSBhbmQgcmV0dXJucyBhIE1lbW9yeUZpbGUgZm9yIHRoZQotICAgICAqIGJsb2IgaW4gY29sdW1uIDAgb2YgdGhlIGZpcnN0IHJvdy4gSWYgdGhlIGZpcnN0IGNvbHVtbiBkb2VzCi0gICAgICogbm90IGNvbnRhaW4gYSBibG9iLCBhbiB1bnNwZWNpZmllZCBleGNlcHRpb24gaXMgdGhyb3duLgotICAgICAqCi0gICAgICogQHJldHVybiBBIG1lbW9yeSBmaWxlLCBvciB7QGNvZGUgbnVsbH0gaWYgdGhlIHF1ZXJ5IHJldHVybnMgbm8gcmVzdWx0cwotICAgICAqICAgICAgICAgb3IgdGhlIHZhbHVlIGNvbHVtbiAwIGlzIE5VTEwuCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBJZiB0aGVyZSBpcyBhbiBlcnJvciBjcmVhdGluZyB0aGUgbWVtb3J5IGZpbGUuCi0gICAgICovCi0gICAgLy8gVE9ETzogbWFrZSB0aGlzIG5hdGl2ZSBhbmQgdXNlIHRoZSBTUUxpdGUgYmxvYiBBUEkgdG8gcmVkdWNlIGNvcHlpbmcKLSAgICBwcml2YXRlIHN0YXRpYyBNZW1vcnlGaWxlIHNpbXBsZVF1ZXJ5Rm9yQmxvYk1lbW9yeUZpbGUoU1FMaXRlRGF0YWJhc2UgZGIsIFN0cmluZyBzcWwsCi0gICAgICAgICAgICBTdHJpbmdbXSBzZWxlY3Rpb25BcmdzKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBDdXJzb3IgY3Vyc29yID0gZGIucmF3UXVlcnkoc3FsLCBzZWxlY3Rpb25BcmdzKTsKLSAgICAgICAgaWYgKGN1cnNvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKCFjdXJzb3IubW92ZVRvRmlyc3QoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnl0ZVtdIGJ5dGVzID0gY3Vyc29yLmdldEJsb2IoMCk7Ci0gICAgICAgICAgICBpZiAoYnl0ZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTWVtb3J5RmlsZSBmaWxlID0gbmV3IE1lbW9yeUZpbGUobnVsbCwgYnl0ZXMubGVuZ3RoKTsKLSAgICAgICAgICAgIGZpbGUud3JpdGVCeXRlcyhieXRlcywgMCwgMCwgYnl0ZXMubGVuZ3RoKTsKLSAgICAgICAgICAgIGZpbGUuZGVhY3RpdmF0ZSgpOwotICAgICAgICAgICAgcmV0dXJuIGZpbGU7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBjdXJzb3IuY2xvc2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZUN1cnNvci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZUN1cnNvci5qYXZhCmluZGV4IGM3ZTU4ZmEuLjQzZGQ1ZDcgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVDdXJzb3IuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlQ3Vyc29yLmphdmEKQEAgLTE2LDIwICsxNiwxOSBAQAogCiBwYWNrYWdlIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlOwogCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHlUaHJlYWQ7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5BYnN0cmFjdFdpbmRvd2VkQ3Vyc29yOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yV2luZG93OwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuRGF0YVNldE9ic2VydmVyOwotaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuU1FMRXhjZXB0aW9uOwotCitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5SZXF1ZXJ5T25VaVRocmVhZEV4Y2VwdGlvbjsKIGltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5Mb29wZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwogaW1wb3J0IGFuZHJvaWQub3MuUHJvY2VzczsKLWltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Db25maWc7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLlJlZW50cmFudExvY2s7CiAKQEAgLTQ1LDE5ICs0NCwxNiBAQAogICAgIHN0YXRpYyBmaW5hbCBpbnQgTk9fQ09VTlQgPSAtMTsKIAogICAgIC8qKiBUaGUgbmFtZSBvZiB0aGUgdGFibGUgdG8gZWRpdCAqLwotICAgIHByaXZhdGUgU3RyaW5nIG1FZGl0VGFibGU7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbUVkaXRUYWJsZTsKIAogICAgIC8qKiBUaGUgbmFtZXMgb2YgdGhlIGNvbHVtbnMgaW4gdGhlIHJvd3MgKi8KLSAgICBwcml2YXRlIFN0cmluZ1tdIG1Db2x1bW5zOworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nW10gbUNvbHVtbnM7CiAKICAgICAvKiogVGhlIHF1ZXJ5IG9iamVjdCBmb3IgdGhlIGN1cnNvciAqLwogICAgIHByaXZhdGUgU1FMaXRlUXVlcnkgbVF1ZXJ5OwogCi0gICAgLyoqIFRoZSBkYXRhYmFzZSB0aGUgY3Vyc29yIHdhcyBjcmVhdGVkIGZyb20gKi8KLSAgICBwcml2YXRlIFNRTGl0ZURhdGFiYXNlIG1EYXRhYmFzZTsKLQogICAgIC8qKiBUaGUgY29tcGlsZWQgcXVlcnkgdGhpcyBjdXJzb3IgY2FtZSBmcm9tICovCi0gICAgcHJpdmF0ZSBTUUxpdGVDdXJzb3JEcml2ZXIgbURyaXZlcjsKKyAgICBwcml2YXRlIGZpbmFsIFNRTGl0ZUN1cnNvckRyaXZlciBtRHJpdmVyOwogCiAgICAgLyoqIFRoZSBudW1iZXIgb2Ygcm93cyBpbiB0aGUgY3Vyc29yICovCiAgICAgcHJpdmF0ZSBpbnQgbUNvdW50ID0gTk9fQ09VTlQ7CkBAIC02Niw3ICs2Miw3IEBACiAgICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBJbnRlZ2VyPiBtQ29sdW1uTmFtZU1hcDsKIAogICAgIC8qKiBVc2VkIHRvIGZpbmQgb3V0IHdoZXJlIGEgY3Vyc29yIHdhcyBhbGxvY2F0ZWQgaW4gY2FzZSBpdCBuZXZlciBnb3QgcmVsZWFzZWQuICovCi0gICAgcHJpdmF0ZSBUaHJvd2FibGUgbVN0YWNrVHJhY2U7CisgICAgcHJpdmF0ZSBmaW5hbCBUaHJvd2FibGUgbVN0YWNrVHJhY2U7CiAgICAgCiAgICAgLyoqIAogICAgICAqICBtTWF4UmVhZCBpcyB0aGUgbWF4IGl0ZW1zIHRoYXQgZWFjaCBjdXJzb3Igd2luZG93IHJlYWRzIApAQCAtNzcsNiArNzMsMTEgQEAKICAgICBwcml2YXRlIGludCBtQ3Vyc29yU3RhdGUgPSAwOwogICAgIHByaXZhdGUgUmVlbnRyYW50TG9jayBtTG9jayA9IG51bGw7CiAgICAgcHJpdmF0ZSBib29sZWFuIG1QZW5kaW5nRGF0YSA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogVXNlZCBieSB7QGxpbmsgI3JlcXVlcnkoKX0gdG8gcmVtZW1iZXIgZm9yIHdoaWNoIGRhdGFiYXNlIHdlJ3ZlIGFscmVhZHkgc2hvd24gdGhlIHdhcm5pbmcuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSGFzaE1hcDxTdHJpbmcsIEJvb2xlYW4+IHNBbHJlYWR5V2FybmVkID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBCb29sZWFuPigpOwogICAgIAogICAgIC8qKgogICAgICAqICBzdXBwb3J0IGZvciBhIGN1cnNvciB2YXJpYW50IHRoYXQgZG9lc24ndCBhbHdheXMgcmVhZCBhbGwgcmVzdWx0cwpAQCAtMTM2LDcgKzEzNyw3IEBACiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQgPSBtUXVlcnkuZmlsbFdpbmRvdyhjdywgbU1heFJlYWQsIG1Db3VudCk7CisgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCA9IGdldFF1ZXJ5KCkuZmlsbFdpbmRvdyhjdywgbU1heFJlYWQsIG1Db3VudCk7CiAgICAgICAgICAgICAgICAgICAgIC8vIHJldHVybiAtMSBtZWFucyBub3QgZmluaXNoZWQKICAgICAgICAgICAgICAgICAgICAgaWYgKGNvdW50ICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb3VudCA9PSBOT19DT1VOVCl7CkBAIC0yMDEsMjQgKzIwMiw0NiBAQAogICAgICAqIGhhcyBwYWNrYWdlIHNjb3BlLgogICAgICAqCiAgICAgICogQHBhcmFtIGRiIGEgcmVmZXJlbmNlIHRvIGEgRGF0YWJhc2Ugb2JqZWN0IHRoYXQgaXMgYWxyZWFkeSBjb25zdHJ1Y3RlZAotICAgICAqICAgICBhbmQgb3BlbmVkCisgICAgICogICAgIGFuZCBvcGVuZWQuIFRoaXMgcGFyYW0gaXMgbm90IHVzZWQgYW55IGxvbmdlcgogICAgICAqIEBwYXJhbSBlZGl0VGFibGUgdGhlIG5hbWUgb2YgdGhlIHRhYmxlIHVzZWQgZm9yIHRoaXMgcXVlcnkKICAgICAgKiBAcGFyYW0gcXVlcnkgdGhlIHJlc3Qgb2YgdGhlIHF1ZXJ5IHRlcm1zCiAgICAgICogICAgIGN1cnNvciBpcyBmaW5hbGl6ZWQKKyAgICAgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rICNTUUxpdGVDdXJzb3IoU1FMaXRlQ3Vyc29yRHJpdmVyLCBTdHJpbmcsIFNRTGl0ZVF1ZXJ5KX0gaW5zdGVhZAogICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIFNRTGl0ZUN1cnNvcihTUUxpdGVEYXRhYmFzZSBkYiwgU1FMaXRlQ3Vyc29yRHJpdmVyIGRyaXZlciwKICAgICAgICAgICAgIFN0cmluZyBlZGl0VGFibGUsIFNRTGl0ZVF1ZXJ5IHF1ZXJ5KSB7CisgICAgICAgIHRoaXMoZHJpdmVyLCBlZGl0VGFibGUsIHF1ZXJ5KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFeGVjdXRlIGEgcXVlcnkgYW5kIHByb3ZpZGUgYWNjZXNzIHRvIGl0cyByZXN1bHQgc2V0IHRocm91Z2ggYSBDdXJzb3IKKyAgICAgKiBpbnRlcmZhY2UuIEZvciBhIHF1ZXJ5IHN1Y2ggYXM6IHtAY29kZSBTRUxFQ1QgbmFtZSwgYmlydGgsIHBob25lIEZST00KKyAgICAgKiBteVRhYmxlIFdIRVJFIC4uLiBMSU1JVCAxLDIwIE9SREVSIEJZLi4ufSB0aGUgY29sdW1uIG5hbWVzIChuYW1lLCBiaXJ0aCwKKyAgICAgKiBwaG9uZSkgd291bGQgYmUgaW4gdGhlIHByb2plY3Rpb24gYXJndW1lbnQgYW5kIGV2ZXJ5dGhpbmcgZnJvbQorICAgICAqIHtAY29kZSBGUk9NfSBvbndhcmQgd291bGQgYmUgaW4gdGhlIHBhcmFtcyBhcmd1bWVudC4gVGhpcyBjb25zdHJ1Y3RvcgorICAgICAqIGhhcyBwYWNrYWdlIHNjb3BlLgorICAgICAqCisgICAgICogQHBhcmFtIGVkaXRUYWJsZSB0aGUgbmFtZSBvZiB0aGUgdGFibGUgdXNlZCBmb3IgdGhpcyBxdWVyeQorICAgICAqIEBwYXJhbSBxdWVyeSB0aGUge0BsaW5rIFNRTGl0ZVF1ZXJ5fSBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY3Vyc29yIG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU1FMaXRlQ3Vyc29yKFNRTGl0ZUN1cnNvckRyaXZlciBkcml2ZXIsIFN0cmluZyBlZGl0VGFibGUsIFNRTGl0ZVF1ZXJ5IHF1ZXJ5KSB7CiAgICAgICAgIC8vIFRoZSBBYnN0cmFjdEN1cnNvciBjb25zdHJ1Y3RvciBuZWVkcyB0byBkbyBzb21lIHNldHVwLgogICAgICAgICBzdXBlcigpOworICAgICAgICBpZiAocXVlcnkgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicXVlcnkgb2JqZWN0IGNhbm5vdCBiZSBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHF1ZXJ5Lm1EYXRhYmFzZSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJxdWVyeS5tRGF0YWJhc2UgY2Fubm90IGJlIG51bGwiKTsKKyAgICAgICAgfQogICAgICAgICBtU3RhY2tUcmFjZSA9IG5ldyBEYXRhYmFzZU9iamVjdE5vdENsb3NlZEV4Y2VwdGlvbigpLmZpbGxJblN0YWNrVHJhY2UoKTsKLSAgICAgICAgbURhdGFiYXNlID0gZGI7CiAgICAgICAgIG1Ecml2ZXIgPSBkcml2ZXI7CiAgICAgICAgIG1FZGl0VGFibGUgPSBlZGl0VGFibGU7CiAgICAgICAgIG1Db2x1bW5OYW1lTWFwID0gbnVsbDsKICAgICAgICAgbVF1ZXJ5ID0gcXVlcnk7CiAKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGRiLmxvY2soKTsKKyAgICAgICAgICAgIHF1ZXJ5Lm1EYXRhYmFzZS5sb2NrKCk7CiAKICAgICAgICAgICAgIC8vIFNldHVwIHRoZSBsaXN0IG9mIGNvbHVtbnMKICAgICAgICAgICAgIGludCBjb2x1bW5Db3VudCA9IG1RdWVyeS5jb2x1bW5Db3VudExvY2tlZCgpOwpAQCAtMjM5LDcgKzI2Miw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgZGIudW5sb2NrKCk7CisgICAgICAgICAgICBxdWVyeS5tRGF0YWJhc2UudW5sb2NrKCk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTI0Nyw3ICsyNzAsOSBAQAogICAgICAqIEByZXR1cm4gdGhlIFNRTGl0ZURhdGFiYXNlIHRoYXQgdGhpcyBjdXJzb3IgaXMgYXNzb2NpYXRlZCB3aXRoLgogICAgICAqLwogICAgIHB1YmxpYyBTUUxpdGVEYXRhYmFzZSBnZXREYXRhYmFzZSgpIHsKLSAgICAgICAgcmV0dXJuIG1EYXRhYmFzZTsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICByZXR1cm4gbVF1ZXJ5Lm1EYXRhYmFzZTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtMjgzLDcgKzMwOCw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIG1XaW5kb3cuc2V0U3RhcnRQb3NpdGlvbihzdGFydFBvcyk7Ci0gICAgICAgIG1Db3VudCA9IG1RdWVyeS5maWxsV2luZG93KG1XaW5kb3csIG1Jbml0aWFsUmVhZCwgMCk7CisgICAgICAgIG1Db3VudCA9IGdldFF1ZXJ5KCkuZmlsbFdpbmRvdyhtV2luZG93LCBtSW5pdGlhbFJlYWQsIDApOwogICAgICAgICAvLyByZXR1cm4gLTEgbWVhbnMgbm90IGZpbmlzaGVkCiAgICAgICAgIGlmIChtQ291bnQgPT0gTk9fQ09VTlQpewogICAgICAgICAgICAgbUNvdW50ID0gc3RhcnRQb3MgKyBtSW5pdGlhbFJlYWQ7CkBAIC0yOTIsNiArMzE3LDEwIEBACiAgICAgICAgIH0gCiAgICAgfQogCisgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgU1FMaXRlUXVlcnkgZ2V0UXVlcnkoKSB7CisgICAgICAgIHJldHVybiBtUXVlcnk7CisgICAgfQorCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBnZXRDb2x1bW5JbmRleChTdHJpbmcgY29sdW1uTmFtZSkgewogICAgICAgICAvLyBDcmVhdGUgbUNvbHVtbk5hbWVNYXAgb24gZGVtYW5kCkBAIC0zMjEsMTY2ICszNTAsMTEgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIC8qKgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBkZWxldGVSb3coKSB7Ci0gICAgICAgIGNoZWNrUG9zaXRpb24oKTsKLQotICAgICAgICAvLyBPbmx5IGFsbG93IGRlbGV0ZXMgaWYgdGhlcmUgaXMgYW4gSUQgY29sdW1uLCBhbmQgdGhlIElEIGhhcyBiZWVuIHJlYWQgZnJvbSBpdAotICAgICAgICBpZiAobVJvd0lkQ29sdW1uSW5kZXggPT0gLTEgfHwgbUN1cnJlbnRSb3dJRCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBMb2cuZShUQUcsCi0gICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgZGVsZXRlIHJvdyBiZWNhdXNlIGVpdGhlciB0aGUgcm93IElEIGNvbHVtbiBpcyBub3QgYXZhaWxhYmxlIG9yIGl0IiArCi0gICAgICAgICAgICAgICAgICAgICJoYXMgbm90IGJlZW4gcmVhZC4iKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGJvb2xlYW4gc3VjY2VzczsKLQotICAgICAgICAvKgotICAgICAgICAgKiBFbnN1cmUgd2UgZG9uJ3QgY2hhbmdlIHRoZSBzdGF0ZSBvZiB0aGUgZGF0YWJhc2Ugd2hlbiBhbm90aGVyCi0gICAgICAgICAqIHRocmVhZCBpcyBob2xkaW5nIHRoZSBkYXRhYmFzZSBsb2NrLiByZXF1ZXJ5KCkgYW5kIG1vdmVUbygpIGFyZSBhbHNvCi0gICAgICAgICAqIHN5bmNocm9uaXplZCBoZXJlIHRvIG1ha2Ugc3VyZSB0aGV5IGdldCB0aGUgc3RhdGUgb2YgdGhlIGRhdGFiYXNlCi0gICAgICAgICAqIGltbWVkaWF0ZWx5IGZvbGxvd2luZyB0aGUgREVMRVRFLgotICAgICAgICAgKi8KLSAgICAgICAgbURhdGFiYXNlLmxvY2soKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbURhdGFiYXNlLmRlbGV0ZShtRWRpdFRhYmxlLCBtQ29sdW1uc1ttUm93SWRDb2x1bW5JbmRleF0gKyAiPT8iLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHttQ3VycmVudFJvd0lELnRvU3RyaW5nKCl9KTsKLSAgICAgICAgICAgICAgICBzdWNjZXNzID0gdHJ1ZTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgc3VjY2VzcyA9IGZhbHNlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbnQgcG9zID0gbVBvczsKLSAgICAgICAgICAgIHJlcXVlcnkoKTsKLQotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIEVuc3VyZSBwcm9wZXIgY3Vyc29yIHN0YXRlLiBOb3RlIHRoYXQgbUN1cnJlbnRSb3dJRCBjaGFuZ2VzCi0gICAgICAgICAgICAgKiBpbiB0aGlzIGNhbGwuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIG1vdmVUb1Bvc2l0aW9uKHBvcyk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBtRGF0YWJhc2UudW5sb2NrKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc3VjY2VzcykgewotICAgICAgICAgICAgb25DaGFuZ2UodHJ1ZSk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRDb2x1bW5OYW1lcygpIHsKICAgICAgICAgcmV0dXJuIG1Db2x1bW5zOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c1VwZGF0ZXMoKSB7Ci0gICAgICAgIHJldHVybiBzdXBlci5zdXBwb3J0c1VwZGF0ZXMoKSAmJiAhVGV4dFV0aWxzLmlzRW1wdHkobUVkaXRUYWJsZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGNvbW1pdFVwZGF0ZXMoTWFwPD8gZXh0ZW5kcyBMb25nLAotICAgICAgICAgICAgPyBleHRlbmRzIE1hcDxTdHJpbmcsIE9iamVjdD4+IGFkZGl0aW9uYWxWYWx1ZXMpIHsKLSAgICAgICAgaWYgKCFzdXBwb3J0c1VwZGF0ZXMoKSkgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAiY29tbWl0VXBkYXRlcyBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgY3Vyc29yLCBkaWQgeW91ICIKLSAgICAgICAgICAgICAgICAgICAgKyAiaW5jbHVkZSB0aGUgX2lkIGNvbHVtbj8iKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFByZXZlbnQgb3RoZXIgdGhyZWFkcyBmcm9tIGNoYW5naW5nIHRoZSB1cGRhdGVkIHJvd3Mgd2hpbGUgdGhleSdyZQotICAgICAgICAgKiBiZWluZyBwcm9jZXNzZWQgaGVyZS4KLSAgICAgICAgICovCi0gICAgICAgIHN5bmNocm9uaXplZCAobVVwZGF0ZWRSb3dzKSB7Ci0gICAgICAgICAgICBpZiAoYWRkaXRpb25hbFZhbHVlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVVwZGF0ZWRSb3dzLnB1dEFsbChhZGRpdGlvbmFsVmFsdWVzKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1VcGRhdGVkUm93cy5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogUHJldmVudCBvdGhlciB0aHJlYWRzIGZyb20gY2hhbmdpbmcgdGhlIGRhdGFiYXNlIHN0YXRlIHdoaWxlCi0gICAgICAgICAgICAgKiB3ZSBwcm9jZXNzIHRoZSB1cGRhdGVkIHJvd3MsIGFuZCBwcmV2ZW50cyB1cyBmcm9tIGNoYW5naW5nIHRoZQotICAgICAgICAgICAgICogZGF0YWJhc2UgYmVoaW5kIHRoZSBiYWNrIG9mIGFub3RoZXIgdGhyZWFkLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBtRGF0YWJhc2UuYmVnaW5UcmFuc2FjdGlvbigpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHNxbCA9IG5ldyBTdHJpbmdCdWlsZGVyKDEyOCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBGb3IgZWFjaCByb3cgdGhhdCBoYXMgYmVlbiB1cGRhdGVkCi0gICAgICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8TG9uZywgTWFwPFN0cmluZywgT2JqZWN0Pj4gcm93RW50cnkgOgotICAgICAgICAgICAgICAgICAgICAgICAgbVVwZGF0ZWRSb3dzLmVudHJ5U2V0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiB2YWx1ZXMgPSByb3dFbnRyeS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICBMb25nIHJvd0lkT2JqID0gcm93RW50cnkuZ2V0S2V5KCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHJvd0lkT2JqID09IG51bGwgfHwgdmFsdWVzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIm51bGwgcm93SWQgb3IgdmFsdWVzIGZvdW5kISByb3dJZCA9ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyByb3dJZE9iaiArICIsIHZhbHVlcyA9ICIgKyB2YWx1ZXMpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlcy5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBsb25nIHJvd0lkID0gcm93SWRPYmoubG9uZ1ZhbHVlKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgSXRlcmF0b3I8TWFwLkVudHJ5PFN0cmluZywgT2JqZWN0Pj4gdmFsdWVzSXRlciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKLQotICAgICAgICAgICAgICAgICAgICBzcWwuc2V0TGVuZ3RoKDApOwotICAgICAgICAgICAgICAgICAgICBzcWwuYXBwZW5kKCJVUERBVEUgIiArIG1FZGl0VGFibGUgKyAiIFNFVCAiKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBGb3IgZWFjaCBjb2x1bW4gdmFsdWUgdGhhdCBoYXMgYmVlbiB1cGRhdGVkCi0gICAgICAgICAgICAgICAgICAgIE9iamVjdFtdIGJpbmRpbmdzID0gbmV3IE9iamVjdFt2YWx1ZXMuc2l6ZSgpXTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGkgPSAwOwotICAgICAgICAgICAgICAgICAgICB3aGlsZSAodmFsdWVzSXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE1hcC5FbnRyeTxTdHJpbmcsIE9iamVjdD4gZW50cnkgPSB2YWx1ZXNJdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNxbC5hcHBlbmQoZW50cnkuZ2V0S2V5KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgc3FsLmFwcGVuZCgiPT8iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRpbmdzW2ldID0gZW50cnkuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZXNJdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNxbC5hcHBlbmQoIiwgIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBzcWwuYXBwZW5kKCIgV0hFUkUgIiArIG1Db2x1bW5zW21Sb3dJZENvbHVtbkluZGV4XQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgJz0nICsgcm93SWQpOwotICAgICAgICAgICAgICAgICAgICBzcWwuYXBwZW5kKCc7Jyk7Ci0gICAgICAgICAgICAgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKHNxbC50b1N0cmluZygpLCBiaW5kaW5ncyk7Ci0gICAgICAgICAgICAgICAgICAgIG1EYXRhYmFzZS5yb3dVcGRhdGVkKG1FZGl0VGFibGUsIHJvd0lkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbURhdGFiYXNlLnNldFRyYW5zYWN0aW9uU3VjY2Vzc2Z1bCgpOwotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICBtRGF0YWJhc2UuZW5kVHJhbnNhY3Rpb24oKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbVVwZGF0ZWRSb3dzLmNsZWFyKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBMZXQgYW55IGNoYW5nZSBvYnNlcnZlcnMga25vdyBhYm91dCB0aGUgdXBkYXRlCi0gICAgICAgIG9uQ2hhbmdlKHRydWUpOwotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQogICAgIHByaXZhdGUgdm9pZCBkZWFjdGl2YXRlQ29tbW9uKCkgewogICAgICAgICBpZiAoQ29uZmlnLkxPR1YpIExvZy52KFRBRywgIjw8PCBSZWxlYXNpbmcgY3Vyc29yICIgKyB0aGlzKTsKICAgICAgICAgbUN1cnNvclN0YXRlID0gMDsKQEAgLTUwMSw5ICszNzUsMzIgQEAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKICAgICAgICAgc3VwZXIuY2xvc2UoKTsKLSAgICAgICAgZGVhY3RpdmF0ZUNvbW1vbigpOwotICAgICAgICBtUXVlcnkuY2xvc2UoKTsKLSAgICAgICAgbURyaXZlci5jdXJzb3JDbG9zZWQoKTsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBkZWFjdGl2YXRlQ29tbW9uKCk7CisgICAgICAgICAgICBtUXVlcnkuY2xvc2UoKTsKKyAgICAgICAgICAgIG1Ecml2ZXIuY3Vyc29yQ2xvc2VkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTaG93IGEgd2FybmluZyBhZ2FpbnN0IHRoZSB1c2Ugb2YgcmVxdWVyeSgpIGlmIGNhbGxlZCBvbiB0aGUgbWFpbiB0aHJlYWQuCisgICAgICogVGhpcyB3YXJuaW5nIGlzIHNob3duIHBlciBkYXRhYmFzZSBwZXIgcHJvY2Vzcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgd2FybklmVWlUaHJlYWQoKSB7CisgICAgICAgIGlmIChMb29wZXIuZ2V0TWFpbkxvb3BlcigpID09IExvb3Blci5teUxvb3BlcigpKSB7CisgICAgICAgICAgICBTdHJpbmcgZGF0YWJhc2VQYXRoID0gZ2V0UXVlcnkoKS5tRGF0YWJhc2UuZ2V0UGF0aCgpOworICAgICAgICAgICAgLy8gV2Ugc2hvdyB0aGUgd2FybmluZyBvbmNlIHBlciBkYXRhYmFzZSBpbiBvcmRlciBub3QgdG8gc3BhbSBsb2djYXQuCisgICAgICAgICAgICBpZiAoIXNBbHJlYWR5V2FybmVkLmNvbnRhaW5zS2V5KGRhdGFiYXNlUGF0aCkpIHsKKyAgICAgICAgICAgICAgICBzQWxyZWFkeVdhcm5lZC5wdXQoZGF0YWJhc2VQYXRoLCB0cnVlKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUgPSBBY3Rpdml0eVRocmVhZC5jdXJyZW50UGFja2FnZU5hbWUoKTsKKyAgICAgICAgICAgICAgICBUaHJvd2FibGUgdCA9IG51bGw7CisgICAgICAgICAgICAgICAgLy8gQkVHSU4gU1RPUFNISVAgcmVtb3ZlIHRoZSBmb2xsb3dpbmcgbGluZQorICAgICAgICAgICAgICAgIHQgPSBuZXcgUmVxdWVyeU9uVWlUaHJlYWRFeGNlcHRpb24ocGFja2FnZU5hbWUpOworICAgICAgICAgICAgICAgIC8vIEVORCBTVE9QU0hJUAorICAgICAgICAgICAgICAgIExvZy53KFRBRywgInNob3VsZCBub3QgYXR0ZW1wdCByZXF1ZXJ5IG9uIG1haW4gKFVJKSB0aHJlYWQ6IGFwcCA9ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZU5hbWUgPT0gbnVsbCA/ICIndW5rbm93biciIDogcGFja2FnZU5hbWUsIHQpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC01MTEsMjAgKzQwOCwzMCBAQAogICAgICAgICBpZiAoaXNDbG9zZWQoKSkgewogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CisgICAgICAgIHdhcm5JZlVpVGhyZWFkKCk7CiAgICAgICAgIGxvbmcgdGltZVN0YXJ0ID0gMDsKICAgICAgICAgaWYgKENvbmZpZy5MT0dWKSB7CiAgICAgICAgICAgICB0aW1lU3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKICAgICAgICAgfQotICAgICAgICAvKgotICAgICAgICAgKiBTeW5jaHJvbml6ZSBvbiB0aGUgZGF0YWJhc2UgbG9jayB0byBlbnN1cmUgdGhhdCBtQ291bnQgbWF0Y2hlcyB0aGUKLSAgICAgICAgICogcmVzdWx0cyBvZiBtUXVlcnkucmVxdWVyeSgpLgotICAgICAgICAgKi8KLSAgICAgICAgbURhdGFiYXNlLmxvY2soKTsKLSAgICAgICAgdHJ5IHsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKICAgICAgICAgICAgIGlmIChtV2luZG93ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBtV2luZG93LmNsZWFyKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtUG9zID0gLTE7CisgICAgICAgICAgICBTUUxpdGVEYXRhYmFzZSBkYiA9IG1RdWVyeS5tRGF0YWJhc2UuZ2V0RGF0YWJhc2VIYW5kbGUobVF1ZXJ5Lm1TcWwpOworICAgICAgICAgICAgaWYgKCFkYi5lcXVhbHMobVF1ZXJ5Lm1EYXRhYmFzZSkpIHsKKyAgICAgICAgICAgICAgICAvLyBzaW5jZSB3ZSBuZWVkIHRvIHVzZSBhIGRpZmZlcmVudCBkYXRhYmFzZSBjb25uZWN0aW9uIGhhbmRsZSwKKyAgICAgICAgICAgICAgICAvLyByZS1jb21waWxlIHRoZSBxdWVyeQorICAgICAgICAgICAgICAgIGRiLmxvY2soKTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAvLyBjbG9zZSB0aGUgb2xkIG1RdWVyeSBvYmplY3QgYW5kIG9wZW4gYSBuZXcgb25lCisgICAgICAgICAgICAgICAgICAgIG1RdWVyeS5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICBtUXVlcnkgPSBuZXcgU1FMaXRlUXVlcnkoZGIsIG1RdWVyeSk7CisgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgZGIudW5sb2NrKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gVGhpcyBvbmUgd2lsbCByZWNyZWF0ZSB0aGUgdGVtcCB0YWJsZSwgYW5kIGdldCBpdHMgY291bnQKICAgICAgICAgICAgIG1Ecml2ZXIuY3Vyc29yUmVxdWVyaWVkKHRoaXMpOwogICAgICAgICAgICAgbUNvdW50ID0gTk9fQ09VTlQ7CkBAIC01MzUsOCArNDQyLDYgQEAKICAgICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAgICAgcXVlcnlUaHJlYWRVbmxvY2soKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIG1EYXRhYmFzZS51bmxvY2soKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChDb25maWcuTE9HVikgewpAQCAtNTg0LDE0ICs0ODksMTQgQEAKICAgICAgICAgICAgIGlmIChtV2luZG93ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBpbnQgbGVuID0gbVF1ZXJ5Lm1TcWwubGVuZ3RoKCk7CiAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiRmluYWxpemluZyBhIEN1cnNvciB0aGF0IGhhcyBub3QgYmVlbiBkZWFjdGl2YXRlZCBvciBjbG9zZWQuICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgImRhdGFiYXNlID0gIiArIG1EYXRhYmFzZS5nZXRQYXRoKCkgKyAiLCB0YWJsZSA9ICIgKyBtRWRpdFRhYmxlICsKKyAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhYmFzZSA9ICIgKyBtUXVlcnkubURhdGFiYXNlLmdldFBhdGgoKSArICIsIHRhYmxlID0gIiArIG1FZGl0VGFibGUgKwogICAgICAgICAgICAgICAgICAgICAgICAgIiwgcXVlcnkgPSAiICsgbVF1ZXJ5Lm1TcWwuc3Vic3RyaW5nKDAsIChsZW4gPiAxMDApID8gMTAwIDogbGVuKSwKICAgICAgICAgICAgICAgICAgICAgICAgIG1TdGFja1RyYWNlKTsKICAgICAgICAgICAgICAgICBjbG9zZSgpOwogICAgICAgICAgICAgICAgIFNRTGl0ZURlYnVnLm5vdGlmeUFjdGl2ZUN1cnNvckZpbmFsaXplZCgpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBpZiAoQ29uZmlnLkxPR1YpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAiRmluYWxpemluZyBjdXJzb3Igb24gZGF0YWJhc2UgPSAiICsgbURhdGFiYXNlLmdldFBhdGgoKSArCisgICAgICAgICAgICAgICAgICAgIExvZy52KFRBRywgIkZpbmFsaXppbmcgY3Vyc29yIG9uIGRhdGFiYXNlID0gIiArIG1RdWVyeS5tRGF0YWJhc2UuZ2V0UGF0aCgpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLCB0YWJsZSA9ICIgKyBtRWRpdFRhYmxlICsgIiwgcXVlcnkgPSAiICsgbVF1ZXJ5Lm1TcWwpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVDdXJzb3JEcml2ZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVDdXJzb3JEcml2ZXIuamF2YQppbmRleCBlZGExYjc4Li5iMzk2M2Y5IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlQ3Vyc29yRHJpdmVyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZUN1cnNvckRyaXZlci5qYXZhCkBAIC00MCw4ICs0MCw2IEBACiAKICAgICAvKioKICAgICAgKiBDYWxsZWQgYnkgYSBTUUxpdGVDdXJzb3Igd2hlbiBpdCBpcyByZXF1ZXJ5ZWQuCi0gICAgICogCi0gICAgICogQHJldHVybiBUaGUgbmV3IGNvdW50IHZhbHVlLgogICAgICAqLwogICAgIHZvaWQgY3Vyc29yUmVxdWVyaWVkKEN1cnNvciBjdXJzb3IpOwogCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlRGF0YWJhc2UuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVEYXRhYmFzZS5qYXZhCmluZGV4IGNkYzliYmIuLmI4M2Q1YWQgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVEYXRhYmFzZS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVEYXRhYmFzZS5qYXZhCkBAIC0xNiwxNiArMTYsMTYgQEAKIAogcGFja2FnZSBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZTsKIAotaW1wb3J0IGNvbS5nb29nbGUuYW5kcm9pZC5jb2xsZWN0Lk1hcHM7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eVRocmVhZDsKIGltcG9ydCBhbmRyb2lkLmFwcC5BcHBHbG9iYWxzOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yOworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuRGF0YWJhc2VFcnJvckhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5EYXRhYmFzZVV0aWxzOworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuRGVmYXVsdERhdGFiYXNlRXJyb3JIYW5kbGVyOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuU1FMRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURlYnVnLkRiU3RhdHM7CiBpbXBvcnQgYW5kcm9pZC5vcy5EZWJ1ZzsKK2ltcG9ydCBhbmRyb2lkLm9zLlN0YXRGczsKIGltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOwogaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtUHJvcGVydGllczsKIGltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwpAQCAtMzgsMTUgKzM4LDE0IEBACiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOwotaW1wb3J0IGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0OwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwogaW1wb3J0IGphdmEudXRpbC5XZWFrSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5SZWVudHJhbnRMb2NrOwogaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwpAQCAtNjcsNyArNjYsNyBAQAogICogaXMgdGhlIFVuaWNvZGUgQ29sbGF0aW9uIEFsZ29yaXRobSBhbmQgbm90IHRhaWxvcmVkIHRvIHRoZSBjdXJyZW50IGxvY2FsZS4KICAqLwogcHVibGljIGNsYXNzIFNRTGl0ZURhdGFiYXNlIGV4dGVuZHMgU1FMaXRlQ2xvc2FibGUgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiRGF0YWJhc2UiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiU1FMaXRlRGF0YWJhc2UiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVF9EQl9PUEVSQVRJT04gPSA1MjAwMDsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfREJfQ09SUlVQVCA9IDc1MDA0OwogCkBAIC0xOTIsNiArMTkxLDExIEBACiAgICAgICovCiAgICAgcHJpdmF0ZSBTUUxpdGVUcmFuc2FjdGlvbkxpc3RlbmVyIG1UcmFuc2FjdGlvbkxpc3RlbmVyOwogCisgICAgLyoqCisgICAgICogdGhpcyBtZW1iZXIgaXMgc2V0IGlmIHtAbGluayAjZXhlY1NRTChTdHJpbmcpfSBpcyB1c2VkIHRvIGJlZ2luIGFuZCBlbmQgdHJhbnNhY3Rpb25zLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBtVHJhbnNhY3Rpb25Vc2luZ0V4ZWNTcWw7CisKICAgICAvKiogU3luY2hyb25pemUgb24gdGhpcyB3aGVuIGFjY2Vzc2luZyB0aGUgZGF0YWJhc2UgKi8KICAgICBwcml2YXRlIGZpbmFsIFJlZW50cmFudExvY2sgbUxvY2sgPSBuZXcgUmVlbnRyYW50TG9jayh0cnVlKTsKIApAQCAtMjMzLDQ4ICsyMzcsNzggQEAKICAgICAvLyBsb2NrIGFjcXVpc3Rpb25zIG9mIHRoZSBkYXRhYmFzZS4KICAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VUX0xPQ0tfTE9HX1BSRUZJWCA9ICJHRVRMT0NLOiI7CiAKLSAgICAvKiogVXNlZCBieSBuYXRpdmUgY29kZSwgZG8gbm90IHJlbmFtZSAqLwotICAgIC8qIHBhY2thZ2UgKi8gaW50IG1OYXRpdmVIYW5kbGUgPSAwOworICAgIC8qKiBVc2VkIGJ5IG5hdGl2ZSBjb2RlLCBkbyBub3QgcmVuYW1lLiBtYWtlIGl0IHZvbGF0aWxlLCBzbyBpdCBpcyB0aHJlYWQtc2FmZS4gKi8KKyAgICAvKiBwYWNrYWdlICovIHZvbGF0aWxlIGludCBtTmF0aXZlSGFuZGxlID0gMDsKIAotICAgIC8qKiBVc2VkIHRvIG1ha2UgdGVtcCB0YWJsZSBuYW1lcyB1bmlxdWUgKi8KLSAgICAvKiBwYWNrYWdlICovIGludCBtVGVtcFRhYmxlU2VxdWVuY2UgPSAwOworICAgIC8qKgorICAgICAqIFRoZSBzaXplLCBpbiBieXRlcywgb2YgYSBibG9jayBvbiAiL2RhdGEiLiBUaGlzIGNvcnJlc3BvbmRzIHRvIHRoZSBVbml4CisgICAgICogc3RhdGZzLmZfYnNpemUgZmllbGQuIG5vdGUgdGhhdCB0aGlzIGZpZWxkIGlzIGxhemlseSBpbml0aWFsaXplZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgc0Jsb2NrU2l6ZSA9IDA7CiAKICAgICAvKiogVGhlIHBhdGggZm9yIHRoZSBkYXRhYmFzZSBmaWxlICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgbVBhdGg7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbVBhdGg7CiAKICAgICAvKiogVGhlIGFub255bWl6ZWQgcGF0aCBmb3IgdGhlIGRhdGFiYXNlIGZpbGUgZm9yIGxvZ2dpbmcgcHVycG9zZXMgKi8KICAgICBwcml2YXRlIFN0cmluZyBtUGF0aEZvckxvZ3MgPSBudWxsOyAgLy8gbGF6aWx5IHBvcHVsYXRlZAogCiAgICAgLyoqIFRoZSBmbGFncyBwYXNzZWQgdG8gb3Blbi9jcmVhdGUgKi8KLSAgICBwcml2YXRlIGludCBtRmxhZ3M7CisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbUZsYWdzOwogCiAgICAgLyoqIFRoZSBvcHRpb25hbCBmYWN0b3J5IHRvIHVzZSB3aGVuIGNyZWF0aW5nIG5ldyBDdXJzb3JzICovCi0gICAgcHJpdmF0ZSBDdXJzb3JGYWN0b3J5IG1GYWN0b3J5OworICAgIHByaXZhdGUgZmluYWwgQ3Vyc29yRmFjdG9yeSBtRmFjdG9yeTsKIAotICAgIHByaXZhdGUgV2Vha0hhc2hNYXA8U1FMaXRlQ2xvc2FibGUsIE9iamVjdD4gbVByb2dyYW1zOworICAgIHByaXZhdGUgZmluYWwgV2Vha0hhc2hNYXA8U1FMaXRlQ2xvc2FibGUsIE9iamVjdD4gbVByb2dyYW1zOwogCiAgICAgLyoqCi0gICAgICogZm9yIGVhY2ggaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcywgYSBjYWNoZSBpcyBtYWludGFpbmVkIHRvIHN0b3JlCisgICAgICogZm9yIGVhY2ggaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcywgYSBMUlUgY2FjaGUgaXMgbWFpbnRhaW5lZCB0byBzdG9yZQogICAgICAqIHRoZSBjb21waWxlZCBxdWVyeSBzdGF0ZW1lbnQgaWRzIHJldHVybmVkIGJ5IHNxbGl0ZSBkYXRhYmFzZS4KLSAgICAgKiAgICAga2V5ID0gc3FsIHN0YXRlbWVudCB3aXRoICI/IiBmb3IgYmluZCBhcmdzCisgICAgICogICAgIGtleSA9IFNRTCBzdGF0ZW1lbnQgd2l0aCAiPyIgZm9yIGJpbmQgYXJncwogICAgICAqICAgICB2YWx1ZSA9IHtAbGluayBTUUxpdGVDb21waWxlZFNxbH0KICAgICAgKiBJZiBhbiBhcHBsaWNhdGlvbiBvcGVucyB0aGUgZGF0YWJhc2UgYW5kIGtlZXBzIGl0IG9wZW4gZHVyaW5nIGl0cyBlbnRpcmUgbGlmZSwgdGhlbgotICAgICAqIHRoZXJlIHdpbGwgbm90IGJlIGFuIG92ZXJoZWFkIG9mIGNvbXBpbGF0aW9uIG9mIHNxbCBzdGF0ZW1lbnRzIGJ5IHNxbGl0ZS4KKyAgICAgKiB0aGVyZSB3aWxsIG5vdCBiZSBhbiBvdmVyaGVhZCBvZiBjb21waWxhdGlvbiBvZiBTUUwgc3RhdGVtZW50cyBieSBzcWxpdGUuCiAgICAgICoKICAgICAgKiB3aHkgaXMgdGhpcyBjYWNoZSBOT1Qgc3RhdGljPyBiZWNhdXNlIHNxbGl0ZSBhdHRhY2hlcyBjb21waWxlZHNxbCBzdGF0ZW1lbnRzIHRvIHRoZQogICAgICAqIHN0cnVjdCBjcmVhdGVkIHdoZW4ge0BsaW5rIFNRTGl0ZURhdGFiYXNlI29wZW5EYXRhYmFzZShTdHJpbmcsIEN1cnNvckZhY3RvcnksIGludCl9IGlzCiAgICAgICogaW52b2tlZC4KICAgICAgKgogICAgICAqIHRoaXMgY2FjaGUgaGFzIGFuIHVwcGVyIGxpbWl0IG9mIG1NYXhTcWxDYWNoZVNpemUgKHNldHRhYmxlIGJ5IGNhbGxpbmcgdGhlIG1ldGhvZAotICAgICAqIChAbGluayBzZXRNYXhDYWNoZVNpemUoaW50KX0pLiBpdHMgZGVmYXVsdCBpcyAwIC0gaS5lLiwgbm8gY2FjaGluZyBieSBkZWZhdWx0IGJlY2F1c2UKLSAgICAgKiBtb3N0IG9mIHRoZSBhcHBzIGRvbid0IHVzZSAiPyIgc3ludGF4IGluIHRoZWlyIHNxbCwgY2FjaGluZyBpcyBub3QgdXNlZnVsIGZvciB0aGVtLgorICAgICAqIChAbGluayBzZXRNYXhTcWxDYWNoZVNpemUoaW50KX0pLgogICAgICAqLwotICAgIC8qIHBhY2thZ2UgKi8gTWFwPFN0cmluZywgU1FMaXRlQ29tcGlsZWRTcWw+IG1Db21waWxlZFF1ZXJpZXMgPSBNYXBzLm5ld0hhc2hNYXAoKTsKKyAgICAvLyBkZWZhdWx0IHN0YXRlbWVudC1jYWNoZSBzaXplIHBlciBkYXRhYmFzZSBjb25uZWN0aW9uICggPSBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzKQorICAgIHByaXZhdGUgaW50IG1NYXhTcWxDYWNoZVNpemUgPSAyNTsKKyAgICAvKiBwYWNrYWdlICovIGZpbmFsIE1hcDxTdHJpbmcsIFNRTGl0ZUNvbXBpbGVkU3FsPiBtQ29tcGlsZWRRdWVyaWVzID0KKyAgICAgICAgbmV3IExpbmtlZEhhc2hNYXA8U3RyaW5nLCBTUUxpdGVDb21waWxlZFNxbD4obU1heFNxbENhY2hlU2l6ZSArIDEsIDAuNzVmLCB0cnVlKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZUVsZGVzdEVudHJ5KE1hcC5FbnRyeTxTdHJpbmcsIFNRTGl0ZUNvbXBpbGVkU3FsPiBlbGRlc3QpIHsKKyAgICAgICAgICAgICAgICAvLyBlbGRlc3QgPSBsZWFzdC1yZWNlbnRseSB1c2VkIGVudHJ5CisgICAgICAgICAgICAgICAgLy8gaWYgaXQgbmVlZHMgdG8gYmUgcmVtb3ZlZCB0byBhY2NvbW1vZGF0ZSBhIG5ldyBlbnRyeSwKKyAgICAgICAgICAgICAgICAvLyAgICAgY2xvc2Uge0BsaW5rIFNRTGl0ZUNvbXBpbGVkU3FsfSByZXByZXNlbnRlZCBieSB0aGlzIGVudHJ5LCBpZiBub3QgaW4gdXNlCisgICAgICAgICAgICAgICAgLy8gICAgIGFuZCB0aGVuIGxldCBpdCBiZSByZW1vdmVkIGZyb20gdGhlIE1hcC4KKyAgICAgICAgICAgICAgICAvLyB3aGVuIHRoaXMgaXMgY2FsbGVkLCB0aGUgY2FsbGVyIG11c3QgYmUgdHJ5aW5nIHRvIGFkZCBhIGp1c3QtY29tcGlsZWQgc3RtdAorICAgICAgICAgICAgICAgIC8vIHRvIGNhY2hlOyBpLmUuLCBjYWxsZXIgc2hvdWxkIGFscmVhZHkgaGF2ZSBhY3F1aXJlZCBkYXRhYmFzZSBsb2NrIEFORAorICAgICAgICAgICAgICAgIC8vIHRoZSBsb2NrIG9uIG1Db21waWxlZFF1ZXJpZXMuIGRvIGFzIGFzc2VydCBvZiB0aGVzZSB0d28gMiBmYWN0cy4KKyAgICAgICAgICAgICAgICB2ZXJpZnlMb2NrT3duZXIoKTsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy5zaXplKCkgPD0gbU1heFNxbENhY2hlU2l6ZSkgeworICAgICAgICAgICAgICAgICAgICAvLyBjYWNoZSBpcyBub3QgZnVsbC4gbm90aGluZyBuZWVkcyB0byBiZSByZW1vdmVkCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gY2FjaGUgaXMgZnVsbC4gZWxkZXN0IHdpbGwgYmUgcmVtb3ZlZC4KKyAgICAgICAgICAgICAgICBTUUxpdGVDb21waWxlZFNxbCBlbnRyeSA9IGVsZGVzdC5nZXRWYWx1ZSgpOworICAgICAgICAgICAgICAgIGlmICghZW50cnkuaXNJblVzZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMge0BsaW5rIFNRTGl0ZUNvbXBpbGVkU3FsfSBpcyBub3QgaW4gdXNlLiByZWxlYXNlIGl0LgorICAgICAgICAgICAgICAgICAgICBlbnRyeS5yZWxlYXNlU3FsU3RhdGVtZW50KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIHJldHVybiB0cnVlLCBzbyB0aGF0IHRoaXMgZW50cnkgaXMgcmVtb3ZlZCBhdXRvbWF0aWNhbGx5IGJ5IHRoZSBjYWxsZXIuCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH07CiAgICAgLyoqCi0gICAgICogQGhpZGUKKyAgICAgKiBhYnNvbHV0ZSBtYXggdmFsdWUgdGhhdCBjYW4gYmUgc2V0IGJ5IHtAbGluayAjc2V0TWF4U3FsQ2FjaGVTaXplKGludCl9CisgICAgICogc2l6ZSBvZiBlYWNoIHByZXBhcmVkLXN0YXRlbWVudCBpcyBiZXR3ZWVuIDFLIC0gNkssIGRlcGVuZGluZyBvbiB0aGUgY29tcGxleGl0eSBvZiB0aGUKKyAgICAgKiBTUUwgc3RhdGVtZW50ICYgc2NoZW1hLgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BWF9TUUxfQ0FDSEVfU0laRSA9IDI1MDsKLSAgICBwcml2YXRlIGludCBtTWF4U3FsQ2FjaGVTaXplID0gTUFYX1NRTF9DQUNIRV9TSVpFOyAvLyBtYXggY2FjaGUgc2l6ZSBwZXIgRGF0YWJhc2UgaW5zdGFuY2UKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQVhfU1FMX0NBQ0hFX1NJWkUgPSAxMDA7CiAgICAgcHJpdmF0ZSBpbnQgbUNhY2hlRnVsbFdhcm5pbmdzOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfV0FSTklOR1NfT05fQ0FDSEVTSVpFX0NPTkRJVElPTiA9IDE7CiAKQEAgLTI4Miw0NSArMzE2LDU5IEBACiAgICAgcHJpdmF0ZSBpbnQgbU51bUNhY2hlSGl0czsKICAgICBwcml2YXRlIGludCBtTnVtQ2FjaGVNaXNzZXM7CiAKLSAgICAvKiogdGhlIGZvbGxvd2luZyAyIG1lbWJlcnMgbWFpbnRhaW4gdGhlIHRpbWUgd2hlbiBhIGRhdGFiYXNlIGlzIG9wZW5lZCBhbmQgY2xvc2VkICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgbVRpbWVPcGVuZWQgPSBudWxsOwotICAgIHByaXZhdGUgU3RyaW5nIG1UaW1lQ2xvc2VkID0gbnVsbDsKLQogICAgIC8qKiBVc2VkIHRvIGZpbmQgb3V0IHdoZXJlIHRoaXMgb2JqZWN0IHdhcyBjcmVhdGVkIGluIGNhc2UgaXQgbmV2ZXIgZ290IGNsb3NlZC4gKi8KLSAgICBwcml2YXRlIFRocm93YWJsZSBtU3RhY2tUcmFjZSA9IG51bGw7CisgICAgcHJpdmF0ZSBmaW5hbCBUaHJvd2FibGUgbVN0YWNrVHJhY2U7CiAKICAgICAvLyBTeXN0ZW0gcHJvcGVydHkgdGhhdCBlbmFibGVzIGxvZ2dpbmcgb2Ygc2xvdyBxdWVyaWVzLiBTcGVjaWZ5IHRoZSB0aHJlc2hvbGQgaW4gbXMuCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19TTE9XX1FVRVJJRVNfUFJPUEVSVFkgPSAiZGIubG9nLnNsb3dfcXVlcnlfdGhyZXNob2xkIjsKICAgICBwcml2YXRlIGZpbmFsIGludCBtU2xvd1F1ZXJ5VGhyZXNob2xkOwogCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGNsb3NhYmxlCisgICAgLyoqIHN0b3JlcyB0aGUgbGlzdCBvZiBzdGF0ZW1lbnQgaWRzIHRoYXQgbmVlZCB0byBiZSBmaW5hbGl6ZWQgYnkgc3FsaXRlICovCisgICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8SW50ZWdlcj4gbUNsb3NlZFN0YXRlbWVudElkcyA9IG5ldyBBcnJheUxpc3Q8SW50ZWdlcj4oKTsKKworICAgIC8qKiB7QGxpbmsgRGF0YWJhc2VFcnJvckhhbmRsZXJ9IHRvIGJlIHVzZWQgd2hlbiBTUUxpdGUgcmV0dXJucyBhbnkgb2YgdGhlIGZvbGxvd2luZyBlcnJvcnMKKyAgICAgKiAgICBDb3JydXB0aW9uCisgICAgICogKi8KKyAgICBwcml2YXRlIGZpbmFsIERhdGFiYXNlRXJyb3JIYW5kbGVyIG1FcnJvckhhbmRsZXI7CisKKyAgICAvKiogVGhlIERhdGFiYXNlIGNvbm5lY3Rpb24gcG9vbCB7QGxpbmsgRGF0YWJhc2VDb25uZWN0aW9uUG9vbH0uCisgICAgICogVmlzaWJpbGl0eSBpcyBwYWNrYWdlLXByaXZhdGUgZm9yIHRlc3RpbmcgcHVycG9zZXMuIG90aGVyd2lzZSwgcHJpdmF0ZSB2aXNpYmlsaXR5IGlzIGVub3VnaC4KICAgICAgKi8KLSAgICB2b2lkIGFkZFNRTGl0ZUNsb3NhYmxlKFNRTGl0ZUNsb3NhYmxlIGNsb3NhYmxlKSB7Ci0gICAgICAgIGxvY2soKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG1Qcm9ncmFtcy5wdXQoY2xvc2FibGUsIG51bGwpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgdW5sb2NrKCk7Ci0gICAgICAgIH0KKyAgICAvKiBwYWNrYWdlICovIHZvbGF0aWxlIERhdGFiYXNlQ29ubmVjdGlvblBvb2wgbUNvbm5lY3Rpb25Qb29sID0gbnVsbDsKKworICAgIC8qKiBFYWNoIGRhdGFiYXNlIGNvbm5lY3Rpb24gaGFuZGxlIGluIHRoZSBwb29sIGlzIGFzc2lnbmVkIGEgbnVtYmVyIDEuLk4sIHdoZXJlIE4gaXMgdGhlCisgICAgICogc2l6ZSBvZiB0aGUgY29ubmVjdGlvbiBwb29sLgorICAgICAqIFRoZSBtYWluIGNvbm5lY3Rpb24gaGFuZGxlIHRvIHdoaWNoIHRoZSBwb29sIGlzIGF0dGFjaGVkIGlzIGFzc2lnbmVkIGEgdmFsdWUgb2YgMC4KKyAgICAgKi8KKyAgICAvKiBwYWNrYWdlICovIGZpbmFsIHNob3J0IG1Db25uZWN0aW9uTnVtOworCisgICAgLyoqIG9uIHBvb2xlZCBkYXRhYmFzZSBjb25uZWN0aW9ucywgdGhpcyBtZW1iZXIgcG9pbnRzIHRvIHRoZSBwYXJlbnQgKCA9IG1haW4pCisgICAgICogZGF0YWJhc2UgY29ubmVjdGlvbiBoYW5kbGUuCisgICAgICogcGFja2FnZSB2aXNpYmlsaXR5IG9ubHkgZm9yIHRlc3RpbmcgcHVycG9zZXMKKyAgICAgKi8KKyAgICAvKiBwYWNrYWdlICovIFNRTGl0ZURhdGFiYXNlIG1QYXJlbnRDb25uT2JqID0gbnVsbDsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRU1PUllfREJfUEFUSCA9ICI6bWVtb3J5OiI7CisKKyAgICAvKiogc3RvcmVzIHJlZmVyZW5jZSB0byBhbGwgZGF0YWJhc2VzIG9wZW5lZCBpbiB0aGUgY3VycmVudCBwcm9jZXNzLiAqLworICAgIHByaXZhdGUgc3RhdGljIEFycmF5TGlzdDxXZWFrUmVmZXJlbmNlPFNRTGl0ZURhdGFiYXNlPj4gbUFjdGl2ZURhdGFiYXNlcyA9CisgICAgICAgICAgICBuZXcgQXJyYXlMaXN0PFdlYWtSZWZlcmVuY2U8U1FMaXRlRGF0YWJhc2U+PigpOworCisgICAgc3luY2hyb25pemVkIHZvaWQgYWRkU1FMaXRlQ2xvc2FibGUoU1FMaXRlQ2xvc2FibGUgY2xvc2FibGUpIHsKKyAgICAgICAgLy8gbVByb2dyYW1zIGlzIHBlciBpbnN0YW5jZSBvZiBTUUxpdGVEYXRhYmFzZSBhbmQgaXQgZG9lc24ndCBhY3R1YWxseSB0b3VjaCB0aGUgZGF0YWJhc2UKKyAgICAgICAgLy8gaXRzZWxmLiBzbywgdGhlcmUgaXMgbm8gbmVlZCB0byBsb2NrKCkuCisgICAgICAgIG1Qcm9ncmFtcy5wdXQoY2xvc2FibGUsIG51bGwpOwogICAgIH0KIAotICAgIHZvaWQgcmVtb3ZlU1FMaXRlQ2xvc2FibGUoU1FMaXRlQ2xvc2FibGUgY2xvc2FibGUpIHsKLSAgICAgICAgbG9jaygpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgbVByb2dyYW1zLnJlbW92ZShjbG9zYWJsZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICB1bmxvY2soKTsKLSAgICAgICAgfQorICAgIHN5bmNocm9uaXplZCB2b2lkIHJlbW92ZVNRTGl0ZUNsb3NhYmxlKFNRTGl0ZUNsb3NhYmxlIGNsb3NhYmxlKSB7CisgICAgICAgIG1Qcm9ncmFtcy5yZW1vdmUoY2xvc2FibGUpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIG9uQWxsUmVmZXJlbmNlc1JlbGVhc2VkKCkgewogICAgICAgICBpZiAoaXNPcGVuKCkpIHsKLSAgICAgICAgICAgIGlmIChTUUxpdGVEZWJ1Zy5ERUJVR19TUUxfQ0FDSEUpIHsKLSAgICAgICAgICAgICAgICBtVGltZUNsb3NlZCA9IGdldFRpbWUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRiY2xvc2UoKTsKKyAgICAgICAgICAgIC8vIGNsb3NlIHRoZSBkYXRhYmFzZSB3aGljaCB3aWxsIGNsb3NlIGFsbCBwZW5kaW5nIHN0YXRlbWVudHMgdG8gYmUgZmluYWxpemVkIGFsc28KKyAgICAgICAgICAgIGNsb3NlKCk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTM1MCwxOSArMzk4LDggQEAKICAgICBwcml2YXRlIGJvb2xlYW4gbUxvY2tpbmdFbmFibGVkID0gdHJ1ZTsKIAogICAgIC8qIHBhY2thZ2UgKi8gdm9pZCBvbkNvcnJ1cHRpb24oKSB7Ci0gICAgICAgIExvZy5lKFRBRywgIlJlbW92aW5nIGNvcnJ1cHQgZGF0YWJhc2U6ICIgKyBtUGF0aCk7CiAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRVZFTlRfREJfQ09SUlVQVCwgbVBhdGgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gQ2xvc2UgdGhlIGRhdGFiYXNlIChpZiB3ZSBjYW4pLCB3aGljaCB3aWxsIGNhdXNlIHN1YnNlcXVlbnQgb3BlcmF0aW9ucyB0byBmYWlsLgotICAgICAgICAgICAgY2xvc2UoKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIC8vIERlbGV0ZSB0aGUgY29ycnVwdCBmaWxlLiAgRG9uJ3QgcmUtY3JlYXRlIGl0IG5vdyAtLSB0aGF0IHdvdWxkIGp1c3QgY29uZnVzZSBwZW9wbGUKLSAgICAgICAgICAgIC8vIC0tIGJ1dCB0aGUgbmV4dCB0aW1lIHNvbWVvbmUgdHJpZXMgdG8gb3BlbiBpdCwgdGhleSBjYW4gc2V0IGl0IHVwIGZyb20gc2NyYXRjaC4KLSAgICAgICAgICAgIGlmICghbVBhdGguZXF1YWxzSWdub3JlQ2FzZSgiOm1lbW9yeSIpKSB7Ci0gICAgICAgICAgICAgICAgLy8gZGVsZXRlIGlzIG9ubHkgZm9yIG5vbi1tZW1vcnkgZGF0YWJhc2UgZmlsZXMKLSAgICAgICAgICAgICAgICBuZXcgRmlsZShtUGF0aCkuZGVsZXRlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICAgICAgbUVycm9ySGFuZGxlci5vbkNvcnJ1cHRpb24odGhpcyk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0zNzQsNiArNDExLDcgQEAKICAgICAgKiBAc2VlICN1bmxvY2soKQogICAgICAqLwogICAgIC8qIHBhY2thZ2UgKi8gdm9pZCBsb2NrKCkgeworICAgICAgICB2ZXJpZnlEYklzT3BlbigpOwogICAgICAgICBpZiAoIW1Mb2NraW5nRW5hYmxlZCkgcmV0dXJuOwogICAgICAgICBtTG9jay5sb2NrKCk7CiAgICAgICAgIGlmIChTUUxpdGVEZWJ1Zy5ERUJVR19MT0NLX1RJTUVfVFJBQ0tJTkcpIHsKQEAgLTM5NCw2ICs0MzIsNyBAQAogICAgICAqIEBzZWUgI3VubG9ja0ZvcmNlZCgpCiAgICAgICovCiAgICAgcHJpdmF0ZSB2b2lkIGxvY2tGb3JjZWQoKSB7CisgICAgICAgIHZlcmlmeURiSXNPcGVuKCk7CiAgICAgICAgIG1Mb2NrLmxvY2soKTsKICAgICAgICAgaWYgKFNRTGl0ZURlYnVnLkRFQlVHX0xPQ0tfVElNRV9UUkFDS0lORykgewogICAgICAgICAgICAgaWYgKG1Mb2NrLmdldEhvbGRDb3VudCgpID09IDEpIHsKQEAgLTQ2MCwxMSArNDk5LDE0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQmVnaW5zIGEgdHJhbnNhY3Rpb24uIFRyYW5zYWN0aW9ucyBjYW4gYmUgbmVzdGVkLiBXaGVuIHRoZSBvdXRlciB0cmFuc2FjdGlvbiBpcyBlbmRlZCBhbGwgb2YKKyAgICAgKiBCZWdpbnMgYSB0cmFuc2FjdGlvbiBpbiBFWENMVVNJVkUgbW9kZS4KKyAgICAgKiA8cD4KKyAgICAgKiBUcmFuc2FjdGlvbnMgY2FuIGJlIG5lc3RlZC4KKyAgICAgKiBXaGVuIHRoZSBvdXRlciB0cmFuc2FjdGlvbiBpcyBlbmRlZCBhbGwgb2YKICAgICAgKiB0aGUgd29yayBkb25lIGluIHRoYXQgdHJhbnNhY3Rpb24gYW5kIGFsbCBvZiB0aGUgbmVzdGVkIHRyYW5zYWN0aW9ucyB3aWxsIGJlIGNvbW1pdHRlZCBvcgogICAgICAqIHJvbGxlZCBiYWNrLiBUaGUgY2hhbmdlcyB3aWxsIGJlIHJvbGxlZCBiYWNrIGlmIGFueSB0cmFuc2FjdGlvbiBpcyBlbmRlZCB3aXRob3V0IGJlaW5nCiAgICAgICogbWFya2VkIGFzIGNsZWFuIChieSBjYWxsaW5nIHNldFRyYW5zYWN0aW9uU3VjY2Vzc2Z1bCkuIE90aGVyd2lzZSB0aGV5IHdpbGwgYmUgY29tbWl0dGVkLgotICAgICAqCisgICAgICogPC9wPgogICAgICAqIDxwPkhlcmUgaXMgdGhlIHN0YW5kYXJkIGlkaW9tIGZvciB0cmFuc2FjdGlvbnM6CiAgICAgICoKICAgICAgKiA8cHJlPgpAQCAtNDc4LDE1ICs1MjAsNDIgQEAKICAgICAgKiA8L3ByZT4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBiZWdpblRyYW5zYWN0aW9uKCkgewotICAgICAgICBiZWdpblRyYW5zYWN0aW9uV2l0aExpc3RlbmVyKG51bGwgLyogdHJhbnNhY3Rpb25TdGF0dXNDYWxsYmFjayAqLyk7CisgICAgICAgIGJlZ2luVHJhbnNhY3Rpb24obnVsbCAvKiB0cmFuc2FjdGlvblN0YXR1c0NhbGxiYWNrICovLCB0cnVlKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBCZWdpbnMgYSB0cmFuc2FjdGlvbi4gVHJhbnNhY3Rpb25zIGNhbiBiZSBuZXN0ZWQuIFdoZW4gdGhlIG91dGVyIHRyYW5zYWN0aW9uIGlzIGVuZGVkIGFsbCBvZgorICAgICAqIEJlZ2lucyBhIHRyYW5zYWN0aW9uIGluIElNTUVESUFURSBtb2RlLiBUcmFuc2FjdGlvbnMgY2FuIGJlIG5lc3RlZC4gV2hlbgorICAgICAqIHRoZSBvdXRlciB0cmFuc2FjdGlvbiBpcyBlbmRlZCBhbGwgb2YgdGhlIHdvcmsgZG9uZSBpbiB0aGF0IHRyYW5zYWN0aW9uCisgICAgICogYW5kIGFsbCBvZiB0aGUgbmVzdGVkIHRyYW5zYWN0aW9ucyB3aWxsIGJlIGNvbW1pdHRlZCBvciByb2xsZWQgYmFjay4gVGhlCisgICAgICogY2hhbmdlcyB3aWxsIGJlIHJvbGxlZCBiYWNrIGlmIGFueSB0cmFuc2FjdGlvbiBpcyBlbmRlZCB3aXRob3V0IGJlaW5nCisgICAgICogbWFya2VkIGFzIGNsZWFuIChieSBjYWxsaW5nIHNldFRyYW5zYWN0aW9uU3VjY2Vzc2Z1bCkuIE90aGVyd2lzZSB0aGV5CisgICAgICogd2lsbCBiZSBjb21taXR0ZWQuCisgICAgICogPHA+CisgICAgICogSGVyZSBpcyB0aGUgc3RhbmRhcmQgaWRpb20gZm9yIHRyYW5zYWN0aW9uczoKKyAgICAgKgorICAgICAqIDxwcmU+CisgICAgICogICBkYi5iZWdpblRyYW5zYWN0aW9uTm9uRXhjbHVzaXZlKCk7CisgICAgICogICB0cnkgeworICAgICAqICAgICAuLi4KKyAgICAgKiAgICAgZGIuc2V0VHJhbnNhY3Rpb25TdWNjZXNzZnVsKCk7CisgICAgICogICB9IGZpbmFsbHkgeworICAgICAqICAgICBkYi5lbmRUcmFuc2FjdGlvbigpOworICAgICAqICAgfQorICAgICAqIDwvcHJlPgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGJlZ2luVHJhbnNhY3Rpb25Ob25FeGNsdXNpdmUoKSB7CisgICAgICAgIGJlZ2luVHJhbnNhY3Rpb24obnVsbCAvKiB0cmFuc2FjdGlvblN0YXR1c0NhbGxiYWNrICovLCBmYWxzZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQmVnaW5zIGEgdHJhbnNhY3Rpb24gaW4gRVhDTFVTSVZFIG1vZGUuCisgICAgICogPHA+CisgICAgICogVHJhbnNhY3Rpb25zIGNhbiBiZSBuZXN0ZWQuCisgICAgICogV2hlbiB0aGUgb3V0ZXIgdHJhbnNhY3Rpb24gaXMgZW5kZWQgYWxsIG9mCiAgICAgICogdGhlIHdvcmsgZG9uZSBpbiB0aGF0IHRyYW5zYWN0aW9uIGFuZCBhbGwgb2YgdGhlIG5lc3RlZCB0cmFuc2FjdGlvbnMgd2lsbCBiZSBjb21taXR0ZWQgb3IKICAgICAgKiByb2xsZWQgYmFjay4gVGhlIGNoYW5nZXMgd2lsbCBiZSByb2xsZWQgYmFjayBpZiBhbnkgdHJhbnNhY3Rpb24gaXMgZW5kZWQgd2l0aG91dCBiZWluZwogICAgICAqIG1hcmtlZCBhcyBjbGVhbiAoYnkgY2FsbGluZyBzZXRUcmFuc2FjdGlvblN1Y2Nlc3NmdWwpLiBPdGhlcndpc2UgdGhleSB3aWxsIGJlIGNvbW1pdHRlZC4KLSAgICAgKgorICAgICAqIDwvcD4KICAgICAgKiA8cD5IZXJlIGlzIHRoZSBzdGFuZGFyZCBpZGlvbSBmb3IgdHJhbnNhY3Rpb25zOgogICAgICAqCiAgICAgICogPHByZT4KQEAgLTQ5OCwxNSArNTY3LDQ4IEBACiAgICAgICogICAgIGRiLmVuZFRyYW5zYWN0aW9uKCk7CiAgICAgICogICB9CiAgICAgICogPC9wcmU+CisgICAgICoKICAgICAgKiBAcGFyYW0gdHJhbnNhY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciB0aGF0IHNob3VsZCBiZSBub3RpZmllZCB3aGVuIHRoZSB0cmFuc2FjdGlvbiBiZWdpbnMsCiAgICAgICogY29tbWl0cywgb3IgaXMgcm9sbGVkIGJhY2ssIGVpdGhlciBleHBsaWNpdGx5IG9yIGJ5IGEgY2FsbCB0bwogICAgICAqIHtAbGluayAjeWllbGRJZkNvbnRlbmRlZFNhZmVseX0uCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYmVnaW5UcmFuc2FjdGlvbldpdGhMaXN0ZW5lcihTUUxpdGVUcmFuc2FjdGlvbkxpc3RlbmVyIHRyYW5zYWN0aW9uTGlzdGVuZXIpIHsKKyAgICAgICAgYmVnaW5UcmFuc2FjdGlvbih0cmFuc2FjdGlvbkxpc3RlbmVyLCB0cnVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCZWdpbnMgYSB0cmFuc2FjdGlvbiBpbiBJTU1FRElBVEUgbW9kZS4gVHJhbnNhY3Rpb25zIGNhbiBiZSBuZXN0ZWQuIFdoZW4KKyAgICAgKiB0aGUgb3V0ZXIgdHJhbnNhY3Rpb24gaXMgZW5kZWQgYWxsIG9mIHRoZSB3b3JrIGRvbmUgaW4gdGhhdCB0cmFuc2FjdGlvbgorICAgICAqIGFuZCBhbGwgb2YgdGhlIG5lc3RlZCB0cmFuc2FjdGlvbnMgd2lsbCBiZSBjb21taXR0ZWQgb3Igcm9sbGVkIGJhY2suIFRoZQorICAgICAqIGNoYW5nZXMgd2lsbCBiZSByb2xsZWQgYmFjayBpZiBhbnkgdHJhbnNhY3Rpb24gaXMgZW5kZWQgd2l0aG91dCBiZWluZworICAgICAqIG1hcmtlZCBhcyBjbGVhbiAoYnkgY2FsbGluZyBzZXRUcmFuc2FjdGlvblN1Y2Nlc3NmdWwpLiBPdGhlcndpc2UgdGhleQorICAgICAqIHdpbGwgYmUgY29tbWl0dGVkLgorICAgICAqIDxwPgorICAgICAqIEhlcmUgaXMgdGhlIHN0YW5kYXJkIGlkaW9tIGZvciB0cmFuc2FjdGlvbnM6CisgICAgICoKKyAgICAgKiA8cHJlPgorICAgICAqICAgZGIuYmVnaW5UcmFuc2FjdGlvbldpdGhMaXN0ZW5lck5vbkV4Y2x1c2l2ZShsaXN0ZW5lcik7CisgICAgICogICB0cnkgeworICAgICAqICAgICAuLi4KKyAgICAgKiAgICAgZGIuc2V0VHJhbnNhY3Rpb25TdWNjZXNzZnVsKCk7CisgICAgICogICB9IGZpbmFsbHkgeworICAgICAqICAgICBkYi5lbmRUcmFuc2FjdGlvbigpOworICAgICAqICAgfQorICAgICAqIDwvcHJlPgorICAgICAqCisgICAgICogQHBhcmFtIHRyYW5zYWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgdGhhdCBzaG91bGQgYmUgbm90aWZpZWQgd2hlbiB0aGUKKyAgICAgKiAgICAgICAgICAgIHRyYW5zYWN0aW9uIGJlZ2lucywgY29tbWl0cywgb3IgaXMgcm9sbGVkIGJhY2ssIGVpdGhlcgorICAgICAqICAgICAgICAgICAgZXhwbGljaXRseSBvciBieSBhIGNhbGwgdG8ge0BsaW5rICN5aWVsZElmQ29udGVuZGVkU2FmZWx5fS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBiZWdpblRyYW5zYWN0aW9uV2l0aExpc3RlbmVyTm9uRXhjbHVzaXZlKAorICAgICAgICAgICAgU1FMaXRlVHJhbnNhY3Rpb25MaXN0ZW5lciB0cmFuc2FjdGlvbkxpc3RlbmVyKSB7CisgICAgICAgIGJlZ2luVHJhbnNhY3Rpb24odHJhbnNhY3Rpb25MaXN0ZW5lciwgZmFsc2UpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBiZWdpblRyYW5zYWN0aW9uKFNRTGl0ZVRyYW5zYWN0aW9uTGlzdGVuZXIgdHJhbnNhY3Rpb25MaXN0ZW5lciwKKyAgICAgICAgICAgIGJvb2xlYW4gZXhjbHVzaXZlKSB7CisgICAgICAgIHZlcmlmeURiSXNPcGVuKCk7CiAgICAgICAgIGxvY2tGb3JjZWQoKTsKLSAgICAgICAgaWYgKCFpc09wZW4oKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZGF0YWJhc2Ugbm90IG9wZW4iKTsKLSAgICAgICAgfQogICAgICAgICBib29sZWFuIG9rID0gZmFsc2U7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAvLyBJZiB0aGlzIHRocmVhZCBhbHJlYWR5IGhhZCB0aGUgbG9jayB0aGVuIGdldCBvdXQKQEAgLTUyNCw3ICs2MjYsMTEgQEAKIAogICAgICAgICAgICAgLy8gVGhpcyB0aHJlYWQgZGlkbid0IGFscmVhZHkgaGF2ZSB0aGUgbG9jaywgc28gYmVnaW4gYSBkYXRhYmFzZQogICAgICAgICAgICAgLy8gdHJhbnNhY3Rpb24gbm93LgotICAgICAgICAgICAgZXhlY1NRTCgiQkVHSU4gRVhDTFVTSVZFOyIpOworICAgICAgICAgICAgaWYgKGV4Y2x1c2l2ZSAmJiBtQ29ubmVjdGlvblBvb2wgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGV4ZWNTUUwoIkJFR0lOIEVYQ0xVU0lWRTsiKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZXhlY1NRTCgiQkVHSU4gSU1NRURJQVRFOyIpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgbVRyYW5zYWN0aW9uTGlzdGVuZXIgPSB0cmFuc2FjdGlvbkxpc3RlbmVyOwogICAgICAgICAgICAgbVRyYW5zYWN0aW9uSXNTdWNjZXNzZnVsID0gdHJ1ZTsKICAgICAgICAgICAgIG1Jbm5lclRyYW5zYWN0aW9uSXNTdWNjZXNzZnVsID0gZmFsc2U7CkBAIC01NTEsMTIgKzY1Nyw3IEBACiAgICAgICogYXJlIGNvbW1pdHRlZCBhbmQgcm9sbGVkIGJhY2suCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgZW5kVHJhbnNhY3Rpb24oKSB7Ci0gICAgICAgIGlmICghaXNPcGVuKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImRhdGFiYXNlIG5vdCBvcGVuIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFtTG9jay5pc0hlbGRCeUN1cnJlbnRUaHJlYWQoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigibm8gdHJhbnNhY3Rpb24gcGVuZGluZyIpOwotICAgICAgICB9CisgICAgICAgIHZlcmlmeUxvY2tPd25lcigpOwogICAgICAgICB0cnkgewogICAgICAgICAgICAgaWYgKG1Jbm5lclRyYW5zYWN0aW9uSXNTdWNjZXNzZnVsKSB7CiAgICAgICAgICAgICAgICAgbUlubmVyVHJhbnNhY3Rpb25Jc1N1Y2Nlc3NmdWwgPSBmYWxzZTsKQEAgLTU4MSw2ICs2ODIsMTggQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChtVHJhbnNhY3Rpb25Jc1N1Y2Nlc3NmdWwpIHsKICAgICAgICAgICAgICAgICBleGVjU1FMKENPTU1JVF9TUUwpOworICAgICAgICAgICAgICAgIC8vIGlmIHdyaXRlLWFoZWFkIGxvZ2dpbmcgaXMgdXNlZCwgd2UgaGF2ZSB0byB0YWtlIGNhcmUgb2YgY2hlY2twb2ludC4KKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBzaG91bGQgYXBwbGljYXRpb25zIGJlIGdpdmVuIHRoZSBmbGV4aWJpbGl0eSBvZiBjaG9vc2luZyB3aGVuIHRvCisgICAgICAgICAgICAgICAgLy8gdHJpZ2dlciBjaGVja3BvaW50PworICAgICAgICAgICAgICAgIC8vIGZvciBub3csIGRvIGNoZWNrcG9pbnQgYWZ0ZXIgZXZlcnkgQ09NTUlUIGJlY2F1c2UgdGhhdCBpcyB0aGUgZmFzdGVzdAorICAgICAgICAgICAgICAgIC8vIHdheSB0byBndWFyYW50ZWUgdGhhdCByZWFkZXJzIHdpbGwgc2VlIGxhdGVzdCBkYXRhLgorICAgICAgICAgICAgICAgIC8vIGJ1dCB0aGlzIGlzIHRoZSBzbG93ZXN0IHdheSB0byBydW4gc3FsaXRlIHdpdGggaW4gd3JpdGUtYWhlYWQgbG9nZ2luZyBtb2RlLgorICAgICAgICAgICAgICAgIGlmICh0aGlzLm1Db25uZWN0aW9uUG9vbCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGV4ZWNTUUwoIlBSQUdNQSB3YWxfY2hlY2twb2ludDsiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKFNRTGl0ZURlYnVnLkRFQlVHX1NRTF9TVEFURU1FTlRTKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJQUkFHTUEgd2FsX0NoZWNrcG9pbnQgZG9uZSIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICBleGVjU1FMKCJST0xMQkFDSzsiKTsKQEAgLTYxNCw5ICs3MjcsNyBAQAogICAgICAqIHRyYW5zYWN0aW9uIGlzIGFscmVhZHkgbWFya2VkIGFzIHN1Y2Nlc3NmdWwuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0VHJhbnNhY3Rpb25TdWNjZXNzZnVsKCkgewotICAgICAgICBpZiAoIWlzT3BlbigpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJkYXRhYmFzZSBub3Qgb3BlbiIpOwotICAgICAgICB9CisgICAgICAgIHZlcmlmeURiSXNPcGVuKCk7CiAgICAgICAgIGlmICghbUxvY2suaXNIZWxkQnlDdXJyZW50VGhyZWFkKCkpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIm5vIHRyYW5zYWN0aW9uIHBlbmRpbmciKTsKICAgICAgICAgfQpAQCAtNjMxLDcgKzc0Miw1MCBAQAogICAgICAqIHJldHVybiB0cnVlIGlmIHRoZXJlIGlzIGEgdHJhbnNhY3Rpb24gcGVuZGluZwogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGluVHJhbnNhY3Rpb24oKSB7Ci0gICAgICAgIHJldHVybiBtTG9jay5nZXRIb2xkQ291bnQoKSA+IDA7CisgICAgICAgIHJldHVybiBtTG9jay5nZXRIb2xkQ291bnQoKSA+IDAgfHwgbVRyYW5zYWN0aW9uVXNpbmdFeGVjU3FsOworICAgIH0KKworICAgIC8qIHBhY2thZ2UgKi8gc3luY2hyb25pemVkIHZvaWQgc2V0VHJhbnNhY3Rpb25Vc2luZ0V4ZWNTcWxGbGFnKCkgeworICAgICAgICBpZiAoTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuREVCVUcpKSB7CisgICAgICAgICAgICBMb2cuaShUQUcsICJmb3VuZCBleGVjU1FMKCdiZWdpbiB0cmFuc2FjdGlvbicpIik7CisgICAgICAgIH0KKyAgICAgICAgbVRyYW5zYWN0aW9uVXNpbmdFeGVjU3FsID0gdHJ1ZTsKKyAgICB9CisKKyAgICAvKiBwYWNrYWdlICovIHN5bmNocm9uaXplZCB2b2lkIHJlc2V0VHJhbnNhY3Rpb25Vc2luZ0V4ZWNTcWxGbGFnKCkgeworICAgICAgICBpZiAoTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuREVCVUcpKSB7CisgICAgICAgICAgICBpZiAobVRyYW5zYWN0aW9uVXNpbmdFeGVjU3FsKSB7CisgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiZm91bmQgZXhlY1NRTCgnY29tbWl0IG9yIGVuZCBvciByb2xsYmFjaycpIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbVRyYW5zYWN0aW9uVXNpbmdFeGVjU3FsID0gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBjYWxsZXIgaXMgY29uc2lkZXJlZCBwYXJ0IG9mIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uLCBpZiBhbnkuCisgICAgICogPHA+CisgICAgICogQ2FsbGVyIGlzIHBhcnQgb2YgdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24gaWYgZWl0aGVyIG9mIHRoZSBmb2xsb3dpbmcgaXMgdHJ1ZQorICAgICAqIDxvbD4KKyAgICAgKiAgIDxsaT5JZiB0cmFuc2FjdGlvbiBpcyBzdGFydGVkIGJ5IGNhbGxpbmcgYmVnaW5UcmFuc2FjdGlvbigpIG1ldGhvZHMgQU5EIGlmIHRoZSBjYWxsZXIgaXMKKyAgICAgKiAgIGluIHRoZSBzYW1lIHRocmVhZCBhcyB0aGUgdGhyZWFkIHRoYXQgc3RhcnRlZCB0aGUgdHJhbnNhY3Rpb24uCisgICAgICogICA8L2xpPgorICAgICAqICAgPGxpPklmIHRoZSB0cmFuc2FjdGlvbiBpcyBzdGFydGVkIGJ5IGNhbGxpbmcge0BsaW5rICNleGVjU1FMKFN0cmluZyl9IGxpa2UgdGhpczoKKyAgICAgKiAgIGV4ZWNTUUwoIkJFR0lOIHRyYW5zYWN0aW9uIikuIEluIHRoaXMgY2FzZSwgZXZlcnkgdGhyZWFkIGluIHRoZSBwcm9jZXNzIGlzIGNvbnNpZGVyZWQKKyAgICAgKiAgIHBhcnQgb2YgdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24uPC9saT4KKyAgICAgKiA8L29sPgorICAgICAqCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBjYWxsZXIgaXMgY29uc2lkZXJlZCBwYXJ0IG9mIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uLCBpZiBhbnkuCisgICAgICovCisgICAgLyogcGFja2FnZSAqLyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBhbUlJblRyYW5zYWN0aW9uKCkgeworICAgICAgICAvLyBhbHdheXMgZG8gdGhpcyB0ZXN0IG9uIHRoZSBtYWluIGRhdGFiYXNlIGNvbm5lY3Rpb24gLSBOT1Qgb24gcG9vbGVkIGRhdGFiYXNlIGNvbm5lY3Rpb24KKyAgICAgICAgLy8gc2luY2UgdHJhbnNhY3Rpb25zIGFsd2F5cyBvY2N1ciBvbiB0aGUgbWFpbiBkYXRhYmFzZSBjb25uZWN0aW9ucyBvbmx5LgorICAgICAgICBTUUxpdGVEYXRhYmFzZSBkYiA9IChpc1Bvb2xlZENvbm5lY3Rpb24oKSkgPyBtUGFyZW50Q29ubk9iaiA6IHRoaXM7CisgICAgICAgIGJvb2xlYW4gYiA9ICghZGIuaW5UcmFuc2FjdGlvbigpKSA/IGZhbHNlIDoKKyAgICAgICAgICAgICAgICBkYi5tVHJhbnNhY3Rpb25Vc2luZ0V4ZWNTcWwgfHwgZGIubUxvY2suaXNIZWxkQnlDdXJyZW50VGhyZWFkKCk7CisgICAgICAgIGlmIChMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5ERUJVRykpIHsKKyAgICAgICAgICAgIExvZy5pKFRBRywgImFtSWluVHJhbnNhY3Rpb246ICIgKyBiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYjsKICAgICB9CiAKICAgICAvKioKQEAgLTczNSw1NCArODg5LDEyIEBACiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAotICAgIC8qKiBNYXBzIHRhYmxlIG5hbWVzIHRvIGluZm8gYWJvdXQgd2hhdCB0byB3aGljaCBfc3luY190aW1lIGNvbHVtbiB0byBzZXQKLSAgICAgKiB0byBOVUxMIG9uIGFuIHVwZGF0ZS4gVGhpcyBpcyB1c2VkIHRvIHN1cHBvcnQgc3luY2luZy4gKi8KLSAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIFN5bmNVcGRhdGVJbmZvPiBtU3luY1VwZGF0ZUluZm8gPQotICAgICAgICAgICAgbmV3IEhhc2hNYXA8U3RyaW5nLCBTeW5jVXBkYXRlSW5mbz4oKTsKLQotICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IGdldFN5bmNlZFRhYmxlcygpIHsKLSAgICAgICAgc3luY2hyb25pemVkKG1TeW5jVXBkYXRlSW5mbykgewotICAgICAgICAgICAgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gdGFibGVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0gICAgICAgICAgICBmb3IgKFN0cmluZyB0YWJsZSA6IG1TeW5jVXBkYXRlSW5mby5rZXlTZXQoKSkgewotICAgICAgICAgICAgICAgIFN5bmNVcGRhdGVJbmZvIGluZm8gPSBtU3luY1VwZGF0ZUluZm8uZ2V0KHRhYmxlKTsKLSAgICAgICAgICAgICAgICBpZiAoaW5mby5kZWxldGVkVGFibGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0YWJsZXMucHV0KHRhYmxlLCBpbmZvLmRlbGV0ZWRUYWJsZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHRhYmxlczsKLSAgICAgICAgfQotICAgIH0KLQogICAgIC8qKgotICAgICAqIEludGVybmFsIGNsYXNzIHVzZWQgdG8ga2VlcCB0cmFjayB3aGF0IG5lZWRzIHRvIGJlIG1hcmtlZCBhcyBjaGFuZ2VkCi0gICAgICogd2hlbiBhbiB1cGRhdGUgb2NjdXJzLiBUaGlzIGlzIHVzZWQgZm9yIHN5bmNpbmcsIHNvIHRoZSBzeW5jIGVuZ2luZQotICAgICAqIGtub3dzIHdoYXQgZGF0YSBoYXMgYmVlbiB1cGRhdGVkIGxvY2FsbHkuCisgICAgICogQGRlcHJlY2F0ZWQgVGhpcyBtZXRob2Qgbm8gbG9uZ2VyIHNlcnZlcyBhbnkgdXNlZnVsIHB1cnBvc2UgYW5kIGhhcyBiZWVuIGRlcHJlY2F0ZWQuCiAgICAgICovCi0gICAgc3RhdGljIHByaXZhdGUgY2xhc3MgU3luY1VwZGF0ZUluZm8gewotICAgICAgICAvKioKLSAgICAgICAgICogQ3JlYXRlcyB0aGUgU3luY1VwZGF0ZUluZm8gY2xhc3MuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBtYXN0ZXJUYWJsZSBUaGUgdGFibGUgdG8gc2V0IF9zeW5jX3RpbWUgdG8gTlVMTCBpbgotICAgICAgICAgKiBAcGFyYW0gZGVsZXRlZFRhYmxlIFRoZSBkZWxldGVkIHRhYmxlIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlCi0gICAgICAgICAqICAgICAgICAgIG1hc3RlciB0YWJsZQotICAgICAgICAgKiBAcGFyYW0gZm9yZWlnbktleSBUaGUga2V5IHRoYXQgcmVmZXJzIHRvIHRoZSBwcmltYXJ5IGtleSBpbiB0YWJsZQotICAgICAgICAgKi8KLSAgICAgICAgU3luY1VwZGF0ZUluZm8oU3RyaW5nIG1hc3RlclRhYmxlLCBTdHJpbmcgZGVsZXRlZFRhYmxlLAotICAgICAgICAgICAgICAgIFN0cmluZyBmb3JlaWduS2V5KSB7Ci0gICAgICAgICAgICB0aGlzLm1hc3RlclRhYmxlID0gbWFzdGVyVGFibGU7Ci0gICAgICAgICAgICB0aGlzLmRlbGV0ZWRUYWJsZSA9IGRlbGV0ZWRUYWJsZTsKLSAgICAgICAgICAgIHRoaXMuZm9yZWlnbktleSA9IGZvcmVpZ25LZXk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiogVGhlIHRhYmxlIGNvbnRhaW5pbmcgdGhlIF9zeW5jX3RpbWUgY29sdW1uICovCi0gICAgICAgIFN0cmluZyBtYXN0ZXJUYWJsZTsKLQotICAgICAgICAvKiogVGhlIGRlbGV0ZWQgdGFibGUgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgbWFzdGVyIHRhYmxlICovCi0gICAgICAgIFN0cmluZyBkZWxldGVkVGFibGU7Ci0KLSAgICAgICAgLyoqIFRoZSBrZXkgaW4gdGhlIGxvY2FsIHRhYmxlIHRoZSByb3cgaW4gdGFibGUuIEl0IG1heSBiZSBfaWQsIGlmIHRhYmxlCi0gICAgICAgICAqIGlzIHRoZSBsb2NhbCB0YWJsZS4gKi8KLSAgICAgICAgU3RyaW5nIGZvcmVpZ25LZXk7CisgICAgQERlcHJlY2F0ZWQKKyAgICBwdWJsaWMgTWFwPFN0cmluZywgU3RyaW5nPiBnZXRTeW5jZWRUYWJsZXMoKSB7CisgICAgICAgIHJldHVybiBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oMCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC04MTQsMzAgKzkyNiw4MCBAQAogICAgICAqIEB0aHJvd3MgU1FMaXRlRXhjZXB0aW9uIGlmIHRoZSBkYXRhYmFzZSBjYW5ub3QgYmUgb3BlbmVkCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBTUUxpdGVEYXRhYmFzZSBvcGVuRGF0YWJhc2UoU3RyaW5nIHBhdGgsIEN1cnNvckZhY3RvcnkgZmFjdG9yeSwgaW50IGZsYWdzKSB7Ci0gICAgICAgIFNRTGl0ZURhdGFiYXNlIHNxbGl0ZURhdGFiYXNlID0gbnVsbDsKKyAgICAgICAgcmV0dXJuIG9wZW5EYXRhYmFzZShwYXRoLCBmYWN0b3J5LCBmbGFncywgbmV3IERlZmF1bHREYXRhYmFzZUVycm9ySGFuZGxlcigpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPcGVuIHRoZSBkYXRhYmFzZSBhY2NvcmRpbmcgdG8gdGhlIGZsYWdzIHtAbGluayAjT1BFTl9SRUFEV1JJVEV9CisgICAgICoge0BsaW5rICNPUEVOX1JFQURPTkxZfSB7QGxpbmsgI0NSRUFURV9JRl9ORUNFU1NBUll9IGFuZC9vciB7QGxpbmsgI05PX0xPQ0FMSVpFRF9DT0xMQVRPUlN9LgorICAgICAqCisgICAgICogPHA+U2V0cyB0aGUgbG9jYWxlIG9mIHRoZSBkYXRhYmFzZSB0byB0aGUgIHRoZSBzeXN0ZW0ncyBjdXJyZW50IGxvY2FsZS4KKyAgICAgKiBDYWxsIHtAbGluayAjc2V0TG9jYWxlfSBpZiB5b3Ugd291bGQgbGlrZSBzb21ldGhpbmcgZWxzZS48L3A+CisgICAgICoKKyAgICAgKiA8cD5BY2NlcHRzIGlucHV0IHBhcmFtOiBhIGNvbmNyZXRlIGluc3RhbmNlIG9mIHtAbGluayBEYXRhYmFzZUVycm9ySGFuZGxlcn0gdG8gYmUKKyAgICAgKiB1c2VkIHRvIGhhbmRsZSBjb3JydXB0aW9uIHdoZW4gc3FsaXRlIHJlcG9ydHMgZGF0YWJhc2UgY29ycnVwdGlvbi48L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gcGF0aCB0byBkYXRhYmFzZSBmaWxlIHRvIG9wZW4gYW5kL29yIGNyZWF0ZQorICAgICAqIEBwYXJhbSBmYWN0b3J5IGFuIG9wdGlvbmFsIGZhY3RvcnkgY2xhc3MgdGhhdCBpcyBjYWxsZWQgdG8gaW5zdGFudGlhdGUgYQorICAgICAqICAgICAgICAgICAgY3Vyc29yIHdoZW4gcXVlcnkgaXMgY2FsbGVkLCBvciBudWxsIGZvciBkZWZhdWx0CisgICAgICogQHBhcmFtIGZsYWdzIHRvIGNvbnRyb2wgZGF0YWJhc2UgYWNjZXNzIG1vZGUKKyAgICAgKiBAcGFyYW0gZXJyb3JIYW5kbGVyIHRoZSB7QGxpbmsgRGF0YWJhc2VFcnJvckhhbmRsZXJ9IG9iaiB0byBiZSB1c2VkIHRvIGhhbmRsZSBjb3JydXB0aW9uCisgICAgICogd2hlbiBzcWxpdGUgcmVwb3J0cyBkYXRhYmFzZSBjb3JydXB0aW9uCisgICAgICogQHJldHVybiB0aGUgbmV3bHkgb3BlbmVkIGRhdGFiYXNlCisgICAgICogQHRocm93cyBTUUxpdGVFeGNlcHRpb24gaWYgdGhlIGRhdGFiYXNlIGNhbm5vdCBiZSBvcGVuZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFNRTGl0ZURhdGFiYXNlIG9wZW5EYXRhYmFzZShTdHJpbmcgcGF0aCwgQ3Vyc29yRmFjdG9yeSBmYWN0b3J5LCBpbnQgZmxhZ3MsCisgICAgICAgICAgICBEYXRhYmFzZUVycm9ySGFuZGxlciBlcnJvckhhbmRsZXIpIHsKKyAgICAgICAgU1FMaXRlRGF0YWJhc2Ugc3FsaXRlRGF0YWJhc2UgPSBvcGVuRGF0YWJhc2UocGF0aCwgZmFjdG9yeSwgZmxhZ3MsIGVycm9ySGFuZGxlciwKKyAgICAgICAgICAgICAgICAoc2hvcnQpIDAgLyogdGhlIG1haW4gY29ubmVjdGlvbiBoYW5kbGUgKi8pOworCisgICAgICAgIC8vIHNldCBzcWxpdGUgcGFnZXNpemUgdG8gbUJsb2NrU2l6ZQorICAgICAgICBpZiAoc0Jsb2NrU2l6ZSA9PSAwKSB7CisgICAgICAgICAgICAvLyBUT0RPOiAiL2RhdGEiIHNob3VsZCBiZSBhIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29uc3RhbnQgc29tZXdoZXJlLiBpdCBpcyBoYXJkY29kZWQKKyAgICAgICAgICAgIC8vIGluIHNldmVyYWwgcGxhY2VzIHJpZ2h0IG5vdy4KKyAgICAgICAgICAgIHNCbG9ja1NpemUgPSBuZXcgU3RhdEZzKCIvZGF0YSIpLmdldEJsb2NrU2l6ZSgpOworICAgICAgICB9CisgICAgICAgIHNxbGl0ZURhdGFiYXNlLnNldFBhZ2VTaXplKHNCbG9ja1NpemUpOworICAgICAgICAvL1NUT1BTSElQIC0gdW5jb21tZW50IHRoZSBmb2xsb3dpbmcgbGluZQorICAgICAgICAvL3NxbGl0ZURhdGFiYXNlLnNldEpvdXJuYWxNb2RlKHBhdGgsICJUUlVOQ0FURSIpOworICAgICAgICAvLyBTVE9QU0hJUCByZW1vdmUgdGhlIGZvbGxvd2luZyBsaW5lcworICAgICAgICBpZiAoIXBhdGguZXF1YWxzSWdub3JlQ2FzZShNRU1PUllfREJfUEFUSCkpIHsKKyAgICAgICAgICAgIHNxbGl0ZURhdGFiYXNlLmVuYWJsZVdyaXRlQWhlYWRMb2dnaW5nKCk7CisgICAgICAgIH0KKyAgICAgICAgLy8gRU5EIFNUT1BTSElQCisKKyAgICAgICAgLy8gYWRkIHRoaXMgZGF0YWJhc2UgdG8gdGhlIGxpc3Qgb2YgZGF0YWJhc2VzIG9wZW5lZCBpbiB0aGlzIHByb2Nlc3MKKyAgICAgICAgc3luY2hyb25pemVkKG1BY3RpdmVEYXRhYmFzZXMpIHsKKyAgICAgICAgICAgIG1BY3RpdmVEYXRhYmFzZXMuYWRkKG5ldyBXZWFrUmVmZXJlbmNlPFNRTGl0ZURhdGFiYXNlPihzcWxpdGVEYXRhYmFzZSkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzcWxpdGVEYXRhYmFzZTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTUUxpdGVEYXRhYmFzZSBvcGVuRGF0YWJhc2UoU3RyaW5nIHBhdGgsIEN1cnNvckZhY3RvcnkgZmFjdG9yeSwgaW50IGZsYWdzLAorICAgICAgICAgICAgRGF0YWJhc2VFcnJvckhhbmRsZXIgZXJyb3JIYW5kbGVyLCBzaG9ydCBjb25uZWN0aW9uTnVtKSB7CisgICAgICAgIFNRTGl0ZURhdGFiYXNlIGRiID0gbmV3IFNRTGl0ZURhdGFiYXNlKHBhdGgsIGZhY3RvcnksIGZsYWdzLCBlcnJvckhhbmRsZXIsIGNvbm5lY3Rpb25OdW0pOwogICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLkRFQlVHKSkgeworICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIm9wZW5pbmcgdGhlIGRiIDogIiArIHBhdGgpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gT3BlbiB0aGUgZGF0YWJhc2UuCi0gICAgICAgICAgICBzcWxpdGVEYXRhYmFzZSA9IG5ldyBTUUxpdGVEYXRhYmFzZShwYXRoLCBmYWN0b3J5LCBmbGFncyk7CisgICAgICAgICAgICBkYi5kYm9wZW4ocGF0aCwgZmxhZ3MpOworICAgICAgICAgICAgZGIuc2V0TG9jYWxlKExvY2FsZS5nZXREZWZhdWx0KCkpOwogICAgICAgICAgICAgaWYgKFNRTGl0ZURlYnVnLkRFQlVHX1NRTF9TVEFURU1FTlRTKSB7Ci0gICAgICAgICAgICAgICAgc3FsaXRlRGF0YWJhc2UuZW5hYmxlU3FsVHJhY2luZyhwYXRoKTsKKyAgICAgICAgICAgICAgICBkYi5lbmFibGVTcWxUcmFjaW5nKHBhdGgsIGNvbm5lY3Rpb25OdW0pOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKFNRTGl0ZURlYnVnLkRFQlVHX1NRTF9USU1FKSB7Ci0gICAgICAgICAgICAgICAgc3FsaXRlRGF0YWJhc2UuZW5hYmxlU3FsUHJvZmlsaW5nKHBhdGgpOworICAgICAgICAgICAgICAgIGRiLmVuYWJsZVNxbFByb2ZpbGluZyhwYXRoLCBjb25uZWN0aW9uTnVtKTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBkYjsKICAgICAgICAgfSBjYXRjaCAoU1FMaXRlRGF0YWJhc2VDb3JydXB0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIFRyeSB0byByZWNvdmVyIGZyb20gdGhpcywgaWYgd2UgY2FuLgotICAgICAgICAgICAgLy8gVE9ETzogc2hvdWxkIHdlIGRvIHRoaXMgZm9yIG90aGVyIG9wZW4gZmFpbHVyZXM/Ci0gICAgICAgICAgICBMb2cuZShUQUcsICJEZWxldGluZyBhbmQgcmUtY3JlYXRpbmcgY29ycnVwdCBkYXRhYmFzZSAiICsgcGF0aCwgZSk7Ci0gICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UX0RCX0NPUlJVUFQsIHBhdGgpOwotICAgICAgICAgICAgaWYgKCFwYXRoLmVxdWFsc0lnbm9yZUNhc2UoIjptZW1vcnkiKSkgewotICAgICAgICAgICAgICAgIC8vIGRlbGV0ZSBpcyBvbmx5IGZvciBub24tbWVtb3J5IGRhdGFiYXNlIGZpbGVzCi0gICAgICAgICAgICAgICAgbmV3IEZpbGUocGF0aCkuZGVsZXRlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzcWxpdGVEYXRhYmFzZSA9IG5ldyBTUUxpdGVEYXRhYmFzZShwYXRoLCBmYWN0b3J5LCBmbGFncyk7CisgICAgICAgICAgICBkYi5tRXJyb3JIYW5kbGVyLm9uQ29ycnVwdGlvbihkYik7CisgICAgICAgICAgICByZXR1cm4gU1FMaXRlRGF0YWJhc2Uub3BlbkRhdGFiYXNlKHBhdGgsIGZhY3RvcnksIGZsYWdzLCBlcnJvckhhbmRsZXIpOworICAgICAgICB9IGNhdGNoIChTUUxpdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiRmFpbGVkIHRvIG9wZW4gdGhlIGRhdGFiYXNlLiBjbG9zaW5nIGl0LiIsIGUpOworICAgICAgICAgICAgZGIuY2xvc2UoKTsKKyAgICAgICAgICAgIHRocm93IGU7CiAgICAgICAgIH0KLSAgICAgICAgQWN0aXZlRGF0YWJhc2VzLmdldEluc3RhbmNlKCkubUFjdGl2ZURhdGFiYXNlcy5hZGQoCi0gICAgICAgICAgICAgICAgbmV3IFdlYWtSZWZlcmVuY2U8U1FMaXRlRGF0YWJhc2U+KHNxbGl0ZURhdGFiYXNlKSk7Ci0gICAgICAgIHJldHVybiBzcWxpdGVEYXRhYmFzZTsKICAgICB9CiAKICAgICAvKioKQEAgLTg1NSw2ICsxMDE3LDI1IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogRXF1aXZhbGVudCB0byBvcGVuRGF0YWJhc2UocGF0aCwgZmFjdG9yeSwgQ1JFQVRFX0lGX05FQ0VTU0FSWSwgZXJyb3JIYW5kbGVyKS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFNRTGl0ZURhdGFiYXNlIG9wZW5PckNyZWF0ZURhdGFiYXNlKFN0cmluZyBwYXRoLCBDdXJzb3JGYWN0b3J5IGZhY3RvcnksCisgICAgICAgICAgICBEYXRhYmFzZUVycm9ySGFuZGxlciBlcnJvckhhbmRsZXIpIHsKKyAgICAgICAgcmV0dXJuIG9wZW5EYXRhYmFzZShwYXRoLCBmYWN0b3J5LCBDUkVBVEVfSUZfTkVDRVNTQVJZLCBlcnJvckhhbmRsZXIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZXRKb3VybmFsTW9kZShmaW5hbCBTdHJpbmcgZGJQYXRoLCBmaW5hbCBTdHJpbmcgbW9kZSkgeworICAgICAgICAvLyBqb3VybmFsIG1vZGUgY2FuIGJlIHNldCBvbmx5IGZvciBub24tbWVtb3J5IGRhdGFiYXNlcworICAgICAgICBpZiAoIWRiUGF0aC5lcXVhbHNJZ25vcmVDYXNlKE1FTU9SWV9EQl9QQVRIKSkgeworICAgICAgICAgICAgU3RyaW5nIHMgPSBEYXRhYmFzZVV0aWxzLnN0cmluZ0ZvclF1ZXJ5KHRoaXMsICJQUkFHTUEgam91cm5hbF9tb2RlPSIgKyBtb2RlLCBudWxsKTsKKyAgICAgICAgICAgIGlmICghcy5lcXVhbHNJZ25vcmVDYXNlKG1vZGUpKSB7CisgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAic2V0dGluZyBqb3VybmFsX21vZGUgdG8gIiArIG1vZGUgKyAiIGZhaWxlZCBmb3IgZGI6ICIgKyBkYlBhdGggKworICAgICAgICAgICAgICAgICAgICAgICAgIiAob24gcHJhZ21hIHNldCBqb3VybmFsX21vZGUsIHNxbGl0ZSByZXR1cm5lZDoiICsgcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKICAgICAgKiBDcmVhdGUgYSBtZW1vcnkgYmFja2VkIFNRTGl0ZSBkYXRhYmFzZS4gIEl0cyBjb250ZW50cyB3aWxsIGJlIGRlc3Ryb3llZAogICAgICAqIHdoZW4gdGhlIGRhdGFiYXNlIGlzIGNsb3NlZC4KICAgICAgKgpAQCAtODY3LDcgKzEwNDgsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgU1FMaXRlRGF0YWJhc2UgY3JlYXRlKEN1cnNvckZhY3RvcnkgZmFjdG9yeSkgewogICAgICAgICAvLyBUaGlzIGlzIGEgbWFnaWMgc3RyaW5nIHdpdGggc3BlY2lhbCBtZWFuaW5nIGZvciBTUUxpdGUuCi0gICAgICAgIHJldHVybiBvcGVuRGF0YWJhc2UoIjptZW1vcnk6IiwgZmFjdG9yeSwgQ1JFQVRFX0lGX05FQ0VTU0FSWSk7CisgICAgICAgIHJldHVybiBvcGVuRGF0YWJhc2UoTUVNT1JZX0RCX1BBVEgsIGZhY3RvcnksIENSRUFURV9JRl9ORUNFU1NBUlkpOwogICAgIH0KIAogICAgIC8qKgpAQCAtODc3LDE4ICsxMDU4LDMxIEBACiAgICAgICAgIGlmICghaXNPcGVuKCkpIHsKICAgICAgICAgICAgIHJldHVybjsgLy8gYWxyZWFkeSBjbG9zZWQKICAgICAgICAgfQorICAgICAgICBpZiAoTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuREVCVUcpKSB7CisgICAgICAgICAgICBMb2cuaShUQUcsICJjbG9zaW5nIGRiOiAiICsgbVBhdGggKyAiIChjb25uZWN0aW9uICMgIiArIG1Db25uZWN0aW9uTnVtKTsKKyAgICAgICAgfQogICAgICAgICBsb2NrKCk7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBjbG9zZUNsb3NhYmxlKCk7CisgICAgICAgICAgICAvLyBmaW5hbGl6ZSBBTEwgc3RhdGVtZW50cyBxdWV1ZWQgdXAgc28gZmFyCisgICAgICAgICAgICBjbG9zZVBlbmRpbmdTdGF0ZW1lbnRzKCk7CisgICAgICAgICAgICByZWxlYXNlQ3VzdG9tRnVuY3Rpb25zKCk7CiAgICAgICAgICAgICAvLyBjbG9zZSB0aGlzIGRhdGFiYXNlIGluc3RhbmNlIC0gcmVnYXJkbGVzcyBvZiBpdHMgcmVmZXJlbmNlIGNvdW50IHZhbHVlCi0gICAgICAgICAgICBvbkFsbFJlZmVyZW5jZXNSZWxlYXNlZCgpOworICAgICAgICAgICAgZGJjbG9zZSgpOworICAgICAgICAgICAgaWYgKG1Db25uZWN0aW9uUG9vbCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLkRFQlVHKSkgeworICAgICAgICAgICAgICAgICAgICBhc3NlcnQgbUNvbm5lY3Rpb25Qb29sICE9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIExvZy5pKFRBRywgbUNvbm5lY3Rpb25Qb29sLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtQ29ubmVjdGlvblBvb2wuY2xvc2UoKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgIHVubG9jaygpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIGNsb3NlQ2xvc2FibGUoKSB7Ci0gICAgICAgIC8qIGRlYWxsb2NhdGUgYWxsIGNvbXBpbGVkIHNxbCBzdGF0ZW1lbnQgb2JqZWN0cyBmcm9tIG1Db21waWxlZFF1ZXJpZXMgY2FjaGUuCisgICAgICAgIC8qIGRlYWxsb2NhdGUgYWxsIGNvbXBpbGVkIFNRTCBzdGF0ZW1lbnQgb2JqZWN0cyBmcm9tIG1Db21waWxlZFF1ZXJpZXMgY2FjaGUuCiAgICAgICAgICAqIHRoaXMgc2hvdWxkIGJlIGRvbmUgYmVmb3JlIGRlLXJlZmVyZW5jaW5nIGFsbCB7QGxpbmsgU1FMaXRlQ2xvc2FibGV9IG9iamVjdHMKICAgICAgICAgICogZnJvbSB0aGlzIGRhdGFiYXNlIG9iamVjdCBiZWNhdXNlIGNhbGxpbmcKICAgICAgICAgICoge0BsaW5rIFNRTGl0ZUNsb3NhYmxlI29uQWxsUmVmZXJlbmNlc1JlbGVhc2VkRnJvbUNvbnRhaW5lcigpfSBjb3VsZCBjYXVzZSB0aGUgZGF0YWJhc2UKQEAgLTkxMywyNCArMTEwNyw2MCBAQAogICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgZGJjbG9zZSgpOwogCiAgICAgLyoqCisgICAgICogQSBjYWxsYmFjayBpbnRlcmZhY2UgZm9yIGEgY3VzdG9tIHNxbGl0ZTMgZnVuY3Rpb24uCisgICAgICogVGhpcyBjYW4gYmUgdXNlZCB0byBjcmVhdGUgYSBmdW5jdGlvbiB0aGF0IGNhbiBiZSBjYWxsZWQgZnJvbQorICAgICAqIHNxbGl0ZTMgZGF0YWJhc2UgdHJpZ2dlcnMuCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50ZXJmYWNlIEN1c3RvbUZ1bmN0aW9uIHsKKyAgICAgICAgcHVibGljIHZvaWQgY2FsbGJhY2soU3RyaW5nW10gYXJncyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVnaXN0ZXJzIGEgQ3VzdG9tRnVuY3Rpb24gY2FsbGJhY2sgYXMgYSBmdW5jdGlvbiB0aGF0IGNhbiBiZSBjYWxsZWQgZnJvbQorICAgICAqIHNxbGl0ZTMgZGF0YWJhc2UgdHJpZ2dlcnMuCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHNxbGl0ZTMgZnVuY3Rpb24KKyAgICAgKiBAcGFyYW0gbnVtQXJncyB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cyBmb3IgdGhlIGZ1bmN0aW9uCisgICAgICogQHBhcmFtIGZ1bmN0aW9uIGNhbGxiYWNrIHRvIGNhbGwgd2hlbiB0aGUgZnVuY3Rpb24gaXMgZXhlY3V0ZWQKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZEN1c3RvbUZ1bmN0aW9uKFN0cmluZyBuYW1lLCBpbnQgbnVtQXJncywgQ3VzdG9tRnVuY3Rpb24gZnVuY3Rpb24pIHsKKyAgICAgICAgdmVyaWZ5RGJJc09wZW4oKTsKKyAgICAgICAgc3luY2hyb25pemVkIChtQ3VzdG9tRnVuY3Rpb25zKSB7CisgICAgICAgICAgICBpbnQgcmVmID0gbmF0aXZlX2FkZEN1c3RvbUZ1bmN0aW9uKG5hbWUsIG51bUFyZ3MsIGZ1bmN0aW9uKTsKKyAgICAgICAgICAgIGlmIChyZWYgIT0gMCkgeworICAgICAgICAgICAgICAgIC8vIHNhdmUgYSByZWZlcmVuY2UgdG8gdGhlIGZ1bmN0aW9uIGZvciBjbGVhbnVwIGxhdGVyCisgICAgICAgICAgICAgICAgbUN1c3RvbUZ1bmN0aW9ucy5hZGQobmV3IEludGVnZXIocmVmKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBTUUxpdGVFeGNlcHRpb24oImZhaWxlZCB0byBhZGQgY3VzdG9tIGZ1bmN0aW9uICIgKyBuYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZWxlYXNlQ3VzdG9tRnVuY3Rpb25zKCkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKG1DdXN0b21GdW5jdGlvbnMpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbUN1c3RvbUZ1bmN0aW9ucy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIEludGVnZXIgZnVuY3Rpb24gPSBtQ3VzdG9tRnVuY3Rpb25zLmdldChpKTsKKyAgICAgICAgICAgICAgICBuYXRpdmVfcmVsZWFzZUN1c3RvbUZ1bmN0aW9uKGZ1bmN0aW9uLmludFZhbHVlKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUN1c3RvbUZ1bmN0aW9ucy5jbGVhcigpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gbGlzdCBvZiBDdXN0b21GdW5jdGlvbiByZWZlcmVuY2VzIHNvIHdlIGNhbiBjbGVhbiB1cCB3aGVuIHRoZSBkYXRhYmFzZSBjbG9zZXMKKyAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxJbnRlZ2VyPiBtQ3VzdG9tRnVuY3Rpb25zID0KKyAgICAgICAgICAgIG5ldyBBcnJheUxpc3Q8SW50ZWdlcj4oKTsKKworICAgIHByaXZhdGUgbmF0aXZlIGludCBuYXRpdmVfYWRkQ3VzdG9tRnVuY3Rpb24oU3RyaW5nIG5hbWUsIGludCBudW1BcmdzLCBDdXN0b21GdW5jdGlvbiBmdW5jdGlvbik7CisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuYXRpdmVfcmVsZWFzZUN1c3RvbUZ1bmN0aW9uKGludCBmdW5jdGlvbik7CisKKyAgICAvKioKICAgICAgKiBHZXRzIHRoZSBkYXRhYmFzZSB2ZXJzaW9uLgogICAgICAqCiAgICAgICogQHJldHVybiB0aGUgZGF0YWJhc2UgdmVyc2lvbgogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0VmVyc2lvbigpIHsKLSAgICAgICAgU1FMaXRlU3RhdGVtZW50IHByb2cgPSBudWxsOwotICAgICAgICBsb2NrKCk7Ci0gICAgICAgIGlmICghaXNPcGVuKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImRhdGFiYXNlIG5vdCBvcGVuIik7Ci0gICAgICAgIH0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHByb2cgPSBuZXcgU1FMaXRlU3RhdGVtZW50KHRoaXMsICJQUkFHTUEgdXNlcl92ZXJzaW9uOyIpOwotICAgICAgICAgICAgbG9uZyB2ZXJzaW9uID0gcHJvZy5zaW1wbGVRdWVyeUZvckxvbmcoKTsKLSAgICAgICAgICAgIHJldHVybiAoaW50KSB2ZXJzaW9uOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKHByb2cgIT0gbnVsbCkgcHJvZy5jbG9zZSgpOwotICAgICAgICAgICAgdW5sb2NrKCk7Ci0gICAgICAgIH0KKyAgICAgICAgcmV0dXJuICgoTG9uZykgRGF0YWJhc2VVdGlscy5sb25nRm9yUXVlcnkodGhpcywgIlBSQUdNQSB1c2VyX3ZlcnNpb247IiwgbnVsbCkpLmludFZhbHVlKCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC05NDgsMjAgKzExNzgsOCBAQAogICAgICAqIEByZXR1cm4gdGhlIG5ldyBtYXhpbXVtIGRhdGFiYXNlIHNpemUKICAgICAgKi8KICAgICBwdWJsaWMgbG9uZyBnZXRNYXhpbXVtU2l6ZSgpIHsKLSAgICAgICAgU1FMaXRlU3RhdGVtZW50IHByb2cgPSBudWxsOwotICAgICAgICBsb2NrKCk7Ci0gICAgICAgIGlmICghaXNPcGVuKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImRhdGFiYXNlIG5vdCBvcGVuIik7Ci0gICAgICAgIH0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHByb2cgPSBuZXcgU1FMaXRlU3RhdGVtZW50KHRoaXMsCi0gICAgICAgICAgICAgICAgICAgICJQUkFHTUEgbWF4X3BhZ2VfY291bnQ7Iik7Ci0gICAgICAgICAgICBsb25nIHBhZ2VDb3VudCA9IHByb2cuc2ltcGxlUXVlcnlGb3JMb25nKCk7Ci0gICAgICAgICAgICByZXR1cm4gcGFnZUNvdW50ICogZ2V0UGFnZVNpemUoKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChwcm9nICE9IG51bGwpIHByb2cuY2xvc2UoKTsKLSAgICAgICAgICAgIHVubG9jaygpOwotICAgICAgICB9CisgICAgICAgIGxvbmcgcGFnZUNvdW50ID0gRGF0YWJhc2VVdGlscy5sb25nRm9yUXVlcnkodGhpcywgIlBSQUdNQSBtYXhfcGFnZV9jb3VudDsiLCBudWxsKTsKKyAgICAgICAgcmV0dXJuIHBhZ2VDb3VudCAqIGdldFBhZ2VTaXplKCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC05NzIsMjYgKzExOTAsMTUgQEAKICAgICAgKiBAcmV0dXJuIHRoZSBuZXcgbWF4aW11bSBkYXRhYmFzZSBzaXplCiAgICAgICovCiAgICAgcHVibGljIGxvbmcgc2V0TWF4aW11bVNpemUobG9uZyBudW1CeXRlcykgewotICAgICAgICBTUUxpdGVTdGF0ZW1lbnQgcHJvZyA9IG51bGw7Ci0gICAgICAgIGxvY2soKTsKLSAgICAgICAgaWYgKCFpc09wZW4oKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZGF0YWJhc2Ugbm90IG9wZW4iKTsKKyAgICAgICAgbG9uZyBwYWdlU2l6ZSA9IGdldFBhZ2VTaXplKCk7CisgICAgICAgIGxvbmcgbnVtUGFnZXMgPSBudW1CeXRlcyAvIHBhZ2VTaXplOworICAgICAgICAvLyBJZiBudW1CeXRlcyBpc24ndCBhIG11bHRpcGxlIG9mIHBhZ2VTaXplLCBidW1wIHVwIGEgcGFnZQorICAgICAgICBpZiAoKG51bUJ5dGVzICUgcGFnZVNpemUpICE9IDApIHsKKyAgICAgICAgICAgIG51bVBhZ2VzKys7CiAgICAgICAgIH0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGxvbmcgcGFnZVNpemUgPSBnZXRQYWdlU2l6ZSgpOwotICAgICAgICAgICAgbG9uZyBudW1QYWdlcyA9IG51bUJ5dGVzIC8gcGFnZVNpemU7Ci0gICAgICAgICAgICAvLyBJZiBudW1CeXRlcyBpc24ndCBhIG11bHRpcGxlIG9mIHBhZ2VTaXplLCBidW1wIHVwIGEgcGFnZQotICAgICAgICAgICAgaWYgKChudW1CeXRlcyAlIHBhZ2VTaXplKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgbnVtUGFnZXMrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHByb2cgPSBuZXcgU1FMaXRlU3RhdGVtZW50KHRoaXMsCi0gICAgICAgICAgICAgICAgICAgICJQUkFHTUEgbWF4X3BhZ2VfY291bnQgPSAiICsgbnVtUGFnZXMpOwotICAgICAgICAgICAgbG9uZyBuZXdQYWdlQ291bnQgPSBwcm9nLnNpbXBsZVF1ZXJ5Rm9yTG9uZygpOwotICAgICAgICAgICAgcmV0dXJuIG5ld1BhZ2VDb3VudCAqIHBhZ2VTaXplOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKHByb2cgIT0gbnVsbCkgcHJvZy5jbG9zZSgpOwotICAgICAgICAgICAgdW5sb2NrKCk7Ci0gICAgICAgIH0KKyAgICAgICAgbG9uZyBuZXdQYWdlQ291bnQgPSBEYXRhYmFzZVV0aWxzLmxvbmdGb3JRdWVyeSh0aGlzLCAiUFJBR01BIG1heF9wYWdlX2NvdW50ID0gIiArIG51bVBhZ2VzLAorICAgICAgICAgICAgICAgIG51bGwpOworICAgICAgICByZXR1cm4gbmV3UGFnZUNvdW50ICogcGFnZVNpemU7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMDAwLDIwICsxMjA3LDcgQEAKICAgICAgKiBAcmV0dXJuIHRoZSBkYXRhYmFzZSBwYWdlIHNpemUsIGluIGJ5dGVzCiAgICAgICovCiAgICAgcHVibGljIGxvbmcgZ2V0UGFnZVNpemUoKSB7Ci0gICAgICAgIFNRTGl0ZVN0YXRlbWVudCBwcm9nID0gbnVsbDsKLSAgICAgICAgbG9jaygpOwotICAgICAgICBpZiAoIWlzT3BlbigpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJkYXRhYmFzZSBub3Qgb3BlbiIpOwotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBwcm9nID0gbmV3IFNRTGl0ZVN0YXRlbWVudCh0aGlzLAotICAgICAgICAgICAgICAgICAgICAiUFJBR01BIHBhZ2Vfc2l6ZTsiKTsKLSAgICAgICAgICAgIGxvbmcgc2l6ZSA9IHByb2cuc2ltcGxlUXVlcnlGb3JMb25nKCk7Ci0gICAgICAgICAgICByZXR1cm4gc2l6ZTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChwcm9nICE9IG51bGwpIHByb2cuY2xvc2UoKTsKLSAgICAgICAgICAgIHVubG9jaygpOwotICAgICAgICB9CisgICAgICAgIHJldHVybiBEYXRhYmFzZVV0aWxzLmxvbmdGb3JRdWVyeSh0aGlzLCAiUFJBR01BIHBhZ2Vfc2l6ZTsiLCBudWxsKTsKICAgICB9CiAKICAgICAvKioKQEAgLTEwMzQsOSArMTIyOCwxMCBAQAogICAgICAqIEBwYXJhbSB0YWJsZSB0aGUgdGFibGUgdG8gbWFyayBhcyBzeW5jYWJsZQogICAgICAqIEBwYXJhbSBkZWxldGVkVGFibGUgVGhlIGRlbGV0ZWQgdGFibGUgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUKICAgICAgKiAgICAgICAgICBzeW5jYWJsZSB0YWJsZQorICAgICAqIEBkZXByZWNhdGVkIFRoaXMgbWV0aG9kIG5vIGxvbmdlciBzZXJ2ZXMgYW55IHVzZWZ1bCBwdXJwb3NlIGFuZCBoYXMgYmVlbiBkZXByZWNhdGVkLgogICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIHZvaWQgbWFya1RhYmxlU3luY2FibGUoU3RyaW5nIHRhYmxlLCBTdHJpbmcgZGVsZXRlZFRhYmxlKSB7Ci0gICAgICAgIG1hcmtUYWJsZVN5bmNhYmxlKHRhYmxlLCAiX2lkIiwgdGFibGUsIGRlbGV0ZWRUYWJsZSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMDQ5LDYwICsxMjQ0LDEwIEBACiAgICAgICogQHBhcmFtIGZvcmVpZ25LZXkgdGhpcyBpcyB0aGUgY29sdW1uIGluIHRhYmxlIHdob3NlIHZhbHVlIGlzIGFuIF9pZCBpbgogICAgICAqICAgICAgICAgIHVwZGF0ZVRhYmxlCiAgICAgICogQHBhcmFtIHVwZGF0ZVRhYmxlIHRoaXMgaXMgdGhlIHRhYmxlIHRoYXQgd2lsbCBoYXZlIGl0cyBfc3luY19kaXJ0eQorICAgICAqIEBkZXByZWNhdGVkIFRoaXMgbWV0aG9kIG5vIGxvbmdlciBzZXJ2ZXMgYW55IHVzZWZ1bCBwdXJwb3NlIGFuZCBoYXMgYmVlbiBkZXByZWNhdGVkLgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG1hcmtUYWJsZVN5bmNhYmxlKFN0cmluZyB0YWJsZSwgU3RyaW5nIGZvcmVpZ25LZXksCi0gICAgICAgICAgICBTdHJpbmcgdXBkYXRlVGFibGUpIHsKLSAgICAgICAgbWFya1RhYmxlU3luY2FibGUodGFibGUsIGZvcmVpZ25LZXksIHVwZGF0ZVRhYmxlLCBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNYXJrIHRoaXMgdGFibGUgYXMgc3luY2FibGUsIHdpdGggdGhlIF9zeW5jX2RpcnR5IHJlc2lkaW5nIGluIGFub3RoZXIKLSAgICAgKiB0YWJsZS4gV2hlbiBhbiB1cGRhdGUgb2NjdXJzIGluIHRoaXMgdGFibGUgdGhlIF9zeW5jX2RpcnR5IGZpZWxkIG9mIHRoZQotICAgICAqIHJvdyBpbiB1cGRhdGVUYWJsZSB3aXRoIHRoZSBfaWQgaW4gZm9yZWlnbktleSB3aWxsIGJlIHNldCB0bwotICAgICAqIGVuc3VyZSBwcm9wZXIgc3luY2luZyBvcGVyYXRpb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdGFibGUgYW4gdXBkYXRlIG9uIHRoaXMgdGFibGUgd2lsbCB0cmlnZ2VyIGEgc3luYyB0aW1lIHJlbW92YWwKLSAgICAgKiBAcGFyYW0gZm9yZWlnbktleSB0aGlzIGlzIHRoZSBjb2x1bW4gaW4gdGFibGUgd2hvc2UgdmFsdWUgaXMgYW4gX2lkIGluCi0gICAgICogICAgICAgICAgdXBkYXRlVGFibGUKLSAgICAgKiBAcGFyYW0gdXBkYXRlVGFibGUgdGhpcyBpcyB0aGUgdGFibGUgdGhhdCB3aWxsIGhhdmUgaXRzIF9zeW5jX2RpcnR5Ci0gICAgICogQHBhcmFtIGRlbGV0ZWRUYWJsZSBUaGUgZGVsZXRlZCB0YWJsZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZQotICAgICAqICAgICAgICAgIHVwZGF0ZVRhYmxlCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIG1hcmtUYWJsZVN5bmNhYmxlKFN0cmluZyB0YWJsZSwgU3RyaW5nIGZvcmVpZ25LZXksCi0gICAgICAgICAgICBTdHJpbmcgdXBkYXRlVGFibGUsIFN0cmluZyBkZWxldGVkVGFibGUpIHsKLSAgICAgICAgbG9jaygpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgbmF0aXZlX2V4ZWNTUUwoIlNFTEVDVCBfc3luY19kaXJ0eSBGUk9NICIgKyB1cGRhdGVUYWJsZQotICAgICAgICAgICAgICAgICAgICArICIgTElNSVQgMCIpOwotICAgICAgICAgICAgbmF0aXZlX2V4ZWNTUUwoIlNFTEVDVCAiICsgZm9yZWlnbktleSArICIgRlJPTSAiICsgdGFibGUKLSAgICAgICAgICAgICAgICAgICAgKyAiIExJTUlUIDAiKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHVubG9jaygpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3luY1VwZGF0ZUluZm8gaW5mbyA9IG5ldyBTeW5jVXBkYXRlSW5mbyh1cGRhdGVUYWJsZSwgZGVsZXRlZFRhYmxlLAotICAgICAgICAgICAgICAgIGZvcmVpZ25LZXkpOwotICAgICAgICBzeW5jaHJvbml6ZWQgKG1TeW5jVXBkYXRlSW5mbykgewotICAgICAgICAgICAgbVN5bmNVcGRhdGVJbmZvLnB1dCh0YWJsZSwgaW5mbyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsIGZvciBlYWNoIHJvdyB0aGF0IGlzIHVwZGF0ZWQgaW4gYSBjdXJzb3IuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdGFibGUgdGhlIHRhYmxlIHRoZSByb3cgaXMgaW4KLSAgICAgKiBAcGFyYW0gcm93SWQgdGhlIHJvdyBJRCBvZiB0aGUgdXBkYXRlZCByb3cKLSAgICAgKi8KLSAgICAvKiBwYWNrYWdlICovIHZvaWQgcm93VXBkYXRlZChTdHJpbmcgdGFibGUsIGxvbmcgcm93SWQpIHsKLSAgICAgICAgU3luY1VwZGF0ZUluZm8gaW5mbzsKLSAgICAgICAgc3luY2hyb25pemVkIChtU3luY1VwZGF0ZUluZm8pIHsKLSAgICAgICAgICAgIGluZm8gPSBtU3luY1VwZGF0ZUluZm8uZ2V0KHRhYmxlKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaW5mbyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBleGVjU1FMKCJVUERBVEUgIiArIGluZm8ubWFzdGVyVGFibGUKLSAgICAgICAgICAgICAgICAgICAgKyAiIFNFVCBfc3luY19kaXJ0eT0xIFdIRVJFIF9pZD0oU0VMRUNUICIgKyBpbmZvLmZvcmVpZ25LZXkKLSAgICAgICAgICAgICAgICAgICAgKyAiIEZST00gIiArIHRhYmxlICsgIiBXSEVSRSBfaWQ9IiArIHJvd0lkICsgIikiKTsKLSAgICAgICAgfQorICAgIEBEZXByZWNhdGVkCisgICAgcHVibGljIHZvaWQgbWFya1RhYmxlU3luY2FibGUoU3RyaW5nIHRhYmxlLCBTdHJpbmcgZm9yZWlnbktleSwgU3RyaW5nIHVwZGF0ZVRhYmxlKSB7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMTM0LDYgKzEyNzksOCBAQAogICAgICAqIHN0YXRlbWVudCBhbmQgZmlsbCBpbiB0aG9zZSB2YWx1ZXMgd2l0aCB7QGxpbmsgU1FMaXRlUHJvZ3JhbSNiaW5kU3RyaW5nfQogICAgICAqIGFuZCB7QGxpbmsgU1FMaXRlUHJvZ3JhbSNiaW5kTG9uZ30gZWFjaCB0aW1lIHlvdSB3YW50IHRvIHJ1biB0aGUKICAgICAgKiBzdGF0ZW1lbnQuIFN0YXRlbWVudHMgbWF5IG5vdCByZXR1cm4gcmVzdWx0IHNldHMgbGFyZ2VyIHRoYW4gMXgxLgorICAgICAqPHA+CisgICAgICogTm8gdHdvIHRocmVhZHMgc2hvdWxkIGJlIHVzaW5nIHRoZSBzYW1lIHtAbGluayBTUUxpdGVTdGF0ZW1lbnR9IGF0IHRoZSBzYW1lIHRpbWUuCiAgICAgICoKICAgICAgKiBAcGFyYW0gc3FsIFRoZSByYXcgU1FMIHN0YXRlbWVudCwgbWF5IGNvbnRhaW4gPyBmb3IgdW5rbm93biB2YWx1ZXMgdG8gYmUKICAgICAgKiAgICAgICAgICAgIGJvdW5kIGxhdGVyLgpAQCAtMTE0MSwxNSArMTI4OCw4IEBACiAgICAgICoge0BsaW5rIFNRTGl0ZVN0YXRlbWVudH1zIGFyZSBub3Qgc3luY2hyb25pemVkLCBzZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIG1vcmUgZGV0YWlscy4KICAgICAgKi8KICAgICBwdWJsaWMgU1FMaXRlU3RhdGVtZW50IGNvbXBpbGVTdGF0ZW1lbnQoU3RyaW5nIHNxbCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7Ci0gICAgICAgIGxvY2soKTsKLSAgICAgICAgaWYgKCFpc09wZW4oKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZGF0YWJhc2Ugbm90IG9wZW4iKTsKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBTUUxpdGVTdGF0ZW1lbnQodGhpcywgc3FsKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHVubG9jaygpOwotICAgICAgICB9CisgICAgICAgIHZlcmlmeURiSXNPcGVuKCk7CisgICAgICAgIHJldHVybiBuZXcgU1FMaXRlU3RhdGVtZW50KHRoaXMsIHNxbCwgbnVsbCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMjI2LDkgKzEzNjYsNyBAQAogICAgICAgICAgICAgYm9vbGVhbiBkaXN0aW5jdCwgU3RyaW5nIHRhYmxlLCBTdHJpbmdbXSBjb2x1bW5zLAogICAgICAgICAgICAgU3RyaW5nIHNlbGVjdGlvbiwgU3RyaW5nW10gc2VsZWN0aW9uQXJncywgU3RyaW5nIGdyb3VwQnksCiAgICAgICAgICAgICBTdHJpbmcgaGF2aW5nLCBTdHJpbmcgb3JkZXJCeSwgU3RyaW5nIGxpbWl0KSB7Ci0gICAgICAgIGlmICghaXNPcGVuKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImRhdGFiYXNlIG5vdCBvcGVuIik7Ci0gICAgICAgIH0KKyAgICAgICAgdmVyaWZ5RGJJc09wZW4oKTsKICAgICAgICAgU3RyaW5nIHNxbCA9IFNRTGl0ZVF1ZXJ5QnVpbGRlci5idWlsZFF1ZXJ5U3RyaW5nKAogICAgICAgICAgICAgICAgIGRpc3RpbmN0LCB0YWJsZSwgY29sdW1ucywgc2VsZWN0aW9uLCBncm91cEJ5LCBoYXZpbmcsIG9yZGVyQnksIGxpbWl0KTsKIApAQCAtMTMzOSw5ICsxNDc3LDcgQEAKICAgICBwdWJsaWMgQ3Vyc29yIHJhd1F1ZXJ5V2l0aEZhY3RvcnkoCiAgICAgICAgICAgICBDdXJzb3JGYWN0b3J5IGN1cnNvckZhY3RvcnksIFN0cmluZyBzcWwsIFN0cmluZ1tdIHNlbGVjdGlvbkFyZ3MsCiAgICAgICAgICAgICBTdHJpbmcgZWRpdFRhYmxlKSB7Ci0gICAgICAgIGlmICghaXNPcGVuKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImRhdGFiYXNlIG5vdCBvcGVuIik7Ci0gICAgICAgIH0KKyAgICAgICAgdmVyaWZ5RGJJc09wZW4oKTsKICAgICAgICAgQmxvY2tHdWFyZC5nZXRUaHJlYWRQb2xpY3koKS5vblJlYWRGcm9tRGlzaygpOwogICAgICAgICBsb25nIHRpbWVTdGFydCA9IDA7CiAKQEAgLTEzNDksNyArMTQ4NSw4IEBACiAgICAgICAgICAgICB0aW1lU3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKICAgICAgICAgfQogCi0gICAgICAgIFNRTGl0ZUN1cnNvckRyaXZlciBkcml2ZXIgPSBuZXcgU1FMaXRlRGlyZWN0Q3Vyc29yRHJpdmVyKHRoaXMsIHNxbCwgZWRpdFRhYmxlKTsKKyAgICAgICAgU1FMaXRlRGF0YWJhc2UgZGIgPSBnZXREYkNvbm5lY3Rpb24oc3FsKTsKKyAgICAgICAgU1FMaXRlQ3Vyc29yRHJpdmVyIGRyaXZlciA9IG5ldyBTUUxpdGVEaXJlY3RDdXJzb3JEcml2ZXIoZGIsIHNxbCwgZWRpdFRhYmxlKTsKIAogICAgICAgICBDdXJzb3IgY3Vyc29yID0gbnVsbDsKICAgICAgICAgdHJ5IHsKQEAgLTEzNzUsNiArMTUxMiw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiPG51bGw+IikgICsgIiwgY291bnQgaXMgIiArIGNvdW50KTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CisgICAgICAgICAgICByZWxlYXNlRGJDb25uZWN0aW9uKGRiKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gY3Vyc29yOwogICAgIH0KQEAgLTE1MDEsODQgKzE2MzksNDEgQEAKICAgICAgKi8KICAgICBwdWJsaWMgbG9uZyBpbnNlcnRXaXRoT25Db25mbGljdChTdHJpbmcgdGFibGUsIFN0cmluZyBudWxsQ29sdW1uSGFjaywKICAgICAgICAgICAgIENvbnRlbnRWYWx1ZXMgaW5pdGlhbFZhbHVlcywgaW50IGNvbmZsaWN0QWxnb3JpdGhtKSB7Ci0gICAgICAgIEJsb2NrR3VhcmQuZ2V0VGhyZWFkUG9saWN5KCkub25Xcml0ZVRvRGlzaygpOwotICAgICAgICBpZiAoIWlzT3BlbigpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJkYXRhYmFzZSBub3Qgb3BlbiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gTWVhc3VyZW1lbnRzIHNob3cgbW9zdCBzcWwgbGVuZ3RocyA8PSAxNTIKLSAgICAgICAgU3RyaW5nQnVpbGRlciBzcWwgPSBuZXcgU3RyaW5nQnVpbGRlcigxNTIpOworICAgICAgICBTdHJpbmdCdWlsZGVyIHNxbCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CiAgICAgICAgIHNxbC5hcHBlbmQoIklOU0VSVCIpOwogICAgICAgICBzcWwuYXBwZW5kKENPTkZMSUNUX1ZBTFVFU1tjb25mbGljdEFsZ29yaXRobV0pOwogICAgICAgICBzcWwuYXBwZW5kKCIgSU5UTyAiKTsKICAgICAgICAgc3FsLmFwcGVuZCh0YWJsZSk7Ci0gICAgICAgIC8vIE1lYXN1cmVtZW50cyBzaG93IG1vc3QgdmFsdWVzIGxlbmd0aHMgPCA0MAotICAgICAgICBTdHJpbmdCdWlsZGVyIHZhbHVlcyA9IG5ldyBTdHJpbmdCdWlsZGVyKDQwKTsKKyAgICAgICAgc3FsLmFwcGVuZCgnKCcpOwogCi0gICAgICAgIFNldDxNYXAuRW50cnk8U3RyaW5nLCBPYmplY3Q+PiBlbnRyeVNldCA9IG51bGw7Ci0gICAgICAgIGlmIChpbml0aWFsVmFsdWVzICE9IG51bGwgJiYgaW5pdGlhbFZhbHVlcy5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICBlbnRyeVNldCA9IGluaXRpYWxWYWx1ZXMudmFsdWVTZXQoKTsKLSAgICAgICAgICAgIEl0ZXJhdG9yPE1hcC5FbnRyeTxTdHJpbmcsIE9iamVjdD4+IGVudHJpZXNJdGVyID0gZW50cnlTZXQuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIHNxbC5hcHBlbmQoJygnKTsKLQotICAgICAgICAgICAgYm9vbGVhbiBuZWVkU2VwYXJhdG9yID0gZmFsc2U7Ci0gICAgICAgICAgICB3aGlsZSAoZW50cmllc0l0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG5lZWRTZXBhcmF0b3IpIHsKLSAgICAgICAgICAgICAgICAgICAgc3FsLmFwcGVuZCgiLCAiKTsKLSAgICAgICAgICAgICAgICAgICAgdmFsdWVzLmFwcGVuZCgiLCAiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbmVlZFNlcGFyYXRvciA9IHRydWU7Ci0gICAgICAgICAgICAgICAgTWFwLkVudHJ5PFN0cmluZywgT2JqZWN0PiBlbnRyeSA9IGVudHJpZXNJdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICBzcWwuYXBwZW5kKGVudHJ5LmdldEtleSgpKTsKLSAgICAgICAgICAgICAgICB2YWx1ZXMuYXBwZW5kKCc/Jyk7CisgICAgICAgIE9iamVjdFtdIGJpbmRBcmdzID0gbnVsbDsKKyAgICAgICAgaW50IHNpemUgPSAoaW5pdGlhbFZhbHVlcyAhPSBudWxsICYmIGluaXRpYWxWYWx1ZXMuc2l6ZSgpID4gMCkgPyBpbml0aWFsVmFsdWVzLnNpemUoKSA6IDA7CisgICAgICAgIGlmIChzaXplID4gMCkgeworICAgICAgICAgICAgYmluZEFyZ3MgPSBuZXcgT2JqZWN0W3NpemVdOworICAgICAgICAgICAgaW50IGkgPSAwOworICAgICAgICAgICAgZm9yIChTdHJpbmcgY29sTmFtZSA6IGluaXRpYWxWYWx1ZXMua2V5U2V0KCkpIHsKKyAgICAgICAgICAgICAgICBzcWwuYXBwZW5kKChpID4gMCkgPyAiLCIgOiAiIik7CisgICAgICAgICAgICAgICAgc3FsLmFwcGVuZChjb2xOYW1lKTsKKyAgICAgICAgICAgICAgICBiaW5kQXJnc1tpKytdID0gaW5pdGlhbFZhbHVlcy5nZXQoY29sTmFtZSk7CiAgICAgICAgICAgICB9Ci0KICAgICAgICAgICAgIHNxbC5hcHBlbmQoJyknKTsKKyAgICAgICAgICAgIHNxbC5hcHBlbmQoIiBWQUxVRVMgKCIpOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICAgICAgICAgIHNxbC5hcHBlbmQoKGkgPiAwKSA/ICIsPyIgOiAiPyIpOworICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3FsLmFwcGVuZCgiKCIgKyBudWxsQ29sdW1uSGFjayArICIpICIpOwotICAgICAgICAgICAgdmFsdWVzLmFwcGVuZCgiTlVMTCIpOworICAgICAgICAgICAgc3FsLmFwcGVuZChudWxsQ29sdW1uSGFjayArICIpIFZBTFVFUyAoTlVMTCIpOwogICAgICAgICB9CisgICAgICAgIHNxbC5hcHBlbmQoJyknKTsKIAotICAgICAgICBzcWwuYXBwZW5kKCIgVkFMVUVTKCIpOwotICAgICAgICBzcWwuYXBwZW5kKHZhbHVlcyk7Ci0gICAgICAgIHNxbC5hcHBlbmQoIik7Iik7Ci0KLSAgICAgICAgbG9jaygpOwotICAgICAgICBTUUxpdGVTdGF0ZW1lbnQgc3RhdGVtZW50ID0gbnVsbDsKKyAgICAgICAgU1FMaXRlU3RhdGVtZW50IHN0YXRlbWVudCA9IG5ldyBTUUxpdGVTdGF0ZW1lbnQodGhpcywgc3FsLnRvU3RyaW5nKCksIGJpbmRBcmdzKTsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHN0YXRlbWVudCA9IGNvbXBpbGVTdGF0ZW1lbnQoc3FsLnRvU3RyaW5nKCkpOwotCi0gICAgICAgICAgICAvLyBCaW5kIHRoZSB2YWx1ZXMKLSAgICAgICAgICAgIGlmIChlbnRyeVNldCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaW50IHNpemUgPSBlbnRyeVNldC5zaXplKCk7Ci0gICAgICAgICAgICAgICAgSXRlcmF0b3I8TWFwLkVudHJ5PFN0cmluZywgT2JqZWN0Pj4gZW50cmllc0l0ZXIgPSBlbnRyeVNldC5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIE1hcC5FbnRyeTxTdHJpbmcsIE9iamVjdD4gZW50cnkgPSBlbnRyaWVzSXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuYmluZE9iamVjdFRvUHJvZ3JhbShzdGF0ZW1lbnQsIGkgKyAxLCBlbnRyeS5nZXRWYWx1ZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFJ1biB0aGUgcHJvZ3JhbSBhbmQgdGhlbiBjbGVhbnVwCi0gICAgICAgICAgICBzdGF0ZW1lbnQuZXhlY3V0ZSgpOwotCi0gICAgICAgICAgICBsb25nIGluc2VydGVkUm93SWQgPSBsYXN0SW5zZXJ0Um93KCk7Ci0gICAgICAgICAgICBpZiAoaW5zZXJ0ZWRSb3dJZCA9PSAtMSkgewotICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkVycm9yIGluc2VydGluZyAiICsgaW5pdGlhbFZhbHVlcyArICIgdXNpbmcgIiArIHNxbCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChDb25maWcuTE9HRCAmJiBMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5WRVJCT1NFKSkgewotICAgICAgICAgICAgICAgICAgICBMb2cudihUQUcsICJJbnNlcnRpbmcgcm93ICIgKyBpbnNlcnRlZFJvd0lkICsgIiBmcm9tICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGluaXRpYWxWYWx1ZXMgKyAiIHVzaW5nICIgKyBzcWwpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBpbnNlcnRlZFJvd0lkOworICAgICAgICAgICAgcmV0dXJuIHN0YXRlbWVudC5leGVjdXRlSW5zZXJ0KCk7CiAgICAgICAgIH0gY2F0Y2ggKFNRTGl0ZURhdGFiYXNlQ29ycnVwdEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICBvbkNvcnJ1cHRpb24oKTsKICAgICAgICAgICAgIHRocm93IGU7CiAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoc3RhdGVtZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzdGF0ZW1lbnQuY2xvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHVubG9jaygpOworICAgICAgICAgICAgc3RhdGVtZW50LmNsb3NlKCk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTE1OTMsMzIgKzE2ODgsMTUgQEAKICAgICAgKiAgICAgICAgIHdoZXJlQ2xhdXNlLgogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZGVsZXRlKFN0cmluZyB0YWJsZSwgU3RyaW5nIHdoZXJlQ2xhdXNlLCBTdHJpbmdbXSB3aGVyZUFyZ3MpIHsKLSAgICAgICAgQmxvY2tHdWFyZC5nZXRUaHJlYWRQb2xpY3koKS5vbldyaXRlVG9EaXNrKCk7Ci0gICAgICAgIGxvY2soKTsKLSAgICAgICAgaWYgKCFpc09wZW4oKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZGF0YWJhc2Ugbm90IG9wZW4iKTsKLSAgICAgICAgfQotICAgICAgICBTUUxpdGVTdGF0ZW1lbnQgc3RhdGVtZW50ID0gbnVsbDsKKyAgICAgICAgU1FMaXRlU3RhdGVtZW50IHN0YXRlbWVudCA9ICBuZXcgU1FMaXRlU3RhdGVtZW50KHRoaXMsICJERUxFVEUgRlJPTSAiICsgdGFibGUgKworICAgICAgICAgICAgICAgICghVGV4dFV0aWxzLmlzRW1wdHkod2hlcmVDbGF1c2UpID8gIiBXSEVSRSAiICsgd2hlcmVDbGF1c2UgOiAiIiksIHdoZXJlQXJncyk7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzdGF0ZW1lbnQgPSBjb21waWxlU3RhdGVtZW50KCJERUxFVEUgRlJPTSAiICsgdGFibGUKLSAgICAgICAgICAgICAgICAgICAgKyAoIVRleHRVdGlscy5pc0VtcHR5KHdoZXJlQ2xhdXNlKQotICAgICAgICAgICAgICAgICAgICA/ICIgV0hFUkUgIiArIHdoZXJlQ2xhdXNlIDogIiIpKTsKLSAgICAgICAgICAgIGlmICh3aGVyZUFyZ3MgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGludCBudW1BcmdzID0gd2hlcmVBcmdzLmxlbmd0aDsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUFyZ3M7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmJpbmRPYmplY3RUb1Byb2dyYW0oc3RhdGVtZW50LCBpICsgMSwgd2hlcmVBcmdzW2ldKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdGF0ZW1lbnQuZXhlY3V0ZSgpOwotICAgICAgICAgICAgcmV0dXJuIGxhc3RDaGFuZ2VDb3VudCgpOworICAgICAgICAgICAgcmV0dXJuIHN0YXRlbWVudC5leGVjdXRlVXBkYXRlRGVsZXRlKCk7CiAgICAgICAgIH0gY2F0Y2ggKFNRTGl0ZURhdGFiYXNlQ29ycnVwdEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICBvbkNvcnJ1cHRpb24oKTsKICAgICAgICAgICAgIHRocm93IGU7CiAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoc3RhdGVtZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzdGF0ZW1lbnQuY2xvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHVubG9jaygpOworICAgICAgICAgICAgc3RhdGVtZW50LmNsb3NlKCk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTE2NDksOCArMTcyNyw4IEBACiAgICAgICovCiAgICAgcHVibGljIGludCB1cGRhdGVXaXRoT25Db25mbGljdChTdHJpbmcgdGFibGUsIENvbnRlbnRWYWx1ZXMgdmFsdWVzLAogICAgICAgICAgICAgU3RyaW5nIHdoZXJlQ2xhdXNlLCBTdHJpbmdbXSB3aGVyZUFyZ3MsIGludCBjb25mbGljdEFsZ29yaXRobSkgewotICAgICAgICBCbG9ja0d1YXJkLmdldFRocmVhZFBvbGljeSgpLm9uV3JpdGVUb0Rpc2soKTsKLSAgICAgICAgaWYgKHZhbHVlcyA9PSBudWxsIHx8IHZhbHVlcy5zaXplKCkgPT0gMCkgeworICAgICAgICBpbnQgc2V0VmFsdWVzU2l6ZSA9IHZhbHVlcy5zaXplKCk7CisgICAgICAgIGlmICh2YWx1ZXMgPT0gbnVsbCB8fCBzZXRWYWx1ZXNTaXplID09IDApIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkVtcHR5IHZhbHVlcyIpOwogICAgICAgICB9CiAKQEAgLTE2NjAsOTggKzE3MzgsNjggQEAKICAgICAgICAgc3FsLmFwcGVuZCh0YWJsZSk7CiAgICAgICAgIHNxbC5hcHBlbmQoIiBTRVQgIik7CiAKLSAgICAgICAgU2V0PE1hcC5FbnRyeTxTdHJpbmcsIE9iamVjdD4+IGVudHJ5U2V0ID0gdmFsdWVzLnZhbHVlU2V0KCk7Ci0gICAgICAgIEl0ZXJhdG9yPE1hcC5FbnRyeTxTdHJpbmcsIE9iamVjdD4+IGVudHJpZXNJdGVyID0gZW50cnlTZXQuaXRlcmF0b3IoKTsKLQotICAgICAgICB3aGlsZSAoZW50cmllc0l0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBNYXAuRW50cnk8U3RyaW5nLCBPYmplY3Q+IGVudHJ5ID0gZW50cmllc0l0ZXIubmV4dCgpOwotICAgICAgICAgICAgc3FsLmFwcGVuZChlbnRyeS5nZXRLZXkoKSk7CisgICAgICAgIC8vIG1vdmUgYWxsIGJpbmQgYXJncyB0byBvbmUgYXJyYXkKKyAgICAgICAgaW50IGJpbmRBcmdzU2l6ZSA9ICh3aGVyZUFyZ3MgPT0gbnVsbCkgPyBzZXRWYWx1ZXNTaXplIDogKHNldFZhbHVlc1NpemUgKyB3aGVyZUFyZ3MubGVuZ3RoKTsKKyAgICAgICAgT2JqZWN0W10gYmluZEFyZ3MgPSBuZXcgT2JqZWN0W2JpbmRBcmdzU2l6ZV07CisgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgZm9yIChTdHJpbmcgY29sTmFtZSA6IHZhbHVlcy5rZXlTZXQoKSkgeworICAgICAgICAgICAgc3FsLmFwcGVuZCgoaSA+IDApID8gIiwiIDogIiIpOworICAgICAgICAgICAgc3FsLmFwcGVuZChjb2xOYW1lKTsKKyAgICAgICAgICAgIGJpbmRBcmdzW2krK10gPSB2YWx1ZXMuZ2V0KGNvbE5hbWUpOwogICAgICAgICAgICAgc3FsLmFwcGVuZCgiPT8iKTsKLSAgICAgICAgICAgIGlmIChlbnRyaWVzSXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBzcWwuYXBwZW5kKCIsICIpOworICAgICAgICB9CisgICAgICAgIGlmICh3aGVyZUFyZ3MgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChpID0gc2V0VmFsdWVzU2l6ZTsgaSA8IGJpbmRBcmdzU2l6ZTsgaSsrKSB7CisgICAgICAgICAgICAgICAgYmluZEFyZ3NbaV0gPSB3aGVyZUFyZ3NbaSAtIHNldFZhbHVlc1NpemVdOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0KICAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eSh3aGVyZUNsYXVzZSkpIHsKICAgICAgICAgICAgIHNxbC5hcHBlbmQoIiBXSEVSRSAiKTsKICAgICAgICAgICAgIHNxbC5hcHBlbmQod2hlcmVDbGF1c2UpOwogICAgICAgICB9CiAKLSAgICAgICAgbG9jaygpOwotICAgICAgICBpZiAoIWlzT3BlbigpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJkYXRhYmFzZSBub3Qgb3BlbiIpOwotICAgICAgICB9Ci0gICAgICAgIFNRTGl0ZVN0YXRlbWVudCBzdGF0ZW1lbnQgPSBudWxsOworICAgICAgICBTUUxpdGVTdGF0ZW1lbnQgc3RhdGVtZW50ID0gbmV3IFNRTGl0ZVN0YXRlbWVudCh0aGlzLCBzcWwudG9TdHJpbmcoKSwgYmluZEFyZ3MpOwogICAgICAgICB0cnkgewotICAgICAgICAgICAgc3RhdGVtZW50ID0gY29tcGlsZVN0YXRlbWVudChzcWwudG9TdHJpbmcoKSk7Ci0KLSAgICAgICAgICAgIC8vIEJpbmQgdGhlIHZhbHVlcwotICAgICAgICAgICAgaW50IHNpemUgPSBlbnRyeVNldC5zaXplKCk7Ci0gICAgICAgICAgICBlbnRyaWVzSXRlciA9IGVudHJ5U2V0Lml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICBpbnQgYmluZEFyZyA9IDE7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICAgICAgICAgIE1hcC5FbnRyeTxTdHJpbmcsIE9iamVjdD4gZW50cnkgPSBlbnRyaWVzSXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5iaW5kT2JqZWN0VG9Qcm9ncmFtKHN0YXRlbWVudCwgYmluZEFyZywgZW50cnkuZ2V0VmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgYmluZEFyZysrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAod2hlcmVBcmdzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzaXplID0gd2hlcmVBcmdzLmxlbmd0aDsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBzdGF0ZW1lbnQuYmluZFN0cmluZyhiaW5kQXJnLCB3aGVyZUFyZ3NbaV0pOwotICAgICAgICAgICAgICAgICAgICBiaW5kQXJnKys7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBSdW4gdGhlIHByb2dyYW0gYW5kIHRoZW4gY2xlYW51cAotICAgICAgICAgICAgc3RhdGVtZW50LmV4ZWN1dGUoKTsKLSAgICAgICAgICAgIGludCBudW1DaGFuZ2VkUm93cyA9IGxhc3RDaGFuZ2VDb3VudCgpOwotICAgICAgICAgICAgaWYgKENvbmZpZy5MT0dEICYmIExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLlZFUkJPU0UpKSB7Ci0gICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAiVXBkYXRlZCAiICsgbnVtQ2hhbmdlZFJvd3MgKyAiIHVzaW5nICIgKyB2YWx1ZXMgKyAiIGFuZCAiICsgc3FsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBudW1DaGFuZ2VkUm93czsKKyAgICAgICAgICAgIHJldHVybiBzdGF0ZW1lbnQuZXhlY3V0ZVVwZGF0ZURlbGV0ZSgpOwogICAgICAgICB9IGNhdGNoIChTUUxpdGVEYXRhYmFzZUNvcnJ1cHRFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgb25Db3JydXB0aW9uKCk7CiAgICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAiRXJyb3IgdXBkYXRpbmcgIiArIHZhbHVlcyArICIgdXNpbmcgIiArIHNxbCk7Ci0gICAgICAgICAgICB0aHJvdyBlOwogICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKHN0YXRlbWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc3RhdGVtZW50LmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB1bmxvY2soKTsKKyAgICAgICAgICAgIHN0YXRlbWVudC5jbG9zZSgpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogRXhlY3V0ZSBhIHNpbmdsZSBTUUwgc3RhdGVtZW50IHRoYXQgaXMgbm90IGEgcXVlcnkuIEZvciBleGFtcGxlLCBDUkVBVEUKLSAgICAgKiBUQUJMRSwgREVMRVRFLCBJTlNFUlQsIGV0Yy4gTXVsdGlwbGUgc3RhdGVtZW50cyBzZXBhcmF0ZWQgYnkgO3MgYXJlIG5vdAotICAgICAqIHN1cHBvcnRlZC4gaXQgdGFrZXMgYSB3cml0ZSBsb2NrCisgICAgICogRXhlY3V0ZSBhIHNpbmdsZSBTUUwgc3RhdGVtZW50IHRoYXQgaXMgTk9UIGEgU0VMRUNUCisgICAgICogb3IgYW55IG90aGVyIFNRTCBzdGF0ZW1lbnQgdGhhdCByZXR1cm5zIGRhdGEuCisgICAgICogPHA+CisgICAgICogSXQgaGFzIG5vIG1lYW5zIHRvIHJldHVybiBhbnkgZGF0YSAoc3VjaCBhcyB0aGUgbnVtYmVyIG9mIGFmZmVjdGVkIHJvd3MpLgorICAgICAqIEluc3RlYWQsIHlvdSdyZSBlbmNvdXJhZ2VkIHRvIHVzZSB7QGxpbmsgI2luc2VydChTdHJpbmcsIFN0cmluZywgQ29udGVudFZhbHVlcyl9LAorICAgICAqIHtAbGluayAjdXBkYXRlKFN0cmluZywgQ29udGVudFZhbHVlcywgU3RyaW5nLCBTdHJpbmdbXSl9LCBldCBhbCwgd2hlbiBwb3NzaWJsZS4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogV2hlbiB1c2luZyB7QGxpbmsgI2VuYWJsZVdyaXRlQWhlYWRMb2dnaW5nKCl9LCBqb3VybmFsX21vZGUgaXMKKyAgICAgKiBhdXRvbWF0aWNhbGx5IG1hbmFnZWQgYnkgdGhpcyBjbGFzcy4gU28sIGRvIG5vdCBzZXQgam91cm5hbF9tb2RlCisgICAgICogdXNpbmcgIlBSQUdNQSBqb3VybmFsX21vZGUnPHZhbHVlPiIgc3RhdGVtZW50IGlmIHlvdXIgYXBwIGlzIHVzaW5nCisgICAgICoge0BsaW5rICNlbmFibGVXcml0ZUFoZWFkTG9nZ2luZygpfQorICAgICAqIDwvcD4KICAgICAgKgorICAgICAqIEBwYXJhbSBzcWwgdGhlIFNRTCBzdGF0ZW1lbnQgdG8gYmUgZXhlY3V0ZWQuIE11bHRpcGxlIHN0YXRlbWVudHMgc2VwYXJhdGVkIGJ5IHNlbWljb2xvbnMgYXJlCisgICAgICogbm90IHN1cHBvcnRlZC4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbiBJZiB0aGUgU1FMIHN0cmluZyBpcyBpbnZhbGlkIGZvciBzb21lIHJlYXNvbgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGV4ZWNTUUwoU3RyaW5nIHNxbCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7Ci0gICAgICAgIEJsb2NrR3VhcmQuZ2V0VGhyZWFkUG9saWN5KCkub25Xcml0ZVRvRGlzaygpOworICAgICAgICBpbnQgc3RtdFR5cGUgPSBEYXRhYmFzZVV0aWxzLmdldFNxbFN0YXRlbWVudFR5cGUoc3FsKTsKKyAgICAgICAgaWYgKHN0bXRUeXBlID09IERhdGFiYXNlVXRpbHMuU1RBVEVNRU5UX0FUVEFDSCkgeworICAgICAgICAgICAgZGlzYWJsZVdyaXRlQWhlYWRMb2dnaW5nKCk7CisgICAgICAgIH0KICAgICAgICAgbG9uZyB0aW1lU3RhcnQgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKLSAgICAgICAgbG9jaygpOwotICAgICAgICBpZiAoIWlzT3BlbigpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJkYXRhYmFzZSBub3Qgb3BlbiIpOwotICAgICAgICB9CiAgICAgICAgIGxvZ1RpbWVTdGF0KG1MYXN0U3FsU3RhdGVtZW50LCB0aW1lU3RhcnQsIEdFVF9MT0NLX0xPR19QUkVGSVgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgbmF0aXZlX2V4ZWNTUUwoc3FsKTsKLSAgICAgICAgfSBjYXRjaCAoU1FMaXRlRGF0YWJhc2VDb3JydXB0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIG9uQ29ycnVwdGlvbigpOwotICAgICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHVubG9jaygpOwotICAgICAgICB9CisgICAgICAgIGV4ZWN1dGVTcWwoc3FsLCBudWxsKTsKIAogICAgICAgICAvLyBMb2cgY29tbWl0IHN0YXRlbWVudHMgYWxvbmcgd2l0aCB0aGUgbW9zdCByZWNlbnRseSBleGVjdXRlZAotICAgICAgICAvLyBTUUwgc3RhdGVtZW50IGZvciBkaXNhbWJpZ3VhdGlvbi4gIE5vdGUgdGhhdCBpbnN0YW5jZQotICAgICAgICAvLyBlcXVhbGl0eSB0byBDT01NSVRfU1FMIGlzIHNhZmUgaGVyZS4KLSAgICAgICAgaWYgKHNxbCA9PSBDT01NSVRfU1FMKSB7CisgICAgICAgIC8vIFNRTCBzdGF0ZW1lbnQgZm9yIGRpc2FtYmlndWF0aW9uLgorICAgICAgICBpZiAoc3RtdFR5cGUgPT0gRGF0YWJhc2VVdGlscy5TVEFURU1FTlRfQ09NTUlUKSB7CiAgICAgICAgICAgICBsb2dUaW1lU3RhdChtTGFzdFNxbFN0YXRlbWVudCwgdGltZVN0YXJ0LCBDT01NSVRfU1FMKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGxvZ1RpbWVTdGF0KHNxbCwgdGltZVN0YXJ0LCBudWxsKTsKQEAgLTE3NTksNjUgKzE4MDcsOTggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBFeGVjdXRlIGEgc2luZ2xlIFNRTCBzdGF0ZW1lbnQgdGhhdCBpcyBub3QgYSBxdWVyeS4gRm9yIGV4YW1wbGUsIENSRUFURQotICAgICAqIFRBQkxFLCBERUxFVEUsIElOU0VSVCwgZXRjLiBNdWx0aXBsZSBzdGF0ZW1lbnRzIHNlcGFyYXRlZCBieSA7cyBhcmUgbm90Ci0gICAgICogc3VwcG9ydGVkLiBpdCB0YWtlcyBhIHdyaXRlIGxvY2ssCisgICAgICogRXhlY3V0ZSBhIHNpbmdsZSBTUUwgc3RhdGVtZW50IHRoYXQgaXMgTk9UIGEgU0VMRUNUL0lOU0VSVC9VUERBVEUvREVMRVRFLgorICAgICAqIDxwPgorICAgICAqIEZvciBJTlNFUlQgc3RhdGVtZW50cywgdXNlIGFueSBvZiB0aGUgZm9sbG93aW5nIGluc3RlYWQuCisgICAgICogPHVsPgorICAgICAqICAgPGxpPntAbGluayAjaW5zZXJ0KFN0cmluZywgU3RyaW5nLCBDb250ZW50VmFsdWVzKX08L2xpPgorICAgICAqICAgPGxpPntAbGluayAjaW5zZXJ0T3JUaHJvdyhTdHJpbmcsIFN0cmluZywgQ29udGVudFZhbHVlcyl9PC9saT4KKyAgICAgKiAgIDxsaT57QGxpbmsgI2luc2VydFdpdGhPbkNvbmZsaWN0KFN0cmluZywgU3RyaW5nLCBDb250ZW50VmFsdWVzLCBpbnQpfTwvbGk+CisgICAgICogPC91bD4KKyAgICAgKiA8cD4KKyAgICAgKiBGb3IgVVBEQVRFIHN0YXRlbWVudHMsIHVzZSBhbnkgb2YgdGhlIGZvbGxvd2luZyBpbnN0ZWFkLgorICAgICAqIDx1bD4KKyAgICAgKiAgIDxsaT57QGxpbmsgI3VwZGF0ZShTdHJpbmcsIENvbnRlbnRWYWx1ZXMsIFN0cmluZywgU3RyaW5nW10pfTwvbGk+CisgICAgICogICA8bGk+e0BsaW5rICN1cGRhdGVXaXRoT25Db25mbGljdChTdHJpbmcsIENvbnRlbnRWYWx1ZXMsIFN0cmluZywgU3RyaW5nW10sIGludCl9PC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqIDxwPgorICAgICAqIEZvciBERUxFVEUgc3RhdGVtZW50cywgdXNlIGFueSBvZiB0aGUgZm9sbG93aW5nIGluc3RlYWQuCisgICAgICogPHVsPgorICAgICAqICAgPGxpPntAbGluayAjZGVsZXRlKFN0cmluZywgU3RyaW5nLCBTdHJpbmdbXSl9PC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqIDxwPgorICAgICAqIEZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIGFyZSBnb29kIGNhbmRpZGF0ZXMgZm9yIHVzaW5nIHRoaXMgbWV0aG9kOgorICAgICAqIDx1bD4KKyAgICAgKiAgIDxsaT5BTFRFUiBUQUJMRTwvbGk+CisgICAgICogICA8bGk+Q1JFQVRFIG9yIERST1AgdGFibGUgLyB0cmlnZ2VyIC8gdmlldyAvIGluZGV4IC8gdmlydHVhbCB0YWJsZTwvbGk+CisgICAgICogICA8bGk+UkVJTkRFWDwvbGk+CisgICAgICogICA8bGk+UkVMRUFTRTwvbGk+CisgICAgICogICA8bGk+U0FWRVBPSU5UPC9saT4KKyAgICAgKiAgIDxsaT5QUkFHTUEgdGhhdCByZXR1cm5zIG5vIGRhdGE8L2xpPgorICAgICAqIDwvdWw+CisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqIFdoZW4gdXNpbmcge0BsaW5rICNlbmFibGVXcml0ZUFoZWFkTG9nZ2luZygpfSwgam91cm5hbF9tb2RlIGlzCisgICAgICogYXV0b21hdGljYWxseSBtYW5hZ2VkIGJ5IHRoaXMgY2xhc3MuIFNvLCBkbyBub3Qgc2V0IGpvdXJuYWxfbW9kZQorICAgICAqIHVzaW5nICJQUkFHTUEgam91cm5hbF9tb2RlJzx2YWx1ZT4iIHN0YXRlbWVudCBpZiB5b3VyIGFwcCBpcyB1c2luZworICAgICAqIHtAbGluayAjZW5hYmxlV3JpdGVBaGVhZExvZ2dpbmcoKX0KKyAgICAgKiA8L3A+CiAgICAgICoKLSAgICAgKiBAcGFyYW0gc3FsCisgICAgICogQHBhcmFtIHNxbCB0aGUgU1FMIHN0YXRlbWVudCB0byBiZSBleGVjdXRlZC4gTXVsdGlwbGUgc3RhdGVtZW50cyBzZXBhcmF0ZWQgYnkgc2VtaWNvbG9ucyBhcmUKKyAgICAgKiBub3Qgc3VwcG9ydGVkLgogICAgICAqIEBwYXJhbSBiaW5kQXJncyBvbmx5IGJ5dGVbXSwgU3RyaW5nLCBMb25nIGFuZCBEb3VibGUgYXJlIHN1cHBvcnRlZCBpbiBiaW5kQXJncy4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbiBJZiB0aGUgU1FMIHN0cmluZyBpcyBpbnZhbGlkIGZvciBzb21lIHJlYXNvbgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGV4ZWNTUUwoU3RyaW5nIHNxbCwgT2JqZWN0W10gYmluZEFyZ3MpIHRocm93cyBTUUxFeGNlcHRpb24gewotICAgICAgICBCbG9ja0d1YXJkLmdldFRocmVhZFBvbGljeSgpLm9uV3JpdGVUb0Rpc2soKTsKICAgICAgICAgaWYgKGJpbmRBcmdzID09IG51bGwpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkVtcHR5IGJpbmRBcmdzIik7CiAgICAgICAgIH0KKyAgICAgICAgZXhlY3V0ZVNxbChzcWwsIGJpbmRBcmdzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZXhlY3V0ZVNxbChTdHJpbmcgc3FsLCBPYmplY3RbXSBiaW5kQXJncykgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CiAgICAgICAgIGxvbmcgdGltZVN0YXJ0ID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCk7Ci0gICAgICAgIGxvY2soKTsKLSAgICAgICAgaWYgKCFpc09wZW4oKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZGF0YWJhc2Ugbm90IG9wZW4iKTsKLSAgICAgICAgfQotICAgICAgICBTUUxpdGVTdGF0ZW1lbnQgc3RhdGVtZW50ID0gbnVsbDsKKyAgICAgICAgU1FMaXRlU3RhdGVtZW50IHN0YXRlbWVudCA9IG5ldyBTUUxpdGVTdGF0ZW1lbnQodGhpcywgc3FsLCBiaW5kQXJncyk7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzdGF0ZW1lbnQgPSBjb21waWxlU3RhdGVtZW50KHNxbCk7Ci0gICAgICAgICAgICBpZiAoYmluZEFyZ3MgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGludCBudW1BcmdzID0gYmluZEFyZ3MubGVuZ3RoOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQXJnczsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuYmluZE9iamVjdFRvUHJvZ3JhbShzdGF0ZW1lbnQsIGkgKyAxLCBiaW5kQXJnc1tpXSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3RhdGVtZW50LmV4ZWN1dGUoKTsKKyAgICAgICAgICAgIHN0YXRlbWVudC5leGVjdXRlVXBkYXRlRGVsZXRlKCk7CiAgICAgICAgIH0gY2F0Y2ggKFNRTGl0ZURhdGFiYXNlQ29ycnVwdEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICBvbkNvcnJ1cHRpb24oKTsKICAgICAgICAgICAgIHRocm93IGU7CiAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoc3RhdGVtZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzdGF0ZW1lbnQuY2xvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHVubG9jaygpOworICAgICAgICAgICAgc3RhdGVtZW50LmNsb3NlKCk7CiAgICAgICAgIH0KICAgICAgICAgbG9nVGltZVN0YXQoc3FsLCB0aW1lU3RhcnQpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkgewotICAgICAgICBpZiAoaXNPcGVuKCkpIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywgImNsb3NlKCkgd2FzIG5ldmVyIGV4cGxpY2l0bHkgY2FsbGVkIG9uIGRhdGFiYXNlICciICsKLSAgICAgICAgICAgICAgICAgICAgbVBhdGggKyAiJyAiLCBtU3RhY2tUcmFjZSk7Ci0gICAgICAgICAgICBjbG9zZUNsb3NhYmxlKCk7Ci0gICAgICAgICAgICBvbkFsbFJlZmVyZW5jZXNSZWxlYXNlZCgpOworICAgIHByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoaXNPcGVuKCkpIHsKKyAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJjbG9zZSgpIHdhcyBuZXZlciBleHBsaWNpdGx5IGNhbGxlZCBvbiBkYXRhYmFzZSAnIiArCisgICAgICAgICAgICAgICAgICAgICAgICBtUGF0aCArICInICIsIG1TdGFja1RyYWNlKTsKKyAgICAgICAgICAgICAgICBjbG9zZUNsb3NhYmxlKCk7CisgICAgICAgICAgICAgICAgb25BbGxSZWZlcmVuY2VzUmVsZWFzZWQoKTsKKyAgICAgICAgICAgICAgICByZWxlYXNlQ3VzdG9tRnVuY3Rpb25zKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBzdXBlci5maW5hbGl6ZSgpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUHJpdmF0ZSBjb25zdHJ1Y3Rvci4gU2VlIHtAbGluayAjY3JlYXRlfSBhbmQge0BsaW5rICNvcGVuRGF0YWJhc2V9LgorICAgICAqIFByaXZhdGUgY29uc3RydWN0b3IuCiAgICAgICoKICAgICAgKiBAcGFyYW0gcGF0aCBUaGUgZnVsbCBwYXRoIHRvIHRoZSBkYXRhYmFzZQogICAgICAqIEBwYXJhbSBmYWN0b3J5IFRoZSBmYWN0b3J5IHRvIHVzZSB3aGVuIGNyZWF0aW5nIGN1cnNvcnMsIG1heSBiZSBOVUxMLgogICAgICAqIEBwYXJhbSBmbGFncyAwIG9yIHtAbGluayAjTk9fTE9DQUxJWkVEX0NPTExBVE9SU30uICBJZiB0aGUgZGF0YWJhc2UgZmlsZSBhbHJlYWR5CiAgICAgICogICAgICAgICAgICAgIGV4aXN0cywgbUZsYWdzIHdpbGwgYmUgdXBkYXRlZCBhcHByb3ByaWF0ZWx5LgorICAgICAqIEBwYXJhbSBlcnJvckhhbmRsZXIgVGhlIHtAbGluayBEYXRhYmFzZUVycm9ySGFuZGxlcn0gdG8gYmUgdXNlZCB3aGVuIHNxbGl0ZSByZXBvcnRzIGRhdGFiYXNlCisgICAgICogY29ycnVwdGlvbi4gbWF5IGJlIE5VTEwuCisgICAgICogQHBhcmFtIGNvbm5lY3Rpb25OdW0gMCBmb3IgbWFpbiBkYXRhYmFzZSBjb25uZWN0aW9uIGhhbmRsZS4gMS4uTiBmb3IgcG9vbGVkIGRhdGFiYXNlCisgICAgICogY29ubmVjdGlvbiBoYW5kbGVzLgogICAgICAqLwotICAgIHByaXZhdGUgU1FMaXRlRGF0YWJhc2UoU3RyaW5nIHBhdGgsIEN1cnNvckZhY3RvcnkgZmFjdG9yeSwgaW50IGZsYWdzKSB7CisgICAgcHJpdmF0ZSBTUUxpdGVEYXRhYmFzZShTdHJpbmcgcGF0aCwgQ3Vyc29yRmFjdG9yeSBmYWN0b3J5LCBpbnQgZmxhZ3MsCisgICAgICAgICAgICBEYXRhYmFzZUVycm9ySGFuZGxlciBlcnJvckhhbmRsZXIsIHNob3J0IGNvbm5lY3Rpb25OdW0pIHsKICAgICAgICAgaWYgKHBhdGggPT0gbnVsbCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicGF0aCBzaG91bGQgbm90IGJlIG51bGwiKTsKICAgICAgICAgfQpAQCAtMTgyNiwyNSArMTkwNywxMSBAQAogICAgICAgICBtU2xvd1F1ZXJ5VGhyZXNob2xkID0gU3lzdGVtUHJvcGVydGllcy5nZXRJbnQoTE9HX1NMT1dfUVVFUklFU19QUk9QRVJUWSwgLTEpOwogICAgICAgICBtU3RhY2tUcmFjZSA9IG5ldyBEYXRhYmFzZU9iamVjdE5vdENsb3NlZEV4Y2VwdGlvbigpLmZpbGxJblN0YWNrVHJhY2UoKTsKICAgICAgICAgbUZhY3RvcnkgPSBmYWN0b3J5OwotICAgICAgICBkYm9wZW4obVBhdGgsIG1GbGFncyk7Ci0gICAgICAgIGlmIChTUUxpdGVEZWJ1Zy5ERUJVR19TUUxfQ0FDSEUpIHsKLSAgICAgICAgICAgIG1UaW1lT3BlbmVkID0gZ2V0VGltZSgpOwotICAgICAgICB9CiAgICAgICAgIG1Qcm9ncmFtcyA9IG5ldyBXZWFrSGFzaE1hcDxTUUxpdGVDbG9zYWJsZSxPYmplY3Q+KCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzZXRMb2NhbGUoTG9jYWxlLmdldERlZmF1bHQoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAiRmFpbGVkIHRvIHNldExvY2FsZSgpIHdoZW4gY29uc3RydWN0aW5nLCBjbG9zaW5nIHRoZSBkYXRhYmFzZSIsIGUpOwotICAgICAgICAgICAgZGJjbG9zZSgpOwotICAgICAgICAgICAgaWYgKFNRTGl0ZURlYnVnLkRFQlVHX1NRTF9DQUNIRSkgewotICAgICAgICAgICAgICAgIG1UaW1lQ2xvc2VkID0gZ2V0VGltZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldFRpbWUoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgieXl5eS1NTS1kZCBISDptbTpzcy5TU1MgIikuZm9ybWF0KFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKKyAgICAgICAgLy8gU2V0IHRoZSBEYXRhYmFzZUVycm9ySGFuZGxlciB0byBiZSB1c2VkIHdoZW4gU1FMaXRlIHJlcG9ydHMgY29ycnVwdGlvbi4KKyAgICAgICAgLy8gSWYgdGhlIGNhbGxlciBzZXRzIGVycm9ySGFuZGxlciA9IG51bGwsIHRoZW4gdXNlIGRlZmF1bHQgZXJyb3JoYW5kbGVyLgorICAgICAgICBtRXJyb3JIYW5kbGVyID0gKGVycm9ySGFuZGxlciA9PSBudWxsKSA/IG5ldyBEZWZhdWx0RGF0YWJhc2VFcnJvckhhbmRsZXIoKSA6IGVycm9ySGFuZGxlcjsKKyAgICAgICAgbUNvbm5lY3Rpb25OdW0gPSBjb25uZWN0aW9uTnVtOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTkwMSw3ICsxOTY4LDcgQEAKICAgICAgICAgfQogICAgICAgICBpZiAoZHVyYXRpb25NaWxsaXMgPj0gc1F1ZXJ5TG9nVGltZUluTWlsbGlzKSB7CiAgICAgICAgICAgICBzYW1wbGVQZXJjZW50ID0gMTAwOwotICAgICAgICB9IGVsc2UgezsKKyAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHNhbXBsZVBlcmNlbnQgPSAoaW50KSAoMTAwICogZHVyYXRpb25NaWxsaXMgLyBzUXVlcnlMb2dUaW1lSW5NaWxsaXMpICsgMTsKICAgICAgICAgICAgIGlmIChtUmFuZG9tLm5leHRJbnQoMTAwKSA+PSBzYW1wbGVQZXJjZW50KSByZXR1cm47CiAgICAgICAgIH0KQEAgLTE5NzAsNiArMjAzNywyMCBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgLyogcGFja2FnZSAqLyB2b2lkIHZlcmlmeURiSXNPcGVuKCkgeworICAgICAgICBpZiAoIWlzT3BlbigpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJkYXRhYmFzZSAiICsgZ2V0UGF0aCgpICsgIiAoY29ubiMgIiArCisgICAgICAgICAgICAgICAgICAgIG1Db25uZWN0aW9uTnVtICsgIikgYWxyZWFkeSBjbG9zZWQiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIHBhY2thZ2UgKi8gdm9pZCB2ZXJpZnlMb2NrT3duZXIoKSB7CisgICAgICAgIHZlcmlmeURiSXNPcGVuKCk7CisgICAgICAgIGlmIChtTG9ja2luZ0VuYWJsZWQgJiYgIWlzRGJMb2NrZWRCeUN1cnJlbnRUaHJlYWQoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiRG9uJ3QgaGF2ZSBkYXRhYmFzZSBsb2NrISIpOworICAgICAgICB9CisgICAgfQorCiAgICAgLyoKICAgICAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgICoKQEAgLTE5NzcsNTkgKzIwNTgsNDUgQEAKICAgICAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgICovCiAgICAgLyoqCi0gICAgICogYWRkcyB0aGUgZ2l2ZW4gc3FsIGFuZCBpdHMgY29tcGlsZWQtc3RhdGVtZW50LWlkLXJldHVybmVkLWJ5LXNxbGl0ZSB0byB0aGUKKyAgICAgKiBBZGRzIHRoZSBnaXZlbiBTUUwgYW5kIGl0cyBjb21waWxlZC1zdGF0ZW1lbnQtaWQtcmV0dXJuZWQtYnktc3FsaXRlIHRvIHRoZQogICAgICAqIGNhY2hlIG9mIGNvbXBpbGVkUXVlcmllcyBhdHRhY2hlZCB0byAndGhpcycuCi0gICAgICoKLSAgICAgKiBpZiB0aGVyZSBpcyBhbHJlYWR5IGEge0BsaW5rIFNRTGl0ZUNvbXBpbGVkU3FsfSBpbiBjb21waWxlZFF1ZXJpZXMgZm9yIHRoZSBnaXZlbiBzcWwsCisgICAgICogPHA+CisgICAgICogSWYgdGhlcmUgaXMgYWxyZWFkeSBhIHtAbGluayBTUUxpdGVDb21waWxlZFNxbH0gaW4gY29tcGlsZWRRdWVyaWVzIGZvciB0aGUgZ2l2ZW4gU1FMLAogICAgICAqIHRoZSBuZXcge0BsaW5rIFNRTGl0ZUNvbXBpbGVkU3FsfSBvYmplY3QgaXMgTk9UIGluc2VydGVkIGludG8gdGhlIGNhY2hlIChpLmUuLHRoZSBjdXJyZW50CiAgICAgICogbWFwcGluZyBpcyBOT1QgcmVwbGFjZWQgd2l0aCB0aGUgbmV3IG1hcHBpbmcpLgogICAgICAqLwogICAgIC8qIHBhY2thZ2UgKi8gdm9pZCBhZGRUb0NvbXBpbGVkUXVlcmllcyhTdHJpbmcgc3FsLCBTUUxpdGVDb21waWxlZFNxbCBjb21waWxlZFN0YXRlbWVudCkgewotICAgICAgICBpZiAobU1heFNxbENhY2hlU2l6ZSA9PSAwKSB7Ci0gICAgICAgICAgICAvLyBmb3IgdGhpcyBkYXRhYmFzZSwgdGhlcmUgaXMgbm8gY2FjaGUgb2YgY29tcGlsZWQgc3FsLgotICAgICAgICAgICAgaWYgKFNRTGl0ZURlYnVnLkRFQlVHX1NRTF9DQUNIRSkgewotICAgICAgICAgICAgICAgIExvZy52KFRBRywgInxOT1QgYWRkaW5nX3NxbF90b19jYWNoZXwiICsgZ2V0UGF0aCgpICsgInwiICsgc3FsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIFNRTGl0ZUNvbXBpbGVkU3FsIGNvbXBpbGVkU3FsID0gbnVsbDsKICAgICAgICAgc3luY2hyb25pemVkKG1Db21waWxlZFF1ZXJpZXMpIHsKICAgICAgICAgICAgIC8vIGRvbid0IGluc2VydCB0aGUgbmV3IG1hcHBpbmcgaWYgYSBtYXBwaW5nIGFscmVhZHkgZXhpc3RzCi0gICAgICAgICAgICBjb21waWxlZFNxbCA9IG1Db21waWxlZFF1ZXJpZXMuZ2V0KHNxbCk7Ci0gICAgICAgICAgICBpZiAoY29tcGlsZWRTcWwgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKG1Db21waWxlZFF1ZXJpZXMuY29udGFpbnNLZXkoc3FsKSkgewogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIGFkZCB0aGlzIDxzcWwsIGNvbXBpbGVkU3RhdGVtZW50PiB0byB0aGUgY2FjaGUKKwogICAgICAgICAgICAgaWYgKG1Db21waWxlZFF1ZXJpZXMuc2l6ZSgpID09IG1NYXhTcWxDYWNoZVNpemUpIHsKICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAqIGNhY2hlIHNpemUgb2Yge0BsaW5rICNtTWF4U3FsQ2FjaGVTaXplfSBpcyBub3QgZW5vdWdoIGZvciB0aGlzIGFwcC4KLSAgICAgICAgICAgICAgICAgKiBsb2cgYSB3YXJuaW5nIE1BWF9XQVJOSU5HU19PTl9DQUNIRVNJWkVfQ09ORElUSU9OIHRpbWVzCi0gICAgICAgICAgICAgICAgICogY2hhbmNlcyBhcmUgaXQgaXMgTk9UIHVzaW5nID8gZm9yIGJpbmRhcmdzIC0gc28gY2FjaGluZyBpcyB1c2VsZXNzLgotICAgICAgICAgICAgICAgICAqIFRPRE86IGVpdGhlciBsZXQgdGhlIGNhbGxlcnMgc2V0IG1heCBjY2hlc2l6ZSBmb3IgdGhlaXIgYXBwLCBvciBpbnRlbGxpZ2VudGx5Ci0gICAgICAgICAgICAgICAgICogZmlndXJlIG91dCB3aGF0IHNob3VsZCBiZSBjYWNoZWQgZm9yIGEgZ2l2ZW4gYXBwLgorICAgICAgICAgICAgICAgICAqIGxvZyBhIHdhcm5pbmcuCisgICAgICAgICAgICAgICAgICogY2hhbmNlcyBhcmUgaXQgaXMgTk9UIHVzaW5nID8gZm9yIGJpbmRhcmdzIC0gb3IgY2FjaGVzaXplIGlzIHRvbyBzbWFsbC4KICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICBpZiAoKyttQ2FjaGVGdWxsV2FybmluZ3MgPT0gTUFYX1dBUk5JTkdTX09OX0NBQ0hFU0laRV9DT05ESVRJT04pIHsKICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiUmVhY2hlZCBNQVggc2l6ZSBmb3IgY29tcGlsZWQtc3FsIHN0YXRlbWVudCBjYWNoZSBmb3IgZGF0YWJhc2UgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UGF0aCgpICsgIjsgaS5lLiwgTk8gc3BhY2UgZm9yIHRoaXMgc3FsIHN0YXRlbWVudCBpbiBjYWNoZTogIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3FsICsgIi4gUGxlYXNlIGNoYW5nZSB5b3VyIHNxbCBzdGF0ZW1lbnRzIHRvIHVzZSAnPycgZm9yICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiaW5kYXJncywgaW5zdGVhZCBvZiB1c2luZyBhY3R1YWwgdmFsdWVzIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UGF0aCgpICsgIi4gQ29uc2lkZXIgaW5jcmVhc2luZyBjYWNoZXNpemUuIik7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIGRvbid0IGFkZCB0aGlzIGVudHJ5IHRvIGNhY2hlCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIGNhY2hlIGlzIE5PVCBmdWxsLiBhZGQgdGhpcyB0byBjYWNoZS4KLSAgICAgICAgICAgICAgICBtQ29tcGlsZWRRdWVyaWVzLnB1dChzcWwsIGNvbXBpbGVkU3RhdGVtZW50KTsKLSAgICAgICAgICAgICAgICBpZiAoU1FMaXRlRGVidWcuREVCVUdfU1FMX0NBQ0hFKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy52KFRBRywgInxhZGRpbmdfc3FsX3RvX2NhY2hlfCIgKyBnZXRQYXRoKCkgKyAifCIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db21waWxlZFF1ZXJpZXMuc2l6ZSgpICsgInwiICsgc3FsKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IAorICAgICAgICAgICAgLyogYWRkIHRoZSBnaXZlbiBTUUxpdGVDb21waWxlZFNxbCBjb21waWxlZFN0YXRlbWVudCB0byBjYWNoZS4KKyAgICAgICAgICAgICAqIG5vIG5lZWQgdG8gd29ycnkgYWJvdXQgdGhlIGNhY2hlIHNpemUgLSBiZWNhdXNlIHtAbGluayAjbUNvbXBpbGVkUXVlcmllc30KKyAgICAgICAgICAgICAqIHNlbGYtbGltaXRzIGl0cyBzaXplIHRvIHtAbGluayAjbU1heFNxbENhY2hlU2l6ZX0uCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIG1Db21waWxlZFF1ZXJpZXMucHV0KHNxbCwgY29tcGlsZWRTdGF0ZW1lbnQpOworICAgICAgICAgICAgaWYgKFNRTGl0ZURlYnVnLkRFQlVHX1NRTF9DQUNIRSkgeworICAgICAgICAgICAgICAgIExvZy52KFRBRywgInxhZGRpbmdfc3FsX3RvX2NhY2hlfCIgKyBnZXRQYXRoKCkgKyAifCIgKworICAgICAgICAgICAgICAgICAgICAgICAgbUNvbXBpbGVkUXVlcmllcy5zaXplKCkgKyAifCIgKyBzcWwpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIHJldHVybjsKICAgICB9CiAKLQotICAgIHByaXZhdGUgdm9pZCBkZWFsbG9jQ2FjaGVkU3FsU3RhdGVtZW50cygpIHsKKyAgICAvKiogcGFja2FnZS1sZXZlbCBhY2Nlc3MgZm9yIHRlc3RpbmcgcHVycG9zZXMgKi8KKyAgICAvKiBwYWNrYWdlICovIHZvaWQgZGVhbGxvY0NhY2hlZFNxbFN0YXRlbWVudHMoKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAobUNvbXBpbGVkUXVlcmllcykgewogICAgICAgICAgICAgZm9yIChTUUxpdGVDb21waWxlZFNxbCBjb21waWxlZFNxbCA6IG1Db21waWxlZFF1ZXJpZXMudmFsdWVzKCkpIHsKICAgICAgICAgICAgICAgICBjb21waWxlZFNxbC5yZWxlYXNlU3FsU3RhdGVtZW50KCk7CkBAIC0yMDM5LDIwICsyMTA2LDEzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogZnJvbSB0aGUgY29tcGlsZWRRdWVyaWVzIGNhY2hlLCByZXR1cm5zIHRoZSBjb21waWxlZC1zdGF0ZW1lbnQtaWQgZm9yIHRoZSBnaXZlbiBzcWwuCi0gICAgICogcmV0dXJucyBudWxsLCBpZiBub3QgZm91bmQgaW4gdGhlIGNhY2hlLgorICAgICAqIEZyb20gdGhlIGNvbXBpbGVkUXVlcmllcyBjYWNoZSwgcmV0dXJucyB0aGUgY29tcGlsZWQtc3RhdGVtZW50LWlkIGZvciB0aGUgZ2l2ZW4gU1FMLgorICAgICAqIFJldHVybnMgbnVsbCwgaWYgbm90IGZvdW5kIGluIHRoZSBjYWNoZS4KICAgICAgKi8KICAgICAvKiBwYWNrYWdlICovIFNRTGl0ZUNvbXBpbGVkU3FsIGdldENvbXBpbGVkU3RhdGVtZW50Rm9yU3FsKFN0cmluZyBzcWwpIHsKICAgICAgICAgU1FMaXRlQ29tcGlsZWRTcWwgY29tcGlsZWRTdGF0ZW1lbnQgPSBudWxsOwogICAgICAgICBib29sZWFuIGNhY2hlSGl0OwogICAgICAgICBzeW5jaHJvbml6ZWQobUNvbXBpbGVkUXVlcmllcykgewotICAgICAgICAgICAgaWYgKG1NYXhTcWxDYWNoZVNpemUgPT0gMCkgewotICAgICAgICAgICAgICAgIC8vIGZvciB0aGlzIGRhdGFiYXNlLCB0aGVyZSBpcyBubyBjYWNoZSBvZiBjb21waWxlZCBzcWwuCi0gICAgICAgICAgICAgICAgaWYgKFNRTGl0ZURlYnVnLkRFQlVHX1NRTF9DQUNIRSkgewotICAgICAgICAgICAgICAgICAgICBMb2cudihUQUcsICJ8Y2FjaGUgTk9UIGZvdW5kfCIgKyBnZXRQYXRoKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNhY2hlSGl0ID0gKGNvbXBpbGVkU3RhdGVtZW50ID0gbUNvbXBpbGVkUXVlcmllcy5nZXQoc3FsKSkgIT0gbnVsbDsKICAgICAgICAgfQogICAgICAgICBpZiAoY2FjaGVIaXQpIHsKQEAgLTIwNjUsNjMgKzIxMjUsMjQgQEAKICAgICAgICAgICAgIExvZy52KFRBRywgInxjYWNoZV9zdGF0c3wiICsKICAgICAgICAgICAgICAgICAgICAgZ2V0UGF0aCgpICsgInwiICsgbUNvbXBpbGVkUXVlcmllcy5zaXplKCkgKwogICAgICAgICAgICAgICAgICAgICAifCIgKyBtTnVtQ2FjaGVIaXRzICsgInwiICsgbU51bUNhY2hlTWlzc2VzICsKLSAgICAgICAgICAgICAgICAgICAgInwiICsgY2FjaGVIaXQgKyAifCIgKyBtVGltZU9wZW5lZCArICJ8IiArIG1UaW1lQ2xvc2VkICsgInwiICsgc3FsKTsKKyAgICAgICAgICAgICAgICAgICAgInwiICsgY2FjaGVIaXQgKyAifCIgKyBzcWwpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBjb21waWxlZFN0YXRlbWVudDsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiByZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIHNxbCBpcyBjYWNoZWQgaW4gY29tcGlsZWQtc3FsIGNhY2hlLgotICAgICAqIEBoaWRlCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNJbkNvbXBpbGVkU3FsQ2FjaGUoU3RyaW5nIHNxbCkgewotICAgICAgICBzeW5jaHJvbml6ZWQobUNvbXBpbGVkUXVlcmllcykgewotICAgICAgICAgICAgcmV0dXJuIG1Db21waWxlZFF1ZXJpZXMuY29udGFpbnNLZXkoc3FsKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIHB1cmdlcyB0aGUgZ2l2ZW4gc3FsIGZyb20gdGhlIGNvbXBpbGVkLXNxbCBjYWNoZS4KLSAgICAgKiBAaGlkZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHB1cmdlRnJvbUNvbXBpbGVkU3FsQ2FjaGUoU3RyaW5nIHNxbCkgewotICAgICAgICBzeW5jaHJvbml6ZWQobUNvbXBpbGVkUXVlcmllcykgewotICAgICAgICAgICAgbUNvbXBpbGVkUXVlcmllcy5yZW1vdmUoc3FsKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIHJlbW92ZSBldmVyeXRoaW5nIGZyb20gdGhlIGNvbXBpbGVkIHNxbCBjYWNoZQotICAgICAqIEBoaWRlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVzZXRDb21waWxlZFNxbENhY2hlKCkgewotICAgICAgICBzeW5jaHJvbml6ZWQobUNvbXBpbGVkUXVlcmllcykgewotICAgICAgICAgICAgbUNvbXBpbGVkUXVlcmllcy5jbGVhcigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogcmV0dXJuIHRoZSBjdXJyZW50IG1heENhY2hlU3FsQ2FjaGVTaXplCi0gICAgICogQGhpZGUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGludCBnZXRNYXhTcWxDYWNoZVNpemUoKSB7Ci0gICAgICAgIHJldHVybiBtTWF4U3FsQ2FjaGVTaXplOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHNldCB0aGUgbWF4IHNpemUgb2YgdGhlIGNvbXBpbGVkIHNxbCBjYWNoZSBmb3IgdGhpcyBkYXRhYmFzZSBhZnRlciBwdXJnaW5nIHRoZSBjYWNoZS4KKyAgICAgKiBTZXRzIHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIHByZXBhcmVkLXN0YXRlbWVudCBjYWNoZSBmb3IgdGhpcyBkYXRhYmFzZS4KICAgICAgKiAoc2l6ZSBvZiB0aGUgY2FjaGUgPSBudW1iZXIgb2YgY29tcGlsZWQtc3FsLXN0YXRlbWVudHMgc3RvcmVkIGluIHRoZSBjYWNoZSkuCisgICAgICo8cD4KKyAgICAgKiBNYXhpbXVtIGNhY2hlIHNpemUgY2FuIE9OTFkgYmUgaW5jcmVhc2VkIGZyb20gaXRzIGN1cnJlbnQgc2l6ZSAoZGVmYXVsdCA9IDEwKS4KKyAgICAgKiBJZiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgd2l0aCBzbWFsbGVyIHNpemUgdGhhbiB0aGUgY3VycmVudCBtYXhpbXVtIHZhbHVlLAorICAgICAqIHRoZW4gSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlzIHRocm93bi4KKyAgICAgKjxwPgorICAgICAqIFRoaXMgbWV0aG9kIGlzIHRocmVhZC1zYWZlLgogICAgICAqCi0gICAgICogbWF4IGNhY2hlIHNpemUgY2FuIE9OTFkgYmUgaW5jcmVhc2VkIGZyb20gaXRzIGN1cnJlbnQgc2l6ZSAoZGVmYXVsdCA9IDApLgotICAgICAqIGlmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aXRoIHNtYWxsZXIgc2l6ZSB0aGFuIHRoZSBjdXJyZW50IHZhbHVlIG9mIG1NYXhTcWxDYWNoZVNpemUsCi0gICAgICogdGhlbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaXMgdGhyb3duCi0gICAgICoKLSAgICAgKiBzeW5jaHJvbml6ZWQgYmVjYXVzZSB3ZSBkb24ndCB3YW50IHQgdGhyZWFkcyB0byBjaGFuZ2UgY2FjaGUgc2l6ZSBhdCB0aGUgc2FtZSB0aW1lLgotICAgICAqIEBwYXJhbSBjYWNoZVNpemUgdGhlIHNpemUgb2YgdGhlIGNhY2hlLiBjYW4gYmUgKDAgdG8gTUFYX1NRTF9DQUNIRV9TSVpFKQotICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIGlucHV0IGNhY2hlU2l6ZSA+IE1BWF9TUUxfQ0FDSEVfU0laRSBvciA8IDAgb3IKLSAgICAgKiA8IHRoZSB2YWx1ZSBzZXQgd2l0aCBwcmV2aW91cyBzZXRNYXhTcWxDYWNoZVNpemUoKSBjYWxsLgotICAgICAqCi0gICAgICogQGhpZGUKKyAgICAgKiBAcGFyYW0gY2FjaGVTaXplIHRoZSBzaXplIG9mIHRoZSBjYWNoZS4gY2FuIGJlICgwIHRvIHtAbGluayAjTUFYX1NRTF9DQUNIRV9TSVpFfSkKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiBpbnB1dCBjYWNoZVNpemUgPiB7QGxpbmsgI01BWF9TUUxfQ0FDSEVfU0laRX0gb3IKKyAgICAgKiA+IHRoZSB2YWx1ZSBzZXQgd2l0aCBwcmV2aW91cyBzZXRNYXhTcWxDYWNoZVNpemUoKSBjYWxsLgogICAgICAqLwogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRNYXhTcWxDYWNoZVNpemUoaW50IGNhY2hlU2l6ZSkgewogICAgICAgICBpZiAoY2FjaGVTaXplID4gTUFYX1NRTF9DQUNIRV9TSVpFIHx8IGNhY2hlU2l6ZSA8IDApIHsKQEAgLTIxMzMsNjAgKzIxNTQsMzA0IEBACiAgICAgICAgIG1NYXhTcWxDYWNoZVNpemUgPSBjYWNoZVNpemU7CiAgICAgfQogCi0gICAgc3RhdGljIGNsYXNzIEFjdGl2ZURhdGFiYXNlcyB7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEFjdGl2ZURhdGFiYXNlcyBhY3RpdmVEYXRhYmFzZXMgPSBuZXcgQWN0aXZlRGF0YWJhc2VzKCk7Ci0gICAgICAgIHByaXZhdGUgSGFzaFNldDxXZWFrUmVmZXJlbmNlPFNRTGl0ZURhdGFiYXNlPj4gbUFjdGl2ZURhdGFiYXNlcyA9Ci0gICAgICAgICAgICBuZXcgSGFzaFNldDxXZWFrUmVmZXJlbmNlPFNRTGl0ZURhdGFiYXNlPj4oKTsKLSAgICAgICAgcHJpdmF0ZSBBY3RpdmVEYXRhYmFzZXMoKSB7fSAvLyBkaXNhYmxlIGluc3RhbnRpYXRpb24gb2YgdGhpcyBjbGFzcwotICAgICAgICBzdGF0aWMgQWN0aXZlRGF0YWJhc2VzIGdldEluc3RhbmNlKCkge3JldHVybiBhY3RpdmVEYXRhYmFzZXM7fQorICAgIC8qIHBhY2thZ2UgKi8gYm9vbGVhbiBpc1NxbEluU3RhdGVtZW50Q2FjaGUoU3RyaW5nIHNxbCkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKG1Db21waWxlZFF1ZXJpZXMpIHsKKyAgICAgICAgICAgIHJldHVybiBtQ29tcGlsZWRRdWVyaWVzLmNvbnRhaW5zS2V5KHNxbCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBwYWNrYWdlICovIHZvaWQgZmluYWxpemVTdGF0ZW1lbnRMYXRlcihpbnQgaWQpIHsKKyAgICAgICAgaWYgKCFpc09wZW4oKSkgeworICAgICAgICAgICAgLy8gZGF0YWJhc2UgYWxyZWFkeSBjbG9zZWQuIHRoaXMgc3RhdGVtZW50IHdpbGwgYWxyZWFkeSBoYXZlIGJlZW4gZmluYWxpemVkLgorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHN5bmNocm9uaXplZChtQ2xvc2VkU3RhdGVtZW50SWRzKSB7CisgICAgICAgICAgICBpZiAobUNsb3NlZFN0YXRlbWVudElkcy5jb250YWlucyhpZCkpIHsKKyAgICAgICAgICAgICAgICAvLyB0aGlzIHN0YXRlbWVudCBpZCBpcyBhbHJlYWR5IHF1ZXVlZCB1cCBmb3IgZmluYWxpemF0aW9uLgorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1DbG9zZWRTdGF0ZW1lbnRJZHMuYWRkKGlkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIHBhY2thZ2UgKi8gdm9pZCBjbG9zZVBlbmRpbmdTdGF0ZW1lbnRzKCkgeworICAgICAgICBpZiAoIWlzT3BlbigpKSB7CisgICAgICAgICAgICAvLyBzaW5jZSB0aGlzIGRhdGFiYXNlIGlzIGFscmVhZHkgY2xvc2VkLCBubyBuZWVkIHRvIGZpbmFsaXplIGFueXRoaW5nLgorICAgICAgICAgICAgbUNsb3NlZFN0YXRlbWVudElkcy5jbGVhcigpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHZlcmlmeUxvY2tPd25lcigpOworICAgICAgICAvKiB0byBtaW5pbWl6ZSBzeW5jaHJvbml6YXRpb24gb24gbUNsb3NlZFN0YXRlbWVudElkcywgbWFrZSBhIGNvcHkgb2YgdGhlIGxpc3QgKi8KKyAgICAgICAgQXJyYXlMaXN0PEludGVnZXI+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PEludGVnZXI+KG1DbG9zZWRTdGF0ZW1lbnRJZHMuc2l6ZSgpKTsKKyAgICAgICAgc3luY2hyb25pemVkKG1DbG9zZWRTdGF0ZW1lbnRJZHMpIHsKKyAgICAgICAgICAgIGxpc3QuYWRkQWxsKG1DbG9zZWRTdGF0ZW1lbnRJZHMpOworICAgICAgICAgICAgbUNsb3NlZFN0YXRlbWVudElkcy5jbGVhcigpOworICAgICAgICB9CisgICAgICAgIC8vIGZpbmFsaXplIGFsbCB0aGUgc3RhdGVtZW50cyBmcm9tIHRoZSBjb3BpZWQgbGlzdAorICAgICAgICBpbnQgc2l6ZSA9IGxpc3Quc2l6ZSgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICAgICAgbmF0aXZlX2ZpbmFsaXplKGxpc3QuZ2V0KGkpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIGZvciB0ZXN0aW5nIG9ubHkKKyAgICAgKi8KKyAgICAvKiBwYWNrYWdlICovIEFycmF5TGlzdDxJbnRlZ2VyPiBnZXRRdWV1ZWRVcFN0bXRMaXN0KCkgeworICAgICAgICByZXR1cm4gbUNsb3NlZFN0YXRlbWVudElkczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCBlbmFibGVzIHBhcmFsbGVsIGV4ZWN1dGlvbiBvZiBxdWVyaWVzIGZyb20gbXVsdGlwbGUgdGhyZWFkcyBvbiB0aGUgc2FtZSBkYXRhYmFzZS4KKyAgICAgKiBJdCBkb2VzIHRoaXMgYnkgb3BlbmluZyBtdWx0aXBsZSBoYW5kbGVzIHRvIHRoZSBkYXRhYmFzZSBhbmQgdXNpbmcgYSBkaWZmZXJlbnQKKyAgICAgKiBkYXRhYmFzZSBoYW5kbGUgZm9yIGVhY2ggcXVlcnkuCisgICAgICogPHA+CisgICAgICogSWYgYSB0cmFuc2FjdGlvbiBpcyBpbiBwcm9ncmVzcyBvbiBvbmUgY29ubmVjdGlvbiBoYW5kbGUgYW5kIHNheSwgYSB0YWJsZSBpcyB1cGRhdGVkIGluIHRoZQorICAgICAqIHRyYW5zYWN0aW9uLCB0aGVuIHF1ZXJ5IG9uIHRoZSBzYW1lIHRhYmxlIG9uIGFub3RoZXIgY29ubmVjdGlvbiBoYW5kbGUgd2lsbCBibG9jayBmb3IgdGhlCisgICAgICogdHJhbnNhY3Rpb24gdG8gY29tcGxldGUuIEJ1dCB0aGlzIG1ldGhvZCBlbmFibGVzIHN1Y2ggcXVlcmllcyB0byBleGVjdXRlIGJ5IGhhdmluZyB0aGVtCisgICAgICogcmV0dXJuIG9sZCB2ZXJzaW9uIG9mIHRoZSBkYXRhIGZyb20gdGhlIHRhYmxlLiBNb3N0IG9mdGVuIGl0IGlzIHRoZSBkYXRhIHRoYXQgZXhpc3RlZCBpbiB0aGUKKyAgICAgKiB0YWJsZSBwcmlvciB0byB0aGUgYWJvdmUgdHJhbnNhY3Rpb24gdXBkYXRlcyBvbiB0aGF0IHRhYmxlLgorICAgICAqIDxwPgorICAgICAqIE1heGltdW0gbnVtYmVyIG9mIHNpbXVsdGFuZW91cyBoYW5kbGVzIHVzZWQgdG8gZXhlY3V0ZSBxdWVyaWVzIGluIHBhcmFsbGVsIGlzCisgICAgICogZGVwZW5kZW50IHVwb24gdGhlIGRldmljZSBtZW1vcnkgYW5kIHBvc3NpYmx5IG90aGVyIHByb3BlcnRpZXMuCisgICAgICogPHA+CisgICAgICogQWZ0ZXIgY2FsbGluZyB0aGlzIG1ldGhvZCwgZXhlY3V0aW9uIG9mIHF1ZXJpZXMgaW4gcGFyYWxsZWwgaXMgZW5hYmxlZCBhcyBsb25nIGFzIHRoaXMKKyAgICAgKiBkYXRhYmFzZSBoYW5kbGUgaXMgb3Blbi4gVG8gZGlzYWJsZSBleGVjdXRpb24gb2YgcXVlcmllcyBpbiBwYXJhbGxlbCwgZGF0YWJhc2Ugc2hvdWxkCisgICAgICogYmUgY2xvc2VkIGFuZCByZW9wZW5lZC4KKyAgICAgKiA8cD4KKyAgICAgKiBJZiBhIHF1ZXJ5IGlzIHBhcnQgb2YgYSB0cmFuc2FjdGlvbiwgdGhlbiBpdCBpcyBleGVjdXRlZCBvbiB0aGUgc2FtZSBkYXRhYmFzZSBoYW5kbGUgdGhlCisgICAgICogdHJhbnNhY3Rpb24gd2FzIGJlZ3VuLgorICAgICAqIDxwPgorICAgICAqIElmIHRoZSBkYXRhYmFzZSBoYXMgYW55IGF0dGFjaGVkIGRhdGFiYXNlcywgdGhlbiBleGVjdXRpb24gb2YgcXVlcmllcyBpbiBwYXJhbGVsIGlzIE5PVAorICAgICAqIHBvc3NpYmxlLiBJbiBzdWNoIGNhc2VzLCBhIG1lc3NhZ2UgaXMgcHJpbnRlZCB0byBsb2djYXQgYW5kIGZhbHNlIGlzIHJldHVybmVkLgorICAgICAqIDxwPgorICAgICAqIFRoaXMgZmVhdHVyZSBpcyBub3QgYXZhaWxhYmxlIGZvciA6bWVtb3J5OiBkYXRhYmFzZXMuIEluIHN1Y2ggY2FzZXMsCisgICAgICogYSBtZXNzYWdlIGlzIHByaW50ZWQgdG8gbG9nY2F0IGFuZCBmYWxzZSBpcyByZXR1cm5lZC4KKyAgICAgKiA8cD4KKyAgICAgKiBBIHR5cGljYWwgd2F5IHRvIHVzZSB0aGlzIG1ldGhvZCBpcyB0aGUgZm9sbG93aW5nOgorICAgICAqIDxwcmU+CisgICAgICogICAgIFNRTGl0ZURhdGFiYXNlIGRiID0gU1FMaXRlRGF0YWJhc2Uub3BlbkRhdGFiYXNlKCJkYl9maWxlbmFtZSIsIGN1cnNvckZhY3RvcnksCisgICAgICogICAgICAgICAgICAgQ1JFQVRFX0lGX05FQ0VTU0FSWSwgbXlEYXRhYmFzZUVycm9ySGFuZGxlcik7CisgICAgICogICAgIGRiLmVuYWJsZVdyaXRlQWhlYWRMb2dnaW5nKCk7CisgICAgICogPC9wcmU+CisgICAgICogPHA+CisgICAgICogV3JpdGVycyBzaG91bGQgdXNlIHtAbGluayAjYmVnaW5UcmFuc2FjdGlvbk5vbkV4Y2x1c2l2ZSgpfSBvcgorICAgICAqIHtAbGluayAjYmVnaW5UcmFuc2FjdGlvbldpdGhMaXN0ZW5lck5vbkV4Y2x1c2l2ZShTUUxpdGVUcmFuc2FjdGlvbkxpc3RlbmVyKX0KKyAgICAgKiB0byBzdGFydCBhIHRyc25zYWN0aW9uLgorICAgICAqIE5vbi1leGNsdXNpdmUgbW9kZSBhbGxvd3MgZGF0YWJhc2UgZmlsZSB0byBiZSBpbiByZWFkYWJsZSBieSB0aHJlYWRzIGV4ZWN1dGluZyBxdWVyaWVzLgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB3cml0ZS1haGVhZC1sb2dnaW5nIGlzIHNldC4gZmFsc2Ugb3RoZXJ3aXNlCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGVuYWJsZVdyaXRlQWhlYWRMb2dnaW5nKCkgeworICAgICAgICBpZiAobVBhdGguZXF1YWxzSWdub3JlQ2FzZShNRU1PUllfREJfUEFUSCkpIHsKKyAgICAgICAgICAgIExvZy5pKFRBRywgImNhbid0IGVuYWJsZSBXQUwgZm9yIG1lbW9yeSBkYXRhYmFzZXMuIik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvLyBtYWtlIHN1cmUgdGhpcyBkYXRhYmFzZSBoYXMgTk8gYXR0YWNoZWQgZGF0YWJhc2VzIGJlY2F1c2Ugc3FsaXRlJ3Mgd3JpdGUtYWhlYWQtbG9nZ2luZworICAgICAgICAvLyBkb2Vzbid0IHdvcmsgZm9yIGRhdGFiYXNlcyB3aXRoIGF0dGFjaGVkIGRhdGFiYXNlcworICAgICAgICBpZiAoZ2V0QXR0YWNoZWREYnMoKS5zaXplKCkgPiAxKSB7CisgICAgICAgICAgICBpZiAoTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuREVCVUcpKSB7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLAorICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgZGF0YWJhc2U6ICIgKyBtUGF0aCArICIgaGFzIGF0dGFjaGVkIGRhdGFiYXNlcy4gY2FuJ3QgIGVuYWJsZSBXQUwuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1Db25uZWN0aW9uUG9vbCA9PSBudWxsKSB7CisgICAgICAgICAgICBtQ29ubmVjdGlvblBvb2wgPSBuZXcgRGF0YWJhc2VDb25uZWN0aW9uUG9vbCh0aGlzKTsKKyAgICAgICAgICAgIHNldEpvdXJuYWxNb2RlKG1QYXRoLCAiV0FMIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgZGlzYWJsZXMgdGhlIGZlYXR1cmVzIGVuYWJsZWQgYnkge0BsaW5rICNlbmFibGVXcml0ZUFoZWFkTG9nZ2luZygpfS4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGRpc2FibGVXcml0ZUFoZWFkTG9nZ2luZygpIHsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBpZiAobUNvbm5lY3Rpb25Qb29sID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQ29ubmVjdGlvblBvb2wuY2xvc2UoKTsKKyAgICAgICAgICAgIG1Db25uZWN0aW9uUG9vbCA9IG51bGw7CisgICAgICAgICAgICBzZXRKb3VybmFsTW9kZShtUGF0aCwgIlRSVU5DQVRFIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBwYWNrYWdlICovIFNRTGl0ZURhdGFiYXNlIGdldERhdGFiYXNlSGFuZGxlKFN0cmluZyBzcWwpIHsKKyAgICAgICAgaWYgKGlzUG9vbGVkQ29ubmVjdGlvbigpKSB7CisgICAgICAgICAgICAvLyB0aGlzIGlzIGEgcG9vbGVkIGRhdGFiYXNlIGNvbm5lY3Rpb24KKyAgICAgICAgICAgIC8vIHVzZSBpdCBpZiBpdCBpcyBvcGVuIEFORCBpZiBJIGFtIG5vdCBjdXJyZW50bHkgcGFydCBvZiBhIHRyYW5zYWN0aW9uCisgICAgICAgICAgICBpZiAoaXNPcGVuKCkgJiYgIWFtSUluVHJhbnNhY3Rpb24oKSkgeworICAgICAgICAgICAgICAgIC8vIFRPRE86IHVzZSBhbm90aGVyIGNvbm5lY3Rpb24gZnJvbSB0aGUgcG9vbAorICAgICAgICAgICAgICAgIC8vIGlmIHRoaXMgY29ubmVjdGlvbiBpcyBjdXJyZW50bHkgaW4gdXNlIGJ5IHNvbWUgb3RoZXIgdGhyZWFkCisgICAgICAgICAgICAgICAgLy8gQU5EIGlmIHRoZXJlIGFyZSBmcmVlIGNvbm5lY3Rpb25zIGluIHRoZSBwb29sCisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIHRoZSBwb29sZWQgY29ubmVjdGlvbiBpcyBub3Qgb3BlbiEgY291bGQgaGF2ZSBiZWVuIGNsb3NlZCBlaXRoZXIgZHVlCisgICAgICAgICAgICAgICAgLy8gdG8gY29ycnVwdGlvbiBvbiB0aGlzIG9yIHNvbWUgb3RoZXIgY29ubmVjdGlvbiB0byB0aGUgZGF0YWJhc2UKKyAgICAgICAgICAgICAgICAvLyBPUiwgbWF5YmUgdGhlIGNvbm5lY3Rpb24gcG9vbCBpcyBkaXNhYmxlZCBhZnRlciB0aGlzIGNvbm5lY3Rpb24gaGFzIGJlZW4KKyAgICAgICAgICAgICAgICAvLyBhbGxvY2F0ZWQgdG8gbWUuIHRyeSB0byBnZXQgc29tZSBvdGhlciBwb29sZWQgb3IgbWFpbiBkYXRhYmFzZSBjb25uZWN0aW9uCisgICAgICAgICAgICAgICAgcmV0dXJuIGdldFBhcmVudERiQ29ubk9iaigpLmdldERiQ29ubmVjdGlvbihzcWwpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gdGhpcyBpcyBOT1QgYSBwb29sZWQgY29ubmVjdGlvbi4gY2FuIHdlIGdldCBvbmU/CisgICAgICAgICAgICByZXR1cm4gZ2V0RGJDb25uZWN0aW9uKHNxbCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBkYXRhYmFzZSBjb25uZWN0aW9uIGhhbmRsZSBwb29sIHNpemUgdG8gdGhlIGdpdmVuIHZhbHVlLgorICAgICAqIERhdGFiYXNlIGNvbm5lY3Rpb24gaGFuZGxlIHBvb2wgaXMgZW5hYmxlZCB3aGVuIHRoZSBhcHAgY2FsbHMKKyAgICAgKiB7QGxpbmsgI2VuYWJsZVdyaXRlQWhlYWRMb2dnaW5nKCl9LgorICAgICAqIDxwPgorICAgICAqIFRoZSBkZWZhdWx0IGNvbm5lY3Rpb24gaGFuZGxlIHBvb2wgaXMgc2V0IGJ5IHRoZSBzeXN0ZW0gYnkgdGFraW5nIGludG8gYWNjb3VudCB2YXJpb3VzCisgICAgICogYXNwZWN0cyBvZiB0aGUgZGV2aWNlLCBzdWNoIGFzIG1lbW9yeSwgbnVtYmVyIG9mIGNvcmVzIGV0Yy4gSXQgaXMgcmVjb21tZW5kZWQgdGhhdAorICAgICAqIGFwcGxpY2F0aW9ucyB1c2UgdGhlIGRlZmF1bHQgcG9vbCBzaXplIHNldCBieSB0aGUgc3lzdGVtLgorICAgICAqCisgICAgICogQHBhcmFtIHNpemUgdGhlIHZhbHVlIHRoZSBjb25uZWN0aW9uIGhhbmRsZSBwb29sIHNpemUgc2hvdWxkIGJlIHNldCB0by4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0Q29ubmVjdGlvblBvb2xTaXplKGludCBzaXplKSB7CisgICAgICAgIGlmIChtQ29ubmVjdGlvblBvb2wgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiY29ubmVjdGlvbiBwb29sIG5vdCBlbmFibGVkIik7CisgICAgICAgIH0KKyAgICAgICAgaW50IGkgPSBtQ29ubmVjdGlvblBvb2wuZ2V0TWF4UG9vbFNpemUoKTsKKyAgICAgICAgaWYgKHNpemUgPCBpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiY2Fubm90IHNldCBtYXggcG9vbCBzaXplIHRvIGEgdmFsdWUgbGVzcyB0aGFuIHRoZSBjdXJyZW50IG1heCB2YWx1ZSg9IiArCisgICAgICAgICAgICAgICAgICAgIGkgKyAiKSIpOworICAgICAgICB9CisgICAgICAgIG1Db25uZWN0aW9uUG9vbC5zZXRNYXhQb29sU2l6ZShzaXplKTsKKyAgICB9CisKKyAgICAvKiBwYWNrYWdlICovIFNRTGl0ZURhdGFiYXNlIGNyZWF0ZVBvb2xDb25uZWN0aW9uKHNob3J0IGNvbm5lY3Rpb25OdW0pIHsKKyAgICAgICAgU1FMaXRlRGF0YWJhc2UgZGIgPSBvcGVuRGF0YWJhc2UobVBhdGgsIG1GYWN0b3J5LCBtRmxhZ3MsIG1FcnJvckhhbmRsZXIsIGNvbm5lY3Rpb25OdW0pOworICAgICAgICBkYi5tUGFyZW50Q29ubk9iaiA9IHRoaXM7CisgICAgICAgIHJldHVybiBkYjsKKyAgICB9CisKKyAgICBwcml2YXRlIHN5bmNocm9uaXplZCBTUUxpdGVEYXRhYmFzZSBnZXRQYXJlbnREYkNvbm5PYmooKSB7CisgICAgICAgIHJldHVybiBtUGFyZW50Q29ubk9iajsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNQb29sZWRDb25uZWN0aW9uKCkgeworICAgICAgICByZXR1cm4gdGhpcy5tQ29ubmVjdGlvbk51bSA+IDA7CisgICAgfQorCisgICAgLyogcGFja2FnZSAqLyBTUUxpdGVEYXRhYmFzZSBnZXREYkNvbm5lY3Rpb24oU3RyaW5nIHNxbCkgeworICAgICAgICB2ZXJpZnlEYklzT3BlbigpOworICAgICAgICAvLyB0aGlzIG1ldGhvZCBzaG91bGQgYWx3YXlzIGJlIGNhbGxlZCB3aXRoIG1haW4gZGF0YWJhc2UgY29ubmVjdGlvbiBoYW5kbGUKKyAgICAgICAgLy8gTkVWRVIgd2l0aCBwb29sZWQgZGF0YWJhc2UgY29ubmVjdGlvbiBoYW5kbGUKKyAgICAgICAgaWYgKGlzUG9vbGVkQ29ubmVjdGlvbigpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJpbmNvcnJlY3QgZGF0YWJhc2UgY29ubmVjdGlvbiBoYW5kbGUiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHVzZSB0aGUgY3VycmVudCBjb25uZWN0aW9uIGhhbmRsZSBpZgorICAgICAgICAvLyAxLiBpZiB0aGUgY2FsbGVyIGlzIHBhcnQgb2YgdGhlIG9uZ29pbmcgdHJhbnNhY3Rpb24sIGlmIGFueQorICAgICAgICAvLyAyLiBPUiwgaWYgdGhlcmUgaXMgTk8gY29ubmVjdGlvbiBoYW5kbGUgcG9vbCBzZXR1cAorICAgICAgICBpZiAoYW1JSW5UcmFuc2FjdGlvbigpIHx8IG1Db25uZWN0aW9uUG9vbCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIGdldCBhIGNvbm5lY3Rpb24gaGFuZGxlIGZyb20gdGhlIHBvb2wKKyAgICAgICAgICAgIGlmIChMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5ERUJVRykpIHsKKyAgICAgICAgICAgICAgICBhc3NlcnQgbUNvbm5lY3Rpb25Qb29sICE9IG51bGw7CisgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCBtQ29ubmVjdGlvblBvb2wudG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbUNvbm5lY3Rpb25Qb29sLmdldChzcWwpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJlbGVhc2VEYkNvbm5lY3Rpb24oU1FMaXRlRGF0YWJhc2UgZGIpIHsKKyAgICAgICAgLy8gaWdub3JlIHRoaXMgcmVsZWFzZSBjYWxsIGlmCisgICAgICAgIC8vIDEuIHRoZSBkYXRhYmFzZSBpcyBjbG9zZWQKKyAgICAgICAgLy8gMi4gT1IsIGlmIGRiIGlzIE5PVCBhIHBvb2xlZCBjb25uZWN0aW9uIGhhbmRsZQorICAgICAgICAvLyAzLiBPUiwgaWYgdGhlIGRhdGFiYXNlIGJlaW5nIHJlbGVhc2VkIGlzIHNhbWUgYXMgJ3RoaXMnICh0aGlzIGNvbmRpdGlvbiBtZWFucworICAgICAgICAvLyAgICAgdGhhdCB3ZSBzaG91bGQgYWx3YXlzIGJlIHJlbGVhc2luZyBhIHBvb2xlZCBjb25uZWN0aW9uIGhhbmRsZSBieSBjYWxsaW5nIHRoaXMgbWV0aG9kCisgICAgICAgIC8vICAgICBmcm9tIHRoZSAnbWFpbicgY29ubmVjdGlvbiBoYW5kbGUKKyAgICAgICAgaWYgKCFpc09wZW4oKSB8fCAhZGIuaXNQb29sZWRDb25uZWN0aW9uKCkgfHwgKGRiID09IHRoaXMpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLkRFQlVHKSkgeworICAgICAgICAgICAgYXNzZXJ0IGlzUG9vbGVkQ29ubmVjdGlvbigpOworICAgICAgICAgICAgYXNzZXJ0IG1Db25uZWN0aW9uUG9vbCAhPSBudWxsOworICAgICAgICAgICAgTG9nLmQoVEFHLCAicmVsZWFzZURiQ29ubmVjdGlvbiB0aHJlYWRpZCA9ICIgKyBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldElkKCkgKworICAgICAgICAgICAgICAgICAgICAiLCByZWxlYXNpbmcgIyAiICsgZGIubUNvbm5lY3Rpb25OdW0gKyAiLCAiICsgZ2V0UGF0aCgpKTsKKyAgICAgICAgfQorICAgICAgICBtQ29ubmVjdGlvblBvb2wucmVsZWFzZShkYik7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogdGhpcyBtZXRob2QgaXMgdXNlZCB0byBjb2xsZWN0IGRhdGEgYWJvdXQgQUxMIG9wZW4gZGF0YWJhc2VzIGluIHRoZSBjdXJyZW50IHByb2Nlc3MuCi0gICAgICogYnVncmVwb3J0IGlzIGEgdXNlciBvZiB0aGlzIGRhdGEuIAorICAgICAqIGJ1Z3JlcG9ydCBpcyBhIHVzZXIgb2YgdGhpcyBkYXRhLgogICAgICAqLwogICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIEFycmF5TGlzdDxEYlN0YXRzPiBnZXREYlN0YXRzKCkgewogICAgICAgICBBcnJheUxpc3Q8RGJTdGF0cz4gZGJTdGF0c0xpc3QgPSBuZXcgQXJyYXlMaXN0PERiU3RhdHM+KCk7Ci0gICAgICAgIGZvciAoV2Vha1JlZmVyZW5jZTxTUUxpdGVEYXRhYmFzZT4gdyA6IEFjdGl2ZURhdGFiYXNlcy5nZXRJbnN0YW5jZSgpLm1BY3RpdmVEYXRhYmFzZXMpIHsKKyAgICAgICAgLy8gbWFrZSBhIGxvY2FsIGNvcHkgb2YgbUFjdGl2ZURhdGFiYXNlcyAtIHNvIHRoYXQgdGhpcyBtZXRob2QgaXMgbm90IGNvbXBldGluZworICAgICAgICAvLyBmb3Igc3luY2hyb25pemF0aW9uIGxvY2sgb24gbUFjdGl2ZURhdGFiYXNlcworICAgICAgICBBcnJheUxpc3Q8V2Vha1JlZmVyZW5jZTxTUUxpdGVEYXRhYmFzZT4+IHRlbXBMaXN0OworICAgICAgICBzeW5jaHJvbml6ZWQobUFjdGl2ZURhdGFiYXNlcykgeworICAgICAgICAgICAgdGVtcExpc3QgPSAoQXJyYXlMaXN0PFdlYWtSZWZlcmVuY2U8U1FMaXRlRGF0YWJhc2U+PiltQWN0aXZlRGF0YWJhc2VzLmNsb25lKCk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChXZWFrUmVmZXJlbmNlPFNRTGl0ZURhdGFiYXNlPiB3IDogdGVtcExpc3QpIHsKICAgICAgICAgICAgIFNRTGl0ZURhdGFiYXNlIGRiID0gdy5nZXQoKTsKICAgICAgICAgICAgIGlmIChkYiA9PSBudWxsIHx8ICFkYi5pc09wZW4oKSkgewogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gZ2V0IFNRTElURV9EQlNUQVRVU19MT09LQVNJREVfVVNFRCBmb3IgdGhlIGRiCi0gICAgICAgICAgICBpbnQgbG9va2FzaWRlVXNlZCA9IGRiLm5hdGl2ZV9nZXREYkxvb2thc2lkZSgpOwogCi0gICAgICAgICAgICAvLyBnZXQgdGhlIGxhc3Rub2RlIG9mIHRoZSBkYm5hbWUKLSAgICAgICAgICAgIFN0cmluZyBwYXRoID0gZGIuZ2V0UGF0aCgpOwotICAgICAgICAgICAgaW50IGluZHggPSBwYXRoLmxhc3RJbmRleE9mKCIvIik7Ci0gICAgICAgICAgICBTdHJpbmcgbGFzdG5vZGUgPSBwYXRoLnN1YnN0cmluZygoaW5keCAhPSAtMSkgPyArK2luZHggOiAwKTsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAoZGIpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAvLyBnZXQgU1FMSVRFX0RCU1RBVFVTX0xPT0tBU0lERV9VU0VEIGZvciB0aGUgZGIKKyAgICAgICAgICAgICAgICAgICAgaW50IGxvb2thc2lkZVVzZWQgPSBkYi5uYXRpdmVfZ2V0RGJMb29rYXNpZGUoKTsKIAotICAgICAgICAgICAgLy8gZ2V0IGxpc3Qgb2YgYXR0YWNoZWQgZGJzIGFuZCBmb3IgZWFjaCBkYiwgZ2V0IGl0cyBzaXplIGFuZCBwYWdlc2l6ZQotICAgICAgICAgICAgQXJyYXlMaXN0PFBhaXI8U3RyaW5nLCBTdHJpbmc+PiBhdHRhY2hlZERicyA9IGdldEF0dGFjaGVkRGJzKGRiKTsKLSAgICAgICAgICAgIGlmIChhdHRhY2hlZERicyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGF0dGFjaGVkRGJzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgUGFpcjxTdHJpbmcsIFN0cmluZz4gcCA9IGF0dGFjaGVkRGJzLmdldChpKTsKLSAgICAgICAgICAgICAgICBsb25nIHBhZ2VDb3VudCA9IGdldFByYWdtYVZhbChkYiwgcC5maXJzdCArICIucGFnZV9jb3VudDsiKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBsYXN0bm9kZSBvZiB0aGUgZGJuYW1lCisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYXRoID0gZGIuZ2V0UGF0aCgpOworICAgICAgICAgICAgICAgICAgICBpbnQgaW5keCA9IHBhdGgubGFzdEluZGV4T2YoIi8iKTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxhc3Rub2RlID0gcGF0aC5zdWJzdHJpbmcoKGluZHggIT0gLTEpID8gKytpbmR4IDogMCk7CiAKLSAgICAgICAgICAgICAgICAvLyBmaXJzdCBlbnRyeSBpbiB0aGUgYXR0YWNoZWQgZGIgbGlzdCBpcyBhbHdheXMgdGhlIG1haW4gZGF0YWJhc2UKLSAgICAgICAgICAgICAgICAvLyBkb24ndCB3b3JyeSBhYm91dCBwcmVmaXhpbmcgdGhlIGRibmFtZSB3aXRoICJtYWluIgotICAgICAgICAgICAgICAgIFN0cmluZyBkYk5hbWU7Ci0gICAgICAgICAgICAgICAgaWYgKGkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBkYk5hbWUgPSBsYXN0bm9kZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBsb29rYXNpZGUgaXMgb25seSByZWxldmFudCBmb3IgdGhlIG1haW4gZGIKLSAgICAgICAgICAgICAgICAgICAgbG9va2FzaWRlVXNlZCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGRiTmFtZSA9ICIgIChhdHRhY2hlZCkgIiArIHAuZmlyc3Q7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBhdHRhY2hlZCBkYiBoYXMgYSBwYXRoLCBhdHRhY2ggdGhlIGxhc3Rub2RlIGZyb20gdGhlIHBhdGggdG8gYWJvdmUKLSAgICAgICAgICAgICAgICAgICAgaWYgKHAuc2Vjb25kLnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBpZHggPSBwLnNlY29uZC5sYXN0SW5kZXhPZigiLyIpOwotICAgICAgICAgICAgICAgICAgICAgICAgZGJOYW1lICs9ICIgOiAiICsgcC5zZWNvbmQuc3Vic3RyaW5nKChpZHggIT0gLTEpID8gKytpZHggOiAwKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IGxpc3Qgb2YgYXR0YWNoZWQgZGJzIGFuZCBmb3IgZWFjaCBkYiwgZ2V0IGl0cyBzaXplIGFuZCBwYWdlc2l6ZQorICAgICAgICAgICAgICAgICAgICBBcnJheUxpc3Q8UGFpcjxTdHJpbmcsIFN0cmluZz4+IGF0dGFjaGVkRGJzID0gZGIuZ2V0QXR0YWNoZWREYnMoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGF0dGFjaGVkRGJzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChwYWdlQ291bnQgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRiU3RhdHNMaXN0LmFkZChuZXcgRGJTdGF0cyhkYk5hbWUsIHBhZ2VDb3VudCwgZGIuZ2V0UGFnZVNpemUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29rYXNpZGVVc2VkKSk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXR0YWNoZWREYnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFBhaXI8U3RyaW5nLCBTdHJpbmc+IHAgPSBhdHRhY2hlZERicy5nZXQoaSk7CisgICAgICAgICAgICAgICAgICAgICAgICBsb25nIHBhZ2VDb3VudCA9IERhdGFiYXNlVXRpbHMubG9uZ0ZvclF1ZXJ5KGRiLCAiUFJBR01BICIgKyBwLmZpcnN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIi5wYWdlX2NvdW50OyIsIG51bGwpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBmaXJzdCBlbnRyeSBpbiB0aGUgYXR0YWNoZWQgZGIgbGlzdCBpcyBhbHdheXMgdGhlIG1haW4gZGF0YWJhc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvbid0IHdvcnJ5IGFib3V0IHByZWZpeGluZyB0aGUgZGJuYW1lIHdpdGggIm1haW4iCisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZGJOYW1lOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRiTmFtZSA9IGxhc3Rub2RlOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsb29rYXNpZGUgaXMgb25seSByZWxldmFudCBmb3IgdGhlIG1haW4gZGIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29rYXNpZGVVc2VkID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYk5hbWUgPSAiICAoYXR0YWNoZWQpICIgKyBwLmZpcnN0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBhdHRhY2hlZCBkYiBoYXMgYSBwYXRoLCBhdHRhY2ggdGhlIGxhc3Rub2RlIGZyb20gdGhlIHBhdGggdG8gYWJvdmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocC5zZWNvbmQudHJpbSgpLmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaWR4ID0gcC5zZWNvbmQubGFzdEluZGV4T2YoIi8iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJOYW1lICs9ICIgOiAiICsgcC5zZWNvbmQuc3Vic3RyaW5nKChpZHggIT0gLTEpID8gKytpZHggOiAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFnZUNvdW50ID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRiU3RhdHNMaXN0LmFkZChuZXcgRGJTdGF0cyhkYk5hbWUsIHBhZ2VDb3VudCwgZGIuZ2V0UGFnZVNpemUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb2thc2lkZVVzZWQsIGRiLm1OdW1DYWNoZUhpdHMsIGRiLm1OdW1DYWNoZU1pc3NlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRiLm1Db21waWxlZFF1ZXJpZXMuc2l6ZSgpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlcmUgYXJlIHBvb2xlZCBjb25uZWN0aW9ucywgcmV0dXJuIHRoZSBjYWNoZSBzdGF0cyBmb3IgdGhlbSBhbHNvLgorICAgICAgICAgICAgICAgICAgICBpZiAoZGIubUNvbm5lY3Rpb25Qb29sICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoU1FMaXRlRGF0YWJhc2UgcERiIDogZGIubUNvbm5lY3Rpb25Qb29sLmdldENvbm5lY3Rpb25MaXN0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYlN0YXRzTGlzdC5hZGQobmV3IERiU3RhdHMoIihwb29sZWQgIyAiICsgcERiLm1Db25uZWN0aW9uTnVtICsgIikgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBsYXN0bm9kZSwgMCwgMCwgMCwgcERiLm1OdW1DYWNoZUhpdHMsIHBEYi5tTnVtQ2FjaGVNaXNzZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGIubUNvbXBpbGVkUXVlcmllcy5zaXplKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNRTGl0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZS4gd2UgZG9uJ3QgY2FyZSBhYm91dCBleGNlcHRpb25zIHdoZW4gd2UgYXJlIHRha2luZyBhZGIKKyAgICAgICAgICAgICAgICAgICAgLy8gYnVncmVwb3J0IQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMjE5NCw0NCArMjQ1OSw3NiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIGdldCB0aGUgc3BlY2lmaWVkIHByYWdtYSB2YWx1ZSBmcm9tIHNxbGl0ZSBmb3IgdGhlIHNwZWNpZmllZCBkYXRhYmFzZS4KLSAgICAgKiBvbmx5IGhhbmRsZXMgcHJhZ21hJ3MgdGhhdCByZXR1cm4gaW50L2xvbmcuCi0gICAgICogTk8gSkFWQSBsb2NrcyBhcmUgaGVsZCBpbiB0aGlzIG1ldGhvZC4KLSAgICAgKiBUT0RPOiB1c2UgdGhpcyB0byBkbyBhbGwgcHJhZ21hJ3MgaW4gdGhpcyBjbGFzcworICAgICAqIFJldHVybnMgbGlzdCBvZiBmdWxsIHBhdGhuYW1lcyBvZiBhbGwgYXR0YWNoZWQgZGF0YWJhc2VzIGluY2x1ZGluZyB0aGUgbWFpbiBkYXRhYmFzZQorICAgICAqIGJ5IGV4ZWN1dGluZyAncHJhZ21hIGRhdGFiYXNlX2xpc3QnIG9uIHRoZSBkYXRhYmFzZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gQXJyYXlMaXN0IG9mIHBhaXJzIG9mIChkYXRhYmFzZSBuYW1lLCBkYXRhYmFzZSBmaWxlIHBhdGgpIG9yIG51bGwgaWYgdGhlIGRhdGFiYXNlCisgICAgICogaXMgbm90IG9wZW4uCiAgICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgbG9uZyBnZXRQcmFnbWFWYWwoU1FMaXRlRGF0YWJhc2UgZGIsIFN0cmluZyBwcmFnbWEpIHsKLSAgICAgICAgaWYgKCFkYi5pc09wZW4oKSkgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgU1FMaXRlU3RhdGVtZW50IHByb2cgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcHJvZyA9IG5ldyBTUUxpdGVTdGF0ZW1lbnQoZGIsICJQUkFHTUEgIiArIHByYWdtYSk7Ci0gICAgICAgICAgICBsb25nIHZhbCA9IHByb2cuc2ltcGxlUXVlcnlGb3JMb25nKCk7Ci0gICAgICAgICAgICByZXR1cm4gdmFsOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKHByb2cgIT0gbnVsbCkgcHJvZy5jbG9zZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogcmV0dXJucyBsaXN0IG9mIGZ1bGwgcGF0aG5hbWVzIG9mIGFsbCBhdHRhY2hlZCBkYXRhYmFzZXMKLSAgICAgKiBpbmNsdWRpbmcgdGhlIG1haW4gZGF0YWJhc2UKLSAgICAgKiBUT0RPOiBtb3ZlIHRoaXMgdG8ge0BsaW5rIERhdGFiYXNlVXRpbHN9Ci0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgQXJyYXlMaXN0PFBhaXI8U3RyaW5nLCBTdHJpbmc+PiBnZXRBdHRhY2hlZERicyhTUUxpdGVEYXRhYmFzZSBkYk9iaikgewotICAgICAgICBpZiAoIWRiT2JqLmlzT3BlbigpKSB7CisgICAgcHVibGljIEFycmF5TGlzdDxQYWlyPFN0cmluZywgU3RyaW5nPj4gZ2V0QXR0YWNoZWREYnMoKSB7CisgICAgICAgIGlmICghaXNPcGVuKCkpIHsKICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICB9CiAgICAgICAgIEFycmF5TGlzdDxQYWlyPFN0cmluZywgU3RyaW5nPj4gYXR0YWNoZWREYnMgPSBuZXcgQXJyYXlMaXN0PFBhaXI8U3RyaW5nLCBTdHJpbmc+PigpOwotICAgICAgICBDdXJzb3IgYyA9IGRiT2JqLnJhd1F1ZXJ5KCJwcmFnbWEgZGF0YWJhc2VfbGlzdDsiLCBudWxsKTsKLSAgICAgICAgd2hpbGUgKGMubW92ZVRvTmV4dCgpKSB7Ci0gICAgICAgICAgICAgYXR0YWNoZWREYnMuYWRkKG5ldyBQYWlyPFN0cmluZywgU3RyaW5nPihjLmdldFN0cmluZygxKSwgYy5nZXRTdHJpbmcoMikpKTsKKyAgICAgICAgQ3Vyc29yIGMgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYyA9IHJhd1F1ZXJ5KCJwcmFnbWEgZGF0YWJhc2VfbGlzdDsiLCBudWxsKTsKKyAgICAgICAgICAgIHdoaWxlIChjLm1vdmVUb05leHQoKSkgeworICAgICAgICAgICAgICAgIC8vIHNxbGl0ZSByZXR1cm5zIGEgcm93IGZvciBlYWNoIGRhdGFiYXNlIGluIHRoZSByZXR1cm5lZCBsaXN0IG9mIGRhdGFiYXNlcy4KKyAgICAgICAgICAgICAgICAvLyAgIGluIGVhY2ggcm93LAorICAgICAgICAgICAgICAgIC8vICAgICAgIDFzdCBjb2x1bW4gaXMgdGhlIGRhdGFiYXNlIG5hbWUgc3VjaCBhcyBtYWluLCBvciB0aGUgZGF0YWJhc2UKKyAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgc3BlY2lmaWVkIG9uIHRoZSAiQVRUQUNIIiBjb21tYW5kCisgICAgICAgICAgICAgICAgLy8gICAgICAgMm5kIGNvbHVtbiBpcyB0aGUgZGF0YWJhc2UgZmlsZSBwYXRoLgorICAgICAgICAgICAgICAgIGF0dGFjaGVkRGJzLmFkZChuZXcgUGFpcjxTdHJpbmcsIFN0cmluZz4oYy5nZXRTdHJpbmcoMSksIGMuZ2V0U3RyaW5nKDIpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoYyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgYy5jbG9zZSgpOworICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIGMuY2xvc2UoKTsKICAgICAgICAgcmV0dXJuIGF0dGFjaGVkRGJzOwogICAgIH0KIAogICAgIC8qKgorICAgICAqIFJ1bnMgJ3ByYWdtYSBpbnRlZ3JpdHlfY2hlY2snIG9uIHRoZSBnaXZlbiBkYXRhYmFzZSAoYW5kIGFsbCB0aGUgYXR0YWNoZWQgZGF0YWJhc2VzKQorICAgICAqIGFuZCByZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIGRhdGFiYXNlIChhbmQgYWxsIGl0cyBhdHRhY2hlZCBkYXRhYmFzZXMpIHBhc3MgaW50ZWdyaXR5X2NoZWNrLAorICAgICAqIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKjxwPgorICAgICAqIElmIHRoZSByZXN1bHQgaXMgZmFsc2UsIHRoZW4gdGhpcyBtZXRob2QgbG9ncyB0aGUgZXJyb3JzIHJlcG9ydGVkIGJ5IHRoZSBpbnRlZ3JpdHlfY2hlY2sKKyAgICAgKiBjb21tYW5kIGV4ZWN1dGlvbi4KKyAgICAgKjxwPgorICAgICAqIE5vdGUgdGhhdCAncHJhZ21hIGludGVncml0eV9jaGVjaycgb24gYSBkYXRhYmFzZSBjYW4gdGFrZSBhIGxvbmcgdGltZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gZGF0YWJhc2UgKGFuZCBhbGwgaXRzIGF0dGFjaGVkIGRhdGFiYXNlcykgcGFzcyBpbnRlZ3JpdHlfY2hlY2ssCisgICAgICogZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzRGF0YWJhc2VJbnRlZ3JpdHlPaygpIHsKKyAgICAgICAgdmVyaWZ5RGJJc09wZW4oKTsKKyAgICAgICAgQXJyYXlMaXN0PFBhaXI8U3RyaW5nLCBTdHJpbmc+PiBhdHRhY2hlZERicyA9IGdldEF0dGFjaGVkRGJzKCk7CisgICAgICAgIGlmIChhdHRhY2hlZERicyA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJkYXRhYmFzZWxpc3QgZm9yOiAiICsgZ2V0UGF0aCgpICsgIiBjb3VsZG4ndCAiICsKKyAgICAgICAgICAgICAgICAgICAgImJlIHJldHJpZXZlZC4gcHJvYmFibHkgYmVjYXVzZSB0aGUgZGF0YWJhc2UgaXMgY2xvc2VkIik7CisgICAgICAgIH0KKyAgICAgICAgYm9vbGVhbiBpc0RhdGFiYXNlQ29ycnVwdCA9IGZhbHNlOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGF0dGFjaGVkRGJzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBQYWlyPFN0cmluZywgU3RyaW5nPiBwID0gYXR0YWNoZWREYnMuZ2V0KGkpOworICAgICAgICAgICAgU1FMaXRlU3RhdGVtZW50IHByb2cgPSBudWxsOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBwcm9nID0gY29tcGlsZVN0YXRlbWVudCgiUFJBR01BICIgKyBwLmZpcnN0ICsgIi5pbnRlZ3JpdHlfY2hlY2soMSk7Iik7CisgICAgICAgICAgICAgICAgU3RyaW5nIHJzbHQgPSBwcm9nLnNpbXBsZVF1ZXJ5Rm9yU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgaWYgKCFyc2x0LmVxdWFsc0lnbm9yZUNhc2UoIm9rIikpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gaW50ZWdyaXR5X2NoZWNrZXIgZmFpbGVkIG9uIG1haW4gb3IgYXR0YWNoZWQgZGF0YWJhc2VzCisgICAgICAgICAgICAgICAgICAgIGlzRGF0YWJhc2VDb3JydXB0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiUFJBR01BIGludGVncml0eV9jaGVjayBvbiAiICsgcC5zZWNvbmQgKyAiIHJldHVybmVkOiAiICsgcnNsdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBpZiAocHJvZyAhPSBudWxsKSBwcm9nLmNsb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGlzRGF0YWJhc2VDb3JydXB0OworICAgIH0KKworICAgIC8qKgogICAgICAqIE5hdGl2ZSBjYWxsIHRvIG9wZW4gdGhlIGRhdGFiYXNlLgogICAgICAqCiAgICAgICogQHBhcmFtIHBhdGggVGhlIGZ1bGwgcGF0aCB0byB0aGUgZGF0YWJhc2UKQEAgLTIyMzksNTEgKzI1MzYsMzQgQEAKICAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIGRib3BlbihTdHJpbmcgcGF0aCwgaW50IGZsYWdzKTsKIAogICAgIC8qKgotICAgICAqIE5hdGl2ZSBjYWxsIHRvIHNldHVwIHRyYWNpbmcgb2YgYWxsIHNxbCBzdGF0ZW1lbnRzCisgICAgICogTmF0aXZlIGNhbGwgdG8gc2V0dXAgdHJhY2luZyBvZiBhbGwgU1FMIHN0YXRlbWVudHMKICAgICAgKgogICAgICAqIEBwYXJhbSBwYXRoIHRoZSBmdWxsIHBhdGggdG8gdGhlIGRhdGFiYXNlCisgICAgICogQHBhcmFtIGNvbm5lY3Rpb25OdW0gY29ubmVjdGlvbiBudW1iZXI6IDAgLSBOLCB3aGVyZSB0aGUgbWFpbiBkYXRhYmFzZQorICAgICAqICAgICAgICAgICAgY29ubmVjdGlvbiBoYW5kbGUgaXMgbnVtYmVyZWQgMCBhbmQgdGhlIGNvbm5lY3Rpb24gaGFuZGxlcyBpbiB0aGUgY29ubmVjdGlvbgorICAgICAqICAgICAgICAgICAgcG9vbCBhcmUgbnVtYmVyZWQgMS4uTi4KICAgICAgKi8KLSAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIGVuYWJsZVNxbFRyYWNpbmcoU3RyaW5nIHBhdGgpOworICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgZW5hYmxlU3FsVHJhY2luZyhTdHJpbmcgcGF0aCwgc2hvcnQgY29ubmVjdGlvbk51bSk7CiAKICAgICAvKioKLSAgICAgKiBOYXRpdmUgY2FsbCB0byBzZXR1cCBwcm9maWxpbmcgb2YgYWxsIHNxbCBzdGF0ZW1lbnRzLgorICAgICAqIE5hdGl2ZSBjYWxsIHRvIHNldHVwIHByb2ZpbGluZyBvZiBhbGwgU1FMIHN0YXRlbWVudHMuCiAgICAgICogY3VycmVudGx5LCBzcWxpdGUncyBwcm9maWxpbmcgPSBwcmludGluZyBvZiBleGVjdXRpb24tdGltZQotICAgICAqICh3YWxsLWNsb2NrIHRpbWUpIG9mIGVhY2ggb2YgdGhlIHNxbCBzdGF0ZW1lbnRzLCBhcyB0aGV5CisgICAgICogKHdhbGwtY2xvY2sgdGltZSkgb2YgZWFjaCBvZiB0aGUgU1FMIHN0YXRlbWVudHMsIGFzIHRoZXkKICAgICAgKiBhcmUgZXhlY3V0ZWQuCiAgICAgICoKICAgICAgKiBAcGFyYW0gcGF0aCB0aGUgZnVsbCBwYXRoIHRvIHRoZSBkYXRhYmFzZQorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uTnVtIGNvbm5lY3Rpb24gbnVtYmVyOiAwIC0gTiwgd2hlcmUgdGhlIG1haW4gZGF0YWJhc2UKKyAgICAgKiAgICAgICAgICAgIGNvbm5lY3Rpb24gaGFuZGxlIGlzIG51bWJlcmVkIDAgYW5kIHRoZSBjb25uZWN0aW9uIGhhbmRsZXMgaW4gdGhlIGNvbm5lY3Rpb24KKyAgICAgKiAgICAgICAgICAgIHBvb2wgYXJlIG51bWJlcmVkIDEuLk4uCiAgICAgICovCi0gICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBlbmFibGVTcWxQcm9maWxpbmcoU3RyaW5nIHBhdGgpOwotCi0gICAgLyoqCi0gICAgICogTmF0aXZlIGNhbGwgdG8gZXhlY3V0ZSBhIHJhdyBTUUwgc3RhdGVtZW50LiB7QGxpbmsgI2xvY2t9IG11c3QgYmUgaGVsZAotICAgICAqIHdoZW4gY2FsbGluZyB0aGlzIG1ldGhvZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzcWwgVGhlIHJhdyBTUUwgc3RyaW5nCi0gICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KLSAgICAgKi8KLSAgICAvKiBwYWNrYWdlICovIG5hdGl2ZSB2b2lkIG5hdGl2ZV9leGVjU1FMKFN0cmluZyBzcWwpIHRocm93cyBTUUxFeGNlcHRpb247CisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBlbmFibGVTcWxQcm9maWxpbmcoU3RyaW5nIHBhdGgsIHNob3J0IGNvbm5lY3Rpb25OdW0pOwogCiAgICAgLyoqCiAgICAgICogTmF0aXZlIGNhbGwgdG8gc2V0IHRoZSBsb2NhbGUuICB7QGxpbmsgI2xvY2t9IG11c3QgYmUgaGVsZCB3aGVuIGNhbGxpbmcKICAgICAgKiB0aGlzIG1ldGhvZC4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgogICAgICAqLwotICAgIC8qIHBhY2thZ2UgKi8gbmF0aXZlIHZvaWQgbmF0aXZlX3NldExvY2FsZShTdHJpbmcgbG9jLCBpbnQgZmxhZ3MpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcm93IElEIG9mIHRoZSBsYXN0IHJvdyBpbnNlcnRlZCBpbnRvIHRoZSBkYXRhYmFzZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIHJvdyBJRCBvZiB0aGUgbGFzdCByb3cgaW5zZXJ0ZWQgaW50byB0aGUgZGF0YWJhc2UuCi0gICAgICovCi0gICAgLyogcGFja2FnZSAqLyBuYXRpdmUgbG9uZyBsYXN0SW5zZXJ0Um93KCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgY2hhbmdlcyBtYWRlIGluIHRoZSBsYXN0IHN0YXRlbWVudCBleGVjdXRlZC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBjaGFuZ2VzIG1hZGUgaW4gdGhlIGxhc3Qgc3RhdGVtZW50IGV4ZWN1dGVkLgotICAgICAqLwotICAgIC8qIHBhY2thZ2UgKi8gbmF0aXZlIGludCBsYXN0Q2hhbmdlQ291bnQoKTsKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5hdGl2ZV9zZXRMb2NhbGUoU3RyaW5nIGxvYywgaW50IGZsYWdzKTsKIAogICAgIC8qKgogICAgICAqIHJldHVybiB0aGUgU1FMSVRFX0RCU1RBVFVTX0xPT0tBU0lERV9VU0VEIGRvY3VtZW50ZWQgaGVyZQpAQCAtMjI5MSw0ICsyNTcxLDExIEBACiAgICAgICogQHJldHVybiBpbnQgdmFsdWUgb2YgU1FMSVRFX0RCU1RBVFVTX0xPT0tBU0lERV9VU0VECiAgICAgICovCiAgICAgcHJpdmF0ZSBuYXRpdmUgaW50IG5hdGl2ZV9nZXREYkxvb2thc2lkZSgpOworCisgICAgLyoqCisgICAgICogZmluYWxpemVzIHRoZSBnaXZlbiBzdGF0ZW1lbnQgaWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RhdGVtZW50SWQgc3RhdGVtZW50IHRvIGJlIGZpbnpsaWVkIGJ5IHNxbGl0ZQorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgbmF0aXZlIHZvaWQgbmF0aXZlX2ZpbmFsaXplKGludCBzdGF0ZW1lbnRJZCk7CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlRGF0YWJhc2VMb2NrZWRFeGNlcHRpb24uamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVEYXRhYmFzZUxvY2tlZEV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwZTJkODEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlRGF0YWJhc2VMb2NrZWRFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDMzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZTsKKworLyoqCisgKiBUaHJvd24gaWYgIHRoZSBkYXRhYmFzZSBlbmdpbmUgd2FzIHVuYWJsZSB0byBhY3F1aXJlIHRoZQorICogZGF0YWJhc2UgbG9ja3MgaXQgbmVlZHMgdG8gZG8gaXRzIGpvYi4gIElmIHRoZSBzdGF0ZW1lbnQgaXMgYSBbQ09NTUlUXQorICogb3Igb2NjdXJzIG91dHNpZGUgb2YgYW4gZXhwbGljaXQgdHJhbnNhY3Rpb24sIHRoZW4geW91IGNhbiByZXRyeSB0aGUKKyAqIHN0YXRlbWVudC4gIElmIHRoZSBzdGF0ZW1lbnQgaXMgbm90IGEgW0NPTU1JVF0gYW5kIG9jY3VycyB3aXRoaW4gYQorICogZXhwbGljaXQgdHJhbnNhY3Rpb24gdGhlbiB5b3Ugc2hvdWxkIHJvbGxiYWNrIHRoZSB0cmFuc2FjdGlvbiBiZWZvcmUKKyAqIGNvbnRpbnVpbmcuCisgKi8KK3B1YmxpYyBjbGFzcyBTUUxpdGVEYXRhYmFzZUxvY2tlZEV4Y2VwdGlvbiBleHRlbmRzIFNRTGl0ZUV4Y2VwdGlvbiB7CisgICAgcHVibGljIFNRTGl0ZURhdGFiYXNlTG9ja2VkRXhjZXB0aW9uKCkge30KKworICAgIHB1YmxpYyBTUUxpdGVEYXRhYmFzZUxvY2tlZEV4Y2VwdGlvbihTdHJpbmcgZXJyb3IpIHsKKyAgICAgICAgc3VwZXIoZXJyb3IpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVEYXRhdHlwZU1pc21hdGNoRXhjZXB0aW9uLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlRGF0YXR5cGVNaXNtYXRjaEV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmODI1MzUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlRGF0YXR5cGVNaXNtYXRjaEV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlOworCitwdWJsaWMgY2xhc3MgU1FMaXRlRGF0YXR5cGVNaXNtYXRjaEV4Y2VwdGlvbiBleHRlbmRzIFNRTGl0ZUV4Y2VwdGlvbiB7CisgICAgcHVibGljIFNRTGl0ZURhdGF0eXBlTWlzbWF0Y2hFeGNlcHRpb24oKSB7fQorCisgICAgcHVibGljIFNRTGl0ZURhdGF0eXBlTWlzbWF0Y2hFeGNlcHRpb24oU3RyaW5nIGVycm9yKSB7CisgICAgICAgIHN1cGVyKGVycm9yKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlRGVidWcuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVEZWJ1Zy5qYXZhCmluZGV4IDg5YzNmOTYuLjk0OTYwNzkxIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlRGVidWcuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlRGVidWcuamF2YQpAQCAtMTMyLDExICsxMzIsMTYgQEAKICAgICAgICAgLyoqIGRvY3VtZW50ZWQgaGVyZSBodHRwOi8vd3d3LnNxbGl0ZS5vcmcvYzNyZWYvY19kYnN0YXR1c19sb29rYXNpZGVfdXNlZC5odG1sICovCiAgICAgICAgIHB1YmxpYyBpbnQgbG9va2FzaWRlOwogCi0gICAgICAgIHB1YmxpYyBEYlN0YXRzKFN0cmluZyBkYk5hbWUsIGxvbmcgcGFnZUNvdW50LCBsb25nIHBhZ2VTaXplLCBpbnQgbG9va2FzaWRlKSB7CisgICAgICAgIC8qKiBzdGF0ZW1lbnQgY2FjaGUgc3RhdHM6IGhpdHMvbWlzc2VzL2NhY2hlc2l6ZSAqLworICAgICAgICBwdWJsaWMgU3RyaW5nIGNhY2hlOworCisgICAgICAgIHB1YmxpYyBEYlN0YXRzKFN0cmluZyBkYk5hbWUsIGxvbmcgcGFnZUNvdW50LCBsb25nIHBhZ2VTaXplLCBpbnQgbG9va2FzaWRlLAorICAgICAgICAgICAgaW50IGhpdHMsIGludCBtaXNzZXMsIGludCBjYWNoZXNpemUpIHsKICAgICAgICAgICAgIHRoaXMuZGJOYW1lID0gZGJOYW1lOwotICAgICAgICAgICAgdGhpcy5wYWdlU2l6ZSA9IHBhZ2VTaXplOworICAgICAgICAgICAgdGhpcy5wYWdlU2l6ZSA9IHBhZ2VTaXplIC8gMTAyNDsKICAgICAgICAgICAgIGRiU2l6ZSA9IChwYWdlQ291bnQgKiBwYWdlU2l6ZSkgLyAxMDI0OwogICAgICAgICAgICAgdGhpcy5sb29rYXNpZGUgPSBsb29rYXNpZGU7CisgICAgICAgICAgICB0aGlzLmNhY2hlID0gaGl0cyArICIvIiArIG1pc3NlcyArICIvIiArIGNhY2hlc2l6ZTsKICAgICAgICAgfQogICAgIH0KIApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZURpcmVjdEN1cnNvckRyaXZlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZURpcmVjdEN1cnNvckRyaXZlci5qYXZhCmluZGV4IDIxNDRmYzMuLmRlMmZjYTkgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVEaXJlY3RDdXJzb3JEcml2ZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlRGlyZWN0Q3Vyc29yRHJpdmVyLmphdmEKQEAgLTM5LDE4ICszOSwxNiBAQAogCiAgICAgcHVibGljIEN1cnNvciBxdWVyeShDdXJzb3JGYWN0b3J5IGZhY3RvcnksIFN0cmluZ1tdIHNlbGVjdGlvbkFyZ3MpIHsKICAgICAgICAgLy8gQ29tcGlsZSB0aGUgcXVlcnkKLSAgICAgICAgU1FMaXRlUXVlcnkgcXVlcnkgPSBuZXcgU1FMaXRlUXVlcnkobURhdGFiYXNlLCBtU3FsLCAwLCBzZWxlY3Rpb25BcmdzKTsKKyAgICAgICAgU1FMaXRlUXVlcnkgcXVlcnkgPSBudWxsOwogCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBBcmcgYmluZGluZwotICAgICAgICAgICAgaW50IG51bUFyZ3MgPSBzZWxlY3Rpb25BcmdzID09IG51bGwgPyAwIDogc2VsZWN0aW9uQXJncy5sZW5ndGg7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUFyZ3M7IGkrKykgewotICAgICAgICAgICAgICAgIHF1ZXJ5LmJpbmRTdHJpbmcoaSArIDEsIHNlbGVjdGlvbkFyZ3NbaV0pOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgbURhdGFiYXNlLmxvY2soKTsKKyAgICAgICAgICAgIG1EYXRhYmFzZS5jbG9zZVBlbmRpbmdTdGF0ZW1lbnRzKCk7CisgICAgICAgICAgICBxdWVyeSA9IG5ldyBTUUxpdGVRdWVyeShtRGF0YWJhc2UsIG1TcWwsIDAsIHNlbGVjdGlvbkFyZ3MpOwogCiAgICAgICAgICAgICAvLyBDcmVhdGUgdGhlIGN1cnNvcgogICAgICAgICAgICAgaWYgKGZhY3RvcnkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1DdXJzb3IgPSBuZXcgU1FMaXRlQ3Vyc29yKG1EYXRhYmFzZSwgdGhpcywgbUVkaXRUYWJsZSwgcXVlcnkpOworICAgICAgICAgICAgICAgIG1DdXJzb3IgPSBuZXcgU1FMaXRlQ3Vyc29yKHRoaXMsIG1FZGl0VGFibGUsIHF1ZXJ5KTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgbUN1cnNvciA9IGZhY3RvcnkubmV3Q3Vyc29yKG1EYXRhYmFzZSwgdGhpcywgbUVkaXRUYWJsZSwgcXVlcnkpOwogICAgICAgICAgICAgfQpAQCAtNjEsNiArNTksNyBAQAogICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoaXMgb2JqZWN0IGlzIGNsZWFuZWQgdXAgaWYgc29tZXRoaW5nIGhhcHBlbnMKICAgICAgICAgICAgIGlmIChxdWVyeSAhPSBudWxsKSBxdWVyeS5jbG9zZSgpOworICAgICAgICAgICAgbURhdGFiYXNlLnVubG9jaygpOwogICAgICAgICB9CiAgICAgfQogCkBAIC02OSwxMCArNjgsNyBAQAogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHNldEJpbmRBcmd1bWVudHMoU3RyaW5nW10gYmluZEFyZ3MpIHsKLSAgICAgICAgZmluYWwgaW50IG51bUFyZ3MgPSBiaW5kQXJncy5sZW5ndGg7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQXJnczsgaSsrKSB7Ci0gICAgICAgICAgICBtUXVlcnkuYmluZFN0cmluZyhpICsgMSwgYmluZEFyZ3NbaV0pOwotICAgICAgICB9CisgICAgICAgIG1RdWVyeS5iaW5kQWxsQXJnc0FzU3RyaW5ncyhiaW5kQXJncyk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgY3Vyc29yRGVhY3RpdmF0ZWQoKSB7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlT3BlbkhlbHBlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZU9wZW5IZWxwZXIuamF2YQppbmRleCBiNDYxNWViLi5jY2Y4ZDY4IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlT3BlbkhlbHBlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVPcGVuSGVscGVyLmphdmEKQEAgLTE3LDYgKzE3LDggQEAKIHBhY2thZ2UgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGU7CiAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkRhdGFiYXNlRXJyb3JIYW5kbGVyOworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuRGVmYXVsdERhdGFiYXNlRXJyb3JIYW5kbGVyOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlLkN1cnNvckZhY3Rvcnk7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIApAQCAtNTEsNiArNTMsNyBAQAogCiAgICAgcHJpdmF0ZSBTUUxpdGVEYXRhYmFzZSBtRGF0YWJhc2UgPSBudWxsOwogICAgIHByaXZhdGUgYm9vbGVhbiBtSXNJbml0aWFsaXppbmcgPSBmYWxzZTsKKyAgICBwcml2YXRlIGZpbmFsIERhdGFiYXNlRXJyb3JIYW5kbGVyIG1FcnJvckhhbmRsZXI7CiAKICAgICAvKioKICAgICAgKiBDcmVhdGUgYSBoZWxwZXIgb2JqZWN0IHRvIGNyZWF0ZSwgb3BlbiwgYW5kL29yIG1hbmFnZSBhIGRhdGFiYXNlLgpAQCAtNjUsMTIgKzY4LDM3IEBACiAgICAgICogICAgIHtAbGluayAjb25VcGdyYWRlfSB3aWxsIGJlIHVzZWQgdG8gdXBncmFkZSB0aGUgZGF0YWJhc2UKICAgICAgKi8KICAgICBwdWJsaWMgU1FMaXRlT3BlbkhlbHBlcihDb250ZXh0IGNvbnRleHQsIFN0cmluZyBuYW1lLCBDdXJzb3JGYWN0b3J5IGZhY3RvcnksIGludCB2ZXJzaW9uKSB7CisgICAgICAgIHRoaXMoY29udGV4dCwgbmFtZSwgZmFjdG9yeSwgdmVyc2lvbiwgbmV3IERlZmF1bHREYXRhYmFzZUVycm9ySGFuZGxlcigpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBoZWxwZXIgb2JqZWN0IHRvIGNyZWF0ZSwgb3BlbiwgYW5kL29yIG1hbmFnZSBhIGRhdGFiYXNlLgorICAgICAqIFRoZSBkYXRhYmFzZSBpcyBub3QgYWN0dWFsbHkgY3JlYXRlZCBvciBvcGVuZWQgdW50aWwgb25lIG9mCisgICAgICoge0BsaW5rICNnZXRXcml0YWJsZURhdGFiYXNlfSBvciB7QGxpbmsgI2dldFJlYWRhYmxlRGF0YWJhc2V9IGlzIGNhbGxlZC4KKyAgICAgKgorICAgICAqIDxwPkFjY2VwdHMgaW5wdXQgcGFyYW06IGEgY29uY3JldGUgaW5zdGFuY2Ugb2Yge0BsaW5rIERhdGFiYXNlRXJyb3JIYW5kbGVyfSB0byBiZQorICAgICAqIHVzZWQgdG8gaGFuZGxlIGNvcnJ1cHRpb24gd2hlbiBzcWxpdGUgcmVwb3J0cyBkYXRhYmFzZSBjb3JydXB0aW9uLjwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IHRvIHVzZSB0byBvcGVuIG9yIGNyZWF0ZSB0aGUgZGF0YWJhc2UKKyAgICAgKiBAcGFyYW0gbmFtZSBvZiB0aGUgZGF0YWJhc2UgZmlsZSwgb3IgbnVsbCBmb3IgYW4gaW4tbWVtb3J5IGRhdGFiYXNlCisgICAgICogQHBhcmFtIGZhY3RvcnkgdG8gdXNlIGZvciBjcmVhdGluZyBjdXJzb3Igb2JqZWN0cywgb3IgbnVsbCBmb3IgdGhlIGRlZmF1bHQKKyAgICAgKiBAcGFyYW0gdmVyc2lvbiBudW1iZXIgb2YgdGhlIGRhdGFiYXNlIChzdGFydGluZyBhdCAxKTsgaWYgdGhlIGRhdGFiYXNlIGlzIG9sZGVyLAorICAgICAqICAgICB7QGxpbmsgI29uVXBncmFkZX0gd2lsbCBiZSB1c2VkIHRvIHVwZ3JhZGUgdGhlIGRhdGFiYXNlCisgICAgICogQHBhcmFtIGVycm9ySGFuZGxlciB0aGUge0BsaW5rIERhdGFiYXNlRXJyb3JIYW5kbGVyfSB0byBiZSB1c2VkIHdoZW4gc3FsaXRlIHJlcG9ydHMgZGF0YWJhc2UKKyAgICAgKiBjb3JydXB0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBTUUxpdGVPcGVuSGVscGVyKENvbnRleHQgY29udGV4dCwgU3RyaW5nIG5hbWUsIEN1cnNvckZhY3RvcnkgZmFjdG9yeSwgaW50IHZlcnNpb24sCisgICAgICAgICAgICBEYXRhYmFzZUVycm9ySGFuZGxlciBlcnJvckhhbmRsZXIpIHsKICAgICAgICAgaWYgKHZlcnNpb24gPCAxKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJWZXJzaW9uIG11c3QgYmUgPj0gMSwgd2FzICIgKyB2ZXJzaW9uKTsKKyAgICAgICAgaWYgKGVycm9ySGFuZGxlciA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJEYXRhYmFzZUVycm9ySGFuZGxlciBwYXJhbSB2YWx1ZSBjYW4ndCBiZSBudWxsLiIpOworICAgICAgICB9CiAKICAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OwogICAgICAgICBtTmFtZSA9IG5hbWU7CiAgICAgICAgIG1GYWN0b3J5ID0gZmFjdG9yeTsKICAgICAgICAgbU5ld1ZlcnNpb24gPSB2ZXJzaW9uOworICAgICAgICBtRXJyb3JIYW5kbGVyID0gZXJyb3JIYW5kbGVyOwogICAgIH0KIAogICAgIC8qKgpAQCAtOTMsOCArMTIxLDEzIEBACiAgICAgICogQHJldHVybiBhIHJlYWQvd3JpdGUgZGF0YWJhc2Ugb2JqZWN0IHZhbGlkIHVudGlsIHtAbGluayAjY2xvc2V9IGlzIGNhbGxlZAogICAgICAqLwogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgU1FMaXRlRGF0YWJhc2UgZ2V0V3JpdGFibGVEYXRhYmFzZSgpIHsKLSAgICAgICAgaWYgKG1EYXRhYmFzZSAhPSBudWxsICYmIG1EYXRhYmFzZS5pc09wZW4oKSAmJiAhbURhdGFiYXNlLmlzUmVhZE9ubHkoKSkgewotICAgICAgICAgICAgcmV0dXJuIG1EYXRhYmFzZTsgIC8vIFRoZSBkYXRhYmFzZSBpcyBhbHJlYWR5IG9wZW4gZm9yIGJ1c2luZXNzCisgICAgICAgIGlmIChtRGF0YWJhc2UgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKCFtRGF0YWJhc2UuaXNPcGVuKCkpIHsKKyAgICAgICAgICAgICAgICAvLyBkYXJuISB0aGUgdXNlciBjbG9zZWQgdGhlIGRhdGFiYXNlIGJ5IGNhbGxpbmcgbURhdGFiYXNlLmNsb3NlKCkKKyAgICAgICAgICAgICAgICBtRGF0YWJhc2UgPSBudWxsOworICAgICAgICAgICAgfSBlbHNlIGlmICghbURhdGFiYXNlLmlzUmVhZE9ubHkoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBtRGF0YWJhc2U7ICAvLyBUaGUgZGF0YWJhc2UgaXMgYWxyZWFkeSBvcGVuIGZvciBidXNpbmVzcworICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgaWYgKG1Jc0luaXRpYWxpemluZykgewpAQCAtMTE1LDEwICsxNDgsMTQgQEAKICAgICAgICAgICAgIGlmIChtTmFtZSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgZGIgPSBTUUxpdGVEYXRhYmFzZS5jcmVhdGUobnVsbCk7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGRiID0gbUNvbnRleHQub3Blbk9yQ3JlYXRlRGF0YWJhc2UobU5hbWUsIDAsIG1GYWN0b3J5KTsKKyAgICAgICAgICAgICAgICBkYiA9IG1Db250ZXh0Lm9wZW5PckNyZWF0ZURhdGFiYXNlKG1OYW1lLCAwLCBtRmFjdG9yeSwgbUVycm9ySGFuZGxlcik7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGludCB2ZXJzaW9uID0gZGIuZ2V0VmVyc2lvbigpOworICAgICAgICAgICAgaWYgKHZlcnNpb24gPiBtTmV3VmVyc2lvbikgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkRhdGFiYXNlICIgKyBtTmFtZSArCisgICAgICAgICAgICAgICAgICAgICAgICAiIGNhbm5vdCBiZSBkb3duZ3JhZGVkLiBpbnN0ZWFkLCBwbGVhc2UgdW5pbnN0YWxsIG5ldyB2ZXJzaW9uIGZpcnN0LiIpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKHZlcnNpb24gIT0gbU5ld1ZlcnNpb24pIHsKICAgICAgICAgICAgICAgICBkYi5iZWdpblRyYW5zYWN0aW9uKCk7CiAgICAgICAgICAgICAgICAgdHJ5IHsKQEAgLTE3NSw4ICsyMTIsMTMgQEAKICAgICAgKiAgICAgb3Ige0BsaW5rICNjbG9zZX0gaXMgY2FsbGVkLgogICAgICAqLwogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgU1FMaXRlRGF0YWJhc2UgZ2V0UmVhZGFibGVEYXRhYmFzZSgpIHsKLSAgICAgICAgaWYgKG1EYXRhYmFzZSAhPSBudWxsICYmIG1EYXRhYmFzZS5pc09wZW4oKSkgewotICAgICAgICAgICAgcmV0dXJuIG1EYXRhYmFzZTsgIC8vIFRoZSBkYXRhYmFzZSBpcyBhbHJlYWR5IG9wZW4gZm9yIGJ1c2luZXNzCisgICAgICAgIGlmIChtRGF0YWJhc2UgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKCFtRGF0YWJhc2UuaXNPcGVuKCkpIHsKKyAgICAgICAgICAgICAgICAvLyBkYXJuISB0aGUgdXNlciBjbG9zZWQgdGhlIGRhdGFiYXNlIGJ5IGNhbGxpbmcgbURhdGFiYXNlLmNsb3NlKCkKKyAgICAgICAgICAgICAgICBtRGF0YWJhc2UgPSBudWxsOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbURhdGFiYXNlOyAgLy8gVGhlIGRhdGFiYXNlIGlzIGFscmVhZHkgb3BlbiBmb3IgYnVzaW5lc3MKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIGlmIChtSXNJbml0aWFsaXppbmcpIHsKQEAgLTE5NCw3ICsyMzYsOCBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgbUlzSW5pdGlhbGl6aW5nID0gdHJ1ZTsKICAgICAgICAgICAgIFN0cmluZyBwYXRoID0gbUNvbnRleHQuZ2V0RGF0YWJhc2VQYXRoKG1OYW1lKS5nZXRQYXRoKCk7Ci0gICAgICAgICAgICBkYiA9IFNRTGl0ZURhdGFiYXNlLm9wZW5EYXRhYmFzZShwYXRoLCBtRmFjdG9yeSwgU1FMaXRlRGF0YWJhc2UuT1BFTl9SRUFET05MWSk7CisgICAgICAgICAgICBkYiA9IFNRTGl0ZURhdGFiYXNlLm9wZW5EYXRhYmFzZShwYXRoLCBtRmFjdG9yeSwgU1FMaXRlRGF0YWJhc2UuT1BFTl9SRUFET05MWSwKKyAgICAgICAgICAgICAgICAgICAgbUVycm9ySGFuZGxlcik7CiAgICAgICAgICAgICBpZiAoZGIuZ2V0VmVyc2lvbigpICE9IG1OZXdWZXJzaW9uKSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNRTGl0ZUV4Y2VwdGlvbigiQ2FuJ3QgdXBncmFkZSByZWFkLW9ubHkgZGF0YWJhc2UgZnJvbSB2ZXJzaW9uICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgZGIuZ2V0VmVyc2lvbigpICsgIiB0byAiICsgbU5ld1ZlcnNpb24gKyAiOiAiICsgcGF0aCk7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlT3V0T2ZNZW1vcnlFeGNlcHRpb24uamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVPdXRPZk1lbW9yeUV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4Y2U4YjUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlT3V0T2ZNZW1vcnlFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDI1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZTsKKworcHVibGljIGNsYXNzIFNRTGl0ZU91dE9mTWVtb3J5RXhjZXB0aW9uIGV4dGVuZHMgU1FMaXRlRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgU1FMaXRlT3V0T2ZNZW1vcnlFeGNlcHRpb24oKSB7fQorCisgICAgcHVibGljIFNRTGl0ZU91dE9mTWVtb3J5RXhjZXB0aW9uKFN0cmluZyBlcnJvcikgeworICAgICAgICBzdXBlcihlcnJvcik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZVByb2dyYW0uamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVQcm9ncmFtLmphdmEKaW5kZXggNGQ5NmYxMi4uOWI3ZDgyMyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZVByb2dyYW0uamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlUHJvZ3JhbS5qYXZhCkBAIC0xNiwxMSArMTYsMTUgQEAKIAogcGFja2FnZSBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZTsKIAoraW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuRGF0YWJhc2VVdGlsczsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcjsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CisKIC8qKgogICogQSBiYXNlIGNsYXNzIGZvciBjb21waWxlZCBTUUxpdGUgcHJvZ3JhbXMuCi0gKgorICo8cD4KICAqIFNRTGl0ZVByb2dyYW0gaXMgbm90IGludGVybmFsbHkgc3luY2hyb25pemVkIHNvIGNvZGUgdXNpbmcgYSBTUUxpdGVQcm9ncmFtIGZyb20gbXVsdGlwbGUKICAqIHRocmVhZHMgc2hvdWxkIHBlcmZvcm0gaXRzIG93biBzeW5jaHJvbml6YXRpb24gd2hlbiB1c2luZyB0aGUgU1FMaXRlUHJvZ3JhbS4KICAqLwpAQCAtNDMsNyArNDcsNyBAQAogICAgICAqIEBkZXByZWNhdGVkIGRvIG5vdCB1c2UgdGhpcwogICAgICAqLwogICAgIEBEZXByZWNhdGVkCi0gICAgcHJvdGVjdGVkIGludCBuSGFuZGxlID0gMDsKKyAgICBwcm90ZWN0ZWQgaW50IG5IYW5kbGU7CiAKICAgICAvKioKICAgICAgKiB0aGUgU1FMaXRlQ29tcGlsZWRTcWwgb2JqZWN0IGZvciB0aGUgZ2l2ZW4gc3FsIHN0YXRlbWVudC4KQEAgLTU2LDQwICs2MCw3OSBAQAogICAgICAqIEBkZXByZWNhdGVkIGRvIG5vdCB1c2UgdGhpcwogICAgICAqLwogICAgIEBEZXByZWNhdGVkCi0gICAgcHJvdGVjdGVkIGludCBuU3RhdGVtZW50ID0gMDsKKyAgICBwcm90ZWN0ZWQgaW50IG5TdGF0ZW1lbnQ7CisKKyAgICAvKioKKyAgICAgKiBJbiB0aGUgY2FzZSBvZiB7QGxpbmsgU1FMaXRlU3RhdGVtZW50fSwgdGhpcyBtZW1iZXIgc3RvcmVzIHRoZSBiaW5kYXJncyBwYXNzZWQKKyAgICAgKiB0byB0aGUgZm9sbG93aW5nIG1ldGhvZHMsIGluc3RlYWQgb2YgYWN0dWFsbHkgZG9pbmcgdGhlIGJpbmRpbmcuCisgICAgICogPHVsPgorICAgICAqICAgPGxpPntAbGluayAjYmluZEJsb2IoaW50LCBieXRlW10pfTwvbGk+CisgICAgICogICA8bGk+e0BsaW5rICNiaW5kRG91YmxlKGludCwgZG91YmxlKX08L2xpPgorICAgICAqICAgPGxpPntAbGluayAjYmluZExvbmcoaW50LCBsb25nKX08L2xpPgorICAgICAqICAgPGxpPntAbGluayAjYmluZE51bGwoaW50KX08L2xpPgorICAgICAqICAgPGxpPntAbGluayAjYmluZFN0cmluZyhpbnQsIFN0cmluZyl9PC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqIDxwPgorICAgICAqIEVhY2ggZW50cnkgaW4gdGhlIGFycmF5IGlzIGEgUGFpciBvZgorICAgICAqIDxvbD4KKyAgICAgKiAgIDxsaT5iaW5kIGFyZyBwb3NpdGlvbiBudW1iZXI8L2xpPgorICAgICAqICAgPGxpPnRoZSB2YWx1ZSB0byBiZSBib3VuZCB0byB0aGUgYmluZGFyZzwvbGk+CisgICAgICogPC9vbD4KKyAgICAgKiA8cD4KKyAgICAgKiBJdCBpcyBsYXppbHkgaW5pdGlhbGl6ZWQgaW4gdGhlIGFib3ZlIGJpbmQgbWV0aG9kcworICAgICAqIGFuZCBpdCBpcyBjbGVhcmVkIGluIHtAbGluayAjY2xlYXJCaW5kaW5ncygpfSBtZXRob2QuCisgICAgICogPHA+CisgICAgICogSXQgaXMgcHJvdGVjdGVkIChpbiBtdWx0aS10aHJlYWRlZCBlbnZpcm9ubWVudCkgYnkge0BsaW5rIFNRTGl0ZVByb2dyYW19LnRoaXMKKyAgICAgKi8KKyAgICAvKiBwYWNrYWdlICovIEhhc2hNYXA8SW50ZWdlciwgT2JqZWN0PiBtQmluZEFyZ3MgPSBudWxsOworICAgIC8qIHBhY2thZ2UgKi8gZmluYWwgaW50IG1TdGF0ZW1lbnRUeXBlOwogCiAgICAgLyogcGFja2FnZSAqLyBTUUxpdGVQcm9ncmFtKFNRTGl0ZURhdGFiYXNlIGRiLCBTdHJpbmcgc3FsKSB7Ci0gICAgICAgIG1EYXRhYmFzZSA9IGRiOworICAgICAgICB0aGlzKGRiLCBzcWwsIG51bGwsIHRydWUpOworICAgIH0KKworICAgIC8qIHBhY2thZ2UgKi8gU1FMaXRlUHJvZ3JhbShTUUxpdGVEYXRhYmFzZSBkYiwgU3RyaW5nIHNxbCwgT2JqZWN0W10gYmluZEFyZ3MsCisgICAgICAgICAgICBib29sZWFuIGNvbXBpbGVGbGFnKSB7CiAgICAgICAgIG1TcWwgPSBzcWwudHJpbSgpOworICAgICAgICBtU3RhdGVtZW50VHlwZSA9IERhdGFiYXNlVXRpbHMuZ2V0U3FsU3RhdGVtZW50VHlwZShtU3FsKTsKICAgICAgICAgZGIuYWNxdWlyZVJlZmVyZW5jZSgpOwogICAgICAgICBkYi5hZGRTUUxpdGVDbG9zYWJsZSh0aGlzKTsKLSAgICAgICAgdGhpcy5uSGFuZGxlID0gZGIubU5hdGl2ZUhhbmRsZTsKKyAgICAgICAgbURhdGFiYXNlID0gZGI7CisgICAgICAgIG5IYW5kbGUgPSBkYi5tTmF0aXZlSGFuZGxlOworICAgICAgICBpZiAoYmluZEFyZ3MgIT0gbnVsbCkgeworICAgICAgICAgICAgaW50IHNpemUgPSBiaW5kQXJncy5sZW5ndGg7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICAgICAgICAgIHRoaXMuYWRkVG9CaW5kQXJncyhpICsgMSwgYmluZEFyZ3NbaV0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChjb21waWxlRmxhZykgeworICAgICAgICAgICAgY29tcGlsZUFuZGJpbmRBbGxBcmdzKCk7CisgICAgICAgIH0KKyAgICB9CiAKKyAgICBwcml2YXRlIHZvaWQgY29tcGlsZVNxbCgpIHsKICAgICAgICAgLy8gb25seSBjYWNoZSBDUlVEIHN0YXRlbWVudHMKLSAgICAgICAgU3RyaW5nIHByZWZpeFNxbCA9IG1TcWwuc3Vic3RyaW5nKDAsIDYpOwotICAgICAgICBpZiAoIXByZWZpeFNxbC5lcXVhbHNJZ25vcmVDYXNlKCJJTlNFUlQiKSAmJiAhcHJlZml4U3FsLmVxdWFsc0lnbm9yZUNhc2UoIlVQREFURSIpICYmCi0gICAgICAgICAgICAgICAgIXByZWZpeFNxbC5lcXVhbHNJZ25vcmVDYXNlKCJSRVBMQUMiKSAmJgotICAgICAgICAgICAgICAgICFwcmVmaXhTcWwuZXF1YWxzSWdub3JlQ2FzZSgiREVMRVRFIikgJiYgIXByZWZpeFNxbC5lcXVhbHNJZ25vcmVDYXNlKCJTRUxFQ1QiKSkgewotICAgICAgICAgICAgbUNvbXBpbGVkU3FsID0gbmV3IFNRTGl0ZUNvbXBpbGVkU3FsKGRiLCBzcWwpOworICAgICAgICBpZiAobVN0YXRlbWVudFR5cGUgIT0gRGF0YWJhc2VVdGlscy5TVEFURU1FTlRfU0VMRUNUICYmCisgICAgICAgICAgICAgICAgbVN0YXRlbWVudFR5cGUgIT0gRGF0YWJhc2VVdGlscy5TVEFURU1FTlRfVVBEQVRFKSB7CisgICAgICAgICAgICBtQ29tcGlsZWRTcWwgPSBuZXcgU1FMaXRlQ29tcGlsZWRTcWwobURhdGFiYXNlLCBtU3FsKTsKICAgICAgICAgICAgIG5TdGF0ZW1lbnQgPSBtQ29tcGlsZWRTcWwublN0YXRlbWVudDsKICAgICAgICAgICAgIC8vIHNpbmNlIGl0IGlzIG5vdCBpbiB0aGUgY2FjaGUsIG5vIG5lZWQgdG8gYWNxdWlyZSgpIGl0LgogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKLSAgICAgICAgLy8gaXQgaXMgbm90IHByYWdtYQotICAgICAgICBtQ29tcGlsZWRTcWwgPSBkYi5nZXRDb21waWxlZFN0YXRlbWVudEZvclNxbChzcWwpOworICAgICAgICBtQ29tcGlsZWRTcWwgPSBtRGF0YWJhc2UuZ2V0Q29tcGlsZWRTdGF0ZW1lbnRGb3JTcWwobVNxbCk7CiAgICAgICAgIGlmIChtQ29tcGlsZWRTcWwgPT0gbnVsbCkgewogICAgICAgICAgICAgLy8gY3JlYXRlIGEgbmV3IGNvbXBpbGVkLXNxbCBvYmoKLSAgICAgICAgICAgIG1Db21waWxlZFNxbCA9IG5ldyBTUUxpdGVDb21waWxlZFNxbChkYiwgc3FsKTsKKyAgICAgICAgICAgIG1Db21waWxlZFNxbCA9IG5ldyBTUUxpdGVDb21waWxlZFNxbChtRGF0YWJhc2UsIG1TcWwpOwogCiAgICAgICAgICAgICAvLyBhZGQgaXQgdG8gdGhlIGNhY2hlIG9mIGNvbXBpbGVkLXNxbHMKICAgICAgICAgICAgIC8vIGJ1dCBiZWZvcmUgYWRkaW5nIGl0IGFuZCB0aHVzIG1ha2luZyBpdCBhdmFpbGFibGUgZm9yIGFueW9uZSBlbHNlIHRvIHVzZSBpdCwKICAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSBpdCBpcyBhY3F1aXJlZCBieSBtZS4KICAgICAgICAgICAgIG1Db21waWxlZFNxbC5hY3F1aXJlKCk7Ci0gICAgICAgICAgICBkYi5hZGRUb0NvbXBpbGVkUXVlcmllcyhzcWwsIG1Db21waWxlZFNxbCk7CisgICAgICAgICAgICBtRGF0YWJhc2UuYWRkVG9Db21waWxlZFF1ZXJpZXMobVNxbCwgbUNvbXBpbGVkU3FsKTsKICAgICAgICAgICAgIGlmIChTUUxpdGVEZWJ1Zy5ERUJVR19BQ1RJVkVfQ1VSU09SX0ZJTkFMSVpBVElPTikgewogICAgICAgICAgICAgICAgIExvZy52KFRBRywgIkNyZWF0ZWQgRGJPYmogKGlkIyIgKyBtQ29tcGlsZWRTcWwublN0YXRlbWVudCArCi0gICAgICAgICAgICAgICAgICAgICAgICAiKSBmb3Igc3FsOiAiICsgc3FsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICIpIGZvciBzcWw6ICIgKyBtU3FsKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8vIGl0IGlzIGFscmVhZHkgaW4gY29tcGlsZWQtc3FsIGNhY2hlLgpAQCAtMTAwLDEyICsxNDMsMTIgQEAKICAgICAgICAgICAgICAgICAvLyB3ZSBjYW4ndCBoYXZlIHR3byBkaWZmZXJlbnQgU1FMaXRlUHJvZ2FtIG9iamVjdHMgY2FuJ3Qgc2hhcmUgdGhlIHNhbWUKICAgICAgICAgICAgICAgICAvLyBDb21waWxlZFNxbCBvYmplY3QuIGNyZWF0ZSBhIG5ldyBvbmUuCiAgICAgICAgICAgICAgICAgLy8gZmluYWxpemUgaXQgd2hlbiBJIGFtIGRvbmUgd2l0aCBpdCBpbiAidGhpcyIgb2JqZWN0LgotICAgICAgICAgICAgICAgIG1Db21waWxlZFNxbCA9IG5ldyBTUUxpdGVDb21waWxlZFNxbChkYiwgc3FsKTsKKyAgICAgICAgICAgICAgICBtQ29tcGlsZWRTcWwgPSBuZXcgU1FMaXRlQ29tcGlsZWRTcWwobURhdGFiYXNlLCBtU3FsKTsKICAgICAgICAgICAgICAgICBpZiAoU1FMaXRlRGVidWcuREVCVUdfQUNUSVZFX0NVUlNPUl9GSU5BTElaQVRJT04pIHsKICAgICAgICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAiKiogcG9zc2libGUgYnVnICoqIENyZWF0ZWQgTkVXIERiT2JqIChpZCMiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29tcGlsZWRTcWwublN0YXRlbWVudCArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIikgYmVjYXVzZSB0aGUgcHJldmlvdXNseSBjcmVhdGVkIERiT2JqIChpZCMiICsgbGFzdCArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIikgd2FzIG5vdCByZWxlYXNlZCBmb3Igc3FsOiIgKyBzcWwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpIHdhcyBub3QgcmVsZWFzZWQgZm9yIHNxbDoiICsgbVNxbCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIC8vIHNpbmNlIGl0IGlzIG5vdCBpbiB0aGUgY2FjaGUsIG5vIG5lZWQgdG8gYWNxdWlyZSgpIGl0LgogICAgICAgICAgICAgfQpAQCAtMTE1LDE4ICsxNTgsMTggQEAKIAogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIG9uQWxsUmVmZXJlbmNlc1JlbGVhc2VkKCkgewotICAgICAgICByZWxlYXNlQ29tcGlsZWRTcWxJZk5vdEluQ2FjaGUoKTsKLSAgICAgICAgbURhdGFiYXNlLnJlbGVhc2VSZWZlcmVuY2UoKTsKKyAgICAgICAgcmVsZWFzZSgpOwogICAgICAgICBtRGF0YWJhc2UucmVtb3ZlU1FMaXRlQ2xvc2FibGUodGhpcyk7CisgICAgICAgIG1EYXRhYmFzZS5yZWxlYXNlUmVmZXJlbmNlKCk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgb25BbGxSZWZlcmVuY2VzUmVsZWFzZWRGcm9tQ29udGFpbmVyKCkgewotICAgICAgICByZWxlYXNlQ29tcGlsZWRTcWxJZk5vdEluQ2FjaGUoKTsKKyAgICAgICAgcmVsZWFzZSgpOwogICAgICAgICBtRGF0YWJhc2UucmVsZWFzZVJlZmVyZW5jZSgpOwogICAgIH0KIAotICAgIHByaXZhdGUgdm9pZCByZWxlYXNlQ29tcGlsZWRTcWxJZk5vdEluQ2FjaGUoKSB7CisgICAgLyogcGFja2FnZSAqLyBzeW5jaHJvbml6ZWQgdm9pZCByZWxlYXNlKCkgewogICAgICAgICBpZiAobUNvbXBpbGVkU3FsID09IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQpAQCAtMTM1LDIyICsxNzgsMzQgQEAKICAgICAgICAgICAgICAgICAvLyBpdCBpcyBOT1QgaW4gY29tcGlsZWQtc3FsIGNhY2hlLiBpLmUuLCByZXNwb25zaWJpbGl0eSBvZgogICAgICAgICAgICAgICAgIC8vIHJlbGVhc2luZyB0aGlzIHN0YXRlbWVudCBpcyBvbiBtZS4KICAgICAgICAgICAgICAgICBtQ29tcGlsZWRTcWwucmVsZWFzZVNxbFN0YXRlbWVudCgpOwotICAgICAgICAgICAgICAgIG1Db21waWxlZFNxbCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgblN0YXRlbWVudCA9IDA7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIC8vIGl0IGlzIGluIGNvbXBpbGVkLXNxbCBjYWNoZS4gcmVzZXQgaXRzIENvbXBpbGVkU3FsI21JblVzZSBmbGFnCiAgICAgICAgICAgICAgICAgbUNvbXBpbGVkU3FsLnJlbGVhc2UoKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgfSAKKyAgICAgICAgfQorICAgICAgICBtQ29tcGlsZWRTcWwgPSBudWxsOworICAgICAgICBuU3RhdGVtZW50ID0gMDsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgcHJvZ3JhbS4KICAgICAgKgogICAgICAqIEByZXR1cm4gYSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBwcm9ncmFtCisgICAgICogQGRlcHJlY2F0ZWQgZG8gbm90IHVzZSB0aGlzIG1ldGhvZC4gaXQgaXMgbm90IGd1YXJhbnRlZWQgdG8gYmUgdGhlIHNhbWUgYWNyb3NzIGV4ZWN1dGlvbnMgb2YKKyAgICAgKiB0aGUgU1FMIHN0YXRlbWVudCBjb250YWluZWQgaW4gdGhpcyBvYmplY3QuCiAgICAgICovCisgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgZmluYWwgaW50IGdldFVuaXF1ZUlkKCkgewotICAgICAgICByZXR1cm4gblN0YXRlbWVudDsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB1c2VkIG9ubHkgZm9yIHRlc3RpbmcgcHVycG9zZXMKKyAgICAgKi8KKyAgICAvKiBwYWNrYWdlICovIGludCBnZXRTcWxTdGF0ZW1lbnRJZCgpIHsKKyAgICAgIHN5bmNocm9uaXplZCh0aGlzKSB7CisgICAgICAgIHJldHVybiAobUNvbXBpbGVkU3FsID09IG51bGwpID8gMCA6IG5TdGF0ZW1lbnQ7CisgICAgICB9CiAgICAgfQogCiAgICAgLyogcGFja2FnZSAqLyBTdHJpbmcgZ2V0U3FsU3RyaW5nKCkgewpAQCAtMTY5LDYgKzIyNCwzOSBAQAogICAgICAgICAvLyBUT0RPIGlzIHRoZXJlIGEgbmVlZCBmb3IgdGhpcz8KICAgICB9CiAKKyAgICBwcml2YXRlIHZvaWQgYmluZChpbnQgdHlwZSwgaW50IGluZGV4LCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgbURhdGFiYXNlLnZlcmlmeURiSXNPcGVuKCk7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgYWRkVG9CaW5kQXJncyhpbmRleCwgKHR5cGUgPT0gQ3Vyc29yLkZJRUxEX1RZUEVfTlVMTCkgPyBudWxsIDogdmFsdWUpOworICAgICAgICAgICAgaWYgKG5TdGF0ZW1lbnQgPiAwKSB7CisgICAgICAgICAgICAgICAgLy8gYmluZCBvbmx5IGlmIHRoZSBTUUwgc3RhdGVtZW50IGlzIGNvbXBpbGVkCisgICAgICAgICAgICAgICAgYWNxdWlyZVJlZmVyZW5jZSgpOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDdXJzb3IuRklFTERfVFlQRV9OVUxMOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZV9iaW5kX251bGwoaW5kZXgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDdXJzb3IuRklFTERfVFlQRV9CTE9COgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZV9iaW5kX2Jsb2IoaW5kZXgsIChieXRlW10pIHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ3Vyc29yLkZJRUxEX1RZUEVfRkxPQVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlX2JpbmRfZG91YmxlKGluZGV4LCAoRG91YmxlKSB2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEN1cnNvci5GSUVMRF9UWVBFX0lOVEVHRVI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlX2JpbmRfbG9uZyhpbmRleCwgKExvbmcpIHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ3Vyc29yLkZJRUxEX1RZUEVfU1RSSU5HOgorICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVfYmluZF9zdHJpbmcoaW5kZXgsIChTdHJpbmcpIHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgIHJlbGVhc2VSZWZlcmVuY2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKICAgICAvKioKICAgICAgKiBCaW5kIGEgTlVMTCB2YWx1ZSB0byB0aGlzIHN0YXRlbWVudC4gVGhlIHZhbHVlIHJlbWFpbnMgYm91bmQgdW50aWwKICAgICAgKiB7QGxpbmsgI2NsZWFyQmluZGluZ3N9IGlzIGNhbGxlZC4KQEAgLTE3NiwzNCArMjY0LDE4IEBACiAgICAgICogQHBhcmFtIGluZGV4IFRoZSAxLWJhc2VkIGluZGV4IHRvIHRoZSBwYXJhbWV0ZXIgdG8gYmluZCBudWxsIHRvCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYmluZE51bGwoaW50IGluZGV4KSB7Ci0gICAgICAgIGlmICghbURhdGFiYXNlLmlzT3BlbigpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJkYXRhYmFzZSAiICsgbURhdGFiYXNlLmdldFBhdGgoKSArICIgYWxyZWFkeSBjbG9zZWQiKTsKLSAgICAgICAgfQotICAgICAgICBhY3F1aXJlUmVmZXJlbmNlKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBuYXRpdmVfYmluZF9udWxsKGluZGV4KTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHJlbGVhc2VSZWZlcmVuY2UoKTsKLSAgICAgICAgfQorICAgICAgICBiaW5kKEN1cnNvci5GSUVMRF9UWVBFX05VTEwsIGluZGV4LCBudWxsKTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBCaW5kIGEgbG9uZyB2YWx1ZSB0byB0aGlzIHN0YXRlbWVudC4gVGhlIHZhbHVlIHJlbWFpbnMgYm91bmQgdW50aWwKICAgICAgKiB7QGxpbmsgI2NsZWFyQmluZGluZ3N9IGlzIGNhbGxlZC4KLSAgICAgKgorICAgICAqYWRkVG9CaW5kQXJncwogICAgICAqIEBwYXJhbSBpbmRleCBUaGUgMS1iYXNlZCBpbmRleCB0byB0aGUgcGFyYW1ldGVyIHRvIGJpbmQKICAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIGJpbmQKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBiaW5kTG9uZyhpbnQgaW5kZXgsIGxvbmcgdmFsdWUpIHsKLSAgICAgICAgaWYgKCFtRGF0YWJhc2UuaXNPcGVuKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImRhdGFiYXNlICIgKyBtRGF0YWJhc2UuZ2V0UGF0aCgpICsgIiBhbHJlYWR5IGNsb3NlZCIpOwotICAgICAgICB9Ci0gICAgICAgIGFjcXVpcmVSZWZlcmVuY2UoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG5hdGl2ZV9iaW5kX2xvbmcoaW5kZXgsIHZhbHVlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHJlbGVhc2VSZWZlcmVuY2UoKTsKLSAgICAgICAgfQorICAgICAgICBiaW5kKEN1cnNvci5GSUVMRF9UWVBFX0lOVEVHRVIsIGluZGV4LCB2YWx1ZSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0yMTQsMTUgKzI4Niw3IEBACiAgICAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byBiaW5kCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYmluZERvdWJsZShpbnQgaW5kZXgsIGRvdWJsZSB2YWx1ZSkgewotICAgICAgICBpZiAoIW1EYXRhYmFzZS5pc09wZW4oKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZGF0YWJhc2UgIiArIG1EYXRhYmFzZS5nZXRQYXRoKCkgKyAiIGFscmVhZHkgY2xvc2VkIik7Ci0gICAgICAgIH0KLSAgICAgICAgYWNxdWlyZVJlZmVyZW5jZSgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgbmF0aXZlX2JpbmRfZG91YmxlKGluZGV4LCB2YWx1ZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICByZWxlYXNlUmVmZXJlbmNlKCk7Ci0gICAgICAgIH0KKyAgICAgICAgYmluZChDdXJzb3IuRklFTERfVFlQRV9GTE9BVCwgaW5kZXgsIHZhbHVlKTsKICAgICB9CiAKICAgICAvKioKQEAgLTIzNiwxNSArMzAwLDcgQEAKICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInRoZSBiaW5kIHZhbHVlIGF0IGluZGV4ICIgKyBpbmRleCArICIgaXMgbnVsbCIpOwogICAgICAgICB9Ci0gICAgICAgIGlmICghbURhdGFiYXNlLmlzT3BlbigpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJkYXRhYmFzZSAiICsgbURhdGFiYXNlLmdldFBhdGgoKSArICIgYWxyZWFkeSBjbG9zZWQiKTsKLSAgICAgICAgfQotICAgICAgICBhY3F1aXJlUmVmZXJlbmNlKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBuYXRpdmVfYmluZF9zdHJpbmcoaW5kZXgsIHZhbHVlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHJlbGVhc2VSZWZlcmVuY2UoKTsKLSAgICAgICAgfQorICAgICAgICBiaW5kKEN1cnNvci5GSUVMRF9UWVBFX1NUUklORywgaW5kZXgsIHZhbHVlKTsKICAgICB9CiAKICAgICAvKioKQEAgLTI1OCwyOSArMzE0LDI1IEBACiAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ0aGUgYmluZCB2YWx1ZSBhdCBpbmRleCAiICsgaW5kZXggKyAiIGlzIG51bGwiKTsKICAgICAgICAgfQotICAgICAgICBpZiAoIW1EYXRhYmFzZS5pc09wZW4oKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZGF0YWJhc2UgIiArIG1EYXRhYmFzZS5nZXRQYXRoKCkgKyAiIGFscmVhZHkgY2xvc2VkIik7Ci0gICAgICAgIH0KLSAgICAgICAgYWNxdWlyZVJlZmVyZW5jZSgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgbmF0aXZlX2JpbmRfYmxvYihpbmRleCwgdmFsdWUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgcmVsZWFzZVJlZmVyZW5jZSgpOwotICAgICAgICB9CisgICAgICAgIGJpbmQoQ3Vyc29yLkZJRUxEX1RZUEVfQkxPQiwgaW5kZXgsIHZhbHVlKTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBDbGVhcnMgYWxsIGV4aXN0aW5nIGJpbmRpbmdzLiBVbnNldCBiaW5kaW5ncyBhcmUgdHJlYXRlZCBhcyBOVUxMLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGNsZWFyQmluZGluZ3MoKSB7Ci0gICAgICAgIGlmICghbURhdGFiYXNlLmlzT3BlbigpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJkYXRhYmFzZSAiICsgbURhdGFiYXNlLmdldFBhdGgoKSArICIgYWxyZWFkeSBjbG9zZWQiKTsKLSAgICAgICAgfQotICAgICAgICBhY3F1aXJlUmVmZXJlbmNlKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBuYXRpdmVfY2xlYXJfYmluZGluZ3MoKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHJlbGVhc2VSZWZlcmVuY2UoKTsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBtQmluZEFyZ3MgPSBudWxsOworICAgICAgICAgICAgaWYgKHRoaXMublN0YXRlbWVudCA9PSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbURhdGFiYXNlLnZlcmlmeURiSXNPcGVuKCk7CisgICAgICAgICAgICBhY3F1aXJlUmVmZXJlbmNlKCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG5hdGl2ZV9jbGVhcl9iaW5kaW5ncygpOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICByZWxlYXNlUmVmZXJlbmNlKCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTI4OCwxNCArMzQwLDY4IEBACiAgICAgICogUmVsZWFzZSB0aGlzIHByb2dyYW0ncyByZXNvdXJjZXMsIG1ha2luZyBpdCBpbnZhbGlkLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgewotICAgICAgICBpZiAoIW1EYXRhYmFzZS5pc09wZW4oKSkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIG1CaW5kQXJncyA9IG51bGw7CisgICAgICAgICAgICBpZiAobkhhbmRsZSA9PSAwIHx8ICFtRGF0YWJhc2UuaXNPcGVuKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZWxlYXNlUmVmZXJlbmNlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGFkZFRvQmluZEFyZ3MoaW50IGluZGV4LCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgaWYgKG1CaW5kQXJncyA9PSBudWxsKSB7CisgICAgICAgICAgICBtQmluZEFyZ3MgPSBuZXcgSGFzaE1hcDxJbnRlZ2VyLCBPYmplY3Q+KCk7CisgICAgICAgIH0KKyAgICAgICAgbUJpbmRBcmdzLnB1dChpbmRleCwgdmFsdWUpOworICAgIH0KKworICAgIC8qIHBhY2thZ2UgKi8gc3luY2hyb25pemVkIHZvaWQgY29tcGlsZUFuZGJpbmRBbGxBcmdzKCkgeworICAgICAgICBpZiAoblN0YXRlbWVudCA9PSAwKSB7CisgICAgICAgICAgICAvLyBTUUwgc3RhdGVtZW50IGlzIG5vdCBjb21waWxlZCB5ZXQuIGNvbXBpbGUgaXQgbm93LgorICAgICAgICAgICAgY29tcGlsZVNxbCgpOworICAgICAgICB9CisgICAgICAgIGlmIChtQmluZEFyZ3MgPT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0gICAgICAgIG1EYXRhYmFzZS5sb2NrKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZWxlYXNlUmVmZXJlbmNlKCk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBtRGF0YWJhc2UudW5sb2NrKCk7CisgICAgICAgIGZvciAoaW50IGluZGV4IDogbUJpbmRBcmdzLmtleVNldCgpKSB7CisgICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBtQmluZEFyZ3MuZ2V0KGluZGV4KTsKKyAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbmF0aXZlX2JpbmRfbnVsbChpbmRleCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgRG91YmxlIHx8IHZhbHVlIGluc3RhbmNlb2YgRmxvYXQpIHsKKyAgICAgICAgICAgICAgICBuYXRpdmVfYmluZF9kb3VibGUoaW5kZXgsICgoTnVtYmVyKSB2YWx1ZSkuZG91YmxlVmFsdWUoKSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgTnVtYmVyKSB7CisgICAgICAgICAgICAgICAgbmF0aXZlX2JpbmRfbG9uZyhpbmRleCwgKChOdW1iZXIpIHZhbHVlKS5sb25nVmFsdWUoKSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgQm9vbGVhbikgeworICAgICAgICAgICAgICAgIEJvb2xlYW4gYm9vbCA9IChCb29sZWFuKXZhbHVlOworICAgICAgICAgICAgICAgIG5hdGl2ZV9iaW5kX2xvbmcoaW5kZXgsIChib29sKSA/IDEgOiAwKTsKKyAgICAgICAgICAgICAgICBpZiAoYm9vbCkgeworICAgICAgICAgICAgICAgICAgICBuYXRpdmVfYmluZF9sb25nKGluZGV4LCAxKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBuYXRpdmVfYmluZF9sb25nKGluZGV4LCAwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgYnl0ZVtdKXsKKyAgICAgICAgICAgICAgICBuYXRpdmVfYmluZF9ibG9iKGluZGV4LCAoYnl0ZVtdKSB2YWx1ZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG5hdGl2ZV9iaW5kX3N0cmluZyhpbmRleCwgdmFsdWUudG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHaXZlbiBhbiBhcnJheSBvZiBTdHJpbmcgYmluZEFyZ3MsIHRoaXMgbWV0aG9kIGJpbmRzIGFsbCBvZiB0aGVtIGluIG9uZSBzaW5nbGUgY2FsbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBiaW5kQXJncyB0aGUgU3RyaW5nIGFycmF5IG9mIGJpbmQgYXJncy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBiaW5kQWxsQXJnc0FzU3RyaW5ncyhTdHJpbmdbXSBiaW5kQXJncykgeworICAgICAgICBpZiAoYmluZEFyZ3MgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGludCBzaXplID0gYmluZEFyZ3MubGVuZ3RoOworICAgICAgICBzeW5jaHJvbml6ZWQodGhpcykgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICAgICAgICBiaW5kU3RyaW5nKGkgKyAxLCBiaW5kQXJnc1tpXSk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVRdWVyeS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZVF1ZXJ5LmphdmEKaW5kZXggOTA1YjY2Yi4uNjNhOGNlOSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZVF1ZXJ5LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZVF1ZXJ5LmphdmEKQEAgLTE4LDcgKzE4LDYgQEAKIAogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yV2luZG93OwogaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAogLyoqCiAgKiBBIFNRTGl0ZSBwcm9ncmFtIHRoYXQgcmVwcmVzZW50cyBhIHF1ZXJ5IHRoYXQgcmVhZHMgdGhlIHJlc3VsdGluZyByb3dzIGludG8gYSBDdXJzb3JXaW5kb3cuCkBAIC0yOCwyOCArMjcsMzcgQEAKICAqIHRocmVhZHMgc2hvdWxkIHBlcmZvcm0gaXRzIG93biBzeW5jaHJvbml6YXRpb24gd2hlbiB1c2luZyB0aGUgU1FMaXRlUXVlcnkuCiAgKi8KIHB1YmxpYyBjbGFzcyBTUUxpdGVRdWVyeSBleHRlbmRzIFNRTGl0ZVByb2dyYW0gewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiQ3Vyc29yIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlNRTGl0ZVF1ZXJ5IjsKIAogICAgIC8qKiBUaGUgaW5kZXggb2YgdGhlIHVuYm91bmQgT0ZGU0VUIHBhcmFtZXRlciAqLwotICAgIHByaXZhdGUgaW50IG1PZmZzZXRJbmRleDsKLSAgICAKLSAgICAvKiogQXJncyB0byBiaW5kIG9uIHJlcXVlcnkgKi8KLSAgICBwcml2YXRlIFN0cmluZ1tdIG1CaW5kQXJnczsKKyAgICBwcml2YXRlIGludCBtT2Zmc2V0SW5kZXggPSAwOwogCiAgICAgcHJpdmF0ZSBib29sZWFuIG1DbG9zZWQgPSBmYWxzZTsKIAogICAgIC8qKgogICAgICAqIENyZWF0ZSBhIHBlcnNpc3RlbnQgcXVlcnkgb2JqZWN0LgotICAgICAqIAorICAgICAqCiAgICAgICogQHBhcmFtIGRiIFRoZSBkYXRhYmFzZSB0aGF0IHRoaXMgcXVlcnkgb2JqZWN0IGlzIGFzc29jaWF0ZWQgd2l0aAogICAgICAqIEBwYXJhbSBxdWVyeSBUaGUgU1FMIHN0cmluZyBmb3IgdGhpcyBxdWVyeS4gCiAgICAgICogQHBhcmFtIG9mZnNldEluZGV4IFRoZSAxLWJhc2VkIGluZGV4IHRvIHRoZSBPRkZTRVQgcGFyYW1ldGVyLCAKICAgICAgKi8KICAgICAvKiBwYWNrYWdlICovIFNRTGl0ZVF1ZXJ5KFNRTGl0ZURhdGFiYXNlIGRiLCBTdHJpbmcgcXVlcnksIGludCBvZmZzZXRJbmRleCwgU3RyaW5nW10gYmluZEFyZ3MpIHsKICAgICAgICAgc3VwZXIoZGIsIHF1ZXJ5KTsKLQogICAgICAgICBtT2Zmc2V0SW5kZXggPSBvZmZzZXRJbmRleDsKLSAgICAgICAgbUJpbmRBcmdzID0gYmluZEFyZ3M7CisgICAgICAgIGJpbmRBbGxBcmdzQXNTdHJpbmdzKGJpbmRBcmdzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciB1c2VkIHRvIGNyZWF0ZSBuZXcgaW5zdGFuY2UgdG8gcmVwbGFjZSBhIGdpdmVuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuCisgICAgICogVGhpcyBjb25zdHJ1Y3RvciBpcyB1c2VkIHdoZW4gdGhlIGN1cnJlbnQgUXVlcnkgb2JqZWN0IGlzIG5vdyBhc3NvY2lhdGVkIHdpdGggYSBkaWZmZXJlbnQKKyAgICAgKiB7QGxpbmsgU1FMaXRlRGF0YWJhc2V9IG9iamVjdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkYiBUaGUgZGF0YWJhc2UgdGhhdCB0aGlzIHF1ZXJ5IG9iamVjdCBpcyBhc3NvY2lhdGVkIHdpdGgKKyAgICAgKiBAcGFyYW0gcXVlcnkgdGhlIGluc3RhbmNlIG9mIHtAbGluayBTUUxpdGVRdWVyeX0gdG8gYmUgcmVwbGFjZWQKKyAgICAgKi8KKyAgICAvKiBwYWNrYWdlICovIFNRTGl0ZVF1ZXJ5KFNRTGl0ZURhdGFiYXNlIGRiLCBTUUxpdGVRdWVyeSBxdWVyeSkgeworICAgICAgICBzdXBlcihkYiwgcXVlcnkubVNxbCk7CisgICAgICAgIHRoaXMubUJpbmRBcmdzID0gcXVlcnkubUJpbmRBcmdzOwogICAgIH0KIAogICAgIC8qKgpAQCAtNzIsMTEgKzgwLDYgQEAKICAgICAgICAgICAgICAgICAvLyBpcyBub3Qgc2FmZSBpbiB0aGlzIHNpdHVhdGlvbi4gdGhlIG5hdGl2ZSBjb2RlIHdpbGwgaWdub3JlIG1heFJlYWQKICAgICAgICAgICAgICAgICBpbnQgbnVtUm93cyA9IG5hdGl2ZV9maWxsX3dpbmRvdyh3aW5kb3csIHdpbmRvdy5nZXRTdGFydFBvc2l0aW9uKCksIG1PZmZzZXRJbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgIG1heFJlYWQsIGxhc3RQb3MpOwotCi0gICAgICAgICAgICAgICAgLy8gTG9nZ2luZwotICAgICAgICAgICAgICAgIGlmIChTUUxpdGVEZWJ1Zy5ERUJVR19TUUxfU1RBVEVNRU5UUykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJmaWxsV2luZG93KCk6ICIgKyBtU3FsKTsKLSAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgbURhdGFiYXNlLmxvZ1RpbWVTdGF0KG1TcWwsIHRpbWVTdGFydCk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIG51bVJvd3M7CiAgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSl7CkBAIC0xNDEsNTEgKzE0NCwxMyBAQAogICAgICAqIENhbGxlZCBieSBTUUxpdGVDdXJzb3Igd2hlbiBpdCBpcyByZXF1ZXJpZWQuCiAgICAgICovCiAgICAgLyogcGFja2FnZSAqLyB2b2lkIHJlcXVlcnkoKSB7Ci0gICAgICAgIGlmIChtQmluZEFyZ3MgIT0gbnVsbCkgewotICAgICAgICAgICAgaW50IGxlbiA9IG1CaW5kQXJncy5sZW5ndGg7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgc3VwZXIuYmluZFN0cmluZyhpICsgMSwgbUJpbmRBcmdzW2ldKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChTUUxpdGVNaXN1c2VFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgZXJyTXNnID0gbmV3IFN0cmluZ0J1aWxkZXIoIm1TcWwgIiArIG1TcWwpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyTXNnLmFwcGVuZCgiICIpOwotICAgICAgICAgICAgICAgICAgICBlcnJNc2cuYXBwZW5kKG1CaW5kQXJnc1tpXSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVyck1zZy5hcHBlbmQoIiAiKTsKLSAgICAgICAgICAgICAgICBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gbGVha1Byb2dyYW0gPSBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyTXNnLnRvU3RyaW5nKCksIGUpOwotICAgICAgICAgICAgICAgIHRocm93IGxlYWtQcm9ncmFtOyAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIH0KKyAgICAgICAgaWYgKG1DbG9zZWQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInJlcXVlcnlpbmcgYSBjbG9zZWQgY3Vyc29yIik7CiAgICAgICAgIH0KKyAgICAgICAgY29tcGlsZUFuZGJpbmRBbGxBcmdzKCk7CiAgICAgfQogCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgYmluZE51bGwoaW50IGluZGV4KSB7Ci0gICAgICAgIG1CaW5kQXJnc1tpbmRleCAtIDFdID0gbnVsbDsKLSAgICAgICAgaWYgKCFtQ2xvc2VkKSBzdXBlci5iaW5kTnVsbChpbmRleCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgYmluZExvbmcoaW50IGluZGV4LCBsb25nIHZhbHVlKSB7Ci0gICAgICAgIG1CaW5kQXJnc1tpbmRleCAtIDFdID0gTG9uZy50b1N0cmluZyh2YWx1ZSk7Ci0gICAgICAgIGlmICghbUNsb3NlZCkgc3VwZXIuYmluZExvbmcoaW5kZXgsIHZhbHVlKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBiaW5kRG91YmxlKGludCBpbmRleCwgZG91YmxlIHZhbHVlKSB7Ci0gICAgICAgIG1CaW5kQXJnc1tpbmRleCAtIDFdID0gRG91YmxlLnRvU3RyaW5nKHZhbHVlKTsKLSAgICAgICAgaWYgKCFtQ2xvc2VkKSBzdXBlci5iaW5kRG91YmxlKGluZGV4LCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgYmluZFN0cmluZyhpbnQgaW5kZXgsIFN0cmluZyB2YWx1ZSkgewotICAgICAgICBtQmluZEFyZ3NbaW5kZXggLSAxXSA9IHZhbHVlOwotICAgICAgICBpZiAoIW1DbG9zZWQpIHN1cGVyLmJpbmRTdHJpbmcoaW5kZXgsIHZhbHVlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIG5hdGl2ZSBpbnQgbmF0aXZlX2ZpbGxfd2luZG93KEN1cnNvcldpbmRvdyB3aW5kb3csIAorICAgIHByaXZhdGUgZmluYWwgbmF0aXZlIGludCBuYXRpdmVfZmlsbF93aW5kb3coQ3Vyc29yV2luZG93IHdpbmRvdywKICAgICAgICAgICAgIGludCBzdGFydFBvcywgaW50IG9mZnNldFBhcmFtLCBpbnQgbWF4UmVhZCwgaW50IGxhc3RQb3MpOwogCiAgICAgcHJpdmF0ZSBmaW5hbCBuYXRpdmUgaW50IG5hdGl2ZV9jb2x1bW5fY291bnQoKTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVSZWFkT25seURhdGFiYXNlRXhjZXB0aW9uLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlUmVhZE9ubHlEYXRhYmFzZUV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViNjMzYzYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlUmVhZE9ubHlEYXRhYmFzZUV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlOworCitwdWJsaWMgY2xhc3MgU1FMaXRlUmVhZE9ubHlEYXRhYmFzZUV4Y2VwdGlvbiBleHRlbmRzIFNRTGl0ZUV4Y2VwdGlvbiB7CisgICAgcHVibGljIFNRTGl0ZVJlYWRPbmx5RGF0YWJhc2VFeGNlcHRpb24oKSB7fQorCisgICAgcHVibGljIFNRTGl0ZVJlYWRPbmx5RGF0YWJhc2VFeGNlcHRpb24oU3RyaW5nIGVycm9yKSB7CisgICAgICAgIHN1cGVyKGVycm9yKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlU3RhdGVtZW50LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlU3RhdGVtZW50LmphdmEKaW5kZXggOWU0MjVjMy4uZGMwN2RiMCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZVN0YXRlbWVudC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVTdGF0ZW1lbnQuamF2YQpAQCAtMTYsNyArMTYsMTIgQEAKIAogcGFja2FnZSBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZTsKIAoraW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuRGF0YWJhc2VVdGlsczsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yOwogaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiAKIGltcG9ydCBkYWx2aWsuc3lzdGVtLkJsb2NrR3VhcmQ7CiAKQEAgLTI1LDQ0ICszMCw2NSBAQAogICogVGhlIHN0YXRlbWVudCBjYW5ub3QgcmV0dXJuIG11bHRpcGxlIHJvd3MsIGJ1dCAxeDEgcmVzdWx0IHNldHMgYXJlIGFsbG93ZWQuCiAgKiBEb24ndCB1c2UgU1FMaXRlU3RhdGVtZW50IGNvbnN0cnVjdG9yIGRpcmVjdGx5LCBwbGVhc2UgdXNlCiAgKiB7QGxpbmsgU1FMaXRlRGF0YWJhc2UjY29tcGlsZVN0YXRlbWVudChTdHJpbmcpfQotICoKKyAqPHA+CiAgKiBTUUxpdGVTdGF0ZW1lbnQgaXMgbm90IGludGVybmFsbHkgc3luY2hyb25pemVkIHNvIGNvZGUgdXNpbmcgYSBTUUxpdGVTdGF0ZW1lbnQgZnJvbSBtdWx0aXBsZQogICogdGhyZWFkcyBzaG91bGQgcGVyZm9ybSBpdHMgb3duIHN5bmNocm9uaXphdGlvbiB3aGVuIHVzaW5nIHRoZSBTUUxpdGVTdGF0ZW1lbnQuCiAgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCiBwdWJsaWMgY2xhc3MgU1FMaXRlU3RhdGVtZW50IGV4dGVuZHMgU1FMaXRlUHJvZ3JhbQogeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJTUUxpdGVTdGF0ZW1lbnQiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBSRUFEID0gdHJ1ZTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIFdSSVRFID0gZmFsc2U7CisKKyAgICBwcml2YXRlIFNRTGl0ZURhdGFiYXNlIG1PcmlnRGI7CisgICAgcHJpdmF0ZSBpbnQgbVN0YXRlOworICAgIC8qKiBwb3NzaWJsZSB2YWx1ZSBmb3Ige0BsaW5rICNtU3RhdGV9LiBpbmRpY2F0ZXMgdGhhdCBhIHRyYW5zYWN0aW9uIGlzIHN0YXJ0ZWQufSAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUUkFOU19TVEFSVEVEID0gMTsKKyAgICAvKiogcG9zc2libGUgdmFsdWUgZm9yIHtAbGluayAjbVN0YXRlfS4gaW5kaWNhdGVzIHRoYXQgYSBsb2NrIGlzIGFjcXVpcmVkLn0gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTE9DS19BQ1FVSVJFRCA9IDI7CisKICAgICAvKioKICAgICAgKiBEb24ndCB1c2UgU1FMaXRlU3RhdGVtZW50IGNvbnN0cnVjdG9yIGRpcmVjdGx5LCBwbGVhc2UgdXNlCiAgICAgICoge0BsaW5rIFNRTGl0ZURhdGFiYXNlI2NvbXBpbGVTdGF0ZW1lbnQoU3RyaW5nKX0KICAgICAgKiBAcGFyYW0gZGIKICAgICAgKiBAcGFyYW0gc3FsCiAgICAgICovCi0gICAgLyogcGFja2FnZSAqLyBTUUxpdGVTdGF0ZW1lbnQoU1FMaXRlRGF0YWJhc2UgZGIsIFN0cmluZyBzcWwpIHsKLSAgICAgICAgc3VwZXIoZGIsIHNxbCk7CisgICAgLyogcGFja2FnZSAqLyBTUUxpdGVTdGF0ZW1lbnQoU1FMaXRlRGF0YWJhc2UgZGIsIFN0cmluZyBzcWwsIE9iamVjdFtdIGJpbmRBcmdzKSB7CisgICAgICAgIHN1cGVyKGRiLCBzcWwsIGJpbmRBcmdzLCBmYWxzZSAvKiBkb24ndCBjb21waWxlIHNxbCBzdGF0ZW1lbnQgKi8pOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEV4ZWN1dGUgdGhpcyBTUUwgc3RhdGVtZW50LCBpZiBpdCBpcyBub3QgYSBxdWVyeS4gRm9yIGV4YW1wbGUsCi0gICAgICogQ1JFQVRFIFRBQkxFLCBERUxURSwgSU5TRVJULCBldGMuCisgICAgICogRXhlY3V0ZSB0aGlzIFNRTCBzdGF0ZW1lbnQsIGlmIGl0IGlzIG5vdCBhIFNFTEVDVCAvIElOU0VSVCAvIERFTEVURSAvIFVQREFURSwgZm9yIGV4YW1wbGUKKyAgICAgKiBDUkVBVEUgLyBEUk9QIHRhYmxlLCB2aWV3LCB0cmlnZ2VyLCBpbmRleCBldGMuCiAgICAgICoKICAgICAgKiBAdGhyb3dzIGFuZHJvaWQuZGF0YWJhc2UuU1FMRXhjZXB0aW9uIElmIHRoZSBTUUwgc3RyaW5nIGlzIGludmFsaWQgZm9yCiAgICAgICogICAgICAgICBzb21lIHJlYXNvbgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0gICAgICAgIEJsb2NrR3VhcmQuZ2V0VGhyZWFkUG9saWN5KCkub25Xcml0ZVRvRGlzaygpOwotICAgICAgICBpZiAoIW1EYXRhYmFzZS5pc09wZW4oKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZGF0YWJhc2UgIiArIG1EYXRhYmFzZS5nZXRQYXRoKCkgKyAiIGFscmVhZHkgY2xvc2VkIik7Ci0gICAgICAgIH0KLSAgICAgICAgbG9uZyB0aW1lU3RhcnQgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKLSAgICAgICAgbURhdGFiYXNlLmxvY2soKTsKKyAgICAgICAgZXhlY3V0ZVVwZGF0ZURlbGV0ZSgpOworICAgIH0KIAotICAgICAgICBhY3F1aXJlUmVmZXJlbmNlKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBuYXRpdmVfZXhlY3V0ZSgpOwotICAgICAgICAgICAgbURhdGFiYXNlLmxvZ1RpbWVTdGF0KG1TcWwsIHRpbWVTdGFydCk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICByZWxlYXNlUmVmZXJlbmNlKCk7Ci0gICAgICAgICAgICBtRGF0YWJhc2UudW5sb2NrKCk7CisgICAgLyoqCisgICAgICogRXhlY3V0ZSB0aGlzIFNRTCBzdGF0ZW1lbnQsIGlmIHRoZSB0aGUgbnVtYmVyIG9mIHJvd3MgYWZmZWN0ZWQgYnkgZXhlY3Rpb24gb2YgdGhpcyBTUUwKKyAgICAgKiBzdGF0ZW1lbnQgaXMgb2YgYW55IGltcG9ydGFuY2UgdG8gdGhlIGNhbGxlciAtIGZvciBleGFtcGxlLCBVUERBVEUgLyBERUxFVEUgU1FMIHN0YXRlbWVudHMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2Ygcm93cyBhZmZlY3RlZCBieSB0aGlzIFNRTCBzdGF0ZW1lbnQgZXhlY3V0aW9uLgorICAgICAqIEB0aHJvd3MgYW5kcm9pZC5kYXRhYmFzZS5TUUxFeGNlcHRpb24gSWYgdGhlIFNRTCBzdHJpbmcgaXMgaW52YWxpZCBmb3IKKyAgICAgKiAgICAgICAgIHNvbWUgcmVhc29uCisgICAgICovCisgICAgcHVibGljIGludCBleGVjdXRlVXBkYXRlRGVsZXRlKCkgeworICAgICAgICBzeW5jaHJvbml6ZWQodGhpcykgeworICAgICAgICAgICAgbG9uZyB0aW1lU3RhcnQgPSBhY3F1aXJlQW5kTG9jayhXUklURSk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGludCBudW1DaGFuZ2VzID0gbmF0aXZlX2V4ZWN1dGUoKTsKKyAgICAgICAgICAgICAgICBtRGF0YWJhc2UubG9nVGltZVN0YXQobVNxbCwgdGltZVN0YXJ0KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVtQ2hhbmdlczsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgcmVsZWFzZUFuZFVubG9jaygpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCkBAIC03NiwyMSArMTAyLDE1IEBACiAgICAgICogICAgICAgICBzb21lIHJlYXNvbgogICAgICAqLwogICAgIHB1YmxpYyBsb25nIGV4ZWN1dGVJbnNlcnQoKSB7Ci0gICAgICAgIEJsb2NrR3VhcmQuZ2V0VGhyZWFkUG9saWN5KCkub25Xcml0ZVRvRGlzaygpOwotICAgICAgICBpZiAoIW1EYXRhYmFzZS5pc09wZW4oKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZGF0YWJhc2UgIiArIG1EYXRhYmFzZS5nZXRQYXRoKCkgKyAiIGFscmVhZHkgY2xvc2VkIik7Ci0gICAgICAgIH0KLSAgICAgICAgbG9uZyB0aW1lU3RhcnQgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKLSAgICAgICAgbURhdGFiYXNlLmxvY2soKTsKLQotICAgICAgICBhY3F1aXJlUmVmZXJlbmNlKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBuYXRpdmVfZXhlY3V0ZSgpOwotICAgICAgICAgICAgbURhdGFiYXNlLmxvZ1RpbWVTdGF0KG1TcWwsIHRpbWVTdGFydCk7Ci0gICAgICAgICAgICByZXR1cm4gKG1EYXRhYmFzZS5sYXN0Q2hhbmdlQ291bnQoKSA+IDApID8gbURhdGFiYXNlLmxhc3RJbnNlcnRSb3coKSA6IC0xOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgcmVsZWFzZVJlZmVyZW5jZSgpOwotICAgICAgICAgICAgbURhdGFiYXNlLnVubG9jaygpOworICAgICAgICBzeW5jaHJvbml6ZWQodGhpcykgeworICAgICAgICAgICAgbG9uZyB0aW1lU3RhcnQgPSBhY3F1aXJlQW5kTG9jayhXUklURSk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGxvbmcgbGFzdEluc2VydGVkUm93SWQgPSBuYXRpdmVfZXhlY3V0ZUluc2VydCgpOworICAgICAgICAgICAgICAgIG1EYXRhYmFzZS5sb2dUaW1lU3RhdChtU3FsLCB0aW1lU3RhcnQpOworICAgICAgICAgICAgICAgIHJldHVybiBsYXN0SW5zZXJ0ZWRSb3dJZDsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgcmVsZWFzZUFuZFVubG9jaygpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCkBAIC0xMDMsMjEgKzEyMywxNSBAQAogICAgICAqIEB0aHJvd3MgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRG9uZUV4Y2VwdGlvbiBpZiB0aGUgcXVlcnkgcmV0dXJucyB6ZXJvIHJvd3MKICAgICAgKi8KICAgICBwdWJsaWMgbG9uZyBzaW1wbGVRdWVyeUZvckxvbmcoKSB7Ci0gICAgICAgIEJsb2NrR3VhcmQuZ2V0VGhyZWFkUG9saWN5KCkub25SZWFkRnJvbURpc2soKTsKLSAgICAgICAgaWYgKCFtRGF0YWJhc2UuaXNPcGVuKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImRhdGFiYXNlICIgKyBtRGF0YWJhc2UuZ2V0UGF0aCgpICsgIiBhbHJlYWR5IGNsb3NlZCIpOwotICAgICAgICB9Ci0gICAgICAgIGxvbmcgdGltZVN0YXJ0ID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCk7Ci0gICAgICAgIG1EYXRhYmFzZS5sb2NrKCk7Ci0KLSAgICAgICAgYWNxdWlyZVJlZmVyZW5jZSgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgbG9uZyByZXRWYWx1ZSA9IG5hdGl2ZV8xeDFfbG9uZygpOwotICAgICAgICAgICAgbURhdGFiYXNlLmxvZ1RpbWVTdGF0KG1TcWwsIHRpbWVTdGFydCk7Ci0gICAgICAgICAgICByZXR1cm4gcmV0VmFsdWU7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICByZWxlYXNlUmVmZXJlbmNlKCk7Ci0gICAgICAgICAgICBtRGF0YWJhc2UudW5sb2NrKCk7CisgICAgICAgIHN5bmNocm9uaXplZCh0aGlzKSB7CisgICAgICAgICAgICBsb25nIHRpbWVTdGFydCA9IGFjcXVpcmVBbmRMb2NrKFJFQUQpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBsb25nIHJldFZhbHVlID0gbmF0aXZlXzF4MV9sb25nKCk7CisgICAgICAgICAgICAgICAgbURhdGFiYXNlLmxvZ1RpbWVTdGF0KG1TcWwsIHRpbWVTdGFydCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldFZhbHVlOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICByZWxlYXNlQW5kVW5sb2NrKCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTEzMCwyNSArMTQ0LDEzNiBAQAogICAgICAqIEB0aHJvd3MgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRG9uZUV4Y2VwdGlvbiBpZiB0aGUgcXVlcnkgcmV0dXJucyB6ZXJvIHJvd3MKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIHNpbXBsZVF1ZXJ5Rm9yU3RyaW5nKCkgewotICAgICAgICBCbG9ja0d1YXJkLmdldFRocmVhZFBvbGljeSgpLm9uUmVhZEZyb21EaXNrKCk7Ci0gICAgICAgIGlmICghbURhdGFiYXNlLmlzT3BlbigpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJkYXRhYmFzZSAiICsgbURhdGFiYXNlLmdldFBhdGgoKSArICIgYWxyZWFkeSBjbG9zZWQiKTsKLSAgICAgICAgfQotICAgICAgICBsb25nIHRpbWVTdGFydCA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOwotICAgICAgICBtRGF0YWJhc2UubG9jaygpOwotCi0gICAgICAgIGFjcXVpcmVSZWZlcmVuY2UoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFN0cmluZyByZXRWYWx1ZSA9IG5hdGl2ZV8xeDFfc3RyaW5nKCk7Ci0gICAgICAgICAgICBtRGF0YWJhc2UubG9nVGltZVN0YXQobVNxbCwgdGltZVN0YXJ0KTsKLSAgICAgICAgICAgIHJldHVybiByZXRWYWx1ZTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHJlbGVhc2VSZWZlcmVuY2UoKTsKLSAgICAgICAgICAgIG1EYXRhYmFzZS51bmxvY2soKTsKKyAgICAgICAgc3luY2hyb25pemVkKHRoaXMpIHsKKyAgICAgICAgICAgIGxvbmcgdGltZVN0YXJ0ID0gYWNxdWlyZUFuZExvY2soUkVBRCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFN0cmluZyByZXRWYWx1ZSA9IG5hdGl2ZV8xeDFfc3RyaW5nKCk7CisgICAgICAgICAgICAgICAgbURhdGFiYXNlLmxvZ1RpbWVTdGF0KG1TcWwsIHRpbWVTdGFydCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldFZhbHVlOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICByZWxlYXNlQW5kVW5sb2NrKCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcml2YXRlIGZpbmFsIG5hdGl2ZSB2b2lkIG5hdGl2ZV9leGVjdXRlKCk7CisgICAgLyoqCisgICAgICogRXhlY3V0ZXMgYSBzdGF0ZW1lbnQgdGhhdCByZXR1cm5zIGEgMSBieSAxIHRhYmxlIHdpdGggYSBibG9iIHZhbHVlLgorICAgICAqCisgICAgICogQHJldHVybiBBIHJlYWQtb25seSBmaWxlIGRlc2NyaXB0b3IgZm9yIGEgY29weSBvZiB0aGUgYmxvYiB2YWx1ZSwgb3Ige0Bjb2RlIG51bGx9CisgICAgICogICAgICAgICBpZiB0aGUgdmFsdWUgaXMgbnVsbCBvciBjb3VsZCBub3QgYmUgcmVhZCBmb3Igc29tZSByZWFzb24uCisgICAgICoKKyAgICAgKiBAdGhyb3dzIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURvbmVFeGNlcHRpb24gaWYgdGhlIHF1ZXJ5IHJldHVybnMgemVybyByb3dzCisgICAgICovCisgICAgcHVibGljIFBhcmNlbEZpbGVEZXNjcmlwdG9yIHNpbXBsZVF1ZXJ5Rm9yQmxvYkZpbGVEZXNjcmlwdG9yKCkgeworICAgICAgICBzeW5jaHJvbml6ZWQodGhpcykgeworICAgICAgICAgICAgbG9uZyB0aW1lU3RhcnQgPSBhY3F1aXJlQW5kTG9jayhSRUFEKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgUGFyY2VsRmlsZURlc2NyaXB0b3IgcmV0VmFsdWUgPSBuYXRpdmVfMXgxX2Jsb2JfYXNobWVtKCk7CisgICAgICAgICAgICAgICAgbURhdGFiYXNlLmxvZ1RpbWVTdGF0KG1TcWwsIHRpbWVTdGFydCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldFZhbHVlOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJzaW1wbGVRdWVyeUZvckJsb2JGaWxlRGVzY3JpcHRvcigpIGZhaWxlZCIsIGV4KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgcmVsZWFzZUFuZFVubG9jaygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIGJlZm9yZSBldmVyeSBtZXRob2QgaW4gdGhpcyBjbGFzcyBiZWZvcmUgZXhlY3V0aW5nIGEgU1FMIHN0YXRlbWVudCwKKyAgICAgKiB0aGlzIG1ldGhvZCBkb2VzIHRoZSBmb2xsb3dpbmc6CisgICAgICogPHVsPgorICAgICAqICAgPGxpPm1ha2Ugc3VyZSB0aGUgZGF0YWJhc2UgaXMgb3BlbjwvbGk+CisgICAgICogICA8bGk+Z2V0IGEgZGF0YWJhc2UgY29ubmVjdGlvbiBmcm9tIHRoZSBjb25uZWN0aW9uIHBvb2wsaWYgcG9zc2libGU8L2xpPgorICAgICAqICAgPGxpPm5vdGlmaWVzIHtAbGluayBCbG9ja0d1YXJkfSBvZiByZWFkL3dyaXRlPC9saT4KKyAgICAgKiAgIDxsaT5pZiB0aGUgU1FMIHN0YXRlbWVudCBpcyBhbiB1cGRhdGUsIHN0YXJ0IHRyYW5zYWN0aW9uIGlmIG5vdCBhbHJlYWR5IGluIG9uZS4KKyAgICAgKiAgIG90aGVyd2lzZSwgZ2V0IGxvY2sgb24gdGhlIGRhdGFiYXNlPC9saT4KKyAgICAgKiAgIDxsaT5hY3F1aXJlIHJlZmVyZW5jZSBvbiB0aGlzIG9iamVjdDwvbGk+CisgICAgICogICA8bGk+YW5kIHRoZW4gcmV0dXJuIHRoZSBjdXJyZW50IHRpbWUgX2JlZm9yZV8gdGhlIGRhdGFiYXNlIGxvY2sgd2FzIGFjcXVpcmVkPC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqIDxwPgorICAgICAqIFRoaXMgbWV0aG9kIHJlbW92ZXMgdGhlIGR1cGxpY2F0ZSBjb2RlIGZyb20gdGhlIG90aGVyIHB1YmxpYworICAgICAqIG1ldGhvZHMgaW4gdGhpcyBjbGFzcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGxvbmcgYWNxdWlyZUFuZExvY2soYm9vbGVhbiByd0ZsYWcpIHsKKyAgICAgICAgbVN0YXRlID0gMDsKKyAgICAgICAgLy8gdXNlIHBvb2xlZCBkYXRhYmFzZSBjb25uZWN0aW9uIGhhbmRsZXMgZm9yIFNFTEVDVCBTUUwgc3RhdGVtZW50cworICAgICAgICBtRGF0YWJhc2UudmVyaWZ5RGJJc09wZW4oKTsKKyAgICAgICAgU1FMaXRlRGF0YWJhc2UgZGIgPSAobVN0YXRlbWVudFR5cGUgIT0gRGF0YWJhc2VVdGlscy5TVEFURU1FTlRfU0VMRUNUKSA/IG1EYXRhYmFzZQorICAgICAgICAgICAgICAgIDogbURhdGFiYXNlLmdldERiQ29ubmVjdGlvbihtU3FsKTsKKyAgICAgICAgLy8gdXNlIHRoZSBkYXRhYmFzZSBjb25uZWN0aW9uIG9idGFpbmVkIGFib3ZlCisgICAgICAgIG1PcmlnRGIgPSBtRGF0YWJhc2U7CisgICAgICAgIG1EYXRhYmFzZSA9IGRiOworICAgICAgICBuSGFuZGxlID0gbURhdGFiYXNlLm1OYXRpdmVIYW5kbGU7CisgICAgICAgIGlmIChyd0ZsYWcgPT0gV1JJVEUpIHsKKyAgICAgICAgICAgIEJsb2NrR3VhcmQuZ2V0VGhyZWFkUG9saWN5KCkub25Xcml0ZVRvRGlzaygpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQmxvY2tHdWFyZC5nZXRUaHJlYWRQb2xpY3koKS5vblJlYWRGcm9tRGlzaygpOworICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogU3BlY2lhbCBjYXNlIGhhbmRsaW5nIG9mIFNRTGl0ZURhdGFiYXNlLmV4ZWNTUUwoIkJFR0lOIHRyYW5zYWN0aW9uIikuCisgICAgICAgICAqIHdlIGtub3cgaXQgaXMgZXhlY1NRTCgiQkVHSU4gdHJhbnNhY3Rpb24iKSBmcm9tIHRoZSBjYWxsZXIgSUYgdGhlcmUgaXMgbm8gbG9jayBoZWxkLgorICAgICAgICAgKiBiZWdpblRyYW5zYWN0aW9uKCkgbWV0aG9kcyBpbiBTUUxpdGVEYXRhYmFzZSBjYWxsIGxvY2tGb3JjZWQoKSBiZWZvcmUKKyAgICAgICAgICogY2FsbGluZyBleGVjU1FMKCJCRUdJTiB0cmFuc2FjdGlvbiIpLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKG1TdGF0ZW1lbnRUeXBlID09IERhdGFiYXNlVXRpbHMuU1RBVEVNRU5UX0JFR0lOKSB7CisgICAgICAgICAgICBpZiAoIW1EYXRhYmFzZS5pc0RiTG9ja2VkQnlDdXJyZW50VGhyZWFkKCkpIHsKKyAgICAgICAgICAgICAgICAvLyB0cmFuc2FjdGlvbiBpcyAgTk9UIHN0YXJ0ZWQgYnkgY2FsbGluZyBiZWdpblRyYW5zYWN0aW9uKCkgbWV0aG9kcyBpbgorICAgICAgICAgICAgICAgIC8vIFNRTGl0ZURhdGFiYXNlCisgICAgICAgICAgICAgICAgbURhdGFiYXNlLnNldFRyYW5zYWN0aW9uVXNpbmdFeGVjU3FsRmxhZygpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKG1TdGF0ZW1lbnRUeXBlID09IERhdGFiYXNlVXRpbHMuU1RBVEVNRU5UX1VQREFURSkgeworICAgICAgICAgICAgLy8gZ290IHVwZGF0ZSBTUUwgc3RhdGVtZW50LiBpZiB0aGVyZSBpcyBOTyBwZW5kaW5nIHRyYW5zYWN0aW9uLCBzdGFydCBvbmUKKyAgICAgICAgICAgIGlmICghbURhdGFiYXNlLmluVHJhbnNhY3Rpb24oKSkgeworICAgICAgICAgICAgICAgIG1EYXRhYmFzZS5iZWdpblRyYW5zYWN0aW9uTm9uRXhjbHVzaXZlKCk7CisgICAgICAgICAgICAgICAgbVN0YXRlID0gVFJBTlNfU1RBUlRFRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBkbyBJIGhhdmUgZGF0YWJhc2UgbG9jaz8gaWYgbm90LCBncmFiIGl0LgorICAgICAgICBpZiAoIW1EYXRhYmFzZS5pc0RiTG9ja2VkQnlDdXJyZW50VGhyZWFkKCkpIHsKKyAgICAgICAgICAgIG1EYXRhYmFzZS5sb2NrKCk7CisgICAgICAgICAgICBtU3RhdGUgPSBMT0NLX0FDUVVJUkVEOworICAgICAgICB9CisKKyAgICAgICAgYWNxdWlyZVJlZmVyZW5jZSgpOworICAgICAgICBsb25nIHN0YXJ0VGltZSA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOworICAgICAgICBtRGF0YWJhc2UuY2xvc2VQZW5kaW5nU3RhdGVtZW50cygpOworICAgICAgICBjb21waWxlQW5kYmluZEFsbEFyZ3MoKTsKKyAgICAgICAgcmV0dXJuIHN0YXJ0VGltZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB0aGlzIG1ldGhvZCByZWxlYXNlcyBsb2NrcyBhbmQgcmVmZXJlbmNlcyBhY3F1aXJlZCBpbiB7QGxpbmsgI2FjcXVpcmVBbmRMb2NrKGJvb2xlYW4pfQorICAgICAqLworICAgIHByaXZhdGUgdm9pZCByZWxlYXNlQW5kVW5sb2NrKCkgeworICAgICAgICByZWxlYXNlUmVmZXJlbmNlKCk7CisgICAgICAgIGlmIChtU3RhdGUgPT0gVFJBTlNfU1RBUlRFRCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtRGF0YWJhc2Uuc2V0VHJhbnNhY3Rpb25TdWNjZXNzZnVsKCk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIG1EYXRhYmFzZS5lbmRUcmFuc2FjdGlvbigpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKG1TdGF0ZSA9PSBMT0NLX0FDUVVJUkVEKSB7CisgICAgICAgICAgICBtRGF0YWJhc2UudW5sb2NrKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1TdGF0ZW1lbnRUeXBlID09IERhdGFiYXNlVXRpbHMuU1RBVEVNRU5UX0NPTU1JVCB8fAorICAgICAgICAgICAgICAgIG1TdGF0ZW1lbnRUeXBlID09IERhdGFiYXNlVXRpbHMuU1RBVEVNRU5UX0FCT1JUKSB7CisgICAgICAgICAgICBtRGF0YWJhc2UucmVzZXRUcmFuc2FjdGlvblVzaW5nRXhlY1NxbEZsYWcoKTsKKyAgICAgICAgfQorICAgICAgICBjbGVhckJpbmRpbmdzKCk7CisgICAgICAgIC8vIHJlbGVhc2UgdGhlIGNvbXBpbGVkIHNxbCBzdGF0ZW1lbnQgc28gdGhhdCB0aGUgY2FsbGVyJ3MgU1FMaXRlU3RhdGVtZW50IG5vIGxvbmdlcgorICAgICAgICAvLyBoYXMgYSBoYXJkIHJlZmVyZW5jZSB0byBhIGRhdGFiYXNlIG9iamVjdCB0aGF0IG1heSBnZXQgZGVhbGxvY2F0ZWQgYXQgYW55IHBvaW50LgorICAgICAgICByZWxlYXNlKCk7CisgICAgICAgIC8vIHJlc3RvcmUgdGhlIGRhdGFiYXNlIGNvbm5lY3Rpb24gaGFuZGxlIHRvIHRoZSBvcmlnaW5hbCB2YWx1ZQorICAgICAgICBtRGF0YWJhc2UgPSBtT3JpZ0RiOworICAgICAgICBuSGFuZGxlID0gbURhdGFiYXNlLm1OYXRpdmVIYW5kbGU7CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBuYXRpdmUgaW50IG5hdGl2ZV9leGVjdXRlKCk7CisgICAgcHJpdmF0ZSBmaW5hbCBuYXRpdmUgbG9uZyBuYXRpdmVfZXhlY3V0ZUluc2VydCgpOwogICAgIHByaXZhdGUgZmluYWwgbmF0aXZlIGxvbmcgbmF0aXZlXzF4MV9sb25nKCk7CiAgICAgcHJpdmF0ZSBmaW5hbCBuYXRpdmUgU3RyaW5nIG5hdGl2ZV8xeDFfc3RyaW5nKCk7CisgICAgcHJpdmF0ZSBmaW5hbCBuYXRpdmUgUGFyY2VsRmlsZURlc2NyaXB0b3IgbmF0aXZlXzF4MV9ibG9iX2FzaG1lbSgpIHRocm93cyBJT0V4Y2VwdGlvbjsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVUYWJsZUxvY2tlZEV4Y2VwdGlvbi5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZVRhYmxlTG9ja2VkRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI3OGRmMAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVUYWJsZUxvY2tlZEV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlOworCitwdWJsaWMgY2xhc3MgU1FMaXRlVGFibGVMb2NrZWRFeGNlcHRpb24gZXh0ZW5kcyBTUUxpdGVFeGNlcHRpb24geworICAgIHB1YmxpYyBTUUxpdGVUYWJsZUxvY2tlZEV4Y2VwdGlvbigpIHt9CisKKyAgICBwdWJsaWMgU1FMaXRlVGFibGVMb2NrZWRFeGNlcHRpb24oU3RyaW5nIGVycm9yKSB7CisgICAgICAgIHN1cGVyKGVycm9yKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9oYXJkd2FyZS9TZW5zb3JFdmVudC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvaGFyZHdhcmUvU2Vuc29yRXZlbnQuamF2YQppbmRleCA2MjEyZTFiLi4yYzVjOTA5IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9oYXJkd2FyZS9TZW5zb3JFdmVudC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2hhcmR3YXJlL1NlbnNvckV2ZW50LmphdmEKQEAgLTg0LDE0ICs4NCwxNCBAQAogICAgICAqIHNlbnNvciBpdHNlbGYgKDxiPkZzPC9iPikgdXNpbmcgdGhlIHJlbGF0aW9uOgogICAgICAqIDwvcD4KICAgICAgKiAKLSAgICAgKiA8Yj48Y2VudGVyPkFkID0gLSC3RnMgLyBtYXNzPC9jZW50ZXI+PC9iPgorICAgICAqIDxiPjxjZW50ZXI+QWQgPSAtICYjODcyMTtGcyAvIG1hc3M8L2NlbnRlcj48L2I+CiAgICAgICogCiAgICAgICogPHA+CiAgICAgICogSW4gcGFydGljdWxhciwgdGhlIGZvcmNlIG9mIGdyYXZpdHkgaXMgYWx3YXlzIGluZmx1ZW5jaW5nIHRoZSBtZWFzdXJlZAogICAgICAqIGFjY2VsZXJhdGlvbjoKICAgICAgKiA8L3A+CiAgICAgICogCi0gICAgICogPGI+PGNlbnRlcj5BZCA9IC1nIC0gt0YgLyBtYXNzPC9jZW50ZXI+PC9iPgorICAgICAqIDxiPjxjZW50ZXI+QWQgPSAtZyAtICYjODcyMTtGIC8gbWFzczwvY2VudGVyPjwvYj4KICAgICAgKiAKICAgICAgKiA8cD4KICAgICAgKiBGb3IgdGhpcyByZWFzb24sIHdoZW4gdGhlIGRldmljZSBpcyBzaXR0aW5nIG9uIGEgdGFibGUgKGFuZCBvYnZpb3VzbHkgbm90CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9oYXJkd2FyZS9Vc2IuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2hhcmR3YXJlL1VzYi5qYXZhCmluZGV4IDU3MjcxZDQuLjEwMjhmOWYgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2hhcmR3YXJlL1VzYi5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2hhcmR3YXJlL1VzYi5qYXZhCkBAIC01NSw2ICs1NSwyNCBAQAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9VU0JfU1RBVEUgPQogICAgICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYWN0aW9uLlVTQl9TVEFURSI7CiAKKyAgIC8qKgorICAgICAqIEJyb2FkY2FzdCBBY3Rpb246ICBBIGJyb2FkY2FzdCBmb3IgVVNCIGNhbWVyYSBhdHRhY2hlZCBldmVudC4KKyAgICAgKgorICAgICAqIFRoaXMgaW50ZW50IGlzIHNlbnQgd2hlbiBhIFVTQiBkZXZpY2Ugc3VwcG9ydGluZyBQVFAgaXMgYXR0YWNoZWQgdG8gdGhlIGhvc3QgVVNCIGJ1cy4KKyAgICAgKiBUaGUgaW50ZW50J3MgZGF0YSBjb250YWlucyBhIFVyaSBmb3IgdGhlIGRldmljZSBpbiB0aGUgTVRQIHByb3ZpZGVyLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9VU0JfQ0FNRVJBX0FUVEFDSEVEID0KKyAgICAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmFjdGlvbi5VU0JfQ0FNRVJBX0FUVEFDSEVEIjsKKworICAgLyoqCisgICAgICogQnJvYWRjYXN0IEFjdGlvbjogIEEgYnJvYWRjYXN0IGZvciBVU0IgY2FtZXJhIGRldGFjaGVkIGV2ZW50LgorICAgICAqCisgICAgICogVGhpcyBpbnRlbnQgaXMgc2VudCB3aGVuIGEgVVNCIGRldmljZSBzdXBwb3J0aW5nIFBUUCBpcyBkZXRhY2hlZCBmcm9tIHRoZSBob3N0IFVTQiBidXMuCisgICAgICogVGhlIGludGVudCdzIGRhdGEgY29udGFpbnMgYSBVcmkgZm9yIHRoZSBkZXZpY2UgaW4gdGhlIE1UUCBwcm92aWRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fVVNCX0NBTUVSQV9ERVRBQ0hFRCA9CisgICAgICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hY3Rpb24uVVNCX0NBTUVSQV9ERVRBQ0hFRCI7CisKICAgICAvKioKICAgICAgKiBCb29sZWFuIGV4dHJhIGluZGljYXRpbmcgd2hldGhlciBVU0IgaXMgY29ubmVjdGVkIG9yIGRpc2Nvbm5lY3RlZC4KICAgICAgKiBVc2VkIGluIGV4dHJhcyBmb3IgdGhlIHtAbGluayAjQUNUSU9OX1VTQl9TVEFURX0gYnJvYWRjYXN0LgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvaW5wdXRtZXRob2RzZXJ2aWNlL0tleWJvYXJkLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9pbnB1dG1ldGhvZHNlcnZpY2UvS2V5Ym9hcmQuamF2YQppbmRleCA0ODE0YjBhLi44ODVhNmI4IDEwMDc1NQotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9pbnB1dG1ldGhvZHNlcnZpY2UvS2V5Ym9hcmQuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9pbnB1dG1ldGhvZHNlcnZpY2UvS2V5Ym9hcmQuamF2YQpAQCAtNTAwLDcgKzUwMCwzMCBAQAogICAgIHB1YmxpYyBLZXlib2FyZChDb250ZXh0IGNvbnRleHQsIGludCB4bWxMYXlvdXRSZXNJZCkgewogICAgICAgICB0aGlzKGNvbnRleHQsIHhtbExheW91dFJlc0lkLCAwKTsKICAgICB9Ci0gICAgCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEga2V5Ym9hcmQgZnJvbSB0aGUgZ2l2ZW4geG1sIGtleSBsYXlvdXQgZmlsZS4gV2VlZHMgb3V0IHJvd3MKKyAgICAgKiB0aGF0IGhhdmUgYSBrZXlib2FyZCBtb2RlIGRlZmluZWQgYnV0IGRvbid0IG1hdGNoIHRoZSBzcGVjaWZpZWQgbW9kZS4KKyAgICAgKiBAcGFyYW0gY29udGV4dCB0aGUgYXBwbGljYXRpb24gb3Igc2VydmljZSBjb250ZXh0CisgICAgICogQHBhcmFtIHhtbExheW91dFJlc0lkIHRoZSByZXNvdXJjZSBmaWxlIHRoYXQgY29udGFpbnMgdGhlIGtleWJvYXJkIGxheW91dCBhbmQga2V5cy4KKyAgICAgKiBAcGFyYW0gbW9kZUlkIGtleWJvYXJkIG1vZGUgaWRlbnRpZmllcgorICAgICAqIEBwYXJhbSB3aWR0aCBzZXRzIHdpZHRoIG9mIGtleWJvYXJkCisgICAgICogQHBhcmFtIGhlaWdodCBzZXRzIGhlaWdodCBvZiBrZXlib2FyZAorICAgICAqLworICAgIHB1YmxpYyBLZXlib2FyZChDb250ZXh0IGNvbnRleHQsIGludCB4bWxMYXlvdXRSZXNJZCwgaW50IG1vZGVJZCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CisgICAgICAgIG1EaXNwbGF5V2lkdGggPSB3aWR0aDsKKyAgICAgICAgbURpc3BsYXlIZWlnaHQgPSBoZWlnaHQ7CisKKyAgICAgICAgbURlZmF1bHRIb3Jpem9udGFsR2FwID0gMDsKKyAgICAgICAgbURlZmF1bHRXaWR0aCA9IG1EaXNwbGF5V2lkdGggLyAxMDsKKyAgICAgICAgbURlZmF1bHRWZXJ0aWNhbEdhcCA9IDA7CisgICAgICAgIG1EZWZhdWx0SGVpZ2h0ID0gbURlZmF1bHRXaWR0aDsKKyAgICAgICAgbUtleXMgPSBuZXcgQXJyYXlMaXN0PEtleT4oKTsKKyAgICAgICAgbU1vZGlmaWVyS2V5cyA9IG5ldyBBcnJheUxpc3Q8S2V5PigpOworICAgICAgICBtS2V5Ym9hcmRNb2RlID0gbW9kZUlkOworICAgICAgICBsb2FkS2V5Ym9hcmQoY29udGV4dCwgY29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRYbWwoeG1sTGF5b3V0UmVzSWQpKTsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBDcmVhdGVzIGEga2V5Ym9hcmQgZnJvbSB0aGUgZ2l2ZW4geG1sIGtleSBsYXlvdXQgZmlsZS4gV2VlZHMgb3V0IHJvd3MKICAgICAgKiB0aGF0IGhhdmUgYSBrZXlib2FyZCBtb2RlIGRlZmluZWQgYnV0IGRvbid0IG1hdGNoIHRoZSBzcGVjaWZpZWQgbW9kZS4gCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9pbnB1dG1ldGhvZHNlcnZpY2UvS2V5Ym9hcmRWaWV3LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9pbnB1dG1ldGhvZHNlcnZpY2UvS2V5Ym9hcmRWaWV3LmphdmEKaW5kZXggNGI0ODQwOS4uYWI1Yzc4YSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvaW5wdXRtZXRob2RzZXJ2aWNlL0tleWJvYXJkVmlldy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2lucHV0bWV0aG9kc2VydmljZS9LZXlib2FyZFZpZXcuamF2YQpAQCAtMTEyOCw3ICsxMTI4LDkgQEAKIAogICAgIHByaXZhdGUgYm9vbGVhbiBvbk1vZGlmaWVkVG91Y2hFdmVudChNb3Rpb25FdmVudCBtZSwgYm9vbGVhbiBwb3NzaWJsZVBvbHkpIHsKICAgICAgICAgaW50IHRvdWNoWCA9IChpbnQpIG1lLmdldFgoKSAtIG1QYWRkaW5nTGVmdDsKLSAgICAgICAgaW50IHRvdWNoWSA9IChpbnQpIG1lLmdldFkoKSArIG1WZXJ0aWNhbENvcnJlY3Rpb24gLSBtUGFkZGluZ1RvcDsKKyAgICAgICAgaW50IHRvdWNoWSA9IChpbnQpIG1lLmdldFkoKSAtIG1QYWRkaW5nVG9wOworICAgICAgICBpZiAodG91Y2hZID49IC1tVmVydGljYWxDb3JyZWN0aW9uKQorICAgICAgICAgICAgdG91Y2hZICs9IG1WZXJ0aWNhbENvcnJlY3Rpb247CiAgICAgICAgIGZpbmFsIGludCBhY3Rpb24gPSBtZS5nZXRBY3Rpb24oKTsKICAgICAgICAgZmluYWwgbG9uZyBldmVudFRpbWUgPSBtZS5nZXRFdmVudFRpbWUoKTsKICAgICAgICAgbU9sZEV2ZW50VGltZSA9IGV2ZW50VGltZTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL25ldC9Db25uZWN0aXZpdHlNYW5hZ2VyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvQ29ubmVjdGl2aXR5TWFuYWdlci5qYXZhCmluZGV4IDI4MGRlZDYuLjhkMWEwNGMgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL25ldC9Db25uZWN0aXZpdHlNYW5hZ2VyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L0Nvbm5lY3Rpdml0eU1hbmFnZXIuamF2YQpAQCAtMzI0LDE0ICszMjQsMTQgQEAKICAgICAgKiA8cD4KICAgICAgKiBBbGwgYXBwbGljYXRpb25zIHRoYXQgaGF2ZSBiYWNrZ3JvdW5kIHNlcnZpY2VzIHRoYXQgdXNlIHRoZSBuZXR3b3JrCiAgICAgICogc2hvdWxkIGxpc3RlbiB0byB7QGxpbmsgI0FDVElPTl9CQUNLR1JPVU5EX0RBVEFfU0VUVElOR19DSEFOR0VEfS4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEByZXR1cm4gV2hldGhlciBiYWNrZ3JvdW5kIGRhdGEgdXNhZ2UgaXMgYWxsb3dlZC4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBnZXRCYWNrZ3JvdW5kRGF0YVNldHRpbmcoKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICByZXR1cm4gbVNlcnZpY2UuZ2V0QmFja2dyb3VuZERhdGFTZXR0aW5nKCk7CiAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBFcnIgb24gdGhlIHNpZGUgb2Ygc2FmZXR5IAorICAgICAgICAgICAgLy8gRXJyIG9uIHRoZSBzaWRlIG9mIHNhZmV0eQogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgfQpAQCAtNDg5LDYgKzQ4OSwxNyBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgLyoqCisgICAgICoge0BoaWRlfQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRUZXRoZXJhYmxlQmx1ZXRvb3RoUmVnZXhzKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLmdldFRldGhlcmFibGVCbHVldG9vdGhSZWdleHMoKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nWzBdOworICAgICAgICB9CisgICAgfQorCiAgICAgLyoqIHtAaGlkZX0gKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBURVRIRVJfRVJST1JfTk9fRVJST1IgICAgICAgICAgID0gMDsKICAgICAvKioge0BoaWRlfSAqLwpAQCAtNTI0LDUgKzUzNSwyMCBAQAogICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgcmV0dXJuIFRFVEhFUl9FUlJPUl9TRVJWSUNFX1VOQVZBSUw7CiAgICAgICAgIH0KLSAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbnN1cmUgdGhlIGRldmljZSBzdGF5cyBhd2FrZSB1bnRpbCB3ZSBjb25uZWN0IHdpdGggdGhlIG5leHQgbmV0d29yaworICAgICAqIEBwYXJhbSBmb3JXaG9tZSBUaGUgbmFtZSBvZiB0aGUgbmV0d29yayBnb2luZyBkb3duIGZvciBsb2dnaW5nIHB1cnBvc2VzCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gb24gc3VjY2Vzcywge0Bjb2RlIGZhbHNlfSBvbiBmYWlsdXJlCisgICAgICoge0BoaWRlfQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHJlcXVlc3ROZXR3b3JrVHJhbnNpdGlvbldha2Vsb2NrKFN0cmluZyBmb3JXaG9tKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtU2VydmljZS5yZXF1ZXN0TmV0d29ya1RyYW5zaXRpb25XYWtlbG9jayhmb3JXaG9tKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvbmV0L0Rvd25sb2Fkcy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L0Rvd25sb2Fkcy5qYXZhCmluZGV4IGZkMzM3ODEuLmRkZGU1YzEgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL25ldC9Eb3dubG9hZHMuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvRG93bmxvYWRzLmphdmEKQEAgLTQzMCwxMSArNDMwLDEwIEBACiAKICAgICAgICAgICAgIENvbnRlbnRSZXNvbHZlciBjciA9IGNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCk7CiAKLSAgICAgICAgICAgIEN1cnNvciBjID0gY3IucXVlcnkoCi0gICAgICAgICAgICAgICAgICAgIGRvd25sb2FkVXJpLCBET1dOTE9BRFNfUFJPSkVDVElPTiwgbnVsbCAvKiBzZWxlY3Rpb24gKi8sIG51bGwgLyogc2VsZWN0aW9uIGFyZ3MgKi8sCi0gICAgICAgICAgICAgICAgICAgIG51bGwgLyogc29ydCBvcmRlciAqLyk7CisgICAgICAgICAgICBDdXJzb3IgYyA9IGNyLnF1ZXJ5KGRvd25sb2FkVXJpLCBET1dOTE9BRFNfUFJPSkVDVElPTiwgbnVsbCAvKiBzZWxlY3Rpb24gKi8sCisgICAgICAgICAgICAgICAgICAgIG51bGwgLyogc2VsZWN0aW9uIGFyZ3MgKi8sIG51bGwgLyogc29ydCBvcmRlciAqLyk7CiAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGlmICghYy5tb3ZlVG9OZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoYyA9PSBudWxsIHx8ICFjLm1vdmVUb05leHQoKSkgewogICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvbmV0L0lDb25uZWN0aXZpdHlNYW5hZ2VyLmFpZGwgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvSUNvbm5lY3Rpdml0eU1hbmFnZXIuYWlkbAppbmRleCBiMDVjMmVkLi4xZDU3MDE5IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvSUNvbm5lY3Rpdml0eU1hbmFnZXIuYWlkbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvSUNvbm5lY3Rpdml0eU1hbmFnZXIuYWlkbApAQCAtMSwxNiArMSwxNiBAQAogLyoqCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCi0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCkBAIC03Miw0ICs3Miw4IEBACiAgICAgU3RyaW5nW10gZ2V0VGV0aGVyYWJsZVVzYlJlZ2V4cygpOwogCiAgICAgU3RyaW5nW10gZ2V0VGV0aGVyYWJsZVdpZmlSZWdleHMoKTsKKworICAgIFN0cmluZ1tdIGdldFRldGhlcmFibGVCbHVldG9vdGhSZWdleHMoKTsKKworICAgIHZvaWQgcmVxdWVzdE5ldHdvcmtUcmFuc2l0aW9uV2FrZWxvY2soaW4gU3RyaW5nIGZvcldob20pOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvbmV0L01vYmlsZURhdGFTdGF0ZVRyYWNrZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9Nb2JpbGVEYXRhU3RhdGVUcmFja2VyLmphdmEKaW5kZXggZWI3MTE3Yi4uOTY1YWY4YiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvbmV0L01vYmlsZURhdGFTdGF0ZVRyYWNrZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvTW9iaWxlRGF0YVN0YXRlVHJhY2tlci5qYXZhCkBAIC0yMiwxMiArMjIsMTUgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyOwogaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwogaW1wb3J0IGFuZHJvaWQub3MuU2VydmljZU1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1Qcm9wZXJ0aWVzOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5JVGVsZXBob255OwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5QaG9uZTsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuVGVsZXBob255SW50ZW50czsKIGltcG9ydCBhbmRyb2lkLm5ldC5OZXR3b3JrSW5mby5EZXRhaWxlZFN0YXRlOworaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtJbmZvOworaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtQcm9wZXJ0aWVzOwogaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlRlbGVwaG9ueU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIGltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwpAQCAtMzksNyArNDIsNyBAQAogICoKICAqIHtAaGlkZX0KICAqLwotcHVibGljIGNsYXNzIE1vYmlsZURhdGFTdGF0ZVRyYWNrZXIgZXh0ZW5kcyBOZXR3b3JrU3RhdGVUcmFja2VyIHsKK3B1YmxpYyBjbGFzcyBNb2JpbGVEYXRhU3RhdGVUcmFja2VyIGltcGxlbWVudHMgTmV0d29ya1N0YXRlVHJhY2tlciB7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk1vYmlsZURhdGFTdGF0ZVRyYWNrZXIiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREJHID0gdHJ1ZTsKQEAgLTQ4LDEwICs1MSwxNSBAQAogICAgIHByaXZhdGUgSVRlbGVwaG9ueSBtUGhvbmVTZXJ2aWNlOwogCiAgICAgcHJpdmF0ZSBTdHJpbmcgbUFwblR5cGU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbUFwblR5cGVUb1dhdGNoRm9yOwotICAgIHByaXZhdGUgU3RyaW5nIG1BcG5OYW1lOwotICAgIHByaXZhdGUgYm9vbGVhbiBtRW5hYmxlZDsKLSAgICBwcml2YXRlIEJyb2FkY2FzdFJlY2VpdmVyIG1TdGF0ZVJlY2VpdmVyOworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZ1tdIHNEbnNQcm9wTmFtZXM7CisgICAgcHJpdmF0ZSBOZXR3b3JrSW5mbyBtTmV0d29ya0luZm87CisgICAgcHJpdmF0ZSBib29sZWFuIG1UZWFyZG93blJlcXVlc3RlZCA9IGZhbHNlOworICAgIHByaXZhdGUgSGFuZGxlciBtVGFyZ2V0OworICAgIHByaXZhdGUgQ29udGV4dCBtQ29udGV4dDsKKyAgICBwcml2YXRlIE5ldHdvcmtQcm9wZXJ0aWVzIG1OZXR3b3JrUHJvcGVydGllczsKKyAgICBwcml2YXRlIGJvb2xlYW4gbVByaXZhdGVEbnNSb3V0ZVNldCA9IGZhbHNlOworICAgIHByaXZhdGUgaW50IG1EZWZhdWx0R2F0ZXdheUFkZHIgPSAwOworICAgIHByaXZhdGUgYm9vbGVhbiBtRGVmYXVsdFJvdXRlU2V0ID0gZmFsc2U7CiAKICAgICAvLyBERUZBVUxUIGFuZCBISVBSSSBhcmUgdGhlIHNhbWUgY29ubmVjdGlvbi4gIElmIHdlJ3JlIG9uZSBvZiB0aGVzZSB3ZSBuZWVkIHRvIGNoZWNrIGlmCiAgICAgLy8gdGhlIG90aGVyIGlzIGFsc28gZGlzY29ubmVjdGVkIGJlZm9yZSB3ZSByZXNldCBzb2NrZXRzCkBAIC01OSwzNSArNjcsMjIgQEAKIAogICAgIC8qKgogICAgICAqIENyZWF0ZSBhIG5ldyBNb2JpbGVEYXRhU3RhdGVUcmFja2VyCi0gICAgICogQHBhcmFtIGNvbnRleHQgdGhlIGFwcGxpY2F0aW9uIGNvbnRleHQgb2YgdGhlIGNhbGxlcgotICAgICAqIEBwYXJhbSB0YXJnZXQgYSBtZXNzYWdlIGhhbmRsZXIgZm9yIGdldHRpbmcgY2FsbGJhY2tzIGFib3V0IHN0YXRlIGNoYW5nZXMKICAgICAgKiBAcGFyYW0gbmV0VHlwZSB0aGUgQ29ubmVjdGl2aXR5TWFuYWdlciBuZXR3b3JrIHR5cGUKLSAgICAgKiBAcGFyYW0gYXBuVHlwZSB0aGUgUGhvbmUgYXBuVHlwZQogICAgICAqIEBwYXJhbSB0YWcgdGhlIG5hbWUgb2YgdGhpcyBuZXR3b3JrCiAgICAgICovCi0gICAgcHVibGljIE1vYmlsZURhdGFTdGF0ZVRyYWNrZXIoQ29udGV4dCBjb250ZXh0LCBIYW5kbGVyIHRhcmdldCwgaW50IG5ldFR5cGUsIFN0cmluZyB0YWcpIHsKLSAgICAgICAgc3VwZXIoY29udGV4dCwgdGFyZ2V0LCBuZXRUeXBlLAorICAgIHB1YmxpYyBNb2JpbGVEYXRhU3RhdGVUcmFja2VyKGludCBuZXRUeXBlLCBTdHJpbmcgdGFnKSB7CisgICAgICAgIG1OZXR3b3JrSW5mbyA9IG5ldyBOZXR3b3JrSW5mbyhuZXRUeXBlLAogICAgICAgICAgICAgICAgIFRlbGVwaG9ueU1hbmFnZXIuZ2V0RGVmYXVsdCgpLmdldE5ldHdvcmtUeXBlKCksIHRhZywKICAgICAgICAgICAgICAgICBUZWxlcGhvbnlNYW5hZ2VyLmdldERlZmF1bHQoKS5nZXROZXR3b3JrVHlwZU5hbWUoKSk7CiAgICAgICAgIG1BcG5UeXBlID0gbmV0d29ya1R5cGVUb0FwblR5cGUobmV0VHlwZSk7Ci0gICAgICAgIGlmIChUZXh0VXRpbHMuZXF1YWxzKG1BcG5UeXBlLCBQaG9uZS5BUE5fVFlQRV9ISVBSSSkpIHsKLSAgICAgICAgICAgIG1BcG5UeXBlVG9XYXRjaEZvciA9IFBob25lLkFQTl9UWVBFX0RFRkFVTFQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtQXBuVHlwZVRvV2F0Y2hGb3IgPSBtQXBuVHlwZTsKLSAgICAgICAgfQogICAgICAgICBpZiAobmV0VHlwZSA9PSBDb25uZWN0aXZpdHlNYW5hZ2VyLlRZUEVfTU9CSUxFIHx8CiAgICAgICAgICAgICAgICAgbmV0VHlwZSA9PSBDb25uZWN0aXZpdHlNYW5hZ2VyLlRZUEVfTU9CSUxFX0hJUFJJKSB7CiAgICAgICAgICAgICBtSXNEZWZhdWx0T3JIaXByaSA9IHRydWU7CiAgICAgICAgIH0KIAogICAgICAgICBtUGhvbmVTZXJ2aWNlID0gbnVsbDsKLSAgICAgICAgaWYobmV0VHlwZSA9PSBDb25uZWN0aXZpdHlNYW5hZ2VyLlRZUEVfTU9CSUxFKSB7Ci0gICAgICAgICAgICBtRW5hYmxlZCA9IHRydWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtRW5hYmxlZCA9IGZhbHNlOwotICAgICAgICB9CiAKLSAgICAgICAgbURuc1Byb3BOYW1lcyA9IG5ldyBTdHJpbmdbXSB7CisgICAgICAgIHNEbnNQcm9wTmFtZXMgPSBuZXcgU3RyaW5nW10gewogICAgICAgICAgICAgICAgICJuZXQucm1uZXQwLmRuczEiLAogICAgICAgICAgICAgICAgICJuZXQucm1uZXQwLmRuczIiLAogICAgICAgICAgICAgICAgICJuZXQuZXRoMC5kbnMxIiwKQEAgLTk4LDE2NiArOTMsMTY3IEBACiAgICAgICAgICAgICAgICAgIm5ldC5ncHJzLmRuczIiLAogICAgICAgICAgICAgICAgICJuZXQucHBwMC5kbnMxIiwKICAgICAgICAgICAgICAgICAibmV0LnBwcDAuZG5zMiJ9OwotCiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQmVnaW4gbW9uaXRvcmluZyBtb2JpbGUgZGF0YSBjb25uZWN0aXZpdHkuCisgICAgICogQmVnaW4gbW9uaXRvcmluZyBkYXRhIGNvbm5lY3Rpdml0eS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IGlzIHRoZSBjdXJyZW50IEFuZHJvaWQgY29udGV4dAorICAgICAqIEBwYXJhbSB0YXJnZXQgaXMgdGhlIEhhbmRlciB0byB3aGljaCB0byByZXR1cm4gdGhlIGV2ZW50cy4KICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzdGFydE1vbml0b3JpbmcoKSB7CisgICAgcHVibGljIHZvaWQgc3RhcnRNb25pdG9yaW5nKENvbnRleHQgY29udGV4dCwgSGFuZGxlciB0YXJnZXQpIHsKKyAgICAgICAgbVRhcmdldCA9IHRhcmdldDsKKyAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OworCiAgICAgICAgIEludGVudEZpbHRlciBmaWx0ZXIgPQogICAgICAgICAgICAgICAgIG5ldyBJbnRlbnRGaWx0ZXIoVGVsZXBob255SW50ZW50cy5BQ1RJT05fQU5ZX0RBVEFfQ09OTkVDVElPTl9TVEFURV9DSEFOR0VEKTsKICAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihUZWxlcGhvbnlJbnRlbnRzLkFDVElPTl9EQVRBX0NPTk5FQ1RJT05fRkFJTEVEKTsKICAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihUZWxlcGhvbnlJbnRlbnRzLkFDVElPTl9TRVJWSUNFX1NUQVRFX0NIQU5HRUQpOwogCi0gICAgICAgIG1TdGF0ZVJlY2VpdmVyID0gbmV3IE1vYmlsZURhdGFTdGF0ZVJlY2VpdmVyKCk7Ci0gICAgICAgIEludGVudCBpbnRlbnQgPSBtQ29udGV4dC5yZWdpc3RlclJlY2VpdmVyKG1TdGF0ZVJlY2VpdmVyLCBmaWx0ZXIpOwotICAgICAgICBpZiAoaW50ZW50ICE9IG51bGwpCi0gICAgICAgICAgICBtTW9iaWxlRGF0YVN0YXRlID0gZ2V0TW9iaWxlRGF0YVN0YXRlKGludGVudCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIG1Nb2JpbGVEYXRhU3RhdGUgPSBQaG9uZS5EYXRhU3RhdGUuRElTQ09OTkVDVEVEOworICAgICAgICBtQ29udGV4dC5yZWdpc3RlclJlY2VpdmVyKG5ldyBNb2JpbGVEYXRhU3RhdGVSZWNlaXZlcigpLCBmaWx0ZXIpOworICAgICAgICBtTW9iaWxlRGF0YVN0YXRlID0gUGhvbmUuRGF0YVN0YXRlLkRJU0NPTk5FQ1RFRDsKICAgICB9CiAKLSAgICBwcml2YXRlIFBob25lLkRhdGFTdGF0ZSBnZXRNb2JpbGVEYXRhU3RhdGUoSW50ZW50IGludGVudCkgewotICAgICAgICBTdHJpbmcgc3RyID0gaW50ZW50LmdldFN0cmluZ0V4dHJhKFBob25lLlNUQVRFX0tFWSk7Ci0gICAgICAgIGlmIChzdHIgIT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIGFwblR5cGVMaXN0ID0KLSAgICAgICAgICAgICAgICAgICAgaW50ZW50LmdldFN0cmluZ0V4dHJhKFBob25lLkRBVEFfQVBOX1RZUEVTX0tFWSk7Ci0gICAgICAgICAgICBpZiAoaXNBcG5UeXBlSW5jbHVkZWQoYXBuVHlwZUxpc3QpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVudW0udmFsdWVPZihQaG9uZS5EYXRhU3RhdGUuY2xhc3MsIHN0cik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFBob25lLkRhdGFTdGF0ZS5ESVNDT05ORUNURUQ7CisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBJUCBhZGRyZXNzZXMgb2YgdGhlIEROUyBzZXJ2ZXJzIGF2YWlsYWJsZSBmb3IgdGhlIG1vYmlsZSBkYXRhCisgICAgICogbmV0d29yayBpbnRlcmZhY2UuCisgICAgICogQHJldHVybiBhIGxpc3Qgb2YgRE5TIGFkZHJlc3Nlcywgd2l0aCBubyBob2xlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0RG5zUHJvcE5hbWVzKCkgeworICAgICAgICByZXR1cm4gc0Ruc1Byb3BOYW1lczsKICAgICB9CiAKLSAgICBwcml2YXRlIGJvb2xlYW4gaXNBcG5UeXBlSW5jbHVkZWQoU3RyaW5nIHR5cGVMaXN0KSB7Ci0gICAgICAgIC8qIGNvbW1hIHNlcGVyYXRlZCBsaXN0IC0gc3BsaXQgYW5kIGNoZWNrICovCi0gICAgICAgIGlmICh0eXBlTGlzdCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIHB1YmxpYyBib29sZWFuIGlzUHJpdmF0ZURuc1JvdXRlU2V0KCkgeworICAgICAgICByZXR1cm4gbVByaXZhdGVEbnNSb3V0ZVNldDsKKyAgICB9CiAKLSAgICAgICAgU3RyaW5nW10gbGlzdCA9IHR5cGVMaXN0LnNwbGl0KCIsIik7Ci0gICAgICAgIGZvcihpbnQgaT0wOyBpPCBsaXN0Lmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmVxdWFscyhsaXN0W2ldLCBtQXBuVHlwZVRvV2F0Y2hGb3IpIHx8Ci0gICAgICAgICAgICAgICAgVGV4dFV0aWxzLmVxdWFscyhsaXN0W2ldLCBQaG9uZS5BUE5fVFlQRV9BTEwpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIHB1YmxpYyB2b2lkIHByaXZhdGVEbnNSb3V0ZVNldChib29sZWFuIGVuYWJsZWQpIHsKKyAgICAgICAgbVByaXZhdGVEbnNSb3V0ZVNldCA9IGVuYWJsZWQ7CisgICAgfQorCisgICAgcHVibGljIE5ldHdvcmtJbmZvIGdldE5ldHdvcmtJbmZvKCkgeworICAgICAgICByZXR1cm4gbU5ldHdvcmtJbmZvOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0RGVmYXVsdEdhdGV3YXlBZGRyKCkgeworICAgICAgICByZXR1cm4gbURlZmF1bHRHYXRld2F5QWRkcjsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHRSb3V0ZVNldCgpIHsKKyAgICAgICAgcmV0dXJuIG1EZWZhdWx0Um91dGVTZXQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZGVmYXVsdFJvdXRlU2V0KGJvb2xlYW4gZW5hYmxlZCkgeworICAgICAgICBtRGVmYXVsdFJvdXRlU2V0ID0gZW5hYmxlZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGlzIG5vdCBpbXBsZW1lbnRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZWxlYXNlV2FrZUxvY2soKSB7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBjbGFzcyBNb2JpbGVEYXRhU3RhdGVSZWNlaXZlciBleHRlbmRzIEJyb2FkY2FzdFJlY2VpdmVyIHsKLSAgICAgICAgQ29ubmVjdGl2aXR5TWFuYWdlciBtQ29ubmVjdGl2aXR5TWFuYWdlcjsKKyAgICAgICAgSUNvbm5lY3Rpdml0eU1hbmFnZXIgbUNvbm5lY3Rpdml0eU1hbmFnZXI7CisKICAgICAgICAgcHVibGljIHZvaWQgb25SZWNlaXZlKENvbnRleHQgY29udGV4dCwgSW50ZW50IGludGVudCkgewotICAgICAgICAgICAgc3luY2hyb25pemVkKHRoaXMpIHsKLSAgICAgICAgICAgICAgICBpZiAoaW50ZW50LmdldEFjdGlvbigpLmVxdWFscyhUZWxlcGhvbnlJbnRlbnRzLgotICAgICAgICAgICAgICAgICAgICAgICAgQUNUSU9OX0FOWV9EQVRBX0NPTk5FQ1RJT05fU1RBVEVfQ0hBTkdFRCkpIHsKLSAgICAgICAgICAgICAgICAgICAgUGhvbmUuRGF0YVN0YXRlIHN0YXRlID0gZ2V0TW9iaWxlRGF0YVN0YXRlKGludGVudCk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyByZWFzb24gPSBpbnRlbnQuZ2V0U3RyaW5nRXh0cmEoUGhvbmUuU1RBVEVfQ0hBTkdFX1JFQVNPTl9LRVkpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYXBuTmFtZSA9IGludGVudC5nZXRTdHJpbmdFeHRyYShQaG9uZS5EQVRBX0FQTl9LRVkpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYXBuVHlwZUxpc3QgPSBpbnRlbnQuZ2V0U3RyaW5nRXh0cmEoUGhvbmUuREFUQV9BUE5fVFlQRVNfS0VZKTsKLSAgICAgICAgICAgICAgICAgICAgbUFwbk5hbWUgPSBhcG5OYW1lOworICAgICAgICAgICAgaWYgKGludGVudC5nZXRBY3Rpb24oKS5lcXVhbHMoVGVsZXBob255SW50ZW50cy4KKyAgICAgICAgICAgICAgICAgICAgQUNUSU9OX0FOWV9EQVRBX0NPTk5FQ1RJT05fU1RBVEVfQ0hBTkdFRCkpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgYXBuVHlwZSA9IGludGVudC5nZXRTdHJpbmdFeHRyYShQaG9uZS5EQVRBX0FQTl9UWVBFX0tFWSk7CiAKLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiB1bmF2YWlsYWJsZSA9IGludGVudC5nZXRCb29sZWFuRXh0cmEoUGhvbmUuTkVUV09SS19VTkFWQUlMQUJMRV9LRVksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOworICAgICAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmVxdWFscyhhcG5UeXBlLCBtQXBuVHlwZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBQaG9uZS5EYXRhU3RhdGUgc3RhdGUgPSBFbnVtLnZhbHVlT2YoUGhvbmUuRGF0YVN0YXRlLmNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50ZW50LmdldFN0cmluZ0V4dHJhKFBob25lLlNUQVRFX0tFWSkpOworICAgICAgICAgICAgICAgIFN0cmluZyByZWFzb24gPSBpbnRlbnQuZ2V0U3RyaW5nRXh0cmEoUGhvbmUuU1RBVEVfQ0hBTkdFX1JFQVNPTl9LRVkpOworICAgICAgICAgICAgICAgIFN0cmluZyBhcG5OYW1lID0gaW50ZW50LmdldFN0cmluZ0V4dHJhKFBob25lLkRBVEFfQVBOX0tFWSk7CiAKLSAgICAgICAgICAgICAgICAgICAgLy8gc2V0IHRoaXMgcmVnYXJkbGVzcyBvZiB0aGUgYXBuVHlwZUxpc3QuICBJdCdzIGFsbCB0aGUgc2FtZSByYWRpby9uZXR3b3JrCi0gICAgICAgICAgICAgICAgICAgIC8vIHVuZGVybmVhdGgKLSAgICAgICAgICAgICAgICAgICAgbU5ldHdvcmtJbmZvLnNldElzQXZhaWxhYmxlKCF1bmF2YWlsYWJsZSk7CisgICAgICAgICAgICAgICAgYm9vbGVhbiB1bmF2YWlsYWJsZSA9IGludGVudC5nZXRCb29sZWFuRXh0cmEoUGhvbmUuTkVUV09SS19VTkFWQUlMQUJMRV9LRVksCisgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7CisgICAgICAgICAgICAgICAgbU5ldHdvcmtJbmZvLnNldElzQXZhaWxhYmxlKCF1bmF2YWlsYWJsZSk7CiAKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzQXBuVHlwZUluY2x1ZGVkKGFwblR5cGVMaXN0KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1FbmFibGVkID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgd2UncmUgbm90IGVuYWJsZWQgYnV0IHRoZSBBUE4gVHlwZSBpcyBzdXBwb3J0ZWQgYnkgdGhpcyBjb25uZWN0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2Ugc2hvdWxkIHJlY29yZCB0aGUgaW50ZXJmYWNlIG5hbWUgaWYgb25lJ3MgcHJvdmlkZWQuICBJZiB0aGUgdXNlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHR1cm5zIG9uIHRoaXMgbmV0d29yayB3ZSB3aWxsIG5lZWQgdGhlIGludGVyZmFjZW5hbWUgYnV0IHdvbid0IGdldAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGEgZnJlc2ggY29ubmVjdGVkIG1lc3NhZ2UgLSBUT0RPIGZpeCB0aGlzIHdoZW4gd2UgZ2V0IHBlci1BUE4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBub3RpZmljYXRpb25zCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlID09IFBob25lLkRhdGFTdGF0ZS5DT05ORUNURUQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCAicmVwbGFjaW5nIG9sZCBtSW50ZXJmYWNlTmFtZSAoIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUludGVyZmFjZU5hbWUgKyAiKSB3aXRoICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVudC5nZXRTdHJpbmdFeHRyYShQaG9uZS5EQVRBX0lGQUNFX05BTUVfS0VZKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBmb3IgIiArIG1BcG5UeXBlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUludGVyZmFjZU5hbWUgPSBpbnRlbnQuZ2V0U3RyaW5nRXh0cmEoUGhvbmUuREFUQV9JRkFDRV9OQU1FX0tFWSk7CisgICAgICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBtQXBuVHlwZSArICIgUmVjZWl2ZWQgc3RhdGU9ICIgKyBzdGF0ZSArICIsIG9sZD0gIiArCisgICAgICAgICAgICAgICAgICAgICAgICBtTW9iaWxlRGF0YVN0YXRlICsgIiwgcmVhc29uPSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIChyZWFzb24gPT0gbnVsbCA/ICIodW5zcGVjaWZpZWQpIiA6IHJlYXNvbikpOworCisgICAgICAgICAgICAgICAgaWYgKG1Nb2JpbGVEYXRhU3RhdGUgIT0gc3RhdGUpIHsKKyAgICAgICAgICAgICAgICAgICAgbU1vYmlsZURhdGFTdGF0ZSA9IHN0YXRlOworICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN0YXRlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIERJU0NPTk5FQ1RFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihpc1RlYXJkb3duUmVxdWVzdGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGVhcmRvd25SZXF1ZXN0ZWQoZmFsc2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIG1BcG5UeXBlICsgIiBSZWNlaXZlZCBzdGF0ZT0gIiArIHN0YXRlICsgIiwgb2xkPSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTW9iaWxlRGF0YVN0YXRlICsgIiwgcmVhc29uPSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmVhc29uID09IG51bGwgPyAiKHVuc3BlY2lmaWVkKSIgOiByZWFzb24pICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLCBhcG5UeXBlTGlzdD0gIiArIGFwblR5cGVMaXN0KTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAobU1vYmlsZURhdGFTdGF0ZSAhPSBzdGF0ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbU1vYmlsZURhdGFTdGF0ZSA9IHN0YXRlOwotICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdGF0ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRElTQ09OTkVDVEVEOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihpc1RlYXJkb3duUmVxdWVzdGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1FbmFibGVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUZWFyZG93blJlcXVlc3RlZChmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0RGV0YWlsZWRTdGF0ZShEZXRhaWxlZFN0YXRlLkRJU0NPTk5FQ1RFRCwgcmVhc29uLCBhcG5OYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGRvUmVzZXQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtSXNEZWZhdWx0T3JIaXByaSA9PSB0cnVlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJvdGggZGVmYXVsdCBhbmQgaGlwcmkgbXVzdCBnbyBkb3duIGJlZm9yZSB3ZSByZXNldAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHlwZVRvQ2hlY2sgPSAoUGhvbmUuQVBOX1RZUEVfREVGQVVMVC5lcXVhbHMobUFwblR5cGUpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpdml0eU1hbmFnZXIuVFlQRV9NT0JJTEVfSElQUkkgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGl2aXR5TWFuYWdlci5UWVBFX01PQklMRSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQ29ubmVjdGl2aXR5TWFuYWdlciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQmluZGVyIGIgPSBTZXJ2aWNlTWFuYWdlci5nZXRTZXJ2aWNlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29udGV4dC5DT05ORUNUSVZJVFlfU0VSVklDRSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29ubmVjdGl2aXR5TWFuYWdlciA9IElDb25uZWN0aXZpdHlNYW5hZ2VyLlN0dWIuYXNJbnRlcmZhY2UoYik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXREZXRhaWxlZFN0YXRlKERldGFpbGVkU3RhdGUuRElTQ09OTkVDVEVELCByZWFzb24sIGFwbk5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGRvUmVzZXQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUlzRGVmYXVsdE9ySGlwcmkgPT0gdHJ1ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYm90aCBkZWZhdWx0IGFuZCBoaXByaSBtdXN0IGdvIGRvd24gYmVmb3JlIHdlIHJlc2V0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHlwZVRvQ2hlY2sgPSAoUGhvbmUuQVBOX1RZUEVfREVGQVVMVC5lcXVhbHMobUFwblR5cGUpID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGl2aXR5TWFuYWdlci5UWVBFX01PQklMRV9ISVBSSSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpdml0eU1hbmFnZXIuVFlQRV9NT0JJTEUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1Db25uZWN0aXZpdHlNYW5hZ2VyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29ubmVjdGl2aXR5TWFuYWdlciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ29ubmVjdGl2aXR5TWFuYWdlciljb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZXh0LkNPTk5FQ1RJVklUWV9TRVJWSUNFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQ29ubmVjdGl2aXR5TWFuYWdlciAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV0d29ya0luZm8gaW5mbyA9IG1Db25uZWN0aXZpdHlNYW5hZ2VyLmdldE5ldHdvcmtJbmZvKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVUb0NoZWNrKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5mbyAhPSBudWxsICYmIGluZm8uaXNDb25uZWN0ZWQoKSA9PSB0cnVlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlVG9DaGVjayk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZm8uaXNDb25uZWN0ZWQoKSA9PSB0cnVlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvUmVzZXQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBqdXN0IGdvIGFoZWFkIHdpdGggdGhlIHJlc2V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJFeGNlcHRpb24gdHJ5aW5nIHRvIGNvbnRhY3QgQ29ublNlcnZpY2U6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZG9SZXNldCAmJiBtSW50ZXJmYWNlTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXR3b3JrVXRpbHMucmVzZXRDb25uZWN0aW9ucyhtSW50ZXJmYWNlTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FuJ3QgZG8gdGhpcyBoZXJlIC0gQ29ubmVjdGl2aXR5U2VydmljZSBuZWVkcyBpdCB0byBjbGVhciBzdHVmZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpdCdzIG9rIHRob3VnaCAtIGp1c3QgbGVhdmUgaXQgdG8gYmUgcmVmcmVzaGVkIG5leHQgdGltZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBjb25uZWN0LgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2lmIChEQkcpIExvZy5kKFRBRywgImNsZWFyaW5nIG1JbnRlcmZhY2VOYW1lIGZvciAiKyBtQXBuVHlwZSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAiIGFzIGl0IERJU0NPTk5FQ1RFRCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL21JbnRlcmZhY2VOYW1lID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9tRGVmYXVsdEdhdGV3YXlBZGRyID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDT05ORUNUSU5HOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXREZXRhaWxlZFN0YXRlKERldGFpbGVkU3RhdGUuQ09OTkVDVElORywgcmVhc29uLCBhcG5OYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTVVNQRU5ERUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldERldGFpbGVkU3RhdGUoRGV0YWlsZWRTdGF0ZS5TVVNQRU5ERUQsIHJlYXNvbiwgYXBuTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09OTkVDVEVEOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW50ZXJmYWNlTmFtZSA9IGludGVudC5nZXRTdHJpbmdFeHRyYShQaG9uZS5EQVRBX0lGQUNFX05BTUVfS0VZKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1JbnRlcmZhY2VOYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkNPTk5FQ1RFRCBldmVudCBkaWQgbm90IHN1cHBseSBpbnRlcmZhY2UgbmFtZS4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRGVmYXVsdEdhdGV3YXlBZGRyID0gaW50ZW50LmdldEludEV4dHJhKFBob25lLkRBVEFfR0FURVdBWV9LRVksIDApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXREZXRhaWxlZFN0YXRlKERldGFpbGVkU3RhdGUuQ09OTkVDVEVELCByZWFzb24sIGFwbk5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRvUmVzZXQgJiYgbU5ldHdvcmtQcm9wZXJ0aWVzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGlmYWNlID0gbU5ldHdvcmtQcm9wZXJ0aWVzLmdldEludGVyZmFjZU5hbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlmYWNlICE9IG51bGwpIE5ldHdvcmtVdGlscy5yZXNldENvbm5lY3Rpb25zKGlmYWNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyAtIGNoZWNrIHRoaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjYW4ndCBkbyB0aGlzIGhlcmUgLSBDb25uZWN0aXZpdHlTZXJ2aWNlIG5lZWRzIGl0IHRvIGNsZWFyIHN0dWZmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXQncyBvayB0aG91Z2ggLSBqdXN0IGxlYXZlIGl0IHRvIGJlIHJlZnJlc2hlZCBuZXh0IHRpbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBjb25uZWN0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vaWYgKERCRykgTG9nLmQoVEFHLCAiY2xlYXJpbmcgbUludGVyZmFjZU5hbWUgZm9yICIrIG1BcG5UeXBlICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgIiBhcyBpdCBESVNDT05ORUNURUQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL21JbnRlcmZhY2VOYW1lID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL21EZWZhdWx0R2F0ZXdheUFkZHIgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDT05ORUNUSU5HOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldERldGFpbGVkU3RhdGUoRGV0YWlsZWRTdGF0ZS5DT05ORUNUSU5HLCByZWFzb24sIGFwbk5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTVVNQRU5ERUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0RGV0YWlsZWRTdGF0ZShEZXRhaWxlZFN0YXRlLlNVU1BFTkRFRCwgcmVhc29uLCBhcG5OYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09OTkVDVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1OZXR3b3JrUHJvcGVydGllcyA9IGludGVudC5nZXRQYXJjZWxhYmxlRXh0cmEoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQaG9uZS5EQVRBX05FVFdPUktfUFJPUEVSVElFU19LRVkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtTmV0d29ya1Byb3BlcnRpZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNPTk5FQ1RFRCBldmVudCBkaWQgbm90IHN1cHBseSBuZXR3b3JrIHByb3BlcnRpZXMuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldERldGFpbGVkU3RhdGUoRGV0YWlsZWRTdGF0ZS5DT05ORUNURUQsIHJlYXNvbiwgYXBuTmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGludGVudC5nZXRBY3Rpb24oKS4KLSAgICAgICAgICAgICAgICAgICAgICAgIGVxdWFscyhUZWxlcGhvbnlJbnRlbnRzLkFDVElPTl9EQVRBX0NPTk5FQ1RJT05fRkFJTEVEKSkgewotICAgICAgICAgICAgICAgICAgICBtRW5hYmxlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcmVhc29uID0gaW50ZW50LmdldFN0cmluZ0V4dHJhKFBob25lLkZBSUxVUkVfUkVBU09OX0tFWSk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBhcG5OYW1lID0gaW50ZW50LmdldFN0cmluZ0V4dHJhKFBob25lLkRBVEFfQVBOX0tFWSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgIlJlY2VpdmVkICIgKyBpbnRlbnQuZ2V0QWN0aW9uKCkgKyAiIGJyb2FkY2FzdCIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYXNvbiA9PSBudWxsID8gIiIgOiAiKCIgKyByZWFzb24gKyAiKSIpOwotICAgICAgICAgICAgICAgICAgICBzZXREZXRhaWxlZFN0YXRlKERldGFpbGVkU3RhdGUuRkFJTEVELCByZWFzb24sIGFwbk5hbWUpOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBUZWxlcGhvbnlNYW5hZ2VyIHRtID0gVGVsZXBob255TWFuYWdlci5nZXREZWZhdWx0KCk7Ci0gICAgICAgICAgICAgICAgc2V0Um9hbWluZ1N0YXR1cyh0bS5pc05ldHdvcmtSb2FtaW5nKCkpOwotICAgICAgICAgICAgICAgIHNldFN1YnR5cGUodG0uZ2V0TmV0d29ya1R5cGUoKSwgdG0uZ2V0TmV0d29ya1R5cGVOYW1lKCkpOworICAgICAgICAgICAgfSBlbHNlIGlmIChpbnRlbnQuZ2V0QWN0aW9uKCkuCisgICAgICAgICAgICAgICAgICAgIGVxdWFscyhUZWxlcGhvbnlJbnRlbnRzLkFDVElPTl9EQVRBX0NPTk5FQ1RJT05fRkFJTEVEKSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBhcG5UeXBlID0gaW50ZW50LmdldFN0cmluZ0V4dHJhKFBob25lLkRBVEFfQVBOX1RZUEVfS0VZKTsKKyAgICAgICAgICAgICAgICBpZiAoIVRleHRVdGlscy5lcXVhbHMoYXBuVHlwZSwgbUFwblR5cGUpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgU3RyaW5nIHJlYXNvbiA9IGludGVudC5nZXRTdHJpbmdFeHRyYShQaG9uZS5GQUlMVVJFX1JFQVNPTl9LRVkpOworICAgICAgICAgICAgICAgIFN0cmluZyBhcG5OYW1lID0gaW50ZW50LmdldFN0cmluZ0V4dHJhKFBob25lLkRBVEFfQVBOX0tFWSk7CisgICAgICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBtQXBuVHlwZSArICJSZWNlaXZlZCAiICsgaW50ZW50LmdldEFjdGlvbigpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICIgYnJvYWRjYXN0IiArIHJlYXNvbiA9PSBudWxsID8gIiIgOiAiKCIgKyByZWFzb24gKyAiKSIpOworICAgICAgICAgICAgICAgIHNldERldGFpbGVkU3RhdGUoRGV0YWlsZWRTdGF0ZS5GQUlMRUQsIHJlYXNvbiwgYXBuTmFtZSk7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBUZWxlcGhvbnlNYW5hZ2VyIHRtID0gVGVsZXBob255TWFuYWdlci5nZXREZWZhdWx0KCk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTM0OSw3MCArMzQ1LDg4IEBACiAgICAgLyoqCiAgICAgICogVGVhciBkb3duIG1vYmlsZSBkYXRhIGNvbm5lY3Rpdml0eSwgaS5lLiwgZGlzYWJsZSB0aGUgYWJpbGl0eSB0byBjcmVhdGUKICAgICAgKiBtb2JpbGUgZGF0YSBjb25uZWN0aW9ucy4KKyAgICAgKiBUT0RPIC0gbWFrZSBhc3luYyBhbmQgcmV0dXJuIG5vdGhpbmc/CiAgICAgICovCi0gICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gdGVhcmRvd24oKSB7Ci0gICAgICAgIC8vIHNpbmNlIHdlIHdvbid0IGdldCBhIG5vdGlmaWNhdGlvbiBjdXJyZW50bHkgKFRPRE8gLSBwZXIgQVBOIG5vdGlmaWNhdGlvbnMpCi0gICAgICAgIC8vIHdlIHdvbid0IGdldCBhIGRpc2Nvbm5lY3QgbWVzc2FnZSB1bnRpbCBhbGwgQVBOJ3Mgb24gdGhlIGN1cnJlbnQgY29ubmVjdGlvbidzCi0gICAgICAgIC8vIEFQTiBsaXN0IGFyZSBkaXNhYmxlZC4gIFRoYXQgbWVhbnMgcHJpdmF0ZVJvdXRlcyBmb3IgRE5TIGFuZCBzdWNoIHdpbGwgcmVtYWluIG9uIC0KLSAgICAgICAgLy8gbm90IGEgcHJvYmxlbSBzaW5jZSB0aGF0J3MgYWxsIHNoYXJlZCB3aXRoIHdoYXRldmVyIG90aGVyIEFQTiBpcyBzdGlsbCBvbiwgYnV0Ci0gICAgICAgIC8vIHVnbHkuCiAgICAgICAgIHNldFRlYXJkb3duUmVxdWVzdGVkKHRydWUpOwogICAgICAgICByZXR1cm4gKHNldEVuYWJsZUFwbihtQXBuVHlwZSwgZmFsc2UpICE9IFBob25lLkFQTl9SRVFVRVNUX0ZBSUxFRCk7CiAgICAgfQogCiAgICAgLyoqCisgICAgICogUmVjb3JkIHRoZSBkZXRhaWxlZCBzdGF0ZSBvZiBhIG5ldHdvcmssIGFuZCBpZiBpdCBpcyBhCisgICAgICogY2hhbmdlIGZyb20gdGhlIHByZXZpb3VzIHN0YXRlLCBzZW5kIGEgbm90aWZpY2F0aW9uIHRvCisgICAgICogYW55IGxpc3RlbmVycy4KKyAgICAgKiBAcGFyYW0gc3RhdGUgdGhlIG5ldyBAe2NvZGUgRGV0YWlsZWRTdGF0ZX0KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgc2V0RGV0YWlsZWRTdGF0ZShOZXR3b3JrSW5mby5EZXRhaWxlZFN0YXRlIHN0YXRlKSB7CisgICAgICAgIHNldERldGFpbGVkU3RhdGUoc3RhdGUsIG51bGwsIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlY29yZCB0aGUgZGV0YWlsZWQgc3RhdGUgb2YgYSBuZXR3b3JrLCBhbmQgaWYgaXQgaXMgYQorICAgICAqIGNoYW5nZSBmcm9tIHRoZSBwcmV2aW91cyBzdGF0ZSwgc2VuZCBhIG5vdGlmaWNhdGlvbiB0bworICAgICAqIGFueSBsaXN0ZW5lcnMuCisgICAgICogQHBhcmFtIHN0YXRlIHRoZSBuZXcgQHtjb2RlIERldGFpbGVkU3RhdGV9CisgICAgICogQHBhcmFtIHJlYXNvbiBhIHtAY29kZSBTdHJpbmd9IGluZGljYXRpbmcgYSByZWFzb24gZm9yIHRoZSBzdGF0ZSBjaGFuZ2UsCisgICAgICogaWYgb25lIHdhcyBzdXBwbGllZC4gTWF5IGJlIHtAY29kZSBudWxsfS4KKyAgICAgKiBAcGFyYW0gZXh0cmFJbmZvIG9wdGlvbmFsIHtAY29kZSBTdHJpbmd9IHByb3ZpZGluZyBleHRyYSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3RhdGUgY2hhbmdlCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHNldERldGFpbGVkU3RhdGUoTmV0d29ya0luZm8uRGV0YWlsZWRTdGF0ZSBzdGF0ZSwgU3RyaW5nIHJlYXNvbiwgU3RyaW5nIGV4dHJhSW5mbykgeworICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsICJzZXREZXRhaWxlZCBzdGF0ZSwgb2xkID0iCisgICAgICAgICAgICAgICAgKyBtTmV0d29ya0luZm8uZ2V0RGV0YWlsZWRTdGF0ZSgpICsgIiBhbmQgbmV3IHN0YXRlPSIgKyBzdGF0ZSk7CisgICAgICAgIGlmIChzdGF0ZSAhPSBtTmV0d29ya0luZm8uZ2V0RGV0YWlsZWRTdGF0ZSgpKSB7CisgICAgICAgICAgICBib29sZWFuIHdhc0Nvbm5lY3RpbmcgPSAobU5ldHdvcmtJbmZvLmdldFN0YXRlKCkgPT0gTmV0d29ya0luZm8uU3RhdGUuQ09OTkVDVElORyk7CisgICAgICAgICAgICBTdHJpbmcgbGFzdFJlYXNvbiA9IG1OZXR3b3JrSW5mby5nZXRSZWFzb24oKTsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBJZiBhIHJlYXNvbiB3YXMgc3VwcGxpZWQgd2hlbiB0aGUgQ09OTkVDVElORyBzdGF0ZSB3YXMgZW50ZXJlZCwgYW5kIG5vCisgICAgICAgICAgICAgKiByZWFzb24gd2FzIHN1cHBsaWVkIGZvciBlbnRlcmluZyB0aGUgQ09OTkVDVEVEIHN0YXRlLCB0aGVuIHJldGFpbiB0aGUKKyAgICAgICAgICAgICAqIHJlYXNvbiB0aGF0IHdhcyBzdXBwbGllZCB3aGVuIGdvaW5nIHRvIENPTk5FQ1RJTkcuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmICh3YXNDb25uZWN0aW5nICYmIHN0YXRlID09IE5ldHdvcmtJbmZvLkRldGFpbGVkU3RhdGUuQ09OTkVDVEVEICYmIHJlYXNvbiA9PSBudWxsCisgICAgICAgICAgICAgICAgICAgICYmIGxhc3RSZWFzb24gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZWFzb24gPSBsYXN0UmVhc29uOworICAgICAgICAgICAgbU5ldHdvcmtJbmZvLnNldERldGFpbGVkU3RhdGUoc3RhdGUsIHJlYXNvbiwgZXh0cmFJbmZvKTsKKyAgICAgICAgICAgIE1lc3NhZ2UgbXNnID0gbVRhcmdldC5vYnRhaW5NZXNzYWdlKEVWRU5UX1NUQVRFX0NIQU5HRUQsIG1OZXR3b3JrSW5mbyk7CisgICAgICAgICAgICBtc2cuc2VuZFRvVGFyZ2V0KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2V0RGV0YWlsZWRTdGF0ZUludGVybmFsKE5ldHdvcmtJbmZvLkRldGFpbGVkU3RhdGUgc3RhdGUpIHsKKyAgICAgICAgbU5ldHdvcmtJbmZvLnNldERldGFpbGVkU3RhdGUoc3RhdGUsIG51bGwsIG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFRlYXJkb3duUmVxdWVzdGVkKGJvb2xlYW4gaXNSZXF1ZXN0ZWQpIHsKKyAgICAgICAgbVRlYXJkb3duUmVxdWVzdGVkID0gaXNSZXF1ZXN0ZWQ7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNUZWFyZG93blJlcXVlc3RlZCgpIHsKKyAgICAgICAgcmV0dXJuIG1UZWFyZG93blJlcXVlc3RlZDsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBSZS1lbmFibGUgbW9iaWxlIGRhdGEgY29ubmVjdGl2aXR5IGFmdGVyIGEge0BsaW5rICN0ZWFyZG93bigpfS4KKyAgICAgKiBUT0RPIC0gbWFrZSBhc3luYyBhbmQgYWx3YXlzIGdldCBhIG5vdGlmaWNhdGlvbj8KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiByZWNvbm5lY3QoKSB7CisgICAgICAgIGJvb2xlYW4gcmV0VmFsdWUgPSBmYWxzZTsgLy9jb25uZWN0ZWQgb3IgZXhwZWN0IHRvIGJlPwogICAgICAgICBzZXRUZWFyZG93blJlcXVlc3RlZChmYWxzZSk7CiAgICAgICAgIHN3aXRjaCAoc2V0RW5hYmxlQXBuKG1BcG5UeXBlLCB0cnVlKSkgewogICAgICAgICAgICAgY2FzZSBQaG9uZS5BUE5fQUxSRUFEWV9BQ1RJVkU6Ci0gICAgICAgICAgICAgICAgLy8gVE9ETyAtIHJlbW92ZSB0aGlzIHdoZW4gd2UgZ2V0IHBlci1hcG4gbm90aWZpY2F0aW9ucwotICAgICAgICAgICAgICAgIG1FbmFibGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAvLyBuZWVkIHRvIHNldCBzZWxmIHRvIENPTk5FQ1RJTkcgc28gdGhlIGJlbG93IG1lc3NhZ2UgaXMgaGFuZGxlZC4KLSAgICAgICAgICAgICAgICBtTW9iaWxlRGF0YVN0YXRlID0gUGhvbmUuRGF0YVN0YXRlLkNPTk5FQ1RJTkc7Ci0gICAgICAgICAgICAgICAgc2V0RGV0YWlsZWRTdGF0ZShEZXRhaWxlZFN0YXRlLkNPTk5FQ1RJTkcsIFBob25lLlJFQVNPTl9BUE5fQ0hBTkdFRCwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgLy9zZW5kIG91dCBhIGNvbm5lY3RlZCBtZXNzYWdlCi0gICAgICAgICAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoVGVsZXBob255SW50ZW50cy4KLSAgICAgICAgICAgICAgICAgICAgICAgIEFDVElPTl9BTllfREFUQV9DT05ORUNUSU9OX1NUQVRFX0NIQU5HRUQpOwotICAgICAgICAgICAgICAgIGludGVudC5wdXRFeHRyYShQaG9uZS5TVEFURV9LRVksIFBob25lLkRhdGFTdGF0ZS5DT05ORUNURUQudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKFBob25lLlNUQVRFX0NIQU5HRV9SRUFTT05fS0VZLCBQaG9uZS5SRUFTT05fQVBOX0NIQU5HRUQpOwotICAgICAgICAgICAgICAgIGludGVudC5wdXRFeHRyYShQaG9uZS5EQVRBX0FQTl9UWVBFU19LRVksIG1BcG5UeXBlVG9XYXRjaEZvcik7Ci0gICAgICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKFBob25lLkRBVEFfQVBOX0tFWSwgbUFwbk5hbWUpOwotICAgICAgICAgICAgICAgIGludGVudC5wdXRFeHRyYShQaG9uZS5EQVRBX0lGQUNFX05BTUVfS0VZLCBtSW50ZXJmYWNlTmFtZSk7Ci0gICAgICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKFBob25lLk5FVFdPUktfVU5BVkFJTEFCTEVfS0VZLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgaWYgKG1TdGF0ZVJlY2VpdmVyICE9IG51bGwpIG1TdGF0ZVJlY2VpdmVyLm9uUmVjZWl2ZShtQ29udGV4dCwgaW50ZW50KTsKKyAgICAgICAgICAgICAgICByZXRWYWx1ZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIFBob25lLkFQTl9SRVFVRVNUX1NUQVJURUQ6Ci0gICAgICAgICAgICAgICAgbUVuYWJsZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgIC8vIG5vIG5lZWQgdG8gZG8gYW55dGhpbmcgLSB3ZSdyZSBhbHJlYWR5IGR1ZSBzb21lIHN0YXR1cyB1cGRhdGUgaW50ZW50cworICAgICAgICAgICAgICAgIHJldFZhbHVlID0gdHJ1ZTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgUGhvbmUuQVBOX1JFUVVFU1RfRkFJTEVEOgotICAgICAgICAgICAgICAgIGlmIChtUGhvbmVTZXJ2aWNlID09IG51bGwgJiYgbUFwblR5cGUgPT0gUGhvbmUuQVBOX1RZUEVfREVGQVVMVCkgewotICAgICAgICAgICAgICAgICAgICAvLyBvbiBzdGFydHVwIHdlIG1heSB0cnkgdG8gdGFsayB0byB0aGUgcGhvbmUgYmVmb3JlIGl0J3MgcmVhZHkKLSAgICAgICAgICAgICAgICAgICAgLy8gc2luY2UgdGhlIHBob25lIHdpbGwgY29tZSB1cCBlbmFibGVkLCBnbyB3aXRoIHRoYXQuCi0gICAgICAgICAgICAgICAgICAgIC8vIFRPRE8gLSB0aGlzIGFsc28gY29tZXMgdXAgb24gdGVsZXBob255IGNyYXNoOiBpZiB3ZSB0aGluayBtb2JpbGUgZGF0YSBpcwotICAgICAgICAgICAgICAgICAgICAvLyBvZmYgYW5kIHRoZSB0ZWxlcGhvbnkgc3R1ZmYgY3Jhc2hlcyBhbmQgaGFzIHRvIHJlc3RhcnQgaXQgd2lsbCBjb21lIHVwCi0gICAgICAgICAgICAgICAgICAgIC8vIGVuYWJsZWQgKG1ha2luZyBhIGRhdGEgY29ubmVjdGlvbikuICBXZSB3aWxsIHRoZW4gYmUgb3V0IG9mIHN5bmMuCi0gICAgICAgICAgICAgICAgICAgIC8vIEEgcG9zc2libGUgc29sdXRpb24gaXMgYSBicm9hZGNhc3Qgd2hlbiB0ZWxlcGhvbnkgcmVzdGFydHMuCi0gICAgICAgICAgICAgICAgICAgIG1FbmFibGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBlbHNlIGZhbGwgdGhyb3VnaAogICAgICAgICAgICAgY2FzZSBQaG9uZS5BUE5fVFlQRV9OT1RfQVZBSUxBQkxFOgotICAgICAgICAgICAgICAgIC8vIERlZmF1bHQgaXMgYWx3YXlzIGF2YWlsYWJsZSwgYnV0IG1heSBiZSBvZmYgZHVlIHRvCi0gICAgICAgICAgICAgICAgLy8gQWlycGxhbmVNb2RlIG9yIEUtQ2FsbCBvciB3aGF0ZXZlci4uCi0gICAgICAgICAgICAgICAgaWYgKG1BcG5UeXBlICE9IFBob25lLkFQTl9UWVBFX0RFRkFVTFQpIHsKLSAgICAgICAgICAgICAgICAgICAgbUVuYWJsZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkVycm9yIGluIHJlY29ubmVjdCAtIHVuZXhwZWN0ZWQgcmVzcG9uc2UuIik7Ci0gICAgICAgICAgICAgICAgbUVuYWJsZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gbUVuYWJsZWQ7CisgICAgICAgIHJldHVybiByZXRWYWx1ZTsKICAgICB9CiAKICAgICAvKioKQEAgLTQ4NSwyNiArNDk5LDYgQEAKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIEVuc3VyZSB0aGF0IGEgbmV0d29yayByb3V0ZSBleGlzdHMgdG8gZGVsaXZlciB0cmFmZmljIHRvIHRoZSBzcGVjaWZpZWQKLSAgICAgKiBob3N0IHZpYSB0aGUgbW9iaWxlIGRhdGEgbmV0d29yay4KLSAgICAgKiBAcGFyYW0gaG9zdEFkZHJlc3MgdGhlIElQIGFkZHJlc3Mgb2YgdGhlIGhvc3QgdG8gd2hpY2ggdGhlIHJvdXRlIGlzIGRlc2lyZWQsCi0gICAgICogaW4gbmV0d29yayBieXRlIG9yZGVyLgotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IG9uIHN1Y2Nlc3MsIHtAY29kZSBmYWxzZX0gb24gZmFpbHVyZQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIHJlcXVlc3RSb3V0ZVRvSG9zdChpbnQgaG9zdEFkZHJlc3MpIHsKLSAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiUmVxdWVzdGVkIGhvc3Qgcm91dGUgdG8gIiArIEludGVnZXIudG9IZXhTdHJpbmcoaG9zdEFkZHJlc3MpICsKLSAgICAgICAgICAgICAgICAgICAgIiBmb3IgIiArIG1BcG5UeXBlICsgIigiICsgbUludGVyZmFjZU5hbWUgKyAiKSIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtSW50ZXJmYWNlTmFtZSAhPSBudWxsICYmIGhvc3RBZGRyZXNzICE9IC0xKSB7Ci0gICAgICAgICAgICByZXR1cm4gTmV0d29ya1V0aWxzLmFkZEhvc3RSb3V0ZShtSW50ZXJmYWNlTmFtZSwgaG9zdEFkZHJlc3MpID09IDA7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCJNb2JpbGUgZGF0YSBzdGF0ZTogIik7CkBAIC01NjYsNCArNTYwLDggQEAKICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgfQogICAgIH0KKworICAgIHB1YmxpYyBOZXR3b3JrUHJvcGVydGllcyBnZXROZXR3b3JrUHJvcGVydGllcygpIHsKKyAgICAgICAgcmV0dXJuIG1OZXR3b3JrUHJvcGVydGllczsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvTmV0d29ya0luZm8uamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9OZXR3b3JrSW5mby5qYXZhCmluZGV4IDY0OWNiOGMuLjVmNWUxMWMgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL25ldC9OZXR3b3JrSW5mby5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9OZXR3b3JrSW5mby5qYXZhCkBAIC05Nyw3ICs5Nyw3IEBACiAgICAgICAgIHN0YXRlTWFwLnB1dChEZXRhaWxlZFN0YXRlLkRJU0NPTk5FQ1RFRCwgU3RhdGUuRElTQ09OTkVDVEVEKTsKICAgICAgICAgc3RhdGVNYXAucHV0KERldGFpbGVkU3RhdGUuRkFJTEVELCBTdGF0ZS5ESVNDT05ORUNURUQpOwogICAgIH0KLSAgICAKKwogICAgIHByaXZhdGUgaW50IG1OZXR3b3JrVHlwZTsKICAgICBwcml2YXRlIGludCBtU3VidHlwZTsKICAgICBwcml2YXRlIFN0cmluZyBtVHlwZU5hbWU7CkBAIC0xMjEsNyArMTIxLDEwIEBACiAgICAgICovCiAgICAgcHVibGljIE5ldHdvcmtJbmZvKGludCB0eXBlKSB7fQogCi0gICAgTmV0d29ya0luZm8oaW50IHR5cGUsIGludCBzdWJ0eXBlLCBTdHJpbmcgdHlwZU5hbWUsIFN0cmluZyBzdWJ0eXBlTmFtZSkgeworICAgIC8qKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIE5ldHdvcmtJbmZvKGludCB0eXBlLCBpbnQgc3VidHlwZSwgU3RyaW5nIHR5cGVOYW1lLCBTdHJpbmcgc3VidHlwZU5hbWUpIHsKICAgICAgICAgaWYgKCFDb25uZWN0aXZpdHlNYW5hZ2VyLmlzTmV0d29ya1R5cGVWYWxpZCh0eXBlKSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCBuZXR3b3JrIHR5cGU6ICIgKyB0eXBlKTsKICAgICAgICAgfQpAQCAtMTQxLDcgKzE0NCw5IEBACiAgICAgICogQHJldHVybiB0aGUgbmV0d29yayB0eXBlCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRUeXBlKCkgewotICAgICAgICByZXR1cm4gbU5ldHdvcmtUeXBlOworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIHJldHVybiBtTmV0d29ya1R5cGU7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKQEAgLTE1MCwxMiArMTU1LDE2IEBACiAgICAgICogQHJldHVybiB0aGUgbmV0d29yayBzdWJ0eXBlCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRTdWJ0eXBlKCkgewotICAgICAgICByZXR1cm4gbVN1YnR5cGU7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgcmV0dXJuIG1TdWJ0eXBlOworICAgICAgICB9CiAgICAgfQogCiAgICAgdm9pZCBzZXRTdWJ0eXBlKGludCBzdWJ0eXBlLCBTdHJpbmcgc3VidHlwZU5hbWUpIHsKLSAgICAgICAgbVN1YnR5cGUgPSBzdWJ0eXBlOwotICAgICAgICBtU3VidHlwZU5hbWUgPSBzdWJ0eXBlTmFtZTsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBtU3VidHlwZSA9IHN1YnR5cGU7CisgICAgICAgICAgICBtU3VidHlwZU5hbWUgPSBzdWJ0eXBlTmFtZTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgpAQCAtMTY0LDcgKzE3Myw5IEBACiAgICAgICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgbmV0d29yayB0eXBlCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG1UeXBlTmFtZTsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICByZXR1cm4gbVR5cGVOYW1lOworICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCkBAIC0xNzIsNyArMTgzLDkgQEAKICAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBuZXR3b3JrIHN1YnR5cGUKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldFN1YnR5cGVOYW1lKCkgewotICAgICAgICByZXR1cm4gbVN1YnR5cGVOYW1lOworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIHJldHVybiBtU3VidHlwZU5hbWU7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKQEAgLTE4NSw3ICsxOTgsOSBAQAogICAgICAqIG9mIGJlaW5nIGVzdGFibGlzaGVkLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc0Nvbm5lY3RlZE9yQ29ubmVjdGluZygpIHsKLSAgICAgICAgcmV0dXJuIG1TdGF0ZSA9PSBTdGF0ZS5DT05ORUNURUQgfHwgbVN0YXRlID09IFN0YXRlLkNPTk5FQ1RJTkc7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgcmV0dXJuIG1TdGF0ZSA9PSBTdGF0ZS5DT05ORUNURUQgfHwgbVN0YXRlID09IFN0YXRlLkNPTk5FQ1RJTkc7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKQEAgLTE5NCw3ICsyMDksOSBAQAogICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIG5ldHdvcmsgY29ubmVjdGl2aXR5IGV4aXN0cywge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNDb25uZWN0ZWQoKSB7Ci0gICAgICAgIHJldHVybiBtU3RhdGUgPT0gU3RhdGUuQ09OTkVDVEVEOworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIHJldHVybiBtU3RhdGUgPT0gU3RhdGUuQ09OTkVDVEVEOworICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCkBAIC0yMTAsNyArMjI3LDkgQEAKICAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgbmV0d29yayBpcyBhdmFpbGFibGUsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNBdmFpbGFibGUoKSB7Ci0gICAgICAgIHJldHVybiBtSXNBdmFpbGFibGU7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgcmV0dXJuIG1Jc0F2YWlsYWJsZTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgpAQCAtMjIwLDcgKzIzOSw5IEBACiAgICAgICogQGhpZGUKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRJc0F2YWlsYWJsZShib29sZWFuIGlzQXZhaWxhYmxlKSB7Ci0gICAgICAgIG1Jc0F2YWlsYWJsZSA9IGlzQXZhaWxhYmxlOworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIG1Jc0F2YWlsYWJsZSA9IGlzQXZhaWxhYmxlOworICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCkBAIC0yMzEsNyArMjUyLDkgQEAKICAgICAgKiBvdGhlcndpc2UuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNGYWlsb3ZlcigpIHsKLSAgICAgICAgcmV0dXJuIG1Jc0ZhaWxvdmVyOworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIHJldHVybiBtSXNGYWlsb3ZlcjsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgpAQCAtMjQxLDcgKzI2NCw5IEBACiAgICAgICogQGhpZGUKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRGYWlsb3Zlcihib29sZWFuIGlzRmFpbG92ZXIpIHsKLSAgICAgICAgbUlzRmFpbG92ZXIgPSBpc0ZhaWxvdmVyOworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIG1Jc0ZhaWxvdmVyID0gaXNGYWlsb3ZlcjsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgpAQCAtMjUxLDExICsyNzYsMTUgQEAKICAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiByb2FtaW5nIGlzIGluIGVmZmVjdCwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNSb2FtaW5nKCkgewotICAgICAgICByZXR1cm4gbUlzUm9hbWluZzsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICByZXR1cm4gbUlzUm9hbWluZzsKKyAgICAgICAgfQogICAgIH0KIAogICAgIHZvaWQgc2V0Um9hbWluZyhib29sZWFuIGlzUm9hbWluZykgewotICAgICAgICBtSXNSb2FtaW5nID0gaXNSb2FtaW5nOworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIG1Jc1JvYW1pbmcgPSBpc1JvYW1pbmc7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKQEAgLTI2Myw3ICsyOTIsOSBAQAogICAgICAqIEByZXR1cm4gdGhlIGNvYXJzZS1ncmFpbmVkIHN0YXRlCiAgICAgICovCiAgICAgcHVibGljIFN0YXRlIGdldFN0YXRlKCkgewotICAgICAgICByZXR1cm4gbVN0YXRlOworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIHJldHVybiBtU3RhdGU7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKQEAgLTI3MSw3ICszMDIsOSBAQAogICAgICAqIEByZXR1cm4gdGhlIGZpbmUtZ3JhaW5lZCBzdGF0ZQogICAgICAqLwogICAgIHB1YmxpYyBEZXRhaWxlZFN0YXRlIGdldERldGFpbGVkU3RhdGUoKSB7Ci0gICAgICAgIHJldHVybiBtRGV0YWlsZWRTdGF0ZTsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICByZXR1cm4gbURldGFpbGVkU3RhdGU7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKQEAgLTI4MSwxMiArMzE0LDE1IEBACiAgICAgICogaWYgb25lIHdhcyBzdXBwbGllZC4gTWF5IGJlIHtAY29kZSBudWxsfS4KICAgICAgKiBAcGFyYW0gZXh0cmFJbmZvIGFuIG9wdGlvbmFsIHtAY29kZSBTdHJpbmd9IHByb3ZpZGluZyBhZGRkaXRpb25hbCBuZXR3b3JrIHN0YXRlCiAgICAgICogaW5mb3JtYXRpb24gcGFzc2VkIHVwIGZyb20gdGhlIGxvd2VyIG5ldHdvcmtpbmcgbGF5ZXJzLgorICAgICAqIEBoaWRlCiAgICAgICovCi0gICAgdm9pZCBzZXREZXRhaWxlZFN0YXRlKERldGFpbGVkU3RhdGUgZGV0YWlsZWRTdGF0ZSwgU3RyaW5nIHJlYXNvbiwgU3RyaW5nIGV4dHJhSW5mbykgewotICAgICAgICB0aGlzLm1EZXRhaWxlZFN0YXRlID0gZGV0YWlsZWRTdGF0ZTsKLSAgICAgICAgdGhpcy5tU3RhdGUgPSBzdGF0ZU1hcC5nZXQoZGV0YWlsZWRTdGF0ZSk7Ci0gICAgICAgIHRoaXMubVJlYXNvbiA9IHJlYXNvbjsKLSAgICAgICAgdGhpcy5tRXh0cmFJbmZvID0gZXh0cmFJbmZvOworICAgIHB1YmxpYyB2b2lkIHNldERldGFpbGVkU3RhdGUoRGV0YWlsZWRTdGF0ZSBkZXRhaWxlZFN0YXRlLCBTdHJpbmcgcmVhc29uLCBTdHJpbmcgZXh0cmFJbmZvKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgdGhpcy5tRGV0YWlsZWRTdGF0ZSA9IGRldGFpbGVkU3RhdGU7CisgICAgICAgICAgICB0aGlzLm1TdGF0ZSA9IHN0YXRlTWFwLmdldChkZXRhaWxlZFN0YXRlKTsKKyAgICAgICAgICAgIHRoaXMubVJlYXNvbiA9IHJlYXNvbjsKKyAgICAgICAgICAgIHRoaXMubUV4dHJhSW5mbyA9IGV4dHJhSW5mbzsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgpAQCAtMjk1LDcgKzMzMSw5IEBACiAgICAgICogQHJldHVybiB0aGUgcmVhc29uIGZvciBmYWlsdXJlLCBvciBudWxsIGlmIG5vdCBhdmFpbGFibGUKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldFJlYXNvbigpIHsKLSAgICAgICAgcmV0dXJuIG1SZWFzb247CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgcmV0dXJuIG1SZWFzb247CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKQEAgLTMwNSwyMCArMzQzLDI0IEBACiAgICAgICogQHJldHVybiB0aGUgZXh0cmEgaW5mb3JtYXRpb24sIG9yIG51bGwgaWYgbm90IGF2YWlsYWJsZQogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0RXh0cmFJbmZvKCkgewotICAgICAgICByZXR1cm4gbUV4dHJhSW5mbzsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICByZXR1cm4gbUV4dHJhSW5mbzsKKyAgICAgICAgfQogICAgIH0KIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCJOZXR3b3JrSW5mbzogIik7Ci0gICAgICAgIGJ1aWxkZXIuYXBwZW5kKCJ0eXBlOiAiKS5hcHBlbmQoZ2V0VHlwZU5hbWUoKSkuYXBwZW5kKCJbIikuYXBwZW5kKGdldFN1YnR5cGVOYW1lKCkpLgotICAgICAgICAgICAgICAgIGFwcGVuZCgiXSwgc3RhdGU6ICIpLmFwcGVuZChtU3RhdGUpLmFwcGVuZCgiLyIpLmFwcGVuZChtRGV0YWlsZWRTdGF0ZSkuCi0gICAgICAgICAgICAgICAgYXBwZW5kKCIsIHJlYXNvbjogIikuYXBwZW5kKG1SZWFzb24gPT0gbnVsbCA/ICIodW5zcGVjaWZpZWQpIiA6IG1SZWFzb24pLgotICAgICAgICAgICAgICAgIGFwcGVuZCgiLCBleHRyYTogIikuYXBwZW5kKG1FeHRyYUluZm8gPT0gbnVsbCA/ICIobm9uZSkiIDogbUV4dHJhSW5mbykuCi0gICAgICAgICAgICAgICAgYXBwZW5kKCIsIHJvYW1pbmc6ICIpLmFwcGVuZChtSXNSb2FtaW5nKS4KLSAgICAgICAgICAgICAgICBhcHBlbmQoIiwgZmFpbG92ZXI6ICIpLmFwcGVuZChtSXNGYWlsb3ZlcikuCi0gICAgICAgICAgICAgICAgYXBwZW5kKCIsIGlzQXZhaWxhYmxlOiAiKS5hcHBlbmQobUlzQXZhaWxhYmxlKTsKLSAgICAgICAgcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigiTmV0d29ya0luZm86ICIpOworICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoInR5cGU6ICIpLmFwcGVuZChnZXRUeXBlTmFtZSgpKS5hcHBlbmQoIlsiKS5hcHBlbmQoZ2V0U3VidHlwZU5hbWUoKSkuCisgICAgICAgICAgICBhcHBlbmQoIl0sIHN0YXRlOiAiKS5hcHBlbmQobVN0YXRlKS5hcHBlbmQoIi8iKS5hcHBlbmQobURldGFpbGVkU3RhdGUpLgorICAgICAgICAgICAgYXBwZW5kKCIsIHJlYXNvbjogIikuYXBwZW5kKG1SZWFzb24gPT0gbnVsbCA/ICIodW5zcGVjaWZpZWQpIiA6IG1SZWFzb24pLgorICAgICAgICAgICAgYXBwZW5kKCIsIGV4dHJhOiAiKS5hcHBlbmQobUV4dHJhSW5mbyA9PSBudWxsID8gIihub25lKSIgOiBtRXh0cmFJbmZvKS4KKyAgICAgICAgICAgIGFwcGVuZCgiLCByb2FtaW5nOiAiKS5hcHBlbmQobUlzUm9hbWluZykuCisgICAgICAgICAgICBhcHBlbmQoIiwgZmFpbG92ZXI6ICIpLmFwcGVuZChtSXNGYWlsb3ZlcikuCisgICAgICAgICAgICBhcHBlbmQoIiwgaXNBdmFpbGFibGU6ICIpLmFwcGVuZChtSXNBdmFpbGFibGUpOworICAgICAgICAgICAgcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgpAQCAtMzM0LDE3ICszNzYsMTkgQEAKICAgICAgKiBAaGlkZQogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHdyaXRlVG9QYXJjZWwoUGFyY2VsIGRlc3QsIGludCBmbGFncykgewotICAgICAgICBkZXN0LndyaXRlSW50KG1OZXR3b3JrVHlwZSk7Ci0gICAgICAgIGRlc3Qud3JpdGVJbnQobVN1YnR5cGUpOwotICAgICAgICBkZXN0LndyaXRlU3RyaW5nKG1UeXBlTmFtZSk7Ci0gICAgICAgIGRlc3Qud3JpdGVTdHJpbmcobVN1YnR5cGVOYW1lKTsKLSAgICAgICAgZGVzdC53cml0ZVN0cmluZyhtU3RhdGUubmFtZSgpKTsKLSAgICAgICAgZGVzdC53cml0ZVN0cmluZyhtRGV0YWlsZWRTdGF0ZS5uYW1lKCkpOwotICAgICAgICBkZXN0LndyaXRlSW50KG1Jc0ZhaWxvdmVyID8gMSA6IDApOwotICAgICAgICBkZXN0LndyaXRlSW50KG1Jc0F2YWlsYWJsZSA/IDEgOiAwKTsKLSAgICAgICAgZGVzdC53cml0ZUludChtSXNSb2FtaW5nID8gMSA6IDApOwotICAgICAgICBkZXN0LndyaXRlU3RyaW5nKG1SZWFzb24pOwotICAgICAgICBkZXN0LndyaXRlU3RyaW5nKG1FeHRyYUluZm8pOworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIGRlc3Qud3JpdGVJbnQobU5ldHdvcmtUeXBlKTsKKyAgICAgICAgICAgIGRlc3Qud3JpdGVJbnQobVN1YnR5cGUpOworICAgICAgICAgICAgZGVzdC53cml0ZVN0cmluZyhtVHlwZU5hbWUpOworICAgICAgICAgICAgZGVzdC53cml0ZVN0cmluZyhtU3VidHlwZU5hbWUpOworICAgICAgICAgICAgZGVzdC53cml0ZVN0cmluZyhtU3RhdGUubmFtZSgpKTsKKyAgICAgICAgICAgIGRlc3Qud3JpdGVTdHJpbmcobURldGFpbGVkU3RhdGUubmFtZSgpKTsKKyAgICAgICAgICAgIGRlc3Qud3JpdGVJbnQobUlzRmFpbG92ZXIgPyAxIDogMCk7CisgICAgICAgICAgICBkZXN0LndyaXRlSW50KG1Jc0F2YWlsYWJsZSA/IDEgOiAwKTsKKyAgICAgICAgICAgIGRlc3Qud3JpdGVJbnQobUlzUm9hbWluZyA/IDEgOiAwKTsKKyAgICAgICAgICAgIGRlc3Qud3JpdGVTdHJpbmcobVJlYXNvbik7CisgICAgICAgICAgICBkZXN0LndyaXRlU3RyaW5nKG1FeHRyYUluZm8pOworICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvTmV0d29ya1Byb3BlcnRpZXMuYWlkbCBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9OZXR3b3JrUHJvcGVydGllcy5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3YWFjNmUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvTmV0d29ya1Byb3BlcnRpZXMuYWlkbApAQCAtMCwwICsxLDIyIEBACisvKgorKioKKyoqIENvcHlyaWdodCAoQykgMjAwOSBRdWFsY29tbSBJbm5vdmF0aW9uIENlbnRlciwgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyoqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCitwYWNrYWdlIGFuZHJvaWQubmV0OworCitwYXJjZWxhYmxlIE5ldHdvcmtQcm9wZXJ0aWVzOworCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvTmV0d29ya1Byb3BlcnRpZXMuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9OZXR3b3JrUHJvcGVydGllcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhMmEyZDQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvTmV0d29ya1Byb3BlcnRpZXMuamF2YQpAQCAtMCwwICsxLDE5MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5uZXQ7CisKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOworaW1wb3J0IGphdmEubmV0Lk5ldHdvcmtJbnRlcmZhY2U7CitpbXBvcnQgamF2YS5uZXQuU29ja2V0RXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVua25vd25Ib3N0RXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CisKKy8qKgorICogRGVzY3JpYmVzIHRoZSBwcm9wZXJ0aWVzIG9mIGEgbmV0d29yayBpbnRlcmZhY2Ugb3Igc2luZ2xlIGFkZHJlc3MKKyAqIG9mIGFuIGludGVyZmFjZS4KKyAqIFRPRE8gLSBjb25zaWRlciBhZGRpbmcgb3B0aW9uYWwgZmllbGRzIGxpa2UgQXBuIGFuZCBBcG5UeXBlCisgKiBAaGlkZQorICovCitwdWJsaWMgY2xhc3MgTmV0d29ya1Byb3BlcnRpZXMgaW1wbGVtZW50cyBQYXJjZWxhYmxlIHsKKworICAgIHByaXZhdGUgTmV0d29ya0ludGVyZmFjZSBtSWZhY2U7CisgICAgcHJpdmF0ZSBDb2xsZWN0aW9uPEluZXRBZGRyZXNzPiBtQWRkcmVzc2VzOworICAgIHByaXZhdGUgQ29sbGVjdGlvbjxJbmV0QWRkcmVzcz4gbURuc2VzOworICAgIHByaXZhdGUgSW5ldEFkZHJlc3MgbUdhdGV3YXk7CisgICAgcHJpdmF0ZSBQcm94eVByb3BlcnRpZXMgbUh0dHBQcm94eTsKKworICAgIHB1YmxpYyBOZXR3b3JrUHJvcGVydGllcygpIHsKKyAgICAgICAgY2xlYXIoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0SW50ZXJmYWNlKE5ldHdvcmtJbnRlcmZhY2UgaWZhY2UpIHsKKyAgICAgICAgbUlmYWNlID0gaWZhY2U7CisgICAgfQorICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgTmV0d29ya0ludGVyZmFjZSBnZXRJbnRlcmZhY2UoKSB7CisgICAgICAgIHJldHVybiBtSWZhY2U7CisgICAgfQorICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgU3RyaW5nIGdldEludGVyZmFjZU5hbWUoKSB7CisgICAgICAgIHJldHVybiAobUlmYWNlID09IG51bGwgPyBudWxsIDogbUlmYWNlLmdldE5hbWUoKSk7CisgICAgfQorCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFkZEFkZHJlc3MoSW5ldEFkZHJlc3MgYWRkcmVzcykgeworICAgICAgICBtQWRkcmVzc2VzLmFkZChhZGRyZXNzKTsKKyAgICB9CisgICAgcHVibGljIHN5bmNocm9uaXplZCBDb2xsZWN0aW9uPEluZXRBZGRyZXNzPiBnZXRBZGRyZXNzZXMoKSB7CisgICAgICAgIHJldHVybiBtQWRkcmVzc2VzOworICAgIH0KKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGREbnMoSW5ldEFkZHJlc3MgZG5zKSB7CisgICAgICAgIG1EbnNlcy5hZGQoZG5zKTsKKyAgICB9CisgICAgcHVibGljIHN5bmNocm9uaXplZCBDb2xsZWN0aW9uPEluZXRBZGRyZXNzPiBnZXREbnNlcygpIHsKKyAgICAgICAgcmV0dXJuIG1EbnNlczsKKyAgICB9CisKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0R2F0ZXdheShJbmV0QWRkcmVzcyBnYXRld2F5KSB7CisgICAgICAgIG1HYXRld2F5ID0gZ2F0ZXdheTsKKyAgICB9CisgICAgcHVibGljIHN5bmNocm9uaXplZCBJbmV0QWRkcmVzcyBnZXRHYXRld2F5KCkgeworICAgICAgICByZXR1cm4gbUdhdGV3YXk7CisgICAgfQorCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldEh0dHBQcm94eShQcm94eVByb3BlcnRpZXMgcHJveHkpIHsKKyAgICAgICAgbUh0dHBQcm94eSA9IHByb3h5OworICAgIH0KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIFByb3h5UHJvcGVydGllcyBnZXRIdHRwUHJveHkoKSB7CisgICAgICAgIHJldHVybiBtSHR0cFByb3h5OworICAgIH0KKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBjbGVhcigpIHsKKyAgICAgICAgbUlmYWNlID0gbnVsbDsKKyAgICAgICAgbUFkZHJlc3NlcyA9IG5ldyBBcnJheUxpc3Q8SW5ldEFkZHJlc3M+KCk7CisgICAgICAgIG1EbnNlcyA9IG5ldyBBcnJheUxpc3Q8SW5ldEFkZHJlc3M+KCk7CisgICAgICAgIG1HYXRld2F5ID0gbnVsbDsKKyAgICAgICAgbUh0dHBQcm94eSA9IG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW1wbGVtZW50IHRoZSBQYXJjZWxhYmxlIGludGVyZmFjZQorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGludCBkZXNjcmliZUNvbnRlbnRzKCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgU3RyaW5nIGlmYWNlTmFtZSA9IChtSWZhY2UgPT0gbnVsbCA/ICIiIDogIkludGVyZmFjZU5hbWU6ICIgKyBtSWZhY2UuZ2V0TmFtZSgpICsgIiAiKTsKKworICAgICAgICBTdHJpbmcgaXAgPSAiSXBBZGRyZXNzZXM6IFsiOworICAgICAgICBmb3IgKEluZXRBZGRyZXNzIGFkZHIgOiBtQWRkcmVzc2VzKSBpcCArPSAgYWRkci50b1N0cmluZygpICsgIiwiOworICAgICAgICBpcCArPSAiXSAiOworCisgICAgICAgIFN0cmluZyBkbnMgPSAiRG5zQWRkcmVzc2VzOiBbIjsKKyAgICAgICAgZm9yIChJbmV0QWRkcmVzcyBhZGRyIDogbURuc2VzKSBkbnMgKz0gYWRkci50b1N0cmluZygpICsgIiwiOworICAgICAgICBkbnMgKz0gIl0gIjsKKworICAgICAgICBTdHJpbmcgcHJveHkgPSAobUh0dHBQcm94eSA9PSBudWxsID8gIiIgOiAiSHR0cFByb3h5OiAiICsgbUh0dHBQcm94eS50b1N0cmluZygpICsgIiAiKTsKKyAgICAgICAgU3RyaW5nIGdhdGV3YXkgPSAobUdhdGV3YXkgPT0gbnVsbCA/ICIiIDogIkdhdGV3YXk6ICIgKyBtR2F0ZXdheS50b1N0cmluZygpICsgIiAiKTsKKworICAgICAgICByZXR1cm4gaWZhY2VOYW1lICsgaXAgKyBnYXRld2F5ICsgZG5zICsgcHJveHk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW1wbGVtZW50IHRoZSBQYXJjZWxhYmxlIGludGVyZmFjZS4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCB3cml0ZVRvUGFyY2VsKFBhcmNlbCBkZXN0LCBpbnQgZmxhZ3MpIHsKKyAgICAgICAgZGVzdC53cml0ZVN0cmluZyhnZXRJbnRlcmZhY2VOYW1lKCkpOworICAgICAgICBkZXN0LndyaXRlSW50KG1BZGRyZXNzZXMuc2l6ZSgpKTsKKyAgICAgICAgLy9UT0RPOiBleHBsb3JlIGFuIGVhc3kgYWx0ZXJuYXRpdmUgdG8gcHJlc2VydmUgaG9zdG5hbWUKKyAgICAgICAgLy8gd2l0aG91dCBkb2luZyBhIGxvb2t1cAorICAgICAgICBmb3IoSW5ldEFkZHJlc3MgYSA6IG1BZGRyZXNzZXMpIHsKKyAgICAgICAgICAgIGRlc3Qud3JpdGVCeXRlQXJyYXkoYS5nZXRBZGRyZXNzKCkpOworICAgICAgICB9CisgICAgICAgIGRlc3Qud3JpdGVJbnQobURuc2VzLnNpemUoKSk7CisgICAgICAgIGZvcihJbmV0QWRkcmVzcyBkIDogbURuc2VzKSB7CisgICAgICAgICAgICBkZXN0LndyaXRlQnl0ZUFycmF5KGQuZ2V0QWRkcmVzcygpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobUdhdGV3YXkgIT0gbnVsbCkgeworICAgICAgICAgICAgZGVzdC53cml0ZUJ5dGUoKGJ5dGUpMSk7CisgICAgICAgICAgICBkZXN0LndyaXRlQnl0ZUFycmF5KG1HYXRld2F5LmdldEFkZHJlc3MoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkZXN0LndyaXRlQnl0ZSgoYnl0ZSkwKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobUh0dHBQcm94eSAhPSBudWxsKSB7CisgICAgICAgICAgICBkZXN0LndyaXRlQnl0ZSgoYnl0ZSkxKTsKKyAgICAgICAgICAgIGRlc3Qud3JpdGVQYXJjZWxhYmxlKG1IdHRwUHJveHksIGZsYWdzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRlc3Qud3JpdGVCeXRlKChieXRlKTApOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSW1wbGVtZW50IHRoZSBQYXJjZWxhYmxlIGludGVyZmFjZS4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ3JlYXRvcjxOZXR3b3JrUHJvcGVydGllcz4gQ1JFQVRPUiA9CisgICAgICAgIG5ldyBDcmVhdG9yPE5ldHdvcmtQcm9wZXJ0aWVzPigpIHsKKyAgICAgICAgICAgIHB1YmxpYyBOZXR3b3JrUHJvcGVydGllcyBjcmVhdGVGcm9tUGFyY2VsKFBhcmNlbCBpbikgeworICAgICAgICAgICAgICAgIE5ldHdvcmtQcm9wZXJ0aWVzIG5ldFByb3AgPSBuZXcgTmV0d29ya1Byb3BlcnRpZXMoKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgaWZhY2UgPSBpbi5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgaWYgKGlmYWNlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldFByb3Auc2V0SW50ZXJmYWNlKE5ldHdvcmtJbnRlcmZhY2UuZ2V0QnlOYW1lKGlmYWNlKSk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbnQgYWRkcmVzc0NvdW50ID0gaW4ucmVhZEludCgpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxhZGRyZXNzQ291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgbmV0UHJvcC5hZGRBZGRyZXNzKEluZXRBZGRyZXNzLmdldEJ5QWRkcmVzcyhpbi5jcmVhdGVCeXRlQXJyYXkoKSkpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChVbmtub3duSG9zdEV4Y2VwdGlvbiBlKSB7IH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYWRkcmVzc0NvdW50ID0gaW4ucmVhZEludCgpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxhZGRyZXNzQ291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgbmV0UHJvcC5hZGREbnMoSW5ldEFkZHJlc3MuZ2V0QnlBZGRyZXNzKGluLmNyZWF0ZUJ5dGVBcnJheSgpKSk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFVua25vd25Ib3N0RXhjZXB0aW9uIGUpIHsgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoaW4ucmVhZEJ5dGUoKSA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXRQcm9wLnNldEdhdGV3YXkoSW5ldEFkZHJlc3MuZ2V0QnlBZGRyZXNzKGluLmNyZWF0ZUJ5dGVBcnJheSgpKSk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFVua25vd25Ib3N0RXhjZXB0aW9uIGUpIHt9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChpbi5yZWFkQnl0ZSgpID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgbmV0UHJvcC5zZXRIdHRwUHJveHkoKFByb3h5UHJvcGVydGllcylpbi5yZWFkUGFyY2VsYWJsZShudWxsKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBuZXRQcm9wOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgTmV0d29ya1Byb3BlcnRpZXNbXSBuZXdBcnJheShpbnQgc2l6ZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTmV0d29ya1Byb3BlcnRpZXNbc2l6ZV07CisgICAgICAgICAgICB9CisgICAgICAgIH07Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvTmV0d29ya1N0YXRlVHJhY2tlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L05ldHdvcmtTdGF0ZVRyYWNrZXIuamF2YQppbmRleCAwMjc3ZDJkLi4wMDQ4YTJlIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvTmV0d29ya1N0YXRlVHJhY2tlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9OZXR3b3JrU3RhdGVUcmFja2VyLmphdmEKQEAgLTE2LDM0OSArMTYsMTIxIEBACiAKIHBhY2thZ2UgYW5kcm9pZC5uZXQ7CiAKLWltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKLWltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7Ci1pbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1Qcm9wZXJ0aWVzOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkNvbmZpZzsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotCitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwogCiAvKioKLSAqIEVhY2ggc3ViY2xhc3Mgb2YgdGhpcyBjbGFzcyBrZWVwcyB0cmFjayBvZiB0aGUgc3RhdGUgb2YgY29ubmVjdGl2aXR5Ci0gKiBvZiBhIG5ldHdvcmsgaW50ZXJmYWNlLiBBbGwgc3RhdGUgaW5mb3JtYXRpb24gZm9yIGEgbmV0d29yayBzaG91bGQKLSAqIGJlIGtlcHQgaW4gYSBUcmFja2VyIGNsYXNzLiBUaGlzIHN1cGVyY2xhc3MgbWFuYWdlcyB0aGUKLSAqIG5ldHdvcmstdHlwZS1pbmRlcGVuZGVudCBhc3BlY3RzIG9mIG5ldHdvcmsgc3RhdGUuCisgKiBJbnRlcmZhY2UgcHJvdmlkZXMgdGhlIHtAbGluayBjb20uYW5kcm9pZC5zZXJ2ZXIuQ29ubmVjdGl2aXR5U2VydmljZX0KKyAqIHdpdGggdGhyZWUgc2VydmljZXMuIEV2ZW50cyB0byB0aGUgQ29ubmVjdGl2aXR5U2VydmljZSB3aGVuCisgKiBjaGFuZ2VzIG9jY3VyLCBhbiBBUEkgZm9yIGNvbnRyb2xsaW5nIHRoZSBuZXR3b3JrIGFuZCBzdG9yYWdlCisgKiBmb3IgbmV0d29yayBzcGVjaWZpYyBpbmZvcm1hdGlvbi4KKyAqCisgKiBUaGUgQ29ubmVjdGl2aXR5IHdpbGwgY2FsbCBzdGFydE1vbml0b3JpbmcgYmVmb3JlIGFueSBvdGhlcgorICogbWV0aG9kIGlzIGNhbGxlZC4KICAqCiAgKiB7QGhpZGV9CiAgKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBOZXR3b3JrU3RhdGVUcmFja2VyIGV4dGVuZHMgSGFuZGxlciB7CitwdWJsaWMgaW50ZXJmYWNlIE5ldHdvcmtTdGF0ZVRyYWNrZXIgewogCi0gICAgcHJvdGVjdGVkIE5ldHdvcmtJbmZvIG1OZXR3b3JrSW5mbzsKLSAgICBwcm90ZWN0ZWQgQ29udGV4dCBtQ29udGV4dDsKLSAgICBwcm90ZWN0ZWQgSGFuZGxlciBtVGFyZ2V0OwotICAgIHByb3RlY3RlZCBTdHJpbmcgbUludGVyZmFjZU5hbWU7Ci0gICAgcHJvdGVjdGVkIFN0cmluZ1tdIG1EbnNQcm9wTmFtZXM7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1Qcml2YXRlRG5zUm91dGVTZXQ7Ci0gICAgcHJvdGVjdGVkIGludCBtRGVmYXVsdEdhdGV3YXlBZGRyOwotICAgIHByaXZhdGUgYm9vbGVhbiBtVGVhcmRvd25SZXF1ZXN0ZWQ7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIERCRyA9IHRydWU7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJOZXR3b3JrU3RhdGVUcmFja2VyIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVWRU5UX1NUQVRFX0NIQU5HRUQgPSAxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVWRU5UX1NDQU5fUkVTVUxUU19BVkFJTEFCTEUgPSAyOwogICAgIC8qKgotICAgICAqIGFyZzE6IDEgdG8gc2hvdywgMCB0byBoaWRlCi0gICAgICogYXJnMjogSUQgb2YgdGhlIG5vdGlmaWNhdGlvbgotICAgICAqIG9iajogTm90aWZpY2F0aW9uIChpZiBzaG93aW5nKQorICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgKiBFdmVudCBJbnRlcmZhY2UgYmFjayB0byBDb25uZWN0aXZpdHlTZXJ2aWNlLgorICAgICAqCisgICAgICogVGhlIGV2ZW50cyB0aGF0IGFyZSB0byBiZSBzZW50IGJhY2sgdG8gdGhlIEhhbmRsZXIgcGFzc2VkCisgICAgICogdG8gc3RhcnRNb25pdG9yaW5nIHdoZW4gdGhlIHBhcnRpY3VsYXIgZXZlbnQgb2NjdXJzLgorICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFVkVOVF9OT1RJRklDQVRJT05fQ0hBTkdFRCA9IDM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfQ09ORklHVVJBVElPTl9DSEFOR0VEID0gNDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFVkVOVF9ST0FNSU5HX0NIQU5HRUQgPSA1OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVWRU5UX05FVFdPUktfU1VCVFlQRV9DSEFOR0VEID0gNjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFVkVOVF9SRVNUT1JFX0RFRkFVTFRfTkVUV09SSyA9IDc7CiAKLSAgICBwdWJsaWMgTmV0d29ya1N0YXRlVHJhY2tlcihDb250ZXh0IGNvbnRleHQsCi0gICAgICAgICAgICBIYW5kbGVyIHRhcmdldCwKLSAgICAgICAgICAgIGludCBuZXR3b3JrVHlwZSwKLSAgICAgICAgICAgIGludCBzdWJUeXBlLAotICAgICAgICAgICAgU3RyaW5nIHR5cGVOYW1lLAotICAgICAgICAgICAgU3RyaW5nIHN1YnR5cGVOYW1lKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKLSAgICAgICAgbVRhcmdldCA9IHRhcmdldDsKLSAgICAgICAgbVRlYXJkb3duUmVxdWVzdGVkID0gZmFsc2U7CisgICAgLyoqCisgICAgICogVGhlIG5ldHdvcmsgc3RhdGUgaGFzIGNoYW5nZWQgYW5kIHRoZSBOZXR3b3JrSW5mbyBvYmplY3QKKyAgICAgKiBjb250YWlucyB0aGUgbmV3IHN0YXRlLgorICAgICAqCisgICAgICogbXNnLndoYXQgPSBFVkVOVF9TVEFURV9DSEFOR0VECisgICAgICogbXNnLm9iaiA9IE5ldHdvcmtJbmZvIG9iamVjdAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVWRU5UX1NUQVRFX0NIQU5HRUQgPSAxOwogCi0gICAgICAgIHRoaXMubU5ldHdvcmtJbmZvID0gbmV3IE5ldHdvcmtJbmZvKG5ldHdvcmtUeXBlLCBzdWJUeXBlLCB0eXBlTmFtZSwgc3VidHlwZU5hbWUpOwotICAgIH0KKyAgICAvKioKKyAgICAgKiBtc2cud2hhdCA9IEVWRU5UX0NPTkZJR1VSQVRJT05fQ0hBTkdFRAorICAgICAqIG1zZy5vYmogPSBOZXR3b3JrSW5mbyBvYmplY3QKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFVkVOVF9DT05GSUdVUkFUSU9OX0NIQU5HRUQgPSAzOwogCi0gICAgcHVibGljIE5ldHdvcmtJbmZvIGdldE5ldHdvcmtJbmZvKCkgewotICAgICAgICByZXR1cm4gbU5ldHdvcmtJbmZvOwotICAgIH0KKyAgICAvKioKKyAgICAgKiBtc2cud2hhdCA9IEVWRU5UX1JFU1RPUkVfREVGQVVMVF9ORVRXT1JLCisgICAgICogbXNnLm9iaiA9IEZlYXR1cmVVc2VyIG9iamVjdAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVWRU5UX1JFU1RPUkVfREVGQVVMVF9ORVRXT1JLID0gNjsKKworICAgIC8qKgorICAgICAqIFVTRUQgYnkgQ29ubmVjdGl2aXR5U2VydmljZSBvbmx5CisgICAgICoKKyAgICAgKiBtc2cud2hhdCA9IEVWRU5UX0NMRUFSX05FVF9UUkFOU0lUSU9OX1dBS0VMT0NLCisgICAgICogbXNnLmFyZzEgPSBtTmV0VHJhbnNpdGlvbldha2VMb2NrU2VyaWFsTnVtYmVyCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfQ0xFQVJfTkVUX1RSQU5TSVRJT05fV0FLRUxPQ0sgPSA3OworCisgICAgLyoqCisgICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAqIENvbnRyb2wgSW50ZXJmYWNlCisgICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAqLworICAgIC8qKgorICAgICAqIEJlZ2luIG1vbml0b3JpbmcgZGF0YSBjb25uZWN0aXZpdHkuCisgICAgICoKKyAgICAgKiBUaGlzIGlzIHRoZSBmaXJzdCBtZXRob2QgY2FsbGVkIHdoZW4gdGhpcyBpbnRlcmZhY2UgaXMgdXNlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IGlzIHRoZSBjdXJyZW50IEFuZHJvaWQgY29udGV4dAorICAgICAqIEBwYXJhbSB0YXJnZXQgaXMgdGhlIEhhbmRlciB0byB3aGljaCB0byByZXR1cm4gdGhlIGV2ZW50cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdGFydE1vbml0b3JpbmcoQ29udGV4dCBjb250ZXh0LCBIYW5kbGVyIHRhcmdldCk7CisKKyAgICAvKioKKyAgICAgKiBGZXRjaCBOZXR3b3JrSW5mbyBmb3IgdGhlIG5ldHdvcmsKKyAgICAgKi8KKyAgICBwdWJsaWMgTmV0d29ya0luZm8gZ2V0TmV0d29ya0luZm8oKTsKKworICAgIC8qKgorICAgICAqIEZldGNoIE5ldHdvcmtQcm9wZXJ0aWVzIGZvciB0aGUgbmV0d29yaworICAgICAqLworICAgIHB1YmxpYyBOZXR3b3JrUHJvcGVydGllcyBnZXROZXR3b3JrUHJvcGVydGllcygpOwogCiAgICAgLyoqCiAgICAgICogUmV0dXJuIHRoZSBzeXN0ZW0gcHJvcGVydGllcyBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGUgdGNwIGJ1ZmZlciBzaXplcwogICAgICAqIGZvciB0aGlzIG5ldHdvcmsuCiAgICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRUY3BCdWZmZXJTaXplc1Byb3BOYW1lKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIElQIGFkZHJlc3NlcyBvZiB0aGUgRE5TIHNlcnZlcnMgYXZhaWxhYmxlIGZvciB0aGUgbW9iaWxlIGRhdGEKLSAgICAgKiBuZXR3b3JrIGludGVyZmFjZS4KLSAgICAgKiBAcmV0dXJuIGEgbGlzdCBvZiBETlMgYWRkcmVzc2VzLCB3aXRoIG5vIGhvbGVzLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXROYW1lU2VydmVycygpIHsKLSAgICAgICAgcmV0dXJuIGdldE5hbWVTZXJ2ZXJMaXN0KG1EbnNQcm9wTmFtZXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgSVAgYWRkcmVzc2VzIG9mIHRoZSBETlMgc2VydmVycyBhdmFpbGFibGUgZm9yIHRoaXMKLSAgICAgKiBuZXR3b3JrIGludGVyZmFjZS4KLSAgICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lcyB0aGUgbmFtZXMgb2YgdGhlIHN5c3RlbSBwcm9wZXJ0aWVzIHdob3NlIHZhbHVlcwotICAgICAqIGdpdmUgdGhlIElQIGFkZHJlc3Nlcy4gUHJvcGVydGllcyB3aXRoIG5vIHZhbHVlcyBhcmUgc2tpcHBlZC4KLSAgICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIHtAY29kZSBTdHJpbmd9cyBjb250YWluaW5nIHRoZSBJUCBhZGRyZXNzZXMKLSAgICAgKiBvZiB0aGUgRE5TIHNlcnZlcnMsIGluIGRvdC1ub3RhdGlvbi4gVGhpcyBtYXkgaGF2ZSBmZXdlcgotICAgICAqIG5vbi1udWxsIGVudHJpZXMgdGhhbiB0aGUgbGlzdCBvZiBuYW1lcyBwYXNzZWQgaW4sIHNpbmNlCi0gICAgICogc29tZSBvZiB0aGUgcGFzc2VkLWluIG5hbWVzIG1heSBoYXZlIGVtcHR5IHZhbHVlcy4KLSAgICAgKi8KLSAgICBzdGF0aWMgcHJvdGVjdGVkIFN0cmluZ1tdIGdldE5hbWVTZXJ2ZXJMaXN0KFN0cmluZ1tdIHByb3BlcnR5TmFtZXMpIHsKLSAgICAgICAgU3RyaW5nW10gZG5zQWRkcmVzc2VzID0gbmV3IFN0cmluZ1twcm9wZXJ0eU5hbWVzLmxlbmd0aF07Ci0gICAgICAgIGludCBpLCBqOwotCi0gICAgICAgIGZvciAoaSA9IDAsIGogPSAwOyBpIDwgcHJvcGVydHlOYW1lcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gU3lzdGVtUHJvcGVydGllcy5nZXQocHJvcGVydHlOYW1lc1tpXSk7Ci0gICAgICAgICAgICAvLyBUaGUgR1NNIGxheWVyIHNvbWV0aW1lcyBzZXRzIGEgYm9ndXMgRE5TIHNlcnZlciBhZGRyZXNzIG9mCi0gICAgICAgICAgICAvLyAwLjAuMC4wCi0gICAgICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHZhbHVlKSAmJiAhVGV4dFV0aWxzLmVxdWFscyh2YWx1ZSwgIjAuMC4wLjAiKSkgewotICAgICAgICAgICAgICAgIGRuc0FkZHJlc3Nlc1tqKytdID0gdmFsdWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGRuc0FkZHJlc3NlczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRQcml2YXRlRG5zUm91dGVzKCkgewotICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJhZGRQcml2YXRlRG5zUm91dGVzIGZvciAiICsgdGhpcyArCi0gICAgICAgICAgICAgICAgICAgICIoIiArIG1JbnRlcmZhY2VOYW1lICsgIikgLSBtUHJpdmF0ZURuc1JvdXRlU2V0ID0gIittUHJpdmF0ZURuc1JvdXRlU2V0KTsKLSAgICAgICAgfQotICAgICAgICBpZiAobUludGVyZmFjZU5hbWUgIT0gbnVsbCAmJiAhbVByaXZhdGVEbnNSb3V0ZVNldCkgewotICAgICAgICAgICAgZm9yIChTdHJpbmcgYWRkclN0cmluZyA6IGdldE5hbWVTZXJ2ZXJzKCkpIHsKLSAgICAgICAgICAgICAgICBpbnQgYWRkciA9IE5ldHdvcmtVdGlscy5sb29rdXBIb3N0KGFkZHJTdHJpbmcpOwotICAgICAgICAgICAgICAgIGlmIChhZGRyICE9IC0xICYmIGFkZHIgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsICIgIGFkZGluZyAiK2FkZHJTdHJpbmcrIiAoIithZGRyKyIpIik7Ci0gICAgICAgICAgICAgICAgICAgIE5ldHdvcmtVdGlscy5hZGRIb3N0Um91dGUobUludGVyZmFjZU5hbWUsIGFkZHIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1Qcml2YXRlRG5zUm91dGVTZXQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlUHJpdmF0ZURuc1JvdXRlcygpIHsKLSAgICAgICAgLy8gVE9ETyAtIHdlIHNob3VsZCBkbyB0aGlzIGV4cGxpY2l0bHkgYnV0IHRoZSBOZXRVdGlscyBhcGkgZG9lc250Ci0gICAgICAgIC8vIHN1cHBvcnQgdGhpcyB5ZXQgLSBtdXN0IHJlbW92ZSBhbGwuICBObyB3b3JzZSB0aGFuIGJlZm9yZQotICAgICAgICBpZiAobUludGVyZmFjZU5hbWUgIT0gbnVsbCAmJiBtUHJpdmF0ZURuc1JvdXRlU2V0KSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAicmVtb3ZlUHJpdmF0ZURuc1JvdXRlcyBmb3IgIiArIG1OZXR3b3JrSW5mby5nZXRUeXBlTmFtZSgpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICIgKCIgKyBtSW50ZXJmYWNlTmFtZSArICIpIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBOZXR3b3JrVXRpbHMucmVtb3ZlSG9zdFJvdXRlcyhtSW50ZXJmYWNlTmFtZSk7Ci0gICAgICAgICAgICBtUHJpdmF0ZURuc1JvdXRlU2V0ID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGREZWZhdWx0Um91dGUoKSB7Ci0gICAgICAgIGlmICgobUludGVyZmFjZU5hbWUgIT0gbnVsbCkgJiYgKG1EZWZhdWx0R2F0ZXdheUFkZHIgIT0gMCkpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJhZGREZWZhdWx0Um91dGUgZm9yICIgKyBtTmV0d29ya0luZm8uZ2V0VHlwZU5hbWUoKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAiICgiICsgbUludGVyZmFjZU5hbWUgKyAiKSwgR2F0ZXdheUFkZHI9IiArIG1EZWZhdWx0R2F0ZXdheUFkZHIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTmV0d29ya1V0aWxzLnNldERlZmF1bHRSb3V0ZShtSW50ZXJmYWNlTmFtZSwgbURlZmF1bHRHYXRld2F5QWRkcik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVEZWZhdWx0Um91dGUoKSB7Ci0gICAgICAgIGlmIChtSW50ZXJmYWNlTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAicmVtb3ZlRGVmYXVsdFJvdXRlIGZvciAiICsgbU5ldHdvcmtJbmZvLmdldFR5cGVOYW1lKCkgKyAiICgiICsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1JbnRlcmZhY2VOYW1lICsgIikiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIE5ldHdvcmtVdGlscy5yZW1vdmVEZWZhdWx0Um91dGUobUludGVyZmFjZU5hbWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVhZHMgdGhlIG5ldHdvcmsgc3BlY2lmaWMgVENQIGJ1ZmZlciBzaXplcyBmcm9tIFN5c3RlbVByb3BlcnRpZXMKLSAgICAgKiBuZXQudGNwLmJ1ZmZlcnNpemUuW2RlZmF1bHR8d2lmaXx1bXRzfGVkZ2V8Z3Byc10gYW5kIHNldCB0aGVtIGZvciBzeXN0ZW0KLSAgICAgKiB3aWRlIHVzZQotICAgICAqLwotICAgcHVibGljIHZvaWQgdXBkYXRlTmV0d29ya1NldHRpbmdzKCkgewotICAgICAgICBTdHJpbmcga2V5ID0gZ2V0VGNwQnVmZmVyU2l6ZXNQcm9wTmFtZSgpOwotICAgICAgICBTdHJpbmcgYnVmZmVyU2l6ZXMgPSBTeXN0ZW1Qcm9wZXJ0aWVzLmdldChrZXkpOwotCi0gICAgICAgIGlmIChidWZmZXJTaXplcy5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICBMb2cuZShUQUcsIGtleSArICIgbm90IGZvdW5kIGluIHN5c3RlbSBwcm9wZXJ0aWVzLiBVc2luZyBkZWZhdWx0cyIpOwotCi0gICAgICAgICAgICAvLyBTZXR0aW5nIHRvIGRlZmF1bHQgdmFsdWVzIHNvIHdlIHdvbid0IGJlIHN0dWNrIHRvIHByZXZpb3VzIHZhbHVlcwotICAgICAgICAgICAga2V5ID0gIm5ldC50Y3AuYnVmZmVyc2l6ZS5kZWZhdWx0IjsKLSAgICAgICAgICAgIGJ1ZmZlclNpemVzID0gU3lzdGVtUHJvcGVydGllcy5nZXQoa2V5KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFNldCB2YWx1ZXMgaW4ga2VybmVsCi0gICAgICAgIGlmIChidWZmZXJTaXplcy5sZW5ndGgoKSAhPSAwKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAiU2V0dGluZyBUQ1AgdmFsdWVzOiBbIiArIGJ1ZmZlclNpemVzCi0gICAgICAgICAgICAgICAgICAgICAgICArICJdIHdoaWNoIGNvbWVzIGZyb20gWyIgKyBrZXkgKyAiXSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0QnVmZmVyU2l6ZShidWZmZXJTaXplcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWxlYXNlIHRoZSB3YWtlbG9jaywgaWYgYW55LCB0aGF0IG1heSBiZSBoZWxkIHdoaWxlIGhhbmRsaW5nIGEKLSAgICAgKiBkaXNjb25uZWN0IG9wZXJhdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZWxlYXNlV2FrZUxvY2soKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV3JpdGVzIFRDUCBidWZmZXIgc2l6ZXMgdG8gL3N5cy9rZXJuZWwvaXB2NC90Y3BfW3Ivd11tZW1fW21pbi9kZWYvbWF4XQotICAgICAqIHdoaWNoIG1hcHMgdG8gL3Byb2Mvc3lzL25ldC9pcHY0L3RjcF9ybWVtIGFuZCB0Y3B3bWVtCi0gICAgICogCi0gICAgICogQHBhcmFtIGJ1ZmZlclNpemVzIGluIHRoZSBmb3JtYXQgb2YgInJlYWRNaW4sIHJlYWRJbml0aWFsLCByZWFkTWF4LAotICAgICAqICAgICAgICB3cml0ZU1pbiwgd3JpdGVJbml0aWFsLCB3cml0ZU1heCIKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2V0QnVmZmVyU2l6ZShTdHJpbmcgYnVmZmVyU2l6ZXMpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFN0cmluZ1tdIHZhbHVlcyA9IGJ1ZmZlclNpemVzLnNwbGl0KCIsIik7Ci0KLSAgICAgICAgICAgIGlmICh2YWx1ZXMubGVuZ3RoID09IDYpIHsKLSAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHByZWZpeCA9ICIvc3lzL2tlcm5lbC9pcHY0L3RjcF8iOwotICAgICAgICAgICAgICAgIHN0cmluZ1RvRmlsZShwcmVmaXggKyAicm1lbV9taW4iLCB2YWx1ZXNbMF0pOwotICAgICAgICAgICAgICAgIHN0cmluZ1RvRmlsZShwcmVmaXggKyAicm1lbV9kZWYiLCB2YWx1ZXNbMV0pOwotICAgICAgICAgICAgICAgIHN0cmluZ1RvRmlsZShwcmVmaXggKyAicm1lbV9tYXgiLCB2YWx1ZXNbMl0pOwotICAgICAgICAgICAgICAgIHN0cmluZ1RvRmlsZShwcmVmaXggKyAid21lbV9taW4iLCB2YWx1ZXNbM10pOwotICAgICAgICAgICAgICAgIHN0cmluZ1RvRmlsZShwcmVmaXggKyAid21lbV9kZWYiLCB2YWx1ZXNbNF0pOwotICAgICAgICAgICAgICAgIHN0cmluZ1RvRmlsZShwcmVmaXggKyAid21lbV9tYXgiLCB2YWx1ZXNbNV0pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJJbnZhbGlkIGJ1ZmZlcnNpemUgc3RyaW5nOiAiICsgYnVmZmVyU2l6ZXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cuZShUQUcsICJDYW4ndCBzZXQgdGNwIGJ1ZmZlciBzaXplczoiICsgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXcml0ZXMgc3RyaW5nIHRvIGZpbGUuIEJhc2ljYWxseSBzYW1lIGFzICJlY2hvIC1uICRzdHJpbmcgPiAkZmlsZW5hbWUiCi0gICAgICogCi0gICAgICogQHBhcmFtIGZpbGVuYW1lCi0gICAgICogQHBhcmFtIHN0cmluZwotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc3RyaW5nVG9GaWxlKFN0cmluZyBmaWxlbmFtZSwgU3RyaW5nIHN0cmluZykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgRmlsZVdyaXRlciBvdXQgPSBuZXcgRmlsZVdyaXRlcihmaWxlbmFtZSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBvdXQud3JpdGUoc3RyaW5nKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIG91dC5jbG9zZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVjb3JkIHRoZSBkZXRhaWxlZCBzdGF0ZSBvZiBhIG5ldHdvcmssIGFuZCBpZiBpdCBpcyBhCi0gICAgICogY2hhbmdlIGZyb20gdGhlIHByZXZpb3VzIHN0YXRlLCBzZW5kIGEgbm90aWZpY2F0aW9uIHRvCi0gICAgICogYW55IGxpc3RlbmVycy4KLSAgICAgKiBAcGFyYW0gc3RhdGUgdGhlIG5ldyBAe2NvZGUgRGV0YWlsZWRTdGF0ZX0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREZXRhaWxlZFN0YXRlKE5ldHdvcmtJbmZvLkRldGFpbGVkU3RhdGUgc3RhdGUpIHsKLSAgICAgICAgc2V0RGV0YWlsZWRTdGF0ZShzdGF0ZSwgbnVsbCwgbnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVjb3JkIHRoZSBkZXRhaWxlZCBzdGF0ZSBvZiBhIG5ldHdvcmssIGFuZCBpZiBpdCBpcyBhCi0gICAgICogY2hhbmdlIGZyb20gdGhlIHByZXZpb3VzIHN0YXRlLCBzZW5kIGEgbm90aWZpY2F0aW9uIHRvCi0gICAgICogYW55IGxpc3RlbmVycy4KLSAgICAgKiBAcGFyYW0gc3RhdGUgdGhlIG5ldyBAe2NvZGUgRGV0YWlsZWRTdGF0ZX0KLSAgICAgKiBAcGFyYW0gcmVhc29uIGEge0Bjb2RlIFN0cmluZ30gaW5kaWNhdGluZyBhIHJlYXNvbiBmb3IgdGhlIHN0YXRlIGNoYW5nZSwKLSAgICAgKiBpZiBvbmUgd2FzIHN1cHBsaWVkLiBNYXkgYmUge0Bjb2RlIG51bGx9LgotICAgICAqIEBwYXJhbSBleHRyYUluZm8gb3B0aW9uYWwge0Bjb2RlIFN0cmluZ30gcHJvdmlkaW5nIGV4dHJhIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzdGF0ZSBjaGFuZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREZXRhaWxlZFN0YXRlKE5ldHdvcmtJbmZvLkRldGFpbGVkU3RhdGUgc3RhdGUsIFN0cmluZyByZWFzb24sIFN0cmluZyBleHRyYUluZm8pIHsKLSAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCAic2V0RGV0YWlsZWQgc3RhdGUsIG9sZCA9IittTmV0d29ya0luZm8uZ2V0RGV0YWlsZWRTdGF0ZSgpKyIgYW5kIG5ldyBzdGF0ZT0iK3N0YXRlKTsKLSAgICAgICAgaWYgKHN0YXRlICE9IG1OZXR3b3JrSW5mby5nZXREZXRhaWxlZFN0YXRlKCkpIHsKLSAgICAgICAgICAgIGJvb2xlYW4gd2FzQ29ubmVjdGluZyA9IChtTmV0d29ya0luZm8uZ2V0U3RhdGUoKSA9PSBOZXR3b3JrSW5mby5TdGF0ZS5DT05ORUNUSU5HKTsKLSAgICAgICAgICAgIFN0cmluZyBsYXN0UmVhc29uID0gbU5ldHdvcmtJbmZvLmdldFJlYXNvbigpOwotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIElmIGEgcmVhc29uIHdhcyBzdXBwbGllZCB3aGVuIHRoZSBDT05ORUNUSU5HIHN0YXRlIHdhcyBlbnRlcmVkLCBhbmQgbm8KLSAgICAgICAgICAgICAqIHJlYXNvbiB3YXMgc3VwcGxpZWQgZm9yIGVudGVyaW5nIHRoZSBDT05ORUNURUQgc3RhdGUsIHRoZW4gcmV0YWluIHRoZQotICAgICAgICAgICAgICogcmVhc29uIHRoYXQgd2FzIHN1cHBsaWVkIHdoZW4gZ29pbmcgdG8gQ09OTkVDVElORy4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYgKHdhc0Nvbm5lY3RpbmcgJiYgc3RhdGUgPT0gTmV0d29ya0luZm8uRGV0YWlsZWRTdGF0ZS5DT05ORUNURUQgJiYgcmVhc29uID09IG51bGwKLSAgICAgICAgICAgICAgICAgICAgJiYgbGFzdFJlYXNvbiAhPSBudWxsKQotICAgICAgICAgICAgICAgIHJlYXNvbiA9IGxhc3RSZWFzb247Ci0gICAgICAgICAgICBtTmV0d29ya0luZm8uc2V0RGV0YWlsZWRTdGF0ZShzdGF0ZSwgcmVhc29uLCBleHRyYUluZm8pOwotICAgICAgICAgICAgTWVzc2FnZSBtc2cgPSBtVGFyZ2V0Lm9idGFpbk1lc3NhZ2UoRVZFTlRfU1RBVEVfQ0hBTkdFRCwgbU5ldHdvcmtJbmZvKTsKLSAgICAgICAgICAgIG1zZy5zZW5kVG9UYXJnZXQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldERldGFpbGVkU3RhdGVJbnRlcm5hbChOZXR3b3JrSW5mby5EZXRhaWxlZFN0YXRlIHN0YXRlKSB7Ci0gICAgICAgIG1OZXR3b3JrSW5mby5zZXREZXRhaWxlZFN0YXRlKHN0YXRlLCBudWxsLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRUZWFyZG93blJlcXVlc3RlZChib29sZWFuIGlzUmVxdWVzdGVkKSB7Ci0gICAgICAgIG1UZWFyZG93blJlcXVlc3RlZCA9IGlzUmVxdWVzdGVkOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzVGVhcmRvd25SZXF1ZXN0ZWQoKSB7Ci0gICAgICAgIHJldHVybiBtVGVhcmRvd25SZXF1ZXN0ZWQ7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFNlbmQgYSAgbm90aWZpY2F0aW9uIHRoYXQgdGhlIHJlc3VsdHMgb2YgYSBzY2FuIGZvciBuZXR3b3JrIGFjY2VzcwotICAgICAqIHBvaW50cyBoYXMgY29tcGxldGVkLCBhbmQgcmVzdWx0cyBhcmUgYXZhaWxhYmxlLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNlbmRTY2FuUmVzdWx0c0F2YWlsYWJsZSgpIHsKLSAgICAgICAgTWVzc2FnZSBtc2cgPSBtVGFyZ2V0Lm9idGFpbk1lc3NhZ2UoRVZFTlRfU0NBTl9SRVNVTFRTX0FWQUlMQUJMRSwgbU5ldHdvcmtJbmZvKTsKLSAgICAgICAgbXNnLnNlbmRUb1RhcmdldCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlY29yZCB0aGUgcm9hbWluZyBzdGF0dXMgb2YgdGhlIGRldmljZSwgYW5kIGlmIGl0IGlzIGEgY2hhbmdlIGZyb20gdGhlIHByZXZpb3VzCi0gICAgICogc3RhdHVzLCBzZW5kIGEgbm90aWZpY2F0aW9uIHRvIGFueSBsaXN0ZW5lcnMuCi0gICAgICogQHBhcmFtIGlzUm9hbWluZyB7QGNvZGUgdHJ1ZX0gaWYgdGhlIGRldmljZSBpcyBub3cgcm9hbWluZywge0Bjb2RlIGZhbHNlfQotICAgICAqIGlmIGl0IGlzIG5vIGxvbmdlciByb2FtaW5nLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNldFJvYW1pbmdTdGF0dXMoYm9vbGVhbiBpc1JvYW1pbmcpIHsKLSAgICAgICAgaWYgKGlzUm9hbWluZyAhPSBtTmV0d29ya0luZm8uaXNSb2FtaW5nKCkpIHsKLSAgICAgICAgICAgIG1OZXR3b3JrSW5mby5zZXRSb2FtaW5nKGlzUm9hbWluZyk7Ci0gICAgICAgICAgICBNZXNzYWdlIG1zZyA9IG1UYXJnZXQub2J0YWluTWVzc2FnZShFVkVOVF9ST0FNSU5HX0NIQU5HRUQsIG1OZXR3b3JrSW5mbyk7Ci0gICAgICAgICAgICBtc2cuc2VuZFRvVGFyZ2V0KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRTdWJ0eXBlKGludCBzdWJ0eXBlLCBTdHJpbmcgc3VidHlwZU5hbWUpIHsKLSAgICAgICAgaWYgKG1OZXR3b3JrSW5mby5pc0Nvbm5lY3RlZCgpKSB7Ci0gICAgICAgICAgICBpbnQgb2xkU3VidHlwZSA9IG1OZXR3b3JrSW5mby5nZXRTdWJ0eXBlKCk7Ci0gICAgICAgICAgICBpZiAoc3VidHlwZSAhPSBvbGRTdWJ0eXBlKSB7Ci0gICAgICAgICAgICAgICAgbU5ldHdvcmtJbmZvLnNldFN1YnR5cGUoc3VidHlwZSwgc3VidHlwZU5hbWUpOwotICAgICAgICAgICAgICAgIE1lc3NhZ2UgbXNnID0gbVRhcmdldC5vYnRhaW5NZXNzYWdlKAotICAgICAgICAgICAgICAgICAgICAgICAgRVZFTlRfTkVUV09SS19TVUJUWVBFX0NIQU5HRUQsIG9sZFN1YnR5cGUsIDAsIG1OZXR3b3JrSW5mbyk7Ci0gICAgICAgICAgICAgICAgbXNnLnNlbmRUb1RhcmdldCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGFic3RyYWN0IHZvaWQgc3RhcnRNb25pdG9yaW5nKCk7CisgICAgcHVibGljIFN0cmluZyBnZXRUY3BCdWZmZXJTaXplc1Byb3BOYW1lKCk7CiAKICAgICAvKioKICAgICAgKiBEaXNhYmxlIGNvbm5lY3Rpdml0eSB0byBhIG5ldHdvcmsKICAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiBhIHRlYXJkb3duIG9jY3VycmVkLCB7QGNvZGUgZmFsc2V9IGlmIHRoZQogICAgICAqIHRlYXJkb3duIGRpZCBub3Qgb2NjdXIuCiAgICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gdGVhcmRvd24oKTsKKyAgICBwdWJsaWMgYm9vbGVhbiB0ZWFyZG93bigpOwogCiAgICAgLyoqCiAgICAgICogUmVlbmFibGUgY29ubmVjdGl2aXR5IHRvIGEgbmV0d29yayBhZnRlciBhIHtAbGluayAjdGVhcmRvd24oKX0uCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgd2UncmUgY29ubmVjdGVkIG9yIGV4cGVjdCB0byBiZSBjb25uZWN0ZWQKICAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiByZWNvbm5lY3QoKTsKKyAgICBwdWJsaWMgYm9vbGVhbiByZWNvbm5lY3QoKTsKIAogICAgIC8qKgogICAgICAqIFR1cm4gdGhlIHdpcmVsZXNzIHJhZGlvIG9mZiBmb3IgYSBuZXR3b3JrLgogICAgICAqIEBwYXJhbSB0dXJuT24ge0Bjb2RlIHRydWV9IHRvIHR1cm4gdGhlIHJhZGlvIG9uLCB7QGNvZGUgZmFsc2V9CiAgICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gc2V0UmFkaW8oYm9vbGVhbiB0dXJuT24pOworICAgIHB1YmxpYyBib29sZWFuIHNldFJhZGlvKGJvb2xlYW4gdHVybk9uKTsKIAogICAgIC8qKgogICAgICAqIFJldHVybnMgYW4gaW5kaWNhdGlvbiBvZiB3aGV0aGVyIHRoaXMgbmV0d29yayBpcyBhdmFpbGFibGUgZm9yCiAgICAgICogY29ubmVjdGlvbnMuIEEgdmFsdWUgb2Yge0Bjb2RlIGZhbHNlfSBtZWFucyB0aGF0IHNvbWUgcXVhc2ktcGVybWFuZW50CiAgICAgICogY29uZGl0aW9uIHByZXZlbnRzIGNvbm5lY3Rpdml0eSB0byB0aGlzIG5ldHdvcmsuCiAgICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNBdmFpbGFibGUoKTsKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0F2YWlsYWJsZSgpOworCisgICAgLyoqCisgICAgICogRmV0Y2ggZGVmYXVsdCBnYXRld2F5IGFkZHJlc3MgZm9yIHRoZSBuZXR3b3JrCisgICAgICovCisgICAgcHVibGljIGludCBnZXREZWZhdWx0R2F0ZXdheUFkZHIoKTsKIAogICAgIC8qKgogICAgICAqIFRlbGxzIHRoZSB1bmRlcmx5aW5nIG5ldHdvcmtpbmcgc3lzdGVtIHRoYXQgdGhlIGNhbGxlciB3YW50cyB0bwpAQCAtMzcyLDcgKzE0NCw3IEBACiAgICAgICogaW1wbGVtZW50YXRpb24rZmVhdHVyZSBjb21iaW5hdGlvbiwgZXhjZXB0IHRoYXQgdGhlIHZhbHVlIHtAY29kZSAtMX0KICAgICAgKiBhbHdheXMgaW5kaWNhdGVzIGZhaWx1cmUuCiAgICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IGludCBzdGFydFVzaW5nTmV0d29ya0ZlYXR1cmUoU3RyaW5nIGZlYXR1cmUsIGludCBjYWxsaW5nUGlkLCBpbnQgY2FsbGluZ1VpZCk7CisgICAgcHVibGljIGludCBzdGFydFVzaW5nTmV0d29ya0ZlYXR1cmUoU3RyaW5nIGZlYXR1cmUsIGludCBjYWxsaW5nUGlkLCBpbnQgY2FsbGluZ1VpZCk7CiAKICAgICAvKioKICAgICAgKiBUZWxscyB0aGUgdW5kZXJseWluZyBuZXR3b3JraW5nIHN5c3RlbSB0aGF0IHRoZSBjYWxsZXIgaXMgZmluaXNoZWQKQEAgLTM4NiwyMyArMTU4LDQzIEBACiAgICAgICogaW1wbGVtZW50YXRpb24rZmVhdHVyZSBjb21iaW5hdGlvbiwgZXhjZXB0IHRoYXQgdGhlIHZhbHVlIHtAY29kZSAtMX0KICAgICAgKiBhbHdheXMgaW5kaWNhdGVzIGZhaWx1cmUuCiAgICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IGludCBzdG9wVXNpbmdOZXR3b3JrRmVhdHVyZShTdHJpbmcgZmVhdHVyZSwgaW50IGNhbGxpbmdQaWQsIGludCBjYWxsaW5nVWlkKTsKKyAgICBwdWJsaWMgaW50IHN0b3BVc2luZ05ldHdvcmtGZWF0dXJlKFN0cmluZyBmZWF0dXJlLCBpbnQgY2FsbGluZ1BpZCwgaW50IGNhbGxpbmdVaWQpOwogCiAgICAgLyoqCi0gICAgICogRW5zdXJlIHRoYXQgYSBuZXR3b3JrIHJvdXRlIGV4aXN0cyB0byBkZWxpdmVyIHRyYWZmaWMgdG8gdGhlIHNwZWNpZmllZAotICAgICAqIGhvc3QgdmlhIHRoaXMgbmV0d29yayBpbnRlcmZhY2UuCi0gICAgICogQHBhcmFtIGhvc3RBZGRyZXNzIHRoZSBJUCBhZGRyZXNzIG9mIHRoZSBob3N0IHRvIHdoaWNoIHRoZSByb3V0ZSBpcyBkZXNpcmVkCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gb24gc3VjY2Vzcywge0Bjb2RlIGZhbHNlfSBvbiBmYWlsdXJlCisgICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAqIFN0b3JhZ2UgQVBJIHVzZWQgYnkgQ29ubmVjdGl2aXR5U2VydmljZSBmb3Igc2F2aW5nCisgICAgICogTmV0d29yayBzcGVjaWZpYyBpbmZvcm1hdGlvbi4KKyAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gcmVxdWVzdFJvdXRlVG9Ib3N0KGludCBob3N0QWRkcmVzcykgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQogCiAgICAgLyoqCi0gICAgICogSW50ZXJwcmV0cyBzY2FuIHJlc3VsdHMuIFRoaXMgd2lsbCBiZSBjYWxsZWQgYXQgYSBzYWZlIHRpbWUgZm9yCi0gICAgICogcHJvY2Vzc2luZywgYW5kIGZyb20gYSBzYWZlIHRocmVhZC4KKyAgICAgKiBDaGVjayBpZiBwcml2YXRlIEROUyByb3V0ZSBpcyBzZXQgZm9yIHRoZSBuZXR3b3JrCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgaW50ZXJwcmV0U2NhblJlc3VsdHNBdmFpbGFibGUoKSB7Ci0gICAgfQorICAgIHB1YmxpYyBib29sZWFuIGlzUHJpdmF0ZURuc1JvdXRlU2V0KCk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgYSBmbGFnIGluZGljYXRpbmcgcHJpdmF0ZSBETlMgcm91dGUgaXMgc2V0CisgICAgICovCisgICAgcHVibGljIHZvaWQgcHJpdmF0ZURuc1JvdXRlU2V0KGJvb2xlYW4gZW5hYmxlZCk7CisKKyAgICAvKioKKyAgICAgKiBDaGVjayBpZiBkZWZhdWx0IHJvdXRlIGlzIHNldAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzRGVmYXVsdFJvdXRlU2V0KCk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgYSBmbGFnIGluZGljYXRpbmcgZGVmYXVsdCByb3V0ZSBpcyBzZXQgZm9yIHRoZSBuZXR3b3JrCisgICAgICovCisgICAgcHVibGljIHZvaWQgZGVmYXVsdFJvdXRlU2V0KGJvb2xlYW4gZW5hYmxlZCk7CisKKyAgICAvKioKKyAgICAgKiBDaGVjayBpZiB0ZWFyIGRvd24gd2FzIHJlcXVlc3RlZAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzVGVhcmRvd25SZXF1ZXN0ZWQoKTsKKworICAgIC8qKgorICAgICAqIEluZGljYXRlIHRlYXIgZG93biByZXF1ZXN0ZWQgZnJvbSBjb25uZWN0aXZpdHkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUZWFyZG93blJlcXVlc3RlZChib29sZWFuIGlzUmVxdWVzdGVkKTsKIAogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvbmV0L05ldHdvcmtVdGlscy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L05ldHdvcmtVdGlscy5qYXZhCmluZGV4IGU0ZjNkNWMuLjU2NGJjMWYgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL25ldC9OZXR3b3JrVXRpbHMuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvTmV0d29ya1V0aWxzLmphdmEKQEAgLTMyLDEzICszMiwzNyBAQAogICAgIHB1YmxpYyBuYXRpdmUgc3RhdGljIGludCBkaXNhYmxlSW50ZXJmYWNlKFN0cmluZyBpbnRlcmZhY2VOYW1lKTsKIAogICAgIC8qKiBBZGQgYSByb3V0ZSB0byB0aGUgc3BlY2lmaWVkIGhvc3QgdmlhIHRoZSBuYW1lZCBpbnRlcmZhY2UuICovCi0gICAgcHVibGljIG5hdGl2ZSBzdGF0aWMgaW50IGFkZEhvc3RSb3V0ZShTdHJpbmcgaW50ZXJmYWNlTmFtZSwgaW50IGhvc3RhZGRyKTsKKyAgICBwdWJsaWMgc3RhdGljIGludCBhZGRIb3N0Um91dGUoU3RyaW5nIGludGVyZmFjZU5hbWUsIEluZXRBZGRyZXNzIGhvc3RhZGRyKSB7CisgICAgICAgIGludCB2NEludCA9IHY0U3RyaW5nVG9JbnQoaG9zdGFkZHIuZ2V0SG9zdEFkZHJlc3MoKSk7CisgICAgICAgIGlmICh2NEludCAhPSAwKSB7CisgICAgICAgICAgICByZXR1cm4gYWRkSG9zdFJvdXRlTmF0aXZlKGludGVyZmFjZU5hbWUsIHY0SW50KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KKyAgICBwcml2YXRlIG5hdGl2ZSBzdGF0aWMgaW50IGFkZEhvc3RSb3V0ZU5hdGl2ZShTdHJpbmcgaW50ZXJmYWNlTmFtZSwgaW50IGhvc3RhZGRyKTsKIAogICAgIC8qKiBBZGQgYSBkZWZhdWx0IHJvdXRlIGZvciB0aGUgbmFtZWQgaW50ZXJmYWNlLiAqLwotICAgIHB1YmxpYyBuYXRpdmUgc3RhdGljIGludCBzZXREZWZhdWx0Um91dGUoU3RyaW5nIGludGVyZmFjZU5hbWUsIGludCBnd2F5QWRkcik7CisgICAgcHVibGljIHN0YXRpYyBpbnQgc2V0RGVmYXVsdFJvdXRlKFN0cmluZyBpbnRlcmZhY2VOYW1lLCBJbmV0QWRkcmVzcyBnd2F5QWRkcikgeworICAgICAgICBpbnQgdjRJbnQgPSB2NFN0cmluZ1RvSW50KGd3YXlBZGRyLmdldEhvc3RBZGRyZXNzKCkpOworICAgICAgICBpZiAodjRJbnQgIT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIHNldERlZmF1bHRSb3V0ZU5hdGl2ZShpbnRlcmZhY2VOYW1lLCB2NEludCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CisgICAgcHJpdmF0ZSBuYXRpdmUgc3RhdGljIGludCBzZXREZWZhdWx0Um91dGVOYXRpdmUoU3RyaW5nIGludGVyZmFjZU5hbWUsIGludCBob3N0YWRkcik7CiAKICAgICAvKiogUmV0dXJuIHRoZSBnYXRld2F5IGFkZHJlc3MgZm9yIHRoZSBkZWZhdWx0IHJvdXRlIGZvciB0aGUgbmFtZWQgaW50ZXJmYWNlLiAqLwotICAgIHB1YmxpYyBuYXRpdmUgc3RhdGljIGludCBnZXREZWZhdWx0Um91dGUoU3RyaW5nIGludGVyZmFjZU5hbWUpOworICAgIHB1YmxpYyBzdGF0aWMgSW5ldEFkZHJlc3MgZ2V0RGVmYXVsdFJvdXRlKFN0cmluZyBpbnRlcmZhY2VOYW1lKSB7CisgICAgICAgIGludCBhZGRyID0gZ2V0RGVmYXVsdFJvdXRlTmF0aXZlKGludGVyZmFjZU5hbWUpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIEluZXRBZGRyZXNzLmdldEJ5QWRkcmVzcyh2NEludFRvQXJyYXkoYWRkcikpOworICAgICAgICB9IGNhdGNoIChVbmtub3duSG9zdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKyAgICBwcml2YXRlIG5hdGl2ZSBzdGF0aWMgaW50IGdldERlZmF1bHRSb3V0ZU5hdGl2ZShTdHJpbmcgaW50ZXJmYWNlTmFtZSk7CiAKICAgICAvKiogUmVtb3ZlIGhvc3Qgcm91dGVzIHRoYXQgdXNlcyB0aGUgbmFtZWQgaW50ZXJmYWNlLiAqLwogICAgIHB1YmxpYyBuYXRpdmUgc3RhdGljIGludCByZW1vdmVIb3N0Um91dGVzKFN0cmluZyBpbnRlcmZhY2VOYW1lKTsKQEAgLTEwNSwyOCArMTI5LDE2IEBACiAgICAgcHJpdmF0ZSBuYXRpdmUgc3RhdGljIGJvb2xlYW4gY29uZmlndXJlTmF0aXZlKAogICAgICAgICBTdHJpbmcgaW50ZXJmYWNlTmFtZSwgaW50IGlwQWRkcmVzcywgaW50IG5ldG1hc2ssIGludCBnYXRld2F5LCBpbnQgZG5zMSwgaW50IGRuczIpOwogCi0gICAgLyoqCi0gICAgICogTG9vayB1cCBhIGhvc3QgbmFtZSBhbmQgcmV0dXJuIHRoZSByZXN1bHQgYXMgYW4gaW50LiBXb3JrcyBpZiB0aGUgYXJndW1lbnQKLSAgICAgKiBpcyBhbiBJUCBhZGRyZXNzIGluIGRvdCBub3RhdGlvbi4gT2J2aW91c2x5LCB0aGlzIGNhbiBvbmx5IGJlIHVzZWQgZm9yIElQdjQKLSAgICAgKiBhZGRyZXNzZXMuCi0gICAgICogQHBhcmFtIGhvc3RuYW1lIHRoZSBuYW1lIG9mIHRoZSBob3N0IChvciB0aGUgSVAgYWRkcmVzcykKLSAgICAgKiBAcmV0dXJuIHRoZSBJUCBhZGRyZXNzIGFzIGFuIHtAY29kZSBpbnR9IGluIG5ldHdvcmsgYnl0ZSBvcmRlcgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgaW50IGxvb2t1cEhvc3QoU3RyaW5nIGhvc3RuYW1lKSB7Ci0gICAgICAgIEluZXRBZGRyZXNzIGluZXRBZGRyZXNzOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaW5ldEFkZHJlc3MgPSBJbmV0QWRkcmVzcy5nZXRCeU5hbWUoaG9zdG5hbWUpOwotICAgICAgICB9IGNhdGNoIChVbmtub3duSG9zdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgYnl0ZVtdIGFkZHJCeXRlczsKLSAgICAgICAgaW50IGFkZHI7Ci0gICAgICAgIGFkZHJCeXRlcyA9IGluZXRBZGRyZXNzLmdldEFkZHJlc3MoKTsKLSAgICAgICAgYWRkciA9ICgoYWRkckJ5dGVzWzNdICYgMHhmZikgPDwgMjQpCi0gICAgICAgICAgICAgICAgfCAoKGFkZHJCeXRlc1syXSAmIDB4ZmYpIDw8IDE2KQotICAgICAgICAgICAgICAgIHwgKChhZGRyQnl0ZXNbMV0gJiAweGZmKSA8PCA4KQotICAgICAgICAgICAgICAgIHwgIChhZGRyQnl0ZXNbMF0gJiAweGZmKTsKLSAgICAgICAgcmV0dXJuIGFkZHI7CisgICAgLy8gVGhlIGZvbGxvd2luZyB0d28gZnVuY3Rpb25zIGFyZSBnbHVlIHRvIHRpZSB0aGUgb2xkIGludC1iYXNlZCBhZGRyZXNzIHNjaGVtZQorICAgIC8vIHRvIHRoZSBuZXcgSW5ldEFkZHJlc3Mgc2NoZW1lLiAgVGhleSBzaG91bGQgZ28gYXdheSB3aGVuIHdlIGdvIGZ1bGx5IHRvIEluZXRBZGRyZXNzCisgICAgLy8gVE9ETyAtIHJlbW92ZSB3aGVuIHdlIHN3aXRjaCBmdWxseSB0byBJbmV0QWRkcmVzcworICAgIHB1YmxpYyBzdGF0aWMgYnl0ZVtdIHY0SW50VG9BcnJheShpbnQgYWRkcikgeworICAgICAgICBieXRlW10gYWRkckJ5dGVzID0gbmV3IGJ5dGVbNF07CisgICAgICAgIGFkZHJCeXRlc1swXSA9IChieXRlKShhZGRyICYgMHhmZik7CisgICAgICAgIGFkZHJCeXRlc1sxXSA9IChieXRlKSgoYWRkciA+PiA4KSAmIDB4ZmYpOworICAgICAgICBhZGRyQnl0ZXNbMl0gPSAoYnl0ZSkoKGFkZHIgPj4gMTYpICYgMHhmZik7CisgICAgICAgIGFkZHJCeXRlc1szXSA9IChieXRlKSgoYWRkciA+PiAyNCkgJiAweGZmKTsKKyAgICAgICAgcmV0dXJuIGFkZHJCeXRlczsKICAgICB9CiAKICAgICBwdWJsaWMgc3RhdGljIGludCB2NFN0cmluZ1RvSW50KFN0cmluZyBzdHIpIHsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL25ldC9Qcm94eS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L1Byb3h5LmphdmEKaW5kZXggMjJjMzBhNS4uZTJlNGQyYyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvbmV0L1Byb3h5LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L1Byb3h5LmphdmEKQEAgLTE2LDMyICsxNiwxNjIgQEAKIAogcGFja2FnZSBhbmRyb2lkLm5ldDsKIAotaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5IdHRwSG9zdDsKLQogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5Db250ZW50T2JzZXJ2ZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwogaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtUHJvcGVydGllczsKIGltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKIGltcG9ydCBqYXZhLm5ldC5JbmV0QWRkcmVzczsKK2ltcG9ydCBqYXZhLm5ldC5JbmV0U29ja2V0QWRkcmVzczsKK2ltcG9ydCBqYXZhLm5ldC5Tb2NrZXRBZGRyZXNzOwogaW1wb3J0IGphdmEubmV0LlVSSTsKIGltcG9ydCBqYXZhLm5ldC5Vbmtub3duSG9zdEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5SZWFkV3JpdGVMb2NrOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLlJlZW50cmFudFJlYWRXcml0ZUxvY2s7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CiAKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0OwogCitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLkh0dHBIb3N0OworCiAvKioKICAqIEEgY29udmVuaWVuY2UgY2xhc3MgZm9yIGFjY2Vzc2luZyB0aGUgdXNlciBhbmQgZGVmYXVsdCBwcm94eQogICogc2V0dGluZ3MuCiAgKi8KLWZpbmFsIHB1YmxpYyBjbGFzcyBQcm94eSB7CitwdWJsaWMgZmluYWwgY2xhc3MgUHJveHkgewogCiAgICAgLy8gU2V0IHRvIHRydWUgdG8gZW5hYmxlIGV4dHJhIGRlYnVnZ2luZy4KLSAgICBzdGF0aWMgZmluYWwgcHJpdmF0ZSBib29sZWFuIERFQlVHID0gZmFsc2U7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IGZhbHNlOwogCi0gICAgc3RhdGljIGZpbmFsIHB1YmxpYyBTdHJpbmcgUFJPWFlfQ0hBTkdFX0FDVElPTiA9CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPWFlfQ0hBTkdFX0FDVElPTiA9CiAgICAgICAgICJhbmRyb2lkLmludGVudC5hY3Rpb24uUFJPWFlfQ0hBTkdFIjsKIAorICAgIHByaXZhdGUgc3RhdGljIFJlYWRXcml0ZUxvY2sgc1Byb3h5SW5mb0xvY2sgPSBuZXcgUmVlbnRyYW50UmVhZFdyaXRlTG9jaygpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgU2V0dGluZ3NPYnNlcnZlciBzR2xvYmFsUHJveHlDaGFuZ2VkT2JzZXJ2ZXIgPSBudWxsOworCisgICAgcHJpdmF0ZSBzdGF0aWMgUHJveHlTcGVjIHNHbG9iYWxQcm94eVNwZWMgPSBudWxsOworCisgICAgLy8gSG9zdG5hbWUgLyBJUCBSRUdFWCB2YWxpZGF0aW9uCisgICAgLy8gTWF0Y2hlcyBibGFuayBpbnB1dCwgaXBzLCBhbmQgZG9tYWluIG5hbWVzCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfSVBfUkVHRVggPQorICAgICAgICAiW2EtekEtWjAtOV0rKFxcLVthLXpBLVowLTldKykqKFxcLlthLXpBLVowLTldKyhcXC1bYS16QS1aMC05XSspKikqIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIT1NUTkFNRV9SRUdFWFAgPSAiXiR8XiIgKyBOQU1FX0lQX1JFR0VYICsgIiQiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBIT1NUTkFNRV9QQVRURVJOOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYQ0xMSVNUX1JFR0VYUCA9ICIkfF4oLj8iICsgTkFNRV9JUF9SRUdFWAorICAgICAgICArICIpKygsKC4/IiArIE5BTUVfSVBfUkVHRVggKyAiKSkqJCI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIEVYQ0xMSVNUX1BBVFRFUk47CisKKyAgICBzdGF0aWMgeworICAgICAgICBIT1NUTkFNRV9QQVRURVJOID0gUGF0dGVybi5jb21waWxlKEhPU1ROQU1FX1JFR0VYUCk7CisgICAgICAgIEVYQ0xMSVNUX1BBVFRFUk4gPSBQYXR0ZXJuLmNvbXBpbGUoRVhDTExJU1RfUkVHRVhQKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBQcm94eVNwZWMgeworICAgICAgICBTdHJpbmdbXSBleGNsdXNpb25MaXN0ID0gbnVsbDsKKyAgICAgICAgSW5ldFNvY2tldEFkZHJlc3MgcHJveHlBZGRyZXNzID0gbnVsbDsKKyAgICAgICAgcHVibGljIFByb3h5U3BlYygpIHsgfTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzVVJMSW5FeGNsdXNpb25MaXN0UmVhZExvY2tlZChTdHJpbmcgdXJsLCBTdHJpbmdbXSBleGNsdXNpb25MaXN0KSB7CisgICAgICAgIGlmIChleGNsdXNpb25MaXN0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBVcmkgdSA9IFVyaS5wYXJzZSh1cmwpOworICAgICAgICBTdHJpbmcgdXJsRG9tYWluID0gdS5nZXRIb3N0KCk7CisgICAgICAgIC8vIElmIHRoZSBkb21haW4gaXMgZGVmaW5lZCBhcyAiLmFuZHJvaWQuY29tIiBvciAiYW5kcm9pZC5jb20iLCB3ZSB3aXNoIHRvIG1hdGNoCisgICAgICAgIC8vIGh0dHA6Ly9hbmRyb2lkLmNvbSBhcyB3ZWxsIGFzIGh0dHA6Ly94eHguYW5kcm9pZC5jb20gLCBidXQgbm90CisgICAgICAgIC8vIGh0dHA6Ly9teWFuZHJvaWQuY29tIC4gVGhpcyBjb2RlIHdvcmtzIG91dCB0aGUgbG9naWMuCisgICAgICAgIGZvciAoU3RyaW5nIGV4Y2x1ZGVkRG9tYWluIDogZXhjbHVzaW9uTGlzdCkgeworICAgICAgICAgICAgU3RyaW5nIGRvdERvbWFpbiA9ICIuIiArIGV4Y2x1ZGVkRG9tYWluOworICAgICAgICAgICAgaWYgKHVybERvbWFpbi5lcXVhbHMoZXhjbHVkZWREb21haW4pKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodXJsRG9tYWluLmVuZHNXaXRoKGRvdERvbWFpbikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBObyBtYXRjaAorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHBhcnNlSG9zdChTdHJpbmcgcHJveHlTcGVjKSB7CisgICAgICAgIGludCBpID0gcHJveHlTcGVjLmluZGV4T2YoJzonKTsKKyAgICAgICAgaWYgKGkgPT0gLTEpIHsKKyAgICAgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKHByb3h5U3BlYy5sZW5ndGgoKSA9PSAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIHJldHVybiBwcm94eVNwZWMuc3Vic3RyaW5nKDAsIGkpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGludCBwYXJzZVBvcnQoU3RyaW5nIHByb3h5U3BlYykgeworICAgICAgICBpbnQgaSA9IHByb3h5U3BlYy5pbmRleE9mKCc6Jyk7CisgICAgICAgIGlmIChpID09IC0xKSB7CisgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShwcm94eVNwZWMubGVuZ3RoKCkgPT0gMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShpIDwgcHJveHlTcGVjLmxlbmd0aCgpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gSW50ZWdlci5wYXJzZUludChwcm94eVNwZWMuc3Vic3RyaW5nKGkrMSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcHJveHkgb2JqZWN0IHRvIGJlIHVzZWQgZm9yIHRoZSBVUkwgZ2l2ZW4gYXMgcGFyYW1ldGVyLgorICAgICAqIEBwYXJhbSBjdHggQSBDb250ZXh0IHVzZWQgdG8gZ2V0IHRoZSBzZXR0aW5ncyBmb3IgdGhlIHByb3h5IGhvc3QuCisgICAgICogQHBhcmFtIHVybCBBIFVSTCB0byBiZSBhY2Nlc3NlZC4gVXNlZCB0byBldmFsdWF0ZSBleGNsdXNpb24gbGlzdC4KKyAgICAgKiBAcmV0dXJuIFByb3h5IChqYXZhLm5ldCkgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGhvc3QgbmFtZS4gSWYgdGhlCisgICAgICogICAgICAgICB1c2VyIGRpZCBub3Qgc2V0IGEgaG9zdG5hbWUgaXQgcmV0dXJucyB0aGUgZGVmYXVsdCBob3N0LgorICAgICAqICAgICAgICAgQSBudWxsIHZhbHVlIG1lYW5zIHRoYXQgbm8gaG9zdCBpcyB0byBiZSB1c2VkLgorICAgICAqIHtAaGlkZX0KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubmV0LlByb3h5IGdldFByb3h5KENvbnRleHQgY3R4LCBTdHJpbmcgdXJsKSB7CisgICAgICAgIHNQcm94eUluZm9Mb2NrLnJlYWRMb2NrKCkubG9jaygpOworICAgICAgICBqYXZhLm5ldC5Qcm94eSByZXR2YWw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoc0dsb2JhbFByb3h5Q2hhbmdlZE9ic2VydmVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZWdpc3RlckNvbnRlbnRPYnNlcnZlcnNSZWFkTG9ja2VkKGN0eCk7CisgICAgICAgICAgICAgICAgcGFyc2VHbG9iYWxQcm94eUluZm9SZWFkTG9ja2VkKGN0eCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc0dsb2JhbFByb3h5U3BlYyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgLy8gUHJveHkgZGVmaW5lZCAtIEFwcGx5IGV4Y2x1c2lvbiBydWxlcworICAgICAgICAgICAgICAgIGlmIChpc1VSTEluRXhjbHVzaW9uTGlzdFJlYWRMb2NrZWQodXJsLCBzR2xvYmFsUHJveHlTcGVjLmV4Y2x1c2lvbkxpc3QpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFJldHVybiBubyBwcm94eQorICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSBqYXZhLm5ldC5Qcm94eS5OT19QUk9YWTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICByZXR2YWwgPQorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IGphdmEubmV0LlByb3h5KGphdmEubmV0LlByb3h5LlR5cGUuSFRUUCwgc0dsb2JhbFByb3h5U3BlYy5wcm94eUFkZHJlc3MpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gSWYgbmV0d29yayBpcyBXaUZpLCByZXR1cm4gbm8gcHJveHkuCisgICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCByZXR1cm4gdGhlIE1vYmlsZSBPcGVyYXRvciBwcm94eS4KKyAgICAgICAgICAgICAgICBpZiAoIWlzTmV0d29ya1dpZmkoY3R4KSkgeworICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSBnZXREZWZhdWx0UHJveHkodXJsKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSBqYXZhLm5ldC5Qcm94eS5OT19QUk9YWTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBzUHJveHlJbmZvTG9jay5yZWFkTG9jaygpLnVubG9jaygpOworICAgICAgICB9CisgICAgICAgIGlmICgocmV0dmFsICE9IGphdmEubmV0LlByb3h5Lk5PX1BST1hZKSAmJiAoaXNMb2NhbEhvc3QodXJsKSkpIHsKKyAgICAgICAgICAgIHJldHZhbCA9IGphdmEubmV0LlByb3h5Lk5PX1BST1hZOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXR2YWw7CisgICAgfQorCisgICAgLy8gVE9ETzogZGVwcmVjYXRlIHRoaXMgZnVuY3Rpb24KICAgICAvKioKICAgICAgKiBSZXR1cm4gdGhlIHByb3h5IGhvc3Qgc2V0IGJ5IHRoZSB1c2VyLgogICAgICAqIEBwYXJhbSBjdHggQSBDb250ZXh0IHVzZWQgdG8gZ2V0IHRoZSBzZXR0aW5ncyBmb3IgdGhlIHByb3h5IGhvc3QuCkBAIC00OSw2MCArMTc5LDU1IEBACiAgICAgICogICAgICAgICBuYW1lIGl0IHJldHVybnMgdGhlIGRlZmF1bHQgaG9zdC4gQSBudWxsIHZhbHVlIG1lYW5zIHRoYXQgbm8KICAgICAgKiAgICAgICAgIGhvc3QgaXMgdG8gYmUgdXNlZC4KICAgICAgKi8KLSAgICBzdGF0aWMgZmluYWwgcHVibGljIFN0cmluZyBnZXRIb3N0KENvbnRleHQgY3R4KSB7Ci0gICAgICAgIENvbnRlbnRSZXNvbHZlciBjb250ZW50UmVzb2x2ZXIgPSBjdHguZ2V0Q29udGVudFJlc29sdmVyKCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKGNvbnRlbnRSZXNvbHZlcik7Ci0gICAgICAgIFN0cmluZyBob3N0ID0gU2V0dGluZ3MuU2VjdXJlLmdldFN0cmluZygKLSAgICAgICAgICAgICAgICBjb250ZW50UmVzb2x2ZXIsCi0gICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLkhUVFBfUFJPWFkpOwotICAgICAgICBpZiAoaG9zdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbnQgaSA9IGhvc3QuaW5kZXhPZignOicpOwotICAgICAgICAgICAgaWYgKGkgPT0gLTEpIHsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoaG9zdC5sZW5ndGgoKSA9PSAwKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZ2V0SG9zdChDb250ZXh0IGN0eCkgeworICAgICAgICBzUHJveHlJbmZvTG9jay5yZWFkTG9jaygpLmxvY2soKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChzR2xvYmFsUHJveHlDaGFuZ2VkT2JzZXJ2ZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJlZ2lzdGVyQ29udGVudE9ic2VydmVyc1JlYWRMb2NrZWQoY3R4KTsKKyAgICAgICAgICAgICAgICBwYXJzZUdsb2JhbFByb3h5SW5mb1JlYWRMb2NrZWQoY3R4KTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBob3N0LnN1YnN0cmluZygwLCBpKTsKKyAgICAgICAgICAgIGlmIChzR2xvYmFsUHJveHlTcGVjICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBJbmV0U29ja2V0QWRkcmVzcyBzYSA9IHNHbG9iYWxQcm94eVNwZWMucHJveHlBZGRyZXNzOworICAgICAgICAgICAgICAgIHJldHVybiBzYS5nZXRIb3N0TmFtZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGdldERlZmF1bHRIb3N0KCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBzUHJveHlJbmZvTG9jay5yZWFkTG9jaygpLnVubG9jaygpOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBnZXREZWZhdWx0SG9zdCgpOwogICAgIH0KIAorICAgIC8vIFRPRE86IGRlcHJlY2F0ZSB0aGlzIGZ1bmN0aW9uCiAgICAgLyoqCiAgICAgICogUmV0dXJuIHRoZSBwcm94eSBwb3J0IHNldCBieSB0aGUgdXNlci4KICAgICAgKiBAcGFyYW0gY3R4IEEgQ29udGV4dCB1c2VkIHRvIGdldCB0aGUgc2V0dGluZ3MgZm9yIHRoZSBwcm94eSBwb3J0LgogICAgICAqIEByZXR1cm4gVGhlIHBvcnQgbnVtYmVyIHRvIHVzZSBvciAtMSBpZiBubyBwcm94eSBpcyB0byBiZSB1c2VkLgogICAgICAqLwotICAgIHN0YXRpYyBmaW5hbCBwdWJsaWMgaW50IGdldFBvcnQoQ29udGV4dCBjdHgpIHsKLSAgICAgICAgQ29udGVudFJlc29sdmVyIGNvbnRlbnRSZXNvbHZlciA9IGN0eC5nZXRDb250ZW50UmVzb2x2ZXIoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydE5vdE51bGwoY29udGVudFJlc29sdmVyKTsKLSAgICAgICAgU3RyaW5nIGhvc3QgPSBTZXR0aW5ncy5TZWN1cmUuZ2V0U3RyaW5nKAotICAgICAgICAgICAgICAgIGNvbnRlbnRSZXNvbHZlciwKLSAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuSFRUUF9QUk9YWSk7Ci0gICAgICAgIGlmIChob3N0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGludCBpID0gaG9zdC5pbmRleE9mKCc6Jyk7Ci0gICAgICAgICAgICBpZiAoaSA9PSAtMSkgewotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShob3N0Lmxlbmd0aCgpID09IDApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZ2V0UG9ydChDb250ZXh0IGN0eCkgeworICAgICAgICBzUHJveHlJbmZvTG9jay5yZWFkTG9jaygpLmxvY2soKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChzR2xvYmFsUHJveHlDaGFuZ2VkT2JzZXJ2ZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJlZ2lzdGVyQ29udGVudE9ic2VydmVyc1JlYWRMb2NrZWQoY3R4KTsKKyAgICAgICAgICAgICAgICBwYXJzZUdsb2JhbFByb3h5SW5mb1JlYWRMb2NrZWQoY3R4KTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKGkgPCBob3N0Lmxlbmd0aCgpKTsKKyAgICAgICAgICAgIGlmIChzR2xvYmFsUHJveHlTcGVjICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBJbmV0U29ja2V0QWRkcmVzcyBzYSA9IHNHbG9iYWxQcm94eVNwZWMucHJveHlBZGRyZXNzOworICAgICAgICAgICAgICAgIHJldHVybiBzYS5nZXRQb3J0KCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gSW50ZWdlci5wYXJzZUludChob3N0LnN1YnN0cmluZyhpKzEpKTsKKyAgICAgICAgICAgIHJldHVybiBnZXREZWZhdWx0UG9ydCgpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgc1Byb3h5SW5mb0xvY2sucmVhZExvY2soKS51bmxvY2soKTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gZ2V0RGVmYXVsdFBvcnQoKTsKICAgICB9CiAKKyAgICAvLyBUT0RPOiBkZXByZWNhdGUgdGhpcyBmdW5jdGlvbgogICAgIC8qKgogICAgICAqIFJldHVybiB0aGUgZGVmYXVsdCBwcm94eSBob3N0IHNwZWNpZmllZCBieSB0aGUgY2Fycmllci4KICAgICAgKiBAcmV0dXJuIFN0cmluZyBjb250YWluaW5nIHRoZSBob3N0IG5hbWUgb3IgbnVsbCBpZiB0aGVyZSBpcyBubyBwcm94eSBmb3IKICAgICAgKiB0aGlzIGNhcnJpZXIuCiAgICAgICovCi0gICAgc3RhdGljIGZpbmFsIHB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdEhvc3QoKSB7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZ2V0RGVmYXVsdEhvc3QoKSB7CiAgICAgICAgIFN0cmluZyBob3N0ID0gU3lzdGVtUHJvcGVydGllcy5nZXQoIm5ldC5ncHJzLmh0dHAtcHJveHkiKTsKLSAgICAgICAgaWYgKGhvc3QgIT0gbnVsbCkgeworICAgICAgICBpZiAoKGhvc3QgIT0gbnVsbCkgJiYgKGhvc3QubGVuZ3RoKCkgIT0gMCkpIHsKICAgICAgICAgICAgIFVyaSB1ID0gVXJpLnBhcnNlKGhvc3QpOwogICAgICAgICAgICAgaG9zdCA9IHUuZ2V0SG9zdCgpOwogICAgICAgICAgICAgcmV0dXJuIGhvc3Q7CkBAIC0xMTEsMTQgKzIzNiwxNSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgLy8gVE9ETzogZGVwcmVjYXRlIHRoaXMgZnVuY3Rpb24KICAgICAvKioKICAgICAgKiBSZXR1cm4gdGhlIGRlZmF1bHQgcHJveHkgcG9ydCBzcGVjaWZpZWQgYnkgdGhlIGNhcnJpZXIuCiAgICAgICogQHJldHVybiBUaGUgcG9ydCBudW1iZXIgdG8gYmUgdXNlZCB3aXRoIHRoZSBwcm94eSBob3N0IG9yIC0xIGlmIHRoZXJlIGlzCiAgICAgICogbm8gcHJveHkgZm9yIHRoaXMgY2Fycmllci4KICAgICAgKi8KLSAgICBzdGF0aWMgZmluYWwgcHVibGljIGludCBnZXREZWZhdWx0UG9ydCgpIHsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBnZXREZWZhdWx0UG9ydCgpIHsKICAgICAgICAgU3RyaW5nIGhvc3QgPSBTeXN0ZW1Qcm9wZXJ0aWVzLmdldCgibmV0LmdwcnMuaHR0cC1wcm94eSIpOwotICAgICAgICBpZiAoaG9zdCAhPSBudWxsKSB7CisgICAgICAgIGlmICgoaG9zdCAhPSBudWxsKSAmJiAoaG9zdC5sZW5ndGgoKSAhPSAwKSkgewogICAgICAgICAgICAgVXJpIHUgPSBVcmkucGFyc2UoaG9zdCk7CiAgICAgICAgICAgICByZXR1cm4gdS5nZXRQb3J0KCk7CiAgICAgICAgIH0gZWxzZSB7CkBAIC0xMjYsNiArMjUyLDIwIEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLm5ldC5Qcm94eSBnZXREZWZhdWx0UHJveHkoU3RyaW5nIHVybCkgeworICAgICAgICAvLyBUT0RPOiBUaGlzIHdpbGwgZ28gYXdheSB3aGVuIGluZm9ybWF0aW9uIGlzIGNvbGxlY3RlZCBmcm9tIENvbm5lY3Rpdml0eU1hbmFnZXIuLi4KKyAgICAgICAgLy8gVGhlcmUgYXJlIGJyb2FkY2FzdCBvZiBuZXR3b3JrIHByb3hpZXMsIHNvIHRoZXkgYXJlIHBhcnNlIG1hbnVhbGx5LgorICAgICAgICBTdHJpbmcgaG9zdCA9IFN5c3RlbVByb3BlcnRpZXMuZ2V0KCJuZXQuZ3Bycy5odHRwLXByb3h5Iik7CisgICAgICAgIGlmICgoaG9zdCAhPSBudWxsKSAmJiAoaG9zdC5sZW5ndGgoKSAhPSAwKSkgeworICAgICAgICAgICAgVXJpIHUgPSBVcmkucGFyc2UoaG9zdCk7CisgICAgICAgICAgICByZXR1cm4gbmV3IGphdmEubmV0LlByb3h5KGphdmEubmV0LlByb3h5LlR5cGUuSFRUUCwKKyAgICAgICAgICAgICAgICAgICAgbmV3IEluZXRTb2NrZXRBZGRyZXNzKHUuZ2V0SG9zdCgpLCB1LmdldFBvcnQoKSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGphdmEubmV0LlByb3h5Lk5PX1BST1hZOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gVE9ETzogcmVtb3ZlIHRoaXMgZnVuY3Rpb24gLyBkZXByZWNhdGUKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBwcmVmZXJyZWQgcHJveHkgdG8gYmUgdXNlZCBieSBjbGllbnRzLiBUaGlzIGlzIGEgd3JhcHBlcgogICAgICAqIGFyb3VuZCB7QGxpbmsgYW5kcm9pZC5uZXQuUHJveHkjZ2V0SG9zdCgpfS4gQ3VycmVudGx5IG5vIHByb3h5IHdpbGwKQEAgLTEzOCwyNiArMjc4LDIzIEBACiAgICAgICogYW5kcm9pZC5wZXJtaXNzaW9uLkFDQ0VTU19ORVRXT1JLX1NUQVRFCiAgICAgICogQHJldHVybiBUaGUgcHJlZmVycmVkIHByb3h5IHRvIGJlIHVzZWQgYnkgY2xpZW50cywgb3IgbnVsbCBpZiB0aGVyZQogICAgICAqIGlzIG5vIHByb3h5LgotICAgICAqCiAgICAgICoge0BoaWRlfQogICAgICAqLwotICAgIHN0YXRpYyBmaW5hbCBwdWJsaWMgSHR0cEhvc3QgZ2V0UHJlZmVycmVkSHR0cEhvc3QoQ29udGV4dCBjb250ZXh0LAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgSHR0cEhvc3QgZ2V0UHJlZmVycmVkSHR0cEhvc3QoQ29udGV4dCBjb250ZXh0LAogICAgICAgICAgICAgU3RyaW5nIHVybCkgewotICAgICAgICBpZiAoIWlzTG9jYWxIb3N0KHVybCkgJiYgIWlzTmV0d29ya1dpZmkoY29udGV4dCkpIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwcm94eUhvc3QgPSBQcm94eS5nZXRIb3N0KGNvbnRleHQpOwotICAgICAgICAgICAgaWYgKHByb3h5SG9zdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBIdHRwSG9zdChwcm94eUhvc3QsIFByb3h5LmdldFBvcnQoY29udGV4dCksICJodHRwIik7Ci0gICAgICAgICAgICB9CisgICAgICAgIGphdmEubmV0LlByb3h5IHByZWZQcm94eSA9IGdldFByb3h5KGNvbnRleHQsIHVybCk7CisgICAgICAgIGlmIChwcmVmUHJveHkuZXF1YWxzKGphdmEubmV0LlByb3h5Lk5PX1BST1hZKSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBJbmV0U29ja2V0QWRkcmVzcyBzYSA9IChJbmV0U29ja2V0QWRkcmVzcylwcmVmUHJveHkuYWRkcmVzcygpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBIdHRwSG9zdChzYS5nZXRIb3N0TmFtZSgpLCBzYS5nZXRQb3J0KCksICJodHRwIik7CiAgICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CiAKLSAgICBzdGF0aWMgZmluYWwgcHJpdmF0ZSBib29sZWFuIGlzTG9jYWxIb3N0KFN0cmluZyB1cmwpIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIGlzTG9jYWxIb3N0KFN0cmluZyB1cmwpIHsKICAgICAgICAgaWYgKHVybCA9PSBudWxsKSB7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KLQogICAgICAgICB0cnkgewogICAgICAgICAgICAgZmluYWwgVVJJIHVyaSA9IFVSSS5jcmVhdGUodXJsKTsKICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBob3N0ID0gdXJpLmdldEhvc3QoKTsKQEAgLTE3NCwxNSArMzExLDEzIEBACiAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZXgpIHsKICAgICAgICAgICAgIC8vIElnbm9yZSAoVVJJLmNyZWF0ZSkKICAgICAgICAgfQotCiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICBzdGF0aWMgZmluYWwgcHJpdmF0ZSBib29sZWFuIGlzTmV0d29ya1dpZmkoQ29udGV4dCBjb250ZXh0KSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBpc05ldHdvcmtXaWZpKENvbnRleHQgY29udGV4dCkgewogICAgICAgICBpZiAoY29udGV4dCA9PSBudWxsKSB7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KLQogICAgICAgICBmaW5hbCBDb25uZWN0aXZpdHlNYW5hZ2VyIGNvbm5lY3Rpdml0eSA9IChDb25uZWN0aXZpdHlNYW5hZ2VyKQogICAgICAgICAgICAgY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuQ09OTkVDVElWSVRZX1NFUlZJQ0UpOwogICAgICAgICBpZiAoY29ubmVjdGl2aXR5ICE9IG51bGwpIHsKQEAgLTE5Miw3ICszMjcsMTI5IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLQogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQotfTsKKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFNldHRpbmdzT2JzZXJ2ZXIgZXh0ZW5kcyBDb250ZW50T2JzZXJ2ZXIgeworCisgICAgICAgIHByaXZhdGUgQ29udGV4dCBtQ29udGV4dDsKKworICAgICAgICBTZXR0aW5nc09ic2VydmVyKENvbnRleHQgY3R4KSB7CisgICAgICAgICAgICBzdXBlcihuZXcgSGFuZGxlcihjdHguZ2V0TWFpbkxvb3BlcigpKSk7CisgICAgICAgICAgICBtQ29udGV4dCA9IGN0eDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkNoYW5nZShib29sZWFuIHNlbGZDaGFuZ2UpIHsKKyAgICAgICAgICAgIHNQcm94eUluZm9Mb2NrLnJlYWRMb2NrKCkubG9jaygpOworICAgICAgICAgICAgcGFyc2VHbG9iYWxQcm94eUluZm9SZWFkTG9ja2VkKG1Db250ZXh0KTsKKyAgICAgICAgICAgIHNQcm94eUluZm9Mb2NrLnJlYWRMb2NrKCkudW5sb2NrKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCB2b2lkIHJlZ2lzdGVyQ29udGVudE9ic2VydmVyc1JlYWRMb2NrZWQoQ29udGV4dCBjdHgpIHsKKyAgICAgICAgVXJpIHVyaUdsb2JhbFByb3h5ID0gU2V0dGluZ3MuU2VjdXJlLmdldFVyaUZvcihTZXR0aW5ncy5TZWN1cmUuSFRUUF9QUk9YWSk7CisgICAgICAgIFVyaSB1cmlHbG9iYWxFeGNsTGlzdCA9CisgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuZ2V0VXJpRm9yKFNldHRpbmdzLlNlY3VyZS5IVFRQX1BST1hZX0VYQ0xVU0lPTl9MSVNUKTsKKworICAgICAgICAvLyBObyBsb2NrIHVwZ3JhZGluZyAoZnJvbSByZWFkIHRvIHdyaXRlKSBhbGxvd2VkCisgICAgICAgIHNQcm94eUluZm9Mb2NrLnJlYWRMb2NrKCkudW5sb2NrKCk7CisgICAgICAgIHNQcm94eUluZm9Mb2NrLndyaXRlTG9jaygpLmxvY2soKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHNHbG9iYWxQcm94eUNoYW5nZWRPYnNlcnZlciA9IG5ldyBTZXR0aW5nc09ic2VydmVyKGN0eCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAvLyBEb3duZ3JhZGluZyBsb2NrcyAoZnJvbSB3cml0ZSB0byByZWFkKSBpcyBhbGxvd2VkCisgICAgICAgICAgICBzUHJveHlJbmZvTG9jay5yZWFkTG9jaygpLmxvY2soKTsKKyAgICAgICAgICAgIHNQcm94eUluZm9Mb2NrLndyaXRlTG9jaygpLnVubG9jaygpOworICAgICAgICB9CisgICAgICAgIGN0eC5nZXRDb250ZW50UmVzb2x2ZXIoKS5yZWdpc3RlckNvbnRlbnRPYnNlcnZlcih1cmlHbG9iYWxQcm94eSwgZmFsc2UsCisgICAgICAgICAgICAgICAgc0dsb2JhbFByb3h5Q2hhbmdlZE9ic2VydmVyKTsKKyAgICAgICAgY3R4LmdldENvbnRlbnRSZXNvbHZlcigpLnJlZ2lzdGVyQ29udGVudE9ic2VydmVyKHVyaUdsb2JhbEV4Y2xMaXN0LCBmYWxzZSwKKyAgICAgICAgICAgICAgICBzR2xvYmFsUHJveHlDaGFuZ2VkT2JzZXJ2ZXIpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIHZvaWQgcGFyc2VHbG9iYWxQcm94eUluZm9SZWFkTG9ja2VkKENvbnRleHQgY3R4KSB7CisgICAgICAgIENvbnRlbnRSZXNvbHZlciBjb250ZW50UmVzb2x2ZXIgPSBjdHguZ2V0Q29udGVudFJlc29sdmVyKCk7CisgICAgICAgIFN0cmluZyBwcm94eUhvc3QgPSAgU2V0dGluZ3MuU2VjdXJlLmdldFN0cmluZygKKyAgICAgICAgICAgICAgICBjb250ZW50UmVzb2x2ZXIsCisgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLkhUVFBfUFJPWFkpOworICAgICAgICBpZiAoKHByb3h5SG9zdCA9PSBudWxsKSB8fCAocHJveHlIb3N0Lmxlbmd0aCgpID09IDApKSB7CisgICAgICAgICAgICAvLyBDbGVhciBzaWduYWwKKyAgICAgICAgICAgIHNQcm94eUluZm9Mb2NrLnJlYWRMb2NrKCkudW5sb2NrKCk7CisgICAgICAgICAgICBzUHJveHlJbmZvTG9jay53cml0ZUxvY2soKS5sb2NrKCk7CisgICAgICAgICAgICBzR2xvYmFsUHJveHlTcGVjID0gbnVsbDsKKyAgICAgICAgICAgIHNQcm94eUluZm9Mb2NrLnJlYWRMb2NrKCkubG9jaygpOworICAgICAgICAgICAgc1Byb3h5SW5mb0xvY2sud3JpdGVMb2NrKCkudW5sb2NrKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIGV4Y2x1c2lvbkxpc3RTcGVjID0gU2V0dGluZ3MuU2VjdXJlLmdldFN0cmluZygKKyAgICAgICAgICAgICAgICBjb250ZW50UmVzb2x2ZXIsCisgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLkhUVFBfUFJPWFlfRVhDTFVTSU9OX0xJU1QpOworICAgICAgICBTdHJpbmcgaG9zdCA9IHBhcnNlSG9zdChwcm94eUhvc3QpOworICAgICAgICBpbnQgcG9ydCA9IHBhcnNlUG9ydChwcm94eUhvc3QpOworICAgICAgICBpZiAocHJveHlIb3N0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNHbG9iYWxQcm94eVNwZWMgPSBuZXcgUHJveHlTcGVjKCk7CisgICAgICAgICAgICBzR2xvYmFsUHJveHlTcGVjLnByb3h5QWRkcmVzcyA9IG5ldyBJbmV0U29ja2V0QWRkcmVzcyhob3N0LCBwb3J0KTsKKyAgICAgICAgICAgIGlmICgoZXhjbHVzaW9uTGlzdFNwZWMgIT0gbnVsbCkgJiYgKGV4Y2x1c2lvbkxpc3RTcGVjLmxlbmd0aCgpICE9IDApKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nW10gZXhjbHVzaW9uTGlzdEVudHJpZXMgPSBleGNsdXNpb25MaXN0U3BlYy50b0xvd2VyQ2FzZSgpLnNwbGl0KCIsIik7CisgICAgICAgICAgICAgICAgU3RyaW5nW10gcHJvY2Vzc2VkRW50cmllcyA9IG5ldyBTdHJpbmdbZXhjbHVzaW9uTGlzdEVudHJpZXMubGVuZ3RoXTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4Y2x1c2lvbkxpc3RFbnRyaWVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBlbnRyeSA9IGV4Y2x1c2lvbkxpc3RFbnRyaWVzW2ldLnRyaW0oKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVudHJ5LnN0YXJ0c1dpdGgoIi4iKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkgPSBlbnRyeS5zdWJzdHJpbmcoMSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2VkRW50cmllc1tpXSA9IGVudHJ5OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzUHJveHlJbmZvTG9jay5yZWFkTG9jaygpLnVubG9jaygpOworICAgICAgICAgICAgICAgIHNQcm94eUluZm9Mb2NrLndyaXRlTG9jaygpLmxvY2soKTsKKyAgICAgICAgICAgICAgICBzR2xvYmFsUHJveHlTcGVjLmV4Y2x1c2lvbkxpc3QgPSBwcm9jZXNzZWRFbnRyaWVzOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzUHJveHlJbmZvTG9jay5yZWFkTG9jaygpLnVubG9jaygpOworICAgICAgICAgICAgICAgIHNQcm94eUluZm9Mb2NrLndyaXRlTG9jaygpLmxvY2soKTsKKyAgICAgICAgICAgICAgICBzR2xvYmFsUHJveHlTcGVjLmV4Y2x1c2lvbkxpc3QgPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc1Byb3h5SW5mb0xvY2sucmVhZExvY2soKS51bmxvY2soKTsKKyAgICAgICAgICAgIHNQcm94eUluZm9Mb2NrLndyaXRlTG9jaygpLmxvY2soKTsKKyAgICAgICAgICAgIHNHbG9iYWxQcm94eVNwZWMgPSBudWxsOworICAgICAgICB9CisgICAgICAgIHNQcm94eUluZm9Mb2NrLnJlYWRMb2NrKCkubG9jaygpOworICAgICAgICBzUHJveHlJbmZvTG9jay53cml0ZUxvY2soKS51bmxvY2soKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBWYWxpZGF0ZSBzeW50YXggb2YgaG9zdG5hbWUsIHBvcnQgYW5kIGV4Y2x1c2lvbiBsaXN0IGVudHJpZXMKKyAgICAgKiB7QGhpZGV9CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHZhbGlkYXRlKFN0cmluZyBob3N0bmFtZSwgU3RyaW5nIHBvcnQsIFN0cmluZyBleGNsTGlzdCkgeworICAgICAgICBNYXRjaGVyIG1hdGNoID0gSE9TVE5BTUVfUEFUVEVSTi5tYXRjaGVyKGhvc3RuYW1lKTsKKyAgICAgICAgTWF0Y2hlciBsaXN0TWF0Y2ggPSBFWENMTElTVF9QQVRURVJOLm1hdGNoZXIoZXhjbExpc3QpOworCisgICAgICAgIGlmICghbWF0Y2gubWF0Y2hlcygpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWxpc3RNYXRjaC5tYXRjaGVzKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChob3N0bmFtZS5sZW5ndGgoKSA+IDAgJiYgcG9ydC5sZW5ndGgoKSA9PSAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAocG9ydC5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgIGlmIChob3N0bmFtZS5sZW5ndGgoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50IHBvcnRWYWwgPSAtMTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcG9ydFZhbCA9IEludGVnZXIucGFyc2VJbnQocG9ydCk7CisgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocG9ydFZhbCA8PSAwIHx8IHBvcnRWYWwgPiAweEZGRkYpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvUHJveHlQcm9wZXJ0aWVzLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvUHJveHlQcm9wZXJ0aWVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjgyOGRkNAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9Qcm94eVByb3BlcnRpZXMuamF2YQpAQCAtMCwwICsxLDEwOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5uZXQ7CisKKworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsOworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsYWJsZTsKKworaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOworaW1wb3J0IGphdmEubmV0LlVua25vd25Ib3N0RXhjZXB0aW9uOworCisvKioKKyAqIEEgY29udGFpbmVyIGNsYXNzIGZvciB0aGUgaHR0cCBwcm94eSBpbmZvCisgKiBAaGlkZQorICovCitwdWJsaWMgY2xhc3MgUHJveHlQcm9wZXJ0aWVzIGltcGxlbWVudHMgUGFyY2VsYWJsZSB7CisKKyAgICBwcml2YXRlIEluZXRBZGRyZXNzIG1Qcm94eTsKKyAgICBwcml2YXRlIGludCBtUG9ydDsKKyAgICBwcml2YXRlIFN0cmluZyBtRXhjbHVzaW9uTGlzdDsKKworICAgIHB1YmxpYyBQcm94eVByb3BlcnRpZXMoKSB7CisgICAgfQorCisgICAgcHVibGljIHN5bmNocm9uaXplZCBJbmV0QWRkcmVzcyBnZXRBZGRyZXNzKCkgeworICAgICAgICByZXR1cm4gbVByb3h5OworICAgIH0KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0QWRkcmVzcyhJbmV0QWRkcmVzcyBwcm94eSkgeworICAgICAgICBtUHJveHkgPSBwcm94eTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIGludCBnZXRQb3J0KCkgeworICAgICAgICByZXR1cm4gbVBvcnQ7CisgICAgfQorICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRQb3J0KGludCBwb3J0KSB7CisgICAgICAgIG1Qb3J0ID0gcG9ydDsKKyAgICB9CisKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIFN0cmluZyBnZXRFeGNsdXNpb25MaXN0KCkgeworICAgICAgICByZXR1cm4gbUV4Y2x1c2lvbkxpc3Q7CisgICAgfQorICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRFeGNsdXNpb25MaXN0KFN0cmluZyBleGNsdXNpb25MaXN0KSB7CisgICAgICAgIG1FeGNsdXNpb25MaXN0ID0gZXhjbHVzaW9uTGlzdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbXBsZW1lbnQgdGhlIFBhcmNlbGFibGUgaW50ZXJmYWNlCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGRlc2NyaWJlQ29udGVudHMoKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8qKgorICAgICAqIEltcGxlbWVudCB0aGUgUGFyY2VsYWJsZSBpbnRlcmZhY2UuCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgd3JpdGVUb1BhcmNlbChQYXJjZWwgZGVzdCwgaW50IGZsYWdzKSB7CisgICAgICAgIGlmIChtUHJveHkgIT0gbnVsbCkgeworICAgICAgICAgICAgZGVzdC53cml0ZUJ5dGUoKGJ5dGUpMSk7CisgICAgICAgICAgICBkZXN0LndyaXRlU3RyaW5nKG1Qcm94eS5nZXRIb3N0TmFtZSgpKTsKKyAgICAgICAgICAgIGRlc3Qud3JpdGVCeXRlQXJyYXkobVByb3h5LmdldEFkZHJlc3MoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkZXN0LndyaXRlQnl0ZSgoYnl0ZSkwKTsKKyAgICAgICAgfQorICAgICAgICBkZXN0LndyaXRlSW50KG1Qb3J0KTsKKyAgICAgICAgZGVzdC53cml0ZVN0cmluZyhtRXhjbHVzaW9uTGlzdCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW1wbGVtZW50IHRoZSBQYXJjZWxhYmxlIGludGVyZmFjZS4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ3JlYXRvcjxQcm94eVByb3BlcnRpZXM+IENSRUFUT1IgPQorICAgICAgICBuZXcgQ3JlYXRvcjxQcm94eVByb3BlcnRpZXM+KCkgeworICAgICAgICAgICAgcHVibGljIFByb3h5UHJvcGVydGllcyBjcmVhdGVGcm9tUGFyY2VsKFBhcmNlbCBpbikgeworICAgICAgICAgICAgICAgIFByb3h5UHJvcGVydGllcyBwcm94eVByb3BlcnRpZXMgPSBuZXcgUHJveHlQcm9wZXJ0aWVzKCk7CisgICAgICAgICAgICAgICAgaWYgKGluLnJlYWRCeXRlKCkgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJveHlQcm9wZXJ0aWVzLnNldEFkZHJlc3MoSW5ldEFkZHJlc3MuZ2V0QnlBZGRyZXNzKGluLnJlYWRTdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4uY3JlYXRlQnl0ZUFycmF5KCkpKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoVW5rbm93bkhvc3RFeGNlcHRpb24gZSkge30KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcHJveHlQcm9wZXJ0aWVzLnNldFBvcnQoaW4ucmVhZEludCgpKTsKKyAgICAgICAgICAgICAgICBwcm94eVByb3BlcnRpZXMuc2V0RXhjbHVzaW9uTGlzdChpbi5yZWFkU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIHJldHVybiBwcm94eVByb3BlcnRpZXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBQcm94eVByb3BlcnRpZXNbXSBuZXdBcnJheShpbnQgc2l6ZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJveHlQcm9wZXJ0aWVzW3NpemVdOworICAgICAgICAgICAgfQorICAgICAgICB9OworCit9OwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvbmV0L1VyaS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L1VyaS5qYXZhCmluZGV4IDQ3ZmFhYmEuLjYzYWRjZDAgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL25ldC9VcmkuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvVXJpLmphdmEKQEAgLTE1NjgsNyArMTU2OCw3IEBACiAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oTk9UX0hJRVJBUkNISUNBTCk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGtleSA9PSBudWxsKSB7Ci0gICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJrZXkiKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigia2V5Iik7CiAgICAgICAgIH0KIAogICAgICAgICBmaW5hbCBTdHJpbmcgcXVlcnkgPSBnZXRFbmNvZGVkUXVlcnkoKTsKQEAgLTE2MDgsNiArMTYwOCwyNCBAQAogICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBTZWFyY2hlcyB0aGUgcXVlcnkgc3RyaW5nIGZvciB0aGUgZmlyc3QgdmFsdWUgd2l0aCB0aGUgZ2l2ZW4ga2V5IGFuZCBpbnRlcnByZXRzIGl0CisgICAgICogYXMgYSBib29sZWFuIHZhbHVlLiAiZmFsc2UiIGFuZCAiMCIgYXJlIGludGVycHJldGVkIGFzIDxjb2RlPmZhbHNlPC9jb2RlPiwgZXZlcnl0aGluZworICAgICAqIGVsc2UgaXMgaW50ZXJwcmV0ZWQgYXMgPGNvZGU+dHJ1ZTwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0ga2V5IHdoaWNoIHdpbGwgYmUgZGVjb2RlZAorICAgICAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgdGhlIGRlZmF1bHQgdmFsdWUgdG8gcmV0dXJuIGlmIHRoZXJlIGlzIG5vIHF1ZXJ5IHBhcmFtZXRlciBmb3Iga2V5CisgICAgICogQHJldHVybiB0aGUgYm9vbGVhbiBpbnRlcnByZXRhdGlvbiBvZiB0aGUgcXVlcnkgcGFyYW1ldGVyIGtleQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldEJvb2xlYW5RdWVyeVBhcmFtZXRlcihTdHJpbmcga2V5LCBib29sZWFuIGRlZmF1bHRWYWx1ZSkgeworICAgICAgICBTdHJpbmcgZmxhZyA9IGdldFF1ZXJ5UGFyYW1ldGVyKGtleSk7CisgICAgICAgIGlmIChmbGFnID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7CisgICAgICAgIH0KKyAgICAgICAgZmxhZyA9IGZsYWcudG9Mb3dlckNhc2UoKTsKKyAgICAgICAgcmV0dXJuICghImZhbHNlIi5lcXVhbHMoZmxhZykgJiYgISIwIi5lcXVhbHMoZmxhZykpOworICAgIH0KKwogICAgIC8qKiBJZGVudGlmaWVzIGEgbnVsbCBwYXJjZWxsZWQgVXJpLiAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOVUxMX1RZUEVfSUQgPSAwOwogCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvaHR0cC9BbmRyb2lkSHR0cENsaWVudC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L2h0dHAvQW5kcm9pZEh0dHBDbGllbnQuamF2YQppbmRleCBlMDdlZTU5Li45MTVlMzQyIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvaHR0cC9BbmRyb2lkSHR0cENsaWVudC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9odHRwL0FuZHJvaWRIdHRwQ2xpZW50LmphdmEKQEAgLTYxLDYgKzYxLDcgQEAKIGltcG9ydCBhbmRyb2lkLm5ldC5TU0xDZXJ0aWZpY2F0ZVNvY2tldEZhY3Rvcnk7CiBpbXBvcnQgYW5kcm9pZC5uZXQuU1NMU2Vzc2lvbkNhY2hlOwogaW1wb3J0IGFuZHJvaWQub3MuTG9vcGVyOworaW1wb3J0IGFuZHJvaWQudXRpbC5CYXNlNjQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAogLyoqCkBAIC04MSw2ICs4MiwxMSBAQAogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJBbmRyb2lkSHR0cENsaWVudCI7CiAKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSB0ZXh0Q29udGVudFR5cGVzID0gbmV3IFN0cmluZ1tdIHsKKyAgICAgICAgICAgICJ0ZXh0LyIsCisgICAgICAgICAgICAiYXBwbGljYXRpb24veG1sIiwKKyAgICAgICAgICAgICJhcHBsaWNhdGlvbi9qc29uIgorICAgIH07CiAKICAgICAvKiogSW50ZXJjZXB0b3IgdGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiB0aGUgZXhlY3V0aW5nIHRocmVhZCBpcyBibG9ja2VkICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSHR0cFJlcXVlc3RJbnRlcmNlcHRvciBzVGhyZWFkQ2hlY2tJbnRlcmNlcHRvciA9CkBAIC0zNTgsNyArMzY0LDcgQEAKICAgICAgICAgfQogICAgICAgICBpZiAobGV2ZWwgPCBMb2cuVkVSQk9TRSB8fCBsZXZlbCA+IExvZy5BU1NFUlQpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkxldmVsIGlzIG91dCBvZiByYW5nZSBbIgotICAgICAgICAgICAgICAgICsgTG9nLlZFUkJPU0UgKyAiLi4iICsgTG9nLkFTU0VSVCArICJdIik7ICAgIAorICAgICAgICAgICAgICAgICsgTG9nLlZFUkJPU0UgKyAiLi4iICsgTG9nLkFTU0VSVCArICJdIik7CiAgICAgICAgIH0KIAogICAgICAgICBjdXJsQ29uZmlndXJhdGlvbiA9IG5ldyBMb2dnaW5nQ29uZmlndXJhdGlvbihuYW1lLCBsZXZlbCk7CkBAIC00MzEsMTIgKzQzNywxNyBAQAogICAgICAgICAgICAgICAgIGlmIChlbnRpdHkuZ2V0Q29udGVudExlbmd0aCgpIDwgMTAyNCkgewogICAgICAgICAgICAgICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gc3RyZWFtID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwogICAgICAgICAgICAgICAgICAgICBlbnRpdHkud3JpdGVUbyhzdHJlYW0pOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZW50aXR5U3RyaW5nID0gc3RyZWFtLnRvU3RyaW5nKCk7CiAKLSAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogQ2hlY2sgdGhlIGNvbnRlbnQgdHlwZSwgdG9vLgotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiIC0tZGF0YS1hc2NpaSBcIiIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZChlbnRpdHlTdHJpbmcpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgiXCIiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzQmluYXJ5Q29udGVudChyZXF1ZXN0KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGJhc2U2NCA9IEJhc2U2NC5lbmNvZGVUb1N0cmluZyhzdHJlYW0udG9CeXRlQXJyYXkoKSwgQmFzZTY0Lk5PX1dSQVApOworICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5pbnNlcnQoMCwgImVjaG8gJyIgKyBiYXNlNjQgKyAiJyB8IGJhc2U2NCAtZCA+IC90bXAvJCQuYmluOyAiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCIgLS1kYXRhLWJpbmFyeSBAL3RtcC8kJC5iaW4iKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBlbnRpdHlTdHJpbmcgPSBzdHJlYW0udG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCIgLS1kYXRhLWFzY2lpIFwiIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZChlbnRpdHlTdHJpbmcpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoIlwiIik7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiIFtUT08gTVVDSCBEQVRBIFRPIElOQ0xVREVdIik7CiAgICAgICAgICAgICAgICAgfQpAQCAtNDQ2LDYgKzQ1NywzMCBAQAogICAgICAgICByZXR1cm4gYnVpbGRlci50b1N0cmluZygpOwogICAgIH0KIAorICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNCaW5hcnlDb250ZW50KEh0dHBVcmlSZXF1ZXN0IHJlcXVlc3QpIHsKKyAgICAgICAgSGVhZGVyW10gaGVhZGVyczsKKyAgICAgICAgaGVhZGVycyA9IHJlcXVlc3QuZ2V0SGVhZGVycyhIZWFkZXJzLkNPTlRFTlRfRU5DT0RJTkcpOworICAgICAgICBpZiAoaGVhZGVycyAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKEhlYWRlciBoZWFkZXIgOiBoZWFkZXJzKSB7CisgICAgICAgICAgICAgICAgaWYgKCJnemlwIi5lcXVhbHNJZ25vcmVDYXNlKGhlYWRlci5nZXRWYWx1ZSgpKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBoZWFkZXJzID0gcmVxdWVzdC5nZXRIZWFkZXJzKEhlYWRlcnMuQ09OVEVOVF9UWVBFKTsKKyAgICAgICAgaWYgKGhlYWRlcnMgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChIZWFkZXIgaGVhZGVyIDogaGVhZGVycykgeworICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIGNvbnRlbnRUeXBlIDogdGV4dENvbnRlbnRUeXBlcykgeworICAgICAgICAgICAgICAgICAgICBpZiAoaGVhZGVyLmdldFZhbHVlKCkuc3RhcnRzV2l0aChjb250ZW50VHlwZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBkYXRlIG9mIHRoZSBnaXZlbiBIVFRQIGRhdGUgc3RyaW5nLiBUaGlzIG1ldGhvZCBjYW4gaWRlbnRpZnkKICAgICAgKiBhbmQgcGFyc2UgdGhlIGRhdGUgZm9ybWF0cyBlbWl0dGVkIGJ5IGNvbW1vbiBIVFRQIHNlcnZlcnMsIHN1Y2ggYXMKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL25ldC9odHRwL0NlcnRpZmljYXRlQ2hhaW5WYWxpZGF0b3IuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9odHRwL0NlcnRpZmljYXRlQ2hhaW5WYWxpZGF0b3IuamF2YQppbmRleCBjNTI3ZmU0Li5jMzZhZDM4IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvaHR0cC9DZXJ0aWZpY2F0ZUNoYWluVmFsaWRhdG9yLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L2h0dHAvQ2VydGlmaWNhdGVDaGFpblZhbGlkYXRvci5qYXZhCkBAIC04MCwxNCArODAsMTAgQEAKICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIFg1MDlDZXJ0aWZpY2F0ZVtdIHNlcnZlckNlcnRpZmljYXRlcyA9IG51bGw7CiAKLSAgICAgICAgLy8gc3RhcnQgaGFuZHNoYWtlLCBjbG9zZSB0aGUgc29ja2V0IGlmIHdlIGZhaWwKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNzbFNvY2tldC5zZXRVc2VDbGllbnRNb2RlKHRydWUpOwotICAgICAgICAgICAgc3NsU29ja2V0LnN0YXJ0SGFuZHNoYWtlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGNsb3NlU29ja2V0VGhyb3dFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgc3NsU29ja2V0LCBlLmdldE1lc3NhZ2UoKSwKLSAgICAgICAgICAgICAgICAiZmFpbGVkIHRvIHBlcmZvcm0gU1NMIGhhbmRzaGFrZSIpOworICAgICAgICAvLyBnZXQgYSB2YWxpZCBTU0xTZXNzaW9uLCBjbG9zZSB0aGUgc29ja2V0IGlmIHdlIGZhaWwKKyAgICAgICAgU1NMU2Vzc2lvbiBzc2xTZXNzaW9uID0gc3NsU2Vzc2lvbiA9IHNzbFNvY2tldC5nZXRTZXNzaW9uKCk7CisgICAgICAgIGlmICghc3NsU2Vzc2lvbi5pc1ZhbGlkKCkpIHsKKyAgICAgICAgICAgIGNsb3NlU29ja2V0VGhyb3dFeGNlcHRpb24oc3NsU29ja2V0LCAiZmFpbGVkIHRvIHBlcmZvcm0gU1NMIGhhbmRzaGFrZSIpOwogICAgICAgICB9CiAKICAgICAgICAgLy8gcmV0cmlldmUgdGhlIGNoYWluIG9mIHRoZSBzZXJ2ZXIgcGVlciBjZXJ0aWZpY2F0ZXMKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL29zL0FzeW5jVGFzay5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvb3MvQXN5bmNUYXNrLmphdmEKaW5kZXggZDI4MTQ4Yy4uYWFkYWNhYiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvb3MvQXN5bmNUYXNrLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvb3MvQXN5bmNUYXNrLmphdmEKQEAgLTE2LDE2ICsxNiwxNiBAQAogCiBwYWNrYWdlIGFuZHJvaWQub3M7CiAKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3I7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQmxvY2tpbmdRdWV1ZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5DYWxsYWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5DYW5jZWxsYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZVRhc2s7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuTGlua2VkQmxvY2tpbmdRdWV1ZTsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRGYWN0b3J5OwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNhbGxhYmxlOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZVRhc2s7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lb3V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNhbmNlbGxhdGlvbkV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljSW50ZWdlcjsKIAogLyoqCkBAIC0zNiw4ICszNiw4IEBACiAgKiA8cD5BbiBhc3luY2hyb25vdXMgdGFzayBpcyBkZWZpbmVkIGJ5IGEgY29tcHV0YXRpb24gdGhhdCBydW5zIG9uIGEgYmFja2dyb3VuZCB0aHJlYWQgYW5kCiAgKiB3aG9zZSByZXN1bHQgaXMgcHVibGlzaGVkIG9uIHRoZSBVSSB0aHJlYWQuIEFuIGFzeW5jaHJvbm91cyB0YXNrIGlzIGRlZmluZWQgYnkgMyBnZW5lcmljCiAgKiB0eXBlcywgY2FsbGVkIDxjb2RlPlBhcmFtczwvY29kZT4sIDxjb2RlPlByb2dyZXNzPC9jb2RlPiBhbmQgPGNvZGU+UmVzdWx0PC9jb2RlPiwKLSAqIGFuZCA0IHN0ZXBzLCBjYWxsZWQgPGNvZGU+YmVnaW48L2NvZGU+LCA8Y29kZT5kb0luQmFja2dyb3VuZDwvY29kZT4sCi0gKiA8Y29kZT5wcm9jZXNzUHJvZ3Jlc3M8L2NvZGU+IGFuZCA8Y29kZT5lbmQ8L2NvZGU+LjwvcD4KKyAqIGFuZCA0IHN0ZXBzLCBjYWxsZWQgPGNvZGU+b25QcmVFeGVjdXRlPC9jb2RlPiwgPGNvZGU+ZG9JbkJhY2tncm91bmQ8L2NvZGU+LAorICogPGNvZGU+b25Qcm9ncmVzc1VwZGF0ZTwvY29kZT4gYW5kIDxjb2RlPm9uUG9zdEV4ZWN1dGU8L2NvZGU+LjwvcD4KICAqCiAgKiA8aDI+VXNhZ2U8L2gyPgogICogPHA+QXN5bmNUYXNrIG11c3QgYmUgc3ViY2xhc3NlZCB0byBiZSB1c2VkLiBUaGUgc3ViY2xhc3Mgd2lsbCBvdmVycmlkZSBhdCBsZWFzdApAQCAtMTc1LDYgKzE3NSwxMSBAQAogICAgICAgICBGSU5JU0hFRCwKICAgICB9CiAKKyAgICAvKiogQGhpZGUgVXNlZCB0byBmb3JjZSBzdGF0aWMgaGFuZGxlciB0byBiZSBjcmVhdGVkLiAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBpbml0KCkgeworICAgICAgICBzSGFuZGxlci5nZXRMb29wZXIoKTsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBDcmVhdGVzIGEgbmV3IGFzeW5jaHJvbm91cyB0YXNrLiBUaGlzIGNvbnN0cnVjdG9yIG11c3QgYmUgaW52b2tlZCBvbiB0aGUgVUkgdGhyZWFkLgogICAgICAqLwpAQCAtMTg3LDYgKzE5MiwxNyBAQAogICAgICAgICB9OwogCiAgICAgICAgIG1GdXR1cmUgPSBuZXcgRnV0dXJlVGFzazxSZXN1bHQ+KG1Xb3JrZXIpIHsKKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBzZXQoUmVzdWx0IHYpIHsKKyAgICAgICAgICAgICAgICBzdXBlci5zZXQodik7CisgICAgICAgICAgICAgICAgaWYgKGlzQ2FuY2VsbGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSBtZXNzYWdlID0gc0hhbmRsZXIub2J0YWluTWVzc2FnZShNRVNTQUdFX1BPU1RfQ0FOQ0VMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBc3luY1Rhc2tSZXN1bHQ8UmVzdWx0PihBc3luY1Rhc2sudGhpcywgKFJlc3VsdFtdKSBudWxsKSk7CisgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc2VuZFRvVGFyZ2V0KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIGRvbmUoKSB7CiAgICAgICAgICAgICAgICAgTWVzc2FnZSBtZXNzYWdlOwpAQCAtNDAyLDE0ICs0MTgsMTkgQEAKICAgICAgKiBzdGlsbCBydW5uaW5nLiBFYWNoIGNhbGwgdG8gdGhpcyBtZXRob2Qgd2lsbCB0cmlnZ2VyIHRoZSBleGVjdXRpb24gb2YKICAgICAgKiB7QGxpbmsgI29uUHJvZ3Jlc3NVcGRhdGV9IG9uIHRoZSBVSSB0aHJlYWQuCiAgICAgICoKKyAgICAgKiB7QGxpbmsgI29uUHJvZ3Jlc3NVcGRhdGV9IHdpbGwgbm90ZSBiZSBjYWxsZWQgaWYgdGhlIHRhc2sgaGFzIGJlZW4KKyAgICAgKiBjYW5jZWxlZC4KKyAgICAgKgogICAgICAqIEBwYXJhbSB2YWx1ZXMgVGhlIHByb2dyZXNzIHZhbHVlcyB0byB1cGRhdGUgdGhlIFVJIHdpdGguCiAgICAgICoKICAgICAgKiBAc2VlICNvblByb2dyZXNzVXBkYXRlCiAgICAgICogQHNlZSAjZG9JbkJhY2tncm91bmQKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBwdWJsaXNoUHJvZ3Jlc3MoUHJvZ3Jlc3MuLi4gdmFsdWVzKSB7Ci0gICAgICAgIHNIYW5kbGVyLm9idGFpbk1lc3NhZ2UoTUVTU0FHRV9QT1NUX1BST0dSRVNTLAotICAgICAgICAgICAgICAgIG5ldyBBc3luY1Rhc2tSZXN1bHQ8UHJvZ3Jlc3M+KHRoaXMsIHZhbHVlcykpLnNlbmRUb1RhcmdldCgpOworICAgICAgICBpZiAoIWlzQ2FuY2VsbGVkKCkpIHsKKyAgICAgICAgICAgIHNIYW5kbGVyLm9idGFpbk1lc3NhZ2UoTUVTU0FHRV9QT1NUX1BST0dSRVNTLAorICAgICAgICAgICAgICAgICAgICBuZXcgQXN5bmNUYXNrUmVzdWx0PFByb2dyZXNzPih0aGlzLCB2YWx1ZXMpKS5zZW5kVG9UYXJnZXQoKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBmaW5pc2goUmVzdWx0IHJlc3VsdCkgewpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvb3MvQnVpbGQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL29zL0J1aWxkLmphdmEKaW5kZXggODkyNWJkMC4uOTI2OGNkMSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvb3MvQnVpbGQuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9vcy9CdWlsZC5qYXZhCkBAIC0xOTksNiArMTk5LDE4IEBACiAgICAgICAgICAqIDwvdWw+CiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHSU5HRVJCUkVBRCA9IENVUl9ERVZFTE9QTUVOVDsKKworICAgICAgICAvKioKKyAgICAgICAgICogTmV4dCBuZXh0IHZlcnNpb24gb2YgQW5kcm9pZC4KKyAgICAgICAgICoKKyAgICAgICAgICogPHA+QXBwbGljYXRpb25zIHRhcmdldGluZyB0aGlzIG9yIGEgbGF0ZXIgcmVsZWFzZSB3aWxsIGdldCB0aGVzZQorICAgICAgICAgKiBuZXcgY2hhbmdlcyBpbiBiZWhhdmlvcjo8L3A+CisgICAgICAgICAqIDx1bD4KKyAgICAgICAgICogPGxpPiBUaGUgZGVmYXVsdCB0aGVtZSBmb3IgYXBwbGljYXRpb25zIGlzIG5vdyBkYXJrIGhvbG9ncmFwaGljOgorICAgICAgICAgKiAgICAgIHtAbGluayBhbmRyb2lkLlIuc3R5bGUjVGhlbWVfSG9sb30uCisgICAgICAgICAqIDwvdWw+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBIT05FWUNPTUIgPSBDVVJfREVWRUxPUE1FTlQ7CiAgICAgfQogICAgIAogICAgIC8qKiBUaGUgdHlwZSBvZiBidWlsZCwgbGlrZSAidXNlciIgb3IgImVuZyIuICovCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9vcy9EZWJ1Zy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvb3MvRGVidWcuamF2YQppbmRleCA4NmY5YTZiLi5hNThlNzBiIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9vcy9EZWJ1Zy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL29zL0RlYnVnLmphdmEKQEAgLTczMSw3ICs3MzEsNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIER1bXAgImhwcm9mIiBkYXRhIHRvIHRoZSBzcGVjaWZpZWQgZmlsZS4gIFRoaXMgd2lsbCBjYXVzZSBhIEdDLgorICAgICAqIER1bXAgImhwcm9mIiBkYXRhIHRvIHRoZSBzcGVjaWZpZWQgZmlsZS4gIFRoaXMgbWF5IGNhdXNlIGEgR0MuCiAgICAgICoKICAgICAgKiBAcGFyYW0gZmlsZU5hbWUgRnVsbCBwYXRobmFtZSBvZiBvdXRwdXQgZmlsZSAoZS5nLiAiL3NkY2FyZC9kdW1wLmhwcm9mIikuCiAgICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBpZiB0aGUgVk0gd2FzIGJ1aWx0IHdpdGhvdXQKQEAgLTc0MywxMSArNzQzLDI0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29sbGVjdCAiaHByb2YiIGFuZCBzZW5kIGl0IHRvIERETVMuICBUaGlzIHdpbGwgY2F1c2UgYSBHQy4KKyAgICAgKiBMaWtlIGR1bXBIcHJvZkRhdGEoU3RyaW5nKSwgYnV0IHRha2VzIGFuIGFscmVhZHktb3BlbmVkCisgICAgICogRmlsZURlc2NyaXB0b3IgdG8gd2hpY2ggdGhlIHRyYWNlIGlzIHdyaXR0ZW4uICBUaGUgZmlsZSBuYW1lIGlzIGFsc28KKyAgICAgKiBzdXBwbGllZCBzaW1wbHkgZm9yIGxvZ2dpbmcuICBNYWtlcyBhIGR1cCBvZiB0aGUgZmlsZSBkZXNjcmlwdG9yLgorICAgICAqCisgICAgICogUHJpbWFyaWx5IGZvciB1c2UgYnkgdGhlICJhbSIgc2hlbGwgY29tbWFuZC4KKyAgICAgKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGR1bXBIcHJvZkRhdGEoU3RyaW5nIGZpbGVOYW1lLCBGaWxlRGVzY3JpcHRvciBmZCkKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFZNRGVidWcuZHVtcEhwcm9mRGF0YShmaWxlTmFtZSwgZmQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbGxlY3QgImhwcm9mIiBhbmQgc2VuZCBpdCB0byBERE1TLiAgVGhpcyBtYXkgY2F1c2UgYSBHQy4KICAgICAgKgogICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgdGhlIFZNIHdhcyBidWlsdCB3aXRob3V0CiAgICAgICogICAgICAgICBIUFJPRiBzdXBwb3J0LgotICAgICAqCiAgICAgICogQGhpZGUKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIHZvaWQgZHVtcEhwcm9mRGF0YURkbXMoKSB7CkBAIC03NTUsNiArNzY4LDEzIEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogV3JpdGVzIG5hdGl2ZSBoZWFwIGRhdGEgdG8gdGhlIHNwZWNpZmllZCBmaWxlIGRlc2NyaXB0b3IuCisgICAgICoKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgZHVtcE5hdGl2ZUhlYXAoRmlsZURlc2NyaXB0b3IgZmQpOworCisgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHNlbnQgdHJhbnNhY3Rpb25zIGZyb20gdGhpcyBwcm9jZXNzLgogICAgICAqIEByZXR1cm4gVGhlIG51bWJlciBvZiBzZW50IHRyYW5zYWN0aW9ucyBvciAtMSBpZiBpdCBjb3VsZCBub3QgcmVhZCB0LgogICAgICAqLwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvb3MvRmlsZVV0aWxzLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9vcy9GaWxlVXRpbHMuamF2YQppbmRleCBhMTdiN2ZlLi43MmUyMWRlIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9vcy9GaWxlVXRpbHMuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9vcy9GaWxlVXRpbHMuamF2YQpAQCAtODUsNiArODUsOCBAQAogCiAgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IGdldFBlcm1pc3Npb25zKFN0cmluZyBmaWxlLCBpbnRbXSBvdXRQZXJtaXNzaW9ucyk7CiAKKyAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgc2V0VU1hc2soaW50IG1hc2spOworCiAgICAgLyoqIHJldHVybnMgdGhlIEZBVCBmaWxlIHN5c3RlbSB2b2x1bWUgSUQgZm9yIHRoZSB2b2x1bWUgbW91bnRlZCAKICAgICAgKiBhdCB0aGUgZ2l2ZW4gbW91bnQgcG9pbnQsIG9yIC0xIGZvciBmYWlsdXJlCiAgICAgICogQHBhcmFtIG1vdW50IHBvaW50IGZvciBGQVQgdm9sdW1lCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9vcy9NZW1vcnlGaWxlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9vcy9NZW1vcnlGaWxlLmphdmEKaW5kZXggYTgxZTE2Yi4uZjgyNzAyYSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvb3MvTWVtb3J5RmlsZS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL29zL01lbW9yeUZpbGUuamF2YQpAQCAtNTgsNyArNTgsNiBAQAogICAgIHByaXZhdGUgaW50IG1BZGRyZXNzOyAgIC8vIGFkZHJlc3Mgb2YgYXNobWVtIG1lbW9yeQogICAgIHByaXZhdGUgaW50IG1MZW5ndGg7ICAgIC8vIHRvdGFsIGxlbmd0aCBvZiBvdXIgYXNobWVtIHJlZ2lvbgogICAgIHByaXZhdGUgYm9vbGVhbiBtQWxsb3dQdXJnaW5nID0gZmFsc2U7ICAvLyB0cnVlIGlmIG91ciBhc2htZW0gcmVnaW9uIGlzIHVucGlubmVkCi0gICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1Pd25zUmVnaW9uOyAgLy8gZmFsc2UgaWYgdGhpcyBpcyBhIHJlZiB0byBhbiBleGlzdGluZyBhc2htZW0gcmVnaW9uCiAKICAgICAvKioKICAgICAgKiBBbGxvY2F0ZXMgYSBuZXcgYXNobWVtIHJlZ2lvbi4gVGhlIHJlZ2lvbiBpcyBpbml0aWFsbHkgbm90IHB1cmdhYmxlLgpAQCAtNzAsMzggKzY5LDExIEBACiAgICAgcHVibGljIE1lbW9yeUZpbGUoU3RyaW5nIG5hbWUsIGludCBsZW5ndGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIG1MZW5ndGggPSBsZW5ndGg7CiAgICAgICAgIG1GRCA9IG5hdGl2ZV9vcGVuKG5hbWUsIGxlbmd0aCk7Ci0gICAgICAgIG1BZGRyZXNzID0gbmF0aXZlX21tYXAobUZELCBsZW5ndGgsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUpOwotICAgICAgICBtT3duc1JlZ2lvbiA9IHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIHJlZmVyZW5jZSB0byBhbiBleGlzdGluZyBtZW1vcnkgZmlsZS4gQ2hhbmdlcyB0byB0aGUgb3JpZ2luYWwgZmlsZQotICAgICAqIHdpbGwgYmUgYXZhaWxhYmxlIHRocm91Z2ggdGhpcyByZWZlcmVuY2UuCi0gICAgICogQ2FsbHMgdG8ge0BsaW5rICNhbGxvd1B1cmdpbmcoYm9vbGVhbil9IG9uIHRoZSByZXR1cm5lZCBNZW1vcnlGaWxlIHdpbGwgZmFpbC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBmZCBGaWxlIGRlc2NyaXB0b3IgZm9yIGFuIGV4aXN0aW5nIG1lbW9yeSBmaWxlLCBhcyByZXR1cm5lZCBieQotICAgICAqICAgICAgICB7QGxpbmsgI2dldEZpbGVEZXNjcmlwdG9yKCl9LiBUaGlzIGZpbGUgZGVzY3JpcHRvciB3aWxsIGJlIGNsb3NlZAotICAgICAqICAgICAgICBieSB7QGxpbmsgI2Nsb3NlKCl9LgotICAgICAqIEBwYXJhbSBsZW5ndGggTGVuZ3RoIG9mIHRoZSBtZW1vcnkgZmlsZSBpbiBieXRlcy4KLSAgICAgKiBAcGFyYW0gbW9kZSBGaWxlIG1vZGUuIEN1cnJlbnRseSBvbmx5ICJyIiBmb3IgcmVhZC1vbmx5IGFjY2VzcyBpcyBzdXBwb3J0ZWQuCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiA8Y29kZT5mZDwvY29kZT4gaXMgbnVsbC4KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIElmIDxjb2RlPmZkPC9jb2RlPiBkb2VzIG5vdCByZWZlciB0byBhbiBleGlzdGluZyBtZW1vcnkgZmlsZSwKLSAgICAgKiAgICAgICAgIG9yIGlmIHRoZSBmaWxlIG1vZGUgb2YgdGhlIGV4aXN0aW5nIG1lbW9yeSBmaWxlIGlzIG1vcmUgcmVzdHJpY3RpdmUKLSAgICAgKiAgICAgICAgIHRoYW4gPGNvZGU+bW9kZTwvY29kZT4uCi0gICAgICoKLSAgICAgKiBAaGlkZQotICAgICAqLwotICAgIHB1YmxpYyBNZW1vcnlGaWxlKEZpbGVEZXNjcmlwdG9yIGZkLCBpbnQgbGVuZ3RoLCBTdHJpbmcgbW9kZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGZkID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiRmlsZSBkZXNjcmlwdG9yIGlzIG51bGwuIik7CisgICAgICAgIGlmIChsZW5ndGggPiAwKSB7CisgICAgICAgICAgICBtQWRkcmVzcyA9IG5hdGl2ZV9tbWFwKG1GRCwgbGVuZ3RoLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1BZGRyZXNzID0gMDsKICAgICAgICAgfQotICAgICAgICBpZiAoIWlzTWVtb3J5RmlsZShmZCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk5vdCBhIG1lbW9yeSBmaWxlLiIpOwotICAgICAgICB9Ci0gICAgICAgIG1MZW5ndGggPSBsZW5ndGg7Ci0gICAgICAgIG1GRCA9IGZkOwotICAgICAgICBtQWRkcmVzcyA9IG5hdGl2ZV9tbWFwKG1GRCwgbGVuZ3RoLCBtb2RlVG9Qcm90KG1vZGUpKTsKLSAgICAgICAgbU93bnNSZWdpb24gPSBmYWxzZTsKICAgICB9CiAKICAgICAvKioKQEAgLTEyMiw3ICs5NCw3IEBACiAgICAgICoKICAgICAgKiBAaGlkZQogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRlYWN0aXZhdGUoKSB7CisgICAgdm9pZCBkZWFjdGl2YXRlKCkgewogICAgICAgICBpZiAoIWlzRGVhY3RpdmF0ZWQoKSkgewogICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICBuYXRpdmVfbXVubWFwKG1BZGRyZXNzLCBtTGVuZ3RoKTsKQEAgLTE4MSw5ICsxNTMsNiBAQAogICAgICAqIEByZXR1cm4gcHJldmlvdXMgdmFsdWUgb2YgYWxsb3dQdXJnaW5nCiAgICAgICovCiAgICAgc3luY2hyb25pemVkIHB1YmxpYyBib29sZWFuIGFsbG93UHVyZ2luZyhib29sZWFuIGFsbG93UHVyZ2luZykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFtT3duc1JlZ2lvbikgewotICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJPbmx5IHRoZSBvd25lciBjYW4gbWFrZSBhc2htZW0gcmVnaW9ucyBwdXJnYWJsZS4iKTsKLSAgICAgICAgfQogICAgICAgICBib29sZWFuIG9sZFZhbHVlID0gbUFsbG93UHVyZ2luZzsKICAgICAgICAgaWYgKG9sZFZhbHVlICE9IGFsbG93UHVyZ2luZykgewogICAgICAgICAgICAgbmF0aXZlX3BpbihtRkQsICFhbGxvd1B1cmdpbmcpOwpAQCAtMjYwLDI4ICsyMjksNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgYSBQYXJjZWxGaWxlRGVzY3JpcHRvciBmb3IgdGhlIG1lbW9yeSBmaWxlLiBTZWUge0BsaW5rICNnZXRGaWxlRGVzY3JpcHRvcigpfQotICAgICAqIGZvciBjYXZlYXRzLiBUaGlzIG11c3QgYmUgaGVyZSB0byBhbGxvdyBjbGFzc2VzIG91dHNpZGUgPGNvZGU+YW5kcm9pZC5vczwvY29kZTwgdG8KLSAgICAgKiBtYWtlIFBhcmNlbEZpbGVEZXNjcmlwdG9ycyBmcm9tIE1lbW9yeUZpbGVzLCBhcwotICAgICAqIHtAbGluayBQYXJjZWxGaWxlRGVzY3JpcHRvciNQYXJjZWxGaWxlRGVzY3JpcHRvcihGaWxlRGVzY3JpcHRvcil9IGlzIHBhY2thZ2UgcHJpdmF0ZS4KLSAgICAgKgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgZmlsZSBkZXNjcmlwdG9yIG93bmVkIGJ5IHRoaXMgbWVtb3J5IGZpbGUgb2JqZWN0LgotICAgICAqICAgICAgICAgVGhlIGZpbGUgZGVzY3JpcHRvciBpcyBub3QgZHVwbGljYXRlZC4KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIElmIHRoZSBtZW1vcnkgZmlsZSBoYXMgYmVlbiBjbG9zZWQuCi0gICAgICoKLSAgICAgKiBAaGlkZQotICAgICAqLwotICAgIHB1YmxpYyBQYXJjZWxGaWxlRGVzY3JpcHRvciBnZXRQYXJjZWxGaWxlRGVzY3JpcHRvcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIEZpbGVEZXNjcmlwdG9yIGZkID0gZ2V0RmlsZURlc2NyaXB0b3IoKTsKLSAgICAgICAgcmV0dXJuIGZkICE9IG51bGwgPyBuZXcgUGFyY2VsRmlsZURlc2NyaXB0b3IoZmQpIDogbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGEgRmlsZURlc2NyaXB0b3IgZm9yIHRoZSBtZW1vcnkgZmlsZS4gTm90ZSB0aGF0IHRoaXMgZmlsZSBkZXNjcmlwdG9yCi0gICAgICogaXMgb25seSBzYWZlIHRvIHBhc3MgdG8ge0BsaW5rICNNZW1vcnlGaWxlKEZpbGVEZXNjcmlwdG9yLGludCl9KS4gSXQKLSAgICAgKiBzaG91bGQgbm90IGJlIHVzZWQgd2l0aCBmaWxlIGRlc2NyaXB0b3Igb3BlcmF0aW9ucyB0aGF0IGV4cGVjdCBhIGZpbGUgZGVzY3JpcHRvcgotICAgICAqIGZvciBhIG5vcm1hbCBmaWxlLgorICAgICAqIEdldHMgYSBGaWxlRGVzY3JpcHRvciBmb3IgdGhlIG1lbW9yeSBmaWxlLgogICAgICAqCiAgICAgICogVGhlIHJldHVybmVkIGZpbGUgZGVzY3JpcHRvciBpcyBub3QgZHVwbGljYXRlZC4KICAgICAgKgpAQCAtMjk0LDE3ICsyNDIsNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBmaWxlIGRlc2NyaXB0b3IgcmVmZXJzIHRvIGEgbWVtb3J5IGZpbGUuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIElmIDxjb2RlPmZkPC9jb2RlPiBpcyBub3QgYSB2YWxpZCBmaWxlIGRlc2NyaXB0b3IuCi0gICAgICoKLSAgICAgKiBAaGlkZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc01lbW9yeUZpbGUoRmlsZURlc2NyaXB0b3IgZmQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiAobmF0aXZlX2dldF9zaXplKGZkKSA+PSAwKTsKLSAgICB9Ci0KLSAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBtZW1vcnkgZmlsZSB0aGF0IHRoZSBmaWxlIGRlc2NyaXB0b3IgcmVmZXJzIHRvLAogICAgICAqIG9yIC0xIGlmIHRoZSBmaWxlIGRlc2NyaXB0b3IgZG9lcyBub3QgcmVmZXIgdG8gYSBtZW1vcnkgZmlsZS4KICAgICAgKgpAQCAtMzE2LDIwICsyNTMsNiBAQAogICAgICAgICByZXR1cm4gbmF0aXZlX2dldF9zaXplKGZkKTsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBDb252ZXJ0cyBhIGZpbGUgbW9kZSBzdHJpbmcgdG8gYSA8Y29kZT5wcm90PC9jb2RlPiB2YWx1ZSBhcyBleHBlY3RlZCBieQotICAgICAqIG5hdGl2ZV9tbWFwKCkuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgZmlsZSBtb2RlIGlzIGludmFsaWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IG1vZGVUb1Byb3QoU3RyaW5nIG1vZGUpIHsKLSAgICAgICAgaWYgKCJyIi5lcXVhbHMobW9kZSkpIHsKLSAgICAgICAgICAgIHJldHVybiBQUk9UX1JFQUQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbnN1cHBvcnRlZCBmaWxlIG1vZGU6ICciICsgbW9kZSArICInIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICBwcml2YXRlIGNsYXNzIE1lbW9yeUlucHV0U3RyZWFtIGV4dGVuZHMgSW5wdXRTdHJlYW0gewogCiAgICAgICAgIHByaXZhdGUgaW50IG1NYXJrID0gMDsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL29zL01lc3NhZ2UuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL29zL01lc3NhZ2UuamF2YQppbmRleCA0OWI3MmZlLi5lYjk0MWU0IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9vcy9NZXNzYWdlLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvb3MvTWVzc2FnZS5qYXZhCkBAIC03Myw3ICs3MywxOCBAQAogICAgICAqIHJlY2VpdmVyLgogICAgICAqLwogICAgIHB1YmxpYyBNZXNzZW5nZXIgcmVwbHlUbzsKLSAgICAKKworICAgIC8qKiBJZiBzZXQgbWVzc2FnZSBpcyBpbiB1c2UgKi8KKyAgICAvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgaW50IEZMQUdfSU5fVVNFID0gMTsKKworICAgIC8qKiBGbGFncyByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSAoQWxsIGFyZSByZXNlcnZlZCBmb3Igbm93KSAqLworICAgIC8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBpbnQgRkxBR1NfUkVTRVJWRUQgPSB+RkxBR19JTl9VU0U7CisKKyAgICAvKiogRmxhZ3MgdG8gY2xlYXIgaW4gdGhlIGNvcHlGcm9tIG1ldGhvZCAqLworICAgIC8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBpbnQgRkxBR1NfVE9fQ0xFQVJfT05fQ09QWV9GUk9NID0gRkxBR1NfUkVTRVJWRUQgfCBGTEFHX0lOX1VTRTsKKworICAgIC8qcGFja2FnZSovIGludCBmbGFnczsKKwogICAgIC8qcGFja2FnZSovIGxvbmcgd2hlbjsKICAgICAKICAgICAvKnBhY2thZ2UqLyBCdW5kbGUgZGF0YTsKQEAgLTI1Myw2ICsyNjQsNyBAQAogICAgICAqIHRhcmdldC9jYWxsYmFjayBvZiB0aGUgb3JpZ2luYWwgbWVzc2FnZS4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBjb3B5RnJvbShNZXNzYWdlIG8pIHsKKyAgICAgICAgdGhpcy5mbGFncyA9IG8uZmxhZ3MgJiB+RkxBR1NfVE9fQ0xFQVJfT05fQ09QWV9GUk9NOwogICAgICAgICB0aGlzLndoYXQgPSBvLndoYXQ7CiAgICAgICAgIHRoaXMuYXJnMSA9IG8uYXJnMTsKICAgICAgICAgdGhpcy5hcmcyID0gby5hcmcyOwpAQCAtMzUwLDYgKzM2Miw3IEBACiAgICAgfQogCiAgICAgLypwYWNrYWdlKi8gdm9pZCBjbGVhckZvclJlY3ljbGUoKSB7CisgICAgICAgIGZsYWdzID0gMDsKICAgICAgICAgd2hhdCA9IDA7CiAgICAgICAgIGFyZzEgPSAwOwogICAgICAgICBhcmcyID0gMDsKQEAgLTM2MSw2ICszNzQsMTQgQEAKICAgICAgICAgZGF0YSA9IG51bGw7CiAgICAgfQogCisgICAgLypwYWNrYWdlKi8gYm9vbGVhbiBpc0luVXNlKCkgeworICAgICAgICByZXR1cm4gKChmbGFncyAmIEZMQUdfSU5fVVNFKSA9PSBGTEFHX0lOX1VTRSk7CisgICAgfQorCisgICAgLypwYWNrYWdlKi8gdm9pZCBtYXJrSW5Vc2UoKSB7CisgICAgICAgIGZsYWdzIHw9IEZMQUdfSU5fVVNFOworICAgIH0KKwogICAgIC8qKiBDb25zdHJ1Y3RvciAoYnV0IHRoZSBwcmVmZXJyZWQgd2F5IHRvIGdldCBhIE1lc3NhZ2UgaXMgdG8gY2FsbCB7QGxpbmsgI29idGFpbigpIE1lc3NhZ2Uub2J0YWluKCl9KS4KICAgICAqLwogICAgIHB1YmxpYyBNZXNzYWdlKCkgewpAQCAtNDUzLDQgKzQ3NCwzIEBACiAgICAgICAgIHJlcGx5VG8gPSBNZXNzZW5nZXIucmVhZE1lc3Nlbmdlck9yTnVsbEZyb21QYXJjZWwoc291cmNlKTsKICAgICB9CiB9Ci0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL29zL01lc3NhZ2VRdWV1ZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvb3MvTWVzc2FnZVF1ZXVlLmphdmEKaW5kZXggYWRiMTFjOC4uNzVkZmRkMiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvb3MvTWVzc2FnZVF1ZXVlLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvb3MvTWVzc2FnZVF1ZXVlLmphdmEKQEAgLTEyMCw2ICsxMjAsNyBAQAogICAgICAgICAgICAgICAgIG5vdyA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOwogICAgICAgICAgICAgICAgIE1lc3NhZ2UgbXNnID0gcHVsbE5leHRMb2NrZWQobm93KTsKICAgICAgICAgICAgICAgICBpZiAobXNnICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbXNnLm1hcmtJblVzZSgpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gbXNnOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAKQEAgLTE5Miw3ICsxOTMsNyBAQAogICAgIH0KIAogICAgIGZpbmFsIGJvb2xlYW4gZW5xdWV1ZU1lc3NhZ2UoTWVzc2FnZSBtc2csIGxvbmcgd2hlbikgewotICAgICAgICBpZiAobXNnLndoZW4gIT0gMCkgeworICAgICAgICBpZiAobXNnLmlzSW5Vc2UoKSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IEFuZHJvaWRSdW50aW1lRXhjZXB0aW9uKG1zZwogICAgICAgICAgICAgICAgICAgICArICIgVGhpcyBtZXNzYWdlIGlzIGFscmVhZHkgaW4gdXNlLiIpOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9vcy9QYXJjZWxGaWxlRGVzY3JpcHRvci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvb3MvUGFyY2VsRmlsZURlc2NyaXB0b3IuamF2YQppbmRleCA5ZDIxM2IzLi5jMWExODA5IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9vcy9QYXJjZWxGaWxlRGVzY3JpcHRvci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL29zL1BhcmNlbEZpbGVEZXNjcmlwdG9yLmphdmEKQEAgLTEzNCw2ICsxMzQsNDUgQEAKICAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgRmlsZURlc2NyaXB0b3IgZ2V0RmlsZURlc2NyaXB0b3JGcm9tU29ja2V0KFNvY2tldCBzb2NrZXQpOwogCiAgICAgLyoqCisgICAgICogQ3JlYXRlIHR3byBQYXJjZWxGaWxlRGVzY3JpcHRvcnMgc3RydWN0dXJlZCBhcyBhIGRhdGEgcGlwZS4gIFRoZSBmaXJzdAorICAgICAqIFBhcmNlbEZpbGVEZXNjcmlwdG9yIGluIHRoZSByZXR1cm5lZCBhcnJheSBpcyB0aGUgcmVhZCBzaWRlOyB0aGUgc2Vjb25kCisgICAgICogaXMgdGhlIHdyaXRlIHNpZGUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBQYXJjZWxGaWxlRGVzY3JpcHRvcltdIGNyZWF0ZVBpcGUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBGaWxlRGVzY3JpcHRvcltdIGZkcyA9IG5ldyBGaWxlRGVzY3JpcHRvclsyXTsKKyAgICAgICAgaW50IHJlcyA9IGNyZWF0ZVBpcGVOYXRpdmUoZmRzKTsKKyAgICAgICAgaWYgKHJlcyA9PSAwKSB7CisgICAgICAgICAgICBQYXJjZWxGaWxlRGVzY3JpcHRvcltdIHBmZHMgPSBuZXcgUGFyY2VsRmlsZURlc2NyaXB0b3JbMl07CisgICAgICAgICAgICBwZmRzWzBdID0gbmV3IFBhcmNlbEZpbGVEZXNjcmlwdG9yKGZkc1swXSk7CisgICAgICAgICAgICBwZmRzWzFdID0gbmV3IFBhcmNlbEZpbGVEZXNjcmlwdG9yKGZkc1sxXSk7CisgICAgICAgICAgICByZXR1cm4gcGZkczsKKyAgICAgICAgfQorICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIlVuYWJsZSB0byBjcmVhdGUgcGlwZTogZXJybm89IiArIC1yZXMpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgY3JlYXRlUGlwZU5hdGl2ZShGaWxlRGVzY3JpcHRvcltdIG91dEZkcyk7CisKKyAgICAvKioKKyAgICAgKiBHZXRzIGEgZmlsZSBkZXNjcmlwdG9yIGZvciBhIHJlYWQtb25seSBjb3B5IG9mIHRoZSBnaXZlbiBkYXRhLgorICAgICAqCisgICAgICogQHBhcmFtIGRhdGEgRGF0YSB0byBjb3B5LgorICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgZm9yIHRoZSBzaGFyZWQgbWVtb3J5IGFyZWEgdGhhdCBtYXkgYmFjayB0aGUgZmlsZSBkZXNjcmlwdG9yLgorICAgICAqICAgICAgICBUaGlzIGlzIHB1cmVseSBpbmZvcm1hdGl2ZSBhbmQgbWF5IGJlIHtAY29kZSBudWxsfS4KKyAgICAgKiBAcmV0dXJuIEEgUGFyY2VsRmlsZURlc2NyaXB0b3IuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhbiBlcnJvciB3aGlsZSBjcmVhdGluZyB0aGUgc2hhcmVkIG1lbW9yeSBhcmVhLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgUGFyY2VsRmlsZURlc2NyaXB0b3IgZnJvbURhdGEoYnl0ZVtdIGRhdGEsIFN0cmluZyBuYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoZGF0YSA9PSBudWxsKSByZXR1cm4gbnVsbDsKKyAgICAgICAgTWVtb3J5RmlsZSBmaWxlID0gbmV3IE1lbW9yeUZpbGUobmFtZSwgZGF0YS5sZW5ndGgpOworICAgICAgICBpZiAoZGF0YS5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICBmaWxlLndyaXRlQnl0ZXMoZGF0YSwgMCwgMCwgZGF0YS5sZW5ndGgpOworICAgICAgICB9CisgICAgICAgIGZpbGUuZGVhY3RpdmF0ZSgpOworICAgICAgICBGaWxlRGVzY3JpcHRvciBmZCA9IGZpbGUuZ2V0RmlsZURlc2NyaXB0b3IoKTsKKyAgICAgICAgcmV0dXJuIGZkICE9IG51bGwgPyBuZXcgUGFyY2VsRmlsZURlc2NyaXB0b3IoZmQpIDogbnVsbDsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBSZXRyaWV2ZSB0aGUgYWN0dWFsIEZpbGVEZXNjcmlwdG9yIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG9iamVjdC4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIEZpbGVEZXNjcmlwdG9yIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG9iamVjdC4KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL29zL3N0b3JhZ2UvU3RvcmFnZUV2ZW50TGlzdGVuZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL29zL3N0b3JhZ2UvU3RvcmFnZUV2ZW50TGlzdGVuZXIuamF2YQppbmRleCA3Yjg4M2E3Li5kM2QzOWQ2IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9vcy9zdG9yYWdlL1N0b3JhZ2VFdmVudExpc3RlbmVyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvb3Mvc3RvcmFnZS9TdG9yYWdlRXZlbnRMaXN0ZW5lci5qYXZhCkBAIC0xOCw3ICsxOCw2IEBACiAKIC8qKgogICogVXNlZCBmb3IgcmVjZWl2aW5nIG5vdGlmaWNhdGlvbnMgZnJvbSB0aGUgU3RvcmFnZU1hbmFnZXIKLSAqIEBoaWRlCiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTdG9yYWdlRXZlbnRMaXN0ZW5lciB7CiAgICAgLyoqCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9vcy9zdG9yYWdlL1N0b3JhZ2VNYW5hZ2VyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9vcy9zdG9yYWdlL1N0b3JhZ2VNYW5hZ2VyLmphdmEKaW5kZXggZGYwYjY5Yy4uNGEwMjk2YiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvb3Mvc3RvcmFnZS9TdG9yYWdlTWFuYWdlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL29zL3N0b3JhZ2UvU3RvcmFnZU1hbmFnZXIuamF2YQpAQCAtMzAsNiArMzAsNyBAQAogICogR2V0IGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgYnkgY2FsbGluZwogICoge0BsaW5rIGFuZHJvaWQuY29udGVudC5Db250ZXh0I2dldFN5c3RlbVNlcnZpY2UoamF2YS5sYW5nLlN0cmluZyl9IHdpdGggYW4gYXJndW1lbnQKICAqIG9mIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCNTVE9SQUdFX1NFUlZJQ0V9LgorICoKICAqLwogCiBwdWJsaWMgY2xhc3MgU3RvcmFnZU1hbmFnZXIKQEAgLTIwMyw3ICsyMDQsNiBAQAogICAgICAqCiAgICAgICogQHBhcmFtIGxpc3RlbmVyIEEge0BsaW5rIGFuZHJvaWQub3Muc3RvcmFnZS5TdG9yYWdlRXZlbnRMaXN0ZW5lciBTdG9yYWdlRXZlbnRMaXN0ZW5lcn0gb2JqZWN0LgogICAgICAqCi0gICAgICogQGhpZGUKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCByZWdpc3Rlckxpc3RlbmVyKFN0b3JhZ2VFdmVudExpc3RlbmVyIGxpc3RlbmVyKSB7CiAgICAgICAgIGlmIChsaXN0ZW5lciA9PSBudWxsKSB7CkBAIC0yMjAsNyArMjIwLDYgQEAKICAgICAgKgogICAgICAqIEBwYXJhbSBsaXN0ZW5lciBBIHtAbGluayBhbmRyb2lkLm9zLnN0b3JhZ2UuU3RvcmFnZUV2ZW50TGlzdGVuZXIgU3RvcmFnZUV2ZW50TGlzdGVuZXJ9IG9iamVjdC4KICAgICAgKgotICAgICAqIEBoaWRlCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgdW5yZWdpc3Rlckxpc3RlbmVyKFN0b3JhZ2VFdmVudExpc3RlbmVyIGxpc3RlbmVyKSB7CiAgICAgICAgIGlmIChsaXN0ZW5lciA9PSBudWxsKSB7CkBAIC0yNDEsOCArMjQwLDYgQEAKIAogICAgIC8qKgogICAgICAqIEVuYWJsZXMgVVNCIE1hc3MgU3RvcmFnZSAoVU1TKSBvbiB0aGUgZGV2aWNlLgotICAgICAqCi0gICAgICogQGhpZGUKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBlbmFibGVVc2JNYXNzU3RvcmFnZSgpIHsKICAgICAgICAgdHJ5IHsKQEAgLTI1NCw4ICsyNTEsNiBAQAogCiAgICAgLyoqCiAgICAgICogRGlzYWJsZXMgVVNCIE1hc3MgU3RvcmFnZSAoVU1TKSBvbiB0aGUgZGV2aWNlLgotICAgICAqCi0gICAgICogQGhpZGUKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBkaXNhYmxlVXNiTWFzc1N0b3JhZ2UoKSB7CiAgICAgICAgIHRyeSB7CkBAIC0yNjgsOCArMjYzLDYgQEAKICAgICAvKioKICAgICAgKiBRdWVyeSBpZiBhIFVTQiBNYXNzIFN0b3JhZ2UgKFVNUykgaG9zdCBpcyBjb25uZWN0ZWQuCiAgICAgICogQHJldHVybiB0cnVlIGlmIFVNUyBob3N0IGlzIGNvbm5lY3RlZC4KLSAgICAgKgotICAgICAqIEBoaWRlCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNVc2JNYXNzU3RvcmFnZUNvbm5lY3RlZCgpIHsKICAgICAgICAgdHJ5IHsKQEAgLTI4Myw4ICsyNzYsNiBAQAogICAgIC8qKgogICAgICAqIFF1ZXJ5IGlmIGEgVVNCIE1hc3MgU3RvcmFnZSAoVU1TKSBpcyBlbmFibGVkIG9uIHRoZSBkZXZpY2UuCiAgICAgICogQHJldHVybiB0cnVlIGlmIFVNUyBob3N0IGlzIGVuYWJsZWQuCi0gICAgICoKLSAgICAgKiBAaGlkZQogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzVXNiTWFzc1N0b3JhZ2VFbmFibGVkKCkgewogICAgICAgICB0cnkgewpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvb3Mvc3RvcmFnZS9TdG9yYWdlUmVzdWx0Q29kZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvb3Mvc3RvcmFnZS9TdG9yYWdlUmVzdWx0Q29kZS5qYXZhCmluZGV4IDA3NWY0N2YuLjA3ZDk1ZGYgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL29zL3N0b3JhZ2UvU3RvcmFnZVJlc3VsdENvZGUuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9vcy9zdG9yYWdlL1N0b3JhZ2VSZXN1bHRDb2RlLmphdmEKQEAgLTE5LDggKzE5LDYgQEAKIC8qKgogICogQ2xhc3MgdGhhdCBwcm92aWRlcyBhY2Nlc3MgdG8gY29uc3RhbnRzIHJldHVybmVkIGZyb20gU3RvcmFnZU1hbmFnZXIKICAqIGFuZCBsb3dlciBsZXZlbCBNb3VudFNlcnZpY2UgQVBJcy4KLSAqCi0gKiBAaGlkZQogICovCiBwdWJsaWMgY2xhc3MgU3RvcmFnZVJlc3VsdENvZGUKIHsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS9SZWN1cnJlbmNlU2V0LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9waW0vUmVjdXJyZW5jZVNldC5qYXZhCmluZGV4IDYzNTMyM2UuLjI4MjQxN2QgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS9SZWN1cnJlbmNlU2V0LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvcGltL1JlY3VycmVuY2VTZXQuamF2YQpAQCAtMTgxLDcgKzE4MSw5IEBACiAgICAgICAgIGJvb2xlYW4gaW5VdGMgPSBzdGFydC5wYXJzZShkdHN0YXJ0KTsKICAgICAgICAgYm9vbGVhbiBhbGxEYXkgPSBzdGFydC5hbGxEYXk7CiAKLSAgICAgICAgaWYgKGluVXRjKSB7CisgICAgICAgIC8vIFdlIGZvcmNlIFRpbWVab25lIHRvIFVUQyBmb3IgImFsbCBkYXkgcmVjdXJyaW5nIGV2ZW50cyIgYXMgdGhlIHNlcnZlciBpcyBzZW5kaW5nIG5vCisgICAgICAgIC8vIFRpbWVab25lIGluIERUU1RBUlQgZm9yIHRoZW0KKyAgICAgICAgaWYgKGluVXRjIHx8IGFsbERheSkgewogICAgICAgICAgICAgdHppZCA9IFRpbWUuVElNRVpPTkVfVVRDOwogICAgICAgICB9CiAgICAgICAgICAgICAgICAgCkBAIC0yMDQsMTAgKzIwNiw3IEBACiAgICAgICAgIH0KICAgICAgICAgCiAgICAgICAgIGlmIChhbGxEYXkpIHsKLSAgICAgICAgCS8vIFRPRE86IGFsc28gY2hhbmdlIHR6aWQgdG8gYmUgVVRDPyAgdGhhdCB3b3VsZCBiZSBjb25zaXN0ZW50LCBidXQKLSAgICAgICAgCS8vIHRoYXQgd291bGQgbm90IHJlZmxlY3QgdGhlIG9yaWdpbmFsIHRpbWV6b25lIHZhbHVlIGJhY2sgdG8gdGhlCi0gICAgICAgIAkvLyBzZXJ2ZXIuCi0gICAgICAgIAlzdGFydC50aW1lem9uZSA9IFRpbWUuVElNRVpPTkVfVVRDOworICAgICAgICAgICAgc3RhcnQudGltZXpvbmUgPSBUaW1lLlRJTUVaT05FX1VUQzsKICAgICAgICAgfQogICAgICAgICBsb25nIG1pbGxpcyA9IHN0YXJ0LnRvTWlsbGlzKGZhbHNlIC8qIHVzZSBpc0RzdCAqLyk7CiAgICAgICAgIHZhbHVlcy5wdXQoQ2FsZW5kYXIuRXZlbnRzLkRUU1RBUlQsIG1pbGxpcyk7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvSmFwYW5lc2VVdGlscy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL0phcGFuZXNlVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODc1YzI5ZS4uMDAwMDAwMAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvSmFwYW5lc2VVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzgwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBUZXh0VXRpbHMgZXNwZWNpYWxseSBmb3IgSmFwYW5lc2UuCi0gKi8KLS8qIHBhY2thZ2UgKi8gY2xhc3MgSmFwYW5lc2VVdGlscyB7Ci0gICAgc3RhdGljIHByaXZhdGUgZmluYWwgTWFwPENoYXJhY3RlciwgU3RyaW5nPiBzSGFsZldpZHRoTWFwID0KLSAgICAgICAgbmV3IEhhc2hNYXA8Q2hhcmFjdGVyLCBTdHJpbmc+KCk7Ci0KLSAgICBzdGF0aWMgewotICAgICAgICAvLyBUaGVyZSdzIG5vIGxvZ2ljYWwgbWFwcGluZyBydWxlIGluIFVuaWNvZGUuIFNpZ2guCi0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwMDEnLCAiXHVGRjY0Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwMDInLCAiXHVGRjYxIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwMEMnLCAiXHVGRjYyIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwMEQnLCAiXHVGRjYzIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwMUMnLCAifiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDQxJywgIlx1RkY2NyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDQyJywgIlx1RkY3MSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDQzJywgIlx1RkY2OCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDQ0JywgIlx1RkY3MiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDQ1JywgIlx1RkY2OSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDQ2JywgIlx1RkY3MyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDQ3JywgIlx1RkY2QSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDQ4JywgIlx1RkY3NCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDQ5JywgIlx1RkY2QiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDRBJywgIlx1RkY3NSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDRCJywgIlx1RkY3NiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDRDJywgIlx1RkY3Nlx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDREJywgIlx1RkY3NyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDRFJywgIlx1RkY3N1x1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDRGJywgIlx1RkY3OCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDUwJywgIlx1RkY3OFx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDUxJywgIlx1RkY3OSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDUyJywgIlx1RkY3OVx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDUzJywgIlx1RkY3QSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDU0JywgIlx1RkY3QVx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDU1JywgIlx1RkY3QiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDU2JywgIlx1RkY3Qlx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDU3JywgIlx1RkY3QyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDU4JywgIlx1RkY3Q1x1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDU5JywgIlx1RkY3RCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDVBJywgIlx1RkY3RFx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDVCJywgIlx1RkY3RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDVDJywgIlx1RkY3RVx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDVEJywgIlx1RkY3RiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDVFJywgIlx1RkY3Rlx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDVGJywgIlx1RkY4MCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDYwJywgIlx1RkY4MFx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDYxJywgIlx1RkY4MSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDYyJywgIlx1RkY4MVx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDYzJywgIlx1RkY2RiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDY0JywgIlx1RkY4MiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDY1JywgIlx1RkY4Mlx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDY2JywgIlx1RkY4MyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDY3JywgIlx1RkY4M1x1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDY4JywgIlx1RkY4NCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDY5JywgIlx1RkY4NFx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDZBJywgIlx1RkY4NSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDZCJywgIlx1RkY4NiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDZDJywgIlx1RkY4NyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDZEJywgIlx1RkY4OCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDZFJywgIlx1RkY4OSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDZGJywgIlx1RkY4QSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDcwJywgIlx1RkY4QVx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDcxJywgIlx1RkY4QVx1RkY5RiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDcyJywgIlx1RkY4QiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDczJywgIlx1RkY4Qlx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDc0JywgIlx1RkY4Qlx1RkY5RiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDc1JywgIlx1RkY4QyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDc2JywgIlx1RkY4Q1x1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDc3JywgIlx1RkY4Q1x1RkY5RiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDc4JywgIlx1RkY4RCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDc5JywgIlx1RkY4RFx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDdBJywgIlx1RkY4RFx1RkY5RiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDdCJywgIlx1RkY4RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDdDJywgIlx1RkY4RVx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDdEJywgIlx1RkY4RVx1RkY5RiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDdFJywgIlx1RkY4RiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDdGJywgIlx1RkY5MCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDgwJywgIlx1RkY5MSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDgxJywgIlx1RkY5MiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDgyJywgIlx1RkY5MyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDgzJywgIlx1RkY2QyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDg0JywgIlx1RkY5NCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDg1JywgIlx1RkY2RCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDg2JywgIlx1RkY5NSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDg3JywgIlx1RkY2RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDg4JywgIlx1RkY5NiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDg5JywgIlx1RkY5NyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDhBJywgIlx1RkY5OCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDhCJywgIlx1RkY5OSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDhDJywgIlx1RkY5QSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDhEJywgIlx1RkY5QiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDhFJywgIlx1RkY5QyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDhGJywgIlx1RkY5QyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDkwJywgIlx1RkY3MiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDkxJywgIlx1RkY3NCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDkyJywgIlx1RkY2NiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDkzJywgIlx1RkY5RCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDlCJywgIlx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDlDJywgIlx1RkY5RiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEExJywgIlx1RkY2NyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEEyJywgIlx1RkY3MSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEEzJywgIlx1RkY2OCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEE0JywgIlx1RkY3MiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEE1JywgIlx1RkY2OSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEE2JywgIlx1RkY3MyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEE3JywgIlx1RkY2QSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEE4JywgIlx1RkY3NCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEE5JywgIlx1RkY2QiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEFBJywgIlx1RkY3NSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEFCJywgIlx1RkY3NiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEFDJywgIlx1RkY3Nlx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEFEJywgIlx1RkY3NyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEFFJywgIlx1RkY3N1x1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEFGJywgIlx1RkY3OCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEIwJywgIlx1RkY3OFx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEIxJywgIlx1RkY3OSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEIyJywgIlx1RkY3OVx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEIzJywgIlx1RkY3QSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEI0JywgIlx1RkY3QVx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEI1JywgIlx1RkY3QiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEI2JywgIlx1RkY3Qlx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEI3JywgIlx1RkY3QyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEI4JywgIlx1RkY3Q1x1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEI5JywgIlx1RkY3RCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEJBJywgIlx1RkY3RFx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEJCJywgIlx1RkY3RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEJDJywgIlx1RkY3RVx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEJEJywgIlx1RkY3RiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEJFJywgIlx1RkY3Rlx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEJGJywgIlx1RkY4MCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEMwJywgIlx1RkY4MFx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEMxJywgIlx1RkY4MSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEMyJywgIlx1RkY4MVx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEMzJywgIlx1RkY2RiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEM0JywgIlx1RkY4MiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEM1JywgIlx1RkY4Mlx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEM2JywgIlx1RkY4MyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEM3JywgIlx1RkY4M1x1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEM4JywgIlx1RkY4NCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEM5JywgIlx1RkY4NFx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMENBJywgIlx1RkY4NSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMENCJywgIlx1RkY4NiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMENDJywgIlx1RkY4NyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMENEJywgIlx1RkY4OCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMENFJywgIlx1RkY4OSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMENGJywgIlx1RkY4QSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEQwJywgIlx1RkY4QVx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEQxJywgIlx1RkY4QVx1RkY5RiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEQyJywgIlx1RkY4QiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEQzJywgIlx1RkY4Qlx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEQ0JywgIlx1RkY4Qlx1RkY5RiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEQ1JywgIlx1RkY4QyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEQ2JywgIlx1RkY4Q1x1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEQ3JywgIlx1RkY4Q1x1RkY5RiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEQ4JywgIlx1RkY4RCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEQ5JywgIlx1RkY4RFx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMERBJywgIlx1RkY4RFx1RkY5RiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMERCJywgIlx1RkY4RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMERDJywgIlx1RkY4RVx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEREJywgIlx1RkY4RVx1RkY5RiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMERFJywgIlx1RkY4RiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMERGJywgIlx1RkY5MCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEUwJywgIlx1RkY5MSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEUxJywgIlx1RkY5MiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEUyJywgIlx1RkY5MyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEUzJywgIlx1RkY2QyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEU0JywgIlx1RkY5NCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEU1JywgIlx1RkY2RCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEU2JywgIlx1RkY5NSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEU3JywgIlx1RkY2RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEU4JywgIlx1RkY5NiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEU5JywgIlx1RkY5NyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEVBJywgIlx1RkY5OCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEVCJywgIlx1RkY5OSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEVDJywgIlx1RkY5QSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEVEJywgIlx1RkY5QiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEVFJywgIlx1RkY5QyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEVGJywgIlx1RkY5QyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEYwJywgIlx1RkY3MiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEYxJywgIlx1RkY3NCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEYyJywgIlx1RkY2NiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEYzJywgIlx1RkY5RCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEY0JywgIlx1RkY3M1x1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEY1JywgIlx1RkY3NiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEY2JywgIlx1RkY3OSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEZCJywgIlx1RkY2NSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEZDJywgIlx1RkY3MCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjAxJywgIiEiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYwMicsICJcIiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjAzJywgIiMiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYwNCcsICIkIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMDUnLCAiJSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjA2JywgIiYiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYwNycsICInIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMDgnLCAiKCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjA5JywgIikiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYwQScsICIqIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMEInLCAiKyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjBDJywgIiwiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYwRCcsICItIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMEUnLCAiLiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjBGJywgIi8iKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYxMCcsICIwIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMTEnLCAiMSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjEyJywgIjIiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYxMycsICIzIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMTQnLCAiNCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjE1JywgIjUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYxNicsICI2Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMTcnLCAiNyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjE4JywgIjgiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYxOScsICI5Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMUEnLCAiOiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjFCJywgIjsiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYxQycsICI8Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMUQnLCAiPSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjFFJywgIj4iKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYxRicsICI/Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMjAnLCAiQCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjIxJywgIkEiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYyMicsICJCIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMjMnLCAiQyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjI0JywgIkQiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYyNScsICJFIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMjYnLCAiRiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjI3JywgIkciKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYyOCcsICJIIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMjknLCAiSSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjJBJywgIkoiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYyQicsICJLIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMkMnLCAiTCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjJEJywgIk0iKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYyRScsICJOIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMkYnLCAiTyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjMwJywgIlAiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYzMScsICJRIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMzInLCAiUiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjMzJywgIlMiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYzNCcsICJUIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMzUnLCAiVSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjM2JywgIlYiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYzNycsICJXIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMzgnLCAiWCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjM5JywgIlkiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYzQScsICJaIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGM0InLCAiWyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjNDJywgIlxcIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGM0QnLCAiXSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjNFJywgIl4iKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYzRicsICJfIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNDEnLCAiYSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjQyJywgImIiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY0MycsICJjIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNDQnLCAiZCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjQ1JywgImUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY0NicsICJmIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNDcnLCAiZyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjQ4JywgImgiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY0OScsICJpIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNEEnLCAiaiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjRCJywgImsiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY0QycsICJsIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNEQnLCAibSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjRFJywgIm4iKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY0RicsICJvIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNTAnLCAicCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjUxJywgInEiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY1MicsICJyIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNTMnLCAicyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjU0JywgInQiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY1NScsICJ1Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNTYnLCAidiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjU3JywgInciKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY1OCcsICJ4Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNTknLCAieSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjVBJywgInoiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY1QicsICJ7Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNUMnLCAifCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjVEJywgIn0iKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY1RScsICJ+Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNjEnLCAiXHVGRjYxIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNjInLCAiXHVGRjYyIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNjMnLCAiXHVGRjYzIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNjQnLCAiXHVGRjY0Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNjUnLCAiXHVGRjY1Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNjYnLCAiXHVGRjY2Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNjcnLCAiXHVGRjY3Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNjgnLCAiXHVGRjY4Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNjknLCAiXHVGRjY5Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNkEnLCAiXHVGRjZBIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNkInLCAiXHVGRjZCIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNkMnLCAiXHVGRjZDIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNkQnLCAiXHVGRjZEIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNkUnLCAiXHVGRjZFIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNkYnLCAiXHVGRjZGIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNzAnLCAiXHVGRjcwIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNzEnLCAiXHVGRjcxIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNzInLCAiXHVGRjcyIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNzMnLCAiXHVGRjczIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNzQnLCAiXHVGRjc0Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNzUnLCAiXHVGRjc1Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNzYnLCAiXHVGRjc2Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNzcnLCAiXHVGRjc3Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNzgnLCAiXHVGRjc4Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNzknLCAiXHVGRjc5Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGN0EnLCAiXHVGRjdBIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGN0InLCAiXHVGRjdCIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGN0MnLCAiXHVGRjdDIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGN0QnLCAiXHVGRjdEIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGN0UnLCAiXHVGRjdFIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGN0YnLCAiXHVGRjdGIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGODAnLCAiXHVGRjgwIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGODEnLCAiXHVGRjgxIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGODInLCAiXHVGRjgyIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGODMnLCAiXHVGRjgzIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGODQnLCAiXHVGRjg0Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGODUnLCAiXHVGRjg1Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGODYnLCAiXHVGRjg2Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGODcnLCAiXHVGRjg3Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGODgnLCAiXHVGRjg4Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGODknLCAiXHVGRjg5Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGOEEnLCAiXHVGRjhBIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGOEInLCAiXHVGRjhCIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGOEMnLCAiXHVGRjhDIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGOEQnLCAiXHVGRjhEIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGOEUnLCAiXHVGRjhFIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGOEYnLCAiXHVGRjhGIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGOTAnLCAiXHVGRjkwIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGOTEnLCAiXHVGRjkxIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGOTInLCAiXHVGRjkyIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGOTMnLCAiXHVGRjkzIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGOTQnLCAiXHVGRjk0Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGOTUnLCAiXHVGRjk1Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGOTYnLCAiXHVGRjk2Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGOTcnLCAiXHVGRjk3Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGOTgnLCAiXHVGRjk4Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGOTknLCAiXHVGRjk5Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGOUEnLCAiXHVGRjlBIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGOUInLCAiXHVGRjlCIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGOUMnLCAiXHVGRjlDIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGOUQnLCAiXHVGRjlEIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGOUUnLCAiXHVGRjlFIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGOUYnLCAiXHVGRjlGIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGRTUnLCAiXHUwMDVDXHUwMDVDIik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIGhhbGYtd2lkdGggdmVyc2lvbiBvZiB0aGF0IGNoYXJhY3RlciBpZiBwb3NzaWJsZS4gUmV0dXJuIG51bGwgaWYgbm90IHBvc3NpYmxlCi0gICAgICogQHBhcmFtIGNoIGlucHV0IGNoYXJhY3RlcgotICAgICAqIEByZXR1cm4gQ2hhclNlcXVlbmNlIG9iamVjdCBpZiB0aGUgbWFwcGluZyBmb3IgY2ggZXhpc3RzLiBSZXR1cm4gbnVsbCBvdGhlcndpc2UuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgdHJ5R2V0SGFsZldpZHRoVGV4dChjaGFyIGNoKSB7Ci0gICAgICAgIGlmIChzSGFsZldpZHRoTWFwLmNvbnRhaW5zS2V5KGNoKSkgewotICAgICAgICAgICAgcmV0dXJuIHNIYWxmV2lkdGhNYXAuZ2V0KGNoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkQnVpbGRlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkQnVpbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjM0NjcyLi4wMDAwMDAwCi0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZEJ1aWxkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NDQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90Ci0gKiB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotICogdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCi0gKiBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKLSAqIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCi0gKiB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZDsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuRW1haWw7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5FdmVudDsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLkltOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuTmlja25hbWU7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5Ob3RlOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuT3JnYW5pemF0aW9uOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuUGhvbmU7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5QaG90bzsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLlJlbGF0aW9uOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuU3RydWN0dXJlZE5hbWU7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5TdHJ1Y3R1cmVkUG9zdGFsOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuV2Vic2l0ZTsKLWltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5QaG9uZU51bWJlclV0aWxzOwotaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkNoYXJzZXRVdGlsczsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvZGVjLmJpbmFyeS5CYXNlNjQ7Ci0KLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uaW8uY2hhcnNldC5VbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogVGhlIGNsYXNzIHdoaWNoIGxldHMgdXNlcnMgY3JlYXRlIHRoZWlyIG93biB2Q2FyZCBTdHJpbmcuCi0gKi8KLXB1YmxpYyBjbGFzcyBWQ2FyZEJ1aWxkZXIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIlZDYXJkQnVpbGRlciI7Ci0KLSAgICAvLyBJZiB5b3UgYWRkIHRoZSBvdGhlciBlbGVtZW50LCBwbGVhc2UgY2hlY2sgYWxsIHRoZSBjb2x1bW5zIGFyZSBhYmxlIHRvIGJlCi0gICAgLy8gY29udmVydGVkIHRvIFN0cmluZy4KLSAgICAvLwotICAgIC8vIGUuZy4gQkxPQiBpcyBub3Qgd2hhdCB3ZSBjYW4gaGFuZGxlIGhlcmUgbm93LgotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNldDxTdHJpbmc+IHNBbGxvd2VkQW5kcm9pZFByb3BlcnR5U2V0ID0KLSAgICAgICAgICAgIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNldChuZXcgSGFzaFNldDxTdHJpbmc+KEFycmF5cy5hc0xpc3QoCi0gICAgICAgICAgICAgICAgICAgIE5pY2tuYW1lLkNPTlRFTlRfSVRFTV9UWVBFLCBFdmVudC5DT05URU5UX0lURU1fVFlQRSwKLSAgICAgICAgICAgICAgICAgICAgUmVsYXRpb24uQ09OVEVOVF9JVEVNX1RZUEUpKSk7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX1BIT05FX1RZUEUgPSBQaG9uZS5UWVBFX0hPTUU7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9QT1NUQUxfVFlQRSA9IFN0cnVjdHVyZWRQb3N0YWwuVFlQRV9IT01FOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfRU1BSUxfVFlQRSA9IEVtYWlsLlRZUEVfT1RIRVI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkNBUkRfREFUQV9WQ0FSRCA9ICJWQ0FSRCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZDQVJEX0RBVEFfUFVCTElDID0gIlBVQkxJQyI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkNBUkRfUEFSQU1fU0VQQVJBVE9SID0gIjsiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWQ0FSRF9FTkRfT0ZfTElORSA9ICJcclxuIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkNBUkRfREFUQV9TRVBBUkFUT1IgPSAiOiI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZDQVJEX0lURU1fU0VQQVJBVE9SID0gIjsiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWQ0FSRF9XUyA9ICIgIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkNBUkRfUEFSQU1fRVFVQUwgPSAiPSI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkNBUkRfUEFSQU1fRU5DT0RJTkdfUVAgPSAiRU5DT0RJTkc9UVVPVEVELVBSSU5UQUJMRSI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkNBUkRfUEFSQU1fRU5DT0RJTkdfQkFTRTY0X1YyMSA9ICJFTkNPRElORz1CQVNFNjQiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWQ0FSRF9QQVJBTV9FTkNPRElOR19CQVNFNjRfVjMwID0gIkVOQ09ESU5HPWIiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNISUZUX0pJUyA9ICJTSElGVF9KSVMiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVVEZfOCA9ICJVVEYtOCI7Ci0KLSAgICBwcml2YXRlIGZpbmFsIGludCBtVkNhcmRUeXBlOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1Jc1YzMDsKLSAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gbUlzSmFwYW5lc2VNb2JpbGVQaG9uZTsKLSAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gbU9ubHlPbmVOb3RlRmllbGRJc0F2YWlsYWJsZTsKLSAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gbUlzRG9Db01vOwotICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBtU2hvdWxkVXNlUXVvdGVkUHJpbnRhYmxlOwotICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBtVXNlc0FuZHJvaWRQcm9wZXJ0eTsKLSAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gbVVzZXNEZWZhY3RQcm9wZXJ0eTsKLSAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gbVVzZXNVdGY4OwotICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBtVXNlc1NoaWZ0SmlzOwotICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBtQXBwZW5kVHlwZVBhcmFtTmFtZTsKLSAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gbVJlZnJhaW5zUVBUb05hbWVQcm9wZXJ0aWVzOwotICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBtTmVlZHNUb0NvbnZlcnRQaG9uZXRpY1N0cmluZzsKLQotICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBtU2hvdWxkQXBwZW5kQ2hhcnNldFBhcmFtOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbUNoYXJzZXRTdHJpbmc7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbVZDYXJkQ2hhcnNldFBhcmFtZXRlcjsKLQotICAgIHByaXZhdGUgU3RyaW5nQnVpbGRlciBtQnVpbGRlcjsKLSAgICBwcml2YXRlIGJvb2xlYW4gbUVuZEFwcGVuZGVkOwotCi0gICAgcHVibGljIFZDYXJkQnVpbGRlcihmaW5hbCBpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIG1WQ2FyZFR5cGUgPSB2Y2FyZFR5cGU7Ci0KLSAgICAgICAgbUlzVjMwID0gVkNhcmRDb25maWcuaXNWMzAodmNhcmRUeXBlKTsKLSAgICAgICAgbVNob3VsZFVzZVF1b3RlZFByaW50YWJsZSA9IFZDYXJkQ29uZmlnLnNob3VsZFVzZVF1b3RlZFByaW50YWJsZSh2Y2FyZFR5cGUpOwotICAgICAgICBtSXNEb0NvTW8gPSBWQ2FyZENvbmZpZy5pc0RvQ29Nbyh2Y2FyZFR5cGUpOwotICAgICAgICBtSXNKYXBhbmVzZU1vYmlsZVBob25lID0gVkNhcmRDb25maWcubmVlZHNUb0NvbnZlcnRQaG9uZXRpY1N0cmluZyh2Y2FyZFR5cGUpOwotICAgICAgICBtT25seU9uZU5vdGVGaWVsZElzQXZhaWxhYmxlID0gVkNhcmRDb25maWcub25seU9uZU5vdGVGaWVsZElzQXZhaWxhYmxlKHZjYXJkVHlwZSk7Ci0gICAgICAgIG1Vc2VzQW5kcm9pZFByb3BlcnR5ID0gVkNhcmRDb25maWcudXNlc0FuZHJvaWRTcGVjaWZpY1Byb3BlcnR5KHZjYXJkVHlwZSk7Ci0gICAgICAgIG1Vc2VzRGVmYWN0UHJvcGVydHkgPSBWQ2FyZENvbmZpZy51c2VzRGVmYWN0UHJvcGVydHkodmNhcmRUeXBlKTsKLSAgICAgICAgbVVzZXNVdGY4ID0gVkNhcmRDb25maWcudXNlc1V0ZjgodmNhcmRUeXBlKTsKLSAgICAgICAgbVVzZXNTaGlmdEppcyA9IFZDYXJkQ29uZmlnLnVzZXNTaGlmdEppcyh2Y2FyZFR5cGUpOwotICAgICAgICBtUmVmcmFpbnNRUFRvTmFtZVByb3BlcnRpZXMgPSBWQ2FyZENvbmZpZy5zaG91bGRSZWZyYWluUVBUb05hbWVQcm9wZXJ0aWVzKHZjYXJkVHlwZSk7Ci0gICAgICAgIG1BcHBlbmRUeXBlUGFyYW1OYW1lID0gVkNhcmRDb25maWcuYXBwZW5kVHlwZVBhcmFtTmFtZSh2Y2FyZFR5cGUpOwotICAgICAgICBtTmVlZHNUb0NvbnZlcnRQaG9uZXRpY1N0cmluZyA9IFZDYXJkQ29uZmlnLm5lZWRzVG9Db252ZXJ0UGhvbmV0aWNTdHJpbmcodmNhcmRUeXBlKTsKLQotICAgICAgICBtU2hvdWxkQXBwZW5kQ2hhcnNldFBhcmFtID0gIShtSXNWMzAgJiYgbVVzZXNVdGY4KTsKLQotICAgICAgICBpZiAobUlzRG9Db01vKSB7Ci0gICAgICAgICAgICBTdHJpbmcgY2hhcnNldDsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgY2hhcnNldCA9IENoYXJzZXRVdGlscy5jaGFyc2V0Rm9yVmVuZG9yKFNISUZUX0pJUywgImRvY29tbyIpLm5hbWUoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkQ2hhcnNldEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIkRvQ29Nby1zcGVjaWZpYyBTSElGVF9KSVMgd2FzIG5vdCBmb3VuZC4gVXNlIFNISUZUX0pJUyBhcyBpcy4iKTsKLSAgICAgICAgICAgICAgICBjaGFyc2V0ID0gU0hJRlRfSklTOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUNoYXJzZXRTdHJpbmcgPSBjaGFyc2V0OwotICAgICAgICAgICAgLy8gRG8gbm90IHVzZSBtQ2hhcnNldFN0cmluZyBiZWxsb3cgc2luY2UgaXQgaXMgZGlmZmVyZW50IGZyb20gIlNISUZUX0pJUyIgYnV0Ci0gICAgICAgICAgICAvLyBtYXkgYmUgIkRPQ09NT19TSElGVF9KSVMiIG9yIHNvbWV0aGluZyBsaWtlIHRoYXQgKGludGVybmFsIGV4cHJlc3Npb24gdXNlZCBpbgotICAgICAgICAgICAgLy8gQW5kcm9pZCwgbm90IHNob3duIHRvIHRoZSBwdWJsaWMpLgotICAgICAgICAgICAgbVZDYXJkQ2hhcnNldFBhcmFtZXRlciA9ICJDSEFSU0VUPSIgKyBTSElGVF9KSVM7Ci0gICAgICAgIH0gZWxzZSBpZiAobVVzZXNTaGlmdEppcykgewotICAgICAgICAgICAgU3RyaW5nIGNoYXJzZXQ7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGNoYXJzZXQgPSBDaGFyc2V0VXRpbHMuY2hhcnNldEZvclZlbmRvcihTSElGVF9KSVMpLm5hbWUoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkQ2hhcnNldEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIlZlbmRvci1zcGVjaWZpYyBTSElGVF9KSVMgd2FzIG5vdCBmb3VuZC4gVXNlIFNISUZUX0pJUyBhcyBpcy4iKTsKLSAgICAgICAgICAgICAgICBjaGFyc2V0ID0gU0hJRlRfSklTOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUNoYXJzZXRTdHJpbmcgPSBjaGFyc2V0OwotICAgICAgICAgICAgbVZDYXJkQ2hhcnNldFBhcmFtZXRlciA9ICJDSEFSU0VUPSIgKyBTSElGVF9KSVM7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtQ2hhcnNldFN0cmluZyA9IFVURl84OwotICAgICAgICAgICAgbVZDYXJkQ2hhcnNldFBhcmFtZXRlciA9ICJDSEFSU0VUPSIgKyBVVEZfODsKLSAgICAgICAgfQotICAgICAgICBjbGVhcigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgewotICAgICAgICBtQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIG1FbmRBcHBlbmRlZCA9IGZhbHNlOwotICAgICAgICBhcHBlbmRMaW5lKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX0JFR0lOLCBWQ0FSRF9EQVRBX1ZDQVJEKTsKLSAgICAgICAgaWYgKG1Jc1YzMCkgewotICAgICAgICAgICAgYXBwZW5kTGluZShWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9WRVJTSU9OLCBWQ2FyZENvbnN0YW50cy5WRVJTSU9OX1YzMCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBhcHBlbmRMaW5lKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1ZFUlNJT04sIFZDYXJkQ29uc3RhbnRzLlZFUlNJT05fVjIxKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBjb250YWluc05vbkVtcHR5TmFtZShmaW5hbCBDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXMpIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIGZhbWlseU5hbWUgPSBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKFN0cnVjdHVyZWROYW1lLkZBTUlMWV9OQU1FKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIG1pZGRsZU5hbWUgPSBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKFN0cnVjdHVyZWROYW1lLk1JRERMRV9OQU1FKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIGdpdmVuTmFtZSA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoU3RydWN0dXJlZE5hbWUuR0lWRU5fTkFNRSk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBwcmVmaXggPSBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKFN0cnVjdHVyZWROYW1lLlBSRUZJWCk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBzdWZmaXggPSBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKFN0cnVjdHVyZWROYW1lLlNVRkZJWCk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBwaG9uZXRpY0ZhbWlseU5hbWUgPQotICAgICAgICAgICAgICAgIGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfRkFNSUxZX05BTUUpOwotICAgICAgICBmaW5hbCBTdHJpbmcgcGhvbmV0aWNNaWRkbGVOYW1lID0KLSAgICAgICAgICAgICAgICBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKFN0cnVjdHVyZWROYW1lLlBIT05FVElDX01JRERMRV9OQU1FKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIHBob25ldGljR2l2ZW5OYW1lID0KLSAgICAgICAgICAgICAgICBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0dJVkVOX05BTUUpOwotICAgICAgICBmaW5hbCBTdHJpbmcgZGlzcGxheU5hbWUgPSBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKFN0cnVjdHVyZWROYW1lLkRJU1BMQVlfTkFNRSk7Ci0gICAgICAgIHJldHVybiAhKFRleHRVdGlscy5pc0VtcHR5KGZhbWlseU5hbWUpICYmIFRleHRVdGlscy5pc0VtcHR5KG1pZGRsZU5hbWUpICYmCi0gICAgICAgICAgICAgICAgVGV4dFV0aWxzLmlzRW1wdHkoZ2l2ZW5OYW1lKSAmJiBUZXh0VXRpbHMuaXNFbXB0eShwcmVmaXgpICYmCi0gICAgICAgICAgICAgICAgVGV4dFV0aWxzLmlzRW1wdHkoc3VmZml4KSAmJiBUZXh0VXRpbHMuaXNFbXB0eShwaG9uZXRpY0ZhbWlseU5hbWUpICYmCi0gICAgICAgICAgICAgICAgVGV4dFV0aWxzLmlzRW1wdHkocGhvbmV0aWNNaWRkbGVOYW1lKSAmJiBUZXh0VXRpbHMuaXNFbXB0eShwaG9uZXRpY0dpdmVuTmFtZSkgJiYKLSAgICAgICAgICAgICAgICBUZXh0VXRpbHMuaXNFbXB0eShkaXNwbGF5TmFtZSkpOwotICAgIH0KLQotICAgIHByaXZhdGUgQ29udGVudFZhbHVlcyBnZXRQcmltYXJ5Q29udGVudFZhbHVlKGZpbmFsIExpc3Q8Q29udGVudFZhbHVlcz4gY29udGVudFZhbHVlc0xpc3QpIHsKLSAgICAgICAgQ29udGVudFZhbHVlcyBwcmltYXJ5Q29udGVudFZhbHVlcyA9IG51bGw7Ci0gICAgICAgIENvbnRlbnRWYWx1ZXMgc3VicHJpbWFyeUNvbnRlbnRWYWx1ZXMgPSBudWxsOwotICAgICAgICBmb3IgKENvbnRlbnRWYWx1ZXMgY29udGVudFZhbHVlcyA6IGNvbnRlbnRWYWx1ZXNMaXN0KSB7Ci0gICAgICAgICAgICBpZiAoY29udGVudFZhbHVlcyA9PSBudWxsKXsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEludGVnZXIgaXNTdXBlclByaW1hcnkgPSBjb250ZW50VmFsdWVzLmdldEFzSW50ZWdlcihTdHJ1Y3R1cmVkTmFtZS5JU19TVVBFUl9QUklNQVJZKTsKLSAgICAgICAgICAgIGlmIChpc1N1cGVyUHJpbWFyeSAhPSBudWxsICYmIGlzU3VwZXJQcmltYXJ5ID4gMCkgewotICAgICAgICAgICAgICAgIC8vIFdlIGNob29zZSAic3VwZXIgcHJpbWFyeSIgQ29udGVudFZhbHVlcy4KLSAgICAgICAgICAgICAgICBwcmltYXJ5Q29udGVudFZhbHVlcyA9IGNvbnRlbnRWYWx1ZXM7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHByaW1hcnlDb250ZW50VmFsdWVzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBXZSBjaG9vc2UgdGhlIGZpcnN0ICJwcmltYXJ5IiBDb250ZW50VmFsdWVzCi0gICAgICAgICAgICAgICAgLy8gaWYgInN1cGVyIHByaW1hcnkiIENvbnRlbnRWYWx1ZXMgZG9lcyBub3QgZXhpc3QuCi0gICAgICAgICAgICAgICAgZmluYWwgSW50ZWdlciBpc1ByaW1hcnkgPSBjb250ZW50VmFsdWVzLmdldEFzSW50ZWdlcihTdHJ1Y3R1cmVkTmFtZS5JU19QUklNQVJZKTsKLSAgICAgICAgICAgICAgICBpZiAoaXNQcmltYXJ5ICE9IG51bGwgJiYgaXNQcmltYXJ5ID4gMCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbnNOb25FbXB0eU5hbWUoY29udGVudFZhbHVlcykpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJpbWFyeUNvbnRlbnRWYWx1ZXMgPSBjb250ZW50VmFsdWVzOwotICAgICAgICAgICAgICAgICAgICAvLyBEbyBub3QgYnJlYWssIHNpbmNlIHRoZXJlIG1heSBiZSBDb250ZW50VmFsdWVzIHdpdGggInN1cGVyIHByaW1hcnkiCi0gICAgICAgICAgICAgICAgICAgIC8vIGFmdGVyd29yZC4KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN1YnByaW1hcnlDb250ZW50VmFsdWVzID09IG51bGwgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5zTm9uRW1wdHlOYW1lKGNvbnRlbnRWYWx1ZXMpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN1YnByaW1hcnlDb250ZW50VmFsdWVzID0gY29udGVudFZhbHVlczsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocHJpbWFyeUNvbnRlbnRWYWx1ZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKHN1YnByaW1hcnlDb250ZW50VmFsdWVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBXZSBjaG9vc2UgdGhlIGZpcnN0IENvbnRlbnRWYWx1ZXMgaWYgYW55ICJwcmltYXJ5IiBDb250ZW50VmFsdWVzIGRvZXMgbm90IGV4aXN0LgotICAgICAgICAgICAgICAgIHByaW1hcnlDb250ZW50VmFsdWVzID0gc3VicHJpbWFyeUNvbnRlbnRWYWx1ZXM7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJBbGwgQ29udGVudFZhbHVlcyBnaXZlbiBmcm9tIGRhdGFiYXNlIGlzIGVtcHR5LiIpOwotICAgICAgICAgICAgICAgIHByaW1hcnlDb250ZW50VmFsdWVzID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBwcmltYXJ5Q29udGVudFZhbHVlczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGb3Igc2FmZXR5LCB3ZSdsbCBlbWl0IGp1c3Qgb25lIHZhbHVlIGFyb3VuZCBTdHJ1Y3R1cmVkTmFtZSwgYXMgZXh0ZXJuYWwgaW1wb3J0ZXJzCi0gICAgICogbWF5IGdldCBjb25mdXNlZCB3aXRoIG11bHRpcGxlICJOIiwgIkZOIiwgZXRjLiBwcm9wZXJ0aWVzLCB0aG91Z2ggaXQgaXMgdmFsaWQgaW4KLSAgICAgKiB2Q2FyZCBzcGVjLgotICAgICAqLwotICAgIHB1YmxpYyBWQ2FyZEJ1aWxkZXIgYXBwZW5kTmFtZVByb3BlcnRpZXMoZmluYWwgTGlzdDxDb250ZW50VmFsdWVzPiBjb250ZW50VmFsdWVzTGlzdCkgewotICAgICAgICBpZiAoY29udGVudFZhbHVlc0xpc3QgPT0gbnVsbCB8fCBjb250ZW50VmFsdWVzTGlzdC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIGlmIChtSXNEb0NvTW8pIHsKLSAgICAgICAgICAgICAgICBhcHBlbmRMaW5lKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX04sICIiKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobUlzVjMwKSB7Ci0gICAgICAgICAgICAgICAgLy8gdkNhcmQgMy4wIHJlcXVpcmVzICJOIiBhbmQgIkZOIiBwcm9wZXJ0aWVzLgotICAgICAgICAgICAgICAgIGFwcGVuZExpbmUoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfTiwgIiIpOwotICAgICAgICAgICAgICAgIGFwcGVuZExpbmUoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfRk4sICIiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzID0gZ2V0UHJpbWFyeUNvbnRlbnRWYWx1ZShjb250ZW50VmFsdWVzTGlzdCk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBmYW1pbHlOYW1lID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBtaWRkbGVOYW1lID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhTdHJ1Y3R1cmVkTmFtZS5NSURETEVfTkFNRSk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBnaXZlbk5hbWUgPSBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKFN0cnVjdHVyZWROYW1lLkdJVkVOX05BTUUpOwotICAgICAgICBmaW5hbCBTdHJpbmcgcHJlZml4ID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhTdHJ1Y3R1cmVkTmFtZS5QUkVGSVgpOwotICAgICAgICBmaW5hbCBTdHJpbmcgc3VmZml4ID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhTdHJ1Y3R1cmVkTmFtZS5TVUZGSVgpOwotICAgICAgICBmaW5hbCBTdHJpbmcgZGlzcGxheU5hbWUgPSBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKFN0cnVjdHVyZWROYW1lLkRJU1BMQVlfTkFNRSk7Ci0KLSAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShmYW1pbHlOYW1lKSB8fCAhVGV4dFV0aWxzLmlzRW1wdHkoZ2l2ZW5OYW1lKSkgewotICAgICAgICAgICAgZmluYWwgYm9vbGVhbiByZWFsbHlBcHBlbmRDaGFyc2V0UGFyYW1ldGVyVG9OYW1lID0KLSAgICAgICAgICAgICAgICAgICAgc2hvdWxkQXBwZW5kQ2hhcnNldFBhcmFtKGZhbWlseU5hbWUsIGdpdmVuTmFtZSwgbWlkZGxlTmFtZSwgcHJlZml4LCBzdWZmaXgpOwotICAgICAgICAgICAgZmluYWwgYm9vbGVhbiByZWFsbHlVc2VRdW90ZWRQcmludGFibGVUb05hbWUgPQotICAgICAgICAgICAgICAgICAgICAoIW1SZWZyYWluc1FQVG9OYW1lUHJvcGVydGllcyAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICEoVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkoZmFtaWx5TmFtZSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKGdpdmVuTmFtZSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKG1pZGRsZU5hbWUpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQ2FyZFV0aWxzLmNvbnRhaW5zT25seU5vbkNyTGZQcmludGFibGVBc2NpaShwcmVmaXgpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQ2FyZFV0aWxzLmNvbnRhaW5zT25seU5vbkNyTGZQcmludGFibGVBc2NpaShzdWZmaXgpKSk7Ci0KLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBmb3JtYXR0ZWROYW1lOwotICAgICAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShkaXNwbGF5TmFtZSkpIHsKLSAgICAgICAgICAgICAgICBmb3JtYXR0ZWROYW1lID0gZGlzcGxheU5hbWU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZvcm1hdHRlZE5hbWUgPSBWQ2FyZFV0aWxzLmNvbnN0cnVjdE5hbWVGcm9tRWxlbWVudHMoCi0gICAgICAgICAgICAgICAgICAgICAgICBWQ2FyZENvbmZpZy5nZXROYW1lT3JkZXJUeXBlKG1WQ2FyZFR5cGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgZmFtaWx5TmFtZSwgbWlkZGxlTmFtZSwgZ2l2ZW5OYW1lLCBwcmVmaXgsIHN1ZmZpeCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbCBib29sZWFuIHJlYWxseUFwcGVuZENoYXJzZXRQYXJhbWV0ZXJUb0ZOID0KLSAgICAgICAgICAgICAgICAgICAgc2hvdWxkQXBwZW5kQ2hhcnNldFBhcmFtKGZvcm1hdHRlZE5hbWUpOwotICAgICAgICAgICAgZmluYWwgYm9vbGVhbiByZWFsbHlVc2VRdW90ZWRQcmludGFibGVUb0ZOID0KLSAgICAgICAgICAgICAgICAgICAgIW1SZWZyYWluc1FQVG9OYW1lUHJvcGVydGllcyAmJgotICAgICAgICAgICAgICAgICAgICAhVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkoZm9ybWF0dGVkTmFtZSk7Ci0KLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBlbmNvZGVkRmFtaWx5OwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVuY29kZWRHaXZlbjsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBlbmNvZGVkTWlkZGxlOwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVuY29kZWRQcmVmaXg7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgZW5jb2RlZFN1ZmZpeDsKLSAgICAgICAgICAgIGlmIChyZWFsbHlVc2VRdW90ZWRQcmludGFibGVUb05hbWUpIHsKLSAgICAgICAgICAgICAgICBlbmNvZGVkRmFtaWx5ID0gZW5jb2RlUXVvdGVkUHJpbnRhYmxlKGZhbWlseU5hbWUpOwotICAgICAgICAgICAgICAgIGVuY29kZWRHaXZlbiA9IGVuY29kZVF1b3RlZFByaW50YWJsZShnaXZlbk5hbWUpOwotICAgICAgICAgICAgICAgIGVuY29kZWRNaWRkbGUgPSBlbmNvZGVRdW90ZWRQcmludGFibGUobWlkZGxlTmFtZSk7Ci0gICAgICAgICAgICAgICAgZW5jb2RlZFByZWZpeCA9IGVuY29kZVF1b3RlZFByaW50YWJsZShwcmVmaXgpOwotICAgICAgICAgICAgICAgIGVuY29kZWRTdWZmaXggPSBlbmNvZGVRdW90ZWRQcmludGFibGUoc3VmZml4KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZW5jb2RlZEZhbWlseSA9IGVzY2FwZUNoYXJhY3RlcnMoZmFtaWx5TmFtZSk7Ci0gICAgICAgICAgICAgICAgZW5jb2RlZEdpdmVuID0gZXNjYXBlQ2hhcmFjdGVycyhnaXZlbk5hbWUpOwotICAgICAgICAgICAgICAgIGVuY29kZWRNaWRkbGUgPSBlc2NhcGVDaGFyYWN0ZXJzKG1pZGRsZU5hbWUpOwotICAgICAgICAgICAgICAgIGVuY29kZWRQcmVmaXggPSBlc2NhcGVDaGFyYWN0ZXJzKHByZWZpeCk7Ci0gICAgICAgICAgICAgICAgZW5jb2RlZFN1ZmZpeCA9IGVzY2FwZUNoYXJhY3RlcnMoc3VmZml4KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVuY29kZWRGb3JtYXR0ZWRuYW1lID0KLSAgICAgICAgICAgICAgICAgICAgKHJlYWxseVVzZVF1b3RlZFByaW50YWJsZVRvRk4gPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZVF1b3RlZFByaW50YWJsZShmb3JtYXR0ZWROYW1lKSA6IGVzY2FwZUNoYXJhY3RlcnMoZm9ybWF0dGVkTmFtZSkpOwotCi0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfTik7Ci0gICAgICAgICAgICBpZiAobUlzRG9Db01vKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHJlYWxseUFwcGVuZENoYXJzZXRQYXJhbWV0ZXJUb05hbWUpIHsKLSAgICAgICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChtVkNhcmRDaGFyc2V0UGFyYW1ldGVyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHJlYWxseVVzZVF1b3RlZFByaW50YWJsZVRvTmFtZSkgewotICAgICAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX0VOQ09ESU5HX1FQKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0RBVEFfU0VQQVJBVE9SKTsKLSAgICAgICAgICAgICAgICAvLyBEb0NvTW8gcGhvbmVzIHJlcXVpcmUgdGhhdCBhbGwgdGhlIGVsZW1lbnRzIGluIHRoZSAiZmFtaWx5IG5hbWUiIGZpZWxkLgotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChmb3JtYXR0ZWROYW1lKTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfSVRFTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9JVEVNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0lURU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfSVRFTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAocmVhbGx5QXBwZW5kQ2hhcnNldFBhcmFtZXRlclRvTmFtZSkgewotICAgICAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKG1WQ2FyZENoYXJzZXRQYXJhbWV0ZXIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAocmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlVG9OYW1lKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fRU5DT0RJTkdfUVApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfREFUQV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChlbmNvZGVkRmFtaWx5KTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfSVRFTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChlbmNvZGVkR2l2ZW4pOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9JVEVNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKGVuY29kZWRNaWRkbGUpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9JVEVNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKGVuY29kZWRQcmVmaXgpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9JVEVNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKGVuY29kZWRTdWZmaXgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0VORF9PRl9MSU5FKTsKLQotICAgICAgICAgICAgLy8gRk4gcHJvcGVydHkKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9GTik7Ci0gICAgICAgICAgICBpZiAocmVhbGx5QXBwZW5kQ2hhcnNldFBhcmFtZXRlclRvRk4pIHsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQobVZDYXJkQ2hhcnNldFBhcmFtZXRlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlVG9GTikgewotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9FTkNPRElOR19RUCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfREFUQV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKGVuY29kZWRGb3JtYXR0ZWRuYW1lKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9FTkRfT0ZfTElORSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoIVRleHRVdGlscy5pc0VtcHR5KGRpc3BsYXlOYW1lKSkgewotICAgICAgICAgICAgZmluYWwgYm9vbGVhbiByZWFsbHlVc2VRdW90ZWRQcmludGFibGVUb0Rpc3BsYXlOYW1lID0KLSAgICAgICAgICAgICAgICAoIW1SZWZyYWluc1FQVG9OYW1lUHJvcGVydGllcyAmJgotICAgICAgICAgICAgICAgICAgICAgICAgIVZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKGRpc3BsYXlOYW1lKSk7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgZW5jb2RlZERpc3BsYXlOYW1lID0KLSAgICAgICAgICAgICAgICAgICAgcmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlVG9EaXNwbGF5TmFtZSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlUXVvdGVkUHJpbnRhYmxlKGRpc3BsYXlOYW1lKSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVzY2FwZUNoYXJhY3RlcnMoZGlzcGxheU5hbWUpOwotCi0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfTik7Ci0gICAgICAgICAgICBpZiAoc2hvdWxkQXBwZW5kQ2hhcnNldFBhcmFtKGRpc3BsYXlOYW1lKSkgewotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChtVkNhcmRDaGFyc2V0UGFyYW1ldGVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChyZWFsbHlVc2VRdW90ZWRQcmludGFibGVUb0Rpc3BsYXlOYW1lKSB7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX0VOQ09ESU5HX1FQKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9EQVRBX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoZW5jb2RlZERpc3BsYXlOYW1lKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9JVEVNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfSVRFTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0lURU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9JVEVNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfRU5EX09GX0xJTkUpOwotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX0ZOKTsKLQotICAgICAgICAgICAgLy8gTm90ZTogIkNIQVJTRVQiIHBhcmFtIGlzIG5vdCBhbGxvd2VkIGluIHZDYXJkIDMuMCwgYnV0IHdlIG1heSBhZGQgaXQKLSAgICAgICAgICAgIC8vICAgICAgIHdoZW4gaXQgd291bGQgYmUgdXNlZnVsIGZvciBleHRlcm5hbCBpbXBvcnRlcnMsIGFzc3VtaW5nIG5vIGV4dGVybmFsCi0gICAgICAgICAgICAvLyAgICAgICBpbXBvcnRlciBhbGxvd3MgdGhpcyB2aW9yYXRpb24uCi0gICAgICAgICAgICBpZiAoc2hvdWxkQXBwZW5kQ2hhcnNldFBhcmFtKGRpc3BsYXlOYW1lKSkgewotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChtVkNhcmRDaGFyc2V0UGFyYW1ldGVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9EQVRBX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoZW5jb2RlZERpc3BsYXlOYW1lKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9FTkRfT0ZfTElORSk7Ci0gICAgICAgIH0gZWxzZSBpZiAobUlzVjMwKSB7Ci0gICAgICAgICAgICAvLyB2Q2FyZCAzLjAgc3BlY2lmaWNhdGlvbiByZXF1aXJlcyB0aGVzZSBmaWVsZHMuCi0gICAgICAgICAgICBhcHBlbmRMaW5lKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX04sICIiKTsKLSAgICAgICAgICAgIGFwcGVuZExpbmUoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfRk4sICIiKTsKLSAgICAgICAgfSBlbHNlIGlmIChtSXNEb0NvTW8pIHsKLSAgICAgICAgICAgIGFwcGVuZExpbmUoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfTiwgIiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgYXBwZW5kUGhvbmV0aWNOYW1lRmllbGRzKGNvbnRlbnRWYWx1ZXMpOwotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYXBwZW5kUGhvbmV0aWNOYW1lRmllbGRzKGZpbmFsIENvbnRlbnRWYWx1ZXMgY29udGVudFZhbHVlcykgewotICAgICAgICBmaW5hbCBTdHJpbmcgcGhvbmV0aWNGYW1pbHlOYW1lOwotICAgICAgICBmaW5hbCBTdHJpbmcgcGhvbmV0aWNNaWRkbGVOYW1lOwotICAgICAgICBmaW5hbCBTdHJpbmcgcGhvbmV0aWNHaXZlbk5hbWU7Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyB0bXBQaG9uZXRpY0ZhbWlseU5hbWUgPQotICAgICAgICAgICAgICAgIGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfRkFNSUxZX05BTUUpOwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIHRtcFBob25ldGljTWlkZGxlTmFtZSA9Ci0gICAgICAgICAgICAgICAgY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19NSURETEVfTkFNRSk7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgdG1wUGhvbmV0aWNHaXZlbk5hbWUgPQotICAgICAgICAgICAgICAgIGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfR0lWRU5fTkFNRSk7Ci0gICAgICAgICAgICBpZiAobU5lZWRzVG9Db252ZXJ0UGhvbmV0aWNTdHJpbmcpIHsKLSAgICAgICAgICAgICAgICBwaG9uZXRpY0ZhbWlseU5hbWUgPSBWQ2FyZFV0aWxzLnRvSGFsZldpZHRoU3RyaW5nKHRtcFBob25ldGljRmFtaWx5TmFtZSk7Ci0gICAgICAgICAgICAgICAgcGhvbmV0aWNNaWRkbGVOYW1lID0gVkNhcmRVdGlscy50b0hhbGZXaWR0aFN0cmluZyh0bXBQaG9uZXRpY01pZGRsZU5hbWUpOwotICAgICAgICAgICAgICAgIHBob25ldGljR2l2ZW5OYW1lID0gVkNhcmRVdGlscy50b0hhbGZXaWR0aFN0cmluZyh0bXBQaG9uZXRpY0dpdmVuTmFtZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHBob25ldGljRmFtaWx5TmFtZSA9IHRtcFBob25ldGljRmFtaWx5TmFtZTsKLSAgICAgICAgICAgICAgICBwaG9uZXRpY01pZGRsZU5hbWUgPSB0bXBQaG9uZXRpY01pZGRsZU5hbWU7Ci0gICAgICAgICAgICAgICAgcGhvbmV0aWNHaXZlbk5hbWUgPSB0bXBQaG9uZXRpY0dpdmVuTmFtZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShwaG9uZXRpY0ZhbWlseU5hbWUpCi0gICAgICAgICAgICAgICAgJiYgVGV4dFV0aWxzLmlzRW1wdHkocGhvbmV0aWNNaWRkbGVOYW1lKQotICAgICAgICAgICAgICAgICYmIFRleHRVdGlscy5pc0VtcHR5KHBob25ldGljR2l2ZW5OYW1lKSkgewotICAgICAgICAgICAgaWYgKG1Jc0RvQ29NbykgewotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9TT1VORCk7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfWF9JUk1DX04pOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9EQVRBX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0lURU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfSVRFTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9JVEVNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0lURU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfRU5EX09GX0xJTkUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVHJ5IHRvIGVtaXQgdGhlIGZpZWxkKHMpIHJlbGF0ZWQgdG8gcGhvbmV0aWMgbmFtZS4KLSAgICAgICAgaWYgKG1Jc1YzMCkgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nIHNvcnRTdHJpbmcgPSBWQ2FyZFV0aWxzCi0gICAgICAgICAgICAgICAgICAgIC5jb25zdHJ1Y3ROYW1lRnJvbUVsZW1lbnRzKG1WQ2FyZFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGhvbmV0aWNGYW1pbHlOYW1lLCBwaG9uZXRpY01pZGRsZU5hbWUsIHBob25ldGljR2l2ZW5OYW1lKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9TT1JUX1NUUklORyk7Ci0gICAgICAgICAgICBpZiAoc2hvdWxkQXBwZW5kQ2hhcnNldFBhcmFtKHNvcnRTdHJpbmcpKSB7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKG1WQ2FyZENoYXJzZXRQYXJhbWV0ZXIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0RBVEFfU0VQQVJBVE9SKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChlc2NhcGVDaGFyYWN0ZXJzKHNvcnRTdHJpbmcpKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9FTkRfT0ZfTElORSk7Ci0gICAgICAgIH0gZWxzZSBpZiAobUlzSmFwYW5lc2VNb2JpbGVQaG9uZSkgewotICAgICAgICAgICAgLy8gTm90ZTogVGhlcmUgaXMgbm8gYXBwcm9wcmlhdGUgcHJvcGVydHkgZm9yIGV4cHJlc3NpbmcKLSAgICAgICAgICAgIC8vICAgICAgIHBob25ldGljIG5hbWUgaW4gdkNhcmQgMi4xLCB3aGlsZSB0aGVyZSBpcyBpbgotICAgICAgICAgICAgLy8gICAgICAgdkNhcmQgMy4wIChTT1JULVNUUklORykuCi0gICAgICAgICAgICAvLyAgICAgICBXZSBjaG9zZSB0byB1c2UgRG9Db01vJ3Mgd2F5IHdoZW4gdGhlIGRldmljZSBpcyBKYXBhbmVzZSBvbmUKLSAgICAgICAgICAgIC8vICAgICAgIHNpbmNlIGl0IGlzIHN1cHBvcnRlZCBieQotICAgICAgICAgICAgLy8gICAgICAgYSBsb3Qgb2YgSmFwYW5lc2UgbW9iaWxlIHBob25lcy4gVGhpcyBpcyAiWC0iIHByb3BlcnR5LCBzbwotICAgICAgICAgICAgLy8gICAgICAgYW55IHBhcnNlciBob3BlZnVsbHkgd291bGQgbm90IGdldCBjb25mdXNlZCB3aXRoIHRoaXMuCi0gICAgICAgICAgICAvLwotICAgICAgICAgICAgLy8gICAgICAgQWxzbywgRG9Db01vJ3Mgc3BlY2lmaWNhdGlvbiByZXF1aXJlcyB2Q2FyZCBjb21wb3NlciB0byB1c2UganVzdCB0aGUgZmlyc3QKLSAgICAgICAgICAgIC8vICAgICAgIGNvbHVtbi4KLSAgICAgICAgICAgIC8vICAgICAgIGkuZS4KLSAgICAgICAgICAgIC8vICAgICAgIG8gIFNPVU5EO1gtSVJNQy1OOk1peWFrYXdhIERhaXN1a2U7Ozs7Ci0gICAgICAgICAgICAvLyAgICAgICB4ICBTT1VORDtYLUlSTUMtTjpNaXlha2F3YTtEYWlzdWtlOzs7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfU09VTkQpOwotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9YX0lSTUNfTik7Ci0KLSAgICAgICAgICAgIGJvb2xlYW4gcmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlID0KLSAgICAgICAgICAgICAgICAoIW1SZWZyYWluc1FQVG9OYW1lUHJvcGVydGllcwotICAgICAgICAgICAgICAgICAgICAgICAgJiYgIShWQ2FyZFV0aWxzLmNvbnRhaW5zT25seU5vbkNyTGZQcmludGFibGVBc2NpaSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGhvbmV0aWNGYW1pbHlOYW1lKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBWQ2FyZFV0aWxzLmNvbnRhaW5zT25seU5vbkNyTGZQcmludGFibGVBc2NpaSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaG9uZXRpY01pZGRsZU5hbWUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIFZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBob25ldGljR2l2ZW5OYW1lKSkpOwotCi0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgZW5jb2RlZFBob25ldGljRmFtaWx5TmFtZTsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBlbmNvZGVkUGhvbmV0aWNNaWRkbGVOYW1lOwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVuY29kZWRQaG9uZXRpY0dpdmVuTmFtZTsKLSAgICAgICAgICAgIGlmIChyZWFsbHlVc2VRdW90ZWRQcmludGFibGUpIHsKLSAgICAgICAgICAgICAgICBlbmNvZGVkUGhvbmV0aWNGYW1pbHlOYW1lID0gZW5jb2RlUXVvdGVkUHJpbnRhYmxlKHBob25ldGljRmFtaWx5TmFtZSk7Ci0gICAgICAgICAgICAgICAgZW5jb2RlZFBob25ldGljTWlkZGxlTmFtZSA9IGVuY29kZVF1b3RlZFByaW50YWJsZShwaG9uZXRpY01pZGRsZU5hbWUpOwotICAgICAgICAgICAgICAgIGVuY29kZWRQaG9uZXRpY0dpdmVuTmFtZSA9IGVuY29kZVF1b3RlZFByaW50YWJsZShwaG9uZXRpY0dpdmVuTmFtZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGVuY29kZWRQaG9uZXRpY0ZhbWlseU5hbWUgPSBlc2NhcGVDaGFyYWN0ZXJzKHBob25ldGljRmFtaWx5TmFtZSk7Ci0gICAgICAgICAgICAgICAgZW5jb2RlZFBob25ldGljTWlkZGxlTmFtZSA9IGVzY2FwZUNoYXJhY3RlcnMocGhvbmV0aWNNaWRkbGVOYW1lKTsKLSAgICAgICAgICAgICAgICBlbmNvZGVkUGhvbmV0aWNHaXZlbk5hbWUgPSBlc2NhcGVDaGFyYWN0ZXJzKHBob25ldGljR2l2ZW5OYW1lKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHNob3VsZEFwcGVuZENoYXJzZXRQYXJhbShlbmNvZGVkUGhvbmV0aWNGYW1pbHlOYW1lLAotICAgICAgICAgICAgICAgICAgICBlbmNvZGVkUGhvbmV0aWNNaWRkbGVOYW1lLCBlbmNvZGVkUGhvbmV0aWNHaXZlbk5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKG1WQ2FyZENoYXJzZXRQYXJhbWV0ZXIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0RBVEFfU0VQQVJBVE9SKTsKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBib29sZWFuIGZpcnN0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KGVuY29kZWRQaG9uZXRpY0ZhbWlseU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChlbmNvZGVkUGhvbmV0aWNGYW1pbHlOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShlbmNvZGVkUGhvbmV0aWNNaWRkbGVOYW1lKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoJyAnKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoZW5jb2RlZFBob25ldGljTWlkZGxlTmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkoZW5jb2RlZFBob25ldGljR2l2ZW5OYW1lKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoIWZpcnN0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoJyAnKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoZW5jb2RlZFBob25ldGljR2l2ZW5OYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfSVRFTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0lURU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9JVEVNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfSVRFTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0VORF9PRl9MSU5FKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtVXNlc0RlZmFjdFByb3BlcnR5KSB7Ci0gICAgICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHBob25ldGljR2l2ZW5OYW1lKSkgewotICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gcmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlID0KLSAgICAgICAgICAgICAgICAgICAgKG1TaG91bGRVc2VRdW90ZWRQcmludGFibGUgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAhVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkocGhvbmV0aWNHaXZlbk5hbWUpKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZW5jb2RlZFBob25ldGljR2l2ZW5OYW1lOwotICAgICAgICAgICAgICAgIGlmIChyZWFsbHlVc2VRdW90ZWRQcmludGFibGUpIHsKLSAgICAgICAgICAgICAgICAgICAgZW5jb2RlZFBob25ldGljR2l2ZW5OYW1lID0gZW5jb2RlUXVvdGVkUHJpbnRhYmxlKHBob25ldGljR2l2ZW5OYW1lKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBlbmNvZGVkUGhvbmV0aWNHaXZlbk5hbWUgPSBlc2NhcGVDaGFyYWN0ZXJzKHBob25ldGljR2l2ZW5OYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1hfUEhPTkVUSUNfRklSU1RfTkFNRSk7Ci0gICAgICAgICAgICAgICAgaWYgKHNob3VsZEFwcGVuZENoYXJzZXRQYXJhbShwaG9uZXRpY0dpdmVuTmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChtVkNhcmRDaGFyc2V0UGFyYW1ldGVyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHJlYWxseVVzZVF1b3RlZFByaW50YWJsZSkgewotICAgICAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX0VOQ09ESU5HX1FQKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0RBVEFfU0VQQVJBVE9SKTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoZW5jb2RlZFBob25ldGljR2l2ZW5OYW1lKTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfRU5EX09GX0xJTkUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShwaG9uZXRpY01pZGRsZU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiByZWFsbHlVc2VRdW90ZWRQcmludGFibGUgPQotICAgICAgICAgICAgICAgICAgICAobVNob3VsZFVzZVF1b3RlZFByaW50YWJsZSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICFWQ2FyZFV0aWxzLmNvbnRhaW5zT25seU5vbkNyTGZQcmludGFibGVBc2NpaShwaG9uZXRpY01pZGRsZU5hbWUpKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZW5jb2RlZFBob25ldGljTWlkZGxlTmFtZTsKLSAgICAgICAgICAgICAgICBpZiAocmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGVuY29kZWRQaG9uZXRpY01pZGRsZU5hbWUgPSBlbmNvZGVRdW90ZWRQcmludGFibGUocGhvbmV0aWNNaWRkbGVOYW1lKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBlbmNvZGVkUGhvbmV0aWNNaWRkbGVOYW1lID0gZXNjYXBlQ2hhcmFjdGVycyhwaG9uZXRpY01pZGRsZU5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfWF9QSE9ORVRJQ19NSURETEVfTkFNRSk7Ci0gICAgICAgICAgICAgICAgaWYgKHNob3VsZEFwcGVuZENoYXJzZXRQYXJhbShwaG9uZXRpY01pZGRsZU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQobVZDYXJkQ2hhcnNldFBhcmFtZXRlcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChyZWFsbHlVc2VRdW90ZWRQcmludGFibGUpIHsKLSAgICAgICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9FTkNPRElOR19RUCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9EQVRBX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKGVuY29kZWRQaG9uZXRpY01pZGRsZU5hbWUpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9FTkRfT0ZfTElORSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHBob25ldGljRmFtaWx5TmFtZSkpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIHJlYWxseVVzZVF1b3RlZFByaW50YWJsZSA9Ci0gICAgICAgICAgICAgICAgICAgIChtU2hvdWxkVXNlUXVvdGVkUHJpbnRhYmxlICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIVZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKHBob25ldGljRmFtaWx5TmFtZSkpOwotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBlbmNvZGVkUGhvbmV0aWNGYW1pbHlOYW1lOwotICAgICAgICAgICAgICAgIGlmIChyZWFsbHlVc2VRdW90ZWRQcmludGFibGUpIHsKLSAgICAgICAgICAgICAgICAgICAgZW5jb2RlZFBob25ldGljRmFtaWx5TmFtZSA9IGVuY29kZVF1b3RlZFByaW50YWJsZShwaG9uZXRpY0ZhbWlseU5hbWUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGVuY29kZWRQaG9uZXRpY0ZhbWlseU5hbWUgPSBlc2NhcGVDaGFyYWN0ZXJzKHBob25ldGljRmFtaWx5TmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9YX1BIT05FVElDX0xBU1RfTkFNRSk7Ci0gICAgICAgICAgICAgICAgaWYgKHNob3VsZEFwcGVuZENoYXJzZXRQYXJhbShwaG9uZXRpY0ZhbWlseU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQobVZDYXJkQ2hhcnNldFBhcmFtZXRlcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChyZWFsbHlVc2VRdW90ZWRQcmludGFibGUpIHsKLSAgICAgICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9FTkNPRElOR19RUCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9EQVRBX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKGVuY29kZWRQaG9uZXRpY0ZhbWlseU5hbWUpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9FTkRfT0ZfTElORSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgVkNhcmRCdWlsZGVyIGFwcGVuZE5pY2tOYW1lcyhmaW5hbCBMaXN0PENvbnRlbnRWYWx1ZXM+IGNvbnRlbnRWYWx1ZXNMaXN0KSB7Ci0gICAgICAgIGZpbmFsIGJvb2xlYW4gdXNlQW5kcm9pZFByb3BlcnR5OwotICAgICAgICBpZiAobUlzVjMwKSB7Ci0gICAgICAgICAgICB1c2VBbmRyb2lkUHJvcGVydHkgPSBmYWxzZTsKLSAgICAgICAgfSBlbHNlIGlmIChtVXNlc0FuZHJvaWRQcm9wZXJ0eSkgewotICAgICAgICAgICAgdXNlQW5kcm9pZFByb3BlcnR5ID0gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIFRoZXJlJ3Mgbm8gd2F5IHRvIGFkZCB0aGlzIGZpZWxkLgotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNvbnRlbnRWYWx1ZXNMaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzIDogY29udGVudFZhbHVlc0xpc3QpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbmlja25hbWUgPSBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKE5pY2tuYW1lLk5BTUUpOwotICAgICAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShuaWNrbmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICh1c2VBbmRyb2lkUHJvcGVydHkpIHsKLSAgICAgICAgICAgICAgICAgICAgYXBwZW5kQW5kcm9pZFNwZWNpZmljUHJvcGVydHkoTmlja25hbWUuQ09OVEVOVF9JVEVNX1RZUEUsIGNvbnRlbnRWYWx1ZXMpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGFwcGVuZExpbmVXaXRoQ2hhcnNldEFuZFFQRGV0ZWN0aW9uKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX05JQ0tOQU1FLCBuaWNrbmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIHB1YmxpYyBWQ2FyZEJ1aWxkZXIgYXBwZW5kUGhvbmVzKGZpbmFsIExpc3Q8Q29udGVudFZhbHVlcz4gY29udGVudFZhbHVlc0xpc3QpIHsKLSAgICAgICAgYm9vbGVhbiBwaG9uZUxpbmVFeGlzdHMgPSBmYWxzZTsKLSAgICAgICAgaWYgKGNvbnRlbnRWYWx1ZXNMaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIFNldDxTdHJpbmc+IHBob25lU2V0ID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotICAgICAgICAgICAgZm9yIChDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXMgOiBjb250ZW50VmFsdWVzTGlzdCkgewotICAgICAgICAgICAgICAgIGZpbmFsIEludGVnZXIgdHlwZUFzT2JqZWN0ID0gY29udGVudFZhbHVlcy5nZXRBc0ludGVnZXIoUGhvbmUuVFlQRSk7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGxhYmVsID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhQaG9uZS5MQUJFTCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgSW50ZWdlciBpc1ByaW1hcnlBc0ludGVnZXIgPSBjb250ZW50VmFsdWVzLmdldEFzSW50ZWdlcihQaG9uZS5JU19QUklNQVJZKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIGlzUHJpbWFyeSA9IChpc1ByaW1hcnlBc0ludGVnZXIgIT0gbnVsbCA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAoaXNQcmltYXJ5QXNJbnRlZ2VyID4gMCkgOiBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHBob25lTnVtYmVyID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhQaG9uZS5OVU1CRVIpOwotICAgICAgICAgICAgICAgIGlmIChwaG9uZU51bWJlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBob25lTnVtYmVyID0gcGhvbmVOdW1iZXIudHJpbSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkocGhvbmVOdW1iZXIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIFBBR0VSIG51bWJlciBuZWVkcyB1bmZvcm1hdHRlZCAicGhvbmUgbnVtYmVyIi4KLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgdHlwZSA9ICh0eXBlQXNPYmplY3QgIT0gbnVsbCA/IHR5cGVBc09iamVjdCA6IERFRkFVTFRfUEhPTkVfVFlQRSk7Ci0gICAgICAgICAgICAgICAgaWYgKHR5cGUgPT0gUGhvbmUuVFlQRV9QQUdFUiB8fAotICAgICAgICAgICAgICAgICAgICAgICAgVkNhcmRDb25maWcucmVmcmFpblBob25lTnVtYmVyRm9ybWF0dGluZyhtVkNhcmRUeXBlKSkgewotICAgICAgICAgICAgICAgICAgICBwaG9uZUxpbmVFeGlzdHMgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBpZiAoIXBob25lU2V0LmNvbnRhaW5zKHBob25lTnVtYmVyKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcGhvbmVTZXQuYWRkKHBob25lTnVtYmVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZFRlbExpbmUodHlwZSwgbGFiZWwsIHBob25lTnVtYmVyLCBpc1ByaW1hcnkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IHBob25lTnVtYmVyTGlzdCA9IHNwbGl0QW5kVHJpbVBob25lTnVtYmVycyhwaG9uZU51bWJlcik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwaG9uZU51bWJlckxpc3QuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwaG9uZUxpbmVFeGlzdHMgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBhY3R1YWxQaG9uZU51bWJlciA6IHBob25lTnVtYmVyTGlzdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwaG9uZVNldC5jb250YWlucyhhY3R1YWxQaG9uZU51bWJlcikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgZm9ybWF0ID0gVkNhcmRVdGlscy5nZXRQaG9uZU51bWJlckZvcm1hdChtVkNhcmRUeXBlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZm9ybWF0dGVkUGhvbmVOdW1iZXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5mb3JtYXROdW1iZXIoYWN0dWFsUGhvbmVOdW1iZXIsIGZvcm1hdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGhvbmVTZXQuYWRkKGFjdHVhbFBob25lTnVtYmVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmRUZWxMaW5lKHR5cGUsIGxhYmVsLCBmb3JtYXR0ZWRQaG9uZU51bWJlciwgaXNQcmltYXJ5KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSAgLy8gZm9yIChTdHJpbmcgYWN0dWFsUGhvbmVOdW1iZXIgOiBwaG9uZU51bWJlckxpc3QpIHsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIXBob25lTGluZUV4aXN0cyAmJiBtSXNEb0NvTW8pIHsKLSAgICAgICAgICAgIGFwcGVuZFRlbExpbmUoUGhvbmUuVFlQRV9IT01FLCAiIiwgIiIsIGZhbHNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIFNwbGl0cyBhIGdpdmVuIHN0cmluZyBleHByZXNzaW5nIHBob25lIG51bWJlcnMgaW50byBzZXZlcmFsIHN0cmluZ3MsIGFuZCByZW1vdmUKLSAgICAgKiB1bm5lY2Vzc2FyeSBjaGFyYWN0ZXJzIGluc2lkZSB0aGVtLiBUaGUgc2l6ZSBvZiBhIHJldHVybmVkIGxpc3QgYmVjb21lcyAxIHdoZW4KLSAgICAgKiBubyBzcGxpdCBpcyBuZWVkZWQuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIFRoZSBnaXZlbiBudW1iZXIgIm1heSIgaGF2ZSBzZXZlcmFsIHBob25lIG51bWJlcnMgd2hlbiB0aGUgY29udGFjdCBlbnRyeSBpcyBjb3JydXB0ZWQKLSAgICAgKiBiZWNhdXNlIG9mIGl0cyBvcmlnaW5hbCBzb3VyY2UuCi0gICAgICogZS5nLiAiMTExLTIyMi0zMzMzIChNaWFtaSlcbjQ0NC01NTUtNjY2NiAoQnJvd2FyZDsgMzA1LTY1My02Nzk2IChNaWFtaSkiCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIFRoaXMga2luZCBvZiAicGhvbmUgbnVtYmVycyIgd2lsbCBub3QgYmUgY3JlYXRlZCB3aXRoIEFuZHJvaWQgdkNhcmQgaW1wbGVtZW50YXRpb24sCi0gICAgICogYnV0IHdlIG1heSBlbmNvdW50ZXIgdGhlbSBpZiB0aGUgc291cmNlIG9mIHRoZSBpbnB1dCBkYXRhIGhhcyBhbHJlYWR5IGNvcnJ1cHRlZAotICAgICAqIGltcGxlbWVudGF0aW9uLgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBUbyBoYW5kbGUgdGhpcyBjYXNlLCB0aGlzIG1ldGhvZCBmaXJzdCBzcGxpdHMgaXRzIGlucHV0IGludG8gbXVsdGlwbGUgcGFydHMKLSAgICAgKiAoZS5nLiAiMTExLTIyMi0zMzMzIChNaWFtaSkiLCAiNDQ0LTU1NS02NjY2IChCcm93YXJkIiwgYW5kIDMwNTY1My02Nzk2IChNaWFtaSkiKSBhbmQKLSAgICAgKiByZW1vdmVzIHVubmVjZXNzYXJ5IHN0cmluZ3MgbGlrZSAiKE1pYW1pKSIuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIERvIG5vdCBjYWxsIHRoaXMgbWV0aG9kIHdoZW4gdHJpbW1pbmcgaXMgaW5hcHByb3ByaWF0ZSBmb3IgaXRzIHJlY2VpdmVycy4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gc3BsaXRBbmRUcmltUGhvbmVOdW1iZXJzKGZpbmFsIFN0cmluZyBwaG9uZU51bWJlcikgewotICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gcGhvbmVMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0KLSAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgZmluYWwgaW50IGxlbmd0aCA9IHBob25lTnVtYmVyLmxlbmd0aCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBmaW5hbCBjaGFyIGNoID0gcGhvbmVOdW1iZXIuY2hhckF0KGkpOwotICAgICAgICAgICAgaWYgKENoYXJhY3Rlci5pc0RpZ2l0KGNoKSB8fCBjaCA9PSAnKycpIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChjaCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKChjaCA9PSAnOycgfHwgY2ggPT0gJ1xuJykgJiYgYnVpbGRlci5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICBwaG9uZUxpc3QuYWRkKGJ1aWxkZXIudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGJ1aWxkZXIubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICBwaG9uZUxpc3QuYWRkKGJ1aWxkZXIudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcGhvbmVMaXN0OwotICAgIH0KLQotICAgIHB1YmxpYyBWQ2FyZEJ1aWxkZXIgYXBwZW5kRW1haWxzKGZpbmFsIExpc3Q8Q29udGVudFZhbHVlcz4gY29udGVudFZhbHVlc0xpc3QpIHsKLSAgICAgICAgYm9vbGVhbiBlbWFpbEFkZHJlc3NFeGlzdHMgPSBmYWxzZTsKLSAgICAgICAgaWYgKGNvbnRlbnRWYWx1ZXNMaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZpbmFsIFNldDxTdHJpbmc+IGFkZHJlc3NTZXQgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0gICAgICAgICAgICBmb3IgKENvbnRlbnRWYWx1ZXMgY29udGVudFZhbHVlcyA6IGNvbnRlbnRWYWx1ZXNMaXN0KSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGVtYWlsQWRkcmVzcyA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoRW1haWwuREFUQSk7Ci0gICAgICAgICAgICAgICAgaWYgKGVtYWlsQWRkcmVzcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGVtYWlsQWRkcmVzcyA9IGVtYWlsQWRkcmVzcy50cmltKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShlbWFpbEFkZHJlc3MpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBJbnRlZ2VyIHR5cGVBc09iamVjdCA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNJbnRlZ2VyKEVtYWlsLlRZUEUpOwotICAgICAgICAgICAgICAgIGZpbmFsIGludCB0eXBlID0gKHR5cGVBc09iamVjdCAhPSBudWxsID8KLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVBc09iamVjdCA6IERFRkFVTFRfRU1BSUxfVFlQRSk7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGxhYmVsID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhFbWFpbC5MQUJFTCk7Ci0gICAgICAgICAgICAgICAgSW50ZWdlciBpc1ByaW1hcnlBc0ludGVnZXIgPSBjb250ZW50VmFsdWVzLmdldEFzSW50ZWdlcihFbWFpbC5JU19QUklNQVJZKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIGlzUHJpbWFyeSA9IChpc1ByaW1hcnlBc0ludGVnZXIgIT0gbnVsbCA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAoaXNQcmltYXJ5QXNJbnRlZ2VyID4gMCkgOiBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgZW1haWxBZGRyZXNzRXhpc3RzID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBpZiAoIWFkZHJlc3NTZXQuY29udGFpbnMoZW1haWxBZGRyZXNzKSkgewotICAgICAgICAgICAgICAgICAgICBhZGRyZXNzU2V0LmFkZChlbWFpbEFkZHJlc3MpOwotICAgICAgICAgICAgICAgICAgICBhcHBlbmRFbWFpbExpbmUodHlwZSwgbGFiZWwsIGVtYWlsQWRkcmVzcywgaXNQcmltYXJ5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIWVtYWlsQWRkcmVzc0V4aXN0cyAmJiBtSXNEb0NvTW8pIHsKLSAgICAgICAgICAgIGFwcGVuZEVtYWlsTGluZShFbWFpbC5UWVBFX0hPTUUsICIiLCAiIiwgZmFsc2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgcHVibGljIFZDYXJkQnVpbGRlciBhcHBlbmRQb3N0YWxzKGZpbmFsIExpc3Q8Q29udGVudFZhbHVlcz4gY29udGVudFZhbHVlc0xpc3QpIHsKLSAgICAgICAgaWYgKGNvbnRlbnRWYWx1ZXNMaXN0ID09IG51bGwgfHwgY29udGVudFZhbHVlc0xpc3QuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBpZiAobUlzRG9Db01vKSB7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX0FEUik7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfSE9NRSk7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0RBVEFfU0VQQVJBVE9SKTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfRU5EX09GX0xJTkUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKG1Jc0RvQ29NbykgewotICAgICAgICAgICAgICAgIGFwcGVuZFBvc3RhbHNGb3JEb0NvTW8oY29udGVudFZhbHVlc0xpc3QpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBhcHBlbmRQb3N0YWxzRm9yR2VuZXJpYyhjb250ZW50VmFsdWVzTGlzdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8SW50ZWdlciwgSW50ZWdlcj4gc1Bvc3RhbFR5cGVQcmlvcml0eU1hcDsKLQotICAgIHN0YXRpYyB7Ci0gICAgICAgIHNQb3N0YWxUeXBlUHJpb3JpdHlNYXAgPSBuZXcgSGFzaE1hcDxJbnRlZ2VyLCBJbnRlZ2VyPigpOwotICAgICAgICBzUG9zdGFsVHlwZVByaW9yaXR5TWFwLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlRZUEVfSE9NRSwgMCk7Ci0gICAgICAgIHNQb3N0YWxUeXBlUHJpb3JpdHlNYXAucHV0KFN0cnVjdHVyZWRQb3N0YWwuVFlQRV9XT1JLLCAxKTsKLSAgICAgICAgc1Bvc3RhbFR5cGVQcmlvcml0eU1hcC5wdXQoU3RydWN0dXJlZFBvc3RhbC5UWVBFX09USEVSLCAyKTsKLSAgICAgICAgc1Bvc3RhbFR5cGVQcmlvcml0eU1hcC5wdXQoU3RydWN0dXJlZFBvc3RhbC5UWVBFX0NVU1RPTSwgMyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVHJpZXMgdG8gYXBwZW5kIGp1c3Qgb25lIGxpbmUuIElmIHRoZXJlJ3Mgbm8gYXBwcm9wcmlhdGUgYWRkcmVzcwotICAgICAqIGluZm9ybWF0aW9uLCBhcHBlbmQgYW4gZW1wdHkgbGluZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgYXBwZW5kUG9zdGFsc0ZvckRvQ29NbyhmaW5hbCBMaXN0PENvbnRlbnRWYWx1ZXM+IGNvbnRlbnRWYWx1ZXNMaXN0KSB7Ci0gICAgICAgIGludCBjdXJyZW50UHJpb3JpdHkgPSBJbnRlZ2VyLk1BWF9WQUxVRTsKLSAgICAgICAgaW50IGN1cnJlbnRUeXBlID0gSW50ZWdlci5NQVhfVkFMVUU7Ci0gICAgICAgIENvbnRlbnRWYWx1ZXMgY3VycmVudENvbnRlbnRWYWx1ZXMgPSBudWxsOwotICAgICAgICBmb3IgKGZpbmFsIENvbnRlbnRWYWx1ZXMgY29udGVudFZhbHVlcyA6IGNvbnRlbnRWYWx1ZXNMaXN0KSB7Ci0gICAgICAgICAgICBpZiAoY29udGVudFZhbHVlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbCBJbnRlZ2VyIHR5cGVBc0ludGVnZXIgPSBjb250ZW50VmFsdWVzLmdldEFzSW50ZWdlcihTdHJ1Y3R1cmVkUG9zdGFsLlRZUEUpOwotICAgICAgICAgICAgZmluYWwgSW50ZWdlciBwcmlvcml0eUFzSW50ZWdlciA9IHNQb3N0YWxUeXBlUHJpb3JpdHlNYXAuZ2V0KHR5cGVBc0ludGVnZXIpOwotICAgICAgICAgICAgZmluYWwgaW50IHByaW9yaXR5ID0KLSAgICAgICAgICAgICAgICAgICAgKHByaW9yaXR5QXNJbnRlZ2VyICE9IG51bGwgPyBwcmlvcml0eUFzSW50ZWdlciA6IEludGVnZXIuTUFYX1ZBTFVFKTsKLSAgICAgICAgICAgIGlmIChwcmlvcml0eSA8IGN1cnJlbnRQcmlvcml0eSkgewotICAgICAgICAgICAgICAgIGN1cnJlbnRQcmlvcml0eSA9IHByaW9yaXR5OwotICAgICAgICAgICAgICAgIGN1cnJlbnRUeXBlID0gdHlwZUFzSW50ZWdlcjsKLSAgICAgICAgICAgICAgICBjdXJyZW50Q29udGVudFZhbHVlcyA9IGNvbnRlbnRWYWx1ZXM7Ci0gICAgICAgICAgICAgICAgaWYgKHByaW9yaXR5ID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGN1cnJlbnRDb250ZW50VmFsdWVzID09IG51bGwpIHsKLSAgICAgICAgICAgIExvZy53KExPR19UQUcsICJTaG91bGQgbm90IGNvbWUgaGVyZS4gTXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBwb3N0YWwgZGF0YS4iKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIFN0cmluZyBsYWJlbCA9IGN1cnJlbnRDb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKFN0cnVjdHVyZWRQb3N0YWwuTEFCRUwpOwotICAgICAgICBhcHBlbmRQb3N0YWxMaW5lKGN1cnJlbnRUeXBlLCBsYWJlbCwgY3VycmVudENvbnRlbnRWYWx1ZXMsIGZhbHNlLCB0cnVlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYXBwZW5kUG9zdGFsc0ZvckdlbmVyaWMoZmluYWwgTGlzdDxDb250ZW50VmFsdWVzPiBjb250ZW50VmFsdWVzTGlzdCkgewotICAgICAgICBmb3IgKGZpbmFsIENvbnRlbnRWYWx1ZXMgY29udGVudFZhbHVlcyA6IGNvbnRlbnRWYWx1ZXNMaXN0KSB7Ci0gICAgICAgICAgICBpZiAoY29udGVudFZhbHVlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbCBJbnRlZ2VyIHR5cGVBc0ludGVnZXIgPSBjb250ZW50VmFsdWVzLmdldEFzSW50ZWdlcihTdHJ1Y3R1cmVkUG9zdGFsLlRZUEUpOwotICAgICAgICAgICAgZmluYWwgaW50IHR5cGUgPSAodHlwZUFzSW50ZWdlciAhPSBudWxsID8KLSAgICAgICAgICAgICAgICAgICAgdHlwZUFzSW50ZWdlciA6IERFRkFVTFRfUE9TVEFMX1RZUEUpOwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGxhYmVsID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhTdHJ1Y3R1cmVkUG9zdGFsLkxBQkVMKTsKLSAgICAgICAgICAgIGZpbmFsIEludGVnZXIgaXNQcmltYXJ5QXNJbnRlZ2VyID0KLSAgICAgICAgICAgICAgICBjb250ZW50VmFsdWVzLmdldEFzSW50ZWdlcihTdHJ1Y3R1cmVkUG9zdGFsLklTX1BSSU1BUlkpOwotICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBpc1ByaW1hcnkgPSAoaXNQcmltYXJ5QXNJbnRlZ2VyICE9IG51bGwgPwotICAgICAgICAgICAgICAgICAgICAoaXNQcmltYXJ5QXNJbnRlZ2VyID4gMCkgOiBmYWxzZSk7Ci0gICAgICAgICAgICBhcHBlbmRQb3N0YWxMaW5lKHR5cGUsIGxhYmVsLCBjb250ZW50VmFsdWVzLCBpc1ByaW1hcnksIGZhbHNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFBvc3RhbFN0cnVjdCB7Ci0gICAgICAgIGZpbmFsIGJvb2xlYW4gcmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlOwotICAgICAgICBmaW5hbCBib29sZWFuIGFwcGVuZENoYXJzZXQ7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBhZGRyZXNzRGF0YTsKLSAgICAgICAgcHVibGljIFBvc3RhbFN0cnVjdChmaW5hbCBib29sZWFuIHJlYWxseVVzZVF1b3RlZFByaW50YWJsZSwKLSAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIGFwcGVuZENoYXJzZXQsIGZpbmFsIFN0cmluZyBhZGRyZXNzRGF0YSkgewotICAgICAgICAgICAgdGhpcy5yZWFsbHlVc2VRdW90ZWRQcmludGFibGUgPSByZWFsbHlVc2VRdW90ZWRQcmludGFibGU7Ci0gICAgICAgICAgICB0aGlzLmFwcGVuZENoYXJzZXQgPSBhcHBlbmRDaGFyc2V0OwotICAgICAgICAgICAgdGhpcy5hZGRyZXNzRGF0YSA9IGFkZHJlc3NEYXRhOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBudWxsIHdoZW4gdGhlcmUncyBubyBpbmZvcm1hdGlvbiBhdmFpbGFibGUgdG8gY29uc3RydWN0IHRoZSBkYXRhLgotICAgICAqLwotICAgIHByaXZhdGUgUG9zdGFsU3RydWN0IHRyeUNvbnN0cnVjdFBvc3RhbFN0cnVjdChDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXMpIHsKLSAgICAgICAgLy8gYWRyLXZhbHVlICAgID0gMCo2KHRleHQtdmFsdWUgIjsiKSB0ZXh0LXZhbHVlCi0gICAgICAgIC8vICAgICAgICAgICAgICA7IFBPIEJveCwgRXh0ZW5kZWQgQWRkcmVzcywgU3RyZWV0LCBMb2NhbGl0eSwgUmVnaW9uLCBQb3N0YWwKLSAgICAgICAgLy8gICAgICAgICAgICAgIDsgQ29kZSwgQ291bnRyeSBOYW1lCi0gICAgICAgIGZpbmFsIFN0cmluZyByYXdQb0JveCA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoU3RydWN0dXJlZFBvc3RhbC5QT0JPWCk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyByYXdOZWlnaGJvcmhvb2QgPSBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKFN0cnVjdHVyZWRQb3N0YWwuTkVJR0hCT1JIT09EKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIHJhd1N0cmVldCA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoU3RydWN0dXJlZFBvc3RhbC5TVFJFRVQpOwotICAgICAgICBmaW5hbCBTdHJpbmcgcmF3TG9jYWxpdHkgPSBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKFN0cnVjdHVyZWRQb3N0YWwuQ0lUWSk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyByYXdSZWdpb24gPSBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKFN0cnVjdHVyZWRQb3N0YWwuUkVHSU9OKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIHJhd1Bvc3RhbENvZGUgPSBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKFN0cnVjdHVyZWRQb3N0YWwuUE9TVENPREUpOwotICAgICAgICBmaW5hbCBTdHJpbmcgcmF3Q291bnRyeSA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoU3RydWN0dXJlZFBvc3RhbC5DT1VOVFJZKTsKLSAgICAgICAgZmluYWwgU3RyaW5nW10gcmF3QWRkcmVzc0FycmF5ID0gbmV3IFN0cmluZ1tdewotICAgICAgICAgICAgICAgIHJhd1BvQm94LCByYXdOZWlnaGJvcmhvb2QsIHJhd1N0cmVldCwgcmF3TG9jYWxpdHksCi0gICAgICAgICAgICAgICAgcmF3UmVnaW9uLCByYXdQb3N0YWxDb2RlLCByYXdDb3VudHJ5fTsKLSAgICAgICAgaWYgKCFWQ2FyZFV0aWxzLmFyZUFsbEVtcHR5KHJhd0FkZHJlc3NBcnJheSkpIHsKLSAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gcmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlID0KLSAgICAgICAgICAgICAgICAobVNob3VsZFVzZVF1b3RlZFByaW50YWJsZSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgIVZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKHJhd0FkZHJlc3NBcnJheSkpOwotICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBhcHBlbmRDaGFyc2V0ID0KLSAgICAgICAgICAgICAgICAhVkNhcmRVdGlscy5jb250YWluc09ubHlQcmludGFibGVBc2NpaShyYXdBZGRyZXNzQXJyYXkpOwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVuY29kZWRQb0JveDsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBlbmNvZGVkU3RyZWV0OwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVuY29kZWRMb2NhbGl0eTsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBlbmNvZGVkUmVnaW9uOwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVuY29kZWRQb3N0YWxDb2RlOwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVuY29kZWRDb3VudHJ5OwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVuY29kZWROZWlnaGJvcmhvb2Q7Ci0KLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyByYXdMb2NhbGl0eTI7Ci0gICAgICAgICAgICAvLyBUaGlzIGxvb2tzIGluZWZmaWNpZW50IHNpbmNlIHdlIGVuY29kZSByYXdMb2NhbGl0eSBhbmQgcmF3TmVpZ2hib3Job29kIHR3aWNlLAotICAgICAgICAgICAgLy8gYnV0IHRoaXMgaXMgaW50ZW50aW9uYWwuCi0gICAgICAgICAgICAvLwotICAgICAgICAgICAgLy8gUVAgZW5jb2RpbmcgbWF5IGFkZCBsaW5lIGZlZWRzIHdoZW4gbmVlZGVkIGFuZCB0aGUgcmVzdWx0IG9mCi0gICAgICAgICAgICAvLyAtIGVuY29kZVF1b3RlZFByaW50YWJsZShyYXdMb2NhbGl0eSArICIgIiArIHJhd05laWdoYm9yaG9vZCkKLSAgICAgICAgICAgIC8vIG1heSBiZSBkaWZmZXJlbnQgZnJvbQotICAgICAgICAgICAgLy8gLSBlbmNvZGVkTG9jYWxpdHkgKyAiICIgKyBlbmNvZGVkTmVpZ2hib3Job29kLgotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIC8vIFdlIHVzZSBzYWZlciB3YXkuCi0gICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkocmF3TG9jYWxpdHkpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHJhd05laWdoYm9yaG9vZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmF3TG9jYWxpdHkyID0gIiI7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmF3TG9jYWxpdHkyID0gcmF3TmVpZ2hib3Job29kOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHJhd05laWdoYm9yaG9vZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmF3TG9jYWxpdHkyID0gcmF3TG9jYWxpdHk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmF3TG9jYWxpdHkyID0gcmF3TG9jYWxpdHkgKyAiICIgKyByYXdOZWlnaGJvcmhvb2Q7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHJlYWxseVVzZVF1b3RlZFByaW50YWJsZSkgewotICAgICAgICAgICAgICAgIGVuY29kZWRQb0JveCA9IGVuY29kZVF1b3RlZFByaW50YWJsZShyYXdQb0JveCk7Ci0gICAgICAgICAgICAgICAgZW5jb2RlZFN0cmVldCA9IGVuY29kZVF1b3RlZFByaW50YWJsZShyYXdTdHJlZXQpOwotICAgICAgICAgICAgICAgIGVuY29kZWRMb2NhbGl0eSA9IGVuY29kZVF1b3RlZFByaW50YWJsZShyYXdMb2NhbGl0eTIpOwotICAgICAgICAgICAgICAgIGVuY29kZWRSZWdpb24gPSBlbmNvZGVRdW90ZWRQcmludGFibGUocmF3UmVnaW9uKTsKLSAgICAgICAgICAgICAgICBlbmNvZGVkUG9zdGFsQ29kZSA9IGVuY29kZVF1b3RlZFByaW50YWJsZShyYXdQb3N0YWxDb2RlKTsKLSAgICAgICAgICAgICAgICBlbmNvZGVkQ291bnRyeSA9IGVuY29kZVF1b3RlZFByaW50YWJsZShyYXdDb3VudHJ5KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZW5jb2RlZFBvQm94ID0gZXNjYXBlQ2hhcmFjdGVycyhyYXdQb0JveCk7Ci0gICAgICAgICAgICAgICAgZW5jb2RlZFN0cmVldCA9IGVzY2FwZUNoYXJhY3RlcnMocmF3U3RyZWV0KTsKLSAgICAgICAgICAgICAgICBlbmNvZGVkTG9jYWxpdHkgPSBlc2NhcGVDaGFyYWN0ZXJzKHJhd0xvY2FsaXR5Mik7Ci0gICAgICAgICAgICAgICAgZW5jb2RlZFJlZ2lvbiA9IGVzY2FwZUNoYXJhY3RlcnMocmF3UmVnaW9uKTsKLSAgICAgICAgICAgICAgICBlbmNvZGVkUG9zdGFsQ29kZSA9IGVzY2FwZUNoYXJhY3RlcnMocmF3UG9zdGFsQ29kZSk7Ci0gICAgICAgICAgICAgICAgZW5jb2RlZENvdW50cnkgPSBlc2NhcGVDaGFyYWN0ZXJzKHJhd0NvdW50cnkpOwotICAgICAgICAgICAgICAgIGVuY29kZWROZWlnaGJvcmhvb2QgPSBlc2NhcGVDaGFyYWN0ZXJzKHJhd05laWdoYm9yaG9vZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmdCdWZmZXIgYWRkcmVzc0J1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgIGFkZHJlc3NCdWZmZXIuYXBwZW5kKGVuY29kZWRQb0JveCk7Ci0gICAgICAgICAgICBhZGRyZXNzQnVmZmVyLmFwcGVuZChWQ0FSRF9JVEVNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICBhZGRyZXNzQnVmZmVyLmFwcGVuZChWQ0FSRF9JVEVNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICBhZGRyZXNzQnVmZmVyLmFwcGVuZChlbmNvZGVkU3RyZWV0KTsKLSAgICAgICAgICAgIGFkZHJlc3NCdWZmZXIuYXBwZW5kKFZDQVJEX0lURU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgIGFkZHJlc3NCdWZmZXIuYXBwZW5kKGVuY29kZWRMb2NhbGl0eSk7Ci0gICAgICAgICAgICBhZGRyZXNzQnVmZmVyLmFwcGVuZChWQ0FSRF9JVEVNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICBhZGRyZXNzQnVmZmVyLmFwcGVuZChlbmNvZGVkUmVnaW9uKTsKLSAgICAgICAgICAgIGFkZHJlc3NCdWZmZXIuYXBwZW5kKFZDQVJEX0lURU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgIGFkZHJlc3NCdWZmZXIuYXBwZW5kKGVuY29kZWRQb3N0YWxDb2RlKTsKLSAgICAgICAgICAgIGFkZHJlc3NCdWZmZXIuYXBwZW5kKFZDQVJEX0lURU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgIGFkZHJlc3NCdWZmZXIuYXBwZW5kKGVuY29kZWRDb3VudHJ5KTsKLSAgICAgICAgICAgIHJldHVybiBuZXcgUG9zdGFsU3RydWN0KAotICAgICAgICAgICAgICAgICAgICByZWFsbHlVc2VRdW90ZWRQcmludGFibGUsIGFwcGVuZENoYXJzZXQsIGFkZHJlc3NCdWZmZXIudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0gZWxzZSB7ICAvLyBWQ2FyZFV0aWxzLmFyZUFsbEVtcHR5KHJhd0FkZHJlc3NBcnJheSkgPT0gdHJ1ZQotICAgICAgICAgICAgLy8gVHJ5IHRvIHVzZSBGT1JNQVRURURfQUREUkVTUyBpbnN0ZWFkLgotICAgICAgICAgICAgZmluYWwgU3RyaW5nIHJhd0Zvcm1hdHRlZEFkZHJlc3MgPQotICAgICAgICAgICAgICAgIGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoU3RydWN0dXJlZFBvc3RhbC5GT1JNQVRURURfQUREUkVTUyk7Ci0gICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkocmF3Rm9ybWF0dGVkQWRkcmVzcykpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gcmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlID0KLSAgICAgICAgICAgICAgICAobVNob3VsZFVzZVF1b3RlZFByaW50YWJsZSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgIVZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKHJhd0Zvcm1hdHRlZEFkZHJlc3MpKTsKLSAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gYXBwZW5kQ2hhcnNldCA9Ci0gICAgICAgICAgICAgICAgIVZDYXJkVXRpbHMuY29udGFpbnNPbmx5UHJpbnRhYmxlQXNjaWkocmF3Rm9ybWF0dGVkQWRkcmVzcyk7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgZW5jb2RlZEZvcm1hdHRlZEFkZHJlc3M7Ci0gICAgICAgICAgICBpZiAocmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlKSB7Ci0gICAgICAgICAgICAgICAgZW5jb2RlZEZvcm1hdHRlZEFkZHJlc3MgPSBlbmNvZGVRdW90ZWRQcmludGFibGUocmF3Rm9ybWF0dGVkQWRkcmVzcyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGVuY29kZWRGb3JtYXR0ZWRBZGRyZXNzID0gZXNjYXBlQ2hhcmFjdGVycyhyYXdGb3JtYXR0ZWRBZGRyZXNzKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gV2UgdXNlIHRoZSBzZWNvbmQgdmFsdWUgKCJFeHRlbmRlZCBBZGRyZXNzIikganVzdCBiZWNhdXNlIEphcGFuZXNlIG1vYmlsZSBwaG9uZXMKLSAgICAgICAgICAgIC8vIGRvIHNvLiBJZiB0aGUgb3RoZXIgaW1wb3J0ZXIgZXhwZWN0cyB0aGUgdmFsdWUgYmUgaW4gdGhlIG90aGVyIGZpZWxkLCBzb21lIGZsYWcgbWF5Ci0gICAgICAgICAgICAvLyBiZSBuZWVkZWQuCi0gICAgICAgICAgICBmaW5hbCBTdHJpbmdCdWZmZXIgYWRkcmVzc0J1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgIGFkZHJlc3NCdWZmZXIuYXBwZW5kKFZDQVJEX0lURU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgIGFkZHJlc3NCdWZmZXIuYXBwZW5kKGVuY29kZWRGb3JtYXR0ZWRBZGRyZXNzKTsKLSAgICAgICAgICAgIGFkZHJlc3NCdWZmZXIuYXBwZW5kKFZDQVJEX0lURU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgIGFkZHJlc3NCdWZmZXIuYXBwZW5kKFZDQVJEX0lURU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgIGFkZHJlc3NCdWZmZXIuYXBwZW5kKFZDQVJEX0lURU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgIGFkZHJlc3NCdWZmZXIuYXBwZW5kKFZDQVJEX0lURU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgIGFkZHJlc3NCdWZmZXIuYXBwZW5kKFZDQVJEX0lURU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgIHJldHVybiBuZXcgUG9zdGFsU3RydWN0KAotICAgICAgICAgICAgICAgICAgICByZWFsbHlVc2VRdW90ZWRQcmludGFibGUsIGFwcGVuZENoYXJzZXQsIGFkZHJlc3NCdWZmZXIudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgVkNhcmRCdWlsZGVyIGFwcGVuZEltcyhmaW5hbCBMaXN0PENvbnRlbnRWYWx1ZXM+IGNvbnRlbnRWYWx1ZXNMaXN0KSB7Ci0gICAgICAgIGlmIChjb250ZW50VmFsdWVzTGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKENvbnRlbnRWYWx1ZXMgY29udGVudFZhbHVlcyA6IGNvbnRlbnRWYWx1ZXNMaXN0KSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgSW50ZWdlciBwcm90b2NvbEFzT2JqZWN0ID0gY29udGVudFZhbHVlcy5nZXRBc0ludGVnZXIoSW0uUFJPVE9DT0wpOwotICAgICAgICAgICAgICAgIGlmIChwcm90b2NvbEFzT2JqZWN0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwcm9wZXJ0eU5hbWUgPSBWQ2FyZFV0aWxzLmdldFByb3BlcnR5TmFtZUZvckltKHByb3RvY29sQXNPYmplY3QpOwotICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eU5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGRhdGEgPSBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKEltLkRBVEEpOwotICAgICAgICAgICAgICAgIGlmIChkYXRhICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdGEudHJpbSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkoZGF0YSkpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB0eXBlQXNTdHJpbmc7Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBJbnRlZ2VyIHR5cGVBc0ludGVnZXIgPSBjb250ZW50VmFsdWVzLmdldEFzSW50ZWdlcihJbS5UWVBFKTsKLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh0eXBlQXNJbnRlZ2VyICE9IG51bGwgPyB0eXBlQXNJbnRlZ2VyIDogSW0uVFlQRV9PVEhFUikgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBJbS5UWVBFX0hPTUU6IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlQXNTdHJpbmcgPSBWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX0hPTUU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEltLlRZUEVfV09SSzogewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVBc1N0cmluZyA9IFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfV09SSzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSW0uVFlQRV9DVVNUT006IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbGFiZWwgPSBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKEltLkxBQkVMKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlQXNTdHJpbmcgPSAobGFiZWwgIT0gbnVsbCA/ICJYLSIgKyBsYWJlbCA6IG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBJbS5UWVBFX09USEVSOiAgLy8gSWdub3JlCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZUFzU3RyaW5nID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiBwYXJhbWV0ZXJMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgICAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eSh0eXBlQXNTdHJpbmcpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlckxpc3QuYWRkKHR5cGVBc1N0cmluZyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZpbmFsIEludGVnZXIgaXNQcmltYXJ5QXNJbnRlZ2VyID0gY29udGVudFZhbHVlcy5nZXRBc0ludGVnZXIoSW0uSVNfUFJJTUFSWSk7Ci0gICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBpc1ByaW1hcnkgPSAoaXNQcmltYXJ5QXNJbnRlZ2VyICE9IG51bGwgPwotICAgICAgICAgICAgICAgICAgICAgICAgKGlzUHJpbWFyeUFzSW50ZWdlciA+IDApIDogZmFsc2UpOwotICAgICAgICAgICAgICAgIGlmIChpc1ByaW1hcnkpIHsKLSAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyTGlzdC5hZGQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9QUkVGKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBhcHBlbmRMaW5lV2l0aENoYXJzZXRBbmRRUERldGVjdGlvbihwcm9wZXJ0eU5hbWUsIHBhcmFtZXRlckxpc3QsIGRhdGEpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIHB1YmxpYyBWQ2FyZEJ1aWxkZXIgYXBwZW5kV2Vic2l0ZXMoZmluYWwgTGlzdDxDb250ZW50VmFsdWVzPiBjb250ZW50VmFsdWVzTGlzdCkgewotICAgICAgICBpZiAoY29udGVudFZhbHVlc0xpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXMgOiBjb250ZW50VmFsdWVzTGlzdCkgewotICAgICAgICAgICAgICAgIFN0cmluZyB3ZWJzaXRlID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhXZWJzaXRlLlVSTCk7Ci0gICAgICAgICAgICAgICAgaWYgKHdlYnNpdGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB3ZWJzaXRlID0gd2Vic2l0ZS50cmltKCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gTm90ZTogdkNhcmQgMy4wIGRvZXMgbm90IGFsbG93IGFueSBwYXJhbWV0ZXIgYWRkaXRpb24gdG93YXJkICJVUkwiCi0gICAgICAgICAgICAgICAgLy8gICAgICAgcHJvcGVydHksIHdoaWxlIHRoZXJlJ3Mgbm8gZG9jdW1lbnQgaW4gdkNhcmQgMi4xLgotICAgICAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkod2Vic2l0ZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgYXBwZW5kTGluZVdpdGhDaGFyc2V0QW5kUVBEZXRlY3Rpb24oVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfVVJMLCB3ZWJzaXRlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgcHVibGljIFZDYXJkQnVpbGRlciBhcHBlbmRPcmdhbml6YXRpb25zKGZpbmFsIExpc3Q8Q29udGVudFZhbHVlcz4gY29udGVudFZhbHVlc0xpc3QpIHsKLSAgICAgICAgaWYgKGNvbnRlbnRWYWx1ZXNMaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzIDogY29udGVudFZhbHVlc0xpc3QpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgY29tcGFueSA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoT3JnYW5pemF0aW9uLkNPTVBBTlkpOwotICAgICAgICAgICAgICAgIGlmIChjb21wYW55ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY29tcGFueSA9IGNvbXBhbnkudHJpbSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBTdHJpbmcgZGVwYXJ0bWVudCA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoT3JnYW5pemF0aW9uLkRFUEFSVE1FTlQpOwotICAgICAgICAgICAgICAgIGlmIChkZXBhcnRtZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgZGVwYXJ0bWVudCA9IGRlcGFydG1lbnQudHJpbSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBTdHJpbmcgdGl0bGUgPSBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKE9yZ2FuaXphdGlvbi5USVRMRSk7Ci0gICAgICAgICAgICAgICAgaWYgKHRpdGxlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSB0aXRsZS50cmltKCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBvcmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KGNvbXBhbnkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG9yZ0J1aWxkZXIuYXBwZW5kKGNvbXBhbnkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KGRlcGFydG1lbnQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChvcmdCdWlsZGVyLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgb3JnQnVpbGRlci5hcHBlbmQoJzsnKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBvcmdCdWlsZGVyLmFwcGVuZChkZXBhcnRtZW50KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG9yZ2xpbmUgPSBvcmdCdWlsZGVyLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgYXBwZW5kTGluZShWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9PUkcsIG9yZ2xpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAhVkNhcmRVdGlscy5jb250YWluc09ubHlQcmludGFibGVBc2NpaShvcmdsaW5lKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChtU2hvdWxkVXNlUXVvdGVkUHJpbnRhYmxlICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFWQ2FyZFV0aWxzLmNvbnRhaW5zT25seU5vbkNyTGZQcmludGFibGVBc2NpaShvcmdsaW5lKSkpOwotCi0gICAgICAgICAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eSh0aXRsZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgYXBwZW5kTGluZShWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9USVRMRSwgdGl0bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIVZDYXJkVXRpbHMuY29udGFpbnNPbmx5UHJpbnRhYmxlQXNjaWkodGl0bGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtU2hvdWxkVXNlUXVvdGVkUHJpbnRhYmxlICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkodGl0bGUpKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIHB1YmxpYyBWQ2FyZEJ1aWxkZXIgYXBwZW5kUGhvdG9zKGZpbmFsIExpc3Q8Q29udGVudFZhbHVlcz4gY29udGVudFZhbHVlc0xpc3QpIHsKLSAgICAgICAgaWYgKGNvbnRlbnRWYWx1ZXNMaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzIDogY29udGVudFZhbHVlc0xpc3QpIHsKLSAgICAgICAgICAgICAgICBpZiAoY29udGVudFZhbHVlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBieXRlW10gZGF0YSA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNCeXRlQXJyYXkoUGhvdG8uUEhPVE8pOwotICAgICAgICAgICAgICAgIGlmIChkYXRhID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwaG90b1R5cGUgPSBWQ2FyZFV0aWxzLmd1ZXNzSW1hZ2VUeXBlKGRhdGEpOwotICAgICAgICAgICAgICAgIGlmIChwaG90b1R5cGUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiVW5rbm93biBwaG90byB0eXBlLiBJZ25vcmVkLiIpOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHBob3RvU3RyaW5nID0gbmV3IFN0cmluZyhCYXNlNjQuZW5jb2RlQmFzZTY0KGRhdGEpKTsKLSAgICAgICAgICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHBob3RvU3RyaW5nKSkgewotICAgICAgICAgICAgICAgICAgICBhcHBlbmRQaG90b0xpbmUocGhvdG9TdHJpbmcsIHBob3RvVHlwZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIHB1YmxpYyBWQ2FyZEJ1aWxkZXIgYXBwZW5kTm90ZXMoZmluYWwgTGlzdDxDb250ZW50VmFsdWVzPiBjb250ZW50VmFsdWVzTGlzdCkgewotICAgICAgICBpZiAoY29udGVudFZhbHVlc0xpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKG1Pbmx5T25lTm90ZUZpZWxkSXNBdmFpbGFibGUpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIG5vdGVCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgICAgICBib29sZWFuIGZpcnN0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBmb3IgKGZpbmFsIENvbnRlbnRWYWx1ZXMgY29udGVudFZhbHVlcyA6IGNvbnRlbnRWYWx1ZXNMaXN0KSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBub3RlID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhOb3RlLk5PVEUpOwotICAgICAgICAgICAgICAgICAgICBpZiAobm90ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBub3RlID0gIiI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG5vdGUubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RlQnVpbGRlci5hcHBlbmQoJ1xuJyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBub3RlQnVpbGRlci5hcHBlbmQobm90ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG5vdGVTdHIgPSBub3RlQnVpbGRlci50b1N0cmluZygpOwotICAgICAgICAgICAgICAgIC8vIFRoaXMgbWVhbnMgd2Ugc2NhbiBub3RlU3RyIGNvbXBsZXRlbHkgdHdpY2UsIHdoaWNoIGlzIHJlZHVuZGFudC4KLSAgICAgICAgICAgICAgICAvLyBCdXQgZm9yIG5vdywgd2UgYXNzdW1lIHRoaXMgaXMgbm90IHNvIHRpbWUtY29uc3VtaW5nLi4KLSAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIHNob3VsZEFwcGVuZENoYXJzZXRJbmZvID0KLSAgICAgICAgICAgICAgICAgICAgIVZDYXJkVXRpbHMuY29udGFpbnNPbmx5UHJpbnRhYmxlQXNjaWkobm90ZVN0cik7Ci0gICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiByZWFsbHlVc2VRdW90ZWRQcmludGFibGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgKG1TaG91bGRVc2VRdW90ZWRQcmludGFibGUgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAhVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkobm90ZVN0cikpOwotICAgICAgICAgICAgICAgIGFwcGVuZExpbmUoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfTk9URSwgbm90ZVN0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZEFwcGVuZENoYXJzZXRJbmZvLCByZWFsbHlVc2VRdW90ZWRQcmludGFibGUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmb3IgKENvbnRlbnRWYWx1ZXMgY29udGVudFZhbHVlcyA6IGNvbnRlbnRWYWx1ZXNMaXN0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBub3RlU3RyID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhOb3RlLk5PVEUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KG5vdGVTdHIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIHNob3VsZEFwcGVuZENoYXJzZXRJbmZvID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIVZDYXJkVXRpbHMuY29udGFpbnNPbmx5UHJpbnRhYmxlQXNjaWkobm90ZVN0cik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIHJlYWxseVVzZVF1b3RlZFByaW50YWJsZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtU2hvdWxkVXNlUXVvdGVkUHJpbnRhYmxlICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkobm90ZVN0cikpOwotICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kTGluZShWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9OT1RFLCBub3RlU3RyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG91bGRBcHBlbmRDaGFyc2V0SW5mbywgcmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVkNhcmRCdWlsZGVyIGFwcGVuZEV2ZW50cyhmaW5hbCBMaXN0PENvbnRlbnRWYWx1ZXM+IGNvbnRlbnRWYWx1ZXNMaXN0KSB7Ci0gICAgICAgIGlmIChjb250ZW50VmFsdWVzTGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmcgcHJpbWFyeUJpcnRoZGF5ID0gbnVsbDsKLSAgICAgICAgICAgIFN0cmluZyBzZWNvbmRhcnlCaXJ0aGRheSA9IG51bGw7Ci0gICAgICAgICAgICBmb3IgKGZpbmFsIENvbnRlbnRWYWx1ZXMgY29udGVudFZhbHVlcyA6IGNvbnRlbnRWYWx1ZXNMaXN0KSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbnRlbnRWYWx1ZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZmluYWwgSW50ZWdlciBldmVudFR5cGVBc0ludGVnZXIgPSBjb250ZW50VmFsdWVzLmdldEFzSW50ZWdlcihFdmVudC5UWVBFKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgZXZlbnRUeXBlOwotICAgICAgICAgICAgICAgIGlmIChldmVudFR5cGVBc0ludGVnZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBldmVudFR5cGUgPSBldmVudFR5cGVBc0ludGVnZXI7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlID0gRXZlbnQuVFlQRV9PVEhFUjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGV2ZW50VHlwZSA9PSBFdmVudC5UWVBFX0JJUlRIREFZKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBiaXJ0aGRheUNhbmRpZGF0ZSA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoRXZlbnQuU1RBUlRfREFURSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChiaXJ0aGRheUNhbmRpZGF0ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBmaW5hbCBJbnRlZ2VyIGlzU3VwZXJQcmltYXJ5QXNJbnRlZ2VyID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRWYWx1ZXMuZ2V0QXNJbnRlZ2VyKEV2ZW50LklTX1NVUEVSX1BSSU1BUlkpOwotICAgICAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIGlzU3VwZXJQcmltYXJ5ID0gKGlzU3VwZXJQcmltYXJ5QXNJbnRlZ2VyICE9IG51bGwgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpc1N1cGVyUHJpbWFyeUFzSW50ZWdlciA+IDApIDogZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICBpZiAoaXNTdXBlclByaW1hcnkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vICJzdXBlciBwcmltYXJ5IiBiaXJ0aGRheSBzaG91bGQgdGhlIHByZWZlcmVkIG9uZS4KLSAgICAgICAgICAgICAgICAgICAgICAgIHByaW1hcnlCaXJ0aGRheSA9IGJpcnRoZGF5Q2FuZGlkYXRlOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZmluYWwgSW50ZWdlciBpc1ByaW1hcnlBc0ludGVnZXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFZhbHVlcy5nZXRBc0ludGVnZXIoRXZlbnQuSVNfUFJJTUFSWSk7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNQcmltYXJ5ID0gKGlzUHJpbWFyeUFzSW50ZWdlciAhPSBudWxsID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaXNQcmltYXJ5QXNJbnRlZ2VyID4gMCkgOiBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpc1ByaW1hcnkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGRvbid0IGJyZWFrIGhlcmUgc2luY2UgInN1cGVyIHByaW1hcnkiIGJpcnRoZGF5IG1heSBleGlzdCBsYXRlci4KLSAgICAgICAgICAgICAgICAgICAgICAgIHByaW1hcnlCaXJ0aGRheSA9IGJpcnRoZGF5Q2FuZGlkYXRlOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNlY29uZGFyeUJpcnRoZGF5ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZpcnN0IGVudHJ5IGlzIHNldCB0byB0aGUgInNlY29uZGFyeSIgY2FuZGlkYXRlLgotICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kYXJ5QmlydGhkYXkgPSBiaXJ0aGRheUNhbmRpZGF0ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobVVzZXNBbmRyb2lkUHJvcGVydHkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gRXZlbnQgdHlwZXMgb3RoZXIgdGhhbiBCaXJ0aGRheSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHZDYXJkLgotICAgICAgICAgICAgICAgICAgICBhcHBlbmRBbmRyb2lkU3BlY2lmaWNQcm9wZXJ0eShFdmVudC5DT05URU5UX0lURU1fVFlQRSwgY29udGVudFZhbHVlcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHByaW1hcnlCaXJ0aGRheSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYXBwZW5kTGluZVdpdGhDaGFyc2V0QW5kUVBEZXRlY3Rpb24oVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfQkRBWSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHByaW1hcnlCaXJ0aGRheS50cmltKCkpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChzZWNvbmRhcnlCaXJ0aGRheSAhPSBudWxsKXsKLSAgICAgICAgICAgICAgICBhcHBlbmRMaW5lV2l0aENoYXJzZXRBbmRRUERldGVjdGlvbihWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9CREFZLAotICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kYXJ5QmlydGhkYXkudHJpbSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVkNhcmRCdWlsZGVyIGFwcGVuZFJlbGF0aW9uKGZpbmFsIExpc3Q8Q29udGVudFZhbHVlcz4gY29udGVudFZhbHVlc0xpc3QpIHsKLSAgICAgICAgaWYgKG1Vc2VzQW5kcm9pZFByb3BlcnR5ICYmIGNvbnRlbnRWYWx1ZXNMaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoZmluYWwgQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzIDogY29udGVudFZhbHVlc0xpc3QpIHsKLSAgICAgICAgICAgICAgICBpZiAoY29udGVudFZhbHVlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBhcHBlbmRBbmRyb2lkU3BlY2lmaWNQcm9wZXJ0eShSZWxhdGlvbi5DT05URU5UX0lURU1fVFlQRSwgY29udGVudFZhbHVlcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYXBwZW5kUG9zdGFsTGluZShmaW5hbCBpbnQgdHlwZSwgZmluYWwgU3RyaW5nIGxhYmVsLAotICAgICAgICAgICAgZmluYWwgQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzLAotICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBpc1ByaW1hcnksIGZpbmFsIGJvb2xlYW4gZW1pdExpbmVFdmVyeVRpbWUpIHsKLSAgICAgICAgZmluYWwgYm9vbGVhbiByZWFsbHlVc2VRdW90ZWRQcmludGFibGU7Ci0gICAgICAgIGZpbmFsIGJvb2xlYW4gYXBwZW5kQ2hhcnNldDsKLSAgICAgICAgZmluYWwgU3RyaW5nIGFkZHJlc3NWYWx1ZTsKLSAgICAgICAgewotICAgICAgICAgICAgUG9zdGFsU3RydWN0IHBvc3RhbFN0cnVjdCA9IHRyeUNvbnN0cnVjdFBvc3RhbFN0cnVjdChjb250ZW50VmFsdWVzKTsKLSAgICAgICAgICAgIGlmIChwb3N0YWxTdHJ1Y3QgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChlbWl0TGluZUV2ZXJ5VGltZSkgewotICAgICAgICAgICAgICAgICAgICByZWFsbHlVc2VRdW90ZWRQcmludGFibGUgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgYXBwZW5kQ2hhcnNldCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBhZGRyZXNzVmFsdWUgPSAiIjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZWFsbHlVc2VRdW90ZWRQcmludGFibGUgPSBwb3N0YWxTdHJ1Y3QucmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlOwotICAgICAgICAgICAgICAgIGFwcGVuZENoYXJzZXQgPSBwb3N0YWxTdHJ1Y3QuYXBwZW5kQ2hhcnNldDsKLSAgICAgICAgICAgICAgICBhZGRyZXNzVmFsdWUgPSBwb3N0YWxTdHJ1Y3QuYWRkcmVzc0RhdGE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBMaXN0PFN0cmluZz4gcGFyYW1ldGVyTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICBpZiAoaXNQcmltYXJ5KSB7Ci0gICAgICAgICAgICBwYXJhbWV0ZXJMaXN0LmFkZChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX1BSRUYpOwotICAgICAgICB9Ci0gICAgICAgIHN3aXRjaCAodHlwZSkgewotICAgICAgICAgICAgY2FzZSBTdHJ1Y3R1cmVkUG9zdGFsLlRZUEVfSE9NRTogewotICAgICAgICAgICAgICAgIHBhcmFtZXRlckxpc3QuYWRkKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfSE9NRSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFN0cnVjdHVyZWRQb3N0YWwuVFlQRV9XT1JLOiB7Ci0gICAgICAgICAgICAgICAgcGFyYW1ldGVyTGlzdC5hZGQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9XT1JLKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgU3RydWN0dXJlZFBvc3RhbC5UWVBFX0NVU1RPTTogewotICAgICAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkobGFiZWwpCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiBWQ2FyZFV0aWxzLmNvbnRhaW5zT25seUFscGhhRGlnaXRIeXBoZW4obGFiZWwpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFdlJ3JlIG5vdCBzdXJlIHdoZXRoZXIgdGhlIGxhYmVsIGlzIHZhbGlkIGluIHRoZSBzcGVjCi0gICAgICAgICAgICAgICAgICAgIC8vICgiSUFOQS10b2tlbiIgaW4gdGhlIHZDYXJkIDMuMCBpcyB1bmNsZWFyLi4uKQotICAgICAgICAgICAgICAgICAgICAvLyBKdXN0ICBmb3Igc2FmZXR5LCB3ZSBhZGQgIlgtIiBhdCB0aGUgYmVnZ2luaW5nIG9mIGVhY2ggbGFiZWwuCi0gICAgICAgICAgICAgICAgICAgIC8vIEFsc28gY2hlY2tzIHRoZSBsYWJlbCBvYmV5cyB3aXRoIHZDYXJkIDMuMCBzcGVjLgotICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJMaXN0LmFkZCgiWC0iICsgbGFiZWwpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgU3RydWN0dXJlZFBvc3RhbC5UWVBFX09USEVSOiB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkZWZhdWx0OiB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIlVua25vd24gU3RydWN0dXJlZFBvc3RhbCB0eXBlOiAiICsgdHlwZSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfQURSKTsKLSAgICAgICAgaWYgKCFwYXJhbWV0ZXJMaXN0LmlzRW1wdHkoKSkgewotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICBhcHBlbmRUeXBlUGFyYW1ldGVycyhwYXJhbWV0ZXJMaXN0KTsKLSAgICAgICAgfQotICAgICAgICBpZiAoYXBwZW5kQ2hhcnNldCkgewotICAgICAgICAgICAgLy8gU3RyaWN0bHksIHZDYXJkIDMuMCBkb2VzIG5vdCBhbGxvdyBleHBvcnRlcnMgdG8gZW1pdCBjaGFyc2V0IGluZm9ybWF0aW9uLAotICAgICAgICAgICAgLy8gYnV0IHdlIHdpbGwgYWRkIGl0IHNpbmNlIHRoZSBpbmZvcm1hdGlvbiBzaG91bGQgYmUgdXNlZnVsIGZvciBpbXBvcnRlcnMsCi0gICAgICAgICAgICAvLwotICAgICAgICAgICAgLy8gQXNzdW1lIG5vIHBhcnNlciBkb2VzIG5vdCBlbWl0IGVycm9yIHdpdGggdGhpcyBwYXJhbWV0ZXIgaW4gdkNhcmQgMy4wLgotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQobVZDYXJkQ2hhcnNldFBhcmFtZXRlcik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJlYWxseVVzZVF1b3RlZFByaW50YWJsZSkgewotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fRU5DT0RJTkdfUVApOwotICAgICAgICB9Ci0gICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9EQVRBX1NFUEFSQVRPUik7Ci0gICAgICAgIG1CdWlsZGVyLmFwcGVuZChhZGRyZXNzVmFsdWUpOwotICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfRU5EX09GX0xJTkUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFwcGVuZEVtYWlsTGluZShmaW5hbCBpbnQgdHlwZSwgZmluYWwgU3RyaW5nIGxhYmVsLAotICAgICAgICAgICAgZmluYWwgU3RyaW5nIHJhd1ZhbHVlLCBmaW5hbCBib29sZWFuIGlzUHJpbWFyeSkgewotICAgICAgICBmaW5hbCBTdHJpbmcgdHlwZUFzU3RyaW5nOwotICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKLSAgICAgICAgICAgIGNhc2UgRW1haWwuVFlQRV9DVVNUT006IHsKLSAgICAgICAgICAgICAgICBpZiAoVkNhcmRVdGlscy5pc01vYmlsZVBob25lTGFiZWwobGFiZWwpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHR5cGVBc1N0cmluZyA9IFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfQ0VMTDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShsYWJlbCkKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIFZDYXJkVXRpbHMuY29udGFpbnNPbmx5QWxwaGFEaWdpdEh5cGhlbihsYWJlbCkpIHsKLSAgICAgICAgICAgICAgICAgICAgdHlwZUFzU3RyaW5nID0gIlgtIiArIGxhYmVsOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHR5cGVBc1N0cmluZyA9IG51bGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBFbWFpbC5UWVBFX0hPTUU6IHsKLSAgICAgICAgICAgICAgICB0eXBlQXNTdHJpbmcgPSBWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX0hPTUU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIEVtYWlsLlRZUEVfV09SSzogewotICAgICAgICAgICAgICAgIHR5cGVBc1N0cmluZyA9IFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfV09SSzsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgRW1haWwuVFlQRV9PVEhFUjogewotICAgICAgICAgICAgICAgIHR5cGVBc1N0cmluZyA9IG51bGw7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIEVtYWlsLlRZUEVfTU9CSUxFOiB7Ci0gICAgICAgICAgICAgICAgdHlwZUFzU3RyaW5nID0gVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9DRUxMOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGVmYXVsdDogewotICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJVbmtub3duIEVtYWlsIHR5cGU6ICIgKyB0eXBlKTsKLSAgICAgICAgICAgICAgICB0eXBlQXNTdHJpbmcgPSBudWxsOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IHBhcmFtZXRlckxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgaWYgKGlzUHJpbWFyeSkgewotICAgICAgICAgICAgcGFyYW1ldGVyTGlzdC5hZGQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9QUkVGKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHR5cGVBc1N0cmluZykpIHsKLSAgICAgICAgICAgIHBhcmFtZXRlckxpc3QuYWRkKHR5cGVBc1N0cmluZyk7Ci0gICAgICAgIH0KLQotICAgICAgICBhcHBlbmRMaW5lV2l0aENoYXJzZXRBbmRRUERldGVjdGlvbihWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9FTUFJTCwgcGFyYW1ldGVyTGlzdCwKLSAgICAgICAgICAgICAgICByYXdWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYXBwZW5kVGVsTGluZShmaW5hbCBJbnRlZ2VyIHR5cGVBc0ludGVnZXIsIGZpbmFsIFN0cmluZyBsYWJlbCwKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBlbmNvZGVkVmFsdWUsIGJvb2xlYW4gaXNQcmltYXJ5KSB7Ci0gICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9URUwpOwotICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fU0VQQVJBVE9SKTsKLQotICAgICAgICBmaW5hbCBpbnQgdHlwZTsKLSAgICAgICAgaWYgKHR5cGVBc0ludGVnZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgdHlwZSA9IFBob25lLlRZUEVfT1RIRVI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0eXBlID0gdHlwZUFzSW50ZWdlcjsKLSAgICAgICAgfQotCi0gICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IHBhcmFtZXRlckxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgc3dpdGNoICh0eXBlKSB7Ci0gICAgICAgICAgICBjYXNlIFBob25lLlRZUEVfSE9NRTogewotICAgICAgICAgICAgICAgIHBhcmFtZXRlckxpc3QuYWRkQWxsKAotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX0hPTUUpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgUGhvbmUuVFlQRV9XT1JLOiB7Ci0gICAgICAgICAgICAgICAgcGFyYW1ldGVyTGlzdC5hZGRBbGwoCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfV09SSykpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBQaG9uZS5UWVBFX0ZBWF9IT01FOiB7Ci0gICAgICAgICAgICAgICAgcGFyYW1ldGVyTGlzdC5hZGRBbGwoCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfSE9NRSwgVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9GQVgpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgUGhvbmUuVFlQRV9GQVhfV09SSzogewotICAgICAgICAgICAgICAgIHBhcmFtZXRlckxpc3QuYWRkQWxsKAotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX1dPUkssIFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfRkFYKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFBob25lLlRZUEVfTU9CSUxFOiB7Ci0gICAgICAgICAgICAgICAgcGFyYW1ldGVyTGlzdC5hZGQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9DRUxMKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgUGhvbmUuVFlQRV9QQUdFUjogewotICAgICAgICAgICAgICAgIGlmIChtSXNEb0NvTW8pIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gTm90IHN1cmUgYWJvdXQgdGhlIHJlYXNvbiwgYnV0IHByZXZpb3VzIGltcGxlbWVudGF0aW9uIGhhZAotICAgICAgICAgICAgICAgICAgICAvLyB1c2VkICJWT0lDRSIgaW5zdGVhZCBvZiAiUEFHRVIiCi0gICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlckxpc3QuYWRkKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfVk9JQ0UpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlckxpc3QuYWRkKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfUEFHRVIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgUGhvbmUuVFlQRV9PVEhFUjogewotICAgICAgICAgICAgICAgIHBhcmFtZXRlckxpc3QuYWRkKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfVk9JQ0UpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBQaG9uZS5UWVBFX0NBUjogewotICAgICAgICAgICAgICAgIHBhcmFtZXRlckxpc3QuYWRkKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfQ0FSKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgUGhvbmUuVFlQRV9DT01QQU5ZX01BSU46IHsKLSAgICAgICAgICAgICAgICAvLyBUaGVyZSdzIG5vIHJlbGV2YW50IGZpZWxkIGluIHZDYXJkIChhdCBsZWFzdCAyLjEpLgotICAgICAgICAgICAgICAgIHBhcmFtZXRlckxpc3QuYWRkKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfV09SSyk7Ci0gICAgICAgICAgICAgICAgaXNQcmltYXJ5ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgUGhvbmUuVFlQRV9JU0ROOiB7Ci0gICAgICAgICAgICAgICAgcGFyYW1ldGVyTGlzdC5hZGQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9JU0ROKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgUGhvbmUuVFlQRV9NQUlOOiB7Ci0gICAgICAgICAgICAgICAgaXNQcmltYXJ5ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgUGhvbmUuVFlQRV9PVEhFUl9GQVg6IHsKLSAgICAgICAgICAgICAgICBwYXJhbWV0ZXJMaXN0LmFkZChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX0ZBWCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFBob25lLlRZUEVfVEVMRVg6IHsKLSAgICAgICAgICAgICAgICBwYXJhbWV0ZXJMaXN0LmFkZChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX1RMWCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFBob25lLlRZUEVfV09SS19NT0JJTEU6IHsKLSAgICAgICAgICAgICAgICBwYXJhbWV0ZXJMaXN0LmFkZEFsbCgKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9XT1JLLCBWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX0NFTEwpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgUGhvbmUuVFlQRV9XT1JLX1BBR0VSOiB7Ci0gICAgICAgICAgICAgICAgcGFyYW1ldGVyTGlzdC5hZGQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9XT1JLKTsKLSAgICAgICAgICAgICAgICAvLyBTZWUgYWJvdmUuCi0gICAgICAgICAgICAgICAgaWYgKG1Jc0RvQ29NbykgewotICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJMaXN0LmFkZChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX1ZPSUNFKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJMaXN0LmFkZChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX1BBR0VSKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFBob25lLlRZUEVfTU1TOiB7Ci0gICAgICAgICAgICAgICAgcGFyYW1ldGVyTGlzdC5hZGQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9NU0cpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBQaG9uZS5UWVBFX0NVU1RPTTogewotICAgICAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShsYWJlbCkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSnVzdCBpZ25vcmUgdGhlIGN1c3RvbSB0eXBlLgotICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJMaXN0LmFkZChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX1ZPSUNFKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFZDYXJkVXRpbHMuaXNNb2JpbGVQaG9uZUxhYmVsKGxhYmVsKSkgewotICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJMaXN0LmFkZChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX0NFTEwpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobUlzVjMwKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgbGFiZWwgaXMgYXBwcm9wcmlhdGVseSBlbmNvZGVkIGluIGFwcGVuZFR5cGVQYXJhbWV0ZXJzLgotICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJMaXN0LmFkZChsYWJlbCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHVwcGVyTGFiZWwgPSBsYWJlbC50b1VwcGVyQ2FzZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoVkNhcmRVdGlscy5pc1ZhbGlkSW5WMjFCdXRVbmtub3duVG9Db250YWN0c1Bob3RlVHlwZSh1cHBlckxhYmVsKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyTGlzdC5hZGQodXBwZXJMYWJlbCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoVkNhcmRVdGlscy5jb250YWluc09ubHlBbHBoYURpZ2l0SHlwaGVuKGxhYmVsKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm90ZTogU3RyaWN0bHksIHZDYXJkIDIuMSBkb2VzIG5vdCBhbGxvdyAiWC0iIHBhcmFtZXRlciB3aXRob3V0Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAiVFlQRT0iIHN0cmluZy4KLSAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlckxpc3QuYWRkKCJYLSIgKyBsYWJlbCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFBob25lLlRZUEVfUkFESU86Ci0gICAgICAgICAgICBjYXNlIFBob25lLlRZUEVfVFRZX1RERDoKLSAgICAgICAgICAgIGRlZmF1bHQ6IHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChpc1ByaW1hcnkpIHsKLSAgICAgICAgICAgIHBhcmFtZXRlckxpc3QuYWRkKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfUFJFRik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocGFyYW1ldGVyTGlzdC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIGFwcGVuZFVuY29tbW9uUGhvbmVUeXBlKG1CdWlsZGVyLCB0eXBlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGFwcGVuZFR5cGVQYXJhbWV0ZXJzKHBhcmFtZXRlckxpc3QpOwotICAgICAgICB9Ci0KLSAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0RBVEFfU0VQQVJBVE9SKTsKLSAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKGVuY29kZWRWYWx1ZSk7Ci0gICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9FTkRfT0ZfTElORSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQXBwZW5kcyBwaG9uZSB0eXBlIHN0cmluZyB3aGljaCBtYXkgbm90IGJlIGF2YWlsYWJsZSBpbiBzb21lIGRldmljZXMuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGFwcGVuZFVuY29tbW9uUGhvbmVUeXBlKGZpbmFsIFN0cmluZ0J1aWxkZXIgYnVpbGRlciwgZmluYWwgSW50ZWdlciB0eXBlKSB7Ci0gICAgICAgIGlmIChtSXNEb0NvTW8pIHsKLSAgICAgICAgICAgIC8vIFRoZSBwcmV2aW91cyBpbXBsZW1lbnRhdGlvbiBmb3IgRG9Db01vIGhhZCBiZWVuIGNvbnNlcnZhdGl2ZQotICAgICAgICAgICAgLy8gYWJvdXQgbWlzY2VsbGFuZW91cyB0eXBlcy4KLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfVk9JQ0UpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgU3RyaW5nIHBob25lVHlwZSA9IFZDYXJkVXRpbHMuZ2V0UGhvbmVUeXBlU3RyaW5nKHR5cGUpOwotICAgICAgICAgICAgaWYgKHBob25lVHlwZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYXBwZW5kVHlwZVBhcmFtZXRlcihwaG9uZVR5cGUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiVW5rbm93biBvciB1bnN1cHBvcnRlZCAoYnkgdkNhcmQpIFBob25lIHR5cGU6ICIgKyB0eXBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBlbmNvZGVkVmFsdWUgTXVzdCBiZSBlbmNvZGVkIGJ5IEJBU0U2NCAKLSAgICAgKiBAcGFyYW0gcGhvdG9UeXBlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYXBwZW5kUGhvdG9MaW5lKGZpbmFsIFN0cmluZyBlbmNvZGVkVmFsdWUsIGZpbmFsIFN0cmluZyBwaG90b1R5cGUpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciB0bXBCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgdG1wQnVpbGRlci5hcHBlbmQoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfUEhPVE8pOwotICAgICAgICB0bXBCdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9TRVBBUkFUT1IpOwotICAgICAgICBpZiAobUlzVjMwKSB7Ci0gICAgICAgICAgICB0bXBCdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9FTkNPRElOR19CQVNFNjRfVjMwKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRtcEJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX0VOQ09ESU5HX0JBU0U2NF9WMjEpOwotICAgICAgICB9Ci0gICAgICAgIHRtcEJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX1NFUEFSQVRPUik7Ci0gICAgICAgIGFwcGVuZFR5cGVQYXJhbWV0ZXIodG1wQnVpbGRlciwgcGhvdG9UeXBlKTsKLSAgICAgICAgdG1wQnVpbGRlci5hcHBlbmQoVkNBUkRfREFUQV9TRVBBUkFUT1IpOwotICAgICAgICB0bXBCdWlsZGVyLmFwcGVuZChlbmNvZGVkVmFsdWUpOwotCi0gICAgICAgIGZpbmFsIFN0cmluZyB0bXBTdHIgPSB0bXBCdWlsZGVyLnRvU3RyaW5nKCk7Ci0gICAgICAgIHRtcEJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICBpbnQgbGluZUNvdW50ID0gMDsKLSAgICAgICAgZmluYWwgaW50IGxlbmd0aCA9IHRtcFN0ci5sZW5ndGgoKTsKLSAgICAgICAgZmluYWwgaW50IG1heE51bUZvckZpcnN0TGluZSA9IFZDYXJkQ29uc3RhbnRzLk1BWF9DSEFSQUNURVJfTlVNU19CQVNFNjRfVjMwCi0gICAgICAgICAgICAgICAgLSBWQ0FSRF9FTkRfT0ZfTElORS5sZW5ndGgoKTsKLSAgICAgICAgZmluYWwgaW50IG1heE51bUluR2VuZXJhbCA9IG1heE51bUZvckZpcnN0TGluZSAtIFZDQVJEX1dTLmxlbmd0aCgpOwotICAgICAgICBpbnQgbWF4TnVtID0gbWF4TnVtRm9yRmlyc3RMaW5lOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICB0bXBCdWlsZGVyLmFwcGVuZCh0bXBTdHIuY2hhckF0KGkpKTsKLSAgICAgICAgICAgIGxpbmVDb3VudCsrOwotICAgICAgICAgICAgaWYgKGxpbmVDb3VudCA+IG1heE51bSkgewotICAgICAgICAgICAgICAgIHRtcEJ1aWxkZXIuYXBwZW5kKFZDQVJEX0VORF9PRl9MSU5FKTsKLSAgICAgICAgICAgICAgICB0bXBCdWlsZGVyLmFwcGVuZChWQ0FSRF9XUyk7Ci0gICAgICAgICAgICAgICAgbWF4TnVtID0gbWF4TnVtSW5HZW5lcmFsOwotICAgICAgICAgICAgICAgIGxpbmVDb3VudCA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKHRtcEJ1aWxkZXIudG9TdHJpbmcoKSk7Ci0gICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9FTkRfT0ZfTElORSk7Ci0gICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9FTkRfT0ZfTElORSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYXBwZW5kQW5kcm9pZFNwZWNpZmljUHJvcGVydHkoZmluYWwgU3RyaW5nIG1pbWVUeXBlLCBDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXMpIHsKLSAgICAgICAgaWYgKCFzQWxsb3dlZEFuZHJvaWRQcm9wZXJ0eVNldC5jb250YWlucyhtaW1lVHlwZSkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gcmF3VmFsdWVMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IFZDYXJkQ29uc3RhbnRzLk1BWF9EQVRBX0NPTFVNTjsgaSsrKSB7Ci0gICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKCJkYXRhIiArIGkpOwotICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB2YWx1ZSA9ICIiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmF3VmFsdWVMaXN0LmFkZCh2YWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBib29sZWFuIG5lZWRDaGFyc2V0ID0KLSAgICAgICAgICAgIChtU2hvdWxkQXBwZW5kQ2hhcnNldFBhcmFtICYmCi0gICAgICAgICAgICAgICAgICAgICFWQ2FyZFV0aWxzLmNvbnRhaW5zT25seU5vbkNyTGZQcmludGFibGVBc2NpaShyYXdWYWx1ZUxpc3QpKTsKLSAgICAgICAgYm9vbGVhbiByZWFsbHlVc2VRdW90ZWRQcmludGFibGUgPQotICAgICAgICAgICAgKG1TaG91bGRVc2VRdW90ZWRQcmludGFibGUgJiYKLSAgICAgICAgICAgICAgICAgICAgIVZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKHJhd1ZhbHVlTGlzdCkpOwotICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfWF9BTkRST0lEX0NVU1RPTSk7Ci0gICAgICAgIGlmIChuZWVkQ2hhcnNldCkgewotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQobVZDYXJkQ2hhcnNldFBhcmFtZXRlcik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJlYWxseVVzZVF1b3RlZFByaW50YWJsZSkgewotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fRU5DT0RJTkdfUVApOwotICAgICAgICB9Ci0gICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9EQVRBX1NFUEFSQVRPUik7Ci0gICAgICAgIG1CdWlsZGVyLmFwcGVuZChtaW1lVHlwZSk7ICAvLyBTaG91bGQgbm90IGJlIGVuY29kZWQuCi0gICAgICAgIGZvciAoU3RyaW5nIHJhd1ZhbHVlIDogcmF3VmFsdWVMaXN0KSB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgZW5jb2RlZFZhbHVlOwotICAgICAgICAgICAgaWYgKHJlYWxseVVzZVF1b3RlZFByaW50YWJsZSkgewotICAgICAgICAgICAgICAgIGVuY29kZWRWYWx1ZSA9IGVuY29kZVF1b3RlZFByaW50YWJsZShyYXdWYWx1ZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIFRPRE86IG9uZSBsaW5lIG1heSBiZSB0b28gaHVnZSwgd2hpY2ggbWF5IGJlIGludmFsaWQgaW4gdkNhcmQgMy4wCi0gICAgICAgICAgICAgICAgLy8gICAgICAgICh3aGljaCBzYXlzICJXaGVuIGdlbmVyYXRpbmcgYSBjb250ZW50IGxpbmUsIGxpbmVzIGxvbmdlciB0aGFuCi0gICAgICAgICAgICAgICAgLy8gICAgICAgIDc1IGNoYXJhY3RlcnMgU0hPVUxEIGJlIGZvbGRlZCIpLCB0aG91Z2ggc2V2ZXJhbAotICAgICAgICAgICAgICAgIC8vICAgICAgICAoZXZlbiB3ZWxsLWtub3duKSBhcHBsaWNhdGlvbnMgZG8gbm90IGNhcmUgdGhpcy4KLSAgICAgICAgICAgICAgICBlbmNvZGVkVmFsdWUgPSBlc2NhcGVDaGFyYWN0ZXJzKHJhd1ZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9JVEVNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoZW5jb2RlZFZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfRU5EX09GX0xJTkUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFwcGVuZExpbmVXaXRoQ2hhcnNldEFuZFFQRGV0ZWN0aW9uKGZpbmFsIFN0cmluZyBwcm9wZXJ0eU5hbWUsCi0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgcmF3VmFsdWUpIHsKLSAgICAgICAgYXBwZW5kTGluZVdpdGhDaGFyc2V0QW5kUVBEZXRlY3Rpb24ocHJvcGVydHlOYW1lLCBudWxsLCByYXdWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYXBwZW5kTGluZVdpdGhDaGFyc2V0QW5kUVBEZXRlY3Rpb24oCi0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgcHJvcGVydHlOYW1lLCBmaW5hbCBMaXN0PFN0cmluZz4gcmF3VmFsdWVMaXN0KSB7Ci0gICAgICAgIGFwcGVuZExpbmVXaXRoQ2hhcnNldEFuZFFQRGV0ZWN0aW9uKHByb3BlcnR5TmFtZSwgbnVsbCwgcmF3VmFsdWVMaXN0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhcHBlbmRMaW5lV2l0aENoYXJzZXRBbmRRUERldGVjdGlvbihmaW5hbCBTdHJpbmcgcHJvcGVydHlOYW1lLAotICAgICAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IHBhcmFtZXRlckxpc3QsIGZpbmFsIFN0cmluZyByYXdWYWx1ZSkgewotICAgICAgICBmaW5hbCBib29sZWFuIG5lZWRDaGFyc2V0ID0KLSAgICAgICAgICAgICAgICAhVkNhcmRVdGlscy5jb250YWluc09ubHlQcmludGFibGVBc2NpaShyYXdWYWx1ZSk7Ci0gICAgICAgIGZpbmFsIGJvb2xlYW4gcmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlID0KLSAgICAgICAgICAgICAgICAobVNob3VsZFVzZVF1b3RlZFByaW50YWJsZSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgIVZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKHJhd1ZhbHVlKSk7Ci0gICAgICAgIGFwcGVuZExpbmUocHJvcGVydHlOYW1lLCBwYXJhbWV0ZXJMaXN0LAotICAgICAgICAgICAgICAgIHJhd1ZhbHVlLCBuZWVkQ2hhcnNldCwgcmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhcHBlbmRMaW5lV2l0aENoYXJzZXRBbmRRUERldGVjdGlvbihmaW5hbCBTdHJpbmcgcHJvcGVydHlOYW1lLAotICAgICAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IHBhcmFtZXRlckxpc3QsIGZpbmFsIExpc3Q8U3RyaW5nPiByYXdWYWx1ZUxpc3QpIHsKLSAgICAgICAgYm9vbGVhbiBuZWVkQ2hhcnNldCA9Ci0gICAgICAgICAgICAobVNob3VsZEFwcGVuZENoYXJzZXRQYXJhbSAmJgotICAgICAgICAgICAgICAgICAgICAhVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkocmF3VmFsdWVMaXN0KSk7Ci0gICAgICAgIGJvb2xlYW4gcmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlID0KLSAgICAgICAgICAgIChtU2hvdWxkVXNlUXVvdGVkUHJpbnRhYmxlICYmCi0gICAgICAgICAgICAgICAgICAgICFWQ2FyZFV0aWxzLmNvbnRhaW5zT25seU5vbkNyTGZQcmludGFibGVBc2NpaShyYXdWYWx1ZUxpc3QpKTsKLSAgICAgICAgYXBwZW5kTGluZShwcm9wZXJ0eU5hbWUsIHBhcmFtZXRlckxpc3QsIHJhd1ZhbHVlTGlzdCwKLSAgICAgICAgICAgICAgICBuZWVkQ2hhcnNldCwgcmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBcHBlbmRzIG9uZSBsaW5lIHdpdGggYSBnaXZlbiBwcm9wZXJ0eSBuYW1lIGFuZCB2YWx1ZS4gIAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFwcGVuZExpbmUoZmluYWwgU3RyaW5nIHByb3BlcnR5TmFtZSwgZmluYWwgU3RyaW5nIHJhd1ZhbHVlKSB7Ci0gICAgICAgIGFwcGVuZExpbmUocHJvcGVydHlOYW1lLCByYXdWYWx1ZSwgZmFsc2UsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhcHBlbmRMaW5lKGZpbmFsIFN0cmluZyBwcm9wZXJ0eU5hbWUsIGZpbmFsIExpc3Q8U3RyaW5nPiByYXdWYWx1ZUxpc3QpIHsKLSAgICAgICAgYXBwZW5kTGluZShwcm9wZXJ0eU5hbWUsIHJhd1ZhbHVlTGlzdCwgZmFsc2UsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhcHBlbmRMaW5lKGZpbmFsIFN0cmluZyBwcm9wZXJ0eU5hbWUsCi0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgcmF3VmFsdWUsIGZpbmFsIGJvb2xlYW4gbmVlZENoYXJzZXQsCi0gICAgICAgICAgICBib29sZWFuIHJlYWxseVVzZVF1b3RlZFByaW50YWJsZSkgewotICAgICAgICBhcHBlbmRMaW5lKHByb3BlcnR5TmFtZSwgbnVsbCwgcmF3VmFsdWUsIG5lZWRDaGFyc2V0LCByZWFsbHlVc2VRdW90ZWRQcmludGFibGUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFwcGVuZExpbmUoZmluYWwgU3RyaW5nIHByb3BlcnR5TmFtZSwgZmluYWwgTGlzdDxTdHJpbmc+IHBhcmFtZXRlckxpc3QsCi0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgcmF3VmFsdWUpIHsKLSAgICAgICAgYXBwZW5kTGluZShwcm9wZXJ0eU5hbWUsIHBhcmFtZXRlckxpc3QsIHJhd1ZhbHVlLCBmYWxzZSwgZmFsc2UpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFwcGVuZExpbmUoZmluYWwgU3RyaW5nIHByb3BlcnR5TmFtZSwgZmluYWwgTGlzdDxTdHJpbmc+IHBhcmFtZXRlckxpc3QsCi0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgcmF3VmFsdWUsIGZpbmFsIGJvb2xlYW4gbmVlZENoYXJzZXQsCi0gICAgICAgICAgICBib29sZWFuIHJlYWxseVVzZVF1b3RlZFByaW50YWJsZSkgewotICAgICAgICBtQnVpbGRlci5hcHBlbmQocHJvcGVydHlOYW1lKTsKLSAgICAgICAgaWYgKHBhcmFtZXRlckxpc3QgIT0gbnVsbCAmJiBwYXJhbWV0ZXJMaXN0LnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgYXBwZW5kVHlwZVBhcmFtZXRlcnMocGFyYW1ldGVyTGlzdCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG5lZWRDaGFyc2V0KSB7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChtVkNhcmRDaGFyc2V0UGFyYW1ldGVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIFN0cmluZyBlbmNvZGVkVmFsdWU7Ci0gICAgICAgIGlmIChyZWFsbHlVc2VRdW90ZWRQcmludGFibGUpIHsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX0VOQ09ESU5HX1FQKTsKLSAgICAgICAgICAgIGVuY29kZWRWYWx1ZSA9IGVuY29kZVF1b3RlZFByaW50YWJsZShyYXdWYWx1ZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBUT0RPOiBvbmUgbGluZSBtYXkgYmUgdG9vIGh1Z2UsIHdoaWNoIG1heSBiZSBpbnZhbGlkIGluIHZDYXJkIHNwZWMsIHRob3VnaAotICAgICAgICAgICAgLy8gICAgICAgc2V2ZXJhbCAoZXZlbiB3ZWxsLWtub3duKSBhcHBsaWNhdGlvbnMgZG8gbm90IGNhcmUgdGhpcy4KLSAgICAgICAgICAgIGVuY29kZWRWYWx1ZSA9IGVzY2FwZUNoYXJhY3RlcnMocmF3VmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0RBVEFfU0VQQVJBVE9SKTsKLSAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKGVuY29kZWRWYWx1ZSk7Ci0gICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9FTkRfT0ZfTElORSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYXBwZW5kTGluZShmaW5hbCBTdHJpbmcgcHJvcGVydHlOYW1lLCBmaW5hbCBMaXN0PFN0cmluZz4gcmF3VmFsdWVMaXN0LAotICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBuZWVkQ2hhcnNldCwgYm9vbGVhbiBuZWVkUXVvdGVkUHJpbnRhYmxlKSB7Ci0gICAgICAgIGFwcGVuZExpbmUocHJvcGVydHlOYW1lLCBudWxsLCByYXdWYWx1ZUxpc3QsIG5lZWRDaGFyc2V0LCBuZWVkUXVvdGVkUHJpbnRhYmxlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhcHBlbmRMaW5lKGZpbmFsIFN0cmluZyBwcm9wZXJ0eU5hbWUsIGZpbmFsIExpc3Q8U3RyaW5nPiBwYXJhbWV0ZXJMaXN0LAotICAgICAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IHJhd1ZhbHVlTGlzdCwgZmluYWwgYm9vbGVhbiBuZWVkQ2hhcnNldCwKLSAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gbmVlZFF1b3RlZFByaW50YWJsZSkgewotICAgICAgICBtQnVpbGRlci5hcHBlbmQocHJvcGVydHlOYW1lKTsKLSAgICAgICAgaWYgKHBhcmFtZXRlckxpc3QgIT0gbnVsbCAmJiBwYXJhbWV0ZXJMaXN0LnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgYXBwZW5kVHlwZVBhcmFtZXRlcnMocGFyYW1ldGVyTGlzdCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG5lZWRDaGFyc2V0KSB7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChtVkNhcmRDaGFyc2V0UGFyYW1ldGVyKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobmVlZFF1b3RlZFByaW50YWJsZSkgewotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fRU5DT0RJTkdfUVApOwotICAgICAgICB9Ci0KLSAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0RBVEFfU0VQQVJBVE9SKTsKLSAgICAgICAgYm9vbGVhbiBmaXJzdCA9IHRydWU7Ci0gICAgICAgIGZvciAoU3RyaW5nIHJhd1ZhbHVlIDogcmF3VmFsdWVMaXN0KSB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgZW5jb2RlZFZhbHVlOwotICAgICAgICAgICAgaWYgKG5lZWRRdW90ZWRQcmludGFibGUpIHsKLSAgICAgICAgICAgICAgICBlbmNvZGVkVmFsdWUgPSBlbmNvZGVRdW90ZWRQcmludGFibGUocmF3VmFsdWUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBUT0RPOiBvbmUgbGluZSBtYXkgYmUgdG9vIGh1Z2UsIHdoaWNoIG1heSBiZSBpbnZhbGlkIGluIHZDYXJkIDMuMAotICAgICAgICAgICAgICAgIC8vICAgICAgICAod2hpY2ggc2F5cyAiV2hlbiBnZW5lcmF0aW5nIGEgY29udGVudCBsaW5lLCBsaW5lcyBsb25nZXIgdGhhbgotICAgICAgICAgICAgICAgIC8vICAgICAgICA3NSBjaGFyYWN0ZXJzIFNIT1VMRCBiZSBmb2xkZWQiKSwgdGhvdWdoIHNldmVyYWwKLSAgICAgICAgICAgICAgICAvLyAgICAgICAgKGV2ZW4gd2VsbC1rbm93bikgYXBwbGljYXRpb25zIGRvIG5vdCBjYXJlIHRoaXMuCi0gICAgICAgICAgICAgICAgZW5jb2RlZFZhbHVlID0gZXNjYXBlQ2hhcmFjdGVycyhyYXdWYWx1ZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChmaXJzdCkgewotICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9JVEVNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoZW5jb2RlZFZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfRU5EX09GX0xJTkUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFZDQVJEX1BBUkFNX1NFUEFSQVRPUiBtdXN0IGJlIGFwcGVuZGVkIGJlZm9yZSB0aGlzIG1ldGhvZCBiZWluZyBjYWxsZWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGFwcGVuZFR5cGVQYXJhbWV0ZXJzKGZpbmFsIExpc3Q8U3RyaW5nPiB0eXBlcykgewotICAgICAgICAvLyBXZSBtYXkgaGF2ZSB0byBtYWtlIHRoaXMgY29tbWEgc2VwYXJhdGVkIGZvcm0gbGlrZSAiVFlQRT1ET00sV09SSyIgaW4gdGhlIGZ1dHVyZSwKLSAgICAgICAgLy8gd2hpY2ggd291bGQgYmUgcmVjb21tZW5kZWQgd2F5IGluIHZjYXJkIDMuMCB0aG91Z2ggbm90IHZhbGlkIGluIHZDYXJkIDIuMS4KLSAgICAgICAgYm9vbGVhbiBmaXJzdCA9IHRydWU7Ci0gICAgICAgIGZvciAoZmluYWwgU3RyaW5nIHR5cGVWYWx1ZSA6IHR5cGVzKSB7Ci0gICAgICAgICAgICBpZiAoVkNhcmRDb25maWcuaXNWMzAobVZDYXJkVHlwZSkpIHsKLSAgICAgICAgICAgICAgICAvLyBOb3RlOiB2Q2FyZCAzLjAgc3BlY2lmaWVzIHRoZSBkaWZmZXJlbnQgdHlwZSBvZiBhY2NlcHRhYmxlIHR5cGUgU3RyaW5ncywgYnV0Ci0gICAgICAgICAgICAgICAgLy8gICAgICAgd2UgZG9uJ3QgZW1pdCB0aGF0IGtpbmQgb2YgdkNhcmQgMy4wIHNwZWNpZmljIHR5cGUgc2luY2UgdGhlcmUgc2hvdWxkIGJlCi0gICAgICAgICAgICAgICAgLy8gICAgICAgaGlnaCBwcm9iYWJpbHl0eSBpbiB3aGljaCBleHRlcm5hbCBpbXBvcnRlcnMgY2Fubm90IHVuZGVyc3RhbmQgdGhlbS4KLSAgICAgICAgICAgICAgICAvLwotICAgICAgICAgICAgICAgIC8vIGUuZy4gVFlQRT0iXHU1NzhCXHUzMDZCXHUzMDg3IiAodkNhcmQgMy4wIGFsbG93cyBub24tQXNjaWkgY2hhcmFjdGVycyBpZiB0aGV5Ci0gICAgICAgICAgICAgICAgLy8gICAgICBhcmUgcXVvdGVkLikKLSAgICAgICAgICAgICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYXBwZW5kVHlwZVBhcmFtZXRlcihWQ2FyZFV0aWxzLnRvU3RyaW5nQXZhaWxhYmxlQXNWMzBQYXJhbWVWYWx1ZSh0eXBlVmFsdWUpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7ICAvLyB2Q2FyZCAyLjEKLSAgICAgICAgICAgICAgICBpZiAoIVZDYXJkVXRpbHMuaXNWMjFXb3JkKHR5cGVWYWx1ZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChmaXJzdCkgewotICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBhcHBlbmRUeXBlUGFyYW1ldGVyKHR5cGVWYWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBWQ0FSRF9QQVJBTV9TRVBBUkFUT1IgbXVzdCBiZSBhcHBlbmRlZCBiZWZvcmUgdGhpcyBtZXRob2QgYmVpbmcgY2FsbGVkLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBhcHBlbmRUeXBlUGFyYW1ldGVyKGZpbmFsIFN0cmluZyB0eXBlKSB7Ci0gICAgICAgIGFwcGVuZFR5cGVQYXJhbWV0ZXIobUJ1aWxkZXIsIHR5cGUpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhcHBlbmRUeXBlUGFyYW1ldGVyKGZpbmFsIFN0cmluZ0J1aWxkZXIgYnVpbGRlciwgZmluYWwgU3RyaW5nIHR5cGUpIHsKLSAgICAgICAgLy8gUmVmcmFpbiBmcm9tIHVzaW5nIGFwcGVuZFR5cGUoKSBzbyB0aGF0ICJUWVBFPSIgaXMgbm90IGJlIGFwcGVuZGVkIHdoZW4gdGhlCi0gICAgICAgIC8vIGRldmljZSBpcyBEb0NvTW8ncyAoanVzdCBmb3Igc2FmZXR5KS4KLSAgICAgICAgLy8KLSAgICAgICAgLy8gTm90ZTogSW4gdkNhcmQgMy4wLCBUeXBlIHN0cmluZ3MgYWxzbyBjYW4gYmUgbGlrZSB0aGlzOiAiVFlQRT1IT01FLFBSRUYiCi0gICAgICAgIGlmICgobUlzVjMwIHx8IG1BcHBlbmRUeXBlUGFyYW1OYW1lKSAmJiAhbUlzRG9Db01vKSB7Ci0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFKS5hcHBlbmQoVkNBUkRfUEFSQU1fRVFVQUwpOwotICAgICAgICB9Ci0gICAgICAgIGJ1aWxkZXIuYXBwZW5kKHR5cGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSB3aGVuIHRoZSBwcm9wZXJ0eSBsaW5lIHNob3VsZCBjb250YWluIGNoYXJzZXQgcGFyYW1ldGVyCi0gICAgICogaW5mb3JtYXRpb24uIFRoaXMgbWV0aG9kIG1heSByZXR1cm4gdHJ1ZSBldmVuIHdoZW4gdkNhcmQgdmVyc2lvbiBpcyAzLjAuCi0gICAgICoKLSAgICAgKiBTdHJpY3RseSwgYWRkaW5nIGNoYXJzZXQgaW5mb3JtYXRpb24gaXMgaW52YWxpZCBpbiBWQ2FyZCAzLjAuCi0gICAgICogSG93ZXZlciB3ZSdsbCBhZGQgdGhlIGluZm8gb25seSB3aGVuIGNoYXJzZXQgd2UgdXNlIGlzIG5vdCBVVEYtOAotICAgICAqIGluIHZDYXJkIDMuMCBmb3JtYXQsIHNpbmNlIHBhcnNlciBzaWRlIG1heSBiZSBhYmxlIHRvIHVzZSB0aGUgY2hhcnNldAotICAgICAqIHZpYSB0aGlzIGZpZWxkLCB0aG91Z2ggd2UgbWF5IGVuY291bnRlciBhbm90aGVyIHByb2JsZW0gYnkgYWRkaW5nIGl0LgotICAgICAqCi0gICAgICogZS5nLiBKYXBhbmVzZSBtb2JpbGUgcGhvbmVzIHVzZSBTaGlmdF9KaXMgd2hpbGUgUkZDIDI0MjYKLSAgICAgKiByZWNvbW1lbmRzIFVURi04LiBCeSBhZGRpbmcgdGhpcyBmaWVsZCwgcGFyc2VycyBtYXkgYmUgYWJsZQotICAgICAqIHRvIGtub3cgdGhpcyB0ZXh0IGlzIE5PVCBVVEYtOCBidXQgU2hpZnRfSmlzLgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBzaG91bGRBcHBlbmRDaGFyc2V0UGFyYW0oU3RyaW5nLi4ucHJvcGVydHlWYWx1ZUxpc3QpIHsKLSAgICAgICAgaWYgKCFtU2hvdWxkQXBwZW5kQ2hhcnNldFBhcmFtKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChTdHJpbmcgcHJvcGVydHlWYWx1ZSA6IHByb3BlcnR5VmFsdWVMaXN0KSB7Ci0gICAgICAgICAgICBpZiAoIVZDYXJkVXRpbHMuY29udGFpbnNPbmx5UHJpbnRhYmxlQXNjaWkocHJvcGVydHlWYWx1ZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZW5jb2RlUXVvdGVkUHJpbnRhYmxlKGZpbmFsIFN0cmluZyBzdHIpIHsKLSAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHN0cikpIHsKLSAgICAgICAgICAgIHJldHVybiAiIjsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIGludCBpbmRleCA9IDA7Ci0gICAgICAgIGludCBsaW5lQ291bnQgPSAwOwotICAgICAgICBieXRlW10gc3RyQXJyYXkgPSBudWxsOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzdHJBcnJheSA9IHN0ci5nZXRCeXRlcyhtQ2hhcnNldFN0cmluZyk7Ci0gICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIkNoYXJzZXQgIiArIG1DaGFyc2V0U3RyaW5nICsgIiBjYW5ub3QgYmUgdXNlZC4gIgotICAgICAgICAgICAgICAgICAgICArICJUcnkgZGVmYXVsdCBjaGFyc2V0Iik7Ci0gICAgICAgICAgICBzdHJBcnJheSA9IHN0ci5nZXRCeXRlcygpOwotICAgICAgICB9Ci0gICAgICAgIHdoaWxlIChpbmRleCA8IHN0ckFycmF5Lmxlbmd0aCkgewotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoU3RyaW5nLmZvcm1hdCgiPSUwMlgiLCBzdHJBcnJheVtpbmRleF0pKTsKLSAgICAgICAgICAgIGluZGV4ICs9IDE7Ci0gICAgICAgICAgICBsaW5lQ291bnQgKz0gMzsKLQotICAgICAgICAgICAgaWYgKGxpbmVDb3VudCA+PSA2NykgewotICAgICAgICAgICAgICAgIC8vIFNwZWNpZmljYXRpb24gcmVxdWlyZXMgQ1JMRiBtdXN0IGJlIGluc2VydGVkIGJlZm9yZSB0aGUKLSAgICAgICAgICAgICAgICAvLyBsZW5ndGggb2YgdGhlIGxpbmUKLSAgICAgICAgICAgICAgICAvLyBiZWNvbWVzIG1vcmUgdGhhbiA3Ni4KLSAgICAgICAgICAgICAgICAvLyBBc3N1bWluZyB0aGF0IHRoZSBuZXh0IGNoYXJhY3RlciBpcyBhIG11bHRpLWJ5dGUgY2hhcmFjdGVyLAotICAgICAgICAgICAgICAgIC8vIGl0IHdpbGwgYmVjb21lCi0gICAgICAgICAgICAgICAgLy8gNiBieXRlcy4KLSAgICAgICAgICAgICAgICAvLyA3NiAtIDYgLSAzID0gNjcKLSAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiPVxyXG4iKTsKLSAgICAgICAgICAgICAgICBsaW5lQ291bnQgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBcHBlbmQgJ1wnIHRvIHRoZSBjaGFyYWN0ZXJzIHdoaWNoIHNob3VsZCBiZSBlc2NhcGVkLiBUaGUgY2hhcmFjdGVyIHNldCBpcyBkaWZmZXJlbnQKLSAgICAgKiBub3Qgb25seSBiZXR3ZWVuIHZDYXJkIDIuMSBhbmQgdkNhcmQgMy4wIGJ1dCBhbHNvIGFtb25nIGVhY2ggZGV2aWNlLgotICAgICAqCi0gICAgICogTm90ZSB0aGF0IFF1b3RlZC1QcmludGFibGUgc3RyaW5nIG11c3Qgbm90IGJlIGlucHV0IGhlcmUuCi0gICAgICovCi0gICAgQFN1cHByZXNzV2FybmluZ3MoImZhbGx0aHJvdWdoIikKLSAgICBwcml2YXRlIFN0cmluZyBlc2NhcGVDaGFyYWN0ZXJzKGZpbmFsIFN0cmluZyB1bmVzY2FwZWQpIHsKLSAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHVuZXNjYXBlZCkpIHsKLSAgICAgICAgICAgIHJldHVybiAiIjsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgdG1wQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIGZpbmFsIGludCBsZW5ndGggPSB1bmVzY2FwZWQubGVuZ3RoKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGZpbmFsIGNoYXIgY2ggPSB1bmVzY2FwZWQuY2hhckF0KGkpOwotICAgICAgICAgICAgc3dpdGNoIChjaCkgewotICAgICAgICAgICAgICAgIGNhc2UgJzsnOiB7Ci0gICAgICAgICAgICAgICAgICAgIHRtcEJ1aWxkZXIuYXBwZW5kKCdcXCcpOwotICAgICAgICAgICAgICAgICAgICB0bXBCdWlsZGVyLmFwcGVuZCgnOycpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2FzZSAnXHInOiB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpICsgMSA8IGxlbmd0aCkgewotICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBuZXh0Q2hhciA9IHVuZXNjYXBlZC5jaGFyQXQoaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV4dENoYXIgPT0gJ1xuJykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmYWxsIHRocm91Z2gKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaAotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhc2UgJ1xuJzogewotICAgICAgICAgICAgICAgICAgICAvLyBJbiB2Q2FyZCAyLjEsIHRoZXJlJ3Mgbm8gc3BlY2lmaWNhdGlvbiBhYm91dCB0aGlzLCB3aGlsZQotICAgICAgICAgICAgICAgICAgICAvLyB2Q2FyZCAzLjAgZXhwbGljaXRseSByZXF1aXJlcyB0aGlzIHNob3VsZCBiZSBlbmNvZGVkIHRvICJcbiIuCi0gICAgICAgICAgICAgICAgICAgIHRtcEJ1aWxkZXIuYXBwZW5kKCJcXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhc2UgJ1xcJzogewotICAgICAgICAgICAgICAgICAgICBpZiAobUlzVjMwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0bXBCdWlsZGVyLmFwcGVuZCgiXFxcXCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBmYWxsIHRocm91Z2gKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXNlICc8JzoKLSAgICAgICAgICAgICAgICBjYXNlICc+JzogewotICAgICAgICAgICAgICAgICAgICBpZiAobUlzRG9Db01vKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0bXBCdWlsZGVyLmFwcGVuZCgnXFwnKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRtcEJ1aWxkZXIuYXBwZW5kKGNoKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRtcEJ1aWxkZXIuYXBwZW5kKGNoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2FzZSAnLCc6IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1Jc1YzMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdG1wQnVpbGRlci5hcHBlbmQoIlxcLCIpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgdG1wQnVpbGRlci5hcHBlbmQoY2gpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB7Ci0gICAgICAgICAgICAgICAgICAgIHRtcEJ1aWxkZXIuYXBwZW5kKGNoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0bXBCdWlsZGVyLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgaWYgKCFtRW5kQXBwZW5kZWQpIHsKLSAgICAgICAgICAgIGlmIChtSXNEb0NvTW8pIHsKLSAgICAgICAgICAgICAgICBhcHBlbmRMaW5lKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1hfQ0xBU1MsIFZDQVJEX0RBVEFfUFVCTElDKTsKLSAgICAgICAgICAgICAgICBhcHBlbmRMaW5lKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1hfUkVEVUNUSU9OLCAiIik7Ci0gICAgICAgICAgICAgICAgYXBwZW5kTGluZShWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9YX05PLCAiIik7Ci0gICAgICAgICAgICAgICAgYXBwZW5kTGluZShWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9YX0RDTV9ITU5fTU9ERSwgIiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXBwZW5kTGluZShWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9FTkQsIFZDQVJEX0RBVEFfVkNBUkQpOwotICAgICAgICAgICAgbUVuZEFwcGVuZGVkID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbUJ1aWxkZXIudG9TdHJpbmcoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRDb21wb3Nlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkQ29tcG9zZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGU4YjY2NS4uMDAwMDAwMAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRDb21wb3Nlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAotICogdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSAqIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAotICogV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCi0gKiBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgotICogdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQ7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5FbnRpdHk7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkVudGl0eUl0ZXJhdG9yOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5FbnRpdHkuTmFtZWRDb250ZW50VmFsdWVzOwotaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yOwotaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZUV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuZXhjZXB0aW9uLlZDYXJkRXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db250YWN0czsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuRGF0YTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuUmF3Q29udGFjdHM7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LlJhd0NvbnRhY3RzRW50aXR5OwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuRW1haWw7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5FdmVudDsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLkltOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuTmlja25hbWU7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5Ob3RlOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuT3JnYW5pemF0aW9uOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuUGhvbmU7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5QaG90bzsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLlJlbGF0aW9uOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuU3RydWN0dXJlZE5hbWU7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5TdHJ1Y3R1cmVkUG9zdGFsOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuV2Vic2l0ZTsKLWltcG9ydCBhbmRyb2lkLnV0aWwuQ2hhcnNldFV0aWxzOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLldyaXRlcjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlVuc3VwcG9ydGVkQ2hhcnNldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogPHA+Ci0gKiBUaGUgY2xhc3MgZm9yIGNvbXBvc2luZyBWQ2FyZCBmcm9tIENvbnRhY3RzIGluZm9ybWF0aW9uLiBOb3RlIHRoYXQgdGhpcyBpcwotICogY29tcGxldGVseSBkaWZmZXJudCBpbXBsZW1lbnRhdGlvbiBmcm9tCi0gKiBhbmRyb2lkLnN5bmNtbC5waW0udmNhcmQuVkNhcmRDb21wb3Nlciwgd2hpY2ggaXMgbm90IG1haW50YWluZWQgYW55bW9yZS4KLSAqIDwvcD4KLSAqCi0gKiA8cD4KLSAqIFVzdWFsbHksIHRoaXMgY2xhc3Mgc2hvdWxkIGJlIHVzZWQgbGlrZSB0aGlzLgotICogPC9wPgotICoKLSAqIDxwcmUgY2xhc3M9InByZXR0eXByaW50Ij5WQ2FyZENvbXBvc2VyIGNvbXBvc2VyID0gbnVsbDsKLSAqIHRyeSB7Ci0gKiAgICAgY29tcG9zZXIgPSBuZXcgVkNhcmRDb21wb3Nlcihjb250ZXh0KTsKLSAqICAgICBjb21wb3Nlci5hZGRIYW5kbGVyKAotICogICAgICAgICAgICAgY29tcG9zZXIubmV3IEhhbmRsZXJGb3JPdXRwdXRTdHJlYW0ob3V0cHV0U3RyZWFtKSk7Ci0gKiAgICAgaWYgKCFjb21wb3Nlci5pbml0KCkpIHsKLSAqICAgICAgICAgLy8gRG8gc29tZXRoaW5nIGhhbmRsaW5nIHRoZSBzaXR1YXRpb24uCi0gKiAgICAgICAgIHJldHVybjsKLSAqICAgICB9Ci0gKiAgICAgd2hpbGUgKCFjb21wb3Nlci5pc0FmdGVyTGFzdCgpKSB7Ci0gKiAgICAgICAgIGlmIChtQ2FuY2VsZWQpIHsKLSAqICAgICAgICAgICAgIC8vIEFzc3VtZSBhIHVzZXIgbWF5IGNhbmNlbCB0aGlzIG9wZXJhdGlvbiBkdXJpbmcgdGhlIGV4cG9ydC4KLSAqICAgICAgICAgICAgIHJldHVybjsKLSAqICAgICAgICAgfQotICogICAgICAgICBpZiAoIWNvbXBvc2VyLmNyZWF0ZU9uZUVudHJ5KCkpIHsKLSAqICAgICAgICAgICAgIC8vIERvIHNvbWV0aGluZyBoYW5kbGluZyB0aGUgZXJyb3Igc2l0dWF0aW9uLgotICogICAgICAgICAgICAgcmV0dXJuOwotICogICAgICAgICB9Ci0gKiAgICAgfQotICogfSBmaW5hbGx5IHsKLSAqICAgICBpZiAoY29tcG9zZXIgIT0gbnVsbCkgewotICogICAgICAgICBjb21wb3Nlci50ZXJtaW5hdGUoKTsKLSAqICAgICB9Ci0gKiB9IDwvcHJlPgotICovCi1wdWJsaWMgY2xhc3MgVkNhcmRDb21wb3NlciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiVkNhcmRDb21wb3NlciI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX1BIT05FX1RZUEUgPSBQaG9uZS5UWVBFX0hPTUU7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9QT1NUQUxfVFlQRSA9IFN0cnVjdHVyZWRQb3N0YWwuVFlQRV9IT01FOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfRU1BSUxfVFlQRSA9IEVtYWlsLlRZUEVfT1RIRVI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGQUlMVVJFX1JFQVNPTl9GQUlMRURfVE9fR0VUX0RBVEFCQVNFX0lORk8gPQotICAgICAgICAiRmFpbGVkIHRvIGdldCBkYXRhYmFzZSBpbmZvcm1hdGlvbiI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGQUlMVVJFX1JFQVNPTl9OT19FTlRSWSA9Ci0gICAgICAgICJUaGVyZSdzIG5vIGV4cG9ydGFibGUgaW4gdGhlIGRhdGFiYXNlIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZBSUxVUkVfUkVBU09OX05PVF9JTklUSUFMSVpFRCA9Ci0gICAgICAgICJUaGUgdkNhcmQgY29tcG9zZXIgb2JqZWN0IGlzIG5vdCBjb3JyZWN0bHkgaW5pdGlhbGl6ZWQiOwotCi0gICAgLyoqIFNob3VsZCBiZSB2aXNpYmxlIG9ubHkgZnJvbSBkZXZlbG9wZXJzLi4uIChubyBuZWVkIHRvIHRyYW5zbGF0ZSwgaG9wZWZ1bGx5KSAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZBSUxVUkVfUkVBU09OX1VOU1VQUE9SVEVEX1VSSSA9Ci0gICAgICAgICJUaGUgVXJpIHZDYXJkIGNvbXBvc2VyIHJlY2VpdmVkIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGNvbXBvc2VyLiI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT19FUlJPUiA9ICJObyBlcnJvciI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQ0FSRF9UWVBFX1NUUklOR19ET0NPTU8gPSAiZG9jb21vIjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTSElGVF9KSVMgPSAiU0hJRlRfSklTIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVRGXzggPSAiVVRGLTgiOwotCi0gICAgLyoqCi0gICAgICogU3BlY2lhbCBVUkkgZm9yIHRlc3RpbmcuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkNBUkRfVEVTVF9BVVRIT1JJVFkgPSAiY29tLmFuZHJvaWQudW5pdF90ZXN0cy52Y2FyZCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBVcmkgVkNBUkRfVEVTVF9BVVRIT1JJVFlfVVJJID0KLSAgICAgICAgVXJpLnBhcnNlKCJjb250ZW50Oi8vIiArIFZDQVJEX1RFU1RfQVVUSE9SSVRZKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVyaSBDT05UQUNUU19URVNUX0NPTlRFTlRfVVJJID0KLSAgICAgICAgVXJpLndpdGhBcHBlbmRlZFBhdGgoVkNBUkRfVEVTVF9BVVRIT1JJVFlfVVJJLCAiY29udGFjdHMiKTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1hcDxJbnRlZ2VyLCBTdHJpbmc+IHNJbU1hcDsKLQotICAgIHN0YXRpYyB7Ci0gICAgICAgIHNJbU1hcCA9IG5ldyBIYXNoTWFwPEludGVnZXIsIFN0cmluZz4oKTsKLSAgICAgICAgc0ltTWFwLnB1dChJbS5QUk9UT0NPTF9BSU0sIFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1hfQUlNKTsKLSAgICAgICAgc0ltTWFwLnB1dChJbS5QUk9UT0NPTF9NU04sIFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1hfTVNOKTsKLSAgICAgICAgc0ltTWFwLnB1dChJbS5QUk9UT0NPTF9ZQUhPTywgVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfWF9ZQUhPTyk7Ci0gICAgICAgIHNJbU1hcC5wdXQoSW0uUFJPVE9DT0xfSUNRLCBWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9YX0lDUSk7Ci0gICAgICAgIHNJbU1hcC5wdXQoSW0uUFJPVE9DT0xfSkFCQkVSLCBWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9YX0pBQkJFUik7Ci0gICAgICAgIHNJbU1hcC5wdXQoSW0uUFJPVE9DT0xfU0tZUEUsIFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1hfU0tZUEVfVVNFUk5BTUUpOwotICAgICAgICAvLyBHb29nbGUgdGFsayBpcyBhIHNwZWNpYWwgY2FzZS4KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGludGVyZmFjZSBPbmVFbnRyeUhhbmRsZXIgewotICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbkluaXQoQ29udGV4dCBjb250ZXh0KTsKLSAgICAgICAgcHVibGljIGJvb2xlYW4gb25FbnRyeUNyZWF0ZWQoU3RyaW5nIHZjYXJkKTsKLSAgICAgICAgcHVibGljIHZvaWQgb25UZXJtaW5hdGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBBbiB1c2VmdWwgZXhhbXBsZSBoYW5kbGVyLCB3aGljaCBlbWl0cyBWQ2FyZCBTdHJpbmcgdG8gb3V0cHV0c3RyZWFtIG9uZSBieSBvbmUuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIFRoZSBpbnB1dCBPdXRwdXRTdHJlYW0gb2JqZWN0IGlzIGNsb3NlZCgpIG9uIHtAbGluayAjb25UZXJtaW5hdGUoKX0uCi0gICAgICogTXVzdCBub3QgY2xvc2UgdGhlIHN0cmVhbSBvdXRzaWRlLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgY2xhc3MgSGFuZGxlckZvck91dHB1dFN0cmVhbSBpbXBsZW1lbnRzIE9uZUVudHJ5SGFuZGxlciB7Ci0gICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJoaWRpbmciKQotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJ2Y2FyZC5WQ2FyZENvbXBvc2VyLkhhbmRsZXJGb3JPdXRwdXRTdHJlYW0iOwotCi0gICAgICAgIGZpbmFsIHByaXZhdGUgT3V0cHV0U3RyZWFtIG1PdXRwdXRTdHJlYW07IC8vIG1Xcml0ZXIgd2lsbCBjbG9zZSB0aGlzLgotICAgICAgICBwcml2YXRlIFdyaXRlciBtV3JpdGVyOwotCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBtT25UZXJtaW5hdGVJc0NhbGxlZCA9IGZhbHNlOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBJbnB1dCBzdHJlYW0gd2lsbCBiZSBjbG9zZWQgb24gdGhlIGRldHJ1Y3Rpb24gb2YgdGhpcyBvYmplY3QuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgSGFuZGxlckZvck91dHB1dFN0cmVhbShPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtKSB7Ci0gICAgICAgICAgICBtT3V0cHV0U3RyZWFtID0gb3V0cHV0U3RyZWFtOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gb25Jbml0KENvbnRleHQgY29udGV4dCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBtV3JpdGVyID0gbmV3IEJ1ZmZlcmVkV3JpdGVyKG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICBtT3V0cHV0U3RyZWFtLCBtQ2hhcnNldFN0cmluZykpOwotICAgICAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlMSkgewotICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJVbnN1cHBvcnRlZCBjaGFyc2V0OiAiICsgbUNoYXJzZXRTdHJpbmcpOwotICAgICAgICAgICAgICAgIG1FcnJvclJlYXNvbiA9ICJFbmNvZGluZyBpcyBub3Qgc3VwcG9ydGVkICh1c3VhbGx5IHRoaXMgZG9lcyBub3QgaGFwcGVuISk6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgbUNoYXJzZXRTdHJpbmc7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobUlzRG9Db01vKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIG9uZSBlbXB0eSBlbnRyeS4KLSAgICAgICAgICAgICAgICAgICAgbVdyaXRlci53cml0ZShjcmVhdGVPbmVFbnRyeUludGVybmFsKCItMSIsIG51bGwpKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChWQ2FyZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJWQ2FyZEV4Y2VwdGlvbiBoYXMgYmVlbiB0aHJvd24gZHVyaW5nIG9uIEluaXQoKTogIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJT0V4Y2VwdGlvbiBvY2N1cnJlZCBkdXJpbmcgZXhwb3J0T25lQ29udGFjdERhdGE6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgICAgICAgICBtRXJyb3JSZWFzb24gPSAiSU9FeGNlcHRpb24gb2NjdXJyZWQ6ICIgKyBlLmdldE1lc3NhZ2UoKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gb25FbnRyeUNyZWF0ZWQoU3RyaW5nIHZjYXJkKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG1Xcml0ZXIud3JpdGUodmNhcmQpOwotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsCi0gICAgICAgICAgICAgICAgICAgICAgICAiSU9FeGNlcHRpb24gb2NjdXJyZWQgZHVyaW5nIGV4cG9ydE9uZUNvbnRhY3REYXRhOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgICAgIG1FcnJvclJlYXNvbiA9ICJJT0V4Y2VwdGlvbiBvY2N1cnJlZDogIiArIGUuZ2V0TWVzc2FnZSgpOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgb25UZXJtaW5hdGUoKSB7Ci0gICAgICAgICAgICBtT25UZXJtaW5hdGVJc0NhbGxlZCA9IHRydWU7Ci0gICAgICAgICAgICBpZiAobVdyaXRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgLy8gRmx1c2ggYW5kIHN5bmMgdGhlIGRhdGEgc28gdGhhdCBhIHVzZXIgaXMgYWJsZSB0byBwdWxsCi0gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBTRENhcmQganVzdCBhZnRlcgotICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZXhwb3J0LgotICAgICAgICAgICAgICAgICAgICBtV3JpdGVyLmZsdXNoKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtT3V0cHV0U3RyZWFtICE9IG51bGwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBtT3V0cHV0U3RyZWFtIGluc3RhbmNlb2YgRmlsZU91dHB1dFN0cmVhbSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRmlsZU91dHB1dFN0cmVhbSkgbU91dHB1dFN0cmVhbSkuZ2V0RkQoKS5zeW5jKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIklPRXhjZXB0aW9uIGR1cmluZyBjbG9zaW5nIHRoZSBvdXRwdXQgc3RyZWFtOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgbVdyaXRlci5jbG9zZSgpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgZmluYWxpemUoKSB7Ci0gICAgICAgICAgICBpZiAoIW1PblRlcm1pbmF0ZUlzQ2FsbGVkKSB7Ci0gICAgICAgICAgICAgICAgb25UZXJtaW5hdGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgQ29udGV4dCBtQ29udGV4dDsKLSAgICBwcml2YXRlIGZpbmFsIGludCBtVkNhcmRUeXBlOwotICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBtQ2FyZUhhbmRsZXJFcnJvcnM7Ci0gICAgcHJpdmF0ZSBmaW5hbCBDb250ZW50UmVzb2x2ZXIgbUNvbnRlbnRSZXNvbHZlcjsKLQotICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBtSXNEb0NvTW87Ci0gICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1Vc2VzU2hpZnRKaXM7Ci0gICAgcHJpdmF0ZSBDdXJzb3IgbUN1cnNvcjsKLSAgICBwcml2YXRlIGludCBtSWRDb2x1bW47Ci0KLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtQ2hhcnNldFN0cmluZzsKLSAgICBwcml2YXRlIGJvb2xlYW4gbVRlcm1pbmF0ZUlzQ2FsbGVkOwotICAgIHByaXZhdGUgZmluYWwgTGlzdDxPbmVFbnRyeUhhbmRsZXI+IG1IYW5kbGVyTGlzdDsKLQotICAgIHByaXZhdGUgU3RyaW5nIG1FcnJvclJlYXNvbiA9IE5PX0VSUk9SOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gc0NvbnRhY3RzUHJvamVjdGlvbiA9IG5ldyBTdHJpbmdbXSB7Ci0gICAgICAgIENvbnRhY3RzLl9JRCwKLSAgICB9OwotCi0gICAgcHVibGljIFZDYXJkQ29tcG9zZXIoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHRoaXMoY29udGV4dCwgVkNhcmRDb25maWcuVkNBUkRfVFlQRV9ERUZBVUxULCB0cnVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVkNhcmRDb21wb3NlcihDb250ZXh0IGNvbnRleHQsIGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgdGhpcyhjb250ZXh0LCB2Y2FyZFR5cGUsIHRydWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBWQ2FyZENvbXBvc2VyKENvbnRleHQgY29udGV4dCwgU3RyaW5nIHZjYXJkVHlwZVN0ciwgYm9vbGVhbiBjYXJlSGFuZGxlckVycm9ycykgewotICAgICAgICB0aGlzKGNvbnRleHQsIFZDYXJkQ29uZmlnLmdldFZDYXJkVHlwZUZyb21TdHJpbmcodmNhcmRUeXBlU3RyKSwgY2FyZUhhbmRsZXJFcnJvcnMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdCBmb3Igc3VwcG9ydGluZyBjYWxsIGxvZyBlbnRyeSB2Q2FyZCBjb21wb3NpbmcuCi0gICAgICovCi0gICAgcHVibGljIFZDYXJkQ29tcG9zZXIoZmluYWwgQ29udGV4dCBjb250ZXh0LCBmaW5hbCBpbnQgdmNhcmRUeXBlLAotICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBjYXJlSGFuZGxlckVycm9ycykgewotICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7Ci0gICAgICAgIG1WQ2FyZFR5cGUgPSB2Y2FyZFR5cGU7Ci0gICAgICAgIG1DYXJlSGFuZGxlckVycm9ycyA9IGNhcmVIYW5kbGVyRXJyb3JzOwotICAgICAgICBtQ29udGVudFJlc29sdmVyID0gY29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKTsKLQotICAgICAgICBtSXNEb0NvTW8gPSBWQ2FyZENvbmZpZy5pc0RvQ29Nbyh2Y2FyZFR5cGUpOwotICAgICAgICBtVXNlc1NoaWZ0SmlzID0gVkNhcmRDb25maWcudXNlc1NoaWZ0SmlzKHZjYXJkVHlwZSk7Ci0gICAgICAgIG1IYW5kbGVyTGlzdCA9IG5ldyBBcnJheUxpc3Q8T25lRW50cnlIYW5kbGVyPigpOwotCi0gICAgICAgIGlmIChtSXNEb0NvTW8pIHsKLSAgICAgICAgICAgIFN0cmluZyBjaGFyc2V0OwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBjaGFyc2V0ID0gQ2hhcnNldFV0aWxzLmNoYXJzZXRGb3JWZW5kb3IoU0hJRlRfSklTLCAiZG9jb21vIikubmFtZSgpOwotICAgICAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiRG9Db01vLXNwZWNpZmljIFNISUZUX0pJUyB3YXMgbm90IGZvdW5kLiBVc2UgU0hJRlRfSklTIGFzIGlzLiIpOwotICAgICAgICAgICAgICAgIGNoYXJzZXQgPSBTSElGVF9KSVM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQ2hhcnNldFN0cmluZyA9IGNoYXJzZXQ7Ci0gICAgICAgIH0gZWxzZSBpZiAobVVzZXNTaGlmdEppcykgewotICAgICAgICAgICAgU3RyaW5nIGNoYXJzZXQ7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGNoYXJzZXQgPSBDaGFyc2V0VXRpbHMuY2hhcnNldEZvclZlbmRvcihTSElGVF9KSVMpLm5hbWUoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkQ2hhcnNldEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIlZlbmRvci1zcGVjaWZpYyBTSElGVF9KSVMgd2FzIG5vdCBmb3VuZC4gVXNlIFNISUZUX0pJUyBhcyBpcy4iKTsKLSAgICAgICAgICAgICAgICBjaGFyc2V0ID0gU0hJRlRfSklTOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUNoYXJzZXRTdHJpbmcgPSBjaGFyc2V0OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUNoYXJzZXRTdHJpbmcgPSBVVEZfODsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIE11c3QgYmUgY2FsbGVkIGJlZm9yZSB7QGxpbmsgI2luaXQoKX0uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkSGFuZGxlcihPbmVFbnRyeUhhbmRsZXIgaGFuZGxlcikgewotICAgICAgICBpZiAoaGFuZGxlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtSGFuZGxlckxpc3QuYWRkKGhhbmRsZXIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBSZXR1cm5zIHRydWUgd2hlbiBpbml0aWFsaXphdGlvbiBpcyBzdWNjZXNzZnVsIGFuZCBhbGwgdGhlIG90aGVyCi0gICAgICogICAgICAgICAgbWV0aG9kcyBhcmUgYXZhaWxhYmxlLiBSZXR1cm5zIGZhbHNlIG90aGVyd2lzZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpbml0KCkgewotICAgICAgICByZXR1cm4gaW5pdChudWxsLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpbml0KGZpbmFsIFN0cmluZyBzZWxlY3Rpb24sIGZpbmFsIFN0cmluZ1tdIHNlbGVjdGlvbkFyZ3MpIHsKLSAgICAgICAgcmV0dXJuIGluaXQoQ29udGFjdHMuQ09OVEVOVF9VUkksIHNlbGVjdGlvbiwgc2VsZWN0aW9uQXJncywgbnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTm90ZSB0aGF0IHRoaXMgaXMgdW5zdGFibGUgaW50ZXJmYWNlLCBtYXkgYmUgZGVsZXRlZCBpbiB0aGUgZnV0dXJlLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGluaXQoZmluYWwgVXJpIGNvbnRlbnRVcmksIGZpbmFsIFN0cmluZyBzZWxlY3Rpb24sCi0gICAgICAgICAgICBmaW5hbCBTdHJpbmdbXSBzZWxlY3Rpb25BcmdzLCBmaW5hbCBTdHJpbmcgc29ydE9yZGVyKSB7Ci0gICAgICAgIGlmIChjb250ZW50VXJpID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtQ2FyZUhhbmRsZXJFcnJvcnMpIHsKLSAgICAgICAgICAgIExpc3Q8T25lRW50cnlIYW5kbGVyPiBmaW5pc2hlZExpc3QgPSBuZXcgQXJyYXlMaXN0PE9uZUVudHJ5SGFuZGxlcj4oCi0gICAgICAgICAgICAgICAgICAgIG1IYW5kbGVyTGlzdC5zaXplKCkpOwotICAgICAgICAgICAgZm9yIChPbmVFbnRyeUhhbmRsZXIgaGFuZGxlciA6IG1IYW5kbGVyTGlzdCkgewotICAgICAgICAgICAgICAgIGlmICghaGFuZGxlci5vbkluaXQobUNvbnRleHQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoT25lRW50cnlIYW5kbGVyIGZpbmlzaGVkIDogZmluaXNoZWRMaXN0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5pc2hlZC5vblRlcm1pbmF0ZSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBKdXN0IGlnbm9yZSB0aGUgZmFsc2UgcmV0dXJuZWQgZnJvbSBvbkluaXQoKS4KLSAgICAgICAgICAgIGZvciAoT25lRW50cnlIYW5kbGVyIGhhbmRsZXIgOiBtSGFuZGxlckxpc3QpIHsKLSAgICAgICAgICAgICAgICBoYW5kbGVyLm9uSW5pdChtQ29udGV4dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBTdHJpbmdbXSBwcm9qZWN0aW9uOwotICAgICAgICBpZiAoQ29udGFjdHMuQ09OVEVOVF9VUkkuZXF1YWxzKGNvbnRlbnRVcmkpIHx8Ci0gICAgICAgICAgICAgICAgQ09OVEFDVFNfVEVTVF9DT05URU5UX1VSSS5lcXVhbHMoY29udGVudFVyaSkpIHsKLSAgICAgICAgICAgIHByb2plY3Rpb24gPSBzQ29udGFjdHNQcm9qZWN0aW9uOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUVycm9yUmVhc29uID0gRkFJTFVSRV9SRUFTT05fVU5TVVBQT1JURURfVVJJOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIG1DdXJzb3IgPSBtQ29udGVudFJlc29sdmVyLnF1ZXJ5KAotICAgICAgICAgICAgICAgIGNvbnRlbnRVcmksIHByb2plY3Rpb24sIHNlbGVjdGlvbiwgc2VsZWN0aW9uQXJncywgc29ydE9yZGVyKTsKLQotICAgICAgICBpZiAobUN1cnNvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtRXJyb3JSZWFzb24gPSBGQUlMVVJFX1JFQVNPTl9GQUlMRURfVE9fR0VUX0RBVEFCQVNFX0lORk87Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZ2V0Q291bnQoKSA9PSAwIHx8ICFtQ3Vyc29yLm1vdmVUb0ZpcnN0KCkpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbUN1cnNvci5jbG9zZSgpOwotICAgICAgICAgICAgfSBjYXRjaCAoU1FMaXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiU1FMaXRlRXhjZXB0aW9uIG9uIEN1cnNvciNjbG9zZSgpOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICBtQ3Vyc29yID0gbnVsbDsKLSAgICAgICAgICAgICAgICBtRXJyb3JSZWFzb24gPSBGQUlMVVJFX1JFQVNPTl9OT19FTlRSWTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIG1JZENvbHVtbiA9IG1DdXJzb3IuZ2V0Q29sdW1uSW5kZXgoQ29udGFjdHMuX0lEKTsKLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBjcmVhdGVPbmVFbnRyeSgpIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZU9uZUVudHJ5KG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBnZXRFbnRpdHlJdGVyYXRvck1ldGhvZCBGb3IgRGVwZW5kZW5jeSBJbmplY3Rpb24uCi0gICAgICogQGhpZGUganVzdCBmb3IgdGVzdGluZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBjcmVhdGVPbmVFbnRyeShNZXRob2QgZ2V0RW50aXR5SXRlcmF0b3JNZXRob2QpIHsKLSAgICAgICAgaWYgKG1DdXJzb3IgPT0gbnVsbCB8fCBtQ3Vyc29yLmlzQWZ0ZXJMYXN0KCkpIHsKLSAgICAgICAgICAgIG1FcnJvclJlYXNvbiA9IEZBSUxVUkVfUkVBU09OX05PVF9JTklUSUFMSVpFRDsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBTdHJpbmcgdmNhcmQ7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAobUlkQ29sdW1uID49IDApIHsKLSAgICAgICAgICAgICAgICB2Y2FyZCA9IGNyZWF0ZU9uZUVudHJ5SW50ZXJuYWwobUN1cnNvci5nZXRTdHJpbmcobUlkQ29sdW1uKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldEVudGl0eUl0ZXJhdG9yTWV0aG9kKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIkluY29ycmVjdCBtSWRDb2x1bW46ICIgKyBtSWRDb2x1bW4pOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChWQ2FyZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiVkNhcmRFeGNlcHRpb24gaGFzIGJlZW4gdGhyb3duOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9IGNhdGNoIChPdXRPZk1lbW9yeUVycm9yIGVycm9yKSB7Ci0gICAgICAgICAgICAvLyBNYXliZSBzb21lIGRhdGEgKGUuZy4gcGhvdG8pIGlzIHRvbyBiaWcgdG8gaGF2ZSBpbiBtZW1vcnkuIEJ1dCBpdAotICAgICAgICAgICAgLy8gc2hvdWxkIGJlIHJhcmUuCi0gICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiT3V0T2ZNZW1vcnlFcnJvciBvY2N1cmVkLiBJZ25vcmUgdGhlIGVudHJ5LiIpOwotICAgICAgICAgICAgU3lzdGVtLmdjKCk7Ci0gICAgICAgICAgICAvLyBUT0RPOiBzaG91bGQgdGVsbCB1c2VycyB3aGF0IGhhcHBlbmVkPwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBtQ3Vyc29yLm1vdmVUb05leHQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgY2FyZSB0aGUgT3V0T2ZNZW1vcnlFcnJvciBvbiB0aGUgaGFuZGxlciBzaWRlCi0gICAgICAgIC8vIDotUAotICAgICAgICBpZiAobUNhcmVIYW5kbGVyRXJyb3JzKSB7Ci0gICAgICAgICAgICBMaXN0PE9uZUVudHJ5SGFuZGxlcj4gZmluaXNoZWRMaXN0ID0gbmV3IEFycmF5TGlzdDxPbmVFbnRyeUhhbmRsZXI+KAotICAgICAgICAgICAgICAgICAgICBtSGFuZGxlckxpc3Quc2l6ZSgpKTsKLSAgICAgICAgICAgIGZvciAoT25lRW50cnlIYW5kbGVyIGhhbmRsZXIgOiBtSGFuZGxlckxpc3QpIHsKLSAgICAgICAgICAgICAgICBpZiAoIWhhbmRsZXIub25FbnRyeUNyZWF0ZWQodmNhcmQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmb3IgKE9uZUVudHJ5SGFuZGxlciBoYW5kbGVyIDogbUhhbmRsZXJMaXN0KSB7Ci0gICAgICAgICAgICAgICAgaGFuZGxlci5vbkVudHJ5Q3JlYXRlZCh2Y2FyZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBjcmVhdGVPbmVFbnRyeUludGVybmFsKGZpbmFsIFN0cmluZyBjb250YWN0SWQsCi0gICAgICAgICAgICBNZXRob2QgZ2V0RW50aXR5SXRlcmF0b3JNZXRob2QpIHRocm93cyBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsIExpc3Q8Q29udGVudFZhbHVlcz4+IGNvbnRlbnRWYWx1ZXNMaXN0TWFwID0KLSAgICAgICAgICAgICAgICBuZXcgSGFzaE1hcDxTdHJpbmcsIExpc3Q8Q29udGVudFZhbHVlcz4+KCk7Ci0gICAgICAgIC8vIFRoZSByZXNvbHZlciBtYXkgcmV0dXJuIHRoZSBlbnRpdHkgaXRlcmF0b3Igd2l0aCBubyBkYXRhLiBJdCBpcyBwb3NzaWJsZS4KLSAgICAgICAgLy8gZS5nLiBJZiBhbGwgdGhlIGRhdGEgaW4gdGhlIGNvbnRhY3Qgb2YgdGhlIGdpdmVuIGNvbnRhY3QgaWQgYXJlIG5vdCBleHBvcnRhYmxlIG9uZXMsCi0gICAgICAgIC8vICAgICAgdGhleSBhcmUgaGlkZGVuIGZyb20gdGhlIHZpZXcgb2YgdGhpcyBtZXRob2QsIHRob3VnaCBjb250YWN0IGlkIGl0c2VsZiBleGlzdHMuCi0gICAgICAgIEVudGl0eUl0ZXJhdG9yIGVudGl0eUl0ZXJhdG9yID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGZpbmFsIFVyaSB1cmkgPSBSYXdDb250YWN0c0VudGl0eS5DT05URU5UX1VSSS5idWlsZFVwb24oKQotICAgICAgICAgICAgICAgICAgICAuYXBwZW5kUXVlcnlQYXJhbWV0ZXIoRGF0YS5GT1JfRVhQT1JUX09OTFksICIxIikKLSAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgc2VsZWN0aW9uID0gRGF0YS5DT05UQUNUX0lEICsgIj0/IjsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZ1tdIHNlbGVjdGlvbkFyZ3MgPSBuZXcgU3RyaW5nW10ge2NvbnRhY3RJZH07Ci0gICAgICAgICAgICBpZiAoZ2V0RW50aXR5SXRlcmF0b3JNZXRob2QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIFBsZWFzZSBub3RlIHRoYXQgdGhpcyBicmFuY2ggaXMgZXhlY3V0ZWQgYnkgc29tZSB0ZXN0cyBvbmx5Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgZW50aXR5SXRlcmF0b3IgPSAoRW50aXR5SXRlcmF0b3IpZ2V0RW50aXR5SXRlcmF0b3JNZXRob2QuaW52b2tlKG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRlbnRSZXNvbHZlciwgdXJpLCBzZWxlY3Rpb24sIHNlbGVjdGlvbkFyZ3MsIG51bGwpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaGFzIGJlZW4gdGhyb3duOiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGhhcyBiZWVuIHRocm93bjogIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBoYXMgYmVlbiB0aHJvd246ICIpOwotICAgICAgICAgICAgICAgICAgICBTdGFja1RyYWNlRWxlbWVudFtdIHN0YWNrVHJhY2VFbGVtZW50cyA9IGUuZ2V0Q2F1c2UoKS5nZXRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoU3RhY2tUcmFjZUVsZW1lbnQgZWxlbWVudCA6IHN0YWNrVHJhY2VFbGVtZW50cykgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIiAgICBhdCAiICsgZWxlbWVudC50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVkNhcmRFeGNlcHRpb24oIkludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gaGFzIGJlZW4gdGhyb3duOiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmdldENhdXNlKCkuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGVudGl0eUl0ZXJhdG9yID0gUmF3Q29udGFjdHMubmV3RW50aXR5SXRlcmF0b3IobUNvbnRlbnRSZXNvbHZlci5xdWVyeSgKLSAgICAgICAgICAgICAgICAgICAgICAgIHVyaSwgbnVsbCwgc2VsZWN0aW9uLCBzZWxlY3Rpb25BcmdzLCBudWxsKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChlbnRpdHlJdGVyYXRvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIkVudGl0eUl0ZXJhdG9yIGlzIG51bGwiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gIiI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghZW50aXR5SXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgIkRhdGEgZG9lcyBub3QgZXhpc3QuIGNvbnRhY3RJZDogIiArIGNvbnRhY3RJZCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICIiOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB3aGlsZSAoZW50aXR5SXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgRW50aXR5IGVudGl0eSA9IGVudGl0eUl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgICAgICBmb3IgKE5hbWVkQ29udGVudFZhbHVlcyBuYW1lZENvbnRlbnRWYWx1ZXMgOiBlbnRpdHkuZ2V0U3ViVmFsdWVzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzID0gbmFtZWRDb250ZW50VmFsdWVzLnZhbHVlczsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGtleSA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoRGF0YS5NSU1FVFlQRSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChrZXkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDb250ZW50VmFsdWVzPiBjb250ZW50VmFsdWVzTGlzdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRWYWx1ZXNMaXN0TWFwLmdldChrZXkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnRWYWx1ZXNMaXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50VmFsdWVzTGlzdCA9IG5ldyBBcnJheUxpc3Q8Q29udGVudFZhbHVlcz4oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50VmFsdWVzTGlzdE1hcC5wdXQoa2V5LCBjb250ZW50VmFsdWVzTGlzdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50VmFsdWVzTGlzdC5hZGQoY29udGVudFZhbHVlcyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoZW50aXR5SXRlcmF0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGVudGl0eUl0ZXJhdG9yLmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBWQ2FyZEJ1aWxkZXIgYnVpbGRlciA9IG5ldyBWQ2FyZEJ1aWxkZXIobVZDYXJkVHlwZSk7Ci0gICAgICAgIGJ1aWxkZXIuYXBwZW5kTmFtZVByb3BlcnRpZXMoY29udGVudFZhbHVlc0xpc3RNYXAuZ2V0KFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKSkKLSAgICAgICAgICAgICAgICAuYXBwZW5kTmlja05hbWVzKGNvbnRlbnRWYWx1ZXNMaXN0TWFwLmdldChOaWNrbmFtZS5DT05URU5UX0lURU1fVFlQRSkpCi0gICAgICAgICAgICAgICAgLmFwcGVuZFBob25lcyhjb250ZW50VmFsdWVzTGlzdE1hcC5nZXQoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpKQotICAgICAgICAgICAgICAgIC5hcHBlbmRFbWFpbHMoY29udGVudFZhbHVlc0xpc3RNYXAuZ2V0KEVtYWlsLkNPTlRFTlRfSVRFTV9UWVBFKSkKLSAgICAgICAgICAgICAgICAuYXBwZW5kUG9zdGFscyhjb250ZW50VmFsdWVzTGlzdE1hcC5nZXQoU3RydWN0dXJlZFBvc3RhbC5DT05URU5UX0lURU1fVFlQRSkpCi0gICAgICAgICAgICAgICAgLmFwcGVuZE9yZ2FuaXphdGlvbnMoY29udGVudFZhbHVlc0xpc3RNYXAuZ2V0KE9yZ2FuaXphdGlvbi5DT05URU5UX0lURU1fVFlQRSkpCi0gICAgICAgICAgICAgICAgLmFwcGVuZFdlYnNpdGVzKGNvbnRlbnRWYWx1ZXNMaXN0TWFwLmdldChXZWJzaXRlLkNPTlRFTlRfSVRFTV9UWVBFKSk7Ci0gICAgICAgIGlmICgobVZDYXJkVHlwZSAmIFZDYXJkQ29uZmlnLkZMQUdfUkVGUkFJTl9JTUFHRV9FWFBPUlQpID09IDApIHsKLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kUGhvdG9zKGNvbnRlbnRWYWx1ZXNMaXN0TWFwLmdldChQaG90by5DT05URU5UX0lURU1fVFlQRSkpOwotICAgICAgICB9Ci0gICAgICAgIGJ1aWxkZXIuYXBwZW5kTm90ZXMoY29udGVudFZhbHVlc0xpc3RNYXAuZ2V0KE5vdGUuQ09OVEVOVF9JVEVNX1RZUEUpKQotICAgICAgICAgICAgICAgIC5hcHBlbmRFdmVudHMoY29udGVudFZhbHVlc0xpc3RNYXAuZ2V0KEV2ZW50LkNPTlRFTlRfSVRFTV9UWVBFKSkKLSAgICAgICAgICAgICAgICAuYXBwZW5kSW1zKGNvbnRlbnRWYWx1ZXNMaXN0TWFwLmdldChJbS5DT05URU5UX0lURU1fVFlQRSkpCi0gICAgICAgICAgICAgICAgLmFwcGVuZFJlbGF0aW9uKGNvbnRlbnRWYWx1ZXNMaXN0TWFwLmdldChSZWxhdGlvbi5DT05URU5UX0lURU1fVFlQRSkpOwotICAgICAgICByZXR1cm4gYnVpbGRlci50b1N0cmluZygpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlcm1pbmF0ZSgpIHsKLSAgICAgICAgZm9yIChPbmVFbnRyeUhhbmRsZXIgaGFuZGxlciA6IG1IYW5kbGVyTGlzdCkgewotICAgICAgICAgICAgaGFuZGxlci5vblRlcm1pbmF0ZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1DdXJzb3IgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBtQ3Vyc29yLmNsb3NlKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChTUUxpdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJTUUxpdGVFeGNlcHRpb24gb24gQ3Vyc29yI2Nsb3NlKCk6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQ3Vyc29yID0gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIG1UZXJtaW5hdGVJc0NhbGxlZCA9IHRydWU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZmluYWxpemUoKSB7Ci0gICAgICAgIGlmICghbVRlcm1pbmF0ZUlzQ2FsbGVkKSB7Ci0gICAgICAgICAgICB0ZXJtaW5hdGUoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0Q291bnQoKSB7Ci0gICAgICAgIGlmIChtQ3Vyc29yID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtQ3Vyc29yLmdldENvdW50KCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNBZnRlckxhc3QoKSB7Ci0gICAgICAgIGlmIChtQ3Vyc29yID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbUN1cnNvci5pc0FmdGVyTGFzdCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gUmV0dXJuIHRoZSBlcnJvciByZWFzb24gaWYgcG9zc2libGUuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRFcnJvclJlYXNvbigpIHsKLSAgICAgICAgcmV0dXJuIG1FcnJvclJlYXNvbjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRDb25maWcuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZENvbmZpZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjE5ODQwLi4wMDAwMDAwCi0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZENvbmZpZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDc3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZDsKLQotaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlBob25lTnVtYmVyVXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiBUaGUgY2xhc3MgcmVwcmVzZW50aW5nIFZDYXJkIHJlbGF0ZWQgY29uZmlndXJhdGlvbnMuIFVzZWZ1bCBzdGF0aWMgbWV0aG9kcyBhcmUgbm90IGluIHRoaXMgY2xhc3MKLSAqIGJ1dCBpbiBWQ2FyZFV0aWxzLgotICovCi1wdWJsaWMgY2xhc3MgVkNhcmRDb25maWcgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIlZDYXJkQ29uZmlnIjsKLQotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIGludCBMT0dfTEVWRUxfTk9ORSA9IDA7Ci0gICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgaW50IExPR19MRVZFTF9QRVJGT1JNQU5DRV9NRUFTVVJFTUVOVCA9IDB4MTsKLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBpbnQgTE9HX0xFVkVMX1NIT1dfV0FSTklORyA9IDB4MjsKLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBpbnQgTE9HX0xFVkVMX1ZFUkJPU0UgPQotICAgICAgICBMT0dfTEVWRUxfUEVSRk9STUFOQ0VfTUVBU1VSRU1FTlQgfCBMT0dfTEVWRUxfU0hPV19XQVJOSU5HOwotCi0gICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgaW50IExPR19MRVZFTCA9IExPR19MRVZFTF9OT05FOwotCi0gICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgaW50IFBBUlNFX1RZUEVfVU5LTk9XTiA9IDA7Ci0gICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgaW50IFBBUlNFX1RZUEVfQVBQTEUgPSAxOwotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIGludCBQQVJTRV9UWVBFX01PQklMRV9QSE9ORV9KUCA9IDI7ICAvLyBGb3IgSmFwYW5lc2UgbW9iaWxlIHBob25lcy4KLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBpbnQgUEFSU0VfVFlQRV9GT01BID0gMzsgIC8vIEZvciBKYXBhbmVzZSBGT01BIG1vYmlsZSBwaG9uZXMuCi0gICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgaW50IFBBUlNFX1RZUEVfV0lORE9XU19NT0JJTEVfSlAgPSA0OwotCi0gICAgLy8gQXNzdW1lcyB0aGF0ICJpc28tODg1OS0xIiBpcyBhYmxlIHRvIG1hcCAiYWxsIiA4Yml0IGNoYXJhY3RlcnMgdG8gc29tZSB1bmljb2RlIGFuZAotICAgIC8vIGRlY29kZSB0aGUgdW5pY29kZSB0byB0aGUgb3JpZ2luYWwgY2hhcnNldC4gSWYgbm90LCB0aGlzIHNldHRpbmcgd2lsbCBjYXVzZSBzb21lIGJ1Zy4gCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9DSEFSU0VUID0gImlzby04ODU5LTEiOwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfVjIxID0gMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX1YzMCA9IDE7Ci0KLSAgICAvLyAweDIgaXMgcmVzZXJ2ZWQgZm9yIHRoZSBmdXR1cmUgdXNlIC4uLgotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTkFNRV9PUkRFUl9ERUZBVUxUID0gMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOQU1FX09SREVSX0VVUk9QRSA9IDB4NDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOQU1FX09SREVSX0pBUEFORVNFID0gMHg4OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOQU1FX09SREVSX01BU0sgPSAweEM7Ci0KLSAgICAvLyAweDEwIGlzIHJlc2VydmVkIGZvciBzYWZldHkKLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19DSEFSU0VUX1VURjggPSAwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGTEFHX0NIQVJTRVRfU0hJRlRfSklTID0gMHgxMDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZMQUdfQ0hBUlNFVF9NQVNLID0gMHhGMDA7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmxhZyBpbmRpY2F0aW5nIHRoZSB2Q2FyZCBjb21wb3NlciB3aWxsIGFkZCBzb21lICJYLSIgcHJvcGVydGllcyB1c2VkIG9ubHkgaW4gQW5kcm9pZAotICAgICAqIHdoZW4gdGhlIGZvcm1hbCB2Q2FyZCBzcGVjaWZpY2F0aW9uIGRvZXMgbm90IGhhdmUgYXBwcm9wcmlhdGUgZmllbGRzIGZvciB0aGF0IGRhdGEuCi0gICAgICogCi0gICAgICogRm9yIGV4YW1wbGUsIEFuZHJvaWQgYWNjZXB0cyBuaWNrbmFtZSBpbmZvcm1hdGlvbiB3aGlsZSB2Q2FyZCAyLjEgZG9lcyBub3QuCi0gICAgICogV2hlbiB0aGlzIGZsYWcgaXMgb24sIHZDYXJkIGNvbXBvc2VyIGVtaXRzIGFsdGVybmF0aXZlICJYLSIgcHJvcGVydHkgKGxpa2UgIlgtTklDS05BTUUiKQotICAgICAqIGluc3RlYWQgb2YganVzdCBkcm9wcGluZyBpdC4KLSAgICAgKiAKLSAgICAgKiB2Q2FyZCBwYXJzZXIgY29kZSBhdXRvbWF0aWNhbGx5IHBhcnNlcyB0aGUgZmllbGQgZW1pdHRlZCBldmVuIHdoZW4gdGhpcyBmbGFnIGlzIG9mZi4KLSAgICAgKiAKLSAgICAgKiBOb3RlIHRoYXQgdGhpcyBmbGFnIGRvZXMgbm90IGFzc3VyZSBhbGwgdGhlIGluZm9ybWF0aW9uIG11c3QgYmUgaG9sZCBpbiB0aGUgZW1pdHRlZCB2Q2FyZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19VU0VfQU5EUk9JRF9QUk9QRVJUWSA9IDB4ODAwMDAwMDA7Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhlIGZsYWcgaW5kaWNhdGluZyB0aGUgdkNhcmQgY29tcG9zZXIgd2lsbCBhZGQgc29tZSAiWC0iIHByb3BlcnRpZXMgc2VlbiBpbiB0aGUKLSAgICAgKiB2Q2FyZCBkYXRhIGVtaXR0ZWQgYnkgdGhlIG90aGVyIHNvZnR3YXJlcy9kZXZpY2VzIHdoZW4gdGhlIGZvcm1hbCB2Q2FyZCBzcGVjaWZpY2F0aW9uCi0gICAgICogZG9lcyBub3QgaGF2ZSBhcHByb3ByaWF0ZSBmaWVsZChzKSBmb3IgdGhhdCBkYXRhLiAKLSAgICAgKiAKLSAgICAgKiBPbmUgZXhhbXBsZSBpcyBYLVBIT05FVElDLUZJUlNULU5BTUUvWC1QSE9ORVRJQy1NSURETEUtTkFNRS9YLVBIT05FVElDLUxBU1QtTkFNRSwgd2hpY2ggYXJlCi0gICAgICogZm9yIHBob25ldGljIG5hbWUgKGhvdyB0aGUgbmFtZSBpcyBwcm9ub3VuY2VkKSwgc2VlbiBpbiB0aGUgdkNhcmQgZW1pdHRlZCBieSBzb21lIG90aGVyCi0gICAgICogbm9uLUFuZHJvaWQgZGV2aWNlcy9zb2Z0d2FyZXMuIFdlIGNob3NlIHRvIGVuYWJsZSB0aGUgdkNhcmQgY29tcG9zZXIgdG8gdXNlIHRob3NlCi0gICAgICogZGVmYWN0IHByb3BlcnRpZXMgc2luY2UgdGhleSBhcmUgYWxzbyB1c2VmdWwgZm9yIEFuZHJvaWQgZGV2aWNlcy4KLSAgICAgKiAKLSAgICAgKiBOb3RlIGZvciBkZXZlbG9wZXJzOiBvbmx5ICJYLSIgcHJvcGVydGllcyBzaG91bGQgYmUgYWRkZWQgd2l0aCB0aGlzIGZsYWcuIHZDYXJkIDIuMS8zLjAKLSAgICAgKiBhbGxvd3MgYW55IGtpbmQgb2YgIlgtIiBwcm9wZXJ0aWVzIGJ1dCBkb2VzIG5vdCBhbGxvdyBub24tIlgtIiBwcm9wZXJ0aWVzIChleGNlcHQgSUFOQSB0b2tlbnMKLSAgICAgKiBpbiB2Q2FyZCAzLjApLiBTb21lIGV4dGVybmFsIHBhcnNlcnMgbWF5IGdldCBjb25mdXNlZCB3aXRoIG5vbi12YWxpZCwgbm9uLSJYLSIgcHJvcGVydGllcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19VU0VfREVGQUNUX1BST1BFUlRZID0gMHg0MDAwMDAwMDsKLQotICAgIC8qKgotICAgICAqIFRoZSBmbGFnIGluZGljYXRpbmcgc29tZSBzcGVjaWZpYyBkaWFsZWN0IHNlZW4gaW4gdmNhcmQgb2YgRG9Db01vIChvbmUgb2YgSmFwYW5lc2UKLSAgICAgKiBtb2JpbGUgY2FyZWVycykgc2hvdWxkIGJlIHVzZWQuIFRoaXMgZmxhZyBkb2VzIG5vdCBpbmNsdWRlIGFueSBvdGhlciBpbmZvcm1hdGlvbiBsaWtlCi0gICAgICogdGhhdCAidGhlIHZDYXJkIGlzIGZvciBKYXBhbmVzZSIuIFNvIGl0IGlzICJwb3NzaWJsZSIgdGhhdCAidGhlIHZDYXJkIHNob3VsZCBoYXZlIERvQ29NbydzCi0gICAgICogZGlhbGVjdCBidXQgdGhlIG5hbWUgb3JkZXIgc2hvdWxkIGJlIEV1cm9wZWFuIiwgYnV0IGl0IGlzIG5vdCByZWNvbW1lbmRlZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19ET0NPTU8gPSAweDIwMDAwMDAwOwotCi0gICAgLyoqCi0gICAgICogPFA+Ci0gICAgICogVGhlIGZsYWcgaW5kaWNhdGluZyB0aGUgdkNhcmQgY29tcG9zZXIgZG9lcyAiTk9UIiB1c2UgUXVvdGVkLVByaW50YWJsZSB0b3dhcmQgInByaW1hcnkiCi0gICAgICogcHJvcGVydGllcyBldmVuIHRob3VnaCBpdCBpcyByZXF1aXJlZCBieSB2Q2FyZCAyLjEgKFFQIGlzIHByb2hpYml0ZWQgaW4gdkNhcmQgMy4wKS4KLSAgICAgKiA8L1A+Ci0gICAgICogPFA+Ci0gICAgICogV2UgYWN0dWFsbHkgY2Fubm90IGRlZmluZSB3aGF0IGlzIHRoZSAicHJpbWFyeSIgcHJvcGVydHkuIE5vdGUgdGhhdCB0aGlzIGlzIE5PVCBkZWZpbmVkCi0gICAgICogaW4gdkNhcmQgc3BlY2lmaWNhdGlvbiBlaXRoZXIuIEFsc28gYmUgYXdhcmUgdGhhdCBpdCBpcyBOT1QgcmVsYXRlZCB0byAicHJpbWFyeSIgbm90aW9uCi0gICAgICogdXNlZCBpbiB7QGxpbmsgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0fS4KLSAgICAgKiBUaGlzIG5vdGlvbiBpcyBqdXN0IGZvciB2Q2FyZCBjb21wb3NpdGlvbiBpbiBBbmRyb2lkLgotICAgICAqIDwvUD4KLSAgICAgKiA8UD4KLSAgICAgKiBXZSBhZGRlZCB0aGlzIEFuZHJvaWQtc3BlY2lmaWMgbm90aW9uIHNpbmNlIHNvbWUgKGluY29tcGxldGUpIHZDYXJkIGV4cG9ydGVycyBmb3IgdkNhcmQgMi4xCi0gICAgICogZG8gTk9UIHVzZSBRdW90ZWQtUHJpbnRhYmxlIGVuY29kaW5nIHRvd2FyZCBzb21lIHByb3BlcnRpZXMgcmVsYXRlZCBuYW1lcyBsaWtlICJOIiwgIkZOIiwgZXRjLgotICAgICAqIGV2ZW4gd2hlbiB0aGVpciB2YWx1ZXMgY29udGFpbiBub24tYXNjaWkgb3IvYW5kIENSL0xGLCB3aGlsZSB0aGV5IHVzZSB0aGUgZW5jb2RpbmcgaW4gdGhlCi0gICAgICogb3RoZXIgcHJvcGVydGllcyBsaWtlICJBRFIiLCAiT1JHIiwgZXRjLgotICAgICAqIDxQPgotICAgICAqIFdlIGFyZSBhZnJhaWQgb2YgdGhlIGNhc2Ugd2hlcmUgc29tZSB2Q2FyZCBpbXBvcnRlciBhbHNvIGZvcmdldCBoYW5kbGluZyBRUCBwcmVzdW1pbmcgUVAgaXMKLSAgICAgKiBub3QgdXNlZCBpbiBzdWNoIGZpZWxkcy4KLSAgICAgKiA8L1A+Ci0gICAgICogPFA+Ci0gICAgICogVGhpcyBmbGFnIGlzIHVzZWZ1bCB3aGVuIHNvbWUgdGFyZ2V0IGltcG9ydGVyIHlvdSBhcmUgZ29pbmcgdG8gZm9jdXMgb24gZG9lcyBub3QgYWNjZXB0Ci0gICAgICogc3VjaCBwcm9wZXJ0aWVzIHdpdGggUXVvdGVkLVByaW50YWJsZSBlbmNvZGluZy4KLSAgICAgKiA8L1A+Ci0gICAgICogPFA+Ci0gICAgICogQWdhaW4sIHdlIHNob3VsZCBub3QgdXNlIHRoaXMgZmxhZyBhdCBhbGwgZm9yIGNvbXBseWluZyB2Q2FyZCAyLjEgc3BlYy4KLSAgICAgKiA8L1A+Ci0gICAgICogPFA+Ci0gICAgICogSW4gdkNhcmQgMy4wLCBRdW90ZWQtUHJpbnRhYmxlIGlzIGV4cGxpY2l0bHkgInByb2hpYml0dGVkIiwgc28gd2UgZG9uJ3QgbmVlZCB0byBjYXJlIHRoaXMKLSAgICAgKiBraW5kIG9mIHByb2JsZW0gKGhvcGVmdWxseSkuCi0gICAgICogPC9QPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfUkVGUkFJTl9RUF9UT19OQU1FX1BST1BFUlRJRVMgPSAweDEwMDAwMDAwOwotCi0gICAgLyoqCi0gICAgICogPFA+Ci0gICAgICogVGhlIGZsYWcgaW5kaWNhdGluZyB0aGF0IHBob25ldGljIG5hbWUgcmVsYXRlZCBmaWVsZHMgbXVzdCBiZSBjb252ZXJ0ZWQgdG8KLSAgICAgKiBhcHByb3ByaWF0ZSBmb3JtLiBOb3RlIHRoYXQgImFwcHJvcHJpYXRlIiBpcyBub3QgZGVmaW5lZCBpbiBhbnkgdkNhcmQgc3BlY2lmaWNhdGlvbi4KLSAgICAgKiBUaGlzIGlzIEFuZHJvaWQtc3BlY2lmaWMuCi0gICAgICogPC9QPgotICAgICAqIDxQPgotICAgICAqIE9uZSB0eXBpY2FsIChhbmQgY3VycmVudGx5IHNvbGUpIGV4YW1wbGUgd2hlcmUgd2UgbmVlZCB0aGlzIGZsYWcgaXMgdGhlIHRpbWUgd2hlbgotICAgICAqIHdlIG5lZWQgdG8gZW1pdCBKYXBhbmVzZSBwaG9uZXRpYyBuYW1lcyBpbnRvIHZDYXJkIGVudHJpZXMuIFRoZSBwcm9wZXJ0eSB2YWx1ZXMKLSAgICAgKiBzaG91bGQgYmUgZW5jb2RlZCBpbnRvIGhhbGYtd2lkdGgga2F0YWthbmEgd2hlbiB0aGUgdGFyZ2V0IGltcG9ydGVyIGlzIEphcGFuZXNlIG1vYmlsZQotICAgICAqIHBob25lcycsIHdoaWNoIGFyZSBwcm9iYWJseSBub3QgYWJsZSB0byBwYXJzZSBmdWxsLXdpZHRoIGhpcmFnYW5hL2thdGFrYW5hIGZvcgotICAgICAqIGhpc3RvcmljYWwgcmVhc29ucywgd2hpbGUgdGhlIHZDYXJkIGltcG9ydGVycyBlbWJlZGRlZCB0byBzb2Z0d2FyZXMgZm9yIFBDIHNob3VsZCBiZQotICAgICAqIGFibGUgdG8gcGFyc2UgdGhlbSBhcyB3ZSBleHBlY3QuCi0gICAgICogPC9QPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfQ09OVkVSVF9QSE9ORVRJQ19OQU1FX1NUUklOR1MgPSAweDA4MDAwMDA7Ci0KLSAgICAvKioKLSAgICAgKiA8UD4KLSAgICAgKiBUaGUgZmxhZyBpbmRpY2F0aW5nIHRoZSB2Q2FyZCBjb21wb3NlciAiZm9yIDIuMSIgZW1pdHMgIlRZUEU9IiBzdHJpbmcgdG93YXJkIFRZUEUgcGFyYW1zCi0gICAgICogZXZlcnkgdGltZSBwb3NzaWJsZS4gVGhlIGRlZmF1bHQgYmVoYXZpb3IgZG9lcyBub3QgZW1pdCBpdCBhbmQgaXMgdmFsaWQgaW4gdGhlIHNwZWMuCi0gICAgICogSW4gdkNyYWQgMy4wLCB0aGlzIGZsYWcgaXMgdW5uZWNlc3NhcnksIHNpbmNlICJUWVBFPSIgaXMgTVVTVCBpbiB2Q2FyZCAzLjAgc3BlY2lmaWNhdGlvbi4KLSAgICAgKiA8L1A+Ci0gICAgICogPFA+Ci0gICAgICogRGV0YWlsOgotICAgICAqIEhvdyBtb3JlIHRoYW4gb25lIFRZUEUgZmllbGRzIGFyZSBleHByZXNzZWQgaXMgZGlmZmVyZW50IGJldHdlZW4gdkNhcmQgMi4xIGFuZCB2Q2FyZCAzLjAuCi0gICAgICogPC9wPgotICAgICAqIDxQPgotICAgICAqIGUuZy48QlIgLz4KLSAgICAgKiAxKSBQcm9iYWJseSB2YWxpZCBpbiBib3RoIHZDYXJkIDIuMSBhbmQgdkNhcmQgMy4wOiAiQURSO1RZUEU9RE9NO1RZUEU9SE9NRTouLi4iPEJSIC8+Ci0gICAgICogMikgVmFsaWQgaW4gdkNhcmQgMi4xIGJ1dCBub3QgaW4gdkNhcmQgMy4wOiAiQURSO0RPTTtIT01FOi4uLiI8QlIgLz4KLSAgICAgKiAzKSBWYWxpZCBpbiB2Q2FyZCAzLjAgYnV0IG5vdCBpbiB2Q2FyZCAyLjE6ICJBRFI7VFlQRT1ET00sSE9NRTouLi4iPEJSIC8+Ci0gICAgICogPC9QPgotICAgICAqIDxQPgotICAgICAqIDIpIGhhZCBiZWVuIHRoZSBkZWZhdWx0IG9mIFZDYXJkIGV4cG9ydGVyL2ltcG9ydGVyIGluIEFuZHJvaWQsIGJ1dCBpdCBpcyBmb3VuZCB0aGF0Ci0gICAgICogc29tZSBleHRlcm5hbCBleHBvcnRlciBpcyBub3QgYWJsZSB0byBwYXJzZSB0aGUgdHlwZSBmb3JtYXQgbGlrZSAyKSBidXQgb25seSAzKS4KLSAgICAgKiA8L1A+Ci0gICAgICogPFA+Ci0gICAgICogSWYgeW91IGFyZSB0YXJnZXRpbmcgdG8gdGhlIGltcG9ydGVyIHdoaWNoIGNhbm5vdCBhY2NlcHQgVFlQRSBwYXJhbXMgd2l0aG91dCAiVFlQRT0iCi0gICAgICogc3RyaW5ncyAod2hpY2ggc2hvdWxkIGJlIHJhcmUgdGhvdWdoKSwgcGxlYXNlIHVzZSB0aGlzIGZsYWcuCi0gICAgICogPC9QPgotICAgICAqIDxQPgotICAgICAqIEV4YW1wbGUgdXNhZ2U6IGludCB2Y2FyZFR5cGUgPSAoVkNBUkRfVFlQRV9WMjFfR0VORVJJQyB8IEZMQUdfQVBQRU5EX1RZUEVfUEFSQU0pOwotICAgICAqIDwvUD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX0FQUEVORF9UWVBFX1BBUkFNID0gMHgwNDAwMDAwMDsKLQotICAgIC8qKgotICAgICAqIDxQPgotICAgICAqIFRoZSBmbGFnIGFza2luZyBleHBvcnRlciB0byByZWZyYWluIGltYWdlIGV4cG9ydC4KLSAgICAgKiA8L1A+Ci0gICAgICogQGhpZGUgd2lsbCBiZSBkZWxldGVkIGluIHRoZSBuZWFyIGZ1dHVyZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX1JFRlJBSU5fSU1BR0VfRVhQT1JUID0gMHgwMjAwMDAwMDsKLQotICAgIC8qKgotICAgICAqIDxQPgotICAgICAqIFRoZSBmbGFnIGluZGljYXRpbmcgdGhlIHZDYXJkIGNvbXBvc2VyIGRvZXMgdG91Y2ggbm90aGluZyB0b3dhcmQgcGhvbmUgbnVtYmVyIFN0cmluZ3MKLSAgICAgKiBidXQgbGVhdmUgaXQgYXMgaXMuCi0gICAgICogPC9QPgotICAgICAqIDxQPgotICAgICAqIFRoZSB2Q2FyZCBzcGVjaWZpY2F0aW9ucyBtZW50aW9uIG5vdGhpbmcgdG93YXJkIHBob25lIG51bWJlcnMsIHdoaWxlIHNvbWUgZGV2aWNlcwotICAgICAqIGRvICh3cm9uZ2x5LCBidXQgd2l0aCBpbm5ldml0YWJsZSByZWFzb25zKS4KLSAgICAgKiBGb3IgZXhhbXBsZSwgdGhlcmUncyBhIHBvc3NpYmlsaXR5IEphcGFuZXNlIG1vYmlsZSBwaG9uZXMgYXJlIGV4cGVjdGVkIHRvIGhhdmUKLSAgICAgKiBqdXN0IG51bWJlcnMsIGh5cGVucywgcGx1cywgZXRjLiBidXQgbm90IHVzdWFsIGFscGhhYmV0cywgd2hpbGUgVVMgbW9iaWxlIHBob25lcwotICAgICAqIHNob3VsZCBnZXQgc3VjaCBjaGFyYWN0ZXJzLiBUbyBtYWtlIGV4cG9ydGVkIHZDYXJkIHNpbXBsZSBmb3IgZXh0ZXJuYWwgcGFyc2VycywKLSAgICAgKiB3ZSBoYXZlIHVzZWQge0BsaW5rIFBob25lTnVtYmVyVXRpbHMjZm9ybWF0TnVtYmVyKFN0cmluZyl9IGR1cmluZyBleHBvcnQsIGFuZAotICAgICAqIHJlbW92ZWQgdW5uZWNlc3NhcnkgY2hhcmFjdGVycyBpbnNpZGUgdGhlIG51bWJlciAoZS5nLiAiMTExLTIyMi0zMzMzIChNaWFtaSkiCi0gICAgICogYmVjb21lcyAiMTExLTIyMi0zMzMzIikuCi0gICAgICogVW5mb3J0dW5hdGUgc2lkZSBlZmZlY3Qgb2YgdGhhdCB1c2Ugd2FzIHNvbWUgY29udHJvbCBjaGFyYWN0ZXJzIHVzZWQgaW4gdGhlIG90aGVyCi0gICAgICogYXJlYXMgbWF5IGJlIGJhZGx5IGFmZmVjdGVkIGJ5IHRoZSBmb3JtYXR0aW5nLgotICAgICAqIDwvUD4KLSAgICAgKiA8UD4KLSAgICAgKiBUaGlzIGZsYWcgZGlzYWJsZXMgdGhhdCBmb3JtYXR0aW5nLCBhZmZlY3RpbmcgYm90aCBpbXBvcnRlciBhbmQgZXhwb3J0ZXIuCi0gICAgICogSWYgdGhlIHVzZXIgaXMgYXdhcmUgb2Ygc29tZSBzaWRlIGVmZmVjdHMgZHVlIHRvIHRoZSBpbXBsaWNpdCBmb3JtYXR0aW5nLCB1c2UgdGhpcyBmbGFnLgotICAgICAqIDwvUD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX1JFRlJBSU5fUEhPTkVfTlVNQkVSX0ZPUk1BVFRJTkcgPSAweDAyMDAwMDAwOwotCi0gICAgLy8vLyBUaGUgZm9sbG93aW5ncyBhcmUgVkNhcmQgdHlwZXMgYXZhaWxhYmxlIGZyb20gaW1wb3J0ZXIvZXhwb3J0ZXIuIC8vLy8KLQotICAgIC8qKgotICAgICAqIDxQPgotICAgICAqIEdlbmVyaWMgdkNhcmQgZm9ybWF0IHdpdGggdGhlIHZDYXJkIDIuMS4gVXNlcyBVVEYtOCBmb3IgdGhlIGNoYXJzZXQuCi0gICAgICogV2hlbiBjb21wb3NpbmcgYSB2Q2FyZCBlbnRyeSwgdGhlIFVTIGNvbnZlbnNpb24gd2lsbCBiZSB1c2VkIHRvd2FyZCBmb3JtYXR0aW5nCi0gICAgICogc29tZSB2YWx1ZXMuCi0gICAgICogPC9QPgotICAgICAqIDxQPgotICAgICAqIGUuZy4gVGhlIG9yZGVyIG9mIHRoZSBkaXNwbGF5IG5hbWUgd291bGQgYmUgIlByZWZpeCBHaXZlbiBNaWRkbGUgRmFtaWx5IFN1ZmZpeCIsCi0gICAgICogd2hpbGUgaXQgc2hvdWxkIGJlICJQcmVmaXggRmFtaWx5IE1pZGRsZSBHaXZlbiBTdWZmaXgiIGluIEphcGFuIGZvciBleGFtcGxlLgotICAgICAqIDwvUD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWQ0FSRF9UWVBFX1YyMV9HRU5FUklDX1VURjggPQotICAgICAgICAoRkxBR19WMjEgfCBOQU1FX09SREVSX0RFRkFVTFQgfCBGTEFHX0NIQVJTRVRfVVRGOCB8Ci0gICAgICAgICAgICAgICAgRkxBR19VU0VfREVGQUNUX1BST1BFUlRZIHwgRkxBR19VU0VfQU5EUk9JRF9QUk9QRVJUWSk7Ci0KLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBTdHJpbmcgVkNBUkRfVFlQRV9WMjFfR0VORVJJQ19VVEY4X1NUUiA9ICJ2MjFfZ2VuZXJpYyI7Ci0gICAgCi0gICAgLyoqCi0gICAgICogPFA+Ci0gICAgICogR2VuZXJhbCB2Q2FyZCBmb3JtYXQgd2l0aCB0aGUgdmVyc2lvbiAzLjAuIFVzZXMgVVRGLTggZm9yIHRoZSBjaGFyc2V0LgotICAgICAqIDwvUD4KLSAgICAgKiA8UD4KLSAgICAgKiBOb3QgZnVsbHkgcmVhZHkgeWV0LiBVc2Ugd2l0aCBjYXV0aW9uIHdoZW4geW91IHVzZSB0aGlzLgotICAgICAqIDwvUD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWQ0FSRF9UWVBFX1YzMF9HRU5FUklDX1VURjggPQotICAgICAgICAoRkxBR19WMzAgfCBOQU1FX09SREVSX0RFRkFVTFQgfCBGTEFHX0NIQVJTRVRfVVRGOCB8Ci0gICAgICAgICAgICAgICAgRkxBR19VU0VfREVGQUNUX1BST1BFUlRZIHwgRkxBR19VU0VfQU5EUk9JRF9QUk9QRVJUWSk7Ci0KLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkNBUkRfVFlQRV9WMzBfR0VORVJJQ19VVEY4X1NUUiA9ICJ2MzBfZ2VuZXJpYyI7Ci0gICAgCi0gICAgLyoqCi0gICAgICogPFA+Ci0gICAgICogR2VuZXJhbCB2Q2FyZCBmb3JtYXQgZm9yIHRoZSB2Q2FyZCAyLjEgd2l0aCBzb21lIEV1cm9wZSBjb252ZW5zaW9uLiBVc2VzIFV0Zi04LgotICAgICAqIEN1cnJlbnRseSwgb25seSBuYW1lIG9yZGVyIGlzIGNvbnNpZGVyZWQgKCJQcmVmaXggTWlkZGxlIEdpdmVuIEZhbWlseSBTdWZmaXgiKQotICAgICAqIDwvUD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWQ0FSRF9UWVBFX1YyMV9FVVJPUEVfVVRGOCA9Ci0gICAgICAgIChGTEFHX1YyMSB8IE5BTUVfT1JERVJfRVVST1BFIHwgRkxBR19DSEFSU0VUX1VURjggfAotICAgICAgICAgICAgICAgIEZMQUdfVVNFX0RFRkFDVF9QUk9QRVJUWSB8IEZMQUdfVVNFX0FORFJPSURfUFJPUEVSVFkpOwotICAgIAotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIFN0cmluZyBWQ0FSRF9UWVBFX1YyMV9FVVJPUEVfVVRGOF9TVFIgPSAidjIxX2V1cm9wZSI7Ci0gICAgCi0gICAgLyoqCi0gICAgICogPFA+Ci0gICAgICogR2VuZXJhbCB2Q2FyZCBmb3JtYXQgd2l0aCB0aGUgdmVyc2lvbiAzLjAgd2l0aCBzb21lIEV1cm9wZSBjb252ZW5zaW9uLiBVc2VzIFVURi04LgotICAgICAqIDwvUD4KLSAgICAgKiA8UD4KLSAgICAgKiBOb3QgcmVhZHkgeWV0LiBVc2Ugd2l0aCBjYXV0aW9uIHdoZW4geW91IHVzZSB0aGlzLgotICAgICAqIDwvUD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWQ0FSRF9UWVBFX1YzMF9FVVJPUEVfVVRGOCA9Ci0gICAgICAgIChGTEFHX1YzMCB8IE5BTUVfT1JERVJfRVVST1BFIHwgRkxBR19DSEFSU0VUX1VURjggfAotICAgICAgICAgICAgICAgIEZMQUdfVVNFX0RFRkFDVF9QUk9QRVJUWSB8IEZMQUdfVVNFX0FORFJPSURfUFJPUEVSVFkpOwotICAgIAotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIFN0cmluZyBWQ0FSRF9UWVBFX1YzMF9FVVJPUEVfU1RSID0gInYzMF9ldXJvcGUiOwotCi0gICAgLyoqCi0gICAgICogPFA+Ci0gICAgICogVGhlIHZDYXJkIDIuMSBmb3JtYXQgZm9yIG1pc2NlbGxhbmVvdXMgSmFwYW5lc2UgZGV2aWNlcywgdXNpbmcgVVRGLTggYXMgZGVmYXVsdCBjaGFyc2V0LgotICAgICAqIDwvUD4KLSAgICAgKiA8UD4KLSAgICAgKiBOb3QgcmVhZHkgeWV0LiBVc2Ugd2l0aCBjYXV0aW9uIHdoZW4geW91IHVzZSB0aGlzLgotICAgICAqIDwvUD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWQ0FSRF9UWVBFX1YyMV9KQVBBTkVTRV9VVEY4ID0KLSAgICAgICAgKEZMQUdfVjIxIHwgTkFNRV9PUkRFUl9KQVBBTkVTRSB8IEZMQUdfQ0hBUlNFVF9VVEY4IHwKLSAgICAgICAgICAgICAgICBGTEFHX1VTRV9ERUZBQ1RfUFJPUEVSVFkgfCBGTEFHX1VTRV9BTkRST0lEX1BST1BFUlRZKTsKLQotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIFN0cmluZyBWQ0FSRF9UWVBFX1YyMV9KQVBBTkVTRV9VVEY4X1NUUiA9ICJ2MjFfamFwYW5lc2VfdXRmOCI7Ci0KLSAgICAvKioKLSAgICAgKiA8UD4KLSAgICAgKiB2Q2FyZCAyLjEgZm9ybWF0IGZvciBtaXNjZWxsYW5lb3VzIEphcGFuZXNlIGRldmljZXMuIFNoaWZ0X0ppcyBpcyB1c2VkIGZvcgotICAgICAqIHBhcnNpbmcvY29tcG9zaW5nIHRoZSB2Q2FyZCBkYXRhLgotICAgICAqIDwvUD4KLSAgICAgKiA8UD4KLSAgICAgKiBOb3QgcmVhZHkgeWV0LiBVc2Ugd2l0aCBjYXV0aW9uIHdoZW4geW91IHVzZSB0aGlzLgotICAgICAqIDwvUD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWQ0FSRF9UWVBFX1YyMV9KQVBBTkVTRV9TSklTID0KLSAgICAgICAgKEZMQUdfVjIxIHwgTkFNRV9PUkRFUl9KQVBBTkVTRSB8IEZMQUdfQ0hBUlNFVF9TSElGVF9KSVMgfAotICAgICAgICAgICAgICAgIEZMQUdfVVNFX0RFRkFDVF9QUk9QRVJUWSB8IEZMQUdfVVNFX0FORFJPSURfUFJPUEVSVFkpOwotCi0gICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgU3RyaW5nIFZDQVJEX1RZUEVfVjIxX0pBUEFORVNFX1NKSVNfU1RSID0gInYyMV9qYXBhbmVzZV9zamlzIjsKLSAgICAKLSAgICAvKioKLSAgICAgKiA8UD4KLSAgICAgKiB2Q2FyZCBmb3JtYXQgZm9yIG1pc2NlbGxhbmVvdXMgSmFwYW5lc2UgZGV2aWNlcywgdXNpbmcgU2hpZnRfSmlzIGZvcgotICAgICAqIHBhcnNpbmcvY29tcG9zaW5nIHRoZSB2Q2FyZCBkYXRhLgotICAgICAqIDwvUD4KLSAgICAgKiA8UD4KLSAgICAgKiBOb3QgcmVhZHkgeWV0LiBVc2Ugd2l0aCBjYXV0aW9uIHdoZW4geW91IHVzZSB0aGlzLgotICAgICAqIDwvUD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWQ0FSRF9UWVBFX1YzMF9KQVBBTkVTRV9TSklTID0KLSAgICAgICAgKEZMQUdfVjMwIHwgTkFNRV9PUkRFUl9KQVBBTkVTRSB8IEZMQUdfQ0hBUlNFVF9TSElGVF9KSVMgfAotICAgICAgICAgICAgICAgIEZMQUdfVVNFX0RFRkFDVF9QUk9QRVJUWSB8IEZMQUdfVVNFX0FORFJPSURfUFJPUEVSVFkpOwotICAgICAgICAKLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkNBUkRfVFlQRV9WMzBfSkFQQU5FU0VfU0pJU19TVFIgPSAidjMwX2phcGFuZXNlX3NqaXMiOwotICAgIAotICAgIC8qKgotICAgICAqIDxQPgotICAgICAqIFRoZSB2Q2FyZCAzLjAgZm9ybWF0IGZvciBtaXNjZWxsYW5lb3VzIEphcGFuZXNlIGRldmljZXMsIHVzaW5nIFVURi04IGFzIGRlZmF1bHQgY2hhcnNldC4KLSAgICAgKiA8L1A+Ci0gICAgICogPFA+Ci0gICAgICogTm90IHJlYWR5IHlldC4gVXNlIHdpdGggY2F1dGlvbiB3aGVuIHlvdSB1c2UgdGhpcy4KLSAgICAgKiA8L1A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVkNBUkRfVFlQRV9WMzBfSkFQQU5FU0VfVVRGOCA9Ci0gICAgICAgIChGTEFHX1YzMCB8IE5BTUVfT1JERVJfSkFQQU5FU0UgfCBGTEFHX0NIQVJTRVRfVVRGOCB8Ci0gICAgICAgICAgICAgICAgRkxBR19VU0VfREVGQUNUX1BST1BFUlRZIHwgRkxBR19VU0VfQU5EUk9JRF9QUk9QRVJUWSk7Ci0KLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkNBUkRfVFlQRV9WMzBfSkFQQU5FU0VfVVRGOF9TVFIgPSAidjMwX2phcGFuZXNlX3V0ZjgiOwotCi0gICAgLyoqCi0gICAgICogPFA+Ci0gICAgICogVGhlIHZDYXJkIDIuMSBiYXNlZCBmb3JtYXQgd2hpY2ggKHBhcnRpYWxseSkgY29uc2lkZXJzIHRoZSBjb252ZW50aW9uIGluIEphcGFuZXNlCi0gICAgICogbW9iaWxlIHBob25lcywgd2hlcmUgcGhvbmV0aWMgbmFtZXMgYXJlIHRyYW5zbGF0ZWQgdG8gaGFsZi13aWR0aCBrYXRha2FuYSBpZgotICAgICAqIHBvc3NpYmxlLCBldGMuCi0gICAgICogPC9QPgotICAgICAqIDxQPgotICAgICAqIE5vdCByZWFkeSB5ZXQuIFVzZSB3aXRoIGNhdXRpb24gd2hlbiB5b3UgdXNlIHRoaXMuCi0gICAgICogPC9QPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZDQVJEX1RZUEVfVjIxX0pBUEFORVNFX01PQklMRSA9Ci0gICAgICAgIChGTEFHX1YyMSB8IE5BTUVfT1JERVJfSkFQQU5FU0UgfCBGTEFHX0NIQVJTRVRfU0hJRlRfSklTIHwKLSAgICAgICAgICAgICAgICBGTEFHX0NPTlZFUlRfUEhPTkVUSUNfTkFNRV9TVFJJTkdTIHwKLSAgICAgICAgICAgICAgICBGTEFHX1JFRlJBSU5fUVBfVE9fTkFNRV9QUk9QRVJUSUVTKTsKLQotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIFN0cmluZyBWQ0FSRF9UWVBFX1YyMV9KQVBBTkVTRV9NT0JJTEVfU1RSID0gInYyMV9qYXBhbmVzZV9tb2JpbGUiOwotCi0gICAgLyoqCi0gICAgICogPFA+Ci0gICAgICogVkNhcmQgZm9ybWF0IHVzZWQgaW4gRG9Db01vLCB3aGljaCBpcyBvbmUgb2YgSmFwYW5lc2UgbW9iaWxlIHBob25lIGNhcmVlcnMuCi0gICAgICogPC9wPgotICAgICAqIDxQPgotICAgICAqIEJhc2UgdmVyc2lvbiBpcyB2Q2FyZCAyLjEsIGJ1dCB0aGUgZGF0YSBoYXMgc2V2ZXJhbCBEb0NvTW8tc3BlY2lmaWMgY29udmVuc2lvbnMuCi0gICAgICogTm8gQW5kcm9pZC1zcGVjaWZpYyBwcm9wZXJ0eSBub3IgZGVmYWN0IHByb3BlcnR5IGlzIGluY2x1ZGVkLiBUaGUgIlByaW1hcnkiIHByb3BlcnRpZXMKLSAgICAgKiBhcmUgTk9UIGVuY29kZWQgdG8gUXVvdGVkLVByaW50YWJsZS4KLSAgICAgKiA8L1A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVkNBUkRfVFlQRV9ET0NPTU8gPQotICAgICAgICAoVkNBUkRfVFlQRV9WMjFfSkFQQU5FU0VfTU9CSUxFIHwgRkxBR19ET0NPTU8pOwotCi0gICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgU3RyaW5nIFZDQVJEX1RZUEVfRE9DT01PX1NUUiA9ICJkb2NvbW8iOwotCi0gICAgcHVibGljIHN0YXRpYyBpbnQgVkNBUkRfVFlQRV9ERUZBVUxUID0gVkNBUkRfVFlQRV9WMjFfR0VORVJJQ19VVEY4OwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPFN0cmluZywgSW50ZWdlcj4gc1ZDYXJkVHlwZU1hcDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTZXQ8SW50ZWdlcj4gc0phcGFuZXNlTW9iaWxlVHlwZVNldDsKLSAgICAKLSAgICBzdGF0aWMgewotICAgICAgICBzVkNhcmRUeXBlTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJbnRlZ2VyPigpOwotICAgICAgICBzVkNhcmRUeXBlTWFwLnB1dChWQ0FSRF9UWVBFX1YyMV9HRU5FUklDX1VURjhfU1RSLCBWQ0FSRF9UWVBFX1YyMV9HRU5FUklDX1VURjgpOwotICAgICAgICBzVkNhcmRUeXBlTWFwLnB1dChWQ0FSRF9UWVBFX1YzMF9HRU5FUklDX1VURjhfU1RSLCBWQ0FSRF9UWVBFX1YzMF9HRU5FUklDX1VURjgpOwotICAgICAgICBzVkNhcmRUeXBlTWFwLnB1dChWQ0FSRF9UWVBFX1YyMV9FVVJPUEVfVVRGOF9TVFIsIFZDQVJEX1RZUEVfVjIxX0VVUk9QRV9VVEY4KTsKLSAgICAgICAgc1ZDYXJkVHlwZU1hcC5wdXQoVkNBUkRfVFlQRV9WMzBfRVVST1BFX1NUUiwgVkNBUkRfVFlQRV9WMzBfRVVST1BFX1VURjgpOwotICAgICAgICBzVkNhcmRUeXBlTWFwLnB1dChWQ0FSRF9UWVBFX1YyMV9KQVBBTkVTRV9TSklTX1NUUiwgVkNBUkRfVFlQRV9WMjFfSkFQQU5FU0VfU0pJUyk7Ci0gICAgICAgIHNWQ2FyZFR5cGVNYXAucHV0KFZDQVJEX1RZUEVfVjIxX0pBUEFORVNFX1VURjhfU1RSLCBWQ0FSRF9UWVBFX1YyMV9KQVBBTkVTRV9VVEY4KTsKLSAgICAgICAgc1ZDYXJkVHlwZU1hcC5wdXQoVkNBUkRfVFlQRV9WMzBfSkFQQU5FU0VfU0pJU19TVFIsIFZDQVJEX1RZUEVfVjMwX0pBUEFORVNFX1NKSVMpOwotICAgICAgICBzVkNhcmRUeXBlTWFwLnB1dChWQ0FSRF9UWVBFX1YzMF9KQVBBTkVTRV9VVEY4X1NUUiwgVkNBUkRfVFlQRV9WMzBfSkFQQU5FU0VfVVRGOCk7Ci0gICAgICAgIHNWQ2FyZFR5cGVNYXAucHV0KFZDQVJEX1RZUEVfVjIxX0pBUEFORVNFX01PQklMRV9TVFIsIFZDQVJEX1RZUEVfVjIxX0pBUEFORVNFX01PQklMRSk7Ci0gICAgICAgIHNWQ2FyZFR5cGVNYXAucHV0KFZDQVJEX1RZUEVfRE9DT01PX1NUUiwgVkNBUkRfVFlQRV9ET0NPTU8pOwotCi0gICAgICAgIHNKYXBhbmVzZU1vYmlsZVR5cGVTZXQgPSBuZXcgSGFzaFNldDxJbnRlZ2VyPigpOwotICAgICAgICBzSmFwYW5lc2VNb2JpbGVUeXBlU2V0LmFkZChWQ0FSRF9UWVBFX1YyMV9KQVBBTkVTRV9TSklTKTsKLSAgICAgICAgc0phcGFuZXNlTW9iaWxlVHlwZVNldC5hZGQoVkNBUkRfVFlQRV9WMjFfSkFQQU5FU0VfVVRGOCk7Ci0gICAgICAgIHNKYXBhbmVzZU1vYmlsZVR5cGVTZXQuYWRkKFZDQVJEX1RZUEVfVjIxX0pBUEFORVNFX1NKSVMpOwotICAgICAgICBzSmFwYW5lc2VNb2JpbGVUeXBlU2V0LmFkZChWQ0FSRF9UWVBFX1YzMF9KQVBBTkVTRV9TSklTKTsKLSAgICAgICAgc0phcGFuZXNlTW9iaWxlVHlwZVNldC5hZGQoVkNBUkRfVFlQRV9WMzBfSkFQQU5FU0VfVVRGOCk7Ci0gICAgICAgIHNKYXBhbmVzZU1vYmlsZVR5cGVTZXQuYWRkKFZDQVJEX1RZUEVfVjIxX0pBUEFORVNFX01PQklMRSk7Ci0gICAgICAgIHNKYXBhbmVzZU1vYmlsZVR5cGVTZXQuYWRkKFZDQVJEX1RZUEVfRE9DT01PKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGludCBnZXRWQ2FyZFR5cGVGcm9tU3RyaW5nKGZpbmFsIFN0cmluZyB2Y2FyZFR5cGVTdHJpbmcpIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIGxvd2VyZWRLZXkgPSB2Y2FyZFR5cGVTdHJpbmcudG9Mb3dlckNhc2UoKTsKLSAgICAgICAgaWYgKHNWQ2FyZFR5cGVNYXAuY29udGFpbnNLZXkobG93ZXJlZEtleSkpIHsKLSAgICAgICAgICAgIHJldHVybiBzVkNhcmRUeXBlTWFwLmdldChsb3dlcmVkS2V5KTsKLSAgICAgICAgfSBlbHNlIGlmICgiZGVmYXVsdCIuZXF1YWxzSWdub3JlQ2FzZSh2Y2FyZFR5cGVTdHJpbmcpKSB7Ci0gICAgICAgICAgICByZXR1cm4gVkNBUkRfVFlQRV9ERUZBVUxUOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIlVua25vd24gdkNhcmQgdHlwZSBTdHJpbmc6IFwiIiArIHZjYXJkVHlwZVN0cmluZyArICJcIiIpOwotICAgICAgICAgICAgcmV0dXJuIFZDQVJEX1RZUEVfREVGQVVMVDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1YzMChmaW5hbCBpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIHJldHVybiAoKHZjYXJkVHlwZSAmIEZMQUdfVjMwKSAhPSAwKTsgIAotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzaG91bGRVc2VRdW90ZWRQcmludGFibGUoZmluYWwgaW50IHZjYXJkVHlwZSkgewotICAgICAgICByZXR1cm4gIWlzVjMwKHZjYXJkVHlwZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIHVzZXNVdGY4KGZpbmFsIGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgcmV0dXJuICgodmNhcmRUeXBlICYgRkxBR19DSEFSU0VUX01BU0spID09IEZMQUdfQ0hBUlNFVF9VVEY4KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gdXNlc1NoaWZ0SmlzKGZpbmFsIGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgcmV0dXJuICgodmNhcmRUeXBlICYgRkxBR19DSEFSU0VUX01BU0spID09IEZMQUdfQ0hBUlNFVF9TSElGVF9KSVMpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldE5hbWVPcmRlclR5cGUoZmluYWwgaW50IHZjYXJkVHlwZSkgewotICAgICAgICByZXR1cm4gdmNhcmRUeXBlICYgTkFNRV9PUkRFUl9NQVNLOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiB1c2VzQW5kcm9pZFNwZWNpZmljUHJvcGVydHkoZmluYWwgaW50IHZjYXJkVHlwZSkgewotICAgICAgICByZXR1cm4gKCh2Y2FyZFR5cGUgJiBGTEFHX1VTRV9BTkRST0lEX1BST1BFUlRZKSAhPSAwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gdXNlc0RlZmFjdFByb3BlcnR5KGZpbmFsIGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgcmV0dXJuICgodmNhcmRUeXBlICYgRkxBR19VU0VfREVGQUNUX1BST1BFUlRZKSAhPSAwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gc2hvd1BlcmZvcm1hbmNlTG9nKCkgewotICAgICAgICByZXR1cm4gKFZDYXJkQ29uZmlnLkxPR19MRVZFTCAmIFZDYXJkQ29uZmlnLkxPR19MRVZFTF9QRVJGT1JNQU5DRV9NRUFTVVJFTUVOVCkgIT0gMDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gc2hvdWxkUmVmcmFpblFQVG9OYW1lUHJvcGVydGllcyhmaW5hbCBpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgcmV0dXJuICghc2hvdWxkVXNlUXVvdGVkUHJpbnRhYmxlKHZjYXJkVHlwZSkgfHwKLSAgICAgICAgICAgICAgICgodmNhcmRUeXBlICYgRkxBR19SRUZSQUlOX1FQX1RPX05BTUVfUFJPUEVSVElFUykgIT0gMCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBhcHBlbmRUeXBlUGFyYW1OYW1lKGZpbmFsIGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgcmV0dXJuIChpc1YzMCh2Y2FyZFR5cGUpIHx8ICgodmNhcmRUeXBlICYgRkxBR19BUFBFTkRfVFlQRV9QQVJBTSkgIT0gMCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZGV2aWNlIGlzIEphcGFuZXNlIGFuZCBzb21lIEphcGFuZXNlIGNvbnZlbnNpb24gaXMKLSAgICAgKiBhcHBsaWVkIHRvIGNyZWF0aW5nICJmb3JtYXR0ZWQiIHNvbWV0aGluZyBsaWtlIEZPUk1BVFRFRF9BRERSRVNTLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0phcGFuZXNlRGV2aWNlKGZpbmFsIGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgLy8gVE9ETzogU29tZSBtYXNrIHdpbGwgYmUgcmVxdWlyZWQgc28gdGhhdCB0aGlzIG1ldGhvZCB3cm9uZ2x5IGludGVycHJldAotICAgICAgICAvLyAgICAgICAgSmFwYW5lc2UiLWxpa2UiIHZDYXJkIHR5cGUuCi0gICAgICAgIC8vICAgICAgICBlLmcuIFZDQVJEX1RZUEVfVjIxX0pBUEFORVNFX1NKSVMgfCBGTEFHX0FQUEVORF9UWVBFX1BBUkFNUwotICAgICAgICByZXR1cm4gc0phcGFuZXNlTW9iaWxlVHlwZVNldC5jb250YWlucyh2Y2FyZFR5cGUpOwotICAgIH0KLQotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGJvb2xlYW4gcmVmcmFpblBob25lTnVtYmVyRm9ybWF0dGluZyhmaW5hbCBpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIHJldHVybiAoKHZjYXJkVHlwZSAmIEZMQUdfUkVGUkFJTl9QSE9ORV9OVU1CRVJfRk9STUFUVElORykgIT0gMCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIG5lZWRzVG9Db252ZXJ0UGhvbmV0aWNTdHJpbmcoZmluYWwgaW50IHZjYXJkVHlwZSkgewotICAgICAgICByZXR1cm4gKCh2Y2FyZFR5cGUgJiBGTEFHX0NPTlZFUlRfUEhPTkVUSUNfTkFNRV9TVFJJTkdTKSAhPSAwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gb25seU9uZU5vdGVGaWVsZElzQXZhaWxhYmxlKGZpbmFsIGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgcmV0dXJuIHZjYXJkVHlwZSA9PSBWQ0FSRF9UWVBFX0RPQ09NTzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNEb0NvTW8oZmluYWwgaW50IHZjYXJkVHlwZSkgewotICAgICAgICByZXR1cm4gKCh2Y2FyZFR5cGUgJiBGTEFHX0RPQ09NTykgIT0gMCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBWQ2FyZENvbmZpZygpIHsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRDb25zdGFudHMuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZENvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzA3MTI2Li4wMDAwMDAwCi0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZENvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZDsKLQotLyoqCi0gKiBDb25zdGFudHMgdXNlZCBpbiBib3RoIGV4cG9ydGVyIGFuZCBpbXBvcnRlciBjb2RlLgotICovCi1wdWJsaWMgY2xhc3MgVkNhcmRDb25zdGFudHMgewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZFUlNJT05fVjIxID0gIjIuMSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkVSU0lPTl9WMzAgPSAiMy4wIjsKLQotICAgIC8vIFRoZSBwcm9wZXJ0eSBuYW1lcyB2YWxpZCBib3RoIGluIHZDYXJkIDIuMSBhbmQgMy4wLgotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0JFR0lOID0gIkJFR0lOIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9WRVJTSU9OID0gIlZFUlNJT04iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX04gPSAiTiI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfRk4gPSAiRk4iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0FEUiA9ICJBRFIiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0VNQUlMID0gIkVNQUlMIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9OT1RFID0gIk5PVEUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX09SRyA9ICJPUkciOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1NPVU5EID0gIlNPVU5EIjsgIC8vIE5vdCBmdWxseSBzdXBwb3J0ZWQuCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfVEVMID0gIlRFTCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfVElUTEUgPSAiVElUTEUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1JPTEUgPSAiUk9MRSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfUEhPVE8gPSAiUEhPVE8iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0xPR08gPSAiTE9HTyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfVVJMID0gIlVSTCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfQkRBWSA9ICJCREFZIjsgIC8vIEJpcnRoZGF5Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfRU5EID0gIkVORCI7Ci0KLSAgICAvLyBWYWxpZCBwcm9wZXJ0eSBuYW1lcyBub3Qgc3VwcG9ydGVkIChub3QgYXBwcm9wcmlhdGVseSBoYW5kbGVkKSBieSBvdXIgdkNhcmQgaW1wb3J0ZXIgbm93LgotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1JFViA9ICJSRVYiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0FHRU5UID0gIkFHRU5UIjsKLQotICAgIC8vIEF2YWlsYWJsZSBpbiB2Q2FyZCAzLjAuIFNob3VkIG5vdCB1c2Ugd2hlbiBjb21wb3NpbmcgdkNhcmQgMi4xIGZpbGUuCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfTkFNRSA9ICJOQU1FIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9OSUNLTkFNRSA9ICJOSUNLTkFNRSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfU09SVF9TVFJJTkcgPSAiU09SVC1TVFJJTkciOwotICAgIAotICAgIC8vIERlLWZhY3QgcHJvcGVydHkgdmFsdWVzIGV4cHJlc3NpbmcgcGhvbmV0aWMgbmFtZXMuCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfWF9QSE9ORVRJQ19GSVJTVF9OQU1FID0gIlgtUEhPTkVUSUMtRklSU1QtTkFNRSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfWF9QSE9ORVRJQ19NSURETEVfTkFNRSA9ICJYLVBIT05FVElDLU1JRERMRS1OQU1FIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9YX1BIT05FVElDX0xBU1RfTkFNRSA9ICJYLVBIT05FVElDLUxBU1QtTkFNRSI7Ci0KLSAgICAvLyBQcm9wZXJ0aWVzIGJvdGggQ29udGFjdHNTdHJ1Y3QgaW4gRWNsYWlyIGFuZCBkZS1mYWN0IHZDYXJkIGV4dGVuc2lvbnMKLSAgICAvLyBzaG93biBpbiBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1ZDYXJkIHN1cHBvcnQgYXJlIGRlZmluZWQgaGVyZS4KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9YX0FJTSA9ICJYLUFJTSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfWF9NU04gPSAiWC1NU04iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1hfWUFIT08gPSAiWC1ZQUhPTyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfWF9JQ1EgPSAiWC1JQ1EiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1hfSkFCQkVSID0gIlgtSkFCQkVSIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9YX0dPT0dMRV9UQUxLID0gIlgtR09PR0xFLVRBTEsiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1hfU0tZUEVfVVNFUk5BTUUgPSAiWC1TS1lQRS1VU0VSTkFNRSI7Ci0gICAgLy8gUHJvcGVydGllcyBvbmx5IENvbnRhY3RzU3RydWN0IGhhcy4gV2UgYWxzZSB1c2UgdGhpcy4KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9YX1FRID0gIlgtUVEiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1hfTkVUTUVFVElORyA9ICJYLU5FVE1FRVRJTkciOwotCi0gICAgLy8gUGhvbmUgbnVtYmVyIGZvciBTa3lwZSwgYXZhaWxhYmxlIGFzIHVzdWFsIHBob25lLgotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1hfU0tZUEVfUFNUTk5VTUJFUiA9ICJYLVNLWVBFLVBTVE5OVU1CRVIiOwotCi0gICAgLy8gUHJvcGVydHkgZm9yIEFuZHJvaWQtc3BlY2lmaWMgZmllbGRzLgotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1hfQU5EUk9JRF9DVVNUT00gPSAiWC1BTkRST0lELUNVU1RPTSI7Ci0KLSAgICAvLyBQcm9wZXJ0aWVzIGZvciBEb0NvTW8gdkNhcmQuCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfWF9DTEFTUyA9ICJYLUNMQVNTIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9YX1JFRFVDVElPTiA9ICJYLVJFRFVDVElPTiI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfWF9OTyA9ICJYLU5PIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9YX0RDTV9ITU5fTU9ERSA9ICJYLURDTS1ITU4tTU9ERSI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9UWVBFID0gIlRZUEUiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fVFlQRV9IT01FID0gIkhPTUUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX1RZUEVfV09SSyA9ICJXT1JLIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9UWVBFX0ZBWCA9ICJGQVgiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX1RZUEVfQ0VMTCA9ICJDRUxMIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9UWVBFX1ZPSUNFID0gIlZPSUNFIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9UWVBFX0lOVEVSTkVUID0gIklOVEVSTkVUIjsKLQotICAgIC8vIEFiYnJldmlhdGlvbiBvZiAicHJlZmVyZWQiIGFjY29yZGluZyB0byB2Q2FyZCAyLjEgc3BlY2lmaWNhdGlvbi4KLSAgICAvLyBXZSBpbnRlcnByZXQgdGhpcyB2YWx1ZSBhcyAicHJpbWFyeSIgcHJvcGVydHkgZHVyaW5nIGltcG9ydC9leHBvcnQuCi0gICAgLy8KLSAgICAvLyBOb3RlOiBCb3RoIHZDYXJkIHNwZWNzIGRvZXMgbm90IG1lbnRpb24gYW55dGhpbmcgYWJvdXQgdGhlIHJlcXVpcmVtZW50IGZvciB0aGlzIHBhcmFtZXRlciwKLSAgICAvLyAgICAgICBidXQgdGhlcmUgbWF5IGJlIHNvbWUgdkNhcmQgaW1wb3J0ZXIgd2hpY2ggd2lsbCBnZXQgY29uZnVzZWQgd2l0aCBtb3JlIHRoYW4KLSAgICAvLyAgICAgICBvbmUgIlBSRUYicyBpbiBvbmUgcHJvcGVydHkgbmFtZSwgd2hpbGUgQW5kcm9pZCBhY2NlcHRzIHRoZW0uCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fVFlQRV9QUkVGID0gIlBSRUYiOwotCi0gICAgLy8gUGhvbmUgdHlwZSBwYXJhbWV0ZXJzIHZhbGlkIGluIHZDYXJkIGFuZCBrbm93biB0byBDb250YWN0c0NvbnRyYWN0LCBidXQgbm90IHNvIGNvbW1vbi4KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9UWVBFX0NBUiA9ICJDQVIiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX1RZUEVfSVNETiA9ICJJU0ROIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9UWVBFX1BBR0VSID0gIlBBR0VSIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9UWVBFX1RMWCA9ICJUTFgiOyAgLy8gVGVsZXgKLQotICAgIC8vIFBob25lIHR5cGVzIGV4aXN0aW5nIGluIHZDYXJkIDIuMSBidXQgbm90IGtub3duIHRvIENvbnRhY3RzQ29udHJhY3QuCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fVFlQRV9NT0RFTSA9ICJNT0RFTSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fVFlQRV9NU0cgPSAiTVNHIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9UWVBFX0JCUyA9ICJCQlMiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX1RZUEVfVklERU8gPSAiVklERU8iOwotCi0gICAgLy8gVFlQRSBwYXJhbWV0ZXJzIGZvciBQaG9uZXMsIHdoaWNoIGFyZSBub3QgZm9ybWFsbHkgdmFsaWQgaW4gdkNhcmQgKGF0IGxlYXN0IDIuMSkuCi0gICAgLy8gVGhlc2UgdHlwZXMgYXJlIGJhc2ljYWxseSBlbmNvZGVkIHRvICJYLSIgcGFyYW1ldGVycyB3aGVuIGNvbXBvc2luZyB2Q2FyZC4KLSAgICAvLyBQYXJzZXIgcGFzc2VzIHRoZXNlIHdoZW4gIlgtIiBpcyBhZGRlZCB0byB0aGUgcGFyYW1ldGVyIG9yIG5vdC4KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9QSE9ORV9FWFRSQV9UWVBFX0NBTExCQUNLID0gIkNBTExCQUNLIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9QSE9ORV9FWFRSQV9UWVBFX1JBRElPID0gIlJBRElPIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9QSE9ORV9FWFRSQV9UWVBFX1RUWV9UREQgPSAiVFRZLVRERCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fUEhPTkVfRVhUUkFfVFlQRV9BU1NJU1RBTlQgPSAiQVNTSVNUQU5UIjsKLSAgICAvLyB2Q2FyZCBjb21wb3NlciB0cmFuc2xhdGVzIHRoaXMgdHlwZSB0byAiV09SSyIgKyAiUFJFRiIuIEp1c3QgZm9yIHBhcnNpbmcuCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fUEhPTkVfRVhUUkFfVFlQRV9DT01QQU5ZX01BSU4gPSAiQ09NUEFOWS1NQUlOIjsKLSAgICAvLyB2Q2FyZCBjb21wb3NlciB0cmFuc2xhdGVzIHRoaXMgdHlwZSB0byAiVk9JQ0UiIEp1c3QgZm9yIHBhcnNpbmcuCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fUEhPTkVfRVhUUkFfVFlQRV9PVEhFUiA9ICJPVEhFUiI7Ci0KLSAgICAvLyBUWVBFIHBhcmFtZXRlcnMgZm9yIHBvc3RhbCBhZGRyZXNzZXMuCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fQURSX1RZUEVfUEFSQ0VMID0gIlBBUkNFTCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fQURSX1RZUEVfRE9NID0gIkRPTSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fQURSX1RZUEVfSU5UTCA9ICJJTlRMIjsKLQotICAgIC8vIFRZUEUgcGFyYW1ldGVycyBub3Qgb2ZmaWNpYWxseSB2YWxpZCBidXQgdXNlZCBpbiBzb21lIHZDYXJkIGV4cG9ydGVyLgotICAgIC8vIERvIG5vdCB1c2UgaW4gY29tcG9zZXIgc2lkZS4KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9FWFRSQV9UWVBFX0NPTVBBTlkgPSAiQ09NUEFOWSI7Ci0KLSAgICAvLyBEb0NvTW8gc3BlY2lmaWMgdHlwZSBwYXJhbWV0ZXIuIFVzZWQgd2l0aCAiU09VTkQiIHByb3BlcnR5LCB3aGljaCBpcyBhbHRlcm5hdGUgb2YgU09SVC1TVFJJTkcgaW4KLSAgICAvLyB2Q2FyZCAzLjAuCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fVFlQRV9YX0lSTUNfTiA9ICJYLUlSTUMtTiI7Ci0KLSAgICBwdWJsaWMgaW50ZXJmYWNlIEltcG9ydE9ubHkgewotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9YX05JQ0tOQU1FID0gIlgtTklDS05BTUUiOwotICAgICAgICAvLyBTb21lIGRldmljZSBlbWl0cyB0aGlzICJYLSIgcGFyYW1ldGVyIGZvciBleHByZXNzaW5nIEdvb2dsZSBUYWxrLAotICAgICAgICAvLyB3aGljaCBpcyBzcGVjaWZpY2FsbHkgaW52YWxpZCBidXQgc2hvdWxkIGJlIGFsd2F5cyBwcm9wZXJseSBhY2NlcHRlZCwgYW5kIGVtaXR0ZWQKLSAgICAgICAgLy8gaW4gc29tZSBzcGVjaWFsIGNhc2UgKGZvciB0aGF0IGRldmljZS9hcHBsaWNhdGlvbikuCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1hfR09PR0xFX1RBTEtfV0lUSF9TUEFDRSA9ICJYLUdPT0dMRSBUQUxLIjsKLSAgICB9Ci0KLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBpbnQgTUFYX0RBVEFfQ09MVU1OID0gMTU7Ci0KLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBpbnQgTUFYX0NIQVJBQ1RFUl9OVU1TX1FQID0gNzY7Ci0gICAgc3RhdGljIGZpbmFsIGludCBNQVhfQ0hBUkFDVEVSX05VTVNfQkFTRTY0X1YzMCA9IDc1OwotCi0gICAgcHJpdmF0ZSBWQ2FyZENvbnN0YW50cygpIHsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkRW50cnkuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZEVudHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3ZDNmYmMuLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkRW50cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NDkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkOwotCi1pbXBvcnQgYW5kcm9pZC5hY2NvdW50cy5BY2NvdW50OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UHJvdmlkZXJPcGVyYXRpb247Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRQcm92aWRlclJlc3VsdDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5PcGVyYXRpb25BcHBsaWNhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcjsKLWltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7Ci1pbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0OwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db250YWN0czsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuRGF0YTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuR3JvdXBzOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5SYXdDb250YWN0czsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLkVtYWlsOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuRXZlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5Hcm91cE1lbWJlcnNoaXA7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5JbTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLk5pY2tuYW1lOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuTm90ZTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLk9yZ2FuaXphdGlvbjsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLlBob25lOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuUGhvdG87Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5TdHJ1Y3R1cmVkTmFtZTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLlN0cnVjdHVyZWRQb3N0YWw7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5XZWJzaXRlOwotaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlBob25lTnVtYmVyVXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgYnJpZGdlcyBiZXR3ZWVuIGRhdGEgc3RydWN0dXJlIG9mIENvbnRhY3QgYXBwIGFuZCBWQ2FyZCBkYXRhLgotICovCi1wdWJsaWMgY2xhc3MgVkNhcmRFbnRyeSB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiVkNhcmRFbnRyeSI7Ci0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgREVGQVVMVF9PUkdBTklaQVRJT05fVFlQRSA9IE9yZ2FuaXphdGlvbi5UWVBFX1dPUks7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNDT1VOVF9UWVBFX0dPT0dMRSA9ICJjb20uZ29vZ2xlIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgR09PR0xFX01ZX0NPTlRBQ1RTX0dST1VQID0gIlN5c3RlbSBHcm91cDogTXkgQ29udGFjdHMiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPFN0cmluZywgSW50ZWdlcj4gc0ltTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJbnRlZ2VyPigpOwotCi0gICAgc3RhdGljIHsKLSAgICAgICAgc0ltTWFwLnB1dChWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9YX0FJTSwgSW0uUFJPVE9DT0xfQUlNKTsKLSAgICAgICAgc0ltTWFwLnB1dChWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9YX01TTiwgSW0uUFJPVE9DT0xfTVNOKTsKLSAgICAgICAgc0ltTWFwLnB1dChWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9YX1lBSE9PLCBJbS5QUk9UT0NPTF9ZQUhPTyk7Ci0gICAgICAgIHNJbU1hcC5wdXQoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfWF9JQ1EsIEltLlBST1RPQ09MX0lDUSk7Ci0gICAgICAgIHNJbU1hcC5wdXQoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfWF9KQUJCRVIsIEltLlBST1RPQ09MX0pBQkJFUik7Ci0gICAgICAgIHNJbU1hcC5wdXQoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfWF9TS1lQRV9VU0VSTkFNRSwgSW0uUFJPVE9DT0xfU0tZUEUpOwotICAgICAgICBzSW1NYXAucHV0KFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1hfR09PR0xFX1RBTEssIEltLlBST1RPQ09MX0dPT0dMRV9UQUxLKTsKLSAgICAgICAgc0ltTWFwLnB1dChWQ2FyZENvbnN0YW50cy5JbXBvcnRPbmx5LlBST1BFUlRZX1hfR09PR0xFX1RBTEtfV0lUSF9TUEFDRSwKLSAgICAgICAgICAgICAgICBJbS5QUk9UT0NPTF9HT09HTEVfVEFMSyk7Ci0gICAgfQotCi0gICAgc3RhdGljIHB1YmxpYyBjbGFzcyBQaG9uZURhdGEgewotICAgICAgICBwdWJsaWMgZmluYWwgaW50IHR5cGU7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZGF0YTsKLSAgICAgICAgcHVibGljIGZpbmFsIFN0cmluZyBsYWJlbDsKLSAgICAgICAgLy8gaXNQcmltYXJ5IGlzIGNoYW5nYWJsZSBvbmx5IHdoZW4gdGhlcmUncyBubyBhcHByb3ByaWF0ZSBvbmUgZXhpc3RpbmcgaW4KLSAgICAgICAgLy8gdGhlIG9yaWdpbmFsIFZDYXJkLgotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1ByaW1hcnk7Ci0gICAgICAgIHB1YmxpYyBQaG9uZURhdGEoaW50IHR5cGUsIFN0cmluZyBkYXRhLCBTdHJpbmcgbGFiZWwsIGJvb2xlYW4gaXNQcmltYXJ5KSB7Ci0gICAgICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOwotICAgICAgICAgICAgdGhpcy5kYXRhID0gZGF0YTsKLSAgICAgICAgICAgIHRoaXMubGFiZWwgPSBsYWJlbDsKLSAgICAgICAgICAgIHRoaXMuaXNQcmltYXJ5ID0gaXNQcmltYXJ5OwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0gICAgICAgICAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBQaG9uZURhdGEpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgUGhvbmVEYXRhIHBob25lRGF0YSA9IChQaG9uZURhdGEpb2JqOwotICAgICAgICAgICAgcmV0dXJuICh0eXBlID09IHBob25lRGF0YS50eXBlICYmIGRhdGEuZXF1YWxzKHBob25lRGF0YS5kYXRhKSAmJgotICAgICAgICAgICAgICAgICAgICBsYWJlbC5lcXVhbHMocGhvbmVEYXRhLmxhYmVsKSAmJiBpc1ByaW1hcnkgPT0gcGhvbmVEYXRhLmlzUHJpbWFyeSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCJ0eXBlOiAlZCwgZGF0YTogJXMsIGxhYmVsOiAlcywgaXNQcmltYXJ5OiAlcyIsCi0gICAgICAgICAgICAgICAgICAgIHR5cGUsIGRhdGEsIGxhYmVsLCBpc1ByaW1hcnkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdGljIHB1YmxpYyBjbGFzcyBFbWFpbERhdGEgewotICAgICAgICBwdWJsaWMgZmluYWwgaW50IHR5cGU7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZGF0YTsKLSAgICAgICAgLy8gVXNlZCBvbmx5IHdoZW4gVFlQRSBpcyBUWVBFX0NVU1RPTS4KLSAgICAgICAgcHVibGljIGZpbmFsIFN0cmluZyBsYWJlbDsKLSAgICAgICAgLy8gaXNQcmltYXJ5IGlzIGNoYW5nYWJsZSBvbmx5IHdoZW4gdGhlcmUncyBubyBhcHByb3ByaWF0ZSBvbmUgZXhpc3RpbmcgaW4KLSAgICAgICAgLy8gdGhlIG9yaWdpbmFsIFZDYXJkLgotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1ByaW1hcnk7Ci0gICAgICAgIHB1YmxpYyBFbWFpbERhdGEoaW50IHR5cGUsIFN0cmluZyBkYXRhLCBTdHJpbmcgbGFiZWwsIGJvb2xlYW4gaXNQcmltYXJ5KSB7Ci0gICAgICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOwotICAgICAgICAgICAgdGhpcy5kYXRhID0gZGF0YTsKLSAgICAgICAgICAgIHRoaXMubGFiZWwgPSBsYWJlbDsKLSAgICAgICAgICAgIHRoaXMuaXNQcmltYXJ5ID0gaXNQcmltYXJ5OwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0gICAgICAgICAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBFbWFpbERhdGEpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgRW1haWxEYXRhIGVtYWlsRGF0YSA9IChFbWFpbERhdGEpb2JqOwotICAgICAgICAgICAgcmV0dXJuICh0eXBlID09IGVtYWlsRGF0YS50eXBlICYmIGRhdGEuZXF1YWxzKGVtYWlsRGF0YS5kYXRhKSAmJgotICAgICAgICAgICAgICAgICAgICBsYWJlbC5lcXVhbHMoZW1haWxEYXRhLmxhYmVsKSAmJiBpc1ByaW1hcnkgPT0gZW1haWxEYXRhLmlzUHJpbWFyeSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCJ0eXBlOiAlZCwgZGF0YTogJXMsIGxhYmVsOiAlcywgaXNQcmltYXJ5OiAlcyIsCi0gICAgICAgICAgICAgICAgICAgIHR5cGUsIGRhdGEsIGxhYmVsLCBpc1ByaW1hcnkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdGljIHB1YmxpYyBjbGFzcyBQb3N0YWxEYXRhIHsKLSAgICAgICAgLy8gRGV0ZXJtaW5lZCBieSB2Q2FyZCBzcGVjLgotICAgICAgICAvLyBQTyBCb3gsIEV4dGVuZGVkIEFkZHIsIFN0cmVldCwgTG9jYWxpdHksIFJlZ2lvbiwgUG9zdGFsIENvZGUsIENvdW50cnkgTmFtZQotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBRERSX01BWF9EQVRBX1NJWkUgPSA3OwotICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZ1tdIGRhdGFBcnJheTsKLSAgICAgICAgcHVibGljIGZpbmFsIFN0cmluZyBwb2JveDsKLSAgICAgICAgcHVibGljIGZpbmFsIFN0cmluZyBleHRlbmRlZEFkZHJlc3M7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgc3RyZWV0OwotICAgICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGxvY2FsdHk7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgcmVnaW9uOwotICAgICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIHBvc3RhbENvZGU7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgY291bnRyeTsKLSAgICAgICAgcHVibGljIGZpbmFsIGludCB0eXBlOwotICAgICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGxhYmVsOwotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1ByaW1hcnk7Ci0KLSAgICAgICAgcHVibGljIFBvc3RhbERhdGEoZmluYWwgaW50IHR5cGUsIGZpbmFsIExpc3Q8U3RyaW5nPiBwcm9wVmFsdWVMaXN0LAotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBsYWJlbCwgYm9vbGVhbiBpc1ByaW1hcnkpIHsKLSAgICAgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7Ci0gICAgICAgICAgICBkYXRhQXJyYXkgPSBuZXcgU3RyaW5nW0FERFJfTUFYX0RBVEFfU0laRV07Ci0KLSAgICAgICAgICAgIGludCBzaXplID0gcHJvcFZhbHVlTGlzdC5zaXplKCk7Ci0gICAgICAgICAgICBpZiAoc2l6ZSA+IEFERFJfTUFYX0RBVEFfU0laRSkgewotICAgICAgICAgICAgICAgIHNpemUgPSBBRERSX01BWF9EQVRBX1NJWkU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGFkci12YWx1ZSA9IDAqNih0ZXh0LXZhbHVlICI7IikgdGV4dC12YWx1ZQotICAgICAgICAgICAgLy8gICAgICAgICAgIDsgUE8gQm94LCBFeHRlbmRlZCBBZGRyZXNzLCBTdHJlZXQsIExvY2FsaXR5LCBSZWdpb24sIFBvc3RhbAotICAgICAgICAgICAgLy8gICAgICAgICAgIDsgQ29kZSwgQ291bnRyeSBOYW1lCi0gICAgICAgICAgICAvLwotICAgICAgICAgICAgLy8gVXNlIEl0ZXJhdG9yIGFzc3VtaW5nIExpc3QgbWF5IGJlIExpbmtlZExpc3QsIHRob3VnaCBhY3R1YWxseSBpdCBpcwotICAgICAgICAgICAgLy8gYWx3YXlzIEFycmF5TGlzdCBpbiB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbi4KLSAgICAgICAgICAgIGludCBpID0gMDsKLSAgICAgICAgICAgIGZvciAoU3RyaW5nIGFkZHJlc3NFbGVtZW50IDogcHJvcFZhbHVlTGlzdCkgewotICAgICAgICAgICAgICAgIGRhdGFBcnJheVtpXSA9IGFkZHJlc3NFbGVtZW50OwotICAgICAgICAgICAgICAgIGlmICgrK2kgPj0gc2l6ZSkgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB3aGlsZSAoaSA8IEFERFJfTUFYX0RBVEFfU0laRSkgewotICAgICAgICAgICAgICAgIGRhdGFBcnJheVtpKytdID0gbnVsbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdGhpcy5wb2JveCA9IGRhdGFBcnJheVswXTsKLSAgICAgICAgICAgIHRoaXMuZXh0ZW5kZWRBZGRyZXNzID0gZGF0YUFycmF5WzFdOwotICAgICAgICAgICAgdGhpcy5zdHJlZXQgPSBkYXRhQXJyYXlbMl07Ci0gICAgICAgICAgICB0aGlzLmxvY2FsdHkgPSBkYXRhQXJyYXlbM107Ci0gICAgICAgICAgICB0aGlzLnJlZ2lvbiA9IGRhdGFBcnJheVs0XTsKLSAgICAgICAgICAgIHRoaXMucG9zdGFsQ29kZSA9IGRhdGFBcnJheVs1XTsKLSAgICAgICAgICAgIHRoaXMuY291bnRyeSA9IGRhdGFBcnJheVs2XTsKLSAgICAgICAgICAgIHRoaXMubGFiZWwgPSBsYWJlbDsKLSAgICAgICAgICAgIHRoaXMuaXNQcmltYXJ5ID0gaXNQcmltYXJ5OwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0gICAgICAgICAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBQb3N0YWxEYXRhKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbmFsIFBvc3RhbERhdGEgcG9zdGFsRGF0YSA9IChQb3N0YWxEYXRhKW9iajsKLSAgICAgICAgICAgIHJldHVybiAoQXJyYXlzLmVxdWFscyhkYXRhQXJyYXksIHBvc3RhbERhdGEuZGF0YUFycmF5KSAmJgotICAgICAgICAgICAgICAgICAgICAodHlwZSA9PSBwb3N0YWxEYXRhLnR5cGUgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAodHlwZSA9PSBTdHJ1Y3R1cmVkUG9zdGFsLlRZUEVfQ1VTVE9NID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsYWJlbCA9PSBwb3N0YWxEYXRhLmxhYmVsKSA6IHRydWUpKSAmJgotICAgICAgICAgICAgICAgICAgICAoaXNQcmltYXJ5ID09IHBvc3RhbERhdGEuaXNQcmltYXJ5KSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEZvcm1hdHRlZEFkZHJlc3MoZmluYWwgaW50IHZjYXJkVHlwZSkgewotICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgIGJvb2xlYW4gZW1wdHkgPSB0cnVlOwotICAgICAgICAgICAgaWYgKFZDYXJkQ29uZmlnLmlzSmFwYW5lc2VEZXZpY2UodmNhcmRUeXBlKSkgewotICAgICAgICAgICAgICAgIC8vIEluIEphcGFuLCB0aGUgb3JkZXIgaXMgcmV2ZXJzZWQuCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IEFERFJfTUFYX0RBVEFfU0laRSAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBhZGRyZXNzUGFydCA9IGRhdGFBcnJheVtpXTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShhZGRyZXNzUGFydCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZW1wdHkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgnICcpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXB0eSA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoYWRkcmVzc1BhcnQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IEFERFJfTUFYX0RBVEFfU0laRTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBhZGRyZXNzUGFydCA9IGRhdGFBcnJheVtpXTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShhZGRyZXNzUGFydCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZW1wdHkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgnICcpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXB0eSA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoYWRkcmVzc1BhcnQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gYnVpbGRlci50b1N0cmluZygpLnRyaW0oKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoInR5cGU6ICVkLCBsYWJlbDogJXMsIGlzUHJpbWFyeTogJXMiLAotICAgICAgICAgICAgICAgICAgICB0eXBlLCBsYWJlbCwgaXNQcmltYXJ5KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHN0YXRpYyBwdWJsaWMgY2xhc3MgT3JnYW5pemF0aW9uRGF0YSB7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBpbnQgdHlwZTsKLSAgICAgICAgLy8gbm9uLWZpbmFsIGlzIEludGVudGlvbmFsOiB3ZSBtYXkgY2hhbmdlIHRoZSB2YWx1ZXMgc2luY2UgdGhpcyBpbmZvIGlzIHNlcGFyYXRlZCBpbnRvCi0gICAgICAgIC8vIHR3byBwYXJ0cyBpbiB2Q2FyZDogIk9SRyIgKyAiVElUTEUiLgotICAgICAgICBwdWJsaWMgU3RyaW5nIGNvbXBhbnlOYW1lOwotICAgICAgICBwdWJsaWMgU3RyaW5nIGRlcGFydG1lbnROYW1lOwotICAgICAgICBwdWJsaWMgU3RyaW5nIHRpdGxlTmFtZTsKLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNQcmltYXJ5OwotCi0gICAgICAgIHB1YmxpYyBPcmdhbml6YXRpb25EYXRhKGludCB0eXBlLAotICAgICAgICAgICAgICAgIFN0cmluZyBjb21wYW55TmFtZSwKLSAgICAgICAgICAgICAgICBTdHJpbmcgZGVwYXJ0bWVudE5hbWUsCi0gICAgICAgICAgICAgICAgU3RyaW5nIHRpdGxlTmFtZSwKLSAgICAgICAgICAgICAgICBib29sZWFuIGlzUHJpbWFyeSkgewotICAgICAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKLSAgICAgICAgICAgIHRoaXMuY29tcGFueU5hbWUgPSBjb21wYW55TmFtZTsKLSAgICAgICAgICAgIHRoaXMuZGVwYXJ0bWVudE5hbWUgPSBkZXBhcnRtZW50TmFtZTsKLSAgICAgICAgICAgIHRoaXMudGl0bGVOYW1lID0gdGl0bGVOYW1lOwotICAgICAgICAgICAgdGhpcy5pc1ByaW1hcnkgPSBpc1ByaW1hcnk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLSAgICAgICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIE9yZ2FuaXphdGlvbkRhdGEpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgT3JnYW5pemF0aW9uRGF0YSBvcmdhbml6YXRpb24gPSAoT3JnYW5pemF0aW9uRGF0YSlvYmo7Ci0gICAgICAgICAgICByZXR1cm4gKHR5cGUgPT0gb3JnYW5pemF0aW9uLnR5cGUgJiYKLSAgICAgICAgICAgICAgICAgICAgVGV4dFV0aWxzLmVxdWFscyhjb21wYW55TmFtZSwgb3JnYW5pemF0aW9uLmNvbXBhbnlOYW1lKSAmJgotICAgICAgICAgICAgICAgICAgICBUZXh0VXRpbHMuZXF1YWxzKGRlcGFydG1lbnROYW1lLCBvcmdhbml6YXRpb24uZGVwYXJ0bWVudE5hbWUpICYmCi0gICAgICAgICAgICAgICAgICAgIFRleHRVdGlscy5lcXVhbHModGl0bGVOYW1lLCBvcmdhbml6YXRpb24udGl0bGVOYW1lKSAmJgotICAgICAgICAgICAgICAgICAgICBpc1ByaW1hcnkgPT0gb3JnYW5pemF0aW9uLmlzUHJpbWFyeSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEZvcm1hdHRlZFN0cmluZygpIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KGNvbXBhbnlOYW1lKSkgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGNvbXBhbnlOYW1lKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShkZXBhcnRtZW50TmFtZSkpIHsKLSAgICAgICAgICAgICAgICBpZiAoYnVpbGRlci5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIiwgIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGRlcGFydG1lbnROYW1lKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eSh0aXRsZU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGJ1aWxkZXIubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCIsICIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCh0aXRsZU5hbWUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gYnVpbGRlci50b1N0cmluZygpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgInR5cGU6ICVkLCBjb21wYW55OiAlcywgZGVwYXJ0bWVudDogJXMsIHRpdGxlOiAlcywgaXNQcmltYXJ5OiAlcyIsCi0gICAgICAgICAgICAgICAgICAgIHR5cGUsIGNvbXBhbnlOYW1lLCBkZXBhcnRtZW50TmFtZSwgdGl0bGVOYW1lLCBpc1ByaW1hcnkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdGljIHB1YmxpYyBjbGFzcyBJbURhdGEgewotICAgICAgICBwdWJsaWMgZmluYWwgaW50IHByb3RvY29sOwotICAgICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGN1c3RvbVByb3RvY29sOwotICAgICAgICBwdWJsaWMgZmluYWwgaW50IHR5cGU7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZGF0YTsKLSAgICAgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gaXNQcmltYXJ5OwotCi0gICAgICAgIHB1YmxpYyBJbURhdGEoZmluYWwgaW50IHByb3RvY29sLCBmaW5hbCBTdHJpbmcgY3VzdG9tUHJvdG9jb2wsIGZpbmFsIGludCB0eXBlLAotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBkYXRhLCBmaW5hbCBib29sZWFuIGlzUHJpbWFyeSkgewotICAgICAgICAgICAgdGhpcy5wcm90b2NvbCA9IHByb3RvY29sOwotICAgICAgICAgICAgdGhpcy5jdXN0b21Qcm90b2NvbCA9IGN1c3RvbVByb3RvY29sOwotICAgICAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKLSAgICAgICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7Ci0gICAgICAgICAgICB0aGlzLmlzUHJpbWFyeSA9IGlzUHJpbWFyeTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotICAgICAgICAgICAgaWYgKCEob2JqIGluc3RhbmNlb2YgSW1EYXRhKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEltRGF0YSBpbURhdGEgPSAoSW1EYXRhKW9iajsKLSAgICAgICAgICAgIHJldHVybiAodHlwZSA9PSBpbURhdGEudHlwZSAmJiBwcm90b2NvbCA9PSBpbURhdGEucHJvdG9jb2wKLSAgICAgICAgICAgICAgICAgICAgJiYgKGN1c3RvbVByb3RvY29sICE9IG51bGwgPyBjdXN0b21Qcm90b2NvbC5lcXVhbHMoaW1EYXRhLmN1c3RvbVByb3RvY29sKSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAoaW1EYXRhLmN1c3RvbVByb3RvY29sID09IG51bGwpKQotICAgICAgICAgICAgICAgICAgICAmJiAoZGF0YSAhPSBudWxsID8gZGF0YS5lcXVhbHMoaW1EYXRhLmRhdGEpIDogKGltRGF0YS5kYXRhID09IG51bGwpKQotICAgICAgICAgICAgICAgICAgICAmJiBpc1ByaW1hcnkgPT0gaW1EYXRhLmlzUHJpbWFyeSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KAotICAgICAgICAgICAgICAgICAgICAidHlwZTogJWQsIHByb3RvY29sOiAlZCwgY3VzdG9tX3Byb3Rjb2w6ICVzLCBkYXRhOiAlcywgaXNQcmltYXJ5OiAlcyIsCi0gICAgICAgICAgICAgICAgICAgIHR5cGUsIHByb3RvY29sLCBjdXN0b21Qcm90b2NvbCwgZGF0YSwgaXNQcmltYXJ5KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUGhvdG9EYXRhIHsKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STUFUX0ZMQVNIID0gIlNXRiI7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBpbnQgdHlwZTsKLSAgICAgICAgcHVibGljIGZpbmFsIFN0cmluZyBmb3JtYXROYW1lOyAgLy8gdXNlZCB3aGVuIHR5cGUgaXMgbm90IGRlZmluZWQgaW4gQ29udGFjdHNDb250cmFjdC4KLSAgICAgICAgcHVibGljIGZpbmFsIGJ5dGVbXSBwaG90b0J5dGVzOwotICAgICAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc1ByaW1hcnk7Ci0KLSAgICAgICAgcHVibGljIFBob3RvRGF0YShpbnQgdHlwZSwgU3RyaW5nIGZvcm1hdE5hbWUsIGJ5dGVbXSBwaG90b0J5dGVzLCBib29sZWFuIGlzUHJpbWFyeSkgewotICAgICAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKLSAgICAgICAgICAgIHRoaXMuZm9ybWF0TmFtZSA9IGZvcm1hdE5hbWU7Ci0gICAgICAgICAgICB0aGlzLnBob3RvQnl0ZXMgPSBwaG90b0J5dGVzOwotICAgICAgICAgICAgdGhpcy5pc1ByaW1hcnkgPSBpc1ByaW1hcnk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLSAgICAgICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIFBob3RvRGF0YSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBQaG90b0RhdGEgcGhvdG9EYXRhID0gKFBob3RvRGF0YSlvYmo7Ci0gICAgICAgICAgICByZXR1cm4gKHR5cGUgPT0gcGhvdG9EYXRhLnR5cGUgJiYKLSAgICAgICAgICAgICAgICAgICAgKGZvcm1hdE5hbWUgPT0gbnVsbCA/IChwaG90b0RhdGEuZm9ybWF0TmFtZSA9PSBudWxsKSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0TmFtZS5lcXVhbHMocGhvdG9EYXRhLmZvcm1hdE5hbWUpKSAmJgotICAgICAgICAgICAgICAgICAgICAoQXJyYXlzLmVxdWFscyhwaG90b0J5dGVzLCBwaG90b0RhdGEucGhvdG9CeXRlcykpICYmCi0gICAgICAgICAgICAgICAgICAgIChpc1ByaW1hcnkgPT0gcGhvdG9EYXRhLmlzUHJpbWFyeSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgidHlwZTogJWQsIGZvcm1hdDogJXM6IHNpemU6ICVkLCBpc1ByaW1hcnk6ICVzIiwKLSAgICAgICAgICAgICAgICAgICAgdHlwZSwgZm9ybWF0TmFtZSwgcGhvdG9CeXRlcy5sZW5ndGgsIGlzUHJpbWFyeSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBjbGFzcyBQcm9wZXJ0eSB7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nIG1Qcm9wZXJ0eU5hbWU7Ci0gICAgICAgIHByaXZhdGUgTWFwPFN0cmluZywgQ29sbGVjdGlvbjxTdHJpbmc+PiBtUGFyYW1ldGVyTWFwID0KLSAgICAgICAgICAgIG5ldyBIYXNoTWFwPFN0cmluZywgQ29sbGVjdGlvbjxTdHJpbmc+PigpOwotICAgICAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBtUHJvcGVydHlWYWx1ZUxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgcHJpdmF0ZSBieXRlW10gbVByb3BlcnR5Qnl0ZXM7Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHlOYW1lKGZpbmFsIFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLSAgICAgICAgICAgIG1Qcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eU5hbWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBhZGRQYXJhbWV0ZXIoZmluYWwgU3RyaW5nIHBhcmFtTmFtZSwgZmluYWwgU3RyaW5nIHBhcmFtVmFsdWUpIHsKLSAgICAgICAgICAgIENvbGxlY3Rpb248U3RyaW5nPiB2YWx1ZXM7Ci0gICAgICAgICAgICBpZiAoIW1QYXJhbWV0ZXJNYXAuY29udGFpbnNLZXkocGFyYW1OYW1lKSkgewotICAgICAgICAgICAgICAgIGlmIChwYXJhbU5hbWUuZXF1YWxzKCJUWVBFIikpIHsKLSAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtUGFyYW1ldGVyTWFwLnB1dChwYXJhbU5hbWUsIHZhbHVlcyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHZhbHVlcyA9IG1QYXJhbWV0ZXJNYXAuZ2V0KHBhcmFtTmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB2YWx1ZXMuYWRkKHBhcmFtVmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgYWRkVG9Qcm9wZXJ0eVZhbHVlTGlzdChmaW5hbCBTdHJpbmcgcHJvcGVydHlWYWx1ZSkgewotICAgICAgICAgICAgbVByb3BlcnR5VmFsdWVMaXN0LmFkZChwcm9wZXJ0eVZhbHVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5Qnl0ZXMoZmluYWwgYnl0ZVtdIHByb3BlcnR5Qnl0ZXMpIHsKLSAgICAgICAgICAgIG1Qcm9wZXJ0eUJ5dGVzID0gcHJvcGVydHlCeXRlczsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBmaW5hbCBDb2xsZWN0aW9uPFN0cmluZz4gZ2V0UGFyYW1ldGVycyhTdHJpbmcgdHlwZSkgewotICAgICAgICAgICAgcmV0dXJuIG1QYXJhbWV0ZXJNYXAuZ2V0KHR5cGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGZpbmFsIExpc3Q8U3RyaW5nPiBnZXRQcm9wZXJ0eVZhbHVlTGlzdCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtUHJvcGVydHlWYWx1ZUxpc3Q7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKLSAgICAgICAgICAgIG1Qcm9wZXJ0eU5hbWUgPSBudWxsOwotICAgICAgICAgICAgbVBhcmFtZXRlck1hcC5jbGVhcigpOwotICAgICAgICAgICAgbVByb3BlcnR5VmFsdWVMaXN0LmNsZWFyKCk7Ci0gICAgICAgICAgICBtUHJvcGVydHlCeXRlcyA9IG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBtRmFtaWx5TmFtZTsKLSAgICBwcml2YXRlIFN0cmluZyBtR2l2ZW5OYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIG1NaWRkbGVOYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIG1QcmVmaXg7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbVN1ZmZpeDsKLQotICAgIC8vIFVzZWQgb25seSB3aGVuIG5vIGZhbWlseSBub3IgZ2l2ZW4gbmFtZSBpcyBmb3VuZC4KLSAgICBwcml2YXRlIFN0cmluZyBtRnVsbE5hbWU7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBtUGhvbmV0aWNGYW1pbHlOYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIG1QaG9uZXRpY0dpdmVuTmFtZTsKLSAgICBwcml2YXRlIFN0cmluZyBtUGhvbmV0aWNNaWRkbGVOYW1lOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgbVBob25ldGljRnVsbE5hbWU7Ci0KLSAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBtTmlja05hbWVMaXN0OwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgbURpc3BsYXlOYW1lOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgbUJpcnRoZGF5OwotCi0gICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gbU5vdGVMaXN0OwotICAgIHByaXZhdGUgTGlzdDxQaG9uZURhdGE+IG1QaG9uZUxpc3Q7Ci0gICAgcHJpdmF0ZSBMaXN0PEVtYWlsRGF0YT4gbUVtYWlsTGlzdDsKLSAgICBwcml2YXRlIExpc3Q8UG9zdGFsRGF0YT4gbVBvc3RhbExpc3Q7Ci0gICAgcHJpdmF0ZSBMaXN0PE9yZ2FuaXphdGlvbkRhdGE+IG1Pcmdhbml6YXRpb25MaXN0OwotICAgIHByaXZhdGUgTGlzdDxJbURhdGE+IG1JbUxpc3Q7Ci0gICAgcHJpdmF0ZSBMaXN0PFBob3RvRGF0YT4gbVBob3RvTGlzdDsKLSAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBtV2Vic2l0ZUxpc3Q7Ci0gICAgcHJpdmF0ZSBMaXN0PExpc3Q8U3RyaW5nPj4gbUFuZHJvaWRDdXN0b21Qcm9wZXJ0eUxpc3Q7Ci0KLSAgICBwcml2YXRlIGZpbmFsIGludCBtVkNhcmRUeXBlOwotICAgIHByaXZhdGUgZmluYWwgQWNjb3VudCBtQWNjb3VudDsKLQotICAgIHB1YmxpYyBWQ2FyZEVudHJ5KCkgewotICAgICAgICB0aGlzKFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfVjIxX0dFTkVSSUNfVVRGOCk7Ci0gICAgfQotCi0gICAgcHVibGljIFZDYXJkRW50cnkoaW50IHZjYXJkVHlwZSkgewotICAgICAgICB0aGlzKHZjYXJkVHlwZSwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIFZDYXJkRW50cnkoaW50IHZjYXJkVHlwZSwgQWNjb3VudCBhY2NvdW50KSB7Ci0gICAgICAgIG1WQ2FyZFR5cGUgPSB2Y2FyZFR5cGU7Ci0gICAgICAgIG1BY2NvdW50ID0gYWNjb3VudDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYWRkUGhvbmUoaW50IHR5cGUsIFN0cmluZyBkYXRhLCBTdHJpbmcgbGFiZWwsIGJvb2xlYW4gaXNQcmltYXJ5KSB7Ci0gICAgICAgIGlmIChtUGhvbmVMaXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIG1QaG9uZUxpc3QgPSBuZXcgQXJyYXlMaXN0PFBob25lRGF0YT4oKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICBmaW5hbCBTdHJpbmcgdHJpbWVkID0gZGF0YS50cmltKCk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBmb3JtYXR0ZWROdW1iZXI7Ci0gICAgICAgIGlmICh0eXBlID09IFBob25lLlRZUEVfUEFHRVIgfHwgVkNhcmRDb25maWcucmVmcmFpblBob25lTnVtYmVyRm9ybWF0dGluZyhtVkNhcmRUeXBlKSkgewotICAgICAgICAgICAgZm9ybWF0dGVkTnVtYmVyID0gdHJpbWVkOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZmluYWwgaW50IGxlbmd0aCA9IHRyaW1lZC5sZW5ndGgoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBjaGFyIGNoID0gdHJpbWVkLmNoYXJBdChpKTsKLSAgICAgICAgICAgICAgICBpZiAoKCcwJyA8PSBjaCAmJiBjaCA8PSAnOScpIHx8IChpID09IDAgJiYgY2ggPT0gJysnKSkgewotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChjaCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBVc2UgTkFOUCBpbiBkZWZhdWx0IHdoZW4gdGhlcmUncyBubyBpbmZvcm1hdGlvbiBhYm91dCBsb2NhbGUuCi0gICAgICAgICAgICBmaW5hbCBpbnQgZm9ybWF0dGluZ1R5cGUgPSBWQ2FyZFV0aWxzLmdldFBob25lTnVtYmVyRm9ybWF0KG1WQ2FyZFR5cGUpOwotICAgICAgICAgICAgZm9ybWF0dGVkTnVtYmVyID0gUGhvbmVOdW1iZXJVdGlscy5mb3JtYXROdW1iZXIoYnVpbGRlci50b1N0cmluZygpLCBmb3JtYXR0aW5nVHlwZSk7Ci0gICAgICAgIH0KLSAgICAgICAgUGhvbmVEYXRhIHBob25lRGF0YSA9IG5ldyBQaG9uZURhdGEodHlwZSwgZm9ybWF0dGVkTnVtYmVyLCBsYWJlbCwgaXNQcmltYXJ5KTsKLSAgICAgICAgbVBob25lTGlzdC5hZGQocGhvbmVEYXRhKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYWRkTmlja05hbWUoZmluYWwgU3RyaW5nIG5pY2tOYW1lKSB7Ci0gICAgICAgIGlmIChtTmlja05hbWVMaXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIG1OaWNrTmFtZUxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgfQotICAgICAgICBtTmlja05hbWVMaXN0LmFkZChuaWNrTmFtZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFkZEVtYWlsKGludCB0eXBlLCBTdHJpbmcgZGF0YSwgU3RyaW5nIGxhYmVsLCBib29sZWFuIGlzUHJpbWFyeSl7Ci0gICAgICAgIGlmIChtRW1haWxMaXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIG1FbWFpbExpc3QgPSBuZXcgQXJyYXlMaXN0PEVtYWlsRGF0YT4oKTsKLSAgICAgICAgfQotICAgICAgICBtRW1haWxMaXN0LmFkZChuZXcgRW1haWxEYXRhKHR5cGUsIGRhdGEsIGxhYmVsLCBpc1ByaW1hcnkpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYWRkUG9zdGFsKGludCB0eXBlLCBMaXN0PFN0cmluZz4gcHJvcFZhbHVlTGlzdCwgU3RyaW5nIGxhYmVsLCBib29sZWFuIGlzUHJpbWFyeSl7Ci0gICAgICAgIGlmIChtUG9zdGFsTGlzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtUG9zdGFsTGlzdCA9IG5ldyBBcnJheUxpc3Q8UG9zdGFsRGF0YT4oMCk7Ci0gICAgICAgIH0KLSAgICAgICAgbVBvc3RhbExpc3QuYWRkKG5ldyBQb3N0YWxEYXRhKHR5cGUsIHByb3BWYWx1ZUxpc3QsIGxhYmVsLCBpc1ByaW1hcnkpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTaG91bGQgYmUgY2FsbGVkIHZpYSB7QGxpbmsgI2hhbmRsZU9yZ1ZhbHVlKGludCwgTGlzdCwgYm9vbGVhbil9IG9yCi0gICAgICoge0BsaW5rICNoYW5kbGVUaXRsZVZhbHVlKFN0cmluZyl9LgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBhZGROZXdPcmdhbml6YXRpb24oaW50IHR5cGUsIGZpbmFsIFN0cmluZyBjb21wYW55TmFtZSwKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBkZXBhcnRtZW50TmFtZSwKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyB0aXRsZU5hbWUsIGJvb2xlYW4gaXNQcmltYXJ5KSB7Ci0gICAgICAgIGlmIChtT3JnYW5pemF0aW9uTGlzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtT3JnYW5pemF0aW9uTGlzdCA9IG5ldyBBcnJheUxpc3Q8T3JnYW5pemF0aW9uRGF0YT4oKTsKLSAgICAgICAgfQotICAgICAgICBtT3JnYW5pemF0aW9uTGlzdC5hZGQobmV3IE9yZ2FuaXphdGlvbkRhdGEodHlwZSwgY29tcGFueU5hbWUsCi0gICAgICAgICAgICAgICAgZGVwYXJ0bWVudE5hbWUsIHRpdGxlTmFtZSwgaXNQcmltYXJ5KSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTGlzdDxTdHJpbmc+IHNFbXB0eUxpc3QgPQotICAgICAgICAgICAgQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChuZXcgQXJyYXlMaXN0PFN0cmluZz4oMCkpOwotCi0gICAgLyoqCi0gICAgICogU2V0ICJPUkciIHJlbGF0ZWQgdmFsdWVzIHRvIHRoZSBhcHByb3ByaWF0ZSBkYXRhLiBJZiB0aGVyZSdzIG1vcmUgdGhhbiBvbmUKLSAgICAgKiB7QGxpbmsgT3JnYW5pemF0aW9uRGF0YX0gb2JqZWN0cywgdGhpcyBpbnB1dCBkYXRhIGFyZSBhdHRhY2hlZCB0byB0aGUgbGFzdCBvbmUgd2hpY2gKLSAgICAgKiBkb2VzIG5vdCBoYXZlIHZhbGlkIHZhbHVlcyAobm90IGluY2x1ZGluZyBlbXB0eSBidXQgb25seSBudWxsKS4gSWYgdGhlcmUncyBubwotICAgICAqIHtAbGluayBPcmdhbml6YXRpb25EYXRhfSBvYmplY3QsIGEgbmV3IHtAbGluayBPcmdhbml6YXRpb25EYXRhfSBpcyBjcmVhdGVkLAotICAgICAqIHdob3NlIHRpdGxlIGlzIHNldCB0byBudWxsLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBoYW5kbGVPcmdWYWx1ZShmaW5hbCBpbnQgdHlwZSwgTGlzdDxTdHJpbmc+IG9yZ0xpc3QsIGJvb2xlYW4gaXNQcmltYXJ5KSB7Ci0gICAgICAgIGlmIChvcmdMaXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIG9yZ0xpc3QgPSBzRW1wdHlMaXN0OwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIFN0cmluZyBjb21wYW55TmFtZTsKLSAgICAgICAgZmluYWwgU3RyaW5nIGRlcGFydG1lbnROYW1lOwotICAgICAgICBmaW5hbCBpbnQgc2l6ZSA9IG9yZ0xpc3Quc2l6ZSgpOwotICAgICAgICBzd2l0Y2ggKHNpemUpIHsKLSAgICAgICAgICAgIGNhc2UgMDogewotICAgICAgICAgICAgICAgIGNvbXBhbnlOYW1lID0gIiI7Ci0gICAgICAgICAgICAgICAgZGVwYXJ0bWVudE5hbWUgPSBudWxsOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSAxOiB7Ci0gICAgICAgICAgICAgICAgY29tcGFueU5hbWUgPSBvcmdMaXN0LmdldCgwKTsKLSAgICAgICAgICAgICAgICBkZXBhcnRtZW50TmFtZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkZWZhdWx0OiB7ICAvLyBNb3JlIHRoYW4gMS4KLSAgICAgICAgICAgICAgICBjb21wYW55TmFtZSA9IG9yZ0xpc3QuZ2V0KDApOwotICAgICAgICAgICAgICAgIC8vIFdlJ3JlIG5vdCBzdXJlIHdoaWNoIGlzIHRoZSBjb3JyZWN0IHN0cmluZyBmb3IgZGVwYXJ0bWVudC4KLSAgICAgICAgICAgICAgICAvLyBJbiBvcmRlciB0byBrZWVwIGFsbCB0aGUgZGF0YSwgY29uY2F0aW5hdGUgdGhlIHJlc3Qgb2YgZWxlbWVudHMuCi0gICAgICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IHNpemU7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoaSA+IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCcgJyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQob3JnTGlzdC5nZXQoaSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBkZXBhcnRtZW50TmFtZSA9IGJ1aWxkZXIudG9TdHJpbmcoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAobU9yZ2FuaXphdGlvbkxpc3QgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gQ3JlYXRlIG5ldyBmaXJzdCBvcmdhbml6YXRpb24gZW50cnksIHdpdGggIm51bGwiIHRpdGxlIHdoaWNoIG1heSBiZQotICAgICAgICAgICAgLy8gYWRkZWQgdmlhIGhhbmRsZVRpdGxlVmFsdWUoKS4KLSAgICAgICAgICAgIGFkZE5ld09yZ2FuaXphdGlvbih0eXBlLCBjb21wYW55TmFtZSwgZGVwYXJ0bWVudE5hbWUsIG51bGwsIGlzUHJpbWFyeSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChPcmdhbml6YXRpb25EYXRhIG9yZ2FuaXphdGlvbkRhdGEgOiBtT3JnYW5pemF0aW9uTGlzdCkgewotICAgICAgICAgICAgLy8gTm90IHVzZSBUZXh0VXRpbHMuaXNFbXB0eSgpIHNpbmNlIE9SRyB3YXMgc2V0IGJ1dCB0aGUgZWxlbWVudHMgbWlnaHQgYmUgZW1wdHkuCi0gICAgICAgICAgICAvLyBlLmcuICJPUkc7UFJFRjo7IiAtPiBCb3RoIGNvbXBhbnlOYW1lIGFuZCBkZXBhcnRtZW50TmFtZSBiZWNvbWUgZW1wdHkgYnV0IG5vdCBudWxsLgotICAgICAgICAgICAgaWYgKG9yZ2FuaXphdGlvbkRhdGEuY29tcGFueU5hbWUgPT0gbnVsbCAmJgotICAgICAgICAgICAgICAgICAgICBvcmdhbml6YXRpb25EYXRhLmRlcGFydG1lbnROYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBQcm9iYWJseSB0aGUgIlRJVExFIiBwcm9wZXJ0eSBjb21lcyBiZWZvcmUgdGhlICJPUkciIHByb3BlcnR5IHZpYQotICAgICAgICAgICAgICAgIC8vIGhhbmRsZVRpdGxlTGluZSgpLgotICAgICAgICAgICAgICAgIG9yZ2FuaXphdGlvbkRhdGEuY29tcGFueU5hbWUgPSBjb21wYW55TmFtZTsKLSAgICAgICAgICAgICAgICBvcmdhbml6YXRpb25EYXRhLmRlcGFydG1lbnROYW1lID0gZGVwYXJ0bWVudE5hbWU7Ci0gICAgICAgICAgICAgICAgb3JnYW5pemF0aW9uRGF0YS5pc1ByaW1hcnkgPSBpc1ByaW1hcnk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIE5vIE9yZ2FuaXphdGlvRGF0YSBpcyBhdmFpbGFibGUuIENyZWF0ZSBhbm90aGVyIG9uZSwgd2l0aCAibnVsbCIgdGl0bGUsIHdoaWNoIG1heSBiZQotICAgICAgICAvLyBhZGRlZCB2aWEgaGFuZGxlVGl0bGVWYWx1ZSgpLgotICAgICAgICBhZGROZXdPcmdhbml6YXRpb24odHlwZSwgY29tcGFueU5hbWUsIGRlcGFydG1lbnROYW1lLCBudWxsLCBpc1ByaW1hcnkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCAidGl0bGUiIHZhbHVlIHRvIHRoZSBhcHByb3ByaWF0ZSBkYXRhLiBJZiB0aGVyZSdzIG1vcmUgdGhhbiBvbmUKLSAgICAgKiBPcmdhbml6YXRpb25EYXRhIG9iamVjdHMsIHRoaXMgaW5wdXQgaXMgYXR0YWNoZWQgdG8gdGhlIGxhc3Qgb25lIHdoaWNoIGRvZXMgbm90Ci0gICAgICogaGF2ZSB2YWxpZCB0aXRsZSB2YWx1ZSAobm90IGluY2x1ZGluZyBlbXB0eSBidXQgb25seSBudWxsKS4gSWYgdGhlcmUncyBubwotICAgICAqIE9yZ2FuaXphdGlvbkRhdGEgb2JqZWN0LCBhIG5ldyBPcmdhbml6YXRpb25EYXRhIGlzIGNyZWF0ZWQsIHdob3NlIGNvbXBhbnkgbmFtZSBpcwotICAgICAqIHNldCB0byBudWxsLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBoYW5kbGVUaXRsZVZhbHVlKGZpbmFsIFN0cmluZyB0aXRsZSkgewotICAgICAgICBpZiAobU9yZ2FuaXphdGlvbkxpc3QgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gQ3JlYXRlIG5ldyBmaXJzdCBvcmdhbml6YXRpb24gZW50cnksIHdpdGggIm51bGwiIG90aGVyIGluZm8sIHdoaWNoIG1heSBiZQotICAgICAgICAgICAgLy8gYWRkZWQgdmlhIGhhbmRsZU9yZ1ZhbHVlKCkuCi0gICAgICAgICAgICBhZGROZXdPcmdhbml6YXRpb24oREVGQVVMVF9PUkdBTklaQVRJT05fVFlQRSwgbnVsbCwgbnVsbCwgdGl0bGUsIGZhbHNlKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBmb3IgKE9yZ2FuaXphdGlvbkRhdGEgb3JnYW5pemF0aW9uRGF0YSA6IG1Pcmdhbml6YXRpb25MaXN0KSB7Ci0gICAgICAgICAgICBpZiAob3JnYW5pemF0aW9uRGF0YS50aXRsZU5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG9yZ2FuaXphdGlvbkRhdGEudGl0bGVOYW1lID0gdGl0bGU7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIE5vIE9yZ2FuaXphdGlvbiBpcyBhdmFpbGFibGUuIENyZWF0ZSBhbm90aGVyIG9uZSwgd2l0aCAibnVsbCIgb3RoZXIgaW5mbywgd2hpY2ggbWF5IGJlCi0gICAgICAgIC8vIGFkZGVkIHZpYSBoYW5kbGVPcmdWYWx1ZSgpLgotICAgICAgICBhZGROZXdPcmdhbml6YXRpb24oREVGQVVMVF9PUkdBTklaQVRJT05fVFlQRSwgbnVsbCwgbnVsbCwgdGl0bGUsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYWRkSW0oaW50IHByb3RvY29sLCBTdHJpbmcgY3VzdG9tUHJvdG9jb2wsIGludCB0eXBlLAotICAgICAgICAgICAgU3RyaW5nIHByb3BWYWx1ZSwgYm9vbGVhbiBpc1ByaW1hcnkpIHsKLSAgICAgICAgaWYgKG1JbUxpc3QgPT0gbnVsbCkgewotICAgICAgICAgICAgbUltTGlzdCA9IG5ldyBBcnJheUxpc3Q8SW1EYXRhPigpOwotICAgICAgICB9Ci0gICAgICAgIG1JbUxpc3QuYWRkKG5ldyBJbURhdGEocHJvdG9jb2wsIGN1c3RvbVByb3RvY29sLCB0eXBlLCBwcm9wVmFsdWUsIGlzUHJpbWFyeSkpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhZGROb3RlKGZpbmFsIFN0cmluZyBub3RlKSB7Ci0gICAgICAgIGlmIChtTm90ZUxpc3QgPT0gbnVsbCkgewotICAgICAgICAgICAgbU5vdGVMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KDEpOwotICAgICAgICB9Ci0gICAgICAgIG1Ob3RlTGlzdC5hZGQobm90ZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFkZFBob3RvQnl0ZXMoU3RyaW5nIGZvcm1hdE5hbWUsIGJ5dGVbXSBwaG90b0J5dGVzLCBib29sZWFuIGlzUHJpbWFyeSkgewotICAgICAgICBpZiAobVBob3RvTGlzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtUGhvdG9MaXN0ID0gbmV3IEFycmF5TGlzdDxQaG90b0RhdGE+KDEpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIFBob3RvRGF0YSBwaG90b0RhdGEgPSBuZXcgUGhvdG9EYXRhKDAsIG51bGwsIHBob3RvQnl0ZXMsIGlzUHJpbWFyeSk7Ci0gICAgICAgIG1QaG90b0xpc3QuYWRkKHBob3RvRGF0YSk7Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoImZhbGx0aHJvdWdoIikKLSAgICBwcml2YXRlIHZvaWQgaGFuZGxlTlByb3BlcnR5KExpc3Q8U3RyaW5nPiBlbGVtcykgewotICAgICAgICAvLyBGYW1pbHksIEdpdmVuLCBNaWRkbGUsIFByZWZpeCwgU3VmZml4LiAoMSAtIDUpCi0gICAgICAgIGludCBzaXplOwotICAgICAgICBpZiAoZWxlbXMgPT0gbnVsbCB8fCAoc2l6ZSA9IGVsZW1zLnNpemUoKSkgPCAxKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHNpemUgPiA1KSB7Ci0gICAgICAgICAgICBzaXplID0gNTsKLSAgICAgICAgfQotCi0gICAgICAgIHN3aXRjaCAoc2l6ZSkgewotICAgICAgICAgICAgLy8gZmFsbHRocm91Z2gKLSAgICAgICAgICAgIGNhc2UgNTogbVN1ZmZpeCA9IGVsZW1zLmdldCg0KTsKLSAgICAgICAgICAgIGNhc2UgNDogbVByZWZpeCA9IGVsZW1zLmdldCgzKTsKLSAgICAgICAgICAgIGNhc2UgMzogbU1pZGRsZU5hbWUgPSBlbGVtcy5nZXQoMik7Ci0gICAgICAgICAgICBjYXNlIDI6IG1HaXZlbk5hbWUgPSBlbGVtcy5nZXQoMSk7Ci0gICAgICAgICAgICBkZWZhdWx0OiBtRmFtaWx5TmFtZSA9IGVsZW1zLmdldCgwKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIE5vdGU6IFNvbWUgSmFwYW5lc2UgbW9iaWxlIHBob25lcyB1c2UgdGhpcyBmaWVsZCBmb3IgcGhvbmV0aWMgbmFtZSwKLSAgICAgKiAgICAgICBzaW5jZSB2Q2FyZCAyLjEgZG9lcyBub3QgaGF2ZSAiU09SVC1TVFJJTkciIHR5cGUuCi0gICAgICogICAgICAgQWxzbywgaW4gc29tZSBjYXNlcywgdGhlIGZpZWxkIGhhcyBzb21lICc7J3MgaW4gaXQuCi0gICAgICogICAgICAgQXNzdW1lIHRoZSAnOycgbWVhbnMgdGhlIHNhbWUgbWVhbmluZyBpbiBOIHByb3BlcnR5Ci0gICAgICovCi0gICAgQFN1cHByZXNzV2FybmluZ3MoImZhbGx0aHJvdWdoIikKLSAgICBwcml2YXRlIHZvaWQgaGFuZGxlUGhvbmV0aWNOYW1lRnJvbVNvdW5kKExpc3Q8U3RyaW5nPiBlbGVtcykgewotICAgICAgICBpZiAoIShUZXh0VXRpbHMuaXNFbXB0eShtUGhvbmV0aWNGYW1pbHlOYW1lKSAmJgotICAgICAgICAgICAgICAgIFRleHRVdGlscy5pc0VtcHR5KG1QaG9uZXRpY01pZGRsZU5hbWUpICYmCi0gICAgICAgICAgICAgICAgVGV4dFV0aWxzLmlzRW1wdHkobVBob25ldGljR2l2ZW5OYW1lKSkpIHsKLSAgICAgICAgICAgIC8vIFRoaXMgbWVhbnMgdGhlIG90aGVyIHByb3BlcnRpZXMgbGlrZSAiWC1QSE9ORVRJQy1GSVJTVC1OQU1FIiB3YXMgYWxyZWFkeSBmb3VuZC4KLSAgICAgICAgICAgIC8vIElnbm9yZSAiU09VTkQ7WC1JUk1DLU4iLgotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IHNpemU7Ci0gICAgICAgIGlmIChlbGVtcyA9PSBudWxsIHx8IChzaXplID0gZWxlbXMuc2l6ZSgpKSA8IDEpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEFzc3VtZSB0aGF0IHRoZSBvcmRlciBpcyAiRmFtaWx5LCBHaXZlbiwgTWlkZGxlIi4KLSAgICAgICAgLy8gVGhpcyBpcyBub3QgZnJvbSBzcGVjaWZpY2F0aW9uIGJ1dCBtZXJlIGFzc3VtcHRpb24uIFNvbWUgSmFwYW5lc2UgcGhvbmVzIHVzZSB0aGlzIG9yZGVyLgotICAgICAgICBpZiAoc2l6ZSA+IDMpIHsKLSAgICAgICAgICAgIHNpemUgPSAzOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGVsZW1zLmdldCgwKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgIGJvb2xlYW4gb25seUZpcnN0RWxlbUlzTm9uRW1wdHkgPSB0cnVlOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAoZWxlbXMuZ2V0KGkpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBvbmx5Rmlyc3RFbGVtSXNOb25FbXB0eSA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAob25seUZpcnN0RWxlbUlzTm9uRW1wdHkpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmdbXSBuYW1lc0FycmF5ID0gZWxlbXMuZ2V0KDApLnNwbGl0KCIgIik7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IG5hbWVBcnJheUxlbmd0aCA9IG5hbWVzQXJyYXkubGVuZ3RoOwotICAgICAgICAgICAgICAgIGlmIChuYW1lQXJyYXlMZW5ndGggPT0gMykgewotICAgICAgICAgICAgICAgICAgICAvLyBBc3N1bWUgdGhlIHN0cmluZyBpcyAiRmFtaWx5IE1pZGRsZSBHaXZlbiIuCi0gICAgICAgICAgICAgICAgICAgIG1QaG9uZXRpY0ZhbWlseU5hbWUgPSBuYW1lc0FycmF5WzBdOwotICAgICAgICAgICAgICAgICAgICBtUGhvbmV0aWNNaWRkbGVOYW1lID0gbmFtZXNBcnJheVsxXTsKLSAgICAgICAgICAgICAgICAgICAgbVBob25ldGljR2l2ZW5OYW1lID0gbmFtZXNBcnJheVsyXTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5hbWVBcnJheUxlbmd0aCA9PSAyKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEFzc3VtZSB0aGUgc3RyaW5nIGlzICJGYW1pbHkgR2l2ZW4iIGJhc2VkIG9uIHRoZSBKYXBhbmVzZSBtb2JpbGUKLSAgICAgICAgICAgICAgICAgICAgLy8gcGhvbmVzJyBwcmVmZXJlbmNlLgotICAgICAgICAgICAgICAgICAgICBtUGhvbmV0aWNGYW1pbHlOYW1lID0gbmFtZXNBcnJheVswXTsKLSAgICAgICAgICAgICAgICAgICAgbVBob25ldGljR2l2ZW5OYW1lID0gbmFtZXNBcnJheVsxXTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtUGhvbmV0aWNGdWxsTmFtZSA9IGVsZW1zLmdldCgwKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgc3dpdGNoIChzaXplKSB7Ci0gICAgICAgICAgICAvLyBmYWxsdGhyb3VnaAotICAgICAgICAgICAgY2FzZSAzOiBtUGhvbmV0aWNNaWRkbGVOYW1lID0gZWxlbXMuZ2V0KDIpOwotICAgICAgICAgICAgY2FzZSAyOiBtUGhvbmV0aWNHaXZlbk5hbWUgPSBlbGVtcy5nZXQoMSk7Ci0gICAgICAgICAgICBkZWZhdWx0OiBtUGhvbmV0aWNGYW1pbHlOYW1lID0gZWxlbXMuZ2V0KDApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkUHJvcGVydHkoZmluYWwgUHJvcGVydHkgcHJvcGVydHkpIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIHByb3BOYW1lID0gcHJvcGVydHkubVByb3BlcnR5TmFtZTsKLSAgICAgICAgZmluYWwgTWFwPFN0cmluZywgQ29sbGVjdGlvbjxTdHJpbmc+PiBwYXJhbU1hcCA9IHByb3BlcnR5Lm1QYXJhbWV0ZXJNYXA7Ci0gICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiBwcm9wVmFsdWVMaXN0ID0gcHJvcGVydHkubVByb3BlcnR5VmFsdWVMaXN0OwotICAgICAgICBieXRlW10gcHJvcEJ5dGVzID0gcHJvcGVydHkubVByb3BlcnR5Qnl0ZXM7Ci0KLSAgICAgICAgaWYgKHByb3BWYWx1ZUxpc3Quc2l6ZSgpID09IDApIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBTdHJpbmcgcHJvcFZhbHVlID0gbGlzdFRvU3RyaW5nKHByb3BWYWx1ZUxpc3QpLnRyaW0oKTsKLQotICAgICAgICBpZiAocHJvcE5hbWUuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1ZFUlNJT04pKSB7Ci0gICAgICAgICAgICAvLyB2Q2FyZCB2ZXJzaW9uLiBJZ25vcmUgdGhpcy4KLSAgICAgICAgfSBlbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfRk4pKSB7Ci0gICAgICAgICAgICBtRnVsbE5hbWUgPSBwcm9wVmFsdWU7Ci0gICAgICAgIH0gZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX05BTUUpICYmIG1GdWxsTmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBPbmx5IGluIHZDYXJkIDMuMC4gVXNlIHRoaXMgaWYgRk4sIHdoaWNoIG11c3QgZXhpc3QgaW4gdkNhcmQgMy4wIGJ1dCBtYXkgbm90Ci0gICAgICAgICAgICAvLyBhY3R1YWxseSBleGlzdCBpbiB0aGUgcmVhbCB2Q2FyZCBkYXRhLCBkb2VzIG5vdCBleGlzdC4KLSAgICAgICAgICAgIG1GdWxsTmFtZSA9IHByb3BWYWx1ZTsKLSAgICAgICAgfSBlbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfTikpIHsKLSAgICAgICAgICAgIGhhbmRsZU5Qcm9wZXJ0eShwcm9wVmFsdWVMaXN0KTsKLSAgICAgICAgfSBlbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfU09SVF9TVFJJTkcpKSB7Ci0gICAgICAgICAgICBtUGhvbmV0aWNGdWxsTmFtZSA9IHByb3BWYWx1ZTsKLSAgICAgICAgfSBlbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfTklDS05BTUUpIHx8Ci0gICAgICAgICAgICAgICAgcHJvcE5hbWUuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLkltcG9ydE9ubHkuUFJPUEVSVFlfWF9OSUNLTkFNRSkpIHsKLSAgICAgICAgICAgIGFkZE5pY2tOYW1lKHByb3BWYWx1ZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1NPVU5EKSkgewotICAgICAgICAgICAgQ29sbGVjdGlvbjxTdHJpbmc+IHR5cGVDb2xsZWN0aW9uID0gcGFyYW1NYXAuZ2V0KFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEUpOwotICAgICAgICAgICAgaWYgKHR5cGVDb2xsZWN0aW9uICE9IG51bGwKLSAgICAgICAgICAgICAgICAgICAgJiYgdHlwZUNvbGxlY3Rpb24uY29udGFpbnMoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9YX0lSTUNfTikpIHsKLSAgICAgICAgICAgICAgICAvLyBBcyBvZiAyMDA5LTEwLTA4LCBQYXJzZXIgc2lkZSBkb2VzIG5vdCBzcGxpdCBhIHByb3BlcnR5IHZhbHVlIGludG8gc2VwYXJhdGVkCi0gICAgICAgICAgICAgICAgLy8gdmFsdWVzIHVzaW5nICc7JyAoaW4gb3RoZXIgd29yZHMsIHByb3BWYWx1ZUxpc3Quc2l6ZSgpID09IDEpLAotICAgICAgICAgICAgICAgIC8vIHdoaWNoIGlzIGNvcnJlY3QgYmVoYXZpb3IgZnJvbSB0aGUgdmlldyBvZiB2Q2FyZCAyLjEuCi0gICAgICAgICAgICAgICAgLy8gQnV0IHdlIHdhbnQgaXQgdG8gYmUgc2VwYXJhdGVkLCBzbyBkbyB0aGUgc2VwYXJhdGlvbiBoZXJlLgotICAgICAgICAgICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiBwaG9uZXRpY05hbWVMaXN0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIFZDYXJkVXRpbHMuY29uc3RydWN0TGlzdEZyb21WYWx1ZShwcm9wVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZDYXJkQ29uZmlnLmlzVjMwKG1WQ2FyZFR5cGUpKTsKLSAgICAgICAgICAgICAgICBoYW5kbGVQaG9uZXRpY05hbWVGcm9tU291bmQocGhvbmV0aWNOYW1lTGlzdCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIElnbm9yZSB0aGlzIGZpZWxkIHNpbmNlIEFuZHJvaWQgY2Fubm90IHVuZGVyc3RhbmQgd2hhdCBpdCBpcy4KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfQURSKSkgewotICAgICAgICAgICAgYm9vbGVhbiB2YWx1ZXNBcmVBbGxFbXB0eSA9IHRydWU7Ci0gICAgICAgICAgICBmb3IgKFN0cmluZyB2YWx1ZSA6IHByb3BWYWx1ZUxpc3QpIHsKLSAgICAgICAgICAgICAgICBpZiAodmFsdWUubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHZhbHVlc0FyZUFsbEVtcHR5ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh2YWx1ZXNBcmVBbGxFbXB0eSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaW50IHR5cGUgPSAtMTsKLSAgICAgICAgICAgIFN0cmluZyBsYWJlbCA9ICIiOwotICAgICAgICAgICAgYm9vbGVhbiBpc1ByaW1hcnkgPSBmYWxzZTsKLSAgICAgICAgICAgIENvbGxlY3Rpb248U3RyaW5nPiB0eXBlQ29sbGVjdGlvbiA9IHBhcmFtTWFwLmdldChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFKTsKLSAgICAgICAgICAgIGlmICh0eXBlQ29sbGVjdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgdHlwZVN0cmluZyA6IHR5cGVDb2xsZWN0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgIHR5cGVTdHJpbmcgPSB0eXBlU3RyaW5nLnRvVXBwZXJDYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlU3RyaW5nLmVxdWFscyhWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX1BSRUYpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpc1ByaW1hcnkgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVTdHJpbmcuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfSE9NRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBTdHJ1Y3R1cmVkUG9zdGFsLlRZUEVfSE9NRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gIiI7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZVN0cmluZy5lcXVhbHMoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9XT1JLKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVTdHJpbmcuZXF1YWxzSWdub3JlQ2FzZShWQ2FyZENvbnN0YW50cy5QQVJBTV9FWFRSQV9UWVBFX0NPTVBBTlkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyAiQ09NUEFOWSIgc2VlbXMgZW1pdHRlZCBieSBXaW5kb3dzIE1vYmlsZSwgd2hpY2ggaXMgbm90Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBzcGVjaWZpY2FsbHkgc3VwcG9ydGVkIGJ5IHZDYXJkIDIuMS4gV2UgYXNzdW1lIHRoaXMgaXMgc2FtZQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXMgIldPUksiLgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9IFN0cnVjdHVyZWRQb3N0YWwuVFlQRV9XT1JLOwotICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSAiIjsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlU3RyaW5nLmVxdWFscyhWQ2FyZENvbnN0YW50cy5QQVJBTV9BRFJfVFlQRV9QQVJDRUwpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZVN0cmluZy5lcXVhbHMoVkNhcmRDb25zdGFudHMuUEFSQU1fQURSX1RZUEVfRE9NKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVTdHJpbmcuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLlBBUkFNX0FEUl9UWVBFX0lOVEwpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBkbyBub3QgaGF2ZSBhbnkgYXBwcm9wcmlhdGUgd2F5IHRvIHN0b3JlIHRoaXMgaW5mb3JtYXRpb24uCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZVN0cmluZy5zdGFydHNXaXRoKCJYLSIpICYmIHR5cGUgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZVN0cmluZyA9IHR5cGVTdHJpbmcuc3Vic3RyaW5nKDIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gdkNhcmQgMy4wIGFsbG93cyBpYW5hLXRva2VuLiBBbHNvIHNvbWUgdkNhcmQgMi4xIGV4cG9ydGVycwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gZW1pdCBub24tc3RhbmRhcmQgdHlwZXMuIFdlIGRvIG5vdCBoYW5kbGUgdGhlaXIgdmFsdWVzIG5vdy4KLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBTdHJ1Y3R1cmVkUG9zdGFsLlRZUEVfQ1VTVE9NOwotICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSB0eXBlU3RyaW5nOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gV2UgdXNlICJIT01FIiBhcyBkZWZhdWx0Ci0gICAgICAgICAgICBpZiAodHlwZSA8IDApIHsKLSAgICAgICAgICAgICAgICB0eXBlID0gU3RydWN0dXJlZFBvc3RhbC5UWVBFX0hPTUU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGFkZFBvc3RhbCh0eXBlLCBwcm9wVmFsdWVMaXN0LCBsYWJlbCwgaXNQcmltYXJ5KTsKLSAgICAgICAgfSBlbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfRU1BSUwpKSB7Ci0gICAgICAgICAgICBpbnQgdHlwZSA9IC0xOwotICAgICAgICAgICAgU3RyaW5nIGxhYmVsID0gbnVsbDsKLSAgICAgICAgICAgIGJvb2xlYW4gaXNQcmltYXJ5ID0gZmFsc2U7Ci0gICAgICAgICAgICBDb2xsZWN0aW9uPFN0cmluZz4gdHlwZUNvbGxlY3Rpb24gPSBwYXJhbU1hcC5nZXQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRSk7Ci0gICAgICAgICAgICBpZiAodHlwZUNvbGxlY3Rpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIHR5cGVTdHJpbmcgOiB0eXBlQ29sbGVjdGlvbikgewotICAgICAgICAgICAgICAgICAgICB0eXBlU3RyaW5nID0gdHlwZVN0cmluZy50b1VwcGVyQ2FzZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAodHlwZVN0cmluZy5lcXVhbHMoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9QUkVGKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaXNQcmltYXJ5ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlU3RyaW5nLmVxdWFscyhWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX0hPTUUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gRW1haWwuVFlQRV9IT01FOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVTdHJpbmcuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfV09SSykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBFbWFpbC5UWVBFX1dPUks7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZVN0cmluZy5lcXVhbHMoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9DRUxMKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9IEVtYWlsLlRZUEVfTU9CSUxFOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVTdHJpbmcuc3RhcnRzV2l0aCgiWC0iKSAmJiB0eXBlIDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVTdHJpbmcgPSB0eXBlU3RyaW5nLnN1YnN0cmluZygyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHZDYXJkIDMuMCBhbGxvd3MgaWFuYS10b2tlbi4KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIG1heSBoYXZlIElOVEVSTkVUIChzcGVjaWZpZWQgaW4gdkNhcmQgc3BlYyksCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBTQ0hPT0wsIGV0Yy4KLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBFbWFpbC5UWVBFX0NVU1RPTTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gdHlwZVN0cmluZzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh0eXBlIDwgMCkgewotICAgICAgICAgICAgICAgIHR5cGUgPSBFbWFpbC5UWVBFX09USEVSOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYWRkRW1haWwodHlwZSwgcHJvcFZhbHVlLCBsYWJlbCwgaXNQcmltYXJ5KTsKLSAgICAgICAgfSBlbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfT1JHKSkgewotICAgICAgICAgICAgLy8gdkNhcmQgc3BlY2lmaWNhdGlvbiBkb2VzIG5vdCBzcGVjaWZ5IG90aGVyIHR5cGVzLgotICAgICAgICAgICAgZmluYWwgaW50IHR5cGUgPSBPcmdhbml6YXRpb24uVFlQRV9XT1JLOwotICAgICAgICAgICAgYm9vbGVhbiBpc1ByaW1hcnkgPSBmYWxzZTsKLSAgICAgICAgICAgIENvbGxlY3Rpb248U3RyaW5nPiB0eXBlQ29sbGVjdGlvbiA9IHBhcmFtTWFwLmdldChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFKTsKLSAgICAgICAgICAgIGlmICh0eXBlQ29sbGVjdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgdHlwZVN0cmluZyA6IHR5cGVDb2xsZWN0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlU3RyaW5nLmVxdWFscyhWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX1BSRUYpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpc1ByaW1hcnkgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaGFuZGxlT3JnVmFsdWUodHlwZSwgcHJvcFZhbHVlTGlzdCwgaXNQcmltYXJ5KTsKLSAgICAgICAgfSBlbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfVElUTEUpKSB7Ci0gICAgICAgICAgICBoYW5kbGVUaXRsZVZhbHVlKHByb3BWYWx1ZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1JPTEUpKSB7Ci0gICAgICAgICAgICAvLyBUaGlzIGNvbmZsaWN0cyB3aXRoIFRJVExFLiBJZ25vcmUgZm9yIG5vdy4uLgotICAgICAgICAgICAgLy8gaGFuZGxlVGl0bGVWYWx1ZShwcm9wVmFsdWUpOwotICAgICAgICB9IGVsc2UgaWYgKHByb3BOYW1lLmVxdWFscyhWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9QSE9UTykgfHwKLSAgICAgICAgICAgICAgICBwcm9wTmFtZS5lcXVhbHMoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfTE9HTykpIHsKLSAgICAgICAgICAgIENvbGxlY3Rpb248U3RyaW5nPiBwYXJhbU1hcFZhbHVlID0gcGFyYW1NYXAuZ2V0KCJWQUxVRSIpOwotICAgICAgICAgICAgaWYgKHBhcmFtTWFwVmFsdWUgIT0gbnVsbCAmJiBwYXJhbU1hcFZhbHVlLmNvbnRhaW5zKCJVUkwiKSkgewotICAgICAgICAgICAgICAgIC8vIEN1cnJlbnRseSB3ZSBkbyBub3QgaGF2ZSBhcHByb3ByaWF0ZSBleGFtcGxlIGZvciB0ZXN0aW5nIHRoaXMgY2FzZS4KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgQ29sbGVjdGlvbjxTdHJpbmc+IHR5cGVDb2xsZWN0aW9uID0gcGFyYW1NYXAuZ2V0KCJUWVBFIik7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGZvcm1hdE5hbWUgPSBudWxsOwotICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNQcmltYXJ5ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgaWYgKHR5cGVDb2xsZWN0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgdHlwZVZhbHVlIDogdHlwZUNvbGxlY3Rpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX1BSRUYuZXF1YWxzKHR5cGVWYWx1ZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1ByaW1hcnkgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmb3JtYXROYW1lID09IG51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdE5hbWUgPSB0eXBlVmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYWRkUGhvdG9CeXRlcyhmb3JtYXROYW1lLCBwcm9wQnl0ZXMsIGlzUHJpbWFyeSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1RFTCkpIHsKLSAgICAgICAgICAgIGZpbmFsIENvbGxlY3Rpb248U3RyaW5nPiB0eXBlQ29sbGVjdGlvbiA9IHBhcmFtTWFwLmdldChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFKTsKLSAgICAgICAgICAgIGZpbmFsIE9iamVjdCB0eXBlT2JqZWN0ID0KLSAgICAgICAgICAgICAgICBWQ2FyZFV0aWxzLmdldFBob25lVHlwZUZyb21TdHJpbmdzKHR5cGVDb2xsZWN0aW9uLCBwcm9wVmFsdWUpOwotICAgICAgICAgICAgZmluYWwgaW50IHR5cGU7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgbGFiZWw7Ci0gICAgICAgICAgICBpZiAodHlwZU9iamVjdCBpbnN0YW5jZW9mIEludGVnZXIpIHsKLSAgICAgICAgICAgICAgICB0eXBlID0gKEludGVnZXIpdHlwZU9iamVjdDsKLSAgICAgICAgICAgICAgICBsYWJlbCA9IG51bGw7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHR5cGUgPSBQaG9uZS5UWVBFX0NVU1RPTTsKLSAgICAgICAgICAgICAgICBsYWJlbCA9IHR5cGVPYmplY3QudG9TdHJpbmcoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBpc1ByaW1hcnk7Ci0gICAgICAgICAgICBpZiAodHlwZUNvbGxlY3Rpb24gIT0gbnVsbCAmJiB0eXBlQ29sbGVjdGlvbi5jb250YWlucyhWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX1BSRUYpKSB7Ci0gICAgICAgICAgICAgICAgaXNQcmltYXJ5ID0gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaXNQcmltYXJ5ID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhZGRQaG9uZSh0eXBlLCBwcm9wVmFsdWUsIGxhYmVsLCBpc1ByaW1hcnkpOwotICAgICAgICB9IGVsc2UgaWYgKHByb3BOYW1lLmVxdWFscyhWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9YX1NLWVBFX1BTVE5OVU1CRVIpKSB7Ci0gICAgICAgICAgICAvLyBUaGUgcGhvbmUgbnVtYmVyIGF2YWlsYWJsZSB2aWEgU2t5cGUuCi0gICAgICAgICAgICBDb2xsZWN0aW9uPFN0cmluZz4gdHlwZUNvbGxlY3Rpb24gPSBwYXJhbU1hcC5nZXQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRSk7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgdHlwZSA9IFBob25lLlRZUEVfT1RIRVI7Ci0gICAgICAgICAgICBmaW5hbCBib29sZWFuIGlzUHJpbWFyeTsKLSAgICAgICAgICAgIGlmICh0eXBlQ29sbGVjdGlvbiAhPSBudWxsICYmIHR5cGVDb2xsZWN0aW9uLmNvbnRhaW5zKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfUFJFRikpIHsKLSAgICAgICAgICAgICAgICBpc1ByaW1hcnkgPSB0cnVlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpc1ByaW1hcnkgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFkZFBob25lKHR5cGUsIHByb3BWYWx1ZSwgbnVsbCwgaXNQcmltYXJ5KTsKLSAgICAgICAgfSBlbHNlIGlmIChzSW1NYXAuY29udGFpbnNLZXkocHJvcE5hbWUpKSB7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgcHJvdG9jb2wgPSBzSW1NYXAuZ2V0KHByb3BOYW1lKTsKLSAgICAgICAgICAgIGJvb2xlYW4gaXNQcmltYXJ5ID0gZmFsc2U7Ci0gICAgICAgICAgICBpbnQgdHlwZSA9IC0xOwotICAgICAgICAgICAgZmluYWwgQ29sbGVjdGlvbjxTdHJpbmc+IHR5cGVDb2xsZWN0aW9uID0gcGFyYW1NYXAuZ2V0KFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEUpOwotICAgICAgICAgICAgaWYgKHR5cGVDb2xsZWN0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyB0eXBlU3RyaW5nIDogdHlwZUNvbGxlY3Rpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVTdHJpbmcuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfUFJFRikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlzUHJpbWFyeSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlU3RyaW5nLmVxdWFsc0lnbm9yZUNhc2UoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9IT01FKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBJbS5UWVBFX0hPTUU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVTdHJpbmcuZXF1YWxzSWdub3JlQ2FzZShWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX1dPUkspKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9IEltLlRZUEVfV09SSzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh0eXBlIDwgMCkgewotICAgICAgICAgICAgICAgIHR5cGUgPSBJbS5UWVBFX0hPTUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhZGRJbShwcm90b2NvbCwgbnVsbCwgdHlwZSwgcHJvcFZhbHVlLCBpc1ByaW1hcnkpOwotICAgICAgICB9IGVsc2UgaWYgKHByb3BOYW1lLmVxdWFscyhWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9OT1RFKSkgewotICAgICAgICAgICAgYWRkTm90ZShwcm9wVmFsdWUpOwotICAgICAgICB9IGVsc2UgaWYgKHByb3BOYW1lLmVxdWFscyhWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9VUkwpKSB7Ci0gICAgICAgICAgICBpZiAobVdlYnNpdGVMaXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtV2Vic2l0ZUxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtV2Vic2l0ZUxpc3QuYWRkKHByb3BWYWx1ZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX0JEQVkpKSB7Ci0gICAgICAgICAgICBtQmlydGhkYXkgPSBwcm9wVmFsdWU7Ci0gICAgICAgIH0gZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1hfUEhPTkVUSUNfRklSU1RfTkFNRSkpIHsKLSAgICAgICAgICAgIG1QaG9uZXRpY0dpdmVuTmFtZSA9IHByb3BWYWx1ZTsKLSAgICAgICAgfSBlbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfWF9QSE9ORVRJQ19NSURETEVfTkFNRSkpIHsKLSAgICAgICAgICAgIG1QaG9uZXRpY01pZGRsZU5hbWUgPSBwcm9wVmFsdWU7Ci0gICAgICAgIH0gZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1hfUEhPTkVUSUNfTEFTVF9OQU1FKSkgewotICAgICAgICAgICAgbVBob25ldGljRmFtaWx5TmFtZSA9IHByb3BWYWx1ZTsKLSAgICAgICAgfSBlbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfWF9BTkRST0lEX0NVU1RPTSkpIHsKLSAgICAgICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiBjdXN0b21Qcm9wZXJ0eUxpc3QgPQotICAgICAgICAgICAgICAgIFZDYXJkVXRpbHMuY29uc3RydWN0TGlzdEZyb21WYWx1ZShwcm9wVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBWQ2FyZENvbmZpZy5pc1YzMChtVkNhcmRUeXBlKSk7Ci0gICAgICAgICAgICBoYW5kbGVBbmRyb2lkQ3VzdG9tUHJvcGVydHkoY3VzdG9tUHJvcGVydHlMaXN0KTsKLSAgICAgICAgLyp9IGVsc2UgaWYgKHByb3BOYW1lLmVxdWFscygiUkVWIikpIHsKLSAgICAgICAgICAgIC8vIFJldmlzaW9uIG9mIHRoaXMgVkNhcmQgZW50cnkuIEkgdGhpbmsgd2UgY2FuIGlnbm9yZSB0aGlzLgotICAgICAgICB9IGVsc2UgaWYgKHByb3BOYW1lLmVxdWFscygiVUlEIikpIHsKLSAgICAgICAgfSBlbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoIktFWSIpKSB7Ci0gICAgICAgICAgICAvLyBUeXBlIGlzIFg1MDkgb3IgUEdQPyBJIGRvbid0IGtub3cgaG93IHRvIGhhbmRsZSB0aGlzLi4uCi0gICAgICAgIH0gZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKCJNQUlMRVIiKSkgewotICAgICAgICB9IGVsc2UgaWYgKHByb3BOYW1lLmVxdWFscygiVFoiKSkgewotICAgICAgICB9IGVsc2UgaWYgKHByb3BOYW1lLmVxdWFscygiR0VPIikpIHsKLSAgICAgICAgfSBlbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoIkNMQVNTIikpIHsKLSAgICAgICAgICAgIC8vIHZDYXJkIDMuMCBvbmx5LgotICAgICAgICAgICAgLy8gZS5nLiBDTEFTUzpDT05GSURFTlRJQUwKLSAgICAgICAgfSBlbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoIlBST0ZJTEUiKSkgewotICAgICAgICAgICAgLy8gVkNhcmQgMy4wIG9ubHkuIE11c3QgYmUgIlZDQVJEIi4gSSB0aGluayB3ZSBjYW4gaWdub3JlIHRoaXMuCi0gICAgICAgIH0gZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKCJDQVRFR09SSUVTIikpIHsKLSAgICAgICAgICAgIC8vIFZDYXJkIDMuMCBvbmx5LgotICAgICAgICAgICAgLy8gZS5nLiBDQVRFR09SSUVTOklOVEVSTkVULElFVEYsSU5EVVNUUlksSU5GT1JNQVRJT04gVEVDSE5PTE9HWQotICAgICAgICB9IGVsc2UgaWYgKHByb3BOYW1lLmVxdWFscygiU09VUkNFIikpIHsKLSAgICAgICAgICAgIC8vIFZDYXJkIDMuMCBvbmx5LgotICAgICAgICB9IGVsc2UgaWYgKHByb3BOYW1lLmVxdWFscygiUFJPRElEIikpIHsKLSAgICAgICAgICAgIC8vIFZDYXJkIDMuMCBvbmx5LgotICAgICAgICAgICAgLy8gVG8gc3BlY2lmeSB0aGUgaWRlbnRpZmllciBmb3IgdGhlIHByb2R1Y3QgdGhhdCBjcmVhdGVkCi0gICAgICAgICAgICAvLyB0aGUgdkNhcmQgb2JqZWN0LiovCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBVbmtub3duIFgtIHdvcmRzIGFuZCBJQU5BIHRva2VuLgotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZUFuZHJvaWRDdXN0b21Qcm9wZXJ0eShmaW5hbCBMaXN0PFN0cmluZz4gY3VzdG9tUHJvcGVydHlMaXN0KSB7Ci0gICAgICAgIGlmIChtQW5kcm9pZEN1c3RvbVByb3BlcnR5TGlzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtQW5kcm9pZEN1c3RvbVByb3BlcnR5TGlzdCA9IG5ldyBBcnJheUxpc3Q8TGlzdDxTdHJpbmc+PigpOwotICAgICAgICB9Ci0gICAgICAgIG1BbmRyb2lkQ3VzdG9tUHJvcGVydHlMaXN0LmFkZChjdXN0b21Qcm9wZXJ0eUxpc3QpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdCB0aGUgZGlzcGxheSBuYW1lLiBUaGUgY29uc3RydWN0ZWQgZGF0YSBtdXN0IG5vdCBiZSBudWxsLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjb25zdHJ1Y3REaXNwbGF5TmFtZSgpIHsKLSAgICAgICAgLy8gRnVsbE5hbWUgKGNyZWF0ZWQgdmlhICJGTiIgb3IgIk5BTUUiIGZpZWxkKSBpcyBwcmVmZXJlZC4KLSAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShtRnVsbE5hbWUpKSB7Ci0gICAgICAgICAgICBtRGlzcGxheU5hbWUgPSBtRnVsbE5hbWU7Ci0gICAgICAgIH0gZWxzZSBpZiAoIShUZXh0VXRpbHMuaXNFbXB0eShtRmFtaWx5TmFtZSkgJiYgVGV4dFV0aWxzLmlzRW1wdHkobUdpdmVuTmFtZSkpKSB7Ci0gICAgICAgICAgICBtRGlzcGxheU5hbWUgPSBWQ2FyZFV0aWxzLmNvbnN0cnVjdE5hbWVGcm9tRWxlbWVudHMobVZDYXJkVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgbUZhbWlseU5hbWUsIG1NaWRkbGVOYW1lLCBtR2l2ZW5OYW1lLCBtUHJlZml4LCBtU3VmZml4KTsKLSAgICAgICAgfSBlbHNlIGlmICghKFRleHRVdGlscy5pc0VtcHR5KG1QaG9uZXRpY0ZhbWlseU5hbWUpICYmCi0gICAgICAgICAgICAgICAgVGV4dFV0aWxzLmlzRW1wdHkobVBob25ldGljR2l2ZW5OYW1lKSkpIHsKLSAgICAgICAgICAgIG1EaXNwbGF5TmFtZSA9IFZDYXJkVXRpbHMuY29uc3RydWN0TmFtZUZyb21FbGVtZW50cyhtVkNhcmRUeXBlLAotICAgICAgICAgICAgICAgICAgICBtUGhvbmV0aWNGYW1pbHlOYW1lLCBtUGhvbmV0aWNNaWRkbGVOYW1lLCBtUGhvbmV0aWNHaXZlbk5hbWUpOwotICAgICAgICB9IGVsc2UgaWYgKG1FbWFpbExpc3QgIT0gbnVsbCAmJiBtRW1haWxMaXN0LnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIG1EaXNwbGF5TmFtZSA9IG1FbWFpbExpc3QuZ2V0KDApLmRhdGE7Ci0gICAgICAgIH0gZWxzZSBpZiAobVBob25lTGlzdCAhPSBudWxsICYmIG1QaG9uZUxpc3Quc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgbURpc3BsYXlOYW1lID0gbVBob25lTGlzdC5nZXQoMCkuZGF0YTsKLSAgICAgICAgfSBlbHNlIGlmIChtUG9zdGFsTGlzdCAhPSBudWxsICYmIG1Qb3N0YWxMaXN0LnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIG1EaXNwbGF5TmFtZSA9IG1Qb3N0YWxMaXN0LmdldCgwKS5nZXRGb3JtYXR0ZWRBZGRyZXNzKG1WQ2FyZFR5cGUpOwotICAgICAgICB9IGVsc2UgaWYgKG1Pcmdhbml6YXRpb25MaXN0ICE9IG51bGwgJiYgbU9yZ2FuaXphdGlvbkxpc3Quc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgbURpc3BsYXlOYW1lID0gbU9yZ2FuaXphdGlvbkxpc3QuZ2V0KDApLmdldEZvcm1hdHRlZFN0cmluZygpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1EaXNwbGF5TmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtRGlzcGxheU5hbWUgPSAiIjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnNvbGlkYXRlIHNldmVyYWwgZmllbHNkcyAobGlrZSBtTmFtZSkgdXNpbmcgbmFtZSBjYW5kaWRhdGVzLAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNvbnNvbGlkYXRlRmllbGRzKCkgewotICAgICAgICBjb25zdHJ1Y3REaXNwbGF5TmFtZSgpOwotCi0gICAgICAgIGlmIChtUGhvbmV0aWNGdWxsTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtUGhvbmV0aWNGdWxsTmFtZSA9IG1QaG9uZXRpY0Z1bGxOYW1lLnRyaW0oKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBVcmkgcHVzaEludG9Db250ZW50UmVzb2x2ZXIoQ29udGVudFJlc29sdmVyIHJlc29sdmVyKSB7Ci0gICAgICAgIEFycmF5TGlzdDxDb250ZW50UHJvdmlkZXJPcGVyYXRpb24+IG9wZXJhdGlvbkxpc3QgPQotICAgICAgICAgICAgbmV3IEFycmF5TGlzdDxDb250ZW50UHJvdmlkZXJPcGVyYXRpb24+KCk7Ci0gICAgICAgIC8vIEFmdGVyIGFwcGx5aW5nIHRoZSBiYXRjaCB0aGUgZmlyc3QgcmVzdWx0J3MgVXJpIGlzIHJldHVybmVkIHNvIGl0IGlzIGltcG9ydGFudCB0aGF0Ci0gICAgICAgIC8vIHRoZSBSYXdDb250YWN0IGlzIHRoZSBmaXJzdCBvcGVyYXRpb24gdGhhdCBnZXRzIGluc2VydGVkIGludG8gdGhlIGxpc3QKLSAgICAgICAgQ29udGVudFByb3ZpZGVyT3BlcmF0aW9uLkJ1aWxkZXIgYnVpbGRlciA9Ci0gICAgICAgICAgICBDb250ZW50UHJvdmlkZXJPcGVyYXRpb24ubmV3SW5zZXJ0KFJhd0NvbnRhY3RzLkNPTlRFTlRfVVJJKTsKLSAgICAgICAgU3RyaW5nIG15R3JvdXBzSWQgPSBudWxsOwotICAgICAgICBpZiAobUFjY291bnQgIT0gbnVsbCkgewotICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoUmF3Q29udGFjdHMuQUNDT1VOVF9OQU1FLCBtQWNjb3VudC5uYW1lKTsKLSAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKFJhd0NvbnRhY3RzLkFDQ09VTlRfVFlQRSwgbUFjY291bnQudHlwZSk7Ci0KLSAgICAgICAgICAgIC8vIEFzc3VtZSB0aGF0IGNhbGxlciBzaWRlIGNyZWF0ZXMgdGhpcyBncm91cCBpZiBpdCBkb2VzIG5vdCBleGlzdC4KLSAgICAgICAgICAgIGlmIChBQ0NPVU5UX1RZUEVfR09PR0xFLmVxdWFscyhtQWNjb3VudC50eXBlKSkgewotICAgICAgICAgICAgICAgIGZpbmFsIEN1cnNvciBjdXJzb3IgPSByZXNvbHZlci5xdWVyeShHcm91cHMuQ09OVEVOVF9VUkksIG5ldyBTdHJpbmdbXSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBHcm91cHMuU09VUkNFX0lEIH0sCi0gICAgICAgICAgICAgICAgICAgICAgICBHcm91cHMuVElUTEUgKyAiPT8iLCBuZXcgU3RyaW5nW10gewotICAgICAgICAgICAgICAgICAgICAgICAgR09PR0xFX01ZX0NPTlRBQ1RTX0dST1VQIH0sIG51bGwpOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjdXJzb3IgIT0gbnVsbCAmJiBjdXJzb3IubW92ZVRvRmlyc3QoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbXlHcm91cHNJZCA9IGN1cnNvci5nZXRTdHJpbmcoMCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgICAgICBpZiAoY3Vyc29yICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGN1cnNvci5jbG9zZSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoUmF3Q29udGFjdHMuQUNDT1VOVF9OQU1FLCBudWxsKTsKLSAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKFJhd0NvbnRhY3RzLkFDQ09VTlRfVFlQRSwgbnVsbCk7Ci0gICAgICAgIH0KLSAgICAgICAgb3BlcmF0aW9uTGlzdC5hZGQoYnVpbGRlci5idWlsZCgpKTsKLQotICAgICAgICBpZiAoIW5hbWVGaWVsZHNBcmVFbXB0eSgpKSB7Ci0gICAgICAgICAgICBidWlsZGVyID0gQ29udGVudFByb3ZpZGVyT3BlcmF0aW9uLm5ld0luc2VydChEYXRhLkNPTlRFTlRfVVJJKTsKLSAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlQmFja1JlZmVyZW5jZShTdHJ1Y3R1cmVkTmFtZS5SQVdfQ09OVEFDVF9JRCwgMCk7Ci0gICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShEYXRhLk1JTUVUWVBFLCBTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSk7Ci0KLSAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKFN0cnVjdHVyZWROYW1lLkdJVkVOX05BTUUsIG1HaXZlbk5hbWUpOwotICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoU3RydWN0dXJlZE5hbWUuRkFNSUxZX05BTUUsIG1GYW1pbHlOYW1lKTsKLSAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKFN0cnVjdHVyZWROYW1lLk1JRERMRV9OQU1FLCBtTWlkZGxlTmFtZSk7Ci0gICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShTdHJ1Y3R1cmVkTmFtZS5QUkVGSVgsIG1QcmVmaXgpOwotICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoU3RydWN0dXJlZE5hbWUuU1VGRklYLCBtU3VmZml4KTsKLQotICAgICAgICAgICAgaWYgKCEoVGV4dFV0aWxzLmlzRW1wdHkobVBob25ldGljR2l2ZW5OYW1lKQotICAgICAgICAgICAgICAgICAgICAmJiBUZXh0VXRpbHMuaXNFbXB0eShtUGhvbmV0aWNGYW1pbHlOYW1lKQotICAgICAgICAgICAgICAgICAgICAmJiBUZXh0VXRpbHMuaXNFbXB0eShtUGhvbmV0aWNNaWRkbGVOYW1lKSkpIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19HSVZFTl9OQU1FLCBtUGhvbmV0aWNHaXZlbk5hbWUpOwotICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0ZBTUlMWV9OQU1FLCBtUGhvbmV0aWNGYW1pbHlOYW1lKTsKLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19NSURETEVfTkFNRSwgbVBob25ldGljTWlkZGxlTmFtZSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShtUGhvbmV0aWNGdWxsTmFtZSkpIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19HSVZFTl9OQU1FLCBtUGhvbmV0aWNGdWxsTmFtZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKFN0cnVjdHVyZWROYW1lLkRJU1BMQVlfTkFNRSwgZ2V0RGlzcGxheU5hbWUoKSk7Ci0gICAgICAgICAgICBvcGVyYXRpb25MaXN0LmFkZChidWlsZGVyLmJ1aWxkKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1OaWNrTmFtZUxpc3QgIT0gbnVsbCAmJiBtTmlja05hbWVMaXN0LnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIGZvciAoU3RyaW5nIG5pY2tOYW1lIDogbU5pY2tOYW1lTGlzdCkgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIgPSBDb250ZW50UHJvdmlkZXJPcGVyYXRpb24ubmV3SW5zZXJ0KERhdGEuQ09OVEVOVF9VUkkpOwotICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlQmFja1JlZmVyZW5jZShOaWNrbmFtZS5SQVdfQ09OVEFDVF9JRCwgMCk7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoRGF0YS5NSU1FVFlQRSwgTmlja25hbWUuQ09OVEVOVF9JVEVNX1RZUEUpOwotICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKE5pY2tuYW1lLlRZUEUsIE5pY2tuYW1lLlRZUEVfREVGQVVMVCk7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoTmlja25hbWUuTkFNRSwgbmlja05hbWUpOwotICAgICAgICAgICAgICAgIG9wZXJhdGlvbkxpc3QuYWRkKGJ1aWxkZXIuYnVpbGQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobVBob25lTGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKFBob25lRGF0YSBwaG9uZURhdGEgOiBtUGhvbmVMaXN0KSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlciA9IENvbnRlbnRQcm92aWRlck9wZXJhdGlvbi5uZXdJbnNlcnQoRGF0YS5DT05URU5UX1VSSSk7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWVCYWNrUmVmZXJlbmNlKFBob25lLlJBV19DT05UQUNUX0lELCAwKTsKLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShEYXRhLk1JTUVUWVBFLCBQaG9uZS5DT05URU5UX0lURU1fVFlQRSk7Ci0KLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShQaG9uZS5UWVBFLCBwaG9uZURhdGEudHlwZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHBob25lRGF0YS50eXBlID09IFBob25lLlRZUEVfQ1VTVE9NKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKFBob25lLkxBQkVMLCBwaG9uZURhdGEubGFiZWwpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShQaG9uZS5OVU1CRVIsIHBob25lRGF0YS5kYXRhKTsKLSAgICAgICAgICAgICAgICBpZiAocGhvbmVEYXRhLmlzUHJpbWFyeSkgewotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShQaG9uZS5JU19QUklNQVJZLCAxKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgb3BlcmF0aW9uTGlzdC5hZGQoYnVpbGRlci5idWlsZCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtT3JnYW5pemF0aW9uTGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKE9yZ2FuaXphdGlvbkRhdGEgb3JnYW5pemF0aW9uRGF0YSA6IG1Pcmdhbml6YXRpb25MaXN0KSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlciA9IENvbnRlbnRQcm92aWRlck9wZXJhdGlvbi5uZXdJbnNlcnQoRGF0YS5DT05URU5UX1VSSSk7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWVCYWNrUmVmZXJlbmNlKE9yZ2FuaXphdGlvbi5SQVdfQ09OVEFDVF9JRCwgMCk7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoRGF0YS5NSU1FVFlQRSwgT3JnYW5pemF0aW9uLkNPTlRFTlRfSVRFTV9UWVBFKTsKLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShPcmdhbml6YXRpb24uVFlQRSwgb3JnYW5pemF0aW9uRGF0YS50eXBlKTsKLSAgICAgICAgICAgICAgICBpZiAob3JnYW5pemF0aW9uRGF0YS5jb21wYW55TmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKE9yZ2FuaXphdGlvbi5DT01QQU5ZLCBvcmdhbml6YXRpb25EYXRhLmNvbXBhbnlOYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG9yZ2FuaXphdGlvbkRhdGEuZGVwYXJ0bWVudE5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShPcmdhbml6YXRpb24uREVQQVJUTUVOVCwgb3JnYW5pemF0aW9uRGF0YS5kZXBhcnRtZW50TmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChvcmdhbml6YXRpb25EYXRhLnRpdGxlTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKE9yZ2FuaXphdGlvbi5USVRMRSwgb3JnYW5pemF0aW9uRGF0YS50aXRsZU5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAob3JnYW5pemF0aW9uRGF0YS5pc1ByaW1hcnkpIHsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoT3JnYW5pemF0aW9uLklTX1BSSU1BUlksIDEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBvcGVyYXRpb25MaXN0LmFkZChidWlsZGVyLmJ1aWxkKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1FbWFpbExpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChFbWFpbERhdGEgZW1haWxEYXRhIDogbUVtYWlsTGlzdCkgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIgPSBDb250ZW50UHJvdmlkZXJPcGVyYXRpb24ubmV3SW5zZXJ0KERhdGEuQ09OVEVOVF9VUkkpOwotICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlQmFja1JlZmVyZW5jZShFbWFpbC5SQVdfQ09OVEFDVF9JRCwgMCk7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoRGF0YS5NSU1FVFlQRSwgRW1haWwuQ09OVEVOVF9JVEVNX1RZUEUpOwotCi0gICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoRW1haWwuVFlQRSwgZW1haWxEYXRhLnR5cGUpOwotICAgICAgICAgICAgICAgIGlmIChlbWFpbERhdGEudHlwZSA9PSBFbWFpbC5UWVBFX0NVU1RPTSkgewotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShFbWFpbC5MQUJFTCwgZW1haWxEYXRhLmxhYmVsKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoRW1haWwuREFUQSwgZW1haWxEYXRhLmRhdGEpOwotICAgICAgICAgICAgICAgIGlmIChlbWFpbERhdGEuaXNQcmltYXJ5KSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKERhdGEuSVNfUFJJTUFSWSwgMSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG9wZXJhdGlvbkxpc3QuYWRkKGJ1aWxkZXIuYnVpbGQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobVBvc3RhbExpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChQb3N0YWxEYXRhIHBvc3RhbERhdGEgOiBtUG9zdGFsTGlzdCkgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIgPSBDb250ZW50UHJvdmlkZXJPcGVyYXRpb24ubmV3SW5zZXJ0KERhdGEuQ09OVEVOVF9VUkkpOwotICAgICAgICAgICAgICAgIFZDYXJkVXRpbHMuaW5zZXJ0U3RydWN0dXJlZFBvc3RhbERhdGFVc2luZ0NvbnRhY3RzU3RydWN0KAotICAgICAgICAgICAgICAgICAgICAgICAgbVZDYXJkVHlwZSwgYnVpbGRlciwgcG9zdGFsRGF0YSk7Ci0gICAgICAgICAgICAgICAgb3BlcmF0aW9uTGlzdC5hZGQoYnVpbGRlci5idWlsZCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtSW1MaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoSW1EYXRhIGltRGF0YSA6IG1JbUxpc3QpIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyID0gQ29udGVudFByb3ZpZGVyT3BlcmF0aW9uLm5ld0luc2VydChEYXRhLkNPTlRFTlRfVVJJKTsKLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZUJhY2tSZWZlcmVuY2UoSW0uUkFXX0NPTlRBQ1RfSUQsIDApOwotICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKERhdGEuTUlNRVRZUEUsIEltLkNPTlRFTlRfSVRFTV9UWVBFKTsKLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShJbS5UWVBFLCBpbURhdGEudHlwZSk7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoSW0uUFJPVE9DT0wsIGltRGF0YS5wcm90b2NvbCk7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoSW0uREFUQSwgaW1EYXRhLmRhdGEpOwotICAgICAgICAgICAgICAgIGlmIChpbURhdGEucHJvdG9jb2wgPT0gSW0uUFJPVE9DT0xfQ1VTVE9NKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKEltLkNVU1RPTV9QUk9UT0NPTCwgaW1EYXRhLmN1c3RvbVByb3RvY29sKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGltRGF0YS5pc1ByaW1hcnkpIHsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoRGF0YS5JU19QUklNQVJZLCAxKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgb3BlcmF0aW9uTGlzdC5hZGQoYnVpbGRlci5idWlsZCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtTm90ZUxpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChTdHJpbmcgbm90ZSA6IG1Ob3RlTGlzdCkgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIgPSBDb250ZW50UHJvdmlkZXJPcGVyYXRpb24ubmV3SW5zZXJ0KERhdGEuQ09OVEVOVF9VUkkpOwotICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlQmFja1JlZmVyZW5jZShOb3RlLlJBV19DT05UQUNUX0lELCAwKTsKLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShEYXRhLk1JTUVUWVBFLCBOb3RlLkNPTlRFTlRfSVRFTV9UWVBFKTsKLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShOb3RlLk5PVEUsIG5vdGUpOwotICAgICAgICAgICAgICAgIG9wZXJhdGlvbkxpc3QuYWRkKGJ1aWxkZXIuYnVpbGQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobVBob3RvTGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKFBob3RvRGF0YSBwaG90b0RhdGEgOiBtUGhvdG9MaXN0KSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlciA9IENvbnRlbnRQcm92aWRlck9wZXJhdGlvbi5uZXdJbnNlcnQoRGF0YS5DT05URU5UX1VSSSk7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWVCYWNrUmVmZXJlbmNlKFBob3RvLlJBV19DT05UQUNUX0lELCAwKTsKLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShEYXRhLk1JTUVUWVBFLCBQaG90by5DT05URU5UX0lURU1fVFlQRSk7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoUGhvdG8uUEhPVE8sIHBob3RvRGF0YS5waG90b0J5dGVzKTsKLSAgICAgICAgICAgICAgICBpZiAocGhvdG9EYXRhLmlzUHJpbWFyeSkgewotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShQaG90by5JU19QUklNQVJZLCAxKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgb3BlcmF0aW9uTGlzdC5hZGQoYnVpbGRlci5idWlsZCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtV2Vic2l0ZUxpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChTdHJpbmcgd2Vic2l0ZSA6IG1XZWJzaXRlTGlzdCkgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIgPSBDb250ZW50UHJvdmlkZXJPcGVyYXRpb24ubmV3SW5zZXJ0KERhdGEuQ09OVEVOVF9VUkkpOwotICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlQmFja1JlZmVyZW5jZShXZWJzaXRlLlJBV19DT05UQUNUX0lELCAwKTsKLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShEYXRhLk1JTUVUWVBFLCBXZWJzaXRlLkNPTlRFTlRfSVRFTV9UWVBFKTsKLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShXZWJzaXRlLlVSTCwgd2Vic2l0ZSk7Ci0gICAgICAgICAgICAgICAgLy8gVGhlcmUncyBubyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdHlwZSBvZiBVUkwgaW4gdkNhcmQuCi0gICAgICAgICAgICAgICAgLy8gV2UgdXNlIFRZUEVfSE9NRVBBR0UgZm9yIHNhZmV0eS4KLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShXZWJzaXRlLlRZUEUsIFdlYnNpdGUuVFlQRV9IT01FUEFHRSk7Ci0gICAgICAgICAgICAgICAgb3BlcmF0aW9uTGlzdC5hZGQoYnVpbGRlci5idWlsZCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkobUJpcnRoZGF5KSkgewotICAgICAgICAgICAgYnVpbGRlciA9IENvbnRlbnRQcm92aWRlck9wZXJhdGlvbi5uZXdJbnNlcnQoRGF0YS5DT05URU5UX1VSSSk7Ci0gICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZUJhY2tSZWZlcmVuY2UoRXZlbnQuUkFXX0NPTlRBQ1RfSUQsIDApOwotICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoRGF0YS5NSU1FVFlQRSwgRXZlbnQuQ09OVEVOVF9JVEVNX1RZUEUpOwotICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoRXZlbnQuU1RBUlRfREFURSwgbUJpcnRoZGF5KTsKLSAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKEV2ZW50LlRZUEUsIEV2ZW50LlRZUEVfQklSVEhEQVkpOwotICAgICAgICAgICAgb3BlcmF0aW9uTGlzdC5hZGQoYnVpbGRlci5idWlsZCgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtQW5kcm9pZEN1c3RvbVByb3BlcnR5TGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKExpc3Q8U3RyaW5nPiBjdXN0b21Qcm9wZXJ0eUxpc3QgOiBtQW5kcm9pZEN1c3RvbVByb3BlcnR5TGlzdCkgewotICAgICAgICAgICAgICAgIGludCBzaXplID0gY3VzdG9tUHJvcGVydHlMaXN0LnNpemUoKTsKLSAgICAgICAgICAgICAgICBpZiAoc2l6ZSA8IDIgfHwgVGV4dFV0aWxzLmlzRW1wdHkoY3VzdG9tUHJvcGVydHlMaXN0LmdldCgwKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzaXplID4gVkNhcmRDb25zdGFudHMuTUFYX0RBVEFfQ09MVU1OICsgMSkgewotICAgICAgICAgICAgICAgICAgICBzaXplID0gVkNhcmRDb25zdGFudHMuTUFYX0RBVEFfQ09MVU1OICsgMTsKLSAgICAgICAgICAgICAgICAgICAgY3VzdG9tUHJvcGVydHlMaXN0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGN1c3RvbVByb3BlcnR5TGlzdC5zdWJMaXN0KDAsIFZDYXJkQ29uc3RhbnRzLk1BWF9EQVRBX0NPTFVNTiArIDIpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGludCBpID0gMDsKLSAgICAgICAgICAgICAgICBmb3IgKGZpbmFsIFN0cmluZyBjdXN0b21Qcm9wZXJ0eVZhbHVlIDogY3VzdG9tUHJvcGVydHlMaXN0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtaW1lVHlwZSA9IGN1c3RvbVByb3BlcnR5VmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyID0gQ29udGVudFByb3ZpZGVyT3BlcmF0aW9uLm5ld0luc2VydChEYXRhLkNPTlRFTlRfVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlQmFja1JlZmVyZW5jZShHcm91cE1lbWJlcnNoaXAuUkFXX0NPTlRBQ1RfSUQsIDApOwotICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoRGF0YS5NSU1FVFlQRSwgbWltZVR5cGUpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeyAgLy8gMSA8PSBpICYmIGkgPD0gTUFYX0RBVEFfQ09MVU1OUwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShjdXN0b21Qcm9wZXJ0eVZhbHVlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKCJkYXRhIiArIGksIGN1c3RvbVByb3BlcnR5VmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaSsrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBvcGVyYXRpb25MaXN0LmFkZChidWlsZGVyLmJ1aWxkKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG15R3JvdXBzSWQgIT0gbnVsbCkgewotICAgICAgICAgICAgYnVpbGRlciA9IENvbnRlbnRQcm92aWRlck9wZXJhdGlvbi5uZXdJbnNlcnQoRGF0YS5DT05URU5UX1VSSSk7Ci0gICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZUJhY2tSZWZlcmVuY2UoR3JvdXBNZW1iZXJzaGlwLlJBV19DT05UQUNUX0lELCAwKTsKLSAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKERhdGEuTUlNRVRZUEUsIEdyb3VwTWVtYmVyc2hpcC5DT05URU5UX0lURU1fVFlQRSk7Ci0gICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShHcm91cE1lbWJlcnNoaXAuR1JPVVBfU09VUkNFX0lELCBteUdyb3Vwc0lkKTsKLSAgICAgICAgICAgIG9wZXJhdGlvbkxpc3QuYWRkKGJ1aWxkZXIuYnVpbGQoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgQ29udGVudFByb3ZpZGVyUmVzdWx0W10gcmVzdWx0cyA9IHJlc29sdmVyLmFwcGx5QmF0Y2goCi0gICAgICAgICAgICAgICAgICAgICAgICBDb250YWN0c0NvbnRyYWN0LkFVVEhPUklUWSwgb3BlcmF0aW9uTGlzdCk7Ci0gICAgICAgICAgICAvLyB0aGUgZmlyc3QgcmVzdWx0IGlzIGFsd2F5cyB0aGUgcmF3X2NvbnRhY3QuIHJldHVybiBpdCdzIHVyaSBzbwotICAgICAgICAgICAgLy8gdGhhdCBpdCBjYW4gYmUgZm91bmQgbGF0ZXIuIGRvIG51bGwgY2hlY2tpbmcgZm9yIGJhZGx5IGJlaGF2aW5nCi0gICAgICAgICAgICAvLyBDb250ZW50UmVzb2x2ZXJzCi0gICAgICAgICAgICByZXR1cm4gKHJlc3VsdHMgPT0gbnVsbCB8fCByZXN1bHRzLmxlbmd0aCA9PSAwIHx8IHJlc3VsdHNbMF0gPT0gbnVsbCkKLSAgICAgICAgICAgICAgICA/IG51bGwKLSAgICAgICAgICAgICAgICA6IHJlc3VsdHNbMF0udXJpOwotICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgU3RyaW5nLmZvcm1hdCgiJXM6ICVzIiwgZS50b1N0cmluZygpLCBlLmdldE1lc3NhZ2UoKSkpOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0gY2F0Y2ggKE9wZXJhdGlvbkFwcGxpY2F0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy5lKExPR19UQUcsIFN0cmluZy5mb3JtYXQoIiVzOiAlcyIsIGUudG9TdHJpbmcoKSwgZS5nZXRNZXNzYWdlKCkpKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBWQ2FyZEVudHJ5IGJ1aWxkRnJvbVJlc29sdmVyKENvbnRlbnRSZXNvbHZlciByZXNvbHZlcikgewotICAgICAgICByZXR1cm4gYnVpbGRGcm9tUmVzb2x2ZXIocmVzb2x2ZXIsIENvbnRhY3RzLkNPTlRFTlRfVVJJKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFZDYXJkRW50cnkgYnVpbGRGcm9tUmVzb2x2ZXIoQ29udGVudFJlc29sdmVyIHJlc29sdmVyLCBVcmkgdXJpKSB7Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIG5hbWVGaWVsZHNBcmVFbXB0eSgpIHsKLSAgICAgICAgcmV0dXJuIChUZXh0VXRpbHMuaXNFbXB0eShtRmFtaWx5TmFtZSkKLSAgICAgICAgICAgICAgICAmJiBUZXh0VXRpbHMuaXNFbXB0eShtTWlkZGxlTmFtZSkKLSAgICAgICAgICAgICAgICAmJiBUZXh0VXRpbHMuaXNFbXB0eShtR2l2ZW5OYW1lKQotICAgICAgICAgICAgICAgICYmIFRleHRVdGlscy5pc0VtcHR5KG1QcmVmaXgpCi0gICAgICAgICAgICAgICAgJiYgVGV4dFV0aWxzLmlzRW1wdHkobVN1ZmZpeCkKLSAgICAgICAgICAgICAgICAmJiBUZXh0VXRpbHMuaXNFbXB0eShtRnVsbE5hbWUpCi0gICAgICAgICAgICAgICAgJiYgVGV4dFV0aWxzLmlzRW1wdHkobVBob25ldGljRmFtaWx5TmFtZSkKLSAgICAgICAgICAgICAgICAmJiBUZXh0VXRpbHMuaXNFbXB0eShtUGhvbmV0aWNNaWRkbGVOYW1lKQotICAgICAgICAgICAgICAgICYmIFRleHRVdGlscy5pc0VtcHR5KG1QaG9uZXRpY0dpdmVuTmFtZSkKLSAgICAgICAgICAgICAgICAmJiBUZXh0VXRpbHMuaXNFbXB0eShtUGhvbmV0aWNGdWxsTmFtZSkpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzSWdub3JhYmxlKCkgewotICAgICAgICByZXR1cm4gZ2V0RGlzcGxheU5hbWUoKS5sZW5ndGgoKSA9PSAwOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGxpc3RUb1N0cmluZyhMaXN0PFN0cmluZz4gbGlzdCl7Ci0gICAgICAgIGZpbmFsIGludCBzaXplID0gbGlzdC5zaXplKCk7Ci0gICAgICAgIGlmIChzaXplID4gMSkgewotICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgIGludCBpID0gMDsKLSAgICAgICAgICAgIGZvciAoU3RyaW5nIHR5cGUgOiBsaXN0KSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQodHlwZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGkgPCBzaXplIC0gMSkgewotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiOyIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc2l6ZSA9PSAxKSB7Ci0gICAgICAgICAgICByZXR1cm4gbGlzdC5nZXQoMCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gIiI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBBbGwgZ2V0dGVyIG1ldGhvZHMgc2hvdWxkIGJlIHVzZWQgY2FyZWZ1bGx5LCBzaW5jZSB0aGV5IG1heSBjaGFuZ2UKLSAgICAvLyBpbiB0aGUgZnV0dXJlIGFzIG9mIDIwMDktMTAtMDUsIG9uIHdoaWNoIEkgY2Fubm90IGJlIHN1cmUgdGhpcyBzdHJ1Y3R1cmUKLSAgICAvLyBpcyBjb21wbGV0ZWx5IGNvbnNvbGlkYXRlZC4KLSAgICAvLwotICAgIC8vIEFsc28gbm90ZSB0aGF0IHRoZXNlIGdldHRlciBtZXRob2RzIHNob3VsZCBiZSB1c2VkIG9ubHkgYWZ0ZXIKLSAgICAvLyBhbGwgcHJvcGVydGllcyBiZWluZyBwdXNoZWQgaW50byB0aGlzIG9iamVjdC4gSWYgbm90LCBpbmNvcnJlY3QKLSAgICAvLyB2YWx1ZSB3aWxsICJiZSBzdG9yZWQgaW4gdGhlIGxvY2FsIGNhY2hlIGFuZCIgYmUgcmV0dXJuZWQgdG8geW91LgotCi0gICAgcHVibGljIFN0cmluZyBnZXRGYW1pbHlOYW1lKCkgewotICAgICAgICByZXR1cm4gbUZhbWlseU5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRHaXZlbk5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBtR2l2ZW5OYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWlkZGxlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG1NaWRkbGVOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4KCkgewotICAgICAgICByZXR1cm4gbVByZWZpeDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFN1ZmZpeCgpIHsKLSAgICAgICAgcmV0dXJuIG1TdWZmaXg7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRGdWxsTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG1GdWxsTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBob25ldGljRmFtaWx5TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG1QaG9uZXRpY0ZhbWlseU5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQaG9uZXRpY0dpdmVuTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG1QaG9uZXRpY0dpdmVuTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBob25ldGljTWlkZGxlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG1QaG9uZXRpY01pZGRsZU5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQaG9uZXRpY0Z1bGxOYW1lKCkgewotICAgICAgICByZXR1cm4gbVBob25ldGljRnVsbE5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIExpc3Q8U3RyaW5nPiBnZXROaWNrTmFtZUxpc3QoKSB7Ci0gICAgICAgIHJldHVybiBtTmlja05hbWVMaXN0OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QmlydGhkYXkoKSB7Ci0gICAgICAgIHJldHVybiBtQmlydGhkYXk7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIExpc3Q8U3RyaW5nPiBnZXROb3RlcygpIHsKLSAgICAgICAgcmV0dXJuIG1Ob3RlTGlzdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgTGlzdDxQaG9uZURhdGE+IGdldFBob25lTGlzdCgpIHsKLSAgICAgICAgcmV0dXJuIG1QaG9uZUxpc3Q7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIExpc3Q8RW1haWxEYXRhPiBnZXRFbWFpbExpc3QoKSB7Ci0gICAgICAgIHJldHVybiBtRW1haWxMaXN0OwotICAgIH0KLQotICAgIHB1YmxpYyBmaW5hbCBMaXN0PFBvc3RhbERhdGE+IGdldFBvc3RhbExpc3QoKSB7Ci0gICAgICAgIHJldHVybiBtUG9zdGFsTGlzdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgTGlzdDxPcmdhbml6YXRpb25EYXRhPiBnZXRPcmdhbml6YXRpb25MaXN0KCkgewotICAgICAgICByZXR1cm4gbU9yZ2FuaXphdGlvbkxpc3Q7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIExpc3Q8SW1EYXRhPiBnZXRJbUxpc3QoKSB7Ci0gICAgICAgIHJldHVybiBtSW1MaXN0OwotICAgIH0KLQotICAgIHB1YmxpYyBmaW5hbCBMaXN0PFBob3RvRGF0YT4gZ2V0UGhvdG9MaXN0KCkgewotICAgICAgICByZXR1cm4gbVBob3RvTGlzdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgTGlzdDxTdHJpbmc+IGdldFdlYnNpdGVMaXN0KCkgewotICAgICAgICByZXR1cm4gbVdlYnNpdGVMaXN0OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGlzcGxheU5hbWUoKSB7Ci0gICAgICAgIGlmIChtRGlzcGxheU5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgY29uc3RydWN0RGlzcGxheU5hbWUoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbURpc3BsYXlOYW1lOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZEVudHJ5Q29tbWl0dGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRFbnRyeUNvbW1pdHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OWEyYmFmLi4wMDAwMDAwCi0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZEVudHJ5Q29tbWl0dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQ7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyOwotaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotLyoqCi0gKiA8UD4KLSAqIHtAbGluayBWQ2FyZEVudHJ5SGFuZGxlcn0gaW1wbGVtZW50YXRpb24gd2hpY2ggY29tbWl0cyB0aGUgZW50cnkgdG8gQ29udGVudFJlc29sdmVyLgotICogPC9QPgotICogPFA+Ci0gKiBOb3RlOjxCUiAvPgotICogRWFjaCB2Q2FyZCBtYXkgY29udGFpbiBiaWcgcGhvdG8gaW1hZ2VzIGVuY29kZWQgYnkgQkFTRTY0LAotICogSWYgd2Ugc3RvcmUgYWxsIHZDYXJkIGVudHJpZXMgaW4gbWVtb3J5LCBPdXRPZk1lbW9yeUVycm9yIG1heSBiZSB0aHJvd24uCi0gKiBUaHVzLCB0aGlzIGNsYXNzIHB1c2ggZWFjaCBWQ2FyZCBlbnRyeSBpbnRvIENvbnRlbnRSZXNvbHZlciBpbW1lZGlhdGVseS4KLSAqIDwvUD4KLSAqLwotcHVibGljIGNsYXNzIFZDYXJkRW50cnlDb21taXR0ZXIgaW1wbGVtZW50cyBWQ2FyZEVudHJ5SGFuZGxlciB7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgTE9HX1RBRyA9ICJWQ2FyZEVudHJ5Q29taXR0ZXIiOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBDb250ZW50UmVzb2x2ZXIgbUNvbnRlbnRSZXNvbHZlcjsKLSAgICBwcml2YXRlIGxvbmcgbVRpbWVUb0NvbW1pdDsKLSAgICBwcml2YXRlIEFycmF5TGlzdDxVcmk+IG1DcmVhdGVkVXJpcyA9IG5ldyBBcnJheUxpc3Q8VXJpPigpOwotCi0gICAgcHVibGljIFZDYXJkRW50cnlDb21taXR0ZXIoQ29udGVudFJlc29sdmVyIHJlc29sdmVyKSB7Ci0gICAgICAgIG1Db250ZW50UmVzb2x2ZXIgPSByZXNvbHZlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBvblN0YXJ0KCkgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG9uRW5kKCkgewotICAgICAgICBpZiAoVkNhcmRDb25maWcuc2hvd1BlcmZvcm1hbmNlTG9nKCkpIHsKLSAgICAgICAgICAgIExvZy5kKExPR19UQUcsIFN0cmluZy5mb3JtYXQoInRpbWUgdG8gY29tbWl0IGVudHJpZXM6ICVkIG1zIiwgbVRpbWVUb0NvbW1pdCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgb25FbnRyeUNyZWF0ZWQoZmluYWwgVkNhcmRFbnRyeSBjb250YWN0U3RydWN0KSB7Ci0gICAgICAgIGxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgbUNyZWF0ZWRVcmlzLmFkZChjb250YWN0U3RydWN0LnB1c2hJbnRvQ29udGVudFJlc29sdmVyKG1Db250ZW50UmVzb2x2ZXIpKTsKLSAgICAgICAgbVRpbWVUb0NvbW1pdCArPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGxpc3Qgb2YgY3JlYXRlZCBVcmlzLiBUaGlzIGxpc3Qgc2hvdWxkIG5vdCBiZSBtb2RpZmllZCBieSB0aGUgY2FsbGVyIGFzIGl0IGlzCi0gICAgICogbm90IGEgY2xvbmUuCi0gICAgICovCi0gICBwdWJsaWMgQXJyYXlMaXN0PFVyaT4gZ2V0Q3JlYXRlZFVyaXMoKSB7Ci0gICAgICAgIHJldHVybiBtQ3JlYXRlZFVyaXM7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZEVudHJ5Q29uc3RydWN0b3IuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZEVudHJ5Q29uc3RydWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWU0ZWMyOS4uMDAwMDAwMAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRFbnRyeUNvbnN0cnVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkOwotCi1pbXBvcnQgYW5kcm9pZC5hY2NvdW50cy5BY2NvdW50OwotaW1wb3J0IGFuZHJvaWQudXRpbC5DaGFyc2V0VXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2RlYy5EZWNvZGVyRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2RlYy5iaW5hcnkuQmFzZTY0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2RlYy5uZXQuUXVvdGVkUHJpbnRhYmxlQ29kZWM7Ci0KLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotcHVibGljIGNsYXNzIFZDYXJkRW50cnlDb25zdHJ1Y3RvciBpbXBsZW1lbnRzIFZDYXJkSW50ZXJwcmV0ZXIgewotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBMT0dfVEFHID0gIlZDYXJkRW50cnlDb25zdHJ1Y3RvciI7Ci0KLSAgICAvKioKLSAgICAgKiBJZiB0aGVyZSdzIG5vIG90aGVyIGluZm9ybWF0aW9uIGF2YWlsYWJsZSwgdGhpcyBjbGFzcyB1c2VzIHRoaXMgY2hhcnNldCBmb3IgZW5jb2RpbmcKLSAgICAgKiBieXRlIGFycmF5cyB0byBTdHJpbmcuCi0gICAgICovCi0gICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfQ0hBUlNFVF9GT1JfREVDT0RFRF9CWVRFUyA9ICJVVEYtOCI7Ci0KLSAgICBwcml2YXRlIFZDYXJkRW50cnkuUHJvcGVydHkgbUN1cnJlbnRQcm9wZXJ0eSA9IG5ldyBWQ2FyZEVudHJ5LlByb3BlcnR5KCk7Ci0gICAgcHJpdmF0ZSBWQ2FyZEVudHJ5IG1DdXJyZW50Q29udGFjdFN0cnVjdDsKLSAgICBwcml2YXRlIFN0cmluZyBtUGFyYW1UeXBlOwotICAgIAotICAgIC8qKgotICAgICAqIFRoZSBjaGFyc2V0IHVzaW5nIHdoaWNoIHtAbGluayBWQ2FyZEludGVycHJldGVyfSBwYXJzZXMgdGhlIHRleHQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgbUlucHV0Q2hhcnNldDsKLQotICAgIC8qKgotICAgICAqIFRoZSBjaGFyc2V0IHdpdGggd2hpY2ggYnl0ZSBhcnJheSBpcyBlbmNvZGVkIHRvIFN0cmluZy4KLSAgICAgKi8KLSAgICBmaW5hbCBwcml2YXRlIFN0cmluZyBtQ2hhcnNldEZvckRlY29kZWRCeXRlczsKLSAgICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gbVN0cmljdExpbmVCcmVha1BhcnNpbmc7Ci0gICAgZmluYWwgcHJpdmF0ZSBpbnQgbVZDYXJkVHlwZTsKLSAgICBmaW5hbCBwcml2YXRlIEFjY291bnQgbUFjY291bnQ7Ci0gICAgCi0gICAgLyoqIEZvciBtZWFzdXJpbmcgcGVyZm9ybWFuY2UuICovCi0gICAgcHJpdmF0ZSBsb25nIG1UaW1lUHVzaEludG9Db250ZW50UmVzb2x2ZXI7Ci0KLSAgICBmaW5hbCBwcml2YXRlIExpc3Q8VkNhcmRFbnRyeUhhbmRsZXI+IG1FbnRyeUhhbmRsZXJzID0gbmV3IEFycmF5TGlzdDxWQ2FyZEVudHJ5SGFuZGxlcj4oKTsKLQotICAgIHB1YmxpYyBWQ2FyZEVudHJ5Q29uc3RydWN0b3IoKSB7Ci0gICAgICAgIHRoaXMobnVsbCwgbnVsbCwgZmFsc2UsIFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfVjIxX0dFTkVSSUNfVVRGOCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIFZDYXJkRW50cnlDb25zdHJ1Y3RvcihmaW5hbCBpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIHRoaXMobnVsbCwgbnVsbCwgZmFsc2UsIHZjYXJkVHlwZSwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIFZDYXJkRW50cnlDb25zdHJ1Y3RvcihmaW5hbCBTdHJpbmcgY2hhcnNldCwgZmluYWwgYm9vbGVhbiBzdHJpY3RMaW5lQnJlYWtQYXJzaW5nLAotICAgICAgICAgICAgZmluYWwgaW50IHZjYXJkVHlwZSwgZmluYWwgQWNjb3VudCBhY2NvdW50KSB7Ci0gICAgICAgIHRoaXMobnVsbCwgY2hhcnNldCwgc3RyaWN0TGluZUJyZWFrUGFyc2luZywgdmNhcmRUeXBlLCBhY2NvdW50KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVkNhcmRFbnRyeUNvbnN0cnVjdG9yKGZpbmFsIFN0cmluZyBpbnB1dENoYXJzZXQsIGZpbmFsIFN0cmluZyBjaGFyc2V0Rm9yRGV0b2RlZEJ5dGVzLAotICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBzdHJpY3RMaW5lQnJlYWtQYXJzaW5nLCBmaW5hbCBpbnQgdmNhcmRUeXBlLAotICAgICAgICAgICAgZmluYWwgQWNjb3VudCBhY2NvdW50KSB7Ci0gICAgICAgIGlmIChpbnB1dENoYXJzZXQgIT0gbnVsbCkgewotICAgICAgICAgICAgbUlucHV0Q2hhcnNldCA9IGlucHV0Q2hhcnNldDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1JbnB1dENoYXJzZXQgPSBWQ2FyZENvbmZpZy5ERUZBVUxUX0NIQVJTRVQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNoYXJzZXRGb3JEZXRvZGVkQnl0ZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgbUNoYXJzZXRGb3JEZWNvZGVkQnl0ZXMgPSBjaGFyc2V0Rm9yRGV0b2RlZEJ5dGVzOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUNoYXJzZXRGb3JEZWNvZGVkQnl0ZXMgPSBERUZBVUxUX0NIQVJTRVRfRk9SX0RFQ09ERURfQllURVM7Ci0gICAgICAgIH0KLSAgICAgICAgbVN0cmljdExpbmVCcmVha1BhcnNpbmcgPSBzdHJpY3RMaW5lQnJlYWtQYXJzaW5nOwotICAgICAgICBtVkNhcmRUeXBlID0gdmNhcmRUeXBlOwotICAgICAgICBtQWNjb3VudCA9IGFjY291bnQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkRW50cnlIYW5kbGVyKFZDYXJkRW50cnlIYW5kbGVyIGVudHJ5SGFuZGxlcikgewotICAgICAgICBtRW50cnlIYW5kbGVycy5hZGQoZW50cnlIYW5kbGVyKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc3RhcnQoKSB7Ci0gICAgICAgIGZvciAoVkNhcmRFbnRyeUhhbmRsZXIgZW50cnlIYW5kbGVyIDogbUVudHJ5SGFuZGxlcnMpIHsKLSAgICAgICAgICAgIGVudHJ5SGFuZGxlci5vblN0YXJ0KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBlbmQoKSB7Ci0gICAgICAgIGZvciAoVkNhcmRFbnRyeUhhbmRsZXIgZW50cnlIYW5kbGVyIDogbUVudHJ5SGFuZGxlcnMpIHsKLSAgICAgICAgICAgIGVudHJ5SGFuZGxlci5vbkVuZCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIHdoZW4gdGhlIHBhcnNlIGZhaWxlZCBiZXR3ZWVuIHtAbGluayAjc3RhcnRFbnRyeSgpfSBhbmQge0BsaW5rICNlbmRFbnRyeSgpfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKLSAgICAgICAgbUN1cnJlbnRDb250YWN0U3RydWN0ID0gbnVsbDsKLSAgICAgICAgbUN1cnJlbnRQcm9wZXJ0eSA9IG5ldyBWQ2FyZEVudHJ5LlByb3BlcnR5KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQXNzdW1lIHRoYXQgVkNhcmQgaXMgbm90IG5lc3RlZC4gSW4gb3RoZXIgd29yZHMsIHRoaXMgY29kZSBkb2VzIG5vdCBhY2NlcHQgCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc3RhcnRFbnRyeSgpIHsKLSAgICAgICAgaWYgKG1DdXJyZW50Q29udGFjdFN0cnVjdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiTmVzdGVkIFZDYXJkIGNvZGUgaXMgbm90IHN1cHBvcnRlZCBub3cuIik7Ci0gICAgICAgIH0KLSAgICAgICAgbUN1cnJlbnRDb250YWN0U3RydWN0ID0gbmV3IFZDYXJkRW50cnkobVZDYXJkVHlwZSwgbUFjY291bnQpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGVuZEVudHJ5KCkgewotICAgICAgICBtQ3VycmVudENvbnRhY3RTdHJ1Y3QuY29uc29saWRhdGVGaWVsZHMoKTsKLSAgICAgICAgZm9yIChWQ2FyZEVudHJ5SGFuZGxlciBlbnRyeUhhbmRsZXIgOiBtRW50cnlIYW5kbGVycykgewotICAgICAgICAgICAgZW50cnlIYW5kbGVyLm9uRW50cnlDcmVhdGVkKG1DdXJyZW50Q29udGFjdFN0cnVjdCk7Ci0gICAgICAgIH0KLSAgICAgICAgbUN1cnJlbnRDb250YWN0U3RydWN0ID0gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzdGFydFByb3BlcnR5KCkgewotICAgICAgICBtQ3VycmVudFByb3BlcnR5LmNsZWFyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZW5kUHJvcGVydHkoKSB7Ci0gICAgICAgIG1DdXJyZW50Q29udGFjdFN0cnVjdC5hZGRQcm9wZXJ0eShtQ3VycmVudFByb3BlcnR5KTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgcHJvcGVydHlOYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIG1DdXJyZW50UHJvcGVydHkuc2V0UHJvcGVydHlOYW1lKG5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5R3JvdXAoU3RyaW5nIGdyb3VwKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJvcGVydHlQYXJhbVR5cGUoU3RyaW5nIHR5cGUpIHsKLSAgICAgICAgaWYgKG1QYXJhbVR5cGUgIT0gbnVsbCkgewotICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgInByb3BlcnR5UGFyYW1UeXBlKCkgaXMgY2FsbGVkIG1vcmUgdGhhbiBvbmNlICIgKwotICAgICAgICAgICAgICAgICAgICAiYmVmb3JlIHByb3BlcnR5UGFyYW1WYWx1ZSgpIGlzIGNhbGxlZCIpOwotICAgICAgICB9Ci0gICAgICAgIG1QYXJhbVR5cGUgPSB0eXBlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5UGFyYW1WYWx1ZShTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgaWYgKG1QYXJhbVR5cGUgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gRnJvbSB2Q2FyZCAyLjEgc3BlY2lmaWNhdGlvbi4gdkNhcmQgMy4wIGZvcm1hbGx5IGRvZXMgbm90IGFsbG93IHRoaXMgY2FzZS4KLSAgICAgICAgICAgIG1QYXJhbVR5cGUgPSAiVFlQRSI7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFWQ2FyZFV0aWxzLmNvbnRhaW5zT25seUFscGhhRGlnaXRIeXBoZW4odmFsdWUpKSB7Ci0gICAgICAgICAgICB2YWx1ZSA9IGVuY29kZVN0cmluZyh2YWx1ZSwgbUNoYXJzZXRGb3JEZWNvZGVkQnl0ZXMpOwotICAgICAgICB9Ci0gICAgICAgIG1DdXJyZW50UHJvcGVydHkuYWRkUGFyYW1ldGVyKG1QYXJhbVR5cGUsIHZhbHVlKTsKLSAgICAgICAgbVBhcmFtVHlwZSA9IG51bGw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZW5jb2RlU3RyaW5nKFN0cmluZyBvcmlnaW5hbFN0cmluZywgU3RyaW5nIGNoYXJzZXRGb3JEZWNvZGVkQnl0ZXMpIHsKLSAgICAgICAgaWYgKG1JbnB1dENoYXJzZXQuZXF1YWxzSWdub3JlQ2FzZShjaGFyc2V0Rm9yRGVjb2RlZEJ5dGVzKSkgewotICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsU3RyaW5nOwotICAgICAgICB9Ci0gICAgICAgIENoYXJzZXQgY2hhcnNldCA9IENoYXJzZXQuZm9yTmFtZShtSW5wdXRDaGFyc2V0KTsKLSAgICAgICAgQnl0ZUJ1ZmZlciBieXRlQnVmZmVyID0gY2hhcnNldC5lbmNvZGUob3JpZ2luYWxTdHJpbmcpOwotICAgICAgICAvLyBieXRlQnVmZmVyLmFycmF5KCkgIm1heSIgcmV0dXJuIGJ5dGUgYXJyYXkgd2hpY2ggaXMgbGFyZ2VyIHRoYW4KLSAgICAgICAgLy8gYnl0ZUJ1ZmZlci5yZW1haW5pbmcoKS4gSGVyZSwgd2Uga2VlcCBvbiB0aGUgc2FmZSBzaWRlLgotICAgICAgICBieXRlW10gYnl0ZXMgPSBuZXcgYnl0ZVtieXRlQnVmZmVyLnJlbWFpbmluZygpXTsKLSAgICAgICAgYnl0ZUJ1ZmZlci5nZXQoYnl0ZXMpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoYnl0ZXMsIGNoYXJzZXRGb3JEZWNvZGVkQnl0ZXMpOwotICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJGYWlsZWQgdG8gZW5jb2RlOiBjaGFyc2V0PSIgKyBjaGFyc2V0Rm9yRGVjb2RlZEJ5dGVzKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgaGFuZGxlT25lVmFsdWUoU3RyaW5nIHZhbHVlLCBTdHJpbmcgY2hhcnNldEZvckRlY29kZWRCeXRlcywgU3RyaW5nIGVuY29kaW5nKSB7Ci0gICAgICAgIGlmIChlbmNvZGluZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoZW5jb2RpbmcuZXF1YWxzKCJCQVNFNjQiKSB8fCBlbmNvZGluZy5lcXVhbHMoIkIiKSkgewotICAgICAgICAgICAgICAgIG1DdXJyZW50UHJvcGVydHkuc2V0UHJvcGVydHlCeXRlcyhCYXNlNjQuZGVjb2RlQmFzZTY0KHZhbHVlLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGVuY29kaW5nLmVxdWFscygiUVVPVEVELVBSSU5UQUJMRSIpKSB7Ci0gICAgICAgICAgICAgICAgLy8gIj0gIiAtPiAiICIsICI9XHQiIC0+ICJcdCIuCi0gICAgICAgICAgICAgICAgLy8gUHJldmlvdXMgY29kZSBoYWQgZG9uZSB0aGlzIHJlcGxhY2VtZW50LiBLZWVwIG9uIHRoZSBzYWZlIHNpZGUuCi0gICAgICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgICAgICBpbnQgbGVuZ3RoID0gdmFsdWUubGVuZ3RoKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBjaGFyIGNoID0gdmFsdWUuY2hhckF0KGkpOwotICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJz0nICYmIGkgPCBsZW5ndGggLSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjaGFyIG5leHRDaCA9IHZhbHVlLmNoYXJBdChpICsgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV4dENoID09ICcgJyB8fCBuZXh0Q2ggPT0gJ1x0JykgewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQobmV4dENoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoY2gpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBTdHJpbmcgcXVvdGVkUHJpbnRhYmxlID0gYnVpbGRlci50b1N0cmluZygpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIFN0cmluZ1tdIGxpbmVzOwotICAgICAgICAgICAgICAgIGlmIChtU3RyaWN0TGluZUJyZWFrUGFyc2luZykgewotICAgICAgICAgICAgICAgICAgICBsaW5lcyA9IHF1b3RlZFByaW50YWJsZS5zcGxpdCgiXHJcbiIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgICAgICAgICBsZW5ndGggPSBxdW90ZWRQcmludGFibGUubGVuZ3RoKCk7Ci0gICAgICAgICAgICAgICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBjaCA9IHF1b3RlZFByaW50YWJsZS5jaGFyQXQoaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJ1xuJykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QuYWRkKGJ1aWxkZXIudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09ICdccicpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0LmFkZChidWlsZGVyLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpIDwgbGVuZ3RoIC0gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIG5leHRDaCA9IHF1b3RlZFByaW50YWJsZS5jaGFyQXQoaSArIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV4dENoID09ICdcbicpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoY2gpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBmaW5hbExpbmUgPSBidWlsZGVyLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmaW5hbExpbmUubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsaXN0LmFkZChmaW5hbExpbmUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGxpbmVzID0gbGlzdC50b0FycmF5KG5ldyBTdHJpbmdbMF0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBsaW5lIDogbGluZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxpbmUuZW5kc1dpdGgoIj0iKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbGluZSA9IGxpbmUuc3Vic3RyaW5nKDAsIGxpbmUubGVuZ3RoKCkgLSAxKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChsaW5lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnl0ZVtdIGJ5dGVzOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ5dGVzID0gYnVpbGRlci50b1N0cmluZygpLmdldEJ5dGVzKG1JbnB1dENoYXJzZXQpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZTEpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIkZhaWxlZCB0byBlbmNvZGU6IGNoYXJzZXQ9IiArIG1JbnB1dENoYXJzZXQpOwotICAgICAgICAgICAgICAgICAgICBieXRlcyA9IGJ1aWxkZXIudG9TdHJpbmcoKS5nZXRCeXRlcygpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBieXRlcyA9IFF1b3RlZFByaW50YWJsZUNvZGVjLmRlY29kZVF1b3RlZFByaW50YWJsZShieXRlcyk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoRGVjb2RlckV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJGYWlsZWQgdG8gZGVjb2RlIHF1b3RlZC1wcmludGFibGU6ICIgKyBlKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICIiOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nKGJ5dGVzLCBjaGFyc2V0Rm9yRGVjb2RlZEJ5dGVzKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIkZhaWxlZCB0byBlbmNvZGU6IGNoYXJzZXQ9IiArIGNoYXJzZXRGb3JEZWNvZGVkQnl0ZXMpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhieXRlcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gVW5rbm93biBlbmNvZGluZy4gRmFsbCBiYWNrIHRvIGRlZmF1bHQuCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGVuY29kZVN0cmluZyh2YWx1ZSwgY2hhcnNldEZvckRlY29kZWRCeXRlcyk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5VmFsdWVzKExpc3Q8U3RyaW5nPiB2YWx1ZXMpIHsKLSAgICAgICAgaWYgKHZhbHVlcyA9PSBudWxsIHx8IHZhbHVlcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIENvbGxlY3Rpb248U3RyaW5nPiBjaGFyc2V0Q29sbGVjdGlvbiA9IG1DdXJyZW50UHJvcGVydHkuZ2V0UGFyYW1ldGVycygiQ0hBUlNFVCIpOwotICAgICAgICBmaW5hbCBTdHJpbmcgY2hhcnNldCA9Ci0gICAgICAgICAgICAoKGNoYXJzZXRDb2xsZWN0aW9uICE9IG51bGwpID8gY2hhcnNldENvbGxlY3Rpb24uaXRlcmF0b3IoKS5uZXh0KCkgOiBudWxsKTsKLSAgICAgICAgZmluYWwgQ29sbGVjdGlvbjxTdHJpbmc+IGVuY29kaW5nQ29sbGVjdGlvbiA9IG1DdXJyZW50UHJvcGVydHkuZ2V0UGFyYW1ldGVycygiRU5DT0RJTkciKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIGVuY29kaW5nID0KLSAgICAgICAgICAgICgoZW5jb2RpbmdDb2xsZWN0aW9uICE9IG51bGwpID8gZW5jb2RpbmdDb2xsZWN0aW9uLml0ZXJhdG9yKCkubmV4dCgpIDogbnVsbCk7Ci0KLSAgICAgICAgU3RyaW5nIGNoYXJzZXRGb3JEZWNvZGVkQnl0ZXMgPSBDaGFyc2V0VXRpbHMubmFtZUZvckRlZmF1bHRWZW5kb3IoY2hhcnNldCk7Ci0gICAgICAgIGlmIChjaGFyc2V0Rm9yRGVjb2RlZEJ5dGVzID09IG51bGwgfHwgY2hhcnNldEZvckRlY29kZWRCeXRlcy5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICBjaGFyc2V0Rm9yRGVjb2RlZEJ5dGVzID0gbUNoYXJzZXRGb3JEZWNvZGVkQnl0ZXM7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKGZpbmFsIFN0cmluZyB2YWx1ZSA6IHZhbHVlcykgewotICAgICAgICAgICAgbUN1cnJlbnRQcm9wZXJ0eS5hZGRUb1Byb3BlcnR5VmFsdWVMaXN0KAotICAgICAgICAgICAgICAgICAgICBoYW5kbGVPbmVWYWx1ZSh2YWx1ZSwgY2hhcnNldEZvckRlY29kZWRCeXRlcywgZW5jb2RpbmcpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNob3dQZXJmb3JtYW5jZUluZm8oKSB7Ci0gICAgICAgIExvZy5kKExPR19UQUcsICJ0aW1lIGZvciBpbnNlcnQgQ29udGFjdFN0cnVjdCB0byBkYXRhYmFzZTogIiArIAotICAgICAgICAgICAgICAgIG1UaW1lUHVzaEludG9Db250ZW50UmVzb2x2ZXIgKyAiIG1zIik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkRW50cnlDb3VudGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRFbnRyeUNvdW50ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2JhYjUwZC4uMDAwMDAwMAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRFbnRyeUNvdW50ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIFRoZSBjbGFzcyB3aGljaCBqdXN0IGNvdW50cyB0aGUgbnVtYmVyIG9mIHZDYXJkIGVudHJpZXMgaW4gdGhlIHNwZWNpZmllZCBpbnB1dC4KLSAqLwotcHVibGljIGNsYXNzIFZDYXJkRW50cnlDb3VudGVyIGltcGxlbWVudHMgVkNhcmRJbnRlcnByZXRlciB7Ci0gICAgcHJpdmF0ZSBpbnQgbUNvdW50OwotCi0gICAgcHVibGljIGludCBnZXRDb3VudCgpIHsKLSAgICAgICAgcmV0dXJuIG1Db3VudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzdGFydCgpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBlbmQoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc3RhcnRFbnRyeSgpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBlbmRFbnRyeSgpIHsKLSAgICAgICAgbUNvdW50Kys7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc3RhcnRQcm9wZXJ0eSgpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBlbmRQcm9wZXJ0eSgpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eUdyb3VwKFN0cmluZyBncm91cCkgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5TmFtZShTdHJpbmcgbmFtZSkgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5UGFyYW1UeXBlKFN0cmluZyB0eXBlKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJvcGVydHlQYXJhbVZhbHVlKFN0cmluZyB2YWx1ZSkgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5VmFsdWVzKExpc3Q8U3RyaW5nPiB2YWx1ZXMpIHsKLSAgICB9ICAgIAotfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkRW50cnlIYW5kbGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRFbnRyeUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODNhNjdmZS4uMDAwMDAwMAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRFbnRyeUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZDsKLQotLyoqCi0gKiBUaGUgaW50ZXJmYWNlIGNhbGxlZCBieSB7QGxpbmsgVkNhcmRFbnRyeUNvbnN0cnVjdG9yfS4gVXNlZnVsIHdoZW4geW91IGRvbid0IHdhbnQgdG8KLSAqIGhhbmRsZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhcyB3aGF0IHtAbGluayBWQ2FyZFBhcnNlcn0gcHJvdmlkZXMgdmlhIHtAbGluayBWQ2FyZEludGVycHJldGVyfS4KLSAqLwotcHVibGljIGludGVyZmFjZSBWQ2FyZEVudHJ5SGFuZGxlciB7Ci0gICAgLyoqCi0gICAgICogQ2FsbGVkIHdoZW4gdGhlIHBhcnNpbmcgc3RhcnRlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBvblN0YXJ0KCk7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbWV0aG9kIGNhbGxlZCB3aGVuIG9uZSBWQ2FyZCBlbnRyeSBpcyBzdWNjZXNzZnVsbHkgY3JlYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG9uRW50cnlDcmVhdGVkKGZpbmFsIFZDYXJkRW50cnkgZW50cnkpOwotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIHdoZW4gdGhlIHBhcnNpbmcgZW5kZWQuCi0gICAgICogQWJsZSB0byBiZSB1c2UgdGhpcyBtZXRob2QgZm9yIHNob3dpbmcgcGVyZm9ybWFuY2UgbG9nLCBldGMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgb25FbmQoKTsKLX0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZEludGVycHJldGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRJbnRlcnByZXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTIzN2MwLi4wMDAwMDAwCi0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZEludGVycHJldGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogPFA+Ci0gKiBUaGUgaW50ZXJmYWNlIHdoaWNoIHNob3VsZCBiZSBpbXBsZW1lbnRlZCBieSB0aGUgY2xhc3NlcyB3aGljaCBoYXZlIHRvIGFuYWx5emUgZWFjaAotICogdkNhcmQgZW50cnkgbW9yZSBtaW51dGVseSB0aGFuIHtAbGluayBWQ2FyZEVudHJ5fSBjbGFzcyBhbmFseXNpcy4KLSAqIDwvUD4KLSAqIDxQPgotICogSGVyZSwgdGhlcmUgYXJlIHNldmVyYWwgdGVybXMgc3BlY2lmaWMgdG8gdkNhcmQgKGFuZCB0aGlzIGxpYnJhcnkpLgotICogPC9QPgotICogPFA+Ci0gKiBUaGUgdGVybSAiZW50cnkiIGlzIG9uZSB2Q2FyZCByZXByZXNlbnRhdGlvbiBpbiB0aGUgaW5wdXQsIHdoaWNoIHNob3VsZCBzdGFydCB3aXRoICJCRUdJTjpWQ0FSRCIKLSAqIGFuZCBlbmQgd2l0aCAiRU5EOlZDQVJEIi4KLSAqIDwvUD4KLSAqIDxQPgotICogVGhlIHRlcm0gInByb3BlcnR5IiBpcyBvbmUgbGluZSBpbiB2Q2FyZCBlbnRyeSwgd2hpY2ggY29uc2lzdHMgb2YgImdyb3VwIiwgInByb3BlcnR5IG5hbWUiLAotICogInBhcmFtZXRlcihwYXJhbSkgbmFtZXMgYW5kIHZhbHVlcyIsIGFuZCAicHJvcGVydHkgdmFsdWVzIi4KLSAqIDwvUD4KLSAqIDxQPgotICogZS5nLiBncm91cDEucHJvcE5hbWU7cGFyYW1OYW1lMT1wYXJhbVZhbHVlMTtwYXJhbU5hbWUyPXBhcmFtVmFsdWUyO3Byb3BlcnR5VmFsdWUxO3Byb3BlcnR5VmFsdWUyLi4uCi0gKiA8L1A+Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVkNhcmRJbnRlcnByZXRlciB7Ci0gICAgLyoqCi0gICAgICogQ2FsbGVkIHdoZW4gdkNhcmQgaW50ZXJwcmV0YXRpb24gc3RhcnRlZC4KLSAgICAgKi8KLSAgICB2b2lkIHN0YXJ0KCk7Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgd2hlbiB2Q2FyZCBpbnRlcnByZXRhdGlvbiBmaW5pc2hlZC4KLSAgICAgKi8KLSAgICB2b2lkIGVuZCgpOwotCi0gICAgLyoqIAotICAgICAqIENhbGxlZCB3aGVuIHBhcnNpbmcgb25lIHZDYXJkIGVudHJ5IHN0YXJ0ZWQuCi0gICAgICogTW9yZSBzcGVjaWZpY2FsbHksIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuICJCRUdJTjpWQ0FSRCIgaXMgcmVhZC4KLSAgICAgKi8KLSAgICB2b2lkIHN0YXJ0RW50cnkoKTsKLQotICAgIC8qKgotICAgICAqIENhbGxlZCB3aGVuIHBhcnNpbmcgb25lIHZDYXJkIGVudHJ5IGVuZGVkLgotICAgICAqIE1vcmUgc3BlY2lmaWNhbGx5LCB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiAiRU5EOlZDQVJEIiBpcyByZWFkLgotICAgICAqIE5vdGUgdGhhdCB7QGxpbmsgI3N0YXJ0RW50cnkoKX0gbWF5IGJlIGNhbGxlZCBzaW5jZQotICAgICAqIHZDYXJkIChlc3BlY2lhbGx5IDIuMSkgYWxsb3dzIG5lc3RlZCB2Q2FyZC4KLSAgICAgKi8KLSAgICB2b2lkIGVuZEVudHJ5KCk7Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgd2hlbiByZWFkaW5nIG9uZSBwcm9wZXJ0eSBzdGFydGVkLgotICAgICAqLwotICAgIHZvaWQgc3RhcnRQcm9wZXJ0eSgpOwotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIHdoZW4gcmVhZGluZyBvbmUgcHJvcGVydHkgZW5kZWQuCi0gICAgICovCi0gICAgdm9pZCBlbmRQcm9wZXJ0eSgpOwotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGdyb3VwIEEgZ3JvdXAgbmFtZS4gVGhpcyBtZXRob2QgbWF5IGJlIGNhbGxlZCBtb3JlIHRoYW4gb25jZSBvciBtYXkgbm90IGJlCi0gICAgICogY2FsbGVkIGF0IGFsbCwgZGVwZW5kaW5nIG9uIGhvdyBtYW55IGdydW91cHMgYXJlIGFwcGVuZGVkIHRvIHRoZSBwcm9wZXJ0eS4KLSAgICAgKi8KLSAgICB2b2lkIHByb3BlcnR5R3JvdXAoU3RyaW5nIGdyb3VwKTsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBuYW1lIEEgcHJvcGVydHkgbmFtZSBsaWtlICJOIiwgIkZOIiwgIkFEUiIsIGV0Yy4KLSAgICAgKi8KLSAgICB2b2lkIHByb3BlcnR5TmFtZShTdHJpbmcgbmFtZSk7Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gdHlwZSBBIHBhcmFtZXRlciBuYW1lIGxpa2UgIkVOQ09ESU5HIiwgIkNIQVJTRVQiLCBldGMuCi0gICAgICovCi0gICAgdm9pZCBwcm9wZXJ0eVBhcmFtVHlwZShTdHJpbmcgdHlwZSk7Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gdmFsdWUgQSBwYXJhbWV0ZXIgdmFsdWUuIFRoaXMgbWV0aG9kIG1heSBiZSBjYWxsZWQgd2l0aG91dAotICAgICAqIHtAbGluayAjcHJvcGVydHlQYXJhbVR5cGUoU3RyaW5nKX0gYmVpbmcgY2FsbGVkICh3aGVuIHRoZSB2Q2FyZCBpcyB2Q2FyZCAyLjEpLgotICAgICAqLwotICAgIHZvaWQgcHJvcGVydHlQYXJhbVZhbHVlKFN0cmluZyB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gdmFsdWVzIExpc3Qgb2YgcHJvcGVydHkgdmFsdWVzLiBUaGUgc2l6ZSBvZiB2YWx1ZXMgd291bGQgYmUgMSB1bmxlc3MKLSAgICAgKiBjb3Jlc3Nwb25kaW5nIHByb3BlcnR5IG5hbWUgaXMgIk4iLCAiQURSIiwgb3IgIk9SRyIuCi0gICAgICovCi0gICAgdm9pZCBwcm9wZXJ0eVZhbHVlcyhMaXN0PFN0cmluZz4gdmFsdWVzKTsKLX0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZEludGVycHJldGVyQ29sbGVjdGlvbi5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkSW50ZXJwcmV0ZXJDb2xsZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5ZjgxZjcuLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkSW50ZXJwcmV0ZXJDb2xsZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogVGhlIHtAbGluayBWQ2FyZEludGVycHJldGVyfSBpbXBsZW1lbnRhdGlvbiB3aGljaCBhZ2dyZWdhdGVzIG1vcmUgdGhhbiBvbmUKLSAqIHtAbGluayBWQ2FyZEludGVycHJldGVyfSBvYmplY3RzIGFuZCBtYWtlIGEgdXNlciBvYmplY3QgdHJlYXQgdGhlbSBhcyBvbmUKLSAqIHtAbGluayBWQ2FyZEludGVycHJldGVyfSBvYmplY3QuCi0gKi8KLXB1YmxpYyBjbGFzcyBWQ2FyZEludGVycHJldGVyQ29sbGVjdGlvbiBpbXBsZW1lbnRzIFZDYXJkSW50ZXJwcmV0ZXIgewotICAgIHByaXZhdGUgZmluYWwgQ29sbGVjdGlvbjxWQ2FyZEludGVycHJldGVyPiBtSW50ZXJwcmV0ZXJDb2xsZWN0aW9uOwotICAgIAotICAgIHB1YmxpYyBWQ2FyZEludGVycHJldGVyQ29sbGVjdGlvbihDb2xsZWN0aW9uPFZDYXJkSW50ZXJwcmV0ZXI+IGludGVycHJldGVyQ29sbGVjdGlvbikgewotICAgICAgICBtSW50ZXJwcmV0ZXJDb2xsZWN0aW9uID0gaW50ZXJwcmV0ZXJDb2xsZWN0aW9uOwotICAgIH0KLQotICAgIHB1YmxpYyBDb2xsZWN0aW9uPFZDYXJkSW50ZXJwcmV0ZXI+IGdldENvbGxlY3Rpb24oKSB7Ci0gICAgICAgIHJldHVybiBtSW50ZXJwcmV0ZXJDb2xsZWN0aW9uOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHN0YXJ0KCkgewotICAgICAgICBmb3IgKFZDYXJkSW50ZXJwcmV0ZXIgYnVpbGRlciA6IG1JbnRlcnByZXRlckNvbGxlY3Rpb24pIHsKLSAgICAgICAgICAgIGJ1aWxkZXIuc3RhcnQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGVuZCgpIHsKLSAgICAgICAgZm9yIChWQ2FyZEludGVycHJldGVyIGJ1aWxkZXIgOiBtSW50ZXJwcmV0ZXJDb2xsZWN0aW9uKSB7Ci0gICAgICAgICAgICBidWlsZGVyLmVuZCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc3RhcnRFbnRyeSgpIHsKLSAgICAgICAgZm9yIChWQ2FyZEludGVycHJldGVyIGJ1aWxkZXIgOiBtSW50ZXJwcmV0ZXJDb2xsZWN0aW9uKSB7Ci0gICAgICAgICAgICBidWlsZGVyLnN0YXJ0RW50cnkoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGVuZEVudHJ5KCkgewotICAgICAgICBmb3IgKFZDYXJkSW50ZXJwcmV0ZXIgYnVpbGRlciA6IG1JbnRlcnByZXRlckNvbGxlY3Rpb24pIHsKLSAgICAgICAgICAgIGJ1aWxkZXIuZW5kRW50cnkoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHN0YXJ0UHJvcGVydHkoKSB7Ci0gICAgICAgIGZvciAoVkNhcmRJbnRlcnByZXRlciBidWlsZGVyIDogbUludGVycHJldGVyQ29sbGVjdGlvbikgewotICAgICAgICAgICAgYnVpbGRlci5zdGFydFByb3BlcnR5KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBlbmRQcm9wZXJ0eSgpIHsKLSAgICAgICAgZm9yIChWQ2FyZEludGVycHJldGVyIGJ1aWxkZXIgOiBtSW50ZXJwcmV0ZXJDb2xsZWN0aW9uKSB7Ci0gICAgICAgICAgICBidWlsZGVyLmVuZFByb3BlcnR5KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eUdyb3VwKFN0cmluZyBncm91cCkgewotICAgICAgICBmb3IgKFZDYXJkSW50ZXJwcmV0ZXIgYnVpbGRlciA6IG1JbnRlcnByZXRlckNvbGxlY3Rpb24pIHsKLSAgICAgICAgICAgIGJ1aWxkZXIucHJvcGVydHlHcm91cChncm91cCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eU5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgZm9yIChWQ2FyZEludGVycHJldGVyIGJ1aWxkZXIgOiBtSW50ZXJwcmV0ZXJDb2xsZWN0aW9uKSB7Ci0gICAgICAgICAgICBidWlsZGVyLnByb3BlcnR5TmFtZShuYW1lKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5UGFyYW1UeXBlKFN0cmluZyB0eXBlKSB7Ci0gICAgICAgIGZvciAoVkNhcmRJbnRlcnByZXRlciBidWlsZGVyIDogbUludGVycHJldGVyQ29sbGVjdGlvbikgewotICAgICAgICAgICAgYnVpbGRlci5wcm9wZXJ0eVBhcmFtVHlwZSh0eXBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5UGFyYW1WYWx1ZShTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgZm9yIChWQ2FyZEludGVycHJldGVyIGJ1aWxkZXIgOiBtSW50ZXJwcmV0ZXJDb2xsZWN0aW9uKSB7Ci0gICAgICAgICAgICBidWlsZGVyLnByb3BlcnR5UGFyYW1WYWx1ZSh2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eVZhbHVlcyhMaXN0PFN0cmluZz4gdmFsdWVzKSB7Ci0gICAgICAgIGZvciAoVkNhcmRJbnRlcnByZXRlciBidWlsZGVyIDogbUludGVycHJldGVyQ29sbGVjdGlvbikgewotICAgICAgICAgICAgYnVpbGRlci5wcm9wZXJ0eVZhbHVlcyh2YWx1ZXMpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkUGFyc2VyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdjNTJhNi4uMDAwMDAwMAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQ7Ci0KLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5leGNlcHRpb24uVkNhcmRFeGNlcHRpb247Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBWQ2FyZFBhcnNlciB7Ci0gICAgcHJvdGVjdGVkIGZpbmFsIGludCBtUGFyc2VUeXBlOwotICAgIHByb3RlY3RlZCBib29sZWFuIG1DYW5jZWxlZDsKLQotICAgIHB1YmxpYyBWQ2FyZFBhcnNlcigpIHsKLSAgICAgICAgdGhpcyhWQ2FyZENvbmZpZy5QQVJTRV9UWVBFX1VOS05PV04pOwotICAgIH0KLQotICAgIHB1YmxpYyBWQ2FyZFBhcnNlcihpbnQgcGFyc2VUeXBlKSB7Ci0gICAgICAgIG1QYXJzZVR5cGUgPSBwYXJzZVR5cGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPFA+Ci0gICAgICogUGFyc2VzIHRoZSBnaXZlbiBzdHJlYW0gYW5kIHNlbmQgdGhlIFZDYXJkIGRhdGEgaW50byBWQ2FyZEJ1aWxkZXJCYXNlIG9iamVjdC4KLSAgICAgKiA8L1AuCi0gICAgICogPFA+Ci0gICAgICogTm90ZSB0aGF0IHZDYXJkIDIuMSBzcGVjaWZpY2F0aW9uIGFsbG93cyAiQ0hBUlNFVCIgcGFyYW1ldGVyLCBhbmQgc29tZSBjYXJlZXIgc2V0cwotICAgICAqIGxvY2FsIGVuY29kaW5nIHRvIGl0LiBGb3IgZXhhbXBsZSwgSmFwYW5lc2UgcGhvbmUgY2FyZWVyIHVzZXMgU2hpZnRfSklTLCB3aGljaCBpcwotICAgICAqIGZvcm1hbGx5IGFsbG93ZWQgaW4gVkNhcmQgMi4xLCBidXQgbm90IHJlY29tbWVuZGVkIGluIFZDYXJkIDMuMC4gSW4gVkNhcmQgMi4xLAotICAgICAqIEluIHNvbWUgZXhyZW1lIGNhc2UsIHNvbWUgVkNhcmQgbWF5IGhhdmUgZGlmZmVyZW50IGNoYXJzZXRzIGluIG9uZSBWQ2FyZCAodGhvdWdoCi0gICAgICogd2UgZG8gbm90IHNlZSBhbnkgZGV2aWNlIHdoaWNoIGVtaXRzIHN1Y2gga2luZCBvZiBtYWxpY2lvdXMgZGF0YSkKLSAgICAgKiA8L1A+Ci0gICAgICogPFA+Ci0gICAgICogSW4gb3JkZXIgdG8gYXZvaWQgIm1pc3VuZGVyc3RhbmRpbmciIGNoYXJzZXQgYXMgbXVjaCBhcyBwb3NzaWJsZSwgdGhpcyBtZXRob2QKLSAgICAgKiB1c2UgIklTTy04ODU5LTEiIGZvciByZWFkaW5nIHRoZSBzdHJlYW0uIFdoZW4gY2hhcnNldCBpcyBzcGVjaWZpZWQgaW4gc29tZSBwcm9wZXJ0eQotICAgICAqICh3aXRoICJDSEFSU0VUPS4uLiIgcGFyYW1ldGVyKSwgdGhlIHN0cmluZyBpcyBkZWNvZGVkIHRvIHJhdyBieXRlcyBhbmQgZW5jb2RlZCB0bwotICAgICAqIHRoZSBjaGFyc2V0LiBUaGlzIG1ldGhvZCBhc3N1bWVzIHRoYXQgIklTTy04ODU5LTEiIGhhcyAxIHRvIDEgbWFwcGluZyBpbiBhbGwgOGJpdAotICAgICAqIGNoYXJhY3RlcnMsIHdoaWNoIGlzIG5vdCBjb21wbGV0ZWx5IHN1cmUuIEluIHNvbWUgY2FzZXMsIHRoaXMgImRlY29kaW5nLWVuY29kaW5nIgotICAgICAqIHNjaGVtZSBtYXkgZmFpbC4gVG8gYXZvaWQgdGhlIGNhc2UsCi0gICAgICogPC9QPgotICAgICAqIDxQPgotICAgICAqIFdlIHJlY29tbWVuZCB5b3UgdG8gdXNlIHtAbGluayBWQ2FyZFNvdXJjZURldGVjdG9yfSBhbmQgZGV0ZWN0IHdoaWNoIGtpbmQgb2Ygc291cmNlIHRoZQotICAgICAqIFZDYXJkIGNvbWVzIGZyb20gYW5kIGV4cGxpY2l0bHkgc3BlY2lmeSBhIGNoYXJzZXQgdXNpbmcgdGhlIHJlc3VsdC4KLSAgICAgKiA8L1A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gaXMgVGhlIHNvdXJjZSB0byBwYXJzZS4KLSAgICAgKiBAcGFyYW0gaW50ZXJlcHJldGVyIEEge0BsaW5rIFZDYXJkSW50ZXJwcmV0ZXJ9IG9iamVjdCB3aGljaCB1c2VkIHRvIGNvbnN0cnVjdCBkYXRhLgotICAgICAqIEByZXR1cm4gUmV0dXJucyB0cnVlIGZvciBzdWNjZXNzLiBPdGhlcndpc2UgcmV0dXJucyBmYWxzZS4KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uLCBWQ2FyZEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHBhcnNlKElucHV0U3RyZWFtIGlzLCBWQ2FyZEludGVycHJldGVyIGludGVyZXByZXRlcikKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgVkNhcmRFeGNlcHRpb247Ci0gICAgCi0gICAgLyoqCi0gICAgICogPFA+Ci0gICAgICogVGhlIG1ldGhvZCB2YXJpYW50cyB3aGljaCBhY2NlcHQgY2hhcnNldC4KLSAgICAgKiA8L1A+Ci0gICAgICogPFA+Ci0gICAgICogUkZDIDI0MjYgInJlY29tbWVuZHMiIChub3QgZm9yY2VzKSB0byB1c2UgVVRGLTgsIHNvIGl0IG1heSBiZSBPSyB0byB1c2UKLSAgICAgKiBVVEYtOCBhcyBhbiBlbmNvZGluZyB3aGVuIHBhcnNpbmcgdkNhcmQgMy4wLiBCdXQgbm90ZSB0aGF0IHNvbWUgSmFwYW5lc2UKLSAgICAgKiBwaG9uZSB1c2VzIFNoaWZ0X0pJUyBhcyBhIGNoYXJzZXQgKGUuZy4gVzYxU0gpLCBhbmQgYW5vdGhlciB1c2VzCi0gICAgICogIkNIQVJTRVQ9U0hJRlRfSklTIiwgd2hpY2ggaXMgZXhwbGljaXRseSBwcm9oaWJpdGVkIGluIHZDYXJkIDMuMCBzcGVjaWZpY2F0aW9uIChlLmcuIFc1M0spLgotICAgICAqIDwvUD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpcyBUaGUgc291cmNlIHRvIHBhcnNlLgotICAgICAqIEBwYXJhbSBjaGFyc2V0IENoYXJzZXQgdG8gYmUgdXNlZC4KLSAgICAgKiBAcGFyYW0gYnVpbGRlciBUaGUgVkNhcmRCdWlsZGVyQmFzZSBvYmplY3QuCi0gICAgICogQHJldHVybiBSZXR1cm5zIHRydWUgd2hlbiBzdWNjZXNzZnVsLiBPdGhlcndpc2UgcmV0dXJucyBmYWxzZS4KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uLCBWQ2FyZEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHBhcnNlKElucHV0U3RyZWFtIGlzLCBTdHJpbmcgY2hhcnNldCwgVkNhcmRJbnRlcnByZXRlciBidWlsZGVyKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBWQ2FyZEV4Y2VwdGlvbjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGUgbWV0aG9kIHZhcmlhbnRzIHdoaWNoIHRlbGxzIHRoaXMgb2JqZWN0IHRoZSBvcGVyYXRpb24gaXMgYWxyZWFkeSBjYW5jZWxlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBwYXJzZShJbnB1dFN0cmVhbSBpcywgU3RyaW5nIGNoYXJzZXQsCi0gICAgICAgICAgICBWQ2FyZEludGVycHJldGVyIGJ1aWxkZXIsIGJvb2xlYW4gY2FuY2VsZWQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgVkNhcmRFeGNlcHRpb247Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ2FuY2VsIHBhcnNpbmcuCi0gICAgICogQWN0dWFsIGNhbmNlbCBpcyBkb25lIGFmdGVyIHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgb25lIHZjYXJkIGVudHJ5IHBhcnNpbmcuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY2FuY2VsKCkgewotICAgICAgICBtQ2FuY2VsZWQgPSB0cnVlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZFBhcnNlcl9WMjEuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZFBhcnNlcl9WMjEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU4Y2ZiMC4uMDAwMDAwMAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRQYXJzZXJfVjIxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MzYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkOwotCi1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuZXhjZXB0aW9uLlZDYXJkQWdlbnROb3RTdXBwb3J0ZWRFeGNlcHRpb247Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuZXhjZXB0aW9uLlZDYXJkRXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLmV4Y2VwdGlvbi5WQ2FyZEludmFsaWRDb21tZW50TGluZUV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5leGNlcHRpb24uVkNhcmRJbnZhbGlkTGluZUV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5leGNlcHRpb24uVkNhcmROZXN0ZWRFeGNlcHRpb247Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuZXhjZXB0aW9uLlZDYXJkVmVyc2lvbkV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gcGFyc2UgdkNhcmQuIFBsZWFzZSByZWZlciB0byB2Q2FyZCBTcGVjaWZpY2F0aW9uIDIuMSBmb3IgbW9yZSBkZXRhaWwuCi0gKi8KLXB1YmxpYyBjbGFzcyBWQ2FyZFBhcnNlcl9WMjEgZXh0ZW5kcyBWQ2FyZFBhcnNlciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiVkNhcmRQYXJzZXJfVjIxIjsKLQotICAgIC8qKiBTdG9yZSB0aGUga25vd24tdHlwZSAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEhhc2hTZXQ8U3RyaW5nPiBzS25vd25UeXBlU2V0ID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigKLSAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoIkRPTSIsICJJTlRMIiwgIlBPU1RBTCIsICJQQVJDRUwiLCAiSE9NRSIsICJXT1JLIiwKLSAgICAgICAgICAgICAgICAgICAgIlBSRUYiLCAiVk9JQ0UiLCAiRkFYIiwgIk1TRyIsICJDRUxMIiwgIlBBR0VSIiwgIkJCUyIsCi0gICAgICAgICAgICAgICAgICAgICJNT0RFTSIsICJDQVIiLCAiSVNETiIsICJWSURFTyIsICJBT0wiLCAiQVBQTEVMSU5LIiwKLSAgICAgICAgICAgICAgICAgICAgIkFUVE1BSUwiLCAiQ0lTIiwgIkVXT1JMRCIsICJJTlRFUk5FVCIsICJJQk1NQUlMIiwKLSAgICAgICAgICAgICAgICAgICAgIk1DSU1BSUwiLCAiUE9XRVJTSEFSRSIsICJQUk9ESUdZIiwgIlRMWCIsICJYNDAwIiwgIkdJRiIsCi0gICAgICAgICAgICAgICAgICAgICJDR00iLCAiV01GIiwgIkJNUCIsICJNRVQiLCAiUE1CIiwgIkRJQiIsICJQSUNUIiwgIlRJRkYiLAotICAgICAgICAgICAgICAgICAgICAiUERGIiwgIlBTIiwgIkpQRUciLCAiUVRJTUUiLCAiTVBFRyIsICJNUEVHMiIsICJBVkkiLAotICAgICAgICAgICAgICAgICAgICAiV0FWRSIsICJBSUZGIiwgIlBDTSIsICJYNTA5IiwgIlBHUCIpKTsKLQotICAgIC8qKiBTdG9yZSB0aGUga25vd24tdmFsdWUgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBIYXNoU2V0PFN0cmluZz4gc0tub3duVmFsdWVTZXQgPSBuZXcgSGFzaFNldDxTdHJpbmc+KAotICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgiSU5MSU5FIiwgIlVSTCIsICJDT05URU5ULUlEIiwgIkNJRCIpKTsKLQotICAgIC8qKiBTdG9yZSB0aGUgcHJvcGVydHkgbmFtZXMgYXZhaWxhYmxlIGluIHZDYXJkIDIuMSAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEhhc2hTZXQ8U3RyaW5nPiBzQXZhaWxhYmxlUHJvcGVydHlOYW1lU2V0VjIxID0KLSAgICAgICAgbmV3IEhhc2hTZXQ8U3RyaW5nPihBcnJheXMuYXNMaXN0KAotICAgICAgICAgICAgICAgICJCRUdJTiIsICJMT0dPIiwgIlBIT1RPIiwgIkxBQkVMIiwgIkZOIiwgIlRJVExFIiwgIlNPVU5EIiwKLSAgICAgICAgICAgICAgICAiVkVSU0lPTiIsICJURUwiLCAiRU1BSUwiLCAiVFoiLCAiR0VPIiwgIk5PVEUiLCAiVVJMIiwKLSAgICAgICAgICAgICAgICAiQkRBWSIsICJST0xFIiwgIlJFViIsICJVSUQiLCAiS0VZIiwgIk1BSUxFUiIpKTsKLQotICAgIC8qKgotICAgICAqIFRob3VnaCB2Q2FyZCAyLjEgc3BlY2lmaWNhdGlvbiBkb2VzIG5vdCBhbGxvdyAiQiIgZW5jb2RpbmcsIHNvbWUgZGF0YSBtYXkgaGF2ZSBpdC4KLSAgICAgKiBXZSBhbGxvdyBpdCBmb3Igc2FmZXR5Li4uCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSGFzaFNldDxTdHJpbmc+IHNBdmFpbGFibGVFbmNvZGluZ1YyMSA9Ci0gICAgICAgIG5ldyBIYXNoU2V0PFN0cmluZz4oQXJyYXlzLmFzTGlzdCgKLSAgICAgICAgICAgICAgICAiN0JJVCIsICI4QklUIiwgIlFVT1RFRC1QUklOVEFCTEUiLCAiQkFTRTY0IiwgIkIiKSk7Ci0gICAgCi0gICAgLy8gVXNlZCBvbmx5IGZvciBwYXJzaW5nIEVORDpWQ0FSRC4KLSAgICBwcml2YXRlIFN0cmluZyBtUHJldmlvdXNMaW5lOwotICAgIAotICAgIC8qKiBUaGUgYnVpbGRlciB0byBidWlsZCBwYXJzZWQgZGF0YSAqLwotICAgIHByb3RlY3RlZCBWQ2FyZEludGVycHJldGVyIG1CdWlsZGVyID0gbnVsbDsKLQotICAgIC8qKiAKLSAgICAgKiBUaGUgZW5jb2RpbmcgdHlwZS4gIkVuY29kaW5nIiBpbiB2Q2FyZCBpcyBkaWZmZXJlbnQgZnJvbSAiQ2hhcnNldCIuCi0gICAgICogZS5nLiA3QklULCA4QklULCBRVU9URUQtUFJJTlRBQkxFLiAKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIG1FbmNvZGluZyA9IG51bGw7Ci0gICAgCi0gICAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBzRGVmYXVsdEVuY29kaW5nID0gIjhCSVQiOwotICAgIAotICAgIC8vIFNob3VsZCBub3QgZGlyZWN0bHkgcmVhZCBhIGxpbmUgZnJvbSB0aGlzIG9iamVjdC4gVXNlIGdldExpbmUoKSBpbnN0ZWFkLgotICAgIHByb3RlY3RlZCBCdWZmZXJlZFJlYWRlciBtUmVhZGVyOwotICAgIAotICAgIC8vIEluIHNvbWUgY2FzZXMsIHZDYXJkIGlzIG5lc3RlZC4gQ3VycmVudGx5LCB3ZSBvbmx5IGNvbnNpZGVyIHRoZSBtb3N0IGludGVyaW9yIHZDYXJkIGRhdGEuCi0gICAgLy8gU2VlIHYyMV9mb21hXzEudmNmIGluIHRlc3QgZGlyZWN0b3J5IGZvciBtb3JlIGluZm9ybWF0aW9uLgotICAgIHByaXZhdGUgaW50IG1OZXN0Q291bnQ7Ci0gICAgCi0gICAgLy8gSW4gb3JkZXIgdG8gcmVkdWNlIHdhcm5pbmcgbWVzc2FnZSBhcyBtdWNoIGFzIHBvc3NpYmxlLCB3ZSBob2xkIHRoZSB2YWx1ZSB3aGljaCBtYWRlIExvZ2dlcgotICAgIC8vIGVtaXQgYSB3YXJuaW5nIG1lc3NhZ2UuCi0gICAgcHJvdGVjdGVkIFNldDxTdHJpbmc+IG1Vbmtub3duVHlwZU1hcCA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLSAgICBwcm90ZWN0ZWQgU2V0PFN0cmluZz4gbVVua25vd25WYWx1ZU1hcCA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLQotICAgIC8vIEZvciBtZWFzdXJpbmcgcGVyZm9ybWFuY2UuCi0gICAgcHJpdmF0ZSBsb25nIG1UaW1lVG90YWw7Ci0gICAgcHJpdmF0ZSBsb25nIG1UaW1lUmVhZFN0YXJ0UmVjb3JkOwotICAgIHByaXZhdGUgbG9uZyBtVGltZVJlYWRFbmRSZWNvcmQ7Ci0gICAgcHJpdmF0ZSBsb25nIG1UaW1lU3RhcnRQcm9wZXJ0eTsKLSAgICBwcml2YXRlIGxvbmcgbVRpbWVFbmRQcm9wZXJ0eTsKLSAgICBwcml2YXRlIGxvbmcgbVRpbWVQYXJzZUl0ZW1zOwotICAgIHByaXZhdGUgbG9uZyBtVGltZVBhcnNlTGluZUFuZEhhbmRsZUdyb3VwOwotICAgIHByaXZhdGUgbG9uZyBtVGltZVBhcnNlUHJvcGVydHlWYWx1ZXM7Ci0gICAgcHJpdmF0ZSBsb25nIG1UaW1lUGFyc2VBZHJPcmdOOwotICAgIHByaXZhdGUgbG9uZyBtVGltZUhhbmRsZU1pc2NQcm9wZXJ0eVZhbHVlOwotICAgIHByaXZhdGUgbG9uZyBtVGltZUhhbmRsZVF1b3RlZFByaW50YWJsZTsKLSAgICBwcml2YXRlIGxvbmcgbVRpbWVIYW5kbGVCYXNlNjQ7Ci0KLSAgICBwdWJsaWMgVkNhcmRQYXJzZXJfVjIxKCkgewotICAgICAgICB0aGlzKG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBWQ2FyZFBhcnNlcl9WMjEoVkNhcmRTb3VyY2VEZXRlY3RvciBkZXRlY3RvcikgewotICAgICAgICB0aGlzKGRldGVjdG9yICE9IG51bGwgPyBkZXRlY3Rvci5nZXRFc3RpbWF0ZWRUeXBlKCkgOiBWQ2FyZENvbmZpZy5QQVJTRV9UWVBFX1VOS05PV04pOwotICAgIH0KLQotICAgIHB1YmxpYyBWQ2FyZFBhcnNlcl9WMjEoaW50IHBhcnNlVHlwZSkgewotICAgICAgICBzdXBlcihwYXJzZVR5cGUpOwotICAgICAgICBpZiAocGFyc2VUeXBlID09IFZDYXJkQ29uZmlnLlBBUlNFX1RZUEVfRk9NQSkgewotICAgICAgICAgICAgbU5lc3RDb3VudCA9IDE7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQYXJzZXMgdGhlIGZpbGUgYXQgdGhlIGdpdmVuIHBvc2l0aW9uLgotICAgICAqCi0gICAgICogdmNhcmRfZmlsZSA9IFt3c2xzXSB2Y2FyZCBbd3Nsc10KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBwYXJzZVZDYXJkRmlsZSgpIHRocm93cyBJT0V4Y2VwdGlvbiwgVkNhcmRFeGNlcHRpb24gewotICAgICAgICBib29sZWFuIGZpcnN0UmVhZGluZyA9IHRydWU7Ci0gICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgICBpZiAobUNhbmNlbGVkKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIXBhcnNlT25lVkNhcmQoZmlyc3RSZWFkaW5nKSkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmlyc3RSZWFkaW5nID0gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobU5lc3RDb3VudCA+IDApIHsKLSAgICAgICAgICAgIGJvb2xlYW4gdXNlQ2FjaGUgPSB0cnVlOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtTmVzdENvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICByZWFkRW5kVkNhcmQodXNlQ2FjaGUsIHRydWUpOwotICAgICAgICAgICAgICAgIHVzZUNhY2hlID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgaW50IGdldFZlcnNpb24oKSB7Ci0gICAgICAgIHJldHVybiBWQ2FyZENvbmZpZy5GTEFHX1YyMTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFZlcnNpb25TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiBWQ2FyZENvbnN0YW50cy5WRVJTSU9OX1YyMTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRydWUgd2hlbiB0aGUgcHJvcGVydHlOYW1lIGlzIGEgdmFsaWQgcHJvcGVydHkgbmFtZS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1ZhbGlkUHJvcGVydHlOYW1lKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLSAgICAgICAgaWYgKCEoc0F2YWlsYWJsZVByb3BlcnR5TmFtZVNldFYyMS5jb250YWlucyhwcm9wZXJ0eU5hbWUudG9VcHBlckNhc2UoKSkgfHwKLSAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWUuc3RhcnRzV2l0aCgiWC0iKSkgJiYgCi0gICAgICAgICAgICAgICAgIW1Vbmtub3duVHlwZU1hcC5jb250YWlucyhwcm9wZXJ0eU5hbWUpKSB7Ci0gICAgICAgICAgICBtVW5rbm93blR5cGVNYXAuYWRkKHByb3BlcnR5TmFtZSk7Ci0gICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiUHJvcGVydHkgbmFtZSB1bnN1cHBvcnRlZCBieSB2Q2FyZCAyLjE6ICIgKyBwcm9wZXJ0eU5hbWUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdHJ1ZSB3aGVuIHRoZSBlbmNvZGluZyBpcyBhIHZhbGlkIGVuY29kaW5nLgotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIGlzVmFsaWRFbmNvZGluZyhTdHJpbmcgZW5jb2RpbmcpIHsKLSAgICAgICAgcmV0dXJuIHNBdmFpbGFibGVFbmNvZGluZ1YyMS5jb250YWlucyhlbmNvZGluZy50b1VwcGVyQ2FzZSgpKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHJldHVybiBTdHJpbmcuIEl0IG1heSBiZSBudWxsLCBvciBpdHMgbGVuZ3RoIG1heSBiZSAwCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0TGluZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBtUmVhZGVyLnJlYWRMaW5lKCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEByZXR1cm4gU3RyaW5nIHdpdGggaXQncyBsZW5ndGggPiAwCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgVkNhcmRFeGNlcHRpb24gd2hlbiB0aGUgc3RyZWFtIHJlYWNoZWQgZW5kIG9mIGxpbmUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldE5vbkVtcHR5TGluZSgpIHRocm93cyBJT0V4Y2VwdGlvbiwgVkNhcmRFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgbGluZTsKLSAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgIGxpbmUgPSBnZXRMaW5lKCk7Ci0gICAgICAgICAgICBpZiAobGluZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFZDYXJkRXhjZXB0aW9uKCJSZWFjaGVkIGVuZCBvZiBidWZmZXIuIik7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGxpbmUudHJpbSgpLmxlbmd0aCgpID4gMCkgeyAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICByZXR1cm4gbGluZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIHZjYXJkID0gIkJFR0lOIiBbd3NdICI6IiBbd3NdICJWQ0FSRCIgW3dzXSAxKkNSTEYKLSAgICAgKiAgICAgICAgIGl0ZW1zICpDUkxGCi0gICAgICogICAgICAgICAiRU5EIiBbd3NdICI6IiBbd3NdICJWQ0FSRCIKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gcGFyc2VPbmVWQ2FyZChib29sZWFuIGZpcnN0UmVhZGluZykgdGhyb3dzIElPRXhjZXB0aW9uLCBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGJvb2xlYW4gYWxsb3dHYXJiYWdlID0gZmFsc2U7Ci0gICAgICAgIGlmIChmaXJzdFJlYWRpbmcpIHsKLSAgICAgICAgICAgIGlmIChtTmVzdENvdW50ID4gMCkgewotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbU5lc3RDb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghcmVhZEJlZ2luVkNhcmQoYWxsb3dHYXJiYWdlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGFsbG93R2FyYmFnZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFyZWFkQmVnaW5WQ2FyZChhbGxvd0dhcmJhZ2UpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgbG9uZyBzdGFydDsKLSAgICAgICAgaWYgKG1CdWlsZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICBtQnVpbGRlci5zdGFydEVudHJ5KCk7Ci0gICAgICAgICAgICBtVGltZVJlYWRTdGFydFJlY29yZCArPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0OwotICAgICAgICB9Ci0gICAgICAgIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgIHBhcnNlSXRlbXMoKTsKLSAgICAgICAgbVRpbWVQYXJzZUl0ZW1zICs9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhcnQ7Ci0gICAgICAgIHJlYWRFbmRWQ2FyZCh0cnVlLCBmYWxzZSk7Ci0gICAgICAgIGlmIChtQnVpbGRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICAgICAgbUJ1aWxkZXIuZW5kRW50cnkoKTsKLSAgICAgICAgICAgIG1UaW1lUmVhZEVuZFJlY29yZCArPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0OwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRydWUgd2hlbiBzdWNjZXNzZnVsLiBGYWxzZSB3aGVuIHJlYWNoaW5nIHRoZSBlbmQgb2YgbGluZSAgCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgVkNhcmRFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiByZWFkQmVnaW5WQ2FyZChib29sZWFuIGFsbG93R2FyYmFnZSkgdGhyb3dzIElPRXhjZXB0aW9uLCBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBsaW5lOwotICAgICAgICBkbyB7Ci0gICAgICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICAgICAgIGxpbmUgPSBnZXRMaW5lKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGxpbmUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChsaW5lLnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgU3RyaW5nW10gc3RyQXJyYXkgPSBsaW5lLnNwbGl0KCI6IiwgMik7Ci0gICAgICAgICAgICBpbnQgbGVuZ3RoID0gc3RyQXJyYXkubGVuZ3RoOwotCi0gICAgICAgICAgICAvLyBUaG91Z2ggdkNhcmQgMi4xLzMuMCBzcGVjaWZpY2F0aW9uIGRvZXMgbm90IGFsbG93IGxvd2VyIGNhc2VzLAotICAgICAgICAgICAgLy8gdkNhcmQgZmlsZSBlbWl0dGVkIGJ5IHNvbWUgZXh0ZXJuYWwgdkNhcmQgZXhwb3RlciBoYXZlIHN1Y2ggaW52YWxpZCBTdHJpbmdzLgotICAgICAgICAgICAgLy8gU28gd2UgYWxsb3cgaXQuCi0gICAgICAgICAgICAvLyBlLmcuIEJFR0lOOnZDYXJkCi0gICAgICAgICAgICBpZiAobGVuZ3RoID09IDIgJiYKLSAgICAgICAgICAgICAgICAgICAgc3RyQXJyYXlbMF0udHJpbSgpLmVxdWFsc0lnbm9yZUNhc2UoIkJFR0lOIikgJiYKLSAgICAgICAgICAgICAgICAgICAgc3RyQXJyYXlbMV0udHJpbSgpLmVxdWFsc0lnbm9yZUNhc2UoIlZDQVJEIikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIWFsbG93R2FyYmFnZSkgewotICAgICAgICAgICAgICAgIGlmIChtTmVzdENvdW50ID4gMCkgewotICAgICAgICAgICAgICAgICAgICBtUHJldmlvdXNMaW5lID0gbGluZTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBWQ2FyZEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgU3RyaW5nIFwiQkVHSU46VkNBUkRcIiBkaWQgbm90IGNvbWUgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIihJbnN0ZWFkLCBcIiIgKyBsaW5lICsgIlwiIGNhbWUpIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IHdoaWxlKGFsbG93R2FyYmFnZSk7Ci0KLSAgICAgICAgdGhyb3cgbmV3IFZDYXJkRXhjZXB0aW9uKCJSZWFjaGVkIHdoZXJlIG11c3Qgbm90IGJlIHJlYWNoZWQuIik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIGFyZ3VtZW50cyB1c2VDYWNoZSBhbmQgYWxsb3dHYXJiYXNlIGFyZSB1c3VhbGx5IHRydWUgYW5kIGZhbHNlIGFjY29yZGluZ2x5IHdoZW4KLSAgICAgKiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBvdXRzaWRlIHRoaXMgZnVuY3Rpb24gaXRzZWxmLiAKLSAgICAgKgotICAgICAqIEBwYXJhbSB1c2VDYWNoZSBXaGVuIHRydWUsIGxpbmUgaXMgb2J0YWluZWQgZnJvbSBtUHJldmlvdXNsaW5lLiBPdGhlcndpc2UsIGdldExpbmUoKQotICAgICAqIGlzIHVzZWQuCi0gICAgICogQHBhcmFtIGFsbG93R2FyYmFnZSBXaGVuIHRydWUsIGlnbm9yZSBub24gIkVORDpWQ0FSRCIgbGluZS4KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBWQ2FyZEV4Y2VwdGlvbgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHJlYWRFbmRWQ2FyZChib29sZWFuIHVzZUNhY2hlLCBib29sZWFuIGFsbG93R2FyYmFnZSkKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgVkNhcmRFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgbGluZTsKLSAgICAgICAgZG8gewotICAgICAgICAgICAgaWYgKHVzZUNhY2hlKSB7Ci0gICAgICAgICAgICAgICAgLy8gVGhvdWdoIHZDYXJkIHNwZWNpZmljYXRpb24gZG9lcyBub3QgYWxsb3cgbG93ZXIgY2FzZXMsCi0gICAgICAgICAgICAgICAgLy8gc29tZSBkYXRhIG1heSBoYXZlIHRoZW0sIHNvIHdlIGFsbG93IGl0LgotICAgICAgICAgICAgICAgIGxpbmUgPSBtUHJldmlvdXNMaW5lOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICAgICAgICAgICBsaW5lID0gZ2V0TGluZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAobGluZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVkNhcmRFeGNlcHRpb24oIkV4cGVjdGVkIEVORDpWQ0FSRCB3YXMgbm90IGZvdW5kLiIpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxpbmUudHJpbSgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN0cmluZ1tdIHN0ckFycmF5ID0gbGluZS5zcGxpdCgiOiIsIDIpOwotICAgICAgICAgICAgaWYgKHN0ckFycmF5Lmxlbmd0aCA9PSAyICYmCi0gICAgICAgICAgICAgICAgICAgIHN0ckFycmF5WzBdLnRyaW0oKS5lcXVhbHNJZ25vcmVDYXNlKCJFTkQiKSAmJgotICAgICAgICAgICAgICAgICAgICBzdHJBcnJheVsxXS50cmltKCkuZXF1YWxzSWdub3JlQ2FzZSgiVkNBUkQiKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIWFsbG93R2FyYmFnZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBWQ2FyZEV4Y2VwdGlvbigiRU5EOlZDQVJEICE9IFwiIiArIG1QcmV2aW91c0xpbmUgKyAiXCIiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHVzZUNhY2hlID0gZmFsc2U7Ci0gICAgICAgIH0gd2hpbGUgKGFsbG93R2FyYmFnZSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIGl0ZW1zID0gKkNSTEYgaXRlbSAKLSAgICAgKiAgICAgICAvIGl0ZW0KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBwYXJzZUl0ZW1zKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGJvb2xlYW4gZW5kZWQgPSBmYWxzZTsKLSAgICAgICAgCi0gICAgICAgIGlmIChtQnVpbGRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICBtQnVpbGRlci5zdGFydFByb3BlcnR5KCk7Ci0gICAgICAgICAgICBtVGltZVN0YXJ0UHJvcGVydHkgKz0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydDsKLSAgICAgICAgfQotICAgICAgICBlbmRlZCA9IHBhcnNlSXRlbSgpOwotICAgICAgICBpZiAobUJ1aWxkZXIgIT0gbnVsbCAmJiAhZW5kZWQpIHsKLSAgICAgICAgICAgIGxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLmVuZFByb3BlcnR5KCk7Ci0gICAgICAgICAgICBtVGltZUVuZFByb3BlcnR5ICs9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhcnQ7Ci0gICAgICAgIH0KLQotICAgICAgICB3aGlsZSAoIWVuZGVkKSB7Ci0gICAgICAgICAgICAvLyBmb2xsb3cgVkNBUkQgLGl0IHdvbnQgcmVhY2ggZW5kUHJvcGVydHkKLSAgICAgICAgICAgIGlmIChtQnVpbGRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLnN0YXJ0UHJvcGVydHkoKTsKLSAgICAgICAgICAgICAgICBtVGltZVN0YXJ0UHJvcGVydHkgKz0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgZW5kZWQgPSBwYXJzZUl0ZW0oKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFZDYXJkSW52YWxpZENvbW1lbnRMaW5lRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiSW52YWxpZCBsaW5lIHdoaWNoIGxvb2tzIGxpa2Ugc29tZSBjb21tZW50IHdhcyBmb3VuZC4gSWdub3JlZC4iKTsKLSAgICAgICAgICAgICAgICBlbmRlZCA9IGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1CdWlsZGVyICE9IG51bGwgJiYgIWVuZGVkKSB7Ci0gICAgICAgICAgICAgICAgbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmVuZFByb3BlcnR5KCk7Ci0gICAgICAgICAgICAgICAgbVRpbWVFbmRQcm9wZXJ0eSArPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIGl0ZW0gPSBbZ3JvdXBzICIuIl0gbmFtZSAgICBbcGFyYW1zXSAiOiIgdmFsdWUgQ1JMRgotICAgICAqICAgICAgLyBbZ3JvdXBzICIuIl0gIkFEUiIgICBbcGFyYW1zXSAiOiIgYWRkcmVzc3BhcnRzIENSTEYKLSAgICAgKiAgICAgIC8gW2dyb3VwcyAiLiJdICJPUkciICAgW3BhcmFtc10gIjoiIG9yZ3BhcnRzIENSTEYKLSAgICAgKiAgICAgIC8gW2dyb3VwcyAiLiJdICJOIiAgICAgW3BhcmFtc10gIjoiIG5hbWVwYXJ0cyBDUkxGCi0gICAgICogICAgICAvIFtncm91cHMgIi4iXSAiQUdFTlQiIFtwYXJhbXNdICI6IiB2Y2FyZCBDUkxGCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcGFyc2VJdGVtKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgICAgIG1FbmNvZGluZyA9IHNEZWZhdWx0RW5jb2Rpbmc7Ci0KLSAgICAgICAgZmluYWwgU3RyaW5nIGxpbmUgPSBnZXROb25FbXB0eUxpbmUoKTsKLSAgICAgICAgbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCi0gICAgICAgIFN0cmluZ1tdIHByb3BlcnR5TmFtZUFuZFZhbHVlID0gc2VwYXJhdGVMaW5lQW5kSGFuZGxlR3JvdXAobGluZSk7Ci0gICAgICAgIGlmIChwcm9wZXJ0eU5hbWVBbmRWYWx1ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAocHJvcGVydHlOYW1lQW5kVmFsdWUubGVuZ3RoICE9IDIpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBWQ2FyZEludmFsaWRMaW5lRXhjZXB0aW9uKCJJbnZhbGlkIGxpbmUgXCIiICsgbGluZSArICJcIiIpOwotICAgICAgICB9Ci0gICAgICAgIFN0cmluZyBwcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eU5hbWVBbmRWYWx1ZVswXS50b1VwcGVyQ2FzZSgpOwotICAgICAgICBTdHJpbmcgcHJvcGVydHlWYWx1ZSA9IHByb3BlcnR5TmFtZUFuZFZhbHVlWzFdOwotCi0gICAgICAgIG1UaW1lUGFyc2VMaW5lQW5kSGFuZGxlR3JvdXAgKz0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydDsKLQotICAgICAgICBpZiAocHJvcGVydHlOYW1lLmVxdWFscygiQURSIikgfHwgcHJvcGVydHlOYW1lLmVxdWFscygiT1JHIikgfHwKLSAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWUuZXF1YWxzKCJOIikpIHsKLSAgICAgICAgICAgIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICBoYW5kbGVNdWx0aXBsZVByb3BlcnR5VmFsdWUocHJvcGVydHlOYW1lLCBwcm9wZXJ0eVZhbHVlKTsKLSAgICAgICAgICAgIG1UaW1lUGFyc2VBZHJPcmdOICs9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhcnQ7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0gZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscygiQUdFTlQiKSkgewotICAgICAgICAgICAgaGFuZGxlQWdlbnQocHJvcGVydHlWYWx1ZSk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0gZWxzZSBpZiAoaXNWYWxpZFByb3BlcnR5TmFtZShwcm9wZXJ0eU5hbWUpKSB7Ci0gICAgICAgICAgICBpZiAocHJvcGVydHlOYW1lLmVxdWFscygiQkVHSU4iKSkgewotICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eVZhbHVlLmVxdWFscygiVkNBUkQiKSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVkNhcmROZXN0ZWRFeGNlcHRpb24oIlRoaXMgdkNhcmQgaGFzIG5lc3RlZCB2Q2FyZCBkYXRhIGluIGl0LiIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBWQ2FyZEV4Y2VwdGlvbigiVW5rbm93biBCRUdJTiB0eXBlOiAiICsgcHJvcGVydHlWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKCJWRVJTSU9OIikgJiYKLSAgICAgICAgICAgICAgICAgICAgIXByb3BlcnR5VmFsdWUuZXF1YWxzKGdldFZlcnNpb25TdHJpbmcoKSkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVkNhcmRWZXJzaW9uRXhjZXB0aW9uKCJJbmNvbXBhdGlibGUgdmVyc2lvbjogIiArIAotICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlWYWx1ZSArICIgIT0gIiArIGdldFZlcnNpb25TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICAgICAgaGFuZGxlUHJvcGVydHlWYWx1ZShwcm9wZXJ0eU5hbWUsIHByb3BlcnR5VmFsdWUpOwotICAgICAgICAgICAgbVRpbWVQYXJzZVByb3BlcnR5VmFsdWVzICs9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhcnQ7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHRocm93IG5ldyBWQ2FyZEV4Y2VwdGlvbigiVW5rbm93biBwcm9wZXJ0eSBuYW1lOiBcIiIgKyBwcm9wZXJ0eU5hbWUgKyAiXCIiKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgcHJpdmF0ZSBmaW5hbCBpbnQgU1RBVEVfR1JPVVBfT1JfUFJPUE5BTUUgPSAwOwotICAgIHN0YXRpYyBwcml2YXRlIGZpbmFsIGludCBTVEFURV9QQVJBTVMgPSAxOwotICAgIC8vIHZDYXJkIDMuMCBzcGVjaWZpY2F0aW9uIGFsbG93cyBkb3VibGUtcXVvdGVkIHBhcmFtLXZhbHVlLCB3aGlsZSB2Q2FyZCAyLjEgZG9lcyBub3QuCi0gICAgLy8gVGhpcyBpcyBqdXN0IGZvciBzYWZldHkuCi0gICAgc3RhdGljIHByaXZhdGUgZmluYWwgaW50IFNUQVRFX1BBUkFNU19JTl9EUVVPVEUgPSAyOwotCi0gICAgcHJvdGVjdGVkIFN0cmluZ1tdIHNlcGFyYXRlTGluZUFuZEhhbmRsZUdyb3VwKFN0cmluZyBsaW5lKSB0aHJvd3MgVkNhcmRFeGNlcHRpb24gewotICAgICAgICBpbnQgc3RhdGUgPSBTVEFURV9HUk9VUF9PUl9QUk9QTkFNRTsKLSAgICAgICAgaW50IG5hbWVJbmRleCA9IDA7Ci0KLSAgICAgICAgZmluYWwgU3RyaW5nW10gcHJvcGVydHlOYW1lQW5kVmFsdWUgPSBuZXcgU3RyaW5nWzJdOwotCi0gICAgICAgIGZpbmFsIGludCBsZW5ndGggPSBsaW5lLmxlbmd0aCgpOwotICAgICAgICBpZiAobGVuZ3RoID4gMCAmJiBsaW5lLmNoYXJBdCgwKSA9PSAnIycpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBWQ2FyZEludmFsaWRDb21tZW50TGluZUV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotICAgICAgICAgICAgY2hhciBjaCA9IGxpbmUuY2hhckF0KGkpOyAKLSAgICAgICAgICAgIHN3aXRjaCAoc3RhdGUpIHsKLSAgICAgICAgICAgICAgICBjYXNlIFNUQVRFX0dST1VQX09SX1BST1BOQU1FOiB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PSAnOicpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwcm9wZXJ0eU5hbWUgPSBsaW5lLnN1YnN0cmluZyhuYW1lSW5kZXgsIGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJFTkQiKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QcmV2aW91c0xpbmUgPSBsaW5lOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1CdWlsZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQnVpbGRlci5wcm9wZXJ0eU5hbWUocHJvcGVydHlOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5TmFtZUFuZFZhbHVlWzBdID0gcHJvcGVydHlOYW1lOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPCBsZW5ndGggLSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlOYW1lQW5kVmFsdWVbMV0gPSBsaW5lLnN1YnN0cmluZyhpICsgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5TmFtZUFuZFZhbHVlWzFdID0gIiI7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJvcGVydHlOYW1lQW5kVmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJy4nKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZ3JvdXBOYW1lID0gbGluZS5zdWJzdHJpbmcobmFtZUluZGV4LCBpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQnVpbGRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJ1aWxkZXIucHJvcGVydHlHcm91cChncm91cE5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZUluZGV4ID0gaSArIDE7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJzsnKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcHJvcGVydHlOYW1lID0gbGluZS5zdWJzdHJpbmcobmFtZUluZGV4LCBpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiRU5EIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUHJldmlvdXNMaW5lID0gbGluZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQnVpbGRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJ1aWxkZXIucHJvcGVydHlOYW1lKHByb3BlcnR5TmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWVBbmRWYWx1ZVswXSA9IHByb3BlcnR5TmFtZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVJbmRleCA9IGkgKyAxOwotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBTVEFURV9QQVJBTVM7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhc2UgU1RBVEVfUEFSQU1TOiB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PSAnIicpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gU1RBVEVfUEFSQU1TX0lOX0RRVU9URTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnOycpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVBhcmFtcyhsaW5lLnN1YnN0cmluZyhuYW1lSW5kZXgsIGkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVJbmRleCA9IGkgKyAxOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09ICc6JykgewotICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlUGFyYW1zKGxpbmUuc3Vic3RyaW5nKG5hbWVJbmRleCwgaSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPCBsZW5ndGggLSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlOYW1lQW5kVmFsdWVbMV0gPSBsaW5lLnN1YnN0cmluZyhpICsgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5TmFtZUFuZFZhbHVlWzFdID0gIiI7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJvcGVydHlOYW1lQW5kVmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhc2UgU1RBVEVfUEFSQU1TX0lOX0RRVU9URTogewotICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJyInKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IFNUQVRFX1BBUkFNUzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHRocm93IG5ldyBWQ2FyZEludmFsaWRMaW5lRXhjZXB0aW9uKCJJbnZhbGlkIGxpbmU6IFwiIiArIGxpbmUgKyAiXCIiKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBwYXJhbXMgICAgID0gIjsiIFt3c10gcGFyYW1saXN0Ci0gICAgICogcGFyYW1saXN0ICA9IHBhcmFtbGlzdCBbd3NdICI7IiBbd3NdIHBhcmFtCi0gICAgICogICAgICAgICAgICAvIHBhcmFtCi0gICAgICogcGFyYW0gICAgICA9ICJUWVBFIiBbd3NdICI9IiBbd3NdIHB0eXBldmFsCi0gICAgICogICAgICAgICAgICAvICJWQUxVRSIgW3dzXSAiPSIgW3dzXSBwdmFsdWV2YWwKLSAgICAgKiAgICAgICAgICAgIC8gIkVOQ09ESU5HIiBbd3NdICI9IiBbd3NdIHBlbmNvZGluZ3ZhbAotICAgICAqICAgICAgICAgICAgLyAiQ0hBUlNFVCIgW3dzXSAiPSIgW3dzXSBjaGFyc2V0dmFsCi0gICAgICogICAgICAgICAgICAvICJMQU5HVUFHRSIgW3dzXSAiPSIgW3dzXSBsYW5ndmFsCi0gICAgICogICAgICAgICAgICAvICJYLSIgd29yZCBbd3NdICI9IiBbd3NdIHdvcmQKLSAgICAgKiAgICAgICAgICAgIC8ga25vd250eXBlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlUGFyYW1zKFN0cmluZyBwYXJhbXMpIHRocm93cyBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZ1tdIHN0ckFycmF5ID0gcGFyYW1zLnNwbGl0KCI9IiwgMik7Ci0gICAgICAgIGlmIChzdHJBcnJheS5sZW5ndGggPT0gMikgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nIHBhcmFtTmFtZSA9IHN0ckFycmF5WzBdLnRyaW0oKS50b1VwcGVyQ2FzZSgpOwotICAgICAgICAgICAgU3RyaW5nIHBhcmFtVmFsdWUgPSBzdHJBcnJheVsxXS50cmltKCk7Ci0gICAgICAgICAgICBpZiAocGFyYW1OYW1lLmVxdWFscygiVFlQRSIpKSB7Ci0gICAgICAgICAgICAgICAgaGFuZGxlVHlwZShwYXJhbVZhbHVlKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAocGFyYW1OYW1lLmVxdWFscygiVkFMVUUiKSkgewotICAgICAgICAgICAgICAgIGhhbmRsZVZhbHVlKHBhcmFtVmFsdWUpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJhbU5hbWUuZXF1YWxzKCJFTkNPRElORyIpKSB7Ci0gICAgICAgICAgICAgICAgaGFuZGxlRW5jb2RpbmcocGFyYW1WYWx1ZSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHBhcmFtTmFtZS5lcXVhbHMoIkNIQVJTRVQiKSkgewotICAgICAgICAgICAgICAgIGhhbmRsZUNoYXJzZXQocGFyYW1WYWx1ZSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHBhcmFtTmFtZS5lcXVhbHMoIkxBTkdVQUdFIikpIHsKLSAgICAgICAgICAgICAgICBoYW5kbGVMYW5ndWFnZShwYXJhbVZhbHVlKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAocGFyYW1OYW1lLnN0YXJ0c1dpdGgoIlgtIikpIHsKLSAgICAgICAgICAgICAgICBoYW5kbGVBbnlQYXJhbShwYXJhbU5hbWUsIHBhcmFtVmFsdWUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVkNhcmRFeGNlcHRpb24oIlVua25vd24gdHlwZSBcIiIgKyBwYXJhbU5hbWUgKyAiXCIiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGhhbmRsZVBhcmFtV2l0aG91dE5hbWUoc3RyQXJyYXlbMF0pOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIHZDYXJkIDMuMCBwYXJzZXIgbWF5IHRocm93IFZDYXJkRXhjZXB0aW9uLgotICAgICAqLwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQotICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZVBhcmFtV2l0aG91dE5hbWUoZmluYWwgU3RyaW5nIHBhcmFtVmFsdWUpIHRocm93cyBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGhhbmRsZVR5cGUocGFyYW1WYWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogcHR5cGV2YWwgPSBrbm93bnR5cGUgLyAiWC0iIHdvcmQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVUeXBlKGZpbmFsIFN0cmluZyBwdHlwZXZhbCkgewotICAgICAgICBTdHJpbmcgdXBwZXJUeXBlVmFsdWUgPSBwdHlwZXZhbDsKLSAgICAgICAgaWYgKCEoc0tub3duVHlwZVNldC5jb250YWlucyh1cHBlclR5cGVWYWx1ZSkgfHwgdXBwZXJUeXBlVmFsdWUuc3RhcnRzV2l0aCgiWC0iKSkgJiYgCi0gICAgICAgICAgICAgICAgIW1Vbmtub3duVHlwZU1hcC5jb250YWlucyhwdHlwZXZhbCkpIHsKLSAgICAgICAgICAgIG1Vbmtub3duVHlwZU1hcC5hZGQocHR5cGV2YWwpOwotICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgIlRZUEUgdW5zdXBwb3J0ZWQgYnkgdkNhcmQgMi4xOiAiICsgcHR5cGV2YWwpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtQnVpbGRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtQnVpbGRlci5wcm9wZXJ0eVBhcmFtVHlwZSgiVFlQRSIpOwotICAgICAgICAgICAgbUJ1aWxkZXIucHJvcGVydHlQYXJhbVZhbHVlKHVwcGVyVHlwZVZhbHVlKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBwdmFsdWV2YWwgPSAiSU5MSU5FIiAvICJVUkwiIC8gIkNPTlRFTlQtSUQiIC8gIkNJRCIgLyAiWC0iIHdvcmQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVWYWx1ZShmaW5hbCBTdHJpbmcgcHZhbHVldmFsKSB7Ci0gICAgICAgIGlmICghc0tub3duVmFsdWVTZXQuY29udGFpbnMocHZhbHVldmFsLnRvVXBwZXJDYXNlKCkpICYmCi0gICAgICAgICAgICAgICAgcHZhbHVldmFsLnN0YXJ0c1dpdGgoIlgtIikgJiYKLSAgICAgICAgICAgICAgICAhbVVua25vd25WYWx1ZU1hcC5jb250YWlucyhwdmFsdWV2YWwpKSB7Ci0gICAgICAgICAgICBtVW5rbm93blZhbHVlTWFwLmFkZChwdmFsdWV2YWwpOwotICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgIlZBTFVFIHVuc3VwcG9ydGVkIGJ5IHZDYXJkIDIuMTogIiArIHB2YWx1ZXZhbCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1CdWlsZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1CdWlsZGVyLnByb3BlcnR5UGFyYW1UeXBlKCJWQUxVRSIpOwotICAgICAgICAgICAgbUJ1aWxkZXIucHJvcGVydHlQYXJhbVZhbHVlKHB2YWx1ZXZhbCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogcGVuY29kaW5ndmFsID0gIjdCSVQiIC8gIjhCSVQiIC8gIlFVT1RFRC1QUklOVEFCTEUiIC8gIkJBU0U2NCIgLyAiWC0iIHdvcmQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVFbmNvZGluZyhTdHJpbmcgcGVuY29kaW5ndmFsKSB0aHJvd3MgVkNhcmRFeGNlcHRpb24gewotICAgICAgICBpZiAoaXNWYWxpZEVuY29kaW5nKHBlbmNvZGluZ3ZhbCkgfHwKLSAgICAgICAgICAgICAgICBwZW5jb2Rpbmd2YWwuc3RhcnRzV2l0aCgiWC0iKSkgewotICAgICAgICAgICAgaWYgKG1CdWlsZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5wcm9wZXJ0eVBhcmFtVHlwZSgiRU5DT0RJTkciKTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5wcm9wZXJ0eVBhcmFtVmFsdWUocGVuY29kaW5ndmFsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1FbmNvZGluZyA9IHBlbmNvZGluZ3ZhbDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBWQ2FyZEV4Y2VwdGlvbigiVW5rbm93biBlbmNvZGluZyBcIiIgKyBwZW5jb2Rpbmd2YWwgKyAiXCIiKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiB2Q2FyZCAyLjEgc3BlY2lmaWNhdGlvbiBvbmx5IGFsbG93cyB1cy1hc2NpaSBhbmQgaXNvLTg4NTkteHh4IChTZWUgUkZDIDE1MjEpLAotICAgICAqIGJ1dCB0b2RheSdzIHZDYXJkIG9mdGVuIGNvbnRhaW5zIG90aGVyIGNoYXJzZXQsIHNvIHdlIGFsbG93IHRoZW0uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlQ2hhcnNldChTdHJpbmcgY2hhcnNldHZhbCkgewotICAgICAgICBpZiAobUJ1aWxkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbUJ1aWxkZXIucHJvcGVydHlQYXJhbVR5cGUoIkNIQVJTRVQiKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLnByb3BlcnR5UGFyYW1WYWx1ZShjaGFyc2V0dmFsKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlZSBhbHNvIFNlY3Rpb24gNy4xIG9mIFJGQyAxNTIxCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlTGFuZ3VhZ2UoU3RyaW5nIGxhbmd2YWwpIHRocm93cyBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZ1tdIHN0ckFycmF5ID0gbGFuZ3ZhbC5zcGxpdCgiLSIpOwotICAgICAgICBpZiAoc3RyQXJyYXkubGVuZ3RoICE9IDIpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBWQ2FyZEV4Y2VwdGlvbigiSW52YWxpZCBMYW5ndWFnZTogXCIiICsgbGFuZ3ZhbCArICJcIiIpOwotICAgICAgICB9Ci0gICAgICAgIFN0cmluZyB0bXAgPSBzdHJBcnJheVswXTsKLSAgICAgICAgaW50IGxlbmd0aCA9IHRtcC5sZW5ndGgoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaWYgKCFpc0xldHRlcih0bXAuY2hhckF0KGkpKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBWQ2FyZEV4Y2VwdGlvbigiSW52YWxpZCBMYW5ndWFnZTogXCIiICsgbGFuZ3ZhbCArICJcIiIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHRtcCA9IHN0ckFycmF5WzFdOwotICAgICAgICBsZW5ndGggPSB0bXAubGVuZ3RoKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmICghaXNMZXR0ZXIodG1wLmNoYXJBdChpKSkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVkNhcmRFeGNlcHRpb24oIkludmFsaWQgTGFuZ3VhZ2U6IFwiIiArIGxhbmd2YWwgKyAiXCIiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAobUJ1aWxkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbUJ1aWxkZXIucHJvcGVydHlQYXJhbVR5cGUoIkxBTkdVQUdFIik7Ci0gICAgICAgICAgICBtQnVpbGRlci5wcm9wZXJ0eVBhcmFtVmFsdWUobGFuZ3ZhbCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNYWlubHkgZm9yICJYLSIgdHlwZS4gVGhpcyBhY2NlcHRzIGFueSBraW5kIG9mIHR5cGUgd2l0aG91dCBjaGVjay4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVBbnlQYXJhbShTdHJpbmcgcGFyYW1OYW1lLCBTdHJpbmcgcGFyYW1WYWx1ZSkgewotICAgICAgICBpZiAobUJ1aWxkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbUJ1aWxkZXIucHJvcGVydHlQYXJhbVR5cGUocGFyYW1OYW1lKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLnByb3BlcnR5UGFyYW1WYWx1ZShwYXJhbVZhbHVlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZVByb3BlcnR5VmFsdWUoU3RyaW5nIHByb3BlcnR5TmFtZSwgU3RyaW5nIHByb3BlcnR5VmFsdWUpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFZDYXJkRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKG1FbmNvZGluZy5lcXVhbHNJZ25vcmVDYXNlKCJRVU9URUQtUFJJTlRBQkxFIikpIHsKLSAgICAgICAgICAgIGZpbmFsIGxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyByZXN1bHQgPSBnZXRRdW90ZWRQcmludGFibGUocHJvcGVydHlWYWx1ZSk7Ci0gICAgICAgICAgICBpZiAobUJ1aWxkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IHYgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgICAgICAgICB2LmFkZChyZXN1bHQpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLnByb3BlcnR5VmFsdWVzKHYpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVRpbWVIYW5kbGVRdW90ZWRQcmludGFibGUgKz0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydDsKLSAgICAgICAgfSBlbHNlIGlmIChtRW5jb2RpbmcuZXF1YWxzSWdub3JlQ2FzZSgiQkFTRTY0IikgfHwKLSAgICAgICAgICAgICAgICBtRW5jb2RpbmcuZXF1YWxzSWdub3JlQ2FzZSgiQiIpKSB7Ci0gICAgICAgICAgICBmaW5hbCBsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICAvLyBJdCBpcyB2ZXJ5IHJhcmUsIGJ1dCBzb21lIEJBU0U2NCBkYXRhIG1heSBiZSBzbyBiaWcgdGhhdAotICAgICAgICAgICAgLy8gT3V0T2ZNZW1vcnlFcnJvciBvY2N1cnMuIFRvIGlnbm9yZSBzdWNoIGNhc2VzLCB1c2UgdHJ5LWNhdGNoLgotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcmVzdWx0ID0gZ2V0QmFzZTY0KHByb3BlcnR5VmFsdWUpOwotICAgICAgICAgICAgICAgIGlmIChtQnVpbGRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IHYgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgICAgICAgICAgICAgdi5hZGQocmVzdWx0KTsKLSAgICAgICAgICAgICAgICAgICAgbUJ1aWxkZXIucHJvcGVydHlWYWx1ZXModik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoT3V0T2ZNZW1vcnlFcnJvciBlcnJvcikgewotICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJPdXRPZk1lbW9yeUVycm9yIGhhcHBlbmVkIGR1cmluZyBwYXJzaW5nIEJBU0U2NCBkYXRhISIpOwotICAgICAgICAgICAgICAgIGlmIChtQnVpbGRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1CdWlsZGVyLnByb3BlcnR5VmFsdWVzKG51bGwpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1UaW1lSGFuZGxlQmFzZTY0ICs9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhcnQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoIShtRW5jb2RpbmcgPT0gbnVsbCB8fCBtRW5jb2RpbmcuZXF1YWxzSWdub3JlQ2FzZSgiN0JJVCIpCi0gICAgICAgICAgICAgICAgICAgIHx8IG1FbmNvZGluZy5lcXVhbHNJZ25vcmVDYXNlKCI4QklUIikKLSAgICAgICAgICAgICAgICAgICAgfHwgbUVuY29kaW5nLnRvVXBwZXJDYXNlKCkuc3RhcnRzV2l0aCgiWC0iKSkpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiVGhlIGVuY29kaW5nIHVuc3VwcG9ydGVkIGJ5IHZDYXJkIHNwZWM6IFwiIiArIG1FbmNvZGluZyArICJcIi4iKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZmluYWwgbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICAgICAgaWYgKG1CdWlsZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiB2ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgICAgICAgICAgdi5hZGQobWF5YmVVbmVzY2FwZVRleHQocHJvcGVydHlWYWx1ZSkpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLnByb3BlcnR5VmFsdWVzKHYpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVRpbWVIYW5kbGVNaXNjUHJvcGVydHlWYWx1ZSArPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0OwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UXVvdGVkUHJpbnRhYmxlKFN0cmluZyBmaXJzdFN0cmluZykgdGhyb3dzIElPRXhjZXB0aW9uLCBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIFNwZWNpZmljYWxseSwgdGhlcmUgbWF5IGJlIHNvbWUgcGFkZGluZyBiZXR3ZWVuID0gYW5kIENSTEYuCi0gICAgICAgIC8vIFNlZSB0aGUgZm9sbG93aW5nOgotICAgICAgICAvLwotICAgICAgICAvLyBxcC1saW5lIDo9ICoocXAtc2VnbWVudCB0cmFuc3BvcnQtcGFkZGluZyBDUkxGKQotICAgICAgICAvLyAgICAgICAgICAgIHFwLXBhcnQgdHJhbnNwb3J0LXBhZGRpbmcKLSAgICAgICAgLy8gcXAtc2VnbWVudCA6PSBxcC1zZWN0aW9uICooU1BBQ0UgLyBUQUIpICI9IgotICAgICAgICAvLyAgICAgICAgICAgICA7IE1heGltdW0gbGVuZ3RoIG9mIDc2IGNoYXJhY3RlcnMKLSAgICAgICAgLy8KLSAgICAgICAgLy8gZS5nLiAoZnJvbSBSRkMgMjA0NSkKLSAgICAgICAgLy8gTm93J3MgdGhlIHRpbWUgPQotICAgICAgICAvLyBmb3IgYWxsIGZvbGsgdG8gY29tZT0KLSAgICAgICAgLy8gIHRvIHRoZSBhaWQgb2YgdGhlaXIgY291bnRyeS4KLSAgICAgICAgaWYgKGZpcnN0U3RyaW5nLnRyaW0oKS5lbmRzV2l0aCgiPSIpKSB7Ci0gICAgICAgICAgICAvLyByZW1vdmUgInRyYW5zcG9ydC1wYWRkaW5nIgotICAgICAgICAgICAgaW50IHBvcyA9IGZpcnN0U3RyaW5nLmxlbmd0aCgpIC0gMTsKLSAgICAgICAgICAgIHdoaWxlKGZpcnN0U3RyaW5nLmNoYXJBdChwb3MpICE9ICc9JykgewotICAgICAgICAgICAgfQotICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGZpcnN0U3RyaW5nLnN1YnN0cmluZygwLCBwb3MgKyAxKSk7Ci0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiXHJcbiIpOwotICAgICAgICAgICAgU3RyaW5nIGxpbmU7Ci0gICAgICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICAgICAgIGxpbmUgPSBnZXRMaW5lKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGxpbmUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVkNhcmRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZpbGUgZW5kZWQgZHVyaW5nIHBhcnNpbmcgcXVvdGVkLXByaW50YWJsZSBTdHJpbmciKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGxpbmUudHJpbSgpLmVuZHNXaXRoKCI9IikpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlICJ0cmFuc3BvcnQtcGFkZGluZyIKLSAgICAgICAgICAgICAgICAgICAgcG9zID0gbGluZS5sZW5ndGgoKSAtIDE7Ci0gICAgICAgICAgICAgICAgICAgIHdoaWxlKGxpbmUuY2hhckF0KHBvcykgIT0gJz0nKSB7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQobGluZS5zdWJzdHJpbmcoMCwgcG9zICsgMSkpOwotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiXHJcbiIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGxpbmUpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gYnVpbGRlci50b1N0cmluZygpOyAKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBmaXJzdFN0cmluZzsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEJhc2U2NChTdHJpbmcgZmlyc3RTdHJpbmcpIHRocm93cyBJT0V4Y2VwdGlvbiwgVkNhcmRFeGNlcHRpb24gewotICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICBidWlsZGVyLmFwcGVuZChmaXJzdFN0cmluZyk7Ci0gICAgICAgIAotICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICAgU3RyaW5nIGxpbmUgPSBnZXRMaW5lKCk7Ci0gICAgICAgICAgICBpZiAobGluZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFZDYXJkRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgIkZpbGUgZW5kZWQgZHVyaW5nIHBhcnNpbmcgQkFTRTY0IGJpbmFyeSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGxpbmUubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQobGluZSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIE1haW5seSBmb3IgIkFEUiIsICJPUkciLCBhbmQgIk4iCi0gICAgICogV2UgZG8gbm90IGNhcmUgdGhlIG51bWJlciBvZiBzdHJub3NlbWkgaGVyZS4KLSAgICAgKiAKLSAgICAgKiBhZGRyZXNzcGFydHMgPSAwKjYoc3Rybm9zZW1pICI7Iikgc3Rybm9zZW1pCi0gICAgICogICAgICAgICAgICAgIDsgUE8gQm94LCBFeHRlbmRlZCBBZGRyLCBTdHJlZXQsIExvY2FsaXR5LCBSZWdpb24sCi0gICAgICogICAgICAgICAgICAgICAgUG9zdGFsIENvZGUsIENvdW50cnkgTmFtZQotICAgICAqIG9yZ3BhcnRzICAgICA9ICooc3Rybm9zZW1pICI7Iikgc3Rybm9zZW1pCi0gICAgICogICAgICAgICAgICAgIDsgRmlyc3QgaXMgT3JnYW5pemF0aW9uIE5hbWUsCi0gICAgICogICAgICAgICAgICAgICAgcmVtYWluZGVyIGFyZSBPcmdhbml6YXRpb24gVW5pdHMuCi0gICAgICogbmFtZXBhcnRzICAgID0gMCo0KHN0cm5vc2VtaSAiOyIpIHN0cm5vc2VtaQotICAgICAqICAgICAgICAgICAgICA7IEZhbWlseSwgR2l2ZW4sIE1pZGRsZSwgUHJlZml4LCBTdWZmaXguCi0gICAgICogICAgICAgICAgICAgIDsgRXhhbXBsZTpQdWJsaWM7Sm9objtRLjtSZXZlcmVuZCBEci47SUlJLCBFc3EuCi0gICAgICogc3Rybm9zZW1pICAgID0gKigqbm9uc2VtaSAoIlw7IiAvICJcIiBDUkxGKSkgKm5vbnNlbWkKLSAgICAgKiAgICAgICAgICAgICAgOyBUbyBpbmNsdWRlIGEgc2VtaWNvbG9uIGluIHRoaXMgc3RyaW5nLCBpdCBtdXN0IGJlIGVzY2FwZWQKLSAgICAgKiAgICAgICAgICAgICAgOyB3aXRoIGEgIlwiIGNoYXJhY3Rlci4KLSAgICAgKiAgICAgICAgICAgICAgCi0gICAgICogV2UgYXJlIG5vdCBzdXJlIHdoZXRoZXIgd2Ugc2hvdWxkIGFkZCAiXCIgQ1JMRiB0byBlYWNoIHZhbHVlLgotICAgICAqIEZvciBub3csIHdlIGV4Y2x1ZGUgdGhlbS4gICAgICAgICAgICAgICAKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVNdWx0aXBsZVByb3BlcnR5VmFsdWUoU3RyaW5nIHByb3BlcnR5TmFtZSwgU3RyaW5nIHByb3BlcnR5VmFsdWUpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFZDYXJkRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gdkNhcmQgMi4xIGRvZXMgbm90IGFsbG93IFFVT1RFRC1QUklOVEFCTEUgaGVyZSwKLSAgICAgICAgLy8gYnV0IHNvbWUgc29mdHdhcmVzL2RldmljZXMgZW1pdCBzdWNoIGRhdGEuCi0gICAgICAgIGlmIChtRW5jb2RpbmcuZXF1YWxzSWdub3JlQ2FzZSgiUVVPVEVELVBSSU5UQUJMRSIpKSB7Ci0gICAgICAgICAgICBwcm9wZXJ0eVZhbHVlID0gZ2V0UXVvdGVkUHJpbnRhYmxlKHByb3BlcnR5VmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1CdWlsZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1CdWlsZGVyLnByb3BlcnR5VmFsdWVzKFZDYXJkVXRpbHMuY29uc3RydWN0TGlzdEZyb21WYWx1ZSgKLSAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlWYWx1ZSwgKGdldFZlcnNpb24oKSA9PSBWQ2FyZENvbmZpZy5GTEFHX1YzMCkpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIHZDYXJkIDIuMSBzcGVjaWZpZXMgQUdFTlQgYWxsb3dzIG9uZSB2Y2FyZCBlbnRyeS4gSXQgaXMgbm90IGVuY29kZWQgYXQgYWxsLgotICAgICAqCi0gICAgICogaXRlbSAgPSAuLi4KLSAgICAgKiAgICAgICAvIFtncm91cHMgIi4iXSAiQUdFTlQiCi0gICAgICogICAgICAgICBbcGFyYW1zXSAiOiIgdmNhcmQgQ1JMRgotICAgICAqIHZjYXJkID0gIkJFR0lOIiBbd3NdICI6IiBbd3NdICJWQ0FSRCIgW3dzXSAxKkNSTEYKLSAgICAgKiAgICAgICAgIGl0ZW1zICpDUkxGICJFTkQiIFt3c10gIjoiIFt3c10gIlZDQVJEIgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZUFnZW50KGZpbmFsIFN0cmluZyBwcm9wZXJ0eVZhbHVlKSB0aHJvd3MgVkNhcmRFeGNlcHRpb24gewotICAgICAgICBpZiAoIXByb3BlcnR5VmFsdWUudG9VcHBlckNhc2UoKS5jb250YWlucygiQkVHSU46VkNBUkQiKSkgewotICAgICAgICAgICAgLy8gQXBwYXJlbnRseSBpbnZhbGlkIGxpbmUgc2VlbiBpbiBXaW5kb3dzIE1vYmlsZSA2LjUuIElnbm9yZSB0aGVtLgotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IFZDYXJkQWdlbnROb3RTdXBwb3J0ZWRFeGNlcHRpb24oIkFHRU5UIFByb3BlcnR5IGlzIG5vdCBzdXBwb3J0ZWQgbm93LiIpOwotICAgICAgICB9Ci0gICAgICAgIC8vIFRPRE86IFN1cHBvcnQgQUdFTlQgcHJvcGVydHkuCi0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEZvciB2Q2FyZCAzLjAuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBtYXliZVVuZXNjYXBlVGV4dChmaW5hbCBTdHJpbmcgdGV4dCkgewotICAgICAgICByZXR1cm4gdGV4dDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHVuZXNjYXBlZCBTdHJpbmcgaWYgdGhlIGNoYXJhY3RlciBzaG91bGQgYmUgdW5lc2NhcGVkLiBSZXR1cm4gbnVsbCBvdGhlcndpc2UuCi0gICAgICogZS5nLiBJbiB2Q2FyZCAyLjEsICJcOyIgc2hvdWxkIGJlIHVuZXNjYXBlZCBpbnRvICI7IiB3aGlsZSAiXHgiIHNob3VsZCBub3QgYmUuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBtYXliZVVuZXNjYXBlQ2hhcmFjdGVyKGZpbmFsIGNoYXIgY2gpIHsKLSAgICAgICAgcmV0dXJuIHVuZXNjYXBlQ2hhcmFjdGVyKGNoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB1bmVzY2FwZUNoYXJhY3RlcihmaW5hbCBjaGFyIGNoKSB7Ci0gICAgICAgIC8vIE9yaWdpbmFsIHZDYXJkIDIuMSBzcGVjaWZpY2F0aW9uIGRvZXMgbm90IGFsbG93IHRyYW5zZm9ybWF0aW9uCi0gICAgICAgIC8vICJcOiIgLT4gIjoiLCAiXCwiIC0+ICIsIiwgYW5kICJcXCIgLT4gIlwiLCBidXQgcHJldmlvdXMgaW1wbGVtZW50YXRpb24gb2YKLSAgICAgICAgLy8gdGhpcyBjbGFzcyBhbGxvd2VkIHRoZW0sIHNvIGtlZXAgaXQgYXMgaXMuCi0gICAgICAgIGlmIChjaCA9PSAnXFwnIHx8IGNoID09ICc7JyB8fCBjaCA9PSAnOicgfHwgY2ggPT0gJywnKSB7Ci0gICAgICAgICAgICByZXR1cm4gU3RyaW5nLnZhbHVlT2YoY2gpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gcGFyc2UoZmluYWwgSW5wdXRTdHJlYW0gaXMsIGZpbmFsIFZDYXJkSW50ZXJwcmV0ZXIgYnVpbGRlcikKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgVkNhcmRFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gcGFyc2UoaXMsIFZDYXJkQ29uZmlnLkRFRkFVTFRfQ0hBUlNFVCwgYnVpbGRlcik7Ci0gICAgfQotICAgIAotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIHBhcnNlKElucHV0U3RyZWFtIGlzLCBTdHJpbmcgY2hhcnNldCwgVkNhcmRJbnRlcnByZXRlciBidWlsZGVyKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChjaGFyc2V0ID09IG51bGwpIHsKLSAgICAgICAgICAgIGNoYXJzZXQgPSBWQ2FyZENvbmZpZy5ERUZBVUxUX0NIQVJTRVQ7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgSW5wdXRTdHJlYW1SZWFkZXIgdG1wUmVhZGVyID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKGlzLCBjaGFyc2V0KTsKLSAgICAgICAgaWYgKFZDYXJkQ29uZmlnLnNob3dQZXJmb3JtYW5jZUxvZygpKSB7Ci0gICAgICAgICAgICBtUmVhZGVyID0gbmV3IEN1c3RvbUJ1ZmZlcmVkUmVhZGVyKHRtcFJlYWRlcik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtUmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKHRtcFJlYWRlcik7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIG1CdWlsZGVyID0gYnVpbGRlcjsKLQotICAgICAgICBsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgIGlmIChtQnVpbGRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtQnVpbGRlci5zdGFydCgpOwotICAgICAgICB9Ci0gICAgICAgIHBhcnNlVkNhcmRGaWxlKCk7Ci0gICAgICAgIGlmIChtQnVpbGRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtQnVpbGRlci5lbmQoKTsKLSAgICAgICAgfQotICAgICAgICBtVGltZVRvdGFsICs9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhcnQ7Ci0gICAgICAgIAotICAgICAgICBpZiAoVkNhcmRDb25maWcuc2hvd1BlcmZvcm1hbmNlTG9nKCkpIHsKLSAgICAgICAgICAgIHNob3dQZXJmb3JtYW5jZUluZm8oKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIAotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHBhcnNlKElucHV0U3RyZWFtIGlzLCBTdHJpbmcgY2hhcnNldCwgVkNhcmRJbnRlcnByZXRlciBidWlsZGVyLCBib29sZWFuIGNhbmNlbGVkKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgICAgIG1DYW5jZWxlZCA9IGNhbmNlbGVkOwotICAgICAgICBwYXJzZShpcywgY2hhcnNldCwgYnVpbGRlcik7Ci0gICAgfQotICAgICAgICAKLSAgICBwcml2YXRlIHZvaWQgc2hvd1BlcmZvcm1hbmNlSW5mbygpIHsKLSAgICAgICAgTG9nLmQoTE9HX1RBRywgIlRvdGFsIHBhcnNpbmcgdGltZTogICIgKyBtVGltZVRvdGFsICsgIiBtcyIpOwotICAgICAgICBpZiAobVJlYWRlciBpbnN0YW5jZW9mIEN1c3RvbUJ1ZmZlcmVkUmVhZGVyKSB7Ci0gICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiVG90YWwgcmVhZExpbmUgdGltZTogIiArCi0gICAgICAgICAgICAgICAgICAgICgoQ3VzdG9tQnVmZmVyZWRSZWFkZXIpbVJlYWRlcikuZ2V0VG90YWxtaWxsaXNlY29uZCgpICsgIiBtcyIpOwotICAgICAgICB9Ci0gICAgICAgIExvZy5kKExPR19UQUcsICJUaW1lIGZvciBoYW5kbGluZyB0aGUgYmVnZ2luaW5nIG9mIHRoZSByZWNvcmQ6ICIgKwotICAgICAgICAgICAgICAgIG1UaW1lUmVhZFN0YXJ0UmVjb3JkICsgIiBtcyIpOwotICAgICAgICBMb2cuZChMT0dfVEFHLCAiVGltZSBmb3IgaGFuZGxpbmcgdGhlIGVuZCBvZiB0aGUgcmVjb3JkOiAiICsKLSAgICAgICAgICAgICAgICBtVGltZVJlYWRFbmRSZWNvcmQgKyAiIG1zIik7Ci0gICAgICAgIExvZy5kKExPR19UQUcsICJUaW1lIGZvciBwYXJzaW5nIGxpbmUsIGFuZCBoYW5kbGluZyBncm91cDogIiArCi0gICAgICAgICAgICAgICAgbVRpbWVQYXJzZUxpbmVBbmRIYW5kbGVHcm91cCArICIgbXMiKTsKLSAgICAgICAgTG9nLmQoTE9HX1RBRywgIlRpbWUgZm9yIHBhcnNpbmcgQURSLCBPUkcsIGFuZCBOIGZpZWxkczoiICsgbVRpbWVQYXJzZUFkck9yZ04gKyAiIG1zIik7Ci0gICAgICAgIExvZy5kKExPR19UQUcsICJUaW1lIGZvciBwYXJzaW5nIHByb3BlcnR5IHZhbHVlczogIiArIG1UaW1lUGFyc2VQcm9wZXJ0eVZhbHVlcyArICIgbXMiKTsKLSAgICAgICAgTG9nLmQoTE9HX1RBRywgIlRpbWUgZm9yIGhhbmRsaW5nIG5vcm1hbCBwcm9wZXJ0eSB2YWx1ZXM6ICIgKwotICAgICAgICAgICAgICAgIG1UaW1lSGFuZGxlTWlzY1Byb3BlcnR5VmFsdWUgKyAiIG1zIik7Ci0gICAgICAgIExvZy5kKExPR19UQUcsICJUaW1lIGZvciBoYW5kbGluZyBRdW90ZWQtUHJpbnRhYmxlOiAiICsKLSAgICAgICAgICAgICAgICBtVGltZUhhbmRsZVF1b3RlZFByaW50YWJsZSArICIgbXMiKTsKLSAgICAgICAgTG9nLmQoTE9HX1RBRywgIlRpbWUgZm9yIGhhbmRsaW5nIEJhc2U2NDogIiArIG1UaW1lSGFuZGxlQmFzZTY0ICsgIiBtcyIpOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0xldHRlcihjaGFyIGNoKSB7Ci0gICAgICAgIGlmICgoY2ggPj0gJ2EnICYmIGNoIDw9ICd6JykgfHwgKGNoID49ICdBJyAmJiBjaCA8PSAnWicpKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQotCi1jbGFzcyBDdXN0b21CdWZmZXJlZFJlYWRlciBleHRlbmRzIEJ1ZmZlcmVkUmVhZGVyIHsKLSAgICBwcml2YXRlIGxvbmcgbVRpbWU7Ci0gICAgCi0gICAgcHVibGljIEN1c3RvbUJ1ZmZlcmVkUmVhZGVyKFJlYWRlciBpbikgewotICAgICAgICBzdXBlcihpbik7Ci0gICAgfQotICAgIAotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgcmVhZExpbmUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgIFN0cmluZyByZXQgPSBzdXBlci5yZWFkTGluZSgpOwotICAgICAgICBsb25nIGVuZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICBtVGltZSArPSBlbmQgLSBzdGFydDsKLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGxvbmcgZ2V0VG90YWxtaWxsaXNlY29uZCgpIHsKLSAgICAgICAgcmV0dXJuIG1UaW1lOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZFBhcnNlcl9WMzAuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZFBhcnNlcl9WMzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVjZmU5Ny4uMDAwMDAwMAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRQYXJzZXJfVjMwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkOwotCi1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuZXhjZXB0aW9uLlZDYXJkRXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci0KLS8qKgotICogVGhlIGNsYXNzIHVzZWQgdG8gcGFyc2UgdkNhcmQgMy4wLgotICogUGxlYXNlIHJlZmVyIHRvIHZDYXJkIFNwZWNpZmljYXRpb24gMy4wIChodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMyNDI2KS4KLSAqLwotcHVibGljIGNsYXNzIFZDYXJkUGFyc2VyX1YzMCBleHRlbmRzIFZDYXJkUGFyc2VyX1YyMSB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiVkNhcmRQYXJzZXJfVjMwIjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEhhc2hTZXQ8U3RyaW5nPiBzQWNjZXB0YWJsZVByb3BzV2l0aFBhcmFtID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigKLSAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoCi0gICAgICAgICAgICAgICAgICAgICJCRUdJTiIsICJMT0dPIiwgIlBIT1RPIiwgIkxBQkVMIiwgIkZOIiwgIlRJVExFIiwgIlNPVU5EIiwgCi0gICAgICAgICAgICAgICAgICAgICJWRVJTSU9OIiwgIlRFTCIsICJFTUFJTCIsICJUWiIsICJHRU8iLCAiTk9URSIsICJVUkwiLAotICAgICAgICAgICAgICAgICAgICAiQkRBWSIsICJST0xFIiwgIlJFViIsICJVSUQiLCAiS0VZIiwgIk1BSUxFUiIsIC8vIDIuMQotICAgICAgICAgICAgICAgICAgICAiTkFNRSIsICJQUk9GSUxFIiwgIlNPVVJDRSIsICJOSUNLTkFNRSIsICJDTEFTUyIsCi0gICAgICAgICAgICAgICAgICAgICJTT1JULVNUUklORyIsICJDQVRFR09SSUVTIiwgIlBST0RJRCIpKTsgLy8gMy4wCi0gICAgCi0gICAgLy8gQWx0aG91Z2ggIjdiaXQiIGFuZCAiQkFTRTY0IiBpcyBub3QgYWxsb3dlZCBpbiB2Q2FyZCAzLjAsIHdlIGFsbG93IGl0IGZvciBzYWZldHkuCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSGFzaFNldDxTdHJpbmc+IHNBY2NlcHRhYmxlRW5jb2RpbmdWMzAgPSBuZXcgSGFzaFNldDxTdHJpbmc+KAotICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgiN0JJVCIsICI4QklUIiwgIkJBU0U2NCIsICJCIikpOwotICAgIAotICAgIC8vIEFsdGhvdWdoIFJGQyAyNDI2IHNwZWNpZmllcyBzb21lIHByb3BlcnR5IG11c3Qgbm90IGhhdmUgcGFyYW1ldGVycywgd2UgYWxsb3cgaXQsIAotICAgIC8vIHNpbmNlIHRoZXJlIG1heSBiZSBzb21lIGNhcmVlcnMgd2hpY2ggdmlvbGF0ZXMgdGhlIFJGQy4uLgotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEhhc2hTZXQ8U3RyaW5nPiBhY2NlcHRhYmxlUHJvcHNXaXRob3V0UGFyYW0gPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBtUHJldmlvdXNMaW5lOwotCi0gICAgcHJpdmF0ZSBib29sZWFuIG1FbWl0dGVkQWdlbnRXYXJuaW5nID0gZmFsc2U7Ci0KLSAgICAvKioKLSAgICAgKiBUcnVlIHdoZW4gdGhlIGNhbGxlciB3YW50cyB0aGUgcGFyc2VyIHRvIGJlIHN0cmljdCBhYm91dCB0aGUgaW5wdXQuCi0gICAgICogQ3VycmVudGx5IHRoaXMgaXMgb25seSBmb3IgdGVzdGluZy4KLSAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gbVN0cmljdFBhcnNpbmc7Ci0KLSAgICBwdWJsaWMgVkNhcmRQYXJzZXJfVjMwKCkgewotICAgICAgICBzdXBlcigpOwotICAgICAgICBtU3RyaWN0UGFyc2luZyA9IGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBzdHJpY3RQYXJzaW5nIHdoZW4gdHJ1ZSwgdGhpcyBvYmplY3QgdGhyb3dzIFZDYXJkRXhjZXB0aW9uIHdoZW4gdGhlIHZjYXJkIGlzIG5vdAotICAgICAqIHZhbGlkIGZyb20gdGhlIHZpZXcgb2YgdkNhcmQgMy4wIHNwZWNpZmljYXRpb24gKGRlZmluZWQgaW4gUkZDIDI0MjYpLiBOb3RlIHRoYXQgdGhpcyBjbGFzcwotICAgICAqIGlzIG5vdCBmdWxseSB5ZXQgZm9yIGJlaW5nIHVzZWQgd2l0aCB0aGlzIGZsYWcgYW5kIG1heSBub3Qgbm90aWNlIGludmFsaWQgbGluZShzKS4KLSAgICAgKgotICAgICAqIEBoaWRlIGN1cnJlbnRseSBvbmx5IGZvciB0ZXN0aW5nISAKLSAgICAgKi8KLSAgICBwdWJsaWMgVkNhcmRQYXJzZXJfVjMwKGJvb2xlYW4gc3RyaWN0UGFyc2luZykgewotICAgICAgICBzdXBlcigpOwotICAgICAgICBtU3RyaWN0UGFyc2luZyA9IHN0cmljdFBhcnNpbmc7Ci0gICAgfQotCi0gICAgcHVibGljIFZDYXJkUGFyc2VyX1YzMChpbnQgcGFyc2VNb2RlKSB7Ci0gICAgICAgIHN1cGVyKHBhcnNlTW9kZSk7Ci0gICAgICAgIG1TdHJpY3RQYXJzaW5nID0gZmFsc2U7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIGludCBnZXRWZXJzaW9uKCkgewotICAgICAgICByZXR1cm4gVkNhcmRDb25maWcuRkxBR19WMzA7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRWZXJzaW9uU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gVkNhcmRDb25zdGFudHMuVkVSU0lPTl9WMzA7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNWYWxpZFByb3BlcnR5TmFtZShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0gICAgICAgIGlmICghKHNBY2NlcHRhYmxlUHJvcHNXaXRoUGFyYW0uY29udGFpbnMocHJvcGVydHlOYW1lKSB8fAotICAgICAgICAgICAgICAgIGFjY2VwdGFibGVQcm9wc1dpdGhvdXRQYXJhbS5jb250YWlucyhwcm9wZXJ0eU5hbWUpIHx8Ci0gICAgICAgICAgICAgICAgcHJvcGVydHlOYW1lLnN0YXJ0c1dpdGgoIlgtIikpICYmCi0gICAgICAgICAgICAgICAgIW1Vbmtub3duVHlwZU1hcC5jb250YWlucyhwcm9wZXJ0eU5hbWUpKSB7Ci0gICAgICAgICAgICBtVW5rbm93blR5cGVNYXAuYWRkKHByb3BlcnR5TmFtZSk7Ci0gICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiUHJvcGVydHkgbmFtZSB1bnN1cHBvcnRlZCBieSB2Q2FyZCAzLjA6ICIgKyBwcm9wZXJ0eU5hbWUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBib29sZWFuIGlzVmFsaWRFbmNvZGluZyhTdHJpbmcgZW5jb2RpbmcpIHsKLSAgICAgICAgcmV0dXJuIHNBY2NlcHRhYmxlRW5jb2RpbmdWMzAuY29udGFpbnMoZW5jb2RpbmcudG9VcHBlckNhc2UoKSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRMaW5lKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKG1QcmV2aW91c0xpbmUgIT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIHJldCA9IG1QcmV2aW91c0xpbmU7Ci0gICAgICAgICAgICBtUHJldmlvdXNMaW5lID0gbnVsbDsKLSAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbVJlYWRlci5yZWFkTGluZSgpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIHZDYXJkIDMuMCByZXF1aXJlcyB0aGF0IHRoZSBsaW5lIHdpdGggc3BhY2UgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbGluZQotICAgICAqIG11c3QgYmUgY29tYmluZWQgd2l0aCBwcmV2aW91cyBsaW5lLiAKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldE5vbkVtcHR5TGluZSgpIHRocm93cyBJT0V4Y2VwdGlvbiwgVkNhcmRFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgbGluZTsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbnVsbDsKLSAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgIGxpbmUgPSBtUmVhZGVyLnJlYWRMaW5lKCk7Ci0gICAgICAgICAgICBpZiAobGluZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGJ1aWxkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gYnVpbGRlci50b1N0cmluZygpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobVByZXZpb3VzTGluZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyByZXQgPSBtUHJldmlvdXNMaW5lOwotICAgICAgICAgICAgICAgICAgICBtUHJldmlvdXNMaW5lID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFZDYXJkRXhjZXB0aW9uKCJSZWFjaGVkIGVuZCBvZiBidWZmZXIuIik7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGxpbmUubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgICAgIGlmIChidWlsZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1QcmV2aW91c0xpbmUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcmV0ID0gbVByZXZpb3VzTGluZTsKLSAgICAgICAgICAgICAgICAgICAgbVByZXZpb3VzTGluZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChsaW5lLmNoYXJBdCgwKSA9PSAnICcgfHwgbGluZS5jaGFyQXQoMCkgPT0gJ1x0JykgewotICAgICAgICAgICAgICAgIGlmIChidWlsZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gU2VlIFNlY3Rpb24gNS44LjEgb2YgUkZDIDI0MjUgKE1JTUUtRElSIGRvY3VtZW50KS4KLSAgICAgICAgICAgICAgICAgICAgLy8gRm9sbG93aW5nIGlzIHRoZSBleGNlcnB0cyBmcm9tIGl0LiAgCi0gICAgICAgICAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAgICAgICAgIC8vIERFU0NSSVBUSU9OOlRoaXMgaXMgYSBsb25nIGRlc2NyaXB0aW9uIHRoYXQgZXhpc3RzIG9uIGEgbG9uZyBsaW5lLgotICAgICAgICAgICAgICAgICAgICAvLyAKLSAgICAgICAgICAgICAgICAgICAgLy8gQ2FuIGJlIHJlcHJlc2VudGVkIGFzOgotICAgICAgICAgICAgICAgICAgICAvLwotICAgICAgICAgICAgICAgICAgICAvLyBERVNDUklQVElPTjpUaGlzIGlzIGEgbG9uZyBkZXNjcmlwdGlvbgotICAgICAgICAgICAgICAgICAgICAvLyAgdGhhdCBleGlzdHMgb24gYSBsb25nIGxpbmUuCi0gICAgICAgICAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAgICAgICAgIC8vIEl0IGNvdWxkIGFsc28gYmUgcmVwcmVzZW50ZWQgYXM6Ci0gICAgICAgICAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAgICAgICAgIC8vIERFU0NSSVBUSU9OOlRoaXMgaXMgYSBsb25nIGRlc2NyaXAKLSAgICAgICAgICAgICAgICAgICAgLy8gIHRpb24gdGhhdCBleGlzdHMgbwotICAgICAgICAgICAgICAgICAgICAvLyAgbiBhIGxvbmcgbGluZS4KLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQobGluZS5zdWJzdHJpbmcoMSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobVByZXZpb3VzTGluZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChtUHJldmlvdXNMaW5lKTsKLSAgICAgICAgICAgICAgICAgICAgbVByZXZpb3VzTGluZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGxpbmUuc3Vic3RyaW5nKDEpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVkNhcmRFeGNlcHRpb24oIlNwYWNlIGV4aXN0cyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaW5lIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAobVByZXZpb3VzTGluZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1QcmV2aW91c0xpbmUgPSBsaW5lOwotICAgICAgICAgICAgICAgICAgICBpZiAoYnVpbGRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYnVpbGRlci50b1N0cmluZygpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJldCA9IG1QcmV2aW91c0xpbmU7Ci0gICAgICAgICAgICAgICAgICAgIG1QcmV2aW91c0xpbmUgPSBsaW5lOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAKLSAgICAvKioKLSAgICAgKiB2Y2FyZCA9IFtncm91cCAiLiJdICJCRUdJTiIgIjoiICJWQ0FSRCIgMSAqIENSTEYKLSAgICAgKiAgICAgICAgIDEgKiAoY29udGVudGxpbmUpCi0gICAgICogICAgICAgICA7QSB2Q2FyZCBvYmplY3QgTVVTVCBpbmNsdWRlIHRoZSBWRVJTSU9OLCBGTiBhbmQgTiB0eXBlcy4KLSAgICAgKiAgICAgICAgIFtncm91cCAiLiJdICJFTkQiICI6IiAiVkNBUkQiIDEgKiBDUkxGCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcmVhZEJlZ2luVkNhcmQoYm9vbGVhbiBhbGxvd0dhcmJhZ2UpIHRocm93cyBJT0V4Y2VwdGlvbiwgVkNhcmRFeGNlcHRpb24gewotICAgICAgICAvLyBUT0RPOiB2Q2FyZCAzLjAgc3VwcG9ydHMgZ3JvdXAuCi0gICAgICAgIHJldHVybiBzdXBlci5yZWFkQmVnaW5WQ2FyZChhbGxvd0dhcmJhZ2UpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHJlYWRFbmRWQ2FyZChib29sZWFuIHVzZUNhY2hlLCBib29sZWFuIGFsbG93R2FyYmFnZSkKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgVkNhcmRFeGNlcHRpb24gewotICAgICAgICAvLyBUT0RPOiB2Q2FyZCAzLjAgc3VwcG9ydHMgZ3JvdXAuCi0gICAgICAgIHN1cGVyLnJlYWRFbmRWQ2FyZCh1c2VDYWNoZSwgYWxsb3dHYXJiYWdlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB2Q2FyZCAzLjAgYWxsb3dzIGlhbmEtdG9rZW4gYXMgcGFyYW1UeXBlLCB3aGlsZSB2Q2FyZCAyLjEgZG9lcyBub3QuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlUGFyYW1zKFN0cmluZyBwYXJhbXMpIHRocm93cyBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzdXBlci5oYW5kbGVQYXJhbXMocGFyYW1zKTsKLSAgICAgICAgfSBjYXRjaCAoVkNhcmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gbWF5YmUgSUFOQSB0eXBlCi0gICAgICAgICAgICBTdHJpbmdbXSBzdHJBcnJheSA9IHBhcmFtcy5zcGxpdCgiPSIsIDIpOwotICAgICAgICAgICAgaWYgKHN0ckFycmF5Lmxlbmd0aCA9PSAyKSB7Ci0gICAgICAgICAgICAgICAgaGFuZGxlQW55UGFyYW0oc3RyQXJyYXlbMF0sIHN0ckFycmF5WzFdKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gTXVzdCBub3QgY29tZSBoZXJlIGluIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uLgotICAgICAgICAgICAgICAgIHRocm93IG5ldyBWQ2FyZEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICJVbmtub3duIHBhcmFtcyB2YWx1ZTogIiArIHBhcmFtcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVBbnlQYXJhbShTdHJpbmcgcGFyYW1OYW1lLCBTdHJpbmcgcGFyYW1WYWx1ZSkgewotICAgICAgICBzdXBlci5oYW5kbGVBbnlQYXJhbShwYXJhbU5hbWUsIHBhcmFtVmFsdWUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZVBhcmFtV2l0aG91dE5hbWUoZmluYWwgU3RyaW5nIHBhcmFtVmFsdWUpIHRocm93cyBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChtU3RyaWN0UGFyc2luZykgewotICAgICAgICAgICAgdGhyb3cgbmV3IFZDYXJkRXhjZXB0aW9uKCJQYXJhbWV0ZXIgd2l0aG91dCBuYW1lIGlzIG5vdCBhY2NlcHRhYmxlIGluIHZDYXJkIDMuMCIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3VwZXIuaGFuZGxlUGFyYW1XaXRob3V0TmFtZShwYXJhbVZhbHVlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqICB2Q2FyZCAzLjAgZGVmaW5lcwotICAgICAqICAKLSAgICAgKiAgcGFyYW0gICAgICAgICA9IHBhcmFtLW5hbWUgIj0iIHBhcmFtLXZhbHVlICooIiwiIHBhcmFtLXZhbHVlKQotICAgICAqICBwYXJhbS1uYW1lICAgID0gaWFuYS10b2tlbiAvIHgtbmFtZQotICAgICAqICBwYXJhbS12YWx1ZSAgID0gcHRleHQgLyBxdW90ZWQtc3RyaW5nCi0gICAgICogIHF1b3RlZC1zdHJpbmcgPSBEUVVPVEUgUVNBRkUtQ0hBUiBEUVVPVEUKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVUeXBlKFN0cmluZyBwdHlwZXZhbHVlcykgewotICAgICAgICBTdHJpbmdbXSBwdHlwZUFycmF5ID0gcHR5cGV2YWx1ZXMuc3BsaXQoIiwiKTsKLSAgICAgICAgbUJ1aWxkZXIucHJvcGVydHlQYXJhbVR5cGUoIlRZUEUiKTsKLSAgICAgICAgZm9yIChTdHJpbmcgdmFsdWUgOiBwdHlwZUFycmF5KSB7Ci0gICAgICAgICAgICBpbnQgbGVuZ3RoID0gdmFsdWUubGVuZ3RoKCk7Ci0gICAgICAgICAgICBpZiAobGVuZ3RoID49IDIgJiYgdmFsdWUuc3RhcnRzV2l0aCgiXCIiKSAmJiB2YWx1ZS5lbmRzV2l0aCgiXCIiKSkgewotICAgICAgICAgICAgICAgIG1CdWlsZGVyLnByb3BlcnR5UGFyYW1WYWx1ZSh2YWx1ZS5zdWJzdHJpbmcoMSwgdmFsdWUubGVuZ3RoKCkgLSAxKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1CdWlsZGVyLnByb3BlcnR5UGFyYW1WYWx1ZSh2YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVBZ2VudChTdHJpbmcgcHJvcGVydHlWYWx1ZSkgewotICAgICAgICAvLyBUaGUgd2F5IGhvdyB2Q2FyZCAzLjAgc3VwcG9ydHMgIkFHRU5UIiBpcyBjb21wbGV0ZWx5IGRpZmZlcmVudCBmcm9tIHZDYXJkIDIuMS4KLSAgICAgICAgLy8KLSAgICAgICAgLy8gZS5nLgotICAgICAgICAvLyBBR0VOVDpCRUdJTjpWQ0FSRFxuRk46Sm9lIEZyaWRheVxuVEVMOisxLTkxOS01NTUtNzg3OFxuCi0gICAgICAgIC8vICBUSVRMRTpBcmVhIEFkbWluaXN0cmF0b3JcLCBBc3Npc3RhbnRcbiBFTUFJTFw7VFlQRT1JTlRFUk5cbgotICAgICAgICAvLyAgRVQ6amZyaWRheUBob3N0LmNvbVxuRU5EOlZDQVJEXG4KLSAgICAgICAgLy8KLSAgICAgICAgLy8gVE9ETzogZml4IHRoaXMuCi0gICAgICAgIC8vCi0gICAgICAgIC8vIGlzc3VlOgotICAgICAgICAvLyAgdkNhcmQgMy4wIGFsc28gYWxsb3dzIHRoaXMgYXMgYW4gZXhhbXBsZS4KLSAgICAgICAgLy8KLSAgICAgICAgLy8gQUdFTlQ7VkFMVUU9dXJpOgotICAgICAgICAvLyAgQ0lEOkpRUFVCTElDLnBhcnQzLjk2MDEyOVQwODMwMjAueHl6TWFpbEBob3N0My5jb20KLSAgICAgICAgLy8KLSAgICAgICAgLy8gVGhpcyBpcyBub3QgdkNhcmQuIFNob3VsZCB3ZSBzdXBwb3J0IHRoaXM/Ci0gICAgICAgIC8vCi0gICAgICAgIC8vIEp1c3QgaWdub3JlIHRoZSBsaW5lIGZvciBub3csIHNpbmNlIHdlIGNhbm5vdCBrbm93IGhvdyB0byBoYW5kbGUgaXQuLi4KLSAgICAgICAgaWYgKCFtRW1pdHRlZEFnZW50V2FybmluZykgewotICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgIkFHRU5UIGluIHZDYXJkIDMuMCBpcyBub3Qgc3VwcG9ydGVkIHlldC4gSWdub3JlIGl0Iik7Ci0gICAgICAgICAgICBtRW1pdHRlZEFnZW50V2FybmluZyA9IHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogdkNhcmQgMy4wIGRvZXMgbm90IHJlcXVpcmUgdHdvIENSTEYgYXQgdGhlIGxhc3Qgb2YgQkFTRTY0IGRhdGEuCi0gICAgICogSXQgb25seSByZXF1aXJlcyB0aGF0IGRhdGEgc2hvdWxkIGJlIE1JTUUtZW5jb2RlZC4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEJhc2U2NChTdHJpbmcgZmlyc3RTdHJpbmcpIHRocm93cyBJT0V4Y2VwdGlvbiwgVkNhcmRFeGNlcHRpb24gewotICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICBidWlsZGVyLmFwcGVuZChmaXJzdFN0cmluZyk7Ci0KLSAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgIFN0cmluZyBsaW5lID0gZ2V0TGluZSgpOwotICAgICAgICAgICAgaWYgKGxpbmUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBWQ2FyZEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICJGaWxlIGVuZGVkIGR1cmluZyBwYXJzaW5nIEJBU0U2NCBiaW5hcnkiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChsaW5lLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIWxpbmUuc3RhcnRzV2l0aCgiICIpICYmICFsaW5lLnN0YXJ0c1dpdGgoIlx0IikpIHsKLSAgICAgICAgICAgICAgICBtUHJldmlvdXNMaW5lID0gbGluZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGxpbmUpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gYnVpbGRlci50b1N0cmluZygpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBFU0NBUEVELUNIQVIgPSAiXFwiIC8gIlw7IiAvICJcLCIgLyAiXG4iIC8gIlxOIikKLSAgICAgKiAgICAgICAgICAgICAgOyBcXCBlbmNvZGVzIFwsIFxuIG9yIFxOIGVuY29kZXMgbmV3bGluZQotICAgICAqICAgICAgICAgICAgICA7IFw7IGVuY29kZXMgOywgXCwgZW5jb2RlcyAsCi0gICAgICogICAgICAgICAgICAgIAotICAgICAqIE5vdGU6IEFwcGxlIGVzY2FwZXMgJzonIGludG8gJ1w6JyB3aGlsZSBkb2VzIG5vdCBlc2NhcGUgJ1wnCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBtYXliZVVuZXNjYXBlVGV4dChTdHJpbmcgdGV4dCkgewotICAgICAgICByZXR1cm4gdW5lc2NhcGVUZXh0KHRleHQpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHVuZXNjYXBlVGV4dChTdHJpbmcgdGV4dCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICBpbnQgbGVuZ3RoID0gdGV4dC5sZW5ndGgoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotICAgICAgICAgICAgY2hhciBjaCA9IHRleHQuY2hhckF0KGkpOwotICAgICAgICAgICAgaWYgKGNoID09ICdcXCcgJiYgaSA8IGxlbmd0aCAtIDEpIHsKLSAgICAgICAgICAgICAgICBjaGFyIG5leHRfY2ggPSB0ZXh0LmNoYXJBdCgrK2kpOyAKLSAgICAgICAgICAgICAgICBpZiAobmV4dF9jaCA9PSAnbicgfHwgbmV4dF9jaCA9PSAnTicpIHsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIlxuIik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQobmV4dF9jaCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChjaCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsgICAgICAgIAotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgbWF5YmVVbmVzY2FwZUNoYXJhY3RlcihjaGFyIGNoKSB7Ci0gICAgICAgIHJldHVybiB1bmVzY2FwZUNoYXJhY3RlcihjaCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgdW5lc2NhcGVDaGFyYWN0ZXIoY2hhciBjaCkgewotICAgICAgICBpZiAoY2ggPT0gJ24nIHx8IGNoID09ICdOJykgewotICAgICAgICAgICAgcmV0dXJuICJcbiI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gU3RyaW5nLnZhbHVlT2YoY2gpOwotICAgICAgICB9ICAgICAgICAKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRTb3VyY2VEZXRlY3Rvci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkU291cmNlRGV0ZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzI5N2M1MC4uMDAwMDAwMAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRTb3VyY2VEZXRlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiBDbGFzcyB3aGljaCB0cmllcyB0byBkZXRlY3RzIHRoZSBzb3VyY2Ugb2YgdGhlIHZDYXJkIGZyb20gaXRzIHByb3BlcnRpZXMuCi0gKiBDdXJyZW50bHkgdGhpcyBpbXBsZW1lbnRhdGlvbiBpcyB2ZXJ5IHByZW1hdHVyZS4KLSAqIEBoaWRlCi0gKi8KLXB1YmxpYyBjbGFzcyBWQ2FyZFNvdXJjZURldGVjdG9yIGltcGxlbWVudHMgVkNhcmRJbnRlcnByZXRlciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgU2V0PFN0cmluZz4gQVBQTEVfU0lHTlMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KEFycmF5cy5hc0xpc3QoCi0gICAgICAgICAgICAiWC1QSE9ORVRJQy1GSVJTVC1OQU1FIiwgIlgtUEhPTkVUSUMtTUlERExFLU5BTUUiLCAiWC1QSE9ORVRJQy1MQVNULU5BTUUiLAotICAgICAgICAgICAgIlgtQUJBRFIiLCAiWC1BQlVJRCIpKTsKLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBTZXQ8U3RyaW5nPiBKQVBBTkVTRV9NT0JJTEVfUEhPTkVfU0lHTlMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KEFycmF5cy5hc0xpc3QoCi0gICAgICAgICAgICAiWC1HTk8iLCAiWC1HTiIsICJYLVJFRFVDVElPTiIpKTsKLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBTZXQ8U3RyaW5nPiBXSU5ET1dTX01PQklMRV9QSE9ORV9TSUdOUyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oQXJyYXlzLmFzTGlzdCgKLSAgICAgICAgICAgICJYLU1JQ1JPU09GVC1BU1NUX1RFTCIsICJYLU1JQ1JPU09GVC1BU1NJU1RBTlQiLCAiWC1NSUNST1NPRlQtT0ZGSUNFTE9DIikpOwotICAgIAotICAgIC8vIE5vdGU6IHRoZXNlIHNpZ25lcyBhcHBlYXJzIGJlZm9yZSB0aGUgc2lnbnMgb2YgdGhlIG90aGVyIHR5cGUgKGUuZy4gIlgtR04iKS4KLSAgICAvLyBJbiBvdGhlciB3b3JkcywgSmFwYW5lc2UgRk9NQSBtb2JpbGUgcGhvbmVzIGFyZSBkZXRlY3RlZCBhcyBGT01BLCBub3QgSkFQQU5FU0VfTU9CSUxFX1BIT05FUy4KLSAgICBwcml2YXRlIHN0YXRpYyBTZXQ8U3RyaW5nPiBGT01BX1NJR05TID0gbmV3IEhhc2hTZXQ8U3RyaW5nPihBcnJheXMuYXNMaXN0KAotICAgICAgICAgICAgIlgtU0QtVkVSTiIsICJYLVNELUZPUk1BVF9WRVIiLCAiWC1TRC1DQVRFR09SSUVTIiwgIlgtU0QtQ0xBU1MiLCAiWC1TRC1EQ1JFQVRFRCIsCi0gICAgICAgICAgICAiWC1TRC1ERVNDUklQVElPTiIpKTsKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgVFlQRV9GT01BX0NIQVJTRVRfU0lHTiA9ICJYLVNELUNIQVJfQ09ERSI7Ci0gICAgCi0gICAgcHJpdmF0ZSBpbnQgbVR5cGUgPSBWQ2FyZENvbmZpZy5QQVJTRV9UWVBFX1VOS05PV047Ci0gICAgLy8gU29tZSBtb2JpbGUgcGhvbmVzIChsaWtlIEZPTUEpIHRlbGxzIHVzIHRoZSBjaGFyc2V0IG9mIHRoZSBkYXRhLgotICAgIHByaXZhdGUgYm9vbGVhbiBtTmVlZFBhcnNlU3BlY2lmaWVkQ2hhcnNldDsKLSAgICBwcml2YXRlIFN0cmluZyBtU3BlY2lmaWVkQ2hhcnNldDsKLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzdGFydCgpIHsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgZW5kKCkgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHN0YXJ0RW50cnkoKSB7Ci0gICAgfSAgICAKLQotICAgIHB1YmxpYyB2b2lkIHN0YXJ0UHJvcGVydHkoKSB7Ci0gICAgICAgIG1OZWVkUGFyc2VTcGVjaWZpZWRDaGFyc2V0ID0gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGVuZFByb3BlcnR5KCkgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGVuZEVudHJ5KCkgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5R3JvdXAoU3RyaW5nIGdyb3VwKSB7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5TmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICBpZiAobmFtZS5lcXVhbHNJZ25vcmVDYXNlKFRZUEVfRk9NQV9DSEFSU0VUX1NJR04pKSB7Ci0gICAgICAgICAgICBtVHlwZSA9IFZDYXJkQ29uZmlnLlBBUlNFX1RZUEVfRk9NQTsKLSAgICAgICAgICAgIG1OZWVkUGFyc2VTcGVjaWZpZWRDaGFyc2V0ID0gdHJ1ZTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAobVR5cGUgIT0gVkNhcmRDb25maWcuUEFSU0VfVFlQRV9VTktOT1dOKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKFdJTkRPV1NfTU9CSUxFX1BIT05FX1NJR05TLmNvbnRhaW5zKG5hbWUpKSB7Ci0gICAgICAgICAgICBtVHlwZSA9IFZDYXJkQ29uZmlnLlBBUlNFX1RZUEVfV0lORE9XU19NT0JJTEVfSlA7Ci0gICAgICAgIH0gZWxzZSBpZiAoRk9NQV9TSUdOUy5jb250YWlucyhuYW1lKSkgewotICAgICAgICAgICAgbVR5cGUgPSBWQ2FyZENvbmZpZy5QQVJTRV9UWVBFX0ZPTUE7Ci0gICAgICAgIH0gZWxzZSBpZiAoSkFQQU5FU0VfTU9CSUxFX1BIT05FX1NJR05TLmNvbnRhaW5zKG5hbWUpKSB7Ci0gICAgICAgICAgICBtVHlwZSA9IFZDYXJkQ29uZmlnLlBBUlNFX1RZUEVfTU9CSUxFX1BIT05FX0pQOwotICAgICAgICB9IGVsc2UgaWYgKEFQUExFX1NJR05TLmNvbnRhaW5zKG5hbWUpKSB7Ci0gICAgICAgICAgICBtVHlwZSA9IFZDYXJkQ29uZmlnLlBBUlNFX1RZUEVfQVBQTEU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eVBhcmFtVHlwZShTdHJpbmcgdHlwZSkgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5UGFyYW1WYWx1ZShTdHJpbmcgdmFsdWUpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eVZhbHVlcyhMaXN0PFN0cmluZz4gdmFsdWVzKSB7Ci0gICAgICAgIGlmIChtTmVlZFBhcnNlU3BlY2lmaWVkQ2hhcnNldCAmJiB2YWx1ZXMuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgbVNwZWNpZmllZENoYXJzZXQgPSB2YWx1ZXMuZ2V0KDApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogcGFja2FnZSAqLyBpbnQgZ2V0RXN0aW1hdGVkVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIG1UeXBlOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm4gY2hhcnNldCBTdHJpbmcgZ3Vlc3NlZCBmcm9tIHRoZSBzb3VyY2UncyBwcm9wZXJ0aWVzLgotICAgICAqIFRoaXMgbWV0aG9kIG11c3QgYmUgY2FsbGVkIGFmdGVyIHBhcnNpbmcgdGFyZ2V0IGZpbGUocykuCi0gICAgICogQHJldHVybiBDaGFyc2V0IFN0cmluZy4gTnVsbCBpcyByZXR1cm5lZCBpZiBndWVzc2luZyB0aGUgc291cmNlIGZhaWxzLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RXN0aW1hdGVkQ2hhcnNldCgpIHsKLSAgICAgICAgaWYgKG1TcGVjaWZpZWRDaGFyc2V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBtU3BlY2lmaWVkQ2hhcnNldDsKLSAgICAgICAgfQotICAgICAgICBzd2l0Y2ggKG1UeXBlKSB7Ci0gICAgICAgICAgICBjYXNlIFZDYXJkQ29uZmlnLlBBUlNFX1RZUEVfV0lORE9XU19NT0JJTEVfSlA6Ci0gICAgICAgICAgICBjYXNlIFZDYXJkQ29uZmlnLlBBUlNFX1RZUEVfRk9NQToKLSAgICAgICAgICAgIGNhc2UgVkNhcmRDb25maWcuUEFSU0VfVFlQRV9NT0JJTEVfUEhPTkVfSlA6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJTSElGVF9KSVMiOwotICAgICAgICAgICAgY2FzZSBWQ2FyZENvbmZpZy5QQVJTRV9UWVBFX0FQUExFOgotICAgICAgICAgICAgICAgIHJldHVybiAiVVRGLTgiOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZFV0aWxzLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTcyNzk5Li4wMDAwMDAwCi0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZFV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ODIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRQcm92aWRlck9wZXJhdGlvbjsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLkltOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuUGhvbmU7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5TdHJ1Y3R1cmVkUG9zdGFsOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5EYXRhOwotaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlBob25lTnVtYmVyVXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogVXRpbGl0aWVzIGZvciBWQ2FyZCBoYW5kbGluZyBjb2Rlcy4KLSAqLwotcHVibGljIGNsYXNzIFZDYXJkVXRpbHMgewotICAgIC8vIE5vdGUgdGhhdCBub3QgYWxsIHR5cGVzIGFyZSBpbmNsdWRlZCBpbiB0aGlzIG1hcC9zZXQsIHNpbmNlLCBmb3IgZXhhbXBsZSwgVFlQRV9IT01FX0ZBWCBpcwotICAgIC8vIGNvbnZlcnRlZCB0byB0d28gcGFyYW1ldGVyIFN0cmluZ3MuIFRoZXNlIG9ubHkgY29udGFpbiBzb21lIG1pbm9yIGZpZWxkcyB2YWxpZCBpbiBib3RoCi0gICAgLy8gdkNhcmQgYW5kIGN1cnJlbnQgKGFzIG9mIDIwMDktMDgtMDcpIENvbnRhY3RzIHN0cnVjdHVyZS4gCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPEludGVnZXIsIFN0cmluZz4gc0tub3duUGhvbmVUeXBlc01hcF9JdG9TOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNldDxTdHJpbmc+IHNQaG9uZVR5cGVzVW5rbm93blRvQ29udGFjdHNTZXQ7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPFN0cmluZywgSW50ZWdlcj4gc0tub3duUGhvbmVUeXBlTWFwX1N0b0k7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPEludGVnZXIsIFN0cmluZz4gc0tub3duSW1Qcm9wTmFtZU1hcF9JdG9TOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNldDxTdHJpbmc+IHNNb2JpbGVQaG9uZUxhYmVsU2V0OwotCi0gICAgc3RhdGljIHsKLSAgICAgICAgc0tub3duUGhvbmVUeXBlc01hcF9JdG9TID0gbmV3IEhhc2hNYXA8SW50ZWdlciwgU3RyaW5nPigpOwotICAgICAgICBzS25vd25QaG9uZVR5cGVNYXBfU3RvSSA9IG5ldyBIYXNoTWFwPFN0cmluZywgSW50ZWdlcj4oKTsKLQotICAgICAgICBzS25vd25QaG9uZVR5cGVzTWFwX0l0b1MucHV0KFBob25lLlRZUEVfQ0FSLCBWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX0NBUik7Ci0gICAgICAgIHNLbm93blBob25lVHlwZU1hcF9TdG9JLnB1dChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX0NBUiwgUGhvbmUuVFlQRV9DQVIpOwotICAgICAgICBzS25vd25QaG9uZVR5cGVzTWFwX0l0b1MucHV0KFBob25lLlRZUEVfUEFHRVIsIFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfUEFHRVIpOwotICAgICAgICBzS25vd25QaG9uZVR5cGVNYXBfU3RvSS5wdXQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9QQUdFUiwgUGhvbmUuVFlQRV9QQUdFUik7Ci0gICAgICAgIHNLbm93blBob25lVHlwZXNNYXBfSXRvUy5wdXQoUGhvbmUuVFlQRV9JU0ROLCBWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX0lTRE4pOwotICAgICAgICBzS25vd25QaG9uZVR5cGVNYXBfU3RvSS5wdXQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9JU0ROLCBQaG9uZS5UWVBFX0lTRE4pOwotICAgICAgICAKLSAgICAgICAgc0tub3duUGhvbmVUeXBlTWFwX1N0b0kucHV0KFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfSE9NRSwgUGhvbmUuVFlQRV9IT01FKTsKLSAgICAgICAgc0tub3duUGhvbmVUeXBlTWFwX1N0b0kucHV0KFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfV09SSywgUGhvbmUuVFlQRV9XT1JLKTsKLSAgICAgICAgc0tub3duUGhvbmVUeXBlTWFwX1N0b0kucHV0KFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfQ0VMTCwgUGhvbmUuVFlQRV9NT0JJTEUpOwotICAgICAgICAgICAgICAgIAotICAgICAgICBzS25vd25QaG9uZVR5cGVNYXBfU3RvSS5wdXQoVkNhcmRDb25zdGFudHMuUEFSQU1fUEhPTkVfRVhUUkFfVFlQRV9PVEhFUiwgUGhvbmUuVFlQRV9PVEhFUik7Ci0gICAgICAgIHNLbm93blBob25lVHlwZU1hcF9TdG9JLnB1dChWQ2FyZENvbnN0YW50cy5QQVJBTV9QSE9ORV9FWFRSQV9UWVBFX0NBTExCQUNLLAotICAgICAgICAgICAgICAgIFBob25lLlRZUEVfQ0FMTEJBQ0spOwotICAgICAgICBzS25vd25QaG9uZVR5cGVNYXBfU3RvSS5wdXQoCi0gICAgICAgICAgICAgICAgVkNhcmRDb25zdGFudHMuUEFSQU1fUEhPTkVfRVhUUkFfVFlQRV9DT01QQU5ZX01BSU4sIFBob25lLlRZUEVfQ09NUEFOWV9NQUlOKTsKLSAgICAgICAgc0tub3duUGhvbmVUeXBlTWFwX1N0b0kucHV0KFZDYXJkQ29uc3RhbnRzLlBBUkFNX1BIT05FX0VYVFJBX1RZUEVfUkFESU8sIFBob25lLlRZUEVfUkFESU8pOwotICAgICAgICBzS25vd25QaG9uZVR5cGVNYXBfU3RvSS5wdXQoVkNhcmRDb25zdGFudHMuUEFSQU1fUEhPTkVfRVhUUkFfVFlQRV9UVFlfVERELAotICAgICAgICAgICAgICAgIFBob25lLlRZUEVfVFRZX1RERCk7Ci0gICAgICAgIHNLbm93blBob25lVHlwZU1hcF9TdG9JLnB1dChWQ2FyZENvbnN0YW50cy5QQVJBTV9QSE9ORV9FWFRSQV9UWVBFX0FTU0lTVEFOVCwKLSAgICAgICAgICAgICAgICBQaG9uZS5UWVBFX0FTU0lTVEFOVCk7Ci0KLSAgICAgICAgc1Bob25lVHlwZXNVbmtub3duVG9Db250YWN0c1NldCA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLSAgICAgICAgc1Bob25lVHlwZXNVbmtub3duVG9Db250YWN0c1NldC5hZGQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9NT0RFTSk7Ci0gICAgICAgIHNQaG9uZVR5cGVzVW5rbm93blRvQ29udGFjdHNTZXQuYWRkKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfTVNHKTsKLSAgICAgICAgc1Bob25lVHlwZXNVbmtub3duVG9Db250YWN0c1NldC5hZGQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9CQlMpOwotICAgICAgICBzUGhvbmVUeXBlc1Vua25vd25Ub0NvbnRhY3RzU2V0LmFkZChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX1ZJREVPKTsKLQotICAgICAgICBzS25vd25JbVByb3BOYW1lTWFwX0l0b1MgPSBuZXcgSGFzaE1hcDxJbnRlZ2VyLCBTdHJpbmc+KCk7Ci0gICAgICAgIHNLbm93bkltUHJvcE5hbWVNYXBfSXRvUy5wdXQoSW0uUFJPVE9DT0xfQUlNLCBWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9YX0FJTSk7Ci0gICAgICAgIHNLbm93bkltUHJvcE5hbWVNYXBfSXRvUy5wdXQoSW0uUFJPVE9DT0xfTVNOLCBWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9YX01TTik7Ci0gICAgICAgIHNLbm93bkltUHJvcE5hbWVNYXBfSXRvUy5wdXQoSW0uUFJPVE9DT0xfWUFIT08sIFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1hfWUFIT08pOwotICAgICAgICBzS25vd25JbVByb3BOYW1lTWFwX0l0b1MucHV0KEltLlBST1RPQ09MX1NLWVBFLCBWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9YX1NLWVBFX1VTRVJOQU1FKTsKLSAgICAgICAgc0tub3duSW1Qcm9wTmFtZU1hcF9JdG9TLnB1dChJbS5QUk9UT0NPTF9HT09HTEVfVEFMSywKLSAgICAgICAgICAgICAgICBWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9YX0dPT0dMRV9UQUxLKTsKLSAgICAgICAgc0tub3duSW1Qcm9wTmFtZU1hcF9JdG9TLnB1dChJbS5QUk9UT0NPTF9JQ1EsIFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1hfSUNRKTsKLSAgICAgICAgc0tub3duSW1Qcm9wTmFtZU1hcF9JdG9TLnB1dChJbS5QUk9UT0NPTF9KQUJCRVIsIFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1hfSkFCQkVSKTsKLSAgICAgICAgc0tub3duSW1Qcm9wTmFtZU1hcF9JdG9TLnB1dChJbS5QUk9UT0NPTF9RUSwgVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfWF9RUSk7Ci0gICAgICAgIHNLbm93bkltUHJvcE5hbWVNYXBfSXRvUy5wdXQoSW0uUFJPVE9DT0xfTkVUTUVFVElORywgVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfWF9ORVRNRUVUSU5HKTsKLQotICAgICAgICAvLyBcdTY0M0FcdTVFMkZcdTk2RkJcdThBNzEgPSBGdWxsLXdpZHRoIEhpcmFnYW5hICJLZWl0YWktRGVud2EiIChtb2JpbGUgcGhvbmUpCi0gICAgICAgIC8vIFx1NjQzQVx1NUUyRiA9IEZ1bGwtd2lkdGggSGlyYWdhbmEgIktlaXRhaSIgKG1vYmlsZSBwaG9uZSkKLSAgICAgICAgLy8gXHUzMEIxXHUzMEE0XHUzMEJGXHUzMEE0ID0gRnVsbC13aWR0aCBLYXRha2FuYSAiS2VpdGFpIiAobW9iaWxlIHBob25lKQotICAgICAgICAvLyBcdUZGNzlcdUZGNzJcdUZGODBcdUZGNzIgPSBIYWxmLXdpZHRoIEthdGFrYW5hICJLZWl0YWkiIChtb2JpbGUgcGhvbmUpCi0gICAgICAgIHNNb2JpbGVQaG9uZUxhYmVsU2V0ID0gbmV3IEhhc2hTZXQ8U3RyaW5nPihBcnJheXMuYXNMaXN0KAotICAgICAgICAgICAgICAgICJNT0JJTEUiLCAiXHU2NDNBXHU1RTJGXHU5NkZCXHU4QTcxIiwgIlx1NjQzQVx1NUUyRiIsICJcdTMwQjFcdTMwQTRcdTMwQkZcdTMwQTQiLAotICAgICAgICAgICAgICAgICJcdUZGNzlcdUZGNzJcdUZGODBcdUZGNzIiKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UGhvbmVUeXBlU3RyaW5nKEludGVnZXIgdHlwZSkgewotICAgICAgICByZXR1cm4gc0tub3duUGhvbmVUeXBlc01hcF9JdG9TLmdldCh0eXBlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIEludGVyZ2VyIHdoZW4gdGhlIGdpdmVuIHR5cGVzIGNhbiBiZSBwYXJzZWQgYXMga25vd24gdHlwZS4gUmV0dXJucyBTdHJpbmcgb2JqZWN0Ci0gICAgICogd2hlbiBub3QsIHdoaWNoIHNob3VsZCBiZSBzZXQgdG8gbGFiZWwuIAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldFBob25lVHlwZUZyb21TdHJpbmdzKENvbGxlY3Rpb248U3RyaW5nPiB0eXBlcywKLSAgICAgICAgICAgIFN0cmluZyBudW1iZXIpIHsKLSAgICAgICAgaWYgKG51bWJlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBudW1iZXIgPSAiIjsKLSAgICAgICAgfQotICAgICAgICBpbnQgdHlwZSA9IC0xOwotICAgICAgICBTdHJpbmcgbGFiZWwgPSBudWxsOwotICAgICAgICBib29sZWFuIGlzRmF4ID0gZmFsc2U7Ci0gICAgICAgIGJvb2xlYW4gaGFzUHJlZiA9IGZhbHNlOwotICAgICAgICAKLSAgICAgICAgaWYgKHR5cGVzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoU3RyaW5nIHR5cGVTdHJpbmcgOiB0eXBlcykgewotICAgICAgICAgICAgICAgIGlmICh0eXBlU3RyaW5nID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHR5cGVTdHJpbmcgPSB0eXBlU3RyaW5nLnRvVXBwZXJDYXNlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHR5cGVTdHJpbmcuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfUFJFRikpIHsKLSAgICAgICAgICAgICAgICAgICAgaGFzUHJlZiA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlU3RyaW5nLmVxdWFscyhWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX0ZBWCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaXNGYXggPSB0cnVlOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlU3RyaW5nLnN0YXJ0c1dpdGgoIlgtIikgJiYgdHlwZSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVTdHJpbmcgPSB0eXBlU3RyaW5nLnN1YnN0cmluZygyKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAodHlwZVN0cmluZy5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBmaW5hbCBJbnRlZ2VyIHRtcCA9IHNLbm93blBob25lVHlwZU1hcF9TdG9JLmdldCh0eXBlU3RyaW5nKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRtcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgdHlwZUNhbmRpZGF0ZSA9IHRtcDsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRZUEVfUEFHRVIgaXMgcHJlZmVyZWQgd2hlbiB0aGUgbnVtYmVyIGNvbnRhaW5zIEAgc3Vycm9uZGVkIGJ5Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBhIHBhZ2VyIG51bWJlciBhbmQgYSBkb21haW4gbmFtZS4KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGUuZy4KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIG8gMTExMUBkb21haW4uY29tCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyB4IEBkb21haW4uY29tCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyB4IDExMTFACi0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgaW5kZXhPZkF0ID0gbnVtYmVyLmluZGV4T2YoIkAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodHlwZUNhbmRpZGF0ZSA9PSBQaG9uZS5UWVBFX1BBR0VSCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIDAgPCBpbmRleE9mQXQgJiYgaW5kZXhPZkF0IDwgbnVtYmVyLmxlbmd0aCgpIC0gMSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgdHlwZSA8IDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgdHlwZSA9PSBQaG9uZS5UWVBFX0NVU1RPTSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSB0bXA7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBQaG9uZS5UWVBFX0NVU1RPTTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gdHlwZVN0cmluZzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAodHlwZSA8IDApIHsKLSAgICAgICAgICAgIGlmIChoYXNQcmVmKSB7Ci0gICAgICAgICAgICAgICAgdHlwZSA9IFBob25lLlRZUEVfTUFJTjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gZGVmYXVsdCB0byBUWVBFX0hPTUUKLSAgICAgICAgICAgICAgICB0eXBlID0gUGhvbmUuVFlQRV9IT01FOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChpc0ZheCkgewotICAgICAgICAgICAgaWYgKHR5cGUgPT0gUGhvbmUuVFlQRV9IT01FKSB7Ci0gICAgICAgICAgICAgICAgdHlwZSA9IFBob25lLlRZUEVfRkFYX0hPTUU7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gUGhvbmUuVFlQRV9XT1JLKSB7Ci0gICAgICAgICAgICAgICAgdHlwZSA9IFBob25lLlRZUEVfRkFYX1dPUks7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gUGhvbmUuVFlQRV9PVEhFUikgewotICAgICAgICAgICAgICAgIHR5cGUgPSBQaG9uZS5UWVBFX09USEVSX0ZBWDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAodHlwZSA9PSBQaG9uZS5UWVBFX0NVU1RPTSkgewotICAgICAgICAgICAgcmV0dXJuIGxhYmVsOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIHR5cGU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc01vYmlsZVBob25lTGFiZWwoZmluYWwgU3RyaW5nIGxhYmVsKSB7Ci0gICAgICAgIC8vIEZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgotICAgICAgICAvLyBEZXRhaWw6IFVudGlsIERvbnV0LCB0aGVyZSBpc24ndCBUWVBFX01PQklMRSBmb3IgZW1haWwgd2hpbGUgdGhlcmUgaXMgbm93LgotICAgICAgICAvLyAgICAgICAgIFRvIHN1cHBvcnQgbW9iaWxlIHR5cGUgYXQgdGhhdCB0aW1lLCB0aGlzIGN1c3RvbSBsYWJlbCBoYWQgYmVlbiB1c2VkLgotICAgICAgICByZXR1cm4gKGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHMuQ29udGFjdE1ldGhvZHNDb2x1bW5zLk1PQklMRV9FTUFJTF9UWVBFX05BTUUuZXF1YWxzKGxhYmVsKQotICAgICAgICAgICAgICAgIHx8IHNNb2JpbGVQaG9uZUxhYmVsU2V0LmNvbnRhaW5zKGxhYmVsKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWRJblYyMUJ1dFVua25vd25Ub0NvbnRhY3RzUGhvdGVUeXBlKGZpbmFsIFN0cmluZyBsYWJlbCkgewotICAgICAgICByZXR1cm4gc1Bob25lVHlwZXNVbmtub3duVG9Db250YWN0c1NldC5jb250YWlucyhsYWJlbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UHJvcGVydHlOYW1lRm9ySW0oZmluYWwgaW50IHByb3RvY29sKSB7Ci0gICAgICAgIHJldHVybiBzS25vd25JbVByb3BOYW1lTWFwX0l0b1MuZ2V0KHByb3RvY29sKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZ1tdIHNvcnROYW1lRWxlbWVudHMoZmluYWwgaW50IHZjYXJkVHlwZSwKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBmYW1pbHlOYW1lLCBmaW5hbCBTdHJpbmcgbWlkZGxlTmFtZSwgZmluYWwgU3RyaW5nIGdpdmVuTmFtZSkgewotICAgICAgICBmaW5hbCBTdHJpbmdbXSBsaXN0ID0gbmV3IFN0cmluZ1szXTsKLSAgICAgICAgZmluYWwgaW50IG5hbWVPcmRlclR5cGUgPSBWQ2FyZENvbmZpZy5nZXROYW1lT3JkZXJUeXBlKHZjYXJkVHlwZSk7Ci0gICAgICAgIHN3aXRjaCAobmFtZU9yZGVyVHlwZSkgewotICAgICAgICAgICAgY2FzZSBWQ2FyZENvbmZpZy5OQU1FX09SREVSX0pBUEFORVNFOiB7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbnRhaW5zT25seVByaW50YWJsZUFzY2lpKGZhbWlseU5hbWUpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250YWluc09ubHlQcmludGFibGVBc2NpaShnaXZlbk5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxpc3RbMF0gPSBnaXZlbk5hbWU7Ci0gICAgICAgICAgICAgICAgICAgIGxpc3RbMV0gPSBtaWRkbGVOYW1lOwotICAgICAgICAgICAgICAgICAgICBsaXN0WzJdID0gZmFtaWx5TmFtZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBsaXN0WzBdID0gZmFtaWx5TmFtZTsKLSAgICAgICAgICAgICAgICAgICAgbGlzdFsxXSA9IG1pZGRsZU5hbWU7Ci0gICAgICAgICAgICAgICAgICAgIGxpc3RbMl0gPSBnaXZlbk5hbWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBWQ2FyZENvbmZpZy5OQU1FX09SREVSX0VVUk9QRTogewotICAgICAgICAgICAgICAgIGxpc3RbMF0gPSBtaWRkbGVOYW1lOwotICAgICAgICAgICAgICAgIGxpc3RbMV0gPSBnaXZlbk5hbWU7Ci0gICAgICAgICAgICAgICAgbGlzdFsyXSA9IGZhbWlseU5hbWU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkZWZhdWx0OiB7Ci0gICAgICAgICAgICAgICAgbGlzdFswXSA9IGdpdmVuTmFtZTsKLSAgICAgICAgICAgICAgICBsaXN0WzFdID0gbWlkZGxlTmFtZTsKLSAgICAgICAgICAgICAgICBsaXN0WzJdID0gZmFtaWx5TmFtZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbGlzdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGludCBnZXRQaG9uZU51bWJlckZvcm1hdChmaW5hbCBpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIGlmIChWQ2FyZENvbmZpZy5pc0phcGFuZXNlRGV2aWNlKHZjYXJkVHlwZSkpIHsKLSAgICAgICAgICAgIHJldHVybiBQaG9uZU51bWJlclV0aWxzLkZPUk1BVF9KQVBBTjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBQaG9uZU51bWJlclV0aWxzLkZPUk1BVF9OQU5QOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5zZXJ0cyBwb3N0YWwgZGF0YSBpbnRvIHRoZSBidWlsZGVyIG9iamVjdC4KLSAgICAgKiAKLSAgICAgKiBOb3RlIHRoYXQgdGhlIGRhdGEgc3RydWN0dXJlIG9mIENvbnRhY3RzQ29udHJhY3QgaXMgZGlmZmVyZW50IGZyb20gdGhhdCBkZWZpbmVkIGluIHZDYXJkLgotICAgICAqIFNvIHNvbWUgY29udmVyc2lvbiBtYXkgYmUgcGVyZm9ybWVkIGluIHRoaXMgbWV0aG9kLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBpbnNlcnRTdHJ1Y3R1cmVkUG9zdGFsRGF0YVVzaW5nQ29udGFjdHNTdHJ1Y3QoaW50IHZjYXJkVHlwZSwKLSAgICAgICAgICAgIGZpbmFsIENvbnRlbnRQcm92aWRlck9wZXJhdGlvbi5CdWlsZGVyIGJ1aWxkZXIsCi0gICAgICAgICAgICBmaW5hbCBWQ2FyZEVudHJ5LlBvc3RhbERhdGEgcG9zdGFsRGF0YSkgewotICAgICAgICBidWlsZGVyLndpdGhWYWx1ZUJhY2tSZWZlcmVuY2UoU3RydWN0dXJlZFBvc3RhbC5SQVdfQ09OVEFDVF9JRCwgMCk7Ci0gICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKERhdGEuTUlNRVRZUEUsIFN0cnVjdHVyZWRQb3N0YWwuQ09OVEVOVF9JVEVNX1RZUEUpOwotCi0gICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKFN0cnVjdHVyZWRQb3N0YWwuVFlQRSwgcG9zdGFsRGF0YS50eXBlKTsKLSAgICAgICAgaWYgKHBvc3RhbERhdGEudHlwZSA9PSBTdHJ1Y3R1cmVkUG9zdGFsLlRZUEVfQ1VTVE9NKSB7Ci0gICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShTdHJ1Y3R1cmVkUG9zdGFsLkxBQkVMLCBwb3N0YWxEYXRhLmxhYmVsKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIFN0cmluZyBzdHJlZXRTdHJpbmc7Ci0gICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShwb3N0YWxEYXRhLnN0cmVldCkpIHsKLSAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShwb3N0YWxEYXRhLmV4dGVuZGVkQWRkcmVzcykpIHsKLSAgICAgICAgICAgICAgICBzdHJlZXRTdHJpbmcgPSBudWxsOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzdHJlZXRTdHJpbmcgPSBwb3N0YWxEYXRhLmV4dGVuZGVkQWRkcmVzczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShwb3N0YWxEYXRhLmV4dGVuZGVkQWRkcmVzcykpIHsKLSAgICAgICAgICAgICAgICBzdHJlZXRTdHJpbmcgPSBwb3N0YWxEYXRhLnN0cmVldDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc3RyZWV0U3RyaW5nID0gcG9zdGFsRGF0YS5zdHJlZXQgKyAiICIgKyBwb3N0YWxEYXRhLmV4dGVuZGVkQWRkcmVzczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShTdHJ1Y3R1cmVkUG9zdGFsLlBPQk9YLCBwb3N0YWxEYXRhLnBvYm94KTsKLSAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoU3RydWN0dXJlZFBvc3RhbC5TVFJFRVQsIHN0cmVldFN0cmluZyk7Ci0gICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKFN0cnVjdHVyZWRQb3N0YWwuQ0lUWSwgcG9zdGFsRGF0YS5sb2NhbHR5KTsKLSAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoU3RydWN0dXJlZFBvc3RhbC5SRUdJT04sIHBvc3RhbERhdGEucmVnaW9uKTsKLSAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoU3RydWN0dXJlZFBvc3RhbC5QT1NUQ09ERSwgcG9zdGFsRGF0YS5wb3N0YWxDb2RlKTsKLSAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoU3RydWN0dXJlZFBvc3RhbC5DT1VOVFJZLCBwb3N0YWxEYXRhLmNvdW50cnkpOwotCi0gICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKFN0cnVjdHVyZWRQb3N0YWwuRk9STUFUVEVEX0FERFJFU1MsCi0gICAgICAgICAgICAgICAgcG9zdGFsRGF0YS5nZXRGb3JtYXR0ZWRBZGRyZXNzKHZjYXJkVHlwZSkpOwotICAgICAgICBpZiAocG9zdGFsRGF0YS5pc1ByaW1hcnkpIHsKLSAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKERhdGEuSVNfUFJJTUFSWSwgMSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjb25zdHJ1Y3ROYW1lRnJvbUVsZW1lbnRzKGZpbmFsIGludCB2Y2FyZFR5cGUsCi0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgZmFtaWx5TmFtZSwgZmluYWwgU3RyaW5nIG1pZGRsZU5hbWUsIGZpbmFsIFN0cmluZyBnaXZlbk5hbWUpIHsKLSAgICAgICAgcmV0dXJuIGNvbnN0cnVjdE5hbWVGcm9tRWxlbWVudHModmNhcmRUeXBlLCBmYW1pbHlOYW1lLCBtaWRkbGVOYW1lLCBnaXZlbk5hbWUsCi0gICAgICAgICAgICAgICAgbnVsbCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY29uc3RydWN0TmFtZUZyb21FbGVtZW50cyhmaW5hbCBpbnQgdmNhcmRUeXBlLAotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGZhbWlseU5hbWUsIGZpbmFsIFN0cmluZyBtaWRkbGVOYW1lLCBmaW5hbCBTdHJpbmcgZ2l2ZW5OYW1lLAotICAgICAgICAgICAgZmluYWwgU3RyaW5nIHByZWZpeCwgZmluYWwgU3RyaW5nIHN1ZmZpeCkgewotICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICBmaW5hbCBTdHJpbmdbXSBuYW1lTGlzdCA9IHNvcnROYW1lRWxlbWVudHModmNhcmRUeXBlLCBmYW1pbHlOYW1lLCBtaWRkbGVOYW1lLCBnaXZlbk5hbWUpOwotICAgICAgICBib29sZWFuIGZpcnN0ID0gdHJ1ZTsKLSAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShwcmVmaXgpKSB7Ci0gICAgICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQocHJlZml4KTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGZpbmFsIFN0cmluZyBuYW1lUGFydCA6IG5hbWVMaXN0KSB7Ci0gICAgICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KG5hbWVQYXJ0KSkgewotICAgICAgICAgICAgICAgIGlmIChmaXJzdCkgewotICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCcgJyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKG5hbWVQYXJ0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHN1ZmZpeCkpIHsKLSAgICAgICAgICAgIGlmICghZmlyc3QpIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgnICcpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoc3VmZml4KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYnVpbGRlci50b1N0cmluZygpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxTdHJpbmc+IGNvbnN0cnVjdExpc3RGcm9tVmFsdWUoZmluYWwgU3RyaW5nIHZhbHVlLAotICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBpc1YzMCkgewotICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICBpbnQgbGVuZ3RoID0gdmFsdWUubGVuZ3RoKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGNoYXIgY2ggPSB2YWx1ZS5jaGFyQXQoaSk7Ci0gICAgICAgICAgICBpZiAoY2ggPT0gJ1xcJyAmJiBpIDwgbGVuZ3RoIC0gMSkgewotICAgICAgICAgICAgICAgIGNoYXIgbmV4dENoID0gdmFsdWUuY2hhckF0KGkgKyAxKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdW5lc2NhcGVkU3RyaW5nID0KLSAgICAgICAgICAgICAgICAgICAgKGlzVjMwID8gVkNhcmRQYXJzZXJfVjMwLnVuZXNjYXBlQ2hhcmFjdGVyKG5leHRDaCkgOgotICAgICAgICAgICAgICAgICAgICAgICAgVkNhcmRQYXJzZXJfVjIxLnVuZXNjYXBlQ2hhcmFjdGVyKG5leHRDaCkpOwotICAgICAgICAgICAgICAgIGlmICh1bmVzY2FwZWRTdHJpbmcgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCh1bmVzY2FwZWRTdHJpbmcpOwotICAgICAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoY2gpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJzsnKSB7Ci0gICAgICAgICAgICAgICAgbGlzdC5hZGQoYnVpbGRlci50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoY2gpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGxpc3QuYWRkKGJ1aWxkZXIudG9TdHJpbmcoKSk7Ci0gICAgICAgIHJldHVybiBsaXN0OwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWluc09ubHlQcmludGFibGVBc2NpaShmaW5hbCBTdHJpbmcuLi52YWx1ZXMpIHsKLSAgICAgICAgaWYgKHZhbHVlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY29udGFpbnNPbmx5UHJpbnRhYmxlQXNjaWkoQXJyYXlzLmFzTGlzdCh2YWx1ZXMpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnNPbmx5UHJpbnRhYmxlQXNjaWkoZmluYWwgQ29sbGVjdGlvbjxTdHJpbmc+IHZhbHVlcykgewotICAgICAgICBpZiAodmFsdWVzID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoZmluYWwgU3RyaW5nIHZhbHVlIDogdmFsdWVzKSB7Ci0gICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkodmFsdWUpKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIVRleHRVdGlscy5pc1ByaW50YWJsZUFzY2lpT25seSh2YWx1ZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBpcyB1c2VmdWwgd2hlbiBjaGVja2luZyB0aGUgc3RyaW5nIHNob3VsZCBiZSBlbmNvZGVkIGludG8gcXVvdGVkLXByaW50YWJsZQotICAgICAqIG9yIG5vdCwgd2hpY2ggaXMgcmVxdWlyZWQgYnkgdkNhcmQgMi4xLgotICAgICAqIFNlZSB0aGUgZGVmaW5pdGlvbiBvZiAiN2JpdCIgaW4gdkNhcmQgMi4xIHNwZWMgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zT25seU5vbkNyTGZQcmludGFibGVBc2NpaShmaW5hbCBTdHJpbmcuLi52YWx1ZXMpIHsKLSAgICAgICAgaWYgKHZhbHVlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKEFycmF5cy5hc0xpc3QodmFsdWVzKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zT25seU5vbkNyTGZQcmludGFibGVBc2NpaShmaW5hbCBDb2xsZWN0aW9uPFN0cmluZz4gdmFsdWVzKSB7Ci0gICAgICAgIGlmICh2YWx1ZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgaW50IGFzY2lpRmlyc3QgPSAweDIwOwotICAgICAgICBmaW5hbCBpbnQgYXNjaWlMYXN0ID0gMHg3RTsgIC8vIGluY2x1ZGVkCi0gICAgICAgIGZvciAoZmluYWwgU3RyaW5nIHZhbHVlIDogdmFsdWVzKSB7Ci0gICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkodmFsdWUpKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbCBpbnQgbGVuZ3RoID0gdmFsdWUubGVuZ3RoKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSA9IHZhbHVlLm9mZnNldEJ5Q29kZVBvaW50cyhpLCAxKSkgewotICAgICAgICAgICAgICAgIGZpbmFsIGludCBjID0gdmFsdWUuY29kZVBvaW50QXQoaSk7Ci0gICAgICAgICAgICAgICAgaWYgKCEoYXNjaWlGaXJzdCA8PSBjICYmIGMgPD0gYXNjaWlMYXN0KSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNldDxDaGFyYWN0ZXI+IHNVbkFjY2VwdGFibGVBc2NpaUluVjIxV29yZFNldCA9Ci0gICAgICAgIG5ldyBIYXNoU2V0PENoYXJhY3Rlcj4oQXJyYXlzLmFzTGlzdCgnWycsICddJywgJz0nLCAnOicsICcuJywgJywnLCAnICcpKTsKLQotICAgIC8qKgotICAgICAqIFRoaXMgaXMgdXNlZnVsIHNpbmNlIHZDYXJkIDMuMCBvZnRlbiByZXF1aXJlcyB0aGUgKCJYLSIpIHByb3BlcnRpZXMgYW5kIGdyb3VwcwotICAgICAqIHNob3VsZCBjb250YWluIG9ubHkgYWxwaGFiZXRzLCBkaWdpdHMsIGFuZCBoeXBoZW4uCi0gICAgICogCi0gICAgICogTm90ZTogSXQgaXMgYWxyZWFkeSBrbm93biBzb21lIGRldmljZXMgKHdyb25nbHkpIG91dHB1dHMgcHJvcGVydGllcyB3aXRoIGNoYXJhY3RlcnMKLSAgICAgKiAgICAgICB3aGljaCBzaG91bGQgbm90IGJlIGluIHRoZSBmaWVsZC4gT25lIGV4YW1wbGUgaXMgIlgtR09PR0xFIFRBTEsiLiBXZSBhY2NlcHQKLSAgICAgKiAgICAgICBzdWNoIGtpbmQgb2YgaW5wdXQgYnV0IG11c3QgbmV2ZXIgb3V0cHV0IGl0IHVubGVzcyB0aGUgdGFyZ2V0IGlzIHZlcnkgc3BlY2lmaWMKLSAgICAgKiAgICAgICB0byB0aGUgZGV2aWNlIHdoaWNoIGlzIGFibGUgdG8gcGFyc2UgdGhlIG1hbGZvcm1lZCBpbnB1dC4gCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zT25seUFscGhhRGlnaXRIeXBoZW4oZmluYWwgU3RyaW5nLi4udmFsdWVzKSB7Ci0gICAgICAgIGlmICh2YWx1ZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNvbnRhaW5zT25seUFscGhhRGlnaXRIeXBoZW4oQXJyYXlzLmFzTGlzdCh2YWx1ZXMpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnNPbmx5QWxwaGFEaWdpdEh5cGhlbihmaW5hbCBDb2xsZWN0aW9uPFN0cmluZz4gdmFsdWVzKSB7Ci0gICAgICAgIGlmICh2YWx1ZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgaW50IHVwcGVyQWxwaGFiZXRGaXJzdCA9IDB4NDE7ICAvLyBBCi0gICAgICAgIGZpbmFsIGludCB1cHBlckFscGhhYmV0QWZ0ZXJMYXN0ID0gMHg1YjsgIC8vIFsKLSAgICAgICAgZmluYWwgaW50IGxvd2VyQWxwaGFiZXRGaXJzdCA9IDB4NjE7ICAvLyBhCi0gICAgICAgIGZpbmFsIGludCBsb3dlckFscGhhYmV0QWZ0ZXJMYXN0ID0gMHg3YjsgIC8vIHsKLSAgICAgICAgZmluYWwgaW50IGRpZ2l0Rmlyc3QgPSAweDMwOyAgLy8gMAotICAgICAgICBmaW5hbCBpbnQgZGlnaXRBZnRlckxhc3QgPSAweDNBOyAgLy8gOgotICAgICAgICBmaW5hbCBpbnQgaHlwaGVuID0gJy0nOwotICAgICAgICBmb3IgKGZpbmFsIFN0cmluZyBzdHIgOiB2YWx1ZXMpIHsKLSAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShzdHIpKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbCBpbnQgbGVuZ3RoID0gc3RyLmxlbmd0aCgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkgPSBzdHIub2Zmc2V0QnlDb2RlUG9pbnRzKGksIDEpKSB7Ci0gICAgICAgICAgICAgICAgaW50IGNvZGVwb2ludCA9IHN0ci5jb2RlUG9pbnRBdChpKTsKLSAgICAgICAgICAgICAgICBpZiAoISgobG93ZXJBbHBoYWJldEZpcnN0IDw9IGNvZGVwb2ludCAmJiBjb2RlcG9pbnQgPCBsb3dlckFscGhhYmV0QWZ0ZXJMYXN0KSB8fAotICAgICAgICAgICAgICAgICAgICAodXBwZXJBbHBoYWJldEZpcnN0IDw9IGNvZGVwb2ludCAmJiBjb2RlcG9pbnQgPCB1cHBlckFscGhhYmV0QWZ0ZXJMYXN0KSB8fAotICAgICAgICAgICAgICAgICAgICAoZGlnaXRGaXJzdCA8PSBjb2RlcG9pbnQgJiYgY29kZXBvaW50IDwgZGlnaXRBZnRlckxhc3QpIHx8Ci0gICAgICAgICAgICAgICAgICAgIChjb2RlcG9pbnQgPT0gaHlwaGVuKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8UD4KLSAgICAgKiBSZXR1cm5zIHRydWUgd2hlbiB0aGUgZ2l2ZW4gU3RyaW5nIGlzIGNhdGVnb3JpemVkIGFzICJ3b3JkIiBzcGVjaWZpZWQgaW4gdkNhcmQgc3BlYyAyLjEuCi0gICAgICogPC9QPgotICAgICAqIDxQPgotICAgICAqIHZDYXJkIDIuMSBzcGVjaWZpZXM6PEJSIC8+Ci0gICAgICogd29yZCA9ICZsdDthbnkgcHJpbnRhYmxlIDdiaXQgdXMtYXNjaWkgZXhjZXB0IFtdPTouLCAmZ3Q7Ci0gICAgICogPC9QPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1YyMVdvcmQoZmluYWwgU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eSh2YWx1ZSkpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIGludCBhc2NpaUZpcnN0ID0gMHgyMDsKLSAgICAgICAgZmluYWwgaW50IGFzY2lpTGFzdCA9IDB4N0U7ICAvLyBpbmNsdWRlZAotICAgICAgICBmaW5hbCBpbnQgbGVuZ3RoID0gdmFsdWUubGVuZ3RoKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpID0gdmFsdWUub2Zmc2V0QnlDb2RlUG9pbnRzKGksIDEpKSB7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgYyA9IHZhbHVlLmNvZGVQb2ludEF0KGkpOwotICAgICAgICAgICAgaWYgKCEoYXNjaWlGaXJzdCA8PSBjICYmIGMgPD0gYXNjaWlMYXN0KSB8fAotICAgICAgICAgICAgICAgICAgICBzVW5BY2NlcHRhYmxlQXNjaWlJblYyMVdvcmRTZXQuY29udGFpbnMoKGNoYXIpYykpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPFA+Ci0gICAgICogUmV0dXJucyBTdHJpbmcgYXZhaWxhYmxlIGFzIHBhcmFtZXRlciB2YWx1ZSBpbiB2Q2FyZCAzLjAuCi0gICAgICogPC9QPgotICAgICAqIDxQPgotICAgICAqIFJGQyAyNDI2IHJlcXVpcmVzIHZDYXJkIGNvbXBvc2VyIHRvIHF1b3RlIHBhcmFtZXRlciB2YWx1ZXMgd2hlbiBpdCBjb250YWlucwotICAgICAqIHNlbWktY29sb24sIGZvciBleGFtcGxlIChTZWUgUkZDIDI0MjYgZm9yIG1vcmUgaW5mb3JtYXRpb24pLgotICAgICAqIFRoaXMgbWV0aG9kIGNoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBTdHJpbmcgY2FuIGJlIHVzZWQgd2l0aG91dCBxdW90ZXMuCi0gICAgICogPC9QPgotICAgICAqIDxQPgotICAgICAqIE5vdGU6IFdlIHJlbW92ZSBEUVVPVEUgc2lsZW50bHkgZm9yIG5vdy4KLSAgICAgKiA8L1A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgdG9TdHJpbmdBdmFpbGFibGVBc1YzMFBhcmFtZVZhbHVlKFN0cmluZyB2YWx1ZSkgewotICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkodmFsdWUpKSB7Ci0gICAgICAgICAgICB2YWx1ZSA9ICIiOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIGludCBhc2NpaUZpcnN0ID0gMHgyMDsKLSAgICAgICAgZmluYWwgaW50IGFzY2lpTGFzdCA9IDB4N0U7ICAvLyBpbmNsdWRlZAotICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICBmaW5hbCBpbnQgbGVuZ3RoID0gdmFsdWUubGVuZ3RoKCk7Ci0gICAgICAgIGJvb2xlYW4gbmVlZFF1b3RlID0gZmFsc2U7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpID0gdmFsdWUub2Zmc2V0QnlDb2RlUG9pbnRzKGksIDEpKSB7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgY29kZVBvaW50ID0gdmFsdWUuY29kZVBvaW50QXQoaSk7Ci0gICAgICAgICAgICBpZiAoY29kZVBvaW50IDwgYXNjaWlGaXJzdCB8fCBjb2RlUG9pbnQgPT0gJyInKSB7Ci0gICAgICAgICAgICAgICAgLy8gQ1RMIGNoYXJhY3RlcnMgYW5kIERRVU9URSBhcmUgbmV2ZXIgYWNjZXB0ZWQuIFJlbW92ZSB0aGVtLgotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmRDb2RlUG9pbnQoY29kZVBvaW50KTsKLSAgICAgICAgICAgIGlmIChjb2RlUG9pbnQgPT0gJzonIHx8IGNvZGVQb2ludCA9PSAnLCcgfHwgY29kZVBvaW50ID09ICcgJykgewotICAgICAgICAgICAgICAgIG5lZWRRdW90ZSA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgU3RyaW5nIHJlc3VsdCA9IGJ1aWxkZXIudG9TdHJpbmcoKTsKLSAgICAgICAgcmV0dXJuICgobmVlZFF1b3RlIHx8IHJlc3VsdC5pc0VtcHR5KCkpID8gKCciJyArIHJlc3VsdCArICciJykgOiByZXN1bHQpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvSGFsZldpZHRoU3RyaW5nKGZpbmFsIFN0cmluZyBvcmdTdHJpbmcpIHsKLSAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KG9yZ1N0cmluZykpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIGZpbmFsIGludCBsZW5ndGggPSBvcmdTdHJpbmcubGVuZ3RoKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpID0gb3JnU3RyaW5nLm9mZnNldEJ5Q29kZVBvaW50cyhpLCAxKSkgewotICAgICAgICAgICAgLy8gQWxsIEphcGFuZXNlIGNoYXJhY3RlciBpcyBhYmxlIHRvIGJlIGV4cHJlc3NlZCBieSBjaGFyLgotICAgICAgICAgICAgLy8gRG8gbm90IG5lZWQgdG8gdXNlIFN0cmluZyNjb2RlcFBvaW50QXQoKS4KLSAgICAgICAgICAgIGZpbmFsIGNoYXIgY2ggPSBvcmdTdHJpbmcuY2hhckF0KGkpOwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGhhbGZXaWR0aFRleHQgPSBKYXBhbmVzZVV0aWxzLnRyeUdldEhhbGZXaWR0aFRleHQoY2gpOwotICAgICAgICAgICAgaWYgKGhhbGZXaWR0aFRleHQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGhhbGZXaWR0aFRleHQpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChjaCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHdWVzc2VzIHRoZSBmb3JtYXQgb2YgaW5wdXQgaW1hZ2UuIEN1cnJlbnRseSBqdXN0IHRoZSBmaXJzdCBmZXcgYnl0ZXMgYXJlIHVzZWQuCi0gICAgICogVGhlIHR5cGUgIkdJRiIsICJQTkciLCBvciAiSlBFRyIgaXMgcmV0dXJuZWQgd2hlbiBwb3NzaWJsZS4gUmV0dXJucyBudWxsIHdoZW4KLSAgICAgKiB0aGUgZ3Vlc3MgZmFpbGVkLgotICAgICAqIEBwYXJhbSBpbnB1dCBJbWFnZSBhcyBieXRlIGFycmF5LgotICAgICAqIEByZXR1cm4gVGhlIGltYWdlIHR5cGUgb3IgbnVsbCB3aGVuIHRoZSB0eXBlIGNhbm5vdCBiZSBkZXRlcm1pbmVkLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGd1ZXNzSW1hZ2VUeXBlKGZpbmFsIGJ5dGVbXSBpbnB1dCkgewotICAgICAgICBpZiAoaW5wdXQgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlucHV0Lmxlbmd0aCA+PSAzICYmIGlucHV0WzBdID09ICdHJyAmJiBpbnB1dFsxXSA9PSAnSScgJiYgaW5wdXRbMl0gPT0gJ0YnKSB7Ci0gICAgICAgICAgICByZXR1cm4gIkdJRiI7Ci0gICAgICAgIH0gZWxzZSBpZiAoaW5wdXQubGVuZ3RoID49IDQgJiYgaW5wdXRbMF0gPT0gKGJ5dGUpIDB4ODkKLSAgICAgICAgICAgICAgICAmJiBpbnB1dFsxXSA9PSAnUCcgJiYgaW5wdXRbMl0gPT0gJ04nICYmIGlucHV0WzNdID09ICdHJykgewotICAgICAgICAgICAgLy8gTm90ZTogdkNhcmQgMi4xIG9mZmljaWFsbHkgZG9lcyBub3Qgc3VwcG9ydCBQTkcsIGJ1dCB3ZSBtYXkgaGF2ZSBpdCBhbmQKLSAgICAgICAgICAgIC8vICAgICAgIHVzaW5nIFgtIHdvcmQgbGlrZSAiWC1QTkciIG1heSBub3QgbGV0IGltcG9ydGVycyBrbm93IGl0IGlzIFBORy4KLSAgICAgICAgICAgIC8vICAgICAgIFNvIHdlIHVzZSB0aGUgU3RyaW5nICJQTkciIGFzIGlzLi4uCi0gICAgICAgICAgICByZXR1cm4gIlBORyI7Ci0gICAgICAgIH0gZWxzZSBpZiAoaW5wdXQubGVuZ3RoID49IDIgJiYgaW5wdXRbMF0gPT0gKGJ5dGUpIDB4ZmYKLSAgICAgICAgICAgICAgICAmJiBpbnB1dFsxXSA9PSAoYnl0ZSkgMHhkOCkgewotICAgICAgICAgICAgcmV0dXJuICJKUEVHIjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBUcnVlIHdoZW4gYWxsIHRoZSBnaXZlbiB2YWx1ZXMgYXJlIG51bGwgb3IgZW1wdHkgU3RyaW5ncy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gYXJlQWxsRW1wdHkoZmluYWwgU3RyaW5nLi4udmFsdWVzKSB7Ci0gICAgICAgIGlmICh2YWx1ZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKGZpbmFsIFN0cmluZyB2YWx1ZSA6IHZhbHVlcykgewotICAgICAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eSh2YWx1ZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBWQ2FyZFV0aWxzKCkgewotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9leGNlcHRpb24vVkNhcmRBZ2VudE5vdFN1cHBvcnRlZEV4Y2VwdGlvbi5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL2V4Y2VwdGlvbi9WQ2FyZEFnZW50Tm90U3VwcG9ydGVkRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3MmM3ZGYuLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL2V4Y2VwdGlvbi9WQ2FyZEFnZW50Tm90U3VwcG9ydGVkRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQuZXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgVkNhcmRBZ2VudE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBleHRlbmRzIFZDYXJkTm90U3VwcG9ydGVkRXhjZXB0aW9uIHsKLSAgICBwdWJsaWMgVkNhcmRBZ2VudE5vdFN1cHBvcnRlZEV4Y2VwdGlvbigpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVkNhcmRBZ2VudE5vdFN1cHBvcnRlZEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlKTsKLSAgICB9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvZXhjZXB0aW9uL1ZDYXJkRXhjZXB0aW9uLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvZXhjZXB0aW9uL1ZDYXJkRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1NTcyMTkuLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL2V4Y2VwdGlvbi9WQ2FyZEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkLmV4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIFZDYXJkRXhjZXB0aW9uIGV4dGVuZHMgamF2YS5sYW5nLkV4Y2VwdGlvbiB7Ci0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIFZDYXJkRXhjZXB0aW9uIG9iamVjdAotICAgICAqLwotICAgIHB1YmxpYyBWQ2FyZEV4Y2VwdGlvbigpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgVkNhcmRFeGNlcHRpb24gb2JqZWN0Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgZXJyb3IgbWVzc2FnZQotICAgICAqLwotICAgIHB1YmxpYyBWQ2FyZEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9leGNlcHRpb24vVkNhcmRJbnZhbGlkQ29tbWVudExpbmVFeGNlcHRpb24uamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9leGNlcHRpb24vVkNhcmRJbnZhbGlkQ29tbWVudExpbmVFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjdkYjYyYy4uMDAwMDAwMAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvZXhjZXB0aW9uL1ZDYXJkSW52YWxpZENvbW1lbnRMaW5lRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZC5leGNlcHRpb247Ci0KLS8qKgotICogVGhyb3duIHdoZW4gdGhlIHZDYXJkIGhhcyBzb21lIGxpbmUgc3RhcnRpbmcgd2l0aCAnIycuIEluIHRoZSBzcGVjaWZpY2F0aW9uLAotICogYm90aCB2Q2FyZCAyLjEgYW5kIHZDYXJkIDMuMCBkb2VzIG5vdCBhbGxvdyBzdWNoIGxpbmUsIGJ1dCBzb21lIGFjdHVhbCBleHBvcnRlciBlbWl0Ci0gKiBzdWNoIGxpbmVzLgotICovCi1wdWJsaWMgY2xhc3MgVkNhcmRJbnZhbGlkQ29tbWVudExpbmVFeGNlcHRpb24gZXh0ZW5kcyBWQ2FyZEludmFsaWRMaW5lRXhjZXB0aW9uIHsKLSAgICBwdWJsaWMgVkNhcmRJbnZhbGlkQ29tbWVudExpbmVFeGNlcHRpb24oKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFZDYXJkSW52YWxpZENvbW1lbnRMaW5lRXhjZXB0aW9uKGZpbmFsIFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9leGNlcHRpb24vVkNhcmRJbnZhbGlkTGluZUV4Y2VwdGlvbi5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL2V4Y2VwdGlvbi9WQ2FyZEludmFsaWRMaW5lRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzMDE1M2UuLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL2V4Y2VwdGlvbi9WQ2FyZEludmFsaWRMaW5lRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZC5leGNlcHRpb247Ci0KLS8qKgotICogVGhyb3duIHdoZW4gdGhlIHZDYXJkIGhhcyBzb21lIGxpbmUgc3RhcnRpbmcgd2l0aCAnIycuIEluIHRoZSBzcGVjaWZpY2F0aW9uLAotICogYm90aCB2Q2FyZCAyLjEgYW5kIHZDYXJkIDMuMCBkb2VzIG5vdCBhbGxvdyBzdWNoIGxpbmUsIGJ1dCBzb21lIGFjdHVhbCBleHBvcnRlciBlbWl0Ci0gKiBzdWNoIGxpbmVzLgotICovCi1wdWJsaWMgY2xhc3MgVkNhcmRJbnZhbGlkTGluZUV4Y2VwdGlvbiBleHRlbmRzIFZDYXJkRXhjZXB0aW9uIHsKLSAgICBwdWJsaWMgVkNhcmRJbnZhbGlkTGluZUV4Y2VwdGlvbigpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVkNhcmRJbnZhbGlkTGluZUV4Y2VwdGlvbihmaW5hbCBTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvZXhjZXB0aW9uL1ZDYXJkTmVzdGVkRXhjZXB0aW9uLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvZXhjZXB0aW9uL1ZDYXJkTmVzdGVkRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwM2MyZmIuLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL2V4Y2VwdGlvbi9WQ2FyZE5lc3RlZEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQuZXhjZXB0aW9uOwotCi0vKioKLSAqIFZDYXJkRXhjZXB0aW9uIHRocm93biB3aGVuIFZDYXJkIGlzIG5lc3RlZCB3aXRob3V0IFZDYXJkUGFyc2VyJ3MgYmVpbmcgbm90aWZpZWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBWQ2FyZE5lc3RlZEV4Y2VwdGlvbiBleHRlbmRzIFZDYXJkTm90U3VwcG9ydGVkRXhjZXB0aW9uIHsKLSAgICBwdWJsaWMgVkNhcmROZXN0ZWRFeGNlcHRpb24oKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotICAgIHB1YmxpYyBWQ2FyZE5lc3RlZEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvZXhjZXB0aW9uL1ZDYXJkTm90U3VwcG9ydGVkRXhjZXB0aW9uLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvZXhjZXB0aW9uL1ZDYXJkTm90U3VwcG9ydGVkRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxNmFhNzc2My4uMDAwMDAwMAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvZXhjZXB0aW9uL1ZDYXJkTm90U3VwcG9ydGVkRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQuZXhjZXB0aW9uOwotCi0vKioKLSAqIFRoZSBleGNlcHRpb24gd2hpY2ggdGVsbHMgdGhhdCB0aGUgaW5wdXQgVkNhcmQgaXMgcHJvYmFibHkgdmFsaWQgZnJvbSB0aGUgdmlldyBvZgotICogc3BlY2lmaWNhdGlvbiBidXQgbm90IHN1cHBvcnRlZCBpbiB0aGUgY3VycmVudCBmcmFtZXdvcmsgZm9yIG5vdy4KLSAqIAotICogVGhpcyBpcyBhIGtpbmQgb2YgYSBnb29kIG5ld3MgZnJvbSB0aGUgdmlldyBvZiBkZXZlbG9wbWVudC4KLSAqIEl0IG1heSBiZSBnb29kIHRvIGFzayB1c2VycyB0byBzZW5kIGEgcmVwb3J0IHdpdGggdGhlIFZDYXJkIGV4YW1wbGUKLSAqIGZvciB0aGUgZnV0dXJlIGRldmVsb3BtZW50LgotICovCi1wdWJsaWMgY2xhc3MgVkNhcmROb3RTdXBwb3J0ZWRFeGNlcHRpb24gZXh0ZW5kcyBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgcHVibGljIFZDYXJkTm90U3VwcG9ydGVkRXhjZXB0aW9uKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLSAgICBwdWJsaWMgVkNhcmROb3RTdXBwb3J0ZWRFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSk7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9leGNlcHRpb24vVkNhcmRWZXJzaW9uRXhjZXB0aW9uLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvZXhjZXB0aW9uL1ZDYXJkVmVyc2lvbkV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZmU4YjdmLi4wMDAwMDAwCi0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9leGNlcHRpb24vVkNhcmRWZXJzaW9uRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZC5leGNlcHRpb247Ci0KLS8qKgotICogVkNhcmRFeGNlcHRpb24gdXNlZCBvbmx5IHdoZW4gdGhlIHZlcnNpb24gb2YgdGhlIHZDYXJkIGlzIGRpZmZlcmVudC4gCi0gKi8KLXB1YmxpYyBjbGFzcyBWQ2FyZFZlcnNpb25FeGNlcHRpb24gZXh0ZW5kcyBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgcHVibGljIFZDYXJkVmVyc2lvbkV4Y2VwdGlvbigpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0gICAgcHVibGljIFZDYXJkVmVyc2lvbkV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvZXhjZXB0aW9uL3BhY2thZ2UuaHRtbCBiL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9leGNlcHRpb24vcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmI4YTMyLi4wMDAwMDAwCi0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9leGNlcHRpb24vcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08SFRNTD4KLTxCT0RZPgote0BoaWRlfQotPC9CT0RZPgotPC9IVE1MPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9wYWNrYWdlLmh0bWwgYi9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmI4YTMyLi4wMDAwMDAwCi0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxIVE1MPgotPEJPRFk+Ci17QGhpZGV9Ci08L0JPRFk+Ci08L0hUTUw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcHJlZmVyZW5jZS9NdWx0aVNlbGVjdExpc3RQcmVmZXJlbmNlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9wcmVmZXJlbmNlL011bHRpU2VsZWN0TGlzdFByZWZlcmVuY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmQ1NTVjZgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ByZWZlcmVuY2UvTXVsdGlTZWxlY3RMaXN0UHJlZmVyZW5jZS5qYXZhCkBAIC0wLDAgKzEsMjc0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnByZWZlcmVuY2U7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BbGVydERpYWxvZy5CdWlsZGVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5EaWFsb2dJbnRlcmZhY2U7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5UeXBlZEFycmF5OworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsOworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsYWJsZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OworCitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworLyoqCisgKiBBIHtAbGluayBQcmVmZXJlbmNlfSB0aGF0IGRpc3BsYXlzIGEgbGlzdCBvZiBlbnRyaWVzIGFzCisgKiBhIGRpYWxvZy4KKyAqIDxwPgorICogVGhpcyBwcmVmZXJlbmNlIHdpbGwgc3RvcmUgYSBzZXQgb2Ygc3RyaW5ncyBpbnRvIHRoZSBTaGFyZWRQcmVmZXJlbmNlcy4KKyAqIFRoaXMgc2V0IHdpbGwgY29udGFpbiBvbmUgb3IgbW9yZSB2YWx1ZXMgZnJvbSB0aGUKKyAqIHtAbGluayAjc2V0RW50cnlWYWx1ZXMoQ2hhclNlcXVlbmNlW10pfSBhcnJheS4KKyAqIAorICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjTXVsdGlTZWxlY3RMaXN0UHJlZmVyZW5jZV9lbnRyaWVzCisgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNNdWx0aVNlbGVjdExpc3RQcmVmZXJlbmNlX2VudHJ5VmFsdWVzCisgKi8KK3B1YmxpYyBjbGFzcyBNdWx0aVNlbGVjdExpc3RQcmVmZXJlbmNlIGV4dGVuZHMgRGlhbG9nUHJlZmVyZW5jZSB7CisgICAgcHJpdmF0ZSBDaGFyU2VxdWVuY2VbXSBtRW50cmllczsKKyAgICBwcml2YXRlIENoYXJTZXF1ZW5jZVtdIG1FbnRyeVZhbHVlczsKKyAgICBwcml2YXRlIFNldDxTdHJpbmc+IG1WYWx1ZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CisgICAgcHJpdmF0ZSBTZXQ8U3RyaW5nPiBtTmV3VmFsdWVzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOworICAgIHByaXZhdGUgYm9vbGVhbiBtUHJlZmVyZW5jZUNoYW5nZWQ7CisgICAgCisgICAgcHVibGljIE11bHRpU2VsZWN0TGlzdFByZWZlcmVuY2UoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMpOworICAgICAgICAKKyAgICAgICAgVHlwZWRBcnJheSBhID0gY29udGV4dC5vYnRhaW5TdHlsZWRBdHRyaWJ1dGVzKGF0dHJzLAorICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLk11bHRpU2VsZWN0TGlzdFByZWZlcmVuY2UsIDAsIDApOworICAgICAgICBtRW50cmllcyA9IGEuZ2V0VGV4dEFycmF5KGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLk11bHRpU2VsZWN0TGlzdFByZWZlcmVuY2VfZW50cmllcyk7CisgICAgICAgIG1FbnRyeVZhbHVlcyA9IGEuZ2V0VGV4dEFycmF5KGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLk11bHRpU2VsZWN0TGlzdFByZWZlcmVuY2VfZW50cnlWYWx1ZXMpOworICAgICAgICBhLnJlY3ljbGUoKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIE11bHRpU2VsZWN0TGlzdFByZWZlcmVuY2UoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHRoaXMoY29udGV4dCwgbnVsbCk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFNldHMgdGhlIGh1bWFuLXJlYWRhYmxlIGVudHJpZXMgdG8gYmUgc2hvd24gaW4gdGhlIGxpc3QuIFRoaXMgd2lsbCBiZQorICAgICAqIHNob3duIGluIHN1YnNlcXVlbnQgZGlhbG9ncy4KKyAgICAgKiA8cD4KKyAgICAgKiBFYWNoIGVudHJ5IG11c3QgaGF2ZSBhIGNvcnJlc3BvbmRpbmcgaW5kZXggaW4KKyAgICAgKiB7QGxpbmsgI3NldEVudHJ5VmFsdWVzKENoYXJTZXF1ZW5jZVtdKX0uCisgICAgICogCisgICAgICogQHBhcmFtIGVudHJpZXMgVGhlIGVudHJpZXMuCisgICAgICogQHNlZSAjc2V0RW50cnlWYWx1ZXMoQ2hhclNlcXVlbmNlW10pCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RW50cmllcyhDaGFyU2VxdWVuY2VbXSBlbnRyaWVzKSB7CisgICAgICAgIG1FbnRyaWVzID0gZW50cmllczsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQHNlZSAjc2V0RW50cmllcyhDaGFyU2VxdWVuY2VbXSkKKyAgICAgKiBAcGFyYW0gZW50cmllc1Jlc0lkIFRoZSBlbnRyaWVzIGFycmF5IGFzIGEgcmVzb3VyY2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RW50cmllcyhpbnQgZW50cmllc1Jlc0lkKSB7CisgICAgICAgIHNldEVudHJpZXMoZ2V0Q29udGV4dCgpLmdldFJlc291cmNlcygpLmdldFRleHRBcnJheShlbnRyaWVzUmVzSWQpKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogVGhlIGxpc3Qgb2YgZW50cmllcyB0byBiZSBzaG93biBpbiB0aGUgbGlzdCBpbiBzdWJzZXF1ZW50IGRpYWxvZ3MuCisgICAgICogCisgICAgICogQHJldHVybiBUaGUgbGlzdCBhcyBhbiBhcnJheS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2hhclNlcXVlbmNlW10gZ2V0RW50cmllcygpIHsKKyAgICAgICAgcmV0dXJuIG1FbnRyaWVzOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgYXJyYXkgdG8gZmluZCB0aGUgdmFsdWUgdG8gc2F2ZSBmb3IgYSBwcmVmZXJlbmNlIHdoZW4gYW4gZW50cnkgZnJvbQorICAgICAqIGVudHJpZXMgaXMgc2VsZWN0ZWQuIElmIGEgdXNlciBjbGlja3Mgb24gdGhlIHNlY29uZCBpdGVtIGluIGVudHJpZXMsIHRoZQorICAgICAqIHNlY29uZCBpdGVtIGluIHRoaXMgYXJyYXkgd2lsbCBiZSBzYXZlZCB0byB0aGUgcHJlZmVyZW5jZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZW50cnlWYWx1ZXMgVGhlIGFycmF5IHRvIGJlIHVzZWQgYXMgdmFsdWVzIHRvIHNhdmUgZm9yIHRoZSBwcmVmZXJlbmNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEVudHJ5VmFsdWVzKENoYXJTZXF1ZW5jZVtdIGVudHJ5VmFsdWVzKSB7CisgICAgICAgIG1FbnRyeVZhbHVlcyA9IGVudHJ5VmFsdWVzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBzZWUgI3NldEVudHJ5VmFsdWVzKENoYXJTZXF1ZW5jZVtdKQorICAgICAqIEBwYXJhbSBlbnRyeVZhbHVlc1Jlc0lkIFRoZSBlbnRyeSB2YWx1ZXMgYXJyYXkgYXMgYSByZXNvdXJjZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRFbnRyeVZhbHVlcyhpbnQgZW50cnlWYWx1ZXNSZXNJZCkgeworICAgICAgICBzZXRFbnRyeVZhbHVlcyhnZXRDb250ZXh0KCkuZ2V0UmVzb3VyY2VzKCkuZ2V0VGV4dEFycmF5KGVudHJ5VmFsdWVzUmVzSWQpKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgYXJyYXkgb2YgdmFsdWVzIHRvIGJlIHNhdmVkIGZvciB0aGUgcHJlZmVyZW5jZS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIFRoZSBhcnJheSBvZiB2YWx1ZXMuCisgICAgICovCisgICAgcHVibGljIENoYXJTZXF1ZW5jZVtdIGdldEVudHJ5VmFsdWVzKCkgeworICAgICAgICByZXR1cm4gbUVudHJ5VmFsdWVzOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUga2V5LiBUaGlzIHNob3VsZCBjb250YWluIGVudHJpZXMgaW4KKyAgICAgKiB7QGxpbmsgI2dldEVudHJ5VmFsdWVzKCl9LgorICAgICAqIAorICAgICAqIEBwYXJhbSB2YWx1ZXMgVGhlIHZhbHVlcyB0byBzZXQgZm9yIHRoZSBrZXkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VmFsdWVzKFNldDxTdHJpbmc+IHZhbHVlcykgeworICAgICAgICBtVmFsdWVzID0gdmFsdWVzOworICAgICAgICAKKyAgICAgICAgcGVyc2lzdFN0cmluZ1NldCh2YWx1ZXMpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGtleS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU2V0PFN0cmluZz4gZ2V0VmFsdWVzKCkgeworICAgICAgICByZXR1cm4gbVZhbHVlczsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGdpdmVuIHZhbHVlIChpbiB0aGUgZW50cnkgdmFsdWVzIGFycmF5KS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHdob3NlIGluZGV4IHNob3VsZCBiZSByZXR1cm5lZC4KKyAgICAgKiBAcmV0dXJuIFRoZSBpbmRleCBvZiB0aGUgdmFsdWUsIG9yIC0xIGlmIG5vdCBmb3VuZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGZpbmRJbmRleE9mVmFsdWUoU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsICYmIG1FbnRyeVZhbHVlcyAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gbUVudHJ5VmFsdWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICAgICAgaWYgKG1FbnRyeVZhbHVlc1tpXS5lcXVhbHModmFsdWUpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIAorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uUHJlcGFyZURpYWxvZ0J1aWxkZXIoQnVpbGRlciBidWlsZGVyKSB7CisgICAgICAgIHN1cGVyLm9uUHJlcGFyZURpYWxvZ0J1aWxkZXIoYnVpbGRlcik7CisgICAgICAgIAorICAgICAgICBpZiAobUVudHJpZXMgPT0gbnVsbCB8fCBtRW50cnlWYWx1ZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIk11bHRpU2VsZWN0TGlzdFByZWZlcmVuY2UgcmVxdWlyZXMgYW4gZW50cmllcyBhcnJheSBhbmQgIiArCisgICAgICAgICAgICAgICAgICAgICJhbiBlbnRyeVZhbHVlcyBhcnJheS4iKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgYm9vbGVhbltdIGNoZWNrZWRJdGVtcyA9IGdldFNlbGVjdGVkSXRlbXMoKTsKKyAgICAgICAgYnVpbGRlci5zZXRNdWx0aUNob2ljZUl0ZW1zKG1FbnRyaWVzLCBjaGVja2VkSXRlbXMsCisgICAgICAgICAgICAgICAgbmV3IERpYWxvZ0ludGVyZmFjZS5Pbk11bHRpQ2hvaWNlQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhEaWFsb2dJbnRlcmZhY2UgZGlhbG9nLCBpbnQgd2hpY2gsIGJvb2xlYW4gaXNDaGVja2VkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNDaGVja2VkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVByZWZlcmVuY2VDaGFuZ2VkIHw9IG1OZXdWYWx1ZXMuYWRkKG1FbnRyaWVzW3doaWNoXS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVByZWZlcmVuY2VDaGFuZ2VkIHw9IG1OZXdWYWx1ZXMucmVtb3ZlKG1FbnRyaWVzW3doaWNoXS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICBtTmV3VmFsdWVzLmNsZWFyKCk7CisgICAgICAgIG1OZXdWYWx1ZXMuYWRkQWxsKG1WYWx1ZXMpOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIGJvb2xlYW5bXSBnZXRTZWxlY3RlZEl0ZW1zKCkgeworICAgICAgICBmaW5hbCBDaGFyU2VxdWVuY2VbXSBlbnRyaWVzID0gbUVudHJpZXM7CisgICAgICAgIGZpbmFsIGludCBlbnRyeUNvdW50ID0gZW50cmllcy5sZW5ndGg7CisgICAgICAgIGZpbmFsIFNldDxTdHJpbmc+IHZhbHVlcyA9IG1WYWx1ZXM7CisgICAgICAgIGJvb2xlYW5bXSByZXN1bHQgPSBuZXcgYm9vbGVhbltlbnRyeUNvdW50XTsKKyAgICAgICAgCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZW50cnlDb3VudDsgaSsrKSB7CisgICAgICAgICAgICByZXN1bHRbaV0gPSB2YWx1ZXMuY29udGFpbnMoZW50cmllc1tpXS50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25EaWFsb2dDbG9zZWQoYm9vbGVhbiBwb3NpdGl2ZVJlc3VsdCkgeworICAgICAgICBzdXBlci5vbkRpYWxvZ0Nsb3NlZChwb3NpdGl2ZVJlc3VsdCk7CisgICAgICAgIAorICAgICAgICBpZiAocG9zaXRpdmVSZXN1bHQgJiYgbVByZWZlcmVuY2VDaGFuZ2VkKSB7CisgICAgICAgICAgICBmaW5hbCBTZXQ8U3RyaW5nPiB2YWx1ZXMgPSBtTmV3VmFsdWVzOworICAgICAgICAgICAgaWYgKGNhbGxDaGFuZ2VMaXN0ZW5lcih2YWx1ZXMpKSB7CisgICAgICAgICAgICAgICAgc2V0VmFsdWVzKHZhbHVlcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbVByZWZlcmVuY2VDaGFuZ2VkID0gZmFsc2U7CisgICAgfQorICAgIAorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBPYmplY3Qgb25HZXREZWZhdWx0VmFsdWUoVHlwZWRBcnJheSBhLCBpbnQgaW5kZXgpIHsKKyAgICAgICAgZmluYWwgQ2hhclNlcXVlbmNlW10gZGVmYXVsdFZhbHVlcyA9IGEuZ2V0VGV4dEFycmF5KGluZGV4KTsKKyAgICAgICAgZmluYWwgaW50IHZhbHVlQ291bnQgPSBkZWZhdWx0VmFsdWVzLmxlbmd0aDsKKyAgICAgICAgZmluYWwgU2V0PFN0cmluZz4gcmVzdWx0ID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOworICAgICAgICAKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZUNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIHJlc3VsdC5hZGQoZGVmYXVsdFZhbHVlc1tpXS50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25TZXRJbml0aWFsVmFsdWUoYm9vbGVhbiByZXN0b3JlVmFsdWUsIE9iamVjdCBkZWZhdWx0VmFsdWUpIHsKKyAgICAgICAgc2V0VmFsdWVzKHJlc3RvcmVWYWx1ZSA/IGdldFBlcnNpc3RlZFN0cmluZ1NldChtVmFsdWVzKSA6IChTZXQ8U3RyaW5nPikgZGVmYXVsdFZhbHVlKTsKKyAgICB9CisgICAgCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFBhcmNlbGFibGUgb25TYXZlSW5zdGFuY2VTdGF0ZSgpIHsKKyAgICAgICAgZmluYWwgUGFyY2VsYWJsZSBzdXBlclN0YXRlID0gc3VwZXIub25TYXZlSW5zdGFuY2VTdGF0ZSgpOworICAgICAgICBpZiAoaXNQZXJzaXN0ZW50KCkpIHsKKyAgICAgICAgICAgIC8vIE5vIG5lZWQgdG8gc2F2ZSBpbnN0YW5jZSBzdGF0ZQorICAgICAgICAgICAgcmV0dXJuIHN1cGVyU3RhdGU7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGZpbmFsIFNhdmVkU3RhdGUgbXlTdGF0ZSA9IG5ldyBTYXZlZFN0YXRlKHN1cGVyU3RhdGUpOworICAgICAgICBteVN0YXRlLnZhbHVlcyA9IGdldFZhbHVlcygpOworICAgICAgICByZXR1cm4gbXlTdGF0ZTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU2F2ZWRTdGF0ZSBleHRlbmRzIEJhc2VTYXZlZFN0YXRlIHsKKyAgICAgICAgU2V0PFN0cmluZz4gdmFsdWVzOworICAgICAgICAKKyAgICAgICAgcHVibGljIFNhdmVkU3RhdGUoUGFyY2VsIHNvdXJjZSkgeworICAgICAgICAgICAgc3VwZXIoc291cmNlKTsKKyAgICAgICAgICAgIHZhbHVlcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKKyAgICAgICAgICAgIFN0cmluZ1tdIHN0cmluZ3MgPSBzb3VyY2UucmVhZFN0cmluZ0FycmF5KCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGZpbmFsIGludCBzdHJpbmdDb3VudCA9IHN0cmluZ3MubGVuZ3RoOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdHJpbmdDb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgdmFsdWVzLmFkZChzdHJpbmdzW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIFNhdmVkU3RhdGUoUGFyY2VsYWJsZSBzdXBlclN0YXRlKSB7CisgICAgICAgICAgICBzdXBlcihzdXBlclN0YXRlKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlVG9QYXJjZWwoUGFyY2VsIGRlc3QsIGludCBmbGFncykgeworICAgICAgICAgICAgc3VwZXIud3JpdGVUb1BhcmNlbChkZXN0LCBmbGFncyk7CisgICAgICAgICAgICBkZXN0LndyaXRlU3RyaW5nQXJyYXkodmFsdWVzLnRvQXJyYXkobmV3IFN0cmluZ1swXSkpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFBhcmNlbGFibGUuQ3JlYXRvcjxTYXZlZFN0YXRlPiBDUkVBVE9SID0KKyAgICAgICAgICAgICAgICBuZXcgUGFyY2VsYWJsZS5DcmVhdG9yPFNhdmVkU3RhdGU+KCkgeworICAgICAgICAgICAgcHVibGljIFNhdmVkU3RhdGUgY3JlYXRlRnJvbVBhcmNlbChQYXJjZWwgaW4pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNhdmVkU3RhdGUoaW4pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBwdWJsaWMgU2F2ZWRTdGF0ZVtdIG5ld0FycmF5KGludCBzaXplKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTYXZlZFN0YXRlW3NpemVdOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ByZWZlcmVuY2UvUHJlZmVyZW5jZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcHJlZmVyZW5jZS9QcmVmZXJlbmNlLmphdmEKaW5kZXggMTk3ZDk3Ni4uZmZjMjg2MiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcHJlZmVyZW5jZS9QcmVmZXJlbmNlLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvcHJlZmVyZW5jZS9QcmVmZXJlbmNlLmphdmEKQEAgLTE2LDggKzE2LDcgQEAKIAogcGFja2FnZSBhbmRyb2lkLnByZWZlcmVuY2U7CiAKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnV0aWwuQ2hhclNlcXVlbmNlczsKIAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CkBAIC0yOCw3ICsyNyw2IEBACiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxhYmxlOwogaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLkNoYXJTZXF1ZW5jZXM7CiBpbXBvcnQgYW5kcm9pZC52aWV3LkFic1NhdmVkU3RhdGU7CiBpbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwpAQCAtMzYsNiArMzQsMTAgQEAKIGltcG9ydCBhbmRyb2lkLndpZGdldC5MaXN0VmlldzsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKIAoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKwogLyoqCiAgKiBSZXByZXNlbnRzIHRoZSBiYXNpYyBQcmVmZXJlbmNlIFVJIGJ1aWxkaW5nCiAgKiBibG9jayBkaXNwbGF5ZWQgYnkgYSB7QGxpbmsgUHJlZmVyZW5jZUFjdGl2aXR5fSBpbiB0aGUgZm9ybSBvZiBhCkBAIC01NCw2ICs1Niw3IEBACiAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNQcmVmZXJlbmNlX3RpdGxlCiAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNQcmVmZXJlbmNlX3N1bW1hcnkKICAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI1ByZWZlcmVuY2Vfb3JkZXIKKyAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI1ByZWZlcmVuY2VfZnJhZ21lbnQKICAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI1ByZWZlcmVuY2VfbGF5b3V0CiAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNQcmVmZXJlbmNlX3dpZGdldExheW91dAogICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjUHJlZmVyZW5jZV9lbmFibGVkCkBAIC04Niw2ICs4OSw4IEBACiAgICAgcHJpdmF0ZSBDaGFyU2VxdWVuY2UgbVN1bW1hcnk7CiAgICAgcHJpdmF0ZSBTdHJpbmcgbUtleTsKICAgICBwcml2YXRlIEludGVudCBtSW50ZW50OworICAgIHByaXZhdGUgU3RyaW5nIG1GcmFnbWVudDsKKyAgICBwcml2YXRlIEJ1bmRsZSBtRXh0cmFzOwogICAgIHByaXZhdGUgYm9vbGVhbiBtRW5hYmxlZCA9IHRydWU7CiAgICAgcHJpdmF0ZSBib29sZWFuIG1TZWxlY3RhYmxlID0gdHJ1ZTsKICAgICBwcml2YXRlIGJvb2xlYW4gbVJlcXVpcmVzS2V5OwpAQCAtMjA4LDYgKzIxMywxMCBAQAogICAgICAgICAgICAgICAgICAgICBtT3JkZXIgPSBhLmdldEludChhdHRyLCBtT3JkZXIpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKIAorICAgICAgICAgICAgICAgIGNhc2UgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuUHJlZmVyZW5jZV9mcmFnbWVudDoKKyAgICAgICAgICAgICAgICAgICAgbUZyYWdtZW50ID0gYS5nZXRTdHJpbmcoYXR0cik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCiAgICAgICAgICAgICAgICAgY2FzZSBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5QcmVmZXJlbmNlX2xheW91dDoKICAgICAgICAgICAgICAgICAgICAgbUxheW91dFJlc0lkID0gYS5nZXRSZXNvdXJjZUlkKGF0dHIsIG1MYXlvdXRSZXNJZCk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMzEzLDYgKzMyMiw0NCBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFNldHMgdGhlIGNsYXNzIG5hbWUgb2YgYSBmcmFnbWVudCB0byBiZSBzaG93biB3aGVuIHRoaXMgUHJlZmVyZW5jZSBpcyBjbGlja2VkLgorICAgICAqCisgICAgICogQHBhcmFtIGZyYWdtZW50IFRoZSBjbGFzcyBuYW1lIG9mIHRoZSBmcmFnbWVudCBhc3NvY2lhdGVkIHdpdGggdGhpcyBQcmVmZXJlbmNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEZyYWdtZW50KFN0cmluZyBmcmFnbWVudCkgeworICAgICAgICBtRnJhZ21lbnQgPSBmcmFnbWVudDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGZyYWdtZW50IGNsYXNzIG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgUHJlZmVyZW5jZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIGZyYWdtZW50IGNsYXNzIG5hbWUgbGFzdCBzZXQgdmlhIHtAbGluayAjc2V0RnJhZ21lbnR9IG9yIFhNTC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEZyYWdtZW50KCkgeworICAgICAgICByZXR1cm4gbUZyYWdtZW50OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZXh0cmFzIEJ1bmRsZSBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcHJlZmVyZW5jZSwgY3JlYXRpbmcKKyAgICAgKiBhIG5ldyBCdW5kbGUgaWYgdGhlcmUgY3VycmVudGx5IGlzbid0IG9uZS4gIFlvdSBjYW4gdXNlIHRoaXMgdG8gZ2V0IGFuZAorICAgICAqIHNldCBpbmRpdmlkdWFsIGV4dHJhIGtleS92YWx1ZSBwYWlycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgQnVuZGxlIGdldEV4dHJhcygpIHsKKyAgICAgICAgaWYgKG1FeHRyYXMgPT0gbnVsbCkgeworICAgICAgICAgICAgbUV4dHJhcyA9IG5ldyBCdW5kbGUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbUV4dHJhczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGV4dHJhcyBCdW5kbGUgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIHByZWZlcmVuY2UsCisgICAgICogcmV0dXJuaW5nIG51bGwgaWYgdGhlcmUgaXMgbm90IGN1cnJlbnRseSBvbmUuCisgICAgICovCisgICAgcHVibGljIEJ1bmRsZSBwZWVrRXh0cmFzKCkgeworICAgICAgICByZXR1cm4gbUV4dHJhczsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBTZXRzIHRoZSBsYXlvdXQgcmVzb3VyY2UgdGhhdCBpcyBpbmZsYXRlZCBhcyB0aGUge0BsaW5rIFZpZXd9IHRvIGJlIHNob3duCiAgICAgICogZm9yIHRoaXMgUHJlZmVyZW5jZS4gSW4gbW9zdCBjYXNlcywgdGhlIGRlZmF1bHQgbGF5b3V0IGlzIHN1ZmZpY2llbnQgZm9yCiAgICAgICogY3VzdG9tIFByZWZlcmVuY2Ugb2JqZWN0cyBhbmQgb25seSB0aGUgd2lkZ2V0IGxheW91dCBuZWVkcyB0byBiZSBjaGFuZ2VkLgpAQCAtMTI1MCw2ICsxMjk3LDYxIEBACiAgICAgfQogICAgIAogICAgIC8qKgorICAgICAqIEF0dGVtcHRzIHRvIHBlcnNpc3QgYSBzZXQgb2YgU3RyaW5ncyB0byB0aGUge0BsaW5rIGFuZHJvaWQuY29udGVudC5TaGFyZWRQcmVmZXJlbmNlc30uCisgICAgICogPHA+CisgICAgICogVGhpcyB3aWxsIGNoZWNrIGlmIHRoaXMgUHJlZmVyZW5jZSBpcyBwZXJzaXN0ZW50LCBnZXQgYW4gZWRpdG9yIGZyb20KKyAgICAgKiB0aGUge0BsaW5rIFByZWZlcmVuY2VNYW5hZ2VyfSwgcHV0IGluIHRoZSBzdHJpbmdzLCBhbmQgY2hlY2sgaWYgd2Ugc2hvdWxkIGNvbW1pdCAoYW5kCisgICAgICogY29tbWl0IGlmIHNvKS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdmFsdWVzIFRoZSB2YWx1ZXMgdG8gcGVyc2lzdC4KKyAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIFByZWZlcmVuY2UgaXMgcGVyc2lzdGVudC4gKFRoaXMgaXMgbm90IHdoZXRoZXIgdGhlCisgICAgICogICAgICAgICB2YWx1ZSB3YXMgcGVyc2lzdGVkLCBzaW5jZSB3ZSBtYXkgbm90IG5lY2Vzc2FyaWx5IGNvbW1pdCBpZiB0aGVyZQorICAgICAqICAgICAgICAgd2lsbCBiZSBhIGJhdGNoIGNvbW1pdCBsYXRlci4pCisgICAgICogQHNlZSAjZ2V0UGVyc2lzdGVkU3RyaW5nKFNldCkKKyAgICAgKiAKKyAgICAgKiBAaGlkZSBQZW5kaW5nIEFQSSBhcHByb3ZhbAorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIHBlcnNpc3RTdHJpbmdTZXQoU2V0PFN0cmluZz4gdmFsdWVzKSB7CisgICAgICAgIGlmIChzaG91bGRQZXJzaXN0KCkpIHsKKyAgICAgICAgICAgIC8vIFNob3VsZG4ndCBzdG9yZSBudWxsCisgICAgICAgICAgICBpZiAodmFsdWVzLmVxdWFscyhnZXRQZXJzaXN0ZWRTdHJpbmdTZXQobnVsbCkpKSB7CisgICAgICAgICAgICAgICAgLy8gSXQncyBhbHJlYWR5IHRoZXJlLCBzbyB0aGUgc2FtZSBhcyBwZXJzaXN0aW5nCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIFNoYXJlZFByZWZlcmVuY2VzLkVkaXRvciBlZGl0b3IgPSBtUHJlZmVyZW5jZU1hbmFnZXIuZ2V0RWRpdG9yKCk7CisgICAgICAgICAgICBlZGl0b3IucHV0U3RyaW5nU2V0KG1LZXksIHZhbHVlcyk7CisgICAgICAgICAgICB0cnlDb21taXQoZWRpdG9yKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBdHRlbXB0cyB0byBnZXQgYSBwZXJzaXN0ZWQgc2V0IG9mIFN0cmluZ3MgZnJvbSB0aGUKKyAgICAgKiB7QGxpbmsgYW5kcm9pZC5jb250ZW50LlNoYXJlZFByZWZlcmVuY2VzfS4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIHdpbGwgY2hlY2sgaWYgdGhpcyBQcmVmZXJlbmNlIGlzIHBlcnNpc3RlbnQsIGdldCB0aGUgU2hhcmVkUHJlZmVyZW5jZXMKKyAgICAgKiBmcm9tIHRoZSB7QGxpbmsgUHJlZmVyZW5jZU1hbmFnZXJ9LCBhbmQgZ2V0IHRoZSB2YWx1ZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZGVmYXVsdFJldHVyblZhbHVlIFRoZSBkZWZhdWx0IHZhbHVlIHRvIHJldHVybiBpZiBlaXRoZXIgdGhlCisgICAgICogICAgICAgICAgICBQcmVmZXJlbmNlIGlzIG5vdCBwZXJzaXN0ZW50IG9yIHRoZSBQcmVmZXJlbmNlIGlzIG5vdCBpbiB0aGUKKyAgICAgKiAgICAgICAgICAgIHNoYXJlZCBwcmVmZXJlbmNlcy4KKyAgICAgKiBAcmV0dXJuIFRoZSB2YWx1ZSBmcm9tIHRoZSBTaGFyZWRQcmVmZXJlbmNlcyBvciB0aGUgZGVmYXVsdCByZXR1cm4KKyAgICAgKiAgICAgICAgIHZhbHVlLgorICAgICAqIEBzZWUgI3BlcnNpc3RTdHJpbmdTZXQoU2V0KQorICAgICAqIAorICAgICAqIEBoaWRlIFBlbmRpbmcgQVBJIGFwcHJvdmFsCisgICAgICovCisgICAgcHJvdGVjdGVkIFNldDxTdHJpbmc+IGdldFBlcnNpc3RlZFN0cmluZ1NldChTZXQ8U3RyaW5nPiBkZWZhdWx0UmV0dXJuVmFsdWUpIHsKKyAgICAgICAgaWYgKCFzaG91bGRQZXJzaXN0KCkpIHsKKyAgICAgICAgICAgIHJldHVybiBkZWZhdWx0UmV0dXJuVmFsdWU7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHJldHVybiBtUHJlZmVyZW5jZU1hbmFnZXIuZ2V0U2hhcmVkUHJlZmVyZW5jZXMoKS5nZXRTdHJpbmdTZXQobUtleSwgZGVmYXVsdFJldHVyblZhbHVlKTsKKyAgICB9CisgICAgCisgICAgLyoqCiAgICAgICogQXR0ZW1wdHMgdG8gcGVyc2lzdCBhbiBpbnQgdG8gdGhlIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuU2hhcmVkUHJlZmVyZW5jZXN9LgogICAgICAqIAogICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gcGVyc2lzdC4KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ByZWZlcmVuY2UvUHJlZmVyZW5jZUFjdGl2aXR5LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9wcmVmZXJlbmNlL1ByZWZlcmVuY2VBY3Rpdml0eS5qYXZhCmluZGV4IDcyNjc5M2QuLjcwYTJiODAgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ByZWZlcmVuY2UvUHJlZmVyZW5jZUFjdGl2aXR5LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvcHJlZmVyZW5jZS9QcmVmZXJlbmNlQWN0aXZpdHkuamF2YQpAQCAtMTYsMTM1ICsxNiw1NzkgQEAKIAogcGFja2FnZSBhbmRyb2lkLnByZWZlcmVuY2U7CiAKLWltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLlhtbFV0aWxzOworCitpbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlcjsKK2ltcG9ydCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyRXhjZXB0aW9uOworCitpbXBvcnQgYW5kcm9pZC5hcHAuRnJhZ21lbnQ7CiBpbXBvcnQgYW5kcm9pZC5hcHAuTGlzdEFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LlNoYXJlZFByZWZlcmVuY2VzOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5YbWxSZXNvdXJjZVBhcnNlcjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOwogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwogaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKIGltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC51dGlsLlhtbDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXI7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldy5PbkNsaWNrTGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQXJyYXlBZGFwdGVyOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkJ1dHRvbjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGlzdFZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKIC8qKgotICogU2hvd3MgYSBoaWVyYXJjaHkgb2Yge0BsaW5rIFByZWZlcmVuY2V9IG9iamVjdHMgYXMKLSAqIGxpc3RzLCBwb3NzaWJseSBzcGFubmluZyBtdWx0aXBsZSBzY3JlZW5zLiBUaGVzZSBwcmVmZXJlbmNlcyB3aWxsCi0gKiBhdXRvbWF0aWNhbGx5IHNhdmUgdG8ge0BsaW5rIFNoYXJlZFByZWZlcmVuY2VzfSBhcyB0aGUgdXNlciBpbnRlcmFjdHMgd2l0aAotICogdGhlbS4gVG8gcmV0cmlldmUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIFNoYXJlZFByZWZlcmVuY2VzfSB0aGF0IHRoZQotICogcHJlZmVyZW5jZSBoaWVyYXJjaHkgaW4gdGhpcyBhY3Rpdml0eSB3aWxsIHVzZSwgY2FsbAotICoge0BsaW5rIFByZWZlcmVuY2VNYW5hZ2VyI2dldERlZmF1bHRTaGFyZWRQcmVmZXJlbmNlcyhhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCl9Ci0gKiB3aXRoIGEgY29udGV4dCBpbiB0aGUgc2FtZSBwYWNrYWdlIGFzIHRoaXMgYWN0aXZpdHkuCi0gKiA8cD4KLSAqIEZ1cnRoZXJtb3JlLCB0aGUgcHJlZmVyZW5jZXMgc2hvd24gd2lsbCBmb2xsb3cgdGhlIHZpc3VhbCBzdHlsZSBvZiBzeXN0ZW0KLSAqIHByZWZlcmVuY2VzLiBJdCBpcyBlYXN5IHRvIGNyZWF0ZSBhIGhpZXJhcmNoeSBvZiBwcmVmZXJlbmNlcyAodGhhdCBjYW4gYmUKLSAqIHNob3duIG9uIG11bHRpcGxlIHNjcmVlbnMpIHZpYSBYTUwuIEZvciB0aGVzZSByZWFzb25zLCBpdCBpcyByZWNvbW1lbmRlZCB0bwotICogdXNlIHRoaXMgYWN0aXZpdHkgKGFzIGEgc3VwZXJjbGFzcykgdG8gZGVhbCB3aXRoIHByZWZlcmVuY2VzIGluIGFwcGxpY2F0aW9ucy4KLSAqIDxwPgotICogQSB7QGxpbmsgUHJlZmVyZW5jZVNjcmVlbn0gb2JqZWN0IHNob3VsZCBiZSBhdCB0aGUgdG9wIG9mIHRoZSBwcmVmZXJlbmNlCi0gKiBoaWVyYXJjaHkuIEZ1cnRoZXJtb3JlLCBzdWJzZXF1ZW50IHtAbGluayBQcmVmZXJlbmNlU2NyZWVufSBpbiB0aGUgaGllcmFyY2h5Ci0gKiBkZW5vdGUgYSBzY3JlZW4gYnJlYWstLXRoYXQgaXMgdGhlIHByZWZlcmVuY2VzIGNvbnRhaW5lZCB3aXRoaW4gc3Vic2VxdWVudAotICoge0BsaW5rIFByZWZlcmVuY2VTY3JlZW59IHNob3VsZCBiZSBzaG93biBvbiBhbm90aGVyIHNjcmVlbi4gVGhlIHByZWZlcmVuY2UKLSAqIGZyYW1ld29yayBoYW5kbGVzIHNob3dpbmcgdGhlc2Ugb3RoZXIgc2NyZWVucyBmcm9tIHRoZSBwcmVmZXJlbmNlIGhpZXJhcmNoeS4KLSAqIDxwPgotICogVGhlIHByZWZlcmVuY2UgaGllcmFyY2h5IGNhbiBiZSBmb3JtZWQgaW4gbXVsdGlwbGUgd2F5czoKLSAqIDxsaT4gRnJvbSBhbiBYTUwgZmlsZSBzcGVjaWZ5aW5nIHRoZSBoaWVyYXJjaHkKLSAqIDxsaT4gRnJvbSBkaWZmZXJlbnQge0BsaW5rIEFjdGl2aXR5IEFjdGl2aXRpZXN9IHRoYXQgZWFjaCBzcGVjaWZ5IGl0cyBvd24KLSAqIHByZWZlcmVuY2VzIGluIGFuIFhNTCBmaWxlIHZpYSB7QGxpbmsgQWN0aXZpdHl9IG1ldGEtZGF0YQotICogPGxpPiBGcm9tIGFuIG9iamVjdCBoaWVyYXJjaHkgcm9vdGVkIHdpdGgge0BsaW5rIFByZWZlcmVuY2VTY3JlZW59Ci0gKiA8cD4KLSAqIFRvIGluZmxhdGUgZnJvbSBYTUwsIHVzZSB0aGUge0BsaW5rICNhZGRQcmVmZXJlbmNlc0Zyb21SZXNvdXJjZShpbnQpfS4gVGhlCi0gKiByb290IGVsZW1lbnQgc2hvdWxkIGJlIGEge0BsaW5rIFByZWZlcmVuY2VTY3JlZW59LiBTdWJzZXF1ZW50IGVsZW1lbnRzIGNhbiBwb2ludAotICogdG8gYWN0dWFsIHtAbGluayBQcmVmZXJlbmNlfSBzdWJjbGFzc2VzLiBBcyBtZW50aW9uZWQgYWJvdmUsIHN1YnNlcXVlbnQKLSAqIHtAbGluayBQcmVmZXJlbmNlU2NyZWVufSBpbiB0aGUgaGllcmFyY2h5IHdpbGwgcmVzdWx0IGluIHRoZSBzY3JlZW4gYnJlYWsuCi0gKiA8cD4KLSAqIFRvIHNwZWNpZnkgYW4ge0BsaW5rIEludGVudH0gdG8gcXVlcnkge0BsaW5rIEFjdGl2aXR5IEFjdGl2aXRpZXN9IHRoYXQgZWFjaAotICogaGF2ZSBwcmVmZXJlbmNlcywgdXNlIHtAbGluayAjYWRkUHJlZmVyZW5jZXNGcm9tSW50ZW50fS4gRWFjaAotICoge0BsaW5rIEFjdGl2aXR5fSBjYW4gc3BlY2lmeSBtZXRhLWRhdGEgaW4gdGhlIG1hbmlmZXN0ICh2aWEgdGhlIGtleQotICoge0BsaW5rIFByZWZlcmVuY2VNYW5hZ2VyI01FVEFEQVRBX0tFWV9QUkVGRVJFTkNFU30pIHRoYXQgcG9pbnRzIHRvIGFuIFhNTAotICogcmVzb3VyY2UuIFRoZXNlIFhNTCByZXNvdXJjZXMgd2lsbCBiZSBpbmZsYXRlZCBpbnRvIGEgc2luZ2xlIHByZWZlcmVuY2UKLSAqIGhpZXJhcmNoeSBhbmQgc2hvd24gYnkgdGhpcyBhY3Rpdml0eS4KLSAqIDxwPgotICogVG8gc3BlY2lmeSBhbiBvYmplY3QgaGllcmFyY2h5IHJvb3RlZCB3aXRoIHtAbGluayBQcmVmZXJlbmNlU2NyZWVufSwgdXNlCi0gKiB7QGxpbmsgI3NldFByZWZlcmVuY2VTY3JlZW4oUHJlZmVyZW5jZVNjcmVlbil9LgotICogPHA+Ci0gKiBBcyBhIGNvbnZlbmllbmNlLCB0aGlzIGFjdGl2aXR5IGltcGxlbWVudHMgYSBjbGljayBsaXN0ZW5lciBmb3IgYW55Ci0gKiBwcmVmZXJlbmNlIGluIHRoZSBjdXJyZW50IGhpZXJhcmNoeSwgc2VlCi0gKiB7QGxpbmsgI29uUHJlZmVyZW5jZVRyZWVDbGljayhQcmVmZXJlbmNlU2NyZWVuLCBQcmVmZXJlbmNlKX0uCi0gKiAKLSAqIEBzZWUgUHJlZmVyZW5jZQotICogQHNlZSBQcmVmZXJlbmNlU2NyZWVuCisgKiBUaGlzIGlzIHRoZSBiYXNlIGNsYXNzIGZvciBhbiBhY3Rpdml0eSB0byBzaG93IGEgaGllcmFyY2h5IG9mIHByZWZlcmVuY2VzCisgKiB0byB0aGUgdXNlci4gIFByaW9yIHRvIHtAbGluayBhbmRyb2lkLm9zLkJ1aWxkLlZFUlNJT05fQ09ERVMjSE9ORVlDT01CfQorICogdGhpcyBjbGFzcyBvbmx5IGFsbG93ZWQgdGhlIGRpc3BsYXkgb2YgYSBzaW5nbGUgc2V0IG9mIHByZWZlcmVuY2U7IHRoaXMKKyAqIGZ1bmN0aW9uYWxpdHkgc2hvdWxkIG5vdyBiZSBmb3VuZCBpbiB0aGUgbmV3IHtAbGluayBQcmVmZXJlbmNlRnJhZ21lbnR9CisgKiBjbGFzcy4gIElmIHlvdSBhcmUgdXNpbmcgUHJlZmVyZW5jZUFjdGl2aXR5IGluIGl0cyBvbGQgbW9kZSwgdGhlIGRvY3VtZW50YXRpb24KKyAqIHRoZXJlIGFwcGxpZXMgdG8gdGhlIGRlcHJlY2F0ZWQgQVBJcyBoZXJlLgorICoKKyAqIDxwPlRoaXMgYWN0aXZpdHkgc2hvd3Mgb25lIG9yIG1vcmUgaGVhZGVycyBvZiBwcmVmZXJlbmNlcywgZWFjaCBvZiB3aXRoCisgKiBpcyBhc3NvY2lhdGVkIHdpdGggYSB7QGxpbmsgUHJlZmVyZW5jZUZyYWdtZW50fSB0byBkaXNwbGF5IHRoZSBwcmVmZXJlbmNlcworICogb2YgdGhhdCBoZWFkZXIuICBUaGUgYWN0dWFsIGxheW91dCBhbmQgZGlzcGxheSBvZiB0aGVzZSBhc3NvY2lhdGlvbnMgY2FuCisgKiBob3dldmVyIHZhcnk7IGN1cnJlbnRseSB0aGVyZSBhcmUgdHdvIG1ham9yIGFwcHJvYWNoZXMgaXQgbWF5IHRha2U6CisgKgorICogPHVsPgorICogPGxpPk9uIGEgc21hbGwgc2NyZWVuIGl0IG1heSBkaXNwbGF5IG9ubHkgdGhlIGhlYWRlcnMgYXMgYSBzaW5nbGUgbGlzdAorICogd2hlbiBmaXJzdCBsYXVuY2hlZC4gIFNlbGVjdGluZyBvbmUgb2YgdGhlIGhlYWRlciBpdGVtcyB3aWxsIHJlLWxhdW5jaAorICogdGhlIGFjdGl2aXR5IHdpdGggaXQgb25seSBzaG93aW5nIHRoZSBQcmVmZXJlbmNlRnJhZ21lbnQgb2YgdGhhdCBoZWFkZXIuCisgKiA8bGk+T24gYSBsYXJnZSBzY3JlZW4gaW4gbWF5IGRpc3BsYXkgYm90aCB0aGUgaGVhZGVycyBhbmQgY3VycmVudAorICogUHJlZmVyZW5jZUZyYWdtZW50IHRvZ2V0aGVyIGFzIHBhbmVzLiAgU2VsZWN0aW5nIGEgaGVhZGVyIGl0ZW0gc3dpdGNoZXMKKyAqIHRvIHNob3dpbmcgdGhlIGNvcnJlY3QgUHJlZmVyZW5jZUZyYWdtZW50IGZvciB0aGF0IGl0ZW0uCisgKiA8L3VsPgorICoKKyAqIDxwPlN1YmNsYXNzZXMgb2YgUHJlZmVyZW5jZUFjdGl2aXR5IHNob3VsZCBpbXBsZW1lbnQKKyAqIHtAbGluayAjb25CdWlsZEhlYWRlcnN9IHRvIHBvcHVsYXRlIHRoZSBoZWFkZXIgbGlzdCB3aXRoIHRoZSBkZXNpcmVkCisgKiBpdGVtcy4gIERvaW5nIHRoaXMgaW1wbGljaXRseSBzd2l0Y2hlcyB0aGUgY2xhc3MgaW50byBpdHMgbmV3ICJoZWFkZXJzCisgKiArIGZyYWdtZW50cyIgbW9kZSByYXRoZXIgdGhhbiB0aGUgb2xkIHN0eWxlIG9mIGp1c3Qgc2hvd2luZyBhIHNpbmdsZQorICogcHJlZmVyZW5jZXMgbGlzdC4KKyAqCisgKiA8YSBuYW1lPSJTYW1wbGVDb2RlIj48L2E+CisgKiA8aDM+U2FtcGxlIENvZGU8L2gzPgorICoKKyAqIDxwPlRoZSBmb2xsb3dpbmcgc2FtcGxlIGNvZGUgc2hvd3MgYSBzaW1wbGUgcHJlZmVyZW5jZSBhY3Rpdml0eSB0aGF0CisgKiBoYXMgdHdvIGRpZmZlcmVudCBzZXRzIG9mIHByZWZlcmVuY2VzLiAgVGhlIGltcGxlbWVudGF0aW9uLCBjb25zaXN0aW5nCisgKiBvZiB0aGUgYWN0aXZpdHkgaXRzZWxmIGFzIHdlbGwgYXMgaXRzIHR3byBwcmVmZXJlbmNlIGZyYWdtZW50cyBpczo8L3A+CisgKgorICoge0BzYW1wbGUgZGV2ZWxvcG1lbnQvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ByZWZlcmVuY2UvUHJlZmVyZW5jZVdpdGhIZWFkZXJzLmphdmEKKyAqICAgICAgYWN0aXZpdHl9CisgKgorICogPHA+VGhlIHByZWZlcmVuY2VfaGVhZGVycyByZXNvdXJjZSBkZXNjcmliZXMgdGhlIGhlYWRlcnMgdG8gYmUgZGlzcGxheWVkCisgKiBhbmQgdGhlIGZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhlbS4gIEl0IGlzOgorICoKKyAqIHtAc2FtcGxlIGRldmVsb3BtZW50L3NhbXBsZXMvQXBpRGVtb3MvcmVzL3htbC9wcmVmZXJlbmNlX2hlYWRlcnMueG1sIGhlYWRlcnN9CisgKgorICogPHA+VGhlIGZpcnN0IGhlYWRlciBpcyBzaG93biBieSBQcmVmczFGcmFnbWVudCwgd2hpY2ggcG9wdWxhdGVzIGl0c2VsZgorICogZnJvbSB0aGUgZm9sbG93aW5nIFhNTCByZXNvdXJjZTo8L3A+CisgKgorICoge0BzYW1wbGUgZGV2ZWxvcG1lbnQvc2FtcGxlcy9BcGlEZW1vcy9yZXMveG1sL2ZyYWdtZW50ZWRfcHJlZmVyZW5jZXMueG1sIHByZWZlcmVuY2VzfQorICoKKyAqIDxwPk5vdGUgdGhhdCB0aGlzIFhNTCByZXNvdXJjZSBjb250YWlucyBhIHByZWZlcmVuY2Ugc2NyZWVuIGhvbGRpbmcgYW5vdGhlcgorICogZnJhZ21lbnQsIHRoZSBQcmVmczFGcmFnbWVudElubmVyIGltcGxlbWVudGVkIGhlcmUuICBUaGlzIGFsbG93cyB0aGUgdXNlcgorICogdG8gdHJhdmVyc2UgZG93biBhIGhpZXJhcmNoeSBvZiBwcmVmZXJlbmNlczsgcHJlc3NpbmcgYmFjayB3aWxsIHBvcCBlYWNoCisgKiBmcmFnbWVudCBvZmYgdGhlIHN0YWNrIHRvIHJldHVybiB0byB0aGUgcHJldmlvdXMgcHJlZmVyZW5jZXMuCisgKgorICogPHA+U2VlIHtAbGluayBQcmVmZXJlbmNlRnJhZ21lbnR9IGZvciBpbmZvcm1hdGlvbiBvbiBpbXBsZW1lbnRpbmcgdGhlCisgKiBmcmFnbWVudHMgdGhlbXNlbHZlcy4KICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIFByZWZlcmVuY2VBY3Rpdml0eSBleHRlbmRzIExpc3RBY3Rpdml0eSBpbXBsZW1lbnRzCi0gICAgICAgIFByZWZlcmVuY2VNYW5hZ2VyLk9uUHJlZmVyZW5jZVRyZWVDbGlja0xpc3RlbmVyIHsKLSAgICAKKyAgICAgICAgUHJlZmVyZW5jZU1hbmFnZXIuT25QcmVmZXJlbmNlVHJlZUNsaWNrTGlzdGVuZXIsCisgICAgICAgIFByZWZlcmVuY2VGcmFnbWVudC5PblByZWZlcmVuY2VTdGFydEZyYWdtZW50Q2FsbGJhY2sgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiUHJlZmVyZW5jZUFjdGl2aXR5IjsKKwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGRVJFTkNFU19UQUcgPSAiYW5kcm9pZDpwcmVmZXJlbmNlcyI7Ci0gICAgCisKKyAgICAvKioKKyAgICAgKiBXaGVuIHN0YXJ0aW5nIHRoaXMgYWN0aXZpdHksIHRoZSBpbnZva2luZyBJbnRlbnQgY2FuIGNvbnRhaW4gdGhpcyBleHRyYQorICAgICAqIHN0cmluZyB0byBzcGVjaWZ5IHdoaWNoIGZyYWdtZW50IHNob3VsZCBiZSBpbml0aWFsbHkgZGlzcGxheWVkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX1NIT1dfRlJBR01FTlQgPSAiOmFuZHJvaWQ6c2hvd19mcmFnbWVudCI7CisKKyAgICAvKioKKyAgICAgKiBXaGVuIHN0YXJ0aW5nIHRoaXMgYWN0aXZpdHkgYW5kIHVzaW5nIHtAbGluayAjRVhUUkFfU0hPV19GUkFHTUVOVH0sCisgICAgICogdGhpcyBleHRyYSBjYW4gYWxzbyBiZSBzcGVjaWZ5IHRvIHN1cHBseSBhIEJ1bmRsZSBvZiBhcmd1bWVudHMgdG8gcGFzcworICAgICAqIHRvIHRoYXQgZnJhZ21lbnQgd2hlbiBpdCBpcyBpbnN0YW50aWF0ZWQgZHVyaW5nIHRoZSBpbml0aWFsIGNyZWF0aW9uCisgICAgICogb2YgUHJlZmVyZW5jZUFjdGl2aXR5LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX1NIT1dfRlJBR01FTlRfQVJHVU1FTlRTID0gIjphbmRyb2lkOnNob3dfZnJhZ21lbnRfYXJncyI7CisKKyAgICAvKioKKyAgICAgKiBXaGVuIHN0YXJ0aW5nIHRoaXMgYWN0aXZpdHksIHRoZSBpbnZva2luZyBJbnRlbnQgY2FuIGNvbnRhaW4gdGhpcyBleHRyYQorICAgICAqIGJvb2xlYW4gdGhhdCB0aGUgaGVhZGVyIGxpc3Qgc2hvdWxkIG5vdCBiZSBkaXNwbGF5ZWQuICBUaGlzIGlzIG1vc3Qgb2Z0ZW4KKyAgICAgKiB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGgge0BsaW5rICNFWFRSQV9TSE9XX0ZSQUdNRU5UfSB0byBsYXVuY2gKKyAgICAgKiB0aGUgYWN0aXZpdHkgdG8gZGlzcGxheSBhIHNwZWNpZmljIGZyYWdtZW50IHRoYXQgdGhlIHVzZXIgaGFzIG5hdmlnYXRlZAorICAgICAqIHRvLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX05PX0hFQURFUlMgPSAiOmFuZHJvaWQ6bm9faGVhZGVycyI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkFDS19TVEFDS19QUkVGUyA9ICI6YW5kcm9pZDpwcmVmcyI7CisKKyAgICAvLyBleHRyYXMgdGhhdCBhbGxvdyBhbnkgcHJlZmVyZW5jZSBhY3Rpdml0eSB0byBiZSBsYXVuY2hlZCBhcyBwYXJ0IG9mIGEgd2l6YXJkCisKKyAgICAvLyBzaG93IEJhY2sgYW5kIE5leHQgYnV0dG9ucz8gdGFrZXMgYm9vbGVhbiBwYXJhbWV0ZXIKKyAgICAvLyBCYWNrIHdpbGwgdGhlbiByZXR1cm4gUkVTVUxUX0NBTkNFTEVEIGFuZCBOZXh0IFJFU1VMVF9PSworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9QUkVGU19TSE9XX0JVVFRPTl9CQVIgPSAiZXh0cmFfcHJlZnNfc2hvd19idXR0b25fYmFyIjsKKworICAgIC8vIGFkZCBhIFNraXAgYnV0dG9uPworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9QUkVGU19TSE9XX1NLSVAgPSAiZXh0cmFfcHJlZnNfc2hvd19za2lwIjsKKworICAgIC8vIHNwZWNpZnkgY3VzdG9tIHRleHQgZm9yIHRoZSBCYWNrIG9yIE5leHQgYnV0dG9ucywgb3IgY2F1c2UgYSBidXR0b24gdG8gbm90IGFwcGVhcgorICAgIC8vIGF0IGFsbCBieSBzZXR0aW5nIGl0IHRvIG51bGwKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfUFJFRlNfU0VUX05FWFRfVEVYVCA9ICJleHRyYV9wcmVmc19zZXRfbmV4dF90ZXh0IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfUFJFRlNfU0VUX0JBQ0tfVEVYVCA9ICJleHRyYV9wcmVmc19zZXRfYmFja190ZXh0IjsKKworICAgIC8vIC0tLSBTdGF0ZSBmb3IgbmV3IG1vZGUgd2hlbiBzaG93aW5nIGEgbGlzdCBvZiBoZWFkZXJzICsgcHJlZnMgZnJhZ21lbnQKKworICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0PEhlYWRlcj4gbUhlYWRlcnMgPSBuZXcgQXJyYXlMaXN0PEhlYWRlcj4oKTsKKworICAgIHByaXZhdGUgSGVhZGVyQWRhcHRlciBtQWRhcHRlcjsKKworICAgIHByaXZhdGUgVmlldyBtUHJlZnNDb250YWluZXI7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gbVNpbmdsZVBhbmU7CisKKyAgICAvLyAtLS0gU3RhdGUgZm9yIG9sZCBtb2RlIHdoZW4gc2hvd2luZyBhIHNpbmdsZSBwcmVmZXJlbmNlIGxpc3QKKwogICAgIHByaXZhdGUgUHJlZmVyZW5jZU1hbmFnZXIgbVByZWZlcmVuY2VNYW5hZ2VyOwotICAgIAorCiAgICAgcHJpdmF0ZSBCdW5kbGUgbVNhdmVkSW5zdGFuY2VTdGF0ZTsKIAorICAgIC8vIC0tLSBDb21tb24gc3RhdGUKKworICAgIHByaXZhdGUgQnV0dG9uIG1OZXh0QnV0dG9uOworCiAgICAgLyoqCiAgICAgICogVGhlIHN0YXJ0aW5nIHJlcXVlc3QgY29kZSBnaXZlbiBvdXQgdG8gcHJlZmVyZW5jZSBmcmFtZXdvcmsuCiAgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZJUlNUX1JFUVVFU1RfQ09ERSA9IDEwMDsKLSAgICAKKwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfQklORF9QUkVGRVJFTkNFUyA9IDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19CVUlMRF9IRUFERVJTID0gMTsKICAgICBwcml2YXRlIEhhbmRsZXIgbUhhbmRsZXIgPSBuZXcgSGFuZGxlcigpIHsKICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKICAgICAgICAgICAgIHN3aXRjaCAobXNnLndoYXQpIHsKLSAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICBjYXNlIE1TR19CSU5EX1BSRUZFUkVOQ0VTOgogICAgICAgICAgICAgICAgICAgICBiaW5kUHJlZmVyZW5jZXMoKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBNU0dfQlVJTERfSEVBREVSUzoKKyAgICAgICAgICAgICAgICAgICAgb25CdWlsZEhlYWRlcnMobUhlYWRlcnMpOworICAgICAgICAgICAgICAgICAgICBtQWRhcHRlci5ub3RpZnlEYXRhU2V0Q2hhbmdlZCgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH07CiAKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBIZWFkZXJBZGFwdGVyIGV4dGVuZHMgQXJyYXlBZGFwdGVyPEhlYWRlcj4geworICAgICAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBIZWFkZXJWaWV3SG9sZGVyIHsKKyAgICAgICAgICAgIEltYWdlVmlldyBpY29uOworICAgICAgICAgICAgVGV4dFZpZXcgdGl0bGU7CisgICAgICAgICAgICBUZXh0VmlldyBzdW1tYXJ5OworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBMYXlvdXRJbmZsYXRlciBtSW5mbGF0ZXI7CisKKyAgICAgICAgcHVibGljIEhlYWRlckFkYXB0ZXIoQ29udGV4dCBjb250ZXh0LCBMaXN0PEhlYWRlcj4gb2JqZWN0cykgeworICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgMCwgb2JqZWN0cyk7CisgICAgICAgICAgICBtSW5mbGF0ZXIgPSAoTGF5b3V0SW5mbGF0ZXIpY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuTEFZT1VUX0lORkxBVEVSX1NFUlZJQ0UpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBWaWV3IGdldFZpZXcoaW50IHBvc2l0aW9uLCBWaWV3IGNvbnZlcnRWaWV3LCBWaWV3R3JvdXAgcGFyZW50KSB7CisgICAgICAgICAgICBIZWFkZXJWaWV3SG9sZGVyIGhvbGRlcjsKKyAgICAgICAgICAgIFZpZXcgdmlldzsKKworICAgICAgICAgICAgaWYgKGNvbnZlcnRWaWV3ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB2aWV3ID0gbUluZmxhdGVyLmluZmxhdGUoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5sYXlvdXQucHJlZmVyZW5jZV9saXN0X2l0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICBob2xkZXIgPSBuZXcgSGVhZGVyVmlld0hvbGRlcigpOworICAgICAgICAgICAgICAgIGhvbGRlci5pY29uID0gKEltYWdlVmlldykgdmlldy5maW5kVmlld0J5SWQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5pZC5pY29uKTsKKyAgICAgICAgICAgICAgICBob2xkZXIudGl0bGUgPSAoVGV4dFZpZXcpIHZpZXcuZmluZFZpZXdCeUlkKGNvbS5hbmRyb2lkLmludGVybmFsLlIuaWQudGl0bGUpOworICAgICAgICAgICAgICAgIGhvbGRlci5zdW1tYXJ5ID0gKFRleHRWaWV3KSB2aWV3LmZpbmRWaWV3QnlJZChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmlkLnN1bW1hcnkpOworICAgICAgICAgICAgICAgIHZpZXcuc2V0VGFnKGhvbGRlcik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHZpZXcgPSBjb252ZXJ0VmlldzsKKyAgICAgICAgICAgICAgICBob2xkZXIgPSAoSGVhZGVyVmlld0hvbGRlcikgdmlldy5nZXRUYWcoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQWxsIHZpZXcgZmllbGRzIG11c3QgYmUgdXBkYXRlZCBldmVyeSB0aW1lLCBiZWNhdXNlIHRoZSB2aWV3IG1heSBiZSByZWN5Y2xlZCAKKyAgICAgICAgICAgIEhlYWRlciBoZWFkZXIgPSBnZXRJdGVtKHBvc2l0aW9uKTsKKyAgICAgICAgICAgIGlmIChoZWFkZXIuaWNvbiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgaG9sZGVyLmljb24uc2V0SW1hZ2VEcmF3YWJsZShudWxsKTsKKyAgICAgICAgICAgICAgICBob2xkZXIuaWNvbi5zZXRJbWFnZVJlc291cmNlKGhlYWRlci5pY29uUmVzKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaG9sZGVyLmljb24uc2V0SW1hZ2VSZXNvdXJjZSgwKTsKKyAgICAgICAgICAgICAgICBob2xkZXIuaWNvbi5zZXRJbWFnZURyYXdhYmxlKGhlYWRlci5pY29uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGhvbGRlci50aXRsZS5zZXRUZXh0KGhlYWRlci50aXRsZSk7CisgICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkoaGVhZGVyLnN1bW1hcnkpKSB7CisgICAgICAgICAgICAgICAgaG9sZGVyLnN1bW1hcnkuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBob2xkZXIuc3VtbWFyeS5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgICAgICAgICAgaG9sZGVyLnN1bW1hcnkuc2V0VGV4dChoZWFkZXIuc3VtbWFyeSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiB2aWV3OworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVzY3JpcHRpb24gb2YgYSBzaW5nbGUgSGVhZGVyIGl0ZW0gdGhhdCB0aGUgdXNlciBjYW4gc2VsZWN0LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSGVhZGVyIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRpdGxlIG9mIHRoZSBoZWFkZXIgdGhhdCBpcyBzaG93biB0byB0aGUgdXNlci4KKyAgICAgICAgICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjUHJlZmVyZW5jZUhlYWRlcl90aXRsZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIENoYXJTZXF1ZW5jZSB0aXRsZTsKKworICAgICAgICAvKioKKyAgICAgICAgICogT3B0aW9uYWwgc3VtbWFyeSBkZXNjcmliaW5nIHdoYXQgdGhpcyBoZWFkZXIgY29udHJvbHMuCisgICAgICAgICAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI1ByZWZlcmVuY2VIZWFkZXJfc3VtbWFyeQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIENoYXJTZXF1ZW5jZSBzdW1tYXJ5OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBPcHRpb25hbCBpY29uIHJlc291cmNlIHRvIHNob3cgZm9yIHRoaXMgaGVhZGVyLgorICAgICAgICAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNQcmVmZXJlbmNlSGVhZGVyX2ljb24KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBpbnQgaWNvblJlczsKKworICAgICAgICAvKioKKyAgICAgICAgICogT3B0aW9uYWwgaWNvbiBkcmF3YWJsZSB0byBzaG93IGZvciB0aGlzIGhlYWRlci4gIChJZiB0aGlzIGlzIG5vbi1udWxsLAorICAgICAgICAgKiB0aGUgaWNvblJlcyB3aWxsIGJlIGlnbm9yZWQuKQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIERyYXdhYmxlIGljb247CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEZ1bGwgY2xhc3MgbmFtZSBvZiB0aGUgZnJhZ21lbnQgdG8gZGlzcGxheSB3aGVuIHRoaXMgaGVhZGVyIGlzCisgICAgICAgICAqIHNlbGVjdGVkLgorICAgICAgICAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNQcmVmZXJlbmNlSGVhZGVyX2ZyYWdtZW50CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgU3RyaW5nIGZyYWdtZW50OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBPcHRpb25hbCBhcmd1bWVudHMgdG8gc3VwcGx5IHRvIHRoZSBmcmFnbWVudCB3aGVuIGl0IGlzCisgICAgICAgICAqIGluc3RhbnRpYXRlZC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBCdW5kbGUgZnJhZ21lbnRBcmd1bWVudHM7CisgICAgfQorCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgewogICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOwogCiAgICAgICAgIHNldENvbnRlbnRWaWV3KGNvbS5hbmRyb2lkLmludGVybmFsLlIubGF5b3V0LnByZWZlcmVuY2VfbGlzdF9jb250ZW50KTsKLSAgICAgICAgCi0gICAgICAgIG1QcmVmZXJlbmNlTWFuYWdlciA9IG9uQ3JlYXRlUHJlZmVyZW5jZU1hbmFnZXIoKTsKKworICAgICAgICBtUHJlZnNDb250YWluZXIgPSBmaW5kVmlld0J5SWQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5pZC5wcmVmcyk7CisgICAgICAgIGJvb2xlYW4gaGlkaW5nSGVhZGVycyA9IG9uSXNIaWRpbmdIZWFkZXJzKCk7CisgICAgICAgIG1TaW5nbGVQYW5lID0gaGlkaW5nSGVhZGVycyB8fCAhb25Jc011bHRpUGFuZSgpOworICAgICAgICBTdHJpbmcgaW5pdGlhbEZyYWdtZW50ID0gZ2V0SW50ZW50KCkuZ2V0U3RyaW5nRXh0cmEoRVhUUkFfU0hPV19GUkFHTUVOVCk7CisgICAgICAgIEJ1bmRsZSBpbml0aWFsQXJndW1lbnRzID0gZ2V0SW50ZW50KCkuZ2V0QnVuZGxlRXh0cmEoRVhUUkFfU0hPV19GUkFHTUVOVF9BUkdVTUVOVFMpOworCisgICAgICAgIGlmIChpbml0aWFsRnJhZ21lbnQgIT0gbnVsbCAmJiBtU2luZ2xlUGFuZSkgeworICAgICAgICAgICAgLy8gSWYgd2UgYXJlIGp1c3Qgc2hvd2luZyBhIGZyYWdtZW50LCB3ZSB3YW50IHRvIHJ1biBpbgorICAgICAgICAgICAgLy8gbmV3IGZyYWdtZW50IG1vZGUsIGJ1dCBkb24ndCBuZWVkIHRvIGNvbXB1dGUgYW5kIHNob3cKKyAgICAgICAgICAgIC8vIHRoZSBoZWFkZXJzLgorICAgICAgICAgICAgZ2V0TGlzdFZpZXcoKS5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgICAgICAgICBtUHJlZnNDb250YWluZXIuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICAgICAgc3dpdGNoVG9IZWFkZXIoaW5pdGlhbEZyYWdtZW50LCBpbml0aWFsQXJndW1lbnRzKTsKKworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gV2UgbmVlZCB0byB0cnkgdG8gYnVpbGQgdGhlIGhlYWRlcnMuCisgICAgICAgICAgICBvbkJ1aWxkSGVhZGVycyhtSGVhZGVycyk7CisKKyAgICAgICAgICAgIC8vIElmIHRoZXJlIGFyZSBoZWFkZXJzLCB0aGVuIGF0IHRoaXMgcG9pbnQgd2UgbmVlZCB0byBzaG93CisgICAgICAgICAgICAvLyB0aGVtIGFuZCwgZGVwZW5kaW5nIG9uIHRoZSBzY3JlZW4sIHdlIG1heSBhbHNvIHNob3cgaW4tbGluZQorICAgICAgICAgICAgLy8gdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBwcmVmZXJlbmNlIGZyYWdtZW50LgorICAgICAgICAgICAgaWYgKG1IZWFkZXJzLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgICAgICBtQWRhcHRlciA9IG5ldyBIZWFkZXJBZGFwdGVyKHRoaXMsIG1IZWFkZXJzKTsKKyAgICAgICAgICAgICAgICBzZXRMaXN0QWRhcHRlcihtQWRhcHRlcik7CisgICAgICAgICAgICAgICAgaWYgKCFtU2luZ2xlUGFuZSkgeworICAgICAgICAgICAgICAgICAgICBtUHJlZnNDb250YWluZXIuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICAgICAgICAgICAgICBpZiAoaW5pdGlhbEZyYWdtZW50ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEhlYWRlciBoID0gb25HZXRJbml0aWFsSGVhZGVyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsRnJhZ21lbnQgPSBoLmZyYWdtZW50OworICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbEFyZ3VtZW50cyA9IGguZnJhZ21lbnRBcmd1bWVudHM7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoVG9IZWFkZXIoaW5pdGlhbEZyYWdtZW50LCBpbml0aWFsQXJndW1lbnRzKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIElmIHRoZXJlIGFyZSBubyBoZWFkZXJzLCB3ZSBhcmUgaW4gdGhlIG9sZCAianVzdCBzaG93IGEgc2NyZWVuCisgICAgICAgICAgICAvLyBvZiBwcmVmZXJlbmNlcyIgbW9kZS4KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbVByZWZlcmVuY2VNYW5hZ2VyID0gbmV3IFByZWZlcmVuY2VNYW5hZ2VyKHRoaXMsIEZJUlNUX1JFUVVFU1RfQ09ERSk7CisgICAgICAgICAgICAgICAgbVByZWZlcmVuY2VNYW5hZ2VyLnNldE9uUHJlZmVyZW5jZVRyZWVDbGlja0xpc3RlbmVyKHRoaXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKICAgICAgICAgZ2V0TGlzdFZpZXcoKS5zZXRTY3JvbGxCYXJTdHlsZShWaWV3LlNDUk9MTEJBUlNfSU5TSURFX09WRVJMQVkpOworCisgICAgICAgIC8vIHNlZSBpZiB3ZSBzaG91bGQgc2hvdyBCYWNrL05leHQgYnV0dG9ucworICAgICAgICBJbnRlbnQgaW50ZW50ID0gZ2V0SW50ZW50KCk7CisgICAgICAgIGlmIChpbnRlbnQuZ2V0Qm9vbGVhbkV4dHJhKEVYVFJBX1BSRUZTX1NIT1dfQlVUVE9OX0JBUiwgZmFsc2UpKSB7CisKKyAgICAgICAgICAgIGZpbmRWaWV3QnlJZChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmlkLmJ1dHRvbl9iYXIpLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKworICAgICAgICAgICAgQnV0dG9uIGJhY2tCdXR0b24gPSAoQnV0dG9uKWZpbmRWaWV3QnlJZChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmlkLmJhY2tfYnV0dG9uKTsKKyAgICAgICAgICAgIGJhY2tCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG5ldyBPbkNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0UmVzdWx0KFJFU1VMVF9DQU5DRUxFRCk7CisgICAgICAgICAgICAgICAgICAgIGZpbmlzaCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgQnV0dG9uIHNraXBCdXR0b24gPSAoQnV0dG9uKWZpbmRWaWV3QnlJZChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmlkLnNraXBfYnV0dG9uKTsKKyAgICAgICAgICAgIHNraXBCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG5ldyBPbkNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0UmVzdWx0KFJFU1VMVF9PSyk7CisgICAgICAgICAgICAgICAgICAgIGZpbmlzaCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgbU5leHRCdXR0b24gPSAoQnV0dG9uKWZpbmRWaWV3QnlJZChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmlkLm5leHRfYnV0dG9uKTsKKyAgICAgICAgICAgIG1OZXh0QnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihuZXcgT25DbGlja0xpc3RlbmVyKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7CisgICAgICAgICAgICAgICAgICAgIHNldFJlc3VsdChSRVNVTFRfT0spOworICAgICAgICAgICAgICAgICAgICBmaW5pc2goKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgLy8gc2V0IG91ciB2YXJpb3VzIGJ1dHRvbiBwYXJhbWV0ZXJzCisgICAgICAgICAgICBpZiAoaW50ZW50Lmhhc0V4dHJhKEVYVFJBX1BSRUZTX1NFVF9ORVhUX1RFWFQpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGJ1dHRvblRleHQgPSBpbnRlbnQuZ2V0U3RyaW5nRXh0cmEoRVhUUkFfUFJFRlNfU0VUX05FWFRfVEVYVCk7CisgICAgICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KGJ1dHRvblRleHQpKSB7CisgICAgICAgICAgICAgICAgICAgIG1OZXh0QnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1OZXh0QnV0dG9uLnNldFRleHQoYnV0dG9uVGV4dCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGludGVudC5oYXNFeHRyYShFWFRSQV9QUkVGU19TRVRfQkFDS19URVhUKSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBidXR0b25UZXh0ID0gaW50ZW50LmdldFN0cmluZ0V4dHJhKEVYVFJBX1BSRUZTX1NFVF9CQUNLX1RFWFQpOworICAgICAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShidXR0b25UZXh0KSkgeworICAgICAgICAgICAgICAgICAgICBiYWNrQnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGJhY2tCdXR0b24uc2V0VGV4dChidXR0b25UZXh0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaW50ZW50LmdldEJvb2xlYW5FeHRyYShFWFRSQV9QUkVGU19TSE9XX1NLSVAsIGZhbHNlKSkgeworICAgICAgICAgICAgICAgIHNraXBCdXR0b24uc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgYWN0aXZpdHkgaXMgY3VycmVudGx5IHNob3dpbmcgdGhlIGhlYWRlciBsaXN0LgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGhhc0hlYWRlcnMoKSB7CisgICAgICAgIHJldHVybiBnZXRMaXN0VmlldygpLmdldFZpc2liaWxpdHkoKSA9PSBWaWV3LlZJU0lCTEUKKyAgICAgICAgICAgICAgICAmJiBtUHJlZmVyZW5jZU1hbmFnZXIgPT0gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBhY3Rpdml0eSBpcyBzaG93aW5nIG11bHRpcGxlIHBhbmVzIC0tIHRoZSBoZWFkZXJzCisgICAgICogYW5kIGEgcHJlZmVyZW5jZSBmcmFnbWVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc011bHRpUGFuZSgpIHsKKyAgICAgICAgcmV0dXJuIGhhc0hlYWRlcnMoKSAmJiBtUHJlZnNDb250YWluZXIuZ2V0VmlzaWJpbGl0eSgpID09IFZpZXcuVklTSUJMRTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgdG8gZGV0ZXJtaW5lIGlmIHRoZSBhY3Rpdml0eSBzaG91bGQgcnVuIGluIG11bHRpLXBhbmUgbW9kZS4KKyAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIHRydWUgaWYgdGhlIHNjcmVlbiBpcyBsYXJnZQorICAgICAqIGVub3VnaC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBvbklzTXVsdGlQYW5lKCkgeworICAgICAgICBDb25maWd1cmF0aW9uIGNvbmZpZyA9IGdldFJlc291cmNlcygpLmdldENvbmZpZ3VyYXRpb24oKTsKKyAgICAgICAgaWYgKChjb25maWcuc2NyZWVuTGF5b3V0JkNvbmZpZ3VyYXRpb24uU0NSRUVOTEFZT1VUX1NJWkVfTUFTSykKKyAgICAgICAgICAgICAgICA9PSBDb25maWd1cmF0aW9uLlNDUkVFTkxBWU9VVF9TSVpFX1hMQVJHRQorICAgICAgICAgICAgICAgICYmIGNvbmZpZy5vcmllbnRhdGlvbiA9PSBDb25maWd1cmF0aW9uLk9SSUVOVEFUSU9OX0xBTkRTQ0FQRSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxlZCB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgaGVhZGVyIGxpc3Qgc2hvdWxkIGJlIGhpZGRlbi4KKyAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIHRoZQorICAgICAqIHZhbHVlIGdpdmVuIGluIHtAbGluayAjRVhUUkFfTk9fSEVBREVSU30gb3IgZmFsc2UgaWYgaXQgaXMgbm90IHN1cHBsaWVkLgorICAgICAqIFRoaXMgaXMgc2V0IHRvIGZhbHNlLCBmb3IgZXhhbXBsZSwgd2hlbiB0aGUgYWN0aXZpdHkgaXMgYmVpbmcgcmUtbGF1bmNoZWQKKyAgICAgKiB0byBzaG93IGEgcGFydGljdWxhciBwcmVmZXJlbmNlIGFjdGl2aXR5LgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIG9uSXNIaWRpbmdIZWFkZXJzKCkgeworICAgICAgICByZXR1cm4gZ2V0SW50ZW50KCkuZ2V0Qm9vbGVhbkV4dHJhKEVYVFJBX05PX0hFQURFUlMsIGZhbHNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgdG8gZGV0ZXJtaW5lIHRoZSBpbml0aWFsIGhlYWRlciB0byBiZSBzaG93bi4gIFRoZSBkZWZhdWx0CisgICAgICogaW1wbGVtZW50YXRpb24gc2ltcGx5IHJldHVybnMgdGhlIGZyYWdtZW50IG9mIHRoZSBmaXJzdCBoZWFkZXIuICBOb3RlCisgICAgICogdGhhdCB0aGUgcmV0dXJuZWQgSGVhZGVyIG9iamVjdCBkb2VzIG5vdCBhY3R1YWxseSBuZWVkIHRvIGV4aXN0IGluCisgICAgICogeW91ciBoZWFkZXIgbGlzdCAtLSB3aGF0ZXZlciBpdHMgZnJhZ21lbnQgaXMgd2lsbCBzaW1wbHkgYmUgdXNlZCB0bworICAgICAqIHNob3cgZm9yIHRoZSBpbml0aWFsIFVJLgorICAgICAqLworICAgIHB1YmxpYyBIZWFkZXIgb25HZXRJbml0aWFsSGVhZGVyKCkgeworICAgICAgICByZXR1cm4gbUhlYWRlcnMuZ2V0KDApOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxlZCB3aGVuIHRoZSBhY3Rpdml0eSBuZWVkcyBpdHMgbGlzdCBvZiBoZWFkZXJzIGJ1aWxkLiAgQnkKKyAgICAgKiBpbXBsZW1lbnRpbmcgdGhpcyBhbmQgYWRkaW5nIGF0IGxlYXN0IG9uZSBpdGVtIHRvIHRoZSBsaXN0LCB5b3UKKyAgICAgKiB3aWxsIGNhdXNlIHRoZSBhY3Rpdml0eSB0byBydW4gaW4gaXRzIG1vZGVybiBmcmFnbWVudCBtb2RlLiAgTm90ZQorICAgICAqIHRoYXQgdGhpcyBmdW5jdGlvbiBtYXkgbm90IGFsd2F5cyBiZSBjYWxsZWQ7IGZvciBleGFtcGxlLCBpZiB0aGUKKyAgICAgKiBhY3Rpdml0eSBoYXMgYmVlbiBhc2tlZCB0byBkaXNwbGF5IGEgcGFydGljdWxhciBmcmFnbWVudCB3aXRob3V0CisgICAgICogdGhlIGhlYWRlciBsaXN0LCB0aGVyZSBpcyBubyBuZWVkIHRvIGJ1aWxkIHRoZSBoZWFkZXJzLgorICAgICAqCisgICAgICogPHA+VHlwaWNhbCBpbXBsZW1lbnRhdGlvbnMgd2lsbCB1c2Uge0BsaW5rICNsb2FkSGVhZGVyc0Zyb21SZXNvdXJjZX0KKyAgICAgKiB0byBmaWxsIGluIHRoZSBsaXN0IGZyb20gYSByZXNvdXJjZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0YXJnZXQgVGhlIGxpc3QgaW4gd2hpY2ggdG8gcGxhY2UgdGhlIGhlYWRlcnMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25CdWlsZEhlYWRlcnMoTGlzdDxIZWFkZXI+IHRhcmdldCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGwgd2hlbiB5b3UgbmVlZCB0byBjaGFuZ2UgdGhlIGhlYWRlcnMgYmVpbmcgZGlzcGxheWVkLiAgV2lsbCByZXN1bHQKKyAgICAgKiBpbiBvbkJ1aWxkSGVhZGVycygpIGxhdGVyIGJlaW5nIGNhbGxlZCB0byByZXRyaWV2ZSB0aGUgbmV3IGxpc3QuCisgICAgICovCisgICAgcHVibGljIHZvaWQgaW52YWxpZGF0ZUhlYWRlcnMoKSB7CisgICAgICAgIGlmICghbUhhbmRsZXIuaGFzTWVzc2FnZXMoTVNHX0JVSUxEX0hFQURFUlMpKSB7CisgICAgICAgICAgICBtSGFuZGxlci5zZW5kRW1wdHlNZXNzYWdlKE1TR19CVUlMRF9IRUFERVJTKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFBhcnNlIHRoZSBnaXZlbiBYTUwgZmlsZSBhcyBhIGhlYWRlciBkZXNjcmlwdGlvbiwgYWRkaW5nIGVhY2gKKyAgICAgKiBwYXJzZWQgSGVhZGVyIGludG8gdGhlIHRhcmdldCBsaXN0LgorICAgICAqCisgICAgICogQHBhcmFtIHJlc2lkIFRoZSBYTUwgcmVzb3VyY2UgdG8gbG9hZCBhbmQgcGFyc2UuCisgICAgICogQHBhcmFtIHRhcmdldCBUaGUgbGlzdCBpbiB3aGljaCB0aGUgcGFyc2VkIGhlYWRlcnMgc2hvdWxkIGJlIHBsYWNlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBsb2FkSGVhZGVyc0Zyb21SZXNvdXJjZShpbnQgcmVzaWQsIExpc3Q8SGVhZGVyPiB0YXJnZXQpIHsKKyAgICAgICAgWG1sUmVzb3VyY2VQYXJzZXIgcGFyc2VyID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHBhcnNlciA9IGdldFJlc291cmNlcygpLmdldFhtbChyZXNpZCk7CisgICAgICAgICAgICBBdHRyaWJ1dGVTZXQgYXR0cnMgPSBYbWwuYXNBdHRyaWJ1dGVTZXQocGFyc2VyKTsKKworICAgICAgICAgICAgaW50IHR5cGU7CisgICAgICAgICAgICB3aGlsZSAoKHR5cGU9cGFyc2VyLm5leHQoKSkgIT0gWG1sUHVsbFBhcnNlci5FTkRfRE9DVU1FTlQKKyAgICAgICAgICAgICAgICAgICAgJiYgdHlwZSAhPSBYbWxQdWxsUGFyc2VyLlNUQVJUX1RBRykgeworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTdHJpbmcgbm9kZU5hbWUgPSBwYXJzZXIuZ2V0TmFtZSgpOworICAgICAgICAgICAgaWYgKCEicHJlZmVyZW5jZS1oZWFkZXJzIi5lcXVhbHMobm9kZU5hbWUpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAiWE1MIGRvY3VtZW50IG11c3Qgc3RhcnQgd2l0aCA8cHJlZmVyZW5jZS1oZWFkZXJzPiB0YWc7IGZvdW5kIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBub2RlTmFtZSArICIgYXQgIiArIHBhcnNlci5nZXRQb3NpdGlvbkRlc2NyaXB0aW9uKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBCdW5kbGUgY3VyQnVuZGxlID0gbnVsbDsKKworICAgICAgICAgICAgaW50IG91dGVyRGVwdGggPSBwYXJzZXIuZ2V0RGVwdGgoKTsKKyAgICAgICAgICAgIHdoaWxlICgodHlwZT1wYXJzZXIubmV4dCgpKSAhPSBYbWxQdWxsUGFyc2VyLkVORF9ET0NVTUVOVAorICAgICAgICAgICAgICAgICAgICYmICh0eXBlICE9IFhtbFB1bGxQYXJzZXIuRU5EX1RBRyB8fCBwYXJzZXIuZ2V0RGVwdGgoKSA+IG91dGVyRGVwdGgpKSB7CisgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT0gWG1sUHVsbFBhcnNlci5FTkRfVEFHIHx8IHR5cGUgPT0gWG1sUHVsbFBhcnNlci5URVhUKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG5vZGVOYW1lID0gcGFyc2VyLmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgICBpZiAoImhlYWRlciIuZXF1YWxzKG5vZGVOYW1lKSkgeworICAgICAgICAgICAgICAgICAgICBIZWFkZXIgaGVhZGVyID0gbmV3IEhlYWRlcigpOworCisgICAgICAgICAgICAgICAgICAgIFR5cGVkQXJyYXkgc2EgPSBnZXRSZXNvdXJjZXMoKS5vYnRhaW5BdHRyaWJ1dGVzKGF0dHJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLlByZWZlcmVuY2VIZWFkZXIpOworICAgICAgICAgICAgICAgICAgICBoZWFkZXIudGl0bGUgPSBzYS5nZXRUZXh0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLlByZWZlcmVuY2VIZWFkZXJfdGl0bGUpOworICAgICAgICAgICAgICAgICAgICBoZWFkZXIuc3VtbWFyeSA9IHNhLmdldFRleHQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuUHJlZmVyZW5jZUhlYWRlcl9zdW1tYXJ5KTsKKyAgICAgICAgICAgICAgICAgICAgaGVhZGVyLmljb25SZXMgPSBzYS5nZXRSZXNvdXJjZUlkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLlByZWZlcmVuY2VIZWFkZXJfaWNvbiwgMCk7CisgICAgICAgICAgICAgICAgICAgIGhlYWRlci5mcmFnbWVudCA9IHNhLmdldFN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5QcmVmZXJlbmNlSGVhZGVyX2ZyYWdtZW50KTsKKyAgICAgICAgICAgICAgICAgICAgc2EucmVjeWNsZSgpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChjdXJCdW5kbGUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY3VyQnVuZGxlID0gbmV3IEJ1bmRsZSgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGdldFJlc291cmNlcygpLnBhcnNlQnVuZGxlRXh0cmFzKHBhcnNlciwgY3VyQnVuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGN1ckJ1bmRsZS5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXIuZnJhZ21lbnRBcmd1bWVudHMgPSBjdXJCdW5kbGU7CisgICAgICAgICAgICAgICAgICAgICAgICBjdXJCdW5kbGUgPSBudWxsOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LmFkZChoZWFkZXIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIFhtbFV0aWxzLnNraXBDdXJyZW50VGFnKHBhcnNlcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgIH0gY2F0Y2ggKFhtbFB1bGxQYXJzZXJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkVycm9yIHBhcnNpbmcgaGVhZGVycyIsIGUpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiRXJyb3IgcGFyc2luZyBoZWFkZXJzIiwgZSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAocGFyc2VyICE9IG51bGwpIHBhcnNlci5jbG9zZSgpOworICAgICAgICB9CisKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBvblN0b3AoKSB7CiAgICAgICAgIHN1cGVyLm9uU3RvcCgpOwotICAgICAgICAKLSAgICAgICAgbVByZWZlcmVuY2VNYW5hZ2VyLmRpc3BhdGNoQWN0aXZpdHlTdG9wKCk7CisKKyAgICAgICAgaWYgKG1QcmVmZXJlbmNlTWFuYWdlciAhPSBudWxsKSB7CisgICAgICAgICAgICBtUHJlZmVyZW5jZU1hbmFnZXIuZGlzcGF0Y2hBY3Rpdml0eVN0b3AoKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIG9uRGVzdHJveSgpIHsKICAgICAgICAgc3VwZXIub25EZXN0cm95KCk7Ci0gICAgICAgIAotICAgICAgICBtUHJlZmVyZW5jZU1hbmFnZXIuZGlzcGF0Y2hBY3Rpdml0eURlc3Ryb3koKTsKKworICAgICAgICBpZiAobVByZWZlcmVuY2VNYW5hZ2VyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1QcmVmZXJlbmNlTWFuYWdlci5kaXNwYXRjaEFjdGl2aXR5RGVzdHJveSgpOworICAgICAgICB9CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgb25TYXZlSW5zdGFuY2VTdGF0ZShCdW5kbGUgb3V0U3RhdGUpIHsKICAgICAgICAgc3VwZXIub25TYXZlSW5zdGFuY2VTdGF0ZShvdXRTdGF0ZSk7CiAKLSAgICAgICAgZmluYWwgUHJlZmVyZW5jZVNjcmVlbiBwcmVmZXJlbmNlU2NyZWVuID0gZ2V0UHJlZmVyZW5jZVNjcmVlbigpOwotICAgICAgICBpZiAocHJlZmVyZW5jZVNjcmVlbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBCdW5kbGUgY29udGFpbmVyID0gbmV3IEJ1bmRsZSgpOwotICAgICAgICAgICAgcHJlZmVyZW5jZVNjcmVlbi5zYXZlSGllcmFyY2h5U3RhdGUoY29udGFpbmVyKTsKLSAgICAgICAgICAgIG91dFN0YXRlLnB1dEJ1bmRsZShQUkVGRVJFTkNFU19UQUcsIGNvbnRhaW5lcik7CisgICAgICAgIGlmIChtUHJlZmVyZW5jZU1hbmFnZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgZmluYWwgUHJlZmVyZW5jZVNjcmVlbiBwcmVmZXJlbmNlU2NyZWVuID0gZ2V0UHJlZmVyZW5jZVNjcmVlbigpOworICAgICAgICAgICAgaWYgKHByZWZlcmVuY2VTY3JlZW4gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIEJ1bmRsZSBjb250YWluZXIgPSBuZXcgQnVuZGxlKCk7CisgICAgICAgICAgICAgICAgcHJlZmVyZW5jZVNjcmVlbi5zYXZlSGllcmFyY2h5U3RhdGUoY29udGFpbmVyKTsKKyAgICAgICAgICAgICAgICBvdXRTdGF0ZS5wdXRCdW5kbGUoUFJFRkVSRU5DRVNfVEFHLCBjb250YWluZXIpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgb25SZXN0b3JlSW5zdGFuY2VTdGF0ZShCdW5kbGUgc3RhdGUpIHsKLSAgICAgICAgQnVuZGxlIGNvbnRhaW5lciA9IHN0YXRlLmdldEJ1bmRsZShQUkVGRVJFTkNFU19UQUcpOwotICAgICAgICBpZiAoY29udGFpbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZpbmFsIFByZWZlcmVuY2VTY3JlZW4gcHJlZmVyZW5jZVNjcmVlbiA9IGdldFByZWZlcmVuY2VTY3JlZW4oKTsKLSAgICAgICAgICAgIGlmIChwcmVmZXJlbmNlU2NyZWVuICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBwcmVmZXJlbmNlU2NyZWVuLnJlc3RvcmVIaWVyYXJjaHlTdGF0ZShjb250YWluZXIpOwotICAgICAgICAgICAgICAgIG1TYXZlZEluc3RhbmNlU3RhdGUgPSBzdGF0ZTsKLSAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGlmIChtUHJlZmVyZW5jZU1hbmFnZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgQnVuZGxlIGNvbnRhaW5lciA9IHN0YXRlLmdldEJ1bmRsZShQUkVGRVJFTkNFU19UQUcpOworICAgICAgICAgICAgaWYgKGNvbnRhaW5lciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZmluYWwgUHJlZmVyZW5jZVNjcmVlbiBwcmVmZXJlbmNlU2NyZWVuID0gZ2V0UHJlZmVyZW5jZVNjcmVlbigpOworICAgICAgICAgICAgICAgIGlmIChwcmVmZXJlbmNlU2NyZWVuICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJlZmVyZW5jZVNjcmVlbi5yZXN0b3JlSGllcmFyY2h5U3RhdGUoY29udGFpbmVyKTsKKyAgICAgICAgICAgICAgICAgICAgbVNhdmVkSW5zdGFuY2VTdGF0ZSA9IHN0YXRlOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTE1NiwxNCArNjAwLDg1IEBACiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgb25BY3Rpdml0eVJlc3VsdChpbnQgcmVxdWVzdENvZGUsIGludCByZXN1bHRDb2RlLCBJbnRlbnQgZGF0YSkgewogICAgICAgICBzdXBlci5vbkFjdGl2aXR5UmVzdWx0KHJlcXVlc3RDb2RlLCByZXN1bHRDb2RlLCBkYXRhKTsKLSAgICAgICAgCi0gICAgICAgIG1QcmVmZXJlbmNlTWFuYWdlci5kaXNwYXRjaEFjdGl2aXR5UmVzdWx0KHJlcXVlc3RDb2RlLCByZXN1bHRDb2RlLCBkYXRhKTsKKworICAgICAgICBpZiAobVByZWZlcmVuY2VNYW5hZ2VyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1QcmVmZXJlbmNlTWFuYWdlci5kaXNwYXRjaEFjdGl2aXR5UmVzdWx0KHJlcXVlc3RDb2RlLCByZXN1bHRDb2RlLCBkYXRhKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIG9uQ29udGVudENoYW5nZWQoKSB7CiAgICAgICAgIHN1cGVyLm9uQ29udGVudENoYW5nZWQoKTsKLSAgICAgICAgcG9zdEJpbmRQcmVmZXJlbmNlcygpOworCisgICAgICAgIGlmIChtUHJlZmVyZW5jZU1hbmFnZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgcG9zdEJpbmRQcmVmZXJlbmNlcygpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25MaXN0SXRlbUNsaWNrKExpc3RWaWV3IGwsIFZpZXcgdiwgaW50IHBvc2l0aW9uLCBsb25nIGlkKSB7CisgICAgICAgIHN1cGVyLm9uTGlzdEl0ZW1DbGljayhsLCB2LCBwb3NpdGlvbiwgaWQpOworCisgICAgICAgIGlmIChtQWRhcHRlciAhPSBudWxsKSB7CisgICAgICAgICAgICBvbkhlYWRlckNsaWNrKG1IZWFkZXJzLmdldChwb3NpdGlvbiksIHBvc2l0aW9uKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxlZCB3aGVuIHRoZSB1c2VyIHNlbGVjdHMgYW4gaXRlbSBpbiB0aGUgaGVhZGVyIGxpc3QuICBUaGUgZGVmYXVsdAorICAgICAqIGltcGxlbWVudGF0aW9uIHdpbGwgY2FsbCBlaXRoZXIge0BsaW5rICNzdGFydFdpdGhGcmFnbWVudChTdHJpbmcsIEJ1bmRsZSl9CisgICAgICogb3Ige0BsaW5rICNzd2l0Y2hUb0hlYWRlcihTdHJpbmcsIEJ1bmRsZSl9IGFzIGFwcHJvcHJpYXRlLgorICAgICAqCisgICAgICogQHBhcmFtIGhlYWRlciBUaGUgaGVhZGVyIHRoYXQgd2FzIHNlbGVjdGVkLgorICAgICAqIEBwYXJhbSBwb3NpdGlvbiBUaGUgaGVhZGVyJ3MgcG9zaXRpb24gaW4gdGhlIGxpc3QuCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25IZWFkZXJDbGljayhIZWFkZXIgaGVhZGVyLCBpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgaWYgKG1TaW5nbGVQYW5lKSB7CisgICAgICAgICAgICBzdGFydFdpdGhGcmFnbWVudChoZWFkZXIuZnJhZ21lbnQsIGhlYWRlci5mcmFnbWVudEFyZ3VtZW50cyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzd2l0Y2hUb0hlYWRlcihoZWFkZXIuZnJhZ21lbnQsIGhlYWRlci5mcmFnbWVudEFyZ3VtZW50cyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdGFydCBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGFjdGl2aXR5LCBzaG93aW5nIG9ubHkgdGhlIGdpdmVuCisgICAgICogcHJlZmVyZW5jZSBmcmFnbWVudC4gIFdoZW4gbGF1bmNoZWQgaW4gdGhpcyBtb2RlLCB0aGUgaGVhZGVyIGxpc3QKKyAgICAgKiB3aWxsIGJlIGhpZGRlbiBhbmQgdGhlIGdpdmVuIHByZWZlcmVuY2UgZnJhZ21lbnQgd2lsbCBiZSBpbnN0YW50aWF0ZWQKKyAgICAgKiBhbmQgZmlsbCB0aGUgZW50aXJlIGFjdGl2aXR5LgorICAgICAqCisgICAgICogQHBhcmFtIGZyYWdtZW50TmFtZSBUaGUgbmFtZSBvZiB0aGUgZnJhZ21lbnQgdG8gZGlzcGxheS4KKyAgICAgKiBAcGFyYW0gYXJncyBPcHRpb25hbCBhcmd1bWVudHMgdG8gc3VwcGx5IHRvIHRoZSBmcmFnbWVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdGFydFdpdGhGcmFnbWVudChTdHJpbmcgZnJhZ21lbnROYW1lLCBCdW5kbGUgYXJncykgeworICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChJbnRlbnQuQUNUSU9OX01BSU4pOworICAgICAgICBpbnRlbnQuc2V0Q2xhc3ModGhpcywgZ2V0Q2xhc3MoKSk7CisgICAgICAgIGludGVudC5wdXRFeHRyYShFWFRSQV9TSE9XX0ZSQUdNRU5ULCBmcmFnbWVudE5hbWUpOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoRVhUUkFfU0hPV19GUkFHTUVOVF9BUkdVTUVOVFMsIGFyZ3MpOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoRVhUUkFfTk9fSEVBREVSUywgdHJ1ZSk7CisgICAgICAgIHN0YXJ0QWN0aXZpdHkoaW50ZW50KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGVuIGluIHR3by1wYW5lIG1vZGUsIHN3aXRjaCB0aGUgZnJhZ21lbnQgcGFuZSB0byBzaG93IHRoZSBnaXZlbgorICAgICAqIHByZWZlcmVuY2UgZnJhZ21lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZnJhZ21lbnROYW1lIFRoZSBuYW1lIG9mIHRoZSBmcmFnbWVudCB0byBkaXNwbGF5LgorICAgICAqIEBwYXJhbSBhcmdzIE9wdGlvbmFsIGFyZ3VtZW50cyB0byBzdXBwbHkgdG8gdGhlIGZyYWdtZW50LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN3aXRjaFRvSGVhZGVyKFN0cmluZyBmcmFnbWVudE5hbWUsIEJ1bmRsZSBhcmdzKSB7CisgICAgICAgIGdldEZyYWdtZW50TWFuYWdlcigpLnBvcEJhY2tTdGFjayhCQUNLX1NUQUNLX1BSRUZTLCBQT1BfQkFDS19TVEFDS19JTkNMVVNJVkUpOworCisgICAgICAgIEZyYWdtZW50IGYgPSBGcmFnbWVudC5pbnN0YW50aWF0ZSh0aGlzLCBmcmFnbWVudE5hbWUsIGFyZ3MpOworICAgICAgICBnZXRGcmFnbWVudE1hbmFnZXIoKS5vcGVuVHJhbnNhY3Rpb24oKS5yZXBsYWNlKAorICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuaWQucHJlZnMsIGYpLmNvbW1pdCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIG9uUHJlZmVyZW5jZVN0YXJ0RnJhZ21lbnQoUHJlZmVyZW5jZUZyYWdtZW50IGNhbGxlciwgUHJlZmVyZW5jZSBwcmVmKSB7CisgICAgICAgIEZyYWdtZW50IGYgPSBGcmFnbWVudC5pbnN0YW50aWF0ZSh0aGlzLCBwcmVmLmdldEZyYWdtZW50KCksIHByZWYuZ2V0RXh0cmFzKCkpOworICAgICAgICBnZXRGcmFnbWVudE1hbmFnZXIoKS5vcGVuVHJhbnNhY3Rpb24oKS5yZXBsYWNlKGNvbS5hbmRyb2lkLmludGVybmFsLlIuaWQucHJlZnMsIGYpCisgICAgICAgICAgICAgICAgLmFkZFRvQmFja1N0YWNrKEJBQ0tfU1RBQ0tfUFJFRlMpLmNvbW1pdCgpOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKICAgICAvKioKQEAgLTE3Niw3ICs2OTEsNyBAQAogICAgICAgICBpZiAobUhhbmRsZXIuaGFzTWVzc2FnZXMoTVNHX0JJTkRfUFJFRkVSRU5DRVMpKSByZXR1cm47CiAgICAgICAgIG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoTVNHX0JJTkRfUFJFRkVSRU5DRVMpLnNlbmRUb1RhcmdldCgpOwogICAgIH0KLSAgICAKKwogICAgIHByaXZhdGUgdm9pZCBiaW5kUHJlZmVyZW5jZXMoKSB7CiAgICAgICAgIGZpbmFsIFByZWZlcmVuY2VTY3JlZW4gcHJlZmVyZW5jZVNjcmVlbiA9IGdldFByZWZlcmVuY2VTY3JlZW4oKTsKICAgICAgICAgaWYgKHByZWZlcmVuY2VTY3JlZW4gIT0gbnVsbCkgewpAQCAtMTg3LDM4ICs3MDIsNDEgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSB7QGxpbmsgUHJlZmVyZW5jZU1hbmFnZXJ9LgotICAgICAqIAotICAgICAqIEByZXR1cm4gVGhlIHtAbGluayBQcmVmZXJlbmNlTWFuYWdlcn0gdXNlZCBieSB0aGlzIGFjdGl2aXR5LgotICAgICAqLwotICAgIHByaXZhdGUgUHJlZmVyZW5jZU1hbmFnZXIgb25DcmVhdGVQcmVmZXJlbmNlTWFuYWdlcigpIHsKLSAgICAgICAgUHJlZmVyZW5jZU1hbmFnZXIgcHJlZmVyZW5jZU1hbmFnZXIgPSBuZXcgUHJlZmVyZW5jZU1hbmFnZXIodGhpcywgRklSU1RfUkVRVUVTVF9DT0RFKTsKLSAgICAgICAgcHJlZmVyZW5jZU1hbmFnZXIuc2V0T25QcmVmZXJlbmNlVHJlZUNsaWNrTGlzdGVuZXIodGhpcyk7Ci0gICAgICAgIHJldHVybiBwcmVmZXJlbmNlTWFuYWdlcjsKLSAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSB7QGxpbmsgUHJlZmVyZW5jZU1hbmFnZXJ9IHVzZWQgYnkgdGhpcyBhY3Rpdml0eS4KICAgICAgKiBAcmV0dXJuIFRoZSB7QGxpbmsgUHJlZmVyZW5jZU1hbmFnZXJ9LgorICAgICAqCisgICAgICogQGRlcHJlY2F0ZWQgVGhpcyBmdW5jdGlvbiBpcyBub3QgcmVsZXZhbnQgZm9yIGEgbW9kZXJuIGZyYWdtZW50LWJhc2VkCisgICAgICogUHJlZmVyZW5jZUFjdGl2aXR5LgogICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIFByZWZlcmVuY2VNYW5hZ2VyIGdldFByZWZlcmVuY2VNYW5hZ2VyKCkgewogICAgICAgICByZXR1cm4gbVByZWZlcmVuY2VNYW5hZ2VyOwogICAgIH0KLSAgICAKKwogICAgIHByaXZhdGUgdm9pZCByZXF1aXJlUHJlZmVyZW5jZU1hbmFnZXIoKSB7CiAgICAgICAgIGlmIChtUHJlZmVyZW5jZU1hbmFnZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlRoaXMgc2hvdWxkIGJlIGNhbGxlZCBhZnRlciBzdXBlci5vbkNyZWF0ZS4iKTsKKyAgICAgICAgICAgIGlmIChtQWRhcHRlciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlRoaXMgc2hvdWxkIGJlIGNhbGxlZCBhZnRlciBzdXBlci5vbkNyZWF0ZS4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiTW9kZXJuIHR3by1wYW5lIFByZWZlcmVuY2VBY3Rpdml0eSByZXF1aXJlcyB1c2Ugb2YgYSBQcmVmZXJlbmNlRnJhZ21lbnQiKTsKICAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgogICAgICAqIFNldHMgdGhlIHJvb3Qgb2YgdGhlIHByZWZlcmVuY2UgaGllcmFyY2h5IHRoYXQgdGhpcyBhY3Rpdml0eSBpcyBzaG93aW5nLgotICAgICAqIAorICAgICAqCiAgICAgICogQHBhcmFtIHByZWZlcmVuY2VTY3JlZW4gVGhlIHJvb3Qge0BsaW5rIFByZWZlcmVuY2VTY3JlZW59IG9mIHRoZSBwcmVmZXJlbmNlIGhpZXJhcmNoeS4KKyAgICAgKgorICAgICAqIEBkZXByZWNhdGVkIFRoaXMgZnVuY3Rpb24gaXMgbm90IHJlbGV2YW50IGZvciBhIG1vZGVybiBmcmFnbWVudC1iYXNlZAorICAgICAqIFByZWZlcmVuY2VBY3Rpdml0eS4KICAgICAgKi8KKyAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyB2b2lkIHNldFByZWZlcmVuY2VTY3JlZW4oUHJlZmVyZW5jZVNjcmVlbiBwcmVmZXJlbmNlU2NyZWVuKSB7CisgICAgICAgIHJlcXVpcmVQcmVmZXJlbmNlTWFuYWdlcigpOworCiAgICAgICAgIGlmIChtUHJlZmVyZW5jZU1hbmFnZXIuc2V0UHJlZmVyZW5jZXMocHJlZmVyZW5jZVNjcmVlbikgJiYgcHJlZmVyZW5jZVNjcmVlbiAhPSBudWxsKSB7CiAgICAgICAgICAgICBwb3N0QmluZFByZWZlcmVuY2VzKCk7CiAgICAgICAgICAgICBDaGFyU2VxdWVuY2UgdGl0bGUgPSBnZXRQcmVmZXJlbmNlU2NyZWVuKCkuZ2V0VGl0bGUoKTsKQEAgLTIyOCw2MSArNzQ2LDg0IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSByb290IG9mIHRoZSBwcmVmZXJlbmNlIGhpZXJhcmNoeSB0aGF0IHRoaXMgYWN0aXZpdHkgaXMgc2hvd2luZy4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEByZXR1cm4gVGhlIHtAbGluayBQcmVmZXJlbmNlU2NyZWVufSB0aGF0IGlzIHRoZSByb290IG9mIHRoZSBwcmVmZXJlbmNlCiAgICAgICogICAgICAgICBoaWVyYXJjaHkuCisgICAgICoKKyAgICAgKiBAZGVwcmVjYXRlZCBUaGlzIGZ1bmN0aW9uIGlzIG5vdCByZWxldmFudCBmb3IgYSBtb2Rlcm4gZnJhZ21lbnQtYmFzZWQKKyAgICAgKiBQcmVmZXJlbmNlQWN0aXZpdHkuCiAgICAgICovCisgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgUHJlZmVyZW5jZVNjcmVlbiBnZXRQcmVmZXJlbmNlU2NyZWVuKCkgewotICAgICAgICByZXR1cm4gbVByZWZlcmVuY2VNYW5hZ2VyLmdldFByZWZlcmVuY2VTY3JlZW4oKTsKKyAgICAgICAgaWYgKG1QcmVmZXJlbmNlTWFuYWdlciAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbVByZWZlcmVuY2VNYW5hZ2VyLmdldFByZWZlcmVuY2VTY3JlZW4oKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBBZGRzIHByZWZlcmVuY2VzIGZyb20gYWN0aXZpdGllcyB0aGF0IG1hdGNoIHRoZSBnaXZlbiB7QGxpbmsgSW50ZW50fS4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEBwYXJhbSBpbnRlbnQgVGhlIHtAbGluayBJbnRlbnR9IHRvIHF1ZXJ5IGFjdGl2aXRpZXMuCisgICAgICoKKyAgICAgKiBAZGVwcmVjYXRlZCBUaGlzIGZ1bmN0aW9uIGlzIG5vdCByZWxldmFudCBmb3IgYSBtb2Rlcm4gZnJhZ21lbnQtYmFzZWQKKyAgICAgKiBQcmVmZXJlbmNlQWN0aXZpdHkuCiAgICAgICovCisgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgdm9pZCBhZGRQcmVmZXJlbmNlc0Zyb21JbnRlbnQoSW50ZW50IGludGVudCkgewogICAgICAgICByZXF1aXJlUHJlZmVyZW5jZU1hbmFnZXIoKTsKLSAgICAgICAgCisKICAgICAgICAgc2V0UHJlZmVyZW5jZVNjcmVlbihtUHJlZmVyZW5jZU1hbmFnZXIuaW5mbGF0ZUZyb21JbnRlbnQoaW50ZW50LCBnZXRQcmVmZXJlbmNlU2NyZWVuKCkpKTsKICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBJbmZsYXRlcyB0aGUgZ2l2ZW4gWE1MIHJlc291cmNlIGFuZCBhZGRzIHRoZSBwcmVmZXJlbmNlIGhpZXJhcmNoeSB0byB0aGUgY3VycmVudAogICAgICAqIHByZWZlcmVuY2UgaGllcmFyY2h5LgotICAgICAqIAorICAgICAqCiAgICAgICogQHBhcmFtIHByZWZlcmVuY2VzUmVzSWQgVGhlIFhNTCByZXNvdXJjZSBJRCB0byBpbmZsYXRlLgorICAgICAqCisgICAgICogQGRlcHJlY2F0ZWQgVGhpcyBmdW5jdGlvbiBpcyBub3QgcmVsZXZhbnQgZm9yIGEgbW9kZXJuIGZyYWdtZW50LWJhc2VkCisgICAgICogUHJlZmVyZW5jZUFjdGl2aXR5LgogICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIHZvaWQgYWRkUHJlZmVyZW5jZXNGcm9tUmVzb3VyY2UoaW50IHByZWZlcmVuY2VzUmVzSWQpIHsKICAgICAgICAgcmVxdWlyZVByZWZlcmVuY2VNYW5hZ2VyKCk7Ci0gICAgICAgIAorCiAgICAgICAgIHNldFByZWZlcmVuY2VTY3JlZW4obVByZWZlcmVuY2VNYW5hZ2VyLmluZmxhdGVGcm9tUmVzb3VyY2UodGhpcywgcHJlZmVyZW5jZXNSZXNJZCwKICAgICAgICAgICAgICAgICBnZXRQcmVmZXJlbmNlU2NyZWVuKCkpKTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICoKKyAgICAgKiBAZGVwcmVjYXRlZCBUaGlzIGZ1bmN0aW9uIGlzIG5vdCByZWxldmFudCBmb3IgYSBtb2Rlcm4gZnJhZ21lbnQtYmFzZWQKKyAgICAgKiBQcmVmZXJlbmNlQWN0aXZpdHkuCiAgICAgICovCisgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgYm9vbGVhbiBvblByZWZlcmVuY2VUcmVlQ2xpY2soUHJlZmVyZW5jZVNjcmVlbiBwcmVmZXJlbmNlU2NyZWVuLCBQcmVmZXJlbmNlIHByZWZlcmVuY2UpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIEZpbmRzIGEge0BsaW5rIFByZWZlcmVuY2V9IGJhc2VkIG9uIGl0cyBrZXkuCi0gICAgICogCisgICAgICoKICAgICAgKiBAcGFyYW0ga2V5IFRoZSBrZXkgb2YgdGhlIHByZWZlcmVuY2UgdG8gcmV0cmlldmUuCiAgICAgICogQHJldHVybiBUaGUge0BsaW5rIFByZWZlcmVuY2V9IHdpdGggdGhlIGtleSwgb3IgbnVsbC4KICAgICAgKiBAc2VlIFByZWZlcmVuY2VHcm91cCNmaW5kUHJlZmVyZW5jZShDaGFyU2VxdWVuY2UpCisgICAgICoKKyAgICAgKiBAZGVwcmVjYXRlZCBUaGlzIGZ1bmN0aW9uIGlzIG5vdCByZWxldmFudCBmb3IgYSBtb2Rlcm4gZnJhZ21lbnQtYmFzZWQKKyAgICAgKiBQcmVmZXJlbmNlQWN0aXZpdHkuCiAgICAgICovCisgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgUHJlZmVyZW5jZSBmaW5kUHJlZmVyZW5jZShDaGFyU2VxdWVuY2Uga2V5KSB7Ci0gICAgICAgIAorCiAgICAgICAgIGlmIChtUHJlZmVyZW5jZU1hbmFnZXIgPT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIH0KLSAgICAgICAgCisKICAgICAgICAgcmV0dXJuIG1QcmVmZXJlbmNlTWFuYWdlci5maW5kUHJlZmVyZW5jZShrZXkpOwogICAgIH0KIApAQCAtMjkyLDUgKzgzMywxNCBAQAogICAgICAgICAgICAgbVByZWZlcmVuY2VNYW5hZ2VyLmRpc3BhdGNoTmV3SW50ZW50KGludGVudCk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKKyAgICAvLyBnaXZlIHN1YmNsYXNzZXMgYWNjZXNzIHRvIHRoZSBOZXh0IGJ1dHRvbgorICAgIC8qKiBAaGlkZSAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGhhc05leHRCdXR0b24oKSB7CisgICAgICAgIHJldHVybiBtTmV4dEJ1dHRvbiAhPSBudWxsOworICAgIH0KKyAgICAvKiogQGhpZGUgKi8KKyAgICBwcm90ZWN0ZWQgQnV0dG9uIGdldE5leHRCdXR0b24oKSB7CisgICAgICAgIHJldHVybiBtTmV4dEJ1dHRvbjsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9wcmVmZXJlbmNlL1ByZWZlcmVuY2VGcmFnbWVudC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcHJlZmVyZW5jZS9QcmVmZXJlbmNlRnJhZ21lbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjVkZmZlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvcHJlZmVyZW5jZS9QcmVmZXJlbmNlRnJhZ21lbnQuamF2YQpAQCAtMCwwICsxLDM0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5wcmVmZXJlbmNlOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5hcHAuRnJhZ21lbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuU2hhcmVkUHJlZmVyZW5jZXM7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaXN0VmlldzsKKworLyoqCisgKiBTaG93cyBhIGhpZXJhcmNoeSBvZiB7QGxpbmsgUHJlZmVyZW5jZX0gb2JqZWN0cyBhcworICogbGlzdHMuIFRoZXNlIHByZWZlcmVuY2VzIHdpbGwKKyAqIGF1dG9tYXRpY2FsbHkgc2F2ZSB0byB7QGxpbmsgU2hhcmVkUHJlZmVyZW5jZXN9IGFzIHRoZSB1c2VyIGludGVyYWN0cyB3aXRoCisgKiB0aGVtLiBUbyByZXRyaWV2ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgU2hhcmVkUHJlZmVyZW5jZXN9IHRoYXQgdGhlCisgKiBwcmVmZXJlbmNlIGhpZXJhcmNoeSBpbiB0aGlzIGZyYWdtZW50IHdpbGwgdXNlLCBjYWxsCisgKiB7QGxpbmsgUHJlZmVyZW5jZU1hbmFnZXIjZ2V0RGVmYXVsdFNoYXJlZFByZWZlcmVuY2VzKGFuZHJvaWQuY29udGVudC5Db250ZXh0KX0KKyAqIHdpdGggYSBjb250ZXh0IGluIHRoZSBzYW1lIHBhY2thZ2UgYXMgdGhpcyBmcmFnbWVudC4KKyAqIDxwPgorICogRnVydGhlcm1vcmUsIHRoZSBwcmVmZXJlbmNlcyBzaG93biB3aWxsIGZvbGxvdyB0aGUgdmlzdWFsIHN0eWxlIG9mIHN5c3RlbQorICogcHJlZmVyZW5jZXMuIEl0IGlzIGVhc3kgdG8gY3JlYXRlIGEgaGllcmFyY2h5IG9mIHByZWZlcmVuY2VzICh0aGF0IGNhbiBiZQorICogc2hvd24gb24gbXVsdGlwbGUgc2NyZWVucykgdmlhIFhNTC4gRm9yIHRoZXNlIHJlYXNvbnMsIGl0IGlzIHJlY29tbWVuZGVkIHRvCisgKiB1c2UgdGhpcyBmcmFnbWVudCAoYXMgYSBzdXBlcmNsYXNzKSB0byBkZWFsIHdpdGggcHJlZmVyZW5jZXMgaW4gYXBwbGljYXRpb25zLgorICogPHA+CisgKiBBIHtAbGluayBQcmVmZXJlbmNlU2NyZWVufSBvYmplY3Qgc2hvdWxkIGJlIGF0IHRoZSB0b3Agb2YgdGhlIHByZWZlcmVuY2UKKyAqIGhpZXJhcmNoeS4gRnVydGhlcm1vcmUsIHN1YnNlcXVlbnQge0BsaW5rIFByZWZlcmVuY2VTY3JlZW59IGluIHRoZSBoaWVyYXJjaHkKKyAqIGRlbm90ZSBhIHNjcmVlbiBicmVhay0tdGhhdCBpcyB0aGUgcHJlZmVyZW5jZXMgY29udGFpbmVkIHdpdGhpbiBzdWJzZXF1ZW50CisgKiB7QGxpbmsgUHJlZmVyZW5jZVNjcmVlbn0gc2hvdWxkIGJlIHNob3duIG9uIGFub3RoZXIgc2NyZWVuLiBUaGUgcHJlZmVyZW5jZQorICogZnJhbWV3b3JrIGhhbmRsZXMgc2hvd2luZyB0aGVzZSBvdGhlciBzY3JlZW5zIGZyb20gdGhlIHByZWZlcmVuY2UgaGllcmFyY2h5LgorICogPHA+CisgKiBUaGUgcHJlZmVyZW5jZSBoaWVyYXJjaHkgY2FuIGJlIGZvcm1lZCBpbiBtdWx0aXBsZSB3YXlzOgorICogPGxpPiBGcm9tIGFuIFhNTCBmaWxlIHNwZWNpZnlpbmcgdGhlIGhpZXJhcmNoeQorICogPGxpPiBGcm9tIGRpZmZlcmVudCB7QGxpbmsgQWN0aXZpdHkgQWN0aXZpdGllc30gdGhhdCBlYWNoIHNwZWNpZnkgaXRzIG93bgorICogcHJlZmVyZW5jZXMgaW4gYW4gWE1MIGZpbGUgdmlhIHtAbGluayBBY3Rpdml0eX0gbWV0YS1kYXRhCisgKiA8bGk+IEZyb20gYW4gb2JqZWN0IGhpZXJhcmNoeSByb290ZWQgd2l0aCB7QGxpbmsgUHJlZmVyZW5jZVNjcmVlbn0KKyAqIDxwPgorICogVG8gaW5mbGF0ZSBmcm9tIFhNTCwgdXNlIHRoZSB7QGxpbmsgI2FkZFByZWZlcmVuY2VzRnJvbVJlc291cmNlKGludCl9LiBUaGUKKyAqIHJvb3QgZWxlbWVudCBzaG91bGQgYmUgYSB7QGxpbmsgUHJlZmVyZW5jZVNjcmVlbn0uIFN1YnNlcXVlbnQgZWxlbWVudHMgY2FuIHBvaW50CisgKiB0byBhY3R1YWwge0BsaW5rIFByZWZlcmVuY2V9IHN1YmNsYXNzZXMuIEFzIG1lbnRpb25lZCBhYm92ZSwgc3Vic2VxdWVudAorICoge0BsaW5rIFByZWZlcmVuY2VTY3JlZW59IGluIHRoZSBoaWVyYXJjaHkgd2lsbCByZXN1bHQgaW4gdGhlIHNjcmVlbiBicmVhay4KKyAqIDxwPgorICogVG8gc3BlY2lmeSBhbiB7QGxpbmsgSW50ZW50fSB0byBxdWVyeSB7QGxpbmsgQWN0aXZpdHkgQWN0aXZpdGllc30gdGhhdCBlYWNoCisgKiBoYXZlIHByZWZlcmVuY2VzLCB1c2Uge0BsaW5rICNhZGRQcmVmZXJlbmNlc0Zyb21JbnRlbnR9LiBFYWNoCisgKiB7QGxpbmsgQWN0aXZpdHl9IGNhbiBzcGVjaWZ5IG1ldGEtZGF0YSBpbiB0aGUgbWFuaWZlc3QgKHZpYSB0aGUga2V5CisgKiB7QGxpbmsgUHJlZmVyZW5jZU1hbmFnZXIjTUVUQURBVEFfS0VZX1BSRUZFUkVOQ0VTfSkgdGhhdCBwb2ludHMgdG8gYW4gWE1MCisgKiByZXNvdXJjZS4gVGhlc2UgWE1MIHJlc291cmNlcyB3aWxsIGJlIGluZmxhdGVkIGludG8gYSBzaW5nbGUgcHJlZmVyZW5jZQorICogaGllcmFyY2h5IGFuZCBzaG93biBieSB0aGlzIGZyYWdtZW50LgorICogPHA+CisgKiBUbyBzcGVjaWZ5IGFuIG9iamVjdCBoaWVyYXJjaHkgcm9vdGVkIHdpdGgge0BsaW5rIFByZWZlcmVuY2VTY3JlZW59LCB1c2UKKyAqIHtAbGluayAjc2V0UHJlZmVyZW5jZVNjcmVlbihQcmVmZXJlbmNlU2NyZWVuKX0uCisgKiA8cD4KKyAqIEFzIGEgY29udmVuaWVuY2UsIHRoaXMgZnJhZ21lbnQgaW1wbGVtZW50cyBhIGNsaWNrIGxpc3RlbmVyIGZvciBhbnkKKyAqIHByZWZlcmVuY2UgaW4gdGhlIGN1cnJlbnQgaGllcmFyY2h5LCBzZWUKKyAqIHtAbGluayAjb25QcmVmZXJlbmNlVHJlZUNsaWNrKFByZWZlcmVuY2VTY3JlZW4sIFByZWZlcmVuY2UpfS4KKyAqCisgKiA8YSBuYW1lPSJTYW1wbGVDb2RlIj48L2E+CisgKiA8aDM+U2FtcGxlIENvZGU8L2gzPgorICoKKyAqIDxwPlRoZSBmb2xsb3dpbmcgc2FtcGxlIGNvZGUgc2hvd3MgYSBzaW1wbGUgcHJlZmVyZW5jZSBmcmFnbWVudCB0aGF0IGlzCisgKiBwb3B1bGF0ZWQgZnJvbSBhIHJlc291cmNlLiAgVGhlIHJlc291cmNlIGl0IGxvYWRzIGlzOjwvcD4KKyAqCisgKiB7QHNhbXBsZSBkZXZlbG9wbWVudC9zYW1wbGVzL0FwaURlbW9zL3Jlcy94bWwvcHJlZmVyZW5jZXMueG1sIHByZWZlcmVuY2VzfQorICoKKyAqIDxwPlRoZSBmcmFnbWVudCBpbXBsZW1lbnRhdGlvbiBpdHNlbGYgc2ltcGx5IHBvcHVsYXRlcyB0aGUgcHJlZmVyZW5jZXMKKyAqIHdoZW4gY3JlYXRlZC4gIE5vdGUgdGhhdCB0aGUgcHJlZmVyZW5jZXMgZnJhbWV3b3JrIHRha2VzIGNhcmUgb2YgbG9hZGluZworICogdGhlIGN1cnJlbnQgdmFsdWVzIG91dCBvZiB0aGUgYXBwIHByZWZlcmVuY2VzIGFuZCB3cml0aW5nIHRoZW0gd2hlbiBjaGFuZ2VkOjwvcD4KKyAqCisgKiB7QHNhbXBsZSBkZXZlbG9wbWVudC9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvcHJlZmVyZW5jZS9GcmFnbWVudFByZWZlcmVuY2VzLmphdmEKKyAqICAgICAgZnJhZ21lbnR9CisgKgorICogQHNlZSBQcmVmZXJlbmNlCisgKiBAc2VlIFByZWZlcmVuY2VTY3JlZW4KKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIFByZWZlcmVuY2VGcmFnbWVudCBleHRlbmRzIEZyYWdtZW50IGltcGxlbWVudHMKKyAgICAgICAgUHJlZmVyZW5jZU1hbmFnZXIuT25QcmVmZXJlbmNlVHJlZUNsaWNrTGlzdGVuZXIgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZFUkVOQ0VTX1RBRyA9ICJhbmRyb2lkOnByZWZlcmVuY2VzIjsKKworICAgIHByaXZhdGUgUHJlZmVyZW5jZU1hbmFnZXIgbVByZWZlcmVuY2VNYW5hZ2VyOworICAgIHByaXZhdGUgTGlzdFZpZXcgbUxpc3Q7CisgICAgcHJpdmF0ZSBib29sZWFuIG1IYXZlUHJlZnM7CisgICAgcHJpdmF0ZSBib29sZWFuIG1Jbml0RG9uZTsKKworICAgIC8qKgorICAgICAqIFRoZSBzdGFydGluZyByZXF1ZXN0IGNvZGUgZ2l2ZW4gb3V0IHRvIHByZWZlcmVuY2UgZnJhbWV3b3JrLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGSVJTVF9SRVFVRVNUX0NPREUgPSAxMDA7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0JJTkRfUFJFRkVSRU5DRVMgPSAwOworICAgIHByaXZhdGUgSGFuZGxlciBtSGFuZGxlciA9IG5ldyBIYW5kbGVyKCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG1zZykgeworICAgICAgICAgICAgc3dpdGNoIChtc2cud2hhdCkgeworCisgICAgICAgICAgICAgICAgY2FzZSBNU0dfQklORF9QUkVGRVJFTkNFUzoKKyAgICAgICAgICAgICAgICAgICAgYmluZFByZWZlcmVuY2VzKCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsKKworICAgIGZpbmFsIHByaXZhdGUgUnVubmFibGUgbVJlcXVlc3RGb2N1cyA9IG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgbUxpc3QuZm9jdXNhYmxlVmlld0F2YWlsYWJsZShtTGlzdCk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgLyoqCisgICAgICogSW50ZXJmYWNlIHRoYXQgUHJlZmVyZW5jZUZyYWdtZW50J3MgY29udGFpbmluZyBhY3Rpdml0eSBzaG91bGQKKyAgICAgKiBpbXBsZW1lbnQgdG8gYmUgYWJsZSB0byBwcm9jZXNzIHByZWZlcmVuY2UgaXRlbXMgdGhhdCB3aXNoIHRvCisgICAgICogc3dpdGNoIHRvIGEgbmV3IGZyYWdtZW50LgorICAgICAqLworICAgIHB1YmxpYyBpbnRlcmZhY2UgT25QcmVmZXJlbmNlU3RhcnRGcmFnbWVudENhbGxiYWNrIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENhbGxlZCB3aGVuIHRoZSB1c2VyIGhhcyBjbGlja2VkIG9uIGEgUHJlZmVyZW5jZSB0aGF0IGhhcworICAgICAgICAgKiBhIGZyYWdtZW50IGNsYXNzIG5hbWUgYXNzb2NpYXRlZCB3aXRoIGl0LiAgVGhlIGltcGxlbWVudGF0aW9uCisgICAgICAgICAqIHRvIHNob3VsZCBpbnN0YW50aWF0ZSBhbmQgc3dpdGNoIHRvIGFuIGluc3RhbmNlIG9mIHRoZSBnaXZlbgorICAgICAgICAgKiBmcmFnbWVudC4KKyAgICAgICAgICovCisgICAgICAgIGJvb2xlYW4gb25QcmVmZXJlbmNlU3RhcnRGcmFnbWVudChQcmVmZXJlbmNlRnJhZ21lbnQgY2FsbGVyLCBQcmVmZXJlbmNlIHByZWYpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICAgICAgbVByZWZlcmVuY2VNYW5hZ2VyID0gbmV3IFByZWZlcmVuY2VNYW5hZ2VyKGdldEFjdGl2aXR5KCksIEZJUlNUX1JFUVVFU1RfQ09ERSk7CisgICAgICAgIG1QcmVmZXJlbmNlTWFuYWdlci5zZXRPblByZWZlcmVuY2VUcmVlQ2xpY2tMaXN0ZW5lcih0aGlzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVmlldyBvbkNyZWF0ZVZpZXcoTGF5b3V0SW5mbGF0ZXIgaW5mbGF0ZXIsIFZpZXdHcm91cCBjb250YWluZXIsCisgICAgICAgICAgICBCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHJldHVybiBpbmZsYXRlci5pbmZsYXRlKGNvbS5hbmRyb2lkLmludGVybmFsLlIubGF5b3V0LnByZWZlcmVuY2VfbGlzdF9jb250ZW50LAorICAgICAgICAgICAgICAgIGNvbnRhaW5lciwgZmFsc2UpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQWN0aXZpdHlDcmVhdGVkKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25BY3Rpdml0eUNyZWF0ZWQoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICAgICAgZ2V0TGlzdFZpZXcoKS5zZXRTY3JvbGxCYXJTdHlsZShWaWV3LlNDUk9MTEJBUlNfSU5TSURFX09WRVJMQVkpOworCisgICAgICAgIGlmIChtSGF2ZVByZWZzKSB7CisgICAgICAgICAgICBiaW5kUHJlZmVyZW5jZXMoKTsKKyAgICAgICAgfQorCisgICAgICAgIG1Jbml0RG9uZSA9IHRydWU7CisKKyAgICAgICAgaWYgKHNhdmVkSW5zdGFuY2VTdGF0ZSAhPSBudWxsKSB7CisgICAgICAgICAgICBCdW5kbGUgY29udGFpbmVyID0gc2F2ZWRJbnN0YW5jZVN0YXRlLmdldEJ1bmRsZShQUkVGRVJFTkNFU19UQUcpOworICAgICAgICAgICAgaWYgKGNvbnRhaW5lciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZmluYWwgUHJlZmVyZW5jZVNjcmVlbiBwcmVmZXJlbmNlU2NyZWVuID0gZ2V0UHJlZmVyZW5jZVNjcmVlbigpOworICAgICAgICAgICAgICAgIGlmIChwcmVmZXJlbmNlU2NyZWVuICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJlZmVyZW5jZVNjcmVlbi5yZXN0b3JlSGllcmFyY2h5U3RhdGUoY29udGFpbmVyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblN0b3AoKSB7CisgICAgICAgIHN1cGVyLm9uU3RvcCgpOworICAgICAgICBtUHJlZmVyZW5jZU1hbmFnZXIuZGlzcGF0Y2hBY3Rpdml0eVN0b3AoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkRlc3Ryb3lWaWV3KCkgeworICAgICAgICBtTGlzdCA9IG51bGw7CisgICAgICAgIG1IYW5kbGVyLnJlbW92ZUNhbGxiYWNrcyhtUmVxdWVzdEZvY3VzKTsKKyAgICAgICAgc3VwZXIub25EZXN0cm95VmlldygpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uRGVzdHJveSgpIHsKKyAgICAgICAgc3VwZXIub25EZXN0cm95KCk7CisgICAgICAgIG1QcmVmZXJlbmNlTWFuYWdlci5kaXNwYXRjaEFjdGl2aXR5RGVzdHJveSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uU2F2ZUluc3RhbmNlU3RhdGUoQnVuZGxlIG91dFN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uU2F2ZUluc3RhbmNlU3RhdGUob3V0U3RhdGUpOworCisgICAgICAgIGZpbmFsIFByZWZlcmVuY2VTY3JlZW4gcHJlZmVyZW5jZVNjcmVlbiA9IGdldFByZWZlcmVuY2VTY3JlZW4oKTsKKyAgICAgICAgaWYgKHByZWZlcmVuY2VTY3JlZW4gIT0gbnVsbCkgeworICAgICAgICAgICAgQnVuZGxlIGNvbnRhaW5lciA9IG5ldyBCdW5kbGUoKTsKKyAgICAgICAgICAgIHByZWZlcmVuY2VTY3JlZW4uc2F2ZUhpZXJhcmNoeVN0YXRlKGNvbnRhaW5lcik7CisgICAgICAgICAgICBvdXRTdGF0ZS5wdXRCdW5kbGUoUFJFRkVSRU5DRVNfVEFHLCBjb250YWluZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25BY3Rpdml0eVJlc3VsdChpbnQgcmVxdWVzdENvZGUsIGludCByZXN1bHRDb2RlLCBJbnRlbnQgZGF0YSkgeworICAgICAgICBzdXBlci5vbkFjdGl2aXR5UmVzdWx0KHJlcXVlc3RDb2RlLCByZXN1bHRDb2RlLCBkYXRhKTsKKworICAgICAgICBtUHJlZmVyZW5jZU1hbmFnZXIuZGlzcGF0Y2hBY3Rpdml0eVJlc3VsdChyZXF1ZXN0Q29kZSwgcmVzdWx0Q29kZSwgZGF0YSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUge0BsaW5rIFByZWZlcmVuY2VNYW5hZ2VyfSB1c2VkIGJ5IHRoaXMgZnJhZ21lbnQuCisgICAgICogQHJldHVybiBUaGUge0BsaW5rIFByZWZlcmVuY2VNYW5hZ2VyfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgUHJlZmVyZW5jZU1hbmFnZXIgZ2V0UHJlZmVyZW5jZU1hbmFnZXIoKSB7CisgICAgICAgIHJldHVybiBtUHJlZmVyZW5jZU1hbmFnZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgcm9vdCBvZiB0aGUgcHJlZmVyZW5jZSBoaWVyYXJjaHkgdGhhdCB0aGlzIGZyYWdtZW50IGlzIHNob3dpbmcuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJlZmVyZW5jZVNjcmVlbiBUaGUgcm9vdCB7QGxpbmsgUHJlZmVyZW5jZVNjcmVlbn0gb2YgdGhlIHByZWZlcmVuY2UgaGllcmFyY2h5LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFByZWZlcmVuY2VTY3JlZW4oUHJlZmVyZW5jZVNjcmVlbiBwcmVmZXJlbmNlU2NyZWVuKSB7CisgICAgICAgIGlmIChtUHJlZmVyZW5jZU1hbmFnZXIuc2V0UHJlZmVyZW5jZXMocHJlZmVyZW5jZVNjcmVlbikgJiYgcHJlZmVyZW5jZVNjcmVlbiAhPSBudWxsKSB7CisgICAgICAgICAgICBtSGF2ZVByZWZzID0gdHJ1ZTsKKyAgICAgICAgICAgIGlmIChtSW5pdERvbmUpIHsKKyAgICAgICAgICAgICAgICBwb3N0QmluZFByZWZlcmVuY2VzKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSByb290IG9mIHRoZSBwcmVmZXJlbmNlIGhpZXJhcmNoeSB0aGF0IHRoaXMgZnJhZ21lbnQgaXMgc2hvd2luZy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIHtAbGluayBQcmVmZXJlbmNlU2NyZWVufSB0aGF0IGlzIHRoZSByb290IG9mIHRoZSBwcmVmZXJlbmNlCisgICAgICogICAgICAgICBoaWVyYXJjaHkuCisgICAgICovCisgICAgcHVibGljIFByZWZlcmVuY2VTY3JlZW4gZ2V0UHJlZmVyZW5jZVNjcmVlbigpIHsKKyAgICAgICAgcmV0dXJuIG1QcmVmZXJlbmNlTWFuYWdlci5nZXRQcmVmZXJlbmNlU2NyZWVuKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBwcmVmZXJlbmNlcyBmcm9tIGFjdGl2aXRpZXMgdGhhdCBtYXRjaCB0aGUgZ2l2ZW4ge0BsaW5rIEludGVudH0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW50ZW50IFRoZSB7QGxpbmsgSW50ZW50fSB0byBxdWVyeSBhY3Rpdml0aWVzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFByZWZlcmVuY2VzRnJvbUludGVudChJbnRlbnQgaW50ZW50KSB7CisgICAgICAgIHJlcXVpcmVQcmVmZXJlbmNlTWFuYWdlcigpOworCisgICAgICAgIHNldFByZWZlcmVuY2VTY3JlZW4obVByZWZlcmVuY2VNYW5hZ2VyLmluZmxhdGVGcm9tSW50ZW50KGludGVudCwgZ2V0UHJlZmVyZW5jZVNjcmVlbigpKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5mbGF0ZXMgdGhlIGdpdmVuIFhNTCByZXNvdXJjZSBhbmQgYWRkcyB0aGUgcHJlZmVyZW5jZSBoaWVyYXJjaHkgdG8gdGhlIGN1cnJlbnQKKyAgICAgKiBwcmVmZXJlbmNlIGhpZXJhcmNoeS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcmVmZXJlbmNlc1Jlc0lkIFRoZSBYTUwgcmVzb3VyY2UgSUQgdG8gaW5mbGF0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRQcmVmZXJlbmNlc0Zyb21SZXNvdXJjZShpbnQgcHJlZmVyZW5jZXNSZXNJZCkgeworICAgICAgICByZXF1aXJlUHJlZmVyZW5jZU1hbmFnZXIoKTsKKworICAgICAgICBzZXRQcmVmZXJlbmNlU2NyZWVuKG1QcmVmZXJlbmNlTWFuYWdlci5pbmZsYXRlRnJvbVJlc291cmNlKGdldEFjdGl2aXR5KCksCisgICAgICAgICAgICAgICAgcHJlZmVyZW5jZXNSZXNJZCwgZ2V0UHJlZmVyZW5jZVNjcmVlbigpKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIG9uUHJlZmVyZW5jZVRyZWVDbGljayhQcmVmZXJlbmNlU2NyZWVuIHByZWZlcmVuY2VTY3JlZW4sCisgICAgICAgICAgICBQcmVmZXJlbmNlIHByZWZlcmVuY2UpIHsKKyAgICAgICAgaWYgKHByZWZlcmVuY2UuZ2V0RnJhZ21lbnQoKSAhPSBudWxsICYmCisgICAgICAgICAgICAgICAgZ2V0QWN0aXZpdHkoKSBpbnN0YW5jZW9mIE9uUHJlZmVyZW5jZVN0YXJ0RnJhZ21lbnRDYWxsYmFjaykgeworICAgICAgICAgICAgcmV0dXJuICgoT25QcmVmZXJlbmNlU3RhcnRGcmFnbWVudENhbGxiYWNrKWdldEFjdGl2aXR5KCkpLm9uUHJlZmVyZW5jZVN0YXJ0RnJhZ21lbnQoCisgICAgICAgICAgICAgICAgICAgIHRoaXMsIHByZWZlcmVuY2UpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaW5kcyBhIHtAbGluayBQcmVmZXJlbmNlfSBiYXNlZCBvbiBpdHMga2V5LgorICAgICAqCisgICAgICogQHBhcmFtIGtleSBUaGUga2V5IG9mIHRoZSBwcmVmZXJlbmNlIHRvIHJldHJpZXZlLgorICAgICAqIEByZXR1cm4gVGhlIHtAbGluayBQcmVmZXJlbmNlfSB3aXRoIHRoZSBrZXksIG9yIG51bGwuCisgICAgICogQHNlZSBQcmVmZXJlbmNlR3JvdXAjZmluZFByZWZlcmVuY2UoQ2hhclNlcXVlbmNlKQorICAgICAqLworICAgIHB1YmxpYyBQcmVmZXJlbmNlIGZpbmRQcmVmZXJlbmNlKENoYXJTZXF1ZW5jZSBrZXkpIHsKKyAgICAgICAgaWYgKG1QcmVmZXJlbmNlTWFuYWdlciA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbVByZWZlcmVuY2VNYW5hZ2VyLmZpbmRQcmVmZXJlbmNlKGtleSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJlcXVpcmVQcmVmZXJlbmNlTWFuYWdlcigpIHsKKyAgICAgICAgaWYgKG1QcmVmZXJlbmNlTWFuYWdlciA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVGhpcyBzaG91bGQgYmUgY2FsbGVkIGFmdGVyIHN1cGVyLm9uQ3JlYXRlLiIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHBvc3RCaW5kUHJlZmVyZW5jZXMoKSB7CisgICAgICAgIGlmIChtSGFuZGxlci5oYXNNZXNzYWdlcyhNU0dfQklORF9QUkVGRVJFTkNFUykpIHJldHVybjsKKyAgICAgICAgbUhhbmRsZXIub2J0YWluTWVzc2FnZShNU0dfQklORF9QUkVGRVJFTkNFUykuc2VuZFRvVGFyZ2V0KCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGJpbmRQcmVmZXJlbmNlcygpIHsKKyAgICAgICAgZmluYWwgUHJlZmVyZW5jZVNjcmVlbiBwcmVmZXJlbmNlU2NyZWVuID0gZ2V0UHJlZmVyZW5jZVNjcmVlbigpOworICAgICAgICBpZiAocHJlZmVyZW5jZVNjcmVlbiAhPSBudWxsKSB7CisgICAgICAgICAgICBwcmVmZXJlbmNlU2NyZWVuLmJpbmQoZ2V0TGlzdFZpZXcoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiogQGhpZGUgKi8KKyAgICBwdWJsaWMgTGlzdFZpZXcgZ2V0TGlzdFZpZXcoKSB7CisgICAgICAgIGVuc3VyZUxpc3QoKTsKKyAgICAgICAgcmV0dXJuIG1MaXN0OworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBlbnN1cmVMaXN0KCkgeworICAgICAgICBpZiAobUxpc3QgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIFZpZXcgcm9vdCA9IGdldFZpZXcoKTsKKyAgICAgICAgaWYgKHJvb3QgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQ29udGVudCB2aWV3IG5vdCB5ZXQgY3JlYXRlZCIpOworICAgICAgICB9CisgICAgICAgIFZpZXcgcmF3TGlzdFZpZXcgPSByb290LmZpbmRWaWV3QnlJZChhbmRyb2lkLlIuaWQubGlzdCk7CisgICAgICAgIGlmICghKHJhd0xpc3RWaWV3IGluc3RhbmNlb2YgTGlzdFZpZXcpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIkNvbnRlbnQgaGFzIHZpZXcgd2l0aCBpZCBhdHRyaWJ1dGUgJ2FuZHJvaWQuUi5pZC5saXN0JyAiCisgICAgICAgICAgICAgICAgICAgICsgInRoYXQgaXMgbm90IGEgTGlzdFZpZXcgY2xhc3MiKTsKKyAgICAgICAgfQorICAgICAgICBtTGlzdCA9IChMaXN0VmlldylyYXdMaXN0VmlldzsKKyAgICAgICAgaWYgKG1MaXN0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiWW91ciBjb250ZW50IG11c3QgaGF2ZSBhIExpc3RWaWV3IHdob3NlIGlkIGF0dHJpYnV0ZSBpcyAiICsKKyAgICAgICAgICAgICAgICAgICAgIidhbmRyb2lkLlIuaWQubGlzdCciKTsKKyAgICAgICAgfQorICAgICAgICBtSGFuZGxlci5wb3N0KG1SZXF1ZXN0Rm9jdXMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ByZWZlcmVuY2UvUHJlZmVyZW5jZUluZmxhdGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9wcmVmZXJlbmNlL1ByZWZlcmVuY2VJbmZsYXRlci5qYXZhCmluZGV4IDc3OWU3NDYuLmMyMWFhMTggMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ByZWZlcmVuY2UvUHJlZmVyZW5jZUluZmxhdGVyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvcHJlZmVyZW5jZS9QcmVmZXJlbmNlSW5mbGF0ZXIuamF2YQpAQCAtMTYsNiArMTYsOCBAQAogCiBwYWNrYWdlIGFuZHJvaWQucHJlZmVyZW5jZTsKIAoraW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnV0aWwuWG1sVXRpbHM7CisKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKQEAgLTM5LDYgKzQxLDcgQEAKIGNsYXNzIFByZWZlcmVuY2VJbmZsYXRlciBleHRlbmRzIEdlbmVyaWNJbmZsYXRlcjxQcmVmZXJlbmNlLCBQcmVmZXJlbmNlR3JvdXA+IHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlByZWZlcmVuY2VJbmZsYXRlciI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElOVEVOVF9UQUdfTkFNRSA9ICJpbnRlbnQiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9UQUdfTkFNRSA9ICJleHRyYSI7CiAKICAgICBwcml2YXRlIFByZWZlcmVuY2VNYW5hZ2VyIG1QcmVmZXJlbmNlTWFuYWdlcjsKICAgICAKQEAgLTczLDggKzc2LDEwIEBACiAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgIGludGVudCA9IEludGVudC5wYXJzZUludGVudChnZXRDb250ZXh0KCkuZ2V0UmVzb3VyY2VzKCksIHBhcnNlciwgYXR0cnMpOwogICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNvdWxkIG5vdCBwYXJzZSBJbnRlbnQuIik7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCBlKTsKKyAgICAgICAgICAgICAgICBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uIGV4ID0gbmV3IFhtbFB1bGxQYXJzZXJFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3IgcGFyc2luZyBwcmVmZXJlbmNlIik7CisgICAgICAgICAgICAgICAgZXguaW5pdENhdXNlKGUpOworICAgICAgICAgICAgICAgIHRocm93IGV4OwogICAgICAgICAgICAgfQogICAgICAgICAgICAgCiAgICAgICAgICAgICBpZiAoaW50ZW50ICE9IG51bGwpIHsKQEAgLTgyLDYgKzg3LDE4IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAKICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9IGVsc2UgaWYgKHRhZy5lcXVhbHMoRVhUUkFfVEFHX05BTUUpKSB7CisgICAgICAgICAgICBnZXRDb250ZXh0KCkuZ2V0UmVzb3VyY2VzKCkucGFyc2VCdW5kbGVFeHRyYShFWFRSQV9UQUdfTkFNRSwgYXR0cnMsCisgICAgICAgICAgICAgICAgICAgIHBhcmVudFByZWZlcmVuY2UuZ2V0RXh0cmFzKCkpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBYbWxVdGlscy5za2lwQ3VycmVudFRhZyhwYXJzZXIpOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24gZXggPSBuZXcgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICJFcnJvciBwYXJzaW5nIHByZWZlcmVuY2UiKTsKKyAgICAgICAgICAgICAgICBleC5pbml0Q2F1c2UoZSk7CisgICAgICAgICAgICAgICAgdGhyb3cgZXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgICAgICAKICAgICAgICAgcmV0dXJuIGZhbHNlOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcHJlZmVyZW5jZS9QcmVmZXJlbmNlU2NyZWVuLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9wcmVmZXJlbmNlL1ByZWZlcmVuY2VTY3JlZW4uamF2YQppbmRleCA5NWU1NDMyNC4uYzdmOGFiMiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcHJlZmVyZW5jZS9QcmVmZXJlbmNlU2NyZWVuLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvcHJlZmVyZW5jZS9QcmVmZXJlbmNlU2NyZWVuLmphdmEKQEAgLTkxLDcgKzkxLDggQEAKIAogICAgIC8qKgogICAgICAqIFJldHVybnMgYW4gYWRhcHRlciB0aGF0IGNhbiBiZSBhdHRhY2hlZCB0byBhIHtAbGluayBQcmVmZXJlbmNlQWN0aXZpdHl9Ci0gICAgICogdG8gc2hvdyB0aGUgcHJlZmVyZW5jZXMgY29udGFpbmVkIGluIHRoaXMge0BsaW5rIFByZWZlcmVuY2VTY3JlZW59LgorICAgICAqIG9yIHtAbGluayBQcmVmZXJlbmNlRnJhZ21lbnR9IHRvIHNob3cgdGhlIHByZWZlcmVuY2VzIGNvbnRhaW5lZCBpbiB0aGlzCisgICAgICoge0BsaW5rIFByZWZlcmVuY2VTY3JlZW59LgogICAgICAqIDxwPgogICAgICAqIFRoaXMge0BsaW5rIFByZWZlcmVuY2VTY3JlZW59IHdpbGwgTk9UIGFwcGVhciBpbiB0aGUgcmV0dXJuZWQgYWRhcHRlciwgaW5zdGVhZAogICAgICAqIGl0IGFwcGVhcnMgaW4gdGhlIGhpZXJhcmNoeSBhYm92ZSB0aGlzIHtAbGluayBQcmVmZXJlbmNlU2NyZWVufS4KQEAgLTEzNiw3ICsxMzcsNyBAQAogICAgIAogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIG9uQ2xpY2soKSB7Ci0gICAgICAgIGlmIChnZXRJbnRlbnQoKSAhPSBudWxsIHx8IGdldFByZWZlcmVuY2VDb3VudCgpID09IDApIHsKKyAgICAgICAgaWYgKGdldEludGVudCgpICE9IG51bGwgfHwgZ2V0RnJhZ21lbnQoKSAhPSBudWxsIHx8IGdldFByZWZlcmVuY2VDb3VudCgpID09IDApIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgICAgICAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL0Jyb3dzZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL0Jyb3dzZXIuamF2YQppbmRleCAyZmJhMWQ3OS4uZmQ5ZDY5OSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvQnJvd3Nlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL0Jyb3dzZXIuamF2YQpAQCAtMTcsMjIgKzE3LDI5IEBACiBwYWNrYWdlIGFuZHJvaWQucHJvdmlkZXI7CiAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VXJpczsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlczsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuRGF0YWJhc2VVdGlsczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcEZhY3Rvcnk7CiBpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwotaW1wb3J0IGFuZHJvaWQub3MuQXN5bmNUYXNrOworaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQnJvd3NlckNvbnRyYWN0LkJvb2ttYXJrczsKK2ltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkJyb3dzZXJDb250cmFjdC5IaXN0b3J5OwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiBpbXBvcnQgYW5kcm9pZC53ZWJraXQuV2ViSWNvbkRhdGFiYXNlOwogCi1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci0KIHB1YmxpYyBjbGFzcyBCcm93c2VyIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HVEFHID0gImJyb3dzZXIiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVXJpIEJPT0tNQVJLU19VUkkgPQotICAgICAgICBVcmkucGFyc2UoImNvbnRlbnQ6Ly9icm93c2VyL2Jvb2ttYXJrcyIpOworCisgICAgLyoqCisgICAgICogQSB0YWJsZSBjb250YWluaW5nIGJvdGggYm9va21hcmtzIGFuZCBoaXN0b3J5IGl0ZW1zLiBUaGUgY29sdW1ucyBvZiB0aGUgdGFibGUgYXJlIGRlZmluZWQgaW4KKyAgICAgKiB7QGxpbmsgQm9va21hcmtDb2x1bW5zfS4gUmVhZGluZyB0aGlzIHRhYmxlIHJlcXVpcmVzIHRoZQorICAgICAqIHtAbGluayBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24jUkVBRF9ISVNUT1JZX0JPT0tNQVJLU30gcGVybWlzc2lvbiBhbmQgd3JpdGluZyB0byBpdAorICAgICAqIHJlcXVpcmVzIHRoZSB7QGxpbmsgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uI1dSSVRFX0hJU1RPUllfQk9PS01BUktTfSBwZXJtaXNzaW9uLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVXJpIEJPT0tNQVJLU19VUkkgPSBVcmkucGFyc2UoImNvbnRlbnQ6Ly9icm93c2VyL2Jvb2ttYXJrcyIpOwogCiAgICAgLyoqCiAgICAgICogVGhlIG5hbWUgb2YgZXh0cmEgZGF0YSB3aGVuIHN0YXJ0aW5nIEJyb3dzZXIgd2l0aCBBQ1RJT05fVklFVyBvcgpAQCAtNDksMTIgKzU2LDExIEBACiAgICAgICogYXBwbGljYXRpb24uCiAgICAgICogPHA+CiAgICAgICogVGhlIHZhbHVlIGlzIGEgdW5pcXVlIGlkZW50aWZpY2F0aW9uIHN0cmluZyB0aGF0IHdpbGwgYmUgdXNlZCB0bwotICAgICAqIGluZGVudGlmeSB0aGUgY2FsbGluZyBhcHBsaWNhdGlvbi4gVGhlIEJyb3dzZXIgd2lsbCBhdHRlbXB0IHRvIHJldXNlIHRoZQorICAgICAqIGlkZW50aWZ5IHRoZSBjYWxsaW5nIGFwcGxpY2F0aW9uLiBUaGUgQnJvd3NlciB3aWxsIGF0dGVtcHQgdG8gcmV1c2UgdGhlCiAgICAgICogc2FtZSB3aW5kb3cgZWFjaCB0aW1lIHRoZSBhcHBsaWNhdGlvbiBsYXVuY2hlcyB0aGUgQnJvd3NlciB3aXRoIHRoZSBzYW1lCiAgICAgICogaWRlbnRpZmllci4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9BUFBMSUNBVElPTl9JRCA9Ci0gICAgICAgICJjb20uYW5kcm9pZC5icm93c2VyLmFwcGxpY2F0aW9uX2lkIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9BUFBMSUNBVElPTl9JRCA9ICJjb20uYW5kcm9pZC5icm93c2VyLmFwcGxpY2F0aW9uX2lkIjsKIAogICAgIC8qKgogICAgICAqIFRoZSBuYW1lIG9mIHRoZSBleHRyYSBkYXRhIGluIHRoZSBWSUVXIGludGVudC4gVGhlIGRhdGEgYXJlIGtleS92YWx1ZQpAQCAtNjgsMTAgKzc0LDE3IEBACiAgICAgLyogaWYgeW91IGNoYW5nZSBjb2x1bW4gb3JkZXIgeW91IG11c3QgYWxzbyBjaGFuZ2UgaW5kaWNlcwogICAgICAgIGJlbG93ICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBISVNUT1JZX1BST0pFQ1RJT04gPSBuZXcgU3RyaW5nW10gewotICAgICAgICBCb29rbWFya0NvbHVtbnMuX0lELCBCb29rbWFya0NvbHVtbnMuVVJMLCBCb29rbWFya0NvbHVtbnMuVklTSVRTLAotICAgICAgICBCb29rbWFya0NvbHVtbnMuREFURSwgQm9va21hcmtDb2x1bW5zLkJPT0tNQVJLLCBCb29rbWFya0NvbHVtbnMuVElUTEUsCi0gICAgICAgIEJvb2ttYXJrQ29sdW1ucy5GQVZJQ09OLCBCb29rbWFya0NvbHVtbnMuVEhVTUJOQUlMLAotICAgICAgICBCb29rbWFya0NvbHVtbnMuVE9VQ0hfSUNPTiwgQm9va21hcmtDb2x1bW5zLlVTRVJfRU5URVJFRCB9OworICAgICAgICAgICAgQm9va21hcmtDb2x1bW5zLl9JRCwgLy8gMAorICAgICAgICAgICAgQm9va21hcmtDb2x1bW5zLlVSTCwgLy8gMQorICAgICAgICAgICAgQm9va21hcmtDb2x1bW5zLlZJU0lUUywgLy8gMgorICAgICAgICAgICAgQm9va21hcmtDb2x1bW5zLkRBVEUsIC8vIDMKKyAgICAgICAgICAgIEJvb2ttYXJrQ29sdW1ucy5CT09LTUFSSywgLy8gNAorICAgICAgICAgICAgQm9va21hcmtDb2x1bW5zLlRJVExFLCAvLyA1CisgICAgICAgICAgICBCb29rbWFya0NvbHVtbnMuRkFWSUNPTiwgLy8gNgorICAgICAgICAgICAgQm9va21hcmtDb2x1bW5zLlRIVU1CTkFJTCwgLy8gNworICAgICAgICAgICAgQm9va21hcmtDb2x1bW5zLlRPVUNIX0lDT04sIC8vIDgKKyAgICAgICAgICAgIEJvb2ttYXJrQ29sdW1ucy5VU0VSX0VOVEVSRUQsIC8vIDkKKyAgICB9OwogCiAgICAgLyogdGhlc2UgaW5kaWNlcyBkZXBlbmRlbnQgb24gSElTVE9SWV9QUk9KRUNUSU9OICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSElTVE9SWV9QUk9KRUNUSU9OX0lEX0lOREVYID0gMDsKQEAgLTkyLDE5ICsxMDUsMzMgQEAKIAogICAgIC8qIGNvbHVtbnMgbmVlZGVkIHRvIGRldGVybWluZSB3aGV0aGVyIHRvIHRydW5jYXRlIGhpc3RvcnkgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFRSVU5DQVRFX0hJU1RPUllfUFJPSkVDVElPTiA9IG5ldyBTdHJpbmdbXSB7Ci0gICAgICAgIEJvb2ttYXJrQ29sdW1ucy5fSUQsIEJvb2ttYXJrQ29sdW1ucy5EQVRFLCB9OworICAgICAgICAgICAgQm9va21hcmtDb2x1bW5zLl9JRCwKKyAgICAgICAgICAgIEJvb2ttYXJrQ29sdW1ucy5EQVRFLAorICAgIH07CisKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUUlVOQ0FURV9ISVNUT1JZX1BST0pFQ1RJT05fSURfSU5ERVggPSAwOwogCiAgICAgLyogdHJ1bmNhdGUgdGhpcyBtYW55IGhpc3RvcnkgaXRlbXMgYXQgYSB0aW1lICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFJVTkNBVEVfTl9PTERFU1QgPSA1OwogCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBVcmkgU0VBUkNIRVNfVVJJID0KLSAgICAgICAgVXJpLnBhcnNlKCJjb250ZW50Oi8vYnJvd3Nlci9zZWFyY2hlcyIpOworICAgIC8qKgorICAgICAqIEEgdGFibGUgY29udGFpbmluZyBhIGxvZyBvZiBicm93c2VyIHNlYXJjaGVzLiBUaGUgY29sdW1ucyBvZiB0aGUgdGFibGUgYXJlIGRlZmluZWQgaW4KKyAgICAgKiB7QGxpbmsgU2VhcmNoQ29sdW1uc30uIFJlYWRpbmcgdGhpcyB0YWJsZSByZXF1aXJlcyB0aGUKKyAgICAgKiB7QGxpbmsgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uI1JFQURfSElTVE9SWV9CT09LTUFSS1N9IHBlcm1pc3Npb24gYW5kIHdyaXRpbmcgdG8gaXQKKyAgICAgKiByZXF1aXJlcyB0aGUge0BsaW5rIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbiNXUklURV9ISVNUT1JZX0JPT0tNQVJLU30gcGVybWlzc2lvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVyaSBTRUFSQ0hFU19VUkkgPSBVcmkucGFyc2UoImNvbnRlbnQ6Ly9icm93c2VyL3NlYXJjaGVzIik7CiAKLSAgICAvKiBpZiB5b3UgY2hhbmdlIGNvbHVtbiBvcmRlciB5b3UgbXVzdCBhbHNvIGNoYW5nZSBpbmRpY2VzCi0gICAgICAgYmVsb3cgKi8KKyAgICAvKioKKyAgICAgKiBBIHByb2plY3Rpb24gb2Yge0BsaW5rICNTRUFSQ0hFU19VUkl9IHRoYXQgY29udGFpbnMge0BsaW5rIFNlYXJjaENvbHVtbnMjX0lEfSwKKyAgICAgKiB7QGxpbmsgU2VhcmNoQ29sdW1ucyNTRUFSQ0h9LCBhbmQge0BsaW5rIFNlYXJjaENvbHVtbnMjREFURX0uCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBTRUFSQ0hFU19QUk9KRUNUSU9OID0gbmV3IFN0cmluZ1tdIHsKLSAgICAgICAgU2VhcmNoQ29sdW1ucy5fSUQsIFNlYXJjaENvbHVtbnMuU0VBUkNILCBTZWFyY2hDb2x1bW5zLkRBVEUgfTsKKyAgICAgICAgICAgIC8vIGlmIHlvdSBjaGFuZ2UgY29sdW1uIG9yZGVyIHlvdSBtdXN0IGFsc28gY2hhbmdlIGluZGljZXMgYmVsb3cKKyAgICAgICAgICAgIFNlYXJjaENvbHVtbnMuX0lELCAvLyAwCisgICAgICAgICAgICBTZWFyY2hDb2x1bW5zLlNFQVJDSCwgLy8gMQorICAgICAgICAgICAgU2VhcmNoQ29sdW1ucy5EQVRFLCAvLyAyCisgICAgfTsKIAogICAgIC8qIHRoZXNlIGluZGljZXMgZGVwZW5kZW50IG9uIFNFQVJDSEVTX1BST0pFQ1RJT04gKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRUFSQ0hFU19QUk9KRUNUSU9OX1NFQVJDSF9JTkRFWCA9IDE7CkBAIC0xMjEsOSArMTQ4LDEwIEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9ISVNUT1JZX0NPVU5UID0gMjUwOwogCiAgICAgLyoqCi0gICAgICogIE9wZW4gdGhlIEFkZEJvb2ttYXJrIGFjdGl2aXR5IHRvIHNhdmUgYSBib29rbWFyay4gIExhdW5jaCB3aXRoCi0gICAgICogIGFuZC9vciB1cmwsIHdoaWNoIGNhbiBiZSBlZGl0ZWQgYnkgdGhlIHVzZXIgYmVmb3JlIHNhdmluZy4KLSAgICAgKiAgQHBhcmFtIGMgICAgICAgIENvbnRleHQgdXNlZCB0byBsYXVuY2ggdGhlIEFkZEJvb2ttYXJrIGFjdGl2aXR5LgorICAgICAqICBPcGVuIGFuIGFjdGl2aXR5IHRvIHNhdmUgYSBib29rbWFyay4gTGF1bmNoIHdpdGggYSB0aXRsZQorICAgICAqICBhbmQvb3IgYSB1cmwsIGJvdGggb2Ygd2hpY2ggY2FuIGJlIGVkaXRlZCBieSB0aGUgdXNlciBiZWZvcmUgc2F2aW5nLgorICAgICAqCisgICAgICogIEBwYXJhbSBjICAgICAgICBDb250ZXh0IHVzZWQgdG8gbGF1bmNoIHRoZSBhY3Rpdml0eSB0byBhZGQgYSBib29rbWFyay4KICAgICAgKiAgQHBhcmFtIHRpdGxlICAgIFRpdGxlIGZvciB0aGUgYm9va21hcmsuIENhbiBiZSBudWxsIG9yIGVtcHR5IHN0cmluZy4KICAgICAgKiAgQHBhcmFtIHVybCAgICAgIFVybCBmb3IgdGhlIGJvb2ttYXJrLiBDYW4gYmUgbnVsbCBvciBlbXB0eSBzdHJpbmcuCiAgICAgICovCkBAIC0xNTIsOCArMTgwLDE1IEBACiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRVhUUkFfU0hBUkVfRkFWSUNPTiA9ICJzaGFyZV9mYXZpY29uIjsKIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgdm9pZCBzZW5kU3RyaW5nKENvbnRleHQgYywgU3RyaW5nIHMpIHsKLSAgICAgICAgc2VuZFN0cmluZyhjLCBzLCBjLmdldFN0cmluZyhjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy5zZW5kVGV4dCkpOworICAgIC8qKgorICAgICAqIFNlbmRzIHRoZSBnaXZlbiBzdHJpbmcgdXNpbmcgYW4gSW50ZW50IHdpdGgge0BsaW5rIEludGVudCNBQ1RJT05fU0VORH0gYW5kIGEgbWltZSB0eXBlCisgICAgICogb2YgdGV4dC9wbGFpbi4gVGhlIHN0cmluZyBpcyBwdXQgaW50byB7QGxpbmsgSW50ZW50I0VYVFJBX1RFWFR9LgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgdGhlIGNvbnRleHQgdXNlZCB0byBzdGFydCB0aGUgYWN0aXZpdHkKKyAgICAgKiBAcGFyYW0gc3RyaW5nIHRoZSBzdHJpbmcgdG8gc2VuZAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgdm9pZCBzZW5kU3RyaW5nKENvbnRleHQgY29udGV4dCwgU3RyaW5nIHN0cmluZykgeworICAgICAgICBzZW5kU3RyaW5nKGNvbnRleHQsIHN0cmluZywgY29udGV4dC5nZXRTdHJpbmcoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcuc2VuZFRleHQpKTsKICAgICB9CiAKICAgICAvKioKQEAgLTE4MSw0MSArMjE2LDM5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogIFJldHVybiBhIGN1cnNvciBwb2ludGluZyB0byBhIGxpc3Qgb2YgYWxsIHRoZSBib29rbWFya3MuCisgICAgICogIFJldHVybiBhIGN1cnNvciBwb2ludGluZyB0byBhIGxpc3Qgb2YgYWxsIHRoZSBib29rbWFya3MuIFRoZSBjdXJzb3Igd2lsbCBoYXZlIGEgc2luZ2xlCisgICAgICogIGNvbHVtbiwge0BsaW5rIEJvb2ttYXJrQ29sdW1ucyNVUkx9LgorICAgICAqICA8cD4KICAgICAgKiAgUmVxdWlyZXMge0BsaW5rIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbiNSRUFEX0hJU1RPUllfQk9PS01BUktTfQorICAgICAqCiAgICAgICogIEBwYXJhbSBjciAgIFRoZSBDb250ZW50UmVzb2x2ZXIgdXNlZCB0byBhY2Nlc3MgdGhlIGRhdGFiYXNlLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ3Vyc29yIGdldEFsbEJvb2ttYXJrcyhDb250ZW50UmVzb2x2ZXIgY3IpIHRocm93cyAKICAgICAgICAgICAgIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBjci5xdWVyeShCT09LTUFSS1NfVVJJLAotICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7IEJvb2ttYXJrQ29sdW1ucy5VUkwgfSwgCi0gICAgICAgICAgICAgICAgImJvb2ttYXJrID0gMSIsIG51bGwsIG51bGwpOworICAgICAgICByZXR1cm4gY3IucXVlcnkoQm9va21hcmtzLkNPTlRFTlRfVVJJLAorICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7IEJvb2ttYXJrcy5VUkwgfSwgCisgICAgICAgICAgICAgICAgQm9va21hcmtzLklTX0ZPTERFUiArICIgPSAwIiwgbnVsbCwgbnVsbCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogIFJldHVybiBhIGN1cnNvciBwb2ludGluZyB0byBhIGxpc3Qgb2YgYWxsIHZpc2l0ZWQgc2l0ZSB1cmxzLgorICAgICAqICBSZXR1cm4gYSBjdXJzb3IgcG9pbnRpbmcgdG8gYSBsaXN0IG9mIGFsbCB2aXNpdGVkIHNpdGUgdXJscy4gVGhlIGN1cnNvciB3aWxsCisgICAgICogIGhhdmUgYSBzaW5nbGUgY29sdW1uLCB7QGxpbmsgQm9va21hcmtDb2x1bW5zI1VSTH0uCisgICAgICogIDxwPgogICAgICAqICBSZXF1aXJlcyB7QGxpbmsgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uI1JFQURfSElTVE9SWV9CT09LTUFSS1N9CisgICAgICoKICAgICAgKiAgQHBhcmFtIGNyICAgVGhlIENvbnRlbnRSZXNvbHZlciB1c2VkIHRvIGFjY2VzcyB0aGUgZGF0YWJhc2UuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDdXJzb3IgZ2V0QWxsVmlzaXRlZFVybHMoQ29udGVudFJlc29sdmVyIGNyKSB0aHJvd3MKICAgICAgICAgICAgIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBjci5xdWVyeShCT09LTUFSS1NfVVJJLAotICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7IEJvb2ttYXJrQ29sdW1ucy5VUkwgfSwgbnVsbCwgbnVsbCwgbnVsbCk7CisgICAgICAgIHJldHVybiBjci5xdWVyeShIaXN0b3J5LkNPTlRFTlRfVVJJLAorICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7IEhpc3RvcnkuVVJMIH0sIG51bGwsIG51bGwsIG51bGwpOwogICAgIH0KIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIHZvaWQgYWRkT3JVcmxFcXVhbHMoU3RyaW5nQnVpbGRlciBzYikgewogICAgICAgICBzYi5hcHBlbmQoIiBPUiAiICsgQm9va21hcmtDb2x1bW5zLlVSTCArICIgPSAiKTsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiAgUmV0dXJuIGEgQ3Vyc29yIHdpdGggYWxsIGhpc3RvcnkvYm9va21hcmtzIHRoYXQgYXJlIHNpbWlsYXIgdG8gdXJsLAotICAgICAqICB3aGVyZSBzaW1pbGFyIG1lYW5zICdodHRwKHMpOi8vJyBhbmQgJ3d3dy4nIGFyZSBvcHRpb25hbCwgYnV0IHRoZSByZXN0Ci0gICAgICogIG9mIHRoZSB1cmwgaXMgdGhlIHNhbWUuCi0gICAgICogIEBwYXJhbSBjciAgIFRoZSBDb250ZW50UmVzb2x2ZXIgdXNlZCB0byBhY2Nlc3MgdGhlIGRhdGFiYXNlLgotICAgICAqICBAcGFyYW0gdXJsICBUaGUgdXJsIHRvIGNvbXBhcmUgdG8uCi0gICAgICogIEBoaWRlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBDdXJzb3IgZ2V0VmlzaXRlZExpa2UoQ29udGVudFJlc29sdmVyIGNyLCBTdHJpbmcgdXJsKSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ3Vyc29yIGdldFZpc2l0ZWRMaWtlKENvbnRlbnRSZXNvbHZlciBjciwgU3RyaW5nIHVybCkgewogICAgICAgICBib29sZWFuIHNlY3VyZSA9IGZhbHNlOwogICAgICAgICBTdHJpbmcgY29tcGFyZVN0cmluZyA9IHVybDsKICAgICAgICAgaWYgKGNvbXBhcmVTdHJpbmcuc3RhcnRzV2l0aCgiaHR0cDovLyIpKSB7CkBAIC0yMjksMTQgKzI2MiwxNCBAQAogICAgICAgICB9CiAgICAgICAgIFN0cmluZ0J1aWxkZXIgd2hlcmVDbGF1c2UgPSBudWxsOwogICAgICAgICBpZiAoc2VjdXJlKSB7Ci0gICAgICAgICAgICB3aGVyZUNsYXVzZSA9IG5ldyBTdHJpbmdCdWlsZGVyKEJvb2ttYXJrQ29sdW1ucy5VUkwgKyAiID0gIik7CisgICAgICAgICAgICB3aGVyZUNsYXVzZSA9IG5ldyBTdHJpbmdCdWlsZGVyKEJvb2ttYXJrcy5VUkwgKyAiID0gIik7CiAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmFwcGVuZEVzY2FwZWRTUUxTdHJpbmcod2hlcmVDbGF1c2UsCiAgICAgICAgICAgICAgICAgICAgICJodHRwczovLyIgKyBjb21wYXJlU3RyaW5nKTsKICAgICAgICAgICAgIGFkZE9yVXJsRXF1YWxzKHdoZXJlQ2xhdXNlKTsKICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuYXBwZW5kRXNjYXBlZFNRTFN0cmluZyh3aGVyZUNsYXVzZSwKICAgICAgICAgICAgICAgICAgICAgImh0dHBzOi8vd3d3LiIgKyBjb21wYXJlU3RyaW5nKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHdoZXJlQ2xhdXNlID0gbmV3IFN0cmluZ0J1aWxkZXIoQm9va21hcmtDb2x1bW5zLlVSTCArICIgPSAiKTsKKyAgICAgICAgICAgIHdoZXJlQ2xhdXNlID0gbmV3IFN0cmluZ0J1aWxkZXIoQm9va21hcmtzLlVSTCArICIgPSAiKTsKICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuYXBwZW5kRXNjYXBlZFNRTFN0cmluZyh3aGVyZUNsYXVzZSwKICAgICAgICAgICAgICAgICAgICAgY29tcGFyZVN0cmluZyk7CiAgICAgICAgICAgICBhZGRPclVybEVxdWFscyh3aGVyZUNsYXVzZSk7CkBAIC0yNTAsNyArMjgzLDcgQEAKICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuYXBwZW5kRXNjYXBlZFNRTFN0cmluZyh3aGVyZUNsYXVzZSwKICAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly8iICsgd3d3U3RyaW5nKTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gY3IucXVlcnkoQk9PS01BUktTX1VSSSwgSElTVE9SWV9QUk9KRUNUSU9OLAorICAgICAgICByZXR1cm4gY3IucXVlcnkoSGlzdG9yeS5DT05URU5UX1VSSSwgbmV3IFN0cmluZ1tdIHsgSGlzdG9yeS5fSUQsIEhpc3RvcnkuVklTSVRTIH0sCiAgICAgICAgICAgICAgICAgd2hlcmVDbGF1c2UudG9TdHJpbmcoKSwgbnVsbCwgbnVsbCk7CiAgICAgfQogCkBAIC0yNjYsMjYgKzI5OSwyNCBAQAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgdm9pZCB1cGRhdGVWaXNpdGVkSGlzdG9yeShDb250ZW50UmVzb2x2ZXIgY3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB1cmwsIGJvb2xlYW4gcmVhbCkgewotICAgICAgICBsb25nIG5vdyA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpOworICAgICAgICBsb25nIG5vdyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwogICAgICAgICBDdXJzb3IgYyA9IG51bGw7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBjID0gZ2V0VmlzaXRlZExpa2UoY3IsIHVybCk7CiAgICAgICAgICAgICAvKiBXZSBzaG91bGQgb25seSBnZXQgb25lIGFuc3dlciB0aGF0IGlzIGV4YWN0bHkgdGhlIHNhbWUuICovCiAgICAgICAgICAgICBpZiAoYy5tb3ZlVG9GaXJzdCgpKSB7Ci0gICAgICAgICAgICAgICAgQ29udGVudFZhbHVlcyBtYXAgPSBuZXcgQ29udGVudFZhbHVlcygpOworICAgICAgICAgICAgICAgIENvbnRlbnRWYWx1ZXMgdmFsdWVzID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKICAgICAgICAgICAgICAgICBpZiAocmVhbCkgewotICAgICAgICAgICAgICAgICAgICBtYXAucHV0KEJvb2ttYXJrQ29sdW1ucy5WSVNJVFMsIGMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0SW50KEhJU1RPUllfUFJPSkVDVElPTl9WSVNJVFNfSU5ERVgpICsgMSk7CisgICAgICAgICAgICAgICAgICAgIHZhbHVlcy5wdXQoSGlzdG9yeS5WSVNJVFMsIGMuZ2V0SW50KDEpICsgMSk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbWFwLnB1dChCb29rbWFya0NvbHVtbnMuVVNFUl9FTlRFUkVELCAxKTsKKyAgICAgICAgICAgICAgICAgICAgdmFsdWVzLnB1dChIaXN0b3J5LlVTRVJfRU5URVJFRCwgMSk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1hcC5wdXQoQm9va21hcmtDb2x1bW5zLkRBVEUsIG5vdyk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nW10gcHJvamVjdGlvbiA9IG5ldyBTdHJpbmdbXQotICAgICAgICAgICAgICAgICAgICAgICAgeyBJbnRlZ2VyLnZhbHVlT2YoYy5nZXRJbnQoMCkpLnRvU3RyaW5nKCkgfTsKLSAgICAgICAgICAgICAgICBjci51cGRhdGUoQk9PS01BUktTX1VSSSwgbWFwLCAiX2lkID0gPyIsIHByb2plY3Rpb24pOworICAgICAgICAgICAgICAgIHZhbHVlcy5wdXQoSGlzdG9yeS5EQVRFX0xBU1RfVklTSVRFRCwgbm93KTsKKyAgICAgICAgICAgICAgICBjci51cGRhdGUoQ29udGVudFVyaXMud2l0aEFwcGVuZGVkSWQoSGlzdG9yeS5DT05URU5UX1VSSSwgYy5nZXRMb25nKDApKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcywgbnVsbCwgbnVsbCk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIHRydW5jYXRlSGlzdG9yeShjcik7Ci0gICAgICAgICAgICAgICAgQ29udGVudFZhbHVlcyBtYXAgPSBuZXcgQ29udGVudFZhbHVlcygpOworICAgICAgICAgICAgICAgIENvbnRlbnRWYWx1ZXMgdmFsdWVzID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKICAgICAgICAgICAgICAgICBpbnQgdmlzaXRzOwogICAgICAgICAgICAgICAgIGludCB1c2VyX2VudGVyZWQ7CiAgICAgICAgICAgICAgICAgaWYgKHJlYWwpIHsKQEAgLTI5NSwxNCArMzI2LDEzIEBACiAgICAgICAgICAgICAgICAgICAgIHZpc2l0cyA9IDA7CiAgICAgICAgICAgICAgICAgICAgIHVzZXJfZW50ZXJlZCA9IDE7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1hcC5wdXQoQm9va21hcmtDb2x1bW5zLlVSTCwgdXJsKTsKLSAgICAgICAgICAgICAgICBtYXAucHV0KEJvb2ttYXJrQ29sdW1ucy5WSVNJVFMsIHZpc2l0cyk7Ci0gICAgICAgICAgICAgICAgbWFwLnB1dChCb29rbWFya0NvbHVtbnMuREFURSwgbm93KTsKLSAgICAgICAgICAgICAgICBtYXAucHV0KEJvb2ttYXJrQ29sdW1ucy5CT09LTUFSSywgMCk7Ci0gICAgICAgICAgICAgICAgbWFwLnB1dChCb29rbWFya0NvbHVtbnMuVElUTEUsIHVybCk7Ci0gICAgICAgICAgICAgICAgbWFwLnB1dChCb29rbWFya0NvbHVtbnMuQ1JFQVRFRCwgMCk7Ci0gICAgICAgICAgICAgICAgbWFwLnB1dChCb29rbWFya0NvbHVtbnMuVVNFUl9FTlRFUkVELCB1c2VyX2VudGVyZWQpOwotICAgICAgICAgICAgICAgIGNyLmluc2VydChCT09LTUFSS1NfVVJJLCBtYXApOworICAgICAgICAgICAgICAgIHZhbHVlcy5wdXQoSGlzdG9yeS5VUkwsIHVybCk7CisgICAgICAgICAgICAgICAgdmFsdWVzLnB1dChIaXN0b3J5LlZJU0lUUywgdmlzaXRzKTsKKyAgICAgICAgICAgICAgICB2YWx1ZXMucHV0KEhpc3RvcnkuREFURV9MQVNUX1ZJU0lURUQsIG5vdyk7CisgICAgICAgICAgICAgICAgdmFsdWVzLnB1dChIaXN0b3J5LlRJVExFLCB1cmwpOworICAgICAgICAgICAgICAgIHZhbHVlcy5wdXQoSGlzdG9yeS5EQVRFX0NSRUFURUQsIDApOworICAgICAgICAgICAgICAgIHZhbHVlcy5wdXQoSGlzdG9yeS5VU0VSX0VOVEVSRUQsIHVzZXJfZW50ZXJlZCk7CisgICAgICAgICAgICAgICAgY3IuaW5zZXJ0KEhpc3RvcnkuQ09OVEVOVF9VUkksIHZhbHVlcyk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICBMb2cuZShMT0dUQUcsICJ1cGRhdGVWaXNpdGVkSGlzdG9yeSIsIGUpOwpAQCAtMzIyLDEwICszNTIsMTAgQEAKICAgICAgICAgU3RyaW5nW10gc3RyID0gbnVsbDsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIFN0cmluZ1tdIHByb2plY3Rpb24gPSBuZXcgU3RyaW5nW10gewotICAgICAgICAgICAgICAgICJ1cmwiCisgICAgICAgICAgICAgICAgICAgIEhpc3RvcnkuVVJMLAogICAgICAgICAgICAgfTsKLSAgICAgICAgICAgIGMgPSBjci5xdWVyeShCT09LTUFSS1NfVVJJLCBwcm9qZWN0aW9uLCAidmlzaXRzID4gMCIsIG51bGwsCi0gICAgICAgICAgICAgICAgICAgIG51bGwpOworICAgICAgICAgICAgYyA9IGNyLnF1ZXJ5KEhpc3RvcnkuQ09OVEVOVF9VUkksIHByb2plY3Rpb24sIEhpc3RvcnkuVklTSVRTICsgIiA+IDAiLCBudWxsLCBudWxsKTsKKyAgICAgICAgICAgIGlmIChjID09IG51bGwpIHJldHVybiBuZXcgU3RyaW5nWzBdOwogICAgICAgICAgICAgc3RyID0gbmV3IFN0cmluZ1tjLmdldENvdW50KCldOwogICAgICAgICAgICAgaW50IGkgPSAwOwogICAgICAgICAgICAgd2hpbGUgKGMubW92ZVRvTmV4dCgpKSB7CkBAIC0zNTMsMzEgKzM4MywyOSBAQAogICAgICAqIEBwYXJhbSBjciBUaGUgQ29udGVudFJlc29sdmVyIHVzZWQgdG8gYWNjZXNzIHRoZSBkYXRhYmFzZS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgdHJ1bmNhdGVIaXN0b3J5KENvbnRlbnRSZXNvbHZlciBjcikgewotICAgICAgICBDdXJzb3IgYyA9IG51bGw7CisgICAgICAgIC8vIFRPRE8gbWFrZSBhIHNpbmdsZSByZXF1ZXN0IHRvIHRoZSBwcm92aWRlciB0byBkbyB0aGlzIGluIGEgc2luZ2xlIHRyYW5zYWN0aW9uCisgICAgICAgIEN1cnNvciBjdXJzb3IgPSBudWxsOwogICAgICAgICB0cnkgeworICAgICAgICAgICAgCiAgICAgICAgICAgICAvLyBTZWxlY3Qgbm9uLWJvb2ttYXJrIGhpc3RvcnksIG9yZGVyZWQgYnkgZGF0ZQotICAgICAgICAgICAgYyA9IGNyLnF1ZXJ5KAotICAgICAgICAgICAgICAgICAgICBCT09LTUFSS1NfVVJJLAotICAgICAgICAgICAgICAgICAgICBUUlVOQ0FURV9ISVNUT1JZX1BST0pFQ1RJT04sCi0gICAgICAgICAgICAgICAgICAgICJib29rbWFyayA9IDAiLAotICAgICAgICAgICAgICAgICAgICBudWxsLAotICAgICAgICAgICAgICAgICAgICBCb29rbWFya0NvbHVtbnMuREFURSk7Ci0gICAgICAgICAgICAvLyBMb2cudihMT0dUQUcsICJoaXN0b3J5IGNvdW50ICIgKyBjLmNvdW50KCkpOwotICAgICAgICAgICAgaWYgKGMubW92ZVRvRmlyc3QoKSAmJiBjLmdldENvdW50KCkgPj0gTUFYX0hJU1RPUllfQ09VTlQpIHsKKyAgICAgICAgICAgIGN1cnNvciA9IGNyLnF1ZXJ5KEhpc3RvcnkuQ09OVEVOVF9VUkksCisgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7IEhpc3RvcnkuX0lELCBIaXN0b3J5LlVSTCwgSGlzdG9yeS5EQVRFX0xBU1RfVklTSVRFRCB9LAorICAgICAgICAgICAgICAgICAgICBudWxsLCBudWxsLCBIaXN0b3J5LkRBVEVfTEFTVF9WSVNJVEVEICsgIiBBU0MiKTsKKworICAgICAgICAgICAgaWYgKGN1cnNvci5tb3ZlVG9GaXJzdCgpICYmIGN1cnNvci5nZXRDb3VudCgpID49IE1BWF9ISVNUT1JZX0NPVU5UKSB7CisgICAgICAgICAgICAgICAgZmluYWwgV2ViSWNvbkRhdGFiYXNlIGljb25EYiA9IFdlYkljb25EYXRhYmFzZS5nZXRJbnN0YW5jZSgpOwogICAgICAgICAgICAgICAgIC8qIGVsaW1pbmF0ZSBvbGRlc3QgaGlzdG9yeSBpdGVtcyAqLwogICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgVFJVTkNBVEVfTl9PTERFU1Q7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAvLyBMb2cudihMT0dUQUcsICJ0cnVuY2F0ZSBoaXN0b3J5ICIgKwotICAgICAgICAgICAgICAgICAgICAvLyBjLmdldEludChUUlVOQ0FURV9ISVNUT1JZX1BST0pFQ1RJT05fSURfSU5ERVgpKTsKLSAgICAgICAgICAgICAgICAgICAgY3IuZGVsZXRlKEJPT0tNQVJLU19VUkksICJfaWQgPSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLmdldEludChUUlVOQ0FURV9ISVNUT1JZX1BST0pFQ1RJT05fSURfSU5ERVgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwpOwotICAgICAgICAgICAgICAgICAgICBpZiAoIWMubW92ZVRvTmV4dCgpKSBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY3IuZGVsZXRlKENvbnRlbnRVcmlzLndpdGhBcHBlbmRlZElkKEhpc3RvcnkuQ09OVEVOVF9VUkksIGN1cnNvci5nZXRMb25nKDApKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgaWNvbkRiLnJlbGVhc2VJY29uRm9yUGFnZVVybChjdXJzb3IuZ2V0U3RyaW5nKDEpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFjdXJzb3IubW92ZVRvTmV4dCgpKSBicmVhazsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICBMb2cuZShMT0dUQUcsICJ0cnVuY2F0ZUhpc3RvcnkiLCBlKTsKICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChjICE9IG51bGwpIGMuY2xvc2UoKTsKKyAgICAgICAgICAgIGlmIChjdXJzb3IgIT0gbnVsbCkgY3Vyc29yLmNsb3NlKCk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTM4OCwyMyArNDE2LDE3IEBACiAgICAgICogQHJldHVybiBib29sZWFuICBUcnVlIGlmIHRoZSBoaXN0b3J5IGNhbiBiZSBjbGVhcmVkLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBjYW5DbGVhckhpc3RvcnkoQ29udGVudFJlc29sdmVyIGNyKSB7Ci0gICAgICAgIEN1cnNvciBjID0gbnVsbDsKKyAgICAgICAgQ3Vyc29yIGN1cnNvciA9IG51bGw7CiAgICAgICAgIGJvb2xlYW4gcmV0ID0gZmFsc2U7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjID0gY3IucXVlcnkoCi0gICAgICAgICAgICAgICAgQk9PS01BUktTX1VSSSwKLSAgICAgICAgICAgICAgICBuZXcgU3RyaW5nIFtdIHsgQm9va21hcmtDb2x1bW5zLl9JRCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvb2ttYXJrQ29sdW1ucy5CT09LTUFSSywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQm9va21hcmtDb2x1bW5zLlZJU0lUUyB9LAotICAgICAgICAgICAgICAgICJib29rbWFyayA9IDAgT1IgdmlzaXRzID4gMCIsIAotICAgICAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAgICAgbnVsbAotICAgICAgICAgICAgICAgICk7Ci0gICAgICAgICAgICByZXQgPSBjLm1vdmVUb0ZpcnN0KCk7CisgICAgICAgICAgICBjdXJzb3IgPSBjci5xdWVyeShIaXN0b3J5LkNPTlRFTlRfVVJJLAorICAgICAgICAgICAgICAgIG5ldyBTdHJpbmcgW10geyBIaXN0b3J5Ll9JRCwgSGlzdG9yeS5WSVNJVFMgfSwKKyAgICAgICAgICAgICAgICBudWxsLCBudWxsLCBudWxsKTsKKyAgICAgICAgICAgIHJldCA9IGN1cnNvci5nZXRDb3VudCgpID4gMDsKICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIExvZy5lKExPR1RBRywgImNhbkNsZWFySGlzdG9yeSIsIGUpOwogICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKGMgIT0gbnVsbCkgYy5jbG9zZSgpOworICAgICAgICAgICAgaWYgKGN1cnNvciAhPSBudWxsKSBjdXJzb3IuY2xvc2UoKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gcmV0OwogICAgIH0KQEAgLTQyMCw2NyArNDQyLDM2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogSGVscGVyIGZ1bmN0aW9uIHRvIGRlbGV0ZSBhbGwgaGlzdG9yeSBpdGVtcyBhbmQgcmV2ZXJ0IGFsbAotICAgICAqIGJvb2ttYXJrcyB0byB6ZXJvIHZpc2l0cyB3aGljaCBtZWV0IHRoZSBjcml0ZXJpYSBwcm92aWRlZC4KLSAgICAgKiAgUmVxdWlyZXMge0BsaW5rIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbiNSRUFEX0hJU1RPUllfQk9PS01BUktTfQotICAgICAqICBSZXF1aXJlcyB7QGxpbmsgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uI1dSSVRFX0hJU1RPUllfQk9PS01BUktTfQorICAgICAqIEhlbHBlciBmdW5jdGlvbiB0byBkZWxldGUgYWxsIGhpc3RvcnkgaXRlbXMgYW5kIHJlbGVhc2UgdGhlIGljb25zIGZvciB0aGVtIGluIHRoZQorICAgICAqIHtAbGluayBXZWJJY29uRGF0YWJhc2V9LgorICAgICAqCisgICAgICogUmVxdWlyZXMge0BsaW5rIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbiNSRUFEX0hJU1RPUllfQk9PS01BUktTfQorICAgICAqIFJlcXVpcmVzIHtAbGluayBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24jV1JJVEVfSElTVE9SWV9CT09LTUFSS1N9CisgICAgICoKICAgICAgKiBAcGFyYW0gY3IgICBUaGUgQ29udGVudFJlc29sdmVyIHVzZWQgdG8gYWNjZXNzIHRoZSBkYXRhYmFzZS4KICAgICAgKiBAcGFyYW0gd2hlcmVDbGF1c2UgICBTdHJpbmcgdG8gbGltaXQgdGhlIGl0ZW1zIGFmZmVjdGVkLgogICAgICAqICAgICAgICAgICAgICAgICAgICAgIG51bGwgbWVhbnMgYWxsIGl0ZW1zLgogICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIHZvaWQgZGVsZXRlSGlzdG9yeVdoZXJlKENvbnRlbnRSZXNvbHZlciBjciwKLSAgICAgICAgICAgIFN0cmluZyB3aGVyZUNsYXVzZSkgewotICAgICAgICBDdXJzb3IgYyA9IG51bGw7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgdm9pZCBkZWxldGVIaXN0b3J5V2hlcmUoQ29udGVudFJlc29sdmVyIGNyLCBTdHJpbmcgd2hlcmVDbGF1c2UpIHsKKyAgICAgICAgQ3Vyc29yIGN1cnNvciA9IG51bGw7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjID0gY3IucXVlcnkoQk9PS01BUktTX1VSSSwKLSAgICAgICAgICAgICAgICBISVNUT1JZX1BST0pFQ1RJT04sCi0gICAgICAgICAgICAgICAgd2hlcmVDbGF1c2UsCi0gICAgICAgICAgICAgICAgbnVsbCwKLSAgICAgICAgICAgICAgICBudWxsKTsKLSAgICAgICAgICAgIGlmIChjLm1vdmVUb0ZpcnN0KCkpIHsKKyAgICAgICAgICAgIGN1cnNvciA9IGNyLnF1ZXJ5KEhpc3RvcnkuQ09OVEVOVF9VUkksIG5ldyBTdHJpbmdbXSB7IEhpc3RvcnkuVVJMIH0sIHdoZXJlQ2xhdXNlLAorICAgICAgICAgICAgICAgICAgICBudWxsLCBudWxsKTsKKyAgICAgICAgICAgIGlmIChjdXJzb3IubW92ZVRvRmlyc3QoKSkgewogICAgICAgICAgICAgICAgIGZpbmFsIFdlYkljb25EYXRhYmFzZSBpY29uRGIgPSBXZWJJY29uRGF0YWJhc2UuZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgICAgICAgICAvKiBEZWxldGUgZmF2aWNvbnMsIGFuZCByZXZlcnQgYm9va21hcmtzIHdoaWNoIGhhdmUgYmVlbiB2aXNpdGVkCi0gICAgICAgICAgICAgICAgICogdG8gc2ltcGx5IGJvb2ttYXJrcy4KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBmaXJzdFRpbWUgPSB0cnVlOwogICAgICAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHVybCA9IGMuZ2V0U3RyaW5nKEhJU1RPUllfUFJPSkVDVElPTl9VUkxfSU5ERVgpOwotICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzQm9va21hcmsgPQotICAgICAgICAgICAgICAgICAgICAgICAgYy5nZXRJbnQoSElTVE9SWV9QUk9KRUNUSU9OX0JPT0tNQVJLX0lOREVYKSA9PSAxOwotICAgICAgICAgICAgICAgICAgICBpZiAoaXNCb29rbWFyaykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0VGltZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0VGltZSA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiBPUiAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiKCBfaWQgPSAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZChjLmdldEludCgwKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiApIik7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpY29uRGIucmVsZWFzZUljb25Gb3JQYWdlVXJsKHVybCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IHdoaWxlIChjLm1vdmVUb05leHQoKSk7CisgICAgICAgICAgICAgICAgICAgIC8vIERlbGV0ZSBmYXZpY29ucworICAgICAgICAgICAgICAgICAgICAvLyBUT0RPIGRvbid0IHJlbGVhc2UgaWYgdGhlIFVSTCBpcyBib29rbWFya2VkCisgICAgICAgICAgICAgICAgICAgIGljb25EYi5yZWxlYXNlSWNvbkZvclBhZ2VVcmwoY3Vyc29yLmdldFN0cmluZygwKSk7CisgICAgICAgICAgICAgICAgfSB3aGlsZSAoY3Vyc29yLm1vdmVUb05leHQoKSk7CiAKLSAgICAgICAgICAgICAgICBpZiAoIWZpcnN0VGltZSkgewotICAgICAgICAgICAgICAgICAgICBDb250ZW50VmFsdWVzIG1hcCA9IG5ldyBDb250ZW50VmFsdWVzKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1hcC5wdXQoQm9va21hcmtDb2x1bW5zLlZJU0lUUywgMCk7Ci0gICAgICAgICAgICAgICAgICAgIG1hcC5wdXQoQm9va21hcmtDb2x1bW5zLkRBVEUsIDApOwotICAgICAgICAgICAgICAgICAgICAvKiBGSVhNRTogU2hvdWxkIEkgYWxzbyByZW1vdmUgdGhlIHRpdGxlPyAqLwotICAgICAgICAgICAgICAgICAgICBjci51cGRhdGUoQk9PS01BUktTX1VSSSwgbWFwLCBzYi50b1N0cmluZygpLCBudWxsKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBTdHJpbmcgZGVsZXRlV2hlcmVDbGF1c2UgPSBCb29rbWFya0NvbHVtbnMuQk9PS01BUksgKyAiID0gMCI7Ci0gICAgICAgICAgICAgICAgaWYgKHdoZXJlQ2xhdXNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgZGVsZXRlV2hlcmVDbGF1c2UgKz0gIiBBTkQgIiArIHdoZXJlQ2xhdXNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjci5kZWxldGUoQk9PS01BUktTX1VSSSwgZGVsZXRlV2hlcmVDbGF1c2UsIG51bGwpOworICAgICAgICAgICAgICAgIGNyLmRlbGV0ZShCT09LTUFSS1NfVVJJLCB3aGVyZUNsYXVzZSwgbnVsbCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICBMb2cuZShMT0dUQUcsICJkZWxldGVIaXN0b3J5V2hlcmUiLCBlKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChjICE9IG51bGwpIGMuY2xvc2UoKTsKKyAgICAgICAgICAgIGlmIChjdXJzb3IgIT0gbnVsbCkgY3Vyc29yLmNsb3NlKCk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTUyMCwxMCArNTExLDcgQEAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgZGVsZXRlRnJvbUhpc3RvcnkoQ29udGVudFJlc29sdmVyIGNyLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHVybCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoQm9va21hcmtDb2x1bW5zLlVSTCArICIgPSAiKTsKLSAgICAgICAgRGF0YWJhc2VVdGlscy5hcHBlbmRFc2NhcGVkU1FMU3RyaW5nKHNiLCB1cmwpOwotICAgICAgICBTdHJpbmcgbWF0Y2hlc1VybCA9IHNiLnRvU3RyaW5nKCk7Ci0gICAgICAgIGRlbGV0ZUhpc3RvcnlXaGVyZShjciwgbWF0Y2hlc1VybCk7CisgICAgICAgIGNyLmRlbGV0ZShIaXN0b3J5LkNPTlRFTlRfVVJJLCBIaXN0b3J5LlVSTCArICI9PyIsIG5ldyBTdHJpbmdbXSB7IHVybCB9KTsKICAgICB9CiAKICAgICAvKioKQEAgLTUzNCw3ICs1MjIsNyBAQAogICAgICAqIEBwYXJhbSBzZWFyY2ggICAgVGhlIHN0cmluZyB0byBhZGQgdG8gdGhlIHNlYXJjaGVzIGRhdGFiYXNlLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgdm9pZCBhZGRTZWFyY2hVcmwoQ29udGVudFJlc29sdmVyIGNyLCBTdHJpbmcgc2VhcmNoKSB7Ci0gICAgICAgIGxvbmcgbm93ID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7CisgICAgICAgIGxvbmcgbm93ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CiAgICAgICAgIEN1cnNvciBjID0gbnVsbDsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGMgPSBjci5xdWVyeSgKQEAgLTU1OCw2ICs1NDYsNyBAQAogICAgICAgICAgICAgaWYgKGMgIT0gbnVsbCkgYy5jbG9zZSgpOwogICAgICAgICB9CiAgICAgfQorCiAgICAgLyoqCiAgICAgICogUmVtb3ZlIGFsbCBzZWFyY2hlcyBmcm9tIHRoZSBzZWFyY2ggZGF0YWJhc2UuCiAgICAgICogIFJlcXVpcmVzIHtAbGluayBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24jV1JJVEVfSElTVE9SWV9CT09LTUFSS1N9CkBAIC01OTAsMzEgKzU3OSw5MCBAQAogICAgICAgICAgICAgICAgIC5idWxrUmVxdWVzdEljb25Gb3JQYWdlVXJsKGNyLCB3aGVyZSwgbGlzdGVuZXIpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIENvbHVtbiBkZWZpbml0aW9ucyBmb3IgdGhlIG1peGVkIGJvb2ttYXJrIGFuZCBoaXN0b3J5IGl0ZW1zIGF2YWlsYWJsZQorICAgICAqIGF0IHtAbGluayAjQk9PS01BUktTX1VSSX0uCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBCb29rbWFya0NvbHVtbnMgaW1wbGVtZW50cyBCYXNlQ29sdW1ucyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgVVJMIG9mIHRoZSBib29rbWFyayBvciBoaXN0b3J5IGl0ZW0uCisgICAgICAgICAqIDxwPlR5cGU6IFRFWFQgKFVSTCk8L3A+CisgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVUkwgPSAidXJsIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIG51bWJlciBvZiB0aW1lIHRoZSBpdGVtIGhhcyBiZWVuIHZpc2l0ZWQuCisgICAgICAgICAqIDxwPlR5cGU6IE5VTUJFUjwvcD4KKyAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZJU0lUUyA9ICJ2aXNpdHMiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgZGF0ZSB0aGUgaXRlbSB3YXMgbGFzdCB2aXNpdGVkLCBpbiBtaWxsaXNlY29uZHMgc2luY2UgdGhlIGVwb2NoLgorICAgICAgICAgKiA8cD5UeXBlOiBOVU1CRVIgKGRhdGUgaW4gbWlsbGlzZWNvbmRzIHNpbmNlIEphbnVhcnkgMSwgMTk3MCk8L3A+CisgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRFID0gImRhdGUiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBGbGFnIGluZGljYXRpbmcgdGhhdCBhbiBpdGVtIGlzIGEgYm9va21hcmsuIEEgdmFsdWUgb2YgMSBpbmRpY2F0ZXMgYSBib29rbWFyaywgYSB2YWx1ZQorICAgICAgICAgKiBvZiAwIGluZGljYXRlcyBhIGhpc3RvcnkgaXRlbS4KKyAgICAgICAgICogPHA+VHlwZTogSU5URUdFUiAoYm9vbGVhbik8L3A+CisgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCT09LTUFSSyA9ICJib29rbWFyayI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB1c2VyIHZpc2libGUgdGl0bGUgb2YgdGhlIGJvb2ttYXJrIG9yIGhpc3RvcnkgaXRlbS4KKyAgICAgICAgICogPHA+VHlwZTogVEVYVDwvcD4KKyAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRJVExFID0gInRpdGxlIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGRhdGUgdGhlIGl0ZW0gY3JlYXRlZCwgaW4gbWlsbGlzZWNvbmRzIHNpbmNlIHRoZSBlcG9jaC4KKyAgICAgICAgICogPHA+VHlwZTogTlVNQkVSIChkYXRlIGluIG1pbGxpc2Vjb25kcyBzaW5jZSBKYW51YXJ5IDEsIDE5NzApPC9wPgorICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1JFQVRFRCA9ICJjcmVhdGVkIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGZhdmljb24gb2YgdGhlIGJvb2ttYXJrLiBNdXN0IGRlY29kZSB2aWEge0BsaW5rIEJpdG1hcEZhY3RvcnkjZGVjb2RlQnl0ZUFycmF5fS4KKyAgICAgICAgICogPHA+VHlwZTogQkxPQiAoaW1hZ2UpPC9wPgorICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFWSUNPTiA9ICJmYXZpY29uIjsKKwogICAgICAgICAvKioKICAgICAgICAgICogQGhpZGUKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRIVU1CTkFJTCA9ICJ0aHVtYm5haWwiOworCiAgICAgICAgIC8qKgogICAgICAgICAgKiBAaGlkZQogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9VQ0hfSUNPTiA9ICJ0b3VjaF9pY29uIjsKKwogICAgICAgICAvKioKICAgICAgICAgICogQGhpZGUKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRVJfRU5URVJFRCA9ICJ1c2VyX2VudGVyZWQiOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIENvbHVtbiBkZWZpbml0aW9ucyBmb3IgdGhlIHNlYXJjaCBoaXN0b3J5IHRhYmxlLCBhdmFpbGFibGUgYXQge0BsaW5rICNTRUFSQ0hFU19VUkl9LgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU2VhcmNoQ29sdW1ucyBpbXBsZW1lbnRzIEJhc2VDb2x1bW5zIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIE5vdCB1c2VkLgorICAgICAgICAgKiBAZGVwcmVjYXRlZAorICAgICAgICAgKi8KKyAgICAgICAgQERlcHJlY2F0ZWQKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJMID0gInVybCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB1c2VyIGVudGVyZWQgc2VhcmNoIHRlcm0uCisgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRUFSQ0ggPSAic2VhcmNoIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGRhdGUgdGhlIHNlYXJjaCB3YXMgcGVyZm9ybWVkLCBpbiBtaWxsaXNlY29uZHMgc2luY2UgdGhlIGVwb2NoLgorICAgICAgICAgKiA8cD5UeXBlOiBOVU1CRVIgKGRhdGUgaW4gbWlsbGlzZWNvbmRzIHNpbmNlIEphbnVhcnkgMSwgMTk3MCk8L3A+CisgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRFID0gImRhdGUiOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL0Jyb3dzZXJDb250cmFjdC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvQnJvd3NlckNvbnRyYWN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJiYmU2OAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL0Jyb3dzZXJDb250cmFjdC5qYXZhCkBAIC0wLDAgKzEsMzg1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKKyAqLworCitwYWNrYWdlIGFuZHJvaWQucHJvdmlkZXI7CisKK2ltcG9ydCBhbmRyb2lkLmFjY291bnRzLkFjY291bnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRQcm92aWRlckNsaWVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFByb3ZpZGVyT3BlcmF0aW9uOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRVcmlzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwRmFjdG9yeTsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CitpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TeW5jU3RhdGVDb250cmFjdDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuUGFpcjsKKworLyoqCisgKiBAaGlkZQorICovCitwdWJsaWMgY2xhc3MgQnJvd3NlckNvbnRyYWN0IHsKKyAgICAvKiogVGhlIGF1dGhvcml0eSBmb3IgdGhlIGJyb3dzZXIgcHJvdmlkZXIgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVVRIT1JJVFkgPSAiY29tLmFuZHJvaWQuYnJvd3NlciI7CisKKyAgICAvKiogQSBjb250ZW50Oi8vIHN0eWxlIHVyaSB0byB0aGUgYXV0aG9yaXR5IGZvciB0aGUgYnJvd3NlciBwcm92aWRlciAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVXJpIEFVVEhPUklUWV9VUkkgPSBVcmkucGFyc2UoImNvbnRlbnQ6Ly8iICsgQVVUSE9SSVRZKTsKKworICAgIC8qKgorICAgICAqIEFuIG9wdGlvbmFsIGluc2VydCwgdXBkYXRlIG9yIGRlbGV0ZSBVUkkgcGFyYW1ldGVyIHRoYXQgYWxsb3dzIHRoZSBjYWxsZXIKKyAgICAgKiB0byBzcGVjaWZ5IHRoYXQgaXQgaXMgYSBzeW5jIGFkYXB0ZXIuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGZhbHNlLiBJZiB0cnVlCisgICAgICogdGhlIGRpcnR5IGZsYWcgaXMgbm90IGF1dG9tYXRpY2FsbHkgc2V0IGFuZCB0aGUgInN5bmNUb05ldHdvcmsiIHBhcmFtZXRlcgorICAgICAqIGlzIHNldCB0byBmYWxzZSB3aGVuIGNhbGxpbmcKKyAgICAgKiB7QGxpbmsgQ29udGVudFJlc29sdmVyI25vdGlmeUNoYW5nZShhbmRyb2lkLm5ldC5VcmksIGFuZHJvaWQuZGF0YWJhc2UuQ29udGVudE9ic2VydmVyLCBib29sZWFuKX0uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FMTEVSX0lTX1NZTkNBREFQVEVSID0gImNhbGxlcl9pc19zeW5jYWRhcHRlciI7CisKKyAgICAvKioKKyAgICAgKiBHZW5lcmljIGNvbHVtbnMgZm9yIHVzZSBieSBzeW5jIGFkYXB0ZXJzLiBUaGUgc3BlY2lmaWMgZnVuY3Rpb25zIG9mCisgICAgICogdGhlc2UgY29sdW1ucyBhcmUgcHJpdmF0ZSB0byB0aGUgc3luYyBhZGFwdGVyLiBPdGhlciBjbGllbnRzIG9mIHRoZSBBUEkKKyAgICAgKiBzaG91bGQgbm90IGF0dGVtcHQgdG8gZWl0aGVyIHJlYWQgb3Igd3JpdGUgdGhlc2UgY29sdW1ucy4KKyAgICAgKi8KKyAgICBpbnRlcmZhY2UgQmFzZVN5bmNDb2x1bW5zIHsKKyAgICAgICAgLyoqIEdlbmVyaWMgY29sdW1uIGZvciB1c2UgYnkgc3luYyBhZGFwdGVycy4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1lOQzEgPSAic3luYzEiOworICAgICAgICAvKiogR2VuZXJpYyBjb2x1bW4gZm9yIHVzZSBieSBzeW5jIGFkYXB0ZXJzLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTWU5DMiA9ICJzeW5jMiI7CisgICAgICAgIC8qKiBHZW5lcmljIGNvbHVtbiBmb3IgdXNlIGJ5IHN5bmMgYWRhcHRlcnMuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNZTkMzID0gInN5bmMzIjsKKyAgICAgICAgLyoqIEdlbmVyaWMgY29sdW1uIGZvciB1c2UgYnkgc3luYyBhZGFwdGVycy4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1lOQzQgPSAic3luYzQiOworICAgICAgICAvKiogR2VuZXJpYyBjb2x1bW4gZm9yIHVzZSBieSBzeW5jIGFkYXB0ZXJzLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTWU5DNSA9ICJzeW5jNSI7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVuaWVuY2UgZGVmaW5pdGlvbnMgZm9yIHVzZSBpbiBpbXBsZW1lbnRpbmcgY2hyb21lIGJvb2ttYXJrcyBzeW5jIGluIHRoZSBCb29rbWFya3MgdGFibGUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBDaHJvbWVTeW5jQ29sdW1ucyB7CisgICAgICAgIHByaXZhdGUgQ2hyb21lU3luY0NvbHVtbnMoKSB7fQorCisgICAgICAgIC8qKiBUaGUgc2VydmVyIHVuaXF1ZSBJRCBmb3IgYW4gaXRlbSAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWRVJfVU5JUVVFID0gQmFzZVN5bmNDb2x1bW5zLlNZTkMzOworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPTERFUl9OQU1FX1JPT1QgPSAiZ29vZ2xlX2Nocm9tZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPTERFUl9OQU1FX0JPT0tNQVJLUyA9ICJnb29nbGVfY2hyb21lX2Jvb2ttYXJrcyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPTERFUl9OQU1FX0JPT0tNQVJLU19CQVIgPSAiYm9va21hcmtfYmFyIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9MREVSX05BTUVfT1RIRVJfQk9PS01BUktTID0gIm90aGVyX2Jvb2ttYXJrcyI7CisgICAgICAgIAorICAgICAgICAvKiogVGhlIGNsaWVudCB1bmlxdWUgSUQgZm9yIGFuIGl0ZW0gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xJRU5UX1VOSVFVRSA9IEJhc2VTeW5jQ29sdW1ucy5TWU5DNDsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQ29sdW1ucyB0aGF0IGFwcGVhciB3aGVuIGVhY2ggcm93IG9mIGEgdGFibGUgYmVsb25ncyB0byBhIHNwZWNpZmljCisgICAgICogYWNjb3VudCwgaW5jbHVkaW5nIHN5bmMgaW5mb3JtYXRpb24gdGhhdCBhbiBhY2NvdW50IG1heSBuZWVkLgorICAgICAqLworICAgIGludGVyZmFjZSBTeW5jQ29sdW1ucyBleHRlbmRzIEJhc2VTeW5jQ29sdW1ucyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgbmFtZSBvZiB0aGUgYWNjb3VudCBpbnN0YW5jZSB0byB3aGljaCB0aGlzIHJvdyBiZWxvbmdzLCB3aGljaCB3aGVuIHBhaXJlZCB3aXRoCisgICAgICAgICAqIHtAbGluayAjQUNDT1VOVF9UWVBFfSBpZGVudGlmaWVzIGEgc3BlY2lmaWMgYWNjb3VudC4KKyAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDQ09VTlRfTkFNRSA9ICJhY2NvdW50X25hbWUiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgdHlwZSBvZiBhY2NvdW50IHRvIHdoaWNoIHRoaXMgcm93IGJlbG9uZ3MsIHdoaWNoIHdoZW4gcGFpcmVkIHdpdGgKKyAgICAgICAgICoge0BsaW5rICNBQ0NPVU5UX05BTUV9IGlkZW50aWZpZXMgYSBzcGVjaWZpYyBhY2NvdW50LgorICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNDT1VOVF9UWVBFID0gImFjY291bnRfdHlwZSI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFN0cmluZyB0aGF0IHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhpcyByb3cgdG8gaXRzIHNvdXJjZSBhY2NvdW50LgorICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09VUkNFX0lEID0gInNvdXJjZWlkIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVmVyc2lvbiBudW1iZXIgdGhhdCBpcyB1cGRhdGVkIHdoZW5ldmVyIHRoaXMgcm93IG9yIGl0cyByZWxhdGVkIGRhdGEKKyAgICAgICAgICogY2hhbmdlcy4KKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUjwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZFUlNJT04gPSAidmVyc2lvbiI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEZsYWcgaW5kaWNhdGluZyB0aGF0IHtAbGluayAjVkVSU0lPTn0gaGFzIGNoYW5nZWQsIGFuZCB0aGlzIHJvdyBuZWVkcworICAgICAgICAgKiB0byBiZSBzeW5jaHJvbml6ZWQgYnkgaXRzIG93bmluZyBhY2NvdW50LgorICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSIChib29sZWFuKTwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJUlRZID0gImRpcnR5IjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgQm9va21hcmtDb2x1bW5zIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB1bmlxdWUgSUQgZm9yIGEgcm93LgorICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSIChsb25nKTwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIF9JRCA9ICJfaWQiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgVVJMIG9mIHRoZSBib29rbWFyay4KKyAgICAgICAgICogPFA+VHlwZTogVEVYVCAoVVJMKTwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVSTCA9ICJ1cmwiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgdXNlciB2aXNpYmxlIHRpdGxlIG9mIHRoZSBib29rbWFyay4KKyAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRJVExFID0gInRpdGxlIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGZhdmljb24gb2YgdGhlIGJvb2ttYXJrLCBtYXkgYmUgTlVMTC4KKyAgICAgICAgICogTXVzdCBkZWNvZGUgdmlhIHtAbGluayBCaXRtYXBGYWN0b3J5I2RlY29kZUJ5dGVBcnJheX0uCisgICAgICAgICAqIDxwPlR5cGU6IEJMT0IgKGltYWdlKTwvcD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZBVklDT04gPSAiZmF2aWNvbiI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEEgdGh1bWJuYWlsIG9mIHRoZSBwYWdlLG1heSBiZSBOVUxMLgorICAgICAgICAgKiBNdXN0IGRlY29kZSB2aWEge0BsaW5rIEJpdG1hcEZhY3RvcnkjZGVjb2RlQnl0ZUFycmF5fS4KKyAgICAgICAgICogPHA+VHlwZTogQkxPQiAoaW1hZ2UpPC9wPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEhVTUJOQUlMID0gInRodW1ibmFpbCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB0b3VjaCBpY29uIGZvciB0aGUgd2ViIHBhZ2UsIG1heSBiZSBOVUxMLgorICAgICAgICAgKiBNdXN0IGRlY29kZSB2aWEge0BsaW5rIEJpdG1hcEZhY3RvcnkjZGVjb2RlQnl0ZUFycmF5fS4KKyAgICAgICAgICogPHA+VHlwZTogQkxPQiAoaW1hZ2UpPC9wPgorICAgICAgICAgKiBAaGlkZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9VQ0hfSUNPTiA9ICJ0b3VjaF9pY29uIjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgYm9va21hcmtzIHRhYmxlLCB3aGljaCBob2xkcyB0aGUgdXNlcidzIGJyb3dzZXIgYm9va21hcmtzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQm9va21hcmtzIGltcGxlbWVudHMgQm9va21hcmtDb2x1bW5zLCBTeW5jQ29sdW1ucyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGlzIHV0aWxpdHkgY2xhc3MgY2Fubm90IGJlIGluc3RhbnRpYXRlZC4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgQm9va21hcmtzKCkge30KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGNvbnRlbnQ6Ly8gc3R5bGUgVVJJIGZvciB0aGlzIHRhYmxlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVyaSBDT05URU5UX1VSSSA9IFVyaS53aXRoQXBwZW5kZWRQYXRoKEFVVEhPUklUWV9VUkksICJib29rbWFya3MiKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGNvbnRlbnQ6Ly8gc3R5bGUgVVJJIGZvciB0aGUgZGVmYXVsdCBmb2xkZXIKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVXJpIENPTlRFTlRfVVJJX0RFRkFVTFRfRk9MREVSID0KKyAgICAgICAgICAgICAgICBVcmkud2l0aEFwcGVuZGVkUGF0aChDT05URU5UX1VSSSwgImZvbGRlciIpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBCdWlsZHMgYSBVUkkgdGhhdCBwb2ludHMgdG8gYSBzcGVjaWZpYyBmb2xkZXIuCisgICAgICAgICAqIEBwYXJhbSBmb2xkZXJJZCB0aGUgSUQgb2YgdGhlIGZvbGRlciB0byBwb2ludCB0bworICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVcmkgYnVpbGRGb2xkZXJVcmkobG9uZyBmb2xkZXJJZCkgeworICAgICAgICAgICAgcmV0dXJuIENvbnRlbnRVcmlzLndpdGhBcHBlbmRlZElkKENPTlRFTlRfVVJJX0RFRkFVTFRfRk9MREVSLCBmb2xkZXJJZCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIE1JTUUgdHlwZSBvZiB7QGxpbmsgI0NPTlRFTlRfVVJJfSBwcm92aWRpbmcgYSBkaXJlY3Rvcnkgb2YgYm9va21hcmtzLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9UWVBFID0gInZuZC5hbmRyb2lkLmN1cnNvci5kaXIvYm9va21hcmsiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgTUlNRSB0eXBlIG9mIGEge0BsaW5rICNDT05URU5UX1VSSX0gb2YgYSBzaW5nbGUgYm9va21hcmsuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX0lURU1fVFlQRSA9ICJ2bmQuYW5kcm9pZC5jdXJzb3IuaXRlbS9ib29rbWFyayI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFF1ZXJ5IHBhcmFtZXRlciB0byB1c2UgaWYgeW91IHdhbnQgdG8gc2VlIGRlbGV0ZWQgYm9va21hcmtzIHRoYXQgYXJlIHN0aWxsCisgICAgICAgICAqIGFyb3VuZCBvbiB0aGUgZGV2aWNlIGFuZCBoYXZlbid0IGJlZW4gc3luY2VkIHlldC4KKyAgICAgICAgICogQHNlZSAjSVNfREVMRVRFRAorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFUllfUEFSQU1FVEVSX1NIT1dfREVMRVRFRCA9ICJzaG93X2RlbGV0ZWQiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBGbGFnIGluZGljYXRpbmcgaWYgYW4gaXRlbSBpcyBhIGZvbGRlciBvciBib29rbWFyay4gTm9uLXplcm8gdmFsdWVzIGluZGljYXRlCisgICAgICAgICAqIGEgZm9sZGVyIGFuZCB6ZXJvIGluZGljYXRlcyBhIGJvb2ttYXJrLgorICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSIChib29sZWFuKTwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElTX0ZPTERFUiA9ICJmb2xkZXIiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgSUQgb2YgdGhlIHBhcmVudCBmb2xkZXIuIElEIDAgaXMgdGhlIHJvb3QgZm9sZGVyLgorICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSIChyZWZlcmVuY2UgdG8gaXRlbSBpbiB0aGUgc2FtZSB0YWJsZSk8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJFTlQgPSAicGFyZW50IjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHBvc2l0aW9uIG9mIHRoZSBib29rbWFyayBpbiByZWxhdGlvbiB0byBpdCdzIHNpYmxpbmdzIHRoYXQgc2hhcmUgdGhlIHNhbWUKKyAgICAgICAgICoge0BsaW5rICNQQVJFTlR9LiBNYXkgYmUgbmVnYXRpdmUuCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVI8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQT1NJVElPTiA9ICJwb3NpdGlvbiI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBpdGVtIHRoYXQgdGhlIGJvb2ttYXJrIHNob3VsZCBiZSBpbnNlcnRlZCBhZnRlci4KKyAgICAgICAgICogTWF5IGJlIG5lZ2F0aXZlLgorICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5TRVJUX0FGVEVSID0gImluc2VydF9hZnRlciI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEEgZmxhZyB0byBpbmRpY2F0ZSBpZiBhbiBpdGVtIGhhcyBiZWVuIGRlbGV0ZWQuIFF1ZXJpZXMgd2lsbCBub3QgcmV0dXJuIGRlbGV0ZWQKKyAgICAgICAgICogZW50cmllcyB1bmxlc3MgeW91IGFkZCB0aGUge0BsaW5rICNRVUVSWV9QQVJBTUVURVJfU0hPV19ERUxFVEVEfSBxdWVyeSBwYXJhbXRlcgorICAgICAgICAgKiB0byB0aGUgVVJJIHdoZW4gcGVyZm9ybWluZyB5b3VyIHF1ZXJ5LgorICAgICAgICAgKiA8cD5UeXBlOiBJTlRFR0VSIChub24temVybyBpZiB0aGUgaXRlbSBoYXMgYmVlbiBkZWxldGVkLCB6ZXJvIGlmIGl0IGhhc24ndCkKKyAgICAgICAgICogQHNlZSAjUVVFUllfUEFSQU1FVEVSX1NIT1dfREVMRVRFRAorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSVNfREVMRVRFRCA9ICJkZWxldGVkIjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgaGlzdG9yeSB0YWJsZSwgd2hpY2ggaG9sZHMgdGhlIGJyb3dzaW5nIGhpc3RvcnkuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBIaXN0b3J5IGltcGxlbWVudHMgQm9va21hcmtDb2x1bW5zIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoaXMgdXRpbGl0eSBjbGFzcyBjYW5ub3QgYmUgaW5zdGFudGlhdGVkLgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBIaXN0b3J5KCkge30KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGNvbnRlbnQ6Ly8gc3R5bGUgVVJJIGZvciB0aGlzIHRhYmxlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVyaSBDT05URU5UX1VSSSA9IFVyaS53aXRoQXBwZW5kZWRQYXRoKEFVVEhPUklUWV9VUkksICJoaXN0b3J5Iik7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBNSU1FIHR5cGUgb2Yge0BsaW5rICNDT05URU5UX1VSSX0gcHJvdmlkaW5nIGEgZGlyZWN0b3J5IG9mIGJyb3dzZXIgaGlzdG9yeSBpdGVtcy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlRfVFlQRSA9ICJ2bmQuYW5kcm9pZC5jdXJzb3IuZGlyL2Jyb3dzZXItaGlzdG9yeSI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBNSU1FIHR5cGUgb2YgYSB7QGxpbmsgI0NPTlRFTlRfVVJJfSBvZiBhIHNpbmdsZSBicm93c2VyIGhpc3RvcnkgaXRlbS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlRfSVRFTV9UWVBFID0gInZuZC5hbmRyb2lkLmN1cnNvci5pdGVtL2Jyb3dzZXItaGlzdG9yeSI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBkYXRlIHRoZSBpdGVtIHdhcyBsYXN0IHZpc2l0ZWQsIGluIG1pbGxpc2Vjb25kcyBzaW5jZSB0aGUgZXBvY2guCisgICAgICAgICAqIDxwPlR5cGU6IElOVEVHRVIgKGRhdGUgaW4gbWlsbGlzZWNvbmRzIHNpbmNlIEphbnVhcnkgMSwgMTk3MCk8L3A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRFX0xBU1RfVklTSVRFRCA9ICJkYXRlIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGRhdGUgdGhlIGl0ZW0gY3JlYXRlZCwgaW4gbWlsbGlzZWNvbmRzIHNpbmNlIHRoZSBlcG9jaC4KKyAgICAgICAgICogPHA+VHlwZTogTlVNQkVSIChkYXRlIGluIG1pbGxpc2Vjb25kcyBzaW5jZSBKYW51YXJ5IDEsIDE5NzApPC9wPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFURV9DUkVBVEVEID0gImNyZWF0ZWQiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBpdGVtIGhhcyBiZWVuIHZpc2l0ZWQuCisgICAgICAgICAqIDxwPlR5cGU6IElOVEVHRVI8L3A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWSVNJVFMgPSAidmlzaXRzIjsKKworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VSX0VOVEVSRUQgPSAidXNlcl9lbnRlcmVkIjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgc2VhcmNoIGhpc3RvcnkgdGFibGUuCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFNlYXJjaGVzIHsKKyAgICAgICAgcHJpdmF0ZSBTZWFyY2hlcygpIHt9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBjb250ZW50Oi8vIHN0eWxlIFVSSSBmb3IgdGhpcyB0YWJsZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVcmkgQ09OVEVOVF9VUkkgPSBVcmkud2l0aEFwcGVuZGVkUGF0aChBVVRIT1JJVFlfVVJJLCAic2VhcmNoZXMiKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIE1JTUUgdHlwZSBvZiB7QGxpbmsgI0NPTlRFTlRfVVJJfSBwcm92aWRpbmcgYSBkaXJlY3Rvcnkgb2YgYnJvd3NlciBzZWFyY2ggaXRlbXMuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX1RZUEUgPSAidm5kLmFuZHJvaWQuY3Vyc29yLmRpci9zZWFyY2hlcyI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBNSU1FIHR5cGUgb2YgYSB7QGxpbmsgI0NPTlRFTlRfVVJJfSBvZiBhIHNpbmdsZSBicm93c2VyIHNlYXJjaCBpdGVtLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9JVEVNX1RZUEUgPSAidm5kLmFuZHJvaWQuY3Vyc29yLml0ZW0vc2VhcmNoZXMiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgdW5pcXVlIElEIGZvciBhIHJvdy4KKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAobG9uZyk8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBfSUQgPSAiX2lkIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHVzZXIgZW50ZXJlZCBzZWFyY2ggdGVybS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFQVJDSCA9ICJzZWFyY2giOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgZGF0ZSB0aGUgc2VhcmNoIHdhcyBwZXJmb3JtZWQsIGluIG1pbGxpc2Vjb25kcyBzaW5jZSB0aGUgZXBvY2guCisgICAgICAgICAqIDxwPlR5cGU6IE5VTUJFUiAoZGF0ZSBpbiBtaWxsaXNlY29uZHMgc2luY2UgSmFudWFyeSAxLCAxOTcwKTwvcD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEUgPSAiZGF0ZSI7CisgICAgfQorCisgICAgLyoqCisgICAgICogQSB0YWJsZSBwcm92aWRlZCBmb3Igc3luYyBhZGFwdGVycyB0byB1c2UgZm9yIHN0b3JpbmcgcHJpdmF0ZSBzeW5jIHN0YXRlIGRhdGEuCisgICAgICoKKyAgICAgKiBAc2VlIFN5bmNTdGF0ZUNvbnRyYWN0CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBTeW5jU3RhdGUgaW1wbGVtZW50cyBTeW5jU3RhdGVDb250cmFjdC5Db2x1bW5zIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoaXMgdXRpbGl0eSBjbGFzcyBjYW5ub3QgYmUgaW5zdGFudGlhdGVkCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIFN5bmNTdGF0ZSgpIHt9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9ESVJFQ1RPUlkgPQorICAgICAgICAgICAgICAgIFN5bmNTdGF0ZUNvbnRyYWN0LkNvbnN0YW50cy5DT05URU5UX0RJUkVDVE9SWTsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGNvbnRlbnQ6Ly8gc3R5bGUgVVJJIGZvciB0aGlzIHRhYmxlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVyaSBDT05URU5UX1VSSSA9CisgICAgICAgICAgICAgICAgVXJpLndpdGhBcHBlbmRlZFBhdGgoQVVUSE9SSVRZX1VSSSwgQ09OVEVOVF9ESVJFQ1RPUlkpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIGFuZHJvaWQucHJvdmlkZXIuU3luY1N0YXRlQ29udHJhY3QuSGVscGVycyNnZXQKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgYnl0ZVtdIGdldChDb250ZW50UHJvdmlkZXJDbGllbnQgcHJvdmlkZXIsIEFjY291bnQgYWNjb3VudCkKKyAgICAgICAgICAgICAgICB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJldHVybiBTeW5jU3RhdGVDb250cmFjdC5IZWxwZXJzLmdldChwcm92aWRlciwgQ09OVEVOVF9VUkksIGFjY291bnQpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgYW5kcm9pZC5wcm92aWRlci5TeW5jU3RhdGVDb250cmFjdC5IZWxwZXJzI2dldAorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBQYWlyPFVyaSwgYnl0ZVtdPiBnZXRXaXRoVXJpKENvbnRlbnRQcm92aWRlckNsaWVudCBwcm92aWRlciwgQWNjb3VudCBhY2NvdW50KQorICAgICAgICAgICAgICAgIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgICAgICAgICAgcmV0dXJuIFN5bmNTdGF0ZUNvbnRyYWN0LkhlbHBlcnMuZ2V0V2l0aFVyaShwcm92aWRlciwgQ09OVEVOVF9VUkksIGFjY291bnQpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgYW5kcm9pZC5wcm92aWRlci5TeW5jU3RhdGVDb250cmFjdC5IZWxwZXJzI3NldAorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldChDb250ZW50UHJvdmlkZXJDbGllbnQgcHJvdmlkZXIsIEFjY291bnQgYWNjb3VudCwgYnl0ZVtdIGRhdGEpCisgICAgICAgICAgICAgICAgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgICAgICAgICBTeW5jU3RhdGVDb250cmFjdC5IZWxwZXJzLnNldChwcm92aWRlciwgQ09OVEVOVF9VUkksIGFjY291bnQsIGRhdGEpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgYW5kcm9pZC5wcm92aWRlci5TeW5jU3RhdGVDb250cmFjdC5IZWxwZXJzI25ld1NldE9wZXJhdGlvbgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBDb250ZW50UHJvdmlkZXJPcGVyYXRpb24gbmV3U2V0T3BlcmF0aW9uKEFjY291bnQgYWNjb3VudCwgYnl0ZVtdIGRhdGEpIHsKKyAgICAgICAgICAgIHJldHVybiBTeW5jU3RhdGVDb250cmFjdC5IZWxwZXJzLm5ld1NldE9wZXJhdGlvbihDT05URU5UX1VSSSwgYWNjb3VudCwgZGF0YSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9DYWxlbmRhci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvQ2FsZW5kYXIuamF2YQppbmRleCA5YTA5ODA1Li5hNjM5NGU1IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9DYWxlbmRhci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL0NhbGVuZGFyLmphdmEKQEAgLTc2LDExICs3NiwxMDYgQEAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQUxMRVJfSVNfU1lOQ0FEQVBURVIgPSAiY2FsbGVyX2lzX3N5bmNhZGFwdGVyIjsKIAorCisgICAgLyoqCisgICAgICogR2VuZXJpYyBjb2x1bW5zIGZvciB1c2UgYnkgc3luYyBhZGFwdGVycy4gVGhlIHNwZWNpZmljIGZ1bmN0aW9ucyBvZgorICAgICAqIHRoZXNlIGNvbHVtbnMgYXJlIHByaXZhdGUgdG8gdGhlIHN5bmMgYWRhcHRlci4gT3RoZXIgY2xpZW50cyBvZiB0aGUgQVBJCisgICAgICogc2hvdWxkIG5vdCBhdHRlbXB0IHRvIGVpdGhlciByZWFkIG9yIHdyaXRlIHRoaXMgY29sdW1uLgorICAgICAqLworICAgIHByb3RlY3RlZCBpbnRlcmZhY2UgQmFzZVN5bmNDb2x1bW5zIHsKKworICAgICAgICAvKiogR2VuZXJpYyBjb2x1bW4gZm9yIHVzZSBieSBzeW5jIGFkYXB0ZXJzLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTWU5DMSA9ICJzeW5jMSI7CisgICAgICAgIC8qKiBHZW5lcmljIGNvbHVtbiBmb3IgdXNlIGJ5IHN5bmMgYWRhcHRlcnMuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNZTkMyID0gInN5bmMyIjsKKyAgICAgICAgLyoqIEdlbmVyaWMgY29sdW1uIGZvciB1c2UgYnkgc3luYyBhZGFwdGVycy4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1lOQzMgPSAic3luYzMiOworICAgICAgICAvKiogR2VuZXJpYyBjb2x1bW4gZm9yIHVzZSBieSBzeW5jIGFkYXB0ZXJzLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTWU5DNCA9ICJzeW5jNCI7CisgICAgICAgIC8qKiBHZW5lcmljIGNvbHVtbiBmb3IgdXNlIGJ5IHN5bmMgYWRhcHRlcnMuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNZTkM1ID0gInN5bmM1IjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb2x1bW5zIGZvciBTeW5jIGluZm9ybWF0aW9uIHVzZWQgYnkgQ2FsZW5kYXJzIGFuZCBFdmVudHMgdGFibGVzLgorICAgICAqLworICAgIHB1YmxpYyBpbnRlcmZhY2UgU3luY0NvbHVtbnMgZXh0ZW5kcyBCYXNlU3luY0NvbHVtbnMgeworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGFjY291bnQgdGhhdCB3YXMgdXNlZCB0byBzeW5jIHRoZSBlbnRyeSB0byB0aGUgZGV2aWNlLgorICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgX1NZTkNfQUNDT1VOVCA9ICJfc3luY19hY2NvdW50IjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHR5cGUgb2YgdGhlIGFjY291bnQgdGhhdCB3YXMgdXNlZCB0byBzeW5jIHRoZSBlbnRyeSB0byB0aGUgZGV2aWNlLgorICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgX1NZTkNfQUNDT1VOVF9UWVBFID0gIl9zeW5jX2FjY291bnRfdHlwZSI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB1bmlxdWUgSUQgZm9yIGEgcm93IGFzc2lnbmVkIGJ5IHRoZSBzeW5jIHNvdXJjZS4gTlVMTCBpZiB0aGUgcm93IGhhcyBuZXZlciBiZWVuIHN5bmNlZC4KKyAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIF9TWU5DX0lEID0gIl9zeW5jX2lkIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGxhc3QgdGltZSwgZnJvbSB0aGUgc3luYyBzb3VyY2UncyBwb2ludCBvZiB2aWV3LCB0aGF0IHRoaXMgcm93IGhhcyBiZWVuIHN5bmNocm9uaXplZC4KKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAobG9uZyk8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBfU1lOQ19USU1FID0gIl9zeW5jX3RpbWUiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgdmVyc2lvbiBvZiB0aGUgcm93LCBhcyBhc3NpZ25lZCBieSB0aGUgc2VydmVyLgorICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgX1NZTkNfVkVSU0lPTiA9ICJfc3luY192ZXJzaW9uIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogRm9yIHVzZSBieSBzeW5jIGFkYXB0ZXIgYXQgaXRzIGRpc2NyZXRpb247IG5vdCBtb2RpZmllZCBieSBDYWxlbmRhclByb3ZpZGVyCisgICAgICAgICAqIE5vdGUgdGhhdCB0aGlzIGNvbHVtbiB3YXMgZm9ybWVybHkgbmFtZWQgX1NZTkNfTE9DQUxfSUQuICBXZSBhcmUgdXNpbmcgaXQgdG8gYXZvaWQgYQorICAgICAgICAgKiBzY2hlbWEgY2hhbmdlLgorICAgICAgICAgKiBUT0RPIFJlcGxhY2UgdGhpcyB3aXRoIHNvbWV0aGluZyBtb3JlIGdlbmVyYWwgaW4gdGhlIGZ1dHVyZS4KKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAobG9uZyk8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBfU1lOQ19EQVRBID0gIl9zeW5jX2xvY2FsX2lkIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVXNlZCBvbmx5IGluIHBlcnNpc3RlbnQgcHJvdmlkZXJzLCBhbmQgb25seSBkdXJpbmcgbWVyZ2luZy4KKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAobG9uZyk8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBfU1lOQ19NQVJLID0gIl9zeW5jX21hcmsiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBVc2VkIHRvIGluZGljYXRlIHRoYXQgbG9jYWwsIHVuc3luY2VkLCBjaGFuZ2VzIGFyZSBwcmVzZW50LgorICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSIChsb25nKTwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIF9TWU5DX0RJUlRZID0gIl9zeW5jX2RpcnR5IjsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbHVtbnMgZnJvbSB0aGUgQWNjb3VudCBpbmZvcm1hdGlvbiB1c2VkIGJ5IENhbGVuZGFycyBhbmQgRXZlbnRzIHRhYmxlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50ZXJmYWNlIEFjY291bnRDb2x1bW5zIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBuYW1lIG9mIHRoZSBhY2NvdW50IGluc3RhbmNlIHRvIHdoaWNoIHRoaXMgcm93IGJlbG9uZ3MsIHdoaWNoIHdoZW4gcGFpcmVkIHdpdGgKKyAgICAgICAgICoge0BsaW5rICNBQ0NPVU5UX1RZUEV9IGlkZW50aWZpZXMgYSBzcGVjaWZpYyBhY2NvdW50LgorICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNDT1VOVF9OQU1FID0gImFjY291bnRfbmFtZSI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB0eXBlIG9mIGFjY291bnQgdG8gd2hpY2ggdGhpcyByb3cgYmVsb25ncywgd2hpY2ggd2hlbiBwYWlyZWQgd2l0aAorICAgICAgICAgKiB7QGxpbmsgI0FDQ09VTlRfTkFNRX0gaWRlbnRpZmllcyBhIHNwZWNpZmljIGFjY291bnQuCisgICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ0NPVU5UX1RZUEUgPSAiYWNjb3VudF90eXBlIjsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBDb2x1bW5zIGZyb20gdGhlIENhbGVuZGFycyB0YWJsZSB0aGF0IG90aGVyIHRhYmxlcyBqb2luIGludG8gdGhlbXNlbHZlcy4KICAgICAgKi8KLSAgICBwdWJsaWMgaW50ZXJmYWNlIENhbGVuZGFyc0NvbHVtbnMKLSAgICB7CisgICAgcHVibGljIGludGVyZmFjZSBDYWxlbmRhcnNDb2x1bW5zIHsKICAgICAgICAgLyoqCiAgICAgICAgICAqIFRoZSBjb2xvciBvZiB0aGUgY2FsZW5kYXIKICAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAoY29sb3IgdmFsdWUpPC9QPgpAQCAtMTM1LDc1ICsyMzAsMTAzIEBACiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNZTkNfU1RBVEUgPSAic3luY19zdGF0ZSI7CiAKICAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBhY2NvdW50IHRoYXQgd2FzIHVzZWQgdG8gc3luYyB0aGUgZW50cnkgdG8gdGhlIGRldmljZS4KLSAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KKyAgICAgICAgICogV2hldGhlciB0aGUgcm93IGhhcyBiZWVuIGRlbGV0ZWQuICBBIGRlbGV0ZWQgcm93IHNob3VsZCBiZSBpZ25vcmVkLgorICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSIChib29sZWFuKTwvUD4KICAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIF9TWU5DX0FDQ09VTlQgPSAiX3N5bmNfYWNjb3VudCI7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSB0eXBlIG9mIHRoZSBhY2NvdW50IHRoYXQgd2FzIHVzZWQgdG8gc3luYyB0aGUgZW50cnkgdG8gdGhlIGRldmljZS4KLSAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIF9TWU5DX0FDQ09VTlRfVFlQRSA9ICJfc3luY19hY2NvdW50X3R5cGUiOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgdW5pcXVlIElEIGZvciBhIHJvdyBhc3NpZ25lZCBieSB0aGUgc3luYyBzb3VyY2UuIE5VTEwgaWYgdGhlIHJvdyBoYXMgbmV2ZXIgYmVlbiBzeW5jZWQuCi0gICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBfU1lOQ19JRCA9ICJfc3luY19pZCI7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBsYXN0IHRpbWUsIGZyb20gdGhlIHN5bmMgc291cmNlJ3MgcG9pbnQgb2YgdmlldywgdGhhdCB0aGlzIHJvdyBoYXMgYmVlbiBzeW5jaHJvbml6ZWQuCi0gICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVIgKGxvbmcpPC9QPgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgX1NZTkNfVElNRSA9ICJfc3luY190aW1lIjsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIHZlcnNpb24gb2YgdGhlIHJvdywgYXMgYXNzaWduZWQgYnkgdGhlIHNlcnZlci4KLSAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIF9TWU5DX1ZFUlNJT04gPSAiX3N5bmNfdmVyc2lvbiI7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEZvciB1c2UgYnkgc3luYyBhZGFwdGVyIGF0IGl0cyBkaXNjcmV0aW9uOyBub3QgbW9kaWZpZWQgYnkgQ2FsZW5kYXJQcm92aWRlcgotICAgICAgICAgKiBOb3RlIHRoYXQgdGhpcyBjb2x1bW4gd2FzIGZvcm1lcmx5IG5hbWVkIF9TWU5DX0xPQ0FMX0lELiAgV2UgYXJlIHVzaW5nIGl0IHRvIGF2b2lkIGEKLSAgICAgICAgICogc2NoZW1hIGNoYW5nZS4KLSAgICAgICAgICogVE9ETyBSZXBsYWNlIHRoaXMgd2l0aCBzb21ldGhpbmcgbW9yZSBnZW5lcmFsIGluIHRoZSBmdXR1cmUuCi0gICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVIgKGxvbmcpPC9QPgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgX1NZTkNfREFUQSA9ICJfc3luY19sb2NhbF9pZCI7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFVzZWQgb25seSBpbiBwZXJzaXN0ZW50IHByb3ZpZGVycywgYW5kIG9ubHkgZHVyaW5nIG1lcmdpbmcuCi0gICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVIgKGxvbmcpPC9QPgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgX1NZTkNfTUFSSyA9ICJfc3luY19tYXJrIjsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVXNlZCB0byBpbmRpY2F0ZSB0aGF0IGxvY2FsLCB1bnN5bmNlZCwgY2hhbmdlcyBhcmUgcHJlc2VudC4KLSAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAobG9uZyk8L1A+Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBfU1lOQ19ESVJUWSA9ICJfc3luY19kaXJ0eSI7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBuYW1lIG9mIHRoZSBhY2NvdW50IGluc3RhbmNlIHRvIHdoaWNoIHRoaXMgcm93IGJlbG9uZ3MsIHdoaWNoIHdoZW4gcGFpcmVkIHdpdGgKLSAgICAgICAgICoge0BsaW5rICNBQ0NPVU5UX1RZUEV9IGlkZW50aWZpZXMgYSBzcGVjaWZpYyBhY2NvdW50LgotICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNDT1VOVF9OQU1FID0gImFjY291bnRfbmFtZSI7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSB0eXBlIG9mIGFjY291bnQgdG8gd2hpY2ggdGhpcyByb3cgYmVsb25ncywgd2hpY2ggd2hlbiBwYWlyZWQgd2l0aAotICAgICAgICAgKiB7QGxpbmsgI0FDQ09VTlRfTkFNRX0gaWRlbnRpZmllcyBhIHNwZWNpZmljIGFjY291bnQuCi0gICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ0NPVU5UX1RZUEUgPSAiYWNjb3VudF90eXBlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVMRVRFRCA9ICJkZWxldGVkIjsKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBDbGFzcyB0aGF0IHJlcHJlc2VudHMgYSBDYWxlbmRhciBFbnRpdHkuIFRoZXJlIGlzIG9uZSBlbnRyeSBwZXIgY2FsZW5kYXIuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDYWxlbmRhcnNFbnRpdHkgaW1wbGVtZW50cyBCYXNlQ29sdW1ucywgU3luY0NvbHVtbnMsIENhbGVuZGFyc0NvbHVtbnMgeworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVXJpIENPTlRFTlRfVVJJID0gVXJpLnBhcnNlKCJjb250ZW50Oi8vIiArIEFVVEhPUklUWSArCisgICAgICAgICAgICAgICAgIi9jYWxlbmRhcl9lbnRpdGllcyIpOworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgRW50aXR5SXRlcmF0b3IgbmV3RW50aXR5SXRlcmF0b3IoQ3Vyc29yIGN1cnNvciwgQ29udGVudFJlc29sdmVyIHJlc29sdmVyKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEVudGl0eUl0ZXJhdG9ySW1wbChjdXJzb3IsIHJlc29sdmVyKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgRW50aXR5SXRlcmF0b3IgbmV3RW50aXR5SXRlcmF0b3IoQ3Vyc29yIGN1cnNvciwKKyAgICAgICAgICAgICAgICBDb250ZW50UHJvdmlkZXJDbGllbnQgcHJvdmlkZXIpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgRW50aXR5SXRlcmF0b3JJbXBsKGN1cnNvciwgcHJvdmlkZXIpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRW50aXR5SXRlcmF0b3JJbXBsIGV4dGVuZHMgQ3Vyc29yRW50aXR5SXRlcmF0b3IgeworICAgICAgICAgICAgcHJpdmF0ZSBmaW5hbCBDb250ZW50UmVzb2x2ZXIgbVJlc29sdmVyOworICAgICAgICAgICAgcHJpdmF0ZSBmaW5hbCBDb250ZW50UHJvdmlkZXJDbGllbnQgbVByb3ZpZGVyOworCisgICAgICAgICAgICBwdWJsaWMgRW50aXR5SXRlcmF0b3JJbXBsKEN1cnNvciBjdXJzb3IsIENvbnRlbnRSZXNvbHZlciByZXNvbHZlcikgeworICAgICAgICAgICAgICAgIHN1cGVyKGN1cnNvcik7CisgICAgICAgICAgICAgICAgbVJlc29sdmVyID0gcmVzb2x2ZXI7CisgICAgICAgICAgICAgICAgbVByb3ZpZGVyID0gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIEVudGl0eUl0ZXJhdG9ySW1wbChDdXJzb3IgY3Vyc29yLCBDb250ZW50UHJvdmlkZXJDbGllbnQgcHJvdmlkZXIpIHsKKyAgICAgICAgICAgICAgICBzdXBlcihjdXJzb3IpOworICAgICAgICAgICAgICAgIG1SZXNvbHZlciA9IG51bGw7CisgICAgICAgICAgICAgICAgbVByb3ZpZGVyID0gcHJvdmlkZXI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIEVudGl0eSBnZXRFbnRpdHlBbmRJbmNyZW1lbnRDdXJzb3IoQ3Vyc29yIGN1cnNvcikgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgLy8gd2UgZXhwZWN0IHRoZSBjdXJzb3IgaXMgYWxyZWFkeSBhdCB0aGUgcm93IHdlIG5lZWQgdG8gcmVhZCBmcm9tCisgICAgICAgICAgICAgICAgZmluYWwgbG9uZyBjYWxlbmRhcklkID0gY3Vyc29yLmdldExvbmcoY3Vyc29yLmdldENvbHVtbkluZGV4T3JUaHJvdyhfSUQpKTsKKworICAgICAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgY29udGVudCB2YWx1ZQorICAgICAgICAgICAgICAgIENvbnRlbnRWYWx1ZXMgY3YgPSBuZXcgQ29udGVudFZhbHVlcygpOworICAgICAgICAgICAgICAgIGN2LnB1dChfSUQsIGNhbGVuZGFySWQpOworCisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgX1NZTkNfQUNDT1VOVCk7CisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgX1NZTkNfQUNDT1VOVF9UWVBFKTsKKworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yU3RyaW5nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIF9TWU5DX0lEKTsKKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvclN0cmluZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBfU1lOQ19WRVJTSU9OKTsKKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvclN0cmluZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBfU1lOQ19USU1FKTsKKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvclN0cmluZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBfU1lOQ19EQVRBKTsKKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvckxvbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgX1NZTkNfRElSVFkpOworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yTG9uZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBfU1lOQ19NQVJLKTsKKworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yU3RyaW5nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIENhbGVuZGFycy5TWU5DMSk7CisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgQ2FsZW5kYXJzLlNZTkMyKTsKKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvclN0cmluZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBDYWxlbmRhcnMuU1lOQzMpOworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yU3RyaW5nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIENhbGVuZGFycy5TWU5DNCk7CisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgQ2FsZW5kYXJzLlNZTkM1KTsKKworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yU3RyaW5nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIENhbGVuZGFycy5OQU1FKTsKKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvclN0cmluZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LAorICAgICAgICAgICAgICAgICAgICAgICAgQ2FsZW5kYXJzLkRJU1BMQVlfTkFNRSk7CisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JJbnRUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgQ2FsZW5kYXJzLkNPTE9SKTsKKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvckludFRvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBBQ0NFU1NfTEVWRUwpOworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29ySW50VG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIFNFTEVDVEVEKTsKKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvckludFRvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBTWU5DX0VWRU5UUyk7CisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgQ2FsZW5kYXJzLkxPQ0FUSU9OKTsKKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvclN0cmluZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBUSU1FWk9ORSk7CisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwKKyAgICAgICAgICAgICAgICAgICAgICAgIENhbGVuZGFycy5PV05FUl9BQ0NPVU5UKTsKKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvckludFRvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LAorICAgICAgICAgICAgICAgICAgICAgICAgQ2FsZW5kYXJzLk9SR0FOSVpFUl9DQU5fUkVTUE9ORCk7CisKKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvckludFRvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBERUxFVEVEKTsKKworICAgICAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgRW50aXR5IGZyb20gdGhlIENvbnRlbnRWYWx1ZQorICAgICAgICAgICAgICAgIEVudGl0eSBlbnRpdHkgPSBuZXcgRW50aXR5KGN2KTsKKworICAgICAgICAgICAgICAgIC8vIFNldCBjdXJzb3IgdG8gbmV4dCByb3cKKyAgICAgICAgICAgICAgICBjdXJzb3IubW92ZVRvTmV4dCgpOworCisgICAgICAgICAgICAgICAgLy8gUmV0dXJuIHRoZSBjcmVhdGVkIEVudGl0eQorICAgICAgICAgICAgICAgIHJldHVybiBlbnRpdHk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgfQorCisgICAgLyoqCiAgICAgICogQ29udGFpbnMgYSBsaXN0IG9mIGF2YWlsYWJsZSBjYWxlbmRhcnMuCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBDYWxlbmRhcnMgaW1wbGVtZW50cyBCYXNlQ29sdW1ucywgQ2FsZW5kYXJzQ29sdW1ucworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ2FsZW5kYXJzIGltcGxlbWVudHMgQmFzZUNvbHVtbnMsIFN5bmNDb2x1bW5zLCBBY2NvdW50Q29sdW1ucywKKyAgICAgICAgICAgIENhbGVuZGFyc0NvbHVtbnMKICAgICB7CiAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXSEVSRV9ERUxFVEVfRk9SX0FDQ09VTlQgPSBDYWxlbmRhcnMuX1NZTkNfQUNDT1VOVCArICI9PyIKICAgICAgICAgICAgICAgICArICIgQU5EICIgKyBDYWxlbmRhcnMuX1NZTkNfQUNDT1VOVF9UWVBFICsgIj0/IjsKQEAgLTI1OCw2ICszODEsMjQgQEAKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJMID0gInVybCI7CiAKICAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBVUkwgZm9yIHRoZSBjYWxlbmRhciBpdHNlbGYKKyAgICAgICAgICogPFA+VHlwZTogVEVYVCAoVVJMKTwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFTEZfVVJMID0gInNlbGZVcmwiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgVVJMIGZvciB0aGUgY2FsZW5kYXIgdG8gYmUgZWRpdGVkCisgICAgICAgICAqIDxQPlR5cGU6IFRFWFQgKFVSTCk8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFRElUX1VSTCA9ICJlZGl0VXJsIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIFVSTCBmb3IgdGhlIGNhbGVuZGFyIGV2ZW50cworICAgICAgICAgKiA8UD5UeXBlOiBURVhUIChVUkwpPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVZFTlRTX1VSTCA9ICJldmVudHNVcmwiOworCisgICAgICAgIC8qKgogICAgICAgICAgKiBUaGUgbmFtZSBvZiB0aGUgY2FsZW5kYXIKICAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KICAgICAgICAgICovCkBAIC0yNzYsMTIgKzQxNyw2IEBACiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExPQ0FUSU9OID0gImxvY2F0aW9uIjsKIAogICAgICAgICAvKioKLSAgICAgICAgICogU2hvdWxkIHRoZSBjYWxlbmRhciBiZSBoaWRkZW4gaW4gdGhlIGNhbGVuZGFyIHNlbGVjdGlvbiBwYW5lbD8KLSAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAoYm9vbGVhbik8L1A+Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBISURERU4gPSAiaGlkZGVuIjsKLQotICAgICAgICAvKioKICAgICAgICAgICogVGhlIG93bmVyIGFjY291bnQgZm9yIHRoaXMgY2FsZW5kYXIsIGJhc2VkIG9uIHRoZSBjYWxlbmRhciBmZWVkLgogICAgICAgICAgKiBUaGlzIHdpbGwgYmUgZGlmZmVyZW50IGZyb20gdGhlIF9TWU5DX0FDQ09VTlQgZm9yIGRlbGVnYXRlZCBjYWxlbmRhcnMuCiAgICAgICAgICAqIDxQPlR5cGU6IFN0cmluZzwvUD4KQEAgLTI5Niw2ICs0MzEsOSBAQAogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUkdBTklaRVJfQ0FOX1JFU1BPTkQgPSAib3JnYW5pemVyQ2FuUmVzcG9uZCI7CiAgICAgfQogCisgICAgLyoqCisgICAgICogQ29sdW1ucyBmcm9tIHRoZSBBdHRlbmRlZXMgdGFibGUgdGhhdCBvdGhlciB0YWJsZXMgam9pbiBpbnRvIHRoZW1zZWx2ZXMuCisgICAgICovCiAgICAgcHVibGljIGludGVyZmFjZSBBdHRlbmRlZXNDb2x1bW5zIHsKIAogICAgICAgICAvKioKQEAgLTM2MSw4ICs0OTksNyBAQAogICAgIC8qKgogICAgICAqIENvbHVtbnMgZnJvbSB0aGUgRXZlbnRzIHRhYmxlIHRoYXQgb3RoZXIgdGFibGVzIGpvaW4gaW50byB0aGVtc2VsdmVzLgogICAgICAqLwotICAgIHB1YmxpYyBpbnRlcmZhY2UgRXZlbnRzQ29sdW1ucwotICAgIHsKKyAgICBwdWJsaWMgaW50ZXJmYWNlIEV2ZW50c0NvbHVtbnMgewogICAgICAgICAvKioKICAgICAgICAgICogVGhlIGNhbGVuZGFyIHRoZSBldmVudCBiZWxvbmdzIHRvCiAgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVIgKGZvcmVpZ24ga2V5IHRvIHRoZSBDYWxlbmRhcnMgdGFibGUpPC9QPgpAQCAtNDM4LDYgKzU3NSwxOCBAQAogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEVEVORCA9ICJkdGVuZCI7CiAKICAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB0aW1lIHRoZSBldmVudCBzdGFydHMgd2l0aCBhbGxEYXkgZXZlbnRzIGluIGEgbG9jYWwgdHoKKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAobG9uZzsgbWlsbGlzIHNpbmNlIGVwb2NoKTwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERUU1RBUlQyID0gImR0c3RhcnQyIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHRpbWUgdGhlIGV2ZW50IGVuZHMgd2l0aCBhbGxEYXkgZXZlbnRzIGluIGEgbG9jYWwgdHoKKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAobG9uZzsgbWlsbGlzIHNpbmNlIGVwb2NoKTwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERURU5EMiA9ICJkdGVuZDIiOworCisgICAgICAgIC8qKgogICAgICAgICAgKiBUaGUgZHVyYXRpb24gb2YgdGhlIGV2ZW50CiAgICAgICAgICAqIDxQPlR5cGU6IFRFWFQgKGR1cmF0aW9uIGluIFJGQzI0NDUgZm9ybWF0KTwvUD4KICAgICAgICAgICovCkBAIC00NTAsNiArNTk5LDEyIEBACiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVWRU5UX1RJTUVaT05FID0gImV2ZW50VGltZXpvbmUiOwogCiAgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgdGltZXpvbmUgZm9yIHRoZSBldmVudCwgYWxsRGF5IGV2ZW50cyB3aWxsIGhhdmUgYSBsb2NhbCB0eiBpbnN0ZWFkIG9mIFVUQworICAgICAgICAgKiA8UD5UeXBlOiBURVhUCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFVkVOVF9USU1FWk9ORTIgPSAiZXZlbnRUaW1lem9uZTIiOworCisgICAgICAgIC8qKgogICAgICAgICAgKiBXaGV0aGVyIHRoZSBldmVudCBsYXN0cyBhbGwgZGF5IG9yIG5vdAogICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSIChib29sZWFuKTwvUD4KICAgICAgICAgICovCkBAIC01OTgsNyArNzUzLDggQEAKICAgICAvKioKICAgICAgKiBDb250YWlucyBvbmUgZW50cnkgcGVyIGNhbGVuZGFyIGV2ZW50LiBSZWN1cnJpbmcgZXZlbnRzIHNob3cgdXAgYXMgYSBzaW5nbGUgZW50cnkuCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBFdmVudHNFbnRpdHkgaW1wbGVtZW50cyBCYXNlQ29sdW1ucywgRXZlbnRzQ29sdW1ucywgQ2FsZW5kYXJzQ29sdW1ucyB7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBFdmVudHNFbnRpdHkgaW1wbGVtZW50cyBCYXNlQ29sdW1ucywgU3luY0NvbHVtbnMsIEFjY291bnRDb2x1bW5zLAorICAgICAgICAgICAgRXZlbnRzQ29sdW1ucyB7CiAgICAgICAgIC8qKgogICAgICAgICAgKiBUaGUgY29udGVudDovLyBzdHlsZSBVUkwgZm9yIHRoaXMgdGFibGUKICAgICAgICAgICovCkBAIC03MDMsOCArODU5LDggQEAKICAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvclN0cmluZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBfU1lOQ19EQVRBKTsKICAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvckxvbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgX1NZTkNfRElSVFkpOwogICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yU3RyaW5nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIF9TWU5DX1ZFUlNJT04pOwotICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29ySW50VG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIERFTEVURUQpOwotICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yU3RyaW5nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIENhbGVuZGFycy5VUkwpOworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29ySW50VG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIEV2ZW50c0NvbHVtbnMuREVMRVRFRCk7CisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgQ2FsZW5kYXJzLlNZTkMxKTsKIAogICAgICAgICAgICAgICAgIEVudGl0eSBlbnRpdHkgPSBuZXcgRW50aXR5KGN2KTsKICAgICAgICAgICAgICAgICBDdXJzb3Igc3ViQ3Vyc29yOwpAQCAtNzk1LDcgKzk1MSw4IEBACiAgICAgLyoqCiAgICAgICogQ29udGFpbnMgb25lIGVudHJ5IHBlciBjYWxlbmRhciBldmVudC4gUmVjdXJyaW5nIGV2ZW50cyBzaG93IHVwIGFzIGEgc2luZ2xlIGVudHJ5LgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRXZlbnRzIGltcGxlbWVudHMgQmFzZUNvbHVtbnMsIEV2ZW50c0NvbHVtbnMsIENhbGVuZGFyc0NvbHVtbnMgeworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRXZlbnRzIGltcGxlbWVudHMgQmFzZUNvbHVtbnMsIFN5bmNDb2x1bW5zLCBBY2NvdW50Q29sdW1ucywKKyAgICAgICAgICAgIEV2ZW50c0NvbHVtbnMgewogCiAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEZFVENIX0VOVFJZX0NPTFVNTlMgPQogICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7IEV2ZW50cy5fU1lOQ19BQ0NPVU5ULCBFdmVudHMuX1NZTkNfSUQgfTsKQEAgLTg2MCw2ICsxMDE3LDE1IEBACiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEN1cnNvciBxdWVyeShDb250ZW50UmVzb2x2ZXIgY3IsIFN0cmluZ1tdIHByb2plY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgYmVnaW4sIGxvbmcgZW5kLCBTdHJpbmcgc2VhcmNoUXVlcnkpIHsKKyAgICAgICAgICAgIFVyaS5CdWlsZGVyIGJ1aWxkZXIgPSBDT05URU5UX1NFQVJDSF9VUkkuYnVpbGRVcG9uKCk7CisgICAgICAgICAgICBDb250ZW50VXJpcy5hcHBlbmRJZChidWlsZGVyLCBiZWdpbik7CisgICAgICAgICAgICBDb250ZW50VXJpcy5hcHBlbmRJZChidWlsZGVyLCBlbmQpOworICAgICAgICAgICAgcmV0dXJuIGNyLnF1ZXJ5KGJ1aWxkZXIuYnVpbGQoKSwgcHJvamVjdGlvbiwgV0hFUkVfQ0FMRU5EQVJTX1NFTEVDVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7IHNlYXJjaFF1ZXJ5IH0sIERFRkFVTFRfU09SVF9PUkRFUik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEN1cnNvciBxdWVyeShDb250ZW50UmVzb2x2ZXIgY3IsIFN0cmluZ1tdIHByb2plY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgYmVnaW4sIGxvbmcgZW5kLCBTdHJpbmcgd2hlcmUsIFN0cmluZyBvcmRlckJ5KSB7CiAgICAgICAgICAgICBVcmkuQnVpbGRlciBidWlsZGVyID0gQ09OVEVOVF9VUkkuYnVpbGRVcG9uKCk7CiAgICAgICAgICAgICBDb250ZW50VXJpcy5hcHBlbmRJZChidWlsZGVyLCBiZWdpbik7CkBAIC04NzMsNiArMTAzOSwyMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIG9yZGVyQnkgPT0gbnVsbCA/IERFRkFVTFRfU09SVF9PUkRFUiA6IG9yZGVyQnkpOwogICAgICAgICB9CiAKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDdXJzb3IgcXVlcnkoQ29udGVudFJlc29sdmVyIGNyLCBTdHJpbmdbXSBwcm9qZWN0aW9uLCBsb25nIGJlZ2luLAorICAgICAgICAgICAgICAgIGxvbmcgZW5kLCBTdHJpbmcgc2VhcmNoUXVlcnksIFN0cmluZyB3aGVyZSwgU3RyaW5nIG9yZGVyQnkpIHsKKyAgICAgICAgICAgIFVyaS5CdWlsZGVyIGJ1aWxkZXIgPSBDT05URU5UX1NFQVJDSF9VUkkuYnVpbGRVcG9uKCk7CisgICAgICAgICAgICBDb250ZW50VXJpcy5hcHBlbmRJZChidWlsZGVyLCBiZWdpbik7CisgICAgICAgICAgICBDb250ZW50VXJpcy5hcHBlbmRJZChidWlsZGVyLCBlbmQpOworICAgICAgICAgICAgYnVpbGRlciA9IGJ1aWxkZXIuYXBwZW5kUGF0aChzZWFyY2hRdWVyeSk7CisgICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkod2hlcmUpKSB7CisgICAgICAgICAgICAgICAgd2hlcmUgPSBXSEVSRV9DQUxFTkRBUlNfU0VMRUNURUQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHdoZXJlID0gIigiICsgd2hlcmUgKyAiKSBBTkQgIiArIFdIRVJFX0NBTEVOREFSU19TRUxFQ1RFRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBjci5xdWVyeShidWlsZGVyLmJ1aWxkKCksIHByb2plY3Rpb24sIHdoZXJlLCBudWxsLAorICAgICAgICAgICAgICAgICAgICBvcmRlckJ5ID09IG51bGwgPyBERUZBVUxUX1NPUlRfT1JERVIgOiBvcmRlckJ5KTsKKyAgICAgICAgfQorCiAgICAgICAgIC8qKgogICAgICAgICAgKiBUaGUgY29udGVudDovLyBzdHlsZSBVUkwgZm9yIHRoaXMgdGFibGUKICAgICAgICAgICovCkBAIC04ODAsNiArMTA2MSwxMCBAQAogICAgICAgICAgICAgICAgICIvaW5zdGFuY2VzL3doZW4iKTsKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVcmkgQ09OVEVOVF9CWV9EQVlfVVJJID0KICAgICAgICAgICAgIFVyaS5wYXJzZSgiY29udGVudDovLyIgKyBBVVRIT1JJVFkgKyAiL2luc3RhbmNlcy93aGVuYnlkYXkiKTsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVcmkgQ09OVEVOVF9TRUFSQ0hfVVJJID0gVXJpLnBhcnNlKCJjb250ZW50Oi8vIiArIEFVVEhPUklUWSArCisgICAgICAgICAgICAgICAgIi9pbnN0YW5jZXMvc2VhcmNoIik7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVXJpIENPTlRFTlRfU0VBUkNIX0JZX0RBWV9VUkkgPQorICAgICAgICAgICAgVXJpLnBhcnNlKCJjb250ZW50Oi8vIiArIEFVVEhPUklUWSArICIvaW5zdGFuY2VzL3NlYXJjaGJ5ZGF5Iik7CiAKICAgICAgICAgLyoqCiAgICAgICAgICAqIFRoZSBkZWZhdWx0IHNvcnQgb3JkZXIgZm9yIHRoaXMgdGFibGUuCkBAIC04OTYsNyArMTA4MSw2IEBACiAgICAgICAgICAqIHJlcXVpcmVkIGZvciBjb3JyZWN0bmVzcywgaXQganVzdCBhZGRzIGEgbmljZSB0b3VjaC4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNPUlRfQ0FMRU5EQVJfVklFVyA9ICJiZWdpbiBBU0MsIGVuZCBERVNDLCB0aXRsZSBBU0MiOwotCiAgICAgICAgIC8qKgogICAgICAgICAgKiBUaGUgYmVnaW5uaW5nIHRpbWUgb2YgdGhlIGluc3RhbmNlLCBpbiBVVEMgbWlsbGlzZWNvbmRzCiAgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVIgKGxvbmc7IG1pbGxpcyBzaW5jZSBlcG9jaCk8L1A+CkBAIC05ODEsNyArMTE2NSw3IEBACiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BWF9FVkVOVERBWVMgPSAibWF4RXZlbnREYXlzIjsKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIENhbGVuZGFyTWV0YURhdGEgaW1wbGVtZW50cyBDYWxlbmRhck1ldGFEYXRhQ29sdW1ucyB7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBDYWxlbmRhck1ldGFEYXRhIGltcGxlbWVudHMgQ2FsZW5kYXJNZXRhRGF0YUNvbHVtbnMsIEJhc2VDb2x1bW5zIHsKICAgICB9CiAKICAgICBwdWJsaWMgaW50ZXJmYWNlIEV2ZW50RGF5c0NvbHVtbnMgewpAQCAtMTM3OSw0ICsxNTYzLDQzIEBACiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVXJpIENPTlRFTlRfVVJJID0KICAgICAgICAgICAgICAgICBVcmkud2l0aEFwcGVuZGVkUGF0aChDYWxlbmRhci5DT05URU5UX1VSSSwgQ09OVEVOVF9ESVJFQ1RPUlkpOwogICAgIH0KKworICAgIC8qKgorICAgICAqIENvbHVtbnMgZnJvbSB0aGUgRXZlbnRzUmF3VGltZXMgdGFibGUKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50ZXJmYWNlIEV2ZW50c1Jhd1RpbWVzQ29sdW1ucyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgY29ycmVzcG9uZGluZyBldmVudCBpZAorICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSIChsb25nKTwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVWRU5UX0lEID0gImV2ZW50X2lkIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIFJGQzI0NDUgY29tcGxpYW50IHRpbWUgdGhlIGV2ZW50IHN0YXJ0cworICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFRTVEFSVF8yNDQ1ID0gImR0c3RhcnQyNDQ1IjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIFJGQzI0NDUgY29tcGxpYW50IHRpbWUgdGhlIGV2ZW50IGVuZHMKKyAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERURU5EXzI0NDUgPSAiZHRlbmQyNDQ1IjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIFJGQzI0NDUgY29tcGxpYW50IG9yaWdpbmFsIGluc3RhbmNlIHRpbWUgb2YgdGhlIHJlY3VycmluZyBldmVudCBmb3Igd2hpY2ggdGhpcworICAgICAgICAgKiBldmVudCBpcyBhbiBleGNlcHRpb24uCisgICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUklHSU5BTF9JTlNUQU5DRV9USU1FXzI0NDUgPSAib3JpZ2luYWxJbnN0YW5jZVRpbWUyNDQ1IjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIFJGQzI0NDUgY29tcGxpYW50IGxhc3QgZGF0ZSB0aGlzIGV2ZW50IHJlcGVhdHMgb24sIG9yIE5VTEwgaWYgaXQgbmV2ZXIgZW5kcworICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFTVF9EQVRFXzI0NDUgPSAibGFzdERhdGUyNDQ1IjsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEV2ZW50c1Jhd1RpbWVzIGltcGxlbWVudHMgQmFzZUNvbHVtbnMsIEV2ZW50c1Jhd1RpbWVzQ29sdW1ucyB7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvQ29udGFjdHNDb250cmFjdC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvQ29udGFjdHNDb250cmFjdC5qYXZhCmluZGV4IGYwZWU4MzguLjI3NmFhODQgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL0NvbnRhY3RzQ29udHJhY3QuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9Db250YWN0c0NvbnRyYWN0LmphdmEKQEAgLTMwLDkgKzMwLDkgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcjsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkRhdGFiYXNlVXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKIGltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CitpbXBvcnQgYW5kcm9pZC5uZXQuVXJpLkJ1aWxkZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKIGltcG9ydCBhbmRyb2lkLnV0aWwuRGlzcGxheU1ldHJpY3M7CkBAIC00MSw2ICs0MSw3IEBACiAKIGltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIAogLyoqCiAgKiA8cD4KQEAgLTEzMCw2ICsxMzEsMTQgQEAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVFVRVNUSU5HX1BBQ0tBR0VfUEFSQU1fS0VZID0gInJlcXVlc3RpbmdfcGFja2FnZSI7CiAKICAgICAvKioKKyAgICAgKiBRdWVyeSBwYXJhbWV0ZXIgdGhhdCBzaG91bGQgYmUgdXNlZCBieSB0aGUgY2xpZW50IHRvIGFjY2VzcyBhIHNwZWNpZmljCisgICAgICoge0BsaW5rIERpcmVjdG9yeX0uIFRoZSBwYXJhbWV0ZXIgdmFsdWUgc2hvdWxkIGJlIHRoZSBfSUQgb2YgdGhlIGNvcnJlc3BvbmRpbmcKKyAgICAgKiBkaXJlY3RvcnksIGUuZy4KKyAgICAgKiB7QGNvZGUgY29udGVudDovL2NvbS5hbmRyb2lkLmNvbnRhY3RzL2RhdGEvZW1haWxzL2ZpbHRlci9hY21lP2RpcmVjdG9yeT0zfQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJUkVDVE9SWV9QQVJBTV9LRVkgPSAiZGlyZWN0b3J5IjsKKworICAgIC8qKgogICAgICAqIEBoaWRlCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBQcmVmZXJlbmNlcyB7CkBAIC0xODEsNiArMTkwLDI5NSBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIEEgRGlyZWN0b3J5IHJlcHJlc2VudHMgYSBjb250YWN0cyBjb3JwdXMsIGUuZy4gTG9jYWwgY29udGFjdHMsCisgICAgICogR29vZ2xlIEFwcHMgR2xvYmFsIEFkZHJlc3MgTGlzdCBvciBDb3Jwb3JhdGUgR2xvYmFsIEFkZHJlc3MgTGlzdC4KKyAgICAgKiA8cD4KKyAgICAgKiBBIERpcmVjdG9yeSBpcyBpbXBsZW1lbnRlZCBhcyBhIGNvbnRlbnQgcHJvdmlkZXIgd2l0aCBpdHMgdW5pcXVlIGF1dGhvcml0eSBhbmQKKyAgICAgKiB0aGUgc2FtZSBBUEkgYXMgdGhlIG1haW4gQ29udGFjdHMgUHJvdmlkZXIuICBIb3dldmVyLCB0aGVyZSBpcyBubyBleHBlY3RhdGlvbiB0aGF0CisgICAgICogZXZlcnkgZGlyZWN0b3J5IHByb3ZpZGVyIHdpbGwgaW1wbGVtZW50IHRoaXMgQ29udHJhY3QgaW4gaXRzIGVudGlyZXR5LiAgSWYgYQorICAgICAqIGRpcmVjdG9yeSBwcm92aWRlciBkb2VzIG5vdCBoYXZlIGFuIGltcGxlbWVudGF0aW9uIGZvciBhIHNwZWNpZmljIHJlcXVlc3QsIGl0CisgICAgICogc2hvdWxkIHRocm93IGFuIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uLgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgbW9zdCBpbXBvcnRhbnQgdXNlIGNhc2UgZm9yIERpcmVjdG9yaWVzIGlzIHNlYXJjaC4gIEEgRGlyZWN0b3J5IHByb3ZpZGVyIGlzCisgICAgICogZXhwZWN0ZWQgdG8gc3VwcG9ydCBhdCBsZWFzdCB7QGxpbmsgQ29udGFjdHNDb250cmFjdC5Db250YWN0cyNDT05URU5UX0ZJTFRFUl9VUkkKKyAgICAgKiBDb250YWN0cy5DT05URU5UX0ZJTFRFUl9VUkl9LiAgSWYgYSBEaXJlY3RvcnkgcHJvdmlkZXIgd2FudHMgdG8gcGFydGljaXBhdGUKKyAgICAgKiBpbiBlbWFpbCBhbmQgcGhvbmUgbG9va3VwIGZ1bmN0aW9uYWxpdGllcywgaXQgc2hvdWxkIGFsc28gaW1wbGVtZW50CisgICAgICoge0BsaW5rIENvbW1vbkRhdGFLaW5kcy5FbWFpbCNDT05URU5UX0ZJTFRFUl9VUkkgQ29tbW9uRGF0YUtpbmRzLkVtYWlsLkNPTlRFTlRfRklMVEVSX1VSSX0KKyAgICAgKiBhbmQKKyAgICAgKiB7QGxpbmsgQ29tbW9uRGF0YUtpbmRzLlBob25lI0NPTlRFTlRfRklMVEVSX1VSSSBDb21tb25EYXRhS2luZHMuUGhvbmUuQ09OVEVOVF9GSUxURVJfVVJJfS4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogQSBkaXJlY3RvcnkgcHJvdmlkZXIgc2hvdWxkIHJldHVybiBOVUxMIGZvciBldmVyeSBwcm9qZWN0aW9uIGZpZWxkIGl0IGRvZXMgbm90CisgICAgICogcmVjb2duaXplLCByYXRoZXIgdGhhbiB0aHJvd2luZyBhbiBleGNlcHRpb24uICBUaGlzIHdheSBpdCB3aWxsIG5vdCBiZSBicm9rZW4KKyAgICAgKiBpZiBDb250YWN0c0NvbnRyYWN0IGlzIGV4dGVuZGVkIHdpdGggbmV3IGZpZWxkcyBpbiB0aGUgZnV0dXJlLgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgY2xpZW50IGludGVyYWN0cyB3aXRoIGEgZGlyZWN0b3J5IHZpYSBDb250YWN0cyBQcm92aWRlciBieSBzdXBwbHlpbmcgYW4KKyAgICAgKiBvcHRpb25hbCB7QGNvZGUgZGlyZWN0b3J5PX0gcXVlcnkgcGFyYW1ldGVyLgorICAgICAqIDxwPgorICAgICAqIDxwPgorICAgICAqIFdoZW4gdGhlIENvbnRhY3RzIFByb3ZpZGVyIHJlY2VpdmVzIHRoZSByZXF1ZXN0LCBpdCB0cmFuc2Zvcm1zIHRoZSBVUkkgYW5kIGZvcndhcmRzCisgICAgICogdGhlIHJlcXVlc3QgdG8gdGhlIGNvcnJlc3BvbmRpbmcgZGlyZWN0b3J5IGNvbnRlbnQgcHJvdmlkZXIuCisgICAgICogVGhlIFVSSSBpcyB0cmFuc2Zvcm1lZCBpbiB0aGUgZm9sbG93aW5nIGZhc2hpb246CisgICAgICogPHVsPgorICAgICAqIDxsaT5UaGUgVVJJIGF1dGhvcml0eSBpcyByZXBsYWNlZCB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIHtAbGluayAjRElSRUNUT1JZX0FVVEhPUklUWX0uPC9saT4KKyAgICAgKiA8bGk+VGhlIHtAY29kZSBhY2NvdW50TmFtZT19IGFuZCB7QGNvZGUgYWNjb3VudFR5cGU9fSBwYXJhbWV0ZXJzIGFyZSBhZGRlZCBvcgorICAgICAqIHJlcGxhY2VkIHVzaW5nIHRoZSBjb3JyZXNwb25kaW5nIHtAbGluayAjQUNDT1VOVF9UWVBFfSBhbmQge0BsaW5rICNBQ0NPVU5UX05BTUV9IHZhbHVlcy48L2xpPgorICAgICAqIDxsaT5JZiB0aGUgVVJJIGlzIG1pc3NpbmcgYSBDb250YWN0c0NvbnRyYWN0LlJFUVVFU1RJTkdfUEFDS0FHRV9QQVJBTV9LRVkKKyAgICAgKiBwYXJhbWV0ZXIsIHRoaXMgcGFyYW1ldGVyIGlzIGFkZGVkLjwvbGk+CisgICAgICogPC91bD4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogQ2xpZW50cyBzaG91bGQgc2VuZCBkaXJlY3RvcnkgcmVxdWVzdHMgdG8gQ29udGFjdHMgUHJvdmlkZXIgYW5kIGxldCBpdAorICAgICAqIGZvcndhcmQgdGhlbSB0byB0aGUgcmVzcGVjdGl2ZSBwcm92aWRlcnMgcmF0aGVyIHRoYW4gY29uc3RydWN0aW5nCisgICAgICogZGlyZWN0b3J5IHByb3ZpZGVyIFVSSXMgYnkgdGhlbXNlbHZlcy4gVGhpcyBsZXZlbCBvZiBpbmRpcmVjdGlvbiBhbGxvd3MKKyAgICAgKiBDb250YWN0cyBQcm92aWRlciB0byBpbXBsZW1lbnQgYWRkaXRpb25hbCBzeXN0ZW0tbGV2ZWwgZmVhdHVyZXMgYW5kCisgICAgICogb3B0aW1pemF0aW9ucy4gQWNjZXNzIHRvIENvbnRhY3RzIFByb3ZpZGVyIGlzIHByb3RlY3RlZCBieSB0aGUKKyAgICAgKiBSRUFEX0NPTlRBQ1RTIHBlcm1pc3Npb24sIGJ1dCBhY2Nlc3MgdG8gdGhlIGRpcmVjdG9yeSBwcm92aWRlciBpcyBub3QuCisgICAgICogVGhlcmVmb3JlIGRpcmVjdG9yeSBwcm92aWRlcnMgbXVzdCByZWplY3QgcmVxdWVzdHMgY29taW5nIGZyb20gY2xpZW50cworICAgICAqIG90aGVyIHRoYW4gdGhlIENvbnRhY3RzIFByb3ZpZGVyIGl0c2VsZi4gQW4gZWFzeSB3YXkgdG8gcHJldmVudCBzdWNoCisgICAgICogdW5hdXRob3JpemVkIGFjY2VzcyBpcyB0byBjaGVjayB0aGUgbmFtZSBvZiB0aGUgY2FsbGluZyBwYWNrYWdlOgorICAgICAqIDxwcmU+CisgICAgICogcHJpdmF0ZSBib29sZWFuIGlzQ2FsbGVyQWxsb3dlZCgpIHsKKyAgICAgKiAgIFBhY2thZ2VNYW5hZ2VyIHBtID0gZ2V0Q29udGV4dCgpLmdldFBhY2thZ2VNYW5hZ2VyKCk7CisgICAgICogICBmb3IgKFN0cmluZyBwYWNrYWdlTmFtZTogcG0uZ2V0UGFja2FnZXNGb3JVaWQoQmluZGVyLmdldENhbGxpbmdVaWQoKSkpIHsKKyAgICAgKiAgICAgaWYgKHBhY2thZ2VOYW1lLmVxdWFscygiY29tLmFuZHJvaWQucHJvdmlkZXJzLmNvbnRhY3RzIikpIHsKKyAgICAgKiAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgKiAgICAgfQorICAgICAqICAgfQorICAgICAqICAgcmV0dXJuIGZhbHNlOworICAgICAqIH0KKyAgICAgKiA8L3ByZT4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogVGhlIERpcmVjdG9yeSB0YWJsZSBpcyByZWFkLW9ubHkgYW5kIGlzIG1haW50YWluZWQgYnkgdGhlIENvbnRhY3RzIFByb3ZpZGVyCisgICAgICogYXV0b21hdGljYWxseS4KKyAgICAgKiA8L3A+CisgICAgICogPHA+SXQgYWx3YXlzIGhhcyBhdCBsZWFzdCB0aGVzZSB0d28gcm93czoKKyAgICAgKiA8dWw+CisgICAgICogPGxpPgorICAgICAqIFRoZSBsb2NhbCBkaXJlY3RvcnkuIEl0IGhhcyB7QGxpbmsgRGlyZWN0b3J5I19JRCBEaXJlY3RvcnkuX0lEfSA9CisgICAgICoge0BsaW5rIERpcmVjdG9yeSNERUZBVUxUIERpcmVjdG9yeS5ERUZBVUxUfS4gVGhpcyBkaXJlY3RvcnkgY2FuIGJlIHVzZWQgdG8gYWNjZXNzIGxvY2FsbHkKKyAgICAgKiBzdG9yZWQgY29udGFjdHMuIFRoZSBzYW1lIGNhbiBiZSBhY2hpZXZlZCBieSBvbWl0dGluZyB0aGUge0Bjb2RlIGRpcmVjdG9yeT19CisgICAgICogcGFyYW1ldGVyIGFsdG9nZXRoZXIuCisgICAgICogPC9saT4KKyAgICAgKiA8bGk+CisgICAgICogVGhlIGxvY2FsIGludmlzaWJsZSBjb250YWN0cy4gVGhlIGNvcnJlc3BvbmRpbmcgZGlyZWN0b3J5IElEIGlzCisgICAgICoge0BsaW5rIERpcmVjdG9yeSNMT0NBTF9JTlZJU0lCTEUgRGlyZWN0b3J5LkxPQ0FMX0lOVklTSUJMRX0uCisgICAgICogPC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqIDwvcD4KKyAgICAgKiA8cD5DdXN0b20gRGlyZWN0b3JpZXMgYXJlIGRpc2NvdmVyZWQgYnkgdGhlIENvbnRhY3RzIFByb3ZpZGVyIGZvbGxvd2luZyB0aGlzIHByb2NlZHVyZToKKyAgICAgKiA8dWw+CisgICAgICogPGxpPkl0IGZpbmRzIGFsbCBpbnN0YWxsZWQgY29udGVudCBwcm92aWRlcnMgd2l0aCBtZXRhIGRhdGEgaWRlbnRpZnlpbmcgdGhlbQorICAgICAqIGFzIGRpcmVjdG9yeSBwcm92aWRlcnMgaW4gQW5kcm9pZE1hbmlmZXN0LnhtbDoKKyAgICAgKiA8Y29kZT4KKyAgICAgKiAmbHQ7bWV0YS1kYXRhIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5jb250ZW50LkNvbnRhY3REaXJlY3RvcnkiCisgICAgICogICAgICAgICAgICAgICBhbmRyb2lkOnZhbHVlPSJ0cnVlIiAvJmd0OworICAgICAqIDwvY29kZT4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIHRhZyBzaG91bGQgYmUgcGxhY2VkIGluc2lkZSB0aGUgY29ycmVzcG9uZGluZyBjb250ZW50IHByb3ZpZGVyIGRlY2xhcmF0aW9uLgorICAgICAqIDwvcD4KKyAgICAgKiA8L2xpPgorICAgICAqIDxsaT4KKyAgICAgKiBUaGVuIENvbnRhY3RzIFByb3ZpZGVyIHNlbmRzIGEge0BsaW5rIERpcmVjdG9yeSNDT05URU5UX1VSSSBEaXJlY3RvcnkuQ09OVEVOVF9VUkl9CisgICAgICogcXVlcnkgdG8gZWFjaCBvZiB0aGUgZGlyZWN0b3J5IGF1dGhvcml0aWVzLiAgQSBkaXJlY3RvcnkgcHJvdmlkZXIgbXVzdCBpbXBsZW1lbnQKKyAgICAgKiB0aGlzIHF1ZXJ5IGFuZCByZXR1cm4gYSBsaXN0IG9mIGRpcmVjdG9yaWVzLiAgRWFjaCBkaXJlY3RvcnkgcmV0dXJuZWQgYnkKKyAgICAgKiB0aGUgcHJvdmlkZXIgbXVzdCBoYXZlIGEgdW5pcXVlIGNvbWJpbmF0aW9uIGZvciB0aGUge0BsaW5rICNBQ0NPVU5UX05BTUV9IGFuZAorICAgICAqIHtAbGluayAjQUNDT1VOVF9UWVBFfSBjb2x1bW5zIChudWxscyBhcmUgYWxsb3dlZCkuICBTaW5jZSBkaXJlY3RvcnkgSURzIGFyZSBhc3NpZ25lZAorICAgICAqIGF1dG9tYXRpY2FsbHksIHRoZSBfSUQgZmllbGQgd2lsbCBub3QgYmUgcGFydCBvZiB0aGUgcXVlcnkgcHJvamVjdGlvbi4KKyAgICAgKiA8L2xpPgorICAgICAqIDxsaT5Db250YWN0cyBQcm92aWRlciBjb21waWxlcyBkaXJlY3RvcnkgbGlzdHMgcmVjZWl2ZWQgZnJvbSBhbGwgZGlyZWN0b3J5CisgICAgICogcHJvdmlkZXJzIGludG8gb25lLCBhc3NpZ25zIGVhY2ggaW5kaXZpZHVhbCBkaXJlY3RvcnkgYSBnbG9iYWxseSB1bmlxdWUgSUQgYW5kCisgICAgICogc3RvcmVzIGFsbCBkaXJlY3RvcnkgcmVjb3JkcyBpbiB0aGUgRGlyZWN0b3J5IHRhYmxlLgorICAgICAqIDwvbGk+CisgICAgICogPC91bD4KKyAgICAgKiA8L3A+CisgICAgICogPHA+Q29udGFjdHMgUHJvdmlkZXIgYXV0b21hdGljYWxseSBpbnRlcnJvZ2F0ZXMgbmV3bHkgaW5zdGFsbGVkIG9yIHJlcGxhY2VkIHBhY2thZ2VzLgorICAgICAqIFRodXMgc2ltcGx5IGluc3RhbGxpbmcgYSBwYWNrYWdlIGNvbnRhaW5pbmcgYSBkaXJlY3RvcnkgcHJvdmlkZXIgaXMgc3VmZmljaWVudAorICAgICAqIHRvIGhhdmUgdGhhdCBwcm92aWRlciByZWdpc3RlcmVkLiAgQSBwYWNrYWdlIHN1cHBseWluZyBhIGRpcmVjdG9yeSBwcm92aWRlciBkb2VzCisgICAgICogbm90IGhhdmUgdG8gY29udGFpbiBsYXVuY2hhYmxlIGFjdGl2aXRpZXMuCisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqIEV2ZXJ5IHJvdyBpbiB0aGUgRGlyZWN0b3J5IHRhYmxlIGlzIGF1dG9tYXRpY2FsbHkgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIHBhY2thZ2UKKyAgICAgKiAoYXBrKS4gIElmIHRoZSBwYWNrYWdlIGlzIGxhdGVyIHVuaW5zdGFsbGVkLCBhbGwgY29ycmVzcG9uZGluZyBkaXJlY3Rvcnkgcm93cworICAgICAqIGFyZSBhdXRvbWF0aWNhbGx5IHJlbW92ZWQgZnJvbSB0aGUgQ29udGFjdHMgUHJvdmlkZXIuCisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqIFdoZW4gdGhlIGxpc3Qgb2YgZGlyZWN0b3JpZXMgaGFuZGxlZCBieSBhIGRpcmVjdG9yeSBwcm92aWRlciBjaGFuZ2VzCisgICAgICogKGZvciBpbnN0YW5jZSB3aGVuIHRoZSB1c2VyIGFkZHMgYSBuZXcgRGlyZWN0b3J5IGFjY291bnQpLCB0aGUgZGlyZWN0b3J5IHByb3ZpZGVyCisgICAgICogc2hvdWxkIGNhbGwge0BsaW5rICNub3RpZnlEaXJlY3RvcnlDaGFuZ2V9IHRvIG5vdGlmeSB0aGUgQ29udGFjdHMgUHJvdmlkZXIgb2YgdGhlIGNoYW5nZS4KKyAgICAgKiBJbiByZXNwb25zZSwgdGhlIENvbnRhY3RzIFByb3ZpZGVyIHdpbGwgcmVxdWVyeSB0aGUgZGlyZWN0b3J5IHByb3ZpZGVyIHRvIG9idGFpbiB0aGUKKyAgICAgKiBuZXcgbGlzdCBvZiBkaXJlY3Rvcmllcy4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogQSBkaXJlY3Rvcnkgcm93IGNhbiBiZSBvcHRpb25hbGx5IGFzc29jaWF0ZWQgd2l0aCBhbiBleGlzdGluZyBhY2NvdW50CisgICAgICogKHNlZSB7QGxpbmsgYW5kcm9pZC5hY2NvdW50cy5BY2NvdW50TWFuYWdlcn0pLiBJZiB0aGUgYWNjb3VudCBpcyBsYXRlciByZW1vdmVkLAorICAgICAqIHRoZSBjb3JyZXNwb25kaW5nIGRpcmVjdG9yeSByb3dzIGFyZSBhdXRvbWF0aWNhbGx5IHJlbW92ZWQgZnJvbSB0aGUgQ29udGFjdHMgUHJvdmlkZXIuCisgICAgICogPC9wPgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRGlyZWN0b3J5IGltcGxlbWVudHMgQmFzZUNvbHVtbnMgeworCisgICAgICAgIC8qKgorICAgICAgICAgKiBOb3QgaW5zdGFudGlhYmxlLgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBEaXJlY3RvcnkoKSB7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGNvbnRlbnQ6Ly8gc3R5bGUgVVJJIGZvciB0aGlzIHRhYmxlLiAgUmVxdWVzdHMgdG8gdGhpcyBVUkkgY2FuIGJlCisgICAgICAgICAqIHBlcmZvcm1lZCBvbiB0aGUgVUkgdGhyZWFkIGJlY2F1c2UgdGhleSBhcmUgYWx3YXlzIHVuYmxvY2tpbmcuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVyaSBDT05URU5UX1VSSSA9CisgICAgICAgICAgICAgICAgVXJpLndpdGhBcHBlbmRlZFBhdGgoQVVUSE9SSVRZX1VSSSwgImRpcmVjdG9yaWVzIik7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBNSU1FLXR5cGUgb2Yge0BsaW5rICNDT05URU5UX1VSSX0gcHJvdmlkaW5nIGEgZGlyZWN0b3J5IG9mCisgICAgICAgICAqIGNvbnRhY3QgZGlyZWN0b3JpZXMuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX1RZUEUgPQorICAgICAgICAgICAgICAgICJ2bmQuYW5kcm9pZC5jdXJzb3IuZGlyL2NvbnRhY3RfZGlyZWN0b3JpZXMiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgTUlNRSB0eXBlIG9mIGEge0BsaW5rICNDT05URU5UX1VSSX0gaXRlbS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlRfSVRFTV9UWVBFID0KKyAgICAgICAgICAgICAgICAidm5kLmFuZHJvaWQuY3Vyc29yLml0ZW0vY29udGFjdF9kaXJlY3RvcnkiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBfSUQgb2YgdGhlIGRlZmF1bHQgZGlyZWN0b3J5LCB3aGljaCByZXByZXNlbnRzIGxvY2FsbHkgc3RvcmVkIGNvbnRhY3RzLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIERFRkFVTFQgPSAwOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBfSUQgb2YgdGhlIGRpcmVjdG9yeSB0aGF0IHJlcHJlc2VudHMgbG9jYWxseSBzdG9yZWQgaW52aXNpYmxlIGNvbnRhY3RzLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIExPQ0FMX0lOVklTSUJMRSA9IDE7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBuYW1lIG9mIHRoZSBwYWNrYWdlIHRoYXQgb3ducyB0aGlzIGRpcmVjdG9yeS4gQ29udGFjdHMgUHJvdmlkZXIKKyAgICAgICAgICogZmlsbCBpdCBpbiB3aXRoIHRoZSBuYW1lIG9mIHRoZSBwYWNrYWdlIGNvbnRhaW5pbmcgdGhlIGRpcmVjdG9yeSBwcm92aWRlci4KKyAgICAgICAgICogSWYgdGhlIHBhY2thZ2UgaXMgbGF0ZXIgdW5pbnN0YWxsZWQsIHRoZSBkaXJlY3RvcmllcyBpdCBvd25zIGFyZQorICAgICAgICAgKiBhdXRvbWF0aWNhbGx5IHJlbW92ZWQgZnJvbSB0aGlzIHRhYmxlLgorICAgICAgICAgKgorICAgICAgICAgKiA8cD5UWVBFOiBURVhUPC9wPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFDS0FHRV9OQU1FID0gInBhY2thZ2VOYW1lIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHR5cGUgb2YgZGlyZWN0b3J5IGNhcHR1cmVkIGFzIGEgcmVzb3VyY2UgSUQgaW4gdGhlIGNvbnRleHQgb2YgdGhlCisgICAgICAgICAqIHBhY2thZ2Uge0BsaW5rICNQQUNLQUdFX05BTUV9LCBlLmcuICJDb3Jwb3JhdGUgRGlyZWN0b3J5IgorICAgICAgICAgKgorICAgICAgICAgKiA8cD5UWVBFOiBJTlRFR0VSPC9wPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9SRVNPVVJDRV9JRCA9ICJ0eXBlUmVzb3VyY2VJZCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFuIG9wdGlvbmFsIG5hbWUgdGhhdCBjYW4gYmUgdXNlZCBpbiB0aGUgVUkgdG8gcmVwcmVzZW50IHRoaXMgZGlyZWN0b3J5LAorICAgICAgICAgKiBlLmcuICJBY21lIENvcnAiCisgICAgICAgICAqIDxwPlRZUEU6IHRleHQ8L3A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVNQTEFZX05BTUUgPSAiZGlzcGxheU5hbWUiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogVGhlIGF1dGhvcml0eSBvZiB0aGUgRGlyZWN0b3J5IFByb3ZpZGVyLiBDb250YWN0cyBQcm92aWRlciB3aWxsCisgICAgICAgICAqIHVzZSB0aGlzIGF1dGhvcml0eSB0byBmb3J3YXJkIHJlcXVlc3RzIHRvIHRoZSBkaXJlY3RvcnkgcHJvdmlkZXIuCisgICAgICAgICAqIEEgZGlyZWN0b3J5IHByb3ZpZGVyIGNhbiBsZWF2ZSB0aGlzIGNvbHVtbiBlbXB0eSAtIENvbnRhY3RzIFByb3ZpZGVyIHdpbGwgZmlsbCBpdCBpbi4KKyAgICAgICAgICogPC9wPgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogQ2xpZW50cyBvZiB0aGlzIEFQSSBzaG91bGQgbm90IHNlbmQgcmVxdWVzdHMgZGlyZWN0bHkgdG8gdGhpcyBhdXRob3JpdHkuCisgICAgICAgICAqIEFsbCBkaXJlY3RvcnkgcmVxdWVzdHMgbXVzdCBiZSByb3V0ZWQgdGhyb3VnaCBDb250YWN0cyBQcm92aWRlci4KKyAgICAgICAgICogPC9wPgorICAgICAgICAgKgorICAgICAgICAgKiA8cD5UWVBFOiB0ZXh0PC9wPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElSRUNUT1JZX0FVVEhPUklUWSA9ICJhdXRob3JpdHkiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgYWNjb3VudCB0eXBlIHdoaWNoIHRoaXMgZGlyZWN0b3J5IGlzIGFzc29jaWF0ZWQuCisgICAgICAgICAqCisgICAgICAgICAqIDxwPlRZUEU6IHRleHQ8L3A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ0NPVU5UX1RZUEUgPSAiYWNjb3VudFR5cGUiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgYWNjb3VudCB3aXRoIHdoaWNoIHRoaXMgZGlyZWN0b3J5IGlzIGFzc29jaWF0ZWQuIElmIHRoZSBhY2NvdW50IGlzIGxhdGVyCisgICAgICAgICAqIHJlbW92ZWQsIHRoZSBkaXJlY3RvcmllcyBpdCBvd25zIGFyZSBhdXRvbWF0aWNhbGx5IHJlbW92ZWQgZnJvbSB0aGlzIHRhYmxlLgorICAgICAgICAgKgorICAgICAgICAgKiA8cD5UWVBFOiB0ZXh0PC9wPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNDT1VOVF9OQU1FID0gImFjY291bnROYW1lIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogT25lIG9mIHtAbGluayAjRVhQT1JUX1NVUFBPUlRfTk9ORX0sIHtAbGluayAjRVhQT1JUX1NVUFBPUlRfQU5ZX0FDQ09VTlR9LAorICAgICAgICAgKiB7QGxpbmsgI0VYUE9SVF9TVVBQT1JUX1NBTUVfQUNDT1VOVF9PTkxZfS4gVGhpcyBpcyB0aGUgZXhwZWN0YXRpb24gdGhlCisgICAgICAgICAqIGRpcmVjdG9yeSBoYXMgZm9yIGRhdGEgZXhwb3J0ZWQgZnJvbSBpdC4gIENsaWVudHMgbXVzdCBvYmV5IHRoaXMgc2V0dGluZy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYUE9SVF9TVVBQT1JUID0gImV4cG9ydFN1cHBvcnQiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBBbiB7QGxpbmsgI0VYUE9SVF9TVVBQT1JUfSBzZXR0aW5nIHRoYXQgaW5kaWNhdGVzIHRoYXQgdGhlIGRpcmVjdG9yeQorICAgICAgICAgKiBkb2VzIG5vdCBhbGxvdyBhbnkgZGF0YSB0byBiZSBjb3BpZWQgb3V0IG9mIGl0LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVhQT1JUX1NVUFBPUlRfTk9ORSA9IDA7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFuIHtAbGluayAjRVhQT1JUX1NVUFBPUlR9IHNldHRpbmcgdGhhdCBpbmRpY2F0ZXMgdGhhdCB0aGUgZGlyZWN0b3J5CisgICAgICAgICAqIGFsbG93IGl0cyBkYXRhIGNvcGllZCBvbmx5IHRvIHRoZSBhY2NvdW50IHNwZWNpZmllZCBieQorICAgICAgICAgKiB7QGxpbmsgI0FDQ09VTlRfVFlQRX0ve0BsaW5rICNBQ0NPVU5UX05BTUV9LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVhQT1JUX1NVUFBPUlRfU0FNRV9BQ0NPVU5UX09OTFkgPSAxOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBBbiB7QGxpbmsgI0VYUE9SVF9TVVBQT1JUfSBzZXR0aW5nIHRoYXQgaW5kaWNhdGVzIHRoYXQgdGhlIGRpcmVjdG9yeQorICAgICAgICAgKiBhbGxvdyBpdHMgZGF0YSBjb3BpZWQgdG8gYW55IGNvbnRhY3RzIGFjY291bnQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFWFBPUlRfU1VQUE9SVF9BTllfQUNDT1VOVCA9IDI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIE9uZSBvZiB7QGxpbmsgI1NIT1JUQ1VUX1NVUFBPUlRfTk9ORX0sIHtAbGluayAjU0hPUlRDVVRfU1VQUE9SVF9EQVRBX0lURU1TX09OTFl9LAorICAgICAgICAgKiB7QGxpbmsgI1NIT1JUQ1VUX1NVUFBPUlRfRlVMTH0sIFRoaXMgaXMgdGhlIGV4cGVjdGF0aW9uIHRoZSBkaXJlY3RvcnkKKyAgICAgICAgICogaGFzIGZvciBzaG9ydGN1dHMgY3JlYXRlZCBmb3IgaXRzIGVsZW1lbnRzLiBDbGllbnRzIG11c3Qgb2JleSB0aGlzIHNldHRpbmcuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSE9SVENVVF9TVVBQT1JUID0gInNob3J0Y3V0U3VwcG9ydCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFuIHtAbGluayAjU0hPUlRDVVRfU1VQUE9SVH0gc2V0dGluZyB0aGF0IGluZGljYXRlcyB0aGF0IHRoZSBkaXJlY3RvcnkKKyAgICAgICAgICogZG9lcyBub3QgYWxsb3cgYW55IHNob3J0Y3V0cyBjcmVhdGVkIGZvciBpdHMgY29udGFjdHMuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSE9SVENVVF9TVVBQT1JUX05PTkUgPSAwOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBBbiB7QGxpbmsgI1NIT1JUQ1VUX1NVUFBPUlR9IHNldHRpbmcgdGhhdCBpbmRpY2F0ZXMgdGhhdCB0aGUgZGlyZWN0b3J5CisgICAgICAgICAqIGFsbG93IGNyZWF0aW9uIG9mIHNob3J0Y3V0cyBmb3IgZGF0YSBpdGVtcyBsaWtlIGVtYWlsLCBwaG9uZSBvciBwb3N0YWwgYWRkcmVzcywKKyAgICAgICAgICogYnV0IG5vdCB0aGUgZW50aXJlIGNvbnRhY3QuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSE9SVENVVF9TVVBQT1JUX0RBVEFfSVRFTVNfT05MWSA9IDE7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFuIHtAbGluayAjU0hPUlRDVVRfU1VQUE9SVH0gc2V0dGluZyB0aGF0IGluZGljYXRlcyB0aGF0IHRoZSBkaXJlY3RvcnkKKyAgICAgICAgICogYWxsb3cgY3JlYXRpb24gb2Ygc2hvcnRjdXRzIGZvciBjb250YWN0IGFzIHdlbGwgYXMgdGhlaXIgY29uc3RpdHVlbnQgZWxlbWVudHMuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSE9SVENVVF9TVVBQT1JUX0ZVTEwgPSAyOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBOb3RpZmllcyB0aGUgc3lzdGVtIG9mIGEgY2hhbmdlIGluIHRoZSBsaXN0IG9mIGRpcmVjdG9yaWVzIGhhbmRsZWQgYnkKKyAgICAgICAgICogYSBwYXJ0aWN1bGFyIGRpcmVjdG9yeSBwcm92aWRlci4gVGhlIENvbnRhY3RzIHByb3ZpZGVyIHdpbGwgdHVybiBhcm91bmQKKyAgICAgICAgICogYW5kIHNlbmQgYSBxdWVyeSB0byB0aGUgZGlyZWN0b3J5IHByb3ZpZGVyIGZvciB0aGUgZnVsbCBsaXN0IG9mIGRpcmVjdG9yaWVzLAorICAgICAgICAgKiB3aGljaCB3aWxsIHJlcGxhY2UgdGhlIHByZXZpb3VzIGxpc3QuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgbm90aWZ5RGlyZWN0b3J5Q2hhbmdlKENvbnRlbnRSZXNvbHZlciByZXNvbHZlcikgeworICAgICAgICAgICAgLy8gVGhpcyBpcyBkb25lIHRvIHRyaWdnZXIgYSBxdWVyeSBieSBDb250YWN0cyBQcm92aWRlciBiYWNrIHRvIHRoZSBkaXJlY3RvcnkgcHJvdmlkZXIuCisgICAgICAgICAgICAvLyBObyBkYXRhIG5lZWRzIHRvIGJlIHNlbnQgYmFjaywgYmVjYXVzZSB0aGUgcHJvdmlkZXIgY2FuIGluZmVyIHRoZSBjYWxsaW5nCisgICAgICAgICAgICAvLyBwYWNrYWdlIGZyb20gYmluZGVyLgorICAgICAgICAgICAgQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKKyAgICAgICAgICAgIHJlc29sdmVyLnVwZGF0ZShEaXJlY3RvcnkuQ09OVEVOVF9VUkksIGNvbnRlbnRWYWx1ZXMsIG51bGwsIG51bGwpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCiAgICAgICogQGhpZGUgc2hvdWxkIGJlIHJlbW92ZWQgd2hlbiB1c2VycyBhcmUgdXBkYXRlZCB0byByZWZlciB0byBTeW5jU3RhdGUKICAgICAgKiBAZGVwcmVjYXRlZCB1c2UgU3luY1N0YXRlIGluc3RlYWQKICAgICAgKi8KQEAgLTEwNTYsNiArMTM1NCw1OSBAQAogCiAgICAgICAgIC8qKgogICAgICAgICAgKiA8cD4KKyAgICAgICAgICogQSBzdWItZGlyZWN0b3J5IG9mIGEgY29udGFjdCB0aGF0IGNvbnRhaW5zIGFsbCBvZiBpdHMKKyAgICAgICAgICoge0BsaW5rIENvbnRhY3RzQ29udHJhY3QuUmF3Q29udGFjdHN9IGFzIHdlbGwgYXMKKyAgICAgICAgICoge0BsaW5rIENvbnRhY3RzQ29udHJhY3QuRGF0YX0gcm93cy4gVG8gYWNjZXNzIHRoaXMgZGlyZWN0b3J5IGFwcGVuZAorICAgICAgICAgKiB7QGxpbmsgI0NPTlRFTlRfRElSRUNUT1JZfSB0byB0aGUgY29udGFjdCBVUkkuCisgICAgICAgICAqIDwvcD4KKyAgICAgICAgICogPHA+CisgICAgICAgICAqIEVudGl0eSBoYXMgdGhyZWUgSUQgZmllbGRzOiB7QGxpbmsgI0NPTlRBQ1RfSUR9IGZvciB0aGUgY29udGFjdCwKKyAgICAgICAgICoge0BsaW5rICNSQVdfQ09OVEFDVF9JRH0gZm9yIHRoZSByYXcgY29udGFjdCBhbmQge0BsaW5rICNEQVRBX0lEfSBmb3IKKyAgICAgICAgICogdGhlIGRhdGEgcm93cy4gRW50aXR5IGFsd2F5cyBjb250YWlucyBhdCBsZWFzdCBvbmUgcm93IHBlcgorICAgICAgICAgKiBjb25zdGl0dWVudCByYXcgY29udGFjdCwgZXZlbiBpZiB0aGVyZSBhcmUgbm8gYWN0dWFsIGRhdGEgcm93cy4gSW4KKyAgICAgICAgICogdGhpcyBjYXNlIHRoZSB7QGxpbmsgI0RBVEFfSUR9IGZpZWxkIHdpbGwgYmUgbnVsbC4KKyAgICAgICAgICogPC9wPgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogRW50aXR5IHJlYWRzIGFsbCBkYXRhIGZvciB0aGUgZW50aXJlIGNvbnRhY3QgaW4gb25lIHRyYW5zYWN0aW9uLCB0bworICAgICAgICAgKiBndWFyYW50ZWUgY29uc2lzdGVuY3kuICBUaGVyZSBpcyBzaWduaWZpY2FudCBkYXRhIGR1cGxpY2F0aW9uCisgICAgICAgICAqIGluIHRoZSBFbnRpdHkgKGVhY2ggcm93IHJlcGVhdHMgYWxsIENvbnRhY3QgY29sdW1ucyBhbmQgYWxsIFJhd0NvbnRhY3QKKyAgICAgICAgICogY29sdW1ucyksIHNvIHRoZSBiZW5lZml0cyBvZiB0cmFuc2FjdGlvbmFsIGNvbnNpc3RlbmN5IHNob3VsZCBiZSB3ZWlnaGVkCisgICAgICAgICAqIGFnYWluc3QgdGhlIGNvc3Qgb2YgdHJhbnNmZXJyaW5nIGxhcmdlIGFtb3VudHMgb2YgZGVub3JtYWxpemVkIGRhdGEKKyAgICAgICAgICogZnJvbSB0aGUgUHJvdmlkZXIuCisgICAgICAgICAqIDwvcD4KKyAgICAgICAgICoKKyAgICAgICAgICogQGhpZGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRW50aXR5IGltcGxlbWVudHMgQmFzZUNvbHVtbnMsIENvbnRhY3RzQ29sdW1ucywKKyAgICAgICAgICAgICAgICBDb250YWN0TmFtZUNvbHVtbnMsIFJhd0NvbnRhY3RzQ29sdW1ucywgQmFzZVN5bmNDb2x1bW5zLCBTeW5jQ29sdW1ucywgRGF0YUNvbHVtbnMsCisgICAgICAgICAgICAgICAgU3RhdHVzQ29sdW1ucywgQ29udGFjdE9wdGlvbnNDb2x1bW5zLCBDb250YWN0U3RhdHVzQ29sdW1ucyB7CisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIG5vIHB1YmxpYyBjb25zdHJ1Y3RvciBzaW5jZSB0aGlzIGlzIGEgdXRpbGl0eSBjbGFzcworICAgICAgICAgICAgICovCisgICAgICAgICAgICBwcml2YXRlIEVudGl0eSgpIHsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBUaGUgZGlyZWN0b3J5IHR3aWcgZm9yIHRoaXMgc3ViLXRhYmxlCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlRfRElSRUNUT1JZID0gImVudGl0aWVzIjsKKworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBUaGUgSUQgb2YgdGhlIHJhdyBjb250YWN0IHJvdy4KKyAgICAgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVI8L1A+CisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJBV19DT05UQUNUX0lEID0gInJhd19jb250YWN0X2lkIjsKKworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBUaGUgSUQgb2YgdGhlIGRhdGEgcm93LiBUaGUgdmFsdWUgd2lsbCBiZSBudWxsIGlmIHRoaXMgcmF3IGNvbnRhY3QgaGFzIG5vCisgICAgICAgICAgICAgKiBkYXRhIHJvd3MuCisgICAgICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSPC9QPgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRBX0lEID0gImRhdGFfaWQiOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIDxwPgogICAgICAgICAgKiBBIDxpPnJlYWQtb25seTwvaT4gc3ViLWRpcmVjdG9yeSBvZiBhIHNpbmdsZSBjb250YWN0IGFnZ3JlZ2F0ZSB0aGF0CiAgICAgICAgICAqIGNvbnRhaW5zIGFsbCBhZ2dyZWdhdGlvbiBzdWdnZXN0aW9ucyAob3RoZXIgY29udGFjdHMpLiBUaGUKICAgICAgICAgICogYWdncmVnYXRpb24gc3VnZ2VzdGlvbnMgYXJlIGNvbXB1dGVkIGJhc2VkIG9uIGFwcHJveGltYXRlIGRhdGEKQEAgLTEwOTQsNiArMTQ0NSwxMDYgQEAKICAgICAgICAgICAgICAqIHtAbGluayBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29udGFjdHMjQ09OVEVOVF9GSUxURVJfVVJJfS4KICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9ESVJFQ1RPUlkgPSAic3VnZ2VzdGlvbnMiOworCisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIFVzZWQgd2l0aCB7QGxpbmsgQnVpbGRlciNhZGRQYXJhbWV0ZXJ9IHRvIHNwZWNpZnkgd2hhdCBraW5kIG9mIGRhdGEgaXMKKyAgICAgICAgICAgICAqIHN1cHBsaWVkIGZvciB0aGUgc3VnZ2VzdGlvbiBxdWVyeS4KKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiBAaGlkZQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTUVURVJfTUFUQ0hfTkFNRSA9ICJuYW1lIjsKKworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBVc2VkIHdpdGgge0BsaW5rIEJ1aWxkZXIjYWRkUGFyYW1ldGVyfSB0byBzcGVjaWZ5IHdoYXQga2luZCBvZiBkYXRhIGlzCisgICAgICAgICAgICAgKiBzdXBwbGllZCBmb3IgdGhlIHN1Z2dlc3Rpb24gcXVlcnkuCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogQGhpZGUKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1FVEVSX01BVENIX0VNQUlMID0gImVtYWlsIjsKKworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBVc2VkIHdpdGgge0BsaW5rIEJ1aWxkZXIjYWRkUGFyYW1ldGVyfSB0byBzcGVjaWZ5IHdoYXQga2luZCBvZiBkYXRhIGlzCisgICAgICAgICAgICAgKiBzdXBwbGllZCBmb3IgdGhlIHN1Z2dlc3Rpb24gcXVlcnkuCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogQGhpZGUKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1FVEVSX01BVENIX1BIT05FID0gInBob25lIjsKKworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBVc2VkIHdpdGgge0BsaW5rIEJ1aWxkZXIjYWRkUGFyYW1ldGVyfSB0byBzcGVjaWZ5IHdoYXQga2luZCBvZiBkYXRhIGlzCisgICAgICAgICAgICAgKiBzdXBwbGllZCBmb3IgdGhlIHN1Z2dlc3Rpb24gcXVlcnkuCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogQGhpZGUKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1FVEVSX01BVENIX05JQ0tOQU1FID0gIm5pY2tuYW1lIjsKKworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBBIGNvbnZlbmllbmNlIGJ1aWxkZXIgZm9yIGFnZ3JlZ2F0aW9uIHN1Z2dlc3Rpb24gY29udGVudCBVUklzLgorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqIFRPRE86IGNoYW5nZSBkb2N1bWVudGF0aW9uIGZvciB0aGlzIGNsYXNzIHRvIHVzZSB0aGUgYnVpbGRlci4KKyAgICAgICAgICAgICAqIEBoaWRlCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQnVpbGRlciB7CisgICAgICAgICAgICAgICAgcHJpdmF0ZSBsb25nIG1Db250YWN0SWQ7CisgICAgICAgICAgICAgICAgcHJpdmF0ZSBBcnJheUxpc3Q8U3RyaW5nPiBtS2luZHMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKyAgICAgICAgICAgICAgICBwcml2YXRlIEFycmF5TGlzdDxTdHJpbmc+IG1WYWx1ZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKyAgICAgICAgICAgICAgICBwcml2YXRlIGludCBtTGltaXQ7CisKKyAgICAgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAgICAgKiBPcHRpb25hbCBleGlzdGluZyBjb250YWN0IElELiAgSWYgaXQgaXMgbm90IHByb3ZpZGVkLCB0aGUgc2VhcmNoCisgICAgICAgICAgICAgICAgICogd2lsbCBiZSBiYXNlZCBleGNsdXNpdmVseSBvbiB0aGUgdmFsdWVzIHN1cHBsaWVkIHdpdGgge0BsaW5rICNhZGRQYXJhbWV0ZXJ9LgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldENvbnRhY3RJZChsb25nIGNvbnRhY3RJZCkgeworICAgICAgICAgICAgICAgICAgICB0aGlzLm1Db250YWN0SWQgPSBjb250YWN0SWQ7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICAgICAqIEEgdmFsdWUgdGhhdCBjYW4gYmUgdXNlZCB3aGVuIHNlYXJjaGluZyBmb3IgYW4gYWdncmVnYXRpb24KKyAgICAgICAgICAgICAgICAgKiBzdWdnZXN0aW9uLgorICAgICAgICAgICAgICAgICAqCisgICAgICAgICAgICAgICAgICogQHBhcmFtIGtpbmQgY2FuIGJlIG9uZSBvZgorICAgICAgICAgICAgICAgICAqICAgICAgICAgICAge0BsaW5rIEFnZ3JlZ2F0aW9uU3VnZ2VzdGlvbnMjUEFSQU1FVEVSX01BVENIX05BTUV9LAorICAgICAgICAgICAgICAgICAqICAgICAgICAgICAge0BsaW5rIEFnZ3JlZ2F0aW9uU3VnZ2VzdGlvbnMjUEFSQU1FVEVSX01BVENIX0VNQUlMfSwKKyAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgIHtAbGluayBBZ2dyZWdhdGlvblN1Z2dlc3Rpb25zI1BBUkFNRVRFUl9NQVRDSF9OSUNLTkFNRX0sCisgICAgICAgICAgICAgICAgICogICAgICAgICAgICB7QGxpbmsgQWdncmVnYXRpb25TdWdnZXN0aW9ucyNQQVJBTUVURVJfTUFUQ0hfUEhPTkV9CisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgcHVibGljIEJ1aWxkZXIgYWRkUGFyYW1ldGVyKFN0cmluZyBraW5kLCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eSh2YWx1ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1LaW5kcy5hZGQoa2luZCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtVmFsdWVzLmFkZCh2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0TGltaXQoaW50IGxpbWl0KSB7CisgICAgICAgICAgICAgICAgICAgIG1MaW1pdCA9IGxpbWl0OworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwdWJsaWMgVXJpIGJ1aWxkKCkgeworICAgICAgICAgICAgICAgICAgICBhbmRyb2lkLm5ldC5VcmkuQnVpbGRlciBidWlsZGVyID0gQ29udGFjdHMuQ09OVEVOVF9VUkkuYnVpbGRVcG9uKCk7CisgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kRW5jb2RlZFBhdGgoU3RyaW5nLnZhbHVlT2YobUNvbnRhY3RJZCkpOworICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZFBhdGgoQ29udGFjdHMuQWdncmVnYXRpb25TdWdnZXN0aW9ucy5DT05URU5UX0RJUkVDVE9SWSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChtTGltaXQgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmRRdWVyeVBhcmFtZXRlcigibGltaXQiLCBTdHJpbmcudmFsdWVPZihtTGltaXQpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCA9IG1LaW5kcy5zaXplKCk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmRRdWVyeVBhcmFtZXRlcigicXVlcnkiLCBtS2luZHMuZ2V0KGkpICsgIjoiICsgbVZhbHVlcy5nZXQoaSkpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJ1aWxkZXIuYnVpbGQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogQGhpZGUKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCdWlsZGVyIGJ1aWxkZXIoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICAvKioKQEAgLTExNDcsNyArMTU5OCw2IEBACiAgICAgICAgICAgICAgKiB0aGF0IGNvdWxkIGJlIGluZmxhdGVkIHVzaW5nIHtAbGluayBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcEZhY3Rvcnl9LgogICAgICAgICAgICAgICogPHA+CiAgICAgICAgICAgICAgKiBUeXBlOiBCTE9CCi0gICAgICAgICAgICAgKiBAaGlkZSBUT0RPOiBVbmhpZGUgaW4gYSBzZXBhcmF0ZSBDTAogICAgICAgICAgICAgICovCiAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQSE9UTyA9IERBVEExNTsKICAgICAgICAgfQpAQCAtMTI0NCw2ICsxNjk0LDEzIEBACiAgICAgICAgICAqIEBoaWRlCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX1ZFUklGSUVEID0gIm5hbWVfdmVyaWZpZWQiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgInJlYWQtb25seSIgZmxhZzogIjAiIGJ5IGRlZmF1bHQsICIxIiBpZiB0aGUgcm93IGNhbm5vdCBiZSBtb2RpZmllZCBvcgorICAgICAgICAgKiBkZWxldGVkIGV4Y2VwdCBieSBhIHN5bmMgYWRhcHRlci4gIFNlZSB7QGxpbmsgQ29udGFjdHNDb250cmFjdCNDQUxMRVJfSVNfU1lOQ0FEQVBURVJ9LgorICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkFXX0NPTlRBQ1RfSVNfUkVBRF9PTkxZID0gInJhd19jb250YWN0X2lzX3JlYWRfb25seSI7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xNzUxLDcgKzIyMDgsNyBAQAogICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9ESVJFQ1RPUlkgPSAiZW50aXR5IjsKIAogICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBUaGUgSUQgb2YgdGhlIGRhdGEgY29sdW1uLiBUaGUgdmFsdWUgd2lsbCBiZSBudWxsIGlmIHRoaXMgcmF3IGNvbnRhY3QgaGFzIG5vCisgICAgICAgICAgICAgKiBUaGUgSUQgb2YgdGhlIGRhdGEgcm93LiBUaGUgdmFsdWUgd2lsbCBiZSBudWxsIGlmIHRoaXMgcmF3IGNvbnRhY3QgaGFzIG5vCiAgICAgICAgICAgICAgKiBkYXRhIHJvd3MuCiAgICAgICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSPC9QPgogICAgICAgICAgICAgICovCkBAIC0xODM5LDI4ICsyMjk2LDIxIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YS5EQVRBX1ZFUlNJT04pOwogICAgICAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBrZXkgOiBEQVRBX0tFWVMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBjb2x1bW5JbmRleCA9IGN1cnNvci5nZXRDb2x1bW5JbmRleE9yVGhyb3coa2V5KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJzb3IuaXNOdWxsKGNvbHVtbkluZGV4KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvbid0IHB1dCBhbnl0aGluZwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChjdXJzb3IuZ2V0VHlwZShjb2x1bW5JbmRleCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEN1cnNvci5GSUVMRF9UWVBFX05VTEw6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvbid0IHB1dCBhbnl0aGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEN1cnNvci5GSUVMRF9UWVBFX0lOVEVHRVI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDdXJzb3IuRklFTERfVFlQRV9GTE9BVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEN1cnNvci5GSUVMRF9UWVBFX1NUUklORzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3YucHV0KGtleSwgY3Vyc29yLmdldFN0cmluZyhjb2x1bW5JbmRleCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNRTGl0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ3Vyc29yLkZJRUxEX1RZUEVfQkxPQjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3YucHV0KGtleSwgY3Vyc29yLmdldEJsb2IoY29sdW1uSW5kZXgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkludmFsaWQgb3IgdW5oYW5kbGVkIGRhdGEgdHlwZSIpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogZ28gYmFjayB0byB0aGlzIHZlcnNpb24gb2YgdGhlIGNvZGUgd2hlbiBidWcKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGh0dHA6Ly9iL2lzc3VlP2lkPTIzMDYzNzAgaXMgZml4ZWQuCi0vLyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJzb3IuaXNOdWxsKGNvbHVtbkluZGV4KSkgewotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9uJ3QgcHV0IGFueXRoaW5nCi0vLyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY3Vyc29yLmlzTG9uZyhjb2x1bW5JbmRleCkpIHsKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcy5wdXQoa2V5LCBjdXJzb3IuZ2V0TG9uZyhjb2x1bW5JbmRleCkpOwotLy8gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGN1cnNvci5pc0Zsb2F0KGNvbHVtbkluZGV4KSkgewotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzLnB1dChrZXksIGN1cnNvci5nZXRGbG9hdChjb2x1bW5JbmRleCkpOwotLy8gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGN1cnNvci5pc1N0cmluZyhjb2x1bW5JbmRleCkpIHsKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcy5wdXQoa2V5LCBjdXJzb3IuZ2V0U3RyaW5nKGNvbHVtbkluZGV4KSk7Ci0vLyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY3Vyc29yLmlzQmxvYihjb2x1bW5JbmRleCkpIHsKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcy5wdXQoa2V5LCBjdXJzb3IuZ2V0QmxvYihjb2x1bW5JbmRleCkpOwotLy8gICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgY29udGFjdC5hZGRTdWJWYWx1ZShDb250YWN0c0NvbnRyYWN0LkRhdGEuQ09OVEVOVF9VUkksIGN2KTsKICAgICAgICAgICAgICAgICB9IHdoaWxlIChjdXJzb3IubW92ZVRvTmV4dCgpKTsKQEAgLTE5NjUsMTggKzI0MTUsMTkgQEAKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hBVF9DQVBBQklMSVRZID0gImNoYXRfY2FwYWJpbGl0eSI7CiAKICAgICAgICAgLyoqCi0gICAgICAgICAqIEFuIGFsbG93ZWQgdmFsdWUgb2Yge0BsaW5rICNDSEFUX0NBUEFCSUxJVFl9LiBJbmRpY2F0ZXMgdGhhdCB0aGUgY29udGFjdCdzIGRldmljZSBjYW4KKyAgICAgICAgICogQW4gYWxsb3dlZCBmbGFnIG9mIHtAbGluayAjQ0hBVF9DQVBBQklMSVRZfS4gSW5kaWNhdGVzIGF1ZGlvLWNoYXQgY2FwYWJpbGl0eSAobWljcm9waG9uZQorICAgICAgICAgKiBhbmQgc3BlYWtlcikKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENBUEFCSUxJVFlfSEFTX1ZPSUNFID0gMTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQW4gYWxsb3dlZCBmbGFnIG9mIHtAbGluayAjQ0hBVF9DQVBBQklMSVRZfS4gSW5kaWNhdGVzIHRoYXQgdGhlIGNvbnRhY3QncyBkZXZpY2UgY2FuCiAgICAgICAgICAqIGRpc3BsYXkgYSB2aWRlbyBmZWVkLgogICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FQQUJJTElUWV9IQVNfVklERU9fUExBWUJBQ0tfT05MWSA9IDE7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENBUEFCSUxJVFlfSEFTX1ZJREVPID0gMjsKIAogICAgICAgICAvKioKLSAgICAgICAgICogQW4gYWxsb3dlZCB2YWx1ZSBvZiB7QGxpbmsgI0NIQVRfQ0FQQUJJTElUWX0uIEluZGljYXRlcyBhdWRpby1jaGF0IGNhcGFiaWxpdHkuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQVBBQklMSVRZX0hBU19WT0lDRSA9IDI7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFuIGFsbG93ZWQgdmFsdWUgb2Yge0BsaW5rICNDSEFUX0NBUEFCSUxJVFl9LiBJbmRpY2F0ZXMgdGhhdCB0aGUgY29udGFjdCdzIGRldmljZSBoYXMgYQorICAgICAgICAgKiBBbiBhbGxvd2VkIGZsYWcgb2Yge0BsaW5rICNDSEFUX0NBUEFCSUxJVFl9LiBJbmRpY2F0ZXMgdGhhdCB0aGUgY29udGFjdCdzIGRldmljZSBoYXMgYQogICAgICAgICAgKiBjYW1lcmEgdGhhdCBjYW4gYmUgdXNlZCBmb3IgdmlkZW8gY2hhdCAoZS5nLiBhIGZyb250LWZhY2luZyBjYW1lcmEgb24gYSBwaG9uZSkuCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQVBBQklMSVRZX0hBU19DQU1FUkEgPSA0OwpAQCAtMjAyMyw2ICsyNDc0LDEzIEBACiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElTX1NVUEVSX1BSSU1BUlkgPSAiaXNfc3VwZXJfcHJpbWFyeSI7CiAKICAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSAicmVhZC1vbmx5IiBmbGFnOiAiMCIgYnkgZGVmYXVsdCwgIjEiIGlmIHRoZSByb3cgY2Fubm90IGJlIG1vZGlmaWVkIG9yCisgICAgICAgICAqIGRlbGV0ZWQgZXhjZXB0IGJ5IGEgc3luYyBhZGFwdGVyLiAgU2VlIHtAbGluayBDb250YWN0c0NvbnRyYWN0I0NBTExFUl9JU19TWU5DQURBUFRFUn0uCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVI8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJU19SRUFEX09OTFkgPSAiaXNfcmVhZF9vbmx5IjsKKworICAgICAgICAvKioKICAgICAgICAgICogVGhlIHZlcnNpb24gb2YgdGhpcyBkYXRhIHJlY29yZC4gVGhpcyBpcyBhIHJlYWQtb25seSB2YWx1ZS4gVGhlIGRhdGEgY29sdW1uIGlzCiAgICAgICAgICAqIGd1YXJhbnRlZWQgdG8gbm90IGNoYW5nZSB3aXRob3V0IHRoZSB2ZXJzaW9uIGdvaW5nIHVwLiBUaGlzIHZhbHVlIGlzIG1vbm90b25pY2FsbHkKICAgICAgICAgICogaW5jcmVhc2luZy4KQEAgLTMxMjgsMTAgKzM1ODYsMTEgQEAKICAgICAgKiA8dGQ+aW50PC90ZD4KICAgICAgKiA8dGQ+e0BsaW5rICNDSEFUX0NBUEFCSUxJVFl9PC90ZD4KICAgICAgKiA8dGQ+cmVhZC93cml0ZTwvdGQ+Ci0gICAgICogPHRkPkNvbnRhY3QgSU0gY2hhdCBjb21wYXRpYmlsaXR5IHZhbHVlLiBUaGUgYWxsb3dlZCB2YWx1ZXMgYXJlOgorICAgICAqIDx0ZD5Db250YWN0IElNIGNoYXQgY29tcGF0aWJpbGl0eSB2YWx1ZS4gVGhlIGFsbG93ZWQgdmFsdWVzIGNvbWJpbmF0aW9ucyBvZiB0aGUgZm9sbG93aW5nCisgICAgICogZmxhZ3MuIElmIE5vbmUgb2YgdGhlc2UgZmxhZ3MgaXMgc2V0LCB0aGUgZGV2aWNlIGNhbiBvbmx5IGRvIHRleHQgbWVzc2FnaW5nLgogICAgICAqIDxwPgogICAgICAqIDx1bD4KLSAgICAgKiA8bGk+e0BsaW5rICNDQVBBQklMSVRZX0hBU19WSURFT19QTEFZQkFDS19PTkxZfTwvbGk+CisgICAgICogPGxpPntAbGluayAjQ0FQQUJJTElUWV9IQVNfVklERU99PC9saT4KICAgICAgKiA8bGk+e0BsaW5rICNDQVBBQklMSVRZX0hBU19WT0lDRX08L2xpPgogICAgICAqIDxsaT57QGxpbmsgI0NBUEFCSUxJVFlfSEFTX0NBTUVSQX08L2xpPgogICAgICAqIDwvdWw+CkBAIC0zODc5LDcgKzQzMzgsNiBAQAogICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAgKiBUaGUgZW1haWwgYWRkcmVzcy4KICAgICAgICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+Ci0gICAgICAgICAgICAgKiBAaGlkZSBUT0RPOiBVbmhpZGUgaW4gYSBzZXBhcmF0ZSBDTAogICAgICAgICAgICAgICovCiAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBRERSRVNTID0gREFUQTE7CiAKQEAgLTQ5NTEsNiArNTQwOSwyMyBAQAogICAgICAgICAgKiBUeXBlOiBJTlRFR0VSIChib29sZWFuKQogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0hPVUxEX1NZTkMgPSAic2hvdWxkX3N5bmMiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBBbnkgbmV3bHkgY3JlYXRlZCBjb250YWN0cyB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgYWRkZWQgdG8gZ3JvdXBzIHRoYXQgaGF2ZSB0aGlzCisgICAgICAgICAqIGZsYWcgc2V0IHRvIHRydWUuCisgICAgICAgICAqIDxwPgorICAgICAgICAgKiBUeXBlOiBJTlRFR0VSIChib29sZWFuKQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVVUT19BREQgPSAiYXV0b19hZGQiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBXaGVuIGEgY29udGFjdHMgaXMgbWFya2VkIGFzIGEgZmF2b3JpdGVzIGl0IHdpbGwgYmUgYXV0b21hdGljYWxseSBhZGRlZAorICAgICAgICAgKiB0byB0aGUgZ3JvdXBzIHRoYXQgaGF2ZSB0aGlzIGZsYWcgc2V0LCBhbmQgd2hlbiBpdCBpcyByZW1vdmVkIGZyb20gZmF2b3JpdGVzCisgICAgICAgICAqIGl0IHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoZXNlIGdyb3Vwcy4KKyAgICAgICAgICogPHA+CisgICAgICAgICAqIFR5cGU6IElOVEVHRVIgKGJvb2xlYW4pCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGQVZPUklURVMgPSAiZmF2b3JpdGVzIjsKICAgICB9CiAKICAgICAvKioKQEAgLTUwOTEsNiArNTU2Niw4IEBACiAgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JMb25nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgdmFsdWVzLCBERUxFVEVEKTsKICAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvclN0cmluZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIHZhbHVlcywgTk9URVMpOwogICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yU3RyaW5nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgdmFsdWVzLCBTSE9VTERfU1lOQyk7CisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCB2YWx1ZXMsIEZBVk9SSVRFUyk7CisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCB2YWx1ZXMsIEFVVE9fQUREKTsKICAgICAgICAgICAgICAgICBjdXJzb3IubW92ZVRvTmV4dCgpOwogICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRW50aXR5KHZhbHVlcyk7CiAgICAgICAgICAgICB9CkBAIC01NjA3LDYgKzYwODQsMjggQEAKICAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuY29udGFjdHMuYWN0aW9uLlNIT1dfT1JfQ1JFQVRFX0NPTlRBQ1QiOwogCiAgICAgICAgIC8qKgorICAgICAgICAgKiBTdGFydHMgYW4gQWN0aXZpdHkgdGhhdCBsZXRzIHRoZSB1c2VyIHNlbGVjdCB0aGUgbXVsdGlwbGUgcGhvbmVzIGZyb20gYQorICAgICAgICAgKiBsaXN0IG9mIHBob25lIG51bWJlcnMgd2hpY2ggY29tZSBmcm9tIHRoZSBjb250YWN0cyBvcgorICAgICAgICAgKiB7QGxpbmsgI0VYVFJBX1BIT05FX1VSSVN9LgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogVGhlIHBob25lIG51bWJlcnMgYmVpbmcgcGFzc2VkIGluIHRocm91Z2gge0BsaW5rICNFWFRSQV9QSE9ORV9VUklTfQorICAgICAgICAgKiBjb3VsZCBiZWxvbmcgdG8gdGhlIGNvbnRhY3RzIG9yIG5vdCwgYW5kIHdpbGwgYmUgc2VsZWN0ZWQgYnkgZGVmYXVsdC4KKyAgICAgICAgICogPHA+CisgICAgICAgICAqIFRoZSB1c2VyJ3Mgc2VsZWN0aW9uIHdpbGwgYmUgcmV0dXJuZWQgZnJvbQorICAgICAgICAgKiB7QGxpbmsgYW5kcm9pZC5hcHAuQWN0aXZpdHkjb25BY3Rpdml0eVJlc3VsdChpbnQsIGludCwgYW5kcm9pZC5jb250ZW50LkludGVudCl9CisgICAgICAgICAqIGlmIHRoZSByZXN1bHRDb2RlIGlzCisgICAgICAgICAqIHtAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eSNSRVNVTFRfT0t9LCB0aGUgYXJyYXkgb2YgcGlja2VkIHBob25lCisgICAgICAgICAqIG51bWJlcnMgYXJlIGluIHRoZSBJbnRlbnQncworICAgICAgICAgKiB7QGxpbmsgI0VYVFJBX1BIT05FX1VSSVN9OyBvdGhlcndpc2UsIHRoZQorICAgICAgICAgKiB7QGxpbmsgYW5kcm9pZC5hcHAuQWN0aXZpdHkjUkVTVUxUX0NBTkNFTEVEfSBpcyByZXR1cm5lZCBpZiB0aGUgdXNlcgorICAgICAgICAgKiBsZWZ0IHRoZSBBY3Rpdml0eSB3aXRob3V0IGNoYW5naW5nIHRoZSBzZWxlY3Rpb24uCisgICAgICAgICAqCisgICAgICAgICAqIEBoaWRlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fR0VUX01VTFRJUExFX1BIT05FUyA9CisgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLmNvbnRhY3RzLmFjdGlvbi5HRVRfTVVMVElQTEVfUEhPTkVTIjsKKworICAgICAgICAvKioKICAgICAgICAgICogVXNlZCB3aXRoIHtAbGluayAjU0hPV19PUl9DUkVBVEVfQ09OVEFDVH0gdG8gZm9yY2UgY3JlYXRpbmcgYSBuZXcKICAgICAgICAgICogY29udGFjdCBpZiBubyBtYXRjaGluZyBjb250YWN0IGZvdW5kLiBPdGhlcndpc2UsIGRlZmF1bHQgYmVoYXZpb3IgaXMKICAgICAgICAgICogdG8gcHJvbXB0IHVzZXIgd2l0aCBkaWFsb2cgYmVmb3JlIGNyZWF0aW5nLgpAQCAtNTYyNyw2ICs2MTI2LDIzIEBACiAgICAgICAgICAgICAiY29tLmFuZHJvaWQuY29udGFjdHMuYWN0aW9uLkNSRUFURV9ERVNDUklQVElPTiI7CiAKICAgICAgICAgLyoqCisgICAgICAgICAqIFVzZWQgd2l0aCB7QGxpbmsgI0FDVElPTl9HRVRfTVVMVElQTEVfUEhPTkVTfSBhcyB0aGUgaW5wdXQgb3Igb3V0cHV0IHZhbHVlLgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogVGhlIHBob25lIG51bWJlcnMgd2FudCB0byBiZSBwaWNrZWQgYnkgZGVmYXVsdCBzaG91bGQgYmUgcGFzc2VkIGluIGFzCisgICAgICAgICAqIGlucHV0IHZhbHVlLiBUaGVzZSBwaG9uZSBudW1iZXJzIGNvdWxkIGJlbG9uZyB0byB0aGUgY29udGFjdHMgb3Igbm90LgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogVGhlIHBob25lIG51bWJlcnMgd2hpY2ggd2VyZSBwaWNrZWQgYnkgdGhlIHVzZXIgYXJlIHJldHVybmVkIGFzIG91dHB1dAorICAgICAgICAgKiB2YWx1ZS4KKyAgICAgICAgICogPHA+CisgICAgICAgICAqIFR5cGU6IGFycmF5IG9mIFVSSXMsIHRoZSB0ZWwgVVJJIGlzIHVzZWQgZm9yIHRoZSBwaG9uZSBudW1iZXJzIHdoaWNoIGRvbid0CisgICAgICAgICAqIGJlbG9uZyB0byBhbnkgY29udGFjdCwgdGhlIGNvbnRlbnQgVVJJIGlzIHVzZWQgZm9yIHBob25lIGlkIGluIGNvbnRhY3RzLgorICAgICAgICAgKgorICAgICAgICAgKiBAaGlkZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfUEhPTkVfVVJJUyA9CisgICAgICAgICAgICAiY29tLmFuZHJvaWQuY29udGFjdHMuZXh0cmEuUEhPTkVfVVJJUyI7CisKKyAgICAgICAgLyoqCiAgICAgICAgICAqIE9wdGlvbmFsIGV4dHJhIHVzZWQgd2l0aCB7QGxpbmsgI1NIT1dfT1JfQ1JFQVRFX0NPTlRBQ1R9IHRvIHNwZWNpZnkgYQogICAgICAgICAgKiBkaWFsb2cgbG9jYXRpb24gdXNpbmcgc2NyZWVuIGNvb3JkaW5hdGVzLiBXaGVuIG5vdCBzcGVjaWZpZWQsIHRoZQogICAgICAgICAgKiBkaWFsb2cgd2lsbCBiZSBjZW50ZXJlZC4KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL01lZGlhU3RvcmUuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL01lZGlhU3RvcmUuamF2YQppbmRleCBkMjBlODlkLi42MGNjZGFmIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9NZWRpYVN0b3JlLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvTWVkaWFTdG9yZS5qYXZhCkBAIC0yMzcsOSArMjM3LDgyIEBACiAgICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+CiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNSU1FX1RZUEUgPSAibWltZV90eXBlIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHJvdyBJRCBpbiB0aGUgTVRQIG9iamVjdCB0YWJsZSBjb3JyZXNwb25kaW5nIHRvIHRoaXMgbWVkaWEgZmlsZS4KKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUjwvUD4KKyAgICAgICAgICogQGhpZGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1UUF9PQkpFQ1RfSUQgPSAib2JqZWN0X2lkIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIE1UUCBvYmplY3QgaGFuZGxlIG9mIGEgbmV3bHkgdHJhbnNmZXJlZCBmaWxlLgorICAgICAgICAgKiBVc2VkIHRvIHBhc3MgdGhlIG5ldyBmaWxlJ3Mgb2JqZWN0IGhhbmRsZSB0aHJvdWdoIHRoZSBtZWRpYSBzY2FubmVyCisgICAgICAgICAqIGZyb20gTVRQIHRvIHRoZSBtZWRpYSBwcm92aWRlcgorICAgICAgICAgKiBGb3IgaW50ZXJuYWwgdXNlIG9ubHkgYnkgTVRQLCBtZWRpYSBzY2FubmVyIGFuZCBtZWRpYSBwcm92aWRlci4KKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUjwvUD4KKyAgICAgICAgICogQGhpZGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FRElBX1NDQU5ORVJfTkVXX09CSkVDVF9JRCA9ICJtZWRpYV9zY2FubmVyX25ld19vYmplY3RfaWQiOwogICAgICB9CiAKICAgICAvKioKKyAgICAgKiBNZWRpYSBwcm92aWRlciBpbnRlcmZhY2UgdXNlZCBieSBNVFAgaW1wbGVtZW50YXRpb24uCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIE10cE9iamVjdHMgeworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgVXJpIGdldENvbnRlbnRVcmkoU3RyaW5nIHZvbHVtZU5hbWUpIHsKKyAgICAgICAgICAgIHJldHVybiBVcmkucGFyc2UoQ09OVEVOVF9BVVRIT1JJVFlfU0xBU0ggKyB2b2x1bWVOYW1lICsKKyAgICAgICAgICAgICAgICAgICAgIi9vYmplY3QiKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVXJpIGdldENvbnRlbnRVcmkoU3RyaW5nIHZvbHVtZU5hbWUsCisgICAgICAgICAgICAgICAgbG9uZyBvYmplY3RJZCkgeworICAgICAgICAgICAgcmV0dXJuIFVyaS5wYXJzZShDT05URU5UX0FVVEhPUklUWV9TTEFTSCArIHZvbHVtZU5hbWUKKyAgICAgICAgICAgICAgICAgICAgKyAiL29iamVjdC8iICsgb2JqZWN0SWQpOworICAgICAgICB9CisKKyAgICAgICAgLy8gdXNlZCBmb3IgTVRQIEdldE9iamVjdFJlZmVyZW5jZXMgYW5kIFNldE9iamVjdFJlZmVyZW5jZXMKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVcmkgZ2V0UmVmZXJlbmNlc1VyaShTdHJpbmcgdm9sdW1lTmFtZSwKKyAgICAgICAgICAgICAgICBsb25nIG9iamVjdElkKSB7CisgICAgICAgICAgICByZXR1cm4gVXJpLnBhcnNlKENPTlRFTlRfQVVUSE9SSVRZX1NMQVNIICsgdm9sdW1lTmFtZQorICAgICAgICAgICAgICAgICAgICArICIvb2JqZWN0LyIgKyBvYmplY3RJZCArICIvcmVmZXJlbmNlcyIpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEZpZWxkcyBmb3IgbWFzdGVyIHRhYmxlIGZvciBhbGwgbWVkaWEgZmlsZXMuCisgICAgICAgICAqIFRhYmxlIGFsc28gY29udGFpbnMgTWVkaWFDb2x1bW5zLl9JRCwgREFUQSwgU0laRSBhbmQgREFURV9NT0RJRklFRC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBpbnRlcmZhY2UgT2JqZWN0Q29sdW1ucyBleHRlbmRzIE1lZGlhQ29sdW1ucyB7CisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIFRoZSBNVFAgZm9ybWF0IGNvZGUgb2YgdGhlIGZpbGUKKyAgICAgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVI8L1A+CisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1BVCA9ICJmb3JtYXQiOworCisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIFRoZSBpbmRleCBvZiB0aGUgcGFyZW50IGRpcmVjdG9yeSBvZiB0aGUgZmlsZQorICAgICAgICAgICAgICogPFA+VHlwZTogSU5URUdFUjwvUD4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSRU5UID0gInBhcmVudCI7CisKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogSWRlbnRpZmllciBmb3IgdGhlIG1lZGlhIHRhYmxlIGNvbnRhaW5pbmcgdGhlIG9iamVjdC4KKyAgICAgICAgICAgICAqIFVzZWQgaW50ZXJuYWxseSBieSBNZWRpYVByb3ZpZGVyCisgICAgICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSPC9QPgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRURJQV9UQUJMRSA9ICJtZWRpYV90YWJsZSI7CisKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogVGhlIElEIG9mIHRoZSBvYmplY3QgaW4gaXRzIG1lZGlhIHRhYmxlLgorICAgICAgICAgICAgICogPFA+VHlwZTogSU5URUdFUjwvUD4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVESUFfSUQgPSAibWVkaWFfaWQiOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCiAgICAgICogVGhpcyBjbGFzcyBpcyB1c2VkIGludGVybmFsbHkgYnkgSW1hZ2VzLlRodW1ibmFpbHMgYW5kIFZpZGVvLlRodW1ibmFpbHMsIGl0J3Mgbm90IGludGVuZGVkCiAgICAgICogdG8gYmUgYWNjZXNzZWQgZWxzZXdoZXJlLgogICAgICAqLwpAQCAtMzE5LDI2ICszOTIsMjcgQEAKICAgICAgICAgICAgIC8vIExvZy52KFRBRywgImdldFRodW1ibmFpbDogb3JpZ0lkPSIrb3JpZ0lkKyIsIGtpbmQ9IitraW5kKyIsIGlzVmlkZW89Iitpc1ZpZGVvKTsKICAgICAgICAgICAgIC8vIElmIHRoZSBtYWdpYyBpcyBub24temVybywgd2Ugc2ltcGx5IHJldHVybiB0aHVtYm5haWwgaWYgaXQgZG9lcyBleGlzdC4KICAgICAgICAgICAgIC8vIHF1ZXJ5aW5nIE1lZGlhUHJvdmlkZXIgYW5kIHNpbXBseSByZXR1cm4gdGh1bWJuYWlsLgotICAgICAgICAgICAgTWluaVRodW1iRmlsZSB0aHVtYkZpbGUgPSBNaW5pVGh1bWJGaWxlLmluc3RhbmNlKGJhc2VVcmkpOwotICAgICAgICAgICAgbG9uZyBtYWdpYyA9IHRodW1iRmlsZS5nZXRNYWdpYyhvcmlnSWQpOwotICAgICAgICAgICAgaWYgKG1hZ2ljICE9IDApIHsKLSAgICAgICAgICAgICAgICBpZiAoa2luZCA9PSBNSUNST19LSU5EKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAoc1RodW1iQnVmTG9jaykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNUaHVtYkJ1ZiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc1RodW1iQnVmID0gbmV3IGJ5dGVbTWluaVRodW1iRmlsZS5CWVRFU19QRVJfTUlOVEhVTUJdOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRodW1iRmlsZS5nZXRNaW5pVGh1bWJGcm9tRmlsZShvcmlnSWQsIHNUaHVtYkJ1ZikgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdG1hcCA9IEJpdG1hcEZhY3RvcnkuZGVjb2RlQnl0ZUFycmF5KHNUaHVtYkJ1ZiwgMCwgc1RodW1iQnVmLmxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJpdG1hcCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgImNvdWxkbid0IGRlY29kZSBieXRlIGFycmF5LiIpOworICAgICAgICAgICAgTWluaVRodW1iRmlsZSB0aHVtYkZpbGUgPSBuZXcgTWluaVRodW1iRmlsZShpc1ZpZGVvID8gVmlkZW8uTWVkaWEuRVhURVJOQUxfQ09OVEVOVF9VUkkKKyAgICAgICAgICAgICAgICAgICAgOiBJbWFnZXMuTWVkaWEuRVhURVJOQUxfQ09OVEVOVF9VUkkpOworICAgICAgICAgICAgQ3Vyc29yIGMgPSBudWxsOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBsb25nIG1hZ2ljID0gdGh1bWJGaWxlLmdldE1hZ2ljKG9yaWdJZCk7CisgICAgICAgICAgICAgICAgaWYgKG1hZ2ljICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPT0gTUlDUk9fS0lORCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChzVGh1bWJCdWZMb2NrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNUaHVtYkJ1ZiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNUaHVtYkJ1ZiA9IG5ldyBieXRlW01pbmlUaHVtYkZpbGUuQllURVNfUEVSX01JTlRIVU1CXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRodW1iRmlsZS5nZXRNaW5pVGh1bWJGcm9tRmlsZShvcmlnSWQsIHNUaHVtYkJ1ZikgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRtYXAgPSBCaXRtYXBGYWN0b3J5LmRlY29kZUJ5dGVBcnJheShzVGh1bWJCdWYsIDAsIHNUaHVtYkJ1Zi5sZW5ndGgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYml0bWFwID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgImNvdWxkbid0IGRlY29kZSBieXRlIGFycmF5LiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBiaXRtYXA7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChraW5kID09IE1JTklfS0lORCkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY29sdW1uID0gaXNWaWRlbyA/ICJ2aWRlb19pZD0iIDogImltYWdlX2lkPSI7Ci0gICAgICAgICAgICAgICAgICAgIEN1cnNvciBjID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiaXRtYXA7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoa2luZCA9PSBNSU5JX0tJTkQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjb2x1bW4gPSBpc1ZpZGVvID8gInZpZGVvX2lkPSIgOiAiaW1hZ2VfaWQ9IjsKICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSBjci5xdWVyeShiYXNlVXJpLCBQUk9KRUNUSU9OLCBjb2x1bW4gKyBvcmlnSWQsIG51bGwsIG51bGwpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGMgIT0gbnVsbCAmJiBjLm1vdmVUb0ZpcnN0KCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRtYXAgPSBnZXRNaW5pVGh1bWJGcm9tRmlsZShjLCBiYXNlVXJpLCBjciwgb3B0aW9ucyk7CkBAIC0zNDYsMTcgKzQyMCwxMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYml0bWFwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjICE9IG51bGwpIGMuY2xvc2UoKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgQ3Vyc29yIGMgPSBudWxsOwotICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICBVcmkgYmxvY2tpbmdVcmkgPSBiYXNlVXJpLmJ1aWxkVXBvbigpLmFwcGVuZFF1ZXJ5UGFyYW1ldGVyKCJibG9ja2luZyIsICIxIikKICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmRRdWVyeVBhcmFtZXRlcigib3JpZ19pZCIsIFN0cmluZy52YWx1ZU9mKG9yaWdJZCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kUXVlcnlQYXJhbWV0ZXIoImdyb3VwX2lkIiwgU3RyaW5nLnZhbHVlT2YoZ3JvdXBJZCkpLmJ1aWxkKCk7CisgICAgICAgICAgICAgICAgaWYgKGMgIT0gbnVsbCkgYy5jbG9zZSgpOwogICAgICAgICAgICAgICAgIGMgPSBjci5xdWVyeShibG9ja2luZ1VyaSwgUFJPSkVDVElPTiwgbnVsbCwgbnVsbCwgbnVsbCk7CiAgICAgICAgICAgICAgICAgLy8gVGhpcyBoYXBwZW5zIHdoZW4gb3JpZ2luYWwgaW1hZ2UvdmlkZW8gZG9lc24ndCBleGlzdC4KICAgICAgICAgICAgICAgICBpZiAoYyA9PSBudWxsKSByZXR1cm4gbnVsbDsKQEAgLTQwNyw2ICs0NzcsOSBAQAogICAgICAgICAgICAgICAgIExvZy53KFRBRywgZXgpOwogICAgICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgICAgICBpZiAoYyAhPSBudWxsKSBjLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgLy8gVG8gYXZvaWQgZmlsZSBkZXNjcmlwdG9yIGxlYWsgaW4gYXBwbGljYXRpb24gcHJvY2Vzcy4KKyAgICAgICAgICAgICAgICB0aHVtYkZpbGUuZGVhY3RpdmF0ZSgpOworICAgICAgICAgICAgICAgIHRodW1iRmlsZSA9IG51bGw7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gYml0bWFwOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9NdHAuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL010cC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjNzY0YWMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9NdHAuamF2YQpAQCAtMCwwICsxLDM0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5wcm92aWRlcjsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VXJpczsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworCisvKioKKyAqIFRoZSBNVFAgcHJvdmlkZXIgc3VwcG9ydHMgYWNjZXNzaW5nIGNvbnRlbnQgb24gTVRQIGFuZCBQVFAgZGV2aWNlcy4KKyAqIEBoaWRlCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBNdHAKK3sKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgVEFHID0gIk10cCI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVVRIT1JJVFkgPSAibXRwIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX0FVVEhPUklUWV9TTEFTSCA9ICJjb250ZW50Oi8vIiArIEFVVEhPUklUWSArICIvIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9BVVRIT1JJVFlfREVWSUNFX1NMQVNIID0gImNvbnRlbnQ6Ly8iICsgQVVUSE9SSVRZICsgIi9kZXZpY2UvIjsKKworICAgIC8qKgorICAgICAqIENvbnRhaW5zIGxpc3Qgb2YgYWxsIE1UUC9QVFAgZGV2aWNlcworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRGV2aWNlIGltcGxlbWVudHMgQmFzZUNvbHVtbnMgeworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVXJpIENPTlRFTlRfVVJJID0gVXJpLnBhcnNlKENPTlRFTlRfQVVUSE9SSVRZX1NMQVNIICsgImRldmljZSIpOworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgVXJpIGdldENvbnRlbnRVcmkoaW50IGRldmljZUlEKSB7CisgICAgICAgICAgICByZXR1cm4gVXJpLnBhcnNlKENPTlRFTlRfQVVUSE9SSVRZX0RFVklDRV9TTEFTSCArIGRldmljZUlEKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgbWFudWZhY3R1cmVyIG9mIHRoZSBkZXZpY2UKKyAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BTlVGQUNUVVJFUiA9ICJtYW51ZmFjdHVyZXIiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgbW9kZWwgbmFtZSBvZiB0aGUgZGV2aWNlCisgICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNT0RFTCA9ICJtb2RlbCI7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udGFpbnMgbGlzdCBvZiBzdG9yYWdlIHVuaXRzIGZvciBhbiBNVFAvUFRQIGRldmljZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgU3RvcmFnZSBpbXBsZW1lbnRzIEJhc2VDb2x1bW5zIHsKKworICAgICAgICBwdWJsaWMgc3RhdGljIFVyaSBnZXRDb250ZW50VXJpKGludCBkZXZpY2VJRCkgeworICAgICAgICAgICAgcmV0dXJuIFVyaS5wYXJzZShDT05URU5UX0FVVEhPUklUWV9ERVZJQ0VfU0xBU0ggKyBkZXZpY2VJRCArICIvc3RvcmFnZSIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBVcmkgZ2V0Q29udGVudFVyaShpbnQgZGV2aWNlSUQsIGludCBzdG9yYWdlSUQpIHsKKyAgICAgICAgICAgIHJldHVybiBVcmkucGFyc2UoQ09OVEVOVF9BVVRIT1JJVFlfREVWSUNFX1NMQVNIICsgZGV2aWNlSUQgKyAiL3N0b3JhZ2UvIiArIHN0b3JhZ2VJRCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU3RvcmFnZSB1bml0IGlkZW50aWZpZXIKKyAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElERU5USUZJRVIgPSAiaWRlbnRpZmllciI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFN0b3JhZ2UgdW5pdCBkZXNjcmlwdGlvbgorICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTQ1JJUFRJT04gPSAiZGVzY3JpcHRpb24iOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnRhaW5zIGxpc3Qgb2Ygb2JqZWN0cyBvbiBhbiBNVFAvUFRQIGRldmljZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgT2JqZWN0IGltcGxlbWVudHMgQmFzZUNvbHVtbnMgeworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgVXJpIGdldENvbnRlbnRVcmkoaW50IGRldmljZUlELCBpbnQgb2JqZWN0SUQpIHsKKyAgICAgICAgICAgIHJldHVybiBVcmkucGFyc2UoQ09OVEVOVF9BVVRIT1JJVFlfREVWSUNFX1NMQVNIICsgZGV2aWNlSUQKKyAgICAgICAgICAgICAgICAgICAgKyAiL29iamVjdC8iICsgb2JqZWN0SUQpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBVcmkgZ2V0Q29udGVudFVyaUZvck9iamVjdENoaWxkcmVuKGludCBkZXZpY2VJRCwgaW50IG9iamVjdElEKSB7CisgICAgICAgICAgICByZXR1cm4gVXJpLnBhcnNlKENPTlRFTlRfQVVUSE9SSVRZX0RFVklDRV9TTEFTSCArIGRldmljZUlECisgICAgICAgICAgICAgICAgICAgICsgIi9vYmplY3QvIiArIG9iamVjdElEICsgIi9jaGlsZCIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBVcmkgZ2V0Q29udGVudFVyaUZvclN0b3JhZ2VDaGlsZHJlbihpbnQgZGV2aWNlSUQsIGludCBzdG9yYWdlSUQpIHsKKyAgICAgICAgICAgIHJldHVybiBVcmkucGFyc2UoQ09OVEVOVF9BVVRIT1JJVFlfREVWSUNFX1NMQVNIICsgZGV2aWNlSUQKKyAgICAgICAgICAgICAgICAgICAgKyAiL3N0b3JhZ2UvIiArIHN0b3JhZ2VJRCArICIvY2hpbGQiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgZm9sbG93aW5nIGNvbHVtbnMgY29ycmVzcG9uZCB0byB0aGUgZmllbGRzIGluIHRoZSBPYmplY3RJbmZvIGRhdGFzZXQKKyAgICAgICAgICogYXMgZGVzY3JpYmVkIGluIHRoZSBNVFAgc3BlY2lmaWNhdGlvbi4KKyAgICAgICAgICovCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBJRCBvZiB0aGUgc3RvcmFnZSB1bml0IGNvbnRhaW5pbmcgdGhlIG9iamVjdC4KKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUjwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUT1JBR0VfSUQgPSAic3RvcmFnZV9pZCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBvYmplY3QncyBmb3JtYXQuICBDYW4gYmUgb25lIG9mIHRoZSBGT1JNQVRfKiBzeW1ib2xzIGJlbG93LAorICAgICAgICAgKiBvciBhbnkgb2YgdGhlIHZhbGlkIE1UUCBvYmplY3QgZm9ybWF0cyBhcyBkZWZpbmVkIGluIHRoZSBNVFAgc3BlY2lmaWNhdGlvbi4KKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUjwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1BVCA9ICJmb3JtYXQiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgcHJvdGVjdGlvbiBzdGF0dXMgb2YgdGhlIG9iamVjdC4gIFNlZSB0aGUgUFJPVEVDVElPTl9TVEFUVVNfKnN5bWJvbHMgYmVsb3cuCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVI8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9URUNUSU9OX1NUQVRVUyA9ICJwcm90ZWN0aW9uX3N0YXR1cyI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBzaXplIG9mIHRoZSBvYmplY3QgaW4gYnl0ZXMuCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVI8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSVpFID0gInNpemUiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgb2JqZWN0J3MgdGh1bWJuYWlsIGZvcm1hdC4gIENhbiBiZSBvbmUgb2YgdGhlIEZPUk1BVF8qIHN5bWJvbHMgYmVsb3csCisgICAgICAgICAqIG9yIGFueSBvZiB0aGUgdmFsaWQgTVRQIG9iamVjdCBmb3JtYXRzIGFzIGRlZmluZWQgaW4gdGhlIE1UUCBzcGVjaWZpY2F0aW9uLgorICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEhVTUJfRk9STUFUID0gImZvcm1hdCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBzaXplIG9mIHRoZSBvYmplY3QncyB0aHVtYm5haWwgaW4gYnl0ZXMuCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVI8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUSFVNQl9TSVpFID0gInRodW1iX3NpemUiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgd2lkdGggb2YgdGhlIG9iamVjdCdzIHRodW1ibmFpbCBpbiBwaXhlbHMuCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVI8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUSFVNQl9XSURUSCA9ICJ0aHVtYl93aWR0aCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBoZWlnaHQgb2YgdGhlIG9iamVjdCdzIHRodW1ibmFpbCBpbiBwaXhlbHMuCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVI8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUSFVNQl9IRUlHSFQgPSAidGh1bWJfaGVpZ2h0IjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIG9iamVjdCdzIHRodW1ibmFpbC4KKyAgICAgICAgICogPFA+VHlwZTogQkxPQjwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRIVU1CID0gInRodW1iIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHdpZHRoIG9mIHRoZSBvYmplY3QgaW4gcGl4ZWxzLgorICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1BR0VfV0lEVEggPSAiaW1hZ2Vfd2lkdGgiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgaGVpZ2h0IG9mIHRoZSBvYmplY3QgaW4gcGl4ZWxzLgorICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1BR0VfSEVJR0hUID0gImltYWdlX2hlaWdodCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBkZXB0aCBvZiB0aGUgb2JqZWN0IGluIGJpdHMgcGVyIHBpeGVsLgorICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1BR0VfREVQVEggPSAiaW1hZ2VfZGVwdGgiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgSUQgb2YgdGhlIG9iamVjdCdzIHBhcmVudCwgb3IgemVybyBpZiB0aGUgb2JqZWN0CisgICAgICAgICAqIGlzIGluIHRoZSByb290IG9mIGl0cyBzdG9yYWdlIHVuaXQuCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVI8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJFTlQgPSAicGFyZW50IjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGFzc29jaWF0aW9uIHR5cGUgZm9yIGEgY29udGFpbmVyIG9iamVjdC4KKyAgICAgICAgICogRm9yIGZvbGRlcnMgdGhpcyBpcyB0eXBpY2FsbHkge0BsaW5rICNBU1NPQ0lBVElPTl9UWVBFX0dFTkVSSUNfRk9MREVSfQorICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVNTT0NJQVRJT05fVFlQRSA9ICJhc3NvY2lhdGlvbl90eXBlIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ29udGFpbnMgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCBjb250YWluZXIgb2JqZWN0cy4KKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUjwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFTU09DSUFUSU9OX0RFU0MgPSAiYXNzb2NpYXRpb25fZGVzYyI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBzZXF1ZW5jZSBudW1iZXIgb2YgdGhlIG9iamVjdCwgdHlwaWNhbGx5IHVzZWQgZm9yIGFuIGFzc29jaWF0aW9uCisgICAgICAgICAqIGNvbnRhaW5pbmcgaW1hZ2VzIHRha2VuIGluIHNlcXVlbmNlLgorICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VRVUVOQ0VfTlVNQkVSID0gInNlcXVlbmNlX251bWJlciI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBuYW1lIG9mIHRoZSBvYmplY3QuCisgICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FID0gIm5hbWUiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgZGF0ZSB0aGUgb2JqZWN0IHdhcyBjcmVhdGVkLCBpbiBzZWNvbmRzIHNpbmNlIEphbnVhcnkgMSwgMTk3MC4KKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUjwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEVfQ1JFQVRFRCA9ICJkYXRlX2NyZWF0ZWQiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgZGF0ZSB0aGUgb2JqZWN0IHdhcyBsYXN0IG1vZGlmaWVkLCBpbiBzZWNvbmRzIHNpbmNlIEphbnVhcnkgMSwgMTk3MC4KKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUjwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEVfTU9ESUZJRUQgPSAiZGF0ZV9tb2RpZmllZCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEEgbGlzdCBvZiBrZXl3b3JkcyBhc3NvY2lhdGVkIHdpdGggYW4gb2JqZWN0LCBzZXBhcmF0ZWQgYnkgc3BhY2VzLgorICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZV09SRFMgPSAia2V5d29yZHMiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDb250YW50cyBmb3Ige0BsaW5rICNGT1JNQVR9IGFuZCB7QGxpbmsgI1RIVU1CX0ZPUk1BVH0KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9VTkRFRklORUQgPSAweDMwMDA7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9BU1NPQ0lBVElPTiA9IDB4MzAwMTsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX1NDUklQVCA9IDB4MzAwMjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX0VYRUNVVEFCTEUgPSAweDMwMDM7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9URVhUID0gMHgzMDA0OworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfSFRNTCA9IDB4MzAwNTsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX0RQT0YgPSAweDMwMDY7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9BSUZGID0gMHgzMDA3OworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfV0FWID0gMHgzMDA4OworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfTVAzID0gMHgzMDA5OworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfQVZJID0gMHgzMDBBOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfTVBFRyA9IDB4MzAwQjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX0FTRiA9IDB4MzAwQzsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX0RFRklORUQgPSAweDM4MDA7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9FWElGX0pQRUcgPSAweDM4MDE7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9USUZGX0VQID0gMHgzODAyOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfRkxBU0hQSVggPSAweDM4MDM7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9CTVAgPSAweDM4MDQ7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9DSUZGID0gMHgzODA1OworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfR0lGID0gMHgzODA3OworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfSkZJRiA9IDB4MzgwODsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX0NEID0gMHgzODA5OworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfUElDVCA9IDB4MzgwQTsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX1BORyA9IDB4MzgwQjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX1RJRkYgPSAweDM4MEQ7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9USUZGX0lUID0gMHgzODBFOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfSlAyID0gMHgzODBGOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfSlBYID0gMHgzODEwOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfVU5ERUZJTkVEX0ZJUk1XQVJFID0gMHhCODAyOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfV0lORE9XU19JTUFHRV9GT1JNQVQgPSAweEI4ODE7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9VTkRFRklORURfQVVESU8gPSAweEI5MDA7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9XTUEgPSAweEI5MDE7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9PR0cgPSAweEI5MDI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9BQUMgPSAweEI5MDM7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9BVURJQkxFID0gMHhCOTA0OworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfRkxBQyA9IDB4QjkwNjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX1VOREVGSU5FRF9WSURFTyA9IDB4Qjk4MDsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX1dNViA9IDB4Qjk4MTsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX01QNF9DT05UQUlORVIgPSAweEI5ODI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9NUDIgPSAweEI5ODM7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF8zR1BfQ09OVEFJTkVSID0gMHhCOTg0OworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfVU5ERUZJTkVEX0NPTExFQ1RJT04gPSAweEJBMDA7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9BQlNUUkFDVF9NVUxUSU1FRElBX0FMQlVNID0gMHhCQTAxOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfQUJTVFJBQ1RfSU1BR0VfQUxCVU0gPSAweEJBMDI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9BQlNUUkFDVF9BVURJT19BTEJVTSA9IDB4QkEwMzsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX0FCU1RSQUNUX1ZJREVPX0FMQlVNID0gMHhCQTA0OworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfQUJTVFJBQ1RfQVZfUExBWUxJU1QgPSAweEJBMDU7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9BQlNUUkFDVF9DT05UQUNUX0dST1VQID0gMHhCQTA2OworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfQUJTVFJBQ1RfTUVTU0FHRV9GT0xERVIgPSAweEJBMDc7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9BQlNUUkFDVF9DSEFQVEVSRURfUFJPRFVDVElPTiA9IDB4QkEwODsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX0FCU1RSQUNUX0FVRElPX1BMQVlMSVNUID0gMHhCQTA5OworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfQUJTVFJBQ1RfVklERU9fUExBWUxJU1QgPSAweEJBMEE7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9BQlNUUkFDVF9NRURJQUNBU1QgPSAweEJBMEI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9XUExfUExBWUxJU1QgPSAweEJBMTA7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9NM1VfUExBWUxJU1QgPSAweEJBMTE7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9NUExfUExBWUxJU1QgPSAweEJBMTI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9BU1hfUExBWUxJU1QgPSAweEJBMTM7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9QTFNfUExBWUxJU1QgPSAweEJBMTQ7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9VTkRFRklORURfRE9DVU1FTlQgPSAweEJBODA7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9BQlNUUkFDVF9ET0NVTUVOVCA9IDB4QkE4MTsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX1hNTF9ET0NVTUVOVCA9IDB4QkE4MjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX01TX1dPUkRfRE9DVU1FTlQgPSAweEJBODM7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9NSFRfQ09NUElMRURfSFRNTF9ET0NVTUVOVCA9IDB4QkE4NDsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX01TX0VYQ0VMX1NQUkVBRFNIRUVUID0gMHhCQTg1OworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfTVNfUE9XRVJQT0lOVF9QUkVTRU5UQVRJT04gPSAweEJBODY7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9VTkRFRklORURfTUVTU0FHRSA9IDB4QkIwMDsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX0FCU1RSQUNUX01FU1NTQUdFID0gMHhCQjAxOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfVU5ERUZJTkVEX0NPTlRBQ1QgPSAweEJCODA7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9BQlNUUkFDVF9DT05UQUNUID0gMHhCQjgxOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfVkNBUkRfMiA9IDB4QkI4MjsKKworICAgICAgICAvLyBPYmplY3QgcHJvcGVydGllcyB3ZSBzdXBwb3J0CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1NUT1JBR0VfSUQgPSAweERDMDE7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX09CSkVDVF9GT1JNQVQgPSAweERDMDI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX09CSkVDVF9TSVpFID0gMHhEQzA0OworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9PQkpFQ1RfRklMRV9OQU1FID0gMHhEQzA3OworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9QQVJFTlRfT0JKRUNUID0gMHhEQzBCOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBPYmplY3QgaXMgbm90IHByb3RlY3RlZC4gSXQgbWF5IGJlIG1vZGlmaWVkIGFuZCBkZWxldGVkLCBhbmQgaXRzIHByb3BlcnRpZXMKKyAgICAgICAgICogbWF5IGJlIG1vZGlmaWVkLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPVEVDVElPTl9TVEFUVVNfTk9ORSA9IDA7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIE9iamVjdCBjYW4gbm90IGJlIG1vZGlmaWVkIG9yIGRlbGV0ZWQgYW5kIGl0cyBwcm9wZXJ0aWVzIGNhbiBub3QgYmUgbW9kaWZpZWQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9URUNUSU9OX1NUQVRVU19SRUFEX09OTFkgPSAweDgwMDE7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIE9iamVjdCBjYW4gbm90IGJlIG1vZGlmaWVkIG9yIGRlbGV0ZWQgYnV0IGl0cyBwcm9wZXJ0aWVzIGFyZSBtb2RpZmlhYmxlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPVEVDVElPTl9TVEFUVVNfUkVBRF9PTkxZX0RBVEEgPSAweDgwMDI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIE9iamVjdCdzIGNvbnRlbnRzIGNhbiBub3QgYmUgdHJhbnNmZXJlZCBmcm9tIHRoZSBkZXZpY2UsIGJ1dCB0aGUgb2JqZWN0CisgICAgICAgICAqIG1heSBiZSBtb3ZlZCBvciBkZWxldGVkIGFuZCBpdHMgcHJvcGVydGllcyBtYXkgYmUgbW9kaWZpZWQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9URUNUSU9OX1NUQVRVU19OT05fVFJBTlNGRVJBQkxFX0RBVEEgPSAweDgwMDM7CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVNTT0NJQVRJT05fVFlQRV9HRU5FUklDX0ZPTERFUiA9IDB4MDAwMTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9TZXR0aW5ncy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvU2V0dGluZ3MuamF2YQppbmRleCBlYmM4NWQzLi42ZDNjYTI3NiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvU2V0dGluZ3MuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9TZXR0aW5ncy5qYXZhCkBAIC0xNiwxNCArMTYsMTEgQEAKIAogcGFja2FnZSBhbmRyb2lkLnByb3ZpZGVyOwogCi1pbXBvcnQgY29tLmdvb2dsZS5hbmRyb2lkLmNvbGxlY3QuTWFwczsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2RlYy5iaW5hcnkuQmFzZTY0OwogCiBpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLlNka0NvbnN0YW50OwogaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5TZGtDb25zdGFudC5TZGtDb25zdGFudFR5cGU7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRRdWVyeU1hcDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwpAQCAtMzgsMTkgKzM1LDE0IEBACiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5TUUxFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwogaW1wb3J0IGFuZHJvaWQub3MuKjsKLWltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5UZWxlcGhvbnlNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkFuZHJvaWRFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC51dGlsLkNvbmZpZzsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCiBpbXBvcnQgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuTWVzc2FnZURpZ2VzdDsKLWltcG9ydCBqYXZhLnNlY3VyaXR5Lk5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKIAogCiAvKioKQEAgLTEwMDksNyArMTAwMSw3IEBACiAgICAgICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNJbnRlcmVzdGluZ0NvbmZpZ3VyYXRpb25DaGFuZ2VzKGludCBjaGFuZ2VzKSB7CiAgICAgICAgICAgICByZXR1cm4gKGNoYW5nZXMmQWN0aXZpdHlJbmZvLkNPTkZJR19GT05UX1NDQUxFKSAhPSAwOwogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXRTaG93R1RhbGtTZXJ2aWNlU3RhdHVzKENvbnRlbnRSZXNvbHZlciBjcikgewogICAgICAgICAgICAgcmV0dXJuIGdldEludChjciwgU0hPV19HVEFMS19TRVJWSUNFX1NUQVRVUywgMCkgIT0gMDsKICAgICAgICAgfQpAQCAtMTIxNiw3ICsxMjA4LDcgQEAKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9DS19QQVRURVJOX1ZJU0lCTEUgPSAibG9ja19wYXR0ZXJuX3Zpc2libGVfcGF0dGVybiI7CiAKICAgICAgICAgLyoqCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFVzZSAKKyAgICAgICAgICogQGRlcHJlY2F0ZWQgVXNlCiAgICAgICAgICAqIHtAbGluayBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzLlNlY3VyZSNMT0NLX1BBVFRFUk5fVEFDVElMRV9GRUVEQkFDS19FTkFCTEVEfQogICAgICAgICAgKiBpbnN0ZWFkCiAgICAgICAgICAqLwpAQCAtMjI5MCw2ICsyMjgyLDE0IEBACiAgICAgICAgIH0KIAogICAgICAgICAvKioKKyAgICAgICAgICogR2V0IHRoZSBrZXkgdGhhdCByZXRyaWV2ZXMgYSBibHVldG9vdGggSW5wdXQgRGV2aWNlJ3MgcHJpb3JpdHkuCisgICAgICAgICAqIEBoaWRlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBnZXRCbHVldG9vdGhJbnB1dERldmljZVByaW9yaXR5S2V5KFN0cmluZyBhZGRyZXNzKSB7CisgICAgICAgICAgICByZXR1cm4gKCJibHVldG9vdGhfaW5wdXRfZGV2aWNlX3ByaW9yaXR5XyIgKyBhZGRyZXNzLnRvVXBwZXJDYXNlKCkpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCiAgICAgICAgICAqIFdoZXRoZXIgb3Igbm90IGRhdGEgcm9hbWluZyBpcyBlbmFibGVkLiAoMCA9IGZhbHNlLCAxID0gdHJ1ZSkKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEFfUk9BTUlORyA9ICJkYXRhX3JvYW1pbmciOwpAQCAtMjMyMSwxMSArMjMyMSwyNiBAQAogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVNBQkxFRF9TWVNURU1fSU5QVVRfTUVUSE9EUyA9ICJkaXNhYmxlZF9zeXN0ZW1faW5wdXRfbWV0aG9kcyI7CiAKICAgICAgICAgLyoqCi0gICAgICAgICAqIEhvc3QgbmFtZSBhbmQgcG9ydCBmb3IgYSB1c2VyLXNlbGVjdGVkIHByb3h5LgorICAgICAgICAgKiBIb3N0IG5hbWUgYW5kIHBvcnQgZm9yIGdsb2JhbCBwcm94eS4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhUVFBfUFJPWFkgPSAiaHR0cF9wcm94eSI7CiAKICAgICAgICAgLyoqCisgICAgICAgICAqIEV4Y2x1c2lvbiBsaXN0IGZvciBnbG9iYWwgcHJveHkuIFRoaXMgc3RyaW5nIGNvbnRhaW5zIGEgbGlzdCBvZiBjb21tYS1zZXBhcmF0ZWQKKyAgICAgICAgICogZG9tYWlucyB3aGVyZSB0aGUgZ2xvYmFsIHByb3h5IGRvZXMgbm90IGFwcGx5LiBEb21haW5zIHNob3VsZCBiZSBsaXN0ZWQgaW4gYSBjb21tYS0KKyAgICAgICAgICogc2VwYXJhdGVkIGxpc3QuIEV4YW1wbGUgb2YgYWNjZXB0YWJsZSBmb3JtYXRzOiAiLmRvbWFpbjEuY29tLG15LmRvbWFpbjIuY29tIgorICAgICAgICAgKiBAaGlkZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRUUF9QUk9YWV9FWENMVVNJT05fTElTVCA9ICJodHRwX3Byb3h5X2V4Y2x1c2lvbl9saXN0IjsKKworICAgICAgICAvKioKKyAgICAgICAgICogRW5hYmxlcyB0aGUgVUkgc2V0dGluZyB0byBhbGxvdyB0aGUgdXNlciB0byBzcGVjaWZ5IHRoZSBnbG9iYWwgSFRUUCBwcm94eQorICAgICAgICAgKiBhbmQgYXNzb2NpYXRlZCBleGNsdXNpb24gbGlzdC4KKyAgICAgICAgICogQGhpZGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFVF9HTE9CQUxfSFRUUF9QUk9YWSA9ICJzZXRfZ2xvYmFsX2h0dHBfcHJveHkiOworCisgICAgICAgIC8qKgogICAgICAgICAgKiBXaGV0aGVyIHRoZSBwYWNrYWdlIGluc3RhbGxlciBzaG91bGQgYWxsb3cgaW5zdGFsbGF0aW9uIG9mIGFwcHMgZG93bmxvYWRlZCBmcm9tCiAgICAgICAgICAqIHNvdXJjZXMgb3RoZXIgdGhhbiB0aGUgQW5kcm9pZCBNYXJrZXQgKHZlbmRpbmcgbWFjaGluZSkuCiAgICAgICAgICAqCkBAIC0yNDE2LDYgKzI0MzEsMTQgQEAKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSRU5UQUxfQ09OVFJPTF9SRURJUkVDVF9VUkwgPSAicGFyZW50YWxfY29udHJvbF9yZWRpcmVjdF91cmwiOwogCiAgICAgICAgIC8qKgorICAgICAgICAgKiBBIHBvc2l0aXZlIHZhbHVlIGluZGljYXRlcyB0aGUgZnJlcXVlbmN5IG9mIFNhbXBsaW5nUHJvZmlsZXIKKyAgICAgICAgICogdGFraW5nIHNuYXBzaG90cyBpbiBoZXJ0ei4gWmVybyB2YWx1ZSBtZWFucyBTYW1wbGluZ1Byb2ZpbGVyIGlzIGRpc2FibGVkLgorICAgICAgICAgKgorICAgICAgICAgKiBAaGlkZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0FNUExJTkdfUFJPRklMRVJfSFogPSAic2FtcGxpbmdfcHJvZmlsZXJfaHoiOworCisgICAgICAgIC8qKgogICAgICAgICAgKiBTZXR0aW5ncyBjbGFzc25hbWUgdG8gbGF1bmNoIHdoZW4gU2V0dGluZ3MgaXMgY2xpY2tlZCBmcm9tIEFsbAogICAgICAgICAgKiBBcHBsaWNhdGlvbnMuICBOZWVkZWQgYmVjYXVzZSBvZiB1c2VyIHRlc3RpbmcgYmV0d2VlbiB0aGUgb2xkCiAgICAgICAgICAqIGFuZCBuZXcgU2V0dGluZ3MgYXBwcy4KQEAgLTM1ODEsMjAgKzM2MDQsOCBAQAogICAgICAgICAgICAgLy8gSWYgYSBzaG9ydGN1dCBpcyBzdXBwbGllZCwgYW5kIGl0IGlzIGFscmVhZHkgZGVmaW5lZCBmb3IKICAgICAgICAgICAgIC8vIGFub3RoZXIgYm9va21hcmssIHRoZW4gcmVtb3ZlIHRoZSBvbGQgZGVmaW5pdGlvbi4KICAgICAgICAgICAgIGlmIChzaG9ydGN1dCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgQ3Vyc29yIGMgPSBjci5xdWVyeShDT05URU5UX1VSSSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNTaG9ydGN1dFByb2plY3Rpb24sIHNTaG9ydGN1dFNlbGVjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7IFN0cmluZy52YWx1ZU9mKChpbnQpIHNob3J0Y3V0KSB9LCBudWxsKTsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBpZiAoYy5tb3ZlVG9GaXJzdCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoYy5nZXRDb3VudCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYy5kZWxldGVSb3coKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDb3VsZCBub3QgZGVsZXRlIGV4aXN0aW5nIHNob3J0Y3V0IHJvdyIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjICE9IG51bGwpIGMuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY3IuZGVsZXRlKENPTlRFTlRfVVJJLCBzU2hvcnRjdXRTZWxlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyBTdHJpbmcudmFsdWVPZigoaW50KSBzaG9ydGN1dCkgfSk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIENvbnRlbnRWYWx1ZXMgdmFsdWVzID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3NlcnZlci9CbHVldG9vdGhFdmVudExvb3AuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3NlcnZlci9CbHVldG9vdGhFdmVudExvb3AuamF2YQppbmRleCAzNWE1ODJkLi4zODYxZWY1IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9zZXJ2ZXIvQmx1ZXRvb3RoRXZlbnRMb29wLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvc2VydmVyL0JsdWV0b290aEV2ZW50TG9vcC5qYXZhCkBAIC0yMCw2ICsyMCw4IEBACiBpbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoQWRhcHRlcjsKIGltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhDbGFzczsKIGltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhEZXZpY2U7CitpbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoSW5wdXREZXZpY2U7CitpbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoUGFuOwogaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aFV1aWQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKQEAgLTM2NCw3ICszNjYsOCBAQAogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgIGxvZygiRGV2aWNlIHByb3BlcnR5IGNoYW5nZWQ6IiArIGFkZHJlc3MgKyAicHJvcGVydHk6IiArIG5hbWUpOworICAgICAgICAgICAgbG9nKCJEZXZpY2UgcHJvcGVydHkgY2hhbmdlZDogIiArIGFkZHJlc3MgKyAiIHByb3BlcnR5OiAiCisgICAgICAgICAgICAgICAgICAgICsgbmFtZSArICIgdmFsdWU6ICIgKyBwcm9wVmFsdWVzWzFdKTsKICAgICAgICAgfQogICAgICAgICBCbHVldG9vdGhEZXZpY2UgZGV2aWNlID0gbUFkYXB0ZXIuZ2V0UmVtb3RlRGV2aWNlKGFkZHJlc3MpOwogICAgICAgICBpZiAobmFtZS5lcXVhbHMoIk5hbWUiKSkgewpAQCAtNDI3LDYgKzQzMCwzOSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcHJpdmF0ZSB2b2lkIG9uSW5wdXREZXZpY2VQcm9wZXJ0eUNoYW5nZWQoU3RyaW5nIHBhdGgsIFN0cmluZ1tdIHByb3BWYWx1ZXMpIHsKKyAgICAgICAgU3RyaW5nIGFkZHJlc3MgPSBtQmx1ZXRvb3RoU2VydmljZS5nZXRBZGRyZXNzRnJvbU9iamVjdFBhdGgocGF0aCk7CisgICAgICAgIGlmIChhZGRyZXNzID09IG51bGwpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIm9uSW5wdXREZXZpY2VQcm9wZXJ0eUNoYW5nZWQ6IEFkZHJlc3Mgb2YgdGhlIHJlbW90ZSBkZXZpY2UgaW4gbnVsbCIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGxvZygiIElucHV0IERldmljZSA6IE5hbWUgb2YgUHJvcGVydHkgaXM6IiArIHByb3BWYWx1ZXNbMF0pOworICAgICAgICBib29sZWFuIHN0YXRlID0gZmFsc2U7CisgICAgICAgIGlmIChwcm9wVmFsdWVzWzFdLmVxdWFscygidHJ1ZSIpKSB7CisgICAgICAgICAgICBzdGF0ZSA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgbUJsdWV0b290aFNlcnZpY2UuaGFuZGxlSW5wdXREZXZpY2VQcm9wZXJ0eUNoYW5nZShhZGRyZXNzLCBzdGF0ZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIG9uUGFuRGV2aWNlUHJvcGVydHlDaGFuZ2VkKFN0cmluZyBkZXZpY2VPYmplY3RQYXRoLCBTdHJpbmdbXSBwcm9wVmFsdWVzKSB7CisgICAgICAgIFN0cmluZyBuYW1lID0gcHJvcFZhbHVlc1swXTsKKyAgICAgICAgU3RyaW5nIGFkZHJlc3MgPSBtQmx1ZXRvb3RoU2VydmljZS5nZXRBZGRyZXNzRnJvbU9iamVjdFBhdGgoZGV2aWNlT2JqZWN0UGF0aCk7CisgICAgICAgIGlmIChhZGRyZXNzID09IG51bGwpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIm9uUGFuRGV2aWNlUHJvcGVydHlDaGFuZ2VkOiBBZGRyZXNzIG9mIHRoZSByZW1vdGUgZGV2aWNlIGluIG51bGwiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoREJHKSB7CisgICAgICAgICAgICBsb2coIlBhbiBEZXZpY2UgcHJvcGVydHkgY2hhbmdlZDogIiArIGFkZHJlc3MgKyAiICBwcm9wZXJ0eTogIgorICAgICAgICAgICAgICAgICAgICArIG5hbWUgKyAiIHZhbHVlOiAiKyBwcm9wVmFsdWVzWzFdKTsKKyAgICAgICAgfQorICAgICAgICBCbHVldG9vdGhEZXZpY2UgZGV2aWNlID0gbUFkYXB0ZXIuZ2V0UmVtb3RlRGV2aWNlKGFkZHJlc3MpOworICAgICAgICBpZiAobmFtZS5lcXVhbHMoIkNvbm5lY3RlZCIpKSB7CisgICAgICAgICAgICBpbnQgc3RhdGUgPSBwcm9wVmFsdWVzWzFdLmVxdWFscygidHJ1ZSIpID8gQmx1ZXRvb3RoSW5wdXREZXZpY2UuU1RBVEVfQ09OTkVDVEVEIDoKKyAgICAgICAgICAgICAgICBCbHVldG9vdGhJbnB1dERldmljZS5TVEFURV9ESVNDT05ORUNURUQ7CisgICAgICAgICAgICBtQmx1ZXRvb3RoU2VydmljZS5oYW5kbGVQYW5EZXZpY2VTdGF0ZUNoYW5nZShkZXZpY2UsIHN0YXRlKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHByaXZhdGUgU3RyaW5nIGNoZWNrUGFpcmluZ1JlcXVlc3RBbmRHZXRBZGRyZXNzKFN0cmluZyBvYmplY3RQYXRoLCBpbnQgbmF0aXZlRGF0YSkgewogICAgICAgICBTdHJpbmcgYWRkcmVzcyA9IG1CbHVldG9vdGhTZXJ2aWNlLmdldEFkZHJlc3NGcm9tT2JqZWN0UGF0aChvYmplY3RQYXRoKTsKICAgICAgICAgaWYgKGFkZHJlc3MgPT0gbnVsbCkgewpAQCAtNTczLDYgKzYwOSw4IEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSBib29sZWFuIG9uQWdlbnRBdXRob3JpemUoU3RyaW5nIG9iamVjdFBhdGgsIFN0cmluZyBkZXZpY2VVdWlkKSB7CisgICAgICAgIGlmICghbUJsdWV0b290aFNlcnZpY2UuaXNFbmFibGVkKCkpIHJldHVybiBmYWxzZTsKKwogICAgICAgICBTdHJpbmcgYWRkcmVzcyA9IG1CbHVldG9vdGhTZXJ2aWNlLmdldEFkZHJlc3NGcm9tT2JqZWN0UGF0aChvYmplY3RQYXRoKTsKICAgICAgICAgaWYgKGFkZHJlc3MgPT0gbnVsbCkgewogICAgICAgICAgICAgTG9nLmUoVEFHLCAiVW5hYmxlIHRvIGdldCBkZXZpY2UgYWRkcmVzcyBpbiBvbkF1dGhBZ2VudEF1dGhvcml6ZSIpOwpAQCAtNTgxLDE1ICs2MTksMTUgQEAKIAogICAgICAgICBib29sZWFuIGF1dGhvcml6ZWQgPSBmYWxzZTsKICAgICAgICAgUGFyY2VsVXVpZCB1dWlkID0gUGFyY2VsVXVpZC5mcm9tU3RyaW5nKGRldmljZVV1aWQpOwotICAgICAgICBCbHVldG9vdGhBMmRwIGEyZHAgPSBuZXcgQmx1ZXRvb3RoQTJkcChtQ29udGV4dCk7CisgICAgICAgIEJsdWV0b290aERldmljZSBkZXZpY2UgPSBtQWRhcHRlci5nZXRSZW1vdGVEZXZpY2UoYWRkcmVzcyk7CiAKICAgICAgICAgLy8gQmx1ZXogc2VuZHMgdGhlIFVVSUQgb2YgdGhlIGxvY2FsIHNlcnZpY2UgYmVpbmcgYWNjZXNzZWQsIF9ub3RfIHRoZQogICAgICAgICAvLyByZW1vdGUgc2VydmljZQotICAgICAgICBpZiAobUJsdWV0b290aFNlcnZpY2UuaXNFbmFibGVkKCkgJiYKLSAgICAgICAgICAgICAgICAoQmx1ZXRvb3RoVXVpZC5pc0F1ZGlvU291cmNlKHV1aWQpIHx8IEJsdWV0b290aFV1aWQuaXNBdnJjcFRhcmdldCh1dWlkKQotICAgICAgICAgICAgICAgICAgICAgICAgfHwgQmx1ZXRvb3RoVXVpZC5pc0FkdkF1ZGlvRGlzdCh1dWlkKSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICFpc090aGVyU2lua0luTm9uRGlzY29ubmVjdGluZ1N0YXRlKGFkZHJlc3MpKSB7Ci0gICAgICAgICAgICBCbHVldG9vdGhEZXZpY2UgZGV2aWNlID0gbUFkYXB0ZXIuZ2V0UmVtb3RlRGV2aWNlKGFkZHJlc3MpOworICAgICAgICBpZiAoKEJsdWV0b290aFV1aWQuaXNBdWRpb1NvdXJjZSh1dWlkKSB8fCBCbHVldG9vdGhVdWlkLmlzQXZyY3BUYXJnZXQodXVpZCkKKyAgICAgICAgICAgICAgfHwgQmx1ZXRvb3RoVXVpZC5pc0FkdkF1ZGlvRGlzdCh1dWlkKSkgJiYKKyAgICAgICAgICAgICAgIWlzT3RoZXJTaW5rSW5Ob25EaXNjb25uZWN0aW5nU3RhdGUoYWRkcmVzcykpIHsKKyAgICAgICAgICAgIEJsdWV0b290aEEyZHAgYTJkcCA9IG5ldyBCbHVldG9vdGhBMmRwKG1Db250ZXh0KTsKKwogICAgICAgICAgICAgYXV0aG9yaXplZCA9IGEyZHAuZ2V0U2lua1ByaW9yaXR5KGRldmljZSkgPiBCbHVldG9vdGhBMmRwLlBSSU9SSVRZX09GRjsKICAgICAgICAgICAgIGlmIChhdXRob3JpemVkKSB7CiAgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiQWxsb3dpbmcgaW5jb21pbmcgQTJEUCAvIEFWUkNQIGNvbm5lY3Rpb24gZnJvbSAiICsgYWRkcmVzcyk7CkBAIC01OTcsNiArNjM1LDE3IEBACiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIlJlamVjdGluZyBpbmNvbWluZyBBMkRQIC8gQVZSQ1AgY29ubmVjdGlvbiBmcm9tICIgKyBhZGRyZXNzKTsKICAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChCbHVldG9vdGhVdWlkLmlzSW5wdXREZXZpY2UodXVpZCkgJiYgIWlzT3RoZXJJbnB1dERldmljZUNvbm5lY3RlZChhZGRyZXNzKSkgeworICAgICAgICAgICAgQmx1ZXRvb3RoSW5wdXREZXZpY2UgaW5wdXREZXZpY2UgPSBuZXcgQmx1ZXRvb3RoSW5wdXREZXZpY2UobUNvbnRleHQpOworICAgICAgICAgICAgYXV0aG9yaXplZCA9IGlucHV0RGV2aWNlLmdldElucHV0RGV2aWNlUHJpb3JpdHkoZGV2aWNlKSA+CisgICAgICAgICAgICAgICAgICAgICAgICAgQmx1ZXRvb3RoSW5wdXREZXZpY2UuUFJJT1JJVFlfT0ZGOworICAgICAgICAgICAgIGlmIChhdXRob3JpemVkKSB7CisgICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIkFsbG93aW5nIGluY29taW5nIEhJRCBjb25uZWN0aW9uIGZyb20gIiArIGFkZHJlc3MpOworICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIlJlamVjdGluZyBpbmNvbWluZyBISUQgY29ubmVjdGlvbiBmcm9tICIgKyBhZGRyZXNzKTsKKyAgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoQmx1ZXRvb3RoVXVpZC5pc0JuZXAodXVpZCkgfHwgQmx1ZXRvb3RoVXVpZC5pc05hcCh1dWlkKSl7CisgICAgICAgICAgICBhdXRob3JpemVkID0gdHJ1ZTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIExvZy5pKFRBRywgIlJlamVjdGluZyBpbmNvbWluZyAiICsgZGV2aWNlVXVpZCArICIgY29ubmVjdGlvbiBmcm9tICIgKyBhZGRyZXNzKTsKICAgICAgICAgfQpAQCAtNjA0LDcgKzY1MywxOSBAQAogICAgICAgICByZXR1cm4gYXV0aG9yaXplZDsKICAgICB9CiAKLSAgICBib29sZWFuIGlzT3RoZXJTaW5rSW5Ob25EaXNjb25uZWN0aW5nU3RhdGUoU3RyaW5nIGFkZHJlc3MpIHsKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNPdGhlcklucHV0RGV2aWNlQ29ubmVjdGVkKFN0cmluZyBhZGRyZXNzKSB7CisgICAgICAgIFNldDxCbHVldG9vdGhEZXZpY2U+IGRldmljZXMgPQorICAgICAgICAgICAgbUJsdWV0b290aFNlcnZpY2UubG9va3VwSW5wdXREZXZpY2VzTWF0Y2hpbmdTdGF0ZXMobmV3IGludFtdIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsdWV0b290aElucHV0RGV2aWNlLlNUQVRFX0NPTk5FQ1RJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCbHVldG9vdGhJbnB1dERldmljZS5TVEFURV9DT05ORUNURUR9KTsKKworICAgICAgICBmb3IgKEJsdWV0b290aERldmljZSBkZXZpY2UgOiBkZXZpY2VzKSB7CisgICAgICAgICAgICBpZiAoIWRldmljZS5nZXRBZGRyZXNzKCkuZXF1YWxzKGFkZHJlc3MpKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGlzT3RoZXJTaW5rSW5Ob25EaXNjb25uZWN0aW5nU3RhdGUoU3RyaW5nIGFkZHJlc3MpIHsKICAgICAgICAgQmx1ZXRvb3RoQTJkcCBhMmRwID0gbmV3IEJsdWV0b290aEEyZHAobUNvbnRleHQpOwogICAgICAgICBTZXQ8Qmx1ZXRvb3RoRGV2aWNlPiBkZXZpY2VzID0gYTJkcC5nZXROb25EaXNjb25uZWN0ZWRTaW5rcygpOwogICAgICAgICBpZiAoZGV2aWNlcy5zaXplKCkgPT0gMCkgcmV0dXJuIGZhbHNlOwpAQCAtNjU1LDYgKzcxNiw1MCBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcHJpdmF0ZSB2b2lkIG9uSW5wdXREZXZpY2VDb25uZWN0aW9uUmVzdWx0KFN0cmluZyBwYXRoLCBib29sZWFuIHJlc3VsdCkgeworICAgICAgICAvLyBTdWNjZXNzIGNhc2UgZ2V0cyBoYW5kbGVkIGJ5IFByb3BlcnR5IENoYW5nZSBzaWduYWwKKyAgICAgICAgaWYgKCFyZXN1bHQpIHsKKyAgICAgICAgICAgIFN0cmluZyBhZGRyZXNzID0gbUJsdWV0b290aFNlcnZpY2UuZ2V0QWRkcmVzc0Zyb21PYmplY3RQYXRoKHBhdGgpOworICAgICAgICAgICAgaWYgKGFkZHJlc3MgPT0gbnVsbCkgcmV0dXJuOworCisgICAgICAgICAgICBib29sZWFuIGNvbm5lY3RlZCA9IGZhbHNlOworICAgICAgICAgICAgQmx1ZXRvb3RoRGV2aWNlIGRldmljZSA9IG1BZGFwdGVyLmdldFJlbW90ZURldmljZShhZGRyZXNzKTsKKyAgICAgICAgICAgIGludCBzdGF0ZSA9IG1CbHVldG9vdGhTZXJ2aWNlLmdldElucHV0RGV2aWNlU3RhdGUoZGV2aWNlKTsKKyAgICAgICAgICAgIGlmIChzdGF0ZSA9PSBCbHVldG9vdGhJbnB1dERldmljZS5TVEFURV9DT05ORUNUSU5HKSB7CisgICAgICAgICAgICAgICAgY29ubmVjdGVkID0gZmFsc2U7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXRlID09IEJsdWV0b290aElucHV0RGV2aWNlLlNUQVRFX0RJU0NPTk5FQ1RJTkcpIHsKKyAgICAgICAgICAgICAgICBjb25uZWN0ZWQgPSB0cnVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJFcnJvciBvbklucHV0RGV2aWNlQ29ubmVjdGlvblJlc3VsdC4gU3RhdGUgaXM6IiArIHN0YXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1CbHVldG9vdGhTZXJ2aWNlLmhhbmRsZUlucHV0RGV2aWNlUHJvcGVydHlDaGFuZ2UoYWRkcmVzcywgY29ubmVjdGVkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBvblBhbkRldmljZUNvbm5lY3Rpb25SZXN1bHQoU3RyaW5nIHBhdGgsIGJvb2xlYW4gcmVzdWx0KSB7CisgICAgICAgIGxvZyAoIm9uUGFuRGV2aWNlQ29ubmVjdGlvblJlc3VsdCAiICsgcGF0aCArICIgIiArIHJlc3VsdCk7CisgICAgICAgIC8vIFN1Y2Nlc3MgY2FzZSBnZXRzIGhhbmRsZWQgYnkgUHJvcGVydHkgQ2hhbmdlIHNpZ25hbAorICAgICAgICBpZiAoIXJlc3VsdCkgeworICAgICAgICAgICAgU3RyaW5nIGFkZHJlc3MgPSBtQmx1ZXRvb3RoU2VydmljZS5nZXRBZGRyZXNzRnJvbU9iamVjdFBhdGgocGF0aCk7CisgICAgICAgICAgICBpZiAoYWRkcmVzcyA9PSBudWxsKSByZXR1cm47CisKKyAgICAgICAgICAgIGJvb2xlYW4gY29ubmVjdGVkID0gZmFsc2U7CisgICAgICAgICAgICBCbHVldG9vdGhEZXZpY2UgZGV2aWNlID0gbUFkYXB0ZXIuZ2V0UmVtb3RlRGV2aWNlKGFkZHJlc3MpOworICAgICAgICAgICAgaW50IHN0YXRlID0gbUJsdWV0b290aFNlcnZpY2UuZ2V0UGFuRGV2aWNlU3RhdGUoZGV2aWNlKTsKKyAgICAgICAgICAgIGlmIChzdGF0ZSA9PSBCbHVldG9vdGhQYW4uU1RBVEVfQ09OTkVDVElORykgeworICAgICAgICAgICAgICAgIGNvbm5lY3RlZCA9IGZhbHNlOworICAgICAgICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PSBCbHVldG9vdGhQYW4uU1RBVEVfRElTQ09OTkVDVElORykgeworICAgICAgICAgICAgICAgIGNvbm5lY3RlZCA9IHRydWU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkVycm9yIG9uUGFuRGV2aWNlQ29ubmVjdGlvblJlc3VsdC4gU3RhdGUgaXM6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgc3RhdGUgKyAiIHJlc3VsdDogIisgcmVzdWx0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludCBuZXdTdGF0ZSA9IGNvbm5lY3RlZD8gQmx1ZXRvb3RoUGFuLlNUQVRFX0NPTk5FQ1RFRCA6CisgICAgICAgICAgICAgICAgQmx1ZXRvb3RoUGFuLlNUQVRFX0RJU0NPTk5FQ1RFRDsKKyAgICAgICAgICAgIG1CbHVldG9vdGhTZXJ2aWNlLmhhbmRsZVBhbkRldmljZVN0YXRlQ2hhbmdlKGRldmljZSwgbmV3U3RhdGUpOworICAgICAgICB9CisgICAgfQorCiAgICAgcHJpdmF0ZSB2b2lkIG9uUmVzdGFydFJlcXVpcmVkKCkgewogICAgICAgICBpZiAobUJsdWV0b290aFNlcnZpY2UuaXNFbmFibGVkKCkpIHsKICAgICAgICAgICAgIExvZy5lKFRBRywgIioqKiBBIHNlcmlvdXMgZXJyb3Igb2NjdXJlZCAoZGlkIGJsdWV0b290aGQgY3Jhc2g/KSAtICIgKwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvc2VydmVyL0JsdWV0b290aFNlcnZpY2UuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3NlcnZlci9CbHVldG9vdGhTZXJ2aWNlLmphdmEKaW5kZXggZjAwMzg5Yi4uMTgwODY1NiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvc2VydmVyL0JsdWV0b290aFNlcnZpY2UuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9zZXJ2ZXIvQmx1ZXRvb3RoU2VydmljZS5qYXZhCkBAIC0yOSw3ICsyOSw5IEBACiBpbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoRGV2aWNlOwogaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aEhlYWRzZXQ7CiBpbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoRGV2aWNlUHJvZmlsZVN0YXRlOworaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aFBhbjsKIGltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhQcm9maWxlU3RhdGU7CitpbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoSW5wdXREZXZpY2U7CiBpbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoU29ja2V0OwogaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aFV1aWQ7CiBpbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguSUJsdWV0b290aDsKQEAgLTQwLDkgKzQyLDEyIEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5TaGFyZWRQcmVmZXJlbmNlczsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Db25uZWN0aXZpdHlNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQubmV0LkludGVyZmFjZUNvbmZpZ3VyYXRpb247CiBpbXBvcnQgYW5kcm9pZC5vcy5CaW5kZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwogaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLklOZXR3b3JrTWFuYWdlbWVudFNlcnZpY2U7CiBpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsVXVpZDsKIGltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKQEAgLTcwLDggKzc1LDEwIEBACiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CiAKIHB1YmxpYyBjbGFzcyBCbHVldG9vdGhTZXJ2aWNlIGV4dGVuZHMgSUJsdWV0b290aC5TdHViIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkJsdWV0b290aFNlcnZpY2UiOwpAQCAtODQsNiArOTEsNyBAQAogICAgIHByaXZhdGUgaW50IG1CbHVldG9vdGhTdGF0ZTsKICAgICBwcml2YXRlIGJvb2xlYW4gbVJlc3RhcnQgPSBmYWxzZTsgIC8vIG5lZWQgdG8gY2FsbCBlbmFibGUoKSBhZnRlciBkaXNhYmxlKCkKICAgICBwcml2YXRlIGJvb2xlYW4gbUlzRGlzY292ZXJpbmc7CisgICAgcHJpdmF0ZSBib29sZWFuIG1UZXRoZXJpbmdPbjsKIAogICAgIHByaXZhdGUgQmx1ZXRvb3RoQWRhcHRlciBtQWRhcHRlcjsgIC8vIGNvbnN0YW50IGFmdGVyIGluaXQoKQogICAgIHByaXZhdGUgZmluYWwgQm9uZFN0YXRlIG1Cb25kU3RhdGUgPSBuZXcgQm9uZFN0YXRlKCk7ICAvLyBsb2NhbCBjYWNoZSBvZiBib25kaW5ncwpAQCAtMTA0LDYgKzExMiwxMCBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNRVNTQUdFX1VVSURfSU5URU5UID0gMzsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUVTU0FHRV9ESVNDT1ZFUkFCTEVfVElNRU9VVCA9IDQ7CiAKKyAgICBwcml2YXRlIEFycmF5TGlzdDxTdHJpbmc+IG1CbHVldG9vdGhJZmFjZUFkZHJlc3NlczsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkxVRVRPT1RIX05FQVJfSUZBQ0VfQUREUl9QUkVGSVg9ICIxOTIuMTY4LjQ0LiI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJMVUVUT09USF9ORVRNQVNLICAgICAgICA9ICIyNTUuMjU1LjI1NS4wIjsKKwogICAgIC8vIFRoZSB0aW1lb3V0IHVzZWQgdG8gc2VudCB0aGUgVVVJRHMgSW50ZW50CiAgICAgLy8gVGhpcyB0aW1lb3V0IHNob3VsZCBiZSBncmVhdGVyIHRoYW4gdGhlIHBhZ2UgdGltZW91dAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBVVUlEX0lOVEVOVF9ERUxBWSA9IDYwMDA7CkBAIC0xMjcsOCArMTM5LDEyIEBACiAgICAgcHJpdmF0ZSBmaW5hbCBIYXNoTWFwPFN0cmluZywgQmx1ZXRvb3RoRGV2aWNlUHJvZmlsZVN0YXRlPiBtRGV2aWNlUHJvZmlsZVN0YXRlOwogICAgIHByaXZhdGUgZmluYWwgQmx1ZXRvb3RoUHJvZmlsZVN0YXRlIG1BMmRwUHJvZmlsZVN0YXRlOwogICAgIHByaXZhdGUgZmluYWwgQmx1ZXRvb3RoUHJvZmlsZVN0YXRlIG1IZnBQcm9maWxlU3RhdGU7CisgICAgcHJpdmF0ZSBmaW5hbCBCbHVldG9vdGhQcm9maWxlU3RhdGUgbUhpZFByb2ZpbGVTdGF0ZTsKIAogICAgIHByaXZhdGUgQmx1ZXRvb3RoQTJkcFNlcnZpY2UgbUEyZHBTZXJ2aWNlOworICAgIHByaXZhdGUgZmluYWwgSGFzaE1hcDxCbHVldG9vdGhEZXZpY2UsIEludGVnZXI+IG1JbnB1dERldmljZXM7CisgICAgcHJpdmF0ZSBmaW5hbCBIYXNoTWFwPEJsdWV0b290aERldmljZSwgSW50ZWdlcj4gbVBhbkRldmljZXM7CisKICAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgbURvY2tBZGRyZXNzOwogICAgIHByaXZhdGUgU3RyaW5nIG1Eb2NrUGluOwogCkBAIC0xNzksNiArMTk1LDcgQEAKIAogICAgICAgICBtQmx1ZXRvb3RoU3RhdGUgPSBCbHVldG9vdGhBZGFwdGVyLlNUQVRFX09GRjsKICAgICAgICAgbUlzRGlzY292ZXJpbmcgPSBmYWxzZTsKKyAgICAgICAgbVRldGhlcmluZ09uID0gZmFsc2U7CiAgICAgICAgIG1BZGFwdGVyUHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwogICAgICAgICBtRGV2aWNlUHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgTWFwPFN0cmluZyxTdHJpbmc+PigpOwogCkBAIC0xODksMTUgKzIwNiwyNSBAQAogICAgICAgICBtRGV2aWNlUHJvZmlsZVN0YXRlID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBCbHVldG9vdGhEZXZpY2VQcm9maWxlU3RhdGU+KCk7CiAgICAgICAgIG1BMmRwUHJvZmlsZVN0YXRlID0gbmV3IEJsdWV0b290aFByb2ZpbGVTdGF0ZShtQ29udGV4dCwgQmx1ZXRvb3RoUHJvZmlsZVN0YXRlLkEyRFApOwogICAgICAgICBtSGZwUHJvZmlsZVN0YXRlID0gbmV3IEJsdWV0b290aFByb2ZpbGVTdGF0ZShtQ29udGV4dCwgQmx1ZXRvb3RoUHJvZmlsZVN0YXRlLkhGUCk7CisgICAgICAgIG1IaWRQcm9maWxlU3RhdGUgPSBuZXcgQmx1ZXRvb3RoUHJvZmlsZVN0YXRlKG1Db250ZXh0LCBCbHVldG9vdGhQcm9maWxlU3RhdGUuSElEKTsKKworICAgICAgICAvLyBDYW4gdGV0aGVyIHRvIHVwIHRvIDcgZGV2aWNlcworICAgICAgICBtQmx1ZXRvb3RoSWZhY2VBZGRyZXNzZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oQmx1ZXRvb3RoUGFuLk1BWF9DT05ORUNUSU9OUyk7CisgICAgICAgIGZvciAoaW50IGk9MTsgaSA8PSBCbHVldG9vdGhQYW4uTUFYX0NPTk5FQ1RJT05TOyBpKyspIHsKKyAgICAgICAgICAgIG1CbHVldG9vdGhJZmFjZUFkZHJlc3Nlcy5hZGQoQkxVRVRPT1RIX05FQVJfSUZBQ0VfQUREUl9QUkVGSVggKyBpKTsKKyAgICAgICAgfQogCiAgICAgICAgIG1IZnBQcm9maWxlU3RhdGUuc3RhcnQoKTsKICAgICAgICAgbUEyZHBQcm9maWxlU3RhdGUuc3RhcnQoKTsKKyAgICAgICAgbUhpZFByb2ZpbGVTdGF0ZS5zdGFydCgpOwogCiAgICAgICAgIEludGVudEZpbHRlciBmaWx0ZXIgPSBuZXcgSW50ZW50RmlsdGVyKCk7CiAgICAgICAgIHJlZ2lzdGVyRm9yQWlycGxhbmVNb2RlKGZpbHRlcik7CiAKICAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihJbnRlbnQuQUNUSU9OX0RPQ0tfRVZFTlQpOwogICAgICAgICBtQ29udGV4dC5yZWdpc3RlclJlY2VpdmVyKG1SZWNlaXZlciwgZmlsdGVyKTsKKyAgICAgICAgbUlucHV0RGV2aWNlcyA9IG5ldyBIYXNoTWFwPEJsdWV0b290aERldmljZSwgSW50ZWdlcj4oKTsKKyAgICAgICAgbVBhbkRldmljZXMgPSBuZXcgSGFzaE1hcDxCbHVldG9vdGhEZXZpY2UsIEludGVnZXI+KCk7CiAgICAgfQogCiAgICAgcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgU3RyaW5nIHJlYWREb2NrQmx1ZXRvb3RoQWRkcmVzcygpIHsKQEAgLTMyNSw2ICszNTIsNyBAQAogICAgICAgICB9CiAgICAgICAgIHNldEJsdWV0b290aFN0YXRlKEJsdWV0b290aEFkYXB0ZXIuU1RBVEVfVFVSTklOR19PRkYpOwogICAgICAgICBtSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhNRVNTQUdFX1JFR0lTVEVSX1NEUF9SRUNPUkRTKTsKKyAgICAgICAgc2V0Qmx1ZXRvb3RoVGV0aGVyaW5nKGZhbHNlLCBCbHVldG9vdGhQYW4uTkFQX1JPTEUsIEJsdWV0b290aFBhbi5OQVBfQlJJREdFKTsKIAogICAgICAgICAvLyBBbGxvdyAzIHNlY29uZHMgZm9yIHByb2ZpbGVzIHRvIGdyYWNlZnVsbHkgZGlzY29ubmVjdAogICAgICAgICAvLyBUT0RPOiBJbnRyb2R1Y2UgYSBjYWxsYmFjayBtZWNoYW5pc20gc28gdGhhdCBlYWNoIHByb2ZpbGUgY2FuIG5vdGlmeQpAQCAtNjY4LDYgKzY5NiwxMCBAQAogICAgICAgICAgICAgICAgIHJlbW92ZVByb2ZpbGVTdGF0ZShhZGRyZXNzKTsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgLy8gSElEIGlzIGhhbmRsZWQgYnkgQmx1ZXRvb3RoU2VydmljZSwgb3RoZXIgcHJvZmlsZXMKKyAgICAgICAgICAgIC8vIHdpbGwgYmUgaGFuZGxlZCBieSB0aGVpciByZXNwZWN0aXZlIHNlcnZpY2VzLgorICAgICAgICAgICAgc2V0SW5pdGlhbElucHV0RGV2aWNlUHJpb3JpdHkobUFkYXB0ZXIuZ2V0UmVtb3RlRGV2aWNlKGFkZHJlc3MpLCBzdGF0ZSk7CisKICAgICAgICAgICAgIGlmIChEQkcpIGxvZyhhZGRyZXNzICsgIiBib25kIHN0YXRlICIgKyBvbGRTdGF0ZSArICIgLT4gIiArIHN0YXRlICsgIiAoIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhc29uICsgIikiKTsKICAgICAgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KEJsdWV0b290aERldmljZS5BQ1RJT05fQk9ORF9TVEFURV9DSEFOR0VEKTsKQEAgLTEyMjAsNiArMTI1MiwzNzUgQEAKICAgICAgICAgcmV0dXJuIHNwLmNvbnRhaW5zKFNIQVJFRF9QUkVGRVJFTkNFX0RPQ0tfQUREUkVTUyArIGFkZHJlc3MpOwogICAgIH0KIAorICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBpc1RldGhlcmluZ09uKCkgeworICAgICAgICByZXR1cm4gbVRldGhlcmluZ09uOworICAgIH0KKworICAgIHByaXZhdGUgQnJvYWRjYXN0UmVjZWl2ZXIgbVRldGhlcmluZ1JlY2VpdmVyID0gbnVsbDsKKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRCbHVldG9vdGhUZXRoZXJpbmcoYm9vbGVhbiB2YWx1ZSwgCisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdXVpZCwgZmluYWwgU3RyaW5nIGJyaWRnZSkgeworICAgICAgICBtVGV0aGVyaW5nT24gPSB2YWx1ZTsKKyAgICAgICAgaWYgKCF2YWx1ZSkgeworICAgICAgICAgICAgZGlzY29ubmVjdFBhbigpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGdldEJsdWV0b290aFN0YXRlKCkgIT0gQmx1ZXRvb3RoQWRhcHRlci5TVEFURV9PTiAmJiBtVGV0aGVyaW5nT24pIHsKKyAgICAgICAgICAgIEludGVudEZpbHRlciBmaWx0ZXIgPSBuZXcgSW50ZW50RmlsdGVyKCk7CisgICAgICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKEJsdWV0b290aEFkYXB0ZXIuQUNUSU9OX1NUQVRFX0NIQU5HRUQpOworICAgICAgICAgICAgbVRldGhlcmluZ1JlY2VpdmVyID0gbmV3IEJyb2FkY2FzdFJlY2VpdmVyKCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBvblJlY2VpdmUoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50KSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChpbnRlbnQuZ2V0SW50RXh0cmEoQmx1ZXRvb3RoQWRhcHRlci5FWFRSQV9TVEFURSwgQmx1ZXRvb3RoQWRhcHRlci5TVEFURV9PRkYpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gQmx1ZXRvb3RoQWRhcHRlci5TVEFURV9PTikgeworICAgICAgICAgICAgICAgICAgICAgICAgc2V0Qmx1ZXRvb3RoVGV0aGVyaW5nKHRydWUsIHV1aWQsIGJyaWRnZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtQ29udGV4dC51bnJlZ2lzdGVyUmVjZWl2ZXIobVRldGhlcmluZ1JlY2VpdmVyKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBtQ29udGV4dC5yZWdpc3RlclJlY2VpdmVyKG1UZXRoZXJpbmdSZWNlaXZlciwgZmlsdGVyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNldEJsdWV0b290aFRldGhlcmluZ05hdGl2ZSh2YWx1ZSwgdXVpZCwgYnJpZGdlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGdldFBhbkRldmljZVN0YXRlKEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKKyAgICAgICAgbUNvbnRleHQuZW5mb3JjZUNhbGxpbmdPclNlbGZQZXJtaXNzaW9uKEJMVUVUT09USF9QRVJNLCAiTmVlZCBCTFVFVE9PVEggcGVybWlzc2lvbiIpOworCisgICAgICAgIGlmIChtUGFuRGV2aWNlcy5nZXQoZGV2aWNlKSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gQmx1ZXRvb3RoUGFuLlNUQVRFX0RJU0NPTk5FQ1RFRDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbVBhbkRldmljZXMuZ2V0KGRldmljZSk7CisgICAgfQorCisgICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGNvbm5lY3RQYW5EZXZpY2UoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgeworICAgICAgICBtQ29udGV4dC5lbmZvcmNlQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oQkxVRVRPT1RIX0FETUlOX1BFUk0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTmVlZCBCTFVFVE9PVEhfQURNSU4gcGVybWlzc2lvbiIpOworCisgICAgICAgIFN0cmluZyBvYmplY3RQYXRoID0gZ2V0T2JqZWN0UGF0aEZyb21BZGRyZXNzKGRldmljZS5nZXRBZGRyZXNzKCkpOworICAgICAgICBpZiAoREJHKSBsb2coImNvbm5lY3QgUEFOKCIgKyBvYmplY3RQYXRoICsgIikiKTsKKyAgICAgICAgaWYgKGdldFBhbkRldmljZVN0YXRlKGRldmljZSkgIT0gQmx1ZXRvb3RoUGFuLlNUQVRFX0RJU0NPTk5FQ1RFRCkgeworICAgICAgICAgICAgbG9nIChkZXZpY2UgKyAiIGFscmVhZHkgY29ubmVjdGVkIHRvIFBBTiIpOworICAgICAgICB9CisKKyAgICAgICAgaW50IGNvbm5lY3RlZENvdW50ID0gMDsKKyAgICAgICAgZm9yIChCbHVldG9vdGhEZXZpY2UgQlRkZXZpY2U6IG1QYW5EZXZpY2VzLmtleVNldCgpKSB7CisgICAgICAgICAgICBpZiAoZ2V0UGFuRGV2aWNlU3RhdGUoQlRkZXZpY2UpID09IEJsdWV0b290aFBhbi5TVEFURV9DT05ORUNURUQpIHsKKyAgICAgICAgICAgICAgICBjb25uZWN0ZWRDb3VudCArKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoY29ubmVjdGVkQ291bnQgPiA4KSB7CisgICAgICAgICAgICBsb2cgKGRldmljZSArICIgY291bGQgbm90IGNvbm5lY3QgdG8gUEFOIGJlY2F1c2UgOCBvdGhlciBkZXZpY2VzIGFyZSBhbHJlYWR5IGNvbm5lY3RlZCIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgaGFuZGxlUGFuRGV2aWNlU3RhdGVDaGFuZ2UoZGV2aWNlLCBCbHVldG9vdGhQYW4uU1RBVEVfQ09OTkVDVElORyk7CisgICAgICAgIGlmIChjb25uZWN0UGFuRGV2aWNlTmF0aXZlKG9iamVjdFBhdGgsICJuYXAiLCAicGFudSIpKSB7CisgICAgICAgICAgICBsb2cgKCJjb25uZWN0aW5nIHRvIFBBTiIpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBoYW5kbGVQYW5EZXZpY2VTdGF0ZUNoYW5nZShkZXZpY2UsIEJsdWV0b290aFBhbi5TVEFURV9ESVNDT05ORUNURUQpOworICAgICAgICAgICAgbG9nICgiY291bGQgbm90IGNvbm5lY3QgdG8gUEFOIik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN5bmNocm9uaXplZCBib29sZWFuIGRpc2Nvbm5lY3RQYW4oKSB7CisgICAgICAgIG1Db250ZXh0LmVuZm9yY2VDYWxsaW5nT3JTZWxmUGVybWlzc2lvbihCTFVFVE9PVEhfUEVSTSwgIk5lZWQgQkxVRVRPT1RIIHBlcm1pc3Npb24iKTsKKyAgICAgICAgaWYgKERCRykgbG9nKCJkaXNjb25uZWN0IGFsbCBQQU4gZGV2aWNlcyIpOworCisgICAgICAgIGZvciAoQmx1ZXRvb3RoRGV2aWNlIGRldmljZTogbVBhbkRldmljZXMua2V5U2V0KCkpIHsKKyAgICAgICAgICAgIGlmIChnZXRQYW5EZXZpY2VTdGF0ZShkZXZpY2UpID09IEJsdWV0b290aFBhbi5TVEFURV9DT05ORUNURUQpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWRpc2Nvbm5lY3RQYW5EZXZpY2UoZGV2aWNlKSkgeworICAgICAgICAgICAgICAgICAgICBsb2cgKCJjb3VsZCBub3QgZGlzY29ubmVjdCBQYW4gRGV2aWNlICIrZGV2aWNlLmdldEFkZHJlc3MoKSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIHN5bmNocm9uaXplZCBCbHVldG9vdGhEZXZpY2VbXSBnZXRDb25uZWN0ZWRQYW5EZXZpY2VzKCkgeworICAgICAgICBtQ29udGV4dC5lbmZvcmNlQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oQkxVRVRPT1RIX1BFUk0sICJOZWVkIEJMVUVUT09USCBwZXJtaXNzaW9uIik7CisKKyAgICAgICAgU2V0PEJsdWV0b290aERldmljZT4gZGV2aWNlcyA9IG5ldyBIYXNoU2V0PEJsdWV0b290aERldmljZT4oKTsKKyAgICAgICAgZm9yIChCbHVldG9vdGhEZXZpY2UgZGV2aWNlOiBtUGFuRGV2aWNlcy5rZXlTZXQoKSkgeworICAgICAgICAgICAgaWYgKGdldFBhbkRldmljZVN0YXRlKGRldmljZSkgPT0gQmx1ZXRvb3RoUGFuLlNUQVRFX0NPTk5FQ1RFRCkgeworICAgICAgICAgICAgICAgIGRldmljZXMuYWRkKGRldmljZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGRldmljZXMudG9BcnJheShuZXcgQmx1ZXRvb3RoRGV2aWNlW2RldmljZXMuc2l6ZSgpXSk7CisgICAgfQorCisgICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGRpc2Nvbm5lY3RQYW5EZXZpY2UoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgeworICAgICAgICBtQ29udGV4dC5lbmZvcmNlQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oQkxVRVRPT1RIX0FETUlOX1BFUk0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTmVlZCBCTFVFVE9PVEhfQURNSU4gcGVybWlzc2lvbiIpOworICAgICAgICBTdHJpbmcgb2JqZWN0UGF0aCA9IGdldE9iamVjdFBhdGhGcm9tQWRkcmVzcyhkZXZpY2UuZ2V0QWRkcmVzcygpKTsKKyAgICAgICAgaWYgKERCRykgbG9nKCJkaXNjb25uZWN0IFBBTigiICsgb2JqZWN0UGF0aCArICIpIik7CisgICAgICAgIGlmIChnZXRQYW5EZXZpY2VTdGF0ZShkZXZpY2UpICE9IEJsdWV0b290aFBhbi5TVEFURV9DT05ORUNURUQpIHsKKyAgICAgICAgICAgIGxvZyAoZGV2aWNlICsgIiBhbHJlYWR5IGRpc2Nvbm5lY3RlZCBmcm9tIFBBTiIpOworICAgICAgICB9CisgICAgICAgIGhhbmRsZVBhbkRldmljZVN0YXRlQ2hhbmdlKGRldmljZSwgQmx1ZXRvb3RoUGFuLlNUQVRFX0RJU0NPTk5FQ1RJTkcpOworICAgICAgICByZXR1cm4gZGlzY29ubmVjdFBhbkRldmljZU5hdGl2ZShvYmplY3RQYXRoKTsKKyAgICB9CisKKyAgICAvKnBhY2thZ2UqLyB2b2lkIGhhbmRsZVBhbkRldmljZVN0YXRlQ2hhbmdlKEJsdWV0b290aERldmljZSBkZXZpY2UsIGludCBzdGF0ZSkgeworICAgICAgICBpbnQgcHJldlN0YXRlOworICAgICAgICBpZiAobVBhbkRldmljZXMuZ2V0KGRldmljZSkgPT0gbnVsbCkgeworICAgICAgICAgICAgcHJldlN0YXRlID0gQmx1ZXRvb3RoUGFuLlNUQVRFX0RJU0NPTk5FQ1RFRDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHByZXZTdGF0ZSA9IG1QYW5EZXZpY2VzLmdldChkZXZpY2UpOworICAgICAgICB9CisgICAgICAgIGlmIChwcmV2U3RhdGUgPT0gc3RhdGUpIHJldHVybjsKKworICAgICAgICBtUGFuRGV2aWNlcy5wdXQoZGV2aWNlLCBzdGF0ZSk7CisKKyAgICAgICAgaWYgKHN0YXRlID09IEJsdWV0b290aFBhbi5TVEFURV9DT05ORUNURUQpIHsKKyAgICAgICAgICAgIHVwZGF0ZVRldGhlclN0YXRlKHRydWUpOworICAgICAgICB9CisKKyAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoQmx1ZXRvb3RoUGFuLkFDVElPTl9QQU5fU1RBVEVfQ0hBTkdFRCk7CisgICAgICAgIGludGVudC5wdXRFeHRyYShCbHVldG9vdGhEZXZpY2UuRVhUUkFfREVWSUNFLCBkZXZpY2UpOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoQmx1ZXRvb3RoUGFuLkVYVFJBX1BSRVZJT1VTX1BBTl9TVEFURSwgcHJldlN0YXRlKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKEJsdWV0b290aFBhbi5FWFRSQV9QQU5fU1RBVEUsIHN0YXRlKTsKKyAgICAgICAgbUNvbnRleHQuc2VuZEJyb2FkY2FzdChpbnRlbnQsIEJMVUVUT09USF9QRVJNKTsKKworICAgICAgICBpZiAoREJHKSBsb2coIlBhbiBEZXZpY2Ugc3RhdGUgOiBkZXZpY2U6ICIgKyBkZXZpY2UgKyAiIFN0YXRlOiIgKyBwcmV2U3RhdGUgKyAiLT4iICsgc3RhdGUpOworCisgICAgfQorCisgICAgLy8gY29uZmlndXJlZCB3aGVuIHdlIHN0YXJ0IHRldGhlcmluZyBhbmQgdW5jb25maWcnZCBvbiBlcnJvciBvciBjb25jbHVzaW9uCisgICAgcHJpdmF0ZSBib29sZWFuIHVwZGF0ZVRldGhlclN0YXRlKGJvb2xlYW4gZW5hYmxlZCkgeworICAgICAgICBMb2cuZChUQUcsICJjb25maWd1cmVCbHVldG9vdGhJZmFjZSgiICsgZW5hYmxlZCArICIpIik7CisKKyAgICAgICAgSUJpbmRlciBiID0gU2VydmljZU1hbmFnZXIuZ2V0U2VydmljZShDb250ZXh0Lk5FVFdPUktNQU5BR0VNRU5UX1NFUlZJQ0UpOworICAgICAgICBJTmV0d29ya01hbmFnZW1lbnRTZXJ2aWNlIHNlcnZpY2UgPSBJTmV0d29ya01hbmFnZW1lbnRTZXJ2aWNlLlN0dWIuYXNJbnRlcmZhY2UoYik7CisgICAgICAgIENvbm5lY3Rpdml0eU1hbmFnZXIgY20gPQorICAgICAgICAgICAgKENvbm5lY3Rpdml0eU1hbmFnZXIpbUNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkNPTk5FQ1RJVklUWV9TRVJWSUNFKTsKKyAgICAgICAgU3RyaW5nW10gYmx1ZXRvb3RoUmVnZXhzID0gY20uZ2V0VGV0aGVyYWJsZUJsdWV0b290aFJlZ2V4cygpOworCisgICAgICAgIC8vIGJyaW5nIHRvZ2dsZSB0aGUgaW50ZXJmYWNlcworICAgICAgICBTdHJpbmdbXSBpZmFjZXMgPSBuZXcgU3RyaW5nWzBdOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWZhY2VzID0gc2VydmljZS5saXN0SW50ZXJmYWNlcygpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiRXJyb3IgbGlzdGluZyBJbnRlcmZhY2VzIDoiICsgZSk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBpZmFjZUFkZHJlc3NlcyA9IChBcnJheUxpc3Q8U3RyaW5nPikgbUJsdWV0b290aElmYWNlQWRkcmVzc2VzLmNsb25lKCk7CisgICAgICAgIGZvciAoU3RyaW5nIGlmYWNlIDogaWZhY2VzKSB7CisgICAgICAgICAgICBmb3IgKFN0cmluZyByZWdleCA6IGJsdWV0b290aFJlZ2V4cykgeworICAgICAgICAgICAgICAgIGlmIChpZmFjZS5tYXRjaGVzKHJlZ2V4KSkgeworICAgICAgICAgICAgICAgICAgICBJbnRlcmZhY2VDb25maWd1cmF0aW9uIGlmY2cgPSBudWxsOworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWZjZyA9IHNlcnZpY2UuZ2V0SW50ZXJmYWNlQ29uZmlnKGlmYWNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpZmNnICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW5hYmxlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSBhZGRyID0gQkxVRVRPT1RIX05FVE1BU0suc3BsaXQoIlxcLiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmNnLm5ldG1hc2sgPSAoSW50ZWdlci5wYXJzZUludChhZGRyWzBdKSA8PCAyNCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJbnRlZ2VyLnBhcnNlSW50KGFkZHJbMV0pIDw8IDE2KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEludGVnZXIucGFyc2VJbnQoYWRkclsyXSkgPDwgOCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJbnRlZ2VyLnBhcnNlSW50KGFkZHJbM10pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlmY2cuaXBBZGRyID09IDAgJiYgIWlmYWNlQWRkcmVzc2VzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkciA9IGlmYWNlQWRkcmVzc2VzLnJlbW92ZSgwKS5zcGxpdCgiXFwuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmNnLmlwQWRkciA9IChJbnRlZ2VyLnBhcnNlSW50KGFkZHJbMF0pIDw8IDI0KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJbnRlZ2VyLnBhcnNlSW50KGFkZHJbMV0pIDw8IDE2KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJbnRlZ2VyLnBhcnNlSW50KGFkZHJbMl0pIDw8IDgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEludGVnZXIucGFyc2VJbnQoYWRkclszXSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIElmYWNlQWRkcmVzcyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZy52YWx1ZU9mKGlmY2cuaXBBZGRyID4+PiAyNCkgKyAiLiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcudmFsdWVPZigoaWZjZy5pcEFkZHIgJiAweDAwRkYwMDAwKSA+Pj4gMTYpICsgIi4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nLnZhbHVlT2YoKGlmY2cuaXBBZGRyICYgMHgwMDAwRkYwMCkgPj4+IDgpICsgIi4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nLnZhbHVlT2YoaWZjZy5pcEFkZHIgJiAweDAwMDAwMEZGKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmYWNlQWRkcmVzc2VzLnJlbW92ZShJZmFjZUFkZHJlc3MpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmY2cuaW50ZXJmYWNlRmxhZ3MgPSBpZmNnLmludGVyZmFjZUZsYWdzLnJlcGxhY2UoImRvd24iLCAidXAiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmNnLmludGVyZmFjZUZsYWdzID0gaWZjZy5pbnRlcmZhY2VGbGFncy5yZXBsYWNlKCJ1cCIsICJkb3duIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmY2cuaW50ZXJmYWNlRmxhZ3MgPSBpZmNnLmludGVyZmFjZUZsYWdzLnJlcGxhY2UoInJ1bm5pbmciLCAiIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZjZy5pbnRlcmZhY2VGbGFncyA9IGlmY2cuaW50ZXJmYWNlRmxhZ3MucmVwbGFjZSgiICAiLCIgIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZS5zZXRJbnRlcmZhY2VDb25maWcoaWZhY2UsIGlmY2cpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbmFibGVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbS50ZXRoZXIoaWZhY2UpICE9IENvbm5lY3Rpdml0eU1hbmFnZXIuVEVUSEVSX0VSUk9SX05PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJFcnJvciB0ZXRoZXJpbmcgIitpZmFjZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiRXJyb3IgY29uZmlndXJpbmcgaW50ZXJmYWNlICIgKyBpZmFjZSArICIsIDoiICsgZSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gY29ubmVjdElucHV0RGV2aWNlKEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKKyAgICAgICAgbUNvbnRleHQuZW5mb3JjZUNhbGxpbmdPclNlbGZQZXJtaXNzaW9uKEJMVUVUT09USF9BRE1JTl9QRVJNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5lZWQgQkxVRVRPT1RIX0FETUlOIHBlcm1pc3Npb24iKTsKKworICAgICAgICBTdHJpbmcgb2JqZWN0UGF0aCA9IGdldE9iamVjdFBhdGhGcm9tQWRkcmVzcyhkZXZpY2UuZ2V0QWRkcmVzcygpKTsKKyAgICAgICAgaWYgKG9iamVjdFBhdGggPT0gbnVsbCB8fAorICAgICAgICAgICAgZ2V0SW5wdXREZXZpY2VTdGF0ZShkZXZpY2UpICE9IEJsdWV0b290aElucHV0RGV2aWNlLlNUQVRFX0RJU0NPTk5FQ1RFRCB8fAorICAgICAgICAgICAgZ2V0SW5wdXREZXZpY2VQcmlvcml0eShkZXZpY2UpID09IEJsdWV0b290aElucHV0RGV2aWNlLlBSSU9SSVRZX09GRikgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIEJsdWV0b290aERldmljZVByb2ZpbGVTdGF0ZSBzdGF0ZSA9IG1EZXZpY2VQcm9maWxlU3RhdGUuZ2V0KGRldmljZS5nZXRBZGRyZXNzKCkpOworICAgICAgICBpZiAoc3RhdGUgIT0gbnVsbCkgeworICAgICAgICAgICAgTWVzc2FnZSBtc2cgPSBuZXcgTWVzc2FnZSgpOworICAgICAgICAgICAgbXNnLmFyZzEgPSBCbHVldG9vdGhEZXZpY2VQcm9maWxlU3RhdGUuQ09OTkVDVF9ISURfT1VUR09JTkc7CisgICAgICAgICAgICBtc2cub2JqID0gc3RhdGU7CisgICAgICAgICAgICBtSGlkUHJvZmlsZVN0YXRlLnNlbmRNZXNzYWdlKG1zZyk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGNvbm5lY3RJbnB1dERldmljZUludGVybmFsKEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKKyAgICAgICAgU3RyaW5nIG9iamVjdFBhdGggPSBnZXRPYmplY3RQYXRoRnJvbUFkZHJlc3MoZGV2aWNlLmdldEFkZHJlc3MoKSk7CisgICAgICAgIGhhbmRsZUlucHV0RGV2aWNlU3RhdGVDaGFuZ2UoZGV2aWNlLCBCbHVldG9vdGhJbnB1dERldmljZS5TVEFURV9DT05ORUNUSU5HKTsKKyAgICAgICAgaWYgKCFjb25uZWN0SW5wdXREZXZpY2VOYXRpdmUob2JqZWN0UGF0aCkpIHsKKyAgICAgICAgICAgIGhhbmRsZUlucHV0RGV2aWNlU3RhdGVDaGFuZ2UoZGV2aWNlLCBCbHVldG9vdGhJbnB1dERldmljZS5TVEFURV9ESVNDT05ORUNURUQpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBkaXNjb25uZWN0SW5wdXREZXZpY2UoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgeworICAgICAgICBtQ29udGV4dC5lbmZvcmNlQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oQkxVRVRPT1RIX0FETUlOX1BFUk0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTmVlZCBCTFVFVE9PVEhfQURNSU4gcGVybWlzc2lvbiIpOworCisgICAgICAgIFN0cmluZyBvYmplY3RQYXRoID0gZ2V0T2JqZWN0UGF0aEZyb21BZGRyZXNzKGRldmljZS5nZXRBZGRyZXNzKCkpOworICAgICAgICBpZiAob2JqZWN0UGF0aCA9PSBudWxsIHx8IGdldENvbm5lY3RlZElucHV0RGV2aWNlcygpLmxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgQmx1ZXRvb3RoRGV2aWNlUHJvZmlsZVN0YXRlIHN0YXRlID0gbURldmljZVByb2ZpbGVTdGF0ZS5nZXQoZGV2aWNlLmdldEFkZHJlc3MoKSk7CisgICAgICAgIGlmIChzdGF0ZSAhPSBudWxsKSB7CisgICAgICAgICAgICBNZXNzYWdlIG1zZyA9IG5ldyBNZXNzYWdlKCk7CisgICAgICAgICAgICBtc2cuYXJnMSA9IEJsdWV0b290aERldmljZVByb2ZpbGVTdGF0ZS5ESVNDT05ORUNUX0hJRF9PVVRHT0lORzsKKyAgICAgICAgICAgIG1zZy5vYmogPSBzdGF0ZTsKKyAgICAgICAgICAgIG1IaWRQcm9maWxlU3RhdGUuc2VuZE1lc3NhZ2UobXNnKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gZGlzY29ubmVjdElucHV0RGV2aWNlSW50ZXJuYWwoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgeworICAgICAgICBTdHJpbmcgb2JqZWN0UGF0aCA9IGdldE9iamVjdFBhdGhGcm9tQWRkcmVzcyhkZXZpY2UuZ2V0QWRkcmVzcygpKTsKKyAgICAgICAgaGFuZGxlSW5wdXREZXZpY2VTdGF0ZUNoYW5nZShkZXZpY2UsIEJsdWV0b290aElucHV0RGV2aWNlLlNUQVRFX0RJU0NPTk5FQ1RJTkcpOworICAgICAgICBpZiAoIWRpc2Nvbm5lY3RJbnB1dERldmljZU5hdGl2ZShvYmplY3RQYXRoKSkgeworICAgICAgICAgICAgaGFuZGxlSW5wdXREZXZpY2VTdGF0ZUNoYW5nZShkZXZpY2UsIEJsdWV0b290aElucHV0RGV2aWNlLlNUQVRFX0NPTk5FQ1RFRCk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIHN5bmNocm9uaXplZCBpbnQgZ2V0SW5wdXREZXZpY2VTdGF0ZShCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7CisgICAgICAgIG1Db250ZXh0LmVuZm9yY2VDYWxsaW5nT3JTZWxmUGVybWlzc2lvbihCTFVFVE9PVEhfUEVSTSwgIk5lZWQgQkxVRVRPT1RIIHBlcm1pc3Npb24iKTsKKworICAgICAgICBpZiAobUlucHV0RGV2aWNlcy5nZXQoZGV2aWNlKSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gQmx1ZXRvb3RoSW5wdXREZXZpY2UuU1RBVEVfRElTQ09OTkVDVEVEOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtSW5wdXREZXZpY2VzLmdldChkZXZpY2UpOworICAgIH0KKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgQmx1ZXRvb3RoRGV2aWNlW10gZ2V0Q29ubmVjdGVkSW5wdXREZXZpY2VzKCkgeworICAgICAgICBtQ29udGV4dC5lbmZvcmNlQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oQkxVRVRPT1RIX1BFUk0sICJOZWVkIEJMVUVUT09USCBwZXJtaXNzaW9uIik7CisgICAgICAgIFNldDxCbHVldG9vdGhEZXZpY2U+IGRldmljZXMgPSBsb29rdXBJbnB1dERldmljZXNNYXRjaGluZ1N0YXRlcygKKyAgICAgICAgICAgIG5ldyBpbnRbXSB7Qmx1ZXRvb3RoSW5wdXREZXZpY2UuU1RBVEVfQ09OTkVDVEVEfSk7CisgICAgICAgIHJldHVybiBkZXZpY2VzLnRvQXJyYXkobmV3IEJsdWV0b290aERldmljZVtkZXZpY2VzLnNpemUoKV0pOworICAgIH0KKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGdldElucHV0RGV2aWNlUHJpb3JpdHkoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgeworICAgICAgICBtQ29udGV4dC5lbmZvcmNlQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oQkxVRVRPT1RIX1BFUk0sICJOZWVkIEJMVUVUT09USCBwZXJtaXNzaW9uIik7CisgICAgICAgIHJldHVybiBTZXR0aW5ncy5TZWN1cmUuZ2V0SW50KG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLAorICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5nZXRCbHVldG9vdGhJbnB1dERldmljZVByaW9yaXR5S2V5KGRldmljZS5nZXRBZGRyZXNzKCkpLAorICAgICAgICAgICAgICAgIEJsdWV0b290aElucHV0RGV2aWNlLlBSSU9SSVRZX1VOREVGSU5FRCk7CisgICAgfQorCisgICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHNldElucHV0RGV2aWNlUHJpb3JpdHkoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW50IHByaW9yaXR5KSB7CisgICAgICAgIG1Db250ZXh0LmVuZm9yY2VDYWxsaW5nT3JTZWxmUGVybWlzc2lvbihCTFVFVE9PVEhfQURNSU5fUEVSTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOZWVkIEJMVUVUT09USF9BRE1JTiBwZXJtaXNzaW9uIik7CisgICAgICAgIGlmICghQmx1ZXRvb3RoQWRhcHRlci5jaGVja0JsdWV0b290aEFkZHJlc3MoZGV2aWNlLmdldEFkZHJlc3MoKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gU2V0dGluZ3MuU2VjdXJlLnB1dEludChtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwKKyAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuZ2V0Qmx1ZXRvb3RoSW5wdXREZXZpY2VQcmlvcml0eUtleShkZXZpY2UuZ2V0QWRkcmVzcygpKSwKKyAgICAgICAgICAgICAgICBwcmlvcml0eSk7CisgICAgfQorCisgICAgLypwYWNrYWdlKi9zeW5jaHJvbml6ZWQgU2V0PEJsdWV0b290aERldmljZT4gbG9va3VwSW5wdXREZXZpY2VzTWF0Y2hpbmdTdGF0ZXMoaW50W10gc3RhdGVzKSB7CisgICAgICAgIFNldDxCbHVldG9vdGhEZXZpY2U+IGlucHV0RGV2aWNlcyA9IG5ldyBIYXNoU2V0PEJsdWV0b290aERldmljZT4oKTsKKyAgICAgICAgaWYgKG1JbnB1dERldmljZXMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICByZXR1cm4gaW5wdXREZXZpY2VzOworICAgICAgICB9CisgICAgICAgIGZvciAoQmx1ZXRvb3RoRGV2aWNlIGRldmljZTogbUlucHV0RGV2aWNlcy5rZXlTZXQoKSkgeworICAgICAgICAgICAgaW50IGlucHV0RGV2aWNlU3RhdGUgPSBnZXRJbnB1dERldmljZVN0YXRlKGRldmljZSk7CisgICAgICAgICAgICBmb3IgKGludCBzdGF0ZSA6IHN0YXRlcykgeworICAgICAgICAgICAgICAgIGlmIChzdGF0ZSA9PSBpbnB1dERldmljZVN0YXRlKSB7CisgICAgICAgICAgICAgICAgICAgIGlucHV0RGV2aWNlcy5hZGQoZGV2aWNlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBpbnB1dERldmljZXM7CisgICAgfQorCisgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBoYW5kbGVJbnB1dERldmljZVN0YXRlQ2hhbmdlKEJsdWV0b290aERldmljZSBkZXZpY2UsIGludCBzdGF0ZSkgeworICAgICAgICBpbnQgcHJldlN0YXRlOworICAgICAgICBpZiAobUlucHV0RGV2aWNlcy5nZXQoZGV2aWNlKSA9PSBudWxsKSB7CisgICAgICAgICAgICBwcmV2U3RhdGUgPSBCbHVldG9vdGhJbnB1dERldmljZS5TVEFURV9ESVNDT05ORUNURUQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwcmV2U3RhdGUgPSBtSW5wdXREZXZpY2VzLmdldChkZXZpY2UpOworICAgICAgICB9CisgICAgICAgIGlmIChwcmV2U3RhdGUgPT0gc3RhdGUpIHJldHVybjsKKworICAgICAgICBtSW5wdXREZXZpY2VzLnB1dChkZXZpY2UsIHN0YXRlKTsKKworICAgICAgICBpZiAoZ2V0SW5wdXREZXZpY2VQcmlvcml0eShkZXZpY2UpID4KKyAgICAgICAgICAgICAgQmx1ZXRvb3RoSW5wdXREZXZpY2UuUFJJT1JJVFlfT0ZGICYmCisgICAgICAgICAgICBzdGF0ZSA9PSBCbHVldG9vdGhJbnB1dERldmljZS5TVEFURV9DT05ORUNUSU5HIHx8CisgICAgICAgICAgICBzdGF0ZSA9PSBCbHVldG9vdGhJbnB1dERldmljZS5TVEFURV9DT05ORUNURUQpIHsKKyAgICAgICAgICAgIC8vIFdlIGhhdmUgY29ubmVjdGVkIG9yIGF0dGVtcHRpbmcgdG8gY29ubmVjdC4KKyAgICAgICAgICAgIC8vIEJ1bXAgcHJpb3JpdHkKKyAgICAgICAgICAgIHNldElucHV0RGV2aWNlUHJpb3JpdHkoZGV2aWNlLCBCbHVldG9vdGhJbnB1dERldmljZS5QUklPUklUWV9BVVRPX0NPTk5FQ1QpOworICAgICAgICB9CisKKyAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoQmx1ZXRvb3RoSW5wdXREZXZpY2UuQUNUSU9OX0lOUFVUX0RFVklDRV9TVEFURV9DSEFOR0VEKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKEJsdWV0b290aERldmljZS5FWFRSQV9ERVZJQ0UsIGRldmljZSk7CisgICAgICAgIGludGVudC5wdXRFeHRyYShCbHVldG9vdGhJbnB1dERldmljZS5FWFRSQV9QUkVWSU9VU19JTlBVVF9ERVZJQ0VfU1RBVEUsIHByZXZTdGF0ZSk7CisgICAgICAgIGludGVudC5wdXRFeHRyYShCbHVldG9vdGhJbnB1dERldmljZS5FWFRSQV9JTlBVVF9ERVZJQ0VfU1RBVEUsIHN0YXRlKTsKKyAgICAgICAgbUNvbnRleHQuc2VuZEJyb2FkY2FzdChpbnRlbnQsIEJMVUVUT09USF9QRVJNKTsKKworICAgICAgICBpZiAoREJHKSBsb2coIklucHV0RGV2aWNlIHN0YXRlIDogZGV2aWNlOiAiICsgZGV2aWNlICsgIiBTdGF0ZToiICsgcHJldlN0YXRlICsgIi0+IiArIHN0YXRlKTsKKworICAgIH0KKworICAgIC8qcGFja2FnZSovIHZvaWQgaGFuZGxlSW5wdXREZXZpY2VQcm9wZXJ0eUNoYW5nZShTdHJpbmcgYWRkcmVzcywgYm9vbGVhbiBjb25uZWN0ZWQpIHsKKyAgICAgICAgaW50IHN0YXRlID0gY29ubmVjdGVkID8gQmx1ZXRvb3RoSW5wdXREZXZpY2UuU1RBVEVfQ09OTkVDVEVEIDoKKyAgICAgICAgICAgIEJsdWV0b290aElucHV0RGV2aWNlLlNUQVRFX0RJU0NPTk5FQ1RFRDsKKyAgICAgICAgQmx1ZXRvb3RoRGV2aWNlIGRldmljZSA9IG1BZGFwdGVyLmdldFJlbW90ZURldmljZShhZGRyZXNzKTsKKyAgICAgICAgaGFuZGxlSW5wdXREZXZpY2VTdGF0ZUNoYW5nZShkZXZpY2UsIHN0YXRlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2V0SW5pdGlhbElucHV0RGV2aWNlUHJpb3JpdHkoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW50IHN0YXRlKSB7CisgICAgICAgIHN3aXRjaCAoc3RhdGUpIHsKKyAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoRGV2aWNlLkJPTkRfQk9OREVEOgorICAgICAgICAgICAgICAgIGlmIChnZXRJbnB1dERldmljZVByaW9yaXR5KGRldmljZSkgPT0gQmx1ZXRvb3RoSW5wdXREZXZpY2UuUFJJT1JJVFlfVU5ERUZJTkVEKSB7CisgICAgICAgICAgICAgICAgICAgIHNldElucHV0RGV2aWNlUHJpb3JpdHkoZGV2aWNlLCBCbHVldG9vdGhJbnB1dERldmljZS5QUklPUklUWV9PTik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhEZXZpY2UuQk9ORF9OT05FOgorICAgICAgICAgICAgICAgIHNldElucHV0RGV2aWNlUHJpb3JpdHkoZGV2aWNlLCBCbHVldG9vdGhJbnB1dERldmljZS5QUklPUklUWV9VTkRFRklORUQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCiAgICAgLypwYWNrYWdlKi8gYm9vbGVhbiBpc1JlbW90ZURldmljZUluQ2FjaGUoU3RyaW5nIGFkZHJlc3MpIHsKICAgICAgICAgcmV0dXJuIChtRGV2aWNlUHJvcGVydGllcy5nZXQoYWRkcmVzcykgIT0gbnVsbCk7CiAgICAgfQpAQCAtMTI0Miw3ICsxNjQzLDcgQEAKICAgICAgICAgICAgIGlmICh1cGRhdGVSZW1vdGVEZXZpY2VQcm9wZXJ0aWVzQ2FjaGUoYWRkcmVzcykpCiAgICAgICAgICAgICAgICAgcmV0dXJuIGdldFJlbW90ZURldmljZVByb3BlcnR5KGFkZHJlc3MsIHByb3BlcnR5KTsKICAgICAgICAgfQotICAgICAgICBMb2cuZShUQUcsICJnZXRSZW1vdGVEZXZpY2VQcm9wZXJ0eTogIiArIHByb3BlcnR5ICsgIm5vdCBwcmVzZW50OiIgKyBhZGRyZXNzKTsKKyAgICAgICAgTG9nLmUoVEFHLCAiZ2V0UmVtb3RlRGV2aWNlUHJvcGVydHk6ICIgKyBwcm9wZXJ0eSArICIgbm90IHByZXNlbnQ6ICIgKyBhZGRyZXNzKTsKICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQogCkBAIC0yMTAzLDQgKzI1MDQsMTAgQEAKICAgICAgICAgICAgIHNob3J0IGNoYW5uZWwpOwogICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gcmVtb3ZlU2VydmljZVJlY29yZE5hdGl2ZShpbnQgaGFuZGxlKTsKICAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuIHNldExpbmtUaW1lb3V0TmF0aXZlKFN0cmluZyBwYXRoLCBpbnQgbnVtX3Nsb3RzKTsKKyAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuIGNvbm5lY3RJbnB1dERldmljZU5hdGl2ZShTdHJpbmcgcGF0aCk7CisgICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiBkaXNjb25uZWN0SW5wdXREZXZpY2VOYXRpdmUoU3RyaW5nIHBhdGgpOworCisgICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiBzZXRCbHVldG9vdGhUZXRoZXJpbmdOYXRpdmUoYm9vbGVhbiB2YWx1ZSwgU3RyaW5nIG5hcCwgU3RyaW5nIGJyaWRnZSk7CisgICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiBjb25uZWN0UGFuRGV2aWNlTmF0aXZlKFN0cmluZyBwYXRoLCBTdHJpbmcgc3JjUm9sZSwgU3RyaW5nIGRzdFJvbGUpOworICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gZGlzY29ubmVjdFBhbkRldmljZU5hdGl2ZShTdHJpbmcgcGF0aCk7CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L0FuZHJvaWRCaWRpLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L0FuZHJvaWRCaWRpLmphdmEKaW5kZXggZTRmOTM0ZS4uZWFjZDQwZCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9BbmRyb2lkQmlkaS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvQW5kcm9pZEJpZGkuamF2YQpAQCAtMTYsNiArMTYsOCBAQAogCiBwYWNrYWdlIGFuZHJvaWQudGV4dDsKIAoraW1wb3J0IGFuZHJvaWQudGV4dC5MYXlvdXQuRGlyZWN0aW9uczsKKwogLyoqCiAgKiBBY2Nlc3MgdGhlIElDVSBiaWRpIGltcGxlbWVudGF0aW9uLgogICogQGhpZGUKQEAgLTQ0LDUgKzQ2LDEzMiBAQAogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KIAorICAgIC8qKgorICAgICAqIFJldHVybnMgcnVuIGRpcmVjdGlvbiBpbmZvcm1hdGlvbiBmb3IgYSBsaW5lIHdpdGhpbiBhIHBhcmFncmFwaC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkaXIgYmFzZSBsaW5lIGRpcmVjdGlvbiwgZWl0aGVyIExheW91dC5ESVJfTEVGVF9UT19SSUdIVCBvcgorICAgICAqICAgICBMYXlvdXQuRElSX1JJR0hUX1RPX0xFRlQKKyAgICAgKiBAcGFyYW0gbGV2ZWxzIGxldmVscyBhcyByZXR1cm5lZCBmcm9tIHtAbGluayAjYmlkaX0KKyAgICAgKiBAcGFyYW0gbHN0YXJ0IHN0YXJ0IG9mIHRoZSBsaW5lIGluIHRoZSBsZXZlbHMgYXJyYXkKKyAgICAgKiBAcGFyYW0gY2hhcnMgdGhlIGNoYXJhY3RlciBhcnJheSAodXNlZCB0byBkZXRlcm1pbmUgd2hpdGVzcGFjZSkKKyAgICAgKiBAcGFyYW0gY3N0YXJ0IHRoZSBzdGFydCBvZiB0aGUgbGluZSBpbiB0aGUgY2hhcnMgYXJyYXkKKyAgICAgKiBAcGFyYW0gbGVuIHRoZSBsZW5ndGggb2YgdGhlIGxpbmUKKyAgICAgKiBAcmV0dXJuIHRoZSBkaXJlY3Rpb25zCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBEaXJlY3Rpb25zIGRpcmVjdGlvbnMoaW50IGRpciwgYnl0ZVtdIGxldmVscywgaW50IGxzdGFydCwKKyAgICAgICAgICAgIGNoYXJbXSBjaGFycywgaW50IGNzdGFydCwgaW50IGxlbikgeworCisgICAgICAgIGludCBiYXNlTGV2ZWwgPSBkaXIgPT0gTGF5b3V0LkRJUl9MRUZUX1RPX1JJR0hUID8gMCA6IDE7CisgICAgICAgIGludCBjdXJMZXZlbCA9IGxldmVsc1tsc3RhcnRdOworICAgICAgICBpbnQgbWluTGV2ZWwgPSBjdXJMZXZlbDsKKyAgICAgICAgaW50IHJ1bkNvdW50ID0gMTsKKyAgICAgICAgZm9yIChpbnQgaSA9IGxzdGFydCArIDEsIGUgPSBsc3RhcnQgKyBsZW47IGkgPCBlOyArK2kpIHsKKyAgICAgICAgICAgIGludCBsZXZlbCA9IGxldmVsc1tpXTsKKyAgICAgICAgICAgIGlmIChsZXZlbCAhPSBjdXJMZXZlbCkgeworICAgICAgICAgICAgICAgIGN1ckxldmVsID0gbGV2ZWw7CisgICAgICAgICAgICAgICAgKytydW5Db3VudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIGFkZCBmaW5hbCBydW4gZm9yIHRyYWlsaW5nIGNvdW50ZXItZGlyZWN0aW9uYWwgd2hpdGVzcGFjZQorICAgICAgICBpbnQgdmlzTGVuID0gbGVuOworICAgICAgICBpZiAoKGN1ckxldmVsICYgMSkgIT0gKGJhc2VMZXZlbCAmIDEpKSB7CisgICAgICAgICAgICAvLyBsb29rIGZvciB2aXNpYmxlIGVuZAorICAgICAgICAgICAgd2hpbGUgKC0tdmlzTGVuID49IDApIHsKKyAgICAgICAgICAgICAgICBjaGFyIGNoID0gY2hhcnNbY3N0YXJ0ICsgdmlzTGVuXTsKKworICAgICAgICAgICAgICAgIGlmIChjaCA9PSAnXG4nKSB7CisgICAgICAgICAgICAgICAgICAgIC0tdmlzTGVuOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoY2ggIT0gJyAnICYmIGNoICE9ICdcdCcpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgKyt2aXNMZW47CisgICAgICAgICAgICBpZiAodmlzTGVuICE9IGxlbikgeworICAgICAgICAgICAgICAgICsrcnVuQ291bnQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAocnVuQ291bnQgPT0gMSAmJiBtaW5MZXZlbCA9PSBiYXNlTGV2ZWwpIHsKKyAgICAgICAgICAgIC8vIHdlJ3JlIGRvbmUsIG9ubHkgb25lIHJ1biBvbiB0aGlzIGxpbmUKKyAgICAgICAgICAgIGlmICgobWluTGV2ZWwgJiAxKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIExheW91dC5ESVJTX0FMTF9SSUdIVF9UT19MRUZUOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIExheW91dC5ESVJTX0FMTF9MRUZUX1RPX1JJR0hUOworICAgICAgICB9CisKKyAgICAgICAgaW50W10gbGQgPSBuZXcgaW50W3J1bkNvdW50ICogMl07CisgICAgICAgIGludCBtYXhMZXZlbCA9IG1pbkxldmVsOworICAgICAgICBpbnQgbGV2ZWxCaXRzID0gbWluTGV2ZWwgPDwgTGF5b3V0LlJVTl9MRVZFTF9TSElGVDsKKyAgICAgICAgeworICAgICAgICAgICAgLy8gU3RhcnQgb2YgZmlyc3QgcGFpciBpcyBhbHdheXMgMCwgd2Ugd3JpdGUKKyAgICAgICAgICAgIC8vIGxlbmd0aCB0aGVuIHN0YXJ0IGF0IGVhY2ggbmV3IHJ1biwgYW5kIHRoZQorICAgICAgICAgICAgLy8gbGFzdCBydW4gbGVuZ3RoIGFmdGVyIHdlJ3JlIGRvbmUuCisgICAgICAgICAgICBpbnQgbiA9IDE7CisgICAgICAgICAgICBpbnQgcHJldiA9IGxzdGFydDsKKyAgICAgICAgICAgIGN1ckxldmVsID0gbWluTGV2ZWw7CisgICAgICAgICAgICBmb3IgKGludCBpID0gbHN0YXJ0LCBlID0gbHN0YXJ0ICsgdmlzTGVuOyBpIDwgZTsgKytpKSB7CisgICAgICAgICAgICAgICAgaW50IGxldmVsID0gbGV2ZWxzW2ldOworICAgICAgICAgICAgICAgIGlmIChsZXZlbCAhPSBjdXJMZXZlbCkgeworICAgICAgICAgICAgICAgICAgICBjdXJMZXZlbCA9IGxldmVsOworICAgICAgICAgICAgICAgICAgICBpZiAobGV2ZWwgPiBtYXhMZXZlbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbWF4TGV2ZWwgPSBsZXZlbDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChsZXZlbCA8IG1pbkxldmVsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtaW5MZXZlbCA9IGxldmVsOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIFhYWCBpZ25vcmUgcnVuIGxlbmd0aCBsaW1pdCBvZiAyXlJVTl9MRVZFTF9TSElGVAorICAgICAgICAgICAgICAgICAgICBsZFtuKytdID0gKGkgLSBwcmV2KSB8IGxldmVsQml0czsKKyAgICAgICAgICAgICAgICAgICAgbGRbbisrXSA9IGkgLSBsc3RhcnQ7CisgICAgICAgICAgICAgICAgICAgIGxldmVsQml0cyA9IGN1ckxldmVsIDw8IExheW91dC5SVU5fTEVWRUxfU0hJRlQ7CisgICAgICAgICAgICAgICAgICAgIHByZXYgPSBpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxkW25dID0gKGxzdGFydCArIHZpc0xlbiAtIHByZXYpIHwgbGV2ZWxCaXRzOworICAgICAgICAgICAgaWYgKHZpc0xlbiA8IGxlbikgeworICAgICAgICAgICAgICAgIGxkWysrbl0gPSB2aXNMZW47CisgICAgICAgICAgICAgICAgbGRbKytuXSA9IChsZW4gLSB2aXNMZW4pIHwgKGJhc2VMZXZlbCA8PCBMYXlvdXQuUlVOX0xFVkVMX1NISUZUKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFNlZSBpZiB3ZSBuZWVkIHRvIHN3YXAgYW55IHJ1bnMuCisgICAgICAgIC8vIElmIHRoZSBtaW4gbGV2ZWwgcnVuIGRpcmVjdGlvbiBkb2Vzbid0IG1hdGNoIHRoZSBiYXNlCisgICAgICAgIC8vIGRpcmVjdGlvbiwgd2UgYWx3YXlzIG5lZWQgdG8gc3dhcCAoYXQgdGhpcyBwb2ludAorICAgICAgICAvLyB3ZSBoYXZlIG1vcmUgdGhhbiBvbmUgcnVuKS4KKyAgICAgICAgLy8gT3RoZXJ3aXNlLCB3ZSBkb24ndCBuZWVkIHRvIHN3YXAgdGhlIGxvd2VzdCBsZXZlbC4KKyAgICAgICAgLy8gU2luY2UgdGhlcmUgYXJlIG5vIGxvZ2ljYWxseSBhZGphY2VudCBydW5zIGF0IHRoZSBzYW1lCisgICAgICAgIC8vIGxldmVsLCBpZiB0aGUgbWF4IGxldmVsIGlzIHRoZSBzYW1lIGFzIHRoZSAobmV3KSBtaW4KKyAgICAgICAgLy8gbGV2ZWwsIHdlIGhhdmUgYSBzZXJpZXMgb2YgYWx0ZXJuYXRpbmcgbGV2ZWxzIHRoYXQKKyAgICAgICAgLy8gaXMgYWxyZWFkeSBpbiBvcmRlciwgc28gdGhlcmUncyBubyBtb3JlIHRvIGRvLgorICAgICAgICAvLworICAgICAgICBib29sZWFuIHN3YXA7CisgICAgICAgIGlmICgobWluTGV2ZWwgJiAxKSA9PSBiYXNlTGV2ZWwpIHsKKyAgICAgICAgICAgIG1pbkxldmVsICs9IDE7CisgICAgICAgICAgICBzd2FwID0gbWF4TGV2ZWwgPiBtaW5MZXZlbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN3YXAgPSBydW5Db3VudCA+IDE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN3YXApIHsKKyAgICAgICAgICAgIGZvciAoaW50IGxldmVsID0gbWF4TGV2ZWwgLSAxOyBsZXZlbCA+PSBtaW5MZXZlbDsgLS1sZXZlbCkgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGQubGVuZ3RoOyBpICs9IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxldmVsc1tsZFtpXV0gPj0gbGV2ZWwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBlID0gaSArIDI7CisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoZSA8IGxkLmxlbmd0aCAmJiBsZXZlbHNbbGRbZV1dID49IGxldmVsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSArPSAyOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgbG93ID0gaSwgaGkgPSBlIC0gMjsgbG93IDwgaGk7IGxvdyArPSAyLCBoaSAtPSAyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHggPSBsZFtsb3ddOyBsZFtsb3ddID0gbGRbaGldOyBsZFtoaV0gPSB4OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHggPSBsZFtsb3crMV07IGxkW2xvdysxXSA9IGxkW2hpKzFdOyBsZFtoaSsxXSA9IHg7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpID0gZSArIDI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBEaXJlY3Rpb25zKGxkKTsKKyAgICB9CisKICAgICBwcml2YXRlIG5hdGl2ZSBzdGF0aWMgaW50IHJ1bkJpZGkoaW50IGRpciwgY2hhcltdIGNocywgYnl0ZVtdIGNoSW5mbywgaW50IG4sIGJvb2xlYW4gaGF2ZUluZm8pOwogfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvQm9yaW5nTGF5b3V0LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L0JvcmluZ0xheW91dC5qYXZhCmluZGV4IDk0NGY3MzUuLjkzMDliMDUgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvQm9yaW5nTGF5b3V0LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9Cb3JpbmdMYXlvdXQuamF2YQpAQCAtMjA4LDExICsyMDgsMTEgQEAKICAgICAgICAgICAgICAqIHdpZHRoIGJlY2F1c2UgdGhlIHdpZHRoIHRoYXQgd2FzIHBhc3NlZCBpbiB3YXMgZm9yIHRoZQogICAgICAgICAgICAgICogZnVsbCB0ZXh0LCBub3QgdGhlIGVsbGlwc2l6ZWQgZm9ybS4KICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgc3luY2hyb25pemVkIChzVGVtcCkgewotICAgICAgICAgICAgICAgIG1NYXggPSAoaW50KSAoRmxvYXRNYXRoLmNlaWwoU3R5bGVkLm1lYXN1cmVUZXh0KHBhaW50LCBzVGVtcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZSwgMCwgc291cmNlLmxlbmd0aCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCkpKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFRleHRMaW5lIGxpbmUgPSBUZXh0TGluZS5vYnRhaW4oKTsKKyAgICAgICAgICAgIGxpbmUuc2V0KHBhaW50LCBzb3VyY2UsIDAsIHNvdXJjZS5sZW5ndGgoKSwgTGF5b3V0LkRJUl9MRUZUX1RPX1JJR0hULAorICAgICAgICAgICAgICAgICAgICBMYXlvdXQuRElSU19BTExfTEVGVF9UT19SSUdIVCwgZmFsc2UsIG51bGwpOworICAgICAgICAgICAgbU1heCA9IChpbnQpIEZsb2F0TWF0aC5jZWlsKGxpbmUubWV0cmljcyhudWxsKSk7CisgICAgICAgICAgICBUZXh0TGluZS5yZWN5Y2xlKGxpbmUpOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKGluY2x1ZGVwYWQpIHsKQEAgLTI3NiwxNCArMjc2LDEzIEBACiAgICAgICAgICAgICBpZiAoZm0gPT0gbnVsbCkgewogICAgICAgICAgICAgICAgIGZtID0gbmV3IE1ldHJpY3MoKTsKICAgICAgICAgICAgIH0KLSAgICAKLSAgICAgICAgICAgIGludCB3aWQ7CiAKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAoc1RlbXApIHsKLSAgICAgICAgICAgICAgICB3aWQgPSAoaW50KSAoRmxvYXRNYXRoLmNlaWwoU3R5bGVkLm1lYXN1cmVUZXh0KHBhaW50LCBzVGVtcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQsIDAsIHRleHQubGVuZ3RoKCksIGZtKSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm0ud2lkdGggPSB3aWQ7CisgICAgICAgICAgICBUZXh0TGluZSBsaW5lID0gVGV4dExpbmUub2J0YWluKCk7CisgICAgICAgICAgICBsaW5lLnNldChwYWludCwgdGV4dCwgMCwgdGV4dC5sZW5ndGgoKSwgTGF5b3V0LkRJUl9MRUZUX1RPX1JJR0hULAorICAgICAgICAgICAgICAgICAgICBMYXlvdXQuRElSU19BTExfTEVGVF9UT19SSUdIVCwgZmFsc2UsIG51bGwpOworICAgICAgICAgICAgZm0ud2lkdGggPSAoaW50KSBGbG9hdE1hdGguY2VpbChsaW5lLm1ldHJpY3MoZm0pKTsKKyAgICAgICAgICAgIFRleHRMaW5lLnJlY3ljbGUobGluZSk7CisKICAgICAgICAgICAgIHJldHVybiBmbTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHJldHVybiBudWxsOwpAQCAtMzg5LDcgKzM4OCw3IEBACiAKICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE1ldHJpY3MgZXh0ZW5kcyBQYWludC5Gb250TWV0cmljc0ludCB7CiAgICAgICAgIHB1YmxpYyBpbnQgd2lkdGg7Ci0gICAgICAgIAorCiAgICAgICAgIEBPdmVycmlkZSBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgICAgICAgICAgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCkgKyAiIHdpZHRoPSIgKyB3aWR0aDsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9DbGlwYm9hcmRNYW5hZ2VyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L0NsaXBib2FyZE1hbmFnZXIuamF2YQppbmRleCA1MjAzOWFmLi4wYjIzOWNmIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L0NsaXBib2FyZE1hbmFnZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L0NsaXBib2FyZE1hbmFnZXIuamF2YQpAQCAtMTYsNzMgKzE2LDI2IEBACiAKIHBhY2thZ2UgYW5kcm9pZC50ZXh0OwogCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247Ci1pbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwotaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKLWltcG9ydCBhbmRyb2lkLm9zLlNlcnZpY2VNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KIC8qKgotICogSW50ZXJmYWNlIHRvIHRoZSBjbGlwYm9hcmQgc2VydmljZSwgZm9yIHBsYWNpbmcgYW5kIHJldHJpZXZpbmcgdGV4dCBpbgotICogdGhlIGdsb2JhbCBjbGlwYm9hcmQuCi0gKgotICogPHA+Ci0gKiBZb3UgZG8gbm90IGluc3RhbnRpYXRlIHRoaXMgY2xhc3MgZGlyZWN0bHk7IGluc3RlYWQsIHJldHJpZXZlIGl0IHRocm91Z2gKLSAqIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCNnZXRTeXN0ZW1TZXJ2aWNlfS4KLSAqCi0gKiBAc2VlIGFuZHJvaWQuY29udGVudC5Db250ZXh0I2dldFN5c3RlbVNlcnZpY2UKKyAqIEBkZXByZWNhdGVkIE9sZCB0ZXh0LW9ubHkgaW50ZXJhY2UgdG8gdGhlIGNsaXBib2FyZC4gIFNlZQorICoge0BsaW5rIGFuZHJvaWQuY29udGVudC5DbGlwYm9hcmRNYW5hZ2VyfSBmb3IgdGhlIG1vZGVybiBBUEkuCiAgKi8KLXB1YmxpYyBjbGFzcyBDbGlwYm9hcmRNYW5hZ2VyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBJQ2xpcGJvYXJkIHNTZXJ2aWNlOwotCi0gICAgcHJpdmF0ZSBDb250ZXh0IG1Db250ZXh0OwotCi0gICAgc3RhdGljIHByaXZhdGUgSUNsaXBib2FyZCBnZXRTZXJ2aWNlKCkgewotICAgICAgICBpZiAoc1NlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHNTZXJ2aWNlOwotICAgICAgICB9Ci0gICAgICAgIElCaW5kZXIgYiA9IFNlcnZpY2VNYW5hZ2VyLmdldFNlcnZpY2UoImNsaXBib2FyZCIpOwotICAgICAgICBzU2VydmljZSA9IElDbGlwYm9hcmQuU3R1Yi5hc0ludGVyZmFjZShiKTsKLSAgICAgICAgcmV0dXJuIHNTZXJ2aWNlOwotICAgIH0KLQotICAgIC8qKiB7QGhpZGV9ICovCi0gICAgcHVibGljIENsaXBib2FyZE1hbmFnZXIoQ29udGV4dCBjb250ZXh0LCBIYW5kbGVyIGhhbmRsZXIpIHsKLSAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OwotICAgIH0KLQorQERlcHJlY2F0ZWQKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBDbGlwYm9hcmRNYW5hZ2VyIHsKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSB0ZXh0IG9uIHRoZSBjbGlwYm9hcmQuICBJdCB3aWxsIGV2ZW50dWFsbHkgYmUgcG9zc2libGUKICAgICAgKiB0byBzdG9yZSB0eXBlcyBvdGhlciB0aGFuIHRleHQgdG9vLCBpbiB3aGljaCBjYXNlIHRoaXMgd2lsbCByZXR1cm4KICAgICAgKiBudWxsIGlmIHRoZSB0eXBlIGNhbm5vdCBiZSBjb2VyY2VkIHRvIHRleHQuCiAgICAgICovCi0gICAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXRUZXh0KCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIGdldFNlcnZpY2UoKS5nZXRDbGlwYm9hcmRUZXh0KCk7Ci0gICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KKyAgICBwdWJsaWMgYWJzdHJhY3QgQ2hhclNlcXVlbmNlIGdldFRleHQoKTsKIAogICAgIC8qKgogICAgICAqIFNldHMgdGhlIGNvbnRlbnRzIG9mIHRoZSBjbGlwYm9hcmQgdG8gdGhlIHNwZWNpZmllZCB0ZXh0LgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFRleHQoQ2hhclNlcXVlbmNlIHRleHQpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGdldFNlcnZpY2UoKS5zZXRDbGlwYm9hcmRUZXh0KHRleHQpOwotICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICB9Ci0gICAgfQorICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFRleHQoQ2hhclNlcXVlbmNlIHRleHQpOwogCiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBjbGlwYm9hcmQgY29udGFpbnMgdGV4dDsgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGhhc1RleHQoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0U2VydmljZSgpLmhhc0NsaXBib2FyZFRleHQoKTsKLSAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KKyAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBoYXNUZXh0KCk7CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L0R5bmFtaWNMYXlvdXQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvRHluYW1pY0xheW91dC5qYXZhCmluZGV4IDE0ZTU2NTUuLmI2YWEwM2EgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvRHluYW1pY0xheW91dC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvRHluYW1pY0xheW91dC5qYXZhCkBAIC0zMTAsNyArMzEwLDYgQEAKIAogICAgICAgICBEaXJlY3Rpb25zW10gb2JqZWN0cyA9IG5ldyBEaXJlY3Rpb25zWzFdOwogCi0KICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKICAgICAgICAgICAgIGludHNbU1RBUlRdID0gcmVmbG93ZWQuZ2V0TGluZVN0YXJ0KGkpIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlZmxvd2VkLmdldFBhcmFncmFwaERpcmVjdGlvbihpKSA8PCBESVJfU0hJRlQpIHwKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvR3JhcGhpY3NPcGVyYXRpb25zLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L0dyYXBoaWNzT3BlcmF0aW9ucy5qYXZhCmluZGV4IGMzYmQwYWUuLmQ0MjZkMTI0IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L0dyYXBoaWNzT3BlcmF0aW9ucy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvR3JhcGhpY3NPcGVyYXRpb25zLmphdmEKQEAgLTM0LDEzICszNCwzMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHgsIGZsb2F0IHksIFBhaW50IHApOwogCiAgICAgLyoqCisgICAgICogSnVzdCBsaWtlIHtAbGluayBDYW52YXMjZHJhd1RleHRSdW59LgorICAgICAqIHtAaGlkZX0KKyAgICAgKi8KKyAgICB2b2lkIGRyYXdUZXh0UnVuKENhbnZhcyBjLCBpbnQgc3RhcnQsIGludCBlbmQsIGludCBjb250ZXh0U3RhcnQsIGludCBjb250ZXh0RW5kLAorICAgICAgICAgICAgZmxvYXQgeCwgZmxvYXQgeSwgaW50IGZsYWdzLCBQYWludCBwKTsKKworICAgLyoqCiAgICAgICogSnVzdCBsaWtlIHtAbGluayBQYWludCNtZWFzdXJlVGV4dH0uCiAgICAgICovCiAgICAgZmxvYXQgbWVhc3VyZVRleHQoaW50IHN0YXJ0LCBpbnQgZW5kLCBQYWludCBwKTsKIAotCiAgICAgLyoqCiAgICAgICogSnVzdCBsaWtlIHtAbGluayBQYWludCNnZXRUZXh0V2lkdGhzfS4KICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldFRleHRXaWR0aHMoaW50IHN0YXJ0LCBpbnQgZW5kLCBmbG9hdFtdIHdpZHRocywgUGFpbnQgcCk7CisKKyAgICAvKioKKyAgICAgKiBKdXN0IGxpa2Uge0BsaW5rIFBhaW50I2dldFRleHRSdW5BZHZhbmNlc30uCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBmbG9hdCBnZXRUZXh0UnVuQWR2YW5jZXMoaW50IHN0YXJ0LCBpbnQgZW5kLCBpbnQgY29udGV4dFN0YXJ0LCBpbnQgY29udGV4dEVuZCwKKyAgICAgICAgICAgIGludCBmbGFncywgZmxvYXRbXSBhZHZhbmNlcywgaW50IGFkdmFuY2VzSW5kZXgsIFBhaW50IHBhaW50KTsKKworICAgIC8qKgorICAgICAqIEp1c3QgbGlrZSB7QGxpbmsgUGFpbnQjZ2V0VGV4dFJ1bkN1cnNvcn0uCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBpbnQgZ2V0VGV4dFJ1bkN1cnNvcihpbnQgY29udGV4dFN0YXJ0LCBpbnQgY29udGV4dEVuZCwgaW50IGZsYWdzLCBpbnQgb2Zmc2V0LAorICAgICAgICAgICAgaW50IGN1cnNvck9wdCwgUGFpbnQgcCk7CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L0lDbGlwYm9hcmQuYWlkbCBiL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvSUNsaXBib2FyZC5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZGViNWM4Li4wMDAwMDAwCi0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvSUNsaXBib2FyZC5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQudGV4dDsKLQotLyoqCi0gKiBQcm9ncmFtbWluZyBpbnRlcmZhY2UgdG8gdGhlIGNsaXBib2FyZCwgd2hpY2ggYWxsb3dzIGNvcHlpbmcgYW5kIHBhc3RpbmcKLSAqIGJldHdlZW4gYXBwbGljYXRpb25zLgotICoge0BoaWRlfQotICovCi1pbnRlcmZhY2UgSUNsaXBib2FyZCB7Ci0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdGV4dCBvbiB0aGUgY2xpcGJvYXJkLiAgSXQgd2lsbCBldmVudHVhbGx5IGJlIHBvc3NpYmxlCi0gICAgICogdG8gc3RvcmUgdHlwZXMgb3RoZXIgdGhhbiB0ZXh0IHRvbywgaW4gd2hpY2ggY2FzZSB0aGlzIHdpbGwgcmV0dXJuCi0gICAgICogbnVsbCBpZiB0aGUgdHlwZSBjYW5ub3QgYmUgY29lcmNlZCB0byB0ZXh0LgotICAgICAqLwotICAgIENoYXJTZXF1ZW5jZSBnZXRDbGlwYm9hcmRUZXh0KCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBjb250ZW50cyBvZiB0aGUgY2xpcGJvYXJkIHRvIHRoZSBzcGVjaWZpZWQgdGV4dC4KLSAgICAgKi8KLSAgICB2b2lkIHNldENsaXBib2FyZFRleHQoQ2hhclNlcXVlbmNlIHRleHQpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBjbGlwYm9hcmQgY29udGFpbnMgdGV4dDsgZmFsc2Ugb3RoZXJ3aXNlLgotICAgICAqLwotICAgIGJvb2xlYW4gaGFzQ2xpcGJvYXJkVGV4dCgpOwotfQotCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L0xheW91dC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9MYXlvdXQuamF2YQppbmRleCAzOGFjOWI3Li41NGFjOTA2IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L0xheW91dC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvTGF5b3V0LmphdmEKQEAgLTE2LDI5ICsxNiwzMyBAQAogCiBwYWNrYWdlIGFuZHJvaWQudGV4dDsKIAotaW1wb3J0IGFuZHJvaWQuZW1vamkuRW1vamlGYWN0b3J5OwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdEY7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYXRoOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnV0aWwuQXJyYXlVdGlsczsKIAotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLio7CitpbXBvcnQgYW5kcm9pZC5lbW9qaS5FbW9qaUZhY3Rvcnk7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhdGg7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OwogaW1wb3J0IGFuZHJvaWQudGV4dC5tZXRob2QuVGV4dEtleUxpc3RlbmVyOworaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5BbGlnbm1lbnRTcGFuOworaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5MZWFkaW5nTWFyZ2luU3BhbjsKK2ltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuTGluZUJhY2tncm91bmRTcGFuOworaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5QYXJhZ3JhcGhTdHlsZTsKK2ltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuUmVwbGFjZW1lbnRTcGFuOworaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5UYWJTdG9wU3BhbjsKK2ltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuTGVhZGluZ01hcmdpblNwYW4uTGVhZGluZ01hcmdpblNwYW4yOwogaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKIAoraW1wb3J0IGphdmEudXRpbC5BcnJheXM7CisKIC8qKgotICogQSBiYXNlIGNsYXNzIHRoYXQgbWFuYWdlcyB0ZXh0IGxheW91dCBpbiB2aXN1YWwgZWxlbWVudHMgb24gCi0gKiB0aGUgc2NyZWVuLiAKLSAqIDxwPkZvciB0ZXh0IHRoYXQgd2lsbCBiZSBlZGl0ZWQsIHVzZSBhIHtAbGluayBEeW5hbWljTGF5b3V0fSwgCi0gKiB3aGljaCB3aWxsIGJlIHVwZGF0ZWQgYXMgdGhlIHRleHQgY2hhbmdlcy4gIAorICogQSBiYXNlIGNsYXNzIHRoYXQgbWFuYWdlcyB0ZXh0IGxheW91dCBpbiB2aXN1YWwgZWxlbWVudHMgb24KKyAqIHRoZSBzY3JlZW4uCisgKiA8cD5Gb3IgdGV4dCB0aGF0IHdpbGwgYmUgZWRpdGVkLCB1c2UgYSB7QGxpbmsgRHluYW1pY0xheW91dH0sCisgKiB3aGljaCB3aWxsIGJlIHVwZGF0ZWQgYXMgdGhlIHRleHQgY2hhbmdlcy4KICAqIEZvciB0ZXh0IHRoYXQgd2lsbCBub3QgY2hhbmdlLCB1c2UgYSB7QGxpbmsgU3RhdGljTGF5b3V0fS4KICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIExheW91dCB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IGZhbHNlOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhcmFncmFwaFN0eWxlW10gTk9fUEFSQV9TUEFOUyA9CiAgICAgICAgIEFycmF5VXRpbHMuZW1wdHlBcnJheShQYXJhZ3JhcGhTdHlsZS5jbGFzcyk7CiAKQEAgLTU0LDkgKzU4LDcgQEAKICAgICAgICAgICAgIE1JTl9FTU9KSSA9IC0xOwogICAgICAgICAgICAgTUFYX0VNT0pJID0gLTE7CiAgICAgICAgIH0KLSAgICB9OwotCi0gICAgcHJpdmF0ZSBSZWN0RiBtRW1vamlSZWN0OworICAgIH0KIAogICAgIC8qKgogICAgICAqIFJldHVybiBob3cgd2lkZSBhIGxheW91dCBtdXN0IGJlIGluIG9yZGVyIHRvIGRpc3BsYXkgdGhlCkBAIC02Niw3ICs2OCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGV4dFBhaW50IHBhaW50KSB7CiAgICAgICAgIHJldHVybiBnZXREZXNpcmVkV2lkdGgoc291cmNlLCAwLCBzb3VyY2UubGVuZ3RoKCksIHBhaW50KTsKICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBSZXR1cm4gaG93IHdpZGUgYSBsYXlvdXQgbXVzdCBiZSBpbiBvcmRlciB0byBkaXNwbGF5IHRoZQogICAgICAqIHNwZWNpZmllZCB0ZXh0IHNsaWNlIHdpdGggb25lIGxpbmUgcGVyIHBhcmFncmFwaC4KQEAgLTg1LDggKzg3LDcgQEAKICAgICAgICAgICAgICAgICBuZXh0ID0gZW5kOwogCiAgICAgICAgICAgICAvLyBub3RlLCBvbWl0cyB0cmFpbGluZyBwYXJhZ3JhcGggY2hhcgotICAgICAgICAgICAgZmxvYXQgdyA9IG1lYXN1cmVUZXh0KHBhaW50LCB3b3JrUGFpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlLCBpLCBuZXh0LCBudWxsLCB0cnVlLCBudWxsKTsKKyAgICAgICAgICAgIGZsb2F0IHcgPSBtZWFzdXJlUGFyYShwYWludCwgd29ya1BhaW50LCBzb3VyY2UsIGksIG5leHQpOwogCiAgICAgICAgICAgICBpZiAodyA+IG5lZWQpCiAgICAgICAgICAgICAgICAgbmVlZCA9IHc7CkBAIC0xMTYsNiArMTE3LDE1IEBACiAgICAgICAgIGlmICh3aWR0aCA8IDApCiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJMYXlvdXQ6ICIgKyB3aWR0aCArICIgPCAwIik7CiAKKyAgICAgICAgLy8gRW5zdXJlIHBhaW50IGRvZXNuJ3QgaGF2ZSBiYXNlbGluZVNoaWZ0IHNldC4KKyAgICAgICAgLy8gV2hpbGUgbm9ybWFsbHkgd2UgZG9uJ3QgbW9kaWZ5IHRoZSBwYWludCB0aGUgdXNlciBwYXNzZWQgaW4sCisgICAgICAgIC8vIHdlIHdlcmUgYWxyZWFkeSBkb2luZyB0aGlzIGluIFN0eWxlZC5kcmF3VW5pZm9ybVJ1biB3aXRoIGJvdGgKKyAgICAgICAgLy8gYmFzZWxpbmVTaGlmdCBhbmQgYmdDb2xvci4gIFdlIHByb2JhYmx5IHNob3VsZCByZWV2YWx1YXRlIGJnQ29sb3IuCisgICAgICAgIGlmIChwYWludCAhPSBudWxsKSB7CisgICAgICAgICAgICBwYWludC5iZ0NvbG9yID0gMDsKKyAgICAgICAgICAgIHBhaW50LmJhc2VsaW5lU2hpZnQgPSAwOworICAgICAgICB9CisKICAgICAgICAgbVRleHQgPSB0ZXh0OwogICAgICAgICBtUGFpbnQgPSBwYWludDsKICAgICAgICAgbVdvcmtQYWludCA9IG5ldyBUZXh0UGFpbnQoKTsKQEAgLTE3NSw3ICsxODUsNiBAQAogICAgICAgICAgICAgZGJvdHRvbSA9IHNUZW1wUmVjdC5ib3R0b207CiAgICAgICAgIH0KIAotCiAgICAgICAgIGludCB0b3AgPSAwOwogICAgICAgICBpbnQgYm90dG9tID0gZ2V0TGluZVRvcChnZXRMaW5lQ291bnQoKSk7CiAKQEAgLTE4NSwyNiArMTk0LDI4IEBACiAgICAgICAgIGlmIChkYm90dG9tIDwgYm90dG9tKSB7CiAgICAgICAgICAgICBib3R0b20gPSBkYm90dG9tOwogICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpbnQgZmlyc3QgPSBnZXRMaW5lRm9yVmVydGljYWwodG9wKTsgCisKKyAgICAgICAgaW50IGZpcnN0ID0gZ2V0TGluZUZvclZlcnRpY2FsKHRvcCk7CiAgICAgICAgIGludCBsYXN0ID0gZ2V0TGluZUZvclZlcnRpY2FsKGJvdHRvbSk7Ci0gICAgICAgIAorCiAgICAgICAgIGludCBwcmV2aW91c0xpbmVCb3R0b20gPSBnZXRMaW5lVG9wKGZpcnN0KTsKICAgICAgICAgaW50IHByZXZpb3VzTGluZUVuZCA9IGdldExpbmVTdGFydChmaXJzdCk7Ci0gICAgICAgIAorCiAgICAgICAgIFRleHRQYWludCBwYWludCA9IG1QYWludDsKICAgICAgICAgQ2hhclNlcXVlbmNlIGJ1ZiA9IG1UZXh0OwogICAgICAgICBpbnQgd2lkdGggPSBtV2lkdGg7CiAgICAgICAgIGJvb2xlYW4gc3Bhbm5lZFRleHQgPSBtU3Bhbm5lZFRleHQ7CiAKICAgICAgICAgUGFyYWdyYXBoU3R5bGVbXSBzcGFucyA9IE5PX1BBUkFfU1BBTlM7Ci0gICAgICAgIGludCBzcGFuZW5kID0gMDsKKyAgICAgICAgaW50IHNwYW5FbmQgPSAwOwogICAgICAgICBpbnQgdGV4dExlbmd0aCA9IDA7CiAKICAgICAgICAgLy8gRmlyc3QsIGRyYXcgTGluZUJhY2tncm91bmRTcGFucy4KLSAgICAgICAgLy8gTGluZUJhY2tncm91bmRTcGFucyBrbm93IG5vdGhpbmcgYWJvdXQgdGhlIGFsaWdubWVudCBvciBkaXJlY3Rpb24gb2YKLSAgICAgICAgLy8gdGhlIGxheW91dCBvciBsaW5lLiAgWFhYOiBTaG91bGQgdGhleT8KKyAgICAgICAgLy8gTGluZUJhY2tncm91bmRTcGFucyBrbm93IG5vdGhpbmcgYWJvdXQgdGhlIGFsaWdubWVudCwgbWFyZ2lucywgb3IKKyAgICAgICAgLy8gZGlyZWN0aW9uIG9mIHRoZSBsYXlvdXQgb3IgbGluZS4gIFhYWDogU2hvdWxkIHRoZXk/CisgICAgICAgIC8vIFRoZXkgYXJlIGV2YWx1YXRlZCBhdCBlYWNoIGxpbmUuCiAgICAgICAgIGlmIChzcGFubmVkVGV4dCkgeworICAgICAgICAgICAgU3Bhbm5lZCBzcCA9IChTcGFubmVkKSBidWY7CiAgICAgICAgICAgICB0ZXh0TGVuZ3RoID0gYnVmLmxlbmd0aCgpOwogICAgICAgICAgICAgZm9yIChpbnQgaSA9IGZpcnN0OyBpIDw9IGxhc3Q7IGkrKykgewogICAgICAgICAgICAgICAgIGludCBzdGFydCA9IHByZXZpb3VzTGluZUVuZDsKQEAgLTIxNiwxMiArMjI3LDE0IEBACiAgICAgICAgICAgICAgICAgcHJldmlvdXNMaW5lQm90dG9tID0gbGJvdHRvbTsKICAgICAgICAgICAgICAgICBpbnQgbGJhc2VsaW5lID0gbGJvdHRvbSAtIGdldExpbmVEZXNjZW50KGkpOwogCi0gICAgICAgICAgICAgICAgaWYgKHN0YXJ0ID49IHNwYW5lbmQpIHsKLSAgICAgICAgICAgICAgICAgICBTcGFubmVkIHNwID0gKFNwYW5uZWQpIGJ1ZjsKLSAgICAgICAgICAgICAgICAgICBzcGFuZW5kID0gc3AubmV4dFNwYW5UcmFuc2l0aW9uKHN0YXJ0LCB0ZXh0TGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGluZUJhY2tncm91bmRTcGFuLmNsYXNzKTsKLSAgICAgICAgICAgICAgICAgICBzcGFucyA9IHNwLmdldFNwYW5zKHN0YXJ0LCBzcGFuZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGluZUJhY2tncm91bmRTcGFuLmNsYXNzKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RhcnQgPj0gc3BhbkVuZCkgeworICAgICAgICAgICAgICAgICAgICAvLyBUaGVzZSBzaG91bGQgYmUgaW5mcmVxdWVudCwgc28gd2UnbGwgdXNlIHRoaXMgc28gdGhhdAorICAgICAgICAgICAgICAgICAgICAvLyB3ZSBkb24ndCBoYXZlIHRvIGNoZWNrIGFzIG9mdGVuLgorICAgICAgICAgICAgICAgICAgICBzcGFuRW5kID0gc3AubmV4dFNwYW5UcmFuc2l0aW9uKHN0YXJ0LCB0ZXh0TGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpbmVCYWNrZ3JvdW5kU3Bhbi5jbGFzcyk7CisgICAgICAgICAgICAgICAgICAgIC8vIEFsbCBMaW5lQmFja2dyb3VuZFNwYW5zIG9uIGEgbGluZSBjb250cmlidXRlIHRvIGl0cworICAgICAgICAgICAgICAgICAgICAvLyBiYWNrZ3JvdW5kLgorICAgICAgICAgICAgICAgICAgIHNwYW5zID0gZ2V0UGFyYWdyYXBoU3BhbnMoc3AsIHN0YXJ0LCBlbmQsIExpbmVCYWNrZ3JvdW5kU3Bhbi5jbGFzcyk7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgZm9yIChpbnQgbiA9IDA7IG4gPCBzcGFucy5sZW5ndGg7IG4rKykgewpAQCAtMjM0LDExICsyNDcsMTEgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyByZXNldCB0byB0aGVpciBvcmlnaW5hbCB2YWx1ZXMKLSAgICAgICAgICAgIHNwYW5lbmQgPSAwOworICAgICAgICAgICAgc3BhbkVuZCA9IDA7CiAgICAgICAgICAgICBwcmV2aW91c0xpbmVCb3R0b20gPSBnZXRMaW5lVG9wKGZpcnN0KTsKICAgICAgICAgICAgIHByZXZpb3VzTGluZUVuZCA9IGdldExpbmVTdGFydChmaXJzdCk7CiAgICAgICAgICAgICBzcGFucyA9IE5PX1BBUkFfU1BBTlM7Ci0gICAgICAgIH0gCisgICAgICAgIH0KIAogICAgICAgICAvLyBUaGVyZSBjYW4gYmUgYSBoaWdobGlnaHQgZXZlbiB3aXRob3V0IHNwYW5zIGlmIHdlIGFyZSBkcmF3aW5nCiAgICAgICAgIC8vIGEgbm9uLXNwYW5uZWQgdHJhbnNmb3JtYXRpb24gb2YgYSBzcGFubmVkIGVkaXRpbmcgYnVmZmVyLgpAQCAtMjU1LDcgKzI2OCwxMSBAQAogICAgICAgICB9CiAKICAgICAgICAgQWxpZ25tZW50IGFsaWduID0gbUFsaWdubWVudDsKLSAgICAgICAgCisgICAgICAgIFRhYlN0b3BzIHRhYlN0b3BzID0gbnVsbDsKKyAgICAgICAgYm9vbGVhbiB0YWJTdG9wc0lzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKworICAgICAgICBUZXh0TGluZSB0bCA9IFRleHRMaW5lLm9idGFpbigpOworCiAgICAgICAgIC8vIE5leHQgZHJhdyB0aGUgbGluZXMsIG9uZSBhdCBhIHRpbWUuCiAgICAgICAgIC8vIHRoZSBiYXNlbGluZSBpcyB0aGUgdG9wIG9mIHRoZSBmb2xsb3dpbmcgbGluZSBtaW51cyB0aGUgY3VycmVudAogICAgICAgICAvLyBsaW5lJ3MgZGVzY2VudC4KQEAgLTI3MCwxOSArMjg3LDMwIEBACiAgICAgICAgICAgICBwcmV2aW91c0xpbmVCb3R0b20gPSBsYm90dG9tOwogICAgICAgICAgICAgaW50IGxiYXNlbGluZSA9IGxib3R0b20gLSBnZXRMaW5lRGVzY2VudChpKTsKIAotICAgICAgICAgICAgYm9vbGVhbiBpc0ZpcnN0UGFyYUxpbmUgPSBmYWxzZTsKLSAgICAgICAgICAgIGlmIChzcGFubmVkVGV4dCkgeyAKLSAgICAgICAgICAgICAgICBpZiAoc3RhcnQgPT0gMCB8fCBidWYuY2hhckF0KHN0YXJ0IC0gMSkgPT0gJ1xuJykgewotICAgICAgICAgICAgICAgICAgICBpc0ZpcnN0UGFyYUxpbmUgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBOZXcgYmF0Y2ggb2YgcGFyYWdyYXBoIHN0eWxlcywgY29tcHV0ZSB0aGUgYWxpZ25tZW50LgotICAgICAgICAgICAgICAgIC8vIExhc3QgYWxpZ25tZW50IHN0eWxlIHdpbnMuCi0gICAgICAgICAgICAgICAgaWYgKHN0YXJ0ID49IHNwYW5lbmQpIHsKLSAgICAgICAgICAgICAgICAgICAgU3Bhbm5lZCBzcCA9IChTcGFubmVkKSBidWY7Ci0gICAgICAgICAgICAgICAgICAgIHNwYW5lbmQgPSBzcC5uZXh0U3BhblRyYW5zaXRpb24oc3RhcnQsIHRleHRMZW5ndGgsCisgICAgICAgICAgICBpbnQgZGlyID0gZ2V0UGFyYWdyYXBoRGlyZWN0aW9uKGkpOworICAgICAgICAgICAgaW50IGxlZnQgPSAwOworICAgICAgICAgICAgaW50IHJpZ2h0ID0gbVdpZHRoOworCisgICAgICAgICAgICBpZiAoc3Bhbm5lZFRleHQpIHsKKyAgICAgICAgICAgICAgICBTcGFubmVkIHNwID0gKFNwYW5uZWQpIGJ1ZjsKKyAgICAgICAgICAgICAgICBib29sZWFuIGlzRmlyc3RQYXJhTGluZSA9IChzdGFydCA9PSAwIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBidWYuY2hhckF0KHN0YXJ0IC0gMSkgPT0gJ1xuJyk7CisKKyAgICAgICAgICAgICAgICAvLyBOZXcgYmF0Y2ggb2YgcGFyYWdyYXBoIHN0eWxlcywgY29sbGVjdCBpbnRvIHNwYW5zIGFycmF5LgorICAgICAgICAgICAgICAgIC8vIENvbXB1dGUgdGhlIGFsaWdubWVudCwgbGFzdCBhbGlnbm1lbnQgc3R5bGUgd2lucy4KKyAgICAgICAgICAgICAgICAvLyBSZXNldCB0YWJTdG9wcywgd2UnbGwgcmVidWlsZCBpZiB3ZSBlbmNvdW50ZXIgYSBsaW5lIHdpdGgKKyAgICAgICAgICAgICAgICAvLyB0YWJzLgorICAgICAgICAgICAgICAgIC8vIFdlIGV4cGVjdCBwYXJhZ3JhcGggc3BhbnMgdG8gYmUgcmVsYXRpdmVseSBpbmZyZXF1ZW50LCB1c2UKKyAgICAgICAgICAgICAgICAvLyBzcGFuRW5kIHNvIHRoYXQgd2UgY2FuIGNoZWNrIGxlc3MgZnJlcXVlbnRseS4gIFNpbmNlCisgICAgICAgICAgICAgICAgLy8gcGFyYWdyYXBoIHN0eWxlcyBvdWdodCB0byBhcHBseSB0byBlbnRpcmUgcGFyYWdyYXBocywgd2UgY2FuCisgICAgICAgICAgICAgICAgLy8ganVzdCBjb2xsZWN0IHRoZSBvbmVzIHByZXNlbnQgYXQgdGhlIHN0YXJ0IG9mIHRoZSBwYXJhZ3JhcGguCisgICAgICAgICAgICAgICAgLy8gSWYgc3BhbkVuZCBpcyBiZWZvcmUgdGhlIGVuZCBvZiB0aGUgcGFyYWdyYXBoLCB0aGF0J3Mgbm90CisgICAgICAgICAgICAgICAgLy8gb3VyIHByb2JsZW0uCisgICAgICAgICAgICAgICAgaWYgKHN0YXJ0ID49IHNwYW5FbmQgJiYgKGkgPT0gZmlyc3QgfHwgaXNGaXJzdFBhcmFMaW5lKSkgeworICAgICAgICAgICAgICAgICAgICBzcGFuRW5kID0gc3AubmV4dFNwYW5UcmFuc2l0aW9uKHN0YXJ0LCB0ZXh0TGVuZ3RoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFncmFwaFN0eWxlLmNsYXNzKTsKLSAgICAgICAgICAgICAgICAgICAgc3BhbnMgPSBzcC5nZXRTcGFucyhzdGFydCwgc3BhbmVuZCwgUGFyYWdyYXBoU3R5bGUuY2xhc3MpOwotICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgc3BhbnMgPSBnZXRQYXJhZ3JhcGhTcGFucyhzcCwgc3RhcnQsIHNwYW5FbmQsIFBhcmFncmFwaFN0eWxlLmNsYXNzKTsKKwogICAgICAgICAgICAgICAgICAgICBhbGlnbiA9IG1BbGlnbm1lbnQ7CiAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IG4gPSBzcGFucy5sZW5ndGgtMTsgbiA+PSAwOyBuLS0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzcGFuc1tuXSBpbnN0YW5jZW9mIEFsaWdubWVudFNwYW4pIHsKQEAgLTI5MCw0NSArMzE4LDQ5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGludCBkaXIgPSBnZXRQYXJhZ3JhcGhEaXJlY3Rpb24oaSk7Ci0gICAgICAgICAgICBpbnQgbGVmdCA9IDA7Ci0gICAgICAgICAgICBpbnQgcmlnaHQgPSBtV2lkdGg7CiAKLSAgICAgICAgICAgIC8vIERyYXcgYWxsIGxlYWRpbmcgbWFyZ2luIHNwYW5zLiAgQWRqdXN0IGxlZnQgb3IgcmlnaHQgYWNjb3JkaW5nCi0gICAgICAgICAgICAvLyB0byB0aGUgcGFyYWdyYXBoIGRpcmVjdGlvbiBvZiB0aGUgbGluZS4KLSAgICAgICAgICAgIGlmIChzcGFubmVkVGV4dCkgeworICAgICAgICAgICAgICAgICAgICB0YWJTdG9wc0lzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBEcmF3IGFsbCBsZWFkaW5nIG1hcmdpbiBzcGFucy4gIEFkanVzdCBsZWZ0IG9yIHJpZ2h0IGFjY29yZGluZworICAgICAgICAgICAgICAgIC8vIHRvIHRoZSBwYXJhZ3JhcGggZGlyZWN0aW9uIG9mIHRoZSBsaW5lLgogICAgICAgICAgICAgICAgIGZpbmFsIGludCBsZW5ndGggPSBzcGFucy5sZW5ndGg7CiAgICAgICAgICAgICAgICAgZm9yIChpbnQgbiA9IDA7IG4gPCBsZW5ndGg7IG4rKykgewogICAgICAgICAgICAgICAgICAgICBpZiAoc3BhbnNbbl0gaW5zdGFuY2VvZiBMZWFkaW5nTWFyZ2luU3BhbikgewogICAgICAgICAgICAgICAgICAgICAgICAgTGVhZGluZ01hcmdpblNwYW4gbWFyZ2luID0gKExlYWRpbmdNYXJnaW5TcGFuKSBzcGFuc1tuXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gdXNlRmlyc3RMaW5lTWFyZ2luID0gaXNGaXJzdFBhcmFMaW5lOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hcmdpbiBpbnN0YW5jZW9mIExlYWRpbmdNYXJnaW5TcGFuMikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCA9ICgoTGVhZGluZ01hcmdpblNwYW4yKSBtYXJnaW4pLmdldExlYWRpbmdNYXJnaW5MaW5lQ291bnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRMaW5lID0gZ2V0TGluZUZvck9mZnNldChzcC5nZXRTcGFuU3RhcnQobWFyZ2luKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlRmlyc3RMaW5lTWFyZ2luID0gaSA8IHN0YXJ0TGluZSArIGNvdW50OworICAgICAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGlyID09IERJUl9SSUdIVF9UT19MRUZUKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luLmRyYXdMZWFkaW5nTWFyZ2luKGMsIHBhaW50LCByaWdodCwgZGlyLCBsdG9wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYmFzZWxpbmUsIGxib3R0b20sIGJ1ZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQsIGVuZCwgaXNGaXJzdFBhcmFMaW5lLCB0aGlzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHQgLT0gbWFyZ2luLmdldExlYWRpbmdNYXJnaW4oaXNGaXJzdFBhcmFMaW5lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByaWdodCAtPSBtYXJnaW4uZ2V0TGVhZGluZ01hcmdpbih1c2VGaXJzdExpbmVNYXJnaW4pOwogICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW4uZHJhd0xlYWRpbmdNYXJnaW4oYywgcGFpbnQsIGxlZnQsIGRpciwgbHRvcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGJhc2VsaW5lLCBsYm90dG9tLCBidWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0LCBlbmQsIGlzRmlyc3RQYXJhTGluZSwgdGhpcyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHVzZU1hcmdpbiA9IGlzRmlyc3RQYXJhTGluZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWFyZ2luIGluc3RhbmNlb2YgTGVhZGluZ01hcmdpblNwYW4uTGVhZGluZ01hcmdpblNwYW4yKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCA9ICgoTGVhZGluZ01hcmdpblNwYW4uTGVhZGluZ01hcmdpblNwYW4yKW1hcmdpbikuZ2V0TGVhZGluZ01hcmdpbkxpbmVDb3VudCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VNYXJnaW4gPSBjb3VudCA+IGk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgKz0gbWFyZ2luLmdldExlYWRpbmdNYXJnaW4odXNlTWFyZ2luKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0ICs9IG1hcmdpbi5nZXRMZWFkaW5nTWFyZ2luKHVzZUZpcnN0TGluZU1hcmdpbik7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIC8vIEFkanVzdCB0aGUgcG9pbnQgYXQgd2hpY2ggdG8gc3RhcnQgcmVuZGVyaW5nIGRlcGVuZGluZyBvbiB0aGUKLSAgICAgICAgICAgIC8vIGFsaWdubWVudCBvZiB0aGUgcGFyYWdyYXBoLgorICAgICAgICAgICAgYm9vbGVhbiBoYXNUYWJPckVtb2ppID0gZ2V0TGluZUNvbnRhaW5zVGFiKGkpOworICAgICAgICAgICAgLy8gQ2FuJ3QgdGVsbCBpZiB3ZSBoYXZlIHRhYnMgZm9yIHN1cmUsIGN1cnJlbnRseQorICAgICAgICAgICAgaWYgKGhhc1RhYk9yRW1vamkgJiYgIXRhYlN0b3BzSXNJbml0aWFsaXplZCkgeworICAgICAgICAgICAgICAgIGlmICh0YWJTdG9wcyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRhYlN0b3BzID0gbmV3IFRhYlN0b3BzKFRBQl9JTkNSRU1FTlQsIHNwYW5zKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB0YWJTdG9wcy5yZXNldChUQUJfSU5DUkVNRU5ULCBzcGFucyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRhYlN0b3BzSXNJbml0aWFsaXplZCA9IHRydWU7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGludCB4OwogICAgICAgICAgICAgaWYgKGFsaWduID09IEFsaWdubWVudC5BTElHTl9OT1JNQUwpIHsKICAgICAgICAgICAgICAgICBpZiAoZGlyID09IERJUl9MRUZUX1RPX1JJR0hUKSB7CkBAIC0zMzcsNDEgKzM2OSw4MCBAQAogICAgICAgICAgICAgICAgICAgICB4ID0gcmlnaHQ7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpbnQgbWF4ID0gKGludClnZXRMaW5lTWF4KGksIHNwYW5zLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgaW50IG1heCA9IChpbnQpZ2V0TGluZUV4dGVudChpLCB0YWJTdG9wcywgZmFsc2UpOwogICAgICAgICAgICAgICAgIGlmIChhbGlnbiA9PSBBbGlnbm1lbnQuQUxJR05fT1BQT1NJVEUpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGRpciA9PSBESVJfUklHSFRfVE9fTEVGVCkgewotICAgICAgICAgICAgICAgICAgICAgICAgeCA9IGxlZnQgKyBtYXg7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChkaXIgPT0gRElSX0xFRlRfVE9fUklHSFQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHggPSByaWdodCAtIG1heDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEFsaWdubWVudC5BTElHTl9DRU5URVIKLSAgICAgICAgICAgICAgICAgICAgbWF4ID0gbWF4ICYgfjE7Ci0gICAgICAgICAgICAgICAgICAgIGludCBoYWxmID0gKHJpZ2h0IC0gbGVmdCAtIG1heCkgPj4gMTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGRpciA9PSBESVJfUklHSFRfVE9fTEVGVCkgewotICAgICAgICAgICAgICAgICAgICAgICAgeCA9IHJpZ2h0IC0gaGFsZjsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHggPSBsZWZ0ICsgaGFsZjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHggPSBsZWZ0IC0gbWF4OwogICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsgLy8gQWxpZ25tZW50LkFMSUdOX0NFTlRFUgorICAgICAgICAgICAgICAgICAgICBtYXggPSBtYXggJiB+MTsKKyAgICAgICAgICAgICAgICAgICAgeCA9IChyaWdodCArIGxlZnQgLSBtYXgpID4+IDE7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBEaXJlY3Rpb25zIGRpcmVjdGlvbnMgPSBnZXRMaW5lRGlyZWN0aW9ucyhpKTsKLSAgICAgICAgICAgIGJvb2xlYW4gaGFzVGFiID0gZ2V0TGluZUNvbnRhaW5zVGFiKGkpOwogICAgICAgICAgICAgaWYgKGRpcmVjdGlvbnMgPT0gRElSU19BTExfTEVGVF9UT19SSUdIVCAmJgotICAgICAgICAgICAgICAgICAgICAhc3Bhbm5lZFRleHQgJiYgIWhhc1RhYikgewotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShkaXIgPT0gRElSX0xFRlRfVE9fUklHSFQpOwotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0Tm90TnVsbChjKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICFzcGFubmVkVGV4dCAmJiAhaGFzVGFiT3JFbW9qaSkgewogICAgICAgICAgICAgICAgIC8vIFhYWDogYXNzdW1lcyB0aGVyZSdzIG5vdGhpbmcgYWRkaXRpb25hbCB0byBiZSBkb25lCiAgICAgICAgICAgICAgICAgYy5kcmF3VGV4dChidWYsIHN0YXJ0LCBlbmQsIHgsIGxiYXNlbGluZSwgcGFpbnQpOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBkcmF3VGV4dChjLCBidWYsIHN0YXJ0LCBlbmQsIGRpciwgZGlyZWN0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgeCwgbHRvcCwgbGJhc2VsaW5lLCBsYm90dG9tLCBwYWludCwgbVdvcmtQYWludCwKLSAgICAgICAgICAgICAgICAgICAgaGFzVGFiLCBzcGFucyk7CisgICAgICAgICAgICAgICAgdGwuc2V0KHBhaW50LCBidWYsIHN0YXJ0LCBlbmQsIGRpciwgZGlyZWN0aW9ucywgaGFzVGFiT3JFbW9qaSwgdGFiU3RvcHMpOworICAgICAgICAgICAgICAgIHRsLmRyYXcoYywgeCwgbHRvcCwgbGJhc2VsaW5lLCBsYm90dG9tKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQorCisgICAgICAgIFRleHRMaW5lLnJlY3ljbGUodGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc3RhcnQgcG9zaXRpb24gb2YgdGhlIGxpbmUsIGdpdmVuIHRoZSBsZWZ0IGFuZCByaWdodCBib3VuZHMKKyAgICAgKiBvZiB0aGUgbWFyZ2lucy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaW5lIHRoZSBsaW5lIGluZGV4CisgICAgICogQHBhcmFtIGxlZnQgdGhlIGxlZnQgYm91bmRzICgwLCBvciBsZWFkaW5nIG1hcmdpbiBpZiBsdHIgcGFyYSkKKyAgICAgKiBAcGFyYW0gcmlnaHQgdGhlIHJpZ2h0IGJvdW5kcyAod2lkdGgsIG1pbnVzIGxlYWRpbmcgbWFyZ2luIGlmIHJ0bCBwYXJhKQorICAgICAqIEByZXR1cm4gdGhlIHN0YXJ0IHBvc2l0aW9uIG9mIHRoZSBsaW5lICh0byByaWdodCBvZiBsaW5lIGlmIHJ0bCBwYXJhKQorICAgICAqLworICAgIHByaXZhdGUgaW50IGdldExpbmVTdGFydFBvcyhpbnQgbGluZSwgaW50IGxlZnQsIGludCByaWdodCkgeworICAgICAgICAvLyBBZGp1c3QgdGhlIHBvaW50IGF0IHdoaWNoIHRvIHN0YXJ0IHJlbmRlcmluZyBkZXBlbmRpbmcgb24gdGhlCisgICAgICAgIC8vIGFsaWdubWVudCBvZiB0aGUgcGFyYWdyYXBoLgorICAgICAgICBBbGlnbm1lbnQgYWxpZ24gPSBnZXRQYXJhZ3JhcGhBbGlnbm1lbnQobGluZSk7CisgICAgICAgIGludCBkaXIgPSBnZXRQYXJhZ3JhcGhEaXJlY3Rpb24obGluZSk7CisKKyAgICAgICAgaW50IHg7CisgICAgICAgIGlmIChhbGlnbiA9PSBBbGlnbm1lbnQuQUxJR05fTk9STUFMKSB7CisgICAgICAgICAgICBpZiAoZGlyID09IERJUl9MRUZUX1RPX1JJR0hUKSB7CisgICAgICAgICAgICAgICAgeCA9IGxlZnQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHggPSByaWdodDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFRhYlN0b3BzIHRhYlN0b3BzID0gbnVsbDsKKyAgICAgICAgICAgIGlmIChtU3Bhbm5lZFRleHQgJiYgZ2V0TGluZUNvbnRhaW5zVGFiKGxpbmUpKSB7CisgICAgICAgICAgICAgICAgU3Bhbm5lZCBzcGFubmVkID0gKFNwYW5uZWQpIG1UZXh0OworICAgICAgICAgICAgICAgIGludCBzdGFydCA9IGdldExpbmVTdGFydChsaW5lKTsKKyAgICAgICAgICAgICAgICBpbnQgc3BhbkVuZCA9IHNwYW5uZWQubmV4dFNwYW5UcmFuc2l0aW9uKHN0YXJ0LCBzcGFubmVkLmxlbmd0aCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgVGFiU3RvcFNwYW4uY2xhc3MpOworICAgICAgICAgICAgICAgIFRhYlN0b3BTcGFuW10gdGFiU3BhbnMgPSBnZXRQYXJhZ3JhcGhTcGFucyhzcGFubmVkLCBzdGFydCwgc3BhbkVuZCwgVGFiU3RvcFNwYW4uY2xhc3MpOworICAgICAgICAgICAgICAgIGlmICh0YWJTcGFucy5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIHRhYlN0b3BzID0gbmV3IFRhYlN0b3BzKFRBQl9JTkNSRU1FTlQsIHRhYlNwYW5zKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgbWF4ID0gKGludClnZXRMaW5lRXh0ZW50KGxpbmUsIHRhYlN0b3BzLCBmYWxzZSk7CisgICAgICAgICAgICBpZiAoYWxpZ24gPT0gQWxpZ25tZW50LkFMSUdOX09QUE9TSVRFKSB7CisgICAgICAgICAgICAgICAgaWYgKGRpciA9PSBESVJfTEVGVF9UT19SSUdIVCkgeworICAgICAgICAgICAgICAgICAgICB4ID0gcmlnaHQgLSBtYXg7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgeCA9IGxlZnQgLSBtYXg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsgLy8gQWxpZ25tZW50LkFMSUdOX0NFTlRFUgorICAgICAgICAgICAgICAgIG1heCA9IG1heCAmIH4xOworICAgICAgICAgICAgICAgIHggPSAobGVmdCArIHJpZ2h0IC0gbWF4KSA+PiAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB4OwogICAgIH0KIAogICAgIC8qKgpAQCAtNDE3LDcgKzQ4OCw3IEBACiAKICAgICAgICAgbVdpZHRoID0gd2lkOwogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIFJldHVybiB0aGUgdG90YWwgaGVpZ2h0IG9mIHRoaXMgbGF5b3V0LgogICAgICAqLwpAQCAtNDUwLDcgKzUyMSw3IEBACiAgICAgICogUmV0dXJuIHRoZSBudW1iZXIgb2YgbGluZXMgb2YgdGV4dCBpbiB0aGlzIGxheW91dC4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgaW50IGdldExpbmVDb3VudCgpOwotICAgIAorCiAgICAgLyoqCiAgICAgICogUmV0dXJuIHRoZSBiYXNlbGluZSBmb3IgdGhlIHNwZWNpZmllZCBsaW5lICgwJmhlbGxpcDtnZXRMaW5lQ291bnQoKSAtIDEpCiAgICAgICogSWYgYm91bmRzIGlzIG5vdCBudWxsLCByZXR1cm4gdGhlIHRvcCwgbGVmdCwgcmlnaHQsIGJvdHRvbSBleHRlbnRzCkBAIC01MjQsMTMgKzU5NSw5NSBAQAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0Qm90dG9tUGFkZGluZygpOwogCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGNoYXJhY3RlciBhdCBvZmZzZXQgYW5kIHRoZSBwcmVjZWRpbmcgY2hhcmFjdGVyCisgICAgICogYXJlIGF0IGRpZmZlcmVudCBydW4gbGV2ZWxzIChhbmQgdGh1cyB0aGVyZSdzIGEgc3BsaXQgY2FyZXQpLgorICAgICAqIEBwYXJhbSBvZmZzZXQgdGhlIG9mZnNldAorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBhdCBhIGxldmVsIGJvdW5kYXJ5CisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGlzTGV2ZWxCb3VuZGFyeShpbnQgb2Zmc2V0KSB7CisgICAgICAgIGludCBsaW5lID0gZ2V0TGluZUZvck9mZnNldChvZmZzZXQpOworICAgICAgICBEaXJlY3Rpb25zIGRpcnMgPSBnZXRMaW5lRGlyZWN0aW9ucyhsaW5lKTsKKyAgICAgICAgaWYgKGRpcnMgPT0gRElSU19BTExfTEVGVF9UT19SSUdIVCB8fCBkaXJzID09IERJUlNfQUxMX1JJR0hUX1RPX0xFRlQpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGludFtdIHJ1bnMgPSBkaXJzLm1EaXJlY3Rpb25zOworICAgICAgICBpbnQgbGluZVN0YXJ0ID0gZ2V0TGluZVN0YXJ0KGxpbmUpOworICAgICAgICBpbnQgbGluZUVuZCA9IGdldExpbmVFbmQobGluZSk7CisgICAgICAgIGlmIChvZmZzZXQgPT0gbGluZVN0YXJ0IHx8IG9mZnNldCA9PSBsaW5lRW5kKSB7CisgICAgICAgICAgICBpbnQgcGFyYUxldmVsID0gZ2V0UGFyYWdyYXBoRGlyZWN0aW9uKGxpbmUpID09IDEgPyAwIDogMTsKKyAgICAgICAgICAgIGludCBydW5JbmRleCA9IG9mZnNldCA9PSBsaW5lU3RhcnQgPyAwIDogcnVucy5sZW5ndGggLSAyOworICAgICAgICAgICAgcmV0dXJuICgocnVuc1tydW5JbmRleCArIDFdID4+PiBSVU5fTEVWRUxfU0hJRlQpICYgUlVOX0xFVkVMX01BU0spICE9IHBhcmFMZXZlbDsKKyAgICAgICAgfQorCisgICAgICAgIG9mZnNldCAtPSBsaW5lU3RhcnQ7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcnVucy5sZW5ndGg7IGkgKz0gMikgeworICAgICAgICAgICAgaWYgKG9mZnNldCA9PSBydW5zW2ldKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBwcmltYXJ5SXNUcmFpbGluZ1ByZXZpb3VzKGludCBvZmZzZXQpIHsKKyAgICAgICAgaW50IGxpbmUgPSBnZXRMaW5lRm9yT2Zmc2V0KG9mZnNldCk7CisgICAgICAgIGludCBsaW5lU3RhcnQgPSBnZXRMaW5lU3RhcnQobGluZSk7CisgICAgICAgIGludCBsaW5lRW5kID0gZ2V0TGluZUVuZChsaW5lKTsKKyAgICAgICAgaW50W10gcnVucyA9IGdldExpbmVEaXJlY3Rpb25zKGxpbmUpLm1EaXJlY3Rpb25zOworCisgICAgICAgIGludCBsZXZlbEF0ID0gLTE7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcnVucy5sZW5ndGg7IGkgKz0gMikgeworICAgICAgICAgICAgaW50IHN0YXJ0ID0gbGluZVN0YXJ0ICsgcnVuc1tpXTsKKyAgICAgICAgICAgIGludCBsaW1pdCA9IHN0YXJ0ICsgKHJ1bnNbaSsxXSAmIFJVTl9MRU5HVEhfTUFTSyk7CisgICAgICAgICAgICBpZiAobGltaXQgPiBsaW5lRW5kKSB7CisgICAgICAgICAgICAgICAgbGltaXQgPSBsaW5lRW5kOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG9mZnNldCA+PSBzdGFydCAmJiBvZmZzZXQgPCBsaW1pdCkgeworICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgPiBzdGFydCkgeworICAgICAgICAgICAgICAgICAgICAvLyBQcmV2aW91cyBjaGFyYWN0ZXIgaXMgYXQgc2FtZSBsZXZlbCwgc28gZG9uJ3QgdXNlIHRyYWlsaW5nLgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxldmVsQXQgPSAocnVuc1tpKzFdID4+PiBSVU5fTEVWRUxfU0hJRlQpICYgUlVOX0xFVkVMX01BU0s7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGxldmVsQXQgPT0gLTEpIHsKKyAgICAgICAgICAgIC8vIE9mZnNldCB3YXMgbGltaXQgb2YgbGluZS4KKyAgICAgICAgICAgIGxldmVsQXQgPSBnZXRQYXJhZ3JhcGhEaXJlY3Rpb24obGluZSkgPT0gMSA/IDAgOiAxOworICAgICAgICB9CisKKyAgICAgICAgLy8gQXQgbGV2ZWwgYm91bmRhcnksIGNoZWNrIHByZXZpb3VzIGxldmVsLgorICAgICAgICBpbnQgbGV2ZWxCZWZvcmUgPSAtMTsKKyAgICAgICAgaWYgKG9mZnNldCA9PSBsaW5lU3RhcnQpIHsKKyAgICAgICAgICAgIGxldmVsQmVmb3JlID0gZ2V0UGFyYWdyYXBoRGlyZWN0aW9uKGxpbmUpID09IDEgPyAwIDogMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG9mZnNldCAtPSAxOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBydW5zLmxlbmd0aDsgaSArPSAyKSB7CisgICAgICAgICAgICAgICAgaW50IHN0YXJ0ID0gbGluZVN0YXJ0ICsgcnVuc1tpXTsKKyAgICAgICAgICAgICAgICBpbnQgbGltaXQgPSBzdGFydCArIChydW5zW2krMV0gJiBSVU5fTEVOR1RIX01BU0spOworICAgICAgICAgICAgICAgIGlmIChsaW1pdCA+IGxpbmVFbmQpIHsKKyAgICAgICAgICAgICAgICAgICAgbGltaXQgPSBsaW5lRW5kOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAob2Zmc2V0ID49IHN0YXJ0ICYmIG9mZnNldCA8IGxpbWl0KSB7CisgICAgICAgICAgICAgICAgICAgIGxldmVsQmVmb3JlID0gKHJ1bnNbaSsxXSA+Pj4gUlVOX0xFVkVMX1NISUZUKSAmIFJVTl9MRVZFTF9NQVNLOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbGV2ZWxCZWZvcmUgPCBsZXZlbEF0OworICAgIH0KKwogICAgIC8qKgogICAgICAqIEdldCB0aGUgcHJpbWFyeSBob3Jpem9udGFsIHBvc2l0aW9uIGZvciB0aGUgc3BlY2lmaWVkIHRleHQgb2Zmc2V0LgogICAgICAqIFRoaXMgaXMgdGhlIGxvY2F0aW9uIHdoZXJlIGEgbmV3IGNoYXJhY3RlciB3b3VsZCBiZSBpbnNlcnRlZCBpbgogICAgICAqIHRoZSBwYXJhZ3JhcGgncyBwcmltYXJ5IGRpcmVjdGlvbi4KICAgICAgKi8KICAgICBwdWJsaWMgZmxvYXQgZ2V0UHJpbWFyeUhvcml6b250YWwoaW50IG9mZnNldCkgewotICAgICAgICByZXR1cm4gZ2V0SG9yaXpvbnRhbChvZmZzZXQsIGZhbHNlLCB0cnVlKTsKKyAgICAgICAgYm9vbGVhbiB0cmFpbGluZyA9IHByaW1hcnlJc1RyYWlsaW5nUHJldmlvdXMob2Zmc2V0KTsKKyAgICAgICAgcmV0dXJuIGdldEhvcml6b250YWwob2Zmc2V0LCB0cmFpbGluZyk7CiAgICAgfQogCiAgICAgLyoqCkBAIC01MzksNjYgKzY5Miw0MiBAQAogICAgICAqIHRoZSBkaXJlY3Rpb24gb3RoZXIgdGhhbiB0aGUgcGFyYWdyYXBoJ3MgcHJpbWFyeSBkaXJlY3Rpb24uCiAgICAgICovCiAgICAgcHVibGljIGZsb2F0IGdldFNlY29uZGFyeUhvcml6b250YWwoaW50IG9mZnNldCkgewotICAgICAgICByZXR1cm4gZ2V0SG9yaXpvbnRhbChvZmZzZXQsIHRydWUsIHRydWUpOworICAgICAgICBib29sZWFuIHRyYWlsaW5nID0gcHJpbWFyeUlzVHJhaWxpbmdQcmV2aW91cyhvZmZzZXQpOworICAgICAgICByZXR1cm4gZ2V0SG9yaXpvbnRhbChvZmZzZXQsICF0cmFpbGluZyk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBmbG9hdCBnZXRIb3Jpem9udGFsKGludCBvZmZzZXQsIGJvb2xlYW4gdHJhaWxpbmcsIGJvb2xlYW4gYWx0KSB7CisgICAgcHJpdmF0ZSBmbG9hdCBnZXRIb3Jpem9udGFsKGludCBvZmZzZXQsIGJvb2xlYW4gdHJhaWxpbmcpIHsKICAgICAgICAgaW50IGxpbmUgPSBnZXRMaW5lRm9yT2Zmc2V0KG9mZnNldCk7CiAKLSAgICAgICAgcmV0dXJuIGdldEhvcml6b250YWwob2Zmc2V0LCB0cmFpbGluZywgYWx0LCBsaW5lKTsKKyAgICAgICAgcmV0dXJuIGdldEhvcml6b250YWwob2Zmc2V0LCB0cmFpbGluZywgbGluZSk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBmbG9hdCBnZXRIb3Jpem9udGFsKGludCBvZmZzZXQsIGJvb2xlYW4gdHJhaWxpbmcsIGJvb2xlYW4gYWx0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGluZSkgeworICAgIHByaXZhdGUgZmxvYXQgZ2V0SG9yaXpvbnRhbChpbnQgb2Zmc2V0LCBib29sZWFuIHRyYWlsaW5nLCBpbnQgbGluZSkgewogICAgICAgICBpbnQgc3RhcnQgPSBnZXRMaW5lU3RhcnQobGluZSk7Ci0gICAgICAgIGludCBlbmQgPSBnZXRMaW5lVmlzaWJsZUVuZChsaW5lKTsKKyAgICAgICAgaW50IGVuZCA9IGdldExpbmVFbmQobGluZSk7CiAgICAgICAgIGludCBkaXIgPSBnZXRQYXJhZ3JhcGhEaXJlY3Rpb24obGluZSk7Ci0gICAgICAgIGJvb2xlYW4gdGFiID0gZ2V0TGluZUNvbnRhaW5zVGFiKGxpbmUpOworICAgICAgICBib29sZWFuIGhhc1RhYk9yRW1vamkgPSBnZXRMaW5lQ29udGFpbnNUYWIobGluZSk7CiAgICAgICAgIERpcmVjdGlvbnMgZGlyZWN0aW9ucyA9IGdldExpbmVEaXJlY3Rpb25zKGxpbmUpOwogCi0gICAgICAgIFRhYlN0b3BTcGFuW10gdGFicyA9IG51bGw7Ci0gICAgICAgIGlmICh0YWIgJiYgbVRleHQgaW5zdGFuY2VvZiBTcGFubmVkKSB7Ci0gICAgICAgICAgICB0YWJzID0gKChTcGFubmVkKSBtVGV4dCkuZ2V0U3BhbnMoc3RhcnQsIGVuZCwgVGFiU3RvcFNwYW4uY2xhc3MpOworICAgICAgICBUYWJTdG9wcyB0YWJTdG9wcyA9IG51bGw7CisgICAgICAgIGlmIChoYXNUYWJPckVtb2ppICYmIG1UZXh0IGluc3RhbmNlb2YgU3Bhbm5lZCkgeworICAgICAgICAgICAgLy8gSnVzdCBjaGVja2luZyB0aGlzIGxpbmUgc2hvdWxkIGJlIGdvb2QgZW5vdWdoLCB0YWJzIHNob3VsZCBiZQorICAgICAgICAgICAgLy8gY29uc2lzdGVudCBhY3Jvc3MgYWxsIGxpbmVzIGluIGEgcGFyYWdyYXBoLgorICAgICAgICAgICAgVGFiU3RvcFNwYW5bXSB0YWJzID0gZ2V0UGFyYWdyYXBoU3BhbnMoKFNwYW5uZWQpIG1UZXh0LCBzdGFydCwgZW5kLCBUYWJTdG9wU3Bhbi5jbGFzcyk7CisgICAgICAgICAgICBpZiAodGFicy5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICAgICAgdGFiU3RvcHMgPSBuZXcgVGFiU3RvcHMoVEFCX0lOQ1JFTUVOVCwgdGFicyk7IC8vIFhYWCBzaG91bGQgcmV1c2UKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIGZsb2F0IHdpZCA9IG1lYXN1cmVUZXh0KG1QYWludCwgbVdvcmtQYWludCwgbVRleHQsIHN0YXJ0LCBvZmZzZXQsIGVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyLCBkaXJlY3Rpb25zLCB0cmFpbGluZywgYWx0LCB0YWIsIHRhYnMpOworICAgICAgICBUZXh0TGluZSB0bCA9IFRleHRMaW5lLm9idGFpbigpOworICAgICAgICB0bC5zZXQobVBhaW50LCBtVGV4dCwgc3RhcnQsIGVuZCwgZGlyLCBkaXJlY3Rpb25zLCBoYXNUYWJPckVtb2ppLCB0YWJTdG9wcyk7CisgICAgICAgIGZsb2F0IHdpZCA9IHRsLm1lYXN1cmUob2Zmc2V0IC0gc3RhcnQsIHRyYWlsaW5nLCBudWxsKTsKKyAgICAgICAgVGV4dExpbmUucmVjeWNsZSh0bCk7CiAKLSAgICAgICAgaWYgKG9mZnNldCA+IGVuZCkgewotICAgICAgICAgICAgaWYgKGRpciA9PSBESVJfUklHSFRfVE9fTEVGVCkKLSAgICAgICAgICAgICAgICB3aWQgLT0gbWVhc3VyZVRleHQobVBhaW50LCBtV29ya1BhaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVGV4dCwgZW5kLCBvZmZzZXQsIG51bGwsIHRhYiwgdGFicyk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgd2lkICs9IG1lYXN1cmVUZXh0KG1QYWludCwgbVdvcmtQYWludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRleHQsIGVuZCwgb2Zmc2V0LCBudWxsLCB0YWIsIHRhYnMpOwotICAgICAgICB9Ci0KLSAgICAgICAgQWxpZ25tZW50IGFsaWduID0gZ2V0UGFyYWdyYXBoQWxpZ25tZW50KGxpbmUpOwogICAgICAgICBpbnQgbGVmdCA9IGdldFBhcmFncmFwaExlZnQobGluZSk7CiAgICAgICAgIGludCByaWdodCA9IGdldFBhcmFncmFwaFJpZ2h0KGxpbmUpOwogCi0gICAgICAgIGlmIChhbGlnbiA9PSBBbGlnbm1lbnQuQUxJR05fTk9STUFMKSB7Ci0gICAgICAgICAgICBpZiAoZGlyID09IERJUl9SSUdIVF9UT19MRUZUKQotICAgICAgICAgICAgICAgIHJldHVybiByaWdodCArIHdpZDsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICByZXR1cm4gbGVmdCArIHdpZDsKLSAgICAgICAgfQotCi0gICAgICAgIGZsb2F0IG1heCA9IGdldExpbmVNYXgobGluZSk7Ci0KLSAgICAgICAgaWYgKGFsaWduID09IEFsaWdubWVudC5BTElHTl9PUFBPU0lURSkgewotICAgICAgICAgICAgaWYgKGRpciA9PSBESVJfUklHSFRfVE9fTEVGVCkKLSAgICAgICAgICAgICAgICByZXR1cm4gbGVmdCArIG1heCArIHdpZDsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICByZXR1cm4gcmlnaHQgLSBtYXggKyB3aWQ7Ci0gICAgICAgIH0gZWxzZSB7IC8qIGFsaWduID09IEFsaWdubWVudC5BTElHTl9DRU5URVIgKi8KLSAgICAgICAgICAgIGludCBpbWF4ID0gKChpbnQpIG1heCkgJiB+MTsKLQotICAgICAgICAgICAgaWYgKGRpciA9PSBESVJfUklHSFRfVE9fTEVGVCkKLSAgICAgICAgICAgICAgICByZXR1cm4gcmlnaHQgLSAoKChyaWdodCAtIGxlZnQpIC0gaW1heCkgLyAyKSArIHdpZDsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICByZXR1cm4gbGVmdCArICgocmlnaHQgLSBsZWZ0KSAtIGltYXgpIC8gMiArIHdpZDsKLSAgICAgICAgfQorICAgICAgICByZXR1cm4gZ2V0TGluZVN0YXJ0UG9zKGxpbmUsIGxlZnQsIHJpZ2h0KSArIHdpZDsKICAgICB9CiAKICAgICAvKioKQEAgLTY1NiwzOCArNzg1LDc2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgaG9yaXpvbnRhbCBleHRlbnQgb2YgdGhlIHNwZWNpZmllZCBsaW5lLCBleGNsdWRpbmcKLSAgICAgKiB0cmFpbGluZyB3aGl0ZXNwYWNlLgorICAgICAqIEdldHMgdGhlIHVuc2lnbmVkIGhvcml6b250YWwgZXh0ZW50IG9mIHRoZSBzcGVjaWZpZWQgbGluZSwgaW5jbHVkaW5nCisgICAgICogbGVhZGluZyBtYXJnaW4gaW5kZW50LCBidXQgZXhjbHVkaW5nIHRyYWlsaW5nIHdoaXRlc3BhY2UuCiAgICAgICovCiAgICAgcHVibGljIGZsb2F0IGdldExpbmVNYXgoaW50IGxpbmUpIHsKLSAgICAgICAgcmV0dXJuIGdldExpbmVNYXgobGluZSwgbnVsbCwgZmFsc2UpOworICAgICAgICBmbG9hdCBtYXJnaW4gPSBnZXRQYXJhZ3JhcGhMZWFkaW5nTWFyZ2luKGxpbmUpOworICAgICAgICBmbG9hdCBzaWduZWRFeHRlbnQgPSBnZXRMaW5lRXh0ZW50KGxpbmUsIGZhbHNlKTsKKyAgICAgICAgcmV0dXJuIG1hcmdpbiArIHNpZ25lZEV4dGVudCA+PSAwID8gc2lnbmVkRXh0ZW50IDogLXNpZ25lZEV4dGVudDsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBob3Jpem9udGFsIGV4dGVudCBvZiB0aGUgc3BlY2lmaWVkIGxpbmUsIGluY2x1ZGluZwotICAgICAqIHRyYWlsaW5nIHdoaXRlc3BhY2UuCisgICAgICogR2V0cyB0aGUgdW5zaWduZWQgaG9yaXpvbnRhbCBleHRlbnQgb2YgdGhlIHNwZWNpZmllZCBsaW5lLCBpbmNsdWRpbmcKKyAgICAgKiBsZWFkaW5nIG1hcmdpbiBpbmRlbnQgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UuCiAgICAgICovCiAgICAgcHVibGljIGZsb2F0IGdldExpbmVXaWR0aChpbnQgbGluZSkgewotICAgICAgICByZXR1cm4gZ2V0TGluZU1heChsaW5lLCBudWxsLCB0cnVlKTsKKyAgICAgICAgZmxvYXQgbWFyZ2luID0gZ2V0UGFyYWdyYXBoTGVhZGluZ01hcmdpbihsaW5lKTsKKyAgICAgICAgZmxvYXQgc2lnbmVkRXh0ZW50ID0gZ2V0TGluZUV4dGVudChsaW5lLCB0cnVlKTsKKyAgICAgICAgcmV0dXJuIG1hcmdpbiArIHNpZ25lZEV4dGVudCA+PSAwID8gc2lnbmVkRXh0ZW50IDogLXNpZ25lZEV4dGVudDsKICAgICB9CiAKLSAgICBwcml2YXRlIGZsb2F0IGdldExpbmVNYXgoaW50IGxpbmUsIE9iamVjdFtdIHRhYnMsIGJvb2xlYW4gZnVsbCkgeworICAgIC8qKgorICAgICAqIExpa2Uge0BsaW5rICNnZXRMaW5lRXh0ZW50KGludCxUYWJTdG9wcyxib29sZWFuKX0gYnV0IGRldGVybWluZXMgdGhlCisgICAgICogdGFiIHN0b3BzIGluc3RlYWQgb2YgdXNpbmcgdGhlIG9uZXMgcGFzc2VkIGluLgorICAgICAqIEBwYXJhbSBsaW5lIHRoZSBpbmRleCBvZiB0aGUgbGluZQorICAgICAqIEBwYXJhbSBmdWxsIHdoZXRoZXIgdG8gaW5jbHVkZSB0cmFpbGluZyB3aGl0ZXNwYWNlCisgICAgICogQHJldHVybiB0aGUgZXh0ZW50IG9mIHRoZSBsaW5lCisgICAgICovCisgICAgcHJpdmF0ZSBmbG9hdCBnZXRMaW5lRXh0ZW50KGludCBsaW5lLCBib29sZWFuIGZ1bGwpIHsKICAgICAgICAgaW50IHN0YXJ0ID0gZ2V0TGluZVN0YXJ0KGxpbmUpOwotICAgICAgICBpbnQgZW5kOworICAgICAgICBpbnQgZW5kID0gZnVsbCA/IGdldExpbmVFbmQobGluZSkgOiBnZXRMaW5lVmlzaWJsZUVuZChsaW5lKTsKIAotICAgICAgICBpZiAoZnVsbCkgewotICAgICAgICAgICAgZW5kID0gZ2V0TGluZUVuZChsaW5lKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGVuZCA9IGdldExpbmVWaXNpYmxlRW5kKGxpbmUpOwotICAgICAgICB9IAotICAgICAgICBib29sZWFuIHRhYiA9IGdldExpbmVDb250YWluc1RhYihsaW5lKTsKLQotICAgICAgICBpZiAodGFicyA9PSBudWxsICYmIHRhYiAmJiBtVGV4dCBpbnN0YW5jZW9mIFNwYW5uZWQpIHsKLSAgICAgICAgICAgIHRhYnMgPSAoKFNwYW5uZWQpIG1UZXh0KS5nZXRTcGFucyhzdGFydCwgZW5kLCBUYWJTdG9wU3Bhbi5jbGFzcyk7CisgICAgICAgIGJvb2xlYW4gaGFzVGFic09yRW1vamkgPSBnZXRMaW5lQ29udGFpbnNUYWIobGluZSk7CisgICAgICAgIFRhYlN0b3BzIHRhYlN0b3BzID0gbnVsbDsKKyAgICAgICAgaWYgKGhhc1RhYnNPckVtb2ppICYmIG1UZXh0IGluc3RhbmNlb2YgU3Bhbm5lZCkgeworICAgICAgICAgICAgLy8gSnVzdCBjaGVja2luZyB0aGlzIGxpbmUgc2hvdWxkIGJlIGdvb2QgZW5vdWdoLCB0YWJzIHNob3VsZCBiZQorICAgICAgICAgICAgLy8gY29uc2lzdGVudCBhY3Jvc3MgYWxsIGxpbmVzIGluIGEgcGFyYWdyYXBoLgorICAgICAgICAgICAgVGFiU3RvcFNwYW5bXSB0YWJzID0gZ2V0UGFyYWdyYXBoU3BhbnMoKFNwYW5uZWQpIG1UZXh0LCBzdGFydCwgZW5kLCBUYWJTdG9wU3Bhbi5jbGFzcyk7CisgICAgICAgICAgICBpZiAodGFicy5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICAgICAgdGFiU3RvcHMgPSBuZXcgVGFiU3RvcHMoVEFCX0lOQ1JFTUVOVCwgdGFicyk7IC8vIFhYWCBzaG91bGQgcmV1c2UKKyAgICAgICAgICAgIH0KICAgICAgICAgfQorICAgICAgICBEaXJlY3Rpb25zIGRpcmVjdGlvbnMgPSBnZXRMaW5lRGlyZWN0aW9ucyhsaW5lKTsKKyAgICAgICAgaW50IGRpciA9IGdldFBhcmFncmFwaERpcmVjdGlvbihsaW5lKTsKIAotICAgICAgICByZXR1cm4gbWVhc3VyZVRleHQobVBhaW50LCBtV29ya1BhaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRleHQsIHN0YXJ0LCBlbmQsIG51bGwsIHRhYiwgdGFicyk7CisgICAgICAgIFRleHRMaW5lIHRsID0gVGV4dExpbmUub2J0YWluKCk7CisgICAgICAgIHRsLnNldChtUGFpbnQsIG1UZXh0LCBzdGFydCwgZW5kLCBkaXIsIGRpcmVjdGlvbnMsIGhhc1RhYnNPckVtb2ppLCB0YWJTdG9wcyk7CisgICAgICAgIGZsb2F0IHdpZHRoID0gdGwubWV0cmljcyhudWxsKTsKKyAgICAgICAgVGV4dExpbmUucmVjeWNsZSh0bCk7CisgICAgICAgIHJldHVybiB3aWR0aDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBzaWduZWQgaG9yaXpvbnRhbCBleHRlbnQgb2YgdGhlIHNwZWNpZmllZCBsaW5lLCBleGNsdWRpbmcKKyAgICAgKiBsZWFkaW5nIG1hcmdpbi4gIElmIGZ1bGwgaXMgZmFsc2UsIGV4Y2x1ZGVzIHRyYWlsaW5nIHdoaXRlc3BhY2UuCisgICAgICogQHBhcmFtIGxpbmUgdGhlIGluZGV4IG9mIHRoZSBsaW5lCisgICAgICogQHBhcmFtIHRhYlN0b3BzIHRoZSB0YWIgc3RvcHMsIGNhbiBiZSBudWxsIGlmIHdlIGtub3cgdGhleSdyZSBub3QgdXNlZC4KKyAgICAgKiBAcGFyYW0gZnVsbCB3aGV0aGVyIHRvIGluY2x1ZGUgdHJhaWxpbmcgd2hpdGVzcGFjZQorICAgICAqIEByZXR1cm4gdGhlIGV4dGVudCBvZiB0aGUgdGV4dCBvbiB0aGlzIGxpbmUKKyAgICAgKi8KKyAgICBwcml2YXRlIGZsb2F0IGdldExpbmVFeHRlbnQoaW50IGxpbmUsIFRhYlN0b3BzIHRhYlN0b3BzLCBib29sZWFuIGZ1bGwpIHsKKyAgICAgICAgaW50IHN0YXJ0ID0gZ2V0TGluZVN0YXJ0KGxpbmUpOworICAgICAgICBpbnQgZW5kID0gZnVsbCA/IGdldExpbmVFbmQobGluZSkgOiBnZXRMaW5lVmlzaWJsZUVuZChsaW5lKTsKKyAgICAgICAgYm9vbGVhbiBoYXNUYWJzT3JFbW9qaSA9IGdldExpbmVDb250YWluc1RhYihsaW5lKTsKKyAgICAgICAgRGlyZWN0aW9ucyBkaXJlY3Rpb25zID0gZ2V0TGluZURpcmVjdGlvbnMobGluZSk7CisgICAgICAgIGludCBkaXIgPSBnZXRQYXJhZ3JhcGhEaXJlY3Rpb24obGluZSk7CisKKyAgICAgICAgVGV4dExpbmUgdGwgPSBUZXh0TGluZS5vYnRhaW4oKTsKKyAgICAgICAgdGwuc2V0KG1QYWludCwgbVRleHQsIHN0YXJ0LCBlbmQsIGRpciwgZGlyZWN0aW9ucywgaGFzVGFic09yRW1vamksIHRhYlN0b3BzKTsKKyAgICAgICAgZmxvYXQgd2lkdGggPSB0bC5tZXRyaWNzKG51bGwpOworICAgICAgICBUZXh0TGluZS5yZWN5Y2xlKHRsKTsKKyAgICAgICAgcmV0dXJuIHdpZHRoOwogICAgIH0KIAogICAgIC8qKgpAQCAtNzM4LDcgKzkwNSw3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0IHRoZSBjaGFyYWN0ZXIgb2Zmc2V0IG9uIHRoZSBzcGVjZmllZCBsaW5lIHdob3NlIHBvc2l0aW9uIGlzCisgICAgICogR2V0IHRoZSBjaGFyYWN0ZXIgb2Zmc2V0IG9uIHRoZSBzcGVjaWZpZWQgbGluZSB3aG9zZSBwb3NpdGlvbiBpcwogICAgICAqIGNsb3Nlc3QgdG8gdGhlIHNwZWNpZmllZCBob3Jpem9udGFsIHBvc2l0aW9uLgogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0T2Zmc2V0Rm9ySG9yaXpvbnRhbChpbnQgbGluZSwgZmxvYXQgaG9yaXopIHsKQEAgLTc1MiwxNCArOTE5LDEzIEBACiAgICAgICAgIGludCBiZXN0ID0gbWluOwogICAgICAgICBmbG9hdCBiZXN0ZGlzdCA9IE1hdGguYWJzKGdldFByaW1hcnlIb3Jpem9udGFsKGJlc3QpIC0gaG9yaXopOwogCi0gICAgICAgIGludCBoZXJlID0gbWluOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRpcnMubURpcmVjdGlvbnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGludCB0aGVyZSA9IGhlcmUgKyBkaXJzLm1EaXJlY3Rpb25zW2ldOwotICAgICAgICAgICAgaW50IHN3YXAgPSAoKGkgJiAxKSA9PSAwKSA/IDEgOiAtMTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkaXJzLm1EaXJlY3Rpb25zLmxlbmd0aDsgaSArPSAyKSB7CisgICAgICAgICAgICBpbnQgaGVyZSA9IG1pbiArIGRpcnMubURpcmVjdGlvbnNbaV07CisgICAgICAgICAgICBpbnQgdGhlcmUgPSBoZXJlICsgKGRpcnMubURpcmVjdGlvbnNbaSsxXSAmIFJVTl9MRU5HVEhfTUFTSyk7CisgICAgICAgICAgICBpbnQgc3dhcCA9IChkaXJzLm1EaXJlY3Rpb25zW2krMV0gJiBSVU5fUlRMX0ZMQUcpICE9IDAgPyAtMSA6IDE7CiAKICAgICAgICAgICAgIGlmICh0aGVyZSA+IG1heCkKICAgICAgICAgICAgICAgICB0aGVyZSA9IG1heDsKLQogICAgICAgICAgICAgaW50IGhpZ2ggPSB0aGVyZSAtIDEgKyAxLCBsb3cgPSBoZXJlICsgMSAtIDEsIGd1ZXNzOwogCiAgICAgICAgICAgICB3aGlsZSAoaGlnaCAtIGxvdyA+IDEpIHsKQEAgLTc5Miw3ICs5NTgsNyBAQAogCiAgICAgICAgICAgICAgICAgaWYgKGRpc3QgPCBiZXN0ZGlzdCkgewogICAgICAgICAgICAgICAgICAgICBiZXN0ZGlzdCA9IGRpc3Q7Ci0gICAgICAgICAgICAgICAgICAgIGJlc3QgPSBsb3c7ICAgCisgICAgICAgICAgICAgICAgICAgIGJlc3QgPSBsb3c7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCkBAIC04MDIsOCArOTY4LDYgQEAKICAgICAgICAgICAgICAgICBiZXN0ZGlzdCA9IGRpc3Q7CiAgICAgICAgICAgICAgICAgYmVzdCA9IGhlcmU7CiAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGhlcmUgPSB0aGVyZTsKICAgICAgICAgfQogCiAgICAgICAgIGZsb2F0IGRpc3QgPSBNYXRoLmFicyhnZXRQcmltYXJ5SG9yaXpvbnRhbChtYXgpIC0gaG9yaXopOwpAQCAtODIzLDE5ICs5ODcsMTUgQEAKICAgICAgICAgcmV0dXJuIGdldExpbmVTdGFydChsaW5lICsgMSk7CiAgICAgfQogCi0gICAgLyoqIAorICAgIC8qKgogICAgICAqIFJldHVybiB0aGUgdGV4dCBvZmZzZXQgYWZ0ZXIgdGhlIGxhc3QgdmlzaWJsZSBjaGFyYWN0ZXIgKHNvIHdoaXRlc3BhY2UKICAgICAgKiBpcyBub3QgY291bnRlZCkgb24gdGhlIHNwZWNpZmllZCBsaW5lLgogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0TGluZVZpc2libGVFbmQoaW50IGxpbmUpIHsKICAgICAgICAgcmV0dXJuIGdldExpbmVWaXNpYmxlRW5kKGxpbmUsIGdldExpbmVTdGFydChsaW5lKSwgZ2V0TGluZVN0YXJ0KGxpbmUrMSkpOwogICAgIH0KLSAgICAKLSAgICBwcml2YXRlIGludCBnZXRMaW5lVmlzaWJsZUVuZChpbnQgbGluZSwgaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ci0gICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoZ2V0TGluZVN0YXJ0KGxpbmUpID09IHN0YXJ0ICYmIGdldExpbmVTdGFydChsaW5lKzEpID09IGVuZCk7Ci0gICAgICAgIH0KIAorICAgIHByaXZhdGUgaW50IGdldExpbmVWaXNpYmxlRW5kKGludCBsaW5lLCBpbnQgc3RhcnQsIGludCBlbmQpIHsKICAgICAgICAgQ2hhclNlcXVlbmNlIHRleHQgPSBtVGV4dDsKICAgICAgICAgY2hhciBjaDsKICAgICAgICAgaWYgKGxpbmUgPT0gZ2V0TGluZUNvdW50KCkgLSAxKSB7CkBAIC04ODIsMjA3ICsxMDQyLDYyIEBACiAgICAgICAgIHJldHVybiBnZXRMaW5lVG9wKGxpbmUpIC0gKGdldExpbmVUb3AobGluZSsxKSAtIGdldExpbmVEZXNjZW50KGxpbmUpKTsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIHRleHQgb2Zmc2V0IHRoYXQgd291bGQgYmUgcmVhY2hlZCBieSBtb3ZpbmcgbGVmdAotICAgICAqIChwb3NzaWJseSBvbnRvIGFub3RoZXIgbGluZSkgZnJvbSB0aGUgc3BlY2lmaWVkIG9mZnNldC4KLSAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldE9mZnNldFRvTGVmdE9mKGludCBvZmZzZXQpIHsKLSAgICAgICAgaW50IGxpbmUgPSBnZXRMaW5lRm9yT2Zmc2V0KG9mZnNldCk7Ci0gICAgICAgIGludCBzdGFydCA9IGdldExpbmVTdGFydChsaW5lKTsKLSAgICAgICAgaW50IGVuZCA9IGdldExpbmVFbmQobGluZSk7Ci0gICAgICAgIERpcmVjdGlvbnMgZGlycyA9IGdldExpbmVEaXJlY3Rpb25zKGxpbmUpOwotCi0gICAgICAgIGlmIChsaW5lICE9IGdldExpbmVDb3VudCgpIC0gMSkKLSAgICAgICAgICAgIGVuZC0tOwotCi0gICAgICAgIGZsb2F0IGhvcml6ID0gZ2V0UHJpbWFyeUhvcml6b250YWwob2Zmc2V0KTsKLQotICAgICAgICBpbnQgYmVzdCA9IG9mZnNldDsKLSAgICAgICAgZmxvYXQgYmVzdGggPSBJbnRlZ2VyLk1JTl9WQUxVRTsKLSAgICAgICAgaW50IGNhbmRpZGF0ZTsKLQotICAgICAgICBjYW5kaWRhdGUgPSBUZXh0VXRpbHMuZ2V0T2Zmc2V0QmVmb3JlKG1UZXh0LCBvZmZzZXQpOwotICAgICAgICBpZiAoY2FuZGlkYXRlID49IHN0YXJ0ICYmIGNhbmRpZGF0ZSA8PSBlbmQpIHsKLSAgICAgICAgICAgIGZsb2F0IGggPSBnZXRQcmltYXJ5SG9yaXpvbnRhbChjYW5kaWRhdGUpOwotCi0gICAgICAgICAgICBpZiAoaCA8IGhvcml6ICYmIGggPiBiZXN0aCkgewotICAgICAgICAgICAgICAgIGJlc3QgPSBjYW5kaWRhdGU7Ci0gICAgICAgICAgICAgICAgYmVzdGggPSBoOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgY2FuZGlkYXRlID0gVGV4dFV0aWxzLmdldE9mZnNldEFmdGVyKG1UZXh0LCBvZmZzZXQpOwotICAgICAgICBpZiAoY2FuZGlkYXRlID49IHN0YXJ0ICYmIGNhbmRpZGF0ZSA8PSBlbmQpIHsKLSAgICAgICAgICAgIGZsb2F0IGggPSBnZXRQcmltYXJ5SG9yaXpvbnRhbChjYW5kaWRhdGUpOwotCi0gICAgICAgICAgICBpZiAoaCA8IGhvcml6ICYmIGggPiBiZXN0aCkgewotICAgICAgICAgICAgICAgIGJlc3QgPSBjYW5kaWRhdGU7Ci0gICAgICAgICAgICAgICAgYmVzdGggPSBoOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGhlcmUgPSBzdGFydDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkaXJzLm1EaXJlY3Rpb25zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpbnQgdGhlcmUgPSBoZXJlICsgZGlycy5tRGlyZWN0aW9uc1tpXTsKLSAgICAgICAgICAgIGlmICh0aGVyZSA+IGVuZCkKLSAgICAgICAgICAgICAgICB0aGVyZSA9IGVuZDsKLQotICAgICAgICAgICAgZmxvYXQgaCA9IGdldFByaW1hcnlIb3Jpem9udGFsKGhlcmUpOwotCi0gICAgICAgICAgICBpZiAoaCA8IGhvcml6ICYmIGggPiBiZXN0aCkgewotICAgICAgICAgICAgICAgIGJlc3QgPSBoZXJlOwotICAgICAgICAgICAgICAgIGJlc3RoID0gaDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FuZGlkYXRlID0gVGV4dFV0aWxzLmdldE9mZnNldEFmdGVyKG1UZXh0LCBoZXJlKTsKLSAgICAgICAgICAgIGlmIChjYW5kaWRhdGUgPj0gc3RhcnQgJiYgY2FuZGlkYXRlIDw9IGVuZCkgewotICAgICAgICAgICAgICAgIGggPSBnZXRQcmltYXJ5SG9yaXpvbnRhbChjYW5kaWRhdGUpOwotCi0gICAgICAgICAgICAgICAgaWYgKGggPCBob3JpeiAmJiBoID4gYmVzdGgpIHsKLSAgICAgICAgICAgICAgICAgICAgYmVzdCA9IGNhbmRpZGF0ZTsKLSAgICAgICAgICAgICAgICAgICAgYmVzdGggPSBoOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FuZGlkYXRlID0gVGV4dFV0aWxzLmdldE9mZnNldEJlZm9yZShtVGV4dCwgdGhlcmUpOwotICAgICAgICAgICAgaWYgKGNhbmRpZGF0ZSA+PSBzdGFydCAmJiBjYW5kaWRhdGUgPD0gZW5kKSB7Ci0gICAgICAgICAgICAgICAgaCA9IGdldFByaW1hcnlIb3Jpem9udGFsKGNhbmRpZGF0ZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoaCA8IGhvcml6ICYmIGggPiBiZXN0aCkgewotICAgICAgICAgICAgICAgICAgICBiZXN0ID0gY2FuZGlkYXRlOwotICAgICAgICAgICAgICAgICAgICBiZXN0aCA9IGg7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBoZXJlID0gdGhlcmU7Ci0gICAgICAgIH0KLQotICAgICAgICBmbG9hdCBoID0gZ2V0UHJpbWFyeUhvcml6b250YWwoZW5kKTsKLQotICAgICAgICBpZiAoaCA8IGhvcml6ICYmIGggPiBiZXN0aCkgewotICAgICAgICAgICAgYmVzdCA9IGVuZDsKLSAgICAgICAgICAgIGJlc3RoID0gaDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChiZXN0ICE9IG9mZnNldCkKLSAgICAgICAgICAgIHJldHVybiBiZXN0OwotCi0gICAgICAgIGludCBkaXIgPSBnZXRQYXJhZ3JhcGhEaXJlY3Rpb24obGluZSk7Ci0KLSAgICAgICAgaWYgKGRpciA+IDApIHsKLSAgICAgICAgICAgIGlmIChsaW5lID09IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIGJlc3Q7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgcmV0dXJuIGdldE9mZnNldEZvckhvcml6b250YWwobGluZSAtIDEsIDEwMDAwKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChsaW5lID09IGdldExpbmVDb3VudCgpIC0gMSkKLSAgICAgICAgICAgICAgICByZXR1cm4gYmVzdDsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0T2Zmc2V0Rm9ySG9yaXpvbnRhbChsaW5lICsgMSwgMTAwMDApOwotICAgICAgICB9CisgICAgICAgIHJldHVybiBnZXRPZmZzZXRUb0xlZnRSaWdodE9mKG9mZnNldCwgdHJ1ZSk7CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSB0ZXh0IG9mZnNldCB0aGF0IHdvdWxkIGJlIHJlYWNoZWQgYnkgbW92aW5nIHJpZ2h0Ci0gICAgICogKHBvc3NpYmx5IG9udG8gYW5vdGhlciBsaW5lKSBmcm9tIHRoZSBzcGVjaWZpZWQgb2Zmc2V0LgotICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0T2Zmc2V0VG9SaWdodE9mKGludCBvZmZzZXQpIHsKLSAgICAgICAgaW50IGxpbmUgPSBnZXRMaW5lRm9yT2Zmc2V0KG9mZnNldCk7Ci0gICAgICAgIGludCBzdGFydCA9IGdldExpbmVTdGFydChsaW5lKTsKLSAgICAgICAgaW50IGVuZCA9IGdldExpbmVFbmQobGluZSk7Ci0gICAgICAgIERpcmVjdGlvbnMgZGlycyA9IGdldExpbmVEaXJlY3Rpb25zKGxpbmUpOworICAgICAgICByZXR1cm4gZ2V0T2Zmc2V0VG9MZWZ0UmlnaHRPZihvZmZzZXQsIGZhbHNlKTsKKyAgICB9CiAKLSAgICAgICAgaWYgKGxpbmUgIT0gZ2V0TGluZUNvdW50KCkgLSAxKQotICAgICAgICAgICAgZW5kLS07CisgICAgcHJpdmF0ZSBpbnQgZ2V0T2Zmc2V0VG9MZWZ0UmlnaHRPZihpbnQgY2FyZXQsIGJvb2xlYW4gdG9MZWZ0KSB7CisgICAgICAgIGludCBsaW5lID0gZ2V0TGluZUZvck9mZnNldChjYXJldCk7CisgICAgICAgIGludCBsaW5lU3RhcnQgPSBnZXRMaW5lU3RhcnQobGluZSk7CisgICAgICAgIGludCBsaW5lRW5kID0gZ2V0TGluZUVuZChsaW5lKTsKKyAgICAgICAgaW50IGxpbmVEaXIgPSBnZXRQYXJhZ3JhcGhEaXJlY3Rpb24obGluZSk7CiAKLSAgICAgICAgZmxvYXQgaG9yaXogPSBnZXRQcmltYXJ5SG9yaXpvbnRhbChvZmZzZXQpOwotCi0gICAgICAgIGludCBiZXN0ID0gb2Zmc2V0OwotICAgICAgICBmbG9hdCBiZXN0aCA9IEludGVnZXIuTUFYX1ZBTFVFOwotICAgICAgICBpbnQgY2FuZGlkYXRlOwotCi0gICAgICAgIGNhbmRpZGF0ZSA9IFRleHRVdGlscy5nZXRPZmZzZXRCZWZvcmUobVRleHQsIG9mZnNldCk7Ci0gICAgICAgIGlmIChjYW5kaWRhdGUgPj0gc3RhcnQgJiYgY2FuZGlkYXRlIDw9IGVuZCkgewotICAgICAgICAgICAgZmxvYXQgaCA9IGdldFByaW1hcnlIb3Jpem9udGFsKGNhbmRpZGF0ZSk7Ci0KLSAgICAgICAgICAgIGlmIChoID4gaG9yaXogJiYgaCA8IGJlc3RoKSB7Ci0gICAgICAgICAgICAgICAgYmVzdCA9IGNhbmRpZGF0ZTsKLSAgICAgICAgICAgICAgICBiZXN0aCA9IGg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBjYW5kaWRhdGUgPSBUZXh0VXRpbHMuZ2V0T2Zmc2V0QWZ0ZXIobVRleHQsIG9mZnNldCk7Ci0gICAgICAgIGlmIChjYW5kaWRhdGUgPj0gc3RhcnQgJiYgY2FuZGlkYXRlIDw9IGVuZCkgewotICAgICAgICAgICAgZmxvYXQgaCA9IGdldFByaW1hcnlIb3Jpem9udGFsKGNhbmRpZGF0ZSk7Ci0KLSAgICAgICAgICAgIGlmIChoID4gaG9yaXogJiYgaCA8IGJlc3RoKSB7Ci0gICAgICAgICAgICAgICAgYmVzdCA9IGNhbmRpZGF0ZTsKLSAgICAgICAgICAgICAgICBiZXN0aCA9IGg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgaGVyZSA9IHN0YXJ0OwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRpcnMubURpcmVjdGlvbnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGludCB0aGVyZSA9IGhlcmUgKyBkaXJzLm1EaXJlY3Rpb25zW2ldOwotICAgICAgICAgICAgaWYgKHRoZXJlID4gZW5kKQotICAgICAgICAgICAgICAgIHRoZXJlID0gZW5kOwotCi0gICAgICAgICAgICBmbG9hdCBoID0gZ2V0UHJpbWFyeUhvcml6b250YWwoaGVyZSk7Ci0KLSAgICAgICAgICAgIGlmIChoID4gaG9yaXogJiYgaCA8IGJlc3RoKSB7Ci0gICAgICAgICAgICAgICAgYmVzdCA9IGhlcmU7Ci0gICAgICAgICAgICAgICAgYmVzdGggPSBoOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYW5kaWRhdGUgPSBUZXh0VXRpbHMuZ2V0T2Zmc2V0QWZ0ZXIobVRleHQsIGhlcmUpOwotICAgICAgICAgICAgaWYgKGNhbmRpZGF0ZSA+PSBzdGFydCAmJiBjYW5kaWRhdGUgPD0gZW5kKSB7Ci0gICAgICAgICAgICAgICAgaCA9IGdldFByaW1hcnlIb3Jpem9udGFsKGNhbmRpZGF0ZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoaCA+IGhvcml6ICYmIGggPCBiZXN0aCkgewotICAgICAgICAgICAgICAgICAgICBiZXN0ID0gY2FuZGlkYXRlOwotICAgICAgICAgICAgICAgICAgICBiZXN0aCA9IGg7CisgICAgICAgIGJvb2xlYW4gYWR2YW5jZSA9IHRvTGVmdCA9PSAobGluZURpciA9PSBESVJfUklHSFRfVE9fTEVGVCk7CisgICAgICAgIGlmIChjYXJldCA9PSAoYWR2YW5jZSA/IGxpbmVFbmQgOiBsaW5lU3RhcnQpKSB7CisgICAgICAgICAgICAvLyB3YWxraW5nIG9mZiBsaW5lLCBzbyBsb29rIGF0IHRoZSBsaW5lIHdlJ3JlIGhlYWRlZCB0bworICAgICAgICAgICAgaWYgKGNhcmV0ID09IGxpbmVTdGFydCkgeworICAgICAgICAgICAgICAgIGlmIChsaW5lID4gMCkgeworICAgICAgICAgICAgICAgICAgICAtLWxpbmU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhcmV0OyAvLyBhdCB2ZXJ5IHN0YXJ0LCBkb24ndCBtb3ZlCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAobGluZSA8IGdldExpbmVDb3VudCgpIC0gMSkgeworICAgICAgICAgICAgICAgICAgICArK2xpbmU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhcmV0OyAvLyBhdCB2ZXJ5IGVuZCwgZG9uJ3QgbW92ZQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgY2FuZGlkYXRlID0gVGV4dFV0aWxzLmdldE9mZnNldEJlZm9yZShtVGV4dCwgdGhlcmUpOwotICAgICAgICAgICAgaWYgKGNhbmRpZGF0ZSA+PSBzdGFydCAmJiBjYW5kaWRhdGUgPD0gZW5kKSB7Ci0gICAgICAgICAgICAgICAgaCA9IGdldFByaW1hcnlIb3Jpem9udGFsKGNhbmRpZGF0ZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoaCA+IGhvcml6ICYmIGggPCBiZXN0aCkgewotICAgICAgICAgICAgICAgICAgICBiZXN0ID0gY2FuZGlkYXRlOwotICAgICAgICAgICAgICAgICAgICBiZXN0aCA9IGg7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgbGluZVN0YXJ0ID0gZ2V0TGluZVN0YXJ0KGxpbmUpOworICAgICAgICAgICAgbGluZUVuZCA9IGdldExpbmVFbmQobGluZSk7CisgICAgICAgICAgICBpbnQgbmV3RGlyID0gZ2V0UGFyYWdyYXBoRGlyZWN0aW9uKGxpbmUpOworICAgICAgICAgICAgaWYgKG5ld0RpciAhPSBsaW5lRGlyKSB7CisgICAgICAgICAgICAgICAgLy8gdW51c3VhbCBjYXNlLiAgd2Ugd2FudCB0byB3YWxrIG9udG8gdGhlIGxpbmUsIGJ1dCBpdCBydW5zCisgICAgICAgICAgICAgICAgLy8gaW4gYSBkaWZmZXJlbnQgZGlyZWN0aW9uIHRoYW4gdGhpcyBvbmUsIHNvIHdlIGZha2UgbW92ZW1lbnQKKyAgICAgICAgICAgICAgICAvLyBpbiB0aGUgb3Bwb3NpdGUgZGlyZWN0aW9uLgorICAgICAgICAgICAgICAgIHRvTGVmdCA9ICF0b0xlZnQ7CisgICAgICAgICAgICAgICAgbGluZURpciA9IG5ld0RpcjsKICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaGVyZSA9IHRoZXJlOwogICAgICAgICB9CiAKLSAgICAgICAgZmxvYXQgaCA9IGdldFByaW1hcnlIb3Jpem9udGFsKGVuZCk7CisgICAgICAgIERpcmVjdGlvbnMgZGlyZWN0aW9ucyA9IGdldExpbmVEaXJlY3Rpb25zKGxpbmUpOwogCi0gICAgICAgIGlmIChoID4gaG9yaXogJiYgaCA8IGJlc3RoKSB7Ci0gICAgICAgICAgICBiZXN0ID0gZW5kOwotICAgICAgICAgICAgYmVzdGggPSBoOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGJlc3QgIT0gb2Zmc2V0KQotICAgICAgICAgICAgcmV0dXJuIGJlc3Q7Ci0KLSAgICAgICAgaW50IGRpciA9IGdldFBhcmFncmFwaERpcmVjdGlvbihsaW5lKTsKLQotICAgICAgICBpZiAoZGlyID4gMCkgewotICAgICAgICAgICAgaWYgKGxpbmUgPT0gZ2V0TGluZUNvdW50KCkgLSAxKQotICAgICAgICAgICAgICAgIHJldHVybiBiZXN0OwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHJldHVybiBnZXRPZmZzZXRGb3JIb3Jpem9udGFsKGxpbmUgKyAxLCAtMTAwMDApOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKGxpbmUgPT0gMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gYmVzdDsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0T2Zmc2V0Rm9ySG9yaXpvbnRhbChsaW5lIC0gMSwgLTEwMDAwKTsKLSAgICAgICAgfQorICAgICAgICBUZXh0TGluZSB0bCA9IFRleHRMaW5lLm9idGFpbigpOworICAgICAgICAvLyBYWFg6IHdlIGRvbid0IGNhcmUgYWJvdXQgdGFicworICAgICAgICB0bC5zZXQobVBhaW50LCBtVGV4dCwgbGluZVN0YXJ0LCBsaW5lRW5kLCBsaW5lRGlyLCBkaXJlY3Rpb25zLCBmYWxzZSwgbnVsbCk7CisgICAgICAgIGNhcmV0ID0gbGluZVN0YXJ0ICsgdGwuZ2V0T2Zmc2V0VG9MZWZ0UmlnaHRPZihjYXJldCAtIGxpbmVTdGFydCwgdG9MZWZ0KTsKKyAgICAgICAgdGwgPSBUZXh0TGluZS5yZWN5Y2xlKHRsKTsKKyAgICAgICAgcmV0dXJuIGNhcmV0OwogICAgIH0KIAogICAgIHByaXZhdGUgaW50IGdldE9mZnNldEF0U3RhcnRPZihpbnQgb2Zmc2V0KSB7CisgICAgICAgIC8vIFhYWCB0aGlzIHByb2JhYmx5IHNob3VsZCBza2lwIGxvY2FsIHJlb3JkZXJpbmdzIGFuZAorICAgICAgICAvLyB6ZXJvLXdpZHRoIGNoYXJhY3RlcnMsIGxvb2sgYXQgY2FsbGVycwogICAgICAgICBpZiAob2Zmc2V0ID09IDApCiAgICAgICAgICAgICByZXR1cm4gMDsKIApAQCAtMTExNSw3ICsxMTMwLDcgQEAKICAgICAvKioKICAgICAgKiBGaWxscyBpbiB0aGUgc3BlY2lmaWVkIFBhdGggd2l0aCBhIHJlcHJlc2VudGF0aW9uIG9mIGEgY3Vyc29yCiAgICAgICogYXQgdGhlIHNwZWNpZmllZCBvZmZzZXQuICBUaGlzIHdpbGwgb2Z0ZW4gYmUgYSB2ZXJ0aWNhbCBsaW5lCi0gICAgICogYnV0IGNhbiBiZSBtdWx0aXBsZSBkaXNjb250aW5vdXMgbGluZXMgaW4gdGV4dCB3aXRoIG11bHRpcGxlCisgICAgICogYnV0IGNhbiBiZSBtdWx0aXBsZSBkaXNjb250aW51b3VzIGxpbmVzIGluIHRleHQgd2l0aCBtdWx0aXBsZQogICAgICAqIGRpcmVjdGlvbmFsaXRpZXMuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgZ2V0Q3Vyc29yUGF0aChpbnQgcG9pbnQsIFBhdGggZGVzdCwKQEAgLTExMjcsNyArMTE0Miw4IEBACiAgICAgICAgIGludCBib3R0b20gPSBnZXRMaW5lVG9wKGxpbmUrMSk7CiAKICAgICAgICAgZmxvYXQgaDEgPSBnZXRQcmltYXJ5SG9yaXpvbnRhbChwb2ludCkgLSAwLjVmOwotICAgICAgICBmbG9hdCBoMiA9IGdldFNlY29uZGFyeUhvcml6b250YWwocG9pbnQpIC0gMC41ZjsKKyAgICAgICAgZmxvYXQgaDIgPSBpc0xldmVsQm91bmRhcnkocG9pbnQpID8KKyAgICAgICAgICAgICAgICAgICAgZ2V0U2Vjb25kYXJ5SG9yaXpvbnRhbChwb2ludCkgLSAwLjVmIDogaDE7CiAKICAgICAgICAgaW50IGNhcHMgPSBUZXh0S2V5TGlzdGVuZXIuZ2V0TWV0YVN0YXRlKGVkaXRpbmdCdWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXlFdmVudC5NRVRBX1NISUZUX09OKSB8CkBAIC0xMjA0LDkgKzEyMjAsMTAgQEAKICAgICAgICAgaWYgKGxpbmVlbmQgPiBsaW5lc3RhcnQgJiYgbVRleHQuY2hhckF0KGxpbmVlbmQgLSAxKSA9PSAnXG4nKQogICAgICAgICAgICAgbGluZWVuZC0tOwogCi0gICAgICAgIGludCBoZXJlID0gbGluZXN0YXJ0OwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRpcnMubURpcmVjdGlvbnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGludCB0aGVyZSA9IGhlcmUgKyBkaXJzLm1EaXJlY3Rpb25zW2ldOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRpcnMubURpcmVjdGlvbnMubGVuZ3RoOyBpICs9IDIpIHsKKyAgICAgICAgICAgIGludCBoZXJlID0gbGluZXN0YXJ0ICsgZGlycy5tRGlyZWN0aW9uc1tpXTsKKyAgICAgICAgICAgIGludCB0aGVyZSA9IGhlcmUgKyAoZGlycy5tRGlyZWN0aW9uc1tpKzFdICYgUlVOX0xFTkdUSF9NQVNLKTsKKwogICAgICAgICAgICAgaWYgKHRoZXJlID4gbGluZWVuZCkKICAgICAgICAgICAgICAgICB0aGVyZSA9IGxpbmVlbmQ7CiAKQEAgLTEyMTUsMTQgKzEyMzIsMTIgQEAKICAgICAgICAgICAgICAgICBpbnQgZW4gPSBNYXRoLm1pbihlbmQsIHRoZXJlKTsKIAogICAgICAgICAgICAgICAgIGlmIChzdCAhPSBlbikgewotICAgICAgICAgICAgICAgICAgICBmbG9hdCBoMSA9IGdldEhvcml6b250YWwoc3QsIGZhbHNlLCBmYWxzZSwgbGluZSk7Ci0gICAgICAgICAgICAgICAgICAgIGZsb2F0IGgyID0gZ2V0SG9yaXpvbnRhbChlbiwgdHJ1ZSwgZmFsc2UsIGxpbmUpOworICAgICAgICAgICAgICAgICAgICBmbG9hdCBoMSA9IGdldEhvcml6b250YWwoc3QsIGZhbHNlLCBsaW5lKTsKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgaDIgPSBnZXRIb3Jpem9udGFsKGVuLCB0cnVlLCBsaW5lKTsKIAogICAgICAgICAgICAgICAgICAgICBkZXN0LmFkZFJlY3QoaDEsIHRvcCwgaDIsIGJvdHRvbSwgUGF0aC5EaXJlY3Rpb24uQ1cpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaGVyZSA9IHRoZXJlOwogICAgICAgICB9CiAgICAgfQogCkBAIC0xMjU3LDcgKzEyNzIsNyBAQAogCiAgICAgICAgICAgICBhZGRTZWxlY3Rpb24oc3RhcnRsaW5lLCBzdGFydCwgZ2V0TGluZUVuZChzdGFydGxpbmUpLAogICAgICAgICAgICAgICAgICAgICAgICAgIHRvcCwgZ2V0TGluZUJvdHRvbShzdGFydGxpbmUpLCBkZXN0KTsKLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICBpZiAoZ2V0UGFyYWdyYXBoRGlyZWN0aW9uKHN0YXJ0bGluZSkgPT0gRElSX1JJR0hUX1RPX0xFRlQpCiAgICAgICAgICAgICAgICAgZGVzdC5hZGRSZWN0KGdldExpbmVMZWZ0KHN0YXJ0bGluZSksIHRvcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIGdldExpbmVCb3R0b20oc3RhcnRsaW5lKSwgUGF0aC5EaXJlY3Rpb24uQ1cpOwpAQCAtMTI5Myw3ICsxMzA4LDcgQEAKIAogICAgICAgICBpZiAobVNwYW5uZWRUZXh0KSB7CiAgICAgICAgICAgICBTcGFubmVkIHNwID0gKFNwYW5uZWQpIG1UZXh0OwotICAgICAgICAgICAgQWxpZ25tZW50U3BhbltdIHNwYW5zID0gc3AuZ2V0U3BhbnMoZ2V0TGluZVN0YXJ0KGxpbmUpLAorICAgICAgICAgICAgQWxpZ25tZW50U3BhbltdIHNwYW5zID0gZ2V0UGFyYWdyYXBoU3BhbnMoc3AsIGdldExpbmVTdGFydChsaW5lKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldExpbmVFbmQobGluZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGlnbm1lbnRTcGFuLmNsYXNzKTsKIApAQCAtMTMxMCw0MjIgKzEzMjUsMTczIEBACiAgICAgICogR2V0IHRoZSBsZWZ0IGVkZ2Ugb2YgdGhlIHNwZWNpZmllZCBwYXJhZ3JhcGgsIGluc2V0IGJ5IGxlZnQgbWFyZ2lucy4KICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgaW50IGdldFBhcmFncmFwaExlZnQoaW50IGxpbmUpIHsKLSAgICAgICAgaW50IGRpciA9IGdldFBhcmFncmFwaERpcmVjdGlvbihsaW5lKTsKLQogICAgICAgICBpbnQgbGVmdCA9IDA7Ci0KLSAgICAgICAgYm9vbGVhbiBwYXIgPSBmYWxzZTsKLSAgICAgICAgaW50IG9mZiA9IGdldExpbmVTdGFydChsaW5lKTsKLSAgICAgICAgaWYgKG9mZiA9PSAwIHx8IG1UZXh0LmNoYXJBdChvZmYgLSAxKSA9PSAnXG4nKQotICAgICAgICAgICAgcGFyID0gdHJ1ZTsKLQotICAgICAgICBpZiAoZGlyID09IERJUl9MRUZUX1RPX1JJR0hUKSB7Ci0gICAgICAgICAgICBpZiAobVNwYW5uZWRUZXh0KSB7Ci0gICAgICAgICAgICAgICAgU3Bhbm5lZCBzcCA9IChTcGFubmVkKSBtVGV4dDsKLSAgICAgICAgICAgICAgICBMZWFkaW5nTWFyZ2luU3BhbltdIHNwYW5zID0gc3AuZ2V0U3BhbnMoZ2V0TGluZVN0YXJ0KGxpbmUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRMaW5lRW5kKGxpbmUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMZWFkaW5nTWFyZ2luU3Bhbi5jbGFzcyk7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNwYW5zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gbWFyZ2luID0gcGFyOwotICAgICAgICAgICAgICAgICAgICBMZWFkaW5nTWFyZ2luU3BhbiBzcGFuID0gc3BhbnNbaV07Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzcGFuIGluc3RhbmNlb2YgTGVhZGluZ01hcmdpblNwYW4uTGVhZGluZ01hcmdpblNwYW4yKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQgPSAoKExlYWRpbmdNYXJnaW5TcGFuLkxlYWRpbmdNYXJnaW5TcGFuMilzcGFuKS5nZXRMZWFkaW5nTWFyZ2luTGluZUNvdW50KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW4gPSBjb3VudCA+PSBsaW5lOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGxlZnQgKz0gc3Bhbi5nZXRMZWFkaW5nTWFyZ2luKG1hcmdpbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQorICAgICAgICBpbnQgZGlyID0gZ2V0UGFyYWdyYXBoRGlyZWN0aW9uKGxpbmUpOworICAgICAgICBpZiAoZGlyID09IERJUl9SSUdIVF9UT19MRUZUIHx8ICFtU3Bhbm5lZFRleHQpIHsKKyAgICAgICAgICAgIHJldHVybiBsZWZ0OyAvLyBsZWFkaW5nIG1hcmdpbiBoYXMgbm8gaW1wYWN0LCBvciBubyBzdHlsZXMKICAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBsZWZ0OworICAgICAgICByZXR1cm4gZ2V0UGFyYWdyYXBoTGVhZGluZ01hcmdpbihsaW5lKTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBHZXQgdGhlIHJpZ2h0IGVkZ2Ugb2YgdGhlIHNwZWNpZmllZCBwYXJhZ3JhcGgsIGluc2V0IGJ5IHJpZ2h0IG1hcmdpbnMuCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIGludCBnZXRQYXJhZ3JhcGhSaWdodChpbnQgbGluZSkgewotICAgICAgICBpbnQgZGlyID0gZ2V0UGFyYWdyYXBoRGlyZWN0aW9uKGxpbmUpOwotCiAgICAgICAgIGludCByaWdodCA9IG1XaWR0aDsKLQotICAgICAgICBib29sZWFuIHBhciA9IGZhbHNlOwotICAgICAgICBpbnQgb2ZmID0gZ2V0TGluZVN0YXJ0KGxpbmUpOwotICAgICAgICBpZiAob2ZmID09IDAgfHwgbVRleHQuY2hhckF0KG9mZiAtIDEpID09ICdcbicpCi0gICAgICAgICAgICBwYXIgPSB0cnVlOwotCi0KLSAgICAgICAgaWYgKGRpciA9PSBESVJfUklHSFRfVE9fTEVGVCkgewotICAgICAgICAgICAgaWYgKG1TcGFubmVkVGV4dCkgewotICAgICAgICAgICAgICAgIFNwYW5uZWQgc3AgPSAoU3Bhbm5lZCkgbVRleHQ7Ci0gICAgICAgICAgICAgICAgTGVhZGluZ01hcmdpblNwYW5bXSBzcGFucyA9IHNwLmdldFNwYW5zKGdldExpbmVTdGFydChsaW5lKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TGluZUVuZChsaW5lKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGVhZGluZ01hcmdpblNwYW4uY2xhc3MpOwotCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzcGFucy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICByaWdodCAtPSBzcGFuc1tpXS5nZXRMZWFkaW5nTWFyZ2luKHBhcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQorICAgICAgICBpbnQgZGlyID0gZ2V0UGFyYWdyYXBoRGlyZWN0aW9uKGxpbmUpOworICAgICAgICBpZiAoZGlyID09IERJUl9MRUZUX1RPX1JJR0hUIHx8ICFtU3Bhbm5lZFRleHQpIHsKKyAgICAgICAgICAgIHJldHVybiByaWdodDsgLy8gbGVhZGluZyBtYXJnaW4gaGFzIG5vIGltcGFjdCwgb3Igbm8gc3R5bGVzCiAgICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmlnaHQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGRyYXdUZXh0KENhbnZhcyBjYW52YXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyU2VxdWVuY2UgdGV4dCwgaW50IHN0YXJ0LCBpbnQgZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRpciwgRGlyZWN0aW9ucyBkaXJlY3Rpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeCwgaW50IHRvcCwgaW50IHksIGludCBib3R0b20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXh0UGFpbnQgcGFpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXh0UGFpbnQgd29ya1BhaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBoYXNUYWJzLCBPYmplY3RbXSBwYXJzcGFucykgewotICAgICAgICBjaGFyW10gYnVmOwotICAgICAgICBpZiAoIWhhc1RhYnMpIHsKLSAgICAgICAgICAgIGlmIChkaXJlY3Rpb25zID09IERJUlNfQUxMX0xFRlRfVE9fUklHSFQpIHsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoRElSX0xFRlRfVE9fUklHSFQgPT0gZGlyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgU3R5bGVkLmRyYXdUZXh0KGNhbnZhcywgdGV4dCwgc3RhcnQsIGVuZCwgZGlyLCBmYWxzZSwgeCwgdG9wLCB5LCBib3R0b20sIHBhaW50LCB3b3JrUGFpbnQsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBidWYgPSBudWxsOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYnVmID0gVGV4dFV0aWxzLm9idGFpbihlbmQgLSBzdGFydCk7Ci0gICAgICAgICAgICBUZXh0VXRpbHMuZ2V0Q2hhcnModGV4dCwgc3RhcnQsIGVuZCwgYnVmLCAwKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZsb2F0IGggPSAwOwotCi0gICAgICAgIGludCBoZXJlID0gMDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkaXJlY3Rpb25zLm1EaXJlY3Rpb25zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpbnQgdGhlcmUgPSBoZXJlICsgZGlyZWN0aW9ucy5tRGlyZWN0aW9uc1tpXTsKLSAgICAgICAgICAgIGlmICh0aGVyZSA+IGVuZCAtIHN0YXJ0KQotICAgICAgICAgICAgICAgIHRoZXJlID0gZW5kIC0gc3RhcnQ7Ci0KLSAgICAgICAgICAgIGludCBzZWdzdGFydCA9IGhlcmU7Ci0gICAgICAgICAgICBmb3IgKGludCBqID0gaGFzVGFicyA/IGhlcmUgOiB0aGVyZTsgaiA8PSB0aGVyZTsgaisrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGogPT0gdGhlcmUgfHwgYnVmW2pdID09ICdcdCcpIHsKLSAgICAgICAgICAgICAgICAgICAgaCArPSBTdHlsZWQuZHJhd1RleHQoY2FudmFzLCB0ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCArIHNlZ3N0YXJ0LCBzdGFydCArIGosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpciwgKGkgJiAxKSAhPSAwLCB4ICsgaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wLCB5LCBib3R0b20sIHBhaW50LCB3b3JrUGFpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ICsgaiAhPSBlbmQpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChqICE9IHRoZXJlICYmIGJ1ZltqXSA9PSAnXHQnKQotICAgICAgICAgICAgICAgICAgICAgICAgaCA9IGRpciAqIG5leHRUYWIodGV4dCwgc3RhcnQsIGVuZCwgaCAqIGRpciwgcGFyc3BhbnMpOwotCi0gICAgICAgICAgICAgICAgICAgIHNlZ3N0YXJ0ID0gaiArIDE7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChoYXNUYWJzICYmIGJ1ZltqXSA+PSAweEQ4MDAgJiYgYnVmW2pdIDw9IDB4REZGRiAmJiBqICsgMSA8IHRoZXJlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBlbW9qaSA9IENoYXJhY3Rlci5jb2RlUG9pbnRBdChidWYsIGopOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChlbW9qaSA+PSBNSU5fRU1PSkkgJiYgZW1vamkgPD0gTUFYX0VNT0pJKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBCaXRtYXAgYm0gPSBFTU9KSV9GQUNUT1JZLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEJpdG1hcEZyb21BbmRyb2lkUHVhKGVtb2ppKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBoICs9IFN0eWxlZC5kcmF3VGV4dChjYW52YXMsIHRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgKyBzZWdzdGFydCwgc3RhcnQgKyBqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpciwgKGkgJiAxKSAhPSAwLCB4ICsgaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3AsIHksIGJvdHRvbSwgcGFpbnQsIHdvcmtQYWludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCArIGogIT0gZW5kKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtRW1vamlSZWN0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUVtb2ppUmVjdCA9IG5ldyBSZWN0RigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtQYWludC5zZXQocGFpbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0eWxlZC5tZWFzdXJlVGV4dChwYWludCwgd29ya1BhaW50LCB0ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCArIGosIHN0YXJ0ICsgaiArIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGJpdG1hcEhlaWdodCA9IGJtLmdldEhlaWdodCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHRleHRIZWlnaHQgPSAtd29ya1BhaW50LmFzY2VudCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHNjYWxlID0gdGV4dEhlaWdodCAvIGJpdG1hcEhlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB3aWR0aCA9IGJtLmdldFdpZHRoKCkgKiBzY2FsZTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1FbW9qaVJlY3Quc2V0KHggKyBoLCB5IC0gdGV4dEhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ICsgaCArIHdpZHRoLCB5KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbnZhcy5kcmF3Qml0bWFwKGJtLCBudWxsLCBtRW1vamlSZWN0LCBwYWludCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaCArPSB3aWR0aDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGorKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWdzdGFydCA9IGogKyAxOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBoZXJlID0gdGhlcmU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaGFzVGFicykKLSAgICAgICAgICAgIFRleHRVdGlscy5yZWN5Y2xlKGJ1Zik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmxvYXQgbWVhc3VyZVRleHQoVGV4dFBhaW50IHBhaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRQYWludCB3b3JrUGFpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhclNlcXVlbmNlIHRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0LCBpbnQgb2Zmc2V0LCBpbnQgZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkaXIsIERpcmVjdGlvbnMgZGlyZWN0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHRyYWlsaW5nLCBib29sZWFuIGFsdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGhhc1RhYnMsIE9iamVjdFtdIHRhYnMpIHsKLSAgICAgICAgY2hhcltdIGJ1ZiA9IG51bGw7Ci0KLSAgICAgICAgaWYgKGhhc1RhYnMpIHsKLSAgICAgICAgICAgIGJ1ZiA9IFRleHRVdGlscy5vYnRhaW4oZW5kIC0gc3RhcnQpOwotICAgICAgICAgICAgVGV4dFV0aWxzLmdldENoYXJzKHRleHQsIHN0YXJ0LCBlbmQsIGJ1ZiwgMCk7Ci0gICAgICAgIH0KLQotICAgICAgICBmbG9hdCBoID0gMDsKLQotICAgICAgICBpZiAoYWx0KSB7Ci0gICAgICAgICAgICBpZiAoZGlyID09IERJUl9SSUdIVF9UT19MRUZUKQotICAgICAgICAgICAgICAgIHRyYWlsaW5nID0gIXRyYWlsaW5nOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGhlcmUgPSAwOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRpcmVjdGlvbnMubURpcmVjdGlvbnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChhbHQpCi0gICAgICAgICAgICAgICAgdHJhaWxpbmcgPSAhdHJhaWxpbmc7Ci0KLSAgICAgICAgICAgIGludCB0aGVyZSA9IGhlcmUgKyBkaXJlY3Rpb25zLm1EaXJlY3Rpb25zW2ldOwotICAgICAgICAgICAgaWYgKHRoZXJlID4gZW5kIC0gc3RhcnQpCi0gICAgICAgICAgICAgICAgdGhlcmUgPSBlbmQgLSBzdGFydDsKLQotICAgICAgICAgICAgaW50IHNlZ3N0YXJ0ID0gaGVyZTsKLSAgICAgICAgICAgIGZvciAoaW50IGogPSBoYXNUYWJzID8gaGVyZSA6IHRoZXJlOyBqIDw9IHRoZXJlOyBqKyspIHsKLSAgICAgICAgICAgICAgICBpbnQgY29kZXB0ID0gMDsKLSAgICAgICAgICAgICAgICBCaXRtYXAgYm0gPSBudWxsOwotCi0gICAgICAgICAgICAgICAgaWYgKGhhc1RhYnMgJiYgaiA8IHRoZXJlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvZGVwdCA9IGJ1ZltqXTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoY29kZXB0ID49IDB4RDgwMCAmJiBjb2RlcHQgPD0gMHhERkZGICYmIGogKyAxIDwgdGhlcmUpIHsKLSAgICAgICAgICAgICAgICAgICAgY29kZXB0ID0gQ2hhcmFjdGVyLmNvZGVQb2ludEF0KGJ1Ziwgaik7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGVwdCA+PSBNSU5fRU1PSkkgJiYgY29kZXB0IDw9IE1BWF9FTU9KSSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYm0gPSBFTU9KSV9GQUNUT1JZLmdldEJpdG1hcEZyb21BbmRyb2lkUHVhKGNvZGVwdCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoaiA9PSB0aGVyZSB8fCBjb2RlcHQgPT0gJ1x0JyB8fCBibSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZsb2F0IHNlZ3c7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG9mZnNldCA8IHN0YXJ0ICsgaiB8fAotICAgICAgICAgICAgICAgICAgICAgICAodHJhaWxpbmcgJiYgb2Zmc2V0IDw9IHN0YXJ0ICsgaikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkaXIgPT0gRElSX0xFRlRfVE9fUklHSFQgJiYgKGkgJiAxKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaCArPSBTdHlsZWQubWVhc3VyZVRleHQocGFpbnQsIHdvcmtQYWludCwgdGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCArIHNlZ3N0YXJ0LCBvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGg7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkaXIgPT0gRElSX1JJR0hUX1RPX0xFRlQgJiYgKGkgJiAxKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaCAtPSBTdHlsZWQubWVhc3VyZVRleHQocGFpbnQsIHdvcmtQYWludCwgdGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCArIHNlZ3N0YXJ0LCBvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGg7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBzZWd3ID0gU3R5bGVkLm1lYXN1cmVUZXh0KHBhaW50LCB3b3JrUGFpbnQsIHRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgKyBzZWdzdGFydCwgc3RhcnQgKyBqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgPCBzdGFydCArIGogfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICh0cmFpbGluZyAmJiBvZmZzZXQgPD0gc3RhcnQgKyBqKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpciA9PSBESVJfTEVGVF9UT19SSUdIVCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGggKz0gc2VndyAtIFN0eWxlZC5tZWFzdXJlVGV4dChwYWludCwgd29ya1BhaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCArIHNlZ3N0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsIG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBoOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGlyID09IERJUl9SSUdIVF9UT19MRUZUKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaCAtPSBzZWd3IC0gU3R5bGVkLm1lYXN1cmVUZXh0KHBhaW50LCB3b3JrUGFpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ICsgc2Vnc3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGg7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAoZGlyID09IERJUl9SSUdIVF9UT19MRUZUKQotICAgICAgICAgICAgICAgICAgICAgICAgaCAtPSBzZWd3OwotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBoICs9IHNlZ3c7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGogIT0gdGhlcmUgJiYgYnVmW2pdID09ICdcdCcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgPT0gc3RhcnQgKyBqKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBoOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBoID0gZGlyICogbmV4dFRhYih0ZXh0LCBzdGFydCwgZW5kLCBoICogZGlyLCB0YWJzKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmIChibSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3b3JrUGFpbnQuc2V0KHBhaW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0eWxlZC5tZWFzdXJlVGV4dChwYWludCwgd29ya1BhaW50LCB0ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGosIGogKyAyLCBudWxsKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgd2lkID0gKGZsb2F0KSBibS5nZXRXaWR0aCgpICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC13b3JrUGFpbnQuYXNjZW50KCkgLyBibS5nZXRIZWlnaHQoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpciA9PSBESVJfUklHSFRfVE9fTEVGVCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGggLT0gd2lkOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBoICs9IHdpZDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaisrOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgc2Vnc3RhcnQgPSBqICsgMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGhlcmUgPSB0aGVyZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChoYXNUYWJzKQotICAgICAgICAgICAgVGV4dFV0aWxzLnJlY3ljbGUoYnVmKTsKLQotICAgICAgICByZXR1cm4gaDsKKyAgICAgICAgcmV0dXJuIHJpZ2h0IC0gZ2V0UGFyYWdyYXBoTGVhZGluZ01hcmdpbihsaW5lKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBNZWFzdXJlIHdpZHRoIG9mIGEgcnVuIG9mIHRleHQgb24gYSBzaW5nbGUgbGluZSB0aGF0IGlzIGtub3duIHRvIGFsbCBiZQotICAgICAqIGluIHRoZSBzYW1lIGRpcmVjdGlvbiBhcyB0aGUgcGFyYWdyYXBoIGJhc2UgZGlyZWN0aW9uLiBSZXR1cm5zIHRoZSB3aWR0aCwKLSAgICAgKiBhbmQgdGhlIGxpbmUgbWV0cmljcyBpbiBmbSBpZiBmbSBpcyBub3QgbnVsbC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYWludCB0aGUgcGFpbnQgZm9yIHRoZSB0ZXh0OyB3aWxsIG5vdCBiZSBtb2RpZmllZAotICAgICAqIEBwYXJhbSB3b3JrUGFpbnQgcGFpbnQgYXZhaWxhYmxlIGZvciBtb2RpZmljYXRpb24KLSAgICAgKiBAcGFyYW0gdGV4dCB0ZXh0Ci0gICAgICogQHBhcmFtIHN0YXJ0IHN0YXJ0IG9mIHRoZSBsaW5lCi0gICAgICogQHBhcmFtIGVuZCBsaW1pdCBvZiB0aGUgbGluZQotICAgICAqIEBwYXJhbSBmbSBvYmplY3QgdG8gcmV0dXJuIGludGVnZXIgbWV0cmljcyBpbiwgY2FuIGJlIG51bGwKLSAgICAgKiBAcGFyYW0gaGFzVGFicyB0cnVlIGlmIGl0IGlzIGtub3duIHRoYXQgdGhlIGxpbmUgaGFzIHRhYnMKLSAgICAgKiBAcGFyYW0gdGFicyB0YWIgcG9zaXRpb24gaW5mb3JtYXRpb24KLSAgICAgKiBAcmV0dXJuIHRoZSB3aWR0aCBvZiB0aGUgdGV4dCBmcm9tIHN0YXJ0IHRvIGVuZAorICAgICAqIFJldHVybnMgdGhlIGVmZmVjdGl2ZSBsZWFkaW5nIG1hcmdpbiAodW5zaWduZWQpIGZvciB0aGlzIGxpbmUsCisgICAgICogdGFraW5nIGludG8gYWNjb3VudCBMZWFkaW5nTWFyZ2luU3BhbiBhbmQgTGVhZGluZ01hcmdpblNwYW4yLgorICAgICAqIEBwYXJhbSBsaW5lIHRoZSBsaW5lIGluZGV4CisgICAgICogQHJldHVybiB0aGUgbGVhZGluZyBtYXJnaW4gb2YgdGhpcyBsaW5lCiAgICAgICovCi0gICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmxvYXQgbWVhc3VyZVRleHQoVGV4dFBhaW50IHBhaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRQYWludCB3b3JrUGFpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhclNlcXVlbmNlIHRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0LCBpbnQgZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhaW50LkZvbnRNZXRyaWNzSW50IGZtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaGFzVGFicywgT2JqZWN0W10gdGFicykgewotICAgICAgICBjaGFyW10gYnVmID0gbnVsbDsKLSAgCi0gICAgICAgIGlmIChoYXNUYWJzKSB7Ci0gICAgICAgICAgICBidWYgPSBUZXh0VXRpbHMub2J0YWluKGVuZCAtIHN0YXJ0KTsKLSAgICAgICAgICAgIFRleHRVdGlscy5nZXRDaGFycyh0ZXh0LCBzdGFydCwgZW5kLCBidWYsIDApOworICAgIHByaXZhdGUgaW50IGdldFBhcmFncmFwaExlYWRpbmdNYXJnaW4oaW50IGxpbmUpIHsKKyAgICAgICAgaWYgKCFtU3Bhbm5lZFRleHQpIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIFNwYW5uZWQgc3Bhbm5lZCA9IChTcGFubmVkKSBtVGV4dDsKKworICAgICAgICBpbnQgbGluZVN0YXJ0ID0gZ2V0TGluZVN0YXJ0KGxpbmUpOworICAgICAgICBpbnQgbGluZUVuZCA9IGdldExpbmVFbmQobGluZSk7CisgICAgICAgIGludCBzcGFuRW5kID0gc3Bhbm5lZC5uZXh0U3BhblRyYW5zaXRpb24obGluZVN0YXJ0LCBsaW5lRW5kLAorICAgICAgICAgICAgICAgIExlYWRpbmdNYXJnaW5TcGFuLmNsYXNzKTsKKyAgICAgICAgTGVhZGluZ01hcmdpblNwYW5bXSBzcGFucyA9IGdldFBhcmFncmFwaFNwYW5zKHNwYW5uZWQsIGxpbmVTdGFydCwgc3BhbkVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExlYWRpbmdNYXJnaW5TcGFuLmNsYXNzKTsKKyAgICAgICAgaWYgKHNwYW5zLmxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gMDsgLy8gbm8gbGVhZGluZyBtYXJnaW4gc3BhbjsKICAgICAgICAgfQogCi0gICAgICAgIGludCBsZW4gPSBlbmQgLSBzdGFydDsKKyAgICAgICAgaW50IG1hcmdpbiA9IDA7CiAKLSAgICAgICAgaW50IGxhc3RQb3MgPSAwOwotICAgICAgICBmbG9hdCB3aWR0aCA9IDA7Ci0gICAgICAgIGludCBhc2NlbnQgPSAwLCBkZXNjZW50ID0gMCwgdG9wID0gMCwgYm90dG9tID0gMDsKKyAgICAgICAgYm9vbGVhbiBpc0ZpcnN0UGFyYUxpbmUgPSBsaW5lU3RhcnQgPT0gMCB8fAorICAgICAgICAgICAgc3Bhbm5lZC5jaGFyQXQobGluZVN0YXJ0IC0gMSkgPT0gJ1xuJzsKIAotICAgICAgICBpZiAoZm0gIT0gbnVsbCkgewotICAgICAgICAgICAgZm0uYXNjZW50ID0gMDsKLSAgICAgICAgICAgIGZtLmRlc2NlbnQgPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChpbnQgcG9zID0gaGFzVGFicyA/IDAgOiBsZW47IHBvcyA8PSBsZW47IHBvcysrKSB7Ci0gICAgICAgICAgICBpbnQgY29kZXB0ID0gMDsKLSAgICAgICAgICAgIEJpdG1hcCBibSA9IG51bGw7Ci0KLSAgICAgICAgICAgIGlmIChoYXNUYWJzICYmIHBvcyA8IGxlbikgewotICAgICAgICAgICAgICAgIGNvZGVwdCA9IGJ1Zltwb3NdOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNwYW5zLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBMZWFkaW5nTWFyZ2luU3BhbiBzcGFuID0gc3BhbnNbaV07CisgICAgICAgICAgICBib29sZWFuIHVzZUZpcnN0TGluZU1hcmdpbiA9IGlzRmlyc3RQYXJhTGluZTsKKyAgICAgICAgICAgIGlmIChzcGFuIGluc3RhbmNlb2YgTGVhZGluZ01hcmdpblNwYW4yKSB7CisgICAgICAgICAgICAgICAgaW50IHNwU3RhcnQgPSBzcGFubmVkLmdldFNwYW5TdGFydChzcGFuKTsKKyAgICAgICAgICAgICAgICBpbnQgc3BhbkxpbmUgPSBnZXRMaW5lRm9yT2Zmc2V0KHNwU3RhcnQpOworICAgICAgICAgICAgICAgIGludCBjb3VudCA9ICgoTGVhZGluZ01hcmdpblNwYW4yKXNwYW4pLmdldExlYWRpbmdNYXJnaW5MaW5lQ291bnQoKTsKKyAgICAgICAgICAgICAgICB1c2VGaXJzdExpbmVNYXJnaW4gPSBsaW5lIDwgc3BhbkxpbmUgKyBjb3VudDsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hcmdpbiArPSBzcGFuLmdldExlYWRpbmdNYXJnaW4odXNlRmlyc3RMaW5lTWFyZ2luKTsKKyAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAoY29kZXB0ID49IDB4RDgwMCAmJiBjb2RlcHQgPD0gMHhERkZGICYmIHBvcyA8IGxlbikgewotICAgICAgICAgICAgICAgIGNvZGVwdCA9IENoYXJhY3Rlci5jb2RlUG9pbnRBdChidWYsIHBvcyk7CisgICAgICAgIHJldHVybiBtYXJnaW47CisgICAgfQogCi0gICAgICAgICAgICAgICAgaWYgKGNvZGVwdCA+PSBNSU5fRU1PSkkgJiYgY29kZXB0IDw9IE1BWF9FTU9KSSkgewotICAgICAgICAgICAgICAgICAgICBibSA9IEVNT0pJX0ZBQ1RPUlkuZ2V0Qml0bWFwRnJvbUFuZHJvaWRQdWEoY29kZXB0KTsKKyAgICAvKiBwYWNrYWdlICovCisgICAgc3RhdGljIGZsb2F0IG1lYXN1cmVQYXJhKFRleHRQYWludCBwYWludCwgVGV4dFBhaW50IHdvcmtQYWludCwKKyAgICAgICAgICAgIENoYXJTZXF1ZW5jZSB0ZXh0LCBpbnQgc3RhcnQsIGludCBlbmQpIHsKKworICAgICAgICBNZWFzdXJlZFRleHQgbXQgPSBNZWFzdXJlZFRleHQub2J0YWluKCk7CisgICAgICAgIFRleHRMaW5lIHRsID0gVGV4dExpbmUub2J0YWluKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtdC5zZXRQYXJhKHRleHQsIHN0YXJ0LCBlbmQsIERJUl9SRVFVRVNUX0xUUik7CisgICAgICAgICAgICBEaXJlY3Rpb25zIGRpcmVjdGlvbnM7CisgICAgICAgICAgICBpbnQgZGlyOworICAgICAgICAgICAgaWYgKG10Lm1FYXN5KSB7CisgICAgICAgICAgICAgICAgZGlyZWN0aW9ucyA9IERJUlNfQUxMX0xFRlRfVE9fUklHSFQ7CisgICAgICAgICAgICAgICAgZGlyID0gTGF5b3V0LkRJUl9MRUZUX1RPX1JJR0hUOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBkaXJlY3Rpb25zID0gQW5kcm9pZEJpZGkuZGlyZWN0aW9ucyhtdC5tRGlyLCBtdC5tTGV2ZWxzLAorICAgICAgICAgICAgICAgICAgICAwLCBtdC5tQ2hhcnMsIDAsIG10Lm1MZW4pOworICAgICAgICAgICAgICAgIGRpciA9IG10Lm1EaXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjaGFyW10gY2hhcnMgPSBtdC5tQ2hhcnM7CisgICAgICAgICAgICBpbnQgbGVuID0gbXQubUxlbjsKKyAgICAgICAgICAgIGJvb2xlYW4gaGFzVGFicyA9IGZhbHNlOworICAgICAgICAgICAgVGFiU3RvcHMgdGFiU3RvcHMgPSBudWxsOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47ICsraSkgeworICAgICAgICAgICAgICAgIGlmIChjaGFyc1tpXSA9PSAnXHQnKSB7CisgICAgICAgICAgICAgICAgICAgIGhhc1RhYnMgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBpZiAodGV4dCBpbnN0YW5jZW9mIFNwYW5uZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNwYW5uZWQgc3Bhbm5lZCA9IChTcGFubmVkKSB0ZXh0OworICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5FbmQgPSBzcGFubmVkLm5leHRTcGFuVHJhbnNpdGlvbihzdGFydCwgZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYWJTdG9wU3Bhbi5jbGFzcyk7CisgICAgICAgICAgICAgICAgICAgICAgICBUYWJTdG9wU3BhbltdIHNwYW5zID0gZ2V0UGFyYWdyYXBoU3BhbnMoc3Bhbm5lZCwgc3RhcnQsIHNwYW5FbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhYlN0b3BTcGFuLmNsYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzcGFucy5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFiU3RvcHMgPSBuZXcgVGFiU3RvcHMoVEFCX0lOQ1JFTUVOVCwgc3BhbnMpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRsLnNldChwYWludCwgdGV4dCwgc3RhcnQsIGVuZCwgZGlyLCBkaXJlY3Rpb25zLCBoYXNUYWJzLCB0YWJTdG9wcyk7CisgICAgICAgICAgICByZXR1cm4gdGwubWV0cmljcyhudWxsKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIFRleHRMaW5lLnJlY3ljbGUodGwpOworICAgICAgICAgICAgTWVhc3VyZWRUZXh0LnJlY3ljbGUobXQpOworICAgICAgICB9CisgICAgfQogCi0gICAgICAgICAgICBpZiAocG9zID09IGxlbiB8fCBjb2RlcHQgPT0gJ1x0JyB8fCBibSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgd29ya1BhaW50LmJhc2VsaW5lU2hpZnQgPSAwOworICAgIC8qKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgLyogcGFja2FnZSAqLyBzdGF0aWMgY2xhc3MgVGFiU3RvcHMgeworICAgICAgICBwcml2YXRlIGludFtdIG1TdG9wczsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbU51bVN0b3BzOworICAgICAgICBwcml2YXRlIGludCBtSW5jcmVtZW50OwogCi0gICAgICAgICAgICAgICAgd2lkdGggKz0gU3R5bGVkLm1lYXN1cmVUZXh0KHBhaW50LCB3b3JrUGFpbnQsIHRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgKyBsYXN0UG9zLCBzdGFydCArIHBvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbSk7CisgICAgICAgIFRhYlN0b3BzKGludCBpbmNyZW1lbnQsIE9iamVjdFtdIHNwYW5zKSB7CisgICAgICAgICAgICByZXNldChpbmNyZW1lbnQsIHNwYW5zKTsKKyAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgaWYgKGZtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHdvcmtQYWludC5iYXNlbGluZVNoaWZ0IDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZm0uYXNjZW50ICs9IHdvcmtQYWludC5iYXNlbGluZVNoaWZ0OwotICAgICAgICAgICAgICAgICAgICAgICAgZm0udG9wICs9IHdvcmtQYWludC5iYXNlbGluZVNoaWZ0OwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgZm0uZGVzY2VudCArPSB3b3JrUGFpbnQuYmFzZWxpbmVTaGlmdDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZtLmJvdHRvbSArPSB3b3JrUGFpbnQuYmFzZWxpbmVTaGlmdDsKKyAgICAgICAgdm9pZCByZXNldChpbnQgaW5jcmVtZW50LCBPYmplY3RbXSBzcGFucykgeworICAgICAgICAgICAgdGhpcy5tSW5jcmVtZW50ID0gaW5jcmVtZW50OworCisgICAgICAgICAgICBpbnQgbnMgPSAwOworICAgICAgICAgICAgaWYgKHNwYW5zICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpbnRbXSBzdG9wcyA9IHRoaXMubVN0b3BzOworICAgICAgICAgICAgICAgIGZvciAoT2JqZWN0IG8gOiBzcGFucykgeworICAgICAgICAgICAgICAgICAgICBpZiAobyBpbnN0YW5jZW9mIFRhYlN0b3BTcGFuKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RvcHMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3BzID0gbmV3IGludFsxMF07CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5zID09IHN0b3BzLmxlbmd0aCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludFtdIG5zdG9wcyA9IG5ldyBpbnRbbnMgKiAyXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5zOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnN0b3BzW2ldID0gc3RvcHNbaV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3BzID0gbnN0b3BzOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgc3RvcHNbbnMrK10gPSAoKFRhYlN0b3BTcGFuKSBvKS5nZXRUYWJTdG9wKCk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAocG9zICE9IGxlbikgewotICAgICAgICAgICAgICAgICAgICBpZiAoYm0gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm8gZW1vamksIG11c3QgaGF2ZSBoaXQgYSB0YWIKLSAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoID0gbmV4dFRhYih0ZXh0LCBzdGFydCwgZW5kLCB3aWR0aCwgdGFicyk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIHNldHMgdXAgd29ya1BhaW50IHdpdGggdGhlIGZvbnQgb24gdGhlIGVtb2ppCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyB0ZXh0LCBzbyB0aGF0IHdlIGNhbiBleHRyYWN0IHRoZSBhc2NlbnQgYW5kIHNjYWxlLgotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBjYW4ndCB1c2UgdGhlIHJlc3VsdCBvZiB0aGUgcHJldmlvdXMgY2FsbCB0bwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWVhc3VyZVRleHQgYmVjYXVzZSB0aGUgZW1vamkgbWlnaHQgaGF2ZSBpdHMgb3duIHN0eWxlLgotICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgaGF2ZSB0byBpbml0aWFsaXplIHdvcmtQYWludCBoZXJlIGJlY2F1c2UgaWYgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyB0ZXh0IGlzIHVuc3R5bGVkIG1lYXN1cmVUZXh0IG1pZ2h0IG5vdCB1c2Ugd29ya1BhaW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBhdCBhbGwuCi0gICAgICAgICAgICAgICAgICAgICAgICB3b3JrUGFpbnQuc2V0KHBhaW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0eWxlZC5tZWFzdXJlVGV4dChwYWludCwgd29ya1BhaW50LCB0ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ICsgcG9zLCBzdGFydCArIHBvcyArIDEsIG51bGwpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCArPSAoZmxvYXQpIGJtLmdldFdpZHRoKCkgKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLXdvcmtQYWludC5hc2NlbnQoKSAvIGJtLmdldEhlaWdodCgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBTaW5jZSB3ZSBoYWQgYW4gZW1vamksIHdlIGJ1bXAgcGFzdCB0aGUgc2Vjb25kIGhhbGYKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mIHRoZSBzdXJyb2dhdGUgcGFpci4KLSAgICAgICAgICAgICAgICAgICAgICAgIHBvcysrOwotICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG5zID4gMSkgeworICAgICAgICAgICAgICAgICAgICBBcnJheXMuc29ydChzdG9wcywgMCwgbnMpOwogICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChmbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmbS5hc2NlbnQgPCBhc2NlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFzY2VudCA9IGZtLmFzY2VudDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoZm0uZGVzY2VudCA+IGRlc2NlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NlbnQgPSBmbS5kZXNjZW50OwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGZtLnRvcCA8IHRvcCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdG9wID0gZm0udG9wOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmbS5ib3R0b20gPiBib3R0b20pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvdHRvbSA9IGZtLmJvdHRvbTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8vIE5vIG5lZWQgdG8gdGFrZSBiaXRtYXAgaGVpZ2h0IGludG8gYWNjb3VudCBoZXJlLAotICAgICAgICAgICAgICAgICAgICAvLyBzaW5jZSBpdCBpcyBzY2FsZWQgdG8gbWF0Y2ggdGhlIHRleHQgaGVpZ2h0LgorICAgICAgICAgICAgICAgIGlmIChzdG9wcyAhPSB0aGlzLm1TdG9wcykgeworICAgICAgICAgICAgICAgICAgICB0aGlzLm1TdG9wcyA9IHN0b3BzOwogICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGxhc3RQb3MgPSBwb3MgKyAxOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhpcy5tTnVtU3RvcHMgPSBuczsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChmbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmbS5hc2NlbnQgPSBhc2NlbnQ7Ci0gICAgICAgICAgICBmbS5kZXNjZW50ID0gZGVzY2VudDsKLSAgICAgICAgICAgIGZtLnRvcCA9IHRvcDsKLSAgICAgICAgICAgIGZtLmJvdHRvbSA9IGJvdHRvbTsKKyAgICAgICAgZmxvYXQgbmV4dFRhYihmbG9hdCBoKSB7CisgICAgICAgICAgICBpbnQgbnMgPSB0aGlzLm1OdW1TdG9wczsKKyAgICAgICAgICAgIGlmIChucyA+IDApIHsKKyAgICAgICAgICAgICAgICBpbnRbXSBzdG9wcyA9IHRoaXMubVN0b3BzOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnM7ICsraSkgeworICAgICAgICAgICAgICAgICAgICBpbnQgc3RvcCA9IHN0b3BzW2ldOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RvcCA+IGgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdG9wOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG5leHREZWZhdWx0U3RvcChoLCBtSW5jcmVtZW50KTsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChoYXNUYWJzKQotICAgICAgICAgICAgVGV4dFV0aWxzLnJlY3ljbGUoYnVmKTsKLQotICAgICAgICByZXR1cm4gd2lkdGg7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmxvYXQgbmV4dERlZmF1bHRTdG9wKGZsb2F0IGgsIGludCBpbmMpIHsKKyAgICAgICAgICAgIHJldHVybiAoKGludCkgKChoICsgaW5jKSAvIGluYykpICogaW5jOworICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCkBAIC0xNzQ3LDcgKzE1MTMsNyBAQAogCiAgICAgICAgIGlmICh0ZXh0IGluc3RhbmNlb2YgU3Bhbm5lZCkgewogICAgICAgICAgICAgaWYgKHRhYnMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRhYnMgPSAoKFNwYW5uZWQpIHRleHQpLmdldFNwYW5zKHN0YXJ0LCBlbmQsIFRhYlN0b3BTcGFuLmNsYXNzKTsKKyAgICAgICAgICAgICAgICB0YWJzID0gZ2V0UGFyYWdyYXBoU3BhbnMoKFNwYW5uZWQpIHRleHQsIHN0YXJ0LCBlbmQsIFRhYlN0b3BTcGFuLmNsYXNzKTsKICAgICAgICAgICAgICAgICBhbGx0YWJzID0gdHJ1ZTsKICAgICAgICAgICAgIH0KIApAQCAtMTc3NCw2ICsxNTQwLDM4IEBACiAgICAgICAgIHJldHVybiBtU3Bhbm5lZFRleHQ7CiAgICAgfQogCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgc2FtZSBhcyA8Y29kZT50ZXh0LmdldFNwYW5zKCk8L2NvZGU+LCBleGNlcHQgd2hlcmUKKyAgICAgKiA8Y29kZT5zdGFydDwvY29kZT4gYW5kIDxjb2RlPmVuZDwvY29kZT4gYXJlIHRoZSBzYW1lIGFuZCBhcmUgbm90CisgICAgICogYXQgdGhlIHZlcnkgYmVnaW5uaW5nIG9mIHRoZSB0ZXh0LCBpbiB3aGljaCBjYXNlIGFuIGVtcHR5IGFycmF5CisgICAgICogaXMgcmV0dXJuZWQgaW5zdGVhZC4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIGlzIG5lZWRlZCBiZWNhdXNlIG9mIHRoZSBzcGVjaWFsIGNhc2UgdGhhdCA8Y29kZT5nZXRTcGFucygpPC9jb2RlPgorICAgICAqIG9uIGFuIGVtcHR5IHJhbmdlIHJldHVybnMgdGhlIHNwYW5zIGFkamFjZW50IHRvIHRoYXQgcmFuZ2UsIHdoaWNoIGlzCisgICAgICogcHJpbWFyaWx5IGZvciB0aGUgc2FrZSBvZiA8Y29kZT5UZXh0V2F0Y2hlcnM8L2NvZGU+IHNvIHRoZXkgd2lsbCBnZXQKKyAgICAgKiBub3RpZmljYXRpb25zIHdoZW4gdGV4dCBnb2VzIGZyb20gZW1wdHkgdG8gbm9uLWVtcHR5LiAgQnV0IGl0IGFsc28KKyAgICAgKiBoYXMgdGhlIHVuZm9ydHVuYXRlIHNpZGUgZWZmZWN0IHRoYXQgaWYgdGhlIHRleHQgZW5kcyB3aXRoIGFuIGVtcHR5CisgICAgICogcGFyYWdyYXBoLCB0aGF0IHBhcmFncmFwaCBhY2NpZGVudGFsbHkgcGlja3MgdXAgdGhlIHN0eWxlcyBvZiB0aGUKKyAgICAgKiBwcmVjZWRpbmcgcGFyYWdyYXBoIChldmVuIHRob3VnaCB0aG9zZSBzdHlsZXMgd2lsbCBub3QgYmUgcGlja2VkIHVwCisgICAgICogYnkgbmV3IHRleHQgdGhhdCBpcyBpbnNlcnRlZCBpbnRvIHRoZSBlbXB0eSBwYXJhZ3JhcGgpLgorICAgICAqIDxwPgorICAgICAqIFRoZSByZWFzb24gaXQganVzdCBjaGVja3Mgd2hldGhlciA8Y29kZT5zdGFydDwvY29kZT4gYW5kIDxjb2RlPmVuZDwvY29kZT4KKyAgICAgKiBpcyB0aGUgc2FtZSBpcyB0aGF0IHRoZSBvbmx5IHRpbWUgYSBsaW5lIGNhbiBjb250YWluIDAgY2hhcmFjdGVycworICAgICAqIGlzIGlmIGl0IGlzIHRoZSBmaW5hbCBwYXJhZ3JhcGggb2YgdGhlIExheW91dDsgb3RoZXJ3aXNlIGFueSBsaW5lIHdpbGwKKyAgICAgKiBjb250YWluIGF0IGxlYXN0IG9uZSBwcmludGluZyBvciBuZXdsaW5lIGNoYXJhY3Rlci4gIFRoZSByZWFzb24gZm9yIHRoZQorICAgICAqIGFkZGl0aW9uYWwgY2hlY2sgaWYgPGNvZGU+c3RhcnQ8L2NvZGU+IGlzIGdyZWF0ZXIgdGhhbiAwIGlzIHRoYXQKKyAgICAgKiBpZiB0aGUgZW1wdHkgcGFyYWdyYXBoIGlzIHRoZSBlbnRpcmUgY29udGVudCBvZiB0aGUgYnVmZmVyLCBwYXJhZ3JhcGgKKyAgICAgKiBzdHlsZXMgdGhhdCBhcmUgYWxyZWFkeSBhcHBsaWVkIHRvIHRoZSBidWZmZXIgd2lsbCBhcHBseSB0byB0ZXh0IHRoYXQKKyAgICAgKiBpcyBpbnNlcnRlZCBpbnRvIGl0LgorICAgICAqLworICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIDxUPiBUW10gZ2V0UGFyYWdyYXBoU3BhbnMoU3Bhbm5lZCB0ZXh0LCBpbnQgc3RhcnQsIGludCBlbmQsIENsYXNzPFQ+IHR5cGUpIHsKKyAgICAgICAgaWYgKHN0YXJ0ID09IGVuZCAmJiBzdGFydCA+IDApIHsKKyAgICAgICAgICAgIHJldHVybiAoVFtdKSBBcnJheVV0aWxzLmVtcHR5QXJyYXkodHlwZSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdGV4dC5nZXRTcGFucyhzdGFydCwgZW5kLCB0eXBlKTsKKyAgICB9CisKICAgICBwcml2YXRlIHZvaWQgZWxsaXBzaXplKGludCBzdGFydCwgaW50IGVuZCwgaW50IGxpbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyW10gZGVzdCwgaW50IGRlc3RvZmYpIHsKICAgICAgICAgaW50IGVsbGlwc2lzQ291bnQgPSBnZXRFbGxpcHNpc0NvdW50KGxpbmUpOwpAQCAtMTgwNCwyMyArMTYwMiwyMiBAQAogCiAgICAgLyoqCiAgICAgICogU3RvcmVzIGluZm9ybWF0aW9uIGFib3V0IGJpZGlyZWN0aW9uYWwgKGxlZnQtdG8tcmlnaHQgb3IgcmlnaHQtdG8tbGVmdCkKLSAgICAgKiB0ZXh0IHdpdGhpbiB0aGUgbGF5b3V0IG9mIGEgbGluZS4gIFRPRE86IFRoaXMgd29yayBpcyBub3QgY29tcGxldGUKLSAgICAgKiBvciBjb3JyZWN0IGFuZCB3aWxsIGJlIGZsZXNoZWQgb3V0IGluIGEgbGF0ZXIgcmV2aXNpb24uCisgICAgICogdGV4dCB3aXRoaW4gdGhlIGxheW91dCBvZiBhIGxpbmUuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBEaXJlY3Rpb25zIHsKLSAgICAgICAgcHJpdmF0ZSBzaG9ydFtdIG1EaXJlY3Rpb25zOworICAgICAgICAvLyBEaXJlY3Rpb25zIHJlcHJlc2VudHMgZGlyZWN0aW9uYWwgcnVucyB3aXRoaW4gYSBsaW5lIG9mIHRleHQuCisgICAgICAgIC8vIFJ1bnMgYXJlIHBhaXJzIG9mIGludHMgbGlzdGVkIGluIHZpc3VhbCBvcmRlciwgc3RhcnRpbmcgZnJvbSB0aGUKKyAgICAgICAgLy8gbGVhZGluZyBtYXJnaW4uICBUaGUgZmlyc3QgaW50IG9mIGVhY2ggcGFpciBpcyB0aGUgb2Zmc2V0IGZyb20KKyAgICAgICAgLy8gdGhlIGZpcnN0IGNoYXJhY3RlciBvZiB0aGUgbGluZSB0byB0aGUgc3RhcnQgb2YgdGhlIHJ1bi4gIFRoZQorICAgICAgICAvLyBzZWNvbmQgaW50IHJlcHJlc2VudHMgYm90aCB0aGUgbGVuZ3RoIGFuZCBsZXZlbCBvZiB0aGUgcnVuLgorICAgICAgICAvLyBUaGUgbGVuZ3RoIGlzIGluIHRoZSBsb3dlciBiaXRzLCBhY2Nlc3NlZCBieSBtYXNraW5nIHdpdGgKKyAgICAgICAgLy8gRElSX0xFTkdUSF9NQVNLLiAgVGhlIGxldmVsIGlzIGluIHRoZSBoaWdoZXIgYml0cywgYWNjZXNzZWQKKyAgICAgICAgLy8gYnkgc2hpZnRpbmcgYnkgRElSX0xFVkVMX1NISUZUIGFuZCBtYXNraW5nIGJ5IERJUl9MRVZFTF9NQVNLLgorICAgICAgICAvLyBUbyBzaW1wbHkgdGVzdCBmb3IgYW4gUlRMIGRpcmVjdGlvbiwgdGVzdCB0aGUgYml0IHVzaW5nCisgICAgICAgIC8vIERJUl9SVExfRkxBRywgaWYgc2V0IHRoZW4gdGhlIGRpcmVjdGlvbiBpcyBydGwuCiAKLSAgICAgICAgLy8gVGhlIHZhbHVlcyBpbiBtRGlyZWN0aW9ucyBhcmUgdGhlIG9mZnNldHMgZnJvbSB0aGUgZmlyc3QgY2hhcmFjdGVyCi0gICAgICAgIC8vIGluIHRoZSBsaW5lIHRvIHRoZSBuZXh0IGZsaXAgaW4gZGlyZWN0aW9uLiAgUnVucyBhdCBldmVuIGluZGljZXMKLSAgICAgICAgLy8gYXJlIGxlZnQtdG8tcmlnaHQsIHRoZSBvdGhlcnMgYXJlIHJpZ2h0LXRvLWxlZnQuICBTbywgZm9yIGV4YW1wbGUsCi0gICAgICAgIC8vIGEgbGluZSB0aGF0IHN0YXJ0cyB3aXRoIGEgcmlnaHQtdG8tbGVmdCBydW4gaGFzIDAgYXQgbURpcmVjdGlvbnNbMF0sCi0gICAgICAgIC8vIHNpbmNlIHRoZSAnZmlyc3QnIChsdHIpIHJ1biBpcyB6ZXJvIGxlbmd0aC4KLSAgICAgICAgLy8KLSAgICAgICAgLy8gVGhlIGNvZGUgY3VycmVudGx5IGFzc3VtZXMgdGhhdCBlYWNoIHJ1biBpcyBhZGphY2VudCB0byB0aGUgcHJldmlvdXMKLSAgICAgICAgLy8gb25lLCBwcm9ncmVzc2luZyBpbiB0aGUgYmFzZSBsaW5lIGRpcmVjdGlvbi4gIFRoaXMgaXNuJ3Qgc3VmZmljaWVudAotICAgICAgICAvLyB0byBoYW5kbGUgbmVzdGVkIHJ1bnMsIGZvciBleGFtcGxlIG51bWVyaWMgdGV4dCBpbiBhbiBydGwgY29udGV4dAotICAgICAgICAvLyBpbiBhbiBsdHIgcGFyYWdyYXBoLgotICAgICAgICAvKiBwYWNrYWdlICovIERpcmVjdGlvbnMoc2hvcnRbXSBkaXJzKSB7CisgICAgICAgIC8qIHBhY2thZ2UgKi8gaW50W10gbURpcmVjdGlvbnM7CisgICAgICAgIC8qIHBhY2thZ2UgKi8gRGlyZWN0aW9ucyhpbnRbXSBkaXJzKSB7CiAgICAgICAgICAgICBtRGlyZWN0aW9ucyA9IGRpcnM7CiAgICAgICAgIH0KICAgICB9CkBAIC0xODMxLDYgKzE2MjgsNyBAQAogICAgICAqIGxpbmUgaXMgZWxsaXBzaXplZCwgbm90IGdldExpbmVTdGFydCgpLikKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgaW50IGdldEVsbGlwc2lzU3RhcnQoaW50IGxpbmUpOworCiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gYmUgZWxsaXBzaXplZCBhd2F5LCBvciAwIGlmCiAgICAgICogbm8gZWxsaXBzaXMgaXMgdG8gdGFrZSBwbGFjZS4KQEAgLTE4NzAsNyArMTY2OCw3IEBACiAgICAgICAgIHB1YmxpYyBpbnQgbGVuZ3RoKCkgewogICAgICAgICAgICAgcmV0dXJuIG1UZXh0Lmxlbmd0aCgpOwogICAgICAgICB9Ci0gICAgCisKICAgICAgICAgcHVibGljIENoYXJTZXF1ZW5jZSBzdWJTZXF1ZW5jZShpbnQgc3RhcnQsIGludCBlbmQpIHsKICAgICAgICAgICAgIGNoYXJbXSBzID0gbmV3IGNoYXJbZW5kIC0gc3RhcnRdOwogICAgICAgICAgICAgZ2V0Q2hhcnMoc3RhcnQsIGVuZCwgcywgMCk7CkBAIC0xOTMxLDE3ICsxNzI5LDIyIEBACiAgICAgcHJpdmF0ZSBBbGlnbm1lbnQgbUFsaWdubWVudCA9IEFsaWdubWVudC5BTElHTl9OT1JNQUw7CiAgICAgcHJpdmF0ZSBmbG9hdCBtU3BhY2luZ011bHQ7CiAgICAgcHJpdmF0ZSBmbG9hdCBtU3BhY2luZ0FkZDsKLSAgICBwcml2YXRlIHN0YXRpYyBSZWN0IHNUZW1wUmVjdCA9IG5ldyBSZWN0KCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmVjdCBzVGVtcFJlY3QgPSBuZXcgUmVjdCgpOwogICAgIHByaXZhdGUgYm9vbGVhbiBtU3Bhbm5lZFRleHQ7CiAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBESVJfTEVGVF9UT19SSUdIVCA9IDE7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElSX1JJR0hUX1RPX0xFRlQgPSAtMTsKLSAgICAKKwogICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIGludCBESVJfUkVRVUVTVF9MVFIgPSAxOwogICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIGludCBESVJfUkVRVUVTVF9SVEwgPSAtMTsKICAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBpbnQgRElSX1JFUVVFU1RfREVGQVVMVF9MVFIgPSAyOwogICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIGludCBESVJfUkVRVUVTVF9ERUZBVUxUX1JUTCA9IC0yOwogCisgICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgaW50IFJVTl9MRU5HVEhfTUFTSyA9IDB4MDNmZmZmZmY7CisgICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgaW50IFJVTl9MRVZFTF9TSElGVCA9IDI2OworICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIGludCBSVU5fTEVWRUxfTUFTSyA9IDB4M2Y7CisgICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgaW50IFJVTl9SVExfRkxBRyA9IDEgPDwgUlVOX0xFVkVMX1NISUZUOworCiAgICAgcHVibGljIGVudW0gQWxpZ25tZW50IHsKICAgICAgICAgQUxJR05fTk9STUFMLAogICAgICAgICBBTElHTl9PUFBPU0lURSwKQEAgLTE5NTMsOSArMTc1Niw3IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRBQl9JTkNSRU1FTlQgPSAyMDsKIAogICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIERpcmVjdGlvbnMgRElSU19BTExfTEVGVF9UT19SSUdIVCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRGlyZWN0aW9ucyhuZXcgc2hvcnRbXSB7IDMyNzY3IH0pOworICAgICAgICBuZXcgRGlyZWN0aW9ucyhuZXcgaW50W10geyAwLCBSVU5fTEVOR1RIX01BU0sgfSk7CiAgICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgRGlyZWN0aW9ucyBESVJTX0FMTF9SSUdIVF9UT19MRUZUID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBEaXJlY3Rpb25zKG5ldyBzaG9ydFtdIHsgMCwgMzI3NjcgfSk7Ci0KKyAgICAgICAgbmV3IERpcmVjdGlvbnMobmV3IGludFtdIHsgMCwgUlVOX0xFTkdUSF9NQVNLIHwgUlVOX1JUTF9GTEFHIH0pOwogfQotCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L01lYXN1cmVkVGV4dC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9NZWFzdXJlZFRleHQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTY5OWYxCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9NZWFzdXJlZFRleHQuamF2YQpAQCAtMCwwICsxLDIyOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC50ZXh0OworCitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudXRpbC5BcnJheVV0aWxzOworCitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKK2ltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuTWV0cmljQWZmZWN0aW5nU3BhbjsKK2ltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuUmVwbGFjZW1lbnRTcGFuOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKKy8qKgorICogQGhpZGUKKyAqLworY2xhc3MgTWVhc3VyZWRUZXh0IHsKKyAgICAvKiBwYWNrYWdlICovIENoYXJTZXF1ZW5jZSBtVGV4dDsKKyAgICAvKiBwYWNrYWdlICovIGludCBtVGV4dFN0YXJ0OworICAgIC8qIHBhY2thZ2UgKi8gZmxvYXRbXSBtV2lkdGhzOworICAgIC8qIHBhY2thZ2UgKi8gY2hhcltdIG1DaGFyczsKKyAgICAvKiBwYWNrYWdlICovIGJ5dGVbXSBtTGV2ZWxzOworICAgIC8qIHBhY2thZ2UgKi8gaW50IG1EaXI7CisgICAgLyogcGFja2FnZSAqLyBib29sZWFuIG1FYXN5OworICAgIC8qIHBhY2thZ2UgKi8gaW50IG1MZW47CisgICAgcHJpdmF0ZSBpbnQgbVBvczsKKyAgICBwcml2YXRlIFRleHRQYWludCBtV29ya1BhaW50OworCisgICAgcHJpdmF0ZSBNZWFzdXJlZFRleHQoKSB7CisgICAgICAgIG1Xb3JrUGFpbnQgPSBuZXcgVGV4dFBhaW50KCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgTWVhc3VyZWRUZXh0W10gY2FjaGVkID0gbmV3IE1lYXN1cmVkVGV4dFszXTsKKworICAgIC8qIHBhY2thZ2UgKi8KKyAgICBzdGF0aWMgTWVhc3VyZWRUZXh0IG9idGFpbigpIHsKKyAgICAgICAgTWVhc3VyZWRUZXh0IG10OworICAgICAgICBzeW5jaHJvbml6ZWQgKGNhY2hlZCkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IGNhY2hlZC5sZW5ndGg7IC0taSA+PSAwOykgeworICAgICAgICAgICAgICAgIGlmIChjYWNoZWRbaV0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBtdCA9IGNhY2hlZFtpXTsKKyAgICAgICAgICAgICAgICAgICAgY2FjaGVkW2ldID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG10OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtdCA9IG5ldyBNZWFzdXJlZFRleHQoKTsKKyAgICAgICAgTG9nLmUoIk1FQVMiLCAibmV3OiAiICsgbXQpOworICAgICAgICByZXR1cm4gbXQ7CisgICAgfQorCisgICAgLyogcGFja2FnZSAqLworICAgIHN0YXRpYyBNZWFzdXJlZFRleHQgcmVjeWNsZShNZWFzdXJlZFRleHQgbXQpIHsKKyAgICAgICAgbXQubVRleHQgPSBudWxsOworICAgICAgICBpZiAobXQubUxlbiA8IDEwMDApIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZChjYWNoZWQpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNhY2hlZC5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoY2FjaGVkW2ldID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlZFtpXSA9IG10OworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogQW5hbHl6ZXMgdGV4dCBmb3IgYmlkaXJlY3Rpb25hbCBydW5zLiAgQWxsb2NhdGVzIHdvcmtpbmcgYnVmZmVycy4KKyAgICAgKi8KKyAgICAvKiBwYWNrYWdlICovCisgICAgdm9pZCBzZXRQYXJhKENoYXJTZXF1ZW5jZSB0ZXh0LCBpbnQgc3RhcnQsIGludCBlbmQsIGludCBiaWRpUmVxdWVzdCkgeworICAgICAgICBtVGV4dCA9IHRleHQ7CisgICAgICAgIG1UZXh0U3RhcnQgPSBzdGFydDsKKworICAgICAgICBpbnQgbGVuID0gZW5kIC0gc3RhcnQ7CisgICAgICAgIG1MZW4gPSBsZW47CisgICAgICAgIG1Qb3MgPSAwOworCisgICAgICAgIGlmIChtV2lkdGhzID09IG51bGwgfHwgbVdpZHRocy5sZW5ndGggPCBsZW4pIHsKKyAgICAgICAgICAgIG1XaWR0aHMgPSBuZXcgZmxvYXRbQXJyYXlVdGlscy5pZGVhbEZsb2F0QXJyYXlTaXplKGxlbildOworICAgICAgICB9CisgICAgICAgIGlmIChtQ2hhcnMgPT0gbnVsbCB8fCBtQ2hhcnMubGVuZ3RoIDwgbGVuKSB7CisgICAgICAgICAgICBtQ2hhcnMgPSBuZXcgY2hhcltBcnJheVV0aWxzLmlkZWFsQ2hhckFycmF5U2l6ZShsZW4pXTsKKyAgICAgICAgfQorICAgICAgICBUZXh0VXRpbHMuZ2V0Q2hhcnModGV4dCwgc3RhcnQsIGVuZCwgbUNoYXJzLCAwKTsKKworICAgICAgICBpZiAodGV4dCBpbnN0YW5jZW9mIFNwYW5uZWQpIHsKKyAgICAgICAgICAgIFNwYW5uZWQgc3Bhbm5lZCA9IChTcGFubmVkKSB0ZXh0OworICAgICAgICAgICAgUmVwbGFjZW1lbnRTcGFuW10gc3BhbnMgPSBzcGFubmVkLmdldFNwYW5zKHN0YXJ0LCBlbmQsCisgICAgICAgICAgICAgICAgICAgIFJlcGxhY2VtZW50U3Bhbi5jbGFzcyk7CisKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3BhbnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpbnQgc3RhcnRJblBhcmEgPSBzcGFubmVkLmdldFNwYW5TdGFydChzcGFuc1tpXSkgLSBzdGFydDsKKyAgICAgICAgICAgICAgICBpbnQgZW5kSW5QYXJhID0gc3Bhbm5lZC5nZXRTcGFuRW5kKHNwYW5zW2ldKSAtIHN0YXJ0OworICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSBzdGFydEluUGFyYTsgaiA8IGVuZEluUGFyYTsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgIG1DaGFyc1tqXSA9ICdcdUZGRkMnOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChUZXh0VXRpbHMuZG9lc05vdE5lZWRCaWRpKG1DaGFycywgMCwgbGVuKSkgeworICAgICAgICAgICAgbURpciA9IExheW91dC5ESVJfTEVGVF9UT19SSUdIVDsKKyAgICAgICAgICAgIG1FYXN5ID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChtTGV2ZWxzID09IG51bGwgfHwgbUxldmVscy5sZW5ndGggPCBsZW4pIHsKKyAgICAgICAgICAgICAgICBtTGV2ZWxzID0gbmV3IGJ5dGVbQXJyYXlVdGlscy5pZGVhbEJ5dGVBcnJheVNpemUobGVuKV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtRGlyID0gQW5kcm9pZEJpZGkuYmlkaShiaWRpUmVxdWVzdCwgbUNoYXJzLCBtTGV2ZWxzLCBsZW4sIGZhbHNlKTsKKyAgICAgICAgICAgIG1FYXN5ID0gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmbG9hdCBhZGRTdHlsZVJ1bihUZXh0UGFpbnQgcGFpbnQsIGludCBsZW4sIFBhaW50LkZvbnRNZXRyaWNzSW50IGZtKSB7CisgICAgICAgIGlmIChmbSAhPSBudWxsKSB7CisgICAgICAgICAgICBwYWludC5nZXRGb250TWV0cmljc0ludChmbSk7CisgICAgICAgIH0KKworICAgICAgICBpbnQgcCA9IG1Qb3M7CisgICAgICAgIG1Qb3MgPSBwICsgbGVuOworCisgICAgICAgIGlmIChtRWFzeSkgeworICAgICAgICAgICAgaW50IGZsYWdzID0gbURpciA9PSBMYXlvdXQuRElSX0xFRlRfVE9fUklHSFQKKyAgICAgICAgICAgICAgICA/IENhbnZhcy5ESVJFQ1RJT05fTFRSIDogQ2FudmFzLkRJUkVDVElPTl9SVEw7CisgICAgICAgICAgICByZXR1cm4gcGFpbnQuZ2V0VGV4dFJ1bkFkdmFuY2VzKG1DaGFycywgcCwgbGVuLCBwLCBsZW4sIGZsYWdzLCBtV2lkdGhzLCBwKTsKKyAgICAgICAgfQorCisgICAgICAgIGZsb2F0IHRvdGFsQWR2YW5jZSA9IDA7CisgICAgICAgIGludCBsZXZlbCA9IG1MZXZlbHNbcF07CisgICAgICAgIGZvciAoaW50IHEgPSBwLCBpID0gcCArIDEsIGUgPSBwICsgbGVuOzsgKytpKSB7CisgICAgICAgICAgICBpZiAoaSA9PSBlIHx8IG1MZXZlbHNbaV0gIT0gbGV2ZWwpIHsKKyAgICAgICAgICAgICAgICBpbnQgZmxhZ3MgPSAobGV2ZWwgJiAweDEpID09IDAgPyBDYW52YXMuRElSRUNUSU9OX0xUUiA6IENhbnZhcy5ESVJFQ1RJT05fUlRMOworICAgICAgICAgICAgICAgIHRvdGFsQWR2YW5jZSArPQorICAgICAgICAgICAgICAgICAgICAgICAgcGFpbnQuZ2V0VGV4dFJ1bkFkdmFuY2VzKG1DaGFycywgcSwgaSAtIHEsIHEsIGkgLSBxLCBmbGFncywgbVdpZHRocywgcSk7CisgICAgICAgICAgICAgICAgaWYgKGkgPT0gZSkgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcSA9IGk7CisgICAgICAgICAgICAgICAgbGV2ZWwgPSBtTGV2ZWxzW2ldOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0b3RhbEFkdmFuY2U7CisgICAgfQorCisgICAgZmxvYXQgYWRkU3R5bGVSdW4oVGV4dFBhaW50IHBhaW50LCBNZXRyaWNBZmZlY3RpbmdTcGFuW10gc3BhbnMsIGludCBsZW4sCisgICAgICAgICAgICBQYWludC5Gb250TWV0cmljc0ludCBmbSkgeworCisgICAgICAgIFRleHRQYWludCB3b3JrUGFpbnQgPSBtV29ya1BhaW50OworICAgICAgICB3b3JrUGFpbnQuc2V0KHBhaW50KTsKKyAgICAgICAgLy8gWFhYIHBhaW50IHNob3VsZCBub3QgaGF2ZSBhIGJhc2VsaW5lIHNoaWZ0LCBidXQuLi4KKyAgICAgICAgd29ya1BhaW50LmJhc2VsaW5lU2hpZnQgPSAwOworCisgICAgICAgIFJlcGxhY2VtZW50U3BhbiByZXBsYWNlbWVudCA9IG51bGw7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3BhbnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIE1ldHJpY0FmZmVjdGluZ1NwYW4gc3BhbiA9IHNwYW5zW2ldOworICAgICAgICAgICAgaWYgKHNwYW4gaW5zdGFuY2VvZiBSZXBsYWNlbWVudFNwYW4pIHsKKyAgICAgICAgICAgICAgICByZXBsYWNlbWVudCA9IChSZXBsYWNlbWVudFNwYW4pc3BhbjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3Bhbi51cGRhdGVNZWFzdXJlU3RhdGUod29ya1BhaW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZsb2F0IHdpZDsKKyAgICAgICAgaWYgKHJlcGxhY2VtZW50ID09IG51bGwpIHsKKyAgICAgICAgICAgIHdpZCA9IGFkZFN0eWxlUnVuKHdvcmtQYWludCwgbGVuLCBmbSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBVc2Ugb3JpZ2luYWwgdGV4dC4gIFNob3VsZG4ndCBtYXR0ZXIuCisgICAgICAgICAgICB3aWQgPSByZXBsYWNlbWVudC5nZXRTaXplKHdvcmtQYWludCwgbVRleHQsIG1UZXh0U3RhcnQgKyBtUG9zLAorICAgICAgICAgICAgICAgICAgICBtVGV4dFN0YXJ0ICsgbVBvcyArIGxlbiwgZm0pOworICAgICAgICAgICAgZmxvYXRbXSB3ID0gbVdpZHRoczsKKyAgICAgICAgICAgIHdbbVBvc10gPSB3aWQ7CisgICAgICAgICAgICBmb3IgKGludCBpID0gbVBvcyArIDEsIGUgPSBtUG9zICsgbGVuOyBpIDwgZTsgaSsrKQorICAgICAgICAgICAgICAgIHdbaV0gPSAwOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGZtICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmICh3b3JrUGFpbnQuYmFzZWxpbmVTaGlmdCA8IDApIHsKKyAgICAgICAgICAgICAgICBmbS5hc2NlbnQgKz0gd29ya1BhaW50LmJhc2VsaW5lU2hpZnQ7CisgICAgICAgICAgICAgICAgZm0udG9wICs9IHdvcmtQYWludC5iYXNlbGluZVNoaWZ0OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmbS5kZXNjZW50ICs9IHdvcmtQYWludC5iYXNlbGluZVNoaWZ0OworICAgICAgICAgICAgICAgIGZtLmJvdHRvbSArPSB3b3JrUGFpbnQuYmFzZWxpbmVTaGlmdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB3aWQ7CisgICAgfQorCisgICAgaW50IGJyZWFrVGV4dChpbnQgc3RhcnQsIGludCBsaW1pdCwgYm9vbGVhbiBmb3J3YXJkcywgZmxvYXQgd2lkdGgpIHsKKyAgICAgICAgZmxvYXRbXSB3ID0gbVdpZHRoczsKKyAgICAgICAgaWYgKGZvcndhcmRzKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gc3RhcnQ7IGkgPCBsaW1pdDsgKytpKSB7CisgICAgICAgICAgICAgICAgaWYgKCh3aWR0aCAtPSB3W2ldKSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkgLSBzdGFydDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gbGltaXQ7IC0taSA+PSBzdGFydDspIHsKKyAgICAgICAgICAgICAgICBpZiAoKHdpZHRoIC09IHdbaV0pIDwgMCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGltaXQgLSBpIC0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBsaW1pdCAtIHN0YXJ0OworICAgIH0KKworICAgIGZsb2F0IG1lYXN1cmUoaW50IHN0YXJ0LCBpbnQgbGltaXQpIHsKKyAgICAgICAgZmxvYXQgd2lkdGggPSAwOworICAgICAgICBmbG9hdFtdIHcgPSBtV2lkdGhzOworICAgICAgICBmb3IgKGludCBpID0gc3RhcnQ7IGkgPCBsaW1pdDsgKytpKSB7CisgICAgICAgICAgICB3aWR0aCArPSB3W2ldOworICAgICAgICB9CisgICAgICAgIHJldHVybiB3aWR0aDsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9TcGFubmFibGVTdHJpbmdCdWlsZGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L1NwYW5uYWJsZVN0cmluZ0J1aWxkZXIuamF2YQppbmRleCBjYWFhZmExLi5mYzAxZWYyIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L1NwYW5uYWJsZVN0cmluZ0J1aWxkZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L1NwYW5uYWJsZVN0cmluZ0J1aWxkZXIuamF2YQpAQCAtMTcsOCArMTcsOSBAQAogcGFja2FnZSBhbmRyb2lkLnRleHQ7CiAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLkFycmF5VXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKKwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7CiAKIGltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5BcnJheTsKIApAQCAtMzEyLDEyICszMTMsMTUgQEAKIAogICAgICAgICBtb3ZlR2FwVG8oZW5kKTsKIAotICAgICAgICBpZiAodGJlbmQgLSB0YnN0YXJ0ID49IG1HYXBMZW5ndGggKyAoZW5kIC0gc3RhcnQpKQotICAgICAgICAgICAgcmVzaXplRm9yKG1UZXh0Lmxlbmd0aCAtIG1HYXBMZW5ndGggKwotICAgICAgICAgICAgICAgICAgICAgIHRiZW5kIC0gdGJzdGFydCAtIChlbmQgLSBzdGFydCkpOworICAgICAgICAvLyBDYW4gYmUgbmVnYXRpdmUKKyAgICAgICAgZmluYWwgaW50IG5iTmV3Q2hhcnMgPSAodGJlbmQgLSB0YnN0YXJ0KSAtIChlbmQgLSBzdGFydCk7CiAKLSAgICAgICAgbUdhcFN0YXJ0ICs9IHRiZW5kIC0gdGJzdGFydCAtIChlbmQgLSBzdGFydCk7Ci0gICAgICAgIG1HYXBMZW5ndGggLT0gdGJlbmQgLSB0YnN0YXJ0IC0gKGVuZCAtIHN0YXJ0KTsKKyAgICAgICAgaWYgKG5iTmV3Q2hhcnMgPj0gbUdhcExlbmd0aCkgeworICAgICAgICAgICAgcmVzaXplRm9yKG1UZXh0Lmxlbmd0aCArIG5iTmV3Q2hhcnMgLSBtR2FwTGVuZ3RoKTsKKyAgICAgICAgfQorCisgICAgICAgIG1HYXBTdGFydCArPSBuYk5ld0NoYXJzOworICAgICAgICBtR2FwTGVuZ3RoIC09IG5iTmV3Q2hhcnM7CiAKICAgICAgICAgaWYgKG1HYXBMZW5ndGggPCAxKQogICAgICAgICAgICAgbmV3IEV4Y2VwdGlvbigibUdhcExlbmd0aCA8IDEiKS5wcmludFN0YWNrVHJhY2UoKTsKQEAgLTcwNyw2ICs3MTEsNyBAQAogICAgICAqIHRoZSBzcGVjaWZpZWQgcmFuZ2Ugb2YgdGhlIGJ1ZmZlci4gIFRoZSBraW5kIG1heSBiZSBPYmplY3QuY2xhc3MgdG8gZ2V0CiAgICAgICogYSBsaXN0IG9mIGFsbCB0aGUgc3BhbnMgcmVnYXJkbGVzcyBvZiB0eXBlLgogICAgICAqLworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQogICAgIHB1YmxpYyA8VD4gVFtdIGdldFNwYW5zKGludCBxdWVyeVN0YXJ0LCBpbnQgcXVlcnlFbmQsIENsYXNzPFQ+IGtpbmQpIHsKICAgICAgICAgaW50IHNwYW5Db3VudCA9IG1TcGFuQ291bnQ7CiAgICAgICAgIE9iamVjdFtdIHNwYW5zID0gbVNwYW5zOwpAQCAtNzE3LDggKzcyMiw4IEBACiAgICAgICAgIGludCBnYXBsZW4gPSBtR2FwTGVuZ3RoOwogCiAgICAgICAgIGludCBjb3VudCA9IDA7Ci0gICAgICAgIE9iamVjdFtdIHJldCA9IG51bGw7Ci0gICAgICAgIE9iamVjdCByZXQxID0gbnVsbDsKKyAgICAgICAgVFtdIHJldCA9IG51bGw7CisgICAgICAgIFQgcmV0MSA9IG51bGw7CiAKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzcGFuQ291bnQ7IGkrKykgewogICAgICAgICAgICAgaW50IHNwYW5TdGFydCA9IHN0YXJ0c1tpXTsKQEAgLTc1MCwxMSArNzU1LDEzIEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChjb3VudCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0MSA9IHNwYW5zW2ldOworICAgICAgICAgICAgICAgIC8vIFNhZmUgY29udmVyc2lvbiB0aGFua3MgdG8gdGhlIGlzSW5zdGFuY2UgdGVzdCBhYm92ZQorICAgICAgICAgICAgICAgIHJldDEgPSAoVCkgc3BhbnNbaV07CiAgICAgICAgICAgICAgICAgY291bnQrKzsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgaWYgKGNvdW50ID09IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0ID0gKE9iamVjdFtdKSBBcnJheS5uZXdJbnN0YW5jZShraW5kLCBzcGFuQ291bnQgLSBpICsgMSk7CisgICAgICAgICAgICAgICAgICAgIC8vIFNhZmUgY29udmVyc2lvbiwgYnV0IHJlcXVpcmVzIGEgc3VwcHJlc3NXYXJuaW5nCisgICAgICAgICAgICAgICAgICAgIHJldCA9IChUW10pIEFycmF5Lm5ld0luc3RhbmNlKGtpbmQsIHNwYW5Db3VudCAtIGkgKyAxKTsKICAgICAgICAgICAgICAgICAgICAgcmV0WzBdID0gcmV0MTsKICAgICAgICAgICAgICAgICB9CiAKQEAgLTc3MSwyOSArNzc4LDMzIEBACiAgICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHJldCwgaiwgcmV0LCBqICsgMSwgY291bnQgLSBqKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0W2pdID0gc3BhbnNbaV07CisgICAgICAgICAgICAgICAgICAgIC8vIFNhZmUgY29udmVyc2lvbiB0aGFua3MgdG8gdGhlIGlzSW5zdGFuY2UgdGVzdCBhYm92ZQorICAgICAgICAgICAgICAgICAgICByZXRbal0gPSAoVCkgc3BhbnNbaV07CiAgICAgICAgICAgICAgICAgICAgIGNvdW50Kys7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0W2NvdW50KytdID0gc3BhbnNbaV07CisgICAgICAgICAgICAgICAgICAgIC8vIFNhZmUgY29udmVyc2lvbiB0aGFua3MgdG8gdGhlIGlzSW5zdGFuY2UgdGVzdCBhYm92ZQorICAgICAgICAgICAgICAgICAgICByZXRbY291bnQrK10gPSAoVCkgc3BhbnNbaV07CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgaWYgKGNvdW50ID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiAoVFtdKSBBcnJheVV0aWxzLmVtcHR5QXJyYXkoa2luZCk7CisgICAgICAgICAgICByZXR1cm4gQXJyYXlVdGlscy5lbXB0eUFycmF5KGtpbmQpOwogICAgICAgICB9CiAgICAgICAgIGlmIChjb3VudCA9PSAxKSB7Ci0gICAgICAgICAgICByZXQgPSAoT2JqZWN0W10pIEFycmF5Lm5ld0luc3RhbmNlKGtpbmQsIDEpOworICAgICAgICAgICAgLy8gU2FmZSBjb252ZXJzaW9uLCBidXQgcmVxdWlyZXMgYSBzdXBwcmVzc1dhcm5pbmcKKyAgICAgICAgICAgIHJldCA9IChUW10pIEFycmF5Lm5ld0luc3RhbmNlKGtpbmQsIDEpOwogICAgICAgICAgICAgcmV0WzBdID0gcmV0MTsKLSAgICAgICAgICAgIHJldHVybiAoVFtdKSByZXQ7CisgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICB9CiAgICAgICAgIGlmIChjb3VudCA9PSByZXQubGVuZ3RoKSB7Ci0gICAgICAgICAgICByZXR1cm4gKFRbXSkgcmV0OworICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICAgfQogCi0gICAgICAgIE9iamVjdFtdIG5yZXQgPSAoT2JqZWN0W10pIEFycmF5Lm5ld0luc3RhbmNlKGtpbmQsIGNvdW50KTsKKyAgICAgICAgLy8gU2FmZSBjb252ZXJzaW9uLCBidXQgcmVxdWlyZXMgYSBzdXBwcmVzc1dhcm5pbmcKKyAgICAgICAgVFtdIG5yZXQgPSAoVFtdKSBBcnJheS5uZXdJbnN0YW5jZShraW5kLCBjb3VudCk7CiAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkocmV0LCAwLCBucmV0LCAwLCBjb3VudCk7Ci0gICAgICAgIHJldHVybiAoVFtdKSBucmV0OworICAgICAgICByZXR1cm4gbnJldDsKICAgICB9CiAKICAgICAvKioKQEAgLTg2Miw2ICs4NzMsNyBAQAogICAgIC8qKgogICAgICAqIFJldHVybiBhIFN0cmluZyBjb250YWluaW5nIGEgY29weSBvZiB0aGUgY2hhcnMgaW4gdGhpcyBidWZmZXIuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKICAgICAgICAgaW50IGxlbiA9IGxlbmd0aCgpOwogICAgICAgICBjaGFyW10gYnVmID0gbmV3IGNoYXJbbGVuXTsKQEAgLTk1Miw2ICs5NjQsNyBAQAogICAgICAgICB9CiAgICAgfQogCisvKgogICAgIHByaXZhdGUgYm9vbGVhbiBpc3ByaW50KGNoYXIgYykgeyAvLyBYWFgKICAgICAgICAgaWYgKGMgPj0gJyAnICYmIGMgPD0gJ34nKQogICAgICAgICAgICAgcmV0dXJuIHRydWU7CkBAIC05NTksNyArOTcyLDYgQEAKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLS8qCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IHN0YXJ0RmxhZyhpbnQgZmxhZykgewogICAgICAgICByZXR1cm4gKGZsYWcgPj4gNCkgJiAweDBGOwogICAgIH0KQEAgLTEwNTQsNyArMTA2NiwzMiBAQAogICAgICAgICB9CiAgICAgfQogCisKICAgICAvKioKKyAgICAgKiBEb24ndCBjYWxsIHRoaXMgeW91cnNlbGYgLS0gZXhpc3RzIGZvciBDYW52YXMgdG8gdXNlIGludGVybmFsbHkuCisgICAgICoge0BoaWRlfQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGRyYXdUZXh0UnVuKENhbnZhcyBjLCBpbnQgc3RhcnQsIGludCBlbmQsCisgICAgICAgICAgICBpbnQgY29udGV4dFN0YXJ0LCBpbnQgY29udGV4dEVuZCwKKyAgICAgICAgICAgIGZsb2F0IHgsIGZsb2F0IHksIGludCBmbGFncywgUGFpbnQgcCkgeworICAgICAgICBjaGVja1JhbmdlKCJkcmF3VGV4dFJ1biIsIHN0YXJ0LCBlbmQpOworCisgICAgICAgIGludCBjb250ZXh0TGVuID0gY29udGV4dEVuZCAtIGNvbnRleHRTdGFydDsKKyAgICAgICAgaW50IGxlbiA9IGVuZCAtIHN0YXJ0OworICAgICAgICBpZiAoY29udGV4dEVuZCA8PSBtR2FwU3RhcnQpIHsKKyAgICAgICAgICAgIGMuZHJhd1RleHRSdW4obVRleHQsIHN0YXJ0LCBsZW4sIGNvbnRleHRTdGFydCwgY29udGV4dExlbiwgeCwgeSwgZmxhZ3MsIHApOworICAgICAgICB9IGVsc2UgaWYgKGNvbnRleHRTdGFydCA+PSBtR2FwU3RhcnQpIHsKKyAgICAgICAgICAgIGMuZHJhd1RleHRSdW4obVRleHQsIHN0YXJ0ICsgbUdhcExlbmd0aCwgbGVuLCBjb250ZXh0U3RhcnQgKyBtR2FwTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICBjb250ZXh0TGVuLCB4LCB5LCBmbGFncywgcCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjaGFyW10gYnVmID0gVGV4dFV0aWxzLm9idGFpbihjb250ZXh0TGVuKTsKKyAgICAgICAgICAgIGdldENoYXJzKGNvbnRleHRTdGFydCwgY29udGV4dEVuZCwgYnVmLCAwKTsKKyAgICAgICAgICAgIGMuZHJhd1RleHRSdW4oYnVmLCBzdGFydCAtIGNvbnRleHRTdGFydCwgbGVuLCAwLCBjb250ZXh0TGVuLCB4LCB5LCBmbGFncywgcCk7CisgICAgICAgICAgICBUZXh0VXRpbHMucmVjeWNsZShidWYpOworICAgICAgICB9CisgICAgfQorCisgICAvKioKICAgICAgKiBEb24ndCBjYWxsIHRoaXMgeW91cnNlbGYgLS0gZXhpc3RzIGZvciBQYWludCB0byB1c2UgaW50ZXJuYWxseS4KICAgICAgKiB7QGhpZGV9CiAgICAgICovCkBAIC0xMTAzLDYgKzExNDAsNTggQEAKICAgICAgICAgcmV0dXJuIHJldDsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBEb24ndCBjYWxsIHRoaXMgeW91cnNlbGYgLS0gZXhpc3RzIGZvciBQYWludCB0byB1c2UgaW50ZXJuYWxseS4KKyAgICAgKiB7QGhpZGV9CisgICAgICovCisgICAgcHVibGljIGZsb2F0IGdldFRleHRSdW5BZHZhbmNlcyhpbnQgc3RhcnQsIGludCBlbmQsIGludCBjb250ZXh0U3RhcnQsIGludCBjb250ZXh0RW5kLCBpbnQgZmxhZ3MsCisgICAgICAgICAgICBmbG9hdFtdIGFkdmFuY2VzLCBpbnQgYWR2YW5jZXNQb3MsIFBhaW50IHApIHsKKworICAgICAgICBmbG9hdCByZXQ7CisKKyAgICAgICAgaW50IGNvbnRleHRMZW4gPSBjb250ZXh0RW5kIC0gY29udGV4dFN0YXJ0OworICAgICAgICBpbnQgbGVuID0gZW5kIC0gc3RhcnQ7CisKKyAgICAgICAgaWYgKGVuZCA8PSBtR2FwU3RhcnQpIHsKKyAgICAgICAgICAgIHJldCA9IHAuZ2V0VGV4dFJ1bkFkdmFuY2VzKG1UZXh0LCBzdGFydCwgbGVuLCBjb250ZXh0U3RhcnQsIGNvbnRleHRMZW4sCisgICAgICAgICAgICAgICAgICAgIGZsYWdzLCBhZHZhbmNlcywgYWR2YW5jZXNQb3MpOworICAgICAgICB9IGVsc2UgaWYgKHN0YXJ0ID49IG1HYXBTdGFydCkgeworICAgICAgICAgICAgcmV0ID0gcC5nZXRUZXh0UnVuQWR2YW5jZXMobVRleHQsIHN0YXJ0ICsgbUdhcExlbmd0aCwgbGVuLAorICAgICAgICAgICAgICAgICAgICBjb250ZXh0U3RhcnQgKyBtR2FwTGVuZ3RoLCBjb250ZXh0TGVuLCBmbGFncywgYWR2YW5jZXMsIGFkdmFuY2VzUG9zKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNoYXJbXSBidWYgPSBUZXh0VXRpbHMub2J0YWluKGNvbnRleHRMZW4pOworICAgICAgICAgICAgZ2V0Q2hhcnMoY29udGV4dFN0YXJ0LCBjb250ZXh0RW5kLCBidWYsIDApOworICAgICAgICAgICAgcmV0ID0gcC5nZXRUZXh0UnVuQWR2YW5jZXMoYnVmLCBzdGFydCAtIGNvbnRleHRTdGFydCwgbGVuLAorICAgICAgICAgICAgICAgICAgICAwLCBjb250ZXh0TGVuLCBmbGFncywgYWR2YW5jZXMsIGFkdmFuY2VzUG9zKTsKKyAgICAgICAgICAgIFRleHRVdGlscy5yZWN5Y2xlKGJ1Zik7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0VGV4dFJ1bkN1cnNvcihpbnQgY29udGV4dFN0YXJ0LCBpbnQgY29udGV4dEVuZCwgaW50IGZsYWdzLCBpbnQgb2Zmc2V0LAorICAgICAgICAgICAgaW50IGN1cnNvck9wdCwgUGFpbnQgcCkgeworCisgICAgICAgIGludCByZXQ7CisKKyAgICAgICAgaW50IGNvbnRleHRMZW4gPSBjb250ZXh0RW5kIC0gY29udGV4dFN0YXJ0OworICAgICAgICBpZiAoY29udGV4dEVuZCA8PSBtR2FwU3RhcnQpIHsKKyAgICAgICAgICAgIHJldCA9IHAuZ2V0VGV4dFJ1bkN1cnNvcihtVGV4dCwgY29udGV4dFN0YXJ0LCBjb250ZXh0TGVuLAorICAgICAgICAgICAgICAgICAgICBmbGFncywgb2Zmc2V0LCBjdXJzb3JPcHQpOworICAgICAgICB9IGVsc2UgaWYgKGNvbnRleHRTdGFydCA+PSBtR2FwU3RhcnQpIHsKKyAgICAgICAgICAgIHJldCA9IHAuZ2V0VGV4dFJ1bkN1cnNvcihtVGV4dCwgY29udGV4dFN0YXJ0ICsgbUdhcExlbmd0aCwgY29udGV4dExlbiwKKyAgICAgICAgICAgICAgICAgICAgZmxhZ3MsIG9mZnNldCArIG1HYXBMZW5ndGgsIGN1cnNvck9wdCkgLSBtR2FwTGVuZ3RoOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY2hhcltdIGJ1ZiA9IFRleHRVdGlscy5vYnRhaW4oY29udGV4dExlbik7CisgICAgICAgICAgICBnZXRDaGFycyhjb250ZXh0U3RhcnQsIGNvbnRleHRFbmQsIGJ1ZiwgMCk7CisgICAgICAgICAgICByZXQgPSBwLmdldFRleHRSdW5DdXJzb3IoYnVmLCAwLCBjb250ZXh0TGVuLAorICAgICAgICAgICAgICAgICAgICBmbGFncywgb2Zmc2V0IC0gY29udGV4dFN0YXJ0LCBjdXJzb3JPcHQpICsgY29udGV4dFN0YXJ0OworICAgICAgICAgICAgVGV4dFV0aWxzLnJlY3ljbGUoYnVmKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCiAgICAgLy8gRG9jdW1lbnRhdGlvbiBmcm9tIGludGVyZmFjZQogICAgIHB1YmxpYyB2b2lkIHNldEZpbHRlcnMoSW5wdXRGaWx0ZXJbXSBmaWx0ZXJzKSB7CiAgICAgICAgIGlmIChmaWx0ZXJzID09IG51bGwpIHsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvU3Bhbm5lZC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9TcGFubmVkLmphdmEKaW5kZXggMTU0NDk3ZC4uZDE0ZmNiYyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9TcGFubmVkLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9TcGFubmVkLmphdmEKQEAgLTkxLDcgKzkxLDcgQEAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTUEFOX0VYQ0xVU0lWRV9FWENMVVNJVkUgPSBTUEFOX1BPSU5UX01BUks7CiAKICAgICAvKioKLSAgICAgKiBOb24tMC1sZW5ndGggc3BhbnMgb2YgdHlwZSBTUEFOX0lOQ0xVU0lWRV9FWENMVVNJVkUgZXhwYW5kCisgICAgICogTm9uLTAtbGVuZ3RoIHNwYW5zIG9mIHR5cGUgU1BBTl9FWENMVVNJVkVfSU5DTFVTSVZFIGV4cGFuZAogICAgICAqIHRvIGluY2x1ZGUgdGV4dCBpbnNlcnRlZCBhdCB0aGVpciBlbmRpbmcgcG9pbnQgYnV0IG5vdCBhdCB0aGVpcgogICAgICAqIHN0YXJ0aW5nIHBvaW50LiAgV2hlbiAwLWxlbmd0aCwgdGhleSBiZWhhdmUgbGlrZSBwb2ludHMuCiAgICAgICovCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L1N0YXRpY0xheW91dC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9TdGF0aWNMYXlvdXQuamF2YQppbmRleCBmMDJhZDJhLi5jYzk2OWNiIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L1N0YXRpY0xheW91dC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvU3RhdGljTGF5b3V0LmphdmEKQEAgLTE2LDE0ICsxNiwxNSBAQAogCiBwYWNrYWdlIGFuZHJvaWQudGV4dDsKIAoraW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnV0aWwuQXJyYXlVdGlsczsKKwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudXRpbC5BcnJheVV0aWxzOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLkxlYWRpbmdNYXJnaW5TcGFuOwogaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5MaW5lSGVpZ2h0U3BhbjsKIGltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuTWV0cmljQWZmZWN0aW5nU3BhbjsKLWltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuUmVwbGFjZW1lbnRTcGFuOworaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5UYWJTdG9wU3BhbjsKK2ltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuTGVhZGluZ01hcmdpblNwYW4uTGVhZGluZ01hcmdpblNwYW4yOwogCiAvKioKICAqIFN0YXRpY0xheW91dCBpcyBhIExheW91dCBmb3IgdGV4dCB0aGF0IHdpbGwgbm90IGJlIGVkaXRlZCBhZnRlciBpdApAQCAtMzEsOCArMzIsOSBAQAogICogPHA+VGhpcyBpcyB1c2VkIGJ5IHdpZGdldHMgdG8gY29udHJvbCB0ZXh0IGxheW91dC4gWW91IHNob3VsZCBub3QgbmVlZAogICogdG8gdXNlIHRoaXMgY2xhc3MgZGlyZWN0bHkgdW5sZXNzIHlvdSBhcmUgaW1wbGVtZW50aW5nIHlvdXIgb3duIHdpZGdldAogICogb3IgY3VzdG9tIGRpc3BsYXkgb2JqZWN0LCBvciB3b3VsZCBiZSB0ZW1wdGVkIHRvIGNhbGwKLSAqIHtAbGluayBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhcyNkcmF3VGV4dChqYXZhLmxhbmcuQ2hhclNlcXVlbmNlLCBpbnQsIGludCwgZmxvYXQsIGZsb2F0LCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50KQotICogIENhbnZhcy5kcmF3VGV4dCgpfSBkaXJlY3RseS48L3A+CisgKiB7QGxpbmsgYW5kcm9pZC5ncmFwaGljcy5DYW52YXMjZHJhd1RleHQoamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSwgaW50LCBpbnQsCisgKiBmbG9hdCwgZmxvYXQsIGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQpCisgKiBDYW52YXMuZHJhd1RleHQoKX0gZGlyZWN0bHkuPC9wPgogICovCiBwdWJsaWMgY2xhc3MKIFN0YXRpY0xheW91dApAQCAtNjIsNyArNjQsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpbmNsdWRlcGFkLAogICAgICAgICAgICAgICAgICAgICAgICAgVGV4dFV0aWxzLlRydW5jYXRlQXQgZWxsaXBzaXplLCBpbnQgZWxsaXBzaXplZFdpZHRoKSB7CiAgICAgICAgIHN1cGVyKChlbGxpcHNpemUgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICA/IHNvdXJjZSAKKyAgICAgICAgICAgICAgICA/IHNvdXJjZQogICAgICAgICAgICAgICAgIDogKHNvdXJjZSBpbnN0YW5jZW9mIFNwYW5uZWQpCiAgICAgICAgICAgICAgICAgICAgID8gbmV3IFNwYW5uZWRFbGxpcHNpemVyKHNvdXJjZSkKICAgICAgICAgICAgICAgICAgICAgOiBuZXcgRWxsaXBzaXplcihzb3VyY2UpLApAQCAtNzIsNyArNzQsNyBAQAogICAgICAgICAgKiBUaGlzIGlzIGFubm95aW5nLCBidXQgd2UgY2FuJ3QgcmVmZXIgdG8gdGhlIGxheW91dCB1bnRpbAogICAgICAgICAgKiBzdXBlcmNsYXNzIGNvbnN0cnVjdGlvbiBpcyBmaW5pc2hlZCwgYW5kIHRoZSBzdXBlcmNsYXNzCiAgICAgICAgICAqIGNvbnN0cnVjdG9yIHdhbnRzIHRoZSByZWZlcmVuY2UgdG8gdGhlIGRpc3BsYXkgdGV4dC4KLSAgICAgICAgICogCisgICAgICAgICAqCiAgICAgICAgICAqIFRoaXMgd2lsbCBicmVhayBpZiB0aGUgc3VwZXJjbGFzcyBjb25zdHJ1Y3RvciBldmVyIGFjdHVhbGx5CiAgICAgICAgICAqIGNhcmVzIGFib3V0IHRoZSBjb250ZW50IGluc3RlYWQgb2YganVzdCBob2xkaW5nIHRoZSByZWZlcmVuY2UuCiAgICAgICAgICAqLwpAQCAtOTQsMTMgKzk2LDEzIEBACiAgICAgICAgIG1MaW5lRGlyZWN0aW9ucyA9IG5ldyBEaXJlY3Rpb25zWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVV0aWxzLmlkZWFsSW50QXJyYXlTaXplKDIgKiBtQ29sdW1ucyldOwogCisgICAgICAgIG1NZWFzdXJlZCA9IE1lYXN1cmVkVGV4dC5vYnRhaW4oKTsKKwogICAgICAgICBnZW5lcmF0ZShzb3VyY2UsIGJ1ZnN0YXJ0LCBidWZlbmQsIHBhaW50LCBvdXRlcndpZHRoLCBhbGlnbiwKICAgICAgICAgICAgICAgICAgc3BhY2luZ211bHQsIHNwYWNpbmdhZGQsIGluY2x1ZGVwYWQsIGluY2x1ZGVwYWQsCiAgICAgICAgICAgICAgICAgIGVsbGlwc2l6ZSAhPSBudWxsLCBlbGxpcHNpemVkV2lkdGgsIGVsbGlwc2l6ZSk7CiAKLSAgICAgICAgbUNoZGlycyA9IG51bGw7Ci0gICAgICAgIG1DaHMgPSBudWxsOwotICAgICAgICBtV2lkdGhzID0gbnVsbDsKKyAgICAgICAgbU1lYXN1cmVkID0gTWVhc3VyZWRUZXh0LnJlY3ljbGUobU1lYXN1cmVkKTsKICAgICAgICAgbUZvbnRNZXRyaWNzSW50ID0gbnVsbDsKICAgICB9CiAKQEAgLTExMSw2ICsxMTMsNyBAQAogICAgICAgICBtTGluZXMgPSBuZXcgaW50W0FycmF5VXRpbHMuaWRlYWxJbnRBcnJheVNpemUoMiAqIG1Db2x1bW5zKV07CiAgICAgICAgIG1MaW5lRGlyZWN0aW9ucyA9IG5ldyBEaXJlY3Rpb25zWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVV0aWxzLmlkZWFsSW50QXJyYXlTaXplKDIgKiBtQ29sdW1ucyldOworICAgICAgICBtTWVhc3VyZWQgPSBNZWFzdXJlZFRleHQub2J0YWluKCk7CiAgICAgfQogCiAgICAgLyogcGFja2FnZSAqLyB2b2lkIGdlbmVyYXRlKENoYXJTZXF1ZW5jZSBzb3VyY2UsIGludCBidWZzdGFydCwgaW50IGJ1ZmVuZCwKQEAgLTEyOCw1OSArMTMxLDUwIEBACiAgICAgICAgIFBhaW50LkZvbnRNZXRyaWNzSW50IGZtID0gbUZvbnRNZXRyaWNzSW50OwogICAgICAgICBpbnRbXSBjaG9vc2VodHYgPSBudWxsOwogCi0gICAgICAgIGludCBlbmQgPSBUZXh0VXRpbHMuaW5kZXhPZihzb3VyY2UsICdcbicsIGJ1ZnN0YXJ0LCBidWZlbmQpOwotICAgICAgICBpbnQgYnVmc2l6ID0gZW5kID49IDAgPyBlbmQgLSBidWZzdGFydCA6IGJ1ZmVuZCAtIGJ1ZnN0YXJ0OwotICAgICAgICBib29sZWFuIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgTWVhc3VyZWRUZXh0IG1lYXN1cmVkID0gbU1lYXN1cmVkOwogCi0gICAgICAgIGlmIChtQ2hkaXJzID09IG51bGwpIHsKLSAgICAgICAgICAgIG1DaGRpcnMgPSBuZXcgYnl0ZVtBcnJheVV0aWxzLmlkZWFsQnl0ZUFycmF5U2l6ZShidWZzaXogKyAxKV07Ci0gICAgICAgICAgICBtQ2hzID0gbmV3IGNoYXJbQXJyYXlVdGlscy5pZGVhbENoYXJBcnJheVNpemUoYnVmc2l6ICsgMSldOwotICAgICAgICAgICAgbVdpZHRocyA9IG5ldyBmbG9hdFtBcnJheVV0aWxzLmlkZWFsSW50QXJyYXlTaXplKChidWZzaXogKyAxKSAqIDIpXTsKLSAgICAgICAgfQotCi0gICAgICAgIGJ5dGVbXSBjaGRpcnMgPSBtQ2hkaXJzOwotICAgICAgICBjaGFyW10gY2hzID0gbUNoczsKLSAgICAgICAgZmxvYXRbXSB3aWR0aHMgPSBtV2lkdGhzOwotCi0gICAgICAgIEFsdGVyZWRDaGFyU2VxdWVuY2UgYWx0ZXIgPSBudWxsOwogICAgICAgICBTcGFubmVkIHNwYW5uZWQgPSBudWxsOwotCiAgICAgICAgIGlmIChzb3VyY2UgaW5zdGFuY2VvZiBTcGFubmVkKQogICAgICAgICAgICAgc3Bhbm5lZCA9IChTcGFubmVkKSBzb3VyY2U7CiAKICAgICAgICAgaW50IERFRkFVTFRfRElSID0gRElSX0xFRlRfVE9fUklHSFQ7IC8vIFhYWAogCi0gICAgICAgIGZvciAoaW50IHN0YXJ0ID0gYnVmc3RhcnQ7IHN0YXJ0IDw9IGJ1ZmVuZDsgc3RhcnQgPSBlbmQpIHsKLSAgICAgICAgICAgIGlmIChmaXJzdCkKLSAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICBpbnQgcGFyYUVuZDsKKyAgICAgICAgZm9yIChpbnQgcGFyYVN0YXJ0ID0gYnVmc3RhcnQ7IHBhcmFTdGFydCA8PSBidWZlbmQ7IHBhcmFTdGFydCA9IHBhcmFFbmQpIHsKKyAgICAgICAgICAgIHBhcmFFbmQgPSBUZXh0VXRpbHMuaW5kZXhPZihzb3VyY2UsICdcbicsIHBhcmFTdGFydCwgYnVmZW5kKTsKKyAgICAgICAgICAgIGlmIChwYXJhRW5kIDwgMCkKKyAgICAgICAgICAgICAgICBwYXJhRW5kID0gYnVmZW5kOwogICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGVuZCA9IFRleHRVdGlscy5pbmRleE9mKHNvdXJjZSwgJ1xuJywgc3RhcnQsIGJ1ZmVuZCk7CisgICAgICAgICAgICAgICAgcGFyYUVuZCsrOworICAgICAgICAgICAgaW50IHBhcmFMZW4gPSBwYXJhRW5kIC0gcGFyYVN0YXJ0OwogCi0gICAgICAgICAgICBpZiAoZW5kIDwgMCkKLSAgICAgICAgICAgICAgICBlbmQgPSBidWZlbmQ7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgZW5kKys7Ci0KLSAgICAgICAgICAgIGludCBmaXJzdFdpZHRoTGluZUNvdW50ID0gMTsKKyAgICAgICAgICAgIGludCBmaXJzdFdpZHRoTGluZUxpbWl0ID0gbUxpbmVDb3VudCArIDE7CiAgICAgICAgICAgICBpbnQgZmlyc3R3aWR0aCA9IG91dGVyd2lkdGg7CiAgICAgICAgICAgICBpbnQgcmVzdHdpZHRoID0gb3V0ZXJ3aWR0aDsKIAogICAgICAgICAgICAgTGluZUhlaWdodFNwYW5bXSBjaG9vc2VodCA9IG51bGw7CiAKICAgICAgICAgICAgIGlmIChzcGFubmVkICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBMZWFkaW5nTWFyZ2luU3BhbltdIHNwOwotCi0gICAgICAgICAgICAgICAgc3AgPSBzcGFubmVkLmdldFNwYW5zKHN0YXJ0LCBlbmQsIExlYWRpbmdNYXJnaW5TcGFuLmNsYXNzKTsKKyAgICAgICAgICAgICAgICBMZWFkaW5nTWFyZ2luU3BhbltdIHNwID0gZ2V0UGFyYWdyYXBoU3BhbnMoc3Bhbm5lZCwgcGFyYVN0YXJ0LCBwYXJhRW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgTGVhZGluZ01hcmdpblNwYW4uY2xhc3MpOwogICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3AubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgTGVhZGluZ01hcmdpblNwYW4gbG1zID0gc3BbaV07CiAgICAgICAgICAgICAgICAgICAgIGZpcnN0d2lkdGggLT0gc3BbaV0uZ2V0TGVhZGluZ01hcmdpbih0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgcmVzdHdpZHRoIC09IHNwW2ldLmdldExlYWRpbmdNYXJnaW4oZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICBpZiAobG1zIGluc3RhbmNlb2YgTGVhZGluZ01hcmdpblNwYW4uTGVhZGluZ01hcmdpblNwYW4yKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFdpZHRoTGluZUNvdW50ID0gKChMZWFkaW5nTWFyZ2luU3Bhbi5MZWFkaW5nTWFyZ2luU3BhbjIpbG1zKS5nZXRMZWFkaW5nTWFyZ2luTGluZUNvdW50KCk7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAvLyBMZWFkaW5nTWFyZ2luU3BhbjIgaXMgb2RkLiAgVGhlIGNvdW50IGFmZmVjdHMgYWxsCisgICAgICAgICAgICAgICAgICAgIC8vIGxlYWRpbmcgbWFyZ2luIHNwYW5zLCBub3QganVzdCB0aGlzIHBhcnRpY3VsYXIgb25lLAorICAgICAgICAgICAgICAgICAgICAvLyBhbmQgc3RhcnQgZnJvbSB0aGUgdG9wIG9mIHRoZSBzcGFuLCBub3QgdGhlIHRvcCBvZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgLy8gcGFyYWdyYXBoLgorICAgICAgICAgICAgICAgICAgICBpZiAobG1zIGluc3RhbmNlb2YgTGVhZGluZ01hcmdpblNwYW4yKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMZWFkaW5nTWFyZ2luU3BhbjIgbG1zMiA9IChMZWFkaW5nTWFyZ2luU3BhbjIpIGxtczsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBsbXNGaXJzdExpbmUgPSBnZXRMaW5lRm9yT2Zmc2V0KHNwYW5uZWQuZ2V0U3BhblN0YXJ0KGxtczIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0V2lkdGhMaW5lTGltaXQgPSBsbXNGaXJzdExpbmUgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbXMyLmdldExlYWRpbmdNYXJnaW5MaW5lQ291bnQoKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGNob29zZWh0ID0gc3Bhbm5lZC5nZXRTcGFucyhzdGFydCwgZW5kLCBMaW5lSGVpZ2h0U3Bhbi5jbGFzcyk7CisgICAgICAgICAgICAgICAgY2hvb3NlaHQgPSBnZXRQYXJhZ3JhcGhTcGFucyhzcGFubmVkLCBwYXJhU3RhcnQsIHBhcmFFbmQsIExpbmVIZWlnaHRTcGFuLmNsYXNzKTsKIAogICAgICAgICAgICAgICAgIGlmIChjaG9vc2VodC5sZW5ndGggIT0gMCkgewogICAgICAgICAgICAgICAgICAgICBpZiAoY2hvb3NlaHR2ID09IG51bGwgfHwKQEAgLTE5MiwxMSArMTg2LDExIEBACiAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hvb3NlaHQubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvID0gc3Bhbm5lZC5nZXRTcGFuU3RhcnQoY2hvb3NlaHRbaV0pOwogCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobyA8IHN0YXJ0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobyA8IHBhcmFTdGFydCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0YXJ0cyBpbiB0aGlzIGxheW91dCwgYmVmb3JlIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGN1cnJlbnQgcGFyYWdyYXBoCiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaG9vc2VodHZbaV0gPSBnZXRMaW5lVG9wKGdldExpbmVGb3JPZmZzZXQobykpOyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaG9vc2VodHZbaV0gPSBnZXRMaW5lVG9wKGdldExpbmVGb3JPZmZzZXQobykpOwogICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGFydHMgaW4gdGhpcyBwYXJhZ3JhcGgKIApAQCAtMjA2LDE2MiArMjAwLDg3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAoZW5kIC0gc3RhcnQgPiBjaGRpcnMubGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgY2hkaXJzID0gbmV3IGJ5dGVbQXJyYXlVdGlscy5pZGVhbEJ5dGVBcnJheVNpemUoZW5kIC0gc3RhcnQpXTsKLSAgICAgICAgICAgICAgICBtQ2hkaXJzID0gY2hkaXJzOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGVuZCAtIHN0YXJ0ID4gY2hzLmxlbmd0aCkgewotICAgICAgICAgICAgICAgIGNocyA9IG5ldyBjaGFyW0FycmF5VXRpbHMuaWRlYWxDaGFyQXJyYXlTaXplKGVuZCAtIHN0YXJ0KV07Ci0gICAgICAgICAgICAgICAgbUNocyA9IGNoczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICgoZW5kIC0gc3RhcnQpICogMiA+IHdpZHRocy5sZW5ndGgpIHsKLSAgICAgICAgICAgICAgICB3aWR0aHMgPSBuZXcgZmxvYXRbQXJyYXlVdGlscy5pZGVhbEludEFycmF5U2l6ZSgoZW5kIC0gc3RhcnQpICogMildOwotICAgICAgICAgICAgICAgIG1XaWR0aHMgPSB3aWR0aHM7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBtZWFzdXJlZC5zZXRQYXJhKHNvdXJjZSwgcGFyYVN0YXJ0LCBwYXJhRW5kLCBESVJfUkVRVUVTVF9ERUZBVUxUX0xUUik7CisgICAgICAgICAgICBjaGFyW10gY2hzID0gbWVhc3VyZWQubUNoYXJzOworICAgICAgICAgICAgZmxvYXRbXSB3aWR0aHMgPSBtZWFzdXJlZC5tV2lkdGhzOworICAgICAgICAgICAgYnl0ZVtdIGNoZGlycyA9IG1lYXN1cmVkLm1MZXZlbHM7CisgICAgICAgICAgICBpbnQgZGlyID0gbWVhc3VyZWQubURpcjsKKyAgICAgICAgICAgIGJvb2xlYW4gZWFzeSA9IG1lYXN1cmVkLm1FYXN5OwogCi0gICAgICAgICAgICBUZXh0VXRpbHMuZ2V0Q2hhcnMoc291cmNlLCBzdGFydCwgZW5kLCBjaHMsIDApOwotICAgICAgICAgICAgZmluYWwgaW50IG4gPSBlbmQgLSBzdGFydDsKLQotICAgICAgICAgICAgYm9vbGVhbiBlYXN5ID0gdHJ1ZTsKLSAgICAgICAgICAgIGJvb2xlYW4gYWx0ZXJlZCA9IGZhbHNlOwotICAgICAgICAgICAgaW50IGRpciA9IERFRkFVTFRfRElSOyAvLyBYWFgKLQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAoY2hzW2ldID49IEZJUlNUX1JJR0hUX1RPX0xFRlQpIHsKLSAgICAgICAgICAgICAgICAgICAgZWFzeSA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIEVuc3VyZSB0aGF0IG5vbmUgb2YgdGhlIHVuZGVybHlpbmcgY2hhcmFjdGVycyBhcmUgdHJlYXRlZAotICAgICAgICAgICAgLy8gYXMgdmlhYmxlIGJyZWFrcG9pbnRzLCBhbmQgdGhhdCB0aGUgZW50aXJlIHJ1biBnZXRzIHRoZQotICAgICAgICAgICAgLy8gc2FtZSBiaWRpIGRpcmVjdGlvbi4KLQotICAgICAgICAgICAgaWYgKHNvdXJjZSBpbnN0YW5jZW9mIFNwYW5uZWQpIHsKLSAgICAgICAgICAgICAgICBTcGFubmVkIHNwID0gKFNwYW5uZWQpIHNvdXJjZTsKLSAgICAgICAgICAgICAgICBSZXBsYWNlbWVudFNwYW5bXSBzcGFucyA9IHNwLmdldFNwYW5zKHN0YXJ0LCBlbmQsIFJlcGxhY2VtZW50U3Bhbi5jbGFzcyk7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGludCB5ID0gMDsgeSA8IHNwYW5zLmxlbmd0aDsgeSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBhID0gc3AuZ2V0U3BhblN0YXJ0KHNwYW5zW3ldKTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGIgPSBzcC5nZXRTcGFuRW5kKHNwYW5zW3ldKTsKLQotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCB4ID0gYTsgeCA8IGI7IHgrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgY2hzW3ggLSBzdGFydF0gPSAnXHVGRkZDJzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCFlYXN5KSB7Ci0gICAgICAgICAgICAgICAgLy8gWFhYIHB1dCBvdmVycmlkZSBmbGFncywgZXRjLiBpbnRvIGNoZGlycwotICAgICAgICAgICAgICAgIGRpciA9IGJpZGkoZGlyLCBjaHMsIGNoZGlycywgbiwgZmFsc2UpOwotCi0gICAgICAgICAgICAgICAgLy8gRG8gbWlycm9yaW5nIGZvciByaWdodC10by1sZWZ0IHNlZ21lbnRzCi0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoY2hkaXJzW2ldID09IENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9SSUdIVF9UT19MRUZUKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgajsKLQotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gaTsgaiA8IG47IGorKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGRpcnNbal0gIT0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX1JJR0hUX1RPX0xFRlQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoQW5kcm9pZENoYXJhY3Rlci5taXJyb3IoY2hzLCBpLCBqIC0gaSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0ZXJlZCA9IHRydWU7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGkgPSBqIC0gMTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQ2hhclNlcXVlbmNlIHN1YjsKLQotICAgICAgICAgICAgaWYgKGFsdGVyZWQpIHsKLSAgICAgICAgICAgICAgICBpZiAoYWx0ZXIgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgYWx0ZXIgPSBBbHRlcmVkQ2hhclNlcXVlbmNlLm1ha2Uoc291cmNlLCBjaHMsIHN0YXJ0LCBlbmQpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgYWx0ZXIudXBkYXRlKGNocywgc3RhcnQsIGVuZCk7Ci0KLSAgICAgICAgICAgICAgICBzdWIgPSBhbHRlcjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc3ViID0gc291cmNlOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgQ2hhclNlcXVlbmNlIHN1YiA9IHNvdXJjZTsKIAogICAgICAgICAgICAgaW50IHdpZHRoID0gZmlyc3R3aWR0aDsKIAogICAgICAgICAgICAgZmxvYXQgdyA9IDA7Ci0gICAgICAgICAgICBpbnQgaGVyZSA9IHN0YXJ0OworICAgICAgICAgICAgaW50IGhlcmUgPSBwYXJhU3RhcnQ7CiAKLSAgICAgICAgICAgIGludCBvayA9IHN0YXJ0OworICAgICAgICAgICAgaW50IG9rID0gcGFyYVN0YXJ0OwogICAgICAgICAgICAgZmxvYXQgb2t3aWR0aCA9IHc7CiAgICAgICAgICAgICBpbnQgb2thc2NlbnQgPSAwLCBva2Rlc2NlbnQgPSAwLCBva3RvcCA9IDAsIG9rYm90dG9tID0gMDsKIAotICAgICAgICAgICAgaW50IGZpdCA9IHN0YXJ0OworICAgICAgICAgICAgaW50IGZpdCA9IHBhcmFTdGFydDsKICAgICAgICAgICAgIGZsb2F0IGZpdHdpZHRoID0gdzsKICAgICAgICAgICAgIGludCBmaXRhc2NlbnQgPSAwLCBmaXRkZXNjZW50ID0gMCwgZml0dG9wID0gMCwgZml0Ym90dG9tID0gMDsKIAotICAgICAgICAgICAgYm9vbGVhbiB0YWIgPSBmYWxzZTsKKyAgICAgICAgICAgIGJvb2xlYW4gaGFzVGFiT3JFbW9qaSA9IGZhbHNlOworICAgICAgICAgICAgYm9vbGVhbiBoYXNUYWIgPSBmYWxzZTsKKyAgICAgICAgICAgIFRhYlN0b3BzIHRhYlN0b3BzID0gbnVsbDsKIAotICAgICAgICAgICAgaW50IG5leHQ7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkgPSBuZXh0KSB7Ci0gICAgICAgICAgICAgICAgaWYgKHNwYW5uZWQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgbmV4dCA9IGVuZDsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIG5leHQgPSBzcGFubmVkLm5leHRTcGFuVHJhbnNpdGlvbihpLCBlbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRyaWNBZmZlY3RpbmdTcGFuLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3MpOworICAgICAgICAgICAgZm9yIChpbnQgc3BhblN0YXJ0ID0gcGFyYVN0YXJ0LCBzcGFuRW5kID0gc3BhblN0YXJ0LCBuZXh0U3BhblN0YXJ0OworICAgICAgICAgICAgICAgICAgICBzcGFuU3RhcnQgPCBwYXJhRW5kOyBzcGFuU3RhcnQgPSBuZXh0U3BhblN0YXJ0KSB7CiAKLSAgICAgICAgICAgICAgICBpZiAoc3Bhbm5lZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhaW50LmdldFRleHRXaWR0aHMoc3ViLCBpLCBuZXh0LCB3aWR0aHMpOwotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHdpZHRocywgMCwgd2lkdGhzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZCAtIHN0YXJ0ICsgKGkgLSBzdGFydCksIG5leHQgLSBpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgcGFpbnQuZ2V0Rm9udE1ldHJpY3NJbnQoZm0pOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Xb3JrUGFpbnQuYmFzZWxpbmVTaGlmdCA9IDA7CisgICAgICAgICAgICAgICAgaWYgKHNwYW5TdGFydCA9PSBzcGFuRW5kKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzcGFubmVkID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBzcGFuRW5kID0gcGFyYUVuZDsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgc3BhbkVuZCA9IHNwYW5uZWQubmV4dFNwYW5UcmFuc2l0aW9uKHNwYW5TdGFydCwgcGFyYUVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0cmljQWZmZWN0aW5nU3Bhbi5jbGFzcyk7CiAKLSAgICAgICAgICAgICAgICAgICAgU3R5bGVkLmdldFRleHRXaWR0aHMocGFpbnQsIG1Xb3JrUGFpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYW5uZWQsIGksIG5leHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRocywgZm0pOwotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHdpZHRocywgMCwgd2lkdGhzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZCAtIHN0YXJ0ICsgKGkgLSBzdGFydCksIG5leHQgLSBpKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAobVdvcmtQYWludC5iYXNlbGluZVNoaWZ0IDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZm0uYXNjZW50ICs9IG1Xb3JrUGFpbnQuYmFzZWxpbmVTaGlmdDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZtLnRvcCArPSBtV29ya1BhaW50LmJhc2VsaW5lU2hpZnQ7CisgICAgICAgICAgICAgICAgICAgIGludCBzcGFuTGVuID0gc3BhbkVuZCAtIHNwYW5TdGFydDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNwYW5uZWQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbWVhc3VyZWQuYWRkU3R5bGVSdW4ocGFpbnQsIHNwYW5MZW4sIGZtKTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZtLmRlc2NlbnQgKz0gbVdvcmtQYWludC5iYXNlbGluZVNoaWZ0OwotICAgICAgICAgICAgICAgICAgICAgICAgZm0uYm90dG9tICs9IG1Xb3JrUGFpbnQuYmFzZWxpbmVTaGlmdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIE1ldHJpY0FmZmVjdGluZ1NwYW5bXSBzcGFucyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Bhbm5lZC5nZXRTcGFucyhzcGFuU3RhcnQsIHNwYW5FbmQsIE1ldHJpY0FmZmVjdGluZ1NwYW4uY2xhc3MpOworICAgICAgICAgICAgICAgICAgICAgICAgbWVhc3VyZWQuYWRkU3R5bGVSdW4ocGFpbnQsIHNwYW5zLCBzcGFuTGVuLCBmbSk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgICAgICBuZXh0U3BhblN0YXJ0ID0gc3BhbkVuZDsKKyAgICAgICAgICAgICAgICBpbnQgc3RhcnRJblBhcmEgPSBzcGFuU3RhcnQgLSBwYXJhU3RhcnQ7CisgICAgICAgICAgICAgICAgaW50IGVuZEluUGFyYSA9IHNwYW5FbmQgLSBwYXJhU3RhcnQ7CisKICAgICAgICAgICAgICAgICBpbnQgZm10b3AgPSBmbS50b3A7CiAgICAgICAgICAgICAgICAgaW50IGZtYm90dG9tID0gZm0uYm90dG9tOwogICAgICAgICAgICAgICAgIGludCBmbWFzY2VudCA9IGZtLmFzY2VudDsKICAgICAgICAgICAgICAgICBpbnQgZm1kZXNjZW50ID0gZm0uZGVzY2VudDsKIAotICAgICAgICAgICAgICAgIGlmIChmYWxzZSkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IGk7IGogPCBuZXh0OyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCh3aWR0aHNbaiAtIHN0YXJ0ICsgKGVuZCAtIHN0YXJ0KV0pOwotICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCcgJyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBMb2cuZSgidGV4dCIsIHNiLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSBpOyBqIDwgbmV4dDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNoYXIgYyA9IGNoc1tqIC0gc3RhcnRdOworICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSBzcGFuU3RhcnQ7IGogPCBzcGFuRW5kOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgY2hhciBjID0gY2hzW2ogLSBwYXJhU3RhcnRdOwogICAgICAgICAgICAgICAgICAgICBmbG9hdCBiZWZvcmUgPSB3OwogCiAgICAgICAgICAgICAgICAgICAgIGlmIChjID09ICdcbicpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIDsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjID09ICdcdCcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHcgPSBMYXlvdXQubmV4dFRhYihzdWIsIHN0YXJ0LCBlbmQsIHcsIG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgdGFiID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjID49IDB4RDgwMCAmJiBjIDw9IDB4REZGRiAmJiBqICsgMSA8IG5leHQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBlbW9qaSA9IENoYXJhY3Rlci5jb2RlUG9pbnRBdChjaHMsIGogLSBzdGFydCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFzVGFiID09IGZhbHNlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzVGFiID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNUYWJPckVtb2ppID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3Bhbm5lZCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZpcnN0IHRhYiB0aGlzIHBhcmEsIGNoZWNrIGZvciB0YWJzdG9wcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYWJTdG9wU3BhbltdIHNwYW5zID0gZ2V0UGFyYWdyYXBoU3BhbnMoc3Bhbm5lZCwgcGFyYVN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFFbmQsIFRhYlN0b3BTcGFuLmNsYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNwYW5zLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYlN0b3BzID0gbmV3IFRhYlN0b3BzKFRBQl9JTkNSRU1FTlQsIHNwYW5zKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YWJTdG9wcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdyA9IHRhYlN0b3BzLm5leHRUYWIodyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHcgPSBUYWJTdG9wcy5uZXh0RGVmYXVsdFN0b3AodywgVEFCX0lOQ1JFTUVOVCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA+PSAweEQ4MDAgJiYgYyA8PSAweERGRkYgJiYgaiArIDEgPCBzcGFuRW5kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZW1vamkgPSBDaGFyYWN0ZXIuY29kZVBvaW50QXQoY2hzLCBqIC0gcGFyYVN0YXJ0KTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVtb2ppID49IE1JTl9FTU9KSSAmJiBlbW9qaSA8PSBNQVhfRU1PSkkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXRtYXAgYm0gPSBFTU9KSV9GQUNUT1JZLgpAQCAtMzc2LDIxICsyOTUsMjEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoUGFpbnQgPSBtV29ya1BhaW50OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgd2lkID0gKGZsb2F0KSBibS5nZXRXaWR0aCgpICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgd2lkID0gYm0uZ2V0V2lkdGgoKSAqCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC13aGljaFBhaW50LmFzY2VudCgpIC8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm0uZ2V0SGVpZ2h0KCk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdyArPSB3aWQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYiA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc1RhYk9yRW1vamkgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqKys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdyArPSB3aWR0aHNbaiAtIHN0YXJ0ICsgKGVuZCAtIHN0YXJ0KV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHcgKz0gd2lkdGhzW2ogLSBwYXJhU3RhcnRdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdyArPSB3aWR0aHNbaiAtIHN0YXJ0ICsgKGVuZCAtIHN0YXJ0KV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdyArPSB3aWR0aHNbaiAtIHBhcmFTdGFydF07CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3ICs9IHdpZHRoc1tqIC0gc3RhcnQgKyAoZW5kIC0gc3RhcnQpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHcgKz0gd2lkdGhzW2ogLSBwYXJhU3RhcnRdOwogICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgLy8gTG9nLmUoInRleHQiLCAid2FzICIgKyBiZWZvcmUgKyAiIG5vdyAiICsgdyArICIgYWZ0ZXIgIiArIGMgKyAiIHdpdGhpbiAiICsgd2lkdGgpOwpAQCAtNDExLDcgKzMzMCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAgICAgICAgICogRnJvbSB0aGUgVW5pY29kZSBMaW5lIEJyZWFraW5nIEFsZ29yaXRobToKICAgICAgICAgICAgICAgICAgICAgICAgICAqIChhdCBsZWFzdCBhcHByb3hpbWF0ZWx5KQotICAgICAgICAgICAgICAgICAgICAgICAgICogIAorICAgICAgICAgICAgICAgICAgICAgICAgICoKICAgICAgICAgICAgICAgICAgICAgICAgICAqIC4sOjsgYXJlIGNsYXNzIElTOiBicmVha3BvaW50cwogICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICBleGNlcHQgd2hlbiBhZGphY2VudCB0byBkaWdpdHMKICAgICAgICAgICAgICAgICAgICAgICAgICAqIC8gICAgaXMgY2xhc3MgU1k6IGEgYnJlYWtwb2ludApAQCAtNDI2LDEyICszNDUsMTIgQEAKIAogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGMgPT0gJyAnIHx8IGMgPT0gJ1x0JyB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoYyA9PSAnLicgIHx8IGMgPT0gJywnIHx8IGMgPT0gJzonIHx8IGMgPT0gJzsnKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaiAtIDEgPCBoZXJlIHx8ICFDaGFyYWN0ZXIuaXNEaWdpdChjaHNbaiAtIDEgLSBzdGFydF0pKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaiArIDEgPj0gbmV4dCB8fCAhQ2hhcmFjdGVyLmlzRGlnaXQoY2hzW2ogKyAxIC0gc3RhcnRdKSkpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChqIC0gMSA8IGhlcmUgfHwgIUNoYXJhY3Rlci5pc0RpZ2l0KGNoc1tqIC0gMSAtIHBhcmFTdGFydF0pKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaiArIDEgPj0gc3BhbkVuZCB8fCAhQ2hhcmFjdGVyLmlzRGlnaXQoY2hzW2ogKyAxIC0gcGFyYVN0YXJ0XSkpKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoYyA9PSAnLycgfHwgYyA9PSAnLScpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChqICsgMSA+PSBuZXh0IHx8ICFDaGFyYWN0ZXIuaXNEaWdpdChjaHNbaiArIDEgLSBzdGFydF0pKSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGogKyAxID49IHNwYW5FbmQgfHwgIUNoYXJhY3Rlci5pc0RpZ2l0KGNoc1tqICsgMSAtIHBhcmFTdGFydF0pKSkgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYyA+PSBGSVJTVF9DSksgJiYgaXNJZGVvZ3JhcGhpYyhjLCB0cnVlKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqICsgMSA8IG5leHQgJiYgaXNJZGVvZ3JhcGhpYyhjaHNbaiArIDEgLSBzdGFydF0sIGZhbHNlKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaiArIDEgPCBzcGFuRW5kICYmIGlzSWRlb2dyYXBoaWMoY2hzW2ogKyAxIC0gcGFyYVN0YXJ0XSwgZmFsc2UpKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9rd2lkdGggPSB3OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9rID0gaiArIDE7CiAKQEAgLTQ0OCw3ICszNjcsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9rICE9IGhlcmUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBMb2cuZSgidGV4dCIsICJvdXRwdXQgb2sgIiArIGhlcmUgKyAiIHRvICIgK29rKTsKIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChvayA8IG5leHQgJiYgY2hzW29rIC0gc3RhcnRdID09ICcgJykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChvayA8IHNwYW5FbmQgJiYgY2hzW29rIC0gcGFyYVN0YXJ0XSA9PSAnICcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2srKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKQEAgLTQ1NywxMCArMzc2LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBva2FzY2VudCwgb2tkZXNjZW50LCBva3RvcCwgb2tib3R0b20sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BhY2luZ211bHQsIHNwYWNpbmdhZGQsIGNob29zZWh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hvb3NlaHR2LCBmbSwgdGFiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZE11bHRpcGx5LCBzdGFydCwgY2hkaXJzLCBkaXIsIGVhc3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaG9vc2VodHYsIGZtLCBoYXNUYWJPckVtb2ppLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZE11bHRpcGx5LCBwYXJhU3RhcnQsIGNoZGlycywgZGlyLCBlYXN5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2sgPT0gYnVmZW5kLCBpbmNsdWRlcGFkLCB0cmFja3BhZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRocywgc3RhcnQsIGVuZCAtIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hzLCB3aWR0aHMsIGhlcmUgLSBwYXJhU3RhcnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSwgZWxsaXBzaXplZFdpZHRoLCBva3dpZHRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFpbnQpOwogCkBAIC00ODQsNyArNDAzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvayAhPSBoZXJlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTG9nLmUoInRleHQiLCAib3V0cHV0IG9rICIgKyBoZXJlICsgIiB0byAiICtvayk7CiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAob2sgPCBuZXh0ICYmIGNoc1tvayAtIHN0YXJ0XSA9PSAnICcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAob2sgPCBzcGFuRW5kICYmIGNoc1tvayAtIHBhcmFTdGFydF0gPT0gJyAnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9rKys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogCkBAIC00OTMsMTAgKzQxMiwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2thc2NlbnQsIG9rZGVzY2VudCwgb2t0b3AsIG9rYm90dG9tLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYWNpbmdtdWx0LCBzcGFjaW5nYWRkLCBjaG9vc2VodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNob29zZWh0diwgZm0sIHRhYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRNdWx0aXBseSwgc3RhcnQsIGNoZGlycywgZGlyLCBlYXN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hvb3NlaHR2LCBmbSwgaGFzVGFiT3JFbW9qaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRNdWx0aXBseSwgcGFyYVN0YXJ0LCBjaGRpcnMsIGRpciwgZWFzeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9rID09IGJ1ZmVuZCwgaW5jbHVkZXBhZCwgdHJhY2twYWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aHMsIHN0YXJ0LCBlbmQgLSBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNocywgd2lkdGhzLCBoZXJlIC0gcGFyYVN0YXJ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUsIGVsbGlwc2l6ZWRXaWR0aCwgb2t3aWR0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhaW50KTsKIApAQCAtNTA5LDE5ICs0MjgsMjAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpdHRvcCwgZml0Ym90dG9tLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYWNpbmdtdWx0LCBzcGFjaW5nYWRkLCBjaG9vc2VodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNob29zZWh0diwgZm0sIHRhYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRNdWx0aXBseSwgc3RhcnQsIGNoZGlycywgZGlyLCBlYXN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hvb3NlaHR2LCBmbSwgaGFzVGFiT3JFbW9qaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRNdWx0aXBseSwgcGFyYVN0YXJ0LCBjaGRpcnMsIGRpciwgZWFzeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpdCA9PSBidWZlbmQsIGluY2x1ZGVwYWQsIHRyYWNrcGFkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGhzLCBzdGFydCwgZW5kIC0gc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaHMsIHdpZHRocywgaGVyZSAtIHBhcmFTdGFydCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlLCBlbGxpcHNpemVkV2lkdGgsIGZpdHdpZHRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFpbnQpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVyZSA9IGZpdDsKICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTG9nLmUoInRleHQiLCAib3V0cHV0IG9uZSAiICsgaGVyZSArICIgdG8gIiArKGhlcmUgKyAxKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVhc3VyZVRleHQocGFpbnQsIG1Xb3JrUGFpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlLCBoZXJlLCBoZXJlICsgMSwgZm0sIHRhYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBYWFggbm90IHN1cmUgd2h5IHRoZSBleGlzdGluZyBmbSB3YXNuJ3Qgb2suCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWVhc3VyZVRleHQocGFpbnQsIG1Xb3JrUGFpbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgc291cmNlLCBoZXJlLCBoZXJlICsgMSwgZm0sIHRhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICBudWxsKTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYgPSBvdXQoc291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVyZSwgaGVyZSsxLApAQCAtNTI5LDE5ICs0NDksMjIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZtLnRvcCwgZm0uYm90dG9tLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYWNpbmdtdWx0LCBzcGFjaW5nYWRkLCBjaG9vc2VodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNob29zZWh0diwgZm0sIHRhYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRNdWx0aXBseSwgc3RhcnQsIGNoZGlycywgZGlyLCBlYXN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hvb3NlaHR2LCBmbSwgaGFzVGFiT3JFbW9qaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRNdWx0aXBseSwgcGFyYVN0YXJ0LCBjaGRpcnMsIGRpciwgZWFzeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlcmUgKyAxID09IGJ1ZmVuZCwgaW5jbHVkZXBhZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrcGFkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGhzLCBzdGFydCwgZW5kIC0gc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaHMsIHdpZHRocywgaGVyZSAtIHBhcmFTdGFydCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlLCBlbGxpcHNpemVkV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aHNbaGVyZSAtIHN0YXJ0XSwgcGFpbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGhzW2hlcmUgLSBwYXJhU3RhcnRdLCBwYWludCk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZXJlID0gaGVyZSArIDE7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoZXJlIDwgaSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGogPSBuZXh0ID0gaGVyZTsgLy8gbXVzdCByZW1lYXN1cmUKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoZXJlIDwgc3BhblN0YXJ0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGlkbid0IG91dHB1dCBhbGwgdGhlIHRleHQgZm9yIHRoaXMgc3BhbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlJ3ZlIG1lYXN1cmVkIHRoZSByYXcgd2lkdGhzLCB0aG91Z2gsIHNvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8ganVzdCByZXNldCB0aGUgc3RhcnQgcG9pbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBqID0gbmV4dFNwYW5TdGFydCA9IGhlcmU7CiAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGogPSBoZXJlIC0gMTsgICAgLy8gY29udGludWUgbG9vcGluZwogICAgICAgICAgICAgICAgICAgICAgICAgfQpAQCAtNTUxLDE0ICs0NzQsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGZpdGFzY2VudCA9IGZpdGRlc2NlbnQgPSBmaXR0b3AgPSBmaXRib3R0b20gPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgb2thc2NlbnQgPSBva2Rlc2NlbnQgPSBva3RvcCA9IG9rYm90dG9tID0gMDsKIAotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKC0tZmlyc3RXaWR0aExpbmVDb3VudCA8PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoLS1maXJzdFdpZHRoTGluZUxpbWl0IDw9IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCA9IHJlc3R3aWR0aDsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKGVuZCAhPSBoZXJlKSB7CisgICAgICAgICAgICBpZiAocGFyYUVuZCAhPSBoZXJlKSB7CiAgICAgICAgICAgICAgICAgaWYgKChmaXR0b3AgfCBmaXRib3R0b20gfCBmaXRkZXNjZW50IHwgZml0YXNjZW50KSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIHBhaW50LmdldEZvbnRNZXRyaWNzSW50KGZtKTsKIApAQCAtNTcxLDIwICs0OTQsMjAgQEAKICAgICAgICAgICAgICAgICAvLyBMb2cuZSgidGV4dCIsICJvdXRwdXQgcmVzdCAiICsgaGVyZSArICIgdG8gIiArIGVuZCk7CiAKICAgICAgICAgICAgICAgICB2ID0gb3V0KHNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGhlcmUsIGVuZCwgZml0YXNjZW50LCBmaXRkZXNjZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgaGVyZSwgcGFyYUVuZCwgZml0YXNjZW50LCBmaXRkZXNjZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgZml0dG9wLCBmaXRib3R0b20sCiAgICAgICAgICAgICAgICAgICAgICAgICB2LAogICAgICAgICAgICAgICAgICAgICAgICAgc3BhY2luZ211bHQsIHNwYWNpbmdhZGQsIGNob29zZWh0LAotICAgICAgICAgICAgICAgICAgICAgICAgY2hvb3NlaHR2LCBmbSwgdGFiLAotICAgICAgICAgICAgICAgICAgICAgICAgbmVlZE11bHRpcGx5LCBzdGFydCwgY2hkaXJzLCBkaXIsIGVhc3ksCi0gICAgICAgICAgICAgICAgICAgICAgICBlbmQgPT0gYnVmZW5kLCBpbmNsdWRlcGFkLCB0cmFja3BhZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRocywgc3RhcnQsIGVuZCAtIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgY2hvb3NlaHR2LCBmbSwgaGFzVGFiT3JFbW9qaSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRNdWx0aXBseSwgcGFyYVN0YXJ0LCBjaGRpcnMsIGRpciwgZWFzeSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFFbmQgPT0gYnVmZW5kLCBpbmNsdWRlcGFkLCB0cmFja3BhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNocywgd2lkdGhzLCBoZXJlIC0gcGFyYVN0YXJ0LAogICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUsIGVsbGlwc2l6ZWRXaWR0aCwgdywgcGFpbnQpOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBzdGFydCA9IGVuZDsKKyAgICAgICAgICAgIHBhcmFTdGFydCA9IHBhcmFFbmQ7CiAKLSAgICAgICAgICAgIGlmIChlbmQgPT0gYnVmZW5kKQorICAgICAgICAgICAgaWYgKHBhcmFFbmQgPT0gYnVmZW5kKQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKQEAgLTU5OSwyNDYgKzUyMiwxMyBAQAogICAgICAgICAgICAgICAgICAgICB2LAogICAgICAgICAgICAgICAgICAgICBzcGFjaW5nbXVsdCwgc3BhY2luZ2FkZCwgbnVsbCwKICAgICAgICAgICAgICAgICAgICAgbnVsbCwgZm0sIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICBuZWVkTXVsdGlwbHksIGJ1ZmVuZCwgY2hkaXJzLCBERUZBVUxUX0RJUiwgdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgbmVlZE11bHRpcGx5LCBidWZlbmQsIG51bGwsIERFRkFVTFRfRElSLCB0cnVlLAogICAgICAgICAgICAgICAgICAgICB0cnVlLCBpbmNsdWRlcGFkLCB0cmFja3BhZCwKLSAgICAgICAgICAgICAgICAgICAgd2lkdGhzLCBidWZzdGFydCwgMCwKKyAgICAgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgYnVmc3RhcnQsCiAgICAgICAgICAgICAgICAgICAgIHdoZXJlLCBlbGxpcHNpemVkV2lkdGgsIDAsIHBhaW50KTsKICAgICAgICAgfQogICAgIH0KIAotICAgIC8qKgotICAgICAqIFJ1bnMgdGhlIHVuaWNvZGUgYmlkaSBhbGdvcml0aG0gb24gdGhlIGZpcnN0IG4gY2hhcnMgaW4gY2hzLCByZXR1cm5pbmcKLSAgICAgKiB0aGUgY2hhciBkaXJzIGluIGNoSW5mbyBhbmQgdGhlIGJhc2UgbGluZSBkaXJlY3Rpb24gb2YgdGhlIGZpcnN0Ci0gICAgICogcGFyYWdyYXBoLgotICAgICAqIAotICAgICAqIFhYWCBjaGFuZ2UgcmVzdWx0IGZyb20gZGlycyB0byBsZXZlbHMKLSAgICAgKiAgCi0gICAgICogQHBhcmFtIGRpciB0aGUgZGlyZWN0aW9uIGZsYWcsIGVpdGhlciBESVJfUkVRVUVTVF9MVFIsCi0gICAgICogRElSX1JFUVVFU1RfUlRMLCBESVJfUkVRVUVTVF9ERUZBVUxUX0xUUiwgb3IgRElSX1JFUVVFU1RfREVGQVVMVF9SVEwuCi0gICAgICogQHBhcmFtIGNocyB0aGUgdGV4dCB0byBleGFtaW5lCi0gICAgICogQHBhcmFtIGNoSW5mbyBvbiBpbnB1dCwgaWYgaGFzSW5mbyBpcyB0cnVlLCBvdmVycmlkZSBhbmQgb3RoZXIgZmxhZ3MgCi0gICAgICogcmVwcmVzZW50aW5nIG91dC1vZi1iYW5kIGVtYmVkZGluZyBpbmZvcm1hdGlvbi4gT24gb3V0cHV0LCB0aGUgZ2VuZXJhdGVkIAotICAgICAqIGRpcnMgb2YgdGhlIHRleHQuCi0gICAgICogQHBhcmFtIG4gdGhlIGxlbmd0aCBvZiB0aGUgdGV4dC9pbmZvcm1hdGlvbiBpbiBjaHMgYW5kIGNoSW5mbwotICAgICAqIEBwYXJhbSBoYXNJbmZvIHRydWUgaWYgY2hJbmZvIGhhcyBpbnB1dCBpbmZvcm1hdGlvbiwgb3RoZXJ3aXNlIHRoZQotICAgICAqIGlucHV0IGRhdGEgaW4gY2hJbmZvIGlzIGlnbm9yZWQuCi0gICAgICogQHJldHVybiB0aGUgcmVzb2x2ZWQgZGlyZWN0aW9uIGxldmVsIG9mIHRoZSBmaXJzdCBwYXJhZ3JhcGgsIGVpdGhlcgotICAgICAqIERJUl9MRUZUX1RPX1JJR0hUIG9yIERJUl9SSUdIVF9UT19MRUZULgotICAgICAqLwotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGludCBiaWRpKGludCBkaXIsIGNoYXJbXSBjaHMsIGJ5dGVbXSBjaEluZm8sIGludCBuLCAKLSAgICAgICAgICAgIGJvb2xlYW4gaGFzSW5mbykgewotICAgICAgICAKLSAgICAgICAgQW5kcm9pZENoYXJhY3Rlci5nZXREaXJlY3Rpb25hbGl0aWVzKGNocywgY2hJbmZvLCBuKTsKLQotICAgICAgICAvKgotICAgICAgICAgKiBEZXRlcm1pbmUgcHJpbWFyeSBwYXJhZ3JhcGggZGlyZWN0aW9uIGlmIG5vdCBzcGVjaWZpZWQKLSAgICAgICAgICovCi0gICAgICAgIGlmIChkaXIgIT0gRElSX1JFUVVFU1RfTFRSICYmIGRpciAhPSBESVJfUkVRVUVTVF9SVEwpIHsKLSAgICAgICAgICAgIC8vIHNldCB1cCBkZWZhdWx0Ci0gICAgICAgICAgICBkaXIgPSBkaXIgPj0gMCA/IERJUl9MRUZUX1RPX1JJR0hUIDogRElSX1JJR0hUX1RPX0xFRlQ7Ci0gICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG47IGorKykgewotICAgICAgICAgICAgICAgIGludCBkID0gY2hJbmZvW2pdOwotCi0gICAgICAgICAgICAgICAgaWYgKGQgPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0xFRlRfVE9fUklHSFQpIHsKLSAgICAgICAgICAgICAgICAgICAgZGlyID0gRElSX0xFRlRfVE9fUklHSFQ7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoZCA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfUklHSFRfVE9fTEVGVCkgewotICAgICAgICAgICAgICAgICAgICBkaXIgPSBESVJfUklHSFRfVE9fTEVGVDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgYnl0ZSBTT1IgPSBkaXIgPT0gRElSX0xFRlRfVE9fUklHSFQgPwotICAgICAgICAgICAgICAgIENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9MRUZUX1RPX1JJR0hUIDoKLSAgICAgICAgICAgICAgICBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfUklHSFRfVE9fTEVGVDsKLQotICAgICAgICAvKgotICAgICAgICAgKiBYWFggRXhwbGljaXQgb3ZlcnJpZGVzIHNob3VsZCBnbyBoZXJlCi0gICAgICAgICAqLwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFdlYWsgdHlwZSByZXNvbHV0aW9uCi0gICAgICAgICAqLwotCi0gICAgICAgIC8vIGR1bXAoY2hkaXJzLCBuLCAiaW5pdGlhbCIpOwotCi0gICAgICAgIC8vIFcxIG5vbiBzcGFjaW5nIG1hcmtzCi0gICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbjsgaisrKSB7Ci0gICAgICAgICAgICBpZiAoY2hJbmZvW2pdID09IENoYXJhY3Rlci5OT05fU1BBQ0lOR19NQVJLKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGogPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgY2hJbmZvW2pdID0gU09SOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgY2hJbmZvW2pdID0gY2hJbmZvW2ogLSAxXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGR1bXAoY2hkaXJzLCBuLCAiVzEiKTsKLQotICAgICAgICAvLyBXMiBldXJvcGVhbiBudW1iZXJzCi0gICAgICAgIGJ5dGUgY3VyID0gU09SOwotICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG47IGorKykgewotICAgICAgICAgICAgYnl0ZSBkID0gY2hJbmZvW2pdOwotCi0gICAgICAgICAgICBpZiAoZCA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfTEVGVF9UT19SSUdIVCB8fAotICAgICAgICAgICAgICAgIGQgPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX1JJR0hUX1RPX0xFRlQgfHwKLSAgICAgICAgICAgICAgICBkID09IENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9SSUdIVF9UT19MRUZUX0FSQUJJQykKLSAgICAgICAgICAgICAgICBjdXIgPSBkOwotICAgICAgICAgICAgZWxzZSBpZiAoZCA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfRVVST1BFQU5fTlVNQkVSKSB7Ci0gICAgICAgICAgICAgICAgIGlmIChjdXIgPT0KLSAgICAgICAgICAgICAgICAgICAgQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX1JJR0hUX1RPX0xFRlRfQVJBQklDKQotICAgICAgICAgICAgICAgICAgICBjaEluZm9bal0gPSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfQVJBQklDX05VTUJFUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGR1bXAoY2hkaXJzLCBuLCAiVzIiKTsKLQotICAgICAgICAvLyBXMyBhcmFiaWMgbGV0dGVycwotICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG47IGorKykgewotICAgICAgICAgICAgaWYgKGNoSW5mb1tqXSA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfUklHSFRfVE9fTEVGVF9BUkFCSUMpCi0gICAgICAgICAgICAgICAgY2hJbmZvW2pdID0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX1JJR0hUX1RPX0xFRlQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBkdW1wKGNoZGlycywgbiwgIlczIik7Ci0KLSAgICAgICAgLy8gVzQgc2luZ2xlIHNlcGFyYXRvciBiZXR3ZWVuIG51bWJlcnMKLSAgICAgICAgZm9yIChpbnQgaiA9IDE7IGogPCBuIC0gMTsgaisrKSB7Ci0gICAgICAgICAgICBieXRlIGQgPSBjaEluZm9bal07Ci0gICAgICAgICAgICBieXRlIHByZXYgPSBjaEluZm9baiAtIDFdOwotICAgICAgICAgICAgYnl0ZSBuZXh0ID0gY2hJbmZvW2ogKyAxXTsKLQotICAgICAgICAgICAgaWYgKGQgPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0VVUk9QRUFOX05VTUJFUl9TRVBBUkFUT1IpIHsKLSAgICAgICAgICAgICAgICBpZiAocHJldiA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfRVVST1BFQU5fTlVNQkVSICYmCi0gICAgICAgICAgICAgICAgICAgIG5leHQgPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0VVUk9QRUFOX05VTUJFUikKLSAgICAgICAgICAgICAgICAgICAgY2hJbmZvW2pdID0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0VVUk9QRUFOX05VTUJFUjsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZCA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfQ09NTU9OX05VTUJFUl9TRVBBUkFUT1IpIHsKLSAgICAgICAgICAgICAgICBpZiAocHJldiA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfRVVST1BFQU5fTlVNQkVSICYmCi0gICAgICAgICAgICAgICAgICAgIG5leHQgPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0VVUk9QRUFOX05VTUJFUikKLSAgICAgICAgICAgICAgICAgICAgY2hJbmZvW2pdID0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0VVUk9QRUFOX05VTUJFUjsKLSAgICAgICAgICAgICAgICBpZiAocHJldiA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfQVJBQklDX05VTUJFUiAmJgotICAgICAgICAgICAgICAgICAgICBuZXh0ID09IENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9BUkFCSUNfTlVNQkVSKQotICAgICAgICAgICAgICAgICAgICBjaEluZm9bal0gPSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfQVJBQklDX05VTUJFUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGR1bXAoY2hkaXJzLCBuLCAiVzQiKTsKLQotICAgICAgICAvLyBXNSBldXJvcGVhbiBudW1iZXIgdGVybWluYXRvcnMKLSAgICAgICAgYm9vbGVhbiBhZGphY2VudCA9IGZhbHNlOwotICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG47IGorKykgewotICAgICAgICAgICAgYnl0ZSBkID0gY2hJbmZvW2pdOwotCi0gICAgICAgICAgICBpZiAoZCA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfRVVST1BFQU5fTlVNQkVSKQotICAgICAgICAgICAgICAgIGFkamFjZW50ID0gdHJ1ZTsKLSAgICAgICAgICAgIGVsc2UgaWYgKGQgPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0VVUk9QRUFOX05VTUJFUl9URVJNSU5BVE9SICYmIGFkamFjZW50KQotICAgICAgICAgICAgICAgIGNoSW5mb1tqXSA9IENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9FVVJPUEVBTl9OVU1CRVI7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgYWRqYWNlbnQgPSBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vZHVtcChjaGRpcnMsIG4sICJXNSIpOwotCi0gICAgICAgIC8vIFc1IGV1cm9wZWFuIG51bWJlciB0ZXJtaW5hdG9ycyBwYXJ0IDIsCi0gICAgICAgIC8vIFc2IHNlcGFyYXRvcnMgYW5kIHRlcm1pbmF0b3JzCi0gICAgICAgIGFkamFjZW50ID0gZmFsc2U7Ci0gICAgICAgIGZvciAoaW50IGogPSBuIC0gMTsgaiA+PSAwOyBqLS0pIHsKLSAgICAgICAgICAgIGJ5dGUgZCA9IGNoSW5mb1tqXTsKLQotICAgICAgICAgICAgaWYgKGQgPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0VVUk9QRUFOX05VTUJFUikKLSAgICAgICAgICAgICAgICBhZGphY2VudCA9IHRydWU7Ci0gICAgICAgICAgICBlbHNlIGlmIChkID09IENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9FVVJPUEVBTl9OVU1CRVJfVEVSTUlOQVRPUikgewotICAgICAgICAgICAgICAgIGlmIChhZGphY2VudCkKLSAgICAgICAgICAgICAgICAgICAgY2hJbmZvW2pdID0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0VVUk9QRUFOX05VTUJFUjsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGNoSW5mb1tqXSA9IENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9PVEhFUl9ORVVUUkFMUzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGFkamFjZW50ID0gZmFsc2U7Ci0KLSAgICAgICAgICAgICAgICBpZiAoZCA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfRVVST1BFQU5fTlVNQkVSX1NFUEFSQVRPUiB8fAotICAgICAgICAgICAgICAgICAgICBkID09IENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9DT01NT05fTlVNQkVSX1NFUEFSQVRPUiB8fAotICAgICAgICAgICAgICAgICAgICBkID09IENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9QQVJBR1JBUEhfU0VQQVJBVE9SIHx8Ci0gICAgICAgICAgICAgICAgICAgIGQgPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX1NFR01FTlRfU0VQQVJBVE9SKQotICAgICAgICAgICAgICAgICAgICBjaEluZm9bal0gPSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfT1RIRVJfTkVVVFJBTFM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBkdW1wKGNoZGlycywgbiwgIlc2Iik7Ci0KLSAgICAgICAgLy8gVzcgc3Ryb25nIGRpcmVjdGlvbiBvZiBldXJvcGVhbiBudW1iZXJzCi0gICAgICAgIGN1ciA9IFNPUjsKLSAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBuOyBqKyspIHsKLSAgICAgICAgICAgIGJ5dGUgZCA9IGNoSW5mb1tqXTsKLQotICAgICAgICAgICAgaWYgKGQgPT0gU09SIHx8Ci0gICAgICAgICAgICAgICAgZCA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfTEVGVF9UT19SSUdIVCB8fAotICAgICAgICAgICAgICAgIGQgPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX1JJR0hUX1RPX0xFRlQpCi0gICAgICAgICAgICAgICAgY3VyID0gZDsKLQotICAgICAgICAgICAgaWYgKGQgPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0VVUk9QRUFOX05VTUJFUikKLSAgICAgICAgICAgICAgICBjaEluZm9bal0gPSBjdXI7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBkdW1wKGNoZGlycywgbiwgIlc3Iik7Ci0KLSAgICAgICAgLy8gTjEsIE4yIG5ldXRyYWxzCi0gICAgICAgIGN1ciA9IFNPUjsKLSAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBuOyBqKyspIHsKLSAgICAgICAgICAgIGJ5dGUgZCA9IGNoSW5mb1tqXTsKLQotICAgICAgICAgICAgaWYgKGQgPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0xFRlRfVE9fUklHSFQgfHwKLSAgICAgICAgICAgICAgICBkID09IENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9SSUdIVF9UT19MRUZUKSB7Ci0gICAgICAgICAgICAgICAgY3VyID0gZDsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZCA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfRVVST1BFQU5fTlVNQkVSIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgIGQgPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0FSQUJJQ19OVU1CRVIpIHsKLSAgICAgICAgICAgICAgICBjdXIgPSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfUklHSFRfVE9fTEVGVDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYnl0ZSBkZCA9IFNPUjsKLSAgICAgICAgICAgICAgICBpbnQgazsKLQotICAgICAgICAgICAgICAgIGZvciAoayA9IGogKyAxOyBrIDwgbjsgaysrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRkID0gY2hJbmZvW2tdOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChkZCA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfTEVGVF9UT19SSUdIVCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgZGQgPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX1JJR0hUX1RPX0xFRlQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkZCA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfRVVST1BFQU5fTlVNQkVSIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZCA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfQVJBQklDX05VTUJFUikgewotICAgICAgICAgICAgICAgICAgICAgICAgZGQgPSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfUklHSFRfVE9fTEVGVDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgeSA9IGo7IHkgPCBrOyB5KyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGRkID09IGN1cikKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoSW5mb1t5XSA9IGN1cjsKLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgY2hJbmZvW3ldID0gU09SOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGogPSBrIC0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGR1bXAoY2hkaXJzLCBuLCAiZmluYWwiKTsKLQotICAgICAgICAvLyBleHRyYTogZW5mb3JjZSB0aGF0IGFsbCB0YWJzIGFuZCBzdXJyb2dhdGUgY2hhcmFjdGVycyBnbyB0aGUKLSAgICAgICAgLy8gcHJpbWFyeSBkaXJlY3Rpb24KLSAgICAgICAgLy8gVE9ETzogYWN0dWFsbHkgZG8gZGlyZWN0aW9ucyByaWdodCBmb3Igc3Vycm9nYXRlcwotCi0gICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbjsgaisrKSB7Ci0gICAgICAgICAgICBjaGFyIGMgPSBjaHNbal07Ci0KLSAgICAgICAgICAgIGlmIChjID09ICdcdCcgfHwgKGMgPj0gMHhEODAwICYmIGMgPD0gMHhERkZGKSkgewotICAgICAgICAgICAgICAgIGNoSW5mb1tqXSA9IFNPUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGRpcjsKLSAgICB9Ci0KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIEZJUlNUX0NKSyA9ICdcdTJFODAnOwogICAgIC8qKgogICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlciBpcyBvbmUgb2YgdGhvc2Ugc3BlY2lmaWVkCkBAIC05NDQsMzcgKzYzNCwxNSBAQAogICAgIH0KICovCiAKLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgZ2V0Rml0KFRleHRQYWludCBwYWludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRQYWludCB3b3JrUGFpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgIENoYXJTZXF1ZW5jZSB0ZXh0LCBpbnQgc3RhcnQsIGludCBlbmQsCi0gICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHdpZCkgewotICAgICAgICBpbnQgaGlnaCA9IGVuZCArIDEsIGxvdyA9IHN0YXJ0IC0gMSwgZ3Vlc3M7Ci0KLSAgICAgICAgd2hpbGUgKGhpZ2ggLSBsb3cgPiAxKSB7Ci0gICAgICAgICAgICBndWVzcyA9IChoaWdoICsgbG93KSAvIDI7Ci0KLSAgICAgICAgICAgIGlmIChtZWFzdXJlVGV4dChwYWludCwgd29ya1BhaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQsIHN0YXJ0LCBndWVzcywgbnVsbCwgdHJ1ZSwgbnVsbCkgPiB3aWQpCi0gICAgICAgICAgICAgICAgaGlnaCA9IGd1ZXNzOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGxvdyA9IGd1ZXNzOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGxvdyA8IHN0YXJ0KQotICAgICAgICAgICAgcmV0dXJuIHN0YXJ0OwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gbG93OwotICAgIH0KLQogICAgIHByaXZhdGUgaW50IG91dChDaGFyU2VxdWVuY2UgdGV4dCwgaW50IHN0YXJ0LCBpbnQgZW5kLAogICAgICAgICAgICAgICAgICAgICAgIGludCBhYm92ZSwgaW50IGJlbG93LCBpbnQgdG9wLCBpbnQgYm90dG9tLCBpbnQgdiwKICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBzcGFjaW5nbXVsdCwgZmxvYXQgc3BhY2luZ2FkZCwKICAgICAgICAgICAgICAgICAgICAgICBMaW5lSGVpZ2h0U3BhbltdIGNob29zZWh0LCBpbnRbXSBjaG9vc2VodHYsCi0gICAgICAgICAgICAgICAgICAgICAgUGFpbnQuRm9udE1ldHJpY3NJbnQgZm0sIGJvb2xlYW4gdGFiLAorICAgICAgICAgICAgICAgICAgICAgIFBhaW50LkZvbnRNZXRyaWNzSW50IGZtLCBib29sZWFuIGhhc1RhYk9yRW1vamksCiAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBuZWVkTXVsdGlwbHksIGludCBwc3RhcnQsIGJ5dGVbXSBjaGRpcnMsCiAgICAgICAgICAgICAgICAgICAgICAgaW50IGRpciwgYm9vbGVhbiBlYXN5LCBib29sZWFuIGxhc3QsCiAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpbmNsdWRlcGFkLCBib29sZWFuIHRyYWNrcGFkLAotICAgICAgICAgICAgICAgICAgICAgIGZsb2F0W10gd2lkdGhzLCBpbnQgd2lkc3RhcnQsIGludCB3aWRvZmYsCisgICAgICAgICAgICAgICAgICAgICAgY2hhcltdIGNocywgZmxvYXRbXSB3aWR0aHMsIGludCB3aWRzdGFydCwKICAgICAgICAgICAgICAgICAgICAgICBUZXh0VXRpbHMuVHJ1bmNhdGVBdCBlbGxpcHNpemUsIGZsb2F0IGVsbGlwc2lzd2lkdGgsCiAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdGV4dHdpZHRoLCBUZXh0UGFpbnQgcGFpbnQpIHsKICAgICAgICAgaW50IGogPSBtTGluZUNvdW50OwpAQCAtOTgyLDggKzY1MCw2IEBACiAgICAgICAgIGludCB3YW50ID0gb2ZmICsgbUNvbHVtbnMgKyBUT1A7CiAgICAgICAgIGludFtdIGxpbmVzID0gbUxpbmVzOwogCi0gICAgICAgIC8vIExvZy5lKCJ0ZXh0IiwgImxpbmUgIiArIHN0YXJ0ICsgIiB0byAiICsgZW5kICsgKGxhc3QgPyAiPT09IiA6ICIiKSk7Ci0KICAgICAgICAgaWYgKHdhbnQgPj0gbGluZXMubGVuZ3RoKSB7CiAgICAgICAgICAgICBpbnQgbmxlbiA9IEFycmF5VXRpbHMuaWRlYWxJbnRBcnJheVNpemUod2FudCArIDEpOwogICAgICAgICAgICAgaW50W10gZ3JvdyA9IG5ldyBpbnRbbmxlbl07CkBAIC0xMDU5LDU5ICs3MjUsMjMgQEAKICAgICAgICAgbGluZXNbb2ZmICsgbUNvbHVtbnMgKyBTVEFSVF0gPSBlbmQ7CiAgICAgICAgIGxpbmVzW29mZiArIG1Db2x1bW5zICsgVE9QXSA9IHY7CiAKLSAgICAgICAgaWYgKHRhYikKKyAgICAgICAgaWYgKGhhc1RhYk9yRW1vamkpCiAgICAgICAgICAgICBsaW5lc1tvZmYgKyBUQUJdIHw9IFRBQl9NQVNLOwogCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxpbmVzW29mZiArIERJUl0gfD0gZGlyIDw8IERJUl9TSElGVDsKLQotICAgICAgICAgICAgaW50IGN1ciA9IENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9MRUZUX1RPX1JJR0hUOwotICAgICAgICAgICAgaW50IGNvdW50ID0gMDsKLQotICAgICAgICAgICAgaWYgKCFlYXN5KSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgayA9IHN0YXJ0OyBrIDwgZW5kOyBrKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNoZGlyc1trIC0gcHN0YXJ0XSAhPSBjdXIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50Kys7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjdXIgPSBjaGRpcnNbayAtIHBzdGFydF07Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIERpcmVjdGlvbnMgbGluZWRpcnM7Ci0KLSAgICAgICAgICAgIGlmIChjb3VudCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgbGluZWRpcnMgPSBESVJTX0FMTF9MRUZUX1RPX1JJR0hUOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzaG9ydFtdIGxkID0gbmV3IHNob3J0W2NvdW50ICsgMV07Ci0KLSAgICAgICAgICAgICAgICBjdXIgPSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfTEVGVF9UT19SSUdIVDsKLSAgICAgICAgICAgICAgICBjb3VudCA9IDA7Ci0gICAgICAgICAgICAgICAgaW50IGhlcmUgPSBzdGFydDsKLQotICAgICAgICAgICAgICAgIGZvciAoaW50IGsgPSBzdGFydDsgayA8IGVuZDsgaysrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjaGRpcnNbayAtIHBzdGFydF0gIT0gY3VyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBYWFggY2hlY2sgdG8gbWFrZSBzdXJlIHdlIGRvbid0Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgb3ZlcmZsb3cgc2hvcnQKLSAgICAgICAgICAgICAgICAgICAgICAgIGxkW2NvdW50KytdID0gKHNob3J0KSAoayAtIGhlcmUpOwotICAgICAgICAgICAgICAgICAgICAgICAgY3VyID0gY2hkaXJzW2sgLSBwc3RhcnRdOwotICAgICAgICAgICAgICAgICAgICAgICAgaGVyZSA9IGs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBsZFtjb3VudF0gPSAoc2hvcnQpIChlbmQgLSBoZXJlKTsKLQotICAgICAgICAgICAgICAgIGlmIChjb3VudCA9PSAxICYmIGxkWzBdID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbGluZWRpcnMgPSBESVJTX0FMTF9SSUdIVF9UT19MRUZUOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGxpbmVkaXJzID0gbmV3IERpcmVjdGlvbnMobGQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQorICAgICAgICBsaW5lc1tvZmYgKyBESVJdIHw9IGRpciA8PCBESVJfU0hJRlQ7CisgICAgICAgIERpcmVjdGlvbnMgbGluZWRpcnMgPSBESVJTX0FMTF9MRUZUX1RPX1JJR0hUOworICAgICAgICAvLyBlYXN5IG1lYW5zIGFsbCBjaGFycyA8IHRoZSBmaXJzdCBSVEwsIHNvIG5vIGVtb2ppLCBubyBub3RoaW5nCisgICAgICAgIC8vIFhYWCBhIHJ1biB3aXRoIG5vIHRleHQgb3IgYWxsIHNwYWNlcyBpcyBlYXN5IGJ1dCBtaWdodCBiZSBhbiBlbXB0eQorICAgICAgICAvLyBSVEwgcGFyYWdyYXBoLiAgTWFrZSBzdXJlIGVhc3kgaXMgZmFsc2UgaWYgdGhpcyBpcyB0aGUgY2FzZS4KKyAgICAgICAgaWYgKGVhc3kpIHsKICAgICAgICAgICAgIG1MaW5lRGlyZWN0aW9uc1tqXSA9IGxpbmVkaXJzOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUxpbmVEaXJlY3Rpb25zW2pdID0gQW5kcm9pZEJpZGkuZGlyZWN0aW9ucyhkaXIsIGNoZGlycywgd2lkc3RhcnQsIGNocywKKyAgICAgICAgICAgICAgICAgICAgd2lkc3RhcnQsIGVuZCAtIHN0YXJ0KTsKIAogICAgICAgICAgICAgLy8gSWYgZWxsaXBzaXplIGlzIGluIG1hcnF1ZWUgbW9kZSwgZG8gbm90IGFwcGx5IGVsbGlwc2lzIG9uIHRoZSBmaXJzdCBsaW5lCiAgICAgICAgICAgICBpZiAoZWxsaXBzaXplICE9IG51bGwgJiYgKGVsbGlwc2l6ZSAhPSBUZXh0VXRpbHMuVHJ1bmNhdGVBdC5NQVJRVUVFIHx8IGogIT0gMCkpIHsKLSAgICAgICAgICAgICAgICBjYWxjdWxhdGVFbGxpcHNpcyhzdGFydCwgZW5kLCB3aWR0aHMsIHdpZHN0YXJ0LCB3aWRvZmYsCisgICAgICAgICAgICAgICAgY2FsY3VsYXRlRWxsaXBzaXMoc3RhcnQsIGVuZCwgd2lkdGhzLCB3aWRzdGFydCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGxpcHNpc3dpZHRoLCBlbGxpcHNpemUsIGosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dHdpZHRoLCBwYWludCk7CiAgICAgICAgICAgICB9CkBAIC0xMTIyLDcgKzc1Miw3IEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIGNhbGN1bGF0ZUVsbGlwc2lzKGludCBsaW5lc3RhcnQsIGludCBsaW5lZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdFtdIHdpZHRocywgaW50IHdpZHN0YXJ0LCBpbnQgd2lkb2ZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdFtdIHdpZHRocywgaW50IHdpZHN0YXJ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhdmFpbCwgVGV4dFV0aWxzLlRydW5jYXRlQXQgd2hlcmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lLCBmbG9hdCB0ZXh0d2lkdGgsIFRleHRQYWludCBwYWludCkgewogICAgICAgICBpbnQgbGVuID0gbGluZWVuZCAtIGxpbmVzdGFydDsKQEAgLTExNDIsNyArNzcyLDcgQEAKICAgICAgICAgICAgIGludCBpOwogCiAgICAgICAgICAgICBmb3IgKGkgPSBsZW47IGkgPj0gMDsgaS0tKSB7Ci0gICAgICAgICAgICAgICAgZmxvYXQgdyA9IHdpZHRoc1tpIC0gMSArIGxpbmVzdGFydCAtIHdpZHN0YXJ0ICsgd2lkb2ZmXTsKKyAgICAgICAgICAgICAgICBmbG9hdCB3ID0gd2lkdGhzW2kgLSAxICsgbGluZXN0YXJ0IC0gd2lkc3RhcnRdOwogCiAgICAgICAgICAgICAgICAgaWYgKHcgKyBzdW0gKyBlbGxpcHNpc3dpZCA+IGF2YWlsKSB7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTE1OCw3ICs3ODgsNyBAQAogICAgICAgICAgICAgaW50IGk7CiAKICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewotICAgICAgICAgICAgICAgIGZsb2F0IHcgPSB3aWR0aHNbaSArIGxpbmVzdGFydCAtIHdpZHN0YXJ0ICsgd2lkb2ZmXTsKKyAgICAgICAgICAgICAgICBmbG9hdCB3ID0gd2lkdGhzW2kgKyBsaW5lc3RhcnQgLSB3aWRzdGFydF07CiAKICAgICAgICAgICAgICAgICBpZiAodyArIHN1bSArIGVsbGlwc2lzd2lkID4gYXZhaWwpIHsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC0xMTc1LDcgKzgwNSw3IEBACiAKICAgICAgICAgICAgIGZsb2F0IHJhdmFpbCA9IChhdmFpbCAtIGVsbGlwc2lzd2lkKSAvIDI7CiAgICAgICAgICAgICBmb3IgKHJpZ2h0ID0gbGVuOyByaWdodCA+PSAwOyByaWdodC0tKSB7Ci0gICAgICAgICAgICAgICAgZmxvYXQgdyA9IHdpZHRoc1tyaWdodCAtIDEgKyBsaW5lc3RhcnQgLSB3aWRzdGFydCArIHdpZG9mZl07CisgICAgICAgICAgICAgICAgZmxvYXQgdyA9IHdpZHRoc1tyaWdodCAtIDEgKyBsaW5lc3RhcnQgLSB3aWRzdGFydF07CiAKICAgICAgICAgICAgICAgICBpZiAodyArIHJzdW0gPiByYXZhaWwpIHsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC0xMTg2LDcgKzgxNiw3IEBACiAKICAgICAgICAgICAgIGZsb2F0IGxhdmFpbCA9IGF2YWlsIC0gZWxsaXBzaXN3aWQgLSByc3VtOwogICAgICAgICAgICAgZm9yIChsZWZ0ID0gMDsgbGVmdCA8IHJpZ2h0OyBsZWZ0KyspIHsKLSAgICAgICAgICAgICAgICBmbG9hdCB3ID0gd2lkdGhzW2xlZnQgKyBsaW5lc3RhcnQgLSB3aWRzdGFydCArIHdpZG9mZl07CisgICAgICAgICAgICAgICAgZmxvYXQgdyA9IHdpZHRoc1tsZWZ0ICsgbGluZXN0YXJ0IC0gd2lkc3RhcnRdOwogCiAgICAgICAgICAgICAgICAgaWYgKHcgKyBsc3VtID4gbGF2YWlsKSB7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTIwMyw3ICs4MzMsNyBAQAogICAgICAgICBtTGluZXNbbUNvbHVtbnMgKiBsaW5lICsgRUxMSVBTSVNfQ09VTlRdID0gZWxsaXBzaXNDb3VudDsKICAgICB9CiAKLSAgICAvLyBPdmVycmlkZSB0aGUgYmFzZWNsYXNzIHNvIHdlIGNhbiBkaXJlY3RseSBhY2Nlc3Mgb3VyIG1lbWJlcnMsCisgICAgLy8gT3ZlcnJpZGUgdGhlIGJhc2UgY2xhc3Mgc28gd2UgY2FuIGRpcmVjdGx5IGFjY2VzcyBvdXIgbWVtYmVycywKICAgICAvLyByYXRoZXIgdGhhbiByZWx5aW5nIG9uIG1lbWJlciBmdW5jdGlvbnMuCiAgICAgLy8gVGhlIGxvZ2ljIG1pcnJvcnMgdGhhdCBvZiBMYXlvdXQuZ2V0TGluZUZvclZlcnRpY2FsCiAgICAgLy8gRklYTUU6IEl0IG1heSBiZSBmYXN0ZXIgdG8gZG8gYSBsaW5lYXIgc2VhcmNoIGZvciBsYXlvdXRzIHdpdGhvdXQgbWFueSBsaW5lcy4KQEAgLTEyMzIsMTEgKzg2MiwxMSBAQAogICAgIH0KIAogICAgIHB1YmxpYyBpbnQgZ2V0TGluZVRvcChpbnQgbGluZSkgewotICAgICAgICByZXR1cm4gbUxpbmVzW21Db2x1bW5zICogbGluZSArIFRPUF07ICAgIAorICAgICAgICByZXR1cm4gbUxpbmVzW21Db2x1bW5zICogbGluZSArIFRPUF07CiAgICAgfQogCiAgICAgcHVibGljIGludCBnZXRMaW5lRGVzY2VudChpbnQgbGluZSkgewotICAgICAgICByZXR1cm4gbUxpbmVzW21Db2x1bW5zICogbGluZSArIERFU0NFTlRdOyAgIAorICAgICAgICByZXR1cm4gbUxpbmVzW21Db2x1bW5zICogbGluZSArIERFU0NFTlRdOwogICAgIH0KIAogICAgIHB1YmxpYyBpbnQgZ2V0TGluZVN0YXJ0KGludCBsaW5lKSB7CkBAIC0xMzA5LDEzICs5MzksMTEgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRElSX1NISUZUICA9IDMwOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUQUJfTUFTSyAgID0gMHgyMDAwMDAwMDsKIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgRklSU1RfUklHSFRfVE9fTEVGVCA9ICdcdTA1OTAnOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUQUJfSU5DUkVNRU5UID0gMjA7IC8vIHNhbWUgYXMgTGF5b3V0LCBidXQgdGhhdCdzIHByaXZhdGUKIAogICAgIC8qCi0gICAgICogVGhlc2UgYXJlIHJldXNlZCBhY3Jvc3MgY2FsbHMgdG8gZ2VuZXJhdGUoKQorICAgICAqIFRoaXMgaXMgcmV1c2VkIGFjcm9zcyBjYWxscyB0byBnZW5lcmF0ZSgpCiAgICAgICovCi0gICAgcHJpdmF0ZSBieXRlW10gbUNoZGlyczsKLSAgICBwcml2YXRlIGNoYXJbXSBtQ2hzOwotICAgIHByaXZhdGUgZmxvYXRbXSBtV2lkdGhzOworICAgIHByaXZhdGUgTWVhc3VyZWRUZXh0IG1NZWFzdXJlZDsKICAgICBwcml2YXRlIFBhaW50LkZvbnRNZXRyaWNzSW50IG1Gb250TWV0cmljc0ludCA9IG5ldyBQYWludC5Gb250TWV0cmljc0ludCgpOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9TdHlsZWQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvU3R5bGVkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxM2IyY2QuLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9TdHlsZWQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC50ZXh0OwotCi1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKLWltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuQ2hhcmFjdGVyU3R5bGU7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLk1ldHJpY0FmZmVjdGluZ1NwYW47Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLlJlcGxhY2VtZW50U3BhbjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIHN0YXRpYyBtZXRob2RzIGZvciBkcmF3aW5nIGFuZCBtZWFzdXJpbmcgc3R5bGVkIHRleHQsCi0gKiBsaWtlIHtAbGluayBhbmRyb2lkLnRleHQuU3Bhbm5lZH0gb2JqZWN0IHdpdGgKLSAqIHtAbGluayBhbmRyb2lkLnRleHQuc3R5bGUuUmVwbGFjZW1lbnRTcGFufS4KLSAqCi0gKiBAaGlkZQotICovCi1wdWJsaWMgY2xhc3MgU3R5bGVkCi17Ci0gICAgLyoqCi0gICAgICogRHJhd3MgYW5kL29yIG1lYXN1cmVzIGEgdW5pZm9ybSBydW4gb2YgdGV4dCBvbiBhIHNpbmdsZSBsaW5lLiBObyBzcGFuIG9mCi0gICAgICogaW50ZXJlc3Qgc2hvdWxkIHN0YXJ0IG9yIGVuZCBpbiB0aGUgbWlkZGxlIG9mIHRoaXMgcnVuIChpZiBub3QKLSAgICAgKiBkcmF3aW5nLCBjaGFyYWN0ZXIgc3BhbnMgdGhhdCBkb24ndCBhZmZlY3QgbWV0cmljcyBjYW4gYmUgaWdub3JlZCkuCi0gICAgICogTmVpdGhlciBzaG91bGQgdGhlIHJ1biBkaXJlY3Rpb24gY2hhbmdlIGluIHRoZSBtaWRkbGUgb2YgdGhlIHJ1bi4KLSAgICAgKgotICAgICAqIDxwPlRoZSB4IHBvc2l0aW9uIGlzIHRoZSBsZWFkaW5nIGVkZ2Ugb2YgdGhlIHRleHQuIEluIGEgcmlnaHQtdG8tbGVmdAotICAgICAqIHBhcmFncmFwaCwgdGhpcyB3aWxsIGJlIHRvIHRoZSByaWdodCBvZiB0aGUgdGV4dCB0byBiZSBkcmF3bi4gUGFpbnQKLSAgICAgKiBzaG91bGQgbm90IGhhdmUgYW4gQWxpZ24gdmFsdWUgb3RoZXIgdGhhbiBMRUZUIG9yIHBvc2l0aW9uaW5nIHdpbGwgZ2V0Ci0gICAgICogY29uZnVzZWQuCi0gICAgICoKLSAgICAgKiA8cD5PbiByZXR1cm4sIHdvcmtQYWludCB3aWxsIHJlZmxlY3QgdGhlIG9yaWdpbmFsIHBhaW50IHBsdXMgYW55Ci0gICAgICogbW9kaWZpY2F0aW9ucyBtYWRlIGJ5IGNoYXJhY3RlciBzdHlsZXMgb24gdGhlIHJ1bi4KLSAgICAgKgotICAgICAqIDxwPlRoZSByZXR1cm5lZCB3aWR0aCBpcyBzaWduZWQgYW5kIHdpbGwgYmUgPCAwIGlmIHRoZSBwYXJhZ3JhcGgKLSAgICAgKiBkaXJlY3Rpb24gaXMgcmlnaHQtdG8tbGVmdC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmbG9hdCBkcmF3VW5pZm9ybVJ1bihDYW52YXMgY2FudmFzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3Bhbm5lZCB0ZXh0LCBpbnQgc3RhcnQsIGludCBlbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGlyLCBib29sZWFuIHJ1bklzUnRsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeCwgaW50IHRvcCwgaW50IHksIGludCBib3R0b20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYWludC5Gb250TWV0cmljc0ludCBmbWksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXh0UGFpbnQgcGFpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXh0UGFpbnQgd29ya1BhaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBuZWVkV2lkdGgpIHsKLQotICAgICAgICBib29sZWFuIGhhdmVXaWR0aCA9IGZhbHNlOwotICAgICAgICBmbG9hdCByZXQgPSAwOwotICAgICAgICBDaGFyYWN0ZXJTdHlsZVtdIHNwYW5zID0gdGV4dC5nZXRTcGFucyhzdGFydCwgZW5kLCBDaGFyYWN0ZXJTdHlsZS5jbGFzcyk7Ci0KLSAgICAgICAgUmVwbGFjZW1lbnRTcGFuIHJlcGxhY2VtZW50ID0gbnVsbDsKLQotICAgICAgICAvLyBYWFg6IFRoaXMgc2hvdWxkbid0IGJlIG1vZGlmeWluZyBwYWludCwgb25seSB3b3JrUGFpbnQuCi0gICAgICAgIC8vIEhvd2V2ZXIsIHRoZSBtZW1iZXJzIGJlbG9uZ2luZyB0byBUZXh0UGFpbnQgc2hvdWxkIGhhdmUgZGVmYXVsdAotICAgICAgICAvLyB2YWx1ZXMgYW55d2F5LiAgQmV0dGVyIHRvIGVuc3VyZSB0aGlzIGluIHRoZSBMYXlvdXQgY29uc3RydWN0b3IuCi0gICAgICAgIHBhaW50LmJnQ29sb3IgPSAwOwotICAgICAgICBwYWludC5iYXNlbGluZVNoaWZ0ID0gMDsKLSAgICAgICAgd29ya1BhaW50LnNldChwYWludCk7Ci0KLQkJaWYgKHNwYW5zLmxlbmd0aCA+IDApIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc3BhbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlDaGFyYWN0ZXJTdHlsZSBzcGFuID0gc3BhbnNbaV07Ci0KLQkJCQlpZiAoc3BhbiBpbnN0YW5jZW9mIFJlcGxhY2VtZW50U3BhbikgewotCQkJCQlyZXBsYWNlbWVudCA9IChSZXBsYWNlbWVudFNwYW4pc3BhbjsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXNwYW4udXBkYXRlRHJhd1N0YXRlKHdvcmtQYWludCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLSAgICAgICAgaWYgKHJlcGxhY2VtZW50ID09IG51bGwpIHsKLSAgICAgICAgICAgIENoYXJTZXF1ZW5jZSB0bXA7Ci0gICAgICAgICAgICBpbnQgdG1wc3RhcnQsIHRtcGVuZDsKLQotICAgICAgICAgICAgaWYgKHJ1bklzUnRsKSB7Ci0gICAgICAgICAgICAgICAgdG1wID0gVGV4dFV0aWxzLmdldFJldmVyc2UodGV4dCwgc3RhcnQsIGVuZCk7Ci0gICAgICAgICAgICAgICAgdG1wc3RhcnQgPSAwOwotICAgICAgICAgICAgICAgIC8vIFhYWDogYXNzdW1lcyBnZXRSZXZlcnNlIGRvZXNuJ3QgY2hhbmdlIHRoZSBsZW5ndGggb2YgdGhlIHRleHQKLSAgICAgICAgICAgICAgICB0bXBlbmQgPSBlbmQgLSBzdGFydDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdG1wID0gdGV4dDsKLSAgICAgICAgICAgICAgICB0bXBzdGFydCA9IHN0YXJ0OwotICAgICAgICAgICAgICAgIHRtcGVuZCA9IGVuZDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGZtaSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgd29ya1BhaW50LmdldEZvbnRNZXRyaWNzSW50KGZtaSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChjYW52YXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmICh3b3JrUGFpbnQuYmdDb2xvciAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBjID0gd29ya1BhaW50LmdldENvbG9yKCk7Ci0gICAgICAgICAgICAgICAgICAgIFBhaW50LlN0eWxlIHMgPSB3b3JrUGFpbnQuZ2V0U3R5bGUoKTsKLSAgICAgICAgICAgICAgICAgICAgd29ya1BhaW50LnNldENvbG9yKHdvcmtQYWludC5iZ0NvbG9yKTsKLSAgICAgICAgICAgICAgICAgICAgd29ya1BhaW50LnNldFN0eWxlKFBhaW50LlN0eWxlLkZJTEwpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICghaGF2ZVdpZHRoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXQgPSB3b3JrUGFpbnQubWVhc3VyZVRleHQodG1wLCB0bXBzdGFydCwgdG1wZW5kKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGhhdmVXaWR0aCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAoZGlyID09IExheW91dC5ESVJfUklHSFRfVE9fTEVGVCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdCh4IC0gcmV0LCB0b3AsIHgsIGJvdHRvbSwgd29ya1BhaW50KTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KHgsIHRvcCwgeCArIHJldCwgYm90dG9tLCB3b3JrUGFpbnQpOwotCi0gICAgICAgICAgICAgICAgICAgIHdvcmtQYWludC5zZXRTdHlsZShzKTsKLSAgICAgICAgICAgICAgICAgICAgd29ya1BhaW50LnNldENvbG9yKGMpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChkaXIgPT0gTGF5b3V0LkRJUl9SSUdIVF9UT19MRUZUKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghaGF2ZVdpZHRoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXQgPSB3b3JrUGFpbnQubWVhc3VyZVRleHQodG1wLCB0bXBzdGFydCwgdG1wZW5kKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGhhdmVXaWR0aCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBjYW52YXMuZHJhd1RleHQodG1wLCB0bXBzdGFydCwgdG1wZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCAtIHJldCwgeSArIHdvcmtQYWludC5iYXNlbGluZVNoaWZ0LCB3b3JrUGFpbnQpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuZWVkV2lkdGgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaGF2ZVdpZHRoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gd29ya1BhaW50Lm1lYXN1cmVUZXh0KHRtcCwgdG1wc3RhcnQsIHRtcGVuZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGF2ZVdpZHRoID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGNhbnZhcy5kcmF3VGV4dCh0bXAsIHRtcHN0YXJ0LCB0bXBlbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4LCB5ICsgd29ya1BhaW50LmJhc2VsaW5lU2hpZnQsIHdvcmtQYWludCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAobmVlZFdpZHRoICYmICFoYXZlV2lkdGgpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0ID0gd29ya1BhaW50Lm1lYXN1cmVUZXh0KHRtcCwgdG1wc3RhcnQsIHRtcGVuZCk7Ci0gICAgICAgICAgICAgICAgICAgIGhhdmVXaWR0aCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0ID0gcmVwbGFjZW1lbnQuZ2V0U2l6ZSh3b3JrUGFpbnQsIHRleHQsIHN0YXJ0LCBlbmQsIGZtaSk7Ci0KLSAgICAgICAgICAgIGlmIChjYW52YXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChkaXIgPT0gTGF5b3V0LkRJUl9SSUdIVF9UT19MRUZUKQotICAgICAgICAgICAgICAgICAgICByZXBsYWNlbWVudC5kcmF3KGNhbnZhcywgdGV4dCwgc3RhcnQsIGVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4IC0gcmV0LCB0b3AsIHksIGJvdHRvbSwgd29ya1BhaW50KTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHJlcGxhY2VtZW50LmRyYXcoY2FudmFzLCB0ZXh0LCBzdGFydCwgZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgsIHRvcCwgeSwgYm90dG9tLCB3b3JrUGFpbnQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGRpciA9PSBMYXlvdXQuRElSX1JJR0hUX1RPX0xFRlQpCi0gICAgICAgICAgICByZXR1cm4gLXJldDsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBhZHZhbmNlIHdpZHRocyBmb3IgYSB1bmlmb3JtIGxlZnQtdG8tcmlnaHQgcnVuIG9mIHRleHQgd2l0aAotICAgICAqIG5vIHN0eWxlIGNoYW5nZXMgaW4gdGhlIG1pZGRsZSBvZiB0aGUgcnVuLiBJZiBhbnkgc3R5bGUgaXMgcmVwbGFjZW1lbnQKLSAgICAgKiB0ZXh0LCB0aGUgZmlyc3QgY2hhcmFjdGVyIHdpbGwgZ2V0IHRoZSB3aWR0aCBvZiB0aGUgcmVwbGFjZW1lbnQgYW5kIHRoZQotICAgICAqIHJlbWFpbmluZyBjaGFyYWN0ZXJzIHdpbGwgZ2V0IGEgd2lkdGggb2YgMC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGFpbnQgdGhlIHBhaW50LCB3aWxsIG5vdCBiZSBtb2RpZmllZAotICAgICAqIEBwYXJhbSB3b3JrUGFpbnQgYSBwYWludCB0byBtb2RpZnk7IG9uIHJldHVybiB3aWxsIHJlZmxlY3QgdGhlIG9yaWdpbmFsCi0gICAgICogICAgICAgIHBhaW50IHBsdXMgdGhlIGVmZmVjdCBvZiBhbGwgc3BhbnMgb24gdGhlIHJ1bgotICAgICAqIEBwYXJhbSB0ZXh0IHRoZSB0ZXh0Ci0gICAgICogQHBhcmFtIHN0YXJ0IHRoZSBzdGFydCBvZiB0aGUgcnVuCi0gICAgICogQHBhcmFtIGVuZCB0aGUgbGltaXQgb2YgdGhlIHJ1bgotICAgICAqIEBwYXJhbSB3aWR0aHMgYXJyYXkgdG8gcmVjZWl2ZSB0aGUgYWR2YW5jZSB3aWR0aHMgb2YgdGhlIGNoYXJhY3RlcnMuIE11c3QKLSAgICAgKiAgICAgICAgYmUgYXQgbGVhc3QgYSBsYXJnZSBhcyAoZW5kIC0gc3RhcnQpLgotICAgICAqIEBwYXJhbSBmbWkgRm9udE1ldHJpY3MgaW5mb3JtYXRpb247IGNhbiBiZSBudWxsCi0gICAgICogQHJldHVybiB0aGUgYWN0dWFsIG51bWJlciBvZiB3aWR0aHMgcmV0dXJuZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGludCBnZXRUZXh0V2lkdGhzKFRleHRQYWludCBwYWludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRQYWludCB3b3JrUGFpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTcGFubmVkIHRleHQsIGludCBzdGFydCwgaW50IGVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0W10gd2lkdGhzLCBQYWludC5Gb250TWV0cmljc0ludCBmbWkpIHsKLSAgICAgICAgTWV0cmljQWZmZWN0aW5nU3BhbltdIHNwYW5zID0KLSAgICAgICAgICAgIHRleHQuZ2V0U3BhbnMoc3RhcnQsIGVuZCwgTWV0cmljQWZmZWN0aW5nU3Bhbi5jbGFzcyk7Ci0KLQkJUmVwbGFjZW1lbnRTcGFuIHJlcGxhY2VtZW50ID0gbnVsbDsKLSAgICAgICAgd29ya1BhaW50LnNldChwYWludCk7Ci0JCQotCQlmb3IgKGludCBpID0gMDsgaSA8IHNwYW5zLmxlbmd0aDsgaSsrKSB7Ci0JCQlNZXRyaWNBZmZlY3RpbmdTcGFuIHNwYW4gPSBzcGFuc1tpXTsKLQkJCWlmIChzcGFuIGluc3RhbmNlb2YgUmVwbGFjZW1lbnRTcGFuKSB7Ci0JCQkJcmVwbGFjZW1lbnQgPSAoUmVwbGFjZW1lbnRTcGFuKXNwYW47Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlzcGFuLnVwZGF0ZU1lYXN1cmVTdGF0ZSh3b3JrUGFpbnQpOwotCQkJfQotCQl9Ci0JCi0gICAgICAgIGlmIChyZXBsYWNlbWVudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB3b3JrUGFpbnQuZ2V0Rm9udE1ldHJpY3NJbnQoZm1pKTsKLSAgICAgICAgICAgIHdvcmtQYWludC5nZXRUZXh0V2lkdGhzKHRleHQsIHN0YXJ0LCBlbmQsIHdpZHRocyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpbnQgd2lkID0gcmVwbGFjZW1lbnQuZ2V0U2l6ZSh3b3JrUGFpbnQsIHRleHQsIHN0YXJ0LCBlbmQsIGZtaSk7Ci0KLSAgICAgICAgICAgIGlmIChlbmQgPiBzdGFydCkgewotICAgICAgICAgICAgICAgIHdpZHRoc1swXSA9IHdpZDsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gc3RhcnQgKyAxOyBpIDwgZW5kOyBpKyspCi0gICAgICAgICAgICAgICAgICAgIHdpZHRoc1tpIC0gc3RhcnRdID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZW5kIC0gc3RhcnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVuZGVycyBhbmQvb3IgbWVhc3VyZXMgYSBkaXJlY3Rpb25hbCBydW4gb2YgdGV4dCBvbiBhIHNpbmdsZSBsaW5lLgotICAgICAqIFVubGlrZSB7QGxpbmsgI2RyYXdVbmlmb3JtUnVufSwgdGhpcyBjYW4gcmVuZGVyIHJ1bnMgdGhhdCBjcm9zcyBzdHlsZQotICAgICAqIGJvdW5kYXJpZXMuICBSZXR1cm5zIHRoZSBzaWduZWQgYWR2YW5jZSB3aWR0aCwgaWYgcmVxdWVzdGVkLgotICAgICAqCi0gICAgICogPHA+VGhlIHggcG9zaXRpb24gaXMgdGhlIGxlYWRpbmcgZWRnZSBvZiB0aGUgdGV4dC4gSW4gYSByaWdodC10by1sZWZ0Ci0gICAgICogcGFyYWdyYXBoLCB0aGlzIHdpbGwgYmUgdG8gdGhlIHJpZ2h0IG9mIHRoZSB0ZXh0IHRvIGJlIGRyYXduLiBQYWludAotICAgICAqIHNob3VsZCBub3QgaGF2ZSBhbiBBbGlnbiB2YWx1ZSBvdGhlciB0aGFuIExFRlQgb3IgcG9zaXRpb25pbmcgd2lsbCBnZXQKLSAgICAgKiBjb25mdXNlZC4KLSAgICAgKgotICAgICAqIDxwPlRoaXMgb3B0aW1pemVzIGZvciB1bnN0eWxlZCB0ZXh0IGFuZCBzbyB3b3JrUGFpbnQgbWlnaHQgbm90IGJlCi0gICAgICogbW9kaWZpZWQgYnkgdGhpcyBjYWxsLgotICAgICAqCi0gICAgICogPHA+VGhlIHJldHVybmVkIGFkdmFuY2Ugd2lkdGggd2lsbCBiZSA8IDAgaWYgdGhlIHBhcmFncmFwaAotICAgICAqIGRpcmVjdGlvbiBpcyByaWdodC10by1sZWZ0LgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZsb2F0IGRyYXdEaXJlY3Rpb25hbFJ1bihDYW52YXMgY2FudmFzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhclNlcXVlbmNlIHRleHQsIGludCBzdGFydCwgaW50IGVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkaXIsIGJvb2xlYW4gcnVuSXNSdGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4LCBpbnQgdG9wLCBpbnQgeSwgaW50IGJvdHRvbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhaW50LkZvbnRNZXRyaWNzSW50IGZtaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRQYWludCBwYWludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRQYWludCB3b3JrUGFpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIG5lZWRXaWR0aCkgewotCi0gICAgICAgIC8vIFhYWDogSXQgbG9va3MgbGlrZSBhbGwgY2FsbHMgdG8gdGhpcyBBUEkgbWF0Y2ggZGlyIGFuZCBydW5Jc1J0bCwgc28KLSAgICAgICAgLy8gaGF2aW5nIGJvdGggcGFyYW1ldGVycyBpcyByZWR1bmRhbnQgYW5kIGNvbmZ1c2luZy4KLQotICAgICAgICAvLyBmYXN0IHBhdGggZm9yIHVuc3R5bGVkIHRleHQKLSAgICAgICAgaWYgKCEodGV4dCBpbnN0YW5jZW9mIFNwYW5uZWQpKSB7Ci0gICAgICAgICAgICBmbG9hdCByZXQgPSAwOwotCi0gICAgICAgICAgICBpZiAocnVuSXNSdGwpIHsKLSAgICAgICAgICAgICAgICBDaGFyU2VxdWVuY2UgdG1wID0gVGV4dFV0aWxzLmdldFJldmVyc2UodGV4dCwgc3RhcnQsIGVuZCk7Ci0gICAgICAgICAgICAgICAgLy8gWFhYOiB0aGlzIGFzc3VtZXMgZ2V0UmV2ZXJzZSBkb2Vzbid0IHR3ZWFrIHRoZSBsZW5ndGggb2YKLSAgICAgICAgICAgICAgICAvLyB0aGUgdGV4dAotICAgICAgICAgICAgICAgIGludCB0bXBlbmQgPSBlbmQgLSBzdGFydDsKLQotICAgICAgICAgICAgICAgIGlmIChjYW52YXMgIT0gbnVsbCB8fCBuZWVkV2lkdGgpCi0gICAgICAgICAgICAgICAgICAgIHJldCA9IHBhaW50Lm1lYXN1cmVUZXh0KHRtcCwgMCwgdG1wZW5kKTsKLQotICAgICAgICAgICAgICAgIGlmIChjYW52YXMgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgY2FudmFzLmRyYXdUZXh0KHRtcCwgMCwgdG1wZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCAtIHJldCwgeSwgcGFpbnQpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAobmVlZFdpZHRoKQotICAgICAgICAgICAgICAgICAgICByZXQgPSBwYWludC5tZWFzdXJlVGV4dCh0ZXh0LCBzdGFydCwgZW5kKTsKLQotICAgICAgICAgICAgICAgIGlmIChjYW52YXMgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgY2FudmFzLmRyYXdUZXh0KHRleHQsIHN0YXJ0LCBlbmQsIHgsIHksIHBhaW50KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGZtaSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcGFpbnQuZ2V0Rm9udE1ldHJpY3NJbnQoZm1pKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIHJldCAqIGRpcjsgICAvLyBMYXlvdXQuRElSX1JJR0hUX1RPX0xFRlQgPT0gLTEKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZmxvYXQgb3ggPSB4OwotICAgICAgICBpbnQgbWluQXNjZW50ID0gMCwgbWF4RGVzY2VudCA9IDAsIG1pblRvcCA9IDAsIG1heEJvdHRvbSA9IDA7Ci0KLSAgICAgICAgU3Bhbm5lZCBzcCA9IChTcGFubmVkKSB0ZXh0OwotICAgICAgICBDbGFzczw/PiBkaXZpc2lvbjsKLQotICAgICAgICBpZiAoY2FudmFzID09IG51bGwpCi0gICAgICAgICAgICBkaXZpc2lvbiA9IE1ldHJpY0FmZmVjdGluZ1NwYW4uY2xhc3M7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGRpdmlzaW9uID0gQ2hhcmFjdGVyU3R5bGUuY2xhc3M7Ci0KLSAgICAgICAgaW50IG5leHQ7Ci0gICAgICAgIGZvciAoaW50IGkgPSBzdGFydDsgaSA8IGVuZDsgaSA9IG5leHQpIHsKLSAgICAgICAgICAgIG5leHQgPSBzcC5uZXh0U3BhblRyYW5zaXRpb24oaSwgZW5kLCBkaXZpc2lvbik7Ci0KLSAgICAgICAgICAgIC8vIFhYWDogaWYgZGlyIGFuZCBydW5Jc1J0bCB3ZXJlIG5vdCB0aGUgc2FtZSwgdGhpcyB3b3VsZCBkcmF3Ci0gICAgICAgICAgICAvLyBzcGFucyBpbiB0aGUgd3Jvbmcgb3JkZXIsIGJ1dCBubyBvbmUgYXBwZWFycyB0byBjYWxsIGl0IHRoaXMKLSAgICAgICAgICAgIC8vIHdheS4KLSAgICAgICAgICAgIHggKz0gZHJhd1VuaWZvcm1SdW4oY2FudmFzLCBzcCwgaSwgbmV4dCwgZGlyLCBydW5Jc1J0bCwKLSAgICAgICAgICAgICAgICAgIHgsIHRvcCwgeSwgYm90dG9tLCBmbWksIHBhaW50LCB3b3JrUGFpbnQsCi0gICAgICAgICAgICAgICAgICBuZWVkV2lkdGggfHwgbmV4dCAhPSBlbmQpOwotCi0gICAgICAgICAgICBpZiAoZm1pICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoZm1pLmFzY2VudCA8IG1pbkFzY2VudCkKLSAgICAgICAgICAgICAgICAgICAgbWluQXNjZW50ID0gZm1pLmFzY2VudDsKLSAgICAgICAgICAgICAgICBpZiAoZm1pLmRlc2NlbnQgPiBtYXhEZXNjZW50KQotICAgICAgICAgICAgICAgICAgICBtYXhEZXNjZW50ID0gZm1pLmRlc2NlbnQ7Ci0KLSAgICAgICAgICAgICAgICBpZiAoZm1pLnRvcCA8IG1pblRvcCkKLSAgICAgICAgICAgICAgICAgICAgbWluVG9wID0gZm1pLnRvcDsKLSAgICAgICAgICAgICAgICBpZiAoZm1pLmJvdHRvbSA+IG1heEJvdHRvbSkKLSAgICAgICAgICAgICAgICAgICAgbWF4Qm90dG9tID0gZm1pLmJvdHRvbTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChmbWkgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKHN0YXJ0ID09IGVuZCkgewotICAgICAgICAgICAgICAgIHBhaW50LmdldEZvbnRNZXRyaWNzSW50KGZtaSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZtaS5hc2NlbnQgPSBtaW5Bc2NlbnQ7Ci0gICAgICAgICAgICAgICAgZm1pLmRlc2NlbnQgPSBtYXhEZXNjZW50OwotICAgICAgICAgICAgICAgIGZtaS50b3AgPSBtaW5Ub3A7Ci0gICAgICAgICAgICAgICAgZm1pLmJvdHRvbSA9IG1heEJvdHRvbTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB4IC0gb3g7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRHJhd3MgYSB1bmlkaXJlY3Rpb25hbCBydW4gb2YgdGV4dCBvbiBhIHNpbmdsZSBsaW5lLCBhbmQgb3B0aW9uYWxseQotICAgICAqIHJldHVybnMgdGhlIHNpZ25lZCBhZHZhbmNlLiAgVW5saWtlIGRyYXdEaXJlY3Rpb25hbFJ1biwgdGhlIHBhcmFncmFwaAotICAgICAqIGRpcmVjdGlvbiBhbmQgcnVuIGRpcmVjdGlvbiBjYW4gYmUgZGlmZmVyZW50LgotICAgICAqLwotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZsb2F0IGRyYXdUZXh0KENhbnZhcyBjYW52YXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyU2VxdWVuY2UgdGV4dCwgaW50IHN0YXJ0LCBpbnQgZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRpciwgYm9vbGVhbiBydW5Jc1J0bCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHgsIGludCB0b3AsIGludCB5LCBpbnQgYm90dG9tLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGV4dFBhaW50IHBhaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGV4dFBhaW50IHdvcmtQYWludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gbmVlZFdpZHRoKSB7Ci0gICAgICAgIC8vIFhYWCB0aGlzIGxvZ2ljIGlzIChkaXIgPT0gRElSX0xFRlRfVE9fUklHSFQpID09IHJ1bklzUnRsCi0gICAgICAgIGlmICgoZGlyID09IExheW91dC5ESVJfUklHSFRfVE9fTEVGVCAmJiAhcnVuSXNSdGwpIHx8Ci0gICAgICAgICAgICAocnVuSXNSdGwgJiYgZGlyID09IExheW91dC5ESVJfTEVGVF9UT19SSUdIVCkpIHsKLSAgICAgICAgICAgIC8vIFRPRE86IHRoaXMgbmVlZHMgdGhlIHJlYWwgZGlyZWN0aW9uCi0gICAgICAgICAgICBmbG9hdCBjaCA9IGRyYXdEaXJlY3Rpb25hbFJ1bihudWxsLCB0ZXh0LCBzdGFydCwgZW5kLAotICAgICAgICAgICAgICAgICAgICBMYXlvdXQuRElSX0xFRlRfVE9fUklHSFQsIGZhbHNlLCAwLCAwLCAwLCAwLCBudWxsLCBwYWludCwKLSAgICAgICAgICAgICAgICAgICAgd29ya1BhaW50LCB0cnVlKTsKLQotICAgICAgICAgICAgY2ggKj0gZGlyOyAgLy8gRElSX1JJR0hUX1RPX0xFRlQgPT0gLTEKLSAgICAgICAgICAgIGRyYXdEaXJlY3Rpb25hbFJ1bihjYW52YXMsIHRleHQsIHN0YXJ0LCBlbmQsIC1kaXIsCi0gICAgICAgICAgICAgICAgICAgIHJ1bklzUnRsLCB4ICsgY2gsIHRvcCwgeSwgYm90dG9tLCBudWxsLCBwYWludCwKLSAgICAgICAgICAgICAgICAgICAgd29ya1BhaW50LCB0cnVlKTsKLQotICAgICAgICAgICAgcmV0dXJuIGNoOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGRyYXdEaXJlY3Rpb25hbFJ1bihjYW52YXMsIHRleHQsIHN0YXJ0LCBlbmQsIGRpciwgcnVuSXNSdGwsCi0gICAgICAgICAgICAgICAgICAgICAgIHgsIHRvcCwgeSwgYm90dG9tLCBudWxsLCBwYWludCwgd29ya1BhaW50LAotICAgICAgICAgICAgICAgICAgICAgICBuZWVkV2lkdGgpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBEcmF3cyBhIHJ1biBvZiB0ZXh0IG9uIGEgc2luZ2xlIGxpbmUsIHdpdGggaXRzCi0gICAgICogb3JpZ2luIGF0ICh4LHkpLCBpbiB0aGUgc3BlY2lmaWVkIFBhaW50LiBUaGUgb3JpZ2luIGlzIGludGVycHJldGVkIGJhc2VkCi0gICAgICogb24gdGhlIEFsaWduIHNldHRpbmcgaW4gdGhlIFBhaW50LgotICAgICAqCi0gICAgICogVGhpcyBtZXRob2QgY29uc2lkZXJzIHN0eWxlIGluZm9ybWF0aW9uIGluIHRoZSB0ZXh0IChlLmcuIGV2ZW4gd2hlbiB0ZXh0Ci0gICAgICogaXMgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIGFuZHJvaWQudGV4dC5TcGFubmVkfSwgdGhpcyBtZXRob2QgY29ycmVjdGx5Ci0gICAgICogZHJhd3MgdGhlIHRleHQpLiBTZWUgYWxzbwotICAgICAqIHtAbGluayBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhcyNkcmF3VGV4dChDaGFyU2VxdWVuY2UsIGludCwgaW50LCBmbG9hdCwKLSAgICAgKiBmbG9hdCwgUGFpbnQpfSBhbmQKLSAgICAgKiB7QGxpbmsgYW5kcm9pZC5ncmFwaGljcy5DYW52YXMjZHJhd1JlY3QoZmxvYXQsIGZsb2F0LCBmbG9hdCwgZmxvYXQsCi0gICAgICogUGFpbnQpfS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY2FudmFzIFRoZSB0YXJnZXQgY2FudmFzCi0gICAgICogQHBhcmFtIHRleHQgVGhlIHRleHQgdG8gYmUgZHJhd24KLSAgICAgKiBAcGFyYW0gc3RhcnQgVGhlIGluZGV4IG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaW4gdGV4dCB0byBkcmF3Ci0gICAgICogQHBhcmFtIGVuZCAoZW5kIC0gMSkgaXMgdGhlIGluZGV4IG9mIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0ZXh0IHRvIGRyYXcKLSAgICAgKiBAcGFyYW0gZGlyZWN0aW9uIFRoZSBkaXJlY3Rpb24gb2YgdGhlIHRleHQuIFRoaXMgbXVzdCBiZQotICAgICAqICAgICAgICB7QGxpbmsgYW5kcm9pZC50ZXh0LkxheW91dCNESVJfTEVGVF9UT19SSUdIVH0gb3IKLSAgICAgKiAgICAgICAge0BsaW5rIGFuZHJvaWQudGV4dC5MYXlvdXQjRElSX1JJR0hUX1RPX0xFRlR9LgotICAgICAqIEBwYXJhbSB4IFRoZSB4LWNvb3JkaW5hdGUgb2Ygb3JpZ2luIGZvciB3aGVyZSB0byBkcmF3IHRoZSB0ZXh0Ci0gICAgICogQHBhcmFtIHRvcCBUaGUgdG9wIHNpZGUgb2YgdGhlIHJlY3RhbmdsZSB0byBiZSBkcmF3bgotICAgICAqIEBwYXJhbSB5IFRoZSB5LWNvb3JkaW5hdGUgb2Ygb3JpZ2luIGZvciB3aGVyZSB0byBkcmF3IHRoZSB0ZXh0Ci0gICAgICogQHBhcmFtIGJvdHRvbSBUaGUgYm90dG9tIHNpZGUgb2YgdGhlIHJlY3RhbmdsZSB0byBiZSBkcmF3bgotICAgICAqIEBwYXJhbSBwYWludCBUaGUgbWFpbiB7QGxpbmsgVGV4dFBhaW50fSBvYmplY3QuCi0gICAgICogQHBhcmFtIHdvcmtQYWludCBUaGUge0BsaW5rIFRleHRQYWludH0gb2JqZWN0IHVzZWQgZm9yIHRlbXBvcmFsCi0gICAgICogICAgICAgIHdvcmtzcGFjZS4KLSAgICAgKiBAcGFyYW0gbmVlZFdpZHRoIElmIHRydWUsIHRoaXMgbWV0aG9kIHJldHVybnMgdGhlIHdpZHRoIG9mIGRyYXduIHRleHQKLSAgICAgKiBAcmV0dXJuIFdpZHRoIG9mIHRoZSBkcmF3biB0ZXh0IGlmIG5lZWRXaWR0aCBpcyB0cnVlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmbG9hdCBkcmF3VGV4dChDYW52YXMgY2FudmFzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhclNlcXVlbmNlIHRleHQsIGludCBzdGFydCwgaW50IGVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkaXJlY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4LCBpbnQgdG9wLCBpbnQgeSwgaW50IGJvdHRvbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRQYWludCBwYWludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRQYWludCB3b3JrUGFpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIG5lZWRXaWR0aCkgewotICAgICAgICAvLyBGb3Igc2FmZXR5LgotICAgICAgICBkaXJlY3Rpb24gPSBkaXJlY3Rpb24gPj0gMCA/IExheW91dC5ESVJfTEVGVF9UT19SSUdIVAotICAgICAgICAgICAgICAgIDogTGF5b3V0LkRJUl9SSUdIVF9UT19MRUZUOwotCi0gICAgICAgIC8vIEhpZGUgcnVuSXNSdGwgcGFyYW1ldGVyIHNpbmNlIGl0IGlzIG1lYW5pbmdsZXNzIGZvciBleHRlcm5hbAotICAgICAgICAvLyBkZXZlbG9wZXJzLgotICAgICAgICAvLyBYWFg6IHRoZSBydW5Jc1J0bCBwcm9iYWJseSBvdWdodCB0byBiZSB0aGUgc2FtZSBhcyBkaXJlY3Rpb24sIHRoZW4KLSAgICAgICAgLy8gdGhpcyBjb3VsZCBkcmF3IHJ0bCB0ZXh0LgotICAgICAgICByZXR1cm4gZHJhd1RleHQoY2FudmFzLCB0ZXh0LCBzdGFydCwgZW5kLCBkaXJlY3Rpb24sIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgeCwgdG9wLCB5LCBib3R0b20sIHBhaW50LCB3b3JrUGFpbnQsIG5lZWRXaWR0aCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHdpZHRoIG9mIGEgcnVuIG9mIGxlZnQtdG8tcmlnaHQgdGV4dCBvbiBhIHNpbmdsZSBsaW5lLAotICAgICAqIGNvbnNpZGVyaW5nIHN0eWxlIGluZm9ybWF0aW9uIGluIHRoZSB0ZXh0IChlLmcuIGV2ZW4gd2hlbiB0ZXh0IGlzIGFuCi0gICAgICogaW5zdGFuY2Ugb2Yge0BsaW5rIGFuZHJvaWQudGV4dC5TcGFubmVkfSwgdGhpcyBtZXRob2QgY29ycmVjdGx5IG1lYXN1cmVzCi0gICAgICogdGhlIHdpZHRoIG9mIHRoZSB0ZXh0KS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGFpbnQgdGhlIG1haW4ge0BsaW5rIFRleHRQYWludH0gb2JqZWN0OyB3aWxsIG5vdCBiZSBtb2RpZmllZAotICAgICAqIEBwYXJhbSB3b3JrUGFpbnQgdGhlIHtAbGluayBUZXh0UGFpbnR9IG9iamVjdCBhdmFpbGFibGUgZm9yIG1vZGlmaWNhdGlvbjsKLSAgICAgKiAgICAgICAgd2lsbCBub3QgbmVjZXNzYXJpbHkgYmUgdXNlZAotICAgICAqIEBwYXJhbSB0ZXh0IHRoZSB0ZXh0IHRvIG1lYXN1cmUKLSAgICAgKiBAcGFyYW0gc3RhcnQgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgdG8gc3RhcnQgbWVhc3VyaW5nCi0gICAgICogQHBhcmFtIGVuZCAxIGJleW9uZCB0aGUgaW5kZXggb2YgdGhlIGxhc3QgY2hhcmFjdGVyIHRvIG1lYXN1cmUKLSAgICAgKiBAcGFyYW0gZm1pIEZvbnRNZXRyaWNzIGluZm9ybWF0aW9uOyBjYW4gYmUgbnVsbAotICAgICAqIEByZXR1cm4gVGhlIHdpZHRoIG9mIHRoZSB0ZXh0Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmbG9hdCBtZWFzdXJlVGV4dChUZXh0UGFpbnQgcGFpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXh0UGFpbnQgd29ya1BhaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhclNlcXVlbmNlIHRleHQsIGludCBzdGFydCwgaW50IGVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhaW50LkZvbnRNZXRyaWNzSW50IGZtaSkgewotICAgICAgICByZXR1cm4gZHJhd0RpcmVjdGlvbmFsUnVuKG51bGwsIHRleHQsIHN0YXJ0LCBlbmQsCi0gICAgICAgICAgICAgICAgICAgICAgIExheW91dC5ESVJfTEVGVF9UT19SSUdIVCwgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDAsIDAsIGZtaSwgcGFpbnQsIHdvcmtQYWludCwgdHJ1ZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9UZXh0TGluZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9UZXh0TGluZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlMzUyMmUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L1RleHRMaW5lLmphdmEKQEAgLTAsMCArMSw5NDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQudGV4dDsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnV0aWwuQXJyYXlVdGlsczsKKworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludC5Gb250TWV0cmljc0ludDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3RGOworaW1wb3J0IGFuZHJvaWQudGV4dC5MYXlvdXQuRGlyZWN0aW9uczsKK2ltcG9ydCBhbmRyb2lkLnRleHQuTGF5b3V0LlRhYlN0b3BzOworaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5DaGFyYWN0ZXJTdHlsZTsKK2ltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuTWV0cmljQWZmZWN0aW5nU3BhbjsKK2ltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuUmVwbGFjZW1lbnRTcGFuOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKKy8qKgorICogUmVwcmVzZW50cyBhIGxpbmUgb2Ygc3R5bGVkIHRleHQsIGZvciBtZWFzdXJpbmcgaW4gdmlzdWFsIG9yZGVyIGFuZAorICogZm9yIHJlbmRlcmluZy4KKyAqCisgKiA8cD5HZXQgYSBuZXcgaW5zdGFuY2UgdXNpbmcgb2J0YWluKCksIGFuZCB3aGVuIGZpbmlzaGVkIHdpdGggaXQsIHJldHVybiBpdAorICogdG8gdGhlIHBvb2wgdXNpbmcgcmVjeWNsZSgpLgorICoKKyAqIDxwPkNhbGwgc2V0IHRvIHByZXBhcmUgdGhlIGluc3RhbmNlIGZvciB1c2UsIHRoZW4gZWl0aGVyIGRyYXcsIG1lYXN1cmUsCisgKiBtZXRyaWNzLCBvciBjYXJldFRvTGVmdFJpZ2h0T2YuCisgKgorICogQGhpZGUKKyAqLworY2xhc3MgVGV4dExpbmUgeworICAgIHByaXZhdGUgVGV4dFBhaW50IG1QYWludDsKKyAgICBwcml2YXRlIENoYXJTZXF1ZW5jZSBtVGV4dDsKKyAgICBwcml2YXRlIGludCBtU3RhcnQ7CisgICAgcHJpdmF0ZSBpbnQgbUxlbjsKKyAgICBwcml2YXRlIGludCBtRGlyOworICAgIHByaXZhdGUgRGlyZWN0aW9ucyBtRGlyZWN0aW9uczsKKyAgICBwcml2YXRlIGJvb2xlYW4gbUhhc1RhYnM7CisgICAgcHJpdmF0ZSBUYWJTdG9wcyBtVGFiczsKKyAgICBwcml2YXRlIGNoYXJbXSBtQ2hhcnM7CisgICAgcHJpdmF0ZSBib29sZWFuIG1DaGFyc1ZhbGlkOworICAgIHByaXZhdGUgU3Bhbm5lZCBtU3Bhbm5lZDsKKyAgICBwcml2YXRlIGZpbmFsIFRleHRQYWludCBtV29ya1BhaW50ID0gbmV3IFRleHRQYWludCgpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgVGV4dExpbmVbXSBjYWNoZWQgPSBuZXcgVGV4dExpbmVbM107CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgbmV3IFRleHRMaW5lIGZyb20gdGhlIHNoYXJlZCBwb29sLgorICAgICAqCisgICAgICogQHJldHVybiBhbiB1bmluaXRpYWxpemVkIFRleHRMaW5lCisgICAgICovCisgICAgc3RhdGljIFRleHRMaW5lIG9idGFpbigpIHsKKyAgICAgICAgVGV4dExpbmUgdGw7CisgICAgICAgIHN5bmNocm9uaXplZCAoY2FjaGVkKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gY2FjaGVkLmxlbmd0aDsgLS1pID49IDA7KSB7CisgICAgICAgICAgICAgICAgaWYgKGNhY2hlZFtpXSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRsID0gY2FjaGVkW2ldOworICAgICAgICAgICAgICAgICAgICBjYWNoZWRbaV0gPSBudWxsOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHRsID0gbmV3IFRleHRMaW5lKCk7CisgICAgICAgIExvZy5lKCJUTElORSIsICJuZXc6ICIgKyB0bCk7CisgICAgICAgIHJldHVybiB0bDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQdXRzIGEgVGV4dExpbmUgYmFjayBpbnRvIHRoZSBzaGFyZWQgcG9vbC4gRG8gbm90IHVzZSB0aGlzIFRleHRMaW5lIG9uY2UKKyAgICAgKiBpdCBoYXMgYmVlbiByZXR1cm5lZC4KKyAgICAgKiBAcGFyYW0gdGwgdGhlIHRleHRMaW5lCisgICAgICogQHJldHVybiBudWxsLCBhcyBhIGNvbnZlbmllbmNlIGZyb20gY2xlYXJpbmcgcmVmZXJlbmNlcyB0byB0aGUgcHJvdmlkZWQKKyAgICAgKiBUZXh0TGluZQorICAgICAqLworICAgIHN0YXRpYyBUZXh0TGluZSByZWN5Y2xlKFRleHRMaW5lIHRsKSB7CisgICAgICAgIHRsLm1UZXh0ID0gbnVsbDsKKyAgICAgICAgdGwubVBhaW50ID0gbnVsbDsKKyAgICAgICAgdGwubURpcmVjdGlvbnMgPSBudWxsOworICAgICAgICBpZiAodGwubUxlbiA8IDI1MCkgeworICAgICAgICAgICAgc3luY2hyb25pemVkKGNhY2hlZCkgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2FjaGVkLmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjYWNoZWRbaV0gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVkW2ldID0gdGw7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplcyBhIFRleHRMaW5lIGFuZCBwcmVwYXJlcyBpdCBmb3IgdXNlLgorICAgICAqCisgICAgICogQHBhcmFtIHBhaW50IHRoZSBiYXNlIHBhaW50IGZvciB0aGUgbGluZQorICAgICAqIEBwYXJhbSB0ZXh0IHRoZSB0ZXh0LCBjYW4gYmUgU3R5bGVkCisgICAgICogQHBhcmFtIHN0YXJ0IHRoZSBzdGFydCBvZiB0aGUgbGluZSByZWxhdGl2ZSB0byB0aGUgdGV4dAorICAgICAqIEBwYXJhbSBsaW1pdCB0aGUgbGltaXQgb2YgdGhlIGxpbmUgcmVsYXRpdmUgdG8gdGhlIHRleHQKKyAgICAgKiBAcGFyYW0gZGlyIHRoZSBwYXJhZ3JhcGggZGlyZWN0aW9uIG9mIHRoaXMgbGluZQorICAgICAqIEBwYXJhbSBkaXJlY3Rpb25zIHRoZSBkaXJlY3Rpb25zIGluZm9ybWF0aW9uIG9mIHRoaXMgbGluZQorICAgICAqIEBwYXJhbSBoYXNUYWJzIHRydWUgaWYgdGhlIGxpbmUgbWlnaHQgY29udGFpbiB0YWJzIG9yIGVtb2ppCisgICAgICogQHBhcmFtIHRhYlN0b3BzIHRoZSB0YWJTdG9wcy4gQ2FuIGJlIG51bGwuCisgICAgICovCisgICAgdm9pZCBzZXQoVGV4dFBhaW50IHBhaW50LCBDaGFyU2VxdWVuY2UgdGV4dCwgaW50IHN0YXJ0LCBpbnQgbGltaXQsIGludCBkaXIsCisgICAgICAgICAgICBEaXJlY3Rpb25zIGRpcmVjdGlvbnMsIGJvb2xlYW4gaGFzVGFicywgVGFiU3RvcHMgdGFiU3RvcHMpIHsKKyAgICAgICAgbVBhaW50ID0gcGFpbnQ7CisgICAgICAgIG1UZXh0ID0gdGV4dDsKKyAgICAgICAgbVN0YXJ0ID0gc3RhcnQ7CisgICAgICAgIG1MZW4gPSBsaW1pdCAtIHN0YXJ0OworICAgICAgICBtRGlyID0gZGlyOworICAgICAgICBtRGlyZWN0aW9ucyA9IGRpcmVjdGlvbnM7CisgICAgICAgIG1IYXNUYWJzID0gaGFzVGFiczsKKyAgICAgICAgbVNwYW5uZWQgPSBudWxsOworCisgICAgICAgIGJvb2xlYW4gaGFzUmVwbGFjZW1lbnQgPSBmYWxzZTsKKyAgICAgICAgaWYgKHRleHQgaW5zdGFuY2VvZiBTcGFubmVkKSB7CisgICAgICAgICAgICBtU3Bhbm5lZCA9IChTcGFubmVkKSB0ZXh0OworICAgICAgICAgICAgaGFzUmVwbGFjZW1lbnQgPSBtU3Bhbm5lZC5nZXRTcGFucyhzdGFydCwgbGltaXQsCisgICAgICAgICAgICAgICAgICAgIFJlcGxhY2VtZW50U3Bhbi5jbGFzcykubGVuZ3RoID4gMDsKKyAgICAgICAgfQorCisgICAgICAgIG1DaGFyc1ZhbGlkID0gaGFzUmVwbGFjZW1lbnQgfHwgaGFzVGFicyB8fAorICAgICAgICAgICAgZGlyZWN0aW9ucyAhPSBMYXlvdXQuRElSU19BTExfTEVGVF9UT19SSUdIVDsKKworICAgICAgICBpZiAobUNoYXJzVmFsaWQpIHsKKyAgICAgICAgICAgIGlmIChtQ2hhcnMgPT0gbnVsbCB8fCBtQ2hhcnMubGVuZ3RoIDwgbUxlbikgeworICAgICAgICAgICAgICAgIG1DaGFycyA9IG5ldyBjaGFyW0FycmF5VXRpbHMuaWRlYWxDaGFyQXJyYXlTaXplKG1MZW4pXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFRleHRVdGlscy5nZXRDaGFycyh0ZXh0LCBzdGFydCwgbGltaXQsIG1DaGFycywgMCk7CisgICAgICAgICAgICBpZiAoaGFzUmVwbGFjZW1lbnQpIHsKKyAgICAgICAgICAgICAgICAvLyBIYW5kbGUgdGhlc2UgYWxsIGF0IG9uY2Ugc28gd2UgZG9uJ3QgaGF2ZSB0byBkbyBpdCBhcyB3ZSBnby4KKyAgICAgICAgICAgICAgICAvLyBSZXBsYWNlIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgZWFjaCByZXBsYWNlbWVudCBydW4gd2l0aCB0aGUKKyAgICAgICAgICAgICAgICAvLyBvYmplY3QtcmVwbGFjZW1lbnQgY2hhcmFjdGVyIGFuZCB0aGUgcmVtYWluZGVyIHdpdGggemVybyB3aWR0aAorICAgICAgICAgICAgICAgIC8vIG5vbi1icmVhayBzcGFjZSBha2EgQk9NLiAgQ3Vyc29yIG1vdmVtZW50IGNvZGUgc2tpcHMgdGhlc2UKKyAgICAgICAgICAgICAgICAvLyB6ZXJvLXdpZHRoIGNoYXJhY3RlcnMuCisgICAgICAgICAgICAgICAgY2hhcltdIGNoYXJzID0gbUNoYXJzOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSBzdGFydCwgaW5leHQ7IGkgPCBsaW1pdDsgaSA9IGluZXh0KSB7CisgICAgICAgICAgICAgICAgICAgIGluZXh0ID0gbVNwYW5uZWQubmV4dFNwYW5UcmFuc2l0aW9uKGksIGxpbWl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlcGxhY2VtZW50U3Bhbi5jbGFzcyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChtU3Bhbm5lZC5nZXRTcGFucyhpLCBpbmV4dCwgUmVwbGFjZW1lbnRTcGFuLmNsYXNzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5sZW5ndGggPiAwKSB7IC8vIHRyYW5zaXRpb24gaW50byBhIHNwYW4KKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJzW2kgLSBzdGFydF0gPSAnXHVmZmZjJzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSBpIC0gc3RhcnQgKyAxLCBlID0gaW5leHQgLSBzdGFydDsgaiA8IGU7ICsraikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJzW2pdID0gJ1x1ZmVmZic7IC8vIHVzZWQgYXMgWldOQlMsIG1hcmtzIHBvc2l0aW9ucyB0byBza2lwCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbVRhYnMgPSB0YWJTdG9wczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW5kZXJzIHRoZSBUZXh0TGluZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjIHRoZSBjYW52YXMgdG8gcmVuZGVyIG9uCisgICAgICogQHBhcmFtIHggdGhlIGxlYWRpbmcgbWFyZ2luIHBvc2l0aW9uCisgICAgICogQHBhcmFtIHRvcCB0aGUgdG9wIG9mIHRoZSBsaW5lCisgICAgICogQHBhcmFtIHkgdGhlIGJhc2VsaW5lCisgICAgICogQHBhcmFtIGJvdHRvbSB0aGUgYm90dG9tIG9mIHRoZSBsaW5lCisgICAgICovCisgICAgdm9pZCBkcmF3KENhbnZhcyBjLCBmbG9hdCB4LCBpbnQgdG9wLCBpbnQgeSwgaW50IGJvdHRvbSkgeworICAgICAgICBpZiAoIW1IYXNUYWJzKSB7CisgICAgICAgICAgICBpZiAobURpcmVjdGlvbnMgPT0gTGF5b3V0LkRJUlNfQUxMX0xFRlRfVE9fUklHSFQpIHsKKyAgICAgICAgICAgICAgICBkcmF3UnVuKGMsIDAsIDAsIG1MZW4sIGZhbHNlLCB4LCB0b3AsIHksIGJvdHRvbSwgZmFsc2UpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtRGlyZWN0aW9ucyA9PSBMYXlvdXQuRElSU19BTExfUklHSFRfVE9fTEVGVCkgeworICAgICAgICAgICAgICAgIGRyYXdSdW4oYywgMCwgMCwgbUxlbiwgdHJ1ZSwgeCwgdG9wLCB5LCBib3R0b20sIGZhbHNlKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmbG9hdCBoID0gMDsKKyAgICAgICAgaW50W10gcnVucyA9IG1EaXJlY3Rpb25zLm1EaXJlY3Rpb25zOworICAgICAgICBSZWN0RiBlbW9qaVJlY3QgPSBudWxsOworCisgICAgICAgIGludCBsYXN0UnVuSW5kZXggPSBydW5zLmxlbmd0aCAtIDI7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcnVucy5sZW5ndGg7IGkgKz0gMikgeworICAgICAgICAgICAgaW50IHJ1blN0YXJ0ID0gcnVuc1tpXTsKKyAgICAgICAgICAgIGludCBydW5MaW1pdCA9IHJ1blN0YXJ0ICsgKHJ1bnNbaSsxXSAmIExheW91dC5SVU5fTEVOR1RIX01BU0spOworICAgICAgICAgICAgaWYgKHJ1bkxpbWl0ID4gbUxlbikgeworICAgICAgICAgICAgICAgIHJ1bkxpbWl0ID0gbUxlbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJvb2xlYW4gcnVuSXNSdGwgPSAocnVuc1tpKzFdICYgTGF5b3V0LlJVTl9SVExfRkxBRykgIT0gMDsKKworICAgICAgICAgICAgaW50IHNlZ3N0YXJ0ID0gcnVuU3RhcnQ7CisgICAgICAgICAgICBjaGFyW10gY2hhcnMgPSBtQ2hhcnM7CisgICAgICAgICAgICBmb3IgKGludCBqID0gbUhhc1RhYnMgPyBydW5TdGFydCA6IHJ1bkxpbWl0OyBqIDw9IHJ1bkxpbWl0OyBqKyspIHsKKyAgICAgICAgICAgICAgICBpbnQgY29kZXB0ID0gMDsKKyAgICAgICAgICAgICAgICBCaXRtYXAgYm0gPSBudWxsOworCisgICAgICAgICAgICAgICAgaWYgKG1IYXNUYWJzICYmIGogPCBydW5MaW1pdCkgeworICAgICAgICAgICAgICAgICAgICBjb2RlcHQgPSBtQ2hhcnNbal07CisgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlcHQgPj0gMHhkODAwICYmIGNvZGVwdCA8IDB4ZGMwMCAmJiBqICsgMSA8IHJ1bkxpbWl0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb2RlcHQgPSBDaGFyYWN0ZXIuY29kZVBvaW50QXQobUNoYXJzLCBqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlcHQgPj0gTGF5b3V0Lk1JTl9FTU9KSSAmJiBjb2RlcHQgPD0gTGF5b3V0Lk1BWF9FTU9KSSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJtID0gTGF5b3V0LkVNT0pJX0ZBQ1RPUlkuZ2V0Qml0bWFwRnJvbUFuZHJvaWRQdWEoY29kZXB0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29kZXB0ID4gMHhmZmZmKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytqOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGogPT0gcnVuTGltaXQgfHwgY29kZXB0ID09ICdcdCcgfHwgYm0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBoICs9IGRyYXdSdW4oYywgaSwgc2Vnc3RhcnQsIGosIHJ1bklzUnRsLCB4K2gsIHRvcCwgeSwgYm90dG9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgIT0gbGFzdFJ1bkluZGV4IHx8IGogIT0gbUxlbik7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGVwdCA9PSAnXHQnKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBoID0gbURpciAqIG5leHRUYWIoaCAqIG1EaXIpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGJtICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGJtQXNjZW50ID0gYXNjZW50KGopOworICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYml0bWFwSGVpZ2h0ID0gYm0uZ2V0SGVpZ2h0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBzY2FsZSA9IC1ibUFzY2VudCAvIGJpdG1hcEhlaWdodDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHdpZHRoID0gYm0uZ2V0V2lkdGgoKSAqIHNjYWxlOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW1vamlSZWN0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbW9qaVJlY3QgPSBuZXcgUmVjdEYoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVtb2ppUmVjdC5zZXQoeCArIGgsIHkgKyBibUFzY2VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCArIGggKyB3aWR0aCwgeSk7CisgICAgICAgICAgICAgICAgICAgICAgICBjLmRyYXdCaXRtYXAoYm0sIG51bGwsIGVtb2ppUmVjdCwgbVBhaW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGggKz0gd2lkdGg7CisgICAgICAgICAgICAgICAgICAgICAgICBqKys7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc2Vnc3RhcnQgPSBqICsgMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIG1ldHJpY3MgaW5mb3JtYXRpb24gZm9yIHRoZSBlbnRpcmUgbGluZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmbWkgcmVjZWl2ZXMgZm9udCBtZXRyaWNzIGluZm9ybWF0aW9uLCBjYW4gYmUgbnVsbAorICAgICAqIEByZXR1cm4gdGhlIHNpZ25lZCB3aWR0aCBvZiB0aGUgbGluZQorICAgICAqLworICAgIGZsb2F0IG1ldHJpY3MoRm9udE1ldHJpY3NJbnQgZm1pKSB7CisgICAgICAgIHJldHVybiBtZWFzdXJlKG1MZW4sIGZhbHNlLCBmbWkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgaW5mb3JtYXRpb24gYWJvdXQgYSBwb3NpdGlvbiBvbiB0aGUgbGluZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvZmZzZXQgdGhlIGxpbmUtcmVsYXRpdmUgY2hhcmFjdGVyIG9mZnNldCwgYmV0d2VlbiAwIGFuZCB0aGUKKyAgICAgKiBsaW5lIGxlbmd0aCwgaW5jbHVzaXZlCisgICAgICogQHBhcmFtIHRyYWlsaW5nIHRydWUgdG8gbWVhc3VyZSB0aGUgdHJhaWxpbmcgZWRnZSBvZiB0aGUgY2hhcmFjdGVyCisgICAgICogYmVmb3JlIG9mZnNldCwgZmFsc2UgdG8gbWVhc3VyZSB0aGUgbGVhZGluZyBlZGdlIG9mIHRoZSBjaGFyYWN0ZXIKKyAgICAgKiBhdCBvZmZzZXQuCisgICAgICogQHBhcmFtIGZtaSByZWNlaXZlcyBtZXRyaWNzIGluZm9ybWF0aW9uIGFib3V0IHRoZSByZXF1ZXN0ZWQKKyAgICAgKiBjaGFyYWN0ZXIsIGNhbiBiZSBudWxsLgorICAgICAqIEByZXR1cm4gdGhlIHNpZ25lZCBvZmZzZXQgZnJvbSB0aGUgbGVhZGluZyBtYXJnaW4gdG8gdGhlIHJlcXVlc3RlZAorICAgICAqIGNoYXJhY3RlciBlZGdlLgorICAgICAqLworICAgIGZsb2F0IG1lYXN1cmUoaW50IG9mZnNldCwgYm9vbGVhbiB0cmFpbGluZywgRm9udE1ldHJpY3NJbnQgZm1pKSB7CisgICAgICAgIGludCB0YXJnZXQgPSB0cmFpbGluZyA/IG9mZnNldCAtIDEgOiBvZmZzZXQ7CisgICAgICAgIGlmICh0YXJnZXQgPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIGZsb2F0IGggPSAwOworCisgICAgICAgIGlmICghbUhhc1RhYnMpIHsKKyAgICAgICAgICAgIGlmIChtRGlyZWN0aW9ucyA9PSBMYXlvdXQuRElSU19BTExfTEVGVF9UT19SSUdIVCkgeworICAgICAgICAgICAgICAgIHJldHVybiBtZWFzdXJlUnVuKDAsIDAsIG9mZnNldCwgbUxlbiwgZmFsc2UsIGZtaSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobURpcmVjdGlvbnMgPT0gTGF5b3V0LkRJUlNfQUxMX1JJR0hUX1RPX0xFRlQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbWVhc3VyZVJ1bigwLCAwLCBvZmZzZXQsIG1MZW4sIHRydWUsIGZtaSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBjaGFyW10gY2hhcnMgPSBtQ2hhcnM7CisgICAgICAgIGludFtdIHJ1bnMgPSBtRGlyZWN0aW9ucy5tRGlyZWN0aW9uczsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBydW5zLmxlbmd0aDsgaSArPSAyKSB7CisgICAgICAgICAgICBpbnQgcnVuU3RhcnQgPSBydW5zW2ldOworICAgICAgICAgICAgaW50IHJ1bkxpbWl0ID0gcnVuU3RhcnQgKyAocnVuc1tpKzFdICYgTGF5b3V0LlJVTl9MRU5HVEhfTUFTSyk7CisgICAgICAgICAgICBpZiAocnVuTGltaXQgPiBtTGVuKSB7CisgICAgICAgICAgICAgICAgcnVuTGltaXQgPSBtTGVuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYm9vbGVhbiBydW5Jc1J0bCA9IChydW5zW2krMV0gJiBMYXlvdXQuUlVOX1JUTF9GTEFHKSAhPSAwOworCisgICAgICAgICAgICBpbnQgc2Vnc3RhcnQgPSBydW5TdGFydDsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSBtSGFzVGFicyA/IHJ1blN0YXJ0IDogcnVuTGltaXQ7IGogPD0gcnVuTGltaXQ7IGorKykgeworICAgICAgICAgICAgICAgIGludCBjb2RlcHQgPSAwOworICAgICAgICAgICAgICAgIEJpdG1hcCBibSA9IG51bGw7CisKKyAgICAgICAgICAgICAgICBpZiAobUhhc1RhYnMgJiYgaiA8IHJ1bkxpbWl0KSB7CisgICAgICAgICAgICAgICAgICAgIGNvZGVwdCA9IGNoYXJzW2pdOworICAgICAgICAgICAgICAgICAgICBpZiAoY29kZXB0ID49IDB4ZDgwMCAmJiBjb2RlcHQgPCAweGRjMDAgJiYgaiArIDEgPCBydW5MaW1pdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29kZXB0ID0gQ2hhcmFjdGVyLmNvZGVQb2ludEF0KGNoYXJzLCBqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlcHQgPj0gTGF5b3V0Lk1JTl9FTU9KSSAmJiBjb2RlcHQgPD0gTGF5b3V0Lk1BWF9FTU9KSSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJtID0gTGF5b3V0LkVNT0pJX0ZBQ1RPUlkuZ2V0Qml0bWFwRnJvbUFuZHJvaWRQdWEoY29kZXB0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29kZXB0ID4gMHhmZmZmKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytqOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGogPT0gcnVuTGltaXQgfHwgY29kZXB0ID09ICdcdCcgfHwgYm0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBib29sZWFuIGluU2VnbWVudCA9IHRhcmdldCA+PSBzZWdzdGFydCAmJiB0YXJnZXQgPCBqOworCisgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gYWR2YW5jZSA9IChtRGlyID09IExheW91dC5ESVJfUklHSFRfVE9fTEVGVCkgPT0gcnVuSXNSdGw7CisgICAgICAgICAgICAgICAgICAgIGlmIChpblNlZ21lbnQgJiYgYWR2YW5jZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGggKz0gbWVhc3VyZVJ1bihpLCBzZWdzdGFydCwgb2Zmc2V0LCBqLCBydW5Jc1J0bCwgZm1pKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGZsb2F0IHcgPSBtZWFzdXJlUnVuKGksIHNlZ3N0YXJ0LCBqLCBqLCBydW5Jc1J0bCwgZm1pKTsKKyAgICAgICAgICAgICAgICAgICAgaCArPSBhZHZhbmNlID8gdyA6IC13OworCisgICAgICAgICAgICAgICAgICAgIGlmIChpblNlZ21lbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBoICs9IG1lYXN1cmVSdW4oaSwgc2Vnc3RhcnQsIG9mZnNldCwgaiwgcnVuSXNSdGwsIG51bGwpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGVwdCA9PSAnXHQnKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAob2Zmc2V0ID09IGopIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGggPSBtRGlyICogbmV4dFRhYihoICogbURpcik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0ID09IGopIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmIChibSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBibUFzY2VudCA9IGFzY2VudChqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHdpZCA9IGJtLmdldFdpZHRoKCkgKiAtYm1Bc2NlbnQgLyBibS5nZXRIZWlnaHQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGggKz0gbURpciAqIHdpZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGorKzsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHNlZ3N0YXJ0ID0gaiArIDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGg7CisgICAgfQorCisgICAgLyoqCisgICAgICogRHJhd3MgYSB1bmlkaXJlY3Rpb25hbCAoYnV0IHBvc3NpYmx5IG11bHRpLXN0eWxlZCkgcnVuIG9mIHRleHQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYyB0aGUgY2FudmFzIHRvIGRyYXcgb24KKyAgICAgKiBAcGFyYW0gcnVuSW5kZXggdGhlIGluZGV4IG9mIHRoaXMgZGlyZWN0aW9uYWwgcnVuCisgICAgICogQHBhcmFtIHN0YXJ0IHRoZSBsaW5lLXJlbGF0aXZlIHN0YXJ0CisgICAgICogQHBhcmFtIGxpbWl0IHRoZSBsaW5lLXJlbGF0aXZlIGxpbWl0CisgICAgICogQHBhcmFtIHJ1bklzUnRsIHRydWUgaWYgdGhlIHJ1biBpcyByaWdodC10by1sZWZ0CisgICAgICogQHBhcmFtIHggdGhlIHBvc2l0aW9uIG9mIHRoZSBydW4gdGhhdCBpcyBjbG9zZXN0IHRvIHRoZSBsZWFkaW5nIG1hcmdpbgorICAgICAqIEBwYXJhbSB0b3AgdGhlIHRvcCBvZiB0aGUgbGluZQorICAgICAqIEBwYXJhbSB5IHRoZSBiYXNlbGluZQorICAgICAqIEBwYXJhbSBib3R0b20gdGhlIGJvdHRvbSBvZiB0aGUgbGluZQorICAgICAqIEBwYXJhbSBuZWVkV2lkdGggdHJ1ZSBpZiB0aGUgd2lkdGggdmFsdWUgaXMgcmVxdWlyZWQuCisgICAgICogQHJldHVybiB0aGUgc2lnbmVkIHdpZHRoIG9mIHRoZSBydW4sIGJhc2VkIG9uIHRoZSBwYXJhZ3JhcGggZGlyZWN0aW9uLgorICAgICAqIE9ubHkgdmFsaWQgaWYgbmVlZFdpZHRoIGlzIHRydWUuCisgICAgICovCisgICAgcHJpdmF0ZSBmbG9hdCBkcmF3UnVuKENhbnZhcyBjLCBpbnQgcnVuSW5kZXgsIGludCBzdGFydCwKKyAgICAgICAgICAgIGludCBsaW1pdCwgYm9vbGVhbiBydW5Jc1J0bCwgZmxvYXQgeCwgaW50IHRvcCwgaW50IHksIGludCBib3R0b20sCisgICAgICAgICAgICBib29sZWFuIG5lZWRXaWR0aCkgeworCisgICAgICAgIGlmICgobURpciA9PSBMYXlvdXQuRElSX0xFRlRfVE9fUklHSFQpID09IHJ1bklzUnRsKSB7CisgICAgICAgICAgICBmbG9hdCB3ID0gLW1lYXN1cmVSdW4ocnVuSW5kZXgsIHN0YXJ0LCBsaW1pdCwgbGltaXQsIHJ1bklzUnRsLCBudWxsKTsKKyAgICAgICAgICAgIGhhbmRsZVJ1bihydW5JbmRleCwgc3RhcnQsIGxpbWl0LCBsaW1pdCwgcnVuSXNSdGwsIGMsIHggKyB3LCB0b3AsCisgICAgICAgICAgICAgICAgICAgIHksIGJvdHRvbSwgbnVsbCwgZmFsc2UpOworICAgICAgICAgICAgcmV0dXJuIHc7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gaGFuZGxlUnVuKHJ1bkluZGV4LCBzdGFydCwgbGltaXQsIGxpbWl0LCBydW5Jc1J0bCwgYywgeCwgdG9wLAorICAgICAgICAgICAgICAgIHksIGJvdHRvbSwgbnVsbCwgbmVlZFdpZHRoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNZWFzdXJlcyBhIHVuaWRpcmVjdGlvbmFsIChidXQgcG9zc2libHkgbXVsdGktc3R5bGVkKSBydW4gb2YgdGV4dC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBydW5JbmRleCB0aGUgcnVuIGluZGV4CisgICAgICogQHBhcmFtIHN0YXJ0IHRoZSBsaW5lLXJlbGF0aXZlIHN0YXJ0IG9mIHRoZSBydW4KKyAgICAgKiBAcGFyYW0gb2Zmc2V0IHRoZSBvZmZzZXQgdG8gbWVhc3VyZSB0bywgYmV0d2VlbiBzdGFydCBhbmQgbGltaXQgaW5jbHVzaXZlCisgICAgICogQHBhcmFtIGxpbWl0IHRoZSBsaW5lLXJlbGF0aXZlIGxpbWl0IG9mIHRoZSBydW4KKyAgICAgKiBAcGFyYW0gcnVuSXNSdGwgdHJ1ZSBpZiB0aGUgcnVuIGlzIHJpZ2h0LXRvLWxlZnQKKyAgICAgKiBAcGFyYW0gZm1pIHJlY2VpdmVzIG1ldHJpY3MgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHJlcXVlc3RlZAorICAgICAqIHJ1biwgY2FuIGJlIG51bGwuCisgICAgICogQHJldHVybiB0aGUgc2lnbmVkIHdpZHRoIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBydW4gdG8gdGhlIGxlYWRpbmcgZWRnZQorICAgICAqIG9mIHRoZSBjaGFyYWN0ZXIgYXQgb2Zmc2V0LCBiYXNlZCBvbiB0aGUgcnVuIChub3QgcGFyYWdyYXBoKSBkaXJlY3Rpb24KKyAgICAgKi8KKyAgICBwcml2YXRlIGZsb2F0IG1lYXN1cmVSdW4oaW50IHJ1bkluZGV4LCBpbnQgc3RhcnQsCisgICAgICAgICAgICBpbnQgb2Zmc2V0LCBpbnQgbGltaXQsIGJvb2xlYW4gcnVuSXNSdGwsIEZvbnRNZXRyaWNzSW50IGZtaSkgeworICAgICAgICByZXR1cm4gaGFuZGxlUnVuKHJ1bkluZGV4LCBzdGFydCwgb2Zmc2V0LCBsaW1pdCwgcnVuSXNSdGwsIG51bGwsCisgICAgICAgICAgICAgICAgMCwgMCwgMCwgMCwgZm1pLCB0cnVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXYWxrIHRoZSBjdXJzb3IgdGhyb3VnaCB0aGlzIGxpbmUsIHNraXBwaW5nIGNvbmp1bmN0cyBhbmQKKyAgICAgKiB6ZXJvLXdpZHRoIGNoYXJhY3RlcnMuCisgICAgICoKKyAgICAgKiA8cD5UaGlzIGZ1bmN0aW9uIGNhbm5vdCBwcm9wZXJseSB3YWxrIHRoZSBjdXJzb3Igb2ZmIHRoZSBlbmRzIG9mIHRoZSBsaW5lCisgICAgICogc2luY2UgaXQgZG9lcyBub3Qga25vdyBhYm91dCBhbnkgc2hhcGluZyBvbiB0aGUgcHJldmlvdXMvZm9sbG93aW5nIGxpbmUKKyAgICAgKiB0aGF0IG1pZ2h0IGFmZmVjdCB0aGUgY3Vyc29yIHBvc2l0aW9uLiBDYWxsZXJzIG11c3QgZWl0aGVyIGF2b2lkIHRoZXNlCisgICAgICogc2l0dWF0aW9ucyBvciBoYW5kbGUgdGhlIHJlc3VsdCBzcGVjaWFsbHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY3Vyc29yIHRoZSBzdGFydGluZyBwb3NpdGlvbiBvZiB0aGUgY3Vyc29yLCBiZXR3ZWVuIDAgYW5kIHRoZQorICAgICAqIGxlbmd0aCBvZiB0aGUgbGluZSwgaW5jbHVzaXZlCisgICAgICogQHBhcmFtIHRvTGVmdCB0cnVlIGlmIHRoZSBjYXJldCBpcyBtb3ZpbmcgdG8gdGhlIGxlZnQuCisgICAgICogQHJldHVybiB0aGUgbmV3IG9mZnNldC4gIElmIGl0IGlzIGxlc3MgdGhhbiAwIG9yIGdyZWF0ZXIgdGhhbiB0aGUgbGVuZ3RoCisgICAgICogb2YgdGhlIGxpbmUsIHRoZSBwcmV2aW91cy9mb2xsb3dpbmcgbGluZSBzaG91bGQgYmUgZXhhbWluZWQgdG8gZ2V0IHRoZQorICAgICAqIGFjdHVhbCBvZmZzZXQuCisgICAgICovCisgICAgaW50IGdldE9mZnNldFRvTGVmdFJpZ2h0T2YoaW50IGN1cnNvciwgYm9vbGVhbiB0b0xlZnQpIHsKKyAgICAgICAgLy8gMSkgVGhlIGNhcmV0IG1hcmtzIHRoZSBsZWFkaW5nIGVkZ2Ugb2YgYSBjaGFyYWN0ZXIuIFRoZSBjaGFyYWN0ZXIKKyAgICAgICAgLy8gbG9naWNhbGx5IGJlZm9yZSBpdCBtaWdodCBiZSBvbiBhIGRpZmZlcmVudCBsZXZlbCwgYW5kIHRoZSBhY3RpdmUgY2FyZXQKKyAgICAgICAgLy8gcG9zaXRpb24gaXMgb24gdGhlIGNoYXJhY3RlciBhdCB0aGUgbG93ZXIgbGV2ZWwuIElmIHRoYXQgY2hhcmFjdGVyCisgICAgICAgIC8vIHdhcyB0aGUgcHJldmlvdXMgY2hhcmFjdGVyLCB0aGUgY2FyZXQgaXMgb24gaXRzIHRyYWlsaW5nIGVkZ2UuCisgICAgICAgIC8vIDIpIFRha2UgdGhpcyBjaGFyYWN0ZXIvZWRnZSBhbmQgbW92ZSBpdCBpbiB0aGUgaW5kaWNhdGVkIGRpcmVjdGlvbi4KKyAgICAgICAgLy8gVGhpcyBnaXZlcyB5b3UgYSBuZXcgY2hhcmFjdGVyIGFuZCBhIG5ldyBlZGdlLgorICAgICAgICAvLyAzKSBUaGlzIHBvc2l0aW9uIGlzIGJldHdlZW4gdHdvIHZpc3VhbGx5IGFkamFjZW50IGNoYXJhY3RlcnMuICBPbmUgb2YKKyAgICAgICAgLy8gdGhlc2UgbWlnaHQgYmUgYXQgYSBsb3dlciBsZXZlbC4gIFRoZSBhY3RpdmUgcG9zaXRpb24gaXMgb24gdGhlCisgICAgICAgIC8vIGNoYXJhY3RlciBhdCB0aGUgbG93ZXIgbGV2ZWwuCisgICAgICAgIC8vIDQpIElmIHRoZSBhY3RpdmUgcG9zaXRpb24gaXMgb24gdGhlIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIGNoYXJhY3RlciwKKyAgICAgICAgLy8gdGhlIG5ldyBjYXJldCBwb3NpdGlvbiBpcyB0aGUgZm9sbG93aW5nIGxvZ2ljYWwgY2hhcmFjdGVyLCBlbHNlIGl0CisgICAgICAgIC8vIGlzIHRoZSBjaGFyYWN0ZXIuCisKKyAgICAgICAgaW50IGxpbmVTdGFydCA9IDA7CisgICAgICAgIGludCBsaW5lRW5kID0gbUxlbjsKKyAgICAgICAgYm9vbGVhbiBwYXJhSXNSdGwgPSBtRGlyID09IC0xOworICAgICAgICBpbnRbXSBydW5zID0gbURpcmVjdGlvbnMubURpcmVjdGlvbnM7CisKKyAgICAgICAgaW50IHJ1bkluZGV4LCBydW5MZXZlbCA9IDAsIHJ1blN0YXJ0ID0gbGluZVN0YXJ0LCBydW5MaW1pdCA9IGxpbmVFbmQsIG5ld0NhcmV0ID0gLTE7CisgICAgICAgIGJvb2xlYW4gdHJhaWxpbmcgPSBmYWxzZTsKKworICAgICAgICBpZiAoY3Vyc29yID09IGxpbmVTdGFydCkgeworICAgICAgICAgICAgcnVuSW5kZXggPSAtMjsKKyAgICAgICAgfSBlbHNlIGlmIChjdXJzb3IgPT0gbGluZUVuZCkgeworICAgICAgICAgICAgcnVuSW5kZXggPSBydW5zLmxlbmd0aDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvLyBGaXJzdCwgZ2V0IGluZm9ybWF0aW9uIGFib3V0IHRoZSBydW4gY29udGFpbmluZyB0aGUgY2hhcmFjdGVyIHdpdGgKKyAgICAgICAgICAvLyB0aGUgYWN0aXZlIGNhcmV0LgorICAgICAgICAgIGZvciAocnVuSW5kZXggPSAwOyBydW5JbmRleCA8IHJ1bnMubGVuZ3RoOyBydW5JbmRleCArPSAyKSB7CisgICAgICAgICAgICBydW5TdGFydCA9IGxpbmVTdGFydCArIHJ1bnNbcnVuSW5kZXhdOworICAgICAgICAgICAgaWYgKGN1cnNvciA+PSBydW5TdGFydCkgeworICAgICAgICAgICAgICBydW5MaW1pdCA9IHJ1blN0YXJ0ICsgKHJ1bnNbcnVuSW5kZXgrMV0gJiBMYXlvdXQuUlVOX0xFTkdUSF9NQVNLKTsKKyAgICAgICAgICAgICAgaWYgKHJ1bkxpbWl0ID4gbGluZUVuZCkgeworICAgICAgICAgICAgICAgICAgcnVuTGltaXQgPSBsaW5lRW5kOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGlmIChjdXJzb3IgPCBydW5MaW1pdCkgeworICAgICAgICAgICAgICAgIHJ1bkxldmVsID0gKHJ1bnNbcnVuSW5kZXgrMV0gPj4+IExheW91dC5SVU5fTEVWRUxfU0hJRlQpICYKKyAgICAgICAgICAgICAgICAgICAgTGF5b3V0LlJVTl9MRVZFTF9NQVNLOworICAgICAgICAgICAgICAgIGlmIChjdXJzb3IgPT0gcnVuU3RhcnQpIHsKKyAgICAgICAgICAgICAgICAgIC8vIFRoZSBjYXJldCBpcyBvbiBhIHJ1biBib3VuZGFyeSwgc2VlIGlmIHdlIHNob3VsZAorICAgICAgICAgICAgICAgICAgLy8gdXNlIHRoZSBwb3NpdGlvbiBvbiB0aGUgdHJhaWxpbmcgZWRnZSBvZiB0aGUgcHJldmlvdXMKKyAgICAgICAgICAgICAgICAgIC8vIGxvZ2ljYWwgY2hhcmFjdGVyIGluc3RlYWQuCisgICAgICAgICAgICAgICAgICBpbnQgcHJldlJ1bkluZGV4LCBwcmV2UnVuTGV2ZWwsIHByZXZSdW5TdGFydCwgcHJldlJ1bkxpbWl0OworICAgICAgICAgICAgICAgICAgaW50IHBvcyA9IGN1cnNvciAtIDE7CisgICAgICAgICAgICAgICAgICBmb3IgKHByZXZSdW5JbmRleCA9IDA7IHByZXZSdW5JbmRleCA8IHJ1bnMubGVuZ3RoOyBwcmV2UnVuSW5kZXggKz0gMikgeworICAgICAgICAgICAgICAgICAgICBwcmV2UnVuU3RhcnQgPSBsaW5lU3RhcnQgKyBydW5zW3ByZXZSdW5JbmRleF07CisgICAgICAgICAgICAgICAgICAgIGlmIChwb3MgPj0gcHJldlJ1blN0YXJ0KSB7CisgICAgICAgICAgICAgICAgICAgICAgcHJldlJ1bkxpbWl0ID0gcHJldlJ1blN0YXJ0ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKHJ1bnNbcHJldlJ1bkluZGV4KzFdICYgTGF5b3V0LlJVTl9MRU5HVEhfTUFTSyk7CisgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZXZSdW5MaW1pdCA+IGxpbmVFbmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldlJ1bkxpbWl0ID0gbGluZUVuZDsKKyAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgaWYgKHBvcyA8IHByZXZSdW5MaW1pdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJldlJ1bkxldmVsID0gKHJ1bnNbcHJldlJ1bkluZGV4KzFdID4+PiBMYXlvdXQuUlVOX0xFVkVMX1NISUZUKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYgTGF5b3V0LlJVTl9MRVZFTF9NQVNLOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZXZSdW5MZXZlbCA8IHJ1bkxldmVsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN0YXJ0IGZyb20gbG9naWNhbGx5IHByZXZpb3VzIGNoYXJhY3Rlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSW5kZXggPSBwcmV2UnVuSW5kZXg7CisgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bkxldmVsID0gcHJldlJ1bkxldmVsOworICAgICAgICAgICAgICAgICAgICAgICAgICBydW5TdGFydCA9IHByZXZSdW5TdGFydDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuTGltaXQgPSBwcmV2UnVuTGltaXQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWlsaW5nID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgLy8gY2FyZXQgbWlnaHQgYmUgPT0gbGluZUVuZC4gIFRoaXMgaXMgZ2VuZXJhbGx5IGEgc3BhY2Ugb3IgcGFyYWdyYXBoCisgICAgICAgICAgLy8gc2VwYXJhdG9yIGFuZCBoYXMgYW4gYXNzb2NpYXRlZCBydW4sIGJ1dCBtaWdodCBiZSB0aGUgZW5kIG9mCisgICAgICAgICAgLy8gdGV4dCwgaW4gd2hpY2ggY2FzZSBpdCBkb2Vzbid0LiAgSWYgdGhhdCBoYXBwZW5zLCB3ZSByYW4gb2ZmIHRoZQorICAgICAgICAgIC8vIGVuZCBvZiB0aGUgcnVuIGxpc3QsIGFuZCBydW5JbmRleCA9PSBydW5zLmxlbmd0aC4gIEluIHRoaXMgY2FzZSwKKyAgICAgICAgICAvLyB3ZSBhcmUgYXQgYSBydW4gYm91bmRhcnkgc28gd2Ugc2tpcCB0aGUgYmVsb3cgdGVzdC4KKyAgICAgICAgICBpZiAocnVuSW5kZXggIT0gcnVucy5sZW5ndGgpIHsKKyAgICAgICAgICAgICAgYm9vbGVhbiBydW5Jc1J0bCA9IChydW5MZXZlbCAmIDB4MSkgIT0gMDsKKyAgICAgICAgICAgICAgYm9vbGVhbiBhZHZhbmNlID0gdG9MZWZ0ID09IHJ1bklzUnRsOworICAgICAgICAgICAgICBpZiAoY3Vyc29yICE9IChhZHZhbmNlID8gcnVuTGltaXQgOiBydW5TdGFydCkgfHwgYWR2YW5jZSAhPSB0cmFpbGluZykgeworICAgICAgICAgICAgICAgICAgLy8gTW92aW5nIHdpdGhpbiBvciBpbnRvIHRoZSBydW4sIHNvIHdlIGNhbiBtb3ZlIGxvZ2ljYWxseS4KKyAgICAgICAgICAgICAgICAgIG5ld0NhcmV0ID0gZ2V0T2Zmc2V0QmVmb3JlQWZ0ZXIocnVuSW5kZXgsIHJ1blN0YXJ0LCBydW5MaW1pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSXNSdGwsIGN1cnNvciwgYWR2YW5jZSk7CisgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgbmV3IHBvc2l0aW9uIGlzIGludGVybmFsIHRvIHRoZSBydW4sIHdlJ3JlIGF0IHRoZSBzdHJvbmcKKyAgICAgICAgICAgICAgICAgIC8vIHBvc2l0aW9uIGFscmVhZHkgc28gd2UncmUgZmluaXNoZWQuCisgICAgICAgICAgICAgICAgICBpZiAobmV3Q2FyZXQgIT0gKGFkdmFuY2UgPyBydW5MaW1pdCA6IHJ1blN0YXJ0KSkgeworICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXdDYXJldDsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIElmIG5ld0NhcmV0IGlzIC0xLCB3ZSdyZSBzdGFydGluZyBhdCBhIHJ1biBib3VuZGFyeSBhbmQgY3Jvc3NpbmcKKyAgICAgICAgLy8gaW50byBhbm90aGVyIHJ1bi4gT3RoZXJ3aXNlIHdlJ3ZlIGFycml2ZWQgYXQgYSBydW4gYm91bmRhcnksIGFuZAorICAgICAgICAvLyBuZWVkIHRvIGZpZ3VyZSBvdXQgd2hpY2ggY2hhcmFjdGVyIHRvIGF0dGFjaCB0by4gIE5vdGUgd2UgbWlnaHQKKyAgICAgICAgLy8gbmVlZCB0byBydW4gdGhpcyB0d2ljZSwgaWYgd2UgY3Jvc3MgYSBydW4gYm91bmRhcnkgYW5kIGVuZCB1cCBhdAorICAgICAgICAvLyBhbm90aGVyIHJ1biBib3VuZGFyeS4KKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICBib29sZWFuIGFkdmFuY2UgPSB0b0xlZnQgPT0gcGFyYUlzUnRsOworICAgICAgICAgIGludCBvdGhlclJ1bkluZGV4ID0gcnVuSW5kZXggKyAoYWR2YW5jZSA/IDIgOiAtMik7CisgICAgICAgICAgaWYgKG90aGVyUnVuSW5kZXggPj0gMCAmJiBvdGhlclJ1bkluZGV4IDwgcnVucy5sZW5ndGgpIHsKKyAgICAgICAgICAgIGludCBvdGhlclJ1blN0YXJ0ID0gbGluZVN0YXJ0ICsgcnVuc1tvdGhlclJ1bkluZGV4XTsKKyAgICAgICAgICAgIGludCBvdGhlclJ1bkxpbWl0ID0gb3RoZXJSdW5TdGFydCArCisgICAgICAgICAgICAocnVuc1tvdGhlclJ1bkluZGV4KzFdICYgTGF5b3V0LlJVTl9MRU5HVEhfTUFTSyk7CisgICAgICAgICAgICBpZiAob3RoZXJSdW5MaW1pdCA+IGxpbmVFbmQpIHsKKyAgICAgICAgICAgICAgICBvdGhlclJ1bkxpbWl0ID0gbGluZUVuZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludCBvdGhlclJ1bkxldmVsID0gKHJ1bnNbb3RoZXJSdW5JbmRleCsxXSA+Pj4gTGF5b3V0LlJVTl9MRVZFTF9TSElGVCkgJgorICAgICAgICAgICAgICAgIExheW91dC5SVU5fTEVWRUxfTUFTSzsKKyAgICAgICAgICAgIGJvb2xlYW4gb3RoZXJSdW5Jc1J0bCA9IChvdGhlclJ1bkxldmVsICYgMSkgIT0gMDsKKworICAgICAgICAgICAgYWR2YW5jZSA9IHRvTGVmdCA9PSBvdGhlclJ1bklzUnRsOworICAgICAgICAgICAgaWYgKG5ld0NhcmV0ID09IC0xKSB7CisgICAgICAgICAgICAgICAgbmV3Q2FyZXQgPSBnZXRPZmZzZXRCZWZvcmVBZnRlcihvdGhlclJ1bkluZGV4LCBvdGhlclJ1blN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXJSdW5MaW1pdCwgb3RoZXJSdW5Jc1J0bCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkdmFuY2UgPyBvdGhlclJ1blN0YXJ0IDogb3RoZXJSdW5MaW1pdCwgYWR2YW5jZSk7CisgICAgICAgICAgICAgICAgaWYgKG5ld0NhcmV0ID09IChhZHZhbmNlID8gb3RoZXJSdW5MaW1pdCA6IG90aGVyUnVuU3RhcnQpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIENyb3NzZWQgYW5kIGVuZGVkIHVwIGF0IGEgbmV3IGJvdW5kYXJ5LAorICAgICAgICAgICAgICAgICAgICAvLyByZXBlYXQgYSBzZWNvbmQgYW5kIGZpbmFsIHRpbWUuCisgICAgICAgICAgICAgICAgICAgIHJ1bkluZGV4ID0gb3RoZXJSdW5JbmRleDsKKyAgICAgICAgICAgICAgICAgICAgcnVuTGV2ZWwgPSBvdGhlclJ1bkxldmVsOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFRoZSBuZXcgY2FyZXQgaXMgYXQgYSBib3VuZGFyeS4KKyAgICAgICAgICAgIGlmIChvdGhlclJ1bkxldmVsIDwgcnVuTGV2ZWwpIHsKKyAgICAgICAgICAgICAgLy8gVGhlIHN0cm9uZyBjaGFyYWN0ZXIgaXMgaW4gdGhlIG90aGVyIHJ1bi4KKyAgICAgICAgICAgICAgbmV3Q2FyZXQgPSBhZHZhbmNlID8gb3RoZXJSdW5TdGFydCA6IG90aGVyUnVuTGltaXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAobmV3Q2FyZXQgPT0gLTEpIHsKKyAgICAgICAgICAgICAgLy8gV2UncmUgd2Fsa2luZyBvZmYgdGhlIGVuZCBvZiB0aGUgbGluZS4gIFRoZSBwYXJhZ3JhcGgKKyAgICAgICAgICAgICAgLy8gbGV2ZWwgaXMgYWx3YXlzIGVxdWFsIHRvIG9yIGxvd2VyIHRoYW4gYW55IGludGVybmFsIGxldmVsLCBzbworICAgICAgICAgICAgICAvLyB0aGUgYm91bmRhcmllcyBnZXQgdGhlIHN0cm9uZyBjYXJldC4KKyAgICAgICAgICAgICAgbmV3Q2FyZXQgPSBhZHZhbmNlID8gbUxlbiArIDEgOiAtMTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorCisgICAgICAgICAgLy8gRWxzZSB3ZSd2ZSBhcnJpdmVkIGF0IHRoZSBlbmQgb2YgdGhlIGxpbmUuICBUaGF0J3MgYSBzdHJvbmcgcG9zaXRpb24uCisgICAgICAgICAgLy8gV2UgbWlnaHQgaGF2ZSBhcnJpdmVkIGhlcmUgYnkgY3Jvc3Npbmcgb3ZlciBhIHJ1biB3aXRoIG5vIGludGVybmFsCisgICAgICAgICAgLy8gYnJlYWtzIGFuZCBkcm9wcGluZyBvdXQgb2YgdGhlIGFib3ZlIGxvb3AgYmVmb3JlIGFkdmFuY2luZyBvbmUgZmluYWwKKyAgICAgICAgICAvLyB0aW1lLCBzbyByZXNldCB0aGUgY2FyZXQuCisgICAgICAgICAgLy8gTm90ZSwgd2UgdXNlICc8PScgYmVsb3cgdG8gaGFuZGxlIGEgc2l0dWF0aW9uIHdoZXJlIHRoZSBvbmx5IHJ1bgorICAgICAgICAgIC8vIG9uIHRoZSBsaW5lIGlzIGEgY291bnRlci1kaXJlY3Rpb25hbCBydW4uICBJZiB3ZSdyZSBub3QgYWR2YW5jaW5nLAorICAgICAgICAgIC8vIHdlIGNhbiBlbmQgdXAgYXQgdGhlICdsaW5lRW5kJyBwb3NpdGlvbiBidXQgdGhlIGNhcmV0IHdlIHdhbnQgaXMgYXQKKyAgICAgICAgICAvLyB0aGUgbGluZVN0YXJ0LgorICAgICAgICAgIGlmIChuZXdDYXJldCA8PSBsaW5lRW5kKSB7CisgICAgICAgICAgICAgIG5ld0NhcmV0ID0gYWR2YW5jZSA/IGxpbmVFbmQgOiBsaW5lU3RhcnQ7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG5ld0NhcmV0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG5leHQgdmFsaWQgb2Zmc2V0IHdpdGhpbiB0aGlzIGRpcmVjdGlvbmFsIHJ1biwgc2tpcHBpbmcKKyAgICAgKiBjb25qdW5jdHMgYW5kIHplcm8td2lkdGggY2hhcmFjdGVycy4gIFRoaXMgc2hvdWxkIG5vdCBiZSBjYWxsZWQgdG8gd2FsaworICAgICAqIG9mZiB0aGUgZW5kIG9mIHRoZSBsaW5lLCBzaW5jZSB0aGUgcmV0dXJuZWQgdmFsdWVzIG1pZ2h0IG5vdCBiZSB2YWxpZAorICAgICAqIG9uIG5laWdoYm9yaW5nIGxpbmVzLiAgSWYgdGhlIHJldHVybmVkIG9mZnNldCBpcyBsZXNzIHRoYW4gemVybyBvcgorICAgICAqIGdyZWF0ZXIgdGhhbiB0aGUgbGluZSBsZW5ndGgsIHRoZSBvZmZzZXQgc2hvdWxkIGJlIHJlY29tcHV0ZWQgb24gdGhlCisgICAgICogcHJlY2VkaW5nIG9yIGZvbGxvd2luZyBsaW5lLCByZXNwZWN0aXZlbHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcnVuSW5kZXggdGhlIHJ1biBpbmRleAorICAgICAqIEBwYXJhbSBydW5TdGFydCB0aGUgc3RhcnQgb2YgdGhlIHJ1bgorICAgICAqIEBwYXJhbSBydW5MaW1pdCB0aGUgbGltaXQgb2YgdGhlIHJ1bgorICAgICAqIEBwYXJhbSBydW5Jc1J0bCB0cnVlIGlmIHRoZSBydW4gaXMgcmlnaHQtdG8tbGVmdAorICAgICAqIEBwYXJhbSBvZmZzZXQgdGhlIG9mZnNldAorICAgICAqIEBwYXJhbSBhZnRlciB0cnVlIGlmIHRoZSBuZXcgb2Zmc2V0IHNob3VsZCBsb2dpY2FsbHkgZm9sbG93IHRoZSBwcm92aWRlZAorICAgICAqIG9mZnNldAorICAgICAqIEByZXR1cm4gdGhlIG5ldyBvZmZzZXQKKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBnZXRPZmZzZXRCZWZvcmVBZnRlcihpbnQgcnVuSW5kZXgsIGludCBydW5TdGFydCwgaW50IHJ1bkxpbWl0LAorICAgICAgICAgICAgYm9vbGVhbiBydW5Jc1J0bCwgaW50IG9mZnNldCwgYm9vbGVhbiBhZnRlcikgeworCisgICAgICAgIGlmIChydW5JbmRleCA8IDAgfHwgb2Zmc2V0ID09IChhZnRlciA/IG1MZW4gOiAwKSkgeworICAgICAgICAgICAgLy8gV2Fsa2luZyBvZmYgZW5kIG9mIGxpbmUuICBTaW5jZSB3ZSBkb24ndCBrbm93CisgICAgICAgICAgICAvLyB3aGF0IGN1cnNvciBwb3NpdGlvbnMgYXJlIGF2YWlsYWJsZSBvbiBvdGhlciBsaW5lcywgd2UgY2FuJ3QKKyAgICAgICAgICAgIC8vIHJldHVybiBhY2N1cmF0ZSB2YWx1ZXMuICBUaGVzZSBhcmUgYSBndWVzcy4KKyAgICAgICAgICAgIGlmIChhZnRlcikgeworICAgICAgICAgICAgICAgIHJldHVybiBUZXh0VXRpbHMuZ2V0T2Zmc2V0QWZ0ZXIobVRleHQsIG9mZnNldCArIG1TdGFydCkgLSBtU3RhcnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gVGV4dFV0aWxzLmdldE9mZnNldEJlZm9yZShtVGV4dCwgb2Zmc2V0ICsgbVN0YXJ0KSAtIG1TdGFydDsKKyAgICAgICAgfQorCisgICAgICAgIFRleHRQYWludCB3cCA9IG1Xb3JrUGFpbnQ7CisgICAgICAgIHdwLnNldChtUGFpbnQpOworCisgICAgICAgIGludCBzcGFuU3RhcnQgPSBydW5TdGFydDsKKyAgICAgICAgaW50IHNwYW5MaW1pdDsKKyAgICAgICAgaWYgKG1TcGFubmVkID09IG51bGwpIHsKKyAgICAgICAgICAgIHNwYW5MaW1pdCA9IHJ1bkxpbWl0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW50IHRhcmdldCA9IGFmdGVyID8gb2Zmc2V0ICsgMSA6IG9mZnNldDsKKyAgICAgICAgICAgIGludCBsaW1pdCA9IG1TdGFydCArIHJ1bkxpbWl0OworICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgICAgICBzcGFuTGltaXQgPSBtU3Bhbm5lZC5uZXh0U3BhblRyYW5zaXRpb24obVN0YXJ0ICsgc3BhblN0YXJ0LCBsaW1pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIE1ldHJpY0FmZmVjdGluZ1NwYW4uY2xhc3MpIC0gbVN0YXJ0OworICAgICAgICAgICAgICAgIGlmIChzcGFuTGltaXQgPj0gdGFyZ2V0KSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzcGFuU3RhcnQgPSBzcGFuTGltaXQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIE1ldHJpY0FmZmVjdGluZ1NwYW5bXSBzcGFucyA9IG1TcGFubmVkLmdldFNwYW5zKG1TdGFydCArIHNwYW5TdGFydCwKKyAgICAgICAgICAgICAgICAgICAgbVN0YXJ0ICsgc3BhbkxpbWl0LCBNZXRyaWNBZmZlY3RpbmdTcGFuLmNsYXNzKTsKKworICAgICAgICAgICAgaWYgKHNwYW5zLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgICAgICBSZXBsYWNlbWVudFNwYW4gcmVwbGFjZW1lbnQgPSBudWxsOworICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgc3BhbnMubGVuZ3RoOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgTWV0cmljQWZmZWN0aW5nU3BhbiBzcGFuID0gc3BhbnNbal07CisgICAgICAgICAgICAgICAgICAgIGlmIChzcGFuIGluc3RhbmNlb2YgUmVwbGFjZW1lbnRTcGFuKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlbWVudCA9IChSZXBsYWNlbWVudFNwYW4pc3BhbjsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwYW4udXBkYXRlTWVhc3VyZVN0YXRlKHdwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChyZXBsYWNlbWVudCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgYSByZXBsYWNlbWVudCBzcGFuLCB3ZSdyZSBtb3ZpbmcgZWl0aGVyIHRvCisgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzdGFydCBvciBlbmQgb2YgdGhpcyBzcGFuLgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWZ0ZXIgPyBzcGFuTGltaXQgOiBzcGFuU3RhcnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaW50IGZsYWdzID0gcnVuSXNSdGwgPyBQYWludC5ESVJFQ1RJT05fUlRMIDogUGFpbnQuRElSRUNUSU9OX0xUUjsKKyAgICAgICAgaW50IGN1cnNvck9wdCA9IGFmdGVyID8gUGFpbnQuQ1VSU09SX0FGVEVSIDogUGFpbnQuQ1VSU09SX0JFRk9SRTsKKyAgICAgICAgaWYgKG1DaGFyc1ZhbGlkKSB7CisgICAgICAgICAgICByZXR1cm4gd3AuZ2V0VGV4dFJ1bkN1cnNvcihtQ2hhcnMsIHNwYW5TdGFydCwgc3BhbkxpbWl0IC0gc3BhblN0YXJ0LAorICAgICAgICAgICAgICAgICAgICBmbGFncywgb2Zmc2V0LCBjdXJzb3JPcHQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIHdwLmdldFRleHRSdW5DdXJzb3IobVRleHQsIG1TdGFydCArIHNwYW5TdGFydCwKKyAgICAgICAgICAgICAgICAgICAgbVN0YXJ0ICsgc3BhbkxpbWl0LCBmbGFncywgbVN0YXJ0ICsgb2Zmc2V0LCBjdXJzb3JPcHQpIC0gbVN0YXJ0OworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVXRpbGl0eSBmdW5jdGlvbiBmb3IgbWVhc3VyaW5nIGFuZCByZW5kZXJpbmcgdGV4dC4gIFRoZSB0ZXh0IG11c3QKKyAgICAgKiBub3QgaW5jbHVkZSBhIHRhYiBvciBlbW9qaS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB3cCB0aGUgd29ya2luZyBwYWludAorICAgICAqIEBwYXJhbSBzdGFydCB0aGUgc3RhcnQgb2YgdGhlIHRleHQKKyAgICAgKiBAcGFyYW0gZW5kIHRoZSBlbmQgb2YgdGhlIHRleHQKKyAgICAgKiBAcGFyYW0gcnVuSXNSdGwgdHJ1ZSBpZiB0aGUgcnVuIGlzIHJpZ2h0LXRvLWxlZnQKKyAgICAgKiBAcGFyYW0gYyB0aGUgY2FudmFzLCBjYW4gYmUgbnVsbCBpZiByZW5kZXJpbmcgaXMgbm90IG5lZWRlZAorICAgICAqIEBwYXJhbSB4IHRoZSBlZGdlIG9mIHRoZSBydW4gY2xvc2VzdCB0byB0aGUgbGVhZGluZyBtYXJnaW4KKyAgICAgKiBAcGFyYW0gdG9wIHRoZSB0b3Agb2YgdGhlIGxpbmUKKyAgICAgKiBAcGFyYW0geSB0aGUgYmFzZWxpbmUKKyAgICAgKiBAcGFyYW0gYm90dG9tIHRoZSBib3R0b20gb2YgdGhlIGxpbmUKKyAgICAgKiBAcGFyYW0gZm1pIHJlY2VpdmVzIG1ldHJpY3MgaW5mb3JtYXRpb24sIGNhbiBiZSBudWxsCisgICAgICogQHBhcmFtIG5lZWRXaWR0aCB0cnVlIGlmIHRoZSB3aWR0aCBvZiB0aGUgcnVuIGlzIG5lZWRlZAorICAgICAqIEByZXR1cm4gdGhlIHNpZ25lZCB3aWR0aCBvZiB0aGUgcnVuIGJhc2VkIG9uIHRoZSBydW4gZGlyZWN0aW9uOyBvbmx5CisgICAgICogdmFsaWQgaWYgbmVlZFdpZHRoIGlzIHRydWUKKyAgICAgKi8KKyAgICBwcml2YXRlIGZsb2F0IGhhbmRsZVRleHQoVGV4dFBhaW50IHdwLCBpbnQgc3RhcnQsIGludCBlbmQsCisgICAgICAgICAgICBpbnQgY29udGV4dFN0YXJ0LCBpbnQgY29udGV4dEVuZCwgYm9vbGVhbiBydW5Jc1J0bCwKKyAgICAgICAgICAgIENhbnZhcyBjLCBmbG9hdCB4LCBpbnQgdG9wLCBpbnQgeSwgaW50IGJvdHRvbSwKKyAgICAgICAgICAgIEZvbnRNZXRyaWNzSW50IGZtaSwgYm9vbGVhbiBuZWVkV2lkdGgpIHsKKworICAgICAgICBmbG9hdCByZXQgPSAwOworCisgICAgICAgIGludCBydW5MZW4gPSBlbmQgLSBzdGFydDsKKyAgICAgICAgaW50IGNvbnRleHRMZW4gPSBjb250ZXh0RW5kIC0gY29udGV4dFN0YXJ0OworICAgICAgICBpZiAobmVlZFdpZHRoIHx8IChjICE9IG51bGwgJiYgKHdwLmJnQ29sb3IgIT0gMCB8fCBydW5Jc1J0bCkpKSB7CisgICAgICAgICAgICBpbnQgZmxhZ3MgPSBydW5Jc1J0bCA/IFBhaW50LkRJUkVDVElPTl9SVEwgOiBQYWludC5ESVJFQ1RJT05fTFRSOworICAgICAgICAgICAgaWYgKG1DaGFyc1ZhbGlkKSB7CisgICAgICAgICAgICAgICAgcmV0ID0gd3AuZ2V0VGV4dFJ1bkFkdmFuY2VzKG1DaGFycywgc3RhcnQsIHJ1bkxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHRTdGFydCwgY29udGV4dExlbiwgZmxhZ3MsIG51bGwsIDApOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbnQgZGVsdGEgPSBtU3RhcnQ7CisgICAgICAgICAgICAgICAgcmV0ID0gd3AuZ2V0VGV4dFJ1bkFkdmFuY2VzKG1UZXh0LCBkZWx0YSArIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGEgKyBlbmQsIGRlbHRhICsgY29udGV4dFN0YXJ0LCBkZWx0YSArIGNvbnRleHRFbmQsCisgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywgbnVsbCwgMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoZm1pICE9IG51bGwpIHsKKyAgICAgICAgICAgIHdwLmdldEZvbnRNZXRyaWNzSW50KGZtaSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoYyAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAocnVuSXNSdGwpIHsKKyAgICAgICAgICAgICAgICB4IC09IHJldDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHdwLmJnQ29sb3IgIT0gMCkgeworICAgICAgICAgICAgICAgIGludCBjb2xvciA9IHdwLmdldENvbG9yKCk7CisgICAgICAgICAgICAgICAgUGFpbnQuU3R5bGUgcyA9IHdwLmdldFN0eWxlKCk7CisgICAgICAgICAgICAgICAgd3Auc2V0Q29sb3Iod3AuYmdDb2xvcik7CisgICAgICAgICAgICAgICAgd3Auc2V0U3R5bGUoUGFpbnQuU3R5bGUuRklMTCk7CisKKyAgICAgICAgICAgICAgICBjLmRyYXdSZWN0KHgsIHRvcCwgeCArIHJldCwgYm90dG9tLCB3cCk7CisKKyAgICAgICAgICAgICAgICB3cC5zZXRTdHlsZShzKTsKKyAgICAgICAgICAgICAgICB3cC5zZXRDb2xvcihjb2xvcik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRyYXdUZXh0UnVuKGMsIHdwLCBzdGFydCwgZW5kLCBjb250ZXh0U3RhcnQsIGNvbnRleHRFbmQsIHJ1bklzUnRsLAorICAgICAgICAgICAgICAgICAgICB4LCB5ICsgd3AuYmFzZWxpbmVTaGlmdCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcnVuSXNSdGwgPyAtcmV0IDogcmV0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFV0aWxpdHkgZnVuY3Rpb24gZm9yIG1lYXN1cmluZyBhbmQgcmVuZGVyaW5nIGEgcmVwbGFjZW1lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVwbGFjZW1lbnQgdGhlIHJlcGxhY2VtZW50CisgICAgICogQHBhcmFtIHdwIHRoZSB3b3JrIHBhaW50CisgICAgICogQHBhcmFtIHJ1bkluZGV4IHRoZSBydW4gaW5kZXgKKyAgICAgKiBAcGFyYW0gc3RhcnQgdGhlIHN0YXJ0IG9mIHRoZSBydW4KKyAgICAgKiBAcGFyYW0gbGltaXQgdGhlIGxpbWl0IG9mIHRoZSBydW4KKyAgICAgKiBAcGFyYW0gcnVuSXNSdGwgdHJ1ZSBpZiB0aGUgcnVuIGlzIHJpZ2h0LXRvLWxlZnQKKyAgICAgKiBAcGFyYW0gYyB0aGUgY2FudmFzLCBjYW4gYmUgbnVsbCBpZiBub3QgcmVuZGVyaW5nCisgICAgICogQHBhcmFtIHggdGhlIGVkZ2Ugb2YgdGhlIHJlcGxhY2VtZW50IGNsb3Nlc3QgdG8gdGhlIGxlYWRpbmcgbWFyZ2luCisgICAgICogQHBhcmFtIHRvcCB0aGUgdG9wIG9mIHRoZSBsaW5lCisgICAgICogQHBhcmFtIHkgdGhlIGJhc2VsaW5lCisgICAgICogQHBhcmFtIGJvdHRvbSB0aGUgYm90dG9tIG9mIHRoZSBsaW5lCisgICAgICogQHBhcmFtIGZtaSByZWNlaXZlcyBtZXRyaWNzIGluZm9ybWF0aW9uLCBjYW4gYmUgbnVsbAorICAgICAqIEBwYXJhbSBuZWVkV2lkdGggdHJ1ZSBpZiB0aGUgd2lkdGggb2YgdGhlIHJlcGxhY2VtZW50IGlzIG5lZWRlZAorICAgICAqIEByZXR1cm4gdGhlIHNpZ25lZCB3aWR0aCBvZiB0aGUgcnVuIGJhc2VkIG9uIHRoZSBydW4gZGlyZWN0aW9uOyBvbmx5CisgICAgICogdmFsaWQgaWYgbmVlZFdpZHRoIGlzIHRydWUKKyAgICAgKi8KKyAgICBwcml2YXRlIGZsb2F0IGhhbmRsZVJlcGxhY2VtZW50KFJlcGxhY2VtZW50U3BhbiByZXBsYWNlbWVudCwgVGV4dFBhaW50IHdwLAorICAgICAgICAgICAgaW50IHJ1bkluZGV4LCBpbnQgc3RhcnQsIGludCBsaW1pdCwgYm9vbGVhbiBydW5Jc1J0bCwgQ2FudmFzIGMsCisgICAgICAgICAgICBmbG9hdCB4LCBpbnQgdG9wLCBpbnQgeSwgaW50IGJvdHRvbSwgRm9udE1ldHJpY3NJbnQgZm1pLAorICAgICAgICAgICAgYm9vbGVhbiBuZWVkV2lkdGgpIHsKKworICAgICAgICBmbG9hdCByZXQgPSAwOworCisgICAgICAgIGludCB0ZXh0U3RhcnQgPSBtU3RhcnQgKyBzdGFydDsKKyAgICAgICAgaW50IHRleHRMaW1pdCA9IG1TdGFydCArIGxpbWl0OworCisgICAgICAgIGlmIChuZWVkV2lkdGggfHwgKGMgIT0gbnVsbCAmJiBydW5Jc1J0bCkpIHsKKyAgICAgICAgICAgIHJldCA9IHJlcGxhY2VtZW50LmdldFNpemUod3AsIG1UZXh0LCB0ZXh0U3RhcnQsIHRleHRMaW1pdCwgZm1pKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChydW5Jc1J0bCkgeworICAgICAgICAgICAgICAgIHggLT0gcmV0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVwbGFjZW1lbnQuZHJhdyhjLCBtVGV4dCwgdGV4dFN0YXJ0LCB0ZXh0TGltaXQsCisgICAgICAgICAgICAgICAgICAgIHgsIHRvcCwgeSwgYm90dG9tLCB3cCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcnVuSXNSdGwgPyAtcmV0IDogcmV0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFV0aWxpdHkgZnVuY3Rpb24gZm9yIGhhbmRsaW5nIGEgdW5pZGlyZWN0aW9uYWwgcnVuLiAgVGhlIHJ1biBtdXN0IG5vdAorICAgICAqIGNvbnRhaW4gdGFicyBvciBlbW9qaSBidXQgY2FuIGNvbnRhaW4gc3R5bGVzLgorICAgICAqCisgICAgICogQHBhcmFtIHJ1bkluZGV4IHRoZSBydW4gaW5kZXgKKyAgICAgKiBAcGFyYW0gc3RhcnQgdGhlIGxpbmUtcmVsYXRpdmUgc3RhcnQgb2YgdGhlIHJ1bgorICAgICAqIEBwYXJhbSBtZWFzdXJlTGltaXQgdGhlIG9mZnNldCB0byBtZWFzdXJlIHRvLCBiZXR3ZWVuIHN0YXJ0IGFuZCBsaW1pdCBpbmNsdXNpdmUKKyAgICAgKiBAcGFyYW0gbGltaXQgdGhlIGxpbWl0IG9mIHRoZSBydW4KKyAgICAgKiBAcGFyYW0gcnVuSXNSdGwgdHJ1ZSBpZiB0aGUgcnVuIGlzIHJpZ2h0LXRvLWxlZnQKKyAgICAgKiBAcGFyYW0gYyB0aGUgY2FudmFzLCBjYW4gYmUgbnVsbAorICAgICAqIEBwYXJhbSB4IHRoZSBlbmQgb2YgdGhlIHJ1biBjbG9zZXN0IHRvIHRoZSBsZWFkaW5nIG1hcmdpbgorICAgICAqIEBwYXJhbSB0b3AgdGhlIHRvcCBvZiB0aGUgbGluZQorICAgICAqIEBwYXJhbSB5IHRoZSBiYXNlbGluZQorICAgICAqIEBwYXJhbSBib3R0b20gdGhlIGJvdHRvbSBvZiB0aGUgbGluZQorICAgICAqIEBwYXJhbSBmbWkgcmVjZWl2ZXMgbWV0cmljcyBpbmZvcm1hdGlvbiwgY2FuIGJlIG51bGwKKyAgICAgKiBAcGFyYW0gbmVlZFdpZHRoIHRydWUgaWYgdGhlIHdpZHRoIGlzIHJlcXVpcmVkCisgICAgICogQHJldHVybiB0aGUgc2lnbmVkIHdpZHRoIG9mIHRoZSBydW4gYmFzZWQgb24gdGhlIHJ1biBkaXJlY3Rpb247IG9ubHkKKyAgICAgKiB2YWxpZCBpZiBuZWVkV2lkdGggaXMgdHJ1ZQorICAgICAqLworICAgIHByaXZhdGUgZmxvYXQgaGFuZGxlUnVuKGludCBydW5JbmRleCwgaW50IHN0YXJ0LCBpbnQgbWVhc3VyZUxpbWl0LAorICAgICAgICAgICAgaW50IGxpbWl0LCBib29sZWFuIHJ1bklzUnRsLCBDYW52YXMgYywgZmxvYXQgeCwgaW50IHRvcCwgaW50IHksCisgICAgICAgICAgICBpbnQgYm90dG9tLCBGb250TWV0cmljc0ludCBmbWksIGJvb2xlYW4gbmVlZFdpZHRoKSB7CisKKyAgICAgICAgLy8gU2hhcGluZyBuZWVkcyB0byB0YWtlIGludG8gYWNjb3VudCBjb250ZXh0IHVwIHRvIG1ldHJpYyBib3VuZGFyaWVzLAorICAgICAgICAvLyBidXQgcmVuZGVyaW5nIG5lZWRzIHRvIHRha2UgaW50byBhY2NvdW50IGNoYXJhY3RlciBzdHlsZSBib3VuZGFyaWVzLgorICAgICAgICAvLyBTbyB3ZSBpdGVyYXRlIHRocm91Z2ggbWV0cmljIHJ1bnMgdG8gZ2V0IG1ldHJpYyBib3VuZHMsCisgICAgICAgIC8vIHRoZW4gd2l0aGluIGVhY2ggbWV0cmljIHJ1biBpdGVyYXRlIHRocm91Z2ggY2hhcmFjdGVyIHN0eWxlIHJ1bnMKKyAgICAgICAgLy8gZm9yIHRoZSBydW4gYm91bmRzLgorICAgICAgICBmbG9hdCBveCA9IHg7CisgICAgICAgIGZvciAoaW50IGkgPSBzdGFydCwgaW5leHQ7IGkgPCBtZWFzdXJlTGltaXQ7IGkgPSBpbmV4dCkgeworICAgICAgICAgICAgVGV4dFBhaW50IHdwID0gbVdvcmtQYWludDsKKyAgICAgICAgICAgIHdwLnNldChtUGFpbnQpOworCisgICAgICAgICAgICBpbnQgbWxpbWl0OworICAgICAgICAgICAgaWYgKG1TcGFubmVkID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpbmV4dCA9IGxpbWl0OworICAgICAgICAgICAgICAgIG1saW1pdCA9IG1lYXN1cmVMaW1pdDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW5leHQgPSBtU3Bhbm5lZC5uZXh0U3BhblRyYW5zaXRpb24obVN0YXJ0ICsgaSwgbVN0YXJ0ICsgbGltaXQsCisgICAgICAgICAgICAgICAgICAgICAgICBNZXRyaWNBZmZlY3RpbmdTcGFuLmNsYXNzKSAtIG1TdGFydDsKKworICAgICAgICAgICAgICAgIG1saW1pdCA9IGluZXh0IDwgbWVhc3VyZUxpbWl0ID8gaW5leHQgOiBtZWFzdXJlTGltaXQ7CisgICAgICAgICAgICAgICAgTWV0cmljQWZmZWN0aW5nU3BhbltdIHNwYW5zID0gbVNwYW5uZWQuZ2V0U3BhbnMobVN0YXJ0ICsgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TdGFydCArIG1saW1pdCwgTWV0cmljQWZmZWN0aW5nU3Bhbi5jbGFzcyk7CisKKyAgICAgICAgICAgICAgICBpZiAoc3BhbnMubGVuZ3RoID4gMCkgeworICAgICAgICAgICAgICAgICAgICBSZXBsYWNlbWVudFNwYW4gcmVwbGFjZW1lbnQgPSBudWxsOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHNwYW5zLmxlbmd0aDsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBNZXRyaWNBZmZlY3RpbmdTcGFuIHNwYW4gPSBzcGFuc1tqXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzcGFuIGluc3RhbmNlb2YgUmVwbGFjZW1lbnRTcGFuKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZW1lbnQgPSAoUmVwbGFjZW1lbnRTcGFuKXNwYW47CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIG1pZ2h0IGhhdmUgYSByZXBsYWNlbWVudCB0aGF0IHVzZXMgdGhlIGRyYXcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGF0ZSwgb3RoZXJ3aXNlIG1lYXN1cmUgc3RhdGUgd291bGQgc3VmZmljZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFuLnVwZGF0ZURyYXdTdGF0ZSh3cCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAocmVwbGFjZW1lbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgeCArPSBoYW5kbGVSZXBsYWNlbWVudChyZXBsYWNlbWVudCwgd3AsIHJ1bkluZGV4LCBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbGltaXQsIHJ1bklzUnRsLCBjLCB4LCB0b3AsIHksIGJvdHRvbSwgZm1pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkV2lkdGggfHwgbWxpbWl0IDwgbWVhc3VyZUxpbWl0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobVNwYW5uZWQgPT0gbnVsbCB8fCBjID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB4ICs9IGhhbmRsZVRleHQod3AsIGksIG1saW1pdCwgaSwgaW5leHQsIHJ1bklzUnRsLCBjLCB4LCB0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICB5LCBib3R0b20sIGZtaSwgbmVlZFdpZHRoIHx8IG1saW1pdCA8IG1lYXN1cmVMaW1pdCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSBpLCBqbmV4dDsgaiA8IG1saW1pdDsgaiA9IGpuZXh0KSB7CisgICAgICAgICAgICAgICAgICAgIGpuZXh0ID0gbVNwYW5uZWQubmV4dFNwYW5UcmFuc2l0aW9uKG1TdGFydCArIGosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXJ0ICsgbWxpbWl0LCBDaGFyYWN0ZXJTdHlsZS5jbGFzcykgLSBtU3RhcnQ7CisKKyAgICAgICAgICAgICAgICAgICAgQ2hhcmFjdGVyU3R5bGVbXSBzcGFucyA9IG1TcGFubmVkLmdldFNwYW5zKG1TdGFydCArIGosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXJ0ICsgam5leHQsIENoYXJhY3RlclN0eWxlLmNsYXNzKTsKKworICAgICAgICAgICAgICAgICAgICB3cC5zZXQobVBhaW50KTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCBzcGFucy5sZW5ndGg7IGsrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgQ2hhcmFjdGVyU3R5bGUgc3BhbiA9IHNwYW5zW2tdOworICAgICAgICAgICAgICAgICAgICAgICAgc3Bhbi51cGRhdGVEcmF3U3RhdGUod3ApOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgeCArPSBoYW5kbGVUZXh0KHdwLCBqLCBqbmV4dCwgaSwgaW5leHQsIHJ1bklzUnRsLCBjLCB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcCwgeSwgYm90dG9tLCBmbWksIG5lZWRXaWR0aCB8fCBqbmV4dCA8IG1lYXN1cmVMaW1pdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHggLSBveDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW5kZXIgYSB0ZXh0IHJ1biB3aXRoIHRoZSBzZXQtdXAgcGFpbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYyB0aGUgY2FudmFzCisgICAgICogQHBhcmFtIHdwIHRoZSBwYWludCB1c2VkIHRvIHJlbmRlciB0aGUgdGV4dAorICAgICAqIEBwYXJhbSBzdGFydCB0aGUgc3RhcnQgb2YgdGhlIHJ1bgorICAgICAqIEBwYXJhbSBlbmQgdGhlIGVuZCBvZiB0aGUgcnVuCisgICAgICogQHBhcmFtIGNvbnRleHRTdGFydCB0aGUgc3RhcnQgb2YgY29udGV4dCBmb3IgdGhlIHJ1bgorICAgICAqIEBwYXJhbSBjb250ZXh0RW5kIHRoZSBlbmQgb2YgdGhlIGNvbnRleHQgZm9yIHRoZSBydW4KKyAgICAgKiBAcGFyYW0gcnVuSXNSdGwgdHJ1ZSBpZiB0aGUgcnVuIGlzIHJpZ2h0LXRvLWxlZnQKKyAgICAgKiBAcGFyYW0geCB0aGUgeCBwb3NpdGlvbiBvZiB0aGUgbGVmdCBlZGdlIG9mIHRoZSBydW4KKyAgICAgKiBAcGFyYW0geSB0aGUgYmFzZWxpbmUgb2YgdGhlIHJ1bgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBkcmF3VGV4dFJ1bihDYW52YXMgYywgVGV4dFBhaW50IHdwLCBpbnQgc3RhcnQsIGludCBlbmQsCisgICAgICAgICAgICBpbnQgY29udGV4dFN0YXJ0LCBpbnQgY29udGV4dEVuZCwgYm9vbGVhbiBydW5Jc1J0bCwgZmxvYXQgeCwgaW50IHkpIHsKKworICAgICAgICBpbnQgZmxhZ3MgPSBydW5Jc1J0bCA/IENhbnZhcy5ESVJFQ1RJT05fUlRMIDogQ2FudmFzLkRJUkVDVElPTl9MVFI7CisgICAgICAgIGlmIChtQ2hhcnNWYWxpZCkgeworICAgICAgICAgICAgaW50IGNvdW50ID0gZW5kIC0gc3RhcnQ7CisgICAgICAgICAgICBpbnQgY29udGV4dENvdW50ID0gY29udGV4dEVuZCAtIGNvbnRleHRTdGFydDsKKyAgICAgICAgICAgIGMuZHJhd1RleHRSdW4obUNoYXJzLCBzdGFydCwgY291bnQsIGNvbnRleHRTdGFydCwgY29udGV4dENvdW50LAorICAgICAgICAgICAgICAgICAgICB4LCB5LCBmbGFncywgd3ApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW50IGRlbHRhID0gbVN0YXJ0OworICAgICAgICAgICAgYy5kcmF3VGV4dFJ1bihtVGV4dCwgZGVsdGEgKyBzdGFydCwgZGVsdGEgKyBlbmQsCisgICAgICAgICAgICAgICAgICAgIGRlbHRhICsgY29udGV4dFN0YXJ0LCBkZWx0YSArIGNvbnRleHRFbmQsIHgsIHksIGZsYWdzLCB3cCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBhc2NlbnQgb2YgdGhlIHRleHQgYXQgc3RhcnQuICBUaGlzIGlzIHVzZWQgZm9yIHNjYWxpbmcKKyAgICAgKiBlbW9qaS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwb3MgdGhlIGxpbmUtcmVsYXRpdmUgcG9zaXRpb24KKyAgICAgKiBAcmV0dXJuIHRoZSBhc2NlbnQgb2YgdGhlIHRleHQgYXQgc3RhcnQKKyAgICAgKi8KKyAgICBmbG9hdCBhc2NlbnQoaW50IHBvcykgeworICAgICAgICBpZiAobVNwYW5uZWQgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG1QYWludC5hc2NlbnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHBvcyArPSBtU3RhcnQ7CisgICAgICAgIE1ldHJpY0FmZmVjdGluZ1NwYW5bXSBzcGFucyA9IG1TcGFubmVkLmdldFNwYW5zKHBvcywgcG9zICsgMSwKKyAgICAgICAgICAgICAgICBNZXRyaWNBZmZlY3RpbmdTcGFuLmNsYXNzKTsKKyAgICAgICAgaWYgKHNwYW5zLmxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gbVBhaW50LmFzY2VudCgpOworICAgICAgICB9CisKKyAgICAgICAgVGV4dFBhaW50IHdwID0gbVdvcmtQYWludDsKKyAgICAgICAgd3Auc2V0KG1QYWludCk7CisgICAgICAgIGZvciAoTWV0cmljQWZmZWN0aW5nU3BhbiBzcGFuIDogc3BhbnMpIHsKKyAgICAgICAgICAgIHNwYW4udXBkYXRlTWVhc3VyZVN0YXRlKHdwKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gd3AuYXNjZW50KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbmV4dCB0YWIgcG9zaXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gaCB0aGUgKHVuc2lnbmVkKSBvZmZzZXQgZnJvbSB0aGUgbGVhZGluZyBtYXJnaW4KKyAgICAgKiBAcmV0dXJuIHRoZSAodW5zaWduZWQpIHRhYiBwb3NpdGlvbiBhZnRlciB0aGlzIG9mZnNldAorICAgICAqLworICAgIGZsb2F0IG5leHRUYWIoZmxvYXQgaCkgeworICAgICAgICBpZiAobVRhYnMgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG1UYWJzLm5leHRUYWIoaCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFRhYlN0b3BzLm5leHREZWZhdWx0U3RvcChoLCBUQUJfSU5DUkVNRU5UKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVEFCX0lOQ1JFTUVOVCA9IDIwOworfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9UZXh0VXRpbHMuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvVGV4dFV0aWxzLmphdmEKaW5kZXggOTU4OWJmMy4uMmQ2YzdiNiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9UZXh0VXRpbHMuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L1RleHRVdGlscy5qYXZhCkBAIC0xNywxMiArMTcsMTEgQEAKIHBhY2thZ2UgYW5kcm9pZC50ZXh0OwogCiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuUjsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLkFycmF5VXRpbHM7CiAKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbG9yU3RhdGVMaXN0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOwogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsOwogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsYWJsZTsKLWltcG9ydCBhbmRyb2lkLnRleHQubWV0aG9kLlRleHRLZXlMaXN0ZW5lci5DYXBpdGFsaXplOwogaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5BYnNvbHV0ZVNpemVTcGFuOwogaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5BbGlnbm1lbnRTcGFuOwogaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5CYWNrZ3JvdW5kQ29sb3JTcGFuOwpAQCAtNDUsMTAgKzQ0LDggQEAKIGltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuVW5kZXJsaW5lU3BhbjsKIGltcG9ydCBhbmRyb2lkLnV0aWwuUHJpbnRlcjsKIAotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnV0aWwuQXJyYXlVdGlsczsKLQotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKIAogcHVibGljIGNsYXNzIFRleHRVdGlscyB7CiAgICAgcHJpdmF0ZSBUZXh0VXRpbHMoKSB7IC8qIGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQgKi8gfQpAQCAtOTgzLDcgKzk4MCw3IEBACiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgb3JpZ2luYWwgdGV4dCBpZiBpdCBmaXRzIGluIHRoZSBzcGVjaWZpZWQgd2lkdGgKICAgICAgKiBnaXZlbiB0aGUgcHJvcGVydGllcyBvZiB0aGUgc3BlY2lmaWVkIFBhaW50LAotICAgICAqIG9yLCBpZiBpdCBkb2VzIG5vdCBmaXQsIGEgY29weSB3aXRoIGVsbGlwc2lzIGNoYXJhY3RlciBhZGRlZCAKKyAgICAgKiBvciwgaWYgaXQgZG9lcyBub3QgZml0LCBhIGNvcHkgd2l0aCBlbGxpcHNpcyBjaGFyYWN0ZXIgYWRkZWQKICAgICAgKiBhdCB0aGUgc3BlY2lmaWVkIGVkZ2Ugb3IgY2VudGVyLgogICAgICAqIElmIDxjb2RlPnByZXNlcnZlTGVuZ3RoPC9jb2RlPiBpcyBzcGVjaWZpZWQsIHRoZSByZXR1cm5lZCBjb3B5CiAgICAgICogd2lsbCBiZSBwYWRkZWQgd2l0aCB6ZXJvLXdpZHRoIHNwYWNlcyB0byBwcmVzZXJ2ZSB0aGUgb3JpZ2luYWwKQEAgLTk5Miw3ICs5ODksNyBAQAogICAgICAqIHJlcG9ydCB0aGUgc3RhcnQgYW5kIGVuZCBvZiB0aGUgZWxsaXBzaXplZCByYW5nZS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIENoYXJTZXF1ZW5jZSBlbGxpcHNpemUoQ2hhclNlcXVlbmNlIHRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRQYWludCBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXh0UGFpbnQgcGFpbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGF2YWlsLCBUcnVuY2F0ZUF0IHdoZXJlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHByZXNlcnZlTGVuZ3RoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbGxpcHNpemVDYWxsYmFjayBjYWxsYmFjaykgewpAQCAtMTAwMywxMyArMTAwMCwxMiBAQAogCiAgICAgICAgIGludCBsZW4gPSB0ZXh0Lmxlbmd0aCgpOwogCi0gICAgICAgIC8vIFVzZSBQYWludC5icmVha1RleHQoKSBmb3IgdGhlIG5vbi1TcGFubmVkIGNhc2UgdG8gYXZvaWQgaGF2aW5nCi0gICAgICAgIC8vIHRvIGFsbG9jYXRlIG1lbW9yeSBhbmQgYWNjdW11bGF0ZSB0aGUgY2hhcmFjdGVyIHdpZHRocyBvdXJzZWx2ZXMuCisgICAgICAgIE1lYXN1cmVkVGV4dCBtdCA9IE1lYXN1cmVkVGV4dC5vYnRhaW4oKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZsb2F0IHdpZHRoID0gc2V0UGFyYShtdCwgcGFpbnQsIHRleHQsIDAsIHRleHQubGVuZ3RoKCksCisgICAgICAgICAgICAgICAgICAgIExheW91dC5ESVJfUkVRVUVTVF9ERUZBVUxUX0xUUik7CiAKLSAgICAgICAgaWYgKCEodGV4dCBpbnN0YW5jZW9mIFNwYW5uZWQpKSB7Ci0gICAgICAgICAgICBmbG9hdCB3aWQgPSBwLm1lYXN1cmVUZXh0KHRleHQsIDAsIGxlbik7Ci0KLSAgICAgICAgICAgIGlmICh3aWQgPD0gYXZhaWwpIHsKKyAgICAgICAgICAgIGlmICh3aWR0aCA8PSBhdmFpbCkgewogICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjayAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLmVsbGlwc2l6ZWQoMCwgMCk7CiAgICAgICAgICAgICAgICAgfQpAQCAtMTAxNywyNTAgKzEwMTMsNjkgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gdGV4dDsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgZmxvYXQgZWxsaXBzaXN3aWQgPSBwLm1lYXN1cmVUZXh0KHNFbGxpcHNpcyk7CisgICAgICAgICAgICAvLyBYWFggYXNzdW1lcyBlbGxpcHNpcyBzdHJpbmcgZG9lcyBub3QgcmVxdWlyZSBzaGFwaW5nIGFuZAorICAgICAgICAgICAgLy8gaXMgdW5hZmZlY3RlZCBieSBzdHlsZQorICAgICAgICAgICAgZmxvYXQgZWxsaXBzaXN3aWQgPSBwYWludC5tZWFzdXJlVGV4dChzRWxsaXBzaXMpOworICAgICAgICAgICAgYXZhaWwgLT0gZWxsaXBzaXN3aWQ7CiAKLSAgICAgICAgICAgIGlmIChlbGxpcHNpc3dpZCA+IGF2YWlsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suZWxsaXBzaXplZCgwLCBsZW4pOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChwcmVzZXJ2ZUxlbmd0aCkgewotICAgICAgICAgICAgICAgICAgICBjaGFyW10gYnVmID0gb2J0YWluKGxlbik7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZltpXSA9ICdcdUZFRkYnOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyByZXQgPSBuZXcgU3RyaW5nKGJ1ZiwgMCwgbGVuKTsKLSAgICAgICAgICAgICAgICAgICAgcmVjeWNsZShidWYpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAiIjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICh3aGVyZSA9PSBUcnVuY2F0ZUF0LlNUQVJUKSB7Ci0gICAgICAgICAgICAgICAgaW50IGZpdCA9IHAuYnJlYWtUZXh0KHRleHQsIDAsIGxlbiwgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2YWlsIC0gZWxsaXBzaXN3aWQsIG51bGwpOwotCi0gICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suZWxsaXBzaXplZCgwLCBsZW4gLSBmaXQpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChwcmVzZXJ2ZUxlbmd0aCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmxhbmsodGV4dCwgMCwgbGVuIC0gZml0KTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gc0VsbGlwc2lzICsgdGV4dC50b1N0cmluZygpLnN1YnN0cmluZyhsZW4gLSBmaXQsIGxlbik7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50IGxlZnQgPSAwOworICAgICAgICAgICAgaW50IHJpZ2h0ID0gbGVuOworICAgICAgICAgICAgaWYgKGF2YWlsIDwgMCkgeworICAgICAgICAgICAgICAgIC8vIGl0IGFsbCBnb2VzCisgICAgICAgICAgICB9IGVsc2UgaWYgKHdoZXJlID09IFRydW5jYXRlQXQuU1RBUlQpIHsKKyAgICAgICAgICAgICAgICByaWdodCA9IGxlbiAtIG10LmJyZWFrVGV4dCgwLCBsZW4sIGZhbHNlLCBhdmFpbCk7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKHdoZXJlID09IFRydW5jYXRlQXQuRU5EKSB7Ci0gICAgICAgICAgICAgICAgaW50IGZpdCA9IHAuYnJlYWtUZXh0KHRleHQsIDAsIGxlbiwgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZhaWwgLSBlbGxpcHNpc3dpZCwgbnVsbCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2sgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5lbGxpcHNpemVkKGZpdCwgbGVuKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlc2VydmVMZW5ndGgpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJsYW5rKHRleHQsIGZpdCwgbGVuKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGV4dC50b1N0cmluZygpLnN1YnN0cmluZygwLCBmaXQpICsgc0VsbGlwc2lzOwotICAgICAgICAgICAgICAgIH0gCi0gICAgICAgICAgICB9IGVsc2UgLyogd2hlcmUgPT0gVHJ1bmNhdGVBdC5NSURETEUgKi8gewotICAgICAgICAgICAgICAgIGludCByaWdodCA9IHAuYnJlYWtUZXh0KHRleHQsIDAsIGxlbiwgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGF2YWlsIC0gZWxsaXBzaXN3aWQpIC8gMiwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgZmxvYXQgdXNlZCA9IHAubWVhc3VyZVRleHQodGV4dCwgbGVuIC0gcmlnaHQsIGxlbik7Ci0gICAgICAgICAgICAgICAgaW50IGxlZnQgPSBwLmJyZWFrVGV4dCh0ZXh0LCAwLCBsZW4gLSByaWdodCwgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2YWlsIC0gZWxsaXBzaXN3aWQgLSB1c2VkLCBudWxsKTsKLQotICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLmVsbGlwc2l6ZWQobGVmdCwgbGVuIC0gcmlnaHQpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChwcmVzZXJ2ZUxlbmd0aCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmxhbmsodGV4dCwgbGVmdCwgbGVuIC0gcmlnaHQpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBzID0gdGV4dC50b1N0cmluZygpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcy5zdWJzdHJpbmcoMCwgbGVmdCkgKyBzRWxsaXBzaXMgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5zdWJzdHJpbmcobGVuIC0gcmlnaHQsIGxlbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQnV0IGRvIHRoZSBTcGFubmVkIGNhc2VzIGJ5IGhhbmQsIGJlY2F1c2UgaXQncyBzdWNoIGEgcGFpbgotICAgICAgICAvLyB0byBpdGVyYXRlIHRoZSBzcGFuIHRyYW5zaXRpb25zIGJhY2t3YXJkcyBhbmQgZ2V0VGV4dFdpZHRocygpCi0gICAgICAgIC8vIHdpbGwgZ2l2ZSB1cyB0aGUgaW5mb3JtYXRpb24gd2UgbmVlZC4KLQotICAgICAgICAvLyBnZXRUZXh0V2lkdGhzKCkgYWx3YXlzIHdyaXRlcyBpbnRvIHRoZSBzdGFydCBvZiB0aGUgYXJyYXksCi0gICAgICAgIC8vIHNvIG1lYXN1cmUgZWFjaCBzcGFuIGludG8gdGhlIGZpcnN0IGhhbGYgYW5kIHRoZW4gY29weSB0aGUKLSAgICAgICAgLy8gcmVzdWx0cyBpbnRvIHRoZSBzZWNvbmQgaGFsZiB0byB1c2UgbGF0ZXIuCi0KLSAgICAgICAgZmxvYXRbXSB3aWQgPSBuZXcgZmxvYXRbbGVuICogMl07Ci0gICAgICAgIFRleHRQYWludCB0ZW1wcGFpbnQgPSBuZXcgVGV4dFBhaW50KCk7Ci0gICAgICAgIFNwYW5uZWQgc3AgPSAoU3Bhbm5lZCkgdGV4dDsKLQotICAgICAgICBpbnQgbmV4dDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkgPSBuZXh0KSB7Ci0gICAgICAgICAgICBuZXh0ID0gc3AubmV4dFNwYW5UcmFuc2l0aW9uKGksIGxlbiwgTWV0cmljQWZmZWN0aW5nU3Bhbi5jbGFzcyk7Ci0KLSAgICAgICAgICAgIFN0eWxlZC5nZXRUZXh0V2lkdGhzKHAsIHRlbXBwYWludCwgc3AsIGksIG5leHQsIHdpZCwgbnVsbCk7Ci0gICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHdpZCwgMCwgd2lkLCBsZW4gKyBpLCBuZXh0IC0gaSk7Ci0gICAgICAgIH0KLQotICAgICAgICBmbG9hdCBzdW0gPSAwOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0gICAgICAgICAgICBzdW0gKz0gd2lkW2xlbiArIGldOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHN1bSA8PSBhdmFpbCkgewotICAgICAgICAgICAgaWYgKGNhbGxiYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjYWxsYmFjay5lbGxpcHNpemVkKDAsIDApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gdGV4dDsKLSAgICAgICAgfQotCi0gICAgICAgIGZsb2F0IGVsbGlwc2lzd2lkID0gcC5tZWFzdXJlVGV4dChzRWxsaXBzaXMpOwotCi0gICAgICAgIGlmIChlbGxpcHNpc3dpZCA+IGF2YWlsKSB7Ci0gICAgICAgICAgICBpZiAoY2FsbGJhY2sgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGNhbGxiYWNrLmVsbGlwc2l6ZWQoMCwgbGVuKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHByZXNlcnZlTGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgY2hhcltdIGJ1ZiA9IG9idGFpbihsZW4pOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgYnVmW2ldID0gJ1x1RkVGRic7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFNwYW5uYWJsZVN0cmluZyBzcyA9IG5ldyBTcGFubmFibGVTdHJpbmcobmV3IFN0cmluZyhidWYsIDAsIGxlbikpOwotICAgICAgICAgICAgICAgIHJlY3ljbGUoYnVmKTsKLSAgICAgICAgICAgICAgICBjb3B5U3BhbnNGcm9tKHNwLCAwLCBsZW4sIE9iamVjdC5jbGFzcywgc3MsIDApOwotICAgICAgICAgICAgICAgIHJldHVybiBzczsKKyAgICAgICAgICAgICAgICBsZWZ0ID0gbXQuYnJlYWtUZXh0KDAsIGxlbiwgdHJ1ZSwgYXZhaWwpOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gIiI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAod2hlcmUgPT0gVHJ1bmNhdGVBdC5TVEFSVCkgewotICAgICAgICAgICAgc3VtID0gMDsKLSAgICAgICAgICAgIGludCBpOwotCi0gICAgICAgICAgICBmb3IgKGkgPSBsZW47IGkgPj0gMDsgaS0tKSB7Ci0gICAgICAgICAgICAgICAgZmxvYXQgdyA9IHdpZFtsZW4gKyBpIC0gMV07Ci0KLSAgICAgICAgICAgICAgICBpZiAodyArIHN1bSArIGVsbGlwc2lzd2lkID4gYXZhaWwpIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgc3VtICs9IHc7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChjYWxsYmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY2FsbGJhY2suZWxsaXBzaXplZCgwLCBpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHByZXNlcnZlTGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgU3Bhbm5hYmxlU3RyaW5nIHNzID0gbmV3IFNwYW5uYWJsZVN0cmluZyhibGFuayh0ZXh0LCAwLCBpKSk7Ci0gICAgICAgICAgICAgICAgY29weVNwYW5zRnJvbShzcCwgMCwgbGVuLCBPYmplY3QuY2xhc3MsIHNzLCAwKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gc3M7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIgb3V0ID0gbmV3IFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIoc0VsbGlwc2lzKTsKLSAgICAgICAgICAgICAgICBvdXQuaW5zZXJ0KDEsIHRleHQsIGksIGxlbik7Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gb3V0OwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKHdoZXJlID09IFRydW5jYXRlQXQuRU5EKSB7Ci0gICAgICAgICAgICBzdW0gPSAwOwotICAgICAgICAgICAgaW50IGk7Ci0KLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewotICAgICAgICAgICAgICAgIGZsb2F0IHcgPSB3aWRbbGVuICsgaV07Ci0KLSAgICAgICAgICAgICAgICBpZiAodyArIHN1bSArIGVsbGlwc2lzd2lkID4gYXZhaWwpIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgc3VtICs9IHc7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChjYWxsYmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY2FsbGJhY2suZWxsaXBzaXplZChpLCBsZW4pOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocHJlc2VydmVMZW5ndGgpIHsKLSAgICAgICAgICAgICAgICBTcGFubmFibGVTdHJpbmcgc3MgPSBuZXcgU3Bhbm5hYmxlU3RyaW5nKGJsYW5rKHRleHQsIGksIGxlbikpOwotICAgICAgICAgICAgICAgIGNvcHlTcGFuc0Zyb20oc3AsIDAsIGxlbiwgT2JqZWN0LmNsYXNzLCBzcywgMCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHNzOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBTcGFubmFibGVTdHJpbmdCdWlsZGVyIG91dCA9IG5ldyBTcGFubmFibGVTdHJpbmdCdWlsZGVyKHNFbGxpcHNpcyk7Ci0gICAgICAgICAgICAgICAgb3V0Lmluc2VydCgwLCB0ZXh0LCAwLCBpKTsKLQotICAgICAgICAgICAgICAgIHJldHVybiBvdXQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSAvKiB3aGVyZSA9IFRydW5jYXRlQXQuTUlERExFICovIHsKLSAgICAgICAgICAgIGZsb2F0IGxzdW0gPSAwLCByc3VtID0gMDsKLSAgICAgICAgICAgIGludCBsZWZ0ID0gMCwgcmlnaHQgPSBsZW47Ci0KLSAgICAgICAgICAgIGZsb2F0IHJhdmFpbCA9IChhdmFpbCAtIGVsbGlwc2lzd2lkKSAvIDI7Ci0gICAgICAgICAgICBmb3IgKHJpZ2h0ID0gbGVuOyByaWdodCA+PSAwOyByaWdodC0tKSB7Ci0gICAgICAgICAgICAgICAgZmxvYXQgdyA9IHdpZFtsZW4gKyByaWdodCAtIDFdOwotCi0gICAgICAgICAgICAgICAgaWYgKHcgKyByc3VtID4gcmF2YWlsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJzdW0gKz0gdzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZmxvYXQgbGF2YWlsID0gYXZhaWwgLSBlbGxpcHNpc3dpZCAtIHJzdW07Ci0gICAgICAgICAgICBmb3IgKGxlZnQgPSAwOyBsZWZ0IDwgcmlnaHQ7IGxlZnQrKykgewotICAgICAgICAgICAgICAgIGZsb2F0IHcgPSB3aWRbbGVuICsgbGVmdF07Ci0KLSAgICAgICAgICAgICAgICBpZiAodyArIGxzdW0gPiBsYXZhaWwpIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbHN1bSArPSB3OworICAgICAgICAgICAgICAgIHJpZ2h0ID0gbGVuIC0gbXQuYnJlYWtUZXh0KDAsIGxlbiwgZmFsc2UsIGF2YWlsIC8gMik7CisgICAgICAgICAgICAgICAgYXZhaWwgLT0gbXQubWVhc3VyZShyaWdodCwgbGVuKTsKKyAgICAgICAgICAgICAgICBsZWZ0ID0gbXQuYnJlYWtUZXh0KDAsIHJpZ2h0LCB0cnVlLCBhdmFpbCk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChjYWxsYmFjayAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgY2FsbGJhY2suZWxsaXBzaXplZChsZWZ0LCByaWdodCk7CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIGNoYXJbXSBidWYgPSBtdC5tQ2hhcnM7CisgICAgICAgICAgICBTcGFubmVkIHNwID0gdGV4dCBpbnN0YW5jZW9mIFNwYW5uZWQgPyAoU3Bhbm5lZCkgdGV4dCA6IG51bGw7CisKKyAgICAgICAgICAgIGludCByZW1haW5pbmcgPSBsZW4gLSAocmlnaHQgLSBsZWZ0KTsKICAgICAgICAgICAgIGlmIChwcmVzZXJ2ZUxlbmd0aCkgewotICAgICAgICAgICAgICAgIFNwYW5uYWJsZVN0cmluZyBzcyA9IG5ldyBTcGFubmFibGVTdHJpbmcoYmxhbmsodGV4dCwgbGVmdCwgcmlnaHQpKTsKKyAgICAgICAgICAgICAgICBpZiAocmVtYWluaW5nID4gMCkgeyAvLyBlbHNlIGVsaW1pbmF0ZSB0aGUgZWxsaXBzaXMgdG9vCisgICAgICAgICAgICAgICAgICAgIGJ1ZltsZWZ0KytdID0gJ1x1MjAyNic7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSBsZWZ0OyBpIDwgcmlnaHQ7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBidWZbaV0gPSAnXHVGRUZGJzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgU3RyaW5nIHMgPSBuZXcgU3RyaW5nKGJ1ZiwgMCwgbGVuKTsKKyAgICAgICAgICAgICAgICBpZiAoc3AgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgU3Bhbm5hYmxlU3RyaW5nIHNzID0gbmV3IFNwYW5uYWJsZVN0cmluZyhzKTsKICAgICAgICAgICAgICAgICBjb3B5U3BhbnNGcm9tKHNwLCAwLCBsZW4sIE9iamVjdC5jbGFzcywgc3MsIDApOwogICAgICAgICAgICAgICAgIHJldHVybiBzczsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlciBvdXQgPSBuZXcgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcihzRWxsaXBzaXMpOwotICAgICAgICAgICAgICAgIG91dC5pbnNlcnQoMCwgdGV4dCwgMCwgbGVmdCk7Ci0gICAgICAgICAgICAgICAgb3V0Lmluc2VydChvdXQubGVuZ3RoKCksIHRleHQsIHJpZ2h0LCBsZW4pOwotCi0gICAgICAgICAgICAgICAgcmV0dXJuIG91dDsKICAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBibGFuayhDaGFyU2VxdWVuY2Ugc291cmNlLCBpbnQgc3RhcnQsIGludCBlbmQpIHsKLSAgICAgICAgaW50IGxlbiA9IHNvdXJjZS5sZW5ndGgoKTsKLSAgICAgICAgY2hhcltdIGJ1ZiA9IG9idGFpbihsZW4pOwotCi0gICAgICAgIGlmIChzdGFydCAhPSAwKSB7Ci0gICAgICAgICAgICBnZXRDaGFycyhzb3VyY2UsIDAsIHN0YXJ0LCBidWYsIDApOwotICAgICAgICB9Ci0gICAgICAgIGlmIChlbmQgIT0gbGVuKSB7Ci0gICAgICAgICAgICBnZXRDaGFycyhzb3VyY2UsIGVuZCwgbGVuLCBidWYsIGVuZCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc3RhcnQgIT0gZW5kKSB7Ci0gICAgICAgICAgICBidWZbc3RhcnRdID0gJ1x1MjAyNic7Ci0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSBzdGFydCArIDE7IGkgPCBlbmQ7IGkrKykgewotICAgICAgICAgICAgICAgIGJ1ZltpXSA9ICdcdUZFRkYnOworICAgICAgICAgICAgaWYgKHJlbWFpbmluZyA9PSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICIiOwogICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgCi0gICAgICAgIFN0cmluZyByZXQgPSBuZXcgU3RyaW5nKGJ1ZiwgMCwgbGVuKTsKLSAgICAgICAgcmVjeWNsZShidWYpOwogCi0gICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICBpZiAoc3AgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcihyZW1haW5pbmcgKyBzRWxsaXBzaXMubGVuZ3RoKCkpOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZChidWYsIDAsIGxlZnQpOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZChzRWxsaXBzaXMpOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZChidWYsIHJpZ2h0LCBsZW4gLSByaWdodCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIgc3NiID0gbmV3IFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgIHNzYi5hcHBlbmQodGV4dCwgMCwgbGVmdCk7CisgICAgICAgICAgICBzc2IuYXBwZW5kKHNFbGxpcHNpcyk7CisgICAgICAgICAgICBzc2IuYXBwZW5kKHRleHQsIHJpZ2h0LCBsZW4pOworICAgICAgICAgICAgcmV0dXJuIHNzYjsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIE1lYXN1cmVkVGV4dC5yZWN5Y2xlKG10KTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgpAQCAtMTI3OCw4MCArMTA5MywxMjEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXh0UGFpbnQgcCwgZmxvYXQgYXZhaWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG9uZU1vcmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1vcmUpIHsKLSAgICAgICAgaW50IGxlbiA9IHRleHQubGVuZ3RoKCk7Ci0gICAgICAgIGNoYXJbXSBidWYgPSBuZXcgY2hhcltsZW5dOwotICAgICAgICBUZXh0VXRpbHMuZ2V0Q2hhcnModGV4dCwgMCwgbGVuLCBidWYsIDApOwogCi0gICAgICAgIGludCBjb21tYUNvdW50ID0gMDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotICAgICAgICAgICAgaWYgKGJ1ZltpXSA9PSAnLCcpIHsKLSAgICAgICAgICAgICAgICBjb21tYUNvdW50Kys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBmbG9hdFtdIHdpZDsKLQotICAgICAgICBpZiAodGV4dCBpbnN0YW5jZW9mIFNwYW5uZWQpIHsKLSAgICAgICAgICAgIFNwYW5uZWQgc3AgPSAoU3Bhbm5lZCkgdGV4dDsKLSAgICAgICAgICAgIFRleHRQYWludCB0ZW1wcGFpbnQgPSBuZXcgVGV4dFBhaW50KCk7Ci0gICAgICAgICAgICB3aWQgPSBuZXcgZmxvYXRbbGVuICogMl07Ci0KLSAgICAgICAgICAgIGludCBuZXh0OwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkgPSBuZXh0KSB7Ci0gICAgICAgICAgICAgICAgbmV4dCA9IHNwLm5leHRTcGFuVHJhbnNpdGlvbihpLCBsZW4sIE1ldHJpY0FmZmVjdGluZ1NwYW4uY2xhc3MpOwotCi0gICAgICAgICAgICAgICAgU3R5bGVkLmdldFRleHRXaWR0aHMocCwgdGVtcHBhaW50LCBzcCwgaSwgbmV4dCwgd2lkLCBudWxsKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHdpZCwgMCwgd2lkLCBsZW4gKyBpLCBuZXh0IC0gaSk7CisgICAgICAgIE1lYXN1cmVkVGV4dCBtdCA9IE1lYXN1cmVkVGV4dC5vYnRhaW4oKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBsZW4gPSB0ZXh0Lmxlbmd0aCgpOworICAgICAgICAgICAgZmxvYXQgd2lkdGggPSBzZXRQYXJhKG10LCBwLCB0ZXh0LCAwLCBsZW4sIExheW91dC5ESVJfUkVRVUVTVF9ERUZBVUxUX0xUUik7CisgICAgICAgICAgICBpZiAod2lkdGggPD0gYXZhaWwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGV4dDsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weSh3aWQsIGxlbiwgd2lkLCAwLCBsZW4pOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgd2lkID0gbmV3IGZsb2F0W2xlbl07Ci0gICAgICAgICAgICBwLmdldFRleHRXaWR0aHModGV4dCwgMCwgbGVuLCB3aWQpOwotICAgICAgICB9CisgICAgICAgICAgICBjaGFyW10gYnVmID0gbXQubUNoYXJzOwogCi0gICAgICAgIGludCBvayA9IDA7Ci0gICAgICAgIGludCBva1JlbWFpbmluZyA9IGNvbW1hQ291bnQgKyAxOwotICAgICAgICBTdHJpbmcgb2tGb3JtYXQgPSAiIjsKLQotICAgICAgICBpbnQgdyA9IDA7Ci0gICAgICAgIGludCBjb3VudCA9IDA7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotICAgICAgICAgICAgdyArPSB3aWRbaV07Ci0KLSAgICAgICAgICAgIGlmIChidWZbaV0gPT0gJywnKSB7Ci0gICAgICAgICAgICAgICAgY291bnQrKzsKLQotICAgICAgICAgICAgICAgIGludCByZW1haW5pbmcgPSBjb21tYUNvdW50IC0gY291bnQgKyAxOwotICAgICAgICAgICAgICAgIGZsb2F0IG1vcmVXaWQ7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGZvcm1hdDsKLQotICAgICAgICAgICAgICAgIGlmIChyZW1haW5pbmcgPT0gMSkgewotICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPSAiICIgKyBvbmVNb3JlOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9ICIgIiArIFN0cmluZy5mb3JtYXQobW9yZSwgcmVtYWluaW5nKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBtb3JlV2lkID0gcC5tZWFzdXJlVGV4dChmb3JtYXQpOwotCi0gICAgICAgICAgICAgICAgaWYgKHcgKyBtb3JlV2lkIDw9IGF2YWlsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG9rID0gaSArIDE7Ci0gICAgICAgICAgICAgICAgICAgIG9rUmVtYWluaW5nID0gcmVtYWluaW5nOwotICAgICAgICAgICAgICAgICAgICBva0Zvcm1hdCA9IGZvcm1hdDsKKyAgICAgICAgICAgIGludCBjb21tYUNvdW50ID0gMDsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoYnVmW2ldID09ICcsJykgeworICAgICAgICAgICAgICAgICAgICBjb21tYUNvdW50Kys7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICB9CiAKLSAgICAgICAgaWYgKHcgPD0gYXZhaWwpIHsKLSAgICAgICAgICAgIHJldHVybiB0ZXh0OwotICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW50IHJlbWFpbmluZyA9IGNvbW1hQ291bnQgKyAxOworCisgICAgICAgICAgICBpbnQgb2sgPSAwOworICAgICAgICAgICAgaW50IG9rUmVtYWluaW5nID0gcmVtYWluaW5nOworICAgICAgICAgICAgU3RyaW5nIG9rRm9ybWF0ID0gIiI7CisKKyAgICAgICAgICAgIGludCB3ID0gMDsKKyAgICAgICAgICAgIGludCBjb3VudCA9IDA7CisgICAgICAgICAgICBmbG9hdFtdIHdpZHRocyA9IG10Lm1XaWR0aHM7CisKKyAgICAgICAgICAgIGludCByZXF1ZXN0ID0gbXQubURpciA9PSAxID8gTGF5b3V0LkRJUl9SRVFVRVNUX0xUUiA6CisgICAgICAgICAgICAgICAgTGF5b3V0LkRJUl9SRVFVRVNUX1JUTDsKKworICAgICAgICAgICAgTWVhc3VyZWRUZXh0IHRlbXBNdCA9IE1lYXN1cmVkVGV4dC5vYnRhaW4oKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgICAgICAgICAgICB3ICs9IHdpZHRoc1tpXTsKKworICAgICAgICAgICAgICAgIGlmIChidWZbaV0gPT0gJywnKSB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50Kys7CisKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGZvcm1hdDsKKyAgICAgICAgICAgICAgICAgICAgLy8gWFhYIHNob3VsZCBub3QgaW5zZXJ0IHNwYWNlcywgc2hvdWxkIGJlIHBhcnQgb2Ygc3RyaW5nCisgICAgICAgICAgICAgICAgICAgIC8vIFhYWCBzaG91bGQgdXNlIHBsdXJhbCBydWxlcyBhbmQgbm90IGFzc3VtZSBFbmdsaXNoIHBsdXJhbHMKKyAgICAgICAgICAgICAgICAgICAgaWYgKC0tcmVtYWluaW5nID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9ICIgIiArIG9uZU1vcmU7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPSAiICIgKyBTdHJpbmcuZm9ybWF0KG1vcmUsIHJlbWFpbmluZyk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBYWFggdGhpcyBpcyBwcm9iYWJseSBvaywgYnV0IG5lZWQgdG8gbG9vayBhdCBpdCBtb3JlCisgICAgICAgICAgICAgICAgICAgIHRlbXBNdC5zZXRQYXJhKGZvcm1hdCwgMCwgZm9ybWF0Lmxlbmd0aCgpLCByZXF1ZXN0KTsKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgbW9yZVdpZCA9IG10LmFkZFN0eWxlUnVuKHAsIG10Lm1MZW4sIG51bGwpOworCisgICAgICAgICAgICAgICAgICAgIGlmICh3ICsgbW9yZVdpZCA8PSBhdmFpbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgb2sgPSBpICsgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9rUmVtYWluaW5nID0gcmVtYWluaW5nOworICAgICAgICAgICAgICAgICAgICAgICAgb2tGb3JtYXQgPSBmb3JtYXQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBNZWFzdXJlZFRleHQucmVjeWNsZSh0ZW1wTXQpOworCiAgICAgICAgICAgICBTcGFubmFibGVTdHJpbmdCdWlsZGVyIG91dCA9IG5ldyBTcGFubmFibGVTdHJpbmdCdWlsZGVyKG9rRm9ybWF0KTsKICAgICAgICAgICAgIG91dC5pbnNlcnQoMCwgdGV4dCwgMCwgb2spOwogICAgICAgICAgICAgcmV0dXJuIG91dDsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIE1lYXN1cmVkVGV4dC5yZWN5Y2xlKG10KTsKICAgICAgICAgfQogICAgIH0KIAorICAgIHByaXZhdGUgc3RhdGljIGZsb2F0IHNldFBhcmEoTWVhc3VyZWRUZXh0IG10LCBUZXh0UGFpbnQgcGFpbnQsCisgICAgICAgICAgICBDaGFyU2VxdWVuY2UgdGV4dCwgaW50IHN0YXJ0LCBpbnQgZW5kLCBpbnQgYmlkaVJlcXVlc3QpIHsKKworICAgICAgICBtdC5zZXRQYXJhKHRleHQsIHN0YXJ0LCBlbmQsIGJpZGlSZXF1ZXN0KTsKKworICAgICAgICBmbG9hdCB3aWR0aDsKKyAgICAgICAgU3Bhbm5lZCBzcCA9IHRleHQgaW5zdGFuY2VvZiBTcGFubmVkID8gKFNwYW5uZWQpIHRleHQgOiBudWxsOworICAgICAgICBpbnQgbGVuID0gZW5kIC0gc3RhcnQ7CisgICAgICAgIGlmIChzcCA9PSBudWxsKSB7CisgICAgICAgICAgICB3aWR0aCA9IG10LmFkZFN0eWxlUnVuKHBhaW50LCBsZW4sIG51bGwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgd2lkdGggPSAwOworICAgICAgICAgICAgaW50IHNwYW5FbmQ7CisgICAgICAgICAgICBmb3IgKGludCBzcGFuU3RhcnQgPSAwOyBzcGFuU3RhcnQgPCBsZW47IHNwYW5TdGFydCA9IHNwYW5FbmQpIHsKKyAgICAgICAgICAgICAgICBzcGFuRW5kID0gc3AubmV4dFNwYW5UcmFuc2l0aW9uKHNwYW5TdGFydCwgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgTWV0cmljQWZmZWN0aW5nU3Bhbi5jbGFzcyk7CisgICAgICAgICAgICAgICAgTWV0cmljQWZmZWN0aW5nU3BhbltdIHNwYW5zID0gc3AuZ2V0U3BhbnMoCisgICAgICAgICAgICAgICAgICAgICAgICBzcGFuU3RhcnQsIHNwYW5FbmQsIE1ldHJpY0FmZmVjdGluZ1NwYW4uY2xhc3MpOworICAgICAgICAgICAgICAgIHdpZHRoICs9IG10LmFkZFN0eWxlUnVuKHBhaW50LCBzcGFucywgc3BhbkVuZCAtIHNwYW5TdGFydCwgbnVsbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gd2lkdGg7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBGSVJTVF9SSUdIVF9UT19MRUZUID0gJ1x1MDU5MCc7CisKKyAgICAvKiBwYWNrYWdlICovCisgICAgc3RhdGljIGJvb2xlYW4gZG9lc05vdE5lZWRCaWRpKENoYXJTZXF1ZW5jZSBzLCBpbnQgc3RhcnQsIGludCBlbmQpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChzLmNoYXJBdChpKSA+PSBGSVJTVF9SSUdIVF9UT19MRUZUKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qIHBhY2thZ2UgKi8KKyAgICBzdGF0aWMgYm9vbGVhbiBkb2VzTm90TmVlZEJpZGkoY2hhcltdIHRleHQsIGludCBzdGFydCwgaW50IGxlbikgeworICAgICAgICBmb3IgKGludCBpID0gc3RhcnQsIGUgPSBpICsgbGVuOyBpIDwgZTsgaSsrKSB7CisgICAgICAgICAgICBpZiAodGV4dFtpXSA+PSBGSVJTVF9SSUdIVF9UT19MRUZUKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKwogICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGNoYXJbXSBvYnRhaW4oaW50IGxlbikgewogICAgICAgICBjaGFyW10gYnVmOwogCkBAIC0xNTI5LDcgKzEzODUsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENBUF9NT0RFX0NIQVJBQ1RFUlMKICAgICAgICAgICAgID0gSW5wdXRUeXBlLlRZUEVfVEVYVF9GTEFHX0NBUF9DSEFSQUNURVJTOwotICAgIAorCiAgICAgLyoqCiAgICAgICogQ2FwaXRhbGl6YXRpb24gbW9kZSBmb3Ige0BsaW5rICNnZXRDYXBzTW9kZX06IGNhcGl0YWxpemUgdGhlIGZpcnN0CiAgICAgICogY2hhcmFjdGVyIG9mIGFsbCB3b3Jkcy4gIFRoaXMgdmFsdWUgaXMgZXhwbGljaXRseSBkZWZpbmVkIHRvIGJlIHRoZSBzYW1lIGFzCkBAIC0xNTM3LDcgKzEzOTMsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENBUF9NT0RFX1dPUkRTCiAgICAgICAgICAgICA9IElucHV0VHlwZS5UWVBFX1RFWFRfRkxBR19DQVBfV09SRFM7Ci0gICAgCisKICAgICAvKioKICAgICAgKiBDYXBpdGFsaXphdGlvbiBtb2RlIGZvciB7QGxpbmsgI2dldENhcHNNb2RlfTogY2FwaXRhbGl6ZSB0aGUgZmlyc3QKICAgICAgKiBjaGFyYWN0ZXIgb2YgZWFjaCBzZW50ZW5jZS4gIFRoaXMgdmFsdWUgaXMgZXhwbGljaXRseSBkZWZpbmVkIHRvIGJlIHRoZSBzYW1lIGFzCkBAIC0xNTQ1LDEzICsxNDAxLDEzIEBACiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FQX01PREVfU0VOVEVOQ0VTCiAgICAgICAgICAgICA9IElucHV0VHlwZS5UWVBFX1RFWFRfRkxBR19DQVBfU0VOVEVOQ0VTOwotICAgIAorCiAgICAgLyoqCiAgICAgICogRGV0ZXJtaW5lIHdoYXQgY2FwcyBtb2RlIHNob3VsZCBiZSBpbiBlZmZlY3QgYXQgdGhlIGN1cnJlbnQgb2Zmc2V0IGluCiAgICAgICogdGhlIHRleHQuICBPbmx5IHRoZSBtb2RlIGJpdHMgc2V0IGluIDx2YXI+cmVxTW9kZXM8L3Zhcj4gd2lsbCBiZQogICAgICAqIGNoZWNrZWQuICBOb3RlIHRoYXQgdGhlIGNhcHMgbW9kZSBmbGFncyBoZXJlIGFyZSBleHBsaWNpdGx5IGRlZmluZWQKICAgICAgKiB0byBtYXRjaCB0aG9zZSBpbiB7QGxpbmsgSW5wdXRUeXBlfS4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEBwYXJhbSBjcyBUaGUgdGV4dCB0aGF0IHNob3VsZCBiZSBjaGVja2VkIGZvciBjYXBzIG1vZGVzLgogICAgICAqIEBwYXJhbSBvZmYgTG9jYXRpb24gaW4gdGhlIHRleHQgYXQgd2hpY2ggdG8gY2hlY2suCiAgICAgICogQHBhcmFtIHJlcU1vZGVzIFRoZSBtb2RlcyB0byBiZSBjaGVja2VkOiBtYXkgYmUgYW55IGNvbWJpbmF0aW9uIG9mCkBAIC0xNjUxLDcgKzE1MDcsNyBAQAogCiAgICAgICAgIHJldHVybiBtb2RlOwogICAgIH0KLSAgICAKKwogICAgIHByaXZhdGUgc3RhdGljIE9iamVjdCBzTG9jayA9IG5ldyBPYmplY3QoKTsKICAgICBwcml2YXRlIHN0YXRpYyBjaGFyW10gc1RlbXAgPSBudWxsOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9tZXRob2QvVG91Y2guamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvbWV0aG9kL1RvdWNoLmphdmEKaW5kZXggYTE5YTc4ZS4uM2I5OGZjMyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9tZXRob2QvVG91Y2guamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L21ldGhvZC9Ub3VjaC5qYXZhCkBAIC00NCw2ICs0NCw3IEBACiAgICAgICAgIGludCBsZWZ0ID0gSW50ZWdlci5NQVhfVkFMVUU7CiAgICAgICAgIGludCByaWdodCA9IDA7CiAgICAgICAgIEFsaWdubWVudCBhID0gbnVsbDsKKyAgICAgICAgYm9vbGVhbiBsdHIgPSB0cnVlOwogCiAgICAgICAgIGZvciAoaW50IGkgPSB0b3A7IGkgPD0gYm90dG9tOyBpKyspIHsKICAgICAgICAgICAgIGxlZnQgPSAoaW50KSBNYXRoLm1pbihsZWZ0LCBsYXlvdXQuZ2V0TGluZUxlZnQoaSkpOwpAQCAtNTEsNiArNTIsNyBAQAogCiAgICAgICAgICAgICBpZiAoYSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgYSA9IGxheW91dC5nZXRQYXJhZ3JhcGhBbGlnbm1lbnQoaSk7CisgICAgICAgICAgICAgICAgbHRyID0gbGF5b3V0LmdldFBhcmFncmFwaERpcmVjdGlvbihpKSA+IDA7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtNTgsMTAgKzYwLDEyIEBACiAgICAgICAgIGludCB3aWR0aCA9IHdpZGdldC5nZXRXaWR0aCgpOwogICAgICAgICBpbnQgZGlmZiA9IDA7CiAKKyAgICAgICAgLy8gYWxpZ25fb3Bwb3NpdGUgZG9lcyBOT1QgbWVhbiBhbGlnbl9yaWdodCwgd2UgbmVlZCB0aGUgcGFyYWdyYXBoCisgICAgICAgIC8vIGRpcmVjdGlvbiB0byByZXNvbHZlIGl0IHRvIGxlZnQgb3IgcmlnaHQKICAgICAgICAgaWYgKHJpZ2h0IC0gbGVmdCA8IHdpZHRoIC0gcGFkZGluZykgewogICAgICAgICAgICAgaWYgKGEgPT0gQWxpZ25tZW50LkFMSUdOX0NFTlRFUikgewogICAgICAgICAgICAgICAgIGRpZmYgPSAod2lkdGggLSBwYWRkaW5nIC0gKHJpZ2h0IC0gbGVmdCkpIC8gMjsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoYSA9PSBBbGlnbm1lbnQuQUxJR05fT1BQT1NJVEUpIHsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobHRyID09IChhID09IEFsaWdubWVudC5BTElHTl9PUFBPU0lURSkpIHsKICAgICAgICAgICAgICAgICBkaWZmID0gd2lkdGggLSBwYWRkaW5nIC0gKHJpZ2h0IC0gbGVmdCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3V0aWwvQW5kcm9pZEV4Y2VwdGlvbi5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdXRpbC9BbmRyb2lkRXhjZXB0aW9uLmphdmEKaW5kZXggYTc2N2VhMS4uZGZlMDBjOWIgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3V0aWwvQW5kcm9pZEV4Y2VwdGlvbi5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3V0aWwvQW5kcm9pZEV4Y2VwdGlvbi5qYXZhCkBAIC0yNyw2ICsyNywxMCBAQAogICAgICAgICBzdXBlcihuYW1lKTsKICAgICB9CiAKKyAgICBwdWJsaWMgQW5kcm9pZEV4Y2VwdGlvbihTdHJpbmcgbmFtZSwgVGhyb3dhYmxlIGNhdXNlKSB7CisgICAgICAgIHN1cGVyKG5hbWUsIGNhdXNlKTsKKyAgICB9CisKICAgICBwdWJsaWMgQW5kcm9pZEV4Y2VwdGlvbihFeGNlcHRpb24gY2F1c2UpIHsKICAgICAgICAgc3VwZXIoY2F1c2UpOwogICAgIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3V0aWwvQW5kcm9pZFJ1bnRpbWVFeGNlcHRpb24uamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3V0aWwvQW5kcm9pZFJ1bnRpbWVFeGNlcHRpb24uamF2YQppbmRleCA0ZWQxN2JjLi4yYjgyNGJmIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC91dGlsL0FuZHJvaWRSdW50aW1lRXhjZXB0aW9uLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdXRpbC9BbmRyb2lkUnVudGltZUV4Y2VwdGlvbi5qYXZhCkBAIC0yNyw2ICsyNywxMCBAQAogICAgICAgICBzdXBlcihuYW1lKTsKICAgICB9CiAKKyAgICBwdWJsaWMgQW5kcm9pZFJ1bnRpbWVFeGNlcHRpb24oU3RyaW5nIG5hbWUsIFRocm93YWJsZSBjYXVzZSkgeworICAgICAgICBzdXBlcihuYW1lLCBjYXVzZSk7CisgICAgfQorCiAgICAgcHVibGljIEFuZHJvaWRSdW50aW1lRXhjZXB0aW9uKEV4Y2VwdGlvbiBjYXVzZSkgewogICAgICAgICBzdXBlcihjYXVzZSk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdXRpbC9DaGFyc2V0VXRpbHMuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3V0aWwvQ2hhcnNldFV0aWxzLmphdmEKaW5kZXggOWQ5MWFjYS4uYTc2M2E2OSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdXRpbC9DaGFyc2V0VXRpbHMuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC91dGlsL0NoYXJzZXRVdGlscy5qYXZhCkBAIC0xNywzNiArMTcsNTggQEAKIHBhY2thZ2UgYW5kcm9pZC51dGlsOwogCiBpbXBvcnQgYW5kcm9pZC5vcy5CdWlsZDsKK2ltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwogCiBpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0OwogaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuSWxsZWdhbENoYXJzZXROYW1lRXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKIC8qKgorICogPHA+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+CisgICAgICogPC91bD4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50ZXJmYWNlIENhbGxiYWNrIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENhbGxlZCB3aGVuIGFjdGlvbiBtb2RlIGlzIGZpcnN0IGNyZWF0ZWQuIFRoZSBtZW51IHN1cHBsaWVkIHdpbGwgYmUgdXNlZCB0bworICAgICAgICAgKiBnZW5lcmF0ZSBhY3Rpb24gYnV0dG9ucyBmb3IgdGhlIGFjdGlvbiBtb2RlLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbW9kZSBBY3Rpb25Nb2RlIGJlaW5nIGNyZWF0ZWQKKyAgICAgICAgICogQHBhcmFtIG1lbnUgTWVudSB1c2VkIHRvIHBvcHVsYXRlIGFjdGlvbiBidXR0b25zCisgICAgICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgYWN0aW9uIG1vZGUgc2hvdWxkIGJlIGNyZWF0ZWQsIGZhbHNlIGlmIGVudGVyaW5nIHRoaXMKKyAgICAgICAgICogICAgICAgICAgICAgIG1vZGUgc2hvdWxkIGJlIGFib3J0ZWQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbkNyZWF0ZUFjdGlvbk1vZGUoQWN0aW9uTW9kZSBtb2RlLCBNZW51IG1lbnUpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDYWxsZWQgdG8gcmVmcmVzaCBhbiBhY3Rpb24gbW9kZSdzIGFjdGlvbiBtZW51IHdoZW5ldmVyIGl0IGlzIGludmFsaWRhdGVkLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbW9kZSBBY3Rpb25Nb2RlIGJlaW5nIHByZXBhcmVkCisgICAgICAgICAqIEBwYXJhbSBtZW51IE1lbnUgdXNlZCB0byBwb3B1bGF0ZSBhY3Rpb24gYnV0dG9ucworICAgICAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIG1lbnUgb3IgYWN0aW9uIG1vZGUgd2FzIHVwZGF0ZWQsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBib29sZWFuIG9uUHJlcGFyZUFjdGlvbk1vZGUoQWN0aW9uTW9kZSBtb2RlLCBNZW51IG1lbnUpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDYWxsZWQgdG8gcmVwb3J0IGEgdXNlciBjbGljayBvbiBhbiBhY3Rpb24gYnV0dG9uLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbW9kZSBUaGUgY3VycmVudCBBY3Rpb25Nb2RlCisgICAgICAgICAqIEBwYXJhbSBpdGVtIFRoZSBpdGVtIHRoYXQgd2FzIGNsaWNrZWQKKyAgICAgICAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgY2FsbGJhY2sgaGFuZGxlZCB0aGUgZXZlbnQsIGZhbHNlIGlmIHRoZSBzdGFuZGFyZCBNZW51SXRlbQorICAgICAgICAgKiAgICAgICAgICBpbnZvY2F0aW9uIHNob3VsZCBjb250aW51ZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBib29sZWFuIG9uQWN0aW9uSXRlbUNsaWNrZWQoQWN0aW9uTW9kZSBtb2RlLCBNZW51SXRlbSBpdGVtKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ2FsbGVkIHdoZW4gYW4gYWN0aW9uIG1vZGUgaXMgYWJvdXQgdG8gYmUgZXhpdGVkIGFuZCBkZXN0cm95ZWQuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBtb2RlIFRoZSBjdXJyZW50IEFjdGlvbk1vZGUgYmVpbmcgZGVzdHJveWVkCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBvbkRlc3Ryb3lBY3Rpb25Nb2RlKEFjdGlvbk1vZGUgbW9kZSk7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvR0xFUzIwQ2FudmFzLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L0dMRVMyMENhbnZhcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwNTg2ODUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L0dMRVMyMENhbnZhcy5qYXZhCkBAIC0wLDAgKzEsODAzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnZpZXc7CisKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yRmlsdGVyOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuRHJhd0ZpbHRlcjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLk1hdHJpeDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGF0aDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBpY3R1cmU7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3RGOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVnaW9uOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuU2hhZGVyOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuVGVtcG9yYXJ5QnVmZmVyOworaW1wb3J0IGFuZHJvaWQudGV4dC5HcmFwaGljc09wZXJhdGlvbnM7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlNwYW5uYWJsZVN0cmluZzsKK2ltcG9ydCBhbmRyb2lkLnRleHQuU3Bhbm5lZFN0cmluZzsKK2ltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOworCitpbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXMuR0w7CisKKy8qKgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgQ2FudmFzIG9uIHRvcCBvZiBPcGVuR0wgRVMgMi4wLgorICovCitjbGFzcyBHTEVTMjBDYW52YXMgZXh0ZW5kcyBDYW52YXMgeworICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsiRmllbGRDYW5CZUxvY2FsIiwgIlVudXNlZERlY2xhcmF0aW9uIn0pCisgICAgcHJpdmF0ZSBmaW5hbCBHTCBtR2w7CisgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1PcGFxdWU7CisgICAgcHJpdmF0ZSBpbnQgbVJlbmRlcmVyOworICAgIAorICAgIHByaXZhdGUgaW50IG1XaWR0aDsKKyAgICBwcml2YXRlIGludCBtSGVpZ2h0OworICAgIAorICAgIHByaXZhdGUgZmluYWwgZmxvYXRbXSBtUG9pbnQgPSBuZXcgZmxvYXRbMl07CisgICAgcHJpdmF0ZSBmaW5hbCBmbG9hdFtdIG1MaW5lID0gbmV3IGZsb2F0WzRdOworICAgIAorICAgIHByaXZhdGUgZmluYWwgUmVjdCBtQ2xpcEJvdW5kcyA9IG5ldyBSZWN0KCk7CisKKyAgICBwcml2YXRlIERyYXdGaWx0ZXIgbUZpbHRlcjsKKyAgICAKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAvLyBKTkkKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBib29sZWFuIG5Jc0F2YWlsYWJsZSgpOworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gc0lzQXZhaWxhYmxlID0gbklzQXZhaWxhYmxlKCk7CisKKyAgICBzdGF0aWMgYm9vbGVhbiBpc0F2YWlsYWJsZSgpIHsKKyAgICAgICAgcmV0dXJuIHNJc0F2YWlsYWJsZTsKKyAgICB9CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAvLyBDb25zdHJ1Y3RvcnMKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAKKyAgICBHTEVTMjBDYW52YXMoR0wgZ2wsIGJvb2xlYW4gdHJhbnNsdWNlbnQpIHsKKyAgICAgICAgbUdsID0gZ2w7CisgICAgICAgIG1PcGFxdWUgPSAhdHJhbnNsdWNlbnQ7CisKKyAgICAgICAgbVJlbmRlcmVyID0gbkNyZWF0ZVJlbmRlcmVyKCk7CisgICAgICAgIGlmIChtUmVuZGVyZXIgPT0gMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQ291bGQgbm90IGNyZWF0ZSBHTEVTMjBDYW52YXMgcmVuZGVyZXIiKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwcml2YXRlIG5hdGl2ZSBpbnQgbkNyZWF0ZVJlbmRlcmVyKCk7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCA8c3Ryb25nPm11c3Q8L3N0cm9uZz4gYmUgY2FsbGVkIGJlZm9yZSByZWxlYXNpbmcgYQorICAgICAqIHJlZmVyZW5jZSB0byBhIEdMRVMyMENhbnZhcy4gVGhpcyBtZXRob2QgaXMgcmVzcG9uc2libGUgZm9yIGZyZWVpbmcKKyAgICAgKiBuYXRpdmUgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgaGFyZHdhcmUuIE5vdCBpbnZva2luZyB0aGlzCisgICAgICogbWV0aG9kIHByb3Blcmx5IGNhbiByZXN1bHQgaW4gbWVtb3J5IGxlYWtzLgorICAgICAqIAorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGRlc3Ryb3koKSB7CisgICAgICAgIGlmIChtUmVuZGVyZXIgIT0gMCkgeworICAgICAgICAgICAgbkRlc3Ryb3lSZW5kZXJlcihtUmVuZGVyZXIpOworICAgICAgICAgICAgbVJlbmRlcmVyID0gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbkRlc3Ryb3lSZW5kZXJlcihpbnQgcmVuZGVyZXIpOworCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgLy8gQ2FudmFzIG1hbmFnZW1lbnQKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0hhcmR3YXJlQWNjZWxlcmF0ZWQoKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldEJpdG1hcChCaXRtYXAgYml0bWFwKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzT3BhcXVlKCkgeworICAgICAgICByZXR1cm4gbU9wYXF1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGdldFdpZHRoKCkgeworICAgICAgICByZXR1cm4gbVdpZHRoOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgZ2V0SGVpZ2h0KCkgeworICAgICAgICByZXR1cm4gbUhlaWdodDsKKyAgICB9CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAvLyBTZXR1cAorICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0Vmlld3BvcnQoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CisgICAgICAgIG1XaWR0aCA9IHdpZHRoOworICAgICAgICBtSGVpZ2h0ID0gaGVpZ2h0OworCisgICAgICAgIG5TZXRWaWV3cG9ydChtUmVuZGVyZXIsIHdpZHRoLCBoZWlnaHQpOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5TZXRWaWV3cG9ydChpbnQgcmVuZGVyZXIsIGludCB3aWR0aCwgaW50IGhlaWdodCk7CisKKyAgICB2b2lkIG9uUHJlRHJhdygpIHsKKyAgICAgICAgblByZXBhcmUobVJlbmRlcmVyKTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuUHJlcGFyZShpbnQgcmVuZGVyZXIpOworCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgLy8gQ2xpcHBpbmcKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGNsaXBQYXRoKFBhdGggcGF0aCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBjbGlwUGF0aChQYXRoIHBhdGgsIFJlZ2lvbi5PcCBvcCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBjbGlwUmVjdChmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20pIHsKKyAgICAgICAgcmV0dXJuIG5DbGlwUmVjdChtUmVuZGVyZXIsIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSwgUmVnaW9uLk9wLklOVEVSU0VDVC5uYXRpdmVJbnQpOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuIG5DbGlwUmVjdChpbnQgcmVuZGVyZXIsIGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwKKyAgICAgICAgICAgIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sIGludCBvcCk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBjbGlwUmVjdChmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sIFJlZ2lvbi5PcCBvcCkgeworICAgICAgICByZXR1cm4gbkNsaXBSZWN0KG1SZW5kZXJlciwgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tLCBvcC5uYXRpdmVJbnQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGNsaXBSZWN0KGludCBsZWZ0LCBpbnQgdG9wLCBpbnQgcmlnaHQsIGludCBib3R0b20pIHsKKyAgICAgICAgcmV0dXJuIG5DbGlwUmVjdChtUmVuZGVyZXIsIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSwgUmVnaW9uLk9wLklOVEVSU0VDVC5uYXRpdmVJbnQpOyAgICAgICAgCisgICAgfQorICAgIAorICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gbkNsaXBSZWN0KGludCByZW5kZXJlciwgaW50IGxlZnQsIGludCB0b3AsIGludCByaWdodCwgaW50IGJvdHRvbSwgaW50IG9wKTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGNsaXBSZWN0KFJlY3QgcmVjdCkgeworICAgICAgICByZXR1cm4gbkNsaXBSZWN0KG1SZW5kZXJlciwgcmVjdC5sZWZ0LCByZWN0LnRvcCwgcmVjdC5yaWdodCwgcmVjdC5ib3R0b20sCisgICAgICAgICAgICAgICAgUmVnaW9uLk9wLklOVEVSU0VDVC5uYXRpdmVJbnQpOyAgICAgICAgCisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gY2xpcFJlY3QoUmVjdCByZWN0LCBSZWdpb24uT3Agb3ApIHsKKyAgICAgICAgcmV0dXJuIG5DbGlwUmVjdChtUmVuZGVyZXIsIHJlY3QubGVmdCwgcmVjdC50b3AsIHJlY3QucmlnaHQsIHJlY3QuYm90dG9tLCBvcC5uYXRpdmVJbnQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGNsaXBSZWN0KFJlY3RGIHJlY3QpIHsKKyAgICAgICAgcmV0dXJuIG5DbGlwUmVjdChtUmVuZGVyZXIsIHJlY3QubGVmdCwgcmVjdC50b3AsIHJlY3QucmlnaHQsIHJlY3QuYm90dG9tLAorICAgICAgICAgICAgICAgIFJlZ2lvbi5PcC5JTlRFUlNFQ1QubmF0aXZlSW50KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBjbGlwUmVjdChSZWN0RiByZWN0LCBSZWdpb24uT3Agb3ApIHsKKyAgICAgICAgcmV0dXJuIG5DbGlwUmVjdChtUmVuZGVyZXIsIHJlY3QubGVmdCwgcmVjdC50b3AsIHJlY3QucmlnaHQsIHJlY3QuYm90dG9tLCBvcC5uYXRpdmVJbnQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGNsaXBSZWdpb24oUmVnaW9uIHJlZ2lvbikgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBjbGlwUmVnaW9uKFJlZ2lvbiByZWdpb24sIFJlZ2lvbi5PcCBvcCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRDbGlwQm91bmRzKFJlY3QgYm91bmRzKSB7CisgICAgICAgIHJldHVybiBuR2V0Q2xpcEJvdW5kcyhtUmVuZGVyZXIsIGJvdW5kcyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiBuR2V0Q2xpcEJvdW5kcyhpbnQgcmVuZGVyZXIsIFJlY3QgYm91bmRzKTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIHF1aWNrUmVqZWN0KGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwgRWRnZVR5cGUgdHlwZSkgeworICAgICAgICByZXR1cm4gblF1aWNrUmVqZWN0KG1SZW5kZXJlciwgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tLCB0eXBlLm5hdGl2ZUludCk7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gblF1aWNrUmVqZWN0KGludCByZW5kZXJlciwgZmxvYXQgbGVmdCwgZmxvYXQgdG9wLAorICAgICAgICAgICAgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwgaW50IGVkZ2UpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gcXVpY2tSZWplY3QoUGF0aCBwYXRoLCBFZGdlVHlwZSB0eXBlKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIHF1aWNrUmVqZWN0KFJlY3RGIHJlY3QsIEVkZ2VUeXBlIHR5cGUpIHsKKyAgICAgICAgcmV0dXJuIHF1aWNrUmVqZWN0KHJlY3QubGVmdCwgcmVjdC50b3AsIHJlY3QucmlnaHQsIHJlY3QuYm90dG9tLCB0eXBlKTsKKyAgICB9CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAvLyBUcmFuc2Zvcm1hdGlvbnMKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHRyYW5zbGF0ZShmbG9hdCBkeCwgZmxvYXQgZHkpIHsKKyAgICAgICAgblRyYW5zbGF0ZShtUmVuZGVyZXIsIGR4LCBkeSk7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgblRyYW5zbGF0ZShpbnQgcmVuZGVyZXIsIGZsb2F0IGR4LCBmbG9hdCBkeSk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBza2V3KGZsb2F0IHN4LCBmbG9hdCBzeSkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCByb3RhdGUoZmxvYXQgZGVncmVlcykgeworICAgICAgICBuUm90YXRlKG1SZW5kZXJlciwgZGVncmVlcyk7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgblJvdGF0ZShpbnQgcmVuZGVyZXIsIGZsb2F0IGRlZ3JlZXMpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2NhbGUoZmxvYXQgc3gsIGZsb2F0IHN5KSB7CisgICAgICAgIG5TY2FsZShtUmVuZGVyZXIsIHN4LCBzeSk7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgblNjYWxlKGludCByZW5kZXJlciwgZmxvYXQgc3gsIGZsb2F0IHN5KTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldE1hdHJpeChNYXRyaXggbWF0cml4KSB7CisgICAgICAgIG5TZXRNYXRyaXgobVJlbmRlcmVyLCBtYXRyaXgubmF0aXZlX2luc3RhbmNlKTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuU2V0TWF0cml4KGludCByZW5kZXJlciwgaW50IG1hdHJpeCk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBnZXRNYXRyaXgoTWF0cml4IG1hdHJpeCkgeworICAgICAgICBuR2V0TWF0cml4KG1SZW5kZXJlciwgbWF0cml4Lm5hdGl2ZV9pbnN0YW5jZSk7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbkdldE1hdHJpeChpbnQgcmVuZGVyZXIsIGludCBtYXRyaXgpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgY29uY2F0KE1hdHJpeCBtYXRyaXgpIHsKKyAgICAgICAgbkNvbmNhdE1hdHJpeChtUmVuZGVyZXIsIG1hdHJpeC5uYXRpdmVfaW5zdGFuY2UpOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5Db25jYXRNYXRyaXgoaW50IHJlbmRlcmVyLCBpbnQgbWF0cml4KTsKKyAgICAKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAvLyBTdGF0ZSBtYW5hZ2VtZW50CisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IHNhdmUoKSB7CisgICAgICAgIHJldHVybiBuU2F2ZShtUmVuZGVyZXIsIDApOworICAgIH0KKyAgICAKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IHNhdmUoaW50IHNhdmVGbGFncykgeworICAgICAgICByZXR1cm4gblNhdmUobVJlbmRlcmVyLCBzYXZlRmxhZ3MpOworICAgIH0KKworICAgIHByaXZhdGUgbmF0aXZlIGludCBuU2F2ZShpbnQgcmVuZGVyZXIsIGludCBmbGFncyk7CisgICAgCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBzYXZlTGF5ZXIoUmVjdEYgYm91bmRzLCBQYWludCBwYWludCwgaW50IHNhdmVGbGFncykgeworICAgICAgICByZXR1cm4gc2F2ZUxheWVyKGJvdW5kcy5sZWZ0LCBib3VuZHMudG9wLCBib3VuZHMucmlnaHQsIGJvdW5kcy5ib3R0b20sIHBhaW50LCBzYXZlRmxhZ3MpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgc2F2ZUxheWVyKGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwgUGFpbnQgcGFpbnQsCisgICAgICAgICAgICBpbnQgc2F2ZUZsYWdzKSB7CisgICAgICAgIGludCBuYXRpdmVQYWludCA9IHBhaW50ID09IG51bGwgPyAwIDogcGFpbnQubU5hdGl2ZVBhaW50OworICAgICAgICByZXR1cm4gblNhdmVMYXllcihtUmVuZGVyZXIsIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSwgbmF0aXZlUGFpbnQsIHNhdmVGbGFncyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBuYXRpdmUgaW50IG5TYXZlTGF5ZXIoaW50IHJlbmRlcmVyLCBmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sCisgICAgICAgICAgICBpbnQgcGFpbnQsIGludCBzYXZlRmxhZ3MpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBzYXZlTGF5ZXJBbHBoYShSZWN0RiBib3VuZHMsIGludCBhbHBoYSwgaW50IHNhdmVGbGFncykgeworICAgICAgICByZXR1cm4gc2F2ZUxheWVyQWxwaGEoYm91bmRzLmxlZnQsIGJvdW5kcy50b3AsIGJvdW5kcy5yaWdodCwgYm91bmRzLmJvdHRvbSwKKyAgICAgICAgICAgICAgICBhbHBoYSwgc2F2ZUZsYWdzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IHNhdmVMYXllckFscGhhKGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwgaW50IGFscGhhLAorICAgICAgICAgICAgaW50IHNhdmVGbGFncykgeworICAgICAgICByZXR1cm4gblNhdmVMYXllckFscGhhKG1SZW5kZXJlciwgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tLCBhbHBoYSwgc2F2ZUZsYWdzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIG5hdGl2ZSBpbnQgblNhdmVMYXllckFscGhhKGludCByZW5kZXJlciwgZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwKKyAgICAgICAgICAgIGZsb2F0IGJvdHRvbSwgaW50IGFscGhhLCBpbnQgc2F2ZUZsYWdzKTsKKyAgICAKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCByZXN0b3JlKCkgeworICAgICAgICBuUmVzdG9yZShtUmVuZGVyZXIpOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5SZXN0b3JlKGludCByZW5kZXJlcik7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCByZXN0b3JlVG9Db3VudChpbnQgc2F2ZUNvdW50KSB7CisgICAgICAgIG5SZXN0b3JlVG9Db3VudChtUmVuZGVyZXIsIHNhdmVDb3VudCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuUmVzdG9yZVRvQ291bnQoaW50IHJlbmRlcmVyLCBpbnQgc2F2ZUNvdW50KTsKKyAgICAKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGdldFNhdmVDb3VudCgpIHsKKyAgICAgICAgcmV0dXJuIG5HZXRTYXZlQ291bnQobVJlbmRlcmVyKTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBuYXRpdmUgaW50IG5HZXRTYXZlQ291bnQoaW50IHJlbmRlcmVyKTsKKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIEZpbHRlcmluZworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0RHJhd0ZpbHRlcihEcmF3RmlsdGVyIGZpbHRlcikgeworICAgICAgICBtRmlsdGVyID0gZmlsdGVyOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBEcmF3RmlsdGVyIGdldERyYXdGaWx0ZXIoKSB7CisgICAgICAgIHJldHVybiBtRmlsdGVyOworICAgIH0KKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIERyYXdpbmcKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRyYXdBcmMoUmVjdEYgb3ZhbCwgZmxvYXQgc3RhcnRBbmdsZSwgZmxvYXQgc3dlZXBBbmdsZSwgYm9vbGVhbiB1c2VDZW50ZXIsCisgICAgICAgICAgICBQYWludCBwYWludCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3QVJHQihpbnQgYSwgaW50IHIsIGludCBnLCBpbnQgYikgeworICAgICAgICBkcmF3Q29sb3IoKGEgJiAweEZGKSA8PCAyNCB8IChyICYgMHhGRikgPDwgMTYgfCAoZyAmIDB4RkYpIDw8IDggfCAoYiAmIDB4RkYpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3UGF0Y2goQml0bWFwIGJpdG1hcCwgYnl0ZVtdIGNodW5rcywgUmVjdEYgZHN0LCBQYWludCBwYWludCkgeworICAgICAgICAvLyBTaGFkZXJzIGFyZSBpZ25vcmVkIHdoZW4gZHJhd2luZyBwYXRjaGVzCisgICAgICAgIGJvb2xlYW4gaGFzQ29sb3JGaWx0ZXIgPSBwYWludCAhPSBudWxsICYmIHNldHVwQ29sb3JGaWx0ZXIocGFpbnQpOworICAgICAgICBmaW5hbCBpbnQgbmF0aXZlUGFpbnQgPSBwYWludCA9PSBudWxsID8gMCA6IHBhaW50Lm1OYXRpdmVQYWludDsKKyAgICAgICAgbkRyYXdQYXRjaChtUmVuZGVyZXIsIGJpdG1hcC5tTmF0aXZlQml0bWFwLCBjaHVua3MsIGRzdC5sZWZ0LCBkc3QudG9wLAorICAgICAgICAgICAgICAgIGRzdC5yaWdodCwgZHN0LmJvdHRvbSwgbmF0aXZlUGFpbnQpOworICAgICAgICBpZiAoaGFzQ29sb3JGaWx0ZXIpIG5SZXNldE1vZGlmaWVycyhtUmVuZGVyZXIpOworICAgIH0KKworICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbkRyYXdQYXRjaChpbnQgcmVuZGVyZXIsIGludCBiaXRtYXAsIGJ5dGVbXSBjaHVua3MsIGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwKKyAgICAgICAgICAgIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sIGludCBwYWludCk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3Qml0bWFwKEJpdG1hcCBiaXRtYXAsIGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgUGFpbnQgcGFpbnQpIHsKKyAgICAgICAgLy8gU2hhZGVycyBhcmUgaWdub3JlZCB3aGVuIGRyYXdpbmcgYml0bWFwcworICAgICAgICBib29sZWFuIGhhc0NvbG9yRmlsdGVyID0gcGFpbnQgIT0gbnVsbCAmJiBzZXR1cENvbG9yRmlsdGVyKHBhaW50KTsKKyAgICAgICAgZmluYWwgaW50IG5hdGl2ZVBhaW50ID0gcGFpbnQgPT0gbnVsbCA/IDAgOiBwYWludC5tTmF0aXZlUGFpbnQ7CisgICAgICAgIG5EcmF3Qml0bWFwKG1SZW5kZXJlciwgYml0bWFwLm1OYXRpdmVCaXRtYXAsIGxlZnQsIHRvcCwgbmF0aXZlUGFpbnQpOworICAgICAgICBpZiAoaGFzQ29sb3JGaWx0ZXIpIG5SZXNldE1vZGlmaWVycyhtUmVuZGVyZXIpOworICAgIH0KKworICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbkRyYXdCaXRtYXAoaW50IHJlbmRlcmVyLCBpbnQgYml0bWFwLCBmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGludCBwYWludCk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3Qml0bWFwKEJpdG1hcCBiaXRtYXAsIE1hdHJpeCBtYXRyaXgsIFBhaW50IHBhaW50KSB7CisgICAgICAgIC8vIFNoYWRlcnMgYXJlIGlnbm9yZWQgd2hlbiBkcmF3aW5nIGJpdG1hcHMKKyAgICAgICAgYm9vbGVhbiBoYXNDb2xvckZpbHRlciA9IHBhaW50ICE9IG51bGwgJiYgc2V0dXBDb2xvckZpbHRlcihwYWludCk7CisgICAgICAgIGZpbmFsIGludCBuYXRpdmVQYWludCA9IHBhaW50ID09IG51bGwgPyAwIDogcGFpbnQubU5hdGl2ZVBhaW50OworICAgICAgICBuRHJhd0JpdG1hcChtUmVuZGVyZXIsIGJpdG1hcC5tTmF0aXZlQml0bWFwLCBtYXRyaXgubmF0aXZlX2luc3RhbmNlLCBuYXRpdmVQYWludCk7CisgICAgICAgIGlmIChoYXNDb2xvckZpbHRlcikgblJlc2V0TW9kaWZpZXJzKG1SZW5kZXJlcik7CisgICAgfQorCisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuRHJhd0JpdG1hcChpbnQgcmVuZGVyZXIsIGludCBiaXRtYXAsIGludCBtYXRyaXgsIGludCBwYWludCk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3Qml0bWFwKEJpdG1hcCBiaXRtYXAsIFJlY3Qgc3JjLCBSZWN0IGRzdCwgUGFpbnQgcGFpbnQpIHsKKyAgICAgICAgLy8gU2hhZGVycyBhcmUgaWdub3JlZCB3aGVuIGRyYXdpbmcgYml0bWFwcworICAgICAgICBib29sZWFuIGhhc0NvbG9yRmlsdGVyID0gcGFpbnQgIT0gbnVsbCAmJiBzZXR1cENvbG9yRmlsdGVyKHBhaW50KTsKKyAgICAgICAgZmluYWwgaW50IG5hdGl2ZVBhaW50ID0gcGFpbnQgPT0gbnVsbCA/IDAgOiBwYWludC5tTmF0aXZlUGFpbnQ7CisKKyAgICAgICAgaW50IGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbTsKKyAgICAgICAgaWYgKHNyYyA9PSBudWxsKSB7CisgICAgICAgICAgICBsZWZ0ID0gdG9wID0gMDsKKyAgICAgICAgICAgIHJpZ2h0ID0gYml0bWFwLmdldFdpZHRoKCk7CisgICAgICAgICAgICBib3R0b20gPSBiaXRtYXAuZ2V0SGVpZ2h0KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBsZWZ0ID0gc3JjLmxlZnQ7CisgICAgICAgICAgICByaWdodCA9IHNyYy5yaWdodDsKKyAgICAgICAgICAgIHRvcCA9IHNyYy50b3A7CisgICAgICAgICAgICBib3R0b20gPSBzcmMuYm90dG9tOworICAgICAgICB9CisKKyAgICAgICAgbkRyYXdCaXRtYXAobVJlbmRlcmVyLCBiaXRtYXAubU5hdGl2ZUJpdG1hcCwgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tLAorICAgICAgICAgICAgICAgIGRzdC5sZWZ0LCBkc3QudG9wLCBkc3QucmlnaHQsIGRzdC5ib3R0b20sIG5hdGl2ZVBhaW50KTsKKyAgICAgICAgaWYgKGhhc0NvbG9yRmlsdGVyKSBuUmVzZXRNb2RpZmllcnMobVJlbmRlcmVyKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3Qml0bWFwKEJpdG1hcCBiaXRtYXAsIFJlY3Qgc3JjLCBSZWN0RiBkc3QsIFBhaW50IHBhaW50KSB7CisgICAgICAgIC8vIFNoYWRlcnMgYXJlIGlnbm9yZWQgd2hlbiBkcmF3aW5nIGJpdG1hcHMKKyAgICAgICAgYm9vbGVhbiBoYXNDb2xvckZpbHRlciA9IHBhaW50ICE9IG51bGwgJiYgc2V0dXBDb2xvckZpbHRlcihwYWludCk7CisgICAgICAgIGZpbmFsIGludCBuYXRpdmVQYWludCA9IHBhaW50ID09IG51bGwgPyAwIDogcGFpbnQubU5hdGl2ZVBhaW50OworICAgICAgICBuRHJhd0JpdG1hcChtUmVuZGVyZXIsIGJpdG1hcC5tTmF0aXZlQml0bWFwLCBzcmMubGVmdCwgc3JjLnRvcCwgc3JjLnJpZ2h0LCBzcmMuYm90dG9tLAorICAgICAgICAgICAgICAgIGRzdC5sZWZ0LCBkc3QudG9wLCBkc3QucmlnaHQsIGRzdC5ib3R0b20sIG5hdGl2ZVBhaW50KTsKKyAgICAgICAgaWYgKGhhc0NvbG9yRmlsdGVyKSBuUmVzZXRNb2RpZmllcnMobVJlbmRlcmVyKTsKKyAgICB9CisKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5EcmF3Qml0bWFwKGludCByZW5kZXJlciwgaW50IGJpdG1hcCwKKyAgICAgICAgICAgIGZsb2F0IHNyY0xlZnQsIGZsb2F0IHNyY1RvcCwgZmxvYXQgc3JjUmlnaHQsIGZsb2F0IHNyY0JvdHRvbSwKKyAgICAgICAgICAgIGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwgaW50IHBhaW50KTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRyYXdCaXRtYXAoaW50W10gY29sb3JzLCBpbnQgb2Zmc2V0LCBpbnQgc3RyaWRlLCBmbG9hdCB4LCBmbG9hdCB5LAorICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBib29sZWFuIGhhc0FscGhhLCBQYWludCBwYWludCkgeworICAgICAgICAvLyBTaGFkZXJzIGFyZSBpZ25vcmVkIHdoZW4gZHJhd2luZyBiaXRtYXBzCisgICAgICAgIGJvb2xlYW4gaGFzQ29sb3JGaWx0ZXIgPSBwYWludCAhPSBudWxsICYmIHNldHVwQ29sb3JGaWx0ZXIocGFpbnQpOworICAgICAgICBmaW5hbCBCaXRtYXAuQ29uZmlnIGNvbmZpZyA9IGhhc0FscGhhID8gQml0bWFwLkNvbmZpZy5BUkdCXzg4ODggOiBCaXRtYXAuQ29uZmlnLlJHQl81NjU7CisgICAgICAgIGZpbmFsIEJpdG1hcCBiID0gQml0bWFwLmNyZWF0ZUJpdG1hcChjb2xvcnMsIG9mZnNldCwgc3RyaWRlLCB3aWR0aCwgaGVpZ2h0LCBjb25maWcpOworICAgICAgICBmaW5hbCBpbnQgbmF0aXZlUGFpbnQgPSBwYWludCA9PSBudWxsID8gMCA6IHBhaW50Lm1OYXRpdmVQYWludDsKKyAgICAgICAgbkRyYXdCaXRtYXAobVJlbmRlcmVyLCBiLm1OYXRpdmVCaXRtYXAsIHgsIHksIG5hdGl2ZVBhaW50KTsKKyAgICAgICAgYi5yZWN5Y2xlKCk7CisgICAgICAgIGlmIChoYXNDb2xvckZpbHRlcikgblJlc2V0TW9kaWZpZXJzKG1SZW5kZXJlcik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZHJhd0JpdG1hcChpbnRbXSBjb2xvcnMsIGludCBvZmZzZXQsIGludCBzdHJpZGUsIGludCB4LCBpbnQgeSwKKyAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgYm9vbGVhbiBoYXNBbHBoYSwgUGFpbnQgcGFpbnQpIHsKKyAgICAgICAgLy8gU2hhZGVycyBhcmUgaWdub3JlZCB3aGVuIGRyYXdpbmcgYml0bWFwcworICAgICAgICBkcmF3Qml0bWFwKGNvbG9ycywgb2Zmc2V0LCBzdHJpZGUsIChmbG9hdCkgeCwgKGZsb2F0KSB5LCB3aWR0aCwgaGVpZ2h0LCBoYXNBbHBoYSwgcGFpbnQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRyYXdCaXRtYXBNZXNoKEJpdG1hcCBiaXRtYXAsIGludCBtZXNoV2lkdGgsIGludCBtZXNoSGVpZ2h0LCBmbG9hdFtdIHZlcnRzLAorICAgICAgICAgICAgaW50IHZlcnRPZmZzZXQsIGludFtdIGNvbG9ycywgaW50IGNvbG9yT2Zmc2V0LCBQYWludCBwYWludCkgeworICAgICAgICAvLyBUT0RPOiBJbXBsZW1lbnQKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3Q2lyY2xlKGZsb2F0IGN4LCBmbG9hdCBjeSwgZmxvYXQgcmFkaXVzLCBQYWludCBwYWludCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3Q29sb3IoaW50IGNvbG9yKSB7CisgICAgICAgIGRyYXdDb2xvcihjb2xvciwgUG9ydGVyRHVmZi5Nb2RlLlNSQ19PVkVSKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3Q29sb3IoaW50IGNvbG9yLCBQb3J0ZXJEdWZmLk1vZGUgbW9kZSkgeworICAgICAgICBuRHJhd0NvbG9yKG1SZW5kZXJlciwgY29sb3IsIG1vZGUubmF0aXZlSW50KTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuRHJhd0NvbG9yKGludCByZW5kZXJlciwgaW50IGNvbG9yLCBpbnQgbW9kZSk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3TGluZShmbG9hdCBzdGFydFgsIGZsb2F0IHN0YXJ0WSwgZmxvYXQgc3RvcFgsIGZsb2F0IHN0b3BZLCBQYWludCBwYWludCkgeworICAgICAgICBtTGluZVswXSA9IHN0YXJ0WDsKKyAgICAgICAgbUxpbmVbMV0gPSBzdGFydFk7CisgICAgICAgIG1MaW5lWzJdID0gc3RvcFg7CisgICAgICAgIG1MaW5lWzNdID0gc3RvcFk7CisgICAgICAgIGRyYXdMaW5lcyhtTGluZSwgMCwgMSwgcGFpbnQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRyYXdMaW5lcyhmbG9hdFtdIHB0cywgaW50IG9mZnNldCwgaW50IGNvdW50LCBQYWludCBwYWludCkgeworICAgICAgICAvLyBUT0RPOiBJbXBsZW1lbnQKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3TGluZXMoZmxvYXRbXSBwdHMsIFBhaW50IHBhaW50KSB7CisgICAgICAgIGRyYXdMaW5lcyhwdHMsIDAsIHB0cy5sZW5ndGggLyA0LCBwYWludCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZHJhd092YWwoUmVjdEYgb3ZhbCwgUGFpbnQgcGFpbnQpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZHJhd1BhaW50KFBhaW50IHBhaW50KSB7CisgICAgICAgIGZpbmFsIFJlY3QgciA9IG1DbGlwQm91bmRzOworICAgICAgICBuR2V0Q2xpcEJvdW5kcyhtUmVuZGVyZXIsIHIpOworICAgICAgICBkcmF3UmVjdChyLmxlZnQsIHIudG9wLCByLnJpZ2h0LCByLmJvdHRvbSwgcGFpbnQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRyYXdQYXRoKFBhdGggcGF0aCwgUGFpbnQgcGFpbnQpIHsKKyAgICAgICAgYm9vbGVhbiBoYXNNb2RpZmllciA9IHNldHVwTW9kaWZpZXJzKHBhaW50KTsKKyAgICAgICAgaWYgKHBhdGguaXNTaW1wbGVQYXRoKSB7CisgICAgICAgICAgICBpZiAocGF0aC5yZWN0cyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbkRyYXdSZWN0cyhtUmVuZGVyZXIsIHBhdGgucmVjdHMubU5hdGl2ZVJlZ2lvbiwgcGFpbnQubU5hdGl2ZVBhaW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG5EcmF3UGF0aChtUmVuZGVyZXIsIHBhdGgubU5hdGl2ZVBhdGgsIHBhaW50Lm1OYXRpdmVQYWludCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGhhc01vZGlmaWVyKSBuUmVzZXRNb2RpZmllcnMobVJlbmRlcmVyKTsKKyAgICB9CisKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5EcmF3UGF0aChpbnQgcmVuZGVyZXIsIGludCBwYXRoLCBpbnQgcGFpbnQpOworICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbkRyYXdSZWN0cyhpbnQgcmVuZGVyZXIsIGludCByZWdpb24sIGludCBwYWludCk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3UGljdHVyZShQaWN0dXJlIHBpY3R1cmUpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZHJhd1BpY3R1cmUoUGljdHVyZSBwaWN0dXJlLCBSZWN0IGRzdCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3UGljdHVyZShQaWN0dXJlIHBpY3R1cmUsIFJlY3RGIGRzdCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3UG9pbnQoZmxvYXQgeCwgZmxvYXQgeSwgUGFpbnQgcGFpbnQpIHsKKyAgICAgICAgbVBvaW50WzBdID0geDsKKyAgICAgICAgbVBvaW50WzFdID0geTsKKyAgICAgICAgZHJhd1BvaW50cyhtUG9pbnQsIDAsIDEsIHBhaW50KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3UG9pbnRzKGZsb2F0W10gcHRzLCBpbnQgb2Zmc2V0LCBpbnQgY291bnQsIFBhaW50IHBhaW50KSB7CisgICAgICAgIC8vIFRPRE86IEltcGxlbWVudAorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRyYXdQb2ludHMoZmxvYXRbXSBwdHMsIFBhaW50IHBhaW50KSB7CisgICAgICAgIGRyYXdQb2ludHMocHRzLCAwLCBwdHMubGVuZ3RoIC8gMiwgcGFpbnQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRyYXdQb3NUZXh0KGNoYXJbXSB0ZXh0LCBpbnQgaW5kZXgsIGludCBjb3VudCwgZmxvYXRbXSBwb3MsIFBhaW50IHBhaW50KSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRyYXdQb3NUZXh0KFN0cmluZyB0ZXh0LCBmbG9hdFtdIHBvcywgUGFpbnQgcGFpbnQpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZHJhd1JlY3QoZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLCBQYWludCBwYWludCkgeworICAgICAgICBib29sZWFuIGhhc01vZGlmaWVyID0gc2V0dXBNb2RpZmllcnMocGFpbnQpOworICAgICAgICBuRHJhd1JlY3QobVJlbmRlcmVyLCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20sIHBhaW50Lm1OYXRpdmVQYWludCk7CisgICAgICAgIGlmIChoYXNNb2RpZmllcikgblJlc2V0TW9kaWZpZXJzKG1SZW5kZXJlcik7CisgICAgfQorCisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuRHJhd1JlY3QoaW50IHJlbmRlcmVyLCBmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sCisgICAgICAgICAgICBpbnQgcGFpbnQpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZHJhd1JlY3QoUmVjdCByLCBQYWludCBwYWludCkgeworICAgICAgICBkcmF3UmVjdChyLmxlZnQsIHIudG9wLCByLnJpZ2h0LCByLmJvdHRvbSwgcGFpbnQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRyYXdSZWN0KFJlY3RGIHIsIFBhaW50IHBhaW50KSB7CisgICAgICAgIGRyYXdSZWN0KHIubGVmdCwgci50b3AsIHIucmlnaHQsIHIuYm90dG9tLCBwYWludCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZHJhd1JHQihpbnQgciwgaW50IGcsIGludCBiKSB7CisgICAgICAgIGRyYXdDb2xvcigweEZGMDAwMDAwIHwgKHIgJiAweEZGKSA8PCAxNiB8IChnICYgMHhGRikgPDwgOCB8IChiICYgMHhGRikpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRyYXdSb3VuZFJlY3QoUmVjdEYgcmVjdCwgZmxvYXQgcngsIGZsb2F0IHJ5LCBQYWludCBwYWludCkgeworICAgICAgICAvLyBUT0RPOiBJbXBsZW1lbnQKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3VGV4dChjaGFyW10gdGV4dCwgaW50IGluZGV4LCBpbnQgY291bnQsIGZsb2F0IHgsIGZsb2F0IHksIFBhaW50IHBhaW50KSB7CisgICAgICAgIGlmICgoaW5kZXggfCBjb3VudCB8IChpbmRleCArIGNvdW50KSB8ICh0ZXh0Lmxlbmd0aCAtIGluZGV4IC0gY291bnQpKSA8IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBib29sZWFuIGhhc01vZGlmaWVyID0gc2V0dXBNb2RpZmllcnMocGFpbnQpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgbkRyYXdUZXh0KG1SZW5kZXJlciwgdGV4dCwgaW5kZXgsIGNvdW50LCB4LCB5LCBwYWludC5tQmlkaUZsYWdzLCBwYWludC5tTmF0aXZlUGFpbnQpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKGhhc01vZGlmaWVyKSBuUmVzZXRNb2RpZmllcnMobVJlbmRlcmVyKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5EcmF3VGV4dChpbnQgcmVuZGVyZXIsIGNoYXJbXSB0ZXh0LCBpbnQgaW5kZXgsIGludCBjb3VudCwgZmxvYXQgeCwgZmxvYXQgeSwKKyAgICAgICAgICAgIGludCBiaWRpRmxhZ3MsIGludCBwYWludCk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3VGV4dChDaGFyU2VxdWVuY2UgdGV4dCwgaW50IHN0YXJ0LCBpbnQgZW5kLCBmbG9hdCB4LCBmbG9hdCB5LCBQYWludCBwYWludCkgeworICAgICAgICBib29sZWFuIGhhc01vZGlmaWVyID0gc2V0dXBNb2RpZmllcnMocGFpbnQpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKHRleHQgaW5zdGFuY2VvZiBTdHJpbmcgfHwgdGV4dCBpbnN0YW5jZW9mIFNwYW5uZWRTdHJpbmcgfHwKKyAgICAgICAgICAgICAgICAgICAgdGV4dCBpbnN0YW5jZW9mIFNwYW5uYWJsZVN0cmluZykgeworICAgICAgICAgICAgICAgIG5EcmF3VGV4dChtUmVuZGVyZXIsIHRleHQudG9TdHJpbmcoKSwgc3RhcnQsIGVuZCwgeCwgeSwgcGFpbnQubUJpZGlGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhaW50Lm1OYXRpdmVQYWludCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHRleHQgaW5zdGFuY2VvZiBHcmFwaGljc09wZXJhdGlvbnMpIHsKKyAgICAgICAgICAgICAgICAoKEdyYXBoaWNzT3BlcmF0aW9ucykgdGV4dCkuZHJhd1RleHQodGhpcywgc3RhcnQsIGVuZCwgeCwgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhaW50KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY2hhcltdIGJ1ZiA9IFRlbXBvcmFyeUJ1ZmZlci5vYnRhaW4oZW5kIC0gc3RhcnQpOworICAgICAgICAgICAgICAgIFRleHRVdGlscy5nZXRDaGFycyh0ZXh0LCBzdGFydCwgZW5kLCBidWYsIDApOworICAgICAgICAgICAgICAgIG5EcmF3VGV4dChtUmVuZGVyZXIsIGJ1ZiwgMCwgZW5kIC0gc3RhcnQsIHgsIHksIHBhaW50Lm1CaWRpRmxhZ3MsIHBhaW50Lm1OYXRpdmVQYWludCk7CisgICAgICAgICAgICAgICAgVGVtcG9yYXJ5QnVmZmVyLnJlY3ljbGUoYnVmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChoYXNNb2RpZmllcikgblJlc2V0TW9kaWZpZXJzKG1SZW5kZXJlcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3VGV4dChTdHJpbmcgdGV4dCwgaW50IHN0YXJ0LCBpbnQgZW5kLCBmbG9hdCB4LCBmbG9hdCB5LCBQYWludCBwYWludCkgeworICAgICAgICBpZiAoKHN0YXJ0IHwgZW5kIHwgKGVuZCAtIHN0YXJ0KSB8ICh0ZXh0Lmxlbmd0aCgpIC0gZW5kKSkgPCAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgYm9vbGVhbiBoYXNNb2RpZmllciA9IHNldHVwTW9kaWZpZXJzKHBhaW50KTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5EcmF3VGV4dChtUmVuZGVyZXIsIHRleHQsIHN0YXJ0LCBlbmQsIHgsIHksIHBhaW50Lm1CaWRpRmxhZ3MsIHBhaW50Lm1OYXRpdmVQYWludCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoaGFzTW9kaWZpZXIpIG5SZXNldE1vZGlmaWVycyhtUmVuZGVyZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuRHJhd1RleHQoaW50IHJlbmRlcmVyLCBTdHJpbmcgdGV4dCwgaW50IHN0YXJ0LCBpbnQgZW5kLCBmbG9hdCB4LCBmbG9hdCB5LAorICAgICAgICAgICAgaW50IGJpZGlGbGFncywgaW50IHBhaW50KTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRyYXdUZXh0KFN0cmluZyB0ZXh0LCBmbG9hdCB4LCBmbG9hdCB5LCBQYWludCBwYWludCkgeworICAgICAgICBib29sZWFuIGhhc01vZGlmaWVyID0gc2V0dXBNb2RpZmllcnMocGFpbnQpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgbkRyYXdUZXh0KG1SZW5kZXJlciwgdGV4dCwgMCwgdGV4dC5sZW5ndGgoKSwgeCwgeSwgcGFpbnQubUJpZGlGbGFncywKKyAgICAgICAgICAgICAgICAgICAgcGFpbnQubU5hdGl2ZVBhaW50KTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChoYXNNb2RpZmllcikgblJlc2V0TW9kaWZpZXJzKG1SZW5kZXJlcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3VGV4dE9uUGF0aChjaGFyW10gdGV4dCwgaW50IGluZGV4LCBpbnQgY291bnQsIFBhdGggcGF0aCwgZmxvYXQgaE9mZnNldCwKKyAgICAgICAgICAgIGZsb2F0IHZPZmZzZXQsIFBhaW50IHBhaW50KSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRyYXdUZXh0T25QYXRoKFN0cmluZyB0ZXh0LCBQYXRoIHBhdGgsIGZsb2F0IGhPZmZzZXQsIGZsb2F0IHZPZmZzZXQsIFBhaW50IHBhaW50KSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRyYXdUZXh0UnVuKGNoYXJbXSB0ZXh0LCBpbnQgaW5kZXgsIGludCBjb3VudCwgaW50IGNvbnRleHRJbmRleCwgaW50IGNvbnRleHRDb3VudCwKKyAgICAgICAgICAgIGZsb2F0IHgsIGZsb2F0IHksIGludCBkaXIsIFBhaW50IHBhaW50KSB7CisgICAgICAgIGlmICgoaW5kZXggfCBjb3VudCB8IHRleHQubGVuZ3RoIC0gaW5kZXggLSBjb3VudCkgPCAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIGlmIChkaXIgIT0gRElSRUNUSU9OX0xUUiAmJiBkaXIgIT0gRElSRUNUSU9OX1JUTCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5rbm93biBkaXJlY3Rpb246ICIgKyBkaXIpOworICAgICAgICB9CisKKyAgICAgICAgYm9vbGVhbiBoYXNNb2RpZmllciA9IHNldHVwTW9kaWZpZXJzKHBhaW50KTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5EcmF3VGV4dFJ1bihtUmVuZGVyZXIsIHRleHQsIGluZGV4LCBjb3VudCwgY29udGV4dEluZGV4LCBjb250ZXh0Q291bnQsIHgsIHksIGRpciwKKyAgICAgICAgICAgICAgICAgICAgcGFpbnQubU5hdGl2ZVBhaW50KTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChoYXNNb2RpZmllcikgblJlc2V0TW9kaWZpZXJzKG1SZW5kZXJlcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5EcmF3VGV4dFJ1bihpbnQgcmVuZGVyZXIsIGNoYXJbXSB0ZXh0LCBpbnQgaW5kZXgsIGludCBjb3VudCwKKyAgICAgICAgICAgIGludCBjb250ZXh0SW5kZXgsIGludCBjb250ZXh0Q291bnQsIGZsb2F0IHgsIGZsb2F0IHksIGludCBkaXIsIGludCBuYXRpdmVQYWludCk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3VGV4dFJ1bihDaGFyU2VxdWVuY2UgdGV4dCwgaW50IHN0YXJ0LCBpbnQgZW5kLCBpbnQgY29udGV4dFN0YXJ0LCBpbnQgY29udGV4dEVuZCwKKyAgICAgICAgICAgIGZsb2F0IHgsIGZsb2F0IHksIGludCBkaXIsIFBhaW50IHBhaW50KSB7CisgICAgICAgIGlmICgoc3RhcnQgfCBlbmQgfCBlbmQgLSBzdGFydCB8IHRleHQubGVuZ3RoKCkgLSBlbmQpIDwgMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2xlYW4gaGFzTW9kaWZpZXIgPSBzZXR1cE1vZGlmaWVycyhwYWludCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgZmxhZ3MgPSBkaXIgPT0gMCA/IDAgOiAxOworICAgICAgICAgICAgaWYgKHRleHQgaW5zdGFuY2VvZiBTdHJpbmcgfHwgdGV4dCBpbnN0YW5jZW9mIFNwYW5uZWRTdHJpbmcgfHwKKyAgICAgICAgICAgICAgICAgICAgdGV4dCBpbnN0YW5jZW9mIFNwYW5uYWJsZVN0cmluZykgeworICAgICAgICAgICAgICAgIG5EcmF3VGV4dFJ1bihtUmVuZGVyZXIsIHRleHQudG9TdHJpbmcoKSwgc3RhcnQsIGVuZCwgY29udGV4dFN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dEVuZCwgeCwgeSwgZmxhZ3MsIHBhaW50Lm1OYXRpdmVQYWludCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHRleHQgaW5zdGFuY2VvZiBHcmFwaGljc09wZXJhdGlvbnMpIHsKKyAgICAgICAgICAgICAgICAoKEdyYXBoaWNzT3BlcmF0aW9ucykgdGV4dCkuZHJhd1RleHRSdW4odGhpcywgc3RhcnQsIGVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHRTdGFydCwgY29udGV4dEVuZCwgeCwgeSwgZmxhZ3MsIHBhaW50KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW50IGNvbnRleHRMZW4gPSBjb250ZXh0RW5kIC0gY29udGV4dFN0YXJ0OworICAgICAgICAgICAgICAgIGludCBsZW4gPSBlbmQgLSBzdGFydDsKKyAgICAgICAgICAgICAgICBjaGFyW10gYnVmID0gVGVtcG9yYXJ5QnVmZmVyLm9idGFpbihjb250ZXh0TGVuKTsKKyAgICAgICAgICAgICAgICBUZXh0VXRpbHMuZ2V0Q2hhcnModGV4dCwgY29udGV4dFN0YXJ0LCBjb250ZXh0RW5kLCBidWYsIDApOworICAgICAgICAgICAgICAgIG5EcmF3VGV4dFJ1bihtUmVuZGVyZXIsIGJ1Ziwgc3RhcnQgLSBjb250ZXh0U3RhcnQsIGxlbiwgMCwgY29udGV4dExlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHgsIHksIGZsYWdzLCBwYWludC5tTmF0aXZlUGFpbnQpOworICAgICAgICAgICAgICAgIFRlbXBvcmFyeUJ1ZmZlci5yZWN5Y2xlKGJ1Zik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoaGFzTW9kaWZpZXIpIG5SZXNldE1vZGlmaWVycyhtUmVuZGVyZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuRHJhd1RleHRSdW4oaW50IHJlbmRlcmVyLCBTdHJpbmcgdGV4dCwgaW50IHN0YXJ0LCBpbnQgZW5kLAorICAgICAgICAgICAgaW50IGNvbnRleHRTdGFydCwgaW50IGNvbnRleHRFbmQsIGZsb2F0IHgsIGZsb2F0IHksIGludCBmbGFncywgaW50IG5hdGl2ZVBhaW50KTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRyYXdWZXJ0aWNlcyhWZXJ0ZXhNb2RlIG1vZGUsIGludCB2ZXJ0ZXhDb3VudCwgZmxvYXRbXSB2ZXJ0cywgaW50IHZlcnRPZmZzZXQsCisgICAgICAgICAgICBmbG9hdFtdIHRleHMsIGludCB0ZXhPZmZzZXQsIGludFtdIGNvbG9ycywgaW50IGNvbG9yT2Zmc2V0LCBzaG9ydFtdIGluZGljZXMsCisgICAgICAgICAgICBpbnQgaW5kZXhPZmZzZXQsIGludCBpbmRleENvdW50LCBQYWludCBwYWludCkgeworICAgICAgICAvLyBUT0RPOiBJbXBsZW1lbnQKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gc2V0dXBNb2RpZmllcnMoUGFpbnQgcGFpbnQpIHsKKyAgICAgICAgYm9vbGVhbiBoYXNNb2RpZmllciA9IGZhbHNlOworCisgICAgICAgIGlmIChwYWludC5oYXNTaGFkb3cpIHsKKyAgICAgICAgICAgIG5TZXR1cFNoYWRvdyhtUmVuZGVyZXIsIHBhaW50LnNoYWRvd1JhZGl1cywgcGFpbnQuc2hhZG93RHgsIHBhaW50LnNoYWRvd0R5LAorICAgICAgICAgICAgICAgICAgICBwYWludC5zaGFkb3dDb2xvcik7CisgICAgICAgICAgICBoYXNNb2RpZmllciA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBTaGFkZXIgc2hhZGVyID0gcGFpbnQuZ2V0U2hhZGVyKCk7CisgICAgICAgIGlmIChzaGFkZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgblNldHVwU2hhZGVyKG1SZW5kZXJlciwgc2hhZGVyLm5hdGl2ZV9zaGFkZXIpOworICAgICAgICAgICAgaGFzTW9kaWZpZXIgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgQ29sb3JGaWx0ZXIgZmlsdGVyID0gcGFpbnQuZ2V0Q29sb3JGaWx0ZXIoKTsKKyAgICAgICAgaWYgKGZpbHRlciAhPSBudWxsKSB7CisgICAgICAgICAgICBuU2V0dXBDb2xvckZpbHRlcihtUmVuZGVyZXIsIGZpbHRlci5uYXRpdmVDb2xvckZpbHRlcik7CisgICAgICAgICAgICBoYXNNb2RpZmllciA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gaGFzTW9kaWZpZXI7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIHNldHVwQ29sb3JGaWx0ZXIoUGFpbnQgcGFpbnQpIHsKKyAgICAgICAgZmluYWwgQ29sb3JGaWx0ZXIgZmlsdGVyID0gcGFpbnQuZ2V0Q29sb3JGaWx0ZXIoKTsKKyAgICAgICAgaWYgKGZpbHRlciAhPSBudWxsKSB7CisgICAgICAgICAgICBuU2V0dXBDb2xvckZpbHRlcihtUmVuZGVyZXIsIGZpbHRlci5uYXRpdmVDb2xvckZpbHRlcik7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7ICAgICAgICAKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuU2V0dXBTaGFkZXIoaW50IHJlbmRlcmVyLCBpbnQgc2hhZGVyKTsKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5TZXR1cENvbG9yRmlsdGVyKGludCByZW5kZXJlciwgaW50IGNvbG9yRmlsdGVyKTsKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5TZXR1cFNoYWRvdyhpbnQgcmVuZGVyZXIsIGZsb2F0IHJhZGl1cywgZmxvYXQgZHgsIGZsb2F0IGR5LCBpbnQgY29sb3IpOworCisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuUmVzZXRNb2RpZmllcnMoaW50IHJlbmRlcmVyKTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvSGFyZHdhcmVSZW5kZXJlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9IYXJkd2FyZVJlbmRlcmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzJkODEyMwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvSGFyZHdhcmVSZW5kZXJlci5qYXZhCkBAIC0wLDAgKzEsNTc1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIGFuZHJvaWQudmlldzsKKworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOworaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0wxMDsKK2ltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMMTE7CitpbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTENvbmZpZzsKK2ltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMQ29udGV4dDsKK2ltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMRGlzcGxheTsKK2ltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMU3VyZmFjZTsKK2ltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5vcGVuZ2xlcy5HTDsKKworLyoqCisgKiBJbnRlcmZhY2UgZm9yIHJlbmRlcmluZyBhIFZpZXdSb290IHVzaW5nIGhhcmR3YXJlIGFjY2VsZXJhdGlvbi4KKyAqIAorICogQGhpZGUKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEhhcmR3YXJlUmVuZGVyZXIgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIkhhcmR3YXJlUmVuZGVyZXIiOworCisgICAgcHJpdmF0ZSBib29sZWFuIG1FbmFibGVkOworICAgIHByaXZhdGUgYm9vbGVhbiBtUmVxdWVzdGVkID0gdHJ1ZTsKKworICAgIC8qKgorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIGhhcmR3YXJlIGFjY2VsZXJhdGlvbiBpcyBhdmFpbGFibGUgdW5kZXIgYW55IGZvcm0gZm9yCisgICAgICogdGhlIHZpZXcgaGllcmFyY2h5LgorICAgICAqIAorICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgdmlldyBoaWVyYXJjaHkgY2FuIHBvdGVudGlhbGx5IGJlIGhhcmR3YXJlIGFjY2VsZXJhdGVkLAorICAgICAqICAgICAgICAgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzQXZhaWxhYmxlKCkgeworICAgICAgICByZXR1cm4gR0xFUzIwQ2FudmFzLmlzQXZhaWxhYmxlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVzdHJveXMgdGhlIGhhcmR3YXJlIHJlbmRlcmluZyBjb250ZXh0LgorICAgICAqLworICAgIGFic3RyYWN0IHZvaWQgZGVzdHJveSgpOworCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZXMgdGhlIGhhcmR3YXJlIHJlbmRlcmVyIGZvciB0aGUgc3BlY2lmaWVkIHN1cmZhY2UuCisgICAgICogCisgICAgICogQHBhcmFtIGhvbGRlciBUaGUgaG9sZGVyIGZvciB0aGUgc3VyZmFjZSB0byBoYXJkd2FyZSBhY2NlbGVyYXRlLgorICAgICAqIAorICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgaW5pdGlhbGl6YXRpb24gd2FzIHN1Y2Nlc3NmdWwsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBhYnN0cmFjdCBib29sZWFuIGluaXRpYWxpemUoU3VyZmFjZUhvbGRlciBob2xkZXIpOworCisgICAgLyoqCisgICAgICogU2V0dXAgdGhlIGhhcmR3YXJlIHJlbmRlcmVyIGZvciBkcmF3aW5nLiBUaGlzIGlzIGNhbGxlZCBmb3IgZXZlcnkKKyAgICAgKiBmcmFtZSB0byBkcmF3LgorICAgICAqIAorICAgICAqIEBwYXJhbSB3aWR0aCBXaWR0aCBvZiB0aGUgZHJhd2luZyBzdXJmYWNlLgorICAgICAqIEBwYXJhbSBoZWlnaHQgSGVpZ2h0IG9mIHRoZSBkcmF3aW5nIHN1cmZhY2UuCisgICAgICovCisgICAgYWJzdHJhY3Qgdm9pZCBzZXR1cChpbnQgd2lkdGgsIGludCBoZWlnaHQpOworCisgICAgLyoqCisgICAgICogRHJhd3MgdGhlIHNwZWNpZmllZCB2aWV3LgorICAgICAqIAorICAgICAqIEBwYXJhbSB2aWV3IFRoZSB2aWV3IHRvIGRyYXcuCisgICAgICogQHBhcmFtIGF0dGFjaEluZm8gQXR0YWNoSW5mbyB0aWVkIHRvIHRoZSBzcGVjaWZpZWQgdmlldy4KKyAgICAgKi8KKyAgICBhYnN0cmFjdCB2b2lkIGRyYXcoVmlldyB2aWV3LCBWaWV3LkF0dGFjaEluZm8gYXR0YWNoSW5mbywgaW50IHlPZmZzZXQpOworCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZXMgdGhlIGhhcmR3YXJlIHJlbmRlcmVyIGZvciB0aGUgc3BlY2lmaWVkIHN1cmZhY2UgYW5kIHNldHVwIHRoZQorICAgICAqIHJlbmRlcmVyIGZvciBkcmF3aW5nLCBpZiBuZWVkZWQuIFRoaXMgaXMgaW52b2tlZCB3aGVuIHRoZSBWaWV3Um9vdCBoYXMKKyAgICAgKiBwb3RlbnRpYWxseSBsb3N0IHRoZSBoYXJkd2FyZSByZW5kZXJlci4gVGhlIGhhcmR3YXJlIHJlbmRlcmVyIHNob3VsZCBiZQorICAgICAqIHJlaW5pdGlhbGl6ZWQgYW5kIHNldHVwIHdoZW4gdGhlIHJlbmRlciB7QGxpbmsgI2lzUmVxdWVzdGVkKCl9IGFuZAorICAgICAqIHtAbGluayAjaXNFbmFibGVkKCl9LgorICAgICAqIAorICAgICAqIEBwYXJhbSB3aWR0aCBUaGUgd2lkdGggb2YgdGhlIGRyYXdpbmcgc3VyZmFjZS4KKyAgICAgKiBAcGFyYW0gaGVpZ2h0IFRoZSBoZWlnaHQgb2YgdGhlIGRyYXdpbmcgc3VyZmFjZS4KKyAgICAgKiBAcGFyYW0gYXR0YWNoSW5mbyBUaGUgCisgICAgICogQHBhcmFtIGhvbGRlcgorICAgICAqLworICAgIHZvaWQgaW5pdGlhbGl6ZUlmTmVlZGVkKGludCB3aWR0aCwgaW50IGhlaWdodCwgVmlldy5BdHRhY2hJbmZvIGF0dGFjaEluZm8sCisgICAgICAgICAgICBTdXJmYWNlSG9sZGVyIGhvbGRlcikgeworICAgICAgICBpZiAoaXNSZXF1ZXN0ZWQoKSkgeworICAgICAgICAgICAgLy8gV2UgbG9zdCB0aGUgZ2wgY29udGV4dCwgc28gcmVjcmVhdGUgaXQuCisgICAgICAgICAgICBpZiAoIWlzRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgaWYgKGluaXRpYWxpemUoaG9sZGVyKSkgeworICAgICAgICAgICAgICAgICAgICBzZXR1cCh3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gICAgICAgIAorICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBoYXJkd2FyZSByZW5kZXJlciB1c2luZyBPcGVuR0wuCisgICAgICogCisgICAgICogQHBhcmFtIGdsVmVyc2lvbiBUaGUgdmVyc2lvbiBvZiBPcGVuR0wgdG8gdXNlICgxIGZvciBPcGVuR0wgMSwgMTEgZm9yIE9wZW5HTCAxLjEsIGV0Yy4pCisgICAgICogQHBhcmFtIHRyYW5zbHVjZW50IFRydWUgaWYgdGhlIHN1cmZhY2UgaXMgdHJhbnNsdWNlbnQsIGZhbHNlIG90aGVyd2lzZQorICAgICAqIAorICAgICAqIEByZXR1cm4gQSBoYXJkd2FyZSByZW5kZXJlciBiYWNrZWQgYnkgT3BlbkdMLgorICAgICAqLworICAgIHN0YXRpYyBIYXJkd2FyZVJlbmRlcmVyIGNyZWF0ZUdsUmVuZGVyZXIoaW50IGdsVmVyc2lvbiwgYm9vbGVhbiB0cmFuc2x1Y2VudCkgeworICAgICAgICBzd2l0Y2ggKGdsVmVyc2lvbikgeworICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgIHJldHVybiBHbDIwUmVuZGVyZXIuY3JlYXRlKHRyYW5zbHVjZW50KTsKKyAgICAgICAgfQorICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbmtub3duIEdMIHZlcnNpb246ICIgKyBnbFZlcnNpb24pOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIGhhcmR3YXJlIGFjY2VsZXJhdGlvbiBpcyBjdXJyZW50bHkgZW5hYmxlZC4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIFRydWUgaWYgaGFyZHdhcmUgYWNjZWxlcmF0aW9uIGlzIGluIHVzZSwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqLworICAgIGJvb2xlYW4gaXNFbmFibGVkKCkgeworICAgICAgICByZXR1cm4gbUVuYWJsZWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgaGFyZHdhcmUgYWNjZWxlcmF0aW9uIGlzIGN1cnJlbnRseSBlbmFibGVkLgorICAgICAqIAorICAgICAqIEBwYXJhbSBlbmFibGVkIFRydWUgaWYgdGhlIGhhcmR3YXJlIHJlbmRlcmVyIGlzIGluIHVzZSwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqLworICAgIHZvaWQgc2V0RW5hYmxlZChib29sZWFuIGVuYWJsZWQpIHsKKyAgICAgICAgbUVuYWJsZWQgPSBlbmFibGVkOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIGhhcmR3YXJlIGFjY2VsZXJhdGlvbiBpcyBjdXJyZW50bHkgcmVxdWVzdCBidXQgbm90CisgICAgICogbmVjZXNzYXJpbHkgZW5hYmxlZCB5ZXQuCisgICAgICogCisgICAgICogQHJldHVybiBUcnVlIGlmIHJlcXVlc3RlZCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqLworICAgIGJvb2xlYW4gaXNSZXF1ZXN0ZWQoKSB7CisgICAgICAgIHJldHVybiBtUmVxdWVzdGVkOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIGhhcmR3YXJlIGFjY2VsZXJhdGlvbiBpcyBjdXJyZW50bHkgcmVxdWVzdCBidXQgbm90CisgICAgICogbmVjZXNzYXJpbHkgZW5hYmxlZCB5ZXQuCisgICAgICogCisgICAgICogQHJldHVybiBUcnVlIHRvIHJlcXVlc3QgaGFyZHdhcmUgYWNjZWxlcmF0aW9uLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICovCisgICAgdm9pZCBzZXRSZXF1ZXN0ZWQoYm9vbGVhbiByZXF1ZXN0ZWQpIHsKKyAgICAgICAgbVJlcXVlc3RlZCA9IHJlcXVlc3RlZDsKKyAgICB9CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncyh7ImRlcHJlY2F0aW9uIn0pCisgICAgc3RhdGljIGFic3RyYWN0IGNsYXNzIEdsUmVuZGVyZXIgZXh0ZW5kcyBIYXJkd2FyZVJlbmRlcmVyIHsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVHTF9DT05URVhUX0NMSUVOVF9WRVJTSU9OID0gMHgzMDk4OworCisgICAgICAgIHN0YXRpYyBFR0xDb250ZXh0IHNFZ2xDb250ZXh0OworICAgICAgICBzdGF0aWMgRUdMMTAgc0VnbDsKKyAgICAgICAgc3RhdGljIEVHTERpc3BsYXkgc0VnbERpc3BsYXk7CisgICAgICAgIHN0YXRpYyBFR0xDb25maWcgc0VnbENvbmZpZzsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBUaHJlYWQgc0VnbFRocmVhZDsgICAgICAgIAorCisgICAgICAgIEVHTFN1cmZhY2UgbUVnbFN1cmZhY2U7CisgICAgICAgIAorICAgICAgICBHTCBtR2w7CisgICAgICAgIEdMRVMyMENhbnZhcyBtQ2FudmFzOworCisgICAgICAgIGZpbmFsIGludCBtR2xWZXJzaW9uOworICAgICAgICBmaW5hbCBib29sZWFuIG1UcmFuc2x1Y2VudDsKKworICAgICAgICBwcml2YXRlIGJvb2xlYW4gbURlc3Ryb3llZDsKKworICAgICAgICBHbFJlbmRlcmVyKGludCBnbFZlcnNpb24sIGJvb2xlYW4gdHJhbnNsdWNlbnQpIHsKKyAgICAgICAgICAgIG1HbFZlcnNpb24gPSBnbFZlcnNpb247CisgICAgICAgICAgICBtVHJhbnNsdWNlbnQgPSB0cmFuc2x1Y2VudDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDaGVja3MgZm9yIE9wZW5HTCBlcnJvcnMuIElmIGFuIGVycm9yIGhhcyBvY2N1cmVkLCB7QGxpbmsgI2Rlc3Ryb3koKX0KKyAgICAgICAgICogaXMgaW52b2tlZCBhbmQgdGhlIHJlcXVlc3RlZCBmbGFnIGlzIHR1cm5lZCBvZmYuIFRoZSBlcnJvciBjb2RlIGlzCisgICAgICAgICAqIGFsc28gbG9nZ2VkIGFzIGEgd2FybmluZy4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgY2hlY2tFcnJvcnMoKSB7CisgICAgICAgICAgICBpZiAoaXNFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICBpbnQgZXJyb3IgPSBzRWdsLmVnbEdldEVycm9yKCk7CisgICAgICAgICAgICAgICAgaWYgKGVycm9yICE9IEVHTDEwLkVHTF9TVUNDRVNTKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHNvbWV0aGluZyBiYWQgaGFzIGhhcHBlbmVkIHJldmVydCB0bworICAgICAgICAgICAgICAgICAgICAvLyBub3JtYWwgcmVuZGVyaW5nLgorICAgICAgICAgICAgICAgICAgICBkZXN0cm95KCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChlcnJvciAhPSBFR0wxMS5FR0xfQ09OVEVYVF9MT1NUKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSdsbCB0cnkgYWdhaW4gaWYgaXQgd2FzIGNvbnRleHQgbG9zdAorICAgICAgICAgICAgICAgICAgICAgICAgc2V0UmVxdWVzdGVkKGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiT3BlbkdMIGVycm9yOiAiICsgZXJyb3IpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIGJvb2xlYW4gaW5pdGlhbGl6ZShTdXJmYWNlSG9sZGVyIGhvbGRlcikgeworICAgICAgICAgICAgaWYgKGlzUmVxdWVzdGVkKCkgJiYgIWlzRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgaW5pdGlhbGl6ZUVnbCgpOworICAgICAgICAgICAgICAgIG1HbCA9IGNyZWF0ZUVnbFN1cmZhY2UoaG9sZGVyKTsKKyAgICAgICAgICAgICAgICBtRGVzdHJveWVkID0gZmFsc2U7CisKKyAgICAgICAgICAgICAgICBpZiAobUdsICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGVyciA9IHNFZ2wuZWdsR2V0RXJyb3IoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBFR0wxMC5FR0xfU1VDQ0VTUykgeworICAgICAgICAgICAgICAgICAgICAgICAgZGVzdHJveSgpOworICAgICAgICAgICAgICAgICAgICAgICAgc2V0UmVxdWVzdGVkKGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQ2FudmFzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0cm95Q2FudmFzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBtQ2FudmFzID0gY3JlYXRlQ2FudmFzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUNhbnZhcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0RW5hYmxlZCh0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgIkhhcmR3YXJlIGFjY2VsZXJhdGVkIENhbnZhcyBjb3VsZCBub3QgYmUgY3JlYXRlZCIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1DYW52YXMgIT0gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgZGVzdHJveUNhbnZhcygpIHsKKyAgICAgICAgICAgIG1DYW52YXMuZGVzdHJveSgpOworICAgICAgICAgICAgbUNhbnZhcyA9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICBhYnN0cmFjdCBHTEVTMjBDYW52YXMgY3JlYXRlQ2FudmFzKCk7CisKKyAgICAgICAgdm9pZCBpbml0aWFsaXplRWdsKCkgeworICAgICAgICAgICAgaWYgKHNFZ2xDb250ZXh0ICE9IG51bGwpIHJldHVybjsKKworICAgICAgICAgICAgc0VnbFRocmVhZCA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCk7CisgICAgICAgICAgICBzRWdsID0gKEVHTDEwKSBFR0xDb250ZXh0LmdldEVHTCgpOworICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBHZXQgdG8gdGhlIGRlZmF1bHQgZGlzcGxheS4KKyAgICAgICAgICAgIHNFZ2xEaXNwbGF5ID0gc0VnbC5lZ2xHZXREaXNwbGF5KEVHTDEwLkVHTF9ERUZBVUxUX0RJU1BMQVkpOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoc0VnbERpc3BsYXkgPT0gRUdMMTAuRUdMX05PX0RJU1BMQVkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiZWdsR2V0RGlzcGxheSBmYWlsZWQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gV2UgY2FuIG5vdyBpbml0aWFsaXplIEVHTCBmb3IgdGhhdCBkaXNwbGF5CisgICAgICAgICAgICBpbnRbXSB2ZXJzaW9uID0gbmV3IGludFsyXTsKKyAgICAgICAgICAgIGlmICghc0VnbC5lZ2xJbml0aWFsaXplKHNFZ2xEaXNwbGF5LCB2ZXJzaW9uKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJlZ2xJbml0aWFsaXplIGZhaWxlZCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc0VnbENvbmZpZyA9IGdldENvbmZpZ0Nob29zZXIobUdsVmVyc2lvbikuY2hvb3NlQ29uZmlnKHNFZ2wsIHNFZ2xEaXNwbGF5KTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICogQ3JlYXRlIGFuIEVHTCBjb250ZXh0LiBXZSB3YW50IHRvIGRvIHRoaXMgYXMgcmFyZWx5IGFzIHdlIGNhbiwgYmVjYXVzZSBhbgorICAgICAgICAgICAgKiBFR0wgY29udGV4dCBpcyBhIHNvbWV3aGF0IGhlYXZ5IG9iamVjdC4KKyAgICAgICAgICAgICovCisgICAgICAgICAgICBzRWdsQ29udGV4dCA9IGNyZWF0ZUNvbnRleHQoc0VnbCwgc0VnbERpc3BsYXksIHNFZ2xDb25maWcpOworICAgICAgICB9CisKKyAgICAgICAgR0wgY3JlYXRlRWdsU3VyZmFjZShTdXJmYWNlSG9sZGVyIGhvbGRlcikgeworICAgICAgICAgICAgLy8gQ2hlY2sgcHJlY29uZGl0aW9ucy4KKyAgICAgICAgICAgIGlmIChzRWdsID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiZWdsIG5vdCBpbml0aWFsaXplZCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNFZ2xEaXNwbGF5ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiZWdsRGlzcGxheSBub3QgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzRWdsQ29uZmlnID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigibUVnbENvbmZpZyBub3QgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChUaHJlYWQuY3VycmVudFRocmVhZCgpICE9IHNFZ2xUaHJlYWQpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJIYXJkd2FyZVJlbmRlcmVyIGNhbm5vdCBiZSB1c2VkICIgCisgICAgICAgICAgICAgICAgICAgICAgICArICJmcm9tIG11bHRpcGxlIHRocmVhZHMiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqICBUaGUgd2luZG93IHNpemUgaGFzIGNoYW5nZWQsIHNvIHdlIG5lZWQgdG8gY3JlYXRlIGEgbmV3CisgICAgICAgICAgICAgKiAgc3VyZmFjZS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKG1FZ2xTdXJmYWNlICE9IG51bGwgJiYgbUVnbFN1cmZhY2UgIT0gRUdMMTAuRUdMX05PX1NVUkZBQ0UpIHsKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIFVuYmluZCBhbmQgZGVzdHJveSB0aGUgb2xkIEVHTCBzdXJmYWNlLCBpZgorICAgICAgICAgICAgICAgICAqIHRoZXJlIGlzIG9uZS4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBzRWdsLmVnbE1ha2VDdXJyZW50KHNFZ2xEaXNwbGF5LCBFR0wxMC5FR0xfTk9fU1VSRkFDRSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9OT19TVVJGQUNFLCBFR0wxMC5FR0xfTk9fQ09OVEVYVCk7CisgICAgICAgICAgICAgICAgc0VnbC5lZ2xEZXN0cm95U3VyZmFjZShzRWdsRGlzcGxheSwgbUVnbFN1cmZhY2UpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBDcmVhdGUgYW4gRUdMIHN1cmZhY2Ugd2UgY2FuIHJlbmRlciBpbnRvLgorICAgICAgICAgICAgbUVnbFN1cmZhY2UgPSBzRWdsLmVnbENyZWF0ZVdpbmRvd1N1cmZhY2Uoc0VnbERpc3BsYXksIHNFZ2xDb25maWcsIGhvbGRlciwgbnVsbCk7CisKKyAgICAgICAgICAgIGlmIChtRWdsU3VyZmFjZSA9PSBudWxsIHx8IG1FZ2xTdXJmYWNlID09IEVHTDEwLkVHTF9OT19TVVJGQUNFKSB7CisgICAgICAgICAgICAgICAgaW50IGVycm9yID0gc0VnbC5lZ2xHZXRFcnJvcigpOworICAgICAgICAgICAgICAgIGlmIChlcnJvciA9PSBFR0wxMC5FR0xfQkFEX05BVElWRV9XSU5ET1cpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmUoIkVnbEhlbHBlciIsICJjcmVhdGVXaW5kb3dTdXJmYWNlIHJldHVybmVkIEVHTF9CQURfTkFUSVZFX1dJTkRPVy4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJjcmVhdGVXaW5kb3dTdXJmYWNlIGZhaWxlZCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogQmVmb3JlIHdlIGNhbiBpc3N1ZSBHTCBjb21tYW5kcywgd2UgbmVlZCB0byBtYWtlIHN1cmUKKyAgICAgICAgICAgICAqIHRoZSBjb250ZXh0IGlzIGN1cnJlbnQgYW5kIGJvdW5kIHRvIGEgc3VyZmFjZS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKCFzRWdsLmVnbE1ha2VDdXJyZW50KHNFZ2xEaXNwbGF5LCBtRWdsU3VyZmFjZSwgbUVnbFN1cmZhY2UsIHNFZ2xDb250ZXh0KSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJlZ2xNYWtlQ3VycmVudCBmYWlsZWQiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHNFZ2xDb250ZXh0LmdldEdMKCk7CisgICAgICAgIH0KKworICAgICAgICBFR0xDb250ZXh0IGNyZWF0ZUNvbnRleHQoRUdMMTAgZWdsLCBFR0xEaXNwbGF5IGVnbERpc3BsYXksIEVHTENvbmZpZyBlZ2xDb25maWcpIHsKKyAgICAgICAgICAgIGludFtdIGF0dHJpYl9saXN0ID0geyBFR0xfQ09OVEVYVF9DTElFTlRfVkVSU0lPTiwgbUdsVmVyc2lvbiwgRUdMMTAuRUdMX05PTkUgfTsKKworICAgICAgICAgICAgcmV0dXJuIGVnbC5lZ2xDcmVhdGVDb250ZXh0KGVnbERpc3BsYXksIGVnbENvbmZpZywgRUdMMTAuRUdMX05PX0NPTlRFWFQsCisgICAgICAgICAgICAgICAgICAgIG1HbFZlcnNpb24gIT0gMCA/IGF0dHJpYl9saXN0IDogbnVsbCk7ICAgICAgICAgICAgCisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgdm9pZCBpbml0aWFsaXplSWZOZWVkZWQoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBWaWV3LkF0dGFjaEluZm8gYXR0YWNoSW5mbywKKyAgICAgICAgICAgICAgICBTdXJmYWNlSG9sZGVyIGhvbGRlcikgeworICAgICAgICAgICAgaWYgKGlzUmVxdWVzdGVkKCkpIHsKKyAgICAgICAgICAgICAgICBjaGVja0Vycm9ycygpOworICAgICAgICAgICAgICAgIHN1cGVyLmluaXRpYWxpemVJZk5lZWRlZCh3aWR0aCwgaGVpZ2h0LCBhdHRhY2hJbmZvLCBob2xkZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgdm9pZCBkZXN0cm95KCkgeworICAgICAgICAgICAgaWYgKCFpc0VuYWJsZWQoKSB8fCBtRGVzdHJveWVkKSByZXR1cm47CisKKyAgICAgICAgICAgIG1EZXN0cm95ZWQgPSB0cnVlOworCisgICAgICAgICAgICBjaGVja0N1cnJlbnQoKTsKKyAgICAgICAgICAgIC8vIERlc3Ryb3kgdGhlIENhbnZhcyBmaXJzdCBpbiBjYXNlIGl0IG5lZWRzIHRvIHVzZSBhIEdMIGNvbnRleHQKKyAgICAgICAgICAgIC8vIHRvIHBlcmZvcm0gaXRzIGNsZWFudXAuCisgICAgICAgICAgICBkZXN0cm95Q2FudmFzKCk7CisKKyAgICAgICAgICAgIHNFZ2wuZWdsTWFrZUN1cnJlbnQoc0VnbERpc3BsYXksIEVHTDEwLkVHTF9OT19TVVJGQUNFLAorICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfTk9fU1VSRkFDRSwgRUdMMTAuRUdMX05PX0NPTlRFWFQpOworICAgICAgICAgICAgc0VnbC5lZ2xEZXN0cm95U3VyZmFjZShzRWdsRGlzcGxheSwgbUVnbFN1cmZhY2UpOworCisgICAgICAgICAgICBtRWdsU3VyZmFjZSA9IG51bGw7CisgICAgICAgICAgICBtR2wgPSBudWxsOworCisgICAgICAgICAgICAvLyBtRWdsLmVnbERlc3Ryb3lDb250ZXh0KG1FZ2xEaXNwbGF5LCBtRWdsQ29udGV4dCk7CisgICAgICAgICAgICAvLyBtRWdsQ29udGV4dCA9IG51bGw7ICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBtRWdsLmVnbFRlcm1pbmF0ZShtRWdsRGlzcGxheSk7CisgICAgICAgICAgICAvLyBtRWdsID0gbnVsbDsKKyAgICAgICAgICAgIC8vIG1FZ2xEaXNwbGF5ID0gbnVsbDsKKworICAgICAgICAgICAgc2V0RW5hYmxlZChmYWxzZSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgdm9pZCBzZXR1cChpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKKyAgICAgICAgICAgIG1DYW52YXMuc2V0Vmlld3BvcnQod2lkdGgsIGhlaWdodCk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGJvb2xlYW4gY2FuRHJhdygpIHsKKyAgICAgICAgICAgIHJldHVybiBtR2wgIT0gbnVsbCAmJiBtQ2FudmFzICE9IG51bGw7CisgICAgICAgIH0gICAgICAgIAorICAgICAgICAKKyAgICAgICAgdm9pZCBvblByZURyYXcoKSB7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogRGVmaW5lcyB0aGUgRUdMIGNvbmZpZ3VyYXRpb24gZm9yIHRoaXMgcmVuZGVyZXIuIFRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24KKyAgICAgICAgICogaXMgUkdCWCwgbm8gZGVwdGgsIG5vIHN0ZW5jaWwuCisgICAgICAgICAqIAorICAgICAgICAgKiBAcmV0dXJuIEFuIHtAbGluayBhbmRyb2lkLnZpZXcuSGFyZHdhcmVSZW5kZXJlci5HbFJlbmRlcmVyLkVnbENvbmZpZ0Nob29zZXJ9LgorICAgICAgICAgKiBAcGFyYW0gZ2xWZXJzaW9uCisgICAgICAgICAqLworICAgICAgICBFZ2xDb25maWdDaG9vc2VyIGdldENvbmZpZ0Nob29zZXIoaW50IGdsVmVyc2lvbikgeworICAgICAgICAgICAgLy8gVE9ETzogQ2hlY2sgZm9yIG1UcmFuc2x1Y2VudCBoZXJlLCB3aGljaCBtZWFucyBhdCBsZWFzdCAyIEVHTCBjb250ZXh0cworICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21wb25lbnRTaXplQ2hvb3NlcihnbFZlcnNpb24sIDgsIDgsIDgsIDgsIDAsIDApOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHZvaWQgZHJhdyhWaWV3IHZpZXcsIFZpZXcuQXR0YWNoSW5mbyBhdHRhY2hJbmZvLCBpbnQgeU9mZnNldCkgeworICAgICAgICAgICAgaWYgKGNhbkRyYXcoKSkgeworICAgICAgICAgICAgICAgIGF0dGFjaEluZm8ubURyYXdpbmdUaW1lID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCk7CisgICAgICAgICAgICAgICAgYXR0YWNoSW5mby5tSWdub3JlRGlydHlTdGF0ZSA9IHRydWU7CisgICAgICAgICAgICAgICAgdmlldy5tUHJpdmF0ZUZsYWdzIHw9IFZpZXcuRFJBV047CisKKyAgICAgICAgICAgICAgICBjaGVja0N1cnJlbnQoKTsKKworICAgICAgICAgICAgICAgIG9uUHJlRHJhdygpOworCisgICAgICAgICAgICAgICAgQ2FudmFzIGNhbnZhcyA9IG1DYW52YXM7CisgICAgICAgICAgICAgICAgaW50IHNhdmVDb3VudCA9IGNhbnZhcy5zYXZlKCk7CisgICAgICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgwLCAteU9mZnNldCk7CisKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICB2aWV3LmRyYXcoY2FudmFzKTsKKyAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICBjYW52YXMucmVzdG9yZVRvQ291bnQoc2F2ZUNvdW50KTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBhdHRhY2hJbmZvLm1JZ25vcmVEaXJ0eVN0YXRlID0gZmFsc2U7CisKKyAgICAgICAgICAgICAgICBzRWdsLmVnbFN3YXBCdWZmZXJzKHNFZ2xEaXNwbGF5LCBtRWdsU3VyZmFjZSk7CisgICAgICAgICAgICAgICAgY2hlY2tFcnJvcnMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBjaGVja0N1cnJlbnQoKSB7CisgICAgICAgICAgICAvLyBUT0RPOiBEb24ndCBjaGVjayB0aGUgY3VycmVudCBjb250ZXh0IHdoZW4gd2UgaGF2ZSBvbmUgcGVyIFVJIHRocmVhZAorICAgICAgICAgICAgLy8gVE9ETzogVXNlIGEgdGhyZWFkbG9jYWwgZmxhZyB0byBrbm93IHdoZXRoZXIgdGhlIHN1cmZhY2UgaGFzIGNoYW5nZWQKKyAgICAgICAgICAgIGlmIChzRWdsLmVnbEdldEN1cnJlbnRDb250ZXh0KCkgIT0gc0VnbENvbnRleHQgfHwKKyAgICAgICAgICAgICAgICAgICAgc0VnbC5lZ2xHZXRDdXJyZW50U3VyZmFjZShFR0wxMC5FR0xfRFJBVykgIT0gbUVnbFN1cmZhY2UpIHsKKyAgICAgICAgICAgICAgICBpZiAoIXNFZ2wuZWdsTWFrZUN1cnJlbnQoc0VnbERpc3BsYXksIG1FZ2xTdXJmYWNlLCBtRWdsU3VyZmFjZSwgc0VnbENvbnRleHQpKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJlZ2xNYWtlQ3VycmVudCBmYWlsZWQiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgRWdsQ29uZmlnQ2hvb3NlciB7CisgICAgICAgICAgICBmaW5hbCBpbnRbXSBtQ29uZmlnU3BlYzsKKyAgICAgICAgICAgIHByaXZhdGUgZmluYWwgaW50IG1HbFZlcnNpb247CisKKyAgICAgICAgICAgIEVnbENvbmZpZ0Nob29zZXIoaW50IGdsVmVyc2lvbiwgaW50W10gY29uZmlnU3BlYykgeworICAgICAgICAgICAgICAgIG1HbFZlcnNpb24gPSBnbFZlcnNpb247CisgICAgICAgICAgICAgICAgbUNvbmZpZ1NwZWMgPSBmaWx0ZXJDb25maWdTcGVjKGNvbmZpZ1NwZWMpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBFR0xDb25maWcgY2hvb3NlQ29uZmlnKEVHTDEwIGVnbCwgRUdMRGlzcGxheSBkaXNwbGF5KSB7CisgICAgICAgICAgICAgICAgaW50W10gaW5kZXggPSBuZXcgaW50WzFdOworICAgICAgICAgICAgICAgIGlmICghZWdsLmVnbENob29zZUNvbmZpZyhkaXNwbGF5LCBtQ29uZmlnU3BlYywgbnVsbCwgMCwgaW5kZXgpKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImVnbENob29zZUNvbmZpZyBmYWlsZWQiKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpbnQgbnVtQ29uZmlncyA9IGluZGV4WzBdOworICAgICAgICAgICAgICAgIGlmIChudW1Db25maWdzIDw9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTm8gY29uZmlncyBtYXRjaCBjb25maWdTcGVjIik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgRUdMQ29uZmlnW10gY29uZmlncyA9IG5ldyBFR0xDb25maWdbbnVtQ29uZmlnc107CisgICAgICAgICAgICAgICAgaWYgKCFlZ2wuZWdsQ2hvb3NlQ29uZmlnKGRpc3BsYXksIG1Db25maWdTcGVjLCBjb25maWdzLCBudW1Db25maWdzLCBpbmRleCkpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZWdsQ2hvb3NlQ29uZmlnIGZhaWxlZCIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEVHTENvbmZpZyBjb25maWcgPSBjaG9vc2VDb25maWcoZWdsLCBkaXNwbGF5LCBjb25maWdzKTsKKyAgICAgICAgICAgICAgICBpZiAoY29uZmlnID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTm8gY29uZmlnIGNob3NlbiIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiBjb25maWc7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGFic3RyYWN0IEVHTENvbmZpZyBjaG9vc2VDb25maWcoRUdMMTAgZWdsLCBFR0xEaXNwbGF5IGRpc3BsYXksIEVHTENvbmZpZ1tdIGNvbmZpZ3MpOworCisgICAgICAgICAgICBwcml2YXRlIGludFtdIGZpbHRlckNvbmZpZ1NwZWMoaW50W10gY29uZmlnU3BlYykgeworICAgICAgICAgICAgICAgIGlmIChtR2xWZXJzaW9uICE9IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbmZpZ1NwZWM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8qIFdlIGtub3cgbm9uZSBvZiB0aGUgc3ViY2xhc3NlcyBkZWZpbmUgRUdMX1JFTkRFUkFCTEVfVFlQRS4KKyAgICAgICAgICAgICAgICAgKiBBbmQgd2Uga25vdyB0aGUgY29uZmlnU3BlYyBpcyB3ZWxsIGZvcm1lZC4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBpbnQgbGVuID0gY29uZmlnU3BlYy5sZW5ndGg7CisgICAgICAgICAgICAgICAgaW50W10gbmV3Q29uZmlnU3BlYyA9IG5ldyBpbnRbbGVuICsgMl07CisgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShjb25maWdTcGVjLCAwLCBuZXdDb25maWdTcGVjLCAwLCBsZW4gLSAxKTsKKyAgICAgICAgICAgICAgICBuZXdDb25maWdTcGVjW2xlbiAtIDFdID0gRUdMMTAuRUdMX1JFTkRFUkFCTEVfVFlQRTsKKyAgICAgICAgICAgICAgICBuZXdDb25maWdTcGVjW2xlbl0gPSA0OyAvKiBFR0xfT1BFTkdMX0VTMl9CSVQgKi8KKyAgICAgICAgICAgICAgICBuZXdDb25maWdTcGVjW2xlbiArIDFdID0gRUdMMTAuRUdMX05PTkU7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ld0NvbmZpZ1NwZWM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ2hvb3NlIGEgY29uZmlndXJhdGlvbiB3aXRoIGV4YWN0bHkgdGhlIHNwZWNpZmllZCByLGcsYixhIHNpemVzLAorICAgICAgICAgKiBhbmQgYXQgbGVhc3QgdGhlIHNwZWNpZmllZCBkZXB0aCBhbmQgc3RlbmNpbCBzaXplcy4KKyAgICAgICAgICovCisgICAgICAgIHN0YXRpYyBjbGFzcyBDb21wb25lbnRTaXplQ2hvb3NlciBleHRlbmRzIEVnbENvbmZpZ0Nob29zZXIgeworICAgICAgICAgICAgcHJpdmF0ZSBpbnRbXSBtVmFsdWU7CisKKyAgICAgICAgICAgIHByaXZhdGUgaW50IG1SZWRTaXplOworICAgICAgICAgICAgcHJpdmF0ZSBpbnQgbUdyZWVuU2l6ZTsKKyAgICAgICAgICAgIHByaXZhdGUgaW50IG1CbHVlU2l6ZTsKKyAgICAgICAgICAgIHByaXZhdGUgaW50IG1BbHBoYVNpemU7CisgICAgICAgICAgICBwcml2YXRlIGludCBtRGVwdGhTaXplOworICAgICAgICAgICAgcHJpdmF0ZSBpbnQgbVN0ZW5jaWxTaXplOworCisgICAgICAgICAgICBDb21wb25lbnRTaXplQ2hvb3NlcihpbnQgZ2xWZXJzaW9uLCBpbnQgcmVkU2l6ZSwgaW50IGdyZWVuU2l6ZSwgaW50IGJsdWVTaXplLAorICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFTaXplLCBpbnQgZGVwdGhTaXplLCBpbnQgc3RlbmNpbFNpemUpIHsKKyAgICAgICAgICAgICAgICBzdXBlcihnbFZlcnNpb24sIG5ldyBpbnRbXSB7CisgICAgICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfUkVEX1NJWkUsIHJlZFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfR1JFRU5fU0laRSwgZ3JlZW5TaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX0JMVUVfU0laRSwgYmx1ZVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfQUxQSEFfU0laRSwgYWxwaGFTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX0RFUFRIX1NJWkUsIGRlcHRoU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9TVEVOQ0lMX1NJWkUsIHN0ZW5jaWxTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX05PTkUgfSk7CisgICAgICAgICAgICAgICAgbVZhbHVlID0gbmV3IGludFsxXTsKKyAgICAgICAgICAgICAgICBtUmVkU2l6ZSA9IHJlZFNpemU7CisgICAgICAgICAgICAgICAgbUdyZWVuU2l6ZSA9IGdyZWVuU2l6ZTsKKyAgICAgICAgICAgICAgICBtQmx1ZVNpemUgPSBibHVlU2l6ZTsKKyAgICAgICAgICAgICAgICBtQWxwaGFTaXplID0gYWxwaGFTaXplOworICAgICAgICAgICAgICAgIG1EZXB0aFNpemUgPSBkZXB0aFNpemU7CisgICAgICAgICAgICAgICAgbVN0ZW5jaWxTaXplID0gc3RlbmNpbFNpemU7CisgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBFR0xDb25maWcgY2hvb3NlQ29uZmlnKEVHTDEwIGVnbCwgRUdMRGlzcGxheSBkaXNwbGF5LCBFR0xDb25maWdbXSBjb25maWdzKSB7CisgICAgICAgICAgICAgICAgZm9yIChFR0xDb25maWcgY29uZmlnIDogY29uZmlncykgeworICAgICAgICAgICAgICAgICAgICBpbnQgZCA9IGZpbmRDb25maWdBdHRyaWIoZWdsLCBkaXNwbGF5LCBjb25maWcsIEVHTDEwLkVHTF9ERVBUSF9TSVpFLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IHMgPSBmaW5kQ29uZmlnQXR0cmliKGVnbCwgZGlzcGxheSwgY29uZmlnLCBFR0wxMC5FR0xfU1RFTkNJTF9TSVpFLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGQgPj0gbURlcHRoU2l6ZSAmJiBzID49IG1TdGVuY2lsU2l6ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IHIgPSBmaW5kQ29uZmlnQXR0cmliKGVnbCwgZGlzcGxheSwgY29uZmlnLCBFR0wxMC5FR0xfUkVEX1NJWkUsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGcgPSBmaW5kQ29uZmlnQXR0cmliKGVnbCwgZGlzcGxheSwgY29uZmlnLCBFR0wxMC5FR0xfR1JFRU5fU0laRSwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYiA9IGZpbmRDb25maWdBdHRyaWIoZWdsLCBkaXNwbGF5LCBjb25maWcsIEVHTDEwLkVHTF9CTFVFX1NJWkUsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGEgPSBmaW5kQ29uZmlnQXR0cmliKGVnbCwgZGlzcGxheSwgY29uZmlnLCBFR0wxMC5FR0xfQUxQSEFfU0laRSwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAociA+PSBtUmVkU2l6ZSAmJiBnID49IG1HcmVlblNpemUgJiYgYiA+PSBtQmx1ZVNpemUgJiYgYSA+PSBtQWxwaGFTaXplKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbmZpZzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHJpdmF0ZSBpbnQgZmluZENvbmZpZ0F0dHJpYihFR0wxMCBlZ2wsIEVHTERpc3BsYXkgZGlzcGxheSwgRUdMQ29uZmlnIGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgaW50IGF0dHJpYnV0ZSwgaW50IGRlZmF1bHRWYWx1ZSkgeworICAgICAgICAgICAgICAgIGlmIChlZ2wuZWdsR2V0Q29uZmlnQXR0cmliKGRpc3BsYXksIGNvbmZpZywgYXR0cmlidXRlLCBtVmFsdWUpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtVmFsdWVbMF07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEhhcmR3YXJlIHJlbmRlcmVyIHVzaW5nIE9wZW5HTCBFUyAyLjAuCisgICAgICovCisgICAgc3RhdGljIGNsYXNzIEdsMjBSZW5kZXJlciBleHRlbmRzIEdsUmVuZGVyZXIgeworICAgICAgICBwcml2YXRlIEdMRVMyMENhbnZhcyBtR2xDYW52YXM7CisKKyAgICAgICAgR2wyMFJlbmRlcmVyKGJvb2xlYW4gdHJhbnNsdWNlbnQpIHsKKyAgICAgICAgICAgIHN1cGVyKDIsIHRyYW5zbHVjZW50KTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBHTEVTMjBDYW52YXMgY3JlYXRlQ2FudmFzKCkgeworICAgICAgICAgICAgLy8gVE9ETzogUGFzcyBtVHJhbnNsdWNlbnQgaW5zdGVhZCBvZiB0cnVlCisgICAgICAgICAgICByZXR1cm4gbUdsQ2FudmFzID0gbmV3IEdMRVMyMENhbnZhcyhtR2wsIHRydWUpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHZvaWQgb25QcmVEcmF3KCkgeworICAgICAgICAgICAgbUdsQ2FudmFzLm9uUHJlRHJhdygpOworICAgICAgICB9CisKKyAgICAgICAgc3RhdGljIEhhcmR3YXJlUmVuZGVyZXIgY3JlYXRlKGJvb2xlYW4gdHJhbnNsdWNlbnQpIHsKKyAgICAgICAgICAgIGlmIChHTEVTMjBDYW52YXMuaXNBdmFpbGFibGUoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgR2wyMFJlbmRlcmVyKHRyYW5zbHVjZW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9MYXlvdXRJbmZsYXRlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9MYXlvdXRJbmZsYXRlci5qYXZhCmluZGV4IGU1OTg1YzEuLjQ3OWU3NTcgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvTGF5b3V0SW5mbGF0ZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L0xheW91dEluZmxhdGVyLmphdmEKQEAgLTE2LDE1ICsxNiwxNSBAQAogCiBwYWNrYWdlIGFuZHJvaWQudmlldzsKIAoraW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXI7CitpbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjsKKwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheTsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlhtbFJlc291cmNlUGFyc2VyOwogaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlhtbDsKIAotaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXI7Ci1pbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjsKLQogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CkBAIC03MSwxMSArNzEsMTEgQEAKIAogICAgIHByaXZhdGUgZmluYWwgT2JqZWN0W10gbUNvbnN0cnVjdG9yQXJncyA9IG5ldyBPYmplY3RbMl07CiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzc1tdIG1Db25zdHJ1Y3RvclNpZ25hdHVyZSA9IG5ldyBDbGFzc1tdIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzczw/PltdIG1Db25zdHJ1Y3RvclNpZ25hdHVyZSA9IG5ldyBDbGFzc1tdIHsKICAgICAgICAgICAgIENvbnRleHQuY2xhc3MsIEF0dHJpYnV0ZVNldC5jbGFzc307CiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBIYXNoTWFwPFN0cmluZywgQ29uc3RydWN0b3I+IHNDb25zdHJ1Y3Rvck1hcCA9Ci0gICAgICAgICAgICBuZXcgSGFzaE1hcDxTdHJpbmcsIENvbnN0cnVjdG9yPigpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEhhc2hNYXA8U3RyaW5nLCBDb25zdHJ1Y3Rvcjw/IGV4dGVuZHMgVmlldz4+IHNDb25zdHJ1Y3Rvck1hcCA9CisgICAgICAgICAgICBuZXcgSGFzaE1hcDxTdHJpbmcsIENvbnN0cnVjdG9yPD8gZXh0ZW5kcyBWaWV3Pj4oKTsKICAgICAKICAgICBwcml2YXRlIEhhc2hNYXA8U3RyaW5nLCBCb29sZWFuPiBtRmlsdGVyTWFwOwogCkBAIC05Nyw2ICs5Nyw3IEBACiAgICAgICAgICAqIAogICAgICAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhpcyBjbGFzcyBpcyBhbGxvd2VkIHRvIGJlIGluZmxhdGVkLCBvciBmYWxzZSBvdGhlcndpc2UKICAgICAgICAgICovCisgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQogICAgICAgICBib29sZWFuIG9uTG9hZENsYXNzKENsYXNzIGNsYXp6KTsKICAgICB9CiAgICAgCkBAIC0zNzksNyArMzgwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiVmlld0dyb3VwIHJvb3QgYW5kIGF0dGFjaFRvUm9vdD10cnVlIik7CiAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICBySW5mbGF0ZShwYXJzZXIsIHJvb3QsIGF0dHJzKTsKKyAgICAgICAgICAgICAgICAgICAgckluZmxhdGUocGFyc2VyLCByb290LCBhdHRycywgZmFsc2UpOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIFRlbXAgaXMgdGhlIHJvb3QgdmlldyB0aGF0IHdhcyBmb3VuZCBpbiB0aGUgeG1sCiAgICAgICAgICAgICAgICAgICAgIFZpZXcgdGVtcCA9IGNyZWF0ZVZpZXdGcm9tVGFnKG5hbWUsIGF0dHJzKTsKQEAgLTQwNCw3ICs0MDUsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCItLS0tLT4gc3RhcnQgaW5mbGF0aW5nIGNoaWxkcmVuIik7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgLy8gSW5mbGF0ZSBhbGwgY2hpbGRyZW4gdW5kZXIgdGVtcAotICAgICAgICAgICAgICAgICAgICBySW5mbGF0ZShwYXJzZXIsIHRlbXAsIGF0dHJzKTsKKyAgICAgICAgICAgICAgICAgICAgckluZmxhdGUocGFyc2VyLCB0ZW1wLCBhdHRycywgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgewogICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCItLS0tLT4gZG9uZSBpbmZsYXRpbmcgY2hpbGRyZW4iKTsKICAgICAgICAgICAgICAgICAgICAgfQpAQCAtNDUzLDE4ICs0NTQsMTggQEAKICAgICAgKiBAcGFyYW0gbmFtZSBUaGUgZnVsbCBuYW1lIG9mIHRoZSBjbGFzcyB0byBiZSBpbnN0YW50aWF0ZWQuCiAgICAgICogQHBhcmFtIGF0dHJzIFRoZSBYTUwgYXR0cmlidXRlcyBzdXBwbGllZCBmb3IgdGhpcyBpbnN0YW5jZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFZpZXcgVGhlIG5ld2x5IGluc3RhbnRpZWQgdmlldywgb3IgbnVsbC4KKyAgICAgKiBAcmV0dXJuIFZpZXcgVGhlIG5ld2x5IGluc3RhbnRpYXRlZCB2aWV3LCBvciBudWxsLgogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBWaWV3IGNyZWF0ZVZpZXcoU3RyaW5nIG5hbWUsIFN0cmluZyBwcmVmaXgsIEF0dHJpYnV0ZVNldCBhdHRycykKICAgICAgICAgICAgIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uLCBJbmZsYXRlRXhjZXB0aW9uIHsKLSAgICAgICAgQ29uc3RydWN0b3IgY29uc3RydWN0b3IgPSBzQ29uc3RydWN0b3JNYXAuZ2V0KG5hbWUpOwotICAgICAgICBDbGFzcyBjbGF6eiA9IG51bGw7CisgICAgICAgIENvbnN0cnVjdG9yPD8gZXh0ZW5kcyBWaWV3PiBjb25zdHJ1Y3RvciA9IHNDb25zdHJ1Y3Rvck1hcC5nZXQobmFtZSk7CisgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBWaWV3PiBjbGF6eiA9IG51bGw7CiAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGlmIChjb25zdHJ1Y3RvciA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgLy8gQ2xhc3Mgbm90IGZvdW5kIGluIHRoZSBjYWNoZSwgc2VlIGlmIGl0J3MgcmVhbCwgYW5kIHRyeSB0byBhZGQgaXQKICAgICAgICAgICAgICAgICBjbGF6eiA9IG1Db250ZXh0LmdldENsYXNzTG9hZGVyKCkubG9hZENsYXNzKAotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ICE9IG51bGwgPyAocHJlZml4ICsgbmFtZSkgOiBuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCAhPSBudWxsID8gKHByZWZpeCArIG5hbWUpIDogbmFtZSkuYXNTdWJjbGFzcyhWaWV3LmNsYXNzKTsKICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICBpZiAobUZpbHRlciAhPSBudWxsICYmIGNsYXp6ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBhbGxvd2VkID0gbUZpbHRlci5vbkxvYWRDbGFzcyhjbGF6eik7CkBAIC00ODIsNyArNDgzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgaWYgKGFsbG93ZWRTdGF0ZSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOZXcgY2xhc3MgLS0gcmVtZW1iZXIgd2hldGhlciBpdCBpcyBhbGxvd2VkCiAgICAgICAgICAgICAgICAgICAgICAgICBjbGF6eiA9IG1Db250ZXh0LmdldENsYXNzTG9hZGVyKCkubG9hZENsYXNzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggIT0gbnVsbCA/IChwcmVmaXggKyBuYW1lKSA6IG5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggIT0gbnVsbCA/IChwcmVmaXggKyBuYW1lKSA6IG5hbWUpLmFzU3ViY2xhc3MoVmlldy5jbGFzcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gYWxsb3dlZCA9IGNsYXp6ICE9IG51bGwgJiYgbUZpbHRlci5vbkxvYWRDbGFzcyhjbGF6eik7CiAgICAgICAgICAgICAgICAgICAgICAgICBtRmlsdGVyTWFwLnB1dChuYW1lLCBhbGxvd2VkKTsKQEAgLTQ5Nyw3ICs0OTgsNyBAQAogCiAgICAgICAgICAgICBPYmplY3RbXSBhcmdzID0gbUNvbnN0cnVjdG9yQXJnczsKICAgICAgICAgICAgIGFyZ3NbMV0gPSBhdHRyczsKLSAgICAgICAgICAgIHJldHVybiAoVmlldykgY29uc3RydWN0b3IubmV3SW5zdGFuY2UoYXJncyk7CisgICAgICAgICAgICByZXR1cm4gY29uc3RydWN0b3IubmV3SW5zdGFuY2UoYXJncyk7CiAKICAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIEluZmxhdGVFeGNlcHRpb24gaWUgPSBuZXcgSW5mbGF0ZUV4Y2VwdGlvbihhdHRycy5nZXRQb3NpdGlvbkRlc2NyaXB0aW9uKCkKQEAgLTUwNiw2ICs1MDcsMTMgQEAKICAgICAgICAgICAgIGllLmluaXRDYXVzZShlKTsKICAgICAgICAgICAgIHRocm93IGllOwogCisgICAgICAgIH0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBJZiBsb2FkZWQgY2xhc3MgaXMgbm90IGEgVmlldyBzdWJjbGFzcworICAgICAgICAgICAgSW5mbGF0ZUV4Y2VwdGlvbiBpZSA9IG5ldyBJbmZsYXRlRXhjZXB0aW9uKGF0dHJzLmdldFBvc2l0aW9uRGVzY3JpcHRpb24oKQorICAgICAgICAgICAgICAgICAgICArICI6IENsYXNzIGlzIG5vdCBhIFZpZXcgIgorICAgICAgICAgICAgICAgICAgICArIChwcmVmaXggIT0gbnVsbCA/IChwcmVmaXggKyBuYW1lKSA6IG5hbWUpKTsKKyAgICAgICAgICAgIGllLmluaXRDYXVzZShlKTsKKyAgICAgICAgICAgIHRocm93IGllOwogICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIC8vIElmIGxvYWRDbGFzcyBmYWlscywgd2Ugc2hvdWxkIHByb3BhZ2F0ZSB0aGUgZXhjZXB0aW9uLgogICAgICAgICAgICAgdGhyb3cgZTsKQEAgLTUxOSw3ICs1MjcsNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFRocm93IGFuIGV4Y3BldGlvbiBiZWNhdXNlIHRoZSBzcGVjaWZpZWQgY2xhc3MgaXMgbm90IGFsbG93ZWQgdG8gYmUgaW5mbGF0ZWQuCisgICAgICogVGhyb3cgYW4gZXhjZXB0aW9uIGJlY2F1c2UgdGhlIHNwZWNpZmllZCBjbGFzcyBpcyBub3QgYWxsb3dlZCB0byBiZSBpbmZsYXRlZC4KICAgICAgKi8KICAgICBwcml2YXRlIHZvaWQgZmFpbE5vdEFsbG93ZWQoU3RyaW5nIG5hbWUsIFN0cmluZyBwcmVmaXgsIEF0dHJpYnV0ZVNldCBhdHRycykgewogICAgICAgICBJbmZsYXRlRXhjZXB0aW9uIGllID0gbmV3IEluZmxhdGVFeGNlcHRpb24oYXR0cnMuZ2V0UG9zaXRpb25EZXNjcmlwdGlvbigpCkBAIC01OTAsOCArNTk4LDggQEAKICAgICAgKiBSZWN1cnNpdmUgbWV0aG9kIHVzZWQgdG8gZGVzY2VuZCBkb3duIHRoZSB4bWwgaGllcmFyY2h5IGFuZCBpbnN0YW50aWF0ZQogICAgICAqIHZpZXdzLCBpbnN0YW50aWF0ZSB0aGVpciBjaGlsZHJlbiwgYW5kIHRoZW4gY2FsbCBvbkZpbmlzaEluZmxhdGUoKS4KICAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgckluZmxhdGUoWG1sUHVsbFBhcnNlciBwYXJzZXIsIFZpZXcgcGFyZW50LCBmaW5hbCBBdHRyaWJ1dGVTZXQgYXR0cnMpCi0gICAgICAgICAgICB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgIHByaXZhdGUgdm9pZCBySW5mbGF0ZShYbWxQdWxsUGFyc2VyIHBhcnNlciwgVmlldyBwYXJlbnQsIGZpbmFsIEF0dHJpYnV0ZVNldCBhdHRycywKKyAgICAgICAgICAgIGJvb2xlYW4gZmluaXNoSW5mbGF0ZSkgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKIAogICAgICAgICBmaW5hbCBpbnQgZGVwdGggPSBwYXJzZXIuZ2V0RGVwdGgoKTsKICAgICAgICAgaW50IHR5cGU7CkBAIC02MTgsMTIgKzYyNiwxMiBAQAogICAgICAgICAgICAgICAgIGZpbmFsIFZpZXcgdmlldyA9IGNyZWF0ZVZpZXdGcm9tVGFnKG5hbWUsIGF0dHJzKTsKICAgICAgICAgICAgICAgICBmaW5hbCBWaWV3R3JvdXAgdmlld0dyb3VwID0gKFZpZXdHcm91cCkgcGFyZW50OwogICAgICAgICAgICAgICAgIGZpbmFsIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMgcGFyYW1zID0gdmlld0dyb3VwLmdlbmVyYXRlTGF5b3V0UGFyYW1zKGF0dHJzKTsKLSAgICAgICAgICAgICAgICBySW5mbGF0ZShwYXJzZXIsIHZpZXcsIGF0dHJzKTsKKyAgICAgICAgICAgICAgICBySW5mbGF0ZShwYXJzZXIsIHZpZXcsIGF0dHJzLCB0cnVlKTsKICAgICAgICAgICAgICAgICB2aWV3R3JvdXAuYWRkVmlldyh2aWV3LCBwYXJhbXMpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgcGFyZW50Lm9uRmluaXNoSW5mbGF0ZSgpOworICAgICAgICBpZiAoZmluaXNoSW5mbGF0ZSkgcGFyZW50Lm9uRmluaXNoSW5mbGF0ZSgpOwogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBwYXJzZVJlcXVlc3RGb2N1cyhYbWxQdWxsUGFyc2VyIHBhcnNlciwgVmlldyBwYXJlbnQpCkBAIC02NzQsNyArNjgyLDcgQEAKIAogICAgICAgICAgICAgICAgICAgICBpZiAoVEFHX01FUkdFLmVxdWFscyhjaGlsZE5hbWUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbmZsYXRlIGFsbCBjaGlsZHJlbi4KLSAgICAgICAgICAgICAgICAgICAgICAgIHJJbmZsYXRlKGNoaWxkUGFyc2VyLCBwYXJlbnQsIGNoaWxkQXR0cnMpOworICAgICAgICAgICAgICAgICAgICAgICAgckluZmxhdGUoY2hpbGRQYXJzZXIsIHBhcmVudCwgY2hpbGRBdHRycywgZmFsc2UpOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgVmlldyB2aWV3ID0gY3JlYXRlVmlld0Zyb21UYWcoY2hpbGROYW1lLCBjaGlsZEF0dHJzKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFZpZXdHcm91cCBncm91cCA9IChWaWV3R3JvdXApIHBhcmVudDsKQEAgLTY5OSw3ICs3MDcsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbmZsYXRlIGFsbCBjaGlsZHJlbi4KLSAgICAgICAgICAgICAgICAgICAgICAgIHJJbmZsYXRlKGNoaWxkUGFyc2VyLCB2aWV3LCBjaGlsZEF0dHJzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJJbmZsYXRlKGNoaWxkUGFyc2VyLCB2aWV3LCBjaGlsZEF0dHJzLCB0cnVlKTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXR0ZW1wdCB0byBvdmVycmlkZSB0aGUgaW5jbHVkZWQgbGF5b3V0J3MgYW5kcm9pZDppZCB3aXRoIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgLy8gb25lIHNldCBvbiB0aGUgPGluY2x1ZGUgLz4gdGFnIGl0c2VsZi4KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvTWVudUluZmxhdGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L01lbnVJbmZsYXRlci5qYXZhCmluZGV4IDQ2YzgwNWMuLmQwOTg1ZDkgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvTWVudUluZmxhdGVyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9NZW51SW5mbGF0ZXIuamF2YQpAQCAtMTYsOSArMTYsOCBAQAogCiBwYWNrYWdlIGFuZHJvaWQudmlldzsKIAotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5NZW51SXRlbUltcGw7Ci0KIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKIAogaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXI7CiBpbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjsKQEAgLTMwLDYgKzI5LDggQEAKIGltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwogaW1wb3J0IGFuZHJvaWQudXRpbC5YbWw7CiAKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuTWVudUl0ZW1JbXBsOworCiAvKioKICAqIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBpbnN0YW50aWF0ZSBtZW51IFhNTCBmaWxlcyBpbnRvIE1lbnUgb2JqZWN0cy4KICAqIDxwPgpAQCAtMTY2LDYgKzE2Nyw0MSBAQAogICAgICAgICB9CiAgICAgfQogICAgIAorICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEluZmxhdGVkT25NZW51SXRlbUNsaWNrTGlzdGVuZXIKKyAgICAgICAgICAgIGltcGxlbWVudHMgTWVudUl0ZW0uT25NZW51SXRlbUNsaWNrTGlzdGVuZXIgeworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzc1tdIFBBUkFNX1RZUEVTID0gbmV3IENsYXNzW10geyBNZW51SXRlbS5jbGFzcyB9OworICAgICAgICAKKyAgICAgICAgcHJpdmF0ZSBDb250ZXh0IG1Db250ZXh0OworICAgICAgICBwcml2YXRlIE1ldGhvZCBtTWV0aG9kOworICAgICAgICAKKyAgICAgICAgcHVibGljIEluZmxhdGVkT25NZW51SXRlbUNsaWNrTGlzdGVuZXIoQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgbWV0aG9kTmFtZSkgeworICAgICAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OworICAgICAgICAgICAgQ2xhc3MgYyA9IGNvbnRleHQuZ2V0Q2xhc3MoKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbU1ldGhvZCA9IGMuZ2V0TWV0aG9kKG1ldGhvZE5hbWUsIFBBUkFNX1RZUEVTKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgSW5mbGF0ZUV4Y2VwdGlvbiBleCA9IG5ldyBJbmZsYXRlRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkbid0IHJlc29sdmUgbWVudSBpdGVtIG9uQ2xpY2sgaGFuZGxlciAiICsgbWV0aG9kTmFtZSArCisgICAgICAgICAgICAgICAgICAgICAgICAiIGluIGNsYXNzICIgKyBjLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgZXguaW5pdENhdXNlKGUpOworICAgICAgICAgICAgICAgIHRocm93IGV4OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbk1lbnVJdGVtQ2xpY2soTWVudUl0ZW0gaXRlbSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpZiAobU1ldGhvZC5nZXRSZXR1cm5UeXBlKCkgPT0gQm9vbGVhbi5UWVBFKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAoQm9vbGVhbikgbU1ldGhvZC5pbnZva2UobUNvbnRleHQsIGl0ZW0pOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1NZXRob2QuaW52b2tlKG1Db250ZXh0LCBpdGVtKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAKICAgICAvKioKICAgICAgKiBTdGF0ZSBmb3IgdGhlIGN1cnJlbnQgbWVudS4KICAgICAgKiA8cD4KQEAgLTIwNSw2ICsyNDEsMTcgQEAKICAgICAgICAgcHJpdmF0ZSBib29sZWFuIGl0ZW1WaXNpYmxlOwogICAgICAgICBwcml2YXRlIGJvb2xlYW4gaXRlbUVuYWJsZWQ7CiAgICAgICAgIAorICAgICAgICAvKioKKyAgICAgICAgICogU3luYyB0byBhdHRycy54bWwgZW51bSwgdmFsdWVzIGluIE1lbnVJdGVtOgorICAgICAgICAgKiAtIDA6IG5ldmVyCisgICAgICAgICAqIC0gMTogaWZSb29tCisgICAgICAgICAqIC0gMjogYWx3YXlzCisgICAgICAgICAqIC0gLTE6IFNhZmUgc2VudGluZWwgZm9yICJubyB2YWx1ZSIuCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIGludCBpdGVtU2hvd0FzQWN0aW9uOworICAgICAgICAKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgaXRlbUxpc3RlbmVyTWV0aG9kTmFtZTsKKyAgICAgICAgCiAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBkZWZhdWx0R3JvdXBJZCA9IE5PX0lEOwogICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgZGVmYXVsdEl0ZW1JZCA9IE5PX0lEOwogICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgZGVmYXVsdEl0ZW1DYXRlZ29yeSA9IDA7CkBAIC0yNzYsNiArMzIzLDggQEAKICAgICAgICAgICAgIGl0ZW1DaGVja2VkID0gYS5nZXRCb29sZWFuKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLk1lbnVJdGVtX2NoZWNrZWQsIGRlZmF1bHRJdGVtQ2hlY2tlZCk7CiAgICAgICAgICAgICBpdGVtVmlzaWJsZSA9IGEuZ2V0Qm9vbGVhbihjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5NZW51SXRlbV92aXNpYmxlLCBncm91cFZpc2libGUpOwogICAgICAgICAgICAgaXRlbUVuYWJsZWQgPSBhLmdldEJvb2xlYW4oY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuTWVudUl0ZW1fZW5hYmxlZCwgZ3JvdXBFbmFibGVkKTsKKyAgICAgICAgICAgIGl0ZW1TaG93QXNBY3Rpb24gPSBhLmdldEludChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5NZW51SXRlbV9zaG93QXNBY3Rpb24sIC0xKTsKKyAgICAgICAgICAgIGl0ZW1MaXN0ZW5lck1ldGhvZE5hbWUgPSBhLmdldFN0cmluZyhjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5NZW51SXRlbV9vbkNsaWNrKTsKICAgICAgICAgICAgIAogICAgICAgICAgICAgYS5yZWN5Y2xlKCk7CiAgICAgICAgICAgICAKQEAgLTI5OSw5ICszNDgsMjUgQEAKICAgICAgICAgICAgICAgICAuc2V0SWNvbihpdGVtSWNvblJlc0lkKQogICAgICAgICAgICAgICAgIC5zZXRBbHBoYWJldGljU2hvcnRjdXQoaXRlbUFscGhhYmV0aWNTaG9ydGN1dCkKICAgICAgICAgICAgICAgICAuc2V0TnVtZXJpY1Nob3J0Y3V0KGl0ZW1OdW1lcmljU2hvcnRjdXQpOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoaXRlbVNob3dBc0FjdGlvbiA+PSAwKSB7CisgICAgICAgICAgICAgICAgaXRlbS5zZXRTaG93QXNBY3Rpb24oaXRlbVNob3dBc0FjdGlvbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIChpdGVtTGlzdGVuZXJNZXRob2ROYW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAobUNvbnRleHQuaXNSZXN0cmljdGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVGhlIGFuZHJvaWQ6b25DbGljayBhdHRyaWJ1dGUgY2Fubm90ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJiZSB1c2VkIHdpdGhpbiBhIHJlc3RyaWN0ZWQgY29udGV4dCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpdGVtLnNldE9uTWVudUl0ZW1DbGlja0xpc3RlbmVyKAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEluZmxhdGVkT25NZW51SXRlbUNsaWNrTGlzdGVuZXIobUNvbnRleHQsIGl0ZW1MaXN0ZW5lck1ldGhvZE5hbWUpKTsKKyAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKGl0ZW1DaGVja2FibGUgPj0gMikgewotICAgICAgICAgICAgICAgICgoTWVudUl0ZW1JbXBsKSBpdGVtKS5zZXRFeGNsdXNpdmVDaGVja2FibGUodHJ1ZSk7CisgICAgICAgICAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIE1lbnVJdGVtSW1wbCkgeworICAgICAgICAgICAgICAgIE1lbnVJdGVtSW1wbCBpbXBsID0gKE1lbnVJdGVtSW1wbCkgaXRlbTsKKyAgICAgICAgICAgICAgICBpZiAoaXRlbUNoZWNrYWJsZSA+PSAyKSB7CisgICAgICAgICAgICAgICAgICAgIGltcGwuc2V0RXhjbHVzaXZlQ2hlY2thYmxlKHRydWUpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvTWVudUl0ZW0uamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvTWVudUl0ZW0uamF2YQppbmRleCBmY2ViZWM1Li4yNjA0Y2Y5IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L01lbnVJdGVtLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9NZW51SXRlbS5qYXZhCkBAIC0zMSw2ICszMSwyMSBAQAogICogRm9yIGEgZmVhdHVyZSBzZXQgb2Ygc3BlY2lmaWMgbWVudSB0eXBlcywgc2VlIHtAbGluayBNZW51fS4KICAqLwogcHVibGljIGludGVyZmFjZSBNZW51SXRlbSB7CisgICAgLyoKKyAgICAgKiBUaGVzZSBzaG91bGQgYmUga2VwdCBpbiBzeW5jIHdpdGggYXR0cnMueG1sIGVudW0gY29uc3RhbnRzIGZvciBzaG93QXNBY3Rpb24KKyAgICAgKi8KKyAgICAvKiogTmV2ZXIgc2hvdyB0aGlzIGl0ZW0gYXMgYSBidXR0b24gaW4gYW4gQWN0aW9uIEJhci4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSE9XX0FTX0FDVElPTl9ORVZFUiA9IDA7CisgICAgLyoqIFNob3cgdGhpcyBpdGVtIGFzIGEgYnV0dG9uIGluIGFuIEFjdGlvbiBCYXIgaWYgdGhlIHN5c3RlbSBkZWNpZGVzIHRoZXJlIGlzIHJvb20gZm9yIGl0LiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNIT1dfQVNfQUNUSU9OX0lGX1JPT00gPSAxOworICAgIC8qKgorICAgICAqIEFsd2F5cyBzaG93IHRoaXMgaXRlbSBhcyBhIGJ1dHRvbiBpbiBhbiBBY3Rpb24gQmFyLgorICAgICAqIFVzZSBzcGFyaW5nbHkhIElmIHRvbyBtYW55IGl0ZW1zIGFyZSBzZXQgdG8gYWx3YXlzIHNob3cgaW4gdGhlIEFjdGlvbiBCYXIgaXQgY2FuCisgICAgICogY3Jvd2QgdGhlIEFjdGlvbiBCYXIgYW5kIGRlZ3JhZGUgdGhlIHVzZXIgZXhwZXJpZW5jZSBvbiBkZXZpY2VzIHdpdGggc21hbGxlciBzY3JlZW5zLgorICAgICAqIEEgZ29vZCBydWxlIG9mIHRodW1iIGlzIHRvIGhhdmUgbm8gbW9yZSB0aGFuIDIgaXRlbXMgc2V0IHRvIGFsd2F5cyBzaG93IGF0IGEgdGltZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSE9XX0FTX0FDVElPTl9BTFdBWVMgPSAyOworICAgIAogICAgIC8qKgogICAgICAqIEludGVyZmFjZSBkZWZpbml0aW9uIGZvciBhIGNhbGxiYWNrIHRvIGJlIGludm9rZWQgd2hlbiBhIG1lbnUgaXRlbSBpcwogICAgICAqIGNsaWNrZWQuCkBAIC0zODEsNCArMzk2LDE1IEBACiAgICAgICogICAgICAgICBtZW51IGl0ZW0gdG8gdGhlIG1lbnUuIFRoaXMgY2FuIGJlIG51bGwuCiAgICAgICovCiAgICAgcHVibGljIENvbnRleHRNZW51SW5mbyBnZXRNZW51SW5mbygpOworICAgIAorICAgIC8qKgorICAgICAqIFNldHMgaG93IHRoaXMgaXRlbSBzaG91bGQgZGlzcGxheSBpbiB0aGUgcHJlc2VuY2Ugb2YgYW4gQWN0aW9uIEJhci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhY3Rpb25FbnVtIEhvdyB0aGUgaXRlbSBzaG91bGQgZGlzcGxheS4gT25lIG9mCisgICAgICoge0BsaW5rICNTSE9XX0FTX0FDVElPTl9BTFdBWVN9LCB7QGxpbmsgI1NIT1dfQVNfQUNUSU9OX0lGX1JPT019LCBvcgorICAgICAqIHtAbGluayAjU0hPV19BU19BQ1RJT05fTkVWRVJ9LiBTSE9XX0FTX0FDVElPTl9ORVZFUiBpcyB0aGUgZGVmYXVsdC4KKyAgICAgKiAKKyAgICAgKiBAc2VlIGFuZHJvaWQuYXBwLkFjdGlvbkJhcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNob3dBc0FjdGlvbihpbnQgYWN0aW9uRW51bSk7CiB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9WaWV3LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1ZpZXcuamF2YQppbmRleCBjOTY2MmZmLi42MTYxMjhkIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1ZpZXcuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1ZpZXcuamF2YQpAQCAtMjQsNiArMjQsNyBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheTsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbWVyYTsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkludGVycG9sYXRvcjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkxpbmVhckdyYWRpZW50OwpAQCAtMzQsNiArMzUsNyBAQAogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9ydGVyRHVmZjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBvcnRlckR1ZmZYZmVybW9kZTsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0RjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlZ2lvbjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlNoYWRlcjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkNvbG9yRHJhd2FibGU7CkBAIC01Niw2ICs1OCw3IEBACiBpbXBvcnQgYW5kcm9pZC51dGlsLlBvb2xzOwogaW1wb3J0IGFuZHJvaWQudXRpbC5TcGFyc2VBcnJheTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuQ29udGV4dE1lbnUuQ29udGV4dE1lbnVJbmZvOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3Lk1lYXN1cmVTcGVjOwogaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlFdmVudDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5RXZlbnRTb3VyY2U7CiBpbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eU1hbmFnZXI7CkBAIC02Niw3ICs2OSw2IEBACiBpbXBvcnQgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLklucHV0TWV0aG9kTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5TY3JvbGxCYXJEcmF3YWJsZTsKIAotaW1wb3J0IGphdmEubGFuZy5yZWYuU29mdFJlZmVyZW5jZTsKIGltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwpAQCAtMjYwLDcgKzI2Miw4IEBACiAgKiA8dWw+CiAgKiA8bGk+RGVmaW5lIGEgQnV0dG9uIGluIHRoZSBsYXlvdXQgZmlsZSBhbmQgYXNzaWduIGl0IGEgdW5pcXVlIElELgogICogPHByZT4KLSAqICZsdDtCdXR0b24gaWQ9IkAraWQvbXlfYnV0dG9uIgorICogJmx0O0J1dHRvbgorICogICAgIGFuZHJvaWQ6aWQ9IkAraWQvbXlfYnV0dG9uIgogICogICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCiAgKiAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCiAgKiAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL215X2J1dHRvbl90ZXh0Ii8mZ3Q7CkBAIC04ODcsNiArODkwLDIwIEBACiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSEFQVElDX0ZFRURCQUNLX0VOQUJMRUQgPSAweDEwMDAwMDAwOwogCiAgICAgLyoqCisgICAgICogPHA+SW5kaWNhdGVzIHRoYXQgdGhlIHZpZXcgaGllcmFyY2h5IHNob3VsZCBzdG9wIHNhdmluZyBzdGF0ZSB3aGVuCisgICAgICogaXQgcmVhY2hlcyB0aGlzIHZpZXcuICBJZiBzdGF0ZSBzYXZpbmcgaXMgaW5pdGlhdGVkIGltbWVkaWF0ZWx5IGF0CisgICAgICogdGhlIHZpZXcsIGl0IHdpbGwgYmUgYWxsb3dlZC4KKyAgICAgKiB7QGhpZGV9CisgICAgICovCisgICAgc3RhdGljIGZpbmFsIGludCBQQVJFTlRfU0FWRV9ESVNBQkxFRCA9IDB4MjAwMDAwMDA7CisKKyAgICAvKioKKyAgICAgKiA8cD5NYXNrIGZvciB1c2Ugd2l0aCBzZXRGbGFncyBpbmRpY2F0aW5nIGJpdHMgdXNlZCBmb3IgUEFSRU5UX1NBVkVfRElTQUJMRUQuPC9wPgorICAgICAqIHtAaGlkZX0KKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgaW50IFBBUkVOVF9TQVZFX0RJU0FCTEVEX01BU0sgPSAweDIwMDAwMDAwOworCisgICAgLyoqCiAgICAgICogVmlldyBmbGFnIGluZGljYXRpbmcgd2hldGhlciB7QGxpbmsgI2FkZEZvY3VzYWJsZXMoQXJyYXlMaXN0LCBpbnQsIGludCl9CiAgICAgICogc2hvdWxkIGFkZCBhbGwgZm9jdXNhYmxlIFZpZXdzIHJlZ2FyZGxlc3MgaWYgdGhleSBhcmUgZm9jdXNhYmxlIGluIHRvdWNoIG1vZGUuCiAgICAgICovCkBAIC0xNTIxLDYgKzE1MzgsMTQgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQVdBS0VOX1NDUk9MTF9CQVJTX09OX0FUVEFDSCA9IDB4MDgwMDAwMDA7CiAKICAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgdGhhdCBwaXZvdFggb3IgcGl2b3RZIHdlcmUgZXhwbGljaXRseSBzZXQgYW5kIHdlIHNob3VsZCBub3QgYXNzdW1lIHRoZSBjZW50ZXIKKyAgICAgKiBmb3IgdHJhbnNmb3JtIG9wZXJhdGlvbnMKKyAgICAgKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBJVk9UX0VYUExJQ0lUTFlfU0VUID0gMHgxMDAwMDAwMDsKKworICAgIC8qKgogICAgICAqIFRoZSBwYXJlbnQgdGhpcyB2aWV3IGlzIGF0dGFjaGVkIHRvLgogICAgICAqIHtAaGlkZX0KICAgICAgKgpAQCAtMTU3MSw2ICsxNTk2LDEzNSBAQAogICAgIGludCBtVmlld0ZsYWdzOwogCiAgICAgLyoqCisgICAgICogVGhlIHRyYW5zZm9ybSBtYXRyaXggZm9yIHRoZSBWaWV3LiBUaGlzIHRyYW5zZm9ybSBpcyBjYWxjdWxhdGVkIGludGVybmFsbHkKKyAgICAgKiBiYXNlZCBvbiB0aGUgcm90YXRpb24sIHNjYWxlWCwgYW5kIHNjYWxlWSBwcm9wZXJ0aWVzLiBUaGUgaWRlbnRpdHkgbWF0cml4CisgICAgICogaXMgdXNlZCBieSBkZWZhdWx0LiBEbyAqbm90KiB1c2UgdGhpcyB2YXJpYWJsZSBkaXJlY3RseTsgaW5zdGVhZCBjYWxsCisgICAgICogZ2V0TWF0cml4KCksIHdoaWNoIHdpbGwgYXV0b21hdGljYWxseSByZWNhbGN1bGF0ZSB0aGUgbWF0cml4IGlmIG5lY2Vzc2FyeQorICAgICAqIHRvIGdldCB0aGUgY29ycmVjdCBtYXRyaXggYmFzZWQgb24gdGhlIGxhdGVzdCByb3RhdGlvbiBhbmQgc2NhbGUgcHJvcGVydGllcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIE1hdHJpeCBtTWF0cml4ID0gbmV3IE1hdHJpeCgpOworCisgICAgLyoqCisgICAgICogVGhlIHRyYW5zZm9ybSBtYXRyaXggZm9yIHRoZSBWaWV3LiBUaGlzIHRyYW5zZm9ybSBpcyBjYWxjdWxhdGVkIGludGVybmFsbHkKKyAgICAgKiBiYXNlZCBvbiB0aGUgcm90YXRpb24sIHNjYWxlWCwgYW5kIHNjYWxlWSBwcm9wZXJ0aWVzLiBUaGUgaWRlbnRpdHkgbWF0cml4CisgICAgICogaXMgdXNlZCBieSBkZWZhdWx0LiBEbyAqbm90KiB1c2UgdGhpcyB2YXJpYWJsZSBkaXJlY3RseTsgaW5zdGVhZCBjYWxsCisgICAgICogZ2V0TWF0cml4KCksIHdoaWNoIHdpbGwgYXV0b21hdGljYWxseSByZWNhbGN1bGF0ZSB0aGUgbWF0cml4IGlmIG5lY2Vzc2FyeQorICAgICAqIHRvIGdldCB0aGUgY29ycmVjdCBtYXRyaXggYmFzZWQgb24gdGhlIGxhdGVzdCByb3RhdGlvbiBhbmQgc2NhbGUgcHJvcGVydGllcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIE1hdHJpeCBtSW52ZXJzZU1hdHJpeDsKKworICAgIC8qKgorICAgICAqIEFuIGludGVybmFsIHZhcmlhYmxlIHRoYXQgdHJhY2tzIHdoZXRoZXIgd2UgbmVlZCB0byByZWNhbGN1bGF0ZSB0aGUKKyAgICAgKiB0cmFuc2Zvcm0gbWF0cml4LCBiYXNlZCBvbiB3aGV0aGVyIHRoZSByb3RhdGlvbiBvciBzY2FsZVgvWSBwcm9wZXJ0aWVzCisgICAgICogaGF2ZSBjaGFuZ2VkIHNpbmNlIHRoZSBtYXRyaXggd2FzIGxhc3QgY2FsY3VsYXRlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gbU1hdHJpeERpcnR5ID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBBbiBpbnRlcm5hbCB2YXJpYWJsZSB0aGF0IHRyYWNrcyB3aGV0aGVyIHdlIG5lZWQgdG8gcmVjYWxjdWxhdGUgdGhlCisgICAgICogdHJhbnNmb3JtIG1hdHJpeCwgYmFzZWQgb24gd2hldGhlciB0aGUgcm90YXRpb24gb3Igc2NhbGVYL1kgcHJvcGVydGllcworICAgICAqIGhhdmUgY2hhbmdlZCBzaW5jZSB0aGUgbWF0cml4IHdhcyBsYXN0IGNhbGN1bGF0ZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIG1JbnZlcnNlTWF0cml4RGlydHkgPSB0cnVlOworCisgICAgLyoqCisgICAgICogQSB2YXJpYWJsZSB0aGF0IHRyYWNrcyB3aGV0aGVyIHdlIG5lZWQgdG8gcmVjYWxjdWxhdGUgdGhlCisgICAgICogdHJhbnNmb3JtIG1hdHJpeCwgYmFzZWQgb24gd2hldGhlciB0aGUgcm90YXRpb24gb3Igc2NhbGVYL1kgcHJvcGVydGllcworICAgICAqIGhhdmUgY2hhbmdlZCBzaW5jZSB0aGUgbWF0cml4IHdhcyBsYXN0IGNhbGN1bGF0ZWQuIFRoaXMgdmFyaWFibGUKKyAgICAgKiBpcyBvbmx5IHZhbGlkIGFmdGVyIGEgY2FsbCB0byBnZXRNYXRyaXgoKS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gbU1hdHJpeElzSWRlbnRpdHkgPSB0cnVlOworCisgICAgLyoqCisgICAgICogVGhlIENhbWVyYSBvYmplY3QgaXMgdXNlZCB0byBjb21wdXRlIGEgM0QgbWF0cml4IHdoZW4gcm90YXRpb25YIG9yIHJvdGF0aW9uWSBhcmUgc2V0LgorICAgICAqLworICAgIHByaXZhdGUgQ2FtZXJhIG1DYW1lcmEgPSBudWxsOworCisgICAgLyoqCisgICAgICogVGhpcyBtYXRyaXggaXMgdXNlZCB3aGVuIGNvbXB1dGluZyB0aGUgbWF0cml4IGZvciAzRCByb3RhdGlvbnMuCisgICAgICovCisgICAgcHJpdmF0ZSBNYXRyaXggbWF0cml4M0QgPSBudWxsOworCisgICAgLyoqCisgICAgICogVGhlc2UgcHJldiB2YWx1ZXMgYXJlIHVzZWQgdG8gcmVjYWxjdWxhdGUgYSBjZW50ZXJlZCBwaXZvdCBwb2ludCB3aGVuIG5lY2Vzc2FyeS4gVGhlCisgICAgICogcGl2b3QgcG9pbnQgaXMgb25seSB1c2VkIGluIG1hdHJpeCBvcGVyYXRpb25zICh3aGVuIHJvdGF0aW9uLCBzY2FsZSwgb3IgdHJhbnNsYXRpb24gYXJlCisgICAgICogc2V0KSwgc28gdGhlcyB2YWx1ZXMgYXJlIG9ubHkgdXNlZCB0aGVuIGFzIHdlbGwuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgbVByZXZXaWR0aCA9IC0xOworICAgIHByaXZhdGUgaW50IG1QcmV2SGVpZ2h0ID0gLTE7CisKKyAgICAvKioKKyAgICAgKiBDb252ZW5pZW5jZSB2YWx1ZSB0byBjaGVjayBmb3IgZmxvYXQgdmFsdWVzIHRoYXQgYXJlIGNsb3NlIGVub3VnaCB0byB6ZXJvIHRvIGJlIGNvbnNpZGVyZWQKKyAgICAgKiB6ZXJvLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGZsb2F0IE5PTlpFUk9fRVBTSUxPTiA9IC4wMDFmOworCisgICAgLyoqCisgICAgICogVGhlIGRlZ3JlZXMgcm90YXRpb24gYXJvdW5kIHRoZSB2ZXJ0aWNhbCBheGlzIHRocm91Z2ggdGhlIHBpdm90IHBvaW50LgorICAgICAqLworICAgIEBWaWV3RGVidWcuRXhwb3J0ZWRQcm9wZXJ0eQorICAgIHByaXZhdGUgZmxvYXQgbVJvdGF0aW9uWSA9IDBmOworCisgICAgLyoqCisgICAgICogVGhlIGRlZ3JlZXMgcm90YXRpb24gYXJvdW5kIHRoZSBob3Jpem9udGFsIGF4aXMgdGhyb3VnaCB0aGUgcGl2b3QgcG9pbnQuCisgICAgICovCisgICAgQFZpZXdEZWJ1Zy5FeHBvcnRlZFByb3BlcnR5CisgICAgcHJpdmF0ZSBmbG9hdCBtUm90YXRpb25YID0gMGY7CisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVncmVlcyByb3RhdGlvbiBhcm91bmQgdGhlIHBpdm90IHBvaW50LgorICAgICAqLworICAgIEBWaWV3RGVidWcuRXhwb3J0ZWRQcm9wZXJ0eQorICAgIHByaXZhdGUgZmxvYXQgbVJvdGF0aW9uID0gMGY7CisKKyAgICAvKioKKyAgICAgKiBUaGUgYW1vdW50IG9mIHRyYW5zbGF0aW9uIG9mIHRoZSBvYmplY3QgYXdheSBmcm9tIGl0cyBsZWZ0IHByb3BlcnR5IChwb3N0LWxheW91dCkuCisgICAgICovCisgICAgQFZpZXdEZWJ1Zy5FeHBvcnRlZFByb3BlcnR5CisgICAgcHJpdmF0ZSBmbG9hdCBtVHJhbnNsYXRpb25YID0gMGY7CisKKyAgICAvKioKKyAgICAgKiBUaGUgYW1vdW50IG9mIHRyYW5zbGF0aW9uIG9mIHRoZSBvYmplY3QgYXdheSBmcm9tIGl0cyB0b3AgcHJvcGVydHkgKHBvc3QtbGF5b3V0KS4KKyAgICAgKi8KKyAgICBAVmlld0RlYnVnLkV4cG9ydGVkUHJvcGVydHkKKyAgICBwcml2YXRlIGZsb2F0IG1UcmFuc2xhdGlvblkgPSAwZjsKKworICAgIC8qKgorICAgICAqIFRoZSBhbW91bnQgb2Ygc2NhbGUgaW4gdGhlIHggZGlyZWN0aW9uIGFyb3VuZCB0aGUgcGl2b3QgcG9pbnQuIEEKKyAgICAgKiB2YWx1ZSBvZiAxIG1lYW5zIG5vIHNjYWxpbmcgaXMgYXBwbGllZC4KKyAgICAgKi8KKyAgICBAVmlld0RlYnVnLkV4cG9ydGVkUHJvcGVydHkKKyAgICBwcml2YXRlIGZsb2F0IG1TY2FsZVggPSAxZjsKKworICAgIC8qKgorICAgICAqIFRoZSBhbW91bnQgb2Ygc2NhbGUgaW4gdGhlIHkgZGlyZWN0aW9uIGFyb3VuZCB0aGUgcGl2b3QgcG9pbnQuIEEKKyAgICAgKiB2YWx1ZSBvZiAxIG1lYW5zIG5vIHNjYWxpbmcgaXMgYXBwbGllZC4KKyAgICAgKi8KKyAgICBAVmlld0RlYnVnLkV4cG9ydGVkUHJvcGVydHkKKyAgICBwcml2YXRlIGZsb2F0IG1TY2FsZVkgPSAxZjsKKworICAgIC8qKgorICAgICAqIFRoZSBhbW91bnQgb2Ygc2NhbGUgaW4gdGhlIHggZGlyZWN0aW9uIGFyb3VuZCB0aGUgcGl2b3QgcG9pbnQuIEEKKyAgICAgKiB2YWx1ZSBvZiAxIG1lYW5zIG5vIHNjYWxpbmcgaXMgYXBwbGllZC4KKyAgICAgKi8KKyAgICBAVmlld0RlYnVnLkV4cG9ydGVkUHJvcGVydHkKKyAgICBwcml2YXRlIGZsb2F0IG1QaXZvdFggPSAwZjsKKworICAgIC8qKgorICAgICAqIFRoZSBhbW91bnQgb2Ygc2NhbGUgaW4gdGhlIHkgZGlyZWN0aW9uIGFyb3VuZCB0aGUgcGl2b3QgcG9pbnQuIEEKKyAgICAgKiB2YWx1ZSBvZiAxIG1lYW5zIG5vIHNjYWxpbmcgaXMgYXBwbGllZC4KKyAgICAgKi8KKyAgICBAVmlld0RlYnVnLkV4cG9ydGVkUHJvcGVydHkKKyAgICBwcml2YXRlIGZsb2F0IG1QaXZvdFkgPSAwZjsKKworICAgIC8qKgorICAgICAqIFRoZSBvcGFjaXR5IG9mIHRoZSBWaWV3LiBUaGlzIGlzIGEgdmFsdWUgZnJvbSAwIHRvIDEsIHdoZXJlIDAgbWVhbnMKKyAgICAgKiBjb21wbGV0ZWx5IHRyYW5zcGFyZW50IGFuZCAxIG1lYW5zIGNvbXBsZXRlbHkgb3BhcXVlLgorICAgICAqLworICAgIEBWaWV3RGVidWcuRXhwb3J0ZWRQcm9wZXJ0eQorICAgIHByaXZhdGUgZmxvYXQgbUFscGhhID0gMWY7CisKKyAgICAvKioKICAgICAgKiBUaGUgZGlzdGFuY2UgaW4gcGl4ZWxzIGZyb20gdGhlIGxlZnQgZWRnZSBvZiB0aGlzIHZpZXcncyBwYXJlbnQKICAgICAgKiB0byB0aGUgbGVmdCBlZGdlIG9mIHRoaXMgdmlldy4KICAgICAgKiB7QGhpZGV9CkBAIC0xNzE5LDggKzE4NzMsOCBAQAogCiAgICAgcHJpdmF0ZSBpbnRbXSBtRHJhd2FibGVTdGF0ZSA9IG51bGw7CiAKLSAgICBwcml2YXRlIFNvZnRSZWZlcmVuY2U8Qml0bWFwPiBtRHJhd2luZ0NhY2hlOwotICAgIHByaXZhdGUgU29mdFJlZmVyZW5jZTxCaXRtYXA+IG1VbnNjYWxlZERyYXdpbmdDYWNoZTsKKyAgICBwcml2YXRlIEJpdG1hcCBtRHJhd2luZ0NhY2hlOworICAgIHByaXZhdGUgQml0bWFwIG1VbnNjYWxlZERyYXdpbmdDYWNoZTsKIAogICAgIC8qKgogICAgICAqIFdoZW4gdGhpcyB2aWV3IGhhcyBmb2N1cyBhbmQgdGhlIG5leHQgZm9jdXMgaXMge0BsaW5rICNGT0NVU19MRUZUfSwKQEAgLTI0NDQsNiArMjU5OCwxOCBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFN0YXJ0IGFuIGFjdGlvbiBtb2RlLgorICAgICAqCisgICAgICogQHBhcmFtIGNhbGxiYWNrIENhbGxiYWNrIHRoYXQgd2lsbCBjb250cm9sIHRoZSBsaWZlY3ljbGUgb2YgdGhlIGFjdGlvbiBtb2RlCisgICAgICogQHJldHVybiBUaGUgbmV3IGFjdGlvbiBtb2RlIGlmIGl0IGlzIHN0YXJ0ZWQsIG51bGwgb3RoZXJ3aXNlCisgICAgICoKKyAgICAgKiBAc2VlIEFjdGlvbk1vZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgQWN0aW9uTW9kZSBzdGFydEFjdGlvbk1vZGUoQWN0aW9uTW9kZS5DYWxsYmFjayBjYWxsYmFjaykgeworICAgICAgICByZXR1cm4gZ2V0UGFyZW50KCkuc3RhcnRBY3Rpb25Nb2RlRm9yQ2hpbGQodGhpcywgY2FsbGJhY2spOworICAgIH0KKworICAgIC8qKgogICAgICAqIFJlZ2lzdGVyIGEgY2FsbGJhY2sgdG8gYmUgaW52b2tlZCB3aGVuIGEga2V5IGlzIHByZXNzZWQgaW4gdGhpcyB2aWV3LgogICAgICAqIEBwYXJhbSBsIHRoZSBrZXkgbGlzdGVuZXIgdG8gYXR0YWNoIHRvIHRoaXMgdmlldwogICAgICAqLwpAQCAtMzI3Myw3ICszNDM5LDcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBwcmVzc2VkIHRoYXQgZm9yIHRoaXMgdmlldy4KKyAgICAgKiBTZXRzIHRoZSBwcmVzc2VkIHN0YXRlIGZvciB0aGlzIHZpZXcuCiAgICAgICoKICAgICAgKiBAc2VlICNpc0NsaWNrYWJsZSgpCiAgICAgICogQHNlZSAjc2V0Q2xpY2thYmxlKGJvb2xlYW4pCkBAIC0zMzUxLDYgKzM1MTcsMzggQEAKIAogCiAgICAgLyoqCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGVudGlyZSBoaWVyYXJjaHkgdW5kZXIgdGhpcyB2aWV3IHdpbGwgc2F2ZSBpdHMKKyAgICAgKiBzdGF0ZSB3aGVuIGEgc3RhdGUgc2F2aW5nIHRyYXZlcnNhbCBvY2N1cnMgZnJvbSBpdHMgcGFyZW50LiAgVGhlIGRlZmF1bHQKKyAgICAgKiBpcyB0cnVlOyBpZiBmYWxzZSwgdGhlc2Ugdmlld3Mgd2lsbCBub3QgYmUgc2F2ZWQgdW5sZXNzCisgICAgICoge0BsaW5rICNzYXZlSGllcmFyY2h5U3RhdGUoU3BhcnNlQXJyYXkpfSBpcyBjYWxsZWQgZGlyZWN0bHkgb24gdGhpcyB2aWV3LgorICAgICAqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRydWUgaWYgdGhlIHZpZXcgc3RhdGUgc2F2aW5nIGZyb20gcGFyZW50IGlzIGVuYWJsZWQsIGVsc2UgZmFsc2UuCisgICAgICoKKyAgICAgKiBAc2VlICNzZXRTYXZlRnJvbVBhcmVudEVuYWJsZWQoYm9vbGVhbikKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1NhdmVGcm9tUGFyZW50RW5hYmxlZCgpIHsKKyAgICAgICAgcmV0dXJuIChtVmlld0ZsYWdzICYgUEFSRU5UX1NBVkVfRElTQUJMRURfTUFTSykgIT0gUEFSRU5UX1NBVkVfRElTQUJMRUQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udHJvbHMgd2hldGhlciB0aGUgZW50aXJlIGhpZXJhcmNoeSB1bmRlciB0aGlzIHZpZXcgd2lsbCBzYXZlIGl0cworICAgICAqIHN0YXRlIHdoZW4gYSBzdGF0ZSBzYXZpbmcgdHJhdmVyc2FsIG9jY3VycyBmcm9tIGl0cyBwYXJlbnQuICBUaGUgZGVmYXVsdAorICAgICAqIGlzIHRydWU7IGlmIGZhbHNlLCB0aGVzZSB2aWV3cyB3aWxsIG5vdCBiZSBzYXZlZCB1bmxlc3MKKyAgICAgKiB7QGxpbmsgI3NhdmVIaWVyYXJjaHlTdGF0ZShTcGFyc2VBcnJheSl9IGlzIGNhbGxlZCBkaXJlY3RseSBvbiB0aGlzIHZpZXcuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZW5hYmxlZCBTZXQgdG8gZmFsc2UgdG8gPGVtPmRpc2FibGU8L2VtPiBzdGF0ZSBzYXZpbmcsIG9yIHRydWUKKyAgICAgKiAodGhlIGRlZmF1bHQpIHRvIGFsbG93IGl0LgorICAgICAqCisgICAgICogQHNlZSAjaXNTYXZlRnJvbVBhcmVudEVuYWJsZWQoKQorICAgICAqIEBzZWUgI3NldElkKGludCkKKyAgICAgKiBAc2VlICNvblNhdmVJbnN0YW5jZVN0YXRlKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTYXZlRnJvbVBhcmVudEVuYWJsZWQoYm9vbGVhbiBlbmFibGVkKSB7CisgICAgICAgIHNldEZsYWdzKGVuYWJsZWQgPyAwIDogUEFSRU5UX1NBVkVfRElTQUJMRUQsIFBBUkVOVF9TQVZFX0RJU0FCTEVEX01BU0spOworICAgIH0KKworCisgICAgLyoqCiAgICAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgVmlldyBpcyBhYmxlIHRvIHRha2UgZm9jdXMuCiAgICAgICoKICAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhpcyB2aWV3IGNhbiB0YWtlIGZvY3VzLCBvciBmYWxzZSBvdGhlcndpc2UuCkBAIC00MzczLDkgKzQ1NzEsNyBAQAogICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgeSA9IChpbnQpIGV2ZW50LmdldFkoKTsKIAogICAgICAgICAgICAgICAgICAgICAvLyBCZSBsZW5pZW50IGFib3V0IG1vdmluZyBvdXRzaWRlIG9mIGJ1dHRvbnMKLSAgICAgICAgICAgICAgICAgICAgaW50IHNsb3AgPSBtVG91Y2hTbG9wOwotICAgICAgICAgICAgICAgICAgICBpZiAoKHggPCAwIC0gc2xvcCkgfHwgKHggPj0gZ2V0V2lkdGgoKSArIHNsb3ApIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHkgPCAwIC0gc2xvcCkgfHwgKHkgPj0gZ2V0SGVpZ2h0KCkgKyBzbG9wKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIXBvaW50SW5WaWV3KHgsIHksIG1Ub3VjaFNsb3ApKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPdXRzaWRlIGJ1dHRvbgogICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlVGFwQ2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgobVByaXZhdGVGbGFncyAmIFBSRVNTRUQpICE9IDApIHsKQEAgLTQ3MjEsNiArNDkxNywzNDQgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBUaGUgdHJhbnNmb3JtIG1hdHJpeCBvZiB0aGlzIHZpZXcsIHdoaWNoIGlzIGNhbGN1bGF0ZWQgYmFzZWQgb24gdGhlIGN1cnJlbnQKKyAgICAgKiByb2F0aW9uLCBzY2FsZSwgYW5kIHBpdm90IHByb3BlcnRpZXMuCisgICAgICoKKyAgICAgKiBAc2VlICNnZXRSb3RhdGlvbigpCisgICAgICogQHNlZSAjZ2V0U2NhbGVYKCkKKyAgICAgKiBAc2VlICNnZXRTY2FsZVkoKQorICAgICAqIEBzZWUgI2dldFBpdm90WCgpCisgICAgICogQHNlZSAjZ2V0UGl2b3RZKCkKKyAgICAgKiBAcmV0dXJuIFRoZSBjdXJyZW50IHRyYW5zZm9ybSBtYXRyaXggZm9yIHRoZSB2aWV3CisgICAgICovCisgICAgcHVibGljIE1hdHJpeCBnZXRNYXRyaXgoKSB7CisgICAgICAgIGhhc0lkZW50aXR5TWF0cml4KCk7CisgICAgICAgIHJldHVybiBtTWF0cml4OworICAgIH0KKworICAgIC8qKgorICAgICAqIFV0aWxpdHkgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIGlmIHRoZSB2YWx1ZSBpcyBmYXIgZW5vdWdoIGF3YXkgZnJvbSB6ZXJvIHRvIGJlCisgICAgICogY29uc2lkZXJlZCBub24temVyby4KKyAgICAgKiBAcGFyYW0gdmFsdWUgQSBmbG9hdGluZyBwb2ludCB2YWx1ZSB0byBjaGVjayBmb3IgemVyby1uZXNzCisgICAgICogQHJldHVybiB3aGV0aGVyIHRoZSBwYXNzZWQtaW4gdmFsdWUgaXMgZmFyIGVub3VnaCBhd2F5IGZyb20gemVybyB0byBiZSBjb25zaWRlcmVkIG5vbi16ZXJvCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBub256ZXJvKGZsb2F0IHZhbHVlKSB7CisgICAgICAgIHJldHVybiAodmFsdWUgPCAtTk9OWkVST19FUFNJTE9OIHx8IHZhbHVlID4gTk9OWkVST19FUFNJTE9OKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWNvbXB1dGVzIHRoZSB0cmFuc2Zvcm0gbWF0cml4IGlmIG5lY2Vzc2FyeS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHRyYW5zZm9ybSBtYXRyaXggaXMgdGhlIGlkZW50aXR5IG1hdHJpeCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqLworICAgIGJvb2xlYW4gaGFzSWRlbnRpdHlNYXRyaXgoKSB7CisgICAgICAgIGlmIChtTWF0cml4RGlydHkpIHsKKyAgICAgICAgICAgIC8vIHRyYW5zZm9ybS1yZWxhdGVkIHByb3BlcnRpZXMgaGF2ZSBjaGFuZ2VkIHNpbmNlIHRoZSBsYXN0IHRpbWUgc29tZW9uZQorICAgICAgICAgICAgLy8gYXNrZWQgZm9yIHRoZSBtYXRyaXg7IHJlY2FsY3VsYXRlIGl0IHdpdGggdGhlIGN1cnJlbnQgdmFsdWVzCisKKyAgICAgICAgICAgIC8vIEZpZ3VyZSBvdXQgaWYgd2UgbmVlZCB0byB1cGRhdGUgdGhlIHBpdm90IHBvaW50CisgICAgICAgICAgICBpZiAoKG1Qcml2YXRlRmxhZ3MgJiBQSVZPVF9FWFBMSUNJVExZX1NFVCkgPT0gMCkgeworICAgICAgICAgICAgICAgIGlmICgobVJpZ2h0IC0gbUxlZnQpICE9IG1QcmV2V2lkdGggJiYgKG1Cb3R0b20gLSBtVG9wKSAhPSBtUHJldkhlaWdodCkgeworICAgICAgICAgICAgICAgICAgICBtUHJldldpZHRoID0gbVJpZ2h0IC0gbUxlZnQ7CisgICAgICAgICAgICAgICAgICAgIG1QcmV2SGVpZ2h0ID0gbUJvdHRvbSAtIG1Ub3A7CisgICAgICAgICAgICAgICAgICAgIG1QaXZvdFggPSAoZmxvYXQpIG1QcmV2V2lkdGggLyAyZjsKKyAgICAgICAgICAgICAgICAgICAgbVBpdm90WSA9IChmbG9hdCkgbVByZXZIZWlnaHQgLyAyZjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtTWF0cml4LnJlc2V0KCk7CisgICAgICAgICAgICBtTWF0cml4LnNldFRyYW5zbGF0ZShtVHJhbnNsYXRpb25YLCBtVHJhbnNsYXRpb25ZKTsKKyAgICAgICAgICAgIG1NYXRyaXgucHJlUm90YXRlKG1Sb3RhdGlvbiwgbVBpdm90WCwgbVBpdm90WSk7CisgICAgICAgICAgICBtTWF0cml4LnByZVNjYWxlKG1TY2FsZVgsIG1TY2FsZVksIG1QaXZvdFgsIG1QaXZvdFkpOworICAgICAgICAgICAgaWYgKG5vbnplcm8obVJvdGF0aW9uWCkgfHwgbm9uemVybyhtUm90YXRpb25ZKSkgeworICAgICAgICAgICAgICAgIGlmIChtQ2FtZXJhID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbUNhbWVyYSA9IG5ldyBDYW1lcmEoKTsKKyAgICAgICAgICAgICAgICAgICAgbWF0cml4M0QgPSBuZXcgTWF0cml4KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1DYW1lcmEuc2F2ZSgpOworICAgICAgICAgICAgICAgIG1DYW1lcmEucm90YXRlWChtUm90YXRpb25YKTsKKyAgICAgICAgICAgICAgICBtQ2FtZXJhLnJvdGF0ZVkobVJvdGF0aW9uWSk7CisgICAgICAgICAgICAgICAgbUNhbWVyYS5nZXRNYXRyaXgobWF0cml4M0QpOworICAgICAgICAgICAgICAgIG1hdHJpeDNELnByZVRyYW5zbGF0ZSgtbVBpdm90WCwgLW1QaXZvdFkpOworICAgICAgICAgICAgICAgIG1hdHJpeDNELnBvc3RUcmFuc2xhdGUobVBpdm90WCwgbVBpdm90WSk7CisgICAgICAgICAgICAgICAgbU1hdHJpeC5wb3N0Q29uY2F0KG1hdHJpeDNEKTsKKyAgICAgICAgICAgICAgICBtQ2FtZXJhLnJlc3RvcmUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1NYXRyaXhEaXJ0eSA9IGZhbHNlOworICAgICAgICAgICAgbU1hdHJpeElzSWRlbnRpdHkgPSBtTWF0cml4LmlzSWRlbnRpdHkoKTsKKyAgICAgICAgICAgIG1JbnZlcnNlTWF0cml4RGlydHkgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtTWF0cml4SXNJZGVudGl0eTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVdGlsaXR5IG1ldGhvZCB0byByZXRyaWV2ZSB0aGUgaW52ZXJzZSBvZiB0aGUgY3VycmVudCBtTWF0cml4IHByb3BlcnR5LgorICAgICAqIFdlIGNhY2hlIHRoZSBtYXRyaXggdG8gYXZvaWQgcmVjYWxjdWxhdGluZyBpdCB3aGVuIHRyYW5zZm9ybSBwcm9wZXJ0aWVzCisgICAgICogaGF2ZSBub3QgY2hhbmdlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIGludmVyc2Ugb2YgdGhlIGN1cnJlbnQgbWF0cml4IG9mIHRoaXMgdmlldy4KKyAgICAgKi8KKyAgICBNYXRyaXggZ2V0SW52ZXJzZU1hdHJpeCgpIHsKKyAgICAgICAgaWYgKG1JbnZlcnNlTWF0cml4RGlydHkpIHsKKyAgICAgICAgICAgIGlmIChtSW52ZXJzZU1hdHJpeCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUludmVyc2VNYXRyaXggPSBuZXcgTWF0cml4KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtTWF0cml4LmludmVydChtSW52ZXJzZU1hdHJpeCk7CisgICAgICAgICAgICBtSW52ZXJzZU1hdHJpeERpcnR5ID0gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1JbnZlcnNlTWF0cml4OworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBkZWdyZWVzIHRoYXQgdGhlIHZpZXcgaXMgcm90YXRlZCBhcm91bmQgdGhlIHBpdm90IHBvaW50LgorICAgICAqCisgICAgICogQHNlZSAjZ2V0UGl2b3RYKCkKKyAgICAgKiBAc2VlICNnZXRQaXZvdFkoKQorICAgICAqIEByZXR1cm4gVGhlIGRlZ3JlZXMgb2Ygcm90YXRpb24uCisgICAgICovCisgICAgcHVibGljIGZsb2F0IGdldFJvdGF0aW9uKCkgeworICAgICAgICByZXR1cm4gbVJvdGF0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGRlZ3JlZXMgdGhhdCB0aGUgdmlldyBpcyByb3RhdGVkIGFyb3VuZCB0aGUgcGl2b3QgcG9pbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcm90YXRpb24gVGhlIGRlZ3JlZXMgb2Ygcm90YXRpb24uCisgICAgICogQHNlZSAjZ2V0UGl2b3RYKCkKKyAgICAgKiBAc2VlICNnZXRQaXZvdFkoKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJvdGF0aW9uKGZsb2F0IHJvdGF0aW9uKSB7CisgICAgICAgIGlmIChtUm90YXRpb24gIT0gcm90YXRpb24pIHsKKyAgICAgICAgICAgIC8vIERvdWJsZS1pbnZhbGlkYXRpb24gaXMgbmVjZXNzYXJ5IHRvIGNhcHR1cmUgdmlldydzIG9sZCBhbmQgbmV3IGFyZWFzCisgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CisgICAgICAgICAgICBtUm90YXRpb24gPSByb3RhdGlvbjsKKyAgICAgICAgICAgIG1NYXRyaXhEaXJ0eSA9IHRydWU7CisgICAgICAgICAgICBtUHJpdmF0ZUZsYWdzIHw9IERSQVdOOyAvLyBmb3JjZSBhbm90aGVyIGludmFsaWRhdGlvbiB3aXRoIHRoZSBuZXcgb3JpZW50YXRpb24KKyAgICAgICAgICAgIGludmFsaWRhdGUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBkZWdyZWVzIHRoYXQgdGhlIHZpZXcgaXMgcm90YXRlZCBhcm91bmQgdGhlIHZlcnRpY2FsIGF4aXMgdGhyb3VnaCB0aGUgcGl2b3QgcG9pbnQuCisgICAgICoKKyAgICAgKiBAc2VlICNnZXRQaXZvdFgoKQorICAgICAqIEBzZWUgI2dldFBpdm90WSgpCisgICAgICogQHJldHVybiBUaGUgZGVncmVlcyBvZiBZIHJvdGF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBmbG9hdCBnZXRSb3RhdGlvblkoKSB7CisgICAgICAgIHJldHVybiBtUm90YXRpb25ZOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGRlZ3JlZXMgdGhhdCB0aGUgdmlldyBpcyByb3RhdGVkIGFyb3VuZCB0aGUgdmVydGljYWwgYXhpcyB0aHJvdWdoIHBpdm90IHBvaW50LgorICAgICAqCisgICAgICogQHBhcmFtIHJvdGF0aW9uWSBUaGUgZGVncmVlcyBvZiBZIHJvdGF0aW9uLgorICAgICAqIEBzZWUgI2dldFBpdm90WCgpCisgICAgICogQHNlZSAjZ2V0UGl2b3RZKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSb3RhdGlvblkoZmxvYXQgcm90YXRpb25ZKSB7CisgICAgICAgIGlmIChtUm90YXRpb25ZICE9IHJvdGF0aW9uWSkgeworICAgICAgICAgICAgLy8gRG91YmxlLWludmFsaWRhdGlvbiBpcyBuZWNlc3NhcnkgdG8gY2FwdHVyZSB2aWV3J3Mgb2xkIGFuZCBuZXcgYXJlYXMKKyAgICAgICAgICAgIGludmFsaWRhdGUoKTsKKyAgICAgICAgICAgIG1Sb3RhdGlvblkgPSByb3RhdGlvblk7CisgICAgICAgICAgICBtTWF0cml4RGlydHkgPSB0cnVlOworICAgICAgICAgICAgbVByaXZhdGVGbGFncyB8PSBEUkFXTjsgLy8gZm9yY2UgYW5vdGhlciBpbnZhbGlkYXRpb24gd2l0aCB0aGUgbmV3IG9yaWVudGF0aW9uCisgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVncmVlcyB0aGF0IHRoZSB2aWV3IGlzIHJvdGF0ZWQgYXJvdW5kIHRoZSBob3Jpem9udGFsIGF4aXMgdGhyb3VnaCB0aGUgcGl2b3QgcG9pbnQuCisgICAgICoKKyAgICAgKiBAc2VlICNnZXRQaXZvdFgoKQorICAgICAqIEBzZWUgI2dldFBpdm90WSgpCisgICAgICogQHJldHVybiBUaGUgZGVncmVlcyBvZiBYIHJvdGF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBmbG9hdCBnZXRSb3RhdGlvblgoKSB7CisgICAgICAgIHJldHVybiBtUm90YXRpb25YOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGRlZ3JlZXMgdGhhdCB0aGUgdmlldyBpcyByb3RhdGVkIGFyb3VuZCB0aGUgaG9yaXpvbnRhbCBheGlzIHRocm91Z2ggcGl2b3QgcG9pbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcm90YXRpb25YIFRoZSBkZWdyZWVzIG9mIFggcm90YXRpb24uCisgICAgICogQHNlZSAjZ2V0UGl2b3RYKCkKKyAgICAgKiBAc2VlICNnZXRQaXZvdFkoKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJvdGF0aW9uWChmbG9hdCByb3RhdGlvblgpIHsKKyAgICAgICAgaWYgKG1Sb3RhdGlvblggIT0gcm90YXRpb25YKSB7CisgICAgICAgICAgICAvLyBEb3VibGUtaW52YWxpZGF0aW9uIGlzIG5lY2Vzc2FyeSB0byBjYXB0dXJlIHZpZXcncyBvbGQgYW5kIG5ldyBhcmVhcworICAgICAgICAgICAgaW52YWxpZGF0ZSgpOworICAgICAgICAgICAgbVJvdGF0aW9uWCA9IHJvdGF0aW9uWDsKKyAgICAgICAgICAgIG1NYXRyaXhEaXJ0eSA9IHRydWU7CisgICAgICAgICAgICBtUHJpdmF0ZUZsYWdzIHw9IERSQVdOOyAvLyBmb3JjZSBhbm90aGVyIGludmFsaWRhdGlvbiB3aXRoIHRoZSBuZXcgb3JpZW50YXRpb24KKyAgICAgICAgICAgIGludmFsaWRhdGUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBhbW91bnQgdGhhdCB0aGUgdmlldyBpcyBzY2FsZWQgaW4geCBhcm91bmQgdGhlIHBpdm90IHBvaW50LCBhcyBhIHByb3BvcnRpb24gb2YKKyAgICAgKiB0aGUgdmlldydzIHVuc2NhbGVkIHdpZHRoLiBBIHZhbHVlIG9mIDEsIHRoZSBkZWZhdWx0LCBtZWFucyB0aGF0IG5vIHNjYWxpbmcgaXMgYXBwbGllZC4KKyAgICAgKgorICAgICAqIEBkZWZhdWx0IDEuMGYKKyAgICAgKiBAc2VlICNnZXRQaXZvdFgoKQorICAgICAqIEBzZWUgI2dldFBpdm90WSgpCisgICAgICogQHJldHVybiBUaGUgc2NhbGluZyBmYWN0b3IuCisgICAgICovCisgICAgcHVibGljIGZsb2F0IGdldFNjYWxlWCgpIHsKKyAgICAgICAgcmV0dXJuIG1TY2FsZVg7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgYW1vdW50IHRoYXQgdGhlIHZpZXcgaXMgc2NhbGVkIGluIHggYXJvdW5kIHRoZSBwaXZvdCBwb2ludCwgYXMgYSBwcm9wb3J0aW9uIG9mCisgICAgICogdGhlIHZpZXcncyB1bnNjYWxlZCB3aWR0aC4gQSB2YWx1ZSBvZiAxIG1lYW5zIHRoYXQgbm8gc2NhbGluZyBpcyBhcHBsaWVkLgorICAgICAqCisgICAgICogQHBhcmFtIHNjYWxlWCBUaGUgc2NhbGluZyBmYWN0b3IuCisgICAgICogQHNlZSAjZ2V0UGl2b3RYKCkKKyAgICAgKiBAc2VlICNnZXRQaXZvdFkoKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNjYWxlWChmbG9hdCBzY2FsZVgpIHsKKyAgICAgICAgaWYgKG1TY2FsZVggIT0gc2NhbGVYKSB7CisgICAgICAgICAgICAvLyBEb3VibGUtaW52YWxpZGF0aW9uIGlzIG5lY2Vzc2FyeSB0byBjYXB0dXJlIHZpZXcncyBvbGQgYW5kIG5ldyBhcmVhcworICAgICAgICAgICAgaW52YWxpZGF0ZSgpOworICAgICAgICAgICAgbVNjYWxlWCA9IHNjYWxlWDsKKyAgICAgICAgICAgIG1NYXRyaXhEaXJ0eSA9IHRydWU7CisgICAgICAgICAgICBtUHJpdmF0ZUZsYWdzIHw9IERSQVdOOyAvLyBmb3JjZSBhbm90aGVyIGludmFsaWRhdGlvbiB3aXRoIHRoZSBuZXcgb3JpZW50YXRpb24KKyAgICAgICAgICAgIGludmFsaWRhdGUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBhbW91bnQgdGhhdCB0aGUgdmlldyBpcyBzY2FsZWQgaW4geSBhcm91bmQgdGhlIHBpdm90IHBvaW50LCBhcyBhIHByb3BvcnRpb24gb2YKKyAgICAgKiB0aGUgdmlldydzIHVuc2NhbGVkIGhlaWdodC4gQSB2YWx1ZSBvZiAxLCB0aGUgZGVmYXVsdCwgbWVhbnMgdGhhdCBubyBzY2FsaW5nIGlzIGFwcGxpZWQuCisgICAgICoKKyAgICAgKiBAZGVmYXVsdCAxLjBmCisgICAgICogQHNlZSAjZ2V0UGl2b3RYKCkKKyAgICAgKiBAc2VlICNnZXRQaXZvdFkoKQorICAgICAqIEByZXR1cm4gVGhlIHNjYWxpbmcgZmFjdG9yLgorICAgICAqLworICAgIHB1YmxpYyBmbG9hdCBnZXRTY2FsZVkoKSB7CisgICAgICAgIHJldHVybiBtU2NhbGVZOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGFtb3VudCB0aGF0IHRoZSB2aWV3IGlzIHNjYWxlZCBpbiBZIGFyb3VuZCB0aGUgcGl2b3QgcG9pbnQsIGFzIGEgcHJvcG9ydGlvbiBvZgorICAgICAqIHRoZSB2aWV3J3MgdW5zY2FsZWQgd2lkdGguIEEgdmFsdWUgb2YgMSBtZWFucyB0aGF0IG5vIHNjYWxpbmcgaXMgYXBwbGllZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzY2FsZVkgVGhlIHNjYWxpbmcgZmFjdG9yLgorICAgICAqIEBzZWUgI2dldFBpdm90WCgpCisgICAgICogQHNlZSAjZ2V0UGl2b3RZKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTY2FsZVkoZmxvYXQgc2NhbGVZKSB7CisgICAgICAgIGlmIChtU2NhbGVZICE9IHNjYWxlWSkgeworICAgICAgICAgICAgLy8gRG91YmxlLWludmFsaWRhdGlvbiBpcyBuZWNlc3NhcnkgdG8gY2FwdHVyZSB2aWV3J3Mgb2xkIGFuZCBuZXcgYXJlYXMKKyAgICAgICAgICAgIGludmFsaWRhdGUoKTsKKyAgICAgICAgICAgIG1TY2FsZVkgPSBzY2FsZVk7CisgICAgICAgICAgICBtTWF0cml4RGlydHkgPSB0cnVlOworICAgICAgICAgICAgbVByaXZhdGVGbGFncyB8PSBEUkFXTjsgLy8gZm9yY2UgYW5vdGhlciBpbnZhbGlkYXRpb24gd2l0aCB0aGUgbmV3IG9yaWVudGF0aW9uCisgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgeCBsb2NhdGlvbiBvZiB0aGUgcG9pbnQgYXJvdW5kIHdoaWNoIHRoZSB2aWV3IGlzIHtAbGluayAjc2V0Um90YXRpb24oZmxvYXQpIHJvdGF0ZWR9CisgICAgICogYW5kIHtAbGluayAjc2V0U2NhbGVYKGZsb2F0KSBzY2FsZWR9LgorICAgICAqCisgICAgICogQHNlZSAjZ2V0Um90YXRpb24oKQorICAgICAqIEBzZWUgI2dldFNjYWxlWCgpCisgICAgICogQHNlZSAjZ2V0U2NhbGVZKCkKKyAgICAgKiBAc2VlICNnZXRQaXZvdFkoKQorICAgICAqIEByZXR1cm4gVGhlIHggbG9jYXRpb24gb2YgdGhlIHBpdm90IHBvaW50LgorICAgICAqLworICAgIHB1YmxpYyBmbG9hdCBnZXRQaXZvdFgoKSB7CisgICAgICAgIHJldHVybiBtUGl2b3RYOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHggbG9jYXRpb24gb2YgdGhlIHBvaW50IGFyb3VuZCB3aGljaCB0aGUgdmlldyBpcworICAgICAqIHtAbGluayAjc2V0Um90YXRpb24oZmxvYXQpIHJvdGF0ZWR9IGFuZCB7QGxpbmsgI3NldFNjYWxlWChmbG9hdCkgc2NhbGVkfS4KKyAgICAgKiBCeSBkZWZhdWx0LCB0aGUgcGl2b3QgcG9pbnQgaXMgY2VudGVyZWQgb24gdGhlIG9iamVjdC4KKyAgICAgKiBTZXR0aW5nIHRoaXMgcHJvcGVydHkgZGlzYWJsZXMgdGhpcyBiZWhhdmlvciBhbmQgY2F1c2VzIHRoZSB2aWV3IHRvIHVzZSBvbmx5IHRoZQorICAgICAqIGV4cGxpY2l0bHkgc2V0IHBpdm90WCBhbmQgcGl2b3RZIHZhbHVlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwaXZvdFggVGhlIHggbG9jYXRpb24gb2YgdGhlIHBpdm90IHBvaW50LgorICAgICAqIEBzZWUgI2dldFJvdGF0aW9uKCkKKyAgICAgKiBAc2VlICNnZXRTY2FsZVgoKQorICAgICAqIEBzZWUgI2dldFNjYWxlWSgpCisgICAgICogQHNlZSAjZ2V0UGl2b3RZKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQaXZvdFgoZmxvYXQgcGl2b3RYKSB7CisgICAgICAgIG1Qcml2YXRlRmxhZ3MgfD0gUElWT1RfRVhQTElDSVRMWV9TRVQ7CisgICAgICAgIGlmIChtUGl2b3RYICE9IHBpdm90WCkgeworICAgICAgICAgICAgLy8gRG91YmxlLWludmFsaWRhdGlvbiBpcyBuZWNlc3NhcnkgdG8gY2FwdHVyZSB2aWV3J3Mgb2xkIGFuZCBuZXcgYXJlYXMKKyAgICAgICAgICAgIGludmFsaWRhdGUoKTsKKyAgICAgICAgICAgIG1QaXZvdFggPSBwaXZvdFg7CisgICAgICAgICAgICBtTWF0cml4RGlydHkgPSB0cnVlOworICAgICAgICAgICAgbVByaXZhdGVGbGFncyB8PSBEUkFXTjsgLy8gZm9yY2UgYW5vdGhlciBpbnZhbGlkYXRpb24gd2l0aCB0aGUgbmV3IG9yaWVudGF0aW9uCisgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgeSBsb2NhdGlvbiBvZiB0aGUgcG9pbnQgYXJvdW5kIHdoaWNoIHRoZSB2aWV3IGlzIHtAbGluayAjc2V0Um90YXRpb24oZmxvYXQpIHJvdGF0ZWR9CisgICAgICogYW5kIHtAbGluayAjc2V0U2NhbGVZKGZsb2F0KSBzY2FsZWR9LgorICAgICAqCisgICAgICogQHNlZSAjZ2V0Um90YXRpb24oKQorICAgICAqIEBzZWUgI2dldFNjYWxlWCgpCisgICAgICogQHNlZSAjZ2V0U2NhbGVZKCkKKyAgICAgKiBAc2VlICNnZXRQaXZvdFkoKQorICAgICAqIEByZXR1cm4gVGhlIHkgbG9jYXRpb24gb2YgdGhlIHBpdm90IHBvaW50LgorICAgICAqLworICAgIHB1YmxpYyBmbG9hdCBnZXRQaXZvdFkoKSB7CisgICAgICAgIHJldHVybiBtUGl2b3RZOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHkgbG9jYXRpb24gb2YgdGhlIHBvaW50IGFyb3VuZCB3aGljaCB0aGUgdmlldyBpcyB7QGxpbmsgI3NldFJvdGF0aW9uKGZsb2F0KSByb3RhdGVkfQorICAgICAqIGFuZCB7QGxpbmsgI3NldFNjYWxlWShmbG9hdCkgc2NhbGVkfS4gQnkgZGVmYXVsdCwgdGhlIHBpdm90IHBvaW50IGlzIGNlbnRlcmVkIG9uIHRoZSBvYmplY3QuCisgICAgICogU2V0dGluZyB0aGlzIHByb3BlcnR5IGRpc2FibGVzIHRoaXMgYmVoYXZpb3IgYW5kIGNhdXNlcyB0aGUgdmlldyB0byB1c2Ugb25seSB0aGUKKyAgICAgKiBleHBsaWNpdGx5IHNldCBwaXZvdFggYW5kIHBpdm90WSB2YWx1ZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGl2b3RZIFRoZSB5IGxvY2F0aW9uIG9mIHRoZSBwaXZvdCBwb2ludC4KKyAgICAgKiBAc2VlICNnZXRSb3RhdGlvbigpCisgICAgICogQHNlZSAjZ2V0U2NhbGVYKCkKKyAgICAgKiBAc2VlICNnZXRTY2FsZVkoKQorICAgICAqIEBzZWUgI2dldFBpdm90WSgpCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UGl2b3RZKGZsb2F0IHBpdm90WSkgeworICAgICAgICBtUHJpdmF0ZUZsYWdzIHw9IFBJVk9UX0VYUExJQ0lUTFlfU0VUOworICAgICAgICBpZiAobVBpdm90WSAhPSBwaXZvdFkpIHsKKyAgICAgICAgICAgIC8vIERvdWJsZS1pbnZhbGlkYXRpb24gaXMgbmVjZXNzYXJ5IHRvIGNhcHR1cmUgdmlldydzIG9sZCBhbmQgbmV3IGFyZWFzCisgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CisgICAgICAgICAgICBtUGl2b3RZID0gcGl2b3RZOworICAgICAgICAgICAgbU1hdHJpeERpcnR5ID0gdHJ1ZTsKKyAgICAgICAgICAgIG1Qcml2YXRlRmxhZ3MgfD0gRFJBV047IC8vIGZvcmNlIGFub3RoZXIgaW52YWxpZGF0aW9uIHdpdGggdGhlIG5ldyBvcmllbnRhdGlvbgorICAgICAgICAgICAgaW52YWxpZGF0ZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIG9wYWNpdHkgb2YgdGhlIHZpZXcuIFRoaXMgaXMgYSB2YWx1ZSBmcm9tIDAgdG8gMSwgd2hlcmUgMCBtZWFucyB0aGUgdmlldyBpcworICAgICAqIGNvbXBsZXRlbHkgdHJhbnNwYXJlbnQgYW5kIDEgbWVhbnMgdGhlIHZpZXcgaXMgY29tcGxldGVseSBvcGFxdWUuCisgICAgICoKKyAgICAgKiBAZGVmYXVsdCAxLjBmCisgICAgICogQHJldHVybiBUaGUgb3BhY2l0eSBvZiB0aGUgdmlldy4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmxvYXQgZ2V0QWxwaGEoKSB7CisgICAgICAgIHJldHVybiBtQWxwaGE7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgb3BhY2l0eSBvZiB0aGUgdmlldy4gVGhpcyBpcyBhIHZhbHVlIGZyb20gMCB0byAxLCB3aGVyZSAwIG1lYW5zIHRoZSB2aWV3IGlzCisgICAgICogY29tcGxldGVseSB0cmFuc3BhcmVudCBhbmQgMSBtZWFucyB0aGUgdmlldyBpcyBjb21wbGV0ZWx5IG9wYXF1ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhbHBoYSBUaGUgb3BhY2l0eSBvZiB0aGUgdmlldy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBbHBoYShmbG9hdCBhbHBoYSkgeworICAgICAgICBtQWxwaGEgPSBhbHBoYTsKKyAgICAgICAgaW52YWxpZGF0ZSgpOworICAgIH0KKworICAgIC8qKgogICAgICAqIFRvcCBwb3NpdGlvbiBvZiB0aGlzIHZpZXcgcmVsYXRpdmUgdG8gaXRzIHBhcmVudC4KICAgICAgKgogICAgICAqIEByZXR1cm4gVGhlIHRvcCBvZiB0aGlzIHZpZXcsIGluIHBpeGVscy4KQEAgLTQ3NjEsMTIgKzUyOTUsMTM4IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogVGhlIHZpc3VhbCB4IHBvc2l0aW9uIG9mIHRoaXMgdmlldywgaW4gcGl4ZWxzLiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gdGhlCisgICAgICoge0BsaW5rICNzZXRUcmFuc2xhdGlvblgoZmxvYXQpIHRyYW5zbGF0aW9uWH0gcHJvcGVydHkgcGx1cyB0aGUgY3VycmVudAorICAgICAqIHtAbGluayAjZ2V0TGVmdCgpIGxlZnR9IHByb3BlcnR5LiAKKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIHZpc3VhbCB4IHBvc2l0aW9uIG9mIHRoaXMgdmlldywgaW4gcGl4ZWxzLgorICAgICAqLworICAgIHB1YmxpYyBmbG9hdCBnZXRYKCkgeworICAgICAgICByZXR1cm4gbUxlZnQgKyBtVHJhbnNsYXRpb25YOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHZpc3VhbCB4IHBvc2l0aW9uIG9mIHRoaXMgdmlldywgaW4gcGl4ZWxzLiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gc2V0dGluZyB0aGUKKyAgICAgKiB7QGxpbmsgI3NldFRyYW5zbGF0aW9uWChmbG9hdCkgdHJhbnNsYXRpb25YfSBwcm9wZXJ0eSB0byBiZSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuCisgICAgICogdGhlIHggdmFsdWUgcGFzc2VkIGluIGFuZCB0aGUgY3VycmVudCB7QGxpbmsgI2dldExlZnQoKSBsZWZ0fSBwcm9wZXJ0eS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB4IFRoZSB2aXN1YWwgeCBwb3NpdGlvbiBvZiB0aGlzIHZpZXcsIGluIHBpeGVscy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRYKGZsb2F0IHgpIHsKKyAgICAgICAgc2V0VHJhbnNsYXRpb25YKHggLSBtTGVmdCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIHZpc3VhbCB5IHBvc2l0aW9uIG9mIHRoaXMgdmlldywgaW4gcGl4ZWxzLiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gdGhlCisgICAgICoge0BsaW5rICNzZXRUcmFuc2xhdGlvblkoZmxvYXQpIHRyYW5zbGF0aW9uWX0gcHJvcGVydHkgcGx1cyB0aGUgY3VycmVudAorICAgICAqIHtAbGluayAjZ2V0VG9wKCkgdG9wfSBwcm9wZXJ0eS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIHZpc3VhbCB5IHBvc2l0aW9uIG9mIHRoaXMgdmlldywgaW4gcGl4ZWxzLgorICAgICAqLworICAgIHB1YmxpYyBmbG9hdCBnZXRZKCkgeworICAgICAgICByZXR1cm4gbVRvcCArIG1UcmFuc2xhdGlvblk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgdmlzdWFsIHkgcG9zaXRpb24gb2YgdGhpcyB2aWV3LCBpbiBwaXhlbHMuIFRoaXMgaXMgZXF1aXZhbGVudCB0byBzZXR0aW5nIHRoZQorICAgICAqIHtAbGluayAjc2V0VHJhbnNsYXRpb25ZKGZsb2F0KSB0cmFuc2xhdGlvbll9IHByb3BlcnR5IHRvIGJlIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4KKyAgICAgKiB0aGUgeSB2YWx1ZSBwYXNzZWQgaW4gYW5kIHRoZSBjdXJyZW50IHtAbGluayAjZ2V0VG9wKCkgdG9wfSBwcm9wZXJ0eS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB5IFRoZSB2aXN1YWwgeSBwb3NpdGlvbiBvZiB0aGlzIHZpZXcsIGluIHBpeGVscy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRZKGZsb2F0IHkpIHsKKyAgICAgICAgc2V0VHJhbnNsYXRpb25ZKHkgLSBtVG9wKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRoZSBob3Jpem9udGFsIGxvY2F0aW9uIG9mIHRoaXMgdmlldyByZWxhdGl2ZSB0byBpdHMge0BsaW5rICNnZXRMZWZ0KCkgbGVmdH0gcG9zaXRpb24uCisgICAgICogVGhpcyBwb3NpdGlvbiBpcyBwb3N0LWxheW91dCwgaW4gYWRkaXRpb24gdG8gd2hlcmV2ZXIgdGhlIG9iamVjdCdzCisgICAgICogbGF5b3V0IHBsYWNlZCBpdC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIGhvcml6b250YWwgcG9zaXRpb24gb2YgdGhpcyB2aWV3IHJlbGF0aXZlIHRvIGl0cyBsZWZ0IHBvc2l0aW9uLCBpbiBwaXhlbHMuCisgICAgICovCisgICAgcHVibGljIGZsb2F0IGdldFRyYW5zbGF0aW9uWCgpIHsKKyAgICAgICAgcmV0dXJuIG1UcmFuc2xhdGlvblg7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgaG9yaXpvbnRhbCBsb2NhdGlvbiBvZiB0aGlzIHZpZXcgcmVsYXRpdmUgdG8gaXRzIHtAbGluayAjZ2V0TGVmdCgpIGxlZnR9IHBvc2l0aW9uLgorICAgICAqIFRoaXMgZWZmZWN0aXZlbHkgcG9zaXRpb25zIHRoZSBvYmplY3QgcG9zdC1sYXlvdXQsIGluIGFkZGl0aW9uIHRvIHdoZXJldmVyIHRoZSBvYmplY3QncworICAgICAqIGxheW91dCBwbGFjZWQgaXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHJhbnNsYXRpb25YIFRoZSBob3Jpem9udGFsIHBvc2l0aW9uIG9mIHRoaXMgdmlldyByZWxhdGl2ZSB0byBpdHMgbGVmdCBwb3NpdGlvbiwKKyAgICAgKiBpbiBwaXhlbHMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VHJhbnNsYXRpb25YKGZsb2F0IHRyYW5zbGF0aW9uWCkgeworICAgICAgICBpZiAobVRyYW5zbGF0aW9uWCAhPSB0cmFuc2xhdGlvblgpIHsKKyAgICAgICAgICAgIC8vIERvdWJsZS1pbnZhbGlkYXRpb24gaXMgbmVjZXNzYXJ5IHRvIGNhcHR1cmUgdmlldydzIG9sZCBhbmQgbmV3IGFyZWFzCisgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CisgICAgICAgICAgICBtVHJhbnNsYXRpb25YID0gdHJhbnNsYXRpb25YOworICAgICAgICAgICAgbU1hdHJpeERpcnR5ID0gdHJ1ZTsKKyAgICAgICAgICAgIG1Qcml2YXRlRmxhZ3MgfD0gRFJBV047IC8vIGZvcmNlIGFub3RoZXIgaW52YWxpZGF0aW9uIHdpdGggdGhlIG5ldyBvcmllbnRhdGlvbgorICAgICAgICAgICAgaW52YWxpZGF0ZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGhvcml6b250YWwgbG9jYXRpb24gb2YgdGhpcyB2aWV3IHJlbGF0aXZlIHRvIGl0cyB7QGxpbmsgI2dldFRvcCgpIHRvcH0gcG9zaXRpb24uCisgICAgICogVGhpcyBwb3NpdGlvbiBpcyBwb3N0LWxheW91dCwgaW4gYWRkaXRpb24gdG8gd2hlcmV2ZXIgdGhlIG9iamVjdCdzCisgICAgICogbGF5b3V0IHBsYWNlZCBpdC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIHZlcnRpY2FsIHBvc2l0aW9uIG9mIHRoaXMgdmlldyByZWxhdGl2ZSB0byBpdHMgdG9wIHBvc2l0aW9uLAorICAgICAqIGluIHBpeGVscy4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmxvYXQgZ2V0VHJhbnNsYXRpb25ZKCkgeworICAgICAgICByZXR1cm4gbVRyYW5zbGF0aW9uWTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSB2ZXJ0aWNhbCBsb2NhdGlvbiBvZiB0aGlzIHZpZXcgcmVsYXRpdmUgdG8gaXRzIHtAbGluayAjZ2V0VG9wKCkgdG9wfSBwb3NpdGlvbi4KKyAgICAgKiBUaGlzIGVmZmVjdGl2ZWx5IHBvc2l0aW9ucyB0aGUgb2JqZWN0IHBvc3QtbGF5b3V0LCBpbiBhZGRpdGlvbiB0byB3aGVyZXZlciB0aGUgb2JqZWN0J3MKKyAgICAgKiBsYXlvdXQgcGxhY2VkIGl0LgorICAgICAqCisgICAgICogQHBhcmFtIHRyYW5zbGF0aW9uWSBUaGUgdmVydGljYWwgcG9zaXRpb24gb2YgdGhpcyB2aWV3IHJlbGF0aXZlIHRvIGl0cyB0b3AgcG9zaXRpb24sCisgICAgICogaW4gcGl4ZWxzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFRyYW5zbGF0aW9uWShmbG9hdCB0cmFuc2xhdGlvblkpIHsKKyAgICAgICAgaWYgKG1UcmFuc2xhdGlvblkgIT0gdHJhbnNsYXRpb25ZKSB7CisgICAgICAgICAgICAvLyBEb3VibGUtaW52YWxpZGF0aW9uIGlzIG5lY2Vzc2FyeSB0byBjYXB0dXJlIHZpZXcncyBvbGQgYW5kIG5ldyBhcmVhcworICAgICAgICAgICAgaW52YWxpZGF0ZSgpOworICAgICAgICAgICAgbVRyYW5zbGF0aW9uWSA9IHRyYW5zbGF0aW9uWTsKKyAgICAgICAgICAgIG1NYXRyaXhEaXJ0eSA9IHRydWU7CisgICAgICAgICAgICBtUHJpdmF0ZUZsYWdzIHw9IERSQVdOOyAvLyBmb3JjZSBhbm90aGVyIGludmFsaWRhdGlvbiB3aXRoIHRoZSBuZXcgb3JpZW50YXRpb24KKyAgICAgICAgICAgIGludmFsaWRhdGUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgogICAgICAqIEhpdCByZWN0YW5nbGUgaW4gcGFyZW50J3MgY29vcmRpbmF0ZXMKICAgICAgKgogICAgICAqIEBwYXJhbSBvdXRSZWN0IFRoZSBoaXQgcmVjdGFuZ2xlIG9mIHRoZSB2aWV3LgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGdldEhpdFJlY3QoUmVjdCBvdXRSZWN0KSB7Ci0gICAgICAgIG91dFJlY3Quc2V0KG1MZWZ0LCBtVG9wLCBtUmlnaHQsIG1Cb3R0b20pOworICAgICAgICBpZiAoaGFzSWRlbnRpdHlNYXRyaXgoKSB8fCBtQXR0YWNoSW5mbyA9PSBudWxsKSB7CisgICAgICAgICAgICBvdXRSZWN0LnNldChtTGVmdCwgbVRvcCwgbVJpZ2h0LCBtQm90dG9tKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIE1hdHJpeCBtID0gZ2V0TWF0cml4KCk7CisgICAgICAgICAgICBmaW5hbCBSZWN0RiB0bXBSZWN0ID0gbUF0dGFjaEluZm8ubVRtcFRyYW5zZm9ybVJlY3Q7CisgICAgICAgICAgICB0bXBSZWN0LnNldCgtbVBpdm90WCwgLW1QaXZvdFksIGdldFdpZHRoKCkgLSBtUGl2b3RYLCBnZXRIZWlnaHQoKSAtIG1QaXZvdFkpOworICAgICAgICAgICAgbS5tYXBSZWN0KHRtcFJlY3QpOworICAgICAgICAgICAgb3V0UmVjdC5zZXQoKGludCkgdG1wUmVjdC5sZWZ0ICsgbUxlZnQsIChpbnQpIHRtcFJlY3QudG9wICsgbVRvcCwKKyAgICAgICAgICAgICAgICAgICAgKGludCkgdG1wUmVjdC5yaWdodCArIG1MZWZ0LCAoaW50KSB0bXBSZWN0LmJvdHRvbSArIG1Ub3ApOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVXRpbGl0eSBtZXRob2QgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGdpdmVuIHBvaW50LCBpbiBsb2NhbCBjb29yZGluYXRlcywKKyAgICAgKiBpcyBpbnNpZGUgdGhlIHZpZXcsIHdoZXJlIHRoZSBhcmVhIG9mIHRoZSB2aWV3IGlzIGV4cGFuZGVkIGJ5IHRoZSBzbG9wIGZhY3Rvci4KKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hpbGUgcHJvY2Vzc2luZyB0b3VjaC1tb3ZlIGV2ZW50cyB0byBkZXRlcm1pbmUgaWYgdGhlIGV2ZW50CisgICAgICogaXMgc3RpbGwgd2l0aGluIHRoZSB2aWV3LgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBwb2ludEluVmlldyhmbG9hdCBsb2NhbFgsIGZsb2F0IGxvY2FsWSwgZmxvYXQgc2xvcCkgeworICAgICAgICByZXR1cm4gbG9jYWxYID4gLXNsb3AgJiYgbG9jYWxZID4gLXNsb3AgJiYgbG9jYWxYIDwgKChtUmlnaHQgLSBtTGVmdCkgKyBzbG9wKSAmJgorICAgICAgICAgICAgICAgIGxvY2FsWSA8ICgobUJvdHRvbSAtIG1Ub3ApICsgc2xvcCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC00ODI5LDggKzU0ODksMzggQEAKICAgICAgKiBAcGFyYW0gb2Zmc2V0IHRoZSBudW1iZXIgb2YgcGl4ZWxzIHRvIG9mZnNldCB0aGUgdmlldyBieQogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIG9mZnNldFRvcEFuZEJvdHRvbShpbnQgb2Zmc2V0KSB7Ci0gICAgICAgIG1Ub3AgKz0gb2Zmc2V0OwotICAgICAgICBtQm90dG9tICs9IG9mZnNldDsKKyAgICAgICAgaWYgKG9mZnNldCAhPSAwKSB7CisgICAgICAgICAgICBpZiAoaGFzSWRlbnRpdHlNYXRyaXgoKSkgeworICAgICAgICAgICAgICAgIGZpbmFsIFZpZXdQYXJlbnQgcCA9IG1QYXJlbnQ7CisgICAgICAgICAgICAgICAgaWYgKHAgIT0gbnVsbCAmJiBtQXR0YWNoSW5mbyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFJlY3QgciA9IG1BdHRhY2hJbmZvLm1UbXBJbnZhbFJlY3Q7CisgICAgICAgICAgICAgICAgICAgIGludCBtaW5Ub3A7CisgICAgICAgICAgICAgICAgICAgIGludCBtYXhCb3R0b207CisgICAgICAgICAgICAgICAgICAgIGludCB5TG9jOworICAgICAgICAgICAgICAgICAgICBpZiAob2Zmc2V0IDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbWluVG9wID0gbVRvcCArIG9mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1heEJvdHRvbSA9IG1Cb3R0b207CisgICAgICAgICAgICAgICAgICAgICAgICB5TG9jID0gb2Zmc2V0OworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbWluVG9wID0gbVRvcDsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1heEJvdHRvbSA9IG1Cb3R0b20gKyBvZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgICAgICB5TG9jID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByLnNldCgwLCB5TG9jLCBtUmlnaHQgLSBtTGVmdCwgbWF4Qm90dG9tIC0gbWluVG9wKTsKKyAgICAgICAgICAgICAgICAgICAgcC5pbnZhbGlkYXRlQ2hpbGQodGhpcywgcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1Ub3AgKz0gb2Zmc2V0OworICAgICAgICAgICAgbUJvdHRvbSArPSBvZmZzZXQ7CisKKyAgICAgICAgICAgIGlmICghbU1hdHJpeElzSWRlbnRpdHkpIHsKKyAgICAgICAgICAgICAgICBtUHJpdmF0ZUZsYWdzIHw9IERSQVdOOyAvLyBmb3JjZSBhbm90aGVyIGludmFsaWRhdGlvbiB3aXRoIHRoZSBuZXcgb3JpZW50YXRpb24KKyAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKQEAgLTQ4MzksOCArNTUyOSwzOCBAQAogICAgICAqIEBwYXJhbSBvZmZzZXQgdGhlIG51bWVyIG9mIHBpeGVscyB0byBvZmZzZXQgdGhlIHZpZXcgYnkKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBvZmZzZXRMZWZ0QW5kUmlnaHQoaW50IG9mZnNldCkgewotICAgICAgICBtTGVmdCArPSBvZmZzZXQ7Ci0gICAgICAgIG1SaWdodCArPSBvZmZzZXQ7CisgICAgICAgIGlmIChvZmZzZXQgIT0gMCkgeworICAgICAgICAgICAgaWYgKGhhc0lkZW50aXR5TWF0cml4KCkpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBWaWV3UGFyZW50IHAgPSBtUGFyZW50OworICAgICAgICAgICAgICAgIGlmIChwICE9IG51bGwgJiYgbUF0dGFjaEluZm8gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBSZWN0IHIgPSBtQXR0YWNoSW5mby5tVG1wSW52YWxSZWN0OworICAgICAgICAgICAgICAgICAgICBpbnQgbWluTGVmdDsKKyAgICAgICAgICAgICAgICAgICAgaW50IG1heFJpZ2h0OworICAgICAgICAgICAgICAgICAgICBpbnQgeExvYzsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG9mZnNldCA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1pbkxlZnQgPSBtTGVmdCArIG9mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1heFJpZ2h0ID0gbVJpZ2h0OworICAgICAgICAgICAgICAgICAgICAgICAgeExvYyA9IG9mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1pbkxlZnQgPSBtTGVmdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1heFJpZ2h0ID0gbVJpZ2h0ICsgb2Zmc2V0OworICAgICAgICAgICAgICAgICAgICAgICAgeExvYyA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgci5zZXQoMCwgMCwgbWF4UmlnaHQgLSBtaW5MZWZ0LCBtQm90dG9tIC0gbVRvcCk7CisgICAgICAgICAgICAgICAgICAgIHAuaW52YWxpZGF0ZUNoaWxkKHRoaXMsIHIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtTGVmdCArPSBvZmZzZXQ7CisgICAgICAgICAgICBtUmlnaHQgKz0gb2Zmc2V0OworCisgICAgICAgICAgICBpZiAoIW1NYXRyaXhJc0lkZW50aXR5KSB7CisgICAgICAgICAgICAgICAgbVByaXZhdGVGbGFncyB8PSBEUkFXTjsgLy8gZm9yY2UgYW5vdGhlciBpbnZhbGlkYXRpb24gd2l0aCB0aGUgbmV3IG9yaWVudGF0aW9uCisgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCkBAIC01ODc5LDkgKzY1OTksOCBAQAogICAgICAqIEBzZWUgYW5kcm9pZC53aWRnZXQuU2Nyb2xsQmFyRHJhd2FibGUKICAgICAgKiBAaGlkZQogICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIG9uRHJhd0hvcml6b250YWxTY3JvbGxCYXIoQ2FudmFzIGNhbnZhcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERyYXdhYmxlIHNjcm9sbEJhciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsLCBpbnQgdCwgaW50IHIsIGludCBiKSB7CisgICAgcHJvdGVjdGVkIHZvaWQgb25EcmF3SG9yaXpvbnRhbFNjcm9sbEJhcihDYW52YXMgY2FudmFzLCBEcmF3YWJsZSBzY3JvbGxCYXIsCisgICAgICAgICAgICBpbnQgbCwgaW50IHQsIGludCByLCBpbnQgYikgewogICAgICAgICBzY3JvbGxCYXIuc2V0Qm91bmRzKGwsIHQsIHIsIGIpOwogICAgICAgICBzY3JvbGxCYXIuZHJhdyhjYW52YXMpOwogICAgIH0KQEAgLTU5MDAsOSArNjYxOSw4IEBACiAgICAgICogQHNlZSBhbmRyb2lkLndpZGdldC5TY3JvbGxCYXJEcmF3YWJsZQogICAgICAqIEBoaWRlCiAgICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgb25EcmF3VmVydGljYWxTY3JvbGxCYXIoQ2FudmFzIGNhbnZhcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEcmF3YWJsZSBzY3JvbGxCYXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGwsIGludCB0LCBpbnQgciwgaW50IGIpIHsKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkRyYXdWZXJ0aWNhbFNjcm9sbEJhcihDYW52YXMgY2FudmFzLCBEcmF3YWJsZSBzY3JvbGxCYXIsCisgICAgICAgICAgICBpbnQgbCwgaW50IHQsIGludCByLCBpbnQgYikgewogICAgICAgICBzY3JvbGxCYXIuc2V0Qm91bmRzKGwsIHQsIHIsIGIpOwogICAgICAgICBzY3JvbGxCYXIuZHJhdyhjYW52YXMpOwogICAgIH0KQEAgLTYzMDAsOCArNzAxOCw3IEBACiAgICAgICAgIGlmICgobVZpZXdGbGFncyAmIERSQVdJTkdfQ0FDSEVfRU5BQkxFRCkgPT0gRFJBV0lOR19DQUNIRV9FTkFCTEVEKSB7CiAgICAgICAgICAgICBidWlsZERyYXdpbmdDYWNoZShhdXRvU2NhbGUpOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBhdXRvU2NhbGUgPyAobURyYXdpbmdDYWNoZSA9PSBudWxsID8gbnVsbCA6IG1EcmF3aW5nQ2FjaGUuZ2V0KCkpIDoKLSAgICAgICAgICAgICAgICAobVVuc2NhbGVkRHJhd2luZ0NhY2hlID09IG51bGwgPyBudWxsIDogbVVuc2NhbGVkRHJhd2luZ0NhY2hlLmdldCgpKTsKKyAgICAgICAgcmV0dXJuIGF1dG9TY2FsZSA/IG1EcmF3aW5nQ2FjaGUgOiBtVW5zY2FsZWREcmF3aW5nQ2FjaGU7CiAgICAgfQogCiAgICAgLyoqCkBAIC02MzE2LDEzICs3MDMzLDExIEBACiAgICAgICovCiAgICAgcHVibGljIHZvaWQgZGVzdHJveURyYXdpbmdDYWNoZSgpIHsKICAgICAgICAgaWYgKG1EcmF3aW5nQ2FjaGUgIT0gbnVsbCkgewotICAgICAgICAgICAgZmluYWwgQml0bWFwIGJpdG1hcCA9IG1EcmF3aW5nQ2FjaGUuZ2V0KCk7Ci0gICAgICAgICAgICBpZiAoYml0bWFwICE9IG51bGwpIGJpdG1hcC5yZWN5Y2xlKCk7CisgICAgICAgICAgICBtRHJhd2luZ0NhY2hlLnJlY3ljbGUoKTsKICAgICAgICAgICAgIG1EcmF3aW5nQ2FjaGUgPSBudWxsOwogICAgICAgICB9CiAgICAgICAgIGlmIChtVW5zY2FsZWREcmF3aW5nQ2FjaGUgIT0gbnVsbCkgewotICAgICAgICAgICAgZmluYWwgQml0bWFwIGJpdG1hcCA9IG1VbnNjYWxlZERyYXdpbmdDYWNoZS5nZXQoKTsKLSAgICAgICAgICAgIGlmIChiaXRtYXAgIT0gbnVsbCkgYml0bWFwLnJlY3ljbGUoKTsKKyAgICAgICAgICAgIG1VbnNjYWxlZERyYXdpbmdDYWNoZS5yZWN5Y2xlKCk7CiAgICAgICAgICAgICBtVW5zY2FsZWREcmF3aW5nQ2FjaGUgPSBudWxsOwogICAgICAgICB9CiAgICAgfQpAQCAtNjM4Myw4ICs3MDk4LDcgQEAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBidWlsZERyYXdpbmdDYWNoZShib29sZWFuIGF1dG9TY2FsZSkgewogICAgICAgICBpZiAoKG1Qcml2YXRlRmxhZ3MgJiBEUkFXSU5HX0NBQ0hFX1ZBTElEKSA9PSAwIHx8IChhdXRvU2NhbGUgPwotICAgICAgICAgICAgICAgIChtRHJhd2luZ0NhY2hlID09IG51bGwgfHwgbURyYXdpbmdDYWNoZS5nZXQoKSA9PSBudWxsKSA6Ci0gICAgICAgICAgICAgICAgKG1VbnNjYWxlZERyYXdpbmdDYWNoZSA9PSBudWxsIHx8IG1VbnNjYWxlZERyYXdpbmdDYWNoZS5nZXQoKSA9PSBudWxsKSkpIHsKKyAgICAgICAgICAgICAgICBtRHJhd2luZ0NhY2hlID09IG51bGwgOiBtVW5zY2FsZWREcmF3aW5nQ2FjaGUgPT0gbnVsbCkpIHsKIAogICAgICAgICAgICAgaWYgKFZpZXdEZWJ1Zy5UUkFDRV9ISUVSQVJDSFkpIHsKICAgICAgICAgICAgICAgICBWaWV3RGVidWcudHJhY2UodGhpcywgVmlld0RlYnVnLkhpZXJhcmNoeVRyYWNlVHlwZS5CVUlMRF9DQUNIRSk7CkBAIC02NDE3LDggKzcxMzEsNyBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBib29sZWFuIGNsZWFyID0gdHJ1ZTsKLSAgICAgICAgICAgIEJpdG1hcCBiaXRtYXAgPSBhdXRvU2NhbGUgPyAobURyYXdpbmdDYWNoZSA9PSBudWxsID8gbnVsbCA6IG1EcmF3aW5nQ2FjaGUuZ2V0KCkpIDoKLSAgICAgICAgICAgICAgICAgICAgKG1VbnNjYWxlZERyYXdpbmdDYWNoZSA9PSBudWxsID8gbnVsbCA6IG1VbnNjYWxlZERyYXdpbmdDYWNoZS5nZXQoKSk7CisgICAgICAgICAgICBCaXRtYXAgYml0bWFwID0gYXV0b1NjYWxlID8gbURyYXdpbmdDYWNoZSA6IG1VbnNjYWxlZERyYXdpbmdDYWNoZTsKIAogICAgICAgICAgICAgaWYgKGJpdG1hcCA9PSBudWxsIHx8IGJpdG1hcC5nZXRXaWR0aCgpICE9IHdpZHRoIHx8IGJpdG1hcC5nZXRIZWlnaHQoKSAhPSBoZWlnaHQpIHsKICAgICAgICAgICAgICAgICBCaXRtYXAuQ29uZmlnIHF1YWxpdHk7CkBAIC02NDUwLDkgKzcxNjMsOSBAQAogICAgICAgICAgICAgICAgICAgICBiaXRtYXAgPSBCaXRtYXAuY3JlYXRlQml0bWFwKHdpZHRoLCBoZWlnaHQsIHF1YWxpdHkpOwogICAgICAgICAgICAgICAgICAgICBiaXRtYXAuc2V0RGVuc2l0eShnZXRSZXNvdXJjZXMoKS5nZXREaXNwbGF5TWV0cmljcygpLmRlbnNpdHlEcGkpOwogICAgICAgICAgICAgICAgICAgICBpZiAoYXV0b1NjYWxlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRHJhd2luZ0NhY2hlID0gbmV3IFNvZnRSZWZlcmVuY2U8Qml0bWFwPihiaXRtYXApOworICAgICAgICAgICAgICAgICAgICAgICAgbURyYXdpbmdDYWNoZSA9IGJpdG1hcDsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1VbnNjYWxlZERyYXdpbmdDYWNoZSA9IG5ldyBTb2Z0UmVmZXJlbmNlPEJpdG1hcD4oYml0bWFwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1VbnNjYWxlZERyYXdpbmdDYWNoZSA9IGJpdG1hcDsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBpZiAob3BhcXVlICYmIHRyYW5zbHVjZW50V2luZG93KSBiaXRtYXAuc2V0SGFzQWxwaGEoZmFsc2UpOwogICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE91dE9mTWVtb3J5RXJyb3IgZSkgewpAQCAtNjgxNSwxNiArNzUyOCwxNiBAQAogCiAgICAgICAgIGlmICh2ZXJ0aWNhbEVkZ2VzKSB7CiAgICAgICAgICAgICB0b3BGYWRlU3RyZW5ndGggPSBNYXRoLm1heCgwLjBmLCBNYXRoLm1pbigxLjBmLCBnZXRUb3BGYWRpbmdFZGdlU3RyZW5ndGgoKSkpOwotICAgICAgICAgICAgZHJhd1RvcCA9IHRvcEZhZGVTdHJlbmd0aCA+PSAwLjBmOworICAgICAgICAgICAgZHJhd1RvcCA9IHRvcEZhZGVTdHJlbmd0aCA+IDAuMGY7CiAgICAgICAgICAgICBib3R0b21GYWRlU3RyZW5ndGggPSBNYXRoLm1heCgwLjBmLCBNYXRoLm1pbigxLjBmLCBnZXRCb3R0b21GYWRpbmdFZGdlU3RyZW5ndGgoKSkpOwotICAgICAgICAgICAgZHJhd0JvdHRvbSA9IGJvdHRvbUZhZGVTdHJlbmd0aCA+PSAwLjBmOworICAgICAgICAgICAgZHJhd0JvdHRvbSA9IGJvdHRvbUZhZGVTdHJlbmd0aCA+IDAuMGY7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoaG9yaXpvbnRhbEVkZ2VzKSB7CiAgICAgICAgICAgICBsZWZ0RmFkZVN0cmVuZ3RoID0gTWF0aC5tYXgoMC4wZiwgTWF0aC5taW4oMS4wZiwgZ2V0TGVmdEZhZGluZ0VkZ2VTdHJlbmd0aCgpKSk7Ci0gICAgICAgICAgICBkcmF3TGVmdCA9IGxlZnRGYWRlU3RyZW5ndGggPj0gMC4wZjsKKyAgICAgICAgICAgIGRyYXdMZWZ0ID0gbGVmdEZhZGVTdHJlbmd0aCA+IDAuMGY7CiAgICAgICAgICAgICByaWdodEZhZGVTdHJlbmd0aCA9IE1hdGgubWF4KDAuMGYsIE1hdGgubWluKDEuMGYsIGdldFJpZ2h0RmFkaW5nRWRnZVN0cmVuZ3RoKCkpKTsKLSAgICAgICAgICAgIGRyYXdSaWdodCA9IHJpZ2h0RmFkZVN0cmVuZ3RoID49IDAuMGY7CisgICAgICAgICAgICBkcmF3UmlnaHQgPSByaWdodEZhZGVTdHJlbmd0aCA+IDAuMGY7CiAgICAgICAgIH0KIAogICAgICAgICBzYXZlQ291bnQgPSBjYW52YXMuZ2V0U2F2ZUNvdW50KCk7CkBAIC04NTYzLDEzICs5Mjc2LDEyIEBACiAgICAgICAgIGlmIChtQXR0YWNoSW5mbyA9PSBudWxsKSB7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKChmbGFncyZIYXB0aWNGZWVkYmFja0NvbnN0YW50cy5GTEFHX0lHTk9SRV9WSUVXX1NFVFRJTkcpID09IDAKKyAgICAgICAgaWYgKChmbGFncyAmIEhhcHRpY0ZlZWRiYWNrQ29uc3RhbnRzLkZMQUdfSUdOT1JFX1ZJRVdfU0VUVElORykgPT0gMAogICAgICAgICAgICAgICAgICYmICFpc0hhcHRpY0ZlZWRiYWNrRW5hYmxlZCgpKSB7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1BdHRhY2hJbmZvLm1Sb290Q2FsbGJhY2tzLnBlcmZvcm1IYXB0aWNGZWVkYmFjaygKLSAgICAgICAgICAgICAgICBmZWVkYmFja0NvbnN0YW50LAotICAgICAgICAgICAgICAgIChmbGFncyZIYXB0aWNGZWVkYmFja0NvbnN0YW50cy5GTEFHX0lHTk9SRV9HTE9CQUxfU0VUVElORykgIT0gMCk7CisgICAgICAgIHJldHVybiBtQXR0YWNoSW5mby5tUm9vdENhbGxiYWNrcy5wZXJmb3JtSGFwdGljRmVlZGJhY2soZmVlZGJhY2tDb25zdGFudCwKKyAgICAgICAgICAgICAgICAoZmxhZ3MgJiBIYXB0aWNGZWVkYmFja0NvbnN0YW50cy5GTEFHX0lHTk9SRV9HTE9CQUxfU0VUVElORykgIT0gMCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC04NjQwLDggKzkzNTIsNyBAQAogICAgICAgICAgICAgICAgIFZpZXdDb25maWd1cmF0aW9uLmdldExvbmdQcmVzc1RpbWVvdXQoKSAtIGRlbGF5T2Zmc2V0KTsKICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyBpbnRbXSBzdGF0ZVNldFVuaW9uKGZpbmFsIGludFtdIHN0YXRlU2V0MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludFtdIHN0YXRlU2V0MikgeworICAgIHByaXZhdGUgc3RhdGljIGludFtdIHN0YXRlU2V0VW5pb24oZmluYWwgaW50W10gc3RhdGVTZXQxLCBmaW5hbCBpbnRbXSBzdGF0ZVNldDIpIHsKICAgICAgICAgZmluYWwgaW50IHN0YXRlU2V0MUxlbmd0aCA9IHN0YXRlU2V0MS5sZW5ndGg7CiAgICAgICAgIGZpbmFsIGludCBzdGF0ZVNldDJMZW5ndGggPSBzdGF0ZVNldDIubGVuZ3RoOwogICAgICAgICBmaW5hbCBpbnRbXSBuZXdTZXQgPSBuZXcgaW50W3N0YXRlU2V0MUxlbmd0aCArIHN0YXRlU2V0Mkxlbmd0aF07CkBAIC05MTYyLDYgKzk4NzMsMTMgQEAKICAgICAgICAgICovCiAgICAgICAgIGZpbmFsIGludFtdIG1JbnZhbGlkYXRlQ2hpbGRMb2NhdGlvbiA9IG5ldyBpbnRbMl07CiAKKworICAgICAgICAvKioKKyAgICAgICAgICogR2xvYmFsIHRvIHRoZSB2aWV3IGhpZXJhcmNoeSB1c2VkIGFzIGEgdGVtcG9yYXJ5IGZvciBkZWFsaW5nIHdpdGgKKyAgICAgICAgICogeC95IGxvY2F0aW9uIHdoZW4gdmlldyBpcyB0cmFuc2Zvcm1lZC4KKyAgICAgICAgICovCisgICAgICAgIGZpbmFsIGZsb2F0W10gbVRtcFRyYW5zZm9ybUxvY2F0aW9uID0gbmV3IGZsb2F0WzJdOworCiAgICAgICAgIC8qKgogICAgICAgICAgKiBUaGUgdmlldyB0cmVlIG9ic2VydmVyIHVzZWQgdG8gZGlzcGF0Y2ggZ2xvYmFsIGV2ZW50cyBsaWtlCiAgICAgICAgICAqIGxheW91dCwgcHJlLWRyYXcsIHRvdWNoIG1vZGUgY2hhbmdlLCBldGMuCkBAIC05MTk4LDYgKzk5MTYsMTYgQEAKICAgICAgICAgZmluYWwgUmVjdCBtVG1wSW52YWxSZWN0ID0gbmV3IFJlY3QoKTsKIAogICAgICAgICAvKioKKyAgICAgICAgICogVGVtcG9yYXJ5IGZvciB1c2UgaW4gY29tcHV0aW5nIGhpdCBhcmVhcyB3aXRoIHRyYW5zZm9ybWVkIHZpZXdzCisgICAgICAgICAqLworICAgICAgICBmaW5hbCBSZWN0RiBtVG1wVHJhbnNmb3JtUmVjdCA9IG5ldyBSZWN0RigpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUZW1wb3JhcnkgZm9yIHVzZSBpbiBjb21wdXRpbmcgaW52YWxpZGF0aW9uIGFyZWFzIHdpdGggdHJhbnNmb3JtZWQgdmlld3MKKyAgICAgICAgICovCisgICAgICAgIGZpbmFsIGZsb2F0W10gbVRtcFRyYW5zZm9ybUJvdW5kcyA9IG5ldyBmbG9hdFs4XTsKKworICAgICAgICAvKioKICAgICAgICAgICogVGVtcG9yYXJ5IGxpc3QgZm9yIHVzZSBpbiBjb2xsZWN0aW5nIGZvY3VzYWJsZSBkZXNjZW5kZW50cyBvZiBhIHZpZXcuCiAgICAgICAgICAqLwogICAgICAgICBmaW5hbCBBcnJheUxpc3Q8Vmlldz4gbUZvY3VzYWJsZXNUZW1wTGlzdCA9IG5ldyBBcnJheUxpc3Q8Vmlldz4oMjQpOwpAQCAtOTI1Nyw4ICs5OTg1LDggQEAKIAogICAgICAgICBwdWJsaWMgZmluYWwgSW50ZXJwb2xhdG9yIHNjcm9sbEJhckludGVycG9sYXRvciA9IG5ldyBJbnRlcnBvbGF0b3IoMSwgMik7CiAKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBmbG9hdFtdIG1PcGFxdWUgPSB7MjU1LjBmfTsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBmbG9hdFtdIG1UcmFuc3BhcmVudCA9IHswLjBmfTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBmbG9hdFtdIG1PcGFxdWUgPSB7IDI1NS4wZiB9OworICAgICAgICBwcml2YXRlIGZpbmFsIGZsb2F0W10gbVRyYW5zcGFyZW50ID0geyAwLjBmIH07CiAgICAgICAgIAogICAgICAgICAvKioKICAgICAgICAgICogV2hlbiBmYWRpbmcgc2hvdWxkIHN0YXJ0LiBUaGlzIHRpbWUgbW92ZXMgaW50byB0aGUgZnV0dXJlIGV2ZXJ5IHRpbWUKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmlld0dyb3VwLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1ZpZXdHcm91cC5qYXZhCmluZGV4IDcxNTk5MjkuLjM2Nzg2ODQgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmlld0dyb3VwLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9WaWV3R3JvdXAuamF2YQpAQCAtMjMsNiArMjMsNyBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheTsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLk1hdHJpeDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3RGOwpAQCAtMzQsNiArMzUsNyBAQAogaW1wb3J0IGFuZHJvaWQudXRpbC5FdmVudExvZzsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGFuZHJvaWQudXRpbC5TcGFyc2VBcnJheTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwLkxheW91dFBhcmFtczsKIGltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5RXZlbnQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb247CiBpbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb25VdGlsczsKQEAgLTQxLDYgKzQzLDcgQEAKIGltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLlRyYW5zZm9ybWF0aW9uOwogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwogCiAvKioKICAqIDxwPgpAQCAtODYsMTMgKzg5LDI4IEBACiAgICAgLy8gVGhlIHZpZXcgY29udGFpbmVkIHdpdGhpbiB0aGlzIFZpZXdHcm91cCB0aGF0IGhhcyBvciBjb250YWlucyBmb2N1cy4KICAgICBwcml2YXRlIFZpZXcgbUZvY3VzZWQ7CiAKLSAgICAvLyBUaGUgY3VycmVudCB0cmFuc2Zvcm1hdGlvbiB0byBhcHBseSBvbiB0aGUgY2hpbGQgYmVpbmcgZHJhd24KLSAgICBwcml2YXRlIFRyYW5zZm9ybWF0aW9uIG1DaGlsZFRyYW5zZm9ybWF0aW9uOworICAgIC8qKgorICAgICAqIEEgVHJhbnNmb3JtYXRpb24gdXNlZCB3aGVuIGRyYXdpbmcgY2hpbGRyZW4sIHRvCisgICAgICogYXBwbHkgb24gdGhlIGNoaWxkIGJlaW5nIGRyYXduLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgVHJhbnNmb3JtYXRpb24gbUNoaWxkVHJhbnNmb3JtYXRpb24gPSBuZXcgVHJhbnNmb3JtYXRpb24oKTsKKworICAgIC8qKgorICAgICAqIFVzZWQgdG8gdHJhY2sgdGhlIGN1cnJlbnQgaW52YWxpZGF0aW9uIHJlZ2lvbi4KKyAgICAgKi8KICAgICBwcml2YXRlIFJlY3RGIG1JbnZhbGlkYXRlUmVnaW9uOwogCisgICAgLyoqCisgICAgICogQSBUcmFuc2Zvcm1hdGlvbiB1c2VkIHRvIGNhbGN1bGF0ZSBhIGNvcnJlY3QKKyAgICAgKiBpbnZhbGlkYXRpb24gYXJlYSB3aGVuIHRoZSBhcHBsaWNhdGlvbiBpcyBhdXRvc2NhbGVkLgorICAgICAqLworICAgIHByaXZhdGUgVHJhbnNmb3JtYXRpb24gbUludmFsaWRhdGlvblRyYW5zZm9ybWF0aW9uOworCiAgICAgLy8gVGFyZ2V0IG9mIE1vdGlvbiBldmVudHMKICAgICBwcml2YXRlIFZpZXcgbU1vdGlvblRhcmdldDsKLSAgICBwcml2YXRlIGZpbmFsIFJlY3QgbVRlbXBSZWN0ID0gbmV3IFJlY3QoKTsKKworICAgIC8vIFRhcmdldHMgb2YgTW90aW9uRXZlbnRzIGluIHNwbGl0IG1vZGUKKyAgICBwcml2YXRlIFNwbGl0TW90aW9uVGFyZ2V0cyBtU3BsaXRNb3Rpb25UYXJnZXRzOwogCiAgICAgLy8gTGF5b3V0IGFuaW1hdGlvbgogICAgIHByaXZhdGUgTGF5b3V0QW5pbWF0aW9uQ29udHJvbGxlciBtTGF5b3V0QW5pbWF0aW9uQ29udHJvbGxlcjsKQEAgLTIyOCw2ICsyNDYsMTEgQEAKICAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBGTEFHX0RJU0FMTE9XX0lOVEVSQ0VQVCA9IDB4ODAwMDA7CiAKICAgICAvKioKKyAgICAgKiBXaGVuIHNldCwgdGhpcyBWaWV3R3JvdXAgd2lsbCBzcGxpdCBNb3Rpb25FdmVudHMgdG8gbXVsdGlwbGUgY2hpbGQgVmlld3Mgd2hlbiBhcHByb3ByaWF0ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19TUExJVF9NT1RJT05fRVZFTlRTID0gMHgxMDAwMDA7CisKKyAgICAvKioKICAgICAgKiBJbmRpY2F0ZXMgd2hpY2ggdHlwZXMgb2YgZHJhd2luZyBjYWNoZXMgYXJlIHRvIGJlIGtlcHQgaW4gbWVtb3J5LgogICAgICAqIFRoaXMgZmllbGQgc2hvdWxkIGJlIG1hZGUgcHJpdmF0ZSwgc28gaXQgaXMgaGlkZGVuIGZyb20gdGhlIFNESy4KICAgICAgKiB7QGhpZGV9CkBAIC0zNDgsNiArMzcxLDkgQEAKICAgICAgICAgICAgICAgICBjYXNlIFIuc3R5bGVhYmxlLlZpZXdHcm91cF9kZXNjZW5kYW50Rm9jdXNhYmlsaXR5OgogICAgICAgICAgICAgICAgICAgICBzZXREZXNjZW5kYW50Rm9jdXNhYmlsaXR5KERFU0NFTkRBTlRfRk9DVVNBQklMSVRZX0ZMQUdTW2EuZ2V0SW50KGF0dHIsIDApXSk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgUi5zdHlsZWFibGUuVmlld0dyb3VwX3NwbGl0TW90aW9uRXZlbnRzOgorICAgICAgICAgICAgICAgICAgICBzZXRNb3Rpb25FdmVudFNwbGl0dGluZ0VuYWJsZWQoYS5nZXRCb29sZWFuKGF0dHIsIGZhbHNlKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTQ2MSw2ICs0ODcsMTMgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgcHVibGljIEFjdGlvbk1vZGUgc3RhcnRBY3Rpb25Nb2RlRm9yQ2hpbGQoVmlldyBvcmlnaW5hbFZpZXcsIEFjdGlvbk1vZGUuQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICAgICAgcmV0dXJuIG1QYXJlbnQgIT0gbnVsbCA/IG1QYXJlbnQuc3RhcnRBY3Rpb25Nb2RlRm9yQ2hpbGQob3JpZ2luYWxWaWV3LCBjYWxsYmFjaykgOiBudWxsOworICAgIH0KKworICAgIC8qKgogICAgICAqIEZpbmQgdGhlIG5lYXJlc3QgdmlldyBpbiB0aGUgc3BlY2lmaWVkIGRpcmVjdGlvbiB0aGF0IHdhbnRzIHRvIHRha2UKICAgICAgKiBmb2N1cy4KICAgICAgKgpAQCAtODIyLDEyICs4NTUsMTggQEAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBkaXNwYXRjaFRvdWNoRXZlbnQoTW90aW9uRXZlbnQgZXYpIHsKKyAgICAgICAgaWYgKChtR3JvdXBGbGFncyAmIEZMQUdfU1BMSVRfTU9USU9OX0VWRU5UUykgPT0gRkxBR19TUExJVF9NT1RJT05fRVZFTlRTKSB7CisgICAgICAgICAgICBpZiAobVNwbGl0TW90aW9uVGFyZ2V0cyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbVNwbGl0TW90aW9uVGFyZ2V0cyA9IG5ldyBTcGxpdE1vdGlvblRhcmdldHMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBkaXNwYXRjaFNwbGl0VG91Y2hFdmVudChldik7CisgICAgICAgIH0KKwogICAgICAgICBmaW5hbCBpbnQgYWN0aW9uID0gZXYuZ2V0QWN0aW9uKCk7CiAgICAgICAgIGZpbmFsIGZsb2F0IHhmID0gZXYuZ2V0WCgpOwogICAgICAgICBmaW5hbCBmbG9hdCB5ZiA9IGV2LmdldFkoKTsKICAgICAgICAgZmluYWwgZmxvYXQgc2Nyb2xsZWRYRmxvYXQgPSB4ZiArIG1TY3JvbGxYOwogICAgICAgICBmaW5hbCBmbG9hdCBzY3JvbGxlZFlGbG9hdCA9IHlmICsgbVNjcm9sbFk7Ci0gICAgICAgIGZpbmFsIFJlY3QgZnJhbWUgPSBtVGVtcFJlY3Q7CiAKICAgICAgICAgYm9vbGVhbiBkaXNhbGxvd0ludGVyY2VwdCA9IChtR3JvdXBGbGFncyAmIEZMQUdfRElTQUxMT1dfSU5URVJDRVBUKSAhPSAwOwogCkBAIC04NDYsMjkgKzg4NSwxNyBAQAogICAgICAgICAgICAgICAgIGV2LnNldEFjdGlvbihNb3Rpb25FdmVudC5BQ1RJT05fRE9XTik7CiAgICAgICAgICAgICAgICAgLy8gV2Uga25vdyB3ZSB3YW50IHRvIGRpc3BhdGNoIHRoZSBldmVudCBkb3duLCBmaW5kIGEgY2hpbGQKICAgICAgICAgICAgICAgICAvLyB3aG8gY2FuIGhhbmRsZSBpdCwgc3RhcnQgd2l0aCB0aGUgZnJvbnQtbW9zdCBjaGlsZC4KLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgc2Nyb2xsZWRYSW50ID0gKGludCkgc2Nyb2xsZWRYRmxvYXQ7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IHNjcm9sbGVkWUludCA9IChpbnQpIHNjcm9sbGVkWUZsb2F0OwogICAgICAgICAgICAgICAgIGZpbmFsIFZpZXdbXSBjaGlsZHJlbiA9IG1DaGlsZHJlbjsKICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBtQ2hpbGRyZW5Db3VudDsKICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gY291bnQgLSAxOyBpID49IDA7IGktLSkgewogICAgICAgICAgICAgICAgICAgICBmaW5hbCBWaWV3IGNoaWxkID0gY2hpbGRyZW5baV07CiAgICAgICAgICAgICAgICAgICAgIGlmICgoY2hpbGQubVZpZXdGbGFncyAmIFZJU0lCSUxJVFlfTUFTSykgPT0gVklTSUJMRQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGNoaWxkLmdldEFuaW1hdGlvbigpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLmdldEhpdFJlY3QoZnJhbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZyYW1lLmNvbnRhaW5zKHNjcm9sbGVkWEludCwgc2Nyb2xsZWRZSW50KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mZnNldCB0aGUgZXZlbnQgdG8gdGhlIHZpZXcncyBjb29yZGluYXRlIHN5c3RlbQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGZsb2F0IHhjID0gc2Nyb2xsZWRYRmxvYXQgLSBjaGlsZC5tTGVmdDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBmbG9hdCB5YyA9IHNjcm9sbGVkWUZsb2F0IC0gY2hpbGQubVRvcDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBldi5zZXRMb2NhdGlvbih4YywgeWMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLm1Qcml2YXRlRmxhZ3MgJj0gfkNBTkNFTF9ORVhUX1VQX0VWRU5UOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZC5kaXNwYXRjaFRvdWNoRXZlbnQoZXYpKSAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFdmVudCBoYW5kbGVkLCB3ZSBoYXZlIGEgdGFyZ2V0IG5vdy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1vdGlvblRhcmdldCA9IGNoaWxkOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGV2ZW50IGRpZG4ndCBnZXQgaGFuZGxlZCwgdHJ5IHRoZSBuZXh0IHZpZXcuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRG9uJ3QgcmVzZXQgdGhlIGV2ZW50J3MgbG9jYXRpb24sIGl0J3Mgbm90Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmVjZXNzYXJ5IGhlcmUuCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBTaW5nbGUgZGlzcGF0Y2ggYWx3YXlzIHBpY2tzIGl0cyB0YXJnZXQgYmFzZWQgb24gdGhlIGluaXRpYWwgZG93bgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXZlbnQncyBwb3NpdGlvbiAtIGluZGV4IDAKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkaXNwYXRjaFRvdWNoRXZlbnRJZkluVmlldyhjaGlsZCwgZXYsIDApKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1vdGlvblRhcmdldCA9IGNoaWxkOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQpAQCAtODk4LDExICs5MjUsMjIgQEAKICAgICAgICAgICAgIHJldHVybiBzdXBlci5kaXNwYXRjaFRvdWNoRXZlbnQoZXYpOwogICAgICAgICB9CiAKKyAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSBvZmZzZXQgcG9pbnQgaW50byB0aGUgdGFyZ2V0J3MgbG9jYWwgY29vcmRpbmF0ZXMKKyAgICAgICAgZmxvYXQgeGMgPSBzY3JvbGxlZFhGbG9hdCAtIChmbG9hdCkgdGFyZ2V0Lm1MZWZ0OworICAgICAgICBmbG9hdCB5YyA9IHNjcm9sbGVkWUZsb2F0IC0gKGZsb2F0KSB0YXJnZXQubVRvcDsKKyAgICAgICAgaWYgKCF0YXJnZXQuaGFzSWRlbnRpdHlNYXRyaXgoKSAmJiBtQXR0YWNoSW5mbyAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyBub24taWRlbnRpdHkgbWF0cml4OiB0cmFuc2Zvcm0gdGhlIHBvaW50IGludG8gdGhlIHZpZXcncyBjb29yZGluYXRlcworICAgICAgICAgICAgZmluYWwgZmxvYXRbXSBsb2NhbFhZID0gbUF0dGFjaEluZm8ubVRtcFRyYW5zZm9ybUxvY2F0aW9uOworICAgICAgICAgICAgbG9jYWxYWVswXSA9IHhjOworICAgICAgICAgICAgbG9jYWxYWVsxXSA9IHljOworICAgICAgICAgICAgdGFyZ2V0LmdldEludmVyc2VNYXRyaXgoKS5tYXBQb2ludHMobG9jYWxYWSk7CisgICAgICAgICAgICB4YyA9IGxvY2FsWFlbMF07CisgICAgICAgICAgICB5YyA9IGxvY2FsWFlbMV07CisgICAgICAgIH0KKwogICAgICAgICAvLyBpZiBoYXZlIGEgdGFyZ2V0LCBzZWUgaWYgd2UncmUgYWxsb3dlZCB0byBhbmQgd2FudCB0byBpbnRlcmNlcHQgaXRzCiAgICAgICAgIC8vIGV2ZW50cwogICAgICAgICBpZiAoIWRpc2FsbG93SW50ZXJjZXB0ICYmIG9uSW50ZXJjZXB0VG91Y2hFdmVudChldikpIHsKLSAgICAgICAgICAgIGZpbmFsIGZsb2F0IHhjID0gc2Nyb2xsZWRYRmxvYXQgLSAoZmxvYXQpIHRhcmdldC5tTGVmdDsKLSAgICAgICAgICAgIGZpbmFsIGZsb2F0IHljID0gc2Nyb2xsZWRZRmxvYXQgLSAoZmxvYXQpIHRhcmdldC5tVG9wOwogICAgICAgICAgICAgbVByaXZhdGVGbGFncyAmPSB+Q0FOQ0VMX05FWFRfVVBfRVZFTlQ7CiAgICAgICAgICAgICBldi5zZXRBY3Rpb24oTW90aW9uRXZlbnQuQUNUSU9OX0NBTkNFTCk7CiAgICAgICAgICAgICBldi5zZXRMb2NhdGlvbih4YywgeWMpOwpAQCAtOTI0LDggKzk2Miw2IEBACiAKICAgICAgICAgLy8gZmluYWxseSBvZmZzZXQgdGhlIGV2ZW50IHRvIHRoZSB0YXJnZXQncyBjb29yZGluYXRlIHN5c3RlbSBhbmQKICAgICAgICAgLy8gZGlzcGF0Y2ggdGhlIGV2ZW50LgotICAgICAgICBmaW5hbCBmbG9hdCB4YyA9IHNjcm9sbGVkWEZsb2F0IC0gKGZsb2F0KSB0YXJnZXQubUxlZnQ7Ci0gICAgICAgIGZpbmFsIGZsb2F0IHljID0gc2Nyb2xsZWRZRmxvYXQgLSAoZmxvYXQpIHRhcmdldC5tVG9wOwogICAgICAgICBldi5zZXRMb2NhdGlvbih4YywgeWMpOwogCiAgICAgICAgIGlmICgodGFyZ2V0Lm1Qcml2YXRlRmxhZ3MgJiBDQU5DRUxfTkVYVF9VUF9FVkVOVCkgIT0gMCkgewpAQCAtOTM4LDYgKzk3NCwyODQgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCBkZXRlY3RzIHdoZXRoZXIgdGhlIHBvaW50ZXIgbG9jYXRpb24gYXQgPGNvZGU+cG9pbnRlckluZGV4PC9jb2RlPiB3aXRoaW4KKyAgICAgKiA8Y29kZT5ldjwvY29kZT4gaXMgaW5zaWRlIHRoZSBzcGVjaWZpZWQgdmlldy4gSWYgc28sIHRoZSB0cmFuc2Zvcm1lZCBldmVudCBpcyBkaXNwYXRjaGVkIHRvCisgICAgICogPGNvZGU+Y2hpbGQ8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIGNoaWxkIFZpZXcgdG8gaGl0IHRlc3QgYWdhaW5zdAorICAgICAqIEBwYXJhbSBldiBNb3Rpb25FdmVudCB0byB0ZXN0CisgICAgICogQHBhcmFtIHBvaW50ZXJJbmRleCBJbmRleCBvZiB0aGUgcG9pbnRlciB3aXRoaW4gPGNvZGU+ZXY8L2NvZGU+IHRvIHRlc3QKKyAgICAgKiBAcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGUgaGl0IHRlc3QgZmFpbGVkLCBvciB0aGUgcmVzdWx0IG9mCisgICAgICogICAgICAgICA8Y29kZT5jaGlsZC5kaXNwYXRjaFRvdWNoRXZlbnQ8L2NvZGU+CisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGRpc3BhdGNoVG91Y2hFdmVudElmSW5WaWV3KFZpZXcgY2hpbGQsIE1vdGlvbkV2ZW50IGV2LCBpbnQgcG9pbnRlckluZGV4KSB7CisgICAgICAgIGZpbmFsIGZsb2F0IHggPSBldi5nZXRYKHBvaW50ZXJJbmRleCk7CisgICAgICAgIGZpbmFsIGZsb2F0IHkgPSBldi5nZXRZKHBvaW50ZXJJbmRleCk7CisgICAgICAgIGZpbmFsIGZsb2F0IHNjcm9sbGVkWCA9IHggKyBtU2Nyb2xsWDsKKyAgICAgICAgZmluYWwgZmxvYXQgc2Nyb2xsZWRZID0geSArIG1TY3JvbGxZOworICAgICAgICBmbG9hdCBsb2NhbFggPSBzY3JvbGxlZFggLSBjaGlsZC5tTGVmdDsKKyAgICAgICAgZmxvYXQgbG9jYWxZID0gc2Nyb2xsZWRZIC0gY2hpbGQubVRvcDsKKyAgICAgICAgaWYgKCFjaGlsZC5oYXNJZGVudGl0eU1hdHJpeCgpICYmIG1BdHRhY2hJbmZvICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIG5vbi1pZGVudGl0eSBtYXRyaXg6IHRyYW5zZm9ybSB0aGUgcG9pbnQgaW50byB0aGUgdmlldydzIGNvb3JkaW5hdGVzCisgICAgICAgICAgICBmaW5hbCBmbG9hdFtdIGxvY2FsWFkgPSBtQXR0YWNoSW5mby5tVG1wVHJhbnNmb3JtTG9jYXRpb247CisgICAgICAgICAgICBsb2NhbFhZWzBdID0gbG9jYWxYOworICAgICAgICAgICAgbG9jYWxYWVsxXSA9IGxvY2FsWTsKKyAgICAgICAgICAgIGNoaWxkLmdldEludmVyc2VNYXRyaXgoKS5tYXBQb2ludHMobG9jYWxYWSk7CisgICAgICAgICAgICBsb2NhbFggPSBsb2NhbFhZWzBdOworICAgICAgICAgICAgbG9jYWxZID0gbG9jYWxYWVsxXTsKKyAgICAgICAgfQorICAgICAgICBpZiAobG9jYWxYID49IDAgJiYgbG9jYWxZID49IDAgJiYgbG9jYWxYIDwgKGNoaWxkLm1SaWdodCAtIGNoaWxkLm1MZWZ0KSAmJgorICAgICAgICAgICAgICAgIGxvY2FsWSA8IChjaGlsZC5tQm90dG9tIC0gY2hpbGQubVRvcCkpIHsKKyAgICAgICAgICAgIC8vIEl0IHdvdWxkIGJlIHNhZmVyIHRvIGNsb25lIHRoZSBldmVudCBoZXJlIGJ1dCB3ZSBkb24ndCBmb3IgcGVyZm9ybWFuY2UuCisgICAgICAgICAgICAvLyBUaGVyZSBhcmUgbWFueSBzdWJ0bGUgaW50ZXJhY3Rpb25zIGluIHRvdWNoIGV2ZW50IGRpc3BhdGNoOyBjaGFuZ2UgYXQgeW91ciBvd24gcmlzay4KKyAgICAgICAgICAgIGNoaWxkLm1Qcml2YXRlRmxhZ3MgJj0gfkNBTkNFTF9ORVhUX1VQX0VWRU5UOworICAgICAgICAgICAgZXYub2Zmc2V0TG9jYXRpb24obG9jYWxYIC0geCwgbG9jYWxZIC0geSk7CisgICAgICAgICAgICByZXR1cm4gY2hpbGQuZGlzcGF0Y2hUb3VjaEV2ZW50KGV2KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGRpc3BhdGNoU3BsaXRUb3VjaEV2ZW50KE1vdGlvbkV2ZW50IGV2KSB7CisgICAgICAgIGZpbmFsIFNwbGl0TW90aW9uVGFyZ2V0cyB0YXJnZXRzID0gbVNwbGl0TW90aW9uVGFyZ2V0czsKKyAgICAgICAgZmluYWwgaW50IGFjdGlvbiA9IGV2LmdldEFjdGlvbigpOworICAgICAgICBmaW5hbCBpbnQgbWFza2VkQWN0aW9uID0gZXYuZ2V0QWN0aW9uTWFza2VkKCk7CisgICAgICAgIGZsb2F0IHhmID0gZXYuZ2V0WCgpOworICAgICAgICBmbG9hdCB5ZiA9IGV2LmdldFkoKTsKKyAgICAgICAgZmxvYXQgc2Nyb2xsZWRYRmxvYXQgPSB4ZiArIG1TY3JvbGxYOworICAgICAgICBmbG9hdCBzY3JvbGxlZFlGbG9hdCA9IHlmICsgbVNjcm9sbFk7CisKKyAgICAgICAgYm9vbGVhbiBkaXNhbGxvd0ludGVyY2VwdCA9IChtR3JvdXBGbGFncyAmIEZMQUdfRElTQUxMT1dfSU5URVJDRVBUKSAhPSAwOworCisgICAgICAgIGlmIChtYXNrZWRBY3Rpb24gPT0gTW90aW9uRXZlbnQuQUNUSU9OX0RPV04gfHwKKyAgICAgICAgICAgICAgICBtYXNrZWRBY3Rpb24gPT0gTW90aW9uRXZlbnQuQUNUSU9OX1BPSU5URVJfRE9XTikgeworICAgICAgICAgICAgZmluYWwgaW50IGFjdGlvbkluZGV4ID0gZXYuZ2V0QWN0aW9uSW5kZXgoKTsKKyAgICAgICAgICAgIGZpbmFsIGludCBhY3Rpb25JZCA9IGV2LmdldFBvaW50ZXJJZChhY3Rpb25JbmRleCk7CisKKyAgICAgICAgICAgIC8vIENsZWFyIG91dCBhbnkgY3VycmVudCB0YXJnZXQgZm9yIHRoaXMgSUQuCisgICAgICAgICAgICAvLyBYWFg6IFdlIHNob3VsZCBwcm9iYWJseSBzZW5kIGFuIEFDVElPTl9VUCB0byB0aGUgY3VycmVudAorICAgICAgICAgICAgLy8gdGFyZ2V0IGlmIHByZXNlbnQuCisgICAgICAgICAgICB0YXJnZXRzLnJlbW92ZUJ5SWQoYWN0aW9uSWQpOworCisgICAgICAgICAgICAvLyBJZiB3ZSdyZSBkaXNhbGxvd2luZyBpbnRlcmNlcHQgb3IgaWYgd2UncmUgYWxsb3dpbmcgYW5kIHdlIGRpZG4ndAorICAgICAgICAgICAgLy8gaW50ZXJjZXB0CisgICAgICAgICAgICBpZiAoZGlzYWxsb3dJbnRlcmNlcHQgfHwgIW9uSW50ZXJjZXB0VG91Y2hFdmVudChldikpIHsKKyAgICAgICAgICAgICAgICAvLyByZXNldCB0aGlzIGV2ZW50J3MgYWN0aW9uIChqdXN0IHRvIHByb3RlY3Qgb3Vyc2VsdmVzKQorICAgICAgICAgICAgICAgIGV2LnNldEFjdGlvbihhY3Rpb24pOworICAgICAgICAgICAgICAgIC8vIFdlIGtub3cgd2Ugd2FudCB0byBkaXNwYXRjaCB0aGUgZXZlbnQgZG93biwgdHJ5IHRvIGZpbmQgYSBjaGlsZAorICAgICAgICAgICAgICAgIC8vIHdobyBjYW4gaGFuZGxlIGl0LCBzdGFydCB3aXRoIHRoZSBmcm9udC1tb3N0IGNoaWxkLgorICAgICAgICAgICAgICAgIGZpbmFsIGxvbmcgZG93blRpbWUgPSBldi5nZXRFdmVudFRpbWUoKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBWaWV3W10gY2hpbGRyZW4gPSBtQ2hpbGRyZW47CisgICAgICAgICAgICAgICAgZmluYWwgaW50IGNvdW50ID0gbUNoaWxkcmVuQ291bnQ7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IGNvdW50IC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgVmlldyBjaGlsZCA9IGNoaWxkcmVuW2ldOworICAgICAgICAgICAgICAgICAgICBpZiAoKGNoaWxkLm1WaWV3RmxhZ3MgJiBWSVNJQklMSVRZX01BU0spID09IFZJU0lCTEUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBjaGlsZC5nZXRBbmltYXRpb24oKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNb3Rpb25FdmVudCBjaGlsZEV2ZW50ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0cy5maWx0ZXJNb3Rpb25FdmVudEZvckNoaWxkKGV2LCBjaGlsZCwgZG93blRpbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkRXZlbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBjaGlsZEFjdGlvbkluZGV4ID0gY2hpbGRFdmVudC5maW5kUG9pbnRlckluZGV4KGFjdGlvbklkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpc3BhdGNoVG91Y2hFdmVudElmSW5WaWV3KGNoaWxkLCBjaGlsZEV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkQWN0aW9uSW5kZXgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRzLmFkZChhY3Rpb25JZCwgY2hpbGQsIGRvd25UaW1lKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZEV2ZW50LnJlY3ljbGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBEaWRuJ3QgZmluZCBhIG5ldyB0YXJnZXQuIERvIHdlIGhhdmUgYSAicHJpbWFyeSIgdGFyZ2V0IHRvIHNlbmQgdG8/CisgICAgICAgICAgICAgICAgZmluYWwgU3BsaXRNb3Rpb25UYXJnZXRzLlRhcmdldEluZm8gcHJpbWFyeVRhcmdldEluZm8gPSB0YXJnZXRzLmdldFByaW1hcnlUYXJnZXQoKTsKKyAgICAgICAgICAgICAgICBpZiAocHJpbWFyeVRhcmdldEluZm8gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBWaWV3IHByaW1hcnlUYXJnZXQgPSBwcmltYXJ5VGFyZ2V0SW5mby52aWV3OworICAgICAgICAgICAgICAgICAgICBmaW5hbCBNb3Rpb25FdmVudCBjaGlsZEV2ZW50ID0gdGFyZ2V0cy5maWx0ZXJNb3Rpb25FdmVudEZvckNoaWxkKGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW1hcnlUYXJnZXQsIHByaW1hcnlUYXJnZXRJbmZvLmRvd25UaW1lKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkRXZlbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDYWxjdWxhdGUgdGhlIG9mZnNldCBwb2ludCBpbnRvIHRoZSB0YXJnZXQncyBsb2NhbCBjb29yZGluYXRlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHhjID0gc2Nyb2xsZWRYRmxvYXQgLSAoZmxvYXQpIHByaW1hcnlUYXJnZXQubUxlZnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeWMgPSBzY3JvbGxlZFlGbG9hdCAtIChmbG9hdCkgcHJpbWFyeVRhcmdldC5tVG9wOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcHJpbWFyeVRhcmdldC5oYXNJZGVudGl0eU1hdHJpeCgpICYmIG1BdHRhY2hJbmZvICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm9uLWlkZW50aXR5IG1hdHJpeDogdHJhbnNmb3JtIHRoZSBwb2ludCBpbnRvIHRoZSB2aWV3J3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29vcmRpbmF0ZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgZmxvYXRbXSBsb2NhbFhZID0gbUF0dGFjaEluZm8ubVRtcFRyYW5zZm9ybUxvY2F0aW9uOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbFhZWzBdID0geGM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsWFlbMV0gPSB5YzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbWFyeVRhcmdldC5nZXRJbnZlcnNlTWF0cml4KCkubWFwUG9pbnRzKGxvY2FsWFkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4YyA9IGxvY2FsWFlbMF07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHljID0gbG9jYWxYWVsxXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRFdmVudC5zZXRMb2NhdGlvbih4YywgeWMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmltYXJ5VGFyZ2V0LmRpc3BhdGNoVG91Y2hFdmVudChjaGlsZEV2ZW50KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRzLmFkZChhY3Rpb25JZCwgcHJpbWFyeVRhcmdldCwgcHJpbWFyeVRhcmdldEluZm8uZG93blRpbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkRXZlbnQucmVjeWNsZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgYm9vbGVhbiBpc1VwT3JDYW5jZWwgPSAoYWN0aW9uID09IE1vdGlvbkV2ZW50LkFDVElPTl9VUCkgfHwKKyAgICAgICAgICAgICAgICAoYWN0aW9uID09IE1vdGlvbkV2ZW50LkFDVElPTl9DQU5DRUwpOworCisgICAgICAgIGlmIChpc1VwT3JDYW5jZWwpIHsKKyAgICAgICAgICAgIC8vIE5vdGUsIHdlJ3ZlIGFscmVhZHkgY29waWVkIHRoZSBwcmV2aW91cyBzdGF0ZSB0byBvdXIgbG9jYWwKKyAgICAgICAgICAgIC8vIHZhcmlhYmxlLCBzbyB0aGlzIHRha2VzIGVmZmVjdCBvbiB0aGUgbmV4dCBldmVudAorICAgICAgICAgICAgbUdyb3VwRmxhZ3MgJj0gfkZMQUdfRElTQUxMT1dfSU5URVJDRVBUOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHRhcmdldHMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAvLyBXZSBkb24ndCBoYXZlIGFueSB0YXJnZXRzLCB0aGlzIG1lYW5zIHdlJ3JlIGhhbmRsaW5nIHRoZQorICAgICAgICAgICAgLy8gZXZlbnQgYXMgYSByZWd1bGFyIHZpZXcuCisgICAgICAgICAgICBldi5zZXRMb2NhdGlvbih4ZiwgeWYpOworICAgICAgICAgICAgaWYgKChtUHJpdmF0ZUZsYWdzICYgQ0FOQ0VMX05FWFRfVVBfRVZFTlQpICE9IDApIHsKKyAgICAgICAgICAgICAgICBldi5zZXRBY3Rpb24oTW90aW9uRXZlbnQuQUNUSU9OX0NBTkNFTCk7CisgICAgICAgICAgICAgICAgbVByaXZhdGVGbGFncyAmPSB+Q0FOQ0VMX05FWFRfVVBfRVZFTlQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gc3VwZXIuZGlzcGF0Y2hUb3VjaEV2ZW50KGV2KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGlmIHdlIGhhdmUgdGFyZ2V0cywgc2VlIGlmIHdlJ3JlIGFsbG93ZWQgdG8gYW5kIHdhbnQgdG8gaW50ZXJjZXB0IHRoZWlyCisgICAgICAgIC8vIGV2ZW50cworICAgICAgICBpbnQgdW5pcXVlVGFyZ2V0Q291bnQgPSB0YXJnZXRzLmdldFVuaXF1ZVRhcmdldENvdW50KCk7CisgICAgICAgIGlmICghZGlzYWxsb3dJbnRlcmNlcHQgJiYgb25JbnRlcmNlcHRUb3VjaEV2ZW50KGV2KSkgeworICAgICAgICAgICAgbVByaXZhdGVGbGFncyAmPSB+Q0FOQ0VMX05FWFRfVVBfRVZFTlQ7CisKKyAgICAgICAgICAgIGZvciAoaW50IHVuaXF1ZUluZGV4ID0gMDsgdW5pcXVlSW5kZXggPCB1bmlxdWVUYXJnZXRDb3VudDsgdW5pcXVlSW5kZXgrKykgeworICAgICAgICAgICAgICAgIGZpbmFsIFZpZXcgdGFyZ2V0ID0gdGFyZ2V0cy5nZXRVbmlxdWVUYXJnZXRBdCh1bmlxdWVJbmRleCkudmlldzsKKworICAgICAgICAgICAgICAgIC8vIENhbGN1bGF0ZSB0aGUgb2Zmc2V0IHBvaW50IGludG8gdGhlIHRhcmdldCdzIGxvY2FsIGNvb3JkaW5hdGVzCisgICAgICAgICAgICAgICAgZmxvYXQgeGMgPSBzY3JvbGxlZFhGbG9hdCAtIChmbG9hdCkgdGFyZ2V0Lm1MZWZ0OworICAgICAgICAgICAgICAgIGZsb2F0IHljID0gc2Nyb2xsZWRZRmxvYXQgLSAoZmxvYXQpIHRhcmdldC5tVG9wOworICAgICAgICAgICAgICAgIGlmICghdGFyZ2V0Lmhhc0lkZW50aXR5TWF0cml4KCkgJiYgbUF0dGFjaEluZm8gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAvLyBub24taWRlbnRpdHkgbWF0cml4OiB0cmFuc2Zvcm0gdGhlIHBvaW50IGludG8gdGhlIHZpZXcncyBjb29yZGluYXRlcworICAgICAgICAgICAgICAgICAgICBmaW5hbCBmbG9hdFtdIGxvY2FsWFkgPSBtQXR0YWNoSW5mby5tVG1wVHJhbnNmb3JtTG9jYXRpb247CisgICAgICAgICAgICAgICAgICAgIGxvY2FsWFlbMF0gPSB4YzsKKyAgICAgICAgICAgICAgICAgICAgbG9jYWxYWVsxXSA9IHljOworICAgICAgICAgICAgICAgICAgICB0YXJnZXQuZ2V0SW52ZXJzZU1hdHJpeCgpLm1hcFBvaW50cyhsb2NhbFhZKTsKKyAgICAgICAgICAgICAgICAgICAgeGMgPSBsb2NhbFhZWzBdOworICAgICAgICAgICAgICAgICAgICB5YyA9IGxvY2FsWFlbMV07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZXYuc2V0QWN0aW9uKE1vdGlvbkV2ZW50LkFDVElPTl9DQU5DRUwpOworICAgICAgICAgICAgICAgIGV2LnNldExvY2F0aW9uKHhjLCB5Yyk7CisgICAgICAgICAgICAgICAgaWYgKCF0YXJnZXQuZGlzcGF0Y2hUb3VjaEV2ZW50KGV2KSkgeworICAgICAgICAgICAgICAgICAgICAvLyB0YXJnZXQgZGlkbid0IGhhbmRsZSBBQ1RJT05fQ0FOQ0VMLiBub3QgbXVjaCB3ZSBjYW4gZG8KKyAgICAgICAgICAgICAgICAgICAgLy8gYnV0IHRoZXkgc2hvdWxkIGhhdmUuCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgdGFyZ2V0cy5jbGVhcigpOworICAgICAgICAgICAgLy8gRG9uJ3QgZGlzcGF0Y2ggdGhpcyBldmVudCB0byBvdXIgb3duIHZpZXcsIGJlY2F1c2Ugd2UgYWxyZWFkeQorICAgICAgICAgICAgLy8gc2F3IGl0IHdoZW4gaW50ZXJjZXB0aW5nOyB3ZSBqdXN0IHdhbnQgdG8gZ2l2ZSB0aGUgZm9sbG93aW5nCisgICAgICAgICAgICAvLyBldmVudCB0byB0aGUgbm9ybWFsIG9uVG91Y2hFdmVudCgpLgorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBib29sZWFuIGhhbmRsZWQgPSBmYWxzZTsKKyAgICAgICAgZm9yIChpbnQgdW5pcXVlSW5kZXggPSAwOyB1bmlxdWVJbmRleCA8IHVuaXF1ZVRhcmdldENvdW50OyB1bmlxdWVJbmRleCsrKSB7CisgICAgICAgICAgICBmaW5hbCBTcGxpdE1vdGlvblRhcmdldHMuVGFyZ2V0SW5mbyB0YXJnZXRJbmZvID0gdGFyZ2V0cy5nZXRVbmlxdWVUYXJnZXRBdCh1bmlxdWVJbmRleCk7CisgICAgICAgICAgICBmaW5hbCBWaWV3IHRhcmdldCA9IHRhcmdldEluZm8udmlldzsKKworICAgICAgICAgICAgZmluYWwgTW90aW9uRXZlbnQgdGFyZ2V0RXZlbnQgPQorICAgICAgICAgICAgICAgICAgICB0YXJnZXRzLmZpbHRlck1vdGlvbkV2ZW50Rm9yQ2hpbGQoZXYsIHRhcmdldCwgdGFyZ2V0SW5mby5kb3duVGltZSk7CisgICAgICAgICAgICBpZiAodGFyZ2V0RXZlbnQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIC8vIENhbGN1bGF0ZSB0aGUgb2Zmc2V0IHBvaW50IGludG8gdGhlIHRhcmdldCdzIGxvY2FsIGNvb3JkaW5hdGVzCisgICAgICAgICAgICAgICAgeGYgPSB0YXJnZXRFdmVudC5nZXRYKCk7CisgICAgICAgICAgICAgICAgeWYgPSB0YXJnZXRFdmVudC5nZXRZKCk7CisgICAgICAgICAgICAgICAgc2Nyb2xsZWRYRmxvYXQgPSB4ZiArIG1TY3JvbGxYOworICAgICAgICAgICAgICAgIHNjcm9sbGVkWUZsb2F0ID0geWYgKyBtU2Nyb2xsWTsKKyAgICAgICAgICAgICAgICBmbG9hdCB4YyA9IHNjcm9sbGVkWEZsb2F0IC0gKGZsb2F0KSB0YXJnZXQubUxlZnQ7CisgICAgICAgICAgICAgICAgZmxvYXQgeWMgPSBzY3JvbGxlZFlGbG9hdCAtIChmbG9hdCkgdGFyZ2V0Lm1Ub3A7CisgICAgICAgICAgICAgICAgaWYgKCF0YXJnZXQuaGFzSWRlbnRpdHlNYXRyaXgoKSAmJiBtQXR0YWNoSW5mbyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIG5vbi1pZGVudGl0eSBtYXRyaXg6IHRyYW5zZm9ybSB0aGUgcG9pbnQgaW50byB0aGUgdmlldydzIGNvb3JkaW5hdGVzCisgICAgICAgICAgICAgICAgICAgIGZpbmFsIGZsb2F0W10gbG9jYWxYWSA9IG1BdHRhY2hJbmZvLm1UbXBUcmFuc2Zvcm1Mb2NhdGlvbjsKKyAgICAgICAgICAgICAgICAgICAgbG9jYWxYWVswXSA9IHhjOworICAgICAgICAgICAgICAgICAgICBsb2NhbFhZWzFdID0geWM7CisgICAgICAgICAgICAgICAgICAgIHRhcmdldC5nZXRJbnZlcnNlTWF0cml4KCkubWFwUG9pbnRzKGxvY2FsWFkpOworICAgICAgICAgICAgICAgICAgICB4YyA9IGxvY2FsWFlbMF07CisgICAgICAgICAgICAgICAgICAgIHljID0gbG9jYWxYWVsxXTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBmaW5hbGx5IG9mZnNldCB0aGUgZXZlbnQgdG8gdGhlIHRhcmdldCdzIGNvb3JkaW5hdGUgc3lzdGVtIGFuZAorICAgICAgICAgICAgICAgIC8vIGRpc3BhdGNoIHRoZSBldmVudC4KKyAgICAgICAgICAgICAgICB0YXJnZXRFdmVudC5zZXRMb2NhdGlvbih4YywgeWMpOworCisgICAgICAgICAgICAgICAgaWYgKCh0YXJnZXQubVByaXZhdGVGbGFncyAmIENBTkNFTF9ORVhUX1VQX0VWRU5UKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHRhcmdldEV2ZW50LnNldEFjdGlvbihNb3Rpb25FdmVudC5BQ1RJT05fQ0FOQ0VMKTsKKyAgICAgICAgICAgICAgICAgICAgdGFyZ2V0Lm1Qcml2YXRlRmxhZ3MgJj0gfkNBTkNFTF9ORVhUX1VQX0VWRU5UOworICAgICAgICAgICAgICAgICAgICB0YXJnZXRzLnJlbW92ZVZpZXcodGFyZ2V0KTsKKyAgICAgICAgICAgICAgICAgICAgdW5pcXVlSW5kZXgtLTsKKyAgICAgICAgICAgICAgICAgICAgdW5pcXVlVGFyZ2V0Q291bnQtLTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIGNoaWxkSGFuZGxlZCA9IHRhcmdldC5kaXNwYXRjaFRvdWNoRXZlbnQodGFyZ2V0RXZlbnQpOworICAgICAgICAgICAgICAgIGhhbmRsZWQgfD0gY2hpbGRIYW5kbGVkOworICAgICAgICAgICAgICAgIGlmICghY2hpbGRIYW5kbGVkKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIENoaWxkIGRvZXNuJ3Qgd2FudCB0aGVzZSBldmVudHMgYW55bW9yZSwgYnV0IHdlJ3JlIHN0aWxsIGRpc3BhdGNoaW5nCisgICAgICAgICAgICAgICAgICAgIC8vIG90aGVyIHNwbGl0IGV2ZW50cyB0byBjaGlsZHJlbi4KKyAgICAgICAgICAgICAgICAgICAgdGFyZ2V0cy5yZW1vdmVWaWV3KHRhcmdldCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICB0YXJnZXRFdmVudC5yZWN5Y2xlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAobWFza2VkQWN0aW9uID09IE1vdGlvbkV2ZW50LkFDVElPTl9QT0lOVEVSX1VQKSB7CisgICAgICAgICAgICBmaW5hbCBpbnQgcmVtb3ZlSWQgPSBldi5nZXRQb2ludGVySWQoZXYuZ2V0QWN0aW9uSW5kZXgoKSk7CisgICAgICAgICAgICB0YXJnZXRzLnJlbW92ZUJ5SWQocmVtb3ZlSWQpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGlzVXBPckNhbmNlbCkgeworICAgICAgICAgICAgdGFyZ2V0cy5jbGVhcigpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGhhbmRsZWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogRW5hYmxlIG9yIGRpc2FibGUgdGhlIHNwbGl0dGluZyBvZiBNb3Rpb25FdmVudHMgdG8gbXVsdGlwbGUgY2hpbGRyZW4gZHVyaW5nIHRvdWNoIGV2ZW50CisgICAgICogZGlzcGF0Y2guIFRoaXMgYmVoYXZpb3IgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdC4KKyAgICAgKgorICAgICAqIDxwPldoZW4gdGhpcyBvcHRpb24gaXMgZW5hYmxlZCBNb3Rpb25FdmVudHMgbWF5IGJlIHNwbGl0IGFuZCBkaXNwYXRjaGVkIHRvIGRpZmZlcmVudCBjaGlsZAorICAgICAqIHZpZXdzIGRlcGVuZGluZyBvbiB3aGVyZSBlYWNoIHBvaW50ZXIgaW5pdGlhbGx5IHdlbnQgZG93bi4gVGhpcyBhbGxvd3MgZm9yIHVzZXIgaW50ZXJhY3Rpb25zCisgICAgICogc3VjaCBhcyBzY3JvbGxpbmcgdHdvIHBhbmVzIG9mIGNvbnRlbnQgaW5kZXBlbmRlbnRseSwgY2hvcmRpbmcgb2YgYnV0dG9ucywgYW5kIHBlcmZvcm1pbmcKKyAgICAgKiBpbmRlcGVuZGVudCBnZXN0dXJlcyBvbiBkaWZmZXJlbnQgcGllY2VzIG9mIGNvbnRlbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3BsaXQgPGNvZGU+dHJ1ZTwvY29kZT4gdG8gYWxsb3cgTW90aW9uRXZlbnRzIHRvIGJlIHNwbGl0IGFuZCBkaXNwYXRjaGVkIHRvIG11bHRpcGxlCisgICAgICogICAgICAgICAgICAgIGNoaWxkIHZpZXdzLiA8Y29kZT5mYWxzZTwvY29kZT4gdG8gb25seSBhbGxvdyBvbmUgY2hpbGQgdmlldyB0byBiZSB0aGUgdGFyZ2V0IG9mCisgICAgICogICAgICAgICAgICAgIGFueSBNb3Rpb25FdmVudCByZWNlaXZlZCBieSB0aGlzIFZpZXdHcm91cC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNb3Rpb25FdmVudFNwbGl0dGluZ0VuYWJsZWQoYm9vbGVhbiBzcGxpdCkgeworICAgICAgICAvLyBUT0RPIEFwcGxpY2F0aW9ucyByZWFsbHkgc2hvdWxkbid0IGNoYW5nZSB0aGlzIHNldHRpbmcgbWlkLXRvdWNoIGV2ZW50LAorICAgICAgICAvLyBidXQgcGVyaGFwcyB0aGlzIHNob3VsZCBoYW5kbGUgdGhhdCBjYXNlIGFuZCBzZW5kIEFDVElPTl9DQU5DRUxzIHRvIGFueSBjaGlsZCB2aWV3cworICAgICAgICAvLyB3aXRoIGdlc3R1cmVzIGluIHByb2dyZXNzIHdoZW4gdGhpcyBpcyBjaGFuZ2VkLgorICAgICAgICBpZiAoc3BsaXQpIHsKKyAgICAgICAgICAgIG1Hcm91cEZsYWdzIHw9IEZMQUdfU1BMSVRfTU9USU9OX0VWRU5UUzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1Hcm91cEZsYWdzICY9IH5GTEFHX1NQTElUX01PVElPTl9FVkVOVFM7CisgICAgICAgICAgICBtU3BsaXRNb3Rpb25UYXJnZXRzID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBNb3Rpb25FdmVudHMgZGlzcGF0Y2hlZCB0byB0aGlzIFZpZXdHcm91cCBjYW4gYmUgc3BsaXQgdG8gbXVsdGlwbGUgY2hpbGRyZW4uCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNNb3Rpb25FdmVudFNwbGl0dGluZ0VuYWJsZWQoKSB7CisgICAgICAgIHJldHVybiAobUdyb3VwRmxhZ3MgJiBGTEFHX1NQTElUX01PVElPTl9FVkVOVFMpID09IEZMQUdfU1BMSVRfTU9USU9OX0VWRU5UUzsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiB7QGluaGVyaXREb2N9CiAgICAgICovCiAgICAgcHVibGljIHZvaWQgcmVxdWVzdERpc2FsbG93SW50ZXJjZXB0VG91Y2hFdmVudChib29sZWFuIGRpc2FsbG93SW50ZXJjZXB0KSB7CkBAIC0xMTgyLDcgKzE0OTYsMTAgQEAKICAgICAgICAgZmluYWwgaW50IGNvdW50ID0gbUNoaWxkcmVuQ291bnQ7CiAgICAgICAgIGZpbmFsIFZpZXdbXSBjaGlsZHJlbiA9IG1DaGlsZHJlbjsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBjaGlsZHJlbltpXS5kaXNwYXRjaFNhdmVJbnN0YW5jZVN0YXRlKGNvbnRhaW5lcik7CisgICAgICAgICAgICBWaWV3IGMgPSBjaGlsZHJlbltpXTsKKyAgICAgICAgICAgIGlmICgoYy5tVmlld0ZsYWdzICYgUEFSRU5UX1NBVkVfRElTQUJMRURfTUFTSykgIT0gUEFSRU5UX1NBVkVfRElTQUJMRUQpIHsKKyAgICAgICAgICAgICAgICBjLmRpc3BhdGNoU2F2ZUluc3RhbmNlU3RhdGUoY29udGFpbmVyKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIApAQCAtMTIwNyw3ICsxNTI0LDEwIEBACiAgICAgICAgIGZpbmFsIGludCBjb3VudCA9IG1DaGlsZHJlbkNvdW50OwogICAgICAgICBmaW5hbCBWaWV3W10gY2hpbGRyZW4gPSBtQ2hpbGRyZW47CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgY2hpbGRyZW5baV0uZGlzcGF0Y2hSZXN0b3JlSW5zdGFuY2VTdGF0ZShjb250YWluZXIpOworICAgICAgICAgICAgVmlldyBjID0gY2hpbGRyZW5baV07CisgICAgICAgICAgICBpZiAoKGMubVZpZXdGbGFncyAmIFBBUkVOVF9TQVZFX0RJU0FCTEVEX01BU0spICE9IFBBUkVOVF9TQVZFX0RJU0FCTEVEKSB7CisgICAgICAgICAgICAgICAgYy5kaXNwYXRjaFJlc3RvcmVJbnN0YW5jZVN0YXRlKGNvbnRhaW5lcik7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTE0NzcsMjIgKzE3OTcsMjUgQEAKICAgICAgICAgZmluYWwgaW50IGZsYWdzID0gbUdyb3VwRmxhZ3M7CiAKICAgICAgICAgaWYgKChmbGFncyAmIEZMQUdfQ0xFQVJfVFJBTlNGT1JNQVRJT04pID09IEZMQUdfQ0xFQVJfVFJBTlNGT1JNQVRJT04pIHsKLSAgICAgICAgICAgIGlmIChtQ2hpbGRUcmFuc2Zvcm1hdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUNoaWxkVHJhbnNmb3JtYXRpb24uY2xlYXIoKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1DaGlsZFRyYW5zZm9ybWF0aW9uLmNsZWFyKCk7CiAgICAgICAgICAgICBtR3JvdXBGbGFncyAmPSB+RkxBR19DTEVBUl9UUkFOU0ZPUk1BVElPTjsKICAgICAgICAgfQogCiAgICAgICAgIFRyYW5zZm9ybWF0aW9uIHRyYW5zZm9ybVRvQXBwbHkgPSBudWxsOworICAgICAgICBUcmFuc2Zvcm1hdGlvbiBpbnZhbGlkYXRpb25UcmFuc2Zvcm07CiAgICAgICAgIGZpbmFsIEFuaW1hdGlvbiBhID0gY2hpbGQuZ2V0QW5pbWF0aW9uKCk7CiAgICAgICAgIGJvb2xlYW4gY29uY2F0TWF0cml4ID0gZmFsc2U7CiAKLSAgICAgICAgaWYgKGEgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKG1JbnZhbGlkYXRlUmVnaW9uID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtSW52YWxpZGF0ZVJlZ2lvbiA9IG5ldyBSZWN0RigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWwgUmVjdEYgcmVnaW9uID0gbUludmFsaWRhdGVSZWdpb247CisgICAgICAgIGJvb2xlYW4gc2NhbGluZ1JlcXVpcmVkID0gZmFsc2U7CisgICAgICAgIGJvb2xlYW4gY2FjaGluZyA9IGZhbHNlOworICAgICAgICBpZiAoIWNhbnZhcy5pc0hhcmR3YXJlQWNjZWxlcmF0ZWQoKSAmJgorICAgICAgICAgICAgICAgIChmbGFncyAmIEZMQUdfQ0hJTERSRU5fRFJBV05fV0lUSF9DQUNIRSkgPT0gRkxBR19DSElMRFJFTl9EUkFXTl9XSVRIX0NBQ0hFIHx8CisgICAgICAgICAgICAgICAgKGZsYWdzICYgRkxBR19BTFdBWVNfRFJBV05fV0lUSF9DQUNIRSkgPT0gRkxBR19BTFdBWVNfRFJBV05fV0lUSF9DQUNIRSkgeworICAgICAgICAgICAgY2FjaGluZyA9IHRydWU7CisgICAgICAgICAgICBpZiAobUF0dGFjaEluZm8gIT0gbnVsbCkgc2NhbGluZ1JlcXVpcmVkID0gbUF0dGFjaEluZm8ubVNjYWxpbmdSZXF1aXJlZDsKKyAgICAgICAgfQogCisgICAgICAgIGlmIChhICE9IG51bGwpIHsKICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gaW5pdGlhbGl6ZWQgPSBhLmlzSW5pdGlhbGl6ZWQoKTsKICAgICAgICAgICAgIGlmICghaW5pdGlhbGl6ZWQpIHsKICAgICAgICAgICAgICAgICBhLmluaXRpYWxpemUoY3IgLSBjbCwgY2IgLSBjdCwgZ2V0V2lkdGgoKSwgZ2V0SGVpZ2h0KCkpOwpAQCAtMTUwMCwxMCArMTgyMywxNyBAQAogICAgICAgICAgICAgICAgIGNoaWxkLm9uQW5pbWF0aW9uU3RhcnQoKTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKG1DaGlsZFRyYW5zZm9ybWF0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtQ2hpbGRUcmFuc2Zvcm1hdGlvbiA9IG5ldyBUcmFuc2Zvcm1hdGlvbigpOworICAgICAgICAgICAgbW9yZSA9IGEuZ2V0VHJhbnNmb3JtYXRpb24oZHJhd2luZ1RpbWUsIG1DaGlsZFRyYW5zZm9ybWF0aW9uLAorICAgICAgICAgICAgICAgICAgICBzY2FsaW5nUmVxdWlyZWQgPyBtQXR0YWNoSW5mby5tQXBwbGljYXRpb25TY2FsZSA6IDFmKTsKKyAgICAgICAgICAgIGlmIChzY2FsaW5nUmVxdWlyZWQgJiYgbUF0dGFjaEluZm8ubUFwcGxpY2F0aW9uU2NhbGUgIT0gMWYpIHsKKyAgICAgICAgICAgICAgICBpZiAobUludmFsaWRhdGlvblRyYW5zZm9ybWF0aW9uID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbUludmFsaWRhdGlvblRyYW5zZm9ybWF0aW9uID0gbmV3IFRyYW5zZm9ybWF0aW9uKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGludmFsaWRhdGlvblRyYW5zZm9ybSA9IG1JbnZhbGlkYXRpb25UcmFuc2Zvcm1hdGlvbjsKKyAgICAgICAgICAgICAgICBhLmdldFRyYW5zZm9ybWF0aW9uKGRyYXdpbmdUaW1lLCBpbnZhbGlkYXRpb25UcmFuc2Zvcm0sIDFmKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW52YWxpZGF0aW9uVHJhbnNmb3JtID0gbUNoaWxkVHJhbnNmb3JtYXRpb247CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtb3JlID0gYS5nZXRUcmFuc2Zvcm1hdGlvbihkcmF3aW5nVGltZSwgbUNoaWxkVHJhbnNmb3JtYXRpb24pOwogICAgICAgICAgICAgdHJhbnNmb3JtVG9BcHBseSA9IG1DaGlsZFRyYW5zZm9ybWF0aW9uOwogCiAgICAgICAgICAgICBjb25jYXRNYXRyaXggPSBhLndpbGxDaGFuZ2VUcmFuc2Zvcm1hdGlvbk1hdHJpeCgpOwpAQCAtMTUyMCw3ICsxODUwLDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKGNsLCBjdCwgY3IsIGNiKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGEuZ2V0SW52YWxpZGF0ZVJlZ2lvbigwLCAwLCBjciAtIGNsLCBjYiAtIGN0LCByZWdpb24sIHRyYW5zZm9ybVRvQXBwbHkpOworICAgICAgICAgICAgICAgICAgICBpZiAobUludmFsaWRhdGVSZWdpb24gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbUludmFsaWRhdGVSZWdpb24gPSBuZXcgUmVjdEYoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBmaW5hbCBSZWN0RiByZWdpb24gPSBtSW52YWxpZGF0ZVJlZ2lvbjsKKyAgICAgICAgICAgICAgICAgICAgYS5nZXRJbnZhbGlkYXRlUmVnaW9uKDAsIDAsIGNyIC0gY2wsIGNiIC0gY3QsIHJlZ2lvbiwgaW52YWxpZGF0aW9uVHJhbnNmb3JtKTsKIAogICAgICAgICAgICAgICAgICAgICAvLyBUaGUgY2hpbGQgbmVlZCB0byBkcmF3IGFuIGFuaW1hdGlvbiwgcG90ZW50aWFsbHkgb2Zmc2NyZWVuLCBzbwogICAgICAgICAgICAgICAgICAgICAvLyBtYWtlIHN1cmUgd2UgZG8gbm90IGNhbmNlbCBpbnZhbGlkYXRlIHJlcXVlc3RzCkBAIC0xNTMzLDkgKzE4NjcsNiBAQAogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgaWYgKChmbGFncyAmIEZMQUdfU1VQUE9SVF9TVEFUSUNfVFJBTlNGT1JNQVRJT05TKSA9PQogICAgICAgICAgICAgICAgIEZMQUdfU1VQUE9SVF9TVEFUSUNfVFJBTlNGT1JNQVRJT05TKSB7Ci0gICAgICAgICAgICBpZiAobUNoaWxkVHJhbnNmb3JtYXRpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1DaGlsZFRyYW5zZm9ybWF0aW9uID0gbmV3IFRyYW5zZm9ybWF0aW9uKCk7Ci0gICAgICAgICAgICB9CiAgICAgICAgICAgICBmaW5hbCBib29sZWFuIGhhc1RyYW5zZm9ybSA9IGdldENoaWxkU3RhdGljVHJhbnNmb3JtYXRpb24oY2hpbGQsIG1DaGlsZFRyYW5zZm9ybWF0aW9uKTsKICAgICAgICAgICAgIGlmIChoYXNUcmFuc2Zvcm0pIHsKICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgdHJhbnNmb3JtVHlwZSA9IG1DaGlsZFRyYW5zZm9ybWF0aW9uLmdldFRyYW5zZm9ybWF0aW9uVHlwZSgpOwpAQCAtMTU0NSw2ICsxODc2LDggQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCisgICAgICAgIGNvbmNhdE1hdHJpeCB8PSAhY2hpbGQuaGFzSWRlbnRpdHlNYXRyaXgoKTsKKwogICAgICAgICAvLyBTZXRzIHRoZSBmbGFnIGFzIGVhcmx5IGFzIHBvc3NpYmxlIHRvIGFsbG93IGRyYXcoKSBpbXBsZW1lbnRhdGlvbnMKICAgICAgICAgLy8gdG8gY2FsbCBpbnZhbGlkYXRlKCkgc3VjY2Vzc2Z1bGx5IHdoZW4gZG9pbmcgYW5pbWF0aW9ucwogICAgICAgICBjaGlsZC5tUHJpdmF0ZUZsYWdzIHw9IERSQVdOOwpAQCAtMTU1OSwxMiArMTg5Miw5IEBACiAgICAgICAgIGZpbmFsIGludCBzeCA9IGNoaWxkLm1TY3JvbGxYOwogICAgICAgICBmaW5hbCBpbnQgc3kgPSBjaGlsZC5tU2Nyb2xsWTsKIAotICAgICAgICBib29sZWFuIHNjYWxpbmdSZXF1aXJlZCA9IGZhbHNlOwogICAgICAgICBCaXRtYXAgY2FjaGUgPSBudWxsOwotICAgICAgICBpZiAoKGZsYWdzICYgRkxBR19DSElMRFJFTl9EUkFXTl9XSVRIX0NBQ0hFKSA9PSBGTEFHX0NISUxEUkVOX0RSQVdOX1dJVEhfQ0FDSEUgfHwKLSAgICAgICAgICAgICAgICAoZmxhZ3MgJiBGTEFHX0FMV0FZU19EUkFXTl9XSVRIX0NBQ0hFKSA9PSBGTEFHX0FMV0FZU19EUkFXTl9XSVRIX0NBQ0hFKSB7CisgICAgICAgIGlmIChjYWNoaW5nKSB7CiAgICAgICAgICAgICBjYWNoZSA9IGNoaWxkLmdldERyYXdpbmdDYWNoZSh0cnVlKTsKLSAgICAgICAgICAgIGlmIChtQXR0YWNoSW5mbyAhPSBudWxsKSBzY2FsaW5nUmVxdWlyZWQgPSBtQXR0YWNoSW5mby5tU2NhbGluZ1JlcXVpcmVkOwogICAgICAgICB9CiAKICAgICAgICAgZmluYWwgYm9vbGVhbiBoYXNOb0NhY2hlID0gY2FjaGUgPT0gbnVsbDsKQEAgLTE1ODEsMzYgKzE5MTEsNTEgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIGZsb2F0IGFscGhhID0gMS4wZjsKKyAgICAgICAgZmxvYXQgYWxwaGEgPSBjaGlsZC5nZXRBbHBoYSgpOwogCi0gICAgICAgIGlmICh0cmFuc2Zvcm1Ub0FwcGx5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChjb25jYXRNYXRyaXgpIHsKLSAgICAgICAgICAgICAgICBpbnQgdHJhbnNYID0gMDsKLSAgICAgICAgICAgICAgICBpbnQgdHJhbnNZID0gMDsKLSAgICAgICAgICAgICAgICBpZiAoaGFzTm9DYWNoZSkgewotICAgICAgICAgICAgICAgICAgICB0cmFuc1ggPSAtc3g7Ci0gICAgICAgICAgICAgICAgICAgIHRyYW5zWSA9IC1zeTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gVW5kbyB0aGUgc2Nyb2xsIHRyYW5zbGF0aW9uLCBhcHBseSB0aGUgdHJhbnNmb3JtYXRpb24gbWF0cml4LAotICAgICAgICAgICAgICAgIC8vIHRoZW4gcmVkbyB0aGUgc2Nyb2xsIHRyYW5zbGF0ZSB0byBnZXQgdGhlIGNvcnJlY3QgcmVzdWx0LgotICAgICAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoLXRyYW5zWCwgLXRyYW5zWSk7Ci0gICAgICAgICAgICAgICAgY2FudmFzLmNvbmNhdCh0cmFuc2Zvcm1Ub0FwcGx5LmdldE1hdHJpeCgpKTsKLSAgICAgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKHRyYW5zWCwgdHJhbnNZKTsKLSAgICAgICAgICAgICAgICBtR3JvdXBGbGFncyB8PSBGTEFHX0NMRUFSX1RSQU5TRk9STUFUSU9OOworICAgICAgICBpZiAodHJhbnNmb3JtVG9BcHBseSAhPSBudWxsIHx8IGFscGhhIDwgMS4wZiB8fCAhY2hpbGQuaGFzSWRlbnRpdHlNYXRyaXgoKSkgeworICAgICAgICAgICAgaW50IHRyYW5zWCA9IDA7CisgICAgICAgICAgICBpbnQgdHJhbnNZID0gMDsKKworICAgICAgICAgICAgaWYgKGhhc05vQ2FjaGUpIHsKKyAgICAgICAgICAgICAgICB0cmFuc1ggPSAtc3g7CisgICAgICAgICAgICAgICAgdHJhbnNZID0gLXN5OwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBhbHBoYSA9IHRyYW5zZm9ybVRvQXBwbHkuZ2V0QWxwaGEoKTsKKyAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1Ub0FwcGx5ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAoY29uY2F0TWF0cml4KSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFVuZG8gdGhlIHNjcm9sbCB0cmFuc2xhdGlvbiwgYXBwbHkgdGhlIHRyYW5zZm9ybWF0aW9uIG1hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhlbiByZWRvIHRoZSBzY3JvbGwgdHJhbnNsYXRlIHRvIGdldCB0aGUgY29ycmVjdCByZXN1bHQuCisgICAgICAgICAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoLXRyYW5zWCwgLXRyYW5zWSk7CisgICAgICAgICAgICAgICAgICAgIGNhbnZhcy5jb25jYXQodHJhbnNmb3JtVG9BcHBseS5nZXRNYXRyaXgoKSk7CisgICAgICAgICAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUodHJhbnNYLCB0cmFuc1kpOworICAgICAgICAgICAgICAgICAgICBtR3JvdXBGbGFncyB8PSBGTEFHX0NMRUFSX1RSQU5TRk9STUFUSU9OOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZsb2F0IHRyYW5zZm9ybUFscGhhID0gdHJhbnNmb3JtVG9BcHBseS5nZXRBbHBoYSgpOworICAgICAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1BbHBoYSA8IDEuMGYpIHsKKyAgICAgICAgICAgICAgICAgICAgYWxwaGEgKj0gdHJhbnNmb3JtVG9BcHBseS5nZXRBbHBoYSgpOworICAgICAgICAgICAgICAgICAgICBtR3JvdXBGbGFncyB8PSBGTEFHX0NMRUFSX1RSQU5TRk9STUFUSU9OOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFjaGlsZC5oYXNJZGVudGl0eU1hdHJpeCgpKSB7CisgICAgICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgtdHJhbnNYLCAtdHJhbnNZKTsKKyAgICAgICAgICAgICAgICBjYW52YXMuY29uY2F0KGNoaWxkLmdldE1hdHJpeCgpKTsKKyAgICAgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKHRyYW5zWCwgdHJhbnNZKTsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgaWYgKGFscGhhIDwgMS4wZikgewogICAgICAgICAgICAgICAgIG1Hcm91cEZsYWdzIHw9IEZMQUdfQ0xFQVJfVFJBTlNGT1JNQVRJT047Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChhbHBoYSA8IDEuMGYgJiYgaGFzTm9DYWNoZSkgewotICAgICAgICAgICAgICAgIGZpbmFsIGludCBtdWx0aXBsaWVkQWxwaGEgPSAoaW50KSAoMjU1ICogYWxwaGEpOwotICAgICAgICAgICAgICAgIGlmICghY2hpbGQub25TZXRBbHBoYShtdWx0aXBsaWVkQWxwaGEpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhbnZhcy5zYXZlTGF5ZXJBbHBoYShzeCwgc3ksIHN4ICsgY3IgLSBjbCwgc3kgKyBjYiAtIGN0LCBtdWx0aXBsaWVkQWxwaGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FudmFzLkhBU19BTFBIQV9MQVlFUl9TQVZFX0ZMQUcgfCBDYW52YXMuQ0xJUF9UT19MQVlFUl9TQVZFX0ZMQUcpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGNoaWxkLm1Qcml2YXRlRmxhZ3MgfD0gQUxQSEFfU0VUOworICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWYgKGhhc05vQ2FjaGUpIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IG11bHRpcGxpZWRBbHBoYSA9IChpbnQpICgyNTUgKiBhbHBoYSk7CisgICAgICAgICAgICAgICAgICAgIGlmICghY2hpbGQub25TZXRBbHBoYShtdWx0aXBsaWVkQWxwaGEpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYW52YXMuc2F2ZUxheWVyQWxwaGEoc3gsIHN5LCBzeCArIGNyIC0gY2wsIHN5ICsgY2IgLSBjdCwgbXVsdGlwbGllZEFscGhhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYW52YXMuSEFTX0FMUEhBX0xBWUVSX1NBVkVfRkxBRyB8IENhbnZhcy5DTElQX1RPX0xBWUVSX1NBVkVfRkxBRyk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5tUHJpdmF0ZUZsYWdzIHw9IEFMUEhBX1NFVDsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIGlmICgoY2hpbGQubVByaXZhdGVGbGFncyAmIEFMUEhBX1NFVCkgPT0gQUxQSEFfU0VUKSB7CkBAIC0xNjk3LDYgKzIwNDIsNyBAQAogICAgICAgICBmaW5hbCBWaWV3W10gY2hpbGRyZW4gPSBtQ2hpbGRyZW47CiAgICAgICAgIGZpbmFsIGludCBjb3VudCA9IG1DaGlsZHJlbkNvdW50OwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIAogICAgICAgICAgICAgY2hpbGRyZW5baV0uc2V0U2VsZWN0ZWQoc2VsZWN0ZWQpOwogICAgICAgICB9CiAgICAgfQpAQCAtMjQ3MCw2ICsyODE2LDE1IEBACiAgICAgICAgICAgICBmaW5hbCBpbnRbXSBsb2NhdGlvbiA9IGF0dGFjaEluZm8ubUludmFsaWRhdGVDaGlsZExvY2F0aW9uOwogICAgICAgICAgICAgbG9jYXRpb25bQ0hJTERfTEVGVF9JTkRFWF0gPSBjaGlsZC5tTGVmdDsKICAgICAgICAgICAgIGxvY2F0aW9uW0NISUxEX1RPUF9JTkRFWF0gPSBjaGlsZC5tVG9wOworICAgICAgICAgICAgTWF0cml4IGNoaWxkTWF0cml4ID0gY2hpbGQuZ2V0TWF0cml4KCk7CisgICAgICAgICAgICBpZiAoIWNoaWxkTWF0cml4LmlzSWRlbnRpdHkoKSkgeworICAgICAgICAgICAgICAgIFJlY3RGIGJvdW5kaW5nUmVjdCA9IGF0dGFjaEluZm8ubVRtcFRyYW5zZm9ybVJlY3Q7CisgICAgICAgICAgICAgICAgYm91bmRpbmdSZWN0LnNldChkaXJ0eSk7CisgICAgICAgICAgICAgICAgY2hpbGRNYXRyaXgubWFwUmVjdChib3VuZGluZ1JlY3QpOworICAgICAgICAgICAgICAgIGRpcnR5LnNldCgoaW50KSBib3VuZGluZ1JlY3QubGVmdCwgKGludCkgYm91bmRpbmdSZWN0LnRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpIChib3VuZGluZ1JlY3QucmlnaHQgKyAwLjVmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpIChib3VuZGluZ1JlY3QuYm90dG9tICsgMC41ZikpOworICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvLyBJZiB0aGUgY2hpbGQgaXMgZHJhd2luZyBhbiBhbmltYXRpb24sIHdlIHdhbnQgdG8gY29weSB0aGlzIGZsYWcgb250bwogICAgICAgICAgICAgLy8gb3Vyc2VsdmVzIGFuZCB0aGUgcGFyZW50IHRvIG1ha2Ugc3VyZSB0aGUgaW52YWxpZGF0ZSByZXF1ZXN0IGdvZXMKQEAgLTI1MDQsNiArMjg1OSwxOCBAQAogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIHBhcmVudCA9IHBhcmVudC5pbnZhbGlkYXRlQ2hpbGRJblBhcmVudChsb2NhdGlvbiwgZGlydHkpOworICAgICAgICAgICAgICAgIGlmICh2aWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gQWNjb3VudCBmb3IgdHJhbnNmb3JtIG9uIGN1cnJlbnQgcGFyZW50CisgICAgICAgICAgICAgICAgICAgIE1hdHJpeCBtID0gdmlldy5nZXRNYXRyaXgoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFtLmlzSWRlbnRpdHkoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgUmVjdEYgYm91bmRpbmdSZWN0ID0gYXR0YWNoSW5mby5tVG1wVHJhbnNmb3JtUmVjdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvdW5kaW5nUmVjdC5zZXQoZGlydHkpOworICAgICAgICAgICAgICAgICAgICAgICAgbS5tYXBSZWN0KGJvdW5kaW5nUmVjdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBkaXJ0eS5zZXQoKGludCkgYm91bmRpbmdSZWN0LmxlZnQsIChpbnQpIGJvdW5kaW5nUmVjdC50b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpIChib3VuZGluZ1JlY3QucmlnaHQgKyAwLjVmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgKGJvdW5kaW5nUmVjdC5ib3R0b20gKyAwLjVmKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IHdoaWxlIChwYXJlbnQgIT0gbnVsbCk7CiAgICAgICAgIH0KICAgICB9CkBAIC0yODcwLDcgKzMyMzcsNyBAQAogICAgICAqLwogICAgIEBWaWV3RGVidWcuRXhwb3J0ZWRQcm9wZXJ0eShjYXRlZ29yeSA9ICJkcmF3aW5nIiwgbWFwcGluZyA9IHsKICAgICAgICAgQFZpZXdEZWJ1Zy5JbnRUb1N0cmluZyhmcm9tID0gUEVSU0lTVEVOVF9OT19DQUNIRSwgICAgICAgIHRvID0gIk5PTkUiKSwKLSAgICAgICAgQFZpZXdEZWJ1Zy5JbnRUb1N0cmluZyhmcm9tID0gUEVSU0lTVEVOVF9BTExfQ0FDSEVTLCAgICAgIHRvID0gIkFOSU1BVElPTiIpLAorICAgICAgICBAVmlld0RlYnVnLkludFRvU3RyaW5nKGZyb20gPSBQRVJTSVNURU5UX0FOSU1BVElPTl9DQUNIRSwgdG8gPSAiQU5JTUFUSU9OIiksCiAgICAgICAgIEBWaWV3RGVidWcuSW50VG9TdHJpbmcoZnJvbSA9IFBFUlNJU1RFTlRfU0NST0xMSU5HX0NBQ0hFLCB0byA9ICJTQ1JPTExJTkciKSwKICAgICAgICAgQFZpZXdEZWJ1Zy5JbnRUb1N0cmluZyhmcm9tID0gUEVSU0lTVEVOVF9BTExfQ0FDSEVTLCAgICAgIHRvID0gIkFMTCIpCiAgICAgfSkKQEAgLTM3NDQsNCArNDExMSwzMTIgQEAKICAgICAgICAgICAgIGJvdHRvbU1hcmdpbiA9IGJvdHRvbTsKICAgICAgICAgfQogICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFNwbGl0TW90aW9uVGFyZ2V0cyB7CisgICAgICAgIHByaXZhdGUgU3BhcnNlQXJyYXk8Vmlldz4gbVRhcmdldHM7CisgICAgICAgIHByaXZhdGUgVGFyZ2V0SW5mb1tdIG1VbmlxdWVUYXJnZXRzOworICAgICAgICBwcml2YXRlIGludCBtVW5pcXVlVGFyZ2V0Q291bnQ7CisgICAgICAgIHByaXZhdGUgTW90aW9uRXZlbnQuUG9pbnRlckNvb3Jkc1tdIG1Qb2ludGVyQ29vcmRzOworICAgICAgICBwcml2YXRlIGludFtdIG1Qb2ludGVySWRzOworCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJTklUSUFMX1VOSVFVRV9NT1RJT05fVEFSR0VUU19TSVpFID0gNTsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElOSVRJQUxfQlVDS0VUX1NJWkUgPSA1OworCisgICAgICAgIHB1YmxpYyBTcGxpdE1vdGlvblRhcmdldHMoKSB7CisgICAgICAgICAgICBtVGFyZ2V0cyA9IG5ldyBTcGFyc2VBcnJheTxWaWV3PigpOworICAgICAgICAgICAgbVVuaXF1ZVRhcmdldHMgPSBuZXcgVGFyZ2V0SW5mb1tJTklUSUFMX1VOSVFVRV9NT1RJT05fVEFSR0VUU19TSVpFXTsKKyAgICAgICAgICAgIG1Qb2ludGVySWRzID0gbmV3IGludFtJTklUSUFMX0JVQ0tFVF9TSVpFXTsKKyAgICAgICAgICAgIG1Qb2ludGVyQ29vcmRzID0gbmV3IE1vdGlvbkV2ZW50LlBvaW50ZXJDb29yZHNbSU5JVElBTF9CVUNLRVRfU0laRV07CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IElOSVRJQUxfQlVDS0VUX1NJWkU7IGkrKykgeworICAgICAgICAgICAgICAgIG1Qb2ludGVyQ29vcmRzW2ldID0gbmV3IE1vdGlvbkV2ZW50LlBvaW50ZXJDb29yZHMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgeworICAgICAgICAgICAgbVRhcmdldHMuY2xlYXIoKTsKKyAgICAgICAgICAgIGZpbmFsIGludCBjb3VudCA9IG1VbmlxdWVUYXJnZXRDb3VudDsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIG1VbmlxdWVUYXJnZXRzW2ldLnJlY3ljbGUoKTsKKyAgICAgICAgICAgICAgICBtVW5pcXVlVGFyZ2V0c1tpXSA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtVW5pcXVlVGFyZ2V0Q291bnQgPSAwOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgYWRkKGludCBwb2ludGVySWQsIFZpZXcgdGFyZ2V0LCBsb25nIGRvd25UaW1lKSB7CisgICAgICAgICAgICBtVGFyZ2V0cy5wdXQocG9pbnRlcklkLCB0YXJnZXQpOworCisgICAgICAgICAgICBmaW5hbCBpbnQgdW5pcXVlQ291bnQgPSBtVW5pcXVlVGFyZ2V0Q291bnQ7CisgICAgICAgICAgICBib29sZWFuIGFkZFVuaXF1ZSA9IHRydWU7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHVuaXF1ZUNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAobVVuaXF1ZVRhcmdldHNbaV0udmlldyA9PSB0YXJnZXQpIHsKKyAgICAgICAgICAgICAgICAgICAgYWRkVW5pcXVlID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGFkZFVuaXF1ZSkgeworICAgICAgICAgICAgICAgIGlmIChtVW5pcXVlVGFyZ2V0cy5sZW5ndGggPT0gdW5pcXVlQ291bnQpIHsKKyAgICAgICAgICAgICAgICAgICAgVGFyZ2V0SW5mb1tdIG5ld1RhcmdldHMgPQorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFRhcmdldEluZm9bdW5pcXVlQ291bnQgKyBJTklUSUFMX1VOSVFVRV9NT1RJT05fVEFSR0VUU19TSVpFXTsKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShtVW5pcXVlVGFyZ2V0cywgMCwgbmV3VGFyZ2V0cywgMCwgdW5pcXVlQ291bnQpOworICAgICAgICAgICAgICAgICAgICBtVW5pcXVlVGFyZ2V0cyA9IG5ld1RhcmdldHM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1VbmlxdWVUYXJnZXRzW3VuaXF1ZUNvdW50XSA9IFRhcmdldEluZm8ub2J0YWluKHRhcmdldCwgZG93blRpbWUpOworICAgICAgICAgICAgICAgIG1VbmlxdWVUYXJnZXRDb3VudCsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBnZXRJZENvdW50KCkgeworICAgICAgICAgICAgcmV0dXJuIG1UYXJnZXRzLnNpemUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0VW5pcXVlVGFyZ2V0Q291bnQoKSB7CisgICAgICAgICAgICByZXR1cm4gbVVuaXF1ZVRhcmdldENvdW50OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRhcmdldEluZm8gZ2V0VW5pcXVlVGFyZ2V0QXQoaW50IGluZGV4KSB7CisgICAgICAgICAgICByZXR1cm4gbVVuaXF1ZVRhcmdldHNbaW5kZXhdOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFZpZXcgZ2V0KGludCBpZCkgeworICAgICAgICAgICAgcmV0dXJuIG1UYXJnZXRzLmdldChpZCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGluZGV4T2ZJZChpbnQgaWQpIHsKKyAgICAgICAgICAgIHJldHVybiBtVGFyZ2V0cy5pbmRleE9mS2V5KGlkKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgaW5kZXhPZlRhcmdldChWaWV3IHRhcmdldCkgeworICAgICAgICAgICAgcmV0dXJuIG1UYXJnZXRzLmluZGV4T2ZWYWx1ZSh0YXJnZXQpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBpZEF0KGludCBpbmRleCkgeworICAgICAgICAgICAgcmV0dXJuIG1UYXJnZXRzLmtleUF0KGluZGV4KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBWaWV3IHRhcmdldEF0KGludCBpbmRleCkgeworICAgICAgICAgICAgcmV0dXJuIG1UYXJnZXRzLnZhbHVlQXQoaW5kZXgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRhcmdldEluZm8gZ2V0UHJpbWFyeVRhcmdldCgpIHsKKyAgICAgICAgICAgIGlmICghaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgLy8gRmluZCB0aGUgbG9uZ2VzdC1saXZlZCB0YXJnZXQKKyAgICAgICAgICAgICAgICBsb25nIGZpcnN0VGltZSA9IExvbmcuTUFYX1ZBTFVFOworICAgICAgICAgICAgICAgIGludCBmaXJzdEluZGV4ID0gMDsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgdW5pcXVlQ291bnQgPSBtVW5pcXVlVGFyZ2V0Q291bnQ7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB1bmlxdWVDb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIFRhcmdldEluZm8gaW5mbyA9IG1VbmlxdWVUYXJnZXRzW2ldOworICAgICAgICAgICAgICAgICAgICBpZiAoaW5mby5kb3duVGltZSA8IGZpcnN0VGltZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RUaW1lID0gaW5mby5kb3duVGltZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0SW5kZXggPSBpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBtVW5pcXVlVGFyZ2V0c1tmaXJzdEluZGV4XTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzVGFyZ2V0KFZpZXcgdGFyZ2V0KSB7CisgICAgICAgICAgICBmaW5hbCBUYXJnZXRJbmZvW10gdW5pcXVlID0gbVVuaXF1ZVRhcmdldHM7CisgICAgICAgICAgICBmaW5hbCBpbnQgdW5pcXVlQ291bnQgPSBtVW5pcXVlVGFyZ2V0Q291bnQ7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHVuaXF1ZUNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAodW5pcXVlW2ldLnZpZXcgPT0gdGFyZ2V0KSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7CisgICAgICAgICAgICByZXR1cm4gbVVuaXF1ZVRhcmdldENvdW50ID09IDA7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmVCeUlkKGludCBpZCkgeworICAgICAgICAgICAgZmluYWwgaW50IGluZGV4ID0gbVRhcmdldHMuaW5kZXhPZktleShpZCk7CisgICAgICAgICAgICByZW1vdmVBdChpbmRleCk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZVZpZXcoVmlldyB2aWV3KSB7CisgICAgICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgICAgICB3aGlsZSAoaSA8IG1UYXJnZXRzLnNpemUoKSkgeworICAgICAgICAgICAgICAgIGlmIChtVGFyZ2V0cy52YWx1ZUF0KGkpID09IHZpZXcpIHsKKyAgICAgICAgICAgICAgICAgICAgbVRhcmdldHMucmVtb3ZlQXQoaSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlbW92ZVVuaXF1ZSh2aWV3KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZUF0KGludCBpbmRleCkgeworICAgICAgICAgICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBtVGFyZ2V0cy5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZpbmFsIFZpZXcgcmVtb3ZlVmlldyA9IG1UYXJnZXRzLnZhbHVlQXQoaW5kZXgpOworICAgICAgICAgICAgbVRhcmdldHMucmVtb3ZlQXQoaW5kZXgpOworICAgICAgICAgICAgaWYgKG1UYXJnZXRzLmluZGV4T2ZWYWx1ZShyZW1vdmVWaWV3KSA8IDApIHsKKyAgICAgICAgICAgICAgICByZW1vdmVVbmlxdWUocmVtb3ZlVmlldyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgcmVtb3ZlVW5pcXVlKFZpZXcgcmVtb3ZlVmlldykgeworICAgICAgICAgICAgVGFyZ2V0SW5mb1tdIHVuaXF1ZSA9IG1VbmlxdWVUYXJnZXRzOworICAgICAgICAgICAgaW50IHVuaXF1ZUNvdW50ID0gbVVuaXF1ZVRhcmdldENvdW50OworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB1bmlxdWVDb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKHVuaXF1ZVtpXS52aWV3ID09IHJlbW92ZVZpZXcpIHsKKyAgICAgICAgICAgICAgICAgICAgdW5pcXVlW2ldLnJlY3ljbGUoKTsKKyAgICAgICAgICAgICAgICAgICAgdW5pcXVlW2ldID0gdW5pcXVlWy0tdW5pcXVlQ291bnRdOworICAgICAgICAgICAgICAgICAgICB1bmlxdWVbdW5pcXVlQ291bnRdID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtVW5pcXVlVGFyZ2V0Q291bnQgPSB1bmlxdWVDb3VudDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm4gYSBuZXcgKG9idGFpbigpZWQpIE1vdGlvbkV2ZW50IGNvbnRhaW5pbmcgb25seSBkYXRhIGZvciBwb2ludGVycyB0aGF0IHNob3VsZAorICAgICAgICAgKiBiZSBkaXNwYXRjaGVkIHRvIGNoaWxkLiBEb24ndCBmb3JnZXQgdG8gcmVjeWNsZSBpdCEKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBNb3Rpb25FdmVudCBmaWx0ZXJNb3Rpb25FdmVudEZvckNoaWxkKE1vdGlvbkV2ZW50IGV2LCBWaWV3IGNoaWxkLCBsb25nIGRvd25UaW1lKSB7CisgICAgICAgICAgICBpbnQgYWN0aW9uID0gZXYuZ2V0QWN0aW9uKCk7CisgICAgICAgICAgICBmaW5hbCBpbnQgbWFza2VkQWN0aW9uID0gYWN0aW9uICYgTW90aW9uRXZlbnQuQUNUSU9OX01BU0s7CisKKyAgICAgICAgICAgIC8vIE9ubHkgc2VuZCBwb2ludGVyIHVwIGV2ZW50cyBpZiB0aGlzIGNoaWxkIHdhcyB0aGUgdGFyZ2V0LiBEcm9wIGl0IG90aGVyd2lzZS4KKyAgICAgICAgICAgIGlmIChtYXNrZWRBY3Rpb24gPT0gTW90aW9uRXZlbnQuQUNUSU9OX1BPSU5URVJfVVAgJiYKKyAgICAgICAgICAgICAgICAgICAgZ2V0KGV2LmdldFBvaW50ZXJJZChldi5nZXRBY3Rpb25JbmRleCgpKSkgIT0gY2hpbGQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50IHBvaW50ZXJDb3VudCA9IDA7CisgICAgICAgICAgICBmaW5hbCBpbnQgaWRDb3VudCA9IGdldElkQ291bnQoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaWRDb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKHRhcmdldEF0KGkpID09IGNoaWxkKSB7CisgICAgICAgICAgICAgICAgICAgIHBvaW50ZXJDb3VudCsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50IGFjdGlvbklkID0gLTE7CisgICAgICAgICAgICBib29sZWFuIG5lZWRzTmV3SW5kZXggPSBmYWxzZTsgLy8gVHJ1ZSBpZiB3ZSBzaG91bGQgZmlsbCBpbiB0aGUgYWN0aW9uJ3MgbWFza2VkIGluZGV4CisKKyAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgYSBkb3duIGV2ZW50LCBpdCB3YXNuJ3QgY291bnRlZCBhYm92ZS4KKyAgICAgICAgICAgIGlmIChtYXNrZWRBY3Rpb24gPT0gTW90aW9uRXZlbnQuQUNUSU9OX0RPV04pIHsKKyAgICAgICAgICAgICAgICBwb2ludGVyQ291bnQrKzsKKyAgICAgICAgICAgICAgICBhY3Rpb25JZCA9IGV2LmdldFBvaW50ZXJJZCgwKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobWFza2VkQWN0aW9uID09IE1vdGlvbkV2ZW50LkFDVElPTl9QT0lOVEVSX0RPV04pIHsKKyAgICAgICAgICAgICAgICBwb2ludGVyQ291bnQrKzsKKworICAgICAgICAgICAgICAgIGFjdGlvbklkID0gZXYuZ2V0UG9pbnRlcklkKGV2LmdldEFjdGlvbkluZGV4KCkpOworCisgICAgICAgICAgICAgICAgaWYgKGluZGV4T2ZUYXJnZXQoY2hpbGQpIDwgMCkgeworICAgICAgICAgICAgICAgICAgICAvLyBUaGUgbmV3IGFjdGlvbiBzaG91bGQgYmUgQUNUSU9OX0RPV04gaWYgdGhpcyBjaGlsZCBpc24ndCBjdXJyZW50bHkgZ2V0dGluZworICAgICAgICAgICAgICAgICAgICAvLyBhbnkgZXZlbnRzLgorICAgICAgICAgICAgICAgICAgICBhY3Rpb24gPSBNb3Rpb25FdmVudC5BQ1RJT05fRE9XTjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBGaWxsIGluIHRoZSBpbmRleCBwb3J0aW9uIG9mIHRoZSBhY3Rpb24gbGF0ZXIuCisgICAgICAgICAgICAgICAgICAgIG5lZWRzTmV3SW5kZXggPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAobWFza2VkQWN0aW9uID09IE1vdGlvbkV2ZW50LkFDVElPTl9QT0lOVEVSX1VQKSB7CisgICAgICAgICAgICAgICAgYWN0aW9uSWQgPSBldi5nZXRQb2ludGVySWQoZXYuZ2V0QWN0aW9uSW5kZXgoKSk7CisgICAgICAgICAgICAgICAgaWYgKHBvaW50ZXJDb3VudCA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBuZXcgYWN0aW9uIHNob3VsZCBiZSBBQ1RJT05fVVAgaWYgdGhlcmUncyBvbmx5IG9uZSBwb2ludGVyIGxlZnQgZm9yCisgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgdGFyZ2V0LgorICAgICAgICAgICAgICAgICAgICBhY3Rpb24gPSBNb3Rpb25FdmVudC5BQ1RJT05fVVA7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gRmlsbCBpbiB0aGUgaW5kZXggcG9ydGlvbiBvZiB0aGUgYWN0aW9uIGxhdGVyLgorICAgICAgICAgICAgICAgICAgICBuZWVkc05ld0luZGV4ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChwb2ludGVyQ291bnQgPT0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBGaWxsIHRoZSBidWNrZXRzIHdpdGggcG9pbnRlciBkYXRhIQorICAgICAgICAgICAgZmluYWwgaW50IGV2ZW50UG9pbnRlckNvdW50ID0gZXYuZ2V0UG9pbnRlckNvdW50KCk7CisgICAgICAgICAgICBpbnQgYnVja2V0SW5kZXggPSAwOworICAgICAgICAgICAgaW50IG5ld0FjdGlvbkluZGV4ID0gLTE7CisgICAgICAgICAgICBmb3IgKGludCBldnAgPSAwOyBldnAgPCBldmVudFBvaW50ZXJDb3VudDsgZXZwKyspIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgaWQgPSBldi5nZXRQb2ludGVySWQoZXZwKTsKKworICAgICAgICAgICAgICAgIC8vIEFkZCB0aGlzIHBvaW50ZXIgdG8gdGhlIGJ1Y2tldCBpZiBpdCBpcyBuZXcgb3IgdGFyZ2V0ZWQgYXQgY2hpbGQKKyAgICAgICAgICAgICAgICBpZiAoaWQgPT0gYWN0aW9uSWQgfHwgZ2V0KGlkKSA9PSBjaGlsZCkgeworICAgICAgICAgICAgICAgICAgICAvLyBFeHBhbmQgc2NyYXRjaCBhcnJheXMgaWYgbmVlZGVkCisgICAgICAgICAgICAgICAgICAgIGlmIChtUG9pbnRlckNvb3Jkcy5sZW5ndGggPD0gYnVja2V0SW5kZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludFtdIHBvaW50ZXJJZHMgPSBuZXcgaW50W3BvaW50ZXJDb3VudF07CisgICAgICAgICAgICAgICAgICAgICAgICBNb3Rpb25FdmVudC5Qb2ludGVyQ29vcmRzW10gcG9pbnRlckNvb3JkcyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBNb3Rpb25FdmVudC5Qb2ludGVyQ29vcmRzW3BvaW50ZXJDb3VudF07CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gbVBvaW50ZXJDb29yZHMubGVuZ3RoOyBpIDwgcG9pbnRlckNvb3Jkcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXJDb29yZHNbaV0gPSBuZXcgTW90aW9uRXZlbnQuUG9pbnRlckNvb3JkcygpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KG1Qb2ludGVyQ29vcmRzLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyQ29vcmRzLCAwLCBtUG9pbnRlckNvb3Jkcy5sZW5ndGgpOworICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShtUG9pbnRlcklkcywgMCwgcG9pbnRlcklkcywgMCwgbVBvaW50ZXJJZHMubGVuZ3RoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgbVBvaW50ZXJDb29yZHMgPSBwb2ludGVyQ29vcmRzOworICAgICAgICAgICAgICAgICAgICAgICAgbVBvaW50ZXJJZHMgPSBwb2ludGVySWRzOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgbVBvaW50ZXJJZHNbYnVja2V0SW5kZXhdID0gaWQ7CisgICAgICAgICAgICAgICAgICAgIGV2LmdldFBvaW50ZXJDb29yZHMoZXZwLCBtUG9pbnRlckNvb3Jkc1tidWNrZXRJbmRleF0pOworCisgICAgICAgICAgICAgICAgICAgIGlmIChuZWVkc05ld0luZGV4ICYmIGlkID09IGFjdGlvbklkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdBY3Rpb25JbmRleCA9IGJ1Y2tldEluZGV4OworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgYnVja2V0SW5kZXgrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEVuY29kZSB0aGUgbmV3IGFjdGlvbiBpbmRleCBpZiB3ZSBoYXZlIG9uZQorICAgICAgICAgICAgaWYgKG5ld0FjdGlvbkluZGV4ID49IDApIHsKKyAgICAgICAgICAgICAgICBhY3Rpb24gPSAoYWN0aW9uICYgTW90aW9uRXZlbnQuQUNUSU9OX01BU0spIHwKKyAgICAgICAgICAgICAgICAgICAgICAgIChuZXdBY3Rpb25JbmRleCA8PCBNb3Rpb25FdmVudC5BQ1RJT05fUE9JTlRFUl9JTkRFWF9TSElGVCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIE1vdGlvbkV2ZW50IHJlc3VsdCA9IE1vdGlvbkV2ZW50Lm9idGFpbihkb3duVGltZSwgZXYuZ2V0RXZlbnRUaW1lKCksCisgICAgICAgICAgICAgICAgICAgIGFjdGlvbiwgcG9pbnRlckNvdW50LCBtUG9pbnRlcklkcywgbVBvaW50ZXJDb29yZHMsIGV2LmdldE1ldGFTdGF0ZSgpLAorICAgICAgICAgICAgICAgICAgICBldi5nZXRYUHJlY2lzaW9uKCksIGV2LmdldFlQcmVjaXNpb24oKSwgZXYuZ2V0RGV2aWNlSWQoKSwgZXYuZ2V0RWRnZUZsYWdzKCksCisgICAgICAgICAgICAgICAgICAgIGV2LmdldFNvdXJjZSgpKTsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKworICAgICAgICBzdGF0aWMgY2xhc3MgVGFyZ2V0SW5mbyB7CisgICAgICAgICAgICBwdWJsaWMgVmlldyB2aWV3OworICAgICAgICAgICAgcHVibGljIGxvbmcgZG93blRpbWU7CisKKyAgICAgICAgICAgIHByaXZhdGUgVGFyZ2V0SW5mbyBtTmV4dFJlY3ljbGVkOworCisgICAgICAgICAgICBwcml2YXRlIHN0YXRpYyBUYXJnZXRJbmZvIHNSZWN5Y2xlQmluOworICAgICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgaW50IHNSZWN5Y2xlZENvdW50OworCisgICAgICAgICAgICBwcml2YXRlIHN0YXRpYyBpbnQgTUFYX1JFQ1lDTEVEID0gMTU7CisKKyAgICAgICAgICAgIHByaXZhdGUgVGFyZ2V0SW5mbygpIHsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHN0YXRpYyBUYXJnZXRJbmZvIG9idGFpbihWaWV3IHYsIGxvbmcgdGltZSkgeworICAgICAgICAgICAgICAgIFRhcmdldEluZm8gaW5mbzsKKyAgICAgICAgICAgICAgICBpZiAoc1JlY3ljbGVCaW4gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBpbmZvID0gbmV3IFRhcmdldEluZm8oKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpbmZvID0gc1JlY3ljbGVCaW47CisgICAgICAgICAgICAgICAgICAgIHNSZWN5Y2xlQmluID0gaW5mby5tTmV4dFJlY3ljbGVkOworICAgICAgICAgICAgICAgICAgICBzUmVjeWNsZWRDb3VudC0tOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbmZvLnZpZXcgPSB2OworICAgICAgICAgICAgICAgIGluZm8uZG93blRpbWUgPSB0aW1lOworICAgICAgICAgICAgICAgIHJldHVybiBpbmZvOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCByZWN5Y2xlKCkgeworICAgICAgICAgICAgICAgIGlmIChzUmVjeWNsZWRDb3VudCA+PSBNQVhfUkVDWUNMRUQpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtTmV4dFJlY3ljbGVkID0gc1JlY3ljbGVCaW47CisgICAgICAgICAgICAgICAgc1JlY3ljbGVCaW4gPSB0aGlzOworICAgICAgICAgICAgICAgIHNSZWN5Y2xlZENvdW50Kys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1ZpZXdQYXJlbnQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmlld1BhcmVudC5qYXZhCmluZGV4IGI0NTZjNWQuLmQ3ZDRjM2YgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmlld1BhcmVudC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmlld1BhcmVudC5qYXZhCkBAIC0xNjIsNiArMTYyLDIwIEBACiAgICAgcHVibGljIHZvaWQgY3JlYXRlQ29udGV4dE1lbnUoQ29udGV4dE1lbnUgbWVudSk7CiAKICAgICAvKioKKyAgICAgKiBTdGFydCBhbiBhY3Rpb24gbW9kZSBmb3IgdGhlIHNwZWNpZmllZCB2aWV3LgorICAgICAqIDxwPgorICAgICAqIEluIG1vc3QgY2FzZXMsIGEgc3ViY2xhc3MgZG9lcyBub3QgbmVlZCB0byBvdmVycmlkZSB0aGlzLiBIb3dldmVyLCBpZiB0aGUKKyAgICAgKiBzdWJjbGFzcyBpcyBhZGRlZCBkaXJlY3RseSB0byB0aGUgd2luZG93IG1hbmFnZXIgKGZvciBleGFtcGxlLAorICAgICAqIHtAbGluayBWaWV3TWFuYWdlciNhZGRWaWV3KFZpZXcsIGFuZHJvaWQudmlldy5WaWV3R3JvdXAuTGF5b3V0UGFyYW1zKX0pCisgICAgICogdGhlbiBpdCBzaG91bGQgb3ZlcnJpZGUgdGhpcyBhbmQgc3RhcnQgdGhlIGFjdGlvbiBtb2RlLgorICAgICAqCisgICAgICogQHBhcmFtIG9yaWdpbmFsVmlldyBUaGUgc291cmNlIHZpZXcgd2hlcmUgdGhlIGFjdGlvbiBtb2RlIHdhcyBmaXJzdCBpbnZva2VkCisgICAgICogQHBhcmFtIGNhbGxiYWNrIFRoZSBjYWxsYmFjayB0aGF0IHdpbGwgaGFuZGxlIGxpZmVjeWNsZSBldmVudHMgZm9yIHRoZSBhY3Rpb24gbW9kZQorICAgICAqIEByZXR1cm4gVGhlIG5ldyBhY3Rpb24gbW9kZSBpZiBpdCB3YXMgc3RhcnRlZCwgbnVsbCBvdGhlcndpc2UKKyAgICAgKi8KKyAgICBwdWJsaWMgQWN0aW9uTW9kZSBzdGFydEFjdGlvbk1vZGVGb3JDaGlsZChWaWV3IG9yaWdpbmFsVmlldywgQWN0aW9uTW9kZS5DYWxsYmFjayBjYWxsYmFjayk7CisKKyAgICAvKioKICAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgb24gdGhlIHBhcmVudCB3aGVuIGEgY2hpbGQncyBkcmF3YWJsZSBzdGF0ZQogICAgICAqIGhhcyBjaGFuZ2VkLgogICAgICAqCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1ZpZXdSb290LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1ZpZXdSb290LmphdmEKaW5kZXggNTdjOTA1NS4uNTk5OWFiYSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9WaWV3Um9vdC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmlld1Jvb3QuamF2YQpAQCAtNTYsMTAgKzU2LDYgQEAKIGltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogCi1pbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLio7Ci1pbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXMuKjsKLWltcG9ydCBzdGF0aWMgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXMuR0wxMC4qOwotCiAvKioKICAqIFRoZSB0b3Agb2YgYSB2aWV3IGhpZXJhcmNoeSwgaW1wbGVtZW50aW5nIHRoZSBuZWVkZWQgcHJvdG9jb2wgYmV0d2VlbiBWaWV3CiAgKiBhbmQgdGhlIFdpbmRvd01hbmFnZXIuICBUaGlzIGlzIGZvciB0aGUgbW9zdCBwYXJ0IGFuIGludGVybmFsIGltcGxlbWVudGF0aW9uCkBAIC02NywxNCArNjMsMTIgQEAKICAqCiAgKiB7QGhpZGV9CiAgKi8KLUBTdXBwcmVzc1dhcm5pbmdzKHsiRW1wdHlDYXRjaEJsb2NrIn0pCi1wdWJsaWMgZmluYWwgY2xhc3MgVmlld1Jvb3QgZXh0ZW5kcyBIYW5kbGVyIGltcGxlbWVudHMgVmlld1BhcmVudCwKLSAgICAgICAgVmlldy5BdHRhY2hJbmZvLkNhbGxiYWNrcyB7CitAU3VwcHJlc3NXYXJuaW5ncyh7IkVtcHR5Q2F0Y2hCbG9jayIsICJQb2ludGxlc3NCb29sZWFuRXhwcmVzc2lvbiJ9KQorcHVibGljIGZpbmFsIGNsYXNzIFZpZXdSb290IGV4dGVuZHMgSGFuZGxlciBpbXBsZW1lbnRzIFZpZXdQYXJlbnQsIFZpZXcuQXR0YWNoSW5mby5DYWxsYmFja3MgewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiVmlld1Jvb3QiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREJHID0gZmFsc2U7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBTSE9XX0ZQUyA9IGZhbHNlOwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsiQ29uc3RhbnRDb25kaXRpb25hbEV4cHJlc3Npb24ifSkKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIExPQ0FMX0xPR1YgPSBmYWxzZSA/IENvbmZpZy5MT0dEIDogQ29uZmlnLkxPR1Y7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBMT0NBTF9MT0dWID0gZmFsc2U7CiAgICAgLyoqIEBub2luc3BlY3Rpb24gUG9pbnRsZXNzQm9vbGVhbkV4cHJlc3Npb24qLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUdfRFJBVyA9IGZhbHNlIHx8IExPQ0FMX0xPR1Y7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVR19MQVlPVVQgPSBmYWxzZSB8fCBMT0NBTF9MT0dWOwpAQCAtMjA0LDE0ICsxOTgsNyBAQAogICAgIGludCBtQ3VyU2Nyb2xsWTsKICAgICBTY3JvbGxlciBtU2Nyb2xsZXI7CiAKLSAgICBFR0wxMCBtRWdsOwotICAgIEVHTERpc3BsYXkgbUVnbERpc3BsYXk7Ci0gICAgRUdMQ29udGV4dCBtRWdsQ29udGV4dDsKLSAgICBFR0xTdXJmYWNlIG1FZ2xTdXJmYWNlOwotICAgIEdMMTEgbUdMOwotICAgIENhbnZhcyBtR2xDYW52YXM7Ci0gICAgYm9vbGVhbiBtVXNlR0w7Ci0gICAgYm9vbGVhbiBtR2xXYW50ZWQ7CisgICAgSGFyZHdhcmVSZW5kZXJlciBtSHdSZW5kZXJlcjsKIAogICAgIGZpbmFsIFZpZXdDb25maWd1cmF0aW9uIG1WaWV3Q29uZmlndXJhdGlvbjsKIApAQCAtMjQxLDggKzIyOCwxMCBAQAogICAgIHB1YmxpYyBWaWV3Um9vdChDb250ZXh0IGNvbnRleHQpIHsKICAgICAgICAgc3VwZXIoKTsKIAotICAgICAgICBpZiAoTUVBU1VSRV9MQVRFTkNZICYmIGx0ID09IG51bGwpIHsKLSAgICAgICAgICAgIGx0ID0gbmV3IExhdGVuY3lUaW1lcigxMDAsIDEwMDApOworICAgICAgICBpZiAoTUVBU1VSRV9MQVRFTkNZKSB7CisgICAgICAgICAgICBpZiAobHQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGx0ID0gbmV3IExhdGVuY3lUaW1lcigxMDAsIDEwMDApOworICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgLy8gRm9yIGRlYnVnIG9ubHkKQEAgLTI2Miw3ICsyNTEsNyBAQAogICAgICAgICBtVGVtcFJlY3QgPSBuZXcgUmVjdCgpOwogICAgICAgICBtVmlzUmVjdCA9IG5ldyBSZWN0KCk7CiAgICAgICAgIG1XaW5GcmFtZSA9IG5ldyBSZWN0KCk7Ci0gICAgICAgIG1XaW5kb3cgPSBuZXcgVyh0aGlzLCBjb250ZXh0KTsKKyAgICAgICAgbVdpbmRvdyA9IG5ldyBXKHRoaXMpOwogICAgICAgICBtSW5wdXRNZXRob2RDYWxsYmFjayA9IG5ldyBJbnB1dE1ldGhvZENhbGxiYWNrKHRoaXMpOwogICAgICAgICBtVmlld1Zpc2liaWxpdHkgPSBWaWV3LkdPTkU7CiAgICAgICAgIG1UcmFuc3BhcmVudFJlZ2lvbiA9IG5ldyBSZWdpb24oKTsKQEAgLTMzMCwxMjIgKzMxOSwxOCBAQAogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVHTCgpIHsKLSAgICAgICAgaW5pdGlhbGl6ZUdMSW5uZXIoKTsKLSAgICAgICAgaW50IGVyciA9IG1FZ2wuZWdsR2V0RXJyb3IoKTsKLSAgICAgICAgaWYgKGVyciAhPSBFR0wxMC5FR0xfU1VDQ0VTUykgewotICAgICAgICAgICAgLy8gZ2l2ZS11cCBvbiB1c2luZyBHTAotICAgICAgICAgICAgZGVzdHJveUdMKCk7Ci0gICAgICAgICAgICBtR2xXYW50ZWQgPSBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBpbml0aWFsaXplR0xJbm5lcigpIHsKLSAgICAgICAgZmluYWwgRUdMMTAgZWdsID0gKEVHTDEwKSBFR0xDb250ZXh0LmdldEVHTCgpOwotICAgICAgICBtRWdsID0gZWdsOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIEdldCB0byB0aGUgZGVmYXVsdCBkaXNwbGF5LgotICAgICAgICAgKi8KLSAgICAgICAgZmluYWwgRUdMRGlzcGxheSBlZ2xEaXNwbGF5ID0gZWdsLmVnbEdldERpc3BsYXkoRUdMMTAuRUdMX0RFRkFVTFRfRElTUExBWSk7Ci0gICAgICAgIG1FZ2xEaXNwbGF5ID0gZWdsRGlzcGxheTsKLQotICAgICAgICAvKgotICAgICAgICAgKiBXZSBjYW4gbm93IGluaXRpYWxpemUgRUdMIGZvciB0aGF0IGRpc3BsYXkKLSAgICAgICAgICovCi0gICAgICAgIGludFtdIHZlcnNpb24gPSBuZXcgaW50WzJdOwotICAgICAgICBlZ2wuZWdsSW5pdGlhbGl6ZShlZ2xEaXNwbGF5LCB2ZXJzaW9uKTsKLQotICAgICAgICAvKgotICAgICAgICAgKiBTcGVjaWZ5IGEgY29uZmlndXJhdGlvbiBmb3Igb3VyIG9wZW5nbCBzZXNzaW9uCi0gICAgICAgICAqIGFuZCBncmFiIHRoZSBmaXJzdCBjb25maWd1cmF0aW9uIHRoYXQgbWF0Y2hlcyBpcwotICAgICAgICAgKi8KLSAgICAgICAgZmluYWwgaW50W10gY29uZmlnU3BlYyA9IHsKLSAgICAgICAgICAgICAgICBFR0wxMC5FR0xfUkVEX1NJWkUsICAgICAgNSwKLSAgICAgICAgICAgICAgICBFR0wxMC5FR0xfR1JFRU5fU0laRSwgICAgNiwKLSAgICAgICAgICAgICAgICBFR0wxMC5FR0xfQkxVRV9TSVpFLCAgICAgNSwKLSAgICAgICAgICAgICAgICBFR0wxMC5FR0xfREVQVEhfU0laRSwgICAgMCwKLSAgICAgICAgICAgICAgICBFR0wxMC5FR0xfTk9ORQotICAgICAgICB9OwotICAgICAgICBmaW5hbCBFR0xDb25maWdbXSBjb25maWdzID0gbmV3IEVHTENvbmZpZ1sxXTsKLSAgICAgICAgZmluYWwgaW50W10gbnVtX2NvbmZpZyA9IG5ldyBpbnRbMV07Ci0gICAgICAgIGVnbC5lZ2xDaG9vc2VDb25maWcoZWdsRGlzcGxheSwgY29uZmlnU3BlYywgY29uZmlncywgMSwgbnVtX2NvbmZpZyk7Ci0gICAgICAgIGZpbmFsIEVHTENvbmZpZyBjb25maWcgPSBjb25maWdzWzBdOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIENyZWF0ZSBhbiBPcGVuR0wgRVMgY29udGV4dC4gVGhpcyBtdXN0IGJlIGRvbmUgb25seSBvbmNlLCBhbgotICAgICAgICAgKiBPcGVuR0wgY29udGV4dCBpcyBhIHNvbWV3aGF0IGhlYXZ5IG9iamVjdC4KLSAgICAgICAgICovCi0gICAgICAgIGZpbmFsIEVHTENvbnRleHQgY29udGV4dCA9IGVnbC5lZ2xDcmVhdGVDb250ZXh0KGVnbERpc3BsYXksIGNvbmZpZywKLSAgICAgICAgICAgICAgICBFR0wxMC5FR0xfTk9fQ09OVEVYVCwgbnVsbCk7Ci0gICAgICAgIG1FZ2xDb250ZXh0ID0gY29udGV4dDsKLQotICAgICAgICAvKgotICAgICAgICAgKiBDcmVhdGUgYW4gRUdMIHN1cmZhY2Ugd2UgY2FuIHJlbmRlciBpbnRvLgotICAgICAgICAgKi8KLSAgICAgICAgZmluYWwgRUdMU3VyZmFjZSBzdXJmYWNlID0gZWdsLmVnbENyZWF0ZVdpbmRvd1N1cmZhY2UoZWdsRGlzcGxheSwgY29uZmlnLCBtSG9sZGVyLCBudWxsKTsKLSAgICAgICAgbUVnbFN1cmZhY2UgPSBzdXJmYWNlOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIEJlZm9yZSB3ZSBjYW4gaXNzdWUgR0wgY29tbWFuZHMsIHdlIG5lZWQgdG8gbWFrZSBzdXJlCi0gICAgICAgICAqIHRoZSBjb250ZXh0IGlzIGN1cnJlbnQgYW5kIGJvdW5kIHRvIGEgc3VyZmFjZS4KLSAgICAgICAgICovCi0gICAgICAgIGVnbC5lZ2xNYWtlQ3VycmVudChlZ2xEaXNwbGF5LCBzdXJmYWNlLCBzdXJmYWNlLCBjb250ZXh0KTsKLQotICAgICAgICAvKgotICAgICAgICAgKiBHZXQgdG8gdGhlIGFwcHJvcHJpYXRlIEdMIGludGVyZmFjZS4KLSAgICAgICAgICogVGhpcyBpcyBzaW1wbHkgZG9uZSBieSBjYXN0aW5nIHRoZSBHTCBjb250ZXh0IHRvIGVpdGhlcgotICAgICAgICAgKiBHTDEwIG9yIEdMMTEuCi0gICAgICAgICAqLwotICAgICAgICBmaW5hbCBHTDExIGdsID0gKEdMMTEpIGNvbnRleHQuZ2V0R0woKTsKLSAgICAgICAgbUdMID0gZ2w7Ci0gICAgICAgIG1HbENhbnZhcyA9IG5ldyBDYW52YXMoZ2wpOwotICAgICAgICBtVXNlR0wgPSB0cnVlOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBkZXN0cm95R0woKSB7Ci0gICAgICAgIC8vIGluZm9ybSBza2lhIHRoYXQgdGhlIGNvbnRleHQgaXMgZ29uZQotICAgICAgICBuYXRpdmVBYmFuZG9uR2xDYWNoZXMoKTsKLQotICAgICAgICBtRWdsLmVnbE1ha2VDdXJyZW50KG1FZ2xEaXNwbGF5LCBFR0wxMC5FR0xfTk9fU1VSRkFDRSwKLSAgICAgICAgICAgICAgICBFR0wxMC5FR0xfTk9fU1VSRkFDRSwgRUdMMTAuRUdMX05PX0NPTlRFWFQpOwotICAgICAgICBtRWdsLmVnbERlc3Ryb3lDb250ZXh0KG1FZ2xEaXNwbGF5LCBtRWdsQ29udGV4dCk7Ci0gICAgICAgIG1FZ2wuZWdsRGVzdHJveVN1cmZhY2UobUVnbERpc3BsYXksIG1FZ2xTdXJmYWNlKTsKLSAgICAgICAgbUVnbC5lZ2xUZXJtaW5hdGUobUVnbERpc3BsYXkpOwotICAgICAgICBtRWdsQ29udGV4dCA9IG51bGw7Ci0gICAgICAgIG1FZ2xTdXJmYWNlID0gbnVsbDsKLSAgICAgICAgbUVnbERpc3BsYXkgPSBudWxsOwotICAgICAgICBtRWdsID0gbnVsbDsKLSAgICAgICAgbUdsQ2FudmFzID0gbnVsbDsKLSAgICAgICAgbUdMID0gbnVsbDsKLSAgICAgICAgbVVzZUdMID0gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrRWdsRXJyb3JzKCkgewotICAgICAgICBpZiAobVVzZUdMKSB7Ci0gICAgICAgICAgICBpbnQgZXJyID0gbUVnbC5lZ2xHZXRFcnJvcigpOwotICAgICAgICAgICAgaWYgKGVyciAhPSBFR0wxMC5FR0xfU1VDQ0VTUykgewotICAgICAgICAgICAgICAgIC8vIHNvbWV0aGluZyBiYWQgaGFzIGhhcHBlbmVkIHJldmVydCB0bwotICAgICAgICAgICAgICAgIC8vIG5vcm1hbCByZW5kZXJpbmcuCi0gICAgICAgICAgICAgICAgZGVzdHJveUdMKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGVyciAhPSBFR0wxMS5FR0xfQ09OVEVYVF9MT1NUKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHdlJ2xsIHRyeSBhZ2FpbiBpZiBpdCB3YXMgY29udGV4dCBsb3N0Ci0gICAgICAgICAgICAgICAgICAgIG1HbFdhbnRlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQogICAgIC8qKgogICAgICAqIFdlIGhhdmUgb25lIGNoaWxkCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VmlldyhWaWV3IHZpZXcsIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zIGF0dHJzLAotICAgICAgICAgICAgVmlldyBwYW5lbFBhcmVudFZpZXcpIHsKKyAgICBwdWJsaWMgdm9pZCBzZXRWaWV3KFZpZXcgdmlldywgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMgYXR0cnMsIFZpZXcgcGFuZWxQYXJlbnRWaWV3KSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewogICAgICAgICAgICAgaWYgKG1WaWV3ID09IG51bGwpIHsKICAgICAgICAgICAgICAgICBtVmlldyA9IHZpZXc7CiAgICAgICAgICAgICAgICAgbVdpbmRvd0F0dHJpYnV0ZXMuY29weUZyb20oYXR0cnMpOwogICAgICAgICAgICAgICAgIGF0dHJzID0gbVdpbmRvd0F0dHJpYnV0ZXM7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgZW5hYmxlSGFyZHdhcmVBY2NlbGVyYXRpb24oYXR0cnMpOworCiAgICAgICAgICAgICAgICAgaWYgKHZpZXcgaW5zdGFuY2VvZiBSb290Vmlld1N1cmZhY2VUYWtlcikgewogICAgICAgICAgICAgICAgICAgICBtU3VyZmFjZUhvbGRlckNhbGxiYWNrID0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJvb3RWaWV3U3VyZmFjZVRha2VyKXZpZXcpLndpbGxZb3VUYWtlVGhlU3VyZmFjZSgpOwpAQCAtNTc1LDYgKzQ2MCwyMSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcHJpdmF0ZSB2b2lkIGVuYWJsZUhhcmR3YXJlQWNjZWxlcmF0aW9uKFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zIGF0dHJzKSB7CisgICAgICAgIC8vIE9ubHkgZW5hYmxlIGhhcmR3YXJlIGFjY2VsZXJhdGlvbiBpZiB3ZSBhcmUgbm90IGluIHRoZSBzeXN0ZW0gcHJvY2VzcworICAgICAgICAvLyBUaGUgd2luZG93IG1hbmFnZXIgY3JlYXRlcyBWaWV3Um9vdHMgdG8gZGlzcGxheSBhbmltYXRlZCBwcmV2aWV3IHdpbmRvd3MKKyAgICAgICAgLy8gb2YgbGF1bmNoaW5nIGFwcHMgYW5kIHdlIGRvbid0IHdhbnQgdGhvc2UgdG8gYmUgaGFyZHdhcmUgYWNjZWxlcmF0ZWQKKyAgICAgICAgaWYgKFByb2Nlc3MubXlVaWQoKSAhPSBQcm9jZXNzLlNZU1RFTV9VSUQpIHsKKyAgICAgICAgICAgIC8vIFRyeSB0byBlbmFibGUgaGFyZHdhcmUgYWNjZWxlcmF0aW9uIGlmIHJlcXVlc3RlZAorICAgICAgICAgICAgaWYgKGF0dHJzICE9IG51bGwgJiYKKyAgICAgICAgICAgICAgICAgICAgKGF0dHJzLmZsYWdzICYgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19IQVJEV0FSRV9BQ0NFTEVSQVRFRCkgIT0gMCkgeworICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gdHJhbnNsdWNlbnQgPSBhdHRycy5mb3JtYXQgIT0gUGl4ZWxGb3JtYXQuT1BBUVVFOworICAgICAgICAgICAgICAgIGRlc3Ryb3lIYXJkd2FyZVJlbmRlcmVyKCk7CisgICAgICAgICAgICAgICAgbUh3UmVuZGVyZXIgPSBIYXJkd2FyZVJlbmRlcmVyLmNyZWF0ZUdsUmVuZGVyZXIoMiwgdHJhbnNsdWNlbnQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCiAgICAgcHVibGljIFZpZXcgZ2V0VmlldygpIHsKICAgICAgICAgcmV0dXJuIG1WaWV3OwogICAgIH0KQEAgLTczMSw4ICs2MzEsNiBAQAogICAgICAgICBib29sZWFuIHZpZXdWaXNpYmlsaXR5Q2hhbmdlZCA9IG1WaWV3VmlzaWJpbGl0eSAhPSB2aWV3VmlzaWJpbGl0eQogICAgICAgICAgICAgICAgIHx8IG1OZXdTdXJmYWNlTmVlZGVkOwogCi0gICAgICAgIGZsb2F0IGFwcFNjYWxlID0gbUF0dGFjaEluZm8ubUFwcGxpY2F0aW9uU2NhbGU7Ci0KICAgICAgICAgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMgcGFyYW1zID0gbnVsbDsKICAgICAgICAgaWYgKG1XaW5kb3dBdHRyaWJ1dGVzQ2hhbmdlZCkgewogICAgICAgICAgICAgbVdpbmRvd0F0dHJpYnV0ZXNDaGFuZ2VkID0gZmFsc2U7CkBAIC03ODAsOSArNjc4LDcgQEAKICAgICAgICAgICAgIGF0dGFjaEluZm8ubVdpbmRvd1Zpc2liaWxpdHkgPSB2aWV3VmlzaWJpbGl0eTsKICAgICAgICAgICAgIGhvc3QuZGlzcGF0Y2hXaW5kb3dWaXNpYmlsaXR5Q2hhbmdlZCh2aWV3VmlzaWJpbGl0eSk7CiAgICAgICAgICAgICBpZiAodmlld1Zpc2liaWxpdHkgIT0gVmlldy5WSVNJQkxFIHx8IG1OZXdTdXJmYWNlTmVlZGVkKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1Vc2VHTCkgewotICAgICAgICAgICAgICAgICAgICBkZXN0cm95R0woKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZGVzdHJveUhhcmR3YXJlUmVuZGVyZXIoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmICh2aWV3VmlzaWJpbGl0eSA9PSBWaWV3LkdPTkUpIHsKICAgICAgICAgICAgICAgICAvLyBBZnRlciBtYWtpbmcgYSB3aW5kb3cgZ29uZSwgd2Ugd2lsbCBjb3VudCBpdCBhcyBiZWluZwpAQCAtODk3LDEwICs3OTMsMTIgQEAKIAogICAgICAgICBmaW5hbCBib29sZWFuIGNvbXB1dGVzSW50ZXJuYWxJbnNldHMgPQogICAgICAgICAgICAgICAgIGF0dGFjaEluZm8ubVRyZWVPYnNlcnZlci5oYXNDb21wdXRlSW50ZXJuYWxJbnNldHNMaXN0ZW5lcnMoKTsKKwogICAgICAgICBib29sZWFuIGluc2V0c1BlbmRpbmcgPSBmYWxzZTsKICAgICAgICAgaW50IHJlbGF5b3V0UmVzdWx0ID0gMDsKLSAgICAgICAgaWYgKG1GaXJzdCB8fCB3aW5kb3dTaG91bGRSZXNpemUgfHwgaW5zZXRzQ2hhbmdlZAotICAgICAgICAgICAgICAgIHx8IHZpZXdWaXNpYmlsaXR5Q2hhbmdlZCB8fCBwYXJhbXMgIT0gbnVsbCkgeworCisgICAgICAgIGlmIChtRmlyc3QgfHwgd2luZG93U2hvdWxkUmVzaXplIHx8IGluc2V0c0NoYW5nZWQgfHwKKyAgICAgICAgICAgICAgICB2aWV3VmlzaWJpbGl0eUNoYW5nZWQgfHwgcGFyYW1zICE9IG51bGwpIHsKIAogICAgICAgICAgICAgaWYgKHZpZXdWaXNpYmlsaXR5ID09IFZpZXcuVklTSUJMRSkgewogICAgICAgICAgICAgICAgIC8vIElmIHRoaXMgd2luZG93IGlzIGdpdmluZyBpbnRlcm5hbCBpbnNldHMgdG8gdGhlIHdpbmRvdwpAQCAtOTEyLDI2ICs4MTAsMTkgQEAKICAgICAgICAgICAgICAgICAvLyB3aW5kb3csIHdhaXRpbmcgdW50aWwgd2UgY2FuIGZpbmlzaCBsYXlpbmcgb3V0IHRoaXMgd2luZG93CiAgICAgICAgICAgICAgICAgLy8gYW5kIGdldCBiYWNrIHRvIHRoZSB3aW5kb3cgbWFuYWdlciB3aXRoIHRoZSB1bHRpbWF0ZWx5CiAgICAgICAgICAgICAgICAgLy8gY29tcHV0ZWQgaW5zZXRzLgotICAgICAgICAgICAgICAgIGluc2V0c1BlbmRpbmcgPSBjb21wdXRlc0ludGVybmFsSW5zZXRzCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAobUZpcnN0IHx8IHZpZXdWaXNpYmlsaXR5Q2hhbmdlZCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAobVdpbmRvd0F0dHJpYnV0ZXMubWVtb3J5VHlwZSA9PSBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5NRU1PUllfVFlQRV9HUFUpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMgPSBtV2luZG93QXR0cmlidXRlczsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtR2xXYW50ZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbnNldHNQZW5kaW5nID0gY29tcHV0ZXNJbnRlcm5hbEluc2V0cyAmJiAobUZpcnN0IHx8IHZpZXdWaXNpYmlsaXR5Q2hhbmdlZCk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChtU3VyZmFjZUhvbGRlciAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgbVN1cmZhY2VIb2xkZXIubVN1cmZhY2VMb2NrLmxvY2soKTsKICAgICAgICAgICAgICAgICBtRHJhd2luZ0FsbG93ZWQgPSB0cnVlOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBib29sZWFuIGluaXRpYWxpemVkID0gZmFsc2U7CisKKyAgICAgICAgICAgIGJvb2xlYW4gaHdJbnRpYWxpemVkID0gZmFsc2U7CiAgICAgICAgICAgICBib29sZWFuIGNvbnRlbnRJbnNldHNDaGFuZ2VkID0gZmFsc2U7CiAgICAgICAgICAgICBib29sZWFuIHZpc2libGVJbnNldHNDaGFuZ2VkOwogICAgICAgICAgICAgYm9vbGVhbiBoYWRTdXJmYWNlID0gbVN1cmZhY2UuaXNWYWxpZCgpOworCiAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgIGludCBmbCA9IDA7CiAgICAgICAgICAgICAgICAgaWYgKHBhcmFtcyAhPSBudWxsKSB7CkBAIC05OTEsOSArODgyLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bGxSZWRyYXdOZWVkZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgbVByZXZpb3VzVHJhbnNwYXJlbnRSZWdpb24uc2V0RW1wdHkoKTsKIAotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1HbFdhbnRlZCAmJiAhbVVzZUdMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbGl6ZUdMKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbGl6ZWQgPSBtR2xDYW52YXMgIT0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtSHdSZW5kZXJlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHdJbnRpYWxpemVkID0gbUh3UmVuZGVyZXIuaW5pdGlhbGl6ZShtSG9sZGVyKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIW1TdXJmYWNlLmlzVmFsaWQoKSkgewpAQCAtMTA3MSw5ICs5NjEsOCBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKGluaXRpYWxpemVkKSB7Ci0gICAgICAgICAgICAgICAgbUdsQ2FudmFzLnNldFZpZXdwb3J0KChpbnQpIChtV2lkdGggKiBhcHBTY2FsZSArIDAuNWYpLAotICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgKG1IZWlnaHQgKiBhcHBTY2FsZSArIDAuNWYpKTsKKyAgICAgICAgICAgIGlmIChod0ludGlhbGl6ZWQpIHsKKyAgICAgICAgICAgICAgICBtSHdSZW5kZXJlci5zZXR1cChtV2lkdGgsIG1IZWlnaHQpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBib29sZWFuIGZvY3VzQ2hhbmdlZER1ZVRvVG91Y2hNb2RlID0gZW5zdXJlVG91Y2hNb2RlTG9jYWxseSgKQEAgLTEzNDYsNyArMTIzNSw4IEBACiAgICAgICAgIGlmICghc0ZpcnN0RHJhd0NvbXBsZXRlKSB7CiAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHNGaXJzdERyYXdIYW5kbGVycykgewogICAgICAgICAgICAgICAgIHNGaXJzdERyYXdDb21wbGV0ZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPHNGaXJzdERyYXdIYW5kbGVycy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIGZpbmFsIGludCBjb3VudCA9IHNGaXJzdERyYXdIYW5kbGVycy5zaXplKCk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGk8IGNvdW50OyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgcG9zdChzRmlyc3REcmF3SGFuZGxlcnMuZ2V0KGkpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC0xMzgwLDUzICsxMjcwLDE2IEBACiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICAgICAgCi0gICAgICAgIGlmIChtVXNlR0wpIHsKKyAgICAgICAgaWYgKG1Id1JlbmRlcmVyICE9IG51bGwgJiYgbUh3UmVuZGVyZXIuaXNFbmFibGVkKCkpIHsKICAgICAgICAgICAgIGlmICghZGlydHkuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgQ2FudmFzIGNhbnZhcyA9IG1HbENhbnZhczsKLSAgICAgICAgICAgICAgICBpZiAobUdMICE9IG51bGwgJiYgY2FudmFzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbUdMLmdsRGlzYWJsZShHTF9TQ0lTU09SX1RFU1QpOwotICAgICAgICAgICAgICAgICAgICBtR0wuZ2xDbGVhckNvbG9yKDAsIDAsIDAsIDApOwotICAgICAgICAgICAgICAgICAgICBtR0wuZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUKTsKLSAgICAgICAgICAgICAgICAgICAgbUdMLmdsRW5hYmxlKEdMX1NDSVNTT1JfVEVTVCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgbUF0dGFjaEluZm8ubURyYXdpbmdUaW1lID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1BdHRhY2hJbmZvLm1JZ25vcmVEaXJ0eVN0YXRlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgbVZpZXcubVByaXZhdGVGbGFncyB8PSBWaWV3LkRSQVdOOwotCi0gICAgICAgICAgICAgICAgICAgIGludCBzYXZlQ291bnQgPSBjYW52YXMuc2F2ZShDYW52YXMuTUFUUklYX1NBVkVfRkxBRyk7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDAsIC15b2ZmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtVHJhbnNsYXRvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRyYW5zbGF0b3IudHJhbnNsYXRlQ2FudmFzKGNhbnZhcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYW52YXMuc2V0U2NyZWVuRGVuc2l0eShzY2FsaW5nUmVxdWlyZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBEaXNwbGF5TWV0cmljcy5ERU5TSVRZX0RFVklDRSA6IDApOwotICAgICAgICAgICAgICAgICAgICAgICAgbVZpZXcuZHJhdyhjYW52YXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKENvbmZpZy5ERUJVRyAmJiBWaWV3RGVidWcuY29uc2lzdGVuY3lDaGVja0VuYWJsZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVmlldy5kaXNwYXRjaENvbnNpc3RlbmN5Q2hlY2soVmlld0RlYnVnLkNPTlNJU1RFTkNZX0RSQVdJTkcpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FudmFzLnJlc3RvcmVUb0NvdW50KHNhdmVDb3VudCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBtQXR0YWNoSW5mby5tSWdub3JlRGlydHlTdGF0ZSA9IGZhbHNlOwotCi0gICAgICAgICAgICAgICAgICAgIG1FZ2wuZWdsU3dhcEJ1ZmZlcnMobUVnbERpc3BsYXksIG1FZ2xTdXJmYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgY2hlY2tFZ2xFcnJvcnMoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoU0hPV19GUFMgfHwgQ29uZmlnLkRFQlVHICYmIFZpZXdEZWJ1Zy5zaG93RnBzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgbm93ID0gKGludClTeXN0ZW1DbG9jay5lbGFwc2VkUmVhbHRpbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzRHJhd1RpbWUgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZVNob3dGUFMoY2FudmFzLCBub3cgLSBzRHJhd1RpbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgc0RyYXdUaW1lID0gbm93OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1Id1JlbmRlcmVyLmRyYXcobVZpZXcsIG1BdHRhY2hJbmZvLCB5b2ZmKTsKICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgaWYgKHNjcm9sbGluZykgewogICAgICAgICAgICAgICAgIG1GdWxsUmVkcmF3TmVlZGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICBzY2hlZHVsZVRyYXZlcnNhbHMoKTsKICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKQEAgLTE1MDksNyArMTM2Miw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsIG1ldHJpY3M9IiArIGN4dC5nZXRSZXNvdXJjZXMoKS5nZXREaXNwbGF5TWV0cmljcygpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwgY29tcGF0aWJpbGl0eUluZm89IiArIGN4dC5nZXRSZXNvdXJjZXMoKS5nZXRDb21wYXRpYmlsaXR5SW5mbygpKTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpbnQgc2F2ZUNvdW50ID0gY2FudmFzLnNhdmUoQ2FudmFzLk1BVFJJWF9TQVZFX0ZMQUcpOwogICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgwLCAteW9mZik7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVRyYW5zbGF0b3IgIT0gbnVsbCkgewpAQCAtMTUyMCw3ICsxMzcyLDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIG1WaWV3LmRyYXcoY2FudmFzKTsKICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgICAgICAgICAgICAgIG1BdHRhY2hJbmZvLm1JZ25vcmVEaXJ0eVN0YXRlID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYW52YXMucmVzdG9yZVRvQ291bnQoc2F2ZUNvdW50KTsKICAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgICAgIGlmIChDb25maWcuREVCVUcgJiYgVmlld0RlYnVnLmNvbnNpc3RlbmN5Q2hlY2tFbmFibGVkKSB7CkBAIC0xNzM4LDggKzE1ODksNiBAQAogICAgIH0KIAogICAgIHZvaWQgZGlzcGF0Y2hEZXRhY2hlZEZyb21XaW5kb3coKSB7Ci0gICAgICAgIGlmIChDb25maWcuTE9HVikgTG9nLnYoVEFHLCAiRGV0YWNoaW5nIGluICIgKyB0aGlzICsgIiBvZiAiICsgbVN1cmZhY2UpOwotCiAgICAgICAgIGlmIChtVmlldyAhPSBudWxsKSB7CiAgICAgICAgICAgICBtVmlldy5kaXNwYXRjaERldGFjaGVkRnJvbVdpbmRvdygpOwogICAgICAgICB9CkBAIC0xNzQ4LDkgKzE1OTcsOSBAQAogICAgICAgICBtQXR0YWNoSW5mby5tUm9vdFZpZXcgPSBudWxsOwogICAgICAgICBtQXR0YWNoSW5mby5tU3VyZmFjZSA9IG51bGw7CiAKLSAgICAgICAgaWYgKG1Vc2VHTCkgewotICAgICAgICAgICAgZGVzdHJveUdMKCk7Ci0gICAgICAgIH0KKyAgICAgICAgZGVzdHJveUhhcmR3YXJlUmVuZGVyZXIoKTsKKyAgICAgICAgbUh3UmVuZGVyZXIgPSBudWxsOworICAgICAgICAKICAgICAgICAgbVN1cmZhY2UucmVsZWFzZSgpOwogCiAgICAgICAgIGlmIChtSW5wdXRDaGFubmVsICE9IG51bGwpIHsKQEAgLTE3NzUsNiArMTYyNCwxMiBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcHJpdmF0ZSB2b2lkIGRlc3Ryb3lIYXJkd2FyZVJlbmRlcmVyKCkgeworICAgICAgICBpZiAobUh3UmVuZGVyZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgbUh3UmVuZGVyZXIuZGVzdHJveSgpOworICAgICAgICB9CisgICAgfQorCiAgICAgdm9pZCB1cGRhdGVDb25maWd1cmF0aW9uKENvbmZpZ3VyYXRpb24gY29uZmlnLCBib29sZWFuIGZvcmNlKSB7CiAgICAgICAgIGlmIChERUJVR19DT05GSUdVUkFUSU9OKSBMb2cudihUQUcsCiAgICAgICAgICAgICAgICAgIkFwcGx5aW5nIG5ldyBjb25maWcgdG8gd2luZG93ICIKQEAgLTE5MzMsMTggKzE3ODgsOCBAQAogICAgICAgICAgICAgICAgICAgICBib29sZWFuIGluVG91Y2hNb2RlID0gbXNnLmFyZzIgIT0gMDsKICAgICAgICAgICAgICAgICAgICAgZW5zdXJlVG91Y2hNb2RlTG9jYWxseShpblRvdWNoTW9kZSk7CiAKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1HbFdhbnRlZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tFZ2xFcnJvcnMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGxvc3QgdGhlIGdsIGNvbnRleHQsIHNvIHJlY3JlYXRlIGl0LgotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1HbFdhbnRlZCAmJiAhbVVzZUdMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbGl6ZUdMKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1HbENhbnZhcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFwcFNjYWxlID0gbUF0dGFjaEluZm8ubUFwcGxpY2F0aW9uU2NhbGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1HbENhbnZhcy5zZXRWaWV3cG9ydCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSAobVdpZHRoICogYXBwU2NhbGUgKyAwLjVmKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSAobUhlaWdodCAqIGFwcFNjYWxlICsgMC41ZikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG1Id1JlbmRlcmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Id1JlbmRlcmVyLmluaXRpYWxpemVJZk5lZWRlZChtV2lkdGgsIG1IZWlnaHQsIG1BdHRhY2hJbmZvLCBtSG9sZGVyKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KIApAQCAtMTk5NCw4ICsxODM5LDcgQEAKICAgICAgICAgICAgIGlmICgoZXZlbnQuZ2V0RmxhZ3MoKSZLZXlFdmVudC5GTEFHX0ZST01fU1lTVEVNKSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgLy8gVGhlIElNRSBpcyB0cnlpbmcgdG8gc2F5IHRoaXMgZXZlbnQgaXMgZnJvbSB0aGUKICAgICAgICAgICAgICAgICAvLyBzeXN0ZW0hICBCYWQgYmFkIGJhZCEKLSAgICAgICAgICAgICAgICBldmVudCA9IEtleUV2ZW50LmNoYW5nZUZsYWdzKGV2ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQuZ2V0RmxhZ3MoKSZ+S2V5RXZlbnQuRkxBR19GUk9NX1NZU1RFTSk7CisgICAgICAgICAgICAgICAgZXZlbnQgPSBLZXlFdmVudC5jaGFuZ2VGbGFncyhldmVudCwgZXZlbnQuZ2V0RmxhZ3MoKSAmIH5LZXlFdmVudC5GTEFHX0ZST01fU1lTVEVNKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGRlbGl2ZXJLZXlFdmVudFRvVmlld0hpZXJhcmNoeSgoS2V5RXZlbnQpbXNnLm9iaiwgZmFsc2UpOwogICAgICAgICB9IGJyZWFrOwpAQCAtMjQ4Myw4ICsyMzI3LDcgQEAKICAgICBwcml2YXRlIHZvaWQgZGVsaXZlcktleUV2ZW50KEtleUV2ZW50IGV2ZW50LCBib29sZWFuIHNlbmREb25lKSB7CiAgICAgICAgIC8vIElmIG1WaWV3IGlzIG51bGwsIHdlIGp1c3QgY29uc3VtZSB0aGUga2V5IGV2ZW50IGJlY2F1c2UgaXQgZG9lc24ndAogICAgICAgICAvLyBtYWtlIHNlbnNlIHRvIGRvIGFueXRoaW5nIGVsc2Ugd2l0aCBpdC4KLSAgICAgICAgYm9vbGVhbiBoYW5kbGVkID0gbVZpZXcgIT0gbnVsbAotICAgICAgICAgICAgICAgID8gbVZpZXcuZGlzcGF0Y2hLZXlFdmVudFByZUltZShldmVudCkgOiB0cnVlOworICAgICAgICBib29sZWFuIGhhbmRsZWQgPSBtVmlldyA9PSBudWxsIHx8IG1WaWV3LmRpc3BhdGNoS2V5RXZlbnRQcmVJbWUoZXZlbnQpOwogICAgICAgICBpZiAoaGFuZGxlZCkgewogICAgICAgICAgICAgaWYgKHNlbmREb25lKSB7CiAgICAgICAgICAgICAgICAgZmluaXNoS2V5RXZlbnQoZXZlbnQpOwpAQCAtMjUxNiw3ICsyMzU5LDYgQEAKICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gc2VuZERvbmUgPSBzZXEgPj0gMDsKICAgICAgICAgICAgIGlmICghaGFuZGxlZCkgewogICAgICAgICAgICAgICAgIGRlbGl2ZXJLZXlFdmVudFRvVmlld0hpZXJhcmNoeShldmVudCwgc2VuZERvbmUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2VuZERvbmUpIHsKICAgICAgICAgICAgICAgICBmaW5pc2hLZXlFdmVudChldmVudCk7CiAgICAgICAgICAgICB9IGVsc2UgewpAQCAtMjcxMyw3ICsyNTU1LDcgQEAKIAogICAgIHZvaWQgZG9EaWUoKSB7CiAgICAgICAgIGNoZWNrVGhyZWFkKCk7Ci0gICAgICAgIGlmIChDb25maWcuTE9HVikgTG9nLnYoVEFHLCAiRElFIGluICIgKyB0aGlzICsgIiBvZiAiICsgbVN1cmZhY2UpOworICAgICAgICBpZiAoTE9DQUxfTE9HVikgTG9nLnYoVEFHLCAiRElFIGluICIgKyB0aGlzICsgIiBvZiAiICsgbVN1cmZhY2UpOwogICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKICAgICAgICAgICAgIGlmIChtQWRkZWQgJiYgIW1GaXJzdCkgewogICAgICAgICAgICAgICAgIGludCB2aWV3VmlzaWJpbGl0eSA9IG1WaWV3LmdldFZpc2liaWxpdHkoKTsKQEAgLTI3OTksMTMgKzI2NDEsMTIgQEAKICAgICAgICAgLy9ub2luc3BlY3Rpb24gQ29uc3RhbnRDb25kaXRpb25zCiAgICAgICAgIGlmIChmYWxzZSAmJiBldmVudC5nZXRBY3Rpb24oKSA9PSBLZXlFdmVudC5BQ1RJT05fRE9XTikgewogICAgICAgICAgICAgaWYgKGV2ZW50LmdldEtleUNvZGUoKSA9PSBLZXlFdmVudC5LRVlDT0RFX0NBTUVSQSkgewotICAgICAgICAgICAgICAgIGlmIChDb25maWcuTE9HRCkgTG9nLmQoImtleWRpc3AiLAotICAgICAgICAgICAgICAgICAgICAgICAgIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIpOwotICAgICAgICAgICAgICAgIGlmIChDb25maWcuTE9HRCkgTG9nLmQoImtleWRpc3AiLCAiRm9jdXNlZCB2aWV3IEhpZXJhcmNoeSBpczoiKTsKKyAgICAgICAgICAgICAgICBpZiAoREJHKSBMb2cuZCgia2V5ZGlzcCIsICI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iKTsKKyAgICAgICAgICAgICAgICBpZiAoREJHKSBMb2cuZCgia2V5ZGlzcCIsICJGb2N1c2VkIHZpZXcgSGllcmFyY2h5IGlzOiIpOworCiAgICAgICAgICAgICAgICAgZGVidWcoKTsKIAotICAgICAgICAgICAgICAgIGlmIChDb25maWcuTE9HRCkgTG9nLmQoImtleWRpc3AiLAotICAgICAgICAgICAgICAgICAgICAgICAgIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIpOworICAgICAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKCJrZXlkaXNwIiwgIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTI4ODgsMTYgKzI3MjksMTYgQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAorICAgIHB1YmxpYyBBY3Rpb25Nb2RlIHN0YXJ0QWN0aW9uTW9kZUZvckNoaWxkKFZpZXcgb3JpZ2luYWxWaWV3LCBBY3Rpb25Nb2RlLkNhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKwogICAgIHB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRleHRNZW51KENvbnRleHRNZW51IG1lbnUpIHsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBjaGlsZERyYXdhYmxlU3RhdGVDaGFuZ2VkKFZpZXcgY2hpbGQpIHsKICAgICB9CiAKLSAgICBwcm90ZWN0ZWQgUmVjdCBnZXRXaW5kb3dGcmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG1XaW5GcmFtZTsKLSAgICB9Ci0KICAgICB2b2lkIGNoZWNrVGhyZWFkKCkgewogICAgICAgICBpZiAobVRocmVhZCAhPSBUaHJlYWQuY3VycmVudFRocmVhZCgpKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgQ2FsbGVkRnJvbVdyb25nVGhyZWFkRXhjZXB0aW9uKApAQCAtMjk3NiwxNiArMjgxNywxNSBAQAogICAgIHN0YXRpYyBjbGFzcyBXIGV4dGVuZHMgSVdpbmRvdy5TdHViIHsKICAgICAgICAgcHJpdmF0ZSBmaW5hbCBXZWFrUmVmZXJlbmNlPFZpZXdSb290PiBtVmlld1Jvb3Q7CiAKLSAgICAgICAgcHVibGljIFcoVmlld1Jvb3Qgdmlld1Jvb3QsIENvbnRleHQgY29udGV4dCkgeworICAgICAgICBXKFZpZXdSb290IHZpZXdSb290KSB7CiAgICAgICAgICAgICBtVmlld1Jvb3QgPSBuZXcgV2Vha1JlZmVyZW5jZTxWaWV3Um9vdD4odmlld1Jvb3QpOwogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIHZvaWQgcmVzaXplZChpbnQgdywgaW50IGgsIFJlY3QgY292ZXJlZEluc2V0cywKLSAgICAgICAgICAgICAgICBSZWN0IHZpc2libGVJbnNldHMsIGJvb2xlYW4gcmVwb3J0RHJhdywgQ29uZmlndXJhdGlvbiBuZXdDb25maWcpIHsKKyAgICAgICAgcHVibGljIHZvaWQgcmVzaXplZChpbnQgdywgaW50IGgsIFJlY3QgY292ZXJlZEluc2V0cywgUmVjdCB2aXNpYmxlSW5zZXRzLAorICAgICAgICAgICAgICAgIGJvb2xlYW4gcmVwb3J0RHJhdywgQ29uZmlndXJhdGlvbiBuZXdDb25maWcpIHsKICAgICAgICAgICAgIGZpbmFsIFZpZXdSb290IHZpZXdSb290ID0gbVZpZXdSb290LmdldCgpOwogICAgICAgICAgICAgaWYgKHZpZXdSb290ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB2aWV3Um9vdC5kaXNwYXRjaFJlc2l6ZWQodywgaCwgY292ZXJlZEluc2V0cywKLSAgICAgICAgICAgICAgICAgICAgICAgIHZpc2libGVJbnNldHMsIHJlcG9ydERyYXcsIG5ld0NvbmZpZyk7CisgICAgICAgICAgICAgICAgdmlld1Jvb3QuZGlzcGF0Y2hSZXNpemVkKHcsIGgsIGNvdmVyZWRJbnNldHMsIHZpc2libGVJbnNldHMsIHJlcG9ydERyYXcsIG5ld0NvbmZpZyk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtMzM4OCw4ICszMjI4LDQgQEAKICAgICB9CiAKICAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBuYXRpdmVTaG93RlBTKENhbnZhcyBjYW52YXMsIGludCBkdXJhdGlvbk1pbGxpcyk7Ci0KLSAgICAvLyBpbmZvcm0gc2tpYSB0byBqdXN0IGFiYW5kb24gaXRzIHRleHR1cmUgY2FjaGUgSURzCi0gICAgLy8gZG9lc24ndCBjYWxsIGdsRGVsZXRlVGV4dHVyZXMKLSAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBuYXRpdmVBYmFuZG9uR2xDYWNoZXMoKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvV2luZG93LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1dpbmRvdy5qYXZhCmluZGV4IDExYzA5YzEuLjY2MzMzNjcgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvV2luZG93LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9XaW5kb3cuamF2YQpAQCAtNTYsMTEgKzU2LDMyIEBACiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkVBVFVSRV9DT05URVhUX01FTlUgPSA2OwogICAgIC8qKiBGbGFnIGZvciBjdXN0b20gdGl0bGUuIFlvdSBjYW5ub3QgY29tYmluZSB0aGlzIGZlYXR1cmUgd2l0aCBvdGhlciB0aXRsZSBmZWF0dXJlcy4gKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGRUFUVVJFX0NVU1RPTV9USVRMRSA9IDc7Ci0gICAgLyoqIEZsYWcgZm9yIGFza2luZyBmb3IgYW4gT3BlbkdMIGVuYWJsZWQgd2luZG93LgotICAgICAgICBBbGwgMkQgZ3JhcGhpY3Mgd2lsbCBiZSBoYW5kbGVkIGJ5IE9wZW5HTCBFUy4KLSAgICAgICAgQGhpZGUKLSAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZFQVRVUkVfT1BFTkdMID0gODsKKyAgICAvKioKKyAgICAgKiBGbGFnIGZvciBlbmFibGluZyB0aGUgQWN0aW9uIEJhci4KKyAgICAgKiBUaGlzIGlzIGVuYWJsZWQgYnkgZGVmYXVsdCBmb3Igc29tZSBkZXZpY2VzLiBUaGUgQWN0aW9uIEJhcgorICAgICAqIHJlcGxhY2VzIHRoZSB0aXRsZSBiYXIgYW5kIHByb3ZpZGVzIGFuIGFsdGVybmF0ZSBsb2NhdGlvbgorICAgICAqIGZvciBhbiBvbi1zY3JlZW4gbWVudSBidXR0b24gb24gc29tZSBkZXZpY2VzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZFQVRVUkVfQUNUSU9OX0JBUiA9IDg7CisgICAgLyoqCisgICAgICogRmxhZyBmb3IgcmVxdWVzdGluZyBhbiBBY3Rpb24gQmFyIHRoYXQgb3ZlcmxheXMgd2luZG93IGNvbnRlbnQuCisgICAgICogTm9ybWFsbHkgYW4gQWN0aW9uIEJhciB3aWxsIHNpdCBpbiB0aGUgc3BhY2UgYWJvdmUgd2luZG93IGNvbnRlbnQsIGJ1dCBpZiB0aGlzCisgICAgICogZmVhdHVyZSBpcyByZXF1ZXN0ZWQgYWxvbmcgd2l0aCB7QGxpbmsgI0ZFQVRVUkVfQUNUSU9OX0JBUn0gaXQgd2lsbCBiZSBsYXllcmVkIG92ZXIKKyAgICAgKiB0aGUgd2luZG93IGNvbnRlbnQgaXRzZWxmLiBUaGlzIGlzIHVzZWZ1bCBpZiB5b3Ugd291bGQgbGlrZSB5b3VyIGFwcCB0byBoYXZlIG1vcmUgY29udHJvbAorICAgICAqIG92ZXIgaG93IHRoZSBBY3Rpb24gQmFyIGlzIGRpc3BsYXllZCwgc3VjaCBhcyBsZXR0aW5nIGFwcGxpY2F0aW9uIGNvbnRlbnQgc2Nyb2xsIGJlbmVhdGgKKyAgICAgKiBhbiBBY3Rpb24gQmFyIHdpdGggYSB0cmFuc3BhcmVudCBiYWNrZ3JvdW5kIG9yIG90aGVyd2lzZSBkaXNwbGF5aW5nIGEgdHJhbnNwYXJlbnQvdHJhbnNsdWNlbnQKKyAgICAgKiBBY3Rpb24gQmFyIG92ZXIgYXBwbGljYXRpb24gY29udGVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGRUFUVVJFX0FDVElPTl9CQVJfT1ZFUkxBWSA9IDk7CisgICAgLyoqCisgICAgICogRmxhZyBmb3Igc3BlY2lmeWluZyB0aGUgYmVoYXZpb3Igb2YgYWN0aW9uIG1vZGVzIHdoZW4gYW4gQWN0aW9uIEJhciBpcyBub3QgcHJlc2VudC4KKyAgICAgKiBJZiBvdmVybGF5IGlzIGVuYWJsZWQsIHRoZSBhY3Rpb24gbW9kZSBVSSB3aWxsIGJlIGFsbG93ZWQgdG8gY292ZXIgZXhpc3Rpbmcgd2luZG93IGNvbnRlbnQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkVBVFVSRV9BQ1RJT05fTU9ERV9PVkVSTEFZID0gMTA7CisgICAgLyoqCisgICAgICogRmxhZyBmb3IgcmVxdWVzdGluZyB0aGlzIHdpbmRvdyB0byBiZSBoYXJkd2FyZSBhY2NlbGVyYXRlZCwgaWYgcG9zc2libGUuIAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZFQVRVUkVfSEFSRFdBUkVfQUNDRUxFUkFURUQgPSAxMTsKICAgICAvKiogRmxhZyBmb3Igc2V0dGluZyB0aGUgcHJvZ3Jlc3MgYmFyJ3MgdmlzaWJpbGl0eSB0byBWSVNJQkxFICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPR1JFU1NfVklTSUJJTElUWV9PTiA9IC0xOwogICAgIC8qKiBGbGFnIGZvciBzZXR0aW5nIHRoZSBwcm9ncmVzcyBiYXIncyB2aXNpYmlsaXR5IHRvIEdPTkUgKi8KQEAgLTEwOSw2ICsxMzAsOCBAQAogCiAgICAgcHJpdmF0ZSBib29sZWFuIG1IYXNTb2Z0SW5wdXRNb2RlID0gZmFsc2U7CiAgICAgCisgICAgcHJpdmF0ZSBib29sZWFuIG1EZXN0cm95ZWQ7CisKICAgICAvLyBUaGUgY3VycmVudCB3aW5kb3cgYXR0cmlidXRlcy4KICAgICBwcml2YXRlIGZpbmFsIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zIG1XaW5kb3dBdHRyaWJ1dGVzID0KICAgICAgICAgbmV3IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zKCk7CkBAIC0yOTIsNiArMzE1LDE0IEBACiAgICAgICAgICAqIEBzZWUgYW5kcm9pZC5hcHAuQWN0aXZpdHkjb25TZWFyY2hSZXF1ZXN0ZWQoKSAKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBib29sZWFuIG9uU2VhcmNoUmVxdWVzdGVkKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENhbGxlZCB3aGVuIGFuIGFjdGlvbiBtb2RlIGlzIGJlaW5nIHN0YXJ0ZWQuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBjYWxsYmFjayBDYWxsYmFjayB0byBjb250cm9sIHRoZSBsaWZlY3ljbGUgb2YgdGhpcyBhY3Rpb24gbW9kZQorICAgICAgICAgKiBAcmV0dXJuIFRoZSBBY3Rpb25Nb2RlIHRoYXQgd2FzIHN0YXJ0ZWQsIG9yIG51bGwgaWYgaXQgd2FzIGNhbmNlbGVkCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQWN0aW9uTW9kZSBvblN0YXJ0QWN0aW9uTW9kZShBY3Rpb25Nb2RlLkNhbGxiYWNrIGNhbGxiYWNrKTsKICAgICB9CiAKICAgICBwdWJsaWMgV2luZG93KENvbnRleHQgY29udGV4dCkgewpAQCAtMzUzLDYgKzM4NCwxNiBAQAogICAgICAgICByZXR1cm4gbUhhc0NoaWxkcmVuOwogICAgIH0KICAgICAKKyAgICAvKiogQGhpZGUgKi8KKyAgICBwdWJsaWMgZmluYWwgdm9pZCBkZXN0cm95KCkgeworICAgICAgICBtRGVzdHJveWVkID0gdHJ1ZTsKKyAgICB9CisKKyAgICAvKiogQGhpZGUgKi8KKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0Rlc3Ryb3llZCgpIHsKKyAgICAgICAgcmV0dXJuIG1EZXN0cm95ZWQ7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogU2V0IHRoZSB3aW5kb3cgbWFuYWdlciBmb3IgdXNlIGJ5IHRoaXMgV2luZG93IHRvLCBmb3IgZXhhbXBsZSwKICAgICAgKiBkaXNwbGF5IHBhbmVscy4gIFRoaXMgaXMgPGVtPm5vdDwvZW0+IHVzZWQgZm9yIGRpc3BsYXlpbmcgdGhlCkBAIC0zNjAsMjEgKzQwMSwzNSBAQAogICAgICAqCiAgICAgICogQHBhcmFtIHdtIFRoZSBWaWV3TWFuYWdlciBmb3IgYWRkaW5nIG5ldyB3aW5kb3dzLgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFdpbmRvd01hbmFnZXIoV2luZG93TWFuYWdlciB3bSwKLSAgICAgICAgICAgIElCaW5kZXIgYXBwVG9rZW4sIFN0cmluZyBhcHBOYW1lKSB7CisgICAgcHVibGljIHZvaWQgc2V0V2luZG93TWFuYWdlcihXaW5kb3dNYW5hZ2VyIHdtLCBJQmluZGVyIGFwcFRva2VuLCBTdHJpbmcgYXBwTmFtZSkgeworICAgICAgICBzZXRXaW5kb3dNYW5hZ2VyKHdtLCBhcHBUb2tlbiwgYXBwTmFtZSwgZmFsc2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgd2luZG93IG1hbmFnZXIgZm9yIHVzZSBieSB0aGlzIFdpbmRvdyB0bywgZm9yIGV4YW1wbGUsCisgICAgICogZGlzcGxheSBwYW5lbHMuICBUaGlzIGlzIDxlbT5ub3Q8L2VtPiB1c2VkIGZvciBkaXNwbGF5aW5nIHRoZQorICAgICAqIFdpbmRvdyBpdHNlbGYgLS0gdGhhdCBtdXN0IGJlIGRvbmUgYnkgdGhlIGNsaWVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB3bSBUaGUgVmlld01hbmFnZXIgZm9yIGFkZGluZyBuZXcgd2luZG93cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRXaW5kb3dNYW5hZ2VyKFdpbmRvd01hbmFnZXIgd20sIElCaW5kZXIgYXBwVG9rZW4sIFN0cmluZyBhcHBOYW1lLAorICAgICAgICAgICAgYm9vbGVhbiBoYXJkd2FyZUFjY2VsZXJhdGVkKSB7CiAgICAgICAgIG1BcHBUb2tlbiA9IGFwcFRva2VuOwogICAgICAgICBtQXBwTmFtZSA9IGFwcE5hbWU7CiAgICAgICAgIGlmICh3bSA9PSBudWxsKSB7CiAgICAgICAgICAgICB3bSA9IFdpbmRvd01hbmFnZXJJbXBsLmdldERlZmF1bHQoKTsKICAgICAgICAgfQotICAgICAgICBtV2luZG93TWFuYWdlciA9IG5ldyBMb2NhbFdpbmRvd01hbmFnZXIod20pOworICAgICAgICBtV2luZG93TWFuYWdlciA9IG5ldyBMb2NhbFdpbmRvd01hbmFnZXIod20sIGhhcmR3YXJlQWNjZWxlcmF0ZWQpOwogICAgIH0KIAogICAgIHByaXZhdGUgY2xhc3MgTG9jYWxXaW5kb3dNYW5hZ2VyIGltcGxlbWVudHMgV2luZG93TWFuYWdlciB7Ci0gICAgICAgIExvY2FsV2luZG93TWFuYWdlcihXaW5kb3dNYW5hZ2VyIHdtKSB7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtSGFyZHdhcmVBY2NlbGVyYXRlZDsKKworICAgICAgICBMb2NhbFdpbmRvd01hbmFnZXIoV2luZG93TWFuYWdlciB3bSwgYm9vbGVhbiBoYXJkd2FyZUFjY2VsZXJhdGVkKSB7CiAgICAgICAgICAgICBtV2luZG93TWFuYWdlciA9IHdtOwogICAgICAgICAgICAgbURlZmF1bHREaXNwbGF5ID0gbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0RGVmYXVsdERpc3BsYXkoCiAgICAgICAgICAgICAgICAgICAgIG1XaW5kb3dNYW5hZ2VyLmdldERlZmF1bHREaXNwbGF5KCkpOworICAgICAgICAgICAgbUhhcmR3YXJlQWNjZWxlcmF0ZWQgPSBoYXJkd2FyZUFjY2VsZXJhdGVkOwogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIGZpbmFsIHZvaWQgYWRkVmlldyhWaWV3IHZpZXcsIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMgcGFyYW1zKSB7CkBAIC00MjEsNiArNDc2LDkgQEAKICAgICAgICAgICAgIGlmICh3cC5wYWNrYWdlTmFtZSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgd3AucGFja2FnZU5hbWUgPSBtQ29udGV4dC5nZXRQYWNrYWdlTmFtZSgpOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1IYXJkd2FyZUFjY2VsZXJhdGVkKSB7CisgICAgICAgICAgICAgICAgd3AuZmxhZ3MgfD0gV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19IQVJEV0FSRV9BQ0NFTEVSQVRFRDsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1XaW5kb3dNYW5hZ2VyLmFkZFZpZXcodmlldywgcGFyYW1zKTsKICAgICAgICAgfQogCkBAIC03MTMsNiArNzcxLDE1IEBACiAgICAgICAgIHJldHVybiAobUZlYXR1cmVzJmZsYWcpICE9IDA7CiAgICAgfQogCisgICAgLyoqCisgICAgICogQGhpZGUgVXNlZCBpbnRlcm5hbGx5IHRvIGhlbHAgcmVzb2x2ZSBjb25mbGljdGluZyBmZWF0dXJlcy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCByZW1vdmVGZWF0dXJlKGludCBmZWF0dXJlSWQpIHsKKyAgICAgICAgZmluYWwgaW50IGZsYWcgPSAxPDxmZWF0dXJlSWQ7CisgICAgICAgIG1GZWF0dXJlcyAmPSB+ZmxhZzsKKyAgICAgICAgbUxvY2FsRmVhdHVyZXMgJj0gfihtQ29udGFpbmVyICE9IG51bGwgPyAoZmxhZyZ+bUNvbnRhaW5lci5tRmVhdHVyZXMpIDogZmxhZyk7CisgICAgfQorCiAgICAgcHVibGljIGZpbmFsIHZvaWQgbWFrZUFjdGl2ZSgpIHsKICAgICAgICAgaWYgKG1Db250YWluZXIgIT0gbnVsbCkgewogICAgICAgICAgICAgaWYgKG1Db250YWluZXIubUFjdGl2ZUNoaWxkICE9IG51bGwpIHsKQEAgLTgxNyw2ICs4ODQsOCBAQAogCiAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgdG9nZ2xlUGFuZWwoaW50IGZlYXR1cmVJZCwgS2V5RXZlbnQgZXZlbnQpOwogCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgaW52YWxpZGF0ZVBhbmVsTWVudShpbnQgZmVhdHVyZUlkKTsKKyAgICAKICAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBwZXJmb3JtUGFuZWxTaG9ydGN1dChpbnQgZmVhdHVyZUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBrZXlDb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleUV2ZW50IGV2ZW50LApAQCAtOTk2LDYgKzEwNjUsMTYgQEAKICAgICB7CiAgICAgICAgIHJldHVybiBtRmVhdHVyZXM7CiAgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFF1ZXJ5IGZvciB0aGUgYXZhaWxhYmlsaXR5IG9mIGEgY2VydGFpbiBmZWF0dXJlLgorICAgICAqIAorICAgICAqIEBwYXJhbSBmZWF0dXJlIFRoZSBmZWF0dXJlIElEIHRvIGNoZWNrCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBmZWF0dXJlIGlzIGVuYWJsZWQsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNGZWF0dXJlKGludCBmZWF0dXJlKSB7CisgICAgICAgIHJldHVybiAoZ2V0RmVhdHVyZXMoKSAmICgxIDw8IGZlYXR1cmUpKSAhPSAwOworICAgIH0KIAogICAgIC8qKgogICAgICAqIFJldHVybiB0aGUgZmVhdHVyZSBiaXRzIHRoYXQgYXJlIGJlaW5nIGltcGxlbWVudGVkIGJ5IHRoaXMgV2luZG93LgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9XaW5kb3dNYW5hZ2VyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1dpbmRvd01hbmFnZXIuamF2YQppbmRleCBlZWJiYzkzLi5jMTQ3Yjc0IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1dpbmRvd01hbmFnZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1dpbmRvd01hbmFnZXIuamF2YQpAQCAtNzIsNiArNzIsNyBAQAogICAgICAgICAgKiBXaGVuIHVzaW5nIHtAbGluayBHcmF2aXR5I0xFRlR9IG9yIHtAbGluayBHcmF2aXR5I1JJR0hUfSBpdCBwcm92aWRlcwogICAgICAgICAgKiBhbiBvZmZzZXQgZnJvbSB0aGUgZ2l2ZW4gZWRnZS4KICAgICAgICAgICovCisgICAgICAgIEBWaWV3RGVidWcuRXhwb3J0ZWRQcm9wZXJ0eQogICAgICAgICBwdWJsaWMgaW50IHg7CiAgICAgICAgIAogICAgICAgICAvKioKQEAgLTc5LDYgKzgwLDcgQEAKICAgICAgICAgICogV2hlbiB1c2luZyB7QGxpbmsgR3Jhdml0eSNUT1B9IG9yIHtAbGluayBHcmF2aXR5I0JPVFRPTX0gaXQgcHJvdmlkZXMKICAgICAgICAgICogYW4gb2Zmc2V0IGZyb20gdGhlIGdpdmVuIGVkZ2UuCiAgICAgICAgICAqLworICAgICAgICBAVmlld0RlYnVnLkV4cG9ydGVkUHJvcGVydHkKICAgICAgICAgcHVibGljIGludCB5OwogCiAgICAgICAgIC8qKgpAQCAtODcsNiArODksNyBAQAogICAgICAgICAgKiBzaG91bGQgbm90IGJlIHN0cmV0Y2hlZC4gT3RoZXJ3aXNlIHRoZSBleHRyYSBwaXhlbHMgd2lsbCBiZSBwcm8tcmF0ZWQKICAgICAgICAgICogYW1vbmcgYWxsIHZpZXdzIHdob3NlIHdlaWdodCBpcyBncmVhdGVyIHRoYW4gMC4KICAgICAgICAgICovCisgICAgICAgIEBWaWV3RGVidWcuRXhwb3J0ZWRQcm9wZXJ0eQogICAgICAgICBwdWJsaWMgZmxvYXQgaG9yaXpvbnRhbFdlaWdodDsKIAogICAgICAgICAvKioKQEAgLTk1LDggKzk4LDkgQEAKICAgICAgICAgICogc2hvdWxkIG5vdCBiZSBzdHJldGNoZWQuIE90aGVyd2lzZSB0aGUgZXh0cmEgcGl4ZWxzIHdpbGwgYmUgcHJvLXJhdGVkCiAgICAgICAgICAqIGFtb25nIGFsbCB2aWV3cyB3aG9zZSB3ZWlnaHQgaXMgZ3JlYXRlciB0aGFuIDAuCiAgICAgICAgICAqLworICAgICAgICBAVmlld0RlYnVnLkV4cG9ydGVkUHJvcGVydHkKICAgICAgICAgcHVibGljIGZsb2F0IHZlcnRpY2FsV2VpZ2h0OwotICAgICAgICAKKwogICAgICAgICAvKioKICAgICAgICAgICogVGhlIGdlbmVyYWwgdHlwZSBvZiB3aW5kb3cuICBUaGVyZSBhcmUgdGhyZWUgbWFpbiBjbGFzc2VzIG9mCiAgICAgICAgICAqIHdpbmRvdyB0eXBlczoKQEAgLTM4OSw2ICszOTMsNyBAQAogICAgICAgICAgKiBAc2VlICNGTEFHX0ZVTExTQ1JFRU4KICAgICAgICAgICogQHNlZSAjRkxBR19GT1JDRV9OT1RfRlVMTFNDUkVFTgogICAgICAgICAgKiBAc2VlICNGTEFHX0lHTk9SRV9DSEVFS19QUkVTU0VTCisgICAgICAgICAqIEBzZWUgI0ZMQUdfSEFSRFdBUkVfQUNDRUxFUkFURUQKICAgICAgICAgICovCiAgICAgICAgIEBWaWV3RGVidWcuRXhwb3J0ZWRQcm9wZXJ0eShmbGFnTWFwcGluZyA9IHsKICAgICAgICAgICAgIEBWaWV3RGVidWcuRmxhZ1RvU3RyaW5nKG1hc2sgPSBGTEFHX0JMVVJfQkVISU5ELCBlcXVhbHMgPSBGTEFHX0JMVVJfQkVISU5ELApAQCAtNDIwLDcgKzQyNSw5IEBACiAgICAgICAgICAgICBAVmlld0RlYnVnLkZsYWdUb1N0cmluZyhtYXNrID0gRkxBR19GT1JDRV9OT1RfRlVMTFNDUkVFTiwKICAgICAgICAgICAgICAgICAgICAgZXF1YWxzID0gRkxBR19GT1JDRV9OT1RfRlVMTFNDUkVFTiwgbmFtZSA9ICJGTEFHX0ZPUkNFX05PVF9GVUxMU0NSRUVOIiksCiAgICAgICAgICAgICBAVmlld0RlYnVnLkZsYWdUb1N0cmluZyhtYXNrID0gRkxBR19JR05PUkVfQ0hFRUtfUFJFU1NFUywKLSAgICAgICAgICAgICAgICAgICAgZXF1YWxzID0gRkxBR19JR05PUkVfQ0hFRUtfUFJFU1NFUywgbmFtZSA9ICJGTEFHX0lHTk9SRV9DSEVFS19QUkVTU0VTIikKKyAgICAgICAgICAgICAgICAgICAgZXF1YWxzID0gRkxBR19JR05PUkVfQ0hFRUtfUFJFU1NFUywgbmFtZSA9ICJGTEFHX0lHTk9SRV9DSEVFS19QUkVTU0VTIiksCisgICAgICAgICAgICBAVmlld0RlYnVnLkZsYWdUb1N0cmluZyhtYXNrID0gRkxBR19IQVJEV0FSRV9BQ0NFTEVSQVRFRCwKKyAgICAgICAgICAgICAgICAgICAgZXF1YWxzID0gRkxBR19IQVJEV0FSRV9BQ0NFTEVSQVRFRCwgbmFtZSA9ICJGTEFHX0hBUkRXQVJFX0FDQ0VMRVJBVEVEIikKICAgICAgICAgfSkKICAgICAgICAgcHVibGljIGludCBmbGFnczsKICAgICAgICAgCkBAIC02MDMsNiArNjEwLDEyIEBACiAgICAgICAgICAqIGl0IGlzIGNyZWF0ZWQuCiAgICAgICAgICAqIHtAaGlkZX0gKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19TWVNURU1fRVJST1IgPSAweDQwMDAwMDAwOworICAgICAgICAKKyAgICAgICAgLyoqCisgICAgICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgd2luZG93IHNob3VsZCBiZSBoYXJkd2FyZSBhY2NlbGVyYXRlZC4KKyAgICAgICAgICogUmVxdWVzdGluZyBoYXJkd2FyZSBhY2NlbGVyYXRpb24gZG9lcyBub3QgZ3VhcmFudGVlIGl0IHdpbGwgaGFwcGVuLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19IQVJEV0FSRV9BQ0NFTEVSQVRFRCA9IDB4ODAwMDAwMDA7ICAgICAgICAKIAogICAgICAgICAvKioKICAgICAgICAgICogR2l2ZW4gYSBwYXJ0aWN1bGFyIHNldCBvZiB3aW5kb3cgbWFuYWdlciBmbGFncywgZGV0ZXJtaW5lIHdoZXRoZXIKQEAgLTEwNzUsNiArMTA4OCw3IEBACiAgICAgICAgICAgICAgICAgc2NyZWVuT3JpZW50YXRpb24gPSBvLnNjcmVlbk9yaWVudGF0aW9uOwogICAgICAgICAgICAgICAgIGNoYW5nZXMgfD0gU0NSRUVOX09SSUVOVEFUSU9OX0NIQU5HRUQ7CiAgICAgICAgICAgICB9CisKICAgICAgICAgICAgIHJldHVybiBjaGFuZ2VzOwogICAgICAgICB9CiAgICAgCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2FjY2Vzc2liaWxpdHkvQWNjZXNzaWJpbGl0eU1hbmFnZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmlsaXR5TWFuYWdlci5qYXZhCmluZGV4IDAxODYyNzAuLmY0MDZkYTkgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmlsaXR5TWFuYWdlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmlsaXR5TWFuYWdlci5qYXZhCkBAIC05NCw3ICs5NCw5IEBACiAgICAgcHVibGljIHN0YXRpYyBBY2Nlc3NpYmlsaXR5TWFuYWdlciBnZXRJbnN0YW5jZShDb250ZXh0IGNvbnRleHQpIHsKICAgICAgICAgc3luY2hyb25pemVkIChzSW5zdGFuY2VTeW5jKSB7CiAgICAgICAgICAgICBpZiAoc0luc3RhbmNlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzSW5zdGFuY2UgPSBuZXcgQWNjZXNzaWJpbGl0eU1hbmFnZXIoY29udGV4dCk7CisgICAgICAgICAgICAgICAgSUJpbmRlciBpQmluZGVyID0gU2VydmljZU1hbmFnZXIuZ2V0U2VydmljZShDb250ZXh0LkFDQ0VTU0lCSUxJVFlfU0VSVklDRSk7CisgICAgICAgICAgICAgICAgSUFjY2Vzc2liaWxpdHlNYW5hZ2VyIHNlcnZpY2UgPSBJQWNjZXNzaWJpbGl0eU1hbmFnZXIuU3R1Yi5hc0ludGVyZmFjZShpQmluZGVyKTsKKyAgICAgICAgICAgICAgICBzSW5zdGFuY2UgPSBuZXcgQWNjZXNzaWJpbGl0eU1hbmFnZXIoY29udGV4dCwgc2VydmljZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHNJbnN0YW5jZTsKQEAgLTEwNCwxMyArMTA2LDE2IEBACiAgICAgICogQ3JlYXRlIGFuIGluc3RhbmNlLgogICAgICAqCiAgICAgICogQHBhcmFtIGNvbnRleHQgQSB7QGxpbmsgQ29udGV4dH0uCisgICAgICogQHBhcmFtIHNlcnZpY2UgQW4gaW50ZXJmYWNlIHRvIHRoZSBiYWNraW5nIHNlcnZpY2UuCisgICAgICoKKyAgICAgKiBAaGlkZQogICAgICAqLwotICAgIHByaXZhdGUgQWNjZXNzaWJpbGl0eU1hbmFnZXIoQ29udGV4dCBjb250ZXh0KSB7CisgICAgcHVibGljIEFjY2Vzc2liaWxpdHlNYW5hZ2VyKENvbnRleHQgY29udGV4dCwgSUFjY2Vzc2liaWxpdHlNYW5hZ2VyIHNlcnZpY2UpIHsKICAgICAgICAgbUhhbmRsZXIgPSBuZXcgTXlIYW5kbGVyKGNvbnRleHQuZ2V0TWFpbkxvb3BlcigpKTsKLSAgICAgICAgSUJpbmRlciBpQmluZGVyID0gU2VydmljZU1hbmFnZXIuZ2V0U2VydmljZShDb250ZXh0LkFDQ0VTU0lCSUxJVFlfU0VSVklDRSk7Ci0gICAgICAgIG1TZXJ2aWNlID0gSUFjY2Vzc2liaWxpdHlNYW5hZ2VyLlN0dWIuYXNJbnRlcmZhY2UoaUJpbmRlcik7CisgICAgICAgIG1TZXJ2aWNlID0gc2VydmljZTsKKwogICAgICAgICB0cnkgewotICAgICAgICAgICAgbVNlcnZpY2UuYWRkQ2xpZW50KG1DbGllbnQpOworICAgICAgICAgICAgbUlzRW5hYmxlZCA9IG1TZXJ2aWNlLmFkZENsaWVudChtQ2xpZW50KTsKICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIHJlKSB7CiAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiQWNjZXNzaWJpbGl0eU1hbmFnZXJTZXJ2aWNlIGlzIGRlYWQiLCByZSk7CiAgICAgICAgIH0KQEAgLTEyOCw2ICsxMzMsMTggQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjbGllbnQgaW50ZXJmYWNlIHRoaXMgaW5zdGFuY2UgcmVnaXN0ZXJzIGluCisgICAgICogdGhlIGNlbnRyYWxpemVkIGFjY2Vzc2liaWxpdHkgbWFuYWdlciBzZXJ2aWNlLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgY2xpZW50LgorICAgICAqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgSUFjY2Vzc2liaWxpdHlNYW5hZ2VyQ2xpZW50IGdldENsaWVudCgpIHsKKyAgICAgICByZXR1cm4gKElBY2Nlc3NpYmlsaXR5TWFuYWdlckNsaWVudCkgbUNsaWVudC5hc0JpbmRlcigpOyAKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBTZW5kcyBhbiB7QGxpbmsgQWNjZXNzaWJpbGl0eUV2ZW50fS4gSWYgdGhpcyB7QGxpbmsgQWNjZXNzaWJpbGl0eU1hbmFnZXJ9IGlzIG5vdAogICAgICAqIGVuYWJsZWQgdGhlIGNhbGwgaXMgYSBOT09QLgogICAgICAqCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2FjY2Vzc2liaWxpdHkvSUFjY2Vzc2liaWxpdHlNYW5hZ2VyLmFpZGwgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2FjY2Vzc2liaWxpdHkvSUFjY2Vzc2liaWxpdHlNYW5hZ2VyLmFpZGwKaW5kZXggMzI3ODhiZS4uNzYzMzU2OSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hY2Nlc3NpYmlsaXR5L0lBY2Nlc3NpYmlsaXR5TWFuYWdlci5haWRsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvYWNjZXNzaWJpbGl0eS9JQWNjZXNzaWJpbGl0eU1hbmFnZXIuYWlkbApAQCAtMjksNyArMjksNyBAQAogICovCiBpbnRlcmZhY2UgSUFjY2Vzc2liaWxpdHlNYW5hZ2VyIHsKIAotICAgIHZvaWQgYWRkQ2xpZW50KElBY2Nlc3NpYmlsaXR5TWFuYWdlckNsaWVudCBjbGllbnQpOworICAgIGJvb2xlYW4gYWRkQ2xpZW50KElBY2Nlc3NpYmlsaXR5TWFuYWdlckNsaWVudCBjbGllbnQpOwogCiAgICAgYm9vbGVhbiBzZW5kQWNjZXNzaWJpbGl0eUV2ZW50KGluIEFjY2Vzc2liaWxpdHlFdmVudCB1aUV2ZW50KTsKIApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hbmltYXRpb24vQW5pbWF0aW9uLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2FuaW1hdGlvbi9BbmltYXRpb24uamF2YQppbmRleCAzNDliN2U1Li45YTFlNDFjIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2FuaW1hdGlvbi9BbmltYXRpb24uamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2FuaW1hdGlvbi9BbmltYXRpb24uamF2YQpAQCAtMTc0LDcgKzE3NCwxMyBAQAogICAgICAqIERlc2lyZWQgWiBvcmRlciBtb2RlIGR1cmluZyBhbmltYXRpb24uCiAgICAgICovCiAgICAgcHJpdmF0ZSBpbnQgbVpBZGp1c3RtZW50OwotICAgIAorCisgICAgLyoqCisgICAgICogc2NhbGVmYWN0b3IgdG8gYXBwbHkgdG8gcGl2b3QgcG9pbnRzLCBldGMuIGR1cmluZyBhbmltYXRpb24uIFN1YmNsYXNzZXMgcmV0cmlldmUgdGhlCisgICAgICogdmFsdWUgdmlhIGdldFNjYWxlRmFjdG9yKCkuCisgICAgICovCisgICAgcHJpdmF0ZSBmbG9hdCBtU2NhbGVGYWN0b3IgPSAxZjsKKwogICAgIC8qKgogICAgICAqIERvbid0IGFuaW1hdGUgdGhlIHdhbGxwYXBlci4KICAgICAgKi8KQEAgLTMwMSw3ICszMDcsNyBAQAogICAgICAqIGFuaW1hdGVkIGFzIHdlbGwgYXMgdGhlIG9iamVjdHMgcGFyZW50cy4gKFRoaXMgaXMgdG8gc3VwcG9ydCBhbmltYXRpb24KICAgICAgKiBzaXplcyBiZWluZyBzcGVjaWZlZCByZWxhdGl2ZSB0byB0aGVzZSBkaW1lbnNpb25zLikKICAgICAgKgotICAgICAqIDxwPk9iamVjdHMgdGhhdCBpbnRlcnByZXQgYSBBbmltYXRpb25zIHNob3VsZCBjYWxsIHRoaXMgbWV0aG9kIHdoZW4KKyAgICAgKiA8cD5PYmplY3RzIHRoYXQgaW50ZXJwcmV0IEFuaW1hdGlvbnMgc2hvdWxkIGNhbGwgdGhpcyBtZXRob2Qgd2hlbgogICAgICAqIHRoZSBzaXplcyBvZiB0aGUgb2JqZWN0IGJlaW5nIGFuaW1hdGVkIGFuZCBpdHMgcGFyZW50IGFyZSBrbm93biwgYW5kCiAgICAgICogYmVmb3JlIGNhbGxpbmcge0BsaW5rICNnZXRUcmFuc2Zvcm1hdGlvbn0uCiAgICAgICoKQEAgLTU1Myw2ICs1NTksMTkgQEAKICAgICB9CiAgICAgCiAgICAgLyoqCisgICAgICogVGhlIHNjYWxlIGZhY3RvciBpcyBzZXQgYnkgdGhlIGNhbGwgdG8gPGNvZGU+Z2V0VHJhbnNmb3JtYXRpb248L2NvZGU+LiBPdmVycmlkZXMgb2YgCisgICAgICoge0BsaW5rICNnZXRUcmFuc2Zvcm1hdGlvbihsb25nLCBUcmFuc2Zvcm1hdGlvbiwgZmxvYXQpfSB3aWxsIGdldCB0aGlzIHZhbHVlCisgICAgICogZGlyZWN0bHkuIE92ZXJyaWRlcyBvZiB7QGxpbmsgI2FwcGx5VHJhbnNmb3JtYXRpb24oZmxvYXQsIFRyYW5zZm9ybWF0aW9uKX0gY2FuCisgICAgICogY2FsbCB0aGlzIG1ldGhvZCB0byBnZXQgdGhlIHZhbHVlLgorICAgICAqIAorICAgICAqIEByZXR1cm4gZmxvYXQgVGhlIHNjYWxlIGZhY3RvciB0aGF0IHNob3VsZCBiZSBhcHBsaWVkIHRvIHByZS1zY2FsZWQgdmFsdWVzIGluCisgICAgICogYW4gQW5pbWF0aW9uIHN1Y2ggYXMgdGhlIHBpdm90IHBvaW50cyBpbiB7QGxpbmsgU2NhbGVBbmltYXRpb259IGFuZCB7QGxpbmsgUm90YXRlQW5pbWF0aW9ufS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgZmxvYXQgZ2V0U2NhbGVGYWN0b3IoKSB7CisgICAgICAgIHJldHVybiBtU2NhbGVGYWN0b3I7CisgICAgfQorCisgICAgLyoqCiAgICAgICogSWYgZGV0YWNoV2FsbHBhcGVyIGlzIHRydWUsIGFuZCB0aGlzIGlzIGEgd2luZG93IGFuaW1hdGlvbiBvZiBhIHdpbmRvdwogICAgICAqIHRoYXQgaGFzIGEgd2FsbHBhcGVyIGJhY2tncm91bmQsIHRoZW4gdGhlIHdpbmRvdyB3aWxsIGJlIGRldGFjaGVkIGZyb20KICAgICAgKiB0aGUgd2FsbHBhcGVyIHdoaWxlIGl0IHJ1bnMuICBUaGF0IGlzLCB0aGUgYW5pbWF0aW9uIHdpbGwgb25seSBiZSBhcHBsaWVkCkBAIC03MzUsNiArNzU0LDcgQEAKICAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGFuaW1hdGlvbiBpcyBzdGlsbCBydW5uaW5nCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gZ2V0VHJhbnNmb3JtYXRpb24obG9uZyBjdXJyZW50VGltZSwgVHJhbnNmb3JtYXRpb24gb3V0VHJhbnNmb3JtYXRpb24pIHsKKwogICAgICAgICBpZiAobVN0YXJ0VGltZSA9PSAtMSkgewogICAgICAgICAgICAgbVN0YXJ0VGltZSA9IGN1cnJlbnRUaW1lOwogICAgICAgICB9CkBAIC04MDYsNiArODI2LDI0IEBACiAKICAgICAgICAgcmV0dXJuIG1Nb3JlOwogICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSB0cmFuc2Zvcm1hdGlvbiB0byBhcHBseSBhdCBhIHNwZWNpZmllZCBwb2ludCBpbiB0aW1lLiBJbXBsZW1lbnRhdGlvbnMgb2YgdGhpcworICAgICAqIG1ldGhvZCBzaG91bGQgYWx3YXlzIHJlcGxhY2UgdGhlIHNwZWNpZmllZCBUcmFuc2Zvcm1hdGlvbiBvciBkb2N1bWVudCB0aGV5IGFyZSBkb2luZworICAgICAqIG90aGVyd2lzZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjdXJyZW50VGltZSBXaGVyZSB3ZSBhcmUgaW4gdGhlIGFuaW1hdGlvbi4gVGhpcyBpcyB3YWxsIGNsb2NrIHRpbWUuCisgICAgICogQHBhcmFtIG91dFRyYW5zZm9ybWF0aW9uIEEgdHJhbmZvcm1hdGlvbiBvYmplY3QgdGhhdCBpcyBwcm92aWRlZCBieSB0aGUKKyAgICAgKiAgICAgICAgY2FsbGVyIGFuZCB3aWxsIGJlIGZpbGxlZCBpbiBieSB0aGUgYW5pbWF0aW9uLgorICAgICAqIEBwYXJhbSBzY2FsZSBTY2FsaW5nIGZhY3RvciB0byBhcHBseSB0byBhbnkgaW5wdXRzIHRvIHRoZSB0cmFuc2Zvcm0gb3BlcmF0aW9uLCBzdWNoCisgICAgICogICAgICAgIHBpdm90IHBvaW50cyBiZWluZyByb3RhdGVkIG9yIHNjYWxlZCBhcm91bmQuCisgICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBhbmltYXRpb24gaXMgc3RpbGwgcnVubmluZworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldFRyYW5zZm9ybWF0aW9uKGxvbmcgY3VycmVudFRpbWUsIFRyYW5zZm9ybWF0aW9uIG91dFRyYW5zZm9ybWF0aW9uLAorICAgICAgICAgICAgZmxvYXQgc2NhbGUpIHsKKyAgICAgICAgbVNjYWxlRmFjdG9yID0gc2NhbGU7CisgICAgICAgIHJldHVybiBnZXRUcmFuc2Zvcm1hdGlvbihjdXJyZW50VGltZSwgb3V0VHJhbnNmb3JtYXRpb24pOworICAgIH0KIAogICAgIC8qKgogICAgICAqIDxwPkluZGljYXRlcyB3aGV0aGVyIHRoaXMgYW5pbWF0aW9uIGhhcyBzdGFydGVkIG9yIG5vdC48L3A+CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2FuaW1hdGlvbi9BbmltYXRpb25TZXQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvYW5pbWF0aW9uL0FuaW1hdGlvblNldC5qYXZhCmluZGV4IDE1NDZkY2QuLjg3M2NlNTMgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvYW5pbWF0aW9uL0FuaW1hdGlvblNldC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvYW5pbWF0aW9uL0FuaW1hdGlvblNldC5qYXZhCkBAIC0zMTIsNyArMzEyLDcgQEAKICAgICAgICAgICAgIGZpbmFsIEFuaW1hdGlvbiBhID0gYW5pbWF0aW9ucy5nZXQoaSk7CiAKICAgICAgICAgICAgIHRlbXAuY2xlYXIoKTsKLSAgICAgICAgICAgIG1vcmUgPSBhLmdldFRyYW5zZm9ybWF0aW9uKGN1cnJlbnRUaW1lLCB0ZW1wKSB8fCBtb3JlOworICAgICAgICAgICAgbW9yZSA9IGEuZ2V0VHJhbnNmb3JtYXRpb24oY3VycmVudFRpbWUsIHRlbXAsIGdldFNjYWxlRmFjdG9yKCkpIHx8IG1vcmU7CiAgICAgICAgICAgICB0LmNvbXBvc2UodGVtcCk7CiAKICAgICAgICAgICAgIHN0YXJ0ZWQgPSBzdGFydGVkIHx8IGEuaGFzU3RhcnRlZCgpOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hbmltYXRpb24vQW5pbWF0aW9uVXRpbHMuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvYW5pbWF0aW9uL0FuaW1hdGlvblV0aWxzLmphdmEKaW5kZXggMzA4ODM4Mi4uYzA5MGY4ZSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hbmltYXRpb24vQW5pbWF0aW9uVXRpbHMuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2FuaW1hdGlvbi9BbmltYXRpb25VdGlscy5qYXZhCkBAIC0zMyw2ICszMywxNCBAQAogICoKICAqLwogcHVibGljIGNsYXNzIEFuaW1hdGlvblV0aWxzIHsKKworICAgIC8qKgorICAgICAqIFRoZXNlIGZsYWdzIGFyZSB1c2VkIHdoZW4gcGFyc2luZyBTZXF1ZW5jZXIgb2JqZWN0cworICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUT0dFVEhFUiA9IDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNFUVVFTlRJQUxMWSA9IDE7CisKKwogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgYW5pbWF0aW9uIHRpbWUgaW4gbWlsbGlzZWNvbmRzLiBUaGlzIHRpbWUgc2hvdWxkIGJlIHVzZWQgd2hlbiBpbnZva2luZwogICAgICAqIHtAbGluayBBbmltYXRpb24jc2V0U3RhcnRUaW1lKGxvbmcpfS4gUmVmZXIgdG8ge0BsaW5rIGFuZHJvaWQub3MuU3lzdGVtQ2xvY2t9IGZvciBtb3JlCkBAIC00OSw3ICs1Nyw3IEBACiAKICAgICAvKioKICAgICAgKiBMb2FkcyBhbiB7QGxpbmsgQW5pbWF0aW9ufSBvYmplY3QgZnJvbSBhIHJlc291cmNlCi0gICAgICogCisgICAgICoKICAgICAgKiBAcGFyYW0gY29udGV4dCBBcHBsaWNhdGlvbiBjb250ZXh0IHVzZWQgdG8gYWNjZXNzIHJlc291cmNlcwogICAgICAqIEBwYXJhbSBpZCBUaGUgcmVzb3VyY2UgaWQgb2YgdGhlIGFuaW1hdGlvbiB0byBsb2FkCiAgICAgICogQHJldHVybiBUaGUgYW5pbWF0aW9uIG9iamVjdCByZWZlcmVuY2UgYnkgdGhlIHNwZWNpZmllZCBpZApAQCAtODIsMTIgKzkwLDEyIEBACiAKICAgICAgICAgcmV0dXJuIGNyZWF0ZUFuaW1hdGlvbkZyb21YbWwoYywgcGFyc2VyLCBudWxsLCBYbWwuYXNBdHRyaWJ1dGVTZXQocGFyc2VyKSk7CiAgICAgfQotICAgIAorCiAgICAgcHJpdmF0ZSBzdGF0aWMgQW5pbWF0aW9uIGNyZWF0ZUFuaW1hdGlvbkZyb21YbWwoQ29udGV4dCBjLCBYbWxQdWxsUGFyc2VyIHBhcnNlciwKICAgICAgICAgICAgIEFuaW1hdGlvblNldCBwYXJlbnQsIEF0dHJpYnV0ZVNldCBhdHRycykgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLSAgICAgICAgCisKICAgICAgICAgQW5pbWF0aW9uIGFuaW0gPSBudWxsOwotIAorCiAgICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBhcmUgb24gYSBzdGFydCB0YWcuCiAgICAgICAgIGludCB0eXBlOwogICAgICAgICBpbnQgZGVwdGggPSBwYXJzZXIuZ2V0RGVwdGgoKTsKQEAgLTEwMCw3ICsxMDgsNyBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBTdHJpbmcgIG5hbWUgPSBwYXJzZXIuZ2V0TmFtZSgpOwotICAgIAorCiAgICAgICAgICAgICBpZiAobmFtZS5lcXVhbHMoInNldCIpKSB7CiAgICAgICAgICAgICAgICAgYW5pbSA9IG5ldyBBbmltYXRpb25TZXQoYywgYXR0cnMpOwogICAgICAgICAgICAgICAgIGNyZWF0ZUFuaW1hdGlvbkZyb21YbWwoYywgcGFyc2VyLCAoQW5pbWF0aW9uU2V0KWFuaW0sIGF0dHJzKTsKQEAgLTEyMCw3ICsxMjgsNyBAQAogICAgICAgICAgICAgICAgIHBhcmVudC5hZGRBbmltYXRpb24oYW5pbSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAKKwogICAgICAgICByZXR1cm4gYW5pbTsKIAogICAgIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvYW5pbWF0aW9uL1JvdGF0ZUFuaW1hdGlvbi5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hbmltYXRpb24vUm90YXRlQW5pbWF0aW9uLmphdmEKaW5kZXggMjg0Y2NjZS4uNThiZjA4NCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hbmltYXRpb24vUm90YXRlQW5pbWF0aW9uLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hbmltYXRpb24vUm90YXRlQW5pbWF0aW9uLmphdmEKQEAgLTE0OCwxMSArMTQ4LDEyIEBACiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgYXBwbHlUcmFuc2Zvcm1hdGlvbihmbG9hdCBpbnRlcnBvbGF0ZWRUaW1lLCBUcmFuc2Zvcm1hdGlvbiB0KSB7CiAgICAgICAgIGZsb2F0IGRlZ3JlZXMgPSBtRnJvbURlZ3JlZXMgKyAoKG1Ub0RlZ3JlZXMgLSBtRnJvbURlZ3JlZXMpICogaW50ZXJwb2xhdGVkVGltZSk7Ci0KKyAgICAgICAgZmxvYXQgc2NhbGUgPSBnZXRTY2FsZUZhY3RvcigpOworICAgICAgICAKICAgICAgICAgaWYgKG1QaXZvdFggPT0gMC4wZiAmJiBtUGl2b3RZID09IDAuMGYpIHsKICAgICAgICAgICAgIHQuZ2V0TWF0cml4KCkuc2V0Um90YXRlKGRlZ3JlZXMpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdC5nZXRNYXRyaXgoKS5zZXRSb3RhdGUoZGVncmVlcywgbVBpdm90WCwgbVBpdm90WSk7CisgICAgICAgICAgICB0LmdldE1hdHJpeCgpLnNldFJvdGF0ZShkZWdyZWVzLCBtUGl2b3RYICogc2NhbGUsIG1QaXZvdFkgKiBzY2FsZSk7CiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvYW5pbWF0aW9uL1NjYWxlQW5pbWF0aW9uLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2FuaW1hdGlvbi9TY2FsZUFuaW1hdGlvbi5qYXZhCmluZGV4IDFhNTZjOGIuLjg1MzdkNDIgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvYW5pbWF0aW9uL1NjYWxlQW5pbWF0aW9uLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hbmltYXRpb24vU2NhbGVBbmltYXRpb24uamF2YQpAQCAtMTYxLDYgKzE2MSw3IEBACiAgICAgcHJvdGVjdGVkIHZvaWQgYXBwbHlUcmFuc2Zvcm1hdGlvbihmbG9hdCBpbnRlcnBvbGF0ZWRUaW1lLCBUcmFuc2Zvcm1hdGlvbiB0KSB7CiAgICAgICAgIGZsb2F0IHN4ID0gMS4wZjsKICAgICAgICAgZmxvYXQgc3kgPSAxLjBmOworICAgICAgICBmbG9hdCBzY2FsZSA9IGdldFNjYWxlRmFjdG9yKCk7CiAKICAgICAgICAgaWYgKG1Gcm9tWCAhPSAxLjBmIHx8IG1Ub1ggIT0gMS4wZikgewogICAgICAgICAgICAgc3ggPSBtRnJvbVggKyAoKG1Ub1ggLSBtRnJvbVgpICogaW50ZXJwb2xhdGVkVGltZSk7CkBAIC0xNzIsNyArMTczLDcgQEAKICAgICAgICAgaWYgKG1QaXZvdFggPT0gMCAmJiBtUGl2b3RZID09IDApIHsKICAgICAgICAgICAgIHQuZ2V0TWF0cml4KCkuc2V0U2NhbGUoc3gsIHN5KTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHQuZ2V0TWF0cml4KCkuc2V0U2NhbGUoc3gsIHN5LCBtUGl2b3RYLCBtUGl2b3RZKTsKKyAgICAgICAgICAgIHQuZ2V0TWF0cml4KCkuc2V0U2NhbGUoc3gsIHN5LCBzY2FsZSAqIG1QaXZvdFgsIHNjYWxlICogbVBpdm90WSk7CiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvaW5wdXRtZXRob2QvSW5wdXRNZXRob2RJbmZvLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2lucHV0bWV0aG9kL0lucHV0TWV0aG9kSW5mby5qYXZhCmluZGV4IDM1N2NiNWZlLi42OGUyMzFjIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2lucHV0bWV0aG9kL0lucHV0TWV0aG9kSW5mby5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvaW5wdXRtZXRob2QvSW5wdXRNZXRob2RJbmZvLmphdmEKQEAgLTM3LDYgKzM3LDcgQEAKIGltcG9ydCBhbmRyb2lkLnV0aWwuWG1sOwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogCiAvKioKICAqIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBzcGVjaWZ5IG1ldGEgaW5mb3JtYXRpb24gb2YgYW4gaW5wdXQgbWV0aG9kLgpAQCAtNjgsNyArNjksMTA4IEBACiAgICAgICogY2FuIGNoYW5nZSBiYXNlZCBvbiB0aGUgY29uZmlndXJhdGlvbiAoaW4gcGFydGljdWxhciBsb2NhbGUpLgogICAgICAqLwogICAgIGZpbmFsIGludCBtSXNEZWZhdWx0UmVzSWQ7Ci0gICAgCisKKyAgICAvKioKKyAgICAgKiBJbnB1dE1ldGhvZFN1YnR5cGUgaXMgYSBzdWJ0eXBlIGNvbnRhaW5lZCBpbiB0aGUgaW5wdXQgbWV0aG9kLiBTdWJ0eXBlIGNhbiBkZXNjcmliZQorICAgICAqIGxvY2FsZXMgKGUuZy4gZW5fVVMsIGZyX0ZSLi4uKSBhbmQgbW9kZXMgKGUuZy4gdm9pY2UsIGtleWJvYXJkLi4uKSwgYW5kIGlzIHVzZWQgZm9yCisgICAgICogSU1FIHN3aXRjaC4gVGhlIHN1YnR5cGUgYWxsb3dzIHRoZSBzeXN0ZW0gdG8gY2FsbCB0aGUgc3BlY2lmaWVkIHN1YnR5cGUgb2YgSU1FIGRpcmVjdGx5LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSW5wdXRNZXRob2RTdWJ0eXBlIGltcGxlbWVudHMgUGFyY2VsYWJsZSB7CisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1TdWJ0eXBlTmFtZTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbVN1YnR5cGVJY29uSWQ7CisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1TdWJ0eXBlTG9jYWxlOworICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtU3VidHlwZU1vZGU7CisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1TdWJ0eXBlRXh0cmFWYWx1ZTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ29uc3RydWN0b3IKKyAgICAgICAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIHN1YnR5cGUKKyAgICAgICAgICogQHBhcmFtIGljb25JZCBUaGUgaWNvbiBvZiB0aGUgc3VidHlwZQorICAgICAgICAgKiBAcGFyYW0gbG9jYWxlIFRoZSBsb2NhbGUgc3VwcG9ydGVkIGJ5IHRoZSBzdWJ0eXBlCisgICAgICAgICAqIEBwYXJhbSBtb2RlIFRoZSBtb2RlIHN1cHBvcnRlZCBieSB0aGUgc3VidHlwZQorICAgICAgICAgKiBAcGFyYW0gZXh0cmFWYWx1ZSBUaGUgZXh0cmEgdmFsdWUgb2YgdGhlIHN1YnR5cGUKKyAgICAgICAgICovCisgICAgICAgIElucHV0TWV0aG9kU3VidHlwZShTdHJpbmcgbmFtZSwgaW50IGljb25JZCwgU3RyaW5nIGxvY2FsZSwgU3RyaW5nIG1vZGUsCisgICAgICAgICAgICAgICAgU3RyaW5nIGV4dHJhVmFsdWUpIHsKKyAgICAgICAgICAgIG1TdWJ0eXBlTmFtZSA9IG5hbWU7CisgICAgICAgICAgICBtU3VidHlwZUljb25JZCA9IGljb25JZDsKKyAgICAgICAgICAgIG1TdWJ0eXBlTG9jYWxlID0gbG9jYWxlOworICAgICAgICAgICAgbVN1YnR5cGVNb2RlID0gbW9kZTsKKyAgICAgICAgICAgIG1TdWJ0eXBlRXh0cmFWYWx1ZSA9IGV4dHJhVmFsdWU7CisgICAgICAgIH0KKworICAgICAgICBJbnB1dE1ldGhvZFN1YnR5cGUoUGFyY2VsIHNvdXJjZSkgeworICAgICAgICAgICAgbVN1YnR5cGVOYW1lID0gc291cmNlLnJlYWRTdHJpbmcoKTsKKyAgICAgICAgICAgIG1TdWJ0eXBlSWNvbklkID0gc291cmNlLnJlYWRJbnQoKTsKKyAgICAgICAgICAgIG1TdWJ0eXBlTG9jYWxlID0gc291cmNlLnJlYWRTdHJpbmcoKTsKKyAgICAgICAgICAgIG1TdWJ0eXBlTW9kZSA9IHNvdXJjZS5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgICBtU3VidHlwZUV4dHJhVmFsdWUgPSBzb3VyY2UucmVhZFN0cmluZygpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHN1YnR5cGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtU3VidHlwZU5hbWU7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQHJldHVybiB0aGUgaWNvbiBvZiB0aGUgc3VidHlwZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGludCBnZXRJY29uSWQoKSB7CisgICAgICAgICAgICByZXR1cm4gbVN1YnR5cGVJY29uSWQ7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQHJldHVybiB0aGUgbG9jYWxlIG9mIHRoZSBzdWJ0eXBlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldExvY2FsZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtU3VidHlwZUxvY2FsZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBAcmV0dXJuIHRoZSBtb2RlIG9mIHRoZSBzdWJ0eXBlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE1vZGUoKSB7CisgICAgICAgICAgICByZXR1cm4gbVN1YnR5cGVNb2RlOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEByZXR1cm4gdGhlIGV4dHJhIHZhbHVlIG9mIHRoZSBzdWJ0eXBlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEV4dHJhVmFsdWUoKSB7CisgICAgICAgICAgICByZXR1cm4gbVN1YnR5cGVFeHRyYVZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBkZXNjcmliZUNvbnRlbnRzKCkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZVRvUGFyY2VsKFBhcmNlbCBkZXN0LCBpbnQgcGFyY2VsYWJsZUZsYWdzKSB7CisgICAgICAgICAgICBkZXN0LndyaXRlU3RyaW5nKG1TdWJ0eXBlTmFtZSk7CisgICAgICAgICAgICBkZXN0LndyaXRlSW50KG1TdWJ0eXBlSWNvbklkKTsKKyAgICAgICAgICAgIGRlc3Qud3JpdGVTdHJpbmcobVN1YnR5cGVMb2NhbGUpOworICAgICAgICAgICAgZGVzdC53cml0ZVN0cmluZyhtU3VidHlwZU1vZGUpOworICAgICAgICAgICAgZGVzdC53cml0ZVN0cmluZyhtU3VidHlwZUV4dHJhVmFsdWUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBQYXJjZWxhYmxlLkNyZWF0b3I8SW5wdXRNZXRob2RTdWJ0eXBlPiBDUkVBVE9SCisgICAgICAgICAgICAgICAgPSBuZXcgUGFyY2VsYWJsZS5DcmVhdG9yPElucHV0TWV0aG9kU3VidHlwZT4oKSB7CisgICAgICAgICAgICBwdWJsaWMgSW5wdXRNZXRob2RTdWJ0eXBlIGNyZWF0ZUZyb21QYXJjZWwoUGFyY2VsIHNvdXJjZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSW5wdXRNZXRob2RTdWJ0eXBlKHNvdXJjZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBJbnB1dE1ldGhvZFN1YnR5cGVbXSBuZXdBcnJheShpbnQgc2l6ZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSW5wdXRNZXRob2RTdWJ0eXBlW3NpemVdOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBhcnJheSBvZiB0aGUgc3VidHlwZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8SW5wdXRNZXRob2RTdWJ0eXBlPiBtU3VidHlwZXMgPSBuZXcgQXJyYXlMaXN0PElucHV0TWV0aG9kU3VidHlwZT4oKTsKKwogICAgIC8qKgogICAgICAqIENvbnN0cnVjdG9yLgogICAgICAqIApAQCAtODEsMTEgKzE4MywxMSBAQAogICAgICAgICBtU2VydmljZSA9IHNlcnZpY2U7CiAgICAgICAgIFNlcnZpY2VJbmZvIHNpID0gc2VydmljZS5zZXJ2aWNlSW5mbzsKICAgICAgICAgbUlkID0gbmV3IENvbXBvbmVudE5hbWUoc2kucGFja2FnZU5hbWUsIHNpLm5hbWUpLmZsYXR0ZW5Ub1Nob3J0U3RyaW5nKCk7Ci0gICAgICAgIAorCiAgICAgICAgIFBhY2thZ2VNYW5hZ2VyIHBtID0gY29udGV4dC5nZXRQYWNrYWdlTWFuYWdlcigpOwogICAgICAgICBTdHJpbmcgc2V0dGluZ3NBY3Rpdml0eUNvbXBvbmVudCA9IG51bGw7CiAgICAgICAgIGludCBpc0RlZmF1bHRSZXNJZCA9IDA7Ci0gICAgICAgIAorCiAgICAgICAgIFhtbFJlc291cmNlUGFyc2VyIHBhcnNlciA9IG51bGw7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBwYXJzZXIgPSBzaS5sb2FkWG1sTWV0YURhdGEocG0sIElucHV0TWV0aG9kLlNFUlZJQ0VfTUVUQV9EQVRBKTsKQEAgLTExNiwxMyArMjE4LDM2IEBACiAgICAgICAgICAgICBpc0RlZmF1bHRSZXNJZCA9IHNhLmdldFJlc291cmNlSWQoCiAgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLklucHV0TWV0aG9kX2lzRGVmYXVsdCwgMCk7CiAgICAgICAgICAgICBzYS5yZWN5Y2xlKCk7CisKKyAgICAgICAgICAgIGZpbmFsIGludCBkZXB0aCA9IHBhcnNlci5nZXREZXB0aCgpOworICAgICAgICAgICAgLy8gUGFyc2UgYWxsIHN1YnR5cGVzCisgICAgICAgICAgICB3aGlsZSAoKCh0eXBlID0gcGFyc2VyLm5leHQoKSkgIT0gWG1sUHVsbFBhcnNlci5FTkRfVEFHIHx8IHBhcnNlci5nZXREZXB0aCgpID4gZGVwdGgpCisgICAgICAgICAgICAgICAgICAgICYmIHR5cGUgIT0gWG1sUHVsbFBhcnNlci5FTkRfRE9DVU1FTlQpIHsKKyAgICAgICAgICAgICAgICBub2RlTmFtZSA9IHBhcnNlci5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgaWYgKCEic3VidHlwZSIuZXF1YWxzKG5vZGVOYW1lKSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICJNZXRhLWRhdGEgaW4gaW5wdXQtbWV0aG9kIGRvZXMgbm90IHN0YXJ0IHdpdGggc3VidHlwZSB0YWciKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZmluYWwgVHlwZWRBcnJheSBhID0gcmVzLm9idGFpbkF0dHJpYnV0ZXMoCisgICAgICAgICAgICAgICAgICAgICAgICBhdHRycywgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuSW5wdXRNZXRob2RfU3VidHlwZSk7CisgICAgICAgICAgICAgICAgSW5wdXRNZXRob2RTdWJ0eXBlIHN1YnR5cGUgPSBuZXcgSW5wdXRNZXRob2RTdWJ0eXBlKAorICAgICAgICAgICAgICAgICAgICAgICAgYS5nZXRTdHJpbmcoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuSW5wdXRNZXRob2RfU3VidHlwZV9sYWJlbCksCisgICAgICAgICAgICAgICAgICAgICAgICBhLmdldFJlc291cmNlSWQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLklucHV0TWV0aG9kX1N1YnR5cGVfaWNvbiwgMCksCisgICAgICAgICAgICAgICAgICAgICAgICBhLmdldFN0cmluZyhjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuSW5wdXRNZXRob2RfU3VidHlwZV9pbWVTdWJ0eXBlTG9jYWxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGEuZ2V0U3RyaW5nKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5JbnB1dE1ldGhvZF9TdWJ0eXBlX2ltZVN1YnR5cGVNb2RlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGEuZ2V0U3RyaW5nKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5JbnB1dE1ldGhvZF9TdWJ0eXBlX2ltZVN1YnR5cGVFeHRyYVZhbHVlKSk7CisgICAgICAgICAgICAgICAgbVN1YnR5cGVzLmFkZChzdWJ0eXBlKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfSBjYXRjaCAoTmFtZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uKAogICAgICAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIGNyZWF0ZSBjb250ZXh0IGZvcjogIiArIHNpLnBhY2thZ2VOYW1lKTsKICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgIGlmIChwYXJzZXIgIT0gbnVsbCkgcGFyc2VyLmNsb3NlKCk7CiAgICAgICAgIH0KLSAgICAgICAgCiAgICAgICAgIG1TZXR0aW5nc0FjdGl2aXR5TmFtZSA9IHNldHRpbmdzQWN0aXZpdHlDb21wb25lbnQ7CiAgICAgICAgIG1Jc0RlZmF1bHRSZXNJZCA9IGlzRGVmYXVsdFJlc0lkOwogICAgIH0KQEAgLTEzMiw4ICsyNTcsOSBAQAogICAgICAgICBtU2V0dGluZ3NBY3Rpdml0eU5hbWUgPSBzb3VyY2UucmVhZFN0cmluZygpOwogICAgICAgICBtSXNEZWZhdWx0UmVzSWQgPSBzb3VyY2UucmVhZEludCgpOwogICAgICAgICBtU2VydmljZSA9IFJlc29sdmVJbmZvLkNSRUFUT1IuY3JlYXRlRnJvbVBhcmNlbChzb3VyY2UpOworICAgICAgICBzb3VyY2UucmVhZFR5cGVkTGlzdChtU3VidHlwZXMsIElucHV0TWV0aG9kU3VidHlwZS5DUkVBVE9SKTsKICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBUZW1wb3JhcnkgQVBJIGZvciBjcmVhdGluZyBhIGJ1aWx0LWluIGlucHV0IG1ldGhvZC4KICAgICAgKi8KQEAgLTE1Niw3ICsyODIsNyBAQAogICAgICAgICBtU2V0dGluZ3NBY3Rpdml0eU5hbWUgPSBzZXR0aW5nc0FjdGl2aXR5OwogICAgICAgICBtSXNEZWZhdWx0UmVzSWQgPSAwOwogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIFJldHVybiBhIHVuaXF1ZSBJRCBmb3IgdGhpcyBpbnB1dCBtZXRob2QuICBUaGUgSUQgaXMgZ2VuZXJhdGVkIGZyb20KICAgICAgKiB0aGUgcGFja2FnZSBhbmQgY2xhc3MgbmFtZSBpbXBsZW1lbnRpbmcgdGhlIG1ldGhvZC4KQEAgLTE2NCwxNCArMjkwLDE0IEBACiAgICAgcHVibGljIFN0cmluZyBnZXRJZCgpIHsKICAgICAgICAgcmV0dXJuIG1JZDsKICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBSZXR1cm4gdGhlIC5hcGsgcGFja2FnZSB0aGF0IGltcGxlbWVudHMgdGhpcyBpbnB1dCBtZXRob2QuCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpIHsKICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLnNlcnZpY2VJbmZvLnBhY2thZ2VOYW1lOwogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIFJldHVybiB0aGUgY2xhc3MgbmFtZSBvZiB0aGUgc2VydmljZSBjb21wb25lbnQgdGhhdCBpbXBsZW1lbnRzCiAgICAgICogdGhpcyBpbnB1dCBtZXRob2QuCkBAIC0xOTYsNyArMzIyLDcgQEAKICAgICAgICAgcmV0dXJuIG5ldyBDb21wb25lbnROYW1lKG1TZXJ2aWNlLnNlcnZpY2VJbmZvLnBhY2thZ2VOYW1lLAogICAgICAgICAgICAgICAgIG1TZXJ2aWNlLnNlcnZpY2VJbmZvLm5hbWUpOwogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIExvYWQgdGhlIHVzZXItZGlzcGxheWVkIGxhYmVsIGZvciB0aGlzIGlucHV0IG1ldGhvZC4KICAgICAgKiAKQEAgLTIwNiw3ICszMzIsNyBAQAogICAgIHB1YmxpYyBDaGFyU2VxdWVuY2UgbG9hZExhYmVsKFBhY2thZ2VNYW5hZ2VyIHBtKSB7CiAgICAgICAgIHJldHVybiBtU2VydmljZS5sb2FkTGFiZWwocG0pOwogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIExvYWQgdGhlIHVzZXItZGlzcGxheWVkIGljb24gZm9yIHRoaXMgaW5wdXQgbWV0aG9kLgogICAgICAqIApAQCAtMjE2LDcgKzM0Miw3IEBACiAgICAgcHVibGljIERyYXdhYmxlIGxvYWRJY29uKFBhY2thZ2VNYW5hZ2VyIHBtKSB7CiAgICAgICAgIHJldHVybiBtU2VydmljZS5sb2FkSWNvbihwbSk7CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogUmV0dXJuIHRoZSBjbGFzcyBuYW1lIG9mIGFuIGFjdGl2aXR5IHRoYXQgcHJvdmlkZXMgYSBzZXR0aW5ncyBVSSBmb3IKICAgICAgKiB0aGUgaW5wdXQgbWV0aG9kLiAgWW91IGNhbiBsYXVuY2ggdGhpcyBhY3Rpdml0eSBiZSBzdGFydGluZyBpdCB3aXRoCkBAIC0yMzAsNyArMzU2LDE0IEBACiAgICAgcHVibGljIFN0cmluZyBnZXRTZXR0aW5nc0FjdGl2aXR5KCkgewogICAgICAgICByZXR1cm4gbVNldHRpbmdzQWN0aXZpdHlOYW1lOwogICAgIH0KLSAgICAKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc3VidHlwZXMgb2YgSW5wdXQgTWV0aG9kLgorICAgICAqLworICAgIHB1YmxpYyBBcnJheUxpc3Q8SW5wdXRNZXRob2RTdWJ0eXBlPiBnZXRTdWJ0eXBlcygpIHsKKyAgICAgICAgcmV0dXJuIG1TdWJ0eXBlczsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBSZXR1cm4gdGhlIHJlc291cmNlIGlkZW50aWZpZXIgb2YgYSByZXNvdXJjZSBpbnNpZGUgb2YgdGhpcyBpbnB1dAogICAgICAqIG1ldGhvZCdzIC5hcGsgdGhhdCBkZXRlcm1pbmVzIHdoZXRoZXIgaXQgc2hvdWxkIGJlIGNvbnNpZGVyZWQgYQpAQCAtMjM5LDcgKzM3Miw3IEBACiAgICAgcHVibGljIGludCBnZXRJc0RlZmF1bHRSZXNvdXJjZUlkKCkgewogICAgICAgICByZXR1cm4gbUlzRGVmYXVsdFJlc0lkOwogICAgIH0KLSAgICAKKwogICAgIHB1YmxpYyB2b2lkIGR1bXAoUHJpbnRlciBwdywgU3RyaW5nIHByZWZpeCkgewogICAgICAgICBwdy5wcmludGxuKHByZWZpeCArICJtSWQ9IiArIG1JZAogICAgICAgICAgICAgICAgICsgIiBtU2V0dGluZ3NBY3Rpdml0eU5hbWU9IiArIG1TZXR0aW5nc0FjdGl2aXR5TmFtZSk7CkBAIC0yODUsMTIgKzQxOCwxNCBAQAogICAgICAgICBkZXN0LndyaXRlU3RyaW5nKG1TZXR0aW5nc0FjdGl2aXR5TmFtZSk7CiAgICAgICAgIGRlc3Qud3JpdGVJbnQobUlzRGVmYXVsdFJlc0lkKTsKICAgICAgICAgbVNlcnZpY2Uud3JpdGVUb1BhcmNlbChkZXN0LCBmbGFncyk7CisgICAgICAgIGRlc3Qud3JpdGVUeXBlZExpc3QobVN1YnR5cGVzKTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBVc2VkIHRvIG1ha2UgdGhpcyBjbGFzcyBwYXJjZWxhYmxlLgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUGFyY2VsYWJsZS5DcmVhdG9yPElucHV0TWV0aG9kSW5mbz4gQ1JFQVRPUiA9IG5ldyBQYXJjZWxhYmxlLkNyZWF0b3I8SW5wdXRNZXRob2RJbmZvPigpIHsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFBhcmNlbGFibGUuQ3JlYXRvcjxJbnB1dE1ldGhvZEluZm8+IENSRUFUT1IKKyAgICAgICAgICAgID0gbmV3IFBhcmNlbGFibGUuQ3JlYXRvcjxJbnB1dE1ldGhvZEluZm8+KCkgewogICAgICAgICBwdWJsaWMgSW5wdXRNZXRob2RJbmZvIGNyZWF0ZUZyb21QYXJjZWwoUGFyY2VsIHNvdXJjZSkgewogICAgICAgICAgICAgcmV0dXJuIG5ldyBJbnB1dE1ldGhvZEluZm8oc291cmNlKTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0FjY2Vzc2liaWxpdHlJbmplY3Rvci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0FjY2Vzc2liaWxpdHlJbmplY3Rvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5ZGRjMTkKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvQWNjZXNzaWJpbGl0eUluamVjdG9yLmphdmEKQEAgLTAsMCArMSw5OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC53ZWJraXQ7CisKK2ltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7CitpbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eUV2ZW50OworaW1wb3J0IGFuZHJvaWQud2Via2l0LldlYlZpZXdDb3JlLkV2ZW50SHViOworCisvKioKKyAqIFRoaXMgY2xhc3MgaW5qZWN0cyBhY2Nlc3NpYmlsaXR5IGludG8gV2ViVmlld3Mgd2l0aCBkaXNhYmxlZCBKYXZhU2NyaXB0IG9yCisgKiBXZWJWaWV3cyB3aXRoIGVuYWJsZWQgSmF2YVNjcmlwdCBidXQgZm9yIHdoaWNoIHdlIGhhdmUgbm8gYWNjZXNzaWJpbGl0eQorICogc2NyaXB0IHRvIGluamVjdC4KKyAqLworY2xhc3MgQWNjZXNzaWJpbGl0eUluamVjdG9yIHsKKworICAgIC8vIEhhbmRsZSB0byB0aGUgV2ViVmlldyB0aGlzIGluamVjdG9yIGlzIGFzc29jaWF0ZWQgd2l0aC4KKyAgICBwcml2YXRlIGZpbmFsIFdlYlZpZXcgbVdlYlZpZXc7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IGluamVjdG9yIGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIFZ3ZWJWaWV3LgorICAgICAqCisgICAgICogQHBhcmFtIHdlYlZpZXcgVGhlIGFzc29jaWF0ZWQgV2ViVmlldy4KKyAgICAgKi8KKyAgICBwdWJsaWMgQWNjZXNzaWJpbGl0eUluamVjdG9yKFdlYlZpZXcgd2ViVmlldykgeworICAgICAgICBtV2ViVmlldyA9IHdlYlZpZXc7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJvY2Vzc2VzIGEga2V5IGRvd24gPGNvZGU+ZXZlbnQ8L2NvZGU+LgorICAgICAqCisgICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBldmVudCB3YXMgcHJvY2Vzc2VkLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIG9uS2V5RXZlbnQoS2V5RXZlbnQgZXZlbnQpIHsKKworICAgICAgICAvLyBhcyBhIHByb29mIG9mIGNvbmNlcHQgbGV0IHVzIGRvIHRoZSBzaW1wbGVzdCBleGFtcGxlCisKKyAgICAgICAgaWYgKGV2ZW50LmdldEFjdGlvbigpICE9IEtleUV2ZW50LkFDVElPTl9VUCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgaW50IGtleUNvZGUgPSBldmVudC5nZXRLZXlDb2RlKCk7CisKKyAgICAgICAgc3dpdGNoIChrZXlDb2RlKSB7CisgICAgICAgICAgICBjYXNlIEtleUV2ZW50LktFWUNPREVfTjoKKyAgICAgICAgICAgICAgICBtb2RpZnlTZWxlY3Rpb24oImV4dGVuZCIsICJmb3J3YXJkIiwgInNlbnRlbmNlIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEtleUV2ZW50LktFWUNPREVfUDoKKyAgICAgICAgICAgICAgICBtb2RpZnlTZWxlY3Rpb24oImV4dGVuZCIsICJiYWNrd2FyZCIsICJzZW50ZW5jZSIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxlZCB3aGVuIHRoZSA8Y29kZT5zZWxlY3Rpb25TdHJpbmc8L2NvZGU+IGhhcyBjaGFuZ2VkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uU2VsZWN0aW9uU3RyaW5nQ2hhbmdlKFN0cmluZyBzZWxlY3Rpb25TdHJpbmcpIHsKKyAgICAgICAgLy8gcHV0IHRoZSBzZWxlY3Rpb24gc3RyaW5nIGluIGFuIEFjY2Vzc2liaWxpdHlFdmVudCBhbmQgc2VuZCBpdAorICAgICAgICBBY2Nlc3NpYmlsaXR5RXZlbnQgZXZlbnQgPSBBY2Nlc3NpYmlsaXR5RXZlbnQub2J0YWluKEFjY2Vzc2liaWxpdHlFdmVudC5UWVBFX1ZJRVdfRk9DVVNFRCk7CisgICAgICAgIGV2ZW50LmdldFRleHQoKS5hZGQoc2VsZWN0aW9uU3RyaW5nKTsKKyAgICAgICAgbVdlYlZpZXcuc2VuZEFjY2Vzc2liaWxpdHlFdmVudFVuY2hlY2tlZChldmVudCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTW9kaWZpZXMgdGhlIGN1cnJlbnQgc2VsZWN0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGFsdGVyIFNwZWNpZmllcyBob3cgdG8gYWx0ZXIgdGhlIHNlbGVjdGlvbi4KKyAgICAgKiBAcGFyYW0gZGlyZWN0aW9uIFRoZSBkaXJlY3Rpb24gaW4gd2hpY2ggdG8gYWx0ZXIgdGhlIHNlbGVjdGlvbi4KKyAgICAgKiBAcGFyYW0gZ3JhbnVsYXJpdHkgVGhlIGdyYW51bGFyaXR5IG9mIHRoZSBzZWxlY3Rpb24gbW9kaWZpY2F0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBtb2RpZnlTZWxlY3Rpb24oU3RyaW5nIGFsdGVyLCBTdHJpbmcgZGlyZWN0aW9uLCBTdHJpbmcgZ3JhbnVsYXJpdHkpIHsKKyAgICAgICAgV2ViVmlld0NvcmUgd2ViVmlld0NvcmUgPSBtV2ViVmlldy5nZXRXZWJWaWV3Q29yZSgpOworCisgICAgICAgIGlmICh3ZWJWaWV3Q29yZSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBXZWJWaWV3Q29yZS5Nb2RpZnlTZWxlY3Rpb25EYXRhIGRhdGEgPSBuZXcgV2ViVmlld0NvcmUuTW9kaWZ5U2VsZWN0aW9uRGF0YSgpOworICAgICAgICBkYXRhLm1BbHRlciA9IGFsdGVyOworICAgICAgICBkYXRhLm1EaXJlY3Rpb24gPSBkaXJlY3Rpb247CisgICAgICAgIGRhdGEubUdyYW51bGFyaXR5ID0gZ3JhbnVsYXJpdHk7CisgICAgICAgIHdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlKEV2ZW50SHViLk1PRElGWV9TRUxFQ1RJT04sIGRhdGEpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9Ccm93c2VyRnJhbWUuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9Ccm93c2VyRnJhbWUuamF2YQppbmRleCAyMTlhNDY5Li5lOTcyYzI0IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvQnJvd3NlckZyYW1lLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0Jyb3dzZXJGcmFtZS5qYXZhCkBAIC0zOCw2ICszOCw4IEBACiAKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0OwogCitpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwogaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKIGltcG9ydCBqYXZhLm5ldC5VUkxFbmNvZGVyOwpAQCAtNzIsNiArNzQsOCBAQAogICAgIC8vIHF1ZXVlIGhhcyBiZWVuIGNsZWFyZWQsdGhleSBhcmUgaWdub3JlZC4KICAgICBwcml2YXRlIGJvb2xlYW4gbUJsb2NrTWVzc2FnZXMgPSBmYWxzZTsKIAorICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBzRGF0YURpcmVjdG9yeSA9ICIiOworCiAgICAgLy8gSXMgdGhpcyBmcmFtZSB0aGUgbWFpbiBmcmFtZT8KICAgICBwcml2YXRlIGJvb2xlYW4gbUlzTWFpbkZyYW1lOwogCkBAIC0yMjQsNiArMjI4LDExIEBACiAgICAgICAgIEFzc2V0TWFuYWdlciBhbSA9IGNvbnRleHQuZ2V0QXNzZXRzKCk7CiAgICAgICAgIG5hdGl2ZUNyZWF0ZUZyYW1lKHcsIGFtLCBwcm94eS5nZXRCYWNrRm9yd2FyZExpc3QoKSk7CiAKKyAgICAgICAgaWYgKHNEYXRhRGlyZWN0b3J5Lmxlbmd0aCgpID09IDApIHsKKyAgICAgICAgICAgIFN0cmluZyBkaXIgPSBhcHBDb250ZXh0LmdldEZpbGVzRGlyKCkuZ2V0QWJzb2x1dGVQYXRoKCk7CisgICAgICAgICAgICBzRGF0YURpcmVjdG9yeSA9ICBkaXIuc3Vic3RyaW5nKDAsIGRpci5sYXN0SW5kZXhPZignLycpKTsKKyAgICAgICAgfQorCiAgICAgICAgIGlmIChEZWJ1Z0ZsYWdzLkJST1dTRVJfRlJBTUUpIHsKICAgICAgICAgICAgIExvZy52KExPR1RBRywgIkJyb3dzZXJGcmFtZSBjb25zdHJ1Y3RvcjogdGhpcz0iICsgdGhpcyk7CiAgICAgICAgIH0KQEAgLTI5NCw2ICszMDMsMTggQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBTYXZlcyB0aGUgY29udGVudHMgb2YgdGhlIGZyYW1lIGFzIGEgd2ViIGFyY2hpdmUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYmFzZW5hbWUgVGhlIGZpbGVuYW1lIHdoZXJlIHRoZSBhcmNoaXZlIHNob3VsZCBiZSBwbGFjZWQuCisgICAgICogQHBhcmFtIGF1dG9uYW1lIElmIGZhbHNlLCB0YWtlcyBmaWxlbmFtZSB0byBiZSBhIGZpbGUuIElmIHRydWUsIGZpbGVuYW1lCisgICAgICogICAgICAgICAgICAgICAgIGlzIGFzc3VtZWQgdG8gYmUgYSBkaXJlY3RvcnkgaW4gd2hpY2ggYSBmaWxlbmFtZSB3aWxsIGJlCisgICAgICogICAgICAgICAgICAgICAgIGNob3NlbiBhY2NvcmRpbmcgdG8gdGhlIHVybCBvZiB0aGUgY3VycmVudCBwYWdlLgorICAgICAqLworICAgIC8qIHBhY2thZ2UgKi8gU3RyaW5nIHNhdmVXZWJBcmNoaXZlKFN0cmluZyBiYXNlbmFtZSwgYm9vbGVhbiBhdXRvbmFtZSkgeworICAgICAgICByZXR1cm4gbmF0aXZlU2F2ZVdlYkFyY2hpdmUoYmFzZW5hbWUsIGF1dG9uYW1lKTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBHbyBiYWNrIG9yIGZvcndhcmQgdGhlIG51bWJlciBvZiBzdGVwcyBnaXZlbi4KICAgICAgKiBAcGFyYW0gc3RlcHMgQSBuZWdhdGl2ZSBvciBwb3NpdGl2ZSBudW1iZXIgaW5kaWNhdGluZyB0aGUgZGlyZWN0aW9uCiAgICAgICogICAgICAgICAgICAgIGFuZCBudW1iZXIgb2Ygc3RlcHMgdG8gbW92ZS4KQEAgLTUxMCwxMiArNTMxLDIxIEBACiAgICAgcHJpdmF0ZSBuYXRpdmUgU3RyaW5nIGV4dGVybmFsUmVwcmVzZW50YXRpb24oKTsKIAogICAgIC8qKgotICAgICAqIFJldHJpZXZlcyB0aGUgdmlzdWFsIHRleHQgb2YgdGhlIGN1cnJlbnQgZnJhbWUsIHB1dHMgaXQgYXMgdGhlIG9iamVjdCBmb3IKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIHZpc3VhbCB0ZXh0IG9mIHRoZSBmcmFtZXMsIHB1dHMgaXQgYXMgdGhlIG9iamVjdCBmb3IKICAgICAgKiB0aGUgbWVzc2FnZSBhbmQgc2VuZHMgdGhlIG1lc3NhZ2UuCiAgICAgICogQHBhcmFtIGNhbGxiYWNrIHRoZSBtZXNzYWdlIHRvIHVzZSB0byBzZW5kIHRoZSB2aXN1YWwgdGV4dAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGRvY3VtZW50QXNUZXh0KE1lc3NhZ2UgY2FsbGJhY2spIHsKLSAgICAgICAgY2FsbGJhY2sub2JqID0gZG9jdW1lbnRBc1RleHQoKTs7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgdGV4dCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIGlmIChjYWxsYmFjay5hcmcxICE9IDApIHsKKyAgICAgICAgICAgIC8vIER1bXAgdG9wIGZyYW1lIGFzIHRleHQuCisgICAgICAgICAgICB0ZXh0LmFwcGVuZChkb2N1bWVudEFzVGV4dCgpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY2FsbGJhY2suYXJnMiAhPSAwKSB7CisgICAgICAgICAgICAvLyBEdW1wIGNoaWxkIGZyYW1lcyBhcyB0ZXh0LgorICAgICAgICAgICAgdGV4dC5hcHBlbmQoY2hpbGRGcmFtZXNBc1RleHQoKSk7CisgICAgICAgIH0KKyAgICAgICAgY2FsbGJhY2sub2JqID0gdGV4dC50b1N0cmluZygpOwogICAgICAgICBjYWxsYmFjay5zZW5kVG9UYXJnZXQoKTsKICAgICB9CiAKQEAgLTUyNCw2ICs1NTQsMTEgQEAKICAgICAgKi8KICAgICBwcml2YXRlIG5hdGl2ZSBTdHJpbmcgZG9jdW1lbnRBc1RleHQoKTsKIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdGV4dCBkcmF3biBvbiB0aGUgY2hpbGQgZnJhbWVzIGFzIGEgc3RyaW5nCisgICAgICovCisgICAgcHJpdmF0ZSBuYXRpdmUgU3RyaW5nIGNoaWxkRnJhbWVzQXNUZXh0KCk7CisKICAgICAvKgogICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSBXZWJDb3JlIHRvIGluZm9ybSB0aGUgZnJhbWUgdGhhdAogICAgICAqIHRoZSBKYXZhc2NyaXB0IHdpbmRvdyBvYmplY3QgaGFzIGJlZW4gY2xlYXJlZC4KQEAgLTYxNyw2ICs2NTIsMTA0IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogQ2FsbGVkIGJ5IEpOSS4gR2V0cyB0aGUgYXBwbGljYXRpb25zIGRhdGEgZGlyZWN0b3J5CisgICAgICogQHJldHVybiBTdHJpbmcgVGhlIGFwcGxpY2F0aW9ucyBkYXRhIGRpcmVjdG9yeQorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXREYXRhRGlyZWN0b3J5KCkgeworICAgICAgICByZXR1cm4gc0RhdGFEaXJlY3Rvcnk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIGJ5IEpOSS4KKyAgICAgKiBSZWFkIGZyb20gYW4gSW5wdXRTdHJlYW0gaW50byBhIHN1cHBsaWVkIGJ5dGVbXQorICAgICAqIFRoaXMgbWV0aG9kIGNhdGNoZXMgYW55IGV4Y2VwdGlvbnMgc28gdGhleSBkb24ndCBjcmFzaCB0aGUgSlZNLgorICAgICAqIEBwYXJhbSBpbnB1dFN0cmVhbSBJbnB1dFN0cmVhbSB0byByZWFkIGZyb20uCisgICAgICogQHBhcmFtIG91dHB1dCBCeXRlYXJyYXkgdGhhdCBnZXRzIHRoZSBvdXRwdXQuCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQsIG9yIC1pIGlmIHRoZW4gZW5kIG9mIHN0cmVhbSBoYXMgYmVlbiByZWFjaGVkCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IHJlYWRGcm9tU3RyZWFtKElucHV0U3RyZWFtIGlucHV0U3RyZWFtLCBieXRlW10gb3V0cHV0KSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gaW5wdXRTdHJlYW0ucmVhZChvdXRwdXQpOworICAgICAgICB9IGNhdGNoKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gSWYgd2UgZ2V0IGFuIGV4Y2VwdGlvbiwgcmV0dXJuIGVuZCBvZiBzdHJlYW0KKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgSW5wdXRTdHJlYW0gZm9yIGFuIEFuZHJvaWQgcmVzb3VyY2UKKyAgICAgKiBUaGVyZSBhcmUgdGhyZWUgZGlmZmVyZW50IGtpbmRzIG9mIGFuZHJvaWQgcmVzb3VyY2VzOgorICAgICAqIC0gZmlsZTovLy9hbmRyb2lkX3JlcworICAgICAqIC0gZmlsZTovLy9hbmRyb2lkX2Fzc2V0CisgICAgICogLSBjb250ZW50Oi8vCisgICAgICogQHBhcmFtIHVybCBUaGUgdXJsIHRvIGxvYWQuCisgICAgICogQHJldHVybiBBbiBJbnB1dFN0cmVhbSB0byB0aGUgYW5kcm9pZCByZXNvdXJjZQorICAgICAqLworICAgIHByaXZhdGUgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW1Gb3JBbmRyb2lkUmVzb3VyY2UoU3RyaW5nIHVybCwgaW50IHR5cGUpIHsKKyAgICAgICAgZmluYWwgaW50IFJFU09VUkNFID0gMTsKKyAgICAgICAgZmluYWwgaW50IEFTU0VUID0gMjsKKyAgICAgICAgZmluYWwgaW50IENPTlRFTlQgPSAzOworCisgICAgICAgIGlmICh0eXBlID09IFJFU09VUkNFKSB7CisgICAgICAgICAgICAvLyBmaWxlOi8vL2FuZHJvaWRfcmVzCisgICAgICAgICAgICBpZiAodXJsID09IG51bGwgfHwgdXJsLmxlbmd0aCgpID09IDApIHsKKyAgICAgICAgICAgICAgICBMb2cuZShMT0dUQUcsICJ1cmwgaGFzIGxlbmd0aCAwICIgKyB1cmwpOworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50IHNsYXNoID0gdXJsLmluZGV4T2YoJy8nKTsKKyAgICAgICAgICAgIGludCBkb3QgPSB1cmwuaW5kZXhPZignLicsIHNsYXNoKTsKKyAgICAgICAgICAgIGlmIChzbGFzaCA9PSAtMSB8fCBkb3QgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICBMb2cuZShMT0dUQUcsICJJbmNvcnJlY3QgcmVzIHBhdGg6ICIgKyB1cmwpOworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU3RyaW5nIHN1YkNsYXNzTmFtZSA9IHVybC5zdWJzdHJpbmcoMCwgc2xhc2gpOworICAgICAgICAgICAgU3RyaW5nIGZpZWxkTmFtZSA9IHVybC5zdWJzdHJpbmcoc2xhc2ggKyAxLCBkb3QpOworICAgICAgICAgICAgU3RyaW5nIGVycm9yTXNnID0gbnVsbDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgZmluYWwgQ2xhc3M8Pz4gZCA9IG1Db250ZXh0LmdldEFwcGxpY2F0aW9uQ29udGV4dCgpCisgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Q2xhc3NMb2FkZXIoKS5sb2FkQ2xhc3MoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LmdldFBhY2thZ2VOYW1lKCkgKyAiLlIkIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc3ViQ2xhc3NOYW1lKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZCBmaWVsZCA9IGQuZ2V0RmllbGQoZmllbGROYW1lKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgaWQgPSBmaWVsZC5nZXRJbnQobnVsbCk7CisgICAgICAgICAgICAgICAgVHlwZWRWYWx1ZSB2YWx1ZSA9IG5ldyBUeXBlZFZhbHVlKCk7CisgICAgICAgICAgICAgICAgbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0VmFsdWUoaWQsIHZhbHVlLCB0cnVlKTsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUudHlwZSA9PSBUeXBlZFZhbHVlLlRZUEVfU1RSSU5HKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtQ29udGV4dC5nZXRBc3NldHMoKS5vcGVuTm9uQXNzZXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUuYXNzZXRDb29raWUsIHZhbHVlLnN0cmluZy50b1N0cmluZygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFzc2V0TWFuYWdlci5BQ0NFU1NfU1RSRUFNSU5HKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBPbGQgc3RhY2sgb25seSBzdXBwb3J0cyBUWVBFX1NUUklORyBmb3IgcmVzIGZpbGVzCisgICAgICAgICAgICAgICAgICAgIExvZy5lKExPR1RBRywgIm5vdCBvZiB0eXBlIHN0cmluZzogIiArIHVybCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLmUoTE9HVEFHLCAiRXhjZXB0aW9uOiAiICsgdXJsKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gQVNTRVQpIHsKKyAgICAgICAgICAgIC8vIGZpbGU6Ly8vYW5kcm9pZF9hc3NldAorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBBc3NldE1hbmFnZXIgYXNzZXRzID0gbUNvbnRleHQuZ2V0QXNzZXRzKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGFzc2V0cy5vcGVuKHVybCwgQXNzZXRNYW5hZ2VyLkFDQ0VTU19TVFJFQU1JTkcpOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gQ09OVEVOVCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBVcmkgdXJpID0gVXJpLnBhcnNlKHVybCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLm9wZW5JbnB1dFN0cmVhbSh1cmkpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cuZShMT0dUQUcsICJFeGNlcHRpb246ICIgKyB1cmwpOworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKICAgICAgKiBTdGFydCBsb2FkaW5nIGEgcmVzb3VyY2UuCiAgICAgICogQHBhcmFtIGxvYWRlckhhbmRsZSBUaGUgbmF0aXZlIFJlc291cmNlTG9hZGVyIHRoYXQgaXMgdGhlIHRhcmdldCBvZiB0aGUKICAgICAgKiAgICAgICAgICAgICAgICAgICAgIGRhdGEuCkBAIC03ODUsMTEgKzkxOCw3IEBACiAgICAgICogQHJldHVybiBUaGUgQnJvd3NlckZyYW1lIG9iamVjdCBzdG9yZWQgaW4gdGhlIG5ldyBXZWJWaWV3LgogICAgICAqLwogICAgIHByaXZhdGUgQnJvd3NlckZyYW1lIGNyZWF0ZVdpbmRvdyhib29sZWFuIGRpYWxvZywgYm9vbGVhbiB1c2VyR2VzdHVyZSkgewotICAgICAgICBXZWJWaWV3IHcgPSBtQ2FsbGJhY2tQcm94eS5jcmVhdGVXaW5kb3coZGlhbG9nLCB1c2VyR2VzdHVyZSk7Ci0gICAgICAgIGlmICh3ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiB3LmdldFdlYlZpZXdDb3JlKCkuZ2V0QnJvd3NlckZyYW1lKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIHJldHVybiBtQ2FsbGJhY2tQcm94eS5jcmVhdGVXaW5kb3coZGlhbG9nLCB1c2VyR2VzdHVyZSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC04NDYsNiArOTc1LDcgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRklMRV9VUExPQURfTEFCRUwgPSA0OwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRVNFVF9MQUJFTCA9IDU7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNVQk1JVF9MQUJFTCA9IDY7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZJTEVfVVBMT0FEX05PX0ZJTEVfQ0hPU0VOID0gNzsKIAogICAgIFN0cmluZyBnZXRSYXdSZXNGaWxlbmFtZShpbnQgaWQpIHsKICAgICAgICAgaW50IHJlc2lkOwpAQCAtODc1LDYgKzEwMDUsMTAgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0U3RyaW5nKAogICAgICAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcuc3VibWl0KTsKIAorICAgICAgICAgICAgY2FzZSBGSUxFX1VQTE9BRF9OT19GSUxFX0NIT1NFTjoKKyAgICAgICAgICAgICAgICByZXR1cm4gbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0U3RyaW5nKAorICAgICAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcubm9fZmlsZV9jaG9zZW4pOworCiAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgIExvZy5lKExPR1RBRywgImdldFJhd1Jlc0ZpbGVuYW1lIGdvdCBpbmNvbXBhdGlibGUgcmVzb3VyY2UgSUQiKTsKICAgICAgICAgICAgICAgICByZXR1cm4gIiI7CkBAIC0xMDEwLDUgKzExNDQsNyBAQAogICAgICAqLwogICAgIHByaXZhdGUgbmF0aXZlIEhhc2hNYXAgZ2V0Rm9ybVRleHREYXRhKCk7CiAKKyAgICBwcml2YXRlIG5hdGl2ZSBTdHJpbmcgbmF0aXZlU2F2ZVdlYkFyY2hpdmUoU3RyaW5nIGJhc2VuYW1lLCBib29sZWFuIGF1dG9uYW1lKTsKKwogICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbmF0aXZlT3JpZW50YXRpb25DaGFuZ2VkKGludCBvcmllbnRhdGlvbik7CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvQ2FsbGJhY2tQcm94eS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0NhbGxiYWNrUHJveHkuamF2YQppbmRleCAwZTBlMDMyLi4xYjU2NTFiIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvQ2FsbGJhY2tQcm94eS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9DYWxsYmFja1Byb3h5LmphdmEKQEAgLTE2LDYgKzE2LDcgQEAKIAogcGFja2FnZSBhbmRyb2lkLndlYmtpdDsKIAoraW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OwogaW1wb3J0IGFuZHJvaWQuYXBwLkFsZXJ0RGlhbG9nOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5BY3Rpdml0eU5vdEZvdW5kRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwpAQCAtNDEsNiArNDIsNyBAQAogaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5ldC5VUkw7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKIAogLyoqCiAgKiBUaGlzIGNsYXNzIGlzIGEgcHJveHkgY2xhc3MgZm9yIGhhbmRsaW5nIFdlYkNvcmUgLT4gVUkgdGhyZWFkIG1lc3NhZ2luZy4gQWxsCkBAIC0xMTIsNiArMTE0LDcgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQUREX0hJU1RPUllfSVRFTSAgICAgICAgICAgICAgICAgICAgPSAxMzU7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEhJU1RPUllfSU5ERVhfQ0hBTkdFRCAgICAgICAgICAgICAgID0gMTM2OwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBVVRIX0NSRURFTlRJQUxTICAgICAgICAgICAgICAgICAgICA9IDEzNzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0VUX0lOU1RBTExBQkxFX1dFQkFQUCAgICAgICAgICAgICAgPSAxMzg7CiAKICAgICAvLyBNZXNzYWdlIHRyaWdnZXJlZCBieSB0aGUgY2xpZW50IHRvIHJlc3VtZSBleGVjdXRpb24KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTk9USUZZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMDA7CkBAIC01MDAsMTggKzUwMywzMiBAQAogICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdXJsID0gbXNnLmdldERhdGEoKS5nZXRTdHJpbmcoInVybCIpOwogICAgICAgICAgICAgICAgICAgICBpZiAoIW1XZWJDaHJvbWVDbGllbnQub25Kc0FsZXJ0KG1XZWJWaWV3LCB1cmwsIG1lc3NhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gb25seSBkaXNwbGF5IHRoZSBhbGVydCBkaWFsb2cgaWYgdGhlIG1Db250ZXh0IGlzCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBBY3Rpdml0eSBhbmQgaXRzIHdpbmRvdyBoYXMgdGhlIGZvY3VzLgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEobUNvbnRleHQgaW5zdGFuY2VvZiBBY3Rpdml0eSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgISgoQWN0aXZpdHkpIG1Db250ZXh0KS5oYXNXaW5kb3dGb2N1cygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzLmNhbmNlbCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcy5zZXRSZWFkeSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFsZXJ0RGlhbG9nLkJ1aWxkZXIobUNvbnRleHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRUaXRsZShnZXRKc0RpYWxvZ1RpdGxlKHVybCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRNZXNzYWdlKG1lc3NhZ2UpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRQb3NpdGl2ZUJ1dHRvbihSLnN0cmluZy5vaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQWxlcnREaWFsb2cuT25DbGlja0xpc3RlbmVyKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBEaWFsb2dJbnRlcmZhY2UuT25DbGlja0xpc3RlbmVyKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpYWxvZ0ludGVyZmFjZSBkaWFsb2csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdoaWNoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXMuY29uZmlybSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldENhbmNlbGFibGUoZmFsc2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRPbkNhbmNlbExpc3RlbmVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBEaWFsb2dJbnRlcmZhY2UuT25DYW5jZWxMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25DYW5jZWwoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlhbG9nSW50ZXJmYWNlIGRpYWxvZykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzLmNhbmNlbCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNob3coKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICByZXMuc2V0UmVhZHkoKTsKQEAgLTUyNSw2ICs1NDIsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHVybCA9IG1zZy5nZXREYXRhKCkuZ2V0U3RyaW5nKCJ1cmwiKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKCFtV2ViQ2hyb21lQ2xpZW50Lm9uSnNDb25maXJtKG1XZWJWaWV3LCB1cmwsIG1lc3NhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gb25seSBkaXNwbGF5IHRoZSBhbGVydCBkaWFsb2cgaWYgdGhlIG1Db250ZXh0IGlzCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBBY3Rpdml0eSBhbmQgaXRzIHdpbmRvdyBoYXMgdGhlIGZvY3VzLgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEobUNvbnRleHQgaW5zdGFuY2VvZiBBY3Rpdml0eSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgISgoQWN0aXZpdHkpIG1Db250ZXh0KS5oYXNXaW5kb3dGb2N1cygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzLmNhbmNlbCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcy5zZXRSZWFkeSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFsZXJ0RGlhbG9nLkJ1aWxkZXIobUNvbnRleHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRUaXRsZShnZXRKc0RpYWxvZ1RpdGxlKHVybCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRNZXNzYWdlKG1lc3NhZ2UpCkBAIC01NjUsNiArNTkwLDE0IEBACiAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB1cmwgPSBtc2cuZ2V0RGF0YSgpLmdldFN0cmluZygidXJsIik7CiAgICAgICAgICAgICAgICAgICAgIGlmICghbVdlYkNocm9tZUNsaWVudC5vbkpzUHJvbXB0KG1XZWJWaWV3LCB1cmwsIG1lc3NhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRWYWwsIHJlcykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9ubHkgZGlzcGxheSB0aGUgYWxlcnQgZGlhbG9nIGlmIHRoZSBtQ29udGV4dCBpcworICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWN0aXZpdHkgYW5kIGl0cyB3aW5kb3cgaGFzIHRoZSBmb2N1cy4KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKG1Db250ZXh0IGluc3RhbmNlb2YgQWN0aXZpdHkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICEoKEFjdGl2aXR5KSBtQ29udGV4dCkuaGFzV2luZG93Rm9jdXMoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcy5jYW5jZWwoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXMuc2V0UmVhZHkoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIExheW91dEluZmxhdGVyIGZhY3RvcnkgPSBMYXlvdXRJbmZsYXRlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZnJvbShtQ29udGV4dCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBWaWV3IHZpZXcgPSBmYWN0b3J5LmluZmxhdGUoUi5sYXlvdXQuanNfcHJvbXB0LApAQCAtNjE2LDYgKzY0OSwxNCBAQAogICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdXJsID0gbXNnLmdldERhdGEoKS5nZXRTdHJpbmcoInVybCIpOwogICAgICAgICAgICAgICAgICAgICBpZiAoIW1XZWJDaHJvbWVDbGllbnQub25Kc0JlZm9yZVVubG9hZChtV2ViVmlldywgdXJsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UsIHJlcykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9ubHkgZGlzcGxheSB0aGUgYWxlcnQgZGlhbG9nIGlmIHRoZSBtQ29udGV4dCBpcworICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWN0aXZpdHkgYW5kIGl0cyB3aW5kb3cgaGFzIHRoZSBmb2N1cy4KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKG1Db250ZXh0IGluc3RhbmNlb2YgQWN0aXZpdHkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICEoKEFjdGl2aXR5KSBtQ29udGV4dCkuaGFzV2luZG93Rm9jdXMoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcy5jYW5jZWwoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXMuc2V0UmVhZHkoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtID0gbUNvbnRleHQuZ2V0U3RyaW5nKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSLnN0cmluZy5qc19kaWFsb2dfYmVmb3JlX3VubG9hZCwgbWVzc2FnZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQWxlcnREaWFsb2cuQnVpbGRlcihtQ29udGV4dCkKQEAgLTcyNSw3ICs3NjYsOCBAQAogCiAgICAgICAgICAgICBjYXNlIE9QRU5fRklMRV9DSE9PU0VSOgogICAgICAgICAgICAgICAgIGlmIChtV2ViQ2hyb21lQ2xpZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbVdlYkNocm9tZUNsaWVudC5vcGVuRmlsZUNob29zZXIoKFVwbG9hZEZpbGUpIG1zZy5vYmopOworICAgICAgICAgICAgICAgICAgICBVcGxvYWRGaWxlTWVzc2FnZURhdGEgZGF0YSA9IChVcGxvYWRGaWxlTWVzc2FnZURhdGEpbXNnLm9iajsKKyAgICAgICAgICAgICAgICAgICAgbVdlYkNocm9tZUNsaWVudC5vcGVuRmlsZUNob29zZXIoZGF0YS5nZXRVcGxvYWRGaWxlKCksIGRhdGEuZ2V0QWNjZXB0VHlwZSgpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAKQEAgLTc1MCw2ICs3OTIsOSBAQAogICAgICAgICAgICAgICAgIG1XZWJWaWV3LnNldEh0dHBBdXRoVXNlcm5hbWVQYXNzd29yZCgKICAgICAgICAgICAgICAgICAgICAgICAgIGhvc3QsIHJlYWxtLCB1c2VybmFtZSwgcGFzc3dvcmQpOwogICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTRVRfSU5TVEFMTEFCTEVfV0VCQVBQOgorICAgICAgICAgICAgICAgIG1XZWJDaHJvbWVDbGllbnQuc2V0SW5zdGFsbGFibGVXZWJBcHAoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTA4NywxMCArMTEzMiwxNSBAQAogICAgIHB1YmxpYyB2b2lkIG9uUHJvZ3Jlc3NDaGFuZ2VkKGludCBuZXdQcm9ncmVzcykgewogICAgICAgICAvLyBTeW5jaHJvbml6ZSBzbyB0aGF0IG1MYXRlc3RQcm9ncmVzcyBpcyB1cC10by1kYXRlLgogICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLSAgICAgICAgICAgIGlmIChtV2ViQ2hyb21lQ2xpZW50ID09IG51bGwgfHwgbUxhdGVzdFByb2dyZXNzID09IG5ld1Byb2dyZXNzKSB7CisgICAgICAgICAgICAvLyB1cGRhdGUgbUxhdGVzdFByb2dyZXNzIGV2ZW4gbVdlYkNocm9tZUNsaWVudCBpcyBudWxsIGFzCisgICAgICAgICAgICAvLyBXZWJWaWV3LmdldFByb2dyZXNzKCkgbmVlZHMgaXQKKyAgICAgICAgICAgIGlmIChtTGF0ZXN0UHJvZ3Jlc3MgPT0gbmV3UHJvZ3Jlc3MpIHsKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtTGF0ZXN0UHJvZ3Jlc3MgPSBuZXdQcm9ncmVzczsKKyAgICAgICAgICAgIGlmIChtV2ViQ2hyb21lQ2xpZW50ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoIW1Qcm9ncmVzc1VwZGF0ZVBlbmRpbmcpIHsKICAgICAgICAgICAgICAgICBzZW5kRW1wdHlNZXNzYWdlKFBST0dSRVNTKTsKICAgICAgICAgICAgICAgICBtUHJvZ3Jlc3NVcGRhdGVQZW5kaW5nID0gdHJ1ZTsKQEAgLTEwOTgsNyArMTE0OCw3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwdWJsaWMgV2ViVmlldyBjcmVhdGVXaW5kb3coYm9vbGVhbiBkaWFsb2csIGJvb2xlYW4gdXNlckdlc3R1cmUpIHsKKyAgICBwdWJsaWMgQnJvd3NlckZyYW1lIGNyZWF0ZVdpbmRvdyhib29sZWFuIGRpYWxvZywgYm9vbGVhbiB1c2VyR2VzdHVyZSkgewogICAgICAgICAvLyBEbyBhbiB1bnN5bmNocm9uaXplZCBxdWljayBjaGVjayB0byBhdm9pZCBwb3N0aW5nIGlmIG5vIGNhbGxiYWNrIGhhcwogICAgICAgICAvLyBiZWVuIHNldC4KICAgICAgICAgaWYgKG1XZWJDaHJvbWVDbGllbnQgPT0gbnVsbCkgewpAQCAtMTEyMiw5ICsxMTcyLDE1IEBACiAKICAgICAgICAgV2ViVmlldyB3ID0gdHJhbnNwb3J0LmdldFdlYlZpZXcoKTsKICAgICAgICAgaWYgKHcgIT0gbnVsbCkgewotICAgICAgICAgICAgdy5nZXRXZWJWaWV3Q29yZSgpLmluaXRpYWxpemVTdWJ3aW5kb3coKTsKKyAgICAgICAgICAgIFdlYlZpZXdDb3JlIGNvcmUgPSB3LmdldFdlYlZpZXdDb3JlKCk7CisgICAgICAgICAgICAvLyBJZiBXZWJWaWV3LmRlc3Ryb3koKSBoYXMgYmVlbiBjYWxsZWQsIGNvcmUgbWF5IGJlIG51bGwuICBTa2lwCisgICAgICAgICAgICAvLyBpbml0aWFsaXphdGlvbiBpbiB0aGF0IGNhc2UgYW5kIHJldHVybiBudWxsLgorICAgICAgICAgICAgaWYgKGNvcmUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGNvcmUuaW5pdGlhbGl6ZVN1YndpbmRvdygpOworICAgICAgICAgICAgICAgIHJldHVybiBjb3JlLmdldEJyb3dzZXJGcmFtZSgpOworICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIHJldHVybiB3OworICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBvblJlcXVlc3RGb2N1cygpIHsKQEAgLTExNjYsOSArMTIyMiw3IEBACiAgICAgICAgIC8vIGZvciBudWxsLgogICAgICAgICBXZWJIaXN0b3J5SXRlbSBpID0gbUJhY2tGb3J3YXJkTGlzdC5nZXRDdXJyZW50SXRlbSgpOwogICAgICAgICBpZiAoaSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAocHJlY29tcG9zZWQgfHwgaS5nZXRUb3VjaEljb25VcmwoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaS5zZXRUb3VjaEljb25VcmwodXJsKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGkuc2V0VG91Y2hJY29uVXJsKHVybCwgcHJlY29tcG9zZWQpOwogICAgICAgICB9CiAgICAgICAgIC8vIERvIGFuIHVuc3luY2hyb25pemVkIHF1aWNrIGNoZWNrIHRvIGF2b2lkIHBvc3RpbmcgaWYgbm8gY2FsbGJhY2sgaGFzCiAgICAgICAgIC8vIGJlZW4gc2V0LgpAQCAtMTQyNiw2ICsxNDgwLDI0IEBACiAgICAgICAgIHNlbmRNZXNzYWdlKG1zZyk7CiAgICAgfQogCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVXBsb2FkRmlsZU1lc3NhZ2VEYXRhIHsKKyAgICAgICAgcHJpdmF0ZSBVcGxvYWRGaWxlIG1DYWxsYmFjazsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbUFjY2VwdFR5cGU7CisKKyAgICAgICAgcHVibGljIFVwbG9hZEZpbGVNZXNzYWdlRGF0YShVcGxvYWRGaWxlIHVwbG9hZEZpbGUsIFN0cmluZyBhY2NlcHRUeXBlKSB7CisgICAgICAgICAgICBtQ2FsbGJhY2sgPSB1cGxvYWRGaWxlOworICAgICAgICAgICAgbUFjY2VwdFR5cGUgPSBhY2NlcHRUeXBlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFVwbG9hZEZpbGUgZ2V0VXBsb2FkRmlsZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtQ2FsbGJhY2s7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEFjY2VwdFR5cGUoKSB7CisgICAgICAgICAgICByZXR1cm4gbUFjY2VwdFR5cGU7CisgICAgICAgIH0KKyAgICB9CisKICAgICBwcml2YXRlIGNsYXNzIFVwbG9hZEZpbGUgaW1wbGVtZW50cyBWYWx1ZUNhbGxiYWNrPFVyaT4gewogICAgICAgICBwcml2YXRlIFVyaSBtVmFsdWU7CiAgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVjZWl2ZVZhbHVlKFVyaSB2YWx1ZSkgewpAQCAtMTQ0MiwxMyArMTUxNCwxNCBAQAogICAgIC8qKgogICAgICAqIENhbGxlZCBieSBXZWJWaWV3Q29yZSB0byBvcGVuIGEgZmlsZSBjaG9vc2VyLgogICAgICAqLwotICAgIC8qIHBhY2thZ2UgKi8gVXJpIG9wZW5GaWxlQ2hvb3NlcigpIHsKKyAgICAvKiBwYWNrYWdlICovIFVyaSBvcGVuRmlsZUNob29zZXIoU3RyaW5nIGFjY2VwdFR5cGUpIHsKICAgICAgICAgaWYgKG1XZWJDaHJvbWVDbGllbnQgPT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIH0KICAgICAgICAgTWVzc2FnZSBteU1lc3NhZ2UgPSBvYnRhaW5NZXNzYWdlKE9QRU5fRklMRV9DSE9PU0VSKTsKICAgICAgICAgVXBsb2FkRmlsZSB1cGxvYWRGaWxlID0gbmV3IFVwbG9hZEZpbGUoKTsKLSAgICAgICAgbXlNZXNzYWdlLm9iaiA9IHVwbG9hZEZpbGU7CisgICAgICAgIFVwbG9hZEZpbGVNZXNzYWdlRGF0YSBkYXRhID0gbmV3IFVwbG9hZEZpbGVNZXNzYWdlRGF0YSh1cGxvYWRGaWxlLCBhY2NlcHRUeXBlKTsKKyAgICAgICAgbXlNZXNzYWdlLm9iaiA9IGRhdGE7CiAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewogICAgICAgICAgICAgc2VuZE1lc3NhZ2UobXlNZXNzYWdlKTsKICAgICAgICAgICAgIHRyeSB7CkBAIC0xNDc3LDQgKzE1NTAsMTEgQEAKICAgICAgICAgTWVzc2FnZSBtc2cgPSBvYnRhaW5NZXNzYWdlKEhJU1RPUllfSU5ERVhfQ0hBTkdFRCwgaW5kZXgsIDAsIGl0ZW0pOwogICAgICAgICBzZW5kTWVzc2FnZShtc2cpOwogICAgIH0KKworICAgIHZvaWQgc2V0SW5zdGFsbGFibGVXZWJBcHAoKSB7CisgICAgICAgIGlmIChtV2ViQ2hyb21lQ2xpZW50ID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBzZW5kTWVzc2FnZShvYnRhaW5NZXNzYWdlKFNFVF9JTlNUQUxMQUJMRV9XRUJBUFApKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvRGV2aWNlT3JpZW50YXRpb25NYW5hZ2VyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvRGV2aWNlT3JpZW50YXRpb25NYW5hZ2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWFjMmY0MwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9EZXZpY2VPcmllbnRhdGlvbk1hbmFnZXIuamF2YQpAQCAtMCwwICsxLDY5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLndlYmtpdDsKKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIHNpbXBseSBhIGNvbnRhaW5lciBmb3IgdGhlIG1ldGhvZHMgdXNlZCB0byBpbXBsZW1lbnQgRGV2aWNlT3JpZW50YXRpb24sCisgKiBpbmNsdWRpbmcgdGhlIG1vY2sgRGV2aWNlT3JpZW50YXRpb25DbGllbnQgZm9yIHVzZSBpbiBMYXlvdXRUZXN0cy4KKyAqCisgKiBUaGlzIGNvdWxkIGJlIHBhcnQgb2YgV2ViVmlld0NvcmUsIGJ1dCBoYXZlIG1vdmVkIGl0IHRvIGl0cyBvd24gY2xhc3MgdG8KKyAqIGF2b2lkIGJsb2F0IHRoZXJlLgorICogQGhpZGUKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIERldmljZU9yaWVudGF0aW9uTWFuYWdlciB7CisgICAgcHJpdmF0ZSBXZWJWaWV3Q29yZSBtV2ViVmlld0NvcmU7CisgICAgcHJpdmF0ZSBEZXZpY2VPcmllbnRhdGlvblNlcnZpY2UgbVNlcnZpY2U7CisKKyAgICBwdWJsaWMgRGV2aWNlT3JpZW50YXRpb25NYW5hZ2VyKFdlYlZpZXdDb3JlIHdlYlZpZXdDb3JlKSB7CisgICAgICAgIG1XZWJWaWV3Q29yZSA9IHdlYlZpZXdDb3JlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgd2hldGhlciB0aGUgUGFnZSBmb3IgdGhpcyBXZWJWaWV3Q29yZSBzaG91bGQgdXNlIGEgbW9jayBEZXZpY2VPcmllbnRhdGlvbgorICAgICAqIGNsaWVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB1c2VNb2NrKCkgeworICAgICAgICBhc3NlcnQgV2ViVmlld0NvcmUuVEhSRUFEX05BTUUuZXF1YWxzKFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgbmF0aXZlVXNlTW9jayhtV2ViVmlld0NvcmUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgcG9zaXRpb24gZm9yIHRoZSBtb2NrIERldmljZU9yaWVudGF0aW9uIHNlcnZpY2UgZm9yIHRoaXMgV2ViVmlld0NvcmUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TW9ja09yaWVudGF0aW9uKGJvb2xlYW4gY2FuUHJvdmlkZUFscGhhLCBkb3VibGUgYWxwaGEsIGJvb2xlYW4gY2FuUHJvdmlkZUJldGEsCisgICAgICAgICAgICBkb3VibGUgYmV0YSwgYm9vbGVhbiBjYW5Qcm92aWRlR2FtbWEsIGRvdWJsZSBnYW1tYSkgeworICAgICAgICBhc3NlcnQgV2ViVmlld0NvcmUuVEhSRUFEX05BTUUuZXF1YWxzKFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgbmF0aXZlU2V0TW9ja09yaWVudGF0aW9uKG1XZWJWaWV3Q29yZSwgY2FuUHJvdmlkZUFscGhhLCBhbHBoYSwgY2FuUHJvdmlkZUJldGEsIGJldGEsCisgICAgICAgICAgICAgICAgY2FuUHJvdmlkZUdhbW1hLCBnYW1tYSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb25PcmllbnRhdGlvbkNoYW5nZShEb3VibGUgYWxwaGEsIERvdWJsZSBiZXRhLCBEb3VibGUgZ2FtbWEpIHsKKyAgICAgICAgbmF0aXZlT25PcmllbnRhdGlvbkNoYW5nZShtV2ViVmlld0NvcmUsCisgICAgICAgICAgICAgICAgYWxwaGEgIT0gbnVsbCwgYWxwaGEgIT0gbnVsbCA/IGFscGhhLmRvdWJsZVZhbHVlKCkgOiAwLjAsCisgICAgICAgICAgICAgICAgYmV0YSAhPSBudWxsLCBiZXRhICE9IG51bGwgPyBiZXRhLmRvdWJsZVZhbHVlKCkgOiAwLjAsCisgICAgICAgICAgICAgICAgZ2FtbWEgIT0gbnVsbCwgZ2FtbWEgIT0gbnVsbCA/IGdhbW1hLmRvdWJsZVZhbHVlKCkgOiAwLjApOworICAgIH0KKworICAgIC8vIE5hdGl2ZSBmdW5jdGlvbnMKKyAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBuYXRpdmVVc2VNb2NrKFdlYlZpZXdDb3JlIHdlYlZpZXdDb3JlKTsKKyAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBuYXRpdmVTZXRNb2NrT3JpZW50YXRpb24oV2ViVmlld0NvcmUgd2ViVmlld0NvcmUsCisgICAgICAgICAgICBib29sZWFuIGNhblByb3ZpZGVBbHBoYSwgZG91YmxlIGFscGhhLCBib29sZWFuIGNhblByb3ZpZGVCZXRhLCBkb3VibGUgYmV0YSwKKyAgICAgICAgICAgIGJvb2xlYW4gY2FuUHJvdmlkZUdhbW1hLCBkb3VibGUgZ2FtbWEpOworICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZU9uT3JpZW50YXRpb25DaGFuZ2UoV2ViVmlld0NvcmUgd2ViVmlld0NvcmUsCisgICAgICAgICAgICBib29sZWFuIGNhblByb3ZpZGVBbHBoYSwgZG91YmxlIGFscGhhLCBib29sZWFuIGNhblByb3ZpZGVCZXRhLCBkb3VibGUgYmV0YSwKKyAgICAgICAgICAgIGJvb2xlYW4gY2FuUHJvdmlkZUdhbW1hLCBkb3VibGUgZ2FtbWEpOworfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0RldmljZU9yaWVudGF0aW9uU2VydmljZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0RldmljZU9yaWVudGF0aW9uU2VydmljZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjRmZjg0OWUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvRGV2aWNlT3JpZW50YXRpb25TZXJ2aWNlLmphdmEKQEAgLTAsMCArMSwyMTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQud2Via2l0OworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5TZW5zb3I7CitpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5TZW5zb3JFdmVudDsKK2ltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLlNlbnNvckV2ZW50TGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5TZW5zb3JNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLndlYmtpdC5EZXZpY2VPcmllbnRhdGlvbk1hbmFnZXI7CitpbXBvcnQgamF2YS5sYW5nLlJ1bm5hYmxlOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisKK2ZpbmFsIGNsYXNzIERldmljZU9yaWVudGF0aW9uU2VydmljZSBpbXBsZW1lbnRzIFNlbnNvckV2ZW50TGlzdGVuZXIgeworICAgIC8vIFRoZSBncmF2aXR5IHZlY3RvciBleHByZXNzZWQgaW4gdGhlIGJvZHkgZnJhbWUuCisgICAgcHJpdmF0ZSBmbG9hdFtdIG1HcmF2aXR5VmVjdG9yOworICAgIC8vIFRoZSBnZW9tYWduZXRpYyB2ZWN0b3IgZXhwcmVzc2VkIGluIHRoZSBib2R5IGZyYW1lLgorICAgIHByaXZhdGUgZmxvYXRbXSBtTWFnbmV0aWNGaWVsZFZlY3RvcjsKKworICAgIHByaXZhdGUgRGV2aWNlT3JpZW50YXRpb25NYW5hZ2VyIG1NYW5hZ2VyOworICAgIHByaXZhdGUgYm9vbGVhbiBtSXNSdW5uaW5nOworICAgIHByaXZhdGUgSGFuZGxlciBtSGFuZGxlcjsKKyAgICBwcml2YXRlIFNlbnNvck1hbmFnZXIgbVNlbnNvck1hbmFnZXI7CisgICAgcHJpdmF0ZSBDb250ZXh0IG1Db250ZXh0OworICAgIHByaXZhdGUgRG91YmxlIG1BbHBoYTsKKyAgICBwcml2YXRlIERvdWJsZSBtQmV0YTsKKyAgICBwcml2YXRlIERvdWJsZSBtR2FtbWE7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBkb3VibGUgREVMVEFfREVHUkVTUyA9IDEuMDsKKworICAgIHB1YmxpYyBEZXZpY2VPcmllbnRhdGlvblNlcnZpY2UoRGV2aWNlT3JpZW50YXRpb25NYW5hZ2VyIG1hbmFnZXIsIENvbnRleHQgY29udGV4dCkgeworICAgICAgICBtTWFuYWdlciA9IG1hbmFnZXI7CisgICAgICAgIGFzc2VydChtTWFuYWdlciAhPSBudWxsKTsKKyAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OworICAgICAgICBhc3NlcnQobUNvbnRleHQgIT0gbnVsbCk7CisgICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHN0YXJ0KCkgeworICAgICAgICBtSXNSdW5uaW5nID0gdHJ1ZTsKKyAgICAgICAgcmVnaXN0ZXJGb3JTZW5zb3JzKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc3RvcCgpIHsKKyAgICAgICAgbUlzUnVubmluZyA9IGZhbHNlOworICAgICAgICB1bnJlZ2lzdGVyRnJvbVNlbnNvcnMoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzdXNwZW5kKCkgeworICAgICAgICBpZiAobUlzUnVubmluZykgeworICAgICAgICAgICAgdW5yZWdpc3RlckZyb21TZW5zb3JzKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZXN1bWUoKSB7CisgICAgICAgIGlmIChtSXNSdW5uaW5nKSB7CisgICAgICAgICAgICByZWdpc3RlckZvclNlbnNvcnMoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZW5kRXJyb3JFdmVudCgpIHsKKyAgICAgICAgYXNzZXJ0IFdlYlZpZXdDb3JlLlRIUkVBRF9OQU1FLmVxdWFscyhUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldE5hbWUoKSk7CisgICAgICAgIG1IYW5kbGVyLnBvc3QobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0IFdlYlZpZXdDb3JlLlRIUkVBRF9OQU1FLmVxdWFscyhUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgaWYgKG1Jc1J1bm5pbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgbU1hbmFnZXIub25PcmllbnRhdGlvbkNoYW5nZShudWxsLCBudWxsLCBudWxsKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZWdpc3RlckZvclNlbnNvcnMoKSB7CisgICAgICAgIGlmIChtSGFuZGxlciA9PSBudWxsKSB7CisgICAgICAgICAgICBtSGFuZGxlciA9IG5ldyBIYW5kbGVyKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFyZWdpc3RlckZvckFjY2VsZXJvbWV0ZXJTZW5zb3IoKSB8fCAhcmVnaXN0ZXJGb3JNYWduZXRpY0ZpZWxkU2Vuc29yKCkpIHsKKyAgICAgICAgICAgIHVucmVnaXN0ZXJGcm9tU2Vuc29ycygpOworICAgICAgICAgICAgc2VuZEVycm9yRXZlbnQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBnZXRPcmllbnRhdGlvblVzaW5nR2V0Um90YXRpb25NYXRyaXgoKSB7CisgICAgICAgIGlmIChtR3Jhdml0eVZlY3RvciA9PSBudWxsIHx8IG1NYWduZXRpY0ZpZWxkVmVjdG9yID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEdldCB0aGUgcm90YXRpb24gbWF0cml4LgorICAgICAgICAvLyBUaGUgcm90YXRpb24gbWF0cml4IHRoYXQgdHJhbnNmb3JtcyBmcm9tIHRoZSBib2R5IGZyYW1lIHRvIHRoZSBlYXJ0aCBmcmFtZS4KKyAgICAgICAgZmxvYXRbXSBkZXZpY2VSb3RhdGlvbk1hdHJpeCA9IG5ldyBmbG9hdFs5XTsKKyAgICAgICAgaWYgKCFTZW5zb3JNYW5hZ2VyLmdldFJvdGF0aW9uTWF0cml4KAorICAgICAgICAgICAgICAgIGRldmljZVJvdGF0aW9uTWF0cml4LCBudWxsLCBtR3Jhdml0eVZlY3RvciwgbU1hZ25ldGljRmllbGRWZWN0b3IpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBDb252ZXJ0IHJvdGF0aW9uIG1hdHJpeCB0byByb3RhdGlvbiBhbmdsZXMuCisgICAgICAgIC8vIEFzc3VtaW5nIHRoYXQgdGhlIHJvdGF0aW9ucyBhcmUgYXBwaWVkIGluIHRoZSBvcmRlciBsaXN0ZWQgYXQKKyAgICAgICAgLy8gaHR0cDovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9oYXJkd2FyZS9TZW5zb3JFdmVudC5odG1sI3ZhbHVlcworICAgICAgICAvLyB0aGUgcm90YXRpb25zIGFyZSBhcHBsaWVkIGFib3V0IHRoZSBzYW1lIGF4ZXMgYW5kIGluIHRoZSBzYW1lIG9yZGVyIGFzIHJlcXVpcmVkIGJ5IHRoZQorICAgICAgICAvLyBBUEkuIFRoZSBvbmx5IGNvbnZlcnNpb25zIGFyZSBzaWduIGNoYW5nZXMgYXMgZm9sbG93cy4KKyAgICAgICAgLy8gVGhlIGFuZ2xlcyBhcmUgaW4gcmFkaWFucworICAgICAgICBmbG9hdFtdIHJvdGF0aW9uQW5nbGVzID0gbmV3IGZsb2F0WzNdOworICAgICAgICBTZW5zb3JNYW5hZ2VyLmdldE9yaWVudGF0aW9uKGRldmljZVJvdGF0aW9uTWF0cml4LCByb3RhdGlvbkFuZ2xlcyk7CisgICAgICAgIGRvdWJsZSBhbHBoYSA9IE1hdGgudG9EZWdyZWVzKC1yb3RhdGlvbkFuZ2xlc1swXSkgLSA5MC4wOworICAgICAgICB3aGlsZSAoYWxwaGEgPCAwLjApIHsgYWxwaGEgKz0gMzYwLjA7IH0gLy8gWzAsIDM2MCkKKyAgICAgICAgZG91YmxlIGJldGEgPSBNYXRoLnRvRGVncmVlcygtcm90YXRpb25BbmdsZXNbMV0pOworICAgICAgICB3aGlsZSAoYmV0YSA8IC0xODAuMCkgeyBiZXRhICs9IDM2MC4wOyB9IC8vIFstMTgwLCAxODApCisgICAgICAgIGRvdWJsZSBnYW1tYSA9IE1hdGgudG9EZWdyZWVzKHJvdGF0aW9uQW5nbGVzWzJdKTsKKyAgICAgICAgd2hpbGUgKGdhbW1hIDwgLTkwLjApIHsgZ2FtbWEgKz0gMzYwLjA7IH0gLy8gWy05MCwgOTApCisKKyAgICAgICAgbWF5YmVTZW5kQ2hhbmdlKGFscGhhLCBiZXRhLCBnYW1tYSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBTZW5zb3JNYW5hZ2VyIGdldFNlbnNvck1hbmFnZXIoKSB7CisgICAgICAgIGFzc2VydCBXZWJWaWV3Q29yZS5USFJFQURfTkFNRS5lcXVhbHMoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXROYW1lKCkpOworICAgICAgICBpZiAobVNlbnNvck1hbmFnZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgbVNlbnNvck1hbmFnZXIgPSAoU2Vuc29yTWFuYWdlcikgbUNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LlNFTlNPUl9TRVJWSUNFKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbVNlbnNvck1hbmFnZXI7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIHJlZ2lzdGVyRm9yQWNjZWxlcm9tZXRlclNlbnNvcigpIHsKKyAgICAgICAgTGlzdDxTZW5zb3I+IHNlbnNvcnMgPSBnZXRTZW5zb3JNYW5hZ2VyKCkuZ2V0U2Vuc29yTGlzdChTZW5zb3IuVFlQRV9BQ0NFTEVST01FVEVSKTsKKyAgICAgICAgaWYgKHNlbnNvcnMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgLy8gVE9ETzogQ29uc2lkZXIgaGFuZGxpbmcgbXVsdGlwbGUgc2Vuc29ycy4KKyAgICAgICAgcmV0dXJuIGdldFNlbnNvck1hbmFnZXIoKS5yZWdpc3Rlckxpc3RlbmVyKAorICAgICAgICAgICAgICAgIHRoaXMsIHNlbnNvcnMuZ2V0KDApLCBTZW5zb3JNYW5hZ2VyLlNFTlNPUl9ERUxBWV9GQVNURVNULCBtSGFuZGxlcik7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIHJlZ2lzdGVyRm9yTWFnbmV0aWNGaWVsZFNlbnNvcigpIHsKKyAgICAgICAgTGlzdDxTZW5zb3I+IHNlbnNvcnMgPSBnZXRTZW5zb3JNYW5hZ2VyKCkuZ2V0U2Vuc29yTGlzdChTZW5zb3IuVFlQRV9NQUdORVRJQ19GSUVMRCk7CisgICAgICAgIGlmIChzZW5zb3JzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIC8vIFRPRE86IENvbnNpZGVyIGhhbmRsaW5nIG11bHRpcGxlIHNlbnNvcnMuCisgICAgICAgIHJldHVybiBnZXRTZW5zb3JNYW5hZ2VyKCkucmVnaXN0ZXJMaXN0ZW5lcigKKyAgICAgICAgICAgICAgICB0aGlzLCBzZW5zb3JzLmdldCgwKSwgU2Vuc29yTWFuYWdlci5TRU5TT1JfREVMQVlfRkFTVEVTVCwgbUhhbmRsZXIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB1bnJlZ2lzdGVyRnJvbVNlbnNvcnMoKSB7CisgICAgICAgIGdldFNlbnNvck1hbmFnZXIoKS51bnJlZ2lzdGVyTGlzdGVuZXIodGhpcyk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIG1heWJlU2VuZENoYW5nZShkb3VibGUgYWxwaGEsIGRvdWJsZSBiZXRhLCBkb3VibGUgZ2FtbWEpIHsKKyAgICAgICAgYXNzZXJ0IFdlYlZpZXdDb3JlLlRIUkVBRF9OQU1FLmVxdWFscyhUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldE5hbWUoKSk7CisgICAgICAgIGlmIChtQWxwaGEgPT0gbnVsbCB8fCBtQmV0YSA9PSBudWxsIHx8IG1HYW1tYSA9PSBudWxsCisgICAgICAgICAgICAgICAgfHwgTWF0aC5hYnMoYWxwaGEgLSBtQWxwaGEpID4gREVMVEFfREVHUkVTUworICAgICAgICAgICAgICAgIHx8IE1hdGguYWJzKGJldGEgLSBtQmV0YSkgPiBERUxUQV9ERUdSRVNTCisgICAgICAgICAgICAgICAgfHwgTWF0aC5hYnMoZ2FtbWEgLSBtR2FtbWEpID4gREVMVEFfREVHUkVTUykgeworICAgICAgICAgICAgbUFscGhhID0gYWxwaGE7CisgICAgICAgICAgICBtQmV0YSA9IGJldGE7CisgICAgICAgICAgICBtR2FtbWEgPSBnYW1tYTsKKyAgICAgICAgICAgIG1NYW5hZ2VyLm9uT3JpZW50YXRpb25DaGFuZ2UobUFscGhhLCBtQmV0YSwgbUdhbW1hKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNlbnNvckV2ZW50TGlzdGVuZXIgaW1wbGVtZW50YXRpb24uCisgICAgICogQ2FsbGJhY2tzIGhhcHBlbiBvbiB0aGUgdGhyZWFkIG9uIHdoaWNoIHdlIHJlZ2lzdGVyZWQgLSB0aGUgV2ViQ29yZSB0aHJlYWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25TZW5zb3JDaGFuZ2VkKFNlbnNvckV2ZW50IGV2ZW50KSB7CisgICAgICAgIGFzc2VydChldmVudC52YWx1ZXMubGVuZ3RoID09IDMpOworICAgICAgICBhc3NlcnQgV2ViVmlld0NvcmUuVEhSRUFEX05BTUUuZXF1YWxzKFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0TmFtZSgpKTsKKworICAgICAgICBpZiAoIW1Jc1J1bm5pbmcpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaCAoZXZlbnQuc2Vuc29yLmdldFR5cGUoKSkgeworICAgICAgICAgIGNhc2UgU2Vuc29yLlRZUEVfQUNDRUxFUk9NRVRFUjoKKyAgICAgICAgICAgIGlmIChtR3Jhdml0eVZlY3RvciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUdyYXZpdHlWZWN0b3IgPSBuZXcgZmxvYXRbM107CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtR3Jhdml0eVZlY3RvclswXSA9IGV2ZW50LnZhbHVlc1swXTsKKyAgICAgICAgICAgIG1HcmF2aXR5VmVjdG9yWzFdID0gZXZlbnQudmFsdWVzWzFdOworICAgICAgICAgICAgbUdyYXZpdHlWZWN0b3JbMl0gPSBldmVudC52YWx1ZXNbMl07CisgICAgICAgICAgICBnZXRPcmllbnRhdGlvblVzaW5nR2V0Um90YXRpb25NYXRyaXgoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgU2Vuc29yLlRZUEVfTUFHTkVUSUNfRklFTEQ6CisgICAgICAgICAgICBpZiAobU1hZ25ldGljRmllbGRWZWN0b3IgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1NYWduZXRpY0ZpZWxkVmVjdG9yID0gbmV3IGZsb2F0WzNdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbU1hZ25ldGljRmllbGRWZWN0b3JbMF0gPSBldmVudC52YWx1ZXNbMF07CisgICAgICAgICAgICBtTWFnbmV0aWNGaWVsZFZlY3RvclsxXSA9IGV2ZW50LnZhbHVlc1sxXTsKKyAgICAgICAgICAgIG1NYWduZXRpY0ZpZWxkVmVjdG9yWzJdID0gZXZlbnQudmFsdWVzWzJdOworICAgICAgICAgICAgZ2V0T3JpZW50YXRpb25Vc2luZ0dldFJvdGF0aW9uTWF0cml4KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYXNzZXJ0KGZhbHNlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG9uQWNjdXJhY3lDaGFuZ2VkKFNlbnNvciBzZW5zb3IsIGludCBhY2N1cmFjeSkgeworICAgICAgICBhc3NlcnQgV2ViVmlld0NvcmUuVEhSRUFEX05BTUUuZXF1YWxzKFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0TmFtZSgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvR2VvbG9jYXRpb25TZXJ2aWNlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvR2VvbG9jYXRpb25TZXJ2aWNlLmphdmEKaW5kZXggMjQzMDZmNC4uOTFkZTFkOCAxMDA3NTUKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0dlb2xvY2F0aW9uU2VydmljZS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9HZW9sb2NhdGlvblNlcnZpY2UuamF2YQpAQCAtNDUsMTQgKzQ1LDEzIEBACiAKICAgICAvKioKICAgICAgKiBDb25zdHJ1Y3RvcgorICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IGZyb20gd2hpY2ggd2Ugb2J0YWluIHRoZSBzeXN0ZW0gc2VydmljZS4KICAgICAgKiBAcGFyYW0gbmF0aXZlT2JqZWN0IFRoZSBuYXRpdmUgb2JqZWN0IHRvIHdoaWNoIHRoaXMgb2JqZWN0IHdpbGwgcmVwb3J0IHBvc2l0aW9uIHVwZGF0ZXMgYW5kCiAgICAgICogICAgIGVycm9ycy4KICAgICAgKi8KLSAgICBwdWJsaWMgR2VvbG9jYXRpb25TZXJ2aWNlKGxvbmcgbmF0aXZlT2JqZWN0KSB7CisgICAgcHVibGljIEdlb2xvY2F0aW9uU2VydmljZShDb250ZXh0IGNvbnRleHQsIGxvbmcgbmF0aXZlT2JqZWN0KSB7CiAgICAgICAgIG1OYXRpdmVPYmplY3QgPSBuYXRpdmVPYmplY3Q7CiAgICAgICAgIC8vIFJlZ2lzdGVyIG5ld0xvY2F0aW9uQXZhaWxhYmxlIHdpdGggcGxhdGZvcm0gc2VydmljZS4KLSAgICAgICAgQWN0aXZpdHlUaHJlYWQgdGhyZWFkID0gQWN0aXZpdHlUaHJlYWQuc3lzdGVtTWFpbigpOwotICAgICAgICBDb250ZXh0IGNvbnRleHQgPSB0aHJlYWQuZ2V0QXBwbGljYXRpb24oKTsKICAgICAgICAgbUxvY2F0aW9uTWFuYWdlciA9IChMb2NhdGlvbk1hbmFnZXIpIGNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkxPQ0FUSU9OX1NFUlZJQ0UpOwogICAgICAgICBpZiAobUxvY2F0aW9uTWFuYWdlciA9PSBudWxsKSB7CiAgICAgICAgICAgICBMb2cuZShUQUcsICJDb3VsZCBub3QgZ2V0IGxvY2F0aW9uIG1hbmFnZXIuIik7CkBAIC02Miw5ICs2MSwxMCBAQAogICAgIC8qKgogICAgICAqIFN0YXJ0IGxpc3RlbmluZyBmb3IgbG9jYXRpb24gdXBkYXRlcy4KICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzdGFydCgpIHsKKyAgICBwdWJsaWMgYm9vbGVhbiBzdGFydCgpIHsKICAgICAgICAgcmVnaXN0ZXJGb3JMb2NhdGlvblVwZGF0ZXMoKTsKICAgICAgICAgbUlzUnVubmluZyA9IHRydWU7CisgICAgICAgIHJldHVybiBtSXNOZXR3b3JrUHJvdmlkZXJBdmFpbGFibGUgfHwgbUlzR3BzUHJvdmlkZXJBdmFpbGFibGU7CiAgICAgfQogCiAgICAgLyoqCkBAIC04Nyw2ICs4Nyw4IEBACiAgICAgICAgICAgICAgICAgLy8gb25seSB1bnJlZ2lzdGVyIGZyb20gYWxsLCB0aGVuIHJlcmVnaXN0ZXIgd2l0aCBhbGwgYnV0IHRoZSBHUFMuCiAgICAgICAgICAgICAgICAgdW5yZWdpc3RlckZyb21Mb2NhdGlvblVwZGF0ZXMoKTsKICAgICAgICAgICAgICAgICByZWdpc3RlckZvckxvY2F0aW9uVXBkYXRlcygpOworICAgICAgICAgICAgICAgIC8vIENoZWNrIHRoYXQgdGhlIHByb3ZpZGVycyBhcmUgc3RpbGwgYXZhaWxhYmxlIGFmdGVyIHdlIHJlLXJlZ2lzdGVyLgorICAgICAgICAgICAgICAgIG1heWJlUmVwb3J0RXJyb3IoIlRoZSBsYXN0IGxvY2F0aW9uIHByb3ZpZGVyIGlzIG5vIGxvbmdlciBhdmFpbGFibGUiKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTE1NiwxMSArMTU4LDE2IEBACiAgICAgICovCiAgICAgcHJpdmF0ZSB2b2lkIHJlZ2lzdGVyRm9yTG9jYXRpb25VcGRhdGVzKCkgewogICAgICAgICB0cnkgewotICAgICAgICAgICAgbUxvY2F0aW9uTWFuYWdlci5yZXF1ZXN0TG9jYXRpb25VcGRhdGVzKExvY2F0aW9uTWFuYWdlci5ORVRXT1JLX1BST1ZJREVSLCAwLCAwLCB0aGlzKTsKLSAgICAgICAgICAgIG1Jc05ldHdvcmtQcm92aWRlckF2YWlsYWJsZSA9IHRydWU7CisgICAgICAgICAgICAvLyBSZWdpc3RyYXRpb24gbWF5IGZhaWwgaWYgcHJvdmlkZXJzIGFyZSBub3QgcHJlc2VudCBvbiB0aGUgZGV2aWNlLgorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtTG9jYXRpb25NYW5hZ2VyLnJlcXVlc3RMb2NhdGlvblVwZGF0ZXMoTG9jYXRpb25NYW5hZ2VyLk5FVFdPUktfUFJPVklERVIsIDAsIDAsIHRoaXMpOworICAgICAgICAgICAgICAgIG1Jc05ldHdvcmtQcm92aWRlckF2YWlsYWJsZSA9IHRydWU7CisgICAgICAgICAgICB9IGNhdGNoKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7IH0KICAgICAgICAgICAgIGlmIChtSXNHcHNFbmFibGVkKSB7Ci0gICAgICAgICAgICAgICAgbUxvY2F0aW9uTWFuYWdlci5yZXF1ZXN0TG9jYXRpb25VcGRhdGVzKExvY2F0aW9uTWFuYWdlci5HUFNfUFJPVklERVIsIDAsIDAsIHRoaXMpOwotICAgICAgICAgICAgICAgIG1Jc0dwc1Byb3ZpZGVyQXZhaWxhYmxlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBtTG9jYXRpb25NYW5hZ2VyLnJlcXVlc3RMb2NhdGlvblVwZGF0ZXMoTG9jYXRpb25NYW5hZ2VyLkdQU19QUk9WSURFUiwgMCwgMCwgdGhpcyk7CisgICAgICAgICAgICAgICAgICAgIG1Jc0dwc1Byb3ZpZGVyQXZhaWxhYmxlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7IH0KICAgICAgICAgICAgIH0KICAgICAgICAgfSBjYXRjaChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICBMb2cuZShUQUcsICJDYXVnaHQgc2VjdXJpdHkgZXhjZXB0aW9uIHJlZ2lzdGVyaW5nIGZvciBsb2NhdGlvbiB1cGRhdGVzIGZyb20gc3lzdGVtLiAiICsKQEAgLTE3Myw2ICsxODAsOCBAQAogICAgICAqLwogICAgIHByaXZhdGUgdm9pZCB1bnJlZ2lzdGVyRnJvbUxvY2F0aW9uVXBkYXRlcygpIHsKICAgICAgICAgbUxvY2F0aW9uTWFuYWdlci5yZW1vdmVVcGRhdGVzKHRoaXMpOworICAgICAgICBtSXNOZXR3b3JrUHJvdmlkZXJBdmFpbGFibGUgPSBmYWxzZTsKKyAgICAgICAgbUlzR3BzUHJvdmlkZXJBdmFpbGFibGUgPSBmYWxzZTsKICAgICB9CiAKICAgICAvKioKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9IVE1MNUF1ZGlvLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvSFRNTDVBdWRpby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyOTI4ODEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvSFRNTDVBdWRpby5qYXZhCkBAIC0wLDAgKzEsMjI0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLndlYmtpdDsKKworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllci5PbkJ1ZmZlcmluZ1VwZGF0ZUxpc3RlbmVyOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXIuT25Db21wbGV0aW9uTGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllci5PbkVycm9yTGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllci5PblByZXBhcmVkTGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllci5PblNlZWtDb21wbGV0ZUxpc3RlbmVyOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLlRpbWVyOworaW1wb3J0IGphdmEudXRpbC5UaW1lclRhc2s7CisKKy8qKgorICogPHA+SFRNTDUgc3VwcG9ydCBjbGFzcyBmb3IgQXVkaW8uCisgKi8KK2NsYXNzIEhUTUw1QXVkaW8gZXh0ZW5kcyBIYW5kbGVyCisgICAgICAgICAgICAgICAgIGltcGxlbWVudHMgTWVkaWFQbGF5ZXIuT25CdWZmZXJpbmdVcGRhdGVMaXN0ZW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVBsYXllci5PbkNvbXBsZXRpb25MaXN0ZW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVBsYXllci5PbkVycm9yTGlzdGVuZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFQbGF5ZXIuT25QcmVwYXJlZExpc3RlbmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUGxheWVyLk9uU2Vla0NvbXBsZXRlTGlzdGVuZXIgeworICAgIC8vIExvZ2dpbmcgdGFnLgorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dUQUcgPSAiSFRNTDVBdWRpbyI7CisKKyAgICBwcml2YXRlIE1lZGlhUGxheWVyIG1NZWRpYVBsYXllcjsKKworICAgIC8vIFRoZSBDKysgTWVkaWFQbGF5ZXJQcml2YXRlQW5kcm9pZCBvYmplY3QuCisgICAgcHJpdmF0ZSBpbnQgbU5hdGl2ZVBvaW50ZXI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgSURMRSAgICAgICAgPSAgMDsKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgSU5JVElBTElaRUQgPSAgMTsKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgUFJFUEFSRUQgICAgPSAgMjsKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgU1RBUlRFRCAgICAgPSAgNDsKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgQ09NUExFVEUgICAgPSAgNTsKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgUEFVU0VEICAgICAgPSAgNjsKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgU1RPUFBFRCAgICAgPSAtMjsKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgRVJST1IgICAgICAgPSAtMTsKKworICAgIHByaXZhdGUgaW50IG1TdGF0ZSA9IElETEU7CisKKyAgICBwcml2YXRlIFN0cmluZyBtVXJsOworICAgIHByaXZhdGUgYm9vbGVhbiBtQXNrVG9QbGF5ID0gZmFsc2U7CisKKyAgICAvLyBUaW1lciB0aHJlYWQgLT4gVUkgdGhyZWFkCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRJTUVVUERBVEUgPSAxMDA7CisKKyAgICAvLyBUaGUgc3BlYyBzYXlzIHRoZSB0aW1lciBzaG91bGQgZmlyZSBldmVyeSAyNTAgbXMgb3IgbGVzcy4KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVElNRVVQREFURV9QRVJJT0QgPSAyNTA7ICAvLyBtcworICAgIC8vIFRoZSB0aW1lciBmb3IgdGltZXVwYXRlIGV2ZW50cy4KKyAgICAvLyBTZWUgaHR0cDovL3d3dy53aGF0d2cub3JnL3NwZWNzL3dlYi1hcHBzL2N1cnJlbnQtd29yay8jZXZlbnQtbWVkaWEtdGltZXVwZGF0ZQorICAgIHByaXZhdGUgVGltZXIgbVRpbWVyOworICAgIHByaXZhdGUgZmluYWwgY2xhc3MgVGltZXVwZGF0ZVRhc2sgZXh0ZW5kcyBUaW1lclRhc2sgeworICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICBIVE1MNUF1ZGlvLnRoaXMub2J0YWluTWVzc2FnZShUSU1FVVBEQVRFKS5zZW5kVG9UYXJnZXQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKKyAgICAgICAgc3dpdGNoIChtc2cud2hhdCkgeworICAgICAgICAgICAgY2FzZSBUSU1FVVBEQVRFOiB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1TdGF0ZSAhPSBFUlJPUiAmJiBtTWVkaWFQbGF5ZXIuaXNQbGF5aW5nKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBwb3NpdGlvbiA9IG1NZWRpYVBsYXllci5nZXRDdXJyZW50UG9zaXRpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZU9uVGltZXVwZGF0ZShwb3NpdGlvbiwgbU5hdGl2ZVBvaW50ZXIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgbVN0YXRlID0gRVJST1I7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gZXZlbnQgbGlzdGVuZXJzIGZvciBNZWRpYVBsYXllcgorICAgIC8vIFRob3NlIGFyZSBjYWxsZWQgZnJvbSB0aGUgc2FtZSB0aHJlYWQgd2UgY3JlYXRlZCB0aGUgTWVkaWFQbGF5ZXIKKyAgICAvLyAoaS5lLiB0aGUgd2Vidmlld2NvcmUgdGhyZWFkIGhlcmUpCisKKyAgICAvLyBNZWRpYVBsYXllci5PbkJ1ZmZlcmluZ1VwZGF0ZUxpc3RlbmVyCisgICAgcHVibGljIHZvaWQgb25CdWZmZXJpbmdVcGRhdGUoTWVkaWFQbGF5ZXIgbXAsIGludCBwZXJjZW50KSB7CisgICAgICAgIG5hdGl2ZU9uQnVmZmVyaW5nKHBlcmNlbnQsIG1OYXRpdmVQb2ludGVyKTsKKyAgICB9CisKKyAgICAvLyBNZWRpYVBsYXllci5PbkNvbXBsZXRpb25MaXN0ZW5lcjsKKyAgICBwdWJsaWMgdm9pZCBvbkNvbXBsZXRpb24oTWVkaWFQbGF5ZXIgbXApIHsKKyAgICAgICAgcmVzZXRNZWRpYVBsYXllcigpOworICAgICAgICBtU3RhdGUgPSBJRExFOworICAgICAgICBuYXRpdmVPbkVuZGVkKG1OYXRpdmVQb2ludGVyKTsKKyAgICB9CisKKyAgICAvLyBNZWRpYVBsYXllci5PbkVycm9yTGlzdGVuZXIKKyAgICBwdWJsaWMgYm9vbGVhbiBvbkVycm9yKE1lZGlhUGxheWVyIG1wLCBpbnQgd2hhdCwgaW50IGV4dHJhKSB7CisgICAgICAgIG1TdGF0ZSA9IEVSUk9SOworICAgICAgICByZXNldE1lZGlhUGxheWVyKCk7CisgICAgICAgIG1TdGF0ZSA9IElETEU7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBNZWRpYVBsYXllci5PblByZXBhcmVkTGlzdGVuZXIKKyAgICBwdWJsaWMgdm9pZCBvblByZXBhcmVkKE1lZGlhUGxheWVyIG1wKSB7CisgICAgICAgIG1TdGF0ZSA9IFBSRVBBUkVEOworICAgICAgICBpZiAobVRpbWVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1UaW1lci5zY2hlZHVsZShuZXcgVGltZXVwZGF0ZVRhc2soKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1FVVBEQVRFX1BFUklPRCwgVElNRVVQREFURV9QRVJJT0QpOworICAgICAgICB9CisgICAgICAgIG5hdGl2ZU9uUHJlcGFyZWQobXAuZ2V0RHVyYXRpb24oKSwgMCwgMCwgbU5hdGl2ZVBvaW50ZXIpOworICAgICAgICBpZiAobUFza1RvUGxheSkgeworICAgICAgICAgICAgbUFza1RvUGxheSA9IGZhbHNlOworICAgICAgICAgICAgcGxheSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gTWVkaWFQbGF5ZXIuT25TZWVrQ29tcGxldGVMaXN0ZW5lcgorICAgIHB1YmxpYyB2b2lkIG9uU2Vla0NvbXBsZXRlKE1lZGlhUGxheWVyIG1wKSB7CisgICAgICAgIG5hdGl2ZU9uVGltZXVwZGF0ZShtcC5nZXRDdXJyZW50UG9zaXRpb24oKSwgbU5hdGl2ZVBvaW50ZXIpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQHBhcmFtIG5hdGl2ZVB0ciBpcyB0aGUgQysrIHBvaW50ZXIgdG8gdGhlIE1lZGlhUGxheWVyUHJpdmF0ZSBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIEhUTUw1QXVkaW8oaW50IG5hdGl2ZVB0cikgeworICAgICAgICAvLyBTYXZlIHRoZSBuYXRpdmUgcHRyCisgICAgICAgIG1OYXRpdmVQb2ludGVyID0gbmF0aXZlUHRyOworICAgICAgICByZXNldE1lZGlhUGxheWVyKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJlc2V0TWVkaWFQbGF5ZXIoKSB7CisgICAgICAgIGlmIChtTWVkaWFQbGF5ZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgbU1lZGlhUGxheWVyID0gbmV3IE1lZGlhUGxheWVyKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtTWVkaWFQbGF5ZXIucmVzZXQoKTsKKyAgICAgICAgfQorICAgICAgICBtTWVkaWFQbGF5ZXIuc2V0T25CdWZmZXJpbmdVcGRhdGVMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgbU1lZGlhUGxheWVyLnNldE9uQ29tcGxldGlvbkxpc3RlbmVyKHRoaXMpOworICAgICAgICBtTWVkaWFQbGF5ZXIuc2V0T25FcnJvckxpc3RlbmVyKHRoaXMpOworICAgICAgICBtTWVkaWFQbGF5ZXIuc2V0T25QcmVwYXJlZExpc3RlbmVyKHRoaXMpOworICAgICAgICBtTWVkaWFQbGF5ZXIuc2V0T25TZWVrQ29tcGxldGVMaXN0ZW5lcih0aGlzKTsKKworICAgICAgICBpZiAobVRpbWVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1UaW1lci5jYW5jZWwoKTsKKyAgICAgICAgfQorICAgICAgICBtVGltZXIgPSBuZXcgVGltZXIoKTsKKyAgICAgICAgbVN0YXRlID0gSURMRTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2V0RGF0YVNvdXJjZShTdHJpbmcgdXJsKSB7CisgICAgICAgIG1VcmwgPSB1cmw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAobVN0YXRlICE9IElETEUpIHsKKyAgICAgICAgICAgICAgICByZXNldE1lZGlhUGxheWVyKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtTWVkaWFQbGF5ZXIuc2V0RGF0YVNvdXJjZSh1cmwpOworICAgICAgICAgICAgbVN0YXRlID0gSU5JVElBTElaRUQ7CisgICAgICAgICAgICBtTWVkaWFQbGF5ZXIucHJlcGFyZUFzeW5jKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKExPR1RBRywgImNvdWxkbid0IGxvYWQgdGhlIHJlc291cmNlOiAiICsgdXJsICsgIiBleGM6ICIgKyBlKTsKKyAgICAgICAgICAgIHJlc2V0TWVkaWFQbGF5ZXIoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBwbGF5KCkgeworICAgICAgICBpZiAoKG1TdGF0ZSA9PSBFUlJPUiB8fCBtU3RhdGUgPT0gSURMRSkgJiYgbVVybCAhPSBudWxsKSB7CisgICAgICAgICAgICByZXNldE1lZGlhUGxheWVyKCk7CisgICAgICAgICAgICBzZXREYXRhU291cmNlKG1VcmwpOworICAgICAgICAgICAgbUFza1RvUGxheSA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAobVN0YXRlID49IFBSRVBBUkVEKSB7CisgICAgICAgICAgICBtTWVkaWFQbGF5ZXIuc3RhcnQoKTsKKyAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVJURUQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcGF1c2UoKSB7CisgICAgICAgIGlmIChtU3RhdGUgPT0gU1RBUlRFRCkgeworICAgICAgICAgICAgaWYgKG1UaW1lciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbVRpbWVyLnB1cmdlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtTWVkaWFQbGF5ZXIucGF1c2UoKTsKKyAgICAgICAgICAgIG1TdGF0ZSA9IFBBVVNFRDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZWVrKGludCBtc2VjKSB7CisgICAgICAgIGlmIChtU3RhdGUgPj0gUFJFUEFSRUQpIHsKKyAgICAgICAgICAgIG1NZWRpYVBsYXllci5zZWVrVG8obXNlYyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdGVhcmRvd24oKSB7CisgICAgICAgIG1NZWRpYVBsYXllci5yZWxlYXNlKCk7CisgICAgICAgIG1TdGF0ZSA9IEVSUk9SOworICAgICAgICBtTmF0aXZlUG9pbnRlciA9IDA7CisgICAgfQorCisgICAgcHJpdmF0ZSBmbG9hdCBnZXRNYXhUaW1lU2Vla2FibGUoKSB7CisgICAgICAgIHJldHVybiBtTWVkaWFQbGF5ZXIuZ2V0RHVyYXRpb24oKSAvIDEwMDAuMGY7CisgICAgfQorCisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuYXRpdmVPbkJ1ZmZlcmluZyhpbnQgcGVyY2VudCwgaW50IG5hdGl2ZVBvaW50ZXIpOworICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbmF0aXZlT25FbmRlZChpbnQgbmF0aXZlUG9pbnRlcik7CisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuYXRpdmVPblByZXBhcmVkKGludCBkdXJhdGlvbiwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgbmF0aXZlUG9pbnRlcik7CisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuYXRpdmVPblRpbWV1cGRhdGUoaW50IHBvc2l0aW9uLCBpbnQgbmF0aXZlUG9pbnRlcik7Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvSldlYkNvcmVKYXZhQnJpZGdlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvSldlYkNvcmVKYXZhQnJpZGdlLmphdmEKaW5kZXggZTc2NjY5My4uOTA4NTI2ZiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0pXZWJDb3JlSmF2YUJyaWRnZS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9KV2ViQ29yZUphdmFCcmlkZ2UuamF2YQpAQCAtMTYsMTAgKzE2LDEzIEBACiAKIHBhY2thZ2UgYW5kcm9pZC53ZWJraXQ7CiAKK2ltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CiBpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwogaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCitpbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5TZXQ7CiAKIGZpbmFsIGNsYXNzIEpXZWJDb3JlSmF2YUJyaWRnZSBleHRlbmRzIEhhbmRsZXIgewpAQCAtNDQsMTcgKzQ3LDIxIEBACiAKICAgICAvLyBrZWVwIHRyYWNrIG9mIHRoZSBtYWluIFdlYlZpZXcgYXR0YWNoZWQgdG8gdGhlIGN1cnJlbnQgd2luZG93IHNvIHRoYXQgd2UKICAgICAvLyBjYW4gZ2V0IHRoZSBwcm9wZXIgQ29udGV4dC4KLSAgICBwcml2YXRlIFdlYlZpZXcgbUN1cnJlbnRNYWluV2ViVmlldzsKKyAgICBwcml2YXRlIHN0YXRpYyBXZWFrUmVmZXJlbmNlPFdlYlZpZXc+IHNDdXJyZW50TWFpbldlYlZpZXcgPQorICAgICAgICAgICAgbmV3IFdlYWtSZWZlcmVuY2U8V2ViVmlldz4obnVsbCk7CiAKICAgICAvKiBwYWNrYWdlICovCiAgICAgc3RhdGljIGZpbmFsIGludCBSRUZSRVNIX1BMVUdJTlMgPSAxMDA7CiAKKyAgICBwcml2YXRlIEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IG1Db250ZW50VXJpVG9GaWxlUGF0aE1hcDsKKwogICAgIC8qKgogICAgICAqIENvbnN0cnVjdCBhIG5ldyBKV2ViQ29yZUphdmFCcmlkZ2UgdG8gaW50ZXJmYWNlIHdpdGgKICAgICAgKiBXZWJDb3JlIHRpbWVycyBhbmQgY29va2llcy4KICAgICAgKi8KICAgICBwdWJsaWMgSldlYkNvcmVKYXZhQnJpZGdlKCkgewogICAgICAgICBuYXRpdmVDb25zdHJ1Y3RvcigpOworCiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC02MiwyMCArNjksMjAgQEAKICAgICAgICAgbmF0aXZlRmluYWxpemUoKTsKICAgICB9CiAKLSAgICBzeW5jaHJvbml6ZWQgdm9pZCBzZXRBY3RpdmVXZWJWaWV3KFdlYlZpZXcgd2VidmlldykgewotICAgICAgICBpZiAobUN1cnJlbnRNYWluV2ViVmlldyAhPSBudWxsKSB7CisgICAgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIHNldEFjdGl2ZVdlYlZpZXcoV2ViVmlldyB3ZWJ2aWV3KSB7CisgICAgICAgIGlmIChzQ3VycmVudE1haW5XZWJWaWV3LmdldCgpICE9IG51bGwpIHsKICAgICAgICAgICAgIC8vIGl0IGlzIHBvc3NpYmxlIGlmIHRoZXJlIGlzIGEgc3ViLVdlYlZpZXcuIERvIG5vdGhpbmcuCiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KLSAgICAgICAgbUN1cnJlbnRNYWluV2ViVmlldyA9IHdlYnZpZXc7CisgICAgICAgIHNDdXJyZW50TWFpbldlYlZpZXcgPSBuZXcgV2Vha1JlZmVyZW5jZTxXZWJWaWV3Pih3ZWJ2aWV3KTsKICAgICB9CiAKLSAgICBzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmVBY3RpdmVXZWJWaWV3KFdlYlZpZXcgd2VidmlldykgewotICAgICAgICBpZiAobUN1cnJlbnRNYWluV2ViVmlldyAhPSB3ZWJ2aWV3KSB7CisgICAgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIHJlbW92ZUFjdGl2ZVdlYlZpZXcoV2ViVmlldyB3ZWJ2aWV3KSB7CisgICAgICAgIGlmIChzQ3VycmVudE1haW5XZWJWaWV3LmdldCgpICE9IHdlYnZpZXcpIHsKICAgICAgICAgICAgIC8vIGl0IGlzIHBvc3NpYmxlIGlmIHRoZXJlIGlzIGEgc3ViLVdlYlZpZXcuIERvIG5vdGhpbmcuCiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KLSAgICAgICAgbUN1cnJlbnRNYWluV2ViVmlldyA9IG51bGw7CisgICAgICAgIHNDdXJyZW50TWFpbldlYlZpZXcuY2xlYXIoKTsKICAgICB9CiAKICAgICAvKioKQEAgLTI1NiwxNyArMjYzLDQwIEBACiAKICAgICBzeW5jaHJvbml6ZWQgcHJpdmF0ZSBTdHJpbmcgZ2V0U2lnbmVkUHVibGljS2V5KGludCBpbmRleCwgU3RyaW5nIGNoYWxsZW5nZSwKICAgICAgICAgICAgIFN0cmluZyB1cmwpIHsKLSAgICAgICAgaWYgKG1DdXJyZW50TWFpbldlYlZpZXcgIT0gbnVsbCkgeworICAgICAgICBXZWJWaWV3IGN1cnJlbnQgPSBzQ3VycmVudE1haW5XZWJWaWV3LmdldCgpOworICAgICAgICBpZiAoY3VycmVudCAhPSBudWxsKSB7CiAgICAgICAgICAgICAvLyBnZW5lcmF0ZUtleVBhaXIgZXhwZWN0cyBvcmdhbml6YXRpb25zIHdoaWNoIHdlIGRvbid0IGhhdmUuIElnbm9yZQogICAgICAgICAgICAgLy8gdXJsLgogICAgICAgICAgICAgcmV0dXJuIENlcnRUb29sLmdldFNpZ25lZFB1YmxpY0tleSgKLSAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRNYWluV2ViVmlldy5nZXRDb250ZXh0KCksIGluZGV4LCBjaGFsbGVuZ2UpOworICAgICAgICAgICAgICAgICAgICBjdXJyZW50LmdldENvbnRleHQoKSwgaW5kZXgsIGNoYWxsZW5nZSk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBMb2cuZShMT0dUQUcsICJUaGVyZSBpcyBubyBhY3RpdmUgV2ViVmlldyBmb3IgZ2V0U2lnbmVkUHVibGljS2V5Iik7CiAgICAgICAgICAgICByZXR1cm4gIiI7CiAgICAgICAgIH0KICAgICB9CiAKKyAgICAvLyBDYWxsZWQgb24gdGhlIFdlYkNvcmUgdGhyZWFkIHRocm91Z2ggSk5JLgorICAgIHByaXZhdGUgU3RyaW5nIHJlc29sdmVGaWxlUGF0aEZvckNvbnRlbnRVcmkoU3RyaW5nIHVyaSkgeworICAgICAgICBpZiAobUNvbnRlbnRVcmlUb0ZpbGVQYXRoTWFwICE9IG51bGwpIHsKKyAgICAgICAgICAgIFN0cmluZyBmaWxlTmFtZSA9IG1Db250ZW50VXJpVG9GaWxlUGF0aE1hcC5nZXQodXJpKTsKKyAgICAgICAgICAgIGlmIChmaWxlTmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZpbGVOYW1lOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gRmFpbHNhZmUgZmFsbGJhY2sgdG8ganVzdCB1c2UgdGhlIGxhc3QgcGF0aCBzZWdtZW50LgorICAgICAgICAvLyAoU2VlIE9wZW5hYmxlQ29sdW1ucyBkb2N1bWVudGF0aW9uIGluIHRoZSBTREspCisgICAgICAgIFVyaSBqVXJpID0gVXJpLnBhcnNlKHVyaSk7CisgICAgICAgIHJldHVybiBqVXJpLmdldExhc3RQYXRoU2VnbWVudCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHN0b3JlRmlsZVBhdGhGb3JDb250ZW50VXJpKFN0cmluZyBwYXRoLCBTdHJpbmcgY29udGVudFVyaSkgeworICAgICAgICBpZiAobUNvbnRlbnRVcmlUb0ZpbGVQYXRoTWFwID09IG51bGwpIHsKKyAgICAgICAgICAgIG1Db250ZW50VXJpVG9GaWxlUGF0aE1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworICAgICAgICB9CisgICAgICAgIG1Db250ZW50VXJpVG9GaWxlUGF0aE1hcC5wdXQoY29udGVudFVyaSwgcGF0aCk7CisgICAgfQorCiAgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuYXRpdmVDb25zdHJ1Y3RvcigpOwogICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbmF0aXZlRmluYWxpemUoKTsKICAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIHNoYXJlZFRpbWVyRmlyZWQoKTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9Mb2FkTGlzdGVuZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9Mb2FkTGlzdGVuZXIuamF2YQppbmRleCBlNmZhNDA1Li41YjI1NmYyIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvTG9hZExpc3RlbmVyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0xvYWRMaXN0ZW5lci5qYXZhCkBAIC0xMTAsNiArMTEwLDcgQEAKICAgICBwcml2YXRlIFJlcXVlc3RIYW5kbGUgbVJlcXVlc3RIYW5kbGU7CiAgICAgcHJpdmF0ZSBSZXF1ZXN0SGFuZGxlIG1Tc2xFcnJvclJlcXVlc3RIYW5kbGU7CiAgICAgcHJpdmF0ZSBsb25nICAgICBtUG9zdElkZW50aWZpZXI7CisgICAgcHJpdmF0ZSBib29sZWFuICBtU2V0TmF0aXZlUmVzcG9uc2U7CiAKICAgICAvLyBSZXF1ZXN0IGRhdGEuIEl0IGlzIG9ubHkgdmFsaWQgd2hlbiB3ZSBhcmUgZG9pbmcgYSBsb2FkIGZyb20gdGhlCiAgICAgLy8gY2FjaGUuIEl0IGlzIG5lZWRlZCBpZiB0aGUgY2FjaGUgcmV0dXJucyBhIHJlZGlyZWN0CkBAIC0xODEsNiArMTgyLDcgQEAKICAgICBwcml2YXRlIHZvaWQgY2xlYXJOYXRpdmVMb2FkZXIoKSB7CiAgICAgICAgIHNOYXRpdmVMb2FkZXJDb3VudCAtPSAxOwogICAgICAgICBtTmF0aXZlTG9hZGVyID0gMDsKKyAgICAgICAgbVNldE5hdGl2ZVJlc3BvbnNlID0gZmFsc2U7CiAgICAgfQogCiAgICAgLyoKQEAgLTEwODYsMTMgKzEwODgsMTggQEAKICAgICAgICAgLy8gcmVxdWVzdCB3aXRoIHNvbWUgY3JlZGVudGlhbHMgdGhlbiBkb24ndCBjb21taXQgdGhlIGhlYWRlcnMKICAgICAgICAgLy8gb2YgdGhpcyByZXNwb25zZTsgd2FpdCBmb3IgdGhlIHJlc3BvbnNlIHRvIHRoZSByZXF1ZXN0IHdpdGggdGhlCiAgICAgICAgIC8vIGNyZWRlbnRpYWxzLgotICAgICAgICBpZiAobUF1dGhIZWFkZXIgIT0gbnVsbCkKKyAgICAgICAgaWYgKG1BdXRoSGVhZGVyICE9IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQogCi0gICAgICAgIC8vIENvbW1pdCB0aGUgaGVhZGVycyB0byBXZWJDb3JlCisgICAgICAgIHNldE5hdGl2ZVJlc3BvbnNlKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNldE5hdGl2ZVJlc3BvbnNlKCkgewogICAgICAgICBpbnQgbmF0aXZlUmVzcG9uc2UgPSBjcmVhdGVOYXRpdmVSZXNwb25zZSgpOwogICAgICAgICAvLyBUaGUgbmF0aXZlIGNvZGUgZGVsZXRlcyB0aGUgbmF0aXZlIHJlc3BvbnNlIG9iamVjdC4KICAgICAgICAgbmF0aXZlUmVjZWl2ZWRSZXNwb25zZShuYXRpdmVSZXNwb25zZSk7CisgICAgICAgIG1TZXROYXRpdmVSZXNwb25zZSA9IHRydWU7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMTI3LDYgKzExMzQsOSBAQAogICAgICAqLwogICAgIHByaXZhdGUgdm9pZCBjb21taXRMb2FkKCkgewogICAgICAgICBpZiAobUNhbmNlbGxlZCkgcmV0dXJuOworICAgICAgICBpZiAoIW1TZXROYXRpdmVSZXNwb25zZSkgeworICAgICAgICAgICAgc2V0TmF0aXZlUmVzcG9uc2UoKTsKKyAgICAgICAgfQogCiAgICAgICAgIGlmIChtSXNNYWluUGFnZUxvYWRlcikgewogICAgICAgICAgICAgU3RyaW5nIHR5cGUgPSBzQ2VydGlmaWNhdGVUeXBlTWFwLmdldChtTWltZVR5cGUpOwpAQCAtMTE5Nyw2ICsxMjA3LDEwIEBACiAgICAgICAgIH0KICAgICAgICAgaWYgKG1OYXRpdmVMb2FkZXIgIT0gMCkgewogICAgICAgICAgICAgUGVyZkNoZWNrZXIgY2hlY2tlciA9IG5ldyBQZXJmQ2hlY2tlcigpOworICAgICAgICAgICAgaWYgKCFtU2V0TmF0aXZlUmVzcG9uc2UpIHsKKyAgICAgICAgICAgICAgICBzZXROYXRpdmVSZXNwb25zZSgpOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBuYXRpdmVGaW5pc2hlZCgpOwogICAgICAgICAgICAgY2hlY2tlci5yZXNwb25zZUFsZXJ0KCJyZXMgbmF0aXZlRmluaXNoZWQiKTsKICAgICAgICAgICAgIGNsZWFyTmF0aXZlTG9hZGVyKCk7CkBAIC0xMzEyLDYgKzEzMjYsOSBAQAogICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB0ZXh0ID0gbUNvbnRleHQKICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRTdHJpbmcoUi5zdHJpbmcub3Blbl9wZXJtaXNzaW9uX2RlbnkpCiAgICAgICAgICAgICAgICAgICAgICAgICArICJcbiIgKyByZWRpcmVjdFRvOworICAgICAgICAgICAgICAgIGlmICghbVNldE5hdGl2ZVJlc3BvbnNlKSB7CisgICAgICAgICAgICAgICAgICAgIHNldE5hdGl2ZVJlc3BvbnNlKCk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIG5hdGl2ZUFkZERhdGEodGV4dC5nZXRCeXRlcygpLCB0ZXh0Lmxlbmd0aCgpKTsKICAgICAgICAgICAgICAgICBuYXRpdmVGaW5pc2hlZCgpOwogICAgICAgICAgICAgICAgIGNsZWFyTmF0aXZlTG9hZGVyKCk7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvTWltZVR5cGVNYXAuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9NaW1lVHlwZU1hcC5qYXZhCmluZGV4IGMxYWMxODAuLmYwMDAwNWIgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9NaW1lVHlwZU1hcC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9NaW1lVHlwZU1hcC5qYXZhCkBAIC0xNiwzNSArMTYsMjIgQEAKIAogcGFja2FnZSBhbmRyb2lkLndlYmtpdDsKIAoraW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CitpbXBvcnQgbGliY29yZS5uZXQuTWltZVV0aWxzOwogCiAvKioKICAqIFR3by13YXkgbWFwIHRoYXQgbWFwcyBNSU1FLXR5cGVzIHRvIGZpbGUgZXh0ZW5zaW9ucyBhbmQgdmljZSB2ZXJzYS4KKyAqCisgKiA8cD5TZWUgYWxzbyB7QGxpbmsgamF2YS5uZXQuVVJMQ29ubmVjdGlvbiNndWVzc0NvbnRlbnRUeXBlRnJvbU5hbWV9CisgKiBhbmQge0BsaW5rIGphdmEubmV0LlVSTENvbm5lY3Rpb24jZ3Vlc3NDb250ZW50VHlwZUZyb21TdHJlYW19LiBUaGlzCisgKiBjbGFzcyBhbmQge0Bjb2RlIFVSTENvbm5lY3Rpb259IHNoYXJlIHRoZSBzYW1lIE1JTUUtdHlwZSBkYXRhYmFzZS4KICAqLwogcHVibGljIGNsYXNzIE1pbWVUeXBlTWFwIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNaW1lVHlwZU1hcCBzTWltZVR5cGVNYXAgPSBuZXcgTWltZVR5cGVNYXAoKTsKIAotICAgIC8qKgotICAgICAqIFNpbmdsZXRvbiBNSU1FLXR5cGUgbWFwIGluc3RhbmNlOgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIE1pbWVUeXBlTWFwIHNNaW1lVHlwZU1hcDsKLQotICAgIC8qKgotICAgICAqIE1JTUUtdHlwZSB0byBmaWxlIGV4dGVuc2lvbiBtYXBwaW5nOgotICAgICAqLwotICAgIHByaXZhdGUgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gbU1pbWVUeXBlVG9FeHRlbnNpb25NYXA7Ci0KLSAgICAvKioKLSAgICAgKiBGaWxlIGV4dGVuc2lvbiB0byBNSU1FIHR5cGUgbWFwcGluZzoKLSAgICAgKi8KLSAgICBwcml2YXRlIEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IG1FeHRlbnNpb25Ub01pbWVUeXBlTWFwOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBNSU1FLXR5cGUgbWFwLgotICAgICAqLwogICAgIHByaXZhdGUgTWltZVR5cGVNYXAoKSB7Ci0gICAgICAgIG1NaW1lVHlwZVRvRXh0ZW5zaW9uTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0gICAgICAgIG1FeHRlbnNpb25Ub01pbWVUeXBlTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC01NSw3ICs0Miw3IEBACiAgICAgICogQHJldHVybiBUaGUgZmlsZSBleHRlbnNpb24gb2YgdGhlIGdpdmVuIHVybC4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRGaWxlRXh0ZW5zaW9uRnJvbVVybChTdHJpbmcgdXJsKSB7Ci0gICAgICAgIGlmICh1cmwgIT0gbnVsbCAmJiB1cmwubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkodXJsKSkgewogICAgICAgICAgICAgaW50IHF1ZXJ5ID0gdXJsLmxhc3RJbmRleE9mKCc/Jyk7CiAgICAgICAgICAgICBpZiAocXVlcnkgPiAwKSB7CiAgICAgICAgICAgICAgICAgdXJsID0gdXJsLnN1YnN0cmluZygwLCBxdWVyeSk7CkBAIC02Niw3ICs1Myw3IEBACiAKICAgICAgICAgICAgIC8vIGlmIHRoZSBmaWxlbmFtZSBjb250YWlucyBzcGVjaWFsIGNoYXJhY3RlcnMsIHdlIGRvbid0CiAgICAgICAgICAgICAvLyBjb25zaWRlciBpdCB2YWxpZCBmb3Igb3VyIG1hdGNoaW5nIHB1cnBvc2VzOgotICAgICAgICAgICAgaWYgKGZpbGVuYW1lLmxlbmd0aCgpID4gMCAmJgorICAgICAgICAgICAgaWYgKCFmaWxlbmFtZS5pc0VtcHR5KCkgJiYKICAgICAgICAgICAgICAgICBQYXR0ZXJuLm1hdGNoZXMoIlthLXpBLVpfMC05XFwuXFwtXFwoXFwpXFwlXSsiLCBmaWxlbmFtZSkpIHsKICAgICAgICAgICAgICAgICBpbnQgZG90UG9zID0gZmlsZW5hbWUubGFzdEluZGV4T2YoJy4nKTsKICAgICAgICAgICAgICAgICBpZiAoMCA8PSBkb3RQb3MpIHsKQEAgLTc5LDM2ICs2NiwxMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIExvYWQgYW4gZW50cnkgaW50byB0aGUgbWFwLiBUaGlzIGRvZXMgbm90IGNoZWNrIGlmIHRoZSBpdGVtIGFscmVhZHkKLSAgICAgKiBleGlzdHMsIGl0IHRydXN0cyB0aGUgY2FsbGVyIQotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBsb2FkRW50cnkoU3RyaW5nIG1pbWVUeXBlLCBTdHJpbmcgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIC8vCi0gICAgICAgIC8vIGlmIHdlIGhhdmUgYW4gZXhpc3RpbmcgeCAtLT4geSBtYXBwaW5nLCB3ZSBkbyBub3Qgd2FudCB0bwotICAgICAgICAvLyBvdmVycmlkZSBpdCB3aXRoIGFub3RoZXIgbWFwcGluZyB4IC0tPiA/Ci0gICAgICAgIC8vIHRoaXMgaXMgbW9zdGx5IGJlY2F1c2Ugb2YgdGhlIHdheSB0aGUgbWltZS10eXBlIG1hcCBiZWxvdwotICAgICAgICAvLyBpcyBjb25zdHJ1Y3RlZCAoaWYgYSBtaW1lIHR5cGUgbWFwcyB0byBzZXZlcmFsIGV4dGVuc2lvbnMKLSAgICAgICAgLy8gdGhlIGZpcnN0IGV4dGVuc2lvbiBpcyBjb25zaWRlcmVkIHRoZSBtb3N0IHBvcHVsYXIgYW5kIGlzCi0gICAgICAgIC8vIGFkZGVkIGZpcnN0OyB3ZSBkbyBub3Qgd2FudCB0byBvdmVyd3JpdGUgaXQgbGF0ZXIpLgotICAgICAgICAvLwotICAgICAgICBpZiAoIW1NaW1lVHlwZVRvRXh0ZW5zaW9uTWFwLmNvbnRhaW5zS2V5KG1pbWVUeXBlKSkgewotICAgICAgICAgICAgbU1pbWVUeXBlVG9FeHRlbnNpb25NYXAucHV0KG1pbWVUeXBlLCBleHRlbnNpb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgbUV4dGVuc2lvblRvTWltZVR5cGVNYXAucHV0KGV4dGVuc2lvbiwgbWltZVR5cGUpOwotICAgIH0KLQotICAgIC8qKgogICAgICAqIFJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBNSU1FIHR5cGUgaGFzIGFuIGVudHJ5IGluIHRoZSBtYXAuCiAgICAgICogQHBhcmFtIG1pbWVUeXBlIEEgTUlNRSB0eXBlIChpLmUuIHRleHQvcGxhaW4pCiAgICAgICogQHJldHVybiBUcnVlIGlmZiB0aGVyZSBpcyBhIG1pbWVUeXBlIGVudHJ5IGluIHRoZSBtYXAuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaGFzTWltZVR5cGUoU3RyaW5nIG1pbWVUeXBlKSB7Ci0gICAgICAgIGlmIChtaW1lVHlwZSAhPSBudWxsICYmIG1pbWVUeXBlLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgcmV0dXJuIG1NaW1lVHlwZVRvRXh0ZW5zaW9uTWFwLmNvbnRhaW5zS2V5KG1pbWVUeXBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIE1pbWVVdGlscy5oYXNNaW1lVHlwZShtaW1lVHlwZSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMTcsMTYgKzgwLDEyIEBACiAgICAgICogQHJldHVybiBUaGUgTUlNRSB0eXBlIGZvciB0aGUgZ2l2ZW4gZXh0ZW5zaW9uIG9yIG51bGwgaWZmIHRoZXJlIGlzIG5vbmUuCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXRNaW1lVHlwZUZyb21FeHRlbnNpb24oU3RyaW5nIGV4dGVuc2lvbikgewotICAgICAgICBpZiAoZXh0ZW5zaW9uICE9IG51bGwgJiYgZXh0ZW5zaW9uLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgcmV0dXJuIG1FeHRlbnNpb25Ub01pbWVUeXBlTWFwLmdldChleHRlbnNpb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIHJldHVybiBNaW1lVXRpbHMuZ3Vlc3NNaW1lVHlwZUZyb21FeHRlbnNpb24oZXh0ZW5zaW9uKTsKICAgICB9CiAKICAgICAvLyBTdGF0aWMgbWV0aG9kIGNhbGxlZCBieSBqbmkuCiAgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIG1pbWVUeXBlRnJvbUV4dGVuc2lvbihTdHJpbmcgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIHJldHVybiBnZXRTaW5nbGV0b24oKS5nZXRNaW1lVHlwZUZyb21FeHRlbnNpb24oZXh0ZW5zaW9uKTsKKyAgICAgICAgcmV0dXJuIE1pbWVVdGlscy5ndWVzc01pbWVUeXBlRnJvbUV4dGVuc2lvbihleHRlbnNpb24pOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTM1LDEwICs5NCw3IEBACiAgICAgICogQHJldHVybiBUcnVlIGlmZiB0aGVyZSBpcyBhbiBleHRlbnNpb24gZW50cnkgaW4gdGhlIG1hcC4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBoYXNFeHRlbnNpb24oU3RyaW5nIGV4dGVuc2lvbikgewotICAgICAgICBpZiAoZXh0ZW5zaW9uICE9IG51bGwgJiYgZXh0ZW5zaW9uLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgcmV0dXJuIG1FeHRlbnNpb25Ub01pbWVUeXBlTWFwLmNvbnRhaW5zS2V5KGV4dGVuc2lvbik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gTWltZVV0aWxzLmhhc0V4dGVuc2lvbihleHRlbnNpb24pOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTQ5LDExICsxMDUsNyBAQAogICAgICAqIEByZXR1cm4gVGhlIGV4dGVuc2lvbiBmb3IgdGhlIGdpdmVuIE1JTUUgdHlwZSBvciBudWxsIGlmZiB0aGVyZSBpcyBub25lLgogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0RXh0ZW5zaW9uRnJvbU1pbWVUeXBlKFN0cmluZyBtaW1lVHlwZSkgewotICAgICAgICBpZiAobWltZVR5cGUgIT0gbnVsbCAmJiBtaW1lVHlwZS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgIHJldHVybiBtTWltZVR5cGVUb0V4dGVuc2lvbk1hcC5nZXQobWltZVR5cGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIHJldHVybiBNaW1lVXRpbHMuZ3Vlc3NFeHRlbnNpb25Gcm9tTWltZVR5cGUobWltZVR5cGUpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTYxLDM2MyArMTEzLDYgQEAKICAgICAgKiBAcmV0dXJuIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIE1JTUUtdHlwZSBtYXAuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBNaW1lVHlwZU1hcCBnZXRTaW5nbGV0b24oKSB7Ci0gICAgICAgIGlmIChzTWltZVR5cGVNYXAgPT0gbnVsbCkgewotICAgICAgICAgICAgc01pbWVUeXBlTWFwID0gbmV3IE1pbWVUeXBlTWFwKCk7Ci0KLSAgICAgICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgdGFibGUgaXMgYmFzZWQgb24gL2V0Yy9taW1lLnR5cGVzIGRhdGEgbWludXMKLSAgICAgICAgICAgIC8vIGNoZW1pY2FsLyogTUlNRSB0eXBlcyBhbmQgTUlNRSB0eXBlcyB0aGF0IGRvbid0IG1hcCB0byBhbnkKLSAgICAgICAgICAgIC8vIGZpbGUgZXh0ZW5zaW9ucy4gV2UgYWxzbyBleGNsdWRlIHRvcC1sZXZlbCBkb21haW4gbmFtZXMgdG8KLSAgICAgICAgICAgIC8vIGRlYWwgd2l0aCBjYXNlcyBsaWtlOgotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIC8vIG1haWwuZ29vZ2xlLmNvbS9hL2dvb2dsZS5jb20KLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyBhbmQgImFjdGl2ZSIgTUlNRSB0eXBlcyAoZHVlIHRvIHBvdGVudGlhbCBzZWN1cml0eSBpc3N1ZXMpLgotCi0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi9hbmRyZXctaW5zZXQiLCAiZXoiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL2RzcHR5cGUiLCAidHNwIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi9mdXR1cmVzcGxhc2giLCAic3BsIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi9odGEiLCAiaHRhIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi9tYWMtYmluaGV4NDAiLCAiaHF4Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi9tYWMtY29tcGFjdHBybyIsICJjcHQiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL21hdGhlbWF0aWNhIiwgIm5iIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi9tc2FjY2VzcyIsICJtZGIiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL29kYSIsICJvZGEiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL29nZyIsICJvZ2ciKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3BkZiIsICJwZGYiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3BncC1rZXlzIiwgImtleSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24vcGdwLXNpZ25hdHVyZSIsICJwZ3AiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3BpY3MtcnVsZXMiLCAicHJmIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi9yYXIiLCAicmFyIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi9yZGYreG1sIiwgInJkZiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24vcnNzK3htbCIsICJyc3MiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3ppcCIsICJ6aXAiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3ZuZC5hbmRyb2lkLnBhY2thZ2UtYXJjaGl2ZSIsIAotICAgICAgICAgICAgICAgICAgICAiYXBrIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi92bmQuY2luZGVyZWxsYSIsICJjZHkiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3ZuZC5tcy1wa2kuc3RsIiwgInN0bCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgKLSAgICAgICAgICAgICAgICAgICAgImFwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQuZGF0YWJhc2UiLCAib2RiIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KAotICAgICAgICAgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5mb3JtdWxhIiwgIm9kZiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgKLSAgICAgICAgICAgICAgICAgICAgImFwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQuZ3JhcGhpY3MiLCAib2RnIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KAotICAgICAgICAgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5ncmFwaGljcy10ZW1wbGF0ZSIsCi0gICAgICAgICAgICAgICAgICAgICJvdGciKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoCi0gICAgICAgICAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LmltYWdlIiwgIm9kaSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgKLSAgICAgICAgICAgICAgICAgICAgImFwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQuc3ByZWFkc2hlZXQiLCAib2RzIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KAotICAgICAgICAgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5zcHJlYWRzaGVldC10ZW1wbGF0ZSIsCi0gICAgICAgICAgICAgICAgICAgICJvdHMiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoCi0gICAgICAgICAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LnRleHQiLCAib2R0Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KAotICAgICAgICAgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC50ZXh0LW1hc3RlciIsICJvZG0iKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoCi0gICAgICAgICAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LnRleHQtdGVtcGxhdGUiLCAib3R0Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KAotICAgICAgICAgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC50ZXh0LXdlYiIsICJvdGgiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL21zd29yZCIsICJkb2MiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL21zd29yZCIsICJkb3QiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoCi0gICAgICAgICAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQud29yZHByb2Nlc3NpbmdtbC5kb2N1bWVudCIsCi0gICAgICAgICAgICAgICAgICAgICJkb2N4Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KAotICAgICAgICAgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LndvcmRwcm9jZXNzaW5nbWwudGVtcGxhdGUiLAotICAgICAgICAgICAgICAgICAgICAiZG90eCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsIiwgInhscyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsIiwgInhsdCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgKLSAgICAgICAgICAgICAgICAgICAgImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLnNoZWV0IiwKLSAgICAgICAgICAgICAgICAgICAgInhsc3giKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoCi0gICAgICAgICAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC50ZW1wbGF0ZSIsCi0gICAgICAgICAgICAgICAgICAgICJ4bHR4Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi92bmQubXMtcG93ZXJwb2ludCIsICJwcHQiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3ZuZC5tcy1wb3dlcnBvaW50IiwgInBvdCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24vdm5kLm1zLXBvd2VycG9pbnQiLCAicHBzIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KAotICAgICAgICAgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnByZXNlbnRhdGlvbm1sLnByZXNlbnRhdGlvbiIsCi0gICAgICAgICAgICAgICAgICAgICJwcHR4Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KAotICAgICAgICAgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnByZXNlbnRhdGlvbm1sLnRlbXBsYXRlIiwKLSAgICAgICAgICAgICAgICAgICAgInBvdHgiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoCi0gICAgICAgICAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQucHJlc2VudGF0aW9ubWwuc2xpZGVzaG93IiwKLSAgICAgICAgICAgICAgICAgICAgInBwc3giKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3ZuZC5yaW0uY29kIiwgImNvZCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24vdm5kLnNtYWYiLCAibW1mIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi92bmQuc3RhcmRpdmlzaW9uLmNhbGMiLCAic2RjIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi92bmQuc3RhcmRpdmlzaW9uLmRyYXciLCAic2RhIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KAotICAgICAgICAgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLnN0YXJkaXZpc2lvbi5pbXByZXNzIiwgInNkZCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgKLSAgICAgICAgICAgICAgICAgICAgImFwcGxpY2F0aW9uL3ZuZC5zdGFyZGl2aXNpb24uaW1wcmVzcyIsICJzZHAiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3ZuZC5zdGFyZGl2aXNpb24ubWF0aCIsICJzbWYiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3ZuZC5zdGFyZGl2aXNpb24ud3JpdGVyIiwKLSAgICAgICAgICAgICAgICAgICAgInNkdyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24vdm5kLnN0YXJkaXZpc2lvbi53cml0ZXIiLAotICAgICAgICAgICAgICAgICAgICAidm9yIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KAotICAgICAgICAgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLnN0YXJkaXZpc2lvbi53cml0ZXItZ2xvYmFsIiwgInNnbCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24vdm5kLnN1bi54bWwuY2FsYyIsICJzeGMiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoCi0gICAgICAgICAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQuc3VuLnhtbC5jYWxjLnRlbXBsYXRlIiwgInN0YyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24vdm5kLnN1bi54bWwuZHJhdyIsICJzeGQiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoCi0gICAgICAgICAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQuc3VuLnhtbC5kcmF3LnRlbXBsYXRlIiwgInN0ZCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24vdm5kLnN1bi54bWwuaW1wcmVzcyIsICJzeGkiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoCi0gICAgICAgICAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQuc3VuLnhtbC5pbXByZXNzLnRlbXBsYXRlIiwgInN0aSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24vdm5kLnN1bi54bWwubWF0aCIsICJzeG0iKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3ZuZC5zdW4ueG1sLndyaXRlciIsICJzeHciKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoCi0gICAgICAgICAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQuc3VuLnhtbC53cml0ZXIuZ2xvYmFsIiwgInN4ZyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgKLSAgICAgICAgICAgICAgICAgICAgImFwcGxpY2F0aW9uL3ZuZC5zdW4ueG1sLndyaXRlci50ZW1wbGF0ZSIsICJzdHciKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3ZuZC52aXNpbyIsICJ2c2QiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtYWJpd29yZCIsICJhYnciKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtYXBwbGUtZGlza2ltYWdlIiwgImRtZyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1iY3BpbyIsICJiY3BpbyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1iaXR0b3JyZW50IiwgInRvcnJlbnQiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtY2RmIiwgImNkZiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1jZGxpbmsiLCAidmNkIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWNoZXNzLXBnbiIsICJwZ24iKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtY3BpbyIsICJjcGlvIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWRlYmlhbi1wYWNrYWdlIiwgImRlYiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1kZWJpYW4tcGFja2FnZSIsICJ1ZGViIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWRpcmVjdG9yIiwgImRjciIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1kaXJlY3RvciIsICJkaXIiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtZGlyZWN0b3IiLCAiZHhyIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWRtcyIsICJkbXMiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtZG9vbSIsICJ3YWQiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtZHZpIiwgImR2aSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1mbGFjIiwgImZsYWMiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtZm9udCIsICJwZmEiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtZm9udCIsICJwZmIiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtZm9udCIsICJnc2YiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtZm9udCIsICJwY2YiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtZm9udCIsICJwY2YuWiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1mcmVlbWluZCIsICJtbSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1mdXR1cmVzcGxhc2giLCAic3BsIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWdudW1lcmljIiwgImdudW1lcmljIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWdvLXNnZiIsICJzZ2YiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtZ3JhcGhpbmctY2FsY3VsYXRvciIsICJnY2YiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtZ3RhciIsICJndGFyIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWd0YXIiLCAidGd6Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWd0YXIiLCAidGF6Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWhkZiIsICJoZGYiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtaWNhIiwgImljYSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1pbnRlcm5ldC1zaWdudXAiLCAiaW5zIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWludGVybmV0LXNpZ251cCIsICJpc3AiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtaXBob25lIiwgImlpaSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1pc285NjYwLWltYWdlIiwgImlzbyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1qbW9sIiwgImpteiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1rY2hhcnQiLCAiY2hydCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1raWxsdXN0cmF0b3IiLCAia2lsIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWtvYW4iLCAic2twIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWtvYW4iLCAic2tkIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWtvYW4iLCAic2t0Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWtvYW4iLCAic2ttIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWtwcmVzZW50ZXIiLCAia3ByIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWtwcmVzZW50ZXIiLCAia3B0Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWtzcHJlYWQiLCAia3NwIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWt3b3JkIiwgImt3ZCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1rd29yZCIsICJrd3QiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtbGF0ZXgiLCAibGF0ZXgiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtbGhhIiwgImxoYSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1semgiLCAibHpoIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWx6eCIsICJsengiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtbWFrZXIiLCAiZnJtIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LW1ha2VyIiwgIm1ha2VyIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LW1ha2VyIiwgImZyYW1lIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LW1ha2VyIiwgImZiIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LW1ha2VyIiwgImJvb2siKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtbWFrZXIiLCAiZmJkb2MiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtbWlmIiwgIm1pZiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1tcy13bWQiLCAid21kIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LW1zLXdteiIsICJ3bXoiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtbXNpIiwgIm1zaSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1ucy1wcm94eS1hdXRvY29uZmlnIiwgInBhYyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1ud2MiLCAibndjIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LW9iamVjdCIsICJvIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LW96LWFwcGxpY2F0aW9uIiwgIm96YSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1wa2NzMTIiLCAicDEyIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LXBrY3M3LWNlcnRyZXFyZXNwIiwgInA3ciIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1wa2NzNy1jcmwiLCAiY3JsIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LXF1aWNrdGltZXBsYXllciIsICJxdGwiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtc2hhciIsICJzaGFyIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCIsICJzd2YiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtc3R1ZmZpdCIsICJzaXQiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtc3Y0Y3BpbyIsICJzdjRjcGlvIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LXN2NGNyYyIsICJzdjRjcmMiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtdGFyIiwgInRhciIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC10ZXhpbmZvIiwgInRleGluZm8iKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtdGV4aW5mbyIsICJ0ZXhpIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LXRyb2ZmIiwgInQiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtdHJvZmYiLCAicm9mZiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC10cm9mZi1tYW4iLCAibWFuIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LXVzdGFyIiwgInVzdGFyIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LXdhaXMtc291cmNlIiwgInNyYyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC13aW5neiIsICJ3eiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC13ZWJhcmNoaXZlIiwgIndlYmFyY2hpdmUiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gteDUwOS1jYS1jZXJ0IiwgImNydCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC14NTA5LXVzZXItY2VydCIsICJjcnQiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gteGNmIiwgInhjZiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC14ZmlnIiwgImZpZyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veGh0bWwreG1sIiwgInhodG1sIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhdWRpby8zZ3BwIiwgIjNncHAiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImF1ZGlvL2FtciIsICJhbXIiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImF1ZGlvL2Jhc2ljIiwgInNuZCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXVkaW8vbWlkaSIsICJtaWQiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImF1ZGlvL21pZGkiLCAibWlkaSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXVkaW8vbWlkaSIsICJrYXIiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImF1ZGlvL21pZGkiLCAieG1mIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhdWRpby9tb2JpbGUteG1mIiwgIm14bWYiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImF1ZGlvL21wZWciLCAibXBnYSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXVkaW8vbXBlZyIsICJtcGVnYSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXVkaW8vbXBlZyIsICJtcDIiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImF1ZGlvL21wZWciLCAibXAzIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhdWRpby9tcGVnIiwgIm00YSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXVkaW8vbXBlZ3VybCIsICJtM3UiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImF1ZGlvL3Bycy5zaWQiLCAic2lkIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhdWRpby94LWFpZmYiLCAiYWlmIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhdWRpby94LWFpZmYiLCAiYWlmZiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXVkaW8veC1haWZmIiwgImFpZmMiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImF1ZGlvL3gtZ3NtIiwgImdzbSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXVkaW8veC1tcGVndXJsIiwgIm0zdSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXVkaW8veC1tcy13bWEiLCAid21hIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhdWRpby94LW1zLXdheCIsICJ3YXgiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImF1ZGlvL3gtcG4tcmVhbGF1ZGlvIiwgInJhIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhdWRpby94LXBuLXJlYWxhdWRpbyIsICJybSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXVkaW8veC1wbi1yZWFsYXVkaW8iLCAicmFtIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhdWRpby94LXJlYWxhdWRpbyIsICJyYSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXVkaW8veC1zY3BscyIsICJwbHMiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImF1ZGlvL3gtc2QyIiwgInNkMiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXVkaW8veC13YXYiLCAid2F2Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJpbWFnZS9ibXAiLCAiYm1wIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJpbWFnZS9naWYiLCAiZ2lmIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJpbWFnZS9pY28iLCAiY3VyIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJpbWFnZS9pY28iLCAiaWNvIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJpbWFnZS9pZWYiLCAiaWVmIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJpbWFnZS9qcGVnIiwgImpwZWciKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImltYWdlL2pwZWciLCAianBnIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJpbWFnZS9qcGVnIiwgImpwZSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiaW1hZ2UvcGN4IiwgInBjeCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiaW1hZ2UvcG5nIiwgInBuZyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiaW1hZ2Uvc3ZnK3htbCIsICJzdmciKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImltYWdlL3N2Zyt4bWwiLCAic3ZneiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiaW1hZ2UvdGlmZiIsICJ0aWZmIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJpbWFnZS90aWZmIiwgInRpZiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiaW1hZ2Uvdm5kLmRqdnUiLCAiZGp2dSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiaW1hZ2Uvdm5kLmRqdnUiLCAiZGp2Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJpbWFnZS92bmQud2FwLndibXAiLCAid2JtcCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiaW1hZ2UveC1jbXUtcmFzdGVyIiwgInJhcyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiaW1hZ2UveC1jb3JlbGRyYXciLCAiY2RyIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJpbWFnZS94LWNvcmVsZHJhd3BhdHRlcm4iLCAicGF0Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJpbWFnZS94LWNvcmVsZHJhd3RlbXBsYXRlIiwgImNkdCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiaW1hZ2UveC1jb3JlbHBob3RvcGFpbnQiLCAiY3B0Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJpbWFnZS94LWljb24iLCAiaWNvIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJpbWFnZS94LWpnIiwgImFydCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiaW1hZ2UveC1qbmciLCAiam5nIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJpbWFnZS94LW1zLWJtcCIsICJibXAiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImltYWdlL3gtcGhvdG9zaG9wIiwgInBzZCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiaW1hZ2UveC1wb3J0YWJsZS1hbnltYXAiLCAicG5tIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJpbWFnZS94LXBvcnRhYmxlLWJpdG1hcCIsICJwYm0iKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImltYWdlL3gtcG9ydGFibGUtZ3JheW1hcCIsICJwZ20iKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImltYWdlL3gtcG9ydGFibGUtcGl4bWFwIiwgInBwbSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiaW1hZ2UveC1yZ2IiLCAicmdiIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJpbWFnZS94LXhiaXRtYXAiLCAieGJtIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJpbWFnZS94LXhwaXhtYXAiLCAieHBtIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJpbWFnZS94LXh3aW5kb3dkdW1wIiwgInh3ZCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgibW9kZWwvaWdlcyIsICJpZ3MiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoIm1vZGVsL2lnZXMiLCAiaWdlcyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgibW9kZWwvbWVzaCIsICJtc2giKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoIm1vZGVsL21lc2giLCAibWVzaCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgibW9kZWwvbWVzaCIsICJzaWxvIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ0ZXh0L2NhbGVuZGFyIiwgImljcyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC9jYWxlbmRhciIsICJpY3oiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQvY29tbWEtc2VwYXJhdGVkLXZhbHVlcyIsICJjc3YiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQvY3NzIiwgImNzcyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC9odG1sIiwgImh0bSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC9odG1sIiwgImh0bWwiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQvaDMyMyIsICIzMjMiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQvaXVscyIsICJ1bHMiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQvbWF0aG1sIiwgIm1tbCIpOwotICAgICAgICAgICAgLy8gYWRkIGl0IGZpcnN0IHNvIGl0IHdpbGwgYmUgdGhlIGRlZmF1bHQgZm9yIEV4dGVuc2lvbkZyb21NaW1lVHlwZQotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC9wbGFpbiIsICJ0eHQiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQvcGxhaW4iLCAiYXNjIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ0ZXh0L3BsYWluIiwgInRleHQiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQvcGxhaW4iLCAiZGlmZiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC9wbGFpbiIsICJwbyIpOyAgICAgLy8gcmVzZXJ2ZSAicG90IiBmb3Igdm5kLm1zLXBvd2VycG9pbnQKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQvcmljaHRleHQiLCAicnR4Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ0ZXh0L3J0ZiIsICJydGYiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQvdGV4bWFjcyIsICJ0cyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC90ZXh0IiwgInBocHMiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQvdGFiLXNlcGFyYXRlZC12YWx1ZXMiLCAidHN2Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ0ZXh0L3htbCIsICJ4bWwiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQveC1iaWJ0ZXgiLCAiYmliIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ0ZXh0L3gtYm9vIiwgImJvbyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC94LWMrK2hkciIsICJoKysiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQveC1jKytoZHIiLCAiaHBwIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ0ZXh0L3gtYysraGRyIiwgImh4eCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC94LWMrK2hkciIsICJoaCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC94LWMrK3NyYyIsICJjKysiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQveC1jKytzcmMiLCAiY3BwIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ0ZXh0L3gtYysrc3JjIiwgImN4eCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC94LWNoZHIiLCAiaCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC94LWNvbXBvbmVudCIsICJodGMiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQveC1jc2giLCAiY3NoIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ0ZXh0L3gtY3NyYyIsICJjIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ0ZXh0L3gtZHNyYyIsICJkIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ0ZXh0L3gtaGFza2VsbCIsICJocyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC94LWphdmEiLCAiamF2YSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC94LWxpdGVyYXRlLWhhc2tlbGwiLCAibGhzIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ0ZXh0L3gtbW9jIiwgIm1vYyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC94LXBhc2NhbCIsICJwIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ0ZXh0L3gtcGFzY2FsIiwgInBhcyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC94LXBjcy1nY2QiLCAiZ2NkIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ0ZXh0L3gtc2V0ZXh0IiwgImV0eCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC94LXRjbCIsICJ0Y2wiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQveC10ZXgiLCAidGV4Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ0ZXh0L3gtdGV4IiwgImx0eCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC94LXRleCIsICJzdHkiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQveC10ZXgiLCAiY2xzIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ0ZXh0L3gtdmNhbGVuZGFyIiwgInZjcyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC94LXZjYXJkIiwgInZjZiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidmlkZW8vM2dwcCIsICIzZ3BwIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ2aWRlby8zZ3BwIiwgIjNncCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidmlkZW8vM2dwcCIsICIzZzIiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInZpZGVvL2RsIiwgImRsIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ2aWRlby9kdiIsICJkaWYiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInZpZGVvL2R2IiwgImR2Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ2aWRlby9mbGkiLCAiZmxpIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ2aWRlby9tNHYiLCAibTR2Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ2aWRlby9tcGVnIiwgIm1wZWciKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInZpZGVvL21wZWciLCAibXBnIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ2aWRlby9tcGVnIiwgIm1wZSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidmlkZW8vbXA0IiwgIm1wNCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidmlkZW8vbXBlZyIsICJWT0IiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInZpZGVvL3F1aWNrdGltZSIsICJxdCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidmlkZW8vcXVpY2t0aW1lIiwgIm1vdiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidmlkZW8vdm5kLm1wZWd1cmwiLCAibXh1Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ2aWRlby94LWxhLWFzZiIsICJsc2YiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInZpZGVvL3gtbGEtYXNmIiwgImxzeCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidmlkZW8veC1tbmciLCAibW5nIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ2aWRlby94LW1zLWFzZiIsICJhc2YiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInZpZGVvL3gtbXMtYXNmIiwgImFzeCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidmlkZW8veC1tcy13bSIsICJ3bSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidmlkZW8veC1tcy13bXYiLCAid212Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ2aWRlby94LW1zLXdteCIsICJ3bXgiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInZpZGVvL3gtbXMtd3Z4IiwgInd2eCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidmlkZW8veC1tc3ZpZGVvIiwgImF2aSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidmlkZW8veC1zZ2ktbW92aWUiLCAibW92aWUiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoIngtY29uZmVyZW5jZS94LWNvb2x0YWxrIiwgImljZSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgieC1lcG9jL3gtc2lzeC1hcHAiLCAic2lzeCIpOwotICAgICAgICB9Ci0KICAgICAgICAgcmV0dXJuIHNNaW1lVHlwZU1hcDsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvTmV0d29yay5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L05ldHdvcmsuamF2YQppbmRleCA1OThmMjBkLi4wZjAzMjU4IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvTmV0d29yay5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9OZXR3b3JrLmphdmEKQEAgLTE2LDcgKzE2LDEyIEBACiAKIHBhY2thZ2UgYW5kcm9pZC53ZWJraXQ7CiAKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyOworaW1wb3J0IGFuZHJvaWQubmV0LkNvbm5lY3Rpdml0eU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5uZXQuTmV0d29ya0luZm87CiBpbXBvcnQgYW5kcm9pZC5uZXQuaHR0cC4qOwogaW1wb3J0IGFuZHJvaWQub3MuKjsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwpAQCAtNzYsNiArODEsMTkgQEAKICAgICAgKi8KICAgICBwcml2YXRlIEh0dHBBdXRoSGFuZGxlciBtSHR0cEF1dGhIYW5kbGVyOwogCisgICAgcHJpdmF0ZSBDb250ZXh0IG1Db250ZXh0OworCisgICAgLyoqCisgICAgICogVHJ1ZSBpZiB0aGUgY3VycmVudGx5IHVzZWQgbmV0d29yayBjb25uZWN0aW9uIGlzIGEgcm9hbWluZyBwaG9uZQorICAgICAqIGNvbm5lY3Rpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIG1Sb2FtaW5nOworCisgICAgLyoqCisgICAgICogVHJhY2tzIGlmIHdlIGFyZSByb2FtaW5nLgorICAgICAqLworICAgIHByaXZhdGUgUm9hbWluZ01vbml0b3IgbVJvYW1pbmdNb25pdG9yOworCiAgICAgLyoqCiAgICAgICogQHJldHVybiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBuZXR3b3JrLgogICAgICAqLwpAQCAtMTA3LDYgKzEyNSw3IEBACiAgICAgICAgIGlmICgrK3NQbGF0Zm9ybU5vdGlmaWNhdGlvbkVuYWJsZVJlZkNvdW50ID09IDEpIHsKICAgICAgICAgICAgIGlmIChzTmV0d29yayAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgc05ldHdvcmsubVJlcXVlc3RRdWV1ZS5lbmFibGVQbGF0Zm9ybU5vdGlmaWNhdGlvbnMoKTsKKyAgICAgICAgICAgICAgICBzTmV0d29yay5tb25pdG9yUm9hbWluZygpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBzUGxhdGZvcm1Ob3RpZmljYXRpb25zID0gdHJ1ZTsKICAgICAgICAgICAgIH0KQEAgLTEyMSw2ICsxNDAsNyBAQAogICAgICAgICBpZiAoLS1zUGxhdGZvcm1Ob3RpZmljYXRpb25FbmFibGVSZWZDb3VudCA9PSAwKSB7CiAgICAgICAgICAgICBpZiAoc05ldHdvcmsgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIHNOZXR3b3JrLm1SZXF1ZXN0UXVldWUuZGlzYWJsZVBsYXRmb3JtTm90aWZpY2F0aW9ucygpOworICAgICAgICAgICAgICAgIHNOZXR3b3JrLnN0b3BNb25pdG9yaW5nUm9hbWluZygpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBzUGxhdGZvcm1Ob3RpZmljYXRpb25zID0gZmFsc2U7CiAgICAgICAgICAgICB9CkBAIC0xMzYsMTIgKzE1NiwzOSBAQAogICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS4KICAgICAgICAgICAgICAgICAgICAgZ2V0TmFtZSgpLmVxdWFscyhXZWJWaWV3Q29yZS5USFJFQURfTkFNRSkpOwogICAgICAgICB9CisgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKICAgICAgICAgbVNzbEVycm9ySGFuZGxlciA9IG5ldyBTc2xFcnJvckhhbmRsZXIoKTsKICAgICAgICAgbUh0dHBBdXRoSGFuZGxlciA9IG5ldyBIdHRwQXV0aEhhbmRsZXIodGhpcyk7CiAKICAgICAgICAgbVJlcXVlc3RRdWV1ZSA9IG5ldyBSZXF1ZXN0UXVldWUoY29udGV4dCk7CiAgICAgfQogCisgICAgcHJpdmF0ZSBjbGFzcyBSb2FtaW5nTW9uaXRvciBleHRlbmRzIEJyb2FkY2FzdFJlY2VpdmVyIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVjZWl2ZShDb250ZXh0IGNvbnRleHQsIEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgICAgIGlmICghQ29ubmVjdGl2aXR5TWFuYWdlci5DT05ORUNUSVZJVFlfQUNUSU9OLmVxdWFscyhpbnRlbnQuZ2V0QWN0aW9uKCkpKQorICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgTmV0d29ya0luZm8gaW5mbyA9IChOZXR3b3JrSW5mbylpbnRlbnQuZ2V0UGFyY2VsYWJsZUV4dHJhKENvbm5lY3Rpdml0eU1hbmFnZXIuRVhUUkFfTkVUV09SS19JTkZPKTsKKyAgICAgICAgICAgIGlmIChpbmZvICE9IG51bGwpCisgICAgICAgICAgICAgICAgbVJvYW1pbmcgPSBpbmZvLmlzUm9hbWluZygpOworICAgICAgICB9OworICAgIH07CisKKyAgICBwcml2YXRlIHZvaWQgbW9uaXRvclJvYW1pbmcoKSB7CisgICAgICAgIG1Sb2FtaW5nTW9uaXRvciA9IG5ldyBSb2FtaW5nTW9uaXRvcigpOworICAgICAgICBJbnRlbnRGaWx0ZXIgZmlsdGVyID0gbmV3IEludGVudEZpbHRlcigpOworICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKENvbm5lY3Rpdml0eU1hbmFnZXIuQ09OTkVDVElWSVRZX0FDVElPTik7CisgICAgICAgIG1Db250ZXh0LnJlZ2lzdGVyUmVjZWl2ZXIoc05ldHdvcmsubVJvYW1pbmdNb25pdG9yLCBmaWx0ZXIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzdG9wTW9uaXRvcmluZ1JvYW1pbmcoKSB7CisgICAgICAgIGlmIChtUm9hbWluZ01vbml0b3IgIT0gbnVsbCkgeworICAgICAgICAgICAgbUNvbnRleHQudW5yZWdpc3RlclJlY2VpdmVyKG1Sb2FtaW5nTW9uaXRvcik7CisgICAgICAgICAgICBtUm9hbWluZ01vbml0b3IgPSBudWxsOworICAgICAgICB9CisgICAgfQorCiAgICAgLyoqCiAgICAgICogUmVxdWVzdCBhIHVybCBmcm9tIGVpdGhlciB0aGUgbmV0d29yayBvciB0aGUgZmlsZSBzeXN0ZW0uCiAgICAgICogQHBhcmFtIHVybCBUaGUgdXJsIHRvIGxvYWQuCkBAIC0xNzAsNiArMjE3LDExIEBACiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KIAorICAgICAgICAvLyBJZiB0aGlzIGlzIGEgcHJlZmV0Y2gsIGFib3J0IGl0IGlmIHdlJ3JlIHJvYW1pbmcuCisgICAgICAgIGlmIChtUm9hbWluZyAmJiBoZWFkZXJzLmNvbnRhaW5zS2V5KCJYLU1veiIpICYmICJwcmVmZXRjaCIuZXF1YWxzKGhlYWRlcnMuZ2V0KCJYLU1veiIpKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKICAgICAgICAgLyogRklYTUU6IHRoaXMgaXMgbGFtZS4gIFBhc3MgYW4gSW5wdXRTdHJlYW0gaW4sIHJhdGhlciB0aGFuCiAgICAgICAgICAgIG1ha2luZyB0aGlzIGxhbWUgb25lIGhlcmUgKi8KICAgICAgICAgSW5wdXRTdHJlYW0gYm9keVByb3ZpZGVyID0gbnVsbDsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9QbHVnaW5NYW5hZ2VyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvUGx1Z2luTWFuYWdlci5qYXZhCmluZGV4IGNkY2I2NjIuLmY3ZDExMzQgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9QbHVnaW5NYW5hZ2VyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1BsdWdpbk1hbmFnZXIuamF2YQpAQCAtMTQ5LDQxICsxNDksMTEgQEAKICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgdGhlIHBsdWdpbiBoYXMgdGhlIHJlcXVpcmVkIHBlcm1pc3Npb25zCi0gICAgICAgICAgICAgICAgU3RyaW5nIHBlcm1pc3Npb25zW10gPSBwa2dJbmZvLnJlcXVlc3RlZFBlcm1pc3Npb25zOwotICAgICAgICAgICAgICAgIGlmIChwZXJtaXNzaW9ucyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgdGhlIHBsdWdpbiBoYXMgdGhlIHJlcXVpcmVkIHBlcm1pc3Npb25zIGFuZAorICAgICAgICAgICAgICAgIC8vIHNpZ25hdHVyZXMKKyAgICAgICAgICAgICAgICBpZiAoIWNvbnRhaW5zUGx1Z2luUGVybWlzc2lvbkFuZFNpZ25hdHVyZXMocGtnSW5mbykpIHsKICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJvb2xlYW4gcGVybWlzc2lvbk9rID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgcGVybWl0IDogcGVybWlzc2lvbnMpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKFBMVUdJTl9QRVJNSVNTSU9OLmVxdWFscyhwZXJtaXQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwZXJtaXNzaW9uT2sgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCFwZXJtaXNzaW9uT2spIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gY2hlY2sgdG8gZW5zdXJlIHRoZSBwbHVnaW4gaXMgcHJvcGVybHkgc2lnbmVkCi0gICAgICAgICAgICAgICAgU2lnbmF0dXJlIHNpZ25hdHVyZXNbXSA9IHBrZ0luZm8uc2lnbmF0dXJlczsKLSAgICAgICAgICAgICAgICBpZiAoc2lnbmF0dXJlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoU3lzdGVtUHJvcGVydGllcy5nZXRCb29sZWFuKCJyby5zZWN1cmUiLCBmYWxzZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzaWduYXR1cmVNYXRjaCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBmb3IgKFNpZ25hdHVyZSBzaWduYXR1cmUgOiBzaWduYXR1cmVzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFNJR05BVFVSRVMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoU0lHTkFUVVJFU1tpXS5lcXVhbHMoc2lnbmF0dXJlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduYXR1cmVNYXRjaCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoIXNpZ25hdHVyZU1hdGNoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIC8vIGRldGVybWluZSB0aGUgdHlwZSBvZiBwbHVnaW4gZnJvbSB0aGUgbWFuaWZlc3QKICAgICAgICAgICAgICAgICBpZiAoc2VydmljZUluZm8ubWV0YURhdGEgPT0gbnVsbCkgewpAQCAtMjI2LDYgKzE5Niw2NCBAQAogICAgIH0KIAogICAgIC8qIHBhY2thZ2UgKi8KKyAgICBib29sZWFuIGNvbnRhaW5zUGx1Z2luUGVybWlzc2lvbkFuZFNpZ25hdHVyZXMoU3RyaW5nIHBsdWdpbkFQS05hbWUpIHsKKyAgICAgICAgUGFja2FnZU1hbmFnZXIgcG0gPSBtQ29udGV4dC5nZXRQYWNrYWdlTWFuYWdlcigpOworCisgICAgICAgIC8vIHJldHJpZXZlIGluZm9ybWF0aW9uIGZyb20gdGhlIHBsdWdpbidzIG1hbmlmZXN0CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBQYWNrYWdlSW5mbyBwa2dJbmZvID0gcG0uZ2V0UGFja2FnZUluZm8ocGx1Z2luQVBLTmFtZSwgUGFja2FnZU1hbmFnZXIuR0VUX1BFUk1JU1NJT05TCisgICAgICAgICAgICAgICAgICAgIHwgUGFja2FnZU1hbmFnZXIuR0VUX1NJR05BVFVSRVMpOworICAgICAgICAgICAgaWYgKHBrZ0luZm8gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBjb250YWluc1BsdWdpblBlcm1pc3Npb25BbmRTaWduYXR1cmVzKHBrZ0luZm8pOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChOYW1lTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLncoTE9HVEFHLCAiQ2FuJ3QgZmluZCBwbHVnaW46ICIgKyBwbHVnaW5BUEtOYW1lKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBjb250YWluc1BsdWdpblBlcm1pc3Npb25BbmRTaWduYXR1cmVzKFBhY2thZ2VJbmZvIHBrZ0luZm8pIHsKKworICAgICAgICAvLyBjaGVjayBpZiB0aGUgcGx1Z2luIGhhcyB0aGUgcmVxdWlyZWQgcGVybWlzc2lvbnMKKyAgICAgICAgU3RyaW5nIHBlcm1pc3Npb25zW10gPSBwa2dJbmZvLnJlcXVlc3RlZFBlcm1pc3Npb25zOworICAgICAgICBpZiAocGVybWlzc2lvbnMgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGJvb2xlYW4gcGVybWlzc2lvbk9rID0gZmFsc2U7CisgICAgICAgIGZvciAoU3RyaW5nIHBlcm1pdCA6IHBlcm1pc3Npb25zKSB7CisgICAgICAgICAgICBpZiAoUExVR0lOX1BFUk1JU1NJT04uZXF1YWxzKHBlcm1pdCkpIHsKKyAgICAgICAgICAgICAgICBwZXJtaXNzaW9uT2sgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghcGVybWlzc2lvbk9rKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvLyBjaGVjayB0byBlbnN1cmUgdGhlIHBsdWdpbiBpcyBwcm9wZXJseSBzaWduZWQKKyAgICAgICAgU2lnbmF0dXJlIHNpZ25hdHVyZXNbXSA9IHBrZ0luZm8uc2lnbmF0dXJlczsKKyAgICAgICAgaWYgKHNpZ25hdHVyZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmIChTeXN0ZW1Qcm9wZXJ0aWVzLmdldEJvb2xlYW4oInJvLnNlY3VyZSIsIGZhbHNlKSkgeworICAgICAgICAgICAgYm9vbGVhbiBzaWduYXR1cmVNYXRjaCA9IGZhbHNlOworICAgICAgICAgICAgZm9yIChTaWduYXR1cmUgc2lnbmF0dXJlIDogc2lnbmF0dXJlcykgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgU0lHTkFUVVJFUy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBpZiAoU0lHTkFUVVJFU1tpXS5lcXVhbHMoc2lnbmF0dXJlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlTWF0Y2ggPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIXNpZ25hdHVyZU1hdGNoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyogcGFja2FnZSAqLwogICAgIFN0cmluZyBnZXRQbHVnaW5zQVBLTmFtZShTdHJpbmcgcGx1Z2luTGliKSB7CiAKICAgICAgICAgLy8gYmFzaWMgZXJyb3IgY2hlY2tpbmcgb24gaW5wdXQgcGFyYW1zCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViQ2hyb21lQ2xpZW50LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViQ2hyb21lQ2xpZW50LmphdmEKaW5kZXggOWY2NDJjMC4uZTgzYmVmMCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYkNocm9tZUNsaWVudC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9XZWJDaHJvbWVDbGllbnQuamF2YQpAQCAtMzE0LDEwICszMTQsMTIgQEAKICAgICAvKioKICAgICAgKiBUZWxsIHRoZSBjbGllbnQgdG8gb3BlbiBhIGZpbGUgY2hvb3Nlci4KICAgICAgKiBAcGFyYW0gdXBsb2FkRmlsZSBBIFZhbHVlQ2FsbGJhY2sgdG8gc2V0IHRoZSBVUkkgb2YgdGhlIGZpbGUgdG8gdXBsb2FkLgotICAgICAqICAgICAgb25SZWNlaXZlVmFsdWUgbXVzdCBiZSBjYWxsZWQgdG8gd2FrZSB1cCB0aGUgdGhyZWFkLgorICAgICAqICAgICAgb25SZWNlaXZlVmFsdWUgbXVzdCBiZSBjYWxsZWQgdG8gd2FrZSB1cCB0aGUgdGhyZWFkLmEKKyAgICAgKiBAcGFyYW0gYWNjZXB0VHlwZSBUaGUgdmFsdWUgb2YgdGhlICdhY2NlcHQnIGF0dHJpYnV0ZSBvZiB0aGUgaW5wdXQgdGFnCisgICAgICogICAgICAgICBhc3NvY2lhdGVkIHdpdGggdGhpcyBmaWxlIHBpY2tlci4KICAgICAgKiBAaGlkZQogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG9wZW5GaWxlQ2hvb3NlcihWYWx1ZUNhbGxiYWNrPFVyaT4gdXBsb2FkRmlsZSkgeworICAgIHB1YmxpYyB2b2lkIG9wZW5GaWxlQ2hvb3NlcihWYWx1ZUNhbGxiYWNrPFVyaT4gdXBsb2FkRmlsZSwgU3RyaW5nIGFjY2VwdFR5cGUpIHsKICAgICAgICAgdXBsb2FkRmlsZS5vblJlY2VpdmVWYWx1ZShudWxsKTsKICAgICB9CiAKQEAgLTMzOCw0ICszNDAsMTEgQEAKICAgICBwdWJsaWMgdm9pZCBvblNlbGVjdGlvbkRvbmUoV2ViVmlldyB2aWV3KSB7CiAgICAgfQogCisgICAgLyoqCisgICAgICogVGVsbCB0aGUgY2xpZW50IHRoYXQgdGhlIHBhZ2UgYmVpbmcgdmlld2VkIGlzIHdlYiBhcHAgY2FwYWJsZSwKKyAgICAgKiBpLmUuIGhhcyBzcGVjaWZpZWQgdGhlIGZ1bGxzY3JlZW4td2ViLWFwcC1jYXBhYmxlIG1ldGEgdGFnLgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SW5zdGFsbGFibGVXZWJBcHAoKSB7IH0KKwogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYkhpc3RvcnlJdGVtLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViSGlzdG9yeUl0ZW0uamF2YQppbmRleCA0MjhhNTljLi43YzBlNDc4IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViSGlzdG9yeUl0ZW0uamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViSGlzdG9yeUl0ZW0uamF2YQpAQCAtMTgsNiArMTgsOSBAQAogCiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CiAKK2ltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworCiAvKioKICAqIEEgY29udmVuaWVuY2UgY2xhc3MgZm9yIGFjY2Vzc2luZyBmaWVsZHMgaW4gYW4gZW50cnkgaW4gdGhlIGJhY2svZm9yd2FyZCBsaXN0CiAgKiBvZiBhIFdlYlZpZXcuIEVhY2ggV2ViSGlzdG9yeUl0ZW0gaXMgYSBzbmFwc2hvdCBvZiB0aGUgcmVxdWVzdGVkIGhpc3RvcnkKQEAgLTM5LDggKzQyLDEyIEBACiAgICAgcHJpdmF0ZSBCaXRtYXAgbUZhdmljb247CiAgICAgLy8gVGhlIHByZS1mbGF0dGVuZWQgZGF0YSB1c2VkIGZvciBzYXZpbmcgdGhlIHN0YXRlLgogICAgIHByaXZhdGUgYnl0ZVtdIG1GbGF0dGVuZWREYXRhOwotICAgIC8vIFRoZSBhcHBsZS10b3VjaC1pY29uIHVybCBmb3IgdXNlIHdoZW4gYWRkaW5nIHRoZSBzaXRlIHRvIHRoZSBob21lIHNjcmVlbgotICAgIHByaXZhdGUgU3RyaW5nIG1Ub3VjaEljb25Vcmw7CisgICAgLy8gVGhlIGFwcGxlLXRvdWNoLWljb24gdXJsIGZvciB1c2Ugd2hlbiBhZGRpbmcgdGhlIHNpdGUgdG8gdGhlIGhvbWUgc2NyZWVuLAorICAgIC8vIGFzIG9idGFpbmVkIGZyb20gYSA8bGluaz4gZWxlbWVudCBpbiB0aGUgcGFnZS4KKyAgICBwcml2YXRlIFN0cmluZyBtVG91Y2hJY29uVXJsRnJvbUxpbms7CisgICAgLy8gSWYgbm8gPGxpbms+IGlzIHNwZWNpZmllZCwgdGhpcyBob2xkcyB0aGUgZGVmYXVsdCBsb2NhdGlvbiBvZiB0aGUKKyAgICAvLyBhcHBsZS10b3VjaC1pY29uLgorICAgIHByaXZhdGUgU3RyaW5nIG1Ub3VjaEljb25VcmxTZXJ2ZXJEZWZhdWx0OwogICAgIC8vIEN1c3RvbSBjbGllbnQgZGF0YSB0aGF0IGlzIG5vdCBmbGF0dGVuZWQgb3IgcmVhZCBieSBuYXRpdmUgY29kZS4KICAgICBwcml2YXRlIE9iamVjdCBtQ3VzdG9tRGF0YTsKIApAQCAtMTMyLDEwICsxMzksMjggQEAKIAogICAgIC8qKgogICAgICAqIFJldHVybiB0aGUgdG91Y2ggaWNvbiB1cmwuCisgICAgICogSWYgbm8gdG91Y2ggaWNvbiA8bGluaz4gdGFnIHdhcyBzcGVjaWZpZWQsIHJldHVybnMKKyAgICAgKiA8aG9zdD4vYXBwbGUtdG91Y2gtaWNvbi5wbmcuIFRoZSBEb3dubG9hZFRvdWNoSWNvbiBjbGFzcyB0aGF0CisgICAgICogYXR0ZW1wdHMgdG8gcmV0cmlldmUgdGhlIHRvdWNoIGljb24gd2lsbCBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUKKyAgICAgKiB0aGF0IGZpbGUgZG9lcyBub3QgZXhpc3QuIEFuIGljb24gc2V0IGJ5IGEgPGxpbms+IHRhZyBpcyBhbHdheXMKKyAgICAgKiB1c2VkIGluIHByZWZlcmVuY2UgdG8gYW4gaWNvbiBzYXZlZCBvbiB0aGUgc2VydmVyLgogICAgICAqIEBoaWRlCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXRUb3VjaEljb25VcmwoKSB7Ci0gICAgICAgIHJldHVybiBtVG91Y2hJY29uVXJsOworICAgICAgICBpZiAobVRvdWNoSWNvblVybEZyb21MaW5rICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBtVG91Y2hJY29uVXJsRnJvbUxpbms7CisgICAgICAgIH0gZWxzZSBpZiAobVRvdWNoSWNvblVybFNlcnZlckRlZmF1bHQgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG1Ub3VjaEljb25VcmxTZXJ2ZXJEZWZhdWx0OworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFVSTCB1cmwgPSBuZXcgVVJMKG1PcmlnaW5hbFVybCk7CisgICAgICAgICAgICBtVG91Y2hJY29uVXJsU2VydmVyRGVmYXVsdCA9IG5ldyBVUkwodXJsLmdldFByb3RvY29sKCksIHVybC5nZXRIb3N0KCksIHVybC5nZXRQb3J0KCksCisgICAgICAgICAgICAgICAgICAgICIvYXBwbGUtdG91Y2gtaWNvbi5wbmciKS50b1N0cmluZygpOworICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1Ub3VjaEljb25VcmxTZXJ2ZXJEZWZhdWx0OwogICAgIH0KIAogICAgIC8qKgpAQCAtMTcxLDExICsxOTYsMTQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXQgdGhlIHRvdWNoIGljb24gdXJsLgorICAgICAqIFNldCB0aGUgdG91Y2ggaWNvbiB1cmwuIFdpbGwgbm90IG92ZXJ3cml0ZSBhbiBpY29uIHRoYXQgaGFzIGJlZW4KKyAgICAgKiBzZXQgYWxyZWFkeSBmcm9tIGEgPGxpbms+IHRhZywgdW5sZXNzIHRoZSBuZXcgaWNvbiBpcyBwcmVjb21wb3NlZC4KICAgICAgKiBAaGlkZQogICAgICAqLwotICAgIC8qcGFja2FnZSovIHZvaWQgc2V0VG91Y2hJY29uVXJsKFN0cmluZyB1cmwpIHsKLSAgICAgICAgbVRvdWNoSWNvblVybCA9IHVybDsKKyAgICAvKnBhY2thZ2UqLyB2b2lkIHNldFRvdWNoSWNvblVybChTdHJpbmcgdXJsLCBib29sZWFuIHByZWNvbXBvc2VkKSB7CisgICAgICAgIGlmIChwcmVjb21wb3NlZCB8fCBtVG91Y2hJY29uVXJsRnJvbUxpbmsgPT0gbnVsbCkgeworICAgICAgICAgICAgbVRvdWNoSWNvblVybEZyb21MaW5rID0gdXJsOworICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViU2V0dGluZ3MuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9XZWJTZXR0aW5ncy5qYXZhCmluZGV4IGI3NjdmMTEuLmFiZDFlNWQgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9XZWJTZXR0aW5ncy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9XZWJTZXR0aW5ncy5qYXZhCkBAIC0yMiw4ICsyMiw5IEBACiBpbXBvcnQgYW5kcm9pZC5vcy5CdWlsZDsKIGltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOworaW1wb3J0IGFuZHJvaWQudXRpbC5EaXNwbGF5TWV0cmljczsKIGltcG9ydCBhbmRyb2lkLnV0aWwuRXZlbnRMb2c7Ci1pbXBvcnQgamF2YS5sYW5nLlNlY3VyaXR5RXhjZXB0aW9uOworCiBpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKIAogLyoqCkBAIC0xMDcsNyArMTA4LDcgQEAKICAgICAgKiBVc2Ugd2l0aCB7QGxpbmsgI3NldENhY2hlTW9kZX0uCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTE9BRF9OT19DQUNIRSA9IDI7Ci0gICAgCisKICAgICAvKioKICAgICAgKiBEb24ndCB1c2UgdGhlIG5ldHdvcmssIGxvYWQgZnJvbSBjYWNoZSBvbmx5LgogICAgICAqIFVzZSB3aXRoIHtAbGluayAjc2V0Q2FjaGVNb2RlfS4KQEAgLTE3NiwxNCArMTc3LDE4IEBACiAgICAgcHJpdmF0ZSBib29sZWFuICAgICAgICAgbUphdmFTY3JpcHRDYW5PcGVuV2luZG93c0F1dG9tYXRpY2FsbHkgPSBmYWxzZTsKICAgICBwcml2YXRlIGJvb2xlYW4gICAgICAgICBtVXNlRG91YmxlVHJlZSA9IGZhbHNlOwogICAgIHByaXZhdGUgYm9vbGVhbiAgICAgICAgIG1Vc2VXaWRlVmlld3BvcnQgPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gICAgICAgICBtVXNlRml4ZWRWaWV3cG9ydCA9IGZhbHNlOwogICAgIHByaXZhdGUgYm9vbGVhbiAgICAgICAgIG1TdXBwb3J0TXVsdGlwbGVXaW5kb3dzID0gZmFsc2U7CiAgICAgcHJpdmF0ZSBib29sZWFuICAgICAgICAgbVNocmlua3NTdGFuZGFsb25lSW1hZ2VzVG9GaXQgPSBmYWxzZTsKKyAgICBwcml2YXRlIGxvbmcgICAgICAgICAgICBtTWF4aW11bURlY29kZWRJbWFnZVNpemUgPSAwOyAvLyAwIG1lYW5zIGRlZmF1bHQKKyAgICBwcml2YXRlIGJvb2xlYW4gICAgICAgICBtUHJpdmF0ZUJyb3dzaW5nRW5hYmxlZCA9IGZhbHNlOwogICAgIC8vIEhUTUw1IEFQSSBmbGFncwogICAgIHByaXZhdGUgYm9vbGVhbiAgICAgICAgIG1BcHBDYWNoZUVuYWJsZWQgPSBmYWxzZTsKICAgICBwcml2YXRlIGJvb2xlYW4gICAgICAgICBtRGF0YWJhc2VFbmFibGVkID0gZmFsc2U7CiAgICAgcHJpdmF0ZSBib29sZWFuICAgICAgICAgbURvbVN0b3JhZ2VFbmFibGVkID0gZmFsc2U7CiAgICAgcHJpdmF0ZSBib29sZWFuICAgICAgICAgbVdvcmtlcnNFbmFibGVkID0gZmFsc2U7ICAvLyBvbmx5IGFmZmVjdHMgVjguCiAgICAgcHJpdmF0ZSBib29sZWFuICAgICAgICAgbUdlb2xvY2F0aW9uRW5hYmxlZCA9IHRydWU7CisgICAgcHJpdmF0ZSBib29sZWFuICAgICAgICAgbVhTU0F1ZGl0b3JFbmFibGVkID0gZmFsc2U7CiAgICAgLy8gSFRNTDUgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzCiAgICAgcHJpdmF0ZSBsb25nICAgICAgICAgICAgbUFwcENhY2hlTWF4U2l6ZSA9IExvbmcuTUFYX1ZBTFVFOwogICAgIHByaXZhdGUgU3RyaW5nICAgICAgICAgIG1BcHBDYWNoZVBhdGggPSAiIjsKQEAgLTIwNyw2ICsyMTIsNyBAQAogICAgIHByaXZhdGUgYm9vbGVhbiAgICAgICAgIG1CdWlsdEluWm9vbUNvbnRyb2xzID0gZmFsc2U7CiAgICAgcHJpdmF0ZSBib29sZWFuICAgICAgICAgbUFsbG93RmlsZUFjY2VzcyA9IHRydWU7CiAgICAgcHJpdmF0ZSBib29sZWFuICAgICAgICAgbUxvYWRXaXRoT3ZlcnZpZXdNb2RlID0gZmFsc2U7CisgICAgcHJpdmF0ZSBib29sZWFuICAgICAgICAgbUVuYWJsZVNtb290aFRyYW5zaXRpb24gPSBmYWxzZTsKIAogICAgIC8vIHByaXZhdGUgV2ViU2V0dGluZ3MsIG5vdCBhY2Nlc3NpYmxlIGJ5IHRoZSBob3N0IGFjdGl2aXR5CiAgICAgc3RhdGljIHByaXZhdGUgaW50ICAgICAgbURvdWJsZVRhcFRvYXN0Q291bnQgPSAzOwpAQCAtMjk2LDEzICszMDIsMTMgQEAKICAgICAgICAgICAgICJNb3ppbGxhLzUuMCAoTWFjaW50b3NoOyBVOyBJbnRlbCBNYWMgT1MgWCAxMF81Xzc7IGVuLXVzKSIKICAgICAgICAgICAgICsgIiBBcHBsZVdlYktpdC81MzAuMTcgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzQuMCIKICAgICAgICAgICAgICsgIiBTYWZhcmkvNTMwLjE3IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSVBIT05FX1VTRVJBR0VOVCA9IAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJUEhPTkVfVVNFUkFHRU5UID0KICAgICAgICAgICAgICJNb3ppbGxhLzUuMCAoaVBob25lOyBVOyBDUFUgaVBob25lIE9TIDNfMCBsaWtlIE1hYyBPUyBYOyBlbi11cykiCiAgICAgICAgICAgICArICIgQXBwbGVXZWJLaXQvNTI4LjE4IChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi80LjAiCiAgICAgICAgICAgICArICIgTW9iaWxlLzdBMzQxIFNhZmFyaS81MjguMTYiOwogICAgIHByaXZhdGUgc3RhdGljIExvY2FsZSBzTG9jYWxlOwogICAgIHByaXZhdGUgc3RhdGljIE9iamVjdCBzTG9ja0ZvckxvY2FsZVNldHRpbmdzOwotICAgIAorCiAgICAgLyoqCiAgICAgICogUGFja2FnZSBjb25zdHJ1Y3RvciB0byBwcmV2ZW50IGNsaWVudHMgZnJvbSBjcmVhdGluZyBhIG5ldyBzZXR0aW5ncwogICAgICAqIGluc3RhbmNlLgpAQCAtMzE0LDYgKzMyMCwxMSBAQAogICAgICAgICBtRGVmYXVsdFRleHRFbmNvZGluZyA9IGNvbnRleHQuZ2V0U3RyaW5nKGNvbS5hbmRyb2lkLmludGVybmFsLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFIuc3RyaW5nLmRlZmF1bHRfdGV4dF9lbmNvZGluZyk7CiAKKyAgICAgICAgLy8gRGV0ZWN0IHRhYmxldCBkZXZpY2UgZm9yIGZpeGVkIHZpZXdwb3J0IG1vZGUuCisgICAgICAgIGZpbmFsIERpc3BsYXlNZXRyaWNzIG1ldHJpY3MgPSBjb250ZXh0LmdldFJlc291cmNlcygpLmdldERpc3BsYXlNZXRyaWNzKCk7CisgICAgICAgIG1Vc2VGaXhlZFZpZXdwb3J0ID0gKG1ldHJpY3MuZGVuc2l0eSA9PSAxLjBmIAorICAgICAgICAgICAgJiYgKG1ldHJpY3Mud2lkdGhQaXhlbHMgPj0gODAwIHx8bWV0cmljcy5oZWlnaHRQaXhlbHMgPj0gODAwKSk7CisKICAgICAgICAgaWYgKHNMb2NrRm9yTG9jYWxlU2V0dGluZ3MgPT0gbnVsbCkgewogICAgICAgICAgICAgc0xvY2tGb3JMb2NhbGVTZXR0aW5ncyA9IG5ldyBPYmplY3QoKTsKICAgICAgICAgICAgIHNMb2NhbGUgPSBMb2NhbGUuZ2V0RGVmYXVsdCgpOwpAQCAtMzI3LDYgKzMzOCw4IEBACiAgICAgICAgICAgICAgICAgYW5kcm9pZC5vcy5Qcm9jZXNzLm15VWlkKCkpICE9IFBhY2thZ2VNYW5hZ2VyLlBFUk1JU1NJT05fR1JBTlRFRDsKICAgICB9CiAKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNDRVBUX0xBTkdfRk9SX1VTX0xPQ0FMRSA9ICJlbi1VUyI7CisKICAgICAvKioKICAgICAgKiBMb29rcyBhdCBzTG9jYWxlIGFuZCByZXR1cm5zIGN1cnJlbnQgQWNjZXB0TGFuZ3VhZ2UgU3RyaW5nLgogICAgICAqIEByZXR1cm4gQ3VycmVudCBBY2NlcHRMYW5ndWFnZSBTdHJpbmcuCkBAIC0zMzYsMzIgKzM0OSw1MyBAQAogICAgICAgICBzeW5jaHJvbml6ZWQoc0xvY2tGb3JMb2NhbGVTZXR0aW5ncykgewogICAgICAgICAgICAgbG9jYWxlID0gc0xvY2FsZTsKICAgICAgICAgfQotICAgICAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBmaW5hbCBTdHJpbmcgbGFuZ3VhZ2UgPSBsb2NhbGUuZ2V0TGFuZ3VhZ2UoKTsKLSAgICAgICAgaWYgKGxhbmd1YWdlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQobGFuZ3VhZ2UpOwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGNvdW50cnkgPSBsb2NhbGUuZ2V0Q291bnRyeSgpOwotICAgICAgICAgICAgaWYgKGNvdW50cnkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIi0iKTsKLSAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKGNvdW50cnkpOworICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIGFkZExvY2FsZVRvSHR0cEFjY2VwdExhbmd1YWdlKGJ1ZmZlciwgbG9jYWxlKTsKKworICAgICAgICBpZiAoIUxvY2FsZS5VUy5lcXVhbHMobG9jYWxlKSkgeworICAgICAgICAgICAgaWYgKGJ1ZmZlci5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCIsICIpOwogICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmICghbG9jYWxlLmVxdWFscyhMb2NhbGUuVVMpKSB7Ci0gICAgICAgICAgICBidWZmZXIuYXBwZW5kKCIsICIpOwotICAgICAgICAgICAgamF2YS51dGlsLkxvY2FsZSB1cyA9IExvY2FsZS5VUzsKLSAgICAgICAgICAgIGlmICh1cy5nZXRMYW5ndWFnZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKHVzLmdldExhbmd1YWdlKCkpOwotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBjb3VudHJ5ID0gdXMuZ2V0Q291bnRyeSgpOwotICAgICAgICAgICAgICAgIGlmIChjb3VudHJ5ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiLSIpOwotICAgICAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKGNvdW50cnkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoQUNDRVBUX0xBTkdfRk9SX1VTX0xPQ0FMRSk7CiAgICAgICAgIH0KIAogICAgICAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7CiAgICAgfQotICAgIAorCisgICAgLyoqCisgICAgICogQ29udmVydCBvYnNvbGV0ZSBsYW5ndWFnZSBjb2RlcywgaW5jbHVkaW5nIEhlYnJldy9JbmRvbmVzaWFuL1lpZGRpc2gsCisgICAgICogdG8gbmV3IHN0YW5kYXJkLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBjb252ZXJ0T2Jzb2xldGVMYW5ndWFnZUNvZGVUb05ldyhTdHJpbmcgbGFuZ0NvZGUpIHsKKyAgICAgICAgaWYgKGxhbmdDb2RlID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIGlmICgiaXciLmVxdWFscyhsYW5nQ29kZSkpIHsKKyAgICAgICAgICAgIC8vIEhlYnJldworICAgICAgICAgICAgcmV0dXJuICJoZSI7CisgICAgICAgIH0gZWxzZSBpZiAoImluIi5lcXVhbHMobGFuZ0NvZGUpKSB7CisgICAgICAgICAgICAvLyBJbmRvbmVzaWFuCisgICAgICAgICAgICByZXR1cm4gImlkIjsKKyAgICAgICAgfSBlbHNlIGlmICgiamkiLmVxdWFscyhsYW5nQ29kZSkpIHsKKyAgICAgICAgICAgIC8vIFlpZGRpc2gKKyAgICAgICAgICAgIHJldHVybiAieWkiOworICAgICAgICB9CisgICAgICAgIHJldHVybiBsYW5nQ29kZTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGFkZExvY2FsZVRvSHR0cEFjY2VwdExhbmd1YWdlKFN0cmluZ0J1aWxkZXIgYnVpbGRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvY2FsZSBsb2NhbGUpIHsKKyAgICAgICAgU3RyaW5nIGxhbmd1YWdlID0gY29udmVydE9ic29sZXRlTGFuZ3VhZ2VDb2RlVG9OZXcobG9jYWxlLmdldExhbmd1YWdlKCkpOworICAgICAgICBpZiAobGFuZ3VhZ2UgIT0gbnVsbCkgeworICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQobGFuZ3VhZ2UpOworICAgICAgICAgICAgU3RyaW5nIGNvdW50cnkgPSBsb2NhbGUuZ2V0Q291bnRyeSgpOworICAgICAgICAgICAgaWYgKGNvdW50cnkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCItIik7CisgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoY291bnRyeSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKICAgICAvKioKICAgICAgKiBMb29rcyBhdCBzTG9jYWxlIGFuZCBtQ29udGV4dCBhbmQgcmV0dXJucyBjdXJyZW50IFVzZXJBZ2VudCBTdHJpbmcuCiAgICAgICogQHJldHVybiBDdXJyZW50IFVzZXJBZ2VudCBTdHJpbmcuCkBAIC0zNzksMTEgKzQxMywxMSBAQAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLy8gZGVmYXVsdCB0byAiMS4wIgogICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiMS4wIik7Ci0gICAgICAgIH0gIAorICAgICAgICB9CiAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIjsgIik7CiAgICAgICAgIGZpbmFsIFN0cmluZyBsYW5ndWFnZSA9IGxvY2FsZS5nZXRMYW5ndWFnZSgpOwogICAgICAgICBpZiAobGFuZ3VhZ2UgIT0gbnVsbCkgewotICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChsYW5ndWFnZS50b0xvd2VyQ2FzZSgpKTsKKyAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoY29udmVydE9ic29sZXRlTGFuZ3VhZ2VDb2RlVG9OZXcobGFuZ3VhZ2UpKTsKICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBjb3VudHJ5ID0gbG9jYWxlLmdldENvdW50cnkoKTsKICAgICAgICAgICAgIGlmIChjb3VudHJ5ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCItIik7CkBAIC00MDYsMTEgKzQ0MCwxMyBAQAogICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiIEJ1aWxkLyIpOwogICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChpZCk7CiAgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIG1vYmlsZSA9IG1Db250ZXh0LmdldFJlc291cmNlcygpLmdldFRleHQoCisgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy53ZWJfdXNlcl9hZ2VudF90YXJnZXRfY29udGVudCkudG9TdHJpbmcoKTsKICAgICAgICAgZmluYWwgU3RyaW5nIGJhc2UgPSBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRUZXh0KAogICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3RyaW5nLndlYl91c2VyX2FnZW50KS50b1N0cmluZygpOwotICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdChiYXNlLCBidWZmZXIpOworICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdChiYXNlLCBidWZmZXIsIG1vYmlsZSk7CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogRW5hYmxlcyBkdW1waW5nIHRoZSBwYWdlcyBuYXZpZ2F0aW9uIGNhY2hlIHRvIGEgdGV4dCBmaWxlLgogICAgICAqLwpAQCAtNDI2LDYgKzQ2MiwyMSBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIElmIFdlYlZpZXcgb25seSBzdXBwb3J0cyB0b3VjaCwgYSBkaWZmZXJlbnQgbmF2aWdhdGlvbiBtb2RlbCB3aWxsIGJlCisgICAgICogYXBwbGllZC4gT3RoZXJ3aXNlLCB0aGUgbmF2aWdhdGlvbiB0byBzdXBwb3J0IGJvdGggdG91Y2ggYW5kIGtleWJvYXJkCisgICAgICogd2lsbCBiZSB1c2VkLgorICAgICAqIEBoaWRlCisgICAgcHVibGljIHZvaWQgc2V0U3VwcG9ydFRvdWNoT25seShib29sZWFuIHRvdWNoT25seSkgeworICAgICAgICBtU3VwcG9ydFRvdW5jaE9ubHkgPSB0b3VjaE9ubHk7CisgICAgfQorICAgICAqLworCisgICAgYm9vbGVhbiBzdXBwb3J0VG91Y2hPbmx5KCkgeworICAgICAgICAvLyBmb3IgZGVidWcgb25seSwgdXNlIG1MaWdodFRvdWNoRW5hYmxlZCBmb3IgbVN1cHBvcnRUb3VuY2hPbmx5CisgICAgICAgIHJldHVybiBtTGlnaHRUb3VjaEVuYWJsZWQ7CisgICAgfQorCisgICAgLyoqCiAgICAgICogU2V0IHdoZXRoZXIgdGhlIFdlYlZpZXcgc3VwcG9ydHMgem9vbQogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFN1cHBvcnRab29tKGJvb2xlYW4gc3VwcG9ydCkgewpAQCAtNDQ3LDE0ICs0OTgsMTQgQEAKICAgICAgICAgbUJ1aWx0SW5ab29tQ29udHJvbHMgPSBlbmFibGVkOwogICAgICAgICBtV2ViVmlldy51cGRhdGVNdWx0aVRvdWNoU3VwcG9ydChtQ29udGV4dCk7CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSB6b29tIG1lY2hhbmlzbSBidWlsdCBpbnRvIFdlYlZpZXcgaXMgYmVpbmcgdXNlZC4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBnZXRCdWlsdEluWm9vbUNvbnRyb2xzKCkgewogICAgICAgICByZXR1cm4gbUJ1aWx0SW5ab29tQ29udHJvbHM7CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogRW5hYmxlIG9yIGRpc2FibGUgZmlsZSBhY2Nlc3Mgd2l0aGluIFdlYlZpZXcuIEZpbGUgYWNjZXNzIGlzIGVuYWJsZWQgYnkKICAgICAgKiBkZWZhdWx0LgpAQCAtNDg1LDYgKzUzNiwyNSBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFNldCB3aGV0aGVyIHRoZSBXZWJWaWV3IHdpbGwgZW5hYmxlIHNtb290aCB0cmFuc2l0aW9uIHdoaWxlIHBhbm5pbmcgb3IKKyAgICAgKiB6b29taW5nLiBJZiBpdCBpcyB0cnVlLCBXZWJWaWV3IHdpbGwgY2hvb3NlIGEgc29sdXRpb24gdG8gbWF4aW1pemUgdGhlCisgICAgICogcGVyZm9ybWFuY2UuIGUuZy4gdGhlIFdlYlZpZXcncyBjb250ZW50IG1heSBub3QgYmUgdXBkYXRlZCBkdXJpbmcgdGhlCisgICAgICogdHJhbnNpdGlvbi4gSWYgaXQgaXMgZmFsc2UsIFdlYlZpZXcgd2lsbCBrZWVwIGl0cyBmaWRlbGl0eS4gVGhlIGRlZmF1bHQKKyAgICAgKiB2YWx1ZSBpcyBmYWxzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRFbmFibGVTbW9vdGhUcmFuc2l0aW9uKGJvb2xlYW4gZW5hYmxlKSB7CisgICAgICAgIG1FbmFibGVTbW9vdGhUcmFuc2l0aW9uID0gZW5hYmxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgV2ViVmlldyBlbmFibGVzIHNtb290aCB0cmFuc2l0aW9uIHdoaWxlIHBhbm5pbmcgb3IKKyAgICAgKiB6b29taW5nLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGVuYWJsZVNtb290aFRyYW5zaXRpb24oKSB7CisgICAgICAgIHJldHVybiBtRW5hYmxlU21vb3RoVHJhbnNpdGlvbjsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBTdG9yZSB3aGV0aGVyIHRoZSBXZWJWaWV3IGlzIHNhdmluZyBmb3JtIGRhdGEuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0U2F2ZUZvcm1EYXRhKGJvb2xlYW4gc2F2ZSkgewpAQCAtOTg0LDggKzEwNTQsOCBAQAogCiAgICAgcHJpdmF0ZSB2b2lkIHZlcmlmeU5ldHdvcmtBY2Nlc3MoKSB7CiAgICAgICAgIGlmICghbUJsb2NrTmV0d29ya0xvYWRzKSB7Ci0gICAgICAgICAgICBpZiAobUNvbnRleHQuY2hlY2tQZXJtaXNzaW9uKCJhbmRyb2lkLnBlcm1pc3Npb24uSU5URVJORVQiLCAKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZC5vcy5Qcm9jZXNzLm15UGlkKCksIGFuZHJvaWQub3MuUHJvY2Vzcy5teVVpZCgpKSAhPSAKKyAgICAgICAgICAgIGlmIChtQ29udGV4dC5jaGVja1Blcm1pc3Npb24oImFuZHJvaWQucGVybWlzc2lvbi5JTlRFUk5FVCIsCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQub3MuUHJvY2Vzcy5teVBpZCgpLCBhbmRyb2lkLm9zLlByb2Nlc3MubXlVaWQoKSkgIT0KICAgICAgICAgICAgICAgICAgICAgICAgIFBhY2thZ2VNYW5hZ2VyLlBFUk1JU1NJT05fR1JBTlRFRCkgewogICAgICAgICAgICAgICAgIHRocm93IG5ldyBTZWN1cml0eUV4Y2VwdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAgKCJQZXJtaXNzaW9uIGRlbmllZCAtICIgKwpAQCAtMTAxMSw2ICsxMDgxLDcgQEAKICAgICAgKiBAZGVwcmVjYXRlZCBUaGlzIG1ldGhvZCBoYXMgYmVlbiBkZXByZWNhdGVkIGluIGZhdm9yIG9mCiAgICAgICogICAgICAgICAgICAge0BsaW5rICNzZXRQbHVnaW5TdGF0ZX0KICAgICAgKi8KKyAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRQbHVnaW5zRW5hYmxlZChib29sZWFuIGZsYWcpIHsKICAgICAgICAgc2V0UGx1Z2luU3RhdGUoUGx1Z2luU3RhdGUuT04pOwogICAgIH0KQEAgLTExNzYsNiArMTI0NywxOCBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFNldHMgd2hldGhlciBYU1MgQXVkaXRvciBpcyBlbmFibGVkLgorICAgICAqIEBwYXJhbSBmbGFnIFdoZXRoZXIgWFNTIEF1ZGl0b3Igc2hvdWxkIGJlIGVuYWJsZWQuCisgICAgICogQGhpZGUgT25seSB1c2VkIGJ5IExheW91dFRlc3RDb250cm9sbGVyLgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRYU1NBdWRpdG9yRW5hYmxlZChib29sZWFuIGZsYWcpIHsKKyAgICAgICAgaWYgKG1YU1NBdWRpdG9yRW5hYmxlZCAhPSBmbGFnKSB7CisgICAgICAgICAgICBtWFNTQXVkaXRvckVuYWJsZWQgPSBmbGFnOworICAgICAgICAgICAgcG9zdFN5bmMoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgogICAgICAqIFJldHVybiB0cnVlIGlmIGphdmFzY3JpcHQgaXMgZW5hYmxlZC4gPGI+Tm90ZTogVGhlIGRlZmF1bHQgaXMgZmFsc2UuPC9iPgogICAgICAqIEByZXR1cm4gVHJ1ZSBpZiBqYXZhc2NyaXB0IGlzIGVuYWJsZWQuCiAgICAgICovCkBAIC0xMTg4LDYgKzEyNzEsNyBAQAogICAgICAqIEByZXR1cm4gVHJ1ZSBpZiBwbHVnaW5zIGFyZSBlbmFibGVkLgogICAgICAqIEBkZXByZWNhdGVkIFRoaXMgbWV0aG9kIGhhcyBiZWVuIHJlcGxhY2VkIGJ5IHtAbGluayAjZ2V0UGx1Z2luU3RhdGV9CiAgICAgICovCisgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gZ2V0UGx1Z2luc0VuYWJsZWQoKSB7CiAgICAgICAgIHJldHVybiBtUGx1Z2luU3RhdGUgPT0gUGx1Z2luU3RhdGUuT047CiAgICAgfQpAQCAtMTI1Niw3ICsxMzQwLDcgQEAKICAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0VXNlckFnZW50U3RyaW5nKFN0cmluZyB1YSkgewogICAgICAgICBpZiAodWEgPT0gbnVsbCB8fCB1YS5sZW5ndGgoKSA9PSAwKSB7CiAgICAgICAgICAgICBzeW5jaHJvbml6ZWQoc0xvY2tGb3JMb2NhbGVTZXR0aW5ncykgewotICAgICAgICAgICAgICAgIExvY2FsZSBjdXJyZW50TG9jYWxlID0gTG9jYWxlLmdldERlZmF1bHQoKTsgCisgICAgICAgICAgICAgICAgTG9jYWxlIGN1cnJlbnRMb2NhbGUgPSBMb2NhbGUuZ2V0RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgIGlmICghc0xvY2FsZS5lcXVhbHMoY3VycmVudExvY2FsZSkpIHsKICAgICAgICAgICAgICAgICAgICAgc0xvY2FsZSA9IGN1cnJlbnRMb2NhbGU7CiAgICAgICAgICAgICAgICAgICAgIG1BY2NlcHRMYW5ndWFnZSA9IGdldEN1cnJlbnRBY2NlcHRMYW5ndWFnZSgpOwpAQCAtMTMxMSwxMSArMTM5NSwxMSBAQAogICAgICAgICB9CiAgICAgICAgIHJldHVybiBtQWNjZXB0TGFuZ3VhZ2U7CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogVGVsbCB0aGUgV2ViVmlldyB3aGV0aGVyIGl0IG5lZWRzIHRvIHNldCBhIG5vZGUgdG8gaGF2ZSBmb2N1cyB3aGVuCiAgICAgICoge0BsaW5rIFdlYlZpZXcjcmVxdWVzdEZvY3VzKGludCwgYW5kcm9pZC5ncmFwaGljcy5SZWN0KX0gaXMgY2FsbGVkLgotICAgICAqIAorICAgICAqCiAgICAgICogQHBhcmFtIGZsYWcKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXROZWVkSW5pdGlhbEZvY3VzKGJvb2xlYW4gZmxhZykgewpAQCAtMTM0Miw3ICsxNDI2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgRXZlbnRIYW5kbGVyLlBSSU9SSVRZKSk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBPdmVycmlkZSB0aGUgd2F5IHRoZSBjYWNoZSBpcyB1c2VkLiBUaGUgd2F5IHRoZSBjYWNoZSBpcyB1c2VkIGlzIGJhc2VkCiAgICAgICogb24gdGhlIG5hdmlnYXRpb24gb3B0aW9uLiBGb3IgYSBub3JtYWwgcGFnZSBsb2FkLCB0aGUgY2FjaGUgaXMgY2hlY2tlZApAQCAtMTM1Niw3ICsxNDQwLDcgQEAKICAgICAgICAgICAgIG1PdmVycmlkZUNhY2hlTW9kZSA9IG1vZGU7CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBSZXR1cm4gdGhlIGN1cnJlbnQgc2V0dGluZyBmb3Igb3ZlcnJpZGluZyB0aGUgY2FjaGUgbW9kZS4gRm9yIGEgZnVsbAogICAgICAqIGRlc2NyaXB0aW9uLCBzZWUgdGhlIHtAbGluayAjc2V0Q2FjaGVNb2RlKGludCl9IGZ1bmN0aW9uLgpAQCAtMTM2NCw3ICsxNDQ4LDcgQEAKICAgICBwdWJsaWMgaW50IGdldENhY2hlTW9kZSgpIHsKICAgICAgICAgcmV0dXJuIG1PdmVycmlkZUNhY2hlTW9kZTsKICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBJZiBzZXQsIHdlYmtpdCBhbHRlcm5hdGVseSBzaHJpbmtzIGFuZCBleHBhbmRzIGltYWdlcyB2aWV3ZWQgb3V0c2lkZQogICAgICAqIG9mIGFuIEhUTUwgcGFnZSB0byBmaXQgdGhlIHNjcmVlbi4gVGhpcyBjb25mbGljdHMgd2l0aCBhdHRlbXB0cyBieQpAQCAtMTM3OSw2ICsxNDYzLDQ0IEBACiAgICAgICAgIH0KICAgICAgfQogCisgICAgLyoqCisgICAgICogU3BlY2lmeSB0aGUgbWF4aW11bSBkZWNvZGVkIGltYWdlIHNpemUuIFRoZSBkZWZhdWx0IGlzCisgICAgICogMiBtZWdzIGZvciBzbWFsbCBtZW1vcnkgZGV2aWNlcyBhbmQgOCBtZWdzIGZvciBsYXJnZSBtZW1vcnkgZGV2aWNlcy4KKyAgICAgKiBAcGFyYW0gc2l6ZSBUaGUgbWF4aW11bSBkZWNvZGVkIHNpemUsIG9yIHplcm8gdG8gc2V0IHRvIHRoZSBkZWZhdWx0LgorICAgICAqIEBoaWRlIHBlbmRpbmcgYXBpIGNvdW5jaWwgYXBwcm92YWwKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNYXhpbXVtRGVjb2RlZEltYWdlU2l6ZShsb25nIHNpemUpIHsKKyAgICAgICAgaWYgKG1NYXhpbXVtRGVjb2RlZEltYWdlU2l6ZSAhPSBzaXplKSB7CisgICAgICAgICAgICBtTWF4aW11bURlY29kZWRJbWFnZVNpemUgPSBzaXplOworICAgICAgICAgICAgcG9zdFN5bmMoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgd2hldGhlciB0byB1c2UgZml4ZWQgdmlld3BvcnQuCisgICAgICovCisgICAgLyogcGFja2FnZSAqLyBib29sZWFuIGdldFVzZUZpeGVkVmlld3BvcnQoKSB7CisgICAgICAgIHJldHVybiBtVXNlRml4ZWRWaWV3cG9ydDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgcHJpdmF0ZSBicm93c2luZyBpcyBlbmFibGVkLgorICAgICAqLworICAgIC8qIHBhY2thZ2UgKi8gYm9vbGVhbiBpc1ByaXZhdGVCcm93c2luZ0VuYWJsZWQoKSB7CisgICAgICAgIHJldHVybiBtUHJpdmF0ZUJyb3dzaW5nRW5hYmxlZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHdoZXRoZXIgcHJpdmF0ZSBicm93c2luZyBpcyBlbmFibGVkLgorICAgICAqIEBwYXJhbSBmbGFnIFdoZXRoZXIgcHJpdmF0ZSBicm93c2luZyBzaG91bGQgYmUgZW5hYmxlZC4KKyAgICAgKi8KKyAgICAvKiBwYWNrYWdlICovIHN5bmNocm9uaXplZCB2b2lkIHNldFByaXZhdGVCcm93c2luZ0VuYWJsZWQoYm9vbGVhbiBmbGFnKSB7CisgICAgICAgIGlmIChtUHJpdmF0ZUJyb3dzaW5nRW5hYmxlZCAhPSBmbGFnKSB7CisgICAgICAgICAgICBtUHJpdmF0ZUJyb3dzaW5nRW5hYmxlZCA9IGZsYWc7CisgICAgICAgICAgICBwb3N0U3luYygpOworICAgICAgICB9CisgICAgfQorCiAgICAgaW50IGdldERvdWJsZVRhcFRvYXN0Q291bnQoKSB7CiAgICAgICAgIHJldHVybiBtRG91YmxlVGFwVG9hc3RDb3VudDsKICAgICB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViVGV4dFZpZXcuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9XZWJUZXh0Vmlldy5qYXZhCmluZGV4IDE5YWJlYzEuLjQ4YzA2NWEgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9XZWJUZXh0Vmlldy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9XZWJUZXh0Vmlldy5qYXZhCkBAIC0yOCw2ICsyOCw3IEBACiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKIGltcG9ydCBhbmRyb2lkLnRleHQuRWRpdGFibGU7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LklucHV0RmlsdGVyOworaW1wb3J0IGFuZHJvaWQudGV4dC5MYXlvdXQ7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlNlbGVjdGlvbjsKIGltcG9ydCBhbmRyb2lkLnRleHQuU3Bhbm5hYmxlOwogaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0UGFpbnQ7CkBAIC0zMDAsNiArMzAxLDMzIEBACiAgICAgICAgIHJldHVybiBjb25uZWN0aW9uOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIEluIGdlbmVyYWwsIFRleHRWaWV3IG1ha2VzIGEgY2FsbCB0byBJbnB1dE1ldGhvZE1hbmFnZXIudXBkYXRlU2VsZWN0aW9uCisgICAgICogaW4gb25EcmF3LiAgSG93ZXZlciwgaW4gdGhlIGdlbmVyYWwgY2FzZSBvZiBXZWJUZXh0Vmlldywgd2UgZG8gbm90IGRyYXcuCisgICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IFdlYlZpZXcub25EcmF3IHRvIHRha2UgY2FyZSBvZiB0aGUgcGFydCB0aGF0CisgICAgICogbmVlZHMgdG8gYmUgY2FsbGVkLgorICAgICAqLworICAgIC8qIHBhY2thZ2UgKi8gdm9pZCBvbkRyYXdTdWJzdGl0dXRlKCkgeworICAgICAgICBpZiAoIXdpbGxOb3REcmF3KCkpIHsKKyAgICAgICAgICAgIC8vIElmIHRoZSBXZWJUZXh0VmlldyBpcyBzZXQgdG8gZHJhdywgc3VjaCBhcyBpbiB0aGUgY2FzZSBvZiBhCisgICAgICAgICAgICAvLyBwYXNzd29yZCwgb25EcmF3IGNhbGxzIHVwZGF0ZVNlbGVjdGlvbigpLCBzbyB0aGlzIGNvZGUgcGF0aCBpcworICAgICAgICAgICAgLy8gdW5uZWNlc3NhcnkuCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgLy8gVGhpcyBjb2RlIGlzIGNvcGllZCBmcm9tIFRleHRWaWV3Lm9uRHJhdygpLiAgVGhhdCBjb2RlIGRvZXMgbm90IGdldAorICAgICAgICAvLyBleGVjdXRlZCwgaG93ZXZlciwgYmVjYXVzZSB0aGUgV2ViVGV4dFZpZXcgZG9lcyBub3QgZHJhdywgYWxsb3dpbmcKKyAgICAgICAgLy8gd2Via2l0J3MgZHJhd2luZyB0byBzaG93IHRocm91Z2guCisgICAgICAgIElucHV0TWV0aG9kTWFuYWdlciBpbW0gPSBJbnB1dE1ldGhvZE1hbmFnZXIucGVla0luc3RhbmNlKCk7CisgICAgICAgIGlmIChpbW0gIT0gbnVsbCAmJiBpbW0uaXNBY3RpdmUodGhpcykpIHsKKyAgICAgICAgICAgIFNwYW5uYWJsZSBzcCA9IChTcGFubmFibGUpIGdldFRleHQoKTsKKyAgICAgICAgICAgIGludCBzZWxTdGFydCA9IFNlbGVjdGlvbi5nZXRTZWxlY3Rpb25TdGFydChzcCk7CisgICAgICAgICAgICBpbnQgc2VsRW5kID0gU2VsZWN0aW9uLmdldFNlbGVjdGlvbkVuZChzcCk7CisgICAgICAgICAgICBpbnQgY2FuZFN0YXJ0ID0gRWRpdGFibGVJbnB1dENvbm5lY3Rpb24uZ2V0Q29tcG9zaW5nU3BhblN0YXJ0KHNwKTsKKyAgICAgICAgICAgIGludCBjYW5kRW5kID0gRWRpdGFibGVJbnB1dENvbm5lY3Rpb24uZ2V0Q29tcG9zaW5nU3BhbkVuZChzcCk7CisgICAgICAgICAgICBpbW0udXBkYXRlU2VsZWN0aW9uKHRoaXMsIHNlbFN0YXJ0LCBzZWxFbmQsIGNhbmRTdGFydCwgY2FuZEVuZCk7CisgICAgICAgIH0KKyAgICB9CisKICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBvbkRyYXcoQ2FudmFzIGNhbnZhcykgewogICAgICAgICAvLyBvbkRyYXcgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGZvciBwYXNzd29yZCBmaWVsZHMuICBJZiBXZWJUZXh0VmlldyBpcwpAQCAtMzIyLDkgKzM1MCw2IEBACiAgICAgICAgIHN3aXRjaCAoYWN0aW9uQ29kZSkgewogICAgICAgICBjYXNlIEVkaXRvckluZm8uSU1FX0FDVElPTl9ORVhUOgogICAgICAgICAgICAgaWYgKG1XZWJWaWV3Lm5hdGl2ZU1vdmVDdXJzb3JUb05leHRUZXh0SW5wdXQoKSkgewotICAgICAgICAgICAgICAgIC8vIFNpbmNlIHRoZSBjdXJzb3Igd2lsbCBubyBsb25nZXIgYmUgaW4gdGhlIHNhbWUgcGxhY2UgYXMgdGhlCi0gICAgICAgICAgICAgICAgLy8gZm9jdXMsIHNldCB0aGUgZm9jdXMgY29udHJvbGxlciBiYWNrIHRvIGluYWN0aXZlCi0gICAgICAgICAgICAgICAgbVdlYlZpZXcuc2V0Rm9jdXNDb250cm9sbGVySW5hY3RpdmUoKTsKICAgICAgICAgICAgICAgICAvLyBQcmVlbXB0aXZlbHkgcmVidWlsZCB0aGUgV2ViVGV4dFZpZXcsIHNvIHRoYXQgdGhlIGFjdGlvbiB3aWxsCiAgICAgICAgICAgICAgICAgLy8gYmUgc2V0IHByb3Blcmx5LgogICAgICAgICAgICAgICAgIG1XZWJWaWV3LnJlYnVpbGRXZWJUZXh0VmlldygpOwpAQCAtMzYwLDE5ICszODUsOCBAQAogCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgb25TZWxlY3Rpb25DaGFuZ2VkKGludCBzZWxTdGFydCwgaW50IHNlbEVuZCkgewotICAgICAgICBpZiAobUluU2V0VGV4dEFuZEtlZXBTZWxlY3Rpb24pIHJldHVybjsKLSAgICAgICAgLy8gVGhpcyBjb2RlIGlzIGNvcGllZCBmcm9tIFRleHRWaWV3Lm9uRHJhdygpLiAgVGhhdCBjb2RlIGRvZXMgbm90IGdldAotICAgICAgICAvLyBleGVjdXRlZCwgaG93ZXZlciwgYmVjYXVzZSB0aGUgV2ViVGV4dFZpZXcgZG9lcyBub3QgZHJhdywgYWxsb3dpbmcKLSAgICAgICAgLy8gd2Via2l0J3MgZHJhd2luZyB0byBzaG93IHRocm91Z2guCi0gICAgICAgIElucHV0TWV0aG9kTWFuYWdlciBpbW0gPSBJbnB1dE1ldGhvZE1hbmFnZXIucGVla0luc3RhbmNlKCk7Ci0gICAgICAgIGlmIChpbW0gIT0gbnVsbCAmJiBpbW0uaXNBY3RpdmUodGhpcykpIHsKLSAgICAgICAgICAgIFNwYW5uYWJsZSBzcCA9IChTcGFubmFibGUpIGdldFRleHQoKTsKLSAgICAgICAgICAgIGludCBjYW5kU3RhcnQgPSBFZGl0YWJsZUlucHV0Q29ubmVjdGlvbi5nZXRDb21wb3NpbmdTcGFuU3RhcnQoc3ApOwotICAgICAgICAgICAgaW50IGNhbmRFbmQgPSBFZGl0YWJsZUlucHV0Q29ubmVjdGlvbi5nZXRDb21wb3NpbmdTcGFuRW5kKHNwKTsKLSAgICAgICAgICAgIGltbS51cGRhdGVTZWxlY3Rpb24odGhpcywgc2VsU3RhcnQsIHNlbEVuZCwgY2FuZFN0YXJ0LCBjYW5kRW5kKTsKLSAgICAgICAgfQogICAgICAgICBpZiAoIW1Gcm9tV2ViS2l0ICYmICFtRnJvbUZvY3VzQ2hhbmdlICYmICFtRnJvbVNldElucHV0VHlwZQotICAgICAgICAgICAgICAgICYmIG1XZWJWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAmJiBtV2ViVmlldyAhPSBudWxsICYmICFtSW5TZXRUZXh0QW5kS2VlcFNlbGVjdGlvbikgewogICAgICAgICAgICAgaWYgKERlYnVnRmxhZ3MuV0VCX1RFWFRfVklFVykgewogICAgICAgICAgICAgICAgIExvZy52KExPR1RBRywgIm9uU2VsZWN0aW9uQ2hhbmdlZCBzZWxTdGFydD0iICsgc2VsU3RhcnQKICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBzZWxFbmQ9IiArIHNlbEVuZCk7CkBAIC00ODEsOSArNDk1LDEwIEBACiAgICAgICAgICAgICAvLyB0byBiaWcgZm9yIHRoZSBjYXNlIG9mIGEgc21hbGwgdGV4dGZpZWxkLgogICAgICAgICAgICAgaW50IHNtYWxsZXJTbG9wID0gc2xvcC8yOwogICAgICAgICAgICAgaWYgKGR4ID4gc21hbGxlclNsb3AgfHwgZHkgPiBzbWFsbGVyU2xvcCkgewotICAgICAgICAgICAgICAgIGlmIChtV2ViVmlldyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZsb2F0IG1heFNjcm9sbFggPSAoZmxvYXQpIFRvdWNoLmdldE1heFNjcm9sbFgodGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TGF5b3V0KCksIG1TY3JvbGxZKTsKKyAgICAgICAgICAgICAgICBMYXlvdXQgbGF5b3V0ID0gZ2V0TGF5b3V0KCk7CisgICAgICAgICAgICAgICAgaWYgKG1XZWJWaWV3ICE9IG51bGwgJiYgbGF5b3V0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgbWF4U2Nyb2xsWCA9IChmbG9hdCkgVG91Y2guZ2V0TWF4U2Nyb2xsWCh0aGlzLCBsYXlvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNjcm9sbFkpOwogICAgICAgICAgICAgICAgICAgICBpZiAoRGVidWdGbGFncy5XRUJfVEVYVF9WSUVXKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBMb2cudihMT0dUQUcsICJvblRvdWNoRXZlbnQgeD0iICsgbVNjcm9sbFggKyAiIHk9IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1TY3JvbGxZICsgIiBtYXhYPSIgKyBtYXhTY3JvbGxYKTsKQEAgLTY2Nyw2ICs2ODIsNyBAQAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgU2VsZWN0aW9uLnNldFNlbGVjdGlvbih0ZXh0LCBzZWxlY3Rpb24sIHNlbGVjdGlvbik7CiAgICAgICAgIH0KKyAgICAgICAgaWYgKG1XZWJWaWV3ICE9IG51bGwpIG1XZWJWaWV3LmluY3JlbWVudFRleHRHZW5lcmF0aW9uKCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC05MTksMTQgKzkzNSw0IEBACiAgICAgLyogcGFja2FnZSAqLyB2b2lkIHVwZGF0ZUNhY2hlZFRleHRmaWVsZCgpIHsKICAgICAgICAgbVdlYlZpZXcudXBkYXRlQ2FjaGVkVGV4dGZpZWxkKGdldFRleHQoKS50b1N0cmluZygpKTsKICAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiByZXF1ZXN0UmVjdGFuZ2xlT25TY3JlZW4oUmVjdCByZWN0YW5nbGUpIHsKLSAgICAgICAgLy8gZG9uJ3Qgc2Nyb2xsIHdoaWxlIGluIHpvb20gYW5pbWF0aW9uLiBXaGVuIGl0IGlzIGRvbmUsIHdlIHdpbGwgYWRqdXN0Ci0gICAgICAgIC8vIHRoZSBXZWJUZXh0VmlldyBpZiBpdCBpcyBpbiBlZGl0aW5nIG1vZGUuCi0gICAgICAgIGlmICghbVdlYlZpZXcuaW5BbmltYXRlWm9vbSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3VwZXIucmVxdWVzdFJlY3RhbmdsZU9uU2NyZWVuKHJlY3RhbmdsZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9XZWJWaWV3LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViVmlldy5qYXZhCmluZGV4IDBkOTEyZGUuLjVkOWFiOTAgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9XZWJWaWV3LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYlZpZXcuamF2YQpAQCAtMTgsMzUgKzE4LDM4IEBACiAKIGltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uV2lkZ2V0OwogaW1wb3J0IGFuZHJvaWQuYXBwLkFsZXJ0RGlhbG9nOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Ccm9hZGNhc3RSZWNlaXZlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ2xpcGJvYXJkTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuRGlhbG9nSW50ZXJmYWNlOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudEZpbHRlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuRGlhbG9nSW50ZXJmYWNlLk9uQ2FuY2VsTGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VJbmZvOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuRGF0YVNldE9ic2VydmVyOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwRmFjdG9yeTsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcFNoYWRlcjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ29ybmVyUGF0aEVmZmVjdDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkRyYXdGaWx0ZXI7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5JbnRlcnBvbGF0b3I7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5NYXRyaXg7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50RmxhZ3NEcmF3RmlsdGVyOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGljdHVyZTsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBvaW50OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3RGOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVnaW9uOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuU2hhZGVyOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7CiBpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwogaW1wb3J0IGFuZHJvaWQubmV0Lmh0dHAuU3NsQ2VydGlmaWNhdGU7CitpbXBvcnQgYW5kcm9pZC5vcy5Bc3luY1Rhc2s7CiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwogaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKLWltcG9ydCBhbmRyb2lkLm9zLlNlcnZpY2VNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LklDbGlwYm9hcmQ7CitpbXBvcnQgYW5kcm9pZC5zcGVlY2gudHRzLlRleHRUb1NwZWVjaDsKIGltcG9ydCBhbmRyb2lkLnRleHQuU2VsZWN0aW9uOwogaW1wb3J0IGFuZHJvaWQudGV4dC5TcGFubmFibGU7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKQEAgLTY0LDQxICs2Nyw0MSBAQAogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3Q29uZmlndXJhdGlvbjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3VHJlZU9ic2VydmVyOwotaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uQWxwaGFBbmltYXRpb247CitpbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLkVkaXRvckluZm87CiBpbXBvcnQgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLklucHV0Q29ubmVjdGlvbjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuSW5wdXRNZXRob2RNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQud2Via2l0LldlYlRleHRWaWV3LkF1dG9Db21wbGV0ZUFkYXB0ZXI7CiBpbXBvcnQgYW5kcm9pZC53ZWJraXQuV2ViVmlld0NvcmUuRXZlbnRIdWI7CiBpbXBvcnQgYW5kcm9pZC53ZWJraXQuV2ViVmlld0NvcmUuVG91Y2hFdmVudERhdGE7CitpbXBvcnQgYW5kcm9pZC53ZWJraXQuV2ViVmlld0NvcmUuVG91Y2hIaWdobGlnaHREYXRhOwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFic29sdXRlTGF5b3V0OwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXI7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXcuT25JdGVtQ2xpY2tMaXN0ZW5lcjsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5BcnJheUFkYXB0ZXI7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuQ2hlY2tlZFRleHRWaWV3OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkZyYW1lTGF5b3V0OwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkxpbmVhckxheW91dDsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5MaXN0VmlldzsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5TY3JvbGxlcjsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5Ub2FzdDsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5ab29tQnV0dG9uc0NvbnRyb2xsZXI7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuWm9vbUNvbnRyb2xzOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3Lk9uSXRlbUNsaWNrTGlzdGVuZXI7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0OwogCiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CiBpbXBvcnQgamF2YS5uZXQuVVJMRGVjb2RlcjsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YS51dGlsLlNldDsKIAotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7Ci0KIC8qKgogICogPHA+QSBWaWV3IHRoYXQgZGlzcGxheXMgd2ViIHBhZ2VzLiBUaGlzIGNsYXNzIGlzIHRoZSBiYXNpcyB1cG9uIHdoaWNoIHlvdQogICogY2FuIHJvbGwgeW91ciBvd24gd2ViIGJyb3dzZXIgb3Igc2ltcGx5IGRpc3BsYXkgc29tZSBvbmxpbmUgY29udGVudCB3aXRoaW4geW91ciBBY3Rpdml0eS4KQEAgLTI5Niw3ICsyOTksNyBAQAogICogcHJvcGVydHkgdG8ge0Bjb2RlIGRldmljZS1kcGl9LiBUaGlzIHN0b3BzIEFuZHJvaWQgZnJvbSBwZXJmb3JtaW5nIHNjYWxpbmcgaW4geW91ciB3ZWIgcGFnZSBhbmQKICAqIGFsbG93cyB5b3UgdG8gbWFrZSB0aGUgbmVjZXNzYXJ5IGFkanVzdG1lbnRzIGZvciBlYWNoIGRlbnNpdHkgdmlhIENTUyBhbmQgSmF2YVNjcmlwdC48L3A+CiAgKgotICogCisgKgogICovCiBAV2lkZ2V0CiBwdWJsaWMgY2xhc3MgV2ViVmlldyBleHRlbmRzIEFic29sdXRlTGF5b3V0CkBAIC0zMTMsNDkgKzMxNiw3IEBACiAKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIExPR1RBRyA9ICJ3ZWJ2aWV3IjsKIAotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEV4dGVuZGVkWm9vbUNvbnRyb2xzIGV4dGVuZHMgRnJhbWVMYXlvdXQgewotICAgICAgICBwdWJsaWMgRXh0ZW5kZWRab29tQ29udHJvbHMoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKLSAgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzKTsKLSAgICAgICAgICAgIExheW91dEluZmxhdGVyIGluZmxhdGVyID0gKExheW91dEluZmxhdGVyKQotICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5MQVlPVVRfSU5GTEFURVJfU0VSVklDRSk7Ci0gICAgICAgICAgICBpbmZsYXRlci5pbmZsYXRlKGNvbS5hbmRyb2lkLmludGVybmFsLlIubGF5b3V0Lnpvb21fbWFnbmlmeSwgdGhpcywgdHJ1ZSk7Ci0gICAgICAgICAgICBtUGx1c01pbnVzWm9vbUNvbnRyb2xzID0gKFpvb21Db250cm9scykgZmluZFZpZXdCeUlkKAotICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmlkLnpvb21Db250cm9scyk7Ci0gICAgICAgICAgICBmaW5kVmlld0J5SWQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5pZC56b29tTWFnbmlmeSkuc2V0VmlzaWJpbGl0eSgKLSAgICAgICAgICAgICAgICAgICAgVmlldy5HT05FKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNob3coYm9vbGVhbiBzaG93Wm9vbSwgYm9vbGVhbiBjYW5ab29tT3V0KSB7Ci0gICAgICAgICAgICBtUGx1c01pbnVzWm9vbUNvbnRyb2xzLnNldFZpc2liaWxpdHkoCi0gICAgICAgICAgICAgICAgICAgIHNob3dab29tID8gVmlldy5WSVNJQkxFIDogVmlldy5HT05FKTsKLSAgICAgICAgICAgIGZhZGUoVmlldy5WSVNJQkxFLCAwLjBmLCAxLjBmKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGhpZGUoKSB7Ci0gICAgICAgICAgICBmYWRlKFZpZXcuR09ORSwgMS4wZiwgMC4wZik7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgZmFkZShpbnQgdmlzaWJpbGl0eSwgZmxvYXQgc3RhcnRBbHBoYSwgZmxvYXQgZW5kQWxwaGEpIHsKLSAgICAgICAgICAgIEFscGhhQW5pbWF0aW9uIGFuaW0gPSBuZXcgQWxwaGFBbmltYXRpb24oc3RhcnRBbHBoYSwgZW5kQWxwaGEpOwotICAgICAgICAgICAgYW5pbS5zZXREdXJhdGlvbig1MDApOwotICAgICAgICAgICAgc3RhcnRBbmltYXRpb24oYW5pbSk7Ci0gICAgICAgICAgICBzZXRWaXNpYmlsaXR5KHZpc2liaWxpdHkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzRm9jdXMoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVBsdXNNaW51c1pvb21Db250cm9scy5oYXNGb2N1cygpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0T25ab29tSW5DbGlja0xpc3RlbmVyKE9uQ2xpY2tMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICAgICAgbVBsdXNNaW51c1pvb21Db250cm9scy5zZXRPblpvb21JbkNsaWNrTGlzdGVuZXIobGlzdGVuZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0T25ab29tT3V0Q2xpY2tMaXN0ZW5lcihPbkNsaWNrTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgICAgIG1QbHVzTWludXNab29tQ29udHJvbHMuc2V0T25ab29tT3V0Q2xpY2tMaXN0ZW5lcihsaXN0ZW5lcik7Ci0gICAgICAgIH0KLQotICAgICAgICBab29tQ29udHJvbHMgICAgbVBsdXNNaW51c1pvb21Db250cm9sczsKLSAgICB9CisgICAgcHJpdmF0ZSBab29tTWFuYWdlciBtWm9vbU1hbmFnZXI7CiAKICAgICAvKioKICAgICAgKiAgVHJhbnNwb3J0YXRpb24gb2JqZWN0IGZvciByZXR1cm5pbmcgV2ViVmlldyBhY3Jvc3MgdGhyZWFkIGJvdW5kYXJpZXMuCkBAIC00MDEsNiArMzYyLDggQEAKICAgICAvLyBtb3JlIGtleSBldmVudHMuCiAgICAgcHJpdmF0ZSBpbnQgbVRleHRHZW5lcmF0aW9uOwogCisgICAgLyogcGFja2FnZSAqLyB2b2lkIGluY3JlbWVudFRleHRHZW5lcmF0aW9uKCkgeyBtVGV4dEdlbmVyYXRpb24rKzsgfQorCiAgICAgLy8gVXNlZCBieSBXZWJWaWV3Q29yZSB0byBjcmVhdGUgY2hpbGQgdmlld3MuCiAgICAgLyogcGFja2FnZSAqLyBmaW5hbCBWaWV3TWFuYWdlciBtVmlld01hbmFnZXI7CiAKQEAgLTQ0OCw2ICs0MTEsMTQgQEAKICAgICBwcml2YXRlIGZsb2F0IG1MYXN0VmVsWDsKICAgICBwcml2YXRlIGZsb2F0IG1MYXN0VmVsWTsKIAorICAgIC8vIEEgcG9pbnRlciB0byB0aGUgbmF0aXZlIHNjcm9sbGFibGUgbGF5ZXIgd2hlbiBkcmFnZ2luZyBsYXllcnMuICBPbmx5CisgICAgLy8gdmFsaWQgd2hlbiBtVG91Y2hNb2RlIGlzIFRPVUNIX0RSQUdfTEFZRVJfTU9ERS4KKyAgICBwcml2YXRlIGludCBtU2Nyb2xsaW5nTGF5ZXI7CisKKyAgICAvLyBvbmx5IHRyaWdnZXIgYWNjZWxlcmF0ZWQgZmxpbmcgaWYgdGhlIG5ldyB2ZWxvY2l0eSBpcyBhdCBsZWFzdAorICAgIC8vIE1JTklNVU1fVkVMT0NJVFlfUkFUSU9fRk9SX0FDQ0VMRVJBVElPTiB0aW1lcyBvZiB0aGUgcHJldmlvdXMgdmVsb2NpdHkKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9hdCBNSU5JTVVNX1ZFTE9DSVRZX1JBVElPX0ZPUl9BQ0NFTEVSQVRJT04gPSAwLjJmOworCiAgICAgLyoqCiAgICAgICogVG91Y2ggbW9kZQogICAgICAqLwpAQCAtNDYwLDYgKzQzMSw3IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRPVUNIX0RPVUJMRV9UQVBfTU9ERSA9IDY7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRPVUNIX0RPTkVfTU9ERSA9IDc7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRPVUNIX1BJTkNIX0RSQUcgPSA4OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUT1VDSF9EUkFHX0xBWUVSX01PREUgPSA5OwogCiAgICAgLy8gV2hldGhlciB0byBmb3J3YXJkIHRoZSB0b3VjaCBldmVudHMgdG8gV2ViQ29yZQogICAgIHByaXZhdGUgYm9vbGVhbiBtRm9yd2FyZFRvdWNoRXZlbnRzID0gZmFsc2U7CkBAIC00OTgsMTAgKzQ3MCw2IEBACiAgICAgLy8gdHJ1ZSBpZiBvblBhdXNlIGhhcyBiZWVuIGNhbGxlZCAoYW5kIG5vdCBvblJlc3VtZSkKICAgICBwcml2YXRlIGJvb2xlYW4gbUlzUGF1c2VkOwogCi0gICAgLy8gdHJ1ZSBpZiwgZHVyaW5nIGEgdHJhbnNpdGlvbiB0byBhIG5ldyBwYWdlLCB3ZSdyZSBkZWxheWluZwotICAgIC8vIGRlbGV0aW5nIGEgcm9vdCBsYXllciB1bnRpbCB0aGVyZSdzIHNvbWV0aGluZyB0byBkcmF3IG9mIHRoZSBuZXcgcGFnZS4KLSAgICBwcml2YXRlIGJvb2xlYW4gbURlbGF5ZWREZWxldGVSb290TGF5ZXI7Ci0KICAgICAvKioKICAgICAgKiBDdXN0b21pemFibGUgY29uc3RhbnQKICAgICAgKi8KQEAgLTUyMyw5ICs0OTEsNiBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNSU5fRkxJTkdfVElNRSA9IDI1MDsKICAgICAvLyBkcmF3IHVuZmlsdGVyZWQgYWZ0ZXIgZHJhZyBpcyBoZWxkIHdpdGhvdXQgbW92ZW1lbnQKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTU9USU9OTEVTU19USU1FID0gMTAwOwotICAgIC8vIFRoZSB0aW1lIHRoYXQgdGhlIFpvb20gQ29udHJvbHMgYXJlIHZpc2libGUgYmVmb3JlIGZhZGluZyBhd2F5Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBaT09NX0NPTlRST0xTX1RJTUVPVVQgPQotICAgICAgICAgICAgVmlld0NvbmZpZ3VyYXRpb24uZ2V0Wm9vbUNvbnRyb2xzVGltZW91dCgpOwogICAgIC8vIFRoZSBhbW91bnQgb2YgY29udGVudCB0byBvdmVybGFwIGJldHdlZW4gdHdvIHNjcmVlbnMgd2hlbiBnb2luZyB0aHJvdWdoCiAgICAgLy8gcGFnZXMgd2l0aCB0aGUgc3BhY2UgYmFyLCBpbiBwaXhlbHMuCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBBR0VfU0NST0xMX09WRVJMQVAgPSAyNDsKQEAgLTU2NiwxNSArNTMxLDI0IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1PVElPTkxFU1NfSUdOT1JFICAgICAgICAgID0gMzsKICAgICBwcml2YXRlIGludCBtSGVsZE1vdGlvbmxlc3M7CiAKLSAgICAvLyB3aGV0aGVyIHN1cHBvcnQgbXVsdGktdG91Y2gKLSAgICBwcml2YXRlIGJvb2xlYW4gbVN1cHBvcnRNdWx0aVRvdWNoOwotICAgIC8vIHVzZSB0aGUgZnJhbWV3b3JrJ3MgU2NhbGVHZXN0dXJlRGV0ZWN0b3IgdG8gaGFuZGxlIG11bHRpLXRvdWNoCi0gICAgcHJpdmF0ZSBTY2FsZUdlc3R1cmVEZXRlY3RvciBtU2NhbGVEZXRlY3RvcjsKKyAgICAvLyBBbiBpbnN0YW5jZSBmb3IgaW5qZWN0aW5nIGFjY2Vzc2liaWxpdHkgaW4gV2ViVmlld3Mgd2l0aCBkaXNhYmxlZAorICAgIC8vIEphdmFTY3JpcHQgb3Igb25lcyBmb3Igd2hpY2ggbm8gYWNjZXNzaWJpbGl0eSBzY3JpcHQgZXhpc3RzCisgICAgcHJpdmF0ZSBBY2Nlc3NpYmlsaXR5SW5qZWN0b3IgbUFjY2Vzc2liaWxpdHlJbmplY3RvcjsKIAotICAgIC8vIHRoZSBhbmNob3IgcG9pbnQgaW4gdGhlIGRvY3VtZW50IHNwYWNlIHdoZXJlIFZJRVdfU0laRV9DSEFOR0VEIHNob3VsZAotICAgIC8vIGFwcGx5IHRvCi0gICAgcHJpdmF0ZSBpbnQgbUFuY2hvclg7Ci0gICAgcHJpdmF0ZSBpbnQgbUFuY2hvclk7CisgICAgLy8gdGhlIGNvbG9yIHVzZWQgdG8gaGlnaGxpZ2h0IHRoZSB0b3VjaCByZWN0YW5nbGVzCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IG1IaWdodGxpZ2h0Q29sb3IgPSAweDMzMDAwMDAwOworICAgIC8vIHRoZSByb3VuZCBjb3JuZXIgZm9yIHRoZSBoaWdobGlnaHQgcGF0aAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGZsb2F0IFRPVUNIX0hJR0hMSUdIVF9BUkMgPSA1LjBmOworICAgIC8vIHRoZSByZWdpb24gaW5kaWNhdGluZyB3aGVyZSB0aGUgdXNlciB0b3VjaGVkIG9uIHRoZSBzY3JlZW4KKyAgICBwcml2YXRlIFJlZ2lvbiBtVG91Y2hIaWdobGlnaHRSZWdpb24gPSBuZXcgUmVnaW9uKCk7CisgICAgLy8gdGhlIHBhaW50IGZvciB0aGUgdG91Y2ggaGlnaGxpZ2h0CisgICAgcHJpdmF0ZSBQYWludCBtVG91Y2hIaWdodGxpZ2h0UGFpbnQ7CisgICAgLy8gZGVidWcgb25seQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUdfVE9VQ0hfSElHSExJR0hUID0gdHJ1ZTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVE9VQ0hfSElHSExJR0hUX0VMQVBTRV9USU1FID0gMjAwMDsKKyAgICBwcml2YXRlIFBhaW50IG1Ub3VjaENyb3NzSGFpckNvbG9yOworICAgIHByaXZhdGUgaW50IG1Ub3VjaEhpZ2hsaWdodFg7CisgICAgcHJpdmF0ZSBpbnQgbVRvdWNoSGlnaGxpZ2h0WTsKIAogICAgIC8qCiAgICAgICogUHJpdmF0ZSBtZXNzYWdlIGlkcwpAQCAtNjA4LDcgKzU4Miw3IEBACiAgICAgc3RhdGljIGZpbmFsIGludCBXRUJDT1JFX0lOSVRJQUxJWkVEX01TR19JRCAgICAgICAgID0gMTA3OwogICAgIHN0YXRpYyBmaW5hbCBpbnQgVVBEQVRFX1RFWFRGSUVMRF9URVhUX01TR19JRCAgICAgICA9IDEwODsKICAgICBzdGF0aWMgZmluYWwgaW50IFVQREFURV9aT09NX1JBTkdFICAgICAgICAgICAgICAgICAgPSAxMDk7Ci0gICAgc3RhdGljIGZpbmFsIGludCBNT1ZFX09VVF9PRl9QTFVHSU4gICAgICAgICAgICAgICAgID0gMTEwOworICAgIHN0YXRpYyBmaW5hbCBpbnQgVU5IQU5ETEVEX05BVl9LRVkgICAgICAgICAgICAgICAgICA9IDExMDsKICAgICBzdGF0aWMgZmluYWwgaW50IENMRUFSX1RFWFRfRU5UUlkgICAgICAgICAgICAgICAgICAgPSAxMTE7CiAgICAgc3RhdGljIGZpbmFsIGludCBVUERBVEVfVEVYVF9TRUxFQ1RJT05fTVNHX0lEICAgICAgID0gMTEyOwogICAgIHN0YXRpYyBmaW5hbCBpbnQgU0hPV19SRUNUX01TR19JRCAgICAgICAgICAgICAgICAgICA9IDExMzsKQEAgLTYyMiwxNiArNTk2LDE5IEBACiAgICAgc3RhdGljIGZpbmFsIGludCBTSE9XX0ZVTExTQ1JFRU4gICAgICAgICAgICAgICAgICAgID0gMTIwOwogICAgIHN0YXRpYyBmaW5hbCBpbnQgSElERV9GVUxMU0NSRUVOICAgICAgICAgICAgICAgICAgICA9IDEyMTsKICAgICBzdGF0aWMgZmluYWwgaW50IERPTV9GT0NVU19DSEFOR0VEICAgICAgICAgICAgICAgICAgPSAxMjI7Ci0gICAgc3RhdGljIGZpbmFsIGludCBJTU1FRElBVEVfUkVQQUlOVF9NU0dfSUQgICAgICAgICAgID0gMTIzOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgU0VUX1JPT1RfTEFZRVJfTVNHX0lEICAgICAgICAgICAgICA9IDEyNDsKKyAgICBzdGF0aWMgZmluYWwgaW50IFJFUExBQ0VfQkFTRV9DT05URU5UICAgICAgICAgICAgICAgPSAxMjM7CisgICAgLy8gMTI0OwogICAgIHN0YXRpYyBmaW5hbCBpbnQgUkVUVVJOX0xBQkVMICAgICAgICAgICAgICAgICAgICAgICA9IDEyNTsKICAgICBzdGF0aWMgZmluYWwgaW50IEZJTkRfQUdBSU4gICAgICAgICAgICAgICAgICAgICAgICAgPSAxMjY7CiAgICAgc3RhdGljIGZpbmFsIGludCBDRU5URVJfRklUX1JFQ1QgICAgICAgICAgICAgICAgICAgID0gMTI3OwogICAgIHN0YXRpYyBmaW5hbCBpbnQgUkVRVUVTVF9LRVlCT0FSRF9XSVRIX1NFTEVDVElPTl9NU0dfSUQgPSAxMjg7CiAgICAgc3RhdGljIGZpbmFsIGludCBTRVRfU0NST0xMQkFSX01PREVTICAgICAgICAgICAgICAgID0gMTI5OworICAgIHN0YXRpYyBmaW5hbCBpbnQgU0VMRUNUSU9OX1NUUklOR19DSEFOR0VEICAgICAgICAgICA9IDEzMDsKKyAgICBzdGF0aWMgZmluYWwgaW50IFNFVF9UT1VDSF9ISUdITElHSFRfUkVDVFMgICAgICAgICAgPSAxMzE7CisgICAgc3RhdGljIGZpbmFsIGludCBTQVZFX1dFQkFSQ0hJVkVfRklOSVNIRUQgICAgICAgICAgID0gMTMyOwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZJUlNUX1BBQ0tBR0VfTVNHX0lEID0gU0NST0xMX1RPX01TR19JRDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTEFTVF9QQUNLQUdFX01TR19JRCA9IFNFVF9TQ1JPTExCQVJfTU9ERVM7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IExBU1RfUEFDS0FHRV9NU0dfSUQgPSBTRVRfVE9VQ0hfSElHSExJR0hUX1JFQ1RTOwogCiAgICAgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEhhbmRsZXJQcml2YXRlRGVidWdTdHJpbmcgPSB7CiAgICAgICAgICJSRU1FTUJFUl9QQVNTV09SRCIsIC8vICAgICAgICAgICAgICA9IDE7CkBAIC02NTYsNyArNjMzLDcgQEAKICAgICAgICAgIldFQkNPUkVfSU5JVElBTElaRURfTVNHX0lEIiwgLy8gICAgID0gMTA3OwogICAgICAgICAiVVBEQVRFX1RFWFRGSUVMRF9URVhUX01TR19JRCIsIC8vICAgPSAxMDg7CiAgICAgICAgICJVUERBVEVfWk9PTV9SQU5HRSIsIC8vICAgICAgICAgICAgICA9IDEwOTsKLSAgICAgICAgIk1PVkVfT1VUX09GX1BMVUdJTiIsIC8vICAgICAgICAgICAgID0gMTEwOworICAgICAgICAiVU5IQU5ETEVEX05BVl9LRVkiLCAvLyAgICAgICAgICAgICAgPSAxMTA7CiAgICAgICAgICJDTEVBUl9URVhUX0VOVFJZIiwgLy8gICAgICAgICAgICAgICA9IDExMTsKICAgICAgICAgIlVQREFURV9URVhUX1NFTEVDVElPTl9NU0dfSUQiLCAvLyAgID0gMTEyOwogICAgICAgICAiU0hPV19SRUNUX01TR19JRCIsIC8vICAgICAgICAgICAgICAgPSAxMTM7CkBAIC02NjksMTggKzY0NiwyMSBAQAogICAgICAgICAiU0hPV19GVUxMU0NSRUVOIiwgLy8gICAgICAgICAgICAgICAgPSAxMjA7CiAgICAgICAgICJISURFX0ZVTExTQ1JFRU4iLCAvLyAgICAgICAgICAgICAgICA9IDEyMTsKICAgICAgICAgIkRPTV9GT0NVU19DSEFOR0VEIiwgLy8gICAgICAgICAgICAgID0gMTIyOwotICAgICAgICAiSU1NRURJQVRFX1JFUEFJTlRfTVNHX0lEIiwgLy8gICAgICAgPSAxMjM7Ci0gICAgICAgICJTRVRfUk9PVF9MQVlFUl9NU0dfSUQiLCAvLyAgICAgICAgICA9IDEyNDsKKyAgICAgICAgIlJFUExBQ0VfQkFTRV9DT05URU5UIiwgLy8gICAgICAgICAgID0gMTIzOworICAgICAgICAiMTI0IiwgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMjQ7CiAgICAgICAgICJSRVRVUk5fTEFCRUwiLCAvLyAgICAgICAgICAgICAgICAgICA9IDEyNTsKICAgICAgICAgIkZJTkRfQUdBSU4iLCAvLyAgICAgICAgICAgICAgICAgICAgID0gMTI2OwogICAgICAgICAiQ0VOVEVSX0ZJVF9SRUNUIiwgLy8gICAgICAgICAgICAgICAgPSAxMjc7CiAgICAgICAgICJSRVFVRVNUX0tFWUJPQVJEX1dJVEhfU0VMRUNUSU9OX01TR19JRCIsIC8vID0gMTI4OwotICAgICAgICAiU0VUX1NDUk9MTEJBUl9NT0RFUyIgLy8gICAgICAgICAgICAgPSAxMjk7CisgICAgICAgICJTRVRfU0NST0xMQkFSX01PREVTIiwgLy8gICAgICAgICAgICA9IDEyOTsKKyAgICAgICAgIlNFTEVDVElPTl9TVFJJTkdfQ0hBTkdFRCIsIC8vICAgICAgID0gMTMwOworICAgICAgICAiU0VUX1RPVUNIX0hJR0hMSUdIVF9SRUNUUyIsIC8vICAgICAgPSAxMzE7CisgICAgICAgICJTQVZFX1dFQkFSQ0hJVkVfRklOSVNIRUQiIC8vICAgICAgICA9IDEzMjsKICAgICB9OwogCiAgICAgLy8gSWYgdGhlIHNpdGUgZG9lc24ndCB1c2UgdGhlIHZpZXdwb3J0IG1ldGEgdGFnIHRvIHNwZWNpZnkgdGhlIHZpZXdwb3J0LAogICAgIC8vIHVzZSBERUZBVUxUX1ZJRVdQT1JUX1dJRFRIIGFzIHRoZSBkZWZhdWx0IHZpZXdwb3J0IHdpZHRoCi0gICAgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX1ZJRVdQT1JUX1dJRFRIID0gODAwOworICAgIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9WSUVXUE9SVF9XSURUSCA9IDEwNDA7CiAKICAgICAvLyBub3JtYWxseSB3ZSB0cnkgdG8gZml0IHRoZSBjb250ZW50IHRvIHRoZSBtaW5pbXVtIHByZWZlcnJlZCB3aWR0aAogICAgIC8vIGNhbGN1bGF0ZWQgYnkgdGhlIFdlYmtpdC4gVG8gYXZvaWQgdGhlIGJhZCBiZWhhdmlvciB3aGVuIHNvbWUgc2l0ZSdzCkBAIC02ODgsNDkgKzY2OCw5IEBACiAgICAgLy8gdGhlIG1pbmltdW0gcHJlZmVycmVkIHdpZHRoIGlzIGh1Z2UsIGFuIHVwcGVyIGxpbWl0IGlzIG5lZWRlZC4KICAgICBzdGF0aWMgaW50IHNNYXhWaWV3cG9ydFdpZHRoID0gREVGQVVMVF9WSUVXUE9SVF9XSURUSDsKIAotICAgIC8vIGRlZmF1bHQgc2NhbGUgbGltaXQuIERlcGVuZGluZyBvbiB0aGUgZGlzcGxheSBkZW5zaXR5Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmxvYXQgREVGQVVMVF9NQVhfWk9PTV9TQ0FMRTsKLSAgICBwcml2YXRlIHN0YXRpYyBmbG9hdCBERUZBVUxUX01JTl9aT09NX1NDQUxFOwotICAgIC8vIHNjYWxlIGxpbWl0LCB3aGljaCBjYW4gYmUgc2V0IHRocm91Z2ggdmlld3BvcnQgbWV0YSB0YWcgaW4gdGhlIHdlYiBwYWdlCi0gICAgcHJpdmF0ZSBmbG9hdCBtTWF4Wm9vbVNjYWxlOwotICAgIHByaXZhdGUgZmxvYXQgbU1pblpvb21TY2FsZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gbU1pblpvb21TY2FsZUZpeGVkID0gdHJ1ZTsKLQogICAgIC8vIGluaXRpYWwgc2NhbGUgaW4gcGVyY2VudC4gMCBtZWFucyB1c2luZyBkZWZhdWx0LgogICAgIHByaXZhdGUgaW50IG1Jbml0aWFsU2NhbGVJblBlcmNlbnQgPSAwOwogCi0gICAgLy8gd2hpbGUgaW4gdGhlIHpvb20gb3ZlcnZpZXcgbW9kZSwgdGhlIHBhZ2UncyB3aWR0aCBpcyBmdWxseSBmaXQgdG8gdGhlCi0gICAgLy8gY3VycmVudCB3aW5kb3cuIFRoZSBwYWdlIGlzIGFsaXZlLCBpbiBhbm90aGVyIHdvcmRzLCB5b3UgY2FuIGNsaWNrIHRvCi0gICAgLy8gZm9sbG93IHRoZSBsaW5rcy4gRG91YmxlIHRhcCB3aWxsIHRvZ2dsZSBiZXR3ZWVuIHpvb20gb3ZlcnZpZXcgbW9kZSBhbmQKLSAgICAvLyB0aGUgbGFzdCB6b29tIHNjYWxlLgotICAgIGJvb2xlYW4gbUluWm9vbU92ZXJ2aWV3ID0gZmFsc2U7Ci0KLSAgICAvLyBpZGVhbGx5IG1ab29tT3ZlcnZpZXdXaWR0aCBzaG91bGQgYmUgbUNvbnRlbnRXaWR0aC4gQnV0IHNpdGVzIGxpa2UgZXNwbiwKLSAgICAvLyBlbmdhZGdldCBhbHdheXMgaGF2ZSB3aWRlciBtQ29udGVudFdpZHRoIG5vIG1hdHRlciB3aGF0IHZpZXdwb3J0IHNpemUgaXMuCi0gICAgaW50IG1ab29tT3ZlcnZpZXdXaWR0aCA9IERFRkFVTFRfVklFV1BPUlRfV0lEVEg7Ci0gICAgZmxvYXQgbVRleHRXcmFwU2NhbGU7Ci0KLSAgICAvLyBkZWZhdWx0IHNjYWxlLiBEZXBlbmRpbmcgb24gdGhlIGRpc3BsYXkgZGVuc2l0eS4KLSAgICBzdGF0aWMgaW50IERFRkFVTFRfU0NBTEVfUEVSQ0VOVDsKLSAgICBwcml2YXRlIGZsb2F0IG1EZWZhdWx0U2NhbGU7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmbG9hdCBNSU5JTVVNX1NDQUxFX0lOQ1JFTUVOVCA9IDAuMDFmOwotCi0gICAgLy8gc2V0IHRvIHRydWUgdGVtcG9yYXJpbHkgZHVyaW5nIFNjYWxlR2VzdHVyZSB0cmlnZ2VyZWQgem9vbQotICAgIHByaXZhdGUgYm9vbGVhbiBtUHJldmlld1pvb21Pbmx5ID0gZmFsc2U7Ci0KLSAgICAvLyBjb21wdXRlZCBzY2FsZSBhbmQgaW52ZXJzZSwgZnJvbSBtWm9vbVdpZHRoLgotICAgIHByaXZhdGUgZmxvYXQgbUFjdHVhbFNjYWxlOwotICAgIHByaXZhdGUgZmxvYXQgbUludkFjdHVhbFNjYWxlOwotICAgIC8vIGlmIHRoaXMgaXMgbm9uLXplcm8sIGl0IGlzIHVzZWQgb24gZHJhd2luZyByYXRoZXIgdGhhbiBtQWN0dWFsU2NhbGUKLSAgICBwcml2YXRlIGZsb2F0IG1ab29tU2NhbGU7Ci0gICAgcHJpdmF0ZSBmbG9hdCBtSW52SW5pdGlhbFpvb21TY2FsZTsKLSAgICBwcml2YXRlIGZsb2F0IG1JbnZGaW5hbFpvb21TY2FsZTsKLSAgICBwcml2YXRlIGludCBtSW5pdGlhbFNjcm9sbFg7Ci0gICAgcHJpdmF0ZSBpbnQgbUluaXRpYWxTY3JvbGxZOwotICAgIHByaXZhdGUgbG9uZyBtWm9vbVN0YXJ0OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBaT09NX0FOSU1BVElPTl9MRU5HVEggPSA1MDA7Ci0KICAgICBwcml2YXRlIGJvb2xlYW4gbVVzZXJTY3JvbGwgPSBmYWxzZTsKIAogICAgIHByaXZhdGUgaW50IG1TbmFwU2Nyb2xsTW9kZSA9IFNOQVBfTk9ORTsKQEAgLTc1NCw2ICs2OTQsMTkgQEAKICAgICBwcml2YXRlIGludCBtSG9yaXpvbnRhbFNjcm9sbEJhck1vZGUgPSBTQ1JPTExCQVJfQVVUTzsKICAgICBwcml2YXRlIGludCBtVmVydGljYWxTY3JvbGxCYXJNb2RlID0gU0NST0xMQkFSX0FVVE87CiAKKyAgICAvLyB0aGUgYWxpYXMgdmlhIHdoaWNoIGFjY2Vzc2liaWxpdHkgSmF2YVNjcmlwdCBpbnRlcmZhY2UgaXMgZXhwb3NlZAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBTElBU19BQ0NFU1NJQklMSVRZX0pTX0lOVEVSRkFDRSA9ICJhY2Nlc3NpYmlsaXR5IjsKKworICAgIC8vIEphdmFTY3JpcHQgdG8gaW5qZWN0IHRoZSBzY3JpcHQgY2hvb3NlciB3aGljaCB3aWxsCisgICAgLy8gcGljayB0aGUgcmlnaHQgc2NyaXB0IGZvciB0aGUgY3VycmVudCBVUkwKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNDRVNTSUJJTElUWV9TQ1JJUFRfQ0hPT1NFUl9KQVZBU0NSSVBUID0KKyAgICAgICAgImphdmFzY3JpcHQ6KGZ1bmN0aW9uKCkgeyIgKworICAgICAgICAiICAgIHZhciBjaG9vc2VyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7IiArCisgICAgICAgICIgICAgY2hvb3Nlci50eXBlID0gJ3RleHQvamF2YXNjcmlwdCc7IiArCisgICAgICAgICIgICAgY2hvb3Nlci5zcmMgPSAnaHR0cHM6Ly9zc2wuZ3N0YXRpYy5jb20vYWNjZXNzaWJpbGl0eS9qYXZhc2NyaXB0L2FuZHJvaWQvQW5kcm9pZFNjcmlwdENob29zZXIudXNlci5qcyc7IiArCisgICAgICAgICIgICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2hlYWQnKVswXS5hcHBlbmRDaGlsZChjaG9vc2VyKTsiICsKKyAgICAgICAgIiAgfSkoKTsiOworCiAgICAgLy8gVXNlZCB0byBtYXRjaCBrZXkgZG93bnMgYW5kIGtleSB1cHMKICAgICBwcml2YXRlIGJvb2xlYW4gbUdvdEtleURvd247CiAKQEAgLTg1OCw0MyArODExLDYgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIC8vIFRoZSBWaWV3IGNvbnRhaW5pbmcgdGhlIHpvb20gY29udHJvbHMKLSAgICBwcml2YXRlIEV4dGVuZGVkWm9vbUNvbnRyb2xzIG1ab29tQ29udHJvbHM7Ci0gICAgcHJpdmF0ZSBSdW5uYWJsZSBtWm9vbUNvbnRyb2xSdW5uYWJsZTsKLQotICAgIC8vIG1ab29tQnV0dG9uc0NvbnRyb2xsZXIgd2lsbCBiZSBsYXp5IGluaXRpYWxpemVkIGluCi0gICAgLy8gZ2V0Wm9vbUJ1dHRvbnNDb250cm9sbGVyKCkgdG8gZ2V0IGJldHRlciBwZXJmb3JtYW5jZS4KLSAgICBwcml2YXRlIFpvb21CdXR0b25zQ29udHJvbGxlciBtWm9vbUJ1dHRvbnNDb250cm9sbGVyOwotCi0gICAgLy8gVGhlc2Uga2VlcCB0cmFjayBvZiB0aGUgY2VudGVyIHBvaW50IG9mIHRoZSB6b29tLiAgVGhleSBhcmUgdXNlZCB0bwotICAgIC8vIGRldGVybWluZSB0aGUgcG9pbnQgYXJvdW5kIHdoaWNoIHdlIHNob3VsZCB6b29tLgotICAgIHByaXZhdGUgZmxvYXQgbVpvb21DZW50ZXJYOwotICAgIHByaXZhdGUgZmxvYXQgbVpvb21DZW50ZXJZOwotCi0gICAgcHJpdmF0ZSBab29tQnV0dG9uc0NvbnRyb2xsZXIuT25ab29tTGlzdGVuZXIgbVpvb21MaXN0ZW5lciA9Ci0gICAgICAgICAgICBuZXcgWm9vbUJ1dHRvbnNDb250cm9sbGVyLk9uWm9vbUxpc3RlbmVyKCkgewotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uVmlzaWJpbGl0eUNoYW5nZWQoYm9vbGVhbiB2aXNpYmxlKSB7Ci0gICAgICAgICAgICBpZiAodmlzaWJsZSkgewotICAgICAgICAgICAgICAgIHN3aXRjaE91dERyYXdIaXN0b3J5KCk7Ci0gICAgICAgICAgICAgICAgLy8gQnJpbmcgYmFjayB0aGUgaGlkZGVuIHpvb20gY29udHJvbHMuCi0gICAgICAgICAgICAgICAgbVpvb21CdXR0b25zQ29udHJvbGxlci5nZXRab29tQ29udHJvbHMoKS5zZXRWaXNpYmlsaXR5KAotICAgICAgICAgICAgICAgICAgICAgICAgVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgICAgICB1cGRhdGVab29tQnV0dG9uc0VuYWJsZWQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uWm9vbShib29sZWFuIHpvb21JbikgewotICAgICAgICAgICAgaWYgKHpvb21JbikgewotICAgICAgICAgICAgICAgIHpvb21JbigpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB6b29tT3V0KCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHVwZGF0ZVpvb21CdXR0b25zRW5hYmxlZCgpOwotICAgICAgICB9Ci0gICAgfTsKLQogICAgIC8qKgogICAgICAqIENvbnN0cnVjdCBhIG5ldyBXZWJWaWV3IHdpdGggYSBDb250ZXh0IG9iamVjdC4KICAgICAgKiBAcGFyYW0gY29udGV4dCBBIENvbnRleHQgb2JqZWN0IHVzZWQgdG8gYWNjZXNzIGFwcGxpY2F0aW9uIGFzc2V0cy4KQEAgLTkxOSw3ICs4MzUsMTggQEAKICAgICAgKiBAcGFyYW0gZGVmU3R5bGUgVGhlIGRlZmF1bHQgc3R5bGUgcmVzb3VyY2UgSUQuCiAgICAgICovCiAgICAgcHVibGljIFdlYlZpZXcoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBkZWZTdHlsZSkgewotICAgICAgICB0aGlzKGNvbnRleHQsIGF0dHJzLCBkZWZTdHlsZSwgbnVsbCk7CisgICAgICAgIHRoaXMoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlLCBmYWxzZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgbmV3IFdlYlZpZXcgd2l0aCBsYXlvdXQgcGFyYW1ldGVycyBhbmQgYSBkZWZhdWx0IHN0eWxlLgorICAgICAqIEBwYXJhbSBjb250ZXh0IEEgQ29udGV4dCBvYmplY3QgdXNlZCB0byBhY2Nlc3MgYXBwbGljYXRpb24gYXNzZXRzLgorICAgICAqIEBwYXJhbSBhdHRycyBBbiBBdHRyaWJ1dGVTZXQgcGFzc2VkIHRvIG91ciBwYXJlbnQuCisgICAgICogQHBhcmFtIGRlZlN0eWxlIFRoZSBkZWZhdWx0IHN0eWxlIHJlc291cmNlIElELgorICAgICAqLworICAgIHB1YmxpYyBXZWJWaWV3KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGUsCisgICAgICAgICAgICBib29sZWFuIHByaXZhdGVCcm93c2luZykgeworICAgICAgICB0aGlzKGNvbnRleHQsIGF0dHJzLCBkZWZTdHlsZSwgbnVsbCwgcHJpdmF0ZUJyb3dzaW5nKTsKICAgICB9CiAKICAgICAvKioKQEAgLTkzMCw1MSArODU3LDEzMiBAQAogICAgICAqIEBwYXJhbSBjb250ZXh0IEEgQ29udGV4dCBvYmplY3QgdXNlZCB0byBhY2Nlc3MgYXBwbGljYXRpb24gYXNzZXRzLgogICAgICAqIEBwYXJhbSBhdHRycyBBbiBBdHRyaWJ1dGVTZXQgcGFzc2VkIHRvIG91ciBwYXJlbnQuCiAgICAgICogQHBhcmFtIGRlZlN0eWxlIFRoZSBkZWZhdWx0IHN0eWxlIHJlc291cmNlIElELgotICAgICAqIEBwYXJhbSBqYXZhc2NyaXB0SW50ZXJmYWNlcyBpcyBhIE1hcCBvZiBpbnRhcmVmYWNlIG5hbWVzLCBhcyBrZXlzLCBhbmQKKyAgICAgKiBAcGFyYW0gamF2YXNjcmlwdEludGVyZmFjZXMgaXMgYSBNYXAgb2YgaW50ZXJmYWNlIG5hbWVzLCBhcyBrZXlzLCBhbmQKICAgICAgKiBvYmplY3QgaW1wbGVtZW50aW5nIHRob3NlIGludGVyZmFjZXMsIGFzIHZhbHVlcy4KICAgICAgKiBAaGlkZSBwZW5kaW5nIEFQSSBjb3VuY2lsIGFwcHJvdmFsLgogICAgICAqLwogICAgIHByb3RlY3RlZCBXZWJWaWV3KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGUsCi0gICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IGphdmFzY3JpcHRJbnRlcmZhY2VzKSB7CisgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IGphdmFzY3JpcHRJbnRlcmZhY2VzLCBib29sZWFuIHByaXZhdGVCcm93c2luZykgewogICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycywgZGVmU3R5bGUpOwotICAgICAgICBpbml0KCk7CisKKyAgICAgICAgaWYgKEFjY2Vzc2liaWxpdHlNYW5hZ2VyLmdldEluc3RhbmNlKGNvbnRleHQpLmlzRW5hYmxlZCgpKSB7CisgICAgICAgICAgICBpZiAoamF2YXNjcmlwdEludGVyZmFjZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGphdmFzY3JpcHRJbnRlcmZhY2VzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBleHBvc2VBY2Nlc3NpYmlsaXR5SmF2YVNjcmlwdEFwaShqYXZhc2NyaXB0SW50ZXJmYWNlcyk7CisgICAgICAgIH0KIAogICAgICAgICBtQ2FsbGJhY2tQcm94eSA9IG5ldyBDYWxsYmFja1Byb3h5KGNvbnRleHQsIHRoaXMpOwogICAgICAgICBtVmlld01hbmFnZXIgPSBuZXcgVmlld01hbmFnZXIodGhpcyk7CiAgICAgICAgIG1XZWJWaWV3Q29yZSA9IG5ldyBXZWJWaWV3Q29yZShjb250ZXh0LCB0aGlzLCBtQ2FsbGJhY2tQcm94eSwgamF2YXNjcmlwdEludGVyZmFjZXMpOwogICAgICAgICBtRGF0YWJhc2UgPSBXZWJWaWV3RGF0YWJhc2UuZ2V0SW5zdGFuY2UoY29udGV4dCk7CiAgICAgICAgIG1TY3JvbGxlciA9IG5ldyBTY3JvbGxlcihjb250ZXh0KTsKKyAgICAgICAgbVpvb21NYW5hZ2VyID0gbmV3IFpvb21NYW5hZ2VyKHRoaXMsIG1DYWxsYmFja1Byb3h5KTsKIAorICAgICAgICAvKiBUaGUgaW5pdCBtZXRob2QgbXVzdCBmb2xsb3cgdGhlIGNyZWF0aW9uIG9mIGNlcnRhaW4gbWVtYmVyIHZhcmlhYmxlcywKKyAgICAgICAgICogc3VjaCBhcyB0aGUgbVpvb21NYW5hZ2VyLgorICAgICAgICAgKi8KKyAgICAgICAgaW5pdCgpOworICAgICAgICBzZXR1cFBhY2thZ2VMaXN0ZW5lcihjb250ZXh0KTsKICAgICAgICAgdXBkYXRlTXVsdGlUb3VjaFN1cHBvcnQoY29udGV4dCk7CisKKyAgICAgICAgaWYgKHByaXZhdGVCcm93c2luZykgeworICAgICAgICAgICAgc3RhcnRQcml2YXRlQnJvd3NpbmcoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogVGhlIGludGVudCByZWNlaXZlciB0aGF0IG1vbml0b3JzIGZvciBjaGFuZ2VzIHRvIHJlbGV2YW50IHBhY2thZ2VzIChlLmcuLAorICAgICAqIHNHb29nbGVBcHBzKSBhbmQgbm90aWZpZXMgV2ViVmlld0NvcmUgb2YgdGhlaXIgZXhpc3RlbmNlLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIEJyb2FkY2FzdFJlY2VpdmVyIHNQYWNrYWdlSW5zdGFsbGF0aW9uUmVjZWl2ZXIgPSBudWxsOworCisgICAgLyoKKyAgICAgKiBBIHNldCBvZiBHb29nbGUgcGFja2FnZXMgd2UgbW9uaXRvciBmb3IgdGhlCisgICAgICogbmF2aWdhdG9yLmlzQXBwbGljYXRpb25JbnN0YWxsZWQoKSBBUEkuIEFkZCBhZGRpdGlvbmFsIHBhY2thZ2VzIGFzCisgICAgICogbmVlZGVkLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIFNldDxTdHJpbmc+IHNHb29nbGVBcHBzOworICAgIHN0YXRpYyB7CisgICAgICAgIHNHb29nbGVBcHBzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOworICAgICAgICBzR29vZ2xlQXBwcy5hZGQoImNvbS5nb29nbGUuYW5kcm9pZC55b3V0dWJlIik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNldHVwUGFja2FnZUxpc3RlbmVyKENvbnRleHQgY29udGV4dCkgeworCisgICAgICAgIC8qCisgICAgICAgICAqIHdlIG11c3Qgc3luY2hyb25pemUgdGhlIGluc3RhbmNlIGNoZWNrIGFuZCB0aGUgY3JlYXRpb24gb2YgdGhlCisgICAgICAgICAqIHJlY2VpdmVyIHRvIGVuc3VyZSB0aGF0IG9ubHkgT05FIHJlY2VpdmVyIGV4aXN0cyBmb3IgYWxsIFdlYlZpZXcKKyAgICAgICAgICogaW5zdGFuY2VzLgorICAgICAgICAgKi8KKyAgICAgICAgc3luY2hyb25pemVkIChXZWJWaWV3LmNsYXNzKSB7CisKKyAgICAgICAgICAgIC8vIGlmIHRoZSByZWNlaXZlciBhbHJlYWR5IGV4aXN0cyB0aGVuIHdlIGRvIG5vdCBuZWVkIHRvIHJlZ2lzdGVyIGl0CisgICAgICAgICAgICAvLyBhZ2FpbgorICAgICAgICAgICAgaWYgKHNQYWNrYWdlSW5zdGFsbGF0aW9uUmVjZWl2ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgSW50ZW50RmlsdGVyIGZpbHRlciA9IG5ldyBJbnRlbnRGaWx0ZXIoSW50ZW50LkFDVElPTl9QQUNLQUdFX0FEREVEKTsKKyAgICAgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oSW50ZW50LkFDVElPTl9QQUNLQUdFX1JFTU9WRUQpOworICAgICAgICAgICAgZmlsdGVyLmFkZERhdGFTY2hlbWUoInBhY2thZ2UiKTsKKyAgICAgICAgICAgIHNQYWNrYWdlSW5zdGFsbGF0aW9uUmVjZWl2ZXIgPSBuZXcgQnJvYWRjYXN0UmVjZWl2ZXIoKSB7CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblJlY2VpdmUoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50KSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBhY3Rpb24gPSBpbnRlbnQuZ2V0QWN0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwYWNrYWdlTmFtZSA9IGludGVudC5nZXREYXRhKCkuZ2V0U2NoZW1lU3BlY2lmaWNQYXJ0KCk7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gcmVwbGFjaW5nID0gaW50ZW50LmdldEJvb2xlYW5FeHRyYShJbnRlbnQuRVhUUkFfUkVQTEFDSU5HLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChJbnRlbnQuQUNUSU9OX1BBQ0tBR0VfUkVNT1ZFRC5lcXVhbHMoYWN0aW9uKSAmJiByZXBsYWNpbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIGl0IGlzIHJlcGxhY2luZywgcmVmcmVzaFBsdWdpbnMoKSB3aGVuIGFkZGluZworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNHb29nbGVBcHBzLmNvbnRhaW5zKHBhY2thZ2VOYW1lKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEludGVudC5BQ1RJT05fUEFDS0FHRV9BRERFRC5lcXVhbHMoYWN0aW9uKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1XZWJWaWV3Q29yZS5zZW5kTWVzc2FnZShFdmVudEh1Yi5BRERfUEFDS0FHRV9OQU1FLCBwYWNrYWdlTmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1XZWJWaWV3Q29yZS5zZW5kTWVzc2FnZShFdmVudEh1Yi5SRU1PVkVfUEFDS0FHRV9OQU1FLCBwYWNrYWdlTmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBQbHVnaW5NYW5hZ2VyIHBtID0gUGx1Z2luTWFuYWdlci5nZXRJbnN0YW5jZShjb250ZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBtLmNvbnRhaW5zUGx1Z2luUGVybWlzc2lvbkFuZFNpZ25hdHVyZXMocGFja2FnZU5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwbS5yZWZyZXNoUGx1Z2lucyhJbnRlbnQuQUNUSU9OX1BBQ0tBR0VfQURERUQuZXF1YWxzKGFjdGlvbikpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgY29udGV4dC5nZXRBcHBsaWNhdGlvbkNvbnRleHQoKS5yZWdpc3RlclJlY2VpdmVyKHNQYWNrYWdlSW5zdGFsbGF0aW9uUmVjZWl2ZXIsIGZpbHRlcik7CisgICAgICAgIH0KKworICAgICAgICAvLyBjaGVjayBpZiBhbnkgb2YgdGhlIG1vbml0b3JlZCBhcHBzIGFyZSBhbHJlYWR5IGluc3RhbGxlZAorICAgICAgICBBc3luY1Rhc2s8Vm9pZCwgVm9pZCwgU2V0PFN0cmluZz4+IHRhc2sgPSBuZXcgQXN5bmNUYXNrPFZvaWQsIFZvaWQsIFNldDxTdHJpbmc+PigpIHsKKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwcm90ZWN0ZWQgU2V0PFN0cmluZz4gZG9JbkJhY2tncm91bmQoVm9pZC4uLiB1bnVzZWQpIHsKKyAgICAgICAgICAgICAgICBTZXQ8U3RyaW5nPiBpbnN0YWxsZWRQYWNrYWdlcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKKyAgICAgICAgICAgICAgICBQYWNrYWdlTWFuYWdlciBwbSA9IG1Db250ZXh0LmdldFBhY2thZ2VNYW5hZ2VyKCk7CisgICAgICAgICAgICAgICAgTGlzdDxQYWNrYWdlSW5mbz4gcGFja2FnZXMgPSBwbS5nZXRJbnN0YWxsZWRQYWNrYWdlcygwKTsKKyAgICAgICAgICAgICAgICBmb3IgKFBhY2thZ2VJbmZvIHAgOiBwYWNrYWdlcykgeworICAgICAgICAgICAgICAgICAgICBpZiAoc0dvb2dsZUFwcHMuY29udGFpbnMocC5wYWNrYWdlTmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbGxlZFBhY2thZ2VzLmFkZChwLnBhY2thZ2VOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gaW5zdGFsbGVkUGFja2FnZXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEV4ZWN1dGVzIG9uIHRoZSBVSSB0aHJlYWQKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25Qb3N0RXhlY3V0ZShTZXQ8U3RyaW5nPiBpbnN0YWxsZWRQYWNrYWdlcykgeworICAgICAgICAgICAgICAgIG1XZWJWaWV3Q29yZS5zZW5kTWVzc2FnZShFdmVudEh1Yi5BRERfUEFDS0FHRV9OQU1FUywgaW5zdGFsbGVkUGFja2FnZXMpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICB0YXNrLmV4ZWN1dGUoKTsKICAgICB9CiAKICAgICB2b2lkIHVwZGF0ZU11bHRpVG91Y2hTdXBwb3J0KENvbnRleHQgY29udGV4dCkgewotICAgICAgICBXZWJTZXR0aW5ncyBzZXR0aW5ncyA9IGdldFNldHRpbmdzKCk7Ci0gICAgICAgIG1TdXBwb3J0TXVsdGlUb3VjaCA9IGNvbnRleHQuZ2V0UGFja2FnZU1hbmFnZXIoKS5oYXNTeXN0ZW1GZWF0dXJlKAotICAgICAgICAgICAgICAgIFBhY2thZ2VNYW5hZ2VyLkZFQVRVUkVfVE9VQ0hTQ1JFRU5fTVVMVElUT1VDSCkKLSAgICAgICAgICAgICAgICAmJiBzZXR0aW5ncy5zdXBwb3J0Wm9vbSgpICYmIHNldHRpbmdzLmdldEJ1aWx0SW5ab29tQ29udHJvbHMoKTsKLSAgICAgICAgaWYgKG1TdXBwb3J0TXVsdGlUb3VjaCAmJiAobVNjYWxlRGV0ZWN0b3IgPT0gbnVsbCkpIHsKLSAgICAgICAgICAgIG1TY2FsZURldGVjdG9yID0gbmV3IFNjYWxlR2VzdHVyZURldGVjdG9yKGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgIG5ldyBTY2FsZURldGVjdG9yTGlzdGVuZXIoKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoIW1TdXBwb3J0TXVsdGlUb3VjaCAmJiAobVNjYWxlRGV0ZWN0b3IgIT0gbnVsbCkpIHsKLSAgICAgICAgICAgIG1TY2FsZURldGVjdG9yID0gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVab29tQnV0dG9uc0VuYWJsZWQoKSB7Ci0gICAgICAgIGlmIChtWm9vbUJ1dHRvbnNDb250cm9sbGVyID09IG51bGwpIHJldHVybjsKLSAgICAgICAgYm9vbGVhbiBjYW5ab29tSW4gPSBtQWN0dWFsU2NhbGUgPCBtTWF4Wm9vbVNjYWxlOwotICAgICAgICBib29sZWFuIGNhblpvb21PdXQgPSBtQWN0dWFsU2NhbGUgPiBtTWluWm9vbVNjYWxlICYmICFtSW5ab29tT3ZlcnZpZXc7Ci0gICAgICAgIGlmICghY2FuWm9vbUluICYmICFjYW5ab29tT3V0KSB7Ci0gICAgICAgICAgICAvLyBIaWRlIHRoZSB6b29tIGluIGFuZCBvdXQgYnV0dG9ucywgYXMgd2VsbCBhcyB0aGUgZml0IHRvIHBhZ2UKLSAgICAgICAgICAgIC8vIGJ1dHRvbiwgaWYgdGhlIHBhZ2UgY2Fubm90IHpvb20KLSAgICAgICAgICAgIG1ab29tQnV0dG9uc0NvbnRyb2xsZXIuZ2V0Wm9vbUNvbnRyb2xzKCkuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gU2V0IGVhY2ggb25lIGluZGl2aWR1YWxseSwgYXMgYSBwYWdlIG1heSBiZSBhYmxlIHRvIHpvb20gaW4KLSAgICAgICAgICAgIC8vIG9yIG91dC4KLSAgICAgICAgICAgIG1ab29tQnV0dG9uc0NvbnRyb2xsZXIuc2V0Wm9vbUluRW5hYmxlZChjYW5ab29tSW4pOwotICAgICAgICAgICAgbVpvb21CdXR0b25zQ29udHJvbGxlci5zZXRab29tT3V0RW5hYmxlZChjYW5ab29tT3V0KTsKLSAgICAgICAgfQorICAgICAgICBtWm9vbU1hbmFnZXIudXBkYXRlTXVsdGlUb3VjaFN1cHBvcnQoY29udGV4dCk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIGluaXQoKSB7CkBAIC05OTQsMzQgKzEwMDIsMzggQEAKICAgICAgICAgLy8gdXNlIG9uZSBsaW5lIGhlaWdodCwgMTYgYmFzZWQgb24gb3VyIGN1cnJlbnQgZGVmYXVsdCBmb250LCBmb3IgaG93CiAgICAgICAgIC8vIGZhciB3ZSBhbGxvdyBhIHRvdWNoIGJlIGF3YXkgZnJvbSB0aGUgZWRnZSBvZiBhIGxpbmsKICAgICAgICAgbU5hdlNsb3AgPSAoaW50KSAoMTYgKiBkZW5zaXR5KTsKLSAgICAgICAgLy8gZGVuc2l0eSBhZGp1c3RlZCBzY2FsZSBmYWN0b3JzCi0gICAgICAgIERFRkFVTFRfU0NBTEVfUEVSQ0VOVCA9IChpbnQpICgxMDAgKiBkZW5zaXR5KTsKLSAgICAgICAgbURlZmF1bHRTY2FsZSA9IGRlbnNpdHk7Ci0gICAgICAgIG1BY3R1YWxTY2FsZSA9IGRlbnNpdHk7Ci0gICAgICAgIG1JbnZBY3R1YWxTY2FsZSA9IDEgLyBkZW5zaXR5OwotICAgICAgICBtVGV4dFdyYXBTY2FsZSA9IGRlbnNpdHk7Ci0gICAgICAgIERFRkFVTFRfTUFYX1pPT01fU0NBTEUgPSA0LjBmICogZGVuc2l0eTsKLSAgICAgICAgREVGQVVMVF9NSU5fWk9PTV9TQ0FMRSA9IDAuMjVmICogZGVuc2l0eTsKLSAgICAgICAgbU1heFpvb21TY2FsZSA9IERFRkFVTFRfTUFYX1pPT01fU0NBTEU7Ci0gICAgICAgIG1NaW5ab29tU2NhbGUgPSBERUZBVUxUX01JTl9aT09NX1NDQUxFOworICAgICAgICBtWm9vbU1hbmFnZXIuaW5pdChkZW5zaXR5KTsKICAgICAgICAgbU1heGltdW1GbGluZyA9IGNvbmZpZ3VyYXRpb24uZ2V0U2NhbGVkTWF4aW11bUZsaW5nVmVsb2NpdHkoKTsKKworICAgICAgICAvLyBDb21wdXRlIHRoZSBpbnZlcnNlIG9mIHRoZSBkZW5zaXR5IHNxdWFyZWQuCisgICAgICAgIERSQUdfTEFZRVJfSU5WRVJTRV9ERU5TSVRZX1NRVUFSRUQgPSAxIC8gKGRlbnNpdHkgKiBkZW5zaXR5KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFeHBvc2VzIGFjY2Vzc2liaWxpdHkgQVBJcyB0byBKYXZhU2NyaXB0IGJ5IGFwcGVuZGluZyB0aGVtIHRvIHRoZSBKYXZhU2NyaXB0CisgICAgICogaW50ZXJmYWNlcyBtYXAgcHJvdmlkZWQgYnkgdGhlIFdlYlZpZXcgY2xpZW50LiBJbiBjYXNlIG9mIGNvbmZsaWN0aW5nCisgICAgICogYWxpYXMgd2l0aCB0aGUgb25lIG9mIHRoZSBhY2Nlc3NpYmlsaXR5IEFQSSB0aGUgdXNlciBzcGVjaWZpZWQgb25lIHdpbnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gamF2YXNjcmlwdEludGVyZmFjZXMgQSBtYXAgd2l0aCBpbnRlcmZhY2VzIHRvIGJlIGV4cG9zZWQgdG8gSmF2YVNjcmlwdC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgZXhwb3NlQWNjZXNzaWJpbGl0eUphdmFTY3JpcHRBcGkoTWFwPFN0cmluZywgT2JqZWN0PiBqYXZhc2NyaXB0SW50ZXJmYWNlcykgeworICAgICAgICBpZiAoamF2YXNjcmlwdEludGVyZmFjZXMuY29udGFpbnNLZXkoQUxJQVNfQUNDRVNTSUJJTElUWV9KU19JTlRFUkZBQ0UpKSB7CisgICAgICAgICAgICBMb2cudyhMT0dUQUcsICJKYXZhU2NyaXB0IGludGVyZmFjZSBtYXBwZWQgdG8gXCIiICsgQUxJQVNfQUNDRVNTSUJJTElUWV9KU19JTlRFUkZBQ0UKKyAgICAgICAgICAgICAgICAgICAgKyAiXCIgb3ZlcnJpZGVzIHRoZSBhY2Nlc3NpYmlsaXR5IEFQSSBKYXZhU2NyaXB0IGludGVyZmFjZS4gTm8gYWNjZXNzaWJpbGl0eSIKKyAgICAgICAgICAgICAgICAgICAgKyAiQVBJIHdpbGwgYmUgZXhwb3NlZCB0byBKYXZhU2NyaXB0ISIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gZXhwb3NlIHRoZSBUVFMgZm9yIG5vdyAuLi4KKyAgICAgICAgamF2YXNjcmlwdEludGVyZmFjZXMucHV0KEFMSUFTX0FDQ0VTU0lCSUxJVFlfSlNfSU5URVJGQUNFLAorICAgICAgICAgICAgICAgIG5ldyBUZXh0VG9TcGVlY2goZ2V0Q29udGV4dCgpLCBudWxsKSk7CiAgICAgfQogCiAgICAgLyogcGFja2FnZSAqL3ZvaWQgdXBkYXRlRGVmYXVsdFpvb21EZW5zaXR5KGludCB6b29tRGVuc2l0eSkgewotICAgICAgICBmaW5hbCBmbG9hdCBkZW5zaXR5ID0gZ2V0Q29udGV4dCgpLmdldFJlc291cmNlcygpLmdldERpc3BsYXlNZXRyaWNzKCkuZGVuc2l0eQorICAgICAgICBmaW5hbCBmbG9hdCBkZW5zaXR5ID0gbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0RGlzcGxheU1ldHJpY3MoKS5kZW5zaXR5CiAgICAgICAgICAgICAgICAgKiAxMDAgLyB6b29tRGVuc2l0eTsKLSAgICAgICAgaWYgKE1hdGguYWJzKGRlbnNpdHkgLSBtRGVmYXVsdFNjYWxlKSA+IDAuMDEpIHsKLSAgICAgICAgICAgIGZsb2F0IHNjYWxlRmFjdG9yID0gZGVuc2l0eSAvIG1EZWZhdWx0U2NhbGU7Ci0gICAgICAgICAgICAvLyBhZGp1c3QgdGhlIGxpbWl0cwotICAgICAgICAgICAgbU5hdlNsb3AgPSAoaW50KSAoMTYgKiBkZW5zaXR5KTsKLSAgICAgICAgICAgIERFRkFVTFRfU0NBTEVfUEVSQ0VOVCA9IChpbnQpICgxMDAgKiBkZW5zaXR5KTsKLSAgICAgICAgICAgIERFRkFVTFRfTUFYX1pPT01fU0NBTEUgPSA0LjBmICogZGVuc2l0eTsKLSAgICAgICAgICAgIERFRkFVTFRfTUlOX1pPT01fU0NBTEUgPSAwLjI1ZiAqIGRlbnNpdHk7Ci0gICAgICAgICAgICBtRGVmYXVsdFNjYWxlID0gZGVuc2l0eTsKLSAgICAgICAgICAgIG1NYXhab29tU2NhbGUgKj0gc2NhbGVGYWN0b3I7Ci0gICAgICAgICAgICBtTWluWm9vbVNjYWxlICo9IHNjYWxlRmFjdG9yOwotICAgICAgICAgICAgc2V0TmV3Wm9vbVNjYWxlKG1BY3R1YWxTY2FsZSAqIHNjYWxlRmFjdG9yLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgIH0KKyAgICAgICAgbU5hdlNsb3AgPSAoaW50KSAoMTYgKiBkZW5zaXR5KTsKKyAgICAgICAgbVpvb21NYW5hZ2VyLnVwZGF0ZURlZmF1bHRab29tRGVuc2l0eShkZW5zaXR5KTsKICAgICB9CiAKICAgICAvKiBwYWNrYWdlICovIGJvb2xlYW4gb25TYXZlUGFzc3dvcmQoU3RyaW5nIHNjaGVtZVBsdXNIb3N0LCBTdHJpbmcgdXNlcm5hbWUsCkBAIC0xMTM4LDE0ICsxMTUwLDE2IEBACiAgICAgICogcmV0dXJucyB0aGUgaGVpZ2h0IG9mIHRoZSB0aXRsZWJhcnZpZXcgKGlmIGFueSkuIERvZXMgbm90IGNhcmUgYWJvdXQKICAgICAgKiBzY3JvbGxpbmcKICAgICAgKi8KLSAgICBwcml2YXRlIGludCBnZXRUaXRsZUhlaWdodCgpIHsKKyAgICBpbnQgZ2V0VGl0bGVIZWlnaHQoKSB7CiAgICAgICAgIHJldHVybiBtVGl0bGVCYXIgIT0gbnVsbCA/IG1UaXRsZUJhci5nZXRIZWlnaHQoKSA6IDA7CiAgICAgfQogCiAgICAgLyoKICAgICAgKiBSZXR1cm4gdGhlIGFtb3VudCBvZiB0aGUgdGl0bGViYXJ2aWV3IChpZiBhbnkpIHRoYXQgaXMgdmlzaWJsZQorICAgICAqCisgICAgICogQGhpZGUKICAgICAgKi8KLSAgICBwcml2YXRlIGludCBnZXRWaXNpYmxlVGl0bGVIZWlnaHQoKSB7CisgICAgcHVibGljIGludCBnZXRWaXNpYmxlVGl0bGVIZWlnaHQoKSB7CiAgICAgICAgIHJldHVybiBNYXRoLm1heChnZXRUaXRsZUhlaWdodCgpIC0gbVNjcm9sbFksIDApOwogICAgIH0KIApAQCAtMTIzMyw3ICsxMjQ3LDcgQEAKICAgICAgKiBtZXRob2RzIG1heSBiZSBjYWxsZWQgb24gYSBXZWJWaWV3IGFmdGVyIGRlc3Ryb3kuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgZGVzdHJveSgpIHsKLSAgICAgICAgY2xlYXJUZXh0RW50cnkoZmFsc2UpOworICAgICAgICBjbGVhclRleHRFbnRyeSgpOwogICAgICAgICBpZiAobVdlYlZpZXdDb3JlICE9IG51bGwpIHsKICAgICAgICAgICAgIC8vIFNldCB0aGUgaGFuZGxlcnMgdG8gbnVsbCBiZWZvcmUgZGVzdHJveWluZyBXZWJWaWV3Q29yZSBzbyBubwogICAgICAgICAgICAgLy8gbW9yZSBtZXNzYWdlcyB3aWxsIGJlIHBvc3RlZC4KQEAgLTEzNjEsNiArMTM3NSw3IEBACiAgICAgICAgICAgICBvdXRTdGF0ZS5wdXRCdW5kbGUoImNlcnRpZmljYXRlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTc2xDZXJ0aWZpY2F0ZS5zYXZlU3RhdGUobUNlcnRpZmljYXRlKSk7CiAgICAgICAgIH0KKyAgICAgICAgb3V0U3RhdGUucHV0Qm9vbGVhbigicHJpdmF0ZUJyb3dzaW5nRW5hYmxlZCIsIGlzUHJpdmF0ZUJyb3dzaW5nRW5hYmxlZCgpKTsKICAgICAgICAgcmV0dXJuIGxpc3Q7CiAgICAgfQogCkBAIC0xNDA2LDI5ICsxNDIxLDIzIEBACiAgICAgICAgIC8vIG5vdyB1cGRhdGUgdGhlIGJ1bmRsZQogICAgICAgICBiLnB1dEludCgic2Nyb2xsWCIsIG1TY3JvbGxYKTsKICAgICAgICAgYi5wdXRJbnQoInNjcm9sbFkiLCBtU2Nyb2xsWSk7Ci0gICAgICAgIGIucHV0RmxvYXQoInNjYWxlIiwgbUFjdHVhbFNjYWxlKTsKLSAgICAgICAgYi5wdXRGbG9hdCgidGV4dHdyYXBTY2FsZSIsIG1UZXh0V3JhcFNjYWxlKTsKLSAgICAgICAgYi5wdXRCb29sZWFuKCJvdmVydmlldyIsIG1Jblpvb21PdmVydmlldyk7CisgICAgICAgIG1ab29tTWFuYWdlci5zYXZlWm9vbVN0YXRlKGIpOwogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgcmVzdG9yZUhpc3RvcnlQaWN0dXJlRmllbGRzKFBpY3R1cmUgcCwgQnVuZGxlIGIpIHsKICAgICAgICAgaW50IHN4ID0gYi5nZXRJbnQoInNjcm9sbFgiLCAwKTsKICAgICAgICAgaW50IHN5ID0gYi5nZXRJbnQoInNjcm9sbFkiLCAwKTsKLSAgICAgICAgZmxvYXQgc2NhbGUgPSBiLmdldEZsb2F0KCJzY2FsZSIsIDEuMGYpOworCiAgICAgICAgIG1EcmF3SGlzdG9yeSA9IHRydWU7CiAgICAgICAgIG1IaXN0b3J5UGljdHVyZSA9IHA7CiAgICAgICAgIG1TY3JvbGxYID0gc3g7CiAgICAgICAgIG1TY3JvbGxZID0gc3k7CisgICAgICAgIG1ab29tTWFuYWdlci5yZXN0b3JlWm9vbVN0YXRlKGIpOworICAgICAgICBmaW5hbCBmbG9hdCBzY2FsZSA9IG1ab29tTWFuYWdlci5nZXRTY2FsZSgpOwogICAgICAgICBtSGlzdG9yeVdpZHRoID0gTWF0aC5yb3VuZChwLmdldFdpZHRoKCkgKiBzY2FsZSk7CiAgICAgICAgIG1IaXN0b3J5SGVpZ2h0ID0gTWF0aC5yb3VuZChwLmdldEhlaWdodCgpICogc2NhbGUpOwotICAgICAgICAvLyBhcyBnZXRXaWR0aCgpIC8gZ2V0SGVpZ2h0KCkgb2YgdGhlIHZpZXcgYXJlIG5vdCBhdmFpbGFibGUgeWV0LCBzZXQgdXAKLSAgICAgICAgLy8gbUFjdHVhbFNjYWxlLCBzbyB0aGF0IHdoZW4gb25TaXplQ2hhbmdlZCgpIGlzIGNhbGxlZCwgdGhlIHJlc3Qgd2lsbAotICAgICAgICAvLyBiZSBzZXQgY29ycmVjdGx5Ci0gICAgICAgIG1BY3R1YWxTY2FsZSA9IHNjYWxlOwotICAgICAgICBtSW52QWN0dWFsU2NhbGUgPSAxIC8gc2NhbGU7Ci0gICAgICAgIG1UZXh0V3JhcFNjYWxlID0gYi5nZXRGbG9hdCgidGV4dHdyYXBTY2FsZSIsIHNjYWxlKTsKLSAgICAgICAgbUluWm9vbU92ZXJ2aWV3ID0gYi5nZXRCb29sZWFuKCJvdmVydmlldyIpOworCiAgICAgICAgIGludmFsaWRhdGUoKTsKICAgICB9CiAKQEAgLTE1MjksNiArMTUzOCwxMCBAQAogICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgY29weSB0byBoYXZlIHRoZSBjb3JyZWN0IGluZGV4LgogICAgICAgICAgICAgICAgIHJldHVybkxpc3Quc2V0Q3VycmVudEluZGV4KGluZGV4KTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFJlc3RvcmUgcHJpdmF0ZSBicm93c2luZyBzZXR0aW5nLgorICAgICAgICAgICAgaWYgKGluU3RhdGUuZ2V0Qm9vbGVhbigicHJpdmF0ZUJyb3dzaW5nRW5hYmxlZCIpKSB7CisgICAgICAgICAgICAgICAgZ2V0U2V0dGluZ3MoKS5zZXRQcml2YXRlQnJvd3NpbmdFbmFibGVkKHRydWUpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gUmVtb3ZlIGFsbCBwZW5kaW5nIG1lc3NhZ2VzIGJlY2F1c2Ugd2UgYXJlIHJlc3RvcmluZyBwcmV2aW91cwogICAgICAgICAgICAgLy8gc3RhdGUuCiAgICAgICAgICAgICBtV2ViVmlld0NvcmUucmVtb3ZlTWVzc2FnZXMoKTsKQEAgLTE1NTEsNyArMTU2NCw3IEBACiAgICAgICAgIGFyZy5tVXJsID0gdXJsOwogICAgICAgICBhcmcubUV4dHJhSGVhZGVycyA9IGV4dHJhSGVhZGVyczsKICAgICAgICAgbVdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlKEV2ZW50SHViLkxPQURfVVJMLCBhcmcpOwotICAgICAgICBjbGVhclRleHRFbnRyeShmYWxzZSk7CisgICAgICAgIGNsZWFyVGV4dEVudHJ5KCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xNTgwLDcgKzE1OTMsNyBAQAogICAgICAgICAgICAgYXJnLm1VcmwgPSB1cmw7CiAgICAgICAgICAgICBhcmcubVBvc3REYXRhID0gcG9zdERhdGE7CiAgICAgICAgICAgICBtV2ViVmlld0NvcmUuc2VuZE1lc3NhZ2UoRXZlbnRIdWIuUE9TVF9VUkwsIGFyZyk7Ci0gICAgICAgICAgICBjbGVhclRleHRFbnRyeShmYWxzZSk7CisgICAgICAgICAgICBjbGVhclRleHRFbnRyeSgpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgbG9hZFVybCh1cmwpOwogICAgICAgICB9CkBAIC0xNjM2LDcgKzE2NDksNDYgQEAKICAgICAgICAgYXJnLm1FbmNvZGluZyA9IGVuY29kaW5nOwogICAgICAgICBhcmcubUhpc3RvcnlVcmwgPSBoaXN0b3J5VXJsOwogICAgICAgICBtV2ViVmlld0NvcmUuc2VuZE1lc3NhZ2UoRXZlbnRIdWIuTE9BRF9EQVRBLCBhcmcpOwotICAgICAgICBjbGVhclRleHRFbnRyeShmYWxzZSk7CisgICAgICAgIGNsZWFyVGV4dEVudHJ5KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2F2ZXMgdGhlIGN1cnJlbnQgdmlldyBhcyBhIHdlYiBhcmNoaXZlLgorICAgICAqCisgICAgICogQHBhcmFtIGZpbGVuYW1lIFRoZSBmaWxlbmFtZSB3aGVyZSB0aGUgYXJjaGl2ZSBzaG91bGQgYmUgcGxhY2VkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNhdmVXZWJBcmNoaXZlKFN0cmluZyBmaWxlbmFtZSkgeworICAgICAgICBzYXZlV2ViQXJjaGl2ZShmaWxlbmFtZSwgZmFsc2UsIG51bGwpOworICAgIH0KKworICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGNsYXNzIFNhdmVXZWJBcmNoaXZlTWVzc2FnZSB7CisgICAgICAgIFNhdmVXZWJBcmNoaXZlTWVzc2FnZSAoU3RyaW5nIGJhc2VuYW1lLCBib29sZWFuIGF1dG9uYW1lLCBWYWx1ZUNhbGxiYWNrPFN0cmluZz4gY2FsbGJhY2spIHsKKyAgICAgICAgICAgIG1CYXNlbmFtZSA9IGJhc2VuYW1lOworICAgICAgICAgICAgbUF1dG9uYW1lID0gYXV0b25hbWU7CisgICAgICAgICAgICBtQ2FsbGJhY2sgPSBjYWxsYmFjazsKKyAgICAgICAgfQorCisgICAgICAgIC8qIHBhY2thZ2UgKi8gZmluYWwgU3RyaW5nIG1CYXNlbmFtZTsKKyAgICAgICAgLyogcGFja2FnZSAqLyBmaW5hbCBib29sZWFuIG1BdXRvbmFtZTsKKyAgICAgICAgLyogcGFja2FnZSAqLyBmaW5hbCBWYWx1ZUNhbGxiYWNrPFN0cmluZz4gbUNhbGxiYWNrOworICAgICAgICAvKiBwYWNrYWdlICovIFN0cmluZyBtUmVzdWx0RmlsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTYXZlcyB0aGUgY3VycmVudCB2aWV3IGFzIGEgd2ViIGFyY2hpdmUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYmFzZW5hbWUgVGhlIGZpbGVuYW1lIHdoZXJlIHRoZSBhcmNoaXZlIHNob3VsZCBiZSBwbGFjZWQuCisgICAgICogQHBhcmFtIGF1dG9uYW1lIElmIGZhbHNlLCB0YWtlcyBiYXNlbmFtZSB0byBiZSBhIGZpbGUuIElmIHRydWUsIGJhc2VuYW1lCisgICAgICogICAgICAgICAgICAgICAgIGlzIGFzc3VtZWQgdG8gYmUgYSBkaXJlY3RvcnkgaW4gd2hpY2ggYSBmaWxlbmFtZSB3aWxsIGJlCisgICAgICogICAgICAgICAgICAgICAgIGNob3NlbiBhY2NvcmRpbmcgdG8gdGhlIHVybCBvZiB0aGUgY3VycmVudCBwYWdlLgorICAgICAqIEBwYXJhbSBjYWxsYmFjayBDYWxsZWQgYWZ0ZXIgdGhlIHdlYiBhcmNoaXZlIGhhcyBiZWVuIHNhdmVkLiBUaGUKKyAgICAgKiAgICAgICAgICAgICAgICAgcGFyYW1ldGVyIGZvciBvblJlY2VpdmVWYWx1ZSB3aWxsIGVpdGhlciBiZSB0aGUgZmlsZW5hbWUKKyAgICAgKiAgICAgICAgICAgICAgICAgdW5kZXIgd2hpY2ggdGhlIGZpbGUgd2FzIHNhdmVkLCBvciBudWxsIGlmIHNhdmluZyB0aGUKKyAgICAgKiAgICAgICAgICAgICAgICAgZmlsZSBmYWlsZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2F2ZVdlYkFyY2hpdmUoU3RyaW5nIGJhc2VuYW1lLCBib29sZWFuIGF1dG9uYW1lLCBWYWx1ZUNhbGxiYWNrPFN0cmluZz4gY2FsbGJhY2spIHsKKyAgICAgICAgbVdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlKEV2ZW50SHViLlNBVkVfV0VCQVJDSElWRSwKKyAgICAgICAgICAgIG5ldyBTYXZlV2ViQXJjaGl2ZU1lc3NhZ2UoYmFzZW5hbWUsIGF1dG9uYW1lLCBjYWxsYmFjaykpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTY1Myw3ICsxNzA1LDcgQEAKICAgICAgKiBSZWxvYWQgdGhlIGN1cnJlbnQgdXJsLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHJlbG9hZCgpIHsKLSAgICAgICAgY2xlYXJUZXh0RW50cnkoZmFsc2UpOworICAgICAgICBjbGVhclRleHRFbnRyeSgpOwogICAgICAgICBzd2l0Y2hPdXREcmF3SGlzdG9yeSgpOwogICAgICAgICBtV2ViVmlld0NvcmUuc2VuZE1lc3NhZ2UoRXZlbnRIdWIuUkVMT0FEKTsKICAgICB9CkBAIC0xNzMzLDEyICsxNzg1LDI5IEBACiAKICAgICBwcml2YXRlIHZvaWQgZ29CYWNrT3JGb3J3YXJkKGludCBzdGVwcywgYm9vbGVhbiBpZ25vcmVTbmFwc2hvdCkgewogICAgICAgICBpZiAoc3RlcHMgIT0gMCkgewotICAgICAgICAgICAgY2xlYXJUZXh0RW50cnkoZmFsc2UpOworICAgICAgICAgICAgY2xlYXJUZXh0RW50cnkoKTsKICAgICAgICAgICAgIG1XZWJWaWV3Q29yZS5zZW5kTWVzc2FnZShFdmVudEh1Yi5HT19CQUNLX0ZPUldBUkQsIHN0ZXBzLAogICAgICAgICAgICAgICAgICAgICBpZ25vcmVTbmFwc2hvdCA/IDEgOiAwKTsKICAgICAgICAgfQogICAgIH0KIAorICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiBwcml2YXRlIGJyb3dzaW5nIGlzIGVuYWJsZWQgaW4gdGhpcyBXZWJWaWV3LgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzUHJpdmF0ZUJyb3dzaW5nRW5hYmxlZCAoKSB7CisgICAgICAgIHJldHVybiBnZXRTZXR0aW5ncygpLmlzUHJpdmF0ZUJyb3dzaW5nRW5hYmxlZCgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzdGFydFByaXZhdGVCcm93c2luZyAoKSB7CisgICAgICAgIGJvb2xlYW4gd2FzUHJpdmF0ZUJyb3dzaW5nRW5hYmxlZCA9IGlzUHJpdmF0ZUJyb3dzaW5nRW5hYmxlZCgpOworCisgICAgICAgIGdldFNldHRpbmdzKCkuc2V0UHJpdmF0ZUJyb3dzaW5nRW5hYmxlZCh0cnVlKTsKKworICAgICAgICBpZiAoIXdhc1ByaXZhdGVCcm93c2luZ0VuYWJsZWQpIHsKKyAgICAgICAgICAgIGxvYWRVcmwoImJyb3dzZXI6aW5jb2duaXRvIik7CisgICAgICAgIH0KKyAgICB9CisKICAgICBwcml2YXRlIGJvb2xlYW4gZXh0ZW5kU2Nyb2xsKGludCB5KSB7CiAgICAgICAgIGludCBmaW5hbFkgPSBtU2Nyb2xsZXIuZ2V0RmluYWxZKCk7CiAgICAgICAgIGludCBuZXdZID0gcGluTG9jWShmaW5hbFkgKyB5KTsKQEAgLTE4MDgsNiArMTg3Nyw3IEBACiAgICAgcHVibGljIHZvaWQgY2xlYXJWaWV3KCkgewogICAgICAgICBtQ29udGVudFdpZHRoID0gMDsKICAgICAgICAgbUNvbnRlbnRIZWlnaHQgPSAwOworICAgICAgICBuYXRpdmVTZXRCYXNlTGF5ZXIoMCk7CiAgICAgICAgIG1XZWJWaWV3Q29yZS5zZW5kTWVzc2FnZShFdmVudEh1Yi5DTEVBUl9DT05URU5UKTsKICAgICB9CiAKQEAgLTE4MjEsOCArMTg5MSw5IEBACiAgICAgICogICAgICAgICBib3VuZHMgb2YgdGhlIHZpZXcuCiAgICAgICovCiAgICAgcHVibGljIFBpY3R1cmUgY2FwdHVyZVBpY3R1cmUoKSB7Ci0gICAgICAgIGlmIChudWxsID09IG1XZWJWaWV3Q29yZSkgcmV0dXJuIG51bGw7IC8vIGNoZWNrIGZvciBvdXQgb2YgbWVtb3J5IHRhYgotICAgICAgICByZXR1cm4gbVdlYlZpZXdDb3JlLmNvcHlDb250ZW50UGljdHVyZSgpOworICAgICAgICBQaWN0dXJlIHJlc3VsdCA9IG5ldyBQaWN0dXJlKCk7CisgICAgICAgIG5hdGl2ZUNvcHlCYXNlQ29udGVudFRvUGljdHVyZShyZXN1bHQpOworICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KIAogICAgIC8qKgpAQCAtMTgzNCwxNSArMTkwNSwxMyBAQAogCiAgICAgLyoqCiAgICAgICogUmVtb3ZlIHRoZSBXZWJUZXh0Vmlldy4KLSAgICAgKiBAcGFyYW0gZGlzYWJsZUZvY3VzQ29udHJvbGxlciBJZiB0cnVlLCBzZW5kIGEgbWVzc2FnZSB0byB3ZWJraXQKLSAgICAgKiAgICAgZGlzYWJsaW5nIHRoZSBmb2N1cyBjb250cm9sbGVyLCBzbyB0aGUgY2FyZXQgc3RvcHMgYmxpbmtpbmcuCiAgICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNsZWFyVGV4dEVudHJ5KGJvb2xlYW4gZGlzYWJsZUZvY3VzQ29udHJvbGxlcikgeworICAgIHByaXZhdGUgdm9pZCBjbGVhclRleHRFbnRyeSgpIHsKICAgICAgICAgaWYgKGluRWRpdGluZ01vZGUoKSkgewogICAgICAgICAgICAgbVdlYlRleHRWaWV3LnJlbW92ZSgpOwotICAgICAgICAgICAgaWYgKGRpc2FibGVGb2N1c0NvbnRyb2xsZXIpIHsKLSAgICAgICAgICAgICAgICBzZXRGb2N1c0NvbnRyb2xsZXJJbmFjdGl2ZSgpOwotICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gVGhlIGtleWJvYXJkIG1heSBiZSBvcGVuIHdpdGggdGhlIFdlYlZpZXcgYXMgdGhlIHNlcnZlZCB2aWV3CisgICAgICAgICAgICBoaWRlU29mdEtleWJvYXJkKCk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTE4NTEsNyArMTkyMCw3IEBACiAgICAgICogQHJldHVybiBUaGUgY3VycmVudCBzY2FsZS4KICAgICAgKi8KICAgICBwdWJsaWMgZmxvYXQgZ2V0U2NhbGUoKSB7Ci0gICAgICAgIHJldHVybiBtQWN0dWFsU2NhbGU7CisgICAgICAgIHJldHVybiBtWm9vbU1hbmFnZXIuZ2V0U2NhbGUoKTsKICAgICB9CiAKICAgICAvKioKQEAgLTE4NjMsNyArMTkzMiw3IEBACiAgICAgICogQHBhcmFtIHNjYWxlSW5QZXJjZW50IFRoZSBpbml0aWFsIHNjYWxlIGluIHBlcmNlbnQuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0SW5pdGlhbFNjYWxlKGludCBzY2FsZUluUGVyY2VudCkgewotICAgICAgICBtSW5pdGlhbFNjYWxlSW5QZXJjZW50ID0gc2NhbGVJblBlcmNlbnQ7CisgICAgICAgIG1ab29tTWFuYWdlci5zZXRJbml0aWFsU2NhbGVJblBlcmNlbnQoc2NhbGVJblBlcmNlbnQpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTg3NiwxNCArMTk0NSw4IEBACiAgICAgICAgICAgICBMb2cudyhMT0dUQUcsICJUaGlzIFdlYlZpZXcgZG9lc24ndCBzdXBwb3J0IHpvb20uIik7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KLSAgICAgICAgY2xlYXJUZXh0RW50cnkoZmFsc2UpOwotICAgICAgICBpZiAoZ2V0U2V0dGluZ3MoKS5nZXRCdWlsdEluWm9vbUNvbnRyb2xzKCkpIHsKLSAgICAgICAgICAgIGdldFpvb21CdXR0b25zQ29udHJvbGxlcigpLnNldFZpc2libGUodHJ1ZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtUHJpdmF0ZUhhbmRsZXIucmVtb3ZlQ2FsbGJhY2tzKG1ab29tQ29udHJvbFJ1bm5hYmxlKTsKLSAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5wb3N0RGVsYXllZChtWm9vbUNvbnRyb2xSdW5uYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgWk9PTV9DT05UUk9MU19USU1FT1VUKTsKLSAgICAgICAgfQorICAgICAgICBjbGVhclRleHRFbnRyeSgpOworICAgICAgICBtWm9vbU1hbmFnZXIuaW52b2tlWm9vbVBpY2tlcigpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTk5OCw3ICsyMDYxLDcgQEAKICAgICAgICAgbXNnLnNlbmRUb1RhcmdldCgpOwogICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIGludCBwaW5Mb2MoaW50IHgsIGludCB2aWV3TWF4LCBpbnQgZG9jTWF4KSB7CisgICAgc3RhdGljIGludCBwaW5Mb2MoaW50IHgsIGludCB2aWV3TWF4LCBpbnQgZG9jTWF4KSB7CiAvLyAgICAgICAgTG9nLmQoTE9HVEFHLCAiLS0gcGluTG9jICIgKyB4ICsgIiAiICsgdmlld01heCArICIgIiArIGRvY01heCk7CiAgICAgICAgIGlmIChkb2NNYXggPCB2aWV3TWF4KSB7ICAgLy8gdGhlIGRvYyBoYXMgcm9vbSBvbiB0aGUgc2lkZXMgZm9yICJibGFuayIKICAgICAgICAgICAgIC8vIHBpbiB0aGUgc2hvcnQgZG9jdW1lbnQgdG8gdGhlIHRvcC9sZWZ0IG9mIHRoZSBzY3JlZW4KQEAgLTIwMTUsMTIgKzIwNzgsMTIgQEAKICAgICB9CiAKICAgICAvLyBFeHBlY3RzIHggaW4gdmlldyBjb29yZGluYXRlcwotICAgIHByaXZhdGUgaW50IHBpbkxvY1goaW50IHgpIHsKKyAgICBpbnQgcGluTG9jWChpbnQgeCkgewogICAgICAgICByZXR1cm4gcGluTG9jKHgsIGdldFZpZXdXaWR0aCgpLCBjb21wdXRlSG9yaXpvbnRhbFNjcm9sbFJhbmdlKCkpOwogICAgIH0KIAogICAgIC8vIEV4cGVjdHMgeSBpbiB2aWV3IGNvb3JkaW5hdGVzCi0gICAgcHJpdmF0ZSBpbnQgcGluTG9jWShpbnQgeSkgeworICAgIGludCBwaW5Mb2NZKGludCB5KSB7CiAgICAgICAgIHJldHVybiBwaW5Mb2MoeSwgZ2V0Vmlld0hlaWdodFdpdGhUaXRsZSgpLAogICAgICAgICAgICAgICAgICAgICAgIGNvbXB1dGVWZXJ0aWNhbFNjcm9sbFJhbmdlKCkgKyBnZXRUaXRsZUhlaWdodCgpKTsKICAgICB9CkBAIC0yMDcwLDcgKzIxMzMsNyBAQAogICAgICAqIGhlaWdodC4KICAgICAgKi8KICAgICBwcml2YXRlIGludCB2aWV3VG9Db250ZW50RGltZW5zaW9uKGludCBkKSB7Ci0gICAgICAgIHJldHVybiBNYXRoLnJvdW5kKGQgKiBtSW52QWN0dWFsU2NhbGUpOworICAgICAgICByZXR1cm4gTWF0aC5yb3VuZChkICogbVpvb21NYW5hZ2VyLmdldEludlNjYWxlKCkpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMjA5Niw3ICsyMTU5LDcgQEAKICAgICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgYXMgYSBmbG9hdC4KICAgICAgKi8KICAgICBwcml2YXRlIGZsb2F0IHZpZXdUb0NvbnRlbnRYZihpbnQgeCkgewotICAgICAgICByZXR1cm4geCAqIG1JbnZBY3R1YWxTY2FsZTsKKyAgICAgICAgcmV0dXJuIHggKiBtWm9vbU1hbmFnZXIuZ2V0SW52U2NhbGUoKTsKICAgICB9CiAKICAgICAvKioKQEAgLTIxMDUsNyArMjE2OCw3IEBACiAgICAgICogZW1iZWRkZWQgaW50byB0aGUgV2ViVmlldy4gUmV0dXJucyB0aGUgcmVzdWx0IGFzIGEgZmxvYXQuCiAgICAgICovCiAgICAgcHJpdmF0ZSBmbG9hdCB2aWV3VG9Db250ZW50WWYoaW50IHkpIHsKLSAgICAgICAgcmV0dXJuICh5IC0gZ2V0VGl0bGVIZWlnaHQoKSkgKiBtSW52QWN0dWFsU2NhbGU7CisgICAgICAgIHJldHVybiAoeSAtIGdldFRpdGxlSGVpZ2h0KCkpICogbVpvb21NYW5hZ2VyLmdldEludlNjYWxlKCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0yMTE1LDcgKzIxNzgsNyBAQAogICAgICAqIGhlaWdodC4KICAgICAgKi8KICAgICAvKnBhY2thZ2UqLyBpbnQgY29udGVudFRvVmlld0RpbWVuc2lvbihpbnQgZCkgewotICAgICAgICByZXR1cm4gTWF0aC5yb3VuZChkICogbUFjdHVhbFNjYWxlKTsKKyAgICAgICAgcmV0dXJuIE1hdGgucm91bmQoZCAqIG1ab29tTWFuYWdlci5nZXRTY2FsZSgpKTsKICAgICB9CiAKICAgICAvKioKQEAgLTIxNTYsNyArMjIxOSw3IEBACiAgICAgLy8gQ2FsbGVkIGJ5IEpOSSB0byBpbnZhbGlkYXRlIHRoZSBWaWV3LCBnaXZlbiByZWN0YW5nbGUgY29vcmRpbmF0ZXMgaW4KICAgICAvLyBjb250ZW50IHNwYWNlCiAgICAgcHJpdmF0ZSB2b2lkIHZpZXdJbnZhbGlkYXRlKGludCBsLCBpbnQgdCwgaW50IHIsIGludCBiKSB7Ci0gICAgICAgIGZpbmFsIGZsb2F0IHNjYWxlID0gbUFjdHVhbFNjYWxlOworICAgICAgICBmaW5hbCBmbG9hdCBzY2FsZSA9IG1ab29tTWFuYWdlci5nZXRTY2FsZSgpOwogICAgICAgICBmaW5hbCBpbnQgZHkgPSBnZXRUaXRsZUhlaWdodCgpOwogICAgICAgICBpbnZhbGlkYXRlKChpbnQpTWF0aC5mbG9vcihsICogc2NhbGUpLAogICAgICAgICAgICAgICAgICAgIChpbnQpTWF0aC5mbG9vcih0ICogc2NhbGUpICsgZHksCkBAIC0yMTY3LDcgKzIyMzAsNyBAQAogICAgIC8vIENhbGxlZCBieSBKTkkgdG8gaW52YWxpZGF0ZSB0aGUgVmlldyBhZnRlciBhIGRlbGF5LCBnaXZlbiByZWN0YW5nbGUKICAgICAvLyBjb29yZGluYXRlcyBpbiBjb250ZW50IHNwYWNlCiAgICAgcHJpdmF0ZSB2b2lkIHZpZXdJbnZhbGlkYXRlRGVsYXllZChsb25nIGRlbGF5LCBpbnQgbCwgaW50IHQsIGludCByLCBpbnQgYikgewotICAgICAgICBmaW5hbCBmbG9hdCBzY2FsZSA9IG1BY3R1YWxTY2FsZTsKKyAgICAgICAgZmluYWwgZmxvYXQgc2NhbGUgPSBtWm9vbU1hbmFnZXIuZ2V0U2NhbGUoKTsKICAgICAgICAgZmluYWwgaW50IGR5ID0gZ2V0VGl0bGVIZWlnaHQoKTsKICAgICAgICAgcG9zdEludmFsaWRhdGVEZWxheWVkKGRlbGF5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludClNYXRoLmZsb29yKGwgKiBzY2FsZSksCkBAIC0yMjA1LDEzICsyMjY4LDcgQEAKICAgICAgICAgICAgIC8vIHVwZGF0ZWQgd2hlbiB3ZSBnZXQgb3V0IG9mIHRoYXQgbW9kZS4KICAgICAgICAgICAgIGlmICghbURyYXdIaXN0b3J5KSB7CiAgICAgICAgICAgICAgICAgLy8gcmVwaW4gb3VyIHNjcm9sbCwgdGFraW5nIGludG8gYWNjb3VudCB0aGUgbmV3IGNvbnRlbnQgc2l6ZQotICAgICAgICAgICAgICAgIGludCBvbGRYID0gbVNjcm9sbFg7Ci0gICAgICAgICAgICAgICAgaW50IG9sZFkgPSBtU2Nyb2xsWTsKLSAgICAgICAgICAgICAgICBtU2Nyb2xsWCA9IHBpbkxvY1gobVNjcm9sbFgpOwotICAgICAgICAgICAgICAgIG1TY3JvbGxZID0gcGluTG9jWShtU2Nyb2xsWSk7Ci0gICAgICAgICAgICAgICAgaWYgKG9sZFggIT0gbVNjcm9sbFggfHwgb2xkWSAhPSBtU2Nyb2xsWSkgewotICAgICAgICAgICAgICAgICAgICBvblNjcm9sbENoYW5nZWQobVNjcm9sbFgsIG1TY3JvbGxZLCBvbGRYLCBvbGRZKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdXBkYXRlU2Nyb2xsQ29vcmRpbmF0ZXMocGluTG9jWChtU2Nyb2xsWCksIHBpbkxvY1kobVNjcm9sbFkpKTsKICAgICAgICAgICAgICAgICBpZiAoIW1TY3JvbGxlci5pc0ZpbmlzaGVkKCkpIHsKICAgICAgICAgICAgICAgICAgICAgLy8gV2UgYXJlIGluIHRoZSBtaWRkbGUgb2YgYSBzY3JvbGwuICBSZXBpbiB0aGUgZmluYWwgc2Nyb2xsCiAgICAgICAgICAgICAgICAgICAgIC8vIHBvc2l0aW9uLgpAQCAtMjIyMyw3NyArMjI4MCwxMiBAQAogICAgICAgICBjb250ZW50U2l6ZUNoYW5nZWQodXBkYXRlTGF5b3V0KTsKICAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgc2V0TmV3Wm9vbVNjYWxlKGZsb2F0IHNjYWxlLCBib29sZWFuIHVwZGF0ZVRleHRXcmFwU2NhbGUsCi0gICAgICAgICAgICBib29sZWFuIGZvcmNlKSB7Ci0gICAgICAgIGlmIChzY2FsZSA8IG1NaW5ab29tU2NhbGUpIHsKLSAgICAgICAgICAgIHNjYWxlID0gbU1pblpvb21TY2FsZTsKLSAgICAgICAgICAgIC8vIHNldCBtSW5ab29tT3ZlcnZpZXcgZm9yIG5vbiBtb2JpbGUgc2l0ZXMKLSAgICAgICAgICAgIGlmIChzY2FsZSA8IG1EZWZhdWx0U2NhbGUpIG1Jblpvb21PdmVydmlldyA9IHRydWU7Ci0gICAgICAgIH0gZWxzZSBpZiAoc2NhbGUgPiBtTWF4Wm9vbVNjYWxlKSB7Ci0gICAgICAgICAgICBzY2FsZSA9IG1NYXhab29tU2NhbGU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHVwZGF0ZVRleHRXcmFwU2NhbGUpIHsKLSAgICAgICAgICAgIG1UZXh0V3JhcFNjYWxlID0gc2NhbGU7Ci0gICAgICAgICAgICAvLyByZXNldCBtTGFzdEhlaWdodFNlbnQgdG8gZm9yY2UgVklFV19TSVpFX0NIQU5HRUQgc2VudCB0byBXZWJLaXQKLSAgICAgICAgICAgIG1MYXN0SGVpZ2h0U2VudCA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHNjYWxlICE9IG1BY3R1YWxTY2FsZSB8fCBmb3JjZSkgewotICAgICAgICAgICAgaWYgKG1EcmF3SGlzdG9yeSkgewotICAgICAgICAgICAgICAgIC8vIElmIGhpc3RvcnkgUGljdHVyZSBpcyBkcmF3biwgZG9uJ3QgdXBkYXRlIHNjcm9sbC4gVGhleSB3aWxsCi0gICAgICAgICAgICAgICAgLy8gYmUgdXBkYXRlZCB3aGVuIHdlIGdldCBvdXQgb2YgdGhhdCBtb2RlLgotICAgICAgICAgICAgICAgIGlmIChzY2FsZSAhPSBtQWN0dWFsU2NhbGUgJiYgIW1QcmV2aWV3Wm9vbU9ubHkpIHsKLSAgICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrUHJveHkub25TY2FsZUNoYW5nZWQobUFjdHVhbFNjYWxlLCBzY2FsZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1BY3R1YWxTY2FsZSA9IHNjYWxlOwotICAgICAgICAgICAgICAgIG1JbnZBY3R1YWxTY2FsZSA9IDEgLyBzY2FsZTsKLSAgICAgICAgICAgICAgICBzZW5kVmlld1NpemVab29tKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBvdXIgc2Nyb2xsIHNvIHdlIGRvbid0IGFwcGVhciB0byBqdW1wCi0gICAgICAgICAgICAgICAgLy8gaS5lLiBrZWVwIHRoZSBjZW50ZXIgb2YgdGhlIGRvYyBpbiB0aGUgY2VudGVyIG9mIHRoZSB2aWV3Ci0KLSAgICAgICAgICAgICAgICBpbnQgb2xkWCA9IG1TY3JvbGxYOwotICAgICAgICAgICAgICAgIGludCBvbGRZID0gbVNjcm9sbFk7Ci0gICAgICAgICAgICAgICAgZmxvYXQgcmF0aW8gPSBzY2FsZSAqIG1JbnZBY3R1YWxTY2FsZTsgICAvLyBvbGQgaW52ZXJzZQotICAgICAgICAgICAgICAgIGZsb2F0IHN4ID0gcmF0aW8gKiBvbGRYICsgKHJhdGlvIC0gMSkgKiBtWm9vbUNlbnRlclg7Ci0gICAgICAgICAgICAgICAgZmxvYXQgc3kgPSByYXRpbyAqIG9sZFkgKyAocmF0aW8gLSAxKQotICAgICAgICAgICAgICAgICAgICAgICAgKiAobVpvb21DZW50ZXJZIC0gZ2V0VGl0bGVIZWlnaHQoKSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBub3cgdXBkYXRlIG91ciBuZXcgc2NhbGUgYW5kIGludmVyc2UKLSAgICAgICAgICAgICAgICBpZiAoc2NhbGUgIT0gbUFjdHVhbFNjYWxlICYmICFtUHJldmlld1pvb21Pbmx5KSB7Ci0gICAgICAgICAgICAgICAgICAgIG1DYWxsYmFja1Byb3h5Lm9uU2NhbGVDaGFuZ2VkKG1BY3R1YWxTY2FsZSwgc2NhbGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtQWN0dWFsU2NhbGUgPSBzY2FsZTsKLSAgICAgICAgICAgICAgICBtSW52QWN0dWFsU2NhbGUgPSAxIC8gc2NhbGU7Ci0KLSAgICAgICAgICAgICAgICAvLyBTY2FsZSBhbGwgdGhlIGNoaWxkIHZpZXdzCi0gICAgICAgICAgICAgICAgbVZpZXdNYW5hZ2VyLnNjYWxlQWxsKCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBhcyB3ZSBkb24ndCBoYXZlIGFuaW1hdGlvbiBmb3Igc2NhbGluZywgZG9uJ3QgZG8gYW5pbWF0aW9uCi0gICAgICAgICAgICAgICAgLy8gZm9yIHNjcm9sbGluZywgYXMgaXQgY2F1c2VzIHdlaXJkIGludGVybWVkaWF0ZSBzdGF0ZQotICAgICAgICAgICAgICAgIC8vICAgICAgICBwaW5TY3JvbGxUbyhNYXRoLnJvdW5kKHN4KSwgTWF0aC5yb3VuZChzeSkpOwotICAgICAgICAgICAgICAgIG1TY3JvbGxYID0gcGluTG9jWChNYXRoLnJvdW5kKHN4KSk7Ci0gICAgICAgICAgICAgICAgbVNjcm9sbFkgPSBwaW5Mb2NZKE1hdGgucm91bmQoc3kpKTsKLQotICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSB3ZWJraXQKLSAgICAgICAgICAgICAgICBpZiAob2xkWCAhPSBtU2Nyb2xsWCB8fCBvbGRZICE9IG1TY3JvbGxZKSB7Ci0gICAgICAgICAgICAgICAgICAgIG9uU2Nyb2xsQ2hhbmdlZChtU2Nyb2xsWCwgbVNjcm9sbFksIG9sZFgsIG9sZFkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzY3JvbGwgcG9zaXRpb24gaXMgYWRqdXN0ZWQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUKLSAgICAgICAgICAgICAgICAgICAgLy8gem9vbSBhbmltYXRpb24uIEJ1dCB3ZSB3YW50IHRvIHVwZGF0ZSB0aGUgV2ViS2l0IGF0IHRoZQotICAgICAgICAgICAgICAgICAgICAvLyBlbmQgb2YgdGhlIHpvb20gYW5pbWF0aW9uLiBTZWUgY29tbWVudHMgaW4gb25TY2FsZUVuZCgpLgotICAgICAgICAgICAgICAgICAgICBzZW5kT3VyVmlzaWJsZVJlY3QoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc2VuZFZpZXdTaXplWm9vbSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCiAgICAgLy8gVXNlZCB0byBhdm9pZCBzZW5kaW5nIG1hbnkgdmlzaWJsZSByZWN0IG1lc3NhZ2VzLgogICAgIHByaXZhdGUgUmVjdCBtTGFzdFZpc2libGVSZWN0U2VudDsKICAgICBwcml2YXRlIFJlY3QgbUxhc3RHbG9iYWxSZWN0OwogCi0gICAgcHJpdmF0ZSBSZWN0IHNlbmRPdXJWaXNpYmxlUmVjdCgpIHsKLSAgICAgICAgaWYgKG1QcmV2aWV3Wm9vbU9ubHkpIHJldHVybiBtTGFzdFZpc2libGVSZWN0U2VudDsKKyAgICBSZWN0IHNlbmRPdXJWaXNpYmxlUmVjdCgpIHsKKyAgICAgICAgaWYgKG1ab29tTWFuYWdlci5pc1ByZXZlbnRpbmdXZWJraXRVcGRhdGVzKCkpIHJldHVybiBtTGFzdFZpc2libGVSZWN0U2VudDsKIAogICAgICAgICBSZWN0IHJlY3QgPSBuZXcgUmVjdCgpOwogICAgICAgICBjYWxjT3VyQ29udGVudFZpc2libGVSZWN0KHJlY3QpOwpAQCAtMjMyNiw5ICsyMzE4LDYgQEAKICAgICAgICAgUG9pbnQgcCA9IG5ldyBQb2ludCgpOwogICAgICAgICBnZXRHbG9iYWxWaXNpYmxlUmVjdChyLCBwKTsKICAgICAgICAgci5vZmZzZXQoLXAueCwgLXAueSk7Ci0gICAgICAgIGlmIChtRmluZElzVXApIHsKLSAgICAgICAgICAgIHIuYm90dG9tIC09IG1GaW5kSGVpZ2h0OwotICAgICAgICB9CiAgICAgfQogCiAgICAgLy8gU2V0cyByIHRvIGJlIG91ciB2aXNpYmxlIHJlY3RhbmdsZSBpbiBjb250ZW50IGNvb3JkaW5hdGVzCkBAIC0yMzc1LDE2ICsyMzY0LDE5IEBACiAKICAgICAvKioKICAgICAgKiBDb21wdXRlIHVuem9vbWVkIHdpZHRoIGFuZCBoZWlnaHQsIGFuZCBpZiB0aGV5IGRpZmZlciBmcm9tIHRoZSBsYXN0Ci0gICAgICogdmFsdWVzIHdlIHNlbnQsIHNlbmQgdGhlbSB0byB3ZWJraXQgKHRvIGJlIHVzZWQgaGFzIG5ldyB2aWV3cG9ydCkKKyAgICAgKiB2YWx1ZXMgd2Ugc2VudCwgc2VuZCB0aGVtIHRvIHdlYmtpdCAodG8gYmUgdXNlZCBhcyBuZXcgdmlld3BvcnQpCisgICAgICoKKyAgICAgKiBAcGFyYW0gZm9yY2UgZW5zdXJlcyB0aGF0IHRoZSBtZXNzYWdlIGlzIHNlbnQgdG8gd2Via2l0IGV2ZW4gaWYgdGhlIHdpZHRoCisgICAgICogb3IgaGVpZ2h0IGhhcyBub3QgY2hhbmdlZCBzaW5jZSB0aGUgbGFzdCBtZXNzYWdlCiAgICAgICoKICAgICAgKiBAcmV0dXJuIHRydWUgaWYgbmV3IHZhbHVlcyB3ZXJlIHNlbnQKICAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gc2VuZFZpZXdTaXplWm9vbSgpIHsKLSAgICAgICAgaWYgKG1QcmV2aWV3Wm9vbU9ubHkpIHJldHVybiBmYWxzZTsKKyAgICBib29sZWFuIHNlbmRWaWV3U2l6ZVpvb20oYm9vbGVhbiBmb3JjZSkgeworICAgICAgICBpZiAobVpvb21NYW5hZ2VyLmlzUHJldmVudGluZ1dlYmtpdFVwZGF0ZXMoKSkgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIGludCB2aWV3V2lkdGggPSBnZXRWaWV3V2lkdGgoKTsKLSAgICAgICAgaW50IG5ld1dpZHRoID0gTWF0aC5yb3VuZCh2aWV3V2lkdGggKiBtSW52QWN0dWFsU2NhbGUpOwotICAgICAgICBpbnQgbmV3SGVpZ2h0ID0gTWF0aC5yb3VuZChnZXRWaWV3SGVpZ2h0KCkgKiBtSW52QWN0dWFsU2NhbGUpOworICAgICAgICBpbnQgbmV3V2lkdGggPSBNYXRoLnJvdW5kKHZpZXdXaWR0aCAqIG1ab29tTWFuYWdlci5nZXRJbnZTY2FsZSgpKTsKKyAgICAgICAgaW50IG5ld0hlaWdodCA9IE1hdGgucm91bmQoZ2V0Vmlld0hlaWdodCgpICogbVpvb21NYW5hZ2VyLmdldEludlNjYWxlKCkpOwogICAgICAgICAvKgogICAgICAgICAgKiBCZWNhdXNlIHRoZSBuYXRpdmUgc2lkZSBtYXkgaGF2ZSBhbHJlYWR5IGRvbmUgYSBsYXlvdXQgYmVmb3JlIHRoZQogICAgICAgICAgKiBWaWV3IHN5c3RlbSB3YXMgYWJsZSB0byBtZWFzdXJlIHVzLCB3ZSBoYXZlIHRvIHNlbmQgYSBoZWlnaHQgb2YgMCB0bwpAQCAtMjM5NywxOSArMjM4OSwyMCBAQAogICAgICAgICAgICAgbmV3SGVpZ2h0ID0gMDsKICAgICAgICAgfQogICAgICAgICAvLyBBdm9pZCBzZW5kaW5nIGFub3RoZXIgbWVzc2FnZSBpZiB0aGUgZGltZW5zaW9ucyBoYXZlIG5vdCBjaGFuZ2VkLgotICAgICAgICBpZiAobmV3V2lkdGggIT0gbUxhc3RXaWR0aFNlbnQgfHwgbmV3SGVpZ2h0ICE9IG1MYXN0SGVpZ2h0U2VudCkgeworICAgICAgICBpZiAobmV3V2lkdGggIT0gbUxhc3RXaWR0aFNlbnQgfHwgbmV3SGVpZ2h0ICE9IG1MYXN0SGVpZ2h0U2VudCB8fCBmb3JjZSkgewogICAgICAgICAgICAgVmlld1NpemVEYXRhIGRhdGEgPSBuZXcgVmlld1NpemVEYXRhKCk7CiAgICAgICAgICAgICBkYXRhLm1XaWR0aCA9IG5ld1dpZHRoOwogICAgICAgICAgICAgZGF0YS5tSGVpZ2h0ID0gbmV3SGVpZ2h0OwotICAgICAgICAgICAgZGF0YS5tVGV4dFdyYXBXaWR0aCA9IE1hdGgucm91bmQodmlld1dpZHRoIC8gbVRleHRXcmFwU2NhbGUpOzsKLSAgICAgICAgICAgIGRhdGEubVNjYWxlID0gbUFjdHVhbFNjYWxlOwotICAgICAgICAgICAgZGF0YS5tSWdub3JlSGVpZ2h0ID0gbVpvb21TY2FsZSAhPSAwICYmICFtSGVpZ2h0Q2FuTWVhc3VyZTsKLSAgICAgICAgICAgIGRhdGEubUFuY2hvclggPSBtQW5jaG9yWDsKLSAgICAgICAgICAgIGRhdGEubUFuY2hvclkgPSBtQW5jaG9yWTsKKyAgICAgICAgICAgIGRhdGEubVRleHRXcmFwV2lkdGggPSBNYXRoLnJvdW5kKHZpZXdXaWR0aCAvIG1ab29tTWFuYWdlci5nZXRUZXh0V3JhcFNjYWxlKCkpOworICAgICAgICAgICAgZGF0YS5tU2NhbGUgPSBtWm9vbU1hbmFnZXIuZ2V0U2NhbGUoKTsKKyAgICAgICAgICAgIGRhdGEubUlnbm9yZUhlaWdodCA9IG1ab29tTWFuYWdlci5pc0ZpeGVkTGVuZ3RoQW5pbWF0aW9uSW5Qcm9ncmVzcygpCisgICAgICAgICAgICAgICAgICAgICYmICFtSGVpZ2h0Q2FuTWVhc3VyZTsKKyAgICAgICAgICAgIGRhdGEubUFuY2hvclggPSBtWm9vbU1hbmFnZXIuZ2V0RG9jdW1lbnRBbmNob3JYKCk7CisgICAgICAgICAgICBkYXRhLm1BbmNob3JZID0gbVpvb21NYW5hZ2VyLmdldERvY3VtZW50QW5jaG9yWSgpOwogICAgICAgICAgICAgbVdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlKEV2ZW50SHViLlZJRVdfU0laRV9DSEFOR0VELCBkYXRhKTsKICAgICAgICAgICAgIG1MYXN0V2lkdGhTZW50ID0gbmV3V2lkdGg7CiAgICAgICAgICAgICBtTGFzdEhlaWdodFNlbnQgPSBuZXdIZWlnaHQ7Ci0gICAgICAgICAgICBtQW5jaG9yWCA9IG1BbmNob3JZID0gMDsKKyAgICAgICAgICAgIG1ab29tTWFuYWdlci5jbGVhckRvY3VtZW50QW5jaG9yKCk7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gZmFsc2U7CkBAIC0yNDIwLDEyICsyNDEzLDEyIEBACiAgICAgICAgIGlmIChtRHJhd0hpc3RvcnkpIHsKICAgICAgICAgICAgIHJldHVybiBtSGlzdG9yeVdpZHRoOwogICAgICAgICB9IGVsc2UgaWYgKG1Ib3Jpem9udGFsU2Nyb2xsQmFyTW9kZSA9PSBTQ1JPTExCQVJfQUxXQVlTT0ZGCi0gICAgICAgICAgICAgICAgJiYgKG1BY3R1YWxTY2FsZSAtIG1NaW5ab29tU2NhbGUgPD0gTUlOSU1VTV9TQ0FMRV9JTkNSRU1FTlQpKSB7CisgICAgICAgICAgICAgICAgJiYgIW1ab29tTWFuYWdlci5jYW5ab29tT3V0KCkpIHsKICAgICAgICAgICAgIC8vIG9ubHkgaG9ub3IgdGhlIHNjcm9sbGJhciBtb2RlIHdoZW4gaXQgaXMgYXQgbWluaW11bSB6b29tIGxldmVsCiAgICAgICAgICAgICByZXR1cm4gY29tcHV0ZUhvcml6b250YWxTY3JvbGxFeHRlbnQoKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8vIHRvIGF2b2lkIHJvdW5kaW5nIGVycm9yIGNhdXNlZCB1bm5lY2Vzc2FyeSBzY3JvbGxiYXIsIHVzZSBmbG9vcgotICAgICAgICAgICAgcmV0dXJuIChpbnQpIE1hdGguZmxvb3IobUNvbnRlbnRXaWR0aCAqIG1BY3R1YWxTY2FsZSk7CisgICAgICAgICAgICByZXR1cm4gKGludCkgTWF0aC5mbG9vcihtQ29udGVudFdpZHRoICogbVpvb21NYW5hZ2VyLmdldFNjYWxlKCkpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0yNDM0LDEyICsyNDI3LDEyIEBACiAgICAgICAgIGlmIChtRHJhd0hpc3RvcnkpIHsKICAgICAgICAgICAgIHJldHVybiBtSGlzdG9yeUhlaWdodDsKICAgICAgICAgfSBlbHNlIGlmIChtVmVydGljYWxTY3JvbGxCYXJNb2RlID09IFNDUk9MTEJBUl9BTFdBWVNPRkYKLSAgICAgICAgICAgICAgICAmJiAobUFjdHVhbFNjYWxlIC0gbU1pblpvb21TY2FsZSA8PSBNSU5JTVVNX1NDQUxFX0lOQ1JFTUVOVCkpIHsKKyAgICAgICAgICAgICAgICAmJiAhbVpvb21NYW5hZ2VyLmNhblpvb21PdXQoKSkgewogICAgICAgICAgICAgLy8gb25seSBob25vciB0aGUgc2Nyb2xsYmFyIG1vZGUgd2hlbiBpdCBpcyBhdCBtaW5pbXVtIHpvb20gbGV2ZWwKICAgICAgICAgICAgIHJldHVybiBjb21wdXRlVmVydGljYWxTY3JvbGxFeHRlbnQoKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8vIHRvIGF2b2lkIHJvdW5kaW5nIGVycm9yIGNhdXNlZCB1bm5lY2Vzc2FyeSBzY3JvbGxiYXIsIHVzZSBmbG9vcgotICAgICAgICAgICAgcmV0dXJuIChpbnQpIE1hdGguZmxvb3IobUNvbnRlbnRIZWlnaHQgKiBtQWN0dWFsU2NhbGUpOworICAgICAgICAgICAgcmV0dXJuIChpbnQpIE1hdGguZmxvb3IobUNvbnRlbnRIZWlnaHQgKiBtWm9vbU1hbmFnZXIuZ2V0U2NhbGUoKSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTI1MDcsNyArMjUwMCw5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0IHRoZSB0b3VjaCBpY29uIHVybCBmb3IgdGhlIGFwcGxlLXRvdWNoLWljb24gPGxpbms+IGVsZW1lbnQuCisgICAgICogR2V0IHRoZSB0b3VjaCBpY29uIHVybCBmb3IgdGhlIGFwcGxlLXRvdWNoLWljb24gPGxpbms+IGVsZW1lbnQsIG9yCisgICAgICogYSBVUkwgb24gdGhpcyBzaXRlJ3Mgc2VydmVyIHBvaW50aW5nIHRvIHRoZSBzdGFuZGFyZCBsb2NhdGlvbiBvZiBhCisgICAgICogdG91Y2ggaWNvbi4KICAgICAgKiBAaGlkZQogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0VG91Y2hJY29uVXJsKCkgewpAQCAtMjY4NCwxMCArMjY3OSw2IEBACiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0RmluZElzVXAoYm9vbGVhbiBpc1VwKSB7CiAgICAgICAgIG1GaW5kSXNVcCA9IGlzVXA7Ci0gICAgICAgIGlmIChpc1VwKSB7Ci0gICAgICAgICAgICByZWNvcmROZXdDb250ZW50U2l6ZShtQ29udGVudFdpZHRoLCBtQ29udGVudEhlaWdodCArIG1GaW5kSGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICBmYWxzZSk7Ci0gICAgICAgIH0KICAgICAgICAgaWYgKDAgPT0gbU5hdGl2ZUNsYXNzKSByZXR1cm47IC8vIGNsaWVudCBpc24ndCBpbml0aWFsaXplZAogICAgICAgICBuYXRpdmVTZXRGaW5kSXNVcChpc1VwKTsKICAgICB9CkBAIC0yNzA0LDcgKzI2OTUsNiBAQAogICAgIC8vIG9yIG5vdCB3ZSBkcmF3IHRoZSBoaWdobGlnaHRzIGZvciBtYXRjaGVzLgogICAgIHByaXZhdGUgYm9vbGVhbiBtRmluZElzVXA7CiAKLSAgICBwcml2YXRlIGludCBtRmluZEhlaWdodDsKICAgICAvLyBLZWVwIHRyYWNrIG9mIHRoZSBsYXN0IHN0cmluZyBzZW50LCBzbyB3ZSBjYW4gc2VhcmNoIGFnYWluIGFmdGVyIGFuCiAgICAgLy8gb3JpZW50YXRpb24gY2hhbmdlIG9yIHRoZSBkaXNtaXNzYWwgb2YgdGhlIHNvZnQga2V5Ym9hcmQuCiAgICAgcHJpdmF0ZSBTdHJpbmcgbUxhc3RGaW5kOwpAQCAtMjc3OSw4ICsyNzY5LDYgQEAKICAgICAgICAgfQogICAgICAgICBjbGVhck1hdGNoZXMoKTsKICAgICAgICAgc2V0RmluZElzVXAoZmFsc2UpOwotICAgICAgICByZWNvcmROZXdDb250ZW50U2l6ZShtQ29udGVudFdpZHRoLCBtQ29udGVudEhlaWdodCAtIG1GaW5kSGVpZ2h0LAotICAgICAgICAgICAgICAgIGZhbHNlKTsKICAgICAgICAgLy8gTm93IHRoYXQgdGhlIGRpYWxvZyBoYXMgYmVlbiByZW1vdmVkLCBlbnN1cmUgdGhhdCB3ZSBzY3JvbGwgdG8gYQogICAgICAgICAvLyBsb2NhdGlvbiB0aGF0IGlzIG5vdCBiZXlvbmQgdGhlIGVuZCBvZiB0aGUgcGFnZS4KICAgICAgICAgcGluU2Nyb2xsVG8obVNjcm9sbFgsIG1TY3JvbGxZLCBmYWxzZSwgMCk7CkBAIC0yNzg4LDE2ICsyNzc2LDYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAaGlkZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEZpbmREaWFsb2dIZWlnaHQoaW50IGhlaWdodCkgewotICAgICAgICBpZiAoRGVidWdGbGFncy5XRUJfVklFVykgewotICAgICAgICAgICAgTG9nLnYoTE9HVEFHLCAic2V0RmluZERpYWxvZ0hlaWdodCBoZWlnaHQ9IiArIGhlaWdodCk7Ci0gICAgICAgIH0KLSAgICAgICAgbUZpbmRIZWlnaHQgPSBoZWlnaHQ7Ci0gICAgfQotCi0gICAgLyoqCiAgICAgICogUXVlcnkgdGhlIGRvY3VtZW50IHRvIHNlZSBpZiBpdCBjb250YWlucyBhbnkgaW1hZ2UgcmVmZXJlbmNlcy4gVGhlCiAgICAgICogbWVzc2FnZSBvYmplY3Qgd2lsbCBiZSBkaXNwYXRjaGVkIHdpdGggYXJnMSBiZWluZyBzZXQgdG8gMSBpZiBpbWFnZXMKICAgICAgKiB3ZXJlIGZvdW5kIGFuZCAwIGlmIHRoZSBkb2N1bWVudCBkb2VzIG5vdCByZWZlcmVuY2UgYW55IGltYWdlcy4KQEAgLTI4MTAsNiArMjc4OCwxNiBAQAogICAgICAgICBtV2ViVmlld0NvcmUuc2VuZE1lc3NhZ2UoRXZlbnRIdWIuRE9DX0hBU19JTUFHRVMsIHJlc3BvbnNlKTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBSZXF1ZXN0IHRoZSBzY3JvbGxlciB0byBhYm9ydCBhbnkgb25nb2luZyBhbmltYXRpb24KKyAgICAgKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RvcFNjcm9sbCgpIHsKKyAgICAgICAgbVNjcm9sbGVyLmZvcmNlRmluaXNoZWQodHJ1ZSk7CisgICAgICAgIG1MYXN0VmVsb2NpdHkgPSAwOworICAgIH0KKwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGNvbXB1dGVTY3JvbGwoKSB7CiAgICAgICAgIGlmIChtU2Nyb2xsZXIuY29tcHV0ZVNjcm9sbE9mZnNldCgpKSB7CkBAIC0yODIwLDYgKzI4MDgsMTEgQEAKICAgICAgICAgICAgIHBvc3RJbnZhbGlkYXRlKCk7ICAvLyBTbyB3ZSBkcmF3IGFnYWluCiAgICAgICAgICAgICBpZiAob2xkWCAhPSBtU2Nyb2xsWCB8fCBvbGRZICE9IG1TY3JvbGxZKSB7CiAgICAgICAgICAgICAgICAgb25TY3JvbGxDaGFuZ2VkKG1TY3JvbGxYLCBtU2Nyb2xsWSwgb2xkWCwgb2xkWSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGFib3J0QW5pbWF0aW9uKCk7CisgICAgICAgICAgICAgICAgbVByaXZhdGVIYW5kbGVyLnJlbW92ZU1lc3NhZ2VzKFJFU1VNRV9XRUJDT1JFX1BSSU9SSVRZKTsKKyAgICAgICAgICAgICAgICBXZWJWaWV3Q29yZS5yZXN1bWVQcmlvcml0eSgpOworICAgICAgICAgICAgICAgIFdlYlZpZXdDb3JlLnJlc3VtZVVwZGF0ZVBpY3R1cmUobVdlYlZpZXdDb3JlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHN1cGVyLmNvbXB1dGVTY3JvbGwoKTsKQEAgLTI5MDgsNiArMjkwMSwyOSBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgbVBhZ2VUaGF0TmVlZHNUb1NsaWRlVGl0bGVCYXJPZmZTY3JlZW4gPSBudWxsOwogICAgICAgICB9CisKKyAgICAgICAgaW5qZWN0QWNjZXNzaWJpbGl0eUZvclVybCh1cmwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIGluamVjdHMgYWNjZXNzaWJpbGl0eSBpbiB0aGUgbG9hZGVkIGRvY3VtZW50IGlmIGFjY2Vzc2liaWxpdHkKKyAgICAgKiBpcyBlbmFibGVkLiBJZiBKYXZhU2NyaXB0IGlzIGVuYWJsZWQgd2UgdHJ5IHRvIGluamVjdCBhIFVSTCBzcGVjaWZpYyBzY3JpcHQuCisgICAgICogSWYgbm8gVVJMIHNwZWNpZmljIHNjcmlwdCBpcyBmb3VuZCBvciBKYXZhU2NyaXB0IGlzIGRpc2FibGVkIHdlIGZhbGxiYWNrIHRvCisgICAgICogdGhlIGRlZmF1bHQge0BsaW5rIEFjY2Vzc2liaWxpdHlJbmplY3Rvcn0gaW1wbGVtZW50YXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXJsIFRoZSBVUkwgbG9hZGVkIGJ5IHRoaXMge0BsaW5rIFdlYlZpZXd9LgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBpbmplY3RBY2Nlc3NpYmlsaXR5Rm9yVXJsKFN0cmluZyB1cmwpIHsKKyAgICAgICAgaWYgKEFjY2Vzc2liaWxpdHlNYW5hZ2VyLmdldEluc3RhbmNlKG1Db250ZXh0KS5pc0VuYWJsZWQoKSkgeworICAgICAgICAgICAgaWYgKGdldFNldHRpbmdzKCkuZ2V0SmF2YVNjcmlwdEVuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgIGxvYWRVcmwoQUNDRVNTSUJJTElUWV9TQ1JJUFRfQ0hPT1NFUl9KQVZBU0NSSVBUKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobUFjY2Vzc2liaWxpdHlJbmplY3RvciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUFjY2Vzc2liaWxpdHlJbmplY3RvciA9IG5ldyBBY2Nlc3NpYmlsaXR5SW5qZWN0b3IodGhpcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBpdCBpcyBwb3NzaWJsZSB0aGF0IGFjY2Vzc2liaWxpdHkgd2FzIHR1cm5lZCBvZmYgYmV0d2VlbiByZWxvYWRzCisgICAgICAgICAgICBtQWNjZXNzaWJpbGl0eUluamVjdG9yID0gbnVsbDsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgpAQCAtMzAyNCw3ICszMDQwLDcgQEAKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8vIElmIHdlIGRvbid0IHJlcXVlc3QgYSBsYXlvdXQsIHRyeSB0byBzZW5kIG91ciB2aWV3IHNpemUgdG8gdGhlCiAgICAgICAgICAgICAvLyBuYXRpdmUgc2lkZSB0byBlbnN1cmUgdGhhdCBXZWJDb3JlIGhhcyB0aGUgY29ycmVjdCBkaW1lbnNpb25zLgotICAgICAgICAgICAgc2VuZFZpZXdTaXplWm9vbSgpOworICAgICAgICAgICAgc2VuZFZpZXdTaXplWm9vbShmYWxzZSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTMxNTQsNDYgKzMxNzAsNyBAQAogICAgICAqICAgICAgICAgc2V0dGluZ3MuCiAgICAgICovCiAgICAgcHVibGljIFdlYlNldHRpbmdzIGdldFNldHRpbmdzKCkgewotICAgICAgICByZXR1cm4gbVdlYlZpZXdDb3JlLmdldFNldHRpbmdzKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXNlIHRoaXMgbWV0aG9kIHRvIGluZm9ybSB0aGUgd2VidmlldyBhYm91dCBwYWNrYWdlcyB0aGF0IGFyZSBpbnN0YWxsZWQKLSAgICAgKiBpbiB0aGUgc3lzdGVtLiBUaGlzIGluZm9ybWF0aW9uIHdpbGwgYmUgdXNlZCBieSB0aGUKLSAgICAgKiBuYXZpZ2F0b3IuaXNBcHBsaWNhdGlvbkluc3RhbGxlZCgpIEFQSS4KLSAgICAgKiBAcGFyYW0gcGFja2FnZU5hbWVzIGlzIGEgc2V0IG9mIHBhY2thZ2UgbmFtZXMgdGhhdCBhcmUga25vd24gdG8gYmUKLSAgICAgKiBpbnN0YWxsZWQgaW4gdGhlIHN5c3RlbS4KLSAgICAgKgotICAgICAqIEBoaWRlIG5vdCBhIHB1YmxpYyBBUEkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRQYWNrYWdlTmFtZXMoU2V0PFN0cmluZz4gcGFja2FnZU5hbWVzKSB7Ci0gICAgICAgIG1XZWJWaWV3Q29yZS5zZW5kTWVzc2FnZShFdmVudEh1Yi5BRERfUEFDS0FHRV9OQU1FUywgcGFja2FnZU5hbWVzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVc2UgdGhpcyBtZXRob2QgdG8gaW5mb3JtIHRoZSB3ZWJ2aWV3IGFib3V0IHNpbmdsZSBwYWNrYWdlcyB0aGF0IGFyZQotICAgICAqIGluc3RhbGxlZCBpbiB0aGUgc3lzdGVtLiBUaGlzIGluZm9ybWF0aW9uIHdpbGwgYmUgdXNlZCBieSB0aGUKLSAgICAgKiBuYXZpZ2F0b3IuaXNBcHBsaWNhdGlvbkluc3RhbGxlZCgpIEFQSS4KLSAgICAgKiBAcGFyYW0gcGFja2FnZU5hbWUgaXMgdGhlIG5hbWUgb2YgYSBwYWNrYWdlIHRoYXQgaXMga25vd24gdG8gYmUKLSAgICAgKiBpbnN0YWxsZWQgaW4gdGhlIHN5c3RlbS4KLSAgICAgKgotICAgICAqIEBoaWRlIG5vdCBhIHB1YmxpYyBBUEkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRQYWNrYWdlTmFtZShTdHJpbmcgcGFja2FnZU5hbWUpIHsKLSAgICAgICAgbVdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlKEV2ZW50SHViLkFERF9QQUNLQUdFX05BTUUsIHBhY2thZ2VOYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVc2UgdGhpcyBtZXRob2QgdG8gaW5mb3JtIHRoZSB3ZWJ2aWV3IGFib3V0IHBhY2thZ2VzIHRoYXQgYXJlIHVuaW5zdGFsbGVkCi0gICAgICogaW4gdGhlIHN5c3RlbS4gVGhpcyBpbmZvcm1hdGlvbiB3aWxsIGJlIHVzZWQgYnkgdGhlCi0gICAgICogbmF2aWdhdG9yLmlzQXBwbGljYXRpb25JbnN0YWxsZWQoKSBBUEkuCi0gICAgICogQHBhcmFtIHBhY2thZ2VOYW1lIGlzIHRoZSBuYW1lIG9mIGEgcGFja2FnZSB0aGF0IGhhcyBiZWVuIHVuaW5zdGFsbGVkIGluCi0gICAgICogdGhlIHN5c3RlbS4KLSAgICAgKgotICAgICAqIEBoaWRlIG5vdCBhIHB1YmxpYyBBUEkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVQYWNrYWdlTmFtZShTdHJpbmcgcGFja2FnZU5hbWUpIHsKLSAgICAgICAgbVdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlKEV2ZW50SHViLlJFTU9WRV9QQUNLQUdFX05BTUUsIHBhY2thZ2VOYW1lKTsKKyAgICAgICAgcmV0dXJuIChtV2ViVmlld0NvcmUgIT0gbnVsbCkgPyBtV2ViVmlld0NvcmUuZ2V0U2V0dGluZ3MoKSA6IG51bGw7CiAgICAgfQogCiAgICAvKioKQEAgLTMyOTUsNyArMzI3Miw0NyBAQAogICAgICAgICBpZiAoQVVUT19SRURSQVdfSEFDSyAmJiBtQXV0b1JlZHJhdykgewogICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwogICAgICAgICB9CisgICAgICAgIGlmIChpbkVkaXRpbmdNb2RlKCkpIG1XZWJUZXh0Vmlldy5vbkRyYXdTdWJzdGl0dXRlKCk7CiAgICAgICAgIG1XZWJWaWV3Q29yZS5zaWduYWxSZXBhaW50RG9uZSgpOworCisgICAgICAgIC8vIHBhaW50IHRoZSBoaWdobGlnaHQgaW4gdGhlIGVuZAorICAgICAgICBpZiAoIW1Ub3VjaEhpZ2hsaWdodFJlZ2lvbi5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIGlmIChtVG91Y2hIaWdodGxpZ2h0UGFpbnQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1Ub3VjaEhpZ2h0bGlnaHRQYWludCA9IG5ldyBQYWludCgpOworICAgICAgICAgICAgICAgIG1Ub3VjaEhpZ2h0bGlnaHRQYWludC5zZXRDb2xvcihtSGlnaHRsaWdodENvbG9yKTsKKyAgICAgICAgICAgICAgICBtVG91Y2hIaWdodGxpZ2h0UGFpbnQuc2V0QW50aUFsaWFzKHRydWUpOworICAgICAgICAgICAgICAgIG1Ub3VjaEhpZ2h0bGlnaHRQYWludC5zZXRQYXRoRWZmZWN0KG5ldyBDb3JuZXJQYXRoRWZmZWN0KAorICAgICAgICAgICAgICAgICAgICAgICAgVE9VQ0hfSElHSExJR0hUX0FSQykpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FudmFzLmRyYXdQYXRoKG1Ub3VjaEhpZ2hsaWdodFJlZ2lvbi5nZXRCb3VuZGFyeVBhdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgbVRvdWNoSGlnaHRsaWdodFBhaW50KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoREVCVUdfVE9VQ0hfSElHSExJR0hUKSB7CisgICAgICAgICAgICBpZiAoZ2V0U2V0dGluZ3MoKS5nZXROYXZEdW1wKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoKG1Ub3VjaEhpZ2hsaWdodFggfCBtVG91Y2hIaWdobGlnaHRZKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtVG91Y2hDcm9zc0hhaXJDb2xvciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtVG91Y2hDcm9zc0hhaXJDb2xvciA9IG5ldyBQYWludCgpOworICAgICAgICAgICAgICAgICAgICAgICAgbVRvdWNoQ3Jvc3NIYWlyQ29sb3Iuc2V0Q29sb3IoQ29sb3IuUkVEKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjYW52YXMuZHJhd0xpbmUobVRvdWNoSGlnaGxpZ2h0WCAtIG1OYXZTbG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ub3VjaEhpZ2hsaWdodFkgLSBtTmF2U2xvcCwgbVRvdWNoSGlnaGxpZ2h0WAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtTmF2U2xvcCArIDEsIG1Ub3VjaEhpZ2hsaWdodFkgKyBtTmF2U2xvcAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAxLCBtVG91Y2hDcm9zc0hhaXJDb2xvcik7CisgICAgICAgICAgICAgICAgICAgIGNhbnZhcy5kcmF3TGluZShtVG91Y2hIaWdobGlnaHRYICsgbU5hdlNsb3AgKyAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ub3VjaEhpZ2hsaWdodFkgLSBtTmF2U2xvcCwgbVRvdWNoSGlnaGxpZ2h0WAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBtTmF2U2xvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVG91Y2hIaWdobGlnaHRZICsgbU5hdlNsb3AgKyAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ub3VjaENyb3NzSGFpckNvbG9yKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcmVtb3ZlVG91Y2hIaWdobGlnaHQoYm9vbGVhbiByZW1vdmVQZW5kaW5nTWVzc2FnZSkgeworICAgICAgICBpZiAocmVtb3ZlUGVuZGluZ01lc3NhZ2UpIHsKKyAgICAgICAgICAgIG1XZWJWaWV3Q29yZS5yZW1vdmVNZXNzYWdlcyhFdmVudEh1Yi5HRVRfVE9VQ0hfSElHSExJR0hUX1JFQ1RTKTsKKyAgICAgICAgfQorICAgICAgICBtV2ViVmlld0NvcmUuc2VuZE1lc3NhZ2UoRXZlbnRIdWIuUkVNT1ZFX1RPVUNIX0hJR0hMSUdIVF9SRUNUUyk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC0zMzE3LDcgKzMzMzQsNyBAQAogICAgICAgICAgICAgY2VudGVyS2V5UHJlc3NPblRleHRGaWVsZCgpOwogICAgICAgICAgICAgcmVidWlsZFdlYlRleHRWaWV3KCk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjbGVhclRleHRFbnRyeSh0cnVlKTsKKyAgICAgICAgICAgIGNsZWFyVGV4dEVudHJ5KCk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGluRWRpdGluZ01vZGUoKSkgewogICAgICAgICAgICAgcmV0dXJuIG1XZWJUZXh0Vmlldy5wZXJmb3JtTG9uZ0NsaWNrKCk7CkBAIC0zMzQ1LDE5ICszMzYyLDYgQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIGJvb2xlYW4gaW5BbmltYXRlWm9vbSgpIHsKLSAgICAgICAgcmV0dXJuIG1ab29tU2NhbGUgIT0gMDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBOZWVkIHRvIGFkanVzdCB0aGUgV2ViVGV4dFZpZXcgYWZ0ZXIgYSBjaGFuZ2UgaW4gem9vbSwgc2luY2UgbUFjdHVhbFNjYWxlCi0gICAgICogaGFzIGNoYW5nZWQuICBUaGlzIGlzIGVzcGVjaWFsbHkgaW1wb3J0YW50IGZvciBwYXNzd29yZCBmaWVsZHMsIHdoaWNoIGFyZQotICAgICAqIGRyYXduIGJ5IHRoZSBXZWJUZXh0Vmlldywgc2luY2UgaXQgY29udmV5cyBtb3JlIGluZm9ybWF0aW9uIHRoYW4gd2hhdAotICAgICAqIHdlYmtpdCBkcmF3cy4gIFRodXMgd2UgbmVlZCB0byByZXBvc2l0aW9uIGl0IHRvIHNob3cgaW4gdGhlIGNvcnJlY3QKLSAgICAgKiBwbGFjZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gbU5lZWRUb0FkanVzdFdlYlRleHRWaWV3OwotCiAgICAgcHJpdmF0ZSBib29sZWFuIGRpZFVwZGF0ZVRleHRWaWV3Qm91bmRzKGJvb2xlYW4gYWxsb3dJbnRlcnNlY3QpIHsKICAgICAgICAgUmVjdCBjb250ZW50Qm91bmRzID0gbmF0aXZlRm9jdXNDYW5kaWRhdGVOb2RlQm91bmRzKCk7CiAgICAgICAgIFJlY3QgdkJveCA9IGNvbnRlbnRUb1ZpZXdSZWN0KGNvbnRlbnRCb3VuZHMpOwpAQCAtMzM4NSwyNSArMzM4OSw1NCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIGRyYXdFeHRyYXMoQ2FudmFzIGNhbnZhcywgaW50IGV4dHJhcywgYm9vbGVhbiBhbmltYXRpb25zUnVubmluZykgewotICAgICAgICAvLyBJZiBtTmF0aXZlQ2xhc3MgaXMgMCwgd2Ugc2hvdWxkIG5vdCByZWFjaCBoZXJlLCBzbyB3ZSBkbyBub3QKLSAgICAgICAgLy8gbmVlZCB0byBjaGVjayBpdCBhZ2Fpbi4KLSAgICAgICAgaWYgKGFuaW1hdGlvbnNSdW5uaW5nKSB7Ci0gICAgICAgICAgICBjYW52YXMuc2V0RHJhd0ZpbHRlcihtV2ViVmlld0NvcmUubVpvb21GaWx0ZXIpOworICAgIHByaXZhdGUgdm9pZCBvblpvb21BbmltYXRpb25TdGFydCgpIHsKKyAgICAgICAgLy8gSWYgaXQgaXMgaW4gcGFzc3dvcmQgbW9kZSwgdHVybiBpdCBvZmYgc28gaXQgZG9lcyBub3QgZHJhdyBtaXNwbGFjZWQuCisgICAgICAgIGlmIChpbkVkaXRpbmdNb2RlKCkgJiYgbmF0aXZlRm9jdXNDYW5kaWRhdGVJc1Bhc3N3b3JkKCkpIHsKKyAgICAgICAgICAgIG1XZWJUZXh0Vmlldy5zZXRJblBhc3N3b3JkKGZhbHNlKTsKICAgICAgICAgfQotICAgICAgICBuYXRpdmVEcmF3RXh0cmFzKGNhbnZhcywgZXh0cmFzKTsKLSAgICAgICAgY2FudmFzLnNldERyYXdGaWx0ZXIobnVsbCk7CiAgICAgfQogCisgICAgcHJpdmF0ZSB2b2lkIG9uWm9vbUFuaW1hdGlvbkVuZCgpIHsKKyAgICAgICAgLy8gYWRqdXN0IHRoZSBlZGl0IHRleHQgdmlldyBpZiBuZWVkZWQKKyAgICAgICAgaWYgKGluRWRpdGluZ01vZGUoKSAmJiBkaWRVcGRhdGVUZXh0Vmlld0JvdW5kcyhmYWxzZSkgJiYgbmF0aXZlRm9jdXNDYW5kaWRhdGVJc1Bhc3N3b3JkKCkpIHsKKyAgICAgICAgICAgIC8vIElmIGl0IGlzIGEgcGFzc3dvcmQgZmllbGQsIHN0YXJ0IGRyYXdpbmcgdGhlIFdlYlRleHRWaWV3IG9uY2UKKyAgICAgICAgICAgIC8vIGFnYWluLgorICAgICAgICAgICAgbVdlYlRleHRWaWV3LnNldEluUGFzc3dvcmQodHJ1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIG9uRml4ZWRMZW5ndGhab29tQW5pbWF0aW9uU3RhcnQoKSB7CisgICAgICAgIFdlYlZpZXdDb3JlLnBhdXNlVXBkYXRlUGljdHVyZShnZXRXZWJWaWV3Q29yZSgpKTsKKyAgICAgICAgb25ab29tQW5pbWF0aW9uU3RhcnQoKTsKKyAgICB9CisKKyAgICB2b2lkIG9uRml4ZWRMZW5ndGhab29tQW5pbWF0aW9uRW5kKCkgeworICAgICAgICBXZWJWaWV3Q29yZS5yZXN1bWVVcGRhdGVQaWN0dXJlKG1XZWJWaWV3Q29yZSk7CisgICAgICAgIG9uWm9vbUFuaW1hdGlvbkVuZCgpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBaT09NX0JJVFMgPSBQYWludC5GSUxURVJfQklUTUFQX0ZMQUcgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYWludC5ESVRIRVJfRkxBRyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhaW50LlNVQlBJWEVMX1RFWFRfRkxBRzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0NST0xMX0JJVFMgPSBQYWludC5GSUxURVJfQklUTUFQX0ZMQUcgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhaW50LkRJVEhFUl9GTEFHOworCisgICAgcHJpdmF0ZSBmaW5hbCBEcmF3RmlsdGVyIG1ab29tRmlsdGVyID0KKyAgICAgICAgICAgIG5ldyBQYWludEZsYWdzRHJhd0ZpbHRlcihaT09NX0JJVFMsIFBhaW50LkxJTkVBUl9URVhUX0ZMQUcpOworICAgIC8vIElmIHdlIG5lZWQgdG8gdHJhZGUgYmV0dGVyIHF1YWxpdHkgZm9yIHNwZWVkLCBzZXQgbVNjcm9sbEZpbHRlciB0byBudWxsCisgICAgcHJpdmF0ZSBmaW5hbCBEcmF3RmlsdGVyIG1TY3JvbGxGaWx0ZXIgPQorICAgICAgICAgICAgbmV3IFBhaW50RmxhZ3NEcmF3RmlsdGVyKFNDUk9MTF9CSVRTLCAwKTsKKwogICAgIHByaXZhdGUgdm9pZCBkcmF3Q29yZUFuZEN1cnNvclJpbmcoQ2FudmFzIGNhbnZhcywgaW50IGNvbG9yLAogICAgICAgICBib29sZWFuIGRyYXdDdXJzb3JSaW5nKSB7CiAgICAgICAgIGlmIChtRHJhd0hpc3RvcnkpIHsKLSAgICAgICAgICAgIGNhbnZhcy5zY2FsZShtQWN0dWFsU2NhbGUsIG1BY3R1YWxTY2FsZSk7CisgICAgICAgICAgICBjYW52YXMuc2NhbGUobVpvb21NYW5hZ2VyLmdldFNjYWxlKCksIG1ab29tTWFuYWdlci5nZXRTY2FsZSgpKTsKICAgICAgICAgICAgIGNhbnZhcy5kcmF3UGljdHVyZShtSGlzdG9yeVBpY3R1cmUpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CisgICAgICAgIGlmIChtTmF0aXZlQ2xhc3MgPT0gMCkgcmV0dXJuOwogCi0gICAgICAgIGJvb2xlYW4gYW5pbWF0ZVpvb20gPSBtWm9vbVNjYWxlICE9IDA7CisgICAgICAgIGJvb2xlYW4gYW5pbWF0ZVpvb20gPSBtWm9vbU1hbmFnZXIuaXNGaXhlZExlbmd0aEFuaW1hdGlvbkluUHJvZ3Jlc3MoKTsKICAgICAgICAgYm9vbGVhbiBhbmltYXRlU2Nyb2xsID0gKCghbVNjcm9sbGVyLmlzRmluaXNoZWQoKQogICAgICAgICAgICAgICAgIHx8IG1WZWxvY2l0eVRyYWNrZXIgIT0gbnVsbCkKICAgICAgICAgICAgICAgICAmJiAobVRvdWNoTW9kZSAhPSBUT1VDSF9EUkFHX01PREUgfHwKQEAgLTM0MjIsNTkgKzM0NTUsOSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGlmIChhbmltYXRlWm9vbSkgewotICAgICAgICAgICAgZmxvYXQgem9vbVNjYWxlOwotICAgICAgICAgICAgaW50IGludGVydmFsID0gKGludCkgKFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpIC0gbVpvb21TdGFydCk7Ci0gICAgICAgICAgICBpZiAoaW50ZXJ2YWwgPCBaT09NX0FOSU1BVElPTl9MRU5HVEgpIHsKLSAgICAgICAgICAgICAgICBmbG9hdCByYXRpbyA9IChmbG9hdCkgaW50ZXJ2YWwgLyBaT09NX0FOSU1BVElPTl9MRU5HVEg7Ci0gICAgICAgICAgICAgICAgem9vbVNjYWxlID0gMS4wZiAvIChtSW52SW5pdGlhbFpvb21TY2FsZQotICAgICAgICAgICAgICAgICAgICAgICAgKyAobUludkZpbmFsWm9vbVNjYWxlIC0gbUludkluaXRpYWxab29tU2NhbGUpICogcmF0aW8pOwotICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgem9vbVNjYWxlID0gbVpvb21TY2FsZTsKLSAgICAgICAgICAgICAgICAvLyBzZXQgbVpvb21TY2FsZSB0byBiZSAwIGFzIHdlIGhhdmUgZG9uZSBhbmltYXRpb24KLSAgICAgICAgICAgICAgICBtWm9vbVNjYWxlID0gMDsKLSAgICAgICAgICAgICAgICBXZWJWaWV3Q29yZS5yZXN1bWVVcGRhdGVQaWN0dXJlKG1XZWJWaWV3Q29yZSk7Ci0gICAgICAgICAgICAgICAgLy8gY2FsbCBpbnZhbGlkYXRlKCkgYWdhaW4gdG8gZHJhdyB3aXRoIHRoZSBmaW5hbCBmaWx0ZXJzCi0gICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwotICAgICAgICAgICAgICAgIGlmIChtTmVlZFRvQWRqdXN0V2ViVGV4dFZpZXcpIHsKLSAgICAgICAgICAgICAgICAgICAgbU5lZWRUb0FkanVzdFdlYlRleHRWaWV3ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkaWRVcGRhdGVUZXh0Vmlld0JvdW5kcyhmYWxzZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBuYXRpdmVGb2N1c0NhbmRpZGF0ZUlzUGFzc3dvcmQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgaXQgaXMgYSBwYXNzd29yZCBmaWVsZCwgc3RhcnQgZHJhd2luZyB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlYlRleHRWaWV3IG9uY2UgYWdhaW4uCi0gICAgICAgICAgICAgICAgICAgICAgICBtV2ViVGV4dFZpZXcuc2V0SW5QYXNzd29yZCh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIGNhbGN1bGF0ZSB0aGUgaW50ZXJtZWRpYXRlIHNjcm9sbCBwb3NpdGlvbi4gQXMgd2UgbmVlZCB0byB1c2UKLSAgICAgICAgICAgIC8vIHpvb21TY2FsZSwgd2UgY2FuJ3QgdXNlIHBpbkxvY1gvWSBkaXJlY3RseS4gQ29weSB0aGUgbG9naWMgaGVyZS4KLSAgICAgICAgICAgIGZsb2F0IHNjYWxlID0gem9vbVNjYWxlICogbUludkluaXRpYWxab29tU2NhbGU7Ci0gICAgICAgICAgICBpbnQgdHggPSBNYXRoLnJvdW5kKHNjYWxlICogKG1Jbml0aWFsU2Nyb2xsWCArIG1ab29tQ2VudGVyWCkKLSAgICAgICAgICAgICAgICAgICAgLSBtWm9vbUNlbnRlclgpOwotICAgICAgICAgICAgdHggPSAtcGluTG9jKHR4LCBnZXRWaWV3V2lkdGgoKSwgTWF0aC5yb3VuZChtQ29udGVudFdpZHRoCi0gICAgICAgICAgICAgICAgICAgICogem9vbVNjYWxlKSkgKyBtU2Nyb2xsWDsKLSAgICAgICAgICAgIGludCB0aXRsZUhlaWdodCA9IGdldFRpdGxlSGVpZ2h0KCk7Ci0gICAgICAgICAgICBpbnQgdHkgPSBNYXRoLnJvdW5kKHNjYWxlCi0gICAgICAgICAgICAgICAgICAgICogKG1Jbml0aWFsU2Nyb2xsWSArIG1ab29tQ2VudGVyWSAtIHRpdGxlSGVpZ2h0KQotICAgICAgICAgICAgICAgICAgICAtIChtWm9vbUNlbnRlclkgLSB0aXRsZUhlaWdodCkpOwotICAgICAgICAgICAgdHkgPSAtKHR5IDw9IHRpdGxlSGVpZ2h0ID8gTWF0aC5tYXgodHksIDApIDogcGluTG9jKHR5Ci0gICAgICAgICAgICAgICAgICAgIC0gdGl0bGVIZWlnaHQsIGdldFZpZXdIZWlnaHQoKSwgTWF0aC5yb3VuZChtQ29udGVudEhlaWdodAotICAgICAgICAgICAgICAgICAgICAqIHpvb21TY2FsZSkpICsgdGl0bGVIZWlnaHQpICsgbVNjcm9sbFk7Ci0gICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKHR4LCB0eSk7Ci0gICAgICAgICAgICBjYW52YXMuc2NhbGUoem9vbVNjYWxlLCB6b29tU2NhbGUpOwotICAgICAgICAgICAgaWYgKGluRWRpdGluZ01vZGUoKSAmJiAhbU5lZWRUb0FkanVzdFdlYlRleHRWaWV3Ci0gICAgICAgICAgICAgICAgICAgICYmIG1ab29tU2NhbGUgIT0gMCkgewotICAgICAgICAgICAgICAgIC8vIFRoZSBXZWJUZXh0VmlldyBpcyB1cC4gIEtlZXAgdHJhY2sgb2YgdGhpcyBzbyB3ZSBjYW4gYWRqdXN0Ci0gICAgICAgICAgICAgICAgLy8gaXRzIHNpemUgYW5kIHBsYWNlbWVudCB3aGVuIHdlIGZpbmlzaCB6b29taW5nCi0gICAgICAgICAgICAgICAgbU5lZWRUb0FkanVzdFdlYlRleHRWaWV3ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAvLyBJZiBpdCBpcyBpbiBwYXNzd29yZCBtb2RlLCB0dXJuIGl0IG9mZiBzbyBpdCBkb2VzIG5vdCBkcmF3Ci0gICAgICAgICAgICAgICAgLy8gbWlzcGxhY2VkLgotICAgICAgICAgICAgICAgIGlmIChuYXRpdmVGb2N1c0NhbmRpZGF0ZUlzUGFzc3dvcmQoKSkgewotICAgICAgICAgICAgICAgICAgICBtV2ViVGV4dFZpZXcuc2V0SW5QYXNzd29yZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQorICAgICAgICAgICAgbVpvb21NYW5hZ2VyLmFuaW1hdGVab29tKGNhbnZhcyk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjYW52YXMuc2NhbGUobUFjdHVhbFNjYWxlLCBtQWN0dWFsU2NhbGUpOworICAgICAgICAgICAgY2FudmFzLnNjYWxlKG1ab29tTWFuYWdlci5nZXRTY2FsZSgpLCBtWm9vbU1hbmFnZXIuZ2V0U2NhbGUoKSk7CiAgICAgICAgIH0KIAogICAgICAgICBib29sZWFuIFVJQW5pbWF0aW9uc1J1bm5pbmcgPSBmYWxzZTsKQEAgLTM0ODYsMjMgKzM0NjksMzggQEAKICAgICAgICAgICAgIC8vIHdlIGFzayBmb3IgYSByZXBhaW50LgogICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwogICAgICAgICB9Ci0gICAgICAgIG1XZWJWaWV3Q29yZS5kcmF3Q29udGVudFBpY3R1cmUoY2FudmFzLCBjb2xvciwKLSAgICAgICAgICAgICAgICAoYW5pbWF0ZVpvb20gfHwgbVByZXZpZXdab29tT25seSB8fCBVSUFuaW1hdGlvbnNSdW5uaW5nKSwKLSAgICAgICAgICAgICAgICBhbmltYXRlU2Nyb2xsKTsKLSAgICAgICAgaWYgKG1OYXRpdmVDbGFzcyA9PSAwKSByZXR1cm47CisKICAgICAgICAgLy8gZGVjaWRlIHdoaWNoIGFkb3JubWVudHMgdG8gZHJhdwogICAgICAgICBpbnQgZXh0cmFzID0gRFJBV19FWFRSQVNfTk9ORTsKKyAgICAgICAgaWYgKERlYnVnRmxhZ3MuV0VCX1ZJRVcpIHsKKyAgICAgICAgICAgIExvZy52KExPR1RBRywgIm1GaW5kSXNVcD0iICsgbUZpbmRJc1VwCisgICAgICAgICAgICAgICAgICAgICsgIiBtU2VsZWN0aW5nVGV4dD0iICsgbVNlbGVjdGluZ1RleHQKKyAgICAgICAgICAgICAgICAgICAgKyAiIG5hdGl2ZVBhZ2VTaG91bGRIYW5kbGVTaGlmdEFuZEFycm93cygpPSIKKyAgICAgICAgICAgICAgICAgICAgKyBuYXRpdmVQYWdlU2hvdWxkSGFuZGxlU2hpZnRBbmRBcnJvd3MoKQorICAgICAgICAgICAgICAgICAgICArICIgYW5pbWF0ZVpvb209IiArIGFuaW1hdGVab29tKTsKKyAgICAgICAgfQogICAgICAgICBpZiAobUZpbmRJc1VwKSB7Ci0gICAgICAgICAgICAgICAgZXh0cmFzID0gRFJBV19FWFRSQVNfRklORDsKKyAgICAgICAgICAgIGV4dHJhcyA9IERSQVdfRVhUUkFTX0ZJTkQ7CiAgICAgICAgIH0gZWxzZSBpZiAobVNlbGVjdGluZ1RleHQpIHsKICAgICAgICAgICAgIGV4dHJhcyA9IERSQVdfRVhUUkFTX1NFTEVDVElPTjsKICAgICAgICAgICAgIG5hdGl2ZVNldFNlbGVjdGlvblBvaW50ZXIobURyYXdTZWxlY3Rpb25Qb2ludGVyLAotICAgICAgICAgICAgICAgICAgICBtSW52QWN0dWFsU2NhbGUsCisgICAgICAgICAgICAgICAgICAgIG1ab29tTWFuYWdlci5nZXRJbnZTY2FsZSgpLAogICAgICAgICAgICAgICAgICAgICBtU2VsZWN0WCwgbVNlbGVjdFkgLSBnZXRUaXRsZUhlaWdodCgpKTsKICAgICAgICAgfSBlbHNlIGlmIChkcmF3Q3Vyc29yUmluZykgewogICAgICAgICAgICAgZXh0cmFzID0gRFJBV19FWFRSQVNfQ1VSU09SX1JJTkc7CiAgICAgICAgIH0KLSAgICAgICAgZHJhd0V4dHJhcyhjYW52YXMsIGV4dHJhcywgVUlBbmltYXRpb25zUnVubmluZyk7CisgICAgICAgIERyYXdGaWx0ZXIgZGYgPSBudWxsOworICAgICAgICBpZiAobVpvb21NYW5hZ2VyLmlzWm9vbUFuaW1hdGluZygpIHx8IFVJQW5pbWF0aW9uc1J1bm5pbmcpIHsKKyAgICAgICAgICAgIGRmID0gbVpvb21GaWx0ZXI7CisgICAgICAgIH0gZWxzZSBpZiAoYW5pbWF0ZVNjcm9sbCkgeworICAgICAgICAgICAgZGYgPSBtU2Nyb2xsRmlsdGVyOworICAgICAgICB9CisgICAgICAgIGNhbnZhcy5zZXREcmF3RmlsdGVyKGRmKTsKKyAgICAgICAgaW50IGNvbnRlbnQgPSBuYXRpdmVEcmF3KGNhbnZhcywgY29sb3IsIGV4dHJhcywgdHJ1ZSk7CisgICAgICAgIGNhbnZhcy5zZXREcmF3RmlsdGVyKG51bGwpOworICAgICAgICBpZiAoY29udGVudCAhPSAwKSB7CisgICAgICAgICAgICBtV2ViVmlld0NvcmUuc2VuZE1lc3NhZ2UoRXZlbnRIdWIuU1BMSVRfUElDVFVSRV9TRVQsIGNvbnRlbnQsIDApOworICAgICAgICB9CiAKICAgICAgICAgaWYgKGV4dHJhcyA9PSBEUkFXX0VYVFJBU19DVVJTT1JfUklORykgewogICAgICAgICAgICAgaWYgKG1Ub3VjaE1vZGUgPT0gVE9VQ0hfU0hPUlRQUkVTU19TVEFSVF9NT0RFKSB7CkBAIC0zNTMxLDEwICszNTI5LDE0IEBACiAgICAgICAgIHJldHVybiBtRHJhd0hpc3Rvcnk7CiAgICAgfQogCisgICAgaW50IGdldEhpc3RvcnlQaWN0dXJlV2lkdGgoKSB7CisgICAgICAgIHJldHVybiAobUhpc3RvcnlQaWN0dXJlICE9IG51bGwpID8gbUhpc3RvcnlQaWN0dXJlLmdldFdpZHRoKCkgOiAwOworICAgIH0KKwogICAgIC8vIFNob3VsZCBvbmx5IGJlIGNhbGxlZCBpbiBVSSB0aHJlYWQKICAgICB2b2lkIHN3aXRjaE91dERyYXdIaXN0b3J5KCkgewogICAgICAgICBpZiAobnVsbCA9PSBtV2ViVmlld0NvcmUpIHJldHVybjsgLy8gQ2FsbGJhY2tQcm94eSBtYXkgdHJpZ2dlciB0aGlzCi0gICAgICAgIGlmIChtRHJhd0hpc3RvcnkgJiYgbVdlYlZpZXdDb3JlLnBpY3R1cmVSZWFkeSgpKSB7CisgICAgICAgIGlmIChtRHJhd0hpc3RvcnkgJiYgKGdldFByb2dyZXNzKCkgPT0gMTAwIHx8IG5hdGl2ZUhhc0NvbnRlbnQoKSkpIHsKICAgICAgICAgICAgIG1EcmF3SGlzdG9yeSA9IGZhbHNlOwogICAgICAgICAgICAgbUhpc3RvcnlQaWN0dXJlID0gbnVsbDsKICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKQEAgLTM1ODUsNyArMzU4Nyw5IEBACiAgICAgICogIEBwYXJhbSAgZW5kICAgICBFbmQgb2Ygc2VsZWN0aW9uLgogICAgICAqLwogICAgIC8qIHBhY2thZ2UgKi8gdm9pZCBzZXRTZWxlY3Rpb24oaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ci0gICAgICAgIG1XZWJWaWV3Q29yZS5zZW5kTWVzc2FnZShFdmVudEh1Yi5TRVRfU0VMRUNUSU9OLCBzdGFydCwgZW5kKTsKKyAgICAgICAgaWYgKG1XZWJWaWV3Q29yZSAhPSBudWxsKSB7CisgICAgICAgICAgICBtV2ViVmlld0NvcmUuc2VuZE1lc3NhZ2UoRXZlbnRIdWIuU0VUX1NFTEVDVElPTiwgc3RhcnQsIGVuZCk7CisgICAgICAgIH0KICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTM2MDMsMTQgKzM2MDcsMTEgQEAKICAgICAgICAgSW5wdXRNZXRob2RNYW5hZ2VyIGltbSA9IChJbnB1dE1ldGhvZE1hbmFnZXIpCiAgICAgICAgICAgICAgICAgZ2V0Q29udGV4dCgpLmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5JTlBVVF9NRVRIT0RfU0VSVklDRSk7CiAKLSAgICAgICAgLy8gYnJpbmcgaXQgYmFjayB0byB0aGUgZGVmYXVsdCBzY2FsZSBzbyB0aGF0IHVzZXIgY2FuIGVudGVyIHRleHQKLSAgICAgICAgYm9vbGVhbiB6b29tID0gbUFjdHVhbFNjYWxlIDwgbURlZmF1bHRTY2FsZTsKKyAgICAgICAgLy8gYnJpbmcgaXQgYmFjayB0byB0aGUgcmVhZGluZyBsZXZlbCBzY2FsZSBzbyB0aGF0IHVzZXIgY2FuIGVudGVyIHRleHQKKyAgICAgICAgYm9vbGVhbiB6b29tID0gbVpvb21NYW5hZ2VyLmdldFNjYWxlKCkgPCBtWm9vbU1hbmFnZXIuZ2V0UmVhZGluZ0xldmVsU2NhbGUoKTsKICAgICAgICAgaWYgKHpvb20pIHsKLSAgICAgICAgICAgIG1Jblpvb21PdmVydmlldyA9IGZhbHNlOwotICAgICAgICAgICAgbVpvb21DZW50ZXJYID0gbUxhc3RUb3VjaFg7Ci0gICAgICAgICAgICBtWm9vbUNlbnRlclkgPSBtTGFzdFRvdWNoWTsKLSAgICAgICAgICAgIC8vIGRvIG5vdCBjaGFuZ2UgdGV4dCB3cmFwIHNjYWxlIHNvIHRoYXQgdGhlcmUgaXMgbm8gcmVmbG93Ci0gICAgICAgICAgICBzZXROZXdab29tU2NhbGUobURlZmF1bHRTY2FsZSwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgICAgIG1ab29tTWFuYWdlci5zZXRab29tQ2VudGVyKG1MYXN0VG91Y2hYLCBtTGFzdFRvdWNoWSk7CisgICAgICAgICAgICBtWm9vbU1hbmFnZXIuc2V0Wm9vbVNjYWxlKG1ab29tTWFuYWdlci5nZXRSZWFkaW5nTGV2ZWxTY2FsZSgpLCBmYWxzZSk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGlzVGV4dFZpZXcpIHsKICAgICAgICAgICAgIHJlYnVpbGRXZWJUZXh0VmlldygpOwpAQCAtMzc5OSw2ICszODAwLDI2IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogQ2FsbGVkIGJ5IERSVCBvbiBVSSB0aHJlYWQsIG5lZWQgdG8gcHJveHkgdG8gV2ViQ29yZSB0aHJlYWQuCisgICAgICoKKyAgICAgKiBAaGlkZSBkZWJ1ZyBvbmx5CisgICAgICovCisgICAgcHVibGljIHZvaWQgdXNlTW9ja0RldmljZU9yaWVudGF0aW9uKCkgeworICAgICAgICBtV2ViVmlld0NvcmUuc2VuZE1lc3NhZ2UoRXZlbnRIdWIuVVNFX01PQ0tfREVWSUNFX09SSUVOVEFUSU9OKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgYnkgRFJUIG9uIFdlYkNvcmUgdGhyZWFkLgorICAgICAqCisgICAgICogQGhpZGUgZGVidWcgb25seQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE1vY2tEZXZpY2VPcmllbnRhdGlvbihib29sZWFuIGNhblByb3ZpZGVBbHBoYSwgZG91YmxlIGFscGhhLAorICAgICAgICAgICAgYm9vbGVhbiBjYW5Qcm92aWRlQmV0YSwgZG91YmxlIGJldGEsIGJvb2xlYW4gY2FuUHJvdmlkZUdhbW1hLCBkb3VibGUgZ2FtbWEpIHsKKyAgICAgICAgbVdlYlZpZXdDb3JlLnNldE1vY2tEZXZpY2VPcmllbnRhdGlvbihjYW5Qcm92aWRlQWxwaGEsIGFscGhhLCBjYW5Qcm92aWRlQmV0YSwgYmV0YSwKKyAgICAgICAgICAgICAgICBjYW5Qcm92aWRlR2FtbWEsIGdhbW1hKTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBEdW1wIHRoZSBWOCBjb3VudGVycyB0byBzdGFuZGFyZCBvdXRwdXQuCiAgICAgICogTm90ZSB0aGF0IHlvdSBuZWVkIGEgYnVpbGQgd2l0aCBWOCBhbmQgV0VCQ09SRV9JTlNUUlVNRU5UQVRJT04gc2V0IHRvCiAgICAgICogdHJ1ZS4gT3RoZXJ3aXNlLCB0aGlzIHdpbGwgZG8gbm90aGluZy4KQEAgLTM4MTQsNiArMzgzNSwxOSBAQAogICAgIHByaXZhdGUgYm9vbGVhbiBtR290Q2VudGVyRG93biA9IGZhbHNlOwogCiAgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25LZXlNdWx0aXBsZShpbnQga2V5Q29kZSwgaW50IHJlcGVhdENvdW50LCBLZXlFdmVudCBldmVudCkgeworICAgICAgICAvLyBzZW5kIGNvbXBsZXggY2hhcmFjdGVycyB0byB3ZWJraXQgZm9yIHVzZSBieSBKUyBhbmQgcGx1Z2lucworICAgICAgICBpZiAoa2V5Q29kZSA9PSBLZXlFdmVudC5LRVlDT0RFX1VOS05PV04gJiYgZXZlbnQuZ2V0Q2hhcmFjdGVycygpICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIHBhc3MgdGhlIGtleSB0byBET00KKyAgICAgICAgICAgIG1XZWJWaWV3Q29yZS5zZW5kTWVzc2FnZShFdmVudEh1Yi5LRVlfRE9XTiwgZXZlbnQpOworICAgICAgICAgICAgbVdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlKEV2ZW50SHViLktFWV9VUCwgZXZlbnQpOworICAgICAgICAgICAgLy8gcmV0dXJuIHRydWUgYXMgRE9NIGhhbmRsZXMgdGhlIGtleQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIG9uS2V5RG93bihpbnQga2V5Q29kZSwgS2V5RXZlbnQgZXZlbnQpIHsKICAgICAgICAgaWYgKERlYnVnRmxhZ3MuV0VCX1ZJRVcpIHsKICAgICAgICAgICAgIExvZy52KExPR1RBRywgImtleURvd24gYXQgIiArIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpCkBAIC0zODM2LDE0ICszODcwLDE2IEBACiAgICAgICAgIC8vIEJ1YmJsZSB1cCB0aGUga2V5IGV2ZW50IGlmCiAgICAgICAgIC8vIDEuIGl0IGlzIGEgc3lzdGVtIGtleTsgb3IKICAgICAgICAgLy8gMi4gdGhlIGhvc3QgYXBwbGljYXRpb24gd2FudHMgdG8gaGFuZGxlIGl0OworICAgICAgICAvLyAzLiB0aGUgYWNjZXNzaWJpbGl0eSBpbmplY3RvciBpcyBwcmVzZW50IGFuZCB3YW50cyB0byBoYW5kbGUgaXQ7CiAgICAgICAgIGlmIChldmVudC5pc1N5c3RlbSgpCi0gICAgICAgICAgICAgICAgfHwgbUNhbGxiYWNrUHJveHkudWlPdmVycmlkZUtleUV2ZW50KGV2ZW50KSkgeworICAgICAgICAgICAgICAgIHx8IG1DYWxsYmFja1Byb3h5LnVpT3ZlcnJpZGVLZXlFdmVudChldmVudCkKKyAgICAgICAgICAgICAgICB8fCAobUFjY2Vzc2liaWxpdHlJbmplY3RvciAhPSBudWxsICYmIG1BY2Nlc3NpYmlsaXR5SW5qZWN0b3Iub25LZXlFdmVudChldmVudCkpKSB7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoa2V5Q29kZSA9PSBLZXlFdmVudC5LRVlDT0RFX1NISUZUX0xFRlQKICAgICAgICAgICAgICAgICB8fCBrZXlDb2RlID09IEtleUV2ZW50LktFWUNPREVfU0hJRlRfUklHSFQpIHsKLSAgICAgICAgICAgIGlmIChuYXRpdmVGb2N1c0lzUGx1Z2luKCkpIHsKKyAgICAgICAgICAgIGlmIChuYXRpdmVQYWdlU2hvdWxkSGFuZGxlU2hpZnRBbmRBcnJvd3MoKSkgewogICAgICAgICAgICAgICAgIG1TaGlmdElzUHJlc3NlZCA9IHRydWU7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKCFuYXRpdmVDdXJzb3JXYW50c0tleUV2ZW50cygpICYmICFtU2VsZWN0aW5nVGV4dCkgewogICAgICAgICAgICAgICAgIHNldFVwU2VsZWN0KCk7CkBAIC0zODYzLDggKzM4OTksOCBAQAogICAgICAgICBpZiAoa2V5Q29kZSA+PSBLZXlFdmVudC5LRVlDT0RFX0RQQURfVVAKICAgICAgICAgICAgICAgICAmJiBrZXlDb2RlIDw9IEtleUV2ZW50LktFWUNPREVfRFBBRF9SSUdIVCkgewogICAgICAgICAgICAgc3dpdGNoT3V0RHJhd0hpc3RvcnkoKTsKLSAgICAgICAgICAgIGlmIChuYXRpdmVGb2N1c0lzUGx1Z2luKCkpIHsKLSAgICAgICAgICAgICAgICBsZXRQbHVnaW5IYW5kbGVOYXZLZXkoa2V5Q29kZSwgZXZlbnQuZ2V0RXZlbnRUaW1lKCksIHRydWUpOworICAgICAgICAgICAgaWYgKG5hdGl2ZVBhZ2VTaG91bGRIYW5kbGVTaGlmdEFuZEFycm93cygpKSB7CisgICAgICAgICAgICAgICAgbGV0UGFnZUhhbmRsZU5hdktleShrZXlDb2RlLCBldmVudC5nZXRFdmVudFRpbWUoKSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAobVNlbGVjdGluZ1RleHQpIHsKQEAgLTM5ODgsMTMgKzQwMjQsMTYgQEAKICAgICAgICAgLy8gQnViYmxlIHVwIHRoZSBrZXkgZXZlbnQgaWYKICAgICAgICAgLy8gMS4gaXQgaXMgYSBzeXN0ZW0ga2V5OyBvcgogICAgICAgICAvLyAyLiB0aGUgaG9zdCBhcHBsaWNhdGlvbiB3YW50cyB0byBoYW5kbGUgaXQ7Ci0gICAgICAgIGlmIChldmVudC5pc1N5c3RlbSgpIHx8IG1DYWxsYmFja1Byb3h5LnVpT3ZlcnJpZGVLZXlFdmVudChldmVudCkpIHsKKyAgICAgICAgLy8gMy4gdGhlIGFjY2Vzc2liaWxpdHkgaW5qZWN0b3IgaXMgcHJlc2VudCBhbmQgd2FudHMgdG8gaGFuZGxlIGl0OworICAgICAgICBpZiAoZXZlbnQuaXNTeXN0ZW0oKQorICAgICAgICAgICAgICAgIHx8IG1DYWxsYmFja1Byb3h5LnVpT3ZlcnJpZGVLZXlFdmVudChldmVudCkKKyAgICAgICAgICAgICAgICB8fCAobUFjY2Vzc2liaWxpdHlJbmplY3RvciAhPSBudWxsICYmIG1BY2Nlc3NpYmlsaXR5SW5qZWN0b3Iub25LZXlFdmVudChldmVudCkpKSB7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoa2V5Q29kZSA9PSBLZXlFdmVudC5LRVlDT0RFX1NISUZUX0xFRlQKICAgICAgICAgICAgICAgICB8fCBrZXlDb2RlID09IEtleUV2ZW50LktFWUNPREVfU0hJRlRfUklHSFQpIHsKLSAgICAgICAgICAgIGlmIChuYXRpdmVGb2N1c0lzUGx1Z2luKCkpIHsKKyAgICAgICAgICAgIGlmIChuYXRpdmVQYWdlU2hvdWxkSGFuZGxlU2hpZnRBbmRBcnJvd3MoKSkgewogICAgICAgICAgICAgICAgIG1TaGlmdElzUHJlc3NlZCA9IGZhbHNlOwogICAgICAgICAgICAgfSBlbHNlIGlmIChjb3B5U2VsZWN0aW9uKCkpIHsKICAgICAgICAgICAgICAgICBzZWxlY3Rpb25Eb25lKCk7CkBAIC00MDA0LDggKzQwNDMsOCBAQAogCiAgICAgICAgIGlmIChrZXlDb2RlID49IEtleUV2ZW50LktFWUNPREVfRFBBRF9VUAogICAgICAgICAgICAgICAgICYmIGtleUNvZGUgPD0gS2V5RXZlbnQuS0VZQ09ERV9EUEFEX1JJR0hUKSB7Ci0gICAgICAgICAgICBpZiAobmF0aXZlRm9jdXNJc1BsdWdpbigpKSB7Ci0gICAgICAgICAgICAgICAgbGV0UGx1Z2luSGFuZGxlTmF2S2V5KGtleUNvZGUsIGV2ZW50LmdldEV2ZW50VGltZSgpLCBmYWxzZSk7CisgICAgICAgICAgICBpZiAobmF0aXZlUGFnZVNob3VsZEhhbmRsZVNoaWZ0QW5kQXJyb3dzKCkpIHsKKyAgICAgICAgICAgICAgICBsZXRQYWdlSGFuZGxlTmF2S2V5KGtleUNvZGUsIGV2ZW50LmdldEV2ZW50VGltZSgpLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBhbHdheXMgaGFuZGxlIHRoZSBuYXZpZ2F0aW9uIGtleXMgaW4gdGhlIFVJIHRocmVhZApAQCAtNDA0OCw3ICs0MDg3LDcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBjbGVhclRleHRFbnRyeSh0cnVlKTsKKyAgICAgICAgICAgIGNsZWFyVGV4dEVudHJ5KCk7CiAgICAgICAgICAgICBuYXRpdmVTZXRGb2xsb3dlZExpbmsodHJ1ZSk7CiAgICAgICAgICAgICBpZiAoIW1DYWxsYmFja1Byb3h5LnVpT3ZlcnJpZGVVcmxMb2FkaW5nKG5hdGl2ZUN1cnNvclRleHQoKSkpIHsKICAgICAgICAgICAgICAgICBtV2ViVmlld0NvcmUuc2VuZE1lc3NhZ2UoRXZlbnRIdWIuQ0xJQ0ssIGRhdGEubUZyYW1lLApAQCAtNDE1NiwxMyArNDE5NSw5IEBACiAgICAgICAgICAgICAgICAgICAgICwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcudGV4dF9jb3BpZWQKICAgICAgICAgICAgICAgICAgICAgLCBUb2FzdC5MRU5HVEhfU0hPUlQpLnNob3coKTsKICAgICAgICAgICAgIGNvcGllZFNvbWV0aGluZyA9IHRydWU7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIElDbGlwYm9hcmQgY2xpcCA9IElDbGlwYm9hcmQuU3R1Yi5hc0ludGVyZmFjZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIFNlcnZpY2VNYW5hZ2VyLmdldFNlcnZpY2UoImNsaXBib2FyZCIpKTsKLSAgICAgICAgICAgICAgICBjbGlwLnNldENsaXBib2FyZFRleHQoc2VsZWN0aW9uKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBMb2cuZShMT0dUQUcsICJDbGlwYm9hcmQgZmFpbGVkIiwgZSk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBDbGlwYm9hcmRNYW5hZ2VyIGNtID0gKENsaXBib2FyZE1hbmFnZXIpZ2V0Q29udGV4dCgpCisgICAgICAgICAgICAgICAgICAgIC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuQ0xJUEJPQVJEX1NFUlZJQ0UpOworICAgICAgICAgICAgY20uc2V0VGV4dChzZWxlY3Rpb24pOwogICAgICAgICB9CiAgICAgICAgIGludmFsaWRhdGUoKTsgLy8gcmVtb3ZlIHNlbGVjdGlvbiByZWdpb24gYW5kIHBvaW50ZXIKICAgICAgICAgcmV0dXJuIGNvcGllZFNvbWV0aGluZzsKQEAgLTQxODQsMTIgKzQyMTksMjIgQEAKIAogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIG9uRGV0YWNoZWRGcm9tV2luZG93KCkgewotICAgICAgICBjbGVhclRleHRFbnRyeShmYWxzZSk7Ci0gICAgICAgIGRpc21pc3Nab29tQ29udHJvbCgpOworICAgICAgICBjbGVhclRleHRFbnRyeSgpOworICAgICAgICBtWm9vbU1hbmFnZXIuZGlzbWlzc1pvb21QaWNrZXIoKTsKICAgICAgICAgaWYgKGhhc1dpbmRvd0ZvY3VzKCkpIHNldEFjdGl2ZShmYWxzZSk7CiAgICAgICAgIHN1cGVyLm9uRGV0YWNoZWRGcm9tV2luZG93KCk7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25WaXNpYmlsaXR5Q2hhbmdlZChWaWV3IGNoYW5nZWRWaWV3LCBpbnQgdmlzaWJpbGl0eSkgeworICAgICAgICBzdXBlci5vblZpc2liaWxpdHlDaGFuZ2VkKGNoYW5nZWRWaWV3LCB2aXNpYmlsaXR5KTsKKyAgICAgICAgLy8gVGhlIHpvb21NYW5hZ2VyIG1heSBiZSBudWxsIGlmIHRoZSB3ZWJ2aWV3IGlzIGNyZWF0ZWQgZnJvbSBYTUwgdGhhdAorICAgICAgICAvLyBzcGVjaWZpZXMgdGhlIHZpZXcncyB2aXNpYmlsaXR5IHBhcmFtIGFzIG5vdCB2aXNpYmxlIChzZWUgaHR0cDovL2IvMjc5NDg0MSkKKyAgICAgICAgaWYgKHZpc2liaWxpdHkgIT0gVmlldy5WSVNJQkxFICYmIG1ab29tTWFuYWdlciAhPSBudWxsKSB7CisgICAgICAgICAgICBtWm9vbU1hbmFnZXIuZGlzbWlzc1pvb21QaWNrZXIoKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIC8qKgogICAgICAqIEBkZXByZWNhdGVkIFdlYlZpZXcgbm8gbG9uZ2VyIG5lZWRzIHRvIGltcGxlbWVudAogICAgICAqIFZpZXdHcm91cC5PbkhpZXJhcmNoeUNoYW5nZUxpc3RlbmVyLiAgVGhpcyBtZXRob2QgZG9lcyBub3RoaW5nIG5vdy4KQEAgLTQyMTksMzIgKzQyNjQsMzAgQEAKICAgICAgICAgICAgICAgICAvLyBJZiBvdXIgd2luZG93IHJlZ2FpbmVkIGZvY3VzLCBhbmQgd2UgaGF2ZSBmb2N1cywgdGhlbiBiZWdpbgogICAgICAgICAgICAgICAgIC8vIGRyYXdpbmcgdGhlIGN1cnNvciByaW5nCiAgICAgICAgICAgICAgICAgbURyYXdDdXJzb3JSaW5nID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBzZXRGb2N1c0NvbnRyb2xsZXJBY3RpdmUodHJ1ZSk7CiAgICAgICAgICAgICAgICAgaWYgKG1OYXRpdmVDbGFzcyAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZVJlY29yZEJ1dHRvbnModHJ1ZSwgZmFsc2UsIHRydWUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoaW5FZGl0aW5nTW9kZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtV2ViVmlld0NvcmUuc2VuZE1lc3NhZ2UoRXZlbnRIdWIuU0VUX0FDVElWRSwgMSwgMCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIElmIG91ciB3aW5kb3cgZ2FpbmVkIGZvY3VzLCBidXQgd2UgZG8gbm90IGhhdmUgaXQsIGRvIG5vdAotICAgICAgICAgICAgICAgIC8vIGRyYXcgdGhlIGN1cnNvciByaW5nLgotICAgICAgICAgICAgICAgIG1EcmF3Q3Vyc29yUmluZyA9IGZhbHNlOworICAgICAgICAgICAgICAgIGlmICghaW5FZGl0aW5nTW9kZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIElmIG91ciB3aW5kb3cgZ2FpbmVkIGZvY3VzLCBidXQgd2UgZG8gbm90IGhhdmUgaXQsIGRvIG5vdAorICAgICAgICAgICAgICAgICAgICAvLyBkcmF3IHRoZSBjdXJzb3IgcmluZy4KKyAgICAgICAgICAgICAgICAgICAgbURyYXdDdXJzb3JSaW5nID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIHNldEZvY3VzQ29udHJvbGxlckFjdGl2ZShmYWxzZSk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIC8vIFdlIGRvIG5vdCBjYWxsIG5hdGl2ZVJlY29yZEJ1dHRvbnMgaGVyZSBiZWNhdXNlIHdlIGFzc3VtZQogICAgICAgICAgICAgICAgIC8vIHRoYXQgd2hlbiB3ZSBsb3N0IGZvY3VzLCBvciB3aW5kb3cgZm9jdXMsIGl0IGdvdCBjYWxsZWQgd2l0aAogICAgICAgICAgICAgICAgIC8vIGZhbHNlIGZvciB0aGUgZmlyc3QgcGFyYW1ldGVyCiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAobVdlYlZpZXdDb3JlICE9IG51bGwgJiYgZ2V0U2V0dGluZ3MoKS5nZXRCdWlsdEluWm9vbUNvbnRyb2xzKCkKLSAgICAgICAgICAgICAgICAgICAgJiYgKG1ab29tQnV0dG9uc0NvbnRyb2xsZXIgPT0gbnVsbCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICFtWm9vbUJ1dHRvbnNDb250cm9sbGVyLmlzVmlzaWJsZSgpKSkgeworICAgICAgICAgICAgaWYgKCFtWm9vbU1hbmFnZXIuaXNab29tUGlja2VyVmlzaWJsZSgpKSB7CiAgICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgKiBUaGUgem9vbSBjb250cm9scyBjb21lIGluIHRoZWlyIG93biB3aW5kb3csIHNvIG91ciB3aW5kb3cKLSAgICAgICAgICAgICAgICAgKiBsb3NlcyBmb2N1cy4gT3VyIHBvbGljeSBpcyB0byBub3QgZHJhdyB0aGUgY3Vyc29yIHJpbmcgaWYKLSAgICAgICAgICAgICAgICAgKiBvdXIgd2luZG93IGlzIG5vdCBmb2N1c2VkLCBidXQgdGhpcyBpcyBhbiBleGNlcHRpb24gc2luY2UKKyAgICAgICAgICAgICAgICAgKiBUaGUgZXh0ZXJuYWwgem9vbSBjb250cm9scyBjb21lIGluIHRoZWlyIG93biB3aW5kb3csIHNvIG91cgorICAgICAgICAgICAgICAgICAqIHdpbmRvdyBsb3NlcyBmb2N1cy4gT3VyIHBvbGljeSBpcyB0byBub3QgZHJhdyB0aGUgY3Vyc29yIHJpbmcKKyAgICAgICAgICAgICAgICAgKiBpZiBvdXIgd2luZG93IGlzIG5vdCBmb2N1c2VkLCBidXQgdGhpcyBpcyBhbiBleGNlcHRpb24gc2luY2UKICAgICAgICAgICAgICAgICAgKiB0aGUgdXNlciBjYW4gc3RpbGwgbmF2aWdhdGUgdGhlIHdlYiBwYWdlIHdpdGggdGhlIHpvb20KICAgICAgICAgICAgICAgICAgKiBjb250cm9scyBzaG93aW5nLgogICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIC8vIElmIG91ciB3aW5kb3cgaGFzIGxvc3QgZm9jdXMsIHN0b3AgZHJhd2luZyB0aGUgY3Vyc29yIHJpbmcKICAgICAgICAgICAgICAgICBtRHJhd0N1cnNvclJpbmcgPSBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1Hb3RLZXlEb3duID0gZmFsc2U7CkBAIC00MjU0LDcgKzQyOTcsNyBAQAogICAgICAgICAgICAgaWYgKG1OYXRpdmVDbGFzcyAhPSAwKSB7CiAgICAgICAgICAgICAgICAgbmF0aXZlUmVjb3JkQnV0dG9ucyhmYWxzZSwgZmFsc2UsIHRydWUpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Rm9jdXNDb250cm9sbGVySW5hY3RpdmUoKTsKKyAgICAgICAgICAgIHNldEZvY3VzQ29udHJvbGxlckFjdGl2ZShmYWxzZSk7CiAgICAgICAgIH0KICAgICAgICAgaW52YWxpZGF0ZSgpOwogICAgIH0KQEAgLTQyNjUsOSArNDMwOCw5IEBACiAgICAgcHVibGljIHZvaWQgb25XaW5kb3dGb2N1c0NoYW5nZWQoYm9vbGVhbiBoYXNXaW5kb3dGb2N1cykgewogICAgICAgICBzZXRBY3RpdmUoaGFzV2luZG93Rm9jdXMpOwogICAgICAgICBpZiAoaGFzV2luZG93Rm9jdXMpIHsKLSAgICAgICAgICAgIEJyb3dzZXJGcmFtZS5zSmF2YUJyaWRnZS5zZXRBY3RpdmVXZWJWaWV3KHRoaXMpOworICAgICAgICAgICAgSldlYkNvcmVKYXZhQnJpZGdlLnNldEFjdGl2ZVdlYlZpZXcodGhpcyk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBCcm93c2VyRnJhbWUuc0phdmFCcmlkZ2UucmVtb3ZlQWN0aXZlV2ViVmlldyh0aGlzKTsKKyAgICAgICAgICAgIEpXZWJDb3JlSmF2YUJyaWRnZS5yZW1vdmVBY3RpdmVXZWJWaWV3KHRoaXMpOwogICAgICAgICB9CiAgICAgICAgIHN1cGVyLm9uV2luZG93Rm9jdXNDaGFuZ2VkKGhhc1dpbmRvd0ZvY3VzKTsKICAgICB9CkBAIC00Mjc4LDExICs0MzIxLDkgQEAKICAgICAgKiBub3QgZHJhdyB0aGUgYmxpbmtpbmcgY3Vyc29yLiAgSXQgZ2V0cyBzZXQgdG8gImFjdGl2ZSIgdG8gZHJhdyB0aGUgY3Vyc29yCiAgICAgICogaW4gV2ViVmlld0NvcmUuY3BwLCB3aGVuIHRoZSBXZWJDb3JlIHRocmVhZCByZWNlaXZlcyBrZXkgZXZlbnRzL2NsaWNrcy4KICAgICAgKi8KLSAgICAvKiBwYWNrYWdlICovIHZvaWQgc2V0Rm9jdXNDb250cm9sbGVySW5hY3RpdmUoKSB7Ci0gICAgICAgIC8vIERvIG5vdCBuZWVkIHRvIGFsc28gY2hlY2sgd2hldGhlciBtV2ViVmlld0NvcmUgaXMgbnVsbCwgYmVjYXVzZQotICAgICAgICAvLyBtTmF0aXZlQ2xhc3MgaXMgb25seSBzZXQgaWYgbVdlYlZpZXdDb3JlIGlzIG5vbiBudWxsCi0gICAgICAgIGlmIChtTmF0aXZlQ2xhc3MgPT0gMCkgcmV0dXJuOwotICAgICAgICBtV2ViVmlld0NvcmUuc2VuZE1lc3NhZ2UoRXZlbnRIdWIuU0VUX0FDVElWRSwgMCwgMCk7CisgICAgLyogcGFja2FnZSAqLyB2b2lkIHNldEZvY3VzQ29udHJvbGxlckFjdGl2ZShib29sZWFuIGFjdGl2ZSkgeworICAgICAgICBpZiAobVdlYlZpZXdDb3JlID09IG51bGwpIHJldHVybjsKKyAgICAgICAgbVdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlKEV2ZW50SHViLlNFVF9BQ1RJVkUsIGFjdGl2ZSA/IDEgOiAwLCAwKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTQyOTksNiArNDM0MCw3IEBACiAgICAgICAgICAgICAgICAgaWYgKG1OYXRpdmVDbGFzcyAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZVJlY29yZEJ1dHRvbnModHJ1ZSwgZmFsc2UsIHRydWUpOwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzZXRGb2N1c0NvbnRyb2xsZXJBY3RpdmUodHJ1ZSk7CiAgICAgICAgICAgICAvL30gZWxzZSB7CiAgICAgICAgICAgICAgICAgLy8gVGhlIFdlYlZpZXcgaGFzIGdhaW5lZCBmb2N1cyB3aGlsZSB3ZSBkbyBub3QgaGF2ZQogICAgICAgICAgICAgICAgIC8vIHdpbmRvd2ZvY3VzLiAgV2hlbiBvdXIgd2luZG93IGxvc3QgZm9jdXMsIHdlIHNob3VsZCBoYXZlCkBAIC00MzEyLDcgKzQzNTQsNyBAQAogICAgICAgICAgICAgICAgIGlmIChtTmF0aXZlQ2xhc3MgIT0gMCkgewogICAgICAgICAgICAgICAgICAgICBuYXRpdmVSZWNvcmRCdXR0b25zKGZhbHNlLCBmYWxzZSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNldEZvY3VzQ29udHJvbGxlckluYWN0aXZlKCk7CisgICAgICAgICAgICAgICAgc2V0Rm9jdXNDb250cm9sbGVyQWN0aXZlKGZhbHNlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1Hb3RLZXlEb3duID0gZmFsc2U7CiAgICAgICAgIH0KQEAgLTQzMzMsODEgKzQzNzUsMjQgQEAKICAgICAgICAgICAgIC8vIHN5c3RlbSB3b24ndCBjYWxsIG9uU2l6ZUNoYW5nZWQgaWYgdGhlIGRpbWVuc2lvbiBpcyBub3QgY2hhbmdlZC4KICAgICAgICAgICAgIC8vIEluIHRoaXMgY2FzZSwgd2UgbmVlZCB0byBjYWxsIHNlbmRWaWV3U2l6ZVpvb20oKSBleHBsaWNpdGx5IHRvCiAgICAgICAgICAgICAvLyBub3RpZnkgdGhlIFdlYktpdCBhYm91dCB0aGUgbmV3IGRpbWVuc2lvbnMuCi0gICAgICAgICAgICBzZW5kVmlld1NpemVab29tKCk7CisgICAgICAgICAgICBzZW5kVmlld1NpemVab29tKGZhbHNlKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gY2hhbmdlZDsKICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBQb3N0U2NhbGUgaW1wbGVtZW50cyBSdW5uYWJsZSB7Ci0gICAgICAgIGZpbmFsIFdlYlZpZXcgbVdlYlZpZXc7Ci0gICAgICAgIGZpbmFsIGJvb2xlYW4gbVVwZGF0ZVRleHRXcmFwOwotCi0gICAgICAgIHB1YmxpYyBQb3N0U2NhbGUoV2ViVmlldyB3ZWJWaWV3LCBib29sZWFuIHVwZGF0ZVRleHRXcmFwKSB7Ci0gICAgICAgICAgICBtV2ViVmlldyA9IHdlYlZpZXc7Ci0gICAgICAgICAgICBtVXBkYXRlVGV4dFdyYXAgPSB1cGRhdGVUZXh0V3JhcDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgIGlmIChtV2ViVmlldy5tV2ViVmlld0NvcmUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIHdlIGFsd2F5cyBmb3JjZSwgaW4gY2FzZSBvdXIgaGVpZ2h0IGNoYW5nZWQsIGluIHdoaWNoIGNhc2Ugd2UKLSAgICAgICAgICAgICAgICAvLyBzdGlsbCB3YW50IHRvIHNlbmQgdGhlIG5vdGlmaWNhdGlvbiBvdmVyIHRvIHdlYmtpdC4KLSAgICAgICAgICAgICAgICBtV2ViVmlldy5zZXROZXdab29tU2NhbGUobVdlYlZpZXcubUFjdHVhbFNjYWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgbVVwZGF0ZVRleHRXcmFwLCB0cnVlKTsKLSAgICAgICAgICAgICAgICAvLyB1cGRhdGUgdGhlIHpvb20gYnV0dG9ucyBhcyB0aGUgc2NhbGUgY2FuIGJlIGNoYW5nZWQKLSAgICAgICAgICAgICAgICBpZiAobVdlYlZpZXcuZ2V0U2V0dGluZ3MoKS5nZXRCdWlsdEluWm9vbUNvbnRyb2xzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbVdlYlZpZXcudXBkYXRlWm9vbUJ1dHRvbnNFbmFibGVkKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgb25TaXplQ2hhbmdlZChpbnQgdywgaW50IGgsIGludCBvdywgaW50IG9oKSB7CiAgICAgICAgIHN1cGVyLm9uU2l6ZUNoYW5nZWQodywgaCwgb3csIG9oKTsKLSAgICAgICAgLy8gQ2VudGVyIHpvb21pbmcgdG8gdGhlIGNlbnRlciBvZiB0aGUgc2NyZWVuLgotICAgICAgICBpZiAobVpvb21TY2FsZSA9PSAwKSB7IC8vIHVubGVzcyB3ZSdyZSBhbHJlYWR5IHpvb21pbmcKLSAgICAgICAgICAgIC8vIFRvIGFuY2hvciBhdCB0b3AgbGVmdCBjb3JuZXIuCi0gICAgICAgICAgICBtWm9vbUNlbnRlclggPSAwOwotICAgICAgICAgICAgbVpvb21DZW50ZXJZID0gZ2V0VmlzaWJsZVRpdGxlSGVpZ2h0KCk7Ci0gICAgICAgICAgICBtQW5jaG9yWCA9IHZpZXdUb0NvbnRlbnRYKChpbnQpIG1ab29tQ2VudGVyWCArIG1TY3JvbGxYKTsKLSAgICAgICAgICAgIG1BbmNob3JZID0gdmlld1RvQ29udGVudFkoKGludCkgbVpvb21DZW50ZXJZICsgbVNjcm9sbFkpOwotICAgICAgICB9CiAKICAgICAgICAgLy8gYWRqdXN0IHRoZSBtYXggdmlld3BvcnQgd2lkdGggZGVwZW5kaW5nIG9uIHRoZSB2aWV3IGRpbWVuc2lvbnMuIFRoaXMKICAgICAgICAgLy8gaXMgdG8gZW5zdXJlIHRoZSBzY2FsaW5nIGlzIG5vdCBnb2luZyBpbnNhbmUuIFNvIGRvIG5vdCBzaHJpbmsgaXQgaWYKICAgICAgICAgLy8gdGhlIHZpZXcgc2l6ZSBpcyB0ZW1wb3JhcmlseSBzbWFsbGVyLCBlLmcuIHdoZW4gc29mdCBrZXlib2FyZCBpcyB1cC4KLSAgICAgICAgaW50IG5ld01heFZpZXdwb3J0V2lkdGggPSAoaW50KSAoTWF0aC5tYXgodywgaCkgLyBERUZBVUxUX01JTl9aT09NX1NDQUxFKTsKKyAgICAgICAgaW50IG5ld01heFZpZXdwb3J0V2lkdGggPSAoaW50KSAoTWF0aC5tYXgodywgaCkgLyBtWm9vbU1hbmFnZXIuZ2V0RGVmYXVsdE1pblpvb21TY2FsZSgpKTsKICAgICAgICAgaWYgKG5ld01heFZpZXdwb3J0V2lkdGggPiBzTWF4Vmlld3BvcnRXaWR0aCkgewogICAgICAgICAgICAgc01heFZpZXdwb3J0V2lkdGggPSBuZXdNYXhWaWV3cG9ydFdpZHRoOwogICAgICAgICB9CiAKLSAgICAgICAgLy8gdXBkYXRlIG1NaW5ab29tU2NhbGUgaWYgdGhlIG1pbmltdW0gem9vbSBzY2FsZSBpcyBub3QgZml4ZWQKLSAgICAgICAgaWYgKCFtTWluWm9vbVNjYWxlRml4ZWQpIHsKLSAgICAgICAgICAgIC8vIHdoZW4gY2hhbmdlIGZyb20gbmFycm93IHNjcmVlbiB0byB3aWRlIHNjcmVlbiwgdGhlIG5ldyB2aWV3V2lkdGgKLSAgICAgICAgICAgIC8vIGNhbiBiZSB3aWRlciB0aGFuIHRoZSBvbGQgY29udGVudCB3aWR0aC4gV2UgbGltaXQgdGhlIG1pbmltdW0KLSAgICAgICAgICAgIC8vIHNjYWxlIHRvIDEuMGYuIFRoZSBwcm9wZXIgbWluaW11bSBzY2FsZSB3aWxsIGJlIGNhbGN1bGF0ZWQgd2hlbgotICAgICAgICAgICAgLy8gdGhlIG5ldyBwaWN0dXJlIHNob3dzIHVwLgotICAgICAgICAgICAgbU1pblpvb21TY2FsZSA9IE1hdGgubWluKDEuMGYsIChmbG9hdCkgZ2V0Vmlld1dpZHRoKCkKLSAgICAgICAgICAgICAgICAgICAgLyAobURyYXdIaXN0b3J5ID8gbUhpc3RvcnlQaWN0dXJlLmdldFdpZHRoKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG1ab29tT3ZlcnZpZXdXaWR0aCkpOwotICAgICAgICAgICAgaWYgKG1Jbml0aWFsU2NhbGVJblBlcmNlbnQgPiAwKSB7Ci0gICAgICAgICAgICAgICAgLy8gbGltaXQgdGhlIG1pblpvb21TY2FsZSB0byB0aGUgaW5pdGlhbFNjYWxlIGlmIGl0IGlzIHNldAotICAgICAgICAgICAgICAgIGZsb2F0IGluaXRpYWxTY2FsZSA9IG1Jbml0aWFsU2NhbGVJblBlcmNlbnQgLyAxMDAuMGY7Ci0gICAgICAgICAgICAgICAgaWYgKG1NaW5ab29tU2NhbGUgPiBpbml0aWFsU2NhbGUpIHsKLSAgICAgICAgICAgICAgICAgICAgbU1pblpvb21TY2FsZSA9IGluaXRpYWxTY2FsZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBkaXNtaXNzWm9vbUNvbnRyb2woKTsKLQotICAgICAgICAvLyBvblNpemVDaGFuZ2VkKCkgaXMgY2FsbGVkIGR1cmluZyBXZWJWaWV3IGxheW91dC4gQW5kIGFueQotICAgICAgICAvLyByZXF1ZXN0TGF5b3V0KCkgaXMgYmxvY2tlZCBkdXJpbmcgbGF5b3V0LiBBcyBzZXROZXdab29tU2NhbGUoKSB3aWxsCi0gICAgICAgIC8vIGNhbGwgaXRzIGNoaWxkIFZpZXcgdG8gcmVwb3NpdGlvbiBpdHNlbGYgdGhyb3VnaCBWaWV3TWFuYWdlcidzCi0gICAgICAgIC8vIHNjYWxlQWxsKCksIHdlIG5lZWQgdG8gcG9zdCBhIFJ1bm5hYmxlIHRvIGVuc3VyZSByZXF1ZXN0TGF5b3V0KCkuCi0gICAgICAgIC8vIDxiLz4KLSAgICAgICAgLy8gb25seSB1cGRhdGUgdGhlIHRleHQgd3JhcCBzY2FsZSBpZiB3aWR0aCBjaGFuZ2VkLgotICAgICAgICBwb3N0KG5ldyBQb3N0U2NhbGUodGhpcywgdyAhPSBvdykpOworICAgICAgICBtWm9vbU1hbmFnZXIub25TaXplQ2hhbmdlZCh3LCBoLCBvdywgb2gpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtNDQxOCw3ICs0NDAzLDcgQEAKICAgICAgICAgLy8gYXMgZ2V0VmlzaWJsZVRpdGxlSGVpZ2h0LgogICAgICAgICBpbnQgdGl0bGVIZWlnaHQgPSBnZXRUaXRsZUhlaWdodCgpOwogICAgICAgICBpZiAoTWF0aC5tYXgodGl0bGVIZWlnaHQgLSB0LCAwKSAhPSBNYXRoLm1heCh0aXRsZUhlaWdodCAtIG9sZHQsIDApKSB7Ci0gICAgICAgICAgICBzZW5kVmlld1NpemVab29tKCk7CisgICAgICAgICAgICBzZW5kVmlld1NpemVab29tKGZhbHNlKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtNDQyNiw5ICs0NDExLDExIEBACiAgICAgcHVibGljIGJvb2xlYW4gZGlzcGF0Y2hLZXlFdmVudChLZXlFdmVudCBldmVudCkgewogICAgICAgICBib29sZWFuIGRpc3BhdGNoID0gdHJ1ZTsKIAotICAgICAgICAvLyBUZXh0ZmllbGRzIGFuZCBwbHVnaW5zIG5lZWQgdG8gcmVjZWl2ZSB0aGUgc2hpZnQgdXAga2V5IGV2ZW4gaWYKLSAgICAgICAgLy8gYW5vdGhlciBrZXkgd2FzIHJlbGVhc2VkIHdoaWxlIHRoZSBzaGlmdCBrZXkgd2FzIGhlbGQgZG93bi4KLSAgICAgICAgaWYgKCFpbkVkaXRpbmdNb2RlKCkgJiYgKG1OYXRpdmVDbGFzcyA9PSAwIHx8ICFuYXRpdmVGb2N1c0lzUGx1Z2luKCkpKSB7CisgICAgICAgIC8vIFRleHRmaWVsZHMsIHBsdWdpbnMsIGFuZCBjb250ZW50RWRpdGFibGUgbm9kZXMgbmVlZCB0byByZWNlaXZlIHRoZQorICAgICAgICAvLyBzaGlmdCB1cCBrZXkgZXZlbiBpZiBhbm90aGVyIGtleSB3YXMgcmVsZWFzZWQgd2hpbGUgdGhlIHNoaWZ0IGtleQorICAgICAgICAvLyB3YXMgaGVsZCBkb3duLgorICAgICAgICBpZiAoIWluRWRpdGluZ01vZGUoKSAmJiAobU5hdGl2ZUNsYXNzID09IDAKKyAgICAgICAgICAgICAgICB8fCAhbmF0aXZlUGFnZVNob3VsZEhhbmRsZVNoaWZ0QW5kQXJyb3dzKCkpKSB7CiAgICAgICAgICAgICBpZiAoZXZlbnQuZ2V0QWN0aW9uKCkgPT0gS2V5RXZlbnQuQUNUSU9OX0RPV04pIHsKICAgICAgICAgICAgICAgICBtR290S2V5RG93biA9IHRydWU7CiAgICAgICAgICAgICB9IGVsc2UgewpAQCAtNDY2Miw4MSArNDY0OSw2IEBACiAgICAgcHJpdmF0ZSBEcmFnVHJhY2tlciBtRHJhZ1RyYWNrZXI7CiAgICAgcHJpdmF0ZSBEcmFnVHJhY2tlckhhbmRsZXIgbURyYWdUcmFja2VySGFuZGxlcjsKIAotICAgIHByaXZhdGUgY2xhc3MgU2NhbGVEZXRlY3Rvckxpc3RlbmVyIGltcGxlbWVudHMKLSAgICAgICAgICAgIFNjYWxlR2VzdHVyZURldGVjdG9yLk9uU2NhbGVHZXN0dXJlTGlzdGVuZXIgewotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIG9uU2NhbGVCZWdpbihTY2FsZUdlc3R1cmVEZXRlY3RvciBkZXRlY3RvcikgewotICAgICAgICAgICAgLy8gY2FuY2VsIHRoZSBzaW5nbGUgdG91Y2ggaGFuZGxpbmcKLSAgICAgICAgICAgIGNhbmNlbFRvdWNoKCk7Ci0gICAgICAgICAgICBkaXNtaXNzWm9vbUNvbnRyb2woKTsKLSAgICAgICAgICAgIC8vIHJlc2V0IHRoZSB6b29tIG92ZXJ2aWV3IG1vZGUgc28gdGhhdCB0aGUgcGFnZSB3b24ndCBhdXRvIGdyb3cKLSAgICAgICAgICAgIG1Jblpvb21PdmVydmlldyA9IGZhbHNlOwotICAgICAgICAgICAgLy8gSWYgaXQgaXMgaW4gcGFzc3dvcmQgbW9kZSwgdHVybiBpdCBvZmYgc28gaXQgZG9lcyBub3QgZHJhdwotICAgICAgICAgICAgLy8gbWlzcGxhY2VkLgotICAgICAgICAgICAgaWYgKGluRWRpdGluZ01vZGUoKSAmJiBuYXRpdmVGb2N1c0NhbmRpZGF0ZUlzUGFzc3dvcmQoKSkgewotICAgICAgICAgICAgICAgIG1XZWJUZXh0Vmlldy5zZXRJblBhc3N3b3JkKGZhbHNlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbVZpZXdNYW5hZ2VyLnN0YXJ0Wm9vbSgpOwotCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU2NhbGVFbmQoU2NhbGVHZXN0dXJlRGV0ZWN0b3IgZGV0ZWN0b3IpIHsKLSAgICAgICAgICAgIGlmIChtUHJldmlld1pvb21Pbmx5KSB7Ci0gICAgICAgICAgICAgICAgbVByZXZpZXdab29tT25seSA9IGZhbHNlOwotICAgICAgICAgICAgICAgIG1BbmNob3JYID0gdmlld1RvQ29udGVudFgoKGludCkgbVpvb21DZW50ZXJYICsgbVNjcm9sbFgpOwotICAgICAgICAgICAgICAgIG1BbmNob3JZID0gdmlld1RvQ29udGVudFkoKGludCkgbVpvb21DZW50ZXJZICsgbVNjcm9sbFkpOwotICAgICAgICAgICAgICAgIC8vIGRvbid0IHJlZmxvdyB3aGVuIHpvb20gaW47IHdoZW4gem9vbSBvdXQsIGRvIHJlZmxvdyBpZiB0aGUKLSAgICAgICAgICAgICAgICAvLyBuZXcgc2NhbGUgaXMgYWxtb3N0IG1pbmltdW0gc2NhbGU7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiByZWZsb3dOb3cgPSAobUFjdHVhbFNjYWxlIC0gbU1pblpvb21TY2FsZQotICAgICAgICAgICAgICAgICAgICAgICAgPD0gTUlOSU1VTV9TQ0FMRV9JTkNSRU1FTlQpCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCAoKG1BY3R1YWxTY2FsZSA8PSAwLjggKiBtVGV4dFdyYXBTY2FsZSkpOwotICAgICAgICAgICAgICAgIC8vIGZvcmNlIHpvb20gYWZ0ZXIgbVByZXZpZXdab29tT25seSBpcyBzZXQgdG8gZmFsc2Ugc28gdGhhdCB0aGUKLSAgICAgICAgICAgICAgICAvLyBuZXcgdmlldyBzaXplIHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBXZWJLaXQKLSAgICAgICAgICAgICAgICBzZXROZXdab29tU2NhbGUobUFjdHVhbFNjYWxlLCByZWZsb3dOb3csIHRydWUpOwotICAgICAgICAgICAgICAgIC8vIGNhbGwgaW52YWxpZGF0ZSgpIHRvIGRyYXcgd2l0aG91dCB6b29tIGZpbHRlcgotICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIGFkanVzdCB0aGUgZWRpdCB0ZXh0IHZpZXcgaWYgbmVlZGVkCi0gICAgICAgICAgICBpZiAoaW5FZGl0aW5nTW9kZSgpICYmIGRpZFVwZGF0ZVRleHRWaWV3Qm91bmRzKGZhbHNlKQotICAgICAgICAgICAgICAgICAgICAmJiBuYXRpdmVGb2N1c0NhbmRpZGF0ZUlzUGFzc3dvcmQoKSkgewotICAgICAgICAgICAgICAgIC8vIElmIGl0IGlzIGEgcGFzc3dvcmQgZmllbGQsIHN0YXJ0IGRyYXdpbmcgdGhlCi0gICAgICAgICAgICAgICAgLy8gV2ViVGV4dFZpZXcgb25jZSBhZ2Fpbi4KLSAgICAgICAgICAgICAgICBtV2ViVGV4dFZpZXcuc2V0SW5QYXNzd29yZCh0cnVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIHN0YXJ0IGEgZHJhZywgVE9VQ0hfUElOQ0hfRFJBRywgY2FuJ3QgdXNlIFRPVUNIX0lOSVRfTU9ERSBhcyBpdAotICAgICAgICAgICAgLy8gbWF5IHRyaWdnZXIgdGhlIHVud2FudGVkIGNsaWNrLCBjYW4ndCB1c2UgVE9VQ0hfRFJBR19NT0RFIGFzIGl0Ci0gICAgICAgICAgICAvLyBtYXkgdHJpZ2dlciB0aGUgdW53YW50ZWQgZmxpbmcuCi0gICAgICAgICAgICBtVG91Y2hNb2RlID0gVE9VQ0hfUElOQ0hfRFJBRzsKLSAgICAgICAgICAgIG1Db25maXJtTW92ZSA9IHRydWU7Ci0gICAgICAgICAgICBzdGFydFRvdWNoKGRldGVjdG9yLmdldEZvY3VzWCgpLCBkZXRlY3Rvci5nZXRGb2N1c1koKSwKLSAgICAgICAgICAgICAgICAgICAgbUxhc3RUb3VjaFRpbWUpOwotCi0gICAgICAgICAgICBtVmlld01hbmFnZXIuZW5kWm9vbSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gb25TY2FsZShTY2FsZUdlc3R1cmVEZXRlY3RvciBkZXRlY3RvcikgewotICAgICAgICAgICAgZmxvYXQgc2NhbGUgPSAoZmxvYXQpIChNYXRoLnJvdW5kKGRldGVjdG9yLmdldFNjYWxlRmFjdG9yKCkKLSAgICAgICAgICAgICAgICAgICAgKiBtQWN0dWFsU2NhbGUgKiAxMDApIC8gMTAwLjApOwotICAgICAgICAgICAgaWYgKE1hdGguYWJzKHNjYWxlIC0gbUFjdHVhbFNjYWxlKSA+PSBNSU5JTVVNX1NDQUxFX0lOQ1JFTUVOVCkgewotICAgICAgICAgICAgICAgIG1QcmV2aWV3Wm9vbU9ubHkgPSB0cnVlOwotICAgICAgICAgICAgICAgIC8vIGxpbWl0IHRoZSBzY2FsZSBjaGFuZ2UgcGVyIHN0ZXAKLSAgICAgICAgICAgICAgICBpZiAoc2NhbGUgPiBtQWN0dWFsU2NhbGUpIHsKLSAgICAgICAgICAgICAgICAgICAgc2NhbGUgPSBNYXRoLm1pbihzY2FsZSwgbUFjdHVhbFNjYWxlICogMS4yNWYpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHNjYWxlID0gTWF0aC5tYXgoc2NhbGUsIG1BY3R1YWxTY2FsZSAqIDAuOGYpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtWm9vbUNlbnRlclggPSBkZXRlY3Rvci5nZXRGb2N1c1goKTsKLSAgICAgICAgICAgICAgICBtWm9vbUNlbnRlclkgPSBkZXRlY3Rvci5nZXRGb2N1c1koKTsKLSAgICAgICAgICAgICAgICBzZXROZXdab29tU2NhbGUoc2NhbGUsIGZhbHNlLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCiAgICAgcHJpdmF0ZSBib29sZWFuIGhpdEZvY3VzZWRQbHVnaW4oaW50IGNvbnRlbnRYLCBpbnQgY29udGVudFkpIHsKICAgICAgICAgaWYgKERlYnVnRmxhZ3MuV0VCX1ZJRVcpIHsKICAgICAgICAgICAgIExvZy52KExPR1RBRywgIm5hdGl2ZUZvY3VzSXNQbHVnaW4oKT0iICsgbmF0aXZlRm9jdXNJc1BsdWdpbigpKTsKQEAgLTQ3NTgsNiArNDY3MCw0MSBAQAogICAgICAgICByZXR1cm4gbUZ1bGxTY3JlZW5Ib2xkZXIgIT0gbnVsbDsKICAgICB9CiAKKyAgICB2b2lkIG9uUGluY2hUb1pvb21BbmltYXRpb25TdGFydCgpIHsKKyAgICAgICAgLy8gY2FuY2VsIHRoZSBzaW5nbGUgdG91Y2ggaGFuZGxpbmcKKyAgICAgICAgY2FuY2VsVG91Y2goKTsKKyAgICAgICAgb25ab29tQW5pbWF0aW9uU3RhcnQoKTsKKyAgICB9CisKKyAgICB2b2lkIG9uUGluY2hUb1pvb21BbmltYXRpb25FbmQoU2NhbGVHZXN0dXJlRGV0ZWN0b3IgZGV0ZWN0b3IpIHsKKyAgICAgICAgb25ab29tQW5pbWF0aW9uRW5kKCk7CisgICAgICAgIC8vIHN0YXJ0IGEgZHJhZywgVE9VQ0hfUElOQ0hfRFJBRywgY2FuJ3QgdXNlIFRPVUNIX0lOSVRfTU9ERSBhcworICAgICAgICAvLyBpdCBtYXkgdHJpZ2dlciB0aGUgdW53YW50ZWQgY2xpY2ssIGNhbid0IHVzZSBUT1VDSF9EUkFHX01PREUKKyAgICAgICAgLy8gYXMgaXQgbWF5IHRyaWdnZXIgdGhlIHVud2FudGVkIGZsaW5nLgorICAgICAgICBtVG91Y2hNb2RlID0gVE9VQ0hfUElOQ0hfRFJBRzsKKyAgICAgICAgbUNvbmZpcm1Nb3ZlID0gdHJ1ZTsKKyAgICAgICAgc3RhcnRUb3VjaChkZXRlY3Rvci5nZXRGb2N1c1goKSwgZGV0ZWN0b3IuZ2V0Rm9jdXNZKCksIG1MYXN0VG91Y2hUaW1lKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc3RhcnRTY3JvbGxpbmdMYXllcihmbG9hdCBnZXN0dXJlWCwgZmxvYXQgZ2VzdHVyZVkpIHsKKyAgICAgICAgaWYgKG1Ub3VjaE1vZGUgIT0gVE9VQ0hfRFJBR19MQVlFUl9NT0RFKSB7CisgICAgICAgICAgICBpbnQgY29udGVudFggPSB2aWV3VG9Db250ZW50WCgoaW50KSBnZXN0dXJlWCArIG1TY3JvbGxYKTsKKyAgICAgICAgICAgIGludCBjb250ZW50WSA9IHZpZXdUb0NvbnRlbnRZKChpbnQpIGdlc3R1cmVZICsgbVNjcm9sbFkpOworICAgICAgICAgICAgbVNjcm9sbGluZ0xheWVyID0gbmF0aXZlU2Nyb2xsYWJsZUxheWVyKGNvbnRlbnRYLCBjb250ZW50WSk7CisgICAgICAgICAgICBpZiAobVNjcm9sbGluZ0xheWVyICE9IDApIHsKKyAgICAgICAgICAgICAgICBtVG91Y2hNb2RlID0gVE9VQ0hfRFJBR19MQVlFUl9NT0RFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gMS8oZGVuc2l0eSAqIGRlbnNpdHkpIHVzZWQgdG8gY29tcHV0ZSB0aGUgZGlzdGFuY2UgYmV0d2VlbiBwb2ludHMuCisgICAgLy8gQ29tcHV0ZWQgaW4gaW5pdCgpLgorICAgIHByaXZhdGUgZmxvYXQgRFJBR19MQVlFUl9JTlZFUlNFX0RFTlNJVFlfU1FVQVJFRDsKKworICAgIC8vIFRoZSBkaXN0YW5jZSBiZXR3ZWVuIHR3byBwb2ludHMgcmVwb3J0ZWQgaW4gb25Ub3VjaEV2ZW50IHNjYWxlZCBieSB0aGUKKyAgICAvLyBkZW5zaXR5IG9mIHRoZSBzY3JlZW4uCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERSQUdfTEFZRVJfRklOR0VSX0RJU1RBTkNFID0gMjAwMDA7CisKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBvblRvdWNoRXZlbnQoTW90aW9uRXZlbnQgZXYpIHsKICAgICAgICAgaWYgKG1OYXRpdmVDbGFzcyA9PSAwIHx8ICFpc0NsaWNrYWJsZSgpIHx8ICFpc0xvbmdDbGlja2FibGUoKSkgewpAQCAtNDc2OSw1NSArNDcxNiwxMDQgQEAKICAgICAgICAgICAgICAgICAgICAgKyBtVG91Y2hNb2RlKTsKICAgICAgICAgfQogCi0gICAgICAgIGludCBhY3Rpb247Ci0gICAgICAgIGZsb2F0IHgsIHk7CisgICAgICAgIGludCBhY3Rpb24gPSBldi5nZXRBY3Rpb24oKTsKKyAgICAgICAgZmxvYXQgeCA9IGV2LmdldFgoKTsKKyAgICAgICAgZmxvYXQgeSA9IGV2LmdldFkoKTsKICAgICAgICAgbG9uZyBldmVudFRpbWUgPSBldi5nZXRFdmVudFRpbWUoKTsKIAorICAgICAgICBmaW5hbCBTY2FsZUdlc3R1cmVEZXRlY3RvciBkZXRlY3RvciA9CisgICAgICAgICAgICAgICAgbVpvb21NYW5hZ2VyLmdldE11bHRpVG91Y2hHZXN0dXJlRGV0ZWN0b3IoKTsKKyAgICAgICAgYm9vbGVhbiBza2lwU2NhbGVHZXN0dXJlID0gZmFsc2U7CisgICAgICAgIC8vIFNldCB0byB0aGUgbWlkLXBvaW50IG9mIGEgdHdvLWZpbmdlciBnZXN0dXJlIHVzZWQgdG8gZGV0ZWN0IGlmIHRoZQorICAgICAgICAvLyB1c2VyIGhhcyB0b3VjaGVkIGEgbGF5ZXIuCisgICAgICAgIGZsb2F0IGdlc3R1cmVYID0geDsKKyAgICAgICAgZmxvYXQgZ2VzdHVyZVkgPSB5OworICAgICAgICBpZiAoZGV0ZWN0b3IgPT0gbnVsbCB8fCAhZGV0ZWN0b3IuaXNJblByb2dyZXNzKCkpIHsKKyAgICAgICAgICAgIC8vIFRoZSBnZXN0dXJlIGZvciBzY3JvbGxpbmcgYSBsYXllciBpcyB0d28gZmluZ2VycyBjbG9zZSB0b2dldGhlci4KKyAgICAgICAgICAgIC8vIEZJWE1FOiB3ZSBtYXkgY29uc2lkZXIgZ2l2aW5nIFdlYktpdCBhbiBvcHRpb24gdG8gaGFuZGxlCisgICAgICAgICAgICAvLyBtdWx0aS10b3VjaCBldmVudHMgbGF0ZXIuCisgICAgICAgICAgICBpZiAoZXYuZ2V0UG9pbnRlckNvdW50KCkgPiAxKSB7CisgICAgICAgICAgICAgICAgZmxvYXQgZHggPSBldi5nZXRYKDEpIC0gZXYuZ2V0WCgwKTsKKyAgICAgICAgICAgICAgICBmbG9hdCBkeSA9IGV2LmdldFkoMSkgLSBldi5nZXRZKDApOworICAgICAgICAgICAgICAgIGZsb2F0IGRpc3QgPSAoZHggKiBkeCArIGR5ICogZHkpICoKKyAgICAgICAgICAgICAgICAgICAgICAgIERSQUdfTEFZRVJfSU5WRVJTRV9ERU5TSVRZX1NRVUFSRUQ7CisgICAgICAgICAgICAgICAgLy8gVXNlIHRoZSBhcHByb3hpbWF0ZSBjZW50ZXIgdG8gZGV0ZXJtaW5lIGlmIHRoZSBnZXN0dXJlIGlzIGluCisgICAgICAgICAgICAgICAgLy8gYSBsYXllci4KKyAgICAgICAgICAgICAgICBnZXN0dXJlWCA9IGV2LmdldFgoMCkgKyAoZHggKiAuNWYpOworICAgICAgICAgICAgICAgIGdlc3R1cmVZID0gZXYuZ2V0WSgwKSArIChkeSAqIC41Zik7CisgICAgICAgICAgICAgICAgLy8gTm93IHVzZSBhIGNvbnNpc3RlbnQgcG9pbnQgZm9yIHRyYWNraW5nIG1vdmVtZW50LgorICAgICAgICAgICAgICAgIGlmIChldi5nZXRYKDApIDwgZXYuZ2V0WCgxKSkgeworICAgICAgICAgICAgICAgICAgICB4ID0gZXYuZ2V0WCgwKTsKKyAgICAgICAgICAgICAgICAgICAgeSA9IGV2LmdldFkoMCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgeCA9IGV2LmdldFgoMSk7CisgICAgICAgICAgICAgICAgICAgIHkgPSBldi5nZXRZKDEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhY3Rpb24gPSBldi5nZXRBY3Rpb25NYXNrZWQoKTsKKyAgICAgICAgICAgICAgICBpZiAoZGlzdCA8IERSQUdfTEFZRVJfRklOR0VSX0RJU1RBTkNFKSB7CisgICAgICAgICAgICAgICAgICAgIHNraXBTY2FsZUdlc3R1cmUgPSB0cnVlOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobVRvdWNoTW9kZSA9PSBUT1VDSF9EUkFHX0xBWUVSX01PREUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gRmluZ2VycyBtb3ZlZCB0b28gZmFyIGFwYXJ0IHdoaWxlIGRyYWdnaW5nLCB0aGUgdXNlcgorICAgICAgICAgICAgICAgICAgICAvLyBtaWdodCBiZSB0cnlpbmcgdG8gem9vbS4KKyAgICAgICAgICAgICAgICAgICAgbVRvdWNoTW9kZSA9IFRPVUNIX0lOSVRfTU9ERTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKwogICAgICAgICAvLyBGSVhNRTogd2UgbWF5IGNvbnNpZGVyIHRvIGdpdmUgV2ViS2l0IGFuIG9wdGlvbiB0byBoYW5kbGUgbXVsdGktdG91Y2gKICAgICAgICAgLy8gZXZlbnRzIGxhdGVyLgotICAgICAgICBpZiAobVN1cHBvcnRNdWx0aVRvdWNoICYmIGV2LmdldFBvaW50ZXJDb3VudCgpID4gMSkgewotICAgICAgICAgICAgaWYgKG1NaW5ab29tU2NhbGUgPCBtTWF4Wm9vbVNjYWxlKSB7Ci0gICAgICAgICAgICAgICAgbVNjYWxlRGV0ZWN0b3Iub25Ub3VjaEV2ZW50KGV2KTsKLSAgICAgICAgICAgICAgICBpZiAobVNjYWxlRGV0ZWN0b3IuaXNJblByb2dyZXNzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbUxhc3RUb3VjaFRpbWUgPSBldmVudFRpbWU7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB4ID0gbVNjYWxlRGV0ZWN0b3IuZ2V0Rm9jdXNYKCk7Ci0gICAgICAgICAgICAgICAgeSA9IG1TY2FsZURldGVjdG9yLmdldEZvY3VzWSgpOwotICAgICAgICAgICAgICAgIGFjdGlvbiA9IGV2LmdldEFjdGlvbigpICYgTW90aW9uRXZlbnQuQUNUSU9OX01BU0s7Ci0gICAgICAgICAgICAgICAgaWYgKGFjdGlvbiA9PSBNb3Rpb25FdmVudC5BQ1RJT05fUE9JTlRFUl9ET1dOKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhbmNlbFRvdWNoKCk7Ci0gICAgICAgICAgICAgICAgICAgIGFjdGlvbiA9IE1vdGlvbkV2ZW50LkFDVElPTl9ET1dOOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uID09IE1vdGlvbkV2ZW50LkFDVElPTl9QT0lOVEVSX1VQKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHNldCBtTGFzdFRvdWNoWC9ZIHRvIHRoZSByZW1haW5pbmcgcG9pbnQKLSAgICAgICAgICAgICAgICAgICAgbUxhc3RUb3VjaFggPSB4OwotICAgICAgICAgICAgICAgICAgICBtTGFzdFRvdWNoWSA9IHk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24gPT0gTW90aW9uRXZlbnQuQUNUSU9OX01PVkUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gbmVnYXRpdmUgeCBvciB5IGluZGljYXRlIGl0IGlzIG9uIHRoZSBlZGdlLCBza2lwIGl0LgotICAgICAgICAgICAgICAgICAgICBpZiAoeCA8IDAgfHwgeSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBpZiB0aGUgcGFnZSBkaXNhbGxvdyB6b29tLCBza2lwIG11bHRpLXBvaW50ZXIgYWN0aW9uCisgICAgICAgIGlmIChtWm9vbU1hbmFnZXIuc3VwcG9ydHNNdWx0aVRvdWNoWm9vbSgpICYmIGV2LmdldFBvaW50ZXJDb3VudCgpID4gMSAmJgorICAgICAgICAgICAgICAgIG1Ub3VjaE1vZGUgIT0gVE9VQ0hfRFJBR19MQVlFUl9NT0RFICYmICFza2lwU2NhbGVHZXN0dXJlKSB7CisKKyAgICAgICAgICAgIC8vIGlmIHRoZSBwYWdlIGRpc2FsbG93cyB6b29tLCBza2lwIG11bHRpLXBvaW50ZXIgYWN0aW9uCisgICAgICAgICAgICBpZiAobVpvb21NYW5hZ2VyLmlzWm9vbVNjYWxlRml4ZWQoKSkgewogICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYWN0aW9uID0gZXYuZ2V0QWN0aW9uKCk7Ci0gICAgICAgICAgICB4ID0gZXYuZ2V0WCgpOwotICAgICAgICAgICAgeSA9IGV2LmdldFkoKTsKKworICAgICAgICAgICAgaWYgKCFkZXRlY3Rvci5pc0luUHJvZ3Jlc3MoKSAmJgorICAgICAgICAgICAgICAgICAgICBldi5nZXRBY3Rpb25NYXNrZWQoKSAhPSBNb3Rpb25FdmVudC5BQ1RJT05fUE9JTlRFUl9ET1dOKSB7CisgICAgICAgICAgICAgICAgLy8gSW5zZXJ0IGEgZmFrZSBwb2ludGVyIGRvd24gZXZlbnQgaW4gb3JkZXIgdG8gc3RhcnQKKyAgICAgICAgICAgICAgICAvLyB0aGUgem9vbSBzY2FsZSBkZXRlY3Rvci4KKyAgICAgICAgICAgICAgICBNb3Rpb25FdmVudCB0ZW1wID0gTW90aW9uRXZlbnQub2J0YWluKGV2KTsKKyAgICAgICAgICAgICAgICAvLyBDbGVhciB0aGUgb3JpZ2luYWwgZXZlbnQgYW5kIHNldCBpdCB0bworICAgICAgICAgICAgICAgIC8vIEFDVElPTl9QT0lOVEVSX0RPV04uCisgICAgICAgICAgICAgICAgdGVtcC5zZXRBY3Rpb24odGVtcC5nZXRBY3Rpb24oKSAmCisgICAgICAgICAgICAgICAgICAgICAgICB+TW90aW9uRXZlbnQuQUNUSU9OX01BU0sgfAorICAgICAgICAgICAgICAgICAgICAgICAgTW90aW9uRXZlbnQuQUNUSU9OX1BPSU5URVJfRE9XTik7CisgICAgICAgICAgICAgICAgZGV0ZWN0b3Iub25Ub3VjaEV2ZW50KHRlbXApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkZXRlY3Rvci5vblRvdWNoRXZlbnQoZXYpOworCisgICAgICAgICAgICBpZiAoZGV0ZWN0b3IuaXNJblByb2dyZXNzKCkpIHsKKyAgICAgICAgICAgICAgICBtTGFzdFRvdWNoVGltZSA9IGV2ZW50VGltZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgeCA9IGRldGVjdG9yLmdldEZvY3VzWCgpOworICAgICAgICAgICAgeSA9IGRldGVjdG9yLmdldEZvY3VzWSgpOworICAgICAgICAgICAgYWN0aW9uID0gZXYuZ2V0QWN0aW9uKCkgJiBNb3Rpb25FdmVudC5BQ1RJT05fTUFTSzsKKyAgICAgICAgICAgIGlmIChhY3Rpb24gPT0gTW90aW9uRXZlbnQuQUNUSU9OX1BPSU5URVJfRE9XTikgeworICAgICAgICAgICAgICAgIGNhbmNlbFRvdWNoKCk7CisgICAgICAgICAgICAgICAgYWN0aW9uID0gTW90aW9uRXZlbnQuQUNUSU9OX0RPV047CisgICAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbiA9PSBNb3Rpb25FdmVudC5BQ1RJT05fUE9JTlRFUl9VUCkgeworICAgICAgICAgICAgICAgIC8vIHNldCBtTGFzdFRvdWNoWC9ZIHRvIHRoZSByZW1haW5pbmcgcG9pbnQKKyAgICAgICAgICAgICAgICBtTGFzdFRvdWNoWCA9IHg7CisgICAgICAgICAgICAgICAgbUxhc3RUb3VjaFkgPSB5OworICAgICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24gPT0gTW90aW9uRXZlbnQuQUNUSU9OX01PVkUpIHsKKyAgICAgICAgICAgICAgICAvLyBuZWdhdGl2ZSB4IG9yIHkgaW5kaWNhdGUgaXQgaXMgb24gdGhlIGVkZ2UsIHNraXAgaXQuCisgICAgICAgICAgICAgICAgaWYgKHggPCAwIHx8IHkgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIC8vIER1ZSB0byB0aGUgdG91Y2ggc2NyZWVuIGVkZ2UgZWZmZWN0LCBhIHRvdWNoIGNsb3NlciB0byB0aGUgZWRnZQogICAgICAgICAvLyBhbHdheXMgc25hcHBlZCB0byB0aGUgZWRnZS4gQXMgZ2V0Vmlld1dpZHRoKCkgY2FuIGJlIGRpZmZlcmVudCBmcm9tCiAgICAgICAgIC8vIGdldFdpZHRoKCkgZHVlIHRvIHRoZSBzY3JvbGxiYXIsIGFkanVzdGluZyB0aGUgcG9pbnQgdG8gbWF0Y2gKICAgICAgICAgLy8gZ2V0Vmlld1dpZHRoKCkuIFNhbWUgYXBwbGllZCB0byB0aGUgaGVpZ2h0LgotICAgICAgICBpZiAoeCA+IGdldFZpZXdXaWR0aCgpIC0gMSkgewotICAgICAgICAgICAgeCA9IGdldFZpZXdXaWR0aCgpIC0gMTsKLSAgICAgICAgfQotICAgICAgICBpZiAoeSA+IGdldFZpZXdIZWlnaHRXaXRoVGl0bGUoKSAtIDEpIHsKLSAgICAgICAgICAgIHkgPSBnZXRWaWV3SGVpZ2h0V2l0aFRpdGxlKCkgLSAxOwotICAgICAgICB9CisgICAgICAgIHggPSBNYXRoLm1pbih4LCBnZXRWaWV3V2lkdGgoKSAtIDEpOworICAgICAgICB5ID0gTWF0aC5taW4oeSwgZ2V0Vmlld0hlaWdodFdpdGhUaXRsZSgpIC0gMSk7CiAKICAgICAgICAgZmxvYXQgZkRlbHRhWCA9IG1MYXN0VG91Y2hYIC0geDsKICAgICAgICAgZmxvYXQgZkRlbHRhWSA9IG1MYXN0VG91Y2hZIC0geTsKQEAgLTQ4NDAsNiArNDgzNiw5IEBACiAgICAgICAgICAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhSRVNVTUVfV0VCQ09SRV9QUklPUklUWSk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtUHJpdmF0ZUhhbmRsZXIuaGFzTWVzc2FnZXMoUkVMRUFTRV9TSU5HTEVfVEFQKSkgewogICAgICAgICAgICAgICAgICAgICBtUHJpdmF0ZUhhbmRsZXIucmVtb3ZlTWVzc2FnZXMoUkVMRUFTRV9TSU5HTEVfVEFQKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGdldFNldHRpbmdzKCkuc3VwcG9ydFRvdWNoT25seSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVUb3VjaEhpZ2hsaWdodCh0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBpZiAoZGVsdGFYICogZGVsdGFYICsgZGVsdGFZICogZGVsdGFZIDwgbURvdWJsZVRhcFNsb3BTcXVhcmUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG1Ub3VjaE1vZGUgPSBUT1VDSF9ET1VCTEVfVEFQX01PREU7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CkBAIC00ODUxLDEzICs0ODUwLDMzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRYLCBjb250ZW50WSkgOiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vIHRoZSBub3JtYWwgY2FzZQotICAgICAgICAgICAgICAgICAgICBtUHJldmlld1pvb21Pbmx5ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgIG1Ub3VjaE1vZGUgPSBUT1VDSF9JTklUX01PREU7CiAgICAgICAgICAgICAgICAgICAgIG1EZWZlclRvdWNoUHJvY2VzcyA9ICghaW5GdWxsU2NyZWVuTW9kZSgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgbUZvcndhcmRUb3VjaEV2ZW50cykgPyBoaXRGb2N1c2VkUGx1Z2luKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRYLCBjb250ZW50WSkgOiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgbVdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50SHViLlVQREFURV9GUkFNRV9DQUNIRV9JRl9MT0FESU5HKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGdldFNldHRpbmdzKCkuc3VwcG9ydFRvdWNoT25seSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBUb3VjaEhpZ2hsaWdodERhdGEgZGF0YSA9IG5ldyBUb3VjaEhpZ2hsaWdodERhdGEoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEubVggPSBjb250ZW50WDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEubVkgPSBjb250ZW50WTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEubVNsb3AgPSB2aWV3VG9Db250ZW50RGltZW5zaW9uKG1OYXZTbG9wKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1XZWJWaWV3Q29yZS5zZW5kTWVzc2FnZURlbGF5ZWQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50SHViLkdFVF9UT1VDSF9ISUdITElHSFRfUkVDVFMsIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpZXdDb25maWd1cmF0aW9uLmdldFRhcFRpbWVvdXQoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUdfVE9VQ0hfSElHSExJR0hUKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdldFNldHRpbmdzKCkuZ2V0TmF2RHVtcCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ub3VjaEhpZ2hsaWdodFggPSAoaW50KSB4ICsgbVNjcm9sbFg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ub3VjaEhpZ2hsaWdodFkgPSAoaW50KSB5ICsgbVNjcm9sbFk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5wb3N0RGVsYXllZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRvdWNoSGlnaGxpZ2h0WCA9IG1Ub3VjaEhpZ2hsaWdodFkgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgVE9VQ0hfSElHSExJR0hUX0VMQVBTRV9USU1FKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgaWYgKG1Mb2dFdmVudCAmJiBldmVudFRpbWUgLSBtTGFzdFRvdWNoVXBUaW1lIDwgMTAwMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFdmVudExvZ1RhZ3MuQlJPV1NFUl9ET1VCTEVfVEFQX0RVUkFUSU9OLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXZlbnRUaW1lIC0gbUxhc3RUb3VjaFVwVGltZSksIGV2ZW50VGltZSk7CkBAIC00ODkzLDE3ICs0OTEyLDE1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICB0ZWQubVkgPSBjb250ZW50WTsKICAgICAgICAgICAgICAgICAgICAgICAgIHRlZC5tTWV0YVN0YXRlID0gZXYuZ2V0TWV0YVN0YXRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICB0ZWQubVJlcHJvY2VzcyA9IG1EZWZlclRvdWNoUHJvY2VzczsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1XZWJWaWV3Q29yZS5zZW5kTWVzc2FnZShFdmVudEh1Yi5UT1VDSF9FVkVOVCwgdGVkKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtRGVmZXJUb3VjaFByb2Nlc3MpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGlsbCBuZWVkcyB0byBzZXQgdGhlbSBmb3IgY29tcHV0ZSBkZWx0YVgvWQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0VG91Y2hYID0geDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTGFzdFRvdWNoWSA9IHk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVkLm1WaWV3WCA9IHg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVkLm1WaWV3WSA9IHk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlKEV2ZW50SHViLlRPVUNIX0VWRU5ULCB0ZWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgbVdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlKEV2ZW50SHViLlRPVUNIX0VWRU5ULCB0ZWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpbkZ1bGxTY3JlZW5Nb2RlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUHJpdmF0ZUhhbmRsZXIucmVtb3ZlTWVzc2FnZXMoUFJFVkVOVF9ERUZBVUxUX1RJTUVPVVQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5zZW5kTWVzc2FnZURlbGF5ZWQobVByaXZhdGVIYW5kbGVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAub2J0YWluTWVzc2FnZShQUkVWRU5UX0RFRkFVTFRfVElNRU9VVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uLCAwKSwgVEFQX1RJTUVPVVQpOwpAQCAtNDkyNCwyNCArNDk0MSwyNCBAQAogICAgICAgICAgICAgICAgICAgICBpZiAobVRvdWNoTW9kZSA9PSBUT1VDSF9ET1VCTEVfVEFQX01PREUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG1Ub3VjaE1vZGUgPSBUT1VDSF9JTklUX01PREU7CiAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGdldFNldHRpbmdzKCkuc3VwcG9ydFRvdWNoT25seSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVUb3VjaEhpZ2hsaWdodCh0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAvLyBwYXNzIHRoZSB0b3VjaCBldmVudHMgZnJvbSBVSSB0aHJlYWQgdG8gV2ViQ29yZSB0aHJlYWQKICAgICAgICAgICAgICAgICBpZiAoc2hvdWxkRm9yd2FyZFRvdWNoRXZlbnQoKSAmJiBtQ29uZmlybU1vdmUgJiYgKGZpcnN0TW92ZQogICAgICAgICAgICAgICAgICAgICAgICAgfHwgZXZlbnRUaW1lIC0gbUxhc3RTZW50VG91Y2hUaW1lID4gbUN1cnJlbnRUb3VjaEludGVydmFsKSkgewotICAgICAgICAgICAgICAgICAgICBtTGFzdFNlbnRUb3VjaFRpbWUgPSBldmVudFRpbWU7CiAgICAgICAgICAgICAgICAgICAgIFRvdWNoRXZlbnREYXRhIHRlZCA9IG5ldyBUb3VjaEV2ZW50RGF0YSgpOwogICAgICAgICAgICAgICAgICAgICB0ZWQubUFjdGlvbiA9IGFjdGlvbjsKICAgICAgICAgICAgICAgICAgICAgdGVkLm1YID0gY29udGVudFg7CiAgICAgICAgICAgICAgICAgICAgIHRlZC5tWSA9IGNvbnRlbnRZOwogICAgICAgICAgICAgICAgICAgICB0ZWQubU1ldGFTdGF0ZSA9IGV2LmdldE1ldGFTdGF0ZSgpOwogICAgICAgICAgICAgICAgICAgICB0ZWQubVJlcHJvY2VzcyA9IG1EZWZlclRvdWNoUHJvY2VzczsKKyAgICAgICAgICAgICAgICAgICAgbVdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlKEV2ZW50SHViLlRPVUNIX0VWRU5ULCB0ZWQpOworICAgICAgICAgICAgICAgICAgICBtTGFzdFNlbnRUb3VjaFRpbWUgPSBldmVudFRpbWU7CiAgICAgICAgICAgICAgICAgICAgIGlmIChtRGVmZXJUb3VjaFByb2Nlc3MpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRlZC5tVmlld1ggPSB4OwotICAgICAgICAgICAgICAgICAgICAgICAgdGVkLm1WaWV3WSA9IHk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtV2ViVmlld0NvcmUuc2VuZE1lc3NhZ2UoRXZlbnRIdWIuVE9VQ0hfRVZFTlQsIHRlZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtV2ViVmlld0NvcmUuc2VuZE1lc3NhZ2UoRXZlbnRIdWIuVE9VQ0hfRVZFTlQsIHRlZCk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdE1vdmUgJiYgIWluRnVsbFNjcmVlbk1vZGUoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgbVByaXZhdGVIYW5kbGVyLnNlbmRNZXNzYWdlRGVsYXllZChtUHJpdmF0ZUhhbmRsZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm9idGFpbk1lc3NhZ2UoUFJFVkVOVF9ERUZBVUxUX1RJTUVPVVQsCkBAIC00OTcwLDExICs0OTg3LDEzIEBACiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGlmIChtVG91Y2hNb2RlICE9IFRPVUNIX0RSQUdfTU9ERSkgeworICAgICAgICAgICAgICAgIGlmIChtVG91Y2hNb2RlICE9IFRPVUNIX0RSQUdfTU9ERSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgbVRvdWNoTW9kZSAhPSBUT1VDSF9EUkFHX0xBWUVSX01PREUpIHsKIAogICAgICAgICAgICAgICAgICAgICBpZiAoIW1Db25maXJtTW92ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgICAgICBpZiAobVByZXZlbnREZWZhdWx0ID09IFBSRVZFTlRfREVGQVVMVF9NQVlCRV9ZRVMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBtUHJldmVudERlZmF1bHQgPT0gUFJFVkVOVF9ERUZBVUxUX05PX0ZST01fVE9VQ0hfRE9XTikgewogICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHJhY2sgbUxhc3RUb3VjaFRpbWUgYXMgd2UgbWF5IG5lZWQgdG8gZG8gZmxpbmcgYXQKQEAgLTUwMDEsNiArNTAyMCw5IEBACiAgICAgICAgICAgICAgICAgICAgIGRlbHRhWCA9IDA7CiAgICAgICAgICAgICAgICAgICAgIGRlbHRhWSA9IDA7CiAKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNraXBTY2FsZUdlc3R1cmUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0U2Nyb2xsaW5nTGF5ZXIoZ2VzdHVyZVgsIGdlc3R1cmVZKTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBzdGFydERyYWcoKTsKICAgICAgICAgICAgICAgICB9CiAKQEAgLTUwMDksMTcgKzUwMzEsMTkgQEAKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAvLyBkbyBwYW4KLSAgICAgICAgICAgICAgICBpbnQgbmV3U2Nyb2xsWCA9IHBpbkxvY1gobVNjcm9sbFggKyBkZWx0YVgpOwotICAgICAgICAgICAgICAgIGludCBuZXdEZWx0YVggPSBuZXdTY3JvbGxYIC0gbVNjcm9sbFg7Ci0gICAgICAgICAgICAgICAgaWYgKGRlbHRhWCAhPSBuZXdEZWx0YVgpIHsKLSAgICAgICAgICAgICAgICAgICAgZGVsdGFYID0gbmV3RGVsdGFYOwotICAgICAgICAgICAgICAgICAgICBmRGVsdGFYID0gKGZsb2F0KSBuZXdEZWx0YVg7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGludCBuZXdTY3JvbGxZID0gcGluTG9jWShtU2Nyb2xsWSArIGRlbHRhWSk7Ci0gICAgICAgICAgICAgICAgaW50IG5ld0RlbHRhWSA9IG5ld1Njcm9sbFkgLSBtU2Nyb2xsWTsKLSAgICAgICAgICAgICAgICBpZiAoZGVsdGFZICE9IG5ld0RlbHRhWSkgewotICAgICAgICAgICAgICAgICAgICBkZWx0YVkgPSBuZXdEZWx0YVk7Ci0gICAgICAgICAgICAgICAgICAgIGZEZWx0YVkgPSAoZmxvYXQpIG5ld0RlbHRhWTsKKyAgICAgICAgICAgICAgICBpZiAobVRvdWNoTW9kZSAhPSBUT1VDSF9EUkFHX0xBWUVSX01PREUpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IG5ld1Njcm9sbFggPSBwaW5Mb2NYKG1TY3JvbGxYICsgZGVsdGFYKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IG5ld0RlbHRhWCA9IG5ld1Njcm9sbFggLSBtU2Nyb2xsWDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRlbHRhWCAhPSBuZXdEZWx0YVgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlbHRhWCA9IG5ld0RlbHRhWDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZEZWx0YVggPSAoZmxvYXQpIG5ld0RlbHRhWDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpbnQgbmV3U2Nyb2xsWSA9IHBpbkxvY1kobVNjcm9sbFkgKyBkZWx0YVkpOworICAgICAgICAgICAgICAgICAgICBpbnQgbmV3RGVsdGFZID0gbmV3U2Nyb2xsWSAtIG1TY3JvbGxZOworICAgICAgICAgICAgICAgICAgICBpZiAoZGVsdGFZICE9IG5ld0RlbHRhWSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGFZID0gbmV3RGVsdGFZOworICAgICAgICAgICAgICAgICAgICAgICAgZkRlbHRhWSA9IChmbG9hdCkgbmV3RGVsdGFZOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJvb2xlYW4gZG9uZSA9IGZhbHNlOwogICAgICAgICAgICAgICAgIGJvb2xlYW4ga2VlcFNjcm9sbEJhcnNWaXNpYmxlID0gZmFsc2U7CkBAIC01MDg3LDcgKzUxMTEsOSBAQAogCiAgICAgICAgICAgICAgICAgZG9EcmFnKGRlbHRhWCwgZGVsdGFZKTsKIAotICAgICAgICAgICAgICAgIGlmIChrZWVwU2Nyb2xsQmFyc1Zpc2libGUpIHsKKyAgICAgICAgICAgICAgICAvLyBUdXJuIG9mZiBzY3JvbGxiYXJzIHdoZW4gZHJhZ2dpbmcgYSBsYXllci4KKyAgICAgICAgICAgICAgICBpZiAoa2VlcFNjcm9sbEJhcnNWaXNpYmxlICYmCisgICAgICAgICAgICAgICAgICAgICAgICBtVG91Y2hNb2RlICE9IFRPVUNIX0RSQUdfTEFZRVJfTU9ERSkgewogICAgICAgICAgICAgICAgICAgICBpZiAobUhlbGRNb3Rpb25sZXNzICE9IE1PVElPTkxFU1NfVFJVRSkgewogICAgICAgICAgICAgICAgICAgICAgICAgbUhlbGRNb3Rpb25sZXNzID0gTU9USU9OTEVTU19UUlVFOwogICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwpAQCAtNTEwMiw2ICs1MTI4LDcgQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX1VQOiB7CisgICAgICAgICAgICAgICAgaWYgKCFpc0ZvY3VzZWQoKSkgcmVxdWVzdEZvY3VzKCk7CiAgICAgICAgICAgICAgICAgLy8gcGFzcyB0aGUgdG91Y2ggZXZlbnRzIGZyb20gVUkgdGhyZWFkIHRvIFdlYkNvcmUgdGhyZWFkCiAgICAgICAgICAgICAgICAgaWYgKHNob3VsZEZvcndhcmRUb3VjaEV2ZW50KCkpIHsKICAgICAgICAgICAgICAgICAgICAgVG91Y2hFdmVudERhdGEgdGVkID0gbmV3IFRvdWNoRXZlbnREYXRhKCk7CkBAIC01MTEwLDEwICs1MTM3LDYgQEAKICAgICAgICAgICAgICAgICAgICAgdGVkLm1ZID0gY29udGVudFk7CiAgICAgICAgICAgICAgICAgICAgIHRlZC5tTWV0YVN0YXRlID0gZXYuZ2V0TWV0YVN0YXRlKCk7CiAgICAgICAgICAgICAgICAgICAgIHRlZC5tUmVwcm9jZXNzID0gbURlZmVyVG91Y2hQcm9jZXNzOwotICAgICAgICAgICAgICAgICAgICBpZiAobURlZmVyVG91Y2hQcm9jZXNzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ZWQubVZpZXdYID0geDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRlZC5tVmlld1kgPSB5OwotICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIG1XZWJWaWV3Q29yZS5zZW5kTWVzc2FnZShFdmVudEh1Yi5UT1VDSF9FVkVOVCwgdGVkKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgbUxhc3RUb3VjaFVwVGltZSA9IGV2ZW50VGltZTsKQEAgLTUxMjgsMTMgKzUxNTEsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlZC5tWSA9IGNvbnRlbnRZOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlZC5tTWV0YVN0YXRlID0gZXYuZ2V0TWV0YVN0YXRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVkLm1SZXByb2Nlc3MgPSBtRGVmZXJUb3VjaFByb2Nlc3M7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1EZWZlclRvdWNoUHJvY2VzcykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWQubVZpZXdYID0geDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVkLm1WaWV3WSA9IHk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1XZWJWaWV3Q29yZS5zZW5kTWVzc2FnZShFdmVudEh1Yi5UT1VDSF9FVkVOVCwgdGVkKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobVByZXZlbnREZWZhdWx0ICE9IFBSRVZFTlRfREVGQVVMVF9ZRVMpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvRG91YmxlVGFwKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVpvb21NYW5hZ2VyLmhhbmRsZURvdWJsZVRhcChtTGFzdFRvdWNoWCwgbUxhc3RUb3VjaFkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ub3VjaE1vZGUgPSBUT1VDSF9ET05FX01PREU7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTUxNDksOSArNTE2OCwxNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtUHJldmVudERlZmF1bHQgIT0gUFJFVkVOVF9ERUZBVUxUX1lFUwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKGNvbXB1dGVNYXhTY3JvbGxYKCkgPiAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGNvbXB1dGVNYXhTY3JvbGxZKCkgPiAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBVSSB0YWtlcyBjb250cm9sIGJhY2ssIGNhbmNlbCBXZWJDb3JlIHRvdWNoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbmNlbFdlYkNvcmVUb3VjaEV2ZW50KGNvbnRlbnRYLCBjb250ZW50WSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHVzZXIgaGFzIHBlcmZvcm1lZCBhIHZlcnkgcXVpY2sgdG91Y2gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VxdWVuY2UgaXQgaXMgcG9zc2libGUgdGhhdCB3ZSBtYXkgZ2V0IGhlcmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmVmb3JlIFdlYkNvcmUgaGFzIGhhZCBhIGNoYW5jZSB0byBwcm9jZXNzIHRoZSBldmVudHMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluIHRoaXMgY2FzZSwgYW55IGNhbGwgdG8gcHJldmVudERlZmF1bHQgaW4gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEpTIHRvdWNoIGhhbmRsZXIgd2lsbCBub3QgaGF2ZSBiZWVuIGV4ZWN1dGVkIHlldC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSGVuY2Ugd2Ugd2lsbCBzZWUgYm90aCB0aGUgVUkgKG5vdykgYW5kIFdlYkNvcmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKHdoZW4gY29udGV4dCBzd2l0Y2hlcykgaGFuZGxpbmcgdGhlIGV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlIHdlYiBkZXZlbG9wZXIgYWN0dWFsbHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9lc2VzIHByZXZlbnREZWZhdWx0IGluIHRoZWlyIHRvdWNoIGhhbmRsZXIuIFRoaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXMgdGhlIG5hdHVyZSBvZiBvdXIgYXN5bmNocm9ub3VzIHRvdWNoIG1vZGVsLgorCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIHdpbGwgbm90IHJld3JpdGUgZHJhZyBjb2RlIGhlcmUsIGJ1dCB3ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aWxsIHRyeSBmbGluZyBpZiBpdCBhcHBsaWVzLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJWaWV3Q29yZS5yZWR1Y2VQcmlvcml0eSgpOwpAQCAtNTE3NSw3ICs1MjAyLDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtVG91Y2hNb2RlID09IFRPVUNIX0lOSVRfTU9ERSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9ubHkgdHJpZ2dlciBkb3VibGUgdGFwIGlmIHRoZSBXZWJWaWV3IGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2NhbGFibGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVRvdWNoTW9kZSA9PSBUT1VDSF9JTklUX01PREUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIChjYW5ab29tSW4oKSB8fCBjYW5ab29tT3V0KCkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5zZW5kRW1wdHlNZXNzYWdlRGVsYXllZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUxFQVNFX1NJTkdMRV9UQVAsIFZpZXdDb25maWd1cmF0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RG91YmxlVGFwVGltZW91dCgpKTsKQEAgLTUyMTAsNiArNTI0MCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmYWxsIHRocm91Z2gKICAgICAgICAgICAgICAgICAgICAgY2FzZSBUT1VDSF9EUkFHX1NUQVJUX01PREU6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVE9VQ0hfRFJBR19MQVlFUl9NT0RFOgogICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9VQ0hfRFJBR19TVEFSVF9NT0RFIHNob3VsZCBub3QgaGFwcGVuIGZvciB0aGUgcmVhbAogICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGV2aWNlIGFzIHdlIGFsbW9zdCBjZXJ0YWluIHdpbGwgZ2V0IGEgTU9WRS4gQnV0IHRoaXMKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIHBvc3NpYmxlIG9uIGVtdWxhdG9yLgpAQCAtNTI2Niw0MCArNTI5NywyNiBAQAogICAgICAgICBpZiAoIW1EcmFnRnJvbVRleHRJbnB1dCkgewogICAgICAgICAgICAgbmF0aXZlSGlkZUN1cnNvcigpOwogICAgICAgICB9Ci0gICAgICAgIFdlYlNldHRpbmdzIHNldHRpbmdzID0gZ2V0U2V0dGluZ3MoKTsKLSAgICAgICAgaWYgKHNldHRpbmdzLnN1cHBvcnRab29tKCkKLSAgICAgICAgICAgICAgICAmJiBzZXR0aW5ncy5nZXRCdWlsdEluWm9vbUNvbnRyb2xzKCkKLSAgICAgICAgICAgICAgICAmJiAhZ2V0Wm9vbUJ1dHRvbnNDb250cm9sbGVyKCkuaXNWaXNpYmxlKCkKLSAgICAgICAgICAgICAgICAmJiBtTWluWm9vbVNjYWxlIDwgbU1heFpvb21TY2FsZQotICAgICAgICAgICAgICAgICYmIChtSG9yaXpvbnRhbFNjcm9sbEJhck1vZGUgIT0gU0NST0xMQkFSX0FMV0FZU09GRgotICAgICAgICAgICAgICAgICAgICAgICAgfHwgbVZlcnRpY2FsU2Nyb2xsQmFyTW9kZSAhPSBTQ1JPTExCQVJfQUxXQVlTT0ZGKSkgewotICAgICAgICAgICAgbVpvb21CdXR0b25zQ29udHJvbGxlci5zZXRWaXNpYmxlKHRydWUpOwotICAgICAgICAgICAgaW50IGNvdW50ID0gc2V0dGluZ3MuZ2V0RG91YmxlVGFwVG9hc3RDb3VudCgpOwotICAgICAgICAgICAgaWYgKG1Jblpvb21PdmVydmlldyAmJiBjb3VudCA+IDApIHsKLSAgICAgICAgICAgICAgICBzZXR0aW5ncy5zZXREb3VibGVUYXBUb2FzdENvdW50KC0tY291bnQpOwotICAgICAgICAgICAgICAgIFRvYXN0Lm1ha2VUZXh0KG1Db250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcuZG91YmxlX3RhcF90b2FzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIFRvYXN0LkxFTkdUSF9MT05HKS5zaG93KCk7Ci0gICAgICAgICAgICB9CisKKyAgICAgICAgaWYgKG1Ib3Jpem9udGFsU2Nyb2xsQmFyTW9kZSAhPSBTQ1JPTExCQVJfQUxXQVlTT0ZGCisgICAgICAgICAgICAgICAgfHwgbVZlcnRpY2FsU2Nyb2xsQmFyTW9kZSAhPSBTQ1JPTExCQVJfQUxXQVlTT0ZGKSB7CisgICAgICAgICAgICBtWm9vbU1hbmFnZXIuaW52b2tlWm9vbVBpY2tlcigpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIGRvRHJhZyhpbnQgZGVsdGFYLCBpbnQgZGVsdGFZKSB7CiAgICAgICAgIGlmICgoZGVsdGFYIHwgZGVsdGFZKSAhPSAwKSB7CisgICAgICAgICAgICBpZiAobVRvdWNoTW9kZSA9PSBUT1VDSF9EUkFHX0xBWUVSX01PREUpIHsKKyAgICAgICAgICAgICAgICBkZWx0YVggPSB2aWV3VG9Db250ZW50RGltZW5zaW9uKGRlbHRhWCk7CisgICAgICAgICAgICAgICAgZGVsdGFZID0gdmlld1RvQ29udGVudERpbWVuc2lvbihkZWx0YVkpOworICAgICAgICAgICAgICAgIGlmIChuYXRpdmVTY3JvbGxMYXllcihtU2Nyb2xsaW5nTGF5ZXIsIGRlbHRhWCwgZGVsdGFZKSkgeworICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIHNjcm9sbEJ5KGRlbHRhWCwgZGVsdGFZKTsKICAgICAgICAgfQotICAgICAgICBpZiAoIWdldFNldHRpbmdzKCkuZ2V0QnVpbHRJblpvb21Db250cm9scygpKSB7Ci0gICAgICAgICAgICBib29sZWFuIHNob3dQbHVzTWludXMgPSBtTWluWm9vbVNjYWxlIDwgbU1heFpvb21TY2FsZTsKLSAgICAgICAgICAgIGlmIChtWm9vbUNvbnRyb2xzICE9IG51bGwgJiYgc2hvd1BsdXNNaW51cykgewotICAgICAgICAgICAgICAgIGlmIChtWm9vbUNvbnRyb2xzLmdldFZpc2liaWxpdHkoKSA9PSBWaWV3LlZJU0lCTEUpIHsKLSAgICAgICAgICAgICAgICAgICAgbVByaXZhdGVIYW5kbGVyLnJlbW92ZUNhbGxiYWNrcyhtWm9vbUNvbnRyb2xSdW5uYWJsZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbVpvb21Db250cm9scy5zaG93KHNob3dQbHVzTWludXMsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbVByaXZhdGVIYW5kbGVyLnBvc3REZWxheWVkKG1ab29tQ29udHJvbFJ1bm5hYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgWk9PTV9DT05UUk9MU19USU1FT1VUKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgICAgICBtWm9vbU1hbmFnZXIua2VlcFpvb21QaWNrZXJWaXNpYmxlKCk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIHN0b3BUb3VjaCgpIHsKQEAgLTUzMjYsNyArNTM0Myw4IEBACiAgICAgICAgICAgICBtVmVsb2NpdHlUcmFja2VyLnJlY3ljbGUoKTsKICAgICAgICAgICAgIG1WZWxvY2l0eVRyYWNrZXIgPSBudWxsOwogICAgICAgICB9Ci0gICAgICAgIGlmIChtVG91Y2hNb2RlID09IFRPVUNIX0RSQUdfTU9ERSkgeworICAgICAgICBpZiAobVRvdWNoTW9kZSA9PSBUT1VDSF9EUkFHX01PREUgfHwKKyAgICAgICAgICAgICAgICBtVG91Y2hNb2RlID09IFRPVUNIX0RSQUdfTEFZRVJfTU9ERSkgewogICAgICAgICAgICAgV2ViVmlld0NvcmUucmVzdW1lUHJpb3JpdHkoKTsKICAgICAgICAgICAgIFdlYlZpZXdDb3JlLnJlc3VtZVVwZGF0ZVBpY3R1cmUobVdlYlZpZXdDb3JlKTsKICAgICAgICAgfQpAQCAtNTMzNCw2ICs1MzUyLDkgQEAKICAgICAgICAgbVByaXZhdGVIYW5kbGVyLnJlbW92ZU1lc3NhZ2VzKFNXSVRDSF9UT19MT05HUFJFU1MpOwogICAgICAgICBtUHJpdmF0ZUhhbmRsZXIucmVtb3ZlTWVzc2FnZXMoRFJBR19IRUxEX01PVElPTkxFU1MpOwogICAgICAgICBtUHJpdmF0ZUhhbmRsZXIucmVtb3ZlTWVzc2FnZXMoQVdBS0VOX1NDUk9MTF9CQVJTKTsKKyAgICAgICAgaWYgKGdldFNldHRpbmdzKCkuc3VwcG9ydFRvdWNoT25seSgpKSB7CisgICAgICAgICAgICByZW1vdmVUb3VjaEhpZ2hsaWdodCh0cnVlKTsKKyAgICAgICAgfQogICAgICAgICBtSGVsZE1vdGlvbmxlc3MgPSBNT1RJT05MRVNTX1RSVUU7CiAgICAgICAgIG1Ub3VjaE1vZGUgPSBUT1VDSF9ET05FX01PREU7CiAgICAgICAgIG5hdGl2ZUhpZGVDdXJzb3IoKTsKQEAgLTU1OTksMTEgKzU2MjAsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBtVHJhY2tiYWxsUmVtYWluc1g9IiArIG1UcmFja2JhbGxSZW1haW5zWAogICAgICAgICAgICAgICAgICAgICAgICAgKyAiIG1UcmFja2JhbGxSZW1haW5zWT0iICsgbVRyYWNrYmFsbFJlbWFpbnNZKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtTmF0aXZlQ2xhc3MgIT0gMCAmJiBuYXRpdmVGb2N1c0lzUGx1Z2luKCkpIHsKKyAgICAgICAgICAgIGlmIChtTmF0aXZlQ2xhc3MgIT0gMCAmJiBuYXRpdmVQYWdlU2hvdWxkSGFuZGxlU2hpZnRBbmRBcnJvd3MoKSkgewogICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBsZXRQbHVnaW5IYW5kbGVOYXZLZXkoc2VsZWN0S2V5Q29kZSwgdGltZSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIGxldFBhZ2VIYW5kbGVOYXZLZXkoc2VsZWN0S2V5Q29kZSwgdGltZSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGxldFBsdWdpbkhhbmRsZU5hdktleShzZWxlY3RLZXlDb2RlLCB0aW1lLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgbGV0UGFnZUhhbmRsZU5hdktleShzZWxlY3RLZXlDb2RlLCB0aW1lLCBmYWxzZSk7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKG5hdkhhbmRsZWRLZXkoc2VsZWN0S2V5Q29kZSwgY291bnQsIGZhbHNlLCB0aW1lKSkgewogICAgICAgICAgICAgICAgIHBsYXlTb3VuZEVmZmVjdChrZXlDb2RlVG9Tb3VuZHNFZmZlY3Qoc2VsZWN0S2V5Q29kZSkpOwogICAgICAgICAgICAgfQpAQCAtNTY0Miw2ICs1NjYzLDE5IEBACiAgICAgICAgICAgICAgICAgLSBnZXRWaWV3SGVpZ2h0V2l0aFRpdGxlKCksIDApOwogICAgIH0KIAorICAgIGJvb2xlYW4gdXBkYXRlU2Nyb2xsQ29vcmRpbmF0ZXMoaW50IHgsIGludCB5KSB7CisgICAgICAgIGludCBvbGRYID0gbVNjcm9sbFg7CisgICAgICAgIGludCBvbGRZID0gbVNjcm9sbFk7CisgICAgICAgIG1TY3JvbGxYID0geDsKKyAgICAgICAgbVNjcm9sbFkgPSB5OworICAgICAgICBpZiAob2xkWCAhPSBtU2Nyb2xsWCB8fCBvbGRZICE9IG1TY3JvbGxZKSB7CisgICAgICAgICAgICBvblNjcm9sbENoYW5nZWQobVNjcm9sbFgsIG1TY3JvbGxZLCBvbGRYLCBvbGRZKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCiAgICAgcHVibGljIHZvaWQgZmxpbmdTY3JvbGwoaW50IHZ4LCBpbnQgdnkpIHsKICAgICAgICAgbVNjcm9sbGVyLmZsaW5nKG1TY3JvbGxYLCBtU2Nyb2xsWSwgdngsIHZ5LCAwLCBjb21wdXRlTWF4U2Nyb2xsWCgpLCAwLAogICAgICAgICAgICAgICAgIGNvbXB1dGVNYXhTY3JvbGxZKCkpOwpAQCAtNTY3NywxMyArNTcxMSwxNiBAQAogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgICAgIGZsb2F0IGN1cnJlbnRWZWxvY2l0eSA9IG1TY3JvbGxlci5nZXRDdXJyVmVsb2NpdHkoKTsKLSAgICAgICAgaWYgKG1MYXN0VmVsb2NpdHkgPiAwICYmIGN1cnJlbnRWZWxvY2l0eSA+IDApIHsKKyAgICAgICAgZmxvYXQgdmVsb2NpdHkgPSAoZmxvYXQpIE1hdGguaHlwb3QodngsIHZ5KTsKKyAgICAgICAgaWYgKG1MYXN0VmVsb2NpdHkgPiAwICYmIGN1cnJlbnRWZWxvY2l0eSA+IDAgJiYgdmVsb2NpdHkKKyAgICAgICAgICAgICAgICA+IG1MYXN0VmVsb2NpdHkgKiBNSU5JTVVNX1ZFTE9DSVRZX1JBVElPX0ZPUl9BQ0NFTEVSQVRJT04pIHsKICAgICAgICAgICAgIGZsb2F0IGRlbHRhUiA9IChmbG9hdCkgKE1hdGguYWJzKE1hdGguYXRhbjIobUxhc3RWZWxZLCBtTGFzdFZlbFgpCiAgICAgICAgICAgICAgICAgICAgIC0gTWF0aC5hdGFuMih2eSwgdngpKSk7CiAgICAgICAgICAgICBmaW5hbCBmbG9hdCBjaXJjbGUgPSAoZmxvYXQpIChNYXRoLlBJKSAqIDIuMGY7CiAgICAgICAgICAgICBpZiAoZGVsdGFSID4gY2lyY2xlICogMC45ZiB8fCBkZWx0YVIgPCBjaXJjbGUgKiAwLjFmKSB7CiAgICAgICAgICAgICAgICAgdnggKz0gY3VycmVudFZlbG9jaXR5ICogbUxhc3RWZWxYIC8gbUxhc3RWZWxvY2l0eTsKICAgICAgICAgICAgICAgICB2eSArPSBjdXJyZW50VmVsb2NpdHkgKiBtTGFzdFZlbFkgLyBtTGFzdFZlbG9jaXR5OworICAgICAgICAgICAgICAgIHZlbG9jaXR5ID0gKGZsb2F0KSBNYXRoLmh5cG90KHZ4LCB2eSk7CiAgICAgICAgICAgICAgICAgaWYgKERlYnVnRmxhZ3MuV0VCX1ZJRVcpIHsKICAgICAgICAgICAgICAgICAgICAgTG9nLnYoTE9HVEFHLCAiZG9GbGluZyB2eD0gIiArIHZ4ICsgIiB2eT0iICsgdnkpOwogICAgICAgICAgICAgICAgIH0KQEAgLTU2OTksNDUgKzU3MzYsMTUgQEAKICAgICAgICAgfQogICAgICAgICBtTGFzdFZlbFggPSB2eDsKICAgICAgICAgbUxhc3RWZWxZID0gdnk7Ci0gICAgICAgIG1MYXN0VmVsb2NpdHkgPSAoZmxvYXQpIE1hdGguaHlwb3QodngsIHZ5KTsKKyAgICAgICAgbUxhc3RWZWxvY2l0eSA9IHZlbG9jaXR5OwogCiAgICAgICAgIG1TY3JvbGxlci5mbGluZyhtU2Nyb2xsWCwgbVNjcm9sbFksIC12eCwgLXZ5LCAwLCBtYXhYLCAwLCBtYXhZKTsKLSAgICAgICAgLy8gVE9ETzogZHVyYXRpb24gaXMgY2FsY3VsYXRlZCBiYXNlZCBvbiB2ZWxvY2l0eSwgaWYgdGhlIHJhbmdlIGlzCi0gICAgICAgIC8vIHNtYWxsLCB0aGUgYW5pbWF0aW9uIHdpbGwgc3RvcCBiZWZvcmUgZHVyYXRpb24gaXMgdXAuIFdlIG1heQotICAgICAgICAvLyB3YW50IHRvIGNhbGN1bGF0ZSBob3cgbG9uZyB0aGUgYW5pbWF0aW9uIGlzIGdvaW5nIHRvIHJ1biB0byBwcmVjaXNlbHkKLSAgICAgICAgLy8gcmVzdW1lIHRoZSB3ZWJjb3JlIHVwZGF0ZS4KICAgICAgICAgZmluYWwgaW50IHRpbWUgPSBtU2Nyb2xsZXIuZ2V0RHVyYXRpb24oKTsKICAgICAgICAgbVByaXZhdGVIYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2VEZWxheWVkKFJFU1VNRV9XRUJDT1JFX1BSSU9SSVRZLCB0aW1lKTsKICAgICAgICAgYXdha2VuU2Nyb2xsQmFycyh0aW1lKTsKICAgICAgICAgaW52YWxpZGF0ZSgpOwogICAgIH0KIAotICAgIHByaXZhdGUgYm9vbGVhbiB6b29tV2l0aFByZXZpZXcoZmxvYXQgc2NhbGUsIGJvb2xlYW4gdXBkYXRlVGV4dFdyYXBTY2FsZSkgewotICAgICAgICBmbG9hdCBvbGRTY2FsZSA9IG1BY3R1YWxTY2FsZTsKLSAgICAgICAgbUluaXRpYWxTY3JvbGxYID0gbVNjcm9sbFg7Ci0gICAgICAgIG1Jbml0aWFsU2Nyb2xsWSA9IG1TY3JvbGxZOwotCi0gICAgICAgIC8vIHNuYXAgdG8gREVGQVVMVF9TQ0FMRSBpZiBpdCBpcyBjbG9zZQotICAgICAgICBpZiAoTWF0aC5hYnMoc2NhbGUgLSBtRGVmYXVsdFNjYWxlKSA8IE1JTklNVU1fU0NBTEVfSU5DUkVNRU5UKSB7Ci0gICAgICAgICAgICBzY2FsZSA9IG1EZWZhdWx0U2NhbGU7Ci0gICAgICAgIH0KLQotICAgICAgICBzZXROZXdab29tU2NhbGUoc2NhbGUsIHVwZGF0ZVRleHRXcmFwU2NhbGUsIGZhbHNlKTsKLQotICAgICAgICBpZiAob2xkU2NhbGUgIT0gbUFjdHVhbFNjYWxlKSB7Ci0gICAgICAgICAgICAvLyB1c2UgbVpvb21QaWNrZXJTY2FsZSB0byBzZWUgem9vbSBwcmV2aWV3IGZpcnN0Ci0gICAgICAgICAgICBtWm9vbVN0YXJ0ID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICBtSW52SW5pdGlhbFpvb21TY2FsZSA9IDEuMGYgLyBvbGRTY2FsZTsKLSAgICAgICAgICAgIG1JbnZGaW5hbFpvb21TY2FsZSA9IDEuMGYgLyBtQWN0dWFsU2NhbGU7Ci0gICAgICAgICAgICBtWm9vbVNjYWxlID0gbUFjdHVhbFNjYWxlOwotICAgICAgICAgICAgV2ViVmlld0NvcmUucGF1c2VVcGRhdGVQaWN0dXJlKG1XZWJWaWV3Q29yZSk7Ci0gICAgICAgICAgICBpbnZhbGlkYXRlKCk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQogICAgIC8qKgogICAgICAqIFJldHVybnMgYSB2aWV3IGNvbnRhaW5pbmcgem9vbSBjb250cm9scyBpLmUuICsvLSBidXR0b25zLiBUaGUgY2FsbGVyIGlzCiAgICAgICogaW4gY2hhcmdlIG9mIGluc3RhbGxpbmcgdGhpcyB2aWV3IHRvIHRoZSB2aWV3IGhpZXJhcmNoeS4gVGhpcyB2aWV3IHdpbGwKQEAgLTU3NTcsODEgKzU3NjQsMjkgQEAKICAgICAgICAgICAgIExvZy53KExPR1RBRywgIlRoaXMgV2ViVmlldyBkb2Vzbid0IHN1cHBvcnQgem9vbS4iKTsKICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICB9Ci0gICAgICAgIGlmIChtWm9vbUNvbnRyb2xzID09IG51bGwpIHsKLSAgICAgICAgICAgIG1ab29tQ29udHJvbHMgPSBjcmVhdGVab29tQ29udHJvbHMoKTsKLQotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIG5lZWQgdG8gYmUgc2V0IHRvIFZJU0lCTEUgZmlyc3Qgc28gdGhhdCBnZXRNZWFzdXJlZEhlaWdodCgpIGluCi0gICAgICAgICAgICAgKiB7QGxpbmsgI29uU2l6ZUNoYW5nZWQoKX0gY2FuIHJldHVybiB0aGUgbWVhc3VyZWQgdmFsdWUgZm9yIHByb3BlcgotICAgICAgICAgICAgICogbGF5b3V0LgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBtWm9vbUNvbnRyb2xzLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgIG1ab29tQ29udHJvbFJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLQotICAgICAgICAgICAgICAgICAgICAvKiBEb24ndCBkaXNtaXNzIHRoZSBjb250cm9scyBpZiB0aGUgdXNlciBoYXMKLSAgICAgICAgICAgICAgICAgICAgICogZm9jdXMgb24gdGhlbS4gV2FpdCBhbmQgY2hlY2sgYWdhaW4gbGF0ZXIuCi0gICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICBpZiAoIW1ab29tQ29udHJvbHMuaGFzRm9jdXMoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbVpvb21Db250cm9scy5oaWRlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtUHJpdmF0ZUhhbmRsZXIucmVtb3ZlQ2FsbGJhY2tzKG1ab29tQ29udHJvbFJ1bm5hYmxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5wb3N0RGVsYXllZChtWm9vbUNvbnRyb2xSdW5uYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWk9PTV9DT05UUk9MU19USU1FT1VUKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH07Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1ab29tQ29udHJvbHM7CisgICAgICAgIHJldHVybiBtWm9vbU1hbmFnZXIuZ2V0RXh0ZXJuYWxab29tUGlja2VyKCk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBFeHRlbmRlZFpvb21Db250cm9scyBjcmVhdGVab29tQ29udHJvbHMoKSB7Ci0gICAgICAgIEV4dGVuZGVkWm9vbUNvbnRyb2xzIHpvb21Db250cm9scyA9IG5ldyBFeHRlbmRlZFpvb21Db250cm9scyhtQ29udGV4dAotICAgICAgICAgICAgLCBudWxsKTsKLSAgICAgICAgem9vbUNvbnRyb2xzLnNldE9uWm9vbUluQ2xpY2tMaXN0ZW5lcihuZXcgT25DbGlja0xpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKLSAgICAgICAgICAgICAgICAvLyByZXNldCB0aW1lIG91dAotICAgICAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5yZW1vdmVDYWxsYmFja3MobVpvb21Db250cm9sUnVubmFibGUpOwotICAgICAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5wb3N0RGVsYXllZChtWm9vbUNvbnRyb2xSdW5uYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFpPT01fQ09OVFJPTFNfVElNRU9VVCk7Ci0gICAgICAgICAgICAgICAgem9vbUluKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICB6b29tQ29udHJvbHMuc2V0T25ab29tT3V0Q2xpY2tMaXN0ZW5lcihuZXcgT25DbGlja0xpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKLSAgICAgICAgICAgICAgICAvLyByZXNldCB0aW1lIG91dAotICAgICAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5yZW1vdmVDYWxsYmFja3MobVpvb21Db250cm9sUnVubmFibGUpOwotICAgICAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5wb3N0RGVsYXllZChtWm9vbUNvbnRyb2xSdW5uYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFpPT01fQ09OVFJPTFNfVElNRU9VVCk7Ci0gICAgICAgICAgICAgICAgem9vbU91dCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgcmV0dXJuIHpvb21Db250cm9sczsKKyAgICB2b2lkIGRpc21pc3Nab29tQ29udHJvbCgpIHsKKyAgICAgICAgbVpvb21NYW5hZ2VyLmRpc21pc3Nab29tUGlja2VyKCk7CisgICAgfQorCisgICAgZmxvYXQgZ2V0RGVmYXVsdFpvb21TY2FsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1ab29tTWFuYWdlci5nZXREZWZhdWx0U2NhbGUoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB7QGxpbmsgWm9vbUJ1dHRvbnNDb250cm9sbGVyfSB3aGljaCBjYW4gYmUgdXNlZCB0byBhZGQKLSAgICAgKiBhZGRpdGlvbmFsIGJ1dHRvbnMgdG8gdGhlIHpvb20gY29udHJvbHMgd2luZG93LgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgaW5zdGFuY2Ugb2Yge0BsaW5rIFpvb21CdXR0b25zQ29udHJvbGxlcn0gdXNlZCBieSB0aGlzIGNsYXNzLAotICAgICAqICAgICAgICAgb3IgbnVsbCBpZiBpdCBpcyB1bmF2YWlsYWJsZS4KLSAgICAgKiBAaGlkZQorICAgICAqIEByZXR1cm4gVFJVRSBpZiB0aGUgV2ViVmlldyBjYW4gYmUgem9vbWVkIGluLgogICAgICAqLwotICAgIHB1YmxpYyBab29tQnV0dG9uc0NvbnRyb2xsZXIgZ2V0Wm9vbUJ1dHRvbnNDb250cm9sbGVyKCkgewotICAgICAgICBpZiAobVpvb21CdXR0b25zQ29udHJvbGxlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtWm9vbUJ1dHRvbnNDb250cm9sbGVyID0gbmV3IFpvb21CdXR0b25zQ29udHJvbGxlcih0aGlzKTsKLSAgICAgICAgICAgIG1ab29tQnV0dG9uc0NvbnRyb2xsZXIuc2V0T25ab29tTGlzdGVuZXIobVpvb21MaXN0ZW5lcik7Ci0gICAgICAgICAgICAvLyBab29tQnV0dG9uc0NvbnRyb2xsZXIgcG9zaXRpb25zIHRoZSBidXR0b25zIGF0IHRoZSBib3R0b20sIGJ1dCBpbgotICAgICAgICAgICAgLy8gdGhlIG1pZGRsZS4gQ2hhbmdlIHRoZWlyIGxheW91dCBwYXJhbWV0ZXJzIHNvIHRoZXkgYXBwZWFyIG9uIHRoZQotICAgICAgICAgICAgLy8gcmlnaHQuCi0gICAgICAgICAgICBWaWV3IGNvbnRyb2xzID0gbVpvb21CdXR0b25zQ29udHJvbGxlci5nZXRab29tQ29udHJvbHMoKTsKLSAgICAgICAgICAgIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMgcGFyYW1zID0gY29udHJvbHMuZ2V0TGF5b3V0UGFyYW1zKCk7Ci0gICAgICAgICAgICBpZiAocGFyYW1zIGluc3RhbmNlb2YgRnJhbWVMYXlvdXQuTGF5b3V0UGFyYW1zKSB7Ci0gICAgICAgICAgICAgICAgRnJhbWVMYXlvdXQuTGF5b3V0UGFyYW1zIGZyYW1lUGFyYW1zID0gKEZyYW1lTGF5b3V0LkxheW91dFBhcmFtcykgcGFyYW1zOwotICAgICAgICAgICAgICAgIGZyYW1lUGFyYW1zLmdyYXZpdHkgPSBHcmF2aXR5LlJJR0hUOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtWm9vbUJ1dHRvbnNDb250cm9sbGVyOworICAgIHB1YmxpYyBib29sZWFuIGNhblpvb21JbigpIHsKKyAgICAgICAgcmV0dXJuIG1ab29tTWFuYWdlci5jYW5ab29tSW4oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFRSVUUgaWYgdGhlIFdlYlZpZXcgY2FuIGJlIHpvb21lZCBvdXQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gY2FuWm9vbU91dCgpIHsKKyAgICAgICAgcmV0dXJuIG1ab29tTWFuYWdlci5jYW5ab29tT3V0KCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC01ODM5LDE1ICs1Nzk0LDcgQEAKICAgICAgKiBAcmV0dXJuIFRSVUUgaWYgem9vbSBpbiBzdWNjZWVkcy4gRkFMU0UgaWYgbm8gem9vbSBjaGFuZ2VzLgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIHpvb21JbigpIHsKLSAgICAgICAgLy8gVE9ETzogYWx0ZXJuYXRpdmVseSB3ZSBjYW4gZGlzYWxsb3cgdGhpcyBkdXJpbmcgZHJhdyBoaXN0b3J5IG1vZGUKLSAgICAgICAgc3dpdGNoT3V0RHJhd0hpc3RvcnkoKTsKLSAgICAgICAgbUluWm9vbU92ZXJ2aWV3ID0gZmFsc2U7Ci0gICAgICAgIC8vIENlbnRlciB6b29taW5nIHRvIHRoZSBjZW50ZXIgb2YgdGhlIHNjcmVlbi4KLSAgICAgICAgbVpvb21DZW50ZXJYID0gZ2V0Vmlld1dpZHRoKCkgKiAuNWY7Ci0gICAgICAgIG1ab29tQ2VudGVyWSA9IGdldFZpZXdIZWlnaHQoKSAqIC41ZjsKLSAgICAgICAgbUFuY2hvclggPSB2aWV3VG9Db250ZW50WCgoaW50KSBtWm9vbUNlbnRlclggKyBtU2Nyb2xsWCk7Ci0gICAgICAgIG1BbmNob3JZID0gdmlld1RvQ29udGVudFkoKGludCkgbVpvb21DZW50ZXJZICsgbVNjcm9sbFkpOwotICAgICAgICByZXR1cm4gem9vbVdpdGhQcmV2aWV3KG1BY3R1YWxTY2FsZSAqIDEuMjVmLCB0cnVlKTsKKyAgICAgICAgcmV0dXJuIG1ab29tTWFuYWdlci56b29tSW4oKTsKICAgICB9CiAKICAgICAvKioKQEAgLTU4NTUsMTQgKzU4MDIsNyBAQAogICAgICAqIEByZXR1cm4gVFJVRSBpZiB6b29tIG91dCBzdWNjZWVkcy4gRkFMU0UgaWYgbm8gem9vbSBjaGFuZ2VzLgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIHpvb21PdXQoKSB7Ci0gICAgICAgIC8vIFRPRE86IGFsdGVybmF0aXZlbHkgd2UgY2FuIGRpc2FsbG93IHRoaXMgZHVyaW5nIGRyYXcgaGlzdG9yeSBtb2RlCi0gICAgICAgIHN3aXRjaE91dERyYXdIaXN0b3J5KCk7Ci0gICAgICAgIC8vIENlbnRlciB6b29taW5nIHRvIHRoZSBjZW50ZXIgb2YgdGhlIHNjcmVlbi4KLSAgICAgICAgbVpvb21DZW50ZXJYID0gZ2V0Vmlld1dpZHRoKCkgKiAuNWY7Ci0gICAgICAgIG1ab29tQ2VudGVyWSA9IGdldFZpZXdIZWlnaHQoKSAqIC41ZjsKLSAgICAgICAgbUFuY2hvclggPSB2aWV3VG9Db250ZW50WCgoaW50KSBtWm9vbUNlbnRlclggKyBtU2Nyb2xsWCk7Ci0gICAgICAgIG1BbmNob3JZID0gdmlld1RvQ29udGVudFkoKGludCkgbVpvb21DZW50ZXJZICsgbVNjcm9sbFkpOwotICAgICAgICByZXR1cm4gem9vbVdpdGhQcmV2aWV3KG1BY3R1YWxTY2FsZSAqIDAuOGYsIHRydWUpOworICAgICAgICByZXR1cm4gbVpvb21NYW5hZ2VyLnpvb21PdXQoKTsKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgdXBkYXRlU2VsZWN0aW9uKCkgewpAQCAtNTk2Myw3ICs1OTAzLDE0IEBACiAgICAgICAgIC8vIG1MYXN0VG91Y2hYIGFuZCBtTGFzdFRvdWNoWSBhcmUgdGhlIHBvaW50IGluIHRoZSBjdXJyZW50IHZpZXdwb3J0CiAgICAgICAgIGludCBjb250ZW50WCA9IHZpZXdUb0NvbnRlbnRYKChpbnQpIG1MYXN0VG91Y2hYICsgbVNjcm9sbFgpOwogICAgICAgICBpbnQgY29udGVudFkgPSB2aWV3VG9Db250ZW50WSgoaW50KSBtTGFzdFRvdWNoWSArIG1TY3JvbGxZKTsKLSAgICAgICAgaWYgKG5hdGl2ZVBvaW50SW5OYXZDYWNoZShjb250ZW50WCwgY29udGVudFksIG1OYXZTbG9wKSkgeworICAgICAgICBpZiAoZ2V0U2V0dGluZ3MoKS5zdXBwb3J0VG91Y2hPbmx5KCkpIHsKKyAgICAgICAgICAgIHJlbW92ZVRvdWNoSGlnaGxpZ2h0KGZhbHNlKTsKKyAgICAgICAgICAgIFdlYlZpZXdDb3JlLlRvdWNoVXBEYXRhIHRvdWNoVXBEYXRhID0gbmV3IFdlYlZpZXdDb3JlLlRvdWNoVXBEYXRhKCk7CisgICAgICAgICAgICAvLyB1c2UgIjAiIGFzIGdlbmVyYXRpb24gaWQgdG8gaW5mb3JtIFdlYktpdCB0byB1c2UgdGhlIHNhbWUgeC95IGFzCisgICAgICAgICAgICAvLyBpdCB1c2VkIHdoZW4gcHJvY2Vzc2luZyBHRVRfVE9VQ0hfSElHSExJR0hUX1JFQ1RTCisgICAgICAgICAgICB0b3VjaFVwRGF0YS5tTW92ZUdlbmVyYXRpb24gPSAwOworICAgICAgICAgICAgbVdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlKEV2ZW50SHViLlRPVUNIX1VQLCB0b3VjaFVwRGF0YSk7CisgICAgICAgIH0gZWxzZSBpZiAobmF0aXZlUG9pbnRJbk5hdkNhY2hlKGNvbnRlbnRYLCBjb250ZW50WSwgbU5hdlNsb3ApKSB7CiAgICAgICAgICAgICBXZWJWaWV3Q29yZS5Nb3Rpb25VcERhdGEgbW90aW9uVXBEYXRhID0gbmV3IFdlYlZpZXdDb3JlCiAgICAgICAgICAgICAgICAgICAgIC5Nb3Rpb25VcERhdGEoKTsKICAgICAgICAgICAgIG1vdGlvblVwRGF0YS5tRnJhbWUgPSBuYXRpdmVDYWNoZUhpdEZyYW1lUG9pbnRlcigpOwpAQCAtNTk5MSwyNyArNTkzOCwxNiBAQAogICAgICAqIFJldHVybiB0cnVlIGlmIHRoZSB2aWV3IChQbHVnaW4pIGlzIGZ1bGx5IHZpc2libGUgYW5kIG1heGltaXplZCBpbnNpZGUKICAgICAgKiB0aGUgV2ViVmlldy4KICAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNQbHVnaW5GaXRPblNjcmVlbihWaWV3TWFuYWdlci5DaGlsZFZpZXcgdmlldykgewotICAgICAgICBpbnQgdmlld1dpZHRoID0gZ2V0Vmlld1dpZHRoKCk7Ci0gICAgICAgIGludCB2aWV3SGVpZ2h0ID0gZ2V0Vmlld0hlaWdodFdpdGhUaXRsZSgpOwotICAgICAgICBmbG9hdCBzY2FsZSA9IE1hdGgubWluKChmbG9hdCkgdmlld1dpZHRoIC8gdmlldy53aWR0aCwKLSAgICAgICAgICAgICAgICAoZmxvYXQpIHZpZXdIZWlnaHQgLyB2aWV3LmhlaWdodCk7Ci0gICAgICAgIGlmIChzY2FsZSA8IG1NaW5ab29tU2NhbGUpIHsKLSAgICAgICAgICAgIHNjYWxlID0gbU1pblpvb21TY2FsZTsKLSAgICAgICAgfSBlbHNlIGlmIChzY2FsZSA+IG1NYXhab29tU2NhbGUpIHsKLSAgICAgICAgICAgIHNjYWxlID0gbU1heFpvb21TY2FsZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoTWF0aC5hYnMoc2NhbGUgLSBtQWN0dWFsU2NhbGUpIDwgTUlOSU1VTV9TQ0FMRV9JTkNSRU1FTlQpIHsKLSAgICAgICAgICAgIGlmIChjb250ZW50VG9WaWV3WCh2aWV3LngpID49IG1TY3JvbGxYCi0gICAgICAgICAgICAgICAgICAgICYmIGNvbnRlbnRUb1ZpZXdYKHZpZXcueCArIHZpZXcud2lkdGgpIDw9IG1TY3JvbGxYCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB2aWV3V2lkdGgKLSAgICAgICAgICAgICAgICAgICAgJiYgY29udGVudFRvVmlld1kodmlldy55KSA+PSBtU2Nyb2xsWQotICAgICAgICAgICAgICAgICAgICAmJiBjb250ZW50VG9WaWV3WSh2aWV3LnkgKyB2aWV3LmhlaWdodCkgPD0gbVNjcm9sbFkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHZpZXdIZWlnaHQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgYm9vbGVhbiBpc1BsdWdpbkZpdE9uU2NyZWVuKFZpZXdNYW5hZ2VyLkNoaWxkVmlldyB2aWV3KSB7CisgICAgICAgIGZpbmFsIGludCB2aWV3V2lkdGggPSBnZXRWaWV3V2lkdGgoKTsKKyAgICAgICAgZmluYWwgaW50IHZpZXdIZWlnaHQgPSBnZXRWaWV3SGVpZ2h0V2l0aFRpdGxlKCk7CisgICAgICAgIGZsb2F0IHNjYWxlID0gTWF0aC5taW4oKGZsb2F0KSB2aWV3V2lkdGggLyB2aWV3LndpZHRoLCAoZmxvYXQpIHZpZXdIZWlnaHQgLyB2aWV3LmhlaWdodCk7CisgICAgICAgIHNjYWxlID0gbVpvb21NYW5hZ2VyLmNvbXB1dGVTY2FsZVdpdGhMaW1pdHMoc2NhbGUpOworICAgICAgICByZXR1cm4gIW1ab29tTWFuYWdlci53aWxsU2NhbGVUcmlnZ2VyWm9vbShzY2FsZSkKKyAgICAgICAgICAgICAgICAmJiBjb250ZW50VG9WaWV3WCh2aWV3LngpID49IG1TY3JvbGxYCisgICAgICAgICAgICAgICAgJiYgY29udGVudFRvVmlld1godmlldy54ICsgdmlldy53aWR0aCkgPD0gbVNjcm9sbFggKyB2aWV3V2lkdGgKKyAgICAgICAgICAgICAgICAmJiBjb250ZW50VG9WaWV3WSh2aWV3LnkpID49IG1TY3JvbGxZCisgICAgICAgICAgICAgICAgJiYgY29udGVudFRvVmlld1kodmlldy55ICsgdmlldy5oZWlnaHQpIDw9IG1TY3JvbGxZICsgdmlld0hlaWdodDsKICAgICB9CiAKICAgICAvKgpAQCAtNjAyMCwyMiArNTk1NiwxOSBAQAogICAgICAqIGFuaW1hdGVkIHNjcm9sbCB0byBjZW50ZXIgaXQuIElmIHRoZSB6b29tIG5lZWRzIHRvIGJlIGNoYW5nZWQsIGZpbmQgdGhlCiAgICAgICogem9vbSBjZW50ZXIgYW5kIGRvIGEgc21vb3RoIHpvb20gdHJhbnNpdGlvbi4KICAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgY2VudGVyRml0UmVjdChpbnQgZG9jWCwgaW50IGRvY1ksIGludCBkb2NXaWR0aCwgaW50IGRvY0hlaWdodCkgeworICAgIHZvaWQgY2VudGVyRml0UmVjdChpbnQgZG9jWCwgaW50IGRvY1ksIGludCBkb2NXaWR0aCwgaW50IGRvY0hlaWdodCkgewogICAgICAgICBpbnQgdmlld1dpZHRoID0gZ2V0Vmlld1dpZHRoKCk7CiAgICAgICAgIGludCB2aWV3SGVpZ2h0ID0gZ2V0Vmlld0hlaWdodFdpdGhUaXRsZSgpOwogICAgICAgICBmbG9hdCBzY2FsZSA9IE1hdGgubWluKChmbG9hdCkgdmlld1dpZHRoIC8gZG9jV2lkdGgsIChmbG9hdCkgdmlld0hlaWdodAogICAgICAgICAgICAgICAgIC8gZG9jSGVpZ2h0KTsKLSAgICAgICAgaWYgKHNjYWxlIDwgbU1pblpvb21TY2FsZSkgewotICAgICAgICAgICAgc2NhbGUgPSBtTWluWm9vbVNjYWxlOwotICAgICAgICB9IGVsc2UgaWYgKHNjYWxlID4gbU1heFpvb21TY2FsZSkgewotICAgICAgICAgICAgc2NhbGUgPSBtTWF4Wm9vbVNjYWxlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChNYXRoLmFicyhzY2FsZSAtIG1BY3R1YWxTY2FsZSkgPCBNSU5JTVVNX1NDQUxFX0lOQ1JFTUVOVCkgeworICAgICAgICBzY2FsZSA9IG1ab29tTWFuYWdlci5jb21wdXRlU2NhbGVXaXRoTGltaXRzKHNjYWxlKTsKKyAgICAgICAgaWYgKCFtWm9vbU1hbmFnZXIud2lsbFNjYWxlVHJpZ2dlclpvb20oc2NhbGUpKSB7CiAgICAgICAgICAgICBwaW5TY3JvbGxUbyhjb250ZW50VG9WaWV3WChkb2NYICsgZG9jV2lkdGggLyAyKSAtIHZpZXdXaWR0aCAvIDIsCiAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRUb1ZpZXdZKGRvY1kgKyBkb2NIZWlnaHQgLyAyKSAtIHZpZXdIZWlnaHQgLyAyLAogICAgICAgICAgICAgICAgICAgICB0cnVlLCAwKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZsb2F0IG9sZFNjcmVlblggPSBkb2NYICogbUFjdHVhbFNjYWxlIC0gbVNjcm9sbFg7CisgICAgICAgICAgICBmbG9hdCBhY3R1YWxTY2FsZSA9IG1ab29tTWFuYWdlci5nZXRTY2FsZSgpOworICAgICAgICAgICAgZmxvYXQgb2xkU2NyZWVuWCA9IGRvY1ggKiBhY3R1YWxTY2FsZSAtIG1TY3JvbGxYOwogICAgICAgICAgICAgZmxvYXQgcmVjdFZpZXdYID0gZG9jWCAqIHNjYWxlOwogICAgICAgICAgICAgZmxvYXQgcmVjdFZpZXdXaWR0aCA9IGRvY1dpZHRoICogc2NhbGU7CiAgICAgICAgICAgICBmbG9hdCBuZXdNYXhXaWR0aCA9IG1Db250ZW50V2lkdGggKiBzY2FsZTsKQEAgLTYwNDYsOSArNTk3OSw5IEBACiAgICAgICAgICAgICB9IGVsc2UgaWYgKG5ld1NjcmVlblggPiAobmV3TWF4V2lkdGggLSByZWN0Vmlld1ggLSByZWN0Vmlld1dpZHRoKSkgewogICAgICAgICAgICAgICAgIG5ld1NjcmVlblggPSB2aWV3V2lkdGggLSAobmV3TWF4V2lkdGggLSByZWN0Vmlld1gpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgbVpvb21DZW50ZXJYID0gKG9sZFNjcmVlblggKiBzY2FsZSAtIG5ld1NjcmVlblggKiBtQWN0dWFsU2NhbGUpCi0gICAgICAgICAgICAgICAgICAgIC8gKHNjYWxlIC0gbUFjdHVhbFNjYWxlKTsKLSAgICAgICAgICAgIGZsb2F0IG9sZFNjcmVlblkgPSBkb2NZICogbUFjdHVhbFNjYWxlICsgZ2V0VGl0bGVIZWlnaHQoKQorICAgICAgICAgICAgZmxvYXQgem9vbUNlbnRlclggPSAob2xkU2NyZWVuWCAqIHNjYWxlIC0gbmV3U2NyZWVuWCAqIGFjdHVhbFNjYWxlKQorICAgICAgICAgICAgICAgICAgICAvIChzY2FsZSAtIGFjdHVhbFNjYWxlKTsKKyAgICAgICAgICAgIGZsb2F0IG9sZFNjcmVlblkgPSBkb2NZICogYWN0dWFsU2NhbGUgKyBnZXRUaXRsZUhlaWdodCgpCiAgICAgICAgICAgICAgICAgICAgIC0gbVNjcm9sbFk7CiAgICAgICAgICAgICBmbG9hdCByZWN0Vmlld1kgPSBkb2NZICogc2NhbGUgKyBnZXRUaXRsZUhlaWdodCgpOwogICAgICAgICAgICAgZmxvYXQgcmVjdFZpZXdIZWlnaHQgPSBkb2NIZWlnaHQgKiBzY2FsZTsKQEAgLTYwNjAsMTA5ICs1OTkzLDEwIEBACiAgICAgICAgICAgICB9IGVsc2UgaWYgKG5ld1NjcmVlblkgPiAobmV3TWF4SGVpZ2h0IC0gcmVjdFZpZXdZIC0gcmVjdFZpZXdIZWlnaHQpKSB7CiAgICAgICAgICAgICAgICAgbmV3U2NyZWVuWSA9IHZpZXdIZWlnaHQgLSAobmV3TWF4SGVpZ2h0IC0gcmVjdFZpZXdZKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1ab29tQ2VudGVyWSA9IChvbGRTY3JlZW5ZICogc2NhbGUgLSBuZXdTY3JlZW5ZICogbUFjdHVhbFNjYWxlKQotICAgICAgICAgICAgICAgICAgICAvIChzY2FsZSAtIG1BY3R1YWxTY2FsZSk7Ci0gICAgICAgICAgICB6b29tV2l0aFByZXZpZXcoc2NhbGUsIGZhbHNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgZGlzbWlzc1pvb21Db250cm9sKCkgewotICAgICAgICBpZiAobVdlYlZpZXdDb3JlID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIG1heWJlIGNhbGxlZCBhZnRlciBXZWJWaWV3J3MgZGVzdHJveSgpLiBBcyB3ZSBjYW4ndCBnZXQgc2V0dGluZ3MsCi0gICAgICAgICAgICAvLyBqdXN0IGhpZGUgem9vbSBjb250cm9sIGZvciBib3RoIHN0eWxlcy4KLSAgICAgICAgICAgIGlmIChtWm9vbUJ1dHRvbnNDb250cm9sbGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtWm9vbUJ1dHRvbnNDb250cm9sbGVyLnNldFZpc2libGUoZmFsc2UpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1ab29tQ29udHJvbHMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1ab29tQ29udHJvbHMuaGlkZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIFdlYlNldHRpbmdzIHNldHRpbmdzID0gZ2V0U2V0dGluZ3MoKTsKLSAgICAgICAgaWYgKHNldHRpbmdzLmdldEJ1aWx0SW5ab29tQ29udHJvbHMoKSkgewotICAgICAgICAgICAgaWYgKG1ab29tQnV0dG9uc0NvbnRyb2xsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1ab29tQnV0dG9uc0NvbnRyb2xsZXIuc2V0VmlzaWJsZShmYWxzZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAobVpvb21Db250cm9sUnVubmFibGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5yZW1vdmVDYWxsYmFja3MobVpvb21Db250cm9sUnVubmFibGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1ab29tQ29udHJvbHMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1ab29tQ29udHJvbHMuaGlkZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gUnVsZSBmb3IgZG91YmxlIHRhcDoKLSAgICAvLyAxLiBpZiB0aGUgY3VycmVudCBzY2FsZSBpcyBub3Qgc2FtZSBhcyB0aGUgdGV4dCB3cmFwIHNjYWxlIGFuZCBsYXlvdXQKLSAgICAvLyAgICBhbGdvcml0aG0gaXMgTkFSUk9XX0NPTFVNTlMsIGZpdCB0byBjb2x1bW47Ci0gICAgLy8gMi4gaWYgdGhlIGN1cnJlbnQgc3RhdGUgaXMgbm90IG92ZXJ2aWV3IG1vZGUsIGNoYW5nZSB0byBvdmVydmlldyBtb2RlOwotICAgIC8vIDMuIGlmIHRoZSBjdXJyZW50IHN0YXRlIGlzIG92ZXJ2aWV3IG1vZGUsIGNoYW5nZSB0byBkZWZhdWx0IHNjYWxlLgotICAgIHByaXZhdGUgdm9pZCBkb0RvdWJsZVRhcCgpIHsKLSAgICAgICAgaWYgKG1XZWJWaWV3Q29yZS5nZXRTZXR0aW5ncygpLmdldFVzZVdpZGVWaWV3UG9ydCgpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgbVpvb21DZW50ZXJYID0gbUxhc3RUb3VjaFg7Ci0gICAgICAgIG1ab29tQ2VudGVyWSA9IG1MYXN0VG91Y2hZOwotICAgICAgICBtQW5jaG9yWCA9IHZpZXdUb0NvbnRlbnRYKChpbnQpIG1ab29tQ2VudGVyWCArIG1TY3JvbGxYKTsKLSAgICAgICAgbUFuY2hvclkgPSB2aWV3VG9Db250ZW50WSgoaW50KSBtWm9vbUNlbnRlclkgKyBtU2Nyb2xsWSk7Ci0gICAgICAgIFdlYlNldHRpbmdzIHNldHRpbmdzID0gZ2V0U2V0dGluZ3MoKTsKLSAgICAgICAgc2V0dGluZ3Muc2V0RG91YmxlVGFwVG9hc3RDb3VudCgwKTsKLSAgICAgICAgLy8gcmVtb3ZlIHRoZSB6b29tIGNvbnRyb2wgYWZ0ZXIgZG91YmxlIHRhcAotICAgICAgICBkaXNtaXNzWm9vbUNvbnRyb2woKTsKLSAgICAgICAgVmlld01hbmFnZXIuQ2hpbGRWaWV3IHBsdWdpbiA9IG1WaWV3TWFuYWdlci5oaXRUZXN0KG1BbmNob3JYLCBtQW5jaG9yWSk7Ci0gICAgICAgIGlmIChwbHVnaW4gIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGlzUGx1Z2luRml0T25TY3JlZW4ocGx1Z2luKSkgewotICAgICAgICAgICAgICAgIG1Jblpvb21PdmVydmlldyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgLy8gRm9yY2UgdGhlIHRpdGxlYmFyIGZ1bGx5IHJldmVhbCBpbiBvdmVydmlldyBtb2RlCi0gICAgICAgICAgICAgICAgaWYgKG1TY3JvbGxZIDwgZ2V0VGl0bGVIZWlnaHQoKSkgbVNjcm9sbFkgPSAwOwotICAgICAgICAgICAgICAgIHpvb21XaXRoUHJldmlldygoZmxvYXQpIGdldFZpZXdXaWR0aCgpIC8gbVpvb21PdmVydmlld1dpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1Jblpvb21PdmVydmlldyA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGNlbnRlckZpdFJlY3QocGx1Z2luLngsIHBsdWdpbi55LCBwbHVnaW4ud2lkdGgsIHBsdWdpbi5oZWlnaHQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGJvb2xlYW4gem9vbVRvRGVmYXVsdCA9IGZhbHNlOwotICAgICAgICBpZiAoKHNldHRpbmdzLmdldExheW91dEFsZ29yaXRobSgpID09IFdlYlNldHRpbmdzLkxheW91dEFsZ29yaXRobS5OQVJST1dfQ09MVU1OUykKLSAgICAgICAgICAgICAgICAmJiAoTWF0aC5hYnMobUFjdHVhbFNjYWxlIC0gbVRleHRXcmFwU2NhbGUpID49IE1JTklNVU1fU0NBTEVfSU5DUkVNRU5UKSkgewotICAgICAgICAgICAgc2V0TmV3Wm9vbVNjYWxlKG1BY3R1YWxTY2FsZSwgdHJ1ZSwgdHJ1ZSk7Ci0gICAgICAgICAgICBmbG9hdCBvdmVydmlld1NjYWxlID0gKGZsb2F0KSBnZXRWaWV3V2lkdGgoKSAvIG1ab29tT3ZlcnZpZXdXaWR0aDsKLSAgICAgICAgICAgIGlmIChNYXRoLmFicyhtQWN0dWFsU2NhbGUgLSBvdmVydmlld1NjYWxlKSA8IE1JTklNVU1fU0NBTEVfSU5DUkVNRU5UKSB7Ci0gICAgICAgICAgICAgICAgbUluWm9vbU92ZXJ2aWV3ID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmICghbUluWm9vbU92ZXJ2aWV3KSB7Ci0gICAgICAgICAgICBmbG9hdCBuZXdTY2FsZSA9IChmbG9hdCkgZ2V0Vmlld1dpZHRoKCkgLyBtWm9vbU92ZXJ2aWV3V2lkdGg7Ci0gICAgICAgICAgICBpZiAoTWF0aC5hYnMobUFjdHVhbFNjYWxlIC0gbmV3U2NhbGUpID49IE1JTklNVU1fU0NBTEVfSU5DUkVNRU5UKSB7Ci0gICAgICAgICAgICAgICAgbUluWm9vbU92ZXJ2aWV3ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAvLyBGb3JjZSB0aGUgdGl0bGViYXIgZnVsbHkgcmV2ZWFsIGluIG92ZXJ2aWV3IG1vZGUKLSAgICAgICAgICAgICAgICBpZiAobVNjcm9sbFkgPCBnZXRUaXRsZUhlaWdodCgpKSBtU2Nyb2xsWSA9IDA7Ci0gICAgICAgICAgICAgICAgem9vbVdpdGhQcmV2aWV3KG5ld1NjYWxlLCB0cnVlKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoTWF0aC5hYnMobUFjdHVhbFNjYWxlIC0gbURlZmF1bHRTY2FsZSkgPj0gTUlOSU1VTV9TQ0FMRV9JTkNSRU1FTlQpIHsKLSAgICAgICAgICAgICAgICB6b29tVG9EZWZhdWx0ID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHpvb21Ub0RlZmF1bHQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmICh6b29tVG9EZWZhdWx0KSB7Ci0gICAgICAgICAgICBtSW5ab29tT3ZlcnZpZXcgPSBmYWxzZTsKLSAgICAgICAgICAgIGludCBsZWZ0ID0gbmF0aXZlR2V0QmxvY2tMZWZ0RWRnZShtQW5jaG9yWCwgbUFuY2hvclksIG1BY3R1YWxTY2FsZSk7Ci0gICAgICAgICAgICBpZiAobGVmdCAhPSBOT19MRUZURURHRSkgewotICAgICAgICAgICAgICAgIC8vIGFkZCBhIDVwdCBwYWRkaW5nIHRvIHRoZSBsZWZ0IGVkZ2UuCi0gICAgICAgICAgICAgICAgaW50IHZpZXdMZWZ0ID0gY29udGVudFRvVmlld1gobGVmdCA8IDUgPyAwIDogKGxlZnQgLSA1KSkKLSAgICAgICAgICAgICAgICAgICAgICAgIC0gbVNjcm9sbFg7Ci0gICAgICAgICAgICAgICAgLy8gUmUtY2FsY3VsYXRlIHRoZSB6b29tIGNlbnRlciBzbyB0aGF0IHRoZSBuZXcgc2Nyb2xsIHggd2lsbCBiZQotICAgICAgICAgICAgICAgIC8vIG9uIHRoZSBsZWZ0IGVkZ2UuCi0gICAgICAgICAgICAgICAgaWYgKHZpZXdMZWZ0ID4gMCkgewotICAgICAgICAgICAgICAgICAgICBtWm9vbUNlbnRlclggPSB2aWV3TGVmdCAqIG1EZWZhdWx0U2NhbGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIChtRGVmYXVsdFNjYWxlIC0gbUFjdHVhbFNjYWxlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBzY3JvbGxCeSh2aWV3TGVmdCwgMCk7Ci0gICAgICAgICAgICAgICAgICAgIG1ab29tQ2VudGVyWCA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgem9vbVdpdGhQcmV2aWV3KG1EZWZhdWx0U2NhbGUsIHRydWUpOworICAgICAgICAgICAgZmxvYXQgem9vbUNlbnRlclkgPSAob2xkU2NyZWVuWSAqIHNjYWxlIC0gbmV3U2NyZWVuWSAqIGFjdHVhbFNjYWxlKQorICAgICAgICAgICAgICAgICAgICAvIChzY2FsZSAtIGFjdHVhbFNjYWxlKTsKKyAgICAgICAgICAgIG1ab29tTWFuYWdlci5zZXRab29tQ2VudGVyKHpvb21DZW50ZXJYLCB6b29tQ2VudGVyWSk7CisgICAgICAgICAgICBtWm9vbU1hbmFnZXIuc3RhcnRab29tQW5pbWF0aW9uKHNjYWxlLCBmYWxzZSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTYxNzQsNiArNjAwOCw5IEBACiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiByZXF1ZXN0Rm9jdXMoaW50IGRpcmVjdGlvbiwgUmVjdCBwcmV2aW91c2x5Rm9jdXNlZFJlY3QpIHsKKyAgICAgICAgLy8gRklYTUU6IElmIGEgc3Vid2luZG93IGlzIHNob3dpbmcgZmluZCwgYW5kIHRoZSB1c2VyIHRvdWNoZXMgdGhlCisgICAgICAgIC8vIGJhY2tncm91bmQgd2luZG93LCBpdCBjYW4gc3RlYWwgZm9jdXMuCisgICAgICAgIGlmIChtRmluZElzVXApIHJldHVybiBmYWxzZTsKICAgICAgICAgYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKICAgICAgICAgaWYgKGluRWRpdGluZ01vZGUoKSkgewogICAgICAgICAgICAgcmVzdWx0ID0gbVdlYlRleHRWaWV3LnJlcXVlc3RGb2N1cyhkaXJlY3Rpb24sCkBAIC02MjYxLDYgKzYwOTgsMTIgQEAKICAgICBwdWJsaWMgYm9vbGVhbiByZXF1ZXN0Q2hpbGRSZWN0YW5nbGVPblNjcmVlbihWaWV3IGNoaWxkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlY3QgcmVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGltbWVkaWF0ZSkgeworICAgICAgICAvLyBkb24ndCBzY3JvbGwgd2hpbGUgaW4gem9vbSBhbmltYXRpb24uIFdoZW4gaXQgaXMgZG9uZSwgd2Ugd2lsbCBhZGp1c3QKKyAgICAgICAgLy8gdGhlIG5lY2Vzc2FyeSBjb21wb25lbnRzIChlLmcuLCBXZWJUZXh0VmlldyBpZiBpdCBpcyBpbiBlZGl0aW5nIG1vZGUpCisgICAgICAgIGlmIChtWm9vbU1hbmFnZXIuaXNGaXhlZExlbmd0aEFuaW1hdGlvbkluUHJvZ3Jlc3MoKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKICAgICAgICAgcmVjdC5vZmZzZXQoY2hpbGQuZ2V0TGVmdCgpIC0gY2hpbGQuZ2V0U2Nyb2xsWCgpLAogICAgICAgICAgICAgICAgIGNoaWxkLmdldFRvcCgpIC0gY2hpbGQuZ2V0U2Nyb2xsWSgpKTsKIApAQCAtNjQwMyw3ICs2MjQ2LDggQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgY2FzZSBTV0lUQ0hfVE9fU0hPUlRQUkVTUzogewogICAgICAgICAgICAgICAgICAgICBpZiAobVRvdWNoTW9kZSA9PSBUT1VDSF9JTklUX01PREUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtUHJldmVudERlZmF1bHQgIT0gUFJFVkVOVF9ERUZBVUxUX1lFUykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFnZXRTZXR0aW5ncygpLnN1cHBvcnRUb3VjaE9ubHkoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBtUHJldmVudERlZmF1bHQgIT0gUFJFVkVOVF9ERUZBVUxUX1lFUykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ub3VjaE1vZGUgPSBUT1VDSF9TSE9SVFBSRVNTX1NUQVJUX01PREU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlU2VsZWN0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewpAQCAtNjQxNyw2ICs2MjYxLDkgQEAKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGNhc2UgU1dJVENIX1RPX0xPTkdQUkVTUzogeworICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0U2V0dGluZ3MoKS5zdXBwb3J0VG91Y2hPbmx5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZVRvdWNoSGlnaGxpZ2h0KGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBpZiAoaW5GdWxsU2NyZWVuTW9kZSgpIHx8IG1EZWZlclRvdWNoUHJvY2VzcykgewogICAgICAgICAgICAgICAgICAgICAgICAgVG91Y2hFdmVudERhdGEgdGVkID0gbmV3IFRvdWNoRXZlbnREYXRhKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICB0ZWQubUFjdGlvbiA9IFdlYlZpZXdDb3JlLkFDVElPTl9MT05HUFJFU1M7CkBAIC02NDI4LDE1ICs2Mjc1LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzaW1wbGljaXR5IGZvciBub3csIHdlIGRvbid0IHNldCBpdC4KICAgICAgICAgICAgICAgICAgICAgICAgIHRlZC5tTWV0YVN0YXRlID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgIHRlZC5tUmVwcm9jZXNzID0gbURlZmVyVG91Y2hQcm9jZXNzOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1EZWZlclRvdWNoUHJvY2VzcykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlZC5tVmlld1ggPSBtTGFzdFRvdWNoWDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWQubVZpZXdZID0gbUxhc3RUb3VjaFk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICBtV2ViVmlld0NvcmUuc2VuZE1lc3NhZ2UoRXZlbnRIdWIuVE9VQ0hfRVZFTlQsIHRlZCk7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobVByZXZlbnREZWZhdWx0ICE9IFBSRVZFTlRfREVGQVVMVF9ZRVMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG1Ub3VjaE1vZGUgPSBUT1VDSF9ET05FX01PREU7CiAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtTG9uZ0NsaWNrKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZWJ1aWxkV2ViVGV4dFZpZXcoKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CkBAIC02NDY5LDcwICs2MzExLDM2IEBACiAgICAgICAgICAgICAgICAgICAgIHNwYXduQ29udGVudFNjcm9sbFRvKG1zZy5hcmcxLCBtc2cuYXJnMik7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgVVBEQVRFX1pPT01fUkFOR0U6IHsKLSAgICAgICAgICAgICAgICAgICAgV2ViVmlld0NvcmUuUmVzdG9yZVN0YXRlIHJlc3RvcmVTdGF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gKFdlYlZpZXdDb3JlLlJlc3RvcmVTdGF0ZSkgbXNnLm9iajsKKyAgICAgICAgICAgICAgICAgICAgV2ViVmlld0NvcmUuVmlld1N0YXRlIHZpZXdTdGF0ZSA9IChXZWJWaWV3Q29yZS5WaWV3U3RhdGUpIG1zZy5vYmo7CiAgICAgICAgICAgICAgICAgICAgIC8vIG1TY3JvbGxYIGNvbnRhaW5zIHRoZSBuZXcgbWluUHJlZldpZHRoCi0gICAgICAgICAgICAgICAgICAgIHVwZGF0ZVpvb21SYW5nZShyZXN0b3JlU3RhdGUsIGdldFZpZXdXaWR0aCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3RvcmVTdGF0ZS5tU2Nyb2xsWCwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICBtWm9vbU1hbmFnZXIudXBkYXRlWm9vbVJhbmdlKHZpZXdTdGF0ZSwgZ2V0Vmlld1dpZHRoKCksIHZpZXdTdGF0ZS5tU2Nyb2xsWCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIFJFUExBQ0VfQkFTRV9DT05URU5UOiB7CisgICAgICAgICAgICAgICAgICAgIG5hdGl2ZVJlcGxhY2VCYXNlQ29udGVudChtc2cuYXJnMSk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBjYXNlIE5FV19QSUNUVVJFX01TR19JRDogewotICAgICAgICAgICAgICAgICAgICAvLyBJZiB3ZSd2ZSBwcmV2aW91c2x5IGRlbGF5ZWQgZGVsZXRpbmcgYSByb290Ci0gICAgICAgICAgICAgICAgICAgIC8vIGxheWVyLCBkbyBpdCBub3cuCi0gICAgICAgICAgICAgICAgICAgIGlmIChtRGVsYXllZERlbGV0ZVJvb3RMYXllcikgewotICAgICAgICAgICAgICAgICAgICAgICAgbURlbGF5ZWREZWxldGVSb290TGF5ZXIgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZVNldFJvb3RMYXllcigwKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBXZWJTZXR0aW5ncyBzZXR0aW5ncyA9IG1XZWJWaWV3Q29yZS5nZXRTZXR0aW5ncygpOwogICAgICAgICAgICAgICAgICAgICAvLyBjYWxsZWQgZm9yIG5ldyBjb250ZW50Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCB2aWV3V2lkdGggPSBnZXRWaWV3V2lkdGgoKTsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgV2ViVmlld0NvcmUuRHJhd0RhdGEgZHJhdyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKFdlYlZpZXdDb3JlLkRyYXdEYXRhKSBtc2cub2JqOworICAgICAgICAgICAgICAgICAgICBmaW5hbCBXZWJWaWV3Q29yZS5EcmF3RGF0YSBkcmF3ID0gKFdlYlZpZXdDb3JlLkRyYXdEYXRhKSBtc2cub2JqOworICAgICAgICAgICAgICAgICAgICBuYXRpdmVTZXRCYXNlTGF5ZXIoZHJhdy5tQmFzZUxheWVyKTsKICAgICAgICAgICAgICAgICAgICAgZmluYWwgUG9pbnQgdmlld1NpemUgPSBkcmF3Lm1WaWV3UG9pbnQ7Ci0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gdXNlV2lkZVZpZXdwb3J0ID0gc2V0dGluZ3MuZ2V0VXNlV2lkZVZpZXdQb3J0KCk7Ci0gICAgICAgICAgICAgICAgICAgIFdlYlZpZXdDb3JlLlJlc3RvcmVTdGF0ZSByZXN0b3JlU3RhdGUgPSBkcmF3Lm1SZXN0b3JlU3RhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaGFzUmVzdG9yZVN0YXRlID0gcmVzdG9yZVN0YXRlICE9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChoYXNSZXN0b3JlU3RhdGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVpvb21SYW5nZShyZXN0b3JlU3RhdGUsIHZpZXdTaXplLngsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyYXcubU1pblByZWZXaWR0aCwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIFdlYlZpZXdDb3JlLlZpZXdTdGF0ZSB2aWV3U3RhdGUgPSBkcmF3Lm1WaWV3U3RhdGU7CisgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNQaWN0dXJlQWZ0ZXJGaXJzdExheW91dCA9IHZpZXdTdGF0ZSAhPSBudWxsOworICAgICAgICAgICAgICAgICAgICBpZiAoaXNQaWN0dXJlQWZ0ZXJGaXJzdExheW91dCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVzZXQgdGhlIGxhc3Qgc2VudCBkYXRhIGhlcmUgc2luY2UgZGVhbGluZyB3aXRoIG5ldyBwYWdlLgorICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RXaWR0aFNlbnQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgbVpvb21NYW5hZ2VyLm9uRmlyc3RMYXlvdXQoZHJhdyk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1EcmF3SGlzdG9yeSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Jblpvb21PdmVydmlldyA9IGZhbHNlOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1Jbml0aWFsU2NhbGVJblBlcmNlbnQgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldE5ld1pvb21TY2FsZShtSW5pdGlhbFNjYWxlSW5QZXJjZW50IC8gMTAwLjBmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUluaXRpYWxTY2FsZUluUGVyY2VudCAhPSBtVGV4dFdyYXBTY2FsZSAqIDEwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlc3RvcmVTdGF0ZS5tVmlld1NjYWxlID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVGV4dFdyYXBTY2FsZSA9IHJlc3RvcmVTdGF0ZS5tVGV4dFdyYXBTY2FsZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0TmV3Wm9vbVNjYWxlKHJlc3RvcmVTdGF0ZS5tVmlld1NjYWxlLCBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW5ab29tT3ZlcnZpZXcgPSB1c2VXaWRlVmlld3BvcnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHNldHRpbmdzLmdldExvYWRXaXRoT3ZlcnZpZXdNb2RlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHNjYWxlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUluWm9vbU92ZXJ2aWV3KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZSA9IChmbG9hdCkgdmlld1dpZHRoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyBERUZBVUxUX1ZJRVdQT1JUX1dJRFRIOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGUgPSByZXN0b3JlU3RhdGUubVRleHRXcmFwU2NhbGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0TmV3Wm9vbVNjYWxlKHNjYWxlLCBNYXRoLmFicyhzY2FsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBtVGV4dFdyYXBTY2FsZSkgPj0gTUlOSU1VTV9TQ0FMRV9JTkNSRU1FTlQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldENvbnRlbnRTY3JvbGxUbyhyZXN0b3JlU3RhdGUubVNjcm9sbFgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3RvcmVTdGF0ZS5tU2Nyb2xsWSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Q29udGVudFNjcm9sbFRvKHZpZXdTdGF0ZS5tU2Nyb2xsWCwgdmlld1N0YXRlLm1TY3JvbGxZKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBcyB3ZSBhcmUgb24gYSBuZXcgcGFnZSwgcmVtb3ZlIHRoZSBXZWJUZXh0Vmlldy4gVGhpcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIG5lY2Vzc2FyeSBmb3IgcGFnZSBsb2FkcyBkcml2ZW4gYnkgd2Via2l0LCBhbmQgaW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwYXJ0aWN1bGFyIHdoZW4gdGhlIHVzZXIgd2FzIG9uIGEgcGFzc3dvcmQgZmllbGQsIHNvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIFdlYlRleHRWaWV3IHdhcyB2aXNpYmxlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGV4dEVudHJ5KGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGUgdGhlIHpvb20gYnV0dG9ucyBhcyB0aGUgc2NhbGUgY2FuIGJlIGNoYW5nZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0U2V0dGluZ3MoKS5nZXRCdWlsdEluWm9vbUNvbnRyb2xzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlWm9vbUJ1dHRvbnNFbmFibGVkKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGV4dEVudHJ5KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgICAgICAvLyBXZSB1cGRhdGUgdGhlIGxheW91dCAoaS5lLiByZXF1ZXN0IGEgbGF5b3V0IGZyb20gdGhlCiAgICAgICAgICAgICAgICAgICAgIC8vIHZpZXcgc3lzdGVtKSBpZiB0aGUgbGFzdCB2aWV3IHNpemUgdGhhdCB3ZSBzZW50IHRvCiAgICAgICAgICAgICAgICAgICAgIC8vIFdlYkNvcmUgbWF0Y2hlcyB0aGUgdmlldyBzaXplIG9mIHRoZSBwaWN0dXJlIHdlIGp1c3QKQEAgLTY1NDAsNDUgKzYzNDgsMjUgQEAKICAgICAgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiB1cGRhdGVMYXlvdXQgPSB2aWV3U2l6ZS54ID09IG1MYXN0V2lkdGhTZW50CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgdmlld1NpemUueSA9PSBtTGFzdEhlaWdodFNlbnQ7CiAgICAgICAgICAgICAgICAgICAgIHJlY29yZE5ld0NvbnRlbnRTaXplKGRyYXcubVdpZHRoSGVpZ2h0LngsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhdy5tV2lkdGhIZWlnaHQueQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKG1GaW5kSXNVcCA/IG1GaW5kSGVpZ2h0IDogMCksIHVwZGF0ZUxheW91dCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhdy5tV2lkdGhIZWlnaHQueSwgdXBkYXRlTGF5b3V0KTsKICAgICAgICAgICAgICAgICAgICAgaWYgKERlYnVnRmxhZ3MuV0VCX1ZJRVcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIFJlY3QgYiA9IGRyYXcubUludmFsUmVnaW9uLmdldEJvdW5kcygpOwogICAgICAgICAgICAgICAgICAgICAgICAgTG9nLnYoTE9HVEFHLCAiTkVXX1BJQ1RVUkVfTVNHX0lEIHsiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYi5sZWZ0KyIsIitiLnRvcCsiLCIrYi5yaWdodCsiLCIrYi5ib3R0b20rIn0iKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlQ29udGVudFJlY3QoZHJhdy5tSW52YWxSZWdpb24uZ2V0Qm91bmRzKCkpOworCiAgICAgICAgICAgICAgICAgICAgIGlmIChtUGljdHVyZUxpc3RlbmVyICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG1QaWN0dXJlTGlzdGVuZXIub25OZXdQaWN0dXJlKFdlYlZpZXcudGhpcywgY2FwdHVyZVBpY3R1cmUoKSk7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHVzZVdpZGVWaWV3cG9ydCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGltaXQgbVpvb21PdmVydmlld1dpZHRoIHVwcGVyIGJvdW5kIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBzTWF4Vmlld3BvcnRXaWR0aCBzbyB0aGF0IGlmIHRoZSBwYWdlIGRvZXNuJ3QgYmVoYXZlCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZWxsLCB0aGUgV2ViVmlldyB3b24ndCBnbyBpbnNhbmUuIGxpbWl0IHRoZSBsb3dlcgotICAgICAgICAgICAgICAgICAgICAgICAgLy8gYm91bmQgdG8gbWF0Y2ggdGhlIGRlZmF1bHQgc2NhbGUgZm9yIG1vYmlsZSBzaXRlcy4KLSAgICAgICAgICAgICAgICAgICAgICAgIG1ab29tT3ZlcnZpZXdXaWR0aCA9IE1hdGgubWluKHNNYXhWaWV3cG9ydFdpZHRoLCBNYXRoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXgoKGludCkgKHZpZXdXaWR0aCAvIG1EZWZhdWx0U2NhbGUpLCBNYXRoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1heChkcmF3Lm1NaW5QcmVmV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3Lm1WaWV3UG9pbnQueCkpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoIW1NaW5ab29tU2NhbGVGaXhlZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbU1pblpvb21TY2FsZSA9IChmbG9hdCkgdmlld1dpZHRoIC8gbVpvb21PdmVydmlld1dpZHRoOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmICghbURyYXdIaXN0b3J5ICYmIG1Jblpvb21PdmVydmlldykgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gZml0IHRoZSBjb250ZW50IHdpZHRoIHRvIHRoZSBjdXJyZW50IHZpZXcuIElnbm9yZQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJvdW5kaW5nIGVycm9yIGNhc2UuCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoTWF0aC5hYnMoKHZpZXdXaWR0aCAqIG1JbnZBY3R1YWxTY2FsZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBtWm9vbU92ZXJ2aWV3V2lkdGgpID4gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldE5ld1pvb21TY2FsZSgoZmxvYXQpIHZpZXdXaWR0aAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyBtWm9vbU92ZXJ2aWV3V2lkdGgsIE1hdGguYWJzKG1BY3R1YWxTY2FsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBtVGV4dFdyYXBTY2FsZSkgPCBNSU5JTVVNX1NDQUxFX0lOQ1JFTUVOVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgem9vbSBpbmZvcm1hdGlvbiBiYXNlZCBvbiB0aGUgbmV3IHBpY3R1cmUKKyAgICAgICAgICAgICAgICAgICAgbVpvb21NYW5hZ2VyLm9uTmV3UGljdHVyZShkcmF3KTsKKwogICAgICAgICAgICAgICAgICAgICBpZiAoZHJhdy5tRm9jdXNTaXplQ2hhbmdlZCAmJiBpbkVkaXRpbmdNb2RlKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG1Gb2N1c1NpemVDaGFuZ2VkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoaGFzUmVzdG9yZVN0YXRlKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChpc1BpY3R1cmVBZnRlckZpcnN0TGF5b3V0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBtVmlld01hbmFnZXIucG9zdFJlYWR5VG9EcmF3QWxsKCk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC02NjEyLDE0ICs2NDAwLDggQEAKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSBSRVFVRVNUX0tFWUJPQVJEX1dJVEhfU0VMRUNUSU9OX01TR19JRDoKICAgICAgICAgICAgICAgICAgICAgZGlzcGxheVNvZnRLZXlib2FyZCh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgdXBkYXRlVGV4dFNlbGVjdGlvbkZyb21NZXNzYWdlKG1zZy5hcmcxLCBtc2cuYXJnMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoV2ViVmlld0NvcmUuVGV4dFNlbGVjdGlvbkRhdGEpIG1zZy5vYmopOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoIHRvIFVQREFURV9URVhUX1NFTEVDVElPTl9NU0dfSUQKICAgICAgICAgICAgICAgICBjYXNlIFVQREFURV9URVhUX1NFTEVDVElPTl9NU0dfSUQ6Ci0gICAgICAgICAgICAgICAgICAgIC8vIElmIG5vIHRleHRmaWVsZCB3YXMgaW4gZm9jdXMsIGFuZCB0aGUgdXNlciB0b3VjaGVkIG9uZSwKLSAgICAgICAgICAgICAgICAgICAgLy8gY2F1c2luZyBpdCB0byBzZW5kIHRoaXMgbWVzc2FnZSwgdGhlbiBXZWJUZXh0VmlldyBoYXMgbm90Ci0gICAgICAgICAgICAgICAgICAgIC8vIGJlZW4gc2V0IHVwIHlldC4gIFJlYnVpbGQgaXQgc28gaXQgY2FuIHNldCBpdHMgc2VsZWN0aW9uLgotICAgICAgICAgICAgICAgICAgICByZWJ1aWxkV2ViVGV4dFZpZXcoKTsKICAgICAgICAgICAgICAgICAgICAgdXBkYXRlVGV4dFNlbGVjdGlvbkZyb21NZXNzYWdlKG1zZy5hcmcxLCBtc2cuYXJnMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoV2ViVmlld0NvcmUuVGV4dFNlbGVjdGlvbkRhdGEpIG1zZy5vYmopOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTY2MzcsNyArNjQxOSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBNT1ZFX09VVF9PRl9QTFVHSU46CisgICAgICAgICAgICAgICAgY2FzZSBVTkhBTkRMRURfTkFWX0tFWToKICAgICAgICAgICAgICAgICAgICAgbmF2SGFuZGxlZEtleShtc2cuYXJnMSwgMSwgZmFsc2UsIDApOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIFVQREFURV9URVhUX0VOVFJZX01TR19JRDoKQEAgLTY2NDksNyArNjQzMSw3IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSBDTEVBUl9URVhUX0VOVFJZOgotICAgICAgICAgICAgICAgICAgICBjbGVhclRleHRFbnRyeShmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIGNsZWFyVGV4dEVudHJ5KCk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgSU5WQUxfUkVDVF9NU0dfSUQ6IHsKICAgICAgICAgICAgICAgICAgICAgUmVjdCByID0gKFJlY3QpbXNnLm9iajsKQEAgLTY2NjIsMjMgKzY0NDQsNiBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXNlIElNTUVESUFURV9SRVBBSU5UX01TR19JRDogewotICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXNlIFNFVF9ST09UX0xBWUVSX01TR19JRDogewotICAgICAgICAgICAgICAgICAgICBpZiAoMCA9PSBtc2cuYXJnMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gTnVsbCBpbmRpY2F0ZXMgZGVsZXRpbmcgdGhlIG9sZCBsYXllciwgYnV0Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBkb24ndCBhY3R1YWxseSBkbyBzbyB1bnRpbCB3ZSd2ZSBnb3QgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXcgcGFnZSB0byBkaXNwbGF5LgotICAgICAgICAgICAgICAgICAgICAgICAgbURlbGF5ZWREZWxldGVSb290TGF5ZXIgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgbURlbGF5ZWREZWxldGVSb290TGF5ZXIgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZVNldFJvb3RMYXllcihtc2cuYXJnMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGNhc2UgUkVRVUVTVF9GT1JNX0RBVEE6CiAgICAgICAgICAgICAgICAgICAgIEF1dG9Db21wbGV0ZUFkYXB0ZXIgYWRhcHRlciA9IChBdXRvQ29tcGxldGVBZGFwdGVyKSBtc2cub2JqOwogICAgICAgICAgICAgICAgICAgICBpZiAobVdlYlRleHRWaWV3LmlzU2FtZVRleHRGaWVsZChtc2cuYXJnMSkpIHsKQEAgLTY3MjIsMzMgKzY0ODcsNDAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUHJldmVudERlZmF1bHQgPSBtc2cuYXJnMiA9PSAxID8gUFJFVkVOVF9ERUZBVUxUX1lFUwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBQUkVWRU5UX0RFRkFVTFRfTk87CiAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVByZXZlbnREZWZhdWx0ID09IFBSRVZFTlRfREVGQVVMVF9ZRVMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVG91Y2hIaWdobGlnaHRSZWdpb24uc2V0RW1wdHkoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtc2cuYXJnMiA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwcmV2ZW50IGRlZmF1bHQgaXMgbm90IGNhbGxlZCBpbiBXZWJDb3JlLCBzbyB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2UgbmVlZHMgdG8gYmUgcmVwcm9jZXNzZWQgaW4gVUkKICAgICAgICAgICAgICAgICAgICAgICAgIFRvdWNoRXZlbnREYXRhIHRlZCA9IChUb3VjaEV2ZW50RGF0YSkgbXNnLm9iajsKICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAodGVkLm1BY3Rpb24pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9ET1dOOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTGFzdERlZmVyVG91Y2hYID0gdGVkLm1WaWV3WDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3REZWZlclRvdWNoWSA9IHRlZC5tVmlld1k7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0RGVmZXJUb3VjaFggPSBjb250ZW50VG9WaWV3WCh0ZWQubVgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBtU2Nyb2xsWDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3REZWZlclRvdWNoWSA9IGNvbnRlbnRUb1ZpZXdZKHRlZC5tWSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIG1TY3JvbGxZOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRGVmZXJUb3VjaE1vZGUgPSBUT1VDSF9JTklUX01PREU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX01PVkU6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm8gc25hcHBpbmcgaW4gZGVmZXIgcHJvY2VzcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeCA9IGNvbnRlbnRUb1ZpZXdYKHRlZC5tWCkgLSBtU2Nyb2xsWDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHkgPSBjb250ZW50VG9WaWV3WSh0ZWQubVkpIC0gbVNjcm9sbFk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtRGVmZXJUb3VjaE1vZGUgIT0gVE9VQ0hfRFJBR19NT0RFKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRGVmZXJUb3VjaE1vZGUgPSBUT1VDSF9EUkFHX01PREU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTGFzdERlZmVyVG91Y2hYID0gdGVkLm1WaWV3WDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0RGVmZXJUb3VjaFkgPSB0ZWQubVZpZXdZOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3REZWZlclRvdWNoWCA9IHg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTGFzdERlZmVyVG91Y2hZID0geTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0RHJhZygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWx0YVggPSBwaW5Mb2NYKChpbnQpIChtU2Nyb2xsWAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbUxhc3REZWZlclRvdWNoWCAtIHRlZC5tVmlld1gpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbUxhc3REZWZlclRvdWNoWCAtIHgpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gbVNjcm9sbFg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWx0YVkgPSBwaW5Mb2NZKChpbnQpIChtU2Nyb2xsWQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbUxhc3REZWZlclRvdWNoWSAtIHRlZC5tVmlld1kpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbUxhc3REZWZlclRvdWNoWSAtIHkpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gbVNjcm9sbFk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvRHJhZyhkZWx0YVgsIGRlbHRhWSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWx0YVggIT0gMCkgbUxhc3REZWZlclRvdWNoWCA9IHRlZC5tVmlld1g7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWx0YVkgIT0gMCkgbUxhc3REZWZlclRvdWNoWSA9IHRlZC5tVmlld1k7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWx0YVggIT0gMCkgbUxhc3REZWZlclRvdWNoWCA9IHg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWx0YVkgIT0gMCkgbUxhc3REZWZlclRvdWNoWSA9IHk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9VUDoKQEAgLTY3NjIsOSArNjUzNCw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgV2ViVmlld0NvcmUuQUNUSU9OX0RPVUJMRVRBUDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9Eb3VibGVUYXAoKSBuZWVkcyBtTGFzdFRvdWNoWC9ZIGFzIGFuY2hvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTGFzdFRvdWNoWCA9IHRlZC5tVmlld1g7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0VG91Y2hZID0gdGVkLm1WaWV3WTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9Eb3VibGVUYXAoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RUb3VjaFggPSBjb250ZW50VG9WaWV3WCh0ZWQubVgpIC0gbVNjcm9sbFg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0VG91Y2hZID0gY29udGVudFRvVmlld1kodGVkLm1ZKSAtIG1TY3JvbGxZOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtWm9vbU1hbmFnZXIuaGFuZGxlRG91YmxlVGFwKG1MYXN0VG91Y2hYLCBtTGFzdFRvdWNoWSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1EZWZlclRvdWNoTW9kZSA9IFRPVUNIX0RPTkVfTU9ERTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBXZWJWaWV3Q29yZS5BQ1RJT05fTE9OR1BSRVNTOgpAQCAtNjc3Miw3ICs2NTQ0LDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhpdFRlc3QgIT0gbnVsbCAmJiBoaXRUZXN0Lm1UeXBlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIT0gSGl0VGVzdFJlc3VsdC5VTktOT1dOX1RZUEUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm1Mb25nQ2xpY2soKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYnVpbGRXZWJUZXh0VmlldygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1EZWZlclRvdWNoTW9kZSA9IFRPVUNIX0RPTkVfTU9ERTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC02ODk2LDcgKzY2NjcsNiBAQAogCiAgICAgICAgICAgICAgICAgY2FzZSBDRU5URVJfRklUX1JFQ1Q6CiAgICAgICAgICAgICAgICAgICAgIFJlY3QgciA9IChSZWN0KW1zZy5vYmo7Ci0gICAgICAgICAgICAgICAgICAgIG1Jblpvb21PdmVydmlldyA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICBjZW50ZXJGaXRSZWN0KHIubGVmdCwgci50b3AsIHIud2lkdGgoKSwgci5oZWlnaHQoKSk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogCkBAIC02OTA1LDYgKzY2NzUsNDMgQEAKICAgICAgICAgICAgICAgICAgICAgbVZlcnRpY2FsU2Nyb2xsQmFyTW9kZSA9IG1zZy5hcmcyOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKIAorICAgICAgICAgICAgICAgIGNhc2UgU0VMRUNUSU9OX1NUUklOR19DSEFOR0VEOgorICAgICAgICAgICAgICAgICAgICBpZiAobUFjY2Vzc2liaWxpdHlJbmplY3RvciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2VsZWN0aW9uU3RyaW5nID0gKFN0cmluZykgbXNnLm9iajsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1BY2Nlc3NpYmlsaXR5SW5qZWN0b3Iub25TZWxlY3Rpb25TdHJpbmdDaGFuZ2Uoc2VsZWN0aW9uU3RyaW5nKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgU0VUX1RPVUNIX0hJR0hMSUdIVF9SRUNUUzoKKyAgICAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZShtVG91Y2hIaWdobGlnaHRSZWdpb24uZ2V0Qm91bmRzKCkpOworICAgICAgICAgICAgICAgICAgICBtVG91Y2hIaWdobGlnaHRSZWdpb24uc2V0RW1wdHkoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1zZy5vYmogIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlMaXN0PFJlY3Q+IHJlY3RzID0gKEFycmF5TGlzdDxSZWN0PikgbXNnLm9iajsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoUmVjdCByZWN0IDogcmVjdHMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWN0IHZpZXdSZWN0ID0gY29udGVudFRvVmlld1JlY3QocmVjdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc29tZSBzaXRlcywgbGlrZSBzdG9yaWVzIGluIG55dGltZXMuY29tLCBzZXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtb3VzZSBldmVudCBoYW5kbGVyIGluIHRoZSB0b3AgZGl2LiBJdCBpcyBub3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1c2VyIGZyaWVuZGx5IHRvIGhpZ2hsaWdodCB0aGUgZGl2IGlmIGl0IGNvdmVycworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1vcmUgdGhhbiBoYWxmIG9mIHRoZSBzY3JlZW4uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZpZXdSZWN0LndpZHRoKCkgPCBnZXRXaWR0aCgpID4+IDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHZpZXdSZWN0LmhlaWdodCgpIDwgZ2V0SGVpZ2h0KCkgPj4gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVG91Y2hIaWdobGlnaHRSZWdpb24udW5pb24odmlld1JlY3QpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKHZpZXdSZWN0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhMT0dUQUcsICJTa2lwIHRoZSBodWdlIHNlbGVjdGlvbiByZWN0OiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHZpZXdSZWN0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIFNBVkVfV0VCQVJDSElWRV9GSU5JU0hFRDoKKyAgICAgICAgICAgICAgICAgICAgU2F2ZVdlYkFyY2hpdmVNZXNzYWdlIHNhdmVNZXNzYWdlID0gKFNhdmVXZWJBcmNoaXZlTWVzc2FnZSltc2cub2JqOworICAgICAgICAgICAgICAgICAgICBpZiAoc2F2ZU1lc3NhZ2UubUNhbGxiYWNrICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVNZXNzYWdlLm1DYWxsYmFjay5vblJlY2VpdmVWYWx1ZShzYXZlTWVzc2FnZS5tUmVzdWx0RmlsZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICBzdXBlci5oYW5kbGVNZXNzYWdlKG1zZyk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtNzIxMiwzNyArNzAxOSw2IEBACiAgICAgICAgICAgICAgICAgbmV3IEludm9rZUxpc3RCb3goYXJyYXksIGVuYWJsZWRBcnJheSwgc2VsZWN0ZWRBcnJheSkpOwogICAgIH0KIAotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVab29tUmFuZ2UoV2ViVmlld0NvcmUuUmVzdG9yZVN0YXRlIHJlc3RvcmVTdGF0ZSwKLSAgICAgICAgICAgIGludCB2aWV3V2lkdGgsIGludCBtaW5QcmVmV2lkdGgsIGJvb2xlYW4gdXBkYXRlWm9vbU92ZXJ2aWV3KSB7Ci0gICAgICAgIGlmIChyZXN0b3JlU3RhdGUubU1pblNjYWxlID09IDApIHsKLSAgICAgICAgICAgIGlmIChyZXN0b3JlU3RhdGUubU1vYmlsZVNpdGUpIHsKLSAgICAgICAgICAgICAgICBpZiAobWluUHJlZldpZHRoID4gTWF0aC5tYXgoMCwgdmlld1dpZHRoKSkgewotICAgICAgICAgICAgICAgICAgICBtTWluWm9vbVNjYWxlID0gKGZsb2F0KSB2aWV3V2lkdGggLyBtaW5QcmVmV2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgIG1NaW5ab29tU2NhbGVGaXhlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBpZiAodXBkYXRlWm9vbU92ZXJ2aWV3KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBXZWJTZXR0aW5ncyBzZXR0aW5ncyA9IGdldFNldHRpbmdzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtSW5ab29tT3ZlcnZpZXcgPSBzZXR0aW5ncy5nZXRVc2VXaWRlVmlld1BvcnQoKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5nZXRMb2FkV2l0aE92ZXJ2aWV3TW9kZSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbU1pblpvb21TY2FsZSA9IHJlc3RvcmVTdGF0ZS5tRGVmYXVsdFNjYWxlOwotICAgICAgICAgICAgICAgICAgICBtTWluWm9vbVNjYWxlRml4ZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbU1pblpvb21TY2FsZSA9IERFRkFVTFRfTUlOX1pPT01fU0NBTEU7Ci0gICAgICAgICAgICAgICAgbU1pblpvb21TY2FsZUZpeGVkID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtTWluWm9vbVNjYWxlID0gcmVzdG9yZVN0YXRlLm1NaW5TY2FsZTsKLSAgICAgICAgICAgIG1NaW5ab29tU2NhbGVGaXhlZCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJlc3RvcmVTdGF0ZS5tTWF4U2NhbGUgPT0gMCkgewotICAgICAgICAgICAgbU1heFpvb21TY2FsZSA9IERFRkFVTFRfTUFYX1pPT01fU0NBTEU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtTWF4Wm9vbVNjYWxlID0gcmVzdG9yZVN0YXRlLm1NYXhTY2FsZTsKLSAgICAgICAgfQotICAgIH0KLQogICAgIC8qCiAgICAgICogUmVxdWVzdCBhIGRyb3Bkb3duIG1lbnUgZm9yIGEgbGlzdGJveCB3aXRoIHNpbmdsZSBzZWxlY3Rpb24gb3IgYSBzaW5nbGUKICAgICAgKiA8c2VsZWN0PiBlbGVtZW50LgpAQCAtNzI4MSw3ICs3MDU3LDcgQEAKICAgICAgKi8KICAgICBwcml2YXRlIHZvaWQgc2VuZE1vdmVNb3VzZUlmTGF0ZXN0KGJvb2xlYW4gcmVtb3ZlRm9jdXMpIHsKICAgICAgICAgaWYgKHJlbW92ZUZvY3VzKSB7Ci0gICAgICAgICAgICBjbGVhclRleHRFbnRyeSh0cnVlKTsKKyAgICAgICAgICAgIGNsZWFyVGV4dEVudHJ5KCk7CiAgICAgICAgIH0KICAgICAgICAgbVdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlKEV2ZW50SHViLlNFVF9NT1ZFX01PVVNFX0lGX0xBVEVTVCwKICAgICAgICAgICAgICAgICBjdXJzb3JEYXRhKCkpOwpAQCAtNzMyNSw3ICs3MTAxLDcgQEAKICAgICAgICAgLy8gRklYTUUgdGhlIGRpdmlzb3Igc2hvdWxkIGJlIHJldHJpZXZlZCBmcm9tIHNvbWV3aGVyZQogICAgICAgICAvLyB0aGUgY2xvc2VzdCB0aGluZyB0b2RheSBpcyBoYXJkLWNvZGVkIGludG8gU2Nyb2xsVmlldy5qYXZhCiAgICAgICAgIC8vIChmcm9tIFNjcm9sbFZpZXcuamF2YSwgbGluZSAzNjMpICAgaW50IG1heEp1bXAgPSBoZWlnaHQvMjsKLSAgICAgICAgcmV0dXJuIE1hdGgucm91bmQoaGVpZ2h0ICogbUludkFjdHVhbFNjYWxlKTsKKyAgICAgICAgcmV0dXJuIE1hdGgucm91bmQoaGVpZ2h0ICogbVpvb21NYW5hZ2VyLmdldEludlNjYWxlKCkpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNzMzNiwxMCArNzExMiwxMCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFBhc3MgdGhlIGtleSB0byB0aGUgcGx1Z2luLiAgVGhpcyBhc3N1bWVzIHRoYXQgbmF0aXZlRm9jdXNJc1BsdWdpbigpCi0gICAgICogcmV0dXJuZWQgdHJ1ZS4KKyAgICAgKiBQYXNzIHRoZSBrZXkgZGlyZWN0bHkgdG8gdGhlIHBhZ2UuICBUaGlzIGFzc3VtZXMgdGhhdAorICAgICAqIG5hdGl2ZVBhZ2VTaG91bGRIYW5kbGVTaGlmdEFuZEFycm93cygpIHJldHVybmVkIHRydWUuCiAgICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGxldFBsdWdpbkhhbmRsZU5hdktleShpbnQga2V5Q29kZSwgbG9uZyB0aW1lLCBib29sZWFuIGRvd24pIHsKKyAgICBwcml2YXRlIHZvaWQgbGV0UGFnZUhhbmRsZU5hdktleShpbnQga2V5Q29kZSwgbG9uZyB0aW1lLCBib29sZWFuIGRvd24pIHsKICAgICAgICAgaW50IGtleUV2ZW50QWN0aW9uOwogICAgICAgICBpbnQgZXZlbnRIdWJBY3Rpb247CiAgICAgICAgIGlmIChkb3duKSB7CkBAIC03NDM2LDcgKzcyMTIsNyBAQAogICAgICAqIEBoaWRlIG9ubHkgbmVlZHMgdG8gYmUgYWNjZXNzaWJsZSB0byBCcm93c2VyIGFuZCB0ZXN0aW5nCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgZHJhd1BhZ2UoQ2FudmFzIGNhbnZhcykgewotICAgICAgICBtV2ViVmlld0NvcmUuZHJhd0NvbnRlbnRQaWN0dXJlKGNhbnZhcywgMCwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgbmF0aXZlRHJhdyhjYW52YXMsIDAsIDAsIGZhbHNlKTsKICAgICB9CiAKICAgICAvKioKQEAgLTc0ODAsMTAgKzcyNTYsMTggQEAKICAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuICBuYXRpdmVDdXJzb3JXYW50c0tleUV2ZW50cygpOwogICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgICAgIG5hdGl2ZURlYnVnRHVtcCgpOwogICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgICAgIG5hdGl2ZURlc3Ryb3koKTsKKworICAgIC8qKgorICAgICAqIERyYXcgdGhlIHBpY3R1cmUgc2V0IHdpdGggYSBiYWNrZ3JvdW5kIGNvbG9yIGFuZCBleHRyYS4gSWYKKyAgICAgKiAic3BsaXRJZk5lZWRlZCIgaXMgdHJ1ZSBhbmQgdGhlIHJldHVybiB2YWx1ZSBpcyBub3QgMCwgdGhlIHJldHVybiB2YWx1ZQorICAgICAqIE1VU1QgYmUgcGFzc2VkIHRvIFdlYlZpZXdDb3JlIHdpdGggU1BMSVRfUElDVFVSRV9TRVQgbWVzc2FnZSBzbyB0aGF0IHRoZQorICAgICAqIG5hdGl2ZSBhbGxvY2F0aW9uIGNhbiBiZSBmcmVlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIG5hdGl2ZSBpbnQgbmF0aXZlRHJhdyhDYW52YXMgY2FudmFzLCBpbnQgY29sb3IsIGludCBleHRyYSwKKyAgICAgICAgICAgIGJvb2xlYW4gc3BsaXRJZk5lZWRlZCk7CisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCAgICAgbmF0aXZlRHVtcERpc3BsYXlUcmVlKFN0cmluZyB1cmxPck51bGwpOwogICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gIG5hdGl2ZUV2YWx1YXRlTGF5ZXJzQW5pbWF0aW9ucygpOwogICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgICAgIG5hdGl2ZUV4dGVuZFNlbGVjdGlvbihpbnQgeCwgaW50IHkpOwotICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgICAgIG5hdGl2ZURyYXdFeHRyYXMoQ2FudmFzIGNhbnZhcywgaW50IGV4dHJhKTsKLSAgICBwcml2YXRlIG5hdGl2ZSB2b2lkICAgICBuYXRpdmVEdW1wRGlzcGxheVRyZWUoU3RyaW5nIHVybE9yTnVsbCk7CiAgICAgcHJpdmF0ZSBuYXRpdmUgaW50ICAgICAgbmF0aXZlRmluZEFsbChTdHJpbmcgZmluZExvd2VyLCBTdHJpbmcgZmluZFVwcGVyKTsKICAgICBwcml2YXRlIG5hdGl2ZSB2b2lkICAgICBuYXRpdmVGaW5kTmV4dChib29sZWFuIGZvcndhcmQpOwogICAgIC8qIHBhY2thZ2UgKi8gbmF0aXZlIGludCAgICAgIG5hdGl2ZUZvY3VzQ2FuZGlkYXRlRnJhbWVQb2ludGVyKCk7CkBAIC03NTIxLDYgKzczMDUsMTQgQEAKICAgICAgICAgICAgIGJvb2xlYW4gbm9TY3JvbGwpOwogICAgIHByaXZhdGUgbmF0aXZlIGludCAgICAgIG5hdGl2ZU1vdmVHZW5lcmF0aW9uKCk7CiAgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCAgICAgbmF0aXZlTW92ZVNlbGVjdGlvbihpbnQgeCwgaW50IHkpOworICAgIC8qKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcGFnZSBzaG91bGQgZ2V0IHRoZSBzaGlmdCBhbmQgYXJyb3cga2V5cywgcmF0aGVyCisgICAgICogdGhhbiBzZWxlY3QgdGV4dC9uYXZpZ2F0aW9uLgorICAgICAqCisgICAgICogSWYgdGhlIGZvY3VzIGlzIGEgcGx1Z2luLCBvciBpZiB0aGUgZm9jdXMgYW5kIGN1cnNvciBtYXRjaCBhbmQgYXJlCisgICAgICogYSBjb250ZW50RWRpdGFibGUgZWxlbWVudCwgdGhlbiB0aGUgcGFnZSBzaG91bGQgaGFuZGxlIHRoZXNlIGtleXMuCisgICAgICovCisgICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiAgbmF0aXZlUGFnZVNob3VsZEhhbmRsZVNoaWZ0QW5kQXJyb3dzKCk7CiAgICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiAgbmF0aXZlUG9pbnRJbk5hdkNhY2hlKGludCB4LCBpbnQgeSwgaW50IHNsb3ApOwogICAgIC8vIExpa2UgbWFueSBvdGhlciBvZiBvdXIgbmF0aXZlIG1ldGhvZHMsIHlvdSBtdXN0IG1ha2Ugc3VyZSB0aGF0CiAgICAgLy8gbU5hdGl2ZUNsYXNzIGlzIG5vdCBudWxsIGJlZm9yZSBjYWxsaW5nIHRoaXMgbWV0aG9kLgpAQCAtNzUzNywxMSArNzMyOSwxMyBAQAogICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgICAgIG5hdGl2ZVNldEZpbmRJc1VwKGJvb2xlYW4gaXNVcCk7CiAgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCAgICAgbmF0aXZlU2V0Rm9sbG93ZWRMaW5rKGJvb2xlYW4gZm9sbG93ZWQpOwogICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgICAgIG5hdGl2ZVNldEhlaWdodENhbk1lYXN1cmUoYm9vbGVhbiBtZWFzdXJlKTsKLSAgICBwcml2YXRlIG5hdGl2ZSB2b2lkICAgICBuYXRpdmVTZXRSb290TGF5ZXIoaW50IGxheWVyKTsKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkICAgICBuYXRpdmVTZXRCYXNlTGF5ZXIoaW50IGxheWVyKTsKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkICAgICBuYXRpdmVSZXBsYWNlQmFzZUNvbnRlbnQoaW50IGNvbnRlbnQpOworICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgICAgIG5hdGl2ZUNvcHlCYXNlQ29udGVudFRvUGljdHVyZShQaWN0dXJlIHBpY3QpOworICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gIG5hdGl2ZUhhc0NvbnRlbnQoKTsKICAgICBwcml2YXRlIG5hdGl2ZSB2b2lkICAgICBuYXRpdmVTZXRTZWxlY3Rpb25Qb2ludGVyKGJvb2xlYW4gc2V0LAogICAgICAgICAgICAgZmxvYXQgc2NhbGUsIGludCB4LCBpbnQgeSk7CiAgICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiAgbmF0aXZlU3RhcnRTZWxlY3Rpb24oaW50IHgsIGludCB5KTsKLSAgICBwcml2YXRlIG5hdGl2ZSB2b2lkICAgICBuYXRpdmVTZXRTZWxlY3Rpb25SZWdpb24oYm9vbGVhbiBzZXQpOwogICAgIHByaXZhdGUgbmF0aXZlIFJlY3QgICAgIG5hdGl2ZVN1YnRyYWN0TGF5ZXJzKFJlY3QgY29udGVudCk7CiAgICAgcHJpdmF0ZSBuYXRpdmUgaW50ICAgICAgbmF0aXZlVGV4dEdlbmVyYXRpb24oKTsKICAgICAvLyBOZXZlciBjYWxsIHRoaXMgdmVyc2lvbiBleGNlcHQgYnkgdXBkYXRlQ2FjaGVkVGV4dGZpZWxkKFN0cmluZykgLQpAQCAtNzU1MCw2ICs3MzQ0LDEwIEBACiAgICAgICAgICAgICBpbnQgZ2VuZXJhdGlvbik7CiAgICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiAgbmF0aXZlV29yZFNlbGVjdGlvbihpbnQgeCwgaW50IHkpOwogICAgIC8vIHJldHVybiBOT19MRUZURURHRSBtZWFucyBmYWlsdXJlLgotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOT19MRUZURURHRSA9IC0xOwotICAgIHByaXZhdGUgbmF0aXZlIGludCAgICAgIG5hdGl2ZUdldEJsb2NrTGVmdEVkZ2UoaW50IHgsIGludCB5LCBmbG9hdCBzY2FsZSk7CisgICAgc3RhdGljIGZpbmFsIGludCBOT19MRUZURURHRSA9IC0xOworICAgIG5hdGl2ZSBpbnQgbmF0aXZlR2V0QmxvY2tMZWZ0RWRnZShpbnQgeCwgaW50IHksIGZsb2F0IHNjYWxlKTsKKworICAgIC8vIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBzY3JvbGxhYmxlIExheWVyQW5kcm9pZCBhdCB0aGUgZ2l2ZW4gcG9pbnQuCisgICAgcHJpdmF0ZSBuYXRpdmUgaW50ICAgICAgbmF0aXZlU2Nyb2xsYWJsZUxheWVyKGludCB4LCBpbnQgeSk7CisgICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiAgbmF0aXZlU2Nyb2xsTGF5ZXIoaW50IGxheWVyLCBpbnQgZHgsIGludCBkeSk7CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViVmlld0NvcmUuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9XZWJWaWV3Q29yZS5qYXZhCmluZGV4IDQxMTgxMTkuLmZhZDQzMjMgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9XZWJWaWV3Q29yZS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9XZWJWaWV3Q29yZS5qYXZhCkBAIC0xNywxNCArMTcsOCBAQAogcGFja2FnZSBhbmRyb2lkLndlYmtpdDsKIAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyLk5hbWVOb3RGb3VuZEV4Y2VwdGlvbjsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcjsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkRyYXdGaWx0ZXI7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50RmxhZ3NEcmF3RmlsdGVyOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGljdHVyZTsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBvaW50OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlZ2lvbjsKQEAgLTMzLDE0ICsyNywxNCBAQAogaW1wb3J0IGFuZHJvaWQub3MuTG9vcGVyOwogaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKIGltcG9ydCBhbmRyb2lkLm9zLlByb2Nlc3M7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Ccm93c2VyOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuT3BlbmFibGVDb2x1bW5zOworaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuTWVkaWFTdG9yZTsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGFuZHJvaWQudXRpbC5TcGFyc2VCb29sZWFuQXJyYXk7CiBpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OwotaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlSG9sZGVyOwogaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlVmlldzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLndlYmtpdC5EZXZpY2VPcmllbnRhdGlvbk1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC53ZWJraXQuRGV2aWNlT3JpZW50YXRpb25TZXJ2aWNlOwogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKQEAgLTExNywxMyArMTExLDE2IEBACiAgICAgcHJpdmF0ZSBpbnQgbVZpZXdwb3J0RGVuc2l0eURwaSA9IC0xOwogCiAgICAgcHJpdmF0ZSBpbnQgbVJlc3RvcmVkU2NhbGUgPSAwOwotICAgIHByaXZhdGUgaW50IG1SZXN0b3JlZFNjcmVlbldpZHRoU2NhbGUgPSAwOworICAgIHByaXZhdGUgaW50IG1SZXN0b3JlZFRleHRXcmFwU2NhbGUgPSAwOwogICAgIHByaXZhdGUgaW50IG1SZXN0b3JlZFggPSAwOwogICAgIHByaXZhdGUgaW50IG1SZXN0b3JlZFkgPSAwOwogCiAgICAgcHJpdmF0ZSBpbnQgbVdlYmtpdFNjcm9sbFggPSAwOwogICAgIHByaXZhdGUgaW50IG1XZWJraXRTY3JvbGxZID0gMDsKIAorICAgIHByaXZhdGUgRGV2aWNlT3JpZW50YXRpb25NYW5hZ2VyIG1EZXZpY2VPcmllbnRhdGlvbk1hbmFnZXIgPSBuZXcgRGV2aWNlT3JpZW50YXRpb25NYW5hZ2VyKHRoaXMpOworICAgIHByaXZhdGUgRGV2aWNlT3JpZW50YXRpb25TZXJ2aWNlIG1EZXZpY2VPcmllbnRhdGlvblNlcnZpY2U7CisKICAgICAvLyBUaGUgdGhyZWFkIG5hbWUgdXNlZCB0byBpZGVudGlmeSB0aGUgV2ViQ29yZSB0aHJlYWQgYW5kIGZvciB1c2UgaW4KICAgICAvLyBkZWJ1Z2dpbmcgb3RoZXIgY2xhc3NlcyB0aGF0IHJlcXVpcmUgb3BlcmF0aW9uIHdpdGhpbiB0aGUgV2ViQ29yZSB0aHJlYWQuCiAgICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgU3RyaW5nIFRIUkVBRF9OQU1FID0gIldlYlZpZXdDb3JlVGhyZWFkIjsKQEAgLTI3OSwzNCArMjc2LDM2IEBACiAKICAgICAvKioKICAgICAgKiBDYWxsZWQgYnkgSk5JLiAgT3BlbiBhIGZpbGUgY2hvb3NlciB0byB1cGxvYWQgYSBmaWxlLgotICAgICAqIEByZXR1cm4gU3RyaW5nIHZlcnNpb24gb2YgdGhlIFVSSSBwbHVzIHRoZSBuYW1lIG9mIHRoZSBmaWxlLgotICAgICAqIEZJWE1FOiBKdXN0IHJldHVybiB0aGUgVVJJIGhlcmUsIGFuZCBpbiBGaWxlU3lzdGVtOjpwYXRoR2V0RmlsZU5hbWUsIGNhbGwKLSAgICAgKiBpbnRvIEphdmEgdG8gZ2V0IHRoZSBmaWxlbmFtZS4KKyAgICAgKiBAcGFyYW0gYWNjZXB0VHlwZSBUaGUgdmFsdWUgb2YgdGhlICdhY2NlcHQnIGF0dHJpYnV0ZSBvZiB0aGUKKyAgICAgKiAgICAgICAgIGlucHV0IHRhZyBhc3NvY2lhdGVkIHdpdGggdGhpcyBmaWxlIHBpY2tlci4KKyAgICAgKiBAcmV0dXJuIFN0cmluZyB2ZXJzaW9uIG9mIHRoZSBVUkkuCiAgICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgb3BlbkZpbGVDaG9vc2VyKCkgewotICAgICAgICBVcmkgdXJpID0gbUNhbGxiYWNrUHJveHkub3BlbkZpbGVDaG9vc2VyKCk7Ci0gICAgICAgIGlmICh1cmkgPT0gbnVsbCkgcmV0dXJuICIiOwotICAgICAgICAvLyBGaW5kIG91dCB0aGUgbmFtZSwgYW5kIGFwcGVuZCBpdCB0byB0aGUgVVJJLgotICAgICAgICAvLyBXZWJraXQgd2lsbCB0cmVhdCB0aGUgbmFtZSBhcyB0aGUgZmlsZW5hbWUsIGFuZAotICAgICAgICAvLyB0aGUgVVJJIGFzIHRoZSBwYXRoLiAgVGhlIFVSSSB3aWxsIGJlIHVzZWQKLSAgICAgICAgLy8gaW4gQnJvd3NlckZyYW1lIHRvIGdldCB0aGUgYWN0dWFsIGRhdGEuCi0gICAgICAgIEN1cnNvciBjdXJzb3IgPSBtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKS5xdWVyeSgKLSAgICAgICAgICAgICAgICB1cmksCi0gICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgT3BlbmFibGVDb2x1bW5zLkRJU1BMQVlfTkFNRSB9LAotICAgICAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAgICAgbnVsbCwKLSAgICAgICAgICAgICAgICBudWxsKTsKLSAgICAgICAgU3RyaW5nIG5hbWUgPSAiIjsKLSAgICAgICAgaWYgKGN1cnNvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGlmIChjdXJzb3IubW92ZVRvTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG5hbWUgPSBjdXJzb3IuZ2V0U3RyaW5nKDApOworICAgIHByaXZhdGUgU3RyaW5nIG9wZW5GaWxlQ2hvb3NlcihTdHJpbmcgYWNjZXB0VHlwZSkgeworICAgICAgICBVcmkgdXJpID0gbUNhbGxiYWNrUHJveHkub3BlbkZpbGVDaG9vc2VyKGFjY2VwdFR5cGUpOworICAgICAgICBpZiAodXJpICE9IG51bGwpIHsKKyAgICAgICAgICAgIFN0cmluZyBmaWxlUGF0aCA9ICIiOworICAgICAgICAgICAgLy8gTm90ZSAtIHF1ZXJ5aW5nIGZvciBNZWRpYVN0b3JlLkltYWdlcy5NZWRpYS5EQVRBCisgICAgICAgICAgICAvLyBzZWVtcyB0byB3b3JrIGZvciBhbGwgY29udGVudCBVUklzLCBub3QganVzdCBpbWFnZXMKKyAgICAgICAgICAgIEN1cnNvciBjdXJzb3IgPSBtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKS5xdWVyeSgKKyAgICAgICAgICAgICAgICAgICAgdXJpLAorICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyBNZWRpYVN0b3JlLkltYWdlcy5NZWRpYS5EQVRBIH0sCisgICAgICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIG51bGwpOworICAgICAgICAgICAgaWYgKGN1cnNvciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnNvci5tb3ZlVG9OZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVQYXRoID0gY3Vyc29yLmdldFN0cmluZygwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgIGN1cnNvci5jbG9zZSgpOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgY3Vyc29yLmNsb3NlKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZpbGVQYXRoID0gdXJpLmdldExhc3RQYXRoU2VnbWVudCgpOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgU3RyaW5nIHVyaVN0cmluZyA9IHVyaS50b1N0cmluZygpOworICAgICAgICAgICAgQnJvd3NlckZyYW1lLnNKYXZhQnJpZGdlLnN0b3JlRmlsZVBhdGhGb3JDb250ZW50VXJpKGZpbGVQYXRoLCB1cmlTdHJpbmcpOworICAgICAgICAgICAgcmV0dXJuIHVyaVN0cmluZzsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gdXJpLnRvU3RyaW5nKCkgKyAiLyIgKyBuYW1lOworICAgICAgICByZXR1cm4gIiI7CiAgICAgfQogCiAgICAgLyoqCkBAIC00MjQsNiArNDIzLDEzIEBACiAgICAgICAgIHJldHVybiBtQ2FsbGJhY2tQcm94eS5vbkpzVGltZW91dCgpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIE5vdGlmeSB0aGUgd2VidmlldyB0aGF0IHRoaXMgaXMgYW4gaW5zdGFsbGFibGUgd2ViIGFwcC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRJbnN0YWxsYWJsZVdlYkFwcCgpIHsKKyAgICAgICAgbUNhbGxiYWNrUHJveHkuc2V0SW5zdGFsbGFibGVXZWJBcHAoKTsKKyAgICB9CisKICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAvLyBKTkkgbWV0aG9kcwogICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtNDM1LDM2ICs0NDEsMjEgQEAKICAgICAgKi8KICAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5hdGl2ZUNsZWFyQ29udGVudCgpOwogCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgZmxhdCBwaWN0dXJlIGZyb20gdGhlIHNldCBvZiBwaWN0dXJlcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5hdGl2ZUNvcHlDb250ZW50VG9QaWN0dXJlKFBpY3R1cmUgcGljdHVyZSk7Ci0KLSAgICAvKioKLSAgICAgKiBEcmF3IHRoZSBwaWN0dXJlIHNldCB3aXRoIGEgYmFja2dyb3VuZCBjb2xvci4gUmV0dXJucyB0cnVlCi0gICAgICogaWYgc29tZSBpbmRpdmlkdWFsIHBpY3R1cmUgdG9vayB0b28gbG9uZyB0byBkcmF3IGFuZCBjYW4gYmUKLSAgICAgKiBzcGxpdCBpbnRvIHBhcnRzLiBDYWxsZWQgZnJvbSB0aGUgVUkgdGhyZWFkLgotICAgICAqLwotICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gbmF0aXZlRHJhd0NvbnRlbnQoQ2FudmFzIGNhbnZhcywgaW50IGNvbG9yKTsKLQotICAgIC8qKgotICAgICAqIGNoZWNrIHRvIHNlZSBpZiBwaWN0dXJlIGlzIGJsYW5rIGFuZCBpbiBwcm9ncmVzcwotICAgICAqLwotICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gbmF0aXZlUGljdHVyZVJlYWR5KCk7CisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuYXRpdmVDb250ZW50SW52YWxpZGF0ZUFsbCgpOwogCiAgICAgLyoqCiAgICAgICogUmVkcmF3IGEgcG9ydGlvbiBvZiB0aGUgcGljdHVyZSBzZXQuIFRoZSBQb2ludCB3aCByZXR1cm5zIHRoZQogICAgICAqIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIG92ZXJhbGwgcGljdHVyZS4KICAgICAgKi8KLSAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuIG5hdGl2ZVJlY29yZENvbnRlbnQoUmVnaW9uIGludmFsUmVnaW9uLCBQb2ludCB3aCk7CisgICAgcHJpdmF0ZSBuYXRpdmUgaW50IG5hdGl2ZVJlY29yZENvbnRlbnQoUmVnaW9uIGludmFsUmVnaW9uLCBQb2ludCB3aCk7CiAKICAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuIG5hdGl2ZUZvY3VzQm91bmRzQ2hhbmdlZCgpOwogCiAgICAgLyoqCi0gICAgICogU3BsaXRzIHNsb3cgcGFydHMgb2YgdGhlIHBpY3R1cmUgc2V0LiBDYWxsZWQgZnJvbSB0aGUgd2Via2l0Ci0gICAgICogdGhyZWFkIGFmdGVyIG5hdGl2ZURyYXdDb250ZW50IHJldHVybnMgdHJ1ZS4KKyAgICAgKiBTcGxpdHMgc2xvdyBwYXJ0cyBvZiB0aGUgcGljdHVyZSBzZXQuIENhbGxlZCBmcm9tIHRoZSB3ZWJraXQgdGhyZWFkIGFmdGVyCisgICAgICogV2ViVmlldy5uYXRpdmVEcmF3KCkgcmV0dXJucyBjb250ZW50IHRvIGJlIHNwbGl0LgogICAgICAqLwotICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbmF0aXZlU3BsaXRDb250ZW50KCk7CisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuYXRpdmVTcGxpdENvbnRlbnQoaW50IGNvbnRlbnQpOwogCiAgICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiBuYXRpdmVLZXkoaW50IGtleUNvZGUsIGludCB1bmljaGFyLAogICAgICAgICAgICAgaW50IHJlcGVhdENvdW50LCBib29sZWFuIGlzU2hpZnQsIGJvb2xlYW4gaXNBbHQsIGJvb2xlYW4gaXNTeW0sCkBAIC00ODAsMTIgKzQ3MSwxMiBAQAogICAgICAgICBvZiBsYXlvdXQvbGluZS1icmVha2luZy4gVGhlc2UgY29vcmRpbmF0ZXMgYXJlIGluIGRvY3VtZW50IHNwYWNlLAogICAgICAgICB3aGljaCBpcyB0aGUgc2FtZSBhcyBWaWV3IGNvb3JkcyB1bmxlc3Mgd2UgaGF2ZSB6b29tZWQgdGhlIGRvY3VtZW50CiAgICAgICAgIChzZWUgbmF0aXZlU2V0Wm9vbSkuCi0gICAgICAgIHNjcmVlbldpZHRoIGlzIHVzZWQgYnkgbGF5b3V0IHRvIHdyYXAgY29sdW1uIGFyb3VuZC4gSWYgdmlld3BvcnQgdXNlcwotICAgICAgICBmaXhlZCBzaXplLCBzY3JlZW5XaWR0aCBjYW4gYmUgZGlmZmVyZW50IGZyb20gd2lkdGggd2l0aCB6b29taW5nLgorICAgICAgICB0ZXh0V3JhcFdpZHRoIGlzIHVzZWQgYnkgbGF5b3V0IHRvIHdyYXAgY29sdW1uIGFyb3VuZC4gSWYgdmlld3BvcnQgdXNlcworICAgICAgICBmaXhlZCBzaXplLCB0ZXh0V3JhcFdpZHRoIGNhbiBiZSBkaWZmZXJlbnQgZnJvbSB3aWR0aCB3aXRoIHpvb21pbmcuCiAgICAgICAgIHNob3VsZCB0aGlzIGJlIGNhbGxlZCBuYXRpdmVTZXRWaWV3UG9ydFNpemU/CiAgICAgKi8KLSAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5hdGl2ZVNldFNpemUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc2NyZWVuV2lkdGgsCi0gICAgICAgICAgICBmbG9hdCBzY2FsZSwgaW50IHJlYWxTY3JlZW5XaWR0aCwgaW50IHNjcmVlbkhlaWdodCwgaW50IGFuY2hvclgsCisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuYXRpdmVTZXRTaXplKGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHRleHRXcmFwV2lkdGgsCisgICAgICAgICAgICBmbG9hdCBzY2FsZSwgaW50IHNjcmVlbldpZHRoLCBpbnQgc2NyZWVuSGVpZ2h0LCBpbnQgYW5jaG9yWCwKICAgICAgICAgICAgIGludCBhbmNob3JZLCBib29sZWFuIGlnbm9yZUhlaWdodCk7CiAKICAgICBwcml2YXRlIG5hdGl2ZSBpbnQgbmF0aXZlR2V0Q29udGVudE1pblByZWZXaWR0aCgpOwpAQCAtNTc2LDcgKzU2NywxOCBAQAogICAgIC8qKgogICAgICAqIFByb3ZpZGUgV2ViQ29yZSB3aXRoIHRoZSBwcmV2aW91c2x5IHZpc3RlZCBsaW5rcyBmcm9tIHRoZSBoaXN0b3J5IGRhdGFiYXNlCiAgICAgICovCi0gICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCAgbmF0aXZlUHJvdmlkZVZpc2l0ZWRIaXN0b3J5KFN0cmluZ1tdIGhpc3RvcnkpOworICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbmF0aXZlUHJvdmlkZVZpc2l0ZWRIaXN0b3J5KFN0cmluZ1tdIGhpc3RvcnkpOworCisgICAgLyoqCisgICAgICogTW9kaWZpZXMgdGhlIGN1cnJlbnQgc2VsZWN0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGFsdGVyIFNwZWNpZmllcyBob3cgdG8gYWx0ZXIgdGhlIHNlbGVjdGlvbi4KKyAgICAgKiBAcGFyYW0gZGlyZWN0aW9uIFRoZSBkaXJlY3Rpb24gaW4gd2hpY2ggdG8gYWx0ZXIgdGhlIHNlbGVjdGlvbi4KKyAgICAgKiBAcGFyYW0gZ3JhbnVsYXJpdHkgVGhlIGdyYW51bGFyaXR5IG9mIHRoZSBzZWxlY3Rpb24gbW9kaWZpY2F0aW9uLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgc2VsZWN0aW9uIHN0cmluZy4KKyAgICAgKi8KKyAgICBwcml2YXRlIG5hdGl2ZSBTdHJpbmcgbmF0aXZlTW9kaWZ5U2VsZWN0aW9uKFN0cmluZyBhbHRlciwgU3RyaW5nIGRpcmVjdGlvbiwgU3RyaW5nIGdyYW51bGFyaXR5KTsKIAogICAgIC8vIEV2ZW50SHViIGZvciBwcm9jZXNzaW5nIG1lc3NhZ2VzCiAgICAgcHJpdmF0ZSBmaW5hbCBFdmVudEh1YiBtRXZlbnRIdWI7CkBAIC02OTcsNiArNjk5LDEyIEBACiAgICAgICAgIGludCBtWTsKICAgICB9CiAKKyAgICBzdGF0aWMgY2xhc3MgVG91Y2hIaWdobGlnaHREYXRhIHsKKyAgICAgICAgaW50IG1YOworICAgICAgICBpbnQgbVk7CisgICAgICAgIGludCBtU2xvcDsKKyAgICB9CisKICAgICAvLyBtQWN0aW9uIG9mIFRvdWNoRXZlbnREYXRhIGNhbiBiZSBNb3Rpb25FdmVudC5nZXRBY3Rpb24oKSB3aGljaCB1c2VzIHRoZQogICAgIC8vIGxhc3QgdHdvIGJ5dGVzIG9yIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlcwogICAgIHN0YXRpYyBmaW5hbCBpbnQgQUNUSU9OX0xPTkdQUkVTUyA9IDB4MTAwOwpAQCAtNzA4LDggKzcxNiw2IEBACiAgICAgICAgIGludCBtWTsKICAgICAgICAgaW50IG1NZXRhU3RhdGU7CiAgICAgICAgIGJvb2xlYW4gbVJlcHJvY2VzczsKLSAgICAgICAgZmxvYXQgbVZpZXdYOwotICAgICAgICBmbG9hdCBtVmlld1k7CiAgICAgfQogCiAgICAgc3RhdGljIGNsYXNzIEdlb2xvY2F0aW9uUGVybWlzc2lvbnNEYXRhIHsKQEAgLTcxOCw3ICs3MjQsMTEgQEAKICAgICAgICAgYm9vbGVhbiBtUmVtZW1iZXI7CiAgICAgfQogCi0KKyAgICBzdGF0aWMgY2xhc3MgTW9kaWZ5U2VsZWN0aW9uRGF0YSB7CisgICAgICAgIFN0cmluZyBtQWx0ZXI7CisgICAgICAgIFN0cmluZyBtRGlyZWN0aW9uOworICAgICAgICBTdHJpbmcgbUdyYW51bGFyaXR5OworICAgIH0KIAogICAgICAgICBzdGF0aWMgZmluYWwgU3RyaW5nW10gSGFuZGxlckRlYnVnU3RyaW5nID0gewogICAgICAgICAgICAgIlJFUVVFU1RfTEFCRUwiLCAvLyA5NwpAQCAtNzcxLDYgKzc4MSw3IEBACiAgICAgICAgICAgICAiT05fUkVTVU1FIiwgICAgLy8gPSAxNDQKICAgICAgICAgICAgICJGUkVFX01FTU9SWSIsICAvLyA9IDE0NQogICAgICAgICAgICAgIlZBTElEX05PREVfQk9VTkRTIiwgLy8gPSAxNDYKKyAgICAgICAgICAgICJTQVZFX1dFQkFSQ0hJVkUiLCAvLyA9IDE0NwogICAgICAgICB9OwogCiAgICAgY2xhc3MgRXZlbnRIdWIgewpAQCAtODM3LDYgKzg0OCw5IEBACiAgICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgRlJFRV9NRU1PUlkgPSAxNDU7CiAgICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgVkFMSURfTk9ERV9CT1VORFMgPSAxNDY7CiAKKyAgICAgICAgLy8gTG9hZCBhbmQgc2F2ZSB3ZWIgYXJjaGl2ZXMKKyAgICAgICAgc3RhdGljIGZpbmFsIGludCBTQVZFX1dFQkFSQ0hJVkUgPSAxNDc7CisKICAgICAgICAgLy8gTmV0d29yay1iYXNlZCBtZXNzYWdpbmcKICAgICAgICAgc3RhdGljIGZpbmFsIGludCBDTEVBUl9TU0xfUFJFRl9UQUJMRSA9IDE1MDsKIApAQCAtODY1LDYgKzg3OSwxNCBAQAogICAgICAgICBzdGF0aWMgZmluYWwgaW50IEFERF9QQUNLQUdFX05BTUUgPSAxODU7CiAgICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgUkVNT1ZFX1BBQ0tBR0VfTkFNRSA9IDE4NjsKIAorICAgICAgICBzdGF0aWMgZmluYWwgaW50IEdFVF9UT1VDSF9ISUdITElHSFRfUkVDVFMgPSAxODc7CisgICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgUkVNT1ZFX1RPVUNIX0hJR0hMSUdIVF9SRUNUUyA9IDE4ODsKKworICAgICAgICAvLyBhY2Nlc3NpYmlsaXR5IHN1cHBvcnQKKyAgICAgICAgc3RhdGljIGZpbmFsIGludCBNT0RJRllfU0VMRUNUSU9OID0gMTkwOworCisgICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgVVNFX01PQ0tfREVWSUNFX09SSUVOVEFUSU9OID0gMTkxOworCiAgICAgICAgIC8vIHByaXZhdGUgbWVzc2FnZSBpZHMKICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFU1RST1kgPSAgICAgMjAwOwogCkBAIC0xMjM4LDYgKzEyNjAsMTkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVTZXRTZWxlY3Rpb24obXNnLmFyZzEsIG1zZy5hcmcyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKIAorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNT0RJRllfU0VMRUNUSU9OOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZGlmeVNlbGVjdGlvbkRhdGEgbW9kaWZ5U2VsZWN0aW9uRGF0YSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNb2RpZnlTZWxlY3Rpb25EYXRhKSBtc2cub2JqOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZWxlY3Rpb25TdHJpbmcgPSBuYXRpdmVNb2RpZnlTZWxlY3Rpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RpZnlTZWxlY3Rpb25EYXRhLm1BbHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmeVNlbGVjdGlvbkRhdGEubURpcmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmeVNlbGVjdGlvbkRhdGEubUdyYW51bGFyaXR5KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1XZWJWaWV3Lm1Qcml2YXRlSGFuZGxlci5vYnRhaW5NZXNzYWdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViVmlldy5TRUxFQ1RJT05fU1RSSU5HX0NIQU5HRUQsIHNlbGVjdGlvblN0cmluZykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZW5kVG9UYXJnZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKwogICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBMSVNUQk9YX0NIT0lDRVM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3BhcnNlQm9vbGVhbkFycmF5IGNob2ljZXMgPSAoU3BhcnNlQm9vbGVhbkFycmF5KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnLm9iajsKQEAgLTEyNzgsNiArMTMxMywxNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZVNldEpzRmxhZ3MoKFN0cmluZyltc2cub2JqKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKIAorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTQVZFX1dFQkFSQ0hJVkU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViVmlldy5TYXZlV2ViQXJjaGl2ZU1lc3NhZ2Ugc2F2ZU1lc3NhZ2UgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoV2ViVmlldy5TYXZlV2ViQXJjaGl2ZU1lc3NhZ2UpbXNnLm9iajsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYXZlTWVzc2FnZS5tUmVzdWx0RmlsZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVXZWJBcmNoaXZlKHNhdmVNZXNzYWdlLm1CYXNlbmFtZSwgc2F2ZU1lc3NhZ2UubUF1dG9uYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtV2ViVmlldy5tUHJpdmF0ZUhhbmRsZXIub2J0YWluTWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViVmlldy5TQVZFX1dFQkFSQ0hJVkVfRklOSVNIRUQsIHNhdmVNZXNzYWdlKS5zZW5kVG9UYXJnZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKwogICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBHRU9MT0NBVElPTl9QRVJNSVNTSU9OU19QUk9WSURFOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdlb2xvY2F0aW9uUGVybWlzc2lvbnNEYXRhIGRhdGEgPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEdlb2xvY2F0aW9uUGVybWlzc2lvbnNEYXRhKSBtc2cub2JqOwpAQCAtMTI5MSw3ICsxMzM1LDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTUExJVF9QSUNUVVJFX1NFVDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVTcGxpdENvbnRlbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVTcGxpdENvbnRlbnQobXNnLmFyZzEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1XZWJWaWV3Lm1Qcml2YXRlSGFuZGxlci5vYnRhaW5NZXNzYWdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViVmlldy5SRVBMQUNFX0JBU0VfQ09OVEVOVCwgbXNnLmFyZzEsIDApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TcGxpdFBpY3R1cmVJc1NjaGVkdWxlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogCkBAIC0xMzU3LDYgKzE0MDMsMjUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCcm93c2VyRnJhbWUuc0phdmFCcmlkZ2UucmVtb3ZlUGFja2FnZU5hbWUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU3RyaW5nKSBtc2cub2JqKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBHRVRfVE9VQ0hfSElHSExJR0hUX1JFQ1RTOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRvdWNoSGlnaGxpZ2h0RGF0YSBkID0gKFRvdWNoSGlnaGxpZ2h0RGF0YSkgbXNnLm9iajsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheUxpc3Q8UmVjdD4gcmVjdHMgPSBuYXRpdmVHZXRUb3VjaEhpZ2hsaWdodFJlY3RzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZC5tWCwgZC5tWSwgZC5tU2xvcCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVdlYlZpZXcubVByaXZhdGVIYW5kbGVyLm9idGFpbk1lc3NhZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJWaWV3LlNFVF9UT1VDSF9ISUdITElHSFRfUkVDVFMsIHJlY3RzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNlbmRUb1RhcmdldCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFJFTU9WRV9UT1VDSF9ISUdITElHSFRfUkVDVFM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVdlYlZpZXcubVByaXZhdGVIYW5kbGVyLm9idGFpbk1lc3NhZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJWaWV3LlNFVF9UT1VDSF9ISUdITElHSFRfUkVDVFMsIG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2VuZFRvVGFyZ2V0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgVVNFX01PQ0tfREVWSUNFX09SSUVOVEFUSU9OOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZU1vY2tEZXZpY2VPcmllbnRhdGlvbigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfTsKQEAgLTE1NjIsMjQgKzE2MjcsMzkgQEAKICAgICAgICAgbUJyb3dzZXJGcmFtZS5sb2FkVXJsKHVybCwgZXh0cmFIZWFkZXJzKTsKICAgICB9CiAKKyAgICBwcml2YXRlIFN0cmluZyBzYXZlV2ViQXJjaGl2ZShTdHJpbmcgZmlsZW5hbWUsIGJvb2xlYW4gYXV0b25hbWUpIHsKKyAgICAgICAgaWYgKERlYnVnRmxhZ3MuV0VCX1ZJRVdfQ09SRSkgeworICAgICAgICAgICAgTG9nLnYoTE9HVEFHLCAiIENPUkUgc2F2ZVdlYkFyY2hpdmUgIiArIGZpbGVuYW1lICsgIiAiICsgYXV0b25hbWUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtQnJvd3NlckZyYW1lLnNhdmVXZWJBcmNoaXZlKGZpbGVuYW1lLCBhdXRvbmFtZSk7CisgICAgfQorCiAgICAgcHJpdmF0ZSB2b2lkIGtleShLZXlFdmVudCBldnQsIGJvb2xlYW4gaXNEb3duKSB7CiAgICAgICAgIGlmIChEZWJ1Z0ZsYWdzLldFQl9WSUVXX0NPUkUpIHsKICAgICAgICAgICAgIExvZy52KExPR1RBRywgIkNPUkUga2V5IGF0ICIgKyBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSArICIsICIKICAgICAgICAgICAgICAgICAgICAgKyBldnQpOwogICAgICAgICB9CiAgICAgICAgIGludCBrZXlDb2RlID0gZXZ0LmdldEtleUNvZGUoKTsKLSAgICAgICAgaWYgKCFuYXRpdmVLZXkoa2V5Q29kZSwgZXZ0LmdldFVuaWNvZGVDaGFyKCksCi0gICAgICAgICAgICAgICAgZXZ0LmdldFJlcGVhdENvdW50KCksIGV2dC5pc1NoaWZ0UHJlc3NlZCgpLCBldnQuaXNBbHRQcmVzc2VkKCksCi0gICAgICAgICAgICAgICAgZXZ0LmlzU3ltUHJlc3NlZCgpLAorICAgICAgICBpbnQgdW5pY29kZUNoYXIgPSBldnQuZ2V0VW5pY29kZUNoYXIoKTsKKworICAgICAgICBpZiAoa2V5Q29kZSA9PSBLZXlFdmVudC5LRVlDT0RFX1VOS05PV04gJiYgZXZ0LmdldENoYXJhY3RlcnMoKSAhPSBudWxsCisgICAgICAgICAgICAgICAgJiYgZXZ0LmdldENoYXJhY3RlcnMoKS5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgIC8vIHdlIHNob3VsZCBvbmx5IHJlY2VpdmUgaW5kaXZpZHVhbCBjb21wbGV4IGNoYXJhY3RlcnMKKyAgICAgICAgICAgIHVuaWNvZGVDaGFyID0gZXZ0LmdldENoYXJhY3RlcnMoKS5jb2RlUG9pbnRBdCgwKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghbmF0aXZlS2V5KGtleUNvZGUsIHVuaWNvZGVDaGFyLCBldnQuZ2V0UmVwZWF0Q291bnQoKSwgZXZ0LmlzU2hpZnRQcmVzc2VkKCksCisgICAgICAgICAgICAgICAgZXZ0LmlzQWx0UHJlc3NlZCgpLCBldnQuaXNTeW1QcmVzc2VkKCksCiAgICAgICAgICAgICAgICAgaXNEb3duKSAmJiBrZXlDb2RlICE9IEtleUV2ZW50LktFWUNPREVfRU5URVIpIHsKICAgICAgICAgICAgIGlmIChrZXlDb2RlID49IEtleUV2ZW50LktFWUNPREVfRFBBRF9VUAogICAgICAgICAgICAgICAgICAgICAmJiBrZXlDb2RlIDw9IEtleUV2ZW50LktFWUNPREVfRFBBRF9SSUdIVCkgewogICAgICAgICAgICAgICAgIGlmIChEZWJ1Z0ZsYWdzLldFQl9WSUVXX0NPUkUpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLnYoTE9HVEFHLCAia2V5OiBhcnJvdyB1bnVzZWQgYnkgcGx1Z2luOiAiICsga2V5Q29kZSk7CisgICAgICAgICAgICAgICAgICAgIExvZy52KExPR1RBRywgImtleTogYXJyb3cgdW51c2VkIGJ5IHBhZ2U6ICIgKyBrZXlDb2RlKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYgKG1XZWJWaWV3ICE9IG51bGwgJiYgZXZ0LmlzRG93bigpKSB7CiAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2Uub2J0YWluKG1XZWJWaWV3Lm1Qcml2YXRlSGFuZGxlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJWaWV3Lk1PVkVfT1VUX09GX1BMVUdJTiwga2V5Q29kZSkuc2VuZFRvVGFyZ2V0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViVmlldy5VTkhBTkRMRURfTkFWX0tFWSwga2V5Q29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKS5zZW5kVG9UYXJnZXQoKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQpAQCAtMTYxMCw3ICsxNjkwLDcgQEAKICAgICAgICAgaWYgKG1TZXR0aW5ncy5nZXRVc2VXaWRlVmlld1BvcnQoKSkgewogICAgICAgICAgICAgaWYgKG1WaWV3cG9ydFdpZHRoID09IC0xKSB7CiAgICAgICAgICAgICAgICAgaWYgKG1TZXR0aW5ncy5nZXRMYXlvdXRBbGdvcml0aG0oKSA9PQotICAgICAgICAgICAgICAgICAgICAgICAgV2ViU2V0dGluZ3MuTGF5b3V0QWxnb3JpdGhtLk5PUk1BTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgV2ViU2V0dGluZ3MuTGF5b3V0QWxnb3JpdGhtLk5PUk1BTCB8fCBtU2V0dGluZ3MuZ2V0VXNlRml4ZWRWaWV3cG9ydCgpKSB7CiAgICAgICAgICAgICAgICAgICAgIHdpZHRoID0gV2ViVmlldy5ERUZBVUxUX1ZJRVdQT1JUX1dJRFRIOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIC8qCkBAIC0xNjc1LDYgKzE3NTUsMTQgQEAKICAgICAgICAgcmV0dXJuIHVzZWRRdW90YTsKICAgICB9CiAKKyAgICAvLyBjYWxsZWQgZnJvbSBVSSB0aHJlYWQKKyAgICB2b2lkIHNwbGl0Q29udGVudChpbnQgY29udGVudCkgeworICAgICAgICBpZiAoIW1TcGxpdFBpY3R1cmVJc1NjaGVkdWxlZCkgeworICAgICAgICAgICAgbVNwbGl0UGljdHVyZUlzU2NoZWR1bGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIHNlbmRNZXNzYWdlKEV2ZW50SHViLlNQTElUX1BJQ1RVUkVfU0VULCBjb250ZW50LCAwKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIC8vIFVzZWQgdG8gYXZvaWQgcG9zdGluZyBtb3JlIHRoYW4gb25lIGRyYXcgbWVzc2FnZS4KICAgICBwcml2YXRlIGJvb2xlYW4gbURyYXdJc1NjaGVkdWxlZDsKIApAQCAtMTY4NCwxMSArMTc3MiwxMSBAQAogICAgIC8vIFVzZWQgdG8gc3VzcGVuZCBkcmF3aW5nLgogICAgIHByaXZhdGUgYm9vbGVhbiBtRHJhd0lzUGF1c2VkOwogCi0gICAgLy8gbVJlc3RvcmVTdGF0ZSBpcyBzZXQgaW4gZGlkRmlyc3RMYXlvdXQoKSwgYW5kIHJlc2V0IGluIHRoZSBuZXh0Ci0gICAgLy8gd2Via2l0RHJhdyBhZnRlciBwYXNzaW5nIGl0IHRvIHRoZSBVSSB0aHJlYWQuCi0gICAgcHJpdmF0ZSBSZXN0b3JlU3RhdGUgbVJlc3RvcmVTdGF0ZSA9IG51bGw7CisgICAgLy8gbUluaXRpYWxWaWV3U3RhdGUgaXMgc2V0IGJ5IGRpZEZpcnN0TGF5b3V0KCkgYW5kIHRoZW4gcmVzZXQgaW4gdGhlCisgICAgLy8gbmV4dCB3ZWJraXREcmF3IGFmdGVyIHBhc3NpbmcgdGhlIHN0YXRlIHRvIHRoZSBVSSB0aHJlYWQuCisgICAgcHJpdmF0ZSBWaWV3U3RhdGUgbUluaXRpYWxWaWV3U3RhdGUgPSBudWxsOwogCi0gICAgc3RhdGljIGNsYXNzIFJlc3RvcmVTdGF0ZSB7CisgICAgc3RhdGljIGNsYXNzIFZpZXdTdGF0ZSB7CiAgICAgICAgIGZsb2F0IG1NaW5TY2FsZTsKICAgICAgICAgZmxvYXQgbU1heFNjYWxlOwogICAgICAgICBmbG9hdCBtVmlld1NjYWxlOwpAQCAtMTcwMSwxNSArMTc4OSwxNyBAQAogCiAgICAgc3RhdGljIGNsYXNzIERyYXdEYXRhIHsKICAgICAgICAgRHJhd0RhdGEoKSB7CisgICAgICAgICAgICBtQmFzZUxheWVyID0gMDsKICAgICAgICAgICAgIG1JbnZhbFJlZ2lvbiA9IG5ldyBSZWdpb24oKTsKICAgICAgICAgICAgIG1XaWR0aEhlaWdodCA9IG5ldyBQb2ludCgpOwogICAgICAgICB9CisgICAgICAgIGludCBtQmFzZUxheWVyOwogICAgICAgICBSZWdpb24gbUludmFsUmVnaW9uOwogICAgICAgICBQb2ludCBtVmlld1BvaW50OwogICAgICAgICBQb2ludCBtV2lkdGhIZWlnaHQ7CiAgICAgICAgIGludCBtTWluUHJlZldpZHRoOwotICAgICAgICBSZXN0b3JlU3RhdGUgbVJlc3RvcmVTdGF0ZTsgLy8gb25seSBub24tbnVsbCBpZiBpdCBpcyBmb3IgdGhlIGZpcnN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwaWN0dXJlIHNldCBhZnRlciB0aGUgZmlyc3QgbGF5b3V0CisgICAgICAgIC8vIG9ubHkgbm9uLW51bGwgaWYgaXQgaXMgZm9yIHRoZSBmaXJzdCBwaWN0dXJlIHNldCBhZnRlciB0aGUgZmlyc3QgbGF5b3V0CisgICAgICAgIFZpZXdTdGF0ZSBtVmlld1N0YXRlOwogICAgICAgICBib29sZWFuIG1Gb2N1c1NpemVDaGFuZ2VkOwogICAgIH0KIApAQCAtMTcxNyw4ICsxODA3LDggQEAKICAgICAgICAgbURyYXdJc1NjaGVkdWxlZCA9IGZhbHNlOwogICAgICAgICBEcmF3RGF0YSBkcmF3ID0gbmV3IERyYXdEYXRhKCk7CiAgICAgICAgIGlmIChEZWJ1Z0ZsYWdzLldFQl9WSUVXX0NPUkUpIExvZy52KExPR1RBRywgIndlYmtpdERyYXcgc3RhcnQiKTsKLSAgICAgICAgaWYgKG5hdGl2ZVJlY29yZENvbnRlbnQoZHJhdy5tSW52YWxSZWdpb24sIGRyYXcubVdpZHRoSGVpZ2h0KQotICAgICAgICAgICAgICAgID09IGZhbHNlKSB7CisgICAgICAgIGRyYXcubUJhc2VMYXllciA9IG5hdGl2ZVJlY29yZENvbnRlbnQoZHJhdy5tSW52YWxSZWdpb24sIGRyYXcubVdpZHRoSGVpZ2h0KTsKKyAgICAgICAgaWYgKGRyYXcubUJhc2VMYXllciA9PSAwKSB7CiAgICAgICAgICAgICBpZiAoRGVidWdGbGFncy5XRUJfVklFV19DT1JFKSBMb2cudihMT0dUQUcsICJ3ZWJraXREcmF3IGFib3J0Iik7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KQEAgLTE3MzQsOSArMTgyNCw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBtVmlld3BvcnRXaWR0aCksCiAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVHZXRDb250ZW50TWluUHJlZldpZHRoKCkpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1SZXN0b3JlU3RhdGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGRyYXcubVJlc3RvcmVTdGF0ZSA9IG1SZXN0b3JlU3RhdGU7Ci0gICAgICAgICAgICAgICAgbVJlc3RvcmVTdGF0ZSA9IG51bGw7CisgICAgICAgICAgICBpZiAobUluaXRpYWxWaWV3U3RhdGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGRyYXcubVZpZXdTdGF0ZSA9IG1Jbml0aWFsVmlld1N0YXRlOworICAgICAgICAgICAgICAgIG1Jbml0aWFsVmlld1N0YXRlID0gbnVsbDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChEZWJ1Z0ZsYWdzLldFQl9WSUVXX0NPUkUpIExvZy52KExPR1RBRywgIndlYmtpdERyYXcgTkVXX1BJQ1RVUkVfTVNHX0lEIik7CiAgICAgICAgICAgICBNZXNzYWdlLm9idGFpbihtV2ViVmlldy5tUHJpdmF0ZUhhbmRsZXIsCkBAIC0xNzUxLDUxICsxODQxLDYgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIC8vIFRoZXNlIGFyZSBjYWxsZWQgZnJvbSB0aGUgVUkgdGhyZWFkLCBub3Qgb3VyIHRocmVhZAotCi0gICAgc3RhdGljIGZpbmFsIGludCBaT09NX0JJVFMgPSBQYWludC5GSUxURVJfQklUTUFQX0ZMQUcgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYWludC5ESVRIRVJfRkxBRyB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhaW50LlNVQlBJWEVMX1RFWFRfRkxBRzsKLSAgICBzdGF0aWMgZmluYWwgaW50IFNDUk9MTF9CSVRTID0gUGFpbnQuRklMVEVSX0JJVE1BUF9GTEFHIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYWludC5ESVRIRVJfRkxBRzsKLQotICAgIGZpbmFsIERyYXdGaWx0ZXIgbVpvb21GaWx0ZXIgPQotICAgICAgICAgICAgICAgICAgICBuZXcgUGFpbnRGbGFnc0RyYXdGaWx0ZXIoWk9PTV9CSVRTLCBQYWludC5MSU5FQVJfVEVYVF9GTEFHKTsKLSAgICAvLyBJZiB3ZSBuZWVkIHRvIHRyYWRlIGJldHRlciBxdWFsaXR5IGZvciBzcGVlZCwgc2V0IG1TY3JvbGxGaWx0ZXIgdG8gbnVsbAotICAgIGZpbmFsIERyYXdGaWx0ZXIgbVNjcm9sbEZpbHRlciA9Ci0gICAgICAgICAgICAgICAgbmV3IFBhaW50RmxhZ3NEcmF3RmlsdGVyKFNDUk9MTF9CSVRTLCAwKTsKLQotICAgIC8qIHBhY2thZ2UgKi8gdm9pZCBkcmF3Q29udGVudFBpY3R1cmUoQ2FudmFzIGNhbnZhcywgaW50IGNvbG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBhbmltYXRpbmdab29tLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBhbmltYXRpbmdTY3JvbGwpIHsKLSAgICAgICAgRHJhd0ZpbHRlciBkZiA9IG51bGw7Ci0gICAgICAgIGlmIChhbmltYXRpbmdab29tKSB7Ci0gICAgICAgICAgICBkZiA9IG1ab29tRmlsdGVyOwotICAgICAgICB9IGVsc2UgaWYgKGFuaW1hdGluZ1Njcm9sbCkgewotICAgICAgICAgICAgZGYgPSBtU2Nyb2xsRmlsdGVyOwotICAgICAgICB9Ci0gICAgICAgIGNhbnZhcy5zZXREcmF3RmlsdGVyKGRmKTsKLSAgICAgICAgYm9vbGVhbiB0b29rVG9vTG9uZyA9IG5hdGl2ZURyYXdDb250ZW50KGNhbnZhcywgY29sb3IpOwotICAgICAgICBjYW52YXMuc2V0RHJhd0ZpbHRlcihudWxsKTsKLSAgICAgICAgaWYgKHRvb2tUb29Mb25nICYmIG1TcGxpdFBpY3R1cmVJc1NjaGVkdWxlZCA9PSBmYWxzZSkgewotICAgICAgICAgICAgbVNwbGl0UGljdHVyZUlzU2NoZWR1bGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIHNlbmRNZXNzYWdlKEV2ZW50SHViLlNQTElUX1BJQ1RVUkVfU0VUKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIHBhY2thZ2UgKi8gc3luY2hyb25pemVkIGJvb2xlYW4gcGljdHVyZVJlYWR5KCkgewotICAgICAgICByZXR1cm4gMCAhPSBtTmF0aXZlQ2xhc3MgPyBuYXRpdmVQaWN0dXJlUmVhZHkoKSA6IGZhbHNlOwotICAgIH0KLQotICAgIC8qcGFja2FnZSovIHN5bmNocm9uaXplZCBQaWN0dXJlIGNvcHlDb250ZW50UGljdHVyZSgpIHsKLSAgICAgICAgUGljdHVyZSByZXN1bHQgPSBuZXcgUGljdHVyZSgpOwotICAgICAgICBpZiAoMCAhPSBtTmF0aXZlQ2xhc3MpIHsKLSAgICAgICAgICAgIG5hdGl2ZUNvcHlDb250ZW50VG9QaWN0dXJlKHJlc3VsdCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KICAgICBzdGF0aWMgdm9pZCByZWR1Y2VQcmlvcml0eSgpIHsKICAgICAgICAgLy8gcmVtb3ZlIHRoZSBwZW5kaW5nIFJFRFVDRV9QUklPUklUWSBhbmQgUkVTVU1FX1BSSU9SSVRZIG1lc3NhZ2VzCiAgICAgICAgIHNXZWJDb3JlSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhXZWJDb3JlVGhyZWFkLlJFRFVDRV9QUklPUklUWSk7CkBAIC0xODE3LDYgKzE4NjIsOCBAQAogICAgICAgICAvLyBjYWxsZWQgZnJvbSBVSSB0aHJlYWQgd2hpbGUgV0VCS0lUX0RSQVcgaXMganVzdCBwdWxsZWQgb3V0IG9mIHRoZQogICAgICAgICAvLyBxdWV1ZSBpbiBXZWJDb3JlIHRocmVhZCB0byBiZSBleGVjdXRlZC4gVGhlbiB1cGRhdGUgd29uJ3QgYmUgYmxvY2tlZC4KICAgICAgICAgaWYgKGNvcmUgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKCFjb3JlLmdldFNldHRpbmdzKCkuZW5hYmxlU21vb3RoVHJhbnNpdGlvbigpKSByZXR1cm47CisKICAgICAgICAgICAgIHN5bmNocm9uaXplZCAoY29yZSkgewogICAgICAgICAgICAgICAgIGNvcmUubURyYXdJc1BhdXNlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgaWYgKGNvcmUubURyYXdJc1NjaGVkdWxlZCkgewpAQCAtMTgyOSwxMiArMTg3NiwxNiBAQAogCiAgICAgc3RhdGljIHZvaWQgcmVzdW1lVXBkYXRlUGljdHVyZShXZWJWaWV3Q29yZSBjb3JlKSB7CiAgICAgICAgIGlmIChjb3JlICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIGlmIG1EcmF3SXNQYXVzZWQgaXMgdHJ1ZSwgaWdub3JlIHRoZSBzZXR0aW5nLCBjb250aW51ZSB0byByZXN1bWUKKyAgICAgICAgICAgIGlmICghY29yZS5tRHJhd0lzUGF1c2VkCisgICAgICAgICAgICAgICAgICAgICYmICFjb3JlLmdldFNldHRpbmdzKCkuZW5hYmxlU21vb3RoVHJhbnNpdGlvbigpKSByZXR1cm47CisKICAgICAgICAgICAgIHN5bmNocm9uaXplZCAoY29yZSkgewogICAgICAgICAgICAgICAgIGNvcmUubURyYXdJc1BhdXNlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGlmIChjb3JlLm1EcmF3SXNTY2hlZHVsZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgY29yZS5tRHJhd0lzU2NoZWR1bGVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIGNvcmUuY29udGVudERyYXcoKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gYWx3YXlzIHJlZHJhdyBvbiByZXN1bWUgdG8gcmVlbmFibGUgZ2lmIGFuaW1hdGlvbnMKKyAgICAgICAgICAgICAgICBjb3JlLm1EcmF3SXNTY2hlZHVsZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBjb3JlLm5hdGl2ZUNvbnRlbnRJbnZhbGlkYXRlQWxsKCk7CisgICAgICAgICAgICAgICAgY29yZS5jb250ZW50RHJhdygpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtMTk3MSwyNCArMjAyMiw2IEBACiAgICAgICAgIG1SZXBhaW50U2NoZWR1bGVkID0gZmFsc2U7CiAgICAgfQogCi0gICAgLy8gY2FsbGVkIGJ5IEpOSQotICAgIHByaXZhdGUgdm9pZCBzZW5kSW1tZWRpYXRlUmVwYWludCgpIHsKLSAgICAgICAgaWYgKG1XZWJWaWV3ICE9IG51bGwgJiYgIW1SZXBhaW50U2NoZWR1bGVkKSB7Ci0gICAgICAgICAgICBtUmVwYWludFNjaGVkdWxlZCA9IHRydWU7Ci0gICAgICAgICAgICBNZXNzYWdlLm9idGFpbihtV2ViVmlldy5tUHJpdmF0ZUhhbmRsZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJWaWV3LklNTUVESUFURV9SRVBBSU5UX01TR19JRCkuc2VuZFRvVGFyZ2V0KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBjYWxsZWQgYnkgSk5JCi0gICAgcHJpdmF0ZSB2b2lkIHNldFJvb3RMYXllcihpbnQgbGF5ZXIpIHsKLSAgICAgICAgaWYgKG1XZWJWaWV3ICE9IG51bGwpIHsKLSAgICAgICAgICAgIE1lc3NhZ2Uub2J0YWluKG1XZWJWaWV3Lm1Qcml2YXRlSGFuZGxlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlZpZXcuU0VUX1JPT1RfTEFZRVJfTVNHX0lELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXIsIDApLnNlbmRUb1RhcmdldCgpOwotICAgICAgICB9Ci0gICAgfQotCiAgICAgLyogcGFja2FnZSAqLyBXZWJWaWV3IGdldFdlYlZpZXcoKSB7CiAgICAgICAgIHJldHVybiBtV2ViVmlldzsKICAgICB9CkBAIC0yMDA1LDE4ICsyMDM4LDI0IEBACiAKICAgICAgICAgaWYgKG1XZWJWaWV3ID09IG51bGwpIHJldHVybjsKIAotICAgICAgICBib29sZWFuIHVwZGF0ZVJlc3RvcmVTdGF0ZSA9IHN0YW5kYXJkTG9hZCB8fCBtUmVzdG9yZWRTY2FsZSA+IDA7Ci0gICAgICAgIHNldHVwVmlld3BvcnQodXBkYXRlUmVzdG9yZVN0YXRlKTsKKyAgICAgICAgYm9vbGVhbiB1cGRhdGVWaWV3U3RhdGUgPSBzdGFuZGFyZExvYWQgfHwgbVJlc3RvcmVkU2NhbGUgPiAwOworICAgICAgICBzZXR1cFZpZXdwb3J0KHVwZGF0ZVZpZXdTdGF0ZSk7CiAgICAgICAgIC8vIGlmIHVwZGF0ZVJlc3RvcmVTdGF0ZSBpcyB0cnVlLCBWaWV3TWFuYWdlci5wb3N0UmVhZHlUb0RyYXdBbGwoKSB3aWxsCi0gICAgICAgIC8vIGJlIGNhbGxlZCBhZnRlciB0aGUgV2ViVmlldyByZXN0b3JlIHRoZSBzdGF0ZS4gSWYgdXBkYXRlUmVzdG9yZVN0YXRlCisgICAgICAgIC8vIGJlIGNhbGxlZCBhZnRlciB0aGUgV2ViVmlldyB1cGRhdGVzIGl0cyBzdGF0ZS4gSWYgdXBkYXRlUmVzdG9yZVN0YXRlCiAgICAgICAgIC8vIGlzIGZhbHNlLCBzdGFydCB0byBkcmF3IG5vdyBhcyBpdCBpcyByZWFkeS4KLSAgICAgICAgaWYgKCF1cGRhdGVSZXN0b3JlU3RhdGUpIHsKKyAgICAgICAgaWYgKCF1cGRhdGVWaWV3U3RhdGUpIHsKICAgICAgICAgICAgIG1XZWJWaWV3Lm1WaWV3TWFuYWdlci5wb3N0UmVhZHlUb0RyYXdBbGwoKTsKICAgICAgICAgfQogCisgICAgICAgIC8vIHJlbW92ZSB0aGUgdG91Y2ggaGlnaGxpZ2h0IHdoZW4gbW92aW5nIHRvIGEgbmV3IHBhZ2UKKyAgICAgICAgaWYgKGdldFNldHRpbmdzKCkuc3VwcG9ydFRvdWNoT25seSgpKSB7CisgICAgICAgICAgICBtRXZlbnRIdWIuc2VuZE1lc3NhZ2UoTWVzc2FnZS5vYnRhaW4obnVsbCwKKyAgICAgICAgICAgICAgICAgICAgRXZlbnRIdWIuUkVNT1ZFX1RPVUNIX0hJR0hMSUdIVF9SRUNUUykpOworICAgICAgICB9CisKICAgICAgICAgLy8gcmVzZXQgdGhlIHNjcm9sbCBwb3NpdGlvbiwgdGhlIHJlc3RvcmVkIG9mZnNldCBhbmQgc2NhbGVzCiAgICAgICAgIG1XZWJraXRTY3JvbGxYID0gbVdlYmtpdFNjcm9sbFkgPSBtUmVzdG9yZWRYID0gbVJlc3RvcmVkWQotICAgICAgICAgICAgICAgID0gbVJlc3RvcmVkU2NhbGUgPSBtUmVzdG9yZWRTY3JlZW5XaWR0aFNjYWxlID0gMDsKKyAgICAgICAgICAgICAgICA9IG1SZXN0b3JlZFNjYWxlID0gbVJlc3RvcmVkVGV4dFdyYXBTY2FsZSA9IDA7CiAgICAgfQogCiAgICAgLy8gY2FsbGVkIGJ5IEpOSQpAQCAtMjAzMCwxNSArMjA2OSwxNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIHNldHVwVmlld3BvcnQoYm9vbGVhbiB1cGRhdGVSZXN0b3JlU3RhdGUpIHsKKyAgICBwcml2YXRlIHZvaWQgc2V0dXBWaWV3cG9ydChib29sZWFuIHVwZGF0ZVZpZXdTdGF0ZSkgewogICAgICAgICAvLyBzZXQgdGhlIHZpZXdwb3J0IHNldHRpbmdzIGZyb20gV2ViS2l0CiAgICAgICAgIHNldFZpZXdwb3J0U2V0dGluZ3NGcm9tTmF0aXZlKCk7CiAKICAgICAgICAgLy8gYWRqdXN0IHRoZSBkZWZhdWx0IHNjYWxlIHRvIG1hdGNoIHRoZSBkZW5zaXR5RHBpCiAgICAgICAgIGZsb2F0IGFkanVzdCA9IDEuMGY7CiAgICAgICAgIGlmIChtVmlld3BvcnREZW5zaXR5RHBpID09IC0xKSB7Ci0gICAgICAgICAgICBpZiAoV2ViVmlldy5ERUZBVUxUX1NDQUxFX1BFUkNFTlQgIT0gMTAwKSB7Ci0gICAgICAgICAgICAgICAgYWRqdXN0ID0gV2ViVmlldy5ERUZBVUxUX1NDQUxFX1BFUkNFTlQgLyAxMDAuMGY7CisgICAgICAgICAgICAvLyBjb252ZXJ0IGRlZmF1bHQgem9vbSBzY2FsZSB0byBhIGludGVnZXIgKHBlcmNlbnRhZ2UpIHRvIGF2b2lkIGFueQorICAgICAgICAgICAgLy8gaXNzdWVzIHdpdGggZmxvYXRpbmcgcG9pbnQgY29tcGFyaXNvbnMKKyAgICAgICAgICAgIGlmIChtV2ViVmlldyAhPSBudWxsICYmIChpbnQpKG1XZWJWaWV3LmdldERlZmF1bHRab29tU2NhbGUoKSAqIDEwMCkgIT0gMTAwKSB7CisgICAgICAgICAgICAgICAgYWRqdXN0ID0gbVdlYlZpZXcuZ2V0RGVmYXVsdFpvb21TY2FsZSgpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgaWYgKG1WaWV3cG9ydERlbnNpdHlEcGkgPiAwKSB7CiAgICAgICAgICAgICBhZGp1c3QgPSAoZmxvYXQpIG1Db250ZXh0LmdldFJlc291cmNlcygpLmdldERpc3BsYXlNZXRyaWNzKCkuZGVuc2l0eURwaQpAQCAtMjA4MCwxNyArMjEyMSwxNyBAQAogICAgICAgICB9CiAKICAgICAgICAgLy8gaWYgbVZpZXdwb3J0V2lkdGggaXMgMCwgaXQgbWVhbnMgZGV2aWNlLXdpZHRoLCBhbHdheXMgdXBkYXRlLgotICAgICAgICBpZiAobVZpZXdwb3J0V2lkdGggIT0gMCAmJiAhdXBkYXRlUmVzdG9yZVN0YXRlKSB7Ci0gICAgICAgICAgICBSZXN0b3JlU3RhdGUgcmVzdG9yZVN0YXRlID0gbmV3IFJlc3RvcmVTdGF0ZSgpOwotICAgICAgICAgICAgcmVzdG9yZVN0YXRlLm1NaW5TY2FsZSA9IG1WaWV3cG9ydE1pbmltdW1TY2FsZSAvIDEwMC4wZjsKLSAgICAgICAgICAgIHJlc3RvcmVTdGF0ZS5tTWF4U2NhbGUgPSBtVmlld3BvcnRNYXhpbXVtU2NhbGUgLyAxMDAuMGY7Ci0gICAgICAgICAgICByZXN0b3JlU3RhdGUubURlZmF1bHRTY2FsZSA9IGFkanVzdDsKKyAgICAgICAgaWYgKG1WaWV3cG9ydFdpZHRoICE9IDAgJiYgIXVwZGF0ZVZpZXdTdGF0ZSkgeworICAgICAgICAgICAgVmlld1N0YXRlIHZpZXdTdGF0ZSA9IG5ldyBWaWV3U3RhdGUoKTsKKyAgICAgICAgICAgIHZpZXdTdGF0ZS5tTWluU2NhbGUgPSBtVmlld3BvcnRNaW5pbXVtU2NhbGUgLyAxMDAuMGY7CisgICAgICAgICAgICB2aWV3U3RhdGUubU1heFNjYWxlID0gbVZpZXdwb3J0TWF4aW11bVNjYWxlIC8gMTAwLjBmOworICAgICAgICAgICAgdmlld1N0YXRlLm1EZWZhdWx0U2NhbGUgPSBhZGp1c3Q7CiAgICAgICAgICAgICAvLyBhcyBtVmlld3BvcnRXaWR0aCBpcyBub3QgMCwgaXQgaXMgbm90IG1vYmlsZSBzaXRlLgotICAgICAgICAgICAgcmVzdG9yZVN0YXRlLm1Nb2JpbGVTaXRlID0gZmFsc2U7CisgICAgICAgICAgICB2aWV3U3RhdGUubU1vYmlsZVNpdGUgPSBmYWxzZTsKICAgICAgICAgICAgIC8vIGZvciBub24tbW9iaWxlIHNpdGUsIHdlIGRvbid0IG5lZWQgbWluUHJlZldpZHRoLCBzZXQgaXQgYXMgMAotICAgICAgICAgICAgcmVzdG9yZVN0YXRlLm1TY3JvbGxYID0gMDsKKyAgICAgICAgICAgIHZpZXdTdGF0ZS5tU2Nyb2xsWCA9IDA7CiAgICAgICAgICAgICBNZXNzYWdlLm9idGFpbihtV2ViVmlldy5tUHJpdmF0ZUhhbmRsZXIsCi0gICAgICAgICAgICAgICAgICAgIFdlYlZpZXcuVVBEQVRFX1pPT01fUkFOR0UsIHJlc3RvcmVTdGF0ZSkuc2VuZFRvVGFyZ2V0KCk7CisgICAgICAgICAgICAgICAgICAgIFdlYlZpZXcuVVBEQVRFX1pPT01fUkFOR0UsIHZpZXdTdGF0ZSkuc2VuZFRvVGFyZ2V0KCk7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIApAQCAtMjExMSwzMiArMjE1MiwzMSBAQAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgd2ViVmlld1dpZHRoID0gTWF0aC5yb3VuZCh2aWV3cG9ydFdpZHRoICogbUN1cnJlbnRWaWV3U2NhbGUpOwogICAgICAgICB9Ci0gICAgICAgIG1SZXN0b3JlU3RhdGUgPSBuZXcgUmVzdG9yZVN0YXRlKCk7Ci0gICAgICAgIG1SZXN0b3JlU3RhdGUubU1pblNjYWxlID0gbVZpZXdwb3J0TWluaW11bVNjYWxlIC8gMTAwLjBmOwotICAgICAgICBtUmVzdG9yZVN0YXRlLm1NYXhTY2FsZSA9IG1WaWV3cG9ydE1heGltdW1TY2FsZSAvIDEwMC4wZjsKLSAgICAgICAgbVJlc3RvcmVTdGF0ZS5tRGVmYXVsdFNjYWxlID0gYWRqdXN0OwotICAgICAgICBtUmVzdG9yZVN0YXRlLm1TY3JvbGxYID0gbVJlc3RvcmVkWDsKLSAgICAgICAgbVJlc3RvcmVTdGF0ZS5tU2Nyb2xsWSA9IG1SZXN0b3JlZFk7Ci0gICAgICAgIG1SZXN0b3JlU3RhdGUubU1vYmlsZVNpdGUgPSAoMCA9PSBtVmlld3BvcnRXaWR0aCk7CisgICAgICAgIG1Jbml0aWFsVmlld1N0YXRlID0gbmV3IFZpZXdTdGF0ZSgpOworICAgICAgICBtSW5pdGlhbFZpZXdTdGF0ZS5tTWluU2NhbGUgPSBtVmlld3BvcnRNaW5pbXVtU2NhbGUgLyAxMDAuMGY7CisgICAgICAgIG1Jbml0aWFsVmlld1N0YXRlLm1NYXhTY2FsZSA9IG1WaWV3cG9ydE1heGltdW1TY2FsZSAvIDEwMC4wZjsKKyAgICAgICAgbUluaXRpYWxWaWV3U3RhdGUubURlZmF1bHRTY2FsZSA9IGFkanVzdDsKKyAgICAgICAgbUluaXRpYWxWaWV3U3RhdGUubVNjcm9sbFggPSBtUmVzdG9yZWRYOworICAgICAgICBtSW5pdGlhbFZpZXdTdGF0ZS5tU2Nyb2xsWSA9IG1SZXN0b3JlZFk7CisgICAgICAgIG1Jbml0aWFsVmlld1N0YXRlLm1Nb2JpbGVTaXRlID0gKDAgPT0gbVZpZXdwb3J0V2lkdGgpOwogICAgICAgICBpZiAobVJlc3RvcmVkU2NhbGUgPiAwKSB7Ci0gICAgICAgICAgICBtUmVzdG9yZVN0YXRlLm1WaWV3U2NhbGUgPSBtUmVzdG9yZWRTY2FsZSAvIDEwMC4wZjsKLSAgICAgICAgICAgIGlmIChtUmVzdG9yZWRTY3JlZW5XaWR0aFNjYWxlID4gMCkgewotICAgICAgICAgICAgICAgIG1SZXN0b3JlU3RhdGUubVRleHRXcmFwU2NhbGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgbVJlc3RvcmVkU2NyZWVuV2lkdGhTY2FsZSAvIDEwMC4wZjsKKyAgICAgICAgICAgIG1Jbml0aWFsVmlld1N0YXRlLm1WaWV3U2NhbGUgPSBtUmVzdG9yZWRTY2FsZSAvIDEwMC4wZjsKKyAgICAgICAgICAgIGlmIChtUmVzdG9yZWRUZXh0V3JhcFNjYWxlID4gMCkgeworICAgICAgICAgICAgICAgIG1Jbml0aWFsVmlld1N0YXRlLm1UZXh0V3JhcFNjYWxlID0gbVJlc3RvcmVkVGV4dFdyYXBTY2FsZSAvIDEwMC4wZjsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbVJlc3RvcmVTdGF0ZS5tVGV4dFdyYXBTY2FsZSA9IG1SZXN0b3JlU3RhdGUubVZpZXdTY2FsZTsKKyAgICAgICAgICAgICAgICBtSW5pdGlhbFZpZXdTdGF0ZS5tVGV4dFdyYXBTY2FsZSA9IG1Jbml0aWFsVmlld1N0YXRlLm1WaWV3U2NhbGU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBpZiAobVZpZXdwb3J0SW5pdGlhbFNjYWxlID4gMCkgewotICAgICAgICAgICAgICAgIG1SZXN0b3JlU3RhdGUubVZpZXdTY2FsZSA9IG1SZXN0b3JlU3RhdGUubVRleHRXcmFwU2NhbGUgPQorICAgICAgICAgICAgICAgIG1Jbml0aWFsVmlld1N0YXRlLm1WaWV3U2NhbGUgPSBtSW5pdGlhbFZpZXdTdGF0ZS5tVGV4dFdyYXBTY2FsZSA9CiAgICAgICAgICAgICAgICAgICAgICAgICBtVmlld3BvcnRJbml0aWFsU2NhbGUgLyAxMDAuMGY7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKG1WaWV3cG9ydFdpZHRoID4gMCAmJiBtVmlld3BvcnRXaWR0aCA8IHdlYlZpZXdXaWR0aCkgewotICAgICAgICAgICAgICAgIG1SZXN0b3JlU3RhdGUubVZpZXdTY2FsZSA9IG1SZXN0b3JlU3RhdGUubVRleHRXcmFwU2NhbGUgPQorICAgICAgICAgICAgICAgIG1Jbml0aWFsVmlld1N0YXRlLm1WaWV3U2NhbGUgPSBtSW5pdGlhbFZpZXdTdGF0ZS5tVGV4dFdyYXBTY2FsZSA9CiAgICAgICAgICAgICAgICAgICAgICAgICAoZmxvYXQpIHdlYlZpZXdXaWR0aCAvIG1WaWV3cG9ydFdpZHRoOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtUmVzdG9yZVN0YXRlLm1UZXh0V3JhcFNjYWxlID0gYWRqdXN0OworICAgICAgICAgICAgICAgIG1Jbml0aWFsVmlld1N0YXRlLm1UZXh0V3JhcFNjYWxlID0gYWRqdXN0OwogICAgICAgICAgICAgICAgIC8vIDAgd2lsbCB0cmlnZ2VyIFdlYlZpZXcgdG8gdHVybiBvbiB6b29tIG92ZXJ2aWV3IG1vZGUKLSAgICAgICAgICAgICAgICBtUmVzdG9yZVN0YXRlLm1WaWV3U2NhbGUgPSAwOworICAgICAgICAgICAgICAgIG1Jbml0aWFsVmlld1N0YXRlLm1WaWV3U2NhbGUgPSAwOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTIxNzcsMTUgKzIyMTcsMTUgQEAKICAgICAgICAgICAgICAgICAvLyBtVmlld1NjYWxlIGFzIDAgbWVhbnMgaXQgaXMgaW4gem9vbSBvdmVydmlldyBtb2RlLiBTbyB3ZSBkb24ndAogICAgICAgICAgICAgICAgIC8vIGtub3cgdGhlIGV4YWN0IHNjYWxlLiBJZiBtUmVzdG9yZWRTY2FsZSBpcyBub24temVybywgdXNlIGl0OwogICAgICAgICAgICAgICAgIC8vIG90aGVyd2lzZSBqdXN0IHVzZSBtVGV4dFdyYXBTY2FsZSBhcyB0aGUgaW5pdGlhbCBzY2FsZS4KLSAgICAgICAgICAgICAgICBkYXRhLm1TY2FsZSA9IG1SZXN0b3JlU3RhdGUubVZpZXdTY2FsZSA9PSAwCisgICAgICAgICAgICAgICAgZGF0YS5tU2NhbGUgPSBtSW5pdGlhbFZpZXdTdGF0ZS5tVmlld1NjYWxlID09IDAKICAgICAgICAgICAgICAgICAgICAgICAgID8gKG1SZXN0b3JlZFNjYWxlID4gMCA/IG1SZXN0b3JlZFNjYWxlIC8gMTAwLjBmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbVJlc3RvcmVTdGF0ZS5tVGV4dFdyYXBTY2FsZSkKLSAgICAgICAgICAgICAgICAgICAgICAgIDogbVJlc3RvcmVTdGF0ZS5tVmlld1NjYWxlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG1Jbml0aWFsVmlld1N0YXRlLm1UZXh0V3JhcFNjYWxlKQorICAgICAgICAgICAgICAgICAgICAgICAgOiBtSW5pdGlhbFZpZXdTdGF0ZS5tVmlld1NjYWxlOwogICAgICAgICAgICAgICAgIGlmIChEZWJ1Z0ZsYWdzLldFQl9WSUVXX0NPUkUpIHsKICAgICAgICAgICAgICAgICAgICAgTG9nLnYoTE9HVEFHLCAic2V0dXBWaWV3cG9ydCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIG1SZXN0b3JlZFNjYWxlPSIgKyBtUmVzdG9yZWRTY2FsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgbVZpZXdTY2FsZT0iICsgbVJlc3RvcmVTdGF0ZS5tVmlld1NjYWxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBtVGV4dFdyYXBTY2FsZT0iICsgbVJlc3RvcmVTdGF0ZS5tVGV4dFdyYXBTY2FsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgbVZpZXdTY2FsZT0iICsgbUluaXRpYWxWaWV3U3RhdGUubVZpZXdTY2FsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgbVRleHRXcmFwU2NhbGU9IiArIG1Jbml0aWFsVmlld1N0YXRlLm1UZXh0V3JhcFNjYWxlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGRhdGEubVdpZHRoID0gTWF0aC5yb3VuZCh3ZWJWaWV3V2lkdGggLyBkYXRhLm1TY2FsZSk7CkBAIC0yMTk4LDcgKzIyMzgsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5yb3VuZChtV2ViVmlldy5nZXRWaWV3SGVpZ2h0KCkgLyBkYXRhLm1TY2FsZSkKICAgICAgICAgICAgICAgICAgICAgICAgIDogbUN1cnJlbnRWaWV3SGVpZ2h0ICogZGF0YS5tV2lkdGggLyB2aWV3cG9ydFdpZHRoOwogICAgICAgICAgICAgICAgIGRhdGEubVRleHRXcmFwV2lkdGggPSBNYXRoLnJvdW5kKHdlYlZpZXdXaWR0aAotICAgICAgICAgICAgICAgICAgICAgICAgLyBtUmVzdG9yZVN0YXRlLm1UZXh0V3JhcFNjYWxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8gbUluaXRpYWxWaWV3U3RhdGUubVRleHRXcmFwU2NhbGUpOwogICAgICAgICAgICAgICAgIGRhdGEubUlnbm9yZUhlaWdodCA9IGZhbHNlOwogICAgICAgICAgICAgICAgIGRhdGEubUFuY2hvclggPSBkYXRhLm1BbmNob3JZID0gMDsKICAgICAgICAgICAgICAgICAvLyBzZW5kIFZJRVdfU0laRV9DSEFOR0VEIHRvIHRoZSBmcm9udCBvZiB0aGUgcXVldWUgc28gdGhhdCB3ZQpAQCAtMjIxMSwyMCArMjI1MSwxMiBAQAogICAgIH0KIAogICAgIC8vIGNhbGxlZCBieSBKTkkKLSAgICBwcml2YXRlIHZvaWQgcmVzdG9yZVNjYWxlKGludCBzY2FsZSkgeworICAgIHByaXZhdGUgdm9pZCByZXN0b3JlU2NhbGUoaW50IHNjYWxlLCBpbnQgdGV4dFdyYXBTY2FsZSkgewogICAgICAgICBpZiAobUJyb3dzZXJGcmFtZS5maXJzdExheW91dERvbmUoKSA9PSBmYWxzZSkgewogICAgICAgICAgICAgbVJlc3RvcmVkU2NhbGUgPSBzY2FsZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIGNhbGxlZCBieSBKTkkKLSAgICBwcml2YXRlIHZvaWQgcmVzdG9yZVNjcmVlbldpZHRoU2NhbGUoaW50IHNjYWxlKSB7Ci0gICAgICAgIGlmICghbVNldHRpbmdzLmdldFVzZVdpZGVWaWV3UG9ydCgpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobUJyb3dzZXJGcmFtZS5maXJzdExheW91dERvbmUoKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgbVJlc3RvcmVkU2NyZWVuV2lkdGhTY2FsZSA9IHNjYWxlOworICAgICAgICAgICAgaWYgKG1TZXR0aW5ncy5nZXRVc2VXaWRlVmlld1BvcnQoKSkgeworICAgICAgICAgICAgICAgIG1SZXN0b3JlZFRleHRXcmFwU2NhbGUgPSB0ZXh0V3JhcFNjYWxlOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCkBAIC0yNDYyLDYgKzI0OTQsMjQgQEAKICAgICAgICAgICAgICAgICBoTW9kZSwgdk1vZGUpLnNlbmRUb1RhcmdldCgpOwogICAgIH0KIAorICAgIHByaXZhdGUgdm9pZCB1c2VNb2NrRGV2aWNlT3JpZW50YXRpb24oKSB7CisgICAgICAgIG1EZXZpY2VPcmllbnRhdGlvbk1hbmFnZXIudXNlTW9jaygpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE1vY2tEZXZpY2VPcmllbnRhdGlvbihib29sZWFuIGNhblByb3ZpZGVBbHBoYSwgZG91YmxlIGFscGhhLAorICAgICAgICAgICAgYm9vbGVhbiBjYW5Qcm92aWRlQmV0YSwgZG91YmxlIGJldGEsIGJvb2xlYW4gY2FuUHJvdmlkZUdhbW1hLCBkb3VibGUgZ2FtbWEpIHsKKyAgICAgICAgbURldmljZU9yaWVudGF0aW9uTWFuYWdlci5zZXRNb2NrT3JpZW50YXRpb24oY2FuUHJvdmlkZUFscGhhLCBhbHBoYSwgY2FuUHJvdmlkZUJldGEsIGJldGEsCisgICAgICAgICAgICAgICAgY2FuUHJvdmlkZUdhbW1hLCBnYW1tYSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIERldmljZU9yaWVudGF0aW9uU2VydmljZSBnZXREZXZpY2VPcmllbnRhdGlvblNlcnZpY2UoKSB7CisgICAgICAgIGlmIChtRGV2aWNlT3JpZW50YXRpb25TZXJ2aWNlID09IG51bGwpIHsKKyAgICAgICAgICAgIG1EZXZpY2VPcmllbnRhdGlvblNlcnZpY2UgPQorICAgICAgICAgICAgICAgICAgICBuZXcgRGV2aWNlT3JpZW50YXRpb25TZXJ2aWNlKG1EZXZpY2VPcmllbnRhdGlvbk1hbmFnZXIsIG1Db250ZXh0KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbURldmljZU9yaWVudGF0aW9uU2VydmljZTsKKyAgICB9CisKICAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5hdGl2ZVBhdXNlKCk7CiAgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuYXRpdmVSZXN1bWUoKTsKICAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5hdGl2ZUZyZWVNZW1vcnkoKTsKQEAgLTI0NjksNCArMjUxOSw2IEBACiAgICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiBuYXRpdmVWYWxpZE5vZGVBbmRCb3VuZHMoaW50IGZyYW1lLCBpbnQgbm9kZSwKICAgICAgICAgICAgIFJlY3QgYm91bmRzKTsKIAorICAgIHByaXZhdGUgbmF0aXZlIEFycmF5TGlzdDxSZWN0PiBuYXRpdmVHZXRUb3VjaEhpZ2hsaWdodFJlY3RzKGludCB4LCBpbnQgeSwKKyAgICAgICAgICAgIGludCBzbG9wKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9XZWJWaWV3RGF0YWJhc2UuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9XZWJWaWV3RGF0YWJhc2UuamF2YQppbmRleCA3YWNkOWJhLi5kN2I0NDUyIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViVmlld0RhdGFiYXNlLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYlZpZXdEYXRhYmFzZS5qYXZhCkBAIC0xNzMsMTEyICsxNzMsMTQwIEBACiAKICAgICBwcml2YXRlIHN0YXRpYyBpbnQgbUNhY2hlVHJhbnNhY3Rpb25SZWZjb3VudDsKIAotICAgIHByaXZhdGUgV2ViVmlld0RhdGFiYXNlKCkgeworICAgIC8vIEluaXRpYWxseSB0cnVlIHVudGlsIHRoZSBiYWNrZ3JvdW5kIHRocmVhZCBjb21wbGV0ZXMuCisgICAgcHJpdmF0ZSBib29sZWFuIG1Jbml0aWFsaXplZCA9IGZhbHNlOworCisgICAgcHJpdmF0ZSBXZWJWaWV3RGF0YWJhc2UoZmluYWwgQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIG5ldyBUaHJlYWQoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICBpbml0KGNvbnRleHQpOworICAgICAgICAgICAgfQorICAgICAgICB9LnN0YXJ0KCk7CisKICAgICAgICAgLy8gU2luZ2xldG9uIG9ubHksIHVzZSBnZXRJbnN0YW5jZSgpCiAgICAgfQogCiAgICAgcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgV2ViVmlld0RhdGFiYXNlIGdldEluc3RhbmNlKENvbnRleHQgY29udGV4dCkgewogICAgICAgICBpZiAobUluc3RhbmNlID09IG51bGwpIHsKLSAgICAgICAgICAgIG1JbnN0YW5jZSA9IG5ldyBXZWJWaWV3RGF0YWJhc2UoKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbURhdGFiYXNlID0gY29udGV4dAotICAgICAgICAgICAgICAgICAgICAgICAgLm9wZW5PckNyZWF0ZURhdGFiYXNlKERBVEFCQVNFX0ZJTEUsIDAsIG51bGwpOwotICAgICAgICAgICAgfSBjYXRjaCAoU1FMaXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyB0cnkgYWdhaW4gYnkgZGVsZXRpbmcgdGhlIG9sZCBkYiBhbmQgY3JlYXRlIGEgbmV3IG9uZQotICAgICAgICAgICAgICAgIGlmIChjb250ZXh0LmRlbGV0ZURhdGFiYXNlKERBVEFCQVNFX0ZJTEUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1EYXRhYmFzZSA9IGNvbnRleHQub3Blbk9yQ3JlYXRlRGF0YWJhc2UoREFUQUJBU0VfRklMRSwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBtSW5zdGFuY2UgPSBuZXcgV2ViVmlld0RhdGFiYXNlKGNvbnRleHQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtSW5zdGFuY2U7CisgICAgfQogCi0gICAgICAgICAgICAvLyBtRGF0YWJhc2Ugc2hvdWxkIG5vdCBiZSBudWxsLCAKLSAgICAgICAgICAgIC8vIHRoZSBvbmx5IGNhc2UgaXMgUmVxdWVzdEFQSSB0ZXN0IGhhcyBwcm9ibGVtIHRvIGNyZWF0ZSBkYiAKLSAgICAgICAgICAgIGlmIChtRGF0YWJhc2UgIT0gbnVsbCAmJiBtRGF0YWJhc2UuZ2V0VmVyc2lvbigpICE9IERBVEFCQVNFX1ZFUlNJT04pIHsKLSAgICAgICAgICAgICAgICBtRGF0YWJhc2UuYmVnaW5UcmFuc2FjdGlvbigpOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHVwZ3JhZGVEYXRhYmFzZSgpOwotICAgICAgICAgICAgICAgICAgICBtRGF0YWJhc2Uuc2V0VHJhbnNhY3Rpb25TdWNjZXNzZnVsKCk7Ci0gICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAgICAgbURhdGFiYXNlLmVuZFRyYW5zYWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQorICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgaW5pdChDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgaWYgKG1Jbml0aWFsaXplZCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmIChtRGF0YWJhc2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIHVzZSBwZXIgdGFibGUgTXV0ZXggbG9jaywgdHVybiBvZmYgZGF0YWJhc2UgbG9jaywgdGhpcwotICAgICAgICAgICAgICAgIC8vIGltcHJvdmVzIHBlcmZvcm1hbmNlIGFzIGRhdGFiYXNlJ3MgUmVlbnRyYW50TG9jayBpcyBleHBhbnNpdmUKLSAgICAgICAgICAgICAgICBtRGF0YWJhc2Uuc2V0TG9ja2luZ0VuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG1DYWNoZURhdGFiYXNlID0gY29udGV4dC5vcGVuT3JDcmVhdGVEYXRhYmFzZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIENBQ0hFX0RBVEFCQVNFX0ZJTEUsIDAsIG51bGwpOwotICAgICAgICAgICAgfSBjYXRjaCAoU1FMaXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyB0cnkgYWdhaW4gYnkgZGVsZXRpbmcgdGhlIG9sZCBkYiBhbmQgY3JlYXRlIGEgbmV3IG9uZQotICAgICAgICAgICAgICAgIGlmIChjb250ZXh0LmRlbGV0ZURhdGFiYXNlKENBQ0hFX0RBVEFCQVNFX0ZJTEUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1DYWNoZURhdGFiYXNlID0gY29udGV4dC5vcGVuT3JDcmVhdGVEYXRhYmFzZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQUNIRV9EQVRBQkFTRV9GSUxFLCAwLCBudWxsKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIG1DYWNoZURhdGFiYXNlIHNob3VsZCBub3QgYmUgbnVsbCwgCi0gICAgICAgICAgICAvLyB0aGUgb25seSBjYXNlIGlzIFJlcXVlc3RBUEkgdGVzdCBoYXMgcHJvYmxlbSB0byBjcmVhdGUgZGIgCi0gICAgICAgICAgICBpZiAobUNhY2hlRGF0YWJhc2UgIT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAmJiBtQ2FjaGVEYXRhYmFzZS5nZXRWZXJzaW9uKCkgIT0gQ0FDSEVfREFUQUJBU0VfVkVSU0lPTikgewotICAgICAgICAgICAgICAgIG1DYWNoZURhdGFiYXNlLmJlZ2luVHJhbnNhY3Rpb24oKTsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICB1cGdyYWRlQ2FjaGVEYXRhYmFzZSgpOwotICAgICAgICAgICAgICAgICAgICBib290c3RyYXBDYWNoZURhdGFiYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1DYWNoZURhdGFiYXNlLnNldFRyYW5zYWN0aW9uU3VjY2Vzc2Z1bCgpOwotICAgICAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgICAgIG1DYWNoZURhdGFiYXNlLmVuZFRyYW5zYWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIEVyYXNlIHRoZSBmaWxlcyBmcm9tIHRoZSBmaWxlIHN5c3RlbSBpbiB0aGUgCi0gICAgICAgICAgICAgICAgLy8gY2FzZSB0aGF0IHRoZSBkYXRhYmFzZSB3YXMgdXBkYXRlZCBhbmQgdGhlIAotICAgICAgICAgICAgICAgIC8vIHRoZXJlIHdlcmUgZXhpc3RpbmcgY2FjaGUgY29udGVudAotICAgICAgICAgICAgICAgIENhY2hlTWFuYWdlci5yZW1vdmVBbGxDYWNoZUZpbGVzKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtQ2FjaGVEYXRhYmFzZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gdXNlIHJlYWRfdW5jb21taXR0ZWQgdG8gc3BlZWQgdXAgUkVBRAotICAgICAgICAgICAgICAgIG1DYWNoZURhdGFiYXNlLmV4ZWNTUUwoIlBSQUdNQSByZWFkX3VuY29tbWl0dGVkID0gdHJ1ZTsiKTsKLSAgICAgICAgICAgICAgICAvLyBhcyBvbmx5IFJFQUQgY2FuIGJlIGNhbGxlZCBpbiB0aGUgbm9uLVdlYlZpZXdXb3JrZXJUaHJlYWQsCi0gICAgICAgICAgICAgICAgLy8gYW5kIHJlYWRfdW5jb21taXR0ZWQgaXMgdXNlZCwgd2UgY2FuIHR1cm4gb2ZmIGRhdGFiYXNlIGxvY2sKLSAgICAgICAgICAgICAgICAvLyB0byB1c2UgdHJhbnNhY3Rpb24uCi0gICAgICAgICAgICAgICAgbUNhY2hlRGF0YWJhc2Uuc2V0TG9ja2luZ0VuYWJsZWQoZmFsc2UpOwotCi0gICAgICAgICAgICAgICAgLy8gdXNlIEluc2VydEhlbHBlciBmb3IgZmFzdGVyIGluc2VydGlvbgotICAgICAgICAgICAgICAgIG1DYWNoZUluc2VydGVyID0gbmV3IERhdGFiYXNlVXRpbHMuSW5zZXJ0SGVscGVyKG1DYWNoZURhdGFiYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgImNhY2hlIik7Ci0gICAgICAgICAgICAgICAgbUNhY2hlVXJsQ29sSW5kZXggPSBtQ2FjaGVJbnNlcnRlcgotICAgICAgICAgICAgICAgICAgICAgICAgLmdldENvbHVtbkluZGV4KENBQ0hFX1VSTF9DT0wpOwotICAgICAgICAgICAgICAgIG1DYWNoZUZpbGVQYXRoQ29sSW5kZXggPSBtQ2FjaGVJbnNlcnRlcgotICAgICAgICAgICAgICAgICAgICAgICAgLmdldENvbHVtbkluZGV4KENBQ0hFX0ZJTEVfUEFUSF9DT0wpOwotICAgICAgICAgICAgICAgIG1DYWNoZUxhc3RNb2RpZnlDb2xJbmRleCA9IG1DYWNoZUluc2VydGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Q29sdW1uSW5kZXgoQ0FDSEVfTEFTVF9NT0RJRllfQ09MKTsKLSAgICAgICAgICAgICAgICBtQ2FjaGVFVGFnQ29sSW5kZXggPSBtQ2FjaGVJbnNlcnRlcgotICAgICAgICAgICAgICAgICAgICAgICAgLmdldENvbHVtbkluZGV4KENBQ0hFX0VUQUdfQ09MKTsKLSAgICAgICAgICAgICAgICBtQ2FjaGVFeHBpcmVzQ29sSW5kZXggPSBtQ2FjaGVJbnNlcnRlcgotICAgICAgICAgICAgICAgICAgICAgICAgLmdldENvbHVtbkluZGV4KENBQ0hFX0VYUElSRVNfQ09MKTsKLSAgICAgICAgICAgICAgICBtQ2FjaGVFeHBpcmVzU3RyaW5nQ29sSW5kZXggPSBtQ2FjaGVJbnNlcnRlcgotICAgICAgICAgICAgICAgICAgICAgICAgLmdldENvbHVtbkluZGV4KENBQ0hFX0VYUElSRVNfU1RSSU5HX0NPTCk7Ci0gICAgICAgICAgICAgICAgbUNhY2hlTWltZVR5cGVDb2xJbmRleCA9IG1DYWNoZUluc2VydGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Q29sdW1uSW5kZXgoQ0FDSEVfTUlNRVRZUEVfQ09MKTsKLSAgICAgICAgICAgICAgICBtQ2FjaGVFbmNvZGluZ0NvbEluZGV4ID0gbUNhY2hlSW5zZXJ0ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRDb2x1bW5JbmRleChDQUNIRV9FTkNPRElOR19DT0wpOwotICAgICAgICAgICAgICAgIG1DYWNoZUh0dHBTdGF0dXNDb2xJbmRleCA9IG1DYWNoZUluc2VydGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Q29sdW1uSW5kZXgoQ0FDSEVfSFRUUF9TVEFUVVNfQ09MKTsKLSAgICAgICAgICAgICAgICBtQ2FjaGVMb2NhdGlvbkNvbEluZGV4ID0gbUNhY2hlSW5zZXJ0ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRDb2x1bW5JbmRleChDQUNIRV9MT0NBVElPTl9DT0wpOwotICAgICAgICAgICAgICAgIG1DYWNoZUNvbnRlbnRMZW5ndGhDb2xJbmRleCA9IG1DYWNoZUluc2VydGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Q29sdW1uSW5kZXgoQ0FDSEVfQ09OVEVOVExFTkdUSF9DT0wpOwotICAgICAgICAgICAgICAgIG1DYWNoZUNvbnRlbnREaXNwb3NpdGlvbkNvbEluZGV4ID0gbUNhY2hlSW5zZXJ0ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRDb2x1bW5JbmRleChDQUNIRV9DT05URU5URElTUE9TSVRJT05fQ09MKTsKLSAgICAgICAgICAgICAgICBtQ2FjaGVDcm9zc0RvbWFpbkNvbEluZGV4ID0gbUNhY2hlSW5zZXJ0ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRDb2x1bW5JbmRleChDQUNIRV9DUk9TU0RPTUFJTl9DT0wpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgbURhdGFiYXNlID0gY29udGV4dC5vcGVuT3JDcmVhdGVEYXRhYmFzZShEQVRBQkFTRV9GSUxFLCAwLCBudWxsKTsKKyAgICAgICAgfSBjYXRjaCAoU1FMaXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIHRyeSBhZ2FpbiBieSBkZWxldGluZyB0aGUgb2xkIGRiIGFuZCBjcmVhdGUgYSBuZXcgb25lCisgICAgICAgICAgICBpZiAoY29udGV4dC5kZWxldGVEYXRhYmFzZShEQVRBQkFTRV9GSUxFKSkgeworICAgICAgICAgICAgICAgIG1EYXRhYmFzZSA9IGNvbnRleHQub3Blbk9yQ3JlYXRlRGF0YWJhc2UoREFUQUJBU0VfRklMRSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bGwpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgcmV0dXJuIG1JbnN0YW5jZTsKKyAgICAgICAgLy8gbURhdGFiYXNlIHNob3VsZCBub3QgYmUgbnVsbCwKKyAgICAgICAgLy8gdGhlIG9ubHkgY2FzZSBpcyBSZXF1ZXN0QVBJIHRlc3QgaGFzIHByb2JsZW0gdG8gY3JlYXRlIGRiCisgICAgICAgIGlmIChtRGF0YWJhc2UgPT0gbnVsbCkgeworICAgICAgICAgICAgbUluaXRpYWxpemVkID0gdHJ1ZTsKKyAgICAgICAgICAgIG5vdGlmeSgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1EYXRhYmFzZS5nZXRWZXJzaW9uKCkgIT0gREFUQUJBU0VfVkVSU0lPTikgeworICAgICAgICAgICAgbURhdGFiYXNlLmJlZ2luVHJhbnNhY3Rpb24oKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgdXBncmFkZURhdGFiYXNlKCk7CisgICAgICAgICAgICAgICAgbURhdGFiYXNlLnNldFRyYW5zYWN0aW9uU3VjY2Vzc2Z1bCgpOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBtRGF0YWJhc2UuZW5kVHJhbnNhY3Rpb24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIHVzZSBwZXIgdGFibGUgTXV0ZXggbG9jaywgdHVybiBvZmYgZGF0YWJhc2UgbG9jaywgdGhpcworICAgICAgICAvLyBpbXByb3ZlcyBwZXJmb3JtYW5jZSBhcyBkYXRhYmFzZSdzIFJlZW50cmFudExvY2sgaXMKKyAgICAgICAgLy8gZXhwYW5zaXZlCisgICAgICAgIG1EYXRhYmFzZS5zZXRMb2NraW5nRW5hYmxlZChmYWxzZSk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1DYWNoZURhdGFiYXNlID0gY29udGV4dC5vcGVuT3JDcmVhdGVEYXRhYmFzZSgKKyAgICAgICAgICAgICAgICAgICAgQ0FDSEVfREFUQUJBU0VfRklMRSwgMCwgbnVsbCk7CisgICAgICAgIH0gY2F0Y2ggKFNRTGl0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyB0cnkgYWdhaW4gYnkgZGVsZXRpbmcgdGhlIG9sZCBkYiBhbmQgY3JlYXRlIGEgbmV3IG9uZQorICAgICAgICAgICAgaWYgKGNvbnRleHQuZGVsZXRlRGF0YWJhc2UoQ0FDSEVfREFUQUJBU0VfRklMRSkpIHsKKyAgICAgICAgICAgICAgICBtQ2FjaGVEYXRhYmFzZSA9IGNvbnRleHQub3Blbk9yQ3JlYXRlRGF0YWJhc2UoCisgICAgICAgICAgICAgICAgICAgICAgICBDQUNIRV9EQVRBQkFTRV9GSUxFLCAwLCBudWxsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIG1DYWNoZURhdGFiYXNlIHNob3VsZCBub3QgYmUgbnVsbCwKKyAgICAgICAgLy8gdGhlIG9ubHkgY2FzZSBpcyBSZXF1ZXN0QVBJIHRlc3QgaGFzIHByb2JsZW0gdG8gY3JlYXRlIGRiCisgICAgICAgIGlmIChtQ2FjaGVEYXRhYmFzZSA9PSBudWxsKSB7CisgICAgICAgICAgICBtSW5pdGlhbGl6ZWQgPSB0cnVlOworICAgICAgICAgICAgbm90aWZ5KCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAobUNhY2hlRGF0YWJhc2UuZ2V0VmVyc2lvbigpICE9IENBQ0hFX0RBVEFCQVNFX1ZFUlNJT04pIHsKKyAgICAgICAgICAgIG1DYWNoZURhdGFiYXNlLmJlZ2luVHJhbnNhY3Rpb24oKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgdXBncmFkZUNhY2hlRGF0YWJhc2UoKTsKKyAgICAgICAgICAgICAgICBib290c3RyYXBDYWNoZURhdGFiYXNlKCk7CisgICAgICAgICAgICAgICAgbUNhY2hlRGF0YWJhc2Uuc2V0VHJhbnNhY3Rpb25TdWNjZXNzZnVsKCk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIG1DYWNoZURhdGFiYXNlLmVuZFRyYW5zYWN0aW9uKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBFcmFzZSB0aGUgZmlsZXMgZnJvbSB0aGUgZmlsZSBzeXN0ZW0gaW4gdGhlCisgICAgICAgICAgICAvLyBjYXNlIHRoYXQgdGhlIGRhdGFiYXNlIHdhcyB1cGRhdGVkIGFuZCB0aGUKKyAgICAgICAgICAgIC8vIHRoZXJlIHdlcmUgZXhpc3RpbmcgY2FjaGUgY29udGVudAorICAgICAgICAgICAgQ2FjaGVNYW5hZ2VyLnJlbW92ZUFsbENhY2hlRmlsZXMoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHVzZSByZWFkX3VuY29tbWl0dGVkIHRvIHNwZWVkIHVwIFJFQUQKKyAgICAgICAgbUNhY2hlRGF0YWJhc2UuZXhlY1NRTCgiUFJBR01BIHJlYWRfdW5jb21taXR0ZWQgPSB0cnVlOyIpOworICAgICAgICAvLyBhcyBvbmx5IFJFQUQgY2FuIGJlIGNhbGxlZCBpbiB0aGUKKyAgICAgICAgLy8gbm9uLVdlYlZpZXdXb3JrZXJUaHJlYWQsIGFuZCByZWFkX3VuY29tbWl0dGVkIGlzIHVzZWQsCisgICAgICAgIC8vIHdlIGNhbiB0dXJuIG9mZiBkYXRhYmFzZSBsb2NrIHRvIHVzZSB0cmFuc2FjdGlvbi4KKyAgICAgICAgbUNhY2hlRGF0YWJhc2Uuc2V0TG9ja2luZ0VuYWJsZWQoZmFsc2UpOworCisgICAgICAgIC8vIHVzZSBJbnNlcnRIZWxwZXIgZm9yIGZhc3RlciBpbnNlcnRpb24KKyAgICAgICAgbUNhY2hlSW5zZXJ0ZXIgPQorICAgICAgICAgICAgICAgIG5ldyBEYXRhYmFzZVV0aWxzLkluc2VydEhlbHBlcihtQ2FjaGVEYXRhYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjYWNoZSIpOworICAgICAgICBtQ2FjaGVVcmxDb2xJbmRleCA9IG1DYWNoZUluc2VydGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldENvbHVtbkluZGV4KENBQ0hFX1VSTF9DT0wpOworICAgICAgICBtQ2FjaGVGaWxlUGF0aENvbEluZGV4ID0gbUNhY2hlSW5zZXJ0ZXIKKyAgICAgICAgICAgICAgICAuZ2V0Q29sdW1uSW5kZXgoQ0FDSEVfRklMRV9QQVRIX0NPTCk7CisgICAgICAgIG1DYWNoZUxhc3RNb2RpZnlDb2xJbmRleCA9IG1DYWNoZUluc2VydGVyCisgICAgICAgICAgICAgICAgLmdldENvbHVtbkluZGV4KENBQ0hFX0xBU1RfTU9ESUZZX0NPTCk7CisgICAgICAgIG1DYWNoZUVUYWdDb2xJbmRleCA9IG1DYWNoZUluc2VydGVyCisgICAgICAgICAgICAgICAgLmdldENvbHVtbkluZGV4KENBQ0hFX0VUQUdfQ09MKTsKKyAgICAgICAgbUNhY2hlRXhwaXJlc0NvbEluZGV4ID0gbUNhY2hlSW5zZXJ0ZXIKKyAgICAgICAgICAgICAgICAuZ2V0Q29sdW1uSW5kZXgoQ0FDSEVfRVhQSVJFU19DT0wpOworICAgICAgICBtQ2FjaGVFeHBpcmVzU3RyaW5nQ29sSW5kZXggPSBtQ2FjaGVJbnNlcnRlcgorICAgICAgICAgICAgICAgIC5nZXRDb2x1bW5JbmRleChDQUNIRV9FWFBJUkVTX1NUUklOR19DT0wpOworICAgICAgICBtQ2FjaGVNaW1lVHlwZUNvbEluZGV4ID0gbUNhY2hlSW5zZXJ0ZXIKKyAgICAgICAgICAgICAgICAuZ2V0Q29sdW1uSW5kZXgoQ0FDSEVfTUlNRVRZUEVfQ09MKTsKKyAgICAgICAgbUNhY2hlRW5jb2RpbmdDb2xJbmRleCA9IG1DYWNoZUluc2VydGVyCisgICAgICAgICAgICAgICAgLmdldENvbHVtbkluZGV4KENBQ0hFX0VOQ09ESU5HX0NPTCk7CisgICAgICAgIG1DYWNoZUh0dHBTdGF0dXNDb2xJbmRleCA9IG1DYWNoZUluc2VydGVyCisgICAgICAgICAgICAgICAgLmdldENvbHVtbkluZGV4KENBQ0hFX0hUVFBfU1RBVFVTX0NPTCk7CisgICAgICAgIG1DYWNoZUxvY2F0aW9uQ29sSW5kZXggPSBtQ2FjaGVJbnNlcnRlcgorICAgICAgICAgICAgICAgIC5nZXRDb2x1bW5JbmRleChDQUNIRV9MT0NBVElPTl9DT0wpOworICAgICAgICBtQ2FjaGVDb250ZW50TGVuZ3RoQ29sSW5kZXggPSBtQ2FjaGVJbnNlcnRlcgorICAgICAgICAgICAgICAgIC5nZXRDb2x1bW5JbmRleChDQUNIRV9DT05URU5UTEVOR1RIX0NPTCk7CisgICAgICAgIG1DYWNoZUNvbnRlbnREaXNwb3NpdGlvbkNvbEluZGV4ID0gbUNhY2hlSW5zZXJ0ZXIKKyAgICAgICAgICAgICAgICAuZ2V0Q29sdW1uSW5kZXgoQ0FDSEVfQ09OVEVOVERJU1BPU0lUSU9OX0NPTCk7CisgICAgICAgIG1DYWNoZUNyb3NzRG9tYWluQ29sSW5kZXggPSBtQ2FjaGVJbnNlcnRlcgorICAgICAgICAgICAgICAgIC5nZXRDb2x1bW5JbmRleChDQUNIRV9DUk9TU0RPTUFJTl9DT0wpOworCisgICAgICAgIC8vIFRocmVhZCBkb25lLCBub3RpZnkuCisgICAgICAgIG1Jbml0aWFsaXplZCA9IHRydWU7CisgICAgICAgIG5vdGlmeSgpOwogICAgIH0KIAogICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdXBncmFkZURhdGFiYXNlKCkgewpAQCAtMzkxLDggKzQxOSwyNSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgLy8gV2FpdCBmb3IgdGhlIGJhY2tncm91bmQgaW5pdGlhbGl6YXRpb24gdGhyZWFkIHRvIGNvbXBsZXRlIGFuZCBjaGVjayB0aGUKKyAgICAvLyBkYXRhYmFzZSBjcmVhdGlvbiBzdGF0dXMuCisgICAgcHJpdmF0ZSBib29sZWFuIGNoZWNrSW5pdGlhbGl6ZWQoKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgd2hpbGUgKCFtSW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICB3YWl0KCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBMb2cuZShMT0dUQUcsICJDYXVnaHQgZXhjZXB0aW9uIHdoaWxlIGNoZWNraW5nICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbml0aWFsaXphdGlvbiIpOworICAgICAgICAgICAgICAgICAgICBMb2cuZShMT0dUQUcsIExvZy5nZXRTdGFja1RyYWNlU3RyaW5nKGUpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1EYXRhYmFzZSAhPSBudWxsOworICAgIH0KKwogICAgIHByaXZhdGUgYm9vbGVhbiBoYXNFbnRyaWVzKGludCB0YWJsZUlkKSB7Ci0gICAgICAgIGlmIChtRGF0YWJhc2UgPT0gbnVsbCkgeworICAgICAgICBpZiAoIWNoZWNrSW5pdGlhbGl6ZWQoKSkgewogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAKQEAgLTQyMiw3ICs0NjcsNyBAQAogICAgICAqLwogICAgIEFycmF5TGlzdDxDb29raWU+IGdldENvb2tpZXNGb3JEb21haW4oU3RyaW5nIGRvbWFpbikgewogICAgICAgICBBcnJheUxpc3Q8Q29va2llPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxDb29raWU+KCk7Ci0gICAgICAgIGlmIChkb21haW4gPT0gbnVsbCB8fCBtRGF0YWJhc2UgPT0gbnVsbCkgeworICAgICAgICBpZiAoZG9tYWluID09IG51bGwgfHwgIWNoZWNrSW5pdGlhbGl6ZWQoKSkgewogICAgICAgICAgICAgcmV0dXJuIGxpc3Q7CiAgICAgICAgIH0KIApAQCAtNDgxLDcgKzUyNiw3IEBACiAgICAgICogICAgICAgICAgICBkZWxldGVkLgogICAgICAqLwogICAgIHZvaWQgZGVsZXRlQ29va2llcyhTdHJpbmcgZG9tYWluLCBTdHJpbmcgcGF0aCwgU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgaWYgKGRvbWFpbiA9PSBudWxsIHx8IG1EYXRhYmFzZSA9PSBudWxsKSB7CisgICAgICAgIGlmIChkb21haW4gPT0gbnVsbCB8fCAhY2hlY2tJbml0aWFsaXplZCgpKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIApAQCAtNTAxLDcgKzU0Niw3IEBACiAgICAgICovCiAgICAgdm9pZCBhZGRDb29raWUoQ29va2llIGNvb2tpZSkgewogICAgICAgICBpZiAoY29va2llLmRvbWFpbiA9PSBudWxsIHx8IGNvb2tpZS5wYXRoID09IG51bGwgfHwgY29va2llLm5hbWUgPT0gbnVsbAotICAgICAgICAgICAgICAgIHx8IG1EYXRhYmFzZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgfHwgIWNoZWNrSW5pdGlhbGl6ZWQoKSkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKQEAgLTUzNCw3ICs1NzksNyBAQAogICAgICAqIENsZWFyIGNvb2tpZSBkYXRhYmFzZQogICAgICAqLwogICAgIHZvaWQgY2xlYXJDb29raWVzKCkgewotICAgICAgICBpZiAobURhdGFiYXNlID09IG51bGwpIHsKKyAgICAgICAgaWYgKCFjaGVja0luaXRpYWxpemVkKCkpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCkBAIC01NDcsNyArNTkyLDcgQEAKICAgICAgKiBDbGVhciBzZXNzaW9uIGNvb2tpZXMsIHdoaWNoIG1lYW5zIGNvb2tpZSBkb2Vzbid0IGhhdmUgRVhQSVJFUy4KICAgICAgKi8KICAgICB2b2lkIGNsZWFyU2Vzc2lvbkNvb2tpZXMoKSB7Ci0gICAgICAgIGlmIChtRGF0YWJhc2UgPT0gbnVsbCkgeworICAgICAgICBpZiAoIWNoZWNrSW5pdGlhbGl6ZWQoKSkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKQEAgLTU2NCw3ICs2MDksNyBAQAogICAgICAqIEBwYXJhbSBub3cgVGltZSBmb3Igbm93CiAgICAgICovCiAgICAgdm9pZCBjbGVhckV4cGlyZWRDb29raWVzKGxvbmcgbm93KSB7Ci0gICAgICAgIGlmIChtRGF0YWJhc2UgPT0gbnVsbCkgeworICAgICAgICBpZiAoIWNoZWNrSW5pdGlhbGl6ZWQoKSkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKQEAgLTYyMCw3ICs2NjUsNyBAQAogICAgICAqIEByZXR1cm4gQ2FjaGVSZXN1bHQgVGhlIENhY2hlTWFuYWdlci5DYWNoZVJlc3VsdAogICAgICAqLwogICAgIENhY2hlUmVzdWx0IGdldENhY2hlKFN0cmluZyB1cmwpIHsKLSAgICAgICAgaWYgKHVybCA9PSBudWxsIHx8IG1DYWNoZURhdGFiYXNlID09IG51bGwpIHsKKyAgICAgICAgaWYgKHVybCA9PSBudWxsIHx8ICFjaGVja0luaXRpYWxpemVkKCkpIHsKICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICB9CiAKQEAgLTY2MCw3ICs3MDUsNyBAQAogICAgICAqIEBwYXJhbSB1cmwgVGhlIHVybAogICAgICAqLwogICAgIHZvaWQgcmVtb3ZlQ2FjaGUoU3RyaW5nIHVybCkgewotICAgICAgICBpZiAodXJsID09IG51bGwgfHwgbUNhY2hlRGF0YWJhc2UgPT0gbnVsbCkgeworICAgICAgICBpZiAodXJsID09IG51bGwgfHwgIWNoZWNrSW5pdGlhbGl6ZWQoKSkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKQEAgLTY3NCw3ICs3MTksNyBAQAogICAgICAqIEBwYXJhbSBjIFRoZSBDYWNoZU1hbmFnZXIuQ2FjaGVSZXN1bHQKICAgICAgKi8KICAgICB2b2lkIGFkZENhY2hlKFN0cmluZyB1cmwsIENhY2hlUmVzdWx0IGMpIHsKLSAgICAgICAgaWYgKHVybCA9PSBudWxsIHx8IG1DYWNoZURhdGFiYXNlID09IG51bGwpIHsKKyAgICAgICAgaWYgKHVybCA9PSBudWxsIHx8ICFjaGVja0luaXRpYWxpemVkKCkpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCkBAIC03MDAsNyArNzQ1LDcgQEAKICAgICAgKiBDbGVhciBjYWNoZSBkYXRhYmFzZQogICAgICAqLwogICAgIHZvaWQgY2xlYXJDYWNoZSgpIHsKLSAgICAgICAgaWYgKG1DYWNoZURhdGFiYXNlID09IG51bGwpIHsKKyAgICAgICAgaWYgKCFjaGVja0luaXRpYWxpemVkKCkpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCkBAIC03MDgsNyArNzUzLDcgQEAKICAgICB9CiAKICAgICBib29sZWFuIGhhc0NhY2hlKCkgewotICAgICAgICBpZiAobUNhY2hlRGF0YWJhc2UgPT0gbnVsbCkgeworICAgICAgICBpZiAoIWNoZWNrSW5pdGlhbGl6ZWQoKSkgewogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAKQEAgLTgzNCw3ICs4NzksNyBAQAogICAgICAqLwogICAgIHZvaWQgc2V0VXNlcm5hbWVQYXNzd29yZChTdHJpbmcgc2NoZW1lUGx1c0hvc3QsIFN0cmluZyB1c2VybmFtZSwKICAgICAgICAgICAgICAgICBTdHJpbmcgcGFzc3dvcmQpIHsKLSAgICAgICAgaWYgKHNjaGVtZVBsdXNIb3N0ID09IG51bGwgfHwgbURhdGFiYXNlID09IG51bGwpIHsKKyAgICAgICAgaWYgKHNjaGVtZVBsdXNIb3N0ID09IG51bGwgfHwgIWNoZWNrSW5pdGlhbGl6ZWQoKSkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKQEAgLTg1Niw3ICs5MDEsNyBAQAogICAgICAqICAgICAgICAgU3RyaW5nWzFdIGlzIHBhc3N3b3JkLiBSZXR1cm4gbnVsbCBpZiBpdCBjYW4ndCBmaW5kIGFueXRoaW5nLgogICAgICAqLwogICAgIFN0cmluZ1tdIGdldFVzZXJuYW1lUGFzc3dvcmQoU3RyaW5nIHNjaGVtZVBsdXNIb3N0KSB7Ci0gICAgICAgIGlmIChzY2hlbWVQbHVzSG9zdCA9PSBudWxsIHx8IG1EYXRhYmFzZSA9PSBudWxsKSB7CisgICAgICAgIGlmIChzY2hlbWVQbHVzSG9zdCA9PSBudWxsIHx8ICFjaGVja0luaXRpYWxpemVkKCkpIHsKICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICB9CiAKQEAgLTkwMiw3ICs5NDcsNyBAQAogICAgICAqIENsZWFyIHBhc3N3b3JkIGRhdGFiYXNlCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgY2xlYXJVc2VybmFtZVBhc3N3b3JkKCkgewotICAgICAgICBpZiAobURhdGFiYXNlID09IG51bGwpIHsKKyAgICAgICAgaWYgKCFjaGVja0luaXRpYWxpemVkKCkpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCkBAIC05MjcsNyArOTcyLDcgQEAKICAgICAgKi8KICAgICB2b2lkIHNldEh0dHBBdXRoVXNlcm5hbWVQYXNzd29yZChTdHJpbmcgaG9zdCwgU3RyaW5nIHJlYWxtLCBTdHJpbmcgdXNlcm5hbWUsCiAgICAgICAgICAgICBTdHJpbmcgcGFzc3dvcmQpIHsKLSAgICAgICAgaWYgKGhvc3QgPT0gbnVsbCB8fCByZWFsbSA9PSBudWxsIHx8IG1EYXRhYmFzZSA9PSBudWxsKSB7CisgICAgICAgIGlmIChob3N0ID09IG51bGwgfHwgcmVhbG0gPT0gbnVsbCB8fCAhY2hlY2tJbml0aWFsaXplZCgpKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIApAQCAtOTUyLDcgKzk5Nyw3IEBACiAgICAgICogICAgICAgICBTdHJpbmdbMV0gaXMgcGFzc3dvcmQuIFJldHVybiBudWxsIGlmIGl0IGNhbid0IGZpbmQgYW55dGhpbmcuCiAgICAgICovCiAgICAgU3RyaW5nW10gZ2V0SHR0cEF1dGhVc2VybmFtZVBhc3N3b3JkKFN0cmluZyBob3N0LCBTdHJpbmcgcmVhbG0pIHsKLSAgICAgICAgaWYgKGhvc3QgPT0gbnVsbCB8fCByZWFsbSA9PSBudWxsIHx8IG1EYXRhYmFzZSA9PSBudWxsKXsKKyAgICAgICAgaWYgKGhvc3QgPT0gbnVsbCB8fCByZWFsbSA9PSBudWxsIHx8ICFjaGVja0luaXRpYWxpemVkKCkpewogICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIH0KIApAQCAtOTk5LDcgKzEwNDQsNyBAQAogICAgICAqIENsZWFyIEhUVFAgYXV0aGVudGljYXRpb24gcGFzc3dvcmQgZGF0YWJhc2UKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBjbGVhckh0dHBBdXRoVXNlcm5hbWVQYXNzd29yZCgpIHsKLSAgICAgICAgaWYgKG1EYXRhYmFzZSA9PSBudWxsKSB7CisgICAgICAgIGlmICghY2hlY2tJbml0aWFsaXplZCgpKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIApAQCAtMTAyMCw3ICsxMDY1LDcgQEAKICAgICAgKiBAcGFyYW0gZm9ybWRhdGEgVGhlIGZvcm0gZGF0YSBpbiBIYXNoTWFwCiAgICAgICovCiAgICAgdm9pZCBzZXRGb3JtRGF0YShTdHJpbmcgdXJsLCBIYXNoTWFwPFN0cmluZywgU3RyaW5nPiBmb3JtZGF0YSkgewotICAgICAgICBpZiAodXJsID09IG51bGwgfHwgZm9ybWRhdGEgPT0gbnVsbCB8fCBtRGF0YWJhc2UgPT0gbnVsbCkgeworICAgICAgICBpZiAodXJsID09IG51bGwgfHwgZm9ybWRhdGEgPT0gbnVsbCB8fCAhY2hlY2tJbml0aWFsaXplZCgpKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIApAQCAtMTA2OSw3ICsxMTE0LDcgQEAKICAgICAgKi8KICAgICBBcnJheUxpc3Q8U3RyaW5nPiBnZXRGb3JtRGF0YShTdHJpbmcgdXJsLCBTdHJpbmcgbmFtZSkgewogICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiB2YWx1ZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgaWYgKHVybCA9PSBudWxsIHx8IG5hbWUgPT0gbnVsbCB8fCBtRGF0YWJhc2UgPT0gbnVsbCkgeworICAgICAgICBpZiAodXJsID09IG51bGwgfHwgbmFtZSA9PSBudWxsIHx8ICFjaGVja0luaXRpYWxpemVkKCkpIHsKICAgICAgICAgICAgIHJldHVybiB2YWx1ZXM7CiAgICAgICAgIH0KIApAQCAtMTEyOSw3ICsxMTc0LDcgQEAKICAgICAgKiBDbGVhciBmb3JtIGRhdGFiYXNlCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgY2xlYXJGb3JtRGF0YSgpIHsKLSAgICAgICAgaWYgKG1EYXRhYmFzZSA9PSBudWxsKSB7CisgICAgICAgIGlmICghY2hlY2tJbml0aWFsaXplZCgpKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1pvb21Db250cm9sQmFzZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1pvb21Db250cm9sQmFzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlOWU4ZjMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvWm9vbUNvbnRyb2xCYXNlLmphdmEKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGFuZHJvaWQud2Via2l0OworCitpbnRlcmZhY2UgWm9vbUNvbnRyb2xCYXNlIHsKKworICAgIC8qKgorICAgICAqIENhdXNlcyB0aGUgb24tc2NyZWVuIHpvb20gY29udHJvbCB0byBiZSBtYWRlIHZpc2libGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzaG93KCk7CisKKyAgICAvKioKKyAgICAgKiBDYXVzZXMgdGhlIG9uLXNjcmVlbiB6b29tIGNvbnRyb2wgdG8gZGlzYXBwZWFyCisgICAgICovCisgICAgcHVibGljIHZvaWQgaGlkZSgpOworCisgICAgLyoqCisgICAgICogRW5hYmxlcyB0aGUgY29udHJvbCB0byB1cGRhdGUgaXRzIHN0YXRlIGlmIG5lY2Vzc2FyeSBpbiByZXNwb25zZSB0byBhCisgICAgICogY2hhbmdlIGluIHRoZSBwYWdlcyB6b29tIGxldmVsLiBGb3IgZXhhbXBsZSwgaWYgdGhlIG1heCB6b29tIGxldmVsIGlzCisgICAgICogcmVhY2hlZCB0aGVuIHRoZSBjb250cm9sIGNhbiBkaXNhYmxlIHRoZSBidXR0b24gZm9yIHpvb21pbmcgaW4uCisgICAgICovCisgICAgcHVibGljIHZvaWQgdXBkYXRlKCk7CisKKyAgICAvKioKKyAgICAgKiBDaGVja3MgdG8gc2VlIGlmIHRoZSBjb250cm9sIGlzIGN1cnJlbnRseSB2aXNpYmxlIHRvIHRoZSB1c2VyLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzVmlzaWJsZSgpOworfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1pvb21Db250cm9sRW1iZWRkZWQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9ab29tQ29udHJvbEVtYmVkZGVkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzI5ZTcyYgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9ab29tQ29udHJvbEVtYmVkZGVkLmphdmEKQEAgLTAsMCArMSwxMTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBhbmRyb2lkLndlYmtpdDsKKworaW1wb3J0IGFuZHJvaWQudmlldy5HcmF2aXR5OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuRnJhbWVMYXlvdXQ7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVG9hc3Q7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuWm9vbUJ1dHRvbnNDb250cm9sbGVyOworCitjbGFzcyBab29tQ29udHJvbEVtYmVkZGVkIGltcGxlbWVudHMgWm9vbUNvbnRyb2xCYXNlIHsKKworICAgIHByaXZhdGUgZmluYWwgWm9vbU1hbmFnZXIgbVpvb21NYW5hZ2VyOworICAgIHByaXZhdGUgZmluYWwgV2ViVmlldyBtV2ViVmlldzsKKworICAgIC8vIFRoZSBjb250cm9sbGVyIGlzIGxhemlseSBpbml0aWFsaXplZCBpbiBnZXRDb250cm9scygpIGZvciBwZXJmb3JtYW5jZS4KKyAgICBwcml2YXRlIFpvb21CdXR0b25zQ29udHJvbGxlciBtWm9vbUJ1dHRvbnNDb250cm9sbGVyOworCisgICAgcHVibGljIFpvb21Db250cm9sRW1iZWRkZWQoWm9vbU1hbmFnZXIgem9vbU1hbmFnZXIsIFdlYlZpZXcgd2ViVmlldykgeworICAgICAgICBtWm9vbU1hbmFnZXIgPSB6b29tTWFuYWdlcjsKKyAgICAgICAgbVdlYlZpZXcgPSB3ZWJWaWV3OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNob3coKSB7CisgICAgICAgIGlmICghZ2V0Q29udHJvbHMoKS5pc1Zpc2libGUoKSAmJiAhbVpvb21NYW5hZ2VyLmlzWm9vbVNjYWxlRml4ZWQoKSkgeworCisgICAgICAgICAgICBtWm9vbUJ1dHRvbnNDb250cm9sbGVyLnNldFZpc2libGUodHJ1ZSk7CisKKyAgICAgICAgICAgIFdlYlNldHRpbmdzIHNldHRpbmdzID0gbVdlYlZpZXcuZ2V0U2V0dGluZ3MoKTsKKyAgICAgICAgICAgIGludCBjb3VudCA9IHNldHRpbmdzLmdldERvdWJsZVRhcFRvYXN0Q291bnQoKTsKKyAgICAgICAgICAgIGlmIChtWm9vbU1hbmFnZXIuaXNJblpvb21PdmVydmlldygpICYmIGNvdW50ID4gMCkgeworICAgICAgICAgICAgICAgIHNldHRpbmdzLnNldERvdWJsZVRhcFRvYXN0Q291bnQoLS1jb3VudCk7CisgICAgICAgICAgICAgICAgVG9hc3QubWFrZVRleHQobVdlYlZpZXcuZ2V0Q29udGV4dCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcuZG91YmxlX3RhcF90b2FzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFRvYXN0LkxFTkdUSF9MT05HKS5zaG93KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBoaWRlKCkgeworICAgICAgICBpZiAobVpvb21CdXR0b25zQ29udHJvbGxlciAhPSBudWxsKSB7CisgICAgICAgICAgICBtWm9vbUJ1dHRvbnNDb250cm9sbGVyLnNldFZpc2libGUoZmFsc2UpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNWaXNpYmxlKCkgeworICAgICAgICByZXR1cm4gbVpvb21CdXR0b25zQ29udHJvbGxlciAhPSBudWxsICYmIG1ab29tQnV0dG9uc0NvbnRyb2xsZXIuaXNWaXNpYmxlKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdXBkYXRlKCkgeworICAgICAgICBpZiAobVpvb21CdXR0b25zQ29udHJvbGxlciA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBib29sZWFuIGNhblpvb21JbiA9IG1ab29tTWFuYWdlci5jYW5ab29tSW4oKTsKKyAgICAgICAgYm9vbGVhbiBjYW5ab29tT3V0ID0gbVpvb21NYW5hZ2VyLmNhblpvb21PdXQoKSAmJiAhbVpvb21NYW5hZ2VyLmlzSW5ab29tT3ZlcnZpZXcoKTsKKyAgICAgICAgaWYgKCFjYW5ab29tSW4gJiYgIWNhblpvb21PdXQpIHsKKyAgICAgICAgICAgIC8vIEhpZGUgdGhlIHpvb20gaW4gYW5kIG91dCBidXR0b25zIGlmIHRoZSBwYWdlIGNhbm5vdCB6b29tCisgICAgICAgICAgICBtWm9vbUJ1dHRvbnNDb250cm9sbGVyLmdldFpvb21Db250cm9scygpLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFNldCBlYWNoIG9uZSBpbmRpdmlkdWFsbHksIGFzIGEgcGFnZSBtYXkgYmUgYWJsZSB0byB6b29tIGluIG9yIG91dAorICAgICAgICAgICAgbVpvb21CdXR0b25zQ29udHJvbGxlci5zZXRab29tSW5FbmFibGVkKGNhblpvb21Jbik7CisgICAgICAgICAgICBtWm9vbUJ1dHRvbnNDb250cm9sbGVyLnNldFpvb21PdXRFbmFibGVkKGNhblpvb21PdXQpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBab29tQnV0dG9uc0NvbnRyb2xsZXIgZ2V0Q29udHJvbHMoKSB7CisgICAgICAgIGlmIChtWm9vbUJ1dHRvbnNDb250cm9sbGVyID09IG51bGwpIHsKKyAgICAgICAgICAgIG1ab29tQnV0dG9uc0NvbnRyb2xsZXIgPSBuZXcgWm9vbUJ1dHRvbnNDb250cm9sbGVyKG1XZWJWaWV3KTsKKyAgICAgICAgICAgIG1ab29tQnV0dG9uc0NvbnRyb2xsZXIuc2V0T25ab29tTGlzdGVuZXIobmV3IFpvb21MaXN0ZW5lcigpKTsKKyAgICAgICAgICAgIC8vIFpvb21CdXR0b25zQ29udHJvbGxlciBwb3NpdGlvbnMgdGhlIGJ1dHRvbnMgYXQgdGhlIGJvdHRvbSwgYnV0IGluCisgICAgICAgICAgICAvLyB0aGUgbWlkZGxlLiBDaGFuZ2UgdGhlaXIgbGF5b3V0IHBhcmFtZXRlcnMgc28gdGhleSBhcHBlYXIgb24gdGhlCisgICAgICAgICAgICAvLyByaWdodC4KKyAgICAgICAgICAgIFZpZXcgY29udHJvbHMgPSBtWm9vbUJ1dHRvbnNDb250cm9sbGVyLmdldFpvb21Db250cm9scygpOworICAgICAgICAgICAgVmlld0dyb3VwLkxheW91dFBhcmFtcyBwYXJhbXMgPSBjb250cm9scy5nZXRMYXlvdXRQYXJhbXMoKTsKKyAgICAgICAgICAgIGlmIChwYXJhbXMgaW5zdGFuY2VvZiBGcmFtZUxheW91dC5MYXlvdXRQYXJhbXMpIHsKKyAgICAgICAgICAgICAgICAoKEZyYW1lTGF5b3V0LkxheW91dFBhcmFtcykgcGFyYW1zKS5ncmF2aXR5ID0gR3Jhdml0eS5SSUdIVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbVpvb21CdXR0b25zQ29udHJvbGxlcjsKKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIFpvb21MaXN0ZW5lciBpbXBsZW1lbnRzIFpvb21CdXR0b25zQ29udHJvbGxlci5Pblpvb21MaXN0ZW5lciB7CisKKyAgICAgICAgcHVibGljIHZvaWQgb25WaXNpYmlsaXR5Q2hhbmdlZChib29sZWFuIHZpc2libGUpIHsKKyAgICAgICAgICAgIGlmICh2aXNpYmxlKSB7CisgICAgICAgICAgICAgICAgbVdlYlZpZXcuc3dpdGNoT3V0RHJhd0hpc3RvcnkoKTsKKyAgICAgICAgICAgICAgICAvLyBCcmluZyBiYWNrIHRoZSBoaWRkZW4gem9vbSBjb250cm9scy4KKyAgICAgICAgICAgICAgICBtWm9vbUJ1dHRvbnNDb250cm9sbGVyLmdldFpvb21Db250cm9scygpLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgICAgICAgICB1cGRhdGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG9uWm9vbShib29sZWFuIHpvb21JbikgeworICAgICAgICAgICAgaWYgKHpvb21JbikgeworICAgICAgICAgICAgICAgIG1XZWJWaWV3Lnpvb21JbigpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtV2ViVmlldy56b29tT3V0KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB1cGRhdGUoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9ab29tQ29udHJvbEV4dGVybmFsLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvWm9vbUNvbnRyb2xFeHRlcm5hbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3NTMxM2UKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvWm9vbUNvbnRyb2xFeHRlcm5hbC5qYXZhCkBAIC0wLDAgKzEsMTU5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgYW5kcm9pZC53ZWJraXQ7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3Q29uZmlndXJhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldy5PbkNsaWNrTGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbHBoYUFuaW1hdGlvbjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5GcmFtZUxheW91dDsKKworQERlcHJlY2F0ZWQKK2NsYXNzIFpvb21Db250cm9sRXh0ZXJuYWwgaW1wbGVtZW50cyBab29tQ29udHJvbEJhc2UgeworCisgICAgLy8gVGhlIHRpbWUgdGhhdCB0aGUgZXh0ZXJuYWwgY29udHJvbHMgYXJlIHZpc2libGUgYmVmb3JlIGZhZGluZyBhd2F5CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBaT09NX0NPTlRST0xTX1RJTUVPVVQgPQorICAgICAgICAgICAgVmlld0NvbmZpZ3VyYXRpb24uZ2V0Wm9vbUNvbnRyb2xzVGltZW91dCgpOworICAgIC8vIFRoZSB2aWV3IGNvbnRhaW5pbmcgdGhlIGV4dGVybmFsIHpvb20gY29udHJvbHMKKyAgICBwcml2YXRlIEV4dGVuZGVkWm9vbUNvbnRyb2xzIG1ab29tQ29udHJvbHM7CisgICAgcHJpdmF0ZSBSdW5uYWJsZSBtWm9vbUNvbnRyb2xSdW5uYWJsZTsKKyAgICBwcml2YXRlIGZpbmFsIEhhbmRsZXIgbVByaXZhdGVIYW5kbGVyID0gbmV3IEhhbmRsZXIoKTsKKworICAgIHByaXZhdGUgZmluYWwgV2ViVmlldyBtV2ViVmlldzsKKworICAgIHB1YmxpYyBab29tQ29udHJvbEV4dGVybmFsKFdlYlZpZXcgd2ViVmlldykgeworICAgICAgICBtV2ViVmlldyA9IHdlYlZpZXc7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2hvdygpIHsKKyAgICAgICAgaWYobVpvb21Db250cm9sUnVubmFibGUgIT0gbnVsbCkgeworICAgICAgICAgICAgbVByaXZhdGVIYW5kbGVyLnJlbW92ZUNhbGxiYWNrcyhtWm9vbUNvbnRyb2xSdW5uYWJsZSk7CisgICAgICAgIH0KKyAgICAgICAgZ2V0Q29udHJvbHMoKS5zaG93KHRydWUpOworICAgICAgICBtUHJpdmF0ZUhhbmRsZXIucG9zdERlbGF5ZWQobVpvb21Db250cm9sUnVubmFibGUsIFpPT01fQ09OVFJPTFNfVElNRU9VVCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgaGlkZSgpIHsKKyAgICAgICAgaWYgKG1ab29tQ29udHJvbFJ1bm5hYmxlICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5yZW1vdmVDYWxsYmFja3MobVpvb21Db250cm9sUnVubmFibGUpOworICAgICAgICB9CisgICAgICAgIGlmIChtWm9vbUNvbnRyb2xzICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1ab29tQ29udHJvbHMuaGlkZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNWaXNpYmxlKCkgeworICAgICAgICByZXR1cm4gbVpvb21Db250cm9scyAhPSBudWxsICYmIG1ab29tQ29udHJvbHMuaXNTaG93bigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsgfQorCisgICAgcHVibGljIEV4dGVuZGVkWm9vbUNvbnRyb2xzIGdldENvbnRyb2xzKCkgeworICAgICAgICBpZiAobVpvb21Db250cm9scyA9PSBudWxsKSB7CisgICAgICAgICAgICBtWm9vbUNvbnRyb2xzID0gY3JlYXRlWm9vbUNvbnRyb2xzKCk7CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBuZWVkIHRvIGJlIHNldCB0byBWSVNJQkxFIGZpcnN0IHNvIHRoYXQgZ2V0TWVhc3VyZWRIZWlnaHQoKSBpbgorICAgICAgICAgICAgICoge0BsaW5rICNvblNpemVDaGFuZ2VkKCl9IGNhbiByZXR1cm4gdGhlIG1lYXN1cmVkIHZhbHVlIGZvciBwcm9wZXIKKyAgICAgICAgICAgICAqIGxheW91dC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgbVpvb21Db250cm9scy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgICAgICBtWm9vbUNvbnRyb2xSdW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIERvbid0IGRpc21pc3MgdGhlIGNvbnRyb2xzIGlmIHRoZSB1c2VyIGhhcworICAgICAgICAgICAgICAgICAgICAgKiBmb2N1cyBvbiB0aGVtLiBXYWl0IGFuZCBjaGVjayBhZ2FpbiBsYXRlci4KKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIGlmICghbVpvb21Db250cm9scy5oYXNGb2N1cygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtWm9vbUNvbnRyb2xzLmhpZGUoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5yZW1vdmVDYWxsYmFja3MobVpvb21Db250cm9sUnVubmFibGUpOworICAgICAgICAgICAgICAgICAgICAgICAgbVByaXZhdGVIYW5kbGVyLnBvc3REZWxheWVkKG1ab29tQ29udHJvbFJ1bm5hYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaT09NX0NPTlRST0xTX1RJTUVPVVQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbVpvb21Db250cm9sczsKKyAgICB9CisKKyAgICBwcml2YXRlIEV4dGVuZGVkWm9vbUNvbnRyb2xzIGNyZWF0ZVpvb21Db250cm9scygpIHsKKyAgICAgICAgRXh0ZW5kZWRab29tQ29udHJvbHMgem9vbUNvbnRyb2xzID0gbmV3IEV4dGVuZGVkWm9vbUNvbnRyb2xzKG1XZWJWaWV3LmdldENvbnRleHQoKSk7CisgICAgICAgIHpvb21Db250cm9scy5zZXRPblpvb21JbkNsaWNrTGlzdGVuZXIobmV3IE9uQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7CisgICAgICAgICAgICAgICAgLy8gcmVzZXQgdGltZSBvdXQKKyAgICAgICAgICAgICAgICBtUHJpdmF0ZUhhbmRsZXIucmVtb3ZlQ2FsbGJhY2tzKG1ab29tQ29udHJvbFJ1bm5hYmxlKTsKKyAgICAgICAgICAgICAgICBtUHJpdmF0ZUhhbmRsZXIucG9zdERlbGF5ZWQobVpvb21Db250cm9sUnVubmFibGUsIFpPT01fQ09OVFJPTFNfVElNRU9VVCk7CisgICAgICAgICAgICAgICAgbVdlYlZpZXcuem9vbUluKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICB6b29tQ29udHJvbHMuc2V0T25ab29tT3V0Q2xpY2tMaXN0ZW5lcihuZXcgT25DbGlja0xpc3RlbmVyKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgICAgICAvLyByZXNldCB0aW1lIG91dAorICAgICAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5yZW1vdmVDYWxsYmFja3MobVpvb21Db250cm9sUnVubmFibGUpOworICAgICAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5wb3N0RGVsYXllZChtWm9vbUNvbnRyb2xSdW5uYWJsZSwgWk9PTV9DT05UUk9MU19USU1FT1VUKTsKKyAgICAgICAgICAgICAgICBtV2ViVmlldy56b29tT3V0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICByZXR1cm4gem9vbUNvbnRyb2xzOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEV4dGVuZGVkWm9vbUNvbnRyb2xzIGV4dGVuZHMgRnJhbWVMYXlvdXQgeworCisgICAgICAgIHByaXZhdGUgYW5kcm9pZC53aWRnZXQuWm9vbUNvbnRyb2xzIG1QbHVzTWludXNab29tQ29udHJvbHM7CisKKyAgICAgICAgcHVibGljIEV4dGVuZGVkWm9vbUNvbnRyb2xzKENvbnRleHQgY29udGV4dCkgeworICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgbnVsbCk7CisgICAgICAgICAgICBMYXlvdXRJbmZsYXRlciBpbmZsYXRlciA9IChMYXlvdXRJbmZsYXRlcikKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuTEFZT1VUX0lORkxBVEVSX1NFUlZJQ0UpOworICAgICAgICAgICAgaW5mbGF0ZXIuaW5mbGF0ZShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmxheW91dC56b29tX21hZ25pZnksIHRoaXMsIHRydWUpOworICAgICAgICAgICAgbVBsdXNNaW51c1pvb21Db250cm9scyA9IChhbmRyb2lkLndpZGdldC5ab29tQ29udHJvbHMpIGZpbmRWaWV3QnlJZCgKKyAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5pZC56b29tQ29udHJvbHMpOworICAgICAgICAgICAgZmluZFZpZXdCeUlkKGNvbS5hbmRyb2lkLmludGVybmFsLlIuaWQuem9vbU1hZ25pZnkpLnNldFZpc2liaWxpdHkoCisgICAgICAgICAgICAgICAgICAgIFZpZXcuR09ORSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzaG93KGJvb2xlYW4gc2hvd1pvb20pIHsKKyAgICAgICAgICAgIG1QbHVzTWludXNab29tQ29udHJvbHMuc2V0VmlzaWJpbGl0eShzaG93Wm9vbSA/IFZpZXcuVklTSUJMRSA6IFZpZXcuR09ORSk7CisgICAgICAgICAgICBmYWRlKFZpZXcuVklTSUJMRSwgMC4wZiwgMS4wZik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBoaWRlKCkgeworICAgICAgICAgICAgZmFkZShWaWV3LkdPTkUsIDEuMGYsIDAuMGYpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGZhZGUoaW50IHZpc2liaWxpdHksIGZsb2F0IHN0YXJ0QWxwaGEsIGZsb2F0IGVuZEFscGhhKSB7CisgICAgICAgICAgICBBbHBoYUFuaW1hdGlvbiBhbmltID0gbmV3IEFscGhhQW5pbWF0aW9uKHN0YXJ0QWxwaGEsIGVuZEFscGhhKTsKKyAgICAgICAgICAgIGFuaW0uc2V0RHVyYXRpb24oNTAwKTsKKyAgICAgICAgICAgIHN0YXJ0QW5pbWF0aW9uKGFuaW0pOworICAgICAgICAgICAgc2V0VmlzaWJpbGl0eSh2aXNpYmlsaXR5KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc0ZvY3VzKCkgeworICAgICAgICAgICAgcmV0dXJuIG1QbHVzTWludXNab29tQ29udHJvbHMuaGFzRm9jdXMoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldE9uWm9vbUluQ2xpY2tMaXN0ZW5lcihPbkNsaWNrTGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgICAgIG1QbHVzTWludXNab29tQ29udHJvbHMuc2V0T25ab29tSW5DbGlja0xpc3RlbmVyKGxpc3RlbmVyKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldE9uWm9vbU91dENsaWNrTGlzdGVuZXIoT25DbGlja0xpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgICAgICBtUGx1c01pbnVzWm9vbUNvbnRyb2xzLnNldE9uWm9vbU91dENsaWNrTGlzdGVuZXIobGlzdGVuZXIpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1pvb21NYW5hZ2VyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvWm9vbU1hbmFnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zM2ViY2Y1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1pvb21NYW5hZ2VyLmphdmEKQEAgLTAsMCArMSw5MTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQud2Via2l0OworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9pbnQ7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5TY2FsZUdlc3R1cmVEZXRlY3RvcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKKworLyoqCisgKiBUaGUgWm9vbU1hbmFnZXIgaXMgcmVzcG9uc2libGUgZm9yIG1haW50YWluaW5nIHRoZSBXZWJWaWV3J3MgY3VycmVudCB6b29tCisgKiBsZXZlbCBzdGF0ZS4gIEl0IGlzIGFsc28gcmVzcG9uc2libGUgZm9yIG1hbmFnaW5nIHRoZSBvbi1zY3JlZW4gem9vbSBjb250cm9scworICogYXMgd2VsbCBhcyBhbnkgYW5pbWF0aW9uIG9mIHRoZSBXZWJWaWV3IGR1ZSB0byB6b29taW5nLgorICoKKyAqIEN1cnJlbnRseSwgdGhlcmUgYXJlIHR3byBtZXRob2RzIGZvciBhbmltYXRpbmcgdGhlIHpvb20gb2YgYSBXZWJWaWV3LgorICoKKyAqICgxKSBUaGUgZmlyc3QgbWV0aG9kIGlzIHRyaWdnZXJlZCBieSBzdGFydFpvb21BbmltYXRpb24oLi4uKSBhbmQgaXMgYSBmaXhlZAorICogbGVuZ3RoIGFuaW1hdGlvbiB3aGVyZSB0aGUgZmluYWwgem9vbSBzY2FsZSBpcyBrbm93biBhdCBzdGFydHVwLiAgVGhpcyB0eXBlIG9mCisgKiBhbmltYXRpb24gbm90aWZpZXMgd2Via2l0IG9mIHRoZSBmaW5hbCBzY2FsZSBCRUZPUkUgaXQgYW5pbWF0ZXMuIFRoZSBhbmltYXRpb24KKyAqIGlzIHRoZW4gZG9uZSBieSBzY2FsaW5nIHRoZSBDQU5WQVMgaW5jcmVtZW50YWxseSBiYXNlZCBvbiBhIHN0ZXBwaW5nIGZ1bmN0aW9uLgorICoKKyAqICgyKSBUaGUgc2Vjb25kIG1ldGhvZCBpcyB0cmlnZ2VyZWQgYnkgYSBtdWx0aS10b3VjaCBwaW5jaCBhbmQgdGhlIG5ldyBzY2FsZQorICogaXMgZGV0ZXJtaW5lZCBkeW5hbWljYWxseSBiYXNlZCBvbiB0aGUgdXNlcidzIGdlc3R1cmUuIFRoaXMgdHlwZSBvZiBhbmltYXRpb24KKyAqIG9ubHkgbm90aWZpZXMgd2Via2l0IG9mIG5ldyBzY2FsZSBBRlRFUiB0aGUgZ2VzdHVyZSBpcyBjb21wbGV0ZS4gVGhlIGFuaW1hdGlvbgorICogZWZmZWN0IGlzIGFjaGlldmVkIGJ5IHNjYWxpbmcgdGhlIFZJRVdTIChib3RoIFdlYlZpZXcgYW5kIFZpZXdNYW5hZ2VyLkNoaWxkVmlldykKKyAqIHRvIHRoZSBuZXcgc2NhbGUgaW4gcmVzcG9uc2UgdG8gZXZlbnRzIHJlbGF0ZWQgdG8gdGhlIHVzZXIncyBnZXN0dXJlLgorICovCitjbGFzcyBab29tTWFuYWdlciB7CisKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIExPR1RBRyA9ICJ3ZWJ2aWV3Wm9vbSI7CisKKyAgICBwcml2YXRlIGZpbmFsIFdlYlZpZXcgbVdlYlZpZXc7CisgICAgcHJpdmF0ZSBmaW5hbCBDYWxsYmFja1Byb3h5IG1DYWxsYmFja1Byb3h5OworCisgICAgLy8gV2lkZ2V0cyByZXNwb25zaWJsZSBmb3IgdGhlIG9uLXNjcmVlbiB6b29tIGZ1bmN0aW9ucyBvZiB0aGUgV2ViVmlldy4KKyAgICBwcml2YXRlIFpvb21Db250cm9sRW1iZWRkZWQgbUVtYmVkZGVkWm9vbUNvbnRyb2w7CisgICAgcHJpdmF0ZSBab29tQ29udHJvbEV4dGVybmFsIG1FeHRlcm5hbFpvb21Db250cm9sOworCisgICAgLyoKKyAgICAgKiBGb3IgbGFyZ2Ugc2NyZWVuIGRldmljZXMsIHRoZSBkZWZhdWx0U2NhbGUgdXN1YWxseSBzZXQgdG8gMS4wIGFuZAorICAgICAqIGVxdWFsIHRvIHRoZSBvdmVydmlldyBzY2FsZSwgdG8gZGlmZmVyZW50aWF0ZSB0aGUgem9vbSBsZXZlbCBmb3IgZG91YmxlIHRhcHBpbmcsCisgICAgICogYSBtaW5pbXVtIHJlYWRpbmcgbGV2ZWwgc2NhbGUgaXMgdXNlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9hdCBNSU5fUkVBRElOR19MRVZFTF9TQ0FMRSA9IDEuNWY7CisKKyAgICAvKgorICAgICAqIFRoZSBzY2FsZSBmYWN0b3JzIHRoYXQgZGV0ZXJtaW5lIHRoZSB1cHBlciBhbmQgbG93ZXIgYm91bmRzIGZvciB0aGUKKyAgICAgKiBkZWZhdWx0IHpvb20gc2NhbGUuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBmbG9hdCBERUZBVUxUX01BWF9aT09NX1NDQUxFX0ZBQ1RPUiA9IDQuMDBmOworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgZmxvYXQgREVGQVVMVF9NSU5fWk9PTV9TQ0FMRV9GQUNUT1IgPSAwLjI1ZjsKKworICAgIC8vIFRoZSBkZWZhdWx0IHNjYWxlIGxpbWl0cywgd2hpY2ggYXJlIGRlcGVuZGVudCBvbiB0aGUgZGlzcGxheSBkZW5zaXR5LgorICAgIHByaXZhdGUgZmxvYXQgbURlZmF1bHRNYXhab29tU2NhbGU7CisgICAgcHJpdmF0ZSBmbG9hdCBtRGVmYXVsdE1pblpvb21TY2FsZTsKKworICAgIC8vIFRoZSBhY3R1YWwgc2NhbGUgbGltaXRzLCB3aGljaCBjYW4gYmUgc2V0IHRocm91Z2ggYSB3ZWJwYWdlJ3Mgdmlld3BvcnQKKyAgICAvLyBtZXRhLXRhZy4KKyAgICBwcml2YXRlIGZsb2F0IG1NYXhab29tU2NhbGU7CisgICAgcHJpdmF0ZSBmbG9hdCBtTWluWm9vbVNjYWxlOworCisgICAgLy8gTG9ja3MgdGhlIG1pbmltdW0gWm9vbVNjYWxlIHRvIHRoZSB2YWx1ZSBjdXJyZW50bHkgc2V0IGluIG1NaW5ab29tU2NhbGUuCisgICAgcHJpdmF0ZSBib29sZWFuIG1NaW5ab29tU2NhbGVGaXhlZCA9IHRydWU7CisKKyAgICAvKgorICAgICAqIFdoZW4gbG9hZGluZyBhIG5ldyBwYWdlIHRoZSBXZWJWaWV3IGRvZXMgbm90IGluaXRpYWxseSBrbm93IHRoZSBmaW5hbAorICAgICAqIHdpZHRoIG9mIHRoZSBwYWdlLiBUaGVyZWZvcmUsIHdoZW4gYSBuZXcgcGFnZSBpcyBsb2FkZWQgaW4gb3ZlcnZpZXcgbW9kZQorICAgICAqIHRoZSBvdmVydmlldyBzY2FsZSBpcyBpbml0aWFsaXplZCB0byBhIGRlZmF1bHQgdmFsdWUuIFRoaXMgZmxhZyBpcyB0aGVuCisgICAgICogc2V0IGFuZCB1c2VkIHRvIG5vdGlmeSB0aGUgWm9vbU1hbmFnZXIgdG8gdGFrZSB0aGUgd2lkdGggb2YgdGhlIG5leHQKKyAgICAgKiBwaWN0dXJlIGZyb20gd2Via2l0IGFuZCB1c2UgdGhhdCB3aWR0aCB0byBlbnRlciBpbnRvIHpvb20gb3ZlcnZpZXcgbW9kZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gbUluaXRpYWxab29tT3ZlcnZpZXcgPSBmYWxzZTsKKworICAgIC8qCisgICAgICogV2hlbiBpbiB0aGUgem9vbSBvdmVydmlldyBtb2RlLCB0aGUgcGFnZSdzIHdpZHRoIGlzIGZ1bGx5IGZpdCB0byB0aGUKKyAgICAgKiBjdXJyZW50IHdpbmRvdy4gQWRkaXRpb25hbGx5IHdoaWxlIHRoZSBwYWdlIGlzIGluIHRoaXMgc3RhdGUgaXQgaXMKKyAgICAgKiBhY3RpdmUsIGluIG90aGVyIHdvcmRzLCB5b3UgY2FuIGNsaWNrIHRvIGZvbGxvdyB0aGUgbGlua3MuIFdlIGNhY2hlIGEKKyAgICAgKiBib29sZWFuIHRvIGVuYWJsZSB1cyB0byBxdWlja2x5IGNoZWNrIHdoZXRoZXIgb3Igbm90IHdlIGFyZSBpbiBvdmVydmlldworICAgICAqIG1vZGUsIGJ1dCB0aGlzIHZhbHVlIHNob3VsZCBvbmx5IGJlIG1vZGlmaWVkIGJ5IGNoYW5nZXMgdG8gdGhlIHpvb20KKyAgICAgKiBzY2FsZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gbUluWm9vbU92ZXJ2aWV3ID0gZmFsc2U7CisgICAgcHJpdmF0ZSBpbnQgbVpvb21PdmVydmlld1dpZHRoOworICAgIHByaXZhdGUgZmxvYXQgbUludlpvb21PdmVydmlld1dpZHRoOworCisgICAgLyoKKyAgICAgKiBUaGVzZSB2YXJpYWJsZXMgdHJhY2sgdGhlIGNlbnRlciBwb2ludCBvZiB0aGUgem9vbSBhbmQgdGhleSBhcmUgdXNlZCB0bworICAgICAqIGRldGVybWluZSB0aGUgcG9pbnQgYXJvdW5kIHdoaWNoIHdlIHNob3VsZCB6b29tLiBUaGV5IGFyZSBzdG9yZWQgaW4gdmlldworICAgICAqIGNvb3JkaW5hdGVzLgorICAgICAqLworICAgIHByaXZhdGUgZmxvYXQgbVpvb21DZW50ZXJYOworICAgIHByaXZhdGUgZmxvYXQgbVpvb21DZW50ZXJZOworCisgICAgLyoKKyAgICAgKiBUaGVzZSB2YWx1ZXMgcmVwcmVzZW50IHRoZSBwb2ludCBhcm91bmQgd2hpY2ggdGhlIHNjcmVlbiBzaG91bGQgYmUKKyAgICAgKiBjZW50ZXJlZCBhZnRlciB6b29taW5nLiBJbiBvdGhlciB3b3JkcyBpdCBpcyB1c2VkIHRvIGRldGVybWluZSB0aGUgY2VudGVyCisgICAgICogcG9pbnQgb2YgdGhlIHZpc2libGUgZG9jdW1lbnQgYWZ0ZXIgdGhlIHBhZ2UgaGFzIGZpbmlzaGVkIHpvb21pbmcuIFRoaXMKKyAgICAgKiBpcyBpbXBvcnRhbnQgYmVjYXVzZSB0aGUgem9vbSBtYXkgaGF2ZSBwb3RlbnRpYWxseSByZWZsb3dlZCB0aGUgdGV4dCBhbmQKKyAgICAgKiB3ZSBuZWVkIHRvIGVuc3VyZSB0aGUgcHJvcGVyIHBvcnRpb24gb2YgdGhlIGRvY3VtZW50IHJlbWFpbnMgb24gdGhlCisgICAgICogc2NyZWVuLgorICAgICAqLworICAgIHByaXZhdGUgaW50IG1BbmNob3JYOworICAgIHByaXZhdGUgaW50IG1BbmNob3JZOworCisgICAgLy8gVGhlIHNjYWxlIGZhY3RvciB0aGF0IGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBjb2x1bW4gd2lkdGggZm9yIHRleHQKKyAgICBwcml2YXRlIGZsb2F0IG1UZXh0V3JhcFNjYWxlOworCisgICAgLyoKKyAgICAgKiBUaGUgZGVmYXVsdCB6b29tIHNjYWxlIGlzIHRoZSBzY2FsZSBmYWN0b3IgdXNlZCB3aGVuIHRoZSB1c2VyIHRyaWdnZXJzIGEKKyAgICAgKiB6b29tIGluIGJ5IGRvdWJsZSB0YXBwaW5nIG9uIHRoZSBXZWJWaWV3LiBUaGUgdmFsdWUgaXMgaW5pdGlhbGx5IHNldAorICAgICAqIGJhc2VkIG9uIHRoZSBkaXNwbGF5IGRlbnNpdHksIGJ1dCBjYW4gYmUgY2hhbmdlZCBhdCBhbnkgdGltZSB2aWEgdGhlCisgICAgICogV2ViU2V0dGluZ3MuCisgICAgICovCisgICAgcHJpdmF0ZSBmbG9hdCBtRGVmYXVsdFNjYWxlOworICAgIHByaXZhdGUgZmxvYXQgbUludkRlZmF1bHRTY2FsZTsKKworICAgIC8vIHRoZSBjdXJyZW50IGNvbXB1dGVkIHpvb20gc2NhbGUgYW5kIGl0cyBpbnZlcnNlLgorICAgIHByaXZhdGUgZmxvYXQgbUFjdHVhbFNjYWxlOworICAgIHByaXZhdGUgZmxvYXQgbUludkFjdHVhbFNjYWxlOworICAgIAorICAgIC8qCisgICAgICogVGhlIGluaXRpYWwgc2NhbGUgZm9yIHRoZSBXZWJWaWV3LiAwIG1lYW5zIGRlZmF1bHQuIElmIGluaXRpYWwgc2NhbGUgaXMKKyAgICAgKiBncmVhdGVyIHRoYW4gMCB0aGUgV2ViVmlldyBzdGFydHMgd2l0aCB0aGlzIHZhbHVlIGFzIGl0cyBpbml0aWFsIHNjYWxlLiBUaGUKKyAgICAgKiB2YWx1ZSBpcyBjb252ZXJ0ZWQgZnJvbSBhbiBpbnRlZ2VyIHBlcmNlbnRhZ2Ugc28gaXQgaXMgZ3VhcmVudGVlZCB0byBoYXZlCisgICAgICogbm8gbW9yZSB0aGFuIDIgc2lnbmlmaWNhbnQgZGlnaXRzIGFmdGVyIHRoZSBkZWNpbWFsLiAgVGhpcyByZXN0cmljdGlvbgorICAgICAqIGFsbG93cyB1cyB0byBjb252ZXJ0IHRoZSBzY2FsZSBiYWNrIHRvIHRoZSBvcmlnaW5hbCBwZXJjZW50YWdlIGJ5IHNpbXBseQorICAgICAqIG11bHRpcGx5aW5nIHRoZSB2YWx1ZSBieSAxMDAuCisgICAgICovCisgICAgcHJpdmF0ZSBmbG9hdCBtSW5pdGlhbFNjYWxlOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmxvYXQgTUlOSU1VTV9TQ0FMRV9JTkNSRU1FTlQgPSAwLjAxZjsKKworICAgIC8qCisgICAgICogVGhlIGZvbGxvd2luZyBtZW1iZXIgdmFyaWFibGVzIGFyZSBvbmx5IHRvIGJlIHVzZWQgZm9yIGFuaW1hdGluZyB6b29tLiBJZgorICAgICAqIG1ab29tU2NhbGUgaXMgbm9uLXplcm8gdGhlbiB3ZSBhcmUgaW4gdGhlIG1pZGRsZSBvZiBhIHpvb20gYW5pbWF0aW9uLiBUaGUKKyAgICAgKiBvdGhlciB2YXJpYWJsZXMgYXJlIHVzZWQgYXMgYSBjYWNoZSAoZS5nLiBpbnZlcnNlKSBvciBhcyBhIHdheSB0byBzdG9yZQorICAgICAqIHRoZSBzdGF0ZSBvZiB0aGUgdmlldyBwcmlvciB0byBhbmltYXRpbmcgKGUuZy4gaW5pdGlhbCBzY3JvbGwgY29vcmRzKS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZsb2F0IG1ab29tU2NhbGU7CisgICAgcHJpdmF0ZSBmbG9hdCBtSW52SW5pdGlhbFpvb21TY2FsZTsKKyAgICBwcml2YXRlIGZsb2F0IG1JbnZGaW5hbFpvb21TY2FsZTsKKyAgICBwcml2YXRlIGludCBtSW5pdGlhbFNjcm9sbFg7CisgICAgcHJpdmF0ZSBpbnQgbUluaXRpYWxTY3JvbGxZOworICAgIHByaXZhdGUgbG9uZyBtWm9vbVN0YXJ0OworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFpPT01fQU5JTUFUSU9OX0xFTkdUSCA9IDUwMDsKKworICAgIC8vIHdoZXRoZXIgc3VwcG9ydCBtdWx0aS10b3VjaAorICAgIHByaXZhdGUgYm9vbGVhbiBtU3VwcG9ydE11bHRpVG91Y2g7CisKKyAgICAvLyB1c2UgdGhlIGZyYW1ld29yaydzIFNjYWxlR2VzdHVyZURldGVjdG9yIHRvIGhhbmRsZSBtdWx0aS10b3VjaAorICAgIHByaXZhdGUgU2NhbGVHZXN0dXJlRGV0ZWN0b3IgbVNjYWxlRGV0ZWN0b3I7CisgICAgcHJpdmF0ZSBib29sZWFuIG1QaW5jaFRvWm9vbUFuaW1hdGluZyA9IGZhbHNlOworCisgICAgcHVibGljIFpvb21NYW5hZ2VyKFdlYlZpZXcgd2ViVmlldywgQ2FsbGJhY2tQcm94eSBjYWxsYmFja1Byb3h5KSB7CisgICAgICAgIG1XZWJWaWV3ID0gd2ViVmlldzsKKyAgICAgICAgbUNhbGxiYWNrUHJveHkgPSBjYWxsYmFja1Byb3h5OworCisgICAgICAgIC8qCisgICAgICAgICAqIElkZWFsbHkgbVpvb21PdmVydmlld1dpZHRoIHNob3VsZCBiZSBtQ29udGVudFdpZHRoLiBCdXQgc2l0ZXMgbGlrZQorICAgICAgICAgKiBFU1BOIGFuZCBFbmdhZGdldCBhbHdheXMgaGF2ZSB3aWRlciBtQ29udGVudFdpZHRoIG5vIG1hdHRlciB3aGF0IHRoZQorICAgICAgICAgKiB2aWV3cG9ydCBzaXplIGlzLgorICAgICAgICAgKi8KKyAgICAgICAgc2V0Wm9vbU92ZXJ2aWV3V2lkdGgoV2ViVmlldy5ERUZBVUxUX1ZJRVdQT1JUX1dJRFRIKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplIGJvdGggdGhlIGRlZmF1bHQgYW5kIGFjdHVhbCB6b29tIHNjYWxlIHRvIHRoZSBnaXZlbiBkZW5zaXR5LgorICAgICAqCisgICAgICogQHBhcmFtIGRlbnNpdHkgVGhlIGxvZ2ljYWwgZGVuc2l0eSBvZiB0aGUgZGlzcGxheS4gVGhpcyBpcyBhIHNjYWxpbmcgZmFjdG9yCisgICAgICogZm9yIHRoZSBEZW5zaXR5IEluZGVwZW5kZW50IFBpeGVsIHVuaXQsIHdoZXJlIG9uZSBESVAgaXMgb25lIHBpeGVsIG9uIGFuCisgICAgICogYXBwcm94aW1hdGVseSAxNjAgZHBpIHNjcmVlbiAoc2VlIGFuZHJvaWQudXRpbC5EaXNwbGF5TWV0cmljcy5kZW5zaXR5KS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBpbml0KGZsb2F0IGRlbnNpdHkpIHsKKyAgICAgICAgYXNzZXJ0IGRlbnNpdHkgPiAwOworCisgICAgICAgIHNldERlZmF1bHRab29tU2NhbGUoZGVuc2l0eSk7CisgICAgICAgIG1BY3R1YWxTY2FsZSA9IGRlbnNpdHk7CisgICAgICAgIG1JbnZBY3R1YWxTY2FsZSA9IDEgLyBkZW5zaXR5OworICAgICAgICBtVGV4dFdyYXBTY2FsZSA9IGRlbnNpdHk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVXBkYXRlIHRoZSBkZWZhdWx0IHpvb20gc2NhbGUgdXNpbmcgdGhlIGdpdmVuIGRlbnNpdHkuIEl0IHdpbGwgYWxzbyByZXNldAorICAgICAqIHRoZSBjdXJyZW50IG1pbiBhbmQgbWF4IHpvb20gc2NhbGVzIHRvIHRoZSBkZWZhdWx0IGJvdW5kYXJpZXMgYXMgd2VsbCBhcworICAgICAqIGVuc3VyZSB0aGF0IHRoZSBhY3R1YWwgc2NhbGUgZmFsbHMgd2l0aGluIHRob3NlIGJvdW5kYXJpZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGVuc2l0eSBUaGUgbG9naWNhbCBkZW5zaXR5IG9mIHRoZSBkaXNwbGF5LiBUaGlzIGlzIGEgc2NhbGluZyBmYWN0b3IKKyAgICAgKiBmb3IgdGhlIERlbnNpdHkgSW5kZXBlbmRlbnQgUGl4ZWwgdW5pdCwgd2hlcmUgb25lIERJUCBpcyBvbmUgcGl4ZWwgb24gYW4KKyAgICAgKiBhcHByb3hpbWF0ZWx5IDE2MCBkcGkgc2NyZWVuIChzZWUgYW5kcm9pZC51dGlsLkRpc3BsYXlNZXRyaWNzLmRlbnNpdHkpLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHVwZGF0ZURlZmF1bHRab29tRGVuc2l0eShmbG9hdCBkZW5zaXR5KSB7CisgICAgICAgIGFzc2VydCBkZW5zaXR5ID4gMDsKKworICAgICAgICBpZiAoTWF0aC5hYnMoZGVuc2l0eSAtIG1EZWZhdWx0U2NhbGUpID4gTUlOSU1VTV9TQ0FMRV9JTkNSRU1FTlQpIHsKKyAgICAgICAgICAgIC8vIHNldCB0aGUgbmV3IGRlZmF1bHQgZGVuc2l0eQorICAgICAgICAgICAgc2V0RGVmYXVsdFpvb21TY2FsZShkZW5zaXR5KTsKKyAgICAgICAgICAgIC8vIGFkanVzdCB0aGUgc2NhbGUgaWYgaXQgZmFsbHMgb3V0c2lkZSB0aGUgbmV3IHpvb20gYm91bmRzCisgICAgICAgICAgICBzZXRab29tU2NhbGUobUFjdHVhbFNjYWxlLCB0cnVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZXREZWZhdWx0Wm9vbVNjYWxlKGZsb2F0IGRlZmF1bHRTY2FsZSkgeworICAgICAgICBtRGVmYXVsdFNjYWxlID0gZGVmYXVsdFNjYWxlOworICAgICAgICBtSW52RGVmYXVsdFNjYWxlID0gMSAvIGRlZmF1bHRTY2FsZTsKKyAgICAgICAgbURlZmF1bHRNYXhab29tU2NhbGUgPSBkZWZhdWx0U2NhbGUgKiBERUZBVUxUX01BWF9aT09NX1NDQUxFX0ZBQ1RPUjsKKyAgICAgICAgbURlZmF1bHRNaW5ab29tU2NhbGUgPSBkZWZhdWx0U2NhbGUgKiBERUZBVUxUX01JTl9aT09NX1NDQUxFX0ZBQ1RPUjsKKyAgICAgICAgbU1heFpvb21TY2FsZSA9IG1EZWZhdWx0TWF4Wm9vbVNjYWxlOworICAgICAgICBtTWluWm9vbVNjYWxlID0gbURlZmF1bHRNaW5ab29tU2NhbGU7CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIGZsb2F0IGdldFNjYWxlKCkgeworICAgICAgICByZXR1cm4gbUFjdHVhbFNjYWxlOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCBmbG9hdCBnZXRJbnZTY2FsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1JbnZBY3R1YWxTY2FsZTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgZmxvYXQgZ2V0VGV4dFdyYXBTY2FsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1UZXh0V3JhcFNjYWxlOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCBmbG9hdCBnZXRNYXhab29tU2NhbGUoKSB7CisgICAgICAgIHJldHVybiBtTWF4Wm9vbVNjYWxlOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCBmbG9hdCBnZXRNaW5ab29tU2NhbGUoKSB7CisgICAgICAgIHJldHVybiBtTWluWm9vbVNjYWxlOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCBmbG9hdCBnZXREZWZhdWx0U2NhbGUoKSB7CisgICAgICAgIHJldHVybiBtRGVmYXVsdFNjYWxlOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCBmbG9hdCBnZXRSZWFkaW5nTGV2ZWxTY2FsZSgpIHsKKyAgICAgIHJldHVybiBNYXRoLm1heChtRGVmYXVsdFNjYWxlLCBNSU5fUkVBRElOR19MRVZFTF9TQ0FMRSk7CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIGZsb2F0IGdldEludkRlZmF1bHRTY2FsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1JbnZEZWZhdWx0U2NhbGU7CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIGZsb2F0IGdldERlZmF1bHRNYXhab29tU2NhbGUoKSB7CisgICAgICAgIHJldHVybiBtRGVmYXVsdE1heFpvb21TY2FsZTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgZmxvYXQgZ2V0RGVmYXVsdE1pblpvb21TY2FsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1EZWZhdWx0TWluWm9vbVNjYWxlOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0RG9jdW1lbnRBbmNob3JYKCkgeworICAgICAgICByZXR1cm4gbUFuY2hvclg7CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIGludCBnZXREb2N1bWVudEFuY2hvclkoKSB7CisgICAgICAgIHJldHVybiBtQW5jaG9yWTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBjbGVhckRvY3VtZW50QW5jaG9yKCkgeworICAgICAgICBtQW5jaG9yWCA9IG1BbmNob3JZID0gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXRab29tQ2VudGVyKGZsb2F0IHgsIGZsb2F0IHkpIHsKKyAgICAgICAgbVpvb21DZW50ZXJYID0geDsKKyAgICAgICAgbVpvb21DZW50ZXJZID0geTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXRJbml0aWFsU2NhbGVJblBlcmNlbnQoaW50IHNjYWxlSW5QZXJjZW50KSB7CisgICAgICAgIG1Jbml0aWFsU2NhbGUgPSBzY2FsZUluUGVyY2VudCAqIDAuMDFmOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCBmbG9hdCBjb21wdXRlU2NhbGVXaXRoTGltaXRzKGZsb2F0IHNjYWxlKSB7CisgICAgICAgIGlmIChzY2FsZSA8IG1NaW5ab29tU2NhbGUpIHsKKyAgICAgICAgICAgIHNjYWxlID0gbU1pblpvb21TY2FsZTsKKyAgICAgICAgfSBlbHNlIGlmIChzY2FsZSA+IG1NYXhab29tU2NhbGUpIHsKKyAgICAgICAgICAgIHNjYWxlID0gbU1heFpvb21TY2FsZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc2NhbGU7CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gaXNab29tU2NhbGVGaXhlZCgpIHsKKyAgICAgICAgcmV0dXJuIG1NaW5ab29tU2NhbGUgPj0gbU1heFpvb21TY2FsZTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gZXhjZWVkc01pblNjYWxlSW5jcmVtZW50KGZsb2F0IHNjYWxlQSwgZmxvYXQgc2NhbGVCKSB7CisgICAgICAgIHJldHVybiBNYXRoLmFicyhzY2FsZUEgLSBzY2FsZUIpID49IE1JTklNVU1fU0NBTEVfSU5DUkVNRU5UOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHdpbGxTY2FsZVRyaWdnZXJab29tKGZsb2F0IHNjYWxlKSB7CisgICAgICAgIHJldHVybiBleGNlZWRzTWluU2NhbGVJbmNyZW1lbnQoc2NhbGUsIG1BY3R1YWxTY2FsZSk7CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gY2FuWm9vbUluKCkgeworICAgICAgICByZXR1cm4gbU1heFpvb21TY2FsZSAtIG1BY3R1YWxTY2FsZSA+IE1JTklNVU1fU0NBTEVfSU5DUkVNRU5UOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGNhblpvb21PdXQoKSB7CisgICAgICAgIHJldHVybiBtQWN0dWFsU2NhbGUgLSBtTWluWm9vbVNjYWxlID4gTUlOSU1VTV9TQ0FMRV9JTkNSRU1FTlQ7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gem9vbUluKCkgeworICAgICAgICByZXR1cm4gem9vbSgxLjI1Zik7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gem9vbU91dCgpIHsKKyAgICAgICAgcmV0dXJuIHpvb20oMC44Zik7CisgICAgfQorCisgICAgLy8gcmV0dXJucyBUUlVFIGlmIHpvb20gb3V0IHN1Y2NlZWRzIGFuZCBGQUxTRSBpZiBubyB6b29tIGNoYW5nZXMuCisgICAgcHJpdmF0ZSBib29sZWFuIHpvb20oZmxvYXQgem9vbU11bHRpcGxpZXIpIHsKKyAgICAgICAgLy8gVE9ETzogYWx0ZXJuYXRpdmVseSB3ZSBjYW4gZGlzYWxsb3cgdGhpcyBkdXJpbmcgZHJhdyBoaXN0b3J5IG1vZGUKKyAgICAgICAgbVdlYlZpZXcuc3dpdGNoT3V0RHJhd0hpc3RvcnkoKTsKKyAgICAgICAgLy8gQ2VudGVyIHpvb21pbmcgdG8gdGhlIGNlbnRlciBvZiB0aGUgc2NyZWVuLgorICAgICAgICBtWm9vbUNlbnRlclggPSBtV2ViVmlldy5nZXRWaWV3V2lkdGgoKSAqIC41ZjsKKyAgICAgICAgbVpvb21DZW50ZXJZID0gbVdlYlZpZXcuZ2V0Vmlld0hlaWdodCgpICogLjVmOworICAgICAgICBtQW5jaG9yWCA9IG1XZWJWaWV3LnZpZXdUb0NvbnRlbnRYKChpbnQpIG1ab29tQ2VudGVyWCArIG1XZWJWaWV3LmdldFNjcm9sbFgoKSk7CisgICAgICAgIG1BbmNob3JZID0gbVdlYlZpZXcudmlld1RvQ29udGVudFkoKGludCkgbVpvb21DZW50ZXJZICsgbVdlYlZpZXcuZ2V0U2Nyb2xsWSgpKTsKKyAgICAgICAgcmV0dXJuIHN0YXJ0Wm9vbUFuaW1hdGlvbihtQWN0dWFsU2NhbGUgKiB6b29tTXVsdGlwbGllciwgdHJ1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5pdGlhdGVzIGFuIGFuaW1hdGVkIHpvb20gb2YgdGhlIFdlYlZpZXcuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIG5ldyBzY2FsZSB0cmlnZ2VyZWQgYW4gYW5pbWF0aW9uIGFuZCBmYWxzZSBvdGhlcndpc2UuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gc3RhcnRab29tQW5pbWF0aW9uKGZsb2F0IHNjYWxlLCBib29sZWFuIHJlZmxvd1RleHQpIHsKKyAgICAgICAgZmxvYXQgb2xkU2NhbGUgPSBtQWN0dWFsU2NhbGU7CisgICAgICAgIG1Jbml0aWFsU2Nyb2xsWCA9IG1XZWJWaWV3LmdldFNjcm9sbFgoKTsKKyAgICAgICAgbUluaXRpYWxTY3JvbGxZID0gbVdlYlZpZXcuZ2V0U2Nyb2xsWSgpOworCisgICAgICAgIC8vIHNuYXAgdG8gcmVhZGluZyBsZXZlbCBzY2FsZSBpZiBpdCBpcyBjbG9zZQorICAgICAgICBpZiAoIWV4Y2VlZHNNaW5TY2FsZUluY3JlbWVudChzY2FsZSwgZ2V0UmVhZGluZ0xldmVsU2NhbGUoKSkpIHsKKyAgICAgICAgICAgIHNjYWxlID0gZ2V0UmVhZGluZ0xldmVsU2NhbGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHNldFpvb21TY2FsZShzY2FsZSwgcmVmbG93VGV4dCk7CisKKyAgICAgICAgaWYgKG9sZFNjYWxlICE9IG1BY3R1YWxTY2FsZSkgeworICAgICAgICAgICAgLy8gdXNlIG1ab29tUGlja2VyU2NhbGUgdG8gc2VlIHpvb20gcHJldmlldyBmaXJzdAorICAgICAgICAgICAgbVpvb21TdGFydCA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOworICAgICAgICAgICAgbUludkluaXRpYWxab29tU2NhbGUgPSAxLjBmIC8gb2xkU2NhbGU7CisgICAgICAgICAgICBtSW52RmluYWxab29tU2NhbGUgPSAxLjBmIC8gbUFjdHVhbFNjYWxlOworICAgICAgICAgICAgbVpvb21TY2FsZSA9IG1BY3R1YWxTY2FsZTsKKyAgICAgICAgICAgIG1XZWJWaWV3Lm9uRml4ZWRMZW5ndGhab29tQW5pbWF0aW9uU3RhcnQoKTsKKyAgICAgICAgICAgIG1XZWJWaWV3LmludmFsaWRhdGUoKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSBXZWJWaWV3J3MgZHJhd2luZyBjb2RlIHdoZW4gYSBmaXhlZCBsZW5ndGggem9vbQorICAgICAqIGFuaW1hdGlvbiBpcyBvY2N1cnJpbmcuIEl0cyBwdXJwb3NlIGlzIHRvIGFuaW1hdGUgdGhlIHpvb21pbmcgb2YgdGhlIGNhbnZhcworICAgICAqIHRvIHRoZSBkZXNpcmVkIHNjYWxlIHdoaWNoIHdhcyBzcGVjaWZpZWQgaW4gc3RhcnRab29tQW5pbWF0aW9uKC4uLikuCisgICAgICoKKyAgICAgKiBBIGZpeGVkIGxlbmd0aCBhbmltYXRpb24gYmVnaW5zIHdoZW4gc3RhcnRab29tQW5pbWF0aW9uKC4uLikgaXMgY2FsbGVkIGFuZAorICAgICAqIGNvbnRpbnVlcyB1bnRpbCB0aGUgWk9PTV9BTklNQVRJT05fTEVOR1RIIHRpbWUgaGFzIGVsYXBzZWQuIER1cmluZyB0aGF0CisgICAgICogaW50ZXJ2YWwgZWFjaCB0aW1lIHRoZSBXZWJWaWV3IGRyYXdzIGl0IGNhbGxzIHRoaXMgZnVuY3Rpb24gd2hpY2ggaXMgCisgICAgICogcmVzcG9uc2libGUgZm9yIGdlbmVyYXRpbmcgdGhlIGFuaW1hdGlvbi4KKyAgICAgKgorICAgICAqIEFkZGl0aW9uYWxseSwgdGhlIFdlYlZpZXcgY2FuIGNoZWNrIHRvIHNlZSBpZiBzdWNoIGFuIGFuaW1hdGlvbiBpcyBjdXJyZW50bHkKKyAgICAgKiBpbiBwcm9ncmVzcyBieSBjYWxsaW5nIGlzRml4ZWRMZW5ndGhBbmltYXRpb25JblByb2dyZXNzKCkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYW5pbWF0ZVpvb20oQ2FudmFzIGNhbnZhcykgeworICAgICAgICBpZiAobVpvb21TY2FsZSA9PSAwKSB7CisgICAgICAgICAgICBMb2cudyhMT0dUQUcsICJBIFdlYlZpZXcgaXMgYXR0ZW1wdGluZyB0byBwZXJmb3JtIGEgZml4ZWQgbGVuZ3RoICIKKyAgICAgICAgICAgICAgICAgICAgKyAiem9vbSBhbmltYXRpb24gd2hlbiBubyB6b29tIGlzIGluIHByb2dyZXNzIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBmbG9hdCB6b29tU2NhbGU7CisgICAgICAgIGludCBpbnRlcnZhbCA9IChpbnQpIChTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKSAtIG1ab29tU3RhcnQpOworICAgICAgICBpZiAoaW50ZXJ2YWwgPCBaT09NX0FOSU1BVElPTl9MRU5HVEgpIHsKKyAgICAgICAgICAgIGZsb2F0IHJhdGlvID0gKGZsb2F0KSBpbnRlcnZhbCAvIFpPT01fQU5JTUFUSU9OX0xFTkdUSDsKKyAgICAgICAgICAgIHpvb21TY2FsZSA9IDEuMGYgLyAobUludkluaXRpYWxab29tU2NhbGUKKyAgICAgICAgICAgICAgICAgICAgKyAobUludkZpbmFsWm9vbVNjYWxlIC0gbUludkluaXRpYWxab29tU2NhbGUpICogcmF0aW8pOworICAgICAgICAgICAgbVdlYlZpZXcuaW52YWxpZGF0ZSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgem9vbVNjYWxlID0gbVpvb21TY2FsZTsKKyAgICAgICAgICAgIC8vIHNldCBtWm9vbVNjYWxlIHRvIGJlIDAgYXMgd2UgaGF2ZSBmaW5pc2hlZCBhbmltYXRpbmcKKyAgICAgICAgICAgIG1ab29tU2NhbGUgPSAwOworICAgICAgICAgICAgbVdlYlZpZXcub25GaXhlZExlbmd0aFpvb21BbmltYXRpb25FbmQoKTsKKyAgICAgICAgfQorICAgICAgICAvLyBjYWxjdWxhdGUgdGhlIGludGVybWVkaWF0ZSBzY3JvbGwgcG9zaXRpb24uIFNpbmNlIHdlIG5lZWQgdG8gdXNlCisgICAgICAgIC8vIHpvb21TY2FsZSwgd2UgY2FuJ3QgdXNlIHRoZSBXZWJWaWV3J3MgcGluTG9jWC9ZIGZ1bmN0aW9ucyBkaXJlY3RseS4KKyAgICAgICAgZmxvYXQgc2NhbGUgPSB6b29tU2NhbGUgKiBtSW52SW5pdGlhbFpvb21TY2FsZTsKKyAgICAgICAgaW50IHR4ID0gTWF0aC5yb3VuZChzY2FsZSAqIChtSW5pdGlhbFNjcm9sbFggKyBtWm9vbUNlbnRlclgpIC0gbVpvb21DZW50ZXJYKTsKKyAgICAgICAgdHggPSAtV2ViVmlldy5waW5Mb2ModHgsIG1XZWJWaWV3LmdldFZpZXdXaWR0aCgpLCBNYXRoLnJvdW5kKG1XZWJWaWV3LmdldENvbnRlbnRXaWR0aCgpCisgICAgICAgICAgICAgICAgKiB6b29tU2NhbGUpKSArIG1XZWJWaWV3LmdldFNjcm9sbFgoKTsKKyAgICAgICAgaW50IHRpdGxlSGVpZ2h0ID0gbVdlYlZpZXcuZ2V0VGl0bGVIZWlnaHQoKTsKKyAgICAgICAgaW50IHR5ID0gTWF0aC5yb3VuZChzY2FsZQorICAgICAgICAgICAgICAgICogKG1Jbml0aWFsU2Nyb2xsWSArIG1ab29tQ2VudGVyWSAtIHRpdGxlSGVpZ2h0KQorICAgICAgICAgICAgICAgIC0gKG1ab29tQ2VudGVyWSAtIHRpdGxlSGVpZ2h0KSk7CisgICAgICAgIHR5ID0gLSh0eSA8PSB0aXRsZUhlaWdodCA/IE1hdGgubWF4KHR5LCAwKSA6IFdlYlZpZXcucGluTG9jKHR5CisgICAgICAgICAgICAgICAgLSB0aXRsZUhlaWdodCwgbVdlYlZpZXcuZ2V0Vmlld0hlaWdodCgpLCBNYXRoLnJvdW5kKG1XZWJWaWV3LmdldENvbnRlbnRIZWlnaHQoKQorICAgICAgICAgICAgICAgICogem9vbVNjYWxlKSkgKyB0aXRsZUhlaWdodCkgKyBtV2ViVmlldy5nZXRTY3JvbGxZKCk7CisKKyAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSh0eCwgdHkpOworICAgICAgICBjYW52YXMuc2NhbGUoem9vbVNjYWxlLCB6b29tU2NhbGUpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzWm9vbUFuaW1hdGluZygpIHsKKyAgICAgICAgcmV0dXJuIGlzRml4ZWRMZW5ndGhBbmltYXRpb25JblByb2dyZXNzKCkgfHwgbVBpbmNoVG9ab29tQW5pbWF0aW5nOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzRml4ZWRMZW5ndGhBbmltYXRpb25JblByb2dyZXNzKCkgeworICAgICAgICByZXR1cm4gbVpvb21TY2FsZSAhPSAwOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlZnJlc2hab29tU2NhbGUoYm9vbGVhbiByZWZsb3dUZXh0KSB7CisgICAgICAgIHNldFpvb21TY2FsZShtQWN0dWFsU2NhbGUsIHJlZmxvd1RleHQsIHRydWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFpvb21TY2FsZShmbG9hdCBzY2FsZSwgYm9vbGVhbiByZWZsb3dUZXh0KSB7CisgICAgICAgIHNldFpvb21TY2FsZShzY2FsZSwgcmVmbG93VGV4dCwgZmFsc2UpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZXRab29tU2NhbGUoZmxvYXQgc2NhbGUsIGJvb2xlYW4gcmVmbG93VGV4dCwgYm9vbGVhbiBmb3JjZSkgeworICAgICAgICBmaW5hbCBib29sZWFuIGlzU2NhbGVMZXNzVGhhbk1pblpvb20gPSBzY2FsZSA8IG1NaW5ab29tU2NhbGU7CisgICAgICAgIHNjYWxlID0gY29tcHV0ZVNjYWxlV2l0aExpbWl0cyhzY2FsZSk7CisKKyAgICAgICAgLy8gZGV0ZXJtaW5lIHdoZXRoZXIgb3Igbm90IHdlIGFyZSBpbiB0aGUgem9vbSBvdmVydmlldyBtb2RlCisgICAgICAgIGlmIChpc1NjYWxlTGVzc1RoYW5NaW5ab29tICYmIG1NaW5ab29tU2NhbGUgPCBtRGVmYXVsdFNjYWxlKSB7CisgICAgICAgICAgICBtSW5ab29tT3ZlcnZpZXcgPSB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUluWm9vbU92ZXJ2aWV3ID0gIWV4Y2VlZHNNaW5TY2FsZUluY3JlbWVudChzY2FsZSwgZ2V0Wm9vbU92ZXJ2aWV3U2NhbGUoKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAocmVmbG93VGV4dCkgeworICAgICAgICAgICAgbVRleHRXcmFwU2NhbGUgPSBzY2FsZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzY2FsZSAhPSBtQWN0dWFsU2NhbGUgfHwgZm9yY2UpIHsKKyAgICAgICAgICAgIGZsb2F0IG9sZFNjYWxlID0gbUFjdHVhbFNjYWxlOworICAgICAgICAgICAgZmxvYXQgb2xkSW52U2NhbGUgPSBtSW52QWN0dWFsU2NhbGU7CisKKyAgICAgICAgICAgIGlmIChzY2FsZSAhPSBtQWN0dWFsU2NhbGUgJiYgIW1QaW5jaFRvWm9vbUFuaW1hdGluZykgeworICAgICAgICAgICAgICAgIG1DYWxsYmFja1Byb3h5Lm9uU2NhbGVDaGFuZ2VkKG1BY3R1YWxTY2FsZSwgc2NhbGUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtQWN0dWFsU2NhbGUgPSBzY2FsZTsKKyAgICAgICAgICAgIG1JbnZBY3R1YWxTY2FsZSA9IDEgLyBzY2FsZTsKKworICAgICAgICAgICAgaWYgKCFtV2ViVmlldy5kcmF3SGlzdG9yeSgpKSB7CisKKyAgICAgICAgICAgICAgICAvLyBJZiBoaXN0b3J5IFBpY3R1cmUgaXMgZHJhd24sIGRvbid0IHVwZGF0ZSBzY3JvbGwuIFRoZXkgd2lsbAorICAgICAgICAgICAgICAgIC8vIGJlIHVwZGF0ZWQgd2hlbiB3ZSBnZXQgb3V0IG9mIHRoYXQgbW9kZS4KKyAgICAgICAgICAgICAgICAvLyB1cGRhdGUgb3VyIHNjcm9sbCBzbyB3ZSBkb24ndCBhcHBlYXIgdG8ganVtcAorICAgICAgICAgICAgICAgIC8vIGkuZS4ga2VlcCB0aGUgY2VudGVyIG9mIHRoZSBkb2MgaW4gdGhlIGNlbnRlciBvZiB0aGUgdmlldworICAgICAgICAgICAgICAgIGludCBvbGRYID0gbVdlYlZpZXcuZ2V0U2Nyb2xsWCgpOworICAgICAgICAgICAgICAgIGludCBvbGRZID0gbVdlYlZpZXcuZ2V0U2Nyb2xsWSgpOworICAgICAgICAgICAgICAgIGZsb2F0IHJhdGlvID0gc2NhbGUgKiBvbGRJbnZTY2FsZTsKKyAgICAgICAgICAgICAgICBmbG9hdCBzeCA9IHJhdGlvICogb2xkWCArIChyYXRpbyAtIDEpICogbVpvb21DZW50ZXJYOworICAgICAgICAgICAgICAgIGZsb2F0IHN5ID0gcmF0aW8gKiBvbGRZICsgKHJhdGlvIC0gMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICogKG1ab29tQ2VudGVyWSAtIG1XZWJWaWV3LmdldFRpdGxlSGVpZ2h0KCkpOworCisgICAgICAgICAgICAgICAgLy8gU2NhbGUgYWxsIHRoZSBjaGlsZCB2aWV3cworICAgICAgICAgICAgICAgIG1XZWJWaWV3Lm1WaWV3TWFuYWdlci5zY2FsZUFsbCgpOworCisgICAgICAgICAgICAgICAgLy8gYXMgd2UgZG9uJ3QgaGF2ZSBhbmltYXRpb24gZm9yIHNjYWxpbmcsIGRvbid0IGRvIGFuaW1hdGlvbgorICAgICAgICAgICAgICAgIC8vIGZvciBzY3JvbGxpbmcsIGFzIGl0IGNhdXNlcyB3ZWlyZCBpbnRlcm1lZGlhdGUgc3RhdGUKKyAgICAgICAgICAgICAgICBpbnQgc2Nyb2xsWCA9IG1XZWJWaWV3LnBpbkxvY1goTWF0aC5yb3VuZChzeCkpOworICAgICAgICAgICAgICAgIGludCBzY3JvbGxZID0gbVdlYlZpZXcucGluTG9jWShNYXRoLnJvdW5kKHN5KSk7CisgICAgICAgICAgICAgICAgaWYoIW1XZWJWaWV3LnVwZGF0ZVNjcm9sbENvb3JkaW5hdGVzKHNjcm9sbFgsIHNjcm9sbFkpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzY3JvbGwgcG9zaXRpb24gaXMgYWRqdXN0ZWQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgLy8gem9vbSBhbmltYXRpb24uIEJ1dCB3ZSB3YW50IHRvIHVwZGF0ZSB0aGUgV2ViS2l0IGF0IHRoZQorICAgICAgICAgICAgICAgICAgICAvLyBlbmQgb2YgdGhlIHpvb20gYW5pbWF0aW9uLiBTZWUgY29tbWVudHMgaW4gb25TY2FsZUVuZCgpLgorICAgICAgICAgICAgICAgICAgICBtV2ViVmlldy5zZW5kT3VyVmlzaWJsZVJlY3QoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGlmIHRoZSB3ZSBuZWVkIHRvIHJlZmxvdyB0aGUgdGV4dCB0aGVuIGZvcmNlIHRoZSBWSUVXX1NJWkVfQ0hBTkdFRAorICAgICAgICAgICAgLy8gZXZlbnQgdG8gYmUgc2VudCB0byBXZWJLaXQKKyAgICAgICAgICAgIG1XZWJWaWV3LnNlbmRWaWV3U2l6ZVpvb20ocmVmbG93VGV4dCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgZG91YmxlIHRhcCBnZXN0dXJlIGNhbiByZXN1bHQgaW4gZGlmZmVyZW50IGJlaGF2aW9ycyBkZXBlbmRpbmcgb24gdGhlCisgICAgICogY29udGVudCB0aGF0IGlzIHRhcHBlZC4KKyAgICAgKgorICAgICAqICgxKSBQTFVHSU5TOiBJZiB0aGUgdGFwcyBvY2N1ciBvbiBhIHBsdWdpbiB0aGVuIHdlIG1heGltaXplIHRoZSBwbHVnaW4gb24KKyAgICAgKiB0aGUgc2NyZWVuLiBJZiB0aGUgcGx1Z2luIGlzIGFscmVhZHkgbWF4aW1pemVkIHRoZW4gem9vbSB0aGUgdXNlciBpbnRvCisgICAgICogb3ZlcnZpZXcgbW9kZS4KKyAgICAgKgorICAgICAqICgyKSBIVE1ML09USEVSOiBJZiB0aGUgdGFwcyBvY2N1ciBvdXRzaWRlIGEgcGx1Z2luIHRoZW4gdGhlIGZvbGxvd2luZworICAgICAqIGhldXJpc3RpYyBpcyB1c2VkLgorICAgICAqICAgQS4gSWYgdGhlIGN1cnJlbnQgc2NhbGUgaXMgbm90IHRoZSBzYW1lIGFzIHRoZSB0ZXh0IHdyYXAgc2NhbGUgYW5kIHRoZQorICAgICAqICAgICAgbGF5b3V0IGFsZ29yaXRobSBzcGVjaWZpZXMgdGhlIHVzZSBvZiBOQVJST1dfQ09MVU1OUywgdGhlbiBmaXQgdG8KKyAgICAgKiAgICAgIGNvbHVtbiBieSByZWZsb3dpbmcgdGhlIHRleHQuCisgICAgICogICBCLiBJZiB0aGUgcGFnZSBpcyBub3QgaW4gb3ZlcnZpZXcgbW9kZSB0aGVuIGNoYW5nZSB0byBvdmVydmlldyBtb2RlLgorICAgICAqICAgQy4gSWYgdGhlIHBhZ2UgaXMgaW4gb3Zlcm1vZGUgdGhlbiBjaGFuZ2UgdG8gdGhlIGRlZmF1bHQgc2NhbGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgaGFuZGxlRG91YmxlVGFwKGZsb2F0IGxhc3RUb3VjaFgsIGZsb2F0IGxhc3RUb3VjaFkpIHsKKyAgICAgICAgV2ViU2V0dGluZ3Mgc2V0dGluZ3MgPSBtV2ViVmlldy5nZXRTZXR0aW5ncygpOworICAgICAgICBpZiAoc2V0dGluZ3MgPT0gbnVsbCB8fCBzZXR0aW5ncy5nZXRVc2VXaWRlVmlld1BvcnQoKSA9PSBmYWxzZSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgc2V0Wm9vbUNlbnRlcihsYXN0VG91Y2hYLCBsYXN0VG91Y2hZKTsKKyAgICAgICAgbUFuY2hvclggPSBtV2ViVmlldy52aWV3VG9Db250ZW50WCgoaW50KSBsYXN0VG91Y2hYICsgbVdlYlZpZXcuZ2V0U2Nyb2xsWCgpKTsKKyAgICAgICAgbUFuY2hvclkgPSBtV2ViVmlldy52aWV3VG9Db250ZW50WSgoaW50KSBsYXN0VG91Y2hZICsgbVdlYlZpZXcuZ2V0U2Nyb2xsWSgpKTsKKyAgICAgICAgc2V0dGluZ3Muc2V0RG91YmxlVGFwVG9hc3RDb3VudCgwKTsKKworICAgICAgICAvLyByZW1vdmUgdGhlIHpvb20gY29udHJvbCBhZnRlciBkb3VibGUgdGFwCisgICAgICAgIGRpc21pc3Nab29tUGlja2VyKCk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogSWYgdGhlIGRvdWJsZSB0YXAgd2FzIG9uIGEgcGx1Z2luIHRoZW4gZWl0aGVyIHpvb20gdG8gbWF4aW1pemUgdGhlCisgICAgICAgICAqIHBsdWdpbiBvbiB0aGUgc2NyZWVuIG9yIHNjYWxlIHRvIG92ZXJ2aWV3IG1vZGUuCisgICAgICAgICAqLworICAgICAgICBWaWV3TWFuYWdlci5DaGlsZFZpZXcgcGx1Z2luID0gbVdlYlZpZXcubVZpZXdNYW5hZ2VyLmhpdFRlc3QobUFuY2hvclgsIG1BbmNob3JZKTsKKyAgICAgICAgaWYgKHBsdWdpbiAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAobVdlYlZpZXcuaXNQbHVnaW5GaXRPblNjcmVlbihwbHVnaW4pKSB7CisgICAgICAgICAgICAgICAgem9vbVRvT3ZlcnZpZXcoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbVdlYlZpZXcuY2VudGVyRml0UmVjdChwbHVnaW4ueCwgcGx1Z2luLnksIHBsdWdpbi53aWR0aCwgcGx1Z2luLmhlaWdodCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAoc2V0dGluZ3MuZ2V0TGF5b3V0QWxnb3JpdGhtKCkgPT0gV2ViU2V0dGluZ3MuTGF5b3V0QWxnb3JpdGhtLk5BUlJPV19DT0xVTU5TCisgICAgICAgICAgICAgICAgJiYgd2lsbFNjYWxlVHJpZ2dlclpvb20obVRleHRXcmFwU2NhbGUpCisgICAgICAgICAgICAgICAgLy8gRm9yIHRhYmxldCwgbm90IG11Y2ggbmVlZCB0byByZWZsb3cgdGV4dCB3L28gZG91YmxlIHRhcHBpbmcuCisgICAgICAgICAgICAgICAgJiYgIXNldHRpbmdzLmdldFVzZUZpeGVkVmlld3BvcnQoKSkgeworICAgICAgICAgICAgcmVmcmVzaFpvb21TY2FsZSh0cnVlKTsKKyAgICAgICAgfSBlbHNlIGlmICghbUluWm9vbU92ZXJ2aWV3KSB7CisgICAgICAgICAgICB6b29tVG9PdmVydmlldygpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgem9vbVRvUmVhZGluZ0xldmVsKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2V0Wm9vbU92ZXJ2aWV3V2lkdGgoaW50IHdpZHRoKSB7CisgICAgICAgIG1ab29tT3ZlcnZpZXdXaWR0aCA9IHdpZHRoOworICAgICAgICBtSW52Wm9vbU92ZXJ2aWV3V2lkdGggPSAxLjBmIC8gd2lkdGg7CisgICAgfQorCisgICAgcHJpdmF0ZSBmbG9hdCBnZXRab29tT3ZlcnZpZXdTY2FsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1XZWJWaWV3LmdldFZpZXdXaWR0aCgpICogbUludlpvb21PdmVydmlld1dpZHRoOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzSW5ab29tT3ZlcnZpZXcoKSB7CisgICAgICAgIHJldHVybiBtSW5ab29tT3ZlcnZpZXc7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHpvb21Ub092ZXJ2aWV3KCkgeworICAgICAgICBpZiAoIXdpbGxTY2FsZVRyaWdnZXJab29tKGdldFpvb21PdmVydmlld1NjYWxlKCkpKSByZXR1cm47CisKKyAgICAgICAgLy8gRm9yY2UgdGhlIHRpdGxlYmFyIGZ1bGx5IHJldmVhbCBpbiBvdmVydmlldyBtb2RlCisgICAgICAgIGludCBzY3JvbGxZID0gbVdlYlZpZXcuZ2V0U2Nyb2xsWSgpOworICAgICAgICBpZiAoc2Nyb2xsWSA8IG1XZWJWaWV3LmdldFRpdGxlSGVpZ2h0KCkpIHsKKyAgICAgICAgICAgIG1XZWJWaWV3LnVwZGF0ZVNjcm9sbENvb3JkaW5hdGVzKG1XZWJWaWV3LmdldFNjcm9sbFgoKSwgMCk7CisgICAgICAgIH0KKyAgICAgICAgc3RhcnRab29tQW5pbWF0aW9uKGdldFpvb21PdmVydmlld1NjYWxlKCksIHRydWUpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB6b29tVG9SZWFkaW5nTGV2ZWwoKSB7CisgICAgICAgIGZpbmFsIGZsb2F0IHJlYWRpbmdTY2FsZSA9IGdldFJlYWRpbmdMZXZlbFNjYWxlKCk7CisgICAgICAgIGludCBsZWZ0ID0gbVdlYlZpZXcubmF0aXZlR2V0QmxvY2tMZWZ0RWRnZShtQW5jaG9yWCwgbUFuY2hvclksIG1BY3R1YWxTY2FsZSk7CisgICAgICAgIGlmIChsZWZ0ICE9IFdlYlZpZXcuTk9fTEVGVEVER0UpIHsKKyAgICAgICAgICAgIC8vIGFkZCBhIDVwdCBwYWRkaW5nIHRvIHRoZSBsZWZ0IGVkZ2UuCisgICAgICAgICAgICBpbnQgdmlld0xlZnQgPSBtV2ViVmlldy5jb250ZW50VG9WaWV3WChsZWZ0IDwgNSA/IDAgOiAobGVmdCAtIDUpKQorICAgICAgICAgICAgICAgICAgICAtIG1XZWJWaWV3LmdldFNjcm9sbFgoKTsKKyAgICAgICAgICAgIC8vIFJlLWNhbGN1bGF0ZSB0aGUgem9vbSBjZW50ZXIgc28gdGhhdCB0aGUgbmV3IHNjcm9sbCB4IHdpbGwgYmUKKyAgICAgICAgICAgIC8vIG9uIHRoZSBsZWZ0IGVkZ2UuCisgICAgICAgICAgICBpZiAodmlld0xlZnQgPiAwKSB7CisgICAgICAgICAgICAgICAgbVpvb21DZW50ZXJYID0gdmlld0xlZnQgKiByZWFkaW5nU2NhbGUgLyAocmVhZGluZ1NjYWxlIC0gbUFjdHVhbFNjYWxlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbVdlYlZpZXcuc2Nyb2xsQnkodmlld0xlZnQsIDApOworICAgICAgICAgICAgICAgIG1ab29tQ2VudGVyWCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc3RhcnRab29tQW5pbWF0aW9uKHJlYWRpbmdTY2FsZSwgdHJ1ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdXBkYXRlTXVsdGlUb3VjaFN1cHBvcnQoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIC8vIGNoZWNrIHRoZSBwcmVjb25kaXRpb25zCisgICAgICAgIGFzc2VydCBtV2ViVmlldy5nZXRTZXR0aW5ncygpICE9IG51bGw7CisKKyAgICAgICAgV2ViU2V0dGluZ3Mgc2V0dGluZ3MgPSBtV2ViVmlldy5nZXRTZXR0aW5ncygpOworICAgICAgICBtU3VwcG9ydE11bHRpVG91Y2ggPSBjb250ZXh0LmdldFBhY2thZ2VNYW5hZ2VyKCkuaGFzU3lzdGVtRmVhdHVyZSgKKyAgICAgICAgICAgICAgICBQYWNrYWdlTWFuYWdlci5GRUFUVVJFX1RPVUNIU0NSRUVOX01VTFRJVE9VQ0gpCisgICAgICAgICAgICAgICAgJiYgc2V0dGluZ3Muc3VwcG9ydFpvb20oKSAmJiBzZXR0aW5ncy5nZXRCdWlsdEluWm9vbUNvbnRyb2xzKCk7CisgICAgICAgIGlmIChtU3VwcG9ydE11bHRpVG91Y2ggJiYgKG1TY2FsZURldGVjdG9yID09IG51bGwpKSB7CisgICAgICAgICAgICBtU2NhbGVEZXRlY3RvciA9IG5ldyBTY2FsZUdlc3R1cmVEZXRlY3Rvcihjb250ZXh0LCBuZXcgU2NhbGVEZXRlY3Rvckxpc3RlbmVyKCkpOworICAgICAgICB9IGVsc2UgaWYgKCFtU3VwcG9ydE11bHRpVG91Y2ggJiYgKG1TY2FsZURldGVjdG9yICE9IG51bGwpKSB7CisgICAgICAgICAgICBtU2NhbGVEZXRlY3RvciA9IG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c011bHRpVG91Y2hab29tKCkgeworICAgICAgICByZXR1cm4gbVN1cHBvcnRNdWx0aVRvdWNoOworICAgIH0KKworICAgIC8qKgorICAgICAqIE5vdGlmaWVzIHRoZSBjYWxsZXIgdGhhdCB0aGUgWm9vbU1hbmFnZXIgaXMgcmVxdWVzdGluZyB0aGF0IHNjYWxlIHJlbGF0ZWQKKyAgICAgKiB1cGRhdGVzIHNob3VsZCBub3QgYmUgc2VudCB0byB3ZWJraXQuIFRoaXMgY2FuIG9jY3VyIGluIGNhc2VzIHdoZXJlIHRoZQorICAgICAqIFpvb21NYW5hZ2VyIGlzIHBlcmZvcm1pbmcgYW4gYW5pbWF0aW9uIGFuZCBkb2VzIG5vdCB3YW50IHdlYmtpdCB0byB1cGRhdGUKKyAgICAgKiB1bnRpbCB0aGUgYW5pbWF0aW9uIGlzIGNvbXBsZXRlLgorICAgICAqCisgICAgICogQHJldHVybiB0cnVlIGlmIHNjYWxlIHJlbGF0ZWQgdXBkYXRlcyBzaG91bGQgbm90IGJlIHNlbnQgdG8gd2Via2l0IGFuZAorICAgICAqICAgICAgICAgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzUHJldmVudGluZ1dlYmtpdFVwZGF0ZXMoKSB7CisgICAgICAgIC8vIGN1cnJlbnRseSBvbmx5IGFuaW1hdGluZyBhIG11bHRpLXRvdWNoIHpvb20gcHJldmVudHMgdXBkYXRlcywgYnV0CisgICAgICAgIC8vIG90aGVycyBjYW4gYWRkIHRoZWlyIG93biBjb25kaXRpb25zIHRvIHRoaXMgbWV0aG9kIGlmIG5lY2Vzc2FyeS4KKyAgICAgICAgcmV0dXJuIG1QaW5jaFRvWm9vbUFuaW1hdGluZzsKKyAgICB9CisKKyAgICBwdWJsaWMgU2NhbGVHZXN0dXJlRGV0ZWN0b3IgZ2V0TXVsdGlUb3VjaEdlc3R1cmVEZXRlY3RvcigpIHsKKyAgICAgICAgcmV0dXJuIG1TY2FsZURldGVjdG9yOworICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgU2NhbGVEZXRlY3Rvckxpc3RlbmVyIGltcGxlbWVudHMgU2NhbGVHZXN0dXJlRGV0ZWN0b3IuT25TY2FsZUdlc3R1cmVMaXN0ZW5lciB7CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gb25TY2FsZUJlZ2luKFNjYWxlR2VzdHVyZURldGVjdG9yIGRldGVjdG9yKSB7CisgICAgICAgICAgICBkaXNtaXNzWm9vbVBpY2tlcigpOworICAgICAgICAgICAgbVdlYlZpZXcubVZpZXdNYW5hZ2VyLnN0YXJ0Wm9vbSgpOworICAgICAgICAgICAgbVdlYlZpZXcub25QaW5jaFRvWm9vbUFuaW1hdGlvblN0YXJ0KCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIG9uU2NhbGUoU2NhbGVHZXN0dXJlRGV0ZWN0b3IgZGV0ZWN0b3IpIHsKKyAgICAgICAgICAgIGZsb2F0IHNjYWxlID0gTWF0aC5yb3VuZChkZXRlY3Rvci5nZXRTY2FsZUZhY3RvcigpICogbUFjdHVhbFNjYWxlICogMTAwKSAqIDAuMDFmOworICAgICAgICAgICAgaWYgKHdpbGxTY2FsZVRyaWdnZXJab29tKHNjYWxlKSkgeworICAgICAgICAgICAgICAgIG1QaW5jaFRvWm9vbUFuaW1hdGluZyA9IHRydWU7CisgICAgICAgICAgICAgICAgLy8gbGltaXQgdGhlIHNjYWxlIGNoYW5nZSBwZXIgc3RlcAorICAgICAgICAgICAgICAgIGlmIChzY2FsZSA+IG1BY3R1YWxTY2FsZSkgeworICAgICAgICAgICAgICAgICAgICBzY2FsZSA9IE1hdGgubWluKHNjYWxlLCBtQWN0dWFsU2NhbGUgKiAxLjI1Zik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc2NhbGUgPSBNYXRoLm1heChzY2FsZSwgbUFjdHVhbFNjYWxlICogMC44Zik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNldFpvb21DZW50ZXIoZGV0ZWN0b3IuZ2V0Rm9jdXNYKCksIGRldGVjdG9yLmdldEZvY3VzWSgpKTsKKyAgICAgICAgICAgICAgICBzZXRab29tU2NhbGUoc2NhbGUsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICBtV2ViVmlldy5pbnZhbGlkYXRlKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBvblNjYWxlRW5kKFNjYWxlR2VzdHVyZURldGVjdG9yIGRldGVjdG9yKSB7CisgICAgICAgICAgICBpZiAobVBpbmNoVG9ab29tQW5pbWF0aW5nKSB7CisgICAgICAgICAgICAgICAgbVBpbmNoVG9ab29tQW5pbWF0aW5nID0gZmFsc2U7CisgICAgICAgICAgICAgICAgbUFuY2hvclggPSBtV2ViVmlldy52aWV3VG9Db250ZW50WCgoaW50KSBtWm9vbUNlbnRlclggKyBtV2ViVmlldy5nZXRTY3JvbGxYKCkpOworICAgICAgICAgICAgICAgIG1BbmNob3JZID0gbVdlYlZpZXcudmlld1RvQ29udGVudFkoKGludCkgbVpvb21DZW50ZXJZICsgbVdlYlZpZXcuZ2V0U2Nyb2xsWSgpKTsKKyAgICAgICAgICAgICAgICAvLyBkb24ndCByZWZsb3cgd2hlbiB6b29tIGluOyB3aGVuIHpvb20gb3V0LCBkbyByZWZsb3cgaWYgdGhlCisgICAgICAgICAgICAgICAgLy8gbmV3IHNjYWxlIGlzIGFsbW9zdCBtaW5pbXVtIHNjYWxlOworICAgICAgICAgICAgICAgIGJvb2xlYW4gcmVmbG93Tm93ID0gIWNhblpvb21PdXQoKSB8fCAobUFjdHVhbFNjYWxlIDw9IDAuOCAqIG1UZXh0V3JhcFNjYWxlKTsKKyAgICAgICAgICAgICAgICAvLyBmb3JjZSB6b29tIGFmdGVyIG1QcmV2aWV3Wm9vbU9ubHkgaXMgc2V0IHRvIGZhbHNlIHNvIHRoYXQgdGhlCisgICAgICAgICAgICAgICAgLy8gbmV3IHZpZXcgc2l6ZSB3aWxsIGJlIHBhc3NlZCB0byB0aGUgV2ViS2l0CisgICAgICAgICAgICAgICAgcmVmcmVzaFpvb21TY2FsZShyZWZsb3dOb3cpOworICAgICAgICAgICAgICAgIC8vIGNhbGwgaW52YWxpZGF0ZSgpIHRvIGRyYXcgd2l0aG91dCB6b29tIGZpbHRlcgorICAgICAgICAgICAgICAgIG1XZWJWaWV3LmludmFsaWRhdGUoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbVdlYlZpZXcubVZpZXdNYW5hZ2VyLmVuZFpvb20oKTsKKyAgICAgICAgICAgIG1XZWJWaWV3Lm9uUGluY2hUb1pvb21BbmltYXRpb25FbmQoZGV0ZWN0b3IpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb25TaXplQ2hhbmdlZChpbnQgdywgaW50IGgsIGludCBvdywgaW50IG9oKSB7CisgICAgICAgIC8vIHJlc2V0IHpvb20gYW5kIGFuY2hvciB0byB0aGUgdG9wIGxlZnQgY29ybmVyIG9mIHRoZSBzY3JlZW4KKyAgICAgICAgLy8gdW5sZXNzIHdlIGFyZSBhbHJlYWR5IHpvb21pbmcKKyAgICAgICAgaWYgKCFpc0ZpeGVkTGVuZ3RoQW5pbWF0aW9uSW5Qcm9ncmVzcygpKSB7CisgICAgICAgICAgICBpbnQgdmlzaWJsZVRpdGxlSGVpZ2h0ID0gbVdlYlZpZXcuZ2V0VmlzaWJsZVRpdGxlSGVpZ2h0KCk7CisgICAgICAgICAgICBtWm9vbUNlbnRlclggPSAwOworICAgICAgICAgICAgbVpvb21DZW50ZXJZID0gdmlzaWJsZVRpdGxlSGVpZ2h0OworICAgICAgICAgICAgbUFuY2hvclggPSBtV2ViVmlldy52aWV3VG9Db250ZW50WChtV2ViVmlldy5nZXRTY3JvbGxYKCkpOworICAgICAgICAgICAgbUFuY2hvclkgPSBtV2ViVmlldy52aWV3VG9Db250ZW50WSh2aXNpYmxlVGl0bGVIZWlnaHQgKyBtV2ViVmlldy5nZXRTY3JvbGxZKCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gdXBkYXRlIG1NaW5ab29tU2NhbGUgaWYgdGhlIG1pbmltdW0gem9vbSBzY2FsZSBpcyBub3QgZml4ZWQKKyAgICAgICAgaWYgKCFtTWluWm9vbVNjYWxlRml4ZWQpIHsKKyAgICAgICAgICAgIC8vIHdoZW4gY2hhbmdlIGZyb20gbmFycm93IHNjcmVlbiB0byB3aWRlIHNjcmVlbiwgdGhlIG5ldyB2aWV3V2lkdGgKKyAgICAgICAgICAgIC8vIGNhbiBiZSB3aWRlciB0aGFuIHRoZSBvbGQgY29udGVudCB3aWR0aC4gV2UgbGltaXQgdGhlIG1pbmltdW0KKyAgICAgICAgICAgIC8vIHNjYWxlIHRvIDEuMGYuIFRoZSBwcm9wZXIgbWluaW11bSBzY2FsZSB3aWxsIGJlIGNhbGN1bGF0ZWQgd2hlbgorICAgICAgICAgICAgLy8gdGhlIG5ldyBwaWN0dXJlIHNob3dzIHVwLgorICAgICAgICAgICAgbU1pblpvb21TY2FsZSA9IE1hdGgubWluKDEuMGYsIChmbG9hdCkgbVdlYlZpZXcuZ2V0Vmlld1dpZHRoKCkKKyAgICAgICAgICAgICAgICAgICAgLyAobVdlYlZpZXcuZHJhd0hpc3RvcnkoKSA/IG1XZWJWaWV3LmdldEhpc3RvcnlQaWN0dXJlV2lkdGgoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbVpvb21PdmVydmlld1dpZHRoKSk7CisgICAgICAgICAgICAvLyBsaW1pdCB0aGUgbWluWm9vbVNjYWxlIHRvIHRoZSBpbml0aWFsU2NhbGUgaWYgaXQgaXMgc2V0CisgICAgICAgICAgICBpZiAobUluaXRpYWxTY2FsZSA+IDAgJiYgbUluaXRpYWxTY2FsZSA8IG1NaW5ab29tU2NhbGUpIHsKKyAgICAgICAgICAgICAgICBtTWluWm9vbVNjYWxlID0gbUluaXRpYWxTY2FsZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGRpc21pc3Nab29tUGlja2VyKCk7CisKKyAgICAgICAgLy8gb25TaXplQ2hhbmdlZCgpIGlzIGNhbGxlZCBkdXJpbmcgV2ViVmlldyBsYXlvdXQuIEFuZCBhbnkKKyAgICAgICAgLy8gcmVxdWVzdExheW91dCgpIGlzIGJsb2NrZWQgZHVyaW5nIGxheW91dC4gQXMgcmVmcmVzaFpvb21TY2FsZSgpIHdpbGwKKyAgICAgICAgLy8gY2F1c2UgaXRzIGNoaWxkIFZpZXcgdG8gcmVwb3NpdGlvbiBpdHNlbGYgdGhyb3VnaCBWaWV3TWFuYWdlcidzCisgICAgICAgIC8vIHNjYWxlQWxsKCksIHdlIG5lZWQgdG8gcG9zdCBhIFJ1bm5hYmxlIHRvIGVuc3VyZSByZXF1ZXN0TGF5b3V0KCkuCisgICAgICAgIC8vIEFkZGl0aW9uYWxseSwgb25seSB1cGRhdGUgdGhlIHRleHQgd3JhcCBzY2FsZSBpZiB0aGUgd2lkdGggY2hhbmdlZC4KKyAgICAgICAgbVdlYlZpZXcucG9zdChuZXcgUG9zdFNjYWxlKHcgIT0gb3cpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIFBvc3RTY2FsZSBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKKyAgICAgICAgZmluYWwgYm9vbGVhbiBtVXBkYXRlVGV4dFdyYXA7CisKKyAgICAgICAgcHVibGljIFBvc3RTY2FsZShib29sZWFuIHVwZGF0ZVRleHRXcmFwKSB7CisgICAgICAgICAgICBtVXBkYXRlVGV4dFdyYXAgPSB1cGRhdGVUZXh0V3JhcDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgIGlmIChtV2ViVmlldy5nZXRXZWJWaWV3Q29yZSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAvLyB3ZSBhbHdheXMgZm9yY2UsIGluIGNhc2Ugb3VyIGhlaWdodCBjaGFuZ2VkLCBpbiB3aGljaCBjYXNlIHdlCisgICAgICAgICAgICAgICAgLy8gc3RpbGwgd2FudCB0byBzZW5kIHRoZSBub3RpZmljYXRpb24gb3ZlciB0byB3ZWJraXQuCisgICAgICAgICAgICAgICAgc2V0Wm9vbVNjYWxlKE1hdGgubWF4KG1BY3R1YWxTY2FsZSwgZ2V0Wm9vbU92ZXJ2aWV3U2NhbGUoKSksCisgICAgICAgICAgICAgICAgICAgIG1VcGRhdGVUZXh0V3JhcCwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSB6b29tIGJ1dHRvbnMgYXMgdGhlIHNjYWxlIGNhbiBiZSBjaGFuZ2VkCisgICAgICAgICAgICAgICAgdXBkYXRlWm9vbVBpY2tlcigpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdXBkYXRlWm9vbVJhbmdlKFdlYlZpZXdDb3JlLlZpZXdTdGF0ZSB2aWV3U3RhdGUsCisgICAgICAgICAgICBpbnQgdmlld1dpZHRoLCBpbnQgbWluUHJlZldpZHRoKSB7CisgICAgICAgIGlmICh2aWV3U3RhdGUubU1pblNjYWxlID09IDApIHsKKyAgICAgICAgICAgIGlmICh2aWV3U3RhdGUubU1vYmlsZVNpdGUpIHsKKyAgICAgICAgICAgICAgICBpZiAobWluUHJlZldpZHRoID4gTWF0aC5tYXgoMCwgdmlld1dpZHRoKSkgeworICAgICAgICAgICAgICAgICAgICBtTWluWm9vbVNjYWxlID0gKGZsb2F0KSB2aWV3V2lkdGggLyBtaW5QcmVmV2lkdGg7CisgICAgICAgICAgICAgICAgICAgIG1NaW5ab29tU2NhbGVGaXhlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1NaW5ab29tU2NhbGUgPSB2aWV3U3RhdGUubURlZmF1bHRTY2FsZTsKKyAgICAgICAgICAgICAgICAgICAgbU1pblpvb21TY2FsZUZpeGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1NaW5ab29tU2NhbGUgPSBtRGVmYXVsdE1pblpvb21TY2FsZTsKKyAgICAgICAgICAgICAgICBtTWluWm9vbVNjYWxlRml4ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1NaW5ab29tU2NhbGUgPSB2aWV3U3RhdGUubU1pblNjYWxlOworICAgICAgICAgICAgbU1pblpvb21TY2FsZUZpeGVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAodmlld1N0YXRlLm1NYXhTY2FsZSA9PSAwKSB7CisgICAgICAgICAgICBtTWF4Wm9vbVNjYWxlID0gbURlZmF1bHRNYXhab29tU2NhbGU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtTWF4Wm9vbVNjYWxlID0gdmlld1N0YXRlLm1NYXhTY2FsZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFVwZGF0ZXMgem9vbSB2YWx1ZXMgd2hlbiBXZWJraXQgcHJvZHVjZXMgYSBuZXcgcGljdHVyZS4gVGhpcyBtZXRob2QKKyAgICAgKiBzaG91bGQgb25seSBiZSBjYWxsZWQgZnJvbSB0aGUgVUkgdGhyZWFkJ3MgbWVzc2FnZSBoYW5kbGVyLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uTmV3UGljdHVyZShXZWJWaWV3Q29yZS5EcmF3RGF0YSBkcmF3RGF0YSkgeworICAgICAgICBmaW5hbCBpbnQgdmlld1dpZHRoID0gbVdlYlZpZXcuZ2V0Vmlld1dpZHRoKCk7CisKKyAgICAgICAgaWYgKCFtV2ViVmlldy5nZXRTZXR0aW5ncygpLmdldFVzZUZpeGVkVmlld3BvcnQoKQorICAgICAgICAgICAgJiYgbVdlYlZpZXcuZ2V0U2V0dGluZ3MoKS5nZXRVc2VXaWRlVmlld1BvcnQoKSkgeworICAgICAgICAgICAgLy8gbGltaXQgbVpvb21PdmVydmlld1dpZHRoIHVwcGVyIGJvdW5kIHRvCisgICAgICAgICAgICAvLyBzTWF4Vmlld3BvcnRXaWR0aCBzbyB0aGF0IGlmIHRoZSBwYWdlIGRvZXNuJ3QgYmVoYXZlCisgICAgICAgICAgICAvLyB3ZWxsLCB0aGUgV2ViVmlldyB3b24ndCBnbyBpbnNhbmUuIGxpbWl0IHRoZSBsb3dlcgorICAgICAgICAgICAgLy8gYm91bmQgdG8gbWF0Y2ggdGhlIGRlZmF1bHQgc2NhbGUgZm9yIG1vYmlsZSBzaXRlcy4KKyAgICAgICAgICAgIHNldFpvb21PdmVydmlld1dpZHRoKE1hdGgubWluKFdlYlZpZXcuc01heFZpZXdwb3J0V2lkdGgsCisgICAgICAgICAgICAgICAgICAgIE1hdGgubWF4KChpbnQpICh2aWV3V2lkdGggKiBtSW52RGVmYXVsdFNjYWxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRoLm1heChkcmF3RGF0YS5tTWluUHJlZldpZHRoLCBkcmF3RGF0YS5tVmlld1BvaW50LngpKSkpOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgZmxvYXQgem9vbU92ZXJ2aWV3U2NhbGUgPSBnZXRab29tT3ZlcnZpZXdTY2FsZSgpOworICAgICAgICBpZiAoIW1NaW5ab29tU2NhbGVGaXhlZCkgeworICAgICAgICAgICAgbU1pblpvb21TY2FsZSA9IHpvb21PdmVydmlld1NjYWxlOworICAgICAgICB9CisgICAgICAgIC8vIGZpdCB0aGUgY29udGVudCB3aWR0aCB0byB0aGUgY3VycmVudCB2aWV3LiBJZ25vcmUgdGhlIHJvdW5kaW5nIGVycm9yIGNhc2UuCisgICAgICAgIGlmICghbVdlYlZpZXcuZHJhd0hpc3RvcnkoKSAmJiAobUluaXRpYWxab29tT3ZlcnZpZXcgfHwgKG1Jblpvb21PdmVydmlldworICAgICAgICAgICAgICAgICYmIE1hdGguYWJzKCh2aWV3V2lkdGggKiBtSW52QWN0dWFsU2NhbGUpIC0gbVpvb21PdmVydmlld1dpZHRoKSA+IDEpKSkgeworICAgICAgICAgICAgbUluaXRpYWxab29tT3ZlcnZpZXcgPSBmYWxzZTsKKyAgICAgICAgICAgIHNldFpvb21TY2FsZSh6b29tT3ZlcnZpZXdTY2FsZSwgIXdpbGxTY2FsZVRyaWdnZXJab29tKG1UZXh0V3JhcFNjYWxlKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVcGRhdGVzIHpvb20gdmFsdWVzIGFmdGVyIFdlYmtpdCBjb21wbGV0ZXMgdGhlIGluaXRpYWwgcGFnZSBsYXlvdXQuIEl0CisgICAgICogaXMgY2FsbGVkIHdoZW4gdmlzaXRpbmcgYSBwYWdlIGZvciB0aGUgZmlyc3QgdGltZSBhcyB3ZWxsIGFzIHdoZW4gdGhlCisgICAgICogdXNlciBuYXZpZ2F0ZXMgYmFjayB0byBhIHBhZ2UgKGluIHdoaWNoIGNhc2Ugd2UgbWF5IG5lZWQgdG8gcmVzdG9yZSB0aGUKKyAgICAgKiB6b29tIGxldmVscyB0byB0aGUgc3RhdGUgdGhleSB3ZXJlIHdoZW4geW91IGxlZnQgdGhlIHBhZ2UpLiBUaGlzIG1ldGhvZAorICAgICAqIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBmcm9tIHRoZSBVSSB0aHJlYWQncyBtZXNzYWdlIGhhbmRsZXIuCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25GaXJzdExheW91dChXZWJWaWV3Q29yZS5EcmF3RGF0YSBkcmF3RGF0YSkgeworICAgICAgICAvLyBwcmVjb25kaXRpb24gY2hlY2sKKyAgICAgICAgYXNzZXJ0IGRyYXdEYXRhICE9IG51bGw7CisgICAgICAgIGFzc2VydCBkcmF3RGF0YS5tVmlld1N0YXRlICE9IG51bGw7CisgICAgICAgIGFzc2VydCBtV2ViVmlldy5nZXRTZXR0aW5ncygpICE9IG51bGw7CisKKyAgICAgICAgV2ViVmlld0NvcmUuVmlld1N0YXRlIHZpZXdTdGF0ZSA9IGRyYXdEYXRhLm1WaWV3U3RhdGU7CisgICAgICAgIGZpbmFsIFBvaW50IHZpZXdTaXplID0gZHJhd0RhdGEubVZpZXdQb2ludDsKKyAgICAgICAgdXBkYXRlWm9vbVJhbmdlKHZpZXdTdGF0ZSwgdmlld1NpemUueCwgZHJhd0RhdGEubU1pblByZWZXaWR0aCk7CisKKyAgICAgICAgaWYgKCFtV2ViVmlldy5kcmF3SGlzdG9yeSgpKSB7CisgICAgICAgICAgICBmaW5hbCBmbG9hdCBzY2FsZTsKKyAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gcmVmbG93VGV4dDsKKworICAgICAgICAgICAgaWYgKG1Jbml0aWFsU2NhbGUgPiAwKSB7CisgICAgICAgICAgICAgICAgc2NhbGUgPSBtSW5pdGlhbFNjYWxlOworICAgICAgICAgICAgICAgIHJlZmxvd1RleHQgPSBleGNlZWRzTWluU2NhbGVJbmNyZW1lbnQobVRleHRXcmFwU2NhbGUsIHNjYWxlKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodmlld1N0YXRlLm1WaWV3U2NhbGUgPiAwKSB7CisgICAgICAgICAgICAgICAgbVRleHRXcmFwU2NhbGUgPSB2aWV3U3RhdGUubVRleHRXcmFwU2NhbGU7CisgICAgICAgICAgICAgICAgc2NhbGUgPSB2aWV3U3RhdGUubVZpZXdTY2FsZTsKKyAgICAgICAgICAgICAgICByZWZsb3dUZXh0ID0gZmFsc2U7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFdlYlNldHRpbmdzIHNldHRpbmdzID0gbVdlYlZpZXcuZ2V0U2V0dGluZ3MoKTsKKyAgICAgICAgICAgICAgICBpZiAoc2V0dGluZ3MuZ2V0VXNlV2lkZVZpZXdQb3J0KCkKKyAgICAgICAgICAgICAgICAgICAgJiYgKHNldHRpbmdzLmdldExvYWRXaXRoT3ZlcnZpZXdNb2RlKCkgfHwgc2V0dGluZ3MuZ2V0VXNlRml4ZWRWaWV3cG9ydCgpKSkgeworICAgICAgICAgICAgICAgICAgICBtSW5pdGlhbFpvb21PdmVydmlldyA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIHNjYWxlID0gKGZsb2F0KSBtV2ViVmlldy5nZXRWaWV3V2lkdGgoKSAvIFdlYlZpZXcuREVGQVVMVF9WSUVXUE9SVF9XSURUSDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzY2FsZSA9IHZpZXdTdGF0ZS5tVGV4dFdyYXBTY2FsZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmVmbG93VGV4dCA9IGV4Y2VlZHNNaW5TY2FsZUluY3JlbWVudChtVGV4dFdyYXBTY2FsZSwgc2NhbGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0Wm9vbVNjYWxlKHNjYWxlLCByZWZsb3dUZXh0KTsKKworICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSB6b29tIGJ1dHRvbnMgYXMgdGhlIHNjYWxlIGNhbiBiZSBjaGFuZ2VkCisgICAgICAgICAgICB1cGRhdGVab29tUGlja2VyKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzYXZlWm9vbVN0YXRlKEJ1bmRsZSBiKSB7CisgICAgICAgIGIucHV0RmxvYXQoInNjYWxlIiwgbUFjdHVhbFNjYWxlKTsKKyAgICAgICAgYi5wdXRGbG9hdCgidGV4dHdyYXBTY2FsZSIsIG1UZXh0V3JhcFNjYWxlKTsKKyAgICAgICAgYi5wdXRCb29sZWFuKCJvdmVydmlldyIsIG1Jblpvb21PdmVydmlldyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVzdG9yZVpvb21TdGF0ZShCdW5kbGUgYikgeworICAgICAgICAvLyBhcyBnZXRXaWR0aCgpIC8gZ2V0SGVpZ2h0KCkgb2YgdGhlIHZpZXcgYXJlIG5vdCBhdmFpbGFibGUgeWV0LCBzZXQgdXAKKyAgICAgICAgLy8gbUFjdHVhbFNjYWxlLCBzbyB0aGF0IHdoZW4gb25TaXplQ2hhbmdlZCgpIGlzIGNhbGxlZCwgdGhlIHJlc3Qgd2lsbAorICAgICAgICAvLyBiZSBzZXQgY29ycmVjdGx5CisgICAgICAgIG1BY3R1YWxTY2FsZSA9IGIuZ2V0RmxvYXQoInNjYWxlIiwgMS4wZik7CisgICAgICAgIG1JbnZBY3R1YWxTY2FsZSA9IDEgLyBtQWN0dWFsU2NhbGU7CisgICAgICAgIG1UZXh0V3JhcFNjYWxlID0gYi5nZXRGbG9hdCgidGV4dHdyYXBTY2FsZSIsIG1BY3R1YWxTY2FsZSk7CisgICAgICAgIG1Jblpvb21PdmVydmlldyA9IGIuZ2V0Qm9vbGVhbigib3ZlcnZpZXciKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFpvb21Db250cm9sQmFzZSBnZXRDdXJyZW50Wm9vbUNvbnRyb2woKSB7CisgICAgICAgIGlmIChtV2ViVmlldy5nZXRTZXR0aW5ncygpICE9IG51bGwgJiYgbVdlYlZpZXcuZ2V0U2V0dGluZ3MoKS5zdXBwb3J0Wm9vbSgpKSB7CisgICAgICAgICAgICBpZiAobVdlYlZpZXcuZ2V0U2V0dGluZ3MoKS5nZXRCdWlsdEluWm9vbUNvbnRyb2xzKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAobUVtYmVkZGVkWm9vbUNvbnRyb2wgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBtRW1iZWRkZWRab29tQ29udHJvbCA9IG5ldyBab29tQ29udHJvbEVtYmVkZGVkKHRoaXMsIG1XZWJWaWV3KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIG1FbWJlZGRlZFpvb21Db250cm9sOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAobUV4dGVybmFsWm9vbUNvbnRyb2wgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBtRXh0ZXJuYWxab29tQ29udHJvbCA9IG5ldyBab29tQ29udHJvbEV4dGVybmFsKG1XZWJWaWV3KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIG1FeHRlcm5hbFpvb21Db250cm9sOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGludm9rZVpvb21QaWNrZXIoKSB7CisgICAgICAgIFpvb21Db250cm9sQmFzZSBjb250cm9sID0gZ2V0Q3VycmVudFpvb21Db250cm9sKCk7CisgICAgICAgIGlmIChjb250cm9sICE9IG51bGwpIHsKKyAgICAgICAgICAgIGNvbnRyb2wuc2hvdygpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZGlzbWlzc1pvb21QaWNrZXIoKSB7CisgICAgICAgIFpvb21Db250cm9sQmFzZSBjb250cm9sID0gZ2V0Q3VycmVudFpvb21Db250cm9sKCk7CisgICAgICAgIGlmIChjb250cm9sICE9IG51bGwpIHsKKyAgICAgICAgICAgIGNvbnRyb2wuaGlkZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNab29tUGlja2VyVmlzaWJsZSgpIHsKKyAgICAgICAgWm9vbUNvbnRyb2xCYXNlIGNvbnRyb2wgPSBnZXRDdXJyZW50Wm9vbUNvbnRyb2woKTsKKyAgICAgICAgcmV0dXJuIChjb250cm9sICE9IG51bGwpID8gY29udHJvbC5pc1Zpc2libGUoKSA6IGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHVwZGF0ZVpvb21QaWNrZXIoKSB7CisgICAgICAgIFpvb21Db250cm9sQmFzZSBjb250cm9sID0gZ2V0Q3VycmVudFpvb21Db250cm9sKCk7CisgICAgICAgIGlmIChjb250cm9sICE9IG51bGwpIHsKKyAgICAgICAgICAgIGNvbnRyb2wudXBkYXRlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgZW1iZWRkZWQgem9vbSBjb250cm9sIGludGVyY2VwdHMgdG91Y2ggZXZlbnRzIGFuZCBhdXRvbWF0aWNhbGx5IHN0YXlzCisgICAgICogdmlzaWJsZS4gVGhlIGV4dGVybmFsIGNvbnRyb2wgbmVlZHMgdG8gY29uc3RhbnRseSByZWZyZXNoIGl0cyBpbnRlcm5hbAorICAgICAqIHRpbWVyIHRvIHN0YXkgdmlzaWJsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBrZWVwWm9vbVBpY2tlclZpc2libGUoKSB7CisgICAgICAgIFpvb21Db250cm9sQmFzZSBjb250cm9sID0gZ2V0Q3VycmVudFpvb21Db250cm9sKCk7CisgICAgICAgIGlmIChjb250cm9sICE9IG51bGwgJiYgY29udHJvbCA9PSBtRXh0ZXJuYWxab29tQ29udHJvbCkgeworICAgICAgICAgICAgY29udHJvbC5zaG93KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgVmlldyBnZXRFeHRlcm5hbFpvb21QaWNrZXIoKSB7CisgICAgICAgIFpvb21Db250cm9sQmFzZSBjb250cm9sID0gZ2V0Q3VycmVudFpvb21Db250cm9sKCk7CisgICAgICAgIGlmIChjb250cm9sICE9IG51bGwgJiYgY29udHJvbCA9PSBtRXh0ZXJuYWxab29tQ29udHJvbCkgeworICAgICAgICAgICAgcmV0dXJuIG1FeHRlcm5hbFpvb21Db250cm9sLmdldENvbnRyb2xzKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYnJ1bnRpbWUvV2ViUnVudGltZUFjdGl2aXR5LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJydW50aW1lL1dlYlJ1bnRpbWVBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjOGM2MGMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJydW50aW1lL1dlYlJ1bnRpbWVBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsMjA0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLndlYnJ1bnRpbWU7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5BY3Rpdml0eUluZm87CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93OworaW1wb3J0IGFuZHJvaWQud2Via2l0Lkdlb2xvY2F0aW9uUGVybWlzc2lvbnM7CitpbXBvcnQgYW5kcm9pZC53ZWJraXQuV2ViQ2hyb21lQ2xpZW50OworaW1wb3J0IGFuZHJvaWQud2Via2l0LldlYlZpZXc7CitpbXBvcnQgYW5kcm9pZC53ZWJraXQuV2ViVmlld0NsaWVudDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVG9hc3Q7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SOworCitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKKworLyoqCisgKiBUaGUgcnVudGltZSB1c2VkIHRvIGRpc3BsYXkgaW5zdGFsbGVkIHdlYiBhcHBsaWNhdGlvbnMuCisgKiBAaGlkZQorICovCitwdWJsaWMgY2xhc3MgV2ViUnVudGltZUFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkKK3sKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgTE9HVEFHID0gIldlYlJ1bnRpbWVBY3Rpdml0eSI7CisKKyAgICBwcml2YXRlIFdlYlZpZXcgbVdlYlZpZXc7CisgICAgcHJpdmF0ZSBVUkwgbUJhc2VVcmw7CisgICAgcHJpdmF0ZSBJbWFnZVZpZXcgbVNwbGFzaFNjcmVlbjsKKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU2Vuc2l0aXZlRmVhdHVyZXMgeworICAgICAgICAvLyBBbGwgb2YgdGhlIHNlbnNpdGl2ZSBmZWF0dXJlcworICAgICAgICBwcml2YXRlIGJvb2xlYW4gbUdlb2xvY2F0aW9uOworICAgICAgICAvLyBPbiBBbmRyb2lkLCB0aGUgQnJvd3NlciBkb2Vzbid0IHByb21wdCBmb3IgZGF0YWJhc2UgYWNjZXNzLCBzbyB3ZSBkb24ndCByZXF1aXJlIGFuCisgICAgICAgIC8vIGV4cGxpY2l0IHBlcm1pc3Npb24gaGVyZSBpbiB0aGUgV2ViUnVudGltZUFjdGl2aXR5LCBhbmQgdGhlcmUncyBubyBBbmRyb2lkIHN5c3RlbQorICAgICAgICAvLyBwZXJtaXNzaW9uIHJlcXVpcmVkIGZvciBpdCBlaXRoZXIuCisgICAgICAgIC8vcHJpdmF0ZSBib29sZWFuIG1EYXRhYmFzZTsKKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBnZXRHZW9sb2NhdGlvbigpIHsKKyAgICAgICAgICAgIHJldHVybiBtR2VvbG9jYXRpb247CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIHZvaWQgc2V0R2VvbG9jYXRpb24oYm9vbGVhbiBnZW9sb2NhdGlvbikgeworICAgICAgICAgICAgbUdlb2xvY2F0aW9uID0gZ2VvbG9jYXRpb247CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiogQ2FsbGVkIHdoZW4gdGhlIGFjdGl2aXR5IGlzIGZpcnN0IGNyZWF0ZWQuICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkKKyAgICB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisKKyAgICAgICAgLy8gQ2FuJ3QgZ2V0IG1ldGEgZGF0YSB1c2luZyBnZXRBcHBsaWNhdGlvbkluZm8oKSBhcyBpdCBkb2Vzbid0IHBhc3MgR0VUX01FVEFfREFUQQorICAgICAgICBQYWNrYWdlTWFuYWdlciBwYWNrYWdlTWFuYWdlciA9IGdldFBhY2thZ2VNYW5hZ2VyKCk7CisgICAgICAgIENvbXBvbmVudE5hbWUgY29tcG9uZW50TmFtZSA9IG5ldyBDb21wb25lbnROYW1lKHRoaXMsIGdldENsYXNzKCkpOworICAgICAgICBBY3Rpdml0eUluZm8gYWN0aXZpdHlJbmZvID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGFjdGl2aXR5SW5mbyA9IHBhY2thZ2VNYW5hZ2VyLmdldEFjdGl2aXR5SW5mbyhjb21wb25lbnROYW1lLCBQYWNrYWdlTWFuYWdlci5HRVRfTUVUQV9EQVRBKTsKKyAgICAgICAgfSBjYXRjaCAoUGFja2FnZU1hbmFnZXIuTmFtZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5kKExPR1RBRywgIkZhaWxlZCB0byBmaW5kIGNvbXBvbmVudCIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmIChhY3Rpdml0eUluZm8gPT0gbnVsbCkgeworICAgICAgICAgICAgTG9nLmQoTE9HVEFHLCAiRmFpbGVkIHRvIGdldCBhY3Rpdml0eSBpbmZvIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBCdW5kbGUgbWV0YURhdGEgPSBhY3Rpdml0eUluZm8ubWV0YURhdGE7CisgICAgICAgIGlmIChtZXRhRGF0YSA9PSBudWxsKSB7CisgICAgICAgICAgICBMb2cuZChMT0dUQUcsICJObyBtZXRhIGRhdGEiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyB1cmwgPSBtZXRhRGF0YS5nZXRTdHJpbmcoImFuZHJvaWQud2VicnVudGltZS51cmwiKTsKKyAgICAgICAgaWYgKHVybCA9PSBudWxsKSB7CisgICAgICAgICAgICBMb2cuZChMT0dUQUcsICJObyBVUkwiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtQmFzZVVybCA9IG5ldyBVUkwodXJsKTsKKyAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5kKExPR1RBRywgIkludmFsaWQgVVJMIik7CisgICAgICAgIH0KKworICAgICAgICAvLyBBbGwgZmFsc2UgYnkgZGVmYXVsdCwgYW5kIHJlYWRpbmcgbm9uLWV4aXN0ZW50IGJ1bmRsZSBwcm9wZXJ0aWVzIGdpdmVzIGZhbHNlIHRvby4KKyAgICAgICAgZmluYWwgU2Vuc2l0aXZlRmVhdHVyZXMgc2Vuc2l0aXZlRmVhdHVyZXMgPSBuZXcgU2Vuc2l0aXZlRmVhdHVyZXMoKTsKKyAgICAgICAgc2Vuc2l0aXZlRmVhdHVyZXMuc2V0R2VvbG9jYXRpb24obWV0YURhdGEuZ2V0Qm9vbGVhbigiYW5kcm9pZC53ZWJydW50aW1lLlNlbnNpdGl2ZUZlYXR1cmVzR2VvbG9jYXRpb24iKSk7CisKKyAgICAgICAgZ2V0V2luZG93KCkucmVxdWVzdEZlYXR1cmUoV2luZG93LkZFQVRVUkVfTk9fVElUTEUpOworICAgICAgICBzZXRDb250ZW50VmlldyhSLmxheW91dC53ZWJfcnVudGltZSk7CisgICAgICAgIG1XZWJWaWV3ID0gKFdlYlZpZXcpIGZpbmRWaWV3QnlJZChSLmlkLndlYnZpZXcpOworICAgICAgICBtU3BsYXNoU2NyZWVuID0gKEltYWdlVmlldykgZmluZFZpZXdCeUlkKFIuaWQuc3BsYXNoc2NyZWVuKTsKKyAgICAgICAgbVNwbGFzaFNjcmVlbi5zZXRJbWFnZVJlc291cmNlKAorICAgICAgICAgICAgICAgIGdldFJlc291cmNlcygpLmdldElkZW50aWZpZXIoInNwbGFzaF9zY3JlZW4iLCAiZHJhd2FibGUiLCBnZXRQYWNrYWdlTmFtZSgpKSk7CisgICAgICAgIG1XZWJWaWV3LmdldFNldHRpbmdzKCkuc2V0SmF2YVNjcmlwdEVuYWJsZWQodHJ1ZSk7CisgICAgICAgIG1XZWJWaWV3LnNldFdlYlZpZXdDbGllbnQobmV3IFdlYlZpZXdDbGllbnQoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIHNob3VsZE92ZXJyaWRlVXJsTG9hZGluZyhXZWJWaWV3IHZpZXcsIFN0cmluZyB1cmwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBVUkwgbmV3T3JpZ2luID0gbmV3IFVSTCh1cmwpOworICAgICAgICAgICAgICAgICAgICBpZiAoYXJlU2FtZU9yaWdpbihtQmFzZVVybCwgbmV3T3JpZ2luKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgc2ltcGxlIHNhbWUgb3JpZ2luIHRlc3QgcGFzc2VzLCBsb2FkIGluIHRoZSB3ZWJ2aWV3LgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBjYXRjaChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAvLyBEb24ndCBsb2FkIGFueXRoaW5nIGlmIHRoaXMgd2Fzbid0IGEgcHJvcGVyIFVSTC4KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlIHRoaXMgaXMgYSBVUkwgdGhhdCBpcyBub3Qgc2FtZSBvcmlnaW4gc28gcGFzcyBpdCB0byB0aGUKKyAgICAgICAgICAgICAgICAvLyBCcm93c2VyIHRvIGxvYWQuCisgICAgICAgICAgICAgICAgc3RhcnRBY3Rpdml0eShuZXcgSW50ZW50KEludGVudC5BQ1RJT05fVklFVywgVXJpLnBhcnNlKHVybCkpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblBhZ2VGaW5pc2hlZChXZWJWaWV3IHZpZXcsIFN0cmluZyB1cmwpIHsKKyAgICAgICAgICAgICAgICBpZiAobVNwbGFzaFNjcmVlbiAhPSBudWxsICYmIG1TcGxhc2hTY3JlZW4uZ2V0VmlzaWJpbGl0eSgpID09IFZpZXcuVklTSUJMRSkgeworICAgICAgICAgICAgICAgICAgICBtU3BsYXNoU2NyZWVuLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICAgICAgICAgICAgICAgICAgbVNwbGFzaFNjcmVlbiA9IG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICAvLyBVc2UgYSBjdXN0b20gV2ViQ2hyb21lQ2xpZW50IHdpdGggZ2VvbG9jYXRpb24gcGVybWlzc2lvbnMgaGFuZGxpbmcuCisgICAgICAgIG1XZWJWaWV3LnNldFdlYkNocm9tZUNsaWVudChuZXcgV2ViQ2hyb21lQ2xpZW50KCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgb25HZW9sb2NhdGlvblBlcm1pc3Npb25zU2hvd1Byb21wdCgKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBvcmlnaW4sIEdlb2xvY2F0aW9uUGVybWlzc2lvbnMuQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICAgICAgICAgICAgICAvLyBBbGxvdyB0aGlzIG9yaWdpbiBpZiBpdCBoYXMgR2VvbG9jYXRpb24gcGVybWlzc2lvbnMsIG90aGVyd2lzZSBkZW55LgorICAgICAgICAgICAgICAgIGJvb2xlYW4gYWxsb3dlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGlmIChzZW5zaXRpdmVGZWF0dXJlcy5nZXRHZW9sb2NhdGlvbigpKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBVUkwgb3JpZ2luVXJsID0gbmV3IFVSTChvcmlnaW4pOworICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dlZCA9IGFyZVNhbWVPcmlnaW4obUJhc2VVcmwsIG9yaWdpblVybCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2goTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYWxsYmFjay5pbnZva2Uob3JpZ2luLCBhbGxvd2VkLCBmYWxzZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgICAgIC8vIFNldCB0aGUgREIgbG9jYXRpb24uIE9wdGlvbmFsLiBHZW9sb2NhdGlvbiB3b3JrcyB3aXRob3V0IERCcy4KKyAgICAgICAgbVdlYlZpZXcuZ2V0U2V0dGluZ3MoKS5zZXRHZW9sb2NhdGlvbkRhdGFiYXNlUGF0aCgKKyAgICAgICAgICAgICAgICBnZXREaXIoImdlb2xvY2F0aW9uIiwgTU9ERV9QUklWQVRFKS5nZXRQYXRoKCkpOworCisgICAgICAgIFN0cmluZyB0aXRsZSA9IG1ldGFEYXRhLmdldFN0cmluZygiYW5kcm9pZC53ZWJydW50aW1lLnRpdGxlIik7CisgICAgICAgIC8vIFdlIHR1cm5lZCBvZmYgdGhlIHRpdGxlIGJhciB0byBnbyBmdWxsIHNjcmVlbiBzbyBkaXNwbGF5IHRoZQorICAgICAgICAvLyB3ZWJhcHAncyB0aXRsZSBhcyBhIHRvYXN0LgorICAgICAgICBpZiAodGl0bGUgIT0gbnVsbCkgeworICAgICAgICAgICAgVG9hc3QubWFrZVRleHQodGhpcywgdGl0bGUsIFRvYXN0LkxFTkdUSF9TSE9SVCkuc2hvdygpOworICAgICAgICB9CisKKyAgICAgICAgLy8gTG9hZCB0aGUgd2ViYXBwJ3MgYmFzZSBVUkwuCisgICAgICAgIG1XZWJWaWV3LmxvYWRVcmwodXJsKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBvbktleURvd24oaW50IGtleUNvZGUsIEtleUV2ZW50IGV2ZW50KSB7CisgICAgICAgIGlmIChrZXlDb2RlID09IEtleUV2ZW50LktFWUNPREVfQkFDSyAmJiBtV2ViVmlldy5jYW5Hb0JhY2soKSkgeworICAgICAgICAgICAgbVdlYlZpZXcuZ29CYWNrKCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3VwZXIub25LZXlEb3duKGtleUNvZGUsIGV2ZW50KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBvbkNyZWF0ZU9wdGlvbnNNZW51KE1lbnUgbWVudSkgeworICAgICAgICBtZW51LmFkZCgwLCAwLCAwLCAiTWVudSBpdGVtIDEiKTsKKyAgICAgICAgbWVudS5hZGQoMCwgMSwgMCwgIk1lbnUgaXRlbSAyIik7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gYXJlU2FtZU9yaWdpbihVUkwgYSwgVVJMIGIpIHsKKyAgICAgICAgaW50IGFQb3J0ID0gYS5nZXRQb3J0KCkgPT0gLTEgPyBhLmdldERlZmF1bHRQb3J0KCkgOiBhLmdldFBvcnQoKTsKKyAgICAgICAgaW50IGJQb3J0ID0gYi5nZXRQb3J0KCkgPT0gLTEgPyBiLmdldERlZmF1bHRQb3J0KCkgOiBiLmdldFBvcnQoKTsKKyAgICAgICAgcmV0dXJuIGEuZ2V0UHJvdG9jb2woKS5lcXVhbHMoYi5nZXRQcm90b2NvbCgpKSAmJiBhUG9ydCA9PSBiUG9ydCAmJiBhLmdldEhvc3QoKS5lcXVhbHMoYi5nZXRIb3N0KCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9BYnNMaXN0Vmlldy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0Fic0xpc3RWaWV3LmphdmEKaW5kZXggYzk3MGFlNi4uYzE1NWRkYSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0Fic0xpc3RWaWV3LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0Fic0xpc3RWaWV3LmphdmEKQEAgLTE5LDYgKzE5LDcgQEAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SOwogCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OwpAQCAtMzMsMTAgKzM0LDE2IEBACiBpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRXYXRjaGVyOwogaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9uZ1NwYXJzZUFycmF5OworaW1wb3J0IGFuZHJvaWQudXRpbC5TcGFyc2VCb29sZWFuQXJyYXk7CitpbXBvcnQgYW5kcm9pZC52aWV3LkFjdGlvbk1vZGU7CitpbXBvcnQgYW5kcm9pZC52aWV3LkNvbnRleHRNZW51LkNvbnRleHRNZW51SW5mbzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuR3Jhdml0eTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuSGFwdGljRmVlZGJhY2tDb25zdGFudHM7CiBpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OwogaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUl0ZW07CiBpbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OwogaW1wb3J0IGFuZHJvaWQudmlldy5WZWxvY2l0eVRyYWNrZXI7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CkBAIC00NCw3ICs1MSw2IEBACiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdEZWJ1ZzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3VHJlZU9ic2VydmVyOwotaW1wb3J0IGFuZHJvaWQudmlldy5Db250ZXh0TWVudS5Db250ZXh0TWVudUluZm87CiBpbXBvcnQgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLkJhc2VJbnB1dENvbm5lY3Rpb247CiBpbXBvcnQgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLkVkaXRvckluZm87CiBpbXBvcnQgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLklucHV0Q29ubmVjdGlvbjsKQEAgLTY4LDEwICs3NCwxMiBAQAogICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjQWJzTGlzdFZpZXdfY2FjaGVDb2xvckhpbnQKICAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0Fic0xpc3RWaWV3X2Zhc3RTY3JvbGxFbmFibGVkCiAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNBYnNMaXN0Vmlld19zbW9vdGhTY3JvbGxiYXIKKyAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0Fic0xpc3RWaWV3X2Nob2ljZU1vZGUKICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIEFic0xpc3RWaWV3IGV4dGVuZHMgQWRhcHRlclZpZXc8TGlzdEFkYXB0ZXI+IGltcGxlbWVudHMgVGV4dFdhdGNoZXIsCiAgICAgICAgIFZpZXdUcmVlT2JzZXJ2ZXIuT25HbG9iYWxMYXlvdXRMaXN0ZW5lciwgRmlsdGVyLkZpbHRlckxpc3RlbmVyLAotICAgICAgICBWaWV3VHJlZU9ic2VydmVyLk9uVG91Y2hNb2RlQ2hhbmdlTGlzdGVuZXIgeworICAgICAgICBWaWV3VHJlZU9ic2VydmVyLk9uVG91Y2hNb2RlQ2hhbmdlTGlzdGVuZXIsCisgICAgICAgIFJlbW90ZVZpZXdzQWRhcHRlci5SZW1vdGVBZGFwdGVyQ29ubmVjdGlvbkNhbGxiYWNrIHsKIAogICAgIC8qKgogICAgICAqIERpc2FibGVzIHRoZSB0cmFuc2NyaXB0IG1vZGUuCkBAIC0xNjUsNiArMTczLDU3IEBACiAgICAgc3RhdGljIGZpbmFsIGludCBMQVlPVVRfTU9WRV9TRUxFQ1RJT04gPSA2OwogCiAgICAgLyoqCisgICAgICogTm9ybWFsIGxpc3QgdGhhdCBkb2VzIG5vdCBpbmRpY2F0ZSBjaG9pY2VzCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0hPSUNFX01PREVfTk9ORSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbGlzdCBhbGxvd3MgdXAgdG8gb25lIGNob2ljZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENIT0lDRV9NT0RFX1NJTkdMRSA9IDE7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbGlzdCBhbGxvd3MgbXVsdGlwbGUgY2hvaWNlcworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENIT0lDRV9NT0RFX01VTFRJUExFID0gMjsKKworICAgIC8qKgorICAgICAqIFRoZSBsaXN0IGFsbG93cyBtdWx0aXBsZSBjaG9pY2VzIGluIGEgbW9kYWwgc2VsZWN0aW9uIG1vZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDSE9JQ0VfTU9ERV9NVUxUSVBMRV9NT0RBTCA9IDM7CisKKyAgICAvKioKKyAgICAgKiBDb250cm9scyBpZi9ob3cgdGhlIHVzZXIgbWF5IGNob29zZS9jaGVjayBpdGVtcyBpbiB0aGUgbGlzdAorICAgICAqLworICAgIGludCBtQ2hvaWNlTW9kZSA9IENIT0lDRV9NT0RFX05PTkU7CisKKyAgICAvKioKKyAgICAgKiBDb250cm9scyBDSE9JQ0VfTU9ERV9NVUxUSVBMRV9NT0RBTC4gbnVsbCB3aGVuIGluYWN0aXZlLgorICAgICAqLworICAgIEFjdGlvbk1vZGUgbUNob2ljZUFjdGlvbk1vZGU7CisKKyAgICAvKioKKyAgICAgKiBXcmFwcGVyIGZvciB0aGUgbXVsdGlwbGUgY2hvaWNlIG1vZGUgY2FsbGJhY2s7IEFic0xpc3RWaWV3IG5lZWRzIHRvIHBlcmZvcm0KKyAgICAgKiBhIGZldyBleHRyYSBhY3Rpb25zIGFyb3VuZCB3aGF0IGFwcGxpY2F0aW9uIGNvZGUgZG9lcy4KKyAgICAgKi8KKyAgICBNdWx0aUNob2ljZU1vZGVXcmFwcGVyIG1NdWx0aUNob2ljZU1vZGVDYWxsYmFjazsKKworICAgIC8qKgorICAgICAqIFJ1bm5pbmcgY291bnQgb2YgaG93IG1hbnkgaXRlbXMgYXJlIGN1cnJlbnRseSBjaGVja2VkCisgICAgICovCisgICAgaW50IG1DaGVja2VkSXRlbUNvdW50OworCisgICAgLyoqCisgICAgICogUnVubmluZyBzdGF0ZSBvZiB3aGljaCBwb3NpdGlvbnMgYXJlIGN1cnJlbnRseSBjaGVja2VkCisgICAgICovCisgICAgU3BhcnNlQm9vbGVhbkFycmF5IG1DaGVja1N0YXRlczsKKworICAgIC8qKgorICAgICAqIFJ1bm5pbmcgc3RhdGUgb2Ygd2hpY2ggSURzIGFyZSBjdXJyZW50bHkgY2hlY2tlZAorICAgICAqLworICAgIExvbmdTcGFyc2VBcnJheTxCb29sZWFuPiBtQ2hlY2tlZElkU3RhdGVzOworCisgICAgLyoqCiAgICAgICogQ29udHJvbHMgaG93IHRoZSBuZXh0IGxheW91dCB3aWxsIGhhcHBlbgogICAgICAqLwogICAgIGludCBtTGF5b3V0TW9kZSA9IExBWU9VVF9OT1JNQUw7CkBAIC0xODAsNiArMjM5LDExIEBACiAgICAgTGlzdEFkYXB0ZXIgbUFkYXB0ZXI7CiAKICAgICAvKioKKyAgICAgKiBUaGUgcmVtb3RlIGFkYXB0ZXIgY29udGFpbmluZyB0aGUgZGF0YSB0byBiZSBkaXNwbGF5ZWQgYnkgdGhpcyB2aWV3IHRvIGJlIHNldAorICAgICAqLworICAgIHByaXZhdGUgUmVtb3RlVmlld3NBZGFwdGVyIG1SZW1vdGVBZGFwdGVyOworCisgICAgLyoqCiAgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGxpc3Qgc2VsZWN0b3Igc2hvdWxkIGJlIGRyYXduIG9uIHRvcCBvZiB0aGUgY2hpbGRyZW4gb3IgYmVoaW5kCiAgICAgICovCiAgICAgYm9vbGVhbiBtRHJhd1NlbGVjdG9yT25Ub3AgPSBmYWxzZTsKQEAgLTU1OSw2ICs2MjMsMTggQEAKIAogICAgICAgICBib29sZWFuIHNtb290aFNjcm9sbGJhciA9IGEuZ2V0Qm9vbGVhbihSLnN0eWxlYWJsZS5BYnNMaXN0Vmlld19zbW9vdGhTY3JvbGxiYXIsIHRydWUpOwogICAgICAgICBzZXRTbW9vdGhTY3JvbGxiYXJFbmFibGVkKHNtb290aFNjcm9sbGJhcik7CisgICAgICAgIAorICAgICAgICBmaW5hbCBpbnQgYWRhcHRlcklkID0gYS5nZXRSZXNvdXJjZUlkKFIuc3R5bGVhYmxlLkFic0xpc3RWaWV3X2FkYXB0ZXIsIDApOworICAgICAgICBpZiAoYWRhcHRlcklkICE9IDApIHsKKyAgICAgICAgICAgIGZpbmFsIENvbnRleHQgYyA9IGNvbnRleHQ7CisgICAgICAgICAgICBwb3N0KG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIHNldEFkYXB0ZXIoQWRhcHRlcnMubG9hZEFkYXB0ZXIoYywgYWRhcHRlcklkKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKworICAgICAgICBzZXRDaG9pY2VNb2RlKGEuZ2V0SW50KFIuc3R5bGVhYmxlLkFic0xpc3RWaWV3X2Nob2ljZU1vZGUsIENIT0lDRV9NT0RFX05PTkUpKTsKIAogICAgICAgICBhLnJlY3ljbGUoKTsKICAgICB9CkBAIC01NzksNiArNjU1LDMxMSBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRBZGFwdGVyKExpc3RBZGFwdGVyIGFkYXB0ZXIpIHsKKyAgICAgICAgaWYgKGFkYXB0ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKG1DaG9pY2VNb2RlICE9IENIT0lDRV9NT0RFX05PTkUgJiYgbUFkYXB0ZXIuaGFzU3RhYmxlSWRzKCkgJiYKKyAgICAgICAgICAgICAgICAgICAgbUNoZWNrZWRJZFN0YXRlcyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUNoZWNrZWRJZFN0YXRlcyA9IG5ldyBMb25nU3BhcnNlQXJyYXk8Qm9vbGVhbj4oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChtQ2hlY2tTdGF0ZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgbUNoZWNrU3RhdGVzLmNsZWFyKCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAobUNoZWNrZWRJZFN0YXRlcyAhPSBudWxsKSB7CisgICAgICAgICAgICBtQ2hlY2tlZElkU3RhdGVzLmNsZWFyKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgaXRlbXMgY3VycmVudGx5IHNlbGVjdGVkLiBUaGlzIHdpbGwgb25seSBiZSB2YWxpZAorICAgICAqIGlmIHRoZSBjaG9pY2UgbW9kZSBpcyBub3Qge0BsaW5rICNDSE9JQ0VfTU9ERV9OT05FfSAoZGVmYXVsdCkuCisgICAgICoKKyAgICAgKiA8cD5UbyBkZXRlcm1pbmUgdGhlIHNwZWNpZmljIGl0ZW1zIHRoYXQgYXJlIGN1cnJlbnRseSBzZWxlY3RlZCwgdXNlIG9uZSBvZgorICAgICAqIHRoZSA8Y29kZT5nZXRDaGVja2VkKjwvY29kZT4gbWV0aG9kcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIG51bWJlciBvZiBpdGVtcyBjdXJyZW50bHkgc2VsZWN0ZWQKKyAgICAgKgorICAgICAqIEBzZWUgI2dldENoZWNrZWRJdGVtUG9zaXRpb24oKQorICAgICAqIEBzZWUgI2dldENoZWNrZWRJdGVtUG9zaXRpb25zKCkKKyAgICAgKiBAc2VlICNnZXRDaGVja2VkSXRlbUlkcygpCisgICAgICovCisgICAgcHVibGljIGludCBnZXRDaGVja2VkSXRlbUNvdW50KCkgeworICAgICAgICByZXR1cm4gbUNoZWNrZWRJdGVtQ291bnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY2hlY2tlZCBzdGF0ZSBvZiB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uLiBUaGUgcmVzdWx0IGlzIG9ubHkKKyAgICAgKiB2YWxpZCBpZiB0aGUgY2hvaWNlIG1vZGUgaGFzIGJlZW4gc2V0IHRvIHtAbGluayAjQ0hPSUNFX01PREVfU0lOR0xFfQorICAgICAqIG9yIHtAbGluayAjQ0hPSUNFX01PREVfTVVMVElQTEV9LgorICAgICAqCisgICAgICogQHBhcmFtIHBvc2l0aW9uIFRoZSBpdGVtIHdob3NlIGNoZWNrZWQgc3RhdGUgdG8gcmV0dXJuCisgICAgICogQHJldHVybiBUaGUgaXRlbSdzIGNoZWNrZWQgc3RhdGUgb3IgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGNob2ljZSBtb2RlCisgICAgICogICAgICAgICBpcyBpbnZhbGlkCisgICAgICoKKyAgICAgKiBAc2VlICNzZXRDaG9pY2VNb2RlKGludCkKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0l0ZW1DaGVja2VkKGludCBwb3NpdGlvbikgeworICAgICAgICBpZiAobUNob2ljZU1vZGUgIT0gQ0hPSUNFX01PREVfTk9ORSAmJiBtQ2hlY2tTdGF0ZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG1DaGVja1N0YXRlcy5nZXQocG9zaXRpb24pOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnRseSBjaGVja2VkIGl0ZW0uIFRoZSByZXN1bHQgaXMgb25seSB2YWxpZCBpZiB0aGUgY2hvaWNlCisgICAgICogbW9kZSBoYXMgYmVlbiBzZXQgdG8ge0BsaW5rICNDSE9JQ0VfTU9ERV9TSU5HTEV9LgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgcG9zaXRpb24gb2YgdGhlIGN1cnJlbnRseSBjaGVja2VkIGl0ZW0gb3IKKyAgICAgKiAgICAgICAgIHtAbGluayAjSU5WQUxJRF9QT1NJVElPTn0gaWYgbm90aGluZyBpcyBzZWxlY3RlZAorICAgICAqCisgICAgICogQHNlZSAjc2V0Q2hvaWNlTW9kZShpbnQpCisgICAgICovCisgICAgcHVibGljIGludCBnZXRDaGVja2VkSXRlbVBvc2l0aW9uKCkgeworICAgICAgICBpZiAobUNob2ljZU1vZGUgPT0gQ0hPSUNFX01PREVfU0lOR0xFICYmIG1DaGVja1N0YXRlcyAhPSBudWxsICYmIG1DaGVja1N0YXRlcy5zaXplKCkgPT0gMSkgeworICAgICAgICAgICAgcmV0dXJuIG1DaGVja1N0YXRlcy5rZXlBdCgwKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBJTlZBTElEX1BPU0lUSU9OOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHNldCBvZiBjaGVja2VkIGl0ZW1zIGluIHRoZSBsaXN0LiBUaGUgcmVzdWx0IGlzIG9ubHkgdmFsaWQgaWYKKyAgICAgKiB0aGUgY2hvaWNlIG1vZGUgaGFzIG5vdCBiZWVuIHNldCB0byB7QGxpbmsgI0NIT0lDRV9NT0RFX05PTkV9LgorICAgICAqCisgICAgICogQHJldHVybiAgQSBTcGFyc2VCb29sZWFuQXJyYXkgd2hpY2ggd2lsbCByZXR1cm4gdHJ1ZSBmb3IgZWFjaCBjYWxsIHRvCisgICAgICogICAgICAgICAgZ2V0KGludCBwb3NpdGlvbikgd2hlcmUgcG9zaXRpb24gaXMgYSBwb3NpdGlvbiBpbiB0aGUgbGlzdCwKKyAgICAgKiAgICAgICAgICBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgY2hvaWNlIG1vZGUgaXMgc2V0IHRvCisgICAgICogICAgICAgICAge0BsaW5rICNDSE9JQ0VfTU9ERV9OT05FfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3BhcnNlQm9vbGVhbkFycmF5IGdldENoZWNrZWRJdGVtUG9zaXRpb25zKCkgeworICAgICAgICBpZiAobUNob2ljZU1vZGUgIT0gQ0hPSUNFX01PREVfTk9ORSkgeworICAgICAgICAgICAgcmV0dXJuIG1DaGVja1N0YXRlczsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBzZXQgb2YgY2hlY2tlZCBpdGVtcyBpZHMuIFRoZSByZXN1bHQgaXMgb25seSB2YWxpZCBpZiB0aGUKKyAgICAgKiBjaG9pY2UgbW9kZSBoYXMgbm90IGJlZW4gc2V0IHRvIHtAbGluayAjQ0hPSUNFX01PREVfTk9ORX0gYW5kIHRoZSBhZGFwdGVyCisgICAgICogaGFzIHN0YWJsZSBJRHMuICh7QGxpbmsgTGlzdEFkYXB0ZXIjaGFzU3RhYmxlSWRzKCl9ID09IHtAY29kZSB0cnVlfSkKKyAgICAgKgorICAgICAqIEByZXR1cm4gQSBuZXcgYXJyYXkgd2hpY2ggY29udGFpbnMgdGhlIGlkIG9mIGVhY2ggY2hlY2tlZCBpdGVtIGluIHRoZQorICAgICAqICAgICAgICAgbGlzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZ1tdIGdldENoZWNrZWRJdGVtSWRzKCkgeworICAgICAgICBpZiAobUNob2ljZU1vZGUgPT0gQ0hPSUNFX01PREVfTk9ORSB8fCBtQ2hlY2tlZElkU3RhdGVzID09IG51bGwgfHwgbUFkYXB0ZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBsb25nWzBdOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgTG9uZ1NwYXJzZUFycmF5PEJvb2xlYW4+IGlkU3RhdGVzID0gbUNoZWNrZWRJZFN0YXRlczsKKyAgICAgICAgZmluYWwgaW50IGNvdW50ID0gaWRTdGF0ZXMuc2l6ZSgpOworICAgICAgICBmaW5hbCBsb25nW10gaWRzID0gbmV3IGxvbmdbY291bnRdOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgaWRzW2ldID0gaWRTdGF0ZXMua2V5QXQoaSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gaWRzOworICAgIH0KKworICAgIC8qKgorICAgICAqIENsZWFyIGFueSBjaG9pY2VzIHByZXZpb3VzbHkgc2V0CisgICAgICovCisgICAgcHVibGljIHZvaWQgY2xlYXJDaG9pY2VzKCkgeworICAgICAgICBpZiAobUNoZWNrU3RhdGVzICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1DaGVja1N0YXRlcy5jbGVhcigpOworICAgICAgICB9CisgICAgICAgIGlmIChtQ2hlY2tlZElkU3RhdGVzICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1DaGVja2VkSWRTdGF0ZXMuY2xlYXIoKTsKKyAgICAgICAgfQorICAgICAgICBtQ2hlY2tlZEl0ZW1Db3VudCA9IDA7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgY2hlY2tlZCBzdGF0ZSBvZiB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uLiBUaGUgaXMgb25seSB2YWxpZCBpZgorICAgICAqIHRoZSBjaG9pY2UgbW9kZSBoYXMgYmVlbiBzZXQgdG8ge0BsaW5rICNDSE9JQ0VfTU9ERV9TSU5HTEV9IG9yCisgICAgICoge0BsaW5rICNDSE9JQ0VfTU9ERV9NVUxUSVBMRX0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcG9zaXRpb24gVGhlIGl0ZW0gd2hvc2UgY2hlY2tlZCBzdGF0ZSBpcyB0byBiZSBjaGVja2VkCisgICAgICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgY2hlY2tlZCBzdGF0ZSBmb3IgdGhlIGl0ZW0KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJdGVtQ2hlY2tlZChpbnQgcG9zaXRpb24sIGJvb2xlYW4gdmFsdWUpIHsKKyAgICAgICAgaWYgKG1DaG9pY2VNb2RlID09IENIT0lDRV9NT0RFX05PTkUpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFN0YXJ0IHNlbGVjdGlvbiBtb2RlIGlmIG5lZWRlZC4gV2UgZG9uJ3QgbmVlZCB0byBpZiB3ZSdyZSB1bmNoZWNraW5nIHNvbWV0aGluZy4KKyAgICAgICAgaWYgKHZhbHVlICYmIG1DaG9pY2VNb2RlID09IENIT0lDRV9NT0RFX01VTFRJUExFX01PREFMICYmIG1DaG9pY2VBY3Rpb25Nb2RlID09IG51bGwpIHsKKyAgICAgICAgICAgIG1DaG9pY2VBY3Rpb25Nb2RlID0gc3RhcnRBY3Rpb25Nb2RlKG1NdWx0aUNob2ljZU1vZGVDYWxsYmFjayk7CisgICAgICAgIH0KKworICAgICAgICBpZiAobUNob2ljZU1vZGUgPT0gQ0hPSUNFX01PREVfTVVMVElQTEUgfHwgbUNob2ljZU1vZGUgPT0gQ0hPSUNFX01PREVfTVVMVElQTEVfTU9EQUwpIHsKKyAgICAgICAgICAgIGJvb2xlYW4gb2xkVmFsdWUgPSBtQ2hlY2tTdGF0ZXMuZ2V0KHBvc2l0aW9uKTsKKyAgICAgICAgICAgIG1DaGVja1N0YXRlcy5wdXQocG9zaXRpb24sIHZhbHVlKTsKKyAgICAgICAgICAgIGlmIChtQ2hlY2tlZElkU3RhdGVzICE9IG51bGwgJiYgbUFkYXB0ZXIuaGFzU3RhYmxlSWRzKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUpIHsKKyAgICAgICAgICAgICAgICAgICAgbUNoZWNrZWRJZFN0YXRlcy5wdXQobUFkYXB0ZXIuZ2V0SXRlbUlkKHBvc2l0aW9uKSwgQm9vbGVhbi5UUlVFKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtQ2hlY2tlZElkU3RhdGVzLmRlbGV0ZShtQWRhcHRlci5nZXRJdGVtSWQocG9zaXRpb24pKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAob2xkVmFsdWUgIT0gdmFsdWUpIHsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUpIHsKKyAgICAgICAgICAgICAgICAgICAgbUNoZWNrZWRJdGVtQ291bnQrKzsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtQ2hlY2tlZEl0ZW1Db3VudC0tOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtQ2hvaWNlQWN0aW9uTW9kZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZmluYWwgbG9uZyBpZCA9IG1BZGFwdGVyLmdldEl0ZW1JZChwb3NpdGlvbik7CisgICAgICAgICAgICAgICAgbU11bHRpQ2hvaWNlTW9kZUNhbGxiYWNrLm9uSXRlbUNoZWNrZWRTdGF0ZUNoYW5nZWQobUNob2ljZUFjdGlvbk1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiwgaWQsIHZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJvb2xlYW4gdXBkYXRlSWRzID0gbUNoZWNrZWRJZFN0YXRlcyAhPSBudWxsICYmIG1BZGFwdGVyLmhhc1N0YWJsZUlkcygpOworICAgICAgICAgICAgLy8gQ2xlYXIgYWxsIHZhbHVlcyBpZiB3ZSdyZSBjaGVja2luZyBzb21ldGhpbmcsIG9yIHVuY2hlY2tpbmcgdGhlIGN1cnJlbnRseQorICAgICAgICAgICAgLy8gc2VsZWN0ZWQgaXRlbQorICAgICAgICAgICAgaWYgKHZhbHVlIHx8IGlzSXRlbUNoZWNrZWQocG9zaXRpb24pKSB7CisgICAgICAgICAgICAgICAgbUNoZWNrU3RhdGVzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgaWYgKHVwZGF0ZUlkcykgeworICAgICAgICAgICAgICAgICAgICBtQ2hlY2tlZElkU3RhdGVzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gdGhpcyBtYXkgZW5kIHVwIHNlbGVjdGluZyB0aGUgdmFsdWUgd2UganVzdCBjbGVhcmVkIGJ1dCB0aGlzIHdheQorICAgICAgICAgICAgLy8gd2UgZW5zdXJlIGxlbmd0aCBvZiBtQ2hlY2tTdGF0ZXMgaXMgMSwgYSBmYWN0IGdldENoZWNrZWRJdGVtUG9zaXRpb24gcmVsaWVzIG9uCisgICAgICAgICAgICBpZiAodmFsdWUpIHsKKyAgICAgICAgICAgICAgICBtQ2hlY2tTdGF0ZXMucHV0KHBvc2l0aW9uLCB0cnVlKTsKKyAgICAgICAgICAgICAgICBpZiAodXBkYXRlSWRzKSB7CisgICAgICAgICAgICAgICAgICAgIG1DaGVja2VkSWRTdGF0ZXMucHV0KG1BZGFwdGVyLmdldEl0ZW1JZChwb3NpdGlvbiksIEJvb2xlYW4uVFJVRSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1DaGVja2VkSXRlbUNvdW50ID0gMTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobUNoZWNrU3RhdGVzLnNpemUoKSA9PSAwIHx8ICFtQ2hlY2tTdGF0ZXMudmFsdWVBdCgwKSkgeworICAgICAgICAgICAgICAgIG1DaGVja2VkSXRlbUNvdW50ID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIERvIG5vdCBnZW5lcmF0ZSBhIGRhdGEgY2hhbmdlIHdoaWxlIHdlIGFyZSBpbiB0aGUgbGF5b3V0IHBoYXNlCisgICAgICAgIGlmICghbUluTGF5b3V0ICYmICFtQmxvY2tMYXlvdXRSZXF1ZXN0cykgeworICAgICAgICAgICAgbURhdGFDaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgICAgIHJlbWVtYmVyU3luY1N0YXRlKCk7CisgICAgICAgICAgICByZXF1ZXN0TGF5b3V0KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBwZXJmb3JtSXRlbUNsaWNrKFZpZXcgdmlldywgaW50IHBvc2l0aW9uLCBsb25nIGlkKSB7CisgICAgICAgIGJvb2xlYW4gaGFuZGxlZCA9IGZhbHNlOworCisgICAgICAgIGlmIChtQ2hvaWNlTW9kZSAhPSBDSE9JQ0VfTU9ERV9OT05FKSB7CisgICAgICAgICAgICBoYW5kbGVkID0gdHJ1ZTsKKworICAgICAgICAgICAgaWYgKG1DaG9pY2VNb2RlID09IENIT0lDRV9NT0RFX01VTFRJUExFIHx8CisgICAgICAgICAgICAgICAgICAgIChtQ2hvaWNlTW9kZSA9PSBDSE9JQ0VfTU9ERV9NVUxUSVBMRV9NT0RBTCAmJiBtQ2hvaWNlQWN0aW9uTW9kZSAhPSBudWxsKSkgeworICAgICAgICAgICAgICAgIGJvb2xlYW4gbmV3VmFsdWUgPSAhbUNoZWNrU3RhdGVzLmdldChwb3NpdGlvbiwgZmFsc2UpOworICAgICAgICAgICAgICAgIG1DaGVja1N0YXRlcy5wdXQocG9zaXRpb24sIG5ld1ZhbHVlKTsKKyAgICAgICAgICAgICAgICBpZiAobUNoZWNrZWRJZFN0YXRlcyAhPSBudWxsICYmIG1BZGFwdGVyLmhhc1N0YWJsZUlkcygpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChuZXdWYWx1ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbUNoZWNrZWRJZFN0YXRlcy5wdXQobUFkYXB0ZXIuZ2V0SXRlbUlkKHBvc2l0aW9uKSwgQm9vbGVhbi5UUlVFKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1DaGVja2VkSWRTdGF0ZXMuZGVsZXRlKG1BZGFwdGVyLmdldEl0ZW1JZChwb3NpdGlvbikpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChuZXdWYWx1ZSkgeworICAgICAgICAgICAgICAgICAgICBtQ2hlY2tlZEl0ZW1Db3VudCsrOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1DaGVja2VkSXRlbUNvdW50LS07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChtQ2hvaWNlQWN0aW9uTW9kZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG1NdWx0aUNob2ljZU1vZGVDYWxsYmFjay5vbkl0ZW1DaGVja2VkU3RhdGVDaGFuZ2VkKG1DaG9pY2VBY3Rpb25Nb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uLCBpZCwgbmV3VmFsdWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAobUNob2ljZU1vZGUgPT0gQ0hPSUNFX01PREVfU0lOR0xFKSB7CisgICAgICAgICAgICAgICAgYm9vbGVhbiBuZXdWYWx1ZSA9ICFtQ2hlY2tTdGF0ZXMuZ2V0KHBvc2l0aW9uLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgaWYgKG5ld1ZhbHVlKSB7CisgICAgICAgICAgICAgICAgICAgIG1DaGVja1N0YXRlcy5jbGVhcigpOworICAgICAgICAgICAgICAgICAgICBtQ2hlY2tTdGF0ZXMucHV0KHBvc2l0aW9uLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1DaGVja2VkSWRTdGF0ZXMgIT0gbnVsbCAmJiBtQWRhcHRlci5oYXNTdGFibGVJZHMoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbUNoZWNrZWRJZFN0YXRlcy5jbGVhcigpOworICAgICAgICAgICAgICAgICAgICAgICAgbUNoZWNrZWRJZFN0YXRlcy5wdXQobUFkYXB0ZXIuZ2V0SXRlbUlkKHBvc2l0aW9uKSwgQm9vbGVhbi5UUlVFKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtQ2hlY2tlZEl0ZW1Db3VudCA9IDE7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtQ2hlY2tTdGF0ZXMuc2l6ZSgpID09IDAgfHwgIW1DaGVja1N0YXRlcy52YWx1ZUF0KDApKSB7CisgICAgICAgICAgICAgICAgICAgIG1DaGVja2VkSXRlbUNvdW50ID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1EYXRhQ2hhbmdlZCA9IHRydWU7CisgICAgICAgICAgICByZW1lbWJlclN5bmNTdGF0ZSgpOworICAgICAgICAgICAgcmVxdWVzdExheW91dCgpOworICAgICAgICB9CisKKyAgICAgICAgaGFuZGxlZCB8PSBzdXBlci5wZXJmb3JtSXRlbUNsaWNrKHZpZXcsIHBvc2l0aW9uLCBpZCk7CisKKyAgICAgICAgcmV0dXJuIGhhbmRsZWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHNlZSAjc2V0Q2hvaWNlTW9kZShpbnQpCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBjdXJyZW50IGNob2ljZSBtb2RlCisgICAgICovCisgICAgcHVibGljIGludCBnZXRDaG9pY2VNb2RlKCkgeworICAgICAgICByZXR1cm4gbUNob2ljZU1vZGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVmaW5lcyB0aGUgY2hvaWNlIGJlaGF2aW9yIGZvciB0aGUgTGlzdC4gQnkgZGVmYXVsdCwgTGlzdHMgZG8gbm90IGhhdmUgYW55IGNob2ljZSBiZWhhdmlvcgorICAgICAqICh7QGxpbmsgI0NIT0lDRV9NT0RFX05PTkV9KS4gQnkgc2V0dGluZyB0aGUgY2hvaWNlTW9kZSB0byB7QGxpbmsgI0NIT0lDRV9NT0RFX1NJTkdMRX0sIHRoZQorICAgICAqIExpc3QgYWxsb3dzIHVwIHRvIG9uZSBpdGVtIHRvICBiZSBpbiBhIGNob3NlbiBzdGF0ZS4gQnkgc2V0dGluZyB0aGUgY2hvaWNlTW9kZSB0bworICAgICAqIHtAbGluayAjQ0hPSUNFX01PREVfTVVMVElQTEV9LCB0aGUgbGlzdCBhbGxvd3MgYW55IG51bWJlciBvZiBpdGVtcyB0byBiZSBjaG9zZW4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2hvaWNlTW9kZSBPbmUgb2Yge0BsaW5rICNDSE9JQ0VfTU9ERV9OT05FfSwge0BsaW5rICNDSE9JQ0VfTU9ERV9TSU5HTEV9LCBvcgorICAgICAqIHtAbGluayAjQ0hPSUNFX01PREVfTVVMVElQTEV9CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2hvaWNlTW9kZShpbnQgY2hvaWNlTW9kZSkgeworICAgICAgICBtQ2hvaWNlTW9kZSA9IGNob2ljZU1vZGU7CisgICAgICAgIGlmIChtQ2hvaWNlQWN0aW9uTW9kZSAhPSBudWxsKSB7CisgICAgICAgICAgICBtQ2hvaWNlQWN0aW9uTW9kZS5maW5pc2goKTsKKyAgICAgICAgICAgIG1DaG9pY2VBY3Rpb25Nb2RlID0gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBpZiAobUNob2ljZU1vZGUgIT0gQ0hPSUNFX01PREVfTk9ORSkgeworICAgICAgICAgICAgaWYgKG1DaGVja1N0YXRlcyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUNoZWNrU3RhdGVzID0gbmV3IFNwYXJzZUJvb2xlYW5BcnJheSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1DaGVja2VkSWRTdGF0ZXMgPT0gbnVsbCAmJiBtQWRhcHRlciAhPSBudWxsICYmIG1BZGFwdGVyLmhhc1N0YWJsZUlkcygpKSB7CisgICAgICAgICAgICAgICAgbUNoZWNrZWRJZFN0YXRlcyA9IG5ldyBMb25nU3BhcnNlQXJyYXk8Qm9vbGVhbj4oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIE1vZGFsIG11bHRpLWNob2ljZSBtb2RlIG9ubHkgaGFzIGNob2ljZXMgd2hlbiB0aGUgbW9kZSBpcyBhY3RpdmUuIENsZWFyIHRoZW0uCisgICAgICAgICAgICBpZiAobUNob2ljZU1vZGUgPT0gQ0hPSUNFX01PREVfTVVMVElQTEVfTU9EQUwpIHsKKyAgICAgICAgICAgICAgICBjbGVhckNob2ljZXMoKTsKKyAgICAgICAgICAgICAgICBzZXRMb25nQ2xpY2thYmxlKHRydWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IGEge0BsaW5rIE11bHRpQ2hvaWNlTW9kZUxpc3RlbmVyfSB0aGF0IHdpbGwgbWFuYWdlIHRoZSBsaWZlY3ljbGUgb2YgdGhlCisgICAgICogc2VsZWN0aW9uIHtAbGluayBBY3Rpb25Nb2RlfS4gT25seSB1c2VkIHdoZW4gdGhlIGNob2ljZSBtb2RlIGlzIHNldCB0bworICAgICAqIHtAbGluayAjQ0hPSUNFX01PREVfTVVMVElQTEVfTU9EQUx9LgorICAgICAqCisgICAgICogQHBhcmFtIGxpc3RlbmVyIExpc3RlbmVyIHRoYXQgd2lsbCBtYW5hZ2UgdGhlIHNlbGVjdGlvbiBtb2RlCisgICAgICoKKyAgICAgKiBAc2VlICNzZXRDaG9pY2VNb2RlKGludCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNdWx0aUNob2ljZU1vZGVMaXN0ZW5lcihNdWx0aUNob2ljZU1vZGVMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICBpZiAobU11bHRpQ2hvaWNlTW9kZUNhbGxiYWNrID09IG51bGwpIHsKKyAgICAgICAgICAgIG1NdWx0aUNob2ljZU1vZGVDYWxsYmFjayA9IG5ldyBNdWx0aUNob2ljZU1vZGVXcmFwcGVyKCk7CisgICAgICAgIH0KKyAgICAgICAgbU11bHRpQ2hvaWNlTW9kZUNhbGxiYWNrLnNldFdyYXBwZWQobGlzdGVuZXIpOworICAgIH0KKworICAgIC8qKgogICAgICAqIEVuYWJsZXMgZmFzdCBzY3JvbGxpbmcgYnkgbGV0dGluZyB0aGUgdXNlciBxdWlja2x5IHNjcm9sbCB0aHJvdWdoIGxpc3RzIGJ5CiAgICAgICogZHJhZ2dpbmcgdGhlIGZhc3Qgc2Nyb2xsIHRodW1iLiBUaGUgYWRhcHRlciBhdHRhY2hlZCB0byB0aGUgbGlzdCBtYXkgd2FudAogICAgICAqIHRvIGltcGxlbWVudCB7QGxpbmsgU2VjdGlvbkluZGV4ZXJ9IGlmIGl0IHdpc2hlcyB0byBkaXNwbGF5IGFscGhhYmV0IHByZXZpZXcgYW5kCkBAIC03OTYsNiArMTE3Nyw4IEBACiAgICAgICAgIGludCBwb3NpdGlvbjsKICAgICAgICAgaW50IGhlaWdodDsKICAgICAgICAgU3RyaW5nIGZpbHRlcjsKKyAgICAgICAgU3BhcnNlQm9vbGVhbkFycmF5IGNoZWNrU3RhdGU7CisgICAgICAgIExvbmdTcGFyc2VBcnJheTxCb29sZWFuPiBjaGVja0lkU3RhdGU7CiAKICAgICAgICAgLyoqCiAgICAgICAgICAqIENvbnN0cnVjdG9yIGNhbGxlZCBmcm9tIHtAbGluayBBYnNMaXN0VmlldyNvblNhdmVJbnN0YW5jZVN0YXRlKCl9CkBAIC04MTUsNiArMTE5OCwxMyBAQAogICAgICAgICAgICAgcG9zaXRpb24gPSBpbi5yZWFkSW50KCk7CiAgICAgICAgICAgICBoZWlnaHQgPSBpbi5yZWFkSW50KCk7CiAgICAgICAgICAgICBmaWx0ZXIgPSBpbi5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgICBjaGVja1N0YXRlID0gaW4ucmVhZFNwYXJzZUJvb2xlYW5BcnJheSgpOworICAgICAgICAgICAgbG9uZ1tdIGlkU3RhdGUgPSBpbi5jcmVhdGVMb25nQXJyYXkoKTsKKworICAgICAgICAgICAgaWYgKGlkU3RhdGUubGVuZ3RoID4gMCkgeworICAgICAgICAgICAgICAgIGNoZWNrSWRTdGF0ZSA9IG5ldyBMb25nU3BhcnNlQXJyYXk8Qm9vbGVhbj4oKTsKKyAgICAgICAgICAgICAgICBjaGVja0lkU3RhdGUuc2V0VmFsdWVzKGlkU3RhdGUsIEJvb2xlYW4uVFJVRSk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICBAT3ZlcnJpZGUKQEAgLTgyNiw2ICsxMjE2LDggQEAKICAgICAgICAgICAgIG91dC53cml0ZUludChwb3NpdGlvbik7CiAgICAgICAgICAgICBvdXQud3JpdGVJbnQoaGVpZ2h0KTsKICAgICAgICAgICAgIG91dC53cml0ZVN0cmluZyhmaWx0ZXIpOworICAgICAgICAgICAgb3V0LndyaXRlU3BhcnNlQm9vbGVhbkFycmF5KGNoZWNrU3RhdGUpOworICAgICAgICAgICAgb3V0LndyaXRlTG9uZ0FycmF5KGNoZWNrSWRTdGF0ZSAhPSBudWxsID8gY2hlY2tJZFN0YXRlLmdldEtleXMoKSA6IG5ldyBsb25nWzBdKTsKICAgICAgICAgfQogCiAgICAgICAgIEBPdmVycmlkZQpAQCAtODM3LDcgKzEyMjksOCBAQAogICAgICAgICAgICAgICAgICAgICArICIgdmlld1RvcD0iICsgdmlld1RvcAogICAgICAgICAgICAgICAgICAgICArICIgcG9zaXRpb249IiArIHBvc2l0aW9uCiAgICAgICAgICAgICAgICAgICAgICsgIiBoZWlnaHQ9IiArIGhlaWdodAotICAgICAgICAgICAgICAgICAgICArICIgZmlsdGVyPSIgKyBmaWx0ZXIgKyAifSI7CisgICAgICAgICAgICAgICAgICAgICsgIiBmaWx0ZXI9IiArIGZpbHRlcgorICAgICAgICAgICAgICAgICAgICArICIgY2hlY2tTdGF0ZT0iICsgY2hlY2tTdGF0ZSArICJ9IjsKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUGFyY2VsYWJsZS5DcmVhdG9yPFNhdmVkU3RhdGU+IENSRUFUT1IKQEAgLTkwMSw2ICsxMjk0LDkgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCisgICAgICAgIHNzLmNoZWNrU3RhdGUgPSBtQ2hlY2tTdGF0ZXM7CisgICAgICAgIHNzLmNoZWNrSWRTdGF0ZSA9IG1DaGVja2VkSWRTdGF0ZXM7CisKICAgICAgICAgcmV0dXJuIHNzOwogICAgIH0KIApAQCAtOTMyLDYgKzEzMjgsMTQgQEAKIAogICAgICAgICBzZXRGaWx0ZXJUZXh0KHNzLmZpbHRlcik7CiAKKyAgICAgICAgaWYgKHNzLmNoZWNrU3RhdGUgIT0gbnVsbCkgeworICAgICAgICAgICAgbUNoZWNrU3RhdGVzID0gc3MuY2hlY2tTdGF0ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzcy5jaGVja0lkU3RhdGUgIT0gbnVsbCkgeworICAgICAgICAgICAgbUNoZWNrZWRJZFN0YXRlcyA9IHNzLmNoZWNrSWRTdGF0ZTsKKyAgICAgICAgfQorCiAgICAgICAgIHJlcXVlc3RMYXlvdXQoKTsKICAgICB9CiAKQEAgLTE1NzUsNiArMTk3OSwxMSBAQAogICAgICAgICAgICAgICAgIHRyZWVPYnNlcnZlci5hZGRPbkdsb2JhbExheW91dExpc3RlbmVyKHRoaXMpOwogICAgICAgICAgICAgfQogICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAobUFkYXB0ZXIgIT0gbnVsbCAmJiBtRGF0YVNldE9ic2VydmVyID09IG51bGwpIHsKKyAgICAgICAgICAgIG1EYXRhU2V0T2JzZXJ2ZXIgPSBuZXcgQWRhcHRlckRhdGFTZXRPYnNlcnZlcigpOworICAgICAgICAgICAgbUFkYXB0ZXIucmVnaXN0ZXJEYXRhU2V0T2JzZXJ2ZXIobURhdGFTZXRPYnNlcnZlcik7CisgICAgICAgIH0KICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTE1OTUsNiArMjAwNCwxMSBAQAogICAgICAgICAgICAgICAgIG1HbG9iYWxMYXlvdXRMaXN0ZW5lckFkZGVkRmlsdGVyID0gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KKworICAgICAgICBpZiAobUFkYXB0ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgbUFkYXB0ZXIudW5yZWdpc3RlckRhdGFTZXRPYnNlcnZlcihtRGF0YVNldE9ic2VydmVyKTsKKyAgICAgICAgICAgIG1EYXRhU2V0T2JzZXJ2ZXIgPSBudWxsOworICAgICAgICB9CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC0xNzQ1LDEwICsyMTU5LDIxIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcml2YXRlIGJvb2xlYW4gcGVyZm9ybUxvbmdQcmVzcyhmaW5hbCBWaWV3IGNoaWxkLAorICAgIGJvb2xlYW4gcGVyZm9ybUxvbmdQcmVzcyhmaW5hbCBWaWV3IGNoaWxkLAogICAgICAgICAgICAgZmluYWwgaW50IGxvbmdQcmVzc1Bvc2l0aW9uLCBmaW5hbCBsb25nIGxvbmdQcmVzc0lkKSB7Ci0gICAgICAgIGJvb2xlYW4gaGFuZGxlZCA9IGZhbHNlOworICAgICAgICAvLyBDSE9JQ0VfTU9ERV9NVUxUSVBMRV9NT0RBTCB0YWtlcyBvdmVyIGxvbmcgcHJlc3MuCisgICAgICAgIGlmIChtQ2hvaWNlTW9kZSA9PSBDSE9JQ0VfTU9ERV9NVUxUSVBMRV9NT0RBTCkgeworICAgICAgICAgICAgaWYgKG1DaG9pY2VBY3Rpb25Nb2RlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtQ2hvaWNlQWN0aW9uTW9kZSA9IHN0YXJ0QWN0aW9uTW9kZShtTXVsdGlDaG9pY2VNb2RlQ2FsbGJhY2spOworICAgICAgICAgICAgICAgIHNldEl0ZW1DaGVja2VkKGxvbmdQcmVzc1Bvc2l0aW9uLCB0cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFRPRE8gU2hvdWxkIHdlIHNlbGVjdCB0aGUgbG9uZyBwcmVzc2VkIGl0ZW0gaWYgd2Ugd2VyZSBhbHJlYWR5IGluCisgICAgICAgICAgICAvLyBzZWxlY3Rpb24gbW9kZT8gKGkuZS4gdHJlYXQgaXQgbGlrZSBhbiBpdGVtIGNsaWNrPykKKyAgICAgICAgICAgIHBlcmZvcm1IYXB0aWNGZWVkYmFjayhIYXB0aWNGZWVkYmFja0NvbnN0YW50cy5MT05HX1BSRVNTKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CiAKKyAgICAgICAgYm9vbGVhbiBoYW5kbGVkID0gZmFsc2U7CiAgICAgICAgIGlmIChtT25JdGVtTG9uZ0NsaWNrTGlzdGVuZXIgIT0gbnVsbCkgewogICAgICAgICAgICAgaGFuZGxlZCA9IG1Pbkl0ZW1Mb25nQ2xpY2tMaXN0ZW5lci5vbkl0ZW1Mb25nQ2xpY2soQWJzTGlzdFZpZXcudGhpcywgY2hpbGQsCiAgICAgICAgICAgICAgICAgICAgIGxvbmdQcmVzc1Bvc2l0aW9uLCBsb25nUHJlc3NJZCk7CkBAIC0yNTIxLDYgKzI5NDYsNyBAQAogICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTU9WRV9VUF9QT1MgPSAyOwogICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTU9WRV9ET1dOX0JPVU5EID0gMzsKICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1PVkVfVVBfQk9VTkQgPSA0OworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTU9WRV9PRkZTRVQgPSA1OwogICAgICAgICAKICAgICAgICAgcHJpdmF0ZSBpbnQgbU1vZGU7CiAgICAgICAgIHByaXZhdGUgaW50IG1UYXJnZXRQb3M7CkBAIC0yNTI4LDYgKzI5NTQsOCBAQAogICAgICAgICBwcml2YXRlIGludCBtTGFzdFNlZW5Qb3M7CiAgICAgICAgIHByaXZhdGUgaW50IG1TY3JvbGxEdXJhdGlvbjsKICAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbUV4dHJhU2Nyb2xsOworCisgICAgICAgIHByaXZhdGUgaW50IG1PZmZzZXRGcm9tVG9wOwogICAgICAgICAKICAgICAgICAgUG9zaXRpb25TY3JvbGxlcigpIHsKICAgICAgICAgICAgIG1FeHRyYVNjcm9sbCA9IFZpZXdDb25maWd1cmF0aW9uLmdldChtQ29udGV4dCkuZ2V0U2NhbGVkRmFkaW5nRWRnZUxlbmd0aCgpOwpAQCAtMjYxOSwxMiArMzA0Nyw0NiBAQAogICAgICAgICAgICAgCiAgICAgICAgICAgICBwb3N0KHRoaXMpOwogICAgICAgICB9Ci0gICAgICAgIAorCisgICAgICAgIHZvaWQgc3RhcnRXaXRoT2Zmc2V0KGludCBwb3NpdGlvbiwgaW50IG9mZnNldCkgeworICAgICAgICAgICAgbVRhcmdldFBvcyA9IHBvc2l0aW9uOworICAgICAgICAgICAgbU9mZnNldEZyb21Ub3AgPSBvZmZzZXQ7CisgICAgICAgICAgICBtQm91bmRQb3MgPSBJTlZBTElEX1BPU0lUSU9OOworICAgICAgICAgICAgbUxhc3RTZWVuUG9zID0gSU5WQUxJRF9QT1NJVElPTjsKKyAgICAgICAgICAgIG1Nb2RlID0gTU9WRV9PRkZTRVQ7CisKKyAgICAgICAgICAgIGZpbmFsIGludCBmaXJzdFBvcyA9IG1GaXJzdFBvc2l0aW9uOworICAgICAgICAgICAgZmluYWwgaW50IGNoaWxkQ291bnQgPSBnZXRDaGlsZENvdW50KCk7CisgICAgICAgICAgICBmaW5hbCBpbnQgbGFzdFBvcyA9IGZpcnN0UG9zICsgY2hpbGRDb3VudCAtIDE7CisKKyAgICAgICAgICAgIGludCB2aWV3VHJhdmVsQ291bnQgPSAwOworICAgICAgICAgICAgaWYgKHBvc2l0aW9uIDwgZmlyc3RQb3MpIHsKKyAgICAgICAgICAgICAgICB2aWV3VHJhdmVsQ291bnQgPSBmaXJzdFBvcyAtIHBvc2l0aW9uOworICAgICAgICAgICAgfSBlbHNlIGlmIChwb3NpdGlvbiA+IGxhc3RQb3MpIHsKKyAgICAgICAgICAgICAgICB2aWV3VHJhdmVsQ291bnQgPSBwb3NpdGlvbiAtIGxhc3RQb3M7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIE9uLXNjcmVlbiwganVzdCBzY3JvbGwuCisgICAgICAgICAgICAgICAgZmluYWwgaW50IHRhcmdldFRvcCA9IGdldENoaWxkQXQocG9zaXRpb24gLSBmaXJzdFBvcykuZ2V0VG9wKCk7CisgICAgICAgICAgICAgICAgc21vb3RoU2Nyb2xsQnkodGFyZ2V0VG9wIC0gb2Zmc2V0LCBTQ1JPTExfRFVSQVRJT04pOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gRXN0aW1hdGUgaG93IG1hbnkgc2NyZWVucyB3ZSBzaG91bGQgdHJhdmVsCisgICAgICAgICAgICBmaW5hbCBmbG9hdCBzY3JlZW5UcmF2ZWxDb3VudCA9IHZpZXdUcmF2ZWxDb3VudCAvIGNoaWxkQ291bnQ7CisgICAgICAgICAgICBtU2Nyb2xsRHVyYXRpb24gPSAoaW50KSAoU0NST0xMX0RVUkFUSU9OIC8gc2NyZWVuVHJhdmVsQ291bnQpOworICAgICAgICAgICAgbUxhc3RTZWVuUG9zID0gSU5WQUxJRF9QT1NJVElPTjsKKyAgICAgICAgICAgIHBvc3QodGhpcyk7CisgICAgICAgIH0KKwogICAgICAgICB2b2lkIHN0b3AoKSB7CiAgICAgICAgICAgICByZW1vdmVDYWxsYmFja3ModGhpcyk7CiAgICAgICAgIH0KLSAgICAgICAgCisKICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgaWYgKG1Ub3VjaE1vZGUgIT0gVE9VQ0hfTU9ERV9GTElORyAmJiBtTGFzdFNlZW5Qb3MgIT0gSU5WQUxJRF9QT1NJVElPTikgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgZmluYWwgaW50IGxpc3RIZWlnaHQgPSBnZXRIZWlnaHQoKTsKICAgICAgICAgICAgIGZpbmFsIGludCBmaXJzdFBvcyA9IG1GaXJzdFBvc2l0aW9uOwogICAgICAgICAgICAgCkBAIC0yNzQ5LDYgKzMyMTEsMjcgQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgY2FzZSBNT1ZFX09GRlNFVDogeworICAgICAgICAgICAgICAgIGZpbmFsIGludCBjaGlsZENvdW50ID0gZ2V0Q2hpbGRDb3VudCgpOworCisgICAgICAgICAgICAgICAgbUxhc3RTZWVuUG9zID0gZmlyc3RQb3M7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IHBvc2l0aW9uID0gbVRhcmdldFBvczsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgbGFzdFBvcyA9IGZpcnN0UG9zICsgY2hpbGRDb3VudCAtIDE7CisKKyAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24gPCBmaXJzdFBvcykgeworICAgICAgICAgICAgICAgICAgICBzbW9vdGhTY3JvbGxCeSgtZ2V0SGVpZ2h0KCksIG1TY3JvbGxEdXJhdGlvbik7CisgICAgICAgICAgICAgICAgICAgIHBvc3QodGhpcyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwb3NpdGlvbiA+IGxhc3RQb3MpIHsKKyAgICAgICAgICAgICAgICAgICAgc21vb3RoU2Nyb2xsQnkoZ2V0SGVpZ2h0KCksIG1TY3JvbGxEdXJhdGlvbik7CisgICAgICAgICAgICAgICAgICAgIHBvc3QodGhpcyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gT24tc2NyZWVuLCBqdXN0IHNjcm9sbC4KKyAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHRhcmdldFRvcCA9IGdldENoaWxkQXQocG9zaXRpb24gLSBmaXJzdFBvcykuZ2V0VG9wKCk7CisgICAgICAgICAgICAgICAgICAgIHNtb290aFNjcm9sbEJ5KHRhcmdldFRvcCAtIG1PZmZzZXRGcm9tVG9wLCBtU2Nyb2xsRHVyYXRpb24pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KQEAgLTI3NjgsNiArMzI1MSwyNCBAQAogICAgIH0KICAgICAKICAgICAvKioKKyAgICAgKiBTbW9vdGhseSBzY3JvbGwgdG8gdGhlIHNwZWNpZmllZCBhZGFwdGVyIHBvc2l0aW9uLiBUaGUgdmlldyB3aWxsIHNjcm9sbAorICAgICAqIHN1Y2ggdGhhdCB0aGUgaW5kaWNhdGVkIHBvc2l0aW9uIGlzIGRpc3BsYXllZCA8Y29kZT5vZmZzZXQ8L2NvZGU+IHBpeGVscyBmcm9tCisgICAgICogdGhlIHRvcCBlZGdlIG9mIHRoZSB2aWV3LiBJZiB0aGlzIGlzIGltcG9zc2libGUsIChlLmcuIHRoZSBvZmZzZXQgd291bGQgc2Nyb2xsCisgICAgICogdGhlIGZpcnN0IG9yIGxhc3QgaXRlbSBiZXlvbmQgdGhlIGJvdW5kYXJpZXMgb2YgdGhlIGxpc3QpIGl0IHdpbGwgZ2V0IGFzIGNsb3NlCisgICAgICogYXMgcG9zc2libGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcG9zaXRpb24gUG9zaXRpb24gdG8gc2Nyb2xsIHRvCisgICAgICogQHBhcmFtIG9mZnNldCBEZXNpcmVkIGRpc3RhbmNlIGluIHBpeGVscyBvZiA8Y29kZT5wb3NpdGlvbjwvY29kZT4gZnJvbSB0aGUgdG9wCisgICAgICogICAgICAgICAgICAgICBvZiB0aGUgdmlldyB3aGVuIHNjcm9sbGluZyBpcyBmaW5pc2hlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNtb290aFNjcm9sbFRvUG9zaXRpb25Gcm9tVG9wKGludCBwb3NpdGlvbiwgaW50IG9mZnNldCkgeworICAgICAgICBpZiAobVBvc2l0aW9uU2Nyb2xsZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgbVBvc2l0aW9uU2Nyb2xsZXIgPSBuZXcgUG9zaXRpb25TY3JvbGxlcigpOworICAgICAgICB9CisgICAgICAgIG1Qb3NpdGlvblNjcm9sbGVyLnN0YXJ0V2l0aE9mZnNldChwb3NpdGlvbiwgb2Zmc2V0KTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBTbW9vdGhseSBzY3JvbGwgdG8gdGhlIHNwZWNpZmllZCBhZGFwdGVyIHBvc2l0aW9uLiBUaGUgdmlldyB3aWxsCiAgICAgICogc2Nyb2xsIHN1Y2ggdGhhdCB0aGUgaW5kaWNhdGVkIHBvc2l0aW9uIGlzIGRpc3BsYXllZCwgYnV0IGl0IHdpbGwKICAgICAgKiBzdG9wIGVhcmx5IGlmIHNjcm9sbGluZyBmdXJ0aGVyIHdvdWxkIHNjcm9sbCBib3VuZFBvc2l0aW9uIG91dCBvZgpAQCAtMjc5Nyw2ICszMjk4LDQyIEBACiAgICAgICAgIG1GbGluZ1J1bm5hYmxlLnN0YXJ0U2Nyb2xsKGRpc3RhbmNlLCBkdXJhdGlvbik7CiAgICAgfQogCisgICAgLyoqCisgICAgICogQWxsb3dzIFJlbW90ZVZpZXdzIHRvIHNjcm9sbCByZWxhdGl2ZWx5IHRvIGEgcG9zaXRpb24uCisgICAgICovCisgICAgdm9pZCBzbW9vdGhTY3JvbGxCeU9mZnNldChpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgaW50IGluZGV4ID0gLTE7CisgICAgICAgIGlmIChwb3NpdGlvbiA8IDApIHsKKyAgICAgICAgICAgIGluZGV4ID0gZ2V0Rmlyc3RWaXNpYmxlUG9zaXRpb24oKTsKKyAgICAgICAgfSBlbHNlIGlmIChwb3NpdGlvbiA+IDApIHsKKyAgICAgICAgICAgIGluZGV4ID0gZ2V0TGFzdFZpc2libGVQb3NpdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGluZGV4ID4gLTEpIHsKKyAgICAgICAgICAgIFZpZXcgY2hpbGQgPSBnZXRDaGlsZEF0KGluZGV4IC0gZ2V0Rmlyc3RWaXNpYmxlUG9zaXRpb24oKSk7CisgICAgICAgICAgICBpZiAoY2hpbGQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIFJlY3QgdmlzaWJsZVJlY3QgPSBuZXcgUmVjdCgpOworICAgICAgICAgICAgICAgIGlmIChjaGlsZC5nZXRHbG9iYWxWaXNpYmxlUmVjdCh2aXNpYmxlUmVjdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGNoaWxkIGlzIHBhcnRpYWxseSB2aXNpYmxlCisgICAgICAgICAgICAgICAgICAgIGludCBjaGlsZFJlY3RBcmVhID0gY2hpbGQuZ2V0V2lkdGgoKSAqIGNoaWxkLmdldEhlaWdodCgpOworICAgICAgICAgICAgICAgICAgICBpbnQgdmlzaWJsZVJlY3RBcmVhID0gdmlzaWJsZVJlY3Qud2lkdGgoKSAqIHZpc2libGVSZWN0LmhlaWdodCgpOworICAgICAgICAgICAgICAgICAgICBmbG9hdCB2aXNpYmxlQXJlYSA9ICh2aXNpYmxlUmVjdEFyZWEgLyAoZmxvYXQpIGNoaWxkUmVjdEFyZWEpOworICAgICAgICAgICAgICAgICAgICBmaW5hbCBmbG9hdCB2aXNpYmxlVGhyZXNob2xkID0gMC43NWY7CisgICAgICAgICAgICAgICAgICAgIGlmICgocG9zaXRpb24gPCAwKSAmJiAodmlzaWJsZUFyZWEgPCB2aXNpYmxlVGhyZXNob2xkKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHRvcCBpbmRleCBpcyBub3QgcGVyY2VpdmFibHkgdmlzaWJsZSBzbyBvZmZzZXQKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIGFjY291bnQgZm9yIHNob3dpbmcgdGhhdCB0b3AgaW5kZXggYXMgd2VsbAorICAgICAgICAgICAgICAgICAgICAgICAgKytpbmRleDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgocG9zaXRpb24gPiAwKSAmJiAodmlzaWJsZUFyZWEgPCB2aXNpYmxlVGhyZXNob2xkKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGJvdHRvbSBpbmRleCBpcyBub3QgcGVyY2VpdmFibHkgdmlzaWJsZSBzbyBvZmZzZXQKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIGFjY291bnQgZm9yIHNob3dpbmcgdGhhdCBib3R0b20gaW5kZXggYXMgd2VsbAorICAgICAgICAgICAgICAgICAgICAgICAgLS1pbmRleDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzbW9vdGhTY3JvbGxUb1Bvc2l0aW9uKE1hdGgubWF4KDAsIE1hdGgubWluKGdldENvdW50KCksIGluZGV4ICsgcG9zaXRpb24pKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKICAgICBwcml2YXRlIHZvaWQgY3JlYXRlU2Nyb2xsaW5nQ2FjaGUoKSB7CiAgICAgICAgIGlmIChtU2Nyb2xsaW5nQ2FjaGVFbmFibGVkICYmICFtQ2FjaGluZ1N0YXJ0ZWQpIHsKICAgICAgICAgICAgIHNldENoaWxkcmVuRHJhd25XaXRoQ2FjaGVFbmFibGVkKHRydWUpOwpAQCAtMzE1NSw2ICszNjkyLDcgQEAKIAogICAgICAgICBtUmVzdXJyZWN0VG9Qb3NpdGlvbiA9IElOVkFMSURfUE9TSVRJT047CiAgICAgICAgIHJlbW92ZUNhbGxiYWNrcyhtRmxpbmdSdW5uYWJsZSk7CisgICAgICAgIHJlbW92ZUNhbGxiYWNrcyhtUG9zaXRpb25TY3JvbGxlcik7CiAgICAgICAgIG1Ub3VjaE1vZGUgPSBUT1VDSF9NT0RFX1JFU1Q7CiAgICAgICAgIGNsZWFyU2Nyb2xsaW5nQ2FjaGUoKTsKICAgICAgICAgbVNwZWNpZmljVG9wID0gc2VsZWN0ZWRUb3A7CkBAIC0zODA4LDYgKzQzNDYsMzQgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBTZXRzIHVwIHRoaXMgQWJzTGlzdFZpZXcgdG8gdXNlIGEgcmVtb3RlIHZpZXdzIGFkYXB0ZXIgd2hpY2ggY29ubmVjdHMgdG8gYSBSZW1vdGVWaWV3c1NlcnZpY2UKKyAgICAgKiB0aHJvdWdoIHRoZSBzcGVjaWZpZWQgaW50ZW50LgorICAgICAqIEBwYXJhbSBpbnRlbnQgdGhlIGludGVudCB1c2VkIHRvIGlkZW50aWZ5IHRoZSBSZW1vdGVWaWV3c1NlcnZpY2UgZm9yIHRoZSBhZGFwdGVyIHRvIGNvbm5lY3QgdG8uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVtb3RlVmlld3NBZGFwdGVyKEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgbVJlbW90ZUFkYXB0ZXIgPSBuZXcgUmVtb3RlVmlld3NBZGFwdGVyKGdldENvbnRleHQoKSwgaW50ZW50LCB0aGlzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgYmFjayB3aGVuIHRoZSBhZGFwdGVyIGNvbm5lY3RzIHRvIHRoZSBSZW1vdGVWaWV3c1NlcnZpY2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25SZW1vdGVBZGFwdGVyQ29ubmVjdGVkKCkgeworICAgICAgICBpZiAobVJlbW90ZUFkYXB0ZXIgIT0gbUFkYXB0ZXIpIHsKKyAgICAgICAgICAgIHNldEFkYXB0ZXIobVJlbW90ZUFkYXB0ZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIGJhY2sgd2hlbiB0aGUgYWRhcHRlciBkaXNjb25uZWN0cyBmcm9tIHRoZSBSZW1vdGVWaWV3c1NlcnZpY2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25SZW1vdGVBZGFwdGVyRGlzY29ubmVjdGVkKCkgeworICAgICAgICBpZiAobVJlbW90ZUFkYXB0ZXIgPT0gbUFkYXB0ZXIpIHsKKyAgICAgICAgICAgIG1SZW1vdGVBZGFwdGVyID0gbnVsbDsKKyAgICAgICAgICAgIHNldEFkYXB0ZXIobnVsbCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKICAgICAgKiBTZXRzIHRoZSByZWN5Y2xlciBsaXN0ZW5lciB0byBiZSBub3RpZmllZCB3aGVuZXZlciBhIFZpZXcgaXMgc2V0IGFzaWRlIGluCiAgICAgICogdGhlIHJlY3ljbGVyIGZvciBsYXRlciByZXVzZS4gVGhpcyBsaXN0ZW5lciBjYW4gYmUgdXNlZCB0byBmcmVlIHJlc291cmNlcwogICAgICAqIGFzc29jaWF0ZWQgdG8gdGhlIFZpZXcuCkBAIC0zODIzLDYgKzQzODksNzUgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBBIE11bHRpQ2hvaWNlTW9kZUxpc3RlbmVyIHJlY2VpdmVzIGV2ZW50cyBmb3Ige0BsaW5rIEFic0xpc3RWaWV3I0NIT0lDRV9NT0RFX01VTFRJUExFX01PREFMfS4KKyAgICAgKiBJdCBhY3RzIGFzIHRoZSB7QGxpbmsgQWN0aW9uTW9kZS5DYWxsYmFja30gZm9yIHRoZSBzZWxlY3Rpb24gbW9kZSBhbmQgYWxzbyByZWNlaXZlcworICAgICAqIHtAbGluayAjb25JdGVtQ2hlY2tlZFN0YXRlQ2hhbmdlZChBY3Rpb25Nb2RlLCBpbnQsIGxvbmcsIGJvb2xlYW4pfSBldmVudHMgd2hlbiB0aGUgdXNlcgorICAgICAqIHNlbGVjdHMgYW5kIGRlc2VsZWN0cyBsaXN0IGl0ZW1zLgorICAgICAqLworICAgIHB1YmxpYyBpbnRlcmZhY2UgTXVsdGlDaG9pY2VNb2RlTGlzdGVuZXIgZXh0ZW5kcyBBY3Rpb25Nb2RlLkNhbGxiYWNrIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENhbGxlZCB3aGVuIGFuIGl0ZW0gaXMgY2hlY2tlZCBvciB1bmNoZWNrZWQgZHVyaW5nIHNlbGVjdGlvbiBtb2RlLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbW9kZSBUaGUge0BsaW5rIEFjdGlvbk1vZGV9IHByb3ZpZGluZyB0aGUgc2VsZWN0aW9uIG1vZGUKKyAgICAgICAgICogQHBhcmFtIHBvc2l0aW9uIEFkYXB0ZXIgcG9zaXRpb24gb2YgdGhlIGl0ZW0gdGhhdCB3YXMgY2hlY2tlZCBvciB1bmNoZWNrZWQKKyAgICAgICAgICogQHBhcmFtIGlkIEFkYXB0ZXIgSUQgb2YgdGhlIGl0ZW0gdGhhdCB3YXMgY2hlY2tlZCBvciB1bmNoZWNrZWQKKyAgICAgICAgICogQHBhcmFtIGNoZWNrZWQgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGl0ZW0gaXMgbm93IGNoZWNrZWQsIDxjb2RlPmZhbHNlPC9jb2RlPgorICAgICAgICAgKiAgICAgICAgICAgICAgICBpZiB0aGUgaXRlbSBpcyBub3cgdW5jaGVja2VkLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25JdGVtQ2hlY2tlZFN0YXRlQ2hhbmdlZChBY3Rpb25Nb2RlIG1vZGUsCisgICAgICAgICAgICAgICAgaW50IHBvc2l0aW9uLCBsb25nIGlkLCBib29sZWFuIGNoZWNrZWQpOworICAgIH0KKworICAgIGNsYXNzIE11bHRpQ2hvaWNlTW9kZVdyYXBwZXIgaW1wbGVtZW50cyBNdWx0aUNob2ljZU1vZGVMaXN0ZW5lciB7CisgICAgICAgIHByaXZhdGUgTXVsdGlDaG9pY2VNb2RlTGlzdGVuZXIgbVdyYXBwZWQ7CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0V3JhcHBlZChNdWx0aUNob2ljZU1vZGVMaXN0ZW5lciB3cmFwcGVkKSB7CisgICAgICAgICAgICBtV3JhcHBlZCA9IHdyYXBwZWQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbkNyZWF0ZUFjdGlvbk1vZGUoQWN0aW9uTW9kZSBtb2RlLCBNZW51IG1lbnUpIHsKKyAgICAgICAgICAgIGlmIChtV3JhcHBlZC5vbkNyZWF0ZUFjdGlvbk1vZGUobW9kZSwgbWVudSkpIHsKKyAgICAgICAgICAgICAgICAvLyBJbml0aWFsaXplIGNoZWNrZWQgZ3JhcGhpYyBzdGF0ZT8KKyAgICAgICAgICAgICAgICBzZXRMb25nQ2xpY2thYmxlKGZhbHNlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIG9uUHJlcGFyZUFjdGlvbk1vZGUoQWN0aW9uTW9kZSBtb2RlLCBNZW51IG1lbnUpIHsKKyAgICAgICAgICAgIHJldHVybiBtV3JhcHBlZC5vblByZXBhcmVBY3Rpb25Nb2RlKG1vZGUsIG1lbnUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gb25BY3Rpb25JdGVtQ2xpY2tlZChBY3Rpb25Nb2RlIG1vZGUsIE1lbnVJdGVtIGl0ZW0pIHsKKyAgICAgICAgICAgIHJldHVybiBtV3JhcHBlZC5vbkFjdGlvbkl0ZW1DbGlja2VkKG1vZGUsIGl0ZW0pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgb25EZXN0cm95QWN0aW9uTW9kZShBY3Rpb25Nb2RlIG1vZGUpIHsKKyAgICAgICAgICAgIG1XcmFwcGVkLm9uRGVzdHJveUFjdGlvbk1vZGUobW9kZSk7CisgICAgICAgICAgICBtQ2hvaWNlQWN0aW9uTW9kZSA9IG51bGw7CisKKyAgICAgICAgICAgIC8vIEVuZGluZyBzZWxlY3Rpb24gbW9kZSBtZWFucyBkZXNlbGVjdGluZyBldmVyeXRoaW5nLgorICAgICAgICAgICAgY2xlYXJDaG9pY2VzKCk7CisKKyAgICAgICAgICAgIG1EYXRhQ2hhbmdlZCA9IHRydWU7CisgICAgICAgICAgICByZW1lbWJlclN5bmNTdGF0ZSgpOworICAgICAgICAgICAgcmVxdWVzdExheW91dCgpOworCisgICAgICAgICAgICBzZXRMb25nQ2xpY2thYmxlKHRydWUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgb25JdGVtQ2hlY2tlZFN0YXRlQ2hhbmdlZChBY3Rpb25Nb2RlIG1vZGUsCisgICAgICAgICAgICAgICAgaW50IHBvc2l0aW9uLCBsb25nIGlkLCBib29sZWFuIGNoZWNrZWQpIHsKKyAgICAgICAgICAgIG1XcmFwcGVkLm9uSXRlbUNoZWNrZWRTdGF0ZUNoYW5nZWQobW9kZSwgcG9zaXRpb24sIGlkLCBjaGVja2VkKTsKKworICAgICAgICAgICAgLy8gSWYgdGhlcmUgYXJlIG5vIGl0ZW1zIHNlbGVjdGVkIHdlIG5vIGxvbmdlciBuZWVkIHRoZSBzZWxlY3Rpb24gbW9kZS4KKyAgICAgICAgICAgIGlmIChnZXRDaGVja2VkSXRlbUNvdW50KCkgPT0gMCkgeworICAgICAgICAgICAgICAgIG1vZGUuZmluaXNoKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKICAgICAgKiBBYnNMaXN0VmlldyBleHRlbmRzIExheW91dFBhcmFtcyB0byBwcm92aWRlIGEgcGxhY2UgdG8gaG9sZCB0aGUgdmlldyB0eXBlLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTGF5b3V0UGFyYW1zIGV4dGVuZHMgVmlld0dyb3VwLkxheW91dFBhcmFtcyB7CkBAIC00MTkwLDcgKzQ4MjUsNyBAQAogICAgICAgICAgICAgICAgICAgICBmaW5hbCBBcnJheUxpc3Q8Vmlldz4gc2NyYXAgPSBtU2NyYXBWaWV3c1tpXTsKICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHNjcmFwQ291bnQgPSBzY3JhcC5zaXplKCk7CiAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgc2NyYXBDb3VudDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzY3JhcC5nZXQoaSkuc2V0RHJhd2luZ0NhY2hlQmFja2dyb3VuZENvbG9yKGNvbG9yKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNjcmFwLmdldChqKS5zZXREcmF3aW5nQ2FjaGVCYWNrZ3JvdW5kQ29sb3IoY29sb3IpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0FkYXB0ZXJWaWV3QW5pbWF0b3IuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9BZGFwdGVyVmlld0FuaW1hdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZjOGU0NwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9BZGFwdGVyVmlld0FuaW1hdG9yLmphdmEKQEAgLTAsMCArMSw4MzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQud2lkZ2V0OworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKworaW1wb3J0IGFuZHJvaWQuYW5pbWF0aW9uLlByb3BlcnR5QW5pbWF0b3I7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7CitpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uOworaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uVXRpbHM7CisKKy8qKgorICogQmFzZSBjbGFzcyBmb3IgYSB7QGxpbmsgQWRhcHRlclZpZXd9IHRoYXQgd2lsbCBwZXJmb3JtIGFuaW1hdGlvbnMKKyAqIHdoZW4gc3dpdGNoaW5nIGJldHdlZW4gaXRzIHZpZXdzLgorICoKKyAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0FkYXB0ZXJWaWV3QW5pbWF0b3JfaW5BbmltYXRpb24KKyAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0FkYXB0ZXJWaWV3QW5pbWF0b3Jfb3V0QW5pbWF0aW9uCisgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNBZGFwdGVyVmlld0FuaW1hdG9yX2FuaW1hdGVGaXJzdFZpZXcKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFkYXB0ZXJWaWV3QW5pbWF0b3IgZXh0ZW5kcyBBZGFwdGVyVmlldzxBZGFwdGVyPgorICAgICAgICBpbXBsZW1lbnRzIFJlbW90ZVZpZXdzQWRhcHRlci5SZW1vdGVBZGFwdGVyQ29ubmVjdGlvbkNhbGxiYWNreworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiUmVtb3RlVmlld0FuaW1hdG9yIjsKKworICAgIC8qKgorICAgICAqIFRoZSBpbmRleCBvZiB0aGUgY3VycmVudCBjaGlsZCwgd2hpY2ggYXBwZWFycyBhbnl3aGVyZSBmcm9tIHRoZSBiZWdpbm5pbmcKKyAgICAgKiB0byB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IHNldCBvZiBjaGlsZHJlbiwgYXMgc3BlY2lmaWVkIGJ5IHtAbGluayAjbUFjdGl2ZU9mZnNldH0KKyAgICAgKi8KKyAgICBpbnQgbVdoaWNoQ2hpbGQgPSAwOworCisgICAgLyoqCisgICAgICogV2hldGhlciBvciBub3QgdGhlIGZpcnN0IHZpZXcocykgc2hvdWxkIGJlIGFuaW1hdGVkIGluCisgICAgICovCisgICAgYm9vbGVhbiBtQW5pbWF0ZUZpcnN0VGltZSA9IHRydWU7CisKKyAgICAvKioKKyAgICAgKiAgUmVwcmVzZW50cyB3aGVyZSB0aGUgaW4gdGhlIGN1cnJlbnQgd2luZG93IG9mCisgICAgICogIHZpZXdzIHRoZSBjdXJyZW50IDxjb2RlPm1EaXNwbGF5ZWRDaGlsZDwvY29kZT4gc2l0cworICAgICAqLworICAgIGludCBtQWN0aXZlT2Zmc2V0ID0gMDsKKworICAgIC8qKgorICAgICAqIFRoZSBudW1iZXIgb2Ygdmlld3MgdGhhdCB0aGUge0BsaW5rIEFkYXB0ZXJWaWV3QW5pbWF0b3J9IGtlZXBzIGFzIGNoaWxkcmVuIGF0IGFueQorICAgICAqIGdpdmVuIHRpbWUgKG5vdCBjb3VudGluZyB2aWV3cyB0aGF0IGFyZSBwZW5kaW5nIHJlbW92YWwsIHNlZSB7QGxpbmsgI21QcmV2aW91c1ZpZXdzfSkuCisgICAgICovCisgICAgaW50IG1OdW1BY3RpdmVWaWV3cyA9IDE7CisKKyAgICAvKioKKyAgICAgKiBBcnJheSBvZiB0aGUgY2hpbGRyZW4gb2YgdGhlIHtAbGluayBBZGFwdGVyVmlld0FuaW1hdG9yfS4gVGhpcyBhcnJheQorICAgICAqIGlzIGFjY2Vzc2VkIGluIGEgY2lyY3VsYXIgZmFzaGlvbgorICAgICAqLworICAgIFZpZXdbXSBtQWN0aXZlVmlld3M7CisKKyAgICAvKioKKyAgICAgKiBMaXN0IG9mIHZpZXdzIHBlbmRpbmcgcmVtb3ZhbCBmcm9tIHRoZSB7QGxpbmsgQWRhcHRlclZpZXdBbmltYXRvcn0KKyAgICAgKi8KKyAgICBBcnJheUxpc3Q8Vmlldz4gbVByZXZpb3VzVmlld3M7CisKKyAgICAvKioKKyAgICAgKiBUaGUgaW5kZXgsIHJlbGF0aXZlIHRvIHRoZSBhZGFwdGVyLCBvZiB0aGUgYmVnaW5uaW5nIG9mIHRoZSB3aW5kb3cgb2Ygdmlld3MKKyAgICAgKi8KKyAgICBpbnQgbUN1cnJlbnRXaW5kb3dTdGFydCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBUaGUgaW5kZXgsIHJlbGF0aXZlIHRvIHRoZSBhZGFwdGVyLCBvZiB0aGUgZW5kIG9mIHRoZSB3aW5kb3cgb2Ygdmlld3MKKyAgICAgKi8KKyAgICBpbnQgbUN1cnJlbnRXaW5kb3dFbmQgPSAtMTsKKworICAgIC8qKgorICAgICAqIFRoZSBzYW1lIGFzIHtAbGluayAjbUN1cnJlbnRXaW5kb3dTdGFydH0sIGV4Y2VwdCB3aGVuIHRoZSB3ZSBoYXZlIGJvdW5kZWQKKyAgICAgKiB7QGxpbmsgI21DdXJyZW50V2luZG93U3RhcnR9IHRvIGJlIG5vbi1uZWdhdGl2ZQorICAgICAqLworICAgIGludCBtQ3VycmVudFdpbmRvd1N0YXJ0VW5ib3VuZGVkID0gMDsKKworICAgIC8qKgorICAgICAqIEhhbmRsZXIgdG8gcG9zdCBldmVudHMgdG8gdGhlIG1haW4gdGhyZWFkCisgICAgICovCisgICAgSGFuZGxlciBtTWFpblF1ZXVlOworCisgICAgLyoqCisgICAgICogTGlzdGVucyBmb3IgZGF0YSBjaGFuZ2VzIGZyb20gdGhlIGFkYXB0ZXIKKyAgICAgKi8KKyAgICBBZGFwdGVyRGF0YVNldE9ic2VydmVyIG1EYXRhU2V0T2JzZXJ2ZXI7CisKKyAgICAvKioKKyAgICAgKiBUaGUge0BsaW5rIEFkYXB0ZXJ9IGZvciB0aGlzIHtAbGluayBBZGFwdGVyVmlld0FuaW1hdG9yfQorICAgICAqLworICAgIEFkYXB0ZXIgbUFkYXB0ZXI7CisKKyAgICAvKioKKyAgICAgKiBUaGUge0BsaW5rIFJlbW90ZVZpZXdzQWRhcHRlcn0gZm9yIHRoaXMge0BsaW5rIEFkYXB0ZXJWaWV3QW5pbWF0b3J9CisgICAgICovCisgICAgUmVtb3RlVmlld3NBZGFwdGVyIG1SZW1vdGVWaWV3c0FkYXB0ZXI7CisKKyAgICAvKioKKyAgICAgKiBTcGVjaWZpZXMgd2hldGhlciB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHRoZSBhbmltYXRvciBpcyBzaG93aW5nIHZpZXdzCisgICAgICovCisgICAgYm9vbGVhbiBtRmlyc3RUaW1lID0gdHJ1ZTsKKworICAgIC8qKgorICAgICAqIFNwZWNpZmllcyBpZiB0aGUgYW5pbWF0b3Igc2hvdWxkIHdyYXAgZnJvbSAwIHRvIHRoZSBlbmQgYW5kIHZpY2UgdmVyc2EKKyAgICAgKiBvciBoYXZlIGhhcmQgYm91bmRhcmllcyBhdCB0aGUgYmVnaW5uaW5nIGFuZCBlbmQKKyAgICAgKi8KKyAgICBib29sZWFuIG1TaG91bGRMb29wID0gdHJ1ZTsKKworICAgIC8qKgorICAgICAqIFRPRE86IEFuaW1hdGlvbiBzdHVmZiBpcyBzdGlsbCBpbiBmbHV4LCB3YWl0aW5nIG9uIHRoZSBuZXcgZnJhbWV3b3JrIHRvIHNldHRsZSBhIGJpdC4KKyAgICAgKi8KKyAgICBBbmltYXRpb24gbUluQW5pbWF0aW9uOworICAgIEFuaW1hdGlvbiBtT3V0QW5pbWF0aW9uOworICAgIHByaXZhdGUgIEFycmF5TGlzdDxWaWV3PiBtVmlld3NUb0JyaW5nVG9Gcm9udDsKKworICAgIHB1YmxpYyBBZGFwdGVyVmlld0FuaW1hdG9yKENvbnRleHQgY29udGV4dCkgeworICAgICAgICBzdXBlcihjb250ZXh0KTsKKyAgICAgICAgaW5pdFZpZXdBbmltYXRvcigpOworICAgIH0KKworICAgIHB1YmxpYyBBZGFwdGVyVmlld0FuaW1hdG9yKENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzKTsKKworICAgICAgICBUeXBlZEFycmF5IGEgPSBjb250ZXh0Lm9idGFpblN0eWxlZEF0dHJpYnV0ZXMoYXR0cnMsCisgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuVmlld0FuaW1hdG9yKTsKKyAgICAgICAgaW50IHJlc291cmNlID0gYS5nZXRSZXNvdXJjZUlkKAorICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLlZpZXdBbmltYXRvcl9pbkFuaW1hdGlvbiwgMCk7CisgICAgICAgIGlmIChyZXNvdXJjZSA+IDApIHsKKyAgICAgICAgICAgIHNldEluQW5pbWF0aW9uKGNvbnRleHQsIHJlc291cmNlKTsKKyAgICAgICAgfQorCisgICAgICAgIHJlc291cmNlID0gYS5nZXRSZXNvdXJjZUlkKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLlZpZXdBbmltYXRvcl9vdXRBbmltYXRpb24sIDApOworICAgICAgICBpZiAocmVzb3VyY2UgPiAwKSB7CisgICAgICAgICAgICBzZXRPdXRBbmltYXRpb24oY29udGV4dCwgcmVzb3VyY2UpOworICAgICAgICB9CisKKyAgICAgICAgYm9vbGVhbiBmbGFnID0gYS5nZXRCb29sZWFuKAorICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLlZpZXdBbmltYXRvcl9hbmltYXRlRmlyc3RWaWV3LCB0cnVlKTsKKyAgICAgICAgc2V0QW5pbWF0ZUZpcnN0VmlldyhmbGFnKTsKKworICAgICAgICBhLnJlY3ljbGUoKTsKKworICAgICAgICBpbml0Vmlld0FuaW1hdG9yKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZSB0aGlzIHtAbGluayBBZGFwdGVyVmlld0FuaW1hdG9yfQorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBpbml0Vmlld0FuaW1hdG9yKCkgeworICAgICAgICBtTWFpblF1ZXVlID0gbmV3IEhhbmRsZXIoTG9vcGVyLm15TG9vcGVyKCkpOworICAgICAgICBtQWN0aXZlVmlld3MgPSBuZXcgVmlld1ttTnVtQWN0aXZlVmlld3NdOworICAgICAgICBtUHJldmlvdXNWaWV3cyA9IG5ldyBBcnJheUxpc3Q8Vmlldz4oKTsKKyAgICAgICAgbVZpZXdzVG9CcmluZ1RvRnJvbnQgPSBuZXcgQXJyYXlMaXN0PFZpZXc+KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgaXMgdXNlZCBieSBzdWJjbGFzc2VzIHRvIGNvbmZpZ3VyZSB0aGUgYW5pbWF0b3IgdG8gZGlzcGxheSB0aGUKKyAgICAgKiBkZXNpcmVkIG51bWJlciBvZiB2aWV3cywgYW5kIHNwZWNpZnkgdGhlIG9mZnNldAorICAgICAqCisgICAgICogQHBhcmFtIG51bVZpc2libGVWaWV3cyBUaGUgbnVtYmVyIG9mIHZpZXdzIHRoZSBhbmltYXRvciBrZWVwcyBpbiB0aGUge0BsaW5rIFZpZXdHcm91cH0KKyAgICAgKiBAcGFyYW0gYWN0aXZlT2Zmc2V0IFRoaXMgcGFyYW1ldGVyIHNwZWNpZmllcyB3aGVyZSB0aGUgY3VycmVudCBpbmRleCAoe0BsaW5rICNtV2hpY2hDaGlsZH0pCisgICAgICogICAgICAgIHNpdHMgd2l0aGluIHRoZSB3aW5kb3cuIEZvciBleGFtcGxlIGlmIGFjdGl2ZU9mZnNldCBpcyAxLCBhbmQgbnVtVmlzaWJsZVZpZXdzIGlzIDMsCisgICAgICogICAgICAgIGFuZCB7QGxpbmsgI3NldERpc3BsYXllZENoaWxkKGludCl9IGlzIGNhbGxlZCB3aXRoIDEwLCB0aGVuIHRoZSBlZmZlY3RpdmUgd2luZG93IHdpbGwKKyAgICAgKiAgICAgICAgYmUgdGhlIGluZGV4ZXMgOSwgMTAsIGFuZCAxMS4gSW4gdGhlIHNhbWUgZXhhbXBsZSwgaWYgYWN0aXZlT2Zmc2V0IHdlcmUgMCwgdGhlbiB0aGUKKyAgICAgKiAgICAgICAgd2luZG93IHdvdWxkIGluc3RlYWQgY29udGFpbiBpbmRleGVzIDEwLCAxMSBhbmQgMTIuCisgICAgICogQHBhcmFtIHNob3VsZExvb3AgSWYgdGhlIGFuaW1hdG9yIGlzIHNob3cgdmlldyAwLCBhbmQgc2V0UHJldmlvdXMoKSBpcyBjYWxsZWQsIGRvIHdlCisgICAgICogICAgICAgIHdlIGxvb3AgYmFjayB0byB0aGUgZW5kLCBvciBkbyB3ZSBkbyBub3RoaW5nCisgICAgICovCisgICAgIHZvaWQgY29uZmlndXJlVmlld0FuaW1hdG9yKGludCBudW1WaXNpYmxlVmlld3MsIGludCBhY3RpdmVPZmZzZXQsIGJvb2xlYW4gc2hvdWxkTG9vcCkgeworICAgICAgICBpZiAoYWN0aXZlT2Zmc2V0ID4gbnVtVmlzaWJsZVZpZXdzIC0gMSkgeworICAgICAgICAgICAgLy8gVGhyb3cgYW4gZXhjZXB0aW9uIGhlcmUuCisgICAgICAgIH0KKyAgICAgICAgbU51bUFjdGl2ZVZpZXdzID0gbnVtVmlzaWJsZVZpZXdzOworICAgICAgICBtQWN0aXZlT2Zmc2V0ID0gYWN0aXZlT2Zmc2V0OworICAgICAgICBtQWN0aXZlVmlld3MgPSBuZXcgVmlld1ttTnVtQWN0aXZlVmlld3NdOworICAgICAgICBtUHJldmlvdXNWaWV3cy5jbGVhcigpOworICAgICAgICByZW1vdmVBbGxWaWV3c0luTGF5b3V0KCk7CisgICAgICAgIG1DdXJyZW50V2luZG93U3RhcnQgPSAwOworICAgICAgICBtQ3VycmVudFdpbmRvd0VuZCA9IC0xOworICAgICAgICBtU2hvdWxkTG9vcCA9IHNob3VsZExvb3A7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBjbGFzcyBzaG91bGQgYmUgb3ZlcnJpZGRlbiBieSBzdWJjbGFzc2VzIHRvIGN1c3RvbWl6ZSB2aWV3IHRyYW5zaXRpb25zIHdpdGhpbgorICAgICAqIHRoZSBzZXQgb2YgdmlzaWJsZSB2aWV3cworICAgICAqCisgICAgICogQHBhcmFtIGZyb21JbmRleCBUaGUgcmVsYXRpdmUgaW5kZXggd2l0aGluIHRoZSB3aW5kb3cgdGhhdCB0aGUgdmlldyB3YXMgaW4sIC0xIGlmIGl0IHdhc24ndAorICAgICAqICAgICAgICBpbiB0aGUgd2luZG93CisgICAgICogQHBhcmFtIHRvSW5kZXggVGhlIHJlbGF0aXZlIGluZGV4IHdpdGhpbiB0aGUgd2luZG93IHRoYXQgdGhlIHZpZXcgaXMgZ29pbmcgdG8sIC0xIGlmIGl0IGlzCisgICAgICogICAgICAgIGJlaW5nIHJlbW92ZWQKKyAgICAgKiBAcGFyYW0gdmlldyBUaGUgdmlldyB0aGF0IGlzIGJlaW5nIGFuaW1hdGVkCisgICAgICovCisgICAgdm9pZCBhbmltYXRlVmlld0ZvclRyYW5zaXRpb24oaW50IGZyb21JbmRleCwgaW50IHRvSW5kZXgsIFZpZXcgdmlldykgeworICAgICAgICBQcm9wZXJ0eUFuaW1hdG9yIHBhOworICAgICAgICBpZiAoZnJvbUluZGV4ID09IC0xKSB7CisgICAgICAgICAgICB2aWV3LnNldEFscGhhKDAuMGYpOworICAgICAgICAgICAgcGEgPSBuZXcgUHJvcGVydHlBbmltYXRvcig0MDAsIHZpZXcsICJhbHBoYSIsIDAuMGYsIDEuMGYpOworICAgICAgICAgICAgcGEuc3RhcnQoKTsKKyAgICAgICAgfSBlbHNlIGlmICh0b0luZGV4ID09IC0xKSB7CisgICAgICAgICAgICBwYSA9IG5ldyBQcm9wZXJ0eUFuaW1hdG9yKDQwMCwgdmlldywgImFscGhhIiwgMS4wZiwgMC4wZik7CisgICAgICAgICAgICBwYS5zdGFydCgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB3aGljaCBjaGlsZCB2aWV3IHdpbGwgYmUgZGlzcGxheWVkLgorICAgICAqCisgICAgICogQHBhcmFtIHdoaWNoQ2hpbGQgdGhlIGluZGV4IG9mIHRoZSBjaGlsZCB2aWV3IHRvIGRpc3BsYXkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREaXNwbGF5ZWRDaGlsZChpbnQgd2hpY2hDaGlsZCkgeworICAgICAgICBpZiAobUFkYXB0ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgbVdoaWNoQ2hpbGQgPSB3aGljaENoaWxkOworICAgICAgICAgICAgaWYgKHdoaWNoQ2hpbGQgPj0gbUFkYXB0ZXIuZ2V0Q291bnQoKSkgeworICAgICAgICAgICAgICAgIG1XaGljaENoaWxkID0gbVNob3VsZExvb3AgPyAwIDogbUFkYXB0ZXIuZ2V0Q291bnQoKSAtIDE7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHdoaWNoQ2hpbGQgPCAwKSB7CisgICAgICAgICAgICAgICAgbVdoaWNoQ2hpbGQgPSBtU2hvdWxkTG9vcCA/IG1BZGFwdGVyLmdldENvdW50KCkgLSAxIDogMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYm9vbGVhbiBoYXNGb2N1cyA9IGdldEZvY3VzZWRDaGlsZCgpICE9IG51bGw7CisgICAgICAgICAgICAvLyBUaGlzIHdpbGwgY2xlYXIgb2xkIGZvY3VzIGlmIHdlIGhhZCBpdAorICAgICAgICAgICAgc2hvd09ubHkobVdoaWNoQ2hpbGQpOworICAgICAgICAgICAgaWYgKGhhc0ZvY3VzKSB7CisgICAgICAgICAgICAgICAgLy8gVHJ5IHRvIHJldGFrZSBmb2N1cyBpZiB3ZSBoYWQgaXQKKyAgICAgICAgICAgICAgICByZXF1ZXN0Rm9jdXMoRk9DVVNfRk9SV0FSRCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gZGVmYXVsdCBpbkFuaW1hdGlvbi4gVG8gYmUgb3ZlcnJpZGVuIGJ5IHN1YmNsYXNzZXMuCisgICAgICovCisgICAgQW5pbWF0aW9uIGdldERlZmF1bHRJbkFuaW1hdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGRlZmF1bHQgb3V0QW5pbWF0aW9uLiBUbyBiZSBvdmVycmlkZGVuIGJ5IHN1YmNsYXNzZXMuCisgICAgICovCisgICAgQW5pbWF0aW9uIGdldERlZmF1bHRPdXRBbmltYXRpb24oKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRvIGJlIG92ZXJyaWRkZW4gYnkgc3ViY2xhc3Nlcy4gVGhpcyBtZXRob2QgYXBwbGllcyBhIHZpZXcgLyBpbmRleCBzcGVjaWZpYworICAgICAqIHRyYW5zZm9ybSB0byB0aGUgY2hpbGQgdmlldy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjaGlsZAorICAgICAqIEBwYXJhbSByZWxhdGl2ZUluZGV4CisgICAgICovCisgICAgdm9pZCBhcHBseVRyYW5zZm9ybUZvckNoaWxkQXRJbmRleChWaWV3IGNoaWxkLCBpbnQgcmVsYXRpdmVJbmRleCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBjdXJyZW50bHkgZGlzcGxheWVkIGNoaWxkIHZpZXcuCisgICAgICovCisgICAgcHVibGljIGludCBnZXREaXNwbGF5ZWRDaGlsZCgpIHsKKyAgICAgICAgcmV0dXJuIG1XaGljaENoaWxkOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1hbnVhbGx5IHNob3dzIHRoZSBuZXh0IGNoaWxkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNob3dOZXh0KCkgeworICAgICAgICBzZXREaXNwbGF5ZWRDaGlsZChtV2hpY2hDaGlsZCArIDEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1hbnVhbGx5IHNob3dzIHRoZSBwcmV2aW91cyBjaGlsZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzaG93UHJldmlvdXMoKSB7CisgICAgICAgIHNldERpc3BsYXllZENoaWxkKG1XaGljaENoaWxkIC0gMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2hvd3Mgb25seSB0aGUgc3BlY2lmaWVkIGNoaWxkLiBUaGUgb3RoZXIgZGlzcGxheXMgVmlld3MgZXhpdCB0aGUgc2NyZWVuLAorICAgICAqIG9wdGlvbmFsbHkgd2l0aCB0aGUgd2l0aCB0aGUge0BsaW5rICNnZXRPdXRBbmltYXRpb24oKSBvdXQgYW5pbWF0aW9ufSBhbmQKKyAgICAgKiB0aGUgc3BlY2lmaWVkIGNoaWxkIGVudGVycyB0aGUgc2NyZWVuLCBvcHRpb25hbGx5IHdpdGggdGhlCisgICAgICoge0BsaW5rICNnZXRJbkFuaW1hdGlvbigpIGluIGFuaW1hdGlvbn0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2hpbGRJbmRleCBUaGUgaW5kZXggb2YgdGhlIGNoaWxkIHRvIGJlIHNob3duLgorICAgICAqIEBwYXJhbSBhbmltYXRlIFdoZXRoZXIgb3Igbm90IHRvIHVzZSB0aGUgaW4gYW5kIG91dCBhbmltYXRpb25zLCBkZWZhdWx0cworICAgICAqICAgICAgICAgICAgdG8gdHJ1ZS4KKyAgICAgKi8KKyAgICB2b2lkIHNob3dPbmx5KGludCBjaGlsZEluZGV4LCBib29sZWFuIGFuaW1hdGUpIHsKKyAgICAgICAgc2hvd09ubHkoY2hpbGRJbmRleCwgYW5pbWF0ZSwgZmFsc2UpOworICAgIH0KKworICAgIHByaXZhdGUgaW50IG1vZHVsbyhpbnQgcG9zLCBpbnQgc2l6ZSkgeworICAgICAgICByZXR1cm4gKHNpemUgKyAocG9zICUgc2l6ZSkpICUgc2l6ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHZpZXcgYXQgdGhpcyBpbmRleCByZWxhdGl2ZSB0byB0aGUgY3VycmVudCB3aW5kb3cncyBzdGFydAorICAgICAqCisgICAgICogQHBhcmFtIHJlbGF0aXZlSW5kZXggUG9zaXRpb24gcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgd2luZG93J3Mgc3RhcnQKKyAgICAgKiBAcmV0dXJuIFZpZXcgYXQgdGhpcyBpbmRleCwgbnVsbCBpZiB0aGUgaW5kZXggaXMgb3V0c2lkZSB0aGUgYm91bmRzCisgICAgICovCisgICAgVmlldyBnZXRWaWV3QXRSZWxhdGl2ZUluZGV4KGludCByZWxhdGl2ZUluZGV4KSB7CisgICAgICAgIGlmIChyZWxhdGl2ZUluZGV4ID49IDAgJiYgcmVsYXRpdmVJbmRleCA8PSBtTnVtQWN0aXZlVmlld3MgLSAxKSB7CisgICAgICAgICAgICBpbnQgaW5kZXggPSBtQ3VycmVudFdpbmRvd1N0YXJ0VW5ib3VuZGVkICsgcmVsYXRpdmVJbmRleDsKKyAgICAgICAgICAgIHJldHVybiBtQWN0aXZlVmlld3NbbW9kdWxvKGluZGV4LCBtTnVtQWN0aXZlVmlld3MpXTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwcml2YXRlIExheW91dFBhcmFtcyBjcmVhdGVPclJldXNlTGF5b3V0UGFyYW1zKFZpZXcgdikgeworICAgICAgICBmaW5hbCBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zIGN1cnJlbnRMcCA9IHYuZ2V0TGF5b3V0UGFyYW1zKCk7CisgICAgICAgIGlmIChjdXJyZW50THAgaW5zdGFuY2VvZiBMYXlvdXRQYXJhbXMpIHsKKyAgICAgICAgICAgIExheW91dFBhcmFtcyBscCA9IChMYXlvdXRQYXJhbXMpIGN1cnJlbnRMcDsKKyAgICAgICAgICAgIGxwLnNldEhvcml6b250YWxPZmZzZXQoMCk7CisgICAgICAgICAgICBscC5zZXRWZXJ0aWNhbE9mZnNldCgwKTsKKyAgICAgICAgICAgIHJldHVybiBscDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV3IExheW91dFBhcmFtcyh2KTsKKyAgICB9CisKKyAgICB2b2lkIHNob3dPbmx5KGludCBjaGlsZEluZGV4LCBib29sZWFuIGFuaW1hdGUsIGJvb2xlYW4gb25MYXlvdXQpIHsKKyAgICAgICAgaWYgKG1BZGFwdGVyID09IG51bGwpIHJldHVybjsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1QcmV2aW91c1ZpZXdzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBWaWV3IHZpZXdUb1JlbW92ZSA9IG1QcmV2aW91c1ZpZXdzLmdldChpKTsKKyAgICAgICAgICAgIHZpZXdUb1JlbW92ZS5jbGVhckFuaW1hdGlvbigpOworICAgICAgICAgICAgaWYgKHZpZXdUb1JlbW92ZSBpbnN0YW5jZW9mIFZpZXdHcm91cCkgeworICAgICAgICAgICAgICAgIFZpZXdHcm91cCB2ZyA9IChWaWV3R3JvdXApIHZpZXdUb1JlbW92ZTsKKyAgICAgICAgICAgICAgICB2Zy5yZW1vdmVBbGxWaWV3c0luTGF5b3V0KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBhcHBseVRyYW5zZm9ybUZvckNoaWxkQXRJbmRleCBoZXJlIGp1c3QgYWxsb3dzIGZvciBhbnkgY2xlYW51cAorICAgICAgICAgICAgLy8gYXNzb2NpYXRlZCB3aXRoIHRoaXMgdmlldyB0aGF0IG1heSBuZWVkIHRvIGJlIGRvbmUgYnkgYSBzdWJjbGFzcworICAgICAgICAgICAgYXBwbHlUcmFuc2Zvcm1Gb3JDaGlsZEF0SW5kZXgodmlld1RvUmVtb3ZlLCAtMSk7CisKKyAgICAgICAgICAgIHJlbW92ZVZpZXdJbkxheW91dCh2aWV3VG9SZW1vdmUpOworICAgICAgICB9CisgICAgICAgIG1QcmV2aW91c1ZpZXdzLmNsZWFyKCk7CisgICAgICAgIGludCBuZXdXaW5kb3dTdGFydFVuYm91bmRlZCA9IGNoaWxkSW5kZXggLSBtQWN0aXZlT2Zmc2V0OworICAgICAgICBpbnQgbmV3V2luZG93RW5kVW5ib3VuZGVkID0gbmV3V2luZG93U3RhcnRVbmJvdW5kZWQgKyBtTnVtQWN0aXZlVmlld3MgLSAxOworICAgICAgICBpbnQgbmV3V2luZG93U3RhcnQgPSBNYXRoLm1heCgwLCBuZXdXaW5kb3dTdGFydFVuYm91bmRlZCk7CisgICAgICAgIGludCBuZXdXaW5kb3dFbmQgPSBNYXRoLm1pbihtQWRhcHRlci5nZXRDb3VudCgpLCBuZXdXaW5kb3dFbmRVbmJvdW5kZWQpOworCisgICAgICAgIC8vIFRoaXMgc2VjdGlvbiBjbGVhcnMgb3V0IGFueSBpdGVtcyB0aGF0IGFyZSBpbiBvdXIgbUFjdGl2ZVZpZXdzIGxpc3QKKyAgICAgICAgLy8gYnV0IGFyZSBvdXRzaWRlIHRoZSBlZmZlY3RpdmUgYm91bmRzIG9mIG91ciB3aW5kb3cgKHRoaXMgaXMgYmVjb21lcyBhbiBpc3N1ZQorICAgICAgICAvLyBhdCB0aGUgZXh0cmVtaXRpZXMgb2YgdGhlIGxpc3QsIGVnLiB3aGVyZSBuZXdXaW5kb3dTdGFydFVuYm91bmRlZCA8IDAgb3IKKyAgICAgICAgLy8gbmV3V2luZG93RW5kVW5ib3VuZGVkID4gbUFkYXB0ZXIuZ2V0Q291bnQoKSAtIDEKKyAgICAgICAgZm9yIChpbnQgaSA9IG5ld1dpbmRvd1N0YXJ0VW5ib3VuZGVkOyBpIDwgbmV3V2luZG93RW5kVW5ib3VuZGVkOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChpIDwgbmV3V2luZG93U3RhcnQgfHwgaSA+IG5ld1dpbmRvd0VuZCkgeworICAgICAgICAgICAgICAgIGludCBpbmRleCA9IG1vZHVsbyhpLCBtTnVtQWN0aXZlVmlld3MpOworICAgICAgICAgICAgICAgIGlmIChtQWN0aXZlVmlld3NbaW5kZXhdICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgVmlldyBwcmV2aW91c1ZpZXcgPSBtQWN0aXZlVmlld3NbaW5kZXhdOworICAgICAgICAgICAgICAgICAgICBtUHJldmlvdXNWaWV3cy5hZGQocHJldmlvdXNWaWV3KTsKKyAgICAgICAgICAgICAgICAgICAgaW50IHByZXZpb3VzVmlld1JlbGF0aXZlSW5kZXggPSBtb2R1bG8oaW5kZXggLSBtQ3VycmVudFdpbmRvd1N0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1OdW1BY3RpdmVWaWV3cyk7CisgICAgICAgICAgICAgICAgICAgIGFuaW1hdGVWaWV3Rm9yVHJhbnNpdGlvbihwcmV2aW91c1ZpZXdSZWxhdGl2ZUluZGV4LCAtMSwgcHJldmlvdXNWaWV3KTsKKyAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZVZpZXdzW2luZGV4XSA9IG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gSWYgdGhlIHdpbmRvdyBoYXMgY2hhbmdlZAorICAgICAgICBpZiAoISAobmV3V2luZG93U3RhcnQgPT0gbUN1cnJlbnRXaW5kb3dTdGFydCAmJiBuZXdXaW5kb3dFbmQgPT0gbUN1cnJlbnRXaW5kb3dFbmQpKSB7CisgICAgICAgICAgICAvLyBSdW4gdGhyb3VnaCB0aGUgaW5kaWNlcyBpbiB0aGUgbmV3IHJhbmdlCisgICAgICAgICAgICBmb3IgKGludCBpID0gbmV3V2luZG93U3RhcnQ7IGkgPD0gbmV3V2luZG93RW5kOyBpKyspIHsKKworICAgICAgICAgICAgICAgIGludCBvbGRSZWxhdGl2ZUluZGV4ID0gaSAtIG1DdXJyZW50V2luZG93U3RhcnRVbmJvdW5kZWQ7CisgICAgICAgICAgICAgICAgaW50IG5ld1JlbGF0aXZlSW5kZXggPSBpIC0gbmV3V2luZG93U3RhcnRVbmJvdW5kZWQ7CisgICAgICAgICAgICAgICAgaW50IGluZGV4ID0gbW9kdWxvKGksIG1OdW1BY3RpdmVWaWV3cyk7CisKKyAgICAgICAgICAgICAgICAvLyBJZiB0aGlzIGl0ZW0gaXMgaW4gdGhlIGN1cnJlbnQgd2luZG93LCBncmVhdCwgd2UganVzdCBuZWVkIHRvIGFwcGx5CisgICAgICAgICAgICAgICAgLy8gdGhlIHRyYW5zZm9ybSBmb3IgaXQncyBuZXcgcmVsYXRpdmUgcG9zaXRpb24gaW4gdGhlIHdpbmRvdywgYW5kIGFuaW1hdGUKKyAgICAgICAgICAgICAgICAvLyBiZXR3ZWVuIGl0J3MgY3VycmVudCBhbmQgbmV3IHJlbGF0aXZlIHBvc2l0aW9ucworICAgICAgICAgICAgICAgIGlmIChpID49IG1DdXJyZW50V2luZG93U3RhcnQgJiYgaSA8PSBtQ3VycmVudFdpbmRvd0VuZCkgeworICAgICAgICAgICAgICAgICAgICBWaWV3IHZpZXcgPSBtQWN0aXZlVmlld3NbaW5kZXhdOworICAgICAgICAgICAgICAgICAgICBhcHBseVRyYW5zZm9ybUZvckNoaWxkQXRJbmRleCh2aWV3LCBuZXdSZWxhdGl2ZUluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgYW5pbWF0ZVZpZXdGb3JUcmFuc2l0aW9uKG9sZFJlbGF0aXZlSW5kZXgsIG5ld1JlbGF0aXZlSW5kZXgsIHZpZXcpOworCisgICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlIHRoaXMgdmlldyBpcyBuZXcsIHNvIGZpcnN0IHdlIGhhdmUgdG8gZGlzcGxhY2UgdGhlIHZpZXcgdGhhdCdzCisgICAgICAgICAgICAgICAgLy8gdGFraW5nIHRoZSBuZXcgdmlldydzIHBsYWNlIHdpdGhpbiBvdXIgY2FjaGUgKGEgY2lyY3VsYXIgYXJyYXkpCisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1BY3RpdmVWaWV3c1tpbmRleF0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgVmlldyBwcmV2aW91c1ZpZXcgPSBtQWN0aXZlVmlld3NbaW5kZXhdOworICAgICAgICAgICAgICAgICAgICAgICAgbVByZXZpb3VzVmlld3MuYWRkKHByZXZpb3VzVmlldyk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcHJldmlvdXNWaWV3UmVsYXRpdmVJbmRleCA9IG1vZHVsbyhpbmRleCAtIG1DdXJyZW50V2luZG93U3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1OdW1BY3RpdmVWaWV3cyk7CisgICAgICAgICAgICAgICAgICAgICAgICBhbmltYXRlVmlld0ZvclRyYW5zaXRpb24ocHJldmlvdXNWaWV3UmVsYXRpdmVJbmRleCwgLTEsIHByZXZpb3VzVmlldyk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQ3VycmVudFdpbmRvd1N0YXJ0ID4gbmV3V2luZG93U3RhcnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVmlld3NUb0JyaW5nVG9Gcm9udC5hZGQocHJldmlvdXNWaWV3KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIFdlJ3ZlIGNsZWFyZWQgYSBzcG90IGZvciB0aGUgbmV3IHZpZXcuIEdldCBpdCBmcm9tIHRoZSBhZGFwdGVyLCBhZGQgaXQKKyAgICAgICAgICAgICAgICAgICAgLy8gYW5kIGFwcGx5IGFueSB0cmFuc2Zvcm0gLyBhbmltYXRpb24KKyAgICAgICAgICAgICAgICAgICAgVmlldyBuZXdWaWV3ID0gbUFkYXB0ZXIuZ2V0VmlldyhpLCBudWxsLCB0aGlzKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1ZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2Ugd3JhcCB0aGUgbmV3IHZpZXcgaW4gYSBGcmFtZUxheW91dCBzbyBhcyB0byByZXNwZWN0IHRoZSBjb250cmFjdAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2l0aCB0aGUgYWRhcHRlciwgdGhhdCBpcywgdGhhdCB3ZSBkb24ndCBtb2RpZnkgdGhpcyB2aWV3IGRpcmVjdGx5CisgICAgICAgICAgICAgICAgICAgICAgICBGcmFtZUxheW91dCBmbCA9IG5ldyBGcmFtZUxheW91dChtQ29udGV4dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBmbC5hZGRWaWV3KG5ld1ZpZXcpOworICAgICAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZVZpZXdzW2luZGV4XSA9IGZsOworICAgICAgICAgICAgICAgICAgICAgICAgYWRkVmlld0luTGF5b3V0KGZsLCAtMSwgY3JlYXRlT3JSZXVzZUxheW91dFBhcmFtcyhmbCkpOworICAgICAgICAgICAgICAgICAgICAgICAgYXBwbHlUcmFuc2Zvcm1Gb3JDaGlsZEF0SW5kZXgoZmwsIG5ld1JlbGF0aXZlSW5kZXgpOworICAgICAgICAgICAgICAgICAgICAgICAgYW5pbWF0ZVZpZXdGb3JUcmFuc2l0aW9uKC0xLCBuZXdSZWxhdGl2ZUluZGV4LCBmbCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbUFjdGl2ZVZpZXdzW2luZGV4XS5icmluZ1RvRnJvbnQoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtVmlld3NUb0JyaW5nVG9Gcm9udC5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIFZpZXcgdiA9IG1WaWV3c1RvQnJpbmdUb0Zyb250LmdldChpKTsKKyAgICAgICAgICAgICAgICB2LmJyaW5nVG9Gcm9udCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVZpZXdzVG9CcmluZ1RvRnJvbnQuY2xlYXIoKTsKKworICAgICAgICAgICAgbUN1cnJlbnRXaW5kb3dTdGFydCA9IG5ld1dpbmRvd1N0YXJ0OworICAgICAgICAgICAgbUN1cnJlbnRXaW5kb3dFbmQgPSBuZXdXaW5kb3dFbmQ7CisgICAgICAgICAgICBtQ3VycmVudFdpbmRvd1N0YXJ0VW5ib3VuZGVkID0gbmV3V2luZG93U3RhcnRVbmJvdW5kZWQ7CisgICAgICAgIH0KKworICAgICAgICBtRmlyc3RUaW1lID0gZmFsc2U7CisgICAgICAgIGlmICghb25MYXlvdXQpIHsKKyAgICAgICAgICAgIHJlcXVlc3RMYXlvdXQoKTsKKyAgICAgICAgICAgIGludmFsaWRhdGUoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIElmIHRoZSBBZGFwdGVyIHRyaWVzIHRvIGxheW91dCB0aGUgY3VycmVudCB2aWV3IHdoZW4gd2UgZ2V0IGl0IHVzaW5nIGdldFZpZXcKKyAgICAgICAgICAgIC8vIGFib3ZlIHRoZSBsYXlvdXQgd2lsbCBlbmQgdXAgYmVpbmcgaWdub3JlZCBzaW5jZSB3ZSBhcmUgY3VycmVudGx5IGxheWluZyBvdXQsIHNvCisgICAgICAgICAgICAvLyB3ZSBwb3N0IGEgZGVsYXllZCByZXF1ZXN0TGF5b3V0IGFuZCBpbnZhbGlkYXRlCisgICAgICAgICAgICBtTWFpblF1ZXVlLnBvc3QobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVxdWVzdExheW91dCgpOworICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkxheW91dChib29sZWFuIGNoYW5nZWQsIGludCBsZWZ0LCBpbnQgdG9wLCBpbnQgcmlnaHQsIGludCBib3R0b20pIHsKKyAgICAgICAgYm9vbGVhbiBkYXRhQ2hhbmdlZCA9IG1EYXRhQ2hhbmdlZDsKKyAgICAgICAgaWYgKGRhdGFDaGFuZ2VkKSB7CisgICAgICAgICAgICBoYW5kbGVEYXRhQ2hhbmdlZCgpOworCisgICAgICAgICAgICAvLyBpZiB0aGUgZGF0YSBjaGFuZ2VzLCBtV2hpY2hDaGlsZCBtaWdodCBiZSBvdXQgb2YgdGhlIGJvdW5kcyBvZiB0aGUgYWRhcHRlcgorICAgICAgICAgICAgLy8gaW4gdGhpcyBjYXNlLCB3ZSByZXNldCBtV2hpY2hDaGlsZCB0byB0aGUgYmVnaW5uaW5nCisgICAgICAgICAgICBpZiAobVdoaWNoQ2hpbGQgPj0gbUFkYXB0ZXIuZ2V0Q291bnQoKSkKKyAgICAgICAgICAgICAgICBtV2hpY2hDaGlsZCA9IDA7CisKKyAgICAgICAgICAgIHNob3dPbmx5KG1XaGljaENoaWxkLCB0cnVlLCB0cnVlKTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIGludCBjaGlsZENvdW50ID0gZ2V0Q2hpbGRDb3VudCgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkQ291bnQ7IGkrKykgeworICAgICAgICAgICAgZmluYWwgVmlldyBjaGlsZCA9IGdldENoaWxkQXQoaSk7CisKKyAgICAgICAgICAgIGludCBjaGlsZFJpZ2h0ID0gbVBhZGRpbmdMZWZ0ICsgY2hpbGQuZ2V0TWVhc3VyZWRXaWR0aCgpOworICAgICAgICAgICAgaW50IGNoaWxkQm90dG9tID0gbVBhZGRpbmdUb3AgKyBjaGlsZC5nZXRNZWFzdXJlZEhlaWdodCgpOworICAgICAgICAgICAgTGF5b3V0UGFyYW1zIGxwID0gKExheW91dFBhcmFtcykgY2hpbGQuZ2V0TGF5b3V0UGFyYW1zKCk7CisKKyAgICAgICAgICAgIGNoaWxkLmxheW91dChtUGFkZGluZ0xlZnQgKyBscC5ob3Jpem9udGFsT2Zmc2V0LCBtUGFkZGluZ1RvcCArIGxwLnZlcnRpY2FsT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICBjaGlsZFJpZ2h0ICsgbHAuaG9yaXpvbnRhbE9mZnNldCwgY2hpbGRCb3R0b20gKyBscC52ZXJ0aWNhbE9mZnNldCk7CisgICAgICAgIH0KKyAgICAgICAgbURhdGFDaGFuZ2VkID0gZmFsc2U7CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIFNhdmVkU3RhdGUgZXh0ZW5kcyBCYXNlU2F2ZWRTdGF0ZSB7CisgICAgICAgIGludCB3aGljaENoaWxkOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDb25zdHJ1Y3RvciBjYWxsZWQgZnJvbSB7QGxpbmsgQWRhcHRlclZpZXdBbmltYXRvciNvblNhdmVJbnN0YW5jZVN0YXRlKCl9CisgICAgICAgICAqLworICAgICAgICBTYXZlZFN0YXRlKFBhcmNlbGFibGUgc3VwZXJTdGF0ZSwgaW50IHdoaWNoQ2hpbGQpIHsKKyAgICAgICAgICAgIHN1cGVyKHN1cGVyU3RhdGUpOworICAgICAgICAgICAgdGhpcy53aGljaENoaWxkID0gd2hpY2hDaGlsZDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDb25zdHJ1Y3RvciBjYWxsZWQgZnJvbSB7QGxpbmsgI0NSRUFUT1J9CisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIFNhdmVkU3RhdGUoUGFyY2VsIGluKSB7CisgICAgICAgICAgICBzdXBlcihpbik7CisgICAgICAgICAgICB3aGljaENoaWxkID0gaW4ucmVhZEludCgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlVG9QYXJjZWwoUGFyY2VsIG91dCwgaW50IGZsYWdzKSB7CisgICAgICAgICAgICBzdXBlci53cml0ZVRvUGFyY2VsKG91dCwgZmxhZ3MpOworICAgICAgICAgICAgb3V0LndyaXRlSW50KHdoaWNoQ2hpbGQpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gIkFkYXB0ZXJWaWV3QW5pbWF0b3IuU2F2ZWRTdGF0ZXsgd2hpY2hDaGlsZCA9ICIgKyB3aGljaENoaWxkICsgIiB9IjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUGFyY2VsYWJsZS5DcmVhdG9yPFNhdmVkU3RhdGU+IENSRUFUT1IKKyAgICAgICAgICAgICAgICA9IG5ldyBQYXJjZWxhYmxlLkNyZWF0b3I8U2F2ZWRTdGF0ZT4oKSB7CisgICAgICAgICAgICBwdWJsaWMgU2F2ZWRTdGF0ZSBjcmVhdGVGcm9tUGFyY2VsKFBhcmNlbCBpbikgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU2F2ZWRTdGF0ZShpbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBTYXZlZFN0YXRlW10gbmV3QXJyYXkoaW50IHNpemUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNhdmVkU3RhdGVbc2l6ZV07CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFBhcmNlbGFibGUgb25TYXZlSW5zdGFuY2VTdGF0ZSgpIHsKKyAgICAgICAgUGFyY2VsYWJsZSBzdXBlclN0YXRlID0gc3VwZXIub25TYXZlSW5zdGFuY2VTdGF0ZSgpOworICAgICAgICByZXR1cm4gbmV3IFNhdmVkU3RhdGUoc3VwZXJTdGF0ZSwgbVdoaWNoQ2hpbGQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uUmVzdG9yZUluc3RhbmNlU3RhdGUoUGFyY2VsYWJsZSBzdGF0ZSkgeworICAgICAgICBTYXZlZFN0YXRlIHNzID0gKFNhdmVkU3RhdGUpIHN0YXRlOworICAgICAgICBzdXBlci5vblJlc3RvcmVJbnN0YW5jZVN0YXRlKHNzLmdldFN1cGVyU3RhdGUoKSk7CisKKyAgICAgICAgLy8gSGVyZSB3ZSBzZXQgbVdoaWNoQ2hpbGQgaW4gYWRkaXRpb24gdG8gc2V0RGlzcGxheWVkQ2hpbGQKKyAgICAgICAgLy8gV2UgZG8gdGhlIGZvcm1lciBpbiBjYXNlIG1BZGFwdGVyIGlzIG51bGwsIGFuZCBoZW5jZSBzZXREaXNwbGF5ZWRDaGlsZCB3b24ndAorICAgICAgICAvLyBzZXQgbVdoaWNoQ2hpbGQKKyAgICAgICAgbVdoaWNoQ2hpbGQgPSBzcy53aGljaENoaWxkOworICAgICAgICBzZXREaXNwbGF5ZWRDaGlsZChtV2hpY2hDaGlsZCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25NZWFzdXJlKGludCB3aWR0aE1lYXN1cmVTcGVjLCBpbnQgaGVpZ2h0TWVhc3VyZVNwZWMpIHsKKyAgICAgICAgZmluYWwgaW50IGNvdW50ID0gZ2V0Q2hpbGRDb3VudCgpOworCisgICAgICAgIGludCB3aWR0aFNwZWNTaXplID0gTWVhc3VyZVNwZWMuZ2V0U2l6ZSh3aWR0aE1lYXN1cmVTcGVjKTsKKyAgICAgICAgaW50IGhlaWdodFNwZWNTaXplID0gTWVhc3VyZVNwZWMuZ2V0U2l6ZShoZWlnaHRNZWFzdXJlU3BlYyk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICBmaW5hbCBWaWV3IGNoaWxkID0gZ2V0Q2hpbGRBdChpKTsKKworICAgICAgICAgICAgZmluYWwgTGF5b3V0UGFyYW1zIGxwID0gKExheW91dFBhcmFtcykgY2hpbGQuZ2V0TGF5b3V0UGFyYW1zKCk7CisKKyAgICAgICAgICAgIGxwLndpZHRoID0gd2lkdGhTcGVjU2l6ZSAtIG1QYWRkaW5nTGVmdCAtIG1QYWRkaW5nUmlnaHQ7CisgICAgICAgICAgICBscC5oZWlnaHQgPSBoZWlnaHRTcGVjU2l6ZSAtIG1QYWRkaW5nVG9wIC0gbVBhZGRpbmdCb3R0b207CisKKyAgICAgICAgICAgIGludCBjaGlsZFdpZHRoTWVhc3VyZVNwZWMgPSBNZWFzdXJlU3BlYy5tYWtlTWVhc3VyZVNwZWMobHAud2lkdGgsCisgICAgICAgICAgICAgICAgICAgIE1lYXN1cmVTcGVjLkVYQUNUTFkpOworICAgICAgICAgICAgaW50IGNoaWxkaGVpZ2h0TWVhc3VyZVNwZWMgPSBNZWFzdXJlU3BlYy5tYWtlTWVhc3VyZVNwZWMobHAuaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICBNZWFzdXJlU3BlYy5FWEFDVExZKTsKKworICAgICAgICAgICAgY2hpbGQubWVhc3VyZShjaGlsZFdpZHRoTWVhc3VyZVNwZWMsIGNoaWxkaGVpZ2h0TWVhc3VyZVNwZWMpOworICAgICAgICB9CisgICAgICAgIHNldE1lYXN1cmVkRGltZW5zaW9uKHdpZHRoU3BlY1NpemUsIGhlaWdodFNwZWNTaXplKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTaG93cyBvbmx5IHRoZSBzcGVjaWZpZWQgY2hpbGQuIFRoZSBvdGhlciBkaXNwbGF5cyBWaWV3cyBleGl0IHRoZSBzY3JlZW4KKyAgICAgKiB3aXRoIHRoZSB7QGxpbmsgI2dldE91dEFuaW1hdGlvbigpIG91dCBhbmltYXRpb259IGFuZCB0aGUgc3BlY2lmaWVkIGNoaWxkCisgICAgICogZW50ZXJzIHRoZSBzY3JlZW4gd2l0aCB0aGUge0BsaW5rICNnZXRJbkFuaW1hdGlvbigpIGluIGFuaW1hdGlvbn0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2hpbGRJbmRleCBUaGUgaW5kZXggb2YgdGhlIGNoaWxkIHRvIGJlIHNob3duLgorICAgICAqLworICAgIHZvaWQgc2hvd09ubHkoaW50IGNoaWxkSW5kZXgpIHsKKyAgICAgICAgZmluYWwgYm9vbGVhbiBhbmltYXRlID0gKCFtRmlyc3RUaW1lIHx8IG1BbmltYXRlRmlyc3RUaW1lKTsKKyAgICAgICAgc2hvd09ubHkoY2hpbGRJbmRleCwgYW5pbWF0ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgVmlldyBjb3JyZXNwb25kaW5nIHRvIHRoZSBjdXJyZW50bHkgZGlzcGxheWVkIGNoaWxkLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgVmlldyBjdXJyZW50bHkgZGlzcGxheWVkLgorICAgICAqCisgICAgICogQHNlZSAjZ2V0RGlzcGxheWVkQ2hpbGQoKQorICAgICAqLworICAgIHB1YmxpYyBWaWV3IGdldEN1cnJlbnRWaWV3KCkgeworICAgICAgICByZXR1cm4gZ2V0Vmlld0F0UmVsYXRpdmVJbmRleChtQWN0aXZlT2Zmc2V0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGFuaW1hdGlvbiB1c2VkIHRvIGFuaW1hdGUgYSBWaWV3IHRoYXQgZW50ZXJzIHRoZSBzY3JlZW4uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEFuIEFuaW1hdGlvbiBvciBudWxsIGlmIG5vbmUgaXMgc2V0LgorICAgICAqCisgICAgICogQHNlZSAjc2V0SW5BbmltYXRpb24oYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb24pCisgICAgICogQHNlZSAjc2V0SW5BbmltYXRpb24oYW5kcm9pZC5jb250ZW50LkNvbnRleHQsIGludCkKKyAgICAgKi8KKyAgICBwdWJsaWMgQW5pbWF0aW9uIGdldEluQW5pbWF0aW9uKCkgeworICAgICAgICByZXR1cm4gbUluQW5pbWF0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNwZWNpZmllcyB0aGUgYW5pbWF0aW9uIHVzZWQgdG8gYW5pbWF0ZSBhIFZpZXcgdGhhdCBlbnRlcnMgdGhlIHNjcmVlbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbkFuaW1hdGlvbiBUaGUgYW5pbWF0aW9uIHN0YXJ0ZWQgd2hlbiBhIFZpZXcgZW50ZXJzIHRoZSBzY3JlZW4uCisgICAgICoKKyAgICAgKiBAc2VlICNnZXRJbkFuaW1hdGlvbigpCisgICAgICogQHNlZSAjc2V0SW5BbmltYXRpb24oYW5kcm9pZC5jb250ZW50LkNvbnRleHQsIGludCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJbkFuaW1hdGlvbihBbmltYXRpb24gaW5BbmltYXRpb24pIHsKKyAgICAgICAgbUluQW5pbWF0aW9uID0gaW5BbmltYXRpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY3VycmVudCBhbmltYXRpb24gdXNlZCB0byBhbmltYXRlIGEgVmlldyB0aGF0IGV4aXRzIHRoZSBzY3JlZW4uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEFuIEFuaW1hdGlvbiBvciBudWxsIGlmIG5vbmUgaXMgc2V0LgorICAgICAqCisgICAgICogQHNlZSAjc2V0T3V0QW5pbWF0aW9uKGFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uKQorICAgICAqIEBzZWUgI3NldE91dEFuaW1hdGlvbihhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCwgaW50KQorICAgICAqLworICAgIHB1YmxpYyBBbmltYXRpb24gZ2V0T3V0QW5pbWF0aW9uKCkgeworICAgICAgICByZXR1cm4gbU91dEFuaW1hdGlvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTcGVjaWZpZXMgdGhlIGFuaW1hdGlvbiB1c2VkIHRvIGFuaW1hdGUgYSBWaWV3IHRoYXQgZXhpdCB0aGUgc2NyZWVuLgorICAgICAqCisgICAgICogQHBhcmFtIG91dEFuaW1hdGlvbiBUaGUgYW5pbWF0aW9uIHN0YXJ0ZWQgd2hlbiBhIFZpZXcgZXhpdCB0aGUgc2NyZWVuLgorICAgICAqCisgICAgICogQHNlZSAjZ2V0T3V0QW5pbWF0aW9uKCkKKyAgICAgKiBAc2VlICNzZXRPdXRBbmltYXRpb24oYW5kcm9pZC5jb250ZW50LkNvbnRleHQsIGludCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRPdXRBbmltYXRpb24oQW5pbWF0aW9uIG91dEFuaW1hdGlvbikgeworICAgICAgICBtT3V0QW5pbWF0aW9uID0gb3V0QW5pbWF0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNwZWNpZmllcyB0aGUgYW5pbWF0aW9uIHVzZWQgdG8gYW5pbWF0ZSBhIFZpZXcgdGhhdCBlbnRlcnMgdGhlIHNjcmVlbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBhcHBsaWNhdGlvbidzIGVudmlyb25tZW50LgorICAgICAqIEBwYXJhbSByZXNvdXJjZUlEIFRoZSByZXNvdXJjZSBpZCBvZiB0aGUgYW5pbWF0aW9uLgorICAgICAqCisgICAgICogQHNlZSAjZ2V0SW5BbmltYXRpb24oKQorICAgICAqIEBzZWUgI3NldEluQW5pbWF0aW9uKGFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEluQW5pbWF0aW9uKENvbnRleHQgY29udGV4dCwgaW50IHJlc291cmNlSUQpIHsKKyAgICAgICAgc2V0SW5BbmltYXRpb24oQW5pbWF0aW9uVXRpbHMubG9hZEFuaW1hdGlvbihjb250ZXh0LCByZXNvdXJjZUlEKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3BlY2lmaWVzIHRoZSBhbmltYXRpb24gdXNlZCB0byBhbmltYXRlIGEgVmlldyB0aGF0IGV4aXQgdGhlIHNjcmVlbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBhcHBsaWNhdGlvbidzIGVudmlyb25tZW50LgorICAgICAqIEBwYXJhbSByZXNvdXJjZUlEIFRoZSByZXNvdXJjZSBpZCBvZiB0aGUgYW5pbWF0aW9uLgorICAgICAqCisgICAgICogQHNlZSAjZ2V0T3V0QW5pbWF0aW9uKCkKKyAgICAgKiBAc2VlICNzZXRPdXRBbmltYXRpb24oYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb24pCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0T3V0QW5pbWF0aW9uKENvbnRleHQgY29udGV4dCwgaW50IHJlc291cmNlSUQpIHsKKyAgICAgICAgc2V0T3V0QW5pbWF0aW9uKEFuaW1hdGlvblV0aWxzLmxvYWRBbmltYXRpb24oY29udGV4dCwgcmVzb3VyY2VJRCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBjdXJyZW50IFZpZXcgc2hvdWxkIGJlIGFuaW1hdGVkIHRoZSBmaXJzdCB0aW1lCisgICAgICogdGhlIFZpZXdBbmltYXRpb24gaXMgZGlzcGxheWVkLgorICAgICAqCisgICAgICogQHBhcmFtIGFuaW1hdGUgVHJ1ZSB0byBhbmltYXRlIHRoZSBjdXJyZW50IFZpZXcgdGhlIGZpcnN0IHRpbWUgaXQgaXMgZGlzcGxheWVkLAorICAgICAqICAgICAgICAgICAgICAgIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBbmltYXRlRmlyc3RWaWV3KGJvb2xlYW4gYW5pbWF0ZSkgeworICAgICAgICBtQW5pbWF0ZUZpcnN0VGltZSA9IGFuaW1hdGU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBnZXRCYXNlbGluZSgpIHsKKyAgICAgICAgcmV0dXJuIChnZXRDdXJyZW50VmlldygpICE9IG51bGwpID8gZ2V0Q3VycmVudFZpZXcoKS5nZXRCYXNlbGluZSgpIDogc3VwZXIuZ2V0QmFzZWxpbmUoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQWRhcHRlciBnZXRBZGFwdGVyKCkgeworICAgICAgICByZXR1cm4gbUFkYXB0ZXI7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0QWRhcHRlcihBZGFwdGVyIGFkYXB0ZXIpIHsKKyAgICAgICAgaWYgKG1BZGFwdGVyICE9IG51bGwgJiYgbURhdGFTZXRPYnNlcnZlciAhPSBudWxsKSB7CisgICAgICAgICAgICBtQWRhcHRlci51bnJlZ2lzdGVyRGF0YVNldE9ic2VydmVyKG1EYXRhU2V0T2JzZXJ2ZXIpOworICAgICAgICB9CisKKyAgICAgICAgbUFkYXB0ZXIgPSBhZGFwdGVyOworCisgICAgICAgIGlmIChtQWRhcHRlciAhPSBudWxsKSB7CisgICAgICAgICAgICBtRGF0YVNldE9ic2VydmVyID0gbmV3IEFkYXB0ZXJEYXRhU2V0T2JzZXJ2ZXIoKTsKKyAgICAgICAgICAgIG1BZGFwdGVyLnJlZ2lzdGVyRGF0YVNldE9ic2VydmVyKG1EYXRhU2V0T2JzZXJ2ZXIpOworICAgICAgICB9CisgICAgICAgIHNldEZvY3VzYWJsZSh0cnVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHVwIHRoaXMgQWRhcHRlclZpZXdBbmltYXRvciB0byB1c2UgYSByZW1vdGUgdmlld3MgYWRhcHRlciB3aGljaCBjb25uZWN0cyB0byBhCisgICAgICogUmVtb3RlVmlld3NTZXJ2aWNlIHRocm91Z2ggdGhlIHNwZWNpZmllZCBpbnRlbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW50ZW50IHRoZSBpbnRlbnQgdXNlZCB0byBpZGVudGlmeSB0aGUgUmVtb3RlVmlld3NTZXJ2aWNlIGZvciB0aGUgYWRhcHRlciB0bworICAgICAqICAgICAgICBjb25uZWN0IHRvLgorICAgICAqLworICAgIEBhbmRyb2lkLnZpZXcuUmVtb3RhYmxlVmlld01ldGhvZAorICAgIHB1YmxpYyB2b2lkIHNldFJlbW90ZVZpZXdzQWRhcHRlcihJbnRlbnQgaW50ZW50KSB7CisgICAgICAgIG1SZW1vdGVWaWV3c0FkYXB0ZXIgPSBuZXcgUmVtb3RlVmlld3NBZGFwdGVyKGdldENvbnRleHQoKSwgaW50ZW50LCB0aGlzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oaW50IHBvc2l0aW9uKSB7CisgICAgICAgIHNldERpc3BsYXllZENoaWxkKHBvc2l0aW9uKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVmlldyBnZXRTZWxlY3RlZFZpZXcoKSB7CisgICAgICAgIHJldHVybiBnZXRWaWV3QXRSZWxhdGl2ZUluZGV4KG1BY3RpdmVPZmZzZXQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxlZCBiYWNrIHdoZW4gdGhlIGFkYXB0ZXIgY29ubmVjdHMgdG8gdGhlIFJlbW90ZVZpZXdzU2VydmljZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvblJlbW90ZUFkYXB0ZXJDb25uZWN0ZWQoKSB7CisgICAgICAgIGlmIChtUmVtb3RlVmlld3NBZGFwdGVyICE9IG1BZGFwdGVyKSB7CisgICAgICAgICAgICBzZXRBZGFwdGVyKG1SZW1vdGVWaWV3c0FkYXB0ZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIGJhY2sgd2hlbiB0aGUgYWRhcHRlciBkaXNjb25uZWN0cyBmcm9tIHRoZSBSZW1vdGVWaWV3c1NlcnZpY2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25SZW1vdGVBZGFwdGVyRGlzY29ubmVjdGVkKCkgeworICAgICAgICBpZiAobVJlbW90ZVZpZXdzQWRhcHRlciAhPSBtQWRhcHRlcikgeworICAgICAgICAgICAgbVJlbW90ZVZpZXdzQWRhcHRlciA9IG51bGw7CisgICAgICAgICAgICBzZXRBZGFwdGVyKG1SZW1vdGVWaWV3c0FkYXB0ZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBSZWN0IGRpcnR5UmVjdCA9IG5ldyBSZWN0KCk7CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcmVtb3ZlVmlld0luTGF5b3V0KFZpZXcgdmlldykgeworICAgICAgICAvLyBUT0RPOiBuZWVkIHRvIGludmVzdGlnYXRlIHRoaXMgYmxvY2sgYSBiaXQgbW9yZQorICAgICAgICAvLyBhbmQgcGVyaGFwcyBmaXggc29tZSBvdGhlciBpbnZhbGlkYXRpb25zIGlzc3Vlcy4KKyAgICAgICAgVmlldyBwYXJlbnQgPSBudWxsOworICAgICAgICB2aWV3LnNldFZpc2liaWxpdHkoSU5WSVNJQkxFKTsKKyAgICAgICAgaWYgKHZpZXcuZ2V0TGF5b3V0UGFyYW1zKCkgaW5zdGFuY2VvZiBMYXlvdXRQYXJhbXMpIHsKKyAgICAgICAgICAgIExheW91dFBhcmFtcyBscCA9IChMYXlvdXRQYXJhbXMpIHZpZXcuZ2V0TGF5b3V0UGFyYW1zKCk7CisgICAgICAgICAgICBwYXJlbnQgPSBscC5nZXRQYXJlbnRBbmREaXJ0eVJlZ2lvbihkaXJ0eVJlY3QpOworICAgICAgICB9CisKKyAgICAgICAgc3VwZXIucmVtb3ZlVmlld0luTGF5b3V0KHZpZXcpOworCisgICAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCkKKyAgICAgICAgICAgIHBhcmVudC5pbnZhbGlkYXRlKGRpcnR5UmVjdC5sZWZ0LCBkaXJ0eVJlY3QudG9wLCBkaXJ0eVJlY3QucmlnaHQsIGRpcnR5UmVjdC5ib3R0b20pOworICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBMYXlvdXRQYXJhbXMgZXh0ZW5kcyBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zIHsKKyAgICAgICAgaW50IGhvcml6b250YWxPZmZzZXQ7CisgICAgICAgIGludCB2ZXJ0aWNhbE9mZnNldDsKKyAgICAgICAgVmlldyBtVmlldzsKKworICAgICAgICBMYXlvdXRQYXJhbXMoVmlldyB2aWV3KSB7CisgICAgICAgICAgICBzdXBlcigwLCAwKTsKKyAgICAgICAgICAgIGhvcml6b250YWxPZmZzZXQgPSAwOworICAgICAgICAgICAgdmVydGljYWxPZmZzZXQgPSAwOworICAgICAgICAgICAgbVZpZXcgPSB2aWV3OworICAgICAgICB9CisKKyAgICAgICAgTGF5b3V0UGFyYW1zKENvbnRleHQgYywgQXR0cmlidXRlU2V0IGF0dHJzKSB7CisgICAgICAgICAgICBzdXBlcihjLCBhdHRycyk7CisgICAgICAgICAgICBob3Jpem9udGFsT2Zmc2V0ID0gMDsKKyAgICAgICAgICAgIHZlcnRpY2FsT2Zmc2V0ID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgUmVjdCBwYXJlbnRSZWN0ID0gbmV3IFJlY3QoKTsKKyAgICAgICAgdm9pZCBpbnZhbGlkYXRlR2xvYmFsUmVnaW9uKFZpZXcgdiwgUmVjdCByKSB7CisgICAgICAgICAgICBWaWV3IHAgPSB2OworICAgICAgICAgICAgYm9vbGVhbiBmaXJzdFBhc3MgPSB0cnVlOworICAgICAgICAgICAgcGFyZW50UmVjdC5zZXQoMCwgMCwgMCwgMCk7CisgICAgICAgICAgICB3aGlsZSAocC5nZXRQYXJlbnQoKSAhPSBudWxsICYmIHAuZ2V0UGFyZW50KCkgaW5zdGFuY2VvZiBWaWV3CisgICAgICAgICAgICAgICAgICAgICYmICFwYXJlbnRSZWN0LmNvbnRhaW5zKHIpKSB7CisgICAgICAgICAgICAgICAgaWYgKCFmaXJzdFBhc3MpIHIub2Zmc2V0KHAuZ2V0TGVmdCgpIC0gcC5nZXRTY3JvbGxYKCksIHAuZ2V0VG9wKCkgLSBwLmdldFNjcm9sbFkoKSk7CisgICAgICAgICAgICAgICAgZmlyc3RQYXNzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgcCA9IChWaWV3KSBwLmdldFBhcmVudCgpOworICAgICAgICAgICAgICAgIHBhcmVudFJlY3Quc2V0KHAuZ2V0TGVmdCgpIC0gcC5nZXRTY3JvbGxYKCksIHAuZ2V0VG9wKCkgLSBwLmdldFNjcm9sbFkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHAuZ2V0UmlnaHQoKSAtIHAuZ2V0U2Nyb2xsWCgpLCBwLmdldEJvdHRvbSgpIC0gcC5nZXRTY3JvbGxZKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcC5pbnZhbGlkYXRlKHIubGVmdCwgci50b3AsIHIucmlnaHQsIHIuYm90dG9tKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBWaWV3IGdldFBhcmVudEFuZERpcnR5UmVnaW9uKFJlY3QgZ2xvYmFsUmVjdCkgeworICAgICAgICAgICAgZ2xvYmFsUmVjdC5zZXQobVZpZXcuZ2V0TGVmdCgpLCBtVmlldy5nZXRUb3AoKSwgbVZpZXcuZ2V0UmlnaHQoKSwgbVZpZXcuZ2V0Qm90dG9tKCkpOworICAgICAgICAgICAgVmlldyBwID0gbVZpZXc7CisgICAgICAgICAgICBib29sZWFuIGZpcnN0UGFzcyA9IHRydWU7CisgICAgICAgICAgICBwYXJlbnRSZWN0LnNldCgwLCAwLCAwLCAwKTsKKyAgICAgICAgICAgIHdoaWxlIChwLmdldFBhcmVudCgpICE9IG51bGwgJiYgcC5nZXRQYXJlbnQoKSBpbnN0YW5jZW9mIFZpZXcKKyAgICAgICAgICAgICAgICAgICAgJiYgIXBhcmVudFJlY3QuY29udGFpbnMoZ2xvYmFsUmVjdCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWZpcnN0UGFzcykgeworICAgICAgICAgICAgICAgICAgICBnbG9iYWxSZWN0Lm9mZnNldChwLmdldExlZnQoKSAtIHAuZ2V0U2Nyb2xsWCgpLCBwLmdldFRvcCgpIC0gcC5nZXRTY3JvbGxZKCkpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZpcnN0UGFzcyA9IGZhbHNlOworICAgICAgICAgICAgICAgIHAgPSAoVmlldykgcC5nZXRQYXJlbnQoKTsKKyAgICAgICAgICAgICAgICBwYXJlbnRSZWN0LnNldChwLmdldExlZnQoKSAtIHAuZ2V0U2Nyb2xsWCgpLCBwLmdldFRvcCgpIC0gcC5nZXRTY3JvbGxZKCksCisgICAgICAgICAgICAgICAgICAgICAgICBwLmdldFJpZ2h0KCkgLSBwLmdldFNjcm9sbFgoKSwgcC5nZXRCb3R0b20oKSAtIHAuZ2V0U2Nyb2xsWSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBwOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBSZWN0IGludmFsaWRhdGVSZWN0ID0gbmV3IFJlY3QoKTsKKyAgICAgICAgLy8gVGhpcyBpcyBwdWJsaWMgc28gdGhhdCBQcm9wZXJ0eUFuaW1hdG9yIGNhbiBhY2Nlc3MgaXQKKyAgICAgICAgcHVibGljIHZvaWQgc2V0VmVydGljYWxPZmZzZXQoaW50IG5ld1ZlcnRpY2FsT2Zmc2V0KSB7CisgICAgICAgICAgICBpbnQgb2Zmc2V0RGVsdGEgPSBuZXdWZXJ0aWNhbE9mZnNldCAtIHZlcnRpY2FsT2Zmc2V0OworICAgICAgICAgICAgdmVydGljYWxPZmZzZXQgPSBuZXdWZXJ0aWNhbE9mZnNldDsKKyAgICAgICAgICAgIGlmIChtVmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbVZpZXcucmVxdWVzdExheW91dCgpOworICAgICAgICAgICAgICAgIGludCB0b3AgPSBNYXRoLm1pbihtVmlldy5nZXRUb3AoKSArIG9mZnNldERlbHRhLCBtVmlldy5nZXRUb3AoKSk7CisgICAgICAgICAgICAgICAgaW50IGJvdHRvbSA9IE1hdGgubWF4KG1WaWV3LmdldEJvdHRvbSgpICsgb2Zmc2V0RGVsdGEsIG1WaWV3LmdldEJvdHRvbSgpKTsKKyAgICAgICAgICAgICAgICBpbnZhbGlkYXRlUmVjdC5zZXQobVZpZXcuZ2V0TGVmdCgpLCB0b3AsIG1WaWV3LmdldFJpZ2h0KCksIGJvdHRvbSk7CisgICAgICAgICAgICAgICAgaW52YWxpZGF0ZUdsb2JhbFJlZ2lvbihtVmlldywgaW52YWxpZGF0ZVJlY3QpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0SG9yaXpvbnRhbE9mZnNldChpbnQgbmV3SG9yaXpvbnRhbE9mZnNldCkgeworICAgICAgICAgICAgaW50IG9mZnNldERlbHRhID0gbmV3SG9yaXpvbnRhbE9mZnNldCAtIGhvcml6b250YWxPZmZzZXQ7CisgICAgICAgICAgICBob3Jpem9udGFsT2Zmc2V0ID0gbmV3SG9yaXpvbnRhbE9mZnNldDsKKyAgICAgICAgICAgIGlmIChtVmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbVZpZXcucmVxdWVzdExheW91dCgpOworICAgICAgICAgICAgICAgIGludCBsZWZ0ID0gTWF0aC5taW4obVZpZXcuZ2V0TGVmdCgpICsgb2Zmc2V0RGVsdGEsIG1WaWV3LmdldExlZnQoKSk7CisgICAgICAgICAgICAgICAgaW50IHJpZ2h0ID0gTWF0aC5tYXgobVZpZXcuZ2V0UmlnaHQoKSArIG9mZnNldERlbHRhLCBtVmlldy5nZXRSaWdodCgpKTsKKyAgICAgICAgICAgICAgICBpbnZhbGlkYXRlUmVjdC5zZXQobGVmdCwgbVZpZXcuZ2V0VG9wKCksIHJpZ2h0LCBtVmlldy5nZXRCb3R0b20oKSk7CisgICAgICAgICAgICAgICAgaW52YWxpZGF0ZUdsb2JhbFJlZ2lvbihtVmlldywgaW52YWxpZGF0ZVJlY3QpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0FkYXB0ZXJWaWV3RmxpcHBlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0FkYXB0ZXJWaWV3RmxpcHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5NTY4M2QKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvQWRhcHRlclZpZXdGbGlwcGVyLmphdmEKQEAgLTAsMCArMSwyNzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQud2lkZ2V0OworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudEZpbHRlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3LlJlbW90YWJsZVZpZXdNZXRob2Q7CitpbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbHBoYUFuaW1hdGlvbjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5SZW1vdGVWaWV3cy5SZW1vdGVWaWV3OworCisvKioKKyAqIFNpbXBsZSB7QGxpbmsgVmlld0FuaW1hdG9yfSB0aGF0IHdpbGwgYW5pbWF0ZSBiZXR3ZWVuIHR3byBvciBtb3JlIHZpZXdzCisgKiB0aGF0IGhhdmUgYmVlbiBhZGRlZCB0byBpdC4gIE9ubHkgb25lIGNoaWxkIGlzIHNob3duIGF0IGEgdGltZS4gIElmCisgKiByZXF1ZXN0ZWQsIGNhbiBhdXRvbWF0aWNhbGx5IGZsaXAgYmV0d2VlbiBlYWNoIGNoaWxkIGF0IGEgcmVndWxhciBpbnRlcnZhbC4KKyAqCisgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNBZGFwdGVyVmlld0ZsaXBwZXJfZmxpcEludGVydmFsCisgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNBZGFwdGVyVmlld0ZsaXBwZXJfYXV0b1N0YXJ0CisgKi8KK0BSZW1vdGVWaWV3CitwdWJsaWMgY2xhc3MgQWRhcHRlclZpZXdGbGlwcGVyIGV4dGVuZHMgQWRhcHRlclZpZXdBbmltYXRvciB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJWaWV3RmxpcHBlciI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBMT0dEID0gZmFsc2U7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9JTlRFUlZBTCA9IDEwMDAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0FOSU1BVElPTl9EVVJBVElPTiA9IDIwMDsKKworICAgIHByaXZhdGUgaW50IG1GbGlwSW50ZXJ2YWwgPSBERUZBVUxUX0lOVEVSVkFMOworICAgIHByaXZhdGUgaW50IG1BbmltYXRpb25EdXJhdGlvbiA9IERFRkFVTFRfQU5JTUFUSU9OX0RVUkFUSU9OOworICAgIHByaXZhdGUgYm9vbGVhbiBtQXV0b1N0YXJ0ID0gZmFsc2U7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gbVJ1bm5pbmcgPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gbVN0YXJ0ZWQgPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gbVZpc2libGUgPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gbVVzZXJQcmVzZW50ID0gdHJ1ZTsKKworICAgIHB1YmxpYyBBZGFwdGVyVmlld0ZsaXBwZXIoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQpOworICAgICAgICBpbml0RGVmYXVsdEFuaW1hdGlvbnMoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQWRhcHRlclZpZXdGbGlwcGVyKENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzKTsKKworICAgICAgICBUeXBlZEFycmF5IGEgPSBjb250ZXh0Lm9idGFpblN0eWxlZEF0dHJpYnV0ZXMoYXR0cnMsCisgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuVmlld0ZsaXBwZXIpOworICAgICAgICBtRmxpcEludGVydmFsID0gYS5nZXRJbnQoCisgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuVmlld0ZsaXBwZXJfZmxpcEludGVydmFsLCBERUZBVUxUX0lOVEVSVkFMKTsKKyAgICAgICAgbUF1dG9TdGFydCA9IGEuZ2V0Qm9vbGVhbigKKyAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5WaWV3RmxpcHBlcl9hdXRvU3RhcnQsIGZhbHNlKTsKKyAgICAgICAgYS5yZWN5Y2xlKCk7CisgICAgICAgIGluaXREZWZhdWx0QW5pbWF0aW9ucygpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbml0RGVmYXVsdEFuaW1hdGlvbnMoKSB7CisgICAgICAgIC8vIFNldCB0aGUgZGVmYXVsdCBhbmltYXRpb25zIHRvIGJlIGZhZGUgaW4vb3V0CisgICAgICAgIGlmIChtSW5BbmltYXRpb24gPT0gbnVsbCkgeworICAgICAgICAgICAgbUluQW5pbWF0aW9uID0gbmV3IEFscGhhQW5pbWF0aW9uKDAuMGYsIDEuMGYpOworICAgICAgICAgICAgbUluQW5pbWF0aW9uLnNldER1cmF0aW9uKG1BbmltYXRpb25EdXJhdGlvbik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1PdXRBbmltYXRpb24gPT0gbnVsbCkgeworICAgICAgICAgICAgbU91dEFuaW1hdGlvbiA9IG5ldyBBbHBoYUFuaW1hdGlvbigxLjBmLCAwLjBmKTsKKyAgICAgICAgICAgIG1PdXRBbmltYXRpb24uc2V0RHVyYXRpb24obUFuaW1hdGlvbkR1cmF0aW9uKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgQnJvYWRjYXN0UmVjZWl2ZXIgbVJlY2VpdmVyID0gbmV3IEJyb2FkY2FzdFJlY2VpdmVyKCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25SZWNlaXZlKENvbnRleHQgY29udGV4dCwgSW50ZW50IGludGVudCkgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIGFjdGlvbiA9IGludGVudC5nZXRBY3Rpb24oKTsKKyAgICAgICAgICAgIGlmIChJbnRlbnQuQUNUSU9OX1NDUkVFTl9PRkYuZXF1YWxzKGFjdGlvbikpIHsKKyAgICAgICAgICAgICAgICBtVXNlclByZXNlbnQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB1cGRhdGVSdW5uaW5nKCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKEludGVudC5BQ1RJT05fVVNFUl9QUkVTRU5ULmVxdWFscyhhY3Rpb24pKSB7CisgICAgICAgICAgICAgICAgbVVzZXJQcmVzZW50ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB1cGRhdGVSdW5uaW5nKGZhbHNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH07CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkF0dGFjaGVkVG9XaW5kb3coKSB7CisgICAgICAgIHN1cGVyLm9uQXR0YWNoZWRUb1dpbmRvdygpOworCisgICAgICAgIC8vIExpc3RlbiBmb3IgYnJvYWRjYXN0cyByZWxhdGVkIHRvIHVzZXItcHJlc2VuY2UKKyAgICAgICAgZmluYWwgSW50ZW50RmlsdGVyIGZpbHRlciA9IG5ldyBJbnRlbnRGaWx0ZXIoKTsKKyAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihJbnRlbnQuQUNUSU9OX1NDUkVFTl9PRkYpOworICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKEludGVudC5BQ1RJT05fVVNFUl9QUkVTRU5UKTsKKyAgICAgICAgZ2V0Q29udGV4dCgpLnJlZ2lzdGVyUmVjZWl2ZXIobVJlY2VpdmVyLCBmaWx0ZXIpOworCisgICAgICAgIGlmIChtQXV0b1N0YXJ0KSB7CisgICAgICAgICAgICAvLyBBdXRvbWF0aWNhbGx5IHN0YXJ0IHdoZW4gcmVxdWVzdGVkCisgICAgICAgICAgICBzdGFydEZsaXBwaW5nKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkRldGFjaGVkRnJvbVdpbmRvdygpIHsKKyAgICAgICAgc3VwZXIub25EZXRhY2hlZEZyb21XaW5kb3coKTsKKyAgICAgICAgbVZpc2libGUgPSBmYWxzZTsKKworICAgICAgICBnZXRDb250ZXh0KCkudW5yZWdpc3RlclJlY2VpdmVyKG1SZWNlaXZlcik7CisgICAgICAgIHVwZGF0ZVJ1bm5pbmcoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbldpbmRvd1Zpc2liaWxpdHlDaGFuZ2VkKGludCB2aXNpYmlsaXR5KSB7CisgICAgICAgIHN1cGVyLm9uV2luZG93VmlzaWJpbGl0eUNoYW5nZWQodmlzaWJpbGl0eSk7CisgICAgICAgIG1WaXNpYmxlID0gKHZpc2liaWxpdHkgPT0gVklTSUJMRSk7CisgICAgICAgIHVwZGF0ZVJ1bm5pbmcoZmFsc2UpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldEFkYXB0ZXIoQWRhcHRlciBhZGFwdGVyKSB7CisgICAgICAgIHN1cGVyLnNldEFkYXB0ZXIoYWRhcHRlcik7CisgICAgICAgIHVwZGF0ZVJ1bm5pbmcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBIb3cgbG9uZyB0byB3YWl0IGJlZm9yZSBmbGlwcGluZyB0byB0aGUgbmV4dCB2aWV3CisgICAgICoKKyAgICAgKiBAcGFyYW0gbWlsbGlzZWNvbmRzCisgICAgICogICAgICAgICAgICB0aW1lIGluIG1pbGxpc2Vjb25kcworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEZsaXBJbnRlcnZhbChpbnQgbWlsbGlzZWNvbmRzKSB7CisgICAgICAgIG1GbGlwSW50ZXJ2YWwgPSBtaWxsaXNlY29uZHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RhcnQgYSB0aW1lciB0byBjeWNsZSB0aHJvdWdoIGNoaWxkIHZpZXdzCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RhcnRGbGlwcGluZygpIHsKKyAgICAgICAgbVN0YXJ0ZWQgPSB0cnVlOworICAgICAgICB1cGRhdGVSdW5uaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTm8gbW9yZSBmbGlwcworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0b3BGbGlwcGluZygpIHsKKyAgICAgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKKyAgICAgICAgdXBkYXRlUnVubmluZygpOworICAgIH0KKworICAgIC8qKgorICAgICoge0Bpbmhlcml0RG9jfQorICAgICovCisgICBAT3ZlcnJpZGUKKyAgIEBSZW1vdGFibGVWaWV3TWV0aG9kCisgICBwdWJsaWMgdm9pZCBzaG93TmV4dCgpIHsKKyAgICAgICAvLyBpZiB0aGUgZmxpcHBlciBpcyBjdXJyZW50bHkgZmxpcHBpbmcgYXV0b21hdGljYWxseSwgYW5kIHNob3dOZXh0KCkgaXMgY2FsbGVkCisgICAgICAgLy8gd2Ugc2hvdWxkIHdlIHNob3VsZCBtYWtlIHN1cmUgdG8gcmVzZXQgdGhlIHRpbWVyCisgICAgICAgaWYgKG1SdW5uaW5nKSB7CisgICAgICAgICAgIG1IYW5kbGVyLnJlbW92ZU1lc3NhZ2VzKEZMSVBfTVNHKTsKKyAgICAgICAgICAgTWVzc2FnZSBtc2cgPSBtSGFuZGxlci5vYnRhaW5NZXNzYWdlKEZMSVBfTVNHKTsKKyAgICAgICAgICAgbUhhbmRsZXIuc2VuZE1lc3NhZ2VEZWxheWVkKG1zZywgbUZsaXBJbnRlcnZhbCk7CisgICAgICAgfQorICAgICAgIHN1cGVyLnNob3dOZXh0KCk7CisgICB9CisKKyAgIC8qKgorICAgICoge0Bpbmhlcml0RG9jfQorICAgICovCisgICBAT3ZlcnJpZGUKKyAgIEBSZW1vdGFibGVWaWV3TWV0aG9kCisgICBwdWJsaWMgdm9pZCBzaG93UHJldmlvdXMoKSB7CisgICAgICAgLy8gaWYgdGhlIGZsaXBwZXIgaXMgY3VycmVudGx5IGZsaXBwaW5nIGF1dG9tYXRpY2FsbHksIGFuZCBzaG93UHJldmlvdXMoKSBpcyBjYWxsZWQKKyAgICAgICAvLyB3ZSBzaG91bGQgd2Ugc2hvdWxkIG1ha2Ugc3VyZSB0byByZXNldCB0aGUgdGltZXIKKyAgICAgICBpZiAobVJ1bm5pbmcpIHsKKyAgICAgICAgICAgbUhhbmRsZXIucmVtb3ZlTWVzc2FnZXMoRkxJUF9NU0cpOworICAgICAgICAgICBNZXNzYWdlIG1zZyA9IG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoRkxJUF9NU0cpOworICAgICAgICAgICBtSGFuZGxlci5zZW5kTWVzc2FnZURlbGF5ZWQobXNnLCBtRmxpcEludGVydmFsKTsKKyAgICAgICB9CisgICAgICAgc3VwZXIuc2hvd1ByZXZpb3VzKCk7CisgICB9CisKKyAgIC8qKgorCisgICAgLyoqCisgICAgICogSW50ZXJuYWwgbWV0aG9kIHRvIHN0YXJ0IG9yIHN0b3AgZGlzcGF0Y2hpbmcgZmxpcCB7QGxpbmsgTWVzc2FnZX0gYmFzZWQKKyAgICAgKiBvbiB7QGxpbmsgI21SdW5uaW5nfSBhbmQge0BsaW5rICNtVmlzaWJsZX0gc3RhdGUuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVJ1bm5pbmcoKSB7CisgICAgICAgIC8vIGJ5IGRlZmF1bHQgd2hlbiB3ZSB1cGRhdGUgcnVubmluZywgd2Ugd2FudCB0aGUKKyAgICAgICAgLy8gY3VycmVudCB2aWV3IHRvIGFuaW1hdGUgaW4KKyAgICAgICAgdXBkYXRlUnVubmluZyh0cnVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnRlcm5hbCBtZXRob2QgdG8gc3RhcnQgb3Igc3RvcCBkaXNwYXRjaGluZyBmbGlwIHtAbGluayBNZXNzYWdlfSBiYXNlZAorICAgICAqIG9uIHtAbGluayAjbVJ1bm5pbmd9IGFuZCB7QGxpbmsgI21WaXNpYmxlfSBzdGF0ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmbGlwTm93IERldGVybWluZXMgd2hldGhlciBvciBub3QgdG8gZXhlY3V0ZSB0aGUgYW5pbWF0aW9uIG5vdywgaW4KKyAgICAgKiAgICAgICAgICAgIGFkZGl0aW9uIHRvIHF1ZXVpbmcgZnV0dXJlIGZsaXBzLiBJZiBvbWl0dGVkLCBkZWZhdWx0cyB0bworICAgICAqICAgICAgICAgICAgdHJ1ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgdXBkYXRlUnVubmluZyhib29sZWFuIGZsaXBOb3cpIHsKKyAgICAgICAgYm9vbGVhbiBydW5uaW5nID0gbVZpc2libGUgJiYgbVN0YXJ0ZWQgJiYgbVVzZXJQcmVzZW50ICYmIG1BZGFwdGVyICE9IG51bGw7CisgICAgICAgIGlmIChydW5uaW5nICE9IG1SdW5uaW5nKSB7CisgICAgICAgICAgICBpZiAocnVubmluZykgeworICAgICAgICAgICAgICAgIHNob3dPbmx5KG1XaGljaENoaWxkLCBmbGlwTm93KTsKKyAgICAgICAgICAgICAgICBNZXNzYWdlIG1zZyA9IG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoRkxJUF9NU0cpOworICAgICAgICAgICAgICAgIG1IYW5kbGVyLnNlbmRNZXNzYWdlRGVsYXllZChtc2csIG1GbGlwSW50ZXJ2YWwpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhGTElQX01TRyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtUnVubmluZyA9IHJ1bm5pbmc7CisgICAgICAgIH0KKyAgICAgICAgaWYgKExPR0QpIHsKKyAgICAgICAgICAgIExvZy5kKFRBRywgInVwZGF0ZVJ1bm5pbmcoKSBtVmlzaWJsZT0iICsgbVZpc2libGUgKyAiLCBtU3RhcnRlZD0iICsgbVN0YXJ0ZWQKKyAgICAgICAgICAgICAgICAgICAgKyAiLCBtVXNlclByZXNlbnQ9IiArIG1Vc2VyUHJlc2VudCArICIsIG1SdW5uaW5nPSIgKyBtUnVubmluZyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGNoaWxkIHZpZXdzIGFyZSBmbGlwcGluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0ZsaXBwaW5nKCkgeworICAgICAgICByZXR1cm4gbVN0YXJ0ZWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IGlmIHRoaXMgdmlldyBhdXRvbWF0aWNhbGx5IGNhbGxzIHtAbGluayAjc3RhcnRGbGlwcGluZygpfSB3aGVuIGl0CisgICAgICogYmVjb21lcyBhdHRhY2hlZCB0byBhIHdpbmRvdy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBdXRvU3RhcnQoYm9vbGVhbiBhdXRvU3RhcnQpIHsKKyAgICAgICAgbUF1dG9TdGFydCA9IGF1dG9TdGFydDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyB2aWV3IGF1dG9tYXRpY2FsbHkgY2FsbHMge0BsaW5rICNzdGFydEZsaXBwaW5nKCl9CisgICAgICogd2hlbiBpdCBiZWNvbWVzIGF0dGFjaGVkIHRvIGEgd2luZG93LgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzQXV0b1N0YXJ0KCkgeworICAgICAgICByZXR1cm4gbUF1dG9TdGFydDsKKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIGludCBGTElQX01TRyA9IDE7CisKKyAgICBwcml2YXRlIGZpbmFsIEhhbmRsZXIgbUhhbmRsZXIgPSBuZXcgSGFuZGxlcigpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKKyAgICAgICAgICAgIGlmIChtc2cud2hhdCA9PSBGTElQX01TRykgeworICAgICAgICAgICAgICAgIGlmIChtUnVubmluZykgeworICAgICAgICAgICAgICAgICAgICBzaG93TmV4dCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH07Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvQWRhcHRlcnMuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9BZGFwdGVycy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmZDdmYjUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvQWRhcHRlcnMuamF2YQpAQCAtMCwwICsxLDEyMzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQud2lkZ2V0OworCitpbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlcjsKK2ltcG9ydCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyRXhjZXB0aW9uOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5UeXBlZEFycmF5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuWG1sUmVzb3VyY2VQYXJzZXI7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXBGYWN0b3J5OworaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKK2ltcG9ydCBhbmRyb2lkLm9zLkFzeW5jVGFzazsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OworaW1wb3J0IGFuZHJvaWQudXRpbC5YbWw7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKKworLyoqCisgKiA8cD5UaGlzIGNsYXNzIGNhbiBiZSB1c2VkIHRvIGxvYWQge0BsaW5rIGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXIgYWRhcHRlcnN9IGRlZmluZWQgaW4KKyAqIFhNTCByZXNvdXJjZXMuIFhNTC1kZWZpbmVkIGFkYXB0ZXJzIGNhbiBiZSB1c2VkIHRvIGVhc2lseSBjcmVhdGUgYWRhcHRlcnMgaW4geW91cgorICogb3duIGFwcGxpY2F0aW9uIG9yIHRvIHBhc3MgYWRhcHRlcnMgdG8gb3RoZXIgcHJvY2Vzc2VzLjwvcD4KKyAqIAorICogPGgyPlR5cGVzIG9mIGFkYXB0ZXJzPC9oMj4KKyAqIDxwPkFkYXB0ZXJzIGRlZmluZWQgdXNpbmcgWE1MIHJlc291cmNlcyBjYW4gb25seSBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyBzdXBwb3J0ZWQKKyAqIHR5cGVzLiBBcmJpdHJhcnkgYWRhcHRlcnMgYXJlIG5vdCBzdXBwb3J0ZWQgdG8gZ3VhcmFudGVlIHRoZSBzYWZldHkgb2YgdGhlIGxvYWRlZAorICogY29kZSB3aGVuIGFkYXB0ZXJzIGFyZSBsb2FkZWQgYWNyb3NzIHBhY2thZ2VzLjwvcD4KKyAqIDx1bD4KKyAqICA8bGk+PGEgaHJlZj0iI3htbC1jdXJzb3ItYWRhcHRlciI+Q3Vyc29yIGFkYXB0ZXI8L2E+OiBhIGN1cnNvciBhZGFwdGVyIGNhbiBiZSB1c2VkCisgKiAgdG8gZGlzcGxheSB0aGUgY29udGVudCBvZiBhIGN1cnNvciwgbW9zdCBvZnRlbiBjb21pbmcgZnJvbSBhIGNvbnRlbnQgcHJvdmlkZXI8L2xpPgorICogPC91bD4KKyAqIDxwPlRoZSBjb21wbGV0ZSBYTUwgZm9ybWF0IGRlZmluaXRpb24gb2YgZWFjaCBhZGFwdGVyIHR5cGUgaXMgYXZhaWxhYmxlIGJlbG93LjwvcD4KKyAqIAorICogPGEgbmFtZT0ieG1sLWN1cnNvci1hZGFwdGVyIiAvPgorICogPGgyPkN1cnNvciBhZGFwdGVyPC9oMj4KKyAqIDxwPkEgY3Vyc29yIGFkYXB0ZXIgWE1MIGRlZmluaXRpb24gc3RhcnRzIHdpdGggdGhlCisgKiA8YSBocmVmPSIjeG1sLWN1cnNvci1hZGFwdGVyLXRhZyI+PGNvZGU+Jmx0O2N1cnNvci1hZGFwdGVyIC8mZ3Q7PC9jb2RlPjwvYT4KKyAqIHRhZyBhbmQgbWF5IGNvbnRhaW4gb25lIG9yIG1vcmUgaW5zdGFuY2VzIG9mIHRoZSBmb2xsb3dpbmcgdGFnczo8L3A+CisgKiA8dWw+CisgKiAgPGxpPjxhIGhyZWY9IiN4bWwtY3Vyc29yLWFkYXB0ZXItc2VsZWN0LXRhZyI+PGNvZGU+Jmx0O3NlbGVjdCAvJmd0OzwvY29kZT48L2E+PC9saT4KKyAqICA8bGk+PGEgaHJlZj0iI3htbC1jdXJzb3ItYWRhcHRlci1iaW5kLXRhZyI+PGNvZGU+Jmx0O2JpbmQgLyZndDs8L2NvZGU+PC9hPjwvbGk+CisgKiA8L3VsPgorICogCisgKiA8YSBuYW1lPSJ4bWwtY3Vyc29yLWFkYXB0ZXItdGFnIiAvPgorICogPGgzPiZsdDtjdXJzb3ItYWRhcHRlciAvJmd0OzwvaDM+CisgKiA8cD5UaGUgPGNvZGU+Jmx0O2N1cnNvci1hZGFwdGVyIC8mZ3Q7PC9jb2RlPiBlbGVtZW50IGRlZmluZXMgdGhlIGJlZ2lubmluZyBvZiB0aGUKKyAqIGRvY3VtZW50IGFuZCBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6PC9wPgorICogPHVsPgorICogIDxsaT48Y29kZT5hbmRyb2lkOmxheW91dDwvY29kZT46IFJlZmVyZW5jZSB0byB0aGUgWE1MIGxheW91dCB0byBiZSBpbmZsYXRlZCBmb3IKKyAqICBlYWNoIGl0ZW0gb2YgdGhlIGFkYXB0ZXIuIFRoaXMgYXR0cmlidXRlIGlzIG1hbmRhdG9yeS48L2xpPgorICogIDxsaT48Y29kZT5hbmRyb2lkOnNlbGVjdGlvbjwvY29kZT46IFNlbGVjdGlvbiBleHByZXNzaW9uLCB1c2VkIHdoZW4gdGhlCisgKiAgPGNvZGU+YW5kcm9pZDp1cmk8L2NvZGU+IGF0dHJpYnV0ZSBpcyBkZWZpbmVkIG9yIHdoZW4gdGhlIGFkYXB0ZXIgaXMgbG9hZGVkIHdpdGgKKyAqICB7QGxpbmsgYW5kcm9pZC53aWRnZXQuQWRhcHRlcnMjbG9hZEN1cnNvckFkYXB0ZXIoYW5kcm9pZC5jb250ZW50LkNvbnRleHQsIGludCwgU3RyaW5nLCBPYmplY3RbXSl9LgorICogIFRoaXMgYXR0cmlidXRlIGlzIG9wdGlvbmFsLjwvbGk+CisgKiAgPGxpPjxjb2RlPmFuZHJvaWQ6c29ydE9yZGVyPC9jb2RlPjogU29ydCBleHByZXNzaW9uLCB1c2VkIHdoZW4gdGhlCisgKiAgPGNvZGU+YW5kcm9pZDp1cmk8L2NvZGU+IGF0dHJpYnV0ZSBpcyBkZWZpbmVkIG9yIHdoZW4gdGhlIGFkYXB0ZXIgaXMgbG9hZGVkIHdpdGgKKyAqICB7QGxpbmsgYW5kcm9pZC53aWRnZXQuQWRhcHRlcnMjbG9hZEN1cnNvckFkYXB0ZXIoYW5kcm9pZC5jb250ZW50LkNvbnRleHQsIGludCwgU3RyaW5nLCBPYmplY3RbXSl9LgorICogIFRoaXMgYXR0cmlidXRlIGlzIG9wdGlvbmFsLjwvbGk+CisgKiAgPGxpPjxjb2RlPmFuZHJvaWQ6dXJpPC9jb2RlPjogVVJJIG9mIHRoZSBjb250ZW50IHByb3ZpZGVyIHRvIHF1ZXJ5IHRvIHJldHJpZXZlIGEgY3Vyc29yLgorICogIFNwZWNpZnlpbmcgdGhpcyBhdHRyaWJ1dGUgaXMgZXF1aXZhbGVudCB0byBjYWxsaW5nCisgKiAge0BsaW5rIGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJzI2xvYWRDdXJzb3JBZGFwdGVyKGFuZHJvaWQuY29udGVudC5Db250ZXh0LCBpbnQsIFN0cmluZywgT2JqZWN0W10pfS4KKyAqICBJZiB5b3UgY2FsbCB0aGlzIG1ldGhvZCwgdGhlIHZhbHVlIG9mIHRoZSBYTUwgYXR0cmlidXRlIGlzIGlnbm9yZWQuIFRoaXMgYXR0cmlidXRlIGlzCisgKiAgb3B0aW9uYWwuPC9saT4KKyAqIDwvdWw+CisgKiA8cD5JbiBhZGRpdGlvbiwgeW91IGNhbiBzcGVjaWZ5IG9uZSBvciBtb3JlIGluc3RhbmNlcyBvZgorICogPGEgaHJlZj0iI3htbC1jdXJzb3ItYWRhcHRlci1zZWxlY3QtdGFnIj48Y29kZT4mbHQ7c2VsZWN0IC8mZ3Q7PC9jb2RlPjwvYT4gYW5kCisgKiA8YSBocmVmPSIjeG1sLWN1cnNvci1hZGFwdGVyLWJpbmQtdGFnIj48Y29kZT4mbHQ7YmluZCAvJmd0OzwvY29kZT48L2E+IHRhZ3MgYXMgY2hpbGRyZW4KKyAqIG9mIDxjb2RlPiZsdDtjdXJzb3ItYWRhcHRlciAvJmd0OzwvY29kZT4uPC9wPgorICogCisgKiA8YSBuYW1lPSJ4bWwtY3Vyc29yLWFkYXB0ZXItc2VsZWN0LXRhZyIgLz4KKyAqIDxoMz4mbHQ7c2VsZWN0IC8mZ3Q7PC9oMz4KKyAqIDxwPlRoZSA8Y29kZT4mbHQ7c2VsZWN0IC8mZ3Q7PC9jb2RlPiB0YWcgaXMgdXNlZCB0byBzZWxlY3QgY29sdW1ucyBmcm9tIHRoZSBjdXJzb3IKKyAqIHdoZW4gZG9pbmcgdGhlIHF1ZXJ5LiBUaGlzIGNhbiBiZSB2ZXJ5IHVzZWZ1bCB3aGVuIHVzaW5nIHRyYW5zZm9ybWF0aW9ucyBpbiB0aGUKKyAqIDxjb2RlPiZsdDtiaW5kIC8mZ3Q7PC9jb2RlPiBlbGVtZW50cy4gSXQgY2FuIGFsc28gYmUgdmVyeSB1c2VmdWwgaWYgeW91IGFyZSBwcm92aWRpbmcKKyAqIHlvdXIgb3duIDxhIGhyZWY9IiN4bWwtY3Vyc29yLWFkYXB0ZXItYmluZC1kYXRhLXR5cGVzIj5iaW5kZXI8L2E+IG9yCisgKiA8YSBocmVmPSIjeG1sLWN1cnNvci1hZGFwdGVyLWJpbmQtZGF0YS10eXBlcyI+dHJhbnNmb3JtYXRpb248L2E+IGNsYXNzZXMuCisgKiA8Y29kZT4mbHQ7c2VsZWN0IC8mZ3Q7PC9jb2RlPiBlbGVtZW50cyBhcmUgaWdub3JlZCBpZiB5b3Ugc3VwcGx5IHRoZSBjdXJzb3IgeW91cnNlbGYuPC9wPgorICogPHA+VGhlIDxjb2RlPiZsdDtzZWxlY3QgLyZndDs8L2NvZGU+IHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczo8L3A+CisgKiA8dWw+CisgKiAgPGxpPjxjb2RlPmFuZHJvaWQ6Y29sdW1uPC9jb2RlPjogTmFtZSBvZiB0aGUgY29sdW1uIHRvIHNlbGVjdCBpbiB0aGUgY3Vyc29yIGR1cmluZyB0aGUKKyAqICBxdWVyeSBvcGVyYXRpb248L2xpPgorICogPC91bD4KKyAqIDxwPjxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gVGhlIGNvbHVtbiBuYW1lZCA8Y29kZT5faWQ8L2NvZGU+IGlzIGFsd2F5cyBpbXBsaWNpdGx5CisgKiBzZWxlY3RlZC48L3A+CisgKiAKKyAqIDxhIG5hbWU9InhtbC1jdXJzb3ItYWRhcHRlci1iaW5kLXRhZyIgLz4KKyAqIDxoMz4mbHQ7YmluZCAvJmd0OzwvaDM+CisgKiA8cD5UaGUgPGNvZGU+Jmx0O2JpbmQgLyZndDs8L2NvZGU+IHRhZyBpcyB1c2VkIHRvIGJpbmQgYSBjb2x1bW4gZnJvbSB0aGUgY3Vyc29yIHRvCisgKiBhIHtAbGluayBhbmRyb2lkLnZpZXcuVmlld30uIEEgY29sdW1uIGJvdW5kIHVzaW5nIHRoaXMgdGFnIGlzIGF1dG9tYXRpY2FsbHkgc2VsZWN0ZWQKKyAqIGR1cmluZyB0aGUgcXVlcnkgYW5kIGEgbWF0Y2hpbmcKKyAqIDxhIGhyZWY9IiN4bWwtY3Vyc29yLWFkYXB0ZXItc2VsZWN0LXRhZyI+PGNvZGU+Jmx0O3NlbGVjdCAvJmd0OzwvY29kZT4gdGFnIGlzIHRoZXJlZm9yZQorICogbm90IHJlcXVpcmVkLjwvcD4KKyAqIAorICogPHA+RWFjaCBiaW5kaW5nIGlzIGRlY2xhcmVkIGFzIGEgb25lIHRvIG9uZSBtYXRjaGluZyBidXQKKyAqIGN1c3RvbSBiaW5kZXIgY2xhc3NlcyBvciBzcGVjaWFsCisgKiA8YSBocmVmPSIjeG1sLWN1cnNvci1hZGFwdGVyLWJpbmQtZGF0YS10cmFuc2Zvcm1hdGlvbiI+ZGF0YSB0cmFuc2Zvcm1hdGlvbnM8L2E+IGNhbgorICogYWxsb3cgeW91IHRvIGJpbmQgc2V2ZXJhbCBjb2x1bW5zIHRvIGEgc2luZ2xlIHZpZXcuIEluIHRoaXMgY2FzZSB5b3UgbXVzdCB1c2UgdGhlCisgKiA8YSBocmVmPSIjeG1sLWN1cnNvci1hZGFwdGVyLXNlbGVjdC10YWciPjxjb2RlPiZsdDtzZWxlY3QgLyZndDs8L2NvZGU+IHRhZyB0byBtYWtlCisgKiBzdXJlIGFueSByZXF1aXJlZCBjb2x1bW4gaXMgcGFydCBvZiB0aGUgcXVlcnkuPC9wPgorICogCisgKiA8cD5UaGUgPGNvZGU+Jmx0O2JpbmQgLyZndDs8L2NvZGU+IHRhZyBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6PC9wPgorICogPHVsPgorICogIDxsaT48Y29kZT5hbmRyb2lkOmZyb208L2NvZGU+OiBUaGUgbmFtZSBvZiB0aGUgY29sdW1uIHRvIGJpbmQgZnJvbS4KKyAqICBUaGlzIGF0dHJpYnV0ZSBpcyBtYW5kYXRvcnkuIE5vdGUgdGhhdCA8Y29kZT5APC9jb2RlPiB3aGljaCBhcmUgbm90IHVzZWQgdG8gcmVmZXJlbmNlIHJlc291cmNlcworICogIHNob3VsZCBiZSBiYWNrc2xhc2ggcHJvdGVjdGVkIGFzIGluIDxjb2RlPlxAPC9jb2RlPi48L2xpPgorICogIDxsaT48Y29kZT5hbmRyb2lkOnRvPC9jb2RlPjogVGhlIGlkIG9mIHRoZSB2aWV3IHRvIGJpbmQgdG8uIFRoaXMgYXR0cmlidXRlIGlzIG1hbmRhdG9yeS48L2xpPgorICogIDxsaT48Y29kZT5hbmRyb2lkOmFzPC9jb2RlPjogVGhlIDxhIGhyZWY9IiN4bWwtY3Vyc29yLWFkYXB0ZXItYmluZC1kYXRhLXR5cGVzIj5kYXRhIHR5cGU8L2E+CisgKiAgb2YgdGhlIGJpbmRpbmcuIFRoaXMgYXR0cmlidXRlIGlzIG1hbmRhdG9yeS48L2xpPgorICogPC91bD4KKyAqIAorICogPHA+SW4gYWRkaXRpb24sIGEgPGNvZGU+Jmx0O2JpbmQgLyZndDs8L2NvZGU+IGNhbiBjb250YWluIHplcm8gb3IgbW9yZSBpbnN0YW5jZXMgb2YKKyAqIDxhIGhyZWY9IiN4bWwtY3Vyc29yLWFkYXB0ZXItYmluZC1kYXRhLXRyYW5zZm9ybWF0aW9uIj5kYXRhIHRyYW5zZm9ybWF0aW9uczwvYT4gY2hpbGRyZW4KKyAqIHRhZ3MuPC9wPgorICoKKyAqIDxhIG5hbWU9InhtbC1jdXJzb3ItYWRhcHRlci1iaW5kLWRhdGEtdHlwZXMiIC8+CisgKiA8aDQ+QmluZGluZyBkYXRhIHR5cGVzPC9oND4KKyAqIDxwPkZvciBhIGJpbmRpbmcgdG8gb2NjdXIgdGhlIGRhdGEgdHlwZSBvZiB0aGUgYm91bmQgY29sdW1uL3ZpZXcgcGFpciBtdXN0IGJlIHNwZWNpZmllZC4KKyAqIFRoZSBmb2xsb3dpbmcgZGF0YSB0eXBlcyBhcmUgY3VycmVudGx5IHN1cHBvcnRlZDo8L3A+CisgKiA8dWw+CisgKiAgPGxpPjxjb2RlPnN0cmluZzwvY29kZT46IFRoZSBjb250ZW50IG9mIHRoZSBjb2x1bW4gaXMgaW50ZXJwcmV0ZWQgYXMgYSBzdHJpbmcgYW5kIG11c3QgYmUKKyAqICBib3VuZCB0byBhIHtAbGluayBhbmRyb2lkLndpZGdldC5UZXh0Vmlld308L2xpPgorICogIDxsaT48Y29kZT5pbWFnZTwvY29kZT46IFRoZSBjb250ZW50IG9mIHRoZSBjb2x1bW4gaXMgaW50ZXJwcmV0ZWQgYXMgYSBibG9iIGRlc2NyaWJpbmcgYW4KKyAqICBpbWFnZSBhbmQgbXVzdCBiZSBib3VuZCB0byBhbiB7QGxpbmsgYW5kcm9pZC53aWRnZXQuSW1hZ2VWaWV3fTwvbGk+CisgKiAgPGxpPjxjb2RlPmltYWdlLXVyaTwvY29kZT46IFRoZSBjb250ZW50IG9mIHRoZSBjb2x1bW4gaXMgaW50ZXJwcmV0ZWQgYXMgYSBVUkkgdG8gYW4gaW1hZ2UKKyAqICBhbmQgbXVzdCBiZSBib3VuZCB0byBhbiB7QGxpbmsgYW5kcm9pZC53aWRnZXQuSW1hZ2VWaWV3fTwvbGk+CisgKiAgPGxpPjxjb2RlPmRyYXdhYmxlPC9jb2RlPjogVGhlIGNvbnRlbnQgb2YgdGhlIGNvbHVtbiBpcyBpbnRlcnByZXRlZCBhcyBhIHJlc291cmNlIGlkIHRvIGEKKyAqICBkcmF3YWJsZSBhbmQgbXVzdCBiZSBib3VuZCB0byBhbiB7QGxpbmsgYW5kcm9pZC53aWRnZXQuSW1hZ2VWaWV3fTwvbGk+CisgKiAgPGxpPjxjb2RlPnRhZzwvY29kZT46IFRoZSBjb250ZW50IG9mIHRoZSBjb2x1bW4gaXMgaW50ZXJwcmV0ZWQgYXMgYSBzdHJpbmcgYW5kIHdpbGwgYmUgc2V0IGFzCisgKiAgdGhlIHRhZyAodXNpbmcge0BsaW5rIFZpZXcjc2V0VGFnKE9iamVjdCl9IG9mIHRoZSBhc3NvY2lhdGVkIFZpZXcuIFRoaXMgY2FuIGJlIHVzZWQgdG8KKyAqICBhc3NvY2lhdGUgbWV0YS1kYXRhIHRvIHlvdXIgdmlldywgdGhhdCBjYW4gYmUgdXNlZCBmb3IgaW5zdGFuY2UgYnkgYSBsaXN0ZW5lci48L2xpPgorICogIDxsaT5BIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lOiBUaGUgbmFtZSBvZiBhIGNsYXNzIGNvcnJlc3BvbmRpbmcgdG8gYW4gaW1wbGVtZW50YXRpb24gb2YKKyAqICB7QGxpbmsgYW5kcm9pZC53aWRnZXQuQWRhcHRlcnMuQ3Vyc29yQmluZGVyfS4gQ3Vyc29yIGJpbmRlcnMgY2FuIGJlIHVzZWQgdG8gcHJvdmlkZQorICogIGJpbmRpbmdzIG5vdCBzdXBwb3J0ZWQgYnkgZGVmYXVsdC4gQ3VzdG9tIGJpbmRlcnMgY2Fubm90IGJlIHVzZWQgd2l0aAorICogIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCNpc1Jlc3RyaWN0ZWQoKSByZXN0cmljdGVkIGNvbnRleHRzfSwgZm9yIGluc3RhbmNlIGluIGFuCisgKiAgYXBwbGljYXRpb24gd2lkZ2V0PC9saT4KKyAqIDwvdWw+CisgKiAKKyAqIDxhIG5hbWU9InhtbC1jdXJzb3ItYWRhcHRlci1iaW5kLXRyYW5zZm9ybWF0aW9uIiAvPgorICogPGg0PkJpbmRpbmcgdHJhbnNmb3JtYXRpb25zPC9oND4KKyAqIDxwPldoZW4gZGVmaW5pbmcgYSBkYXRhIGJpbmRpbmcgeW91IGNhbiBzcGVjaWZ5IGFuIG9wdGlvbmFsIHRyYW5zZm9ybWF0aW9uIGJ5IHVzaW5nIG9uZQorICogb2YgdGhlIGZvbGxvd2luZyB0YWdzIGFzIGEgY2hpbGQgb2YgYSA8Y29kZT4mbHQ7YmluZCAvJmd0OzwvY29kZT4gZWxlbWVudHM6PC9wPgorICogPHVsPgorICogIDxsaT48Y29kZT4mbHQ7bWFwIC8mZ3Q7PC9jb2RlPjogTWFwcyBhIGNvbnN0YW50IHN0cmluZyB0byBhIHN0cmluZyBvciBhIHJlc291cmNlLiBVc2UKKyAqICBvbmUgaW5zdGFuY2Ugb2YgdGhpcyB0YWcgcGVyIHZhbHVlIHlvdSB3YW50IHRvIG1hcDwvbGk+CisgKiAgPGxpPjxjb2RlPiZsdDt0cmFuc2Zvcm0gLyZndDs8L2NvZGU+OiBUcmFuc2Zvcm1zIGEgY29sdW1uJ3MgdmFsdWUgdXNpbmcgYW4gZXhwcmVzc2lvbgorICogIG9yIGFuIGluc3RhbmNlIG9mIHtAbGluayBhbmRyb2lkLndpZGdldC5BZGFwdGVycy5DdXJzb3JUcmFuc2Zvcm1hdGlvbn08L2xpPgorICogPC91bD4KKyAqIDxwPldoaWxlIHNldmVyYWwgPGNvZGU+Jmx0O21hcCAvJmd0OzwvY29kZT4gdGFncyBjYW4gYmUgdXNlZCBhdCB0aGUgc2FtZSB0aW1lLCB5b3UgY2Fubm90CisgKiBtaXggPGNvZGU+Jmx0O21hcCAvJmd0OzwvY29kZT4gYW5kIDxjb2RlPiZsdDt0cmFuc2Zvcm0gLyZndDs8L2NvZGU+IHRhZ3MuIElmIHNldmVyYWwKKyAqIDxjb2RlPiZsdDt0cmFuc2Zvcm0gLyZndDs8L2NvZGU+IHRhZ3MgYXJlIHNwZWNpZmllZCwgb25seSB0aGUgbGFzdCBvbmUgaXMgcmV0YWluZWQuPC9wPgorICogCisgKiA8YSBuYW1lPSJ4bWwtY3Vyc29yLWFkYXB0ZXItYmluZC10cmFuc2Zvcm1hdGlvbi1tYXAiIC8+CisgKiA8cD48c3Ryb25nPiZsdDttYXAgLyZndDs8L3N0cm9uZz48L3A+CisgKiA8cD5BIG1hcCBlbGVtZW50IHNpbXBseSBzcGVjaWZpZXMgYSB2YWx1ZSB0byBtYXRjaCBmcm9tIGFuZCBhIHZhbHVlIHRvIG1hdGNoIHRvLiBXaGVuCisgKiBhIGNvbHVtbidzIHZhbHVlIGVxdWFscyB0aGUgdmFsdWUgdG8gbWF0Y2ggZnJvbSwgaXQgaXMgcmVwbGFjZWQgd2l0aCB0aGUgdmFsdWUgdG8gbWF0Y2gKKyAqIHRvLiBUaGUgZm9sbG93aW5nIGF0dHJpYnV0ZXMgYXJlIHN1cHBvcnRlZDo8L3A+CisgKiA8dWw+CisgKiAgPGxpPjxjb2RlPmFuZHJvaWQ6ZnJvbVZhbHVlPC9jb2RlPjogVGhlIHZhbHVlIHRvIG1hdGNoIGZyb20uIFRoaXMgYXR0cmlidXRlIGlzIG1hbmRhdG9yeTwvbGk+CisgKiAgPGxpPjxjb2RlPmFuZHJvaWQ6dG9WYWx1ZTwvY29kZT46IFRoZSB2YWx1ZSB0byBtYXRjaCB0by4gVGhpcyB2YWx1ZSBjYW4gYmUgZWl0aGVyIGEgc3RyaW5nCisgKiAgb3IgYSByZXNvdXJjZSBpZGVudGlmaWVyLiBUaGlzIHZhbHVlIGlzIGludGVycHJldGVkIGFzIGEgcmVzb3VyY2UgaWRlbnRpZmllciB3aGVuIHRoZQorICogIGRhdGEgYmluZGluZyBpcyBvZiB0eXBlIDxjb2RlPmRyYXdhYmxlPC9jb2RlPi4gVGhpcyBhdHRyaWJ1dGUgaXMgbWFuZGF0b3J5PC9saT4KKyAqIDwvdWw+CisgKiAKKyAqIDxhIG5hbWU9InhtbC1jdXJzb3ItYWRhcHRlci1iaW5kLXRyYW5zZm9ybWF0aW9uLXRyYW5zZm9ybSIgLz4KKyAqIDxwPjxzdHJvbmc+Jmx0O3RyYW5zZm9ybSAvJmd0Ozwvc3Ryb25nPjwvcD4KKyAqIDxwPkEgc2ltcGxlIHRyYW5zZm9ybSB0aGF0IG9jY3VycyBlaXRoZXIgYnkgY2FsbGluZyBhIHNwZWNpZmllZCBjbGFzcyBvciBieSBwZXJmb3JtaW5nCisgKiBzaW1wbGUgdGV4dCBzdWJzdGl0dXRpb24uIFRoZSBmb2xsb3dpbmcgYXR0cmlidXRlcyBhcmUgc3VwcG9ydGVkOjwvcD4KKyAqIDx1bD4KKyAqICA8bGk+PGNvZGU+YW5kcm9pZDp3aXRoRXhwcmVzc2lvbjwvY29kZT46IFRoZSB0cmFuc2Zvcm1hdGlvbiBleHByZXNzaW9uLiBUaGUgZXhwcmVzc2lvbiBpcworICogIGEgc3RyaW5nIGNvbnRhaW5pbmcgY29sdW1uIG5hbWVzIHN1cnJvdW5kZWQgd2l0aCBjdXJseSBicmFjZXMgeyBhbmQgfS4gRHVyaW5nIHRoZQorICogIHRyYW5zZm9ybWF0aW9uIGVhY2ggY29sdW1uIG5hbWUgaXMgcmVwbGFjZWQgYnkgaXRzIHZhbHVlLiBBbGwgY29sdW1ucyBtdXN0IGhhdmUgYmVlbgorICogIHNlbGVjdGVkIGluIHRoZSBxdWVyeS4gQW4gZXhhbXBsZSBvZiBleHByZXNzaW9uIGlzIDxjb2RlPiJGaXJzdCBuYW1lOiB7Zmlyc3RfbmFtZX0sCisgKiAgbGFzdCBuYW1lOiB7bGFzdF9uYW1lfSI8L2NvZGU+LiBUaGlzIGF0dHJpYnV0ZSBpcyBtYW5kYXRvcnkKKyAqICBpZiA8Y29kZT5hbmRyb2lkOndpdGhDbGFzczwvY29kZT4gaXMgbm90IHNwZWNpZmllZCBhbmQgaWdub3JlZCBpZiA8Y29kZT5hbmRyb2lkOndpdGhDbGFzczwvY29kZT4KKyAqICBpcyBzcGVjaWZpZWQ8L2xpPgorICogIDxsaT48Y29kZT5hbmRyb2lkOndpdGhDbGFzczwvY29kZT46IEEgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgY29ycmVzcG9uZGluZyB0byBhbgorICogIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBhbmRyb2lkLndpZGdldC5BZGFwdGVycy5DdXJzb3JUcmFuc2Zvcm1hdGlvbn0uIEN1c3RvbQorICogIHRyYW5zZm9ybWF0aW9ucyBjYW5ub3QgYmUgdXNlZCB3aXRoCisgKiAge0BsaW5rIGFuZHJvaWQuY29udGVudC5Db250ZXh0I2lzUmVzdHJpY3RlZCgpIHJlc3RyaWN0ZWQgY29udGV4dHN9LCBmb3IgaW5zdGFuY2UgaW4KKyAqICBhbiBhcHAgd2lkZ2V0IFRoaXMgYXR0cmlidXRlIGlzIG1hbmRhdG9yeSBpZiA8Y29kZT5hbmRyb2lkOndpdGhFeHByZXNzaW9uPC9jb2RlPiBpcworICogIG5vdCBzcGVjaWZpZWQ8L2xpPgorICogPC91bD4KKyAqIAorICogPGgzPkV4YW1wbGU8L2gzPgorICogPHA+VGhlIGZvbGxvd2luZyBleGFtcGxlIGRlZmluZXMgYSBjdXJzb3IgYWRhcHRlciB0aGF0IHF1ZXJpZXMgYWxsIHRoZSBjb250YWN0cyB3aXRoCisgKiBhIHBob25lIG51bWJlciB1c2luZyB0aGUgY29udGFjdHMgY29udGVudCBwcm92aWRlci4gRWFjaCBjb250YWN0IGlzIGRpc3BsYXllZCB3aXRoCisgKiBpdHMgZGlzcGxheSBuYW1lLCBpdHMgZmF2b3JpdGUgc3RhdHVzIGFuZCBpdHMgcGhvdG8uIFRvIGRpc3BsYXkgcGhvdG9zLCBhIGN1c3RvbSBkYXRhCisgKiBiaW5kZXIgaXMgZGVjbGFyZWQ6PC9wPgorICogCisgKiA8cHJlIGNsYXNzPSJwcmV0dHlwcmludCI+CisgKiAmbHQ7Y3Vyc29yLWFkYXB0ZXIgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICogICAgIGFuZHJvaWQ6dXJpPSJjb250ZW50Oi8vY29tLmFuZHJvaWQuY29udGFjdHMvY29udGFjdHMiCisgKiAgICAgYW5kcm9pZDpzZWxlY3Rpb249Imhhc19waG9uZV9udW1iZXI9MSIKKyAqICAgICBhbmRyb2lkOmxheW91dD0iQGxheW91dC9jb250YWN0X2l0ZW0iJmd0OworICoKKyAqICAgICAmbHQ7YmluZCBhbmRyb2lkOmZyb209ImRpc3BsYXlfbmFtZSIgYW5kcm9pZDp0bz0iQGlkL25hbWUiIGFuZHJvaWQ6YXM9InN0cmluZyIgLyZndDsKKyAqICAgICAmbHQ7YmluZCBhbmRyb2lkOmZyb209InN0YXJyZWQiIGFuZHJvaWQ6dG89IkBpZC9zdGFyIiBhbmRyb2lkOmFzPSJkcmF3YWJsZSImZ3Q7CisgKiAgICAgICAgICZsdDttYXAgYW5kcm9pZDpmcm9tVmFsdWU9IjAiIGFuZHJvaWQ6dG9WYWx1ZT0iQGFuZHJvaWQ6ZHJhd2FibGUvc3Rhcl9iaWdfb2ZmIiAvJmd0OworICogICAgICAgICAmbHQ7bWFwIGFuZHJvaWQ6ZnJvbVZhbHVlPSIxIiBhbmRyb2lkOnRvVmFsdWU9IkBhbmRyb2lkOmRyYXdhYmxlL3N0YXJfYmlnX29uIiAvJmd0OworICogICAgICZsdDsvYmluZCZndDsKKyAqICAgICAmbHQ7YmluZCBhbmRyb2lkOmZyb209Il9pZCIgYW5kcm9pZDp0bz0iQGlkL25hbWUiCisgKiAgICAgICAgICAgICAgYW5kcm9pZDphcz0iY29tLmdvb2dsZS5hbmRyb2lkLnRlc3QuYWRhcHRlcnMuQ29udGFjdFBob3RvQmluZGVyIiAvJmd0OworICoKKyAqICZsdDsvY3Vyc29yLWFkYXB0ZXImZ3Q7CisgKiA8L3ByZT4KKyAqIAorICogPGgzPlJlbGF0ZWQgQVBJczwvaDM+CisgKiA8dWw+CisgKiAgPGxpPntAbGluayBhbmRyb2lkLndpZGdldC5BZGFwdGVycyNsb2FkQWRhcHRlcihhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCwgaW50LCBPYmplY3RbXSl9PC9saT4KKyAqICA8bGk+e0BsaW5rIGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJzI2xvYWRDdXJzb3JBZGFwdGVyKGFuZHJvaWQuY29udGVudC5Db250ZXh0LCBpbnQsIGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yLCBPYmplY3RbXSl9PC9saT4KKyAqICA8bGk+e0BsaW5rIGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJzI2xvYWRDdXJzb3JBZGFwdGVyKGFuZHJvaWQuY29udGVudC5Db250ZXh0LCBpbnQsIFN0cmluZywgT2JqZWN0W10pfTwvbGk+CisgKiAgPGxpPntAbGluayBhbmRyb2lkLndpZGdldC5BZGFwdGVycy5DdXJzb3JCaW5kZXJ9PC9saT4KKyAqICA8bGk+e0BsaW5rIGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJzLkN1cnNvclRyYW5zZm9ybWF0aW9ufTwvbGk+CisgKiAgPGxpPntAbGluayBhbmRyb2lkLndpZGdldC5DdXJzb3JBZGFwdGVyfTwvbGk+CisgKiA8L3VsPgorICogCisgKiBAc2VlIGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXIKKyAqIEBzZWUgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRQcm92aWRlcgorICogCisgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNDdXJzb3JBZGFwdGVyX2xheW91dCAKKyAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0N1cnNvckFkYXB0ZXJfc2VsZWN0aW9uIAorICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjQ3Vyc29yQWRhcHRlcl9zb3J0T3JkZXIgCisgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNDdXJzb3JBZGFwdGVyX3VyaSAKKyAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0N1cnNvckFkYXB0ZXJfQmluZEl0ZW1fYXMgCisgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNDdXJzb3JBZGFwdGVyX0JpbmRJdGVtX2Zyb20gCisgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNDdXJzb3JBZGFwdGVyX0JpbmRJdGVtX3RvCisgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNDdXJzb3JBZGFwdGVyX01hcEl0ZW1fZnJvbVZhbHVlIAorICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjQ3Vyc29yQWRhcHRlcl9NYXBJdGVtX3RvVmFsdWUgCisgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNDdXJzb3JBZGFwdGVyX1NlbGVjdEl0ZW1fY29sdW1uIAorICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjQ3Vyc29yQWRhcHRlcl9UcmFuc2Zvcm1JdGVtX3dpdGhDbGFzcyAKKyAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0N1cnNvckFkYXB0ZXJfVHJhbnNmb3JtSXRlbV93aXRoRXhwcmVzc2lvbiAKKyAqLworQFN1cHByZXNzV2FybmluZ3MoeyJKYXZhZG9jUmVmZXJlbmNlIn0pCitwdWJsaWMgY2xhc3MgQWRhcHRlcnMgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBREFQVEVSX0NVUlNPUiA9ICJjdXJzb3ItYWRhcHRlciI7CisKKyAgICAvKioKKyAgICAgKiA8cD5JbnRlcmZhY2UgdXNlZCB0byBiaW5kIGEge0BsaW5rIGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yfSBjb2x1bW4gdG8gYSBWaWV3LiBUaGlzCisgICAgICogaW50ZXJmYWNlIGNhbiBiZSB1c2VkIHRvIHByb3ZpZGUgYmluZGluZ3MgZm9yIGRhdGEgdHlwZXMgbm90IHN1cHBvcnRlZCBieSB0aGUKKyAgICAgKiBzdGFuZGFyZCBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgYW5kcm9pZC53aWRnZXQuQWRhcHRlcnN9LjwvcD4KKyAgICAgKiAKKyAgICAgKiA8cD5BIGJpbmRlciBpcyBwcm92aWRlZCB3aXRoIGEgY3Vyc29yIHRyYW5zZm9ybWF0aW9uIHdoaWNoIG1heSBvciBtYXkgbm90IGJlIHVzZWQKKyAgICAgKiB0byB0cmFuc2Zvcm0gdGhlIHZhbHVlIHJldHJpZXZlZCBmcm9tIHRoZSBjdXJzb3IuIFRoZSB0cmFuc2Zvcm1hdGlvbiBpcyBndWFyYW50ZWVkCisgICAgICogdG8gbmV2ZXIgYmUgbnVsbCBzbyBpdCdzIGFsd2F5cyBzYWZlIHRvIGFwcGx5IHRoZSB0cmFuc2Zvcm1hdGlvbi48L3A+CisgICAgICogCisgICAgICogPHA+VGhlIGJpbmRlciBpcyBhc3NvY2lhdGVkIHdpdGggYSBDb250ZXh0IGJ1dCBjYW4gYmUgcmUtdXNlZCB3aXRoIG11bHRpcGxlIGN1cnNvcnMuCisgICAgICogQXMgc3VjaCwgdGhlIGltcGxlbWVudGF0aW9uIHNob3VsZCBtYWtlIG5vIGFzc3VtcHRpb24gYWJvdXQgdGhlIEN1cnNvciBpbiB1c2UuPC9wPgorICAgICAqCisgICAgICogQHNlZSBhbmRyb2lkLnZpZXcuVmlldyAKKyAgICAgKiBAc2VlIGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yCisgICAgICogQHNlZSBhbmRyb2lkLndpZGdldC5BZGFwdGVycy5DdXJzb3JUcmFuc2Zvcm1hdGlvbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgQ3Vyc29yQmluZGVyIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIDxwPlRoZSBjb250ZXh0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGJpbmRlci48L3A+CisgICAgICAgICAqLworICAgICAgICBwcm90ZWN0ZWQgZmluYWwgQ29udGV4dCBtQ29udGV4dDsKKworICAgICAgICAvKioKKyAgICAgICAgICogPHA+VGhlIHRyYW5zZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGJpbmRlci4gVGhpcyB0cmFuc2Zvcm1hdGlvbiBpcyBuZXZlcgorICAgICAgICAgKiBudWxsIGFuZCBtYXkgb3IgbWF5IG5vdCBiZSBhcHBsaWVkIHRvIHRoZSBDdXJzb3IgZGF0YSBkdXJpbmcgdGhlCisgICAgICAgICAqIHtAbGluayAjYmluZChhbmRyb2lkLnZpZXcuVmlldywgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IsIGludCl9IG9wZXJhdGlvbi48L3A+CisgICAgICAgICAqIAorICAgICAgICAgKiBAc2VlICNiaW5kKGFuZHJvaWQudmlldy5WaWV3LCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvciwgaW50KSAKKyAgICAgICAgICovCisgICAgICAgIHByb3RlY3RlZCBmaW5hbCBDdXJzb3JUcmFuc2Zvcm1hdGlvbiBtVHJhbnNmb3JtYXRpb247CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIDxwPkNyZWF0ZXMgYSBuZXcgQ3Vyc29yIGJpbmRlci48L3A+IAorICAgICAgICAgKiAKKyAgICAgICAgICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgYmluZGVyLgorICAgICAgICAgKiBAcGFyYW0gdHJhbnNmb3JtYXRpb24gVGhlIHRyYW5zZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGJpbmRlci4gVGhpcworICAgICAgICAgKiAgICAgICAgdHJhbnNmb3JtYXRpb24gbWF5IG9yIG1heSBub3QgYmUgYXBwbGllZCBieSB0aGUgYmluZGVyIGFuZCBpcyBndWFyYW50ZWVkCisgICAgICAgICAqICAgICAgICB0byBub3QgYmUgbnVsbC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBDdXJzb3JCaW5kZXIoQ29udGV4dCBjb250ZXh0LCBDdXJzb3JUcmFuc2Zvcm1hdGlvbiB0cmFuc2Zvcm1hdGlvbikgeworICAgICAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OworICAgICAgICAgICAgbVRyYW5zZm9ybWF0aW9uID0gdHJhbnNmb3JtYXRpb247CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogPHA+QmluZHMgdGhlIHNwZWNpZmllZCBDdXJzb3IgY29sdW1uIHRvIHRoZSBzdXBwbGllZCBWaWV3LiBUaGUgYmluZGluZyBvcGVyYXRpb24KKyAgICAgICAgICogY2FuIHF1ZXJ5IG90aGVyIEN1cnNvciBjb2x1bW5zIGFzIG5lZWRlZC4gRHVyaW5nIHRoZSBiaW5kaW5nIG9wZXJhdGlvbiwgdmFsdWVzCisgICAgICAgICAqIHJldHJpZXZlZCBmcm9tIHRoZSBDdXJzb3IgbWF5IG9yIG1heSBub3QgYmUgdHJhbnNmb3JtZWQgdXNpbmcgdGhpcyBiaW5kZXIncworICAgICAgICAgKiBjdXJzb3IgdHJhbnNmb3JtYXRpb24uPC9wPgorICAgICAgICAgKiAKKyAgICAgICAgICogQHBhcmFtIHZpZXcgVGhlIHZpZXcgdG8gYmluZCBkYXRhIHRvLgorICAgICAgICAgKiBAcGFyYW0gY3Vyc29yIFRoZSBjdXJzb3IgdG8gYmluZCBkYXRhIGZyb20uCisgICAgICAgICAqIEBwYXJhbSBjb2x1bW5JbmRleCBUaGUgY29sdW1uIGluZGV4IGluIHRoZSBjdXJzb3Igd2hlcmUgdGhlIGRhdGEgdG8gYmluZCByZXNpZGVzLgorICAgICAgICAgKiAKKyAgICAgICAgICogQHNlZSAjbVRyYW5zZm9ybWF0aW9uCisgICAgICAgICAqIAorICAgICAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGNvbHVtbiB3YXMgc3VjY2Vzc2Z1bGx5IGJvdW5kIHRvIHRoZSBWaWV3LCBmYWxzZSBvdGhlcndpc2UuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBiaW5kKFZpZXcgdmlldywgQ3Vyc29yIGN1cnNvciwgaW50IGNvbHVtbkluZGV4KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiA8cD5JbnRlcmZhY2UgdXNlZCB0byB0cmFuc2Zvcm0gZGF0YSBjb21pbmcgb3V0IG9mIGEge0BsaW5rIGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yfQorICAgICAqIGJlZm9yZSBpdCBpcyBib3VuZCB0byBhIHtAbGluayBhbmRyb2lkLnZpZXcuVmlld30uPC9wPgorICAgICAqIAorICAgICAqIDxwPlRyYW5zZm9ybWF0aW9ucyBhcmUgdXNlZCB0byB0cmFuc2Zvcm0gdGV4dC1iYXNlZCBkYXRhIChpbiB0aGUgZm9ybSBvZiBhIFN0cmluZyksCisgICAgICogb3IgdG8gdHJhbnNmb3JtIGRhdGEgaW50byBhIHJlc291cmNlIGlkZW50aWZpZXIuIEEgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBpcyBwcm92aWRlZAorICAgICAqIHRvIGdlbmVyYXRlIHJlc291cmNlIGlkZW50aWZpZXJzLjwvcD4KKyAgICAgKiAKKyAgICAgKiBAc2VlIGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yCisgICAgICogQHNlZSBhbmRyb2lkLndpZGdldC5BZGFwdGVycy5DdXJzb3JCaW5kZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIEN1cnNvclRyYW5zZm9ybWF0aW9uIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIDxwPlRoZSBjb250ZXh0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRyYW5zZm9ybWF0aW9uLjwvcD4KKyAgICAgICAgICovCisgICAgICAgIHByb3RlY3RlZCBmaW5hbCBDb250ZXh0IG1Db250ZXh0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiA8cD5DcmVhdGVzIGEgbmV3IEN1cnNvciB0cmFuc2Zvcm1hdGlvbi48L3A+CisgICAgICAgICAqIAorICAgICAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCBhc3NvY2lhdGVkIHdpdGggdGhpcyB0cmFuc2Zvcm1hdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBDdXJzb3JUcmFuc2Zvcm1hdGlvbihDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiA8cD5UcmFuc2Zvcm1zIHRoZSBzcGVjaWZpZWQgQ3Vyc29yIGNvbHVtbiBpbnRvIGEgU3RyaW5nLiBUaGUgdHJhbnNmb3JtYXRpb24KKyAgICAgICAgICogY2FuIHNpbXBseSByZXR1cm4gdGhlIGNvbnRlbnQgb2YgdGhlIGNvbHVtbiBhcyBhIFN0cmluZyAodGhpcyBpcyBrbm93bgorICAgICAgICAgKiBhcyB0aGUgaWRlbnRpdHkgdHJhbnNmb3JtYXRpb24pIG9yIG1hbmlwdWxhdGUgdGhlIGNvbnRlbnQuIEZvciBpbnN0YW5jZSwKKyAgICAgICAgICogYSB0cmFuc2Zvcm1hdGlvbiBjYW4gcGVyZm9ybSB0ZXh0IHN1YnN0aXR1dGlvbnMgb3IgY29uY2F0ZW5hdGUgb3RoZXIKKyAgICAgICAgICogY29sdW1ucyB3aXRoIHRoZSBzcGVjaWZpZWQgY29sdW1uLjwvcD4KKyAgICAgICAgICogCisgICAgICAgICAqIEBwYXJhbSBjdXJzb3IgVGhlIGN1cnNvciB0aGF0IGNvbnRhaW5zIHRoZSBkYXRhIHRvIHRyYW5zZm9ybS4gCisgICAgICAgICAqIEBwYXJhbSBjb2x1bW5JbmRleCBUaGUgaW5kZXggb2YgdGhlIGNvbHVtbiB0byB0cmFuc2Zvcm0uCisgICAgICAgICAqIAorICAgICAgICAgKiBAcmV0dXJuIEEgU3RyaW5nIGNvbnRhaW5pbmcgdGhlIHRyYW5zZm9ybWVkIHZhbHVlIG9mIHRoZSBjb2x1bW4uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIHRyYW5zZm9ybShDdXJzb3IgY3Vyc29yLCBpbnQgY29sdW1uSW5kZXgpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiA8cD5UcmFuc2Zvcm1zIHRoZSBzcGVjaWZpZWQgQ3Vyc29yIGNvbHVtbiBpbnRvIGEgcmVzb3VyY2UgaWRlbnRpZmllci4KKyAgICAgICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gc2ltcGx5IGludGVycHJldHMgdGhlIGNvbnRlbnQgb2YgdGhlIGNvbHVtbgorICAgICAgICAgKiBhcyBhbiBpbnRlZ2VyLjwvcD4KKyAgICAgICAgICogCisgICAgICAgICAqIEBwYXJhbSBjdXJzb3IgVGhlIGN1cnNvciB0aGF0IGNvbnRhaW5zIHRoZSBkYXRhIHRvIHRyYW5zZm9ybS4gCisgICAgICAgICAqIEBwYXJhbSBjb2x1bW5JbmRleCBUaGUgaW5kZXggb2YgdGhlIGNvbHVtbiB0byB0cmFuc2Zvcm0uCisgICAgICAgICAqIAorICAgICAgICAgKiBAcmV0dXJuIEEgcmVzb3VyY2UgaWRlbnRpZmllci4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBpbnQgdHJhbnNmb3JtVG9SZXNvdXJjZShDdXJzb3IgY3Vyc29yLCBpbnQgY29sdW1uSW5kZXgpIHsKKyAgICAgICAgICAgIHJldHVybiBjdXJzb3IuZ2V0SW50KGNvbHVtbkluZGV4KTsKKyAgICAgICAgfSAgICAgICAgCisgICAgfQorCisgICAgLyoqCisgICAgICogPHA+TG9hZHMgdGhlIHtAbGluayBhbmRyb2lkLndpZGdldC5DdXJzb3JBZGFwdGVyfSBkZWZpbmVkIGluIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBYTUwgcmVzb3VyY2UuIFRoZSBjb250ZW50IG9mIHRoZSBhZGFwdGVyIGlzIGxvYWRlZCBmcm9tIHRoZSBjb250ZW50IHByb3ZpZGVyCisgICAgICogaWRlbnRpZmllZCBieSB0aGUgc3VwcGxpZWQgVVJJLjwvcD4KKyAgICAgKiAKKyAgICAgKiA8cD48c3Ryb25nPk5vdGU6PC9zdHJvbmc+IElmIHRoZSBzdXBwbGllZCB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkNvbnRleHR9IGlzCisgICAgICogYW4ge0BsaW5rIGFuZHJvaWQuYXBwLkFjdGl2aXR5fSwgdGhlIGN1cnNvciByZXR1cm5lZCBieSB0aGUgY29udGVudCBwcm92aWRlcgorICAgICAqIHdpbGwgYmUgYXV0b21hdGljYWxseSBtYW5hZ2VkLiBPdGhlcndpc2UsIHlvdSBhcmUgcmVzcG9uc2libGUgZm9yIG1hbmFnaW5nIHRoZQorICAgICAqIGN1cnNvciB5b3Vyc2VsZi48L3A+CisgICAgICogCisgICAgICogPHA+VGhlIGZvcm1hdCBvZiB0aGUgWE1MIGRlZmluaXRpb24gb2YgdGhlIGN1cnNvciBhZGFwdGVyIGlzIGRvY3VtZW50ZWQgYXQKKyAgICAgKiB0aGUgdG9wIG9mIHRoaXMgcGFnZS48L3A+CisgICAgICogCisgICAgICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgdG8gbG9hZCB0aGUgWE1MIHJlc291cmNlIGZyb20uCisgICAgICogQHBhcmFtIGlkIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBYTUwgcmVzb3VyY2UgZGVjbGFyaW5nIHRoZSBhZGFwdGVyLgorICAgICAqIEBwYXJhbSB1cmkgVGhlIFVSSSBvZiB0aGUgY29udGVudCBwcm92aWRlci4KKyAgICAgKiBAcGFyYW0gcGFyYW1ldGVycyBPcHRpb25hbCBwYXJhbWV0ZXJzIHRvIHBhc3MgdG8gdGhlIEN1cnNvckFkYXB0ZXIsIHVzZWQKKyAgICAgKiAgICAgICAgdG8gc3Vic3RpdHV0ZSB2YWx1ZXMgaW4gdGhlIHNlbGVjdGlvbiBleHByZXNzaW9uLgorICAgICAqIAorICAgICAqIEByZXR1cm4gQSB7QGxpbmsgYW5kcm9pZC53aWRnZXQuQ3Vyc29yQWRhcHRlcn0KKyAgICAgKiAKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBJZiB0aGUgWE1MIHJlc291cmNlIGRvZXMgbm90IGNvbnRhaW4KKyAgICAgKiAgICAgICAgIGEgdmFsaWQgJmx0O2N1cnNvci1hZGFwdGVyIC8mZ3Q7IGRlZmluaXRpb24uCisgICAgICogCisgICAgICogQHNlZSBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFByb3ZpZGVyCisgICAgICogQHNlZSBhbmRyb2lkLndpZGdldC5DdXJzb3JBZGFwdGVyCisgICAgICogQHNlZSAjbG9hZEFkYXB0ZXIoYW5kcm9pZC5jb250ZW50LkNvbnRleHQsIGludCwgT2JqZWN0W10pIAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQ3Vyc29yQWRhcHRlciBsb2FkQ3Vyc29yQWRhcHRlcihDb250ZXh0IGNvbnRleHQsIGludCBpZCwgU3RyaW5nIHVyaSwKKyAgICAgICAgICAgIE9iamVjdC4uLiBwYXJhbWV0ZXJzKSB7CisKKyAgICAgICAgWG1sQ3Vyc29yQWRhcHRlciBhZGFwdGVyID0gKFhtbEN1cnNvckFkYXB0ZXIpIGxvYWRBZGFwdGVyKGNvbnRleHQsIGlkLCBBREFQVEVSX0NVUlNPUiwKKyAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzKTsKKworICAgICAgICBpZiAodXJpICE9IG51bGwpIHsKKyAgICAgICAgICAgIGFkYXB0ZXIuc2V0VXJpKHVyaSk7CisgICAgICAgIH0KKyAgICAgICAgYWRhcHRlci5sb2FkKCk7CisKKyAgICAgICAgcmV0dXJuIGFkYXB0ZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogPHA+TG9hZHMgdGhlIHtAbGluayBhbmRyb2lkLndpZGdldC5DdXJzb3JBZGFwdGVyfSBkZWZpbmVkIGluIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBYTUwgcmVzb3VyY2UuIFRoZSBjb250ZW50IG9mIHRoZSBhZGFwdGVyIGlzIGxvYWRlZCBmcm9tIHRoZSBzcGVjaWZpZWQgY3Vyc29yLgorICAgICAqIFlvdSBhcmUgcmVzcG9uc2libGUgZm9yIG1hbmFnaW5nIHRoZSBzdXBwbGllZCBjdXJzb3IuPC9wPgorICAgICAqIAorICAgICAqIDxwPlRoZSBmb3JtYXQgb2YgdGhlIFhNTCBkZWZpbml0aW9uIG9mIHRoZSBjdXJzb3IgYWRhcHRlciBpcyBkb2N1bWVudGVkIGF0CisgICAgICogdGhlIHRvcCBvZiB0aGlzIHBhZ2UuPC9wPgorICAgICAqIAorICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IHRvIGxvYWQgdGhlIFhNTCByZXNvdXJjZSBmcm9tLgorICAgICAqIEBwYXJhbSBpZCBUaGUgaWRlbnRpZmllciBvZiB0aGUgWE1MIHJlc291cmNlIGRlY2xhcmluZyB0aGUgYWRhcHRlci4KKyAgICAgKiBAcGFyYW0gY3Vyc29yIFRoZSBjdXJzb3IgY29udGFpbmluZyB0aGUgZGF0YSBmb3IgdGhlIGFkYXB0ZXIuCisgICAgICogQHBhcmFtIHBhcmFtZXRlcnMgT3B0aW9uYWwgcGFyYW1ldGVycyB0byBwYXNzIHRvIHRoZSBDdXJzb3JBZGFwdGVyLCB1c2VkCisgICAgICogICAgICAgIHRvIHN1YnN0aXR1dGUgdmFsdWVzIGluIHRoZSBzZWxlY3Rpb24gZXhwcmVzc2lvbi4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIEEge0BsaW5rIGFuZHJvaWQud2lkZ2V0LkN1cnNvckFkYXB0ZXJ9CisgICAgICogCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gSWYgdGhlIFhNTCByZXNvdXJjZSBkb2VzIG5vdCBjb250YWluCisgICAgICogICAgICAgICBhIHZhbGlkICZsdDtjdXJzb3ItYWRhcHRlciAvJmd0OyBkZWZpbml0aW9uLgorICAgICAqIAorICAgICAqIEBzZWUgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRQcm92aWRlcgorICAgICAqIEBzZWUgYW5kcm9pZC53aWRnZXQuQ3Vyc29yQWRhcHRlcgorICAgICAqIEBzZWUgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IKKyAgICAgKiBAc2VlICNsb2FkQWRhcHRlcihhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCwgaW50LCBPYmplY3RbXSkgCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBDdXJzb3JBZGFwdGVyIGxvYWRDdXJzb3JBZGFwdGVyKENvbnRleHQgY29udGV4dCwgaW50IGlkLCBDdXJzb3IgY3Vyc29yLAorICAgICAgICAgICAgT2JqZWN0Li4uIHBhcmFtZXRlcnMpIHsKKworICAgICAgICBYbWxDdXJzb3JBZGFwdGVyIGFkYXB0ZXIgPSAoWG1sQ3Vyc29yQWRhcHRlcikgbG9hZEFkYXB0ZXIoY29udGV4dCwgaWQsIEFEQVBURVJfQ1VSU09SLAorICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMpOworCisgICAgICAgIGlmIChjdXJzb3IgIT0gbnVsbCkgeworICAgICAgICAgICAgYWRhcHRlci5jaGFuZ2VDdXJzb3IoY3Vyc29yKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBhZGFwdGVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIDxwPkxvYWRzIHRoZSBhZGFwdGVyIGRlZmluZWQgaW4gdGhlIHNwZWNpZmllZCBYTUwgcmVzb3VyY2UuIFRoZSBYTUwgZGVmaW5pdGlvbiBvZgorICAgICAqIHRoZSBhZGFwdGVyIG11c3QgZm9sbG93IHRoZSBmb3JtYXQgZGVmaW5pdGlvbiBvZiBvbmUgb2YgdGhlIHN1cHBvcnRlZCBhZGFwdGVyCisgICAgICogdHlwZXMgZGVzY3JpYmVkIGF0IHRoZSB0b3Agb2YgdGhpcyBwYWdlLjwvcD4KKyAgICAgKiAKKyAgICAgKiA8cD48c3Ryb25nPk5vdGU6PC9zdHJvbmc+IElmIHRoZSBsb2FkZWQgYWRhcHRlciBpcyBhIHtAbGluayBhbmRyb2lkLndpZGdldC5DdXJzb3JBZGFwdGVyfQorICAgICAqIGFuZCB0aGUgc3VwcGxpZWQge0BsaW5rIGFuZHJvaWQuY29udGVudC5Db250ZXh0fSBpcyBhbiB7QGxpbmsgYW5kcm9pZC5hcHAuQWN0aXZpdHl9LAorICAgICAqIHRoZSBjdXJzb3IgcmV0dXJuZWQgYnkgdGhlIGNvbnRlbnQgcHJvdmlkZXIgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IG1hbmFnZWQuIE90aGVyd2lzZSwKKyAgICAgKiB5b3UgYXJlIHJlc3BvbnNpYmxlIGZvciBtYW5hZ2luZyB0aGUgY3Vyc29yIHlvdXJzZWxmLjwvcD4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCB0byBsb2FkIHRoZSBYTUwgcmVzb3VyY2UgZnJvbS4KKyAgICAgKiBAcGFyYW0gaWQgVGhlIGlkZW50aWZpZXIgb2YgdGhlIFhNTCByZXNvdXJjZSBkZWNsYXJpbmcgdGhlIGFkYXB0ZXIuCisgICAgICogQHBhcmFtIHBhcmFtZXRlcnMgT3B0aW9uYWwgcGFyYW1ldGVycyB0byBwYXNzIHRvIHRoZSBhZGFwdGVyLgorICAgICAqICAKKyAgICAgKiBAcmV0dXJuIEFuIGFkYXB0ZXIgaW5zdGFuY2UuCisgICAgICogCisgICAgICogQHNlZSAjbG9hZEN1cnNvckFkYXB0ZXIoYW5kcm9pZC5jb250ZW50LkNvbnRleHQsIGludCwgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IsIE9iamVjdFtdKSAKKyAgICAgKiBAc2VlICNsb2FkQ3Vyc29yQWRhcHRlcihhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCwgaW50LCBTdHJpbmcsIE9iamVjdFtdKSAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEJhc2VBZGFwdGVyIGxvYWRBZGFwdGVyKENvbnRleHQgY29udGV4dCwgaW50IGlkLCBPYmplY3QuLi4gcGFyYW1ldGVycykgeworICAgICAgICBmaW5hbCBCYXNlQWRhcHRlciBhZGFwdGVyID0gbG9hZEFkYXB0ZXIoY29udGV4dCwgaWQsIG51bGwsIHBhcmFtZXRlcnMpOworICAgICAgICBpZiAoYWRhcHRlciBpbnN0YW5jZW9mIE1hbmFnZWRBZGFwdGVyKSB7CisgICAgICAgICAgICAoKE1hbmFnZWRBZGFwdGVyKSBhZGFwdGVyKS5sb2FkKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGFkYXB0ZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogTG9hZHMgYW4gYWRhcHRlciBmcm9tIHRoZSBzcGVjaWZpZWQgWE1MIHJlc291cmNlLiBUaGUgb3B0aW9uYWwgYXNzZXJ0TmFtZSBjYW4KKyAgICAgKiBiZSB1c2VkIHRvIGV4aXQgZWFybHkgaWYgdGhlIGFkYXB0ZXIgZGVmaW5lZCBpbiB0aGUgWE1MIHJlc291cmNlIGlzIG5vdCBvZiB0aGUKKyAgICAgKiBleHBlY3RlZCB0eXBlLgorICAgICAqIAorICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IHRvIGFzc29jaWF0ZSB3aXRoIHRoZSBhZGFwdGVyLgorICAgICAqIEBwYXJhbSBpZCBUaGUgcmVzb3VyY2UgaWQgb2YgdGhlIFhNTCBkb2N1bWVudCBkZWZpbmluZyB0aGUgYWRhcHRlci4KKyAgICAgKiBAcGFyYW0gYXNzZXJ0TmFtZSBUaGUgbWFuZGF0b3J5IG5hbWUgb2YgdGhlIGFkYXB0ZXIgaW4gdGhlIFhNTCBkb2N1bWVudC4KKyAgICAgKiAgICAgICAgSWdub3JlZCBpZiBudWxsLgorICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJzIE9wdGlvbmFsIHBhcmFtZXRlcnMgcGFzc2VkIHRvIHRoZSBhZGFwdGVyLgorICAgICAqIAorICAgICAqIEByZXR1cm4gQW4gaW5zdGFuY2Ugb2Yge0BsaW5rIGFuZHJvaWQud2lkZ2V0LkJhc2VBZGFwdGVyfS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBCYXNlQWRhcHRlciBsb2FkQWRhcHRlcihDb250ZXh0IGNvbnRleHQsIGludCBpZCwgU3RyaW5nIGFzc2VydE5hbWUsCisgICAgICAgICAgICBPYmplY3QuLi4gcGFyYW1ldGVycykgeworCisgICAgICAgIFhtbFJlc291cmNlUGFyc2VyIHBhcnNlciA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwYXJzZXIgPSBjb250ZXh0LmdldFJlc291cmNlcygpLmdldFhtbChpZCk7CisgICAgICAgICAgICByZXR1cm4gY3JlYXRlQWRhcHRlckZyb21YbWwoY29udGV4dCwgcGFyc2VyLCBYbWwuYXNBdHRyaWJ1dGVTZXQocGFyc2VyKSwKKyAgICAgICAgICAgICAgICAgICAgaWQsIHBhcmFtZXRlcnMsIGFzc2VydE5hbWUpOworICAgICAgICB9IGNhdGNoIChYbWxQdWxsUGFyc2VyRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBSZXNvdXJjZXMuTm90Rm91bmRFeGNlcHRpb24gcm5mID0gbmV3IFJlc291cmNlcy5Ob3RGb3VuZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIkNhbid0IGxvYWQgYWRhcHRlciByZXNvdXJjZSBJRCAiICsKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRSZXNvdXJjZUVudHJ5TmFtZShpZCkpOworICAgICAgICAgICAgcm5mLmluaXRDYXVzZShleCk7CisgICAgICAgICAgICB0aHJvdyBybmY7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBSZXNvdXJjZXMuTm90Rm91bmRFeGNlcHRpb24gcm5mID0gbmV3IFJlc291cmNlcy5Ob3RGb3VuZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIkNhbid0IGxvYWQgYWRhcHRlciByZXNvdXJjZSBJRCAiICsKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRSZXNvdXJjZUVudHJ5TmFtZShpZCkpOworICAgICAgICAgICAgcm5mLmluaXRDYXVzZShleCk7CisgICAgICAgICAgICB0aHJvdyBybmY7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAocGFyc2VyICE9IG51bGwpIHBhcnNlci5jbG9zZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2VuZXJhdGVzIGFuIGFkYXB0ZXIgdXNpbmcgdGhlIHNwZWNpZmllZCBYTUwgcGFyc2VyLiBUaGlzIG1ldGhvZCBpcyByZXNwb25zaWJsZQorICAgICAqIGZvciBjaG9vc2luZyB0aGUgdHlwZSBvZiB0aGUgYWRhcHRlciB0byBjcmVhdGUgYmFzZWQgb24gdGhlIGNvbnRlbnQgb2YgdGhlCisgICAgICogWE1MIHBhcnNlci4KKyAgICAgKiAKKyAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGdlbmVyYXRlIGFuIHtAbGluayBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb259IGlmCisgICAgICogPGNvZGU+YXNzZXJ0TmFtZTwvY29kZT4gaXMgbm90IG51bGwgYW5kIGRvZXMgbm90IG1hdGNoIHRoZSByb290IHRhZyBvZiB0aGUgWE1MCisgICAgICogZG9jdW1lbnQuIAorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIEJhc2VBZGFwdGVyIGNyZWF0ZUFkYXB0ZXJGcm9tWG1sKENvbnRleHQgYywKKyAgICAgICAgICAgIFhtbFB1bGxQYXJzZXIgcGFyc2VyLCBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBpZCwgT2JqZWN0W10gcGFyYW1ldGVycywKKyAgICAgICAgICAgIFN0cmluZyBhc3NlcnROYW1lKSB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworCisgICAgICAgIEJhc2VBZGFwdGVyIGFkYXB0ZXIgPSBudWxsOworCisgICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBhcmUgb24gYSBzdGFydCB0YWcuCisgICAgICAgIGludCB0eXBlOworICAgICAgICBpbnQgZGVwdGggPSBwYXJzZXIuZ2V0RGVwdGgoKTsKKworICAgICAgICB3aGlsZSAoKCh0eXBlID0gcGFyc2VyLm5leHQoKSkgIT0gWG1sUHVsbFBhcnNlci5FTkRfVEFHIHx8IHBhcnNlci5nZXREZXB0aCgpID4gZGVwdGgpICYmCisgICAgICAgICAgICAgICAgdHlwZSAhPSBYbWxQdWxsUGFyc2VyLkVORF9ET0NVTUVOVCkgeworCisgICAgICAgICAgICBpZiAodHlwZSAhPSBYbWxQdWxsUGFyc2VyLlNUQVJUX1RBRykgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IHBhcnNlci5nZXROYW1lKCk7CisgICAgICAgICAgICBpZiAoYXNzZXJ0TmFtZSAhPSBudWxsICYmICFhc3NlcnROYW1lLmVxdWFscyhuYW1lKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBhZGFwdGVyIGRlZmluZWQgaW4gIiArCisgICAgICAgICAgICAgICAgICAgICAgICBjLmdldFJlc291cmNlcygpLmdldFJlc291cmNlRW50cnlOYW1lKGlkKSArICIgbXVzdCBiZSBhIDwiICsgbmFtZSArICIgLz4iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKEFEQVBURVJfQ1VSU09SLmVxdWFscyhuYW1lKSkgeworICAgICAgICAgICAgICAgIGFkYXB0ZXIgPSBjcmVhdGVDdXJzb3JBZGFwdGVyKGMsIHBhcnNlciwgYXR0cnMsIGlkLCBwYXJhbWV0ZXJzKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5rbm93biBhZGFwdGVyIG5hbWUgIiArIHBhcnNlci5nZXROYW1lKCkgKworICAgICAgICAgICAgICAgICAgICAgICAgIiBpbiAiICsgYy5nZXRSZXNvdXJjZXMoKS5nZXRSZXNvdXJjZUVudHJ5TmFtZShpZCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGFkYXB0ZXI7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGFuIFhtbEN1cnNvckFkYXB0ZXIgdXNpbmcgYW4gWG1sQ3Vyc29yQWRhcHRlclBhcnNlci4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBYbWxDdXJzb3JBZGFwdGVyIGNyZWF0ZUN1cnNvckFkYXB0ZXIoQ29udGV4dCBjLCBYbWxQdWxsUGFyc2VyIHBhcnNlciwKKyAgICAgICAgICAgIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGlkLCBPYmplY3RbXSBwYXJhbWV0ZXJzKQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uIHsKKworICAgICAgICByZXR1cm4gbmV3IFhtbEN1cnNvckFkYXB0ZXJQYXJzZXIoYywgcGFyc2VyLCBhdHRycywgaWQpLnBhcnNlKHBhcmFtZXRlcnMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhcnNlciB0aGF0IGNhbiBnZW5lcmF0ZSBYbWxDdXJzb3JBZGFwdGVyIGluc3RhbmNlcy4gVGhpcyBwYXJzZXIgaXMgcmVzcG9uc2libGUgZm9yCisgICAgICogaGFuZGxpbmcgYWxsIHRoZSBhdHRyaWJ1dGVzIGFuZCBjaGlsZCBub2RlcyBmb3IgYSAmbHQ7Y3Vyc29yLWFkYXB0ZXIgLyZndDsuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgWG1sQ3Vyc29yQWRhcHRlclBhcnNlciB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBREFQVEVSX0NVUlNPUl9CSU5EID0gImJpbmQiOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQURBUFRFUl9DVVJTT1JfU0VMRUNUID0gInNlbGVjdCI7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBREFQVEVSX0NVUlNPUl9BU19TVFJJTkcgPSAic3RyaW5nIjsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFEQVBURVJfQ1VSU09SX0FTX0lNQUdFID0gImltYWdlIjsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFEQVBURVJfQ1VSU09SX0FTX1RBRyA9ICJ0YWciOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQURBUFRFUl9DVVJTT1JfQVNfSU1BR0VfVVJJID0gImltYWdlLXVyaSI7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBREFQVEVSX0NVUlNPUl9BU19EUkFXQUJMRSA9ICJkcmF3YWJsZSI7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBREFQVEVSX0NVUlNPUl9NQVAgPSAibWFwIjsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFEQVBURVJfQ1VSU09SX1RSQU5TRk9STSA9ICJ0cmFuc2Zvcm0iOworCisgICAgICAgIHByaXZhdGUgZmluYWwgQ29udGV4dCBtQ29udGV4dDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBYbWxQdWxsUGFyc2VyIG1QYXJzZXI7CisgICAgICAgIHByaXZhdGUgZmluYWwgQXR0cmlidXRlU2V0IG1BdHRyczsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbUlkOworCisgICAgICAgIHByaXZhdGUgZmluYWwgSGFzaE1hcDxTdHJpbmcsIEN1cnNvckJpbmRlcj4gbUJpbmRlcnM7CisgICAgICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0PFN0cmluZz4gbUZyb207CisgICAgICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0PEludGVnZXI+IG1UbzsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBDdXJzb3JUcmFuc2Zvcm1hdGlvbiBtSWRlbnRpdHk7CisgICAgICAgIHByaXZhdGUgZmluYWwgUmVzb3VyY2VzIG1SZXNvdXJjZXM7CisKKyAgICAgICAgcHVibGljIFhtbEN1cnNvckFkYXB0ZXJQYXJzZXIoQ29udGV4dCBjLCBYbWxQdWxsUGFyc2VyIHBhcnNlciwgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgaWQpIHsKKyAgICAgICAgICAgIG1Db250ZXh0ID0gYzsKKyAgICAgICAgICAgIG1QYXJzZXIgPSBwYXJzZXI7CisgICAgICAgICAgICBtQXR0cnMgPSBhdHRyczsKKyAgICAgICAgICAgIG1JZCA9IGlkOworCisgICAgICAgICAgICBtUmVzb3VyY2VzID0gbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCk7CisgICAgICAgICAgICBtQmluZGVycyA9IG5ldyBIYXNoTWFwPFN0cmluZywgQ3Vyc29yQmluZGVyPigpOworICAgICAgICAgICAgbUZyb20gPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKyAgICAgICAgICAgIG1UbyA9IG5ldyBBcnJheUxpc3Q8SW50ZWdlcj4oKTsKKyAgICAgICAgICAgIG1JZGVudGl0eSA9IG5ldyBJZGVudGl0eVRyYW5zZm9ybWF0aW9uKG1Db250ZXh0KTsgICAgICAgICAgICAKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBYbWxDdXJzb3JBZGFwdGVyIHBhcnNlKE9iamVjdFtdIHBhcmFtZXRlcnMpCisgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24geworCisgICAgICAgICAgICBSZXNvdXJjZXMgcmVzb3VyY2VzID0gbVJlc291cmNlczsKKyAgICAgICAgICAgIFR5cGVkQXJyYXkgYSA9IHJlc291cmNlcy5vYnRhaW5BdHRyaWJ1dGVzKG1BdHRycywgYW5kcm9pZC5SLnN0eWxlYWJsZS5DdXJzb3JBZGFwdGVyKTsKKworICAgICAgICAgICAgU3RyaW5nIHVyaSA9IGEuZ2V0U3RyaW5nKGFuZHJvaWQuUi5zdHlsZWFibGUuQ3Vyc29yQWRhcHRlcl91cmkpOworICAgICAgICAgICAgU3RyaW5nIHNlbGVjdGlvbiA9IGEuZ2V0U3RyaW5nKGFuZHJvaWQuUi5zdHlsZWFibGUuQ3Vyc29yQWRhcHRlcl9zZWxlY3Rpb24pOworICAgICAgICAgICAgU3RyaW5nIHNvcnRPcmRlciA9IGEuZ2V0U3RyaW5nKGFuZHJvaWQuUi5zdHlsZWFibGUuQ3Vyc29yQWRhcHRlcl9zb3J0T3JkZXIpOworICAgICAgICAgICAgaW50IGxheW91dCA9IGEuZ2V0UmVzb3VyY2VJZChhbmRyb2lkLlIuc3R5bGVhYmxlLkN1cnNvckFkYXB0ZXJfbGF5b3V0LCAwKTsKKyAgICAgICAgICAgIGlmIChsYXlvdXQgPT0gMCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBsYXlvdXQgc3BlY2lmaWVkIGluICIgKworICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldFJlc291cmNlRW50cnlOYW1lKG1JZCkgKyAiIGRvZXMgbm90IGV4aXN0Iik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGEucmVjeWNsZSgpOworCisgICAgICAgICAgICBYbWxQdWxsUGFyc2VyIHBhcnNlciA9IG1QYXJzZXI7CisgICAgICAgICAgICBpbnQgdHlwZTsKKyAgICAgICAgICAgIGludCBkZXB0aCA9IHBhcnNlci5nZXREZXB0aCgpOworCisgICAgICAgICAgICB3aGlsZSAoKCh0eXBlID0gcGFyc2VyLm5leHQoKSkgIT0gWG1sUHVsbFBhcnNlci5FTkRfVEFHIHx8IHBhcnNlci5nZXREZXB0aCgpID4gZGVwdGgpICYmCisgICAgICAgICAgICAgICAgICAgIHR5cGUgIT0gWG1sUHVsbFBhcnNlci5FTkRfRE9DVU1FTlQpIHsKKworICAgICAgICAgICAgICAgIGlmICh0eXBlICE9IFhtbFB1bGxQYXJzZXIuU1RBUlRfVEFHKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gcGFyc2VyLmdldE5hbWUoKTsKKworICAgICAgICAgICAgICAgIGlmIChBREFQVEVSX0NVUlNPUl9CSU5ELmVxdWFscyhuYW1lKSkgeworICAgICAgICAgICAgICAgICAgICBwYXJzZUJpbmRUYWcoKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKEFEQVBURVJfQ1VSU09SX1NFTEVDVC5lcXVhbHMobmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcGFyc2VTZWxlY3RUYWcoKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVW5rbm93biB0YWcgbmFtZSAiICsgcGFyc2VyLmdldE5hbWUoKSArICIgaW4gIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldFJlc291cmNlRW50cnlOYW1lKG1JZCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU3RyaW5nW10gZnJvbUFycmF5ID0gbUZyb20udG9BcnJheShuZXcgU3RyaW5nW21Gcm9tLnNpemUoKV0pOworICAgICAgICAgICAgaW50W10gdG9BcnJheSA9IG5ldyBpbnRbbVRvLnNpemUoKV07CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRvQXJyYXkubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICB0b0FycmF5W2ldID0gbVRvLmdldChpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU3RyaW5nW10gc2VsZWN0aW9uQXJncyA9IG51bGw7CisgICAgICAgICAgICBpZiAocGFyYW1ldGVycyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgc2VsZWN0aW9uQXJncyA9IG5ldyBTdHJpbmdbcGFyYW1ldGVycy5sZW5ndGhdOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VsZWN0aW9uQXJncy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25BcmdzW2ldID0gKFN0cmluZykgcGFyYW1ldGVyc1tpXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBuZXcgWG1sQ3Vyc29yQWRhcHRlcihtQ29udGV4dCwgbGF5b3V0LCB1cmksIGZyb21BcnJheSwgdG9BcnJheSwgc2VsZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25BcmdzLCBzb3J0T3JkZXIsIG1CaW5kZXJzKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBwYXJzZVNlbGVjdFRhZygpIHsKKyAgICAgICAgICAgIFR5cGVkQXJyYXkgYSA9IG1SZXNvdXJjZXMub2J0YWluQXR0cmlidXRlcyhtQXR0cnMsCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQuUi5zdHlsZWFibGUuQ3Vyc29yQWRhcHRlcl9TZWxlY3RJdGVtKTsKKworICAgICAgICAgICAgU3RyaW5nIGZyb21OYW1lID0gYS5nZXRTdHJpbmcoYW5kcm9pZC5SLnN0eWxlYWJsZS5DdXJzb3JBZGFwdGVyX1NlbGVjdEl0ZW1fY29sdW1uKTsKKyAgICAgICAgICAgIGlmIChmcm9tTmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQSBzZWxlY3QgaXRlbSBpbiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0UmVzb3VyY2VFbnRyeU5hbWUobUlkKSArCisgICAgICAgICAgICAgICAgICAgICAgICAiIGRvZXMgbm90IGhhdmUgYSAnY29sdW1uJyBhdHRyaWJ1dGUiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYS5yZWN5Y2xlKCk7CisKKyAgICAgICAgICAgIG1Gcm9tLmFkZChmcm9tTmFtZSk7CisgICAgICAgICAgICBtVG8uYWRkKFZpZXcuTk9fSUQpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIHBhcnNlQmluZFRhZygpIHRocm93cyBJT0V4Y2VwdGlvbiwgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiB7CisgICAgICAgICAgICBSZXNvdXJjZXMgcmVzb3VyY2VzID0gbVJlc291cmNlczsKKyAgICAgICAgICAgIFR5cGVkQXJyYXkgYSA9IHJlc291cmNlcy5vYnRhaW5BdHRyaWJ1dGVzKG1BdHRycywKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZC5SLnN0eWxlYWJsZS5DdXJzb3JBZGFwdGVyX0JpbmRJdGVtKTsKKworICAgICAgICAgICAgU3RyaW5nIGZyb21OYW1lID0gYS5nZXRTdHJpbmcoYW5kcm9pZC5SLnN0eWxlYWJsZS5DdXJzb3JBZGFwdGVyX0JpbmRJdGVtX2Zyb20pOworICAgICAgICAgICAgaWYgKGZyb21OYW1lID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJBIGJpbmQgaXRlbSBpbiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRSZXNvdXJjZUVudHJ5TmFtZShtSWQpICsgIiBkb2VzIG5vdCBoYXZlIGEgJ2Zyb20nIGF0dHJpYnV0ZSIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnQgdG9OYW1lID0gYS5nZXRSZXNvdXJjZUlkKGFuZHJvaWQuUi5zdHlsZWFibGUuQ3Vyc29yQWRhcHRlcl9CaW5kSXRlbV90bywgMCk7CisgICAgICAgICAgICBpZiAodG9OYW1lID09IDApIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJBIGJpbmQgaXRlbSBpbiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRSZXNvdXJjZUVudHJ5TmFtZShtSWQpICsgIiBkb2VzIG5vdCBoYXZlIGEgJ3RvJyBhdHRyaWJ1dGUiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU3RyaW5nIGFzVHlwZSA9IGEuZ2V0U3RyaW5nKGFuZHJvaWQuUi5zdHlsZWFibGUuQ3Vyc29yQWRhcHRlcl9CaW5kSXRlbV9hcyk7CisgICAgICAgICAgICBpZiAoYXNUeXBlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJBIGJpbmQgaXRlbSBpbiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRSZXNvdXJjZUVudHJ5TmFtZShtSWQpICsgIiBkb2VzIG5vdCBoYXZlIGFuICdhcycgYXR0cmlidXRlIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1Gcm9tLmFkZChmcm9tTmFtZSk7CisgICAgICAgICAgICBtVG8uYWRkKHRvTmFtZSk7CisgICAgICAgICAgICBtQmluZGVycy5wdXQoZnJvbU5hbWUsIGZpbmRCaW5kZXIoYXNUeXBlKSk7CisKKyAgICAgICAgICAgIGEucmVjeWNsZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBDdXJzb3JCaW5kZXIgZmluZEJpbmRlcihTdHJpbmcgdHlwZSkgdGhyb3dzIElPRXhjZXB0aW9uLCBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGZpbmFsIFhtbFB1bGxQYXJzZXIgcGFyc2VyID0gbVBhcnNlcjsKKyAgICAgICAgICAgIGZpbmFsIENvbnRleHQgY29udGV4dCA9IG1Db250ZXh0OworICAgICAgICAgICAgQ3Vyc29yVHJhbnNmb3JtYXRpb24gdHJhbnNmb3JtYXRpb24gPSBtSWRlbnRpdHk7CisKKyAgICAgICAgICAgIGludCB0YWdUeXBlOworICAgICAgICAgICAgaW50IGRlcHRoID0gcGFyc2VyLmdldERlcHRoKCk7CisKKyAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNEcmF3YWJsZSA9IEFEQVBURVJfQ1VSU09SX0FTX0RSQVdBQkxFLmVxdWFscyh0eXBlKTsgICAgICAgICAgICAKKworICAgICAgICAgICAgd2hpbGUgKCgodGFnVHlwZSA9IHBhcnNlci5uZXh0KCkpICE9IFhtbFB1bGxQYXJzZXIuRU5EX1RBRyB8fCBwYXJzZXIuZ2V0RGVwdGgoKSA+IGRlcHRoKQorICAgICAgICAgICAgICAgICAgICAmJiB0YWdUeXBlICE9IFhtbFB1bGxQYXJzZXIuRU5EX0RPQ1VNRU5UKSB7CisKKyAgICAgICAgICAgICAgICBpZiAodGFnVHlwZSAhPSBYbWxQdWxsUGFyc2VyLlNUQVJUX1RBRykgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IHBhcnNlci5nZXROYW1lKCk7CisKKyAgICAgICAgICAgICAgICBpZiAoQURBUFRFUl9DVVJTT1JfVFJBTlNGT1JNLmVxdWFscyhuYW1lKSkgeworICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm1hdGlvbiA9IGZpbmRUcmFuc2Zvcm1hdGlvbigpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoQURBUFRFUl9DVVJTT1JfTUFQLmVxdWFscyhuYW1lKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoISh0cmFuc2Zvcm1hdGlvbiBpbnN0YW5jZW9mIE1hcFRyYW5zZm9ybWF0aW9uKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtYXRpb24gPSBuZXcgTWFwVHJhbnNmb3JtYXRpb24oY29udGV4dCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZmluZE1hcCgoKE1hcFRyYW5zZm9ybWF0aW9uKSB0cmFuc2Zvcm1hdGlvbiksIGlzRHJhd2FibGUpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJVbmtub3duIHRhZyBuYW1lICIgKyBwYXJzZXIuZ2V0TmFtZSgpICsgIiBpbiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmdldFJlc291cmNlcygpLmdldFJlc291cmNlRW50cnlOYW1lKG1JZCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKEFEQVBURVJfQ1VSU09SX0FTX1NUUklORy5lcXVhbHModHlwZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ0JpbmRlcihjb250ZXh0LCB0cmFuc2Zvcm1hdGlvbik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKEFEQVBURVJfQ1VSU09SX0FTX1RBRy5lcXVhbHModHlwZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRhZ0JpbmRlcihjb250ZXh0LCB0cmFuc2Zvcm1hdGlvbik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKEFEQVBURVJfQ1VSU09SX0FTX0lNQUdFLmVxdWFscyh0eXBlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSW1hZ2VCaW5kZXIoY29udGV4dCwgdHJhbnNmb3JtYXRpb24pOyAgICAgICAgICAgIAorICAgICAgICAgICAgfSBlbHNlIGlmIChBREFQVEVSX0NVUlNPUl9BU19JTUFHRV9VUkkuZXF1YWxzKHR5cGUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBJbWFnZVVyaUJpbmRlcihjb250ZXh0LCB0cmFuc2Zvcm1hdGlvbik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGlzRHJhd2FibGUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IERyYXdhYmxlQmluZGVyKGNvbnRleHQsIHRyYW5zZm9ybWF0aW9uKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUJpbmRlcih0eXBlLCB0cmFuc2Zvcm1hdGlvbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIEN1cnNvckJpbmRlciBjcmVhdGVCaW5kZXIoU3RyaW5nIHR5cGUsIEN1cnNvclRyYW5zZm9ybWF0aW9uIHRyYW5zZm9ybWF0aW9uKSB7CisgICAgICAgICAgICBpZiAobUNvbnRleHQuaXNSZXN0cmljdGVkKCkpIHJldHVybiBudWxsOworCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzPD8+IGtsYXNzID0gQ2xhc3MuZm9yTmFtZSh0eXBlLCB0cnVlLCBtQ29udGV4dC5nZXRDbGFzc0xvYWRlcigpKTsKKyAgICAgICAgICAgICAgICBpZiAoQ3Vyc29yQmluZGVyLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oa2xhc3MpKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIENvbnN0cnVjdG9yPD8+IGMgPSBrbGFzcy5nZXREZWNsYXJlZENvbnN0cnVjdG9yKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRleHQuY2xhc3MsIEN1cnNvclRyYW5zZm9ybWF0aW9uLmNsYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChDdXJzb3JCaW5kZXIpIGMubmV3SW5zdGFuY2UobUNvbnRleHQsIHRyYW5zZm9ybWF0aW9uKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDYW5ub3QgaW5zdGFuY2lhdGUgYmluZGVyIHR5cGUgaW4gIiArCisgICAgICAgICAgICAgICAgICAgICAgICBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRSZXNvdXJjZUVudHJ5TmFtZShtSWQpICsgIjogIiArIHR5cGUsIGUpOworICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDYW5ub3QgaW5zdGFuY2lhdGUgYmluZGVyIHR5cGUgaW4gIiArCisgICAgICAgICAgICAgICAgICAgICAgICBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRSZXNvdXJjZUVudHJ5TmFtZShtSWQpICsgIjogIiArIHR5cGUsIGUpOworICAgICAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2Fubm90IGluc3RhbmNpYXRlIGJpbmRlciB0eXBlIGluICIgKworICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0UmVzb3VyY2VFbnRyeU5hbWUobUlkKSArICI6ICIgKyB0eXBlLCBlKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNhbm5vdCBpbnN0YW5jaWF0ZSBiaW5kZXIgdHlwZSBpbiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LmdldFJlc291cmNlcygpLmdldFJlc291cmNlRW50cnlOYW1lKG1JZCkgKyAiOiAiICsgdHlwZSwgZSk7CisgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDYW5ub3QgaW5zdGFuY2lhdGUgYmluZGVyIHR5cGUgaW4gIiArCisgICAgICAgICAgICAgICAgICAgICAgICBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRSZXNvdXJjZUVudHJ5TmFtZShtSWQpICsgIjogIiArIHR5cGUsIGUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBmaW5kTWFwKE1hcFRyYW5zZm9ybWF0aW9uIHRyYW5zZm9ybWF0aW9uLCBib29sZWFuIGRyYXdhYmxlKSB7CisgICAgICAgICAgICBSZXNvdXJjZXMgcmVzb3VyY2VzID0gbVJlc291cmNlczsKKworICAgICAgICAgICAgVHlwZWRBcnJheSBhID0gcmVzb3VyY2VzLm9idGFpbkF0dHJpYnV0ZXMobUF0dHJzLAorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkLlIuc3R5bGVhYmxlLkN1cnNvckFkYXB0ZXJfTWFwSXRlbSk7CisKKyAgICAgICAgICAgIFN0cmluZyBmcm9tID0gYS5nZXRTdHJpbmcoYW5kcm9pZC5SLnN0eWxlYWJsZS5DdXJzb3JBZGFwdGVyX01hcEl0ZW1fZnJvbVZhbHVlKTsKKyAgICAgICAgICAgIGlmIChmcm9tID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJBIG1hcCBpdGVtIGluICIgKworICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldFJlc291cmNlRW50cnlOYW1lKG1JZCkgKworICAgICAgICAgICAgICAgICAgICAgICAgIiBkb2VzIG5vdCBoYXZlIGEgJ2Zyb21WYWx1ZScgYXR0cmlidXRlIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghZHJhd2FibGUpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgdG8gPSBhLmdldFN0cmluZyhhbmRyb2lkLlIuc3R5bGVhYmxlLkN1cnNvckFkYXB0ZXJfTWFwSXRlbV90b1ZhbHVlKTsKKyAgICAgICAgICAgICAgICBpZiAodG8gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJBIG1hcCBpdGVtIGluICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRSZXNvdXJjZUVudHJ5TmFtZShtSWQpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGRvZXMgbm90IGhhdmUgYSAndG9WYWx1ZScgYXR0cmlidXRlIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRyYW5zZm9ybWF0aW9uLmFkZFN0cmluZ01hcHBpbmcoZnJvbSwgdG8pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbnQgdG8gPSBhLmdldFJlc291cmNlSWQoYW5kcm9pZC5SLnN0eWxlYWJsZS5DdXJzb3JBZGFwdGVyX01hcEl0ZW1fdG9WYWx1ZSwgMCk7CisgICAgICAgICAgICAgICAgaWYgKHRvID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQSBtYXAgaXRlbSBpbiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0UmVzb3VyY2VFbnRyeU5hbWUobUlkKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBkb2VzIG5vdCBoYXZlIGEgJ3RvVmFsdWUnIGF0dHJpYnV0ZSIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0cmFuc2Zvcm1hdGlvbi5hZGRSZXNvdXJjZU1hcHBpbmcoZnJvbSwgdG8pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhLnJlY3ljbGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgQ3Vyc29yVHJhbnNmb3JtYXRpb24gZmluZFRyYW5zZm9ybWF0aW9uKCkgeworICAgICAgICAgICAgUmVzb3VyY2VzIHJlc291cmNlcyA9IG1SZXNvdXJjZXM7CisgICAgICAgICAgICBDdXJzb3JUcmFuc2Zvcm1hdGlvbiB0cmFuc2Zvcm1hdGlvbiA9IG51bGw7CisgICAgICAgICAgICBUeXBlZEFycmF5IGEgPSByZXNvdXJjZXMub2J0YWluQXR0cmlidXRlcyhtQXR0cnMsCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQuUi5zdHlsZWFibGUuQ3Vyc29yQWRhcHRlcl9UcmFuc2Zvcm1JdGVtKTsKKworICAgICAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IGEuZ2V0U3RyaW5nKGFuZHJvaWQuUi5zdHlsZWFibGUuQ3Vyc29yQWRhcHRlcl9UcmFuc2Zvcm1JdGVtX3dpdGhDbGFzcyk7CisgICAgICAgICAgICBpZiAoY2xhc3NOYW1lID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgZXhwcmVzc2lvbiA9IGEuZ2V0U3RyaW5nKAorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZC5SLnN0eWxlYWJsZS5DdXJzb3JBZGFwdGVyX1RyYW5zZm9ybUl0ZW1fd2l0aEV4cHJlc3Npb24pOworICAgICAgICAgICAgICAgIHRyYW5zZm9ybWF0aW9uID0gY3JlYXRlRXhwcmVzc2lvblRyYW5zZm9ybWF0aW9uKGV4cHJlc3Npb24pOworICAgICAgICAgICAgfSBlbHNlIGlmICghbUNvbnRleHQuaXNSZXN0cmljdGVkKCkpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBDbGFzczw/PiBrbGFzID0gQ2xhc3MuZm9yTmFtZShjbGFzc05hbWUsIHRydWUsIG1Db250ZXh0LmdldENsYXNzTG9hZGVyKCkpOworICAgICAgICAgICAgICAgICAgICBpZiAoQ3Vyc29yVHJhbnNmb3JtYXRpb24uY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShrbGFzKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQ29uc3RydWN0b3I8Pz4gYyA9IGtsYXMuZ2V0RGVjbGFyZWRDb25zdHJ1Y3RvcihDb250ZXh0LmNsYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybWF0aW9uID0gKEN1cnNvclRyYW5zZm9ybWF0aW9uKSBjLm5ld0luc3RhbmNlKG1Db250ZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDYW5ub3QgaW5zdGFuY2lhdGUgdHJhbnNmb3JtIHR5cGUgaW4gIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRSZXNvdXJjZUVudHJ5TmFtZShtSWQpICsgIjogIiArIGNsYXNzTmFtZSwgZSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2Fubm90IGluc3RhbmNpYXRlIHRyYW5zZm9ybSB0eXBlIGluICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0UmVzb3VyY2VFbnRyeU5hbWUobUlkKSArICI6ICIgKyBjbGFzc05hbWUsIGUpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDYW5ub3QgaW5zdGFuY2lhdGUgdHJhbnNmb3JtIHR5cGUgaW4gIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRSZXNvdXJjZUVudHJ5TmFtZShtSWQpICsgIjogIiArIGNsYXNzTmFtZSwgZSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNhbm5vdCBpbnN0YW5jaWF0ZSB0cmFuc2Zvcm0gdHlwZSBpbiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LmdldFJlc291cmNlcygpLmdldFJlc291cmNlRW50cnlOYW1lKG1JZCkgKyAiOiAiICsgY2xhc3NOYW1lLCBlKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2Fubm90IGluc3RhbmNpYXRlIHRyYW5zZm9ybSB0eXBlIGluICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0UmVzb3VyY2VFbnRyeU5hbWUobUlkKSArICI6ICIgKyBjbGFzc05hbWUsIGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYS5yZWN5Y2xlKCk7CisKKyAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1hdGlvbiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQSB0cmFuc2Zvcm0gaXRlbSBpbiAiICsKKyAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldFJlc291cmNlRW50cnlOYW1lKG1JZCkgKyAiIG11c3QgaGF2ZSBhICd3aXRoQ2xhc3MnIG9yICIgKworICAgICAgICAgICAgICAgICAgICAiJ3dpdGhFeHByZXNzaW9uJyBhdHRyaWJ1dGUiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHRyYW5zZm9ybWF0aW9uOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBDdXJzb3JUcmFuc2Zvcm1hdGlvbiBjcmVhdGVFeHByZXNzaW9uVHJhbnNmb3JtYXRpb24oU3RyaW5nIGV4cHJlc3Npb24pIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgRXhwcmVzc2lvblRyYW5zZm9ybWF0aW9uKG1Db250ZXh0LCBleHByZXNzaW9uKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEludGVyZmFjZSB1c2VkIGJ5IGFkYXB0ZXJzIHRoYXQgcmVxdWlyZSB0byBiZSBsb2FkZWQgYWZ0ZXIgY3JlYXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50ZXJmYWNlIE1hbmFnZWRBZGFwdGVyIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIExvYWRzIHRoZSBjb250ZW50IG9mIHRoZSBhZGFwdGVyLCBhc3luY2hyb25vdXNseS4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgbG9hZCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEltcGxlbWVudGF0aW9uIG9mIGEgQ3Vyc29yIGFkYXB0ZXIgZGVmaW5lZCBpbiBYTUwuIFRoaXMgY2xhc3MgaXMgYSB0aGluIHdyYXBwZXIKKyAgICAgKiBvZiBhIFNpbXBsZUN1cnNvckFkYXB0ZXIuIFRoZSBtYWluIGRpZmZlcmVuY2UgaXMgdGhlIGFiaWxpdHkgdG8gaGFuZGxlIEN1cnNvckJpbmRlcnMuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgWG1sQ3Vyc29yQWRhcHRlciBleHRlbmRzIFNpbXBsZUN1cnNvckFkYXB0ZXIgaW1wbGVtZW50cyBNYW5hZ2VkQWRhcHRlciB7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIG1Vcmk7CisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1TZWxlY3Rpb247CisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nW10gbVNlbGVjdGlvbkFyZ3M7CisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1Tb3J0T3JkZXI7CisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nW10gbUNvbHVtbnM7CisgICAgICAgIHByaXZhdGUgZmluYWwgQ3Vyc29yQmluZGVyW10gbUJpbmRlcnM7CisgICAgICAgIHByaXZhdGUgQXN5bmNUYXNrPFZvaWQsVm9pZCxDdXJzb3I+IG1Mb2FkVGFzazsKKworICAgICAgICBYbWxDdXJzb3JBZGFwdGVyKENvbnRleHQgY29udGV4dCwgaW50IGxheW91dCwgU3RyaW5nIHVyaSwgU3RyaW5nW10gZnJvbSwgaW50W10gdG8sCisgICAgICAgICAgICAgICAgU3RyaW5nIHNlbGVjdGlvbiwgU3RyaW5nW10gc2VsZWN0aW9uQXJncywgU3RyaW5nIHNvcnRPcmRlciwKKyAgICAgICAgICAgICAgICBIYXNoTWFwPFN0cmluZywgQ3Vyc29yQmluZGVyPiBiaW5kZXJzKSB7CisKKyAgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIGxheW91dCwgbnVsbCwgZnJvbSwgdG8pOworICAgICAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OworICAgICAgICAgICAgbVVyaSA9IHVyaTsKKyAgICAgICAgICAgIG1TZWxlY3Rpb24gPSBzZWxlY3Rpb247CisgICAgICAgICAgICBtU2VsZWN0aW9uQXJncyA9IHNlbGVjdGlvbkFyZ3M7CisgICAgICAgICAgICBtU29ydE9yZGVyID0gc29ydE9yZGVyOworICAgICAgICAgICAgbUNvbHVtbnMgPSBuZXcgU3RyaW5nW2Zyb20ubGVuZ3RoICsgMV07CisgICAgICAgICAgICAvLyBUaGlzIGlzIG1hbmRhdG9yeSBpbiBDdXJzb3JBZGFwdGVyCisgICAgICAgICAgICBtQ29sdW1uc1swXSA9ICJfaWQiOworICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShmcm9tLCAwLCBtQ29sdW1ucywgMSwgZnJvbS5sZW5ndGgpOworCisgICAgICAgICAgICBDdXJzb3JCaW5kZXIgYmFzaWMgPSBuZXcgU3RyaW5nQmluZGVyKGNvbnRleHQsIG5ldyBJZGVudGl0eVRyYW5zZm9ybWF0aW9uKGNvbnRleHQpKTsKKyAgICAgICAgICAgIGZpbmFsIGludCBjb3VudCA9IGZyb20ubGVuZ3RoOworICAgICAgICAgICAgbUJpbmRlcnMgPSBuZXcgQ3Vyc29yQmluZGVyW2NvdW50XTsKKworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgQ3Vyc29yQmluZGVyIGJpbmRlciA9IGJpbmRlcnMuZ2V0KGZyb21baV0pOworICAgICAgICAgICAgICAgIGlmIChiaW5kZXIgPT0gbnVsbCkgYmluZGVyID0gYmFzaWM7CisgICAgICAgICAgICAgICAgbUJpbmRlcnNbaV0gPSBiaW5kZXI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgYmluZFZpZXcoVmlldyB2aWV3LCBDb250ZXh0IGNvbnRleHQsIEN1cnNvciBjdXJzb3IpIHsKKyAgICAgICAgICAgIGZpbmFsIGludCBjb3VudCA9IG1Uby5sZW5ndGg7CisgICAgICAgICAgICBmaW5hbCBpbnRbXSBmcm9tID0gbUZyb207CisgICAgICAgICAgICBmaW5hbCBpbnRbXSB0byA9IG1UbzsKKyAgICAgICAgICAgIGZpbmFsIEN1cnNvckJpbmRlcltdIGJpbmRlcnMgPSBtQmluZGVyczsKKworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgZmluYWwgVmlldyB2ID0gdmlldy5maW5kVmlld0J5SWQodG9baV0pOworICAgICAgICAgICAgICAgIGlmICh2ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgYmluZGVyc1tpXS5iaW5kKHYsIGN1cnNvciwgZnJvbVtpXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgbG9hZCgpIHsKKyAgICAgICAgICAgIGlmIChtVXJpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtTG9hZFRhc2sgPSBuZXcgUXVlcnlUYXNrKCkuZXhlY3V0ZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdm9pZCBzZXRVcmkoU3RyaW5nIHVyaSkgeworICAgICAgICAgICAgbVVyaSA9IHVyaTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBjaGFuZ2VDdXJzb3IoQ3Vyc29yIGMpIHsKKyAgICAgICAgICAgIGlmIChtTG9hZFRhc2sgIT0gbnVsbCAmJiBtTG9hZFRhc2suZ2V0U3RhdHVzKCkgIT0gUXVlcnlUYXNrLlN0YXR1cy5GSU5JU0hFRCkgeworICAgICAgICAgICAgICAgIG1Mb2FkVGFzay5jYW5jZWwodHJ1ZSk7CisgICAgICAgICAgICAgICAgbUxvYWRUYXNrID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN1cGVyLmNoYW5nZUN1cnNvcihjKTsKKyAgICAgICAgfQorCisgICAgICAgIGNsYXNzIFF1ZXJ5VGFzayBleHRlbmRzIEFzeW5jVGFzazxWb2lkLCBWb2lkLCBDdXJzb3I+IHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHJvdGVjdGVkIEN1cnNvciBkb0luQmFja2dyb3VuZChWb2lkLi4uIHBhcmFtcykgeworICAgICAgICAgICAgICAgIGlmIChtQ29udGV4dCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAoKEFjdGl2aXR5KSBtQ29udGV4dCkubWFuYWdlZFF1ZXJ5KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVyaS5wYXJzZShtVXJpKSwgbUNvbHVtbnMsIG1TZWxlY3Rpb24sIG1TZWxlY3Rpb25BcmdzLCBtU29ydE9yZGVyKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCkucXVlcnkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXJpLnBhcnNlKG1VcmkpLCBtQ29sdW1ucywgbVNlbGVjdGlvbiwgbVNlbGVjdGlvbkFyZ3MsIG1Tb3J0T3JkZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvblBvc3RFeGVjdXRlKEN1cnNvciBjdXJzb3IpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWlzQ2FuY2VsbGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgWG1sQ3Vyc29yQWRhcHRlci5zdXBlci5jaGFuZ2VDdXJzb3IoY3Vyc29yKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJZGVudGl0eSB0cmFuc2Zvcm1hdGlvbiwgcmV0dXJucyB0aGUgY29udGVudCBvZiB0aGUgc3BlY2lmaWVkIGNvbHVtbiBhcyBhIFN0cmluZywKKyAgICAgKiB3aXRob3V0IHBlcmZvcm1pbmcgYW55IG1hbmlwdWxhdGlvbi4gVGhpcyBpcyB1c2VkIHdoZW4gbm8gdHJhbnNmb3JtYXRpb24gaXMgc3BlY2lmaWVkLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIElkZW50aXR5VHJhbnNmb3JtYXRpb24gZXh0ZW5kcyBDdXJzb3JUcmFuc2Zvcm1hdGlvbiB7CisgICAgICAgIHB1YmxpYyBJZGVudGl0eVRyYW5zZm9ybWF0aW9uKENvbnRleHQgY29udGV4dCkgeworICAgICAgICAgICAgc3VwZXIoY29udGV4dCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyB0cmFuc2Zvcm0oQ3Vyc29yIGN1cnNvciwgaW50IGNvbHVtbkluZGV4KSB7CisgICAgICAgICAgICByZXR1cm4gY3Vyc29yLmdldFN0cmluZyhjb2x1bW5JbmRleCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBbiBleHByZXNzaW9uIHRyYW5zZm9ybWF0aW9uIGlzIGEgc2ltcGxlIHRlbXBsYXRlIGJhc2VkIHJlcGxhY2VtZW50IHV0aWxpdHkuCisgICAgICogSW4gYW4gZXhwcmVzc2lvbiwgZWFjaCBzZWdtZW50IG9mIHRoZSBmb3JtIDxjb2RlPnsoW159XSspfTwvY29kZT4gaXMgcmVwbGFjZWQKKyAgICAgKiB3aXRoIHRoZSB2YWx1ZSBvZiB0aGUgY29sdW1uIG9mIG5hbWUgJDEuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRXhwcmVzc2lvblRyYW5zZm9ybWF0aW9uIGV4dGVuZHMgQ3Vyc29yVHJhbnNmb3JtYXRpb24geworICAgICAgICBwcml2YXRlIGZpbmFsIEV4cHJlc3Npb25Ob2RlIG1GaXJzdE5vZGUgPSBuZXcgQ29uc3RhbnRFeHByZXNzaW9uTm9kZSgiIik7CisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nQnVpbGRlciBtQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisKKyAgICAgICAgcHVibGljIEV4cHJlc3Npb25UcmFuc2Zvcm1hdGlvbihDb250ZXh0IGNvbnRleHQsIFN0cmluZyBleHByZXNzaW9uKSB7CisgICAgICAgICAgICBzdXBlcihjb250ZXh0KTsKKworICAgICAgICAgICAgcGFyc2UoZXhwcmVzc2lvbik7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgcGFyc2UoU3RyaW5nIGV4cHJlc3Npb24pIHsKKyAgICAgICAgICAgIEV4cHJlc3Npb25Ob2RlIG5vZGUgPSBtRmlyc3ROb2RlOworICAgICAgICAgICAgaW50IHNlZ21lbnRTdGFydDsKKyAgICAgICAgICAgIGludCBjb3VudCA9IGV4cHJlc3Npb24ubGVuZ3RoKCk7CisKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIGNoYXIgYyA9IGV4cHJlc3Npb24uY2hhckF0KGkpOworICAgICAgICAgICAgICAgIC8vIFN0YXJ0IGEgY29sdW1uIG5hbWUgc2VnbWVudAorICAgICAgICAgICAgICAgIHNlZ21lbnRTdGFydCA9IGk7CisgICAgICAgICAgICAgICAgaWYgKGMgPT0gJ3snKSB7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChpIDwgY291bnQgJiYgKGMgPSBleHByZXNzaW9uLmNoYXJBdChpKSkgIT0gJ30nKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gV2UndmUgcmVhY2hlZCB0aGUgZW5kLCBidXQgdGhlIGV4cHJlc3Npb24gZGlkbid0IGNsb3NlCisgICAgICAgICAgICAgICAgICAgIGlmIChjICE9ICd9JykgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVGhlIHRyYW5zZm9ybSBleHByZXNzaW9uIGNvbnRhaW5zIGEgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJub24tY2xvc2VkIGNvbHVtbiBuYW1lOiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbi5zdWJzdHJpbmcoc2VnbWVudFN0YXJ0ICsgMSwgaSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG5vZGUubmV4dCA9IG5ldyBDb2x1bW5FeHByZXNzaW9uTm9kZShleHByZXNzaW9uLnN1YnN0cmluZyhzZWdtZW50U3RhcnQgKyAxLCBpKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGkgPCBjb3VudCAmJiAoYyA9IGV4cHJlc3Npb24uY2hhckF0KGkpKSAhPSAneycpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBub2RlLm5leHQgPSBuZXcgQ29uc3RhbnRFeHByZXNzaW9uTm9kZShleHByZXNzaW9uLnN1YnN0cmluZyhzZWdtZW50U3RhcnQsIGkpKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gUmV3aW5kIGlmIHdlJ3ZlIHJlYWNoZWQgYSBjb2x1bW4gZXhwcmVzc2lvbgorICAgICAgICAgICAgICAgICAgICBpZiAoYyA9PSAneycpIGktLTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbm9kZSA9IG5vZGUubmV4dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIHRyYW5zZm9ybShDdXJzb3IgY3Vyc29yLCBpbnQgY29sdW1uSW5kZXgpIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG1CdWlsZGVyOworICAgICAgICAgICAgYnVpbGRlci5kZWxldGUoMCwgYnVpbGRlci5sZW5ndGgoKSk7CisKKyAgICAgICAgICAgIEV4cHJlc3Npb25Ob2RlIG5vZGUgPSBtRmlyc3ROb2RlOworICAgICAgICAgICAgLy8gU2tpcCB0aGUgZmlyc3Qgbm9kZQorICAgICAgICAgICAgd2hpbGUgKChub2RlID0gbm9kZS5uZXh0KSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQobm9kZS5hc1N0cmluZyhjdXJzb3IpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBFeHByZXNzaW9uTm9kZSB7CisgICAgICAgICAgICBwdWJsaWMgRXhwcmVzc2lvbk5vZGUgbmV4dDsKKworICAgICAgICAgICAgcHVibGljIGFic3RyYWN0IFN0cmluZyBhc1N0cmluZyhDdXJzb3IgY3Vyc29yKTsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXRpYyBjbGFzcyBDb25zdGFudEV4cHJlc3Npb25Ob2RlIGV4dGVuZHMgRXhwcmVzc2lvbk5vZGUgeworICAgICAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbUNvbnN0YW50OworCisgICAgICAgICAgICBDb25zdGFudEV4cHJlc3Npb25Ob2RlKFN0cmluZyBjb25zdGFudCkgeworICAgICAgICAgICAgICAgIG1Db25zdGFudCA9IGNvbnN0YW50OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgYXNTdHJpbmcoQ3Vyc29yIGN1cnNvcikgeworICAgICAgICAgICAgICAgIHJldHVybiBtQ29uc3RhbnQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBzdGF0aWMgY2xhc3MgQ29sdW1uRXhwcmVzc2lvbk5vZGUgZXh0ZW5kcyBFeHByZXNzaW9uTm9kZSB7CisgICAgICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtQ29sdW1uTmFtZTsKKyAgICAgICAgICAgIHByaXZhdGUgQ3Vyc29yIG1TaWduYXR1cmU7CisgICAgICAgICAgICBwcml2YXRlIGludCBtQ29sdW1uSW5kZXggPSAtMTsKKworICAgICAgICAgICAgQ29sdW1uRXhwcmVzc2lvbk5vZGUoU3RyaW5nIGNvbHVtbk5hbWUpIHsKKyAgICAgICAgICAgICAgICBtQ29sdW1uTmFtZSA9IGNvbHVtbk5hbWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFN0cmluZyBhc1N0cmluZyhDdXJzb3IgY3Vyc29yKSB7CisgICAgICAgICAgICAgICAgaWYgKGN1cnNvciAhPSBtU2lnbmF0dXJlIHx8IG1Db2x1bW5JbmRleCA9PSAtMSkgeworICAgICAgICAgICAgICAgICAgICBtQ29sdW1uSW5kZXggPSBjdXJzb3IuZ2V0Q29sdW1uSW5kZXgobUNvbHVtbk5hbWUpOworICAgICAgICAgICAgICAgICAgICBtU2lnbmF0dXJlID0gY3Vyc29yOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiBjdXJzb3IuZ2V0U3RyaW5nKG1Db2x1bW5JbmRleCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIG1hcCB0cmFuc2Zvcm1hdGlvbiBvZmZlcnMgYSBzaW1wbGUgbWFwcGluZyBiZXR3ZWVuIHNwZWNpZmllZCBTdHJpbmcgdmFsdWVzCisgICAgICogdG8gU3RyaW5ncyBvciBpbnRlZ2Vycy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBNYXBUcmFuc2Zvcm1hdGlvbiBleHRlbmRzIEN1cnNvclRyYW5zZm9ybWF0aW9uIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBIYXNoTWFwPFN0cmluZywgU3RyaW5nPiBtU3RyaW5nTWFwcGluZ3M7CisgICAgICAgIHByaXZhdGUgZmluYWwgSGFzaE1hcDxTdHJpbmcsIEludGVnZXI+IG1SZXNvdXJjZU1hcHBpbmdzOworCisgICAgICAgIHB1YmxpYyBNYXBUcmFuc2Zvcm1hdGlvbihDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgICAgIHN1cGVyKGNvbnRleHQpOworICAgICAgICAgICAgbVN0cmluZ01hcHBpbmdzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisgICAgICAgICAgICBtUmVzb3VyY2VNYXBwaW5ncyA9IG5ldyBIYXNoTWFwPFN0cmluZywgSW50ZWdlcj4oKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgYWRkU3RyaW5nTWFwcGluZyhTdHJpbmcgZnJvbSwgU3RyaW5nIHRvKSB7CisgICAgICAgICAgICBtU3RyaW5nTWFwcGluZ3MucHV0KGZyb20sIHRvKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgYWRkUmVzb3VyY2VNYXBwaW5nKFN0cmluZyBmcm9tLCBpbnQgdG8pIHsKKyAgICAgICAgICAgIG1SZXNvdXJjZU1hcHBpbmdzLnB1dChmcm9tLCB0byk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyB0cmFuc2Zvcm0oQ3Vyc29yIGN1cnNvciwgaW50IGNvbHVtbkluZGV4KSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdmFsdWUgPSBjdXJzb3IuZ2V0U3RyaW5nKGNvbHVtbkluZGV4KTsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyB0cmFuc2Zvcm1lZCA9IG1TdHJpbmdNYXBwaW5ncy5nZXQodmFsdWUpOworICAgICAgICAgICAgcmV0dXJuIHRyYW5zZm9ybWVkID09IG51bGwgPyB2YWx1ZSA6IHRyYW5zZm9ybWVkOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgdHJhbnNmb3JtVG9SZXNvdXJjZShDdXJzb3IgY3Vyc29yLCBpbnQgY29sdW1uSW5kZXgpIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyB2YWx1ZSA9IGN1cnNvci5nZXRTdHJpbmcoY29sdW1uSW5kZXgpOworICAgICAgICAgICAgZmluYWwgSW50ZWdlciB0cmFuc2Zvcm1lZCA9IG1SZXNvdXJjZU1hcHBpbmdzLmdldCh2YWx1ZSk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cmFuc2Zvcm1lZCA9PSBudWxsID8gSW50ZWdlci5wYXJzZUludCh2YWx1ZSkgOiB0cmFuc2Zvcm1lZDsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCaW5kcyBhIFN0cmluZyB0byBhIFRleHRWaWV3LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFN0cmluZ0JpbmRlciBleHRlbmRzIEN1cnNvckJpbmRlciB7CisgICAgICAgIHB1YmxpYyBTdHJpbmdCaW5kZXIoQ29udGV4dCBjb250ZXh0LCBDdXJzb3JUcmFuc2Zvcm1hdGlvbiB0cmFuc2Zvcm1hdGlvbikgeworICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgdHJhbnNmb3JtYXRpb24pOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGJpbmQoVmlldyB2aWV3LCBDdXJzb3IgY3Vyc29yLCBpbnQgY29sdW1uSW5kZXgpIHsKKyAgICAgICAgICAgIGlmICh2aWV3IGluc3RhbmNlb2YgVGV4dFZpZXcpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdGV4dCA9IG1UcmFuc2Zvcm1hdGlvbi50cmFuc2Zvcm0oY3Vyc29yLCBjb2x1bW5JbmRleCk7CisgICAgICAgICAgICAgICAgKChUZXh0Vmlldykgdmlldykuc2V0VGV4dCh0ZXh0KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEJpbmRzIGFuIGltYWdlIGJsb2IgdG8gYW4gSW1hZ2VWaWV3LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEltYWdlQmluZGVyIGV4dGVuZHMgQ3Vyc29yQmluZGVyIHsKKyAgICAgICAgcHVibGljIEltYWdlQmluZGVyKENvbnRleHQgY29udGV4dCwgQ3Vyc29yVHJhbnNmb3JtYXRpb24gdHJhbnNmb3JtYXRpb24pIHsKKyAgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIHRyYW5zZm9ybWF0aW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBiaW5kKFZpZXcgdmlldywgQ3Vyc29yIGN1cnNvciwgaW50IGNvbHVtbkluZGV4KSB7CisgICAgICAgICAgICBpZiAodmlldyBpbnN0YW5jZW9mIEltYWdlVmlldykgeworICAgICAgICAgICAgICAgIGZpbmFsIGJ5dGVbXSBkYXRhID0gY3Vyc29yLmdldEJsb2IoY29sdW1uSW5kZXgpOworICAgICAgICAgICAgICAgICgoSW1hZ2VWaWV3KSB2aWV3KS5zZXRJbWFnZUJpdG1hcChCaXRtYXBGYWN0b3J5LmRlY29kZUJ5dGVBcnJheShkYXRhLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5sZW5ndGgpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFRhZ0JpbmRlciBleHRlbmRzIEN1cnNvckJpbmRlciB7CisgICAgICAgIHB1YmxpYyBUYWdCaW5kZXIoQ29udGV4dCBjb250ZXh0LCBDdXJzb3JUcmFuc2Zvcm1hdGlvbiB0cmFuc2Zvcm1hdGlvbikgeworICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgdHJhbnNmb3JtYXRpb24pOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGJpbmQoVmlldyB2aWV3LCBDdXJzb3IgY3Vyc29yLCBpbnQgY29sdW1uSW5kZXgpIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyB0ZXh0ID0gbVRyYW5zZm9ybWF0aW9uLnRyYW5zZm9ybShjdXJzb3IsIGNvbHVtbkluZGV4KTsKKyAgICAgICAgICAgIHZpZXcuc2V0VGFnKHRleHQpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCaW5kcyBhbiBpbWFnZSBVUkkgdG8gYW4gSW1hZ2VWaWV3LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEltYWdlVXJpQmluZGVyIGV4dGVuZHMgQ3Vyc29yQmluZGVyIHsKKyAgICAgICAgcHVibGljIEltYWdlVXJpQmluZGVyKENvbnRleHQgY29udGV4dCwgQ3Vyc29yVHJhbnNmb3JtYXRpb24gdHJhbnNmb3JtYXRpb24pIHsKKyAgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIHRyYW5zZm9ybWF0aW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBiaW5kKFZpZXcgdmlldywgQ3Vyc29yIGN1cnNvciwgaW50IGNvbHVtbkluZGV4KSB7CisgICAgICAgICAgICBpZiAodmlldyBpbnN0YW5jZW9mIEltYWdlVmlldykgeworICAgICAgICAgICAgICAgICgoSW1hZ2VWaWV3KSB2aWV3KS5zZXRJbWFnZVVSSShVcmkucGFyc2UoCisgICAgICAgICAgICAgICAgICAgICAgICBtVHJhbnNmb3JtYXRpb24udHJhbnNmb3JtKGN1cnNvciwgY29sdW1uSW5kZXgpKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCaW5kcyBhIGRyYXdhYmxlIHJlc291cmNlIGlkZW50aWZpZXIgdG8gYW4gSW1hZ2VWaWV3LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIERyYXdhYmxlQmluZGVyIGV4dGVuZHMgQ3Vyc29yQmluZGVyIHsKKyAgICAgICAgcHVibGljIERyYXdhYmxlQmluZGVyKENvbnRleHQgY29udGV4dCwgQ3Vyc29yVHJhbnNmb3JtYXRpb24gdHJhbnNmb3JtYXRpb24pIHsKKyAgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIHRyYW5zZm9ybWF0aW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBiaW5kKFZpZXcgdmlldywgQ3Vyc29yIGN1cnNvciwgaW50IGNvbHVtbkluZGV4KSB7CisgICAgICAgICAgICBpZiAodmlldyBpbnN0YW5jZW9mIEltYWdlVmlldykgeworICAgICAgICAgICAgICAgIGZpbmFsIGludCByZXNvdXJjZSA9IG1UcmFuc2Zvcm1hdGlvbi50cmFuc2Zvcm1Ub1Jlc291cmNlKGN1cnNvciwgY29sdW1uSW5kZXgpOworICAgICAgICAgICAgICAgIGlmIChyZXNvdXJjZSA9PSAwKSByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgICAgICAgICAoKEltYWdlVmlldykgdmlldykuc2V0SW1hZ2VSZXNvdXJjZShyZXNvdXJjZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvQXJyYXlBZGFwdGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvQXJyYXlBZGFwdGVyLmphdmEKaW5kZXggMDNhZGE5NC4uYjRlY2UyNCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0FycmF5QWRhcHRlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9BcnJheUFkYXB0ZXIuamF2YQpAQCAtMzAsMTcgKzMwLDE3IEBACiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwogCiAvKioKLSAqIEEgTGlzdEFkYXB0ZXIgdGhhdCBtYW5hZ2VzIGEgTGlzdFZpZXcgYmFja2VkIGJ5IGFuIGFycmF5IG9mIGFyYml0cmFyeQorICogQSBjb25jcmV0ZSBCYXNlQWRhcHRlciB0aGF0IGlzIGJhY2tlZCBieSBhbiBhcnJheSBvZiBhcmJpdHJhcnkKICAqIG9iamVjdHMuICBCeSBkZWZhdWx0IHRoaXMgY2xhc3MgZXhwZWN0cyB0aGF0IHRoZSBwcm92aWRlZCByZXNvdXJjZSBpZCByZWZlcmVuY2VzCiAgKiBhIHNpbmdsZSBUZXh0Vmlldy4gIElmIHlvdSB3YW50IHRvIHVzZSBhIG1vcmUgY29tcGxleCBsYXlvdXQsIHVzZSB0aGUgY29uc3RydWN0b3JzIHRoYXQKICAqIGFsc28gdGFrZXMgYSBmaWVsZCBpZC4gIFRoYXQgZmllbGQgaWQgc2hvdWxkIHJlZmVyZW5jZSBhIFRleHRWaWV3IGluIHRoZSBsYXJnZXIgbGF5b3V0CiAgKiByZXNvdXJjZS4KICAqCi0gKiBIb3dldmVyIHRoZSBUZXh0VmlldyBpcyByZWZlcmVuY2VkLCBpdCB3aWxsIGJlIGZpbGxlZCB3aXRoIHRoZSB0b1N0cmluZygpIG9mIGVhY2ggb2JqZWN0IGluCisgKiA8cD5Ib3dldmVyIHRoZSBUZXh0VmlldyBpcyByZWZlcmVuY2VkLCBpdCB3aWxsIGJlIGZpbGxlZCB3aXRoIHRoZSB0b1N0cmluZygpIG9mIGVhY2ggb2JqZWN0IGluCiAgKiB0aGUgYXJyYXkuIFlvdSBjYW4gYWRkIGxpc3RzIG9yIGFycmF5cyBvZiBjdXN0b20gb2JqZWN0cy4gT3ZlcnJpZGUgdGhlIHRvU3RyaW5nKCkgbWV0aG9kCiAgKiBvZiB5b3VyIG9iamVjdHMgdG8gZGV0ZXJtaW5lIHdoYXQgdGV4dCB3aWxsIGJlIGRpc3BsYXllZCBmb3IgdGhlIGl0ZW0gaW4gdGhlIGxpc3QuCiAgKgotICogVG8gdXNlIHNvbWV0aGluZyBvdGhlciB0aGFuIFRleHRWaWV3cyBmb3IgdGhlIGFycmF5IGRpc3BsYXksIGZvciBpbnN0YW5jZSwgSW1hZ2VWaWV3cywKKyAqIDxwPlRvIHVzZSBzb21ldGhpbmcgb3RoZXIgdGhhbiBUZXh0Vmlld3MgZm9yIHRoZSBhcnJheSBkaXNwbGF5LCBmb3IgaW5zdGFuY2UsIEltYWdlVmlld3MsCiAgKiBvciB0byBoYXZlIHNvbWUgb2YgZGF0YSBiZXNpZGVzIHRvU3RyaW5nKCkgcmVzdWx0cyBmaWxsIHRoZSB2aWV3cywKICAqIG92ZXJyaWRlIHtAbGluayAjZ2V0VmlldyhpbnQsIFZpZXcsIFZpZXdHcm91cCl9IHRvIHJldHVybiB0aGUgdHlwZSBvZiB2aWV3IHlvdSB3YW50LgogICovCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvQXV0b0NvbXBsZXRlVGV4dFZpZXcuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9BdXRvQ29tcGxldGVUZXh0Vmlldy5qYXZhCmluZGV4IDM5NzE0ODcuLmUwN2JlZmEgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9BdXRvQ29tcGxldGVUZXh0Vmlldy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9BdXRvQ29tcGxldGVUZXh0Vmlldy5qYXZhCkBAIC0yOSwxMyArMjksMTIgQEAKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXI7Ci1pbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CiBpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLkNvbXBsZXRpb25JbmZvOwotaW1wb3J0IGFuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5JbnB1dE1ldGhvZE1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLkVkaXRvckluZm87CitpbXBvcnQgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLklucHV0TWV0aG9kTWFuYWdlcjsKIAogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLlI7CiAKQEAgLTkzLDQ1ICs5MiwyMSBAQAogICAgIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gZmFsc2U7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiQXV0b0NvbXBsZXRlVGV4dFZpZXciOwogCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEhJTlRfVklFV19JRCA9IDB4MTc7Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIHZhbHVlIGNvbnRyb2xzIHRoZSBsZW5ndGggb2YgdGltZSB0aGF0IHRoZSB1c2VyCi0gICAgICogbXVzdCBsZWF2ZSBhIHBvaW50ZXIgZG93biB3aXRob3V0IHNjcm9sbGluZyB0byBleHBhbmQKLSAgICAgKiB0aGUgYXV0b2NvbXBsZXRlIGRyb3Bkb3duIGxpc3QgdG8gY292ZXIgdGhlIElNRS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVhQQU5EX0xJU1RfVElNRU9VVCA9IDI1MDsKLQogICAgIHByaXZhdGUgQ2hhclNlcXVlbmNlIG1IaW50VGV4dDsKKyAgICBwcml2YXRlIFRleHRWaWV3IG1IaW50VmlldzsKICAgICBwcml2YXRlIGludCBtSGludFJlc291cmNlOwogCiAgICAgcHJpdmF0ZSBMaXN0QWRhcHRlciBtQWRhcHRlcjsKICAgICBwcml2YXRlIEZpbHRlciBtRmlsdGVyOwogICAgIHByaXZhdGUgaW50IG1UaHJlc2hvbGQ7CiAKLSAgICBwcml2YXRlIFBvcHVwV2luZG93IG1Qb3B1cDsKLSAgICBwcml2YXRlIERyb3BEb3duTGlzdFZpZXcgbURyb3BEb3duTGlzdDsKLSAgICBwcml2YXRlIGludCBtRHJvcERvd25WZXJ0aWNhbE9mZnNldDsKLSAgICBwcml2YXRlIGludCBtRHJvcERvd25Ib3Jpem9udGFsT2Zmc2V0OworICAgIHByaXZhdGUgTGlzdFBvcHVwV2luZG93IG1Qb3B1cDsKICAgICBwcml2YXRlIGludCBtRHJvcERvd25BbmNob3JJZDsKLSAgICBwcml2YXRlIFZpZXcgbURyb3BEb3duQW5jaG9yVmlldzsgIC8vIHZpZXcgaXMgcmV0cmlldmVkIGxhemlseSBmcm9tIGlkIG9uY2UgbmVlZGVkCi0gICAgcHJpdmF0ZSBpbnQgbURyb3BEb3duV2lkdGg7Ci0gICAgcHJpdmF0ZSBpbnQgbURyb3BEb3duSGVpZ2h0OwotICAgIHByaXZhdGUgZmluYWwgUmVjdCBtVGVtcFJlY3QgPSBuZXcgUmVjdCgpOwotCi0gICAgcHJpdmF0ZSBEcmF3YWJsZSBtRHJvcERvd25MaXN0SGlnaGxpZ2h0OwogCiAgICAgcHJpdmF0ZSBBZGFwdGVyVmlldy5Pbkl0ZW1DbGlja0xpc3RlbmVyIG1JdGVtQ2xpY2tMaXN0ZW5lcjsKICAgICBwcml2YXRlIEFkYXB0ZXJWaWV3Lk9uSXRlbVNlbGVjdGVkTGlzdGVuZXIgbUl0ZW1TZWxlY3RlZExpc3RlbmVyOwogCi0gICAgcHJpdmF0ZSBmaW5hbCBEcm9wRG93bkl0ZW1DbGlja0xpc3RlbmVyIG1Ecm9wRG93bkl0ZW1DbGlja0xpc3RlbmVyID0KLSAgICAgICAgICAgIG5ldyBEcm9wRG93bkl0ZW1DbGlja0xpc3RlbmVyKCk7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gbURyb3BEb3duQWx3YXlzVmlzaWJsZSA9IGZhbHNlOwotCiAgICAgcHJpdmF0ZSBib29sZWFuIG1Ecm9wRG93bkRpc21pc3NlZE9uQ29tcGxldGlvbiA9IHRydWU7Ci0gICAgCi0gICAgcHJpdmF0ZSBib29sZWFuIG1Gb3JjZUlnbm9yZU91dHNpZGVUb3VjaCA9IGZhbHNlOwogCiAgICAgcHJpdmF0ZSBpbnQgbUxhc3RLZXlDb2RlID0gS2V5RXZlbnQuS0VZQ09ERV9VTktOT1dOOwogICAgIHByaXZhdGUgYm9vbGVhbiBtT3BlbkJlZm9yZTsKQEAgLTE0MCwxMCArMTE1LDYgQEAKIAogICAgIHByaXZhdGUgYm9vbGVhbiBtQmxvY2tDb21wbGV0aW9uOwogCi0gICAgcHJpdmF0ZSBMaXN0U2VsZWN0b3JIaWRlciBtSGlkZVNlbGVjdG9yOwotICAgIHByaXZhdGUgUnVubmFibGUgbVNob3dEcm9wRG93blJ1bm5hYmxlOwotICAgIHByaXZhdGUgUnVubmFibGUgbVJlc2l6ZVBvcHVwUnVubmFibGUgPSBuZXcgUmVzaXplUG9wdXBSdW5uYWJsZSgpOwotCiAgICAgcHJpdmF0ZSBQYXNzVGhyb3VnaENsaWNrTGlzdGVuZXIgbVBhc3NUaHJvdWdoQ2xpY2tMaXN0ZW5lcjsKICAgICBwcml2YXRlIFBvcHVwRGF0YVNldE9ic2VydmVyIG1PYnNlcnZlcjsKIApAQCAtMTU4LDkgKzEyOSwxMCBAQAogICAgIHB1YmxpYyBBdXRvQ29tcGxldGVUZXh0VmlldyhDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlKSB7CiAgICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzLCBkZWZTdHlsZSk7CiAKLSAgICAgICAgbVBvcHVwID0gbmV3IFBvcHVwV2luZG93KGNvbnRleHQsIGF0dHJzLAorICAgICAgICBtUG9wdXAgPSBuZXcgTGlzdFBvcHVwV2luZG93KGNvbnRleHQsIGF0dHJzLAogICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYXR0ci5hdXRvQ29tcGxldGVUZXh0Vmlld1N0eWxlKTsKICAgICAgICAgbVBvcHVwLnNldFNvZnRJbnB1dE1vZGUoV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuU09GVF9JTlBVVF9BREpVU1RfUkVTSVpFKTsKKyAgICAgICAgbVBvcHVwLnNldFByb21wdFBvc2l0aW9uKExpc3RQb3B1cFdpbmRvdy5QT1NJVElPTl9QUk9NUFRfQkVMT1cpOwogCiAgICAgICAgIFR5cGVkQXJyYXkgYSA9CiAgICAgICAgICAgICBjb250ZXh0Lm9idGFpblN0eWxlZEF0dHJpYnV0ZXMoCkBAIC0xNjksMTQgKzE0MSwxMSBAQAogICAgICAgICBtVGhyZXNob2xkID0gYS5nZXRJbnQoCiAgICAgICAgICAgICAgICAgUi5zdHlsZWFibGUuQXV0b0NvbXBsZXRlVGV4dFZpZXdfY29tcGxldGlvblRocmVzaG9sZCwgMik7CiAKLSAgICAgICAgbUhpbnRUZXh0ID0gYS5nZXRUZXh0KFIuc3R5bGVhYmxlLkF1dG9Db21wbGV0ZVRleHRWaWV3X2NvbXBsZXRpb25IaW50KTsKLQotICAgICAgICBtRHJvcERvd25MaXN0SGlnaGxpZ2h0ID0gYS5nZXREcmF3YWJsZSgKLSAgICAgICAgICAgICAgICBSLnN0eWxlYWJsZS5BdXRvQ29tcGxldGVUZXh0Vmlld19kcm9wRG93blNlbGVjdG9yKTsKLSAgICAgICAgbURyb3BEb3duVmVydGljYWxPZmZzZXQgPSAoaW50KQotICAgICAgICAgICAgICAgIGEuZ2V0RGltZW5zaW9uKFIuc3R5bGVhYmxlLkF1dG9Db21wbGV0ZVRleHRWaWV3X2Ryb3BEb3duVmVydGljYWxPZmZzZXQsIDAuMGYpOwotICAgICAgICBtRHJvcERvd25Ib3Jpem9udGFsT2Zmc2V0ID0gKGludCkKLSAgICAgICAgICAgICAgICBhLmdldERpbWVuc2lvbihSLnN0eWxlYWJsZS5BdXRvQ29tcGxldGVUZXh0Vmlld19kcm9wRG93bkhvcml6b250YWxPZmZzZXQsIDAuMGYpOworICAgICAgICBtUG9wdXAuc2V0TGlzdFNlbGVjdG9yKGEuZ2V0RHJhd2FibGUoUi5zdHlsZWFibGUuQXV0b0NvbXBsZXRlVGV4dFZpZXdfZHJvcERvd25TZWxlY3RvcikpOworICAgICAgICBtUG9wdXAuc2V0VmVydGljYWxPZmZzZXQoKGludCkKKyAgICAgICAgICAgICAgICBhLmdldERpbWVuc2lvbihSLnN0eWxlYWJsZS5BdXRvQ29tcGxldGVUZXh0Vmlld19kcm9wRG93blZlcnRpY2FsT2Zmc2V0LCAwLjBmKSk7CisgICAgICAgIG1Qb3B1cC5zZXRIb3Jpem9udGFsT2Zmc2V0KChpbnQpCisgICAgICAgICAgICAgICAgYS5nZXREaW1lbnNpb24oUi5zdHlsZWFibGUuQXV0b0NvbXBsZXRlVGV4dFZpZXdfZHJvcERvd25Ib3Jpem9udGFsT2Zmc2V0LCAwLjBmKSk7CiAgICAgICAgIAogICAgICAgICAvLyBHZXQgdGhlIGFuY2hvcidzIGlkIG5vdywgYnV0IHRoZSB2aWV3IHdvbid0IGJlIHJlYWR5LCBzbyB3YWl0IHRvIGFjdHVhbGx5IGdldCB0aGUKICAgICAgICAgLy8gdmlldyBhbmQgc3RvcmUgaXQgaW4gbURyb3BEb3duQW5jaG9yVmlldyBsYXppbHkgaW4gZ2V0RHJvcERvd25BbmNob3JWaWV3IGxhdGVyLgpAQCAtMTg3LDEzICsxNTYsMTggQEAKICAgICAgICAgCiAgICAgICAgIC8vIEZvciBkcm9wZG93biB3aWR0aCwgdGhlIGRldmVsb3BlciBjYW4gc3BlY2lmeSBhIHNwZWNpZmljIHdpZHRoLCBvciBNQVRDSF9QQVJFTlQKICAgICAgICAgLy8gKGZvciBmdWxsIHNjcmVlbiB3aWR0aCkgb3IgV1JBUF9DT05URU5UICh0byBtYXRjaCB0aGUgd2lkdGggb2YgdGhlIGFuY2hvcmVkIHZpZXcpLgotICAgICAgICBtRHJvcERvd25XaWR0aCA9IGEuZ2V0TGF5b3V0RGltZW5zaW9uKFIuc3R5bGVhYmxlLkF1dG9Db21wbGV0ZVRleHRWaWV3X2Ryb3BEb3duV2lkdGgsCi0gICAgICAgICAgICAgICAgVmlld0dyb3VwLkxheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQpOwotICAgICAgICBtRHJvcERvd25IZWlnaHQgPSBhLmdldExheW91dERpbWVuc2lvbihSLnN0eWxlYWJsZS5BdXRvQ29tcGxldGVUZXh0Vmlld19kcm9wRG93bkhlaWdodCwKLSAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCk7CisgICAgICAgIG1Qb3B1cC5zZXRXaWR0aChhLmdldExheW91dERpbWVuc2lvbigKKyAgICAgICAgICAgICAgICBSLnN0eWxlYWJsZS5BdXRvQ29tcGxldGVUZXh0Vmlld19kcm9wRG93bldpZHRoLAorICAgICAgICAgICAgICAgIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UKSk7CisgICAgICAgIG1Qb3B1cC5zZXRIZWlnaHQoYS5nZXRMYXlvdXREaW1lbnNpb24oCisgICAgICAgICAgICAgICAgUi5zdHlsZWFibGUuQXV0b0NvbXBsZXRlVGV4dFZpZXdfZHJvcERvd25IZWlnaHQsCisgICAgICAgICAgICAgICAgVmlld0dyb3VwLkxheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQpKTsKIAogICAgICAgICBtSGludFJlc291cmNlID0gYS5nZXRSZXNvdXJjZUlkKFIuc3R5bGVhYmxlLkF1dG9Db21wbGV0ZVRleHRWaWV3X2NvbXBsZXRpb25IaW50VmlldywKICAgICAgICAgICAgICAgICBSLmxheW91dC5zaW1wbGVfZHJvcGRvd25faGludCk7CisgICAgICAgIAorICAgICAgICBtUG9wdXAuc2V0T25JdGVtQ2xpY2tMaXN0ZW5lcihuZXcgRHJvcERvd25JdGVtQ2xpY2tMaXN0ZW5lcigpKTsKKyAgICAgICAgc2V0Q29tcGxldGlvbkhpbnQoYS5nZXRUZXh0KFIuc3R5bGVhYmxlLkF1dG9Db21wbGV0ZVRleHRWaWV3X2NvbXBsZXRpb25IaW50KSk7CiAKICAgICAgICAgLy8gQWx3YXlzIHR1cm4gb24gdGhlIGF1dG8gY29tcGxldGUgaW5wdXQgdHlwZSBmbGFnLCBzaW5jZSBpdAogICAgICAgICAvLyBtYWtlcyBubyBzZW5zZSB0byB1c2UgdGhpcyB3aWRnZXQgd2l0aG91dCBpdC4KQEAgLTI0MSw2ICsyMTUsMjAgQEAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRDb21wbGV0aW9uSGludChDaGFyU2VxdWVuY2UgaGludCkgewogICAgICAgICBtSGludFRleHQgPSBoaW50OworICAgICAgICBpZiAoaGludCAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAobUhpbnRWaWV3ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBUZXh0VmlldyBoaW50VmlldyA9IChUZXh0VmlldykgTGF5b3V0SW5mbGF0ZXIuZnJvbShnZXRDb250ZXh0KCkpLmluZmxhdGUoCisgICAgICAgICAgICAgICAgICAgICAgICBtSGludFJlc291cmNlLCBudWxsKS5maW5kVmlld0J5SWQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5pZC50ZXh0MSk7CisgICAgICAgICAgICAgICAgaGludFZpZXcuc2V0VGV4dChtSGludFRleHQpOworICAgICAgICAgICAgICAgIG1IaW50VmlldyA9IGhpbnRWaWV3OworICAgICAgICAgICAgICAgIG1Qb3B1cC5zZXRQcm9tcHRWaWV3KGhpbnRWaWV3KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbUhpbnRWaWV3LnNldFRleHQoaGludCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtUG9wdXAuc2V0UHJvbXB0VmlldyhudWxsKTsKKyAgICAgICAgICAgIG1IaW50VmlldyA9IG51bGw7CisgICAgICAgIH0KICAgICB9CiAgICAgCiAgICAgLyoqCkBAIC0yNTMsNyArMjQxLDcgQEAKICAgICAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNBdXRvQ29tcGxldGVUZXh0Vmlld19kcm9wRG93bldpZHRoCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXREcm9wRG93bldpZHRoKCkgewotICAgICAgICByZXR1cm4gbURyb3BEb3duV2lkdGg7CisgICAgICAgIHJldHVybiBtUG9wdXAuZ2V0V2lkdGgoKTsKICAgICB9CiAgICAgCiAgICAgLyoqCkBAIC0yNjYsNyArMjU0LDcgQEAKICAgICAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNBdXRvQ29tcGxldGVUZXh0Vmlld19kcm9wRG93bldpZHRoCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0RHJvcERvd25XaWR0aChpbnQgd2lkdGgpIHsKLSAgICAgICAgbURyb3BEb3duV2lkdGggPSB3aWR0aDsKKyAgICAgICAgbVBvcHVwLnNldFdpZHRoKHdpZHRoKTsKICAgICB9CiAKICAgICAvKioKQEAgLTI4MCw3ICsyNjgsNyBAQAogICAgICAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0F1dG9Db21wbGV0ZVRleHRWaWV3X2Ryb3BEb3duSGVpZ2h0CiAgICAgICovCiAgICAgcHVibGljIGludCBnZXREcm9wRG93bkhlaWdodCgpIHsKLSAgICAgICAgcmV0dXJuIG1Ecm9wRG93bkhlaWdodDsKKyAgICAgICAgcmV0dXJuIG1Qb3B1cC5nZXRIZWlnaHQoKTsKICAgICB9CiAKICAgICAvKioKQEAgLTI5NCw3ICsyODIsNyBAQAogICAgICAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0F1dG9Db21wbGV0ZVRleHRWaWV3X2Ryb3BEb3duSGVpZ2h0CiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0RHJvcERvd25IZWlnaHQoaW50IGhlaWdodCkgewotICAgICAgICBtRHJvcERvd25IZWlnaHQgPSBoZWlnaHQ7CisgICAgICAgIG1Qb3B1cC5zZXRIZWlnaHQoaGVpZ2h0KTsKICAgICB9CiAgICAgCiAgICAgLyoqCkBAIC0zMTksNyArMzA3LDcgQEAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXREcm9wRG93bkFuY2hvcihpbnQgaWQpIHsKICAgICAgICAgbURyb3BEb3duQW5jaG9ySWQgPSBpZDsKLSAgICAgICAgbURyb3BEb3duQW5jaG9yVmlldyA9IG51bGw7CisgICAgICAgIG1Qb3B1cC5zZXRBbmNob3JWaWV3KG51bGwpOwogICAgIH0KICAgICAKICAgICAvKioKQEAgLTM2MSw3ICszNDksNyBAQAogICAgICAqIEBwYXJhbSBvZmZzZXQgdGhlIHZlcnRpY2FsIG9mZnNldAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldERyb3BEb3duVmVydGljYWxPZmZzZXQoaW50IG9mZnNldCkgewotICAgICAgICBtRHJvcERvd25WZXJ0aWNhbE9mZnNldCA9IG9mZnNldDsKKyAgICAgICAgbVBvcHVwLnNldFZlcnRpY2FsT2Zmc2V0KG9mZnNldCk7CiAgICAgfQogICAgIAogICAgIC8qKgpAQCAtMzcwLDcgKzM1OCw3IEBACiAgICAgICogQHJldHVybiB0aGUgdmVydGljYWwgb2Zmc2V0CiAgICAgICovCiAgICAgcHVibGljIGludCBnZXREcm9wRG93blZlcnRpY2FsT2Zmc2V0KCkgewotICAgICAgICByZXR1cm4gbURyb3BEb3duVmVydGljYWxPZmZzZXQ7CisgICAgICAgIHJldHVybiBtUG9wdXAuZ2V0VmVydGljYWxPZmZzZXQoKTsKICAgICB9CiAgICAgCiAgICAgLyoqCkBAIC0zNzksNyArMzY3LDcgQEAKICAgICAgKiBAcGFyYW0gb2Zmc2V0IHRoZSBob3Jpem9udGFsIG9mZnNldAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldERyb3BEb3duSG9yaXpvbnRhbE9mZnNldChpbnQgb2Zmc2V0KSB7Ci0gICAgICAgIG1Ecm9wRG93bkhvcml6b250YWxPZmZzZXQgPSBvZmZzZXQ7CisgICAgICAgIG1Qb3B1cC5zZXRIb3Jpem9udGFsT2Zmc2V0KG9mZnNldCk7CiAgICAgfQogICAgIAogICAgIC8qKgpAQCAtMzg4LDcgKzM3Niw3IEBACiAgICAgICogQHJldHVybiB0aGUgaG9yaXpvbnRhbCBvZmZzZXQKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldERyb3BEb3duSG9yaXpvbnRhbE9mZnNldCgpIHsKLSAgICAgICAgcmV0dXJuIG1Ecm9wRG93bkhvcml6b250YWxPZmZzZXQ7CisgICAgICAgIHJldHVybiBtUG9wdXAuZ2V0SG9yaXpvbnRhbE9mZnNldCgpOwogICAgIH0KIAogICAgICAvKioKQEAgLTQyNSw3ICs0MTMsNyBAQAogICAgICAqIEBoaWRlIFBlbmRpbmcgQVBJIGNvdW5jaWwgYXBwcm92YWwKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc0Ryb3BEb3duQWx3YXlzVmlzaWJsZSgpIHsKLSAgICAgICAgcmV0dXJuIG1Ecm9wRG93bkFsd2F5c1Zpc2libGU7CisgICAgICAgIHJldHVybiBtUG9wdXAuaXNEcm9wRG93bkFsd2F5c1Zpc2libGUoKTsKICAgICB9CiAKICAgICAvKioKQEAgLTQ0Miw3ICs0MzAsNyBAQAogICAgICAqIEBoaWRlIFBlbmRpbmcgQVBJIGNvdW5jaWwgYXBwcm92YWwKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXREcm9wRG93bkFsd2F5c1Zpc2libGUoYm9vbGVhbiBkcm9wRG93bkFsd2F5c1Zpc2libGUpIHsKLSAgICAgICAgbURyb3BEb3duQWx3YXlzVmlzaWJsZSA9IGRyb3BEb3duQWx3YXlzVmlzaWJsZTsKKyAgICAgICAgbVBvcHVwLnNldERyb3BEb3duQWx3YXlzVmlzaWJsZShkcm9wRG93bkFsd2F5c1Zpc2libGUpOwogICAgIH0KICAgIAogICAgIC8qKgpAQCAtNjA5LDE1ICs1OTcsMTMgQEAKICAgICAgICAgICAgIG1GaWx0ZXIgPSBudWxsOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKG1Ecm9wRG93bkxpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgbURyb3BEb3duTGlzdC5zZXRBZGFwdGVyKG1BZGFwdGVyKTsKLSAgICAgICAgfQorICAgICAgICBtUG9wdXAuc2V0QWRhcHRlcihtQWRhcHRlcik7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gb25LZXlQcmVJbWUoaW50IGtleUNvZGUsIEtleUV2ZW50IGV2ZW50KSB7CiAgICAgICAgIGlmIChrZXlDb2RlID09IEtleUV2ZW50LktFWUNPREVfQkFDSyAmJiBpc1BvcHVwU2hvd2luZygpCi0gICAgICAgICAgICAgICAgJiYgIW1Ecm9wRG93bkFsd2F5c1Zpc2libGUpIHsKKyAgICAgICAgICAgICAgICAmJiAhbVBvcHVwLmlzRHJvcERvd25BbHdheXNWaXNpYmxlKCkpIHsKICAgICAgICAgICAgIC8vIHNwZWNpYWwgY2FzZSBmb3IgdGhlIGJhY2sga2V5LCB3ZSBkbyBub3QgZXZlbiB0cnkgdG8gc2VuZCBpdAogICAgICAgICAgICAgLy8gdG8gdGhlIGRyb3AgZG93biBsaXN0IGJ1dCBpbnN0ZWFkLCBjb25zdW1lIGl0IGltbWVkaWF0ZWx5CiAgICAgICAgICAgICBpZiAoZXZlbnQuZ2V0QWN0aW9uKCkgPT0gS2V5RXZlbnQuQUNUSU9OX0RPV04gJiYgZXZlbnQuZ2V0UmVwZWF0Q291bnQoKSA9PSAwKSB7CkBAIC02MzYsMTggKzYyMiwxNiBAQAogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gb25LZXlVcChpbnQga2V5Q29kZSwgS2V5RXZlbnQgZXZlbnQpIHsKLSAgICAgICAgaWYgKGlzUG9wdXBTaG93aW5nKCkgJiYgbURyb3BEb3duTGlzdC5nZXRTZWxlY3RlZEl0ZW1Qb3NpdGlvbigpID49IDApIHsKLSAgICAgICAgICAgIGJvb2xlYW4gY29uc3VtZWQgPSBtRHJvcERvd25MaXN0Lm9uS2V5VXAoa2V5Q29kZSwgZXZlbnQpOwotICAgICAgICAgICAgaWYgKGNvbnN1bWVkKSB7Ci0gICAgICAgICAgICAgICAgc3dpdGNoIChrZXlDb2RlKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBsaXN0IGFjY2VwdHMgdGhlIGtleSBldmVudHMgYW5kIHRoZSBrZXkgZXZlbnQKLSAgICAgICAgICAgICAgICAgICAgLy8gd2FzIGEgY2xpY2ssIHRoZSB0ZXh0IHZpZXcgZ2V0cyB0aGUgc2VsZWN0ZWQgaXRlbQotICAgICAgICAgICAgICAgICAgICAvLyBmcm9tIHRoZSBkcm9wIGRvd24gYXMgaXRzIGNvbnRlbnQKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5LRVlDT0RFX0VOVEVSOgotICAgICAgICAgICAgICAgICAgICBjYXNlIEtleUV2ZW50LktFWUNPREVfRFBBRF9DRU5URVI6Ci0gICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtQ29tcGxldGlvbigpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICBib29sZWFuIGNvbnN1bWVkID0gbVBvcHVwLm9uS2V5VXAoa2V5Q29kZSwgZXZlbnQpOworICAgICAgICBpZiAoY29uc3VtZWQpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoa2V5Q29kZSkgeworICAgICAgICAgICAgLy8gaWYgdGhlIGxpc3QgYWNjZXB0cyB0aGUga2V5IGV2ZW50cyBhbmQgdGhlIGtleSBldmVudAorICAgICAgICAgICAgLy8gd2FzIGEgY2xpY2ssIHRoZSB0ZXh0IHZpZXcgZ2V0cyB0aGUgc2VsZWN0ZWQgaXRlbQorICAgICAgICAgICAgLy8gZnJvbSB0aGUgZHJvcCBkb3duIGFzIGl0cyBjb250ZW50CisgICAgICAgICAgICBjYXNlIEtleUV2ZW50LktFWUNPREVfRU5URVI6CisgICAgICAgICAgICBjYXNlIEtleUV2ZW50LktFWUNPREVfRFBBRF9DRU5URVI6CisgICAgICAgICAgICAgICAgcGVyZm9ybUNvbXBsZXRpb24oKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICByZXR1cm4gc3VwZXIub25LZXlVcChrZXlDb2RlLCBldmVudCk7CkBAIC02NTUsODcgKzYzOSwxMSBAQAogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gb25LZXlEb3duKGludCBrZXlDb2RlLCBLZXlFdmVudCBldmVudCkgewotICAgICAgICAvLyB3aGVuIHRoZSBkcm9wIGRvd24gaXMgc2hvd24sIHdlIGRyaXZlIGl0IGRpcmVjdGx5Ci0gICAgICAgIGlmIChpc1BvcHVwU2hvd2luZygpKSB7Ci0gICAgICAgICAgICAvLyB0aGUga2V5IGV2ZW50cyBhcmUgZm9yd2FyZGVkIHRvIHRoZSBsaXN0IGluIHRoZSBkcm9wIGRvd24gdmlldwotICAgICAgICAgICAgLy8gbm90ZSB0aGF0IExpc3RWaWV3IGhhbmRsZXMgc3BhY2UgYnV0IHdlIGRvbid0IHdhbnQgdGhhdCB0byBoYXBwZW4KLSAgICAgICAgICAgIC8vIGFsc28gaWYgc2VsZWN0aW9uIGlzIG5vdCBjdXJyZW50bHkgaW4gdGhlIGRyb3AgZG93biwgdGhlbiBkb24ndAotICAgICAgICAgICAgLy8gbGV0IGNlbnRlciBvciBlbnRlciBwcmVzc2VzIGdvIHRoZXJlIHNpbmNlIHRoYXQgd291bGQgY2F1c2UgaXQKLSAgICAgICAgICAgIC8vIHRvIHNlbGVjdCBvbmUgb2YgaXRzIGl0ZW1zCi0gICAgICAgICAgICBpZiAoa2V5Q29kZSAhPSBLZXlFdmVudC5LRVlDT0RFX1NQQUNFCi0gICAgICAgICAgICAgICAgICAgICYmIChtRHJvcERvd25MaXN0LmdldFNlbGVjdGVkSXRlbVBvc2l0aW9uKCkgPj0gMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChrZXlDb2RlICE9IEtleUV2ZW50LktFWUNPREVfRU5URVIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGtleUNvZGUgIT0gS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0NFTlRFUikpKSB7Ci0gICAgICAgICAgICAgICAgaW50IGN1ckluZGV4ID0gbURyb3BEb3duTGlzdC5nZXRTZWxlY3RlZEl0ZW1Qb3NpdGlvbigpOwotICAgICAgICAgICAgICAgIGJvb2xlYW4gY29uc3VtZWQ7Ci0KLSAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIGJlbG93ID0gIW1Qb3B1cC5pc0Fib3ZlQW5jaG9yKCk7Ci0KLSAgICAgICAgICAgICAgICBmaW5hbCBMaXN0QWRhcHRlciBhZGFwdGVyID0gbUFkYXB0ZXI7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgYm9vbGVhbiBhbGxFbmFibGVkOwotICAgICAgICAgICAgICAgIGludCBmaXJzdEl0ZW0gPSBJbnRlZ2VyLk1BWF9WQUxVRTsKLSAgICAgICAgICAgICAgICBpbnQgbGFzdEl0ZW0gPSBJbnRlZ2VyLk1JTl9WQUxVRTsKLQotICAgICAgICAgICAgICAgIGlmIChhZGFwdGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYWxsRW5hYmxlZCA9IGFkYXB0ZXIuYXJlQWxsSXRlbXNFbmFibGVkKCk7Ci0gICAgICAgICAgICAgICAgICAgIGZpcnN0SXRlbSA9IGFsbEVuYWJsZWQgPyAwIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRHJvcERvd25MaXN0Lmxvb2tGb3JTZWxlY3RhYmxlUG9zaXRpb24oMCwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGxhc3RJdGVtID0gYWxsRW5hYmxlZCA/IGFkYXB0ZXIuZ2V0Q291bnQoKSAtIDEgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ecm9wRG93bkxpc3QubG9va0ZvclNlbGVjdGFibGVQb3NpdGlvbihhZGFwdGVyLmdldENvdW50KCkgLSAxLCBmYWxzZSk7ICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKChiZWxvdyAmJiBrZXlDb2RlID09IEtleUV2ZW50LktFWUNPREVfRFBBRF9VUCAmJiBjdXJJbmRleCA8PSBmaXJzdEl0ZW0pIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAoIWJlbG93ICYmIGtleUNvZGUgPT0gS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0RPV04gJiYgY3VySW5kZXggPj0gbGFzdEl0ZW0pKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFdoZW4gdGhlIHNlbGVjdGlvbiBpcyBhdCB0aGUgdG9wLCB3ZSBibG9jayB0aGUga2V5Ci0gICAgICAgICAgICAgICAgICAgIC8vIGV2ZW50IHRvIHByZXZlbnQgZm9jdXMgZnJvbSBtb3ZpbmcuCi0gICAgICAgICAgICAgICAgICAgIGNsZWFyTGlzdFNlbGVjdGlvbigpOwotICAgICAgICAgICAgICAgICAgICBtUG9wdXAuc2V0SW5wdXRNZXRob2RNb2RlKFBvcHVwV2luZG93LklOUFVUX01FVEhPRF9ORUVERUQpOwotICAgICAgICAgICAgICAgICAgICBzaG93RHJvcERvd24oKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gV0FSTklORzogUGxlYXNlIHJlYWQgdGhlIGNvbW1lbnQgd2hlcmUgbUxpc3RTZWxlY3Rpb25IaWRkZW4KLSAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgaXMgZGVjbGFyZWQKLSAgICAgICAgICAgICAgICAgICAgbURyb3BEb3duTGlzdC5tTGlzdFNlbGVjdGlvbkhpZGRlbiA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGNvbnN1bWVkID0gbURyb3BEb3duTGlzdC5vbktleURvd24oa2V5Q29kZSwgZXZlbnQpOwotICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAiS2V5IGRvd246IGNvZGU9IiArIGtleUNvZGUgKyAiIGxpc3QgY29uc3VtZWQ9IiArIGNvbnN1bWVkKTsKLQotICAgICAgICAgICAgICAgIGlmIChjb25zdW1lZCkgewotICAgICAgICAgICAgICAgICAgICAvLyBJZiBpdCBoYW5kbGVkIHRoZSBrZXkgZXZlbnQsIHRoZW4gdGhlIHVzZXIgaXMKLSAgICAgICAgICAgICAgICAgICAgLy8gbmF2aWdhdGluZyBpbiB0aGUgbGlzdCwgc28gd2Ugc2hvdWxkIHB1dCBpdCBpbiBmcm9udC4KLSAgICAgICAgICAgICAgICAgICAgbVBvcHVwLnNldElucHV0TWV0aG9kTW9kZShQb3B1cFdpbmRvdy5JTlBVVF9NRVRIT0RfTk9UX05FRURFRCk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEhlcmUncyBhIGxpdHRsZSB0cmljayB3ZSBuZWVkIHRvIGRvIHRvIG1ha2Ugc3VyZSB0aGF0Ci0gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBsaXN0IHZpZXcgaXMgYWN0dWFsbHkgc2hvd2luZyBpdHMgZm9jdXMgaW5kaWNhdG9yLAotICAgICAgICAgICAgICAgICAgICAvLyBieSBlbnN1cmluZyBpdCBoYXMgZm9jdXMgYW5kIGdldHRpbmcgaXRzIHdpbmRvdyBvdXQKLSAgICAgICAgICAgICAgICAgICAgLy8gb2YgdG91Y2ggbW9kZS4KLSAgICAgICAgICAgICAgICAgICAgbURyb3BEb3duTGlzdC5yZXF1ZXN0Rm9jdXNGcm9tVG91Y2goKTsKLSAgICAgICAgICAgICAgICAgICAgc2hvd0Ryb3BEb3duKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChrZXlDb2RlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBhdm9pZCBwYXNzaW5nIHRoZSBmb2N1cyBmcm9tIHRoZSB0ZXh0IHZpZXcgdG8gdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXh0IGNvbXBvbmVudAotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5LRVlDT0RFX0VOVEVSOgotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5LRVlDT0RFX0RQQURfQ0VOVEVSOgotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5LRVlDT0RFX0RQQURfRE9XTjoKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX1VQOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGJlbG93ICYmIGtleUNvZGUgPT0gS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0RPV04pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoZW4gdGhlIHNlbGVjdGlvbiBpcyBhdCB0aGUgYm90dG9tLCB3ZSBibG9jayB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV2ZW50IHRvIGF2b2lkIGdvaW5nIHRvIHRoZSBuZXh0IGZvY3VzYWJsZSB3aWRnZXQKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJJbmRleCA9PSBsYXN0SXRlbSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFiZWxvdyAmJiBrZXlDb2RlID09IEtleUV2ZW50LktFWUNPREVfRFBBRF9VUCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1ckluZGV4ID09IGZpcnN0SXRlbSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChtUG9wdXAub25LZXlEb3duKGtleUNvZGUsIGV2ZW50KSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmICghaXNQb3B1cFNob3dpbmcoKSkgewogICAgICAgICAgICAgc3dpdGNoKGtleUNvZGUpIHsKICAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0RPV046CiAgICAgICAgICAgICAgICAgcGVyZm9ybVZhbGlkYXRpb24oKTsKQEAgLTc0Niw3ICs2NTQsNyBAQAogICAgICAgICBib29sZWFuIGhhbmRsZWQgPSBzdXBlci5vbktleURvd24oa2V5Q29kZSwgZXZlbnQpOwogICAgICAgICBtTGFzdEtleUNvZGUgPSBLZXlFdmVudC5LRVlDT0RFX1VOS05PV047CiAKLSAgICAgICAgaWYgKGhhbmRsZWQgJiYgaXNQb3B1cFNob3dpbmcoKSAmJiBtRHJvcERvd25MaXN0ICE9IG51bGwpIHsKKyAgICAgICAgaWYgKGhhbmRsZWQgJiYgaXNQb3B1cFNob3dpbmcoKSkgewogICAgICAgICAgICAgY2xlYXJMaXN0U2VsZWN0aW9uKCk7CiAgICAgICAgIH0KIApAQCAtODA3LDExICs3MTUsMTIgQEAKICAgICAgICAgaWYgKGVub3VnaFRvRmlsdGVyKCkpIHsKICAgICAgICAgICAgIGlmIChtRmlsdGVyICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBwZXJmb3JtRmlsdGVyaW5nKGdldFRleHQoKSwgbUxhc3RLZXlDb2RlKTsKKyAgICAgICAgICAgICAgICBidWlsZEltZUNvbXBsZXRpb25zKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvLyBkcm9wIGRvd24gaXMgYXV0b21hdGljYWxseSBkaXNtaXNzZWQgd2hlbiBlbm91Z2ggY2hhcmFjdGVycwogICAgICAgICAgICAgLy8gYXJlIGRlbGV0ZWQgZnJvbSB0aGUgdGV4dCB2aWV3Ci0gICAgICAgICAgICBpZiAoIW1Ecm9wRG93bkFsd2F5c1Zpc2libGUpIGRpc21pc3NEcm9wRG93bigpOworICAgICAgICAgICAgaWYgKCFtUG9wdXAuaXNEcm9wRG93bkFsd2F5c1Zpc2libGUoKSkgZGlzbWlzc0Ryb3BEb3duKCk7CiAgICAgICAgICAgICBpZiAobUZpbHRlciAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgbUZpbHRlci5maWx0ZXIobnVsbCk7CiAgICAgICAgICAgICB9CkBAIC04NDQsMTMgKzc1Myw3IEBACiAgICAgICogaXQgYmFjay4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBjbGVhckxpc3RTZWxlY3Rpb24oKSB7Ci0gICAgICAgIGZpbmFsIERyb3BEb3duTGlzdFZpZXcgbGlzdCA9IG1Ecm9wRG93bkxpc3Q7Ci0gICAgICAgIGlmIChsaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vIFdBUk5JTkc6IFBsZWFzZSByZWFkIHRoZSBjb21tZW50IHdoZXJlIG1MaXN0U2VsZWN0aW9uSGlkZGVuIGlzIGRlY2xhcmVkCi0gICAgICAgICAgICBsaXN0Lm1MaXN0U2VsZWN0aW9uSGlkZGVuID0gdHJ1ZTsKLSAgICAgICAgICAgIGxpc3QuaGlkZVNlbGVjdG9yKCk7Ci0gICAgICAgICAgICBsaXN0LnJlcXVlc3RMYXlvdXQoKTsKLSAgICAgICAgfQorICAgICAgICBtUG9wdXAuY2xlYXJMaXN0U2VsZWN0aW9uKCk7CiAgICAgfQogICAgIAogICAgIC8qKgpAQCAtODU5LDExICs3NjIsNyBAQAogICAgICAqIEBwYXJhbSBwb3NpdGlvbiBUaGUgcG9zaXRpb24gdG8gbW92ZSB0aGUgc2VsZWN0b3IgdG8uCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0TGlzdFNlbGVjdGlvbihpbnQgcG9zaXRpb24pIHsKLSAgICAgICAgaWYgKG1Qb3B1cC5pc1Nob3dpbmcoKSAmJiAobURyb3BEb3duTGlzdCAhPSBudWxsKSkgewotICAgICAgICAgICAgbURyb3BEb3duTGlzdC5tTGlzdFNlbGVjdGlvbkhpZGRlbiA9IGZhbHNlOwotICAgICAgICAgICAgbURyb3BEb3duTGlzdC5zZXRTZWxlY3Rpb24ocG9zaXRpb24pOwotICAgICAgICAgICAgLy8gTGlzdFZpZXcuc2V0U2VsZWN0aW9uKCkgd2lsbCBjYWxsIHJlcXVlc3RMYXlvdXQoKQotICAgICAgICB9CisgICAgICAgIG1Qb3B1cC5zZXRTZWxlY3Rpb24ocG9zaXRpb24pOwogICAgIH0KIAogICAgIC8qKgpAQCAtODc3LDEwICs3NzYsNyBAQAogICAgICAqIEBzZWUgTGlzdFZpZXcjZ2V0U2VsZWN0ZWRJdGVtUG9zaXRpb24oKQogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0TGlzdFNlbGVjdGlvbigpIHsKLSAgICAgICAgaWYgKG1Qb3B1cC5pc1Nob3dpbmcoKSAmJiAobURyb3BEb3duTGlzdCAhPSBudWxsKSkgewotICAgICAgICAgICAgcmV0dXJuIG1Ecm9wRG93bkxpc3QuZ2V0U2VsZWN0ZWRJdGVtUG9zaXRpb24oKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gTGlzdFZpZXcuSU5WQUxJRF9QT1NJVElPTjsKKyAgICAgICAgcmV0dXJuIG1Qb3B1cC5nZXRTZWxlY3RlZEl0ZW1Qb3NpdGlvbigpOwogICAgIH0KIAogICAgIC8qKgpAQCAtOTE0LDEzICs4MTAsNyBAQAogICAgICAgICAgICAgcmVwbGFjZVRleHQoY29tcGxldGlvbi5nZXRUZXh0KCkpOwogICAgICAgICAgICAgbUJsb2NrQ29tcGxldGlvbiA9IGZhbHNlOwogCi0gICAgICAgICAgICBpZiAobUl0ZW1DbGlja0xpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBEcm9wRG93bkxpc3RWaWV3IGxpc3QgPSBtRHJvcERvd25MaXN0OwotICAgICAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB3ZSBkb24ndCBoYXZlIGEgVmlldyBoZXJlLCBzbyB3ZSB3aWxsIG5lZWQgdG8KLSAgICAgICAgICAgICAgICAvLyBzdXBwbHkgbnVsbC4gIEhvcGVmdWxseSBubyBleGlzdGluZyBhcHBzIGNyYXNoLi4uCi0gICAgICAgICAgICAgICAgbUl0ZW1DbGlja0xpc3RlbmVyLm9uSXRlbUNsaWNrKGxpc3QsIG51bGwsIGNvbXBsZXRpb24uZ2V0UG9zaXRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRpb24uZ2V0SWQoKSk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBtUG9wdXAucGVyZm9ybUl0ZW1DbGljayhjb21wbGV0aW9uLmdldFBvc2l0aW9uKCkpOwogICAgICAgICB9CiAgICAgfQogCkBAIC05MjgsNyArODE4LDcgQEAKICAgICAgICAgaWYgKGlzUG9wdXBTaG93aW5nKCkpIHsKICAgICAgICAgICAgIE9iamVjdCBzZWxlY3RlZEl0ZW07CiAgICAgICAgICAgICBpZiAocG9zaXRpb24gPCAwKSB7Ci0gICAgICAgICAgICAgICAgc2VsZWN0ZWRJdGVtID0gbURyb3BEb3duTGlzdC5nZXRTZWxlY3RlZEl0ZW0oKTsKKyAgICAgICAgICAgICAgICBzZWxlY3RlZEl0ZW0gPSBtUG9wdXAuZ2V0U2VsZWN0ZWRJdGVtKCk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIHNlbGVjdGVkSXRlbSA9IG1BZGFwdGVyLmdldEl0ZW0ocG9zaXRpb24pOwogICAgICAgICAgICAgfQpAQCAtOTQyLDE4ICs4MzIsMTggQEAKICAgICAgICAgICAgIG1CbG9ja0NvbXBsZXRpb24gPSBmYWxzZTsgICAgICAgICAgICAKIAogICAgICAgICAgICAgaWYgKG1JdGVtQ2xpY2tMaXN0ZW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgRHJvcERvd25MaXN0VmlldyBsaXN0ID0gbURyb3BEb3duTGlzdDsKKyAgICAgICAgICAgICAgICBmaW5hbCBMaXN0UG9wdXBXaW5kb3cgbGlzdCA9IG1Qb3B1cDsKIAogICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZFZpZXcgPT0gbnVsbCB8fCBwb3NpdGlvbiA8IDApIHsKICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRWaWV3ID0gbGlzdC5nZXRTZWxlY3RlZFZpZXcoKTsKICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBsaXN0LmdldFNlbGVjdGVkSXRlbVBvc2l0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgIGlkID0gbGlzdC5nZXRTZWxlY3RlZEl0ZW1JZCgpOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtSXRlbUNsaWNrTGlzdGVuZXIub25JdGVtQ2xpY2sobGlzdCwgc2VsZWN0ZWRWaWV3LCBwb3NpdGlvbiwgaWQpOworICAgICAgICAgICAgICAgIG1JdGVtQ2xpY2tMaXN0ZW5lci5vbkl0ZW1DbGljayhsaXN0LmdldExpc3RWaWV3KCksIHNlbGVjdGVkVmlldywgcG9zaXRpb24sIGlkKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIGlmIChtRHJvcERvd25EaXNtaXNzZWRPbkNvbXBsZXRpb24gJiYgIW1Ecm9wRG93bkFsd2F5c1Zpc2libGUpIHsKKyAgICAgICAgaWYgKG1Ecm9wRG93bkRpc21pc3NlZE9uQ29tcGxldGlvbiAmJiAhbVBvcHVwLmlzRHJvcERvd25BbHdheXNWaXNpYmxlKCkpIHsKICAgICAgICAgICAgIGRpc21pc3NEcm9wRG93bigpOwogICAgICAgICB9CiAgICAgfQpAQCAtMTAwMyw3ICs4OTMsNiBAQAogICAgIC8qKiB7QGluaGVyaXREb2N9ICovCiAgICAgcHVibGljIHZvaWQgb25GaWx0ZXJDb21wbGV0ZShpbnQgY291bnQpIHsKICAgICAgICAgdXBkYXRlRHJvcERvd25Gb3JGaWx0ZXIoY291bnQpOwotCiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZURyb3BEb3duRm9yRmlsdGVyKGludCBjb3VudCkgewpAQCAtMTAxNywxMSArOTA2LDEyIEBACiAgICAgICAgICAqIHRvIGZpbHRlci4KICAgICAgICAgICovCiAKLSAgICAgICAgaWYgKChjb3VudCA+IDAgfHwgbURyb3BEb3duQWx3YXlzVmlzaWJsZSkgJiYgZW5vdWdoVG9GaWx0ZXIoKSkgeworICAgICAgICBmaW5hbCBib29sZWFuIGRyb3BEb3duQWx3YXlzVmlzaWJsZSA9IG1Qb3B1cC5pc0Ryb3BEb3duQWx3YXlzVmlzaWJsZSgpOworICAgICAgICBpZiAoKGNvdW50ID4gMCB8fCBkcm9wRG93bkFsd2F5c1Zpc2libGUpICYmIGVub3VnaFRvRmlsdGVyKCkpIHsKICAgICAgICAgICAgIGlmIChoYXNGb2N1cygpICYmIGhhc1dpbmRvd0ZvY3VzKCkpIHsKICAgICAgICAgICAgICAgICBzaG93RHJvcERvd24oKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmICghbURyb3BEb3duQWx3YXlzVmlzaWJsZSkgeworICAgICAgICB9IGVsc2UgaWYgKCFkcm9wRG93bkFsd2F5c1Zpc2libGUpIHsKICAgICAgICAgICAgIGRpc21pc3NEcm9wRG93bigpOwogICAgICAgICB9CiAgICAgfQpAQCAtMTAyOSw3ICs5MTksNyBAQAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIG9uV2luZG93Rm9jdXNDaGFuZ2VkKGJvb2xlYW4gaGFzV2luZG93Rm9jdXMpIHsKICAgICAgICAgc3VwZXIub25XaW5kb3dGb2N1c0NoYW5nZWQoaGFzV2luZG93Rm9jdXMpOwotICAgICAgICBpZiAoIWhhc1dpbmRvd0ZvY3VzICYmICFtRHJvcERvd25BbHdheXNWaXNpYmxlKSB7CisgICAgICAgIGlmICghaGFzV2luZG93Rm9jdXMgJiYgIW1Qb3B1cC5pc0Ryb3BEb3duQWx3YXlzVmlzaWJsZSgpKSB7CiAgICAgICAgICAgICBkaXNtaXNzRHJvcERvd24oKTsKICAgICAgICAgfQogICAgIH0KQEAgLTEwMzksNyArOTI5LDcgQEAKICAgICAgICAgc3VwZXIub25EaXNwbGF5SGludChoaW50KTsKICAgICAgICAgc3dpdGNoIChoaW50KSB7CiAgICAgICAgICAgICBjYXNlIElOVklTSUJMRToKLSAgICAgICAgICAgICAgICBpZiAoIW1Ecm9wRG93bkFsd2F5c1Zpc2libGUpIHsKKyAgICAgICAgICAgICAgICBpZiAoIW1Qb3B1cC5pc0Ryb3BEb3duQWx3YXlzVmlzaWJsZSgpKSB7CiAgICAgICAgICAgICAgICAgICAgIGRpc21pc3NEcm9wRG93bigpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTEwNTMsNyArOTQzLDcgQEAKICAgICAgICAgaWYgKCFmb2N1c2VkKSB7CiAgICAgICAgICAgICBwZXJmb3JtVmFsaWRhdGlvbigpOwogICAgICAgICB9Ci0gICAgICAgIGlmICghZm9jdXNlZCAmJiAhbURyb3BEb3duQWx3YXlzVmlzaWJsZSkgeworICAgICAgICBpZiAoIWZvY3VzZWQgJiYgIW1Qb3B1cC5pc0Ryb3BEb3duQWx3YXlzVmlzaWJsZSgpKSB7CiAgICAgICAgICAgICBkaXNtaXNzRHJvcERvd24oKTsKICAgICAgICAgfQogICAgIH0KQEAgLTEwNzgsOCArOTY4LDYgQEAKICAgICAgICAgICAgIGltbS5kaXNwbGF5Q29tcGxldGlvbnModGhpcywgbnVsbCk7CiAgICAgICAgIH0KICAgICAgICAgbVBvcHVwLmRpc21pc3MoKTsKLSAgICAgICAgbVBvcHVwLnNldENvbnRlbnRWaWV3KG51bGwpOwotICAgICAgICBtRHJvcERvd25MaXN0ID0gbnVsbDsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTEwOTIsMTggKzk4MCw2IEBACiAKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogPHA+VXNlZCBmb3IgbGF6eSBpbnN0YW50aWF0aW9uIG9mIHRoZSBhbmNob3IgdmlldyBmcm9tIHRoZSBpZCB3ZSBoYXZlLiBJZiB0aGUgdmFsdWUgb2YKLSAgICAgKiB0aGUgaWQgaXMgTk9fSUQgb3Igd2UgY2FuJ3QgZmluZCBhIHZpZXcgZm9yIHRoZSBnaXZlbiBpZCwgd2UgcmV0dXJuIHRoaXMgVGV4dFZpZXcgYXMKLSAgICAgKiB0aGUgZGVmYXVsdCBhbmNob3JpbmcgcG9pbnQuPC9wPgotICAgICAqLwotICAgIHByaXZhdGUgVmlldyBnZXREcm9wRG93bkFuY2hvclZpZXcoKSB7Ci0gICAgICAgIGlmIChtRHJvcERvd25BbmNob3JWaWV3ID09IG51bGwgJiYgbURyb3BEb3duQW5jaG9ySWQgIT0gVmlldy5OT19JRCkgewotICAgICAgICAgICAgbURyb3BEb3duQW5jaG9yVmlldyA9IGdldFJvb3RWaWV3KCkuZmluZFZpZXdCeUlkKG1Ecm9wRG93bkFuY2hvcklkKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbURyb3BEb3duQW5jaG9yVmlldyA9PSBudWxsID8gdGhpcyA6IG1Ecm9wRG93bkFuY2hvclZpZXc7Ci0gICAgfQogCiAgICAgLyoqCiAgICAgICogSXNzdWVzIGEgcnVubmFibGUgdG8gc2hvdyB0aGUgZHJvcGRvd24gYXMgc29vbiBhcyBwb3NzaWJsZS4KQEAgLTExMTEsNyArOTg3LDcgQEAKICAgICAgKiBAaGlkZSBpbnRlcm5hbCB1c2VkIG9ubHkgYnkgU2VhcmNoRGlhbG9nCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2hvd0Ryb3BEb3duQWZ0ZXJMYXlvdXQoKSB7Ci0gICAgICAgIHBvc3QobVNob3dEcm9wRG93blJ1bm5hYmxlKTsKKyAgICAgICAgbVBvcHVwLnBvc3RTaG93KCk7CiAgICAgfQogICAgIAogICAgIC8qKgpAQCAtMTEyMiw3ICs5OTgsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGVuc3VyZUltZVZpc2libGUoYm9vbGVhbiB2aXNpYmxlKSB7CiAgICAgICAgIG1Qb3B1cC5zZXRJbnB1dE1ldGhvZE1vZGUodmlzaWJsZQotICAgICAgICAgICAgICAgID8gUG9wdXBXaW5kb3cuSU5QVVRfTUVUSE9EX05FRURFRCA6IFBvcHVwV2luZG93LklOUFVUX01FVEhPRF9OT1RfTkVFREVEKTsKKyAgICAgICAgICAgICAgICA/IExpc3RQb3B1cFdpbmRvdy5JTlBVVF9NRVRIT0RfTkVFREVEIDogTGlzdFBvcHVwV2luZG93LklOUFVUX01FVEhPRF9OT1RfTkVFREVEKTsKICAgICAgICAgc2hvd0Ryb3BEb3duKCk7CiAgICAgfQogCkBAIC0xMTMwLDg5ICsxMDA2LDIxIEBACiAgICAgICogQGhpZGUgaW50ZXJuYWwgdXNlZCBvbmx5IGhlcmUgYW5kIFNlYXJjaERpYWxvZwogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzSW5wdXRNZXRob2ROb3ROZWVkZWQoKSB7Ci0gICAgICAgIHJldHVybiBtUG9wdXAuZ2V0SW5wdXRNZXRob2RNb2RlKCkgPT0gUG9wdXBXaW5kb3cuSU5QVVRfTUVUSE9EX05PVF9ORUVERUQ7CisgICAgICAgIHJldHVybiBtUG9wdXAuZ2V0SW5wdXRNZXRob2RNb2RlKCkgPT0gTGlzdFBvcHVwV2luZG93LklOUFVUX01FVEhPRF9OT1RfTkVFREVEOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIDxwPkRpc3BsYXlzIHRoZSBkcm9wIGRvd24gb24gc2NyZWVuLjwvcD4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzaG93RHJvcERvd24oKSB7Ci0gICAgICAgIGludCBoZWlnaHQgPSBidWlsZERyb3BEb3duKCk7Ci0KLSAgICAgICAgaW50IHdpZHRoU3BlYyA9IDA7Ci0gICAgICAgIGludCBoZWlnaHRTcGVjID0gMDsKLQotICAgICAgICBib29sZWFuIG5vSW5wdXRNZXRob2QgPSBpc0lucHV0TWV0aG9kTm90TmVlZGVkKCk7Ci0KLSAgICAgICAgaWYgKG1Qb3B1cC5pc1Nob3dpbmcoKSkgewotICAgICAgICAgICAgaWYgKG1Ecm9wRG93bldpZHRoID09IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UKSB7Ci0gICAgICAgICAgICAgICAgLy8gVGhlIGNhbGwgdG8gUG9wdXBXaW5kb3cncyB1cGRhdGUgbWV0aG9kIGJlbG93IGNhbiBhY2NlcHQgLTEgZm9yIGFueQotICAgICAgICAgICAgICAgIC8vIHZhbHVlIHlvdSBkbyBub3Qgd2FudCB0byB1cGRhdGUuCi0gICAgICAgICAgICAgICAgd2lkdGhTcGVjID0gLTE7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1Ecm9wRG93bldpZHRoID09IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UKSB7Ci0gICAgICAgICAgICAgICAgd2lkdGhTcGVjID0gZ2V0RHJvcERvd25BbmNob3JWaWV3KCkuZ2V0V2lkdGgoKTsKKyAgICAgICAgaWYgKG1Qb3B1cC5nZXRBbmNob3JWaWV3KCkgPT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKG1Ecm9wRG93bkFuY2hvcklkICE9IFZpZXcuTk9fSUQpIHsKKyAgICAgICAgICAgICAgICBtUG9wdXAuc2V0QW5jaG9yVmlldyhnZXRSb290VmlldygpLmZpbmRWaWV3QnlJZChtRHJvcERvd25BbmNob3JJZCkpOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB3aWR0aFNwZWMgPSBtRHJvcERvd25XaWR0aDsKKyAgICAgICAgICAgICAgICBtUG9wdXAuc2V0QW5jaG9yVmlldyh0aGlzKTsKICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1Ecm9wRG93bkhlaWdodCA9PSBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCkgewotICAgICAgICAgICAgICAgIC8vIFRoZSBjYWxsIHRvIFBvcHVwV2luZG93J3MgdXBkYXRlIG1ldGhvZCBiZWxvdyBjYW4gYWNjZXB0IC0xIGZvciBhbnkKLSAgICAgICAgICAgICAgICAvLyB2YWx1ZSB5b3UgZG8gbm90IHdhbnQgdG8gdXBkYXRlLgotICAgICAgICAgICAgICAgIGhlaWdodFNwZWMgPSBub0lucHV0TWV0aG9kID8gaGVpZ2h0IDogVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQ7Ci0gICAgICAgICAgICAgICAgaWYgKG5vSW5wdXRNZXRob2QpIHsKLSAgICAgICAgICAgICAgICAgICAgbVBvcHVwLnNldFdpbmRvd0xheW91dE1vZGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbURyb3BEb3duV2lkdGggPT0gVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQgOiAwLCAwKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtUG9wdXAuc2V0V2luZG93TGF5b3V0TW9kZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRHJvcERvd25XaWR0aCA9PSBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCA6IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAobURyb3BEb3duSGVpZ2h0ID09IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UKSB7Ci0gICAgICAgICAgICAgICAgaGVpZ2h0U3BlYyA9IGhlaWdodDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaGVpZ2h0U3BlYyA9IG1Ecm9wRG93bkhlaWdodDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbVBvcHVwLnNldE91dHNpZGVUb3VjaGFibGUoIW1Gb3JjZUlnbm9yZU91dHNpZGVUb3VjaCAmJiAhbURyb3BEb3duQWx3YXlzVmlzaWJsZSk7Ci0KLSAgICAgICAgICAgIG1Qb3B1cC51cGRhdGUoZ2V0RHJvcERvd25BbmNob3JWaWV3KCksIG1Ecm9wRG93bkhvcml6b250YWxPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgIG1Ecm9wRG93blZlcnRpY2FsT2Zmc2V0LCB3aWR0aFNwZWMsIGhlaWdodFNwZWMpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKG1Ecm9wRG93bldpZHRoID09IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UKSB7Ci0gICAgICAgICAgICAgICAgd2lkdGhTcGVjID0gVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQ7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChtRHJvcERvd25XaWR0aCA9PSBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCkgewotICAgICAgICAgICAgICAgICAgICBtUG9wdXAuc2V0V2lkdGgoZ2V0RHJvcERvd25BbmNob3JWaWV3KCkuZ2V0V2lkdGgoKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbVBvcHVwLnNldFdpZHRoKG1Ecm9wRG93bldpZHRoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtRHJvcERvd25IZWlnaHQgPT0gVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQpIHsKLSAgICAgICAgICAgICAgICBoZWlnaHRTcGVjID0gVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQ7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChtRHJvcERvd25IZWlnaHQgPT0gVmlld0dyb3VwLkxheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQpIHsKLSAgICAgICAgICAgICAgICAgICAgbVBvcHVwLnNldEhlaWdodChoZWlnaHQpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Qb3B1cC5zZXRIZWlnaHQobURyb3BEb3duSGVpZ2h0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1Qb3B1cC5zZXRXaW5kb3dMYXlvdXRNb2RlKHdpZHRoU3BlYywgaGVpZ2h0U3BlYyk7Ci0gICAgICAgICAgICBtUG9wdXAuc2V0SW5wdXRNZXRob2RNb2RlKFBvcHVwV2luZG93LklOUFVUX01FVEhPRF9ORUVERUQpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyB1c2Ugb3V0c2lkZSB0b3VjaGFibGUgdG8gZGlzbWlzcyBkcm9wIGRvd24gd2hlbiB0b3VjaGluZyBvdXRzaWRlIG9mIGl0LCBzbwotICAgICAgICAgICAgLy8gb25seSBzZXQgdGhpcyBpZiB0aGUgZHJvcGRvd24gaXMgbm90IGFsd2F5cyB2aXNpYmxlCi0gICAgICAgICAgICBtUG9wdXAuc2V0T3V0c2lkZVRvdWNoYWJsZSghbUZvcmNlSWdub3JlT3V0c2lkZVRvdWNoICYmICFtRHJvcERvd25BbHdheXNWaXNpYmxlKTsKLSAgICAgICAgICAgIG1Qb3B1cC5zZXRUb3VjaEludGVyY2VwdG9yKG5ldyBQb3B1cFRvdWNoSW50ZXJjZXB0b3IoKSk7Ci0gICAgICAgICAgICBtUG9wdXAuc2hvd0FzRHJvcERvd24oZ2V0RHJvcERvd25BbmNob3JWaWV3KCksCi0gICAgICAgICAgICAgICAgICAgIG1Ecm9wRG93bkhvcml6b250YWxPZmZzZXQsIG1Ecm9wRG93blZlcnRpY2FsT2Zmc2V0KTsKLSAgICAgICAgICAgIG1Ecm9wRG93bkxpc3Quc2V0U2VsZWN0aW9uKExpc3RWaWV3LklOVkFMSURfUE9TSVRJT04pOwotICAgICAgICAgICAgY2xlYXJMaXN0U2VsZWN0aW9uKCk7Ci0gICAgICAgICAgICBwb3N0KG1IaWRlU2VsZWN0b3IpOwogICAgICAgICB9CisgICAgICAgIG1Qb3B1cC5zaG93KCk7CiAgICAgfQogICAgIAogICAgIC8qKgpAQCAtMTIyMywxOSArMTAzMSwxMCBAQAogICAgICAqIEBoaWRlIHVzZWQgb25seSBieSBTZWFyY2hEaWFsb2cKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRGb3JjZUlnbm9yZU91dHNpZGVUb3VjaChib29sZWFuIGZvcmNlSWdub3JlT3V0c2lkZVRvdWNoKSB7Ci0gICAgICAgIG1Gb3JjZUlnbm9yZU91dHNpZGVUb3VjaCA9IGZvcmNlSWdub3JlT3V0c2lkZVRvdWNoOworICAgICAgICBtUG9wdXAuc2V0Rm9yY2VJZ25vcmVPdXRzaWRlVG91Y2goZm9yY2VJZ25vcmVPdXRzaWRlVG91Y2gpOwogICAgIH0KLQotICAgIC8qKgotICAgICAqIDxwPkJ1aWxkcyB0aGUgcG9wdXAgd2luZG93J3MgY29udGVudCBhbmQgcmV0dXJucyB0aGUgaGVpZ2h0IHRoZSBwb3B1cAotICAgICAqIHNob3VsZCBoYXZlLiBSZXR1cm5zIC0xIHdoZW4gdGhlIGNvbnRlbnQgYWxyZWFkeSBleGlzdHMuPC9wPgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgY29udGVudCdzIGhlaWdodCBvciAtMSBpZiBjb250ZW50IGFscmVhZHkgZXhpc3RzCi0gICAgICovCi0gICAgcHJpdmF0ZSBpbnQgYnVpbGREcm9wRG93bigpIHsKLSAgICAgICAgVmlld0dyb3VwIGRyb3BEb3duVmlldzsKLSAgICAgICAgaW50IG90aGVySGVpZ2h0cyA9IDA7Ci0KKyAgICAKKyAgICBwcml2YXRlIHZvaWQgYnVpbGRJbWVDb21wbGV0aW9ucygpIHsKICAgICAgICAgZmluYWwgTGlzdEFkYXB0ZXIgYWRhcHRlciA9IG1BZGFwdGVyOwogICAgICAgICBpZiAoYWRhcHRlciAhPSBudWxsKSB7CiAgICAgICAgICAgICBJbnB1dE1ldGhvZE1hbmFnZXIgaW1tID0gSW5wdXRNZXRob2RNYW5hZ2VyLnBlZWtJbnN0YW5jZSgpOwpAQCAtMTI2MywxMzUgKzEwNjIsNiBAQAogICAgICAgICAgICAgICAgIGltbS5kaXNwbGF5Q29tcGxldGlvbnModGhpcywgY29tcGxldGlvbnMpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1Ecm9wRG93bkxpc3QgPT0gbnVsbCkgewotICAgICAgICAgICAgQ29udGV4dCBjb250ZXh0ID0gZ2V0Q29udGV4dCgpOwotCi0gICAgICAgICAgICBtSGlkZVNlbGVjdG9yID0gbmV3IExpc3RTZWxlY3RvckhpZGVyKCk7Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogVGhpcyBSdW5uYWJsZSBleGlzdHMgZm9yIHRoZSBzb2xlIHB1cnBvc2Ugb2YgY2hlY2tpbmcgaWYgdGhlIHZpZXcgbGF5b3V0IGhhcyBnb3QKLSAgICAgICAgICAgICAqIGNvbXBsZXRlZCBhbmQgaWYgc28gY2FsbCBzaG93RHJvcERvd24gdG8gZGlzcGxheSB0aGUgZHJvcCBkb3duLiBUaGlzIGlzIHVzZWQgdG8gc2hvdwotICAgICAgICAgICAgICogdGhlIGRyb3AgZG93biBhcyBzb29uIGFzIHBvc3NpYmxlIGFmdGVyIHVzZXIgb3BlbnMgdXAgdGhlIHNlYXJjaCBkaWFsb2csIHdpdGhvdXQKLSAgICAgICAgICAgICAqIHdhaXRpbmcgZm9yIHRoZSBub3JtYWwgVUkgcGlwZWxpbmUgdG8gZG8gaXQncyBqb2Igd2hpY2ggaXMgc2xvd2VyIHRoYW4gdGhpcyBtZXRob2QuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIG1TaG93RHJvcERvd25SdW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFZpZXcgbGF5b3V0IHNob3VsZCBiZSBhbGwgZG9uZSBiZWZvcmUgZGlzcGxheWluZyB0aGUgZHJvcCBkb3duLgotICAgICAgICAgICAgICAgICAgICBWaWV3IHZpZXcgPSBnZXREcm9wRG93bkFuY2hvclZpZXcoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHZpZXcgIT0gbnVsbCAmJiB2aWV3LmdldFdpbmRvd1Rva2VuKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc2hvd0Ryb3BEb3duKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9OwotCi0gICAgICAgICAgICBtRHJvcERvd25MaXN0ID0gbmV3IERyb3BEb3duTGlzdFZpZXcoY29udGV4dCk7Ci0gICAgICAgICAgICBtRHJvcERvd25MaXN0LnNldFNlbGVjdG9yKG1Ecm9wRG93bkxpc3RIaWdobGlnaHQpOwotICAgICAgICAgICAgbURyb3BEb3duTGlzdC5zZXRBZGFwdGVyKGFkYXB0ZXIpOwotICAgICAgICAgICAgbURyb3BEb3duTGlzdC5zZXRWZXJ0aWNhbEZhZGluZ0VkZ2VFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgbURyb3BEb3duTGlzdC5zZXRPbkl0ZW1DbGlja0xpc3RlbmVyKG1Ecm9wRG93bkl0ZW1DbGlja0xpc3RlbmVyKTsKLSAgICAgICAgICAgIG1Ecm9wRG93bkxpc3Quc2V0Rm9jdXNhYmxlKHRydWUpOwotICAgICAgICAgICAgbURyb3BEb3duTGlzdC5zZXRGb2N1c2FibGVJblRvdWNoTW9kZSh0cnVlKTsKLSAgICAgICAgICAgIG1Ecm9wRG93bkxpc3Quc2V0T25JdGVtU2VsZWN0ZWRMaXN0ZW5lcihuZXcgQWRhcHRlclZpZXcuT25JdGVtU2VsZWN0ZWRMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkl0ZW1TZWxlY3RlZChBZGFwdGVyVmlldzw/PiBwYXJlbnQsIFZpZXcgdmlldywKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBwb3NpdGlvbiwgbG9uZyBpZCkgewotCi0gICAgICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbiAhPSAtMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgRHJvcERvd25MaXN0VmlldyBkcm9wRG93bkxpc3QgPSBtRHJvcERvd25MaXN0OwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHJvcERvd25MaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcm9wRG93bkxpc3QubUxpc3RTZWxlY3Rpb25IaWRkZW4gPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uTm90aGluZ1NlbGVjdGVkKEFkYXB0ZXJWaWV3PD8+IHBhcmVudCkgewotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgbURyb3BEb3duTGlzdC5zZXRPblNjcm9sbExpc3RlbmVyKG5ldyBQb3B1cFNjcm9sbExpc3RlbmVyKCkpOwotCi0gICAgICAgICAgICBpZiAobUl0ZW1TZWxlY3RlZExpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtRHJvcERvd25MaXN0LnNldE9uSXRlbVNlbGVjdGVkTGlzdGVuZXIobUl0ZW1TZWxlY3RlZExpc3RlbmVyKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZHJvcERvd25WaWV3ID0gbURyb3BEb3duTGlzdDsKLQotICAgICAgICAgICAgVmlldyBoaW50VmlldyA9IGdldEhpbnRWaWV3KGNvbnRleHQpOwotICAgICAgICAgICAgaWYgKGhpbnRWaWV3ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBpZiBhbiBoaW50IGhhcyBiZWVuIHNwZWNpZmllZCwgd2UgYWNjb21vZGF0ZSBtb3JlIHNwYWNlIGZvciBpdCBhbmQKLSAgICAgICAgICAgICAgICAvLyBhZGQgYSB0ZXh0IHZpZXcgaW4gdGhlIGRyb3AgZG93biBtZW51LCBhdCB0aGUgYm90dG9tIG9mIHRoZSBsaXN0Ci0gICAgICAgICAgICAgICAgTGluZWFyTGF5b3V0IGhpbnRDb250YWluZXIgPSBuZXcgTGluZWFyTGF5b3V0KGNvbnRleHQpOwotICAgICAgICAgICAgICAgIGhpbnRDb250YWluZXIuc2V0T3JpZW50YXRpb24oTGluZWFyTGF5b3V0LlZFUlRJQ0FMKTsKLQotICAgICAgICAgICAgICAgIExpbmVhckxheW91dC5MYXlvdXRQYXJhbXMgaGludFBhcmFtcyA9IG5ldyBMaW5lYXJMYXlvdXQuTGF5b3V0UGFyYW1zKAotICAgICAgICAgICAgICAgICAgICAgICAgVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQsIDAsIDEuMGYKLSAgICAgICAgICAgICAgICApOwotICAgICAgICAgICAgICAgIGhpbnRDb250YWluZXIuYWRkVmlldyhkcm9wRG93blZpZXcsIGhpbnRQYXJhbXMpOwotICAgICAgICAgICAgICAgIGhpbnRDb250YWluZXIuYWRkVmlldyhoaW50Vmlldyk7Ci0KLSAgICAgICAgICAgICAgICAvLyBtZWFzdXJlIHRoZSBoaW50J3MgaGVpZ2h0IHRvIGZpbmQgaG93IG11Y2ggbW9yZSB2ZXJ0aWNhbCBzcGFjZQotICAgICAgICAgICAgICAgIC8vIHdlIG5lZWQgdG8gYWRkIHRvIHRoZSBkcm9wIGRvd24ncyBoZWlnaHQKLSAgICAgICAgICAgICAgICBpbnQgd2lkdGhTcGVjID0gTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKGdldFdpZHRoKCksIE1lYXN1cmVTcGVjLkFUX01PU1QpOwotICAgICAgICAgICAgICAgIGludCBoZWlnaHRTcGVjID0gTWVhc3VyZVNwZWMuVU5TUEVDSUZJRUQ7Ci0gICAgICAgICAgICAgICAgaGludFZpZXcubWVhc3VyZSh3aWR0aFNwZWMsIGhlaWdodFNwZWMpOwotCi0gICAgICAgICAgICAgICAgaGludFBhcmFtcyA9IChMaW5lYXJMYXlvdXQuTGF5b3V0UGFyYW1zKSBoaW50Vmlldy5nZXRMYXlvdXRQYXJhbXMoKTsKLSAgICAgICAgICAgICAgICBvdGhlckhlaWdodHMgPSBoaW50Vmlldy5nZXRNZWFzdXJlZEhlaWdodCgpICsgaGludFBhcmFtcy50b3BNYXJnaW4KLSAgICAgICAgICAgICAgICAgICAgICAgICsgaGludFBhcmFtcy5ib3R0b21NYXJnaW47Ci0KLSAgICAgICAgICAgICAgICBkcm9wRG93blZpZXcgPSBoaW50Q29udGFpbmVyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtUG9wdXAuc2V0Q29udGVudFZpZXcoZHJvcERvd25WaWV3KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGRyb3BEb3duVmlldyA9IChWaWV3R3JvdXApIG1Qb3B1cC5nZXRDb250ZW50VmlldygpOwotICAgICAgICAgICAgZmluYWwgVmlldyB2aWV3ID0gZHJvcERvd25WaWV3LmZpbmRWaWV3QnlJZChISU5UX1ZJRVdfSUQpOwotICAgICAgICAgICAgaWYgKHZpZXcgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIExpbmVhckxheW91dC5MYXlvdXRQYXJhbXMgaGludFBhcmFtcyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoTGluZWFyTGF5b3V0LkxheW91dFBhcmFtcykgdmlldy5nZXRMYXlvdXRQYXJhbXMoKTsKLSAgICAgICAgICAgICAgICBvdGhlckhlaWdodHMgPSB2aWV3LmdldE1lYXN1cmVkSGVpZ2h0KCkgKyBoaW50UGFyYW1zLnRvcE1hcmdpbgotICAgICAgICAgICAgICAgICAgICAgICAgKyBoaW50UGFyYW1zLmJvdHRvbU1hcmdpbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIE1heCBoZWlnaHQgYXZhaWxhYmxlIG9uIHRoZSBzY3JlZW4gZm9yIGEgcG9wdXAuCi0gICAgICAgIGJvb2xlYW4gaWdub3JlQm90dG9tRGVjb3JhdGlvbnMgPQotICAgICAgICAgICAgICAgIG1Qb3B1cC5nZXRJbnB1dE1ldGhvZE1vZGUoKSA9PSBQb3B1cFdpbmRvdy5JTlBVVF9NRVRIT0RfTk9UX05FRURFRDsKLSAgICAgICAgZmluYWwgaW50IG1heEhlaWdodCA9IG1Qb3B1cC5nZXRNYXhBdmFpbGFibGVIZWlnaHQoCi0gICAgICAgICAgICAgICAgZ2V0RHJvcERvd25BbmNob3JWaWV3KCksIG1Ecm9wRG93blZlcnRpY2FsT2Zmc2V0LCBpZ25vcmVCb3R0b21EZWNvcmF0aW9ucyk7Ci0KLSAgICAgICAgLy8gZ2V0TWF4QXZhaWxhYmxlSGVpZ2h0KCkgc3VidHJhY3RzIHRoZSBwYWRkaW5nLCBzbyB3ZSBwdXQgaXQgYmFjaywKLSAgICAgICAgLy8gdG8gZ2V0IHRoZSBhdmFpbGFibGUgaGVpZ2h0IGZvciB0aGUgd2hvbGUgd2luZG93Ci0gICAgICAgIGludCBwYWRkaW5nID0gMDsKLSAgICAgICAgRHJhd2FibGUgYmFja2dyb3VuZCA9IG1Qb3B1cC5nZXRCYWNrZ3JvdW5kKCk7Ci0gICAgICAgIGlmIChiYWNrZ3JvdW5kICE9IG51bGwpIHsKLSAgICAgICAgICAgIGJhY2tncm91bmQuZ2V0UGFkZGluZyhtVGVtcFJlY3QpOwotICAgICAgICAgICAgcGFkZGluZyA9IG1UZW1wUmVjdC50b3AgKyBtVGVtcFJlY3QuYm90dG9tOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1Ecm9wRG93bkFsd2F5c1Zpc2libGUgfHwgbURyb3BEb3duSGVpZ2h0ID09IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UKSB7Ci0gICAgICAgICAgICByZXR1cm4gbWF4SGVpZ2h0ICsgcGFkZGluZzsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIGludCBsaXN0Q29udGVudCA9IG1Ecm9wRG93bkxpc3QubWVhc3VyZUhlaWdodE9mQ2hpbGRyZW4oTWVhc3VyZVNwZWMuVU5TUEVDSUZJRUQsCi0gICAgICAgICAgICAgICAgMCwgTGlzdFZpZXcuTk9fUE9TSVRJT04sIG1heEhlaWdodCAtIG90aGVySGVpZ2h0cywgMik7Ci0gICAgICAgIC8vIGFkZCBwYWRkaW5nIG9ubHkgaWYgdGhlIGxpc3QgaGFzIGl0ZW1zIGluIGl0LCB0aGF0IHdheSB3ZSBkb24ndCBzaG93Ci0gICAgICAgIC8vIHRoZSBwb3B1cCBpZiBpdCBpcyBub3QgbmVlZGVkCi0gICAgICAgIGlmIChsaXN0Q29udGVudCA+IDApIG90aGVySGVpZ2h0cyArPSBwYWRkaW5nOwotCi0gICAgICAgIHJldHVybiBsaXN0Q29udGVudCArIG90aGVySGVpZ2h0czsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFZpZXcgZ2V0SGludFZpZXcoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIGlmIChtSGludFRleHQgIT0gbnVsbCAmJiBtSGludFRleHQubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICBmaW5hbCBUZXh0VmlldyBoaW50VmlldyA9IChUZXh0VmlldykgTGF5b3V0SW5mbGF0ZXIuZnJvbShjb250ZXh0KS5pbmZsYXRlKAotICAgICAgICAgICAgICAgICAgICBtSGludFJlc291cmNlLCBudWxsKS5maW5kVmlld0J5SWQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5pZC50ZXh0MSk7Ci0gICAgICAgICAgICBoaW50Vmlldy5zZXRUZXh0KG1IaW50VGV4dCk7Ci0gICAgICAgICAgICBoaW50Vmlldy5zZXRJZChISU5UX1ZJRVdfSUQpOwotICAgICAgICAgICAgcmV0dXJuIGhpbnRWaWV3OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KICAgICB9CiAKICAgICAvKioKQEAgLTE0NDMsNDcgKzExMTMsNiBAQAogICAgICAgICByZXR1cm4gbUZpbHRlcjsKICAgICB9CiAKLSAgICBwcml2YXRlIGNsYXNzIExpc3RTZWxlY3RvckhpZGVyIGltcGxlbWVudHMgUnVubmFibGUgewotICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICBjbGVhckxpc3RTZWxlY3Rpb24oKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgUmVzaXplUG9wdXBSdW5uYWJsZSBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKLSAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgbVBvcHVwLnNldElucHV0TWV0aG9kTW9kZShQb3B1cFdpbmRvdy5JTlBVVF9NRVRIT0RfTk9UX05FRURFRCk7Ci0gICAgICAgICAgICBzaG93RHJvcERvd24oKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgUG9wdXBUb3VjaEludGVyY2VwdG9yIGltcGxlbWVudHMgT25Ub3VjaExpc3RlbmVyIHsKLSAgICAgICAgcHVibGljIGJvb2xlYW4gb25Ub3VjaChWaWV3IHYsIE1vdGlvbkV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgYWN0aW9uID0gZXZlbnQuZ2V0QWN0aW9uKCk7Ci0gICAgICAgICAgICBpZiAoYWN0aW9uID09IE1vdGlvbkV2ZW50LkFDVElPTl9ET1dOICYmCi0gICAgICAgICAgICAgICAgICAgIG1Qb3B1cCAhPSBudWxsICYmIG1Qb3B1cC5pc1Nob3dpbmcoKSkgewotICAgICAgICAgICAgICAgIHBvc3REZWxheWVkKG1SZXNpemVQb3B1cFJ1bm5hYmxlLCBFWFBBTkRfTElTVF9USU1FT1VUKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uID09IE1vdGlvbkV2ZW50LkFDVElPTl9VUCkgewotICAgICAgICAgICAgICAgIHJlbW92ZUNhbGxiYWNrcyhtUmVzaXplUG9wdXBSdW5uYWJsZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBjbGFzcyBQb3B1cFNjcm9sbExpc3RlbmVyIGltcGxlbWVudHMgTGlzdFZpZXcuT25TY3JvbGxMaXN0ZW5lciB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIG9uU2Nyb2xsKEFic0xpc3RWaWV3IHZpZXcsIGludCBmaXJzdFZpc2libGVJdGVtLCBpbnQgdmlzaWJsZUl0ZW1Db3VudCwKLSAgICAgICAgICAgICAgICBpbnQgdG90YWxJdGVtQ291bnQpIHsKLQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgb25TY3JvbGxTdGF0ZUNoYW5nZWQoQWJzTGlzdFZpZXcgdmlldywgaW50IHNjcm9sbFN0YXRlKSB7Ci0gICAgICAgICAgICBpZiAoc2Nyb2xsU3RhdGUgPT0gU0NST0xMX1NUQVRFX1RPVUNIX1NDUk9MTCAmJgotICAgICAgICAgICAgICAgICAgICAhaXNJbnB1dE1ldGhvZE5vdE5lZWRlZCgpICYmIG1Qb3B1cC5nZXRDb250ZW50VmlldygpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZW1vdmVDYWxsYmFja3MobVJlc2l6ZVBvcHVwUnVubmFibGUpOwotICAgICAgICAgICAgICAgIG1SZXNpemVQb3B1cFJ1bm5hYmxlLnJ1bigpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCiAgICAgcHJpdmF0ZSBjbGFzcyBEcm9wRG93bkl0ZW1DbGlja0xpc3RlbmVyIGltcGxlbWVudHMgQWRhcHRlclZpZXcuT25JdGVtQ2xpY2tMaXN0ZW5lciB7CiAgICAgICAgIHB1YmxpYyB2b2lkIG9uSXRlbUNsaWNrKEFkYXB0ZXJWaWV3IHBhcmVudCwgVmlldyB2LCBpbnQgcG9zaXRpb24sIGxvbmcgaWQpIHsKICAgICAgICAgICAgIHBlcmZvcm1Db21wbGV0aW9uKHYsIHBvc2l0aW9uLCBpZCk7CkBAIC0xNDkxLDEyMyArMTEyMCw2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogPHA+V3JhcHBlciBjbGFzcyBmb3IgYSBMaXN0Vmlldy4gVGhpcyB3cmFwcGVyIGhpamFja3MgdGhlIGZvY3VzIHRvCi0gICAgICogbWFrZSBzdXJlIHRoZSBsaXN0IHVzZXMgdGhlIGFwcHJvcHJpYXRlIGRyYXdhYmxlcyBhbmQgc3RhdGVzIHdoZW4KLSAgICAgKiBkaXNwbGF5ZWQgb24gc2NyZWVuIHdpdGhpbiBhIGRyb3AgZG93bi4gVGhlIGZvY3VzIGlzIG5ldmVyIGFjdHVhbGx5Ci0gICAgICogcGFzc2VkIHRvIHRoZSBkcm9wIGRvd247IHRoZSBsaXN0IG9ubHkgbG9va3MgZm9jdXNlZC48L3A+Ci0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRHJvcERvd25MaXN0VmlldyBleHRlbmRzIExpc3RWaWV3IHsKLSAgICAgICAgLyoKLSAgICAgICAgICogV0FSTklORzogVGhpcyBpcyBhIHdvcmthcm91bmQgZm9yIGEgdG91Y2ggbW9kZSBpc3N1ZS4KLSAgICAgICAgICoKLSAgICAgICAgICogVG91Y2ggbW9kZSBpcyBwcm9wYWdhdGVkIGxhemlseSB0byB3aW5kb3dzLiBUaGlzIGNhdXNlcyBwcm9ibGVtcyBpbgotICAgICAgICAgKiB0aGUgZm9sbG93aW5nIHNjZW5hcmlvOgotICAgICAgICAgKiAtIFR5cGUgc29tZXRoaW5nIGluIHRoZSBBdXRvQ29tcGxldGVUZXh0VmlldyBhbmQgZ2V0IHNvbWUgcmVzdWx0cwotICAgICAgICAgKiAtIE1vdmUgZG93biB3aXRoIHRoZSBkLXBhZCB0byBzZWxlY3QgYW4gaXRlbSBpbiB0aGUgbGlzdAotICAgICAgICAgKiAtIE1vdmUgdXAgd2l0aCB0aGUgZC1wYWQgdW50aWwgdGhlIHNlbGVjdGlvbiBkaXNhcHBlYXJzCi0gICAgICAgICAqIC0gVHlwZSBtb3JlIHRleHQgaW4gdGhlIEF1dG9Db21wbGV0ZVRleHRWaWV3ICp1c2luZyB0aGUgc29mdCBrZXlib2FyZCoKLSAgICAgICAgICogICBhbmQgZ2V0IG5ldyByZXN1bHRzOyB5b3UgYXJlIG5vdyBpbiB0b3VjaCBtb2RlCi0gICAgICAgICAqIC0gVGhlIHNlbGVjdGlvbiBjb21lcyBiYWNrIG9uIHRoZSBmaXJzdCBpdGVtIGluIHRoZSBsaXN0LCBldmVuIHRob3VnaAotICAgICAgICAgKiAgIHRoZSBsaXN0IGlzIHN1cHBvc2VkIHRvIGJlIGluIHRvdWNoIG1vZGUKLSAgICAgICAgICoKLSAgICAgICAgICogVXNpbmcgdGhlIHNvZnQga2V5Ym9hcmQgdHJpZ2dlcnMgdGhlIHRvdWNoIG1vZGUgY2hhbmdlIGJ1dCB0aGF0IGNoYW5nZQotICAgICAgICAgKiBpcyBwcm9wYWdhdGVkIHRvIG91ciB3aW5kb3cgb25seSBhZnRlciB0aGUgZmlyc3QgbGlzdCBsYXlvdXQsIHRoZXJlZm9yZQotICAgICAgICAgKiBhZnRlciB0aGUgbGlzdCBhdHRlbXB0cyB0byByZXN1cnJlY3QgdGhlIHNlbGVjdGlvbi4KLSAgICAgICAgICoKLSAgICAgICAgICogVGhlIHRyaWNrIHRvIHdvcmsgYXJvdW5kIHRoaXMgaXNzdWUgaXMgdG8gcHJldGVuZCB0aGUgbGlzdCBpcyBpbiB0b3VjaAotICAgICAgICAgKiBtb2RlIHdoZW4gd2Uga25vdyB0aGF0IHRoZSBzZWxlY3Rpb24gc2hvdWxkIG5vdCBhcHBlYXIsIHRoYXQgaXMgd2hlbgotICAgICAgICAgKiB3ZSBrbm93IHRoZSB1c2VyIG1vdmVkIHRoZSBzZWxlY3Rpb24gYXdheSBmcm9tIHRoZSBsaXN0LgotICAgICAgICAgKgotICAgICAgICAgKiBUaGlzIGJvb2xlYW4gaXMgc2V0IHRvIHRydWUgd2hlbmV2ZXIgd2UgZXhwbGljaXRlbHkgaGlkZSB0aGUgbGlzdCdzCi0gICAgICAgICAqIHNlbGVjdGlvbiBhbmQgcmVzZXQgdG8gZmFsc2Ugd2hlbnZlciB3ZSBrbm93IHRoZSB1c2VyIG1vdmVkIHRoZQotICAgICAgICAgKiBzZWxlY3Rpb24gYmFjayB0byB0aGUgbGlzdC4KLSAgICAgICAgICoKLSAgICAgICAgICogV2hlbiB0aGlzIGJvb2xlYW4gaXMgdHJ1ZSwgaXNJblRvdWNoTW9kZSgpIHJldHVybnMgdHJ1ZSwgb3RoZXJ3aXNlIGl0Ci0gICAgICAgICAqIHJldHVybnMgc3VwZXIuaXNJblRvdWNoTW9kZSgpLgotICAgICAgICAgKi8KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1MaXN0U2VsZWN0aW9uSGlkZGVuOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiA8cD5DcmVhdGVzIGEgbmV3IGxpc3QgdmlldyB3cmFwcGVyLjwvcD4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGNvbnRleHQgdGhpcyB2aWV3J3MgY29udGV4dAotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIERyb3BEb3duTGlzdFZpZXcoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgICAgICBzdXBlcihjb250ZXh0LCBudWxsLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmF0dHIuZHJvcERvd25MaXN0Vmlld1N0eWxlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiA8cD5Bdm9pZHMgamFycmluZyBzY3JvbGxpbmcgZWZmZWN0IGJ5IGVuc3VyaW5nIHRoYXQgbGlzdCBlbGVtZW50cwotICAgICAgICAgKiBtYWRlIG9mIGEgdGV4dCB2aWV3IGZpdCBvbiBhIHNpbmdsZSBsaW5lLjwvcD4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHBvc2l0aW9uIHRoZSBpdGVtIGluZGV4IGluIHRoZSBsaXN0IHRvIGdldCBhIHZpZXcgZm9yCi0gICAgICAgICAqIEByZXR1cm4gdGhlIHZpZXcgZm9yIHRoZSBzcGVjaWZpZWQgaXRlbQotICAgICAgICAgKi8KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIFZpZXcgb2J0YWluVmlldyhpbnQgcG9zaXRpb24sIGJvb2xlYW5bXSBpc1NjcmFwKSB7Ci0gICAgICAgICAgICBWaWV3IHZpZXcgPSBzdXBlci5vYnRhaW5WaWV3KHBvc2l0aW9uLCBpc1NjcmFwKTsKLQotICAgICAgICAgICAgaWYgKHZpZXcgaW5zdGFuY2VvZiBUZXh0VmlldykgewotICAgICAgICAgICAgICAgICgoVGV4dFZpZXcpIHZpZXcpLnNldEhvcml6b250YWxseVNjcm9sbGluZyh0cnVlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIHZpZXc7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNJblRvdWNoTW9kZSgpIHsKLSAgICAgICAgICAgIC8vIFdBUk5JTkc6IFBsZWFzZSByZWFkIHRoZSBjb21tZW50IHdoZXJlIG1MaXN0U2VsZWN0aW9uSGlkZGVuIGlzIGRlY2xhcmVkCi0gICAgICAgICAgICByZXR1cm4gbUxpc3RTZWxlY3Rpb25IaWRkZW4gfHwgc3VwZXIuaXNJblRvdWNoTW9kZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIDxwPlJldHVybnMgdGhlIGZvY3VzIHN0YXRlIGluIHRoZSBkcm9wIGRvd24uPC9wPgotICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuIHRydWUgYWx3YXlzCi0gICAgICAgICAqLwotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzV2luZG93Rm9jdXMoKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiA8cD5SZXR1cm5zIHRoZSBmb2N1cyBzdGF0ZSBpbiB0aGUgZHJvcCBkb3duLjwvcD4KLSAgICAgICAgICoKLSAgICAgICAgICogQHJldHVybiB0cnVlIGFsd2F5cwotICAgICAgICAgKi8KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzRm9jdXNlZCgpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIDxwPlJldHVybnMgdGhlIGZvY3VzIHN0YXRlIGluIHRoZSBkcm9wIGRvd24uPC9wPgotICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuIHRydWUgYWx3YXlzCi0gICAgICAgICAqLwotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzRm9jdXMoKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHJvdGVjdGVkIGludFtdIG9uQ3JlYXRlRHJhd2FibGVTdGF0ZShpbnQgZXh0cmFTcGFjZSkgewotICAgICAgICAgICAgaW50W10gcmVzID0gc3VwZXIub25DcmVhdGVEcmF3YWJsZVN0YXRlKGV4dHJhU3BhY2UpOwotICAgICAgICAgICAgLy9ub2luc3BlY3Rpb24gQ29uc3RhbnRJZlN0YXRlbWVudAotICAgICAgICAgICAgaWYgKGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCJDcmVhdGVkIGRyYXdhYmxlIHN0YXRlOiBbIik7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPHJlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoaSA+IDApIHNiLmFwcGVuZCgiLCAiKTsKLSAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIweCIpOwotICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoSW50ZWdlci50b0hleFN0cmluZyhyZXNbaV0pKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKCJdIik7Ci0gICAgICAgICAgICAgICAgTG9nLmkoVEFHLCBzYi50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiByZXM7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKICAgICAgKiBUaGlzIGludGVyZmFjZSBpcyB1c2VkIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSB0ZXh0IGVudGVyZWQgaW4gdGhpcyBUZXh0VmlldyBjb21wbGllcyB0bwogICAgICAqIGEgY2VydGFpbiBmb3JtYXQuICBTaW5jZSB0aGVyZSBpcyBubyBmb29scHJvb2Ygd2F5IHRvIHByZXZlbnQgdGhlIHVzZXIgZnJvbSBsZWF2aW5nCiAgICAgICogdGhpcyBWaWV3IHdpdGggYW4gaW5jb3JyZWN0IHZhbHVlIGluIGl0LCBhbGwgd2UgY2FuIGRvIGlzIHRyeSB0byBmaXggaXQgb3Vyc2VsdmVzCkBAIC0xNjU1LDEwICsxMTY3LDcgQEAKICAgICBwcml2YXRlIGNsYXNzIFBvcHVwRGF0YVNldE9ic2VydmVyIGV4dGVuZHMgRGF0YVNldE9ic2VydmVyIHsKICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2hhbmdlZCgpIHsKLSAgICAgICAgICAgIGlmIChpc1BvcHVwU2hvd2luZygpKSB7Ci0gICAgICAgICAgICAgICAgLy8gVGhpcyB3aWxsIHJlc2l6ZSB0aGUgcG9wdXAgdG8gZml0IHRoZSBuZXcgYWRhcHRlcidzIGNvbnRlbnQKLSAgICAgICAgICAgICAgICBzaG93RHJvcERvd24oKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobUFkYXB0ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKG1BZGFwdGVyICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgcG9wdXAgaXMgbm90IHNob3dpbmcgYWxyZWFkeSwgc2hvd2luZyBpdCB3aWxsIGNhdXNlCiAgICAgICAgICAgICAgICAgLy8gdGhlIGxpc3Qgb2YgZGF0YSBzZXQgb2JzZXJ2ZXJzIGF0dGFjaGVkIHRvIHRoZSBhZGFwdGVyIHRvCiAgICAgICAgICAgICAgICAgLy8gY2hhbmdlLiBXZSBjYW4ndCBkbyBpdCBmcm9tIGhlcmUsIGJlY2F1c2Ugd2UgYXJlIGluIHRoZSBtaWRkbGUKQEAgLTE2NzMsMTQgKzExODIsNSBAQAogICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uSW52YWxpZGF0ZWQoKSB7Ci0gICAgICAgICAgICBpZiAoIW1Ecm9wRG93bkFsd2F5c1Zpc2libGUpIHsKLSAgICAgICAgICAgICAgICAvLyBUaGVyZSdzIG5vIGRhdGEgdG8gZGlzcGxheSBzbyBtYWtlIHN1cmUgd2UncmUgbm90IHNob3dpbmcKLSAgICAgICAgICAgICAgICAvLyB0aGUgZHJvcCBkb3duIGFuZCBpdHMgbGlzdAotICAgICAgICAgICAgICAgIGRpc21pc3NEcm9wRG93bigpOwotICAgICAgICAgICAgfQotICAgICAgICB9CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0N1cnNvckFkYXB0ZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9DdXJzb3JBZGFwdGVyLmphdmEKaW5kZXggYmFhNjgzMy4uNGNmODc4NSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0N1cnNvckFkYXB0ZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvQ3Vyc29yQWRhcHRlci5qYXZhCkBAIC04MCw2ICs4MCwxOCBAQAogICAgIHByb3RlY3RlZCBGaWx0ZXJRdWVyeVByb3ZpZGVyIG1GaWx0ZXJRdWVyeVByb3ZpZGVyOwogCiAgICAgLyoqCisgICAgICogSWYgc2V0IHRoZSBhZGFwdGVyIHdpbGwgY2FsbCByZXF1ZXJ5KCkgb24gdGhlIGN1cnNvciB3aGVuZXZlciBhIGNvbnRlbnQgY2hhbmdlCisgICAgICogbm90aWZpY2F0aW9uIGlzIGRlbGl2ZXJlZC4gSW1wbGllcyB7QGxpbmsgI0ZMQUdfUkVHSVNURVJfQ09OVEVOVF9PQlNFUlZFUn0KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX0FVVE9fUkVRVUVSWSA9IDB4MDE7CisKKyAgICAvKioKKyAgICAgKiBJZiBzZXQgdGhlIGFkYXB0ZXIgd2lsbCByZWdpc3RlciBhIGNvbnRlbnQgb2JzZXJ2ZXIgb24gdGhlIGN1cnNvciBhbmQgd2lsbCBjYWxsCisgICAgICoge0BsaW5rICNvbkNvbnRlbnRDaGFuZ2VkKCl9IHdoZW4gYSBub3RpZmljYXRpb24gY29tZXMgaW4uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19SRUdJU1RFUl9DT05URU5UX09CU0VSVkVSID0gMHgwMjsKKworICAgIC8qKgogICAgICAqIENvbnN0cnVjdG9yLiBUaGUgYWRhcHRlciB3aWxsIGNhbGwgcmVxdWVyeSgpIG9uIHRoZSBjdXJzb3Igd2hlbmV2ZXIKICAgICAgKiBpdCBjaGFuZ2VzIHNvIHRoYXQgdGhlIG1vc3QgcmVjZW50IGRhdGEgaXMgYWx3YXlzIGRpc3BsYXllZC4KICAgICAgKgpAQCAtODcsNyArOTksNyBAQAogICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0CiAgICAgICovCiAgICAgcHVibGljIEN1cnNvckFkYXB0ZXIoQ29udGV4dCBjb250ZXh0LCBDdXJzb3IgYykgewotICAgICAgICBpbml0KGNvbnRleHQsIGMsIHRydWUpOworICAgICAgICBpbml0KGNvbnRleHQsIGMsIEZMQUdfQVVUT19SRVFVRVJZKTsKICAgICB9CiAKICAgICAvKioKQEAgLTk5LDE5ICsxMTEsNDMgQEAKICAgICAgKiAgICAgICAgICAgICAgICAgICAgZGF0YSBpcyBhbHdheXMgZGlzcGxheWVkLgogICAgICAqLwogICAgIHB1YmxpYyBDdXJzb3JBZGFwdGVyKENvbnRleHQgY29udGV4dCwgQ3Vyc29yIGMsIGJvb2xlYW4gYXV0b1JlcXVlcnkpIHsKLSAgICAgICAgaW5pdChjb250ZXh0LCBjLCBhdXRvUmVxdWVyeSk7CisgICAgICAgIGluaXQoY29udGV4dCwgYywgYXV0b1JlcXVlcnkgPyBGTEFHX0FVVE9fUkVRVUVSWSA6IEZMQUdfUkVHSVNURVJfQ09OVEVOVF9PQlNFUlZFUik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IKKyAgICAgKiBAcGFyYW0gYyBUaGUgY3Vyc29yIGZyb20gd2hpY2ggdG8gZ2V0IHRoZSBkYXRhLgorICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0CisgICAgICogQHBhcmFtIGZsYWdzIGZsYWdzIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBiZWhhdmlvciBvZiB0aGUgYWRhcHRlcgorICAgICAqLworICAgIHB1YmxpYyBDdXJzb3JBZGFwdGVyKENvbnRleHQgY29udGV4dCwgQ3Vyc29yIGMsIGludCBmbGFncykgeworICAgICAgICBpbml0KGNvbnRleHQsIGMsIGZsYWdzKTsKICAgICB9CiAKICAgICBwcm90ZWN0ZWQgdm9pZCBpbml0KENvbnRleHQgY29udGV4dCwgQ3Vyc29yIGMsIGJvb2xlYW4gYXV0b1JlcXVlcnkpIHsKKyAgICAgICAgaW5pdChjb250ZXh0LCBjLCBhdXRvUmVxdWVyeSA/IEZMQUdfQVVUT19SRVFVRVJZIDogRkxBR19SRUdJU1RFUl9DT05URU5UX09CU0VSVkVSKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBpbml0KENvbnRleHQgY29udGV4dCwgQ3Vyc29yIGMsIGludCBmbGFncykgeworICAgICAgICBpZiAoKGZsYWdzICYgRkxBR19BVVRPX1JFUVVFUlkpID09IEZMQUdfQVVUT19SRVFVRVJZKSB7CisgICAgICAgICAgICBmbGFncyB8PSBGTEFHX1JFR0lTVEVSX0NPTlRFTlRfT0JTRVJWRVI7CisgICAgICAgICAgICBtQXV0b1JlcXVlcnkgPSB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUF1dG9SZXF1ZXJ5ID0gZmFsc2U7CisgICAgICAgIH0KICAgICAgICAgYm9vbGVhbiBjdXJzb3JQcmVzZW50ID0gYyAhPSBudWxsOwotICAgICAgICBtQXV0b1JlcXVlcnkgPSBhdXRvUmVxdWVyeTsKICAgICAgICAgbUN1cnNvciA9IGM7CiAgICAgICAgIG1EYXRhVmFsaWQgPSBjdXJzb3JQcmVzZW50OwogICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CiAgICAgICAgIG1Sb3dJRENvbHVtbiA9IGN1cnNvclByZXNlbnQgPyBjLmdldENvbHVtbkluZGV4T3JUaHJvdygiX2lkIikgOiAtMTsKLSAgICAgICAgbUNoYW5nZU9ic2VydmVyID0gbmV3IENoYW5nZU9ic2VydmVyKCk7CisgICAgICAgIGlmICgoZmxhZ3MgJiBGTEFHX1JFR0lTVEVSX0NPTlRFTlRfT0JTRVJWRVIpID09IEZMQUdfUkVHSVNURVJfQ09OVEVOVF9PQlNFUlZFUikgeworICAgICAgICAgICAgbUNoYW5nZU9ic2VydmVyID0gbmV3IENoYW5nZU9ic2VydmVyKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtQ2hhbmdlT2JzZXJ2ZXIgPSBudWxsOworICAgICAgICB9CisKICAgICAgICAgaWYgKGN1cnNvclByZXNlbnQpIHsKLSAgICAgICAgICAgIGMucmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIobUNoYW5nZU9ic2VydmVyKTsKKyAgICAgICAgICAgIGlmIChtQ2hhbmdlT2JzZXJ2ZXIgIT0gbnVsbCkgYy5yZWdpc3RlckNvbnRlbnRPYnNlcnZlcihtQ2hhbmdlT2JzZXJ2ZXIpOwogICAgICAgICAgICAgYy5yZWdpc3RlckRhdGFTZXRPYnNlcnZlcihtRGF0YVNldE9ic2VydmVyKTsKICAgICAgICAgfQogICAgIH0KQEAgLTI0NiwxMyArMjgyLDEzIEBACiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICAgICAgaWYgKG1DdXJzb3IgIT0gbnVsbCkgewotICAgICAgICAgICAgbUN1cnNvci51bnJlZ2lzdGVyQ29udGVudE9ic2VydmVyKG1DaGFuZ2VPYnNlcnZlcik7CisgICAgICAgICAgICBpZiAobUNoYW5nZU9ic2VydmVyICE9IG51bGwpIG1DdXJzb3IudW5yZWdpc3RlckNvbnRlbnRPYnNlcnZlcihtQ2hhbmdlT2JzZXJ2ZXIpOwogICAgICAgICAgICAgbUN1cnNvci51bnJlZ2lzdGVyRGF0YVNldE9ic2VydmVyKG1EYXRhU2V0T2JzZXJ2ZXIpOwogICAgICAgICAgICAgbUN1cnNvci5jbG9zZSgpOwogICAgICAgICB9CiAgICAgICAgIG1DdXJzb3IgPSBjdXJzb3I7CiAgICAgICAgIGlmIChjdXJzb3IgIT0gbnVsbCkgewotICAgICAgICAgICAgY3Vyc29yLnJlZ2lzdGVyQ29udGVudE9ic2VydmVyKG1DaGFuZ2VPYnNlcnZlcik7CisgICAgICAgICAgICBpZiAobUNoYW5nZU9ic2VydmVyICE9IG51bGwpIGN1cnNvci5yZWdpc3RlckNvbnRlbnRPYnNlcnZlcihtQ2hhbmdlT2JzZXJ2ZXIpOwogICAgICAgICAgICAgY3Vyc29yLnJlZ2lzdGVyRGF0YVNldE9ic2VydmVyKG1EYXRhU2V0T2JzZXJ2ZXIpOwogICAgICAgICAgICAgbVJvd0lEQ29sdW1uID0gY3Vyc29yLmdldENvbHVtbkluZGV4T3JUaHJvdygiX2lkIik7CiAgICAgICAgICAgICBtRGF0YVZhbGlkID0gdHJ1ZTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9GcmFtZUxheW91dC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0ZyYW1lTGF5b3V0LmphdmEKaW5kZXggZTQ0NTE4MC4uNTU5YTVmZSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0ZyYW1lTGF5b3V0LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0ZyYW1lTGF5b3V0LmphdmEKQEAgLTMyLDggKzMyLDggQEAKIAogLyoqCiAgKiBGcmFtZUxheW91dCBpcyBkZXNpZ25lZCB0byBibG9jayBvdXQgYW4gYXJlYSBvbiB0aGUgc2NyZWVuIHRvIGRpc3BsYXkKLSAqIGEgc2luZ2xlIGl0ZW0uIFlvdSBjYW4gYWRkIG11bHRpcGxlIGNoaWxkcmVuIHRvIGEgRnJhbWVMYXlvdXQsIGJ1dCBhbGwKLSAqIGNoaWxkcmVuIGFyZSBwZWdnZWQgdG8gdGhlIHRvcCBsZWZ0IG9mIHRoZSBzY3JlZW4uCisgKiBhIHNpbmdsZSBpdGVtLiBZb3UgY2FuIGFkZCBtdWx0aXBsZSBjaGlsZHJlbiB0byBhIEZyYW1lTGF5b3V0IGFuZCBjb250cm9sIHRoZWlyCisgKiBwb3NpdGlvbiB3aXRoaW4gdGhlIEZyYW1lTGF5b3V0IHVzaW5nIHtAbGluayBhbmRyb2lkLndpZGdldC5GcmFtZUxheW91dC5MYXlvdXRQYXJhbXMjZ3Jhdml0eX0uCiAgKiBDaGlsZHJlbiBhcmUgZHJhd24gaW4gYSBzdGFjaywgd2l0aCB0aGUgbW9zdCByZWNlbnRseSBhZGRlZCBjaGlsZCBvbiB0b3AuCiAgKiBUaGUgc2l6ZSBvZiB0aGUgZnJhbWUgbGF5b3V0IGlzIHRoZSBzaXplIG9mIGl0cyBsYXJnZXN0IGNoaWxkIChwbHVzIHBhZGRpbmcpLCB2aXNpYmxlCiAgKiBvciBub3QgKGlmIHRoZSBGcmFtZUxheW91dCdzIHBhcmVudCBwZXJtaXRzKS4gVmlld3MgdGhhdCBhcmUgR09ORSBhcmUgdXNlZCBmb3Igc2l6aW5nCkBAIC00NDAsNiArNDQwLDggQEAKICAgICAgKiBQZXItY2hpbGQgbGF5b3V0IGluZm9ybWF0aW9uIGZvciBsYXlvdXRzIHRoYXQgc3VwcG9ydCBtYXJnaW5zLgogICAgICAqIFNlZSB7QGxpbmsgYW5kcm9pZC5SLnN0eWxlYWJsZSNGcmFtZUxheW91dF9MYXlvdXQgRnJhbWVMYXlvdXQgTGF5b3V0IEF0dHJpYnV0ZXN9CiAgICAgICogZm9yIGEgbGlzdCBvZiBhbGwgY2hpbGQgdmlldyBhdHRyaWJ1dGVzIHRoYXQgdGhpcyBjbGFzcyBzdXBwb3J0cy4KKyAgICAgKiAKKyAgICAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNGcmFtZUxheW91dF9MYXlvdXRfbGF5b3V0X2dyYXZpdHkKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIExheW91dFBhcmFtcyBleHRlbmRzIE1hcmdpbkxheW91dFBhcmFtcyB7CiAgICAgICAgIC8qKgpAQCAtNDQ3LDYgKzQ0OSw4IEBACiAgICAgICAgICAqIGFyZSBhc3NvY2lhdGVkLgogICAgICAgICAgKgogICAgICAgICAgKiBAc2VlIGFuZHJvaWQudmlldy5HcmF2aXR5CisgICAgICAgICAqIAorICAgICAgICAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNGcmFtZUxheW91dF9MYXlvdXRfbGF5b3V0X2dyYXZpdHkKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBpbnQgZ3Jhdml0eSA9IC0xOwogCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvR2FsbGVyeS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0dhbGxlcnkuamF2YQppbmRleCBjY2QzN2QzLi45Nzg5NjU4IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvR2FsbGVyeS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9HYWxsZXJ5LmphdmEKQEAgLTEyMTAsNyArMTIxMCw3IEBACiAKICAgICAgICAgLy8gV2UgdW5mb2N1cyB0aGUgb2xkIGNoaWxkIGRvd24gaGVyZSBzbyB0aGUgYWJvdmUgaGFzRm9jdXMgY2hlY2sKICAgICAgICAgLy8gcmV0dXJucyB0cnVlCi0gICAgICAgIGlmIChvbGRTZWxlY3RlZENoaWxkICE9IG51bGwpIHsKKyAgICAgICAgaWYgKG9sZFNlbGVjdGVkQ2hpbGQgIT0gbnVsbCAmJiBvbGRTZWxlY3RlZENoaWxkICE9IGNoaWxkKSB7CiAKICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSBpdHMgZHJhd2FibGUgc3RhdGUgZG9lc24ndCBjb250YWluICdzZWxlY3RlZCcKICAgICAgICAgICAgIG9sZFNlbGVjdGVkQ2hpbGQuc2V0U2VsZWN0ZWQoZmFsc2UpOwpAQCAtMTI2Niw2ICsxMjY2LDcgQEAKICAgICAgICAgICovCiAgICAgICAgIGlmIChnYWluRm9jdXMgJiYgbVNlbGVjdGVkQ2hpbGQgIT0gbnVsbCkgewogICAgICAgICAgICAgbVNlbGVjdGVkQ2hpbGQucmVxdWVzdEZvY3VzKGRpcmVjdGlvbik7CisgICAgICAgICAgICBtU2VsZWN0ZWRDaGlsZC5zZXRTZWxlY3RlZCh0cnVlKTsKICAgICAgICAgfQogCiAgICAgfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0dyaWRWaWV3LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvR3JpZFZpZXcuamF2YQppbmRleCAyZjg2ZDc1Li5kZmZlNjg1IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvR3JpZFZpZXcuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvR3JpZFZpZXcuamF2YQpAQCAtMTcsMTUgKzE3LDE4IEBACiBwYWNrYWdlIGFuZHJvaWQud2lkZ2V0OwogCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OwogaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3LkdyYXZpdHk7CiBpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlNvdW5kRWZmZWN0Q29uc3RhbnRzOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3RGVidWc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkdyaWRMYXlvdXRBbmltYXRpb25Db250cm9sbGVyOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlJlbW90ZVZpZXdzLlJlbW90ZVZpZXc7CiAKIAogLyoqCkBAIC0zNSw2ICszOCw3IEBACiAgKiA8cD5TZWUgdGhlIDxhIGhyZWY9IntAZG9jUm9vdH1yZXNvdXJjZXMvdHV0b3JpYWxzL3ZpZXdzL2hlbGxvLWdyaWR2aWV3Lmh0bWwiPkdyaWQKICAqIFZpZXcgdHV0b3JpYWw8L2E+LjwvcD4KICAqLworQFJlbW90ZVZpZXcKIHB1YmxpYyBjbGFzcyBHcmlkVmlldyBleHRlbmRzIEFic0xpc3RWaWV3IHsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT19TVFJFVENIID0gMDsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVFJFVENIX1NQQUNJTkcgPSAxOwpAQCAtMTAzLDE5ICsxMDcsNDkgQEAKICAgICAgICAgYS5yZWN5Y2xlKCk7CiAgICAgfQogCisgICAgLyoqCisgICAgICogU2V0IGhvdyB0aGUgdXNlciBtYXkgc2VsZWN0IGl0ZW1zIGZyb20gdGhlIGdyaWQuCisgICAgICoKKyAgICAgKiA8cD5HcmlkVmlldyBvbmx5IHN1cHBvcnRzIHtAbGluayBBYnNMaXN0VmlldyNDSE9JQ0VfTU9ERV9OT05FfSBhbmQKKyAgICAgKiB7QGxpbmsgQWJzTGlzdFZpZXcjQ0hPSUNFX01PREVfTVVMVElQTEVfTU9EQUx9LiBBdHRlbXB0aW5nIHRvIHNldCBhbiB1bnN1cHBvcnRlZCBjaG9pY2UKKyAgICAgKiBtb2RlIHdpbGwgdGhyb3cgYW4gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24uCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0Q2hvaWNlTW9kZShpbnQgY2hvaWNlTW9kZSkgeworICAgICAgICBzd2l0Y2ggKGNob2ljZU1vZGUpIHsKKyAgICAgICAgY2FzZSBDSE9JQ0VfTU9ERV9OT05FOgorICAgICAgICBjYXNlIENIT0lDRV9NT0RFX01VTFRJUExFX01PREFMOgorICAgICAgICAgICAgc3VwZXIuc2V0Q2hvaWNlTW9kZShjaG9pY2VNb2RlKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlVuc3VwcG9ydGVkIGNob2ljZSBtb2RlICIgKyBjaG9pY2VNb2RlKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBMaXN0QWRhcHRlciBnZXRBZGFwdGVyKCkgewogICAgICAgICByZXR1cm4gbUFkYXB0ZXI7CiAgICAgfQogCiAgICAgLyoqCisgICAgICogU2V0cyB1cCB0aGlzIEFic0xpc3RWaWV3IHRvIHVzZSBhIHJlbW90ZSB2aWV3cyBhZGFwdGVyIHdoaWNoIGNvbm5lY3RzIHRvIGEgUmVtb3RlVmlld3NTZXJ2aWNlCisgICAgICogdGhyb3VnaCB0aGUgc3BlY2lmaWVkIGludGVudC4KKyAgICAgKiBAcGFyYW0gaW50ZW50IHRoZSBpbnRlbnQgdXNlZCB0byBpZGVudGlmeSB0aGUgUmVtb3RlVmlld3NTZXJ2aWNlIGZvciB0aGUgYWRhcHRlciB0byBjb25uZWN0IHRvLgorICAgICAqLworICAgIEBhbmRyb2lkLnZpZXcuUmVtb3RhYmxlVmlld01ldGhvZAorICAgIHB1YmxpYyB2b2lkIHNldFJlbW90ZVZpZXdzQWRhcHRlcihJbnRlbnQgaW50ZW50KSB7CisgICAgICAgIHN1cGVyLnNldFJlbW90ZVZpZXdzQWRhcHRlcihpbnRlbnQpOworICAgIH0KKworICAgIC8qKgogICAgICAqIFNldHMgdGhlIGRhdGEgYmVoaW5kIHRoaXMgR3JpZFZpZXcuCiAgICAgICoKICAgICAgKiBAcGFyYW0gYWRhcHRlciB0aGUgYWRhcHRlciBwcm92aWRpbmcgdGhlIGdyaWQncyBkYXRhCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2V0QWRhcHRlcihMaXN0QWRhcHRlciBhZGFwdGVyKSB7Ci0gICAgICAgIGlmIChudWxsICE9IG1BZGFwdGVyKSB7CisgICAgICAgIGlmIChtQWRhcHRlciAhPSBudWxsICYmIG1EYXRhU2V0T2JzZXJ2ZXIgIT0gbnVsbCkgewogICAgICAgICAgICAgbUFkYXB0ZXIudW5yZWdpc3RlckRhdGFTZXRPYnNlcnZlcihtRGF0YVNldE9ic2VydmVyKTsKICAgICAgICAgfQogCkBAIC0xMjUsNyArMTU5LDEwIEBACiAKICAgICAgICAgbU9sZFNlbGVjdGVkUG9zaXRpb24gPSBJTlZBTElEX1BPU0lUSU9OOwogICAgICAgICBtT2xkU2VsZWN0ZWRSb3dJZCA9IElOVkFMSURfUk9XX0lEOwotICAgICAgICAKKworICAgICAgICAvLyBBYnNMaXN0VmlldyNzZXRBZGFwdGVyIHdpbGwgdXBkYXRlIGNob2ljZSBtb2RlIHN0YXRlcy4KKyAgICAgICAgc3VwZXIuc2V0QWRhcHRlcihhZGFwdGVyKTsKKwogICAgICAgICBpZiAobUFkYXB0ZXIgIT0gbnVsbCkgewogICAgICAgICAgICAgbU9sZEl0ZW1Db3VudCA9IG1JdGVtQ291bnQ7CiAgICAgICAgICAgICBtSXRlbUNvdW50ID0gbUFkYXB0ZXIuZ2V0Q291bnQoKTsKQEAgLTc0Miw2ICs3NzksMjYgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBTbW9vdGhseSBzY3JvbGwgdG8gdGhlIHNwZWNpZmllZCBhZGFwdGVyIHBvc2l0aW9uLiBUaGUgdmlldyB3aWxsCisgICAgICogc2Nyb2xsIHN1Y2ggdGhhdCB0aGUgaW5kaWNhdGVkIHBvc2l0aW9uIGlzIGRpc3BsYXllZC4KKyAgICAgKiBAcGFyYW0gcG9zaXRpb24gU2Nyb2xsIHRvIHRoaXMgYWRhcHRlciBwb3NpdGlvbi4KKyAgICAgKi8KKyAgICBAYW5kcm9pZC52aWV3LlJlbW90YWJsZVZpZXdNZXRob2QKKyAgICBwdWJsaWMgdm9pZCBzbW9vdGhTY3JvbGxUb1Bvc2l0aW9uKGludCBwb3NpdGlvbikgeworICAgICAgICBzdXBlci5zbW9vdGhTY3JvbGxUb1Bvc2l0aW9uKHBvc2l0aW9uKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTbW9vdGhseSBzY3JvbGwgdG8gdGhlIHNwZWNpZmllZCBhZGFwdGVyIHBvc2l0aW9uIG9mZnNldC4gVGhlIHZpZXcgd2lsbAorICAgICAqIHNjcm9sbCBzdWNoIHRoYXQgdGhlIGluZGljYXRlZCBwb3NpdGlvbiBpcyBkaXNwbGF5ZWQuCisgICAgICogQHBhcmFtIG9mZnNldCBUaGUgYW1vdW50IHRvIG9mZnNldCBmcm9tIHRoZSBhZGFwdGVyIHBvc2l0aW9uIHRvIHNjcm9sbCB0by4KKyAgICAgKi8KKyAgICBAYW5kcm9pZC52aWV3LlJlbW90YWJsZVZpZXdNZXRob2QKKyAgICBwdWJsaWMgdm9pZCBzbW9vdGhTY3JvbGxCeU9mZnNldChpbnQgb2Zmc2V0KSB7CisgICAgICAgIHN1cGVyLnNtb290aFNjcm9sbEJ5T2Zmc2V0KG9mZnNldCk7CisgICAgfQorCisgICAgLyoqCiAgICAgICogRmlsbHMgdGhlIGdyaWQgYmFzZWQgb24gcG9zaXRpb25pbmcgdGhlIG5ldyBzZWxlY3Rpb24gcmVsYXRpdmUgdG8gdGhlIG9sZAogICAgICAqIHNlbGVjdGlvbi4gVGhlIG5ldyBzZWxlY3Rpb24gd2lsbCBiZSBwbGFjZWQgYXQsIGFib3ZlLCBvciBiZWxvdyB0aGUKICAgICAgKiBsb2NhdGlvbiBvZiB0aGUgbmV3IHNlbGVjdGlvbiBkZXBlbmRpbmcgb24gaG93IHRoZSBzZWxlY3Rpb24gaXMgbW92aW5nLgpAQCAtMTI4MSw2ICsxMzM4LDEyIEBACiAgICAgICAgICAgICBjaGlsZC5zZXRQcmVzc2VkKGlzUHJlc3NlZCk7CiAgICAgICAgIH0KIAorICAgICAgICBpZiAobUNob2ljZU1vZGUgIT0gQ0hPSUNFX01PREVfTk9ORSAmJiBtQ2hlY2tTdGF0ZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgQ2hlY2thYmxlKSB7CisgICAgICAgICAgICAgICAgKChDaGVja2FibGUpIGNoaWxkKS5zZXRDaGVja2VkKG1DaGVja1N0YXRlcy5nZXQocG9zaXRpb24pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCiAgICAgICAgIGlmIChuZWVkVG9NZWFzdXJlKSB7CiAgICAgICAgICAgICBpbnQgY2hpbGRIZWlnaHRTcGVjID0gVmlld0dyb3VwLmdldENoaWxkTWVhc3VyZVNwZWMoCiAgICAgICAgICAgICAgICAgICAgIE1lYXN1cmVTcGVjLm1ha2VNZWFzdXJlU3BlYygwLCBNZWFzdXJlU3BlYy5VTlNQRUNJRklFRCksIDAsIHAuaGVpZ2h0KTsKQEAgLTE0OTEsOSArMTU1NCw5IEBACiAgICAgICAgIGludCBuZXh0UGFnZSA9IC0xOwogCiAgICAgICAgIGlmIChkaXJlY3Rpb24gPT0gRk9DVVNfVVApIHsKLSAgICAgICAgICAgIG5leHRQYWdlID0gTWF0aC5tYXgoMCwgbVNlbGVjdGVkUG9zaXRpb24gLSBnZXRDaGlsZENvdW50KCkgLSAxKTsKKyAgICAgICAgICAgIG5leHRQYWdlID0gTWF0aC5tYXgoMCwgbVNlbGVjdGVkUG9zaXRpb24gLSBnZXRDaGlsZENvdW50KCkpOwogICAgICAgICB9IGVsc2UgaWYgKGRpcmVjdGlvbiA9PSBGT0NVU19ET1dOKSB7Ci0gICAgICAgICAgICBuZXh0UGFnZSA9IE1hdGgubWluKG1JdGVtQ291bnQgLSAxLCBtU2VsZWN0ZWRQb3NpdGlvbiArIGdldENoaWxkQ291bnQoKSAtIDEpOworICAgICAgICAgICAgbmV4dFBhZ2UgPSBNYXRoLm1pbihtSXRlbUNvdW50IC0gMSwgbVNlbGVjdGVkUG9zaXRpb24gKyBnZXRDaGlsZENvdW50KCkpOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKG5leHRQYWdlID49IDApIHsKQEAgLTE3NzcsNiArMTg0MCwxOSBAQAogICAgICAgICAgICAgcmVxdWVzdExheW91dElmTmVjZXNzYXJ5KCk7CiAgICAgICAgIH0KICAgICB9CisgICAgCisgICAgLyoqCisgICAgICogR2V0IHRoZSBudW1iZXIgb2YgY29sdW1ucyBpbiB0aGUgZ3JpZC4gCisgICAgICogUmV0dXJucyB7QGxpbmsgI0FVVE9fRklUfSBpZiB0aGUgR3JpZCBoYXMgbmV2ZXIgYmVlbiBsYWlkIG91dC4KKyAgICAgKgorICAgICAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0dyaWRWaWV3X251bUNvbHVtbnMKKyAgICAgKiAKKyAgICAgKiBAc2VlICNzZXROdW1Db2x1bW5zKGludCkKKyAgICAgKi8KKyAgICBAVmlld0RlYnVnLkV4cG9ydGVkUHJvcGVydHkKKyAgICBwdWJsaWMgaW50IGdldE51bUNvbHVtbnMoKSB7ICAKKyAgICAgICAgcmV0dXJuIG1OdW1Db2x1bW5zOworICAgIH0KIAogICAgIC8qKgogICAgICAqIE1ha2Ugc3VyZSB2aWV3cyBhcmUgdG91Y2hpbmcgdGhlIHRvcCBvciBib3R0b20gZWRnZSwgYXMgYXBwcm9wcmlhdGUgZm9yCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvSG9yaXpvbnRhbFNjcm9sbFZpZXcuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9Ib3Jpem9udGFsU2Nyb2xsVmlldy5qYXZhCmluZGV4IDMyYTkxNDYuLmUzMGQ0YzggMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9Ib3Jpem9udGFsU2Nyb2xsVmlldy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9Ib3Jpem9udGFsU2Nyb2xsVmlldy5qYXZhCkBAIC01Myw2ICs1Myw4IEBACiAgKiB3aXRoaW4gYSBsYXJnZXIgY29udGFpbmVyLgogICoKICAqIDxwPkhvcml6b250YWxTY3JvbGxWaWV3IG9ubHkgc3VwcG9ydHMgaG9yaXpvbnRhbCBzY3JvbGxpbmcuCisgKiAKKyAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0hvcml6b250YWxTY3JvbGxWaWV3X2ZpbGxWaWV3cG9ydCAKICAqLwogcHVibGljIGNsYXNzIEhvcml6b250YWxTY3JvbGxWaWV3IGV4dGVuZHMgRnJhbWVMYXlvdXQgewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBTklNQVRFRF9TQ1JPTExfR0FQID0gU2Nyb2xsVmlldy5BTklNQVRFRF9TQ1JPTExfR0FQOwpAQCAtMjQ4LDIwICsyNTAsMjUgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIFNjcm9sbFZpZXcncyBjb250ZW50IGlzIHN0cmV0Y2hlZCB0byBmaWxsIHRoZSB2aWV3cG9ydC4KKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIEhvcml6b250YWxTY3JvbGxWaWV3J3MgY29udGVudCBpcyBzdHJldGNoZWQgdG8KKyAgICAgKiBmaWxsIHRoZSB2aWV3cG9ydC4KICAgICAgKgogICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgY29udGVudCBmaWxscyB0aGUgdmlld3BvcnQsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKgorICAgICAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0hvcml6b250YWxTY3JvbGxWaWV3X2ZpbGxWaWV3cG9ydAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzRmlsbFZpZXdwb3J0KCkgewogICAgICAgICByZXR1cm4gbUZpbGxWaWV3cG9ydDsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBJbmRpY2F0ZXMgdGhpcyBTY3JvbGxWaWV3IHdoZXRoZXIgaXQgc2hvdWxkIHN0cmV0Y2ggaXRzIGNvbnRlbnQgd2lkdGggdG8gZmlsbAotICAgICAqIHRoZSB2aWV3cG9ydCBvciBub3QuCisgICAgICogSW5kaWNhdGVzIHRoaXMgSG9yaXpvbnRhbFNjcm9sbFZpZXcgd2hldGhlciBpdCBzaG91bGQgc3RyZXRjaCBpdHMgY29udGVudCB3aWR0aAorICAgICAqIHRvIGZpbGwgdGhlIHZpZXdwb3J0IG9yIG5vdC4KICAgICAgKgogICAgICAqIEBwYXJhbSBmaWxsVmlld3BvcnQgVHJ1ZSB0byBzdHJldGNoIHRoZSBjb250ZW50J3Mgd2lkdGggdG8gdGhlIHZpZXdwb3J0J3MKICAgICAgKiAgICAgICAgYm91bmRhcmllcywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqIAorICAgICAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0hvcml6b250YWxTY3JvbGxWaWV3X2ZpbGxWaWV3cG9ydAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldEZpbGxWaWV3cG9ydChib29sZWFuIGZpbGxWaWV3cG9ydCkgewogICAgICAgICBpZiAoZmlsbFZpZXdwb3J0ICE9IG1GaWxsVmlld3BvcnQpIHsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9MaW5lYXJMYXlvdXQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9MaW5lYXJMYXlvdXQuamF2YQppbmRleCBmYWYwODJkLi4xZTU0ODlhIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvTGluZWFyTGF5b3V0LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0xpbmVhckxheW91dC5qYXZhCkBAIC00Myw2ICs0MywxMyBAQAogICogPHA+CiAgKiBBbHNvIHNlZSB7QGxpbmsgTGluZWFyTGF5b3V0LkxheW91dFBhcmFtcyBhbmRyb2lkLndpZGdldC5MaW5lYXJMYXlvdXQuTGF5b3V0UGFyYW1zfQogICogZm9yIGxheW91dCBhdHRyaWJ1dGVzIDwvcD4KKyAqCisgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNMaW5lYXJMYXlvdXRfYmFzZWxpbmVBbGlnbmVkCisgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNMaW5lYXJMYXlvdXRfYmFzZWxpbmVBbGlnbmVkQ2hpbGRJbmRleAorICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjTGluZWFyTGF5b3V0X2dyYXZpdHkKKyAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0xpbmVhckxheW91dF9tZWFzdXJlV2l0aExhcmdlc3RDaGlsZAorICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjTGluZWFyTGF5b3V0X29yaWVudGF0aW9uCisgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNMaW5lYXJMYXlvdXRfd2VpZ2h0U3VtCiAgKi8KIEBSZW1vdGVWaWV3CiBwdWJsaWMgY2xhc3MgTGluZWFyTGF5b3V0IGV4dGVuZHMgVmlld0dyb3VwIHsKQEAgLTExNyw3ICsxMjQsMTEgQEAKICAgICB9CiAKICAgICBwdWJsaWMgTGluZWFyTGF5b3V0KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7Ci0gICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzKTsKKyAgICAgICAgdGhpcyhjb250ZXh0LCBhdHRycywgMCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBMaW5lYXJMYXlvdXQoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBkZWZTdHlsZSkgeworICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycywgZGVmU3R5bGUpOwogCiAgICAgICAgIFR5cGVkQXJyYXkgYSA9IAogICAgICAgICAgICAgY29udGV4dC5vYnRhaW5TdHlsZWRBdHRyaWJ1dGVzKGF0dHJzLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5MaW5lYXJMYXlvdXQpOwpAQCAtMTQyLDggKzE1Myw3IEBACiAgICAgICAgIG1CYXNlbGluZUFsaWduZWRDaGlsZEluZGV4ID0KICAgICAgICAgICAgICAgICBhLmdldEludChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5MaW5lYXJMYXlvdXRfYmFzZWxpbmVBbGlnbmVkQ2hpbGRJbmRleCwgLTEpOwogCi0gICAgICAgIC8vIFRPRE86IEJldHRlciBuYW1lLCBhZGQgSmF2YSBBUElzLCBtYWtlIGl0IHB1YmxpYwotICAgICAgICBtVXNlTGFyZ2VzdENoaWxkID0gYS5nZXRCb29sZWFuKFIuc3R5bGVhYmxlLkxpbmVhckxheW91dF91c2VMYXJnZXN0Q2hpbGQsIGZhbHNlKTsKKyAgICAgICAgbVVzZUxhcmdlc3RDaGlsZCA9IGEuZ2V0Qm9vbGVhbihSLnN0eWxlYWJsZS5MaW5lYXJMYXlvdXRfbWVhc3VyZVdpdGhMYXJnZXN0Q2hpbGQsIGZhbHNlKTsKIAogICAgICAgICBhLnJlY3ljbGUoKTsKICAgICB9CkBAIC0xNzIsNiArMTgyLDMzIEBACiAgICAgICAgIG1CYXNlbGluZUFsaWduZWQgPSBiYXNlbGluZUFsaWduZWQ7CiAgICAgfQogCisgICAgLyoqCisgICAgICogV2hlbiB0cnVlLCBhbGwgY2hpbGRyZW4gd2l0aCBhIHdlaWdodCB3aWxsIGJlIGNvbnNpZGVyZWQgaGF2aW5nCisgICAgICogdGhlIG1pbmltdW0gc2l6ZSBvZiB0aGUgbGFyZ2VzdCBjaGlsZC4gSWYgZmFsc2UsIGFsbCBjaGlsZHJlbiBhcmUKKyAgICAgKiBtZWFzdXJlZCBub3JtYWxseS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIFRydWUgdG8gbWVhc3VyZSBjaGlsZHJlbiB3aXRoIGEgd2VpZ2h0IHVzaW5nIHRoZSBtaW5pbXVtCisgICAgICogICAgICAgICBzaXplIG9mIHRoZSBsYXJnZXN0IGNoaWxkLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNNZWFzdXJlV2l0aExhcmdlc3RDaGlsZEVuYWJsZWQoKSB7CisgICAgICAgIHJldHVybiBtVXNlTGFyZ2VzdENoaWxkOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZW4gc2V0IHRvIHRydWUsIGFsbCBjaGlsZHJlbiB3aXRoIGEgd2VpZ2h0IHdpbGwgYmUgY29uc2lkZXJlZCBoYXZpbmcKKyAgICAgKiB0aGUgbWluaW11bSBzaXplIG9mIHRoZSBsYXJnZXN0IGNoaWxkLiBJZiBmYWxzZSwgYWxsIGNoaWxkcmVuIGFyZQorICAgICAqIG1lYXN1cmVkIG5vcm1hbGx5LgorICAgICAqIAorICAgICAqIERpc2FibGVkIGJ5IGRlZmF1bHQuCisgICAgICogCisgICAgICogQHBhcmFtIGVuYWJsZWQgVHJ1ZSB0byBtZWFzdXJlIGNoaWxkcmVuIHdpdGggYSB3ZWlnaHQgdXNpbmcgdGhlCisgICAgICogICAgICAgIG1pbmltdW0gc2l6ZSBvZiB0aGUgbGFyZ2VzdCBjaGlsZCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqLworICAgIEBhbmRyb2lkLnZpZXcuUmVtb3RhYmxlVmlld01ldGhvZAorICAgIHB1YmxpYyB2b2lkIHNldE1lYXN1cmVXaXRoTGFyZ2VzdENoaWxkRW5hYmxlZChib29sZWFuIGVuYWJsZWQpIHsKKyAgICAgICAgbVVzZUxhcmdlc3RDaGlsZCA9IGVuYWJsZWQ7CisgICAgfQorCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBnZXRCYXNlbGluZSgpIHsKICAgICAgICAgaWYgKG1CYXNlbGluZUFsaWduZWRDaGlsZEluZGV4IDwgMCkgewpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0xpc3RQb3B1cFdpbmRvdy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0xpc3RQb3B1cFdpbmRvdy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyZmYyOTIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvTGlzdFBvcHVwV2luZG93LmphdmEKQEAgLTAsMCArMSwxMjM3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLndpZGdldDsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuRGF0YVNldE9ic2VydmVyOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OworaW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3UGFyZW50OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3Lk1lYXN1cmVTcGVjOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3Lk9uVG91Y2hMaXN0ZW5lcjsKKworLyoqCisgKiBBIExpc3RQb3B1cFdpbmRvdyBhbmNob3JzIGl0c2VsZiB0byBhIGhvc3QgdmlldyBhbmQgZGlzcGxheXMgYQorICogbGlzdCBvZiBjaG9pY2VzLgorICogCisgKiA8cD5MaXN0UG9wdXBXaW5kb3cgY29udGFpbnMgYSBudW1iZXIgb2YgdHJpY2t5IGJlaGF2aW9ycyBzdXJyb3VuZGluZworICogcG9zaXRpb25pbmcsIHNjcm9sbGluZyBwYXJlbnRzIHRvIGZpdCB0aGUgZHJvcGRvd24sIGludGVyYWN0aW5nCisgKiBzYW5lbHkgd2l0aCB0aGUgSU1FIGlmIHByZXNlbnQsIGFuZCBvdGhlcnMuCisgKiAKKyAqIEBzZWUgYW5kcm9pZC53aWRnZXQuQXV0b0NvbXBsZXRlVGV4dFZpZXcKKyAqIEBzZWUgYW5kcm9pZC53aWRnZXQuU3Bpbm5lcgorICovCitwdWJsaWMgY2xhc3MgTGlzdFBvcHVwV2luZG93IHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkxpc3RQb3B1cFdpbmRvdyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogVGhpcyB2YWx1ZSBjb250cm9scyB0aGUgbGVuZ3RoIG9mIHRpbWUgdGhhdCB0aGUgdXNlcgorICAgICAqIG11c3QgbGVhdmUgYSBwb2ludGVyIGRvd24gd2l0aG91dCBzY3JvbGxpbmcgdG8gZXhwYW5kCisgICAgICogdGhlIGF1dG9jb21wbGV0ZSBkcm9wZG93biBsaXN0IHRvIGNvdmVyIHRoZSBJTUUuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVYUEFORF9MSVNUX1RJTUVPVVQgPSAyNTA7CisKKyAgICBwcml2YXRlIENvbnRleHQgbUNvbnRleHQ7CisgICAgcHJpdmF0ZSBQb3B1cFdpbmRvdyBtUG9wdXA7CisgICAgcHJpdmF0ZSBMaXN0QWRhcHRlciBtQWRhcHRlcjsKKyAgICBwcml2YXRlIERyb3BEb3duTGlzdFZpZXcgbURyb3BEb3duTGlzdDsKKworICAgIHByaXZhdGUgaW50IG1Ecm9wRG93bkhlaWdodCA9IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UOworICAgIHByaXZhdGUgaW50IG1Ecm9wRG93bldpZHRoID0gVmlld0dyb3VwLkxheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQ7CisgICAgcHJpdmF0ZSBpbnQgbURyb3BEb3duSG9yaXpvbnRhbE9mZnNldDsKKyAgICBwcml2YXRlIGludCBtRHJvcERvd25WZXJ0aWNhbE9mZnNldDsKKworICAgIHByaXZhdGUgYm9vbGVhbiBtRHJvcERvd25BbHdheXNWaXNpYmxlID0gZmFsc2U7CisgICAgcHJpdmF0ZSBib29sZWFuIG1Gb3JjZUlnbm9yZU91dHNpZGVUb3VjaCA9IGZhbHNlOworCisgICAgcHJpdmF0ZSBWaWV3IG1Qcm9tcHRWaWV3OworICAgIHByaXZhdGUgaW50IG1Qcm9tcHRQb3NpdGlvbiA9IFBPU0lUSU9OX1BST01QVF9BQk9WRTsKKworICAgIHByaXZhdGUgRGF0YVNldE9ic2VydmVyIG1PYnNlcnZlcjsKKworICAgIHByaXZhdGUgVmlldyBtRHJvcERvd25BbmNob3JWaWV3OworCisgICAgcHJpdmF0ZSBEcmF3YWJsZSBtRHJvcERvd25MaXN0SGlnaGxpZ2h0OworCisgICAgcHJpdmF0ZSBBZGFwdGVyVmlldy5Pbkl0ZW1DbGlja0xpc3RlbmVyIG1JdGVtQ2xpY2tMaXN0ZW5lcjsKKyAgICBwcml2YXRlIEFkYXB0ZXJWaWV3Lk9uSXRlbVNlbGVjdGVkTGlzdGVuZXIgbUl0ZW1TZWxlY3RlZExpc3RlbmVyOworCisgICAgcHJpdmF0ZSBmaW5hbCBSZXNpemVQb3B1cFJ1bm5hYmxlIG1SZXNpemVQb3B1cFJ1bm5hYmxlID0gbmV3IFJlc2l6ZVBvcHVwUnVubmFibGUoKTsKKyAgICBwcml2YXRlIGZpbmFsIFBvcHVwVG91Y2hJbnRlcmNlcHRvciBtVG91Y2hJbnRlcmNlcHRvciA9IG5ldyBQb3B1cFRvdWNoSW50ZXJjZXB0b3IoKTsKKyAgICBwcml2YXRlIGZpbmFsIFBvcHVwU2Nyb2xsTGlzdGVuZXIgbVNjcm9sbExpc3RlbmVyID0gbmV3IFBvcHVwU2Nyb2xsTGlzdGVuZXIoKTsKKyAgICBwcml2YXRlIGZpbmFsIExpc3RTZWxlY3RvckhpZGVyIG1IaWRlU2VsZWN0b3IgPSBuZXcgTGlzdFNlbGVjdG9ySGlkZXIoKTsKKyAgICBwcml2YXRlIFJ1bm5hYmxlIG1TaG93RHJvcERvd25SdW5uYWJsZTsKKworICAgIHByaXZhdGUgSGFuZGxlciBtSGFuZGxlciA9IG5ldyBIYW5kbGVyKCk7CisKKyAgICBwcml2YXRlIFJlY3QgbVRlbXBSZWN0ID0gbmV3IFJlY3QoKTsKKworICAgIHByaXZhdGUgYm9vbGVhbiBtTW9kYWw7CisKKyAgICAvKioKKyAgICAgKiBUaGUgcHJvdmlkZWQgcHJvbXB0IHZpZXcgc2hvdWxkIGFwcGVhciBhYm92ZSBsaXN0IGNvbnRlbnQuCisgICAgICogCisgICAgICogQHNlZSAjc2V0UHJvbXB0UG9zaXRpb24oaW50KQorICAgICAqIEBzZWUgI2dldFByb21wdFBvc2l0aW9uKCkKKyAgICAgKiBAc2VlICNzZXRQcm9tcHRWaWV3KFZpZXcpCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUE9TSVRJT05fUFJPTVBUX0FCT1ZFID0gMDsKKworICAgIC8qKgorICAgICAqIFRoZSBwcm92aWRlZCBwcm9tcHQgdmlldyBzaG91bGQgYXBwZWFyIGJlbG93IGxpc3QgY29udGVudC4KKyAgICAgKiAKKyAgICAgKiBAc2VlICNzZXRQcm9tcHRQb3NpdGlvbihpbnQpCisgICAgICogQHNlZSAjZ2V0UHJvbXB0UG9zaXRpb24oKQorICAgICAqIEBzZWUgI3NldFByb21wdFZpZXcoVmlldykKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQT1NJVElPTl9QUk9NUFRfQkVMT1cgPSAxOworCisgICAgLyoqCisgICAgICogQWxpYXMgZm9yIHtAbGluayBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zI01BVENIX1BBUkVOVH0uCisgICAgICogSWYgdXNlZCB0byBzcGVjaWZ5IGEgcG9wdXAgd2lkdGgsIHRoZSBwb3B1cCB3aWxsIG1hdGNoIHRoZSB3aWR0aCBvZiB0aGUgYW5jaG9yIHZpZXcuCisgICAgICogSWYgdXNlZCB0byBzcGVjaWZ5IGEgcG9wdXAgaGVpZ2h0LCB0aGUgcG9wdXAgd2lsbCBmaWxsIGF2YWlsYWJsZSBzcGFjZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQVRDSF9QQVJFTlQgPSBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVDsKKyAgICAKKyAgICAvKioKKyAgICAgKiBBbGlhcyBmb3Ige0BsaW5rIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMjV1JBUF9DT05URU5UfS4KKyAgICAgKiBJZiB1c2VkIHRvIHNwZWNpZnkgYSBwb3B1cCB3aWR0aCwgdGhlIHBvcHVwIHdpbGwgdXNlIHRoZSB3aWR0aCBvZiBpdHMgY29udGVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXUkFQX0NPTlRFTlQgPSBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVDsKKyAgICAKKyAgICAvKioKKyAgICAgKiBNb2RlIGZvciB7QGxpbmsgI3NldElucHV0TWV0aG9kTW9kZShpbnQpfTogdGhlIHJlcXVpcmVtZW50cyBmb3IgdGhlCisgICAgICogaW5wdXQgbWV0aG9kIHNob3VsZCBiZSBiYXNlZCBvbiB0aGUgZm9jdXNhYmlsaXR5IG9mIHRoZSBwb3B1cC4gIFRoYXQgaXMKKyAgICAgKiBpZiBpdCBpcyBmb2N1c2FibGUgdGhhbiBpdCBuZWVkcyB0byB3b3JrIHdpdGggdGhlIGlucHV0IG1ldGhvZCwgZWxzZQorICAgICAqIGl0IGRvZXNuJ3QuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5QVVRfTUVUSE9EX0ZST01fRk9DVVNBQkxFID0gUG9wdXBXaW5kb3cuSU5QVVRfTUVUSE9EX0ZST01fRk9DVVNBQkxFOworICAgIAorICAgIC8qKgorICAgICAqIE1vZGUgZm9yIHtAbGluayAjc2V0SW5wdXRNZXRob2RNb2RlKGludCl9OiB0aGlzIHBvcHVwIGFsd2F5cyBuZWVkcyB0bworICAgICAqIHdvcmsgd2l0aCBhbiBpbnB1dCBtZXRob2QsIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdCBpcyBmb2N1c2FibGUuICBUaGlzCisgICAgICogbWVhbnMgdGhhdCBpdCB3aWxsIGFsd2F5cyBiZSBkaXNwbGF5ZWQgc28gdGhhdCB0aGUgdXNlciBjYW4gYWxzbyBvcGVyYXRlCisgICAgICogdGhlIGlucHV0IG1ldGhvZCB3aGlsZSBpdCBpcyBzaG93bi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlBVVF9NRVRIT0RfTkVFREVEID0gUG9wdXBXaW5kb3cuSU5QVVRfTUVUSE9EX05FRURFRDsKKyAgICAKKyAgICAvKioKKyAgICAgKiBNb2RlIGZvciB7QGxpbmsgI3NldElucHV0TWV0aG9kTW9kZShpbnQpfTogdGhpcyBwb3B1cCBuZXZlciBuZWVkcyB0bworICAgICAqIHdvcmsgd2l0aCBhbiBpbnB1dCBtZXRob2QsIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdCBpcyBmb2N1c2FibGUuICBUaGlzCisgICAgICogbWVhbnMgdGhhdCBpdCB3aWxsIGFsd2F5cyBiZSBkaXNwbGF5ZWQgdG8gdXNlIGFzIG11Y2ggc3BhY2Ugb24gdGhlCisgICAgICogc2NyZWVuIGFzIG5lZWRlZCwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoaXMgY292ZXJzIHRoZSBpbnB1dCBtZXRob2QuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5QVVRfTUVUSE9EX05PVF9ORUVERUQgPSBQb3B1cFdpbmRvdy5JTlBVVF9NRVRIT0RfTk9UX05FRURFRDsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldywgZW1wdHkgcG9wdXAgd2luZG93IGNhcGFibGUgb2YgZGlzcGxheWluZyBpdGVtcyBmcm9tIGEgTGlzdEFkYXB0ZXIuCisgICAgICogQmFja2dyb3VuZHMgc2hvdWxkIGJlIHNldCB1c2luZyB7QGxpbmsgI3NldEJhY2tncm91bmREcmF3YWJsZShEcmF3YWJsZSl9LgorICAgICAqIAorICAgICAqIEBwYXJhbSBjb250ZXh0IENvbnRleHQgdXNlZCBmb3IgY29udGFpbmVkIHZpZXdzLgorICAgICAqLworICAgIHB1YmxpYyBMaXN0UG9wdXBXaW5kb3coQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHRoaXMoY29udGV4dCwgbnVsbCwgMCwgMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3LCBlbXB0eSBwb3B1cCB3aW5kb3cgY2FwYWJsZSBvZiBkaXNwbGF5aW5nIGl0ZW1zIGZyb20gYSBMaXN0QWRhcHRlci4KKyAgICAgKiBCYWNrZ3JvdW5kcyBzaG91bGQgYmUgc2V0IHVzaW5nIHtAbGluayAjc2V0QmFja2dyb3VuZERyYXdhYmxlKERyYXdhYmxlKX0uCisgICAgICogCisgICAgICogQHBhcmFtIGNvbnRleHQgQ29udGV4dCB1c2VkIGZvciBjb250YWluZWQgdmlld3MuCisgICAgICogQHBhcmFtIGF0dHJzIEF0dHJpYnV0ZXMgZnJvbSBpbmZsYXRpbmcgcGFyZW50IHZpZXdzIHVzZWQgdG8gc3R5bGUgdGhlIHBvcHVwLgorICAgICAqLworICAgIHB1YmxpYyBMaXN0UG9wdXBXaW5kb3coQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKKyAgICAgICAgdGhpcyhjb250ZXh0LCBhdHRycywgMCwgMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3LCBlbXB0eSBwb3B1cCB3aW5kb3cgY2FwYWJsZSBvZiBkaXNwbGF5aW5nIGl0ZW1zIGZyb20gYSBMaXN0QWRhcHRlci4KKyAgICAgKiBCYWNrZ3JvdW5kcyBzaG91bGQgYmUgc2V0IHVzaW5nIHtAbGluayAjc2V0QmFja2dyb3VuZERyYXdhYmxlKERyYXdhYmxlKX0uCisgICAgICogCisgICAgICogQHBhcmFtIGNvbnRleHQgQ29udGV4dCB1c2VkIGZvciBjb250YWluZWQgdmlld3MuCisgICAgICogQHBhcmFtIGF0dHJzIEF0dHJpYnV0ZXMgZnJvbSBpbmZsYXRpbmcgcGFyZW50IHZpZXdzIHVzZWQgdG8gc3R5bGUgdGhlIHBvcHVwLgorICAgICAqIEBwYXJhbSBkZWZTdHlsZUF0dHIgRGVmYXVsdCBzdHlsZSBhdHRyaWJ1dGUgdG8gdXNlIGZvciBwb3B1cCBjb250ZW50LgorICAgICAqLworICAgIHB1YmxpYyBMaXN0UG9wdXBXaW5kb3coQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBkZWZTdHlsZUF0dHIpIHsKKyAgICAgICAgdGhpcyhjb250ZXh0LCBhdHRycywgZGVmU3R5bGVBdHRyLCAwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcsIGVtcHR5IHBvcHVwIHdpbmRvdyBjYXBhYmxlIG9mIGRpc3BsYXlpbmcgaXRlbXMgZnJvbSBhIExpc3RBZGFwdGVyLgorICAgICAqIEJhY2tncm91bmRzIHNob3VsZCBiZSBzZXQgdXNpbmcge0BsaW5rICNzZXRCYWNrZ3JvdW5kRHJhd2FibGUoRHJhd2FibGUpfS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY29udGV4dCBDb250ZXh0IHVzZWQgZm9yIGNvbnRhaW5lZCB2aWV3cy4KKyAgICAgKiBAcGFyYW0gYXR0cnMgQXR0cmlidXRlcyBmcm9tIGluZmxhdGluZyBwYXJlbnQgdmlld3MgdXNlZCB0byBzdHlsZSB0aGUgcG9wdXAuCisgICAgICogQHBhcmFtIGRlZlN0eWxlQXR0ciBTdHlsZSBhdHRyaWJ1dGUgdG8gcmVhZCBmb3IgZGVmYXVsdCBzdHlsaW5nIG9mIHBvcHVwIGNvbnRlbnQuCisgICAgICogQHBhcmFtIGRlZlN0eWxlUmVzIFN0eWxlIHJlc291cmNlIElEIHRvIHVzZSBmb3IgZGVmYXVsdCBzdHlsaW5nIG9mIHBvcHVwIGNvbnRlbnQuCisgICAgICovCisgICAgcHVibGljIExpc3RQb3B1cFdpbmRvdyhDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlQXR0ciwgaW50IGRlZlN0eWxlUmVzKSB7CisgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKKyAgICAgICAgbVBvcHVwID0gbmV3IFBvcHVwV2luZG93KGNvbnRleHQsIGF0dHJzLCBkZWZTdHlsZUF0dHIsIGRlZlN0eWxlUmVzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBhZGFwdGVyIHRoYXQgcHJvdmlkZXMgdGhlIGRhdGEgYW5kIHRoZSB2aWV3cyB0byByZXByZXNlbnQgdGhlIGRhdGEKKyAgICAgKiBpbiB0aGlzIHBvcHVwIHdpbmRvdy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhZGFwdGVyIFRoZSBhZGFwdGVyIHRvIHVzZSB0byBjcmVhdGUgdGhpcyB3aW5kb3cncyBjb250ZW50LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEFkYXB0ZXIoTGlzdEFkYXB0ZXIgYWRhcHRlcikgeworICAgICAgICBpZiAobU9ic2VydmVyID09IG51bGwpIHsKKyAgICAgICAgICAgIG1PYnNlcnZlciA9IG5ldyBQb3B1cERhdGFTZXRPYnNlcnZlcigpOworICAgICAgICB9IGVsc2UgaWYgKG1BZGFwdGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1BZGFwdGVyLnVucmVnaXN0ZXJEYXRhU2V0T2JzZXJ2ZXIobU9ic2VydmVyKTsKKyAgICAgICAgfQorICAgICAgICBtQWRhcHRlciA9IGFkYXB0ZXI7CisgICAgICAgIGlmIChtQWRhcHRlciAhPSBudWxsKSB7CisgICAgICAgICAgICBhZGFwdGVyLnJlZ2lzdGVyRGF0YVNldE9ic2VydmVyKG1PYnNlcnZlcik7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChtRHJvcERvd25MaXN0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1Ecm9wRG93bkxpc3Quc2V0QWRhcHRlcihtQWRhcHRlcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgd2hlcmUgdGhlIG9wdGlvbmFsIHByb21wdCB2aWV3IHNob3VsZCBhcHBlYXIuIFRoZSBkZWZhdWx0IGlzCisgICAgICoge0BsaW5rICNQT1NJVElPTl9QUk9NUFRfQUJPVkV9LgorICAgICAqIAorICAgICAqIEBwYXJhbSBwb3NpdGlvbiBBIHBvc2l0aW9uIGNvbnN0YW50IGRlY2xhcmluZyB3aGVyZSB0aGUgcHJvbXB0IHNob3VsZCBiZSBkaXNwbGF5ZWQuCisgICAgICogCisgICAgICogQHNlZSAjUE9TSVRJT05fUFJPTVBUX0FCT1ZFCisgICAgICogQHNlZSAjUE9TSVRJT05fUFJPTVBUX0JFTE9XCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UHJvbXB0UG9zaXRpb24oaW50IHBvc2l0aW9uKSB7CisgICAgICAgIG1Qcm9tcHRQb3NpdGlvbiA9IHBvc2l0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gV2hlcmUgdGhlIG9wdGlvbmFsIHByb21wdCB2aWV3IHNob3VsZCBhcHBlYXIuCisgICAgICogCisgICAgICogQHNlZSAjUE9TSVRJT05fUFJPTVBUX0FCT1ZFCisgICAgICogQHNlZSAjUE9TSVRJT05fUFJPTVBUX0JFTE9XCisgICAgICovCisgICAgcHVibGljIGludCBnZXRQcm9tcHRQb3NpdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIG1Qcm9tcHRQb3NpdGlvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgd2hldGhlciB0aGlzIHdpbmRvdyBzaG91bGQgYmUgbW9kYWwgd2hlbiBzaG93bi4KKyAgICAgKiAKKyAgICAgKiA8cD5JZiBhIHBvcHVwIHdpbmRvdyBpcyBtb2RhbCwgaXQgd2lsbCByZWNlaXZlIGFsbCB0b3VjaCBhbmQga2V5IGlucHV0LgorICAgICAqIElmIHRoZSB1c2VyIHRvdWNoZXMgb3V0c2lkZSB0aGUgcG9wdXAgd2luZG93J3MgY29udGVudCBhcmVhIHRoZSBwb3B1cCB3aW5kb3cKKyAgICAgKiB3aWxsIGJlIGRpc21pc3NlZC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbW9kYWwge0Bjb2RlIHRydWV9IGlmIHRoZSBwb3B1cCB3aW5kb3cgc2hvdWxkIGJlIG1vZGFsLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNb2RhbChib29sZWFuIG1vZGFsKSB7CisgICAgICAgIG1Nb2RhbCA9IHRydWU7CisgICAgICAgIG1Qb3B1cC5zZXRGb2N1c2FibGUobW9kYWwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgcG9wdXAgd2luZG93IHdpbGwgYmUgbW9kYWwgd2hlbiBzaG93bi4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgcG9wdXAgd2luZG93IHdpbGwgYmUgbW9kYWwsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzTW9kYWwoKSB7CisgICAgICAgIHJldHVybiBtTW9kYWw7CisgICAgfQorCisgICAgLyoqCisgICAgICogRm9yY2VzIG91dHNpZGUgdG91Y2hlcyB0byBiZSBpZ25vcmVkLiBOb3JtYWxseSBpZiB7QGxpbmsgI2lzRHJvcERvd25BbHdheXNWaXNpYmxlKCl9IGlzCisgICAgICogZmFsc2UsIHdlIGFsbG93IG91dHNpZGUgdG91Y2ggdG8gZGlzbWlzcyB0aGUgZHJvcGRvd24uIElmIHRoaXMgaXMgc2V0IHRvIHRydWUsIHRoZW4gd2UKKyAgICAgKiBpZ25vcmUgb3V0c2lkZSB0b3VjaCBldmVuIHdoZW4gdGhlIGRyb3AgZG93biBpcyBub3Qgc2V0IHRvIGFsd2F5cyB2aXNpYmxlLgorICAgICAqIAorICAgICAqIEBoaWRlIFVzZWQgb25seSBieSBBdXRvQ29tcGxldGVUZXh0VmlldyB0byBoYW5kbGUgc29tZSBpbnRlcm5hbCBzcGVjaWFsIGNhc2VzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEZvcmNlSWdub3JlT3V0c2lkZVRvdWNoKGJvb2xlYW4gZm9yY2VJZ25vcmVPdXRzaWRlVG91Y2gpIHsKKyAgICAgICAgbUZvcmNlSWdub3JlT3V0c2lkZVRvdWNoID0gZm9yY2VJZ25vcmVPdXRzaWRlVG91Y2g7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB3aGV0aGVyIHRoZSBkcm9wLWRvd24gc2hvdWxkIHJlbWFpbiB2aXNpYmxlIHVuZGVyIGNlcnRhaW4gY29uZGl0aW9ucy4KKyAgICAgKgorICAgICAqIFRoZSBkcm9wLWRvd24gd2lsbCBvY2N1cHkgdGhlIGVudGlyZSBzY3JlZW4gYmVsb3cge0BsaW5rICNnZXRBbmNob3JWaWV3fSByZWdhcmRsZXNzCisgICAgICogb2YgdGhlIHNpemUgb3IgY29udGVudCBvZiB0aGUgbGlzdC4gIHtAbGluayAjZ2V0QmFja2dyb3VuZCgpfSB3aWxsIGZpbGwgYW55IHNwYWNlCisgICAgICogdGhhdCBpcyBub3QgdXNlZCBieSB0aGUgbGlzdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkcm9wRG93bkFsd2F5c1Zpc2libGUgV2hldGhlciB0byBrZWVwIHRoZSBkcm9wLWRvd24gdmlzaWJsZS4KKyAgICAgKgorICAgICAqIEBoaWRlIE9ubHkgdXNlZCBieSBBdXRvQ29tcGxldGVUZXh0VmlldyB1bmRlciBzcGVjaWFsIGNvbmRpdGlvbnMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RHJvcERvd25BbHdheXNWaXNpYmxlKGJvb2xlYW4gZHJvcERvd25BbHdheXNWaXNpYmxlKSB7CisgICAgICAgIG1Ecm9wRG93bkFsd2F5c1Zpc2libGUgPSBkcm9wRG93bkFsd2F5c1Zpc2libGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBXaGV0aGVyIHRoZSBkcm9wLWRvd24gaXMgdmlzaWJsZSB1bmRlciBzcGVjaWFsIGNvbmRpdGlvbnMuCisgICAgICoKKyAgICAgKiBAaGlkZSBPbmx5IHVzZWQgYnkgQXV0b0NvbXBsZXRlVGV4dFZpZXcgdW5kZXIgc3BlY2lhbCBjb25kaXRpb25zLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzRHJvcERvd25BbHdheXNWaXNpYmxlKCkgeworICAgICAgICByZXR1cm4gbURyb3BEb3duQWx3YXlzVmlzaWJsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBvcGVyYXRpbmcgbW9kZSBmb3IgdGhlIHNvZnQgaW5wdXQgYXJlYS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtb2RlIFRoZSBkZXNpcmVkIG1vZGUsIHNlZQorICAgICAqICAgICAgICB7QGxpbmsgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zI3NvZnRJbnB1dE1vZGV9CisgICAgICogICAgICAgIGZvciB0aGUgZnVsbCBsaXN0CisgICAgICoKKyAgICAgKiBAc2VlIGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcyNzb2Z0SW5wdXRNb2RlCisgICAgICogQHNlZSAjZ2V0U29mdElucHV0TW9kZSgpCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U29mdElucHV0TW9kZShpbnQgbW9kZSkgeworICAgICAgICBtUG9wdXAuc2V0U29mdElucHV0TW9kZShtb2RlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHZhbHVlIGluIHtAbGluayAjc2V0U29mdElucHV0TW9kZShpbnQpfS4KKyAgICAgKgorICAgICAqIEBzZWUgI3NldFNvZnRJbnB1dE1vZGUoaW50KQorICAgICAqIEBzZWUgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zI3NvZnRJbnB1dE1vZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFNvZnRJbnB1dE1vZGUoKSB7CisgICAgICAgIHJldHVybiBtUG9wdXAuZ2V0U29mdElucHV0TW9kZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgYSBkcmF3YWJsZSB0byB1c2UgYXMgdGhlIGxpc3QgaXRlbSBzZWxlY3Rvci4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gc2VsZWN0b3IgTGlzdCBzZWxlY3RvciBkcmF3YWJsZSB0byB1c2UgaW4gdGhlIHBvcHVwLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldExpc3RTZWxlY3RvcihEcmF3YWJsZSBzZWxlY3RvcikgeworICAgICAgICBtRHJvcERvd25MaXN0SGlnaGxpZ2h0ID0gc2VsZWN0b3I7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBUaGUgYmFja2dyb3VuZCBkcmF3YWJsZSBmb3IgdGhlIHBvcHVwIHdpbmRvdy4KKyAgICAgKi8KKyAgICBwdWJsaWMgRHJhd2FibGUgZ2V0QmFja2dyb3VuZCgpIHsKKyAgICAgICAgcmV0dXJuIG1Qb3B1cC5nZXRCYWNrZ3JvdW5kKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyBhIGRyYXdhYmxlIHRvIGJlIHRoZSBiYWNrZ3JvdW5kIGZvciB0aGUgcG9wdXAgd2luZG93LgorICAgICAqIAorICAgICAqIEBwYXJhbSBkIEEgZHJhd2FibGUgdG8gc2V0IGFzIHRoZSBiYWNrZ3JvdW5kLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEJhY2tncm91bmREcmF3YWJsZShEcmF3YWJsZSBkKSB7CisgICAgICAgIG1Qb3B1cC5zZXRCYWNrZ3JvdW5kRHJhd2FibGUoZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IGFuIGFuaW1hdGlvbiBzdHlsZSB0byB1c2Ugd2hlbiB0aGUgcG9wdXAgd2luZG93IGlzIHNob3duIG9yIGRpc21pc3NlZC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYW5pbWF0aW9uU3R5bGUgQW5pbWF0aW9uIHN0eWxlIHRvIHVzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBbmltYXRpb25TdHlsZShpbnQgYW5pbWF0aW9uU3R5bGUpIHsKKyAgICAgICAgbVBvcHVwLnNldEFuaW1hdGlvblN0eWxlKGFuaW1hdGlvblN0eWxlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBhbmltYXRpb24gc3R5bGUgdGhhdCB3aWxsIGJlIHVzZWQgd2hlbiB0aGUgcG9wdXAgd2luZG93IGlzCisgICAgICogc2hvd24gb3IgZGlzbWlzc2VkLgorICAgICAqIAorICAgICAqIEByZXR1cm4gQW5pbWF0aW9uIHN0eWxlIHRoYXQgd2lsbCBiZSB1c2VkLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0QW5pbWF0aW9uU3R5bGUoKSB7CisgICAgICAgIHJldHVybiBtUG9wdXAuZ2V0QW5pbWF0aW9uU3R5bGUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB2aWV3IHRoYXQgd2lsbCBiZSB1c2VkIHRvIGFuY2hvciB0aGlzIHBvcHVwLgorICAgICAqIAorICAgICAqIEByZXR1cm4gVGhlIHBvcHVwJ3MgYW5jaG9yIHZpZXcKKyAgICAgKi8KKyAgICBwdWJsaWMgVmlldyBnZXRBbmNob3JWaWV3KCkgeworICAgICAgICByZXR1cm4gbURyb3BEb3duQW5jaG9yVmlldzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBwb3B1cCdzIGFuY2hvciB2aWV3LiBUaGlzIHBvcHVwIHdpbGwgYWx3YXlzIGJlIHBvc2l0aW9uZWQgcmVsYXRpdmUgdG8KKyAgICAgKiB0aGUgYW5jaG9yIHZpZXcgd2hlbiBzaG93bi4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYW5jaG9yIFRoZSB2aWV3IHRvIHVzZSBhcyBhbiBhbmNob3IuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QW5jaG9yVmlldyhWaWV3IGFuY2hvcikgeworICAgICAgICBtRHJvcERvd25BbmNob3JWaWV3ID0gYW5jaG9yOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gVGhlIGhvcml6b250YWwgb2Zmc2V0IG9mIHRoZSBwb3B1cCBmcm9tIGl0cyBhbmNob3IgaW4gcGl4ZWxzLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0SG9yaXpvbnRhbE9mZnNldCgpIHsKKyAgICAgICAgcmV0dXJuIG1Ecm9wRG93bkhvcml6b250YWxPZmZzZXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBob3Jpem9udGFsIG9mZnNldCBvZiB0aGlzIHBvcHVwIGZyb20gaXRzIGFuY2hvciB2aWV3IGluIHBpeGVscy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gb2Zmc2V0IFRoZSBob3Jpem9udGFsIG9mZnNldCBvZiB0aGUgcG9wdXAgZnJvbSBpdHMgYW5jaG9yLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEhvcml6b250YWxPZmZzZXQoaW50IG9mZnNldCkgeworICAgICAgICBtRHJvcERvd25Ib3Jpem9udGFsT2Zmc2V0ID0gb2Zmc2V0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gVGhlIHZlcnRpY2FsIG9mZnNldCBvZiB0aGUgcG9wdXAgZnJvbSBpdHMgYW5jaG9yIGluIHBpeGVscy4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFZlcnRpY2FsT2Zmc2V0KCkgeworICAgICAgICByZXR1cm4gbURyb3BEb3duVmVydGljYWxPZmZzZXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSB2ZXJ0aWNhbCBvZmZzZXQgb2YgdGhpcyBwb3B1cCBmcm9tIGl0cyBhbmNob3IgdmlldyBpbiBwaXhlbHMuCisgICAgICogCisgICAgICogQHBhcmFtIG9mZnNldCBUaGUgdmVydGljYWwgb2Zmc2V0IG9mIHRoZSBwb3B1cCBmcm9tIGl0cyBhbmNob3IuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VmVydGljYWxPZmZzZXQoaW50IG9mZnNldCkgeworICAgICAgICBtRHJvcERvd25WZXJ0aWNhbE9mZnNldCA9IG9mZnNldDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFRoZSB3aWR0aCBvZiB0aGUgcG9wdXAgd2luZG93IGluIHBpeGVscy4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFdpZHRoKCkgeworICAgICAgICByZXR1cm4gbURyb3BEb3duV2lkdGg7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgd2lkdGggb2YgdGhlIHBvcHVwIHdpbmRvdyBpbiBwaXhlbHMuIENhbiBhbHNvIGJlIHtAbGluayAjTUFUQ0hfUEFSRU5UfQorICAgICAqIG9yIHtAbGluayAjV1JBUF9DT05URU5UfS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gd2lkdGggV2lkdGggb2YgdGhlIHBvcHVwIHdpbmRvdy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRXaWR0aChpbnQgd2lkdGgpIHsKKyAgICAgICAgbURyb3BEb3duV2lkdGggPSB3aWR0aDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSB3aWR0aCBvZiB0aGUgcG9wdXAgd2luZG93IGJ5IHRoZSBzaXplIG9mIGl0cyBjb250ZW50LiBUaGUgZmluYWwgd2lkdGggbWF5IGJlCisgICAgICogbGFyZ2VyIHRvIGFjY29tbW9kYXRlIHN0eWxlZCB3aW5kb3cgZHJlc3NpbmcuCisgICAgICoKKyAgICAgKiBAcGFyYW0gd2lkdGggRGVzaXJlZCB3aWR0aCBvZiBjb250ZW50IGluIHBpeGVscy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb250ZW50V2lkdGgoaW50IHdpZHRoKSB7CisgICAgICAgIERyYXdhYmxlIHBvcHVwQmFja2dyb3VuZCA9IG1Qb3B1cC5nZXRCYWNrZ3JvdW5kKCk7CisgICAgICAgIGlmIChwb3B1cEJhY2tncm91bmQgIT0gbnVsbCkgeworICAgICAgICAgICAgbURyb3BEb3duV2lkdGggPSBwb3B1cEJhY2tncm91bmQuZ2V0SW50cmluc2ljV2lkdGgoKSArIHdpZHRoOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBUaGUgaGVpZ2h0IG9mIHRoZSBwb3B1cCB3aW5kb3cgaW4gcGl4ZWxzLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0SGVpZ2h0KCkgeworICAgICAgICByZXR1cm4gbURyb3BEb3duSGVpZ2h0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGhlaWdodCBvZiB0aGUgcG9wdXAgd2luZG93IGluIHBpeGVscy4gQ2FuIGFsc28gYmUge0BsaW5rICNNQVRDSF9QQVJFTlR9LgorICAgICAqIAorICAgICAqIEBwYXJhbSBoZWlnaHQgSGVpZ2h0IG9mIHRoZSBwb3B1cCB3aW5kb3cuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SGVpZ2h0KGludCBoZWlnaHQpIHsKKyAgICAgICAgbURyb3BEb3duSGVpZ2h0ID0gaGVpZ2h0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgYSBsaXN0ZW5lciB0byByZWNlaXZlIGV2ZW50cyB3aGVuIGEgbGlzdCBpdGVtIGlzIGNsaWNrZWQuCisgICAgICogCisgICAgICogQHBhcmFtIGNsaWNrTGlzdGVuZXIgTGlzdGVuZXIgdG8gcmVnaXN0ZXIKKyAgICAgKiAKKyAgICAgKiBAc2VlIExpc3RWaWV3I3NldE9uSXRlbUNsaWNrTGlzdGVuZXIoYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXcuT25JdGVtQ2xpY2tMaXN0ZW5lcikKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRPbkl0ZW1DbGlja0xpc3RlbmVyKEFkYXB0ZXJWaWV3Lk9uSXRlbUNsaWNrTGlzdGVuZXIgY2xpY2tMaXN0ZW5lcikgeworICAgICAgICBtSXRlbUNsaWNrTGlzdGVuZXIgPSBjbGlja0xpc3RlbmVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgYSBsaXN0ZW5lciB0byByZWNlaXZlIGV2ZW50cyB3aGVuIGEgbGlzdCBpdGVtIGlzIHNlbGVjdGVkLgorICAgICAqIAorICAgICAqIEBwYXJhbSBzZWxlY3RlZExpc3RlbmVyIExpc3RlbmVyIHRvIHJlZ2lzdGVyLgorICAgICAqIAorICAgICAqIEBzZWUgTGlzdFZpZXcjc2V0T25JdGVtU2VsZWN0ZWRMaXN0ZW5lcihhbmRyb2lkLndpZGdldC5BZGFwdGVyVmlldy5Pbkl0ZW1TZWxlY3RlZExpc3RlbmVyKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE9uSXRlbVNlbGVjdGVkTGlzdGVuZXIoQWRhcHRlclZpZXcuT25JdGVtU2VsZWN0ZWRMaXN0ZW5lciBzZWxlY3RlZExpc3RlbmVyKSB7CisgICAgICAgIG1JdGVtU2VsZWN0ZWRMaXN0ZW5lciA9IHNlbGVjdGVkTGlzdGVuZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IGEgdmlldyB0byBhY3QgYXMgYSB1c2VyIHByb21wdCBmb3IgdGhpcyBwb3B1cCB3aW5kb3cuIFdoZXJlIHRoZSBwcm9tcHQgdmlldyB3aWxsIGFwcGVhcgorICAgICAqIGlzIGNvbnRyb2xsZWQgYnkge0BsaW5rICNzZXRQcm9tcHRQb3NpdGlvbihpbnQpfS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcHJvbXB0IFZpZXcgdG8gdXNlIGFzIGFuIGluZm9ybWF0aW9uYWwgcHJvbXB0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFByb21wdFZpZXcoVmlldyBwcm9tcHQpIHsKKyAgICAgICAgYm9vbGVhbiBzaG93aW5nID0gaXNTaG93aW5nKCk7CisgICAgICAgIGlmIChzaG93aW5nKSB7CisgICAgICAgICAgICByZW1vdmVQcm9tcHRWaWV3KCk7CisgICAgICAgIH0KKyAgICAgICAgbVByb21wdFZpZXcgPSBwcm9tcHQ7CisgICAgICAgIGlmIChzaG93aW5nKSB7CisgICAgICAgICAgICBzaG93KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQb3N0IGEge0BsaW5rICNzaG93KCl9IGNhbGwgdG8gdGhlIFVJIHRocmVhZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwb3N0U2hvdygpIHsKKyAgICAgICAgbUhhbmRsZXIucG9zdChtU2hvd0Ryb3BEb3duUnVubmFibGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNob3cgdGhlIHBvcHVwIGxpc3QuIElmIHRoZSBsaXN0IGlzIGFscmVhZHkgc2hvd2luZywgdGhpcyBtZXRob2QKKyAgICAgKiB3aWxsIHJlY2FsY3VsYXRlIHRoZSBwb3B1cCdzIHNpemUgYW5kIHBvc2l0aW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNob3coKSB7CisgICAgICAgIGludCBoZWlnaHQgPSBidWlsZERyb3BEb3duKCk7CisKKyAgICAgICAgaW50IHdpZHRoU3BlYyA9IDA7CisgICAgICAgIGludCBoZWlnaHRTcGVjID0gMDsKKworICAgICAgICBib29sZWFuIG5vSW5wdXRNZXRob2QgPSBpc0lucHV0TWV0aG9kTm90TmVlZGVkKCk7CisKKyAgICAgICAgaWYgKG1Qb3B1cC5pc1Nob3dpbmcoKSkgeworICAgICAgICAgICAgaWYgKG1Ecm9wRG93bldpZHRoID09IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UKSB7CisgICAgICAgICAgICAgICAgLy8gVGhlIGNhbGwgdG8gUG9wdXBXaW5kb3cncyB1cGRhdGUgbWV0aG9kIGJlbG93IGNhbiBhY2NlcHQgLTEgZm9yIGFueQorICAgICAgICAgICAgICAgIC8vIHZhbHVlIHlvdSBkbyBub3Qgd2FudCB0byB1cGRhdGUuCisgICAgICAgICAgICAgICAgd2lkdGhTcGVjID0gLTE7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1Ecm9wRG93bldpZHRoID09IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UKSB7CisgICAgICAgICAgICAgICAgd2lkdGhTcGVjID0gZ2V0QW5jaG9yVmlldygpLmdldFdpZHRoKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHdpZHRoU3BlYyA9IG1Ecm9wRG93bldpZHRoOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobURyb3BEb3duSGVpZ2h0ID09IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UKSB7CisgICAgICAgICAgICAgICAgLy8gVGhlIGNhbGwgdG8gUG9wdXBXaW5kb3cncyB1cGRhdGUgbWV0aG9kIGJlbG93IGNhbiBhY2NlcHQgLTEgZm9yIGFueQorICAgICAgICAgICAgICAgIC8vIHZhbHVlIHlvdSBkbyBub3Qgd2FudCB0byB1cGRhdGUuCisgICAgICAgICAgICAgICAgaGVpZ2h0U3BlYyA9IG5vSW5wdXRNZXRob2QgPyBoZWlnaHQgOiBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVDsKKyAgICAgICAgICAgICAgICBpZiAobm9JbnB1dE1ldGhvZCkgeworICAgICAgICAgICAgICAgICAgICBtUG9wdXAuc2V0V2luZG93TGF5b3V0TW9kZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRHJvcERvd25XaWR0aCA9PSBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCA6IDAsIDApOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1Qb3B1cC5zZXRXaW5kb3dMYXlvdXRNb2RlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ecm9wRG93bldpZHRoID09IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UIDogMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChtRHJvcERvd25IZWlnaHQgPT0gVmlld0dyb3VwLkxheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQpIHsKKyAgICAgICAgICAgICAgICBoZWlnaHRTcGVjID0gaGVpZ2h0OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBoZWlnaHRTcGVjID0gbURyb3BEb3duSGVpZ2h0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtUG9wdXAuc2V0T3V0c2lkZVRvdWNoYWJsZSghbUZvcmNlSWdub3JlT3V0c2lkZVRvdWNoICYmICFtRHJvcERvd25BbHdheXNWaXNpYmxlKTsKKworICAgICAgICAgICAgbVBvcHVwLnVwZGF0ZShnZXRBbmNob3JWaWV3KCksIG1Ecm9wRG93bkhvcml6b250YWxPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgIG1Ecm9wRG93blZlcnRpY2FsT2Zmc2V0LCB3aWR0aFNwZWMsIGhlaWdodFNwZWMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKG1Ecm9wRG93bldpZHRoID09IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UKSB7CisgICAgICAgICAgICAgICAgd2lkdGhTcGVjID0gVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChtRHJvcERvd25XaWR0aCA9PSBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCkgeworICAgICAgICAgICAgICAgICAgICBtUG9wdXAuc2V0V2lkdGgoZ2V0QW5jaG9yVmlldygpLmdldFdpZHRoKCkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1Qb3B1cC5zZXRXaWR0aChtRHJvcERvd25XaWR0aCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobURyb3BEb3duSGVpZ2h0ID09IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UKSB7CisgICAgICAgICAgICAgICAgaGVpZ2h0U3BlYyA9IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAobURyb3BEb3duSGVpZ2h0ID09IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UKSB7CisgICAgICAgICAgICAgICAgICAgIG1Qb3B1cC5zZXRIZWlnaHQoaGVpZ2h0KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtUG9wdXAuc2V0SGVpZ2h0KG1Ecm9wRG93bkhlaWdodCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtUG9wdXAuc2V0V2luZG93TGF5b3V0TW9kZSh3aWR0aFNwZWMsIGhlaWdodFNwZWMpOworICAgICAgICAgICAgbVBvcHVwLnNldElucHV0TWV0aG9kTW9kZShQb3B1cFdpbmRvdy5JTlBVVF9NRVRIT0RfTkVFREVEKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gdXNlIG91dHNpZGUgdG91Y2hhYmxlIHRvIGRpc21pc3MgZHJvcCBkb3duIHdoZW4gdG91Y2hpbmcgb3V0c2lkZSBvZiBpdCwgc28KKyAgICAgICAgICAgIC8vIG9ubHkgc2V0IHRoaXMgaWYgdGhlIGRyb3Bkb3duIGlzIG5vdCBhbHdheXMgdmlzaWJsZQorICAgICAgICAgICAgbVBvcHVwLnNldE91dHNpZGVUb3VjaGFibGUoIW1Gb3JjZUlnbm9yZU91dHNpZGVUb3VjaCAmJiAhbURyb3BEb3duQWx3YXlzVmlzaWJsZSk7CisgICAgICAgICAgICBtUG9wdXAuc2V0VG91Y2hJbnRlcmNlcHRvcihtVG91Y2hJbnRlcmNlcHRvcik7CisgICAgICAgICAgICBtUG9wdXAuc2hvd0FzRHJvcERvd24oZ2V0QW5jaG9yVmlldygpLAorICAgICAgICAgICAgICAgICAgICBtRHJvcERvd25Ib3Jpem9udGFsT2Zmc2V0LCBtRHJvcERvd25WZXJ0aWNhbE9mZnNldCk7CisgICAgICAgICAgICBtRHJvcERvd25MaXN0LnNldFNlbGVjdGlvbihMaXN0Vmlldy5JTlZBTElEX1BPU0lUSU9OKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKCFtTW9kYWwgfHwgbURyb3BEb3duTGlzdC5pc0luVG91Y2hNb2RlKCkpIHsKKyAgICAgICAgICAgICAgICBjbGVhckxpc3RTZWxlY3Rpb24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghbU1vZGFsKSB7CisgICAgICAgICAgICAgICAgbUhhbmRsZXIucG9zdChtSGlkZVNlbGVjdG9yKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIERpc21pc3MgdGhlIHBvcHVwIHdpbmRvdy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkaXNtaXNzKCkgeworICAgICAgICBtUG9wdXAuZGlzbWlzcygpOworICAgICAgICByZW1vdmVQcm9tcHRWaWV3KCk7CisgICAgICAgIG1Qb3B1cC5zZXRDb250ZW50VmlldyhudWxsKTsKKyAgICAgICAgbURyb3BEb3duTGlzdCA9IG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IGEgbGlzdGVuZXIgdG8gcmVjZWl2ZSBhIGNhbGxiYWNrIHdoZW4gdGhlIHBvcHVwIGlzIGRpc21pc3NlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaXN0ZW5lciBMaXN0ZW5lciB0aGF0IHdpbGwgYmUgbm90aWZpZWQgd2hlbiB0aGUgcG9wdXAgaXMgZGlzbWlzc2VkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE9uRGlzbWlzc0xpc3RlbmVyKFBvcHVwV2luZG93Lk9uRGlzbWlzc0xpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgIG1Qb3B1cC5zZXRPbkRpc21pc3NMaXN0ZW5lcihsaXN0ZW5lcik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJlbW92ZVByb21wdFZpZXcoKSB7CisgICAgICAgIGlmIChtUHJvbXB0VmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICBmaW5hbCBWaWV3UGFyZW50IHBhcmVudCA9IG1Qcm9tcHRWaWV3LmdldFBhcmVudCgpOworICAgICAgICAgICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFZpZXdHcm91cCkgeworICAgICAgICAgICAgICAgIGZpbmFsIFZpZXdHcm91cCBncm91cCA9IChWaWV3R3JvdXApIHBhcmVudDsKKyAgICAgICAgICAgICAgICBncm91cC5yZW1vdmVWaWV3KG1Qcm9tcHRWaWV3KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnRyb2wgaG93IHRoZSBwb3B1cCBvcGVyYXRlcyB3aXRoIGFuIGlucHV0IG1ldGhvZDogb25lIG9mCisgICAgICoge0BsaW5rICNJTlBVVF9NRVRIT0RfRlJPTV9GT0NVU0FCTEV9LCB7QGxpbmsgI0lOUFVUX01FVEhPRF9ORUVERUR9LAorICAgICAqIG9yIHtAbGluayAjSU5QVVRfTUVUSE9EX05PVF9ORUVERUR9LgorICAgICAqIAorICAgICAqIDxwPklmIHRoZSBwb3B1cCBpcyBzaG93aW5nLCBjYWxsaW5nIHRoaXMgbWV0aG9kIHdpbGwgdGFrZSBlZmZlY3Qgb25seQorICAgICAqIHRoZSBuZXh0IHRpbWUgdGhlIHBvcHVwIGlzIHNob3duIG9yIHRocm91Z2ggYSBtYW51YWwgY2FsbCB0byB0aGUge0BsaW5rICNzaG93KCl9CisgICAgICogbWV0aG9kLjwvcD4KKyAgICAgKiAKKyAgICAgKiBAc2VlICNnZXRJbnB1dE1ldGhvZE1vZGUoKQorICAgICAqIEBzZWUgI3Nob3coKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldElucHV0TWV0aG9kTW9kZShpbnQgbW9kZSkgeworICAgICAgICBtUG9wdXAuc2V0SW5wdXRNZXRob2RNb2RlKG1vZGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgY3VycmVudCB2YWx1ZSBpbiB7QGxpbmsgI3NldElucHV0TWV0aG9kTW9kZShpbnQpfS4KKyAgICAgKiAKKyAgICAgKiBAc2VlICNzZXRJbnB1dE1ldGhvZE1vZGUoaW50KQorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0SW5wdXRNZXRob2RNb2RlKCkgeworICAgICAgICByZXR1cm4gbVBvcHVwLmdldElucHV0TWV0aG9kTW9kZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgc2VsZWN0ZWQgcG9zaXRpb24gb2YgdGhlIGxpc3QuCisgICAgICogT25seSB2YWxpZCB3aGVuIHtAbGluayAjaXNTaG93aW5nKCl9ID09IHtAY29kZSB0cnVlfS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcG9zaXRpb24gTGlzdCBwb3NpdGlvbiB0byBzZXQgYXMgc2VsZWN0ZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKGludCBwb3NpdGlvbikgeworICAgICAgICBEcm9wRG93bkxpc3RWaWV3IGxpc3QgPSBtRHJvcERvd25MaXN0OworICAgICAgICBpZiAoaXNTaG93aW5nKCkgJiYgbGlzdCAhPSBudWxsKSB7CisgICAgICAgICAgICBsaXN0Lm1MaXN0U2VsZWN0aW9uSGlkZGVuID0gZmFsc2U7CisgICAgICAgICAgICBsaXN0LnNldFNlbGVjdGlvbihwb3NpdGlvbik7CisgICAgICAgICAgICBpZiAobGlzdC5nZXRDaG9pY2VNb2RlKCkgIT0gTGlzdFZpZXcuQ0hPSUNFX01PREVfTk9ORSkgeworICAgICAgICAgICAgICAgIGxpc3Quc2V0SXRlbUNoZWNrZWQocG9zaXRpb24sIHRydWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xlYXIgYW55IGN1cnJlbnQgbGlzdCBzZWxlY3Rpb24uCisgICAgICogT25seSB2YWxpZCB3aGVuIHtAbGluayAjaXNTaG93aW5nKCl9ID09IHtAY29kZSB0cnVlfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjbGVhckxpc3RTZWxlY3Rpb24oKSB7CisgICAgICAgIGZpbmFsIERyb3BEb3duTGlzdFZpZXcgbGlzdCA9IG1Ecm9wRG93bkxpc3Q7CisgICAgICAgIGlmIChsaXN0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIFdBUk5JTkc6IFBsZWFzZSByZWFkIHRoZSBjb21tZW50IHdoZXJlIG1MaXN0U2VsZWN0aW9uSGlkZGVuIGlzIGRlY2xhcmVkCisgICAgICAgICAgICBsaXN0Lm1MaXN0U2VsZWN0aW9uSGlkZGVuID0gdHJ1ZTsKKyAgICAgICAgICAgIGxpc3QuaGlkZVNlbGVjdG9yKCk7CisgICAgICAgICAgICBsaXN0LnJlcXVlc3RMYXlvdXQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBwb3B1cCBpcyBjdXJyZW50bHkgc2hvd2luZywge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNTaG93aW5nKCkgeworICAgICAgICByZXR1cm4gbVBvcHVwLmlzU2hvd2luZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoaXMgcG9wdXAgaXMgY29uZmlndXJlZCB0byBhc3N1bWUgdGhlIHVzZXIgZG9lcyBub3QgbmVlZAorICAgICAqIHRvIGludGVyYWN0IHdpdGggdGhlIElNRSB3aGlsZSBpdCBpcyBzaG93aW5nLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0lucHV0TWV0aG9kTm90TmVlZGVkKCkgeworICAgICAgICByZXR1cm4gbVBvcHVwLmdldElucHV0TWV0aG9kTW9kZSgpID09IElOUFVUX01FVEhPRF9OT1RfTkVFREVEOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBlcmZvcm0gYW4gaXRlbSBjbGljayBvcGVyYXRpb24gb24gdGhlIHNwZWNpZmllZCBsaXN0IGFkYXB0ZXIgcG9zaXRpb24uCisgICAgICogCisgICAgICogQHBhcmFtIHBvc2l0aW9uIEFkYXB0ZXIgcG9zaXRpb24gZm9yIHBlcmZvcm1pbmcgdGhlIGNsaWNrCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBjbGljayBhY3Rpb24gY291bGQgYmUgcGVyZm9ybWVkLCBmYWxzZSBpZiBub3QuCisgICAgICogICAgICAgICAoZS5nLiBpZiB0aGUgcG9wdXAgd2FzIG5vdCBzaG93aW5nLCB0aGlzIG1ldGhvZCB3b3VsZCByZXR1cm4gZmFsc2UuKQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHBlcmZvcm1JdGVtQ2xpY2soaW50IHBvc2l0aW9uKSB7CisgICAgICAgIGlmIChpc1Nob3dpbmcoKSkgeworICAgICAgICAgICAgaWYgKG1JdGVtQ2xpY2tMaXN0ZW5lciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZmluYWwgRHJvcERvd25MaXN0VmlldyBsaXN0ID0gbURyb3BEb3duTGlzdDsKKyAgICAgICAgICAgICAgICBmaW5hbCBWaWV3IGNoaWxkID0gbGlzdC5nZXRDaGlsZEF0KHBvc2l0aW9uIC0gbGlzdC5nZXRGaXJzdFZpc2libGVQb3NpdGlvbigpKTsKKyAgICAgICAgICAgICAgICBtSXRlbUNsaWNrTGlzdGVuZXIub25JdGVtQ2xpY2sobGlzdCwgY2hpbGQsIHBvc2l0aW9uLCBjaGlsZC5nZXRJZCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgaXRlbSBvciBudWxsIGlmIHRoZSBwb3B1cCBpcyBub3Qgc2hvd2luZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGdldFNlbGVjdGVkSXRlbSgpIHsKKyAgICAgICAgaWYgKCFpc1Nob3dpbmcoKSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1Ecm9wRG93bkxpc3QuZ2V0U2VsZWN0ZWRJdGVtKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBUaGUgcG9zaXRpb24gb2YgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBpdGVtIG9yIHtAbGluayBMaXN0VmlldyNJTlZBTElEX1BPU0lUSU9OfQorICAgICAqIGlmIHtAbGluayAjaXNTaG93aW5nKCl9ID09IHtAY29kZSBmYWxzZX0uCisgICAgICogCisgICAgICogQHNlZSBMaXN0VmlldyNnZXRTZWxlY3RlZEl0ZW1Qb3NpdGlvbigpCisgICAgICovCisgICAgcHVibGljIGludCBnZXRTZWxlY3RlZEl0ZW1Qb3NpdGlvbigpIHsKKyAgICAgICAgaWYgKCFpc1Nob3dpbmcoKSkgeworICAgICAgICAgICAgcmV0dXJuIExpc3RWaWV3LklOVkFMSURfUE9TSVRJT047CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1Ecm9wRG93bkxpc3QuZ2V0U2VsZWN0ZWRJdGVtUG9zaXRpb24oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFRoZSBJRCBvZiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGl0ZW0gb3Ige0BsaW5rIExpc3RWaWV3I0lOVkFMSURfUk9XX0lEfQorICAgICAqIGlmIHtAbGluayAjaXNTaG93aW5nKCl9ID09IHtAY29kZSBmYWxzZX0uCisgICAgICogCisgICAgICogQHNlZSBMaXN0VmlldyNnZXRTZWxlY3RlZEl0ZW1JZCgpCisgICAgICovCisgICAgcHVibGljIGxvbmcgZ2V0U2VsZWN0ZWRJdGVtSWQoKSB7CisgICAgICAgIGlmICghaXNTaG93aW5nKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBMaXN0Vmlldy5JTlZBTElEX1JPV19JRDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbURyb3BEb3duTGlzdC5nZXRTZWxlY3RlZEl0ZW1JZCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gVGhlIFZpZXcgZm9yIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgaXRlbSBvciBudWxsIGlmCisgICAgICoge0BsaW5rICNpc1Nob3dpbmcoKX0gPT0ge0Bjb2RlIGZhbHNlfS4KKyAgICAgKiAKKyAgICAgKiBAc2VlIExpc3RWaWV3I2dldFNlbGVjdGVkVmlldygpCisgICAgICovCisgICAgcHVibGljIFZpZXcgZ2V0U2VsZWN0ZWRWaWV3KCkgeworICAgICAgICBpZiAoIWlzU2hvd2luZygpKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbURyb3BEb3duTGlzdC5nZXRTZWxlY3RlZFZpZXcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFRoZSB7QGxpbmsgTGlzdFZpZXd9IGRpc3BsYXllZCB3aXRoaW4gdGhlIHBvcHVwIHdpbmRvdy4KKyAgICAgKiBPbmx5IHZhbGlkIHdoZW4ge0BsaW5rICNpc1Nob3dpbmcoKX0gPT0ge0Bjb2RlIHRydWV9LgorICAgICAqLworICAgIHB1YmxpYyBMaXN0VmlldyBnZXRMaXN0VmlldygpIHsKKyAgICAgICAgcmV0dXJuIG1Ecm9wRG93bkxpc3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmlsdGVyIGtleSBkb3duIGV2ZW50cy4gQnkgZm9yd2FyZGluZyBrZXkgdXAgZXZlbnRzIHRvIHRoaXMgZnVuY3Rpb24sCisgICAgICogdmlld3MgdXNpbmcgbm9uLW1vZGFsIExpc3RQb3B1cFdpbmRvdyBjYW4gaGF2ZSBpdCBoYW5kbGUga2V5IHNlbGVjdGlvbiBvZiBpdGVtcy4KKyAgICAgKiAgCisgICAgICogQHBhcmFtIGtleUNvZGUga2V5Q29kZSBwYXJhbSBwYXNzZWQgdG8gdGhlIGhvc3QgdmlldydzIG9uS2V5RG93bgorICAgICAqIEBwYXJhbSBldmVudCBldmVudCBwYXJhbSBwYXNzZWQgdG8gdGhlIGhvc3QgdmlldydzIG9uS2V5RG93bgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZXZlbnQgd2FzIGhhbmRsZWQsIGZhbHNlIGlmIGl0IHdhcyBpZ25vcmVkLgorICAgICAqIAorICAgICAqIEBzZWUgI3NldE1vZGFsKGJvb2xlYW4pCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gb25LZXlEb3duKGludCBrZXlDb2RlLCBLZXlFdmVudCBldmVudCkgeworICAgICAgICAvLyB3aGVuIHRoZSBkcm9wIGRvd24gaXMgc2hvd24sIHdlIGRyaXZlIGl0IGRpcmVjdGx5CisgICAgICAgIGlmIChpc1Nob3dpbmcoKSkgeworICAgICAgICAgICAgLy8gdGhlIGtleSBldmVudHMgYXJlIGZvcndhcmRlZCB0byB0aGUgbGlzdCBpbiB0aGUgZHJvcCBkb3duIHZpZXcKKyAgICAgICAgICAgIC8vIG5vdGUgdGhhdCBMaXN0VmlldyBoYW5kbGVzIHNwYWNlIGJ1dCB3ZSBkb24ndCB3YW50IHRoYXQgdG8gaGFwcGVuCisgICAgICAgICAgICAvLyBhbHNvIGlmIHNlbGVjdGlvbiBpcyBub3QgY3VycmVudGx5IGluIHRoZSBkcm9wIGRvd24sIHRoZW4gZG9uJ3QKKyAgICAgICAgICAgIC8vIGxldCBjZW50ZXIgb3IgZW50ZXIgcHJlc3NlcyBnbyB0aGVyZSBzaW5jZSB0aGF0IHdvdWxkIGNhdXNlIGl0CisgICAgICAgICAgICAvLyB0byBzZWxlY3Qgb25lIG9mIGl0cyBpdGVtcworICAgICAgICAgICAgaWYgKGtleUNvZGUgIT0gS2V5RXZlbnQuS0VZQ09ERV9TUEFDRQorICAgICAgICAgICAgICAgICAgICAmJiAobURyb3BEb3duTGlzdC5nZXRTZWxlY3RlZEl0ZW1Qb3NpdGlvbigpID49IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoa2V5Q29kZSAhPSBLZXlFdmVudC5LRVlDT0RFX0VOVEVSCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBrZXlDb2RlICE9IEtleUV2ZW50LktFWUNPREVfRFBBRF9DRU5URVIpKSkgeworICAgICAgICAgICAgICAgIGludCBjdXJJbmRleCA9IG1Ecm9wRG93bkxpc3QuZ2V0U2VsZWN0ZWRJdGVtUG9zaXRpb24oKTsKKyAgICAgICAgICAgICAgICBib29sZWFuIGNvbnN1bWVkOworCisgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBiZWxvdyA9ICFtUG9wdXAuaXNBYm92ZUFuY2hvcigpOworCisgICAgICAgICAgICAgICAgZmluYWwgTGlzdEFkYXB0ZXIgYWRhcHRlciA9IG1BZGFwdGVyOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGJvb2xlYW4gYWxsRW5hYmxlZDsKKyAgICAgICAgICAgICAgICBpbnQgZmlyc3RJdGVtID0gSW50ZWdlci5NQVhfVkFMVUU7CisgICAgICAgICAgICAgICAgaW50IGxhc3RJdGVtID0gSW50ZWdlci5NSU5fVkFMVUU7CisKKyAgICAgICAgICAgICAgICBpZiAoYWRhcHRlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGFsbEVuYWJsZWQgPSBhZGFwdGVyLmFyZUFsbEl0ZW1zRW5hYmxlZCgpOworICAgICAgICAgICAgICAgICAgICBmaXJzdEl0ZW0gPSBhbGxFbmFibGVkID8gMCA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbURyb3BEb3duTGlzdC5sb29rRm9yU2VsZWN0YWJsZVBvc2l0aW9uKDAsIHRydWUpOworICAgICAgICAgICAgICAgICAgICBsYXN0SXRlbSA9IGFsbEVuYWJsZWQgPyBhZGFwdGVyLmdldENvdW50KCkgLSAxIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRHJvcERvd25MaXN0Lmxvb2tGb3JTZWxlY3RhYmxlUG9zaXRpb24oYWRhcHRlci5nZXRDb3VudCgpIC0gMSwgZmFsc2UpOyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmICgoYmVsb3cgJiYga2V5Q29kZSA9PSBLZXlFdmVudC5LRVlDT0RFX0RQQURfVVAgJiYgY3VySW5kZXggPD0gZmlyc3RJdGVtKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgKCFiZWxvdyAmJiBrZXlDb2RlID09IEtleUV2ZW50LktFWUNPREVfRFBBRF9ET1dOICYmIGN1ckluZGV4ID49IGxhc3RJdGVtKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBXaGVuIHRoZSBzZWxlY3Rpb24gaXMgYXQgdGhlIHRvcCwgd2UgYmxvY2sgdGhlIGtleQorICAgICAgICAgICAgICAgICAgICAvLyBldmVudCB0byBwcmV2ZW50IGZvY3VzIGZyb20gbW92aW5nLgorICAgICAgICAgICAgICAgICAgICBjbGVhckxpc3RTZWxlY3Rpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgbVBvcHVwLnNldElucHV0TWV0aG9kTW9kZShQb3B1cFdpbmRvdy5JTlBVVF9NRVRIT0RfTkVFREVEKTsKKyAgICAgICAgICAgICAgICAgICAgc2hvdygpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBXQVJOSU5HOiBQbGVhc2UgcmVhZCB0aGUgY29tbWVudCB3aGVyZSBtTGlzdFNlbGVjdGlvbkhpZGRlbgorICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICBpcyBkZWNsYXJlZAorICAgICAgICAgICAgICAgICAgICBtRHJvcERvd25MaXN0Lm1MaXN0U2VsZWN0aW9uSGlkZGVuID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY29uc3VtZWQgPSBtRHJvcERvd25MaXN0Lm9uS2V5RG93bihrZXlDb2RlLCBldmVudCk7CisgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJLZXkgZG93bjogY29kZT0iICsga2V5Q29kZSArICIgbGlzdCBjb25zdW1lZD0iICsgY29uc3VtZWQpOworCisgICAgICAgICAgICAgICAgaWYgKGNvbnN1bWVkKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIElmIGl0IGhhbmRsZWQgdGhlIGtleSBldmVudCwgdGhlbiB0aGUgdXNlciBpcworICAgICAgICAgICAgICAgICAgICAvLyBuYXZpZ2F0aW5nIGluIHRoZSBsaXN0LCBzbyB3ZSBzaG91bGQgcHV0IGl0IGluIGZyb250LgorICAgICAgICAgICAgICAgICAgICBtUG9wdXAuc2V0SW5wdXRNZXRob2RNb2RlKFBvcHVwV2luZG93LklOUFVUX01FVEhPRF9OT1RfTkVFREVEKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gSGVyZSdzIGEgbGl0dGxlIHRyaWNrIHdlIG5lZWQgdG8gZG8gdG8gbWFrZSBzdXJlIHRoYXQKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGxpc3QgdmlldyBpcyBhY3R1YWxseSBzaG93aW5nIGl0cyBmb2N1cyBpbmRpY2F0b3IsCisgICAgICAgICAgICAgICAgICAgIC8vIGJ5IGVuc3VyaW5nIGl0IGhhcyBmb2N1cyBhbmQgZ2V0dGluZyBpdHMgd2luZG93IG91dAorICAgICAgICAgICAgICAgICAgICAvLyBvZiB0b3VjaCBtb2RlLgorICAgICAgICAgICAgICAgICAgICBtRHJvcERvd25MaXN0LnJlcXVlc3RGb2N1c0Zyb21Ub3VjaCgpOworICAgICAgICAgICAgICAgICAgICBzaG93KCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChrZXlDb2RlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBhdm9pZCBwYXNzaW5nIHRoZSBmb2N1cyBmcm9tIHRoZSB0ZXh0IHZpZXcgdG8gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXh0IGNvbXBvbmVudAorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5LRVlDT0RFX0VOVEVSOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5LRVlDT0RFX0RQQURfQ0VOVEVSOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5LRVlDT0RFX0RQQURfRE9XTjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX1VQOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJlbG93ICYmIGtleUNvZGUgPT0gS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0RPV04pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoZW4gdGhlIHNlbGVjdGlvbiBpcyBhdCB0aGUgYm90dG9tLCB3ZSBibG9jayB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV2ZW50IHRvIGF2b2lkIGdvaW5nIHRvIHRoZSBuZXh0IGZvY3VzYWJsZSB3aWRnZXQKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJJbmRleCA9PSBsYXN0SXRlbSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFiZWxvdyAmJiBrZXlDb2RlID09IEtleUV2ZW50LktFWUNPREVfRFBBRF9VUCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1ckluZGV4ID09IGZpcnN0SXRlbSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmlsdGVyIGtleSBkb3duIGV2ZW50cy4gQnkgZm9yd2FyZGluZyBrZXkgdXAgZXZlbnRzIHRvIHRoaXMgZnVuY3Rpb24sCisgICAgICogdmlld3MgdXNpbmcgbm9uLW1vZGFsIExpc3RQb3B1cFdpbmRvdyBjYW4gaGF2ZSBpdCBoYW5kbGUga2V5IHNlbGVjdGlvbiBvZiBpdGVtcy4KKyAgICAgKiAgCisgICAgICogQHBhcmFtIGtleUNvZGUga2V5Q29kZSBwYXJhbSBwYXNzZWQgdG8gdGhlIGhvc3QgdmlldydzIG9uS2V5VXAKKyAgICAgKiBAcGFyYW0gZXZlbnQgZXZlbnQgcGFyYW0gcGFzc2VkIHRvIHRoZSBob3N0IHZpZXcncyBvbktleVVwCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBldmVudCB3YXMgaGFuZGxlZCwgZmFsc2UgaWYgaXQgd2FzIGlnbm9yZWQuCisgICAgICogCisgICAgICogQHNlZSAjc2V0TW9kYWwoYm9vbGVhbikKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBvbktleVVwKGludCBrZXlDb2RlLCBLZXlFdmVudCBldmVudCkgeworICAgICAgICBpZiAoaXNTaG93aW5nKCkgJiYgbURyb3BEb3duTGlzdC5nZXRTZWxlY3RlZEl0ZW1Qb3NpdGlvbigpID49IDApIHsKKyAgICAgICAgICAgIGJvb2xlYW4gY29uc3VtZWQgPSBtRHJvcERvd25MaXN0Lm9uS2V5VXAoa2V5Q29kZSwgZXZlbnQpOworICAgICAgICAgICAgaWYgKGNvbnN1bWVkKSB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChrZXlDb2RlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBsaXN0IGFjY2VwdHMgdGhlIGtleSBldmVudHMgYW5kIHRoZSBrZXkgZXZlbnQKKyAgICAgICAgICAgICAgICAgICAgLy8gd2FzIGEgY2xpY2ssIHRoZSB0ZXh0IHZpZXcgZ2V0cyB0aGUgc2VsZWN0ZWQgaXRlbQorICAgICAgICAgICAgICAgICAgICAvLyBmcm9tIHRoZSBkcm9wIGRvd24gYXMgaXRzIGNvbnRlbnQKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5LRVlDT0RFX0VOVEVSOgorICAgICAgICAgICAgICAgICAgICBjYXNlIEtleUV2ZW50LktFWUNPREVfRFBBRF9DRU5URVI6CisgICAgICAgICAgICAgICAgICAgICAgICBkaXNtaXNzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gY29uc3VtZWQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbHRlciBwcmUtSU1FIGtleSBldmVudHMuIEJ5IGZvcndhcmRpbmcge0BsaW5rIFZpZXcjb25LZXlQcmVJbWUoaW50LCBLZXlFdmVudCl9CisgICAgICogZXZlbnRzIHRvIHRoaXMgZnVuY3Rpb24sIHZpZXdzIHVzaW5nIExpc3RQb3B1cFdpbmRvdyBjYW4gaGF2ZSBpdCBkaXNtaXNzIHRoZSBwb3B1cAorICAgICAqIHdoZW4gdGhlIGJhY2sga2V5IGlzIHByZXNzZWQuCisgICAgICogIAorICAgICAqIEBwYXJhbSBrZXlDb2RlIGtleUNvZGUgcGFyYW0gcGFzc2VkIHRvIHRoZSBob3N0IHZpZXcncyBvbktleVByZUltZQorICAgICAqIEBwYXJhbSBldmVudCBldmVudCBwYXJhbSBwYXNzZWQgdG8gdGhlIGhvc3QgdmlldydzIG9uS2V5UHJlSW1lCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBldmVudCB3YXMgaGFuZGxlZCwgZmFsc2UgaWYgaXQgd2FzIGlnbm9yZWQuCisgICAgICogCisgICAgICogQHNlZSAjc2V0TW9kYWwoYm9vbGVhbikKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBvbktleVByZUltZShpbnQga2V5Q29kZSwgS2V5RXZlbnQgZXZlbnQpIHsKKyAgICAgICAgaWYgKGtleUNvZGUgPT0gS2V5RXZlbnQuS0VZQ09ERV9CQUNLICYmIGlzU2hvd2luZygpKSB7CisgICAgICAgICAgICAvLyBzcGVjaWFsIGNhc2UgZm9yIHRoZSBiYWNrIGtleSwgd2UgZG8gbm90IGV2ZW4gdHJ5IHRvIHNlbmQgaXQKKyAgICAgICAgICAgIC8vIHRvIHRoZSBkcm9wIGRvd24gbGlzdCBidXQgaW5zdGVhZCwgY29uc3VtZSBpdCBpbW1lZGlhdGVseQorICAgICAgICAgICAgZmluYWwgVmlldyBhbmNob3JWaWV3ID0gbURyb3BEb3duQW5jaG9yVmlldzsKKyAgICAgICAgICAgIGlmIChldmVudC5nZXRBY3Rpb24oKSA9PSBLZXlFdmVudC5BQ1RJT05fRE9XTiAmJiBldmVudC5nZXRSZXBlYXRDb3VudCgpID09IDApIHsKKyAgICAgICAgICAgICAgICBhbmNob3JWaWV3LmdldEtleURpc3BhdGNoZXJTdGF0ZSgpLnN0YXJ0VHJhY2tpbmcoZXZlbnQsIHRoaXMpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudC5nZXRBY3Rpb24oKSA9PSBLZXlFdmVudC5BQ1RJT05fVVApIHsKKyAgICAgICAgICAgICAgICBhbmNob3JWaWV3LmdldEtleURpc3BhdGNoZXJTdGF0ZSgpLmhhbmRsZVVwRXZlbnQoZXZlbnQpOworICAgICAgICAgICAgICAgIGlmIChldmVudC5pc1RyYWNraW5nKCkgJiYgIWV2ZW50LmlzQ2FuY2VsZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBkaXNtaXNzKCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogPHA+QnVpbGRzIHRoZSBwb3B1cCB3aW5kb3cncyBjb250ZW50IGFuZCByZXR1cm5zIHRoZSBoZWlnaHQgdGhlIHBvcHVwCisgICAgICogc2hvdWxkIGhhdmUuIFJldHVybnMgLTEgd2hlbiB0aGUgY29udGVudCBhbHJlYWR5IGV4aXN0cy48L3A+CisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBjb250ZW50J3MgaGVpZ2h0IG9yIC0xIGlmIGNvbnRlbnQgYWxyZWFkeSBleGlzdHMKKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBidWlsZERyb3BEb3duKCkgeworICAgICAgICBWaWV3R3JvdXAgZHJvcERvd25WaWV3OworICAgICAgICBpbnQgb3RoZXJIZWlnaHRzID0gMDsKKworICAgICAgICBpZiAobURyb3BEb3duTGlzdCA9PSBudWxsKSB7CisgICAgICAgICAgICBDb250ZXh0IGNvbnRleHQgPSBtQ29udGV4dDsKKworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBUaGlzIFJ1bm5hYmxlIGV4aXN0cyBmb3IgdGhlIHNvbGUgcHVycG9zZSBvZiBjaGVja2luZyBpZiB0aGUgdmlldyBsYXlvdXQgaGFzIGdvdAorICAgICAgICAgICAgICogY29tcGxldGVkIGFuZCBpZiBzbyBjYWxsIHNob3dEcm9wRG93biB0byBkaXNwbGF5IHRoZSBkcm9wIGRvd24uIFRoaXMgaXMgdXNlZCB0byBzaG93CisgICAgICAgICAgICAgKiB0aGUgZHJvcCBkb3duIGFzIHNvb24gYXMgcG9zc2libGUgYWZ0ZXIgdXNlciBvcGVucyB1cCB0aGUgc2VhcmNoIGRpYWxvZywgd2l0aG91dAorICAgICAgICAgICAgICogd2FpdGluZyBmb3IgdGhlIG5vcm1hbCBVSSBwaXBlbGluZSB0byBkbyBpdCdzIGpvYiB3aGljaCBpcyBzbG93ZXIgdGhhbiB0aGlzIG1ldGhvZC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgbVNob3dEcm9wRG93blJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVmlldyBsYXlvdXQgc2hvdWxkIGJlIGFsbCBkb25lIGJlZm9yZSBkaXNwbGF5aW5nIHRoZSBkcm9wIGRvd24uCisgICAgICAgICAgICAgICAgICAgIFZpZXcgdmlldyA9IGdldEFuY2hvclZpZXcoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZpZXcgIT0gbnVsbCAmJiB2aWV3LmdldFdpbmRvd1Rva2VuKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2hvdygpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgbURyb3BEb3duTGlzdCA9IG5ldyBEcm9wRG93bkxpc3RWaWV3KGNvbnRleHQsICFtTW9kYWwpOworICAgICAgICAgICAgaWYgKG1Ecm9wRG93bkxpc3RIaWdobGlnaHQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1Ecm9wRG93bkxpc3Quc2V0U2VsZWN0b3IobURyb3BEb3duTGlzdEhpZ2hsaWdodCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtRHJvcERvd25MaXN0LnNldEFkYXB0ZXIobUFkYXB0ZXIpOworICAgICAgICAgICAgbURyb3BEb3duTGlzdC5zZXRWZXJ0aWNhbEZhZGluZ0VkZ2VFbmFibGVkKHRydWUpOworICAgICAgICAgICAgbURyb3BEb3duTGlzdC5zZXRPbkl0ZW1DbGlja0xpc3RlbmVyKG1JdGVtQ2xpY2tMaXN0ZW5lcik7CisgICAgICAgICAgICBtRHJvcERvd25MaXN0LnNldEZvY3VzYWJsZSh0cnVlKTsKKyAgICAgICAgICAgIG1Ecm9wRG93bkxpc3Quc2V0Rm9jdXNhYmxlSW5Ub3VjaE1vZGUodHJ1ZSk7CisgICAgICAgICAgICBtRHJvcERvd25MaXN0LnNldE9uSXRlbVNlbGVjdGVkTGlzdGVuZXIobmV3IEFkYXB0ZXJWaWV3Lk9uSXRlbVNlbGVjdGVkTGlzdGVuZXIoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25JdGVtU2VsZWN0ZWQoQWRhcHRlclZpZXc8Pz4gcGFyZW50LCBWaWV3IHZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcG9zaXRpb24sIGxvbmcgaWQpIHsKKworICAgICAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24gIT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIERyb3BEb3duTGlzdFZpZXcgZHJvcERvd25MaXN0ID0gbURyb3BEb3duTGlzdDsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRyb3BEb3duTGlzdCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJvcERvd25MaXN0Lm1MaXN0U2VsZWN0aW9uSGlkZGVuID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbk5vdGhpbmdTZWxlY3RlZChBZGFwdGVyVmlldzw/PiBwYXJlbnQpIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIG1Ecm9wRG93bkxpc3Quc2V0T25TY3JvbGxMaXN0ZW5lcihtU2Nyb2xsTGlzdGVuZXIpOworCisgICAgICAgICAgICBpZiAobUl0ZW1TZWxlY3RlZExpc3RlbmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtRHJvcERvd25MaXN0LnNldE9uSXRlbVNlbGVjdGVkTGlzdGVuZXIobUl0ZW1TZWxlY3RlZExpc3RlbmVyKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZHJvcERvd25WaWV3ID0gbURyb3BEb3duTGlzdDsKKworICAgICAgICAgICAgVmlldyBoaW50VmlldyA9IG1Qcm9tcHRWaWV3OworICAgICAgICAgICAgaWYgKGhpbnRWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAvLyBpZiBhbiBoaW50IGhhcyBiZWVuIHNwZWNpZmllZCwgd2UgYWNjb21vZGF0ZSBtb3JlIHNwYWNlIGZvciBpdCBhbmQKKyAgICAgICAgICAgICAgICAvLyBhZGQgYSB0ZXh0IHZpZXcgaW4gdGhlIGRyb3AgZG93biBtZW51LCBhdCB0aGUgYm90dG9tIG9mIHRoZSBsaXN0CisgICAgICAgICAgICAgICAgTGluZWFyTGF5b3V0IGhpbnRDb250YWluZXIgPSBuZXcgTGluZWFyTGF5b3V0KGNvbnRleHQpOworICAgICAgICAgICAgICAgIGhpbnRDb250YWluZXIuc2V0T3JpZW50YXRpb24oTGluZWFyTGF5b3V0LlZFUlRJQ0FMKTsKKworICAgICAgICAgICAgICAgIExpbmVhckxheW91dC5MYXlvdXRQYXJhbXMgaGludFBhcmFtcyA9IG5ldyBMaW5lYXJMYXlvdXQuTGF5b3V0UGFyYW1zKAorICAgICAgICAgICAgICAgICAgICAgICAgVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQsIDAsIDEuMGYKKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHN3aXRjaCAobVByb21wdFBvc2l0aW9uKSB7CisgICAgICAgICAgICAgICAgY2FzZSBQT1NJVElPTl9QUk9NUFRfQkVMT1c6CisgICAgICAgICAgICAgICAgICAgIGhpbnRDb250YWluZXIuYWRkVmlldyhkcm9wRG93blZpZXcsIGhpbnRQYXJhbXMpOworICAgICAgICAgICAgICAgICAgICBoaW50Q29udGFpbmVyLmFkZFZpZXcoaGludFZpZXcpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgY2FzZSBQT1NJVElPTl9QUk9NUFRfQUJPVkU6CisgICAgICAgICAgICAgICAgICAgIGhpbnRDb250YWluZXIuYWRkVmlldyhoaW50Vmlldyk7CisgICAgICAgICAgICAgICAgICAgIGhpbnRDb250YWluZXIuYWRkVmlldyhkcm9wRG93blZpZXcsIGhpbnRQYXJhbXMpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiSW52YWxpZCBoaW50IHBvc2l0aW9uICIgKyBtUHJvbXB0UG9zaXRpb24pOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBtZWFzdXJlIHRoZSBoaW50J3MgaGVpZ2h0IHRvIGZpbmQgaG93IG11Y2ggbW9yZSB2ZXJ0aWNhbCBzcGFjZQorICAgICAgICAgICAgICAgIC8vIHdlIG5lZWQgdG8gYWRkIHRvIHRoZSBkcm9wIGRvd24ncyBoZWlnaHQKKyAgICAgICAgICAgICAgICBpbnQgd2lkdGhTcGVjID0gTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKG1Ecm9wRG93bldpZHRoLCBNZWFzdXJlU3BlYy5BVF9NT1NUKTsKKyAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0U3BlYyA9IE1lYXN1cmVTcGVjLlVOU1BFQ0lGSUVEOworICAgICAgICAgICAgICAgIGhpbnRWaWV3Lm1lYXN1cmUod2lkdGhTcGVjLCBoZWlnaHRTcGVjKTsKKworICAgICAgICAgICAgICAgIGhpbnRQYXJhbXMgPSAoTGluZWFyTGF5b3V0LkxheW91dFBhcmFtcykgaGludFZpZXcuZ2V0TGF5b3V0UGFyYW1zKCk7CisgICAgICAgICAgICAgICAgb3RoZXJIZWlnaHRzID0gaGludFZpZXcuZ2V0TWVhc3VyZWRIZWlnaHQoKSArIGhpbnRQYXJhbXMudG9wTWFyZ2luCisgICAgICAgICAgICAgICAgICAgICAgICArIGhpbnRQYXJhbXMuYm90dG9tTWFyZ2luOworCisgICAgICAgICAgICAgICAgZHJvcERvd25WaWV3ID0gaGludENvbnRhaW5lcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbVBvcHVwLnNldENvbnRlbnRWaWV3KGRyb3BEb3duVmlldyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkcm9wRG93blZpZXcgPSAoVmlld0dyb3VwKSBtUG9wdXAuZ2V0Q29udGVudFZpZXcoKTsKKyAgICAgICAgICAgIGZpbmFsIFZpZXcgdmlldyA9IG1Qcm9tcHRWaWV3OworICAgICAgICAgICAgaWYgKHZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIExpbmVhckxheW91dC5MYXlvdXRQYXJhbXMgaGludFBhcmFtcyA9CisgICAgICAgICAgICAgICAgICAgICAgICAoTGluZWFyTGF5b3V0LkxheW91dFBhcmFtcykgdmlldy5nZXRMYXlvdXRQYXJhbXMoKTsKKyAgICAgICAgICAgICAgICBvdGhlckhlaWdodHMgPSB2aWV3LmdldE1lYXN1cmVkSGVpZ2h0KCkgKyBoaW50UGFyYW1zLnRvcE1hcmdpbgorICAgICAgICAgICAgICAgICAgICAgICAgKyBoaW50UGFyYW1zLmJvdHRvbU1hcmdpbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIE1heCBoZWlnaHQgYXZhaWxhYmxlIG9uIHRoZSBzY3JlZW4gZm9yIGEgcG9wdXAuCisgICAgICAgIGJvb2xlYW4gaWdub3JlQm90dG9tRGVjb3JhdGlvbnMgPQorICAgICAgICAgICAgICAgIG1Qb3B1cC5nZXRJbnB1dE1ldGhvZE1vZGUoKSA9PSBQb3B1cFdpbmRvdy5JTlBVVF9NRVRIT0RfTk9UX05FRURFRDsKKyAgICAgICAgZmluYWwgaW50IG1heEhlaWdodCA9IG1Qb3B1cC5nZXRNYXhBdmFpbGFibGVIZWlnaHQoCisgICAgICAgICAgICAgICAgZ2V0QW5jaG9yVmlldygpLCBtRHJvcERvd25WZXJ0aWNhbE9mZnNldCwgaWdub3JlQm90dG9tRGVjb3JhdGlvbnMpOworCisgICAgICAgIC8vIGdldE1heEF2YWlsYWJsZUhlaWdodCgpIHN1YnRyYWN0cyB0aGUgcGFkZGluZywgc28gd2UgcHV0IGl0IGJhY2ssCisgICAgICAgIC8vIHRvIGdldCB0aGUgYXZhaWxhYmxlIGhlaWdodCBmb3IgdGhlIHdob2xlIHdpbmRvdworICAgICAgICBpbnQgcGFkZGluZyA9IDA7CisgICAgICAgIERyYXdhYmxlIGJhY2tncm91bmQgPSBtUG9wdXAuZ2V0QmFja2dyb3VuZCgpOworICAgICAgICBpZiAoYmFja2dyb3VuZCAhPSBudWxsKSB7CisgICAgICAgICAgICBiYWNrZ3JvdW5kLmdldFBhZGRpbmcobVRlbXBSZWN0KTsKKyAgICAgICAgICAgIHBhZGRpbmcgPSBtVGVtcFJlY3QudG9wICsgbVRlbXBSZWN0LmJvdHRvbTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtRHJvcERvd25BbHdheXNWaXNpYmxlIHx8IG1Ecm9wRG93bkhlaWdodCA9PSBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCkgeworICAgICAgICAgICAgcmV0dXJuIG1heEhlaWdodCArIHBhZGRpbmc7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBpbnQgbGlzdENvbnRlbnQgPSBtRHJvcERvd25MaXN0Lm1lYXN1cmVIZWlnaHRPZkNoaWxkcmVuKE1lYXN1cmVTcGVjLlVOU1BFQ0lGSUVELAorICAgICAgICAgICAgICAgIDAsIExpc3RWaWV3Lk5PX1BPU0lUSU9OLCBtYXhIZWlnaHQgLSBvdGhlckhlaWdodHMsIDIpOworICAgICAgICAvLyBhZGQgcGFkZGluZyBvbmx5IGlmIHRoZSBsaXN0IGhhcyBpdGVtcyBpbiBpdCwgdGhhdCB3YXkgd2UgZG9uJ3Qgc2hvdworICAgICAgICAvLyB0aGUgcG9wdXAgaWYgaXQgaXMgbm90IG5lZWRlZAorICAgICAgICBpZiAobGlzdENvbnRlbnQgPiAwKSBvdGhlckhlaWdodHMgKz0gcGFkZGluZzsKKworICAgICAgICByZXR1cm4gbGlzdENvbnRlbnQgKyBvdGhlckhlaWdodHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogPHA+V3JhcHBlciBjbGFzcyBmb3IgYSBMaXN0Vmlldy4gVGhpcyB3cmFwcGVyIGNhbiBoaWphY2sgdGhlIGZvY3VzIHRvCisgICAgICogbWFrZSBzdXJlIHRoZSBsaXN0IHVzZXMgdGhlIGFwcHJvcHJpYXRlIGRyYXdhYmxlcyBhbmQgc3RhdGVzIHdoZW4KKyAgICAgKiBkaXNwbGF5ZWQgb24gc2NyZWVuIHdpdGhpbiBhIGRyb3AgZG93bi4gVGhlIGZvY3VzIGlzIG5ldmVyIGFjdHVhbGx5CisgICAgICogcGFzc2VkIHRvIHRoZSBkcm9wIGRvd24gaW4gdGhpcyBtb2RlOyB0aGUgbGlzdCBvbmx5IGxvb2tzIGZvY3VzZWQuPC9wPgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIERyb3BEb3duTGlzdFZpZXcgZXh0ZW5kcyBMaXN0VmlldyB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSBMaXN0UG9wdXBXaW5kb3cuVEFHICsgIi5Ecm9wRG93bkxpc3RWaWV3IjsKKyAgICAgICAgLyoKKyAgICAgICAgICogV0FSTklORzogVGhpcyBpcyBhIHdvcmthcm91bmQgZm9yIGEgdG91Y2ggbW9kZSBpc3N1ZS4KKyAgICAgICAgICoKKyAgICAgICAgICogVG91Y2ggbW9kZSBpcyBwcm9wYWdhdGVkIGxhemlseSB0byB3aW5kb3dzLiBUaGlzIGNhdXNlcyBwcm9ibGVtcyBpbgorICAgICAgICAgKiB0aGUgZm9sbG93aW5nIHNjZW5hcmlvOgorICAgICAgICAgKiAtIFR5cGUgc29tZXRoaW5nIGluIHRoZSBBdXRvQ29tcGxldGVUZXh0VmlldyBhbmQgZ2V0IHNvbWUgcmVzdWx0cworICAgICAgICAgKiAtIE1vdmUgZG93biB3aXRoIHRoZSBkLXBhZCB0byBzZWxlY3QgYW4gaXRlbSBpbiB0aGUgbGlzdAorICAgICAgICAgKiAtIE1vdmUgdXAgd2l0aCB0aGUgZC1wYWQgdW50aWwgdGhlIHNlbGVjdGlvbiBkaXNhcHBlYXJzCisgICAgICAgICAqIC0gVHlwZSBtb3JlIHRleHQgaW4gdGhlIEF1dG9Db21wbGV0ZVRleHRWaWV3ICp1c2luZyB0aGUgc29mdCBrZXlib2FyZCoKKyAgICAgICAgICogICBhbmQgZ2V0IG5ldyByZXN1bHRzOyB5b3UgYXJlIG5vdyBpbiB0b3VjaCBtb2RlCisgICAgICAgICAqIC0gVGhlIHNlbGVjdGlvbiBjb21lcyBiYWNrIG9uIHRoZSBmaXJzdCBpdGVtIGluIHRoZSBsaXN0LCBldmVuIHRob3VnaAorICAgICAgICAgKiAgIHRoZSBsaXN0IGlzIHN1cHBvc2VkIHRvIGJlIGluIHRvdWNoIG1vZGUKKyAgICAgICAgICoKKyAgICAgICAgICogVXNpbmcgdGhlIHNvZnQga2V5Ym9hcmQgdHJpZ2dlcnMgdGhlIHRvdWNoIG1vZGUgY2hhbmdlIGJ1dCB0aGF0IGNoYW5nZQorICAgICAgICAgKiBpcyBwcm9wYWdhdGVkIHRvIG91ciB3aW5kb3cgb25seSBhZnRlciB0aGUgZmlyc3QgbGlzdCBsYXlvdXQsIHRoZXJlZm9yZQorICAgICAgICAgKiBhZnRlciB0aGUgbGlzdCBhdHRlbXB0cyB0byByZXN1cnJlY3QgdGhlIHNlbGVjdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogVGhlIHRyaWNrIHRvIHdvcmsgYXJvdW5kIHRoaXMgaXNzdWUgaXMgdG8gcHJldGVuZCB0aGUgbGlzdCBpcyBpbiB0b3VjaAorICAgICAgICAgKiBtb2RlIHdoZW4gd2Uga25vdyB0aGF0IHRoZSBzZWxlY3Rpb24gc2hvdWxkIG5vdCBhcHBlYXIsIHRoYXQgaXMgd2hlbgorICAgICAgICAgKiB3ZSBrbm93IHRoZSB1c2VyIG1vdmVkIHRoZSBzZWxlY3Rpb24gYXdheSBmcm9tIHRoZSBsaXN0LgorICAgICAgICAgKgorICAgICAgICAgKiBUaGlzIGJvb2xlYW4gaXMgc2V0IHRvIHRydWUgd2hlbmV2ZXIgd2UgZXhwbGljaXRseSBoaWRlIHRoZSBsaXN0J3MKKyAgICAgICAgICogc2VsZWN0aW9uIGFuZCByZXNldCB0byBmYWxzZSB3aGVuZXZlciB3ZSBrbm93IHRoZSB1c2VyIG1vdmVkIHRoZQorICAgICAgICAgKiBzZWxlY3Rpb24gYmFjayB0byB0aGUgbGlzdC4KKyAgICAgICAgICoKKyAgICAgICAgICogV2hlbiB0aGlzIGJvb2xlYW4gaXMgdHJ1ZSwgaXNJblRvdWNoTW9kZSgpIHJldHVybnMgdHJ1ZSwgb3RoZXJ3aXNlIGl0CisgICAgICAgICAqIHJldHVybnMgc3VwZXIuaXNJblRvdWNoTW9kZSgpLgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1MaXN0U2VsZWN0aW9uSGlkZGVuOworICAgICAgICAKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRydWUgaWYgdGhpcyB3cmFwcGVyIHNob3VsZCBmYWtlIGZvY3VzLgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1IaWphY2tGb2N1czsKKworICAgICAgICAvKioKKyAgICAgICAgICogPHA+Q3JlYXRlcyBhIG5ldyBsaXN0IHZpZXcgd3JhcHBlci48L3A+CisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBjb250ZXh0IHRoaXMgdmlldydzIGNvbnRleHQKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBEcm9wRG93bkxpc3RWaWV3KENvbnRleHQgY29udGV4dCwgYm9vbGVhbiBoaWphY2tGb2N1cykgeworICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgbnVsbCwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hdHRyLmRyb3BEb3duTGlzdFZpZXdTdHlsZSk7CisgICAgICAgICAgICBtSGlqYWNrRm9jdXMgPSBoaWphY2tGb2N1czsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiA8cD5Bdm9pZHMgamFycmluZyBzY3JvbGxpbmcgZWZmZWN0IGJ5IGVuc3VyaW5nIHRoYXQgbGlzdCBlbGVtZW50cworICAgICAgICAgKiBtYWRlIG9mIGEgdGV4dCB2aWV3IGZpdCBvbiBhIHNpbmdsZSBsaW5lLjwvcD4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHBvc2l0aW9uIHRoZSBpdGVtIGluZGV4IGluIHRoZSBsaXN0IHRvIGdldCBhIHZpZXcgZm9yCisgICAgICAgICAqIEByZXR1cm4gdGhlIHZpZXcgZm9yIHRoZSBzcGVjaWZpZWQgaXRlbQorICAgICAgICAgKi8KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIFZpZXcgb2J0YWluVmlldyhpbnQgcG9zaXRpb24sIGJvb2xlYW5bXSBpc1NjcmFwKSB7CisgICAgICAgICAgICBWaWV3IHZpZXcgPSBzdXBlci5vYnRhaW5WaWV3KHBvc2l0aW9uLCBpc1NjcmFwKTsKKworICAgICAgICAgICAgaWYgKHZpZXcgaW5zdGFuY2VvZiBUZXh0VmlldykgeworICAgICAgICAgICAgICAgICgoVGV4dFZpZXcpIHZpZXcpLnNldEhvcml6b250YWxseVNjcm9sbGluZyh0cnVlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHZpZXc7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNJblRvdWNoTW9kZSgpIHsKKyAgICAgICAgICAgIC8vIFdBUk5JTkc6IFBsZWFzZSByZWFkIHRoZSBjb21tZW50IHdoZXJlIG1MaXN0U2VsZWN0aW9uSGlkZGVuIGlzIGRlY2xhcmVkCisgICAgICAgICAgICByZXR1cm4gKG1IaWphY2tGb2N1cyAmJiBtTGlzdFNlbGVjdGlvbkhpZGRlbikgfHwgc3VwZXIuaXNJblRvdWNoTW9kZSgpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIDxwPlJldHVybnMgdGhlIGZvY3VzIHN0YXRlIGluIHRoZSBkcm9wIGRvd24uPC9wPgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIHRydWUgYWx3YXlzIGlmIGhpamFja2luZyBmb2N1cworICAgICAgICAgKi8KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc1dpbmRvd0ZvY3VzKCkgeworICAgICAgICAgICAgcmV0dXJuIG1IaWphY2tGb2N1cyB8fCBzdXBlci5oYXNXaW5kb3dGb2N1cygpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIDxwPlJldHVybnMgdGhlIGZvY3VzIHN0YXRlIGluIHRoZSBkcm9wIGRvd24uPC9wPgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIHRydWUgYWx3YXlzIGlmIGhpamFja2luZyBmb2N1cworICAgICAgICAgKi8KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzRm9jdXNlZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtSGlqYWNrRm9jdXMgfHwgc3VwZXIuaXNGb2N1c2VkKCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogPHA+UmV0dXJucyB0aGUgZm9jdXMgc3RhdGUgaW4gdGhlIGRyb3AgZG93bi48L3A+CisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gdHJ1ZSBhbHdheXMgaWYgaGlqYWNraW5nIGZvY3VzCisgICAgICAgICAqLworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzRm9jdXMoKSB7CisgICAgICAgICAgICByZXR1cm4gbUhpamFja0ZvY3VzIHx8IHN1cGVyLmhhc0ZvY3VzKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIFBvcHVwRGF0YVNldE9ic2VydmVyIGV4dGVuZHMgRGF0YVNldE9ic2VydmVyIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2hhbmdlZCgpIHsKKyAgICAgICAgICAgIGlmIChpc1Nob3dpbmcoKSkgeworICAgICAgICAgICAgICAgIC8vIFJlc2l6ZSB0aGUgcG9wdXAgdG8gZml0IG5ldyBjb250ZW50CisgICAgICAgICAgICAgICAgc2hvdygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25JbnZhbGlkYXRlZCgpIHsKKyAgICAgICAgICAgIGRpc21pc3MoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgTGlzdFNlbGVjdG9ySGlkZXIgaW1wbGVtZW50cyBSdW5uYWJsZSB7CisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgIGNsZWFyTGlzdFNlbGVjdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBSZXNpemVQb3B1cFJ1bm5hYmxlIGltcGxlbWVudHMgUnVubmFibGUgeworICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICBtUG9wdXAuc2V0SW5wdXRNZXRob2RNb2RlKFBvcHVwV2luZG93LklOUFVUX01FVEhPRF9OT1RfTkVFREVEKTsKKyAgICAgICAgICAgIHNob3coKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgUG9wdXBUb3VjaEludGVyY2VwdG9yIGltcGxlbWVudHMgT25Ub3VjaExpc3RlbmVyIHsKKyAgICAgICAgcHVibGljIGJvb2xlYW4gb25Ub3VjaChWaWV3IHYsIE1vdGlvbkV2ZW50IGV2ZW50KSB7CisgICAgICAgICAgICBmaW5hbCBpbnQgYWN0aW9uID0gZXZlbnQuZ2V0QWN0aW9uKCk7CisgICAgICAgICAgICBmaW5hbCBpbnQgeCA9IChpbnQpIGV2ZW50LmdldFgoKTsKKyAgICAgICAgICAgIGZpbmFsIGludCB5ID0gKGludCkgZXZlbnQuZ2V0WSgpOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoYWN0aW9uID09IE1vdGlvbkV2ZW50LkFDVElPTl9ET1dOICYmCisgICAgICAgICAgICAgICAgICAgIG1Qb3B1cCAhPSBudWxsICYmIG1Qb3B1cC5pc1Nob3dpbmcoKSAmJgorICAgICAgICAgICAgICAgICAgICAoeCA+PSAwICYmIHggPCBnZXRXaWR0aCgpICYmIHkgPj0gMCAmJiB5IDwgZ2V0SGVpZ2h0KCkpKSB7CisgICAgICAgICAgICAgICAgbUhhbmRsZXIucG9zdERlbGF5ZWQobVJlc2l6ZVBvcHVwUnVubmFibGUsIEVYUEFORF9MSVNUX1RJTUVPVVQpOworICAgICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24gPT0gTW90aW9uRXZlbnQuQUNUSU9OX1VQKSB7CisgICAgICAgICAgICAgICAgbUhhbmRsZXIucmVtb3ZlQ2FsbGJhY2tzKG1SZXNpemVQb3B1cFJ1bm5hYmxlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgUG9wdXBTY3JvbGxMaXN0ZW5lciBpbXBsZW1lbnRzIExpc3RWaWV3Lk9uU2Nyb2xsTGlzdGVuZXIgeworICAgICAgICBwdWJsaWMgdm9pZCBvblNjcm9sbChBYnNMaXN0VmlldyB2aWV3LCBpbnQgZmlyc3RWaXNpYmxlSXRlbSwgaW50IHZpc2libGVJdGVtQ291bnQsCisgICAgICAgICAgICAgICAgaW50IHRvdGFsSXRlbUNvdW50KSB7CisKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG9uU2Nyb2xsU3RhdGVDaGFuZ2VkKEFic0xpc3RWaWV3IHZpZXcsIGludCBzY3JvbGxTdGF0ZSkgeworICAgICAgICAgICAgaWYgKHNjcm9sbFN0YXRlID09IFNDUk9MTF9TVEFURV9UT1VDSF9TQ1JPTEwgJiYKKyAgICAgICAgICAgICAgICAgICAgIWlzSW5wdXRNZXRob2ROb3ROZWVkZWQoKSAmJiBtUG9wdXAuZ2V0Q29udGVudFZpZXcoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUhhbmRsZXIucmVtb3ZlQ2FsbGJhY2tzKG1SZXNpemVQb3B1cFJ1bm5hYmxlKTsKKyAgICAgICAgICAgICAgICBtUmVzaXplUG9wdXBSdW5uYWJsZS5ydW4oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9MaXN0Vmlldy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0xpc3RWaWV3LmphdmEKaW5kZXggYTNmODYyNC4uZjliZGM0MyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0xpc3RWaWV3LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0xpc3RWaWV3LmphdmEKQEAgLTIwLDYgKzIwLDcgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmFuZHJvaWQuY29sbGVjdC5MaXN0czsKIAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5UeXBlZEFycmF5OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7CkBAIC0yNywxMCArMjgsNyBAQAogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkNvbG9yRHJhd2FibGU7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKLWltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKLWltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9uZ1NwYXJzZUFycmF5OwogaW1wb3J0IGFuZHJvaWQudXRpbC5TcGFyc2VCb29sZWFuQXJyYXk7CiBpbXBvcnQgYW5kcm9pZC52aWV3LkZvY3VzRmluZGVyOwogaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKQEAgLTQxLDYgKzM5LDcgQEAKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3UGFyZW50OwogaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlFdmVudDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5SZW1vdGVWaWV3cy5SZW1vdGVWaWV3OwogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIApAQCAtNjQsMTAgKzYzLDEwIEBACiAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNMaXN0Vmlld19lbnRyaWVzCiAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNMaXN0Vmlld19kaXZpZGVyCiAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNMaXN0Vmlld19kaXZpZGVySGVpZ2h0Ci0gKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNMaXN0Vmlld19jaG9pY2VNb2RlCiAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNMaXN0Vmlld19oZWFkZXJEaXZpZGVyc0VuYWJsZWQKICAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0xpc3RWaWV3X2Zvb3RlckRpdmlkZXJzRW5hYmxlZAogICovCitAUmVtb3RlVmlldwogcHVibGljIGNsYXNzIExpc3RWaWV3IGV4dGVuZHMgQWJzTGlzdFZpZXcgewogICAgIC8qKgogICAgICAqIFVzZWQgdG8gaW5kaWNhdGUgYSBubyBwcmVmZXJlbmNlIGZvciBhIHBvc2l0aW9uIHR5cGUuCkBAIC03NSwyMSArNzQsNiBAQAogICAgIHN0YXRpYyBmaW5hbCBpbnQgTk9fUE9TSVRJT04gPSAtMTsKIAogICAgIC8qKgotICAgICAqIE5vcm1hbCBsaXN0IHRoYXQgZG9lcyBub3QgaW5kaWNhdGUgY2hvaWNlcwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENIT0lDRV9NT0RFX05PTkUgPSAwOwotCi0gICAgLyoqCi0gICAgICogVGhlIGxpc3QgYWxsb3dzIHVwIHRvIG9uZSBjaG9pY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDSE9JQ0VfTU9ERV9TSU5HTEUgPSAxOwotCi0gICAgLyoqCi0gICAgICogVGhlIGxpc3QgYWxsb3dzIG11bHRpcGxlIGNob2ljZXMKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDSE9JQ0VfTU9ERV9NVUxUSVBMRSA9IDI7Ci0KLSAgICAvKioKICAgICAgKiBXaGVuIGFycm93IHNjcm9sbGluZywgTGlzdFZpZXcgd2lsbCBuZXZlciBzY3JvbGwgbW9yZSB0aGFuIHRoaXMgZmFjdG9yCiAgICAgICogdGltZXMgdGhlIGhlaWdodCBvZiB0aGUgbGlzdC4KICAgICAgKi8KQEAgLTEzMiwxMSArMTE2LDYgQEAKIAogICAgIHByaXZhdGUgYm9vbGVhbiBtSXRlbXNDYW5Gb2N1cyA9IGZhbHNlOwogCi0gICAgcHJpdmF0ZSBpbnQgbUNob2ljZU1vZGUgPSBDSE9JQ0VfTU9ERV9OT05FOwotCi0gICAgcHJpdmF0ZSBTcGFyc2VCb29sZWFuQXJyYXkgbUNoZWNrU3RhdGVzOwotICAgIHByaXZhdGUgTG9uZ1NwYXJzZUFycmF5PEJvb2xlYW4+IG1DaGVja2VkSWRTdGF0ZXM7Ci0KICAgICAvLyB1c2VkIGZvciB0ZW1wb3JhcnkgY2FsY3VsYXRpb25zLgogICAgIHByaXZhdGUgZmluYWwgUmVjdCBtVGVtcFJlY3QgPSBuZXcgUmVjdCgpOwogICAgIHByaXZhdGUgUGFpbnQgbURpdmlkZXJQYWludDsKQEAgLTE0Nyw3ICsxMjYsNyBAQAogCiAgICAgLy8gS2VlcHMgZm9jdXNlZCBjaGlsZHJlbiB2aXNpYmxlIHRocm91Z2ggcmVzaXplcwogICAgIHByaXZhdGUgRm9jdXNTZWxlY3RvciBtRm9jdXNTZWxlY3RvcjsKLSAgICAKKwogICAgIHB1YmxpYyBMaXN0VmlldyhDb250ZXh0IGNvbnRleHQpIHsKICAgICAgICAgdGhpcyhjb250ZXh0LCBudWxsKTsKICAgICB9CkBAIC0xODIsOCArMTYxLDYgQEAKICAgICAgICAgICAgIHNldERpdmlkZXJIZWlnaHQoZGl2aWRlckhlaWdodCk7CiAgICAgICAgIH0KIAotICAgICAgICBzZXRDaG9pY2VNb2RlKGEuZ2V0SW50KFIuc3R5bGVhYmxlLkxpc3RWaWV3X2Nob2ljZU1vZGUsIENIT0lDRV9NT0RFX05PTkUpKTsKLSAgICAgICAgCiAgICAgICAgIG1IZWFkZXJEaXZpZGVyc0VuYWJsZWQgPSBhLmdldEJvb2xlYW4oUi5zdHlsZWFibGUuTGlzdFZpZXdfaGVhZGVyRGl2aWRlcnNFbmFibGVkLCB0cnVlKTsKICAgICAgICAgbUZvb3RlckRpdmlkZXJzRW5hYmxlZCA9IGEuZ2V0Qm9vbGVhbihSLnN0eWxlYWJsZS5MaXN0Vmlld19mb290ZXJEaXZpZGVyc0VuYWJsZWQsIHRydWUpOwogCkBAIC00MDQsNiArMzgxLDE2IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogU2V0cyB1cCB0aGlzIEFic0xpc3RWaWV3IHRvIHVzZSBhIHJlbW90ZSB2aWV3cyBhZGFwdGVyIHdoaWNoIGNvbm5lY3RzIHRvIGEgUmVtb3RlVmlld3NTZXJ2aWNlCisgICAgICogdGhyb3VnaCB0aGUgc3BlY2lmaWVkIGludGVudC4KKyAgICAgKiBAcGFyYW0gaW50ZW50IHRoZSBpbnRlbnQgdXNlZCB0byBpZGVudGlmeSB0aGUgUmVtb3RlVmlld3NTZXJ2aWNlIGZvciB0aGUgYWRhcHRlciB0byBjb25uZWN0IHRvLgorICAgICAqLworICAgIEBhbmRyb2lkLnZpZXcuUmVtb3RhYmxlVmlld01ldGhvZAorICAgIHB1YmxpYyB2b2lkIHNldFJlbW90ZVZpZXdzQWRhcHRlcihJbnRlbnQgaW50ZW50KSB7CisgICAgICAgIHN1cGVyLnNldFJlbW90ZVZpZXdzQWRhcHRlcihpbnRlbnQpOworICAgIH0KKworICAgIC8qKgogICAgICAqIFNldHMgdGhlIGRhdGEgYmVoaW5kIHRoaXMgTGlzdFZpZXcuCiAgICAgICoKICAgICAgKiBUaGUgYWRhcHRlciBwYXNzZWQgdG8gdGhpcyBtZXRob2QgbWF5IGJlIHdyYXBwZWQgYnkgYSB7QGxpbmsgV3JhcHBlckxpc3RBZGFwdGVyfSwKQEAgLTQxOCw3ICs0MDUsNyBAQAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHNldEFkYXB0ZXIoTGlzdEFkYXB0ZXIgYWRhcHRlcikgewotICAgICAgICBpZiAobnVsbCAhPSBtQWRhcHRlcikgeworICAgICAgICBpZiAobUFkYXB0ZXIgIT0gbnVsbCAmJiBtRGF0YVNldE9ic2VydmVyICE9IG51bGwpIHsKICAgICAgICAgICAgIG1BZGFwdGVyLnVucmVnaXN0ZXJEYXRhU2V0T2JzZXJ2ZXIobURhdGFTZXRPYnNlcnZlcik7CiAgICAgICAgIH0KIApAQCAtNDMzLDYgKzQyMCwxMCBAQAogCiAgICAgICAgIG1PbGRTZWxlY3RlZFBvc2l0aW9uID0gSU5WQUxJRF9QT1NJVElPTjsKICAgICAgICAgbU9sZFNlbGVjdGVkUm93SWQgPSBJTlZBTElEX1JPV19JRDsKKworICAgICAgICAvLyBBYnNMaXN0VmlldyNzZXRBZGFwdGVyIHdpbGwgdXBkYXRlIGNob2ljZSBtb2RlIHN0YXRlcy4KKyAgICAgICAgc3VwZXIuc2V0QWRhcHRlcihhZGFwdGVyKTsKKwogICAgICAgICBpZiAobUFkYXB0ZXIgIT0gbnVsbCkgewogICAgICAgICAgICAgbUFyZUFsbEl0ZW1zU2VsZWN0YWJsZSA9IG1BZGFwdGVyLmFyZUFsbEl0ZW1zRW5hYmxlZCgpOwogICAgICAgICAgICAgbU9sZEl0ZW1Db3VudCA9IG1JdGVtQ291bnQ7CkBAIC00NTcsMTMgKzQ0OCw2IEBACiAgICAgICAgICAgICAgICAgLy8gTm90aGluZyBzZWxlY3RlZAogICAgICAgICAgICAgICAgIGNoZWNrU2VsZWN0aW9uQ2hhbmdlZCgpOwogICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobUNob2ljZU1vZGUgIT0gQ0hPSUNFX01PREVfTk9ORSAmJgotICAgICAgICAgICAgICAgICAgICBtQWRhcHRlci5oYXNTdGFibGVJZHMoKSAmJgotICAgICAgICAgICAgICAgICAgICBtQ2hlY2tlZElkU3RhdGVzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtQ2hlY2tlZElkU3RhdGVzID0gbmV3IExvbmdTcGFyc2VBcnJheTxCb29sZWFuPigpOwotICAgICAgICAgICAgfQotCiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBtQXJlQWxsSXRlbXNTZWxlY3RhYmxlID0gdHJ1ZTsKICAgICAgICAgICAgIGNoZWNrRm9jdXMoKTsKQEAgLTQ3MSwxNCArNDU1LDYgQEAKICAgICAgICAgICAgIGNoZWNrU2VsZWN0aW9uQ2hhbmdlZCgpOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKG1DaGVja1N0YXRlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtQ2hlY2tTdGF0ZXMuY2xlYXIoKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKG1DaGVja2VkSWRTdGF0ZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgbUNoZWNrZWRJZFN0YXRlcy5jbGVhcigpOwotICAgICAgICB9Ci0KICAgICAgICAgcmVxdWVzdExheW91dCgpOwogICAgIH0KIApAQCAtODY2LDYgKzg0MiwyNSBAQAogICAgICAgICByZXR1cm4gdG9wU2VsZWN0aW9uUGl4ZWw7CiAgICAgfQogCisgICAgLyoqCisgICAgICogU21vb3RobHkgc2Nyb2xsIHRvIHRoZSBzcGVjaWZpZWQgYWRhcHRlciBwb3NpdGlvbi4gVGhlIHZpZXcgd2lsbAorICAgICAqIHNjcm9sbCBzdWNoIHRoYXQgdGhlIGluZGljYXRlZCBwb3NpdGlvbiBpcyBkaXNwbGF5ZWQuCisgICAgICogQHBhcmFtIHBvc2l0aW9uIFNjcm9sbCB0byB0aGlzIGFkYXB0ZXIgcG9zaXRpb24uCisgICAgICovCisgICAgQGFuZHJvaWQudmlldy5SZW1vdGFibGVWaWV3TWV0aG9kCisgICAgcHVibGljIHZvaWQgc21vb3RoU2Nyb2xsVG9Qb3NpdGlvbihpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgc3VwZXIuc21vb3RoU2Nyb2xsVG9Qb3NpdGlvbihwb3NpdGlvbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogU21vb3RobHkgc2Nyb2xsIHRvIHRoZSBzcGVjaWZpZWQgYWRhcHRlciBwb3NpdGlvbiBvZmZzZXQuIFRoZSB2aWV3IHdpbGwKKyAgICAgKiBzY3JvbGwgc3VjaCB0aGF0IHRoZSBpbmRpY2F0ZWQgcG9zaXRpb24gaXMgZGlzcGxheWVkLgorICAgICAqIEBwYXJhbSBvZmZzZXQgVGhlIGFtb3VudCB0byBvZmZzZXQgZnJvbSB0aGUgYWRhcHRlciBwb3NpdGlvbiB0byBzY3JvbGwgdG8uCisgICAgICovCisgICAgQGFuZHJvaWQudmlldy5SZW1vdGFibGVWaWV3TWV0aG9kCisgICAgcHVibGljIHZvaWQgc21vb3RoU2Nyb2xsQnlPZmZzZXQoaW50IG9mZnNldCkgeworICAgICAgICBzdXBlci5zbW9vdGhTY3JvbGxCeU9mZnNldChvZmZzZXQpOworICAgIH0KIAogICAgIC8qKgogICAgICAqIEZpbGxzIHRoZSBsaXN0IGJhc2VkIG9uIHBvc2l0aW9uaW5nIHRoZSBuZXcgc2VsZWN0aW9uIHJlbGF0aXZlIHRvIHRoZSBvbGQKQEAgLTI5NzEsNyArMjk2Niw3IEBACiAgICAgICAgICAgICAvLyBmaWxsIGEgcmVjdCB3aGVyZSB0aGUgZGl2aWRlcnMgd291bGQgYmUgZm9yIG5vbi1zZWxlY3RhYmxlIGl0ZW1zCiAgICAgICAgICAgICAvLyBJZiB0aGUgbGlzdCBpcyBvcGFxdWUgYW5kIHRoZSBiYWNrZ3JvdW5kIGlzIGFsc28gb3BhcXVlLCB3ZSBkb24ndAogICAgICAgICAgICAgLy8gbmVlZCB0byBkcmF3IGFueXRoaW5nIHNpbmNlIHRoZSBiYWNrZ3JvdW5kIHdpbGwgZG8gaXQgZm9yIHVzCi0gICAgICAgICAgICBmaW5hbCBib29sZWFuIGZpbGxGb3JNaXNzaW5nRGl2aWRlcnMgPSBkcmF3RGl2aWRlcnMgJiYgaXNPcGFxdWUoKSAmJiAhc3VwZXIuaXNPcGFxdWUoKTsKKyAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gZmlsbEZvck1pc3NpbmdEaXZpZGVycyA9IGlzT3BhcXVlKCkgJiYgIXN1cGVyLmlzT3BhcXVlKCk7CiAKICAgICAgICAgICAgIGlmIChmaWxsRm9yTWlzc2luZ0RpdmlkZXJzICYmIG1EaXZpZGVyUGFpbnQgPT0gbnVsbCAmJiBtSXNDYWNoZUNvbG9yT3BhcXVlKSB7CiAgICAgICAgICAgICAgICAgbURpdmlkZXJQYWludCA9IG5ldyBQYWludCgpOwpAQCAtMjk4MSw3ICsyOTc2LDcgQEAKIAogICAgICAgICAgICAgZmluYWwgaW50IGxpc3RCb3R0b20gPSBtQm90dG9tIC0gbVRvcCAtIG1MaXN0UGFkZGluZy5ib3R0b20gKyBtU2Nyb2xsWTsKICAgICAgICAgICAgIGlmICghbVN0YWNrRnJvbUJvdHRvbSkgewotICAgICAgICAgICAgICAgIGludCBib3R0b20gPSAwOworICAgICAgICAgICAgICAgIGludCBib3R0b207CiAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgZmluYWwgaW50IHNjcm9sbFkgPSBtU2Nyb2xsWTsKICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKQEAgLTI5OTAsMTggKzI5ODUsMTYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIFZpZXcgY2hpbGQgPSBnZXRDaGlsZEF0KGkpOwogICAgICAgICAgICAgICAgICAgICAgICAgYm90dG9tID0gY2hpbGQuZ2V0Qm90dG9tKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEb24ndCBkcmF3IGRpdmlkZXJzIG5leHQgdG8gaXRlbXMgdGhhdCBhcmUgbm90IGVuYWJsZWQKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkcmF3RGl2aWRlcnMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGFyZUFsbEl0ZW1zU2VsZWN0YWJsZSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFkYXB0ZXIuaXNFbmFibGVkKGZpcnN0ICsgaSkgJiYgKGkgPT0gY291bnQgLSAxIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkYXB0ZXIuaXNFbmFibGVkKGZpcnN0ICsgaSArIDEpKSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdW5kcy50b3AgPSBib3R0b207Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdW5kcy5ib3R0b20gPSBib3R0b20gKyBkaXZpZGVySGVpZ2h0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3RGl2aWRlcihjYW52YXMsIGJvdW5kcywgaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmaWxsRm9yTWlzc2luZ0RpdmlkZXJzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdW5kcy50b3AgPSBib3R0b207Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdW5kcy5ib3R0b20gPSBib3R0b20gKyBkaXZpZGVySGVpZ2h0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QoYm91bmRzLCBwYWludCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChhcmVBbGxJdGVtc1NlbGVjdGFibGUgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFkYXB0ZXIuaXNFbmFibGVkKGZpcnN0ICsgaSkgJiYgKGkgPT0gY291bnQgLSAxIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRhcHRlci5pc0VuYWJsZWQoZmlyc3QgKyBpICsgMSkpKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3VuZHMudG9wID0gYm90dG9tOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdW5kcy5ib3R0b20gPSBib3R0b20gKyBkaXZpZGVySGVpZ2h0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyYXdEaXZpZGVyKGNhbnZhcywgYm91bmRzLCBpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZmlsbEZvck1pc3NpbmdEaXZpZGVycykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdW5kcy50b3AgPSBib3R0b207CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm91bmRzLmJvdHRvbSA9IGJvdHRvbSArIGRpdmlkZXJIZWlnaHQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KGJvdW5kcywgcGFpbnQpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQpAQCAtMzAxNyw3ICszMDEwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIFZpZXcgY2hpbGQgPSBnZXRDaGlsZEF0KGkpOwogICAgICAgICAgICAgICAgICAgICAgICAgdG9wID0gY2hpbGQuZ2V0VG9wKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEb24ndCBkcmF3IGRpdmlkZXJzIG5leHQgdG8gaXRlbXMgdGhhdCBhcmUgbm90IGVuYWJsZWQKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkcmF3RGl2aWRlcnMgJiYgdG9wID4gbGlzdFRvcCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRvcCA+IGxpc3RUb3ApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGFyZUFsbEl0ZW1zU2VsZWN0YWJsZSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFkYXB0ZXIuaXNFbmFibGVkKGZpcnN0ICsgaSkgJiYgKGkgPT0gY291bnQgLSAxIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkYXB0ZXIuaXNFbmFibGVkKGZpcnN0ICsgaSArIDEpKSkpKSB7CkBAIC0zMDM3LDcgKzMwMzAsNyBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChjb3VudCA+IDAgJiYgc2Nyb2xsWSA+IDAgJiYgZHJhd0RpdmlkZXJzKSB7CisgICAgICAgICAgICAgICAgaWYgKGNvdW50ID4gMCAmJiBzY3JvbGxZID4gMCkgewogICAgICAgICAgICAgICAgICAgICBib3VuZHMudG9wID0gbGlzdEJvdHRvbTsKICAgICAgICAgICAgICAgICAgICAgYm91bmRzLmJvdHRvbSA9IGxpc3RCb3R0b20gKyBkaXZpZGVySGVpZ2h0OwogICAgICAgICAgICAgICAgICAgICBkcmF3RGl2aWRlcihjYW52YXMsIGJvdW5kcywgLTEpOwpAQCAtMzMxOSwxNzcgKzMzMTIsNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBzZWUgI3NldENob2ljZU1vZGUoaW50KQotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgY3VycmVudCBjaG9pY2UgbW9kZQotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0Q2hvaWNlTW9kZSgpIHsKLSAgICAgICAgcmV0dXJuIG1DaG9pY2VNb2RlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERlZmluZXMgdGhlIGNob2ljZSBiZWhhdmlvciBmb3IgdGhlIExpc3QuIEJ5IGRlZmF1bHQsIExpc3RzIGRvIG5vdCBoYXZlIGFueSBjaG9pY2UgYmVoYXZpb3IKLSAgICAgKiAoe0BsaW5rICNDSE9JQ0VfTU9ERV9OT05FfSkuIEJ5IHNldHRpbmcgdGhlIGNob2ljZU1vZGUgdG8ge0BsaW5rICNDSE9JQ0VfTU9ERV9TSU5HTEV9LCB0aGUKLSAgICAgKiBMaXN0IGFsbG93cyB1cCB0byBvbmUgaXRlbSB0byAgYmUgaW4gYSBjaG9zZW4gc3RhdGUuIEJ5IHNldHRpbmcgdGhlIGNob2ljZU1vZGUgdG8KLSAgICAgKiB7QGxpbmsgI0NIT0lDRV9NT0RFX01VTFRJUExFfSwgdGhlIGxpc3QgYWxsb3dzIGFueSBudW1iZXIgb2YgaXRlbXMgdG8gYmUgY2hvc2VuLgotICAgICAqCi0gICAgICogQHBhcmFtIGNob2ljZU1vZGUgT25lIG9mIHtAbGluayAjQ0hPSUNFX01PREVfTk9ORX0sIHtAbGluayAjQ0hPSUNFX01PREVfU0lOR0xFfSwgb3IKLSAgICAgKiB7QGxpbmsgI0NIT0lDRV9NT0RFX01VTFRJUExFfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENob2ljZU1vZGUoaW50IGNob2ljZU1vZGUpIHsKLSAgICAgICAgbUNob2ljZU1vZGUgPSBjaG9pY2VNb2RlOwotICAgICAgICBpZiAobUNob2ljZU1vZGUgIT0gQ0hPSUNFX01PREVfTk9ORSkgewotICAgICAgICAgICAgaWYgKG1DaGVja1N0YXRlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUNoZWNrU3RhdGVzID0gbmV3IFNwYXJzZUJvb2xlYW5BcnJheSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1DaGVja2VkSWRTdGF0ZXMgPT0gbnVsbCAmJiBtQWRhcHRlciAhPSBudWxsICYmIG1BZGFwdGVyLmhhc1N0YWJsZUlkcygpKSB7Ci0gICAgICAgICAgICAgICAgbUNoZWNrZWRJZFN0YXRlcyA9IG5ldyBMb25nU3BhcnNlQXJyYXk8Qm9vbGVhbj4oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIHBlcmZvcm1JdGVtQ2xpY2soVmlldyB2aWV3LCBpbnQgcG9zaXRpb24sIGxvbmcgaWQpIHsKLSAgICAgICAgYm9vbGVhbiBoYW5kbGVkID0gZmFsc2U7Ci0KLSAgICAgICAgaWYgKG1DaG9pY2VNb2RlICE9IENIT0lDRV9NT0RFX05PTkUpIHsKLSAgICAgICAgICAgIGhhbmRsZWQgPSB0cnVlOwotCi0gICAgICAgICAgICBpZiAobUNob2ljZU1vZGUgPT0gQ0hPSUNFX01PREVfTVVMVElQTEUpIHsKLSAgICAgICAgICAgICAgICBib29sZWFuIG5ld1ZhbHVlID0gIW1DaGVja1N0YXRlcy5nZXQocG9zaXRpb24sIGZhbHNlKTsKLSAgICAgICAgICAgICAgICBtQ2hlY2tTdGF0ZXMucHV0KHBvc2l0aW9uLCBuZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgaWYgKG1DaGVja2VkSWRTdGF0ZXMgIT0gbnVsbCAmJiBtQWRhcHRlci5oYXNTdGFibGVJZHMoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAobmV3VmFsdWUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1DaGVja2VkSWRTdGF0ZXMucHV0KG1BZGFwdGVyLmdldEl0ZW1JZChwb3NpdGlvbiksIEJvb2xlYW4uVFJVRSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQ2hlY2tlZElkU3RhdGVzLmRlbGV0ZShtQWRhcHRlci5nZXRJdGVtSWQocG9zaXRpb24pKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBuZXdWYWx1ZSA9ICFtQ2hlY2tTdGF0ZXMuZ2V0KHBvc2l0aW9uLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgaWYgKG5ld1ZhbHVlKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1DaGVja1N0YXRlcy5jbGVhcigpOwotICAgICAgICAgICAgICAgICAgICBtQ2hlY2tTdGF0ZXMucHV0KHBvc2l0aW9uLCB0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1DaGVja2VkSWRTdGF0ZXMgIT0gbnVsbCAmJiBtQWRhcHRlci5oYXNTdGFibGVJZHMoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUNoZWNrZWRJZFN0YXRlcy5jbGVhcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgbUNoZWNrZWRJZFN0YXRlcy5wdXQobUFkYXB0ZXIuZ2V0SXRlbUlkKHBvc2l0aW9uKSwgQm9vbGVhbi5UUlVFKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1EYXRhQ2hhbmdlZCA9IHRydWU7Ci0gICAgICAgICAgICByZW1lbWJlclN5bmNTdGF0ZSgpOwotICAgICAgICAgICAgcmVxdWVzdExheW91dCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgaGFuZGxlZCB8PSBzdXBlci5wZXJmb3JtSXRlbUNsaWNrKHZpZXcsIHBvc2l0aW9uLCBpZCk7Ci0KLSAgICAgICAgcmV0dXJuIGhhbmRsZWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgY2hlY2tlZCBzdGF0ZSBvZiB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uLiBUaGUgaXMgb25seSB2YWxpZCBpZgotICAgICAqIHRoZSBjaG9pY2UgbW9kZSBoYXMgYmVlbiBzZXQgdG8ge0BsaW5rICNDSE9JQ0VfTU9ERV9TSU5HTEV9IG9yCi0gICAgICoge0BsaW5rICNDSE9JQ0VfTU9ERV9NVUxUSVBMRX0uCi0gICAgICogCi0gICAgICogQHBhcmFtIHBvc2l0aW9uIFRoZSBpdGVtIHdob3NlIGNoZWNrZWQgc3RhdGUgaXMgdG8gYmUgY2hlY2tlZAotICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IGNoZWNrZWQgc3RhdGUgZm9yIHRoZSBpdGVtCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SXRlbUNoZWNrZWQoaW50IHBvc2l0aW9uLCBib29sZWFuIHZhbHVlKSB7Ci0gICAgICAgIGlmIChtQ2hvaWNlTW9kZSA9PSBDSE9JQ0VfTU9ERV9OT05FKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobUNob2ljZU1vZGUgPT0gQ0hPSUNFX01PREVfTVVMVElQTEUpIHsKLSAgICAgICAgICAgIG1DaGVja1N0YXRlcy5wdXQocG9zaXRpb24sIHZhbHVlKTsKLSAgICAgICAgICAgIGlmIChtQ2hlY2tlZElkU3RhdGVzICE9IG51bGwgJiYgbUFkYXB0ZXIuaGFzU3RhYmxlSWRzKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAodmFsdWUpIHsKLSAgICAgICAgICAgICAgICAgICAgbUNoZWNrZWRJZFN0YXRlcy5wdXQobUFkYXB0ZXIuZ2V0SXRlbUlkKHBvc2l0aW9uKSwgQm9vbGVhbi5UUlVFKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtQ2hlY2tlZElkU3RhdGVzLmRlbGV0ZShtQWRhcHRlci5nZXRJdGVtSWQocG9zaXRpb24pKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBib29sZWFuIHVwZGF0ZUlkcyA9IG1DaGVja2VkSWRTdGF0ZXMgIT0gbnVsbCAmJiBtQWRhcHRlci5oYXNTdGFibGVJZHMoKTsKLSAgICAgICAgICAgIC8vIENsZWFyIGFsbCB2YWx1ZXMgaWYgd2UncmUgY2hlY2tpbmcgc29tZXRoaW5nLCBvciB1bmNoZWNraW5nIHRoZSBjdXJyZW50bHkKLSAgICAgICAgICAgIC8vIHNlbGVjdGVkIGl0ZW0KLSAgICAgICAgICAgIGlmICh2YWx1ZSB8fCBpc0l0ZW1DaGVja2VkKHBvc2l0aW9uKSkgewotICAgICAgICAgICAgICAgIG1DaGVja1N0YXRlcy5jbGVhcigpOwotICAgICAgICAgICAgICAgIGlmICh1cGRhdGVJZHMpIHsKLSAgICAgICAgICAgICAgICAgICAgbUNoZWNrZWRJZFN0YXRlcy5jbGVhcigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIHRoaXMgbWF5IGVuZCB1cCBzZWxlY3RpbmcgdGhlIHZhbHVlIHdlIGp1c3QgY2xlYXJlZCBidXQgdGhpcyB3YXkKLSAgICAgICAgICAgIC8vIHdlIGVuc3VyZSBsZW5ndGggb2YgbUNoZWNrU3RhdGVzIGlzIDEsIGEgZmFjdCBnZXRDaGVja2VkSXRlbVBvc2l0aW9uIHJlbGllcyBvbgotICAgICAgICAgICAgaWYgKHZhbHVlKSB7Ci0gICAgICAgICAgICAgICAgbUNoZWNrU3RhdGVzLnB1dChwb3NpdGlvbiwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHVwZGF0ZUlkcykgewotICAgICAgICAgICAgICAgICAgICBtQ2hlY2tlZElkU3RhdGVzLnB1dChtQWRhcHRlci5nZXRJdGVtSWQocG9zaXRpb24pLCBCb29sZWFuLlRSVUUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIERvIG5vdCBnZW5lcmF0ZSBhIGRhdGEgY2hhbmdlIHdoaWxlIHdlIGFyZSBpbiB0aGUgbGF5b3V0IHBoYXNlCi0gICAgICAgIGlmICghbUluTGF5b3V0ICYmICFtQmxvY2tMYXlvdXRSZXF1ZXN0cykgewotICAgICAgICAgICAgbURhdGFDaGFuZ2VkID0gdHJ1ZTsKLSAgICAgICAgICAgIHJlbWVtYmVyU3luY1N0YXRlKCk7Ci0gICAgICAgICAgICByZXF1ZXN0TGF5b3V0KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjaGVja2VkIHN0YXRlIG9mIHRoZSBzcGVjaWZpZWQgcG9zaXRpb24uIFRoZSByZXN1bHQgaXMgb25seQotICAgICAqIHZhbGlkIGlmIHRoZSBjaG9pY2UgbW9kZSBoYXMgYmVlbiBzZXQgdG8ge0BsaW5rICNDSE9JQ0VfTU9ERV9TSU5HTEV9Ci0gICAgICogb3Ige0BsaW5rICNDSE9JQ0VfTU9ERV9NVUxUSVBMRX0uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcG9zaXRpb24gVGhlIGl0ZW0gd2hvc2UgY2hlY2tlZCBzdGF0ZSB0byByZXR1cm4KLSAgICAgKiBAcmV0dXJuIFRoZSBpdGVtJ3MgY2hlY2tlZCBzdGF0ZSBvciA8Y29kZT5mYWxzZTwvY29kZT4gaWYgY2hvaWNlIG1vZGUKLSAgICAgKiAgICAgICAgIGlzIGludmFsaWQKLSAgICAgKgotICAgICAqIEBzZWUgI3NldENob2ljZU1vZGUoaW50KQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzSXRlbUNoZWNrZWQoaW50IHBvc2l0aW9uKSB7Ci0gICAgICAgIGlmIChtQ2hvaWNlTW9kZSAhPSBDSE9JQ0VfTU9ERV9OT05FICYmIG1DaGVja1N0YXRlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUNoZWNrU3RhdGVzLmdldChwb3NpdGlvbik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY3VycmVudGx5IGNoZWNrZWQgaXRlbS4gVGhlIHJlc3VsdCBpcyBvbmx5IHZhbGlkIGlmIHRoZSBjaG9pY2UKLSAgICAgKiBtb2RlIGhhcyBiZWVuIHNldCB0byB7QGxpbmsgI0NIT0lDRV9NT0RFX1NJTkdMRX0uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBwb3NpdGlvbiBvZiB0aGUgY3VycmVudGx5IGNoZWNrZWQgaXRlbSBvcgotICAgICAqICAgICAgICAge0BsaW5rICNJTlZBTElEX1BPU0lUSU9OfSBpZiBub3RoaW5nIGlzIHNlbGVjdGVkCi0gICAgICoKLSAgICAgKiBAc2VlICNzZXRDaG9pY2VNb2RlKGludCkKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldENoZWNrZWRJdGVtUG9zaXRpb24oKSB7Ci0gICAgICAgIGlmIChtQ2hvaWNlTW9kZSA9PSBDSE9JQ0VfTU9ERV9TSU5HTEUgJiYgbUNoZWNrU3RhdGVzICE9IG51bGwgJiYgbUNoZWNrU3RhdGVzLnNpemUoKSA9PSAxKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUNoZWNrU3RhdGVzLmtleUF0KDApOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIElOVkFMSURfUE9TSVRJT047Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc2V0IG9mIGNoZWNrZWQgaXRlbXMgaW4gdGhlIGxpc3QuIFRoZSByZXN1bHQgaXMgb25seSB2YWxpZCBpZgotICAgICAqIHRoZSBjaG9pY2UgbW9kZSBoYXMgbm90IGJlZW4gc2V0IHRvIHtAbGluayAjQ0hPSUNFX01PREVfTk9ORX0uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuICBBIFNwYXJzZUJvb2xlYW5BcnJheSB3aGljaCB3aWxsIHJldHVybiB0cnVlIGZvciBlYWNoIGNhbGwgdG8KLSAgICAgKiAgICAgICAgICBnZXQoaW50IHBvc2l0aW9uKSB3aGVyZSBwb3NpdGlvbiBpcyBhIHBvc2l0aW9uIGluIHRoZSBsaXN0LAotICAgICAqICAgICAgICAgIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBjaG9pY2UgbW9kZSBpcyBzZXQgdG8KLSAgICAgKiAgICAgICAgICB7QGxpbmsgI0NIT0lDRV9NT0RFX05PTkV9LgotICAgICAqLwotICAgIHB1YmxpYyBTcGFyc2VCb29sZWFuQXJyYXkgZ2V0Q2hlY2tlZEl0ZW1Qb3NpdGlvbnMoKSB7Ci0gICAgICAgIGlmIChtQ2hvaWNlTW9kZSAhPSBDSE9JQ0VfTU9ERV9OT05FKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUNoZWNrU3RhdGVzOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIHNldCBvZiBjaGVja2VkIGl0ZW1zIGlkcy4gVGhlIHJlc3VsdCBpcyBvbmx5IHZhbGlkIGlmIHRoZQogICAgICAqIGNob2ljZSBtb2RlIGhhcyBub3QgYmVlbiBzZXQgdG8ge0BsaW5rICNDSE9JQ0VfTU9ERV9OT05FfS4KICAgICAgKiAKQEAgLTM0OTgsNiArMzMyMCw3IEBACiAgICAgICogICAgICAgICAKICAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rICNnZXRDaGVja2VkSXRlbUlkcygpfSBpbnN0ZWFkLgogICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIGxvbmdbXSBnZXRDaGVja0l0ZW1JZHMoKSB7CiAgICAgICAgIC8vIFVzZSBuZXcgYmVoYXZpb3IgdGhhdCBjb3JyZWN0bHkgaGFuZGxlcyBzdGFibGUgSUQgbWFwcGluZy4KICAgICAgICAgaWYgKG1BZGFwdGVyICE9IG51bGwgJiYgbUFkYXB0ZXIuaGFzU3RhYmxlSWRzKCkpIHsKQEAgLTM1MzIsMTE1ICszMzU1LDQgQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gbmV3IGxvbmdbMF07CiAgICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHNldCBvZiBjaGVja2VkIGl0ZW1zIGlkcy4gVGhlIHJlc3VsdCBpcyBvbmx5IHZhbGlkIGlmIHRoZQotICAgICAqIGNob2ljZSBtb2RlIGhhcyBub3QgYmVlbiBzZXQgdG8ge0BsaW5rICNDSE9JQ0VfTU9ERV9OT05FfSBhbmQgdGhlIGFkYXB0ZXIKLSAgICAgKiBoYXMgc3RhYmxlIElEcy4gKHtAbGluayBMaXN0QWRhcHRlciNoYXNTdGFibGVJZHMoKX0gPT0ge0Bjb2RlIHRydWV9KQotICAgICAqIAotICAgICAqIEByZXR1cm4gQSBuZXcgYXJyYXkgd2hpY2ggY29udGFpbnMgdGhlIGlkIG9mIGVhY2ggY2hlY2tlZCBpdGVtIGluIHRoZQotICAgICAqICAgICAgICAgbGlzdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgbG9uZ1tdIGdldENoZWNrZWRJdGVtSWRzKCkgewotICAgICAgICBpZiAobUNob2ljZU1vZGUgPT0gQ0hPSUNFX01PREVfTk9ORSB8fCBtQ2hlY2tlZElkU3RhdGVzID09IG51bGwgfHwgbUFkYXB0ZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBsb25nWzBdOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBMb25nU3BhcnNlQXJyYXk8Qm9vbGVhbj4gaWRTdGF0ZXMgPSBtQ2hlY2tlZElkU3RhdGVzOwotICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBpZFN0YXRlcy5zaXplKCk7Ci0gICAgICAgIGZpbmFsIGxvbmdbXSBpZHMgPSBuZXcgbG9uZ1tjb3VudF07Ci0gICAgICAgIAotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgIGlkc1tpXSA9IGlkU3RhdGVzLmtleUF0KGkpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gaWRzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENsZWFyIGFueSBjaG9pY2VzIHByZXZpb3VzbHkgc2V0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgY2xlYXJDaG9pY2VzKCkgewotICAgICAgICBpZiAobUNoZWNrU3RhdGVzICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1DaGVja1N0YXRlcy5jbGVhcigpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtQ2hlY2tlZElkU3RhdGVzICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1DaGVja2VkSWRTdGF0ZXMuY2xlYXIoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHN0YXRpYyBjbGFzcyBTYXZlZFN0YXRlIGV4dGVuZHMgQmFzZVNhdmVkU3RhdGUgewotICAgICAgICBTcGFyc2VCb29sZWFuQXJyYXkgY2hlY2tTdGF0ZTsKLSAgICAgICAgTG9uZ1NwYXJzZUFycmF5PEJvb2xlYW4+IGNoZWNrSWRTdGF0ZTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQ29uc3RydWN0b3IgY2FsbGVkIGZyb20ge0BsaW5rIExpc3RWaWV3I29uU2F2ZUluc3RhbmNlU3RhdGUoKX0KLSAgICAgICAgICovCi0gICAgICAgIFNhdmVkU3RhdGUoUGFyY2VsYWJsZSBzdXBlclN0YXRlLCBTcGFyc2VCb29sZWFuQXJyYXkgY2hlY2tTdGF0ZSwKLSAgICAgICAgICAgICAgICBMb25nU3BhcnNlQXJyYXk8Qm9vbGVhbj4gY2hlY2tJZFN0YXRlKSB7Ci0gICAgICAgICAgICBzdXBlcihzdXBlclN0YXRlKTsKLSAgICAgICAgICAgIHRoaXMuY2hlY2tTdGF0ZSA9IGNoZWNrU3RhdGU7Ci0gICAgICAgICAgICB0aGlzLmNoZWNrSWRTdGF0ZSA9IGNoZWNrSWRTdGF0ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDb25zdHJ1Y3RvciBjYWxsZWQgZnJvbSB7QGxpbmsgI0NSRUFUT1J9Ci0gICAgICAgICAqLwotICAgICAgICBwcml2YXRlIFNhdmVkU3RhdGUoUGFyY2VsIGluKSB7Ci0gICAgICAgICAgICBzdXBlcihpbik7Ci0gICAgICAgICAgICBjaGVja1N0YXRlID0gaW4ucmVhZFNwYXJzZUJvb2xlYW5BcnJheSgpOwotICAgICAgICAgICAgbG9uZ1tdIGlkU3RhdGUgPSBpbi5jcmVhdGVMb25nQXJyYXkoKTsKLQotICAgICAgICAgICAgaWYgKGlkU3RhdGUubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgICAgIGNoZWNrSWRTdGF0ZSA9IG5ldyBMb25nU3BhcnNlQXJyYXk8Qm9vbGVhbj4oKTsKLSAgICAgICAgICAgICAgICBjaGVja0lkU3RhdGUuc2V0VmFsdWVzKGlkU3RhdGUsIEJvb2xlYW4uVFJVRSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgd3JpdGVUb1BhcmNlbChQYXJjZWwgb3V0LCBpbnQgZmxhZ3MpIHsKLSAgICAgICAgICAgIHN1cGVyLndyaXRlVG9QYXJjZWwob3V0LCBmbGFncyk7Ci0gICAgICAgICAgICBvdXQud3JpdGVTcGFyc2VCb29sZWFuQXJyYXkoY2hlY2tTdGF0ZSk7Ci0gICAgICAgICAgICBvdXQud3JpdGVMb25nQXJyYXkoY2hlY2tJZFN0YXRlICE9IG51bGwgPyBjaGVja0lkU3RhdGUuZ2V0S2V5cygpIDogbmV3IGxvbmdbMF0pOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgICAgICByZXR1cm4gIkxpc3RWaWV3LlNhdmVkU3RhdGV7IgotICAgICAgICAgICAgICAgICAgICArIEludGVnZXIudG9IZXhTdHJpbmcoU3lzdGVtLmlkZW50aXR5SGFzaENvZGUodGhpcykpCi0gICAgICAgICAgICAgICAgICAgICsgIiBjaGVja1N0YXRlPSIgKyBjaGVja1N0YXRlICsgIn0iOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBQYXJjZWxhYmxlLkNyZWF0b3I8U2F2ZWRTdGF0ZT4gQ1JFQVRPUgotICAgICAgICAgICAgICAgID0gbmV3IFBhcmNlbGFibGUuQ3JlYXRvcjxTYXZlZFN0YXRlPigpIHsKLSAgICAgICAgICAgIHB1YmxpYyBTYXZlZFN0YXRlIGNyZWF0ZUZyb21QYXJjZWwoUGFyY2VsIGluKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTYXZlZFN0YXRlKGluKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIFNhdmVkU3RhdGVbXSBuZXdBcnJheShpbnQgc2l6ZSkgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU2F2ZWRTdGF0ZVtzaXplXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgUGFyY2VsYWJsZSBvblNhdmVJbnN0YW5jZVN0YXRlKCkgewotICAgICAgICBQYXJjZWxhYmxlIHN1cGVyU3RhdGUgPSBzdXBlci5vblNhdmVJbnN0YW5jZVN0YXRlKCk7Ci0gICAgICAgIHJldHVybiBuZXcgU2F2ZWRTdGF0ZShzdXBlclN0YXRlLCBtQ2hlY2tTdGF0ZXMsIG1DaGVja2VkSWRTdGF0ZXMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uUmVzdG9yZUluc3RhbmNlU3RhdGUoUGFyY2VsYWJsZSBzdGF0ZSkgewotICAgICAgICBTYXZlZFN0YXRlIHNzID0gKFNhdmVkU3RhdGUpIHN0YXRlOwotCi0gICAgICAgIHN1cGVyLm9uUmVzdG9yZUluc3RhbmNlU3RhdGUoc3MuZ2V0U3VwZXJTdGF0ZSgpKTsKLQotICAgICAgICBpZiAoc3MuY2hlY2tTdGF0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgIG1DaGVja1N0YXRlcyA9IHNzLmNoZWNrU3RhdGU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc3MuY2hlY2tJZFN0YXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1DaGVja2VkSWRTdGF0ZXMgPSBzcy5jaGVja0lkU3RhdGU7Ci0gICAgICAgIH0KLSAgICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvUG9wdXBNZW51LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvUG9wdXBNZW51LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI3NzBhZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9Qb3B1cE1lbnUuamF2YQpAQCAtMCwwICsxLDE1NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC53aWRnZXQ7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuTWVudUJ1aWxkZXI7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51Lk1lbnVQb3B1cEhlbHBlcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuU3ViTWVudUJ1aWxkZXI7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUluZmxhdGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SXRlbTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKKworLyoqCisgKiBBIFBvcHVwTWVudSBkaXNwbGF5cyBhIHtAbGluayBNZW51fSBpbiBhIG1vZGFsIHBvcHVwIHdpbmRvdyBhbmNob3JlZCB0byBhIHtAbGluayBWaWV3fS4KKyAqIFRoZSBwb3B1cCB3aWxsIGFwcGVhciBiZWxvdyB0aGUgYW5jaG9yIHZpZXcgaWYgdGhlcmUgaXMgcm9vbSwgb3IgYWJvdmUgaXQgaWYgdGhlcmUgaXMgbm90LgorICogSWYgdGhlIElNRSBpcyB2aXNpYmxlIHRoZSBwb3B1cCB3aWxsIG5vdCBvdmVybGFwIGl0IHVudGlsIGl0IGlzIHRvdWNoZWQuIFRvdWNoaW5nIG91dHNpZGUKKyAqIG9mIHRoZSBwb3B1cCB3aWxsIGRpc21pc3MgaXQuCisgKi8KK3B1YmxpYyBjbGFzcyBQb3B1cE1lbnUgaW1wbGVtZW50cyBNZW51QnVpbGRlci5DYWxsYmFjayB7CisgICAgcHJpdmF0ZSBDb250ZXh0IG1Db250ZXh0OworICAgIHByaXZhdGUgTWVudUJ1aWxkZXIgbU1lbnU7CisgICAgcHJpdmF0ZSBWaWV3IG1BbmNob3I7CisgICAgcHJpdmF0ZSBNZW51UG9wdXBIZWxwZXIgbVBvcHVwOworICAgIHByaXZhdGUgT25NZW51SXRlbUNsaWNrTGlzdGVuZXIgbU1lbnVJdGVtQ2xpY2tMaXN0ZW5lcjsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIG5ldyBQb3B1cE1lbnUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBDb250ZXh0IGZvciB0aGUgUG9wdXBNZW51LgorICAgICAqIEBwYXJhbSBhbmNob3IgQW5jaG9yIHZpZXcgZm9yIHRoaXMgcG9wdXAuIFRoZSBwb3B1cCB3aWxsIGFwcGVhciBiZWxvdyB0aGUgYW5jaG9yIGlmIHRoZXJlCisgICAgICogICAgICAgICAgICAgICBpcyByb29tLCBvciBhYm92ZSBpdCBpZiB0aGVyZSBpcyBub3QuCisgICAgICovCisgICAgcHVibGljIFBvcHVwTWVudShDb250ZXh0IGNvbnRleHQsIFZpZXcgYW5jaG9yKSB7CisgICAgICAgIC8vIFRPRE8gVGhlbWU/CisgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKKyAgICAgICAgbU1lbnUgPSBuZXcgTWVudUJ1aWxkZXIoY29udGV4dCk7CisgICAgICAgIG1NZW51LnNldENhbGxiYWNrKHRoaXMpOworICAgICAgICBtQW5jaG9yID0gYW5jaG9yOworICAgICAgICBtUG9wdXAgPSBuZXcgTWVudVBvcHVwSGVscGVyKGNvbnRleHQsIG1NZW51LCBhbmNob3IpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIHtAbGluayBNZW51fSBhc3NvY2lhdGVkIHdpdGggdGhpcyBwb3B1cC4gUG9wdWxhdGUgdGhlIHJldHVybmVkIE1lbnUgd2l0aAorICAgICAqIGl0ZW1zIGJlZm9yZSBjYWxsaW5nIHtAbGluayAjc2hvdygpfS4KKyAgICAgKgorICAgICAqIEBzZWUgI3Nob3coKQorICAgICAqIEBzZWUgI2dldE1lbnVJbmZsYXRlcigpCisgICAgICovCisgICAgcHVibGljIE1lbnUgZ2V0TWVudSgpIHsKKyAgICAgICAgcmV0dXJuIG1NZW51OworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gYSB7QGxpbmsgTWVudUluZmxhdGVyfSB0aGF0IGNhbiBiZSB1c2VkIHRvIGluZmxhdGUgbWVudSBpdGVtcyBmcm9tIFhNTCBpbnRvIHRoZQorICAgICAqIG1lbnUgcmV0dXJuZWQgYnkge0BsaW5rICNnZXRNZW51KCl9LgorICAgICAqCisgICAgICogQHNlZSAjZ2V0TWVudSgpCisgICAgICovCisgICAgcHVibGljIE1lbnVJbmZsYXRlciBnZXRNZW51SW5mbGF0ZXIoKSB7CisgICAgICAgIHJldHVybiBuZXcgTWVudUluZmxhdGVyKG1Db250ZXh0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTaG93IHRoZSBtZW51IHBvcHVwIGFuY2hvcmVkIHRvIHRoZSB2aWV3IHNwZWNpZmllZCBkdXJpbmcgY29uc3RydWN0aW9uLgorICAgICAqIEBzZWUgI2Rpc21pc3MoKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNob3coKSB7CisgICAgICAgIG1Qb3B1cC5zaG93KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGlzbWlzcyB0aGUgbWVudSBwb3B1cC4KKyAgICAgKiBAc2VlICNzaG93KCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkaXNtaXNzKCkgeworICAgICAgICBtUG9wdXAuZGlzbWlzcygpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE9uTWVudUl0ZW1DbGlja0xpc3RlbmVyKE9uTWVudUl0ZW1DbGlja0xpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgIG1NZW51SXRlbUNsaWNrTGlzdGVuZXIgPSBsaXN0ZW5lcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIG9uTWVudUl0ZW1TZWxlY3RlZChNZW51QnVpbGRlciBtZW51LCBNZW51SXRlbSBpdGVtKSB7CisgICAgICAgIGlmIChtTWVudUl0ZW1DbGlja0xpc3RlbmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBtTWVudUl0ZW1DbGlja0xpc3RlbmVyLm9uTWVudUl0ZW1DbGljayhpdGVtKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvbkNsb3NlTWVudShNZW51QnVpbGRlciBtZW51LCBib29sZWFuIGFsbE1lbnVzQXJlQ2xvc2luZykgeworICAgIH0KKworICAgIC8qKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gb25TdWJNZW51U2VsZWN0ZWQoU3ViTWVudUJ1aWxkZXIgc3ViTWVudSkgeworICAgICAgICBpZiAoIXN1Yk1lbnUuaGFzVmlzaWJsZUl0ZW1zKCkpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ3VycmVudCBtZW51IHdpbGwgYmUgZGlzbWlzc2VkIGJ5IHRoZSBub3JtYWwgaGVscGVyLCBzdWJtZW51IHdpbGwgYmUgc2hvd24gaW4gaXRzIHBsYWNlLgorICAgICAgICBuZXcgTWVudVBvcHVwSGVscGVyKG1Db250ZXh0LCBzdWJNZW51LCBtQW5jaG9yKS5zaG93KCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25DbG9zZVN1Yk1lbnUoU3ViTWVudUJ1aWxkZXIgbWVudSkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25NZW51TW9kZUNoYW5nZShNZW51QnVpbGRlciBtZW51KSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW50ZXJmYWNlIHJlc3BvbnNpYmxlIGZvciByZWNlaXZpbmcgbWVudSBpdGVtIGNsaWNrIGV2ZW50cyBpZiB0aGUgaXRlbXMgdGhlbXNlbHZlcworICAgICAqIGRvIG5vdCBoYXZlIGluZGl2aWR1YWwgaXRlbSBjbGljayBsaXN0ZW5lcnMuCisgICAgICovCisgICAgcHVibGljIGludGVyZmFjZSBPbk1lbnVJdGVtQ2xpY2tMaXN0ZW5lciB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGJlIGludm9rZWQgd2hlbiBhIG1lbnUgaXRlbSBpcyBjbGlja2VkIGlmIHRoZSBpdGVtIGl0c2VsZiBkaWQKKyAgICAgICAgICogbm90IGFscmVhZHkgaGFuZGxlIHRoZSBldmVudC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGl0ZW0ge0BsaW5rIE1lbnVJdGVtfSB0aGF0IHdhcyBjbGlja2VkCisgICAgICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGV2ZW50IHdhcyBoYW5kbGVkLCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGJvb2xlYW4gb25NZW51SXRlbUNsaWNrKE1lbnVJdGVtIGl0ZW0pOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9Qb3B1cFdpbmRvdy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1BvcHVwV2luZG93LmphdmEKaW5kZXggMDM3ODMyOC4uNGEzZTJhOSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1BvcHVwV2luZG93LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1BvcHVwV2luZG93LmphdmEKQEAgLTE5LDIyICsxOSwyNCBAQAogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLlI7CiAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OwotaW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuR3Jhdml0eTsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3VHJlZU9ic2VydmVyOwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3VHJlZU9ic2VydmVyLk9uU2Nyb2xsQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3Lk9uVG91Y2hMaXN0ZW5lcjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBpeGVsRm9ybWF0OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuU3RhdGVMaXN0RHJhd2FibGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOwogaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuR3Jhdml0eTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3Lk9uVG91Y2hMaXN0ZW5lcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3VHJlZU9ic2VydmVyOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3VHJlZU9ic2VydmVyLk9uU2Nyb2xsQ2hhbmdlZExpc3RlbmVyOworaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyOwogCiBpbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOwogCkBAIC0xMjEsNyArMTIzLDcgQEAKICAgICBwcml2YXRlIE9uU2Nyb2xsQ2hhbmdlZExpc3RlbmVyIG1PblNjcm9sbENoYW5nZWRMaXN0ZW5lciA9CiAgICAgICAgIG5ldyBPblNjcm9sbENoYW5nZWRMaXN0ZW5lcigpIHsKICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uU2Nyb2xsQ2hhbmdlZCgpIHsKLSAgICAgICAgICAgICAgICBWaWV3IGFuY2hvciA9IG1BbmNob3IuZ2V0KCk7CisgICAgICAgICAgICAgICAgVmlldyBhbmNob3IgPSBtQW5jaG9yICE9IG51bGwgPyBtQW5jaG9yLmdldCgpIDogbnVsbDsKICAgICAgICAgICAgICAgICBpZiAoYW5jaG9yICE9IG51bGwgJiYgbVBvcHVwVmlldyAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zIHAgPSAoV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBvcHVwVmlldy5nZXRMYXlvdXRQYXJhbXMoKTsKQEAgLTE1NywxMiArMTU5LDIxIEBACiAgICAgICogPHA+VGhlIHBvcHVwIGRvZXMgcHJvdmlkZSBhIGJhY2tncm91bmQuPC9wPgogICAgICAqLwogICAgIHB1YmxpYyBQb3B1cFdpbmRvdyhDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlKSB7CisgICAgICAgIHRoaXMoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlLCAwKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogPHA+Q3JlYXRlIGEgbmV3LCBlbXB0eSwgbm9uIGZvY3VzYWJsZSBwb3B1cCB3aW5kb3cgb2YgZGltZW5zaW9uICgwLDApLjwvcD4KKyAgICAgKiAKKyAgICAgKiA8cD5UaGUgcG9wdXAgZG9lcyBub3QgcHJvdmlkZSBhIGJhY2tncm91bmQuPC9wPgorICAgICAqLworICAgIHB1YmxpYyBQb3B1cFdpbmRvdyhDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlQXR0ciwgaW50IGRlZlN0eWxlUmVzKSB7CiAgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKICAgICAgICAgbVdpbmRvd01hbmFnZXIgPSAoV2luZG93TWFuYWdlciljb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5XSU5ET1dfU0VSVklDRSk7CiAKICAgICAgICAgVHlwZWRBcnJheSBhID0KICAgICAgICAgICAgIGNvbnRleHQub2J0YWluU3R5bGVkQXR0cmlidXRlcygKLSAgICAgICAgICAgICAgICBhdHRycywgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuUG9wdXBXaW5kb3csIGRlZlN0eWxlLCAwKTsKKyAgICAgICAgICAgICAgICBhdHRycywgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuUG9wdXBXaW5kb3csIGRlZlN0eWxlQXR0ciwgZGVmU3R5bGVSZXMpOwogCiAgICAgICAgIG1CYWNrZ3JvdW5kID0gYS5nZXREcmF3YWJsZShSLnN0eWxlYWJsZS5Qb3B1cFdpbmRvd19wb3B1cEJhY2tncm91bmQpOwogCkBAIC0xMDIyLDcgKzEwMzMsOSBAQAogICAgICAgICAKICAgICAgICAgaW50IGJvdHRvbUVkZ2UgPSBkaXNwbGF5RnJhbWUuYm90dG9tOwogICAgICAgICBpZiAoaWdub3JlQm90dG9tRGVjb3JhdGlvbnMpIHsKLSAgICAgICAgICAgIGJvdHRvbUVkZ2UgPSBhbmNob3IuZ2V0Q29udGV4dCgpLmdldFJlc291cmNlcygpLmdldERpc3BsYXlNZXRyaWNzKCkuaGVpZ2h0UGl4ZWxzOworICAgICAgICAgICAgUmVzb3VyY2VzIHJlcyA9IGFuY2hvci5nZXRDb250ZXh0KCkuZ2V0UmVzb3VyY2VzKCk7CisgICAgICAgICAgICBib3R0b21FZGdlID0gcmVzLmdldERpc3BsYXlNZXRyaWNzKCkuaGVpZ2h0UGl4ZWxzIC0KKyAgICAgICAgICAgICAgICAgICAgKGludCkgcmVzLmdldERpbWVuc2lvbihjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmRpbWVuLnNjcmVlbl9tYXJnaW5fYm90dG9tKTsKICAgICAgICAgfQogICAgICAgICBmaW5hbCBpbnQgZGlzdGFuY2VUb0JvdHRvbSA9IGJvdHRvbUVkZ2UgLSAoYW5jaG9yUG9zWzFdICsgYW5jaG9yLmdldEhlaWdodCgpKSAtIHlPZmZzZXQ7CiAgICAgICAgIGZpbmFsIGludCBkaXN0YW5jZVRvVG9wID0gYW5jaG9yUG9zWzFdIC0gZGlzcGxheUZyYW1lLnRvcCArIHlPZmZzZXQ7CkBAIC0xMzE1LDYgKzEzMjgsNyBAQAogICAgIH0KIAogICAgIHByaXZhdGUgY2xhc3MgUG9wdXBWaWV3Q29udGFpbmVyIGV4dGVuZHMgRnJhbWVMYXlvdXQgeworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlBvcHVwV2luZG93LlBvcHVwVmlld0NvbnRhaW5lciI7CiAKICAgICAgICAgcHVibGljIFBvcHVwVmlld0NvbnRhaW5lcihDb250ZXh0IGNvbnRleHQpIHsKICAgICAgICAgICAgIHN1cGVyKGNvbnRleHQpOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1Byb2dyZXNzQmFyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvUHJvZ3Jlc3NCYXIuamF2YQppbmRleCBlYzdkOTI3Li4zYTQ0ODdjIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvUHJvZ3Jlc3NCYXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvUHJvZ3Jlc3NCYXIuamF2YQpAQCAtNzE2LDggKzcxNiw4IEBACiAgICAgICAgICAgICBtQW5pbWF0aW9uLnNldER1cmF0aW9uKG1EdXJhdGlvbik7CiAgICAgICAgICAgICBtQW5pbWF0aW9uLnNldEludGVycG9sYXRvcihtSW50ZXJwb2xhdG9yKTsKICAgICAgICAgICAgIG1BbmltYXRpb24uc2V0U3RhcnRUaW1lKEFuaW1hdGlvbi5TVEFSVF9PTl9GSVJTVF9GUkFNRSk7Ci0gICAgICAgICAgICBwb3N0SW52YWxpZGF0ZSgpOwogICAgICAgICB9CisgICAgICAgIHBvc3RJbnZhbGlkYXRlKCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC03MzAsNiArNzMwLDcgQEAKICAgICAgICAgICAgICgoQW5pbWF0YWJsZSkgbUluZGV0ZXJtaW5hdGVEcmF3YWJsZSkuc3RvcCgpOwogICAgICAgICAgICAgbVNob3VsZFN0YXJ0QW5pbWF0aW9uRHJhd2FibGUgPSBmYWxzZTsKICAgICAgICAgfQorICAgICAgICBwb3N0SW52YWxpZGF0ZSgpOwogICAgIH0KIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1F1aWNrQ29udGFjdEJhZGdlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvUXVpY2tDb250YWN0QmFkZ2UuamF2YQppbmRleCAwN2MzZTRiLi41MGZiYjZiIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvUXVpY2tDb250YWN0QmFkZ2UuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvUXVpY2tDb250YWN0QmFkZ2UuamF2YQpAQCAtNDgsNiArNDgsNyBAQAogICAgIHByaXZhdGUgUXVlcnlIYW5kbGVyIG1RdWVyeUhhbmRsZXI7CiAgICAgcHJpdmF0ZSBEcmF3YWJsZSBtQmFkZ2VCYWNrZ3JvdW5kOwogICAgIHByaXZhdGUgRHJhd2FibGUgbU5vQmFkZ2VCYWNrZ3JvdW5kOworICAgIHByaXZhdGUgRHJhd2FibGUgbURlZmF1bHRBdmF0YXI7CiAKICAgICBwcm90ZWN0ZWQgU3RyaW5nW10gbUV4Y2x1ZGVNaW1lcyA9IG51bGw7CiAKQEAgLTExNyw2ICsxMTgsMTYgQEAKICAgICBwdWJsaWMgdm9pZCBzZXRNb2RlKGludCBzaXplKSB7CiAgICAgICAgIG1Nb2RlID0gc2l6ZTsKICAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmVzZXRzIHRoZSBjb250YWN0IHBob3RvIHRvIHRoZSBkZWZhdWx0IHN0YXRlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEltYWdlVG9EZWZhdWx0KCkgeworICAgICAgICBpZiAobURlZmF1bHRBdmF0YXIgPT0gbnVsbCkgeworICAgICAgICAgICAgbURlZmF1bHRBdmF0YXIgPSBnZXRSZXNvdXJjZXMoKS5nZXREcmF3YWJsZShSLmRyYXdhYmxlLmljX2NvbnRhY3RfcGljdHVyZSk7CisgICAgICAgIH0KKyAgICAgICAgc2V0SW1hZ2VEcmF3YWJsZShtRGVmYXVsdEF2YXRhcik7CisgICAgfQogCiAgICAgLyoqCiAgICAgICogQXNzaWduIHRoZSBjb250YWN0IHVyaSB0aGF0IHRoaXMgUXVpY2tDb250YWN0QmFkZ2Ugc2hvdWxkIGJlIGFzc29jaWF0ZWQKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9SZW1vdGVWaWV3cy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1JlbW90ZVZpZXdzLmphdmEKaW5kZXggN2E3MGM4MC4uZjIzYTcyMyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1JlbW90ZVZpZXdzLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1JlbW90ZVZpZXdzLmphdmEKQEAgLTYwLDEyICs2MCwxMiBAQAogICAgICAqIFRoZSBwYWNrYWdlIG5hbWUgb2YgdGhlIHBhY2thZ2UgY29udGFpbmluZyB0aGUgbGF5b3V0IAogICAgICAqIHJlc291cmNlLiAoQWRkZWQgdG8gdGhlIHBhcmNlbCkKICAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBtUGFja2FnZTsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtUGFja2FnZTsKICAgICAKICAgICAvKioKICAgICAgKiBUaGUgcmVzb3VyY2UgSUQgb2YgdGhlIGxheW91dCBmaWxlLiAoQWRkZWQgdG8gdGhlIHBhcmNlbCkKICAgICAgKi8KLSAgICBwcml2YXRlIGludCBtTGF5b3V0SWQ7CisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbUxheW91dElkOwogCiAgICAgLyoqCiAgICAgICogQW4gYXJyYXkgb2YgYWN0aW9ucyB0byBwZXJmb3JtIG9uIHRoZSB2aWV3IHRyZWUgb25jZSBpdCBoYXMgYmVlbgpAQCAtMjY2LDYgKzI2Niw2MyBAQAogICAgICAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBUQUcgPSAzOwogICAgIH0KICAgICAKKyAgICBwcml2YXRlIGNsYXNzIFJlZmxlY3Rpb25BY3Rpb25XaXRob3V0UGFyYW1zIGV4dGVuZHMgQWN0aW9uIHsKKyAgICAgICAgaW50IHZpZXdJZDsKKyAgICAgICAgU3RyaW5nIG1ldGhvZE5hbWU7CisKKyAgICAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgVEFHID0gNTsKKworICAgICAgICBSZWZsZWN0aW9uQWN0aW9uV2l0aG91dFBhcmFtcyhpbnQgdmlld0lkLCBTdHJpbmcgbWV0aG9kTmFtZSkgeworICAgICAgICAgICAgdGhpcy52aWV3SWQgPSB2aWV3SWQ7CisgICAgICAgICAgICB0aGlzLm1ldGhvZE5hbWUgPSBtZXRob2ROYW1lOworICAgICAgICB9CisKKyAgICAgICAgUmVmbGVjdGlvbkFjdGlvbldpdGhvdXRQYXJhbXMoUGFyY2VsIGluKSB7CisgICAgICAgICAgICB0aGlzLnZpZXdJZCA9IGluLnJlYWRJbnQoKTsKKyAgICAgICAgICAgIHRoaXMubWV0aG9kTmFtZSA9IGluLnJlYWRTdHJpbmcoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlVG9QYXJjZWwoUGFyY2VsIG91dCwgaW50IGZsYWdzKSB7CisgICAgICAgICAgICBvdXQud3JpdGVJbnQoVEFHKTsKKyAgICAgICAgICAgIG91dC53cml0ZUludCh0aGlzLnZpZXdJZCk7CisgICAgICAgICAgICBvdXQud3JpdGVTdHJpbmcodGhpcy5tZXRob2ROYW1lKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBhcHBseShWaWV3IHJvb3QpIHsKKyAgICAgICAgICAgIGZpbmFsIFZpZXcgdmlldyA9IHJvb3QuZmluZFZpZXdCeUlkKHZpZXdJZCk7CisgICAgICAgICAgICBpZiAodmlldyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFjdGlvbkV4Y2VwdGlvbigiY2FuJ3QgZmluZCB2aWV3OiAweCIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKHZpZXdJZCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDbGFzcyBrbGFzcyA9IHZpZXcuZ2V0Q2xhc3MoKTsKKyAgICAgICAgICAgIE1ldGhvZCBtZXRob2Q7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1ldGhvZCA9IGtsYXNzLmdldE1ldGhvZCh0aGlzLm1ldGhvZE5hbWUpOworICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFjdGlvbkV4Y2VwdGlvbigidmlldzogIiArIGtsYXNzLmdldE5hbWUoKSArICIgZG9lc24ndCBoYXZlIG1ldGhvZDogIgorICAgICAgICAgICAgICAgICAgICAgICAgKyB0aGlzLm1ldGhvZE5hbWUgKyAiKCkiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFtZXRob2QuaXNBbm5vdGF0aW9uUHJlc2VudChSZW1vdGFibGVWaWV3TWV0aG9kLmNsYXNzKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBBY3Rpb25FeGNlcHRpb24oInZpZXc6ICIgKyBrbGFzcy5nZXROYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiBjYW4ndCB1c2UgbWV0aG9kIHdpdGggUmVtb3RlVmlld3M6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgdGhpcy5tZXRob2ROYW1lICsgIigpIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgLy9ub2luc3BlY3Rpb24gQ29uc3RhbnRJZlN0YXRlbWVudAorICAgICAgICAgICAgICAgIGlmIChmYWxzZSkgeworICAgICAgICAgICAgICAgICAgICBMb2cuZCgiUmVtb3RlVmlld3MiLCAidmlldzogIiArIGtsYXNzLmdldE5hbWUoKSArICIgY2FsbGluZyBtZXRob2Q6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgdGhpcy5tZXRob2ROYW1lICsgIigpIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1ldGhvZC5pbnZva2Uodmlldyk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQWN0aW9uRXhjZXB0aW9uKGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKwogICAgIC8qKgogICAgICAqIEJhc2UgY2xhc3MgZm9yIHRoZSByZWZsZWN0aW9uIGFjdGlvbnMuCiAgICAgICovCkBAIC0yODUsNiArMzQyLDcgQEAKICAgICAgICAgc3RhdGljIGZpbmFsIGludCBVUkkgPSAxMTsKICAgICAgICAgc3RhdGljIGZpbmFsIGludCBCSVRNQVAgPSAxMjsKICAgICAgICAgc3RhdGljIGZpbmFsIGludCBCVU5ETEUgPSAxMzsKKyAgICAgICAgc3RhdGljIGZpbmFsIGludCBJTlRFTlQgPSAxNDsKIAogICAgICAgICBpbnQgdmlld0lkOwogICAgICAgICBTdHJpbmcgbWV0aG9kTmFtZTsKQEAgLTM0Nyw2ICs0MDUsOSBAQAogICAgICAgICAgICAgICAgIGNhc2UgQlVORExFOgogICAgICAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gaW4ucmVhZEJ1bmRsZSgpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIElOVEVOVDoKKyAgICAgICAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IEludGVudC5DUkVBVE9SLmNyZWF0ZUZyb21QYXJjZWwoaW4pOworICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KQEAgLTQwMiw2ICs0NjMsOSBAQAogICAgICAgICAgICAgICAgIGNhc2UgQlVORExFOgogICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGVCdW5kbGUoKEJ1bmRsZSkgdGhpcy52YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgSU5URU5UOgorICAgICAgICAgICAgICAgICAgICAoKEludGVudCl0aGlzLnZhbHVlKS53cml0ZVRvUGFyY2VsKG91dCwgZmxhZ3MpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KQEAgLTQzNSw2ICs0OTksOCBAQAogICAgICAgICAgICAgICAgICAgICByZXR1cm4gQml0bWFwLmNsYXNzOwogICAgICAgICAgICAgICAgIGNhc2UgQlVORExFOgogICAgICAgICAgICAgICAgICAgICByZXR1cm4gQnVuZGxlLmNsYXNzOworICAgICAgICAgICAgICAgIGNhc2UgSU5URU5UOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gSW50ZW50LmNsYXNzOwogICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgfQpAQCAtNTYyLDYgKzYyOCw5IEBACiAgICAgICAgICAgICAgICAgY2FzZSBWaWV3R3JvdXBBY3Rpb24uVEFHOgogICAgICAgICAgICAgICAgICAgICBtQWN0aW9ucy5hZGQobmV3IFZpZXdHcm91cEFjdGlvbihwYXJjZWwpKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBSZWZsZWN0aW9uQWN0aW9uV2l0aG91dFBhcmFtcy5UQUc6CisgICAgICAgICAgICAgICAgICAgIG1BY3Rpb25zLmFkZChuZXcgUmVmbGVjdGlvbkFjdGlvbldpdGhvdXRQYXJhbXMocGFyY2VsKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBY3Rpb25FeGNlcHRpb24oIlRhZyAiICsgdGFnICsgIiBub3QgZm91bmQiKTsKICAgICAgICAgICAgICAgICB9CkBAIC01NjksNiArNjM4LDcgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBSZW1vdGVWaWV3cyBjbG9uZSgpIHsKICAgICAgICAgZmluYWwgUmVtb3RlVmlld3MgdGhhdCA9IG5ldyBSZW1vdGVWaWV3cyhtUGFja2FnZSwgbUxheW91dElkKTsKICAgICAgICAgaWYgKG1BY3Rpb25zICE9IG51bGwpIHsKQEAgLTYyMiw2ICs2OTIsMjQgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBFcXVpdmFsZW50IHRvIGNhbGxpbmcge0BsaW5rIEFkYXB0ZXJWaWV3RmxpcHBlciNzaG93TmV4dCgpfQorICAgICAqCisgICAgICogQHBhcmFtIHZpZXdJZCBUaGUgaWQgb2YgdGhlIHZpZXcgb24gd2hpY2ggdG8gY2FsbCB7QGxpbmsgQWRhcHRlclZpZXdGbGlwcGVyI3Nob3dOZXh0KCl9CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2hvd05leHQoaW50IHZpZXdJZCkgeworICAgICAgICBhZGRBY3Rpb24obmV3IFJlZmxlY3Rpb25BY3Rpb25XaXRob3V0UGFyYW1zKHZpZXdJZCwgInNob3dOZXh0IikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEVxdWl2YWxlbnQgdG8gY2FsbGluZyB7QGxpbmsgQWRhcHRlclZpZXdGbGlwcGVyI3Nob3dQcmV2aW91cygpfQorICAgICAqCisgICAgICogQHBhcmFtIHZpZXdJZCBUaGUgaWQgb2YgdGhlIHZpZXcgb24gd2hpY2ggdG8gY2FsbCB7QGxpbmsgQWRhcHRlclZpZXdGbGlwcGVyI3Nob3dQcmV2aW91cygpfQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNob3dQcmV2aW91cyhpbnQgdmlld0lkKSB7CisgICAgICAgIGFkZEFjdGlvbihuZXcgUmVmbGVjdGlvbkFjdGlvbldpdGhvdXRQYXJhbXModmlld0lkLCAic2hvd1ByZXZpb3VzIikpOworICAgIH0KKworICAgIC8qKgogICAgICAqIEVxdWl2YWxlbnQgdG8gY2FsbGluZyBWaWV3LnNldFZpc2liaWxpdHkKICAgICAgKiAKICAgICAgKiBAcGFyYW0gdmlld0lkIFRoZSBpZCBvZiB0aGUgdmlldyB3aG9zZSB2aXNpYmlsaXR5IHNob3VsZCBjaGFuZ2UKQEAgLTc2OSw2ICs4NTcsMzcgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBFcXVpdmFsZW50IHRvIGNhbGxpbmcge0BsaW5rIGFuZHJvaWQud2lkZ2V0LkFic0xpc3RWaWV3I3NldFJlbW90ZVZpZXdzQWRhcHRlcihJbnRlbnQpfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2aWV3SWQgVGhlIGlkIG9mIHRoZSB2aWV3IHdob3NlIHRleHQgc2hvdWxkIGNoYW5nZQorICAgICAqIEBwYXJhbSBpbnRlbnQgVGhlIGludGVudCBvZiB0aGUgc2VydmljZSB3aGljaCB3aWxsIGJlCisgICAgICogICAgICAgICAgICBwcm92aWRpbmcgZGF0YSB0byB0aGUgUmVtb3RlVmlld3NBZGFwdGVyCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVtb3RlQWRhcHRlcihpbnQgdmlld0lkLCBJbnRlbnQgaW50ZW50KSB7CisgICAgICAgIHNldEludGVudCh2aWV3SWQsICJzZXRSZW1vdGVWaWV3c0FkYXB0ZXIiLCBpbnRlbnQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEVxdWl2YWxlbnQgdG8gY2FsbGluZyB7QGxpbmsgYW5kcm9pZC53aWRnZXQuQWJzTGlzdFZpZXcjc21vb3RoU2Nyb2xsVG9Qb3NpdGlvbihpbnQsIGludCl9LgorICAgICAqCisgICAgICogQHBhcmFtIHZpZXdJZCBUaGUgaWQgb2YgdGhlIHZpZXcgd2hvc2UgdGV4dCBzaG91bGQgY2hhbmdlCisgICAgICogQHBhcmFtIHBvc2l0aW9uIFNjcm9sbCB0byB0aGlzIGFkYXB0ZXIgcG9zaXRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTY3JvbGxQb3NpdGlvbihpbnQgdmlld0lkLCBpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgc2V0SW50KHZpZXdJZCwgInNtb290aFNjcm9sbFRvUG9zaXRpb24iLCBwb3NpdGlvbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogRXF1aXZhbGVudCB0byBjYWxsaW5nIHtAbGluayBhbmRyb2lkLndpZGdldC5BYnNMaXN0VmlldyNzbW9vdGhTY3JvbGxUb1Bvc2l0aW9uKGludCwgaW50KX0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmlld0lkIFRoZSBpZCBvZiB0aGUgdmlldyB3aG9zZSB0ZXh0IHNob3VsZCBjaGFuZ2UKKyAgICAgKiBAcGFyYW0gb2Zmc2V0IFNjcm9sbCBieSB0aGlzIGFkYXB0ZXIgcG9zaXRpb24gb2Zmc2V0CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVsYXRpdmVTY3JvbGxQb3NpdGlvbihpbnQgdmlld0lkLCBpbnQgb2Zmc2V0KSB7CisgICAgICAgIHNldEludCh2aWV3SWQsICJzbW9vdGhTY3JvbGxCeU9mZnNldCIsIG9mZnNldCk7CisgICAgfQorCisgICAgLyoqCiAgICAgICogQ2FsbCBhIG1ldGhvZCB0YWtpbmcgb25lIGJvb2xlYW4gb24gYSB2aWV3IGluIHRoZSBsYXlvdXQgZm9yIHRoaXMgUmVtb3RlVmlld3MuCiAgICAgICoKICAgICAgKiBAcGFyYW0gdmlld0lkIFRoZSBpZCBvZiB0aGUgdmlldyB3aG9zZSB0ZXh0IHNob3VsZCBjaGFuZ2UKQEAgLTkxNSw2ICsxMDM0LDE2IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmlld0lkCisgICAgICogQHBhcmFtIG1ldGhvZE5hbWUKKyAgICAgKiBAcGFyYW0gdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJbnRlbnQoaW50IHZpZXdJZCwgU3RyaW5nIG1ldGhvZE5hbWUsIEludGVudCB2YWx1ZSkgeworICAgICAgICBhZGRBY3Rpb24obmV3IFJlZmxlY3Rpb25BY3Rpb24odmlld0lkLCBtZXRob2ROYW1lLCBSZWZsZWN0aW9uQWN0aW9uLklOVEVOVCwgdmFsdWUpKTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBJbmZsYXRlcyB0aGUgdmlldyBoaWVyYXJjaHkgcmVwcmVzZW50ZWQgYnkgdGhpcyBvYmplY3QgYW5kIGFwcGxpZXMKICAgICAgKiBhbGwgb2YgdGhlIGFjdGlvbnMuCiAgICAgICogCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvUmVtb3RlVmlld3NBZGFwdGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvUmVtb3RlVmlld3NBZGFwdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2QxZTQyMgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9SZW1vdGVWaWV3c0FkYXB0ZXIuamF2YQpAQCAtMCwwICsxLDczOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC53aWRnZXQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuU2VydmljZUNvbm5lY3Rpb247CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Db2xvcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyVGhyZWFkOworaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuR3Jhdml0eTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3Lk1lYXN1cmVTcGVjOworCitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0LklSZW1vdGVWaWV3c0ZhY3Rvcnk7CisKKy8qKgorICogQW4gYWRhcHRlciB0byBhIFJlbW90ZVZpZXdzU2VydmljZSB3aGljaCBmZXRjaGVzIGFuZCBjYWNoZXMgUmVtb3RlVmlld3MKKyAqIHRvIGJlIGxhdGVyIGluZmxhdGVkIGFzIGNoaWxkIHZpZXdzLgorICovCisvKiogQGhpZGUgKi8KK3B1YmxpYyBjbGFzcyBSZW1vdGVWaWV3c0FkYXB0ZXIgZXh0ZW5kcyBCYXNlQWRhcHRlciB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJSZW1vdGVWaWV3c0FkYXB0ZXIiOworCisgICAgcHJpdmF0ZSBDb250ZXh0IG1Db250ZXh0OworICAgIHByaXZhdGUgSW50ZW50IG1JbnRlbnQ7CisgICAgcHJpdmF0ZSBSZW1vdGVWaWV3c0FkYXB0ZXJTZXJ2aWNlQ29ubmVjdGlvbiBtU2VydmljZUNvbm5lY3Rpb247CisgICAgcHJpdmF0ZSBSZW1vdGVWaWV3c0NhY2hlIG1WaWV3Q2FjaGU7CisKKyAgICBwcml2YXRlIEhhbmRsZXJUaHJlYWQgbVdvcmtlclRocmVhZDsKKyAgICAvLyBpdGVtcyBtYXkgYmUgaW50ZXJydXB0ZWQgd2l0aGluIHRoZSBub3JtYWxseSBwcm9jZXNzZWQgcXVldWVzCisgICAgcHJpdmF0ZSBIYW5kbGVyIG1Xb3JrZXJRdWV1ZTsKKyAgICBwcml2YXRlIEhhbmRsZXIgbU1haW5RdWV1ZTsKKyAgICAvLyBpdGVtcyBhcmUgbmV2ZXIgZGVxdWV1ZWQgZnJvbSB0aGUgcHJpb3JpdHkgcXVldWUgYW5kIG11c3QgcnVuCisgICAgcHJpdmF0ZSBIYW5kbGVyIG1Xb3JrZXJQcmlvcml0eVF1ZXVlOworICAgIHByaXZhdGUgSGFuZGxlciBtTWFpblByaW9yaXR5UXVldWU7CisKKyAgICAvKioKKyAgICAgKiBBbiBpbnRlcmZhY2UgZm9yIHRoZSBSZW1vdGVBZGFwdGVyIHRvIG5vdGlmeSBvdGhlciBjbGFzc2VzIHdoZW4gYWRhcHRlcnMKKyAgICAgKiBhcmUgYWN0dWFsbHkgY29ubmVjdGVkIHRvL2Rpc2Nvbm5lY3RlZCBmcm9tIHRoZWlyIGFjdHVhbCBzZXJ2aWNlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50ZXJmYWNlIFJlbW90ZUFkYXB0ZXJDb25uZWN0aW9uQ2FsbGJhY2sgeworICAgICAgICBwdWJsaWMgdm9pZCBvblJlbW90ZUFkYXB0ZXJDb25uZWN0ZWQoKTsKKworICAgICAgICBwdWJsaWMgdm9pZCBvblJlbW90ZUFkYXB0ZXJEaXNjb25uZWN0ZWQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgc2VydmljZSBjb25uZWN0aW9uIHRoYXQgZ2V0cyBwb3B1bGF0ZWQgd2hlbiB0aGUgUmVtb3RlVmlld3NTZXJ2aWNlIGlzCisgICAgICogYm91bmQuCisgICAgICovCisgICAgcHJpdmF0ZSBjbGFzcyBSZW1vdGVWaWV3c0FkYXB0ZXJTZXJ2aWNlQ29ubmVjdGlvbiBpbXBsZW1lbnRzIFNlcnZpY2VDb25uZWN0aW9uIHsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1Db25uZWN0ZWQ7CisgICAgICAgIHByaXZhdGUgSVJlbW90ZVZpZXdzRmFjdG9yeSBtUmVtb3RlVmlld3NGYWN0b3J5OworICAgICAgICBwcml2YXRlIFJlbW90ZUFkYXB0ZXJDb25uZWN0aW9uQ2FsbGJhY2sgbUNhbGxiYWNrOworCisgICAgICAgIHB1YmxpYyBSZW1vdGVWaWV3c0FkYXB0ZXJTZXJ2aWNlQ29ubmVjdGlvbihSZW1vdGVBZGFwdGVyQ29ubmVjdGlvbkNhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgICAgICAgICBtQ2FsbGJhY2sgPSBjYWxsYmFjazsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG9uU2VydmljZUNvbm5lY3RlZChDb21wb25lbnROYW1lIG5hbWUsIElCaW5kZXIgc2VydmljZSkgeworICAgICAgICAgICAgbVJlbW90ZVZpZXdzRmFjdG9yeSA9IElSZW1vdGVWaWV3c0ZhY3RvcnkuU3R1Yi5hc0ludGVyZmFjZShzZXJ2aWNlKTsKKyAgICAgICAgICAgIG1Db25uZWN0ZWQgPSB0cnVlOworCisgICAgICAgICAgICAvLyBub3RpZnlEYXRhU2V0Q2hhbmdlZCBzaG91bGQgYmUgY2FsbGVkIGZpcnN0LCB0byBlbnN1cmUgdGhhdCB0aGUKKyAgICAgICAgICAgIC8vIHZpZXdzIGFyZSBub3QgdXBkYXRlZCB0d2ljZQorICAgICAgICAgICAgbm90aWZ5RGF0YVNldENoYW5nZWQoKTsKKworICAgICAgICAgICAgLy8gcG9zdCBhIG5ldyBydW5uYWJsZSB0byBsb2FkIHRoZSBhcHByb3ByaWF0ZSBkYXRhLCB0aGVuIGNhbGxiYWNrCisgICAgICAgICAgICBtV29ya2VyUHJpb3JpdHlRdWV1ZS5wb3N0KG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHdlIG5lZWQgdG8gZ2V0IHRoZSB2aWV3VHlwZUNvdW50IHNwZWNpZmljYWxseSwgc28ganVzdCBnZXQgYWxsIHRoZQorICAgICAgICAgICAgICAgICAgICAvLyBtZXRhZGF0YQorICAgICAgICAgICAgICAgICAgICBtVmlld0NhY2hlLnJlcXVlc3RNZXRhRGF0YSgpOworCisgICAgICAgICAgICAgICAgICAgIC8vIHBvc3QgYSBydW5uYWJsZSB0byBjYWxsIHRoZSBjYWxsYmFjayBvbiB0aGUgbWFpbiB0aHJlYWQKKyAgICAgICAgICAgICAgICAgICAgbU1haW5Qcmlvcml0eVF1ZXVlLnBvc3QobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1DYWxsYmFjayAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2FsbGJhY2sub25SZW1vdGVBZGFwdGVyQ29ubmVjdGVkKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICAvLyBzdGFydCB0aGUgYmFja2dyb3VuZCBsb2FkZXIKKyAgICAgICAgICAgIG1WaWV3Q2FjaGUuc3RhcnRCYWNrZ3JvdW5kTG9hZGVyKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBvblNlcnZpY2VEaXNjb25uZWN0ZWQoQ29tcG9uZW50TmFtZSBuYW1lKSB7CisgICAgICAgICAgICBtUmVtb3RlVmlld3NGYWN0b3J5ID0gbnVsbDsKKyAgICAgICAgICAgIG1Db25uZWN0ZWQgPSBmYWxzZTsKKworICAgICAgICAgICAgLy8gY2xlYXIgdGhlIG1haW4vd29ya2VyIHF1ZXVlcworICAgICAgICAgICAgbU1haW5RdWV1ZS5yZW1vdmVNZXNzYWdlcygwKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gc3RvcCB0aGUgYmFja2dyb3VuZCBsb2FkZXIKKyAgICAgICAgICAgIG1WaWV3Q2FjaGUuc3RvcEJhY2tncm91bmRMb2FkZXIoKTsKKworICAgICAgICAgICAgaWYgKG1DYWxsYmFjayAhPSBudWxsKQorICAgICAgICAgICAgICAgIG1DYWxsYmFjay5vblJlbW90ZUFkYXB0ZXJEaXNjb25uZWN0ZWQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBJUmVtb3RlVmlld3NGYWN0b3J5IGdldFJlbW90ZVZpZXdzRmFjdG9yeSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtUmVtb3RlVmlld3NGYWN0b3J5OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNDb25uZWN0ZWQoKSB7CisgICAgICAgICAgICByZXR1cm4gbUNvbm5lY3RlZDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEFuIGludGVybmFsIGNhY2hlIG9mIHJlbW90ZSB2aWV3cy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGNsYXNzIFJlbW90ZVZpZXdzQ2FjaGUgeworICAgICAgICBwcml2YXRlIFJlbW90ZVZpZXdzSW5mbyBtVmlld0NhY2hlSW5mbzsKKyAgICAgICAgcHJpdmF0ZSBSZW1vdGVWaWV3c0luZGV4SW5mb1tdIG1WaWV3Q2FjaGU7CisgICAgICAgIHByaXZhdGUgaW50W10gbVRtcFZpZXdDYWNoZUxvYWRJbmRpY2VzOworICAgICAgICBwcml2YXRlIExpbmtlZExpc3Q8SW50ZWdlcj4gbVZpZXdDYWNoZUxvYWRJbmRpY2VzOworICAgICAgICBwcml2YXRlIGJvb2xlYW4gbUJhY2tncm91bmRMb2FkZXJFbmFibGVkOworCisgICAgICAgIC8vIGlmIGEgdXNlciBsb2FkaW5nIHZpZXcgaXMgbm90IHByb3ZpZGVkLCB0aGVuIHdlIGNyZWF0ZSBhIHRlbXBvcmFyeSBvbmUKKyAgICAgICAgLy8gZm9yIHRoZSB1c2VyIHVzaW5nIHRoZSBoZWlnaHQgb2YgdGhlIGZpcnN0IHZpZXcKKyAgICAgICAgcHJpdmF0ZSBSZW1vdGVWaWV3cyBtVXNlckxvYWRpbmdWaWV3OworICAgICAgICBwcml2YXRlIFJlbW90ZVZpZXdzIG1GaXJzdFZpZXc7CisgICAgICAgIHByaXZhdGUgaW50IG1GaXJzdFZpZXdIZWlnaHQ7CisKKyAgICAgICAgLy8gZGV0ZXJtaW5lcyB3aGVuIHRoZSBjdXJyZW50IGNhY2hlIHdpbmRvdyBuZWVkcyB0byBiZSB1cGRhdGVkIHdpdGggbmV3CisgICAgICAgIC8vIGl0ZW1zIChpZS4gd2hlbiB0aGVyZSBpcyBub3QgZW5vdWdoIHNsYWNrKQorICAgICAgICBwcml2YXRlIGludCBtVmlld0NhY2hlU3RhcnRQb3NpdGlvbjsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbVZpZXdDYWNoZUVuZFBvc2l0aW9uOworICAgICAgICBwcml2YXRlIGludCBtSGFsZkNhY2hlU2l6ZTsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbUNhY2hlU2xhY2s7CisgICAgICAgIHByaXZhdGUgZmluYWwgZmxvYXQgbUNhY2hlU2xhY2tQZXJjZW50YWdlID0gMC43NWY7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBkYXRhIHN0cnVjdHVyZSBzdG9yZWQgYXQgZWFjaCBpbmRleCBvZiB0aGUgY2FjaGUuIEFueSBtZW1iZXIgCisgICAgICAgICAqIHRoYXQgaXMgbm90IGludmFsaWRhdGVkIHBlcnNpc3RzIHRocm91Z2hvdXQgdGhlIGxpZmV0aW1lIG9mIHRoZSBjYWNoZS4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgY2xhc3MgUmVtb3RlVmlld3NJbmRleEluZm8geworICAgICAgICAgICAgRnJhbWVMYXlvdXQgZmxpcHBlcjsKKyAgICAgICAgICAgIFJlbW90ZVZpZXdzIHZpZXc7CisgICAgICAgICAgICBsb25nIGl0ZW1JZDsKKyAgICAgICAgICAgIGludCB0eXBlSWQ7CisKKyAgICAgICAgICAgIFJlbW90ZVZpZXdzSW5kZXhJbmZvKCkgeworICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdm9pZCBzZXQoUmVtb3RlVmlld3MgdiwgbG9uZyBpZCkgeworICAgICAgICAgICAgICAgIHZpZXcgPSB2OworICAgICAgICAgICAgICAgIGl0ZW1JZCA9IGlkOworICAgICAgICAgICAgICAgIGlmICh2ICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHR5cGVJZCA9IHYuZ2V0TGF5b3V0SWQoKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHR5cGVJZCA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZvaWQgaW52YWxpZGF0ZSgpIHsKKyAgICAgICAgICAgICAgICB2aWV3ID0gbnVsbDsKKyAgICAgICAgICAgICAgICBpdGVtSWQgPSAwOworICAgICAgICAgICAgICAgIHR5cGVJZCA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNWYWxpZCgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKHZpZXcgIT0gbnVsbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmVtb3RlIGFkYXB0ZXIgbWV0YWRhdGEuIFVzZWZ1bCBmb3Igd2hlbiB3ZSBoYXZlIHRvIGxvY2sgb24gc29tZXRoaW5nCisgICAgICAgICAqIGJlZm9yZSB1cGRhdGluZyB0aGUgbWV0YWRhdGEuCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIGNsYXNzIFJlbW90ZVZpZXdzSW5mbyB7CisgICAgICAgICAgICBpbnQgY291bnQ7CisgICAgICAgICAgICBpbnQgdmlld1R5cGVDb3VudDsKKyAgICAgICAgICAgIGJvb2xlYW4gaGFzU3RhYmxlSWRzOworICAgICAgICAgICAgYm9vbGVhbiBpc0RhdGFEaXJ0eTsKKyAgICAgICAgICAgIE1hcDxJbnRlZ2VyLCBJbnRlZ2VyPiBtVHlwZUlkSW5kZXhNYXA7CisKKyAgICAgICAgICAgIFJlbW90ZVZpZXdzSW5mbygpIHsKKyAgICAgICAgICAgICAgICBjb3VudCA9IDA7CisgICAgICAgICAgICAgICAgLy8gYnkgZGVmYXVsdCB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgZHVtbXkgdmlldyB0eXBlCisgICAgICAgICAgICAgICAgdmlld1R5cGVDb3VudCA9IDE7CisgICAgICAgICAgICAgICAgaGFzU3RhYmxlSWRzID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBpc0RhdGFEaXJ0eSA9IGZhbHNlOworICAgICAgICAgICAgICAgIG1UeXBlSWRJbmRleE1hcCA9IG5ldyBIYXNoTWFwPEludGVnZXIsIEludGVnZXI+KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgUmVtb3RlVmlld3NDYWNoZShpbnQgaGFsZkNhY2hlU2l6ZSkgeworICAgICAgICAgICAgbUhhbGZDYWNoZVNpemUgPSBoYWxmQ2FjaGVTaXplOworICAgICAgICAgICAgbUNhY2hlU2xhY2sgPSBNYXRoLnJvdW5kKG1DYWNoZVNsYWNrUGVyY2VudGFnZSAqIG1IYWxmQ2FjaGVTaXplKTsKKyAgICAgICAgICAgIG1WaWV3Q2FjaGVTdGFydFBvc2l0aW9uID0gMDsKKyAgICAgICAgICAgIG1WaWV3Q2FjaGVFbmRQb3NpdGlvbiA9IC0xOworICAgICAgICAgICAgbUJhY2tncm91bmRMb2FkZXJFbmFibGVkID0gZmFsc2U7CisKKyAgICAgICAgICAgIC8vIGluaXRpYWxpemUgdGhlIGNhY2hlCisgICAgICAgICAgICBpbnQgY2FjaGVTaXplID0gMiAqIG1IYWxmQ2FjaGVTaXplICsgMTsKKyAgICAgICAgICAgIG1WaWV3Q2FjaGVJbmZvID0gbmV3IFJlbW90ZVZpZXdzSW5mbygpOworICAgICAgICAgICAgbVZpZXdDYWNoZSA9IG5ldyBSZW1vdGVWaWV3c0luZGV4SW5mb1tjYWNoZVNpemVdOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtVmlld0NhY2hlLmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICAgICAgbVZpZXdDYWNoZVtpXSA9IG5ldyBSZW1vdGVWaWV3c0luZGV4SW5mbygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVRtcFZpZXdDYWNoZUxvYWRJbmRpY2VzID0gbmV3IGludFtjYWNoZVNpemVdOworICAgICAgICAgICAgbVZpZXdDYWNoZUxvYWRJbmRpY2VzID0gbmV3IExpbmtlZExpc3Q8SW50ZWdlcj4oKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBjb250YWlucyhpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgICAgIHJldHVybiAobVZpZXdDYWNoZVN0YXJ0UG9zaXRpb24gPD0gcG9zaXRpb24pICYmIChwb3NpdGlvbiA8PSBtVmlld0NhY2hlRW5kUG9zaXRpb24pOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGNvbnRhaW5zQW5kSXNWYWxpZChpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgICAgIGlmIChjb250YWlucyhwb3NpdGlvbikpIHsKKyAgICAgICAgICAgICAgICBSZW1vdGVWaWV3c0luZGV4SW5mbyBpbmRleEluZm8gPSBtVmlld0NhY2hlW2dldENhY2hlSW5kZXgocG9zaXRpb24pXTsKKyAgICAgICAgICAgICAgICBpZiAoaW5kZXhJbmZvLmlzVmFsaWQoKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGZpbmFsIGludCBnZXRDYWNoZUluZGV4KGludCBwb3NpdGlvbikgeworICAgICAgICAgICAgLy8gdGFrZSB0aGUgbW9kdWxvIG9mIHRoZSBwb3NpdGlvbgorICAgICAgICAgICAgcmV0dXJuIChtVmlld0NhY2hlLmxlbmd0aCArIChwb3NpdGlvbiAlIG1WaWV3Q2FjaGUubGVuZ3RoKSkgJSBtVmlld0NhY2hlLmxlbmd0aDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHJlcXVlc3RNZXRhRGF0YSgpIHsKKyAgICAgICAgICAgIGlmIChtU2VydmljZUNvbm5lY3Rpb24uaXNDb25uZWN0ZWQoKSkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIElSZW1vdGVWaWV3c0ZhY3RvcnkgZmFjdG9yeSA9IG1TZXJ2aWNlQ29ubmVjdGlvbi5nZXRSZW1vdGVWaWV3c0ZhY3RvcnkoKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIHByb3BlcnRpZXMvZmlyc3QgdmlldyAoc28gdGhhdCB3ZSBjYW4gdXNlIGl0IHRvCisgICAgICAgICAgICAgICAgICAgIC8vIG1lYXN1cmUgb3VyIGR1bW15IHZpZXdzKQorICAgICAgICAgICAgICAgICAgICBib29sZWFuIGhhc1N0YWJsZUlkcyA9IGZhY3RvcnkuaGFzU3RhYmxlSWRzKCk7CisgICAgICAgICAgICAgICAgICAgIGludCB2aWV3VHlwZUNvdW50ID0gZmFjdG9yeS5nZXRWaWV3VHlwZUNvdW50KCk7CisgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCA9IGZhY3RvcnkuZ2V0Q291bnQoKTsKKyAgICAgICAgICAgICAgICAgICAgUmVtb3RlVmlld3MgbG9hZGluZ1ZpZXcgPSBmYWN0b3J5LmdldExvYWRpbmdWaWV3KCk7CisgICAgICAgICAgICAgICAgICAgIFJlbW90ZVZpZXdzIGZpcnN0VmlldyA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIGlmICgoY291bnQgPiAwKSAmJiAobG9hZGluZ1ZpZXcgPT0gbnVsbCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0VmlldyA9IGZhY3RvcnkuZ2V0Vmlld0F0KDApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVZpZXdDYWNoZUluZm8pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFJlbW90ZVZpZXdzSW5mbyBpbmZvID0gbVZpZXdDYWNoZUluZm87CisgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLmhhc1N0YWJsZUlkcyA9IGhhc1N0YWJsZUlkczsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZm8udmlld1R5cGVDb3VudCA9IHZpZXdUeXBlQ291bnQgKyAxOworICAgICAgICAgICAgICAgICAgICAgICAgaW5mby5jb3VudCA9IGNvdW50OworICAgICAgICAgICAgICAgICAgICAgICAgbVVzZXJMb2FkaW5nVmlldyA9IGxvYWRpbmdWaWV3OworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0VmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZpcnN0VmlldyA9IGZpcnN0VmlldzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRmlyc3RWaWV3SGVpZ2h0ID0gLTE7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uTm90aWZ5RGF0YVNldENoYW5nZWQoKSB7CisgICAgICAgICAgICAvLyB3ZSBtYXJrIHRoZSBkYXRhIGFzIGRpcnR5IHNvIHRoYXQgdGhlIG5leHQgY2FsbCB0byBmZXRjaCB2aWV3cyB3aWxsIHJlc3VsdCBpbgorICAgICAgICAgICAgLy8gYW4gb25EYXRhU2V0RGlydHkoKSBjYWxsIGZyb20gdGhlIGFkYXB0ZXIKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVZpZXdDYWNoZUluZm8pIHsKKyAgICAgICAgICAgICAgICBtVmlld0NhY2hlSW5mby5pc0RhdGFEaXJ0eSA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgdXBkYXRlTm90aWZ5RGF0YVNldENoYW5nZWQoKSB7CisgICAgICAgICAgICAvLyBhY3R1YWxseSBjYWxscyB0aHJvdWdoIHRvIHRoZSBmYWN0b3J5IHRvIG5vdGlmeSBpdCB0byB1cGRhdGUKKyAgICAgICAgICAgIGlmIChtU2VydmljZUNvbm5lY3Rpb24uaXNDb25uZWN0ZWQoKSkgeworICAgICAgICAgICAgICAgIElSZW1vdGVWaWV3c0ZhY3RvcnkgZmFjdG9yeSA9IG1TZXJ2aWNlQ29ubmVjdGlvbi5nZXRSZW1vdGVWaWV3c0ZhY3RvcnkoKTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBmYWN0b3J5Lm9uRGF0YVNldENoYW5nZWQoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyByZS1yZXF1ZXN0IHRoZSBuZXcgbWV0YWRhdGEgKG9ubHkgYWZ0ZXIgdGhlIG5vdGlmaWNhdGlvbiB0byB0aGUgZmFjdG9yeSkKKyAgICAgICAgICAgIHJlcXVlc3RNZXRhRGF0YSgpOworCisgICAgICAgICAgICAvLyBwb3N0IGEgbmV3IHJ1bm5hYmxlIG9uIHRoZSBtYWluIHRocmVhZCB0byBwcm9wYWdhdGUgdGhlIG5vdGlmaWNhdGlvbiBiYWNrCisgICAgICAgICAgICAvLyB0byB0aGUgYmFzZSBhZGFwdGVyCisgICAgICAgICAgICBtTWFpblF1ZXVlLnBvc3QobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICBjb21wbGV0ZU5vdGlmeURhdGFTZXRDaGFuZ2VkKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVSZW1vdGVWaWV3c0luZm8oaW50IHBvc2l0aW9uKSB7CisgICAgICAgICAgICBpZiAobVNlcnZpY2VDb25uZWN0aW9uLmlzQ29ubmVjdGVkKCkpIHsKKyAgICAgICAgICAgICAgICBJUmVtb3RlVmlld3NGYWN0b3J5IGZhY3RvcnkgPSBtU2VydmljZUNvbm5lY3Rpb24uZ2V0UmVtb3RlVmlld3NGYWN0b3J5KCk7CisKKyAgICAgICAgICAgICAgICAvLyBsb2FkIHRoZSBpdGVtIGluZm9ybWF0aW9uCisgICAgICAgICAgICAgICAgUmVtb3RlVmlld3MgcmVtb3RlVmlldyA9IG51bGw7CisgICAgICAgICAgICAgICAgbG9uZyBpdGVtSWQgPSAwOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHJlbW90ZVZpZXcgPSBmYWN0b3J5LmdldFZpZXdBdChwb3NpdGlvbik7CisgICAgICAgICAgICAgICAgICAgIGl0ZW1JZCA9IGZhY3RvcnkuZ2V0SXRlbUlkKHBvc2l0aW9uKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVZpZXdDYWNoZSkgeworICAgICAgICAgICAgICAgICAgICAvLyBza2lwIGlmIHRoZSB3aW5kb3cgaGFzIG1vdmVkCisgICAgICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbiA8IG1WaWV3Q2FjaGVTdGFydFBvc2l0aW9uIHx8IHBvc2l0aW9uID4gbVZpZXdDYWNoZUVuZFBvc2l0aW9uKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBwb3NpdGlvbkluZGV4ID0gcG9zaXRpb247CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBjYWNoZUluZGV4ID0gZ2V0Q2FjaGVJbmRleChwb3NpdGlvbik7CisgICAgICAgICAgICAgICAgICAgIG1WaWV3Q2FjaGVbY2FjaGVJbmRleF0uc2V0KHJlbW90ZVZpZXcsIGl0ZW1JZCk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gbm90aWZ5IHRoZSBtYWluIHRocmVhZCB3aGVuIGRvbmUgbG9hZGluZworICAgICAgICAgICAgICAgICAgICAvLyBmbHVzaCBwZW5kaW5nIHVwZGF0ZXMKKyAgICAgICAgICAgICAgICAgICAgbU1haW5RdWV1ZS5wb3N0KG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN3YXAgdGhlIGxvYWRlciB2aWV3IGZvciB0aGlzIHZpZXcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1WaWV3Q2FjaGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRhaW5zQW5kSXNWYWxpZChwb3NpdGlvbkluZGV4KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVtb3RlVmlld3NJbmRleEluZm8gaW5kZXhJbmZvID0gbVZpZXdDYWNoZVtjYWNoZUluZGV4XTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYW1lTGF5b3V0IGZsaXBwZXIgPSBpbmRleEluZm8uZmxpcHBlcjsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSBmbGlwcGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGlwcGVyLmdldENoaWxkQXQoMCkuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBhZGROZXdWaWV3ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmbGlwcGVyLmdldENoaWxkQ291bnQoKSA+IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaWV3IHYgPSBmbGlwcGVyLmdldENoaWxkQXQoMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHR5cGVJZCA9ICgoSW50ZWdlcikgdi5nZXRUYWcoKSkuaW50VmFsdWUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZUlkID09IGluZGV4SW5mby50eXBlSWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgY2FuIHJlYXBwbHkgc2luY2UgaXQgaXMgdGhlIHNhbWUgdHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleEluZm8udmlldy5yZWFwcGx5KG1Db250ZXh0LCB2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdi5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2LmdldEFuaW1hdGlvbigpICE9IG51bGwpIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdi5idWlsZERyYXdpbmdDYWNoZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGROZXdWaWV3ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxpcHBlci5yZW1vdmVWaWV3QXQoMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFkZE5ld1ZpZXcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaWV3IHYgPSBpbmRleEluZm8udmlldy5hcHBseShtQ29udGV4dCwgZmxpcHBlcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdi5zZXRUYWcobmV3IEludGVnZXIoaW5kZXhJbmZvLnR5cGVJZCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsaXBwZXIuYWRkVmlldyh2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBSZW1vdGVWaWV3c0luZGV4SW5mbyByZXF1ZXN0Q2FjaGVkSW5kZXhJbmZvKGZpbmFsIGludCBwb3NpdGlvbikgeworICAgICAgICAgICAgaW50IGluZGljZXNUb0xvYWRDb3VudCA9IDA7CisKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVZpZXdDYWNoZSkgeworICAgICAgICAgICAgICAgIGlmIChjb250YWluc0FuZElzVmFsaWQocG9zaXRpb24pKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHJldHVybiB0aGUgaW5mbyBpZiBpdCBleGlzdHMgaW4gdGhlIHdpbmRvdyBhbmQgaXMgbG9hZGVkCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtVmlld0NhY2hlW2dldENhY2hlSW5kZXgocG9zaXRpb24pXTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBpZiBuZWNlc3NhcnkgdXBkYXRlIHRoZSB3aW5kb3cgYW5kIGxvYWQgdGhlIG5ldyBpbmZvcm1hdGlvbgorICAgICAgICAgICAgICAgIGludCBjZW50ZXJQb3NpdGlvbiA9IChtVmlld0NhY2hlRW5kUG9zaXRpb24gKyBtVmlld0NhY2hlU3RhcnRQb3NpdGlvbikgLyAyOworICAgICAgICAgICAgICAgIGlmICgobVZpZXdDYWNoZUVuZFBvc2l0aW9uIDw9IG1WaWV3Q2FjaGVTdGFydFBvc2l0aW9uKSB8fCAoTWF0aC5hYnMocG9zaXRpb24gLSBjZW50ZXJQb3NpdGlvbikgPiBtQ2FjaGVTbGFjaykpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IG5ld1N0YXJ0UG9zaXRpb24gPSBwb3NpdGlvbiAtIG1IYWxmQ2FjaGVTaXplOworICAgICAgICAgICAgICAgICAgICBpbnQgbmV3RW5kUG9zaXRpb24gPSBwb3NpdGlvbiArIG1IYWxmQ2FjaGVTaXplOworICAgICAgICAgICAgICAgICAgICBpbnQgZnJhbWVTaXplID0gbUhhbGZDYWNoZVNpemUgLyA0OworICAgICAgICAgICAgICAgICAgICBpbnQgZnJhbWVDb3VudCA9IChpbnQpIE1hdGguY2VpbChtVmlld0NhY2hlLmxlbmd0aCAvIChmbG9hdCkgZnJhbWVTaXplKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBwcnVuZS9hZGQgYmVmb3JlIHRoZSBjdXJyZW50IHN0YXJ0IHBvc2l0aW9uCisgICAgICAgICAgICAgICAgICAgIGludCBlZmZlY3RpdmVTdGFydCA9IE1hdGgubWF4KG5ld1N0YXJ0UG9zaXRpb24sIDApOworICAgICAgICAgICAgICAgICAgICBpbnQgZWZmZWN0aXZlRW5kID0gTWF0aC5taW4obmV3RW5kUG9zaXRpb24sIGdldENvdW50KCkgLSAxKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBpbnZhbGlkYXRlIGl0ZW1zIGluIHRoZSBxdWV1ZQorICAgICAgICAgICAgICAgICAgICBpbnQgb3ZlcmxhcFN0YXJ0ID0gTWF0aC5tYXgobVZpZXdDYWNoZVN0YXJ0UG9zaXRpb24sIGVmZmVjdGl2ZVN0YXJ0KTsKKyAgICAgICAgICAgICAgICAgICAgaW50IG92ZXJsYXBFbmQgPSBNYXRoLm1pbihNYXRoLm1heChtVmlld0NhY2hlU3RhcnRQb3NpdGlvbiwgbVZpZXdDYWNoZUVuZFBvc2l0aW9uKSwgZWZmZWN0aXZlRW5kKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAoZnJhbWVTaXplICogZnJhbWVDb3VudCk7ICsraSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4ID0gbmV3U3RhcnRQb3NpdGlvbiArICgoaSAlIGZyYW1lU2l6ZSkgKiBmcmFtZUNvdW50ICsgKGkgLyBmcmFtZVNpemUpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4IDw9IG5ld0VuZFBvc2l0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChvdmVybGFwU3RhcnQgPD0gaW5kZXgpICYmIChpbmRleCA8PSBvdmVybGFwRW5kKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsb2FkIHRoZSBzdHVmZiBpbiB0aGUgbWlkZGxlIHRoYXQgaGFzIG5vdCBhbHJlYWR5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJlZW4gbG9hZGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbVZpZXdDYWNoZVtnZXRDYWNoZUluZGV4KGluZGV4KV0uaXNWYWxpZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVG1wVmlld0NhY2hlTG9hZEluZGljZXNbaW5kaWNlc1RvTG9hZENvdW50KytdID0gaW5kZXg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChlZmZlY3RpdmVTdGFydCA8PSBpbmRleCkgJiYgKGluZGV4IDw9IGVmZmVjdGl2ZUVuZCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW52YWxpZGF0ZSBhbmQgbG9hZCBhbGwgbmV3IGVmZmVjdGl2ZSBpdGVtcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVmlld0NhY2hlW2dldENhY2hlSW5kZXgoaW5kZXgpXS5pbnZhbGlkYXRlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1UbXBWaWV3Q2FjaGVMb2FkSW5kaWNlc1tpbmRpY2VzVG9Mb2FkQ291bnQrK10gPSBpbmRleDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnZhbGlkYXRlIGFsbCBvdGhlciBjYWNoZSBpbmRpY2VzIChvdXRzaWRlIHRoZSBlZmZlY3RpdmUgc3RhcnQvZW5kKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBidXQgZG9uJ3QgbG9hZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVmlld0NhY2hlW2dldENhY2hlSW5kZXgoaW5kZXgpXS5pbnZhbGlkYXRlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgbVZpZXdDYWNoZVN0YXJ0UG9zaXRpb24gPSBuZXdTdGFydFBvc2l0aW9uOworICAgICAgICAgICAgICAgICAgICBtVmlld0NhY2hlRW5kUG9zaXRpb24gPSBuZXdFbmRQb3NpdGlvbjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHBvc3QgaXRlbXMgdG8gYmUgbG9hZGVkCisgICAgICAgICAgICBpbnQgbGVuZ3RoID0gMDsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVZpZXdDYWNoZUluZm8pIHsKKyAgICAgICAgICAgICAgICBsZW5ndGggPSBtVmlld0NhY2hlSW5mby5jb3VudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpbmRpY2VzVG9Mb2FkQ291bnQgPiAwKSB7CisgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtVmlld0NhY2hlTG9hZEluZGljZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgbVZpZXdDYWNoZUxvYWRJbmRpY2VzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5kaWNlc1RvTG9hZENvdW50OyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBpbmRleCA9IG1UbXBWaWV3Q2FjaGVMb2FkSW5kaWNlc1tpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgwIDw9IGluZGV4ICYmIGluZGV4IDwgbGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVZpZXdDYWNoZUxvYWRJbmRpY2VzLmFkZExhc3QoaW5kZXgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyByZXR1cm4gbnVsbCBzbyB0aGF0IGEgZHVtbXkgdmlldyBjYW4gYmUgcmV0cmlldmVkCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBWaWV3IGdldFZpZXcoaW50IHBvc2l0aW9uLCBWaWV3IGNvbnZlcnRWaWV3LCBWaWV3R3JvdXAgcGFyZW50KSB7CisgICAgICAgICAgICBpZiAobVNlcnZpY2VDb25uZWN0aW9uLmlzQ29ubmVjdGVkKCkpIHsKKyAgICAgICAgICAgICAgICAvLyBjcmVhdGUgdGhlIGZsaXBwZXIgdmlld3MgaWYgbmVjZXNzYXJ5ICh3ZSBoYXZlIHRvIGRvIHRoaXMgbm93CisgICAgICAgICAgICAgICAgLy8gZm9yIGFsbCB0aGUgZmxpcHBlcnMgd2hpbGUgd2UgaGF2ZSB0aGUgcmVmZXJlbmNlIHRvIHRoZSBwYXJlbnQpCisgICAgICAgICAgICAgICAgaW5pdGlhbGl6ZUxvYWRpbmdWaWV3cyhwYXJlbnQpOworCisgICAgICAgICAgICAgICAgLy8gcmVxdWVzdCB0aGUgaXRlbSBmcm9tIHRoZSBjYWNoZSAocXVldWVpbmcgaXQgdG8gbG9hZCBpZiBub3QKKyAgICAgICAgICAgICAgICAvLyBpbiB0aGUgY2FjaGUgYWxyZWFkeSkKKyAgICAgICAgICAgICAgICBSZW1vdGVWaWV3c0luZGV4SW5mbyBpbmRleEluZm8gPSByZXF1ZXN0Q2FjaGVkSW5kZXhJbmZvKHBvc2l0aW9uKTsKKworICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgZmxpcHBlciBhcHByb3ByaWF0ZWx5CisgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtVmlld0NhY2hlKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBjYWNoZUluZGV4ID0gZ2V0Q2FjaGVJbmRleChwb3NpdGlvbik7CisgICAgICAgICAgICAgICAgICAgIEZyYW1lTGF5b3V0IGZsaXBwZXIgPSBtVmlld0NhY2hlW2NhY2hlSW5kZXhdLmZsaXBwZXI7CisgICAgICAgICAgICAgICAgICAgIGZsaXBwZXIuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICAgICAgICAgICAgICBmbGlwcGVyLnNldEFscGhhKDEuMGYpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleEluZm8gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGlkZSB0aGUgaXRlbSB2aWV3IGFuZCBzaG93IHRoZSBsb2FkaW5nIHZpZXcKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsaXBwZXIuZ2V0Q2hpbGRBdCgwKS5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IGZsaXBwZXIuZ2V0Q2hpbGRDb3VudCgpOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGlwcGVyLmdldENoaWxkQXQoaSkuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGlkZSB0aGUgbG9hZGluZyB2aWV3IGFuZCBzaG93IHRoZSBpdGVtIHZpZXcKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmxpcHBlci5nZXRDaGlsZENvdW50KCkgLSAxOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGlwcGVyLmdldENoaWxkQXQoaSkuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZmxpcHBlci5nZXRDaGlsZEF0KGZsaXBwZXIuZ2V0Q2hpbGRDb3VudCgpIC0gMSkuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmbGlwcGVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBuZXcgVmlldyhtQ29udGV4dCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZUxvYWRpbmdWaWV3cyhWaWV3R3JvdXAgcGFyZW50KSB7CisgICAgICAgICAgICAvLyBlbnN1cmUgdGhhdCB0aGUgY2FjaGUgaGFzIHRoZSBhcHByb3ByaWF0ZSBpbml0aWFsIGZsaXBwZXIKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVZpZXdDYWNoZSkgeworICAgICAgICAgICAgICAgIGlmIChtVmlld0NhY2hlWzBdLmZsaXBwZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1WaWV3Q2FjaGUubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZyYW1lTGF5b3V0IGZsaXBwZXIgPSBuZXcgRnJhbWVMYXlvdXQobUNvbnRleHQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1Vc2VyTG9hZGluZ1ZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVzZSB0aGUgdXNlci1zcGVjaWZpZWQgbG9hZGluZyB2aWV3CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxpcHBlci5hZGRWaWV3KG1Vc2VyTG9hZGluZ1ZpZXcuYXBwbHkobUNvbnRleHQsIHBhcmVudCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjYWxjdWxhdGUgdGhlIG9yaWdpbmFsIHNpemUgb2YgdGhlIGZpcnN0IHJvdyBmb3IgdGhlIGxvYWRlciB2aWV3CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtVmlld0NhY2hlSW5mbykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUZpcnN0Vmlld0hlaWdodCA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpZXcgZmlyc3RWaWV3ID0gbUZpcnN0Vmlldy5hcHBseShtQ29udGV4dCwgcGFyZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0Vmlldy5tZWFzdXJlKE1lYXN1cmVTcGVjLm1ha2VNZWFzdXJlU3BlYygwLCBNZWFzdXJlU3BlYy5VTlNQRUNJRklFRCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lYXN1cmVTcGVjLm1ha2VNZWFzdXJlU3BlYygwLCBNZWFzdXJlU3BlYy5VTlNQRUNJRklFRCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZpcnN0Vmlld0hlaWdodCA9IGZpcnN0Vmlldy5nZXRNZWFzdXJlZEhlaWdodCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc3RydWN0IGEgbmV3IGxvYWRlciBhbmQgYWRkIGl0IHRvIHRoZSBmbGlwcGVyIGFzIHRoZSBmYWxsYmFjaworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQgdmlldworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRWaWV3IHRleHRWaWV3ID0gbmV3IFRleHRWaWV3KG1Db250ZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0Vmlldy5zZXRUZXh0KCJMb2FkaW5nLi4uIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dFZpZXcuc2V0SGVpZ2h0KG1GaXJzdFZpZXdIZWlnaHQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRWaWV3LnNldEdyYXZpdHkoR3Jhdml0eS5DRU5URVJfSE9SSVpPTlRBTCB8IEdyYXZpdHkuQ0VOVEVSX1ZFUlRJQ0FMKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0Vmlldy5zZXRUZXh0U2l6ZSgxOC4wZik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dFZpZXcuc2V0VGV4dENvbG9yKENvbG9yLmFyZ2IoOTYsIDI1NSwgMjU1LCAyNTUpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0Vmlldy5zZXRTaGFkb3dMYXllcigyLjBmLCAwLjBmLCAxLjBmLCBDb2xvci5CTEFDSyk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGlwcGVyLmFkZFZpZXcodGV4dFZpZXcpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgbVZpZXdDYWNoZVtpXS5mbGlwcGVyID0gZmxpcHBlcjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0QmFja2dyb3VuZExvYWRlcigpIHsKKyAgICAgICAgICAgIC8vIGluaXRpYWxpemUgdGhlIHdvcmtlciBydW5uYWJsZQorICAgICAgICAgICAgbUJhY2tncm91bmRMb2FkZXJFbmFibGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIG1Xb3JrZXJRdWV1ZS5wb3N0KG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChtQmFja2dyb3VuZExvYWRlckVuYWJsZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdGlmeSB0aGUgUmVtb3RlVmlld3MgZmFjdG9yeSBpZiBuZWNlc3NhcnkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNEYXRhRGlydHkgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVZpZXdDYWNoZUluZm8pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0RhdGFEaXJ0eSA9IG1WaWV3Q2FjaGVJbmZvLmlzRGF0YURpcnR5OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1WaWV3Q2FjaGVJbmZvLmlzRGF0YURpcnR5ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNEYXRhRGlydHkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVOb3RpZnlEYXRhU2V0Q2hhbmdlZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVZpZXdDYWNoZUxvYWRJbmRpY2VzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtVmlld0NhY2hlTG9hZEluZGljZXMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4ID0gbVZpZXdDYWNoZUxvYWRJbmRpY2VzLnJlbW92ZUZpcnN0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZXJlIHdlcmUgbm8gaXRlbXMgdG8gbG9hZCwgc28gc2xlZXAgZm9yIGEgYml0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvdGhlcndpc2UsIHRyeSBhbmQgbG9hZCB0aGUgaXRlbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVJlbW90ZVZpZXdzSW5mbyhpbmRleCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzbGVlcCBmb3IgYSBiaXQgdG8gYWxsb3cgdGhpbmdzIHRvIGNhdGNoIHVwIGFmdGVyIHRoZSBsb2FkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDUwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzdG9wQmFja2dyb3VuZExvYWRlcigpIHsKKyAgICAgICAgICAgIC8vIGNsZWFyIHRoZSBpdGVtcyB0byBiZSBsb2FkZWQKKyAgICAgICAgICAgIG1CYWNrZ3JvdW5kTG9hZGVyRW5hYmxlZCA9IGZhbHNlOworICAgICAgICAgICAgc3luY2hyb25pemVkIChtVmlld0NhY2hlTG9hZEluZGljZXMpIHsKKyAgICAgICAgICAgICAgICBtVmlld0NhY2hlTG9hZEluZGljZXMuY2xlYXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBsb25nIGdldEl0ZW1JZChpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVZpZXdDYWNoZSkgeworICAgICAgICAgICAgICAgIGlmIChjb250YWluc0FuZElzVmFsaWQocG9zaXRpb24pKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtVmlld0NhY2hlW2dldENhY2hlSW5kZXgocG9zaXRpb24pXS5pdGVtSWQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGdldEl0ZW1WaWV3VHlwZShpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgICAgIC8vIHN5bmNocm9uaXplIHRvIGVuc3VyZSB0aGF0IHRoZSB0eXBlIGlkL2luZGV4IG1hcCBpcyB1cGRhdGVkIHN5bmNocm9ub3VzbHkKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVZpZXdDYWNoZSkgeworICAgICAgICAgICAgICAgIGlmIChjb250YWluc0FuZElzVmFsaWQocG9zaXRpb24pKSB7CisgICAgICAgICAgICAgICAgICAgIGludCB2aWV3SWQgPSBtVmlld0NhY2hlW2dldENhY2hlSW5kZXgocG9zaXRpb24pXS50eXBlSWQ7CisgICAgICAgICAgICAgICAgICAgIE1hcDxJbnRlZ2VyLCBJbnRlZ2VyPiB0eXBlTWFwID0gbVZpZXdDYWNoZUluZm8ubVR5cGVJZEluZGV4TWFwOworICAgICAgICAgICAgICAgICAgICAvLyB3ZSArMSBiZWNhdXNlIHRoZSBkZWZhdWx0IGR1bW15IHZpZXcgZ2V0IHZpZXcgdHlwZSAwCisgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlTWFwLmNvbnRhaW5zS2V5KHZpZXdJZCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0eXBlTWFwLmdldCh2aWV3SWQpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5ld0luZGV4ID0gdHlwZU1hcC5zaXplKCkgKyAxOworICAgICAgICAgICAgICAgICAgICAgICAgdHlwZU1hcC5wdXQodmlld0lkLCBuZXdJbmRleCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3SW5kZXg7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyByZXR1cm4gdGhlIHR5cGUgb2YgdGhlIGRlZmF1bHQgaXRlbQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGdldENvdW50KCkgeworICAgICAgICAgICAgc3luY2hyb25pemVkIChtVmlld0NhY2hlSW5mbykgeworICAgICAgICAgICAgICAgIHJldHVybiBtVmlld0NhY2hlSW5mby5jb3VudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0Vmlld1R5cGVDb3VudCgpIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVZpZXdDYWNoZUluZm8pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbVZpZXdDYWNoZUluZm8udmlld1R5cGVDb3VudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc1N0YWJsZUlkcygpIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVZpZXdDYWNoZUluZm8pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbVZpZXdDYWNoZUluZm8uaGFzU3RhYmxlSWRzOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgZmx1c2hDYWNoZSgpIHsKKyAgICAgICAgICAgIC8vIGNsZWFyIHRoZSBpdGVtcyB0byBiZSBsb2FkZWQKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVZpZXdDYWNoZUxvYWRJbmRpY2VzKSB7CisgICAgICAgICAgICAgICAgbVZpZXdDYWNoZUxvYWRJbmRpY2VzLmNsZWFyKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVZpZXdDYWNoZSkgeworICAgICAgICAgICAgICAgIC8vIGZsdXNoIHRoZSBpbnRlcm5hbCBjYWNoZSBhbmQgaW52YWxpZGF0ZSB0aGUgYWRhcHRlciBmb3IgZnV0dXJlIGxvYWRzCisgICAgICAgICAgICAgICAgbU1haW5RdWV1ZS5yZW1vdmVNZXNzYWdlcygwKTsKKworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbVZpZXdDYWNoZS5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgICAgICAgICBtVmlld0NhY2hlW2ldLmludmFsaWRhdGUoKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBtVmlld0NhY2hlU3RhcnRQb3NpdGlvbiA9IDA7CisgICAgICAgICAgICAgICAgbVZpZXdDYWNoZUVuZFBvc2l0aW9uID0gLTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgUmVtb3RlVmlld3NBZGFwdGVyKENvbnRleHQgY29udGV4dCwgSW50ZW50IGludGVudCwgUmVtb3RlQWRhcHRlckNvbm5lY3Rpb25DYWxsYmFjayBjYWxsYmFjaykgeworICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CisgICAgICAgIG1JbnRlbnQgPSBpbnRlbnQ7CisKKyAgICAgICAgLy8gaW5pdGlhbGl6ZSB0aGUgd29ya2VyIHRocmVhZAorICAgICAgICBtV29ya2VyVGhyZWFkID0gbmV3IEhhbmRsZXJUaHJlYWQoIlJlbW90ZVZpZXdzQ2FjaGUtbG9hZGVyIik7CisgICAgICAgIG1Xb3JrZXJUaHJlYWQuc3RhcnQoKTsKKyAgICAgICAgbVdvcmtlclF1ZXVlID0gbmV3IEhhbmRsZXIobVdvcmtlclRocmVhZC5nZXRMb29wZXIoKSk7CisgICAgICAgIG1Xb3JrZXJQcmlvcml0eVF1ZXVlID0gbmV3IEhhbmRsZXIobVdvcmtlclRocmVhZC5nZXRMb29wZXIoKSk7CisgICAgICAgIG1NYWluUXVldWUgPSBuZXcgSGFuZGxlcihMb29wZXIubXlMb29wZXIoKSk7CisgICAgICAgIG1NYWluUHJpb3JpdHlRdWV1ZSA9IG5ldyBIYW5kbGVyKExvb3Blci5teUxvb3BlcigpKTsKKworICAgICAgICAvLyBpbml0aWFsaXplIHRoZSBjYWNoZSBhbmQgdGhlIHNlcnZpY2UgY29ubmVjdGlvbiBvbiBzdGFydHVwCisgICAgICAgIG1WaWV3Q2FjaGUgPSBuZXcgUmVtb3RlVmlld3NDYWNoZSgyNSk7CisgICAgICAgIG1TZXJ2aWNlQ29ubmVjdGlvbiA9IG5ldyBSZW1vdGVWaWV3c0FkYXB0ZXJTZXJ2aWNlQ29ubmVjdGlvbihjYWxsYmFjayk7CisgICAgICAgIHJlcXVlc3RCaW5kU2VydmljZSgpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIC8vIHJlbWVtYmVyIHRvIHVuYmluZCBmcm9tIHRoZSBzZXJ2aWNlIHdoZW4gZmluYWxpemluZworICAgICAgICB1bmJpbmRTZXJ2aWNlKCk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRDb3VudCgpIHsKKyAgICAgICAgcmVxdWVzdEJpbmRTZXJ2aWNlKCk7CisgICAgICAgIHJldHVybiBtVmlld0NhY2hlLmdldENvdW50KCk7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBnZXRJdGVtKGludCBwb3NpdGlvbikgeworICAgICAgICAvLyBkaXNhbGxvdyBhcmJpdHJhcnkgb2JqZWN0IHRvIGJlIGFzc29jaWF0ZWQgd2l0aCBhbiBpdGVtIGZvciB0aGUgdGltZSBiZWluZworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgbG9uZyBnZXRJdGVtSWQoaW50IHBvc2l0aW9uKSB7CisgICAgICAgIHJlcXVlc3RCaW5kU2VydmljZSgpOworICAgICAgICByZXR1cm4gbVZpZXdDYWNoZS5nZXRJdGVtSWQocG9zaXRpb24pOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0SXRlbVZpZXdUeXBlKGludCBwb3NpdGlvbikgeworICAgICAgICByZXF1ZXN0QmluZFNlcnZpY2UoKTsKKyAgICAgICAgcmV0dXJuIG1WaWV3Q2FjaGUuZ2V0SXRlbVZpZXdUeXBlKHBvc2l0aW9uKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVmlldyBnZXRWaWV3KGludCBwb3NpdGlvbiwgVmlldyBjb252ZXJ0VmlldywgVmlld0dyb3VwIHBhcmVudCkgeworICAgICAgICByZXF1ZXN0QmluZFNlcnZpY2UoKTsKKyAgICAgICAgcmV0dXJuIG1WaWV3Q2FjaGUuZ2V0Vmlldyhwb3NpdGlvbiwgY29udmVydFZpZXcsIHBhcmVudCk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRWaWV3VHlwZUNvdW50KCkgeworICAgICAgICByZXF1ZXN0QmluZFNlcnZpY2UoKTsKKyAgICAgICAgcmV0dXJuIG1WaWV3Q2FjaGUuZ2V0Vmlld1R5cGVDb3VudCgpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGhhc1N0YWJsZUlkcygpIHsKKyAgICAgICAgcmVxdWVzdEJpbmRTZXJ2aWNlKCk7CisgICAgICAgIHJldHVybiBtVmlld0NhY2hlLmhhc1N0YWJsZUlkcygpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7CisgICAgICAgIHJldHVybiBnZXRDb3VudCgpIDw9IDA7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbm90aWZ5RGF0YVNldENoYW5nZWQoKSB7CisgICAgICAgIC8vIGZsdXNoIHRoZSBjYWNoZSBzbyB0aGF0IHdlIGNhbiByZWxvYWQgbmV3IGl0ZW1zIGZyb20gdGhlIHNlcnZpY2UKKyAgICAgICAgbVZpZXdDYWNoZS5mbHVzaENhY2hlKCk7CisKKyAgICAgICAgLy8gbm90aWZ5IHRoZSBmYWN0b3J5IHRoYXQgaXQncyBkYXRhIG1heSBubyBsb25nZXIgYmUgdmFsaWQKKyAgICAgICAgbVZpZXdDYWNoZS5vbk5vdGlmeURhdGFTZXRDaGFuZ2VkKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY29tcGxldGVOb3RpZnlEYXRhU2V0Q2hhbmdlZCgpIHsKKyAgICAgICAgc3VwZXIubm90aWZ5RGF0YVNldENoYW5nZWQoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gcmVxdWVzdEJpbmRTZXJ2aWNlKCkgeworICAgICAgICAvLyB0cnkgYmluZGluZyB0aGUgc2VydmljZSAod2hpY2ggd2lsbCBzdGFydCBpdCBpZiBpdCdzIG5vdCBhbHJlYWR5IHJ1bm5pbmcpCisgICAgICAgIGlmICghbVNlcnZpY2VDb25uZWN0aW9uLmlzQ29ubmVjdGVkKCkpIHsKKyAgICAgICAgICAgIG1Db250ZXh0LmJpbmRTZXJ2aWNlKG1JbnRlbnQsIG1TZXJ2aWNlQ29ubmVjdGlvbiwgQ29udGV4dC5CSU5EX0FVVE9fQ1JFQVRFKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBtU2VydmljZUNvbm5lY3Rpb24uaXNDb25uZWN0ZWQoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdW5iaW5kU2VydmljZSgpIHsKKyAgICAgICAgaWYgKG1TZXJ2aWNlQ29ubmVjdGlvbi5pc0Nvbm5lY3RlZCgpKSB7CisgICAgICAgICAgICBtQ29udGV4dC51bmJpbmRTZXJ2aWNlKG1TZXJ2aWNlQ29ubmVjdGlvbik7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvUmVtb3RlVmlld3NTZXJ2aWNlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvUmVtb3RlVmlld3NTZXJ2aWNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg0ZmEyNQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9SZW1vdGVWaWV3c1NlcnZpY2UuamF2YQpAQCAtMCwwICsxLDE2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC53aWRnZXQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgYW5kcm9pZC5hcHAuU2VydmljZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuUGFpcjsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5JUmVtb3RlVmlld3NGYWN0b3J5OworCisvKioKKyAqIFRoZSBzZXJ2aWNlIHRvIGJlIGNvbm5lY3RlZCB0byBmb3IgYSByZW1vdGUgYWRhcHRlciB0byByZXF1ZXN0IFJlbW90ZVZpZXdzLiAgVXNlcnMgc2hvdWxkCisgKiBleHRlbmQgdGhlIFJlbW90ZVZpZXdzU2VydmljZSB0byBwcm92aWRlIHRoZSBhcHByb3ByaWF0ZSBSZW1vdGVWaWV3c0ZhY3RvcnkncyB1c2VkIHRvCisgKiBwb3B1bGF0ZSB0aGUgcmVtb3RlIGNvbGxlY3Rpb24gdmlldyAoTGlzdFZpZXcsIEdyaWRWaWV3LCBldGMpLgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgUmVtb3RlVmlld3NTZXJ2aWNlIGV4dGVuZHMgU2VydmljZSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJSZW1vdGVWaWV3c1NlcnZpY2UiOworCisgICAgLy8gbXVsdGltYXAgaW1wbGVtZW50YXRpb24gZm9yIHJlZmVyZW5jZSBjb3VudGluZworICAgIHByaXZhdGUgSGFzaE1hcDxJbnRlbnQsIFBhaXI8UmVtb3RlVmlld3NGYWN0b3J5LCBJbnRlZ2VyPj4gbVJlbW90ZVZpZXdGYWN0b3JpZXM7CisgICAgcHJpdmF0ZSBmaW5hbCBPYmplY3QgbUxvY2sgPSBuZXcgT2JqZWN0KCk7CisKKyAgICAvKioKKyAgICAgKiBBbiBpbnRlcmZhY2UgZm9yIGFuIGFkYXB0ZXIgYmV0d2VlbiBhIHJlbW90ZSBjb2xsZWN0aW9uIHZpZXcgKExpc3RWaWV3LCBHcmlkVmlldywgZXRjKSBhbmQKKyAgICAgKiB0aGUgdW5kZXJseWluZyBkYXRhIGZvciB0aGF0IHZpZXcuICBUaGUgaW1wbGVtZW50b3IgaXMgcmVzcG9uc2libGUgZm9yIG1ha2luZyBhIFJlbW90ZVZpZXcKKyAgICAgKiBmb3IgZWFjaCBpdGVtIGluIHRoZSBkYXRhIHNldC4KKyAgICAgKiAKKyAgICAgKiBAc2VlIGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXIKKyAgICAgKiBAc2VlIGFuZHJvaWQuYXBwd2lkZ2V0LkFwcFdpZGdldE1hbmFnZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50ZXJmYWNlIFJlbW90ZVZpZXdzRmFjdG9yeSB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDYWxsZWQgd2hlbiB5b3VyIGZhY3RvcnkgaXMgZmlyc3QgY29uc3RydWN0ZWQuIFRoZSBzYW1lIGZhY3RvcnkgbWF5IGJlIHNoYXJlZCBhY3Jvc3MKKyAgICAgICAgICogbXVsdGlwbGUgUmVtb3RlVmlld0FkYXB0ZXJzIGRlcGVuZGluZyBvbiB0aGUgaW50ZW50IHBhc3NlZC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKCk7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDYWxsZWQgd2hlbiBub3RpZnlEYXRhU2V0Q2hhbmdlZCgpIGlzIHRyaWdnZXJlZCBvbiB0aGUgcmVtb3RlIGFkYXB0ZXIuIFRoaXMgYWxsb3dzIGEKKyAgICAgICAgICogUmVtb3RlVmlld3NGYWN0b3J5IHRvIHJlc3BvbmQgdG8gZGF0YSBjaGFuZ2VzIGJ5IHVwZGF0aW5nIGFueSBpbnRlcm5hbCByZWZlcmVuY2VzLgorICAgICAgICAgKgorICAgICAgICAgKiBAc2VlIGFuZHJvaWQuYXBwd2lkZ2V0LkFwcFdpZGdldE1hbmFnZXIjbm90aWZ5QXBwV2lkZ2V0Vmlld0RhdGFDaGFuZ2VkKGludFtdLCBpbnQpCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBvbkRhdGFTZXRDaGFuZ2VkKCk7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDYWxsZWQgd2hlbiB0aGUgbGFzdCBSZW1vdGVWaWV3c0FkYXB0ZXIgdGhhdCBpcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBmYWN0b3J5IGlzCisgICAgICAgICAqIHVuYm91bmQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBvbkRlc3Ryb3koKTsKKworICAgICAgICBwdWJsaWMgaW50IGdldENvdW50KCk7CisgICAgICAgIHB1YmxpYyBSZW1vdGVWaWV3cyBnZXRWaWV3QXQoaW50IHBvc2l0aW9uKTsKKyAgICAgICAgcHVibGljIFJlbW90ZVZpZXdzIGdldExvYWRpbmdWaWV3KCk7CisgICAgICAgIHB1YmxpYyBpbnQgZ2V0Vmlld1R5cGVDb3VudCgpOworICAgICAgICBwdWJsaWMgbG9uZyBnZXRJdGVtSWQoaW50IHBvc2l0aW9uKTsKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzU3RhYmxlSWRzKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQSBwcml2YXRlIHByb3h5IGNsYXNzIGZvciB0aGUgcHJpdmF0ZSBJUmVtb3RlVmlld3NGYWN0b3J5IGludGVyZmFjZSB0aHJvdWdoIHRoZQorICAgICAqIHB1YmxpYyBSZW1vdGVWaWV3c0ZhY3RvcnkgaW50ZXJmYWNlLgorICAgICAqLworICAgIHByaXZhdGUgY2xhc3MgUmVtb3RlVmlld3NGYWN0b3J5QWRhcHRlciBleHRlbmRzIElSZW1vdGVWaWV3c0ZhY3RvcnkuU3R1YiB7CisgICAgICAgIHB1YmxpYyBSZW1vdGVWaWV3c0ZhY3RvcnlBZGFwdGVyKFJlbW90ZVZpZXdzRmFjdG9yeSBmYWN0b3J5KSB7CisgICAgICAgICAgICBtRmFjdG9yeSA9IGZhY3Rvcnk7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIHZvaWQgb25EYXRhU2V0Q2hhbmdlZCgpIHsKKyAgICAgICAgICAgIG1GYWN0b3J5Lm9uRGF0YVNldENoYW5nZWQoKTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgaW50IGdldENvdW50KCkgeworICAgICAgICAgICAgcmV0dXJuIG1GYWN0b3J5LmdldENvdW50KCk7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIFJlbW90ZVZpZXdzIGdldFZpZXdBdChpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgICAgIHJldHVybiBtRmFjdG9yeS5nZXRWaWV3QXQocG9zaXRpb24pOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBSZW1vdGVWaWV3cyBnZXRMb2FkaW5nVmlldygpIHsKKyAgICAgICAgICAgIHJldHVybiBtRmFjdG9yeS5nZXRMb2FkaW5nVmlldygpOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBpbnQgZ2V0Vmlld1R5cGVDb3VudCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtRmFjdG9yeS5nZXRWaWV3VHlwZUNvdW50KCk7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIGxvbmcgZ2V0SXRlbUlkKGludCBwb3NpdGlvbikgeworICAgICAgICAgICAgcmV0dXJuIG1GYWN0b3J5LmdldEl0ZW1JZChwb3NpdGlvbik7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzU3RhYmxlSWRzKCkgeworICAgICAgICAgICAgcmV0dXJuIG1GYWN0b3J5Lmhhc1N0YWJsZUlkcygpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBSZW1vdGVWaWV3c0ZhY3RvcnkgbUZhY3Rvcnk7CisgICAgfQorCisgICAgcHVibGljIFJlbW90ZVZpZXdzU2VydmljZSgpIHsKKyAgICAgICAgbVJlbW90ZVZpZXdGYWN0b3JpZXMgPSBuZXcgSGFzaE1hcDxJbnRlbnQsIFBhaXI8UmVtb3RlVmlld3NGYWN0b3J5LCBJbnRlZ2VyPj4oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSUJpbmRlciBvbkJpbmQoSW50ZW50IGludGVudCkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7CisgICAgICAgICAgICAvLyBpbmNyZW1lbnQgdGhlIHJlZmVyZW5jZSBjb3VudCB0byB0aGUgcGFydGljdWxhciBmYWN0b3J5IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGludGVudAorICAgICAgICAgICAgUGFpcjxSZW1vdGVWaWV3c0ZhY3RvcnksIEludGVnZXI+IGZhY3RvcnlSZWYgPSBudWxsOworICAgICAgICAgICAgUmVtb3RlVmlld3NGYWN0b3J5IGZhY3RvcnkgPSBudWxsOworICAgICAgICAgICAgaWYgKCFtUmVtb3RlVmlld0ZhY3Rvcmllcy5jb250YWluc0tleShpbnRlbnQpKSB7CisgICAgICAgICAgICAgICAgZmFjdG9yeSA9IG9uR2V0Vmlld0ZhY3RvcnkoaW50ZW50KTsKKyAgICAgICAgICAgICAgICBmYWN0b3J5UmVmID0gbmV3IFBhaXI8UmVtb3RlVmlld3NGYWN0b3J5LCBJbnRlZ2VyPihmYWN0b3J5LCAxKTsKKyAgICAgICAgICAgICAgICBtUmVtb3RlVmlld0ZhY3Rvcmllcy5wdXQoaW50ZW50LCBmYWN0b3J5UmVmKTsKKyAgICAgICAgICAgICAgICBmYWN0b3J5Lm9uQ3JlYXRlKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFBhaXI8UmVtb3RlVmlld3NGYWN0b3J5LCBJbnRlZ2VyPiBvbGRGYWN0b3J5UmVmID0gbVJlbW90ZVZpZXdGYWN0b3JpZXMuZ2V0KGludGVudCk7CisgICAgICAgICAgICAgICAgZmFjdG9yeSA9IG9sZEZhY3RvcnlSZWYuZmlyc3Q7CisgICAgICAgICAgICAgICAgaW50IG5ld1JlZkNvdW50ID0gb2xkRmFjdG9yeVJlZi5zZWNvbmQuaW50VmFsdWUoKSArIDE7CisgICAgICAgICAgICAgICAgZmFjdG9yeVJlZiA9IG5ldyBQYWlyPFJlbW90ZVZpZXdzRmFjdG9yeSwgSW50ZWdlcj4ob2xkRmFjdG9yeVJlZi5maXJzdCwgbmV3UmVmQ291bnQpOworICAgICAgICAgICAgICAgIG1SZW1vdGVWaWV3RmFjdG9yaWVzLnB1dChpbnRlbnQsIGZhY3RvcnlSZWYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG5ldyBSZW1vdGVWaWV3c0ZhY3RvcnlBZGFwdGVyKGZhY3RvcnkpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25VbmJpbmQoSW50ZW50IGludGVudCkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7CisgICAgICAgICAgICBpZiAobVJlbW90ZVZpZXdGYWN0b3JpZXMuY29udGFpbnNLZXkoaW50ZW50KSkgeworICAgICAgICAgICAgICAgIC8vIHRoaXMgYWxsZXZpYXRlcyB0aGUgdXNlcidzIHJlc3BvbnNpYmlsaXR5IG9mIGhhdmluZyB0byBjbGVhciBhbGwgZmFjdG9yaWVzCisgICAgICAgICAgICAgICAgUGFpcjxSZW1vdGVWaWV3c0ZhY3RvcnksIEludGVnZXI+IG9sZEZhY3RvcnlSZWYgPSBtUmVtb3RlVmlld0ZhY3Rvcmllcy5nZXQoaW50ZW50KTsKKyAgICAgICAgICAgICAgICBpbnQgbmV3UmVmQ291bnQgPSBvbGRGYWN0b3J5UmVmLnNlY29uZC5pbnRWYWx1ZSgpIC0gMTsKKyAgICAgICAgICAgICAgICBpZiAobmV3UmVmQ291bnQgPD0gMCkgeworICAgICAgICAgICAgICAgICAgICBvbGRGYWN0b3J5UmVmLmZpcnN0Lm9uRGVzdHJveSgpOworICAgICAgICAgICAgICAgICAgICBtUmVtb3RlVmlld0ZhY3Rvcmllcy5yZW1vdmUoaW50ZW50KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBQYWlyPFJlbW90ZVZpZXdzRmFjdG9yeSwgSW50ZWdlcj4gZmFjdG9yeVJlZiA9IG5ldyBQYWlyPFJlbW90ZVZpZXdzRmFjdG9yeSwgSW50ZWdlcj4ob2xkRmFjdG9yeVJlZi5maXJzdCwgbmV3UmVmQ291bnQpOworICAgICAgICAgICAgICAgICAgICBtUmVtb3RlVmlld0ZhY3Rvcmllcy5wdXQoaW50ZW50LCBmYWN0b3J5UmVmKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN1cGVyLm9uVW5iaW5kKGludGVudCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVG8gYmUgaW1wbGVtZW50ZWQgYnkgdGhlIGRlcml2ZWQgc2VydmljZSB0byBnZW5lcmF0ZSBhcHByb3ByaWF0ZSBmYWN0b3JpZXMgZm9yCisgICAgICogdGhlIGRhdGEuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IFJlbW90ZVZpZXdzRmFjdG9yeSBvbkdldFZpZXdGYWN0b3J5KEludGVudCBpbnRlbnQpOworfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1Jlc291cmNlQ3Vyc29yQWRhcHRlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1Jlc291cmNlQ3Vyc29yQWRhcHRlci5qYXZhCmluZGV4IGM5YzIxN2EuLmFlZTQxMWUgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9SZXNvdXJjZUN1cnNvckFkYXB0ZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvUmVzb3VyY2VDdXJzb3JBZGFwdGVyLmphdmEKQEAgLTM2LDkgKzM2LDggQEAKICAgICAKICAgICAvKioKICAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCB3aGVyZSB0aGUgTGlzdFZpZXcgYXNzb2NpYXRlZCB3aXRoIHRoaXMKLSAgICAgKiAgICAgICAgICAgIFNpbXBsZUxpc3RJdGVtRmFjdG9yeSBpcyBydW5uaW5nCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCB3aGVyZSB0aGUgTGlzdFZpZXcgYXNzb2NpYXRlZCB3aXRoIHRoaXMgYWRhcHRlciBpcyBydW5uaW5nCiAgICAgICogQHBhcmFtIGxheW91dCByZXNvdXJjZSBpZGVudGlmaWVyIG9mIGEgbGF5b3V0IGZpbGUgdGhhdCBkZWZpbmVzIHRoZSB2aWV3cwogICAgICAqICAgICAgICAgICAgZm9yIHRoaXMgbGlzdCBpdGVtLiAgVW5sZXNzIHlvdSBvdmVycmlkZSB0aGVtIGxhdGVyLCB0aGlzIHdpbGwKICAgICAgKiAgICAgICAgICAgIGRlZmluZSBib3RoIHRoZSBpdGVtIHZpZXdzIGFuZCB0aGUgZHJvcCBkb3duIHZpZXdzLgpAQCAtNTEsOSArNTAsOCBAQAogICAgIAogICAgIC8qKgogICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqIAotICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IHdoZXJlIHRoZSBMaXN0VmlldyBhc3NvY2lhdGVkIHdpdGggdGhpcwotICAgICAqICAgICAgICAgICAgU2ltcGxlTGlzdEl0ZW1GYWN0b3J5IGlzIHJ1bm5pbmcKKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IHdoZXJlIHRoZSBMaXN0VmlldyBhc3NvY2lhdGVkIHdpdGggdGhpcyBhZGFwdGVyIGlzIHJ1bm5pbmcKICAgICAgKiBAcGFyYW0gbGF5b3V0IHJlc291cmNlIGlkZW50aWZpZXIgb2YgYSBsYXlvdXQgZmlsZSB0aGF0IGRlZmluZXMgdGhlIHZpZXdzCiAgICAgICogICAgICAgICAgICBmb3IgdGhpcyBsaXN0IGl0ZW0uICBVbmxlc3MgeW91IG92ZXJyaWRlIHRoZW0gbGF0ZXIsIHRoaXMgd2lsbAogICAgICAqICAgICAgICAgICAgZGVmaW5lIGJvdGggdGhlIGl0ZW0gdmlld3MgYW5kIHRoZSBkcm9wIGRvd24gdmlld3MuCkBAIC02OSw2ICs2NywyMiBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgd2hlcmUgdGhlIExpc3RWaWV3IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGFkYXB0ZXIgaXMgcnVubmluZworICAgICAqIEBwYXJhbSBsYXlvdXQgcmVzb3VyY2UgaWRlbnRpZmllciBvZiBhIGxheW91dCBmaWxlIHRoYXQgZGVmaW5lcyB0aGUgdmlld3MKKyAgICAgKiAgICAgICAgICAgIGZvciB0aGlzIGxpc3QgaXRlbS4gIFVubGVzcyB5b3Ugb3ZlcnJpZGUgdGhlbSBsYXRlciwgdGhpcyB3aWxsCisgICAgICogICAgICAgICAgICBkZWZpbmUgYm90aCB0aGUgaXRlbSB2aWV3cyBhbmQgdGhlIGRyb3AgZG93biB2aWV3cy4KKyAgICAgKiBAcGFyYW0gYyBUaGUgY3Vyc29yIGZyb20gd2hpY2ggdG8gZ2V0IHRoZSBkYXRhLgorICAgICAqIEBwYXJhbSBmbGFncyBmbGFncyB1c2VkIHRvIGRldGVybWluZSB0aGUgYmVoYXZpb3Igb2YgdGhlIGFkYXB0ZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgUmVzb3VyY2VDdXJzb3JBZGFwdGVyKENvbnRleHQgY29udGV4dCwgaW50IGxheW91dCwgQ3Vyc29yIGMsIGludCBmbGFncykgeworICAgICAgICBzdXBlcihjb250ZXh0LCBjLCBmbGFncyk7CisgICAgICAgIG1MYXlvdXQgPSBtRHJvcERvd25MYXlvdXQgPSBsYXlvdXQ7CisgICAgICAgIG1JbmZsYXRlciA9IChMYXlvdXRJbmZsYXRlcikgY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuTEFZT1VUX0lORkxBVEVSX1NFUlZJQ0UpOworICAgIH0KKworICAgIC8qKgogICAgICAqIEluZmxhdGVzIHZpZXcocykgZnJvbSB0aGUgc3BlY2lmaWVkIFhNTCBmaWxlLgogICAgICAqIAogICAgICAqIEBzZWUgYW5kcm9pZC53aWRnZXQuQ3Vyc29yQWRhcHRlciNuZXdWaWV3KGFuZHJvaWQuY29udGVudC5Db250ZXh0LApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1Njcm9sbEJhckRyYXdhYmxlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvU2Nyb2xsQmFyRHJhd2FibGUuamF2YQppbmRleCAzYjExM2FlLi45M2ExMTc5IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvU2Nyb2xsQmFyRHJhd2FibGUuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvU2Nyb2xsQmFyRHJhd2FibGUuamF2YQpAQCAtMTExLDggKzExMSw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBSZWN0IHIgPSBnZXRCb3VuZHMoKTsKLSAgICAgICAgaWYgKGNhbnZhcy5xdWlja1JlamVjdChyLmxlZnQsIHIudG9wLCByLnJpZ2h0LCByLmJvdHRvbSwgCi0gICAgICAgICAgICAgICAgQ2FudmFzLkVkZ2VUeXBlLkFBKSkgeworICAgICAgICBpZiAoY2FudmFzLnF1aWNrUmVqZWN0KHIubGVmdCwgci50b3AsIHIucmlnaHQsIHIuYm90dG9tLCBDYW52YXMuRWRnZVR5cGUuQUEpKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICAgICAgaWYgKGRyYXdUcmFjaykgewpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1Njcm9sbFZpZXcuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9TY3JvbGxWaWV3LmphdmEKaW5kZXggOTU5ZTk4Mi4uZWI1MjdlYiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1Njcm9sbFZpZXcuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvU2Nyb2xsVmlldy5qYXZhCkBAIC00OSw2ICs0OSw4IEBACiAgKiB3aXRoaW4gYSBsYXJnZXIgY29udGFpbmVyLgogICogCiAgKiA8cD5TY3JvbGxWaWV3IG9ubHkgc3VwcG9ydHMgdmVydGljYWwgc2Nyb2xsaW5nLgorICoKKyAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI1Njcm9sbFZpZXdfZmlsbFZpZXdwb3J0CiAgKi8KIHB1YmxpYyBjbGFzcyBTY3JvbGxWaWV3IGV4dGVuZHMgRnJhbWVMYXlvdXQgewogICAgIHN0YXRpYyBmaW5hbCBpbnQgQU5JTUFURURfU0NST0xMX0dBUCA9IDI1MDsKQEAgLTI0Nyw2ICsyNDksOCBAQAogICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgU2Nyb2xsVmlldydzIGNvbnRlbnQgaXMgc3RyZXRjaGVkIHRvIGZpbGwgdGhlIHZpZXdwb3J0LgogICAgICAqCiAgICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBjb250ZW50IGZpbGxzIHRoZSB2aWV3cG9ydCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqIAorICAgICAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI1Njcm9sbFZpZXdfZmlsbFZpZXdwb3J0CiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNGaWxsVmlld3BvcnQoKSB7CiAgICAgICAgIHJldHVybiBtRmlsbFZpZXdwb3J0OwpAQCAtMjU4LDYgKzI2Miw4IEBACiAgICAgICoKICAgICAgKiBAcGFyYW0gZmlsbFZpZXdwb3J0IFRydWUgdG8gc3RyZXRjaCB0aGUgY29udGVudCdzIGhlaWdodCB0byB0aGUgdmlld3BvcnQncwogICAgICAqICAgICAgICBib3VuZGFyaWVzLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICogCisgICAgICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjU2Nyb2xsVmlld19maWxsVmlld3BvcnQKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRGaWxsVmlld3BvcnQoYm9vbGVhbiBmaWxsVmlld3BvcnQpIHsKICAgICAgICAgaWYgKGZpbGxWaWV3cG9ydCAhPSBtRmlsbFZpZXdwb3J0KSB7CkBAIC01NjYsMTYgKzU3Miw2IEBACiAgICAgICAgIH0KICAgICB9CiAgICAgCi0gICAgcHJpdmF0ZSBpbnQgZ2V0U2Nyb2xsUmFuZ2UoKSB7Ci0gICAgICAgIGludCBzY3JvbGxSYW5nZSA9IDA7Ci0gICAgICAgIGlmIChnZXRDaGlsZENvdW50KCkgPiAwKSB7Ci0gICAgICAgICAgICBWaWV3IGNoaWxkID0gZ2V0Q2hpbGRBdCgwKTsKLSAgICAgICAgICAgIHNjcm9sbFJhbmdlID0gTWF0aC5tYXgoMCwKLSAgICAgICAgICAgICAgICAgICAgY2hpbGQuZ2V0SGVpZ2h0KCkgLSBnZXRIZWlnaHQoKSAtIG1QYWRkaW5nQm90dG9tIC0gbVBhZGRpbmdUb3ApOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzY3JvbGxSYW5nZTsKLSAgICB9Ci0KICAgICAvKioKICAgICAgKiA8cD4KICAgICAgKiBGaW5kcyB0aGUgbmV4dCBmb2N1c2FibGUgY29tcG9uZW50IHRoYXQgZml0cyBpbiB0aGlzIFZpZXcncyBib3VuZHMKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9TaW1wbGVDdXJzb3JBZGFwdGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvU2ltcGxlQ3Vyc29yQWRhcHRlci5qYXZhCmluZGV4IDdkMzQ1OWUuLmQxYzIyNzAgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9TaW1wbGVDdXJzb3JBZGFwdGVyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1NpbXBsZUN1cnNvckFkYXB0ZXIuamF2YQpAQCAtNjIsNyArNjIsOCBAQAogICAgIHByaXZhdGUgaW50IG1TdHJpbmdDb252ZXJzaW9uQ29sdW1uID0gLTE7CiAgICAgcHJpdmF0ZSBDdXJzb3JUb1N0cmluZ0NvbnZlcnRlciBtQ3Vyc29yVG9TdHJpbmdDb252ZXJ0ZXI7CiAgICAgcHJpdmF0ZSBWaWV3QmluZGVyIG1WaWV3QmluZGVyOwotICAgIHByaXZhdGUgU3RyaW5nW10gbU9yaWdpbmFsRnJvbTsKKworICAgIFN0cmluZ1tdIG1PcmlnaW5hbEZyb207CiAKICAgICAvKioKICAgICAgKiBDb25zdHJ1Y3Rvci4KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9TcGlubmVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvU3Bpbm5lci5qYXZhCmluZGV4IDhkZGIwNmMuLmI1MzRjMzQgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9TcGlubmVyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1NwaW5uZXIuamF2YQpAQCAtMjQsNiArMjQsNyBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheTsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkRhdGFTZXRPYnNlcnZlcjsKIGltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OworaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOwogCkBAIC00MCwxMCArNDEsMjEgQEAKICAqLwogQFdpZGdldAogcHVibGljIGNsYXNzIFNwaW5uZXIgZXh0ZW5kcyBBYnNTcGlubmVyIGltcGxlbWVudHMgT25DbGlja0xpc3RlbmVyIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlNwaW5uZXIiOwogICAgIAotICAgIHByaXZhdGUgQ2hhclNlcXVlbmNlIG1Qcm9tcHQ7Ci0gICAgcHJpdmF0ZSBBbGVydERpYWxvZyBtUG9wdXA7Ci0KKyAgICAvKioKKyAgICAgKiBVc2UgYSBkaWFsb2cgd2luZG93IGZvciBzZWxlY3Rpbmcgc3Bpbm5lciBvcHRpb25zLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1PREVfRElBTE9HID0gMDsKKyAgICAKKyAgICAvKioKKyAgICAgKiBVc2UgYSBkcm9wZG93biBhbmNob3JlZCB0byB0aGUgU3Bpbm5lciBmb3Igc2VsZWN0aW5nIHNwaW5uZXIgb3B0aW9ucy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT0RFX0RST1BET1dOID0gMTsKKyAgICAKKyAgICBwcml2YXRlIFNwaW5uZXJQb3B1cCBtUG9wdXA7CisgICAgcHJpdmF0ZSBEcm9wRG93bkFkYXB0ZXIgbVRlbXBBZGFwdGVyOworICAgIAogICAgIHB1YmxpYyBTcGlubmVyKENvbnRleHQgY29udGV4dCkgewogICAgICAgICB0aGlzKGNvbnRleHQsIG51bGwpOwogICAgIH0KQEAgLTU4LDkgKzcwLDU0IEBACiAgICAgICAgIFR5cGVkQXJyYXkgYSA9IGNvbnRleHQub2J0YWluU3R5bGVkQXR0cmlidXRlcyhhdHRycywKICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5TcGlubmVyLCBkZWZTdHlsZSwgMCk7CiAgICAgICAgIAotICAgICAgICBtUHJvbXB0ID0gYS5nZXRTdHJpbmcoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuU3Bpbm5lcl9wcm9tcHQpOworICAgICAgICBmaW5hbCBpbnQgbW9kZSA9IGEuZ2V0SW50KGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLlNwaW5uZXJfc3Bpbm5lck1vZGUsCisgICAgICAgICAgICAgICAgTU9ERV9ESUFMT0cpOworICAgICAgICAKKyAgICAgICAgc3dpdGNoIChtb2RlKSB7CisgICAgICAgIGNhc2UgTU9ERV9ESUFMT0c6IHsKKyAgICAgICAgICAgIG1Qb3B1cCA9IG5ldyBEaWFsb2dQb3B1cCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGNhc2UgTU9ERV9EUk9QRE9XTjogeworICAgICAgICAgICAgZmluYWwgaW50IGhpbnRSZXNvdXJjZSA9IGEuZ2V0UmVzb3VyY2VJZCgKKyAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuU3Bpbm5lcl9wb3B1cFByb21wdFZpZXcsIDApOworCisgICAgICAgICAgICBEcm9wZG93blBvcHVwIHBvcHVwID0gbmV3IERyb3Bkb3duUG9wdXAoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlLCBoaW50UmVzb3VyY2UpOworCisgICAgICAgICAgICBwb3B1cC5zZXRCYWNrZ3JvdW5kRHJhd2FibGUoYS5nZXREcmF3YWJsZSgKKyAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuU3Bpbm5lcl9wb3B1cEJhY2tncm91bmQpKTsKKyAgICAgICAgICAgIHBvcHVwLnNldFZlcnRpY2FsT2Zmc2V0KGEuZ2V0RGltZW5zaW9uUGl4ZWxPZmZzZXQoCisgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLlNwaW5uZXJfZHJvcERvd25WZXJ0aWNhbE9mZnNldCwgMCkpOworICAgICAgICAgICAgcG9wdXAuc2V0SG9yaXpvbnRhbE9mZnNldChhLmdldERpbWVuc2lvblBpeGVsT2Zmc2V0KAorICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5TcGlubmVyX2Ryb3BEb3duSG9yaXpvbnRhbE9mZnNldCwgMCkpOworCisgICAgICAgICAgICBtUG9wdXAgPSBwb3B1cDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIG1Qb3B1cC5zZXRQcm9tcHRUZXh0KGEuZ2V0U3RyaW5nKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLlNwaW5uZXJfcHJvbXB0KSk7CiAKICAgICAgICAgYS5yZWN5Y2xlKCk7CisKKyAgICAgICAgLy8gQmFzZSBjb25zdHJ1Y3RvciBjYW4gY2FsbCBzZXRBZGFwdGVyIGJlZm9yZSB3ZSBpbml0aWFsaXplIG1Qb3B1cC4KKyAgICAgICAgLy8gRmluaXNoIHNldHRpbmcgdGhpbmdzIHVwIGlmIHRoaXMgaGFwcGVuZWQuCisgICAgICAgIGlmIChtVGVtcEFkYXB0ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgbVBvcHVwLnNldEFkYXB0ZXIobVRlbXBBZGFwdGVyKTsKKyAgICAgICAgICAgIG1UZW1wQWRhcHRlciA9IG51bGw7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0QWRhcHRlcihTcGlubmVyQWRhcHRlciBhZGFwdGVyKSB7CisgICAgICAgIHN1cGVyLnNldEFkYXB0ZXIoYWRhcHRlcik7CisKKyAgICAgICAgaWYgKG1Qb3B1cCAhPSBudWxsKSB7CisgICAgICAgICAgICBtUG9wdXAuc2V0QWRhcHRlcihuZXcgRHJvcERvd25BZGFwdGVyKGFkYXB0ZXIpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1UZW1wQWRhcHRlciA9IG5ldyBEcm9wRG93bkFkYXB0ZXIoYWRhcHRlcik7CisgICAgICAgIH0KICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTE5Nyw4ICsyNTQsNiBAQAogICAgICAgICByZXR1cm4gY2hpbGQ7CiAgICAgfQogCi0KLQogICAgIC8qKgogICAgICAqIEhlbHBlciBmb3IgbWFrZUFuZEFkZFZpZXcgdG8gc2V0IHRoZSBwb3NpdGlvbiBvZiBhIHZpZXcKICAgICAgKiBhbmQgZmlsbCBvdXQgaXRzIGxheW91dCBwYXJhbXRlcnMuCkBAIC0yNDksMTUgKzMwNCwxMCBAQAogICAgICAgICAKICAgICAgICAgaWYgKCFoYW5kbGVkKSB7CiAgICAgICAgICAgICBoYW5kbGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIENvbnRleHQgY29udGV4dCA9IGdldENvbnRleHQoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZmluYWwgRHJvcERvd25BZGFwdGVyIGFkYXB0ZXIgPSBuZXcgRHJvcERvd25BZGFwdGVyKGdldEFkYXB0ZXIoKSk7CiAKLSAgICAgICAgICAgIEFsZXJ0RGlhbG9nLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBBbGVydERpYWxvZy5CdWlsZGVyKGNvbnRleHQpOwotICAgICAgICAgICAgaWYgKG1Qcm9tcHQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIuc2V0VGl0bGUobVByb21wdCk7CisgICAgICAgICAgICBpZiAoIW1Qb3B1cC5pc1Nob3dpbmcoKSkgeworICAgICAgICAgICAgICAgIG1Qb3B1cC5zaG93KCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtUG9wdXAgPSBidWlsZGVyLnNldFNpbmdsZUNob2ljZUl0ZW1zKGFkYXB0ZXIsIGdldFNlbGVjdGVkSXRlbVBvc2l0aW9uKCksIHRoaXMpLnNob3coKTsKICAgICAgICAgfQogCiAgICAgICAgIHJldHVybiBoYW5kbGVkOwpAQCAtMjc0LDcgKzMyNCw3IEBACiAgICAgICogQHBhcmFtIHByb21wdCB0aGUgcHJvbXB0IHRvIHNldAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFByb21wdChDaGFyU2VxdWVuY2UgcHJvbXB0KSB7Ci0gICAgICAgIG1Qcm9tcHQgPSBwcm9tcHQ7CisgICAgICAgIG1Qb3B1cC5zZXRQcm9tcHRUZXh0KHByb21wdCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0yODIsMTQgKzMzMiwxNCBAQAogICAgICAqIEBwYXJhbSBwcm9tcHRJZCB0aGUgcmVzb3VyY2UgSUQgb2YgdGhlIHByb21wdCB0byBkaXNwbGF5IHdoZW4gdGhlIGRpYWxvZyBpcyBzaG93bgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFByb21wdElkKGludCBwcm9tcHRJZCkgewotICAgICAgICBtUHJvbXB0ID0gZ2V0Q29udGV4dCgpLmdldFRleHQocHJvbXB0SWQpOworICAgICAgICBzZXRQcm9tcHQoZ2V0Q29udGV4dCgpLmdldFRleHQocHJvbXB0SWQpKTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBAcmV0dXJuIFRoZSBwcm9tcHQgdG8gZGlzcGxheSB3aGVuIHRoZSBkaWFsb2cgaXMgc2hvd24KICAgICAgKi8KICAgICBwdWJsaWMgQ2hhclNlcXVlbmNlIGdldFByb21wdCgpIHsKLSAgICAgICAgcmV0dXJuIG1Qcm9tcHQ7CisgICAgICAgIHJldHVybiBtUG9wdXAuZ2V0SGludFRleHQoKTsKICAgICB9CiAgICAgCiAgICAgLyoqCkBAIC0zODcsNCArNDM3LDEyMyBAQAogICAgICAgICAgICAgcmV0dXJuIGdldENvdW50KCkgPT0gMDsKICAgICAgICAgfQogICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBJbXBsZW1lbnRzIHNvbWUgc29ydCBvZiBwb3B1cCBzZWxlY3Rpb24gaW50ZXJmYWNlIGZvciBzZWxlY3RpbmcgYSBzcGlubmVyIG9wdGlvbi4KKyAgICAgKiBBbGxvd3MgZm9yIGRpZmZlcmVudCBzcGlubmVyIG1vZGVzLgorICAgICAqLworICAgIHByaXZhdGUgaW50ZXJmYWNlIFNwaW5uZXJQb3B1cCB7CisgICAgICAgIHB1YmxpYyB2b2lkIHNldEFkYXB0ZXIoTGlzdEFkYXB0ZXIgYWRhcHRlcik7CisgICAgICAgIAorICAgICAgICAvKioKKyAgICAgICAgICogU2hvdyB0aGUgcG9wdXAKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHNob3coKTsKKyAgICAgICAgCisgICAgICAgIC8qKgorICAgICAgICAgKiBEaXNtaXNzIHRoZSBwb3B1cAorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgZGlzbWlzcygpOworICAgICAgICAKKyAgICAgICAgLyoqCisgICAgICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcG9wdXAgaXMgc2hvd2luZywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNTaG93aW5nKCk7CisgICAgICAgIAorICAgICAgICAvKioKKyAgICAgICAgICogU2V0IGhpbnQgdGV4dCB0byBiZSBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIuIFRoaXMgc2hvdWxkIHByb3ZpZGUKKyAgICAgICAgICogYSBkZXNjcmlwdGlvbiBvZiB0aGUgY2hvaWNlIGJlaW5nIG1hZGUuCisgICAgICAgICAqIEBwYXJhbSBoaW50VGV4dCBIaW50IHRleHQgdG8gc2V0LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc2V0UHJvbXB0VGV4dChDaGFyU2VxdWVuY2UgaGludFRleHQpOworICAgICAgICBwdWJsaWMgQ2hhclNlcXVlbmNlIGdldEhpbnRUZXh0KCk7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgY2xhc3MgRGlhbG9nUG9wdXAgaW1wbGVtZW50cyBTcGlubmVyUG9wdXAsIERpYWxvZ0ludGVyZmFjZS5PbkNsaWNrTGlzdGVuZXIgeworICAgICAgICBwcml2YXRlIEFsZXJ0RGlhbG9nIG1Qb3B1cDsKKyAgICAgICAgcHJpdmF0ZSBMaXN0QWRhcHRlciBtTGlzdEFkYXB0ZXI7CisgICAgICAgIHByaXZhdGUgQ2hhclNlcXVlbmNlIG1Qcm9tcHQ7CisKKyAgICAgICAgcHVibGljIHZvaWQgZGlzbWlzcygpIHsKKyAgICAgICAgICAgIG1Qb3B1cC5kaXNtaXNzKCk7CisgICAgICAgICAgICBtUG9wdXAgPSBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNTaG93aW5nKCkgeworICAgICAgICAgICAgcmV0dXJuIG1Qb3B1cCAhPSBudWxsID8gbVBvcHVwLmlzU2hvd2luZygpIDogZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRBZGFwdGVyKExpc3RBZGFwdGVyIGFkYXB0ZXIpIHsKKyAgICAgICAgICAgIG1MaXN0QWRhcHRlciA9IGFkYXB0ZXI7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRQcm9tcHRUZXh0KENoYXJTZXF1ZW5jZSBoaW50VGV4dCkgeworICAgICAgICAgICAgbVByb21wdCA9IGhpbnRUZXh0OworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwdWJsaWMgQ2hhclNlcXVlbmNlIGdldEhpbnRUZXh0KCkgeworICAgICAgICAgICAgcmV0dXJuIG1Qcm9tcHQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzaG93KCkgeworICAgICAgICAgICAgQWxlcnREaWFsb2cuQnVpbGRlciBidWlsZGVyID0gbmV3IEFsZXJ0RGlhbG9nLkJ1aWxkZXIoZ2V0Q29udGV4dCgpKTsKKyAgICAgICAgICAgIGlmIChtUHJvbXB0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBidWlsZGVyLnNldFRpdGxlKG1Qcm9tcHQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVBvcHVwID0gYnVpbGRlci5zZXRTaW5nbGVDaG9pY2VJdGVtcyhtTGlzdEFkYXB0ZXIsCisgICAgICAgICAgICAgICAgICAgIGdldFNlbGVjdGVkSXRlbVBvc2l0aW9uKCksIHRoaXMpLnNob3coKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhEaWFsb2dJbnRlcmZhY2UgZGlhbG9nLCBpbnQgd2hpY2gpIHsKKyAgICAgICAgICAgIHNldFNlbGVjdGlvbih3aGljaCk7CisgICAgICAgICAgICBkaXNtaXNzKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBjbGFzcyBEcm9wZG93blBvcHVwIGV4dGVuZHMgTGlzdFBvcHVwV2luZG93IGltcGxlbWVudHMgU3Bpbm5lclBvcHVwIHsKKyAgICAgICAgcHJpdmF0ZSBDaGFyU2VxdWVuY2UgbUhpbnRUZXh0OworICAgICAgICBwcml2YXRlIFRleHRWaWV3IG1IaW50VmlldzsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbUhpbnRSZXNvdXJjZTsKKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBEcm9wZG93blBvcHVwKENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzLAorICAgICAgICAgICAgICAgIGludCBkZWZTdHlsZVJlcywgaW50IGhpbnRSZXNvdXJjZSkgeworICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMsIDAsIGRlZlN0eWxlUmVzKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgbUhpbnRSZXNvdXJjZSA9IGhpbnRSZXNvdXJjZTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgc2V0QW5jaG9yVmlldyhTcGlubmVyLnRoaXMpOworICAgICAgICAgICAgc2V0TW9kYWwodHJ1ZSk7CisgICAgICAgICAgICBzZXRQcm9tcHRQb3NpdGlvbihQT1NJVElPTl9QUk9NUFRfQkVMT1cpOworICAgICAgICAgICAgc2V0T25JdGVtQ2xpY2tMaXN0ZW5lcihuZXcgT25JdGVtQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkl0ZW1DbGljayhBZGFwdGVyVmlldyBwYXJlbnQsIFZpZXcgdiwgaW50IHBvc2l0aW9uLCBsb25nIGlkKSB7CisgICAgICAgICAgICAgICAgICAgIFNwaW5uZXIudGhpcy5zZXRTZWxlY3Rpb24ocG9zaXRpb24pOworICAgICAgICAgICAgICAgICAgICBkaXNtaXNzKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBDaGFyU2VxdWVuY2UgZ2V0SGludFRleHQoKSB7CisgICAgICAgICAgICByZXR1cm4gbUhpbnRUZXh0OworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwdWJsaWMgdm9pZCBzZXRQcm9tcHRUZXh0KENoYXJTZXF1ZW5jZSBoaW50VGV4dCkgeworICAgICAgICAgICAgbUhpbnRUZXh0ID0gaGludFRleHQ7CisgICAgICAgICAgICBpZiAobUhpbnRWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtSGludFZpZXcuc2V0VGV4dChoaW50VGV4dCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyB2b2lkIHNob3coKSB7CisgICAgICAgICAgICBpZiAobUhpbnRWaWV3ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBUZXh0VmlldyB0ZXh0VmlldyA9IChUZXh0VmlldykgTGF5b3V0SW5mbGF0ZXIuZnJvbShnZXRDb250ZXh0KCkpLmluZmxhdGUoCisgICAgICAgICAgICAgICAgICAgICAgICBtSGludFJlc291cmNlLCBudWxsKS5maW5kVmlld0J5SWQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5pZC50ZXh0MSk7CisgICAgICAgICAgICAgICAgdGV4dFZpZXcuc2V0VGV4dChtSGludFRleHQpOworICAgICAgICAgICAgICAgIHNldFByb21wdFZpZXcodGV4dFZpZXcpOworICAgICAgICAgICAgICAgIG1IaW50VmlldyA9IHRleHRWaWV3OworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3VwZXIuc2hvdygpOworICAgICAgICAgICAgZ2V0TGlzdFZpZXcoKS5zZXRDaG9pY2VNb2RlKExpc3RWaWV3LkNIT0lDRV9NT0RFX1NJTkdMRSk7CisgICAgICAgICAgICBzZXRTZWxlY3Rpb24oU3Bpbm5lci50aGlzLmdldFNlbGVjdGVkSXRlbVBvc2l0aW9uKCkpOworICAgICAgICB9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1N0YWNrVmlldy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1N0YWNrVmlldy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzZTg4MzgKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvU3RhY2tWaWV3LmphdmEKQEAgLTAsMCArMSw3MDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQud2lkZ2V0OworCitpbXBvcnQgamF2YS51dGlsLldlYWtIYXNoTWFwOworCitpbXBvcnQgYW5kcm9pZC5hbmltYXRpb24uUHJvcGVydHlBbmltYXRvcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLk1hdHJpeDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9ydGVyRHVmZjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBvcnRlckR1ZmZYZmVybW9kZTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7CitpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmVsb2NpdHlUcmFja2VyOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3Q29uZmlndXJhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uTGluZWFySW50ZXJwb2xhdG9yOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlJlbW90ZVZpZXdzLlJlbW90ZVZpZXc7CisKK0BSZW1vdGVWaWV3CisvKioKKyAqIEEgdmlldyB0aGF0IGRpc3BsYXlzIGl0cyBjaGlsZHJlbiBpbiBhIHN0YWNrIGFuZCBhbGxvd3MgdXNlcnMgdG8gZGlzY3JldGVseSBzd2lwZQorICogdGhyb3VnaCB0aGUgY2hpbGRyZW4uCisgKi8KK3B1YmxpYyBjbGFzcyBTdGFja1ZpZXcgZXh0ZW5kcyBBZGFwdGVyVmlld0FuaW1hdG9yIHsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBUQUcgPSAiU3RhY2tWaWV3IjsKKworICAgIC8qKgorICAgICAqIERlZmF1bHQgYW5pbWF0aW9uIHBhcmFtZXRlcnMKKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIGludCBERUZBVUxUX0FOSU1BVElPTl9EVVJBVElPTiA9IDQwMDsKKyAgICBwcml2YXRlIGZpbmFsIGludCBNSU5JTVVNX0FOSU1BVElPTl9EVVJBVElPTiA9IDUwOworCisgICAgLyoqCisgICAgICogVGhlc2Ugc3BlY2lmeSB0aGUgZGlmZmVyZW50IGdlc3R1cmUgc3RhdGVzCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEdFU1RVUkVfTk9ORSA9IDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEdFU1RVUkVfU0xJREVfVVAgPSAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBHRVNUVVJFX1NMSURFX0RPV04gPSAyOworCisgICAgLyoqCisgICAgICogU3BlY2lmaWVzIGhvdyBmYXIgeW91IG5lZWQgdG8gc3dpcGUgKHVwIG9yIGRvd24pIGJlZm9yZSBpdAorICAgICAqIHdpbGwgYmUgY29uc2lkZXIgYSBjb21wbGV0ZWQgZ2VzdHVyZSB3aGVuIHlvdSBsaWZ0IHlvdXIgZmluZ2VyCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgU1dJUEVfVEhSRVNIT0xEX1JBVElPID0gMC4zNWY7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgU0xJREVfVVBfUkFUSU8gPSAwLjdmOworCisgICAgcHJpdmF0ZSBmaW5hbCBXZWFrSGFzaE1hcDxWaWV3LCBGbG9hdD4gbVJvdGF0aW9ucyA9IG5ldyBXZWFrSGFzaE1hcDxWaWV3LCBGbG9hdD4oKTsKKyAgICBwcml2YXRlIGZpbmFsIFdlYWtIYXNoTWFwPFZpZXcsIEludGVnZXI+CisgICAgICAgICAgICBtQ2hpbGRyZW5Ub0FwcGx5VHJhbnNmb3Jtc1RvID0gbmV3IFdlYWtIYXNoTWFwPFZpZXcsIEludGVnZXI+KCk7CisKKyAgICAvKioKKyAgICAgKiBTZW50aW5lbCB2YWx1ZSBmb3Igbm8gY3VycmVudCBhY3RpdmUgcG9pbnRlci4KKyAgICAgKiBVc2VkIGJ5IHtAbGluayAjbUFjdGl2ZVBvaW50ZXJJZH0uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElOVkFMSURfUE9JTlRFUiA9IC0xOworCisgICAgLyoqCisgICAgICogVGhlc2UgdmFyaWFibGVzIGFyZSBhbGwgcmVsYXRlZCB0byB0aGUgY3VycmVudCBzdGF0ZSBvZiB0b3VjaCBpbnRlcmFjdGlvbgorICAgICAqIHdpdGggdGhlIHN0YWNrCisgICAgICovCisgICAgcHJpdmF0ZSBmbG9hdCBtSW5pdGlhbFk7CisgICAgcHJpdmF0ZSBmbG9hdCBtSW5pdGlhbFg7CisgICAgcHJpdmF0ZSBpbnQgbUFjdGl2ZVBvaW50ZXJJZDsKKyAgICBwcml2YXRlIGludCBtWVZlbG9jaXR5ID0gMDsKKyAgICBwcml2YXRlIGludCBtU3dpcGVHZXN0dXJlVHlwZSA9IEdFU1RVUkVfTk9ORTsKKyAgICBwcml2YXRlIGludCBtVmlld0hlaWdodDsKKyAgICBwcml2YXRlIGludCBtU3dpcGVUaHJlc2hvbGQ7CisgICAgcHJpdmF0ZSBpbnQgbVRvdWNoU2xvcDsKKyAgICBwcml2YXRlIGludCBtTWF4aW11bVZlbG9jaXR5OworICAgIHByaXZhdGUgVmVsb2NpdHlUcmFja2VyIG1WZWxvY2l0eVRyYWNrZXI7CisKKyAgICBwcml2YXRlIEltYWdlVmlldyBtSGlnaGxpZ2h0OworICAgIHByaXZhdGUgU3RhY2tTbGlkZXIgbVN0YWNrU2xpZGVyOworICAgIHByaXZhdGUgYm9vbGVhbiBtRmlyc3RMYXlvdXRIYXBwZW5lZCA9IGZhbHNlOworCisgICAgcHVibGljIFN0YWNrVmlldyhDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCk7CisgICAgICAgIGluaXRTdGFja1ZpZXcoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RhY2tWaWV3KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzKTsKKyAgICAgICAgaW5pdFN0YWNrVmlldygpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbml0U3RhY2tWaWV3KCkgeworICAgICAgICBjb25maWd1cmVWaWV3QW5pbWF0b3IoNCwgMiwgZmFsc2UpOworICAgICAgICBzZXRTdGF0aWNUcmFuc2Zvcm1hdGlvbnNFbmFibGVkKHRydWUpOworICAgICAgICBmaW5hbCBWaWV3Q29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uID0gVmlld0NvbmZpZ3VyYXRpb24uZ2V0KGdldENvbnRleHQoKSk7CisgICAgICAgIG1Ub3VjaFNsb3AgPSBjb25maWd1cmF0aW9uLmdldFNjYWxlZFRvdWNoU2xvcCgpOworICAgICAgICBtTWF4aW11bVZlbG9jaXR5ID0gY29uZmlndXJhdGlvbi5nZXRTY2FsZWRNYXhpbXVtRmxpbmdWZWxvY2l0eSgpOworICAgICAgICBtQWN0aXZlUG9pbnRlcklkID0gSU5WQUxJRF9QT0lOVEVSOworCisgICAgICAgIG1IaWdobGlnaHQgPSBuZXcgSW1hZ2VWaWV3KGdldENvbnRleHQoKSk7CisgICAgICAgIG1IaWdobGlnaHQuc2V0TGF5b3V0UGFyYW1zKG5ldyBMYXlvdXRQYXJhbXMobUhpZ2hsaWdodCkpOworICAgICAgICBhZGRWaWV3SW5MYXlvdXQobUhpZ2hsaWdodCwgLTEsIG5ldyBMYXlvdXRQYXJhbXMobUhpZ2hsaWdodCkpOworICAgICAgICBtU3RhY2tTbGlkZXIgPSBuZXcgU3RhY2tTbGlkZXIoKTsKKworICAgICAgICBpZiAoIXNQYWludHNJbml0aWFsaXplZCkgeworICAgICAgICAgICAgaW5pdGlhbGl6ZVBhaW50cygpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQW5pbWF0ZSB0aGUgdmlld3MgYmV0d2VlbiBkaWZmZXJlbnQgcmVsYXRpdmUgaW5kZXhlcyB3aXRoaW4gdGhlIHtAbGluayBBZGFwdGVyVmlld0FuaW1hdG9yfQorICAgICAqLworICAgIHZvaWQgYW5pbWF0ZVZpZXdGb3JUcmFuc2l0aW9uKGludCBmcm9tSW5kZXgsIGludCB0b0luZGV4LCBWaWV3IHZpZXcpIHsKKyAgICAgICAgaWYgKGZyb21JbmRleCA9PSAtMSAmJiB0b0luZGV4ID09IDApIHsKKyAgICAgICAgICAgIC8vIEZhZGUgaXRlbSBpbgorICAgICAgICAgICAgaWYgKHZpZXcuZ2V0QWxwaGEoKSA9PSAxKSB7CisgICAgICAgICAgICAgICAgdmlldy5zZXRBbHBoYSgwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZpZXcuc2V0VmlzaWJpbGl0eShWSVNJQkxFKTsKKworICAgICAgICAgICAgUHJvcGVydHlBbmltYXRvciBmYWRlSW4gPSBuZXcgUHJvcGVydHlBbmltYXRvcihERUZBVUxUX0FOSU1BVElPTl9EVVJBVElPTiwKKyAgICAgICAgICAgICAgICAgICAgdmlldywgImFscGhhIiwgdmlldy5nZXRBbHBoYSgpLCAxLjBmKTsKKyAgICAgICAgICAgIGZhZGVJbi5zdGFydCgpOworICAgICAgICB9IGVsc2UgaWYgKGZyb21JbmRleCA9PSBtTnVtQWN0aXZlVmlld3MgLSAxICYmIHRvSW5kZXggPT0gbU51bUFjdGl2ZVZpZXdzIC0gMikgeworICAgICAgICAgICAgLy8gU2xpZGUgaXRlbSBpbgorICAgICAgICAgICAgdmlldy5zZXRWaXNpYmlsaXR5KFZJU0lCTEUpOworCisgICAgICAgICAgICBMYXlvdXRQYXJhbXMgbHAgPSAoTGF5b3V0UGFyYW1zKSB2aWV3LmdldExheW91dFBhcmFtcygpOworICAgICAgICAgICAgaW50IGxhcmdlc3REdXJhdGlvbiA9CisgICAgICAgICAgICAgICAgTWF0aC5yb3VuZChtU3RhY2tTbGlkZXIuZ2V0RHVyYXRpb25Gb3JOZXV0cmFsUG9zaXRpb24oKSpERUZBVUxUX0FOSU1BVElPTl9EVVJBVElPTik7CisKKyAgICAgICAgICAgIGludCBkdXJhdGlvbiA9IGxhcmdlc3REdXJhdGlvbjsKKyAgICAgICAgICAgIGlmIChtWVZlbG9jaXR5ICE9IDApIHsKKyAgICAgICAgICAgICAgICBkdXJhdGlvbiA9IDEwMDAqKDAgLSBscC52ZXJ0aWNhbE9mZnNldCkvTWF0aC5hYnMobVlWZWxvY2l0eSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGR1cmF0aW9uID0gTWF0aC5taW4oZHVyYXRpb24sIGxhcmdlc3REdXJhdGlvbik7CisgICAgICAgICAgICBkdXJhdGlvbiA9IE1hdGgubWF4KGR1cmF0aW9uLCBNSU5JTVVNX0FOSU1BVElPTl9EVVJBVElPTik7CisKKyAgICAgICAgICAgIFN0YWNrU2xpZGVyIGFuaW1hdGlvblNsaWRlciA9IG5ldyBTdGFja1NsaWRlcihtU3RhY2tTbGlkZXIpOworICAgICAgICAgICAgUHJvcGVydHlBbmltYXRvciBzbGlkZUluWSA9IG5ldyBQcm9wZXJ0eUFuaW1hdG9yKGR1cmF0aW9uLCBhbmltYXRpb25TbGlkZXIsCisgICAgICAgICAgICAgICAgICAgICJZUHJvZ3Jlc3MiLCBtU3RhY2tTbGlkZXIuZ2V0WVByb2dyZXNzKCksIDApOworICAgICAgICAgICAgc2xpZGVJblkuc2V0SW50ZXJwb2xhdG9yKG5ldyBMaW5lYXJJbnRlcnBvbGF0b3IoKSk7CisgICAgICAgICAgICBzbGlkZUluWS5zdGFydCgpOworICAgICAgICAgICAgUHJvcGVydHlBbmltYXRvciBzbGlkZUluWCA9IG5ldyBQcm9wZXJ0eUFuaW1hdG9yKGR1cmF0aW9uLCBhbmltYXRpb25TbGlkZXIsCisgICAgICAgICAgICAgICAgICAgICJYUHJvZ3Jlc3MiLCBtU3RhY2tTbGlkZXIuZ2V0WFByb2dyZXNzKCksIDApOworICAgICAgICAgICAgc2xpZGVJblguc2V0SW50ZXJwb2xhdG9yKG5ldyBMaW5lYXJJbnRlcnBvbGF0b3IoKSk7CisgICAgICAgICAgICBzbGlkZUluWC5zdGFydCgpOworICAgICAgICB9IGVsc2UgaWYgKGZyb21JbmRleCA9PSBtTnVtQWN0aXZlVmlld3MgLSAyICYmIHRvSW5kZXggPT0gbU51bUFjdGl2ZVZpZXdzIC0gMSkgeworICAgICAgICAgICAgLy8gU2xpZGUgaXRlbSBvdXQKKyAgICAgICAgICAgIExheW91dFBhcmFtcyBscCA9IChMYXlvdXRQYXJhbXMpIHZpZXcuZ2V0TGF5b3V0UGFyYW1zKCk7CisKKyAgICAgICAgICAgIGludCBsYXJnZXN0RHVyYXRpb24gPSBNYXRoLnJvdW5kKG1TdGFja1NsaWRlci5nZXREdXJhdGlvbkZvck9mZnNjcmVlblBvc2l0aW9uKCkqCisgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfQU5JTUFUSU9OX0RVUkFUSU9OKTsKKyAgICAgICAgICAgIGludCBkdXJhdGlvbiA9IGxhcmdlc3REdXJhdGlvbjsKKyAgICAgICAgICAgIGlmIChtWVZlbG9jaXR5ICE9IDApIHsKKyAgICAgICAgICAgICAgICBkdXJhdGlvbiA9IDEwMDAqKGxwLnZlcnRpY2FsT2Zmc2V0ICsgbVZpZXdIZWlnaHQpL01hdGguYWJzKG1ZVmVsb2NpdHkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkdXJhdGlvbiA9IE1hdGgubWluKGR1cmF0aW9uLCBsYXJnZXN0RHVyYXRpb24pOworICAgICAgICAgICAgZHVyYXRpb24gPSBNYXRoLm1heChkdXJhdGlvbiwgTUlOSU1VTV9BTklNQVRJT05fRFVSQVRJT04pOworCisgICAgICAgICAgICBTdGFja1NsaWRlciBhbmltYXRpb25TbGlkZXIgPSBuZXcgU3RhY2tTbGlkZXIobVN0YWNrU2xpZGVyKTsKKyAgICAgICAgICAgIFByb3BlcnR5QW5pbWF0b3Igc2xpZGVPdXRZID0gbmV3IFByb3BlcnR5QW5pbWF0b3IoZHVyYXRpb24sIGFuaW1hdGlvblNsaWRlciwKKyAgICAgICAgICAgICAgICAgICAgIllQcm9ncmVzcyIsIG1TdGFja1NsaWRlci5nZXRZUHJvZ3Jlc3MoKSwgMSk7CisgICAgICAgICAgICBzbGlkZU91dFkuc2V0SW50ZXJwb2xhdG9yKG5ldyBMaW5lYXJJbnRlcnBvbGF0b3IoKSk7CisgICAgICAgICAgICBzbGlkZU91dFkuc3RhcnQoKTsKKyAgICAgICAgICAgIFByb3BlcnR5QW5pbWF0b3Igc2xpZGVPdXRYID0gbmV3IFByb3BlcnR5QW5pbWF0b3IoZHVyYXRpb24sIGFuaW1hdGlvblNsaWRlciwKKyAgICAgICAgICAgICAgICAgICAgIlhQcm9ncmVzcyIsIG1TdGFja1NsaWRlci5nZXRYUHJvZ3Jlc3MoKSwgMCk7CisgICAgICAgICAgICBzbGlkZU91dFguc2V0SW50ZXJwb2xhdG9yKG5ldyBMaW5lYXJJbnRlcnBvbGF0b3IoKSk7CisgICAgICAgICAgICBzbGlkZU91dFguc3RhcnQoKTsKKyAgICAgICAgfSBlbHNlIGlmIChmcm9tSW5kZXggPT0gLTEgJiYgdG9JbmRleCA9PSBtTnVtQWN0aXZlVmlld3MgLSAxKSB7CisgICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhpcyB2aWV3IHRoYXQgaXMgIndhaXRpbmcgaW4gdGhlIHdpbmdzIiBpcyBpbnZpc2libGUKKyAgICAgICAgICAgIHZpZXcuc2V0QWxwaGEoMC4wZik7CisgICAgICAgICAgICB2aWV3LnNldFZpc2liaWxpdHkoSU5WSVNJQkxFKTsKKyAgICAgICAgICAgIExheW91dFBhcmFtcyBscCA9IChMYXlvdXRQYXJhbXMpIHZpZXcuZ2V0TGF5b3V0UGFyYW1zKCk7CisgICAgICAgICAgICBscC5zZXRWZXJ0aWNhbE9mZnNldCgtbVZpZXdIZWlnaHQpOworICAgICAgICB9IGVsc2UgaWYgKHRvSW5kZXggPT0gLTEpIHsKKyAgICAgICAgICAgIC8vIEZhZGUgaXRlbSBvdXQKKyAgICAgICAgICAgIFByb3BlcnR5QW5pbWF0b3IgZmFkZU91dCA9IG5ldyBQcm9wZXJ0eUFuaW1hdG9yKERFRkFVTFRfQU5JTUFUSU9OX0RVUkFUSU9OLAorICAgICAgICAgICAgICAgICAgICB2aWV3LCAiYWxwaGEiLCB2aWV3LmdldEFscGhhKCksIDApOworICAgICAgICAgICAgZmFkZU91dC5zdGFydCgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQXBwbHkgYW55IG5lY2Vzc2FyeSB0cmFuZm9ybXMgZm9yIHRoZSBjaGlsZCB0aGF0IGlzIGJlaW5nIGFkZGVkLgorICAgICAqLworICAgIHZvaWQgYXBwbHlUcmFuc2Zvcm1Gb3JDaGlsZEF0SW5kZXgoVmlldyBjaGlsZCwgaW50IHJlbGF0aXZlSW5kZXgpIHsKKyAgICAgICAgaWYgKCFtUm90YXRpb25zLmNvbnRhaW5zS2V5KGNoaWxkKSkgeworICAgICAgICAgICAgZmxvYXQgcm90YXRpb24gPSAoZmxvYXQpIChNYXRoLnJhbmRvbSgpKjI2IC0gMTMpOworICAgICAgICAgICAgbVJvdGF0aW9ucy5wdXQoY2hpbGQsIHJvdGF0aW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENoaWxkIGhhcyBiZWVuIHJlbW92ZWQKKyAgICAgICAgaWYgKHJlbGF0aXZlSW5kZXggPT0gLTEpIHsKKyAgICAgICAgICAgIGlmIChtUm90YXRpb25zLmNvbnRhaW5zS2V5KGNoaWxkKSkgeworICAgICAgICAgICAgICAgIG1Sb3RhdGlvbnMucmVtb3ZlKGNoaWxkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtQ2hpbGRyZW5Ub0FwcGx5VHJhbnNmb3Jtc1RvLmNvbnRhaW5zS2V5KGNoaWxkKSkgeworICAgICAgICAgICAgICAgIG1DaGlsZHJlblRvQXBwbHlUcmFuc2Zvcm1zVG8ucmVtb3ZlKGNoaWxkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIGlmIHRoaXMgdmlldyBpcyBhbHJlYWR5IGluIHRoZSBsYXlvdXQsIHdlIG5lZWQgdG8KKyAgICAgICAgLy8gd2FpdCB1bnRpbCBsYXlvdXQgaGFzIGZpbmlzaGVkIGluIG9yZGVyIHRvIHNldCB0aGUKKyAgICAgICAgLy8gcGl2b3QgcG9pbnQgb2YgdGhlIHJvdGF0aW9uIChyZXF1aXJpbmcgZ2V0TWVhc3VyZWRXaWR0aC9IZWlnaHQoKSkKKyAgICAgICAgbUNoaWxkcmVuVG9BcHBseVRyYW5zZm9ybXNUby5wdXQoY2hpbGQsIHJlbGF0aXZlSW5kZXgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uTGF5b3V0KGJvb2xlYW4gY2hhbmdlZCwgaW50IGxlZnQsIGludCB0b3AsIGludCByaWdodCwgaW50IGJvdHRvbSkgeworICAgICAgICBzdXBlci5vbkxheW91dChjaGFuZ2VkLCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20pOworCisgICAgICAgIGlmICghbUNoaWxkcmVuVG9BcHBseVRyYW5zZm9ybXNUby5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIGZvciAoVmlldyBjaGlsZDogbUNoaWxkcmVuVG9BcHBseVRyYW5zZm9ybXNUby5rZXlTZXQoKSkgeworICAgICAgICAgICAgICAgIGlmIChtUm90YXRpb25zLmNvbnRhaW5zS2V5KGNoaWxkKSkgeworICAgICAgICAgICAgICAgICAgICBjaGlsZC5zZXRQaXZvdFgoY2hpbGQuZ2V0TWVhc3VyZWRXaWR0aCgpLzIpOworICAgICAgICAgICAgICAgICAgICBjaGlsZC5zZXRQaXZvdFkoY2hpbGQuZ2V0TWVhc3VyZWRIZWlnaHQoKS8yKTsKKyAgICAgICAgICAgICAgICAgICAgY2hpbGQuc2V0Um90YXRpb24obVJvdGF0aW9ucy5nZXQoY2hpbGQpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQ2hpbGRyZW5Ub0FwcGx5VHJhbnNmb3Jtc1RvLmNsZWFyKCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIW1GaXJzdExheW91dEhhcHBlbmVkKSB7CisgICAgICAgICAgICBtVmlld0hlaWdodCA9IE1hdGgucm91bmQoU0xJREVfVVBfUkFUSU8qZ2V0TWVhc3VyZWRIZWlnaHQoKSk7CisgICAgICAgICAgICBtU3dpcGVUaHJlc2hvbGQgPSBNYXRoLnJvdW5kKFNXSVBFX1RIUkVTSE9MRF9SQVRJTyptVmlld0hlaWdodCk7CisKKyAgICAgICAgICAgIC8vIFRPRE86IFJpZ2h0IG5vdyB0aGlzIHdhbGtzIGFsbCB0aGUgd2F5IHVwIHRoZSB2aWV3IGhpZXJhcmNoeSBhbmQgZGlzYWJsZXMKKyAgICAgICAgICAgIC8vIENsaXBDaGlsZHJlbiBhbmQgQ2xpcFRvUGFkZGluZy4gV2UncmUgcHJvYmFibHkgZ29pbmcgIHRvIHdhbnQgdG8gcmVzZXQKKyAgICAgICAgICAgIC8vIHRoZXNlIGZsYWdzIGFzIHdlbGwuCisgICAgICAgICAgICBzZXRDbGlwQ2hpbGRyZW4oZmFsc2UpOworICAgICAgICAgICAgc2V0Q2xpcFRvUGFkZGluZyhmYWxzZSk7CisgICAgICAgICAgICBWaWV3R3JvdXAgdmlldyA9IHRoaXM7CisgICAgICAgICAgICB3aGlsZSAodmlldy5nZXRQYXJlbnQoKSAhPSBudWxsICYmIHZpZXcuZ2V0UGFyZW50KCkgaW5zdGFuY2VvZiBWaWV3R3JvdXApIHsKKyAgICAgICAgICAgICAgICB2aWV3ID0gKFZpZXdHcm91cCkgdmlldy5nZXRQYXJlbnQoKTsKKyAgICAgICAgICAgICAgICB2aWV3LnNldENsaXBDaGlsZHJlbihmYWxzZSk7CisgICAgICAgICAgICAgICAgdmlldy5zZXRDbGlwVG9QYWRkaW5nKGZhbHNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1GaXJzdExheW91dEhhcHBlbmVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIG9uSW50ZXJjZXB0VG91Y2hFdmVudChNb3Rpb25FdmVudCBldikgeworICAgICAgICBpbnQgYWN0aW9uID0gZXYuZ2V0QWN0aW9uKCk7CisgICAgICAgIHN3aXRjaChhY3Rpb24gJiBNb3Rpb25FdmVudC5BQ1RJT05fTUFTSykgeworCisgICAgICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9ET1dOOiB7CisgICAgICAgICAgICAgICAgaWYgKG1BY3RpdmVQb2ludGVySWQgPT0gSU5WQUxJRF9QT0lOVEVSKSB7CisgICAgICAgICAgICAgICAgICAgIG1Jbml0aWFsWCA9IGV2LmdldFgoKTsKKyAgICAgICAgICAgICAgICAgICAgbUluaXRpYWxZID0gZXYuZ2V0WSgpOworICAgICAgICAgICAgICAgICAgICBtQWN0aXZlUG9pbnRlcklkID0gZXYuZ2V0UG9pbnRlcklkKDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX01PVkU6IHsKKyAgICAgICAgICAgICAgICBpbnQgcG9pbnRlckluZGV4ID0gZXYuZmluZFBvaW50ZXJJbmRleChtQWN0aXZlUG9pbnRlcklkKTsKKyAgICAgICAgICAgICAgICBpZiAocG9pbnRlckluZGV4ID09IElOVkFMSURfUE9JTlRFUikgeworICAgICAgICAgICAgICAgICAgICAvLyBubyBkYXRhIGZvciBvdXIgcHJpbWFyeSBwb2ludGVyLCB0aGlzIHNob3VsZG4ndCBoYXBwZW4sIGxvZyBpdAorICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJFcnJvcjogTm8gZGF0YSBmb3Igb3VyIHByaW1hcnkgcG9pbnRlci4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmbG9hdCBuZXdZID0gZXYuZ2V0WShwb2ludGVySW5kZXgpOworICAgICAgICAgICAgICAgIGZsb2F0IGRlbHRhWSA9IG5ld1kgLSBtSW5pdGlhbFk7CisKKyAgICAgICAgICAgICAgICBiZWdpbkdlc3R1cmVJZk5lZWRlZChkZWx0YVkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBNb3Rpb25FdmVudC5BQ1RJT05fUE9JTlRFUl9VUDogeworICAgICAgICAgICAgICAgIG9uU2Vjb25kYXJ5UG9pbnRlclVwKGV2KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX1VQOgorICAgICAgICAgICAgY2FzZSBNb3Rpb25FdmVudC5BQ1RJT05fQ0FOQ0VMOiB7CisgICAgICAgICAgICAgICAgbUFjdGl2ZVBvaW50ZXJJZCA9IElOVkFMSURfUE9JTlRFUjsKKyAgICAgICAgICAgICAgICBtU3dpcGVHZXN0dXJlVHlwZSA9IEdFU1RVUkVfTk9ORTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBtU3dpcGVHZXN0dXJlVHlwZSAhPSBHRVNUVVJFX05PTkU7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGJlZ2luR2VzdHVyZUlmTmVlZGVkKGZsb2F0IGRlbHRhWSkgeworICAgICAgICBpZiAoKGludCkgTWF0aC5hYnMoZGVsdGFZKSA+IG1Ub3VjaFNsb3AgJiYgbVN3aXBlR2VzdHVyZVR5cGUgPT0gR0VTVFVSRV9OT05FKSB7CisgICAgICAgICAgICBpbnQgc3dpcGVHZXN0dXJlVHlwZSA9IGRlbHRhWSA8IDAgPyBHRVNUVVJFX1NMSURFX1VQIDogR0VTVFVSRV9TTElERV9ET1dOOworICAgICAgICAgICAgY2FuY2VsTG9uZ1ByZXNzKCk7CisgICAgICAgICAgICByZXF1ZXN0RGlzYWxsb3dJbnRlcmNlcHRUb3VjaEV2ZW50KHRydWUpOworCisgICAgICAgICAgICBpbnQgYWN0aXZlSW5kZXggPSBzd2lwZUdlc3R1cmVUeXBlID09IEdFU1RVUkVfU0xJREVfRE9XTiA/IG1OdW1BY3RpdmVWaWV3cyAtIDEKKyAgICAgICAgICAgICAgICAgICAgOiBtTnVtQWN0aXZlVmlld3MgLSAyOworCisgICAgICAgICAgICBpZiAobUFkYXB0ZXIgPT0gbnVsbCkgcmV0dXJuOworCisgICAgICAgICAgICBpZiAobUN1cnJlbnRXaW5kb3dTdGFydFVuYm91bmRlZCArIGFjdGl2ZUluZGV4ID09IDApIHsKKyAgICAgICAgICAgICAgICBtU3RhY2tTbGlkZXIuc2V0TW9kZShTdGFja1NsaWRlci5CRUdJTk5JTkdfT0ZfU1RBQ0tfTU9ERSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1DdXJyZW50V2luZG93U3RhcnRVbmJvdW5kZWQgKyBhY3RpdmVJbmRleCA9PSBtQWRhcHRlci5nZXRDb3VudCgpKSB7CisgICAgICAgICAgICAgICAgYWN0aXZlSW5kZXgtLTsKKyAgICAgICAgICAgICAgICBtU3RhY2tTbGlkZXIuc2V0TW9kZShTdGFja1NsaWRlci5FTkRfT0ZfU1RBQ0tfTU9ERSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1TdGFja1NsaWRlci5zZXRNb2RlKFN0YWNrU2xpZGVyLk5PUk1BTF9NT0RFKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgVmlldyB2ID0gZ2V0Vmlld0F0UmVsYXRpdmVJbmRleChhY3RpdmVJbmRleCk7CisgICAgICAgICAgICBpZiAodiA9PSBudWxsKSByZXR1cm47CisKKyAgICAgICAgICAgIG1IaWdobGlnaHQuc2V0SW1hZ2VCaXRtYXAoY3JlYXRlT3V0bGluZSh2KSk7CisgICAgICAgICAgICBtSGlnaGxpZ2h0LmJyaW5nVG9Gcm9udCgpOworICAgICAgICAgICAgdi5icmluZ1RvRnJvbnQoKTsKKyAgICAgICAgICAgIG1TdGFja1NsaWRlci5zZXRWaWV3KHYpOworCisgICAgICAgICAgICBpZiAoc3dpcGVHZXN0dXJlVHlwZSA9PSBHRVNUVVJFX1NMSURFX0RPV04pCisgICAgICAgICAgICAgICAgdi5zZXRWaXNpYmlsaXR5KFZJU0lCTEUpOworCisgICAgICAgICAgICAvLyBXZSBvbmx5IHJlZ2lzdGVyIHRoaXMgZ2VzdHVyZSBpZiB3ZSd2ZSBtYWRlIGl0IHRoaXMgZmFyIHdpdGhvdXQgYSBwcm9ibGVtCisgICAgICAgICAgICBtU3dpcGVHZXN0dXJlVHlwZSA9IHN3aXBlR2VzdHVyZVR5cGU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBvblRvdWNoRXZlbnQoTW90aW9uRXZlbnQgZXYpIHsKKyAgICAgICAgaW50IGFjdGlvbiA9IGV2LmdldEFjdGlvbigpOworICAgICAgICBpbnQgcG9pbnRlckluZGV4ID0gZXYuZmluZFBvaW50ZXJJbmRleChtQWN0aXZlUG9pbnRlcklkKTsKKyAgICAgICAgaWYgKHBvaW50ZXJJbmRleCA9PSBJTlZBTElEX1BPSU5URVIpIHsKKyAgICAgICAgICAgIC8vIG5vIGRhdGEgZm9yIG91ciBwcmltYXJ5IHBvaW50ZXIsIHRoaXMgc2hvdWxkbid0IGhhcHBlbiwgbG9nIGl0CisgICAgICAgICAgICBMb2cuZChUQUcsICJFcnJvcjogTm8gZGF0YSBmb3Igb3VyIHByaW1hcnkgcG9pbnRlci4iKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGZsb2F0IG5ld1kgPSBldi5nZXRZKHBvaW50ZXJJbmRleCk7CisgICAgICAgIGZsb2F0IG5ld1ggPSBldi5nZXRYKHBvaW50ZXJJbmRleCk7CisgICAgICAgIGZsb2F0IGRlbHRhWSA9IG5ld1kgLSBtSW5pdGlhbFk7CisgICAgICAgIGZsb2F0IGRlbHRhWCA9IG5ld1ggLSBtSW5pdGlhbFg7CisgICAgICAgIGlmIChtVmVsb2NpdHlUcmFja2VyID09IG51bGwpIHsKKyAgICAgICAgICAgIG1WZWxvY2l0eVRyYWNrZXIgPSBWZWxvY2l0eVRyYWNrZXIub2J0YWluKCk7CisgICAgICAgIH0KKyAgICAgICAgbVZlbG9jaXR5VHJhY2tlci5hZGRNb3ZlbWVudChldik7CisKKyAgICAgICAgc3dpdGNoIChhY3Rpb24gJiBNb3Rpb25FdmVudC5BQ1RJT05fTUFTSykgeworICAgICAgICAgICAgY2FzZSBNb3Rpb25FdmVudC5BQ1RJT05fTU9WRTogeworICAgICAgICAgICAgICAgIGJlZ2luR2VzdHVyZUlmTmVlZGVkKGRlbHRhWSk7CisKKyAgICAgICAgICAgICAgICBmbG9hdCByeCA9IGRlbHRhWC8obVZpZXdIZWlnaHQqMS4wZik7CisgICAgICAgICAgICAgICAgaWYgKG1Td2lwZUdlc3R1cmVUeXBlID09IEdFU1RVUkVfU0xJREVfRE9XTikgeworICAgICAgICAgICAgICAgICAgICBmbG9hdCByID0gKGRlbHRhWS1tVG91Y2hTbG9wKjEuMGYpL21WaWV3SGVpZ2h0KjEuMGY7CisgICAgICAgICAgICAgICAgICAgIG1TdGFja1NsaWRlci5zZXRZUHJvZ3Jlc3MoMSAtIHIpOworICAgICAgICAgICAgICAgICAgICBtU3RhY2tTbGlkZXIuc2V0WFByb2dyZXNzKHJ4KTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtU3dpcGVHZXN0dXJlVHlwZSA9PSBHRVNUVVJFX1NMSURFX1VQKSB7CisgICAgICAgICAgICAgICAgICAgIGZsb2F0IHIgPSAtKGRlbHRhWSArIG1Ub3VjaFNsb3AqMS4wZikvbVZpZXdIZWlnaHQqMS4wZjsKKyAgICAgICAgICAgICAgICAgICAgbVN0YWNrU2xpZGVyLnNldFlQcm9ncmVzcyhyKTsKKyAgICAgICAgICAgICAgICAgICAgbVN0YWNrU2xpZGVyLnNldFhQcm9ncmVzcyhyeCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX1VQOiB7CisgICAgICAgICAgICAgICAgaGFuZGxlUG9pbnRlclVwKGV2KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX1BPSU5URVJfVVA6IHsKKyAgICAgICAgICAgICAgICBvblNlY29uZGFyeVBvaW50ZXJVcChldik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9DQU5DRUw6IHsKKyAgICAgICAgICAgICAgICBtQWN0aXZlUG9pbnRlcklkID0gSU5WQUxJRF9QT0lOVEVSOworICAgICAgICAgICAgICAgIG1Td2lwZUdlc3R1cmVUeXBlID0gR0VTVFVSRV9OT05FOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgUmVjdCB0b3VjaFJlY3QgPSBuZXcgUmVjdCgpOworICAgIHByaXZhdGUgdm9pZCBvblNlY29uZGFyeVBvaW50ZXJVcChNb3Rpb25FdmVudCBldikgeworICAgICAgICBmaW5hbCBpbnQgYWN0aXZlUG9pbnRlckluZGV4ID0gZXYuZ2V0QWN0aW9uSW5kZXgoKTsKKyAgICAgICAgZmluYWwgaW50IHBvaW50ZXJJZCA9IGV2LmdldFBvaW50ZXJJZChhY3RpdmVQb2ludGVySW5kZXgpOworICAgICAgICBpZiAocG9pbnRlcklkID09IG1BY3RpdmVQb2ludGVySWQpIHsKKworICAgICAgICAgICAgaW50IGFjdGl2ZVZpZXdJbmRleCA9IChtU3dpcGVHZXN0dXJlVHlwZSA9PSBHRVNUVVJFX1NMSURFX0RPV04pID8gbU51bUFjdGl2ZVZpZXdzIC0gMQorICAgICAgICAgICAgICAgICAgICA6IG1OdW1BY3RpdmVWaWV3cyAtIDI7CisKKyAgICAgICAgICAgIFZpZXcgdiA9IGdldFZpZXdBdFJlbGF0aXZlSW5kZXgoYWN0aXZlVmlld0luZGV4KTsKKyAgICAgICAgICAgIGlmICh2ID09IG51bGwpIHJldHVybjsKKworICAgICAgICAgICAgLy8gT3VyIHByaW1hcnkgcG9pbnRlciBoYXMgZ29uZSB1cCAtLSBsZXQncyBzZWUgaWYgd2UgY2FuIGZpbmQKKyAgICAgICAgICAgIC8vIGFub3RoZXIgcG9pbnRlciBvbiB0aGUgdmlldy4gSWYgc28sIHRoZW4gd2Ugc2hvdWxkIHJlcGxhY2UKKyAgICAgICAgICAgIC8vIG91ciBwcmltYXJ5IHBvaW50ZXIgd2l0aCB0aGlzIG5ldyBwb2ludGVyIGFuZCBhZGp1c3QgdGhpbmdzCisgICAgICAgICAgICAvLyBzbyB0aGF0IHRoZSB2aWV3IGRvZXNuJ3QganVtcAorICAgICAgICAgICAgZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IGV2LmdldFBvaW50ZXJDb3VudCgpOyBpbmRleCsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGluZGV4ICE9IGFjdGl2ZVBvaW50ZXJJbmRleCkgeworCisgICAgICAgICAgICAgICAgICAgIGZsb2F0IHggPSBldi5nZXRYKGluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgeSA9IGV2LmdldFkoaW5kZXgpOworCisgICAgICAgICAgICAgICAgICAgIHRvdWNoUmVjdC5zZXQodi5nZXRMZWZ0KCksIHYuZ2V0VG9wKCksIHYuZ2V0UmlnaHQoKSwgdi5nZXRCb3R0b20oKSk7CisgICAgICAgICAgICAgICAgICAgIGlmICh0b3VjaFJlY3QuY29udGFpbnMoTWF0aC5yb3VuZCh4KSwgTWF0aC5yb3VuZCh5KSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IG9sZFggPSBldi5nZXRYKGFjdGl2ZVBvaW50ZXJJbmRleCk7CisgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBvbGRZID0gZXYuZ2V0WShhY3RpdmVQb2ludGVySW5kZXgpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBhZGp1c3Qgb3VyIGZyYW1lIG9mIHJlZmVyZW5jZSB0byBhdm9pZCBhIGp1bXAKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Jbml0aWFsWSArPSAoeSAtIG9sZFkpOworICAgICAgICAgICAgICAgICAgICAgICAgbUluaXRpYWxYICs9ICh4IC0gb2xkWCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVQb2ludGVySWQgPSBldi5nZXRQb2ludGVySWQoaW5kZXgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1WZWxvY2l0eVRyYWNrZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1WZWxvY2l0eVRyYWNrZXIuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9rLCB3ZSdyZSBnb29kLCB3ZSBmb3VuZCBhIG5ldyBwb2ludGVyIHdoaWNoIGlzIHRvdWNoaW5nIHRoZSBhY3RpdmUgdmlldworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gaWYgd2UgbWFkZSBpdCB0aGlzIGZhciwgaXQgbWVhbnMgd2UgZGlkbid0IGZpbmQgYSBzYXRpc2ZhY3RvcnkgbmV3IHBvaW50ZXIgOigsCisgICAgICAgICAgICAvLyBzbyBlbmQgdGhlIGdlc3R1cmUKKyAgICAgICAgICAgIGhhbmRsZVBvaW50ZXJVcChldik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaGFuZGxlUG9pbnRlclVwKE1vdGlvbkV2ZW50IGV2KSB7CisgICAgICAgIGludCBwb2ludGVySW5kZXggPSBldi5maW5kUG9pbnRlckluZGV4KG1BY3RpdmVQb2ludGVySWQpOworICAgICAgICBmbG9hdCBuZXdZID0gZXYuZ2V0WShwb2ludGVySW5kZXgpOworICAgICAgICBpbnQgZGVsdGFZID0gKGludCkgKG5ld1kgLSBtSW5pdGlhbFkpOworCisgICAgICAgIGlmIChtVmVsb2NpdHlUcmFja2VyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1WZWxvY2l0eVRyYWNrZXIuY29tcHV0ZUN1cnJlbnRWZWxvY2l0eSgxMDAwLCBtTWF4aW11bVZlbG9jaXR5KTsKKyAgICAgICAgICAgIG1ZVmVsb2NpdHkgPSAoaW50KSBtVmVsb2NpdHlUcmFja2VyLmdldFlWZWxvY2l0eShtQWN0aXZlUG9pbnRlcklkKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtVmVsb2NpdHlUcmFja2VyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1WZWxvY2l0eVRyYWNrZXIucmVjeWNsZSgpOworICAgICAgICAgICAgbVZlbG9jaXR5VHJhY2tlciA9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZGVsdGFZID4gbVN3aXBlVGhyZXNob2xkICYmIG1Td2lwZUdlc3R1cmVUeXBlID09IEdFU1RVUkVfU0xJREVfRE9XTgorICAgICAgICAgICAgICAgICYmIG1TdGFja1NsaWRlci5tTW9kZSA9PSBTdGFja1NsaWRlci5OT1JNQUxfTU9ERSkgeworICAgICAgICAgICAgLy8gU3dpcGUgdGhyZXNob2xkIGV4Y2VlZGVkLCBzd2lwZSBkb3duCisgICAgICAgICAgICBzaG93TmV4dCgpOworICAgICAgICAgICAgbUhpZ2hsaWdodC5icmluZ1RvRnJvbnQoKTsKKyAgICAgICAgfSBlbHNlIGlmIChkZWx0YVkgPCAtbVN3aXBlVGhyZXNob2xkICYmIG1Td2lwZUdlc3R1cmVUeXBlID09IEdFU1RVUkVfU0xJREVfVVAKKyAgICAgICAgICAgICAgICAmJiBtU3RhY2tTbGlkZXIubU1vZGUgPT0gU3RhY2tTbGlkZXIuTk9STUFMX01PREUpIHsKKyAgICAgICAgICAgIC8vIFN3aXBlIHRocmVzaG9sZCBleGNlZWRlZCwgc3dpcGUgdXAKKyAgICAgICAgICAgIHNob3dQcmV2aW91cygpOworICAgICAgICAgICAgbUhpZ2hsaWdodC5icmluZ1RvRnJvbnQoKTsKKyAgICAgICAgfSBlbHNlIGlmIChtU3dpcGVHZXN0dXJlVHlwZSA9PSBHRVNUVVJFX1NMSURFX1VQKSB7CisgICAgICAgICAgICAvLyBEaWRuJ3Qgc3dpcGUgdXAgZmFyIGVub3VnaCwgc25hcCBiYWNrIGRvd24KKyAgICAgICAgICAgIGludCBkdXJhdGlvbiA9CisgICAgICAgICAgICAgICAgTWF0aC5yb3VuZChtU3RhY2tTbGlkZXIuZ2V0RHVyYXRpb25Gb3JOZXV0cmFsUG9zaXRpb24oKSpERUZBVUxUX0FOSU1BVElPTl9EVVJBVElPTik7CisKKyAgICAgICAgICAgIFN0YWNrU2xpZGVyIGFuaW1hdGlvblNsaWRlciA9IG5ldyBTdGFja1NsaWRlcihtU3RhY2tTbGlkZXIpOworICAgICAgICAgICAgUHJvcGVydHlBbmltYXRvciBzbmFwQmFja1kgPSBuZXcgUHJvcGVydHlBbmltYXRvcihkdXJhdGlvbiwgYW5pbWF0aW9uU2xpZGVyLAorICAgICAgICAgICAgICAgICAgICAiWVByb2dyZXNzIiwgbVN0YWNrU2xpZGVyLmdldFlQcm9ncmVzcygpLCAwKTsKKyAgICAgICAgICAgIHNuYXBCYWNrWS5zZXRJbnRlcnBvbGF0b3IobmV3IExpbmVhckludGVycG9sYXRvcigpKTsKKyAgICAgICAgICAgIHNuYXBCYWNrWS5zdGFydCgpOworICAgICAgICAgICAgUHJvcGVydHlBbmltYXRvciBzbmFwQmFja1ggPSBuZXcgUHJvcGVydHlBbmltYXRvcihkdXJhdGlvbiwgYW5pbWF0aW9uU2xpZGVyLAorICAgICAgICAgICAgICAgICAgICAiWFByb2dyZXNzIiwgbVN0YWNrU2xpZGVyLmdldFhQcm9ncmVzcygpLCAwKTsKKyAgICAgICAgICAgIHNuYXBCYWNrWC5zZXRJbnRlcnBvbGF0b3IobmV3IExpbmVhckludGVycG9sYXRvcigpKTsKKyAgICAgICAgICAgIHNuYXBCYWNrWC5zdGFydCgpOworICAgICAgICB9IGVsc2UgaWYgKG1Td2lwZUdlc3R1cmVUeXBlID09IEdFU1RVUkVfU0xJREVfRE9XTikgeworICAgICAgICAgICAgLy8gRGlkbid0IHN3aXBlIGRvd24gZmFyIGVub3VnaCwgc25hcCBiYWNrIHVwCisgICAgICAgICAgICBpbnQgZHVyYXRpb24gPSBNYXRoLnJvdW5kKG1TdGFja1NsaWRlci5nZXREdXJhdGlvbkZvck9mZnNjcmVlblBvc2l0aW9uKCkqCisgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfQU5JTUFUSU9OX0RVUkFUSU9OKTsKKworICAgICAgICAgICAgU3RhY2tTbGlkZXIgYW5pbWF0aW9uU2xpZGVyID0gbmV3IFN0YWNrU2xpZGVyKG1TdGFja1NsaWRlcik7CisgICAgICAgICAgICBQcm9wZXJ0eUFuaW1hdG9yIHNuYXBCYWNrWSA9IG5ldyBQcm9wZXJ0eUFuaW1hdG9yKGR1cmF0aW9uLCBhbmltYXRpb25TbGlkZXIsCisgICAgICAgICAgICAgICAgICAgICJZUHJvZ3Jlc3MiLCBtU3RhY2tTbGlkZXIuZ2V0WVByb2dyZXNzKCksIDEpOworICAgICAgICAgICAgc25hcEJhY2tZLnNldEludGVycG9sYXRvcihuZXcgTGluZWFySW50ZXJwb2xhdG9yKCkpOworICAgICAgICAgICAgc25hcEJhY2tZLnN0YXJ0KCk7CisgICAgICAgICAgICBQcm9wZXJ0eUFuaW1hdG9yIHNuYXBCYWNrWCA9IG5ldyBQcm9wZXJ0eUFuaW1hdG9yKGR1cmF0aW9uLCBhbmltYXRpb25TbGlkZXIsCisgICAgICAgICAgICAgICAgICAgICJYUHJvZ3Jlc3MiLCBtU3RhY2tTbGlkZXIuZ2V0WFByb2dyZXNzKCksIDApOworICAgICAgICAgICAgc25hcEJhY2tYLnNldEludGVycG9sYXRvcihuZXcgTGluZWFySW50ZXJwb2xhdG9yKCkpOworICAgICAgICAgICAgc25hcEJhY2tYLnN0YXJ0KCk7CisgICAgICAgIH0KKworICAgICAgICBtQWN0aXZlUG9pbnRlcklkID0gSU5WQUxJRF9QT0lOVEVSOworICAgICAgICBtU3dpcGVHZXN0dXJlVHlwZSA9IEdFU1RVUkVfTk9ORTsKKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIFN0YWNrU2xpZGVyIHsKKyAgICAgICAgVmlldyBtVmlldzsKKyAgICAgICAgZmxvYXQgbVlQcm9ncmVzczsKKyAgICAgICAgZmxvYXQgbVhQcm9ncmVzczsKKworICAgICAgICBzdGF0aWMgZmluYWwgaW50IE5PUk1BTF9NT0RFID0gMDsKKyAgICAgICAgc3RhdGljIGZpbmFsIGludCBCRUdJTk5JTkdfT0ZfU1RBQ0tfTU9ERSA9IDE7CisgICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgRU5EX09GX1NUQUNLX01PREUgPSAyOworCisgICAgICAgIGludCBtTW9kZSA9IE5PUk1BTF9NT0RFOworCisgICAgICAgIHB1YmxpYyBTdGFja1NsaWRlcigpIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdGFja1NsaWRlcihTdGFja1NsaWRlciBjb3B5KSB7CisgICAgICAgICAgICBtVmlldyA9IGNvcHkubVZpZXc7CisgICAgICAgICAgICBtWVByb2dyZXNzID0gY29weS5tWVByb2dyZXNzOworICAgICAgICAgICAgbVhQcm9ncmVzcyA9IGNvcHkubVhQcm9ncmVzczsKKyAgICAgICAgICAgIG1Nb2RlID0gY29weS5tTW9kZTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgZmxvYXQgY3ViaWMoZmxvYXQgcikgeworICAgICAgICAgICAgcmV0dXJuIChmbG9hdCkgKE1hdGgucG93KDIqci0xLCAzKSArIDEpLzIuMGY7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGZsb2F0IGhpZ2hsaWdodEFscGhhSW50ZXJwb2xhdG9yKGZsb2F0IHIpIHsKKyAgICAgICAgICAgIGZsb2F0IHBpdm90ID0gMC40ZjsKKyAgICAgICAgICAgIGlmIChyIDwgcGl2b3QpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gMC44NWYqY3ViaWMoci9waXZvdCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiAwLjg1ZipjdWJpYygxIC0gKHItcGl2b3QpLygxLXBpdm90KSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGZsb2F0IHZpZXdBbHBoYUludGVycG9sYXRvcihmbG9hdCByKSB7CisgICAgICAgICAgICBmbG9hdCBwaXZvdCA9IDAuM2Y7CisgICAgICAgICAgICBpZiAociA+IHBpdm90KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIChyIC0gcGl2b3QpLygxIC0gcGl2b3QpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgZmxvYXQgcm90YXRpb25JbnRlcnBvbGF0b3IoZmxvYXQgcikgeworICAgICAgICAgICAgZmxvYXQgcGl2b3QgPSAwLjJmOworICAgICAgICAgICAgaWYgKHIgPCBwaXZvdCkgeworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKHItcGl2b3QpLygxLXBpdm90KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgc2V0VmlldyhWaWV3IHYpIHsKKyAgICAgICAgICAgIG1WaWV3ID0gdjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFlQcm9ncmVzcyhmbG9hdCByKSB7CisgICAgICAgICAgICAvLyBlbmZvcmNlIHIgYmV0d2VlbiAwIGFuZCAxCisgICAgICAgICAgICByID0gTWF0aC5taW4oMS4wZiwgcik7CisgICAgICAgICAgICByID0gTWF0aC5tYXgoMCwgcik7CisKKyAgICAgICAgICAgIG1ZUHJvZ3Jlc3MgPSByOworICAgICAgICAgICAgZmluYWwgTGF5b3V0UGFyYW1zIHZpZXdMcCA9IChMYXlvdXRQYXJhbXMpIG1WaWV3LmdldExheW91dFBhcmFtcygpOworICAgICAgICAgICAgZmluYWwgTGF5b3V0UGFyYW1zIGhpZ2hsaWdodExwID0gKExheW91dFBhcmFtcykgbUhpZ2hsaWdodC5nZXRMYXlvdXRQYXJhbXMoKTsKKworICAgICAgICAgICAgc3dpdGNoIChtTW9kZSkgeworICAgICAgICAgICAgICAgIGNhc2UgTk9STUFMX01PREU6CisgICAgICAgICAgICAgICAgICAgIHZpZXdMcC5zZXRWZXJ0aWNhbE9mZnNldChNYXRoLnJvdW5kKC1yKm1WaWV3SGVpZ2h0KSk7CisgICAgICAgICAgICAgICAgICAgIGhpZ2hsaWdodExwLnNldFZlcnRpY2FsT2Zmc2V0KE1hdGgucm91bmQoLXIqbVZpZXdIZWlnaHQpKTsKKyAgICAgICAgICAgICAgICAgICAgbUhpZ2hsaWdodC5zZXRBbHBoYShoaWdobGlnaHRBbHBoYUludGVycG9sYXRvcihyKSk7CisKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgYWxwaGEgPSB2aWV3QWxwaGFJbnRlcnBvbGF0b3IoMS1yKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBXZSBtYWtlIHN1cmUgdGhhdCB2aWV3cyB3aGljaCBjYW4ndCBiZSBzZWVuIChoYXZlIDAgYWxwaGEpIGFyZSBhbHNvIGludmlzaWJsZQorICAgICAgICAgICAgICAgICAgICAvLyBzbyB0aGF0IHRoZXkgZG9uJ3QgaW50ZXJmZXJlIHdpdGggY2xpY2sgZXZlbnRzLgorICAgICAgICAgICAgICAgICAgICBpZiAobVZpZXcuZ2V0QWxwaGEoKSA9PSAwICYmIGFscGhhICE9IDAgJiYgbVZpZXcuZ2V0VmlzaWJpbGl0eSgpICE9IFZJU0lCTEUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1WaWV3LnNldFZpc2liaWxpdHkoVklTSUJMRSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYWxwaGEgPT0gMCAmJiBtVmlldy5nZXRBbHBoYSgpICE9IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBtVmlldy5nZXRWaXNpYmlsaXR5KCkgPT0gVklTSUJMRSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbVZpZXcuc2V0VmlzaWJpbGl0eShJTlZJU0lCTEUpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgbVZpZXcuc2V0QWxwaGEoYWxwaGEpOworICAgICAgICAgICAgICAgICAgICBtVmlldy5zZXRSb3RhdGlvblgoOTAuMGYqcm90YXRpb25JbnRlcnBvbGF0b3IocikpOworICAgICAgICAgICAgICAgICAgICBtSGlnaGxpZ2h0LnNldFJvdGF0aW9uWCg5MC4wZipyb3RhdGlvbkludGVycG9sYXRvcihyKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQkVHSU5OSU5HX09GX1NUQUNLX01PREU6CisgICAgICAgICAgICAgICAgICAgIHIgPSByKjAuMmY7CisgICAgICAgICAgICAgICAgICAgIHZpZXdMcC5zZXRWZXJ0aWNhbE9mZnNldChNYXRoLnJvdW5kKC1yKm1WaWV3SGVpZ2h0KSk7CisgICAgICAgICAgICAgICAgICAgIGhpZ2hsaWdodExwLnNldFZlcnRpY2FsT2Zmc2V0KE1hdGgucm91bmQoLXIqbVZpZXdIZWlnaHQpKTsKKyAgICAgICAgICAgICAgICAgICAgbUhpZ2hsaWdodC5zZXRBbHBoYShoaWdobGlnaHRBbHBoYUludGVycG9sYXRvcihyKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgRU5EX09GX1NUQUNLX01PREU6CisgICAgICAgICAgICAgICAgICAgIHIgPSAoMS1yKSowLjJmOworICAgICAgICAgICAgICAgICAgICB2aWV3THAuc2V0VmVydGljYWxPZmZzZXQoTWF0aC5yb3VuZChyKm1WaWV3SGVpZ2h0KSk7CisgICAgICAgICAgICAgICAgICAgIGhpZ2hsaWdodExwLnNldFZlcnRpY2FsT2Zmc2V0KE1hdGgucm91bmQociptVmlld0hlaWdodCkpOworICAgICAgICAgICAgICAgICAgICBtSGlnaGxpZ2h0LnNldEFscGhhKGhpZ2hsaWdodEFscGhhSW50ZXJwb2xhdG9yKHIpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRYUHJvZ3Jlc3MoZmxvYXQgcikgeworICAgICAgICAgICAgLy8gZW5mb3JjZSByIGJldHdlZW4gMCBhbmQgMQorICAgICAgICAgICAgciA9IE1hdGgubWluKDIuMGYsIHIpOworICAgICAgICAgICAgciA9IE1hdGgubWF4KC0yLjBmLCByKTsKKworICAgICAgICAgICAgbVhQcm9ncmVzcyA9IHI7CisKKyAgICAgICAgICAgIGZpbmFsIExheW91dFBhcmFtcyB2aWV3THAgPSAoTGF5b3V0UGFyYW1zKSBtVmlldy5nZXRMYXlvdXRQYXJhbXMoKTsKKyAgICAgICAgICAgIGZpbmFsIExheW91dFBhcmFtcyBoaWdobGlnaHRMcCA9IChMYXlvdXRQYXJhbXMpIG1IaWdobGlnaHQuZ2V0TGF5b3V0UGFyYW1zKCk7CisKKyAgICAgICAgICAgIHIgKj0gMC4yZjsKKyAgICAgICAgICAgIHZpZXdMcC5zZXRIb3Jpem9udGFsT2Zmc2V0KE1hdGgucm91bmQociptVmlld0hlaWdodCkpOworICAgICAgICAgICAgaGlnaGxpZ2h0THAuc2V0SG9yaXpvbnRhbE9mZnNldChNYXRoLnJvdW5kKHIqbVZpZXdIZWlnaHQpKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgc2V0TW9kZShpbnQgbW9kZSkgeworICAgICAgICAgICAgbU1vZGUgPSBtb2RlOworICAgICAgICB9CisKKyAgICAgICAgZmxvYXQgZ2V0RHVyYXRpb25Gb3JOZXV0cmFsUG9zaXRpb24oKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0RHVyYXRpb24oZmFsc2UpOworICAgICAgICB9CisKKyAgICAgICAgZmxvYXQgZ2V0RHVyYXRpb25Gb3JPZmZzY3JlZW5Qb3NpdGlvbigpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXREdXJhdGlvbihtTW9kZSA9PSBFTkRfT0ZfU1RBQ0tfTU9ERSA/IGZhbHNlIDogdHJ1ZSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGZsb2F0IGdldER1cmF0aW9uKGJvb2xlYW4gaW52ZXJ0KSB7CisgICAgICAgICAgICBpZiAobVZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZpbmFsIExheW91dFBhcmFtcyB2aWV3THAgPSAoTGF5b3V0UGFyYW1zKSBtVmlldy5nZXRMYXlvdXRQYXJhbXMoKTsKKworICAgICAgICAgICAgICAgIGZsb2F0IGQgPSAoZmxvYXQpIE1hdGguc3FydChNYXRoLnBvdyh2aWV3THAuaG9yaXpvbnRhbE9mZnNldCwyKSArCisgICAgICAgICAgICAgICAgICAgICAgICBNYXRoLnBvdyh2aWV3THAudmVydGljYWxPZmZzZXQsMikpOworICAgICAgICAgICAgICAgIGZsb2F0IG1heGQgPSAoZmxvYXQpIE1hdGguc3FydChNYXRoLnBvdyhtVmlld0hlaWdodCwgMikgKworICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5wb3coMC40ZiptVmlld0hlaWdodCwgMikpOworICAgICAgICAgICAgICAgIHJldHVybiBpbnZlcnQgPyAoMS1kL21heGQpIDogZC9tYXhkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICBmbG9hdCBnZXRZUHJvZ3Jlc3MoKSB7CisgICAgICAgICAgICByZXR1cm4gbVlQcm9ncmVzczsKKyAgICAgICAgfQorCisgICAgICAgIGZsb2F0IGdldFhQcm9ncmVzcygpIHsKKyAgICAgICAgICAgIHJldHVybiBtWFByb2dyZXNzOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblJlbW90ZUFkYXB0ZXJDb25uZWN0ZWQoKSB7CisgICAgICAgIHN1cGVyLm9uUmVtb3RlQWRhcHRlckNvbm5lY3RlZCgpOworICAgICAgICBzZXREaXNwbGF5ZWRDaGlsZChtV2hpY2hDaGlsZCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGFpbnQgc0hvbG9ncmFwaGljUGFpbnQgPSBuZXcgUGFpbnQoKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYWludCBzRXJhc2VQYWludCA9IG5ldyBQYWludCgpOworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gc1BhaW50c0luaXRpYWxpemVkID0gZmFsc2U7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgU1RST0tFX1dJRFRIID0gMy4wZjsKKworICAgIHN0YXRpYyB2b2lkIGluaXRpYWxpemVQYWludHMoKSB7CisgICAgICAgIHNIb2xvZ3JhcGhpY1BhaW50LnNldENvbG9yKDB4ZmY2Njk5ZmYpOworICAgICAgICBzSG9sb2dyYXBoaWNQYWludC5zZXRGaWx0ZXJCaXRtYXAodHJ1ZSk7CisgICAgICAgIHNFcmFzZVBhaW50LnNldFhmZXJtb2RlKG5ldyBQb3J0ZXJEdWZmWGZlcm1vZGUoUG9ydGVyRHVmZi5Nb2RlLkRTVF9PVVQpKTsKKyAgICAgICAgc0VyYXNlUGFpbnQuc2V0RmlsdGVyQml0bWFwKHRydWUpOworICAgICAgICBzUGFpbnRzSW5pdGlhbGl6ZWQgPSB0cnVlOworICAgIH0KKworICAgIHN0YXRpYyBCaXRtYXAgY3JlYXRlT3V0bGluZShWaWV3IHYpIHsKKyAgICAgICAgaWYgKHYuZ2V0TWVhc3VyZWRXaWR0aCgpID09IDAgfHwgdi5nZXRNZWFzdXJlZEhlaWdodCgpID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgQml0bWFwIGJpdG1hcCA9IEJpdG1hcC5jcmVhdGVCaXRtYXAodi5nZXRNZWFzdXJlZFdpZHRoKCksIHYuZ2V0TWVhc3VyZWRIZWlnaHQoKSwKKyAgICAgICAgICAgICAgICBCaXRtYXAuQ29uZmlnLkFSR0JfODg4OCk7CisgICAgICAgIENhbnZhcyBjYW52YXMgPSBuZXcgQ2FudmFzKGJpdG1hcCk7CisKKyAgICAgICAgZmxvYXQgcm90YXRpb25YID0gdi5nZXRSb3RhdGlvblgoKTsKKyAgICAgICAgdi5zZXRSb3RhdGlvblgoMCk7CisgICAgICAgIGNhbnZhcy5jb25jYXQodi5nZXRNYXRyaXgoKSk7CisgICAgICAgIHYuZHJhdyhjYW52YXMpOworICAgICAgICB2LnNldFJvdGF0aW9uWChyb3RhdGlvblgpOworCisgICAgICAgIEJpdG1hcCBvdXRsaW5lQml0bWFwID0gQml0bWFwLmNyZWF0ZUJpdG1hcCh2LmdldE1lYXN1cmVkV2lkdGgoKSwgdi5nZXRNZWFzdXJlZEhlaWdodCgpLAorICAgICAgICAgICAgICAgIEJpdG1hcC5Db25maWcuQVJHQl84ODg4KTsKKyAgICAgICAgQ2FudmFzIG91dGxpbmVDYW52YXMgPSBuZXcgQ2FudmFzKG91dGxpbmVCaXRtYXApOworICAgICAgICBkcmF3T3V0bGluZShvdXRsaW5lQ2FudmFzLCBiaXRtYXApOworICAgICAgICBiaXRtYXAucmVjeWNsZSgpOworICAgICAgICByZXR1cm4gb3V0bGluZUJpdG1hcDsKKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCBkcmF3T3V0bGluZShDYW52YXMgZGVzdCwgQml0bWFwIHNyYykgeworICAgICAgICBkZXN0LmRyYXdDb2xvcigwLCBQb3J0ZXJEdWZmLk1vZGUuQ0xFQVIpOworCisgICAgICAgIEJpdG1hcCBtYXNrID0gc3JjLmV4dHJhY3RBbHBoYSgpOworICAgICAgICBNYXRyaXggaWQgPSBuZXcgTWF0cml4KCk7CisKKyAgICAgICAgTWF0cml4IG0gPSBuZXcgTWF0cml4KCk7CisgICAgICAgIGZsb2F0IHhTY2FsZSA9IFNUUk9LRV9XSURUSCoyLyhzcmMuZ2V0V2lkdGgoKSk7CisgICAgICAgIGZsb2F0IHlTY2FsZSA9IFNUUk9LRV9XSURUSCoyLyhzcmMuZ2V0SGVpZ2h0KCkpOworICAgICAgICBtLnByZVNjYWxlKDEreFNjYWxlLCAxK3lTY2FsZSwgc3JjLmdldFdpZHRoKCkvMiwgc3JjLmdldEhlaWdodCgpLzIpOworICAgICAgICBkZXN0LmRyYXdCaXRtYXAobWFzaywgbSwgc0hvbG9ncmFwaGljUGFpbnQpOworCisgICAgICAgIGRlc3QuZHJhd0JpdG1hcChzcmMsIGlkLCBzRXJhc2VQYWludCk7CisgICAgICAgIG1hc2sucmVjeWNsZSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9UZXh0Vmlldy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1RleHRWaWV3LmphdmEKaW5kZXggZDlkNTI1OS4uZWM1NGU5ZCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1RleHRWaWV3LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1RleHRWaWV3LmphdmEKQEAgLTIxLDggKzIxLDkgQEAKIAogaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXJFeGNlcHRpb247CiAKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ2xpcGJvYXJkTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ2xpcHBlZERhdGE7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db2xvclN0YXRlTGlzdDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKQEAgLTM1LDYgKzM2LDcgQEAKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3RGOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuVHlwZWZhY2U7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwogaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKQEAgLTQzLDcgKzQ1LDYgQEAKIGltcG9ydCBhbmRyb2lkLm9zLlJlc3VsdFJlY2VpdmVyOwogaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LkJvcmluZ0xheW91dDsKLWltcG9ydCBhbmRyb2lkLnRleHQuQ2xpcGJvYXJkTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLnRleHQuRHluYW1pY0xheW91dDsKIGltcG9ydCBhbmRyb2lkLnRleHQuRWRpdGFibGU7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LkdldENoYXJzOwpAQCAtODQsMTAgKzg1LDEzIEBACiBpbXBvcnQgYW5kcm9pZC51dGlsLkZsb2F0TWF0aDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGFuZHJvaWQudXRpbC5UeXBlZFZhbHVlOworaW1wb3J0IGFuZHJvaWQudmlldy5BY3Rpb25Nb2RlOwogaW1wb3J0IGFuZHJvaWQudmlldy5Db250ZXh0TWVudTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuR3Jhdml0eTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuSGFwdGljRmVlZGJhY2tDb25zdGFudHM7CiBpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OwogaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUl0ZW07CiBpbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwpAQCAtMTkxLDggKzE5NSw5IEBACiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIlRleHRWaWV3IjsKICAgICBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVR19FWFRSQUNUID0gZmFsc2U7CiAgICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IFBSSU9SSVRZID0gMTAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQUklPUklUWSA9IDEwMDsKIAorICAgIHByaXZhdGUgaW50IG1DdXJyZW50QWxwaGEgPSAyNTU7ICAgIAogICAgIHByaXZhdGUgQ29sb3JTdGF0ZUxpc3QgbVRleHRDb2xvcjsKICAgICBwcml2YXRlIGludCBtQ3VyVGV4dENvbG9yOwogICAgIHByaXZhdGUgQ29sb3JTdGF0ZUxpc3QgbUhpbnRUZXh0Q29sb3I7CkBAIC0yNzk1LDYgKzI4MDAsMTQgQEAKICAgICAgICAgICAgIGMuZHJhd1RleHQobUNoYXJzLCBzdGFydCArIG1TdGFydCwgZW5kIC0gc3RhcnQsIHgsIHksIHApOwogICAgICAgICB9CiAKKyAgICAgICAgcHVibGljIHZvaWQgZHJhd1RleHRSdW4oQ2FudmFzIGMsIGludCBzdGFydCwgaW50IGVuZCwKKyAgICAgICAgICAgICAgICBpbnQgY29udGV4dFN0YXJ0LCBpbnQgY29udGV4dEVuZCwgZmxvYXQgeCwgZmxvYXQgeSwgaW50IGZsYWdzLCBQYWludCBwKSB7CisgICAgICAgICAgICBpbnQgY291bnQgPSBlbmQgLSBzdGFydDsKKyAgICAgICAgICAgIGludCBjb250ZXh0Q291bnQgPSBjb250ZXh0RW5kIC0gY29udGV4dFN0YXJ0OworICAgICAgICAgICAgYy5kcmF3VGV4dFJ1bihtQ2hhcnMsIHN0YXJ0ICsgbVN0YXJ0LCBjb3VudCwgY29udGV4dFN0YXJ0ICsgbVN0YXJ0LAorICAgICAgICAgICAgICAgICAgICBjb250ZXh0Q291bnQsIHgsIHksIGZsYWdzLCBwKTsKKyAgICAgICAgfQorCiAgICAgICAgIHB1YmxpYyBmbG9hdCBtZWFzdXJlVGV4dChpbnQgc3RhcnQsIGludCBlbmQsIFBhaW50IHApIHsKICAgICAgICAgICAgIHJldHVybiBwLm1lYXN1cmVUZXh0KG1DaGFycywgc3RhcnQgKyBtU3RhcnQsIGVuZCAtIHN0YXJ0KTsKICAgICAgICAgfQpAQCAtMjgwMiw2ICsyODE1LDIzIEBACiAgICAgICAgIHB1YmxpYyBpbnQgZ2V0VGV4dFdpZHRocyhpbnQgc3RhcnQsIGludCBlbmQsIGZsb2F0W10gd2lkdGhzLCBQYWludCBwKSB7CiAgICAgICAgICAgICByZXR1cm4gcC5nZXRUZXh0V2lkdGhzKG1DaGFycywgc3RhcnQgKyBtU3RhcnQsIGVuZCAtIHN0YXJ0LCB3aWR0aHMpOwogICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGZsb2F0IGdldFRleHRSdW5BZHZhbmNlcyhpbnQgc3RhcnQsIGludCBlbmQsIGludCBjb250ZXh0U3RhcnQsCisgICAgICAgICAgICAgICAgaW50IGNvbnRleHRFbmQsIGludCBmbGFncywgZmxvYXRbXSBhZHZhbmNlcywgaW50IGFkdmFuY2VzSW5kZXgsCisgICAgICAgICAgICAgICAgUGFpbnQgcCkgeworICAgICAgICAgICAgaW50IGNvdW50ID0gZW5kIC0gc3RhcnQ7CisgICAgICAgICAgICBpbnQgY29udGV4dENvdW50ID0gY29udGV4dEVuZCAtIGNvbnRleHRTdGFydDsKKyAgICAgICAgICAgIHJldHVybiBwLmdldFRleHRSdW5BZHZhbmNlcyhtQ2hhcnMsIHN0YXJ0ICsgbVN0YXJ0LCBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dFN0YXJ0ICsgbVN0YXJ0LCBjb250ZXh0Q291bnQsIGZsYWdzLCBhZHZhbmNlcywKKyAgICAgICAgICAgICAgICAgICAgYWR2YW5jZXNJbmRleCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGdldFRleHRSdW5DdXJzb3IoaW50IGNvbnRleHRTdGFydCwgaW50IGNvbnRleHRFbmQsIGludCBmbGFncywKKyAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0LCBpbnQgY3Vyc29yT3B0LCBQYWludCBwKSB7CisgICAgICAgICAgICBpbnQgY29udGV4dENvdW50ID0gY29udGV4dEVuZCAtIGNvbnRleHRTdGFydDsKKyAgICAgICAgICAgIHJldHVybiBwLmdldFRleHRSdW5DdXJzb3IobUNoYXJzLCBjb250ZXh0U3RhcnQgKyBtU3RhcnQsCisgICAgICAgICAgICAgICAgICAgIGNvbnRleHRDb3VudCwgZmxhZ3MsIG9mZnNldCArIG1TdGFydCwgY3Vyc29yT3B0KTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgpAQCAtMzcwNSw5ICszNzM1LDkgQEAKICAgICAgICAgICAgIGNoYW5nZWQgPSBicmluZ1RleHRJbnRvVmlldygpOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKG1TaG91bGRTdGFydFRleHRTZWxlY3Rpb25Nb2RlKSB7Ci0gICAgICAgICAgICBzdGFydFRleHRTZWxlY3Rpb25Nb2RlKCk7Ci0gICAgICAgICAgICBtU2hvdWxkU3RhcnRUZXh0U2VsZWN0aW9uTW9kZSA9IGZhbHNlOworICAgICAgICBpZiAobVNob3VsZFN0YXJ0U2VsZWN0aW9uQWN0aW9uTW9kZSkgeworICAgICAgICAgICAgc3RhcnRTZWxlY3Rpb25BY3Rpb25Nb2RlKCk7CisgICAgICAgICAgICBtU2hvdWxkU3RhcnRTZWxlY3Rpb25BY3Rpb25Nb2RlID0gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgbVByZURyYXdTdGF0ZSA9IFBSRURSQVdfRE9ORTsKICAgICAgICAgcmV0dXJuICFjaGFuZ2VkOwpAQCAtMzgyOCw2ICszODU4LDIyIEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gb25TZXRBbHBoYShpbnQgYWxwaGEpIHsKKyAgICAgICAgaWYgKG1Nb3ZlbWVudCA9PSBudWxsICYmIGdldEJhY2tncm91bmQoKSA9PSBudWxsKSB7CisgICAgICAgICAgICBtQ3VycmVudEFscGhhID0gYWxwaGE7CisgICAgICAgICAgICBmaW5hbCBEcmF3YWJsZXMgZHIgPSBtRHJhd2FibGVzOworICAgICAgICAgICAgaWYgKGRyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAoZHIubURyYXdhYmxlTGVmdCAhPSBudWxsKSBkci5tRHJhd2FibGVMZWZ0LnNldEFscGhhKGFscGhhKTsKKyAgICAgICAgICAgICAgICBpZiAoZHIubURyYXdhYmxlVG9wICE9IG51bGwpIGRyLm1EcmF3YWJsZVRvcC5zZXRBbHBoYShhbHBoYSk7CisgICAgICAgICAgICAgICAgaWYgKGRyLm1EcmF3YWJsZVJpZ2h0ICE9IG51bGwpIGRyLm1EcmF3YWJsZVJpZ2h0LnNldEFscGhhKGFscGhhKTsKKyAgICAgICAgICAgICAgICBpZiAoZHIubURyYXdhYmxlQm90dG9tICE9IG51bGwpIGRyLm1EcmF3YWJsZUJvdHRvbS5zZXRBbHBoYShhbHBoYSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgb25EcmF3KENhbnZhcyBjYW52YXMpIHsKICAgICAgICAgcmVzdGFydE1hcnF1ZWVJZk5lZWRlZCgpOwogCkBAIC0zOTI0LDYgKzM5NzAsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgbVRleHRQYWludC5zZXRDb2xvcihjb2xvcik7CisgICAgICAgIG1UZXh0UGFpbnQuc2V0QWxwaGEobUN1cnJlbnRBbHBoYSk7CiAgICAgICAgIG1UZXh0UGFpbnQuZHJhd2FibGVTdGF0ZSA9IGdldERyYXdhYmxlU3RhdGUoKTsKIAogICAgICAgICBjYW52YXMuc2F2ZSgpOwpAQCAtNDM4Miw3ICs0NDI5LDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIGhpZGVDb250cm9sbGVycygpOwotCisgICAgICAgIAogICAgICAgICBzd2l0Y2ggKGtleUNvZGUpIHsKICAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0NFTlRFUjoKICAgICAgICAgICAgICAgICAvKgpAQCAtNDc5NCw3ICs0ODQxLDcgQEAKICAgICAgICAgICAgICAgICBtYWtlQmxpbmsoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICBjaGVja0ZvclJlc2l6ZSgpOwogICAgIH0KICAgICAKQEAgLTQ4ODUsNiArNDkzMiw4IEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgICAgIGNhc2UgR3Jhdml0eS5SSUdIVDoKKyAgICAgICAgICAgICAgICAvLyBOb3RlLCBMYXlvdXQgcmVzb2x2ZXMgQUxJR05fT1BQT1NJVEUgdG8gbGVmdCBvcgorICAgICAgICAgICAgICAgIC8vIHJpZ2h0IGJhc2VkIG9uIHRoZSBwYXJhZ3JhcGggZGlyZWN0aW9uLgogICAgICAgICAgICAgICAgIGFsaWdubWVudCA9IExheW91dC5BbGlnbm1lbnQuQUxJR05fT1BQT1NJVEU7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAKQEAgLTU3MDksMTEgKzU3NTgsMTUgQEAKICAgICAgICAgZmluYWwgaW50IGxlZnRDaGFyID0gbUxheW91dC5nZXRPZmZzZXRGb3JIb3Jpem9udGFsKGxpbmUsIGhzKTsKICAgICAgICAgZmluYWwgaW50IHJpZ2h0Q2hhciA9IG1MYXlvdXQuZ2V0T2Zmc2V0Rm9ySG9yaXpvbnRhbChsaW5lLCBoc3BhY2UraHMpOwogICAgICAgICAKKyAgICAgICAgLy8gbGluZSBtaWdodCBjb250YWluIGJpZGlyZWN0aW9uYWwgdGV4dAorICAgICAgICBmaW5hbCBpbnQgbG93Q2hhciA9IGxlZnRDaGFyIDwgcmlnaHRDaGFyID8gbGVmdENoYXIgOiByaWdodENoYXI7CisgICAgICAgIGZpbmFsIGludCBoaWdoQ2hhciA9IGxlZnRDaGFyID4gcmlnaHRDaGFyID8gbGVmdENoYXIgOiByaWdodENoYXI7CisKICAgICAgICAgaW50IG5ld1N0YXJ0ID0gc3RhcnQ7Ci0gICAgICAgIGlmIChuZXdTdGFydCA8IGxlZnRDaGFyKSB7Ci0gICAgICAgICAgICBuZXdTdGFydCA9IGxlZnRDaGFyOwotICAgICAgICB9IGVsc2UgaWYgKG5ld1N0YXJ0ID4gcmlnaHRDaGFyKSB7Ci0gICAgICAgICAgICBuZXdTdGFydCA9IHJpZ2h0Q2hhcjsKKyAgICAgICAgaWYgKG5ld1N0YXJ0IDwgbG93Q2hhcikgeworICAgICAgICAgICAgbmV3U3RhcnQgPSBsb3dDaGFyOworICAgICAgICB9IGVsc2UgaWYgKG5ld1N0YXJ0ID4gaGlnaENoYXIpIHsKKyAgICAgICAgICAgIG5ld1N0YXJ0ID0gaGlnaENoYXI7CiAgICAgICAgIH0KICAgICAgICAgCiAgICAgICAgIGlmIChuZXdTdGFydCAhPSBzdGFydCkgewpAQCAtNjM4MSw2ICs2NDM0LDExIEBACiAgICAgICAgICAgICAgICAgc2VuZEFjY2Vzc2liaWxpdHlFdmVudFR5cGVWaWV3VGV4dENoYW5nZWQobUJlZm9yZVRleHQsIHN0YXJ0LCBiZWZvcmUsIGFmdGVyKTsKICAgICAgICAgICAgICAgICBtQmVmb3JlVGV4dCA9IG51bGw7CiAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFRPRE8uIFRoZSBjdXJzb3IgY29udHJvbGxlciBzaG91bGQgaGlkZSBhcyBzb29uIGFzIHRleHQgaXMgdHlwZWQuCisgICAgICAgICAgICAvLyBCdXQgdGhpcyBtZXRob2QgaXMgYWxzbyB1c2VkIGZvciBjb3NtZXRpYyBjaGFuZ2VzICh1bmRlcmxpbmUgY3VycmVudCB3b3JkIHdoZW4KKyAgICAgICAgICAgIC8vIHNwZWxsIGNvcnJlY3Rpb25zIGFyZSBkaXNwbGF5ZWQuIFRoZXJlIGlzIGN1cnJlbnRseSBubyB3YXkgdG8gbWFrZSB0aGUgZGlmZmVyZW5jZQorICAgICAgICAgICAgLy8gYmV0d2VlbiB0aGVzZSBjb3NtZXRpYyBjaGFuZ2VzIGFuZCBhY3R1YWwgdGV4dCBtb2RpZmljYXRpb25zLgogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIHZvaWQgYWZ0ZXJUZXh0Q2hhbmdlZChFZGl0YWJsZSBidWZmZXIpIHsKQEAgLTY1MjMsNyArNjU4MSw3IEBACiAgICAgICAgICAgICAvLyBuZWVkZWQgYnkgdGhlIGN1cnNvciBjb250cm9sbGVyLiBMYXlvdXQgY3JlYXRpb24gaXMgZGVmZXJyZWQgdXAgdG8gZHJhd2luZy4gVGhlCiAgICAgICAgICAgICAvLyBzZWxlY3Rpb24gYWN0aW9uIG1vZGUgd2lsbCBiZSBzdGFydGVkIGluIG9uUHJlRHJhdygpLgogICAgICAgICAgICAgaWYgKHNlbFN0YXJ0ICE9IHNlbEVuZCkgewotICAgICAgICAgICAgICAgIG1TaG91bGRTdGFydFRleHRTZWxlY3Rpb25Nb2RlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBtU2hvdWxkU3RhcnRTZWxlY3Rpb25BY3Rpb25Nb2RlID0gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGlmIChtRXJyb3IgIT0gbnVsbCkgewpAQCAtNjUzMyw3ICs2NTkxLDcgQEAKICAgICAgICAgICAgIG9uRW5kQmF0Y2hFZGl0KCk7CiAKICAgICAgICAgICAgIGhpZGVJbnNlcnRpb25Qb2ludEN1cnNvckNvbnRyb2xsZXIoKTsKLSAgICAgICAgICAgIHRlcm1pbmF0ZVRleHRTZWxlY3Rpb25Nb2RlKCk7CisgICAgICAgICAgICB0ZXJtaW5hdGVTZWxlY3Rpb25BY3Rpb25Nb2RlKCk7CiAgICAgICAgIH0KIAogICAgICAgICBzdGFydFN0b3BNYXJxdWVlKGZvY3VzZWQpOwpAQCAtNjYwMiw3ICs2NjYwLDcgQEAKICAgICBjbGFzcyBDb21taXRTZWxlY3Rpb25SZWNlaXZlciBleHRlbmRzIFJlc3VsdFJlY2VpdmVyIHsKICAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbVByZXZTdGFydCwgbVByZXZFbmQ7CiAgICAgICAgIHByaXZhdGUgZmluYWwgaW50IG1OZXdTdGFydCwgbU5ld0VuZDsKLSAgICAgICAgCisKICAgICAgICAgcHVibGljIENvbW1pdFNlbGVjdGlvblJlY2VpdmVyKGludCBtUHJldlN0YXJ0LCBpbnQgbVByZXZFbmQsIGludCBtTmV3U3RhcnQsIGludCBtTmV3RW5kKSB7CiAgICAgICAgICAgICBzdXBlcihnZXRIYW5kbGVyKCkpOwogICAgICAgICAgICAgdGhpcy5tUHJldlN0YXJ0ID0gbVByZXZTdGFydDsKQEAgLTY2MTAsNyArNjY2OCw3IEBACiAgICAgICAgICAgICB0aGlzLm1OZXdTdGFydCA9IG1OZXdTdGFydDsKICAgICAgICAgICAgIHRoaXMubU5ld0VuZCA9IG1OZXdFbmQ7CiAgICAgICAgIH0KLSAgICAgICAgCisKICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uUmVjZWl2ZVJlc3VsdChpbnQgcmVzdWx0Q29kZSwgQnVuZGxlIHJlc3VsdERhdGEpIHsKICAgICAgICAgICAgIGludCBzdGFydCA9IG1OZXdTdGFydDsKQEAgLTY2MjksNyArNjY4Nyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUYXBwaW5nIG91dHNpZGUgc3RvcHMgc2VsZWN0aW9uIG1vZGUsIGlmIGFueQotICAgICAgICAgICAgICAgICAgICAgICAgc3RvcFRleHRTZWxlY3Rpb25Nb2RlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzdG9wU2VsZWN0aW9uQWN0aW9uTW9kZSgpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogCkBAIC02NjcxLDExICs2NzI5LDEyIEBACiAgICAgICAgICAgICByZXR1cm4gc3VwZXJSZXN1bHQ7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoKG1Nb3ZlbWVudCAhPSBudWxsIHx8IG9uQ2hlY2tJc1RleHRFZGl0b3IoKSkgJiYgbVRleHQgaW5zdGFuY2VvZiBTcGFubmFibGUgJiYgbUxheW91dCAhPSBudWxsKSB7CisgICAgICAgIGlmICgobU1vdmVtZW50ICE9IG51bGwgfHwgb25DaGVja0lzVGV4dEVkaXRvcigpKSAmJgorICAgICAgICAgICAgICAgIG1UZXh0IGluc3RhbmNlb2YgU3Bhbm5hYmxlICYmIG1MYXlvdXQgIT0gbnVsbCkgewogICAgICAgICAgICAgCiAgICAgICAgICAgICBpbnQgb2xkU2VsU3RhcnQgPSBnZXRTZWxlY3Rpb25TdGFydCgpOwogICAgICAgICAgICAgaW50IG9sZFNlbEVuZCA9IGdldFNlbGVjdGlvbkVuZCgpOwotICAgICAgICAgICAgCisKICAgICAgICAgICAgIGlmIChtSW5zZXJ0aW9uUG9pbnRDdXJzb3JDb250cm9sbGVyICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBtSW5zZXJ0aW9uUG9pbnRDdXJzb3JDb250cm9sbGVyLm9uVG91Y2hFdmVudChldmVudCk7CiAgICAgICAgICAgICB9CkBAIC02Njg0LDcgKzY3NDMsNyBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBib29sZWFuIGhhbmRsZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICBpZiAobU1vdmVtZW50ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBoYW5kbGVkIHw9IG1Nb3ZlbWVudC5vblRvdWNoRXZlbnQodGhpcywgKFNwYW5uYWJsZSkgbVRleHQsIGV2ZW50KTsKICAgICAgICAgICAgIH0KQEAgLTY2OTMsMTcgKzY3NTIsMTcgQEAKICAgICAgICAgICAgICAgICBpZiAoYWN0aW9uID09IE1vdGlvbkV2ZW50LkFDVElPTl9VUCAmJiBpc0ZvY3VzZWQoKSAmJiAhbVNjcm9sbGVkKSB7CiAgICAgICAgICAgICAgICAgICAgIElucHV0TWV0aG9kTWFuYWdlciBpbW0gPSAoSW5wdXRNZXRob2RNYW5hZ2VyKQogICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRDb250ZXh0KCkuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LklOUFVUX01FVEhPRF9TRVJWSUNFKTsKLSAgICAgICAgICAgICAgICAgICAgCisKICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IG5ld1NlbFN0YXJ0ID0gZ2V0U2VsZWN0aW9uU3RhcnQoKTsKICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IG5ld1NlbEVuZCA9IGdldFNlbGVjdGlvbkVuZCgpOwotICAgICAgICAgICAgICAgICAgICAKKwogICAgICAgICAgICAgICAgICAgICBDb21taXRTZWxlY3Rpb25SZWNlaXZlciBjc3IgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICBpZiAobmV3U2VsU3RhcnQgIT0gb2xkU2VsU3RhcnQgfHwgbmV3U2VsRW5kICE9IG9sZFNlbEVuZCB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZFRvdWNoRm9jdXNTZWxlY3QoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgY3NyID0gbmV3IENvbW1pdFNlbGVjdGlvblJlY2VpdmVyKG9sZFNlbFN0YXJ0LCBvbGRTZWxFbmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1NlbFN0YXJ0LCBuZXdTZWxFbmQpOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIAorCiAgICAgICAgICAgICAgICAgICAgIGhhbmRsZWQgfD0gaW1tLnNob3dTb2Z0SW5wdXQodGhpcywgMCwgY3NyKSAmJiAoY3NyICE9IG51bGwpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KQEAgLTY3MzIsNyArNjc5MSw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvLyBTdG9wIHNlbGVjdGlvbiBtb2RlIGlmIHRoZSBjb250cm9sbGVyIGJlY29tZXMgdW5hdmFpbGFibGUuCi0gICAgICAgICAgICBzdG9wVGV4dFNlbGVjdGlvbk1vZGUoKTsKKyAgICAgICAgICAgIHN0b3BTZWxlY3Rpb25BY3Rpb25Nb2RlKCk7CiAgICAgICAgICAgICBtU2VsZWN0aW9uTW9kaWZpZXJDdXJzb3JDb250cm9sbGVyID0gbnVsbDsKICAgICAgICAgfQogICAgIH0KQEAgLTY4NzIsOCArNjkzMSwxMCBAQAogCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIGludCBjb21wdXRlSG9yaXpvbnRhbFNjcm9sbFJhbmdlKCkgewotICAgICAgICBpZiAobUxheW91dCAhPSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG1MYXlvdXQuZ2V0V2lkdGgoKTsKKyAgICAgICAgaWYgKG1MYXlvdXQgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG1TaW5nbGVMaW5lICYmIChtR3Jhdml0eSAmIEdyYXZpdHkuSE9SSVpPTlRBTF9HUkFWSVRZX01BU0spID09IEdyYXZpdHkuTEVGVCA/CisgICAgICAgICAgICAgICAgICAgIChpbnQpIG1MYXlvdXQuZ2V0TGluZVdpZHRoKDApIDogbUxheW91dC5nZXRXaWR0aCgpOworICAgICAgICB9CiAKICAgICAgICAgcmV0dXJuIHN1cGVyLmNvbXB1dGVIb3Jpem9udGFsU2Nyb2xsUmFuZ2UoKTsKICAgICB9CkBAIC03MDIwLDcgKzcwODEsNyBAQAogICAgICAgICAgICAgICAgIGdldFNlbGVjdGlvblN0YXJ0KCkgPj0gMCAmJgogICAgICAgICAgICAgICAgIGdldFNlbGVjdGlvbkVuZCgpID49IDAgJiYKICAgICAgICAgICAgICAgICAoKENsaXBib2FyZE1hbmFnZXIpZ2V0Q29udGV4dCgpLmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5DTElQQk9BUkRfU0VSVklDRSkpLgotICAgICAgICAgICAgICAgIGhhc1RleHQoKSk7CisgICAgICAgICAgICAgICAgaGFzUHJpbWFyeUNsaXAoKSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC03MTEyLDUzICs3MTczLDcgQEAKICAgICAgICAgLy8gVHdvIGludHMgcGFja2VkIGluIGEgbG9uZwogICAgICAgICByZXR1cm4gKCgobG9uZykgc3RhcnQpIDw8IDMyKSB8IGVuZDsKICAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIHNlbGVjdEN1cnJlbnRXb3JkKCkgewotICAgICAgICAvLyBJbiBjYXNlIHNlbGVjdGlvbiBtb2RlIGlzIHN0YXJ0ZWQgYWZ0ZXIgYW4gb3JpZW50YXRpb24gY2hhbmdlIG9yIGFmdGVyIGEgc2VsZWN0IGFsbCwKLSAgICAgICAgLy8gdXNlIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBpbnN0ZWFkIG9mIGNyZWF0aW5nIG9uZQotICAgICAgICBpZiAoaGFzU2VsZWN0aW9uKCkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQogCi0gICAgICAgIGludCBzZWxlY3Rpb25TdGFydCwgc2VsZWN0aW9uRW5kOwotCi0gICAgICAgIFNlbGVjdGlvbk1vZGlmaWVyQ3Vyc29yQ29udHJvbGxlciBzZWxlY3Rpb25Nb2RpZmllckN1cnNvckNvbnRyb2xsZXIgPQotICAgICAgICAgICAgKChTZWxlY3Rpb25Nb2RpZmllckN1cnNvckNvbnRyb2xsZXIpIG1TZWxlY3Rpb25Nb2RpZmllckN1cnNvckNvbnRyb2xsZXIpOwotICAgICAgICBpbnQgbWluT2Zmc2V0ID0gc2VsZWN0aW9uTW9kaWZpZXJDdXJzb3JDb250cm9sbGVyLmdldE1pblRvdWNoT2Zmc2V0KCk7Ci0gICAgICAgIGludCBtYXhPZmZzZXQgPSBzZWxlY3Rpb25Nb2RpZmllckN1cnNvckNvbnRyb2xsZXIuZ2V0TWF4VG91Y2hPZmZzZXQoKTsKLQotICAgICAgICBsb25nIHdvcmRMaW1pdHMgPSBnZXRXb3JkTGltaXRzQXQobWluT2Zmc2V0KTsKLSAgICAgICAgaWYgKHdvcmRMaW1pdHMgPj0gMCkgewotICAgICAgICAgICAgc2VsZWN0aW9uU3RhcnQgPSAoaW50KSAod29yZExpbWl0cyA+Pj4gMzIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc2VsZWN0aW9uU3RhcnQgPSBNYXRoLm1heChtaW5PZmZzZXQgLSA1LCAwKTsKLSAgICAgICAgfQotCi0gICAgICAgIHdvcmRMaW1pdHMgPSBnZXRXb3JkTGltaXRzQXQobWF4T2Zmc2V0KTsKLSAgICAgICAgaWYgKHdvcmRMaW1pdHMgPj0gMCkgewotICAgICAgICAgICAgc2VsZWN0aW9uRW5kID0gKGludCkgKHdvcmRMaW1pdHMgJiAweDAwMDAwMDAwRkZGRkZGRkZMKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNlbGVjdGlvbkVuZCA9IE1hdGgubWluKG1heE9mZnNldCArIDUsIG1UZXh0Lmxlbmd0aCgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFNlbGVjdGlvbi5zZXRTZWxlY3Rpb24oKFNwYW5uYWJsZSkgbVRleHQsIHNlbGVjdGlvblN0YXJ0LCBzZWxlY3Rpb25FbmQpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIFN0cmluZyBnZXRXb3JkRm9yRGljdGlvbmFyeSgpIHsKLSAgICAgICAgaW50IG9mZnNldCA9ICgoU2VsZWN0aW9uTW9kaWZpZXJDdXJzb3JDb250cm9sbGVyKSBtU2VsZWN0aW9uTW9kaWZpZXJDdXJzb3JDb250cm9sbGVyKS4KLSAgICAgICAgICAgICAgICAgICAgIGdldE1pblRvdWNoT2Zmc2V0KCk7Ci0KLSAgICAgICAgbG9uZyB3b3JkTGltaXRzID0gZ2V0V29yZExpbWl0c0F0KG9mZnNldCk7Ci0gICAgICAgIGlmICh3b3JkTGltaXRzID49IDApIHsKLSAgICAgICAgICAgIGludCBzdGFydCA9IChpbnQpICh3b3JkTGltaXRzID4+PiAzMik7Ci0gICAgICAgICAgICBpbnQgZW5kID0gKGludCkgKHdvcmRMaW1pdHMgJiAweDAwMDAwMDAwRkZGRkZGRkZMKTsKLSAgICAgICAgICAgIHJldHVybiBtVHJhbnNmb3JtZWQuc3ViU2VxdWVuY2Uoc3RhcnQsIGVuZCkudG9TdHJpbmcoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIAotICAgIH0KLSAgICAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBkaXNwYXRjaFBvcHVsYXRlQWNjZXNzaWJpbGl0eUV2ZW50KEFjY2Vzc2liaWxpdHlFdmVudCBldmVudCkgewogICAgICAgICBpZiAoIWlzU2hvd24oKSkgewpAQCAtNzIwMCw5OCArNzIxNSwzNCBAQAogICAgICAgICBzdXBlci5vbkNyZWF0ZUNvbnRleHRNZW51KG1lbnUpOwogICAgICAgICBib29sZWFuIGFkZGVkID0gZmFsc2U7CiAKLSAgICAgICAgaWYgKG1Jc0luVGV4dFNlbGVjdGlvbk1vZGUpIHsKLSAgICAgICAgICAgIE1lbnVIYW5kbGVyIGhhbmRsZXIgPSBuZXcgTWVudUhhbmRsZXIoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKGNhbkN1dCgpKSB7Ci0gICAgICAgICAgICAgICAgbWVudS5hZGQoMCwgSURfQ1VULCAwLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy5jdXQpLgotICAgICAgICAgICAgICAgICAgICAgc2V0T25NZW51SXRlbUNsaWNrTGlzdGVuZXIoaGFuZGxlcikuCi0gICAgICAgICAgICAgICAgICAgICBzZXRBbHBoYWJldGljU2hvcnRjdXQoJ3gnKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgTWVudUhhbmRsZXIgaGFuZGxlciA9IG5ldyBNZW51SGFuZGxlcigpOwogCi0gICAgICAgICAgICBpZiAoY2FuQ29weSgpKSB7Ci0gICAgICAgICAgICAgICAgbWVudS5hZGQoMCwgSURfQ09QWSwgMCwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcuY29weSkuCi0gICAgICAgICAgICAgICAgICAgICBzZXRPbk1lbnVJdGVtQ2xpY2tMaXN0ZW5lcihoYW5kbGVyKS4KLSAgICAgICAgICAgICAgICAgICAgIHNldEFscGhhYmV0aWNTaG9ydGN1dCgnYycpOwotICAgICAgICAgICAgfQorICAgICAgICBpZiAobVRleHQgaW5zdGFuY2VvZiBTcGFubmVkKSB7CisgICAgICAgICAgICBpbnQgc2VsU3RhcnQgPSBnZXRTZWxlY3Rpb25TdGFydCgpOworICAgICAgICAgICAgaW50IHNlbEVuZCA9IGdldFNlbGVjdGlvbkVuZCgpOwogCi0gICAgICAgICAgICBpZiAoY2FuUGFzdGUoKSkgewotICAgICAgICAgICAgICAgIG1lbnUuYWRkKDAsIElEX1BBU1RFLCAwLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy5wYXN0ZSkuCi0gICAgICAgICAgICAgICAgICAgICBzZXRPbk1lbnVJdGVtQ2xpY2tMaXN0ZW5lcihoYW5kbGVyKS4KLSAgICAgICAgICAgICAgICAgICAgIHNldEFscGhhYmV0aWNTaG9ydGN1dCgndicpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50IG1pbiA9IE1hdGgubWluKHNlbFN0YXJ0LCBzZWxFbmQpOworICAgICAgICAgICAgaW50IG1heCA9IE1hdGgubWF4KHNlbFN0YXJ0LCBzZWxFbmQpOwogCi0gICAgICAgICAgICBtZW51LmFkZCgwLCBJRF9TVE9QX1NFTEVDVElOR19URVhULCAwLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy5zdG9wU2VsZWN0aW5nVGV4dCkuCi0gICAgICAgICAgICAgICAgIHNldE9uTWVudUl0ZW1DbGlja0xpc3RlbmVyKGhhbmRsZXIpOwotICAgICAgICAgICAgCisgICAgICAgICAgICBVUkxTcGFuW10gdXJscyA9ICgoU3Bhbm5lZCkgbVRleHQpLmdldFNwYW5zKG1pbiwgbWF4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxTcGFuLmNsYXNzKTsKKyAgICAgICAgICAgIGlmICh1cmxzLmxlbmd0aCA9PSAxKSB7CisgICAgICAgICAgICAgICAgbWVudS5hZGQoMCwgSURfQ09QWV9VUkwsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcuY29weVVybCkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0T25NZW51SXRlbUNsaWNrTGlzdGVuZXIoaGFuZGxlcik7CisKKyAgICAgICAgICAgICAgICBhZGRlZCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIFRoZSBjb250ZXh0IG1lbnUgaXMgbm90IGVtcHR5LCB3aGljaCB3aWxsIHByZXZlbnQgdGhlIHNlbGVjdGlvbiBtb2RlIGZyb20gc3RhcnRpbmcuCisgICAgICAgIC8vIEFkZCBhIGVudHJ5IHRvIHN0YXJ0IGl0IGluIHRoZSBjb250ZXh0IG1lbnUuCisgICAgICAgIC8vIFRPRE8gRG9lcyBub3QgaGFuZGxlIHRoZSBjYXNlIHdoZXJlIGEgc3ViY2xhc3MgZG9lcyBub3QgY2FsbCBzdXBlci50aGlzTWV0aG9kIG9yCisgICAgICAgIC8vIHBvcHVsYXRlcyB0aGUgbWVudSBBRlRFUiB0aGlzIGNhbGwuCisgICAgICAgIGlmIChtZW51LnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgIG1lbnUuYWRkKDAsIElEX1NFTEVDVElPTl9NT0RFLCAwLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy5zZWxlY3RUZXh0TW9kZSkuCisgICAgICAgICAgICBzZXRPbk1lbnVJdGVtQ2xpY2tMaXN0ZW5lcihoYW5kbGVyKTsKICAgICAgICAgICAgIGFkZGVkID0gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICBpZiAoIWlzRm9jdXNlZCgpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGlzRm9jdXNhYmxlKCkgJiYgbUlucHV0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNhbkNvcHkoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgTWVudUhhbmRsZXIgaGFuZGxlciA9IG5ldyBNZW51SGFuZGxlcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgbWVudS5hZGQoMCwgSURfQ09QWSwgMCwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcuY29weSkuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldE9uTWVudUl0ZW1DbGlja0xpc3RlbmVyKGhhbmRsZXIpLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRBbHBoYWJldGljU2hvcnRjdXQoJ2MnKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbnUuc2V0SGVhZGVyVGl0bGUoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcuZWRpdFRleHRNZW51VGl0bGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy9yZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIE1lbnVIYW5kbGVyIGhhbmRsZXIgPSBuZXcgTWVudUhhbmRsZXIoKTsKLQotICAgICAgICAgICAgaWYgKGNhblNlbGVjdFRleHQoKSkgewotICAgICAgICAgICAgICAgIG1lbnUuYWRkKDAsIElEX1NUQVJUX1NFTEVDVElOR19URVhULCAwLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy5zZWxlY3RUZXh0KS4KLSAgICAgICAgICAgICAgICBzZXRPbk1lbnVJdGVtQ2xpY2tMaXN0ZW5lcihoYW5kbGVyKTsKLSAgICAgICAgICAgICAgICBhZGRlZCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChjYW5TZWxlY3RBbGwoKSkgewotICAgICAgICAgICAgICAgIG1lbnUuYWRkKDAsIElEX1NFTEVDVF9BTEwsIDAsIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3RyaW5nLnNlbGVjdEFsbCkuCi0gICAgICAgICAgICAgICAgICAgICBzZXRPbk1lbnVJdGVtQ2xpY2tMaXN0ZW5lcihoYW5kbGVyKS4KLSAgICAgICAgICAgICAgICAgICAgIHNldEFscGhhYmV0aWNTaG9ydGN1dCgnYScpOwotICAgICAgICAgICAgICAgIGFkZGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1UZXh0IGluc3RhbmNlb2YgU3Bhbm5lZCkgewotICAgICAgICAgICAgICAgIGludCBzZWxTdGFydCA9IGdldFNlbGVjdGlvblN0YXJ0KCk7Ci0gICAgICAgICAgICAgICAgaW50IHNlbEVuZCA9IGdldFNlbGVjdGlvbkVuZCgpOwotCi0gICAgICAgICAgICAgICAgaW50IG1pbiA9IE1hdGgubWluKHNlbFN0YXJ0LCBzZWxFbmQpOwotICAgICAgICAgICAgICAgIGludCBtYXggPSBNYXRoLm1heChzZWxTdGFydCwgc2VsRW5kKTsKLQotICAgICAgICAgICAgICAgIFVSTFNwYW5bXSB1cmxzID0gKChTcGFubmVkKSBtVGV4dCkuZ2V0U3BhbnMobWluLCBtYXgsCi0gICAgICAgICAgICAgICAgICAgICAgICBVUkxTcGFuLmNsYXNzKTsKLSAgICAgICAgICAgICAgICBpZiAodXJscy5sZW5ndGggPT0gMSkgewotICAgICAgICAgICAgICAgICAgICBtZW51LmFkZCgwLCBJRF9DT1BZX1VSTCwgMCwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcuY29weVVybCkuCi0gICAgICAgICAgICAgICAgICAgICAgICAgc2V0T25NZW51SXRlbUNsaWNrTGlzdGVuZXIoaGFuZGxlcik7Ci0gICAgICAgICAgICAgICAgICAgIGFkZGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChjYW5QYXN0ZSgpKSB7Ci0gICAgICAgICAgICAgICAgbWVudS5hZGQoMCwgSURfUEFTVEUsIDAsIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3RyaW5nLnBhc3RlKS4KLSAgICAgICAgICAgICAgICAgICAgIHNldE9uTWVudUl0ZW1DbGlja0xpc3RlbmVyKGhhbmRsZXIpLgotICAgICAgICAgICAgICAgICAgICAgc2V0QWxwaGFiZXRpY1Nob3J0Y3V0KCd2Jyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChpc0lucHV0TWV0aG9kVGFyZ2V0KCkpIHsKLSAgICAgICAgICAgICAgICBtZW51LmFkZCgxLCBJRF9TV0lUQ0hfSU5QVVRfTUVUSE9ELCAwLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy5pbnB1dE1ldGhvZCkuCi0gICAgICAgICAgICAgICAgICAgICBzZXRPbk1lbnVJdGVtQ2xpY2tMaXN0ZW5lcihoYW5kbGVyKTsKLSAgICAgICAgICAgICAgICBhZGRlZCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN0cmluZyB3b3JkID0gZ2V0V29yZEZvckRpY3Rpb25hcnkoKTsKLSAgICAgICAgICAgIGlmICh3b3JkICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtZW51LmFkZCgxLCBJRF9BRERfVE9fRElDVElPTkFSWSwgMCwKLSAgICAgICAgICAgICAgICAgICAgIGdldENvbnRleHQoKS5nZXRTdHJpbmcoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcuYWRkVG9EaWN0aW9uYXJ5LCB3b3JkKSkuCi0gICAgICAgICAgICAgICAgICAgICBzZXRPbk1lbnVJdGVtQ2xpY2tMaXN0ZW5lcihoYW5kbGVyKTsKLSAgICAgICAgICAgICAgICBhZGRlZCA9IHRydWU7Ci0KLSAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIGlmIChhZGRlZCkgewpAQCAtNzMwOCwxNiArNzI1OSwxNCBAQAogICAgICAgICByZXR1cm4gaW1tICE9IG51bGwgJiYgaW1tLmlzQWN0aXZlKHRoaXMpOwogICAgIH0KICAgICAKLSAgICAvLyBDb250ZXh0IG1lbnUgZW50cmllcworICAgIC8vIFNlbGVjdGlvbiBjb250ZXh0IG1vZGUKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSURfU0VMRUNUX0FMTCA9IGFuZHJvaWQuUi5pZC5zZWxlY3RBbGw7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElEX1NUQVJUX1NFTEVDVElOR19URVhUID0gYW5kcm9pZC5SLmlkLnN0YXJ0U2VsZWN0aW5nVGV4dDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSURfU1RPUF9TRUxFQ1RJTkdfVEVYVCA9IGFuZHJvaWQuUi5pZC5zdG9wU2VsZWN0aW5nVGV4dDsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSURfQ1VUID0gYW5kcm9pZC5SLmlkLmN1dDsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSURfQ09QWSA9IGFuZHJvaWQuUi5pZC5jb3B5OwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJRF9QQVNURSA9IGFuZHJvaWQuUi5pZC5wYXN0ZTsKKyAgICAvLyBDb250ZXh0IG1lbnUgZW50cmllcwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJRF9DT1BZX1VSTCA9IGFuZHJvaWQuUi5pZC5jb3B5VXJsOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJRF9TV0lUQ0hfSU5QVVRfTUVUSE9EID0gYW5kcm9pZC5SLmlkLnN3aXRjaElucHV0TWV0aG9kOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJRF9BRERfVE9fRElDVElPTkFSWSA9IGFuZHJvaWQuUi5pZC5hZGRUb0RpY3Rpb25hcnk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElEX1NFTEVDVElPTl9NT0RFID0gYW5kcm9pZC5SLmlkLnNlbGVjdFRleHRNb2RlOwogCiAgICAgcHJpdmF0ZSBjbGFzcyBNZW51SGFuZGxlciBpbXBsZW1lbnRzIE1lbnVJdGVtLk9uTWVudUl0ZW1DbGlja0xpc3RlbmVyIHsKICAgICAgICAgcHVibGljIGJvb2xlYW4gb25NZW51SXRlbUNsaWNrKE1lbnVJdGVtIGl0ZW0pIHsKQEAgLTczMjcsODUgKzcyNzYsNDQgQEAKIAogICAgIC8qKgogICAgICAqIENhbGxlZCB3aGVuIGEgY29udGV4dCBtZW51IG9wdGlvbiBmb3IgdGhlIHRleHQgdmlldyBpcyBzZWxlY3RlZC4gIEN1cnJlbnRseQotICAgICAqIHRoaXMgd2lsbCBiZSBvbmUgb2Y6IHtAbGluayBhbmRyb2lkLlIuaWQjc2VsZWN0QWxsfSwKLSAgICAgKiB7QGxpbmsgYW5kcm9pZC5SLmlkI3N0YXJ0U2VsZWN0aW5nVGV4dH0sIHtAbGluayBhbmRyb2lkLlIuaWQjc3RvcFNlbGVjdGluZ1RleHR9LAotICAgICAqIHtAbGluayBhbmRyb2lkLlIuaWQjY3V0fSwge0BsaW5rIGFuZHJvaWQuUi5pZCNjb3B5fSwKLSAgICAgKiB7QGxpbmsgYW5kcm9pZC5SLmlkI3Bhc3RlfSwge0BsaW5rIGFuZHJvaWQuUi5pZCNjb3B5VXJsfSwKLSAgICAgKiBvciB7QGxpbmsgYW5kcm9pZC5SLmlkI3N3aXRjaElucHV0TWV0aG9kfS4KKyAgICAgKiB0aGlzIHdpbGwgYmUge0BsaW5rIGFuZHJvaWQuUi5pZCNjb3B5VXJsfSBvciB7QGxpbmsgYW5kcm9pZC5SLmlkI3NlbGVjdFRleHRNb2RlfS4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBvblRleHRDb250ZXh0TWVudUl0ZW0oaW50IGlkKSB7CiAgICAgICAgIGludCBtaW4gPSAwOwogICAgICAgICBpbnQgbWF4ID0gbVRleHQubGVuZ3RoKCk7Ci0KKyAgICAgICAgCiAgICAgICAgIGlmIChpc0ZvY3VzZWQoKSkgewotICAgICAgICAgICAgZmluYWwgaW50IHNlbFN0YXJ0ID0gZ2V0U2VsZWN0aW9uU3RhcnQoKTsKLSAgICAgICAgICAgIGZpbmFsIGludCBzZWxFbmQgPSBnZXRTZWxlY3Rpb25FbmQoKTsKLQorICAgICAgICAgICAgaW50IHNlbFN0YXJ0ID0gZ2V0U2VsZWN0aW9uU3RhcnQoKTsKKyAgICAgICAgICAgIGludCBzZWxFbmQgPSBnZXRTZWxlY3Rpb25FbmQoKTsKICAgICAgICAgICAgIG1pbiA9IE1hdGgubWF4KDAsIE1hdGgubWluKHNlbFN0YXJ0LCBzZWxFbmQpKTsKICAgICAgICAgICAgIG1heCA9IE1hdGgubWF4KDAsIE1hdGgubWF4KHNlbFN0YXJ0LCBzZWxFbmQpKTsKICAgICAgICAgfQogCi0gICAgICAgIENsaXBib2FyZE1hbmFnZXIgY2xpcCA9IChDbGlwYm9hcmRNYW5hZ2VyKWdldENvbnRleHQoKQorICAgICAgICBDbGlwYm9hcmRNYW5hZ2VyIGNsaXBib2FyZCA9IChDbGlwYm9hcmRNYW5hZ2VyKWdldENvbnRleHQoKQogICAgICAgICAgICAgICAgIC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuQ0xJUEJPQVJEX1NFUlZJQ0UpOwogCiAgICAgICAgIHN3aXRjaCAoaWQpIHsKLSAgICAgICAgICAgIGNhc2UgSURfU0VMRUNUX0FMTDoKLSAgICAgICAgICAgICAgICBTZWxlY3Rpb24uc2V0U2VsZWN0aW9uKChTcGFubmFibGUpIG1UZXh0LCAwLCBtVGV4dC5sZW5ndGgoKSk7Ci0gICAgICAgICAgICAgICAgc3RhcnRUZXh0U2VsZWN0aW9uTW9kZSgpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgICAgICAgICBjYXNlIElEX1NUQVJUX1NFTEVDVElOR19URVhUOgotICAgICAgICAgICAgICAgIHN0YXJ0VGV4dFNlbGVjdGlvbk1vZGUoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgICAgICAgICAgY2FzZSBJRF9TVE9QX1NFTEVDVElOR19URVhUOgotICAgICAgICAgICAgICAgIHN0b3BUZXh0U2VsZWN0aW9uTW9kZSgpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgICAgICAgICBjYXNlIElEX0NVVDogICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgY2xpcC5zZXRUZXh0KG1UcmFuc2Zvcm1lZC5zdWJTZXF1ZW5jZShtaW4sIG1heCkpOwotICAgICAgICAgICAgICAgICgoRWRpdGFibGUpIG1UZXh0KS5kZWxldGUobWluLCBtYXgpOwotICAgICAgICAgICAgICAgIHN0b3BUZXh0U2VsZWN0aW9uTW9kZSgpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgICAgICAgICBjYXNlIElEX0NPUFk6Ci0gICAgICAgICAgICAgICAgY2xpcC5zZXRUZXh0KG1UcmFuc2Zvcm1lZC5zdWJTZXF1ZW5jZShtaW4sIG1heCkpOwotICAgICAgICAgICAgICAgIHN0b3BUZXh0U2VsZWN0aW9uTW9kZSgpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgICAgICAgICBjYXNlIElEX1BBU1RFOgotICAgICAgICAgICAgICAgIENoYXJTZXF1ZW5jZSBwYXN0ZSA9IGNsaXAuZ2V0VGV4dCgpOwotCi0gICAgICAgICAgICAgICAgaWYgKHBhc3RlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgU2VsZWN0aW9uLnNldFNlbGVjdGlvbigoU3Bhbm5hYmxlKSBtVGV4dCwgbWF4KTsKLSAgICAgICAgICAgICAgICAgICAgKChFZGl0YWJsZSkgbVRleHQpLnJlcGxhY2UobWluLCBtYXgsIHBhc3RlKTsKLSAgICAgICAgICAgICAgICAgICAgc3RvcFRleHRTZWxlY3Rpb25Nb2RlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotCiAgICAgICAgICAgICBjYXNlIElEX0NPUFlfVVJMOgorICAgICAgICAgICAgICAgIE1ldGFLZXlLZXlMaXN0ZW5lci5zdG9wU2VsZWN0aW5nKHRoaXMsIChTcGFubmFibGUpIG1UZXh0KTsKKwogICAgICAgICAgICAgICAgIFVSTFNwYW5bXSB1cmxzID0gKChTcGFubmVkKSBtVGV4dCkuZ2V0U3BhbnMobWluLCBtYXgsIFVSTFNwYW4uY2xhc3MpOwotICAgICAgICAgICAgICAgIGlmICh1cmxzLmxlbmd0aCA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNsaXAuc2V0VGV4dCh1cmxzWzBdLmdldFVSTCgpKTsKKyAgICAgICAgICAgICAgICBpZiAodXJscy5sZW5ndGggPj0gMSkgeworICAgICAgICAgICAgICAgICAgICBDbGlwcGVkRGF0YSBjbGlwID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPHVybHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFVyaSB1cmkgPSBVcmkucGFyc2UodXJsc1swXS5nZXRVUkwoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBDbGlwcGVkRGF0YS5JdGVtIGl0ZW0gPSBuZXcgQ2xpcHBlZERhdGEuSXRlbSh1cmkpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsaXAgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXAgPSBuZXcgQ2xpcHBlZERhdGEobnVsbCwgbnVsbCwgaXRlbSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXAuYWRkSXRlbShpdGVtKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjbGlwYm9hcmQuc2V0UHJpbWFyeUNsaXAoY2xpcCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogCi0gICAgICAgICAgICBjYXNlIElEX1NXSVRDSF9JTlBVVF9NRVRIT0Q6Ci0gICAgICAgICAgICAgICAgSW5wdXRNZXRob2RNYW5hZ2VyIGltbSA9IElucHV0TWV0aG9kTWFuYWdlci5wZWVrSW5zdGFuY2UoKTsKLSAgICAgICAgICAgICAgICBpZiAoaW1tICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaW1tLnNob3dJbnB1dE1ldGhvZFBpY2tlcigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgICAgICAgICAgY2FzZSBJRF9BRERfVE9fRElDVElPTkFSWToKLSAgICAgICAgICAgICAgICBTdHJpbmcgd29yZCA9IGdldFdvcmRGb3JEaWN0aW9uYXJ5KCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAod29yZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIEludGVudCBpID0gbmV3IEludGVudCgiY29tLmFuZHJvaWQuc2V0dGluZ3MuVVNFUl9ESUNUSU9OQVJZX0lOU0VSVCIpOwotICAgICAgICAgICAgICAgICAgICBpLnB1dEV4dHJhKCJ3b3JkIiwgd29yZCk7Ci0gICAgICAgICAgICAgICAgICAgIGkuc2V0RmxhZ3MoaS5nZXRGbGFncygpIHwgSW50ZW50LkZMQUdfQUNUSVZJVFlfTkVXX1RBU0spOwotICAgICAgICAgICAgICAgICAgICBnZXRDb250ZXh0KCkuc3RhcnRBY3Rpdml0eShpKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIElEX1NFTEVDVElPTl9NT0RFOgorICAgICAgICAgICAgICAgIHN0YXJ0U2VsZWN0aW9uQWN0aW9uTW9kZSgpOwogICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgfQogCkBAIC03NDE4LDMzICs3MzI2LDgxIEBACiAgICAgICAgICAgICBtRWF0VG91Y2hSZWxlYXNlID0gdHJ1ZTsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAoc3RhcnRTZWxlY3Rpb25BY3Rpb25Nb2RlKCkpIHsKKyAgICAgICAgICAgIHBlcmZvcm1IYXB0aWNGZWVkYmFjayhIYXB0aWNGZWVkYmFja0NvbnN0YW50cy5MT05HX1BSRVNTKTsKKyAgICAgICAgICAgIG1FYXRUb3VjaFJlbGVhc2UgPSB0cnVlOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KIAogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIHN0YXJ0VGV4dFNlbGVjdGlvbk1vZGUoKSB7Ci0gICAgICAgIGlmIChtU2VsZWN0aW9uTW9kaWZpZXJDdXJzb3JDb250cm9sbGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIExvZy53KExPR19UQUcsICJUZXh0VmlldyBoYXMgbm8gc2VsZWN0aW9uIGNvbnRyb2xsZXIuIEFjdGlvbiBtb2RlIGNhbmNlbGxlZC4iKTsKLSAgICAgICAgICAgIHJldHVybjsKKyAgICBwcml2YXRlIGJvb2xlYW4gdG91Y2hQb3NpdGlvbklzSW5TZWxlY3Rpb24oKSB7CisgICAgICAgIGludCBzZWxlY3Rpb25TdGFydCA9IGdldFNlbGVjdGlvblN0YXJ0KCk7CisgICAgICAgIGludCBzZWxlY3Rpb25FbmQgPSBnZXRTZWxlY3Rpb25FbmQoKTsKKworICAgICAgICBpZiAoc2VsZWN0aW9uU3RhcnQgPT0gc2VsZWN0aW9uRW5kKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoIXJlcXVlc3RGb2N1cygpKSB7Ci0gICAgICAgICAgICByZXR1cm47CisgICAgICAgIGlmIChzZWxlY3Rpb25TdGFydCA+IHNlbGVjdGlvbkVuZCkgeworICAgICAgICAgICAgaW50IHRtcCA9IHNlbGVjdGlvblN0YXJ0OworICAgICAgICAgICAgc2VsZWN0aW9uU3RhcnQgPSBzZWxlY3Rpb25FbmQ7CisgICAgICAgICAgICBzZWxlY3Rpb25FbmQgPSB0bXA7CisgICAgICAgICAgICBTZWxlY3Rpb24uc2V0U2VsZWN0aW9uKChTcGFubmFibGUpIG1UZXh0LCBzZWxlY3Rpb25TdGFydCwgc2VsZWN0aW9uRW5kKTsKICAgICAgICAgfQogCi0gICAgICAgIHNlbGVjdEN1cnJlbnRXb3JkKCk7Ci0gICAgICAgIG1TZWxlY3Rpb25Nb2RpZmllckN1cnNvckNvbnRyb2xsZXIuc2hvdygpOwotICAgICAgICBtSXNJblRleHRTZWxlY3Rpb25Nb2RlID0gdHJ1ZTsKKyAgICAgICAgU2VsZWN0aW9uTW9kaWZpZXJDdXJzb3JDb250cm9sbGVyIHNlbGVjdGlvbk1vZGlmaWVyQ3Vyc29yQ29udHJvbGxlciA9CisgICAgICAgICAgICAoKFNlbGVjdGlvbk1vZGlmaWVyQ3Vyc29yQ29udHJvbGxlcikgbVNlbGVjdGlvbk1vZGlmaWVyQ3Vyc29yQ29udHJvbGxlcik7CisgICAgICAgIGludCBtaW5PZmZzZXQgPSBzZWxlY3Rpb25Nb2RpZmllckN1cnNvckNvbnRyb2xsZXIuZ2V0TWluVG91Y2hPZmZzZXQoKTsKKyAgICAgICAgaW50IG1heE9mZnNldCA9IHNlbGVjdGlvbk1vZGlmaWVyQ3Vyc29yQ29udHJvbGxlci5nZXRNYXhUb3VjaE9mZnNldCgpOworCisgICAgICAgIHJldHVybiAoKG1pbk9mZnNldCA+PSBzZWxlY3Rpb25TdGFydCkgJiYgKG1heE9mZnNldCA8IHNlbGVjdGlvbkVuZCkpOwogICAgIH0KLSAgICAKKwogICAgIC8qKgotICAgICAqIFNhbWUgYXMge0BsaW5rICNzdG9wVGV4dFNlbGVjdGlvbk1vZGUoKX0sIGV4Y2VwdCB0aGF0IHRoZXJlIGlzIG5vIGN1cnNvciBjb250cm9sbGVyCisgICAgICogUHJvdmlkZXMgdGhlIGNhbGxiYWNrIHVzZWQgdG8gc3RhcnQgYSBzZWxlY3Rpb24gYWN0aW9uIG1vZGUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEEgY2FsbGJhY2sgaW5zdGFuY2UgdGhhdCB3aWxsIGJlIHVzZWQgdG8gc3RhcnQgc2VsZWN0aW9uIG1vZGUsIG9yIG51bGwgaWYgc2VsZWN0aW9uCisgICAgICogbW9kZSBpcyBub3QgYXZhaWxhYmxlLgorICAgICAqLworICAgIHByaXZhdGUgQWN0aW9uTW9kZS5DYWxsYmFjayBnZXRBY3Rpb25Nb2RlQ2FsbGJhY2soKSB7CisgICAgICAgIC8vIExvbmcgcHJlc3MgaW4gdGhlIGN1cnJlbnQgc2VsZWN0aW9uLgorICAgICAgICAvLyBTaG91bGQgaW5pdGlhdGUgYSBkcmFnLiBSZXR1cm4gZmFsc2UsIHRvIHJlbHkgb24gY29udGV4dCBtZW51IGZvciBub3cuCisgICAgICAgIGlmIChjYW5TZWxlY3RUZXh0KCkgJiYgIXRvdWNoUG9zaXRpb25Jc0luU2VsZWN0aW9uKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgU2VsZWN0aW9uQWN0aW9uTW9kZUNhbGxiYWNrKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHNlbGVjdGlvbiBtb2RlIHdhcyBhY3R1YWxseSBzdGFydGVkLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBzdGFydFNlbGVjdGlvbkFjdGlvbk1vZGUoKSB7CisgICAgICAgIGlmIChtU2VsZWN0aW9uQWN0aW9uTW9kZSAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyBTZWxlY3Rpb24gYWN0aW9uIG1vZGUgaXMgYWxyZWFkeSBzdGFydGVkCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBBY3Rpb25Nb2RlLkNhbGxiYWNrIGFjdGlvbk1vZGVDYWxsYmFjayA9IGdldEFjdGlvbk1vZGVDYWxsYmFjaygpOworICAgICAgICBpZiAoYWN0aW9uTW9kZUNhbGxiYWNrICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1TZWxlY3Rpb25BY3Rpb25Nb2RlID0gc3RhcnRBY3Rpb25Nb2RlKGFjdGlvbk1vZGVDYWxsYmFjayk7CisgICAgICAgICAgICByZXR1cm4gbVNlbGVjdGlvbkFjdGlvbk1vZGUgIT0gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTYW1lIGFzIHtAbGluayAjc3RvcFNlbGVjdGlvbkFjdGlvbk1vZGUoKX0sIGV4Y2VwdCB0aGF0IHRoZXJlIGlzIG5vIGN1cnNvciBjb250cm9sbGVyCiAgICAgICogZmFkZSBvdXQgYW5pbWF0aW9uLiBOZWVkZWQgc2luY2UgdGhlIGRyYXdhYmxlIGFuZCB0aGVpciBhbHBoYSB2YWx1ZXMgYXJlIHNoYXJlZCBieSBhbGwKICAgICAgKiBUZXh0Vmlld3MuIFN3aXRjaGluZyBmcm9tIG9uZSBUZXh0VmlldyB0byBhbm90aGVyIHdvdWxkIGZhZGUgdGhlIGN1cnNvciBjb250cm9sbGVycyBpbiB0aGUKICAgICAgKiBuZXcgb25lIG90aGVyd2lzZS4KICAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgdGVybWluYXRlVGV4dFNlbGVjdGlvbk1vZGUoKSB7Ci0gICAgICAgIHN0b3BUZXh0U2VsZWN0aW9uTW9kZSgpOworICAgIHByaXZhdGUgdm9pZCB0ZXJtaW5hdGVTZWxlY3Rpb25BY3Rpb25Nb2RlKCkgeworICAgICAgICBzdG9wU2VsZWN0aW9uQWN0aW9uTW9kZSgpOwogICAgICAgICBpZiAobVNlbGVjdGlvbk1vZGlmaWVyQ3Vyc29yQ29udHJvbGxlciAhPSBudWxsKSB7CiAgICAgICAgICAgICBTZWxlY3Rpb25Nb2RpZmllckN1cnNvckNvbnRyb2xsZXIgc2VsZWN0aW9uTW9kaWZpZXJDdXJzb3JDb250cm9sbGVyID0KICAgICAgICAgICAgICAgICAoU2VsZWN0aW9uTW9kaWZpZXJDdXJzb3JDb250cm9sbGVyKSBtU2VsZWN0aW9uTW9kaWZpZXJDdXJzb3JDb250cm9sbGVyOwpAQCAtNzQ1MiwxNCArNzQwOCwxNzcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHByaXZhdGUgdm9pZCBzdG9wVGV4dFNlbGVjdGlvbk1vZGUoKSB7Ci0gICAgICAgIGlmIChtSXNJblRleHRTZWxlY3Rpb25Nb2RlKSB7Ci0gICAgICAgICAgICBTZWxlY3Rpb24uc2V0U2VsZWN0aW9uKChTcGFubmFibGUpIG1UZXh0LCBnZXRTZWxlY3Rpb25FbmQoKSk7CisgICAgcHJpdmF0ZSB2b2lkIHN0b3BTZWxlY3Rpb25BY3Rpb25Nb2RlKCkgeworICAgICAgICBpZiAobVNlbGVjdGlvbkFjdGlvbk1vZGUgIT0gbnVsbCkgeworICAgICAgICAgICAgbVNlbGVjdGlvbkFjdGlvbk1vZGUuZmluaXNoKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIFNlbGVjdGlvbkFjdGlvbk1vZGVDYWxsYmFjayBpbXBsZW1lbnRzIEFjdGlvbk1vZGUuQ2FsbGJhY2sgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbkNyZWF0ZUFjdGlvbk1vZGUoQWN0aW9uTW9kZSBtb2RlLCBNZW51IG1lbnUpIHsKKyAgICAgICAgICAgIGlmIChtU2VsZWN0aW9uTW9kaWZpZXJDdXJzb3JDb250cm9sbGVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiVGV4dFZpZXcgaGFzIG5vIHNlbGVjdGlvbiBjb250cm9sbGVyLiBBY3Rpb24gbW9kZSBjYW5jZWxsZWQuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIXJlcXVlc3RGb2N1cygpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtb2RlLnNldFRpdGxlKG1Db250ZXh0LmdldFN0cmluZyhjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy50ZXh0U2VsZWN0aW9uQ0FCVGl0bGUpKTsKKyAgICAgICAgICAgIG1vZGUuc2V0U3VidGl0bGUobnVsbCk7CisKKyAgICAgICAgICAgIHNlbGVjdEN1cnJlbnRXb3JkKCk7CisKKyAgICAgICAgICAgIGJvb2xlYW4gYXRMZWFzdE9uZSA9IGZhbHNlOworCisgICAgICAgICAgICBpZiAoY2FuU2VsZWN0QWxsKCkpIHsKKyAgICAgICAgICAgICAgICBtZW51LmFkZCgwLCBJRF9TRUxFQ1RfQUxMLCAwLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy5zZWxlY3RBbGwpLgorICAgICAgICAgICAgICAgICAgICBzZXRJY29uKGNvbS5hbmRyb2lkLmludGVybmFsLlIuZHJhd2FibGUuaWNfbWVudV9jaGF0X2Rhc2hib2FyZCkuCisgICAgICAgICAgICAgICAgICAgIHNldEFscGhhYmV0aWNTaG9ydGN1dCgnYScpOworICAgICAgICAgICAgICAgIGF0TGVhc3RPbmUgPSB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoY2FuQ3V0KCkpIHsKKyAgICAgICAgICAgICAgICBtZW51LmFkZCgwLCBJRF9DVVQsIDAsIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3RyaW5nLmN1dCkuCisgICAgICAgICAgICAgICAgICAgIHNldEljb24oY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5kcmF3YWJsZS5pY19tZW51X2NvbXBvc2UpLgorICAgICAgICAgICAgICAgICAgICBzZXRBbHBoYWJldGljU2hvcnRjdXQoJ3gnKTsKKyAgICAgICAgICAgICAgICBhdExlYXN0T25lID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGNhbkNvcHkoKSkgeworICAgICAgICAgICAgICAgIG1lbnUuYWRkKDAsIElEX0NPUFksIDAsIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3RyaW5nLmNvcHkpLgorICAgICAgICAgICAgICAgICAgICBzZXRJY29uKGNvbS5hbmRyb2lkLmludGVybmFsLlIuZHJhd2FibGUuaWNfbWVudV9hdHRhY2htZW50KS4KKyAgICAgICAgICAgICAgICAgICAgc2V0QWxwaGFiZXRpY1Nob3J0Y3V0KCdjJyk7CisgICAgICAgICAgICAgICAgYXRMZWFzdE9uZSA9IHRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChjYW5QYXN0ZSgpKSB7CisgICAgICAgICAgICAgICAgbWVudS5hZGQoMCwgSURfUEFTVEUsIDAsIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3RyaW5nLnBhc3RlKS4KKyAgICAgICAgICAgICAgICAgICAgICAgIHNldEljb24oY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5kcmF3YWJsZS5pY19tZW51X2NhbWVyYSkuCisgICAgICAgICAgICAgICAgICAgICAgICBzZXRBbHBoYWJldGljU2hvcnRjdXQoJ3YnKTsKKyAgICAgICAgICAgICAgICBhdExlYXN0T25lID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGF0TGVhc3RPbmUpIHsKKyAgICAgICAgICAgICAgICBtU2VsZWN0aW9uTW9kaWZpZXJDdXJzb3JDb250cm9sbGVyLnNob3coKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIHNlbGVjdEN1cnJlbnRXb3JkKCkgeworICAgICAgICAgICAgLy8gSW4gY2FzZSBzZWxlY3Rpb24gbW9kZSBpcyBzdGFydGVkIGFmdGVyIGFuIG9yaWVudGF0aW9uIGNoYW5nZSwgdXNlIHRoZSBjdXJyZW50CisgICAgICAgICAgICAvLyBzZWxlY3Rpb24gaW5zdGVhZCBvZiBjcmVhdGluZyBvbmUKKyAgICAgICAgICAgIGlmIChoYXNTZWxlY3Rpb24oKSkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50IHNlbGVjdGlvblN0YXJ0LCBzZWxlY3Rpb25FbmQ7CisKKyAgICAgICAgICAgIFNlbGVjdGlvbk1vZGlmaWVyQ3Vyc29yQ29udHJvbGxlciBzZWxlY3Rpb25Nb2RpZmllckN1cnNvckNvbnRyb2xsZXIgPQorICAgICAgICAgICAgICAgICgoU2VsZWN0aW9uTW9kaWZpZXJDdXJzb3JDb250cm9sbGVyKSBtU2VsZWN0aW9uTW9kaWZpZXJDdXJzb3JDb250cm9sbGVyKTsKKyAgICAgICAgICAgIGludCBtaW5PZmZzZXQgPSBzZWxlY3Rpb25Nb2RpZmllckN1cnNvckNvbnRyb2xsZXIuZ2V0TWluVG91Y2hPZmZzZXQoKTsKKyAgICAgICAgICAgIGludCBtYXhPZmZzZXQgPSBzZWxlY3Rpb25Nb2RpZmllckN1cnNvckNvbnRyb2xsZXIuZ2V0TWF4VG91Y2hPZmZzZXQoKTsKKworICAgICAgICAgICAgbG9uZyB3b3JkTGltaXRzID0gZ2V0V29yZExpbWl0c0F0KG1pbk9mZnNldCk7CisgICAgICAgICAgICBpZiAod29yZExpbWl0cyA+PSAwKSB7CisgICAgICAgICAgICAgICAgc2VsZWN0aW9uU3RhcnQgPSAoaW50KSAod29yZExpbWl0cyA+Pj4gMzIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzZWxlY3Rpb25TdGFydCA9IE1hdGgubWF4KG1pbk9mZnNldCAtIDUsIDApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB3b3JkTGltaXRzID0gZ2V0V29yZExpbWl0c0F0KG1heE9mZnNldCk7CisgICAgICAgICAgICBpZiAod29yZExpbWl0cyA+PSAwKSB7CisgICAgICAgICAgICAgICAgc2VsZWN0aW9uRW5kID0gKGludCkgKHdvcmRMaW1pdHMgJiAweDAwMDAwMDAwRkZGRkZGRkZMKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc2VsZWN0aW9uRW5kID0gTWF0aC5taW4obWF4T2Zmc2V0ICsgNSwgbVRleHQubGVuZ3RoKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTZWxlY3Rpb24uc2V0U2VsZWN0aW9uKChTcGFubmFibGUpIG1UZXh0LCBzZWxlY3Rpb25TdGFydCwgc2VsZWN0aW9uRW5kKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBvblByZXBhcmVBY3Rpb25Nb2RlKEFjdGlvbk1vZGUgbW9kZSwgTWVudSBtZW51KSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbkFjdGlvbkl0ZW1DbGlja2VkKEFjdGlvbk1vZGUgbW9kZSwgTWVudUl0ZW0gaXRlbSkgeworICAgICAgICAgICAgZmluYWwgaW50IGl0ZW1JZCA9IGl0ZW0uZ2V0SXRlbUlkKCk7CisKKyAgICAgICAgICAgIGlmIChpdGVtSWQgPT0gSURfU0VMRUNUX0FMTCkgeworICAgICAgICAgICAgICAgIFNlbGVjdGlvbi5zZXRTZWxlY3Rpb24oKFNwYW5uYWJsZSkgbVRleHQsIDAsIG1UZXh0Lmxlbmd0aCgpKTsKKyAgICAgICAgICAgICAgICAvLyBVcGRhdGUgY29udHJvbGxlciBwb3NpdGlvbnMgYWZ0ZXIgc2VsZWN0aW9uIGNoYW5nZS4KKyAgICAgICAgICAgICAgICBpZiAobVNlbGVjdGlvbk1vZGlmaWVyQ3Vyc29yQ29udHJvbGxlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG1TZWxlY3Rpb25Nb2RpZmllckN1cnNvckNvbnRyb2xsZXIuc2hvdygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ2xpcGJvYXJkTWFuYWdlciBjbGlwYm9hcmQgPSAoQ2xpcGJvYXJkTWFuYWdlcikgZ2V0Q29udGV4dCgpLgorICAgICAgICAgICAgICAgICAgICBnZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuQ0xJUEJPQVJEX1NFUlZJQ0UpOworCisgICAgICAgICAgICBpbnQgbWluID0gMDsKKyAgICAgICAgICAgIGludCBtYXggPSBtVGV4dC5sZW5ndGgoKTsKKworICAgICAgICAgICAgaWYgKGlzRm9jdXNlZCgpKSB7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IHNlbFN0YXJ0ID0gZ2V0U2VsZWN0aW9uU3RhcnQoKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgc2VsRW5kID0gZ2V0U2VsZWN0aW9uRW5kKCk7CisKKyAgICAgICAgICAgICAgICBtaW4gPSBNYXRoLm1heCgwLCBNYXRoLm1pbihzZWxTdGFydCwgc2VsRW5kKSk7CisgICAgICAgICAgICAgICAgbWF4ID0gTWF0aC5tYXgoMCwgTWF0aC5tYXgoc2VsU3RhcnQsIHNlbEVuZCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKGl0ZW0uZ2V0SXRlbUlkKCkpIHsKKyAgICAgICAgICAgICAgICBjYXNlIElEX1BBU1RFOgorICAgICAgICAgICAgICAgICAgICBDbGlwcGVkRGF0YSBjbGlwID0gY2xpcGJvYXJkLmdldFByaW1hcnlDbGlwKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlwICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZGlkZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxjbGlwLmdldEl0ZW1Db3VudCgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyU2VxdWVuY2UgcGFzdGUgPSBjbGlwLmdldEl0ZW0oaSkuY29lcmNlVG9UZXh0KGdldENvbnRleHQoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhc3RlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFkaWRmaXJzdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0aW9uLnNldFNlbGVjdGlvbigoU3Bhbm5hYmxlKSBtVGV4dCwgbWF4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRWRpdGFibGUpIG1UZXh0KS5yZXBsYWNlKG1pbiwgbWF4LCBwYXN0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEVkaXRhYmxlKSBtVGV4dCkuaW5zZXJ0KGdldFNlbGVjdGlvbkVuZCgpLCAiXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRWRpdGFibGUpIG1UZXh0KS5pbnNlcnQoZ2V0U2VsZWN0aW9uRW5kKCksIHBhc3RlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0b3BTZWxlY3Rpb25BY3Rpb25Nb2RlKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICAgICAgICAgICAgIGNhc2UgSURfQ1VUOgorICAgICAgICAgICAgICAgICAgICBjbGlwYm9hcmQuc2V0UHJpbWFyeUNsaXAobmV3IENsaXBwZWREYXRhKG51bGwsIG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENsaXBwZWREYXRhLkl0ZW0obVRyYW5zZm9ybWVkLnN1YlNlcXVlbmNlKG1pbiwgbWF4KSkpKTsKKyAgICAgICAgICAgICAgICAgICAgKChFZGl0YWJsZSkgbVRleHQpLmRlbGV0ZShtaW4sIG1heCk7CisgICAgICAgICAgICAgICAgICAgIHN0b3BTZWxlY3Rpb25BY3Rpb25Nb2RlKCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworCisgICAgICAgICAgICAgICAgY2FzZSBJRF9DT1BZOgorICAgICAgICAgICAgICAgICAgICBjbGlwYm9hcmQuc2V0UHJpbWFyeUNsaXAobmV3IENsaXBwZWREYXRhKG51bGwsIG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENsaXBwZWREYXRhLkl0ZW0obVRyYW5zZm9ybWVkLnN1YlNlcXVlbmNlKG1pbiwgbWF4KSkpKTsKKyAgICAgICAgICAgICAgICAgICAgc3RvcFNlbGVjdGlvbkFjdGlvbk1vZGUoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkRlc3Ryb3lBY3Rpb25Nb2RlKEFjdGlvbk1vZGUgbW9kZSkgeworICAgICAgICAgICAgU2VsZWN0aW9uLnNldFNlbGVjdGlvbigoU3Bhbm5hYmxlKSBtVGV4dCwgZ2V0U2VsZWN0aW9uU3RhcnQoKSk7CiAgICAgICAgICAgICBpZiAobVNlbGVjdGlvbk1vZGlmaWVyQ3Vyc29yQ29udHJvbGxlciAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgbVNlbGVjdGlvbk1vZGlmaWVyQ3Vyc29yQ29udHJvbGxlci5oaWRlKCk7CiAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1Jc0luVGV4dFNlbGVjdGlvbk1vZGUgPSBmYWxzZTsKKyAgICAgICAgICAgIG1TZWxlY3Rpb25BY3Rpb25Nb2RlID0gbnVsbDsKICAgICAgICAgfQogICAgIH0KIApAQCAtNzUyOCw3ICs3NjQ3LDcgQEAKICAgICAgICAgSGFuZGxlKERyYXdhYmxlIGRyYXdhYmxlKSB7CiAgICAgICAgICAgICBtRHJhd2FibGUgPSBkcmF3YWJsZTsKICAgICAgICAgfQotCisgICAgICAgIAogICAgICAgICB2b2lkIHBvc2l0aW9uQXRDdXJzb3IoZmluYWwgaW50IG9mZnNldCwgYm9vbGVhbiBib3R0b20pIHsKICAgICAgICAgICAgIGZpbmFsIGludCBkcmF3YWJsZVdpZHRoID0gbURyYXdhYmxlLmdldEludHJpbnNpY1dpZHRoKCk7CiAgICAgICAgICAgICBmaW5hbCBpbnQgZHJhd2FibGVIZWlnaHQgPSBtRHJhd2FibGUuZ2V0SW50cmluc2ljSGVpZ2h0KCk7CkBAIC03NTQ4LDcgKzc2NjcsNyBAQAogICAgICAgICAgICAgLy8gRXh0ZW5kIHRvdWNoIHJlZ2lvbiB1cCB3aGVuIGVkaXRpbmcgdGhlIGxhc3QgbGluZSBvZiB0ZXh0IChvciBhIHNpbmdsZSBsaW5lKSBzbyB0aGF0CiAgICAgICAgICAgICAvLyBpdCBpcyBlYXNpZXIgdG8gZ3JhYi4KICAgICAgICAgICAgIGlmIChsaW5lID09IG1MYXlvdXQuZ2V0TGluZUNvdW50KCkgLSAxKSB7Ci0gICAgICAgICAgICAgICAgbVRvcEV4dGVuc2lvbiA9IChsaW5lQm90dG9tIC0gbGluZVRvcCkgLSBkcmF3YWJsZUhlaWdodCAvIDI7CisgICAgICAgICAgICAgICAgICBtVG9wRXh0ZW5zaW9uID0gKGxpbmVCb3R0b20gLSBsaW5lVG9wKSAtIGRyYXdhYmxlSGVpZ2h0IC8gMjsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgYm91bmRzLnJpZ2h0ID0gYm91bmRzLmxlZnQgKyBkcmF3YWJsZVdpZHRoOwpAQCAtNzg0Nyw3ICs3OTY2LDggQEAKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGJvb2xlYW4gb25lTGluZVNlbGVjdGlvbiA9IG1MYXlvdXQuZ2V0TGluZUZvck9mZnNldChzZWxlY3Rpb25TdGFydCkgPT0gbUxheW91dC5nZXRMaW5lRm9yT2Zmc2V0KHNlbGVjdGlvbkVuZCk7IAorICAgICAgICAgICAgYm9vbGVhbiBvbmVMaW5lU2VsZWN0aW9uID0KKyAgICAgICAgICAgICAgICBtTGF5b3V0LmdldExpbmVGb3JPZmZzZXQoc2VsZWN0aW9uU3RhcnQpID09IG1MYXlvdXQuZ2V0TGluZUZvck9mZnNldChzZWxlY3Rpb25FbmQpOwogICAgICAgICAgICAgbVN0YXJ0SGFuZGxlLnBvc2l0aW9uQXRDdXJzb3Ioc2VsZWN0aW9uU3RhcnQsIG9uZUxpbmVTZWxlY3Rpb24pOwogICAgICAgICAgICAgbUVuZEhhbmRsZS5wb3NpdGlvbkF0Q3Vyc29yKHNlbGVjdGlvbkVuZCwgdHJ1ZSk7CiAKQEAgLTc5NDksNyArODA2OSw3IEBACiAKICAgICBwcml2YXRlIHZvaWQgaGlkZUNvbnRyb2xsZXJzKCkgewogICAgICAgICBoaWRlSW5zZXJ0aW9uUG9pbnRDdXJzb3JDb250cm9sbGVyKCk7Ci0gICAgICAgIHN0b3BUZXh0U2VsZWN0aW9uTW9kZSgpOworICAgICAgICBzdG9wU2VsZWN0aW9uQWN0aW9uTW9kZSgpOwogICAgIH0KIAogICAgIHByaXZhdGUgaW50IGdldE9mZnNldEZvckhvcml6b250YWwoaW50IGxpbmUsIGludCB4KSB7CkBAIC04MDEyLDcgKzgxMzIsOCBAQAogICAgICAgICByZXR1cm4gZ2V0T2Zmc2V0Rm9ySG9yaXpvbnRhbChsaW5lLCB4KTsKICAgICB9CiAKLSAgICBAVmlld0RlYnVnLkV4cG9ydGVkUHJvcGVydHkKKworICAgIEBWaWV3RGVidWcuRXhwb3J0ZWRQcm9wZXJ0eShjYXRlZ29yeSA9ICJ0ZXh0IikKICAgICBwcml2YXRlIENoYXJTZXF1ZW5jZSAgICAgICAgICAgIG1UZXh0OwogICAgIHByaXZhdGUgQ2hhclNlcXVlbmNlICAgICAgICAgICAgbVRyYW5zZm9ybWVkOwogICAgIHByaXZhdGUgQnVmZmVyVHlwZSAgICAgICAgICAgICAgbUJ1ZmZlclR5cGUgPSBCdWZmZXJUeXBlLk5PUk1BTDsKQEAgLTgwNDMsOCArODE2NCw4IEBACiAgICAgLy8gQ3Vyc29yIENvbnRyb2xsZXJzLiBOdWxsIHdoZW4gZGlzYWJsZWQuCiAgICAgcHJpdmF0ZSBDdXJzb3JDb250cm9sbGVyICAgICAgICBtSW5zZXJ0aW9uUG9pbnRDdXJzb3JDb250cm9sbGVyOwogICAgIHByaXZhdGUgQ3Vyc29yQ29udHJvbGxlciAgICAgICAgbVNlbGVjdGlvbk1vZGlmaWVyQ3Vyc29yQ29udHJvbGxlcjsKLSAgICBwcml2YXRlIGJvb2xlYW4gICAgICAgICAgICAgICAgIG1TaG91bGRTdGFydFRleHRTZWxlY3Rpb25Nb2RlID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBib29sZWFuICAgICAgICAgICAgICAgICBtSXNJblRleHRTZWxlY3Rpb25Nb2RlID0gZmFsc2U7CisgICAgcHJpdmF0ZSBib29sZWFuICAgICAgICAgICAgICAgICBtU2hvdWxkU3RhcnRTZWxlY3Rpb25BY3Rpb25Nb2RlID0gZmFsc2U7CisgICAgcHJpdmF0ZSBBY3Rpb25Nb2RlICAgICAgICAgICAgICBtU2VsZWN0aW9uQWN0aW9uTW9kZTsKICAgICAvLyBDcmVhdGVkIG9uY2UgYW5kIHNoYXJlZCBieSBkaWZmZXJlbnQgQ3Vyc29yQ29udHJvbGxlciBoZWxwZXIgbWV0aG9kcy4KICAgICAvLyBPbmx5IG9uZSBjdXJzb3IgY29udHJvbGxlciBpcyBhY3RpdmUgYXQgYW55IHRpbWUgd2hpY2ggcHJldmVudCByYWNlIGNvbmRpdGlvbnMuCiAgICAgcHJpdmF0ZSBzdGF0aWMgUmVjdCAgICAgICAgICAgICBzQ3Vyc29yQ29udHJvbGxlclRlbXBSZWN0ID0gbmV3IFJlY3QoKTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9WaWV3QW5pbWF0b3IuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9WaWV3QW5pbWF0b3IuamF2YQppbmRleCA5MDdjZmIzLi43YjY2ODkzIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvVmlld0FuaW1hdG9yLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1ZpZXdBbmltYXRvci5qYXZhCkBAIC0zMSwxMSArMzEsMTMgQEAKICAqCiAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNWaWV3QW5pbWF0b3JfaW5BbmltYXRpb24KICAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI1ZpZXdBbmltYXRvcl9vdXRBbmltYXRpb24KKyAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI1ZpZXdBbmltYXRvcl9hbmltYXRlRmlyc3RWaWV3CiAgKi8KIHB1YmxpYyBjbGFzcyBWaWV3QW5pbWF0b3IgZXh0ZW5kcyBGcmFtZUxheW91dCB7CiAKICAgICBpbnQgbVdoaWNoQ2hpbGQgPSAwOwogICAgIGJvb2xlYW4gbUZpcnN0VGltZSA9IHRydWU7CisKICAgICBib29sZWFuIG1BbmltYXRlRmlyc3RUaW1lID0gdHJ1ZTsKIAogICAgIEFuaW1hdGlvbiBtSW5BbmltYXRpb247CkBAIC01OSw2ICs2MSwxMCBAQAogICAgICAgICBpZiAocmVzb3VyY2UgPiAwKSB7CiAgICAgICAgICAgICBzZXRPdXRBbmltYXRpb24oY29udGV4dCwgcmVzb3VyY2UpOwogICAgICAgICB9CisKKyAgICAgICAgYm9vbGVhbiBmbGFnID0gYS5nZXRCb29sZWFuKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLlZpZXdBbmltYXRvcl9hbmltYXRlRmlyc3RWaWV3LCB0cnVlKTsKKyAgICAgICAgc2V0QW5pbWF0ZUZpcnN0VmlldyhmbGFnKTsKKwogICAgICAgICBhLnJlY3ljbGUoKTsKIAogICAgICAgICBpbml0Vmlld0FuaW1hdG9yKGNvbnRleHQsIGF0dHJzKTsKQEAgLTg0LDEwICs5MCwxMCBAQAogICAgICAgICBzZXRNZWFzdXJlQWxsQ2hpbGRyZW4obWVhc3VyZUFsbENoaWxkcmVuKTsKICAgICAgICAgYS5yZWN5Y2xlKCk7CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogU2V0cyB3aGljaCBjaGlsZCB2aWV3IHdpbGwgYmUgZGlzcGxheWVkLgotICAgICAqIAorICAgICAqCiAgICAgICogQHBhcmFtIHdoaWNoQ2hpbGQgdGhlIGluZGV4IG9mIHRoZSBjaGlsZCB2aWV3IHRvIGRpc3BsYXkKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXREaXNwbGF5ZWRDaGlsZChpbnQgd2hpY2hDaGlsZCkgewpAQCAtMTA1LDE0ICsxMTEsMTQgQEAKICAgICAgICAgICAgIHJlcXVlc3RGb2N1cyhGT0NVU19GT1JXQVJEKTsKICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBjdXJyZW50bHkgZGlzcGxheWVkIGNoaWxkIHZpZXcuCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXREaXNwbGF5ZWRDaGlsZCgpIHsKICAgICAgICAgcmV0dXJuIG1XaGljaENoaWxkOwogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIE1hbnVhbGx5IHNob3dzIHRoZSBuZXh0IGNoaWxkLgogICAgICAqLwpAQCAtMTI4LDYgKzEzNCwzNSBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFNob3dzIG9ubHkgdGhlIHNwZWNpZmllZCBjaGlsZC4gVGhlIG90aGVyIGRpc3BsYXlzIFZpZXdzIGV4aXQgdGhlIHNjcmVlbiwKKyAgICAgKiBvcHRpb25hbGx5IHdpdGggdGhlIHdpdGggdGhlIHtAbGluayAjZ2V0T3V0QW5pbWF0aW9uKCkgb3V0IGFuaW1hdGlvbn0gYW5kCisgICAgICogdGhlIHNwZWNpZmllZCBjaGlsZCBlbnRlcnMgdGhlIHNjcmVlbiwgb3B0aW9uYWxseSB3aXRoIHRoZQorICAgICAqIHtAbGluayAjZ2V0SW5BbmltYXRpb24oKSBpbiBhbmltYXRpb259LgorICAgICAqCisgICAgICogQHBhcmFtIGNoaWxkSW5kZXggVGhlIGluZGV4IG9mIHRoZSBjaGlsZCB0byBiZSBzaG93bi4KKyAgICAgKiBAcGFyYW0gYW5pbWF0ZSBXaGV0aGVyIG9yIG5vdCB0byB1c2UgdGhlIGluIGFuZCBvdXQgYW5pbWF0aW9ucywgZGVmYXVsdHMKKyAgICAgKiAgICAgICAgICAgIHRvIHRydWUuCisgICAgICovCisgICAgdm9pZCBzaG93T25seShpbnQgY2hpbGRJbmRleCwgYm9vbGVhbiBhbmltYXRlKSB7CisgICAgICAgIGZpbmFsIGludCBjb3VudCA9IGdldENoaWxkQ291bnQoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICBmaW5hbCBWaWV3IGNoaWxkID0gZ2V0Q2hpbGRBdChpKTsKKyAgICAgICAgICAgIGlmIChpID09IGNoaWxkSW5kZXgpIHsKKyAgICAgICAgICAgICAgICBpZiAoYW5pbWF0ZSAmJiBtSW5BbmltYXRpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGFydEFuaW1hdGlvbihtSW5BbmltYXRpb24pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjaGlsZC5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgICAgICAgICAgbUZpcnN0VGltZSA9IGZhbHNlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoYW5pbWF0ZSAmJiBtT3V0QW5pbWF0aW9uICE9IG51bGwgJiYgY2hpbGQuZ2V0VmlzaWJpbGl0eSgpID09IFZpZXcuVklTSUJMRSkgeworICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGFydEFuaW1hdGlvbihtT3V0QW5pbWF0aW9uKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoaWxkLmdldEFuaW1hdGlvbigpID09IG1JbkFuaW1hdGlvbikKKyAgICAgICAgICAgICAgICAgICAgY2hpbGQuY2xlYXJBbmltYXRpb24oKTsKKyAgICAgICAgICAgICAgICBjaGlsZC5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgLyoqCiAgICAgICogU2hvd3Mgb25seSB0aGUgc3BlY2lmaWVkIGNoaWxkLiBUaGUgb3RoZXIgZGlzcGxheXMgVmlld3MgZXhpdCB0aGUgc2NyZWVuCiAgICAgICogd2l0aCB0aGUge0BsaW5rICNnZXRPdXRBbmltYXRpb24oKSBvdXQgYW5pbWF0aW9ufSBhbmQgdGhlIHNwZWNpZmllZCBjaGlsZAogICAgICAqIGVudGVycyB0aGUgc2NyZWVuIHdpdGggdGhlIHtAbGluayAjZ2V0SW5BbmltYXRpb24oKSBpbiBhbmltYXRpb259LgpAQCAtMTM1LDI0ICsxNzAsOCBAQAogICAgICAqIEBwYXJhbSBjaGlsZEluZGV4IFRoZSBpbmRleCBvZiB0aGUgY2hpbGQgdG8gYmUgc2hvd24uCiAgICAgICovCiAgICAgdm9pZCBzaG93T25seShpbnQgY2hpbGRJbmRleCkgewotICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBnZXRDaGlsZENvdW50KCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgZmluYWwgVmlldyBjaGlsZCA9IGdldENoaWxkQXQoaSk7Ci0gICAgICAgICAgICBmaW5hbCBib29sZWFuIGNoZWNrRm9yRmlyc3QgPSAoIW1GaXJzdFRpbWUgfHwgbUFuaW1hdGVGaXJzdFRpbWUpOwotICAgICAgICAgICAgaWYgKGkgPT0gY2hpbGRJbmRleCkgewotICAgICAgICAgICAgICAgIGlmIChjaGVja0ZvckZpcnN0ICYmIG1JbkFuaW1hdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0YXJ0QW5pbWF0aW9uKG1JbkFuaW1hdGlvbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNoaWxkLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgICAgICBtRmlyc3RUaW1lID0gZmFsc2U7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChjaGVja0ZvckZpcnN0ICYmIG1PdXRBbmltYXRpb24gIT0gbnVsbCAmJiBjaGlsZC5nZXRWaXNpYmlsaXR5KCkgPT0gVmlldy5WSVNJQkxFKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0YXJ0QW5pbWF0aW9uKG1PdXRBbmltYXRpb24pOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hpbGQuZ2V0QW5pbWF0aW9uKCkgPT0gbUluQW5pbWF0aW9uKQotICAgICAgICAgICAgICAgICAgICBjaGlsZC5jbGVhckFuaW1hdGlvbigpOwotICAgICAgICAgICAgICAgIGNoaWxkLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgICAgICBmaW5hbCBib29sZWFuIGFuaW1hdGUgPSAoIW1GaXJzdFRpbWUgfHwgbUFuaW1hdGVGaXJzdFRpbWUpOworICAgICAgICBzaG93T25seShjaGlsZEluZGV4LCBhbmltYXRlKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9WaWV3RmxpcHBlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1ZpZXdGbGlwcGVyLmphdmEKaW5kZXggODAzNDk2MS4uYzZmNmU4MSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1ZpZXdGbGlwcGVyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1ZpZXdGbGlwcGVyLmphdmEKQEAgLTc1LDcgKzc1LDcgQEAKICAgICAgICAgICAgICAgICB1cGRhdGVSdW5uaW5nKCk7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKEludGVudC5BQ1RJT05fVVNFUl9QUkVTRU5ULmVxdWFscyhhY3Rpb24pKSB7CiAgICAgICAgICAgICAgICAgbVVzZXJQcmVzZW50ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB1cGRhdGVSdW5uaW5nKCk7CisgICAgICAgICAgICAgICAgdXBkYXRlUnVubmluZyhmYWxzZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9OwpAQCAtMTA5LDcgKzEwOSw3IEBACiAgICAgcHJvdGVjdGVkIHZvaWQgb25XaW5kb3dWaXNpYmlsaXR5Q2hhbmdlZChpbnQgdmlzaWJpbGl0eSkgewogICAgICAgICBzdXBlci5vbldpbmRvd1Zpc2liaWxpdHlDaGFuZ2VkKHZpc2liaWxpdHkpOwogICAgICAgICBtVmlzaWJsZSA9IHZpc2liaWxpdHkgPT0gVklTSUJMRTsKLSAgICAgICAgdXBkYXRlUnVubmluZygpOworICAgICAgICB1cGRhdGVSdW5uaW5nKGZhbHNlKTsKICAgICB9CiAKICAgICAvKioKQEAgLTE0NCwxMCArMTQ0LDIyIEBACiAgICAgICogb24ge0BsaW5rICNtUnVubmluZ30gYW5kIHtAbGluayAjbVZpc2libGV9IHN0YXRlLgogICAgICAqLwogICAgIHByaXZhdGUgdm9pZCB1cGRhdGVSdW5uaW5nKCkgeworICAgICAgICB1cGRhdGVSdW5uaW5nKHRydWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEludGVybmFsIG1ldGhvZCB0byBzdGFydCBvciBzdG9wIGRpc3BhdGNoaW5nIGZsaXAge0BsaW5rIE1lc3NhZ2V9IGJhc2VkCisgICAgICogb24ge0BsaW5rICNtUnVubmluZ30gYW5kIHtAbGluayAjbVZpc2libGV9IHN0YXRlLgorICAgICAqCisgICAgICogQHBhcmFtIGZsaXBOb3cgRGV0ZXJtaW5lcyB3aGV0aGVyIG9yIG5vdCB0byBleGVjdXRlIHRoZSBhbmltYXRpb24gbm93LCBpbgorICAgICAqICAgICAgICAgICAgYWRkaXRpb24gdG8gcXVldWluZyBmdXR1cmUgZmxpcHMuIElmIG9taXR0ZWQsIGRlZmF1bHRzIHRvCisgICAgICogICAgICAgICAgICB0cnVlLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCB1cGRhdGVSdW5uaW5nKGJvb2xlYW4gZmxpcE5vdykgewogICAgICAgICBib29sZWFuIHJ1bm5pbmcgPSBtVmlzaWJsZSAmJiBtU3RhcnRlZCAmJiBtVXNlclByZXNlbnQ7CiAgICAgICAgIGlmIChydW5uaW5nICE9IG1SdW5uaW5nKSB7CiAgICAgICAgICAgICBpZiAocnVubmluZykgewotICAgICAgICAgICAgICAgIHNob3dPbmx5KG1XaGljaENoaWxkKTsKKyAgICAgICAgICAgICAgICBzaG93T25seShtV2hpY2hDaGlsZCwgZmxpcE5vdyk7CiAgICAgICAgICAgICAgICAgTWVzc2FnZSBtc2cgPSBtSGFuZGxlci5vYnRhaW5NZXNzYWdlKEZMSVBfTVNHKTsKICAgICAgICAgICAgICAgICBtSGFuZGxlci5zZW5kTWVzc2FnZURlbGF5ZWQobXNnLCBtRmxpcEludGVydmFsKTsKICAgICAgICAgICAgIH0gZWxzZSB7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvWm9vbUJ1dHRvbnNDb250cm9sbGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvWm9vbUJ1dHRvbnNDb250cm9sbGVyLmphdmEKaW5kZXggM2RmNDE5YS4uNDUwYzk2NiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1pvb21CdXR0b25zQ29udHJvbGxlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9ab29tQnV0dG9uc0NvbnRyb2xsZXIuamF2YQpAQCAtNjYsOCArNjYsOSBAQAogICoge0BsaW5rICNzZXRab29tSW5FbmFibGVkKGJvb2xlYW4pfSBhbmQge0BsaW5rICNzZXRab29tT3V0RW5hYmxlZChib29sZWFuKX0uCiAgKiA8cD4KICAqIElmIHlvdSBhcmUgdXNpbmcgdGhpcyB3aXRoIGEgY3VzdG9tIFZpZXcsIHBsZWFzZSBjYWxsCi0gKiB7QGxpbmsgI3NldFZpc2libGUoYm9vbGVhbikgc2V0VmlzaWJsZShmYWxzZSl9IGZyb20gdGhlCi0gKiB7QGxpbmsgVmlldyNvbkRldGFjaGVkRnJvbVdpbmRvd30uCisgKiB7QGxpbmsgI3NldFZpc2libGUoYm9vbGVhbikgc2V0VmlzaWJsZShmYWxzZSl9IGZyb20KKyAqIHtAbGluayBWaWV3I29uRGV0YWNoZWRGcm9tV2luZG93fSBhbmQgZnJvbSB7QGxpbmsgVmlldyNvblZpc2liaWxpdHlDaGFuZ2VkfQorICogd2hlbiA8Y29kZT52aXNpYmlsaXR5ICE9IFZpZXcuVklTSUJMRTwvY29kZT4uCiAgKgogICovCiBwdWJsaWMgY2xhc3MgWm9vbUJ1dHRvbnNDb250cm9sbGVyIGltcGxlbWVudHMgVmlldy5PblRvdWNoTGlzdGVuZXIgewpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL2FwcC9BY3Rpb25CYXJJbXBsLmphdmEgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvYXBwL0FjdGlvbkJhckltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDQ4MzUyCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL2FwcC9BY3Rpb25CYXJJbXBsLmphdmEKQEAgLTAsMCArMSw1OTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLmFwcDsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5NZW51QnVpbGRlcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuTWVudVBvcHVwSGVscGVyOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5TdWJNZW51QnVpbGRlcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuQWN0aW9uQmFyQ29udGV4dFZpZXc7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0LkFjdGlvbkJhclZpZXc7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpb25CYXI7CitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5hcHAuRGlhbG9nOworaW1wb3J0IGFuZHJvaWQuYXBwLkZyYWdtZW50OworaW1wb3J0IGFuZHJvaWQuYXBwLkZyYWdtZW50VHJhbnNhY3Rpb247CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LkFjdGlvbk1vZGU7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnU7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnVJbmZsYXRlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUl0ZW07CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGluZWFyTGF5b3V0OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlNwaW5uZXJBZGFwdGVyOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlZpZXdBbmltYXRvcjsKKworaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCisvKioKKyAqIEFjdGlvbkJhckltcGwgaXMgdGhlIEFjdGlvbkJhciBpbXBsZW1lbnRhdGlvbiB1c2VkCisgKiBieSBkZXZpY2VzIG9mIGFsbCBzY3JlZW4gc2l6ZXMuIElmIGl0IGRldGVjdHMgYSBjb21wYXRpYmxlIGRlY29yLAorICogaXQgd2lsbCBzcGxpdCBjb250ZXh0dWFsIG1vZGVzIGFjcm9zcyBib3RoIHRoZSBBY3Rpb25CYXJWaWV3IGF0CisgKiB0aGUgdG9wIG9mIHRoZSBzY3JlZW4gYW5kIGEgaG9yaXpvbnRhbCBMaW5lYXJMYXlvdXQgYXQgdGhlIGJvdHRvbQorICogd2hpY2ggaXMgbm9ybWFsbHkgaGlkZGVuLgorICovCitwdWJsaWMgY2xhc3MgQWN0aW9uQmFySW1wbCBleHRlbmRzIEFjdGlvbkJhciB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5PUk1BTF9WSUVXID0gMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ09OVEVYVF9WSUVXID0gMTsKKyAgICAKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVEFCX1NXSVRDSF9TSE9XX0hJREUgPSAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUQUJfU1dJVENIX0FERF9SRU1PVkUgPSAxOworCisgICAgcHJpdmF0ZSBDb250ZXh0IG1Db250ZXh0OworICAgIHByaXZhdGUgQWN0aXZpdHkgbUFjdGl2aXR5OworICAgIHByaXZhdGUgRGlhbG9nIG1EaWFsb2c7CisKKyAgICBwcml2YXRlIFZpZXdBbmltYXRvciBtQW5pbWF0b3JWaWV3OworICAgIHByaXZhdGUgQWN0aW9uQmFyVmlldyBtQWN0aW9uVmlldzsKKyAgICBwcml2YXRlIEFjdGlvbkJhckNvbnRleHRWaWV3IG1VcHBlckNvbnRleHRWaWV3OworICAgIHByaXZhdGUgTGluZWFyTGF5b3V0IG1Mb3dlckNvbnRleHRWaWV3OworCisgICAgcHJpdmF0ZSBBcnJheUxpc3Q8VGFiSW1wbD4gbVRhYnMgPSBuZXcgQXJyYXlMaXN0PFRhYkltcGw+KCk7CisKKyAgICBwcml2YXRlIGludCBtVGFiQ29udGFpbmVyVmlld0lkID0gYW5kcm9pZC5SLmlkLmNvbnRlbnQ7CisgICAgcHJpdmF0ZSBUYWJJbXBsIG1TZWxlY3RlZFRhYjsKKyAgICBwcml2YXRlIGludCBtVGFiU3dpdGNoTW9kZSA9IFRBQl9TV0lUQ0hfQUREX1JFTU9WRTsKKyAgICAKKyAgICBwcml2YXRlIEFjdGlvbk1vZGUgbUFjdGlvbk1vZGU7CisgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENPTlRFWFRfRElTUExBWV9OT1JNQUwgPSAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDT05URVhUX0RJU1BMQVlfU1BMSVQgPSAxOworICAgIAorICAgIHByaXZhdGUgaW50IG1Db250ZXh0RGlzcGxheU1vZGU7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gbUNsb3NpbmdDb250ZXh0OworCisgICAgZmluYWwgSGFuZGxlciBtSGFuZGxlciA9IG5ldyBIYW5kbGVyKCk7CisgICAgZmluYWwgUnVubmFibGUgbUNsb3NlQ29udGV4dCA9IG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgbVVwcGVyQ29udGV4dFZpZXcuY2xvc2VNb2RlKCk7CisgICAgICAgICAgICBpZiAobUxvd2VyQ29udGV4dFZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1Mb3dlckNvbnRleHRWaWV3LnJlbW92ZUFsbFZpZXdzKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQ2xvc2luZ0NvbnRleHQgPSBmYWxzZTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBwdWJsaWMgQWN0aW9uQmFySW1wbChBY3Rpdml0eSBhY3Rpdml0eSkgeworICAgICAgICBtQWN0aXZpdHkgPSBhY3Rpdml0eTsKKyAgICAgICAgaW5pdChhY3Rpdml0eS5nZXRXaW5kb3coKS5nZXREZWNvclZpZXcoKSk7CisgICAgfQorCisgICAgcHVibGljIEFjdGlvbkJhckltcGwoRGlhbG9nIGRpYWxvZykgeworICAgICAgICBtRGlhbG9nID0gZGlhbG9nOworICAgICAgICBpbml0KGRpYWxvZy5nZXRXaW5kb3coKS5nZXREZWNvclZpZXcoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGluaXQoVmlldyBkZWNvcikgeworICAgICAgICBtQ29udGV4dCA9IGRlY29yLmdldENvbnRleHQoKTsKKyAgICAgICAgbUFjdGlvblZpZXcgPSAoQWN0aW9uQmFyVmlldykgZGVjb3IuZmluZFZpZXdCeUlkKGNvbS5hbmRyb2lkLmludGVybmFsLlIuaWQuYWN0aW9uX2Jhcik7CisgICAgICAgIG1VcHBlckNvbnRleHRWaWV3ID0gKEFjdGlvbkJhckNvbnRleHRWaWV3KSBkZWNvci5maW5kVmlld0J5SWQoCisgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5pZC5hY3Rpb25fY29udGV4dF9iYXIpOworICAgICAgICBtTG93ZXJDb250ZXh0VmlldyA9IChMaW5lYXJMYXlvdXQpIGRlY29yLmZpbmRWaWV3QnlJZCgKKyAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmlkLmxvd2VyX2FjdGlvbl9jb250ZXh0X2Jhcik7CisgICAgICAgIG1BbmltYXRvclZpZXcgPSAoVmlld0FuaW1hdG9yKSBkZWNvci5maW5kVmlld0J5SWQoCisgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5pZC5hY3Rpb25fYmFyX2FuaW1hdG9yKTsKKworICAgICAgICBpZiAobUFjdGlvblZpZXcgPT0gbnVsbCB8fCBtVXBwZXJDb250ZXh0VmlldyA9PSBudWxsIHx8IG1BbmltYXRvclZpZXcgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihnZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSArICIgY2FuIG9ubHkgYmUgdXNlZCAiICsKKyAgICAgICAgICAgICAgICAgICAgIndpdGggYSBjb21wYXRpYmxlIHdpbmRvdyBkZWNvciBsYXlvdXQiKTsKKyAgICAgICAgfQorCisgICAgICAgIG1BY3Rpb25WaWV3LnNldENvbnRleHRWaWV3KG1VcHBlckNvbnRleHRWaWV3KTsKKyAgICAgICAgbUNvbnRleHREaXNwbGF5TW9kZSA9IG1Mb3dlckNvbnRleHRWaWV3ID09IG51bGwgPworICAgICAgICAgICAgICAgIENPTlRFWFRfRElTUExBWV9OT1JNQUwgOiBDT05URVhUX0RJU1BMQVlfU1BMSVQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0U3RhbmRhcmROYXZpZ2F0aW9uTW9kZShpbnQgdGl0bGVSZXNJZCwgaW50IHN1YnRpdGxlUmVzSWQpIHsKKyAgICAgICAgc2V0U3RhbmRhcmROYXZpZ2F0aW9uTW9kZShtQ29udGV4dC5nZXRTdHJpbmcodGl0bGVSZXNJZCksCisgICAgICAgICAgICAgICAgbUNvbnRleHQuZ2V0U3RyaW5nKHN1YnRpdGxlUmVzSWQpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRTdGFuZGFyZE5hdmlnYXRpb25Nb2RlKGludCB0aXRsZVJlc0lkKSB7CisgICAgICAgIHNldFN0YW5kYXJkTmF2aWdhdGlvbk1vZGUobUNvbnRleHQuZ2V0U3RyaW5nKHRpdGxlUmVzSWQpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRUaXRsZShpbnQgcmVzSWQpIHsKKyAgICAgICAgc2V0VGl0bGUobUNvbnRleHQuZ2V0U3RyaW5nKHJlc0lkKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0U3VidGl0bGUoaW50IHJlc0lkKSB7CisgICAgICAgIHNldFN1YnRpdGxlKG1Db250ZXh0LmdldFN0cmluZyhyZXNJZCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEN1c3RvbU5hdmlnYXRpb25Nb2RlKFZpZXcgdmlldykgeworICAgICAgICBjbGVhbnVwVGFicygpOworICAgICAgICBtQWN0aW9uVmlldy5zZXRDdXN0b21OYXZpZ2F0aW9uVmlldyh2aWV3KTsKKyAgICAgICAgbUFjdGlvblZpZXcuc2V0Q2FsbGJhY2sobnVsbCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RHJvcGRvd25OYXZpZ2F0aW9uTW9kZShTcGlubmVyQWRhcHRlciBhZGFwdGVyLCBOYXZpZ2F0aW9uQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICAgICAgc2V0RHJvcGRvd25OYXZpZ2F0aW9uTW9kZShhZGFwdGVyLCBjYWxsYmFjaywgLTEpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldERyb3Bkb3duTmF2aWdhdGlvbk1vZGUoU3Bpbm5lckFkYXB0ZXIgYWRhcHRlciwgTmF2aWdhdGlvbkNhbGxiYWNrIGNhbGxiYWNrLAorICAgICAgICAgICAgaW50IGRlZmF1bHRTZWxlY3RlZFBvc2l0aW9uKSB7CisgICAgICAgIGNsZWFudXBUYWJzKCk7CisgICAgICAgIG1BY3Rpb25WaWV3LnNldE5hdmlnYXRpb25Nb2RlKE5BVklHQVRJT05fTU9ERV9EUk9QRE9XTl9MSVNUKTsKKyAgICAgICAgbUFjdGlvblZpZXcuc2V0RHJvcGRvd25BZGFwdGVyKGFkYXB0ZXIpOworICAgICAgICBpZiAoZGVmYXVsdFNlbGVjdGVkUG9zaXRpb24gPj0gMCkgeworICAgICAgICAgICAgbUFjdGlvblZpZXcuc2V0RHJvcGRvd25TZWxlY3RlZFBvc2l0aW9uKGRlZmF1bHRTZWxlY3RlZFBvc2l0aW9uKTsKKyAgICAgICAgfQorICAgICAgICBtQWN0aW9uVmlldy5zZXRDYWxsYmFjayhjYWxsYmFjayk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U3RhbmRhcmROYXZpZ2F0aW9uTW9kZSgpIHsKKyAgICAgICAgY2xlYW51cFRhYnMoKTsKKyAgICAgICAgbUFjdGlvblZpZXcuc2V0TmF2aWdhdGlvbk1vZGUoTkFWSUdBVElPTl9NT0RFX1NUQU5EQVJEKTsKKyAgICAgICAgbUFjdGlvblZpZXcuc2V0Q2FsbGJhY2sobnVsbCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U3RhbmRhcmROYXZpZ2F0aW9uTW9kZShDaGFyU2VxdWVuY2UgdGl0bGUpIHsKKyAgICAgICAgY2xlYW51cFRhYnMoKTsKKyAgICAgICAgc2V0U3RhbmRhcmROYXZpZ2F0aW9uTW9kZSh0aXRsZSwgbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U3RhbmRhcmROYXZpZ2F0aW9uTW9kZShDaGFyU2VxdWVuY2UgdGl0bGUsIENoYXJTZXF1ZW5jZSBzdWJ0aXRsZSkgeworICAgICAgICBjbGVhbnVwVGFicygpOworICAgICAgICBtQWN0aW9uVmlldy5zZXROYXZpZ2F0aW9uTW9kZShOQVZJR0FUSU9OX01PREVfU1RBTkRBUkQpOworICAgICAgICBtQWN0aW9uVmlldy5zZXRUaXRsZSh0aXRsZSk7CisgICAgICAgIG1BY3Rpb25WaWV3LnNldFN1YnRpdGxlKHN1YnRpdGxlKTsKKyAgICAgICAgbUFjdGlvblZpZXcuc2V0Q2FsbGJhY2sobnVsbCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U2VsZWN0ZWROYXZpZ2F0aW9uSXRlbShpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgc3dpdGNoIChtQWN0aW9uVmlldy5nZXROYXZpZ2F0aW9uTW9kZSgpKSB7CisgICAgICAgIGNhc2UgTkFWSUdBVElPTl9NT0RFX1RBQlM6CisgICAgICAgICAgICBzZWxlY3RUYWIobVRhYnMuZ2V0KHBvc2l0aW9uKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBOQVZJR0FUSU9OX01PREVfRFJPUERPV05fTElTVDoKKyAgICAgICAgICAgIG1BY3Rpb25WaWV3LnNldERyb3Bkb3duU2VsZWN0ZWRQb3NpdGlvbihwb3NpdGlvbik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJzZXRTZWxlY3RlZE5hdmlnYXRpb25JdGVtIG5vdCB2YWxpZCBmb3IgY3VycmVudCBuYXZpZ2F0aW9uIG1vZGUiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0U2VsZWN0ZWROYXZpZ2F0aW9uSXRlbSgpIHsKKyAgICAgICAgc3dpdGNoIChtQWN0aW9uVmlldy5nZXROYXZpZ2F0aW9uTW9kZSgpKSB7CisgICAgICAgIGNhc2UgTkFWSUdBVElPTl9NT0RFX1RBQlM6CisgICAgICAgICAgICByZXR1cm4gbVNlbGVjdGVkVGFiLmdldFBvc2l0aW9uKCk7CisgICAgICAgIGNhc2UgTkFWSUdBVElPTl9NT0RFX0RST1BET1dOX0xJU1Q6CisgICAgICAgICAgICByZXR1cm4gbUFjdGlvblZpZXcuZ2V0RHJvcGRvd25TZWxlY3RlZFBvc2l0aW9uKCk7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY2xlYW51cFRhYnMoKSB7CisgICAgICAgIGlmIChtU2VsZWN0ZWRUYWIgIT0gbnVsbCkgeworICAgICAgICAgICAgc2VsZWN0VGFiKG51bGwpOworICAgICAgICB9CisgICAgICAgIGlmICghbVRhYnMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBpZiAobVRhYlN3aXRjaE1vZGUgPT0gVEFCX1NXSVRDSF9TSE9XX0hJREUpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBGcmFnbWVudFRyYW5zYWN0aW9uIHRyYW5zID0gbUFjdGl2aXR5Lm9wZW5GcmFnbWVudFRyYW5zYWN0aW9uKCk7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IHRhYkNvdW50ID0gbVRhYnMuc2l6ZSgpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGFiQ291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgICAgICB0cmFucy5yZW1vdmUobVRhYnMuZ2V0KGkpLmdldEZyYWdtZW50KCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0cmFucy5jb21taXQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1UYWJzLmNsZWFyKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRUaXRsZShDaGFyU2VxdWVuY2UgdGl0bGUpIHsKKyAgICAgICAgbUFjdGlvblZpZXcuc2V0VGl0bGUodGl0bGUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFN1YnRpdGxlKENoYXJTZXF1ZW5jZSBzdWJ0aXRsZSkgeworICAgICAgICBtQWN0aW9uVmlldy5zZXRTdWJ0aXRsZShzdWJ0aXRsZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RGlzcGxheU9wdGlvbnMoaW50IG9wdGlvbnMpIHsKKyAgICAgICAgbUFjdGlvblZpZXcuc2V0RGlzcGxheU9wdGlvbnMob3B0aW9ucyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RGlzcGxheU9wdGlvbnMoaW50IG9wdGlvbnMsIGludCBtYXNrKSB7CisgICAgICAgIGZpbmFsIGludCBjdXJyZW50ID0gbUFjdGlvblZpZXcuZ2V0RGlzcGxheU9wdGlvbnMoKTsgCisgICAgICAgIG1BY3Rpb25WaWV3LnNldERpc3BsYXlPcHRpb25zKChvcHRpb25zICYgbWFzaykgfCAoY3VycmVudCAmIH5tYXNrKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0QmFja2dyb3VuZERyYXdhYmxlKERyYXdhYmxlIGQpIHsKKyAgICAgICAgbUFjdGlvblZpZXcuc2V0QmFja2dyb3VuZERyYXdhYmxlKGQpOworICAgIH0KKworICAgIHB1YmxpYyBWaWV3IGdldEN1c3RvbU5hdmlnYXRpb25WaWV3KCkgeworICAgICAgICByZXR1cm4gbUFjdGlvblZpZXcuZ2V0Q3VzdG9tTmF2aWdhdGlvblZpZXcoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2hhclNlcXVlbmNlIGdldFRpdGxlKCkgeworICAgICAgICByZXR1cm4gbUFjdGlvblZpZXcuZ2V0VGl0bGUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2hhclNlcXVlbmNlIGdldFN1YnRpdGxlKCkgeworICAgICAgICByZXR1cm4gbUFjdGlvblZpZXcuZ2V0U3VidGl0bGUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldE5hdmlnYXRpb25Nb2RlKCkgeworICAgICAgICByZXR1cm4gbUFjdGlvblZpZXcuZ2V0TmF2aWdhdGlvbk1vZGUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldERpc3BsYXlPcHRpb25zKCkgeworICAgICAgICByZXR1cm4gbUFjdGlvblZpZXcuZ2V0RGlzcGxheU9wdGlvbnMoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQWN0aW9uTW9kZSBzdGFydEFjdGlvbk1vZGUoQWN0aW9uTW9kZS5DYWxsYmFjayBjYWxsYmFjaykgeworICAgICAgICBpZiAobUFjdGlvbk1vZGUgIT0gbnVsbCkgeworICAgICAgICAgICAgbUFjdGlvbk1vZGUuZmluaXNoKCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBEb24ndCB3YWl0IGZvciB0aGUgY2xvc2UgY29udGV4dCBtb2RlIGFuaW1hdGlvbiB0byBmaW5pc2guCisgICAgICAgIGlmIChtQ2xvc2luZ0NvbnRleHQpIHsKKyAgICAgICAgICAgIG1BbmltYXRvclZpZXcuY2xlYXJBbmltYXRpb24oKTsKKyAgICAgICAgICAgIG1IYW5kbGVyLnJlbW92ZUNhbGxiYWNrcyhtQ2xvc2VDb250ZXh0KTsKKyAgICAgICAgICAgIG1DbG9zZUNvbnRleHQucnVuKCk7CisgICAgICAgIH0KKworICAgICAgICBBY3Rpb25Nb2RlIG1vZGUgPSBuZXcgQWN0aW9uTW9kZUltcGwoY2FsbGJhY2spOworICAgICAgICBpZiAoY2FsbGJhY2sub25DcmVhdGVBY3Rpb25Nb2RlKG1vZGUsIG1vZGUuZ2V0TWVudSgpKSkgeworICAgICAgICAgICAgbW9kZS5pbnZhbGlkYXRlKCk7CisgICAgICAgICAgICBtVXBwZXJDb250ZXh0Vmlldy5pbml0Rm9yTW9kZShtb2RlKTsKKyAgICAgICAgICAgIG1BbmltYXRvclZpZXcuc2V0RGlzcGxheWVkQ2hpbGQoQ09OVEVYVF9WSUVXKTsKKyAgICAgICAgICAgIGlmIChtTG93ZXJDb250ZXh0VmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgLy8gVE9ETyBhbmltYXRlIHRoaXMKKyAgICAgICAgICAgICAgICBtTG93ZXJDb250ZXh0Vmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQWN0aW9uTW9kZSA9IG1vZGU7CisgICAgICAgICAgICByZXR1cm4gbW9kZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY29uZmlndXJlVGFiKFRhYiB0YWIsIGludCBwb3NpdGlvbikgeworICAgICAgICBmaW5hbCBUYWJJbXBsIHRhYmkgPSAoVGFiSW1wbCkgdGFiOworICAgICAgICBmaW5hbCBib29sZWFuIGlzRmlyc3RUYWIgPSBtVGFicy5pc0VtcHR5KCk7CisgICAgICAgIGZpbmFsIEZyYWdtZW50VHJhbnNhY3Rpb24gdHJhbnMgPSBtQWN0aXZpdHkub3BlbkZyYWdtZW50VHJhbnNhY3Rpb24oKTsKKyAgICAgICAgZmluYWwgRnJhZ21lbnQgZnJhZyA9IHRhYmkuZ2V0RnJhZ21lbnQoKTsKKworICAgICAgICB0YWJpLnNldFBvc2l0aW9uKHBvc2l0aW9uKTsKKyAgICAgICAgbVRhYnMuYWRkKHBvc2l0aW9uLCB0YWJpKTsKKworICAgICAgICBpZiAobVRhYlN3aXRjaE1vZGUgPT0gVEFCX1NXSVRDSF9TSE9XX0hJREUpIHsKKyAgICAgICAgICAgIGlmICghZnJhZy5pc0FkZGVkKCkpIHsKKyAgICAgICAgICAgICAgICB0cmFucy5hZGQobVRhYkNvbnRhaW5lclZpZXdJZCwgZnJhZyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoaXNGaXJzdFRhYikgeworICAgICAgICAgICAgaWYgKG1UYWJTd2l0Y2hNb2RlID09IFRBQl9TV0lUQ0hfU0hPV19ISURFKSB7CisgICAgICAgICAgICAgICAgdHJhbnMuc2hvdyhmcmFnKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobVRhYlN3aXRjaE1vZGUgPT0gVEFCX1NXSVRDSF9BRERfUkVNT1ZFKSB7CisgICAgICAgICAgICAgICAgdHJhbnMuYWRkKG1UYWJDb250YWluZXJWaWV3SWQsIGZyYWcpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVNlbGVjdGVkVGFiID0gdGFiaTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChtVGFiU3dpdGNoTW9kZSA9PSBUQUJfU1dJVENIX1NIT1dfSElERSkgeworICAgICAgICAgICAgICAgIHRyYW5zLmhpZGUoZnJhZyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdHJhbnMuY29tbWl0KCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgYWRkVGFiKFRhYiB0YWIpIHsKKyAgICAgICAgbUFjdGlvblZpZXcuYWRkVGFiKHRhYik7CisgICAgICAgIGNvbmZpZ3VyZVRhYih0YWIsIG1UYWJzLnNpemUoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgaW5zZXJ0VGFiKFRhYiB0YWIsIGludCBwb3NpdGlvbikgeworICAgICAgICBtQWN0aW9uVmlldy5pbnNlcnRUYWIodGFiLCBwb3NpdGlvbik7CisgICAgICAgIGNvbmZpZ3VyZVRhYih0YWIsIHBvc2l0aW9uKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVGFiIG5ld1RhYigpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBUYWJJbXBsKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcmVtb3ZlVGFiKFRhYiB0YWIpIHsKKyAgICAgICAgcmVtb3ZlVGFiQXQodGFiLmdldFBvc2l0aW9uKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHJlbW92ZVRhYkF0KGludCBwb3NpdGlvbikgeworICAgICAgICBtQWN0aW9uVmlldy5yZW1vdmVUYWJBdChwb3NpdGlvbik7CisgICAgICAgIG1UYWJzLnJlbW92ZShwb3NpdGlvbik7CisKKyAgICAgICAgZmluYWwgaW50IG5ld1RhYkNvdW50ID0gbVRhYnMuc2l6ZSgpOworICAgICAgICBmb3IgKGludCBpID0gcG9zaXRpb247IGkgPCBuZXdUYWJDb3VudDsgaSsrKSB7CisgICAgICAgICAgICBtVGFicy5nZXQoaSkuc2V0UG9zaXRpb24oaSk7CisgICAgICAgIH0KKworICAgICAgICBzZWxlY3RUYWIobVRhYnMuaXNFbXB0eSgpID8gbnVsbCA6IG1UYWJzLmdldChNYXRoLm1heCgwLCBwb3NpdGlvbiAtIDEpKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0VGFiTmF2aWdhdGlvbk1vZGUoKSB7CisgICAgICAgIGlmIChtQWN0aXZpdHkgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIlRhYiBuYXZpZ2F0aW9uIG1vZGUgY2Fubm90IGJlIHVzZWQgb3V0c2lkZSBvZiBhbiBBY3Rpdml0eSIpOworICAgICAgICB9CisgICAgICAgIG1BY3Rpb25WaWV3LnNldE5hdmlnYXRpb25Nb2RlKE5BVklHQVRJT05fTU9ERV9UQUJTKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRUYWJOYXZpZ2F0aW9uTW9kZShpbnQgY29udGFpbmVyVmlld0lkKSB7CisgICAgICAgIG1UYWJDb250YWluZXJWaWV3SWQgPSBjb250YWluZXJWaWV3SWQ7CisgICAgICAgIHNldFRhYk5hdmlnYXRpb25Nb2RlKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2VsZWN0VGFiKFRhYiB0YWIpIHsKKyAgICAgICAgaWYgKG1TZWxlY3RlZFRhYiA9PSB0YWIpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIG1BY3Rpb25WaWV3LnNldFRhYlNlbGVjdGVkKHRhYiAhPSBudWxsID8gdGFiLmdldFBvc2l0aW9uKCkgOiBUYWIuSU5WQUxJRF9QT1NJVElPTik7CisgICAgICAgIGZpbmFsIEZyYWdtZW50VHJhbnNhY3Rpb24gdHJhbnMgPSBtQWN0aXZpdHkub3BlbkZyYWdtZW50VHJhbnNhY3Rpb24oKTsKKyAgICAgICAgaWYgKG1TZWxlY3RlZFRhYiAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAobVRhYlN3aXRjaE1vZGUgPT0gVEFCX1NXSVRDSF9TSE9XX0hJREUpIHsKKyAgICAgICAgICAgICAgICB0cmFucy5oaWRlKG1TZWxlY3RlZFRhYi5nZXRGcmFnbWVudCgpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobVRhYlN3aXRjaE1vZGUgPT0gVEFCX1NXSVRDSF9BRERfUkVNT1ZFKSB7CisgICAgICAgICAgICAgICAgdHJhbnMucmVtb3ZlKG1TZWxlY3RlZFRhYi5nZXRGcmFnbWVudCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAodGFiICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChtVGFiU3dpdGNoTW9kZSA9PSBUQUJfU1dJVENIX1NIT1dfSElERSkgeworICAgICAgICAgICAgICAgIHRyYW5zLnNob3codGFiLmdldEZyYWdtZW50KCkpOworICAgICAgICAgICAgfSBlbHNlIGlmIChtVGFiU3dpdGNoTW9kZSA9PSBUQUJfU1dJVENIX0FERF9SRU1PVkUpIHsKKyAgICAgICAgICAgICAgICB0cmFucy5hZGQobVRhYkNvbnRhaW5lclZpZXdJZCwgdGFiLmdldEZyYWdtZW50KCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1TZWxlY3RlZFRhYiA9IChUYWJJbXBsKSB0YWI7CisgICAgICAgIHRyYW5zLmNvbW1pdCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgZ2V0SGVpZ2h0KCkgeworICAgICAgICByZXR1cm4gbUFjdGlvblZpZXcuZ2V0SGVpZ2h0KCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2hvdygpIHsKKyAgICAgICAgLy8gVE9ETyBhbmltYXRlIQorICAgICAgICBtQW5pbWF0b3JWaWV3LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBoaWRlKCkgeworICAgICAgICAvLyBUT0RPIGFuaW1hdGUhCisgICAgICAgIG1BbmltYXRvclZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzU2hvd2luZygpIHsKKyAgICAgICAgcmV0dXJuIG1BbmltYXRvclZpZXcuZ2V0VmlzaWJpbGl0eSgpID09IFZpZXcuVklTSUJMRTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAaGlkZSAKKyAgICAgKi8KKyAgICBwdWJsaWMgY2xhc3MgQWN0aW9uTW9kZUltcGwgZXh0ZW5kcyBBY3Rpb25Nb2RlIGltcGxlbWVudHMgTWVudUJ1aWxkZXIuQ2FsbGJhY2sgeworICAgICAgICBwcml2YXRlIEFjdGlvbk1vZGUuQ2FsbGJhY2sgbUNhbGxiYWNrOworICAgICAgICBwcml2YXRlIE1lbnVCdWlsZGVyIG1NZW51OworICAgICAgICBwcml2YXRlIFdlYWtSZWZlcmVuY2U8Vmlldz4gbUN1c3RvbVZpZXc7CisgICAgICAgIAorICAgICAgICBwdWJsaWMgQWN0aW9uTW9kZUltcGwoQWN0aW9uTW9kZS5DYWxsYmFjayBjYWxsYmFjaykgeworICAgICAgICAgICAgbUNhbGxiYWNrID0gY2FsbGJhY2s7CisgICAgICAgICAgICBtTWVudSA9IG5ldyBNZW51QnVpbGRlcihtQWN0aW9uVmlldy5nZXRDb250ZXh0KCkpCisgICAgICAgICAgICAgICAgICAgIC5zZXREZWZhdWx0U2hvd0FzQWN0aW9uKE1lbnVJdGVtLlNIT1dfQVNfQUNUSU9OX0lGX1JPT00pOworICAgICAgICAgICAgbU1lbnUuc2V0Q2FsbGJhY2sodGhpcyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIE1lbnVJbmZsYXRlciBnZXRNZW51SW5mbGF0ZXIoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IE1lbnVJbmZsYXRlcihtQ29udGV4dCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIE1lbnUgZ2V0TWVudSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtTWVudTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBmaW5pc2goKSB7CisgICAgICAgICAgICBpZiAobUFjdGlvbk1vZGUgIT0gdGhpcykgeworICAgICAgICAgICAgICAgIC8vIE5vdCB0aGUgYWN0aXZlIGFjdGlvbiBtb2RlIC0gbm8tb3AKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1DYWxsYmFjay5vbkRlc3Ryb3lBY3Rpb25Nb2RlKHRoaXMpOworICAgICAgICAgICAgbUFuaW1hdG9yVmlldy5zZXREaXNwbGF5ZWRDaGlsZChOT1JNQUxfVklFVyk7CisKKyAgICAgICAgICAgIC8vIENsZWFyIG91dCB0aGUgY29udGV4dCBtb2RlIHZpZXdzIGFmdGVyIHRoZSBhbmltYXRpb24gZmluaXNoZXMKKyAgICAgICAgICAgIG1DbG9zaW5nQ29udGV4dCA9IHRydWU7CisgICAgICAgICAgICBtSGFuZGxlci5wb3N0RGVsYXllZChtQ2xvc2VDb250ZXh0LCBtQW5pbWF0b3JWaWV3LmdldE91dEFuaW1hdGlvbigpLmdldER1cmF0aW9uKCkpOworCisgICAgICAgICAgICBpZiAobUxvd2VyQ29udGV4dFZpZXcgIT0gbnVsbCAmJiBtTG93ZXJDb250ZXh0Vmlldy5nZXRWaXNpYmlsaXR5KCkgIT0gVmlldy5HT05FKSB7CisgICAgICAgICAgICAgICAgLy8gVE9ETyBBbmltYXRlIHRoaXMKKyAgICAgICAgICAgICAgICBtTG93ZXJDb250ZXh0Vmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQWN0aW9uTW9kZSA9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgaW52YWxpZGF0ZSgpIHsKKyAgICAgICAgICAgIGlmIChtQ2FsbGJhY2sub25QcmVwYXJlQWN0aW9uTW9kZSh0aGlzLCBtTWVudSkpIHsKKyAgICAgICAgICAgICAgICAvLyBSZWZyZXNoIGNvbnRlbnQgaW4gYm90aCBjb250ZXh0IHZpZXdzCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2V0Q3VzdG9tVmlldyhWaWV3IHZpZXcpIHsKKyAgICAgICAgICAgIG1VcHBlckNvbnRleHRWaWV3LnNldEN1c3RvbVZpZXcodmlldyk7CisgICAgICAgICAgICBtQ3VzdG9tVmlldyA9IG5ldyBXZWFrUmVmZXJlbmNlPFZpZXc+KHZpZXcpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFN1YnRpdGxlKENoYXJTZXF1ZW5jZSBzdWJ0aXRsZSkgeworICAgICAgICAgICAgbVVwcGVyQ29udGV4dFZpZXcuc2V0U3VidGl0bGUoc3VidGl0bGUpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFRpdGxlKENoYXJTZXF1ZW5jZSB0aXRsZSkgeworICAgICAgICAgICAgbVVwcGVyQ29udGV4dFZpZXcuc2V0VGl0bGUodGl0bGUpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFRpdGxlKGludCByZXNJZCkgeworICAgICAgICAgICAgc2V0VGl0bGUobUFjdGl2aXR5LmdldFN0cmluZyhyZXNJZCkpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFN1YnRpdGxlKGludCByZXNJZCkgeworICAgICAgICAgICAgc2V0U3VidGl0bGUobUFjdGl2aXR5LmdldFN0cmluZyhyZXNJZCkpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBDaGFyU2VxdWVuY2UgZ2V0VGl0bGUoKSB7CisgICAgICAgICAgICByZXR1cm4gbVVwcGVyQ29udGV4dFZpZXcuZ2V0VGl0bGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQ2hhclNlcXVlbmNlIGdldFN1YnRpdGxlKCkgeworICAgICAgICAgICAgcmV0dXJuIG1VcHBlckNvbnRleHRWaWV3LmdldFN1YnRpdGxlKCk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgVmlldyBnZXRDdXN0b21WaWV3KCkgeworICAgICAgICAgICAgcmV0dXJuIG1DdXN0b21WaWV3ICE9IG51bGwgPyBtQ3VzdG9tVmlldy5nZXQoKSA6IG51bGw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbk1lbnVJdGVtU2VsZWN0ZWQoTWVudUJ1aWxkZXIgbWVudSwgTWVudUl0ZW0gaXRlbSkgeworICAgICAgICAgICAgcmV0dXJuIG1DYWxsYmFjay5vbkFjdGlvbkl0ZW1DbGlja2VkKHRoaXMsIGl0ZW0pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgb25DbG9zZU1lbnUoTWVudUJ1aWxkZXIgbWVudSwgYm9vbGVhbiBhbGxNZW51c0FyZUNsb3NpbmcpIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIG9uU3ViTWVudVNlbGVjdGVkKFN1Yk1lbnVCdWlsZGVyIHN1Yk1lbnUpIHsKKyAgICAgICAgICAgIGlmICghc3ViTWVudS5oYXNWaXNpYmxlSXRlbXMoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBuZXcgTWVudVBvcHVwSGVscGVyKG1Db250ZXh0LCBzdWJNZW51KS5zaG93KCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xvc2VTdWJNZW51KFN1Yk1lbnVCdWlsZGVyIG1lbnUpIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG9uTWVudU1vZGVDaGFuZ2UoTWVudUJ1aWxkZXIgbWVudSkgeworICAgICAgICAgICAgaW52YWxpZGF0ZSgpOworICAgICAgICAgICAgbVVwcGVyQ29udGV4dFZpZXcuc2hvd092ZXJmbG93TWVudSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgY2xhc3MgVGFiSW1wbCBleHRlbmRzIEFjdGlvbkJhci5UYWIgeworICAgICAgICBwcml2YXRlIEZyYWdtZW50IG1GcmFnbWVudDsKKyAgICAgICAgcHJpdmF0ZSBEcmF3YWJsZSBtSWNvbjsKKyAgICAgICAgcHJpdmF0ZSBDaGFyU2VxdWVuY2UgbVRleHQ7CisgICAgICAgIHByaXZhdGUgaW50IG1Qb3NpdGlvbjsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEZyYWdtZW50IGdldEZyYWdtZW50KCkgeworICAgICAgICAgICAgcmV0dXJuIG1GcmFnbWVudDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgRHJhd2FibGUgZ2V0SWNvbigpIHsKKyAgICAgICAgICAgIHJldHVybiBtSWNvbjsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGdldFBvc2l0aW9uKCkgeworICAgICAgICAgICAgcmV0dXJuIG1Qb3NpdGlvbjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFBvc2l0aW9uKGludCBwb3NpdGlvbikgeworICAgICAgICAgICAgbVBvc2l0aW9uID0gcG9zaXRpb247CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXRUZXh0KCkgeworICAgICAgICAgICAgcmV0dXJuIG1UZXh0OworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHNldEZyYWdtZW50KEZyYWdtZW50IGZyYWdtZW50KSB7CisgICAgICAgICAgICBtRnJhZ21lbnQgPSBmcmFnbWVudDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzZXRJY29uKERyYXdhYmxlIGljb24pIHsKKyAgICAgICAgICAgIG1JY29uID0gaWNvbjsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzZXRUZXh0KENoYXJTZXF1ZW5jZSB0ZXh0KSB7CisgICAgICAgICAgICBtVGV4dCA9IHRleHQ7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2VsZWN0KCkgeworICAgICAgICAgICAgc2VsZWN0VGFiKHRoaXMpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL2FwcHdpZGdldC9JQXBwV2lkZ2V0SG9zdC5haWRsIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL2FwcHdpZGdldC9JQXBwV2lkZ2V0SG9zdC5haWRsCmluZGV4IDJlZDQ3NzMuLjIxNmQ5ODUgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9hcHB3aWRnZXQvSUFwcFdpZGdldEhvc3QuYWlkbAorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvYXBwd2lkZ2V0L0lBcHBXaWRnZXRIb3N0LmFpZGwKQEAgLTI0LDUgKzI0LDYgQEAKIG9uZXdheSBpbnRlcmZhY2UgSUFwcFdpZGdldEhvc3QgewogICAgIHZvaWQgdXBkYXRlQXBwV2lkZ2V0KGludCBhcHBXaWRnZXRJZCwgaW4gUmVtb3RlVmlld3Mgdmlld3MpOwogICAgIHZvaWQgcHJvdmlkZXJDaGFuZ2VkKGludCBhcHBXaWRnZXRJZCwgaW4gQXBwV2lkZ2V0UHJvdmlkZXJJbmZvIGluZm8pOworICAgIHZvaWQgdmlld0RhdGFDaGFuZ2VkKGludCBhcHBXaWRnZXRJZCwgaW50IHZpZXdJZCk7CiB9CiAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9hcHB3aWRnZXQvSUFwcFdpZGdldFNlcnZpY2UuYWlkbCBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9hcHB3aWRnZXQvSUFwcFdpZGdldFNlcnZpY2UuYWlkbAppbmRleCA0OTZhYTFhLi40ZDU2NzQ1IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvYXBwd2lkZ2V0L0lBcHBXaWRnZXRTZXJ2aWNlLmFpZGwKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL2FwcHdpZGdldC9JQXBwV2lkZ2V0U2VydmljZS5haWRsCkBAIC00MCw3ICs0MCw5IEBACiAgICAgLy8gZm9yIEFwcFdpZGdldE1hbmFnZXIKICAgICAvLwogICAgIHZvaWQgdXBkYXRlQXBwV2lkZ2V0SWRzKGluIGludFtdIGFwcFdpZGdldElkcywgaW4gUmVtb3RlVmlld3Mgdmlld3MpOworICAgIHZvaWQgcGFydGlhbGx5VXBkYXRlQXBwV2lkZ2V0SWRzKGluIGludFtdIGFwcFdpZGdldElkcywgaW4gUmVtb3RlVmlld3Mgdmlld3MpOwogICAgIHZvaWQgdXBkYXRlQXBwV2lkZ2V0UHJvdmlkZXIoaW4gQ29tcG9uZW50TmFtZSBwcm92aWRlciwgaW4gUmVtb3RlVmlld3Mgdmlld3MpOworICAgIHZvaWQgbm90aWZ5QXBwV2lkZ2V0Vmlld0RhdGFDaGFuZ2VkKGluIGludFtdIGFwcFdpZGdldElkcywgaW50IHZpZXdJZCk7CiAgICAgTGlzdDxBcHBXaWRnZXRQcm92aWRlckluZm8+IGdldEluc3RhbGxlZFByb3ZpZGVycygpOwogICAgIEFwcFdpZGdldFByb3ZpZGVySW5mbyBnZXRBcHBXaWRnZXRJbmZvKGludCBhcHBXaWRnZXRJZCk7CiAgICAgdm9pZCBiaW5kQXBwV2lkZ2V0SWQoaW50IGFwcFdpZGdldElkLCBpbiBDb21wb25lbnROYW1lIHByb3ZpZGVyKTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9kYXRhYmFzZS9Tb3J0Q3Vyc29yLmphdmEgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvZGF0YWJhc2UvU29ydEN1cnNvci5qYXZhCmluZGV4IDk5NDEwYmMuLjAwMjU1MTIgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9kYXRhYmFzZS9Tb3J0Q3Vyc29yLmphdmEKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL2RhdGFiYXNlL1NvcnRDdXJzb3IuamF2YQpAQCAtMTgyLDI0ICsxODIsNiBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGRlbGV0ZVJvdygpCi0gICAgewotICAgICAgICByZXR1cm4gbUN1cnNvci5kZWxldGVSb3coKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBjb21taXRVcGRhdGVzKCkgewotICAgICAgICBpbnQgbGVuZ3RoID0gbUN1cnNvcnMubGVuZ3RoOwotICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCBsZW5ndGggOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChtQ3Vyc29yc1tpXSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUN1cnNvcnNbaV0uY29tbWl0VXBkYXRlcygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG9uQ2hhbmdlKHRydWUpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhpbnQgY29sdW1uKQogICAgIHsKICAgICAgICAgcmV0dXJuIG1DdXJzb3IuZ2V0U3RyaW5nKGNvbHVtbik7CkBAIC0yMzYsNiArMjE4LDExIEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBnZXRUeXBlKGludCBjb2x1bW4pIHsKKyAgICAgICAgcmV0dXJuIG1DdXJzb3IuZ2V0VHlwZShjb2x1bW4pOworICAgIH0KKworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGlzTnVsbChpbnQgY29sdW1uKQogICAgIHsKICAgICAgICAgcmV0dXJuIG1DdXJzb3IuaXNOdWxsKGNvbHVtbik7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvb3MvUnVudGltZUluaXQuamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9vcy9SdW50aW1lSW5pdC5qYXZhCmluZGV4IDU5NjAwZGMuLjU3Njc4MzIgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9vcy9SdW50aW1lSW5pdC5qYXZhCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9vcy9SdW50aW1lSW5pdC5qYXZhCkBAIC0yNCw2ICsyNCw3IEBACiBpbXBvcnQgYW5kcm9pZC5vcy5Qcm9jZXNzOwogaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtUHJvcGVydGllczsKIGltcG9ydCBhbmRyb2lkLnV0aWwuQ29uZmlnOworaW1wb3J0IGFuZHJvaWQudXRpbC5GaW5hbGl6ZXJzOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlNsb2c7CiAKQEAgLTE0MSw2ICsxNDIsMTIgQEAKICAgICAgICAgICAgIERlYnVnLmVuYWJsZUVtdWxhdG9yVHJhY2VPdXRwdXQoKTsKICAgICAgICAgfQogCisgICAgICAgIC8qKgorICAgICAgICAgKiBJbml0aWFsaXplIHRoZSB0aHJlYWQgdXNlZCB0byByZWNsYWltIHJlc291cmNlcyB3aXRob3V0CisgICAgICAgICAqIGdvaW5nIHRocm91Z2ggZmluYWxpemVycy4KKyAgICAgICAgICovCisgICAgICAgIEZpbmFsaXplcnMuaW5pdCgpOworCiAgICAgICAgIGluaXRpYWxpemVkID0gdHJ1ZTsKICAgICB9CiAKQEAgLTMzMSw5ICszMzgsNiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgLyoqIENvdW50ZXIgdXNlZCB0byBwcmV2ZW50IHJlZW50cmFuY3kgaW4ge0BsaW5rICNyZXBvcnRFeGNlcHRpb259LiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEF0b21pY0ludGVnZXIgc0luUmVwb3J0RXhjZXB0aW9uID0gbmV3IEF0b21pY0ludGVnZXIoKTsKLQogICAgIC8qKgogICAgICAqIFNldCB0aGUgb2JqZWN0IGlkZW50aWZ5aW5nIHRoaXMgYXBwbGljYXRpb24vcHJvY2VzcywgZm9yIHJlcG9ydGluZyBWTQogICAgICAqIGVycm9ycy4KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9vcy9TYW1wbGluZ1Byb2ZpbGVySW50ZWdyYXRpb24uamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9vcy9TYW1wbGluZ1Byb2ZpbGVySW50ZWdyYXRpb24uamF2YQppbmRleCAxMjdmYjIzLi4zODM2MmMxIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvb3MvU2FtcGxpbmdQcm9maWxlckludGVncmF0aW9uLmphdmEKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL29zL1NhbXBsaW5nUHJvZmlsZXJJbnRlZ3JhdGlvbi5qYXZhCkBAIC0xNiwxNCArMTYsMTUgQEAKIAogcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC5vczsKIAoraW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlSW5mbzsKIGltcG9ydCBkYWx2aWsuc3lzdGVtLlNhbXBsaW5nUHJvZmlsZXI7CiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3I7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JzOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNCb29sZWFuOwogCiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIGltcG9ydCBhbmRyb2lkLm9zLio7CkBAIC0zNSwxNSArMzYsMjcgQEAKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiU2FtcGxpbmdQcm9maWxlckludGVncmF0aW9uIjsKIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNOQVBTSE9UX0RJUiA9ICIvZGF0YS9zbmFwc2hvdHMiOworCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBlbmFibGVkOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEV4ZWN1dG9yIHNuYXBzaG90V3JpdGVyOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBzYW1wbGluZ1Byb2ZpbGVySHo7CisgICAgCisgICAgLyoqIFdoZXRoZXIgb3Igbm90IHdlJ3ZlIGNyZWF0ZWQgdGhlIHNuYXBzaG90cyBkaXIuICovCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBkaXJNYWRlID0gZmFsc2U7CisKKyAgICAvKiogV2hldGhlciBvciBub3QgYSBzbmFwc2hvdCBpcyBiZWluZyBwZXJzaXN0ZWQuICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQXRvbWljQm9vbGVhbiBwZW5kaW5nID0gbmV3IEF0b21pY0Jvb2xlYW4oZmFsc2UpOworCiAgICAgc3RhdGljIHsKLSAgICAgICAgZW5hYmxlZCA9ICIxIi5lcXVhbHMoU3lzdGVtUHJvcGVydGllcy5nZXQoInBlcnNpc3Quc2FtcGxpbmdfcHJvZmlsZXIiKSk7Ci0gICAgICAgIGlmIChlbmFibGVkKSB7CisgICAgICAgIHNhbXBsaW5nUHJvZmlsZXJIeiA9IFN5c3RlbVByb3BlcnRpZXMuZ2V0SW50KCJwZXJzaXN0LnN5cy5wcm9maWxlcl9oeiIsIDApOworICAgICAgICBpZiAoc2FtcGxpbmdQcm9maWxlckh6ID4gMCkgewogICAgICAgICAgICAgc25hcHNob3RXcml0ZXIgPSBFeGVjdXRvcnMubmV3U2luZ2xlVGhyZWFkRXhlY3V0b3IoKTsKLSAgICAgICAgICAgIExvZy5pKFRBRywgIlByb2ZpbGVyIGlzIGVuYWJsZWQuIik7CisgICAgICAgICAgICBlbmFibGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIExvZy5pKFRBRywgIlByb2ZpbGVyIGlzIGVuYWJsZWQuIFNhbXBsaW5nIFByb2ZpbGVyIEh6OiAiICsgc2FtcGxpbmdQcm9maWxlckh6KTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHNuYXBzaG90V3JpdGVyID0gbnVsbDsKKyAgICAgICAgICAgIGVuYWJsZWQgPSBmYWxzZTsKICAgICAgICAgICAgIExvZy5pKFRBRywgIlByb2ZpbGVyIGlzIGRpc2FibGVkLiIpOwogICAgICAgICB9CiAgICAgfQpAQCAtNjAsNDYgKzczLDQ1IEBACiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIHN0YXJ0KCkgewogICAgICAgICBpZiAoIWVuYWJsZWQpIHJldHVybjsKLSAgICAgICAgU2FtcGxpbmdQcm9maWxlci5nZXRJbnN0YW5jZSgpLnN0YXJ0KDEwKTsKKyAgICAgICAgU2FtcGxpbmdQcm9maWxlci5nZXRJbnN0YW5jZSgpLnN0YXJ0KHNhbXBsaW5nUHJvZmlsZXJIeik7CiAgICAgfQogCi0gICAgLyoqIFdoZXRoZXIgb3Igbm90IHdlJ3ZlIGNyZWF0ZWQgdGhlIHNuYXBzaG90cyBkaXIuICovCi0gICAgc3RhdGljIGJvb2xlYW4gZGlyTWFkZSA9IGZhbHNlOwotCi0gICAgLyoqIFdoZXRoZXIgb3Igbm90IGEgc25hcHNob3QgaXMgYmVpbmcgcGVyc2lzdGVkLiAqLwotICAgIHN0YXRpYyB2b2xhdGlsZSBib29sZWFuIHBlbmRpbmc7Ci0KICAgICAvKioKLSAgICAgKiBXcml0ZXMgYSBzbmFwc2hvdCB0byB0aGUgU0QgY2FyZCBpZiBwcm9maWxpbmcgaXMgZW5hYmxlZC4KKyAgICAgKiBXcml0ZXMgYSBzbmFwc2hvdCBpZiBwcm9maWxpbmcgaXMgZW5hYmxlZC4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVTbmFwc2hvdChmaW5hbCBTdHJpbmcgbmFtZSkgeworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZVNuYXBzaG90KGZpbmFsIFN0cmluZyBwcm9jZXNzTmFtZSwgZmluYWwgUGFja2FnZUluZm8gcGFja2FnZUluZm8pIHsKICAgICAgICAgaWYgKCFlbmFibGVkKSByZXR1cm47CiAKICAgICAgICAgLyoKLSAgICAgICAgICogSWYgd2UncmUgYWxyZWFkeSB3cml0aW5nIGEgc25hcHNob3QsIGRvbid0IGJvdGhlciBlbnF1ZWluZyBhbm90aGVyCisgICAgICAgICAqIElmIHdlJ3JlIGFscmVhZHkgd3JpdGluZyBhIHNuYXBzaG90LCBkb24ndCBib3RoZXIgZW5xdWV1ZWluZyBhbm90aGVyCiAgICAgICAgICAqIHJlcXVlc3QgcmlnaHQgbm93LiBUaGlzIHdpbGwgcmVkdWNlIHRoZSBudW1iZXIgb2YgaW5kaXZpZHVhbAogICAgICAgICAgKiBzbmFwc2hvdHMgYW5kIGluIHR1cm4gdGhlIHRvdGFsIGFtb3VudCBvZiBtZW1vcnkgY29uc3VtZWQgKG9uZSBiaWcKICAgICAgICAgICogc25hcHNob3QgaXMgc21hbGxlciB0aGFuIE4gc3Vic2V0IHNuYXBzaG90cykuCiAgICAgICAgICAqLwotICAgICAgICBpZiAoIXBlbmRpbmcpIHsKLSAgICAgICAgICAgIHBlbmRpbmcgPSB0cnVlOworICAgICAgICBpZiAocGVuZGluZy5jb21wYXJlQW5kU2V0KGZhbHNlLCB0cnVlKSkgewogICAgICAgICAgICAgc25hcHNob3RXcml0ZXIuZXhlY3V0ZShuZXcgUnVubmFibGUoKSB7CiAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZGlyID0KLSAgICAgICAgICAgICAgICAgICAgICAgIEVudmlyb25tZW50LmdldEV4dGVybmFsU3RvcmFnZURpcmVjdG9yeSgpLmdldFBhdGgoKSArICIvc25hcHNob3RzIjsKICAgICAgICAgICAgICAgICAgICAgaWYgKCFkaXJNYWRlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgRmlsZShkaXIpLm1rZGlycygpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ldyBGaWxlKGRpcikuaXNEaXJlY3RvcnkoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgRmlsZSBkaXIgPSBuZXcgRmlsZShTTkFQU0hPVF9ESVIpOworICAgICAgICAgICAgICAgICAgICAgICAgZGlyLm1rZGlycygpOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGRpcmVjdG9yeSBuZWVkcyB0byBiZSB3cml0YWJsZSB0byBhbnlib2R5CisgICAgICAgICAgICAgICAgICAgICAgICBkaXIuc2V0V3JpdGFibGUodHJ1ZSwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGRpcmVjdG9yeSBuZWVkcyB0byBiZSBleGVjdXRhYmxlIHRvIGFueWJvZHkKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvbid0IGtub3cgd2h5IHlldCwgYnV0IG1vZGUgNzIzIHdvdWxkIHdvcmssIHdoaWxlCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBtb2RlIDcyMiB0aHJvd3MgRmlsZU5vdEZvdW5kRXhlY3B0aW9uIGF0IGxpbmUgMTUxCisgICAgICAgICAgICAgICAgICAgICAgICBkaXIuc2V0RXhlY3V0YWJsZSh0cnVlLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3IEZpbGUoU05BUFNIT1RfRElSKS5pc0RpcmVjdG9yeSgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyTWFkZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNyZWF0aW9uIG9mICIgKyBkaXIgKyAiIGZhaWxlZC4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDcmVhdGlvbiBvZiAiICsgU05BUFNIT1RfRElSICsgIiBmYWlsZWQuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZy5zZXQoZmFsc2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVTbmFwc2hvdChkaXIsIG5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVTbmFwc2hvdChTTkFQU0hPVF9ESVIsIHByb2Nlc3NOYW1lLCBwYWNrYWdlSW5mbyk7CiAgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nLnNldChmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9KTsKQEAgLTExMSwxMyArMTIzLDEzIEBACiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlWnlnb3RlU25hcHNob3QoKSB7CiAgICAgICAgIGlmICghZW5hYmxlZCkgcmV0dXJuOwotCi0gICAgICAgIFN0cmluZyBkaXIgPSAiL2RhdGEvenlnb3RlL3NuYXBzaG90cyI7Ci0gICAgICAgIG5ldyBGaWxlKGRpcikubWtkaXJzKCk7Ci0gICAgICAgIHdyaXRlU25hcHNob3QoZGlyLCAienlnb3RlIik7CisgICAgICAgIHdyaXRlU25hcHNob3QoInp5Z290ZSIsIG51bGwpOwogICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgd3JpdGVTbmFwc2hvdChTdHJpbmcgZGlyLCBTdHJpbmcgbmFtZSkgeworICAgIC8qKgorICAgICAqIHBhc3MgaW4gUGFja2FnZUluZm8gdG8gcmV0cmlldmUgdmFyaW91cyB2YWx1ZXMgZm9yIHNuYXBzaG90IGhlYWRlcgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgd3JpdGVTbmFwc2hvdChTdHJpbmcgZGlyLCBTdHJpbmcgcHJvY2Vzc05hbWUsIFBhY2thZ2VJbmZvIHBhY2thZ2VJbmZvKSB7CiAgICAgICAgIGJ5dGVbXSBzbmFwc2hvdCA9IFNhbXBsaW5nUHJvZmlsZXIuZ2V0SW5zdGFuY2UoKS5zbmFwc2hvdCgpOwogICAgICAgICBpZiAoc25hcHNob3QgPT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuOwpAQCAtMTI5LDM5ICsxNDEsNTQgQEAKICAgICAgICAgICogd2UgY2FwdHVyZSB0d28gc25hcHNob3RzIGluIHJhcGlkIHN1Y2Nlc3Npb24uCiAgICAgICAgICAqLwogICAgICAgICBsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgIFN0cmluZyBwYXRoID0gZGlyICsgIi8iICsgbmFtZS5yZXBsYWNlKCc6JywgJy4nKSArICItIiArCi0gICAgICAgICAgICAgICAgKyBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSArICIuc25hcHNob3QiOworICAgICAgICBTdHJpbmcgbmFtZSA9IHByb2Nlc3NOYW1lLnJlcGxhY2VBbGwoIjoiLCAiLiIpOworICAgICAgICBTdHJpbmcgcGF0aCA9IGRpciArICIvIiArIG5hbWUgKyAiLSIgK1N5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpICsgIi5zbmFwc2hvdCI7CisgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gb3V0ID0gbnVsbDsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIFRyeSB0byBvcGVuIHRoZSBmaWxlIGEgZmV3IHRpbWVzLiBUaGUgU0QgY2FyZCBtYXkgbm90IGJlIG1vdW50ZWQuCi0gICAgICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIG91dDsKLSAgICAgICAgICAgIGludCBjb3VudCA9IDA7Ci0gICAgICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIG91dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHBhdGgpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoKytjb3VudCA+IDMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkNvdWxkIG5vdCBvcGVuICIgKyBwYXRoICsgIi4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8vIFNsZWVwIGZvciBhIGJpdCBhbmQgdGhlbiB0cnkgYWdhaW4uCi0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMjUwMCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUxKSB7IC8qIGlnbm9yZSAqLyB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG91dC53cml0ZShzbmFwc2hvdCk7Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIG91dC5jbG9zZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbG9uZyBlbGFwc2VkID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydDsKLSAgICAgICAgICAgIExvZy5pKFRBRywgIldyb3RlIHNuYXBzaG90IGZvciAiICsgbmFtZQotICAgICAgICAgICAgICAgICAgICArICIgaW4gIiArIGVsYXBzZWQgKyAibXMuIik7CisgICAgICAgICAgICBvdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShwYXRoKTsKKyAgICAgICAgICAgIGdlbmVyYXRlU25hcHNob3RIZWFkZXIobmFtZSwgcGFja2FnZUluZm8sIG91dCk7CisgICAgICAgICAgICBvdXQud3JpdGUoc25hcHNob3QpOwogICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICBMb2cuZShUQUcsICJFcnJvciB3cml0aW5nIHNuYXBzaG90LiIsIGUpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpZihvdXQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBvdXQuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIC8vIGxldCBpdCBnby4KKyAgICAgICAgICAgIH0KICAgICAgICAgfQorICAgICAgICAvLyBzZXQgZmlsZSByZWFkYWJsZSB0byB0aGUgd29ybGQgc28gdGhhdCBTYW1wbGluZ1Byb2ZpbGVyU2VydmljZQorICAgICAgICAvLyBjYW4gcHV0IGl0IHRvIGRyb3Bib3gKKyAgICAgICAgbmV3IEZpbGUocGF0aCkuc2V0UmVhZGFibGUodHJ1ZSwgZmFsc2UpOworCisgICAgICAgIGxvbmcgZWxhcHNlZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhcnQ7CisgICAgICAgIExvZy5pKFRBRywgIldyb3RlIHNuYXBzaG90IGZvciAiICsgbmFtZSArICIgaW4gIiArIGVsYXBzZWQgKyAibXMuIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogZ2VuZXJhdGUgaGVhZGVyIGZvciBzbmFwc2hvdHMsIHdpdGggdGhlIGZvbGxvd2luZyBmb3JtYXQgKGxpa2UgaHR0cCBoZWFkZXIpOgorICAgICAqCisgICAgICogVmVyc2lvbjogPHZlcnNpb24gbnVtYmVyIG9mIHByb2ZpbGVyPlxuCisgICAgICogUHJvY2VzczogPHByb2Nlc3MgbmFtZT5cbgorICAgICAqIFBhY2thZ2U6IDxwYWNrYWdlIG5hbWUsIGlmIGV4aXN0cz5cbgorICAgICAqIFBhY2thZ2UtVmVyc2lvbjogPHZlcnNpb24gbnVtYmVyIG9mIHRoZSBwYWNrYWdlLCBpZiBleGlzdHM+XG4KKyAgICAgKiBCdWlsZDogPGZpbmdlcnByaW50PlxuCisgICAgICogXG4KKyAgICAgKiA8dGhlIGFjdHVhbCBzbmFwc2hvdCBjb250ZW50IGJlZ2lucyBoZXJlLi4uPgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZ2VuZXJhdGVTbmFwc2hvdEhlYWRlcihTdHJpbmcgcHJvY2Vzc05hbWUsIFBhY2thZ2VJbmZvIHBhY2thZ2VJbmZvLAorICAgICAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIC8vIHByb2ZpbGVyIHZlcnNpb24KKyAgICAgICAgb3V0LndyaXRlKCJWZXJzaW9uOiAxXG4iLmdldEJ5dGVzKCkpOworICAgICAgICBvdXQud3JpdGUoKCJQcm9jZXNzOiAiICsgcHJvY2Vzc05hbWUgKyAiXG4iKS5nZXRCeXRlcygpKTsKKyAgICAgICAgaWYocGFja2FnZUluZm8gIT0gbnVsbCkgeworICAgICAgICAgICAgb3V0LndyaXRlKCgiUGFja2FnZTogIiArIHBhY2thZ2VJbmZvLnBhY2thZ2VOYW1lICsgIlxuIikuZ2V0Qnl0ZXMoKSk7CisgICAgICAgICAgICBvdXQud3JpdGUoKCJQYWNrYWdlLVZlcnNpb246ICIgKyBwYWNrYWdlSW5mby52ZXJzaW9uQ29kZSArICJcbiIpLmdldEJ5dGVzKCkpOworICAgICAgICB9CisgICAgICAgIG91dC53cml0ZSgoIkJ1aWxkOiAiICsgQnVpbGQuRklOR0VSUFJJTlQgKyAiXG4iKS5nZXRCeXRlcygpKTsKKyAgICAgICAgLy8gc2luZ2xlIGJsYW5rIGxpbmUgbWVhbnMgdGhlIGVuZCBvZiBzbmFwc2hvdCBoZWFkZXIuCisgICAgICAgIG91dC53cml0ZSgiXG4iLmdldEJ5dGVzKCkpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9vcy9aeWdvdGVJbml0LmphdmEgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvb3MvWnlnb3RlSW5pdC5qYXZhCmluZGV4IDlmY2QzZjUuLjljODRlMGUgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9vcy9aeWdvdGVJbml0LmphdmEKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL29zL1p5Z290ZUluaXQuamF2YQpAQCAtMjIsNiArMjIsNyBAQAogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7CiBpbXBvcnQgYW5kcm9pZC5uZXQuTG9jYWxTZXJ2ZXJTb2NrZXQ7CiBpbXBvcnQgYW5kcm9pZC5vcy5EZWJ1ZzsKK2ltcG9ydCBhbmRyb2lkLm9zLkZpbGVVdGlsczsKIGltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOwogaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtUHJvcGVydGllczsKIGltcG9ydCBhbmRyb2lkLnV0aWwuQ29uZmlnOwpAQCAtNTA2LDYgKzUwNyw5IEBACiAKICAgICAgICAgY2xvc2VTZXJ2ZXJTb2NrZXQoKTsKIAorICAgICAgICAvLyBzZXQgdW1hc2sgdG8gMDA3NyBzbyBuZXcgZmlsZXMgYW5kIGRpcmVjdG9yaWVzIHdpbGwgZGVmYXVsdCB0byBvd25lci1vbmx5IHBlcm1pc3Npb25zLgorICAgICAgICBGaWxlVXRpbHMuc2V0VU1hc2soRmlsZVV0aWxzLlNfSVJXWEcgfCBGaWxlVXRpbHMuU19JUldYTyk7CisKICAgICAgICAgLyoKICAgICAgICAgICogUGFzcyB0aGUgcmVtYWluaW5nIGFyZ3VtZW50cyB0byBTeXN0ZW1TZXJ2ZXIuCiAgICAgICAgICAqICItLW5pY2UtbmFtZT1zeXN0ZW1fc2VydmVyIGNvbS5hbmRyb2lkLnNlcnZlci5TeXN0ZW1TZXJ2ZXIiCkBAIC01MjMsNyArNTI3LDcgQEAKICAgICAgICAgU3RyaW5nIGFyZ3NbXSA9IHsKICAgICAgICAgICAgICItLXNldHVpZD0xMDAwIiwKICAgICAgICAgICAgICItLXNldGdpZD0xMDAwIiwKLSAgICAgICAgICAgICItLXNldGdyb3Vwcz0xMDAxLDEwMDIsMTAwMywxMDA0LDEwMDUsMTAwNiwxMDA3LDEwMDgsMTAwOSwxMDEwLDMwMDEsMzAwMiwzMDAzIiwKKyAgICAgICAgICAgICItLXNldGdyb3Vwcz0xMDAxLDEwMDIsMTAwMywxMDA0LDEwMDUsMTAwNiwxMDA3LDEwMDgsMTAwOSwxMDEwLDEwMTgsMzAwMSwzMDAyLDMwMDMiLAogICAgICAgICAgICAgIi0tY2FwYWJpbGl0aWVzPTEzMDEwNDM1MiwxMzAxMDQzNTIiLAogICAgICAgICAgICAgIi0tcnVudGltZS1pbml0IiwKICAgICAgICAgICAgICItLW5pY2UtbmFtZT1zeXN0ZW1fc2VydmVyIiwKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9zdGF0dXNiYXIvSVN0YXR1c0JhclNlcnZpY2UuYWlkbCBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9zdGF0dXNiYXIvSVN0YXR1c0JhclNlcnZpY2UuYWlkbAppbmRleCA4NTI2MzBkLi4yMzA3NjY5IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvc3RhdHVzYmFyL0lTdGF0dXNCYXJTZXJ2aWNlLmFpZGwKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3N0YXR1c2Jhci9JU3RhdHVzQmFyU2VydmljZS5haWRsCkBAIC00MCw0ICs0MCw1IEBACiAgICAgdm9pZCBvbk5vdGlmaWNhdGlvbkVycm9yKFN0cmluZyBwa2csIFN0cmluZyB0YWcsIGludCBpZCwKICAgICAgICAgICAgIGludCB1aWQsIGludCBpbml0aWFsUGlkLCBTdHJpbmcgbWVzc2FnZSk7CiAgICAgdm9pZCBvbkNsZWFyQWxsTm90aWZpY2F0aW9ucygpOworICAgIHZvaWQgb25Ob3RpZmljYXRpb25DbGVhcihTdHJpbmcgcGtnLCBTdHJpbmcgdGFnLCBpbnQgaWQpOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3V0aWwvSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lLmphdmEgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdXRpbC9IaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUuamF2YQppbmRleCBjNTk5ZDY4Li5kMzhjMDNiIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdXRpbC9IaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUuamF2YQorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdXRpbC9IaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUuamF2YQpAQCAtMTM3LDcgKzEzNyw3IEBACiAgICAgfQogCiAgICAgY2xhc3MgU3RhdGUxIGV4dGVuZHMgSGllcmFyY2hpY2FsU3RhdGUgewotICAgICAgICBAT3ZlcnJpZGUgcHVibGljIGJvb2xlYW4gcHJvY2Vzc01lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKSB7CisgICAgICAgIFxAT3ZlcnJpZGUgcHVibGljIGJvb2xlYW4gcHJvY2Vzc01lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKSB7CiAgICAgICAgICAgICBMb2cuZChUQUcsICJIZWxsbyBXb3JsZCIpOwogICAgICAgICAgICAgcmV0dXJuIEhBTkRMRUQ7CiAgICAgICAgIH0KQEAgLTI1NywxMCArMjU3LDEwIEBACiAgICAgfQogCiAgICAgY2xhc3MgUDEgZXh0ZW5kcyBIaWVyYXJjaGljYWxTdGF0ZSB7Ci0gICAgICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBlbnRlcigpIHsKKyAgICAgICAgXEBPdmVycmlkZSBwdWJsaWMgdm9pZCBlbnRlcigpIHsKICAgICAgICAgICAgIExvZy5kKFRBRywgIm1QMS5lbnRlciIpOwogICAgICAgICB9Ci0gICAgICAgIEBPdmVycmlkZSBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKKyAgICAgICAgXEBPdmVycmlkZSBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKICAgICAgICAgICAgIGJvb2xlYW4gcmV0VmFsOwogICAgICAgICAgICAgTG9nLmQoVEFHLCAibVAxLnByb2Nlc3NNZXNzYWdlIHdoYXQ9IiArIG1lc3NhZ2Uud2hhdCk7CiAgICAgICAgICAgICBzd2l0Y2gobWVzc2FnZS53aGF0KSB7CkBAIC0yNzgsMTYgKzI3OCwxNiBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIHJldFZhbDsKICAgICAgICAgfQotICAgICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgZXhpdCgpIHsKKyAgICAgICAgXEBPdmVycmlkZSBwdWJsaWMgdm9pZCBleGl0KCkgewogICAgICAgICAgICAgTG9nLmQoVEFHLCAibVAxLmV4aXQiKTsKICAgICAgICAgfQogICAgIH0KIAogICAgIGNsYXNzIFMxIGV4dGVuZHMgSGllcmFyY2hpY2FsU3RhdGUgewotICAgICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgZW50ZXIoKSB7CisgICAgICAgIFxAT3ZlcnJpZGUgcHVibGljIHZvaWQgZW50ZXIoKSB7CiAgICAgICAgICAgICBMb2cuZChUQUcsICJtUzEuZW50ZXIiKTsKICAgICAgICAgfQotICAgICAgICBAT3ZlcnJpZGUgcHVibGljIGJvb2xlYW4gcHJvY2Vzc01lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKSB7CisgICAgICAgIFxAT3ZlcnJpZGUgcHVibGljIGJvb2xlYW4gcHJvY2Vzc01lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKSB7CiAgICAgICAgICAgICBMb2cuZChUQUcsICJTMS5wcm9jZXNzTWVzc2FnZSB3aGF0PSIgKyBtZXNzYWdlLndoYXQpOwogICAgICAgICAgICAgaWYgKG1lc3NhZ2Uud2hhdCA9PSBDTURfMSkgewogICAgICAgICAgICAgICAgIC8vIFRyYW5zaXRpb24gdG8gb3Vyc2VsZiB0byBzaG93IHRoYXQgZW50ZXIvZXhpdCBpcyBjYWxsZWQKQEAgLTI5OCwxNiArMjk4LDE2IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIE5PVF9IQU5ETEVEOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBleGl0KCkgeworICAgICAgICBcQE92ZXJyaWRlIHB1YmxpYyB2b2lkIGV4aXQoKSB7CiAgICAgICAgICAgICBMb2cuZChUQUcsICJtUzEuZXhpdCIpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgY2xhc3MgUzIgZXh0ZW5kcyBIaWVyYXJjaGljYWxTdGF0ZSB7Ci0gICAgICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBlbnRlcigpIHsKKyAgICAgICAgXEBPdmVycmlkZSBwdWJsaWMgdm9pZCBlbnRlcigpIHsKICAgICAgICAgICAgIExvZy5kKFRBRywgIm1TMi5lbnRlciIpOwogICAgICAgICB9Ci0gICAgICAgIEBPdmVycmlkZSBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKKyAgICAgICAgXEBPdmVycmlkZSBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKICAgICAgICAgICAgIGJvb2xlYW4gcmV0VmFsOwogICAgICAgICAgICAgTG9nLmQoVEFHLCAibVMyLnByb2Nlc3NNZXNzYWdlIHdoYXQ9IiArIG1lc3NhZ2Uud2hhdCk7CiAgICAgICAgICAgICBzd2l0Y2gobWVzc2FnZS53aGF0KSB7CkBAIC0zMjYsMTcgKzMyNiwxNyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIHJldFZhbDsKICAgICAgICAgfQotICAgICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgZXhpdCgpIHsKKyAgICAgICAgXEBPdmVycmlkZSBwdWJsaWMgdm9pZCBleGl0KCkgewogICAgICAgICAgICAgTG9nLmQoVEFHLCAibVMyLmV4aXQiKTsKICAgICAgICAgfQogICAgIH0KIAogICAgIGNsYXNzIFAyIGV4dGVuZHMgSGllcmFyY2hpY2FsU3RhdGUgewotICAgICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgZW50ZXIoKSB7CisgICAgICAgIFxAT3ZlcnJpZGUgcHVibGljIHZvaWQgZW50ZXIoKSB7CiAgICAgICAgICAgICBMb2cuZChUQUcsICJtUDIuZW50ZXIiKTsKICAgICAgICAgICAgIHNlbmRNZXNzYWdlKG9idGFpbk1lc3NhZ2UoQ01EXzUpKTsKICAgICAgICAgfQotICAgICAgICBAT3ZlcnJpZGUgcHVibGljIGJvb2xlYW4gcHJvY2Vzc01lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKSB7CisgICAgICAgIFxAT3ZlcnJpZGUgcHVibGljIGJvb2xlYW4gcHJvY2Vzc01lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKSB7CiAgICAgICAgICAgICBMb2cuZChUQUcsICJQMi5wcm9jZXNzTWVzc2FnZSB3aGF0PSIgKyBtZXNzYWdlLndoYXQpOwogICAgICAgICAgICAgc3dpdGNoKG1lc3NhZ2Uud2hhdCkgewogICAgICAgICAgICAgY2FzZShDTURfMyk6CkBAIC0zNDksMTIgKzM0OSwxMiBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIEhBTkRMRUQ7CiAgICAgICAgIH0KLSAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIGV4aXQoKSB7CisgICAgICAgIFxAT3ZlcnJpZGUgcHVibGljIHZvaWQgZXhpdCgpIHsKICAgICAgICAgICAgIExvZy5kKFRBRywgIm1QMi5leGl0Iik7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBAT3ZlcnJpZGUKKyAgICBcQE92ZXJyaWRlCiAgICAgdm9pZCBoYWx0aW5nKCkgewogICAgICAgICBMb2cuZChUQUcsICJoYWx0aW5nIik7CiAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewpAQCAtMTE5Nyw2ICsxMTk3LDM1IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogR2V0IGEgbWVzc2FnZSBhbmQgc2V0IE1lc3NhZ2UudGFyZ2V0ID0gdGhpcywKKyAgICAgKiB3aGF0LCBhcmcxIGFuZCBhcmcyCisgICAgICoKKyAgICAgKiBAcGFyYW0gd2hhdCAgaXMgYXNzaWduZWQgdG8gTWVzc2FnZS53aGF0CisgICAgICogQHBhcmFtIGFyZzEgIGlzIGFzc2lnbmVkIHRvIE1lc3NhZ2UuYXJnMQorICAgICAqIEBwYXJhbSBhcmcyICBpcyBhc3NpZ25lZCB0byBNZXNzYWdlLmFyZzIKKyAgICAgKiBAcmV0dXJuICBBIE1lc3NhZ2Ugb2JqZWN0IGZyb20gdGhlIGdsb2JhbCBwb29sLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBNZXNzYWdlIG9idGFpbk1lc3NhZ2UoaW50IHdoYXQsIGludCBhcmcxLCBpbnQgYXJnMikKKyAgICB7CisgICAgICAgIHJldHVybiBNZXNzYWdlLm9idGFpbihtSHNtSGFuZGxlciwgd2hhdCwgYXJnMSwgYXJnMik7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGEgbWVzc2FnZSBhbmQgc2V0IE1lc3NhZ2UudGFyZ2V0ID0gdGhpcywKKyAgICAgKiB3aGF0LCBhcmcxLCBhcmcyIGFuZCBvYmoKKyAgICAgKgorICAgICAqIEBwYXJhbSB3aGF0ICBpcyBhc3NpZ25lZCB0byBNZXNzYWdlLndoYXQKKyAgICAgKiBAcGFyYW0gYXJnMSAgaXMgYXNzaWduZWQgdG8gTWVzc2FnZS5hcmcxCisgICAgICogQHBhcmFtIGFyZzIgIGlzIGFzc2lnbmVkIHRvIE1lc3NhZ2UuYXJnMgorICAgICAqIEBwYXJhbSBvYmogaXMgYXNzaWduZWQgdG8gTWVzc2FnZS5vYmoKKyAgICAgKiBAcmV0dXJuICBBIE1lc3NhZ2Ugb2JqZWN0IGZyb20gdGhlIGdsb2JhbCBwb29sLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBNZXNzYWdlIG9idGFpbk1lc3NhZ2UoaW50IHdoYXQsIGludCBhcmcxLCBpbnQgYXJnMiwgT2JqZWN0IG9iaikKKyAgICB7CisgICAgICAgIHJldHVybiBNZXNzYWdlLm9idGFpbihtSHNtSGFuZGxlciwgd2hhdCwgYXJnMSwgYXJnMiwgb2JqKTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBFbnF1ZXVlIGEgbWVzc2FnZSB0byB0aGlzIHN0YXRlIG1hY2hpbmUuCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIHZvaWQgc2VuZE1lc3NhZ2UoaW50IHdoYXQpIHsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC91dGlsL1htbFV0aWxzLmphdmEgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdXRpbC9YbWxVdGlscy5qYXZhCmluZGV4IDhkOGRmMTYuLmUwMGE4NTMgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC91dGlsL1htbFV0aWxzLmphdmEKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3V0aWwvWG1sVXRpbHMuamF2YQpAQCAtMjYsNiArMjYsNyBAQAogaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5NYXA7CkBAIC0yODQsNiArMjg1LDI2IEBACiAKICAgICAgICAgb3V0LmVuZFRhZyhudWxsLCAibGlzdCIpOwogICAgIH0KKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgd3JpdGVTZXRYbWwoU2V0IHZhbCwgU3RyaW5nIG5hbWUsIFhtbFNlcmlhbGl6ZXIgb3V0KQorICAgICAgICAgICAgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICBpZiAodmFsID09IG51bGwpIHsKKyAgICAgICAgICAgIG91dC5zdGFydFRhZyhudWxsLCAibnVsbCIpOworICAgICAgICAgICAgb3V0LmVuZFRhZyhudWxsLCAibnVsbCIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBvdXQuc3RhcnRUYWcobnVsbCwgInNldCIpOworICAgICAgICBpZiAobmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICBvdXQuYXR0cmlidXRlKG51bGwsICJuYW1lIiwgbmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGZvciAoT2JqZWN0IHYgOiB2YWwpIHsKKyAgICAgICAgICAgIHdyaXRlVmFsdWVYbWwodiwgbnVsbCwgb3V0KTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgb3V0LmVuZFRhZyhudWxsLCAic2V0Iik7CisgICAgfQogCiAgICAgLyoqCiAgICAgICogRmxhdHRlbiBhIGJ5dGVbXSBpbnRvIGFuIFhtbFNlcmlhbGl6ZXIuICBUaGUgbGlzdCBjYW4gbGF0ZXIgYmUgcmVhZCBiYWNrCkBAIC00MjYsNiArNDQ3LDkgQEAKICAgICAgICAgfSBlbHNlIGlmICh2IGluc3RhbmNlb2YgTGlzdCkgewogICAgICAgICAgICAgd3JpdGVMaXN0WG1sKChMaXN0KXYsIG5hbWUsIG91dCk7CiAgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gZWxzZSBpZiAodiBpbnN0YW5jZW9mIFNldCkgeworICAgICAgICAgICAgd3JpdGVTZXRYbWwoKFNldCl2LCBuYW1lLCBvdXQpOworICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9IGVsc2UgaWYgKHYgaW5zdGFuY2VvZiBDaGFyU2VxdWVuY2UpIHsKICAgICAgICAgICAgIC8vIFhYWCBUaGlzIGlzIHRvIGFsbG93IHVzIHRvIGF0IGxlYXN0IHdyaXRlIHNvbWV0aGluZyBpZgogICAgICAgICAgICAgLy8gd2UgZW5jb3VudGVyIHN0eWxlZCB0ZXh0Li4uICBidXQgaXQgbWVhbnMgd2Ugd2lsbCBkcm9wIGFsbApAQCAtNDc2LDcgKzUwMCw3IEBACiAgICAgICoKICAgICAgKiBAcGFyYW0gaW4gVGhlIElucHV0U3RyZWFtIGZyb20gd2hpY2ggdG8gcmVhZC4KICAgICAgKgotICAgICAqIEByZXR1cm4gSGFzaE1hcCBUaGUgcmVzdWx0aW5nIGxpc3QuCisgICAgICogQHJldHVybiBBcnJheUxpc3QgVGhlIHJlc3VsdGluZyBsaXN0LgogICAgICAqCiAgICAgICogQHNlZSAjcmVhZE1hcFhtbAogICAgICAqIEBzZWUgI3JlYWRWYWx1ZVhtbApAQCAtNDkwLDYgKzUxNCwyOSBAQAogICAgICAgICBwYXJzZXIuc2V0SW5wdXQoaW4sIG51bGwpOwogICAgICAgICByZXR1cm4gKEFycmF5TGlzdClyZWFkVmFsdWVYbWwocGFyc2VyLCBuZXcgU3RyaW5nWzFdKTsKICAgICB9CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogUmVhZCBhIEhhc2hTZXQgZnJvbSBhbiBJbnB1dFN0cmVhbSBjb250YWluaW5nIFhNTC4gVGhlIHN0cmVhbSBjYW4KKyAgICAgKiBwcmV2aW91c2x5IGhhdmUgYmVlbiB3cml0dGVuIGJ5IHdyaXRlU2V0WG1sKCkuCisgICAgICogCisgICAgICogQHBhcmFtIGluIFRoZSBJbnB1dFN0cmVhbSBmcm9tIHdoaWNoIHRvIHJlYWQuCisgICAgICogCisgICAgICogQHJldHVybiBIYXNoU2V0IFRoZSByZXN1bHRpbmcgc2V0LgorICAgICAqIAorICAgICAqIEB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgorICAgICAqIAorICAgICAqIEBzZWUgI3JlYWRWYWx1ZVhtbAorICAgICAqIEBzZWUgI3JlYWRUaGlzU2V0WG1sCisgICAgICogQHNlZSAjd3JpdGVTZXRYbWwKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEhhc2hTZXQgcmVhZFNldFhtbChJbnB1dFN0cmVhbSBpbikKKyAgICAgICAgICAgIHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgWG1sUHVsbFBhcnNlciBwYXJzZXIgPSBYbWwubmV3UHVsbFBhcnNlcigpOworICAgICAgICBwYXJzZXIuc2V0SW5wdXQoaW4sIG51bGwpOworICAgICAgICByZXR1cm4gKEhhc2hTZXQpIHJlYWRWYWx1ZVhtbChwYXJzZXIsIG5ldyBTdHJpbmdbMV0pOworICAgIH0KIAogICAgIC8qKgogICAgICAqIFJlYWQgYSBIYXNoTWFwIG9iamVjdCBmcm9tIGFuIFhtbFB1bGxQYXJzZXIuICBUaGUgWE1MIGRhdGEgY291bGQKQEAgLTU3Myw2ICs2MjAsNDcgQEAKICAgICAgICAgdGhyb3cgbmV3IFhtbFB1bGxQYXJzZXJFeGNlcHRpb24oCiAgICAgICAgICAgICAiRG9jdW1lbnQgZW5kZWQgYmVmb3JlICIgKyBlbmRUYWcgKyAiIGVuZCB0YWciKTsKICAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmVhZCBhIEhhc2hTZXQgb2JqZWN0IGZyb20gYW4gWG1sUHVsbFBhcnNlci4gVGhlIFhNTCBkYXRhIGNvdWxkIHByZXZpb3VzbHkKKyAgICAgKiBoYXZlIGJlZW4gZ2VuZXJhdGVkIGJ5IHdyaXRlU2V0WG1sKCkuIFRoZSBYbWxQdWxsUGFyc2VyIG11c3QgYmUgcG9zaXRpb25lZAorICAgICAqIDxlbT5hZnRlcjwvZW0+IHRoZSB0YWcgdGhhdCBiZWdpbnMgdGhlIHNldC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcGFyc2VyIFRoZSBYbWxQdWxsUGFyc2VyIGZyb20gd2hpY2ggdG8gcmVhZCB0aGUgc2V0IGRhdGEuCisgICAgICogQHBhcmFtIGVuZFRhZyBOYW1lIG9mIHRoZSB0YWcgdGhhdCB3aWxsIGVuZCB0aGUgc2V0LCB1c3VhbGx5ICJzZXQiLgorICAgICAqIEBwYXJhbSBuYW1lIEFuIGFycmF5IG9mIG9uZSBzdHJpbmcsIHVzZWQgdG8gcmV0dXJuIHRoZSBuYW1lIGF0dHJpYnV0ZQorICAgICAqICAgICAgICAgICAgIG9mIHRoZSBzZXQncyB0YWcuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEhhc2hTZXQgVGhlIG5ld2x5IGdlbmVyYXRlZCBzZXQuCisgICAgICogCisgICAgICogQHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uCisgICAgICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCisgICAgICogCisgICAgICogQHNlZSAjcmVhZFNldFhtbAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgSGFzaFNldCByZWFkVGhpc1NldFhtbChYbWxQdWxsUGFyc2VyIHBhcnNlciwgU3RyaW5nIGVuZFRhZywgU3RyaW5nW10gbmFtZSkKKyAgICAgICAgICAgIHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgSGFzaFNldCBzZXQgPSBuZXcgSGFzaFNldCgpOworICAgICAgICAKKyAgICAgICAgaW50IGV2ZW50VHlwZSA9IHBhcnNlci5nZXRFdmVudFR5cGUoKTsKKyAgICAgICAgZG8geworICAgICAgICAgICAgaWYgKGV2ZW50VHlwZSA9PSBwYXJzZXIuU1RBUlRfVEFHKSB7CisgICAgICAgICAgICAgICAgT2JqZWN0IHZhbCA9IHJlYWRUaGlzVmFsdWVYbWwocGFyc2VyLCBuYW1lKTsKKyAgICAgICAgICAgICAgICBzZXQuYWRkKHZhbCk7CisgICAgICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIkFkZGluZyB0byBzZXQ6ICIgKyB2YWwpOworICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudFR5cGUgPT0gcGFyc2VyLkVORF9UQUcpIHsKKyAgICAgICAgICAgICAgICBpZiAocGFyc2VyLmdldE5hbWUoKS5lcXVhbHMoZW5kVGFnKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2V0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCAiICsgZW5kVGFnICsgIiBlbmQgdGFnIGF0OiAiICsgcGFyc2VyLmdldE5hbWUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBldmVudFR5cGUgPSBwYXJzZXIubmV4dCgpOworICAgICAgICB9IHdoaWxlIChldmVudFR5cGUgIT0gcGFyc2VyLkVORF9ET0NVTUVOVCk7CisgICAgICAgIAorICAgICAgICB0aHJvdyBuZXcgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiRG9jdW1lbnQgZW5kZWQgYmVmb3JlICIgKyBlbmRUYWcgKyAiIGVuZCB0YWciKTsKKyAgICB9CiAKICAgICAvKioKICAgICAgKiBSZWFkIGFuIGludFtdIG9iamVjdCBmcm9tIGFuIFhtbFB1bGxQYXJzZXIuICBUaGUgWE1MIGRhdGEgY291bGQKQEAgLTc0MCw2ICs4MjgsMTIgQEAKICAgICAgICAgICAgIG5hbWVbMF0gPSB2YWx1ZU5hbWU7CiAgICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiUmV0dXJuaW5nIHZhbHVlIGZvciAiICsgdmFsdWVOYW1lICsgIjogIiArIHJlcyk7CiAgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9IGVsc2UgaWYgKHRhZ05hbWUuZXF1YWxzKCJzZXQiKSkgeworICAgICAgICAgICAgcGFyc2VyLm5leHQoKTsKKyAgICAgICAgICAgIHJlcyA9IHJlYWRUaGlzU2V0WG1sKHBhcnNlciwgInNldCIsIG5hbWUpOworICAgICAgICAgICAgbmFtZVswXSA9IHZhbHVlTmFtZTsKKyAgICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJSZXR1cm5pbmcgdmFsdWUgZm9yICIgKyB2YWx1ZU5hbWUgKyAiOiAiICsgcmVzKTsKKyAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbigKICAgICAgICAgICAgICAgICAiVW5rbm93biB0YWc6ICIgKyB0YWdOYW1lKTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L1N0YW5kYWxvbmVBY3Rpb25Nb2RlLmphdmEgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9TdGFuZGFsb25lQWN0aW9uTW9kZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzODE5MDEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9TdGFuZGFsb25lQWN0aW9uTW9kZS5qYXZhCkBAIC0wLDAgKzEsMTQxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldzsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5NZW51QnVpbGRlcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuTWVudVBvcHVwSGVscGVyOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5TdWJNZW51QnVpbGRlcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuQWN0aW9uQmFyQ29udGV4dFZpZXc7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuQWN0aW9uTW9kZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUluZmxhdGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SXRlbTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKKworaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKKworcHVibGljIGNsYXNzIFN0YW5kYWxvbmVBY3Rpb25Nb2RlIGV4dGVuZHMgQWN0aW9uTW9kZSBpbXBsZW1lbnRzIE1lbnVCdWlsZGVyLkNhbGxiYWNrIHsKKyAgICBwcml2YXRlIENvbnRleHQgbUNvbnRleHQ7CisgICAgcHJpdmF0ZSBBY3Rpb25CYXJDb250ZXh0VmlldyBtQ29udGV4dFZpZXc7CisgICAgcHJpdmF0ZSBBY3Rpb25Nb2RlLkNhbGxiYWNrIG1DYWxsYmFjazsKKyAgICBwcml2YXRlIFdlYWtSZWZlcmVuY2U8Vmlldz4gbUN1c3RvbVZpZXc7CisgICAgcHJpdmF0ZSBib29sZWFuIG1GaW5pc2hlZDsKKworICAgIHByaXZhdGUgTWVudUJ1aWxkZXIgbU1lbnU7CisKKyAgICBwdWJsaWMgU3RhbmRhbG9uZUFjdGlvbk1vZGUoQ29udGV4dCBjb250ZXh0LCBBY3Rpb25CYXJDb250ZXh0VmlldyB2aWV3LAorICAgICAgICAgICAgQWN0aW9uTW9kZS5DYWxsYmFjayBjYWxsYmFjaykgeworICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CisgICAgICAgIG1Db250ZXh0VmlldyA9IHZpZXc7CisgICAgICAgIG1DYWxsYmFjayA9IGNhbGxiYWNrOworCisgICAgICAgIG1NZW51ID0gbmV3IE1lbnVCdWlsZGVyKGNvbnRleHQpLnNldERlZmF1bHRTaG93QXNBY3Rpb24oTWVudUl0ZW0uU0hPV19BU19BQ1RJT05fSUZfUk9PTSk7CisgICAgICAgIG1NZW51LnNldENhbGxiYWNrKHRoaXMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldFRpdGxlKENoYXJTZXF1ZW5jZSB0aXRsZSkgeworICAgICAgICBtQ29udGV4dFZpZXcuc2V0VGl0bGUodGl0bGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldFN1YnRpdGxlKENoYXJTZXF1ZW5jZSBzdWJ0aXRsZSkgeworICAgICAgICBtQ29udGV4dFZpZXcuc2V0U3VidGl0bGUoc3VidGl0bGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldFRpdGxlKGludCByZXNJZCkgeworICAgICAgICBzZXRUaXRsZShtQ29udGV4dC5nZXRTdHJpbmcocmVzSWQpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRTdWJ0aXRsZShpbnQgcmVzSWQpIHsKKyAgICAgICAgc2V0U3VidGl0bGUobUNvbnRleHQuZ2V0U3RyaW5nKHJlc0lkKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0Q3VzdG9tVmlldyhWaWV3IHZpZXcpIHsKKyAgICAgICAgbUNvbnRleHRWaWV3LnNldEN1c3RvbVZpZXcodmlldyk7CisgICAgICAgIG1DdXN0b21WaWV3ID0gdmlldyAhPSBudWxsID8gbmV3IFdlYWtSZWZlcmVuY2U8Vmlldz4odmlldykgOiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGludmFsaWRhdGUoKSB7CisgICAgICAgIG1DYWxsYmFjay5vblByZXBhcmVBY3Rpb25Nb2RlKHRoaXMsIG1NZW51KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBmaW5pc2goKSB7CisgICAgICAgIGlmIChtRmluaXNoZWQpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBtRmluaXNoZWQgPSB0cnVlOworCisgICAgICAgIG1DYWxsYmFjay5vbkRlc3Ryb3lBY3Rpb25Nb2RlKHRoaXMpOworICAgICAgICBtQ29udGV4dFZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBNZW51IGdldE1lbnUoKSB7CisgICAgICAgIHJldHVybiBtTWVudTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ2hhclNlcXVlbmNlIGdldFRpdGxlKCkgeworICAgICAgICByZXR1cm4gbUNvbnRleHRWaWV3LmdldFRpdGxlKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXRTdWJ0aXRsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1Db250ZXh0Vmlldy5nZXRTdWJ0aXRsZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBWaWV3IGdldEN1c3RvbVZpZXcoKSB7CisgICAgICAgIHJldHVybiBtQ3VzdG9tVmlldyAhPSBudWxsID8gbUN1c3RvbVZpZXcuZ2V0KCkgOiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBNZW51SW5mbGF0ZXIgZ2V0TWVudUluZmxhdGVyKCkgeworICAgICAgICByZXR1cm4gbmV3IE1lbnVJbmZsYXRlcihtQ29udGV4dCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gb25NZW51SXRlbVNlbGVjdGVkKE1lbnVCdWlsZGVyIG1lbnUsIE1lbnVJdGVtIGl0ZW0pIHsKKyAgICAgICAgcmV0dXJuIG1DYWxsYmFjay5vbkFjdGlvbkl0ZW1DbGlja2VkKHRoaXMsIGl0ZW0pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG9uQ2xvc2VNZW51KE1lbnVCdWlsZGVyIG1lbnUsIGJvb2xlYW4gYWxsTWVudXNBcmVDbG9zaW5nKSB7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gb25TdWJNZW51U2VsZWN0ZWQoU3ViTWVudUJ1aWxkZXIgc3ViTWVudSkgeworICAgICAgICBpZiAoIXN1Yk1lbnUuaGFzVmlzaWJsZUl0ZW1zKCkpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgbmV3IE1lbnVQb3B1cEhlbHBlcihtQ29udGV4dCwgc3ViTWVudSkuc2hvdygpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvbkNsb3NlU3ViTWVudShTdWJNZW51QnVpbGRlciBtZW51KSB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb25NZW51TW9kZUNoYW5nZShNZW51QnVpbGRlciBtZW51KSB7CisgICAgICAgIGludmFsaWRhdGUoKTsKKyAgICAgICAgbUNvbnRleHRWaWV3LnNob3dPdmVyZmxvd01lbnUoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9tZW51L0FjdGlvbk1lbnUuamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L21lbnUvQWN0aW9uTWVudS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkNDRlYmMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9tZW51L0FjdGlvbk1lbnUuamF2YQpAQCAtMCwwICsxLDI2MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51OworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5SZXNvbHZlSW5mbzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnU7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnVJdGVtOworaW1wb3J0IGFuZHJvaWQudmlldy5TdWJNZW51OworCisvKioKKyAqIEBoaWRlCisgKi8KK3B1YmxpYyBjbGFzcyBBY3Rpb25NZW51IGltcGxlbWVudHMgTWVudSB7CisgICAgcHJpdmF0ZSBDb250ZXh0IG1Db250ZXh0OworICAgIAorICAgIHByaXZhdGUgYm9vbGVhbiBtSXNRd2VydHk7CisgICAgCisgICAgcHJpdmF0ZSBBcnJheUxpc3Q8QWN0aW9uTWVudUl0ZW0+IG1JdGVtczsKKyAgICAKKyAgICBwdWJsaWMgQWN0aW9uTWVudShDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OworICAgICAgICBtSXRlbXMgPSBuZXcgQXJyYXlMaXN0PEFjdGlvbk1lbnVJdGVtPigpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgQ29udGV4dCBnZXRDb250ZXh0KCkgeworICAgICAgICByZXR1cm4gbUNvbnRleHQ7CisgICAgfQorCisgICAgcHVibGljIE1lbnVJdGVtIGFkZChDaGFyU2VxdWVuY2UgdGl0bGUpIHsKKyAgICAgICAgcmV0dXJuIGFkZCgwLCAwLCAwLCB0aXRsZSk7CisgICAgfQorCisgICAgcHVibGljIE1lbnVJdGVtIGFkZChpbnQgdGl0bGVSZXMpIHsKKyAgICAgICAgcmV0dXJuIGFkZCgwLCAwLCAwLCB0aXRsZVJlcyk7CisgICAgfQorCisgICAgcHVibGljIE1lbnVJdGVtIGFkZChpbnQgZ3JvdXBJZCwgaW50IGl0ZW1JZCwgaW50IG9yZGVyLCBpbnQgdGl0bGVSZXMpIHsKKyAgICAgICAgcmV0dXJuIGFkZChncm91cElkLCBpdGVtSWQsIG9yZGVyLCBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRTdHJpbmcodGl0bGVSZXMpKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIE1lbnVJdGVtIGFkZChpbnQgZ3JvdXBJZCwgaW50IGl0ZW1JZCwgaW50IG9yZGVyLCBDaGFyU2VxdWVuY2UgdGl0bGUpIHsKKyAgICAgICAgQWN0aW9uTWVudUl0ZW0gaXRlbSA9IG5ldyBBY3Rpb25NZW51SXRlbShnZXRDb250ZXh0KCksCisgICAgICAgICAgICAgICAgZ3JvdXBJZCwgaXRlbUlkLCAwLCBvcmRlciwgdGl0bGUpOworICAgICAgICBtSXRlbXMuYWRkKG9yZGVyLCBpdGVtKTsKKyAgICAgICAgcmV0dXJuIGl0ZW07CisgICAgfQorCisgICAgcHVibGljIGludCBhZGRJbnRlbnRPcHRpb25zKGludCBncm91cElkLCBpbnQgaXRlbUlkLCBpbnQgb3JkZXIsCisgICAgICAgICAgICBDb21wb25lbnROYW1lIGNhbGxlciwgSW50ZW50W10gc3BlY2lmaWNzLCBJbnRlbnQgaW50ZW50LCBpbnQgZmxhZ3MsCisgICAgICAgICAgICBNZW51SXRlbVtdIG91dFNwZWNpZmljSXRlbXMpIHsKKyAgICAgICAgUGFja2FnZU1hbmFnZXIgcG0gPSBtQ29udGV4dC5nZXRQYWNrYWdlTWFuYWdlcigpOworICAgICAgICBmaW5hbCBMaXN0PFJlc29sdmVJbmZvPiBscmkgPQorICAgICAgICAgICAgICAgIHBtLnF1ZXJ5SW50ZW50QWN0aXZpdHlPcHRpb25zKGNhbGxlciwgc3BlY2lmaWNzLCBpbnRlbnQsIDApOworICAgICAgICBmaW5hbCBpbnQgTiA9IGxyaSAhPSBudWxsID8gbHJpLnNpemUoKSA6IDA7CisKKyAgICAgICAgaWYgKChmbGFncyAmIEZMQUdfQVBQRU5EX1RPX0dST1VQKSA9PSAwKSB7CisgICAgICAgICAgICByZW1vdmVHcm91cChncm91cElkKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaW50IGk9MDsgaTxOOyBpKyspIHsKKyAgICAgICAgICAgIGZpbmFsIFJlc29sdmVJbmZvIHJpID0gbHJpLmdldChpKTsKKyAgICAgICAgICAgIEludGVudCByaW50ZW50ID0gbmV3IEludGVudCgKKyAgICAgICAgICAgICAgICByaS5zcGVjaWZpY0luZGV4IDwgMCA/IGludGVudCA6IHNwZWNpZmljc1tyaS5zcGVjaWZpY0luZGV4XSk7CisgICAgICAgICAgICByaW50ZW50LnNldENvbXBvbmVudChuZXcgQ29tcG9uZW50TmFtZSgKKyAgICAgICAgICAgICAgICAgICAgcmkuYWN0aXZpdHlJbmZvLmFwcGxpY2F0aW9uSW5mby5wYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgcmkuYWN0aXZpdHlJbmZvLm5hbWUpKTsKKyAgICAgICAgICAgIGZpbmFsIE1lbnVJdGVtIGl0ZW0gPSBhZGQoZ3JvdXBJZCwgaXRlbUlkLCBvcmRlciwgcmkubG9hZExhYmVsKHBtKSkKKyAgICAgICAgICAgICAgICAgICAgLnNldEljb24ocmkubG9hZEljb24ocG0pKQorICAgICAgICAgICAgICAgICAgICAuc2V0SW50ZW50KHJpbnRlbnQpOworICAgICAgICAgICAgaWYgKG91dFNwZWNpZmljSXRlbXMgIT0gbnVsbCAmJiByaS5zcGVjaWZpY0luZGV4ID49IDApIHsKKyAgICAgICAgICAgICAgICBvdXRTcGVjaWZpY0l0ZW1zW3JpLnNwZWNpZmljSW5kZXhdID0gaXRlbTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBOOworICAgIH0KKworICAgIHB1YmxpYyBTdWJNZW51IGFkZFN1Yk1lbnUoQ2hhclNlcXVlbmNlIHRpdGxlKSB7CisgICAgICAgIC8vIFRPRE8gSW1wbGVtZW50IHN1Ym1lbnVzCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBTdWJNZW51IGFkZFN1Yk1lbnUoaW50IHRpdGxlUmVzKSB7CisgICAgICAgIC8vIFRPRE8gSW1wbGVtZW50IHN1Ym1lbnVzCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBTdWJNZW51IGFkZFN1Yk1lbnUoaW50IGdyb3VwSWQsIGludCBpdGVtSWQsIGludCBvcmRlciwKKyAgICAgICAgICAgIENoYXJTZXF1ZW5jZSB0aXRsZSkgeworICAgICAgICAvLyBUT0RPIEltcGxlbWVudCBzdWJtZW51cworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgU3ViTWVudSBhZGRTdWJNZW51KGludCBncm91cElkLCBpbnQgaXRlbUlkLCBpbnQgb3JkZXIsIGludCB0aXRsZVJlcykgeworICAgICAgICAvLyBUT0RPIEltcGxlbWVudCBzdWJtZW51cworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKKyAgICAgICAgbUl0ZW1zLmNsZWFyKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2xvc2UoKSB7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgaW50IGZpbmRJdGVtSW5kZXgoaW50IGlkKSB7CisgICAgICAgIGZpbmFsIEFycmF5TGlzdDxBY3Rpb25NZW51SXRlbT4gaXRlbXMgPSBtSXRlbXM7CisgICAgICAgIGZpbmFsIGludCBpdGVtQ291bnQgPSBpdGVtcy5zaXplKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlbUNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIGlmIChpdGVtcy5nZXQoaSkuZ2V0SXRlbUlkKCkgPT0gaWQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHB1YmxpYyBNZW51SXRlbSBmaW5kSXRlbShpbnQgaWQpIHsKKyAgICAgICAgcmV0dXJuIG1JdGVtcy5nZXQoZmluZEl0ZW1JbmRleChpZCkpOworICAgIH0KKworICAgIHB1YmxpYyBNZW51SXRlbSBnZXRJdGVtKGludCBpbmRleCkgeworICAgICAgICByZXR1cm4gbUl0ZW1zLmdldChpbmRleCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaGFzVmlzaWJsZUl0ZW1zKCkgeworICAgICAgICBmaW5hbCBBcnJheUxpc3Q8QWN0aW9uTWVudUl0ZW0+IGl0ZW1zID0gbUl0ZW1zOworICAgICAgICBmaW5hbCBpbnQgaXRlbUNvdW50ID0gaXRlbXMuc2l6ZSgpOworICAgICAgICAKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtQ291bnQ7IGkrKykgeworICAgICAgICAgICAgaWYgKGl0ZW1zLmdldChpKS5pc1Zpc2libGUoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgQWN0aW9uTWVudUl0ZW0gZmluZEl0ZW1XaXRoU2hvcnRjdXQoaW50IGtleUNvZGUsIEtleUV2ZW50IGV2ZW50KSB7CisgICAgICAgIC8vIFRPRE8gTWFrZSB0aGlzIHNtYXJ0ZXIuCisgICAgICAgIGZpbmFsIGJvb2xlYW4gcXdlcnR5ID0gbUlzUXdlcnR5OworICAgICAgICBmaW5hbCBBcnJheUxpc3Q8QWN0aW9uTWVudUl0ZW0+IGl0ZW1zID0gbUl0ZW1zOworICAgICAgICBmaW5hbCBpbnQgaXRlbUNvdW50ID0gaXRlbXMuc2l6ZSgpOworICAgICAgICAKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtQ291bnQ7IGkrKykgeworICAgICAgICAgICAgQWN0aW9uTWVudUl0ZW0gaXRlbSA9IGl0ZW1zLmdldChpKTsKKyAgICAgICAgICAgIGZpbmFsIGNoYXIgc2hvcnRjdXQgPSBxd2VydHkgPyBpdGVtLmdldEFscGhhYmV0aWNTaG9ydGN1dCgpIDoKKyAgICAgICAgICAgICAgICAgICAgaXRlbS5nZXROdW1lcmljU2hvcnRjdXQoKTsKKyAgICAgICAgICAgIGlmIChrZXlDb2RlID09IHNob3J0Y3V0KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNTaG9ydGN1dEtleShpbnQga2V5Q29kZSwgS2V5RXZlbnQgZXZlbnQpIHsKKyAgICAgICAgcmV0dXJuIGZpbmRJdGVtV2l0aFNob3J0Y3V0KGtleUNvZGUsIGV2ZW50KSAhPSBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHBlcmZvcm1JZGVudGlmaWVyQWN0aW9uKGludCBpZCwgaW50IGZsYWdzKSB7CisgICAgICAgIGZpbmFsIGludCBpbmRleCA9IGZpbmRJdGVtSW5kZXgoaWQpOworICAgICAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbUl0ZW1zLmdldChpbmRleCkuaW52b2tlKCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gcGVyZm9ybVNob3J0Y3V0KGludCBrZXlDb2RlLCBLZXlFdmVudCBldmVudCwgaW50IGZsYWdzKSB7CisgICAgICAgIEFjdGlvbk1lbnVJdGVtIGl0ZW0gPSBmaW5kSXRlbVdpdGhTaG9ydGN1dChrZXlDb2RlLCBldmVudCk7CisgICAgICAgIGlmIChpdGVtID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcmV0dXJuIGl0ZW0uaW52b2tlKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVtb3ZlR3JvdXAoaW50IGdyb3VwSWQpIHsKKyAgICAgICAgZmluYWwgQXJyYXlMaXN0PEFjdGlvbk1lbnVJdGVtPiBpdGVtcyA9IG1JdGVtczsKKyAgICAgICAgaW50IGl0ZW1Db3VudCA9IGl0ZW1zLnNpemUoKTsKKyAgICAgICAgaW50IGkgPSAwOworICAgICAgICB3aGlsZSAoaSA8IGl0ZW1Db3VudCkgeworICAgICAgICAgICAgaWYgKGl0ZW1zLmdldChpKS5nZXRHcm91cElkKCkgPT0gZ3JvdXBJZCkgeworICAgICAgICAgICAgICAgIGl0ZW1zLnJlbW92ZShpKTsKKyAgICAgICAgICAgICAgICBpdGVtQ291bnQtLTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVtb3ZlSXRlbShpbnQgaWQpIHsKKyAgICAgICAgbUl0ZW1zLnJlbW92ZShmaW5kSXRlbUluZGV4KGlkKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0R3JvdXBDaGVja2FibGUoaW50IGdyb3VwLCBib29sZWFuIGNoZWNrYWJsZSwKKyAgICAgICAgICAgIGJvb2xlYW4gZXhjbHVzaXZlKSB7CisgICAgICAgIGZpbmFsIEFycmF5TGlzdDxBY3Rpb25NZW51SXRlbT4gaXRlbXMgPSBtSXRlbXM7CisgICAgICAgIGZpbmFsIGludCBpdGVtQ291bnQgPSBpdGVtcy5zaXplKCk7CisgICAgICAgIAorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1Db3VudDsgaSsrKSB7CisgICAgICAgICAgICBBY3Rpb25NZW51SXRlbSBpdGVtID0gaXRlbXMuZ2V0KGkpOworICAgICAgICAgICAgaWYgKGl0ZW0uZ2V0R3JvdXBJZCgpID09IGdyb3VwKSB7CisgICAgICAgICAgICAgICAgaXRlbS5zZXRDaGVja2FibGUoY2hlY2thYmxlKTsKKyAgICAgICAgICAgICAgICBpdGVtLnNldEV4Y2x1c2l2ZUNoZWNrYWJsZShleGNsdXNpdmUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0R3JvdXBFbmFibGVkKGludCBncm91cCwgYm9vbGVhbiBlbmFibGVkKSB7CisgICAgICAgIGZpbmFsIEFycmF5TGlzdDxBY3Rpb25NZW51SXRlbT4gaXRlbXMgPSBtSXRlbXM7CisgICAgICAgIGZpbmFsIGludCBpdGVtQ291bnQgPSBpdGVtcy5zaXplKCk7CisgICAgICAgIAorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1Db3VudDsgaSsrKSB7CisgICAgICAgICAgICBBY3Rpb25NZW51SXRlbSBpdGVtID0gaXRlbXMuZ2V0KGkpOworICAgICAgICAgICAgaWYgKGl0ZW0uZ2V0R3JvdXBJZCgpID09IGdyb3VwKSB7CisgICAgICAgICAgICAgICAgaXRlbS5zZXRFbmFibGVkKGVuYWJsZWQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0R3JvdXBWaXNpYmxlKGludCBncm91cCwgYm9vbGVhbiB2aXNpYmxlKSB7CisgICAgICAgIGZpbmFsIEFycmF5TGlzdDxBY3Rpb25NZW51SXRlbT4gaXRlbXMgPSBtSXRlbXM7CisgICAgICAgIGZpbmFsIGludCBpdGVtQ291bnQgPSBpdGVtcy5zaXplKCk7CisgICAgICAgIAorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1Db3VudDsgaSsrKSB7CisgICAgICAgICAgICBBY3Rpb25NZW51SXRlbSBpdGVtID0gaXRlbXMuZ2V0KGkpOworICAgICAgICAgICAgaWYgKGl0ZW0uZ2V0R3JvdXBJZCgpID09IGdyb3VwKSB7CisgICAgICAgICAgICAgICAgaXRlbS5zZXRWaXNpYmxlKHZpc2libGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UXdlcnR5TW9kZShib29sZWFuIGlzUXdlcnR5KSB7CisgICAgICAgIG1Jc1F3ZXJ0eSA9IGlzUXdlcnR5OworICAgIH0KKworICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKKyAgICAgICAgcmV0dXJuIG1JdGVtcy5zaXplKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9BY3Rpb25NZW51SXRlbS5qYXZhIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9BY3Rpb25NZW51SXRlbS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzNTg3NWEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9tZW51L0FjdGlvbk1lbnVJdGVtLmphdmEKQEAgLTAsMCArMSwyMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudTsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUl0ZW07CitpbXBvcnQgYW5kcm9pZC52aWV3LlN1Yk1lbnU7CitpbXBvcnQgYW5kcm9pZC52aWV3LkNvbnRleHRNZW51LkNvbnRleHRNZW51SW5mbzsKKworLyoqCisgKiBAaGlkZQorICovCitwdWJsaWMgY2xhc3MgQWN0aW9uTWVudUl0ZW0gaW1wbGVtZW50cyBNZW51SXRlbSB7CisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbUlkOworICAgIHByaXZhdGUgZmluYWwgaW50IG1Hcm91cDsKKyAgICBwcml2YXRlIGZpbmFsIGludCBtQ2F0ZWdvcnlPcmRlcjsKKyAgICBwcml2YXRlIGZpbmFsIGludCBtT3JkZXJpbmc7CisgICAgCisgICAgcHJpdmF0ZSBDaGFyU2VxdWVuY2UgbVRpdGxlOworICAgIHByaXZhdGUgQ2hhclNlcXVlbmNlIG1UaXRsZUNvbmRlbnNlZDsKKyAgICBwcml2YXRlIEludGVudCBtSW50ZW50OworICAgIHByaXZhdGUgY2hhciBtU2hvcnRjdXROdW1lcmljQ2hhcjsKKyAgICBwcml2YXRlIGNoYXIgbVNob3J0Y3V0QWxwaGFiZXRpY0NoYXI7CisgICAgCisgICAgcHJpdmF0ZSBEcmF3YWJsZSBtSWNvbkRyYXdhYmxlOworICAgIHByaXZhdGUgaW50IG1JY29uUmVzSWQgPSBOT19JQ09OOworICAgIAorICAgIHByaXZhdGUgQ29udGV4dCBtQ29udGV4dDsKKyAgICAKKyAgICBwcml2YXRlIE1lbnVJdGVtLk9uTWVudUl0ZW1DbGlja0xpc3RlbmVyIG1DbGlja0xpc3RlbmVyOworICAgIAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOT19JQ09OID0gMDsKKyAgICAKKyAgICBwcml2YXRlIGludCBtRmxhZ3MgPSBFTkFCTEVEOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDSEVDS0FCTEUgICAgICA9IDB4MDAwMDAwMDE7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENIRUNLRUQgICAgICAgID0gMHgwMDAwMDAwMjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVhDTFVTSVZFICAgICAgPSAweDAwMDAwMDA0OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBISURERU4gICAgICAgICA9IDB4MDAwMDAwMDg7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVOQUJMRUQgICAgICAgID0gMHgwMDAwMDAxMDsKKyAgICAKKyAgICBwdWJsaWMgQWN0aW9uTWVudUl0ZW0oQ29udGV4dCBjb250ZXh0LCBpbnQgZ3JvdXAsIGludCBpZCwgaW50IGNhdGVnb3J5T3JkZXIsIGludCBvcmRlcmluZywKKyAgICAgICAgICAgIENoYXJTZXF1ZW5jZSB0aXRsZSkgeworICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CisgICAgICAgIG1JZCA9IGlkOworICAgICAgICBtR3JvdXAgPSBncm91cDsKKyAgICAgICAgbUNhdGVnb3J5T3JkZXIgPSBjYXRlZ29yeU9yZGVyOworICAgICAgICBtT3JkZXJpbmcgPSBvcmRlcmluZzsKKyAgICAgICAgbVRpdGxlID0gdGl0bGU7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBjaGFyIGdldEFscGhhYmV0aWNTaG9ydGN1dCgpIHsKKyAgICAgICAgcmV0dXJuIG1TaG9ydGN1dEFscGhhYmV0aWNDaGFyOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0R3JvdXBJZCgpIHsKKyAgICAgICAgcmV0dXJuIG1Hcm91cDsKKyAgICB9CisKKyAgICBwdWJsaWMgRHJhd2FibGUgZ2V0SWNvbigpIHsKKyAgICAgICAgcmV0dXJuIG1JY29uRHJhd2FibGU7CisgICAgfQorCisgICAgcHVibGljIEludGVudCBnZXRJbnRlbnQoKSB7CisgICAgICAgIHJldHVybiBtSW50ZW50OworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0SXRlbUlkKCkgeworICAgICAgICByZXR1cm4gbUlkOworICAgIH0KKworICAgIHB1YmxpYyBDb250ZXh0TWVudUluZm8gZ2V0TWVudUluZm8oKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBjaGFyIGdldE51bWVyaWNTaG9ydGN1dCgpIHsKKyAgICAgICAgcmV0dXJuIG1TaG9ydGN1dE51bWVyaWNDaGFyOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0T3JkZXIoKSB7CisgICAgICAgIHJldHVybiBtT3JkZXJpbmc7CisgICAgfQorCisgICAgcHVibGljIFN1Yk1lbnUgZ2V0U3ViTWVudSgpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXRUaXRsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1UaXRsZTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2hhclNlcXVlbmNlIGdldFRpdGxlQ29uZGVuc2VkKCkgeworICAgICAgICByZXR1cm4gbVRpdGxlQ29uZGVuc2VkOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGhhc1N1Yk1lbnUoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0NoZWNrYWJsZSgpIHsKKyAgICAgICAgcmV0dXJuIChtRmxhZ3MgJiBDSEVDS0FCTEUpICE9IDA7IAorICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzQ2hlY2tlZCgpIHsKKyAgICAgICAgcmV0dXJuIChtRmxhZ3MgJiBDSEVDS0VEKSAhPSAwOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsKKyAgICAgICAgcmV0dXJuIChtRmxhZ3MgJiBFTkFCTEVEKSAhPSAwOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzVmlzaWJsZSgpIHsKKyAgICAgICAgcmV0dXJuIChtRmxhZ3MgJiBISURERU4pID09IDA7CisgICAgfQorCisgICAgcHVibGljIE1lbnVJdGVtIHNldEFscGhhYmV0aWNTaG9ydGN1dChjaGFyIGFscGhhQ2hhcikgeworICAgICAgICBtU2hvcnRjdXRBbHBoYWJldGljQ2hhciA9IGFscGhhQ2hhcjsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIE1lbnVJdGVtIHNldENoZWNrYWJsZShib29sZWFuIGNoZWNrYWJsZSkgeworICAgICAgICBtRmxhZ3MgPSAobUZsYWdzICYgfkNIRUNLQUJMRSkgfCAoY2hlY2thYmxlID8gQ0hFQ0tBQkxFIDogMCk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgQWN0aW9uTWVudUl0ZW0gc2V0RXhjbHVzaXZlQ2hlY2thYmxlKGJvb2xlYW4gZXhjbHVzaXZlKSB7CisgICAgICAgIG1GbGFncyA9IChtRmxhZ3MgJiB+RVhDTFVTSVZFKSB8IChleGNsdXNpdmUgPyBFWENMVVNJVkUgOiAwKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIE1lbnVJdGVtIHNldENoZWNrZWQoYm9vbGVhbiBjaGVja2VkKSB7CisgICAgICAgIG1GbGFncyA9IChtRmxhZ3MgJiB+Q0hFQ0tFRCkgfCAoY2hlY2tlZCA/IENIRUNLRUQgOiAwKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIE1lbnVJdGVtIHNldEVuYWJsZWQoYm9vbGVhbiBlbmFibGVkKSB7CisgICAgICAgIG1GbGFncyA9IChtRmxhZ3MgJiB+RU5BQkxFRCkgfCAoZW5hYmxlZCA/IEVOQUJMRUQgOiAwKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIE1lbnVJdGVtIHNldEljb24oRHJhd2FibGUgaWNvbikgeworICAgICAgICBtSWNvbkRyYXdhYmxlID0gaWNvbjsKKyAgICAgICAgbUljb25SZXNJZCA9IE5PX0lDT047CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBNZW51SXRlbSBzZXRJY29uKGludCBpY29uUmVzKSB7CisgICAgICAgIG1JY29uUmVzSWQgPSBpY29uUmVzOworICAgICAgICBtSWNvbkRyYXdhYmxlID0gbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0RHJhd2FibGUoaWNvblJlcyk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBNZW51SXRlbSBzZXRJbnRlbnQoSW50ZW50IGludGVudCkgeworICAgICAgICBtSW50ZW50ID0gaW50ZW50OworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgTWVudUl0ZW0gc2V0TnVtZXJpY1Nob3J0Y3V0KGNoYXIgbnVtZXJpY0NoYXIpIHsKKyAgICAgICAgbVNob3J0Y3V0TnVtZXJpY0NoYXIgPSBudW1lcmljQ2hhcjsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIE1lbnVJdGVtIHNldE9uTWVudUl0ZW1DbGlja0xpc3RlbmVyKE9uTWVudUl0ZW1DbGlja0xpc3RlbmVyIG1lbnVJdGVtQ2xpY2tMaXN0ZW5lcikgeworICAgICAgICBtQ2xpY2tMaXN0ZW5lciA9IG1lbnVJdGVtQ2xpY2tMaXN0ZW5lcjsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIE1lbnVJdGVtIHNldFNob3J0Y3V0KGNoYXIgbnVtZXJpY0NoYXIsIGNoYXIgYWxwaGFDaGFyKSB7CisgICAgICAgIG1TaG9ydGN1dE51bWVyaWNDaGFyID0gbnVtZXJpY0NoYXI7CisgICAgICAgIG1TaG9ydGN1dEFscGhhYmV0aWNDaGFyID0gYWxwaGFDaGFyOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgTWVudUl0ZW0gc2V0VGl0bGUoQ2hhclNlcXVlbmNlIHRpdGxlKSB7CisgICAgICAgIG1UaXRsZSA9IHRpdGxlOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgTWVudUl0ZW0gc2V0VGl0bGUoaW50IHRpdGxlKSB7CisgICAgICAgIG1UaXRsZSA9IG1Db250ZXh0LmdldFJlc291cmNlcygpLmdldFN0cmluZyh0aXRsZSk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBNZW51SXRlbSBzZXRUaXRsZUNvbmRlbnNlZChDaGFyU2VxdWVuY2UgdGl0bGUpIHsKKyAgICAgICAgbVRpdGxlQ29uZGVuc2VkID0gdGl0bGU7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBNZW51SXRlbSBzZXRWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkgeworICAgICAgICBtRmxhZ3MgPSAobUZsYWdzICYgSElEREVOKSB8ICh2aXNpYmxlID8gMCA6IEhJRERFTik7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGludm9rZSgpIHsKKyAgICAgICAgaWYgKG1DbGlja0xpc3RlbmVyICE9IG51bGwgJiYgbUNsaWNrTGlzdGVuZXIub25NZW51SXRlbUNsaWNrKHRoaXMpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKG1JbnRlbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgbUNvbnRleHQuc3RhcnRBY3Rpdml0eShtSW50ZW50KTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHNldFNob3dBc0FjdGlvbihpbnQgc2hvdykgeworICAgICAgICAvLyBEbyBub3RoaW5nLiBBY3Rpb25NZW51SXRlbXMgYWx3YXlzIHNob3cgYXMgYWN0aW9uIGJ1dHRvbnMuCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9BY3Rpb25NZW51SXRlbVZpZXcuamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L21lbnUvQWN0aW9uTWVudUl0ZW1WaWV3LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTIyMWZhZgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L21lbnUvQWN0aW9uTWVudUl0ZW1WaWV3LmphdmEKQEAgLTAsMCArMSwxMjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudTsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7CitpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5CdXR0b247CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuRnJhbWVMYXlvdXQ7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuSW1hZ2VCdXR0b247CisKKy8qKgorICogQGhpZGUKKyAqLworcHVibGljIGNsYXNzIEFjdGlvbk1lbnVJdGVtVmlldyBleHRlbmRzIEZyYW1lTGF5b3V0CisgICAgICAgIGltcGxlbWVudHMgTWVudVZpZXcuSXRlbVZpZXcsIFZpZXcuT25DbGlja0xpc3RlbmVyIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkFjdGlvbk1lbnVJdGVtVmlldyI7CisKKyAgICBwcml2YXRlIE1lbnVJdGVtSW1wbCBtSXRlbURhdGE7CisgICAgcHJpdmF0ZSBDaGFyU2VxdWVuY2UgbVRpdGxlOworICAgIHByaXZhdGUgTWVudUJ1aWxkZXIuSXRlbUludm9rZXIgbUl0ZW1JbnZva2VyOworCisgICAgcHJpdmF0ZSBJbWFnZUJ1dHRvbiBtSW1hZ2VCdXR0b247CisgICAgcHJpdmF0ZSBCdXR0b24gbVRleHRCdXR0b247CisKKyAgICBwdWJsaWMgQWN0aW9uTWVudUl0ZW1WaWV3KENvbnRleHQgY29udGV4dCkgeworICAgICAgICB0aGlzKGNvbnRleHQsIG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyBBY3Rpb25NZW51SXRlbVZpZXcoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKKyAgICAgICAgdGhpcyhjb250ZXh0LCBhdHRycywgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hdHRyLmFjdGlvbkJ1dHRvblN0eWxlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQWN0aW9uTWVudUl0ZW1WaWV3KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGUpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkZpbmlzaEluZmxhdGUoKSB7CisgICAgICAgIG1JbWFnZUJ1dHRvbiA9IChJbWFnZUJ1dHRvbikgZmluZFZpZXdCeUlkKGNvbS5hbmRyb2lkLmludGVybmFsLlIuaWQuaW1hZ2VCdXR0b24pOworICAgICAgICBtVGV4dEJ1dHRvbiA9IChCdXR0b24pIGZpbmRWaWV3QnlJZChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmlkLnRleHRCdXR0b24pOworICAgICAgICBtSW1hZ2VCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKHRoaXMpOworICAgICAgICBtVGV4dEJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIodGhpcyk7CisgICAgfQorCisgICAgcHVibGljIE1lbnVJdGVtSW1wbCBnZXRJdGVtRGF0YSgpIHsKKyAgICAgICAgcmV0dXJuIG1JdGVtRGF0YTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKE1lbnVJdGVtSW1wbCBpdGVtRGF0YSwgaW50IG1lbnVUeXBlKSB7CisgICAgICAgIG1JdGVtRGF0YSA9IGl0ZW1EYXRhOworCisgICAgICAgIHNldENsaWNrYWJsZSh0cnVlKTsKKyAgICAgICAgc2V0Rm9jdXNhYmxlKHRydWUpOworICAgICAgICBzZXRJY29uKGl0ZW1EYXRhLmdldEljb24oKSk7CisgICAgICAgIHNldFRpdGxlKGl0ZW1EYXRhLmdldFRpdGxlKCkpOyAvLyBUaXRsZSBvbmx5IHRha2VzIGVmZmVjdCBpZiB0aGVyZSBpcyBubyBpY29uCisgICAgICAgIHNldElkKGl0ZW1EYXRhLmdldEl0ZW1JZCgpKTsKKworICAgICAgICBzZXRWaXNpYmlsaXR5KGl0ZW1EYXRhLmlzVmlzaWJsZSgpID8gVmlldy5WSVNJQkxFIDogVmlldy5HT05FKTsKKyAgICAgICAgc2V0RW5hYmxlZChpdGVtRGF0YS5pc0VuYWJsZWQoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgaWYgKG1JdGVtSW52b2tlciAhPSBudWxsKSB7CisgICAgICAgICAgICBtSXRlbUludm9rZXIuaW52b2tlSXRlbShtSXRlbURhdGEpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0SXRlbUludm9rZXIoTWVudUJ1aWxkZXIuSXRlbUludm9rZXIgaW52b2tlcikgeworICAgICAgICBtSXRlbUludm9rZXIgPSBpbnZva2VyOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHByZWZlcnNDb25kZW5zZWRUaXRsZSgpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENoZWNrYWJsZShib29sZWFuIGNoZWNrYWJsZSkgeworICAgICAgICAvLyBUT0RPIFN1cHBvcnQgY2hlY2thYmxlIGFjdGlvbiBpdGVtcworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENoZWNrZWQoYm9vbGVhbiBjaGVja2VkKSB7CisgICAgICAgIC8vIFRPRE8gU3VwcG9ydCBjaGVja2FibGUgYWN0aW9uIGl0ZW1zCisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0SWNvbihEcmF3YWJsZSBpY29uKSB7CisgICAgICAgIG1JbWFnZUJ1dHRvbi5zZXRJbWFnZURyYXdhYmxlKGljb24pOworICAgICAgICBpZiAoaWNvbiAhPSBudWxsKSB7CisgICAgICAgICAgICBtSW1hZ2VCdXR0b24uc2V0VmlzaWJpbGl0eShWSVNJQkxFKTsKKyAgICAgICAgICAgIG1UZXh0QnV0dG9uLnNldFZpc2liaWxpdHkoR09ORSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtSW1hZ2VCdXR0b24uc2V0VmlzaWJpbGl0eShHT05FKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFNob3J0Y3V0KGJvb2xlYW4gc2hvd1Nob3J0Y3V0LCBjaGFyIHNob3J0Y3V0S2V5KSB7CisgICAgICAgIC8vIEFjdGlvbiBidXR0b25zIGRvbid0IHNob3cgdGV4dCBmb3Igc2hvcnRjdXQga2V5cy4KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRUaXRsZShDaGFyU2VxdWVuY2UgdGl0bGUpIHsKKyAgICAgICAgbVRpdGxlID0gdGl0bGU7CisKKyAgICAgICAgLy8gcG9wdWxhdGUgYWNjZXNzaWJpbGl0eSBkZXNjcmlwdGlvbiB3aXRoIHRpdGxlCisgICAgICAgIHNldENvbnRlbnREZXNjcmlwdGlvbih0aXRsZSk7CisKKyAgICAgICAgaWYgKG1JbWFnZUJ1dHRvbi5nZXREcmF3YWJsZSgpID09IG51bGwpIHsKKyAgICAgICAgICAgIG1UZXh0QnV0dG9uLnNldFRleHQobVRpdGxlKTsKKyAgICAgICAgICAgIG1UZXh0QnV0dG9uLnNldFZpc2liaWxpdHkoVklTSUJMRSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBzaG93c0ljb24oKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L21lbnUvQWN0aW9uTWVudVZpZXcuamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L21lbnUvQWN0aW9uTWVudVZpZXcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDY0ZTJjCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9BY3Rpb25NZW51Vmlldy5qYXZhCkBAIC0wLDAgKzEsMjM4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51OworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OworaW1wb3J0IGFuZHJvaWQudmlldy5HcmF2aXR5OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuSW1hZ2VCdXR0b247CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGluZWFyTGF5b3V0OworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKworLyoqCisgKiBAaGlkZQorICovCitwdWJsaWMgY2xhc3MgQWN0aW9uTWVudVZpZXcgZXh0ZW5kcyBMaW5lYXJMYXlvdXQgaW1wbGVtZW50cyBNZW51QnVpbGRlci5JdGVtSW52b2tlciwgTWVudVZpZXcgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiQWN0aW9uTWVudVZpZXciOworICAgIAorICAgIHByaXZhdGUgTWVudUJ1aWxkZXIgbU1lbnU7CisKKyAgICBwcml2YXRlIGludCBtSXRlbVBhZGRpbmc7CisgICAgcHJpdmF0ZSBpbnQgbUl0ZW1NYXJnaW47CisgICAgcHJpdmF0ZSBpbnQgbU1heEl0ZW1zOworICAgIHByaXZhdGUgYm9vbGVhbiBtUmVzZXJ2ZU92ZXJmbG93OworICAgIHByaXZhdGUgT3ZlcmZsb3dNZW51QnV0dG9uIG1PdmVyZmxvd0J1dHRvbjsKKyAgICBwcml2YXRlIE1lbnVQb3B1cEhlbHBlciBtT3ZlcmZsb3dQb3B1cDsKKworICAgIHByaXZhdGUgUnVubmFibGUgbVNob3dPdmVyZmxvdyA9IG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgc2hvd092ZXJmbG93TWVudSgpOworICAgICAgICB9CisgICAgfTsKKyAgICAKKyAgICBwdWJsaWMgQWN0aW9uTWVudVZpZXcoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHRoaXMoY29udGV4dCwgbnVsbCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBBY3Rpb25NZW51VmlldyhDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgeworICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycyk7CisgICAgICAgIAorICAgICAgICBUeXBlZEFycmF5IGEgPSBjb250ZXh0Lm9idGFpblN0eWxlZEF0dHJpYnV0ZXMoYXR0cnMsCisgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuVGhlbWUpOworICAgICAgICBtSXRlbVBhZGRpbmcgPSBhLmdldERpbWVuc2lvblBpeGVsT2Zmc2V0KAorICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLlRoZW1lX2FjdGlvbkJ1dHRvblBhZGRpbmcsIDApOworICAgICAgICBtSXRlbU1hcmdpbiA9IG1JdGVtUGFkZGluZyAvIDI7CisgICAgICAgIGEucmVjeWNsZSgpOworCisgICAgICAgIC8vIE1lYXN1cmUgZm9yIGluaXRpYWwgY29uZmlndXJhdGlvbgorICAgICAgICBtTWF4SXRlbXMgPSBtZWFzdXJlTWF4QWN0aW9uQnV0dG9ucygpOworCisgICAgICAgIC8vIFRPRE8gVGhlcmUgaGFzIHRvIGJlIGEgYmV0dGVyIHdheSB0byBpbmRpY2F0ZSB0aGF0IHdlIGRvbid0IGhhdmUgYSBoYXJkIG1lbnUga2V5LgorICAgICAgICBmaW5hbCBpbnQgc2NyZWVuID0gZ2V0UmVzb3VyY2VzKCkuZ2V0Q29uZmlndXJhdGlvbigpLnNjcmVlbkxheW91dDsKKyAgICAgICAgbVJlc2VydmVPdmVyZmxvdyA9IChzY3JlZW4gJiBDb25maWd1cmF0aW9uLlNDUkVFTkxBWU9VVF9TSVpFX01BU0spID09CisgICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5TQ1JFRU5MQVlPVVRfU0laRV9YTEFSR0U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25Db25maWd1cmF0aW9uQ2hhbmdlZChDb25maWd1cmF0aW9uIG5ld0NvbmZpZykgeworICAgICAgICBmaW5hbCBpbnQgc2NyZWVuID0gbmV3Q29uZmlnLnNjcmVlbkxheW91dDsKKyAgICAgICAgbVJlc2VydmVPdmVyZmxvdyA9IChzY3JlZW4gJiBDb25maWd1cmF0aW9uLlNDUkVFTkxBWU9VVF9TSVpFX01BU0spID09CisgICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5TQ1JFRU5MQVlPVVRfU0laRV9YTEFSR0U7CisgICAgICAgIG1NYXhJdGVtcyA9IG1lYXN1cmVNYXhBY3Rpb25CdXR0b25zKCk7CisgICAgICAgIGlmIChtTWVudSAhPSBudWxsKSB7CisgICAgICAgICAgICBtTWVudS5zZXRNYXhBY3Rpb25JdGVtcyhtTWF4SXRlbXMpOworICAgICAgICAgICAgdXBkYXRlQ2hpbGRyZW4oZmFsc2UpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1PdmVyZmxvd1BvcHVwICE9IG51bGwgJiYgbU92ZXJmbG93UG9wdXAuaXNTaG93aW5nKCkpIHsKKyAgICAgICAgICAgIG1PdmVyZmxvd1BvcHVwLmRpc21pc3MoKTsKKyAgICAgICAgICAgIHBvc3QobVNob3dPdmVyZmxvdyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGludCBtZWFzdXJlTWF4QWN0aW9uQnV0dG9ucygpIHsKKyAgICAgICAgZmluYWwgUmVzb3VyY2VzIHJlcyA9IGdldFJlc291cmNlcygpOworICAgICAgICBmaW5hbCBpbnQgc2l6ZSA9IHJlcy5nZXREaW1lbnNpb25QaXhlbFNpemUoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5kaW1lbi5hY3Rpb25faWNvbl9zaXplKTsKKyAgICAgICAgZmluYWwgaW50IHNwYWNlQXZhaWxhYmxlID0gcmVzLmdldERpc3BsYXlNZXRyaWNzKCkud2lkdGhQaXhlbHMgLyAyOworICAgICAgICBmaW5hbCBpbnQgaXRlbVNwYWNlID0gc2l6ZSArIG1JdGVtUGFkZGluZzsKKyAgICAgICAgCisgICAgICAgIHJldHVybiBzcGFjZUF2YWlsYWJsZSAvIChpdGVtU3BhY2UgPiAwID8gaXRlbVNwYWNlIDogMSk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNPdmVyZmxvd1Jlc2VydmVkKCkgeworICAgICAgICByZXR1cm4gbVJlc2VydmVPdmVyZmxvdzsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgc2V0T3ZlcmZsb3dSZXNlcnZlZChib29sZWFuIHJlc2VydmVPdmVyZmxvdykgeworICAgICAgICBtUmVzZXJ2ZU92ZXJmbG93ID0gcmVzZXJ2ZU92ZXJmbG93OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBib29sZWFuIGNoZWNrTGF5b3V0UGFyYW1zKFZpZXdHcm91cC5MYXlvdXRQYXJhbXMgcCkgeworICAgICAgICBpZiAocCBpbnN0YW5jZW9mIExheW91dFBhcmFtcykgeworICAgICAgICAgICAgTGF5b3V0UGFyYW1zIGxwID0gKExheW91dFBhcmFtcykgcDsKKyAgICAgICAgICAgIHJldHVybiBscC5sZWZ0TWFyZ2luID09IG1JdGVtTWFyZ2luICYmIGxwLnJpZ2h0TWFyZ2luID09IG1JdGVtTWFyZ2luICYmCisgICAgICAgICAgICAgICAgICAgIGxwLmdyYXZpdHkgPT0gR3Jhdml0eS5DRU5URVJfVkVSVElDQUwgJiYKKyAgICAgICAgICAgICAgICAgICAgbHAud2lkdGggPT0gTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCAmJiBscC5oZWlnaHQgPT0gTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIAorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBMYXlvdXRQYXJhbXMgZ2VuZXJhdGVEZWZhdWx0TGF5b3V0UGFyYW1zKCkgeworICAgICAgICBMYXlvdXRQYXJhbXMgcGFyYW1zID0gbmV3IExheW91dFBhcmFtcyhMYXlvdXRQYXJhbXMuV1JBUF9DT05URU5ULAorICAgICAgICAgICAgICAgIExheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQpOworICAgICAgICBwYXJhbXMubGVmdE1hcmdpbiA9IG1JdGVtTWFyZ2luOworICAgICAgICBwYXJhbXMucmlnaHRNYXJnaW4gPSBtSXRlbU1hcmdpbjsKKyAgICAgICAgcGFyYW1zLmdyYXZpdHkgPSBHcmF2aXR5LkNFTlRFUl9WRVJUSUNBTDsKKyAgICAgICAgcmV0dXJuIHBhcmFtczsKKyAgICB9CisgICAgCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIExheW91dFBhcmFtcyBnZW5lcmF0ZUxheW91dFBhcmFtcyhWaWV3R3JvdXAuTGF5b3V0UGFyYW1zIHApIHsKKyAgICAgICAgcmV0dXJuIGdlbmVyYXRlRGVmYXVsdExheW91dFBhcmFtcygpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgaW50IGdldEl0ZW1NYXJnaW4oKSB7CisgICAgICAgIHJldHVybiBtSXRlbU1hcmdpbjsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpbnZva2VJdGVtKE1lbnVJdGVtSW1wbCBpdGVtKSB7CisgICAgICAgIHJldHVybiBtTWVudS5wZXJmb3JtSXRlbUFjdGlvbihpdGVtLCAwKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFdpbmRvd0FuaW1hdGlvbnMoKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGluaXRpYWxpemUoTWVudUJ1aWxkZXIgbWVudSwgaW50IG1lbnVUeXBlKSB7CisgICAgICAgIG1lbnUuc2V0TWF4QWN0aW9uSXRlbXMobU1heEl0ZW1zKTsKKyAgICAgICAgbU1lbnUgPSBtZW51OworICAgICAgICB1cGRhdGVDaGlsZHJlbih0cnVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB1cGRhdGVDaGlsZHJlbihib29sZWFuIGNsZWFyZWQpIHsKKyAgICAgICAgZmluYWwgYm9vbGVhbiByZXNlcnZlT3ZlcmZsb3cgPSBtUmVzZXJ2ZU92ZXJmbG93OworICAgICAgICByZW1vdmVBbGxWaWV3cygpOworICAgICAgICAKKyAgICAgICAgZmluYWwgQXJyYXlMaXN0PE1lbnVJdGVtSW1wbD4gaXRlbXNUb1Nob3cgPSBtTWVudS5nZXRBY3Rpb25JdGVtcyhyZXNlcnZlT3ZlcmZsb3cpOworICAgICAgICBmaW5hbCBpbnQgaXRlbUNvdW50ID0gaXRlbXNUb1Nob3cuc2l6ZSgpOworICAgICAgICAKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtQ291bnQ7IGkrKykgeworICAgICAgICAgICAgZmluYWwgTWVudUl0ZW1JbXBsIGl0ZW1EYXRhID0gaXRlbXNUb1Nob3cuZ2V0KGkpOworICAgICAgICAgICAgYWRkSXRlbVZpZXcoKEFjdGlvbk1lbnVJdGVtVmlldykgaXRlbURhdGEuZ2V0SXRlbVZpZXcoTWVudUJ1aWxkZXIuVFlQRV9BQ1RJT05fQlVUVE9OLAorICAgICAgICAgICAgICAgICAgICB0aGlzKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAocmVzZXJ2ZU92ZXJmbG93KSB7CisgICAgICAgICAgICBpZiAobU1lbnUuZ2V0Tm9uQWN0aW9uSXRlbXModHJ1ZSkuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgIE92ZXJmbG93TWVudUJ1dHRvbiBidXR0b24gPSBuZXcgT3ZlcmZsb3dNZW51QnV0dG9uKG1Db250ZXh0KTsKKyAgICAgICAgICAgICAgICBhZGRWaWV3KGJ1dHRvbik7CisgICAgICAgICAgICAgICAgbU92ZXJmbG93QnV0dG9uID0gYnV0dG9uOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtT3ZlcmZsb3dCdXR0b24gPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gc2hvd092ZXJmbG93TWVudSgpIHsKKyAgICAgICAgaWYgKG1PdmVyZmxvd0J1dHRvbiAhPSBudWxsKSB7CisgICAgICAgICAgICBmaW5hbCBNZW51UG9wdXBIZWxwZXIgcG9wdXAgPQorICAgICAgICAgICAgICAgICAgICBuZXcgTWVudVBvcHVwSGVscGVyKGdldENvbnRleHQoKSwgbU1lbnUsIG1PdmVyZmxvd0J1dHRvbiwgdHJ1ZSk7CisgICAgICAgICAgICAvLyBQb3N0IHRoaXMgZm9yIGxhdGVyOyB3ZSBtaWdodCBzdGlsbCBuZWVkIGEgbGF5b3V0IGZvciB0aGUgYW5jaG9yIHRvIGJlIHJpZ2h0LgorICAgICAgICAgICAgcG9zdChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICBwb3B1cC5zaG93KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBtT3ZlcmZsb3dQb3B1cCA9IHBvcHVwOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzT3ZlcmZsb3dNZW51U2hvd2luZygpIHsKKyAgICAgICAgTWVudVBvcHVwSGVscGVyIHBvcHVwID0gbU92ZXJmbG93UG9wdXA7CisgICAgICAgIGlmIChwb3B1cCAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gcG9wdXAuaXNTaG93aW5nKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGhpZGVPdmVyZmxvd01lbnUoKSB7CisgICAgICAgIE1lbnVQb3B1cEhlbHBlciBwb3B1cCA9IG1PdmVyZmxvd1BvcHVwOworICAgICAgICBpZiAocG9wdXAgIT0gbnVsbCkgeworICAgICAgICAgICAgcG9wdXAuZGlzbWlzcygpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhZGRJdGVtVmlldyhBY3Rpb25NZW51SXRlbVZpZXcgdmlldykgeworICAgICAgICB2aWV3LnNldEl0ZW1JbnZva2VyKHRoaXMpOworICAgICAgICBhZGRWaWV3KHZpZXcpOworICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgT3ZlcmZsb3dNZW51QnV0dG9uIGV4dGVuZHMgSW1hZ2VCdXR0b24geworICAgICAgICBwdWJsaWMgT3ZlcmZsb3dNZW51QnV0dG9uKENvbnRleHQgY29udGV4dCkgeworICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgbnVsbCwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hdHRyLmFjdGlvbkJ1dHRvblN0eWxlKTsKKworICAgICAgICAgICAgZmluYWwgUmVzb3VyY2VzIHJlcyA9IGNvbnRleHQuZ2V0UmVzb3VyY2VzKCk7CisgICAgICAgICAgICBzZXRDbGlja2FibGUodHJ1ZSk7CisgICAgICAgICAgICBzZXRGb2N1c2FibGUodHJ1ZSk7CisgICAgICAgICAgICBzZXRDb250ZW50RGVzY3JpcHRpb24ocmVzLmdldFN0cmluZyhjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy5tb3JlX2l0ZW1fbGFiZWwpKTsKKyAgICAgICAgICAgIHNldEltYWdlRHJhd2FibGUocmVzLmdldERyYXdhYmxlKGNvbS5hbmRyb2lkLmludGVybmFsLlIuZHJhd2FibGUuaWNfbWVudV9tb3JlKSk7CisgICAgICAgICAgICBzZXRWaXNpYmlsaXR5KFZJU0lCTEUpOworICAgICAgICAgICAgc2V0RW5hYmxlZCh0cnVlKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBwZXJmb3JtQ2xpY2soKSB7CisgICAgICAgICAgICBpZiAoc3VwZXIucGVyZm9ybUNsaWNrKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQ2hhbmdlIHRvIG92ZXJmbG93IG1vZGUKKyAgICAgICAgICAgIG1NZW51LmdldENhbGxiYWNrKCkub25NZW51TW9kZUNoYW5nZShtTWVudSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L21lbnUvSWNvbk1lbnVWaWV3LmphdmEgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9tZW51L0ljb25NZW51Vmlldy5qYXZhCmluZGV4IGJlYjU3YmEuLjE3OGRjZGUgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L21lbnUvSWNvbk1lbnVWaWV3LmphdmEKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9JY29uTWVudVZpZXcuamF2YQpAQCAtMzM3LDcgKzMzNyw5IEBACiAgICAgICAgIC8vIFRoaXMgbWV0aG9kIGRvZXMgYSBjbGVhciByZWZyZXNoIG9mIGNoaWxkcmVuCiAgICAgICAgIHJlbW92ZUFsbFZpZXdzKCk7CiAgICAgICAgIAotICAgICAgICBmaW5hbCBBcnJheUxpc3Q8TWVudUl0ZW1JbXBsPiBpdGVtc1RvU2hvdyA9IG1NZW51LmdldFZpc2libGVJdGVtcygpOworICAgICAgICAvLyBJY29uTWVudVZpZXcgbmV2ZXIgd2FudHMgY29udGVudCBzb3J0ZWQgZm9yIGFuIG92ZXJmbG93IGFjdGlvbiBidXR0b24sIHNpbmNlCisgICAgICAgIC8vIGl0IGlzIG5ldmVyIHVzZWQgaW4gdGhlIHByZXNlbmNlIG9mIGFuIG92ZXJmbG93IGJ1dHRvbi4KKyAgICAgICAgZmluYWwgQXJyYXlMaXN0PE1lbnVJdGVtSW1wbD4gaXRlbXNUb1Nob3cgPSBtTWVudS5nZXROb25BY3Rpb25JdGVtcyhmYWxzZSk7CiAgICAgICAgIGZpbmFsIGludCBudW1JdGVtcyA9IGl0ZW1zVG9TaG93LnNpemUoKTsKICAgICAgICAgZmluYWwgaW50IG51bUl0ZW1zVGhhdENhbkZpdCA9IG1NYXhJdGVtczsKICAgICAgICAgLy8gTWluaW11bSBvZiB0aGUgbnVtIHRoYXQgY2FuIGZpdCBhbmQgdGhlIG51bSB0aGF0IHdlIGhhdmUKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L21lbnUvTWVudUJ1aWxkZXIuamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L21lbnUvTWVudUJ1aWxkZXIuamF2YQppbmRleCAyMjhkNWQwLi5kMTYwZmVjIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9tZW51L01lbnVCdWlsZGVyLmphdmEKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9NZW51QnVpbGRlci5qYXZhCkBAIC0yNywxNiArMjcsMTcgQEAKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOwogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsYWJsZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGFuZHJvaWQudXRpbC5TcGFyc2VBcnJheTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuQ29udGV4dFRoZW1lV3JhcHBlcjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuS2V5Q2hhcmFjdGVyTWFwOwogaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXI7CiBpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnU7CiBpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnVJdGVtOwogaW1wb3J0IGFuZHJvaWQudmlldy5TdWJNZW51OwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOwogaW1wb3J0IGFuZHJvaWQudmlldy5Db250ZXh0TWVudS5Db250ZXh0TWVudUluZm87CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXc7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuQmFzZUFkYXB0ZXI7CkBAIC01NCw3ICs1NSw3IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR1RBRyA9ICJNZW51QnVpbGRlciI7CiAgICAgCiAgICAgLyoqIFRoZSBudW1iZXIgb2YgZGlmZmVyZW50IG1lbnUgdHlwZXMgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOVU1fVFlQRVMgPSAzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5VTV9UWVBFUyA9IDU7CiAgICAgLyoqIFRoZSBtZW51IHR5cGUgdGhhdCByZXByZXNlbnRzIHRoZSBpY29uIG1lbnUgdmlldyAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfSUNPTiA9IDA7CiAgICAgLyoqIFRoZSBtZW51IHR5cGUgdGhhdCByZXByZXNlbnRzIHRoZSBleHBhbmRlZCBtZW51IHZpZXcgKi8KQEAgLTY1LDE0ICs2NiwyNCBAQAogICAgICAqIGhhdmUgYW4gSXRlbVZpZXcuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9ESUFMT0cgPSAyOworICAgIC8qKgorICAgICAqIFRoZSBtZW51IHR5cGUgdGhhdCByZXByZXNlbnRzIGEgYnV0dG9uIGluIHRoZSBhcHBsaWNhdGlvbidzIGFjdGlvbiBiYXIuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9BQ1RJT05fQlVUVE9OID0gMzsKKyAgICAvKioKKyAgICAgKiBUaGUgbWVudSB0eXBlIHRoYXQgcmVwcmVzZW50cyBhIG1lbnUgcG9wdXAuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9QT1BVUCA9IDQ7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklFV1NfVEFHID0gImFuZHJvaWQ6dmlld3MiOwotICAgIAorCiAgICAgLy8gT3JkZXIgbXVzdCBiZSB0aGUgc2FtZSBvcmRlciBhcyB0aGUgVFlQRV8qCiAgICAgc3RhdGljIGZpbmFsIGludCBUSEVNRV9SRVNfRk9SX1RZUEVbXSA9IG5ldyBpbnRbXSB7CiAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGUuVGhlbWVfSWNvbk1lbnUsCiAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGUuVGhlbWVfRXhwYW5kZWRNZW51LAogICAgICAgICAwLAorICAgICAgICAwLAorICAgICAgICAwLAogICAgIH07CiAgICAgCiAgICAgLy8gT3JkZXIgbXVzdCBiZSB0aGUgc2FtZSBvcmRlciBhcyB0aGUgVFlQRV8qCkBAIC04MCw2ICs5MSw4IEBACiAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIubGF5b3V0Lmljb25fbWVudV9sYXlvdXQsCiAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIubGF5b3V0LmV4cGFuZGVkX21lbnVfbGF5b3V0LAogICAgICAgICAwLAorICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmxheW91dC5hY3Rpb25fbWVudV9sYXlvdXQsCisgICAgICAgIDAsCiAgICAgfTsKIAogICAgIC8vIE9yZGVyIG11c3QgYmUgdGhlIHNhbWUgb3JkZXIgYXMgdGhlIFRZUEVfKgpAQCAtODcsNiArMTAwLDggQEAKICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5sYXlvdXQuaWNvbl9tZW51X2l0ZW1fbGF5b3V0LAogICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmxheW91dC5saXN0X21lbnVfaXRlbV9sYXlvdXQsCiAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIubGF5b3V0Lmxpc3RfbWVudV9pdGVtX2xheW91dCwKKyAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5sYXlvdXQuYWN0aW9uX21lbnVfaXRlbV9sYXlvdXQsCisgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIubGF5b3V0Lmxpc3RfbWVudV9pdGVtX2xheW91dCwKICAgICB9OwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50W10gIHNDYXRlZ29yeVRvT3JkZXIgPSBuZXcgaW50W10gewpAQCAtMTMwLDYgKzE0NSwzNSBAQAogICAgICAqIGZldGNoZWQgZnJvbSB7QGxpbmsgI2dldFZpc2libGVJdGVtcygpfQogICAgICAqLyAKICAgICBwcml2YXRlIGJvb2xlYW4gbUlzVmlzaWJsZUl0ZW1zU3RhbGU7CisgICAgCisgICAgLyoqCisgICAgICogQ29udGFpbnMgb25seSB0aGUgaXRlbXMgdGhhdCBzaG91bGQgYXBwZWFyIGluIHRoZSBBY3Rpb24gQmFyLCBpZiBwcmVzZW50LgorICAgICAqLworICAgIHByaXZhdGUgQXJyYXlMaXN0PE1lbnVJdGVtSW1wbD4gbUFjdGlvbkl0ZW1zOworICAgIC8qKgorICAgICAqIENvbnRhaW5zIGl0ZW1zIHRoYXQgc2hvdWxkIE5PVCBhcHBlYXIgaW4gdGhlIEFjdGlvbiBCYXIsIGlmIHByZXNlbnQuCisgICAgICovCisgICAgcHJpdmF0ZSBBcnJheUxpc3Q8TWVudUl0ZW1JbXBsPiBtTm9uQWN0aW9uSXRlbXM7CisgICAgLyoqCisgICAgICogVGhlIG51bWJlciBvZiB2aXNpYmxlIGFjdGlvbiBidXR0b25zIHBlcm1pdHRlZCBpbiB0aGlzIG1lbnUKKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBtTWF4QWN0aW9uSXRlbXM7CisgICAgLyoqCisgICAgICogV2hldGhlciBvciBub3QgdGhlIGl0ZW1zIChvciBhbnkgb25lIGl0ZW0ncyBhY3Rpb24gc3RhdGUpIGhhcyBjaGFuZ2VkIHNpbmNlIGl0IHdhcworICAgICAqIGxhc3QgZmV0Y2hlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gbUlzQWN0aW9uSXRlbXNTdGFsZTsKKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdGhlIHByb2Nlc3Mgb2YgZ3JhbnRpbmcgc3BhY2UgYXMgYWN0aW9uIGl0ZW1zIHNob3VsZCByZXNlcnZlIGEgc3BhY2UgZm9yCisgICAgICogYW4gb3ZlcmZsb3cgb3B0aW9uIGluIHRoZSBhY3Rpb24gbGlzdC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gbVJlc2VydmVBY3Rpb25PdmVyZmxvdzsKKworICAgIC8qKgorICAgICAqIERlZmF1bHQgdmFsdWUgZm9yIGhvdyBhZGRlZCBpdGVtcyBzaG91bGQgc2hvdyBpbiB0aGUgYWN0aW9uIGxpc3QuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgbURlZmF1bHRTaG93QXNBY3Rpb24gPSBNZW51SXRlbS5TSE9XX0FTX0FDVElPTl9ORVZFUjsKIAogICAgIC8qKgogICAgICAqIEN1cnJlbnQgdXNlIGNhc2UgaXMgQ29udGV4dCBNZW51czogQXMgVmlld3MgcG9wdWxhdGUgdGhlIGNvbnRleHQgbWVudSwgZWFjaCBvbmUgaGFzCkBAIC0yODEsMTAgKzMyNSwxOSBAQAogICAgICAgICBtVmlzaWJsZUl0ZW1zID0gbmV3IEFycmF5TGlzdDxNZW51SXRlbUltcGw+KCk7CiAgICAgICAgIG1Jc1Zpc2libGVJdGVtc1N0YWxlID0gdHJ1ZTsKICAgICAgICAgCisgICAgICAgIG1BY3Rpb25JdGVtcyA9IG5ldyBBcnJheUxpc3Q8TWVudUl0ZW1JbXBsPigpOworICAgICAgICBtTm9uQWN0aW9uSXRlbXMgPSBuZXcgQXJyYXlMaXN0PE1lbnVJdGVtSW1wbD4oKTsKKyAgICAgICAgbUlzQWN0aW9uSXRlbXNTdGFsZSA9IHRydWU7CisgICAgICAgIAogICAgICAgICBtU2hvcnRjdXRzVmlzaWJsZSA9CiAgICAgICAgICAgICAgICAgKG1SZXNvdXJjZXMuZ2V0Q29uZmlndXJhdGlvbigpLmtleWJvYXJkICE9IENvbmZpZ3VyYXRpb24uS0VZQk9BUkRfTk9LRVlTKTsKICAgICB9CiAgICAgCisgICAgcHVibGljIE1lbnVCdWlsZGVyIHNldERlZmF1bHRTaG93QXNBY3Rpb24oaW50IGRlZmF1bHRTaG93QXNBY3Rpb24pIHsKKyAgICAgICAgbURlZmF1bHRTaG93QXNBY3Rpb24gPSBkZWZhdWx0U2hvd0FzQWN0aW9uOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisgICAgCiAgICAgcHVibGljIHZvaWQgc2V0Q2FsbGJhY2soQ2FsbGJhY2sgY2FsbGJhY2spIHsKICAgICAgICAgbUNhbGxiYWNrID0gY2FsbGJhY2s7CiAgICAgfQpAQCAtMzY4LDcgKzQyMSw4IEBACiAgICAgcHJpdmF0ZSBNZW51SXRlbSBhZGRJbnRlcm5hbChpbnQgZ3JvdXAsIGludCBpZCwgaW50IGNhdGVnb3J5T3JkZXIsIENoYXJTZXF1ZW5jZSB0aXRsZSkgewogICAgICAgICBmaW5hbCBpbnQgb3JkZXJpbmcgPSBnZXRPcmRlcmluZyhjYXRlZ29yeU9yZGVyKTsKICAgICAgICAgCi0gICAgICAgIGZpbmFsIE1lbnVJdGVtSW1wbCBpdGVtID0gbmV3IE1lbnVJdGVtSW1wbCh0aGlzLCBncm91cCwgaWQsIGNhdGVnb3J5T3JkZXIsIG9yZGVyaW5nLCB0aXRsZSk7CisgICAgICAgIGZpbmFsIE1lbnVJdGVtSW1wbCBpdGVtID0gbmV3IE1lbnVJdGVtSW1wbCh0aGlzLCBncm91cCwgaWQsIGNhdGVnb3J5T3JkZXIsCisgICAgICAgICAgICAgICAgb3JkZXJpbmcsIHRpdGxlLCBtRGVmYXVsdFNob3dBc0FjdGlvbik7CiAKICAgICAgICAgaWYgKG1DdXJyZW50TWVudUluZm8gIT0gbnVsbCkgewogICAgICAgICAgICAgLy8gUGFzcyBhbG9uZyB0aGUgY3VycmVudCBtZW51IGluZm8KQEAgLTYzMyw2ICs2ODcsMTEgQEAKICAgICAgICAgcmV0dXJuIG1JdGVtcy5nZXQoaW5kZXgpOwogICAgIH0KIAorICAgIHB1YmxpYyBNZW51SXRlbSBnZXRPdmVyZmxvd0l0ZW0oaW50IGluZGV4KSB7CisgICAgICAgIGZsYWdBY3Rpb25JdGVtcyh0cnVlKTsKKyAgICAgICAgcmV0dXJuIG1Ob25BY3Rpb25JdGVtcy5nZXQoaW5kZXgpOworICAgIH0KKwogICAgIHB1YmxpYyBib29sZWFuIGlzU2hvcnRjdXRLZXkoaW50IGtleUNvZGUsIEtleUV2ZW50IGV2ZW50KSB7CiAgICAgICAgIHJldHVybiBmaW5kSXRlbVdpdGhTaG9ydGN1dEZvcktleShrZXlDb2RlLCBldmVudCkgIT0gbnVsbDsKICAgICB9CkBAIC05MDAsNiArOTU5LDcgQEAKICAgICBwcml2YXRlIHZvaWQgb25JdGVtc0NoYW5nZWQoYm9vbGVhbiBjbGVhcmVkKSB7CiAgICAgICAgIGlmICghbVByZXZlbnREaXNwYXRjaGluZ0l0ZW1zQ2hhbmdlZCkgewogICAgICAgICAgICAgaWYgKG1Jc1Zpc2libGVJdGVtc1N0YWxlID09IGZhbHNlKSBtSXNWaXNpYmxlSXRlbXNTdGFsZSA9IHRydWU7CisgICAgICAgICAgICBpZiAobUlzQWN0aW9uSXRlbXNTdGFsZSA9PSBmYWxzZSkgbUlzQWN0aW9uSXRlbXNTdGFsZSA9IHRydWU7CiAgICAgICAgICAgICAKICAgICAgICAgICAgIE1lbnVUeXBlW10gbWVudVR5cGVzID0gbU1lbnVUeXBlczsKICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTlVNX1RZUEVTOyBpKyspIHsKQEAgLTkyMCw2ICs5ODAsMTUgQEAKICAgICAgICAgb25JdGVtc0NoYW5nZWQoZmFsc2UpOwogICAgIH0KICAgICAKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgYnkge0BsaW5rIE1lbnVJdGVtSW1wbH0gd2hlbiBpdHMgYWN0aW9uIHJlcXVlc3Qgc3RhdHVzIGlzIGNoYW5nZWQuCisgICAgICogQHBhcmFtIGl0ZW0gVGhlIGl0ZW0gdGhhdCBoYXMgZ29uZSB0aHJvdWdoIGEgY2hhbmdlIGluIGFjdGlvbiByZXF1ZXN0IHN0YXR1cy4KKyAgICAgKi8KKyAgICB2b2lkIG9uSXRlbUFjdGlvblJlcXVlc3RDaGFuZ2VkKE1lbnVJdGVtSW1wbCBpdGVtKSB7CisgICAgICAgIC8vIE5vdGlmeSBvZiBpdGVtcyBiZWluZyBjaGFuZ2VkCisgICAgICAgIG9uSXRlbXNDaGFuZ2VkKGZhbHNlKTsKKyAgICB9CisgICAgCiAgICAgQXJyYXlMaXN0PE1lbnVJdGVtSW1wbD4gZ2V0VmlzaWJsZUl0ZW1zKCkgewogICAgICAgICBpZiAoIW1Jc1Zpc2libGVJdGVtc1N0YWxlKSByZXR1cm4gbVZpc2libGVJdGVtczsKICAgICAgICAgCkBAIC05MzQsOSArMTAwMyw4MyBAQAogICAgICAgICB9CiAgICAgICAgIAogICAgICAgICBtSXNWaXNpYmxlSXRlbXNTdGFsZSA9IGZhbHNlOworICAgICAgICBtSXNBY3Rpb25JdGVtc1N0YWxlID0gdHJ1ZTsKICAgICAgICAgCiAgICAgICAgIHJldHVybiBtVmlzaWJsZUl0ZW1zOwogICAgIH0KKyAgICAKKyAgICBwcml2YXRlIHZvaWQgZmxhZ0FjdGlvbkl0ZW1zKGJvb2xlYW4gcmVzZXJ2ZUFjdGlvbk92ZXJmbG93KSB7CisgICAgICAgIGlmIChyZXNlcnZlQWN0aW9uT3ZlcmZsb3cgIT0gbVJlc2VydmVBY3Rpb25PdmVyZmxvdykgeworICAgICAgICAgICAgbVJlc2VydmVBY3Rpb25PdmVyZmxvdyA9IHJlc2VydmVBY3Rpb25PdmVyZmxvdzsKKyAgICAgICAgICAgIG1Jc0FjdGlvbkl0ZW1zU3RhbGUgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFtSXNBY3Rpb25JdGVtc1N0YWxlKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBBcnJheUxpc3Q8TWVudUl0ZW1JbXBsPiB2aXNpYmxlSXRlbXMgPSBnZXRWaXNpYmxlSXRlbXMoKTsKKyAgICAgICAgZmluYWwgaW50IGl0ZW1zU2l6ZSA9IHZpc2libGVJdGVtcy5zaXplKCk7CisgICAgICAgIGludCBtYXhBY3Rpb25zID0gbU1heEFjdGlvbkl0ZW1zOworCisgICAgICAgIGludCByZXF1aXJlZEl0ZW1zID0gMDsKKyAgICAgICAgaW50IHJlcXVlc3RlZEl0ZW1zID0gMDsKKyAgICAgICAgYm9vbGVhbiBoYXNPdmVyZmxvdyA9IGZhbHNlOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zU2l6ZTsgaSsrKSB7CisgICAgICAgICAgICBNZW51SXRlbUltcGwgaXRlbSA9IHZpc2libGVJdGVtcy5nZXQoaSk7CisgICAgICAgICAgICBpZiAoaXRlbS5yZXF1aXJlc0FjdGlvbkJ1dHRvbigpKSB7CisgICAgICAgICAgICAgICAgcmVxdWlyZWRJdGVtcysrOworICAgICAgICAgICAgfSBlbHNlIGlmIChpdGVtLnJlcXVlc3RzQWN0aW9uQnV0dG9uKCkpIHsKKyAgICAgICAgICAgICAgICByZXF1ZXN0ZWRJdGVtcysrOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBoYXNPdmVyZmxvdyA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBSZXNlcnZlIGEgc3BvdCBmb3IgdGhlIG92ZXJmbG93IGl0ZW0gaWYgbmVlZGVkLgorICAgICAgICBpZiAocmVzZXJ2ZUFjdGlvbk92ZXJmbG93ICYmCisgICAgICAgICAgICAgICAgKGhhc092ZXJmbG93IHx8IHJlcXVpcmVkSXRlbXMgKyByZXF1ZXN0ZWRJdGVtcyA+IG1heEFjdGlvbnMpKSB7CisgICAgICAgICAgICBtYXhBY3Rpb25zLS07CisgICAgICAgIH0KKyAgICAgICAgbWF4QWN0aW9ucyAtPSByZXF1aXJlZEl0ZW1zOworCisgICAgICAgIC8vIEZsYWcgYXMgbWFueSBtb3JlIHJlcXVlc3RlZCBpdGVtcyBhcyB3aWxsIGZpdC4KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtc1NpemU7IGkrKykgeworICAgICAgICAgICAgTWVudUl0ZW1JbXBsIGl0ZW0gPSB2aXNpYmxlSXRlbXMuZ2V0KGkpOworICAgICAgICAgICAgaWYgKGl0ZW0ucmVxdWVzdHNBY3Rpb25CdXR0b24oKSkgeworICAgICAgICAgICAgICAgIGl0ZW0uc2V0SXNBY3Rpb25CdXR0b24obWF4QWN0aW9ucyA+IDApOworICAgICAgICAgICAgICAgIG1heEFjdGlvbnMtLTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIG1BY3Rpb25JdGVtcy5jbGVhcigpOworICAgICAgICBtTm9uQWN0aW9uSXRlbXMuY2xlYXIoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtc1NpemU7IGkrKykgeworICAgICAgICAgICAgTWVudUl0ZW1JbXBsIGl0ZW0gPSB2aXNpYmxlSXRlbXMuZ2V0KGkpOworICAgICAgICAgICAgaWYgKGl0ZW0uaXNBY3Rpb25CdXR0b24oKSkgeworICAgICAgICAgICAgICAgIG1BY3Rpb25JdGVtcy5hZGQoaXRlbSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1Ob25BY3Rpb25JdGVtcy5hZGQoaXRlbSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBtSXNBY3Rpb25JdGVtc1N0YWxlID0gZmFsc2U7CisgICAgfQorICAgIAorICAgIEFycmF5TGlzdDxNZW51SXRlbUltcGw+IGdldEFjdGlvbkl0ZW1zKGJvb2xlYW4gcmVzZXJ2ZUFjdGlvbk92ZXJmbG93KSB7CisgICAgICAgIGZsYWdBY3Rpb25JdGVtcyhyZXNlcnZlQWN0aW9uT3ZlcmZsb3cpOworICAgICAgICByZXR1cm4gbUFjdGlvbkl0ZW1zOworICAgIH0KKyAgICAKKyAgICBBcnJheUxpc3Q8TWVudUl0ZW1JbXBsPiBnZXROb25BY3Rpb25JdGVtcyhib29sZWFuIHJlc2VydmVBY3Rpb25PdmVyZmxvdykgeworICAgICAgICBmbGFnQWN0aW9uSXRlbXMocmVzZXJ2ZUFjdGlvbk92ZXJmbG93KTsKKyAgICAgICAgcmV0dXJuIG1Ob25BY3Rpb25JdGVtczsKKyAgICB9CisgICAgCisgICAgdm9pZCBzZXRNYXhBY3Rpb25JdGVtcyhpbnQgbWF4QWN0aW9uSXRlbXMpIHsKKyAgICAgICAgbU1heEFjdGlvbkl0ZW1zID0gbWF4QWN0aW9uSXRlbXM7CisgICAgICAgIG1Jc0FjdGlvbkl0ZW1zU3RhbGUgPSB0cnVlOworICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIGNsZWFySGVhZGVyKCkgewogICAgICAgICBtSGVhZGVySWNvbiA9IG51bGw7CkBAIC0xMDc4LDYgKzEyMjEsMTYgQEAKICAgICAgICAgcmV0dXJuIG5ldyBNZW51QWRhcHRlcihtZW51VHlwZSk7CiAgICAgfQogCisgICAgLyoqCisgICAgICogR2V0cyBhbiBhZGFwdGVyIGZvciBwcm92aWRpbmcgb3ZlcmZsb3cgKG5vbi1hY3Rpb24pIGl0ZW1zIGFuZCB0aGVpciB2aWV3cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtZW51VHlwZSBUaGUgdHlwZSBvZiBtZW51IHRvIGdldCBhbiBhZGFwdGVyIGZvci4KKyAgICAgKiBAcmV0dXJuIEEge0BsaW5rIE1lbnVBZGFwdGVyfSBmb3IgdGhpcyBtZW51IHdpdGggdGhlIGdpdmVuIG1lbnUgdHlwZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWVudUFkYXB0ZXIgZ2V0T3ZlcmZsb3dNZW51QWRhcHRlcihpbnQgbWVudVR5cGUpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBPdmVyZmxvd01lbnVBZGFwdGVyKG1lbnVUeXBlKTsKKyAgICB9CisKICAgICB2b2lkIHNldE9wdGlvbmFsSWNvbnNWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkgewogICAgICAgICBtT3B0aW9uYWxJY29uc1Zpc2libGUgPSB2aXNpYmxlOwogICAgIH0KQEAgLTExNTUsOCArMTMwOCw0MiBAQAogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIFZpZXcgZ2V0VmlldyhpbnQgcG9zaXRpb24sIFZpZXcgY29udmVydFZpZXcsIFZpZXdHcm91cCBwYXJlbnQpIHsKLSAgICAgICAgICAgIHJldHVybiAoKE1lbnVJdGVtSW1wbCkgZ2V0SXRlbShwb3NpdGlvbikpLmdldEl0ZW1WaWV3KG1NZW51VHlwZSwgcGFyZW50KTsKKyAgICAgICAgICAgIGlmIChjb252ZXJ0VmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgTWVudVZpZXcuSXRlbVZpZXcgaXRlbVZpZXcgPSAoTWVudVZpZXcuSXRlbVZpZXcpIGNvbnZlcnRWaWV3OworICAgICAgICAgICAgICAgIGl0ZW1WaWV3LmdldEl0ZW1EYXRhKCkuc2V0SXRlbVZpZXcobU1lbnVUeXBlLCBudWxsKTsKKworICAgICAgICAgICAgICAgIE1lbnVJdGVtSW1wbCBpdGVtID0gKE1lbnVJdGVtSW1wbCkgZ2V0SXRlbShwb3NpdGlvbik7CisgICAgICAgICAgICAgICAgaXRlbVZpZXcuaW5pdGlhbGl6ZShpdGVtLCBtTWVudVR5cGUpOworICAgICAgICAgICAgICAgIGl0ZW0uc2V0SXRlbVZpZXcobU1lbnVUeXBlLCBpdGVtVmlldyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRWaWV3OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBNZW51SXRlbUltcGwgaXRlbSA9IChNZW51SXRlbUltcGwpIGdldEl0ZW0ocG9zaXRpb24pOworICAgICAgICAgICAgICAgIGl0ZW0uc2V0SXRlbVZpZXcobU1lbnVUeXBlLCBudWxsKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gaXRlbS5nZXRJdGVtVmlldyhtTWVudVR5cGUsIHBhcmVudCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBbiBhZGFwdGVyIHRoYXQgYWxsb3dzIGFuIHtAbGluayBBZGFwdGVyVmlld30gdG8gdXNlIHRoaXMge0BsaW5rIE1lbnVCdWlsZGVyfSBhcyBhIGRhdGEKKyAgICAgKiBzb3VyY2UgZm9yIG92ZXJmbG93IG1lbnUgaXRlbXMgdGhhdCBkbyBub3QgZml0IGluIHRoZSBsaXN0IG9mIGFjdGlvbiBpdGVtcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGNsYXNzIE92ZXJmbG93TWVudUFkYXB0ZXIgZXh0ZW5kcyBNZW51QWRhcHRlciB7CisgICAgICAgIHByaXZhdGUgQXJyYXlMaXN0PE1lbnVJdGVtSW1wbD4gbU92ZXJmbG93SXRlbXM7CisKKyAgICAgICAgcHVibGljIE92ZXJmbG93TWVudUFkYXB0ZXIoaW50IG1lbnVUeXBlKSB7CisgICAgICAgICAgICBzdXBlcihtZW51VHlwZSk7CisgICAgICAgICAgICBtT3ZlcmZsb3dJdGVtcyA9IGdldE5vbkFjdGlvbkl0ZW1zKHRydWUpOwogICAgICAgICB9CiAKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBNZW51SXRlbUltcGwgZ2V0SXRlbShpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgICAgIHJldHVybiBtT3ZlcmZsb3dJdGVtcy5nZXQocG9zaXRpb24pOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0Q291bnQoKSB7CisgICAgICAgICAgICByZXR1cm4gbU92ZXJmbG93SXRlbXMuc2l6ZSgpOworICAgICAgICB9CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9NZW51SXRlbUltcGwuamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L21lbnUvTWVudUl0ZW1JbXBsLmphdmEKaW5kZXggOWI1ODIwNS4uMDdhMmE5NCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9NZW51SXRlbUltcGwuamF2YQorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9tZW51L01lbnVJdGVtSW1wbC5qYXZhCkBAIC03NCw2ICs3NCw5IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVYQ0xVU0lWRSAgICAgID0gMHgwMDAwMDAwNDsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSElEREVOICAgICAgICAgPSAweDAwMDAwMDA4OwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFTkFCTEVEICAgICAgICA9IDB4MDAwMDAwMTA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElTX0FDVElPTiAgICAgID0gMHgwMDAwMDAyMDsKKworICAgIHByaXZhdGUgaW50IG1TaG93QXNBY3Rpb24gPSBTSE9XX0FTX0FDVElPTl9ORVZFUjsKIAogICAgIC8qKiBVc2VkIGZvciB0aGUgaWNvbiByZXNvdXJjZSBJRCBpZiB0aGlzIGl0ZW0gZG9lcyBub3QgaGF2ZSBhbiBpY29uICovCiAgICAgc3RhdGljIGZpbmFsIGludCBOT19JQ09OID0gMDsKQEAgLTEwNSw3ICsxMDgsNyBAQAogICAgICAqIEBwYXJhbSB0aXRsZSBUaGUgdGV4dCB0byBkaXNwbGF5IGZvciB0aGUgaXRlbS4KICAgICAgKi8KICAgICBNZW51SXRlbUltcGwoTWVudUJ1aWxkZXIgbWVudSwgaW50IGdyb3VwLCBpbnQgaWQsIGludCBjYXRlZ29yeU9yZGVyLCBpbnQgb3JkZXJpbmcsCi0gICAgICAgICAgICBDaGFyU2VxdWVuY2UgdGl0bGUpIHsKKyAgICAgICAgICAgIENoYXJTZXF1ZW5jZSB0aXRsZSwgaW50IHNob3dBc0FjdGlvbikgewogCiAgICAgICAgIGlmIChzUHJlcGVuZFNob3J0Y3V0TGFiZWwgPT0gbnVsbCkgewogICAgICAgICAgICAgLy8gVGhpcyBpcyBpbnN0YW50aWF0ZWQgZnJvbSB0aGUgVUkgdGhyZWFkLCBzbyBubyBjaGFuY2Ugb2Ygc3luYyBpc3N1ZXMgCkBAIC0xMjYsNiArMTI5LDcgQEAKICAgICAgICAgbUNhdGVnb3J5T3JkZXIgPSBjYXRlZ29yeU9yZGVyOwogICAgICAgICBtT3JkZXJpbmcgPSBvcmRlcmluZzsKICAgICAgICAgbVRpdGxlID0gdGl0bGU7CisgICAgICAgIG1TaG93QXNBY3Rpb24gPSBzaG93QXNBY3Rpb247CiAgICAgfQogICAgIAogICAgIC8qKgpAQCAtNTgwLDYgKzU4NCwxMCBAQAogICAgICAgICByZXR1cm4gKFZpZXcpIG1JdGVtVmlld3NbbWVudVR5cGVdLmdldCgpOwogICAgIH0KIAorICAgIHZvaWQgc2V0SXRlbVZpZXcoaW50IG1lbnVUeXBlLCBJdGVtVmlldyB2aWV3KSB7CisgICAgICAgIG1JdGVtVmlld3NbbWVudVR5cGVdID0gbmV3IFdlYWtSZWZlcmVuY2U8SXRlbVZpZXc+KHZpZXcpOworICAgIH0KKwogICAgIC8qKgogICAgICAqIENyZWF0ZSBhbmQgaW5pdGlhbGl6ZXMgYSBtZW51IGl0ZW0gdmlldyB0aGF0IGltcGxlbWVudHMge0BsaW5rIE1lbnVWaWV3Lkl0ZW1WaWV3fS4KICAgICAgKiBAcGFyYW0gbWVudVR5cGUgVGhlIHR5cGUgb2YgbWVudSB0byBnZXQgYSBWaWV3IGZvciAobXVzdCBiZSBvbmUgb2YKQEAgLTYyOCw2ICs2MzYsMzQgQEAKICAgICAgKiBAcmV0dXJuIFdoZXRoZXIgdGhlIGdpdmVuIG1lbnUgdHlwZSBzaG91bGQgc2hvdyBpY29ucyBmb3IgbWVudSBpdGVtcy4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBzaG91bGRTaG93SWNvbihpbnQgbWVudVR5cGUpIHsKLSAgICAgICAgcmV0dXJuIG1lbnVUeXBlID09IE1lbnVCdWlsZGVyLlRZUEVfSUNPTiB8fCBtTWVudS5nZXRPcHRpb25hbEljb25zVmlzaWJsZSgpOworICAgICAgICByZXR1cm4gbWVudVR5cGUgPT0gTWVudUJ1aWxkZXIuVFlQRV9JQ09OIHx8CisgICAgICAgICAgICAgICAgbWVudVR5cGUgPT0gTWVudUJ1aWxkZXIuVFlQRV9BQ1RJT05fQlVUVE9OIHx8CisgICAgICAgICAgICAgICAgbWVudVR5cGUgPT0gTWVudUJ1aWxkZXIuVFlQRV9QT1BVUCB8fAorICAgICAgICAgICAgICAgIG1NZW51LmdldE9wdGlvbmFsSWNvbnNWaXNpYmxlKCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBib29sZWFuIGlzQWN0aW9uQnV0dG9uKCkgeworICAgICAgICByZXR1cm4gKG1GbGFncyAmIElTX0FDVElPTikgPT0gSVNfQUNUSU9OIHx8IHJlcXVpcmVzQWN0aW9uQnV0dG9uKCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBib29sZWFuIHJlcXVlc3RzQWN0aW9uQnV0dG9uKCkgeworICAgICAgICByZXR1cm4gbVNob3dBc0FjdGlvbiA9PSBTSE9XX0FTX0FDVElPTl9JRl9ST09NOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgYm9vbGVhbiByZXF1aXJlc0FjdGlvbkJ1dHRvbigpIHsKKyAgICAgICAgcmV0dXJuIG1TaG93QXNBY3Rpb24gPT0gU0hPV19BU19BQ1RJT05fQUxXQVlTOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldElzQWN0aW9uQnV0dG9uKGJvb2xlYW4gaXNBY3Rpb25CdXR0b24pIHsKKyAgICAgICAgaWYgKGlzQWN0aW9uQnV0dG9uKSB7CisgICAgICAgICAgICBtRmxhZ3MgfD0gSVNfQUNUSU9OOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUZsYWdzICY9IH5JU19BQ1RJT047CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTaG93QXNBY3Rpb24oaW50IGFjdGlvbkVudW0pIHsKKyAgICAgICAgbVNob3dBc0FjdGlvbiA9IGFjdGlvbkVudW07CisgICAgICAgIG1NZW51Lm9uSXRlbUFjdGlvblJlcXVlc3RDaGFuZ2VkKHRoaXMpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L21lbnUvTWVudVBvcHVwSGVscGVyLmphdmEgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9tZW51L01lbnVQb3B1cEhlbHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExMmE0ZDYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9tZW51L01lbnVQb3B1cEhlbHBlci5qYXZhCkBAIC0wLDAgKzEsMTQ3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnU7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuTWVudUJ1aWxkZXIuTWVudUFkYXB0ZXI7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuRGlzcGxheU1ldHJpY3M7CitpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SXRlbTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldy5NZWFzdXJlU3BlYzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5BZGFwdGVyVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaXN0UG9wdXBXaW5kb3c7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuUG9wdXBXaW5kb3c7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2U7CisKKy8qKgorICogQGhpZGUKKyAqLworcHVibGljIGNsYXNzIE1lbnVQb3B1cEhlbHBlciBpbXBsZW1lbnRzIEFkYXB0ZXJWaWV3Lk9uSXRlbUNsaWNrTGlzdGVuZXIsIFZpZXcuT25LZXlMaXN0ZW5lciB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJNZW51UG9wdXBIZWxwZXIiOworCisgICAgcHJpdmF0ZSBDb250ZXh0IG1Db250ZXh0OworICAgIHByaXZhdGUgTGlzdFBvcHVwV2luZG93IG1Qb3B1cDsKKyAgICBwcml2YXRlIE1lbnVCdWlsZGVyIG1NZW51OworICAgIHByaXZhdGUgaW50IG1Qb3B1cE1heFdpZHRoOworICAgIHByaXZhdGUgV2Vha1JlZmVyZW5jZTxWaWV3PiBtQW5jaG9yVmlldzsKKyAgICBwcml2YXRlIGJvb2xlYW4gbU92ZXJmbG93T25seTsKKworICAgIHByaXZhdGUgUG9wdXBXaW5kb3cuT25EaXNtaXNzTGlzdGVuZXIgbURpc21pc3NMaXN0ZW5lciA9IG5ldyBQb3B1cFdpbmRvdy5PbkRpc21pc3NMaXN0ZW5lcigpIHsKKyAgICAgICAgcHVibGljIHZvaWQgb25EaXNtaXNzKCkgeworICAgICAgICAgICAgbVBvcHVwID0gbnVsbDsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBwdWJsaWMgTWVudVBvcHVwSGVscGVyKENvbnRleHQgY29udGV4dCwgTWVudUJ1aWxkZXIgbWVudSkgeworICAgICAgICB0aGlzKGNvbnRleHQsIG1lbnUsIG51bGwsIGZhbHNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTWVudVBvcHVwSGVscGVyKENvbnRleHQgY29udGV4dCwgTWVudUJ1aWxkZXIgbWVudSwgVmlldyBhbmNob3JWaWV3KSB7CisgICAgICAgIHRoaXMoY29udGV4dCwgbWVudSwgYW5jaG9yVmlldywgZmFsc2UpOworICAgIH0KKworICAgIHB1YmxpYyBNZW51UG9wdXBIZWxwZXIoQ29udGV4dCBjb250ZXh0LCBNZW51QnVpbGRlciBtZW51LAorICAgICAgICAgICAgVmlldyBhbmNob3JWaWV3LCBib29sZWFuIG92ZXJmbG93T25seSkgeworICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CisgICAgICAgIG1NZW51ID0gbWVudTsKKyAgICAgICAgbU92ZXJmbG93T25seSA9IG92ZXJmbG93T25seTsKKworICAgICAgICBmaW5hbCBEaXNwbGF5TWV0cmljcyBtZXRyaWNzID0gY29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXREaXNwbGF5TWV0cmljcygpOworICAgICAgICBtUG9wdXBNYXhXaWR0aCA9IG1ldHJpY3Mud2lkdGhQaXhlbHMgLyAyOworCisgICAgICAgIGlmIChhbmNob3JWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1BbmNob3JWaWV3ID0gbmV3IFdlYWtSZWZlcmVuY2U8Vmlldz4oYW5jaG9yVmlldyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzaG93KCkgeworICAgICAgICAvLyBUT0RPIFVzZSBhIHN0eWxlIGZyb20gdGhlIHRoZW1lIGhlcmUKKyAgICAgICAgbVBvcHVwID0gbmV3IExpc3RQb3B1cFdpbmRvdyhtQ29udGV4dCwgbnVsbCwgMCwKKyAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlLldpZGdldF9TcGlubmVyKTsKKyAgICAgICAgbVBvcHVwLnNldE9uSXRlbUNsaWNrTGlzdGVuZXIodGhpcyk7CisgICAgICAgIG1Qb3B1cC5zZXRPbkRpc21pc3NMaXN0ZW5lcihtRGlzbWlzc0xpc3RlbmVyKTsKKworICAgICAgICBmaW5hbCBNZW51QWRhcHRlciBhZGFwdGVyID0gbU92ZXJmbG93T25seSA/CisgICAgICAgICAgICAgICAgbU1lbnUuZ2V0T3ZlcmZsb3dNZW51QWRhcHRlcihNZW51QnVpbGRlci5UWVBFX1BPUFVQKSA6CisgICAgICAgICAgICAgICAgbU1lbnUuZ2V0TWVudUFkYXB0ZXIoTWVudUJ1aWxkZXIuVFlQRV9QT1BVUCk7CisgICAgICAgIG1Qb3B1cC5zZXRBZGFwdGVyKGFkYXB0ZXIpOworICAgICAgICBtUG9wdXAuc2V0TW9kYWwodHJ1ZSk7CisKKyAgICAgICAgaWYgKG1BbmNob3JWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1Qb3B1cC5zZXRBbmNob3JWaWV3KG1BbmNob3JWaWV3LmdldCgpKTsKKyAgICAgICAgfSBlbHNlIGlmIChtTWVudSBpbnN0YW5jZW9mIFN1Yk1lbnVCdWlsZGVyKSB7CisgICAgICAgICAgICBTdWJNZW51QnVpbGRlciBzdWJNZW51ID0gKFN1Yk1lbnVCdWlsZGVyKSBtTWVudTsKKyAgICAgICAgICAgIGZpbmFsIE1lbnVJdGVtSW1wbCBpdGVtSW1wbCA9IChNZW51SXRlbUltcGwpIHN1Yk1lbnUuZ2V0SXRlbSgpOworICAgICAgICAgICAgbVBvcHVwLnNldEFuY2hvclZpZXcoaXRlbUltcGwuZ2V0SXRlbVZpZXcoTWVudUJ1aWxkZXIuVFlQRV9BQ1RJT05fQlVUVE9OLCBudWxsKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJNZW51UG9wdXBIZWxwZXIgY2Fubm90IGJlIHVzZWQgd2l0aG91dCBhbiBhbmNob3IiKTsKKyAgICAgICAgfQorCisgICAgICAgIG1Qb3B1cC5zZXRDb250ZW50V2lkdGgoTWF0aC5taW4obWVhc3VyZUNvbnRlbnRXaWR0aChhZGFwdGVyKSwgbVBvcHVwTWF4V2lkdGgpKTsKKyAgICAgICAgbVBvcHVwLnNob3coKTsKKyAgICAgICAgbVBvcHVwLmdldExpc3RWaWV3KCkuc2V0T25LZXlMaXN0ZW5lcih0aGlzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBkaXNtaXNzKCkgeworICAgICAgICBpZiAoaXNTaG93aW5nKCkpIHsKKyAgICAgICAgICAgIG1Qb3B1cC5kaXNtaXNzKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1Nob3dpbmcoKSB7CisgICAgICAgIHJldHVybiBtUG9wdXAgIT0gbnVsbCAmJiBtUG9wdXAuaXNTaG93aW5nKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb25JdGVtQ2xpY2soQWRhcHRlclZpZXc8Pz4gcGFyZW50LCBWaWV3IHZpZXcsIGludCBwb3NpdGlvbiwgbG9uZyBpZCkgeworICAgICAgICBNZW51SXRlbSBpdGVtID0gbnVsbDsKKyAgICAgICAgaWYgKG1PdmVyZmxvd09ubHkpIHsKKyAgICAgICAgICAgIGl0ZW0gPSBtTWVudS5nZXRPdmVyZmxvd0l0ZW0ocG9zaXRpb24pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaXRlbSA9IG1NZW51LmdldEl0ZW0ocG9zaXRpb24pOworICAgICAgICB9CisgICAgICAgIG1NZW51LnBlcmZvcm1JdGVtQWN0aW9uKGl0ZW0sIDApOworICAgICAgICBtUG9wdXAuZGlzbWlzcygpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIG9uS2V5KFZpZXcgdiwgaW50IGtleUNvZGUsIEtleUV2ZW50IGV2ZW50KSB7CisgICAgICAgIGlmIChldmVudC5nZXRBY3Rpb24oKSA9PSBLZXlFdmVudC5BQ1RJT05fVVAgJiYga2V5Q29kZSA9PSBLZXlFdmVudC5LRVlDT0RFX01FTlUpIHsKKyAgICAgICAgICAgIGRpc21pc3MoKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwcml2YXRlIGludCBtZWFzdXJlQ29udGVudFdpZHRoKE1lbnVBZGFwdGVyIGFkYXB0ZXIpIHsKKyAgICAgICAgLy8gTWVudXMgZG9uJ3QgdGVuZCB0byBiZSBsb25nLCBzbyB0aGlzIGlzIG1vcmUgc2FuZSB0aGFuIGl0IGxvb2tzLgorICAgICAgICBpbnQgd2lkdGggPSAwOworICAgICAgICBWaWV3IGl0ZW1WaWV3ID0gbnVsbDsKKyAgICAgICAgZmluYWwgaW50IHdpZHRoTWVhc3VyZVNwZWMgPQorICAgICAgICAgICAgTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKDAsIE1lYXN1cmVTcGVjLlVOU1BFQ0lGSUVEKTsKKyAgICAgICAgZmluYWwgaW50IGhlaWdodE1lYXN1cmVTcGVjID0KKyAgICAgICAgICAgIE1lYXN1cmVTcGVjLm1ha2VNZWFzdXJlU3BlYygwLCBNZWFzdXJlU3BlYy5VTlNQRUNJRklFRCk7CisgICAgICAgIGZpbmFsIGludCBjb3VudCA9IGFkYXB0ZXIuZ2V0Q291bnQoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICBpdGVtVmlldyA9IGFkYXB0ZXIuZ2V0VmlldyhpLCBpdGVtVmlldywgbnVsbCk7CisgICAgICAgICAgICBpdGVtVmlldy5tZWFzdXJlKHdpZHRoTWVhc3VyZVNwZWMsIGhlaWdodE1lYXN1cmVTcGVjKTsKKyAgICAgICAgICAgIHdpZHRoID0gTWF0aC5tYXgod2lkdGgsIGl0ZW1WaWV3LmdldE1lYXN1cmVkV2lkdGgoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHdpZHRoOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvQWN0aW9uQmFyQ29udGV4dFZpZXcuamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvQWN0aW9uQmFyQ29udGV4dFZpZXcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hY2Y3NWUzCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9BY3Rpb25CYXJDb250ZXh0Vmlldy5qYXZhCkBAIC0wLDAgKzEsMzMzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0OworCitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuUjsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuQWN0aW9uTWVudVZpZXc7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51Lk1lbnVCdWlsZGVyOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5UeXBlZEFycmF5OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7CitpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuQWN0aW9uTW9kZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldy5NZWFzdXJlU3BlYzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5JbWFnZUJ1dHRvbjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaW5lYXJMYXlvdXQ7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CisKKy8qKgorICogQGhpZGUKKyAqLworcHVibGljIGNsYXNzIEFjdGlvbkJhckNvbnRleHRWaWV3IGV4dGVuZHMgVmlld0dyb3VwIHsKKyAgICBwcml2YXRlIGludCBtSXRlbVBhZGRpbmc7CisgICAgcHJpdmF0ZSBpbnQgbUl0ZW1NYXJnaW47CisgICAgcHJpdmF0ZSBpbnQgbUFjdGlvblNwYWNpbmc7CisgICAgcHJpdmF0ZSBpbnQgbUNvbnRlbnRIZWlnaHQ7CisgICAgCisgICAgcHJpdmF0ZSBDaGFyU2VxdWVuY2UgbVRpdGxlOworICAgIHByaXZhdGUgQ2hhclNlcXVlbmNlIG1TdWJ0aXRsZTsKKyAgICAKKyAgICBwcml2YXRlIEltYWdlQnV0dG9uIG1DbG9zZUJ1dHRvbjsKKyAgICBwcml2YXRlIFZpZXcgbUN1c3RvbVZpZXc7CisgICAgcHJpdmF0ZSBMaW5lYXJMYXlvdXQgbVRpdGxlTGF5b3V0OworICAgIHByaXZhdGUgVGV4dFZpZXcgbVRpdGxlVmlldzsKKyAgICBwcml2YXRlIFRleHRWaWV3IG1TdWJ0aXRsZVZpZXc7CisgICAgcHJpdmF0ZSBEcmF3YWJsZSBtQ2xvc2VEcmF3YWJsZTsKKyAgICBwcml2YXRlIEFjdGlvbk1lbnVWaWV3IG1NZW51VmlldzsKKyAgICAKKyAgICBwdWJsaWMgQWN0aW9uQmFyQ29udGV4dFZpZXcoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHRoaXMoY29udGV4dCwgbnVsbCwgMCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBBY3Rpb25CYXJDb250ZXh0VmlldyhDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgeworICAgICAgICB0aGlzKGNvbnRleHQsIGF0dHJzLCAwKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIEFjdGlvbkJhckNvbnRleHRWaWV3KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGUpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlKTsKKyAgICAgICAgCisgICAgICAgIFR5cGVkQXJyYXkgYSA9IGNvbnRleHQub2J0YWluU3R5bGVkQXR0cmlidXRlcyhhdHRycywKKyAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5UaGVtZSk7CisgICAgICAgIG1JdGVtUGFkZGluZyA9IGEuZ2V0RGltZW5zaW9uUGl4ZWxPZmZzZXQoCisgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuVGhlbWVfYWN0aW9uQnV0dG9uUGFkZGluZywgMCk7CisgICAgICAgIHNldEJhY2tncm91bmREcmF3YWJsZShhLmdldERyYXdhYmxlKAorICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLlRoZW1lX2FjdGlvbk1vZGVCYWNrZ3JvdW5kKSk7CisgICAgICAgIG1DbG9zZURyYXdhYmxlID0gYS5nZXREcmF3YWJsZSgKKyAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5UaGVtZV9hY3Rpb25Nb2RlQ2xvc2VEcmF3YWJsZSk7CisgICAgICAgIG1JdGVtTWFyZ2luID0gbUl0ZW1QYWRkaW5nIC8gMjsKKworICAgICAgICBtQ29udGVudEhlaWdodCA9IGEuZ2V0TGF5b3V0RGltZW5zaW9uKAorICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLlRoZW1lX3dpbmRvd0FjdGlvbkJhclNpemUsIDApOworICAgICAgICBhLnJlY3ljbGUoKTsKKyAgICB9CisgICAgCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEFjdGlvbk1vZGUgc3RhcnRBY3Rpb25Nb2RlRm9yQ2hpbGQoVmlldyBjaGlsZCwgQWN0aW9uTW9kZS5DYWxsYmFjayBjYWxsYmFjaykgeworICAgICAgICAvLyBObyBzdGFydGluZyBhbiBhY3Rpb24gbW9kZSBmb3IgYW4gZXhpc3RpbmcgYWN0aW9uIG1vZGUgVUkgY2hpbGQhIChXaGVyZSB3b3VsZCBpdCBnbz8pCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEhlaWdodChpbnQgaGVpZ2h0KSB7CisgICAgICAgIG1Db250ZW50SGVpZ2h0ID0gaGVpZ2h0OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEN1c3RvbVZpZXcoVmlldyB2aWV3KSB7CisgICAgICAgIGlmIChtQ3VzdG9tVmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICByZW1vdmVWaWV3KG1DdXN0b21WaWV3KTsKKyAgICAgICAgfQorICAgICAgICBtQ3VzdG9tVmlldyA9IHZpZXc7CisgICAgICAgIGlmIChtVGl0bGVMYXlvdXQgIT0gbnVsbCkgeworICAgICAgICAgICAgcmVtb3ZlVmlldyhtVGl0bGVMYXlvdXQpOworICAgICAgICAgICAgbVRpdGxlTGF5b3V0ID0gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBpZiAodmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICBhZGRWaWV3KHZpZXcpOworICAgICAgICB9CisgICAgICAgIHJlcXVlc3RMYXlvdXQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRUaXRsZShDaGFyU2VxdWVuY2UgdGl0bGUpIHsKKyAgICAgICAgbVRpdGxlID0gdGl0bGU7CisgICAgICAgIGluaXRUaXRsZSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFN1YnRpdGxlKENoYXJTZXF1ZW5jZSBzdWJ0aXRsZSkgeworICAgICAgICBtU3VidGl0bGUgPSBzdWJ0aXRsZTsKKyAgICAgICAgaW5pdFRpdGxlKCk7CisgICAgfQorCisgICAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXRUaXRsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1UaXRsZTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2hhclNlcXVlbmNlIGdldFN1YnRpdGxlKCkgeworICAgICAgICByZXR1cm4gbVN1YnRpdGxlOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbml0VGl0bGUoKSB7CisgICAgICAgIGlmIChtVGl0bGVMYXlvdXQgPT0gbnVsbCkgeworICAgICAgICAgICAgTGF5b3V0SW5mbGF0ZXIgaW5mbGF0ZXIgPSBMYXlvdXRJbmZsYXRlci5mcm9tKGdldENvbnRleHQoKSk7CisgICAgICAgICAgICBtVGl0bGVMYXlvdXQgPSAoTGluZWFyTGF5b3V0KSBpbmZsYXRlci5pbmZsYXRlKFIubGF5b3V0LmFjdGlvbl9iYXJfdGl0bGVfaXRlbSwgbnVsbCk7CisgICAgICAgICAgICBtVGl0bGVWaWV3ID0gKFRleHRWaWV3KSBtVGl0bGVMYXlvdXQuZmluZFZpZXdCeUlkKFIuaWQuYWN0aW9uX2Jhcl90aXRsZSk7CisgICAgICAgICAgICBtU3VidGl0bGVWaWV3ID0gKFRleHRWaWV3KSBtVGl0bGVMYXlvdXQuZmluZFZpZXdCeUlkKFIuaWQuYWN0aW9uX2Jhcl9zdWJ0aXRsZSk7CisgICAgICAgICAgICBpZiAobVRpdGxlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtVGl0bGVWaWV3LnNldFRleHQobVRpdGxlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtU3VidGl0bGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1TdWJ0aXRsZVZpZXcuc2V0VGV4dChtU3VidGl0bGUpOworICAgICAgICAgICAgICAgIG1TdWJ0aXRsZVZpZXcuc2V0VmlzaWJpbGl0eShWSVNJQkxFKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFkZFZpZXcobVRpdGxlTGF5b3V0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1UaXRsZVZpZXcuc2V0VGV4dChtVGl0bGUpOworICAgICAgICAgICAgbVN1YnRpdGxlVmlldy5zZXRUZXh0KG1TdWJ0aXRsZSk7CisgICAgICAgICAgICBtU3VidGl0bGVWaWV3LnNldFZpc2liaWxpdHkobVN1YnRpdGxlICE9IG51bGwgPyBWSVNJQkxFIDogR09ORSk7CisgICAgICAgICAgICBpZiAobVRpdGxlTGF5b3V0LmdldFBhcmVudCgpID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBhZGRWaWV3KG1UaXRsZUxheW91dCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBpbml0Rm9yTW9kZShmaW5hbCBBY3Rpb25Nb2RlIG1vZGUpIHsKKyAgICAgICAgaWYgKG1DbG9zZUJ1dHRvbiA9PSBudWxsKSB7CisgICAgICAgICAgICBtQ2xvc2VCdXR0b24gPSBuZXcgSW1hZ2VCdXR0b24oZ2V0Q29udGV4dCgpKTsKKyAgICAgICAgICAgIG1DbG9zZUJ1dHRvbi5zZXRJbWFnZURyYXdhYmxlKG1DbG9zZURyYXdhYmxlKTsKKyAgICAgICAgICAgIG1DbG9zZUJ1dHRvbi5zZXRCYWNrZ3JvdW5kRHJhd2FibGUobnVsbCk7CisgICAgICAgIH0KKyAgICAgICAgbUNsb3NlQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihuZXcgT25DbGlja0xpc3RlbmVyKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgICAgICBtb2RlLmZpbmlzaCgpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgICAgYWRkVmlldyhtQ2xvc2VCdXR0b24pOworCisgICAgICAgIGZpbmFsIE1lbnVCdWlsZGVyIG1lbnUgPSAoTWVudUJ1aWxkZXIpIG1vZGUuZ2V0TWVudSgpOworICAgICAgICBtTWVudVZpZXcgPSAoQWN0aW9uTWVudVZpZXcpIG1lbnUuZ2V0TWVudVZpZXcoTWVudUJ1aWxkZXIuVFlQRV9BQ1RJT05fQlVUVE9OLCB0aGlzKTsKKyAgICAgICAgbU1lbnVWaWV3LnNldE92ZXJmbG93UmVzZXJ2ZWQodHJ1ZSk7CisgICAgICAgIG1NZW51Vmlldy51cGRhdGVDaGlsZHJlbihmYWxzZSk7CisgICAgICAgIGFkZFZpZXcobU1lbnVWaWV3KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjbG9zZU1vZGUoKSB7CisgICAgICAgIHJlbW92ZUFsbFZpZXdzKCk7CisgICAgICAgIG1DdXN0b21WaWV3ID0gbnVsbDsKKyAgICAgICAgbU1lbnVWaWV3ID0gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBzaG93T3ZlcmZsb3dNZW51KCkgeworICAgICAgICBpZiAobU1lbnVWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBtTWVudVZpZXcuc2hvd092ZXJmbG93TWVudSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBoaWRlT3ZlcmZsb3dNZW51KCkgeworICAgICAgICBpZiAobU1lbnVWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBtTWVudVZpZXcuaGlkZU92ZXJmbG93TWVudSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc092ZXJmbG93TWVudVNob3dpbmcoKSB7CisgICAgICAgIGlmIChtTWVudVZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG1NZW51Vmlldy5pc092ZXJmbG93TWVudVNob3dpbmcoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIExheW91dFBhcmFtcyBnZW5lcmF0ZURlZmF1bHRMYXlvdXRQYXJhbXMoKSB7CisgICAgICAgIC8vIFVzZWQgYnkgY3VzdG9tIHZpZXdzIGlmIHRoZXkgZG9uJ3Qgc3VwcGx5IGxheW91dCBwYXJhbXMuIEV2ZXJ5dGhpbmcgZWxzZQorICAgICAgICAvLyBhZGRlZCB0byBhbiBBY3Rpb25CYXJDb250ZXh0VmlldyBzaG91bGQgaGF2ZSB0aGVtIGFscmVhZHkuCisgICAgICAgIHJldHVybiBuZXcgTGF5b3V0UGFyYW1zKExheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQsIExheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uTWVhc3VyZShpbnQgd2lkdGhNZWFzdXJlU3BlYywgaW50IGhlaWdodE1lYXN1cmVTcGVjKSB7CisgICAgICAgIGZpbmFsIGludCB3aWR0aE1vZGUgPSBNZWFzdXJlU3BlYy5nZXRNb2RlKHdpZHRoTWVhc3VyZVNwZWMpOworICAgICAgICBpZiAod2lkdGhNb2RlICE9IE1lYXN1cmVTcGVjLkVYQUNUTFkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkgKyAiIGNhbiBvbmx5IGJlIHVzZWQgIiArCisgICAgICAgICAgICAgICAgICAgICJ3aXRoIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPVwibWF0Y2hfcGFyZW50XCIgKG9yIGZpbGxfcGFyZW50KSIpOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgaW50IGhlaWdodE1vZGUgPSBNZWFzdXJlU3BlYy5nZXRNb2RlKGhlaWdodE1lYXN1cmVTcGVjKTsKKyAgICAgICAgaWYgKGhlaWdodE1vZGUgIT0gTWVhc3VyZVNwZWMuQVRfTU9TVCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihnZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSArICIgY2FuIG9ubHkgYmUgdXNlZCAiICsKKyAgICAgICAgICAgICAgICAgICAgIndpdGggYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PVwid3JhcF9jb250ZW50XCIiKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgZmluYWwgaW50IGNvbnRlbnRXaWR0aCA9IE1lYXN1cmVTcGVjLmdldFNpemUod2lkdGhNZWFzdXJlU3BlYyk7CisgICAgICAgIGZpbmFsIGludCBpdGVtTWFyZ2luID0gbUl0ZW1QYWRkaW5nOworCisgICAgICAgIGludCBtYXhIZWlnaHQgPSBtQ29udGVudEhlaWdodCA+IDAgPworICAgICAgICAgICAgICAgIG1Db250ZW50SGVpZ2h0IDogTWVhc3VyZVNwZWMuZ2V0U2l6ZShoZWlnaHRNZWFzdXJlU3BlYyk7CisKKyAgICAgICAgZmluYWwgaW50IHZlcnRpY2FsUGFkZGluZyA9IGdldFBhZGRpbmdUb3AoKSArIGdldFBhZGRpbmdCb3R0b20oKTsKKyAgICAgICAgaW50IGF2YWlsYWJsZVdpZHRoID0gY29udGVudFdpZHRoIC0gZ2V0UGFkZGluZ0xlZnQoKSAtIGdldFBhZGRpbmdSaWdodCgpOworICAgICAgICBmaW5hbCBpbnQgaGVpZ2h0ID0gbWF4SGVpZ2h0IC0gdmVydGljYWxQYWRkaW5nOworICAgICAgICBmaW5hbCBpbnQgY2hpbGRTcGVjSGVpZ2h0ID0gTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKGhlaWdodCwgTWVhc3VyZVNwZWMuQVRfTU9TVCk7CisgICAgICAgIAorICAgICAgICBpZiAobUNsb3NlQnV0dG9uICE9IG51bGwpIHsKKyAgICAgICAgICAgIGF2YWlsYWJsZVdpZHRoID0gbWVhc3VyZUNoaWxkVmlldyhtQ2xvc2VCdXR0b24sIGF2YWlsYWJsZVdpZHRoLAorICAgICAgICAgICAgICAgICAgICBjaGlsZFNwZWNIZWlnaHQsIGl0ZW1NYXJnaW4pOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1UaXRsZUxheW91dCAhPSBudWxsICYmIG1DdXN0b21WaWV3ID09IG51bGwpIHsKKyAgICAgICAgICAgIGF2YWlsYWJsZVdpZHRoID0gbWVhc3VyZUNoaWxkVmlldyhtVGl0bGVMYXlvdXQsIGF2YWlsYWJsZVdpZHRoLAorICAgICAgICAgICAgICAgICAgICBjaGlsZFNwZWNIZWlnaHQsIGl0ZW1NYXJnaW4pOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgaW50IGNoaWxkQ291bnQgPSBnZXRDaGlsZENvdW50KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRDb3VudDsgaSsrKSB7CisgICAgICAgICAgICBmaW5hbCBWaWV3IGNoaWxkID0gZ2V0Q2hpbGRBdChpKTsKKyAgICAgICAgICAgIGlmIChjaGlsZCA9PSBtQ2xvc2VCdXR0b24gfHwgY2hpbGQgPT0gbVRpdGxlTGF5b3V0IHx8IGNoaWxkID09IG1DdXN0b21WaWV3KSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGF2YWlsYWJsZVdpZHRoID0gbWVhc3VyZUNoaWxkVmlldyhjaGlsZCwgYXZhaWxhYmxlV2lkdGgsIGNoaWxkU3BlY0hlaWdodCwgaXRlbU1hcmdpbik7CisgICAgICAgIH0KKworICAgICAgICBpZiAobUN1c3RvbVZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgTGF5b3V0UGFyYW1zIGxwID0gbUN1c3RvbVZpZXcuZ2V0TGF5b3V0UGFyYW1zKCk7CisgICAgICAgICAgICBmaW5hbCBpbnQgY3VzdG9tV2lkdGhNb2RlID0gbHAud2lkdGggIT0gTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCA/CisgICAgICAgICAgICAgICAgICAgIE1lYXN1cmVTcGVjLkVYQUNUTFkgOiBNZWFzdXJlU3BlYy5BVF9NT1NUOworICAgICAgICAgICAgZmluYWwgaW50IGN1c3RvbVdpZHRoID0gbHAud2lkdGggPj0gMCA/CisgICAgICAgICAgICAgICAgICAgIE1hdGgubWluKGxwLndpZHRoLCBhdmFpbGFibGVXaWR0aCkgOiBhdmFpbGFibGVXaWR0aDsKKyAgICAgICAgICAgIGZpbmFsIGludCBjdXN0b21IZWlnaHRNb2RlID0gbHAuaGVpZ2h0ICE9IExheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQgPworICAgICAgICAgICAgICAgICAgICBNZWFzdXJlU3BlYy5FWEFDVExZIDogTWVhc3VyZVNwZWMuQVRfTU9TVDsKKyAgICAgICAgICAgIGZpbmFsIGludCBjdXN0b21IZWlnaHQgPSBscC5oZWlnaHQgPj0gMCA/CisgICAgICAgICAgICAgICAgICAgIE1hdGgubWluKGxwLmhlaWdodCwgaGVpZ2h0KSA6IGhlaWdodDsKKyAgICAgICAgICAgIG1DdXN0b21WaWV3Lm1lYXN1cmUoTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKGN1c3RvbVdpZHRoLCBjdXN0b21XaWR0aE1vZGUpLAorICAgICAgICAgICAgICAgICAgICBNZWFzdXJlU3BlYy5tYWtlTWVhc3VyZVNwZWMoY3VzdG9tSGVpZ2h0LCBjdXN0b21IZWlnaHRNb2RlKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAobUNvbnRlbnRIZWlnaHQgPD0gMCkgeworICAgICAgICAgICAgaW50IG1lYXN1cmVkSGVpZ2h0ID0gMDsKKyAgICAgICAgICAgIGZpbmFsIGludCBjb3VudCA9IGdldENoaWxkQ291bnQoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIFZpZXcgdiA9IGdldENoaWxkQXQoaSk7CisgICAgICAgICAgICAgICAgaW50IHBhZGRlZFZpZXdIZWlnaHQgPSB2LmdldE1lYXN1cmVkSGVpZ2h0KCkgKyB2ZXJ0aWNhbFBhZGRpbmc7CisgICAgICAgICAgICAgICAgaWYgKHBhZGRlZFZpZXdIZWlnaHQgPiBtZWFzdXJlZEhlaWdodCkgeworICAgICAgICAgICAgICAgICAgICBtZWFzdXJlZEhlaWdodCA9IHBhZGRlZFZpZXdIZWlnaHQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0TWVhc3VyZWREaW1lbnNpb24oY29udGVudFdpZHRoLCBtZWFzdXJlZEhlaWdodCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzZXRNZWFzdXJlZERpbWVuc2lvbihjb250ZW50V2lkdGgsIG1heEhlaWdodCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkxheW91dChib29sZWFuIGNoYW5nZWQsIGludCBsLCBpbnQgdCwgaW50IHIsIGludCBiKSB7CisgICAgICAgIGludCB4ID0gZ2V0UGFkZGluZ0xlZnQoKTsKKyAgICAgICAgZmluYWwgaW50IHkgPSBnZXRQYWRkaW5nVG9wKCk7CisgICAgICAgIGZpbmFsIGludCBjb250ZW50SGVpZ2h0ID0gYiAtIHQgLSBnZXRQYWRkaW5nVG9wKCkgLSBnZXRQYWRkaW5nQm90dG9tKCk7CisgICAgICAgIGZpbmFsIGludCBpdGVtTWFyZ2luID0gbUl0ZW1QYWRkaW5nOworICAgICAgICAKKyAgICAgICAgaWYgKG1DbG9zZUJ1dHRvbiAhPSBudWxsICYmIG1DbG9zZUJ1dHRvbi5nZXRWaXNpYmlsaXR5KCkgIT0gR09ORSkgeworICAgICAgICAgICAgeCArPSBwb3NpdGlvbkNoaWxkKG1DbG9zZUJ1dHRvbiwgeCwgeSwgY29udGVudEhlaWdodCk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChtVGl0bGVMYXlvdXQgIT0gbnVsbCAmJiBtQ3VzdG9tVmlldyA9PSBudWxsKSB7CisgICAgICAgICAgICB4ICs9IHBvc2l0aW9uQ2hpbGQobVRpdGxlTGF5b3V0LCB4LCB5LCBjb250ZW50SGVpZ2h0KSArIGl0ZW1NYXJnaW47CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChtQ3VzdG9tVmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICB4ICs9IHBvc2l0aW9uQ2hpbGQobUN1c3RvbVZpZXcsIHgsIHksIGNvbnRlbnRIZWlnaHQpICsgaXRlbU1hcmdpbjsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgeCA9IHIgLSBsIC0gZ2V0UGFkZGluZ1JpZ2h0KCk7CisKKyAgICAgICAgaWYgKG1NZW51VmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICB4IC09IHBvc2l0aW9uQ2hpbGRJbnZlcnNlKG1NZW51VmlldywgeCArIG1BY3Rpb25TcGFjaW5nLCB5LCBjb250ZW50SGVpZ2h0KQorICAgICAgICAgICAgICAgICAgICAtIG1BY3Rpb25TcGFjaW5nOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnQgbWVhc3VyZUNoaWxkVmlldyhWaWV3IGNoaWxkLCBpbnQgYXZhaWxhYmxlV2lkdGgsIGludCBjaGlsZFNwZWNIZWlnaHQsIGludCBzcGFjaW5nKSB7CisgICAgICAgIGNoaWxkLm1lYXN1cmUoTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKGF2YWlsYWJsZVdpZHRoLCBNZWFzdXJlU3BlYy5BVF9NT1NUKSwKKyAgICAgICAgICAgICAgICBjaGlsZFNwZWNIZWlnaHQpOworCisgICAgICAgIGF2YWlsYWJsZVdpZHRoIC09IGNoaWxkLmdldE1lYXN1cmVkV2lkdGgoKTsKKyAgICAgICAgYXZhaWxhYmxlV2lkdGggLT0gc3BhY2luZzsKKworICAgICAgICByZXR1cm4gYXZhaWxhYmxlV2lkdGg7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgaW50IHBvc2l0aW9uQ2hpbGQoVmlldyBjaGlsZCwgaW50IHgsIGludCB5LCBpbnQgY29udGVudEhlaWdodCkgeworICAgICAgICBpbnQgY2hpbGRXaWR0aCA9IGNoaWxkLmdldE1lYXN1cmVkV2lkdGgoKTsKKyAgICAgICAgaW50IGNoaWxkSGVpZ2h0ID0gY2hpbGQuZ2V0TWVhc3VyZWRIZWlnaHQoKTsKKyAgICAgICAgaW50IGNoaWxkVG9wID0geSArIChjb250ZW50SGVpZ2h0IC0gY2hpbGRIZWlnaHQpIC8gMjsKKworICAgICAgICBjaGlsZC5sYXlvdXQoeCwgY2hpbGRUb3AsIHggKyBjaGlsZFdpZHRoLCBjaGlsZFRvcCArIGNoaWxkSGVpZ2h0KTsKKworICAgICAgICByZXR1cm4gY2hpbGRXaWR0aDsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBpbnQgcG9zaXRpb25DaGlsZEludmVyc2UoVmlldyBjaGlsZCwgaW50IHgsIGludCB5LCBpbnQgY29udGVudEhlaWdodCkgeworICAgICAgICBpbnQgY2hpbGRXaWR0aCA9IGNoaWxkLmdldE1lYXN1cmVkV2lkdGgoKTsKKyAgICAgICAgaW50IGNoaWxkSGVpZ2h0ID0gY2hpbGQuZ2V0TWVhc3VyZWRIZWlnaHQoKTsKKyAgICAgICAgaW50IGNoaWxkVG9wID0geSArIChjb250ZW50SGVpZ2h0IC0gY2hpbGRIZWlnaHQpIC8gMjsKKworICAgICAgICBjaGlsZC5sYXlvdXQoeCAtIGNoaWxkV2lkdGgsIGNoaWxkVG9wLCB4LCBjaGlsZFRvcCArIGNoaWxkSGVpZ2h0KTsKKworICAgICAgICByZXR1cm4gY2hpbGRXaWR0aDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L0FjdGlvbkJhclZpZXcuamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvQWN0aW9uQmFyVmlldy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5ZTRlNDYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L0FjdGlvbkJhclZpZXcuamF2YQpAQCAtMCwwICsxLDc1MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0OworCitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuUjsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuQWN0aW9uTWVudUl0ZW07CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51LkFjdGlvbk1lbnVWaWV3OworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5NZW51QnVpbGRlcjsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGlvbkJhcjsKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpb25CYXIuTmF2aWdhdGlvbkNhbGxiYWNrOworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5BcHBsaWNhdGlvbkluZm87CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBvcnRlckR1ZmY7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmQ29sb3JGaWx0ZXI7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzLlRydW5jYXRlQXQ7CitpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuRGlzcGxheU1ldHJpY3M7CitpbXBvcnQgYW5kcm9pZC52aWV3LkFjdGlvbk1vZGU7CitpbXBvcnQgYW5kcm9pZC52aWV3LkdyYXZpdHk7CitpbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuSW1hZ2VWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkxpbmVhckxheW91dDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5TcGlubmVyOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlNwaW5uZXJBZGFwdGVyOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OworCisvKioKKyAqIEBoaWRlCisgKi8KK3B1YmxpYyBjbGFzcyBBY3Rpb25CYXJWaWV3IGV4dGVuZHMgVmlld0dyb3VwIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkFjdGlvbkJhclZpZXciOworICAgIAorICAgIC8vIFRPRE86IFRoaXMgbXVzdCBiZSBkZWZpbmVkIGluIHRoZSBkZWZhdWx0IHRoZW1lCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENPTlRFTlRfUEFERElOR19ESVAgPSAzOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDT05URU5UX1NQQUNJTkdfRElQID0gNjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ09OVEVOVF9BQ1RJT05fU1BBQ0lOR19ESVAgPSAxMjsKKyAgICAKKyAgICAvKioKKyAgICAgKiBEaXNwbGF5IG9wdGlvbnMgYXBwbGllZCBieSBkZWZhdWx0CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElTUExBWV9ERUZBVUxUID0gMDsKKworICAgIC8qKgorICAgICAqIERpc3BsYXkgb3B0aW9ucyB0aGF0IHJlcXVpcmUgcmUtbGF5b3V0IGFzIG9wcG9zZWQgdG8gYSBzaW1wbGUgaW52YWxpZGF0ZQorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBESVNQTEFZX1JFTEFZT1VUX01BU0sgPQorICAgICAgICAgICAgQWN0aW9uQmFyLkRJU1BMQVlfSElERV9IT01FIHwKKyAgICAgICAgICAgIEFjdGlvbkJhci5ESVNQTEFZX1VTRV9MT0dPOworICAgIAorICAgIHByaXZhdGUgZmluYWwgaW50IG1Db250ZW50SGVpZ2h0OworCisgICAgcHJpdmF0ZSBpbnQgbU5hdmlnYXRpb25Nb2RlOworICAgIHByaXZhdGUgaW50IG1EaXNwbGF5T3B0aW9uczsKKyAgICBwcml2YXRlIGludCBtU3BhY2luZzsKKyAgICBwcml2YXRlIGludCBtQWN0aW9uU3BhY2luZzsKKyAgICBwcml2YXRlIENoYXJTZXF1ZW5jZSBtVGl0bGU7CisgICAgcHJpdmF0ZSBDaGFyU2VxdWVuY2UgbVN1YnRpdGxlOworICAgIHByaXZhdGUgRHJhd2FibGUgbUljb247CisgICAgcHJpdmF0ZSBEcmF3YWJsZSBtTG9nbzsKKworICAgIHByaXZhdGUgSW1hZ2VWaWV3IG1JY29uVmlldzsKKyAgICBwcml2YXRlIEltYWdlVmlldyBtTG9nb1ZpZXc7CisgICAgcHJpdmF0ZSBMaW5lYXJMYXlvdXQgbVRpdGxlTGF5b3V0OworICAgIHByaXZhdGUgVGV4dFZpZXcgbVRpdGxlVmlldzsKKyAgICBwcml2YXRlIFRleHRWaWV3IG1TdWJ0aXRsZVZpZXc7CisgICAgcHJpdmF0ZSBTcGlubmVyIG1TcGlubmVyOworICAgIHByaXZhdGUgTGluZWFyTGF5b3V0IG1UYWJMYXlvdXQ7CisgICAgcHJpdmF0ZSBWaWV3IG1DdXN0b21OYXZWaWV3OworICAgIAorICAgIHByaXZhdGUgaW50IG1UaXRsZVN0eWxlUmVzOworICAgIHByaXZhdGUgaW50IG1TdWJ0aXRsZVN0eWxlUmVzOworCisgICAgcHJpdmF0ZSBib29sZWFuIG1TaG93TWVudTsKKyAgICBwcml2YXRlIGJvb2xlYW4gbVVzZXJUaXRsZTsKKworICAgIHByaXZhdGUgTWVudUJ1aWxkZXIgbU9wdGlvbnNNZW51OworICAgIHByaXZhdGUgQWN0aW9uTWVudVZpZXcgbU1lbnVWaWV3OworICAgIAorICAgIHByaXZhdGUgQWN0aW9uQmFyQ29udGV4dFZpZXcgbUNvbnRleHRWaWV3OworCisgICAgcHJpdmF0ZSBBY3Rpb25NZW51SXRlbSBtTG9nb05hdkl0ZW07CisgICAgCisgICAgcHJpdmF0ZSBOYXZpZ2F0aW9uQ2FsbGJhY2sgbUNhbGxiYWNrOworCisgICAgcHJpdmF0ZSBmaW5hbCBBZGFwdGVyVmlldy5Pbkl0ZW1TZWxlY3RlZExpc3RlbmVyIG1OYXZJdGVtU2VsZWN0ZWRMaXN0ZW5lciA9CisgICAgICAgICAgICBuZXcgQWRhcHRlclZpZXcuT25JdGVtU2VsZWN0ZWRMaXN0ZW5lcigpIHsKKyAgICAgICAgcHVibGljIHZvaWQgb25JdGVtU2VsZWN0ZWQoQWRhcHRlclZpZXcgcGFyZW50LCBWaWV3IHZpZXcsIGludCBwb3NpdGlvbiwgbG9uZyBpZCkgeworICAgICAgICAgICAgaWYgKG1DYWxsYmFjayAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUNhbGxiYWNrLm9uTmF2aWdhdGlvbkl0ZW1TZWxlY3RlZChwb3NpdGlvbiwgaWQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHB1YmxpYyB2b2lkIG9uTm90aGluZ1NlbGVjdGVkKEFkYXB0ZXJWaWV3IHBhcmVudCkgeworICAgICAgICAgICAgLy8gRG8gbm90aGluZworICAgICAgICB9CisgICAgfTsKKworICAgIHByaXZhdGUgT25DbGlja0xpc3RlbmVyIG1Ib21lQ2xpY2tMaXN0ZW5lciA9IG51bGw7CisKKyAgICBwdWJsaWMgQWN0aW9uQmFyVmlldyhDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgeworICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycyk7CisKKyAgICAgICAgZmluYWwgRGlzcGxheU1ldHJpY3MgbWV0cmljcyA9IGNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0RGlzcGxheU1ldHJpY3MoKTsKKworICAgICAgICBUeXBlZEFycmF5IGEgPSBjb250ZXh0Lm9idGFpblN0eWxlZEF0dHJpYnV0ZXMoYXR0cnMsIFIuc3R5bGVhYmxlLkFjdGlvbkJhcik7CisKKyAgICAgICAgZmluYWwgaW50IGNvbG9yRmlsdGVyID0gYS5nZXRDb2xvcihSLnN0eWxlYWJsZS5BY3Rpb25CYXJfY29sb3JGaWx0ZXIsIDApOworCisgICAgICAgIGlmIChjb2xvckZpbHRlciAhPSAwKSB7CisgICAgICAgICAgICBmaW5hbCBEcmF3YWJsZSBkID0gZ2V0QmFja2dyb3VuZCgpOworICAgICAgICAgICAgZC5zZXREaXRoZXIodHJ1ZSk7CisgICAgICAgICAgICBkLnNldENvbG9yRmlsdGVyKG5ldyBQb3J0ZXJEdWZmQ29sb3JGaWx0ZXIoY29sb3JGaWx0ZXIsIFBvcnRlckR1ZmYuTW9kZS5PVkVSTEFZKSk7CisgICAgICAgIH0KKworICAgICAgICBBcHBsaWNhdGlvbkluZm8gaW5mbyA9IGNvbnRleHQuZ2V0QXBwbGljYXRpb25JbmZvKCk7CisgICAgICAgIFBhY2thZ2VNYW5hZ2VyIHBtID0gY29udGV4dC5nZXRQYWNrYWdlTWFuYWdlcigpOworICAgICAgICBtTmF2aWdhdGlvbk1vZGUgPSBhLmdldEludChSLnN0eWxlYWJsZS5BY3Rpb25CYXJfbmF2aWdhdGlvbk1vZGUsCisgICAgICAgICAgICAgICAgQWN0aW9uQmFyLk5BVklHQVRJT05fTU9ERV9TVEFOREFSRCk7CisgICAgICAgIG1UaXRsZSA9IGEuZ2V0VGV4dChSLnN0eWxlYWJsZS5BY3Rpb25CYXJfdGl0bGUpOworICAgICAgICBtU3VidGl0bGUgPSBhLmdldFRleHQoUi5zdHlsZWFibGUuQWN0aW9uQmFyX3N1YnRpdGxlKTsKKyAgICAgICAgbURpc3BsYXlPcHRpb25zID0gYS5nZXRJbnQoUi5zdHlsZWFibGUuQWN0aW9uQmFyX2Rpc3BsYXlPcHRpb25zLCBESVNQTEFZX0RFRkFVTFQpOworICAgICAgICAKKyAgICAgICAgbUxvZ28gPSBhLmdldERyYXdhYmxlKFIuc3R5bGVhYmxlLkFjdGlvbkJhcl9sb2dvKTsKKyAgICAgICAgaWYgKG1Mb2dvID09IG51bGwpIHsKKyAgICAgICAgICAgIG1Mb2dvID0gaW5mby5sb2FkTG9nbyhwbSk7CisgICAgICAgIH0KKyAgICAgICAgbUljb24gPSBhLmdldERyYXdhYmxlKFIuc3R5bGVhYmxlLkFjdGlvbkJhcl9pY29uKTsKKyAgICAgICAgaWYgKG1JY29uID09IG51bGwpIHsKKyAgICAgICAgICAgIG1JY29uID0gaW5mby5sb2FkSWNvbihwbSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIERyYXdhYmxlIGJhY2tncm91bmQgPSBhLmdldERyYXdhYmxlKFIuc3R5bGVhYmxlLkFjdGlvbkJhcl9iYWNrZ3JvdW5kKTsKKyAgICAgICAgaWYgKGJhY2tncm91bmQgIT0gbnVsbCkgeworICAgICAgICAgICAgc2V0QmFja2dyb3VuZERyYXdhYmxlKGJhY2tncm91bmQpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBtVGl0bGVTdHlsZVJlcyA9IGEuZ2V0UmVzb3VyY2VJZChSLnN0eWxlYWJsZS5BY3Rpb25CYXJfdGl0bGVUZXh0U3R5bGUsIDApOworICAgICAgICBtU3VidGl0bGVTdHlsZVJlcyA9IGEuZ2V0UmVzb3VyY2VJZChSLnN0eWxlYWJsZS5BY3Rpb25CYXJfc3VidGl0bGVUZXh0U3R5bGUsIDApOworCisgICAgICAgIGZpbmFsIGludCBjdXN0b21OYXZJZCA9IGEuZ2V0UmVzb3VyY2VJZChSLnN0eWxlYWJsZS5BY3Rpb25CYXJfY3VzdG9tTmF2aWdhdGlvbkxheW91dCwgMCk7CisgICAgICAgIGlmIChjdXN0b21OYXZJZCAhPSAwKSB7CisgICAgICAgICAgICBMYXlvdXRJbmZsYXRlciBpbmZsYXRlciA9IExheW91dEluZmxhdGVyLmZyb20oY29udGV4dCk7CisgICAgICAgICAgICBtQ3VzdG9tTmF2VmlldyA9IChWaWV3KSBpbmZsYXRlci5pbmZsYXRlKGN1c3RvbU5hdklkLCBudWxsKTsKKyAgICAgICAgICAgIG1OYXZpZ2F0aW9uTW9kZSA9IEFjdGlvbkJhci5OQVZJR0FUSU9OX01PREVfQ1VTVE9NOworICAgICAgICB9CisKKyAgICAgICAgbUNvbnRlbnRIZWlnaHQgPSBhLmdldExheW91dERpbWVuc2lvbihSLnN0eWxlYWJsZS5BY3Rpb25CYXJfaGVpZ2h0LCAwKTsKKworICAgICAgICBhLnJlY3ljbGUoKTsKKworICAgICAgICAvLyBUT0RPOiBTZXQgdGhpcyBpbiB0aGUgdGhlbWUKKyAgICAgICAgbVNwYWNpbmcgPSAoaW50KSAoQ09OVEVOVF9TUEFDSU5HX0RJUCAqIG1ldHJpY3MuZGVuc2l0eSArIDAuNWYpOworICAgICAgICBtQWN0aW9uU3BhY2luZyA9IChpbnQpIChDT05URU5UX0FDVElPTl9TUEFDSU5HX0RJUCAqIG1ldHJpY3MuZGVuc2l0eSArIDAuNWYpOworICAgICAgICAKKyAgICAgICAgaWYgKG1Mb2dvICE9IG51bGwgfHwgbUljb24gIT0gbnVsbCB8fCBtVGl0bGUgIT0gbnVsbCkgeworICAgICAgICAgICAgbUxvZ29OYXZJdGVtID0gbmV3IEFjdGlvbk1lbnVJdGVtKGNvbnRleHQsIDAsIGFuZHJvaWQuUi5pZC5ob21lLCAwLCAwLCBtVGl0bGUpOworICAgICAgICAgICAgbUhvbWVDbGlja0xpc3RlbmVyID0gbmV3IE9uQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICAgICAgICAgICAgICBDb250ZXh0IGNvbnRleHQgPSBnZXRDb250ZXh0KCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjb250ZXh0IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFjdGl2aXR5IGFjdGl2aXR5ID0gKEFjdGl2aXR5KSBjb250ZXh0OworICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZpdHkub25PcHRpb25zSXRlbVNlbGVjdGVkKG1Mb2dvTmF2SXRlbSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEFjdGlvbk1vZGUgc3RhcnRBY3Rpb25Nb2RlRm9yQ2hpbGQoVmlldyBjaGlsZCwgQWN0aW9uTW9kZS5DYWxsYmFjayBjYWxsYmFjaykgeworICAgICAgICAvLyBObyBzdGFydGluZyBhbiBhY3Rpb24gbW9kZSBmb3IgYW4gYWN0aW9uIGJhciBjaGlsZCEgKFdoZXJlIHdvdWxkIGl0IGdvPykKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q2FsbGJhY2soTmF2aWdhdGlvbkNhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgICAgIG1DYWxsYmFjayA9IGNhbGxiYWNrOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE1lbnUoTWVudSBtZW51KSB7CisgICAgICAgIE1lbnVCdWlsZGVyIGJ1aWxkZXIgPSAoTWVudUJ1aWxkZXIpIG1lbnU7CisgICAgICAgIG1PcHRpb25zTWVudSA9IGJ1aWxkZXI7CisgICAgICAgIGlmIChtTWVudVZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgcmVtb3ZlVmlldyhtTWVudVZpZXcpOworICAgICAgICB9CisgICAgICAgIGZpbmFsIEFjdGlvbk1lbnVWaWV3IG1lbnVWaWV3ID0gKEFjdGlvbk1lbnVWaWV3KSBidWlsZGVyLmdldE1lbnVWaWV3KAorICAgICAgICAgICAgICAgIE1lbnVCdWlsZGVyLlRZUEVfQUNUSU9OX0JVVFRPTiwgbnVsbCk7CisgICAgICAgIG1BY3Rpb25TcGFjaW5nID0gbWVudVZpZXcuZ2V0SXRlbU1hcmdpbigpOworICAgICAgICBmaW5hbCBMYXlvdXRQYXJhbXMgbGF5b3V0UGFyYW1zID0gbmV3IExheW91dFBhcmFtcyhMYXlvdXRQYXJhbXMuV1JBUF9DT05URU5ULAorICAgICAgICAgICAgICAgIExheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQpOworICAgICAgICBtZW51Vmlldy5zZXRMYXlvdXRQYXJhbXMobGF5b3V0UGFyYW1zKTsKKyAgICAgICAgYWRkVmlldyhtZW51Vmlldyk7CisgICAgICAgIG1NZW51VmlldyA9IG1lbnVWaWV3OworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHNob3dPdmVyZmxvd01lbnUoKSB7CisgICAgICAgIGlmIChtTWVudVZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG1NZW51Vmlldy5zaG93T3ZlcmZsb3dNZW51KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHBvc3RTaG93T3ZlcmZsb3dNZW51KCkgeworICAgICAgICBwb3N0KG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICBzaG93T3ZlcmZsb3dNZW51KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGhpZGVPdmVyZmxvd01lbnUoKSB7CisgICAgICAgIGlmIChtTWVudVZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG1NZW51Vmlldy5oaWRlT3ZlcmZsb3dNZW51KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzT3ZlcmZsb3dNZW51U2hvd2luZygpIHsKKyAgICAgICAgaWYgKG1NZW51VmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbU1lbnVWaWV3LmlzT3ZlcmZsb3dNZW51U2hvd2luZygpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc092ZXJmbG93UmVzZXJ2ZWQoKSB7CisgICAgICAgIHJldHVybiBtTWVudVZpZXcgIT0gbnVsbCAmJiBtTWVudVZpZXcuaXNPdmVyZmxvd1Jlc2VydmVkKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q3VzdG9tTmF2aWdhdGlvblZpZXcoVmlldyB2aWV3KSB7CisgICAgICAgIG1DdXN0b21OYXZWaWV3ID0gdmlldzsKKyAgICAgICAgaWYgKHZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgc2V0TmF2aWdhdGlvbk1vZGUoQWN0aW9uQmFyLk5BVklHQVRJT05fTU9ERV9DVVNUT00pOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXRUaXRsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1UaXRsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGFjdGlvbiBiYXIgdGl0bGUuIFRoaXMgd2lsbCBhbHdheXMgcmVwbGFjZSBvciBvdmVycmlkZSB3aW5kb3cgdGl0bGVzLgorICAgICAqIEBwYXJhbSB0aXRsZSBUaXRsZSB0byBzZXQKKyAgICAgKgorICAgICAqIEBzZWUgI3NldFdpbmRvd1RpdGxlKENoYXJTZXF1ZW5jZSkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUaXRsZShDaGFyU2VxdWVuY2UgdGl0bGUpIHsKKyAgICAgICAgbVVzZXJUaXRsZSA9IHRydWU7CisgICAgICAgIHNldFRpdGxlSW1wbCh0aXRsZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSB3aW5kb3cgdGl0bGUuIEEgd2luZG93IHRpdGxlIHdpbGwgYWx3YXlzIGJlIHJlcGxhY2VkIG9yIG92ZXJyaWRkZW4gYnkgYSB1c2VyIHRpdGxlLgorICAgICAqIEBwYXJhbSB0aXRsZSBUaXRsZSB0byBzZXQKKyAgICAgKgorICAgICAqIEBzZWUgI3NldFRpdGxlKENoYXJTZXF1ZW5jZSkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRXaW5kb3dUaXRsZShDaGFyU2VxdWVuY2UgdGl0bGUpIHsKKyAgICAgICAgaWYgKCFtVXNlclRpdGxlKSB7CisgICAgICAgICAgICBzZXRUaXRsZUltcGwodGl0bGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNldFRpdGxlSW1wbChDaGFyU2VxdWVuY2UgdGl0bGUpIHsKKyAgICAgICAgbVRpdGxlID0gdGl0bGU7CisgICAgICAgIGlmIChtVGl0bGVWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1UaXRsZVZpZXcuc2V0VGV4dCh0aXRsZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1Mb2dvTmF2SXRlbSAhPSBudWxsKSB7CisgICAgICAgICAgICBtTG9nb05hdkl0ZW0uc2V0VGl0bGUodGl0bGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXRTdWJ0aXRsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1TdWJ0aXRsZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTdWJ0aXRsZShDaGFyU2VxdWVuY2Ugc3VidGl0bGUpIHsKKyAgICAgICAgbVN1YnRpdGxlID0gc3VidGl0bGU7CisgICAgICAgIGlmIChtU3VidGl0bGVWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1TdWJ0aXRsZVZpZXcuc2V0VGV4dChzdWJ0aXRsZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXREaXNwbGF5T3B0aW9ucyhpbnQgb3B0aW9ucykgeworICAgICAgICBmaW5hbCBpbnQgZmxhZ3NDaGFuZ2VkID0gb3B0aW9ucyBeIG1EaXNwbGF5T3B0aW9uczsKKyAgICAgICAgbURpc3BsYXlPcHRpb25zID0gb3B0aW9uczsKKyAgICAgICAgaWYgKChmbGFnc0NoYW5nZWQgJiBESVNQTEFZX1JFTEFZT1VUX01BU0spICE9IDApIHsKKyAgICAgICAgICAgIGZpbmFsIGludCB2aXMgPSAob3B0aW9ucyAmIEFjdGlvbkJhci5ESVNQTEFZX0hJREVfSE9NRSkgIT0gMCA/IEdPTkUgOiBWSVNJQkxFOworICAgICAgICAgICAgaWYgKG1Mb2dvVmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUxvZ29WaWV3LnNldFZpc2liaWxpdHkodmlzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtSWNvblZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1JY29uVmlldy5zZXRWaXNpYmlsaXR5KHZpcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHJlcXVlc3RMYXlvdXQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGludmFsaWRhdGUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE5hdmlnYXRpb25Nb2RlKGludCBtb2RlKSB7CisgICAgICAgIGZpbmFsIGludCBvbGRNb2RlID0gbU5hdmlnYXRpb25Nb2RlOworICAgICAgICBpZiAobW9kZSAhPSBvbGRNb2RlKSB7CisgICAgICAgICAgICBzd2l0Y2ggKG9sZE1vZGUpIHsKKyAgICAgICAgICAgIGNhc2UgQWN0aW9uQmFyLk5BVklHQVRJT05fTU9ERV9TVEFOREFSRDoKKyAgICAgICAgICAgICAgICBpZiAobVRpdGxlTGF5b3V0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVtb3ZlVmlldyhtVGl0bGVMYXlvdXQpOworICAgICAgICAgICAgICAgICAgICBtVGl0bGVMYXlvdXQgPSBudWxsOworICAgICAgICAgICAgICAgICAgICBtVGl0bGVWaWV3ID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgbVN1YnRpdGxlVmlldyA9IG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBY3Rpb25CYXIuTkFWSUdBVElPTl9NT0RFX0RST1BET1dOX0xJU1Q6CisgICAgICAgICAgICAgICAgaWYgKG1TcGlubmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVtb3ZlVmlldyhtU3Bpbm5lcik7CisgICAgICAgICAgICAgICAgICAgIG1TcGlubmVyID0gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFjdGlvbkJhci5OQVZJR0FUSU9OX01PREVfQ1VTVE9NOgorICAgICAgICAgICAgICAgIGlmIChtQ3VzdG9tTmF2VmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHJlbW92ZVZpZXcobUN1c3RvbU5hdlZpZXcpOworICAgICAgICAgICAgICAgICAgICBtQ3VzdG9tTmF2VmlldyA9IG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBY3Rpb25CYXIuTkFWSUdBVElPTl9NT0RFX1RBQlM6CisgICAgICAgICAgICAgICAgaWYgKG1UYWJMYXlvdXQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICByZW1vdmVWaWV3KG1UYWJMYXlvdXQpOworICAgICAgICAgICAgICAgICAgICBtVGFiTGF5b3V0ID0gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHN3aXRjaCAobW9kZSkgeworICAgICAgICAgICAgY2FzZSBBY3Rpb25CYXIuTkFWSUdBVElPTl9NT0RFX1NUQU5EQVJEOgorICAgICAgICAgICAgICAgIGluaXRUaXRsZSgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBY3Rpb25CYXIuTkFWSUdBVElPTl9NT0RFX0RST1BET1dOX0xJU1Q6CisgICAgICAgICAgICAgICAgbVNwaW5uZXIgPSBuZXcgU3Bpbm5lcihtQ29udGV4dCwgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYXR0ci5kcm9wRG93blNwaW5uZXJTdHlsZSk7CisgICAgICAgICAgICAgICAgbVNwaW5uZXIuc2V0T25JdGVtU2VsZWN0ZWRMaXN0ZW5lcihtTmF2SXRlbVNlbGVjdGVkTGlzdGVuZXIpOworICAgICAgICAgICAgICAgIGFkZFZpZXcobVNwaW5uZXIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBY3Rpb25CYXIuTkFWSUdBVElPTl9NT0RFX0NVU1RPTToKKyAgICAgICAgICAgICAgICBhZGRWaWV3KG1DdXN0b21OYXZWaWV3KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQWN0aW9uQmFyLk5BVklHQVRJT05fTU9ERV9UQUJTOgorICAgICAgICAgICAgICAgIG1UYWJMYXlvdXQgPSBuZXcgTGluZWFyTGF5b3V0KGdldENvbnRleHQoKSk7CisgICAgICAgICAgICAgICAgYWRkVmlldyhtVGFiTGF5b3V0KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1OYXZpZ2F0aW9uTW9kZSA9IG1vZGU7CisgICAgICAgICAgICByZXF1ZXN0TGF5b3V0KCk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgc2V0RHJvcGRvd25BZGFwdGVyKFNwaW5uZXJBZGFwdGVyIGFkYXB0ZXIpIHsKKyAgICAgICAgbVNwaW5uZXIuc2V0QWRhcHRlcihhZGFwdGVyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXREcm9wZG93blNlbGVjdGVkUG9zaXRpb24oaW50IHBvc2l0aW9uKSB7CisgICAgICAgIG1TcGlubmVyLnNldFNlbGVjdGlvbihwb3NpdGlvbik7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXREcm9wZG93blNlbGVjdGVkUG9zaXRpb24oKSB7CisgICAgICAgIHJldHVybiBtU3Bpbm5lci5nZXRTZWxlY3RlZEl0ZW1Qb3NpdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyBWaWV3IGdldEN1c3RvbU5hdmlnYXRpb25WaWV3KCkgeworICAgICAgICByZXR1cm4gbUN1c3RvbU5hdlZpZXc7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBpbnQgZ2V0TmF2aWdhdGlvbk1vZGUoKSB7CisgICAgICAgIHJldHVybiBtTmF2aWdhdGlvbk1vZGU7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBpbnQgZ2V0RGlzcGxheU9wdGlvbnMoKSB7CisgICAgICAgIHJldHVybiBtRGlzcGxheU9wdGlvbnM7CisgICAgfQorCisgICAgcHJpdmF0ZSBUYWJWaWV3IGNyZWF0ZVRhYlZpZXcoQWN0aW9uQmFyLlRhYiB0YWIpIHsKKyAgICAgICAgZmluYWwgVGFiVmlldyB0YWJWaWV3ID0gbmV3IFRhYlZpZXcoZ2V0Q29udGV4dCgpLCB0YWIpOworICAgICAgICB0YWJWaWV3LnNldEZvY3VzYWJsZSh0cnVlKTsKKyAgICAgICAgdGFiVmlldy5zZXRPbkNsaWNrTGlzdGVuZXIobmV3IFRhYkNsaWNrTGlzdGVuZXIoKSk7CisgICAgICAgIHJldHVybiB0YWJWaWV3OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZFRhYihBY3Rpb25CYXIuVGFiIHRhYikgeworICAgICAgICBmaW5hbCBib29sZWFuIGlzRmlyc3QgPSBtVGFiTGF5b3V0LmdldENoaWxkQ291bnQoKSA9PSAwOworICAgICAgICBmaW5hbCBUYWJWaWV3IHRhYlZpZXcgPSBjcmVhdGVUYWJWaWV3KHRhYik7CisgICAgICAgIG1UYWJMYXlvdXQuYWRkVmlldyh0YWJWaWV3KTsKKyAgICAgICAgaWYgKGlzRmlyc3QpIHsKKyAgICAgICAgICAgIHRhYlZpZXcuc2V0U2VsZWN0ZWQodHJ1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBpbnNlcnRUYWIoQWN0aW9uQmFyLlRhYiB0YWIsIGludCBwb3NpdGlvbikgeworICAgICAgICBmaW5hbCBib29sZWFuIGlzRmlyc3QgPSBtVGFiTGF5b3V0LmdldENoaWxkQ291bnQoKSA9PSAwOworICAgICAgICBmaW5hbCBUYWJWaWV3IHRhYlZpZXcgPSBjcmVhdGVUYWJWaWV3KHRhYik7CisgICAgICAgIG1UYWJMYXlvdXQuYWRkVmlldyh0YWJWaWV3LCBwb3NpdGlvbik7CisgICAgICAgIGlmIChpc0ZpcnN0KSB7CisgICAgICAgICAgICB0YWJWaWV3LnNldFNlbGVjdGVkKHRydWUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVtb3ZlVGFiQXQoaW50IHBvc2l0aW9uKSB7CisgICAgICAgIG1UYWJMYXlvdXQucmVtb3ZlVmlld0F0KHBvc2l0aW9uKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgTGF5b3V0UGFyYW1zIGdlbmVyYXRlRGVmYXVsdExheW91dFBhcmFtcygpIHsKKyAgICAgICAgLy8gVXNlZCBieSBjdXN0b20gbmF2IHZpZXdzIGlmIHRoZXkgZG9uJ3Qgc3VwcGx5IGxheW91dCBwYXJhbXMuIEV2ZXJ5dGhpbmcgZWxzZQorICAgICAgICAvLyBhZGRlZCB0byBhbiBBY3Rpb25CYXJWaWV3IHNob3VsZCBoYXZlIHRoZW0gYWxyZWFkeS4KKyAgICAgICAgcmV0dXJuIG5ldyBMYXlvdXRQYXJhbXMoTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCwgTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25GaW5pc2hJbmZsYXRlKCkgeworICAgICAgICBzdXBlci5vbkZpbmlzaEluZmxhdGUoKTsKKworICAgICAgICBpZiAoKG1EaXNwbGF5T3B0aW9ucyAmIEFjdGlvbkJhci5ESVNQTEFZX0hJREVfSE9NRSkgPT0gMCkgeworICAgICAgICAgICAgaWYgKG1Mb2dvICE9IG51bGwgJiYgKG1EaXNwbGF5T3B0aW9ucyAmIEFjdGlvbkJhci5ESVNQTEFZX1VTRV9MT0dPKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgbUxvZ29WaWV3ID0gbmV3IEltYWdlVmlldyhnZXRDb250ZXh0KCkpOworICAgICAgICAgICAgICAgIG1Mb2dvVmlldy5zZXRBZGp1c3RWaWV3Qm91bmRzKHRydWUpOworICAgICAgICAgICAgICAgIG1Mb2dvVmlldy5zZXRMYXlvdXRQYXJhbXMobmV3IExheW91dFBhcmFtcyhMYXlvdXRQYXJhbXMuV1JBUF9DT05URU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCkpOworICAgICAgICAgICAgICAgIG1Mb2dvVmlldy5zZXRJbWFnZURyYXdhYmxlKG1Mb2dvKTsKKyAgICAgICAgICAgICAgICBtTG9nb1ZpZXcuc2V0Q2xpY2thYmxlKHRydWUpOworICAgICAgICAgICAgICAgIG1Mb2dvVmlldy5zZXRGb2N1c2FibGUodHJ1ZSk7CisgICAgICAgICAgICAgICAgbUxvZ29WaWV3LnNldE9uQ2xpY2tMaXN0ZW5lcihtSG9tZUNsaWNrTGlzdGVuZXIpOworICAgICAgICAgICAgICAgIGFkZFZpZXcobUxvZ29WaWV3KTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobUljb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1JY29uVmlldyA9IG5ldyBJbWFnZVZpZXcoZ2V0Q29udGV4dCgpKTsKKyAgICAgICAgICAgICAgICBtSWNvblZpZXcuc2V0QWRqdXN0Vmlld0JvdW5kcyh0cnVlKTsKKyAgICAgICAgICAgICAgICBtSWNvblZpZXcuc2V0TGF5b3V0UGFyYW1zKG5ldyBMYXlvdXRQYXJhbXMoTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIExheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQpKTsKKyAgICAgICAgICAgICAgICBtSWNvblZpZXcuc2V0SW1hZ2VEcmF3YWJsZShtSWNvbik7CisgICAgICAgICAgICAgICAgbUljb25WaWV3LnNldENsaWNrYWJsZSh0cnVlKTsKKyAgICAgICAgICAgICAgICBtSWNvblZpZXcuc2V0Rm9jdXNhYmxlKHRydWUpOworICAgICAgICAgICAgICAgIG1JY29uVmlldy5zZXRPbkNsaWNrTGlzdGVuZXIobUhvbWVDbGlja0xpc3RlbmVyKTsKKyAgICAgICAgICAgICAgICBhZGRWaWV3KG1JY29uVmlldyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2ggKG1OYXZpZ2F0aW9uTW9kZSkgeworICAgICAgICBjYXNlIEFjdGlvbkJhci5OQVZJR0FUSU9OX01PREVfU1RBTkRBUkQ6CisgICAgICAgICAgICBpZiAobUxvZ29WaWV3ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpbml0VGl0bGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgCisgICAgICAgIGNhc2UgQWN0aW9uQmFyLk5BVklHQVRJT05fTU9ERV9EUk9QRE9XTl9MSVNUOgorICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiSW5mbGF0aW5nIGRyb3Bkb3duIGxpc3QgbmF2aWdhdGlvbiBpc24ndCBzdXBwb3J0ZWQgeWV0ISIpOworICAgICAgICAgICAgCisgICAgICAgIGNhc2UgQWN0aW9uQmFyLk5BVklHQVRJT05fTU9ERV9UQUJTOgorICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiSW5mbGF0aW5nIHRhYiBuYXZpZ2F0aW9uIGlzbid0IHN1cHBvcnRlZCB5ZXQhIik7CisgICAgICAgICAgICAKKyAgICAgICAgY2FzZSBBY3Rpb25CYXIuTkFWSUdBVElPTl9NT0RFX0NVU1RPTToKKyAgICAgICAgICAgIGlmIChtQ3VzdG9tTmF2VmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgYWRkVmlldyhtQ3VzdG9tTmF2Vmlldyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwcml2YXRlIHZvaWQgaW5pdFRpdGxlKCkgeworICAgICAgICBMYXlvdXRJbmZsYXRlciBpbmZsYXRlciA9IExheW91dEluZmxhdGVyLmZyb20oZ2V0Q29udGV4dCgpKTsKKyAgICAgICAgbVRpdGxlTGF5b3V0ID0gKExpbmVhckxheW91dCkgaW5mbGF0ZXIuaW5mbGF0ZShSLmxheW91dC5hY3Rpb25fYmFyX3RpdGxlX2l0ZW0sIG51bGwpOworICAgICAgICBtVGl0bGVWaWV3ID0gKFRleHRWaWV3KSBtVGl0bGVMYXlvdXQuZmluZFZpZXdCeUlkKFIuaWQuYWN0aW9uX2Jhcl90aXRsZSk7CisgICAgICAgIG1TdWJ0aXRsZVZpZXcgPSAoVGV4dFZpZXcpIG1UaXRsZUxheW91dC5maW5kVmlld0J5SWQoUi5pZC5hY3Rpb25fYmFyX3N1YnRpdGxlKTsKKworICAgICAgICBpZiAobVRpdGxlU3R5bGVSZXMgIT0gMCkgeworICAgICAgICAgICAgbVRpdGxlVmlldy5zZXRUZXh0QXBwZWFyYW5jZShtQ29udGV4dCwgbVRpdGxlU3R5bGVSZXMpOworICAgICAgICB9CisgICAgICAgIGlmIChtVGl0bGUgIT0gbnVsbCkgeworICAgICAgICAgICAgbVRpdGxlVmlldy5zZXRUZXh0KG1UaXRsZSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAobVN1YnRpdGxlU3R5bGVSZXMgIT0gMCkgeworICAgICAgICAgICAgbVN1YnRpdGxlVmlldy5zZXRUZXh0QXBwZWFyYW5jZShtQ29udGV4dCwgbVN1YnRpdGxlU3R5bGVSZXMpOworICAgICAgICB9CisgICAgICAgIGlmIChtU3VidGl0bGUgIT0gbnVsbCkgeworICAgICAgICAgICAgbVN1YnRpdGxlVmlldy5zZXRUZXh0KG1TdWJ0aXRsZSk7CisgICAgICAgICAgICBtU3VidGl0bGVWaWV3LnNldFZpc2liaWxpdHkoVklTSUJMRSk7CisgICAgICAgIH0KKworICAgICAgICBhZGRWaWV3KG1UaXRsZUxheW91dCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VGFiU2VsZWN0ZWQoaW50IHBvc2l0aW9uKSB7CisgICAgICAgIGZpbmFsIGludCB0YWJDb3VudCA9IG1UYWJMYXlvdXQuZ2V0Q2hpbGRDb3VudCgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRhYkNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIGZpbmFsIFZpZXcgY2hpbGQgPSBtVGFiTGF5b3V0LmdldENoaWxkQXQoaSk7CisgICAgICAgICAgICBjaGlsZC5zZXRTZWxlY3RlZChpID09IHBvc2l0aW9uKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENvbnRleHRWaWV3KEFjdGlvbkJhckNvbnRleHRWaWV3IHZpZXcpIHsKKyAgICAgICAgbUNvbnRleHRWaWV3ID0gdmlldzsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbk1lYXN1cmUoaW50IHdpZHRoTWVhc3VyZVNwZWMsIGludCBoZWlnaHRNZWFzdXJlU3BlYykgeworICAgICAgICBpbnQgd2lkdGhNb2RlID0gTWVhc3VyZVNwZWMuZ2V0TW9kZSh3aWR0aE1lYXN1cmVTcGVjKTsKKyAgICAgICAgaWYgKHdpZHRoTW9kZSAhPSBNZWFzdXJlU3BlYy5FWEFDVExZKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKGdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpICsgIiBjYW4gb25seSBiZSB1c2VkICIgKworICAgICAgICAgICAgICAgICAgICAid2l0aCBhbmRyb2lkOmxheW91dF93aWR0aD1cIm1hdGNoX3BhcmVudFwiIChvciBmaWxsX3BhcmVudCkiKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaW50IGhlaWdodE1vZGUgPSBNZWFzdXJlU3BlYy5nZXRNb2RlKGhlaWdodE1lYXN1cmVTcGVjKTsKKyAgICAgICAgaWYgKGhlaWdodE1vZGUgIT0gTWVhc3VyZVNwZWMuQVRfTU9TVCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihnZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSArICIgY2FuIG9ubHkgYmUgdXNlZCAiICsKKyAgICAgICAgICAgICAgICAgICAgIndpdGggYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PVwid3JhcF9jb250ZW50XCIiKTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBjb250ZW50V2lkdGggPSBNZWFzdXJlU3BlYy5nZXRTaXplKHdpZHRoTWVhc3VyZVNwZWMpOworCisgICAgICAgIGludCBtYXhIZWlnaHQgPSBtQ29udGVudEhlaWdodCA+IDAgPworICAgICAgICAgICAgICAgIG1Db250ZW50SGVpZ2h0IDogTWVhc3VyZVNwZWMuZ2V0U2l6ZShoZWlnaHRNZWFzdXJlU3BlYyk7CisgICAgICAgIAorICAgICAgICBmaW5hbCBpbnQgdmVydGljYWxQYWRkaW5nID0gZ2V0UGFkZGluZ1RvcCgpICsgZ2V0UGFkZGluZ0JvdHRvbSgpOworICAgICAgICBpbnQgYXZhaWxhYmxlV2lkdGggPSBjb250ZW50V2lkdGggLSBnZXRQYWRkaW5nTGVmdCgpIC0gZ2V0UGFkZGluZ1JpZ2h0KCk7CisgICAgICAgIGZpbmFsIGludCBoZWlnaHQgPSBtYXhIZWlnaHQgLSB2ZXJ0aWNhbFBhZGRpbmc7CisgICAgICAgIGZpbmFsIGludCBjaGlsZFNwZWNIZWlnaHQgPSBNZWFzdXJlU3BlYy5tYWtlTWVhc3VyZVNwZWMoaGVpZ2h0LCBNZWFzdXJlU3BlYy5BVF9NT1NUKTsKKworICAgICAgICBpZiAobUxvZ29WaWV3ICE9IG51bGwgJiYgbUxvZ29WaWV3LmdldFZpc2liaWxpdHkoKSAhPSBHT05FKSB7CisgICAgICAgICAgICBhdmFpbGFibGVXaWR0aCA9IG1lYXN1cmVDaGlsZFZpZXcobUxvZ29WaWV3LCBhdmFpbGFibGVXaWR0aCwgY2hpbGRTcGVjSGVpZ2h0LCBtU3BhY2luZyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1JY29uVmlldyAhPSBudWxsICYmIG1JY29uVmlldy5nZXRWaXNpYmlsaXR5KCkgIT0gR09ORSkgeworICAgICAgICAgICAgYXZhaWxhYmxlV2lkdGggPSBtZWFzdXJlQ2hpbGRWaWV3KG1JY29uVmlldywgYXZhaWxhYmxlV2lkdGgsIGNoaWxkU3BlY0hlaWdodCwgbVNwYWNpbmcpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAobU1lbnVWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGF2YWlsYWJsZVdpZHRoID0gbWVhc3VyZUNoaWxkVmlldyhtTWVudVZpZXcsIGF2YWlsYWJsZVdpZHRoLAorICAgICAgICAgICAgICAgICAgICBjaGlsZFNwZWNIZWlnaHQsIDApOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBzd2l0Y2ggKG1OYXZpZ2F0aW9uTW9kZSkgeworICAgICAgICBjYXNlIEFjdGlvbkJhci5OQVZJR0FUSU9OX01PREVfU1RBTkRBUkQ6CisgICAgICAgICAgICBpZiAobVRpdGxlTGF5b3V0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtZWFzdXJlQ2hpbGRWaWV3KG1UaXRsZUxheW91dCwgYXZhaWxhYmxlV2lkdGgsIGNoaWxkU3BlY0hlaWdodCwgbVNwYWNpbmcpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQWN0aW9uQmFyLk5BVklHQVRJT05fTU9ERV9EUk9QRE9XTl9MSVNUOgorICAgICAgICAgICAgaWYgKG1TcGlubmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtU3Bpbm5lci5tZWFzdXJlKAorICAgICAgICAgICAgICAgICAgICAgICAgTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKGF2YWlsYWJsZVdpZHRoLCBNZWFzdXJlU3BlYy5BVF9NT1NUKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE1lYXN1cmVTcGVjLm1ha2VNZWFzdXJlU3BlYyhoZWlnaHQsIE1lYXN1cmVTcGVjLkFUX01PU1QpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFjdGlvbkJhci5OQVZJR0FUSU9OX01PREVfQ1VTVE9NOgorICAgICAgICAgICAgaWYgKG1DdXN0b21OYXZWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBMYXlvdXRQYXJhbXMgbHAgPSBtQ3VzdG9tTmF2Vmlldy5nZXRMYXlvdXRQYXJhbXMoKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgY3VzdG9tTmF2V2lkdGhNb2RlID0gbHAud2lkdGggIT0gTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCA/CisgICAgICAgICAgICAgICAgICAgICAgICBNZWFzdXJlU3BlYy5FWEFDVExZIDogTWVhc3VyZVNwZWMuQVRfTU9TVDsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgY3VzdG9tTmF2V2lkdGggPSBscC53aWR0aCA+PSAwID8KKyAgICAgICAgICAgICAgICAgICAgICAgIE1hdGgubWluKGxwLndpZHRoLCBhdmFpbGFibGVXaWR0aCkgOiBhdmFpbGFibGVXaWR0aDsKKworICAgICAgICAgICAgICAgIC8vIElmIHRoZSBhY3Rpb24gYmFyIGlzIHdyYXBwaW5nIHRvIGl0cyBjb250ZW50IGhlaWdodCwgZG9uJ3QgYWxsb3cgYSBjdXN0b20KKyAgICAgICAgICAgICAgICAvLyB2aWV3IHRvIE1BVENIX1BBUkVOVC4KKyAgICAgICAgICAgICAgICBpbnQgY3VzdG9tTmF2SGVpZ2h0TW9kZTsKKyAgICAgICAgICAgICAgICBpZiAobUNvbnRlbnRIZWlnaHQgPD0gMCkgeworICAgICAgICAgICAgICAgICAgICBjdXN0b21OYXZIZWlnaHRNb2RlID0gTWVhc3VyZVNwZWMuQVRfTU9TVDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBjdXN0b21OYXZIZWlnaHRNb2RlID0gbHAuaGVpZ2h0ICE9IExheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lYXN1cmVTcGVjLkVYQUNUTFkgOiBNZWFzdXJlU3BlYy5BVF9NT1NUOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgY3VzdG9tTmF2SGVpZ2h0ID0gbHAuaGVpZ2h0ID49IDAgPworICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5taW4obHAuaGVpZ2h0LCBoZWlnaHQpIDogaGVpZ2h0OworICAgICAgICAgICAgICAgIG1DdXN0b21OYXZWaWV3Lm1lYXN1cmUoCisgICAgICAgICAgICAgICAgICAgICAgICBNZWFzdXJlU3BlYy5tYWtlTWVhc3VyZVNwZWMoY3VzdG9tTmF2V2lkdGgsIGN1c3RvbU5hdldpZHRoTW9kZSksCisgICAgICAgICAgICAgICAgICAgICAgICBNZWFzdXJlU3BlYy5tYWtlTWVhc3VyZVNwZWMoY3VzdG9tTmF2SGVpZ2h0LCBjdXN0b21OYXZIZWlnaHRNb2RlKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBY3Rpb25CYXIuTkFWSUdBVElPTl9NT0RFX1RBQlM6CisgICAgICAgICAgICBpZiAobVRhYkxheW91dCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbVRhYkxheW91dC5tZWFzdXJlKAorICAgICAgICAgICAgICAgICAgICAgICAgTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKGF2YWlsYWJsZVdpZHRoLCBNZWFzdXJlU3BlYy5BVF9NT1NUKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE1lYXN1cmVTcGVjLm1ha2VNZWFzdXJlU3BlYyhoZWlnaHQsIE1lYXN1cmVTcGVjLkFUX01PU1QpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1Db250ZW50SGVpZ2h0IDw9IDApIHsKKyAgICAgICAgICAgIGludCBtZWFzdXJlZEhlaWdodCA9IDA7CisgICAgICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBnZXRDaGlsZENvdW50KCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBWaWV3IHYgPSBnZXRDaGlsZEF0KGkpOworICAgICAgICAgICAgICAgIGludCBwYWRkZWRWaWV3SGVpZ2h0ID0gdi5nZXRNZWFzdXJlZEhlaWdodCgpICsgdmVydGljYWxQYWRkaW5nOworICAgICAgICAgICAgICAgIGlmIChwYWRkZWRWaWV3SGVpZ2h0ID4gbWVhc3VyZWRIZWlnaHQpIHsKKyAgICAgICAgICAgICAgICAgICAgbWVhc3VyZWRIZWlnaHQgPSBwYWRkZWRWaWV3SGVpZ2h0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldE1lYXN1cmVkRGltZW5zaW9uKGNvbnRlbnRXaWR0aCwgbWVhc3VyZWRIZWlnaHQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2V0TWVhc3VyZWREaW1lbnNpb24oY29udGVudFdpZHRoLCBtYXhIZWlnaHQpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1Db250ZXh0VmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICBtQ29udGV4dFZpZXcuc2V0SGVpZ2h0KGdldE1lYXN1cmVkSGVpZ2h0KCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnQgbWVhc3VyZUNoaWxkVmlldyhWaWV3IGNoaWxkLCBpbnQgYXZhaWxhYmxlV2lkdGgsIGludCBjaGlsZFNwZWNIZWlnaHQsIGludCBzcGFjaW5nKSB7CisgICAgICAgIGNoaWxkLm1lYXN1cmUoTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKGF2YWlsYWJsZVdpZHRoLCBNZWFzdXJlU3BlYy5BVF9NT1NUKSwKKyAgICAgICAgICAgICAgICBjaGlsZFNwZWNIZWlnaHQpOworCisgICAgICAgIGF2YWlsYWJsZVdpZHRoIC09IGNoaWxkLmdldE1lYXN1cmVkV2lkdGgoKTsKKyAgICAgICAgYXZhaWxhYmxlV2lkdGggLT0gc3BhY2luZzsKKworICAgICAgICByZXR1cm4gYXZhaWxhYmxlV2lkdGg7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25MYXlvdXQoYm9vbGVhbiBjaGFuZ2VkLCBpbnQgbCwgaW50IHQsIGludCByLCBpbnQgYikgeworICAgICAgICBpbnQgeCA9IGdldFBhZGRpbmdMZWZ0KCk7CisgICAgICAgIGZpbmFsIGludCB5ID0gZ2V0UGFkZGluZ1RvcCgpOworICAgICAgICBmaW5hbCBpbnQgY29udGVudEhlaWdodCA9IGIgLSB0IC0gZ2V0UGFkZGluZ1RvcCgpIC0gZ2V0UGFkZGluZ0JvdHRvbSgpOworCisgICAgICAgIGlmIChtTG9nb1ZpZXcgIT0gbnVsbCAmJiBtTG9nb1ZpZXcuZ2V0VmlzaWJpbGl0eSgpICE9IEdPTkUpIHsKKyAgICAgICAgICAgIHggKz0gcG9zaXRpb25DaGlsZChtTG9nb1ZpZXcsIHgsIHksIGNvbnRlbnRIZWlnaHQpICsgbVNwYWNpbmc7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1JY29uVmlldyAhPSBudWxsICYmIG1JY29uVmlldy5nZXRWaXNpYmlsaXR5KCkgIT0gR09ORSkgeworICAgICAgICAgICAgeCArPSBwb3NpdGlvbkNoaWxkKG1JY29uVmlldywgeCwgeSwgY29udGVudEhlaWdodCkgKyBtU3BhY2luZzsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgc3dpdGNoIChtTmF2aWdhdGlvbk1vZGUpIHsKKyAgICAgICAgY2FzZSBBY3Rpb25CYXIuTkFWSUdBVElPTl9NT0RFX1NUQU5EQVJEOgorICAgICAgICAgICAgaWYgKG1UaXRsZUxheW91dCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgeCArPSBwb3NpdGlvbkNoaWxkKG1UaXRsZUxheW91dCwgeCwgeSwgY29udGVudEhlaWdodCkgKyBtU3BhY2luZzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFjdGlvbkJhci5OQVZJR0FUSU9OX01PREVfRFJPUERPV05fTElTVDoKKyAgICAgICAgICAgIGlmIChtU3Bpbm5lciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgeCArPSBwb3NpdGlvbkNoaWxkKG1TcGlubmVyLCB4LCB5LCBjb250ZW50SGVpZ2h0KSArIG1TcGFjaW5nOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQWN0aW9uQmFyLk5BVklHQVRJT05fTU9ERV9DVVNUT006CisgICAgICAgICAgICBpZiAobUN1c3RvbU5hdlZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHggKz0gcG9zaXRpb25DaGlsZChtQ3VzdG9tTmF2VmlldywgeCwgeSwgY29udGVudEhlaWdodCkgKyBtU3BhY2luZzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFjdGlvbkJhci5OQVZJR0FUSU9OX01PREVfVEFCUzoKKyAgICAgICAgICAgIGlmIChtVGFiTGF5b3V0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB4ICs9IHBvc2l0aW9uQ2hpbGQobVRhYkxheW91dCwgeCwgeSwgY29udGVudEhlaWdodCkgKyBtU3BhY2luZzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHggPSByIC0gbCAtIGdldFBhZGRpbmdSaWdodCgpOworCisgICAgICAgIGlmIChtTWVudVZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgeCAtPSBwb3NpdGlvbkNoaWxkSW52ZXJzZShtTWVudVZpZXcsIHggKyBtQWN0aW9uU3BhY2luZywgeSwgY29udGVudEhlaWdodCkKKyAgICAgICAgICAgICAgICAgICAgLSBtQWN0aW9uU3BhY2luZzsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgaW50IHBvc2l0aW9uQ2hpbGQoVmlldyBjaGlsZCwgaW50IHgsIGludCB5LCBpbnQgY29udGVudEhlaWdodCkgeworICAgICAgICBpbnQgY2hpbGRXaWR0aCA9IGNoaWxkLmdldE1lYXN1cmVkV2lkdGgoKTsKKyAgICAgICAgaW50IGNoaWxkSGVpZ2h0ID0gY2hpbGQuZ2V0TWVhc3VyZWRIZWlnaHQoKTsKKyAgICAgICAgaW50IGNoaWxkVG9wID0geSArIChjb250ZW50SGVpZ2h0IC0gY2hpbGRIZWlnaHQpIC8gMjsKKworICAgICAgICBjaGlsZC5sYXlvdXQoeCwgY2hpbGRUb3AsIHggKyBjaGlsZFdpZHRoLCBjaGlsZFRvcCArIGNoaWxkSGVpZ2h0KTsKKworICAgICAgICByZXR1cm4gY2hpbGRXaWR0aDsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBpbnQgcG9zaXRpb25DaGlsZEludmVyc2UoVmlldyBjaGlsZCwgaW50IHgsIGludCB5LCBpbnQgY29udGVudEhlaWdodCkgeworICAgICAgICBpbnQgY2hpbGRXaWR0aCA9IGNoaWxkLmdldE1lYXN1cmVkV2lkdGgoKTsKKyAgICAgICAgaW50IGNoaWxkSGVpZ2h0ID0gY2hpbGQuZ2V0TWVhc3VyZWRIZWlnaHQoKTsKKyAgICAgICAgaW50IGNoaWxkVG9wID0geSArIChjb250ZW50SGVpZ2h0IC0gY2hpbGRIZWlnaHQpIC8gMjsKKworICAgICAgICBjaGlsZC5sYXlvdXQoeCAtIGNoaWxkV2lkdGgsIGNoaWxkVG9wLCB4LCBjaGlsZFRvcCArIGNoaWxkSGVpZ2h0KTsKKworICAgICAgICByZXR1cm4gY2hpbGRXaWR0aDsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBUYWJWaWV3IGV4dGVuZHMgTGluZWFyTGF5b3V0IHsKKyAgICAgICAgcHJpdmF0ZSBBY3Rpb25CYXIuVGFiIG1UYWI7CisKKyAgICAgICAgcHVibGljIFRhYlZpZXcoQ29udGV4dCBjb250ZXh0LCBBY3Rpb25CYXIuVGFiIHRhYikgeworICAgICAgICAgICAgc3VwZXIoY29udGV4dCk7CisgICAgICAgICAgICBtVGFiID0gdGFiOworCisgICAgICAgICAgICAvLyBUT0RPIFN0eWxlIHRhYnMgYmFzZWQgb24gdGhlIHRoZW1lCisKKyAgICAgICAgICAgIGZpbmFsIERyYXdhYmxlIGljb24gPSB0YWIuZ2V0SWNvbigpOworICAgICAgICAgICAgZmluYWwgQ2hhclNlcXVlbmNlIHRleHQgPSB0YWIuZ2V0VGV4dCgpOworCisgICAgICAgICAgICBpZiAoaWNvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgSW1hZ2VWaWV3IGljb25WaWV3ID0gbmV3IEltYWdlVmlldyhjb250ZXh0KTsKKyAgICAgICAgICAgICAgICBpY29uVmlldy5zZXRJbWFnZURyYXdhYmxlKGljb24pOworICAgICAgICAgICAgICAgIExheW91dFBhcmFtcyBscCA9IG5ldyBMYXlvdXRQYXJhbXMoTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIExheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQpOworICAgICAgICAgICAgICAgIGxwLmdyYXZpdHkgPSBHcmF2aXR5LkNFTlRFUl9WRVJUSUNBTDsKKyAgICAgICAgICAgICAgICBpY29uVmlldy5zZXRMYXlvdXRQYXJhbXMobHApOworICAgICAgICAgICAgICAgIGFkZFZpZXcoaWNvblZpZXcpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAodGV4dCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgVGV4dFZpZXcgdGV4dFZpZXcgPSBuZXcgVGV4dFZpZXcoY29udGV4dCk7CisgICAgICAgICAgICAgICAgdGV4dFZpZXcuc2V0VGV4dCh0ZXh0KTsKKyAgICAgICAgICAgICAgICB0ZXh0Vmlldy5zZXRTaW5nbGVMaW5lKCk7CisgICAgICAgICAgICAgICAgdGV4dFZpZXcuc2V0RWxsaXBzaXplKFRydW5jYXRlQXQuRU5EKTsKKyAgICAgICAgICAgICAgICBMYXlvdXRQYXJhbXMgbHAgPSBuZXcgTGF5b3V0UGFyYW1zKExheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQsCisgICAgICAgICAgICAgICAgICAgICAgICBMYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UKTsKKyAgICAgICAgICAgICAgICBscC5ncmF2aXR5ID0gR3Jhdml0eS5DRU5URVJfVkVSVElDQUw7CisgICAgICAgICAgICAgICAgdGV4dFZpZXcuc2V0TGF5b3V0UGFyYW1zKGxwKTsKKyAgICAgICAgICAgICAgICBhZGRWaWV3KHRleHRWaWV3KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc2V0TGF5b3V0UGFyYW1zKG5ldyBMYXlvdXRQYXJhbXMoTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCwKKyAgICAgICAgICAgICAgICAgICAgTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCwgMSkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEFjdGlvbkJhci5UYWIgZ2V0VGFiKCkgeworICAgICAgICAgICAgcmV0dXJuIG1UYWI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIFRhYkNsaWNrTGlzdGVuZXIgaW1wbGVtZW50cyBPbkNsaWNrTGlzdGVuZXIgeworICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdmlldykgeworICAgICAgICAgICAgVGFiVmlldyB0YWJWaWV3ID0gKFRhYlZpZXcpIHZpZXc7CisgICAgICAgICAgICB0YWJWaWV3LmdldFRhYigpLnNlbGVjdCgpOworICAgICAgICAgICAgZmluYWwgaW50IHRhYkNvdW50ID0gbVRhYkxheW91dC5nZXRDaGlsZENvdW50KCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRhYkNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBWaWV3IGNoaWxkID0gbVRhYkxheW91dC5nZXRDaGlsZEF0KGkpOworICAgICAgICAgICAgICAgIGNoaWxkLnNldFNlbGVjdGVkKGNoaWxkID09IHZpZXcpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9DYXJvdXNlbFJTLmphdmEgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L0Nhcm91c2VsUlMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTg5NTMxCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9DYXJvdXNlbFJTLmphdmEKQEAgLTAsMCArMSwzNzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldDsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0Lio7CitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUmVuZGVyU2NyaXB0LlJTTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5TYW1wbGVyLlZhbHVlOworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0LlByb2dyYW1SYXN0ZXIuQ3VsbE1vZGU7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLlI7CisKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5yZW5kZXJzY3JpcHQuRWxlbWVudC4qOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnJlbmRlcnNjcmlwdC5TYW1wbGVyLlZhbHVlLkxJTkVBUjsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5yZW5kZXJzY3JpcHQuU2FtcGxlci5WYWx1ZS5XUkFQOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnJlbmRlcnNjcmlwdC5TYW1wbGVyLlZhbHVlLkNMQU1QOworCitwdWJsaWMgY2xhc3MgQ2Fyb3VzZWxSUyAgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX1ZJU0lCTEVfU0xPVFMgPSAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0NBUkRfQ09VTlQgPSAxOworICAgIAorICAgIC8vIENsaWVudCBtZXNzYWdlcyAqKiogVEhJUyBMSVNUIE1VU1QgTUFUQ0ggVEhPU0UgSU4gY2Fyb3VzZWwucnMgKioqCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ01EX0NBUkRfU0VMRUNURUQgPSAxMDA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ01EX1JFUVVFU1RfVEVYVFVSRSA9IDIwMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDTURfSU5WQUxJREFURV9URVhUVVJFID0gMjEwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENNRF9SRVFVRVNUX0dFT01FVFJZID0gMzAwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENNRF9JTlZBTElEQVRFX0dFT01FVFJZID0gMzEwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENNRF9BTklNQVRJT05fU1RBUlRFRCA9IDQwMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDTURfQU5JTUFUSU9OX0ZJTklTSEVEID0gNTAwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENNRF9QSU5HID0gNjAwOyAvLyBmb3IgZGVidWdnaW5nCisgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJDYXJvdXNlbFJTIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9TTE9UX0NPVU5UID0gMTA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBNSVBNQVAgPSBmYWxzZTsKKyAgICAKKyAgICBwcml2YXRlIFJlbmRlclNjcmlwdEdMIG1SUzsKKyAgICBwcml2YXRlIFJlc291cmNlcyBtUmVzOworICAgIHByaXZhdGUgU2NyaXB0Q19DYXJvdXNlbCBtU2NyaXB0OworICAgIHByaXZhdGUgU2NyaXB0RmllbGRfQ2FyZCBtQ2FyZHM7CisgICAgcHJpdmF0ZSBTYW1wbGVyIG1TYW1wbGVyOworICAgIHByaXZhdGUgUHJvZ3JhbVJhc3RlciBtUHJvZ3JhbVJhc3RlcjsKKyAgICBwcml2YXRlIFByb2dyYW1TdG9yZSBtUHJvZ3JhbVN0b3JlOworICAgIHByaXZhdGUgUHJvZ3JhbUZyYWdtZW50IG1GcmFnbWVudFByb2dyYW07CisgICAgcHJpdmF0ZSBQcm9ncmFtVmVydGV4IG1WZXJ0ZXhQcm9ncmFtOworICAgIHByaXZhdGUgUHJvZ3JhbVJhc3RlciBtUmFzdGVyUHJvZ3JhbTsKKyAgICBwcml2YXRlIENhcm91c2VsQ2FsbGJhY2sgbUNhbGxiYWNrOworICAgIHByaXZhdGUgZmxvYXRbXSBtRXllUG9pbnQgPSBuZXcgZmxvYXRbM107CisgICAgcHJpdmF0ZSBmbG9hdFtdIG1BdFBvaW50ID0gbmV3IGZsb2F0WzNdOworICAgIHByaXZhdGUgZmxvYXRbXSBtVXAgPSBuZXcgZmxvYXRbM107CisgICAgCisgICAgcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgQ2Fyb3VzZWxDYWxsYmFjayB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDYWxsZWQgd2hlbiBhIGNhcmQgaXMgc2VsZWN0ZWQKKyAgICAgICAgICogQHBhcmFtIG4gdGhlIGlkIG9mIHRoZSBjYXJkCisgICAgICAgICAqLworICAgICAgICB2b2lkIG9uQ2FyZFNlbGVjdGVkKGludCBuKTsKKyAgICAgICAgCisgICAgICAgIC8qKgorICAgICAgICAgKiBDYWxsZWQgd2hlbiB0ZXh0dXJlIGlzIG5lZWRlZCBmb3IgY2FyZCBuLiAgVGhpcyBoYXBwZW5zIHdoZW4gdGhlIGdpdmVuIGNhcmQgYmVjb21lcworICAgICAgICAgKiB2aXNpYmxlLgorICAgICAgICAgKiBAcGFyYW0gbiB0aGUgaWQgb2YgdGhlIGNhcmQKKyAgICAgICAgICovCisgICAgICAgIHZvaWQgb25SZXF1ZXN0VGV4dHVyZShpbnQgbik7CisgICAgICAgIAorICAgICAgICAvKioKKyAgICAgICAgICogQ2FsbGVkIHdoZW4gYSB0ZXh0dXJlIGlzIG5vIGxvbmdlciBuZWVkZWQgZm9yIGNhcmQgbi4gIFRoaXMgaGFwcGVucyB3aGVuIHRoZSBjYXJkCisgICAgICAgICAqIGdvZXMgb3V0IG9mIHZpZXcuCisgICAgICAgICAqIEBwYXJhbSBuIHRoZSBpZCBvZiB0aGUgY2FyZAorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBvbkludmFsaWRhdGVUZXh0dXJlKGludCBuKTsKKyAgICAgICAgCisgICAgICAgIC8qKgorICAgICAgICAgKiBDYWxsZWQgd2hlbiBnZW9tZXRyeSBpcyBuZWVkZWQgZm9yIGNhcmQgbi4KKyAgICAgICAgICogQHBhcmFtIG4gdGhlIGlkIG9mIHRoZSBjYXJkLgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBvblJlcXVlc3RHZW9tZXRyeShpbnQgbik7CisgICAgICAgIAorICAgICAgICAvKioKKyAgICAgICAgICogQ2FsbGVkIHdoZW4gZ2VvbWV0cnkgaXMgbm8gbG9uZ2VyIG5lZWRlZCBmb3IgY2FyZCBuLiBUaGlzIGhhcHBlbnMgd2hlbiB0aGUgY2FyZCBnb2VzIAorICAgICAgICAgKiBvdXQgb2Ygdmlldy4KKyAgICAgICAgICogQHBhcmFtIG4gdGhlIGlkIG9mIHRoZSBjYXJkCisgICAgICAgICAqLworICAgICAgICB2b2lkIG9uSW52YWxpZGF0ZUdlb21ldHJ5KGludCBuKTsKKyAgICAgICAgCisgICAgICAgIC8qKgorICAgICAgICAgKiBDYWxsZWQgd2hlbiBjYXJkIGFuaW1hdGlvbiAoZS5nLiBhIGZsaW5nKSBoYXMgc3RhcnRlZC4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgb25BbmltYXRpb25TdGFydGVkKCk7CisgICAgICAgIAorICAgICAgICAvKioKKyAgICAgICAgICogQ2FsbGVkIHdoZW4gY2FyZCBhbmltYXRpb24gaGFzIHN0b3BwZWQuCisgICAgICAgICAqLworICAgICAgICB2b2lkIG9uQW5pbWF0aW9uRmluaXNoZWQoKTsKKyAgICB9OworICAgIAorICAgIHByaXZhdGUgUlNNZXNzYWdlIG1Sc01lc3NhZ2UgPSBuZXcgUlNNZXNzYWdlKCkgeworICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICBpZiAobUNhbGxiYWNrID09IG51bGwpIHJldHVybjsKKyAgICAgICAgICAgIHN3aXRjaCAobUlEKSB7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfQ0FSRF9TRUxFQ1RFRDoKKyAgICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrLm9uQ2FyZFNlbGVjdGVkKG1EYXRhWzBdKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1JFUVVFU1RfVEVYVFVSRToKKyAgICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrLm9uUmVxdWVzdFRleHR1cmUobURhdGFbMF0pOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9JTlZBTElEQVRFX1RFWFRVUkU6CisgICAgICAgICAgICAgICAgICAgIG1DYWxsYmFjay5vbkludmFsaWRhdGVUZXh0dXJlKG1EYXRhWzBdKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1JFUVVFU1RfR0VPTUVUUlk6CisgICAgICAgICAgICAgICAgICAgIG1DYWxsYmFjay5vblJlcXVlc3RHZW9tZXRyeShtRGF0YVswXSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9JTlZBTElEQVRFX0dFT01FVFJZOgorICAgICAgICAgICAgICAgICAgICBtQ2FsbGJhY2sub25JbnZhbGlkYXRlR2VvbWV0cnkobURhdGFbMF0pOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgY2FzZSBDTURfQU5JTUFUSU9OX1NUQVJURUQ6CisgICAgICAgICAgICAgICAgICAgIG1DYWxsYmFjay5vbkFuaW1hdGlvblN0YXJ0ZWQoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGNhc2UgQ01EX0FOSU1BVElPTl9GSU5JU0hFRDoKKyAgICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrLm9uQW5pbWF0aW9uRmluaXNoZWQoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1BJTkc6CisgICAgICAgICAgICAgICAgICAgIExvZy52KFRBRywgIlBJTkcuLi4iKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIlVua25vd24gUlNNZXNzYWdlOiAiICsgbUlEKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH07CisgICAgCisgICAgcHVibGljIHZvaWQgaW5pdChSZW5kZXJTY3JpcHRHTCBycywgUmVzb3VyY2VzIHJlcykgeworICAgICAgICBtUlMgPSByczsKKyAgICAgICAgbVJlcyA9IHJlczsKKworICAgICAgICAvLyBjcmVhdGUgdGhlIHNjcmlwdCBvYmplY3QKKyAgICAgICAgbVNjcmlwdCA9IG5ldyBTY3JpcHRDX0Nhcm91c2VsKG1SUywgbVJlcywgUi5yYXcuY2Fyb3VzZWwsIHRydWUpOworICAgICAgICBtUlMubU1lc3NhZ2VDYWxsYmFjayA9IG1Sc01lc3NhZ2U7CisKKyAgICAgICAgaW5pdFByb2dyYW1TdG9yZSgpOworICAgICAgICBpbml0RnJhZ21lbnRQcm9ncmFtKCk7CisgICAgICAgIGluaXRSYXN0ZXJQcm9ncmFtKCk7CisgICAgICAgIGluaXRWZXJ0ZXhQcm9ncmFtKCk7CisgICAgICAgIAorICAgICAgICBzZXRTbG90Q291bnQoREVGQVVMVF9TTE9UX0NPVU5UKTsKKyAgICAgICAgc2V0VmlzaWJsZVNsb3RzKERFRkFVTFRfVklTSUJMRV9TTE9UUyk7CisgICAgICAgIGNyZWF0ZUNhcmRzKERFRkFVTFRfQ0FSRF9DT1VOVCk7CisgICAgICAgIAorICAgICAgICBzZXRTdGFydEFuZ2xlKDAuMGYpOworICAgICAgICBzZXRSYWRpdXMoMS4wZik7CisgICAgICAgIAorICAgICAgICAvLyB1cGRhdGUgdGhlIGNhbWVyYQorICAgICAgICBib29sZWFuIHBjYW0gPSB0cnVlOworICAgICAgICBpZiAocGNhbSkgeworICAgICAgICAgICAgZmxvYXQgZXllW10gPSB7IDIwLjY4MjlmLCAyLjc3MDgxZiwgMTYuNzMxNGYgfTsKKyAgICAgICAgICAgIGZsb2F0IGF0W10gPSB7IDE0LjcyNTVmLCAtMy40MDAwMWYsIC0xLjMwMTg0ZiB9OworICAgICAgICAgICAgZmxvYXQgdXBbXSA9IHsgMC4wZiwgMS4wZiwgMC4wZiB9OworICAgICAgICAgICAgc2V0TG9va0F0KGV5ZSwgYXQsIHVwKTsKKyAgICAgICAgICAgIHNldFJhZGl1cygyMC4wZik7CisgICAgICAgICAgICAvLyBGb3Y6IDI1CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtU2NyaXB0Lmludm9rZV9sb29rQXQoMi41ZiwgMi4wZiwgMi41ZiwgMC4wZiwgLTAuNzVmLCAwLjBmLCAgMC4wZiwgMS4wZiwgMC4wZik7CisgICAgICAgICAgICBtU2NyaXB0LnNldF9jYXJkUm90YXRpb24oMC4wZik7CisgICAgICAgICAgICBzZXRSYWRpdXMoMS41Zik7CisgICAgICAgIH0KKworICAgICAgICByZXN1bWVSZW5kZXJpbmcoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRMb29rQXQoZmxvYXRbXSBleWUsIGZsb2F0W10gYXQsIGZsb2F0W10gdXApIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICAgICAgICAgIG1FeWVQb2ludFtpXSA9IGV5ZVtpXTsKKyAgICAgICAgICAgIG1BdFBvaW50W2ldID0gYXRbaV07CisgICAgICAgICAgICBtVXBbaV0gPSB1cFtpXTsKKyAgICAgICAgfQorICAgICAgICBtU2NyaXB0Lmludm9rZV9sb29rQXQoZXllWzBdLCBleWVbMV0sIGV5ZVsyXSwgYXRbMF0sIGF0WzFdLCBhdFsyXSwgdXBbMF0sIHVwWzFdLCB1cFsyXSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UmFkaXVzKGZsb2F0IHJhZGl1cykgeworICAgICAgICBtU2NyaXB0LnNldF9yYWRpdXMocmFkaXVzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5pdFZlcnRleFByb2dyYW0oKSB7CisgICAgICAgIFByb2dyYW1WZXJ0ZXguQnVpbGRlciBwdmIgPSBuZXcgUHJvZ3JhbVZlcnRleC5CdWlsZGVyKG1SUywgbnVsbCwgbnVsbCk7CisgICAgICAgIG1WZXJ0ZXhQcm9ncmFtID0gcHZiLmNyZWF0ZSgpOworICAgICAgICBQcm9ncmFtVmVydGV4Lk1hdHJpeEFsbG9jYXRpb24gcHZhID0gbmV3IFByb2dyYW1WZXJ0ZXguTWF0cml4QWxsb2NhdGlvbihtUlMpOworICAgICAgICBtVmVydGV4UHJvZ3JhbS5iaW5kQWxsb2NhdGlvbihwdmEpOworICAgICAgICBwdmEuc2V0dXBQcm9qZWN0aW9uTm9ybWFsaXplZCgxLCAxKTsKKyAgICAgICAgbVNjcmlwdC5zZXRfdmVydGV4UHJvZ3JhbShtVmVydGV4UHJvZ3JhbSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGluaXRSYXN0ZXJQcm9ncmFtKCkgeworICAgICAgICBQcm9ncmFtUmFzdGVyLkJ1aWxkZXIgcHJvZ3JhbVJhc3RlckJ1aWxkZXIgPSBuZXcgUHJvZ3JhbVJhc3Rlci5CdWlsZGVyKG1SUyk7CisgICAgICAgIG1SYXN0ZXJQcm9ncmFtID0gcHJvZ3JhbVJhc3RlckJ1aWxkZXIuY3JlYXRlKCk7CisgICAgICAgIC8vbVJhc3RlclByb2dyYW0uc2V0Q3VsbE1vZGUoQ3VsbE1vZGUuTk9ORSk7CisgICAgICAgIG1TY3JpcHQuc2V0X3Jhc3RlclByb2dyYW0obVJhc3RlclByb2dyYW0pOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbml0RnJhZ21lbnRQcm9ncmFtKCkgeworICAgICAgICBTYW1wbGVyLkJ1aWxkZXIgc2FtcGxlQnVpbGRlciA9IG5ldyBTYW1wbGVyLkJ1aWxkZXIobVJTKTsKKyAgICAgICAgc2FtcGxlQnVpbGRlci5zZXRNaW4oVmFsdWUuTElORUFSX01JUF9MSU5FQVIpOworICAgICAgICBzYW1wbGVCdWlsZGVyLnNldE1hZyhMSU5FQVIpOworICAgICAgICBzYW1wbGVCdWlsZGVyLnNldFdyYXBTKENMQU1QKTsKKyAgICAgICAgc2FtcGxlQnVpbGRlci5zZXRXcmFwVChDTEFNUCk7CisgICAgICAgIG1TYW1wbGVyID0gc2FtcGxlQnVpbGRlci5jcmVhdGUoKTsKKyAgICAgICAgUHJvZ3JhbUZyYWdtZW50LkJ1aWxkZXIgZnJhZ21lbnRCdWlsZGVyID0gbmV3IFByb2dyYW1GcmFnbWVudC5CdWlsZGVyKG1SUyk7CisgICAgICAgIGZyYWdtZW50QnVpbGRlci5zZXRUZXh0dXJlKFByb2dyYW1GcmFnbWVudC5CdWlsZGVyLkVudk1vZGUuREVDQUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9ncmFtRnJhZ21lbnQuQnVpbGRlci5Gb3JtYXQuUkdCQSwgMCk7CisgICAgICAgIG1GcmFnbWVudFByb2dyYW0gPSBmcmFnbWVudEJ1aWxkZXIuY3JlYXRlKCk7CisgICAgICAgIG1GcmFnbWVudFByb2dyYW0uYmluZFNhbXBsZXIobVNhbXBsZXIsIDApOworICAgICAgICBtU2NyaXB0LnNldF9mcmFnbWVudFByb2dyYW0obUZyYWdtZW50UHJvZ3JhbSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGluaXRQcm9ncmFtU3RvcmUoKSB7CisgICAgICAgIFByb2dyYW1TdG9yZS5CdWlsZGVyIHByb2dyYW1TdG9yZUJ1aWxkZXIgPSBuZXcgUHJvZ3JhbVN0b3JlLkJ1aWxkZXIobVJTLCBudWxsLCBudWxsKTsKKyAgICAgICAgcHJvZ3JhbVN0b3JlQnVpbGRlci5zZXREZXB0aEZ1bmMoUHJvZ3JhbVN0b3JlLkRlcHRoRnVuYy5MRVNTKTsKKyAgICAgICAgcHJvZ3JhbVN0b3JlQnVpbGRlci5zZXRCbGVuZEZ1bmMoUHJvZ3JhbVN0b3JlLkJsZW5kU3JjRnVuYy5TUkNfQUxQSEEsIAorICAgICAgICAgICAgICAgIFByb2dyYW1TdG9yZS5CbGVuZERzdEZ1bmMuT05FX01JTlVTX1NSQ19BTFBIQSk7CisgICAgICAgIHByb2dyYW1TdG9yZUJ1aWxkZXIuc2V0RGl0aGVyRW5hYmxlKGZhbHNlKTsKKyAgICAgICAgcHJvZ3JhbVN0b3JlQnVpbGRlci5zZXREZXB0aE1hc2sodHJ1ZSk7CisgICAgICAgIG1Qcm9ncmFtU3RvcmUgPSBwcm9ncmFtU3RvcmVCdWlsZGVyLmNyZWF0ZSgpOworICAgICAgICBtU2NyaXB0LnNldF9wcm9ncmFtU3RvcmUobVByb2dyYW1TdG9yZSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIGNyZWF0ZUNhcmRzKGludCBjb3VudCkKKyAgICB7CisgICAgICAgIG1DYXJkcyA9IGNvdW50ID4gMCA/IG5ldyBTY3JpcHRGaWVsZF9DYXJkKG1SUywgY291bnQpIDogbnVsbDsKKyAgICAgICAgbVNjcmlwdC5iaW5kX2NhcmRzKG1DYXJkcyk7CisgICAgICAgIG1TY3JpcHQuaW52b2tlX2NyZWF0ZUNhcmRzKGNvdW50KTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgc2V0VmlzaWJsZVNsb3RzKGludCBjb3VudCkKKyAgICB7CisgICAgICAgIG1TY3JpcHQuc2V0X3Zpc2libGVTbG90Q291bnQoY291bnQpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0Qml0bWFwKEJpdG1hcCBiaXRtYXApCisgICAgeworICAgICAgICBtU2NyaXB0LnNldF9kZWZhdWx0VGV4dHVyZShhbGxvY2F0aW9uRnJvbUJpdG1hcChiaXRtYXAsIE1JUE1BUCkpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXRMb2FkaW5nQml0bWFwKEJpdG1hcCBiaXRtYXApCisgICAgeworICAgICAgICBtU2NyaXB0LnNldF9sb2FkaW5nVGV4dHVyZShhbGxvY2F0aW9uRnJvbUJpdG1hcChiaXRtYXAsIE1JUE1BUCkpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0R2VvbWV0cnkoTWVzaCBtZXNoKQorICAgIHsKKyAgICAgICAgbVNjcmlwdC5zZXRfZGVmYXVsdEdlb21ldHJ5KG1lc2gpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXRMb2FkaW5nR2VvbWV0cnkoTWVzaCBtZXNoKQorICAgIHsKKyAgICAgICAgbVNjcmlwdC5zZXRfbG9hZGluZ0dlb21ldHJ5KG1lc2gpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXRTdGFydEFuZ2xlKGZsb2F0IHRoZXRhKQorICAgIHsKKyAgICAgICAgbVNjcmlwdC5zZXRfc3RhcnRBbmdsZSh0aGV0YSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHNldENhbGxiYWNrKENhcm91c2VsQ2FsbGJhY2sgY2FsbGJhY2spCisgICAgeworICAgICAgICBtQ2FsbGJhY2sgPSBjYWxsYmFjazsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBBbGxvY2F0aW9uIGFsbG9jYXRpb25Gcm9tQml0bWFwKEJpdG1hcCBiaXRtYXAsIGJvb2xlYW4gbWlwbWFwKQorICAgIHsKKyAgICAgICAgaWYgKGJpdG1hcCA9PSBudWxsKSByZXR1cm4gbnVsbDsKKyAgICAgICAgQWxsb2NhdGlvbiBhbGxvY2F0aW9uID0gQWxsb2NhdGlvbi5jcmVhdGVGcm9tQml0bWFwKG1SUywgYml0bWFwLCBSR0JfNTY1KG1SUyksIG1pcG1hcCk7CisgICAgICAgIGFsbG9jYXRpb24udXBsb2FkVG9UZXh0dXJlKDApOworICAgICAgICByZXR1cm4gYWxsb2NhdGlvbjsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgc2V0VGV4dHVyZShpbnQgbiwgQml0bWFwIGJpdG1hcCkKKyAgICB7CisgICAgICAgIFNjcmlwdEZpZWxkX0NhcmQuSXRlbSBpdGVtID0gbUNhcmRzLmdldChuKTsKKyAgICAgICAgaWYgKGl0ZW0gPT0gbnVsbCkgeworICAgICAgICAgICAgTG9nLnYoVEFHLCAic2V0VGV4dHVyZSgpOiBubyBpdGVtIGF0IGluZGV4ICIgKyBuKTsKKyAgICAgICAgICAgIGl0ZW0gPSBuZXcgU2NyaXB0RmllbGRfQ2FyZC5JdGVtKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJpdG1hcCAhPSBudWxsKSB7CisgICAgICAgICAgICBMb2cudihUQUcsICJjcmVhdGluZyBuZXcgYml0bWFwIik7CisgICAgICAgICAgICBpdGVtLnRleHR1cmUgPSBBbGxvY2F0aW9uLmNyZWF0ZUZyb21CaXRtYXAobVJTLCBiaXRtYXAsIFJHQl81NjUobVJTKSwgTUlQTUFQKTsKKyAgICAgICAgICAgIExvZy52KFRBRywgInVwbG9hZFRvVGV4dHVyZSgiICsgbiArICIpIik7CisgICAgICAgICAgICBpdGVtLnRleHR1cmUudXBsb2FkVG9UZXh0dXJlKDApOworICAgICAgICAgICAgTG9nLnYoVEFHLCAiZG9uZS4uLiIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGl0ZW0udGV4dHVyZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAidW5sb2FkaW5nIHRleHR1cmUgIiArIG4pOworICAgICAgICAgICAgICAgIC8vIERvbid0IHdhaXQgZm9yIEdDIHRvIGZyZWUgbmF0aXZlIG1lbW9yeS4KKyAgICAgICAgICAgICAgICAvLyBPbmx5IHdvcmtzIGlmIHRleHR1cmVzIGFyZSBub3Qgc2hhcmVkLgorICAgICAgICAgICAgICAgIGl0ZW0udGV4dHVyZS5kZXN0cm95KCk7IAorICAgICAgICAgICAgICAgIGl0ZW0udGV4dHVyZSA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbUNhcmRzLnNldChpdGVtLCBuLCBmYWxzZSk7IC8vIFRoaXMgaXMgcHJpbWFyaWx5IHVzZWQgZm9yIHJlZmVyZW5jZSBjb3VudGluZy4KKyAgICAgICAgbVNjcmlwdC5pbnZva2Vfc2V0VGV4dHVyZShuLCBpdGVtLnRleHR1cmUpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXRHZW9tZXRyeShpbnQgbiwgTWVzaCBnZW9tZXRyeSkKKyAgICB7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gbWlwbWFwID0gZmFsc2U7CisgICAgICAgIFNjcmlwdEZpZWxkX0NhcmQuSXRlbSBpdGVtID0gbUNhcmRzLmdldChuKTsKKyAgICAgICAgaWYgKGl0ZW0gPT0gbnVsbCkgeworICAgICAgICAgICAgTG9nLnYoVEFHLCAic2V0R2VvbWV0cnkoKTogbm8gaXRlbSBhdCBpbmRleCAiICsgbik7CisgICAgICAgICAgICBpdGVtID0gbmV3IFNjcmlwdEZpZWxkX0NhcmQuSXRlbSgpOworICAgICAgICB9CisgICAgICAgIGlmIChnZW9tZXRyeSAhPSBudWxsKSB7CisgICAgICAgICAgICBpdGVtLmdlb21ldHJ5ID0gZ2VvbWV0cnk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMb2cudihUQUcsICJ1bmxvYWRpbmcgZ2VvbWV0cnkgIiArIG4pOworICAgICAgICAgICAgaWYgKGl0ZW0uZ2VvbWV0cnkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vIGl0ZW0uZ2VvbWV0cnkuZGVzdHJveSgpOyAKKyAgICAgICAgICAgICAgICBpdGVtLmdlb21ldHJ5ID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtQ2FyZHMuc2V0KGl0ZW0sIG4sIGZhbHNlKTsKKyAgICAgICAgbVNjcmlwdC5pbnZva2Vfc2V0R2VvbWV0cnkobiwgaXRlbS5nZW9tZXRyeSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcGF1c2VSZW5kZXJpbmcoKSB7CisgICAgICAgIC8vIFVzZWQgdG8gdXBkYXRlIG11bHRpcGxlIHN0YXRlcyBhdCBvbmNlIHcvbyByZWRyYXdpbmcgZm9yIGVhY2guCisgICAgICAgIG1SUy5jb250ZXh0QmluZFJvb3RTY3JpcHQobnVsbCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHJlc3VtZVJlbmRlcmluZygpIHsKKyAgICAgICAgbVJTLmNvbnRleHRCaW5kUm9vdFNjcmlwdChtU2NyaXB0KTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgZG9Nb3Rpb24oZmxvYXQgeCwgZmxvYXQgeSkgeworICAgICAgICBtU2NyaXB0Lmludm9rZV9kb01vdGlvbih4LHkpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBkb1NlbGVjdGlvbihmbG9hdCB4LCBmbG9hdCB5KSB7CisgICAgICAgIG1TY3JpcHQuaW52b2tlX2RvU2VsZWN0aW9uKHgsIHkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGRvU3RhcnQoZmxvYXQgeCwgZmxvYXQgeSkgeworICAgICAgICBtU2NyaXB0Lmludm9rZV9kb1N0YXJ0KHgsIHkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGRvU3RvcChmbG9hdCB4LCBmbG9hdCB5KSB7CisgICAgICAgIG1TY3JpcHQuaW52b2tlX2RvU3RvcCh4LCB5KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTbG90Q291bnQoaW50IG4pIHsKKyAgICAgICAgbVNjcmlwdC5zZXRfc2xvdENvdW50KG4pOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvQ2Fyb3VzZWxWaWV3LmphdmEgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L0Nhcm91c2VsVmlldy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwYzY1ZGMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L0Nhcm91c2VsVmlldy5qYXZhCkBAIC0wLDAgKzEsMjQ0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQ7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuQ2Fyb3VzZWxSUy5DYXJvdXNlbENhbGxiYWNrOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXAuQ29uZmlnOworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0LkZpbGVBM0Q7CitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuTWVzaDsKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5SU1N1cmZhY2VWaWV3OworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0LlJlbmRlclNjcmlwdEdMOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OworaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlSG9sZGVyOworCitwdWJsaWMgY2xhc3MgQ2Fyb3VzZWxWaWV3IGV4dGVuZHMgUlNTdXJmYWNlVmlldyB7CisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgREVGQVVMVF9TTE9UX0NPVU5UID0gMTA7CisgICAgcHJpdmF0ZSBmaW5hbCBCaXRtYXAgREVGQVVMVF9CSVRNQVAgPSBCaXRtYXAuY3JlYXRlQml0bWFwKDEsIDEsIENvbmZpZy5SR0JfNTY1KTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkNhcm91c2VsVmlldyI7CisgICAgcHJpdmF0ZSBDYXJvdXNlbFJTIG1SZW5kZXJTY3JpcHQ7CisgICAgcHJpdmF0ZSBSZW5kZXJTY3JpcHRHTCBtUlM7CisgICAgcHJpdmF0ZSBDb250ZXh0IG1Db250ZXh0OworICAgIHByaXZhdGUgYm9vbGVhbiBtVHJhY2tpbmc7CisgICAgcHJpdmF0ZSBCaXRtYXAgbURlZmF1bHRCaXRtYXA7CisgICAgcHJpdmF0ZSBCaXRtYXAgbUxvYWRpbmdCaXRtYXA7CisgICAgcHJpdmF0ZSBNZXNoIG1EZWZhdWx0R2VvbWV0cnk7CisgICAgcHJpdmF0ZSBNZXNoIG1Mb2FkaW5nR2VvbWV0cnk7CisgICAgcHJpdmF0ZSBpbnQgbUNhcmRDb3VudCA9IDA7CisgICAgcHJpdmF0ZSBpbnQgbVZpc2libGVTbG90cyA9IDA7CisgICAgcHJpdmF0ZSBmbG9hdCBtU3RhcnRBbmdsZTsKKyAgICBwcml2YXRlIGludCBtU2xvdENvdW50ID0gREVGQVVMVF9TTE9UX0NPVU5UOworICAgIAorICAgIHB1YmxpYyBDYXJvdXNlbFZpZXcoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQpOworICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CisgICAgICAgIGJvb2xlYW4gdXNlRGVwdGhCdWZmZXIgPSB0cnVlOworICAgICAgICBtUlMgPSBjcmVhdGVSZW5kZXJTY3JpcHQodXNlRGVwdGhCdWZmZXIpOworICAgICAgICBtUmVuZGVyU2NyaXB0ID0gbmV3IENhcm91c2VsUlMoKTsKKyAgICAgICAgbVJlbmRlclNjcmlwdC5pbml0KG1SUywgZ2V0UmVzb3VyY2VzKCkpOworICAgIH0KKyAgICAKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzdXJmYWNlQ2hhbmdlZChTdXJmYWNlSG9sZGVyIGhvbGRlciwgaW50IGZvcm1hdCwgaW50IHcsIGludCBoKSB7CisgICAgICAgIHN1cGVyLnN1cmZhY2VDaGFuZ2VkKGhvbGRlciwgZm9ybWF0LCB3LCBoKTsKKyAgICAgICAgbVJTLmNvbnRleHRTZXRTdXJmYWNlKHcsIGgsIGhvbGRlci5nZXRTdXJmYWNlKCkpOworICAgICAgICBtUmVuZGVyU2NyaXB0LmluaXQobVJTLCBnZXRSZXNvdXJjZXMoKSk7CisgICAgICAgIHNldFNsb3RDb3VudChtU2xvdENvdW50KTsKKyAgICAgICAgY3JlYXRlQ2FyZHMobUNhcmRDb3VudCk7CisgICAgICAgIHNldFZpc2libGVTbG90cyhtVmlzaWJsZVNsb3RzKTsKKyAgICAgICAgc2V0Q2FsbGJhY2sobUNhcm91c2VsQ2FsbGJhY2spOworICAgICAgICBzZXREZWZhdWx0Qml0bWFwKG1EZWZhdWx0Qml0bWFwKTsKKyAgICAgICAgc2V0TG9hZGluZ0JpdG1hcChtTG9hZGluZ0JpdG1hcCk7CisgICAgICAgIHNldERlZmF1bHRHZW9tZXRyeShtRGVmYXVsdEdlb21ldHJ5KTsKKyAgICAgICAgc2V0TG9hZGluZ0dlb21ldHJ5KG1Mb2FkaW5nR2VvbWV0cnkpOworICAgICAgICBzZXRTdGFydEFuZ2xlKG1TdGFydEFuZ2xlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMb2FkcyBnZW9tZXRyeSBmcm9tIGEgcmVzb3VyY2UgaWQuCisgICAgICogCisgICAgICogQHBhcmFtIHJlc0lkCisgICAgICogQHJldHVybiB0aGUgbG9hZGVkIG1lc2ggb3IgbnVsbCBpZiBpdCBjYW5ub3QgYmUgbG9hZGVkCisgICAgICovCisgICAgcHVibGljIE1lc2ggbG9hZEdlb21ldHJ5KGludCByZXNJZCkgeworICAgICAgICBSZXNvdXJjZXMgcmVzID0gbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCk7CisgICAgICAgIEZpbGVBM0QgbW9kZWwgPSBGaWxlQTNELmNyZWF0ZUZyb21SZXNvdXJjZShtUlMsIHJlcywgcmVzSWQpOworICAgICAgICBGaWxlQTNELkluZGV4RW50cnkgZW50cnkgPSBtb2RlbC5nZXRJbmRleEVudHJ5KDApOworICAgICAgICBpZihlbnRyeSA9PSBudWxsIHx8IGVudHJ5LmdldENsYXNzSUQoKSAhPSBGaWxlQTNELkNsYXNzSUQuTUVTSCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChNZXNoKSBlbnRyeS5nZXRPYmplY3QoKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogTG9hZCBBM0QgZmlsZSBmcm9tIHJlc291cmNlLiAgSWYgcmVzSWQgPT0gMCwgd2lsbCBjbGVhciBnZW9tZXRyeSBmb3IgdGhpcyBpdGVtLgorICAgICAqIEBwYXJhbSBuCisgICAgICogQHBhcmFtIHJlc0lkCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0R2VvbWV0cnlGb3JJdGVtKGludCBuLCBNZXNoIG1lc2gpIHsKKyAgICAgICAgbVJlbmRlclNjcmlwdC5zZXRHZW9tZXRyeShuLCBtZXNoKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgc2V0U2xvdENvdW50KGludCBuKSB7CisgICAgICAgIG1TbG90Q291bnQgPSBuOworICAgICAgICBpZiAobVJlbmRlclNjcmlwdCAhPSBudWxsKSB7CisgICAgICAgICAgICBtUmVuZGVyU2NyaXB0LnNldFNsb3RDb3VudChuKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFZpc2libGVTbG90cyhpbnQgbikgeworICAgICAgICBtVmlzaWJsZVNsb3RzID0gbjsKKyAgICAgICAgaWYgKG1SZW5kZXJTY3JpcHQgIT0gbnVsbCkgeworICAgICAgICAgICAgbVJlbmRlclNjcmlwdC5zZXRWaXNpYmxlU2xvdHMobik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjcmVhdGVDYXJkcyhpbnQgbikgeworICAgICAgICBtQ2FyZENvdW50ID0gbjsKKyAgICAgICAgaWYgKG1SZW5kZXJTY3JpcHQgIT0gbnVsbCkgeworICAgICAgICAgICAgbVJlbmRlclNjcmlwdC5jcmVhdGVDYXJkcyhuKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXRUZXh0dXJlRm9ySXRlbShpbnQgbiwgQml0bWFwIGJpdG1hcCkgeworICAgICAgICBpZiAobVJlbmRlclNjcmlwdCAhPSBudWxsKSB7CisgICAgICAgICAgICBMb2cudihUQUcsICJzZXRUZXh0dXJlRm9ySXRlbSgiICsgbiArICIpIik7CisgICAgICAgICAgICBtUmVuZGVyU2NyaXB0LnNldFRleHR1cmUobiwgYml0bWFwKTsgCisgICAgICAgICAgICBMb2cudihUQUcsICJkb25lIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0Qml0bWFwKEJpdG1hcCBiaXRtYXApIHsKKyAgICAgICAgbURlZmF1bHRCaXRtYXAgPSBiaXRtYXA7IAorICAgICAgICBpZiAobVJlbmRlclNjcmlwdCAhPSBudWxsKSB7CisgICAgICAgICAgICBtUmVuZGVyU2NyaXB0LnNldERlZmF1bHRCaXRtYXAoYml0bWFwKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXRMb2FkaW5nQml0bWFwKEJpdG1hcCBiaXRtYXApIHsKKyAgICAgICAgbUxvYWRpbmdCaXRtYXAgPSBiaXRtYXA7CisgICAgICAgIGlmIChtUmVuZGVyU2NyaXB0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1SZW5kZXJTY3JpcHQuc2V0TG9hZGluZ0JpdG1hcChiaXRtYXApOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHNldERlZmF1bHRHZW9tZXRyeShNZXNoIG1lc2gpIHsKKyAgICAgICAgbURlZmF1bHRHZW9tZXRyeSA9IG1lc2g7CisgICAgICAgIGlmIChtUmVuZGVyU2NyaXB0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1SZW5kZXJTY3JpcHQuc2V0RGVmYXVsdEdlb21ldHJ5KG1lc2gpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHNldExvYWRpbmdHZW9tZXRyeShNZXNoIG1lc2gpIHsKKyAgICAgICAgbUxvYWRpbmdHZW9tZXRyeSA9IG1lc2g7CisgICAgICAgIGlmIChtUmVuZGVyU2NyaXB0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1SZW5kZXJTY3JpcHQuc2V0TG9hZGluZ0dlb21ldHJ5KG1lc2gpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHNldENhbGxiYWNrKENhcm91c2VsQ2FsbGJhY2sgY2FsbGJhY2spCisgICAgeworICAgICAgICBtQ2Fyb3VzZWxDYWxsYmFjayA9IGNhbGxiYWNrOworICAgICAgICBpZiAobVJlbmRlclNjcmlwdCAhPSBudWxsKSB7CisgICAgICAgICAgICBtUmVuZGVyU2NyaXB0LnNldENhbGxiYWNrKGNhbGxiYWNrKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFN0YXJ0QW5nbGUoZmxvYXQgYW5nbGUpCisgICAgeworICAgICAgICBtU3RhcnRBbmdsZSA9IGFuZ2xlOworICAgICAgICBpZiAobVJlbmRlclNjcmlwdCAhPSBudWxsKSB7CisgICAgICAgICAgICBtUmVuZGVyU2NyaXB0LnNldFN0YXJ0QW5nbGUoYW5nbGUpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uRGV0YWNoZWRGcm9tV2luZG93KCkgeworICAgICAgICBpZihtUlMgIT0gbnVsbCkgeworICAgICAgICAgICAgbVJTID0gbnVsbDsKKyAgICAgICAgICAgIGRlc3Ryb3lSZW5kZXJTY3JpcHQoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBvblRvdWNoRXZlbnQoTW90aW9uRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgZmluYWwgaW50IGFjdGlvbiA9IGV2ZW50LmdldEFjdGlvbigpOworICAgICAgICBmaW5hbCBmbG9hdCB4ID0gZXZlbnQuZ2V0WCgpOworICAgICAgICBmaW5hbCBmbG9hdCB5ID0gZXZlbnQuZ2V0WSgpOworICAgICAgICAKKyAgICAgICAgaWYgKG1SZW5kZXJTY3JpcHQgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2ggKGFjdGlvbikgeworICAgICAgICAgICAgY2FzZSBNb3Rpb25FdmVudC5BQ1RJT05fRE9XTjoKKyAgICAgICAgICAgICAgICBtVHJhY2tpbmcgPSB0cnVlOworICAgICAgICAgICAgICAgIG1SZW5kZXJTY3JpcHQuZG9TdGFydCh4LCB5KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX01PVkU6CisgICAgICAgICAgICAgICAgaWYgKG1UcmFja2luZykgeworICAgICAgICAgICAgICAgICAgICBtUmVuZGVyU2NyaXB0LmRvTW90aW9uKHgsIHkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX1VQOgorICAgICAgICAgICAgICAgIG1SZW5kZXJTY3JpcHQuZG9TdG9wKHgsIHkpOworICAgICAgICAgICAgICAgIG1UcmFja2luZyA9IGZhbHNlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgZmluYWwgQ2Fyb3VzZWxDYWxsYmFjayBERUJVR19DQUxMQkFDSyA9IG5ldyBDYXJvdXNlbENhbGxiYWNrKCkgeworICAgICAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvblN0YXJ0ZWQoKSB7CisgICAgICAgICAgICBMb2cudihUQUcsICJvbkFuaW1hdGlvblN0YXJ0ZWQoKSIpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvbkZpbmlzaGVkKCkgeworICAgICAgICAgICAgTG9nLnYoVEFHLCAib25BbmltYXRpb25GaW5pc2hlZCgpIik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBvbkNhcmRTZWxlY3RlZChpbnQgbikgeworICAgICAgICAgICAgTG9nLnYoVEFHLCAib25DYXJkU2VsZWN0ZWQoIiArIG4gKyAiKSIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgb25SZXF1ZXN0R2VvbWV0cnkoaW50IG4pIHsKKyAgICAgICAgICAgIExvZy52KFRBRywgIm9uUmVxdWVzdEdlb21ldHJ5KCIgKyBuICsgIikiKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG9uSW52YWxpZGF0ZUdlb21ldHJ5KGludCBuKSB7CisgICAgICAgICAgICBMb2cudihUQUcsICJvbkludmFsaWRhdGVHZW9tZXRyeSgiICsgbiArICIpIik7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVxdWVzdFRleHR1cmUoZmluYWwgaW50IG4pIHsKKyAgICAgICAgICAgIExvZy52KFRBRywgIm9uUmVxdWVzdFRleHR1cmUoIiArIG4gKyAiKSIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgb25JbnZhbGlkYXRlVGV4dHVyZShpbnQgbikgeworICAgICAgICAgICAgTG9nLnYoVEFHLCAib25JbnZhbGlkYXRlVGV4dHVyZSgiICsgbiArICIpIik7CisgICAgICAgIH0KKworICAgIH07CisgICAgCisgICAgcHJpdmF0ZSBDYXJvdXNlbENhbGxiYWNrIG1DYXJvdXNlbENhbGxiYWNrID0gREVCVUdfQ0FMTEJBQ0s7Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L0NvbnRhY3RIZWFkZXJXaWRnZXQuamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvQ29udGFjdEhlYWRlcldpZGdldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDIxNDY2Li4wMDAwMDAwCi0tLSBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvQ29udGFjdEhlYWRlcldpZGdldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldDsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLlI7Ci0KLWltcG9ydCBhbmRyb2lkLk1hbmlmZXN0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Bc3luY1F1ZXJ5SGFuZGxlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VXJpczsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlczsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyLk5hbWVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlcy5Ob3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcjsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcEZhY3Rvcnk7Ci1pbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwotaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbnRhY3RzOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5EYXRhOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5QaG9uZUxvb2t1cDsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuUmF3Q29udGFjdHM7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LlN0YXR1c1VwZGF0ZXM7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5FbWFpbDsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLlBob3RvOwotaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LmZvcm1hdC5EYXRlVXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5DaGVja0JveDsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5RdWlja0NvbnRhY3RCYWRnZTsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5GcmFtZUxheW91dDsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXc7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7Ci0KLS8qKgotICogSGVhZGVyIHVzZWQgYWNyb3NzIHN5c3RlbSBmb3IgZGlzcGxheWluZyBhIHRpdGxlIGJhciB3aXRoIGNvbnRhY3QgaW5mby4gWW91Ci0gKiBjYW4gYmluZCBzcGVjaWZpYyB2YWx1ZXMgb24gdGhlIGhlYWRlciwgb3IgdXNlIGhlbHBlciBtZXRob2RzIGxpa2UKLSAqIHtAbGluayAjYmluZEZyb21Db250YWN0SWQobG9uZyl9IHRvIHBvcHVsYXRlIGFzeW5jaHJvbm91c2x5LgotICogPHA+Ci0gKiBUaGUgcGFyZW50IG11c3QgcmVxdWVzdCB0aGUge0BsaW5rIE1hbmlmZXN0LnBlcm1pc3Npb24jUkVBRF9DT05UQUNUU30KLSAqIHBlcm1pc3Npb24gdG8gYWNjZXNzIGNvbnRhY3QgZGF0YS4KLSAqLwotcHVibGljIGNsYXNzIENvbnRhY3RIZWFkZXJXaWRnZXQgZXh0ZW5kcyBGcmFtZUxheW91dCBpbXBsZW1lbnRzIFZpZXcuT25DbGlja0xpc3RlbmVyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiQ29udGFjdEhlYWRlcldpZGdldCI7Ci0KLSAgICBwcml2YXRlIFRleHRWaWV3IG1EaXNwbGF5TmFtZVZpZXc7Ci0gICAgcHJpdmF0ZSBWaWV3IG1BZ2dyZWdhdGVCYWRnZTsKLSAgICBwcml2YXRlIFRleHRWaWV3IG1QaG9uZXRpY05hbWVWaWV3OwotICAgIHByaXZhdGUgQ2hlY2tCb3ggbVN0YXJyZWRWaWV3OwotICAgIHByaXZhdGUgUXVpY2tDb250YWN0QmFkZ2UgbVBob3RvVmlldzsKLSAgICBwcml2YXRlIEltYWdlVmlldyBtUHJlc2VuY2VWaWV3OwotICAgIHByaXZhdGUgVGV4dFZpZXcgbVN0YXR1c1ZpZXc7Ci0gICAgcHJpdmF0ZSBUZXh0VmlldyBtU3RhdHVzQXR0cmlidXRpb25WaWV3OwotICAgIHByaXZhdGUgaW50IG1Ob1Bob3RvUmVzb3VyY2U7Ci0gICAgcHJpdmF0ZSBRdWVyeUhhbmRsZXIgbVF1ZXJ5SGFuZGxlcjsKLQotICAgIHByb3RlY3RlZCBVcmkgbUNvbnRhY3RVcmk7Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nW10gbUV4Y2x1ZGVNaW1lcyA9IG51bGw7Ci0KLSAgICBwcm90ZWN0ZWQgQ29udGVudFJlc29sdmVyIG1Db250ZW50UmVzb2x2ZXI7Ci0KLSAgICAvKioKLSAgICAgKiBJbnRlcmZhY2UgZm9yIGNhbGxiYWNrcyBpbnZva2VkIHdoZW4gdGhlIHVzZXIgaW50ZXJhY3RzIHdpdGggYSBoZWFkZXIuCi0gICAgICovCi0gICAgcHVibGljIGludGVyZmFjZSBDb250YWN0SGVhZGVyTGlzdGVuZXIgewotICAgICAgICBwdWJsaWMgdm9pZCBvblBob3RvQ2xpY2soVmlldyB2aWV3KTsKLSAgICAgICAgcHVibGljIHZvaWQgb25EaXNwbGF5TmFtZUNsaWNrKFZpZXcgdmlldyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBDb250YWN0SGVhZGVyTGlzdGVuZXIgbUxpc3RlbmVyOwotCi0KLSAgICBwcml2YXRlIGludGVyZmFjZSBDb250YWN0UXVlcnkgewotICAgICAgICAvL1Byb2plY3Rpb24gdXNlZCBmb3IgdGhlIHN1bW1hcnkgaW5mbyBpbiB0aGUgaGVhZGVyLgotICAgICAgICBTdHJpbmdbXSBDT0xVTU5TID0gbmV3IFN0cmluZ1tdIHsKLSAgICAgICAgICAgIENvbnRhY3RzLl9JRCwKLSAgICAgICAgICAgIENvbnRhY3RzLkxPT0tVUF9LRVksCi0gICAgICAgICAgICBDb250YWN0cy5QSE9UT19JRCwKLSAgICAgICAgICAgIENvbnRhY3RzLkRJU1BMQVlfTkFNRSwKLSAgICAgICAgICAgIENvbnRhY3RzLlBIT05FVElDX05BTUUsCi0gICAgICAgICAgICBDb250YWN0cy5TVEFSUkVELAotICAgICAgICAgICAgQ29udGFjdHMuQ09OVEFDVF9QUkVTRU5DRSwKLSAgICAgICAgICAgIENvbnRhY3RzLkNPTlRBQ1RfU1RBVFVTLAotICAgICAgICAgICAgQ29udGFjdHMuQ09OVEFDVF9TVEFUVVNfVElNRVNUQU1QLAotICAgICAgICAgICAgQ29udGFjdHMuQ09OVEFDVF9TVEFUVVNfUkVTX1BBQ0tBR0UsCi0gICAgICAgICAgICBDb250YWN0cy5DT05UQUNUX1NUQVRVU19MQUJFTCwKLSAgICAgICAgfTsKLSAgICAgICAgaW50IF9JRCA9IDA7Ci0gICAgICAgIGludCBMT09LVVBfS0VZID0gMTsKLSAgICAgICAgaW50IFBIT1RPX0lEID0gMjsKLSAgICAgICAgaW50IERJU1BMQVlfTkFNRSA9IDM7Ci0gICAgICAgIGludCBQSE9ORVRJQ19OQU1FID0gNDsKLSAgICAgICAgLy9UT0RPOiBXZSBuZWVkIHRvIGZpZ3VyZSBvdXQgaG93IHdlJ3JlIGdvaW5nIHRvIGdldCB0aGUgcGhvbmV0aWMgbmFtZS4KLSAgICAgICAgLy9zdGF0aWMgZmluYWwgaW50IEhFQURFUl9QSE9ORVRJQ19OQU1FX0NPTFVNTl9JTkRFWAotICAgICAgICBpbnQgU1RBUlJFRCA9IDU7Ci0gICAgICAgIGludCBDT05UQUNUX1BSRVNFTkNFX1NUQVRVUyA9IDY7Ci0gICAgICAgIGludCBDT05UQUNUX1NUQVRVUyA9IDc7Ci0gICAgICAgIGludCBDT05UQUNUX1NUQVRVU19USU1FU1RBTVAgPSA4OwotICAgICAgICBpbnQgQ09OVEFDVF9TVEFUVVNfUkVTX1BBQ0tBR0UgPSA5OwotICAgICAgICBpbnQgQ09OVEFDVF9TVEFUVVNfTEFCRUwgPSAxMDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGludGVyZmFjZSBQaG90b1F1ZXJ5IHsKLSAgICAgICAgU3RyaW5nW10gQ09MVU1OUyA9IG5ldyBTdHJpbmdbXSB7Ci0gICAgICAgICAgICBQaG90by5QSE9UTwotICAgICAgICB9OwotCi0gICAgICAgIGludCBQSE9UTyA9IDA7Ci0gICAgfQotCi0gICAgLy9Qcm9qZWN0aW9uIHVzZWQgZm9yIGxvb2tpbmcgdXAgY29udGFjdCBpZCBmcm9tIHBob25lIG51bWJlcgotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nW10gUEhPTkVfTE9PS1VQX1BST0pFQ1RJT04gPSBuZXcgU3RyaW5nW10gewotICAgICAgICBQaG9uZUxvb2t1cC5fSUQsCi0gICAgICAgIFBob25lTG9va3VwLkxPT0tVUF9LRVksCi0gICAgfTsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBQSE9ORV9MT09LVVBfQ09OVEFDVF9JRF9DT0xVTU5fSU5ERVggPSAwOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFBIT05FX0xPT0tVUF9DT05UQUNUX0xPT0tVUF9LRVlfQ09MVU1OX0lOREVYID0gMTsKLQotICAgIC8vUHJvamVjdGlvbiB1c2VkIGZvciBsb29raW5nIHVwIGNvbnRhY3QgaWQgZnJvbSBlbWFpbCBhZGRyZXNzCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBFTUFJTF9MT09LVVBfUFJPSkVDVElPTiA9IG5ldyBTdHJpbmdbXSB7Ci0gICAgICAgIFJhd0NvbnRhY3RzLkNPTlRBQ1RfSUQsCi0gICAgICAgIENvbnRhY3RzLkxPT0tVUF9LRVksCi0gICAgfTsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBFTUFJTF9MT09LVVBfQ09OVEFDVF9JRF9DT0xVTU5fSU5ERVggPSAwOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IEVNQUlMX0xPT0tVUF9DT05UQUNUX0xPT0tVUF9LRVlfQ09MVU1OX0lOREVYID0gMTsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nW10gQ09OVEFDVF9MT09LVVBfUFJPSkVDVElPTiA9IG5ldyBTdHJpbmdbXSB7Ci0gICAgICAgIENvbnRhY3RzLl9JRCwKLSAgICB9OwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IENPTlRBQ1RfTE9PS1VQX0lEX0NPTFVNTl9JTkRFWCA9IDA7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVE9LRU5fQ09OVEFDVF9JTkZPID0gMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVE9LRU5fUEhPTkVfTE9PS1VQID0gMTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVE9LRU5fRU1BSUxfTE9PS1VQID0gMjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVE9LRU5fUEhPVE9fUVVFUlkgPSAzOwotCi0gICAgcHVibGljIENvbnRhY3RIZWFkZXJXaWRnZXQoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHRoaXMoY29udGV4dCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIENvbnRhY3RIZWFkZXJXaWRnZXQoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKLSAgICAgICAgdGhpcyhjb250ZXh0LCBhdHRycywgMCk7Ci0gICAgfQotCi0gICAgcHVibGljIENvbnRhY3RIZWFkZXJXaWRnZXQoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBkZWZTdHlsZSkgewotICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycywgZGVmU3R5bGUpOwotCi0gICAgICAgIG1Db250ZW50UmVzb2x2ZXIgPSBtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKTsKLQotICAgICAgICBMYXlvdXRJbmZsYXRlciBpbmZsYXRlciA9Ci0gICAgICAgICAgICAoTGF5b3V0SW5mbGF0ZXIpIG1Db250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5MQVlPVVRfSU5GTEFURVJfU0VSVklDRSk7Ci0gICAgICAgIGluZmxhdGVyLmluZmxhdGUoUi5sYXlvdXQuY29udGFjdF9oZWFkZXIsIHRoaXMpOwotCi0gICAgICAgIG1EaXNwbGF5TmFtZVZpZXcgPSAoVGV4dFZpZXcpIGZpbmRWaWV3QnlJZChSLmlkLm5hbWUpOwotICAgICAgICBtQWdncmVnYXRlQmFkZ2UgPSBmaW5kVmlld0J5SWQoUi5pZC5hZ2dyZWdhdGVfYmFkZ2UpOwotCi0gICAgICAgIG1QaG9uZXRpY05hbWVWaWV3ID0gKFRleHRWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5waG9uZXRpY19uYW1lKTsKLQotICAgICAgICBtU3RhcnJlZFZpZXcgPSAoQ2hlY2tCb3gpZmluZFZpZXdCeUlkKFIuaWQuc3Rhcik7Ci0gICAgICAgIG1TdGFycmVkVmlldy5zZXRPbkNsaWNrTGlzdGVuZXIodGhpcyk7Ci0KLSAgICAgICAgbVBob3RvVmlldyA9IChRdWlja0NvbnRhY3RCYWRnZSkgZmluZFZpZXdCeUlkKFIuaWQucGhvdG8pOwotCi0gICAgICAgIG1QcmVzZW5jZVZpZXcgPSAoSW1hZ2VWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5wcmVzZW5jZSk7Ci0KLSAgICAgICAgbVN0YXR1c1ZpZXcgPSAoVGV4dFZpZXcpZmluZFZpZXdCeUlkKFIuaWQuc3RhdHVzKTsKLSAgICAgICAgbVN0YXR1c0F0dHJpYnV0aW9uVmlldyA9IChUZXh0VmlldylmaW5kVmlld0J5SWQoUi5pZC5zdGF0dXNfZGF0ZSk7Ci0KLSAgICAgICAgLy8gU2V0IHRoZSBwaG90byB3aXRoIGEgcmFuZG9tICJubyBjb250YWN0IiBpbWFnZQotICAgICAgICBsb25nIG5vdyA9IFN5c3RlbUNsb2NrLmVsYXBzZWRSZWFsdGltZSgpOwotICAgICAgICBpbnQgbnVtID0gKGludCkgbm93ICYgMHhmOwotICAgICAgICBpZiAobnVtIDwgOSkgewotICAgICAgICAgICAgLy8gTGVhbmluZyBpbiBmcm9tIHJpZ2h0LCBjb21tb24KLSAgICAgICAgICAgIG1Ob1Bob3RvUmVzb3VyY2UgPSBSLmRyYXdhYmxlLmljX2NvbnRhY3RfcGljdHVyZTsKLSAgICAgICAgfSBlbHNlIGlmIChudW0gPCAxNCkgewotICAgICAgICAgICAgLy8gTGVhbmluZyBpbiBmcm9tIGxlZnQgdW5jb21tb24KLSAgICAgICAgICAgIG1Ob1Bob3RvUmVzb3VyY2UgPSBSLmRyYXdhYmxlLmljX2NvbnRhY3RfcGljdHVyZV8yOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gQ29taW5nIGluIGZyb20gdGhlIHRvcCwgcmFyZQotICAgICAgICAgICAgbU5vUGhvdG9SZXNvdXJjZSA9IFIuZHJhd2FibGUuaWNfY29udGFjdF9waWN0dXJlXzM7Ci0gICAgICAgIH0KLQotICAgICAgICByZXNldEFzeW5jUXVlcnlIYW5kbGVyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZW5hYmxlQ2xpY2tMaXN0ZW5lcnMoKSB7Ci0gICAgICAgIG1EaXNwbGF5TmFtZVZpZXcuc2V0T25DbGlja0xpc3RlbmVyKHRoaXMpOwotICAgICAgICBtUGhvdG9WaWV3LnNldE9uQ2xpY2tMaXN0ZW5lcih0aGlzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGdpdmVuIHtAbGluayBDb250YWN0SGVhZGVyTGlzdGVuZXJ9IHRvIGhhbmRsZSBoZWFkZXIgZXZlbnRzLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENvbnRhY3RIZWFkZXJMaXN0ZW5lcihDb250YWN0SGVhZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgbUxpc3RlbmVyID0gbGlzdGVuZXI7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHBlcmZvcm1QaG90b0NsaWNrKCkgewotICAgICAgICBpZiAobUxpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1MaXN0ZW5lci5vblBob3RvQ2xpY2sobVBob3RvVmlldyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcGVyZm9ybURpc3BsYXlOYW1lQ2xpY2soKSB7Ci0gICAgICAgIGlmIChtTGlzdGVuZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbUxpc3RlbmVyLm9uRGlzcGxheU5hbWVDbGljayhtRGlzcGxheU5hbWVWaWV3KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgUXVlcnlIYW5kbGVyIGV4dGVuZHMgQXN5bmNRdWVyeUhhbmRsZXIgewotCi0gICAgICAgIHB1YmxpYyBRdWVyeUhhbmRsZXIoQ29udGVudFJlc29sdmVyIGNyKSB7Ci0gICAgICAgICAgICBzdXBlcihjcik7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25RdWVyeUNvbXBsZXRlKGludCB0b2tlbiwgT2JqZWN0IGNvb2tpZSwgQ3Vyc29yIGN1cnNvcikgewotICAgICAgICAgICAgdHJ5ewotICAgICAgICAgICAgICAgIGlmICh0aGlzICE9IG1RdWVyeUhhbmRsZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAib25RdWVyeUNvbXBsZXRlOiBkaXNjYXJkIHJlc3VsdCwgdGhlIHF1ZXJ5IGhhbmRsZXIgaXMgcmVzZXQhIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBzd2l0Y2ggKHRva2VuKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgVE9LRU5fUEhPVE9fUVVFUlk6IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vU2V0IHRoZSBwaG90bwotICAgICAgICAgICAgICAgICAgICAgICAgQml0bWFwIHBob3RvQml0bWFwID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJzb3IgIT0gbnVsbCAmJiBjdXJzb3IubW92ZVRvRmlyc3QoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAhY3Vyc29yLmlzTnVsbChQaG90b1F1ZXJ5LlBIT1RPKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBwaG90b0RhdGEgPSBjdXJzb3IuZ2V0QmxvYihQaG90b1F1ZXJ5LlBIT1RPKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaG90b0JpdG1hcCA9IEJpdG1hcEZhY3RvcnkuZGVjb2RlQnl0ZUFycmF5KHBob3RvRGF0YSwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBob3RvRGF0YS5sZW5ndGgsIG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGhvdG9CaXRtYXAgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBob3RvQml0bWFwID0gbG9hZFBsYWNlaG9sZGVyUGhvdG8obnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtUGhvdG9WaWV3LnNldEltYWdlQml0bWFwKHBob3RvQml0bWFwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb29raWUgIT0gbnVsbCAmJiBjb29raWUgaW5zdGFuY2VvZiBVcmkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUGhvdG9WaWV3LmFzc2lnbkNvbnRhY3RVcmkoKFVyaSkgY29va2llKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgVE9LRU5fQ09OVEFDVF9JTkZPOiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3Vyc29yICE9IG51bGwgJiYgY3Vyc29yLm1vdmVUb0ZpcnN0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kQ29udGFjdEluZm8oY3Vyc29yKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBVcmkgbG9va3VwVXJpID0gQ29udGFjdHMuZ2V0TG9va3VwVXJpKGN1cnNvci5nZXRMb25nKENvbnRhY3RRdWVyeS5fSUQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3Vyc29yLmdldFN0cmluZyhDb250YWN0UXVlcnkuTE9PS1VQX0tFWSkpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgbG9uZyBwaG90b0lkID0gY3Vyc29yLmdldExvbmcoQ29udGFjdFF1ZXJ5LlBIT1RPX0lEKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwaG90b0lkID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBob3RvVmlldy5zZXRJbWFnZUJpdG1hcChsb2FkUGxhY2Vob2xkZXJQaG90byhudWxsKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb29raWUgIT0gbnVsbCAmJiBjb29raWUgaW5zdGFuY2VvZiBVcmkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QaG90b1ZpZXcuYXNzaWduQ29udGFjdFVyaSgoVXJpKSBjb29raWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFBob3RvUXVlcnkocGhvdG9JZCwgbG9va3VwVXJpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qIGRvbid0IHJlc2V0IHF1ZXJ5IGhhbmRsZXIgKi8pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2hvdWxkbid0IHJlYWxseSBoYXBwZW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXREaXNwbGF5TmFtZShudWxsLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTb2NpYWxTbmlwcGV0KG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFBob3RvKGxvYWRQbGFjZWhvbGRlclBob3RvKG51bGwpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgVE9LRU5fUEhPTkVfTE9PS1VQOiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3Vyc29yICE9IG51bGwgJiYgY3Vyc29yLm1vdmVUb0ZpcnN0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIGNvbnRhY3RJZCA9IGN1cnNvci5nZXRMb25nKFBIT05FX0xPT0tVUF9DT05UQUNUX0lEX0NPTFVNTl9JTkRFWCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxvb2t1cEtleSA9IGN1cnNvci5nZXRTdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQSE9ORV9MT09LVVBfQ09OVEFDVF9MT09LVVBfS0VZX0NPTFVNTl9JTkRFWCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZEZyb21Db250YWN0VXJpSW50ZXJuYWwoQ29udGFjdHMuZ2V0TG9va3VwVXJpKGNvbnRhY3RJZCwgbG9va3VwS2V5KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qIGRvbid0IHJlc2V0IHF1ZXJ5IGhhbmRsZXIgKi8pOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGhvbmVOdW1iZXIgPSAoU3RyaW5nKSBjb29raWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0RGlzcGxheU5hbWUocGhvbmVOdW1iZXIsIG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFNvY2lhbFNuaXBwZXQobnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0UGhvdG8obG9hZFBsYWNlaG9sZGVyUGhvdG8obnVsbCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QaG90b1ZpZXcuYXNzaWduQ29udGFjdEZyb21QaG9uZShwaG9uZU51bWJlciwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjYXNlIFRPS0VOX0VNQUlMX0xPT0tVUDogewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnNvciAhPSBudWxsICYmIGN1cnNvci5tb3ZlVG9GaXJzdCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBjb250YWN0SWQgPSBjdXJzb3IuZ2V0TG9uZyhFTUFJTF9MT09LVVBfQ09OVEFDVF9JRF9DT0xVTU5fSU5ERVgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsb29rdXBLZXkgPSBjdXJzb3IuZ2V0U3RyaW5nKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU1BSUxfTE9PS1VQX0NPTlRBQ1RfTE9PS1VQX0tFWV9DT0xVTU5fSU5ERVgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRGcm9tQ29udGFjdFVyaUludGVybmFsKENvbnRhY3RzLmdldExvb2t1cFVyaShjb250YWN0SWQsIGxvb2t1cEtleSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBkb24ndCByZXNldCBxdWVyeSBoYW5kbGVyICovKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGVtYWlsQWRkcmVzcyA9IChTdHJpbmcpIGNvb2tpZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXREaXNwbGF5TmFtZShlbWFpbEFkZHJlc3MsIG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFNvY2lhbFNuaXBwZXQobnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0UGhvdG8obG9hZFBsYWNlaG9sZGVyUGhvdG8obnVsbCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QaG90b1ZpZXcuYXNzaWduQ29udGFjdEZyb21FbWFpbChlbWFpbEFkZHJlc3MsIHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIGlmIChjdXJzb3IgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBjdXJzb3IuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUdXJuIG9uL29mZiBzaG93aW5nIG9mIHRoZSBhZ2dyZWdhdGUgYmFkZ2UgZWxlbWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzaG93QWdncmVnYXRlQmFkZ2UoYm9vbGVhbiBzaG93QmFnZGUpIHsKLSAgICAgICAgbUFnZ3JlZ2F0ZUJhZGdlLnNldFZpc2liaWxpdHkoc2hvd0JhZ2RlID8gVmlldy5WSVNJQkxFIDogVmlldy5HT05FKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUdXJuIG9uL29mZiBzaG93aW5nIG9mIHRoZSBzdGFyIGVsZW1lbnQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2hvd1N0YXIoYm9vbGVhbiBzaG93U3RhcikgewotICAgICAgICBtU3RhcnJlZFZpZXcuc2V0VmlzaWJpbGl0eShzaG93U3RhciA/IFZpZXcuVklTSUJMRSA6IFZpZXcuR09ORSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWFudWFsbHkgc2V0IHRoZSBzdGFycmVkIHN0YXRlIG9mIHRoaXMgaGVhZGVyIHdpZGdldC4gVGhpcyBkb2Vzbid0IGNoYW5nZQotICAgICAqIHRoZSB1bmRlcmx5aW5nIHtAbGluayBDb250YWN0c30gdmFsdWUsIG9ubHkgdGhlIFVJIHN0YXRlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFN0YXJlZChib29sZWFuIHN0YXJyZWQpIHsKLSAgICAgICAgbVN0YXJyZWRWaWV3LnNldENoZWNrZWQoc3RhcnJlZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWFudWFsbHkgc2V0IHRoZSBwcmVzZW5jZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQcmVzZW5jZShpbnQgcHJlc2VuY2UpIHsKLSAgICAgICAgbVByZXNlbmNlVmlldy5zZXRJbWFnZVJlc291cmNlKFN0YXR1c1VwZGF0ZXMuZ2V0UHJlc2VuY2VJY29uUmVzb3VyY2VJZChwcmVzZW5jZSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1hbnVhbGx5IHNldCB0aGUgY29udGFjdCB1cmkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDb250YWN0VXJpKFVyaSB1cmkpIHsKLSAgICAgICAgc2V0Q29udGFjdFVyaSh1cmksIHRydWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1hbnVhbGx5IHNldCB0aGUgY29udGFjdCB1cmkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDb250YWN0VXJpKFVyaSB1cmksIGJvb2xlYW4gc2VuZFRvRmFzdHJhY2spIHsKLSAgICAgICAgbUNvbnRhY3RVcmkgPSB1cmk7Ci0gICAgICAgIGlmIChzZW5kVG9GYXN0cmFjaykgewotICAgICAgICAgICAgbVBob3RvVmlldy5hc3NpZ25Db250YWN0VXJpKHVyaSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNYW51YWxseSBzZXQgdGhlIHBob3RvIHRvIGRpc3BsYXkgaW4gdGhlIGhlYWRlci4gVGhpcyBkb2Vzbid0IGNoYW5nZSB0aGUKLSAgICAgKiB1bmRlcmx5aW5nIHtAbGluayBDb250YWN0c30sIG9ubHkgdGhlIFVJIHN0YXRlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFBob3RvKEJpdG1hcCBiaXRtYXApIHsKLSAgICAgICAgbVBob3RvVmlldy5zZXRJbWFnZUJpdG1hcChiaXRtYXApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1hbnVhbGx5IHNldCB0aGUgZGlzcGxheSBuYW1lIGFuZCBwaG9uZXRpYyBuYW1lIHRvIHNob3cgaW4gdGhlIGhlYWRlci4KLSAgICAgKiBUaGlzIGRvZXNuJ3QgY2hhbmdlIHRoZSB1bmRlcmx5aW5nIHtAbGluayBDb250YWN0c30sIG9ubHkgdGhlIFVJIHN0YXRlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERpc3BsYXlOYW1lKENoYXJTZXF1ZW5jZSBkaXNwbGF5TmFtZSwgQ2hhclNlcXVlbmNlIHBob25ldGljTmFtZSkgewotICAgICAgICBtRGlzcGxheU5hbWVWaWV3LnNldFRleHQoZGlzcGxheU5hbWUpOwotICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHBob25ldGljTmFtZSkpIHsKLSAgICAgICAgICAgIG1QaG9uZXRpY05hbWVWaWV3LnNldFRleHQocGhvbmV0aWNOYW1lKTsKLSAgICAgICAgICAgIG1QaG9uZXRpY05hbWVWaWV3LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1QaG9uZXRpY05hbWVWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1hbnVhbGx5IHNldCB0aGUgc29jaWFsIHNuaXBwZXQgdGV4dCB0byBkaXNwbGF5IGluIHRoZSBoZWFkZXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U29jaWFsU25pcHBldChDaGFyU2VxdWVuY2Ugc25pcHBldCkgewotICAgICAgICBpZiAoc25pcHBldCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtU3RhdHVzVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICBtU3RhdHVzQXR0cmlidXRpb25WaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1TdGF0dXNWaWV3LnNldFRleHQoc25pcHBldCk7Ci0gICAgICAgICAgICBtU3RhdHVzVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgYSBsaXN0IG9mIHNwZWNpZmljIE1JTUUtdHlwZXMgdG8gZXhjbHVkZSBhbmQgbm90IGRpc3BsYXkuIEZvcgotICAgICAqIGV4YW1wbGUsIHRoaXMgY2FuIGJlIHVzZWQgdG8gaGlkZSB0aGUge0BsaW5rIENvbnRhY3RzI0NPTlRFTlRfSVRFTV9UWVBFfQotICAgICAqIHByb2ZpbGUgaWNvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRFeGNsdWRlTWltZXMoU3RyaW5nW10gZXhjbHVkZU1pbWVzKSB7Ci0gICAgICAgIG1FeGNsdWRlTWltZXMgPSBleGNsdWRlTWltZXM7Ci0gICAgICAgIG1QaG90b1ZpZXcuc2V0RXhjbHVkZU1pbWVzKGV4Y2x1ZGVNaW1lcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciBiaW5kaW5nIGFsbCBhdmFpbGFibGUgZGF0YSBmcm9tIGFuIGV4aXN0aW5nCi0gICAgICogY29udGFjdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb250YWN0TG9va3VwVXJpIGEge0NvbnRhY3RzLkNPTlRFTlRfTE9PS1VQX1VSSX0gc3R5bGUgVVJJLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGJpbmRGcm9tQ29udGFjdExvb2t1cFVyaShVcmkgY29udGFjdExvb2t1cFVyaSkgewotICAgICAgICBiaW5kRnJvbUNvbnRhY3RVcmlJbnRlcm5hbChjb250YWN0TG9va3VwVXJpLCB0cnVlIC8qIHJlc2V0IHF1ZXJ5IGhhbmRsZXIgKi8pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgYmluZGluZyBhbGwgYXZhaWxhYmxlIGRhdGEgZnJvbSBhbiBleGlzdGluZwotICAgICAqIGNvbnRhY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29udGFjdFVyaSBhIHtDb250YWN0cy5DT05URU5UX1VSSX0gc3R5bGUgVVJJLgotICAgICAqIEBwYXJhbSByZXNldFF1ZXJ5SGFuZGxlciB3aGV0aGVyIHRvIHVzZSBhIG5ldyBBc3luY1F1ZXJ5SGFuZGxlciBvciBub3QuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGJpbmRGcm9tQ29udGFjdFVyaUludGVybmFsKFVyaSBjb250YWN0VXJpLCBib29sZWFuIHJlc2V0UXVlcnlIYW5kbGVyKSB7Ci0gICAgICAgIG1Db250YWN0VXJpID0gY29udGFjdFVyaTsKLSAgICAgICAgc3RhcnRDb250YWN0UXVlcnkoY29udGFjdFVyaSwgcmVzZXRRdWVyeUhhbmRsZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgYmluZGluZyBhbGwgYXZhaWxhYmxlIGRhdGEgZnJvbSBhbiBleGlzdGluZwotICAgICAqIGNvbnRhY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZW1haWxBZGRyZXNzIFRoZSBlbWFpbCBhZGRyZXNzIHVzZWQgdG8gZG8gYSByZXZlcnNlIGxvb2t1cCBpbgotICAgICAqIHRoZSBjb250YWN0cyBkYXRhYmFzZS4gSWYgbW9yZSB0aGFuIG9uZSBjb250YWN0IGNvbnRhaW5zIHRoaXMgZW1haWwKLSAgICAgKiBhZGRyZXNzLCBvbmUgb2YgdGhlbSB3aWxsIGJlIGNob3NlbiB0byBiaW5kIHRvLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGJpbmRGcm9tRW1haWwoU3RyaW5nIGVtYWlsQWRkcmVzcykgewotICAgICAgICByZXNldEFzeW5jUXVlcnlIYW5kbGVyKCk7Ci0KLSAgICAgICAgbVF1ZXJ5SGFuZGxlci5zdGFydFF1ZXJ5KFRPS0VOX0VNQUlMX0xPT0tVUCwgZW1haWxBZGRyZXNzLAotICAgICAgICAgICAgICAgIFVyaS53aXRoQXBwZW5kZWRQYXRoKEVtYWlsLkNPTlRFTlRfTE9PS1VQX1VSSSwgVXJpLmVuY29kZShlbWFpbEFkZHJlc3MpKSwKLSAgICAgICAgICAgICAgICBFTUFJTF9MT09LVVBfUFJPSkVDVElPTiwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciBiaW5kaW5nIGFsbCBhdmFpbGFibGUgZGF0YSBmcm9tIGFuIGV4aXN0aW5nCi0gICAgICogY29udGFjdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBudW1iZXIgVGhlIHBob25lIG51bWJlciB1c2VkIHRvIGRvIGEgcmV2ZXJzZSBsb29rdXAgaW4KLSAgICAgKiB0aGUgY29udGFjdHMgZGF0YWJhc2UuIElmIG1vcmUgdGhhbiBvbmUgY29udGFjdCBjb250YWlucyB0aGlzIHBob25lCi0gICAgICogbnVtYmVyLCBvbmUgb2YgdGhlbSB3aWxsIGJlIGNob3NlbiB0byBiaW5kIHRvLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGJpbmRGcm9tUGhvbmVOdW1iZXIoU3RyaW5nIG51bWJlcikgewotICAgICAgICByZXNldEFzeW5jUXVlcnlIYW5kbGVyKCk7Ci0KLSAgICAgICAgbVF1ZXJ5SGFuZGxlci5zdGFydFF1ZXJ5KFRPS0VOX1BIT05FX0xPT0tVUCwgbnVtYmVyLAotICAgICAgICAgICAgICAgIFVyaS53aXRoQXBwZW5kZWRQYXRoKFBob25lTG9va3VwLkNPTlRFTlRfRklMVEVSX1VSSSwgVXJpLmVuY29kZShudW1iZXIpKSwKLSAgICAgICAgICAgICAgICBQSE9ORV9MT09LVVBfUFJPSkVDVElPTiwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogc3RhcnRDb250YWN0UXVlcnkKLSAgICAgKgotICAgICAqIGludGVybmFsIG1ldGhvZCB0byBxdWVyeSBjb250YWN0IGJ5IFVyaS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb250YWN0VXJpIHRoZSBjb250YWN0IHVyaQotICAgICAqIEBwYXJhbSByZXNldFF1ZXJ5SGFuZGxlciB3aGV0aGVyIHRvIHVzZSBhIG5ldyBBc3luY1F1ZXJ5SGFuZGxlciBvciBub3QKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc3RhcnRDb250YWN0UXVlcnkoVXJpIGNvbnRhY3RVcmksIGJvb2xlYW4gcmVzZXRRdWVyeUhhbmRsZXIpIHsKLSAgICAgICAgaWYgKHJlc2V0UXVlcnlIYW5kbGVyKSB7Ci0gICAgICAgICAgICByZXNldEFzeW5jUXVlcnlIYW5kbGVyKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBtUXVlcnlIYW5kbGVyLnN0YXJ0UXVlcnkoVE9LRU5fQ09OVEFDVF9JTkZPLCBjb250YWN0VXJpLCBjb250YWN0VXJpLCBDb250YWN0UXVlcnkuQ09MVU1OUywKLSAgICAgICAgICAgICAgICBudWxsLCBudWxsLCBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBzdGFydFBob3RvUXVlcnkKLSAgICAgKgotICAgICAqIGludGVybmFsIG1ldGhvZCB0byBxdWVyeSBjb250YWN0IHBob3RvIGJ5IHBob3RvIGlkIGFuZCB1cmkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGhvdG9JZCB0aGUgcGhvdG8gaWQuCi0gICAgICogQHBhcmFtIGxvb2t1cEtleSB0aGUgbG9va3VwIHVyaS4KLSAgICAgKiBAcGFyYW0gcmVzZXRRdWVyeUhhbmRsZXIgd2hldGhlciB0byB1c2UgYSBuZXcgQXN5bmNRdWVyeUhhbmRsZXIgb3Igbm90LgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHN0YXJ0UGhvdG9RdWVyeShsb25nIHBob3RvSWQsIFVyaSBsb29rdXBLZXksIGJvb2xlYW4gcmVzZXRRdWVyeUhhbmRsZXIpIHsKLSAgICAgICAgaWYgKHJlc2V0UXVlcnlIYW5kbGVyKSB7Ci0gICAgICAgICAgICByZXNldEFzeW5jUXVlcnlIYW5kbGVyKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBtUXVlcnlIYW5kbGVyLnN0YXJ0UXVlcnkoVE9LRU5fUEhPVE9fUVVFUlksIGxvb2t1cEtleSwKLSAgICAgICAgICAgICAgICBDb250ZW50VXJpcy53aXRoQXBwZW5kZWRJZChEYXRhLkNPTlRFTlRfVVJJLCBwaG90b0lkKSwgUGhvdG9RdWVyeS5DT0xVTU5TLAotICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1ldGhvZCB0byBmb3JjZSB0aGlzIHdpZGdldCB0byBmb3JnZXQgZXZlcnl0aGluZyBpdCBrbm93cyBhYm91dCB0aGUgY29udGFjdC4KLSAgICAgKiBXZSBuZWVkIHRvIHN0b3AgYW55IGV4aXN0aW5nIGFzeW5jIHF1ZXJpZXMgZm9yIHBob25lLCBlbWFpbCwgY29udGFjdCwgYW5kIHBob3Rvcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB3aXBlQ2xlYW4oKSB7Ci0gICAgICAgIHJlc2V0QXN5bmNRdWVyeUhhbmRsZXIoKTsKLQotICAgICAgICBzZXREaXNwbGF5TmFtZShudWxsLCBudWxsKTsKLSAgICAgICAgc2V0UGhvdG8obG9hZFBsYWNlaG9sZGVyUGhvdG8obnVsbCkpOwotICAgICAgICBzZXRTb2NpYWxTbmlwcGV0KG51bGwpOwotICAgICAgICBzZXRQcmVzZW5jZSgwKTsKLSAgICAgICAgbUNvbnRhY3RVcmkgPSBudWxsOwotICAgICAgICBtRXhjbHVkZU1pbWVzID0gbnVsbDsKLSAgICB9Ci0KLQotICAgIHByaXZhdGUgdm9pZCByZXNldEFzeW5jUXVlcnlIYW5kbGVyKCkgewotICAgICAgICAvLyB0aGUgYXBpIEFzeW5jUXVlcnlIYW5kbGVyLmNhbmNlbE9wZXJhdGlvbigpIGRvZXNuJ3QgcmVhbGx5IHdvcmsuIFNpbmNlIHdlIHJlYWxseQotICAgICAgICAvLyBuZWVkIHRoZSBvbGQgYXN5bmMgcXVlcmllcyB0byBiZSBjYW5jZWxsZWQsIGxldCdzIGRvIGl0IHRoZSBoYXJkIHdheS4KLSAgICAgICAgbVF1ZXJ5SGFuZGxlciA9IG5ldyBRdWVyeUhhbmRsZXIobUNvbnRlbnRSZXNvbHZlcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQmluZCB0aGUgY29udGFjdCBkZXRhaWxzIHByb3ZpZGVkIGJ5IHRoZSBnaXZlbiB7QGxpbmsgQ3Vyc29yfS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBiaW5kQ29udGFjdEluZm8oQ3Vyc29yIGMpIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIGRpc3BsYXlOYW1lID0gYy5nZXRTdHJpbmcoQ29udGFjdFF1ZXJ5LkRJU1BMQVlfTkFNRSk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBwaG9uZXRpY05hbWUgPSBjLmdldFN0cmluZyhDb250YWN0UXVlcnkuUEhPTkVUSUNfTkFNRSk7Ci0gICAgICAgIHRoaXMuc2V0RGlzcGxheU5hbWUoZGlzcGxheU5hbWUsIHBob25ldGljTmFtZSk7Ci0KLSAgICAgICAgZmluYWwgYm9vbGVhbiBzdGFycmVkID0gYy5nZXRJbnQoQ29udGFjdFF1ZXJ5LlNUQVJSRUQpICE9IDA7Ci0gICAgICAgIG1TdGFycmVkVmlldy5zZXRDaGVja2VkKHN0YXJyZWQpOwotCi0gICAgICAgIC8vU2V0IHRoZSBwcmVzZW5jZSBzdGF0dXMKLSAgICAgICAgaWYgKCFjLmlzTnVsbChDb250YWN0UXVlcnkuQ09OVEFDVF9QUkVTRU5DRV9TVEFUVVMpKSB7Ci0gICAgICAgICAgICBpbnQgcHJlc2VuY2UgPSBjLmdldEludChDb250YWN0UXVlcnkuQ09OVEFDVF9QUkVTRU5DRV9TVEFUVVMpOwotICAgICAgICAgICAgbVByZXNlbmNlVmlldy5zZXRJbWFnZVJlc291cmNlKFN0YXR1c1VwZGF0ZXMuZ2V0UHJlc2VuY2VJY29uUmVzb3VyY2VJZChwcmVzZW5jZSkpOwotICAgICAgICAgICAgbVByZXNlbmNlVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtUHJlc2VuY2VWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vU2V0IHRoZSBzdGF0dXMgdXBkYXRlCi0gICAgICAgIFN0cmluZyBzdGF0dXMgPSBjLmdldFN0cmluZyhDb250YWN0UXVlcnkuQ09OVEFDVF9TVEFUVVMpOwotICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHN0YXR1cykpIHsKLSAgICAgICAgICAgIG1TdGF0dXNWaWV3LnNldFRleHQoc3RhdHVzKTsKLSAgICAgICAgICAgIG1TdGF0dXNWaWV3LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLQotICAgICAgICAgICAgQ2hhclNlcXVlbmNlIHRpbWVzdGFtcCA9IG51bGw7Ci0KLSAgICAgICAgICAgIGlmICghYy5pc051bGwoQ29udGFjdFF1ZXJ5LkNPTlRBQ1RfU1RBVFVTX1RJTUVTVEFNUCkpIHsKLSAgICAgICAgICAgICAgICBsb25nIGRhdGUgPSBjLmdldExvbmcoQ29udGFjdFF1ZXJ5LkNPTlRBQ1RfU1RBVFVTX1RJTUVTVEFNUCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBTZXQgdGhlIGRhdGUvdGltZSBmaWVsZCBieSBtaXhpbmcgcmVsYXRpdmUgYW5kIGFic29sdXRlCi0gICAgICAgICAgICAgICAgLy8gdGltZXMuCi0gICAgICAgICAgICAgICAgaW50IGZsYWdzID0gRGF0ZVV0aWxzLkZPUk1BVF9BQkJSRVZfUkVMQVRJVkU7Ci0KLSAgICAgICAgICAgICAgICB0aW1lc3RhbXAgPSBEYXRlVXRpbHMuZ2V0UmVsYXRpdmVUaW1lU3BhblN0cmluZyhkYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCksIERhdGVVdGlscy5NSU5VVEVfSU5fTUlMTElTLCBmbGFncyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN0cmluZyBsYWJlbCA9IG51bGw7Ci0KLSAgICAgICAgICAgIGlmICghYy5pc051bGwoQ29udGFjdFF1ZXJ5LkNPTlRBQ1RfU1RBVFVTX0xBQkVMKSkgewotICAgICAgICAgICAgICAgIFN0cmluZyByZXNQYWNrYWdlID0gYy5nZXRTdHJpbmcoQ29udGFjdFF1ZXJ5LkNPTlRBQ1RfU1RBVFVTX1JFU19QQUNLQUdFKTsKLSAgICAgICAgICAgICAgICBpbnQgbGFiZWxSZXNvdXJjZSA9IGMuZ2V0SW50KENvbnRhY3RRdWVyeS5DT05UQUNUX1NUQVRVU19MQUJFTCk7Ci0gICAgICAgICAgICAgICAgUmVzb3VyY2VzIHJlc291cmNlczsKLSAgICAgICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkocmVzUGFja2FnZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzID0gZ2V0UmVzb3VyY2VzKCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgUGFja2FnZU1hbmFnZXIgcG0gPSBnZXRDb250ZXh0KCkuZ2V0UGFja2FnZU1hbmFnZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlcyA9IHBtLmdldFJlc291cmNlc0ZvckFwcGxpY2F0aW9uKHJlc1BhY2thZ2UpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChOYW1lTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ29udGFjdCBzdGF0dXMgdXBkYXRlIHJlc291cmNlIHBhY2thZ2Ugbm90IGZvdW5kOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcmVzUGFja2FnZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXMgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHJlc291cmNlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbCA9IHJlc291cmNlcy5nZXRTdHJpbmcobGFiZWxSZXNvdXJjZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNvbnRhY3Qgc3RhdHVzIHVwZGF0ZSByZXNvdXJjZSBub3QgZm91bmQ6ICIgKyByZXNQYWNrYWdlICsgIkAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbGFiZWxSZXNvdXJjZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIENoYXJTZXF1ZW5jZSBhdHRyaWJ1dGlvbjsKLSAgICAgICAgICAgIGlmICh0aW1lc3RhbXAgIT0gbnVsbCAmJiBsYWJlbCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYXR0cmlidXRpb24gPSBnZXRDb250ZXh0KCkuZ2V0U3RyaW5nKAotICAgICAgICAgICAgICAgICAgICAgICAgUi5zdHJpbmcuY29udGFjdF9zdGF0dXNfdXBkYXRlX2F0dHJpYnV0aW9uX3dpdGhfZGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcCwgbGFiZWwpOwotICAgICAgICAgICAgfSBlbHNlIGlmICh0aW1lc3RhbXAgPT0gbnVsbCAmJiBsYWJlbCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYXR0cmlidXRpb24gPSBnZXRDb250ZXh0KCkuZ2V0U3RyaW5nKAotICAgICAgICAgICAgICAgICAgICAgICAgUi5zdHJpbmcuY29udGFjdF9zdGF0dXNfdXBkYXRlX2F0dHJpYnV0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwpOwotICAgICAgICAgICAgfSBlbHNlIGlmICh0aW1lc3RhbXAgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGF0dHJpYnV0aW9uID0gdGltZXN0YW1wOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBhdHRyaWJ1dGlvbiA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoYXR0cmlidXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1TdGF0dXNBdHRyaWJ1dGlvblZpZXcuc2V0VGV4dChhdHRyaWJ1dGlvbik7Ci0gICAgICAgICAgICAgICAgbVN0YXR1c0F0dHJpYnV0aW9uVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1TdGF0dXNBdHRyaWJ1dGlvblZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbVN0YXR1c1ZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgbVN0YXR1c0F0dHJpYnV0aW9uVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdmlldykgewotICAgICAgICBzd2l0Y2ggKHZpZXcuZ2V0SWQoKSkgewotICAgICAgICAgICAgY2FzZSBSLmlkLnN0YXI6IHsKLSAgICAgICAgICAgICAgICAvLyBUb2dnbGUgInN0YXJyZWQiIHN0YXRlCi0gICAgICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoZXJlIGlzIGEgY29udGFjdAotICAgICAgICAgICAgICAgIGlmIChtQ29udGFjdFVyaSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIENvbnRlbnRWYWx1ZXMgdmFsdWVzID0gbmV3IENvbnRlbnRWYWx1ZXMoMSk7Ci0gICAgICAgICAgICAgICAgICAgIHZhbHVlcy5wdXQoQ29udGFjdHMuU1RBUlJFRCwgbVN0YXJyZWRWaWV3LmlzQ2hlY2tlZCgpKTsKLSAgICAgICAgICAgICAgICAgICAgbUNvbnRlbnRSZXNvbHZlci51cGRhdGUobUNvbnRhY3RVcmksIHZhbHVlcywgbnVsbCwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBSLmlkLnBob3RvOiB7Ci0gICAgICAgICAgICAgICAgcGVyZm9ybVBob3RvQ2xpY2soKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgUi5pZC5uYW1lOiB7Ci0gICAgICAgICAgICAgICAgcGVyZm9ybURpc3BsYXlOYW1lQ2xpY2soKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgQml0bWFwIGxvYWRQbGFjZWhvbGRlclBob3RvKEJpdG1hcEZhY3RvcnkuT3B0aW9ucyBvcHRpb25zKSB7Ci0gICAgICAgIGlmIChtTm9QaG90b1Jlc291cmNlID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBCaXRtYXBGYWN0b3J5LmRlY29kZVJlc291cmNlKG1Db250ZXh0LmdldFJlc291cmNlcygpLAotICAgICAgICAgICAgICAgIG1Ob1Bob3RvUmVzb3VyY2UsIG9wdGlvbnMpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvRGlnaXRhbENsb2NrLmphdmEgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L0RpZ2l0YWxDbG9jay5qYXZhCmluZGV4IGZhNDdmZjYuLjIzZTIyNzcgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvRGlnaXRhbENsb2NrLmphdmEKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9EaWdpdGFsQ2xvY2suamF2YQpAQCAtMzAsNyArMzAsNyBAQAogaW1wb3J0IGFuZHJvaWQudGV4dC5mb3JtYXQuRGF0ZUZvcm1hdDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkxpbmVhckxheW91dDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5SZWxhdGl2ZUxheW91dDsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKIAogaW1wb3J0IGphdmEudGV4dC5EYXRlRm9ybWF0U3ltYm9sczsKQEAgLTM5LDcgKzM5LDcgQEAKIC8qKgogICogRGlzcGxheXMgdGhlIHRpbWUKICAqLwotcHVibGljIGNsYXNzIERpZ2l0YWxDbG9jayBleHRlbmRzIExpbmVhckxheW91dCB7CitwdWJsaWMgY2xhc3MgRGlnaXRhbENsb2NrIGV4dGVuZHMgUmVsYXRpdmVMYXlvdXQgewogCiAgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIE0xMiA9ICJoOm1tIjsKICAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgTTI0ID0gImtrOm1tIjsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvRWRpdFN0eWxlZFRleHQuamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvRWRpdFN0eWxlZFRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODIxOTdjMC4uMDAwMDAwMAotLS0gYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L0VkaXRTdHlsZWRUZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldDsKLQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLkFsZXJ0RGlhbG9nLkJ1aWxkZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkRpYWxvZ0ludGVyZmFjZTsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcEZhY3Rvcnk7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5CaXRtYXBEcmF3YWJsZTsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuU2hhcGVEcmF3YWJsZTsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLnNoYXBlcy5SZWN0U2hhcGU7Ci1pbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQudGV4dC5FZGl0YWJsZTsKLWltcG9ydCBhbmRyb2lkLnRleHQuSHRtbDsKLWltcG9ydCBhbmRyb2lkLnRleHQuTGF5b3V0OwotaW1wb3J0IGFuZHJvaWQudGV4dC5TcGFubmFibGU7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LlNwYW5uZWQ7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0Lm1ldGhvZC5BcnJvd0tleU1vdmVtZW50TWV0aG9kOwotaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5BYnNvbHV0ZVNpemVTcGFuOwotaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5BbGlnbm1lbnRTcGFuOwotaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5DaGFyYWN0ZXJTdHlsZTsKLWltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuRm9yZWdyb3VuZENvbG9yU3BhbjsKLWltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuSW1hZ2VTcGFuOwotaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5QYXJhZ3JhcGhTdHlsZTsKLWltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuUXVvdGVTcGFuOwotaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7Ci1pbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwotaW1wb3J0IGFuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5JbnB1dE1ldGhvZE1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuRWRpdFRleHQ7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7Ci0KLS8qKgotICogRWRpdFN0eWxlZFRleHQgZXh0ZW5kcyBFZGl0VGV4dCBmb3IgbWFuYWdpbmcgdGhlIGZsb3cgYW5kIHN0YXR1cyB0byBlZGl0Ci0gKiB0aGUgc3R5bGVkIHRleHQuIFRoaXMgbWFuYWdlcyB0aGUgc3RhdGVzIGFuZCBmbG93cyBvZiBlZGl0aW5nLCBzdXBwb3J0cwotICogaW5zZXJ0aW5nIGltYWdlLCBpbXBvcnQvZXhwb3J0IEhUTUwuCi0gKi8KLXB1YmxpYyBjbGFzcyBFZGl0U3R5bGVkVGV4dCBleHRlbmRzIEVkaXRUZXh0IHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIkVkaXRTdHlsZWRUZXh0IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERCRyA9IGZhbHNlOwotCi0gICAgLyoqCi0gICAgICogVGhlIG1vZGVzIG9mIGVkaXRpbmcgYWN0aW9ucy4KLSAgICAgKi8KLSAgICAvKiogVGhlIG1vZGUgdGhhdCBubyBlZGl0aW5nIGFjdGlvbiBpcyBkb25lLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1PREVfTk9USElORyA9IDA7Ci0gICAgLyoqIFRoZSBtb2RlIG9mIGNvcHkuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU9ERV9DT1BZID0gMTsKLSAgICAvKiogVGhlIG1vZGUgb2YgcGFzdGUuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU9ERV9QQVNURSA9IDI7Ci0gICAgLyoqIFRoZSBtb2RlIG9mIGNoYW5naW5nIHNpemUuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU9ERV9TSVpFID0gMzsKLSAgICAvKiogVGhlIG1vZGUgb2YgY2hhbmdpbmcgY29sb3IuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU9ERV9DT0xPUiA9IDQ7Ci0gICAgLyoqIFRoZSBtb2RlIG9mIHNlbGVjdGlvbi4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT0RFX1NFTEVDVCA9IDU7Ci0gICAgLyoqIFRoZSBtb2RlIG9mIGNoYW5naW5nIGFsaWdubWVudC4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT0RFX0FMSUdOID0gNjsKLSAgICAvKiogVGhlIG1vZGUgb2YgY2hhbmdpbmcgY3V0LiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1PREVfQ1VUID0gNzsKLQotICAgIC8qKgotICAgICAqIFRoZSBzdGF0ZSBvZiBzZWxlY3Rpb24uCi0gICAgICovCi0gICAgLyoqIFRoZSBzdGF0ZSB0aGF0IHNlbGVjdGlvbiBpc24ndCBzdGFydGVkLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFX1NFTEVDVF9PRkYgPSAwOwotICAgIC8qKiBUaGUgc3RhdGUgdGhhdCBzZWxlY3Rpb24gaXMgc3RhcnRlZC4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFURV9TRUxFQ1RfT04gPSAxOwotICAgIC8qKiBUaGUgc3RhdGUgdGhhdCBzZWxlY3Rpb24gaXMgZG9uZSwgYnV0IG5vdCBmaXhlZC4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFURV9TRUxFQ1RFRCA9IDI7Ci0gICAgLyoqIFRoZSBzdGF0ZSB0aGF0IHNlbGVjdGlvbiBpcyBkb25lIGFuZCBub3QgZml4ZWQuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfU0VMRUNUX0ZJWCA9IDM7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgaGVscCBtZXNzYWdlIHN0cmluZ3MuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSElOVF9NU0dfTlVMTCA9IDA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSElOVF9NU0dfQ09QWV9CVUZfQkxBTksgPSAxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhJTlRfTVNHX1NFTEVDVF9TVEFSVCA9IDI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSElOVF9NU0dfU0VMRUNUX0VORCA9IDM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSElOVF9NU0dfUFVTSF9DT01QRVRFID0gNDsKLQotICAgIAotICAgIC8qKgotICAgICAqIFRoZSBoZWxwIG1lc3NhZ2Ugc3RyaW5ncy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0JBQ0tHUk9VTkRfQ09MT1IgPSAweDAwRkZGRkZGOwotCi0gICAgLyoqCi0gICAgICogRWRpdFN0eWxlZFRleHRJbnRlcmZhY2UgcHJvdmlkZXMgZnVuY3Rpb25zIGZvciBub3RpZnlpbmcgbWVzc2FnZXMgdG8KLSAgICAgKiBjYWxsaW5nIGNsYXNzLgotICAgICAqLwotICAgIHB1YmxpYyBpbnRlcmZhY2UgRWRpdFN0eWxlZFRleHROb3RpZmllciB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIG5vdGlmeUhpbnRNc2coaW50IG1zZ0lkKTsKLSAgICAgICAgcHVibGljIHZvaWQgbm90aWZ5U3RhdGVDaGFuZ2VkKGludCBtb2RlLCBpbnQgc3RhdGUpOwotICAgIH0KLQotICAgIHByaXZhdGUgRWRpdFN0eWxlZFRleHROb3RpZmllciBtRVNUSW50ZXJmYWNlOwotCi0gICAgLyoqCi0gICAgICogRWRpdFN0eWxlZFRleHRFZGl0b3JNYW5hZ2VyIG1hbmFnZXMgdGhlIGZsb3cgYW5kIHN0YXR1cyBvZiBlYWNoCi0gICAgICogZnVuY3Rpb24gZm9yIGVkaXRpbmcgc3R5bGVkIHRleHQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBFZGl0b3JNYW5hZ2VyIG1NYW5hZ2VyOwotICAgIHByaXZhdGUgU3R5bGVkVGV4dENvbnZlcnRlciBtQ29udmVydGVyOwotICAgIHByaXZhdGUgU3R5bGVkVGV4dERpYWxvZyBtRGlhbG9nOwotICAgIHByaXZhdGUgRHJhd2FibGUgbURlZmF1bHRCYWNrZ3JvdW5kOwotICAgIHByaXZhdGUgaW50IG1CYWNrZ3JvdW5kQ29sb3I7Ci0KLSAgICAvKioKLSAgICAgKiBFZGl0U3R5bGVkVGV4dCBleHRlbmRzIEVkaXRUZXh0IGZvciBtYW5hZ2luZyBmbG93IG9mIGVhY2ggZWRpdGluZwotICAgICAqIGFjdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgRWRpdFN0eWxlZFRleHQoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBkZWZTdHlsZSkgewotICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycywgZGVmU3R5bGUpOwotICAgICAgICBpbml0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIEVkaXRTdHlsZWRUZXh0KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7Ci0gICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzKTsKLSAgICAgICAgaW5pdCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBFZGl0U3R5bGVkVGV4dChDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgc3VwZXIoY29udGV4dCk7Ci0gICAgICAgIGluaXQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgTm90aWZpZXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Tm90aWZpZXIoRWRpdFN0eWxlZFRleHROb3RpZmllciBlc3RJbnRlcmZhY2UpIHsKLSAgICAgICAgbUVTVEludGVyZmFjZSA9IGVzdEludGVyZmFjZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgQnVpbGRlciBmb3IgQWxlcnREaWFsb2cuCi0gICAgICogCi0gICAgICogQHBhcmFtIGJ1aWxkZXIKLSAgICAgKiAgICAgICAgICAgIEJ1aWxkZXIgZm9yIG9wZW5pbmcgQWxlcnQgRGlhbG9nLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEJ1aWxkZXIoQnVpbGRlciBidWlsZGVyKSB7Ci0gICAgICAgIG1EaWFsb2cuc2V0QnVpbGRlcihidWlsZGVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgUGFyYW1ldGVycyBmb3IgQ29sb3JBbGVydERpYWxvZy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29sb3J0aXRsZQotICAgICAqICAgICAgICAgICAgVGl0bGUgZm9yIEFsZXJ0IERpYWxvZy4KLSAgICAgKiBAcGFyYW0gY29sb3JuYW1lcwotICAgICAqICAgICAgICAgICAgTGlzdCBvZiBuYW1lIG9mIHNlbGVjdGluZyBjb2xvci4KLSAgICAgKiBAcGFyYW0gY29sb3JpbnRzCi0gICAgICogICAgICAgICAgICBMaXN0IG9mIGludCBvZiBjb2xvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDb2xvckFsZXJ0UGFyYW1zKENoYXJTZXF1ZW5jZSBjb2xvcnRpdGxlLAotICAgICAgICAgICAgQ2hhclNlcXVlbmNlW10gY29sb3JuYW1lcywgQ2hhclNlcXVlbmNlW10gY29sb3JpbnRzKSB7Ci0gICAgICAgIG1EaWFsb2cuc2V0Q29sb3JBbGVydFBhcmFtcyhjb2xvcnRpdGxlLCBjb2xvcm5hbWVzLCBjb2xvcmludHMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCBQYXJhbWV0ZXJzIGZvciBTaXplQWxlcnREaWFsb2cuCi0gICAgICogCi0gICAgICogQHBhcmFtIHNpemV0aXRsZQotICAgICAqICAgICAgICAgICAgVGl0bGUgZm9yIEFsZXJ0IERpYWxvZy4KLSAgICAgKiBAcGFyYW0gc2l6ZW5hbWVzCi0gICAgICogICAgICAgICAgICBMaXN0IG9mIG5hbWUgb2Ygc2VsZWN0aW5nIHNpemUuCi0gICAgICogQHBhcmFtIHNpemVkaXNwbGF5aW50cwotICAgICAqICAgICAgICAgICAgTGlzdCBvZiBpbnQgb2Ygc2l6ZSBkaXNwbGF5ZWQgaW4gVGV4dFZpZXcuCi0gICAgICogQHBhcmFtIHNpemVzZW5kaW50cwotICAgICAqICAgICAgICAgICAgTGlzdCBvZiBpbnQgb2Ygc2l6ZSBleHBvcnRlZCB0byBIVE1MLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFNpemVBbGVydFBhcmFtcyhDaGFyU2VxdWVuY2Ugc2l6ZXRpdGxlLAotICAgICAgICAgICAgQ2hhclNlcXVlbmNlW10gc2l6ZW5hbWVzLCBDaGFyU2VxdWVuY2VbXSBzaXplZGlzcGxheWludHMsCi0gICAgICAgICAgICBDaGFyU2VxdWVuY2VbXSBzaXplc2VuZGludHMpIHsKLSAgICAgICAgbURpYWxvZy5zZXRTaXplQWxlcnRQYXJhbXMoc2l6ZXRpdGxlLCBzaXplbmFtZXMsIHNpemVkaXNwbGF5aW50cywKLSAgICAgICAgICAgICAgICBzaXplc2VuZGludHMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEFsaWduQWxlcnRQYXJhbXMoQ2hhclNlcXVlbmNlIGFsaWdudGl0bGUsCi0gICAgICAgICAgICBDaGFyU2VxdWVuY2VbXSBhbGlnbm5hbWVzKSB7Ci0gICAgICAgIG1EaWFsb2cuc2V0QWxpZ25BbGVydFBhcmFtcyhhbGlnbnRpdGxlLCBhbGlnbm5hbWVzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBvblRvdWNoRXZlbnQoTW90aW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgaWYgKG1NYW5hZ2VyLmlzU29mdEtleUJsb2NrZWQoKSAmJgotICAgICAgICAgICAgICAgIGV2ZW50LmdldEFjdGlvbigpID09IE1vdGlvbkV2ZW50LkFDVElPTl9VUCkgewotICAgICAgICAgICAgY2FuY2VsTG9uZ1ByZXNzKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgYm9vbGVhbiBzdXBlclJlc3VsdCA9IHN1cGVyLm9uVG91Y2hFdmVudChldmVudCk7Ci0gICAgICAgIGlmIChldmVudC5nZXRBY3Rpb24oKSA9PSBNb3Rpb25FdmVudC5BQ1RJT05fVVApIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIG9uVG91Y2hFdmVudCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbU1hbmFnZXIub25DdXJzb3JNb3ZlZCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdXBlclJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTdGFydCBlZGl0aW5nLiBUaGlzIGZ1bmN0aW9uIGhhdmUgdG8gYmUgY2FsbGVkIGJlZm9yZSBvdGhlciBlZGl0aW5nCi0gICAgICogYWN0aW9ucy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBvblN0YXJ0RWRpdCgpIHsKLSAgICAgICAgbU1hbmFnZXIub25TdGFydEVkaXQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFbmQgZWRpdGluZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBvbkVuZEVkaXQoKSB7Ci0gICAgICAgIG1NYW5hZ2VyLm9uRW5kRWRpdCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFN0YXJ0ICJDb3B5IiBhY3Rpb24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgb25TdGFydENvcHkoKSB7Ci0gICAgICAgIG1NYW5hZ2VyLm9uU3RhcnRDb3B5KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3RhcnQgIkN1dCIgYWN0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG9uU3RhcnRDdXQoKSB7Ci0gICAgICAgIG1NYW5hZ2VyLm9uU3RhcnRDdXQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTdGFydCAiUGFzdGUiIGFjdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBvblN0YXJ0UGFzdGUoKSB7Ci0gICAgICAgIG1NYW5hZ2VyLm9uU3RhcnRQYXN0ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFN0YXJ0IGNoYW5naW5nICJTaXplIiBhY3Rpb24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgb25TdGFydFNpemUoKSB7Ci0gICAgICAgIG1NYW5hZ2VyLm9uU3RhcnRTaXplKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3RhcnQgY2hhbmdpbmcgIkNvbG9yIiBhY3Rpb24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgb25TdGFydENvbG9yKCkgewotICAgICAgICBtTWFuYWdlci5vblN0YXJ0Q29sb3IoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTdGFydCBjaGFuZ2luZyAiQmFja2dyb3VuZENvbG9yIiBhY3Rpb24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgb25TdGFydEJhY2tncm91bmRDb2xvcigpIHsKLSAgICAgICAgbU1hbmFnZXIub25TdGFydEJhY2tncm91bmRDb2xvcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFN0YXJ0IGNoYW5naW5nICJBbGlnbm1lbnQiIGFjdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBvblN0YXJ0QWxpZ24oKSB7Ci0gICAgICAgIG1NYW5hZ2VyLm9uU3RhcnRBbGlnbigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFN0YXJ0ICJTZWxlY3QiIGFjdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBvblN0YXJ0U2VsZWN0KCkgewotICAgICAgICBtTWFuYWdlci5vblN0YXJ0U2VsZWN0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3RhcnQgIlNlbGVjdEFsbCIgYWN0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG9uU3RhcnRTZWxlY3RBbGwoKSB7Ci0gICAgICAgIG1NYW5hZ2VyLm9uU3RhcnRTZWxlY3RBbGwoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGaXggU2VsZWN0ZWQgSXRlbS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBvbkZpeFNlbGVjdGVkSXRlbSgpIHsKLSAgICAgICAgbU1hbmFnZXIub25GaXhTZWxlY3RlZEl0ZW0oKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbnNlcnRJbWFnZSB0byBUZXh0VmlldyBieSB1c2luZyBVUkkKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdXJpCi0gICAgICogICAgICAgICAgICBVUkkgb2YgdGhlIGlhbWdlIGluc2VydGVkIHRvIFRleHRWaWV3LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG9uSW5zZXJ0SW1hZ2UoVXJpIHVyaSkgewotICAgICAgICBtTWFuYWdlci5vbkluc2VydEltYWdlKHVyaSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5zZXJ0SW1hZ2UgdG8gVGV4dFZpZXcgYnkgdXNpbmcgcmVzb3VyY2UgSUQKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcmVzSWQKLSAgICAgKiAgICAgICAgICAgIFJlc291cmNlIElEIG9mIHRoZSBpYW1nZSBpbnNlcnRlZCB0byBUZXh0Vmlldy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBvbkluc2VydEltYWdlKGludCByZXNJZCkgewotICAgICAgICBtTWFuYWdlci5vbkluc2VydEltYWdlKHJlc0lkKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBvbkluc2VydEhvcml6b250YWxMaW5lKCkgewotICAgICAgICBtTWFuYWdlci5vbkluc2VydEhvcml6b250YWxMaW5lKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgb25DbGVhclN0eWxlcygpIHsKLSAgICAgICAgbU1hbmFnZXIub25DbGVhclN0eWxlcygpOwotICAgIH0KLSAgICAvKioKLSAgICAgKiBTZXQgU2l6ZSBvZiB0aGUgSXRlbS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc2l6ZQotICAgICAqICAgICAgICAgICAgVGhlIHNpemUgb2YgdGhlIEl0ZW0uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SXRlbVNpemUoaW50IHNpemUpIHsKLSAgICAgICAgbU1hbmFnZXIuc2V0SXRlbVNpemUoc2l6ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IENvbG9yIG9mIHRoZSBJdGVtLgotICAgICAqIAotICAgICAqIEBwYXJhbSBjb2xvcgotICAgICAqICAgICAgICAgICAgVGhlIGNvbG9yIG9mIHRoZSBJdGVtLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEl0ZW1Db2xvcihpbnQgY29sb3IpIHsKLSAgICAgICAgbU1hbmFnZXIuc2V0SXRlbUNvbG9yKGNvbG9yKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgQWxpZ25tZW50IG9mIHRoZSBJdGVtLgotICAgICAqIAotICAgICAqIEBwYXJhbSBjb2xvcgotICAgICAqICAgICAgICAgICAgVGhlIGNvbG9yIG9mIHRoZSBJdGVtLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEFsaWdubWVudChMYXlvdXQuQWxpZ25tZW50IGFsaWduKSB7Ci0gICAgICAgIG1NYW5hZ2VyLnNldEFsaWdubWVudChhbGlnbik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IEJhY2tncm91bmQgY29sb3Igb2YgVmlldy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29sb3IKLSAgICAgKiAgICAgICAgICAgIFRoZSBiYWNrZ3JvdW5kIGNvbG9yIG9mIHZpZXcuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0QmFja2dyb3VuZENvbG9yKGludCBjb2xvcikgewotICAgICAgICBzdXBlci5zZXRCYWNrZ3JvdW5kQ29sb3IoY29sb3IpOwotICAgICAgICBtQmFja2dyb3VuZENvbG9yID0gY29sb3I7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IGh0bWwgdG8gRWRpdFN0eWxlZFRleHQuCi0gICAgICogCi0gICAgICogQHBhcmFtIGh0bWwKLSAgICAgKiAgICAgICAgICAgIFRoZSBodG1sIHRvIGJlIHNldC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRIdG1sKFN0cmluZyBodG1sKSB7Ci0gICAgICAgIG1Db252ZXJ0ZXIuU2V0SHRtbChodG1sKTsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogQ2hlY2sgd2hldGhlciBlZGl0aW5nIGlzIHN0YXJ0ZWQgb3Igbm90LgotICAgICAqIAotICAgICAqIEByZXR1cm4gV2hldGhlciBlZGl0aW5nIGlzIHN0YXJ0ZWQgb3Igbm90LgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzRWRpdHRpbmcoKSB7Ci0gICAgICAgIHJldHVybiBtTWFuYWdlci5pc0VkaXR0aW5nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2sgd2hldGhlciBzdHlsZWQgdGV4dCBvciBub3QuCi0gICAgICogCi0gICAgICogQHJldHVybiBXaGV0aGVyIHN0eWxlZCB0ZXh0IG9yIG5vdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1N0eWxlZFRleHQoKSB7Ci0gICAgICAgIHJldHVybiBtTWFuYWdlci5pc1N0eWxlZFRleHQoKTsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogQ2hlY2sgd2hldGhlciBTb2Z0S2V5IGlzIEJsb2NrZWQgb3Igbm90LgotICAgICAqIAotICAgICAqIEByZXR1cm4gd2hldGhlciBTb2Z0S2V5IGlzIEJsb2NrZWQgb3Igbm90LgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzU29mdEtleUJsb2NrZWQoKSB7Ci0gICAgICAgIHJldHVybiBtTWFuYWdlci5pc1NvZnRLZXlCbG9ja2VkKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBtb2RlIG9mIHRoZSBhY3Rpb24uCi0gICAgICogCi0gICAgICogQHJldHVybiBUaGUgbW9kZSBvZiB0aGUgYWN0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0RWRpdE1vZGUoKSB7Ci0gICAgICAgIHJldHVybiBtTWFuYWdlci5nZXRFZGl0TW9kZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgc3RhdGUgb2YgdGhlIHNlbGVjdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFRoZSBzdGF0ZSBvZiB0aGUgc2VsZWN0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0U2VsZWN0U3RhdGUoKSB7Ci0gICAgICAgIHJldHVybiBtTWFuYWdlci5nZXRTZWxlY3RTdGF0ZSgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBCdW5kbGUgZ2V0SW5wdXRFeHRyYXMoYm9vbGVhbiBjcmVhdGUpIHsKLSAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLWdldElucHV0RXh0cmFzIik7Ci0gICAgICAgIH0KLSAgICAgICAgQnVuZGxlIGJ1bmRsZSA9IHN1cGVyLmdldElucHV0RXh0cmFzKGNyZWF0ZSk7Ci0gICAgICAgIGlmIChidW5kbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgYnVuZGxlID0gbmV3IEJ1bmRsZSgpOwotICAgICAgICB9Ci0gICAgICAgIGJ1bmRsZS5wdXRCb29sZWFuKCJhbGxvd0Vtb2ppIiwgdHJ1ZSk7Ci0gICAgICAgIHJldHVybiBidW5kbGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBzdGF0ZSBvZiB0aGUgc2VsZWN0aW9uLgotICAgICAqIAotICAgICAqIEByZXR1cm4gVGhlIHN0YXRlIG9mIHRoZSBzZWxlY3Rpb24uCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRIdG1sKCkgewotICAgICAgICByZXR1cm4gbUNvbnZlcnRlci5nZXRIdG1sKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBzdGF0ZSBvZiB0aGUgc2VsZWN0aW9uLgotICAgICAqIAotICAgICAqIEBwYXJhbSB1cmlzCi0gICAgICogICAgICAgICAgICBUaGUgYXJyYXkgb2YgdXNlZCB1cmlzLgotICAgICAqIEByZXR1cm4gVGhlIHN0YXRlIG9mIHRoZSBzZWxlY3Rpb24uCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRIdG1sKEFycmF5TGlzdDxVcmk+IHVyaXMpIHsKLSAgICAgICAgbUNvbnZlcnRlci5nZXRVcmlBcnJheSh1cmlzLCBnZXRUZXh0KCkpOwotICAgICAgICByZXR1cm4gbUNvbnZlcnRlci5nZXRIdG1sKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IEJhY2tncm91bmQgY29sb3Igb2YgVmlldy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFRoZSBiYWNrZ3JvdW5kIGNvbG9yIG9mIFZpZXcuCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRCYWNrZ3JvdW5kQ29sb3IoKSB7Ci0gICAgICAgIHJldHVybiBtQmFja2dyb3VuZENvbG9yOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBGb3JlZ3JvdW5kIGNvbG9yIG9mIFZpZXcuCi0gICAgICogCi0gICAgICogQHJldHVybiBUaGUgYmFja2dyb3VuZCBjb2xvciBvZiBWaWV3LgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0Rm9yZUdyb3VuZENvbG9yKGludCBwb3MpIHsKLSAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLWdldEZvcmVHcm91bmRDb2xvcjogIiArIHBvcyk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBvcyA8IDAgfHwgcG9zID4gZ2V0VGV4dCgpLmxlbmd0aCgpKSB7Ci0gICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiLS0tZ2V0Rm9yZUdyb3VuZENvbG9yOiBJbGxpZ2FsIHBvc2l0aW9uLiIpOwotICAgICAgICAgICAgcmV0dXJuIERFRkFVTFRfQkFDS0dST1VORF9DT0xPUjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEZvcmVncm91bmRDb2xvclNwYW5bXSBzcGFucyA9Ci0gICAgICAgICAgICAgICAgZ2V0VGV4dCgpLmdldFNwYW5zKHBvcywgcG9zLCBGb3JlZ3JvdW5kQ29sb3JTcGFuLmNsYXNzKTsKLSAgICAgICAgICAgIGlmIChzcGFucy5sZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHNwYW5zWzBdLmdldEZvcmVncm91bmRDb2xvcigpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gREVGQVVMVF9CQUNLR1JPVU5EX0NPTE9SOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5pdGlhbGl6ZSBtZW1iZXJzLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBpbml0KCkgewotICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIGluaXQiKTsKLSAgICAgICAgfQotICAgICAgICByZXF1ZXN0Rm9jdXMoKTsKLSAgICAgICAgbURlZmF1bHRCYWNrZ3JvdW5kID0gZ2V0QmFja2dyb3VuZCgpOwotICAgICAgICBtQmFja2dyb3VuZENvbG9yID0gREVGQVVMVF9CQUNLR1JPVU5EX0NPTE9SOwotICAgICAgICBtTWFuYWdlciA9IG5ldyBFZGl0b3JNYW5hZ2VyKHRoaXMpOwotICAgICAgICBtQ29udmVydGVyID0gbmV3IFN0eWxlZFRleHRDb252ZXJ0ZXIodGhpcyk7Ci0gICAgICAgIG1EaWFsb2cgPSBuZXcgU3R5bGVkVGV4dERpYWxvZyh0aGlzKTsKLSAgICAgICAgc2V0TW92ZW1lbnRNZXRob2QobmV3IFN0eWxlZFRleHRBcnJvd0tleU1ldGhvZChtTWFuYWdlcikpOwotICAgICAgICBtTWFuYWdlci5ibG9ja1NvZnRLZXkoKTsKLSAgICAgICAgbU1hbmFnZXIudW5ibG9ja1NvZnRLZXkoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTaG93IEZvcmVncm91bmQgQ29sb3IgU2VsZWN0aW5nIERpYWxvZy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgb25TaG93Rm9yZWdyb3VuZENvbG9yQWxlcnQoKSB7Ci0gICAgICAgIG1EaWFsb2cub25TaG93Rm9yZWdyb3VuZENvbG9yQWxlcnREaWFsb2coKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTaG93IEJhY2tncm91bmQgQ29sb3IgU2VsZWN0aW5nIERpYWxvZy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgb25TaG93QmFja2dyb3VuZENvbG9yQWxlcnQoKSB7Ci0gICAgICAgIG1EaWFsb2cub25TaG93QmFja2dyb3VuZENvbG9yQWxlcnREaWFsb2coKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTaG93IFNpemUgU2VsZWN0aW5nIERpYWxvZy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgb25TaG93U2l6ZUFsZXJ0KCkgewotICAgICAgICBtRGlhbG9nLm9uU2hvd1NpemVBbGVydERpYWxvZygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNob3cgQWxpZ25tZW50IFNlbGVjdGluZyBEaWFsb2cuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIG9uU2hvd0FsaWduQWxlcnQoKSB7Ci0gICAgICAgIG1EaWFsb2cub25TaG93QWxpZ25BbGVydERpYWxvZygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE5vdGlmeSBoaW50IG1lc3NhZ2VzIHdoYXQgYWN0aW9uIGlzIGV4cGVjdGVkIHRvIGNhbGxpbmcgY2xhc3MuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1zZ0lkCi0gICAgICogICAgICAgICAgICBJZCBvZiB0aGUgaGludCBtZXNzYWdlLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzZXRIaW50TWVzc2FnZShpbnQgbXNnSWQpIHsKLSAgICAgICAgaWYgKG1FU1RJbnRlcmZhY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgbUVTVEludGVyZmFjZS5ub3RpZnlIaW50TXNnKG1zZ0lkKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIE5vdGlmeSB0aGUgZXZlbnQgdGhhdCB0aGUgbW9kZSBhbmQgc3RhdGUgYXJlIGNoYW5nZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1vZGUKLSAgICAgKiAgICAgICAgICAgIE1vZGUgb2YgdGhlIGVkaXRpbmcgYWN0aW9uLgotICAgICAqIEBwYXJhbSBzdGF0ZQotICAgICAqICAgICAgICAgICAgTW9kZSBvZiB0aGUgc2VsZWN0aW9uIHN0YXRlLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBub3RpZnlTdGF0ZUNoYW5nZWQoaW50IG1vZGUsIGludCBzdGF0ZSkgewotICAgICAgICBpZiAobUVTVEludGVyZmFjZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtRVNUSW50ZXJmYWNlLm5vdGlmeVN0YXRlQ2hhbmdlZChtb2RlLCBzdGF0ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFZGl0b3JNYW5hZ2VyIG1hbmFnZXMgdGhlIGZsb3cgYW5kIHN0YXR1cyBvZiBlZGl0aW5nIGFjdGlvbnMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBjbGFzcyBFZGl0b3JNYW5hZ2VyIHsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1FZGl0RmxhZyA9IGZhbHNlOwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gbVNvZnRLZXlCbG9ja0ZsYWcgPSBmYWxzZTsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbU1vZGUgPSAwOwotICAgICAgICBwcml2YXRlIGludCBtU3RhdGUgPSAwOwotICAgICAgICBwcml2YXRlIGludCBtQ3VyU3RhcnQgPSAwOwotICAgICAgICBwcml2YXRlIGludCBtQ3VyRW5kID0gMDsKLSAgICAgICAgcHJpdmF0ZSBFZGl0U3R5bGVkVGV4dCBtRVNUOwotCi0gICAgICAgIEVkaXRvck1hbmFnZXIoRWRpdFN0eWxlZFRleHQgZXN0KSB7Ci0gICAgICAgICAgICBtRVNUID0gZXN0OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgb25TdGFydEVkaXQoKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBvblN0YXJ0RWRpdCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBvbnN0YXJ0ZWRpdDoiKTsKLSAgICAgICAgICAgIGhhbmRsZVJlc2V0RWRpdCgpOwotICAgICAgICAgICAgbUVTVC5ub3RpZnlTdGF0ZUNoYW5nZWQobU1vZGUsIG1TdGF0ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBvbkVuZEVkaXQoKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBvbkVuZEVkaXQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGhhbmRsZUNhbmNlbCgpOwotICAgICAgICAgICAgbUVTVC5ub3RpZnlTdGF0ZUNoYW5nZWQobU1vZGUsIG1TdGF0ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBvblN0YXJ0Q29weSgpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIG9uU3RhcnRDb3B5Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBoYW5kbGVDb3B5KCk7Ci0gICAgICAgICAgICBtRVNULm5vdGlmeVN0YXRlQ2hhbmdlZChtTW9kZSwgbVN0YXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU3RhcnRDdXQoKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBvblN0YXJ0Q3V0Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBoYW5kbGVDdXQoKTsKLSAgICAgICAgICAgIG1FU1Qubm90aWZ5U3RhdGVDaGFuZ2VkKG1Nb2RlLCBtU3RhdGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgb25TdGFydFBhc3RlKCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gb25TdGFydFBhc3RlIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBoYW5kbGVQYXN0ZSgpOwotICAgICAgICAgICAgbUVTVC5ub3RpZnlTdGF0ZUNoYW5nZWQobU1vZGUsIG1TdGF0ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBvblN0YXJ0U2l6ZSgpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIG9uU3RhcnRTaXplIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBoYW5kbGVTaXplKCk7Ci0gICAgICAgICAgICBtRVNULm5vdGlmeVN0YXRlQ2hhbmdlZChtTW9kZSwgbVN0YXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU3RhcnRBbGlnbigpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIG9uU3RhcnRBbGlnblJpZ2h0Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBoYW5kbGVBbGlnbigpOwotICAgICAgICAgICAgbUVTVC5ub3RpZnlTdGF0ZUNoYW5nZWQobU1vZGUsIG1TdGF0ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBvblN0YXJ0Q29sb3IoKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBvbkNsaWNrQ29sb3IiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGhhbmRsZUNvbG9yKCk7Ci0gICAgICAgICAgICBtRVNULm5vdGlmeVN0YXRlQ2hhbmdlZChtTW9kZSwgbVN0YXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU3RhcnRCYWNrZ3JvdW5kQ29sb3IoKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBvbkNsaWNrQ29sb3IiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1FU1Qub25TaG93QmFja2dyb3VuZENvbG9yQWxlcnQoKTsKLSAgICAgICAgICAgIG1FU1Qubm90aWZ5U3RhdGVDaGFuZ2VkKG1Nb2RlLCBtU3RhdGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgb25TdGFydFNlbGVjdCgpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIG9uQ2xpY2tTZWxlY3QiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1Nb2RlID0gTU9ERV9TRUxFQ1Q7Ci0gICAgICAgICAgICBpZiAobVN0YXRlID09IFNUQVRFX1NFTEVDVF9PRkYpIHsKLSAgICAgICAgICAgICAgICBoYW5kbGVTZWxlY3QoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdW5zZXRTZWxlY3QoKTsKLSAgICAgICAgICAgICAgICBoYW5kbGVTZWxlY3QoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1FU1Qubm90aWZ5U3RhdGVDaGFuZ2VkKG1Nb2RlLCBtU3RhdGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgb25DdXJzb3JNb3ZlZCgpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIG9uQ2xpY2tWaWV3Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobVN0YXRlID09IFNUQVRFX1NFTEVDVF9PTiB8fCBtU3RhdGUgPT0gU1RBVEVfU0VMRUNURUQpIHsKLSAgICAgICAgICAgICAgICBoYW5kbGVTZWxlY3QoKTsKLSAgICAgICAgICAgICAgICBtRVNULm5vdGlmeVN0YXRlQ2hhbmdlZChtTW9kZSwgbVN0YXRlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU3RhcnRTZWxlY3RBbGwoKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBvbkNsaWNrU2VsZWN0QWxsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBoYW5kbGVTZWxlY3RBbGwoKTsKLSAgICAgICAgICAgIG1FU1Qubm90aWZ5U3RhdGVDaGFuZ2VkKG1Nb2RlLCBtU3RhdGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgb25GaXhTZWxlY3RlZEl0ZW0oKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBvbkNsaWNrQ29tcGxldGUiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGhhbmRsZUNvbXBsZXRlKCk7Ci0gICAgICAgICAgICBtRVNULm5vdGlmeVN0YXRlQ2hhbmdlZChtTW9kZSwgbVN0YXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uSW5zZXJ0SW1hZ2UoVXJpIHVyaSkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gb25JbnNlcnRJbWFnZSBieSBVUkk6ICIgKyB1cmkuZ2V0UGF0aCgpCi0gICAgICAgICAgICAgICAgICAgICAgICArICIsIiArIHVyaS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGluc2VydEltYWdlU3BhbihuZXcgSW1hZ2VTcGFuKG1FU1QuZ2V0Q29udGV4dCgpLCB1cmkpKTsKLSAgICAgICAgICAgIG1FU1Qubm90aWZ5U3RhdGVDaGFuZ2VkKG1Nb2RlLCBtU3RhdGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgb25JbnNlcnRJbWFnZShpbnQgcmVzSUQpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIG9uSW5zZXJ0SW1hZ2UgYnkgcmVzSUQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGluc2VydEltYWdlU3BhbihuZXcgSW1hZ2VTcGFuKG1FU1QuZ2V0Q29udGV4dCgpLCByZXNJRCkpOwotICAgICAgICAgICAgbUVTVC5ub3RpZnlTdGF0ZUNoYW5nZWQobU1vZGUsIG1TdGF0ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBvbkluc2VydEhvcml6b250YWxMaW5lKCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gb25JbnNlcnRIb3Jpem9udGFsTGluZToiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGluc2VydEltYWdlU3BhbihuZXcgSG9yaXpvbnRhbExpbmVTcGFuKDB4RkYwMDAwMDAsIG1FU1QpKTsKLSAgICAgICAgICAgIG1FU1Qubm90aWZ5U3RhdGVDaGFuZ2VkKG1Nb2RlLCBtU3RhdGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgb25DbGVhclN0eWxlcygpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIG9uQ2xlYXJTdHlsZXMiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEVkaXRhYmxlIHR4dCA9IG1FU1QuZ2V0VGV4dCgpOwotICAgICAgICAgICAgaW50IGxlbiA9IHR4dC5sZW5ndGgoKTsKLSAgICAgICAgICAgIE9iamVjdFtdIHN0eWxlcyA9IHR4dC5nZXRTcGFucygwLCBsZW4sIE9iamVjdC5jbGFzcyk7Ci0gICAgICAgICAgICBmb3IgKE9iamVjdCBzdHlsZSA6IHN0eWxlcykgewotICAgICAgICAgICAgICAgIGlmIChzdHlsZSBpbnN0YW5jZW9mIFBhcmFncmFwaFN0eWxlIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZSBpbnN0YW5jZW9mIFF1b3RlU3BhbiB8fAotICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGUgaW5zdGFuY2VvZiBDaGFyYWN0ZXJTdHlsZSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoc3R5bGUgaW5zdGFuY2VvZiBJbWFnZVNwYW4pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydCA9IHR4dC5nZXRTcGFuU3RhcnQoc3R5bGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVuZCA9IHR4dC5nZXRTcGFuRW5kKHN0eWxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHR4dC5yZXBsYWNlKHN0YXJ0LCBlbmQsICIiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB0eHQucmVtb3ZlU3BhbihzdHlsZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUVTVC5zZXRCYWNrZ3JvdW5kRHJhd2FibGUobUVTVC5tRGVmYXVsdEJhY2tncm91bmQpOwotICAgICAgICAgICAgbUVTVC5tQmFja2dyb3VuZENvbG9yID0gREVGQVVMVF9CQUNLR1JPVU5EX0NPTE9SOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0SXRlbVNpemUoaW50IHNpemUpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIG9uQ2xpY2tTaXplSXRlbSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1TdGF0ZSA9PSBTVEFURV9TRUxFQ1RFRCB8fCBtU3RhdGUgPT0gU1RBVEVfU0VMRUNUX0ZJWCkgewotICAgICAgICAgICAgICAgIGNoYW5nZVNpemVTZWxlY3RlZFRleHQoc2l6ZSk7Ci0gICAgICAgICAgICAgICAgaGFuZGxlUmVzZXRFZGl0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRJdGVtQ29sb3IoaW50IGNvbG9yKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBvbkNsaWNrQ29sb3JJdGVtIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobVN0YXRlID09IFNUQVRFX1NFTEVDVEVEIHx8IG1TdGF0ZSA9PSBTVEFURV9TRUxFQ1RfRklYKSB7Ci0gICAgICAgICAgICAgICAgY2hhbmdlQ29sb3JTZWxlY3RlZFRleHQoY29sb3IpOwotICAgICAgICAgICAgICAgIGhhbmRsZVJlc2V0RWRpdCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0QWxpZ25tZW50KExheW91dC5BbGlnbm1lbnQgYWxpZ24pIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIG9uQ2xpY2tDb2xvckl0ZW0iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtU3RhdGUgPT0gU1RBVEVfU0VMRUNURUQgfHwgbVN0YXRlID09IFNUQVRFX1NFTEVDVF9GSVgpIHsKLSAgICAgICAgICAgICAgICBjaGFuZ2VBbGlnbihhbGlnbik7Ci0gICAgICAgICAgICAgICAgaGFuZGxlUmVzZXRFZGl0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0VkaXR0aW5nKCkgewotICAgICAgICAgICAgcmV0dXJuIG1FZGl0RmxhZzsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIElmIHRoZSBzdHlsZSBvZiB0aGUgc3BhbiBpcyBhZGRlZCwgYWRkIGNoZWNrIGNhc2UgZm9yIHRoYXQgc3R5bGUgKi8KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNTdHlsZWRUZXh0KCkgewotICAgICAgICAgICAgRWRpdGFibGUgdHh0ID0gbUVTVC5nZXRUZXh0KCk7Ci0gICAgICAgICAgICBpbnQgbGVuID0gdHh0Lmxlbmd0aCgpOwotICAgICAgICAgICAgaWYgKHR4dC5nZXRTcGFucygwLCBsZW4gLTEsIFBhcmFncmFwaFN0eWxlLmNsYXNzKS5sZW5ndGggPiAwIHx8Ci0gICAgICAgICAgICAgICAgICAgIHR4dC5nZXRTcGFucygwLCBsZW4gLTEsIFF1b3RlU3Bhbi5jbGFzcykubGVuZ3RoID4gMCB8fAotICAgICAgICAgICAgICAgICAgICB0eHQuZ2V0U3BhbnMoMCwgbGVuIC0xLCBDaGFyYWN0ZXJTdHlsZS5jbGFzcykubGVuZ3RoID4gMCB8fAotICAgICAgICAgICAgICAgICAgICBtRVNULm1CYWNrZ3JvdW5kQ29sb3IgIT0gREVGQVVMVF9CQUNLR1JPVU5EX0NPTE9SKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1NvZnRLZXlCbG9ja2VkKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Tb2Z0S2V5QmxvY2tGbGFnOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGludCBnZXRFZGl0TW9kZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBtTW9kZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0U2VsZWN0U3RhdGUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVN0YXRlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGludCBnZXRTZWxlY3Rpb25TdGFydCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtQ3VyU3RhcnQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgaW50IGdldFNlbGVjdGlvbkVuZCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtQ3VyRW5kOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGRvTmV4dEhhbmRsZSgpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIGRvTmV4dEhhbmRsZTogIiArIG1Nb2RlICsgIiwiICsgbVN0YXRlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN3aXRjaCAobU1vZGUpIHsKLSAgICAgICAgICAgIGNhc2UgTU9ERV9DT1BZOgotICAgICAgICAgICAgICAgIGhhbmRsZUNvcHkoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgTU9ERV9DVVQ6Ci0gICAgICAgICAgICAgICAgaGFuZGxlQ3V0KCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIE1PREVfUEFTVEU6Ci0gICAgICAgICAgICAgICAgaGFuZGxlUGFzdGUoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgTU9ERV9TSVpFOgotICAgICAgICAgICAgICAgIGhhbmRsZVNpemUoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgTU9ERV9DT0xPUjoKLSAgICAgICAgICAgICAgICBoYW5kbGVDb2xvcigpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBNT0RFX0FMSUdOOgotICAgICAgICAgICAgICAgIGhhbmRsZUFsaWduKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZUNhbmNlbCgpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIGhhbmRsZUNhbmNlbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbU1vZGUgPSBNT0RFX05PVEhJTkc7Ci0gICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9TRUxFQ1RfT0ZGOwotICAgICAgICAgICAgbUVkaXRGbGFnID0gZmFsc2U7Ci0gICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIGhhbmRsZUNhbmNlbDoiICsgbUVTVC5nZXRJbnB1dFR5cGUoKSk7Ci0gICAgICAgICAgICB1bmJsb2NrU29mdEtleSgpOwotICAgICAgICAgICAgdW5zZXRTZWxlY3QoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBoYW5kbGVDb21wbGV0ZSgpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIGhhbmRsZUNvbXBsZXRlIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIW1FZGl0RmxhZykgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtU3RhdGUgPT0gU1RBVEVfU0VMRUNURUQpIHsKLSAgICAgICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9TRUxFQ1RfRklYOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZG9OZXh0SGFuZGxlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgaGFuZGxlVGV4dFZpZXdGdW5jKGludCBtb2RlLCBpbnQgaWQpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIGhhbmRsZVRleHRWaWV3OiAiICsgbU1vZGUgKyAiLCIgKyBtU3RhdGUgKwotICAgICAgICAgICAgICAgICAgICAgICAgIiwiICsgaWQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFtRWRpdEZsYWcpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobU1vZGUgPT0gTU9ERV9OT1RISU5HIHx8IG1Nb2RlID09IE1PREVfU0VMRUNUKSB7Ci0gICAgICAgICAgICAgICAgbU1vZGUgPSBtb2RlOwotICAgICAgICAgICAgICAgIGlmIChtU3RhdGUgPT0gU1RBVEVfU0VMRUNURUQpIHsKLSAgICAgICAgICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfU0VMRUNUX0ZJWDsKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlVGV4dFZpZXdGdW5jKG1vZGUsIGlkKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBoYW5kbGVTZWxlY3QoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1Nb2RlICE9IG1vZGUpIHsKLSAgICAgICAgICAgICAgICBoYW5kbGVDYW5jZWwoKTsKLSAgICAgICAgICAgICAgICBtTW9kZSA9IG1vZGU7Ci0gICAgICAgICAgICAgICAgaGFuZGxlVGV4dFZpZXdGdW5jKG1vZGUsIGlkKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobVN0YXRlID09IFNUQVRFX1NFTEVDVF9GSVgpIHsKLSAgICAgICAgICAgICAgICBtRVNULm9uVGV4dENvbnRleHRNZW51SXRlbShpZCk7Ci0gICAgICAgICAgICAgICAgaGFuZGxlUmVzZXRFZGl0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgaGFuZGxlQ29weSgpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIGhhbmRsZUNvcHk6ICIgKyBtTW9kZSArICIsIiArIG1TdGF0ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBoYW5kbGVUZXh0Vmlld0Z1bmMoTU9ERV9DT1BZLCBhbmRyb2lkLlIuaWQuY29weSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgaGFuZGxlQ3V0KCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gaGFuZGxlQ29weTogIiArIG1Nb2RlICsgIiwiICsgbVN0YXRlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGhhbmRsZVRleHRWaWV3RnVuYyhNT0RFX0NVVCwgYW5kcm9pZC5SLmlkLmN1dCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgaGFuZGxlUGFzdGUoKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBoYW5kbGVQYXN0ZSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFtRWRpdEZsYWcpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtRVNULm9uVGV4dENvbnRleHRNZW51SXRlbShhbmRyb2lkLlIuaWQucGFzdGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZVNldFNwYW4oaW50IG1vZGUpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIGhhbmRsZVNldFNwYW46IiArIG1FZGl0RmxhZyArICIsIgotICAgICAgICAgICAgICAgICAgICAgICAgKyBtU3RhdGUgKyAnLCcgKyBtTW9kZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIW1FZGl0RmxhZykgewotICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICItLS0gaGFuZGxlU2V0U3BhbjogRWRpdGluZyBpcyBub3Qgc3RhcnRlZC4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobU1vZGUgPT0gTU9ERV9OT1RISU5HIHx8IG1Nb2RlID09IE1PREVfU0VMRUNUKSB7Ci0gICAgICAgICAgICAgICAgbU1vZGUgPSBtb2RlOwotICAgICAgICAgICAgICAgIGlmIChtU3RhdGUgPT0gU1RBVEVfU0VMRUNURUQpIHsKLSAgICAgICAgICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfU0VMRUNUX0ZJWDsKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlU2V0U3Bhbihtb2RlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBoYW5kbGVTZWxlY3QoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1Nb2RlICE9IG1vZGUpIHsKLSAgICAgICAgICAgICAgICBoYW5kbGVDYW5jZWwoKTsKLSAgICAgICAgICAgICAgICBtTW9kZSA9IG1vZGU7Ci0gICAgICAgICAgICAgICAgaGFuZGxlU2V0U3Bhbihtb2RlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1TdGF0ZSA9PSBTVEFURV9TRUxFQ1RfRklYKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1FU1Quc2V0SGludE1lc3NhZ2UoSElOVF9NU0dfTlVMTCk7Ci0gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobW9kZSkgewotICAgICAgICAgICAgICAgICAgICBjYXNlIE1PREVfQ09MT1I6Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRVNULm9uU2hvd0ZvcmVncm91bmRDb2xvckFsZXJ0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNT0RFX1NJWkU6Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRVNULm9uU2hvd1NpemVBbGVydCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgTU9ERV9BTElHTjoKLSAgICAgICAgICAgICAgICAgICAgICAgIG1FU1Qub25TaG93QWxpZ25BbGVydCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiLS0tIGhhbmRsZVNldFNwYW46IGludmFsaWQgbW9kZS4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBoYW5kbGVTZXRTcGFuOiBkbyBub3RoaW5nLiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBoYW5kbGVTaXplKCkgewotICAgICAgICAgICAgaGFuZGxlU2V0U3BhbihNT0RFX1NJWkUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZUNvbG9yKCkgewotICAgICAgICAgICAgaGFuZGxlU2V0U3BhbihNT0RFX0NPTE9SKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBoYW5kbGVBbGlnbigpIHsKLSAgICAgICAgICAgIGhhbmRsZVNldFNwYW4oTU9ERV9BTElHTik7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgaGFuZGxlU2VsZWN0KCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gaGFuZGxlU2VsZWN0OiIgKyBtRWRpdEZsYWcgKyAiLCIgKyBtU3RhdGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFtRWRpdEZsYWcpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobVN0YXRlID09IFNUQVRFX1NFTEVDVF9PRkYpIHsKLSAgICAgICAgICAgICAgICBpZiAoaXNUZXh0U2VsZWN0ZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiU2VsZWN0aW9uIGlzIG9mZiwgYnV0IHNlbGVjdGVkIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNldFNlbGVjdFN0YXJ0UG9zKCk7Ci0gICAgICAgICAgICAgICAgYmxvY2tTb2Z0S2V5KCk7Ci0gICAgICAgICAgICAgICAgbUVTVC5zZXRIaW50TWVzc2FnZShISU5UX01TR19TRUxFQ1RfRU5EKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobVN0YXRlID09IFNUQVRFX1NFTEVDVF9PTikgewotICAgICAgICAgICAgICAgIGlmIChpc1RleHRTZWxlY3RlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJTZWxlY3Rpb24gbm93IHN0YXJ0LCBidXQgc2VsZWN0ZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc2V0U2VsZWN0ZWRFbmRQb3MoKTsKLSAgICAgICAgICAgICAgICBtRVNULnNldEhpbnRNZXNzYWdlKEhJTlRfTVNHX1BVU0hfQ09NUEVURSk7Ci0gICAgICAgICAgICAgICAgZG9OZXh0SGFuZGxlKCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1TdGF0ZSA9PSBTVEFURV9TRUxFQ1RFRCkgewotICAgICAgICAgICAgICAgIGlmICghaXNUZXh0U2VsZWN0ZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiU2VsZWN0aW9uIGlzIGRvbmUsIGJ1dCBub3Qgc2VsZWN0ZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc2V0U2VsZWN0ZWRFbmRQb3MoKTsKLSAgICAgICAgICAgICAgICBkb05leHRIYW5kbGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBoYW5kbGVTZWxlY3RBbGwoKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBoYW5kbGVTZWxlY3RBbGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghbUVkaXRGbGFnKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUVTVC5zZWxlY3RBbGwoKTsKLSAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX1NFTEVDVEVEOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZVJlc2V0RWRpdCgpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiUmVzZXQgRWRpdG9yIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBibG9ja1NvZnRLZXkoKTsKLSAgICAgICAgICAgIGhhbmRsZUNhbmNlbCgpOwotICAgICAgICAgICAgbUVkaXRGbGFnID0gdHJ1ZTsKLSAgICAgICAgICAgIG1FU1Quc2V0SGludE1lc3NhZ2UoSElOVF9NU0dfU0VMRUNUX1NUQVJUKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBzZXRTZWxlY3Rpb24oKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBvblNlbGVjdDoiICsgbUN1clN0YXJ0ICsgIiwiICsgbUN1ckVuZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobUN1clN0YXJ0ID49IDAgJiYgbUN1clN0YXJ0IDw9IG1FU1QuZ2V0VGV4dCgpLmxlbmd0aCgpCi0gICAgICAgICAgICAgICAgICAgICYmIG1DdXJFbmQgPj0gMCAmJiBtQ3VyRW5kIDw9IG1FU1QuZ2V0VGV4dCgpLmxlbmd0aCgpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1DdXJTdGFydCA8IG1DdXJFbmQpIHsKLSAgICAgICAgICAgICAgICAgICAgbUVTVC5zZXRTZWxlY3Rpb24obUN1clN0YXJ0LCBtQ3VyRW5kKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtRVNULnNldFNlbGVjdGlvbihtQ3VyRW5kLCBtQ3VyU3RhcnQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9TRUxFQ1RFRDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywKLSAgICAgICAgICAgICAgICAgICAgICAgICJTZWxlY3QgaXMgb24sIGJ1dCBjdXJzb3IgcG9zaXRpb25zIGFyZSBpbGxpZ2FsLjoiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbUVTVC5nZXRUZXh0KCkubGVuZ3RoKCkgKyAiLCIgKyBtQ3VyU3RhcnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCIgKyBtQ3VyRW5kKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCB1bnNldFNlbGVjdCgpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIG9mZlNlbGVjdCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW50IGN1cnJwb3MgPSBtRVNULmdldFNlbGVjdGlvblN0YXJ0KCk7Ci0gICAgICAgICAgICBtRVNULnNldFNlbGVjdGlvbihjdXJycG9zLCBjdXJycG9zKTsKLSAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX1NFTEVDVF9PRkY7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgc2V0U2VsZWN0U3RhcnRQb3MoKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBzZXRTZWxlY3RTdGFydFBvcyIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUN1clN0YXJ0ID0gbUVTVC5nZXRTZWxlY3Rpb25TdGFydCgpOwotICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfU0VMRUNUX09OOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHNldFNlbGVjdGVkRW5kUG9zKCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gc2V0U2VsZWN0RW5kUG9zOiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1FU1QuZ2V0U2VsZWN0aW9uU3RhcnQoKSA9PSBtQ3VyU3RhcnQpIHsKLSAgICAgICAgICAgICAgICBzZXRTZWxlY3RlZEVuZFBvcyhtRVNULmdldFNlbGVjdGlvbkVuZCgpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc2V0U2VsZWN0ZWRFbmRQb3MobUVTVC5nZXRTZWxlY3Rpb25TdGFydCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFNlbGVjdGVkRW5kUG9zKGludCBwb3MpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIHNldFNlbGVjdGVkRW5kUG9zOiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUN1ckVuZCA9IHBvczsKLSAgICAgICAgICAgIHNldFNlbGVjdGlvbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGlzVGV4dFNlbGVjdGVkKCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gaXNUZXh0U2VsZWN0ZWQ6IiArIG1DdXJTdGFydCArICIsIgotICAgICAgICAgICAgICAgICAgICAgICAgKyBtQ3VyRW5kKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiAobUN1clN0YXJ0ICE9IG1DdXJFbmQpCi0gICAgICAgICAgICAgICAgICAgICYmIChtU3RhdGUgPT0gU1RBVEVfU0VMRUNURUQgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3RhdGUgPT0gU1RBVEVfU0VMRUNUX0ZJWCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgc2V0U3R5bGVkVGV4dFNwYW4oT2JqZWN0IHNwYW4sIGludCBzdGFydCwgaW50IGVuZCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gc2V0U3R5bGVkVGV4dFNwYW46IiArIG1Nb2RlICsgIiwiCi0gICAgICAgICAgICAgICAgICAgICAgICArIHN0YXJ0ICsgIiwiICsgZW5kKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzdGFydCA8IGVuZCkgewotICAgICAgICAgICAgICAgIG1FU1QuZ2V0VGV4dCgpLnNldFNwYW4oc3Bhbiwgc3RhcnQsIGVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIFNwYW5uYWJsZS5TUEFOX0VYQ0xVU0lWRV9FWENMVVNJVkUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtRVNULmdldFRleHQoKS5zZXRTcGFuKHNwYW4sIGVuZCwgc3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICBTcGFubmFibGUuU1BBTl9FWENMVVNJVkVfRVhDTFVTSVZFKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBjaGFuZ2VTaXplU2VsZWN0ZWRUZXh0KGludCBzaXplKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBjaGFuZ2VTaXplOiIgKyBzaXplKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldFN0eWxlZFRleHRTcGFuKG5ldyBBYnNvbHV0ZVNpemVTcGFuKHNpemUpLAotICAgICAgICAgICAgICAgIG1DdXJTdGFydCwgbUN1ckVuZCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgY2hhbmdlQ29sb3JTZWxlY3RlZFRleHQoaW50IGNvbG9yKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBjaGFuZ2VDb2xvcjoiICsgY29sb3IpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0U3R5bGVkVGV4dFNwYW4obmV3IEZvcmVncm91bmRDb2xvclNwYW4oY29sb3IpLAotICAgICAgICAgICAgICAgIG1DdXJTdGFydCwgbUN1ckVuZCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgY2hhbmdlQWxpZ24oTGF5b3V0LkFsaWdubWVudCBhbGlnbikgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gY2hhbmdlQWxpZ246IiArIGFsaWduKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldFN0eWxlZFRleHRTcGFuKG5ldyBBbGlnbm1lbnRTcGFuLlN0YW5kYXJkKGFsaWduKSwKLSAgICAgICAgICAgICAgICAgICAgZmluZExpbmVTdGFydChtRVNULmdldFRleHQoKSwgbUN1clN0YXJ0KSwKLSAgICAgICAgICAgICAgICAgICAgZmluZExpbmVFbmQobUVTVC5nZXRUZXh0KCksIG1DdXJFbmQpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgaW50IGZpbmRMaW5lU3RhcnQoRWRpdGFibGUgdGV4dCwgaW50IGN1cnJlbnQpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIGZpbmRMaW5lU3RhcnQ6IGN1cnI6IiArIGN1cnJlbnQgKwotICAgICAgICAgICAgICAgICAgICAgICAgIiwgbGVuZ3RoOiIgKyB0ZXh0Lmxlbmd0aCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludCBwb3MgPSBjdXJyZW50OwotICAgICAgICAgICAgZm9yICg7IHBvcyA+IDA7IHBvcy0tKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHRleHQuY2hhckF0KHBvcyAtIDEpID09ICdcbicpIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHBvczsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBpbnNlcnRJbWFnZVNwYW4oSW1hZ2VTcGFuIHNwYW4pIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIGluc2VydEltYWdlU3BhbiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHNwYW4gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gaW5zZXJ0aW1hZ2VzcGFuOiIgKyBzcGFuLmdldERyYXdhYmxlKCkuZ2V0SW50cmluc2ljSGVpZ2h0KCkgKyAiLCIgKyBzcGFuLmdldERyYXdhYmxlKCkuZ2V0SW50cmluc2ljV2lkdGgoKSk7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBpbnNlcnRpbWFnZXNwYW46IiArIHNwYW4uZ2V0RHJhd2FibGUoKS5nZXRDbGFzcygpKTsKLSAgICAgICAgICAgICAgICBpbnQgY3VycG9zID0gbUVTVC5nZXRTZWxlY3Rpb25TdGFydCgpOwotICAgICAgICAgICAgICAgIG1FU1QuZ2V0VGV4dCgpLmluc2VydChjdXJwb3MsICJcdUZGRkMiKTsKLSAgICAgICAgICAgICAgICBtRVNULmdldFRleHQoKS5zZXRTcGFuKHNwYW4sIGN1cnBvcywgY3VycG9zICsgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFNwYW5uYWJsZS5TUEFOX0VYQ0xVU0lWRV9FWENMVVNJVkUpOwotICAgICAgICAgICAgICAgIG1FU1Qubm90aWZ5U3RhdGVDaGFuZ2VkKG1Nb2RlLCBtU3RhdGUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiLS0tIGluc2VydEltYWdlU3BhbjogbnVsbCBzcGFuIHdhcyBpbnNlcnRlZCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBpbnQgZmluZExpbmVFbmQoRWRpdGFibGUgdGV4dCwgaW50IGN1cnJlbnQpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIGZpbmRMaW5lRW5kOiBjdXJyOiIgKyBjdXJyZW50ICsKLSAgICAgICAgICAgICAgICAgICAgICAgICIsIGxlbmd0aDoiICsgdGV4dC5sZW5ndGgoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnQgcG9zID0gY3VycmVudDsKLSAgICAgICAgICAgIGZvciAoOyBwb3MgPCB0ZXh0Lmxlbmd0aCgpOyBwb3MrKykgewotICAgICAgICAgICAgICAgIGlmIChwb3MgPiAwICYmIHRleHQuY2hhckF0KHBvcyAtIDEpID09ICdcbicpIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHBvczsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBibG9ja1NvZnRLZXkoKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBibG9ja1NvZnRLZXk6Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBJbnB1dE1ldGhvZE1hbmFnZXIgaW1tID0gKElucHV0TWV0aG9kTWFuYWdlcikgbUVTVC5nZXRDb250ZXh0KCkuCi0gICAgICAgICAgICBnZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuSU5QVVRfTUVUSE9EX1NFUlZJQ0UpOwotICAgICAgICAgICAgaW1tLmhpZGVTb2Z0SW5wdXRGcm9tV2luZG93KG1FU1QuZ2V0V2luZG93VG9rZW4oKSwgMCk7Ci0gICAgICAgICAgICBtRVNULnNldE9uQ2xpY2tMaXN0ZW5lcigKLSAgICAgICAgICAgICAgICAgICAgbmV3IE9uQ2xpY2tMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBvbnRyYWNrYmFsbGNsaWNrOiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uRml4U2VsZWN0ZWRJdGVtKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIG1Tb2Z0S2V5QmxvY2tGbGFnID0gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCB1bmJsb2NrU29mdEtleSgpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIHVuYmxvY2tTb2Z0S2V5OiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUVTVC5zZXRPbkNsaWNrTGlzdGVuZXIobnVsbCk7Ci0gICAgICAgICAgICBtU29mdEtleUJsb2NrRmxhZyA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBjbGFzcyBTdHlsZWRUZXh0Q29udmVydGVyIHsKLSAgICAgICAgcHJpdmF0ZSBFZGl0U3R5bGVkVGV4dCBtRVNUOwotCi0gICAgICAgIHB1YmxpYyBTdHlsZWRUZXh0Q29udmVydGVyKEVkaXRTdHlsZWRUZXh0IGVzdCkgewotICAgICAgICAgICAgbUVTVCA9IGVzdDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0SHRtbCgpIHsKLSAgICAgICAgICAgIFN0cmluZyBodG1sQm9keSA9IEh0bWwudG9IdG1sKG1FU1QuZ2V0VGV4dCgpKTsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIGdldENvbnZlcnRlZEJvZHk6IiArIGh0bWxCb2R5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBodG1sQm9keTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGdldFVyaUFycmF5KEFycmF5TGlzdDxVcmk+IHVyaXMsIEVkaXRhYmxlIHRleHQpIHsKLSAgICAgICAgICAgIHVyaXMuY2xlYXIoKTsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIGdldFVyaUFycmF5OiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW50IGxlbiA9IHRleHQubGVuZ3RoKCk7Ci0gICAgICAgICAgICBpbnQgbmV4dDsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGV4dC5sZW5ndGgoKTsgaSA9IG5leHQpIHsKLSAgICAgICAgICAgICAgICBuZXh0ID0gdGV4dC5uZXh0U3BhblRyYW5zaXRpb24oaSwgbGVuLCBJbWFnZVNwYW4uY2xhc3MpOwotICAgICAgICAgICAgICAgIEltYWdlU3BhbltdIGltYWdlcyA9IHRleHQuZ2V0U3BhbnMoaSwgbmV4dCwgSW1hZ2VTcGFuLmNsYXNzKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGltYWdlcy5sZW5ndGg7IGorKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIGdldFVyaUFycmF5OiBmb3VuZEFycmF5IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSW1hZ2VTcGFuKSBpbWFnZXNbal0pLmdldFNvdXJjZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB1cmlzLmFkZChVcmkucGFyc2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJbWFnZVNwYW4pIGltYWdlc1tqXSkuZ2V0U291cmNlKCkpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBTZXRIdG1sIChTdHJpbmcgaHRtbCkgewotICAgICAgICAgICAgZmluYWwgU3Bhbm5lZCBzcGFubmVkID0gSHRtbC5mcm9tSHRtbChodG1sLCBuZXcgSHRtbC5JbWFnZUdldHRlcigpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgRHJhd2FibGUgZ2V0RHJhd2FibGUoU3RyaW5nIHNyYykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIHNldGh0bWw6IHNyYz0iK3NyYyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzcmMuc3RhcnRzV2l0aCgiY29udGVudDovLyIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBVcmkgdXJpID0gVXJpLnBhcnNlKHNyYyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIGlzID0gbUVTVC5nZXRDb250ZXh0KCkuZ2V0Q29udGVudFJlc29sdmVyKCkub3BlbklucHV0U3RyZWFtKHVyaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQml0bWFwIGJpdG1hcCA9IEJpdG1hcEZhY3RvcnkuZGVjb2RlU3RyZWFtKGlzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBEcmF3YWJsZSBkcmF3YWJsZSA9IG5ldyBCaXRtYXBEcmF3YWJsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldENvbnRleHQoKS5nZXRSZXNvdXJjZXMoKSwgYml0bWFwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3YWJsZS5zZXRCb3VuZHMoMCwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyYXdhYmxlLmdldEludHJpbnNpY1dpZHRoKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3YWJsZS5nZXRJbnRyaW5zaWNIZWlnaHQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZHJhd2FibGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICItLS0gc2V0IGh0bWw6IEZhaWxlZCB0byBsb2FkZWQgY29udGVudCAiICsgdXJpLCBlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiICB1bmtub3duIHNyYz0iK3NyYyk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0sIG51bGwpOwotICAgICAgICAgICAgbUVTVC5zZXRUZXh0KHNwYW5uZWQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBjbGFzcyBTdHlsZWRUZXh0RGlhbG9nIHsKLSAgICAgICAgQnVpbGRlciBtQnVpbGRlcjsKLSAgICAgICAgQ2hhclNlcXVlbmNlIG1Db2xvclRpdGxlOwotICAgICAgICBDaGFyU2VxdWVuY2UgbVNpemVUaXRsZTsKLSAgICAgICAgQ2hhclNlcXVlbmNlIG1BbGlnblRpdGxlOwotICAgICAgICBDaGFyU2VxdWVuY2VbXSBtQ29sb3JOYW1lczsKLSAgICAgICAgQ2hhclNlcXVlbmNlW10gbUNvbG9ySW50czsKLSAgICAgICAgQ2hhclNlcXVlbmNlW10gbVNpemVOYW1lczsKLSAgICAgICAgQ2hhclNlcXVlbmNlW10gbVNpemVEaXNwbGF5SW50czsKLSAgICAgICAgQ2hhclNlcXVlbmNlW10gbVNpemVTZW5kSW50czsKLSAgICAgICAgQ2hhclNlcXVlbmNlW10gbUFsaWduTmFtZXM7Ci0gICAgICAgIEVkaXRTdHlsZWRUZXh0IG1FU1Q7Ci0KLSAgICAgICAgcHVibGljIFN0eWxlZFRleHREaWFsb2coRWRpdFN0eWxlZFRleHQgZXN0KSB7Ci0gICAgICAgICAgICBtRVNUID0gZXN0OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0QnVpbGRlcihCdWlsZGVyIGJ1aWxkZXIpIHsKLSAgICAgICAgICAgIG1CdWlsZGVyID0gYnVpbGRlcjsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldENvbG9yQWxlcnRQYXJhbXMoQ2hhclNlcXVlbmNlIGNvbG9ydGl0bGUsCi0gICAgICAgICAgICAgICAgQ2hhclNlcXVlbmNlW10gY29sb3JuYW1lcywgQ2hhclNlcXVlbmNlW10gY29sb3JpbnRzKSB7Ci0gICAgICAgICAgICBtQ29sb3JUaXRsZSA9IGNvbG9ydGl0bGU7Ci0gICAgICAgICAgICBtQ29sb3JOYW1lcyA9IGNvbG9ybmFtZXM7Ci0gICAgICAgICAgICBtQ29sb3JJbnRzID0gY29sb3JpbnRzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0U2l6ZUFsZXJ0UGFyYW1zKENoYXJTZXF1ZW5jZSBzaXpldGl0bGUsCi0gICAgICAgICAgICAgICAgQ2hhclNlcXVlbmNlW10gc2l6ZW5hbWVzLCBDaGFyU2VxdWVuY2VbXSBzaXplZGlzcGxheWludHMsCi0gICAgICAgICAgICAgICAgQ2hhclNlcXVlbmNlW10gc2l6ZXNlbmRpbnRzKSB7Ci0gICAgICAgICAgICBtU2l6ZVRpdGxlID0gc2l6ZXRpdGxlOwotICAgICAgICAgICAgbVNpemVOYW1lcyA9IHNpemVuYW1lczsKLSAgICAgICAgICAgIG1TaXplRGlzcGxheUludHMgPSBzaXplZGlzcGxheWludHM7Ci0gICAgICAgICAgICBtU2l6ZVNlbmRJbnRzID0gc2l6ZXNlbmRpbnRzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0QWxpZ25BbGVydFBhcmFtcyhDaGFyU2VxdWVuY2UgYWxpZ250aXRsZSwKLSAgICAgICAgICAgICAgICBDaGFyU2VxdWVuY2VbXSBhbGlnbm5hbWVzKSB7Ci0gICAgICAgICAgICBtQWxpZ25UaXRsZSA9IGFsaWdudGl0bGU7Ci0gICAgICAgICAgICBtQWxpZ25OYW1lcyA9IGFsaWdubmFtZXM7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gY2hlY2tDb2xvckFsZXJ0UGFyYW1zKCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gY2hlY2tQYXJhbXMiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtQnVpbGRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIi0tLSBidWlsZGVyIGlzIG51bGwuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfSBlbHNlIGlmIChtQ29sb3JUaXRsZSA9PSBudWxsIHx8IG1Db2xvck5hbWVzID09IG51bGwKLSAgICAgICAgICAgICAgICAgICAgfHwgbUNvbG9ySW50cyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIi0tLSBjb2xvciBhbGVydCBwYXJhbXMgYXJlIG51bGwuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfSBlbHNlIGlmIChtQ29sb3JOYW1lcy5sZW5ndGggIT0gbUNvbG9ySW50cy5sZW5ndGgpIHsKLSAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiLS0tIHRoZSBsZW5ndGggb2YgY29sb3IgYWxlcnQgcGFyYW1zIGFyZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICArICJkaWZmZXJlbnQuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gY2hlY2tTaXplQWxlcnRQYXJhbXMoKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBjaGVja1BhcmFtcyIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1CdWlsZGVyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiLS0tIGJ1aWxkZXIgaXMgbnVsbC4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1TaXplVGl0bGUgPT0gbnVsbCB8fCBtU2l6ZU5hbWVzID09IG51bGwKLSAgICAgICAgICAgICAgICAgICAgfHwgbVNpemVEaXNwbGF5SW50cyA9PSBudWxsIHx8IG1TaXplU2VuZEludHMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICItLS0gc2l6ZSBhbGVydCBwYXJhbXMgYXJlIG51bGwuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfSBlbHNlIGlmIChtU2l6ZU5hbWVzLmxlbmd0aCAhPSBtU2l6ZURpc3BsYXlJbnRzLmxlbmd0aAotICAgICAgICAgICAgICAgICAgICAmJiBtU2l6ZVNlbmRJbnRzLmxlbmd0aCAhPSBtU2l6ZURpc3BsYXlJbnRzLmxlbmd0aCkgewotICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICItLS0gdGhlIGxlbmd0aCBvZiBzaXplIGFsZXJ0IHBhcmFtcyBhcmUgIgotICAgICAgICAgICAgICAgICAgICAgICAgKyAiZGlmZmVyZW50LiIpOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGNoZWNrQWxpZ25BbGVydFBhcmFtcygpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIGNoZWNrQWxpZ25BbGVydFBhcmFtcyIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1CdWlsZGVyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiLS0tIGJ1aWxkZXIgaXMgbnVsbC4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1BbGlnblRpdGxlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiLS0tIGFsaWduIGFsZXJ0IHBhcmFtcyBhcmUgbnVsbC4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBvblNob3dGb3JlZ3JvdW5kQ29sb3JBbGVydERpYWxvZygpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIG9uU2hvd0ZvcmVncm91bmRDb2xvckFsZXJ0RGlhbG9nIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIWNoZWNrQ29sb3JBbGVydFBhcmFtcygpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUJ1aWxkZXIuc2V0VGl0bGUobUNvbG9yVGl0bGUpOwotICAgICAgICAgICAgbUJ1aWxkZXIuc2V0SWNvbigwKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLgotICAgICAgICAgICAgc2V0SXRlbXMobUNvbG9yTmFtZXMsCi0gICAgICAgICAgICAgICAgICAgIG5ldyBEaWFsb2dJbnRlcmZhY2UuT25DbGlja0xpc3RlbmVyKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soRGlhbG9nSW50ZXJmYWNlIGRpYWxvZywgaW50IHdoaWNoKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKCJFRVRWTSIsICJtQnVpbGRlci5vbmNsaWNrOiIgKyB3aGljaCk7Ci0gICAgICAgICAgICAgICAgICAgIGludCBjb2xvciA9IEludGVnZXIucGFyc2VJbnQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKFN0cmluZykgbUNvbG9ySW50c1t3aGljaF0sIDE2KSAtIDB4MDEwMDAwMDA7Ci0gICAgICAgICAgICAgICAgICAgIG1FU1Quc2V0SXRlbUNvbG9yKGNvbG9yKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIG1CdWlsZGVyLnNob3coKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBvblNob3dCYWNrZ3JvdW5kQ29sb3JBbGVydERpYWxvZygpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIG9uU2hvd0JhY2tncm91bmRDb2xvckFsZXJ0RGlhbG9nIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIWNoZWNrQ29sb3JBbGVydFBhcmFtcygpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUJ1aWxkZXIuc2V0VGl0bGUobUNvbG9yVGl0bGUpOwotICAgICAgICAgICAgbUJ1aWxkZXIuc2V0SWNvbigwKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLgotICAgICAgICAgICAgc2V0SXRlbXMobUNvbG9yTmFtZXMsCi0gICAgICAgICAgICAgICAgICAgIG5ldyBEaWFsb2dJbnRlcmZhY2UuT25DbGlja0xpc3RlbmVyKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soRGlhbG9nSW50ZXJmYWNlIGRpYWxvZywgaW50IHdoaWNoKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKCJFRVRWTSIsICJtQnVpbGRlci5vbmNsaWNrOiIgKyB3aGljaCk7Ci0gICAgICAgICAgICAgICAgICAgIGludCBjb2xvciA9IEludGVnZXIucGFyc2VJbnQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKFN0cmluZykgbUNvbG9ySW50c1t3aGljaF0sIDE2KSAtIDB4MDEwMDAwMDA7Ci0gICAgICAgICAgICAgICAgICAgIG1FU1Quc2V0QmFja2dyb3VuZENvbG9yKGNvbG9yKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIG1CdWlsZGVyLnNob3coKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBvblNob3dTaXplQWxlcnREaWFsb2coKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBvblNob3dTaXplQWxlcnREaWFsb2ciKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghY2hlY2tTaXplQWxlcnRQYXJhbXMoKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1CdWlsZGVyLnNldFRpdGxlKG1TaXplVGl0bGUpOwotICAgICAgICAgICAgbUJ1aWxkZXIuc2V0SWNvbigwKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLgotICAgICAgICAgICAgc2V0SXRlbXMobVNpemVOYW1lcywKLSAgICAgICAgICAgICAgICAgICAgbmV3IERpYWxvZ0ludGVyZmFjZS5PbkNsaWNrTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhEaWFsb2dJbnRlcmZhY2UgZGlhbG9nLCBpbnQgd2hpY2gpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIm1CdWlsZGVyLm9uY2xpY2s6IiArIHdoaWNoKTsKLSAgICAgICAgICAgICAgICAgICAgaW50IHNpemUgPSBJbnRlZ2VyCi0gICAgICAgICAgICAgICAgICAgIC5wYXJzZUludCgoU3RyaW5nKSBtU2l6ZURpc3BsYXlJbnRzW3doaWNoXSk7Ci0gICAgICAgICAgICAgICAgICAgIG1FU1Quc2V0SXRlbVNpemUoc2l6ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICBtQnVpbGRlci5zaG93KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgb25TaG93QWxpZ25BbGVydERpYWxvZygpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIG9uU2hvd0FsaWduQWxlcnREaWFsb2ciKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghY2hlY2tBbGlnbkFsZXJ0UGFyYW1zKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQnVpbGRlci5zZXRUaXRsZShtQWxpZ25UaXRsZSk7Ci0gICAgICAgICAgICBtQnVpbGRlci5zZXRJY29uKDApOwotICAgICAgICAgICAgbUJ1aWxkZXIuCi0gICAgICAgICAgICBzZXRJdGVtcyhtQWxpZ25OYW1lcywKLSAgICAgICAgICAgICAgICAgICAgbmV3IERpYWxvZ0ludGVyZmFjZS5PbkNsaWNrTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhEaWFsb2dJbnRlcmZhY2UgZGlhbG9nLCBpbnQgd2hpY2gpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIm1CdWlsZGVyLm9uY2xpY2s6IiArIHdoaWNoKTsKLSAgICAgICAgICAgICAgICAgICAgTGF5b3V0LkFsaWdubWVudCBhbGlnbiA9IExheW91dC5BbGlnbm1lbnQuQUxJR05fTk9STUFMOwotICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHdoaWNoKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduID0gTGF5b3V0LkFsaWdubWVudC5BTElHTl9OT1JNQUw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ24gPSBMYXlvdXQuQWxpZ25tZW50LkFMSUdOX0NFTlRFUjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAgICAgICAgICAgICBhbGlnbiA9IExheW91dC5BbGlnbm1lbnQuQUxJR05fT1BQT1NJVEU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1FU1Quc2V0QWxpZ25tZW50KGFsaWduKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIG1CdWlsZGVyLnNob3coKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgU3R5bGVkVGV4dEFycm93S2V5TWV0aG9kIGV4dGVuZHMgQXJyb3dLZXlNb3ZlbWVudE1ldGhvZCB7Ci0gICAgICAgIEVkaXRvck1hbmFnZXIgbU1hbmFnZXI7Ci0gICAgICAgIFN0eWxlZFRleHRBcnJvd0tleU1ldGhvZChFZGl0b3JNYW5hZ2VyIG1hbmFnZXIpIHsKLSAgICAgICAgICAgIHN1cGVyKCk7Ci0gICAgICAgICAgICBtTWFuYWdlciA9IG1hbmFnZXI7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gb25LZXlEb3duKFRleHRWaWV3IHdpZGdldCwgU3Bhbm5hYmxlIGJ1ZmZlciwKLSAgICAgICAgICAgICAgICBpbnQga2V5Q29kZSwgS2V5RXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgIGlmICghbU1hbmFnZXIuaXNTb2Z0S2V5QmxvY2tlZCgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVyLm9uS2V5RG93bih3aWRnZXQsIGJ1ZmZlciwga2V5Q29kZSwgZXZlbnQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGV4ZWN1dGVEb3duKHdpZGdldCwgYnVmZmVyLCBrZXlDb2RlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBpbnQgZ2V0RW5kUG9zKFRleHRWaWV3IHdpZGdldCkgewotICAgICAgICAgICAgaW50IGVuZDsKLSAgICAgICAgICAgIGlmICh3aWRnZXQuZ2V0U2VsZWN0aW9uU3RhcnQoKSA9PSBtTWFuYWdlci5nZXRTZWxlY3Rpb25TdGFydCgpKSB7Ci0gICAgICAgICAgICAgICAgZW5kID0gd2lkZ2V0LmdldFNlbGVjdGlvbkVuZCgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBlbmQgPSB3aWRnZXQuZ2V0U2VsZWN0aW9uU3RhcnQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBlbmQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gdXAoVGV4dFZpZXcgd2lkZ2V0LCBTcGFubmFibGUgYnVmZmVyKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSB1cDoiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIExheW91dCBsYXlvdXQgPSB3aWRnZXQuZ2V0TGF5b3V0KCk7Ci0gICAgICAgICAgICBpbnQgZW5kID0gZ2V0RW5kUG9zKHdpZGdldCk7Ci0gICAgICAgICAgICBpbnQgbGluZSA9IGxheW91dC5nZXRMaW5lRm9yT2Zmc2V0KGVuZCk7Ci0gICAgICAgICAgICBpZiAobGluZSA+IDApIHsKLSAgICAgICAgICAgICAgICBpbnQgdG87Ci0gICAgICAgICAgICAgICAgaWYgKGxheW91dC5nZXRQYXJhZ3JhcGhEaXJlY3Rpb24obGluZSkgPT0KLSAgICAgICAgICAgICAgICAgICAgbGF5b3V0LmdldFBhcmFncmFwaERpcmVjdGlvbihsaW5lIC0gMSkpIHsKLSAgICAgICAgICAgICAgICAgICAgZmxvYXQgaCA9IGxheW91dC5nZXRQcmltYXJ5SG9yaXpvbnRhbChlbmQpOwotICAgICAgICAgICAgICAgICAgICB0byA9IGxheW91dC5nZXRPZmZzZXRGb3JIb3Jpem9udGFsKGxpbmUgLSAxLCBoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0byA9IGxheW91dC5nZXRMaW5lU3RhcnQobGluZSAtIDEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtTWFuYWdlci5zZXRTZWxlY3RlZEVuZFBvcyh0byk7Ci0gICAgICAgICAgICAgICAgbU1hbmFnZXIub25DdXJzb3JNb3ZlZCgpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGRvd24oVGV4dFZpZXcgd2lkZ2V0LCBTcGFubmFibGUgYnVmZmVyKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBkb3duOiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTGF5b3V0IGxheW91dCA9IHdpZGdldC5nZXRMYXlvdXQoKTsKLSAgICAgICAgICAgIGludCBlbmQgPSBnZXRFbmRQb3Mod2lkZ2V0KTsKLSAgICAgICAgICAgIGludCBsaW5lID0gbGF5b3V0LmdldExpbmVGb3JPZmZzZXQoZW5kKTsKLSAgICAgICAgICAgIGlmIChsaW5lIDwgbGF5b3V0LmdldExpbmVDb3VudCgpIC0gMSkgewotICAgICAgICAgICAgICAgIGludCB0bzsKLSAgICAgICAgICAgICAgICBpZiAobGF5b3V0LmdldFBhcmFncmFwaERpcmVjdGlvbihsaW5lKSA9PQotICAgICAgICAgICAgICAgICAgICBsYXlvdXQuZ2V0UGFyYWdyYXBoRGlyZWN0aW9uKGxpbmUgKyAxKSkgewotICAgICAgICAgICAgICAgICAgICBmbG9hdCBoID0gbGF5b3V0LmdldFByaW1hcnlIb3Jpem9udGFsKGVuZCk7Ci0gICAgICAgICAgICAgICAgICAgIHRvID0gbGF5b3V0LmdldE9mZnNldEZvckhvcml6b250YWwobGluZSArIDEsIGgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHRvID0gbGF5b3V0LmdldExpbmVTdGFydChsaW5lICsgMSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1NYW5hZ2VyLnNldFNlbGVjdGVkRW5kUG9zKHRvKTsKLSAgICAgICAgICAgICAgICBtTWFuYWdlci5vbkN1cnNvck1vdmVkKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gbGVmdChUZXh0VmlldyB3aWRnZXQsIFNwYW5uYWJsZSBidWZmZXIpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIGxlZnQ6Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBMYXlvdXQgbGF5b3V0ID0gd2lkZ2V0LmdldExheW91dCgpOwotICAgICAgICAgICAgaW50IHRvID0gbGF5b3V0LmdldE9mZnNldFRvTGVmdE9mKGdldEVuZFBvcyh3aWRnZXQpKTsKLSAgICAgICAgICAgIG1NYW5hZ2VyLnNldFNlbGVjdGVkRW5kUG9zKHRvKTsKLSAgICAgICAgICAgIG1NYW5hZ2VyLm9uQ3Vyc29yTW92ZWQoKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIHJpZ2h0KFRleHRWaWV3IHdpZGdldCwgU3Bhbm5hYmxlIGJ1ZmZlcikgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gcmlnaHQ6Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBMYXlvdXQgbGF5b3V0ID0gd2lkZ2V0LmdldExheW91dCgpOwotICAgICAgICAgICAgaW50IHRvID0gbGF5b3V0LmdldE9mZnNldFRvUmlnaHRPZihnZXRFbmRQb3Mod2lkZ2V0KSk7Ci0gICAgICAgICAgICBtTWFuYWdlci5zZXRTZWxlY3RlZEVuZFBvcyh0byk7Ci0gICAgICAgICAgICBtTWFuYWdlci5vbkN1cnNvck1vdmVkKCk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBleGVjdXRlRG93bihUZXh0VmlldyB3aWRnZXQsIFNwYW5uYWJsZSBidWZmZXIsCi0gICAgICAgICAgICAgICAgaW50IGtleUNvZGUpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIGV4ZWN1dGVEb3duOiAiICsga2V5Q29kZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBib29sZWFuIGhhbmRsZWQgPSBmYWxzZTsKLQotICAgICAgICAgICAgc3dpdGNoIChrZXlDb2RlKSB7Ci0gICAgICAgICAgICBjYXNlIEtleUV2ZW50LktFWUNPREVfRFBBRF9VUDoKLSAgICAgICAgICAgICAgICBoYW5kbGVkIHw9IHVwKHdpZGdldCwgYnVmZmVyKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0RPV046Ci0gICAgICAgICAgICAgICAgaGFuZGxlZCB8PSBkb3duKHdpZGdldCwgYnVmZmVyKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0xFRlQ6Ci0gICAgICAgICAgICAgICAgaGFuZGxlZCB8PSBsZWZ0KHdpZGdldCwgYnVmZmVyKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX1JJR0hUOgotICAgICAgICAgICAgICAgIGhhbmRsZWQgfD0gcmlnaHQod2lkZ2V0LCBidWZmZXIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0NFTlRFUjoKLSAgICAgICAgICAgICAgICAgICAgbU1hbmFnZXIub25GaXhTZWxlY3RlZEl0ZW0oKTsKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGhhbmRsZWQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgY2xhc3MgSG9yaXpvbnRhbExpbmVTcGFuIGV4dGVuZHMgSW1hZ2VTcGFuIHsKLSAgICAgICAgcHVibGljIEhvcml6b250YWxMaW5lU3BhbihpbnQgY29sb3IsIFZpZXcgdmlldykgewotICAgICAgICAgICAgc3VwZXIobmV3IEhvcml6b250YWxMaW5lRHJhd2FibGUoY29sb3IsIHZpZXcpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBwdWJsaWMgY2xhc3MgSG9yaXpvbnRhbExpbmVEcmF3YWJsZSBleHRlbmRzIFNoYXBlRHJhd2FibGUgewotICAgICAgICBwcml2YXRlIFZpZXcgbVZpZXc7Ci0gICAgICAgIHB1YmxpYyBIb3Jpem9udGFsTGluZURyYXdhYmxlKGludCBjb2xvciwgVmlldyB2aWV3KSB7Ci0gICAgICAgICAgICBzdXBlcihuZXcgUmVjdFNoYXBlKCkpOwotICAgICAgICAgICAgbVZpZXcgPSB2aWV3OwotICAgICAgICAgICAgcmVuZXdDb2xvcihjb2xvcik7Ci0gICAgICAgICAgICByZW5ld0JvdW5kcyh2aWV3KTsKLSAgICAgICAgfQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgZHJhdyhDYW52YXMgY2FudmFzKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBkcmF3OiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmVuZXdDb2xvcigpOwotICAgICAgICAgICAgcmVuZXdCb3VuZHMobVZpZXcpOwotICAgICAgICAgICAgc3VwZXIuZHJhdyhjYW52YXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHJlbmV3Qm91bmRzKFZpZXcgdmlldykgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIGludCB3aWR0aCA9IG1WaWV3LmdldEJhY2tncm91bmQoKS5nZXRCb3VuZHMoKS53aWR0aCgpOwotICAgICAgICAgICAgICAgIGludCBoZWlnaHQgPSBtVmlldy5nZXRCYWNrZ3JvdW5kKCkuZ2V0Qm91bmRzKCkuaGVpZ2h0KCk7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSByZW5ld0JvdW5kczoiICsgd2lkdGggKyAiLCIgKyBoZWlnaHQpOwotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gcmVuZXdCb3VuZHM6IiArIG1WaWV3LmdldENsYXNzKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW50IHdpZHRoID0gbVZpZXcuZ2V0V2lkdGgoKTsKLSAgICAgICAgICAgIGlmICh3aWR0aCA+IDIwKSB7Ci0gICAgICAgICAgICAgICAgd2lkdGggLT0gMjA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXRCb3VuZHMoMCwgMCwgd2lkdGgsIDIpOwotICAgICAgICB9Ci0gICAgICAgIHByaXZhdGUgdm9pZCByZW5ld0NvbG9yKGludCBjb2xvcikgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gcmVuZXdDb2xvcjoiICsgY29sb3IpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZ2V0UGFpbnQoKS5zZXRDb2xvcihjb2xvcik7Ci0gICAgICAgIH0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHJlbmV3Q29sb3IoKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSByZW5ld0NvbG9yOiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1WaWV3IGluc3RhbmNlb2YgVmlldykgewotICAgICAgICAgICAgICAgIEltYWdlU3BhbiBwYXJlbnQgPSBnZXRQYXJlbnRTcGFuKCk7Ci0gICAgICAgICAgICAgICAgRWRpdGFibGUgdGV4dCA9ICgoRWRpdFN0eWxlZFRleHQpbVZpZXcpLmdldFRleHQoKTsKLSAgICAgICAgICAgICAgICBpbnQgc3RhcnQgPSB0ZXh0LmdldFNwYW5TdGFydChwYXJlbnQpOwotICAgICAgICAgICAgICAgIEZvcmVncm91bmRDb2xvclNwYW5bXSBzcGFucyA9IHRleHQuZ2V0U3BhbnMoc3RhcnQsIHN0YXJ0LCBGb3JlZ3JvdW5kQ29sb3JTcGFuLmNsYXNzKTsKLSAgICAgICAgICAgICAgICBpZiAoc3BhbnMubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgICAgICAgICByZW5ld0NvbG9yKHNwYW5zW3NwYW5zLmxlbmd0aCAtIDFdLmdldEZvcmVncm91bmRDb2xvcigpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcHJpdmF0ZSBJbWFnZVNwYW4gZ2V0UGFyZW50U3BhbigpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIGdldFBhcmVudFNwYW46Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobVZpZXcgaW5zdGFuY2VvZiBFZGl0U3R5bGVkVGV4dCkgewotICAgICAgICAgICAgICAgIEVkaXRhYmxlIHRleHQgPSAoKEVkaXRTdHlsZWRUZXh0KW1WaWV3KS5nZXRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgSW1hZ2VTcGFuW10gaW1hZ2VzID0gdGV4dC5nZXRTcGFucygwLCB0ZXh0Lmxlbmd0aCgpLCBJbWFnZVNwYW4uY2xhc3MpOwotICAgICAgICAgICAgICAgIGlmIChpbWFnZXMubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgICAgICAgICBmb3IgKEltYWdlU3BhbiBpbWFnZTogaW1hZ2VzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW1hZ2UuZ2V0RHJhd2FibGUoKSA9PSB0aGlzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGltYWdlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIi0tLXJlbmV3Qm91bmRzOiBDb3VsZG4ndCBmaW5kIik7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvSVJlbW90ZVZpZXdzRmFjdG9yeS5haWRsIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9JUmVtb3RlVmlld3NGYWN0b3J5LmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU5OTAwYwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvSVJlbW90ZVZpZXdzRmFjdG9yeS5haWRsCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldDsKKworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlJlbW90ZVZpZXdzOworCisvKioge0BoaWRlfSAqLworaW50ZXJmYWNlIElSZW1vdGVWaWV3c0ZhY3RvcnkgeworICAgIHZvaWQgb25EYXRhU2V0Q2hhbmdlZCgpOworICAgIGludCBnZXRDb3VudCgpOworICAgIFJlbW90ZVZpZXdzIGdldFZpZXdBdChpbnQgcG9zaXRpb24pOworICAgIFJlbW90ZVZpZXdzIGdldExvYWRpbmdWaWV3KCk7CisgICAgaW50IGdldFZpZXdUeXBlQ291bnQoKTsKKyAgICBsb25nIGdldEl0ZW1JZChpbnQgcG9zaXRpb24pOworICAgIGJvb2xlYW4gaGFzU3RhYmxlSWRzKCk7Cit9CisKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvTG9ja1BhdHRlcm5VdGlscy5qYXZhIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9Mb2NrUGF0dGVyblV0aWxzLmphdmEKaW5kZXggYzc4ODYwNS4uOTA0MjNiZSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9Mb2NrUGF0dGVyblV0aWxzLmphdmEKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9Mb2NrUGF0dGVyblV0aWxzLmphdmEKQEAgLTk2LDYgKzk2LDggQEAKICAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQQVNTV09SRF9UWVBFX0tFWSA9ICJsb2Nrc2NyZWVuLnBhc3N3b3JkX3R5cGUiOwogICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBMT0NLX1BBU1NXT1JEX1NBTFRfS0VZID0gImxvY2tzY3JlZW4ucGFzc3dvcmRfc2FsdCI7CiAKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgUEFTU1dPUkRfSElTVE9SWV9LRVkgPSAibG9ja3NjcmVlbi5wYXNzd29yZGhpc3RvcnkiOworCiAgICAgcHJpdmF0ZSBmaW5hbCBDb250ZXh0IG1Db250ZXh0OwogICAgIHByaXZhdGUgZmluYWwgQ29udGVudFJlc29sdmVyIG1Db250ZW50UmVzb2x2ZXI7CiAgICAgcHJpdmF0ZSBEZXZpY2VQb2xpY3lNYW5hZ2VyIG1EZXZpY2VQb2xpY3lNYW5hZ2VyOwpAQCAtMTYzLDYgKzE2NSwzMyBAQAogICAgICAgICByZXR1cm4gZ2V0RGV2aWNlUG9saWN5TWFuYWdlcigpLmdldFBhc3N3b3JkUXVhbGl0eShudWxsKTsKICAgICB9CiAKKyAgICBwdWJsaWMgaW50IGdldFJlcXVlc3RlZFBhc3N3b3JkSGlzdG9yeUxlbmd0aCgpIHsKKyAgICAgICAgcmV0dXJuIGdldERldmljZVBvbGljeU1hbmFnZXIoKS5nZXRQYXNzd29yZEhpc3RvcnlMZW5ndGgobnVsbCk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRSZXF1ZXN0ZWRQYXNzd29yZE1pbmltdW1MZXR0ZXJzKCkgeworICAgICAgICByZXR1cm4gZ2V0RGV2aWNlUG9saWN5TWFuYWdlcigpLmdldFBhc3N3b3JkTWluaW11bUxldHRlcnMobnVsbCk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRSZXF1ZXN0ZWRQYXNzd29yZE1pbmltdW1VcHBlckNhc2UoKSB7CisgICAgICAgIHJldHVybiBnZXREZXZpY2VQb2xpY3lNYW5hZ2VyKCkuZ2V0UGFzc3dvcmRNaW5pbXVtVXBwZXJDYXNlKG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0UmVxdWVzdGVkUGFzc3dvcmRNaW5pbXVtTG93ZXJDYXNlKCkgeworICAgICAgICByZXR1cm4gZ2V0RGV2aWNlUG9saWN5TWFuYWdlcigpLmdldFBhc3N3b3JkTWluaW11bUxvd2VyQ2FzZShudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFJlcXVlc3RlZFBhc3N3b3JkTWluaW11bU51bWVyaWMoKSB7CisgICAgICAgIHJldHVybiBnZXREZXZpY2VQb2xpY3lNYW5hZ2VyKCkuZ2V0UGFzc3dvcmRNaW5pbXVtTnVtZXJpYyhudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFJlcXVlc3RlZFBhc3N3b3JkTWluaW11bVN5bWJvbHMoKSB7CisgICAgICAgIHJldHVybiBnZXREZXZpY2VQb2xpY3lNYW5hZ2VyKCkuZ2V0UGFzc3dvcmRNaW5pbXVtU3ltYm9scyhudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFJlcXVlc3RlZFBhc3N3b3JkTWluaW11bU5vbkxldHRlcigpIHsKKyAgICAgICAgcmV0dXJuIGdldERldmljZVBvbGljeU1hbmFnZXIoKS5nZXRQYXNzd29yZE1pbmltdW1Ob25MZXR0ZXIobnVsbCk7CisgICAgfQogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIGFjdHVhbCBwYXNzd29yZCBtb2RlLCBhcyBzZXQgYnkga2V5Z3VhcmQgYWZ0ZXIgdXBkYXRpbmcgdGhlIHBhc3N3b3JkLgogICAgICAqCkBAIC0yMjcsNiArMjU2LDMzIEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogQ2hlY2sgdG8gc2VlIGlmIGEgcGFzc3dvcmQgbWF0Y2hlcyBhbnkgb2YgdGhlIHBhc3N3b3JkcyBzdG9yZWQgaW4gdGhlCisgICAgICogcGFzc3dvcmQgaGlzdG9yeS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXNzd29yZCBUaGUgcGFzc3dvcmQgdG8gY2hlY2suCisgICAgICogQHJldHVybiBXaGV0aGVyIHRoZSBwYXNzd29yZCBtYXRjaGVzIGFueSBpbiB0aGUgaGlzdG9yeS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBjaGVja1Bhc3N3b3JkSGlzdG9yeShTdHJpbmcgcGFzc3dvcmQpIHsKKyAgICAgICAgU3RyaW5nIHBhc3N3b3JkSGFzaFN0cmluZyA9IG5ldyBTdHJpbmcocGFzc3dvcmRUb0hhc2gocGFzc3dvcmQpKTsKKyAgICAgICAgU3RyaW5nIHBhc3N3b3JkSGlzdG9yeSA9IGdldFN0cmluZyhQQVNTV09SRF9ISVNUT1JZX0tFWSk7CisgICAgICAgIGlmIChwYXNzd29yZEhpc3RvcnkgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIC8vIFBhc3N3b3JkIEhpc3RvcnkgbWF5IGJlIHRvbyBsb25nLi4uCisgICAgICAgIGludCBwYXNzd29yZEhhc2hMZW5ndGggPSBwYXNzd29yZEhhc2hTdHJpbmcubGVuZ3RoKCk7CisgICAgICAgIGludCBwYXNzd29yZEhpc3RvcnlMZW5ndGggPSBnZXRSZXF1ZXN0ZWRQYXNzd29yZEhpc3RvcnlMZW5ndGgoKTsKKyAgICAgICAgaWYocGFzc3dvcmRIaXN0b3J5TGVuZ3RoID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpbnQgbmVlZGVkUGFzc3dvcmRIaXN0b3J5TGVuZ3RoID0gcGFzc3dvcmRIYXNoTGVuZ3RoICogcGFzc3dvcmRIaXN0b3J5TGVuZ3RoCisgICAgICAgICAgICAgICAgKyBwYXNzd29yZEhpc3RvcnlMZW5ndGggLSAxOworICAgICAgICBpZiAocGFzc3dvcmRIaXN0b3J5Lmxlbmd0aCgpID4gbmVlZGVkUGFzc3dvcmRIaXN0b3J5TGVuZ3RoKSB7CisgICAgICAgICAgICBwYXNzd29yZEhpc3RvcnkgPSBwYXNzd29yZEhpc3Rvcnkuc3Vic3RyaW5nKDAsIG5lZWRlZFBhc3N3b3JkSGlzdG9yeUxlbmd0aCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHBhc3N3b3JkSGlzdG9yeS5jb250YWlucyhwYXNzd29yZEhhc2hTdHJpbmcpOworICAgIH0KKworICAgIC8qKgogICAgICAqIENoZWNrIHRvIHNlZSBpZiB0aGUgdXNlciBoYXMgc3RvcmVkIGEgbG9jayBwYXR0ZXJuLgogICAgICAqIEByZXR1cm4gV2hldGhlciBhIHNhdmVkIHBhdHRlcm4gZXhpc3RzLgogICAgICAqLwpAQCAtMjc5LDYgKzMzNSwxMSBAQAogICAgICAgICAgICAgICAgICAgICBhY3RpdmVQYXNzd29yZFF1YWxpdHkgPSBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfQUxQSEFOVU1FUklDOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX0NPTVBMRVg6CisgICAgICAgICAgICAgICAgaWYgKGlzTG9ja1Bhc3N3b3JkRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGFjdGl2ZVBhc3N3b3JkUXVhbGl0eSA9IERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9DT01QTEVYOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gYWN0aXZlUGFzc3dvcmRRdWFsaXR5OwogICAgIH0KQEAgLTI4Nyw4ICszNDgsNiBAQAogICAgICAqIENsZWFyIGFueSBsb2NrIHBhdHRlcm4gb3IgcGFzc3dvcmQuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgY2xlYXJMb2NrKCkgewotICAgICAgICBnZXREZXZpY2VQb2xpY3lNYW5hZ2VyKCkuc2V0QWN0aXZlUGFzc3dvcmRTdGF0ZSgKLSAgICAgICAgICAgICAgICBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfVU5TUEVDSUZJRUQsIDApOwogICAgICAgICBzYXZlTG9ja1Bhc3N3b3JkKG51bGwsIERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9TT01FVEhJTkcpOwogICAgICAgICBzZXRMb2NrUGF0dGVybkVuYWJsZWQoZmFsc2UpOwogICAgICAgICBzYXZlTG9ja1BhdHRlcm4obnVsbCk7CkBAIC0zMDEsNyArMzYwLDcgQEAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzYXZlTG9ja1BhdHRlcm4oTGlzdDxMb2NrUGF0dGVyblZpZXcuQ2VsbD4gcGF0dGVybikgewogICAgICAgICAvLyBDb21wdXRlIHRoZSBoYXNoCi0gICAgICAgIGZpbmFsIGJ5dGVbXSBoYXNoICA9IExvY2tQYXR0ZXJuVXRpbHMucGF0dGVyblRvSGFzaChwYXR0ZXJuKTsKKyAgICAgICAgZmluYWwgYnl0ZVtdIGhhc2ggPSBMb2NrUGF0dGVyblV0aWxzLnBhdHRlcm5Ub0hhc2gocGF0dGVybik7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAvLyBXcml0ZSB0aGUgaGFzaCB0byBmaWxlCiAgICAgICAgICAgICBSYW5kb21BY2Nlc3NGaWxlIHJhZiA9IG5ldyBSYW5kb21BY2Nlc3NGaWxlKHNMb2NrUGF0dGVybkZpbGVuYW1lLCAicnciKTsKQEAgLTMxNiwxNCArMzc1LDE1IEBACiAgICAgICAgICAgICBpZiAocGF0dGVybiAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgc2V0Qm9vbGVhbihQQVRURVJOX0VWRVJfQ0hPU0VOX0tFWSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgc2V0TG9uZyhQQVNTV09SRF9UWVBFX0tFWSwgRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX1NPTUVUSElORyk7Ci0gICAgICAgICAgICAgICAgZHBtLnNldEFjdGl2ZVBhc3N3b3JkU3RhdGUoCi0gICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfU09NRVRISU5HLCBwYXR0ZXJuLnNpemUoKSk7CisgICAgICAgICAgICAgICAgZHBtLnNldEFjdGl2ZVBhc3N3b3JkU3RhdGUoRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX1NPTUVUSElORywgcGF0dGVybgorICAgICAgICAgICAgICAgICAgICAgICAgLnNpemUoKSwgMCwgMCwgMCwgMCwgMCwgMCk7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGRwbS5zZXRBY3RpdmVQYXNzd29yZFN0YXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX1VOU1BFQ0lGSUVELCAwKTsKKyAgICAgICAgICAgICAgICBkcG0uc2V0QWN0aXZlUGFzc3dvcmRTdGF0ZShEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfVU5TUEVDSUZJRUQsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAwLCAwLCAwKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGZuZmUpIHsKLSAgICAgICAgICAgIC8vIENhbnQgZG8gbXVjaCwgdW5sZXNzIHdlIHdhbnQgdG8gZmFpbCBvdmVyIHRvIHVzaW5nIHRoZSBzZXR0aW5ncyBwcm92aWRlcgorICAgICAgICAgICAgLy8gQ2FudCBkbyBtdWNoLCB1bmxlc3Mgd2Ugd2FudCB0byBmYWlsIG92ZXIgdG8gdXNpbmcgdGhlIHNldHRpbmdzCisgICAgICAgICAgICAvLyBwcm92aWRlcgogICAgICAgICAgICAgTG9nLmUoVEFHLCAiVW5hYmxlIHRvIHNhdmUgbG9jayBwYXR0ZXJuIHRvICIgKyBzTG9ja1BhdHRlcm5GaWxlbmFtZSk7CiAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewogICAgICAgICAgICAgLy8gQ2FudCBkbyBtdWNoCkBAIC0zODEsMTcgKzQ0MSw1OSBAQAogICAgICAgICAgICAgRGV2aWNlUG9saWN5TWFuYWdlciBkcG0gPSBnZXREZXZpY2VQb2xpY3lNYW5hZ2VyKCk7CiAgICAgICAgICAgICBpZiAocGFzc3dvcmQgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIGludCBjb21wdXRlZFF1YWxpdHkgPSBjb21wdXRlUGFzc3dvcmRRdWFsaXR5KHBhc3N3b3JkKTsKLSAgICAgICAgICAgICAgICBzZXRMb25nKFBBU1NXT1JEX1RZUEVfS0VZLCBjb21wdXRlZFF1YWxpdHkpOworICAgICAgICAgICAgICAgIHNldExvbmcoUEFTU1dPUkRfVFlQRV9LRVksIE1hdGgubWF4KHF1YWxpdHksIGNvbXB1dGVkUXVhbGl0eSkpOwogICAgICAgICAgICAgICAgIGlmIChjb21wdXRlZFF1YWxpdHkgIT0gRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX1VOU1BFQ0lGSUVEKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRwbS5zZXRBY3RpdmVQYXNzd29yZFN0YXRlKGNvbXB1dGVkUXVhbGl0eSwgcGFzc3dvcmQubGVuZ3RoKCkpOworICAgICAgICAgICAgICAgICAgICBpbnQgbGV0dGVycyA9IDA7CisgICAgICAgICAgICAgICAgICAgIGludCB1cHBlcmNhc2UgPSAwOworICAgICAgICAgICAgICAgICAgICBpbnQgbG93ZXJjYXNlID0gMDsKKyAgICAgICAgICAgICAgICAgICAgaW50IG51bWJlcnMgPSAwOworICAgICAgICAgICAgICAgICAgICBpbnQgc3ltYm9scyA9IDA7CisgICAgICAgICAgICAgICAgICAgIGludCBub25sZXR0ZXIgPSAwOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhc3N3b3JkLmxlbmd0aCgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgYyA9IHBhc3N3b3JkLmNoYXJBdChpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjID49ICdBJyAmJiBjIDw9ICdaJykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldHRlcnMrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cHBlcmNhc2UrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA+PSAnYScgJiYgYyA8PSAneicpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXR0ZXJzKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG93ZXJjYXNlKys7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGMgPj0gJzAnICYmIGMgPD0gJzknKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVycysrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbmxldHRlcisrOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW1ib2xzKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ubGV0dGVyKys7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZHBtLnNldEFjdGl2ZVBhc3N3b3JkU3RhdGUoTWF0aC5tYXgocXVhbGl0eSwgY29tcHV0ZWRRdWFsaXR5KSwgcGFzc3dvcmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAubGVuZ3RoKCksIGxldHRlcnMsIHVwcGVyY2FzZSwgbG93ZXJjYXNlLCBudW1iZXJzLCBzeW1ib2xzLCBub25sZXR0ZXIpOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBwYXNzd29yZCBpcyBub3QgYW55dGhpbmcuCiAgICAgICAgICAgICAgICAgICAgIGRwbS5zZXRBY3RpdmVQYXNzd29yZFN0YXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9VTlNQRUNJRklFRCwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX1VOU1BFQ0lGSUVELCAwLCAwLCAwLCAwLCAwLCAwLCAwKTsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gQWRkIHRoZSBwYXNzd29yZCB0byB0aGUgcGFzc3dvcmQgaGlzdG9yeS4gV2UgYXNzdW1lIGFsbAorICAgICAgICAgICAgICAgIC8vIHBhc3N3b3JkCisgICAgICAgICAgICAgICAgLy8gaGFzaGVzIGhhdmUgdGhlIHNhbWUgbGVuZ3RoIGZvciBzaW1wbGljaXR5IG9mIGltcGxlbWVudGF0aW9uLgorICAgICAgICAgICAgICAgIFN0cmluZyBwYXNzd29yZEhpc3RvcnkgPSBnZXRTdHJpbmcoUEFTU1dPUkRfSElTVE9SWV9LRVkpOworICAgICAgICAgICAgICAgIGlmIChwYXNzd29yZEhpc3RvcnkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBwYXNzd29yZEhpc3RvcnkgPSBuZXcgU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGludCBwYXNzd29yZEhpc3RvcnlMZW5ndGggPSBnZXRSZXF1ZXN0ZWRQYXNzd29yZEhpc3RvcnlMZW5ndGgoKTsKKyAgICAgICAgICAgICAgICBpZiAocGFzc3dvcmRIaXN0b3J5TGVuZ3RoID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcGFzc3dvcmRIaXN0b3J5ID0gIiI7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcGFzc3dvcmRIaXN0b3J5ID0gbmV3IFN0cmluZyhoYXNoKSArICIsIiArIHBhc3N3b3JkSGlzdG9yeTsKKyAgICAgICAgICAgICAgICAgICAgLy8gQ3V0IGl0IHRvIGNvbnRhaW4gcGFzc3dvcmRIaXN0b3J5TGVuZ3RoIGhhc2hlcworICAgICAgICAgICAgICAgICAgICAvLyBhbmQgcGFzc3dvcmRIaXN0b3J5TGVuZ3RoIC0xIGNvbW1hcy4KKyAgICAgICAgICAgICAgICAgICAgcGFzc3dvcmRIaXN0b3J5ID0gcGFzc3dvcmRIaXN0b3J5LnN1YnN0cmluZygwLCBNYXRoLm1pbihoYXNoLmxlbmd0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcGFzc3dvcmRIaXN0b3J5TGVuZ3RoICsgcGFzc3dvcmRIaXN0b3J5TGVuZ3RoIC0gMSwgcGFzc3dvcmRIaXN0b3J5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmxlbmd0aCgpKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNldFN0cmluZyhQQVNTV09SRF9ISVNUT1JZX0tFWSwgcGFzc3dvcmRIaXN0b3J5KTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgZHBtLnNldEFjdGl2ZVBhc3N3b3JkU3RhdGUoCi0gICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfVU5TUEVDSUZJRUQsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX1VOU1BFQ0lGSUVELCAwLCAwLCAwLCAwLCAwLCAwLCAwKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGZuZmUpIHsKICAgICAgICAgICAgIC8vIENhbnQgZG8gbXVjaCwgdW5sZXNzIHdlIHdhbnQgdG8gZmFpbCBvdmVyIHRvIHVzaW5nIHRoZSBzZXR0aW5ncyBwcm92aWRlcgpAQCAtNTMxLDcgKzYzMyw4IEBACiAgICAgICAgIHJldHVybiBzYXZlZFBhc3N3b3JkRXhpc3RzKCkgJiYKICAgICAgICAgICAgICAgICAobW9kZSA9PSBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfQUxQSEFCRVRJQwogICAgICAgICAgICAgICAgICAgICAgICAgfHwgbW9kZSA9PSBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfTlVNRVJJQwotICAgICAgICAgICAgICAgICAgICAgICAgfHwgbW9kZSA9PSBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfQUxQSEFOVU1FUklDKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1vZGUgPT0gRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX0FMUEhBTlVNRVJJQworICAgICAgICAgICAgICAgICAgICAgICAgfHwgbW9kZSA9PSBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfQ09NUExFWCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC02NTUsMTIgKzc1OCwyMSBAQAogICAgICAgICBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzLlNlY3VyZS5wdXRMb25nKG1Db250ZW50UmVzb2x2ZXIsIHNlY3VyZVNldHRpbmdLZXksIHZhbHVlKTsKICAgICB9CiAKKyAgICBwcml2YXRlIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIHNlY3VyZVNldHRpbmdLZXkpIHsKKyAgICAgICAgcmV0dXJuIGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3MuU2VjdXJlLmdldFN0cmluZyhtQ29udGVudFJlc29sdmVyLCBzZWN1cmVTZXR0aW5nS2V5KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2V0U3RyaW5nKFN0cmluZyBzZWN1cmVTZXR0aW5nS2V5LCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5ncy5TZWN1cmUucHV0U3RyaW5nKG1Db250ZW50UmVzb2x2ZXIsIHNlY3VyZVNldHRpbmdLZXksIHZhbHVlKTsKKyAgICB9CisKICAgICBwdWJsaWMgYm9vbGVhbiBpc1NlY3VyZSgpIHsKICAgICAgICAgbG9uZyBtb2RlID0gZ2V0S2V5Z3VhcmRTdG9yZWRQYXNzd29yZFF1YWxpdHkoKTsKICAgICAgICAgZmluYWwgYm9vbGVhbiBpc1BhdHRlcm4gPSBtb2RlID09IERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9TT01FVEhJTkc7CiAgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNQYXNzd29yZCA9IG1vZGUgPT0gRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX05VTUVSSUMKICAgICAgICAgICAgICAgICB8fCBtb2RlID09IERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9BTFBIQUJFVElDCi0gICAgICAgICAgICAgICAgfHwgbW9kZSA9PSBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfQUxQSEFOVU1FUklDOworICAgICAgICAgICAgICAgIHx8IG1vZGUgPT0gRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX0FMUEhBTlVNRVJJQworICAgICAgICAgICAgICAgIHx8IG1vZGUgPT0gRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX0NPTVBMRVg7CiAgICAgICAgIGZpbmFsIGJvb2xlYW4gc2VjdXJlID0gaXNQYXR0ZXJuICYmIGlzTG9ja1BhdHRlcm5FbmFibGVkKCkgJiYgc2F2ZWRQYXR0ZXJuRXhpc3RzKCkKICAgICAgICAgICAgICAgICB8fCBpc1Bhc3N3b3JkICYmIHNhdmVkUGFzc3dvcmRFeGlzdHMoKTsKICAgICAgICAgcmV0dXJuIHNlY3VyZTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvUGFzc3dvcmRFbnRyeUtleWJvYXJkLmphdmEgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L1Bhc3N3b3JkRW50cnlLZXlib2FyZC5qYXZhCmluZGV4IGUxYTY3MzcuLmZhY2RhMzYgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvUGFzc3dvcmRFbnRyeUtleWJvYXJkLmphdmEKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9QYXNzd29yZEVudHJ5S2V5Ym9hcmQuamF2YQpAQCAtNjcsOCArNjcsMjIgQEAKICAgICAgICAgdGhpcyhjb250ZXh0LCB4bWxMYXlvdXRSZXNJZCwgMCk7CiAgICAgfQogCisgICAgcHVibGljIFBhc3N3b3JkRW50cnlLZXlib2FyZChDb250ZXh0IGNvbnRleHQsIGludCB4bWxMYXlvdXRSZXNJZCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CisgICAgICAgIHRoaXMoY29udGV4dCwgeG1sTGF5b3V0UmVzSWQsIDAsIHdpZHRoLCBoZWlnaHQpOworICAgIH0KKwogICAgIHB1YmxpYyBQYXNzd29yZEVudHJ5S2V5Ym9hcmQoQ29udGV4dCBjb250ZXh0LCBpbnQgeG1sTGF5b3V0UmVzSWQsIGludCBtb2RlKSB7CiAgICAgICAgIHN1cGVyKGNvbnRleHQsIHhtbExheW91dFJlc0lkLCBtb2RlKTsKKyAgICAgICAgaW5pdChjb250ZXh0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgUGFzc3dvcmRFbnRyeUtleWJvYXJkKENvbnRleHQgY29udGV4dCwgaW50IHhtbExheW91dFJlc0lkLCBpbnQgbW9kZSwKKyAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCkgeworICAgICAgICBzdXBlcihjb250ZXh0LCB4bWxMYXlvdXRSZXNJZCwgbW9kZSwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgIGluaXQoY29udGV4dCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGluaXQoQ29udGV4dCBjb250ZXh0KSB7CiAgICAgICAgIGZpbmFsIFJlc291cmNlcyByZXMgPSBjb250ZXh0LmdldFJlc291cmNlcygpOwogICAgICAgICBtUmVzID0gcmVzOwogICAgICAgICBtU2hpZnRJY29uID0gcmVzLmdldERyYXdhYmxlKFIuZHJhd2FibGUuc3ltX2tleWJvYXJkX3NoaWZ0KTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvUGFzc3dvcmRFbnRyeUtleWJvYXJkSGVscGVyLmphdmEgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L1Bhc3N3b3JkRW50cnlLZXlib2FyZEhlbHBlci5qYXZhCmluZGV4IDUzNzIwZTQuLjM4NGY3YmMgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvUGFzc3dvcmRFbnRyeUtleWJvYXJkSGVscGVyLmphdmEKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9QYXNzd29yZEVudHJ5S2V5Ym9hcmRIZWxwZXIuamF2YQpAQCAtNTQsMTAgKzU0LDIwIEBACiAgICAgcHJpdmF0ZSBWaWJyYXRvciBtVmlicmF0b3I7CiAKICAgICBwdWJsaWMgUGFzc3dvcmRFbnRyeUtleWJvYXJkSGVscGVyKENvbnRleHQgY29udGV4dCwgS2V5Ym9hcmRWaWV3IGtleWJvYXJkVmlldywgVmlldyB0YXJnZXRWaWV3KSB7CisgICAgICAgIHRoaXMoY29udGV4dCwga2V5Ym9hcmRWaWV3LCB0YXJnZXRWaWV3LCB0cnVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUGFzc3dvcmRFbnRyeUtleWJvYXJkSGVscGVyKENvbnRleHQgY29udGV4dCwgS2V5Ym9hcmRWaWV3IGtleWJvYXJkVmlldywgVmlldyB0YXJnZXRWaWV3LAorICAgICAgICAgICAgYm9vbGVhbiB1c2VGdWxsU2NyZWVuV2lkdGgpIHsKICAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OwogICAgICAgICBtVGFyZ2V0VmlldyA9IHRhcmdldFZpZXc7CiAgICAgICAgIG1LZXlib2FyZFZpZXcgPSBrZXlib2FyZFZpZXc7Ci0gICAgICAgIGNyZWF0ZUtleWJvYXJkcygpOworICAgICAgICBpZiAodXNlRnVsbFNjcmVlbldpZHRoIHx8IG1LZXlib2FyZFZpZXcuZ2V0TGF5b3V0UGFyYW1zKCkud2lkdGggPT0gLTEpIHsKKyAgICAgICAgICAgIGNyZWF0ZUtleWJvYXJkcygpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY3JlYXRlS2V5Ym9hcmRzV2l0aFNwZWNpZmljU2l6ZShtS2V5Ym9hcmRWaWV3LmdldExheW91dFBhcmFtcygpLndpZHRoLAorICAgICAgICAgICAgICAgICAgICBtS2V5Ym9hcmRWaWV3LmdldExheW91dFBhcmFtcygpLmhlaWdodCk7CisgICAgICAgIH0KICAgICAgICAgbUtleWJvYXJkVmlldy5zZXRPbktleWJvYXJkQWN0aW9uTGlzdGVuZXIodGhpcyk7CiAgICAgICAgIG1WaWJyYXRvciA9IG5ldyBWaWJyYXRvcigpOwogICAgIH0KQEAgLTY2LDYgKzc2LDI5IEBACiAgICAgICAgIHJldHVybiBtS2V5Ym9hcmRNb2RlID09IEtFWUJPQVJEX01PREVfQUxQSEE7CiAgICAgfQogCisgICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUtleWJvYXJkc1dpdGhTcGVjaWZpY1NpemUoaW50IHZpZXdXaWR0aCwgaW50IHZpZXdIZWlnaHQpIHsKKyAgICAgICAgbU51bWVyaWNLZXlib2FyZCA9IG5ldyBQYXNzd29yZEVudHJ5S2V5Ym9hcmQobUNvbnRleHQsIFIueG1sLnBhc3N3b3JkX2tiZF9udW1lcmljLAorICAgICAgICAgICAgICAgIHZpZXdXaWR0aCwgdmlld0hlaWdodCk7CisgICAgICAgIG1Rd2VydHlLZXlib2FyZCA9IG5ldyBQYXNzd29yZEVudHJ5S2V5Ym9hcmQobUNvbnRleHQsCisgICAgICAgICAgICAgICAgUi54bWwucGFzc3dvcmRfa2JkX3F3ZXJ0eSwgUi5pZC5tb2RlX25vcm1hbCwgdmlld1dpZHRoLCB2aWV3SGVpZ2h0KTsKKyAgICAgICAgbVF3ZXJ0eUtleWJvYXJkLmVuYWJsZVNoaWZ0TG9jaygpOworCisgICAgICAgIG1Rd2VydHlLZXlib2FyZFNoaWZ0ZWQgPSBuZXcgUGFzc3dvcmRFbnRyeUtleWJvYXJkKG1Db250ZXh0LAorICAgICAgICAgICAgICAgIFIueG1sLnBhc3N3b3JkX2tiZF9xd2VydHlfc2hpZnRlZCwKKyAgICAgICAgICAgICAgICBSLmlkLm1vZGVfbm9ybWFsLCB2aWV3V2lkdGgsIHZpZXdIZWlnaHQpOworICAgICAgICBtUXdlcnR5S2V5Ym9hcmRTaGlmdGVkLmVuYWJsZVNoaWZ0TG9jaygpOworICAgICAgICBtUXdlcnR5S2V5Ym9hcmRTaGlmdGVkLnNldFNoaWZ0ZWQodHJ1ZSk7IC8vIGFsd2F5cyBzaGlmdGVkLgorCisgICAgICAgIG1TeW1ib2xzS2V5Ym9hcmQgPSBuZXcgUGFzc3dvcmRFbnRyeUtleWJvYXJkKG1Db250ZXh0LCBSLnhtbC5wYXNzd29yZF9rYmRfc3ltYm9scywKKyAgICAgICAgICAgICAgICB2aWV3V2lkdGgsIHZpZXdIZWlnaHQpOworICAgICAgICBtU3ltYm9sc0tleWJvYXJkLmVuYWJsZVNoaWZ0TG9jaygpOworCisgICAgICAgIG1TeW1ib2xzS2V5Ym9hcmRTaGlmdGVkID0gbmV3IFBhc3N3b3JkRW50cnlLZXlib2FyZChtQ29udGV4dCwKKyAgICAgICAgICAgICAgICBSLnhtbC5wYXNzd29yZF9rYmRfc3ltYm9sc19zaGlmdCwgdmlld1dpZHRoLCB2aWV3SGVpZ2h0KTsKKyAgICAgICAgbVN5bWJvbHNLZXlib2FyZFNoaWZ0ZWQuZW5hYmxlU2hpZnRMb2NrKCk7CisgICAgICAgIG1TeW1ib2xzS2V5Ym9hcmRTaGlmdGVkLnNldFNoaWZ0ZWQodHJ1ZSk7IC8vIGFsd2F5cyBzaGlmdGVkCisgICAgfQorCiAgICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUtleWJvYXJkcygpIHsKICAgICAgICAgbU51bWVyaWNLZXlib2FyZCA9IG5ldyBQYXNzd29yZEVudHJ5S2V5Ym9hcmQobUNvbnRleHQsIFIueG1sLnBhc3N3b3JkX2tiZF9udW1lcmljKTsKICAgICAgICAgbVF3ZXJ0eUtleWJvYXJkID0gbmV3IFBhc3N3b3JkRW50cnlLZXlib2FyZChtQ29udGV4dCwKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvU2xpZGluZ1RhYi5qYXZhIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9TbGlkaW5nVGFiLmphdmEKaW5kZXggOTE1MjcyOS4uNGI1NmNiNCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9TbGlkaW5nVGFiLmphdmEKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9TbGlkaW5nVGFiLmphdmEKQEAgLTE3LDEwICsxNyw4IEBACiBwYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldDsKIAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5WaWJyYXRvcjsKQEAgLTM4LDYgKzM2LDcgQEAKIGltcG9ydCBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXc7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuSW1hZ2VWaWV3LlNjYWxlVHlwZTsKKwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLlI7CiAKIC8qKgpAQCAtNjksMjEgKzY4LDIxIEBACiAgICAgcHJpdmF0ZSBpbnQgbUdyYWJiZWRTdGF0ZSA9IE9uVHJpZ2dlckxpc3RlbmVyLk5PX0hBTkRMRTsKICAgICBwcml2YXRlIGJvb2xlYW4gbVRyaWdnZXJlZCA9IGZhbHNlOwogICAgIHByaXZhdGUgVmlicmF0b3IgbVZpYnJhdG9yOwotICAgIHByaXZhdGUgZmxvYXQgbURlbnNpdHk7IC8vIHVzZWQgdG8gc2NhbGUgZGltZW5zaW9ucyBmb3IgYml0bWFwcy4KKyAgICBwcml2YXRlIGZpbmFsIGZsb2F0IG1EZW5zaXR5OyAvLyB1c2VkIHRvIHNjYWxlIGRpbWVuc2lvbnMgZm9yIGJpdG1hcHMuCiAKICAgICAvKioKICAgICAgKiBFaXRoZXIge0BsaW5rICNIT1JJWk9OVEFMfSBvciB7QGxpbmsgI1ZFUlRJQ0FMfS4KICAgICAgKi8KLSAgICBwcml2YXRlIGludCBtT3JpZW50YXRpb247CisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbU9yaWVudGF0aW9uOwogCi0gICAgcHJpdmF0ZSBTbGlkZXIgbUxlZnRTbGlkZXI7Ci0gICAgcHJpdmF0ZSBTbGlkZXIgbVJpZ2h0U2xpZGVyOworICAgIHByaXZhdGUgZmluYWwgU2xpZGVyIG1MZWZ0U2xpZGVyOworICAgIHByaXZhdGUgZmluYWwgU2xpZGVyIG1SaWdodFNsaWRlcjsKICAgICBwcml2YXRlIFNsaWRlciBtQ3VycmVudFNsaWRlcjsKICAgICBwcml2YXRlIGJvb2xlYW4gbVRyYWNraW5nOwogICAgIHByaXZhdGUgZmxvYXQgbVRocmVzaG9sZDsKICAgICBwcml2YXRlIFNsaWRlciBtT3RoZXJTbGlkZXI7CiAgICAgcHJpdmF0ZSBib29sZWFuIG1BbmltYXRpbmc7Ci0gICAgcHJpdmF0ZSBSZWN0IG1UbXBSZWN0OworICAgIHByaXZhdGUgZmluYWwgUmVjdCBtVG1wUmVjdDsKIAogICAgIC8qKgogICAgICAqIExpc3RlbmVyIHVzZWQgdG8gcmVzZXQgdGhlIHZpZXcgd2hlbiB0aGUgY3VycmVudCBhbmltYXRpb24gY29tcGxldGVzLgpAQCAtNDc1LDEwICs0NzQsMTMgQEAKICAgICAgICAgaW50IGhlaWdodFNwZWNNb2RlID0gTWVhc3VyZVNwZWMuZ2V0TW9kZShoZWlnaHRNZWFzdXJlU3BlYyk7CiAgICAgICAgIGludCBoZWlnaHRTcGVjU2l6ZSA9ICBNZWFzdXJlU3BlYy5nZXRTaXplKGhlaWdodE1lYXN1cmVTcGVjKTsKIAotICAgICAgICBpZiAod2lkdGhTcGVjTW9kZSA9PSBNZWFzdXJlU3BlYy5VTlNQRUNJRklFRCB8fCBoZWlnaHRTcGVjTW9kZSA9PSBNZWFzdXJlU3BlYy5VTlNQRUNJRklFRCkgewotICAgICAgICAgICAgTG9nLmUoIlNsaWRpbmdUYWIiLCAiU2xpZGluZ1RhYiBjYW5ub3QgaGF2ZSBVTlNQRUNJRklFRCBNZWFzdXJlU3BlYyIKLSAgICAgICAgICAgICAgICAgICAgKyIod3NwZWM9IiArIHdpZHRoU3BlY01vZGUgKyAiLCBoc3BlYz0iICsgaGVpZ2h0U3BlY01vZGUgKyAiKSIsCi0gICAgICAgICAgICAgICAgICAgIG5ldyBSdW50aW1lRXhjZXB0aW9uKExPR19UQUcgKyAic3RhY2s6IikpOworICAgICAgICBpZiAoREJHKSB7CisgICAgICAgICAgICBpZiAod2lkdGhTcGVjTW9kZSA9PSBNZWFzdXJlU3BlYy5VTlNQRUNJRklFRCAKKyAgICAgICAgICAgICAgICAgICAgfHwgaGVpZ2h0U3BlY01vZGUgPT0gTWVhc3VyZVNwZWMuVU5TUEVDSUZJRUQpIHsKKyAgICAgICAgICAgICAgICBMb2cuZSgiU2xpZGluZ1RhYiIsICJTbGlkaW5nVGFiIGNhbm5vdCBoYXZlIFVOU1BFQ0lGSUVEIE1lYXN1cmVTcGVjIgorICAgICAgICAgICAgICAgICAgICAgICAgKyIod3NwZWM9IiArIHdpZHRoU3BlY01vZGUgKyAiLCBoc3BlYz0iICsgaGVpZ2h0U3BlY01vZGUgKyAiKSIsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUnVudGltZUV4Y2VwdGlvbihMT0dfVEFHICsgInN0YWNrOiIpKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIG1MZWZ0U2xpZGVyLm1lYXN1cmUoKTsKQEAgLTYwOCwxNCArNjEwLDcgQEAKIAogICAgICAgICAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX1VQOgogICAgICAgICAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX0NBTkNFTDoKLSAgICAgICAgICAgICAgICAgICAgbVRyYWNraW5nID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIG1UcmlnZ2VyZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgbU90aGVyU2xpZGVyLnNob3codHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIG1DdXJyZW50U2xpZGVyLnJlc2V0KGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRTbGlkZXIuaGlkZVRhcmdldCgpOwotICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFNsaWRlciA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIG1PdGhlclNsaWRlciA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIHNldEdyYWJiZWRTdGF0ZShPblRyaWdnZXJMaXN0ZW5lci5OT19IQU5ETEUpOworICAgICAgICAgICAgICAgICAgICBjYW5jZWxHcmFiKCk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC02MjMsNiArNjE4LDE3IEBACiAgICAgICAgIHJldHVybiBtVHJhY2tpbmcgfHwgc3VwZXIub25Ub3VjaEV2ZW50KGV2ZW50KTsKICAgICB9CiAKKyAgICBwcml2YXRlIHZvaWQgY2FuY2VsR3JhYigpIHsKKyAgICAgICAgbVRyYWNraW5nID0gZmFsc2U7CisgICAgICAgIG1UcmlnZ2VyZWQgPSBmYWxzZTsKKyAgICAgICAgbU90aGVyU2xpZGVyLnNob3codHJ1ZSk7CisgICAgICAgIG1DdXJyZW50U2xpZGVyLnJlc2V0KGZhbHNlKTsKKyAgICAgICAgbUN1cnJlbnRTbGlkZXIuaGlkZVRhcmdldCgpOworICAgICAgICBtQ3VycmVudFNsaWRlciA9IG51bGw7CisgICAgICAgIG1PdGhlclNsaWRlciA9IG51bGw7CisgICAgICAgIHNldEdyYWJiZWRTdGF0ZShPblRyaWdnZXJMaXN0ZW5lci5OT19IQU5ETEUpOworICAgIH0KKwogICAgIHZvaWQgc3RhcnRBbmltYXRpbmcoZmluYWwgYm9vbGVhbiBob2xkQWZ0ZXIpIHsKICAgICAgICAgbUFuaW1hdGluZyA9IHRydWU7CiAgICAgICAgIGZpbmFsIEFuaW1hdGlvbiB0cmFuczE7CkBAIC04MzIsNiArODM4LDE3IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvblZpc2liaWxpdHlDaGFuZ2VkKFZpZXcgY2hhbmdlZFZpZXcsIGludCB2aXNpYmlsaXR5KSB7CisgICAgICAgIHN1cGVyLm9uVmlzaWJpbGl0eUNoYW5nZWQoY2hhbmdlZFZpZXcsIHZpc2liaWxpdHkpOworICAgICAgICAvLyBXaGVuIHZpc2liaWxpdHkgY2hhbmdlcyBhbmQgdGhlIHVzZXIgaGFzIGEgdGFiIHNlbGVjdGVkLCB1bnNlbGVjdCBpdCBhbmQKKyAgICAgICAgLy8gbWFrZSBzdXJlIHRoZWlyIGNhbGxiYWNrIGdldHMgY2FsbGVkLgorICAgICAgICBpZiAoY2hhbmdlZFZpZXcgPT0gdGhpcyAmJiB2aXNpYmlsaXR5ICE9IFZJU0lCTEUKKyAgICAgICAgICAgICAgICAmJiBtR3JhYmJlZFN0YXRlICE9IE9uVHJpZ2dlckxpc3RlbmVyLk5PX0hBTkRMRSkgeworICAgICAgICAgICAgY2FuY2VsR3JhYigpOworICAgICAgICB9CisgICAgfQorCiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgY3VycmVudCBncmFiYmVkIHN0YXRlLCBhbmQgZGlzcGF0Y2hlcyBhIGdyYWJiZWQgc3RhdGUgY2hhbmdlCiAgICAgICogZXZlbnQgdG8gb3VyIGxpc3RlbmVyLgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9jYXJvdXNlbC5ycyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvY2Fyb3VzZWwucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNmY2JmNAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvY2Fyb3VzZWwucnMKQEAgLTAsMCArMSw3NTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIHZlcnNpb24oMSkKKyNwcmFnbWEgcnMgamF2YV9wYWNrYWdlX25hbWUoY29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0KQorI3ByYWdtYSBycyBzZXRfcmVmbGVjdF9saWNlbnNlKCkKKworI2luY2x1ZGUgInJzX2dyYXBoaWNzLnJzaCIKKwordHlwZWRlZiBzdHJ1Y3QgX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg0KSkpIENhcmQgeworICAgIHJzX2FsbG9jYXRpb24gdGV4dHVyZTsKKyAgICByc19tZXNoIGdlb21ldHJ5OworICAgIC8vcnNfbWF0cml4NHg0IG1hdHJpeDsgLy8gY3VzdG9tIHRyYW5zZm9ybSBmb3IgdGhpcyBjYXJkL2dlb21ldHJ5CisgICAgaW50IHRleHR1cmVTdGF0ZTsgIC8vIHdoZXRoZXIgb3Igbm90IHRoZSB0ZXh0dXJlIGlzIGxvYWRlZC4KKyAgICBpbnQgZ2VvbWV0cnlTdGF0ZTsgLy8gd2hldGhlciBvciBub3QgZ2VvbWV0cnkgaXMgbG9hZGVkCisgICAgaW50IHZpc2libGU7IC8vIG5vdCBib29sIGJlY2F1c2Ugb2YgcGFja2luZyBidWc/Cit9IENhcmRfdDsKKwordHlwZWRlZiBzdHJ1Y3QgUmF5X3MgeworICAgIGZsb2F0MyBwb3NpdGlvbjsKKyAgICBmbG9hdDMgZGlyZWN0aW9uOworfSBSYXk7CisKK3R5cGVkZWYgc3RydWN0IFBlcnNwZWN0aXZlQ2FtZXJhX3MgeworICAgIGZsb2F0MyBmcm9tOworICAgIGZsb2F0MyBhdDsKKyAgICBmbG9hdDMgdXA7CisgICAgZmxvYXQgIGZvdjsKKyAgICBmbG9hdCAgYXNwZWN0OworICAgIGZsb2F0ICBuZWFyOworICAgIGZsb2F0ICBmYXI7Cit9IFBlcnNwZWN0aXZlQ2FtZXJhOworCisvLyBSZXF1ZXN0IHN0YXRlcy4gVXNlZCBmb3IgbG9hZGluZyAzRCBvYmplY3QgcHJvcGVydGllcyBmcm9tIHRoZSBKYXZhIGNsaWVudC4KKy8vIFR5cGljYWwgcHJvcGVydGllczogdGV4dHVyZSwgZ2VvbWV0cnkgYW5kIG1hdHJpY2VzLgorZW51bSB7CisgICAgU1RBVEVfSU5WQUxJRCA9IDAsIC8vIGl0ZW0gaGFzbid0IGJlZW4gbG9hZGVkCisgICAgU1RBVEVfTE9BRElORywgLy8gd2UndmUgcmVxdWVzdGVkIGFuIGl0ZW0gYnV0IGFyZSB3YWl0aW5nIGZvciBpdCB0byBsb2FkCisgICAgU1RBVEVfTE9BREVEIC8vIGl0ZW0gd2FzIGRlbGl2ZXJlZAorfTsKKworLy8gQ2xpZW50IG1lc3NhZ2VzICoqKiBUSElTIExJU1QgTVVTVCBNQVRDSCBUSE9TRSBJTiBDYXJvdXNlbFJTLmphdmEuICoqKgorY29uc3QgaW50IENNRF9DQVJEX1NFTEVDVEVEID0gMTAwOworY29uc3QgaW50IENNRF9SRVFVRVNUX1RFWFRVUkUgPSAyMDA7Citjb25zdCBpbnQgQ01EX0lOVkFMSURBVEVfVEVYVFVSRSA9IDIxMDsKK2NvbnN0IGludCBDTURfUkVRVUVTVF9HRU9NRVRSWSA9IDMwMDsKK2NvbnN0IGludCBDTURfSU5WQUxJREFURV9HRU9NRVRSWSA9IDMxMDsKK2NvbnN0IGludCBDTURfQU5JTUFUSU9OX1NUQVJURUQgPSA0MDA7Citjb25zdCBpbnQgQ01EX0FOSU1BVElPTl9GSU5JU0hFRCA9IDUwMDsKK2NvbnN0IGludCBDTURfUElORyA9IDYwMDsKKworCisvLyBEZWJ1ZyBmbGFncworYm9vbCBkZWJ1Z0NhbWVyYSA9IGZhbHNlOworYm9vbCBkZWJ1Z1BpY2tpbmcgPSBmYWxzZTsKKworLy8gRXhwb3J0ZWQgdmFyaWFibGVzLiBUaGVzZSB3aWxsIGJlIHJlZmxlY3RlZCB0byBKYXZhIHNldF8qIHZhcmlhYmxlcy4KK0NhcmRfdCAqY2FyZHM7IC8vIGFycmF5IG9mIGNhcmRzIHRvIGRyYXcKK2Zsb2F0IHN0YXJ0QW5nbGU7IC8vIHBvc2l0aW9uIG9mIGluaXRpYWwgY2FyZCwgaW4gcmFkaWFucworaW50IHNsb3RDb3VudDsgLy8gbnVtYmVyIG9mIHBvc2l0aW9ucyB3aGVyZSBhIGNhcmQgY2FuIGJlCitpbnQgY2FyZENvdW50OyAvLyBudW1iZXIgb2YgY2FyZHMgaW4gc3RhY2sKK2ludCB2aXNpYmxlU2xvdENvdW50OyAvLyBudW1iZXIgb2YgdmlzaWJsZSBzbG90cyAoZm9yIGN1bGxpbmcpCitmbG9hdCByYWRpdXM7IC8vIGNhcm91c2VsIHJhZGl1cy4gQ2FyZHMgd2lsbCBiZSBjZW50ZXJlZCBvbiBhIGNpcmNsZSB3aXRoIHRoaXMgcmFkaXVzCitmbG9hdCBjYXJkUm90YXRpb247IC8vIHJvdGF0aW9uIG9mIGNhcmQgaW4gWFkgcGxhbmUgcmVsYXRpdmUgdG8gWj0xCityc19wcm9ncmFtX3N0b3JlIHByb2dyYW1TdG9yZTsKK3JzX3Byb2dyYW1fZnJhZ21lbnQgZnJhZ21lbnRQcm9ncmFtOworcnNfcHJvZ3JhbV92ZXJ0ZXggdmVydGV4UHJvZ3JhbTsKK3JzX3Byb2dyYW1fcmFzdGVyIHJhc3RlclByb2dyYW07Cityc19hbGxvY2F0aW9uIGRlZmF1bHRUZXh0dXJlOyAvLyBzaG93biB3aGVuIG5vIG90aGVyIHRleHR1cmUgaXMgYXNzaWduZWQKK3JzX2FsbG9jYXRpb24gbG9hZGluZ1RleHR1cmU7IC8vIHByb2dyZXNzIHRleHR1cmUgKHNob3duIHdoZW4gYXBwIGlzIGZldGNoaW5nIHRoZSB0ZXh0dXJlKQorcnNfbWVzaCBkZWZhdWx0R2VvbWV0cnk7IC8vIHNob3duIHdoZW4gbm8gZ2VvbWV0cnkgaXMgbG9hZGVkCityc19tZXNoIGxvYWRpbmdHZW9tZXRyeTsgLy8gc2hvd24gd2hlbiBnZW9tZXRyeSBpcyBsb2FkaW5nCityc19tYXRyaXg0eDQgcHJvamVjdGlvbk1hdHJpeDsKK3JzX21hdHJpeDR4NCBtb2RlbHZpZXdNYXRyaXg7CisKKyNwcmFnbWEgcnMgZXhwb3J0X3ZhcihyYWRpdXMsIGNhcmRzLCBzbG90Q291bnQsIHZpc2libGVTbG90Q291bnQsIGNhcmRSb3RhdGlvbikKKyNwcmFnbWEgcnMgZXhwb3J0X3Zhcihwcm9ncmFtU3RvcmUsIGZyYWdtZW50UHJvZ3JhbSwgdmVydGV4UHJvZ3JhbSwgcmFzdGVyUHJvZ3JhbSkKKyNwcmFnbWEgcnMgZXhwb3J0X3ZhcihzdGFydEFuZ2xlLCBkZWZhdWx0VGV4dHVyZSwgbG9hZGluZ1RleHR1cmUsIGRlZmF1bHRHZW9tZXRyeSwgbG9hZGluZ0dlb21ldHJ5KQorI3ByYWdtYSBycyBleHBvcnRfZnVuYyhjcmVhdGVDYXJkcywgbG9va0F0LCBkb1N0YXJ0LCBkb1N0b3AsIGRvTW90aW9uLCBkb1NlbGVjdGlvbiwgc2V0VGV4dHVyZSkKKyNwcmFnbWEgcnMgZXhwb3J0X2Z1bmMoc2V0R2VvbWV0cnksIGRlYnVnQ2FtZXJhLCBkZWJ1Z1BpY2tpbmcpCisKKy8vIExvY2FsIHZhcmlhYmxlcworc3RhdGljIGZsb2F0IGJpYXM7IC8vIHJvdGF0aW9uIGJpYXMsIGluIHJhZGlhbnMuIFVzZWQgZm9yIGFuaW1hdGlvbiBhbmQgZHJhZ2dpbmcuCitzdGF0aWMgYm9vbCB1cGRhdGVDYW1lcmE7ICAgIC8vIGZvcmNlIGEgcmVjb21wdXRlIG9mIHByb2plY3Rpb24gYW5kIGxvb2thdCBtYXRyaWNlcworc3RhdGljIGJvb2wgaW5pdGlhbGl6ZWQ7CitzdGF0aWMgZmxvYXQzIGJhY2tncm91bmRDb2xvciA9IHsgMC41ZiwgMC41ZiwgMC41ZiB9Oworc3RhdGljIGNvbnN0IGZsb2F0IEZMVF9NQVggPSAxLjBlMzc7CisKKy8vIERlZmF1bHQgZ2VvbWV0cnkgd2hlbiBjYXJkLmdlb21ldHJ5IGlzIG5vdCBzZXQuCitzdGF0aWMgY29uc3QgZmxvYXQzIGNhcmRWZXJ0aWNlc1s0XSA9IHsKKyAgICAgICAgeyAtMS4wLCAtMS4wLCAwLjAgfSwKKyAgICAgICAgeyAxLjAsIC0xLjAsIDAuMCB9LAorICAgICAgICB7IDEuMCwgMS4wLCAwLjAgfSwKKyAgICAgICAgey0xLjAsIDEuMCwgMC4wIH0KK307CisKKy8vIERlZmF1bHQgY2FtZXJhCitzdGF0aWMgUGVyc3BlY3RpdmVDYW1lcmEgY2FtZXJhID0geworICAgICAgICB7MiwyLDJ9LCAvLyBmcm9tCisgICAgICAgIHswLDAsMH0sIC8vIGF0CisgICAgICAgIHswLDEsMH0sIC8vIHVwCisgICAgICAgIDI1LjBmLCAgIC8vIGZpZWxkIG9mIHZpZXcKKyAgICAgICAgMS4wZiwgICAgLy8gYXNwZWN0CisgICAgICAgIDAuMWYsICAgIC8vIG5lYXIKKyAgICAgICAgMTAwLjBmICAgLy8gZmFyCit9OworCisvLyBGb3J3YXJkIHJlZmVyZW5jZXMKK3N0YXRpYyBpbnQgaW50ZXJzZWN0R2VvbWV0cnkoUmF5KiByYXksIGZsb2F0ICpiZXN0VGltZSk7CitzdGF0aWMgYm9vbCBtYWtlUmF5Rm9yUGl4ZWxBdChSYXkqIHJheSwgZmxvYXQgeCwgZmxvYXQgeSk7CisKK3ZvaWQgaW5pdCgpIHsKKyAgICAvLyBpbml0aWFsaXplcnMgY3VycmVudGx5IGhhdmUgYSBwcm9ibGVtIHdoZW4gdGhlIHZhcmlhYmxlcyBhcmUgZXhwb3J0ZWQsIHNvIGluaXRpYWxpemUKKyAgICAvLyBnbG9iYWxzIGhlcmUuCisgICAgc3RhcnRBbmdsZSA9IDAuMGY7CisgICAgc2xvdENvdW50ID0gMTA7CisgICAgdmlzaWJsZVNsb3RDb3VudCA9IDE7CisgICAgYmlhcyA9IDAuMGY7CisgICAgcmFkaXVzID0gMS4wZjsKKyAgICBjYXJkUm90YXRpb24gPSAwLjBmOworICAgIHVwZGF0ZUNhbWVyYSA9IHRydWU7CisgICAgaW5pdGlhbGl6ZWQgPSBmYWxzZTsKK30KKworc3RhdGljIHZvaWQgdXBkYXRlQWxsb2NhdGlvblZhcnMoKQoreworICAgIC8vIENhcmRzCisgICAgcnNfYWxsb2NhdGlvbiBjYXJkQWxsb2MgPSByc0dldEFsbG9jYXRpb24oY2FyZHMpOworICAgIC8vIFRPRE86IHVzZSBuZXcgcnNJc09iamVjdCgpCisgICAgY2FyZENvdW50ID0gY2FyZEFsbG9jLnAgIT0gMCA/IHJzQWxsb2NhdGlvbkdldERpbVgoY2FyZEFsbG9jKSA6IDA7Cit9CisKK3ZvaWQgY3JlYXRlQ2FyZHMoaW50IG4pCit7CisgICAgcnNEZWJ1ZygiQ3JlYXRlQ2FyZHM6ICIsIG4pOworICAgIGluaXRpYWxpemVkID0gZmFsc2U7CisgICAgdXBkYXRlQWxsb2NhdGlvblZhcnMoKTsKK30KKworLy8gUmV0dXJuIGFuZ2xlIGZvciBwb3NpdGlvbiBwLiBUeXBpY2FsbHkgcCB3aWxsIGJlIGFuIGludGVnZXIgcG9zaXRpb24sIGJ1dCBjYW4gYmUgZnJhY3Rpb25hbC4KK3N0YXRpYyBmbG9hdCBjYXJkUG9zaXRpb24oZmxvYXQgcCkKK3sKKyAgICByZXR1cm4gc3RhcnRBbmdsZSArIGJpYXMgKyAyLjBmICogTV9QSSAqIHAgLyBzbG90Q291bnQ7Cit9CisKKy8vIFJldHVybiBzbG90IGZvciBhIGNhcmQgaW4gcG9zaXRpb24gcC4gVHlwaWNhbGx5IHAgd2lsbCBiZSBhbiBpbnRlZ2VyIHNsb3QsIGJ1dCBjYW4gYmUgZnJhY3Rpb25hbC4KK3N0YXRpYyBmbG9hdCBzbG90UG9zaXRpb24oZmxvYXQgcCkKK3sKKyAgICByZXR1cm4gc3RhcnRBbmdsZSArIDIuMGYgKiBNX1BJICogcCAvIHNsb3RDb3VudDsKK30KKworLy8gUmV0dXJuIHRoZSBsb3dlc3Qgc2xvdCBudW1iZXIgZm9yIGEgZ2l2ZW4gYW5ndWxhciBwb3NpdGlvbi4KK3N0YXRpYyBpbnQgY2FyZEluZGV4KGZsb2F0IGFuZ2xlKQoreworICAgIHJldHVybiBmbG9vcihhbmdsZSAtIHN0YXJ0QW5nbGUgLSBiaWFzKSAqIHNsb3RDb3VudCAvICgyLjBmICogTV9QSSk7Cit9CisKKy8vIFNldCBiYXNpYyBjYW1lcmEgcHJvcGVydGllczoKKy8vICAgIGZyb20gLSBwb3NpdGlvbiBvZiB0aGUgY2FtZXJhIGluIHgseSx6CisvLyAgICBhdCAtIHRhcmdldCB3ZSdyZSBsb29raW5nIGF0IC0gdXNlZCB0byBjb21wdXRlIHZpZXcgZGlyZWN0aW9uCisvLyAgICB1cCAtIGEgbm9ybWFsaXplZCB2ZWN0b3IgaW5kaWNhdGluZyB1cCAodHlwaWNhbGx5IHsgMCwgMSwgMH0pCisvLworLy8gTk9URTogdGhlIHZpZXcgZGlyZWN0aW9uIGFuZCB1cCB2ZWN0b3IgY2Fubm90IGJlIHBhcmFsbGVsL2FudGlwYXJhbGxlbCB3aXRoIGVhY2ggb3RoZXIKK3ZvaWQgbG9va0F0KGZsb2F0IGZyb21YLCBmbG9hdCBmcm9tWSwgZmxvYXQgZnJvbVosCisgICAgICAgIGZsb2F0IGF0WCwgZmxvYXQgYXRZLCBmbG9hdCBhdFosCisgICAgICAgIGZsb2F0IHVwWCwgZmxvYXQgdXBZLCBmbG9hdCB1cFopCit7CisgICAgY2FtZXJhLmZyb20ueCA9IGZyb21YOworICAgIGNhbWVyYS5mcm9tLnkgPSBmcm9tWTsKKyAgICBjYW1lcmEuZnJvbS56ID0gZnJvbVo7CisgICAgY2FtZXJhLmF0LnggPSBhdFg7CisgICAgY2FtZXJhLmF0LnkgPSBhdFk7CisgICAgY2FtZXJhLmF0LnogPSBhdFo7CisgICAgY2FtZXJhLnVwLnggPSB1cFg7CisgICAgY2FtZXJhLnVwLnkgPSB1cFk7CisgICAgY2FtZXJhLnVwLnogPSB1cFo7CisgICAgdXBkYXRlQ2FtZXJhID0gdHJ1ZTsKK30KKworLy8gTG9hZCBhIHByb2plY3Rpb24gbWF0cml4IGZvciB0aGUgZ2l2ZW4gcGFyYW1ldGVycy4gIFRoaXMgaXMgZXF1aXZhbGVudCB0byBnbHVQZXJzcGVjdGl2ZSgpCitzdGF0aWMgdm9pZCBsb2FkUGVyc3BlY3RpdmVNYXRyaXgocnNfbWF0cml4NHg0KiBtYXRyaXgsIGZsb2F0IGZvdnksIGZsb2F0IGFzcGVjdCwgZmxvYXQgbmVhciwgZmxvYXQgZmFyKQoreworICAgIHJzTWF0cml4TG9hZElkZW50aXR5KG1hdHJpeCk7CisgICAgZmxvYXQgdG9wID0gbmVhciAqIHRhbigoZmxvYXQpIChmb3Z5ICogTV9QSSAvIDM2MC4wZikpOworICAgIGZsb2F0IGJvdHRvbSA9IC10b3A7CisgICAgZmxvYXQgbGVmdCA9IGJvdHRvbSAqIGFzcGVjdDsKKyAgICBmbG9hdCByaWdodCA9IHRvcCAqIGFzcGVjdDsKKyAgICByc01hdHJpeExvYWRGcnVzdHVtKG1hdHJpeCwgbGVmdCwgcmlnaHQsIGJvdHRvbSwgdG9wLCBuZWFyLCBmYXIpOworfQorCisvLyBDb25zdHJ1Y3QgYSBtYXRyaXggYmFzZWQgb24gZXllIHBvaW50LCBjZW50ZXIgYW5kIHVwIGRpcmVjdGlvbi4gQmFzZWQgb24gdGhlCisvLyBtYW4gcGFnZSBmb3IgZ2x1TG9va2F0KCkuIFVwIG11c3QgYmUgbm9ybWFsaXplZC4KK3N0YXRpYyB2b2lkIGxvYWRMb29rYXRNYXRyaXgocnNfbWF0cml4NHg0KiBtYXRyaXgsIGZsb2F0MyBleWUsIGZsb2F0MyBjZW50ZXIsIGZsb2F0MyB1cCkKK3sKKyAgICBmbG9hdDMgZiA9IG5vcm1hbGl6ZShjZW50ZXIgLSBleWUpOworICAgIGZsb2F0MyBzID0gbm9ybWFsaXplKGNyb3NzKGYsIHVwKSk7CisgICAgZmxvYXQzIHUgPSBjcm9zcyhzLCBmKTsKKyAgICBmbG9hdCBtWzE2XTsKKyAgICBtWzBdID0gcy54OworICAgIG1bNF0gPSBzLnk7CisgICAgbVs4XSA9IHMuejsKKyAgICBtWzEyXSA9IDAuMGY7CisgICAgbVsxXSA9IHUueDsKKyAgICBtWzVdID0gdS55OworICAgIG1bOV0gPSB1Lno7CisgICAgbVsxM10gPSAwLjBmOworICAgIG1bMl0gPSAtZi54OworICAgIG1bNl0gPSAtZi55OworICAgIG1bMTBdID0gLWYuejsKKyAgICBtWzE0XSA9IDAuMGY7CisgICAgbVszXSA9IG1bN10gPSBtWzExXSA9IDAuMGY7CisgICAgbVsxNV0gPSAxLjBmOworICAgIHJzTWF0cml4TG9hZChtYXRyaXgsIG0pOworICAgIHJzTWF0cml4VHJhbnNsYXRlKG1hdHJpeCwgLWV5ZS54LCAtZXllLnksIC1leWUueik7Cit9CisKK3ZvaWQgc2V0VGV4dHVyZShpbnQgbiwgcnNfYWxsb2NhdGlvbiB0ZXh0dXJlKQoreworICAgIGNhcmRzW25dLnRleHR1cmUgPSB0ZXh0dXJlOworICAgIGlmIChjYXJkc1tuXS50ZXh0dXJlLnAgIT0gMCkKKyAgICAgICAgY2FyZHNbbl0udGV4dHVyZVN0YXRlID0gU1RBVEVfTE9BREVEOworICAgIGVsc2UKKyAgICAgICAgY2FyZHNbbl0udGV4dHVyZVN0YXRlID0gU1RBVEVfSU5WQUxJRDsKK30KKwordm9pZCBzZXRHZW9tZXRyeShpbnQgbiwgcnNfbWVzaCBnZW9tZXRyeSkKK3sKKyAgICBjYXJkc1tuXS5nZW9tZXRyeSA9IGdlb21ldHJ5OworICAgIGlmIChjYXJkc1tuXS5nZW9tZXRyeS5wICE9IDApCisgICAgICAgIGNhcmRzW25dLmdlb21ldHJ5U3RhdGUgPSBTVEFURV9MT0FERUQ7CisgICAgZWxzZQorICAgICAgICBjYXJkc1tuXS5nZW9tZXRyeVN0YXRlID0gU1RBVEVfSU5WQUxJRDsKK30KKworc3RhdGljIHZvaWQgZ2V0TWF0cml4Rm9yQ2FyZChyc19tYXRyaXg0eDQqIG1hdHJpeCwgaW50IGkpCit7CisgICAgZmxvYXQgdGhldGEgPSBjYXJkUG9zaXRpb24oaSk7CisgICAgcnNNYXRyaXhSb3RhdGUobWF0cml4LCBkZWdyZWVzKHRoZXRhKSwgMCwgMSwgMCk7CisgICAgcnNNYXRyaXhUcmFuc2xhdGUobWF0cml4LCByYWRpdXMsIDAsIDApOworICAgIHJzTWF0cml4Um90YXRlKG1hdHJpeCwgZGVncmVlcygtdGhldGEgKyBjYXJkUm90YXRpb24pLCAwLCAxLCAwKTsKKyAgICAvLyBUT0RPOiBhcHBseSBjdXN0b20gbWF0cml4IGZvciBjYXJkc1tpXS5nZW9tZXRyeQorfQorCitzdGF0aWMgdm9pZCBkcmF3Q2FyZHMoKQoreworICAgIGZsb2F0IGRlcHRoID0gMS4wZjsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGNhcmRDb3VudDsgaSsrKSB7CisgICAgICAgIGlmIChjYXJkc1tpXS52aXNpYmxlKSB7CisgICAgICAgICAgICAvLyBCaW5kIHRleHR1cmUKKyAgICAgICAgICAgIGlmIChjYXJkc1tpXS50ZXh0dXJlU3RhdGUgPT0gU1RBVEVfTE9BREVEKSB7CisgICAgICAgICAgICAgICAgcnNnQmluZFRleHR1cmUoZnJhZ21lbnRQcm9ncmFtLCAwLCBjYXJkc1tpXS50ZXh0dXJlKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoY2FyZHNbaV0udGV4dHVyZVN0YXRlID09IFNUQVRFX0xPQURJTkcpIHsKKyAgICAgICAgICAgICAgICByc2dCaW5kVGV4dHVyZShmcmFnbWVudFByb2dyYW0sIDAsIGxvYWRpbmdUZXh0dXJlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcnNnQmluZFRleHR1cmUoZnJhZ21lbnRQcm9ncmFtLCAwLCBkZWZhdWx0VGV4dHVyZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIERyYXcgZ2VvbWV0cnkKKyAgICAgICAgICAgIHJzX21hdHJpeDR4NCBtYXRyaXggPSBtb2RlbHZpZXdNYXRyaXg7CisgICAgICAgICAgICBnZXRNYXRyaXhGb3JDYXJkKCZtYXRyaXgsIGkpOworICAgICAgICAgICAgcnNnUHJvZ3JhbVZlcnRleExvYWRNb2RlbE1hdHJpeCgmbWF0cml4KTsKKyAgICAgICAgICAgIGlmIChjYXJkc1tpXS5nZW9tZXRyeVN0YXRlID09IFNUQVRFX0xPQURFRCAmJiBjYXJkc1tpXS5nZW9tZXRyeS5wICE9IDApIHsKKyAgICAgICAgICAgICAgICByc2dEcmF3TWVzaChjYXJkc1tpXS5nZW9tZXRyeSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGNhcmRzW2ldLmdlb21ldHJ5U3RhdGUgPT0gU1RBVEVfTE9BRElORyAmJiBsb2FkaW5nR2VvbWV0cnkucCAhPSAwKSB7CisgICAgICAgICAgICAgICAgcnNnRHJhd01lc2gobG9hZGluZ0dlb21ldHJ5KTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZGVmYXVsdEdlb21ldHJ5LnAgIT0gMCkgeworICAgICAgICAgICAgICAgIHJzZ0RyYXdNZXNoKGRlZmF1bHRHZW9tZXRyeSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIERyYXcgcGxhY2UtaG9sZGVyIGdlb21ldHJ5CisgICAgICAgICAgICAgICAgcnNnRHJhd1F1YWQoCisgICAgICAgICAgICAgICAgICAgIGNhcmRWZXJ0aWNlc1swXS54LCBjYXJkVmVydGljZXNbMF0ueSwgY2FyZFZlcnRpY2VzWzBdLnosCisgICAgICAgICAgICAgICAgICAgIGNhcmRWZXJ0aWNlc1sxXS54LCBjYXJkVmVydGljZXNbMV0ueSwgY2FyZFZlcnRpY2VzWzFdLnosCisgICAgICAgICAgICAgICAgICAgIGNhcmRWZXJ0aWNlc1syXS54LCBjYXJkVmVydGljZXNbMl0ueSwgY2FyZFZlcnRpY2VzWzJdLnosCisgICAgICAgICAgICAgICAgICAgIGNhcmRWZXJ0aWNlc1szXS54LCBjYXJkVmVydGljZXNbM10ueSwgY2FyZFZlcnRpY2VzWzNdLnopOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCB1cGRhdGVDYW1lcmFNYXRyaXgoZmxvYXQgd2lkdGgsIGZsb2F0IGhlaWdodCkKK3sKKyAgICBmbG9hdCBhc3BlY3QgPSB3aWR0aCAvIGhlaWdodDsKKyAgICBpZiAoYXNwZWN0ICE9IGNhbWVyYS5hc3BlY3QgfHwgdXBkYXRlQ2FtZXJhKSB7CisgICAgICAgIGNhbWVyYS5hc3BlY3QgPSBhc3BlY3Q7CisgICAgICAgIGxvYWRQZXJzcGVjdGl2ZU1hdHJpeCgmcHJvamVjdGlvbk1hdHJpeCwgY2FtZXJhLmZvdiwgY2FtZXJhLmFzcGVjdCwgY2FtZXJhLm5lYXIsIGNhbWVyYS5mYXIpOworICAgICAgICByc2dQcm9ncmFtVmVydGV4TG9hZFByb2plY3Rpb25NYXRyaXgoJnByb2plY3Rpb25NYXRyaXgpOworCisgICAgICAgIGxvYWRMb29rYXRNYXRyaXgoJm1vZGVsdmlld01hdHJpeCwgY2FtZXJhLmZyb20sIGNhbWVyYS5hdCwgY2FtZXJhLnVwKTsKKyAgICAgICAgcnNnUHJvZ3JhbVZlcnRleExvYWRNb2RlbE1hdHJpeCgmbW9kZWx2aWV3TWF0cml4KTsKKyAgICAgICAgdXBkYXRlQ2FtZXJhID0gZmFsc2U7CisgICAgfQorfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBCZWhhdmlvci9QaHlzaWNzCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCitzdGF0aWMgZmxvYXQgdmVsb2NpdHkgPSAwLjBmOyAgLy8gYW5ndWxhciB2ZWxvY2l0eSBpbiByYWRpYW5zL3MKK3N0YXRpYyBib29sIGlzRHJhZ2dpbmc7CitzdGF0aWMgaW50NjRfdCBsYXN0VGltZSA9IDBMOyAvLyBrZWVwIHRyYWNrIG9mIGhvdyBtdWNoIHRpbWUgaGFzIHBhc3NlZCBiZXR3ZWVuIGZyYW1lcworc3RhdGljIGZsb2F0MiBsYXN0UG9zaXRpb247CitzdGF0aWMgYm9vbCBhbmltYXRpbmcgPSBmYWxzZTsKK3N0YXRpYyBmbG9hdCB2ZWxvY2l0eVRocmVzaG9sZCA9IDAuMWYgKiBNX1BJIC8gMTgwLjBmOworc3RhdGljIGZsb2F0IHZlbG9jaXR5VHJhY2tlcjsKK3N0YXRpYyBpbnQgdmVsb2NpdHlUcmFja2VyQ291bnQ7CitzdGF0aWMgZmxvYXQgbWFzcyA9IDUuMGY7IC8vIGtnCisKK3N0YXRpYyBjb25zdCBmbG9hdCBHID0gOS44MGY7IC8vIGdyYXZpdHkgY29uc3RhbnQsIGluIG0vcworc3RhdGljIGNvbnN0IGZsb2F0IHNwcmluZ0NvbnN0YW50ID0gMC4wZjsKK3N0YXRpYyBjb25zdCBmbG9hdCBmcmljdGlvbkNvZWZmID0gMTAuMGY7CitzdGF0aWMgY29uc3QgZmxvYXQgZHJhZ0ZhY3RvciA9IDAuMjVmOworCitzdGF0aWMgZmxvYXQgZHJhZ0Z1bmN0aW9uKGZsb2F0IHgsIGZsb2F0IHkpCit7CisgICAgcmV0dXJuIGRyYWdGYWN0b3IgKiAoKHggLSBsYXN0UG9zaXRpb24ueCkgLyByc2dHZXRXaWR0aCgpKSAqIE1fUEk7Cit9CisKK3N0YXRpYyBmbG9hdCBkZWx0YVRpbWVJblNlY29uZHMoaW50NjRfdCBjdXJyZW50KQoreworICAgIHJldHVybiAobGFzdFRpbWUgPiAwTCkgPyAoZmxvYXQpIChjdXJyZW50IC0gbGFzdFRpbWUpIC8gMTAwMC4wZiA6IDAuMGY7Cit9CisKK2ludCBkb1NlbGVjdGlvbihmbG9hdCB4LCBmbG9hdCB5KQoreworICAgIFJheSByYXk7CisgICAgaWYgKG1ha2VSYXlGb3JQaXhlbEF0KCZyYXksIHgsIHkpKSB7CisgICAgICAgIGZsb2F0IGJlc3RUaW1lID0gRkxUX01BWDsKKyAgICAgICAgcmV0dXJuIGludGVyc2VjdEdlb21ldHJ5KCZyYXksICZiZXN0VGltZSk7CisgICAgfQorICAgIHJldHVybiAtMTsKK30KKwordm9pZCBkb1N0YXJ0KGZsb2F0IHgsIGZsb2F0IHkpCit7CisgICAgbGFzdFBvc2l0aW9uLnggPSB4OworICAgIGxhc3RQb3NpdGlvbi55ID0geTsKKyAgICB2ZWxvY2l0eSA9IDAuMGY7CisgICAgaWYgKGFuaW1hdGluZykgeworICAgICAgICByc1NlbmRUb0NsaWVudChDTURfQU5JTUFUSU9OX0ZJTklTSEVEKTsKKyAgICAgICAgYW5pbWF0aW5nID0gZmFsc2U7CisgICAgfQorICAgIHZlbG9jaXR5VHJhY2tlciA9IDAuMGY7CisgICAgdmVsb2NpdHlUcmFja2VyQ291bnQgPSAwOworfQorCisKK3ZvaWQgZG9TdG9wKGZsb2F0IHgsIGZsb2F0IHkpCit7CisgICAgdXBkYXRlQWxsb2NhdGlvblZhcnMoKTsKKworICAgIHZlbG9jaXR5ID0gdmVsb2NpdHlUcmFja2VyQ291bnQgPiAwID8KKyAgICAgICAgICAgICh2ZWxvY2l0eVRyYWNrZXIgLyB2ZWxvY2l0eVRyYWNrZXJDb3VudCkgOiAwLjBmOyAgLy8gYXZnIHZlbG9jaXR5CisgICAgaWYgKGZhYnModmVsb2NpdHkpID4gdmVsb2NpdHlUaHJlc2hvbGQpIHsKKyAgICAgICAgYW5pbWF0aW5nID0gdHJ1ZTsKKyAgICAgICAgcnNTZW5kVG9DbGllbnQoQ01EX0FOSU1BVElPTl9TVEFSVEVEKTsKKyAgICB9IGVsc2UgeworICAgICAgICBjb25zdCBpbnQgc2VsZWN0aW9uID0gZG9TZWxlY3Rpb24oeCwgeSk7ICAvLyB2ZWxvY2l0eSB0b28gc21hbGw7IHRyZWF0IGFzIGEgdGFwCisgICAgICAgIGlmIChzZWxlY3Rpb24gIT0gLTEpIHsKKyAgICAgICAgICAgIHJzRGVidWcoIkhJVCEiLCBzZWxlY3Rpb24pOworICAgICAgICAgICAgaW50IGRhdGFbMV07CisgICAgICAgICAgICBkYXRhWzBdID0gc2VsZWN0aW9uOworICAgICAgICAgICAgcnNTZW5kVG9DbGllbnQoQ01EX0NBUkRfU0VMRUNURUQsIGRhdGEsIHNpemVvZihkYXRhKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgbGFzdFRpbWUgPSByc1VwdGltZU1pbGxpcygpOworfQorCit2b2lkIGRvTW90aW9uKGZsb2F0IHgsIGZsb2F0IHkpCit7CisgICAgaW50NjRfdCBjdXJyZW50VGltZSA9IHJzVXB0aW1lTWlsbGlzKCk7CisgICAgZmxvYXQgZGVsdGFPbWVnYSA9IGRyYWdGdW5jdGlvbih4LCB5KTsKKyAgICBiaWFzICs9IGRlbHRhT21lZ2E7CisgICAgbGFzdFBvc2l0aW9uLnggPSB4OworICAgIGxhc3RQb3NpdGlvbi55ID0geTsKKyAgICBmbG9hdCBkdCA9IGRlbHRhVGltZUluU2Vjb25kcyhjdXJyZW50VGltZSk7CisgICAgaWYgKGR0ID4gMC4wZikgeworICAgICAgICBmbG9hdCB2ID0gZGVsdGFPbWVnYSAvIGR0OworICAgICAgICAvL2lmICgodmVsb2NpdHlUcmFja2VyID4gMC4wZikgPT0gKHYgPiAwLjBmKSkgeworICAgICAgICAgICAgdmVsb2NpdHlUcmFja2VyICs9IHY7CisgICAgICAgICAgICB2ZWxvY2l0eVRyYWNrZXJDb3VudCsrOworICAgICAgICAvL30gZWxzZSB7CisgICAgICAgIC8vICAgIHZlbG9jaXR5VHJhY2tlciA9IHY7CisgICAgICAgIC8vICAgIHZlbG9jaXR5VHJhY2tlckNvdW50ID0gMTsKKyAgICAgICAgLy99CisgICAgfQorICAgIGxhc3RUaW1lID0gY3VycmVudFRpbWU7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEhpdCBkZXRlY3Rpb24gdXNpbmcgcmF5IGNhc3RpbmcuCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3N0YXRpYyBib29sCityYXlUcmlhbmdsZUludGVyc2VjdChSYXkqIHJheSwgZmxvYXQzIHAwLCBmbG9hdDMgcDEsIGZsb2F0MyBwMiwgZmxvYXQgKnRvdXQpCit7CisgICAgc3RhdGljIGNvbnN0IGZsb2F0IHRtaW4gPSAwLjBmOworCisgICAgZmxvYXQzIGUxID0gcDEgLSBwMDsKKyAgICBmbG9hdDMgZTIgPSBwMiAtIHAwOworICAgIGZsb2F0MyBzMSA9IGNyb3NzKHJheS0+ZGlyZWN0aW9uLCBlMik7CisKKyAgICBmbG9hdCBkaXYgPSBkb3QoczEsIGUxKTsKKyAgICBpZiAoZGl2ID09IDAuMGYpIHJldHVybiBmYWxzZTsgIC8vIHJheSBpcyBwYXJhbGxlbCB0byBwbGFuZS4KKworICAgIGZsb2F0MyBkID0gcmF5LT5wb3NpdGlvbiAtIHAwOworICAgIGZsb2F0IGludkRpdiA9IDEuMGYgLyBkaXY7CisKKyAgICBmbG9hdCB1ID0gZG90KGQsIHMxKSAqIGludkRpdjsKKyAgICBpZiAodSA8IDAuMGYgfHwgdSA+IDEuMGYpIHJldHVybiBmYWxzZTsKKworICAgIGZsb2F0MyBzMiA9IGNyb3NzKGQsIGUxKTsKKyAgICBmbG9hdCB2ID0gZG90KHJheS0+ZGlyZWN0aW9uLCBzMikgKiBpbnZEaXY7CisgICAgaWYgKCB2IDwgMC4wZiB8fCAodSt2KSA+IDEuMGYpIHJldHVybiBmYWxzZTsKKworICAgIGZsb2F0IHQgPSBkb3QoZTIsIHMyKSAqIGludkRpdjsKKyAgICBpZiAodCA8IHRtaW4gfHwgdCA+ICp0b3V0KQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgKnRvdXQgPSB0OworICAgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbCBtYWtlUmF5Rm9yUGl4ZWxBdChSYXkqIHJheSwgZmxvYXQgeCwgZmxvYXQgeSkKK3sKKyAgICBpZiAoZGVidWdDYW1lcmEpIHsKKyAgICAgICAgcnNEZWJ1ZygiLS0tLS0tIG1ha2VSYXkoKSAtLS0tLS0tIiwgMCk7CisgICAgICAgIHJzRGVidWcoIkNhbWVyYS5mcm9tOiIsIGNhbWVyYS5mcm9tKTsKKyAgICAgICAgcnNEZWJ1ZygiQ2FtZXJhLmF0OiIsIGNhbWVyYS5hdCk7CisgICAgICAgIHJzRGVidWcoIkNhbWVyYS5kaXI6Iiwgbm9ybWFsaXplKGNhbWVyYS5hdCAtIGNhbWVyYS5mcm9tKSk7CisgICAgfQorCisgICAgLy8gVmVjdG9yIG1hdGguICBUaGlzIGhhcyB0aGUgcG90ZW50aWFsIHRvIGJlIG11Y2ggZmFzdGVyLgorICAgIC8vIFRPRE86IHByZS1jb21wdXRlIGxvd2VyTGVmdFJheSwgZHUsIGR2IHRvIGVsaW1pbmF0ZSBtb3N0IG9mIHRoaXMgbWF0aC4KKyAgICBpZiAodHJ1ZSkgeworICAgICAgICBjb25zdCBmbG9hdCB1ID0geCAvIHJzZ0dldFdpZHRoKCk7CisgICAgICAgIGNvbnN0IGZsb2F0IHYgPSAoeSAvIHJzZ0dldEhlaWdodCgpKTsKKyAgICAgICAgY29uc3QgZmxvYXQgYXNwZWN0ID0gKGZsb2F0KSByc2dHZXRXaWR0aCgpIC8gcnNnR2V0SGVpZ2h0KCk7CisgICAgICAgIGNvbnN0IGZsb2F0IHRhbmZvdjIgPSAyLjBmICogdGFuKHJhZGlhbnMoY2FtZXJhLmZvdiAvIDIuMGYpKTsKKyAgICAgICAgZmxvYXQzIGRpciA9IG5vcm1hbGl6ZShjYW1lcmEuYXQgLSBjYW1lcmEuZnJvbSk7CisgICAgICAgIGZsb2F0MyBkdSA9IHRhbmZvdjIgKiBub3JtYWxpemUoY3Jvc3MoZGlyLCBjYW1lcmEudXApKTsKKyAgICAgICAgZmxvYXQzIGR2ID0gdGFuZm92MiAqIG5vcm1hbGl6ZShjcm9zcyhkdSwgZGlyKSk7CisgICAgICAgIGR1ICo9IGFzcGVjdDsKKyAgICAgICAgZmxvYXQzIGxvd2VyTGVmdFJheSA9IGRpciAtICgwLjVmICogZHUpIC0gKDAuNWYgKiBkdik7CisgICAgICAgIGNvbnN0IGZsb2F0MyByYXlQb2ludCA9IGNhbWVyYS5mcm9tOworICAgICAgICBjb25zdCBmbG9hdDMgcmF5RGlyID0gbm9ybWFsaXplKGxvd2VyTGVmdFJheSArIHUqZHUgKyB2KmR2KTsKKyAgICAgICAgaWYgKGRlYnVnQ2FtZXJhKSB7CisgICAgICAgICAgICByc0RlYnVnKCJSYXkgZGlyZWN0aW9uICh2ZWN0b3IgbWF0aCkgPSAiLCByYXlEaXIpOworICAgICAgICB9CisKKyAgICAgICAgcmF5LT5wb3NpdGlvbiA9ICByYXlQb2ludDsKKyAgICAgICAgcmF5LT5kaXJlY3Rpb24gPSByYXlEaXI7CisgICAgfQorCisgICAgLy8gTWF0cml4IG1hdGguICBUaGlzIGlzIG1vcmUgZ2VuZXJpYyBpZiB3ZSBhbGxvdyBzZXR0aW5nIG1vZGVsIHZpZXcgYW5kIHByb2plY3Rpb24gbWF0cmljZXMKKyAgICAvLyBkaXJlY3RseQorICAgIGVsc2UgeworICAgICAgICByc19tYXRyaXg0eDQgcG0gPSBtb2RlbHZpZXdNYXRyaXg7CisgICAgICAgIHJzTWF0cml4TG9hZE11bHRpcGx5KCZwbSwgJnByb2plY3Rpb25NYXRyaXgsICZtb2RlbHZpZXdNYXRyaXgpOworICAgICAgICBpZiAoIXJzTWF0cml4SW52ZXJzZSgmcG0pKSB7CisgICAgICAgICAgICByc0RlYnVnKCJFUlJPUjogU0lOR1VMQVIgUE0gTUFUUklYIiwgMCk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgY29uc3QgZmxvYXQgd2lkdGggPSByc2dHZXRXaWR0aCgpOworICAgICAgICBjb25zdCBmbG9hdCBoZWlnaHQgPSByc2dHZXRIZWlnaHQoKTsKKyAgICAgICAgY29uc3QgZmxvYXQgd2lueCA9IDIuMGYgKiB4IC8gd2lkdGggLSAxLjBmOworICAgICAgICBjb25zdCBmbG9hdCB3aW55ID0gMi4wZiAqIHkgLyBoZWlnaHQgLSAxLjBmOworCisgICAgICAgIGZsb2F0NCBleWUgPSB7IDAuMGYsIDAuMGYsIDAuMGYsIDEuMGYgfTsKKyAgICAgICAgZmxvYXQ0IGF0ID0geyB3aW54LCB3aW55LCAxLjBmLCAxLjBmIH07CisKKyAgICAgICAgZXllID0gcnNNYXRyaXhNdWx0aXBseSgmcG0sIGV5ZSk7CisgICAgICAgIGV5ZSAqPSAxLjBmIC8gZXllLnc7CisKKyAgICAgICAgYXQgPSByc01hdHJpeE11bHRpcGx5KCZwbSwgYXQpOworICAgICAgICBhdCAqPSAxLjBmIC8gYXQudzsKKworICAgICAgICBjb25zdCBmbG9hdDMgcmF5UG9pbnQgPSB7IGV5ZS54LCBleWUueSwgZXllLnogfTsKKyAgICAgICAgY29uc3QgZmxvYXQzIGF0UG9pbnQgPSB7IGF0LngsIGF0LnksIGF0LnogfTsKKyAgICAgICAgY29uc3QgZmxvYXQzIHJheURpciA9IG5vcm1hbGl6ZShhdFBvaW50IC0gcmF5UG9pbnQpOworICAgICAgICBpZiAoZGVidWdDYW1lcmEpIHsKKyAgICAgICAgICAgIHJzRGVidWcoIndpbng6ICIsIHdpbngpOworICAgICAgICAgICAgcnNEZWJ1Zygid2lueTogIiwgd2lueSk7CisgICAgICAgICAgICByc0RlYnVnKCJSYXkgcG9zaXRpb24gKHRyYW5zZm9ybWVkKSA9ICIsIGV5ZSk7CisgICAgICAgICAgICByc0RlYnVnKCJSYXkgZGlyZWN0aW9uICh0cmFuc2Zvcm1lZCkgPSAiLCByYXlEaXIpOworICAgICAgICB9CisgICAgICAgIHJheS0+cG9zaXRpb24gPSAgcmF5UG9pbnQ7CisgICAgICAgIHJheS0+ZGlyZWN0aW9uID0gcmF5RGlyOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgaW50IGludGVyc2VjdEdlb21ldHJ5KFJheSogcmF5LCBmbG9hdCAqYmVzdFRpbWUpCit7CisgICAgaW50IGhpdCA9IC0xOworICAgIGZvciAoaW50IGlkID0gMDsgaWQgPCBjYXJkQ291bnQ7IGlkKyspIHsKKyAgICAgICAgaWYgKGNhcmRzW2lkXS52aXNpYmxlKSB7CisgICAgICAgICAgICByc19tYXRyaXg0eDQgbWF0cml4OworICAgICAgICAgICAgZmxvYXQzIHBbNF07CisKKyAgICAgICAgICAgIC8vIFRyYW5zZm9ybSBjYXJkIHZlcnRpY2VzIHRvIHdvcmxkIHNwYWNlCisgICAgICAgICAgICByc01hdHJpeExvYWRJZGVudGl0eSgmbWF0cml4KTsKKyAgICAgICAgICAgIGdldE1hdHJpeEZvckNhcmQoJm1hdHJpeCwgaWQpOworICAgICAgICAgICAgZm9yIChpbnQgdmVydGV4ID0gMDsgdmVydGV4IDwgNDsgdmVydGV4KyspIHsKKyAgICAgICAgICAgICAgICBmbG9hdDQgdG1wID0gcnNNYXRyaXhNdWx0aXBseSgmbWF0cml4LCBjYXJkVmVydGljZXNbdmVydGV4XSk7CisgICAgICAgICAgICAgICAgaWYgKHRtcC53ICE9IDAuMGYpIHsKKyAgICAgICAgICAgICAgICAgICAgcFt2ZXJ0ZXhdLnggPSB0bXAueDsKKyAgICAgICAgICAgICAgICAgICAgcFt2ZXJ0ZXhdLnkgPSB0bXAueTsKKyAgICAgICAgICAgICAgICAgICAgcFt2ZXJ0ZXhdLnogPSB0bXAuejsKKyAgICAgICAgICAgICAgICAgICAgcFt2ZXJ0ZXhdICo9IDEuMGYgLyB0bXAudzsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICByc0RlYnVnKCJCYWQgdyBjb29yZDogIiwgdG1wKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEludGVyc2VjdCBjYXJkIGdlb21ldHJ5CisgICAgICAgICAgICBpZiAocmF5VHJpYW5nbGVJbnRlcnNlY3QocmF5LCBwWzBdLCBwWzFdLCBwWzJdLCBiZXN0VGltZSkKKyAgICAgICAgICAgICAgICB8fCByYXlUcmlhbmdsZUludGVyc2VjdChyYXksIHBbMl0sIHBbM10sIHBbMF0sIGJlc3RUaW1lKSkgeworICAgICAgICAgICAgICAgIGhpdCA9IGlkOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBoaXQ7Cit9CisKKy8vIFRoaXMgbWV0aG9kIGNvbXB1dGVzIHRoZSBwb3NpdGlvbiBvZiBhbGwgdGhlIGNhcmRzIGJ5IHVwZGF0aW5nIGJpYXMgYmFzZWQgb24gYQorLy8gc2ltcGxlIHBoeXNpY3MgbW9kZWwuCisvLyBJZiB0aGUgY2FyZHMgYXJlIHN0aWxsIGluIG1vdGlvbiwgcmV0dXJucyB0cnVlLgorc3RhdGljIGJvb2wgdXBkYXRlTmV4dFBvc2l0aW9uKCkKK3sKKyAgICBpbnQ2NF90IGN1cnJlbnRUaW1lID0gcnNVcHRpbWVNaWxsaXMoKTsKKyAgICBpZiAoYW5pbWF0aW5nKSB7CisgICAgICAgIGZsb2F0IGR0ID0gZGVsdGFUaW1lSW5TZWNvbmRzKGN1cnJlbnRUaW1lKTsKKyAgICAgICAgaWYgKGR0IDw9IDAuMGYpCisgICAgICAgICAgICByZXR1cm4gYW5pbWF0aW5nOworICAgICAgICBjb25zdCBmbG9hdCBtaW5TdGVwVGltZSA9IDEuMGYgLyAzMDAuMGY7IC8vIH41IHN0ZXBzIHBlciBmcmFtZQorICAgICAgICBjb25zdCBpbnQgTiA9IChkdCA+IG1pblN0ZXBUaW1lKSA/ICgxICsgcm91bmQoZHQgLyBtaW5TdGVwVGltZSkpIDogMTsKKyAgICAgICAgZHQgLz0gTjsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyBpKyspIHsKKyAgICAgICAgICAgIC8vIEZvcmNlIGZyaWN0aW9uIC0gYWx3YXlzIG9wcG9zZXMgbW90aW9uCisgICAgICAgICAgICBjb25zdCBmbG9hdCBGZiA9IC1mcmljdGlvbkNvZWZmICogdmVsb2NpdHk7CisKKyAgICAgICAgICAgIC8vIFJlc3RvcmluZyBmb3JjZSB0byBtYXRjaCBjYXJkcyB3aXRoIHNsb3RzCisgICAgICAgICAgICBjb25zdCBmbG9hdCB0aGV0YSA9IHN0YXJ0QW5nbGUgKyBiaWFzOworICAgICAgICAgICAgY29uc3QgZmxvYXQgZHRoZXRhID0gMi4wZiAqIE1fUEkgLyBzbG90Q291bnQ7CisgICAgICAgICAgICBjb25zdCBmbG9hdCBwb3NpdGlvbiA9IHRoZXRhIC8gZHRoZXRhOworICAgICAgICAgICAgY29uc3QgZmxvYXQgZnJhY3Rpb24gPSBwb3NpdGlvbiAtIGZsb29yKHBvc2l0aW9uKTsgLy8gZnJhY3Rpb25hbCBwb3NpdGlvbiBiZXR3ZWVuIHNsb3RzCisgICAgICAgICAgICBmbG9hdCB4OworICAgICAgICAgICAgaWYgKGZyYWN0aW9uID4gMC41ZikgeworICAgICAgICAgICAgICAgIHggPSAtICgxLjBmIC0gZnJhY3Rpb24pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB4ID0gZnJhY3Rpb247CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb25zdCBmbG9hdCBGciA9IC0gc3ByaW5nQ29uc3RhbnQgKiB4OworCisgICAgICAgICAgICAvLyBjb21wdXRlIHZlbG9jaXR5CisgICAgICAgICAgICBjb25zdCBmbG9hdCBtb21lbnR1bSA9IG1hc3MgKiB2ZWxvY2l0eSArIChGZiArIEZyKSpkdDsKKyAgICAgICAgICAgIHZlbG9jaXR5ID0gbW9tZW50dW0gLyBtYXNzOworICAgICAgICAgICAgYmlhcyArPSB2ZWxvY2l0eSAqIGR0OworICAgICAgICB9CisKKyAgICAgICAgLy8gVE9ETzogQWRkIGFuaW1hdGlvbiB0byBzbW9vdGhseSBtb3ZlIGJhY2sgdG8gc2xvdHMuIEN1cnJlbnRseSBzbmFwcyB0byBsb2NhdGlvbi4KKyAgICAgICAgaWYgKGNhcmRDb3VudCA8PSB2aXNpYmxlU2xvdENvdW50KSB7CisgICAgICAgICAgICAvLyBUT0RPOiB0aGlzIGFsaWducyB0aGUgY2FyZHMgdG8gdGhlIGZpcnN0IHNsb3QgKHRoZXRhID0gc3RhcnRBbmdsZSkgd2hlbiB0aGVyZSBhcmVuJ3QKKyAgICAgICAgICAgIC8vIGVub3VnaCB2aXNpYmxlIGNhcmRzLiBJdCBzaG91bGQgYmUgZ2VuZXJhbGl6ZWQgdG8gYWxsb3cgYWxpZ25tZW50IHRvIGZyb250LAorICAgICAgICAgICAgLy8gbWlkZGxlIG9yIGJhY2sgb2YgdGhlIHN0YWNrLgorICAgICAgICAgICAgaWYgKGNhcmRQb3NpdGlvbigwKSAhPSBzbG90UG9zaXRpb24oMCkpIHsKKyAgICAgICAgICAgICAgICBiaWFzID0gMC4wZjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChjYXJkUG9zaXRpb24oY2FyZENvdW50KSA8IDAuMGYpIHsKKyAgICAgICAgICAgICAgICBiaWFzID0gLXNsb3RQb3NpdGlvbihjYXJkQ291bnQpOworICAgICAgICAgICAgfSBlbHNlIGlmIChjYXJkUG9zaXRpb24oMCkgPiBzbG90UG9zaXRpb24oMCkpIHsKKyAgICAgICAgICAgICAgICBiaWFzID0gMC4wZjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGFuaW1hdGluZyA9IGZhYnModmVsb2NpdHkpID4gdmVsb2NpdHlUaHJlc2hvbGQ7CisgICAgICAgIGlmICghYW5pbWF0aW5nKSB7CisgICAgICAgICAgICBjb25zdCBmbG9hdCBkdGhldGEgPSAyLjBmICogTV9QSSAvIHNsb3RDb3VudDsKKyAgICAgICAgICAgIGJpYXMgPSByb3VuZCgoc3RhcnRBbmdsZSArIGJpYXMpIC8gZHRoZXRhKSAqIGR0aGV0YSAtIHN0YXJ0QW5nbGU7CisgICAgICAgICAgICByc1NlbmRUb0NsaWVudChDTURfQU5JTUFUSU9OX0ZJTklTSEVEKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBsYXN0VGltZSA9IGN1cnJlbnRUaW1lOworCisgICAgcmV0dXJuIGFuaW1hdGluZzsKK30KKworLy8gQ3VsbCBjYXJkcyBiYXNlZCBvbiB2aXNpYmlsaXR5IGFuZCB2aXNpYmxlU2xvdENvdW50LgorLy8gSWYgdmlzaWJsZVNsb3RDb3VudCBpcyA+IDAsIHRoZW4gb25seSBzaG93IHRob3NlIHNsb3RzIGFuZCBjdWxsIHRoZSByZXN0LgorLy8gT3RoZXJ3aXNlLCBpdCBzaG91bGQgY3VsbCBiYXNlZCBvbiBib3VuZHMgb2YgZ2VvbWV0cnkuCitzdGF0aWMgaW50IGN1bGxDYXJkcygpCit7CisgICAgY29uc3QgZmxvYXQgdGhldGFGaXJzdCA9IHNsb3RQb3NpdGlvbigtMSk7IC8vIC0xIGtlZXBzIHRoZSBjYXJkIGluIGZyb250IGFyb3VuZCBhIGJpdCBsb25nZXIKKyAgICBjb25zdCBmbG9hdCB0aGV0YUxhc3QgPSBzbG90UG9zaXRpb24odmlzaWJsZVNsb3RDb3VudCk7CisKKyAgICBpbnQgY291bnQgPSAwOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2FyZENvdW50OyBpKyspIHsKKyAgICAgICAgaWYgKHZpc2libGVTbG90Q291bnQgPiAwKSB7CisgICAgICAgICAgICAvLyBJZiB2aXNpYmxlU2xvdENvdW50IGlzIHNwZWNpZmllZCwgdGhlbiBvbmx5IHNob3cgdXAgdG8gdmlzaWJsZVNsb3RDb3VudCBjYXJkcy4KKyAgICAgICAgICAgIGZsb2F0IHAgPSBjYXJkUG9zaXRpb24oaSk7CisgICAgICAgICAgICBpZiAocCA+PSB0aGV0YUZpcnN0ICYmIHAgPCB0aGV0YUxhc3QpIHsKKyAgICAgICAgICAgICAgICBjYXJkc1tpXS52aXNpYmxlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBjb3VudCsrOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjYXJkc1tpXS52aXNpYmxlID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBDdWxsIHRoZSByZXN0IG9mIHRoZSBjYXJkcyB1c2luZyBib3VuZGluZyBib3ggb2YgZ2VvbWV0cnkuCisgICAgICAgICAgICAvLyBUT0RPCisgICAgICAgICAgICBjYXJkc1tpXS52aXNpYmxlID0gdHJ1ZTsKKyAgICAgICAgICAgIGNvdW50Kys7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGNvdW50OworfQorCisvLyBSZXF1ZXN0IHRleHR1cmUvZ2VvbWV0cnkgZm9yIGl0ZW1zIHRoYXQgaGF2ZSBjb21lIGludG8gdmlldworLy8gb3IgZG9lc24ndCBoYXZlIGEgdGV4dHVyZSB5ZXQuCitzdGF0aWMgdm9pZCB1cGRhdGVDYXJkUmVzb3VyY2VzKCkKK3sKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGNhcmRDb3VudDsgaSsrKSB7CisgICAgICAgIGludCBkYXRhWzFdOworICAgICAgICBpZiAoY2FyZHNbaV0udmlzaWJsZSkgeworICAgICAgICAgICAgLy8gcmVxdWVzdCB0ZXh0dXJlIGZyb20gY2xpZW50IGlmIG5vdCBsb2FkZWQKKyAgICAgICAgICAgIGlmIChjYXJkc1tpXS50ZXh0dXJlU3RhdGUgPT0gU1RBVEVfSU5WQUxJRCkgeworICAgICAgICAgICAgICAgIGRhdGFbMF0gPSBpOworICAgICAgICAgICAgICAgIGJvb2wgZW5xdWV1ZWQgPSByc1NlbmRUb0NsaWVudChDTURfUkVRVUVTVF9URVhUVVJFLCBkYXRhLCBzaXplb2YoZGF0YSkpOworICAgICAgICAgICAgICAgIGlmIChlbnF1ZXVlZCkgeworICAgICAgICAgICAgICAgICAgICBjYXJkc1tpXS50ZXh0dXJlU3RhdGUgPSBTVEFURV9MT0FESU5HOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJzRGVidWcoIkNvdWxkbid0IHNlbmQgQ01EX1JFUVVFU1RfVEVYVFVSRSIsIDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIHJlcXVlc3QgZ2VvbWV0cnkgZnJvbSBjbGllbnQgaWYgbm90IGxvYWRlZAorICAgICAgICAgICAgaWYgKGNhcmRzW2ldLmdlb21ldHJ5U3RhdGUgPT0gU1RBVEVfSU5WQUxJRCkgeworICAgICAgICAgICAgICAgIGRhdGFbMF0gPSBpOworICAgICAgICAgICAgICAgIGJvb2wgZW5xdWV1ZWQgPSByc1NlbmRUb0NsaWVudChDTURfUkVRVUVTVF9HRU9NRVRSWSwgZGF0YSwgc2l6ZW9mKGRhdGEpKTsKKyAgICAgICAgICAgICAgICBpZiAoZW5xdWV1ZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FyZHNbaV0uZ2VvbWV0cnlTdGF0ZSA9IFNUQVRFX0xPQURJTkc7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcnNEZWJ1ZygiQ291bGRuJ3Qgc2VuZCBDTURfUkVRVUVTVF9HRU9NRVRSWSIsIDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIGFzayB0aGUgaG9zdCB0byByZW1vdmUgdGhlIHRleHR1cmUKKyAgICAgICAgICAgIGlmIChjYXJkc1tpXS50ZXh0dXJlU3RhdGUgPT0gU1RBVEVfTE9BREVEKSB7CisgICAgICAgICAgICAgICAgZGF0YVswXSA9IGk7CisgICAgICAgICAgICAgICAgYm9vbCBlbnF1ZXVlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgcnNTZW5kVG9DbGllbnRCbG9ja2luZyhDTURfSU5WQUxJREFURV9URVhUVVJFLCBkYXRhLCBzaXplb2YoZGF0YSkpOworICAgICAgICAgICAgICAgIGlmIChlbnF1ZXVlZCkgeworICAgICAgICAgICAgICAgICAgICBjYXJkc1tpXS50ZXh0dXJlU3RhdGUgPSBTVEFURV9JTlZBTElEOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJzRGVidWcoIkNvdWxkbid0IHNlbmQgQ01EX0lOVkFMSURBVEVfVEVYVFVSRSIsIDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGFzayB0aGUgaG9zdCB0byByZW1vdmUgdGhlIGdlb21ldHJ5CisgICAgICAgICAgICBpZiAoY2FyZHNbaV0uZ2VvbWV0cnlTdGF0ZSA9PSBTVEFURV9MT0FERUQpIHsKKyAgICAgICAgICAgICAgICBkYXRhWzBdID0gaTsKKyAgICAgICAgICAgICAgICBib29sIGVucXVldWVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICByc1NlbmRUb0NsaWVudEJsb2NraW5nKENNRF9JTlZBTElEQVRFX0dFT01FVFJZLCBkYXRhLCBzaXplb2YoZGF0YSkpOworICAgICAgICAgICAgICAgIGlmIChlbnF1ZXVlZCkgeworICAgICAgICAgICAgICAgICAgICBjYXJkc1tpXS5nZW9tZXRyeVN0YXRlID0gU1RBVEVfSU5WQUxJRDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICByc0RlYnVnKCJDb3VsZG4ndCBzZW5kIENNRF9JTlZBTElEQVRFX0dFT01FVFJZIiwgMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vIFBsYWNlcyBkb3RzIG9uIGdlb21ldHJ5IHRvIHZpc3VhbGx5IGluc3BlY3QgdGhhdCBvYmplY3RzIGNhbiBiZSBzZWVuIGJ5IHJheXMuCisvLyBOT1RFOiB0aGUgY29sb3Igb2YgdGhlIGRvdCBpcyBzb21ld2hhdCByYW5kb20sIGFzIGl0IGRlcGVuZHMgb24gdGV4dHVyZSBvZiBwcmV2aW91c2x5LXJlbmRlcmVkCisvLyBjYXJkLgorc3RhdGljIHZvaWQgcmVuZGVyV2l0aFJheXMoKQoreworICAgIGNvbnN0IGZsb2F0IHcgPSByc2dHZXRXaWR0aCgpOworICAgIGNvbnN0IGZsb2F0IGggPSByc2dHZXRIZWlnaHQoKTsKKyAgICBjb25zdCBpbnQgc2tpcCA9IDg7CisgICAgY29sb3IoMS4wZiwgMC4wZiwgMC4wZiwgMS4wZik7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCAoaW50KSBoOyBqKz1za2lwKSB7CisgICAgICAgIGZsb2F0IHBvc1kgPSAoZmxvYXQpIGo7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgKGludCkgdzsgaSs9c2tpcCkgeworICAgICAgICAgICAgZmxvYXQgcG9zWCA9IChmbG9hdCkgaTsKKyAgICAgICAgICAgIFJheSByYXk7CisgICAgICAgICAgICBpZiAobWFrZVJheUZvclBpeGVsQXQoJnJheSwgcG9zWCwgcG9zWSkpIHsKKyAgICAgICAgICAgICAgICBmbG9hdCBiZXN0VGltZSA9IEZMVF9NQVg7CisgICAgICAgICAgICAgICAgaWYgKGludGVyc2VjdEdlb21ldHJ5KCZyYXksICZiZXN0VGltZSkgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgcnNnRHJhd1Nwcml0ZVNjcmVlbnNwYWNlKHBvc1gsIHBvc1ksIDAuMGYsIDIuMGYsIDIuMGYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworaW50IHJvb3QoKSB7CisgICAgcnNnQ2xlYXJEZXB0aCgxLjBmKTsKKworICAgIHJzZ0JpbmRQcm9ncmFtVmVydGV4KHZlcnRleFByb2dyYW0pOworICAgIHJzZ0JpbmRQcm9ncmFtRnJhZ21lbnQoZnJhZ21lbnRQcm9ncmFtKTsKKyAgICByc2dCaW5kUHJvZ3JhbVN0b3JlKHByb2dyYW1TdG9yZSk7CisgICAgcnNnQmluZFByb2dyYW1SYXN0ZXIocmFzdGVyUHJvZ3JhbSk7CisKKyAgICB1cGRhdGVBbGxvY2F0aW9uVmFycygpOworCisgICAgaWYgKCFpbml0aWFsaXplZCkgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNhcmRDb3VudDsgaSsrKQorICAgICAgICAgICAgY2FyZHNbaV0udGV4dHVyZVN0YXRlID0gU1RBVEVfSU5WQUxJRDsKKyAgICAgICAgaW5pdGlhbGl6ZWQgPSB0cnVlOworICAgIH0KKworICAgIGlmIChmYWxzZSkgeyAvLyBmb3IgZGVidWdnaW5nIC0gZmxhc2ggdGhlIHNjcmVlbiBzbyB3ZSBrbm93IHdlJ3JlIHN0aWxsIHJlbmRlcmluZworICAgICAgICBzdGF0aWMgYm9vbCB0b2dnbGU7CisgICAgICAgIGlmICh0b2dnbGUpCisgICAgICAgICAgICByc2dDbGVhckNvbG9yKGJhY2tncm91bmRDb2xvci54LCBiYWNrZ3JvdW5kQ29sb3IueSwgYmFja2dyb3VuZENvbG9yLnosIDEuMCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJzZ0NsZWFyQ29sb3IoMS4wZiwgMC4wZiwgMC4wZiwgMS5mKTsKKyAgICAgICAgdG9nZ2xlID0gIXRvZ2dsZTsKKyAgICB9IGVsc2UgeworICAgICAgICByc2dDbGVhckNvbG9yKGJhY2tncm91bmRDb2xvci54LCBiYWNrZ3JvdW5kQ29sb3IueSwgYmFja2dyb3VuZENvbG9yLnosIDEuMCk7CisgICAgfQorCisgICAgdXBkYXRlQ2FtZXJhTWF0cml4KHJzZ0dldFdpZHRoKCksIHJzZ0dldEhlaWdodCgpKTsKKworICAgIGJvb2wgc3RpbGxBbmltYXRpbmcgPSB1cGRhdGVOZXh0UG9zaXRpb24oKTsKKworICAgIGN1bGxDYXJkcygpOworCisgICAgdXBkYXRlQ2FyZFJlc291cmNlcygpOworCisgICAgZHJhd0NhcmRzKCk7CisKKyAgICBpZiAoZGVidWdQaWNraW5nKSB7CisgICAgICAgIHJlbmRlcldpdGhSYXlzKCk7CisgICAgfQorCisgICAgLy9yc1NlbmRUb0NsaWVudChDTURfUElORyk7CisKKyAgICByZXR1cm4gc3RpbGxBbmltYXRpbmcgPyAxIDogMDsKK30KZGlmZiAtLWdpdCBhL2NvcmUvam5pL0FuZHJvaWQubWsgYi9jb3JlL2puaS9BbmRyb2lkLm1rCmluZGV4IDQyMTM1YzUuLmNiMGJkZDMgMTAwNjQ0Ci0tLSBhL2NvcmUvam5pL0FuZHJvaWQubWsKKysrIGIvY29yZS9qbmkvQW5kcm9pZC5tawpAQCAtMTksMTIgKzE5LDE1IEBACiAgIExPQ0FMX0NGTEFHUyArPSAtRENVU1RPTV9SVU5USU1FX0hFQVBfTUFYPSQoVVNFX0NVU1RPTV9SVU5USU1FX0hFQVBfTUFYKQogZW5kaWYKIAoraWZlcSAoJChVU0VfT1BFTkdMX1JFTkRFUkVSKSx0cnVlKQorCUxPQ0FMX0NGTEFHUyArPSAtRFVTRV9PUEVOR0xfUkVOREVSRVIKK2VuZGlmCisKIExPQ0FMX0NGTEFHUyArPSAtREdMX0dMRVhUX1BST1RPVFlQRVMgLURFR0xfRUdMRVhUX1BST1RPVFlQRVMKIAogTE9DQUxfU1JDX0ZJTEVTOj0gXAogCUFjdGl2aXR5TWFuYWdlci5jcHAgXAogCUFuZHJvaWRSdW50aW1lLmNwcCBcCi0JQ3Vyc29yV2luZG93LmNwcCBcCiAJVGltZS5jcHAgXAogCWNvbV9nb29nbGVfYW5kcm9pZF9nbGVzX2puaV9FR0xJbXBsLmNwcCBcCiAJY29tX2dvb2dsZV9hbmRyb2lkX2dsZXNfam5pX0dMSW1wbC5jcHAuYXJtIFwKQEAgLTQ4LDYgKzUxLDcgQEAKIAlhbmRyb2lkX3ZpZXdfSW5wdXRDaGFubmVsLmNwcCBcCiAJYW5kcm9pZF92aWV3X0lucHV0UXVldWUuY3BwIFwKIAlhbmRyb2lkX3ZpZXdfS2V5RXZlbnQuY3BwIFwKKwlhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzLmNwcCBcCiAJYW5kcm9pZF92aWV3X01vdGlvbkV2ZW50LmNwcCBcCiAJYW5kcm9pZF90ZXh0X0FuZHJvaWRDaGFyYWN0ZXIuY3BwIFwKIAlhbmRyb2lkX3RleHRfQW5kcm9pZEJpZGkuY3BwIFwKQEAgLTEwNiw2ICsxMTAsNyBAQAogCWFuZHJvaWQvZ3JhcGhpY3MvUmFzdGVyaXplci5jcHAgXAogCWFuZHJvaWQvZ3JhcGhpY3MvUmVnaW9uLmNwcCBcCiAJYW5kcm9pZC9ncmFwaGljcy9TaGFkZXIuY3BwIFwKKwlhbmRyb2lkL2dyYXBoaWNzL1RleHRMYXlvdXQuY3BwIFwKIAlhbmRyb2lkL2dyYXBoaWNzL1R5cGVmYWNlLmNwcCBcCiAJYW5kcm9pZC9ncmFwaGljcy9YZmVybW9kZS5jcHAgXAogCWFuZHJvaWQvZ3JhcGhpY3MvWXV2VG9KcGVnRW5jb2Rlci5jcHAgXApAQCAtMTI0LDcgKzEyOSw2IEBACiAJYW5kcm9pZF9ibHVldG9vdGhfY29tbW9uLmNwcCBcCiAJYW5kcm9pZF9ibHVldG9vdGhfQmx1ZXRvb3RoQXVkaW9HYXRld2F5LmNwcCBcCiAJYW5kcm9pZF9ibHVldG9vdGhfQmx1ZXRvb3RoU29ja2V0LmNwcCBcCi0JYW5kcm9pZF9ibHVldG9vdGhfU2NvU29ja2V0LmNwcCBcCiAJYW5kcm9pZF9zZXJ2ZXJfQmx1ZXRvb3RoU2VydmljZS5jcHAgXAogCWFuZHJvaWRfc2VydmVyX0JsdWV0b290aEV2ZW50TG9vcC5jcHAgXAogCWFuZHJvaWRfc2VydmVyX0JsdWV0b290aEEyZHBTZXJ2aWNlLmNwcCBcCkBAIC0xNDMsNiArMTQ3LDcgQEAKIExPQ0FMX0NfSU5DTFVERVMgKz0gXAogCSQoSk5JX0hfSU5DTFVERSkgXAogCSQoTE9DQUxfUEFUSCkvYW5kcm9pZC9ncmFwaGljcyBcCisJJChMT0NBTF9QQVRIKS8uLi8uLi9saWJzL2h3dWkgXAogCSQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBibHVlZHJvaWQpIFwKIAkkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgbGliaGFyZHdhcmUpL2hhcmR3YXJlIFwKIAkkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgbGliaGFyZHdhcmVfbGVnYWN5KS9oYXJkd2FyZV9sZWdhY3kgXApAQCAtMTkzLDYgKzE5OCwxMCBAQAogCWxpYndwYV9jbGllbnQgXAogCWxpYmpwZWcKIAoraWZlcSAoJChVU0VfT1BFTkdMX1JFTkRFUkVSKSx0cnVlKQorCUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gbGliaHd1aQorZW5kaWYKKwogaWZlcSAoJChCT0FSRF9IQVZFX0JMVUVUT09USCksdHJ1ZSkKIExPQ0FMX0NfSU5DTFVERVMgKz0gXAogCWV4dGVybmFsL2RidXMgXApkaWZmIC0tZ2l0IGEvY29yZS9qbmkvQW5kcm9pZFJ1bnRpbWUuY3BwIGIvY29yZS9qbmkvQW5kcm9pZFJ1bnRpbWUuY3BwCmluZGV4IDYyYTQ0OTUuLjZmNmQ5MTkgMTAwNjQ0Ci0tLSBhL2NvcmUvam5pL0FuZHJvaWRSdW50aW1lLmNwcAorKysgYi9jb3JlL2puaS9BbmRyb2lkUnVudGltZS5jcHAKQEAgLTExNSw2ICsxMTUsNyBAQAogZXh0ZXJuIGludCByZWdpc3Rlcl9hbmRyb2lkX2dyYXBoaWNzX1BpeGVsRm9ybWF0KEpOSUVudiogZW52KTsKIGV4dGVybiBpbnQgcmVnaXN0ZXJfY29tX2FuZHJvaWRfaW50ZXJuYWxfZ3JhcGhpY3NfTmF0aXZlVXRpbHMoSk5JRW52ICplbnYpOwogZXh0ZXJuIGludCByZWdpc3Rlcl9hbmRyb2lkX3ZpZXdfRGlzcGxheShKTklFbnYqIGVudik7CitleHRlcm4gaW50IHJlZ2lzdGVyX2FuZHJvaWRfdmlld19HTEVTMjBDYW52YXMoSk5JRW52KiBlbnYpOwogZXh0ZXJuIGludCByZWdpc3Rlcl9hbmRyb2lkX3ZpZXdfU3VyZmFjZShKTklFbnYqIGVudik7CiBleHRlcm4gaW50IHJlZ2lzdGVyX2FuZHJvaWRfdmlld19WaWV3Um9vdChKTklFbnYqIGVudik7CiBleHRlcm4gaW50IHJlZ2lzdGVyX2FuZHJvaWRfZGF0YWJhc2VfQ3Vyc29yV2luZG93KEpOSUVudiogZW52KTsKQEAgLTE1MSw3ICsxNTIsNiBAQAogZXh0ZXJuIGludCByZWdpc3Rlcl9hbmRyb2lkX2JsdWV0b290aF9IZWFkc2V0QmFzZShKTklFbnYqIGVudik7CiBleHRlcm4gaW50IHJlZ2lzdGVyX2FuZHJvaWRfYmx1ZXRvb3RoX0JsdWV0b290aEF1ZGlvR2F0ZXdheShKTklFbnYqIGVudik7CiBleHRlcm4gaW50IHJlZ2lzdGVyX2FuZHJvaWRfYmx1ZXRvb3RoX0JsdWV0b290aFNvY2tldChKTklFbnYgKmVudik7Ci1leHRlcm4gaW50IHJlZ2lzdGVyX2FuZHJvaWRfYmx1ZXRvb3RoX1Njb1NvY2tldChKTklFbnYgKmVudik7CiBleHRlcm4gaW50IHJlZ2lzdGVyX2FuZHJvaWRfc2VydmVyX0JsdWV0b290aFNlcnZpY2UoSk5JRW52KiBlbnYpOwogZXh0ZXJuIGludCByZWdpc3Rlcl9hbmRyb2lkX3NlcnZlcl9CbHVldG9vdGhFdmVudExvb3AoSk5JRW52ICplbnYpOwogZXh0ZXJuIGludCByZWdpc3Rlcl9hbmRyb2lkX3NlcnZlcl9CbHVldG9vdGhBMmRwU2VydmljZShKTklFbnYqIGVudik7CkBAIC0xMjI5LDYgKzEyMjksNyBAQAogICAgIFJFR19KTkkocmVnaXN0ZXJfYW5kcm9pZF9uaW9fdXRpbHMpLAogICAgIFJFR19KTkkocmVnaXN0ZXJfYW5kcm9pZF9ncmFwaGljc19QaXhlbEZvcm1hdCksCiAgICAgUkVHX0pOSShyZWdpc3Rlcl9hbmRyb2lkX2dyYXBoaWNzX0dyYXBoaWNzKSwKKyAgICBSRUdfSk5JKHJlZ2lzdGVyX2FuZHJvaWRfdmlld19HTEVTMjBDYW52YXMpLAogICAgIFJFR19KTkkocmVnaXN0ZXJfYW5kcm9pZF92aWV3X1N1cmZhY2UpLAogICAgIFJFR19KTkkocmVnaXN0ZXJfYW5kcm9pZF92aWV3X1ZpZXdSb290KSwKICAgICBSRUdfSk5JKHJlZ2lzdGVyX2NvbV9nb29nbGVfYW5kcm9pZF9nbGVzX2puaV9FR0xJbXBsKSwKQEAgLTEzMDAsNyArMTMwMSw2IEBACiAgICAgUkVHX0pOSShyZWdpc3Rlcl9hbmRyb2lkX2JsdWV0b290aF9IZWFkc2V0QmFzZSksCiAgICAgUkVHX0pOSShyZWdpc3Rlcl9hbmRyb2lkX2JsdWV0b290aF9CbHVldG9vdGhBdWRpb0dhdGV3YXkpLAogICAgIFJFR19KTkkocmVnaXN0ZXJfYW5kcm9pZF9ibHVldG9vdGhfQmx1ZXRvb3RoU29ja2V0KSwKLSAgICBSRUdfSk5JKHJlZ2lzdGVyX2FuZHJvaWRfYmx1ZXRvb3RoX1Njb1NvY2tldCksCiAgICAgUkVHX0pOSShyZWdpc3Rlcl9hbmRyb2lkX3NlcnZlcl9CbHVldG9vdGhTZXJ2aWNlKSwKICAgICBSRUdfSk5JKHJlZ2lzdGVyX2FuZHJvaWRfc2VydmVyX0JsdWV0b290aEV2ZW50TG9vcCksCiAgICAgUkVHX0pOSShyZWdpc3Rlcl9hbmRyb2lkX3NlcnZlcl9CbHVldG9vdGhBMmRwU2VydmljZSksCmRpZmYgLS1naXQgYS9jb3JlL2puaS9DdXJzb3JXaW5kb3cuY3BwIGIvY29yZS9qbmkvQ3Vyc29yV2luZG93LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzg3NzkyMS4uMDAwMDAwMAotLS0gYS9jb3JlL2puaS9DdXJzb3JXaW5kb3cuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDEzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3VuZGVmIExPR19UQUcKLSNkZWZpbmUgTE9HX1RBRyAiQ3Vyc29yV2luZG93IgotCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+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+IG1NZW1vcnk7Ci0KLSAgICAvKioKLSAgICAgKiBPZmZzZXQgb2YgdGhlIGxvd2VzdCB1bnVzZWQgZGF0YSBieXRlIGluIHRoZSBhcnJheS4KLSAgICAgKi8KLSAgICB1aW50MzJfdCBtRnJlZU9mZnNldDsKLX07Ci0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvY29yZS9qbmkvYW5kcm9pZC9ncmFwaGljcy9CaXRtYXAuY3BwIGIvY29yZS9qbmkvYW5kcm9pZC9ncmFwaGljcy9CaXRtYXAuY3BwCmluZGV4IDg4YmJhZmQuLmIwNjIyNjQgMTAwNjQ0Ci0tLSBhL2NvcmUvam5pL2FuZHJvaWQvZ3JhcGhpY3MvQml0bWFwLmNwcAorKysgYi9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL0JpdG1hcC5jcHAKQEAgLTMxMyw2ICszMTMsMTAgQEAKICAgICByZXR1cm4gYml0bWFwLT5jb25maWcoKTsNCiB9DQogDQorc3RhdGljIGludCBCaXRtYXBfZ2V0R2VuZXJhdGlvbklkKEpOSUVudiogZW52LCBqb2JqZWN0LCBTa0JpdG1hcCogYml0bWFwKSB7DQorICAgIHJldHVybiBiaXRtYXAtPmdldEdlbmVyYXRpb25JRCgpOw0KK30NCisNCiBzdGF0aWMgamJvb2xlYW4gQml0bWFwX2hhc0FscGhhKEpOSUVudiogZW52LCBqb2JqZWN0LCBTa0JpdG1hcCogYml0bWFwKSB7DQogICAgIHJldHVybiAhYml0bWFwLT5pc09wYXF1ZSgpOw0KIH0NCkBAIC02MDYsNiArNjEwLDcgQEAKICAgICAgICAgKHZvaWQqKUJpdG1hcF93cml0ZVRvUGFyY2VsIH0sDQogICAgIHsgICAibmF0aXZlRXh0cmFjdEFscGhhIiwgICAgICAgIihJSVtJKUxhbmRyb2lkL2dyYXBoaWNzL0JpdG1hcDsiLA0KICAgICAgICAgKHZvaWQqKUJpdG1hcF9leHRyYWN0QWxwaGEgfSwNCisgICAgeyAgICJuYXRpdmVHZW5lcmF0aW9uSWQiLCAgICAgICAiKEkpSSIsICh2b2lkKilCaXRtYXBfZ2V0R2VuZXJhdGlvbklkIH0sDQogICAgIHsgICAibmF0aXZlR2V0UGl4ZWwiLCAgICAgICAgICAgIihJSUkpSSIsICh2b2lkKilCaXRtYXBfZ2V0UGl4ZWwgfSwNCiAgICAgeyAgICJuYXRpdmVHZXRQaXhlbHMiLCAgICAgICAgICAiKElbSUlJSUlJSSlWIiwgKHZvaWQqKUJpdG1hcF9nZXRQaXhlbHMgfSwNCiAgICAgeyAgICJuYXRpdmVTZXRQaXhlbCIsICAgICAgICAgICAiKElJSUkpViIsICh2b2lkKilCaXRtYXBfc2V0UGl4ZWwgfSwNCmRpZmYgLS1naXQgYS9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL0NhbnZhcy5jcHAgYi9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL0NhbnZhcy5jcHAKaW5kZXggZTFlOTUzNi4uYmYxNTBhOSAxMDA2NDQKLS0tIGEvY29yZS9qbmkvYW5kcm9pZC9ncmFwaGljcy9DYW52YXMuY3BwCisrKyBiL2NvcmUvam5pL2FuZHJvaWQvZ3JhcGhpY3MvQ2FudmFzLmNwcApAQCAtMjAsNyArMjAsNiBAQAogCiAjaW5jbHVkZSAiU2tDYW52YXMuaCIKICNpbmNsdWRlICJTa0RldmljZS5oIgotI2luY2x1ZGUgIlNrR0xDYW52YXMuaCIKICNpbmNsdWRlICJTa0dyYXBoaWNzLmgiCiAjaW5jbHVkZSAiU2tJbWFnZVJlZl9HbG9iYWxQb29sLmgiCiAjaW5jbHVkZSAiU2tQb3J0ZXJEdWZmLmgiCkBAIC0zMCw2ICsyOSwxMyBAQAogI2luY2x1ZGUgIlNrQm91bmRhcnlQYXRjaC5oIgogI2luY2x1ZGUgIlNrTWVzaFV0aWxzLmgiCiAKKyNpbmNsdWRlICJUZXh0TGF5b3V0LmgiCisKKyNpbmNsdWRlICJ1bmljb2RlL3ViaWRpLmgiCisjaW5jbHVkZSAidW5pY29kZS91c2hhcGUuaCIKKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCiAjZGVmaW5lIFRJTUVfRFJBV3gKIAogc3RhdGljIHVpbnQzMl90IGdldF90aHJlYWRfbXNlYygpIHsKQEAgLTYwLDEzICs2Niw4IEBACiAgICAgICAgIHJldHVybiBiaXRtYXAgPyBuZXcgU2tDYW52YXMoKmJpdG1hcCkgOiBuZXcgU2tDYW52YXM7CiAgICAgfQogICAgIAotICAgIHN0YXRpYyBTa0NhbnZhcyogaW5pdEdMKEpOSUVudiogZW52LCBqb2JqZWN0KSB7Ci0gICAgICAgIHJldHVybiBuZXcgU2tHTENhbnZhczsKLSAgICB9Ci0gICAgCiAgICAgc3RhdGljIHZvaWQgZnJlZUNhY2hlcyhKTklFbnYqIGVudiwgam9iamVjdCkgewogICAgICAgICAvLyB0aGVzZSBhcmUgY2FsbGVkIGluIG5vIHBhcnRpY3VsYXIgb3JkZXIKLSAgICAgICAgU2tHTENhbnZhczo6RGVsZXRlQWxsVGV4dHVyZXMoKTsKICAgICAgICAgU2tJbWFnZVJlZl9HbG9iYWxQb29sOjpTZXRSQU1Vc2VkKDApOwogICAgICAgICBTa0dyYXBoaWNzOjpTZXRGb250Q2FjaGVVc2VkKDApOwogICAgIH0KQEAgLTEwMywxMSArMTA0LDYgQEAKICAgICAgICAgcmV0dXJuIGNhbnZhcy0+Z2V0RGV2aWNlKCktPmFjY2Vzc0JpdG1hcChmYWxzZSkuaGVpZ2h0KCk7CiAgICAgfQogCi0gICAgc3RhdGljIHZvaWQgc2V0Vmlld3BvcnQoSk5JRW52KiBlbnYsIGpvYmplY3QsIFNrQ2FudmFzKiBjYW52YXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0gICAgICAgIGNhbnZhcy0+c2V0Vmlld3BvcnQod2lkdGgsIGhlaWdodCk7Ci0gICAgfQotICAgIAogICAgIHN0YXRpYyB2b2lkIHNldEJpdG1hcChKTklFbnYqIGVudiwgam9iamVjdCwgU2tDYW52YXMqIGNhbnZhcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgU2tCaXRtYXAqIGJpdG1hcCkgewogICAgICAgICBjYW52YXMtPnNldEJpdG1hcERldmljZSgqYml0bWFwKTsKQEAgLTc0Myw0NSArNzM5LDQ5IEBACiAgICAgICAgIGNhbnZhcy0+ZHJhd1ZlcnRpY2VzKG1vZGUsIHB0Q291bnQsIHZlcnRzLCB0ZXhzLCBjb2xvcnMsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGljZXMsIGluZGV4Q291bnQsICpwYWludCk7CiAgICAgfQotICAgIAotICAgIHN0YXRpYyB2b2lkIGRyYXdUZXh0X19fQ0lJRkZQYWludChKTklFbnYqIGVudiwgam9iamVjdCwgU2tDYW52YXMqIGNhbnZhcywKKworCisgICAgc3RhdGljIHZvaWQgZHJhd1RleHRfX19DSUlGRklQYWludChKTklFbnYqIGVudiwgam9iamVjdCwgU2tDYW52YXMqIGNhbnZhcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamNoYXJBcnJheSB0ZXh0LCBpbnQgaW5kZXgsIGludCBjb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamZsb2F0IHgsIGpmbG9hdCB5LCBTa1BhaW50KiBwYWludCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqZmxvYXQgeCwgamZsb2F0IHksIGludCBmbGFncywgU2tQYWludCogcGFpbnQpIHsKICAgICAgICAgamNoYXIqIHRleHRBcnJheSA9IGVudi0+R2V0Q2hhckFycmF5RWxlbWVudHModGV4dCwgTlVMTCk7Ci0gICAgICAgIGpzaXplIHRleHRDb3VudCA9IGVudi0+R2V0QXJyYXlMZW5ndGgodGV4dCk7Ci0gICAgICAgIFNrU2NhbGFyIHhfID0gU2tGbG9hdFRvU2NhbGFyKHgpOwotICAgICAgICBTa1NjYWxhciB5XyA9IFNrRmxvYXRUb1NjYWxhcih5KTsKLSAgICAgICAgY2FudmFzLT5kcmF3VGV4dCh0ZXh0QXJyYXkgKyBpbmRleCwgY291bnQgPDwgMSwgeF8sIHlfLCAqcGFpbnQpOwotICAgICAgICBlbnYtPlJlbGVhc2VDaGFyQXJyYXlFbGVtZW50cyh0ZXh0LCB0ZXh0QXJyYXksIDApOworICAgICAgICBUZXh0TGF5b3V0OjpkcmF3VGV4dChwYWludCwgdGV4dEFycmF5ICsgaW5kZXgsIGNvdW50LCBmbGFncywgeCwgeSwgY2FudmFzKTsKKyAgICAgICAgZW52LT5SZWxlYXNlQ2hhckFycmF5RWxlbWVudHModGV4dCwgdGV4dEFycmF5LCBKTklfQUJPUlQpOwogICAgIH0KLSAKLSAgICBzdGF0aWMgdm9pZCBkcmF3VGV4dF9fU3RyaW5nSUlGRlBhaW50KEpOSUVudiogZW52LCBqb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNrQ2FudmFzKiBjYW52YXMsIGpzdHJpbmcgdGV4dCwgaW50IHN0YXJ0LCBpbnQgZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamZsb2F0IHgsIGpmbG9hdCB5LCBTa1BhaW50KiBwYWludCkgewotICAgICAgICBjb25zdCB2b2lkKiB0ZXh0XyA9IGVudi0+R2V0U3RyaW5nQ2hhcnModGV4dCwgTlVMTCk7Ci0gICAgICAgIFNrU2NhbGFyIHhfID0gU2tGbG9hdFRvU2NhbGFyKHgpOwotICAgICAgICBTa1NjYWxhciB5XyA9IFNrRmxvYXRUb1NjYWxhcih5KTsKLSAgICAgICAgY2FudmFzLT5kcmF3VGV4dCgoY29uc3QgdWludDE2X3QqKXRleHRfICsgc3RhcnQsIChlbmQgLSBzdGFydCkgPDwgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICB4XywgeV8sICpwYWludCk7Ci0gICAgICAgIGVudi0+UmVsZWFzZVN0cmluZ0NoYXJzKHRleHQsIChjb25zdCBqY2hhciopIHRleHRfKTsKKworICAgIHN0YXRpYyB2b2lkIGRyYXdUZXh0X19TdHJpbmdJSUZGSVBhaW50KEpOSUVudiogZW52LCBqb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2tDYW52YXMqIGNhbnZhcywganN0cmluZyB0ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0LCBpbnQgZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamZsb2F0IHgsIGpmbG9hdCB5LCBpbnQgZmxhZ3MsIFNrUGFpbnQqIHBhaW50KSB7CisgICAgICAgIGNvbnN0IGpjaGFyKiB0ZXh0QXJyYXkgPSBlbnYtPkdldFN0cmluZ0NoYXJzKHRleHQsIE5VTEwpOworICAgICAgICBUZXh0TGF5b3V0OjpkcmF3VGV4dChwYWludCwgdGV4dEFycmF5ICsgc3RhcnQsIGVuZCAtIHN0YXJ0LCBmbGFncywgeCwgeSwgY2FudmFzKTsKKyAgICAgICAgZW52LT5SZWxlYXNlU3RyaW5nQ2hhcnModGV4dCwgdGV4dEFycmF5KTsKICAgICB9Ci0gICAgCi0gICAgc3RhdGljIHZvaWQgZHJhd1N0cmluZyhKTklFbnYqIGVudiwgam9iamVjdCBjYW52YXMsIGpzdHJpbmcgdGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGpmbG9hdCB4LCBqZmxvYXQgeSwgam9iamVjdCBwYWludCkgewotICAgICAgICBOUEVfQ0hFQ0tfUkVUVVJOX1ZPSUQoZW52LCBjYW52YXMpOwotICAgICAgICBOUEVfQ0hFQ0tfUkVUVVJOX1ZPSUQoZW52LCBwYWludCk7Ci0gICAgICAgIE5QRV9DSEVDS19SRVRVUk5fVk9JRChlbnYsIHRleHQpOwotICAgICAgICBzaXplX3QgY291bnQgPSBlbnYtPkdldFN0cmluZ0xlbmd0aCh0ZXh0KTsKLSAgICAgICAgaWYgKDAgPT0gY291bnQpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBjb25zdCBqY2hhciogdGV4dF8gPSBlbnYtPkdldFN0cmluZ0NoYXJzKHRleHQsIE5VTEwpOwotICAgICAgICBTa0NhbnZhcyogYyA9IEdyYXBoaWNzSk5JOjpnZXROYXRpdmVDYW52YXMoZW52LCBjYW52YXMpOwotICAgICAgICBjLT5kcmF3VGV4dCh0ZXh0XywgY291bnQgPDwgMSwgU2tGbG9hdFRvU2NhbGFyKHgpLCBTa0Zsb2F0VG9TY2FsYXIoeSksCi0gICAgICAgICAgICAgICAgICAgICpHcmFwaGljc0pOSTo6Z2V0TmF0aXZlUGFpbnQoZW52LCBwYWludCkpOwotICAgICAgICBlbnYtPlJlbGVhc2VTdHJpbmdDaGFycyh0ZXh0LCB0ZXh0Xyk7CisKKyAgICBzdGF0aWMgdm9pZCBkcmF3VGV4dFJ1bl9fX0NJSUlJRkZJUGFpbnQoCisgICAgICAgIEpOSUVudiogZW52LCBqb2JqZWN0LCBTa0NhbnZhcyogY2FudmFzLCBqY2hhckFycmF5IHRleHQsIGludCBpbmRleCwKKyAgICAgICAgaW50IGNvdW50LCBpbnQgY29udGV4dEluZGV4LCBpbnQgY29udGV4dENvdW50LAorICAgICAgICBqZmxvYXQgeCwgamZsb2F0IHksIGludCBkaXJGbGFncywgU2tQYWludCogcGFpbnQpIHsKKworICAgICAgICBqY2hhciogY2hhcnMgPSBlbnYtPkdldENoYXJBcnJheUVsZW1lbnRzKHRleHQsIE5VTEwpOworICAgICAgICBUZXh0TGF5b3V0OjpkcmF3VGV4dFJ1bihwYWludCwgY2hhcnMgKyBjb250ZXh0SW5kZXgsIGluZGV4IC0gY29udGV4dEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCwgY29udGV4dENvdW50LCBkaXJGbGFncywgeCwgeSwgY2FudmFzKTsKKyAgICAgICAgZW52LT5SZWxlYXNlQ2hhckFycmF5RWxlbWVudHModGV4dCwgY2hhcnMsIEpOSV9BQk9SVCk7CiAgICAgfQotICAgIAorCisgICAgc3RhdGljIHZvaWQgZHJhd1RleHRSdW5fX1N0cmluZ0lJSUlGRklQYWludCgKKyAgICAgICAgSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqLCBTa0NhbnZhcyogY2FudmFzLCBqc3RyaW5nIHRleHQsIGppbnQgc3RhcnQsCisgICAgICAgIGppbnQgZW5kLCBqaW50IGNvbnRleHRTdGFydCwgamludCBjb250ZXh0RW5kLAorICAgICAgICBqZmxvYXQgeCwgamZsb2F0IHksIGppbnQgZGlyRmxhZ3MsIFNrUGFpbnQqIHBhaW50KSB7CisKKyAgICAgICAgamludCBjb3VudCA9IGVuZCAtIHN0YXJ0OworICAgICAgICBqaW50IGNvbnRleHRDb3VudCA9IGNvbnRleHRFbmQgLSBjb250ZXh0U3RhcnQ7CisgICAgICAgIGNvbnN0IGpjaGFyKiBjaGFycyA9IGVudi0+R2V0U3RyaW5nQ2hhcnModGV4dCwgTlVMTCk7CisgICAgICAgIFRleHRMYXlvdXQ6OmRyYXdUZXh0UnVuKHBhaW50LCBjaGFycyArIGNvbnRleHRTdGFydCwgc3RhcnQgLSBjb250ZXh0U3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50LCBjb250ZXh0Q291bnQsIGRpckZsYWdzLCB4LCB5LCBjYW52YXMpOworICAgICAgICBlbnYtPlJlbGVhc2VTdHJpbmdDaGFycyh0ZXh0LCBjaGFycyk7CisgICAgfQorCiAgICAgc3RhdGljIHZvaWQgZHJhd1Bvc1RleHRfX19DSUlfRlBhaW50KEpOSUVudiogZW52LCBqb2JqZWN0LCBTa0NhbnZhcyogY2FudmFzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqY2hhckFycmF5IHRleHQsIGludCBpbmRleCwgaW50IGNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqZmxvYXRBcnJheSBwb3MsIFNrUGFpbnQqIHBhaW50KSB7CkBAIC04MDQsMTAgKzgwNCwxMSBAQAogICAgICAgICB9CiAgICAgICAgIGRlbGV0ZVtdIHBvc1B0cjsKICAgICB9Ci0gCisKICAgICBzdGF0aWMgdm9pZCBkcmF3UG9zVGV4dF9fU3RyaW5nX0ZQYWludChKTklFbnYqIGVudiwgam9iamVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTa0NhbnZhcyogY2FudmFzLCBqc3RyaW5nIHRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamZsb2F0QXJyYXkgcG9zLCBTa1BhaW50KiBwYWludCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpmbG9hdEFycmF5IHBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTa1BhaW50KiBwYWludCkgewogICAgICAgICBjb25zdCB2b2lkKiB0ZXh0XyA9IHRleHQgPyBlbnYtPkdldFN0cmluZ0NoYXJzKHRleHQsIE5VTEwpIDogTlVMTDsKICAgICAgICAgaW50IGJ5dGVMZW5ndGggPSB0ZXh0ID8gZW52LT5HZXRTdHJpbmdMZW5ndGgodGV4dCkgOiAwOwogICAgICAgICBmbG9hdCogcG9zQXJyYXkgPSBwb3MgPyBlbnYtPkdldEZsb2F0QXJyYXlFbGVtZW50cyhwb3MsIE5VTEwpIDogTlVMTDsKQEAgLTgyNywyNyArODI4LDI3IEBACiAgICAgICAgIH0KICAgICAgICAgZGVsZXRlW10gcG9zUHRyOwogICAgIH0KLSAKKwogICAgIHN0YXRpYyB2b2lkIGRyYXdUZXh0T25QYXRoX19fQ0lJUGF0aEZGUGFpbnQoSk5JRW52KiBlbnYsIGpvYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICBTa0NhbnZhcyogY2FudmFzLCBqY2hhckFycmF5IHRleHQsIGludCBpbmRleCwgaW50IGNvdW50LAotICAgICAgICAgICAgICAgIFNrUGF0aCogcGF0aCwgamZsb2F0IGhPZmZzZXQsIGpmbG9hdCB2T2Zmc2V0LCBTa1BhaW50KiBwYWludCkgeworICAgICAgICAgICAgU2tDYW52YXMqIGNhbnZhcywgamNoYXJBcnJheSB0ZXh0LCBpbnQgaW5kZXgsIGludCBjb3VudCwKKyAgICAgICAgICAgIFNrUGF0aCogcGF0aCwgamZsb2F0IGhPZmZzZXQsIGpmbG9hdCB2T2Zmc2V0LCBqaW50IGJpZGlGbGFncywgU2tQYWludCogcGFpbnQpIHsKIAogICAgICAgICBqY2hhciogdGV4dEFycmF5ID0gZW52LT5HZXRDaGFyQXJyYXlFbGVtZW50cyh0ZXh0LCBOVUxMKTsKLSAgICAgICAgY2FudmFzLT5kcmF3VGV4dE9uUGF0aEhWKHRleHRBcnJheSArIGluZGV4LCBjb3VudCA8PCAxLCAqcGF0aCwKLSAgICAgICAgICAgICAgICAgICAgU2tGbG9hdFRvU2NhbGFyKGhPZmZzZXQpLCBTa0Zsb2F0VG9TY2FsYXIodk9mZnNldCksICpwYWludCk7CisgICAgICAgIFRleHRMYXlvdXQ6OmRyYXdUZXh0T25QYXRoKHBhaW50LCB0ZXh0QXJyYXksIGNvdW50LCBiaWRpRmxhZ3MsIGhPZmZzZXQsIHZPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGgsIGNhbnZhcyk7CiAgICAgICAgIGVudi0+UmVsZWFzZUNoYXJBcnJheUVsZW1lbnRzKHRleHQsIHRleHRBcnJheSwgMCk7CiAgICAgfQotIAorCiAgICAgc3RhdGljIHZvaWQgZHJhd1RleHRPblBhdGhfX1N0cmluZ1BhdGhGRlBhaW50KEpOSUVudiogZW52LCBqb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNrQ2FudmFzKiBjYW52YXMsIGpzdHJpbmcgdGV4dCwgU2tQYXRoKiBwYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpmbG9hdCBoT2Zmc2V0LCBqZmxvYXQgdk9mZnNldCwgU2tQYWludCogcGFpbnQpIHsKKyAgICAgICAgICAgIFNrQ2FudmFzKiBjYW52YXMsIGpzdHJpbmcgdGV4dCwgU2tQYXRoKiBwYXRoLAorICAgICAgICAgICAgamZsb2F0IGhPZmZzZXQsIGpmbG9hdCB2T2Zmc2V0LCBqaW50IGJpZGlGbGFncywgU2tQYWludCogcGFpbnQpIHsKICAgICAgICAgY29uc3QgamNoYXIqIHRleHRfID0gZW52LT5HZXRTdHJpbmdDaGFycyh0ZXh0LCBOVUxMKTsKLSAgICAgICAgaW50IGJ5dGVMZW5ndGggPSBlbnYtPkdldFN0cmluZ0xlbmd0aCh0ZXh0KSA8PCAxOwotICAgICAgICBjYW52YXMtPmRyYXdUZXh0T25QYXRoSFYodGV4dF8sIGJ5dGVMZW5ndGgsICpwYXRoLAotICAgICAgICAgICAgICAgICAgICBTa0Zsb2F0VG9TY2FsYXIoaE9mZnNldCksIFNrRmxvYXRUb1NjYWxhcih2T2Zmc2V0KSwgKnBhaW50KTsKKyAgICAgICAgaW50IGNvdW50ID0gZW52LT5HZXRTdHJpbmdMZW5ndGgodGV4dCk7CisgICAgICAgIFRleHRMYXlvdXQ6OmRyYXdUZXh0T25QYXRoKHBhaW50LCB0ZXh0XywgY291bnQsIGJpZGlGbGFncywgaE9mZnNldCwgdk9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCwgY2FudmFzKTsKICAgICAgICAgZW52LT5SZWxlYXNlU3RyaW5nQ2hhcnModGV4dCwgdGV4dF8pOwogICAgIH0KLSAKKwogICAgIHN0YXRpYyBib29sIGdldENsaXBCb3VuZHMoSk5JRW52KiBlbnYsIGpvYmplY3QsIFNrQ2FudmFzKiBjYW52YXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqb2JqZWN0IGJvdW5kcykgewogICAgICAgICBTa1JlY3QgICByOwpAQCAtODY4LDEyICs4NjksMTAgQEAKIHN0YXRpYyBKTklOYXRpdmVNZXRob2QgZ0NhbnZhc01ldGhvZHNbXSA9IHsKICAgICB7ImZpbmFsaXplciIsICIoSSlWIiwgKHZvaWQqKSBTa0NhbnZhc0dsdWU6OmZpbmFsaXplcn0sCiAgICAgeyJpbml0UmFzdGVyIiwiKEkpSSIsICh2b2lkKikgU2tDYW52YXNHbHVlOjppbml0UmFzdGVyfSwKLSAgICB7ImluaXRHTCIsIigpSSIsICh2b2lkKikgU2tDYW52YXNHbHVlOjppbml0R0x9LAogICAgIHsiaXNPcGFxdWUiLCIoKVoiLCAodm9pZCopIFNrQ2FudmFzR2x1ZTo6aXNPcGFxdWV9LAogICAgIHsiZ2V0V2lkdGgiLCIoKUkiLCAodm9pZCopIFNrQ2FudmFzR2x1ZTo6Z2V0V2lkdGh9LAogICAgIHsiZ2V0SGVpZ2h0IiwiKClJIiwgKHZvaWQqKSBTa0NhbnZhc0dsdWU6OmdldEhlaWdodH0sCiAgICAgeyJuYXRpdmVfc2V0Qml0bWFwIiwiKElJKVYiLCAodm9pZCopIFNrQ2FudmFzR2x1ZTo6c2V0Qml0bWFwfSwKLSAgICB7Im5hdGl2ZVNldFZpZXdwb3J0IiwgIihJSUkpViIsICh2b2lkKikgU2tDYW52YXNHbHVlOjpzZXRWaWV3cG9ydH0sCiAgICAgeyJzYXZlIiwiKClJIiwgKHZvaWQqKSBTa0NhbnZhc0dsdWU6OnNhdmVBbGx9LAogICAgIHsic2F2ZSIsIihJKUkiLCAodm9pZCopIFNrQ2FudmFzR2x1ZTo6c2F2ZX0sCiAgICAgeyJuYXRpdmVfc2F2ZUxheWVyIiwiKElMYW5kcm9pZC9ncmFwaGljcy9SZWN0RjtJSSlJIiwKQEAgLTk0MCwyNiArOTM5LDI3IEBACiAgICAgICAgICh2b2lkKikgU2tDYW52YXNHbHVlOjpkcmF3Qml0bWFwUlJ9LAogICAgIHsibmF0aXZlX2RyYXdCaXRtYXAiLCAiKElbSUlJRkZJSVpJKVYiLAogICAgICh2b2lkKilTa0NhbnZhc0dsdWU6OmRyYXdCaXRtYXBBcnJheX0sCi0gICAgCiAgICAgeyJuYXRpdmVEcmF3Qml0bWFwTWF0cml4IiwgIihJSUlJKVYiLAogICAgICAgICAodm9pZCopU2tDYW52YXNHbHVlOjpkcmF3Qml0bWFwTWF0cml4fSwKICAgICB7Im5hdGl2ZURyYXdCaXRtYXBNZXNoIiwgIihJSUlJW0ZJW0lJSSlWIiwKICAgICAgICAgKHZvaWQqKVNrQ2FudmFzR2x1ZTo6ZHJhd0JpdG1hcE1lc2h9LAogICAgIHsibmF0aXZlRHJhd1ZlcnRpY2VzIiwgIihJSUlbRklbRklbSUlbU0lJSSlWIiwKICAgICAgICAgKHZvaWQqKVNrQ2FudmFzR2x1ZTo6ZHJhd1ZlcnRpY2VzfSwKLSAgICB7Im5hdGl2ZV9kcmF3VGV4dCIsIihJW0NJSUZGSSlWIiwKLSAgICAgICAgKHZvaWQqKSBTa0NhbnZhc0dsdWU6OmRyYXdUZXh0X19fQ0lJRkZQYWludH0sCi0gICAgeyJuYXRpdmVfZHJhd1RleHQiLCIoSUxqYXZhL2xhbmcvU3RyaW5nO0lJRkZJKVYiLAotICAgICAgICAodm9pZCopIFNrQ2FudmFzR2x1ZTo6ZHJhd1RleHRfX1N0cmluZ0lJRkZQYWludH0sCi0gICAgeyJkcmF3VGV4dCIsIihMamF2YS9sYW5nL1N0cmluZztGRkxhbmRyb2lkL2dyYXBoaWNzL1BhaW50OylWIiwKLSAgICAgICAgKHZvaWQqKSBTa0NhbnZhc0dsdWU6OmRyYXdTdHJpbmd9LAorICAgIHsibmF0aXZlX2RyYXdUZXh0IiwiKElbQ0lJRkZJSSlWIiwKKyAgICAgICAgKHZvaWQqKSBTa0NhbnZhc0dsdWU6OmRyYXdUZXh0X19fQ0lJRkZJUGFpbnR9LAorICAgIHsibmF0aXZlX2RyYXdUZXh0IiwiKElMamF2YS9sYW5nL1N0cmluZztJSUZGSUkpViIsCisgICAgICAgICh2b2lkKikgU2tDYW52YXNHbHVlOjpkcmF3VGV4dF9fU3RyaW5nSUlGRklQYWludH0sCisgICAgeyJuYXRpdmVfZHJhd1RleHRSdW4iLCIoSVtDSUlJSUZGSUkpViIsCisgICAgICAgICh2b2lkKikgU2tDYW52YXNHbHVlOjpkcmF3VGV4dFJ1bl9fX0NJSUlJRkZJUGFpbnR9LAorICAgIHsibmF0aXZlX2RyYXdUZXh0UnVuIiwiKElMamF2YS9sYW5nL1N0cmluZztJSUlJRkZJSSlWIiwKKyAgICAgICAgKHZvaWQqKSBTa0NhbnZhc0dsdWU6OmRyYXdUZXh0UnVuX19TdHJpbmdJSUlJRkZJUGFpbnR9LAogICAgIHsibmF0aXZlX2RyYXdQb3NUZXh0IiwiKElbQ0lJW0ZJKVYiLAogICAgICAgICAodm9pZCopIFNrQ2FudmFzR2x1ZTo6ZHJhd1Bvc1RleHRfX19DSUlfRlBhaW50fSwKICAgICB7Im5hdGl2ZV9kcmF3UG9zVGV4dCIsIihJTGphdmEvbGFuZy9TdHJpbmc7W0ZJKVYiLAogICAgICAgICAodm9pZCopIFNrQ2FudmFzR2x1ZTo6ZHJhd1Bvc1RleHRfX1N0cmluZ19GUGFpbnR9LAotICAgIHsibmF0aXZlX2RyYXdUZXh0T25QYXRoIiwiKElbQ0lJSUZGSSlWIiwKKyAgICB7Im5hdGl2ZV9kcmF3VGV4dE9uUGF0aCIsIihJW0NJSUlGRklJKVYiLAogICAgICAgICAodm9pZCopIFNrQ2FudmFzR2x1ZTo6ZHJhd1RleHRPblBhdGhfX19DSUlQYXRoRkZQYWludH0sCi0gICAgeyJuYXRpdmVfZHJhd1RleHRPblBhdGgiLCIoSUxqYXZhL2xhbmcvU3RyaW5nO0lGRkkpViIsCisgICAgeyJuYXRpdmVfZHJhd1RleHRPblBhdGgiLCIoSUxqYXZhL2xhbmcvU3RyaW5nO0lGRklJKVYiLAogICAgICAgICAodm9pZCopIFNrQ2FudmFzR2x1ZTo6ZHJhd1RleHRPblBhdGhfX1N0cmluZ1BhdGhGRlBhaW50fSwKICAgICB7Im5hdGl2ZV9kcmF3UGljdHVyZSIsICIoSUkpViIsICh2b2lkKikgU2tDYW52YXNHbHVlOjpkcmF3UGljdHVyZX0sCiAKZGlmZiAtLWdpdCBhL2NvcmUvam5pL2FuZHJvaWQvZ3JhcGhpY3MvQ29sb3JGaWx0ZXIuY3BwIGIvY29yZS9qbmkvYW5kcm9pZC9ncmFwaGljcy9Db2xvckZpbHRlci5jcHAKaW5kZXggZWJmYjIwOS4uZjNiZThiMCAxMDA2NDQKLS0tIGEvY29yZS9qbmkvYW5kcm9pZC9ncmFwaGljcy9Db2xvckZpbHRlci5jcHAKKysrIGIvY29yZS9qbmkvYW5kcm9pZC9ncmFwaGljcy9Db2xvckZpbHRlci5jcHAKQEAgLTIzLDI4ICsyMyw2OSBAQAogI2luY2x1ZGUgIlNrQ29sb3JNYXRyaXhGaWx0ZXIuaCIKICNpbmNsdWRlICJTa1BvcnRlckR1ZmYuaCIKIAorI2luY2x1ZGUgPFNraWFDb2xvckZpbHRlci5oPgorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKK3VzaW5nIG5hbWVzcGFjZSB1aXJlbmRlcmVyOworCiBjbGFzcyBTa0NvbG9yRmlsdGVyR2x1ZSB7CiBwdWJsaWM6Ci0KLSAgICBzdGF0aWMgdm9pZCBmaW5hbGl6ZXIoSk5JRW52KiBlbnYsIGpvYmplY3QgY2xhenosIFNrQ29sb3JGaWx0ZXIqIG9iaikgeworICAgIHN0YXRpYyB2b2lkIGZpbmFsaXplcihKTklFbnYqIGVudiwgam9iamVjdCBjbGF6eiwgU2tDb2xvckZpbHRlciogb2JqLCBTa2lhQ29sb3JGaWx0ZXIqIGYpIHsKKyAgICAgICAgZGVsZXRlIGY7CiAgICAgICAgIG9iai0+c2FmZVVucmVmKCk7CiAgICAgfQogCi0gICAgc3RhdGljIFNrQ29sb3JGaWx0ZXIqIENyZWF0ZVBvcnRlckR1ZmZGaWx0ZXIoSk5JRW52KiBlbnYsIGpvYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgamludCBzcmNDb2xvciwgU2tQb3J0ZXJEdWZmOjpNb2RlIG1vZGUpIHsKLSAgICAgICAgcmV0dXJuIFNrQ29sb3JGaWx0ZXI6OkNyZWF0ZU1vZGVGaWx0ZXIoc3JjQ29sb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2tQb3J0ZXJEdWZmOjpUb1hmZXJtb2RlTW9kZShtb2RlKSk7CisgICAgc3RhdGljIFNraWFDb2xvckZpbHRlciogZ2xDcmVhdGVQb3J0ZXJEdWZmRmlsdGVyKEpOSUVudiogZW52LCBqb2JqZWN0LCBqaW50IHNyY0NvbG9yLAorICAgICAgICAgICAgU2tQb3J0ZXJEdWZmOjpNb2RlIG1vZGUpIHsKKyNpZmRlZiBVU0VfT1BFTkdMX1JFTkRFUkVSCisgICAgICAgIHJldHVybiBuZXcgU2tpYUJsZW5kRmlsdGVyKHNyY0NvbG9yLCBTa1BvcnRlckR1ZmY6OlRvWGZlcm1vZGVNb2RlKG1vZGUpKTsKKyNlbHNlCisgICAgICAgIHJldHVybiBOVUxMOworI2VuZGlmCiAgICAgfQotIAotICAgIHN0YXRpYyBTa0NvbG9yRmlsdGVyKiBDcmVhdGVMaWdodGluZ0ZpbHRlcihKTklFbnYqIGVudiwgam9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamludCBtdWwsIGppbnQgYWRkKSB7CisKKyAgICBzdGF0aWMgU2tpYUNvbG9yRmlsdGVyKiBnbENyZWF0ZUxpZ2h0aW5nRmlsdGVyKEpOSUVudiogZW52LCBqb2JqZWN0LCBqaW50IG11bCwgamludCBhZGQpIHsKKyNpZmRlZiBVU0VfT1BFTkdMX1JFTkRFUkVSCisgICAgICAgIHJldHVybiBuZXcgU2tpYUxpZ2h0aW5nRmlsdGVyKG11bCwgYWRkKTsKKyNlbHNlCisgICAgICAgIHJldHVybiBOVUxMOworI2VuZGlmCisgICAgfQorCisgICAgc3RhdGljIFNraWFDb2xvckZpbHRlciogZ2xDcmVhdGVDb2xvck1hdHJpeEZpbHRlcihKTklFbnYqIGVudiwgam9iamVjdCwgamZsb2F0QXJyYXkgamFycmF5KSB7CisjaWZkZWYgVVNFX09QRU5HTF9SRU5ERVJFUgorICAgICAgICBBdXRvSmF2YUZsb2F0QXJyYXkgYXV0b0FycmF5KGVudiwgamFycmF5LCAyMCk7CisgICAgICAgIGNvbnN0IGZsb2F0KiBzcmMgPSBhdXRvQXJyYXkucHRyKCk7CisKKyAgICAgICAgZmxvYXQqIGNvbG9yTWF0cml4ID0gbmV3IGZsb2F0WzE2XTsKKyAgICAgICAgbWVtY3B5KGNvbG9yTWF0cml4LCBzcmMsIDQgKiBzaXplb2YoZmxvYXQpKTsKKyAgICAgICAgbWVtY3B5KCZjb2xvck1hdHJpeFs0XSwgJnNyY1s1XSwgNCAqIHNpemVvZihmbG9hdCkpOworICAgICAgICBtZW1jcHkoJmNvbG9yTWF0cml4WzhdLCAmc3JjWzEwXSwgNCAqIHNpemVvZihmbG9hdCkpOworICAgICAgICBtZW1jcHkoJmNvbG9yTWF0cml4WzEyXSwgJnNyY1sxNV0sIDQgKiBzaXplb2YoZmxvYXQpKTsKKworICAgICAgICBmbG9hdCogY29sb3JWZWN0b3IgPSBuZXcgZmxvYXRbNF07CisgICAgICAgIGNvbG9yVmVjdG9yWzBdID0gc3JjWzRdOworICAgICAgICBjb2xvclZlY3RvclsxXSA9IHNyY1s5XTsKKyAgICAgICAgY29sb3JWZWN0b3JbMl0gPSBzcmNbMTRdOworICAgICAgICBjb2xvclZlY3RvclszXSA9IHNyY1sxOV07CisKKyAgICAgICAgcmV0dXJuIG5ldyBTa2lhQ29sb3JNYXRyaXhGaWx0ZXIoY29sb3JNYXRyaXgsIGNvbG9yVmVjdG9yKTsKKyNlbHNlCisgICAgICAgIHJldHVybiBOVUxMOworI2VuZGlmCisgICAgfQorCisgICAgc3RhdGljIFNrQ29sb3JGaWx0ZXIqIENyZWF0ZVBvcnRlckR1ZmZGaWx0ZXIoSk5JRW52KiBlbnYsIGpvYmplY3QsIGppbnQgc3JjQ29sb3IsCisgICAgICAgICAgICBTa1BvcnRlckR1ZmY6Ok1vZGUgbW9kZSkgeworICAgICAgICByZXR1cm4gU2tDb2xvckZpbHRlcjo6Q3JlYXRlTW9kZUZpbHRlcihzcmNDb2xvciwgU2tQb3J0ZXJEdWZmOjpUb1hmZXJtb2RlTW9kZShtb2RlKSk7CisgICAgfQorCisgICAgc3RhdGljIFNrQ29sb3JGaWx0ZXIqIENyZWF0ZUxpZ2h0aW5nRmlsdGVyKEpOSUVudiogZW52LCBqb2JqZWN0LCBqaW50IG11bCwgamludCBhZGQpIHsKICAgICAgICAgcmV0dXJuIFNrQ29sb3JGaWx0ZXI6OkNyZWF0ZUxpZ2h0aW5nRmlsdGVyKG11bCwgYWRkKTsKICAgICB9Ci0gICAgCi0gICAgc3RhdGljIFNrQ29sb3JGaWx0ZXIqIENyZWF0ZUNvbG9yTWF0cml4RmlsdGVyKEpOSUVudiogZW52LCBqb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqZmxvYXRBcnJheSBqYXJyYXkpIHsKKworICAgIHN0YXRpYyBTa0NvbG9yRmlsdGVyKiBDcmVhdGVDb2xvck1hdHJpeEZpbHRlcihKTklFbnYqIGVudiwgam9iamVjdCwgamZsb2F0QXJyYXkgamFycmF5KSB7CiAgICAgICAgIEF1dG9KYXZhRmxvYXRBcnJheSBhdXRvQXJyYXkoZW52LCBqYXJyYXksIDIwKTsKICAgICAgICAgY29uc3QgZmxvYXQqIHNyYyA9IGF1dG9BcnJheS5wdHIoKTsKIApAQCAtNTgsMjYgKzk5LDI1IEBACiAgICAgICAgIHJldHVybiBuZXcgU2tDb2xvck1hdHJpeEZpbHRlcihzcmMpOwogI2VuZGlmCiAgICAgfQotIAogfTsKIAogc3RhdGljIEpOSU5hdGl2ZU1ldGhvZCBjb2xvcmZpbHRlcl9tZXRob2RzW10gPSB7Ci0gICAgeyJmaW5hbGl6ZXIiLCAiKEkpViIsICh2b2lkKikgU2tDb2xvckZpbHRlckdsdWU6OmZpbmFsaXplcn0KKyAgICB7ImZpbmFsaXplciIsICIoSUkpViIsICh2b2lkKikgU2tDb2xvckZpbHRlckdsdWU6OmZpbmFsaXplcn0KIH07CiAKIHN0YXRpYyBKTklOYXRpdmVNZXRob2QgcG9ydGVyZHVmZl9tZXRob2RzW10gPSB7Ci0gICAgeyJuYXRpdmVfQ3JlYXRlUG9ydGVyRHVmZkZpbHRlciIsIihJSSlJIiwKLSAgICAgICAgKHZvaWQqKSBTa0NvbG9yRmlsdGVyR2x1ZTo6Q3JlYXRlUG9ydGVyRHVmZkZpbHRlcn0KKyAgICB7ICJuYXRpdmVfQ3JlYXRlUG9ydGVyRHVmZkZpbHRlciIsICIoSUkpSSIsICh2b2lkKikgU2tDb2xvckZpbHRlckdsdWU6OkNyZWF0ZVBvcnRlckR1ZmZGaWx0ZXIgICB9LAorICAgIHsgIm5DcmVhdGVQb3J0ZXJEdWZmRmlsdGVyIiwgICAgICAgIihJSSlJIiwgKHZvaWQqKSBTa0NvbG9yRmlsdGVyR2x1ZTo6Z2xDcmVhdGVQb3J0ZXJEdWZmRmlsdGVyIH0KIH07CiAKIHN0YXRpYyBKTklOYXRpdmVNZXRob2QgbGlnaHRpbmdfbWV0aG9kc1tdID0gewotICAgIHsibmF0aXZlX0NyZWF0ZUxpZ2h0aW5nRmlsdGVyIiwiKElJKUkiLAotICAgICAgICAodm9pZCopIFNrQ29sb3JGaWx0ZXJHbHVlOjpDcmVhdGVMaWdodGluZ0ZpbHRlcn0KKyAgICB7ICJuYXRpdmVfQ3JlYXRlTGlnaHRpbmdGaWx0ZXIiLCAiKElJKUkiLCAodm9pZCopIFNrQ29sb3JGaWx0ZXJHbHVlOjpDcmVhdGVMaWdodGluZ0ZpbHRlciAgIH0sCisgICAgeyAibkNyZWF0ZUxpZ2h0aW5nRmlsdGVyIiwgICAgICAgIihJSSlJIiwgKHZvaWQqKSBTa0NvbG9yRmlsdGVyR2x1ZTo6Z2xDcmVhdGVMaWdodGluZ0ZpbHRlciB9LAogfTsKIAogc3RhdGljIEpOSU5hdGl2ZU1ldGhvZCBjb2xvcm1hdHJpeF9tZXRob2RzW10gPSB7Ci0gICAgeyJuYXRpdmVDb2xvck1hdHJpeEZpbHRlciIsIihbRilJIiwKLSAgICAgICAgKHZvaWQqKSBTa0NvbG9yRmlsdGVyR2x1ZTo6Q3JlYXRlQ29sb3JNYXRyaXhGaWx0ZXJ9CisgICAgeyAibmF0aXZlQ29sb3JNYXRyaXhGaWx0ZXIiLCAiKFtGKUkiLCAodm9pZCopIFNrQ29sb3JGaWx0ZXJHbHVlOjpDcmVhdGVDb2xvck1hdHJpeEZpbHRlciAgIH0sCisgICAgeyAibkNvbG9yTWF0cml4RmlsdGVyIiwgICAgICAiKFtGKUkiLCAodm9pZCopIFNrQ29sb3JGaWx0ZXJHbHVlOjpnbENyZWF0ZUNvbG9yTWF0cml4RmlsdGVyIH0KIH07CiAKICNkZWZpbmUgUkVHKGVudiwgbmFtZSwgYXJyYXkpIFwKQEAgLTg1LDcgKzEyNSw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0tfQVJSQVlfQ09VTlQoYXJyYXkpKTsgIFwKICAgICBpZiAocmVzdWx0IDwgMCkgcmV0dXJuIHJlc3VsdAogCi0KIGludCByZWdpc3Rlcl9hbmRyb2lkX2dyYXBoaWNzX0NvbG9yRmlsdGVyKEpOSUVudiogZW52KSB7CiAgICAgaW50IHJlc3VsdDsKICAgICAKZGlmZiAtLWdpdCBhL2NvcmUvam5pL2FuZHJvaWQvZ3JhcGhpY3MvUGFpbnQuY3BwIGIvY29yZS9qbmkvYW5kcm9pZC9ncmFwaGljcy9QYWludC5jcHAKaW5kZXggNzgwYmFkYy4uY2E5ZjM3MSAxMDA2NDQKLS0tIGEvY29yZS9qbmkvYW5kcm9pZC9ncmFwaGljcy9QYWludC5jcHAKKysrIGIvY29yZS9qbmkvYW5kcm9pZC9ncmFwaGljcy9QYWludC5jcHAKQEAgLTMxLDYgKzMxLDExIEBACiAjaW5jbHVkZSAiU2tTaGFkZXIuaCIKICNpbmNsdWRlICJTa1R5cGVmYWNlLmgiCiAjaW5jbHVkZSAiU2tYZmVybW9kZS5oIgorI2luY2x1ZGUgInVuaWNvZGUvdXNoYXBlLmgiCisjaW5jbHVkZSAiVGV4dExheW91dC5oIgorCisvLyB0ZW1wb3JhcnkgZm9yIGRlYnVnZ2luZworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTU3LDYgKzYyLDkgQEAKIAogY2xhc3MgU2tQYWludEdsdWUgewogcHVibGljOgorICAgIGVudW0gTW92ZU9wdCB7CisgICAgICAgIEFGVEVSLCBBVF9PUl9BRlRFUiwgQkVGT1JFLCBBVF9PUl9CRUZPUkUsIEFUCisgICAgfTsKIAogICAgIHN0YXRpYyB2b2lkIGZpbmFsaXplcihKTklFbnYqIGVudiwgam9iamVjdCBjbGF6eiwgU2tQYWludCogb2JqKSB7CiAgICAgICAgIGRlbGV0ZSBvYmo7CkBAIC0zOTUsMjAgKzQwMywxNjEgQEAKICAgICAgICAgZW52LT5SZWxlYXNlU3RyaW5nQ2hhcnModGV4dCwgdGV4dEFycmF5KTsKICAgICAgICAgcmV0dXJuIGNvdW50OwogICAgIH0KLSAgICAKLSAgICBzdGF0aWMgdm9pZCBnZXRUZXh0UGF0aF9fX0NJSUZGUGF0aChKTklFbnYqIGVudiwgam9iamVjdCBjbGF6eiwgU2tQYWludCogcGFpbnQsIGpjaGFyQXJyYXkgdGV4dCwgaW50IGluZGV4LCBpbnQgY291bnQsIGpmbG9hdCB4LCBqZmxvYXQgeSwgU2tQYXRoKiBwYXRoKSB7Ci0gICAgICAgIGNvbnN0IGpjaGFyKiB0ZXh0QXJyYXkgPSBlbnYtPkdldENoYXJBcnJheUVsZW1lbnRzKHRleHQsIE5VTEwpOwotICAgICAgICBwYWludC0+Z2V0VGV4dFBhdGgodGV4dEFycmF5ICsgaW5kZXgsIGNvdW50IDw8IDEsIFNrRmxvYXRUb1NjYWxhcih4KSwgU2tGbG9hdFRvU2NhbGFyKHkpLCBwYXRoKTsKLSAgICAgICAgZW52LT5SZWxlYXNlQ2hhckFycmF5RWxlbWVudHModGV4dCwgY29uc3RfY2FzdDxqY2hhcio+KHRleHRBcnJheSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpOSV9BQk9SVCk7CisKKyAgICBzdGF0aWMgamZsb2F0IGRvVGV4dFJ1bkFkdmFuY2VzKEpOSUVudiAqZW52LCBTa1BhaW50ICpwYWludCwgY29uc3QgamNoYXIgKnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqaW50IHN0YXJ0LCBqaW50IGNvdW50LCBqaW50IGNvbnRleHRDb3VudCwgamludCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpmbG9hdEFycmF5IGFkdmFuY2VzLCBqaW50IGFkdmFuY2VzSW5kZXgpIHsKKyAgICAgICAgamZsb2F0IGFkdmFuY2VzQXJyYXlbY291bnRdOworICAgICAgICBqZmxvYXQgdG90YWxBZHZhbmNlOworCisgICAgICAgIFRleHRMYXlvdXQ6OmdldFRleHRSdW5BZHZhbmNlcyhwYWludCwgdGV4dCwgc3RhcnQsIGNvdW50LCBjb250ZXh0Q291bnQsIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWR2YW5jZXNBcnJheSwgdG90YWxBZHZhbmNlKTsKKworICAgICAgICBpZiAoYWR2YW5jZXMgIT0gTlVMTCkgeworICAgICAgICAgICAgZW52LT5TZXRGbG9hdEFycmF5UmVnaW9uKGFkdmFuY2VzLCBhZHZhbmNlc0luZGV4LCBjb3VudCwgYWR2YW5jZXNBcnJheSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRvdGFsQWR2YW5jZTsKICAgICB9Ci0gCi0gICAgc3RhdGljIHZvaWQgZ2V0VGV4dFBhdGhfX1N0cmluZ0lJRkZQYXRoKEpOSUVudiogZW52LCBqb2JqZWN0IGNsYXp6LCBTa1BhaW50KiBwYWludCwganN0cmluZyB0ZXh0LCBpbnQgc3RhcnQsIGludCBlbmQsIGpmbG9hdCB4LCBqZmxvYXQgeSwgU2tQYXRoKiBwYXRoKSB7CisKKyAgICBzdGF0aWMgZmxvYXQgZ2V0VGV4dFJ1bkFkdmFuY2VzX19fQ0lJSUlJX0ZJKEpOSUVudiogZW52LCBqb2JqZWN0IGNsYXp6LCBTa1BhaW50KiBwYWludCwKKyAgICAgICAgICAgIGpjaGFyQXJyYXkgdGV4dCwgamludCBpbmRleCwgamludCBjb3VudCwgamludCBjb250ZXh0SW5kZXgsIGppbnQgY29udGV4dENvdW50LAorICAgICAgICAgICAgamludCBmbGFncywgamZsb2F0QXJyYXkgYWR2YW5jZXMsIGppbnQgYWR2YW5jZXNJbmRleCkgeworICAgICAgICBqY2hhciogdGV4dEFycmF5ID0gZW52LT5HZXRDaGFyQXJyYXlFbGVtZW50cyh0ZXh0LCBOVUxMKTsKKyAgICAgICAgamZsb2F0IHJlc3VsdCA9IGRvVGV4dFJ1bkFkdmFuY2VzKGVudiwgcGFpbnQsIHRleHRBcnJheSArIGNvbnRleHRJbmRleCwKKyAgICAgICAgICAgIGluZGV4IC0gY29udGV4dEluZGV4LCBjb3VudCwgY29udGV4dENvdW50LCBmbGFncywgYWR2YW5jZXMsIGFkdmFuY2VzSW5kZXgpOworICAgICAgICBlbnYtPlJlbGVhc2VDaGFyQXJyYXlFbGVtZW50cyh0ZXh0LCB0ZXh0QXJyYXksIEpOSV9BQk9SVCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgc3RhdGljIGZsb2F0IGdldFRleHRSdW5BZHZhbmNlc19fU3RyaW5nSUlJSUlfRkkoSk5JRW52KiBlbnYsIGpvYmplY3QgY2xhenosIFNrUGFpbnQqIHBhaW50LAorICAgICAgICAgICAganN0cmluZyB0ZXh0LCBqaW50IHN0YXJ0LCBqaW50IGVuZCwgamludCBjb250ZXh0U3RhcnQsIGppbnQgY29udGV4dEVuZCwgamludCBmbGFncywKKyAgICAgICAgICAgIGpmbG9hdEFycmF5IGFkdmFuY2VzLCBqaW50IGFkdmFuY2VzSW5kZXgpIHsKICAgICAgICAgY29uc3QgamNoYXIqIHRleHRBcnJheSA9IGVudi0+R2V0U3RyaW5nQ2hhcnModGV4dCwgTlVMTCk7Ci0gICAgICAgIHBhaW50LT5nZXRUZXh0UGF0aCh0ZXh0QXJyYXkgKyBzdGFydCwgKGVuZCAtIHN0YXJ0KSA8PCAxLCBTa0Zsb2F0VG9TY2FsYXIoeCksIFNrRmxvYXRUb1NjYWxhcih5KSwgcGF0aCk7CisgICAgICAgIGpmbG9hdCByZXN1bHQgPSBkb1RleHRSdW5BZHZhbmNlcyhlbnYsIHBhaW50LCB0ZXh0QXJyYXkgKyBjb250ZXh0U3RhcnQsCisgICAgICAgICAgICBzdGFydCAtIGNvbnRleHRTdGFydCwgZW5kIC0gc3RhcnQsIGNvbnRleHRFbmQgLSBjb250ZXh0U3RhcnQsIGZsYWdzLCBhZHZhbmNlcywKKyAgICAgICAgICAgIGFkdmFuY2VzSW5kZXgpOworICAgICAgICBlbnYtPlJlbGVhc2VTdHJpbmdDaGFycyh0ZXh0LCB0ZXh0QXJyYXkpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHN0YXRpYyBqaW50IGRvVGV4dFJ1bkN1cnNvcihKTklFbnYgKmVudiwgU2tQYWludCogcGFpbnQsIGNvbnN0IGpjaGFyICp0ZXh0LCBqaW50IHN0YXJ0LAorICAgICAgICAgICAgamludCBjb3VudCwgamludCBmbGFncywgamludCBvZmZzZXQsIGppbnQgb3B0KSB7CisgICAgICAgIFNrU2NhbGFyIHNjYWxhckFycmF5W2NvdW50XTsKKyAgICAgICAgamNoYXIgYnVmZmVyW2NvdW50XTsKKworICAgICAgICAvLyB0aGlzIGlzIHdoZXJlIHdlJ2QgY2FsbCBoYXJmYnV6egorICAgICAgICAvLyBmb3Igbm93IHdlIGp1c3QgdXNlIHVzaGFwZS5jIGFuZCB3aWR0aHMgcmV0dXJuZWQgZnJvbSBza2lhCisKKyAgICAgICAgaW50IHdpZHRoczsKKyAgICAgICAgaWYgKGZsYWdzICYgMHgxKSB7IC8vIHJ0bCwgY2FsbCBhcmFiaWMgc2hhcGluZyBpbiBjYXNlCisgICAgICAgICAgICBVRXJyb3JDb2RlIHN0YXR1cyA9IFVfWkVST19FUlJPUjsKKyAgICAgICAgICAgIC8vIFVzZSBmaXhlZCBsZW5ndGggc2luY2Ugd2UgbmVlZCB0byBrZWVwIHN0YXJ0IGFuZCBjb3VudCB2YWxpZAorICAgICAgICAgICAgdV9zaGFwZUFyYWJpYyh0ZXh0ICsgc3RhcnQsIGNvdW50LCBidWZmZXIsIGNvdW50LAorICAgICAgICAgICAgICAgICAgICBVX1NIQVBFX0xFTkdUSF9GSVhFRF9TUEFDRVNfTkVBUiB8IFVfU0hBUEVfVEVYVF9ESVJFQ1RJT05fTE9HSUNBTCB8CisgICAgICAgICAgICAgICAgICAgIFVfU0hBUEVfTEVUVEVSU19TSEFQRSB8IFVfU0hBUEVfWF9MQU1BTEVGX1NVQl9BTFRFUk5BVEUsICZzdGF0dXMpOworICAgICAgICAgICAgLy8gd2Ugc2hvdWxkbid0IGZhaWwgdW5sZXNzIHRoZXJlJ3MgYW4gb3V0IG9mIG1lbW9yeSBjb25kaXRpb24sCisgICAgICAgICAgICAvLyBpbiB3aGljaCBjYXNlIHdlJ3JlIGhvc2VkIGFueXdheQorICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7CisgICAgICAgICAgICAgIGlmIChidWZmZXJbaV0gPT0gMHhmZmZmKSB7CisgICAgICAgICAgICAgICAgYnVmZmVyW2ldID0gMHgyMDBiOyAvLyB6ZXJvLXdpZHRoLXNwYWNlIGZvciBza2lhCisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdpZHRocyA9IHBhaW50LT5nZXRUZXh0V2lkdGhzKGJ1ZmZlciwgY291bnQgPDwgMSwgc2NhbGFyQXJyYXkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgd2lkdGhzID0gcGFpbnQtPmdldFRleHRXaWR0aHModGV4dCArIHN0YXJ0LCBjb3VudCA8PCAxLCBzY2FsYXJBcnJheSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAod2lkdGhzIDwgY291bnQpIHsKKyAgICAgICAgICAgIC8vIFNraWEgb3BlcmF0ZXMgb24gY29kZSBwb2ludHMsIG5vdCBjb2RlIHVuaXRzLCBzbyBzdXJyb2dhdGUgcGFpcnMgcmV0dXJuIG9ubHkgb25lCisgICAgICAgICAgICAvLyB2YWx1ZS4gRXhwYW5kIHRoZSByZXN1bHQgc28gd2UgaGF2ZSBvbmUgdmFsdWUgcGVyIFVURi0xNiBjb2RlIHVuaXQuCisKKyAgICAgICAgICAgIC8vIE5vdGUsIHNraWEncyBnZXRUZXh0V2lkdGggZ2V0cyBjb25mdXNlZCBpZiBpdCBlbmNvdW50ZXJzIGEgc3Vycm9nYXRlIHBhaXIsCisgICAgICAgICAgICAvLyBsZWF2aW5nIHRoZSByZW1haW5pbmcgd2lkdGhzIHplcm8uICBOb3QgbmljZS4KKyAgICAgICAgICAgIGNvbnN0IGpjaGFyICpjaGFycyA9IHRleHQgKyBzdGFydDsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSBjb3VudCwgcCA9IHdpZHRocyAtIDE7IC0taSA+IHA7KSB7CisgICAgICAgICAgICAgICAgaWYgKGNoYXJzW2ldID49IDB4ZGMwMCAmJiBjaGFyc1tpXSA8IDB4ZTAwMCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnNbaS0xXSA+PSAweGQ4MDAgJiYgY2hhcnNbaS0xXSA8IDB4ZGMwMCkgeworICAgICAgICAgICAgICAgICAgICBzY2FsYXJBcnJheVtpXSA9IDA7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgIHNjYWxhckFycmF5W2ldID0gc2NhbGFyQXJyYXlbLS1wXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBqaW50IHBvcyA9IG9mZnNldCAtIHN0YXJ0OworICAgICAgICBzd2l0Y2ggKG9wdCkgeworICAgICAgICBjYXNlIEFGVEVSOgorICAgICAgICAgIGlmIChwb3MgPCBjb3VudCkgeworICAgICAgICAgICAgcG9zICs9IDE7CisgICAgICAgICAgfQorICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaAorICAgICAgICBjYXNlIEFUX09SX0FGVEVSOgorICAgICAgICAgIHdoaWxlIChwb3MgPCBjb3VudCAmJiBzY2FsYXJBcnJheVtwb3NdID09IDApIHsKKyAgICAgICAgICAgICsrcG9zOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCRUZPUkU6CisgICAgICAgICAgaWYgKHBvcyA+IDApIHsKKyAgICAgICAgICAgIC0tcG9zOworICAgICAgICAgIH0KKyAgICAgICAgICAvLyBmYWxsIHRocm91Z2gKKyAgICAgICAgY2FzZSBBVF9PUl9CRUZPUkU6CisgICAgICAgICAgd2hpbGUgKHBvcyA+IDAgJiYgc2NhbGFyQXJyYXlbcG9zXSA9PSAwKSB7CisgICAgICAgICAgICAtLXBvczsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVQ6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgaWYgKHNjYWxhckFycmF5W3Bvc10gPT0gMCkgeworICAgICAgICAgICAgcG9zID0gLTE7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBvcyAhPSAtMSkgeworICAgICAgICAgIHBvcyArPSBzdGFydDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBwb3M7CisgICAgfQorCisgICAgc3RhdGljIGppbnQgZ2V0VGV4dFJ1bkN1cnNvcl9fX0MoSk5JRW52KiBlbnYsIGpvYmplY3QgY2xhenosIFNrUGFpbnQqIHBhaW50LCBqY2hhckFycmF5IHRleHQsCisgICAgICAgICAgICBqaW50IGNvbnRleHRTdGFydCwgamludCBjb250ZXh0Q291bnQsIGppbnQgZmxhZ3MsIGppbnQgb2Zmc2V0LCBqaW50IGN1cnNvck9wdCkgeworICAgICAgICBqY2hhciogdGV4dEFycmF5ID0gZW52LT5HZXRDaGFyQXJyYXlFbGVtZW50cyh0ZXh0LCBOVUxMKTsKKyAgICAgICAgamludCByZXN1bHQgPSBkb1RleHRSdW5DdXJzb3IoZW52LCBwYWludCwgdGV4dEFycmF5LCBjb250ZXh0U3RhcnQsIGNvbnRleHRDb3VudCwgZmxhZ3MsCisgICAgICAgICAgICAgICAgb2Zmc2V0LCBjdXJzb3JPcHQpOworICAgICAgICBlbnYtPlJlbGVhc2VDaGFyQXJyYXlFbGVtZW50cyh0ZXh0LCB0ZXh0QXJyYXksIEpOSV9BQk9SVCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgc3RhdGljIGppbnQgZ2V0VGV4dFJ1bkN1cnNvcl9fU3RyaW5nKEpOSUVudiogZW52LCBqb2JqZWN0IGNsYXp6LCBTa1BhaW50KiBwYWludCwganN0cmluZyB0ZXh0LAorICAgICAgICAgICAgamludCBjb250ZXh0U3RhcnQsIGppbnQgY29udGV4dEVuZCwgamludCBmbGFncywgamludCBvZmZzZXQsIGppbnQgY3Vyc29yT3B0KSB7CisgICAgICAgIGNvbnN0IGpjaGFyKiB0ZXh0QXJyYXkgPSBlbnYtPkdldFN0cmluZ0NoYXJzKHRleHQsIE5VTEwpOworICAgICAgICBqaW50IHJlc3VsdCA9IGRvVGV4dFJ1bkN1cnNvcihlbnYsIHBhaW50LCB0ZXh0QXJyYXksIGNvbnRleHRTdGFydCwKKyAgICAgICAgICAgICAgICBjb250ZXh0RW5kIC0gY29udGV4dFN0YXJ0LCBmbGFncywgb2Zmc2V0LCBjdXJzb3JPcHQpOworICAgICAgICBlbnYtPlJlbGVhc2VTdHJpbmdDaGFycyh0ZXh0LCB0ZXh0QXJyYXkpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHN0YXRpYyB2b2lkIGdldFRleHRQYXRoKEpOSUVudiogZW52LCBTa1BhaW50KiBwYWludCwgY29uc3QgamNoYXIqIHRleHQsIGppbnQgY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgamludCBiaWRpRmxhZ3MsIGpmbG9hdCB4LCBqZmxvYXQgeSwgU2tQYXRoICpwYXRoKSB7CisgICAgICAgIFRleHRMYXlvdXQ6OmdldFRleHRQYXRoKHBhaW50LCB0ZXh0LCBjb3VudCwgYmlkaUZsYWdzLCB4LCB5LCBwYXRoKTsKKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCBnZXRUZXh0UGF0aF9fX0MoSk5JRW52KiBlbnYsIGpvYmplY3QgY2xhenosIFNrUGFpbnQqIHBhaW50LCBqaW50IGJpZGlGbGFncywKKyAgICAgICAgICAgIGpjaGFyQXJyYXkgdGV4dCwgaW50IGluZGV4LCBpbnQgY291bnQsIGpmbG9hdCB4LCBqZmxvYXQgeSwgU2tQYXRoKiBwYXRoKSB7CisgICAgICAgIGNvbnN0IGpjaGFyKiB0ZXh0QXJyYXkgPSBlbnYtPkdldENoYXJBcnJheUVsZW1lbnRzKHRleHQsIE5VTEwpOworICAgICAgICBnZXRUZXh0UGF0aChlbnYsIHBhaW50LCB0ZXh0QXJyYXkgKyBpbmRleCwgY291bnQsIGJpZGlGbGFncywgeCwgeSwgcGF0aCk7CisgICAgICAgIGVudi0+UmVsZWFzZUNoYXJBcnJheUVsZW1lbnRzKHRleHQsIGNvbnN0X2Nhc3Q8amNoYXIqPih0ZXh0QXJyYXkpLCBKTklfQUJPUlQpOworICAgIH0KKworICAgIHN0YXRpYyB2b2lkIGdldFRleHRQYXRoX19TdHJpbmcoSk5JRW52KiBlbnYsIGpvYmplY3QgY2xhenosIFNrUGFpbnQqIHBhaW50LCBqaW50IGJpZGlGbGFncywKKyAgICAgICAgICAgIGpzdHJpbmcgdGV4dCwgaW50IHN0YXJ0LCBpbnQgZW5kLCBqZmxvYXQgeCwgamZsb2F0IHksIFNrUGF0aCogcGF0aCkgeworICAgICAgICBjb25zdCBqY2hhciogdGV4dEFycmF5ID0gZW52LT5HZXRTdHJpbmdDaGFycyh0ZXh0LCBOVUxMKTsKKyAgICAgICAgZ2V0VGV4dFBhdGgoZW52LCBwYWludCwgdGV4dEFycmF5ICsgc3RhcnQsIGVuZCAtIHN0YXJ0LCBiaWRpRmxhZ3MsIHgsIHksIHBhdGgpOwogICAgICAgICBlbnYtPlJlbGVhc2VTdHJpbmdDaGFycyh0ZXh0LCB0ZXh0QXJyYXkpOwogICAgIH0KLSAKKwogICAgIHN0YXRpYyB2b2lkIHNldFNoYWRvd0xheWVyKEpOSUVudiogZW52LCBqb2JqZWN0IGpwYWludCwgamZsb2F0IHJhZGl1cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqZmxvYXQgZHgsIGpmbG9hdCBkeSwgaW50IGNvbG9yKSB7CiAgICAgICAgIE5QRV9DSEVDS19SRVRVUk5fVk9JRChlbnYsIGpwYWludCk7CkBAIC01NzYsMTMgKzcyNSwyMCBAQAogICAgIHsibmF0aXZlX2JyZWFrVGV4dCIsIihMamF2YS9sYW5nL1N0cmluZztaRltGKUkiLCAodm9pZCopIFNrUGFpbnRHbHVlOjpicmVha1RleHRTfSwKICAgICB7Im5hdGl2ZV9nZXRUZXh0V2lkdGhzIiwiKElbQ0lJW0YpSSIsICh2b2lkKikgU2tQYWludEdsdWU6OmdldFRleHRXaWR0aHNfX19DSUlfRn0sCiAgICAgeyJuYXRpdmVfZ2V0VGV4dFdpZHRocyIsIihJTGphdmEvbGFuZy9TdHJpbmc7SUlbRilJIiwgKHZvaWQqKSBTa1BhaW50R2x1ZTo6Z2V0VGV4dFdpZHRoc19fU3RyaW5nSUlfRn0sCi0gICAgeyJuYXRpdmVfZ2V0VGV4dFBhdGgiLCIoSVtDSUlGRkkpViIsICh2b2lkKikgU2tQYWludEdsdWU6OmdldFRleHRQYXRoX19fQ0lJRkZQYXRofSwKLSAgICB7Im5hdGl2ZV9nZXRUZXh0UGF0aCIsIihJTGphdmEvbGFuZy9TdHJpbmc7SUlGRkkpViIsICh2b2lkKikgU2tQYWludEdsdWU6OmdldFRleHRQYXRoX19TdHJpbmdJSUZGUGF0aH0sCisgICAgeyJuYXRpdmVfZ2V0VGV4dFJ1bkFkdmFuY2VzIiwiKElbQ0lJSUlJW0ZJKUYiLCAodm9pZCopCisgICAgICAgIFNrUGFpbnRHbHVlOjpnZXRUZXh0UnVuQWR2YW5jZXNfX19DSUlJSUlfRkl9LAorICAgIHsibmF0aXZlX2dldFRleHRSdW5BZHZhbmNlcyIsIihJTGphdmEvbGFuZy9TdHJpbmc7SUlJSUlbRkkpRiIsCisgICAgICAgICh2b2lkKikgU2tQYWludEdsdWU6OmdldFRleHRSdW5BZHZhbmNlc19fU3RyaW5nSUlJSUlfRkl9LAorICAgIHsibmF0aXZlX2dldFRleHRSdW5DdXJzb3IiLCAiKElbQ0lJSUlJKUkiLCAodm9pZCopIFNrUGFpbnRHbHVlOjpnZXRUZXh0UnVuQ3Vyc29yX19fQ30sCisgICAgeyJuYXRpdmVfZ2V0VGV4dFJ1bkN1cnNvciIsICIoSUxqYXZhL2xhbmcvU3RyaW5nO0lJSUlJKUkiLAorICAgICAgICAodm9pZCopIFNrUGFpbnRHbHVlOjpnZXRUZXh0UnVuQ3Vyc29yX19TdHJpbmd9LAorICAgIHsibmF0aXZlX2dldFRleHRQYXRoIiwiKElJW0NJSUZGSSlWIiwgKHZvaWQqKSBTa1BhaW50R2x1ZTo6Z2V0VGV4dFBhdGhfX19DfSwKKyAgICB7Im5hdGl2ZV9nZXRUZXh0UGF0aCIsIihJSUxqYXZhL2xhbmcvU3RyaW5nO0lJRkZJKVYiLCAodm9pZCopIFNrUGFpbnRHbHVlOjpnZXRUZXh0UGF0aF9fU3RyaW5nfSwKICAgICB7Im5hdGl2ZUdldFN0cmluZ0JvdW5kcyIsICIoSUxqYXZhL2xhbmcvU3RyaW5nO0lJTGFuZHJvaWQvZ3JhcGhpY3MvUmVjdDspViIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKSBTa1BhaW50R2x1ZTo6Z2V0U3RyaW5nQm91bmRzIH0sCiAgICAgeyJuYXRpdmVHZXRDaGFyQXJyYXlCb3VuZHMiLCAiKElbQ0lJTGFuZHJvaWQvZ3JhcGhpY3MvUmVjdDspViIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopIFNrUGFpbnRHbHVlOjpnZXRDaGFyQXJyYXlCb3VuZHMgfSwKLSAgICB7InNldFNoYWRvd0xheWVyIiwgIihGRkZJKVYiLCAodm9pZCopU2tQYWludEdsdWU6OnNldFNoYWRvd0xheWVyfQorICAgIHsiblNldFNoYWRvd0xheWVyIiwgIihGRkZJKVYiLCAodm9pZCopU2tQYWludEdsdWU6OnNldFNoYWRvd0xheWVyfQogfTsKIAogc3RhdGljIGpmaWVsZElEIHJlcV9maWVsZElEKGpmaWVsZElEIGlkKSB7CmRpZmYgLS1naXQgYS9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL1NoYWRlci5jcHAgYi9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL1NoYWRlci5jcHAKaW5kZXggYjA5YzYyYi4uY2IxYzMzMyAxMDA2NDQKLS0tIGEvY29yZS9qbmkvYW5kcm9pZC9ncmFwaGljcy9TaGFkZXIuY3BwCisrKyBiL2NvcmUvam5pL2FuZHJvaWQvZ3JhcGhpY3MvU2hhZGVyLmNwcApAQCAtOCw2ICs4LDE1IEBACiAjaW5jbHVkZSAiU2tUZW1wbGF0ZXMuaCIKICNpbmNsdWRlICJTa1hmZXJtb2RlLmgiCiAKKyNpbmNsdWRlIDxTa2lhU2hhZGVyLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjp1aXJlbmRlcmVyOworCitzdGF0aWMgc3RydWN0IHsKKyAgICBqY2xhc3MgY2xheno7CisgICAgamZpZWxkSUQgc2hhZGVyOworfSBnU2hhZGVyQ2xhc3NJbmZvOworCiBzdGF0aWMgdm9pZCBUaHJvd0lBRV9JZk51bGwoSk5JRW52KiBlbnYsIHZvaWQqIHB0cikgewogICAgIGlmIChOVUxMID09IHB0cikgewogICAgICAgICBkb1Rocm93SUFFKGVudik7CkBAIC00MSw4ICs1MCw5IEBACiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKLXN0YXRpYyB2b2lkIFNoYWRlcl9kZXN0cnVjdG9yKEpOSUVudiogZW52LCBqb2JqZWN0LCBTa1NoYWRlciogc2hhZGVyKQorc3RhdGljIHZvaWQgU2hhZGVyX2Rlc3RydWN0b3IoSk5JRW52KiBlbnYsIGpvYmplY3QgbywgU2tTaGFkZXIqIHNoYWRlciwgU2tpYVNoYWRlciogc2tpYVNoYWRlcikKIHsKKyAgICBkZWxldGUgc2tpYVNoYWRlcjsKICAgICBzaGFkZXItPnNhZmVVbnJlZigpOwogfQogCkBAIC01MSw3ICs2MSw4IEBACiAgICAgcmV0dXJuIHNoYWRlciA/IHNoYWRlci0+Z2V0TG9jYWxNYXRyaXgobWF0cml4KSA6IGZhbHNlOwogfQogIAotc3RhdGljIHZvaWQgU2hhZGVyX3NldExvY2FsTWF0cml4KEpOSUVudiogZW52LCBqb2JqZWN0LCBTa1NoYWRlciogc2hhZGVyLCBjb25zdCBTa01hdHJpeCogbWF0cml4KQorc3RhdGljIHZvaWQgU2hhZGVyX3NldExvY2FsTWF0cml4KEpOSUVudiogZW52LCBqb2JqZWN0IG8sIFNrU2hhZGVyKiBzaGFkZXIsIFNraWFTaGFkZXIqIHNraWFTaGFkZXIsCisgICAgICAgIGNvbnN0IFNrTWF0cml4KiBtYXRyaXgpCiB7CiAgICAgaWYgKHNoYWRlcikgewogICAgICAgICBpZiAoTlVMTCA9PSBtYXRyaXgpIHsKQEAgLTYwLDI0ICs3MSw0MCBAQAogICAgICAgICBlbHNlIHsKICAgICAgICAgICAgIHNoYWRlci0+c2V0TG9jYWxNYXRyaXgoKm1hdHJpeCk7CiAgICAgICAgIH0KKyNpZmRlZiBVU0VfT1BFTkdMX1JFTkRFUkVSCisgICAgICAgIHNraWFTaGFkZXItPnNldE1hdHJpeChjb25zdF9jYXN0PFNrTWF0cml4Kj4obWF0cml4KSk7CisjZW5kaWYKICAgICB9CiB9CiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKLXN0YXRpYyBTa1NoYWRlciogQml0bWFwU2hhZGVyX2NvbnN0cnVjdG9yKEpOSUVudiogZW52LCBqb2JqZWN0LCBjb25zdCBTa0JpdG1hcCogYml0bWFwLAorc3RhdGljIFNrU2hhZGVyKiBCaXRtYXBTaGFkZXJfY29uc3RydWN0b3IoSk5JRW52KiBlbnYsIGpvYmplY3QgbywgY29uc3QgU2tCaXRtYXAqIGJpdG1hcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aWxlTW9kZVgsIGludCB0aWxlTW9kZVkpCiB7CiAgICAgU2tTaGFkZXIqIHMgPSBTa1NoYWRlcjo6Q3JlYXRlQml0bWFwU2hhZGVyKCpiaXRtYXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFNrU2hhZGVyOjpUaWxlTW9kZSl0aWxlTW9kZVgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFNrU2hhZGVyOjpUaWxlTW9kZSl0aWxlTW9kZVkpOworCiAgICAgVGhyb3dJQUVfSWZOdWxsKGVudiwgcyk7CiAgICAgcmV0dXJuIHM7CiB9CisKK3N0YXRpYyBTa2lhU2hhZGVyKiBCaXRtYXBTaGFkZXJfcG9zdENvbnN0cnVjdG9yKEpOSUVudiogZW52LCBqb2JqZWN0IG8sIFNrU2hhZGVyKiBzaGFkZXIsCisgICAgICAgIFNrQml0bWFwKiBiaXRtYXAsIGludCB0aWxlTW9kZVgsIGludCB0aWxlTW9kZVkpIHsKKyNpZmRlZiBVU0VfT1BFTkdMX1JFTkRFUkVSCisgICAgU2tpYVNoYWRlciogc2tpYVNoYWRlciA9IG5ldyBTa2lhQml0bWFwU2hhZGVyKGJpdG1hcCwgc2hhZGVyLAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8U2tTaGFkZXI6OlRpbGVNb2RlPih0aWxlTW9kZVgpLCBzdGF0aWNfY2FzdDxTa1NoYWRlcjo6VGlsZU1vZGU+KHRpbGVNb2RlWSksCisgICAgICAgICAgICBOVUxMLCAoc2hhZGVyLT5nZXRGbGFncygpICYgU2tTaGFkZXI6OmtPcGFxdWVBbHBoYV9GbGFnKSA9PSAwKTsKKyAgICByZXR1cm4gc2tpYVNoYWRlcjsKKyNlbHNlCisgICAgcmV0dXJuIE5VTEw7CisjZW5kaWYKK30KICAgICAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKLXN0YXRpYyBTa1NoYWRlciogTGluZWFyR3JhZGllbnRfY3JlYXRlMShKTklFbnYqIGVudiwgam9iamVjdCwKK3N0YXRpYyBTa1NoYWRlciogTGluZWFyR3JhZGllbnRfY3JlYXRlMShKTklFbnYqIGVudiwgam9iamVjdCBvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHgwLCBmbG9hdCB5MCwgZmxvYXQgeDEsIGZsb2F0IHkxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGppbnRBcnJheSBjb2xvckFycmF5LCBqZmxvYXRBcnJheSBwb3NBcnJheSwgaW50IHRpbGVNb2RlKQogewpAQCAtODUsMzEgKzExMiw5NSBAQAogICAgIHB0c1swXS5zZXQoU2tGbG9hdFRvU2NhbGFyKHgwKSwgU2tGbG9hdFRvU2NhbGFyKHkwKSk7CiAgICAgcHRzWzFdLnNldChTa0Zsb2F0VG9TY2FsYXIoeDEpLCBTa0Zsb2F0VG9TY2FsYXIoeTEpKTsKIAotICAgIHNpemVfdCAgICAgIGNvdW50ID0gZW52LT5HZXRBcnJheUxlbmd0aChjb2xvckFycmF5KTsKKyAgICBzaXplX3QgY291bnQgPSBlbnYtPkdldEFycmF5TGVuZ3RoKGNvbG9yQXJyYXkpOwogICAgIGNvbnN0IGppbnQqIGNvbG9yVmFsdWVzID0gZW52LT5HZXRJbnRBcnJheUVsZW1lbnRzKGNvbG9yQXJyYXksIE5VTEwpOwogCiAgICAgU2tBdXRvU1RNYWxsb2M8OCwgU2tTY2FsYXI+IHN0b3JhZ2UocG9zQXJyYXkgPyBjb3VudCA6IDApOwogICAgIFNrU2NhbGFyKiAgICAgICAgICAgICAgICAgICBwb3MgPSBOVUxMOwotICAgIAorCiAgICAgaWYgKHBvc0FycmF5KSB7CiAgICAgICAgIEF1dG9KYXZhRmxvYXRBcnJheSBhdXRvUG9zKGVudiwgcG9zQXJyYXksIGNvdW50KTsKICAgICAgICAgY29uc3QgZmxvYXQqIHBvc1ZhbHVlcyA9IGF1dG9Qb3MucHRyKCk7CiAgICAgICAgIHBvcyA9IChTa1NjYWxhciopc3RvcmFnZS5nZXQoKTsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKICAgICAgICAgICAgIHBvc1tpXSA9IFNrRmxvYXRUb1NjYWxhcihwb3NWYWx1ZXNbaV0pOworICAgICAgICB9CiAgICAgfQotCisgICAgCiAgICAgU2tTaGFkZXIqIHNoYWRlciA9IFNrR3JhZGllbnRTaGFkZXI6OkNyZWF0ZUxpbmVhcihwdHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgU2tDb2xvcio+KGNvbG9yVmFsdWVzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zLCBjb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8U2tTaGFkZXI6OlRpbGVNb2RlPih0aWxlTW9kZSkpOwotICAgIGVudi0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoY29sb3JBcnJheSwgY29uc3RfY2FzdDxqaW50Kj4oY29sb3JWYWx1ZXMpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSk5JX0FCT1JUKTsKKworICAgIGVudi0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoY29sb3JBcnJheSwgY29uc3RfY2FzdDxqaW50Kj4oY29sb3JWYWx1ZXMpLCBKTklfQUJPUlQpOwogICAgIFRocm93SUFFX0lmTnVsbChlbnYsIHNoYWRlcik7CiAgICAgcmV0dXJuIHNoYWRlcjsKIH0KIAotc3RhdGljIFNrU2hhZGVyKiBMaW5lYXJHcmFkaWVudF9jcmVhdGUyKEpOSUVudiogZW52LCBqb2JqZWN0LAorc3RhdGljIFNraWFTaGFkZXIqIExpbmVhckdyYWRpZW50X3Bvc3RDcmVhdGUxKEpOSUVudiogZW52LCBqb2JqZWN0IG8sIFNrU2hhZGVyKiBzaGFkZXIsCisgICAgICAgIGZsb2F0IHgwLCBmbG9hdCB5MCwgZmxvYXQgeDEsIGZsb2F0IHkxLCBqaW50QXJyYXkgY29sb3JBcnJheSwKKyAgICAgICAgamZsb2F0QXJyYXkgcG9zQXJyYXksIGludCB0aWxlTW9kZSkgeworI2lmZGVmIFVTRV9PUEVOR0xfUkVOREVSRVIKKyAgICBzaXplX3QgY291bnQgPSBlbnYtPkdldEFycmF5TGVuZ3RoKGNvbG9yQXJyYXkpOworICAgIGNvbnN0IGppbnQqIGNvbG9yVmFsdWVzID0gZW52LT5HZXRJbnRBcnJheUVsZW1lbnRzKGNvbG9yQXJyYXksIE5VTEwpOworCisgICAgamZsb2F0KiBzdG9yZWRCb3VuZHMgPSBuZXcgamZsb2F0WzRdOworICAgIHN0b3JlZEJvdW5kc1swXSA9IHgwOyBzdG9yZWRCb3VuZHNbMV0gPSB5MDsKKyAgICBzdG9yZWRCb3VuZHNbMl0gPSB4MTsgc3RvcmVkQm91bmRzWzNdID0geTE7CisgICAgamZsb2F0KiBzdG9yZWRQb3NpdGlvbnMgPSBuZXcgamZsb2F0W2NvdW50XTsKKyAgICB1aW50MzJfdCogc3RvcmVkQ29sb3JzID0gbmV3IHVpbnQzMl90W2NvdW50XTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgc3RvcmVkQ29sb3JzW2ldID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGNvbG9yVmFsdWVzW2ldKTsKKyAgICB9CisKKyAgICBpZiAocG9zQXJyYXkpIHsKKyAgICAgICAgQXV0b0phdmFGbG9hdEFycmF5IGF1dG9Qb3MoZW52LCBwb3NBcnJheSwgY291bnQpOworICAgICAgICBjb25zdCBmbG9hdCogcG9zVmFsdWVzID0gYXV0b1Bvcy5wdHIoKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICBzdG9yZWRQb3NpdGlvbnNbaV0gPSBwb3NWYWx1ZXNbaV07CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBzdG9yZWRQb3NpdGlvbnNbMF0gPSAwLjBmOworICAgICAgICBzdG9yZWRQb3NpdGlvbnNbMV0gPSAxLjBmOworICAgIH0KKworICAgIFNraWFTaGFkZXIqIHNraWFTaGFkZXIgPSBuZXcgU2tpYUxpbmVhckdyYWRpZW50U2hhZGVyKHN0b3JlZEJvdW5kcywgc3RvcmVkQ29sb3JzLAorICAgICAgICAgICAgc3RvcmVkUG9zaXRpb25zLCBjb3VudCwgc2hhZGVyLCBzdGF0aWNfY2FzdDxTa1NoYWRlcjo6VGlsZU1vZGU+KHRpbGVNb2RlKSwgTlVMTCwKKyAgICAgICAgICAgIChzaGFkZXItPmdldEZsYWdzKCkgJiBTa1NoYWRlcjo6a09wYXF1ZUFscGhhX0ZsYWcpID09IDApOworCisgICAgZW52LT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhjb2xvckFycmF5LCBjb25zdF9jYXN0PGppbnQqPihjb2xvclZhbHVlcyksIEpOSV9BQk9SVCk7CisgICAgcmV0dXJuIHNraWFTaGFkZXI7CisjZWxzZQorICAgIHJldHVybiBOVUxMOworI2VuZGlmCit9CisKK3N0YXRpYyBTa2lhU2hhZGVyKiBMaW5lYXJHcmFkaWVudF9wb3N0Q3JlYXRlMihKTklFbnYqIGVudiwgam9iamVjdCBvLCBTa1NoYWRlciogc2hhZGVyLAorICAgICAgICBmbG9hdCB4MCwgZmxvYXQgeTAsIGZsb2F0IHgxLCBmbG9hdCB5MSwgaW50IGNvbG9yMCwgaW50IGNvbG9yMSwgaW50IHRpbGVNb2RlKSB7CisjaWZkZWYgVVNFX09QRU5HTF9SRU5ERVJFUgorICAgIGZsb2F0KiBzdG9yZWRCb3VuZHMgPSBuZXcgZmxvYXRbNF07CisgICAgc3RvcmVkQm91bmRzWzBdID0geDA7IHN0b3JlZEJvdW5kc1sxXSA9IHkwOworICAgIHN0b3JlZEJvdW5kc1syXSA9IHgxOyBzdG9yZWRCb3VuZHNbM10gPSB5MTsKKworICAgIGZsb2F0KiBzdG9yZWRQb3NpdGlvbnMgPSBuZXcgZmxvYXRbMl07CisgICAgc3RvcmVkUG9zaXRpb25zWzBdID0gMC4wZjsKKyAgICBzdG9yZWRQb3NpdGlvbnNbMV0gPSAxLjBmOworCisgICAgdWludDMyX3QqIHN0b3JlZENvbG9ycyA9IG5ldyB1aW50MzJfdFsyXTsKKyAgICBzdG9yZWRDb2xvcnNbMF0gPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oY29sb3IwKTsKKyAgICBzdG9yZWRDb2xvcnNbMV0gPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oY29sb3IxKTsKKworICAgIFNraWFTaGFkZXIqIHNraWFTaGFkZXIgPSBuZXcgU2tpYUxpbmVhckdyYWRpZW50U2hhZGVyKHN0b3JlZEJvdW5kcywgc3RvcmVkQ29sb3JzLAorICAgICAgICAgICAgc3RvcmVkUG9zaXRpb25zLCAyLCBzaGFkZXIsIHN0YXRpY19jYXN0PFNrU2hhZGVyOjpUaWxlTW9kZT4odGlsZU1vZGUpLCBOVUxMLAorICAgICAgICAgICAgKHNoYWRlci0+Z2V0RmxhZ3MoKSAmIFNrU2hhZGVyOjprT3BhcXVlQWxwaGFfRmxhZykgPT0gMCk7CisKKyAgICByZXR1cm4gc2tpYVNoYWRlcjsKKyNlbHNlCisgICAgcmV0dXJuIE5VTEw7CisjZW5kaWYKK30KKworc3RhdGljIFNrU2hhZGVyKiBMaW5lYXJHcmFkaWVudF9jcmVhdGUyKEpOSUVudiogZW52LCBqb2JqZWN0IG8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeDAsIGZsb2F0IHkwLCBmbG9hdCB4MSwgZmxvYXQgeTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvbG9yMCwgaW50IGNvbG9yMSwgaW50IHRpbGVNb2RlKQogewpAQCAtMTIwLDggKzIxMSw5IEBACiAgICAgU2tDb2xvciBjb2xvcnNbMl07CiAgICAgY29sb3JzWzBdID0gY29sb3IwOwogICAgIGNvbG9yc1sxXSA9IGNvbG9yMTsKLQorICAgIAogICAgIFNrU2hhZGVyKiBzID0gU2tHcmFkaWVudFNoYWRlcjo6Q3JlYXRlTGluZWFyKHB0cywgY29sb3JzLCBOVUxMLCAyLCAoU2tTaGFkZXI6OlRpbGVNb2RlKXRpbGVNb2RlKTsKKwogICAgIFRocm93SUFFX0lmTnVsbChlbnYsIHMpOwogICAgIHJldHVybiBzOwogfQpAQCAtMjIyLDE4ICszMTQsNDIgQEAKIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAotc3RhdGljIFNrU2hhZGVyKiBDb21wb3NlU2hhZGVyX2NyZWF0ZTEoSk5JRW52KiBlbnYsIGpvYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTa1NoYWRlciogc2hhZGVyQSwgU2tTaGFkZXIqIHNoYWRlckIsIFNrWGZlcm1vZGUqIG1vZGUpCitzdGF0aWMgU2tTaGFkZXIqIENvbXBvc2VTaGFkZXJfY3JlYXRlMShKTklFbnYqIGVudiwgam9iamVjdCBvLAorICAgICAgICBTa1NoYWRlciogc2hhZGVyQSwgU2tTaGFkZXIqIHNoYWRlckIsIFNrWGZlcm1vZGUqIG1vZGUpCiB7CiAgICAgcmV0dXJuIG5ldyBTa0NvbXBvc2VTaGFkZXIoc2hhZGVyQSwgc2hhZGVyQiwgbW9kZSk7CiB9CiAKLXN0YXRpYyBTa1NoYWRlciogQ29tcG9zZVNoYWRlcl9jcmVhdGUyKEpOSUVudiogZW52LCBqb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2tTaGFkZXIqIHNoYWRlckEsIFNrU2hhZGVyKiBzaGFkZXJCLCBTa1BvcnRlckR1ZmY6Ok1vZGUgbW9kZSkKK3N0YXRpYyBTa1NoYWRlciogQ29tcG9zZVNoYWRlcl9jcmVhdGUyKEpOSUVudiogZW52LCBqb2JqZWN0IG8sCisgICAgICAgIFNrU2hhZGVyKiBzaGFkZXJBLCBTa1NoYWRlciogc2hhZGVyQiwgU2tQb3J0ZXJEdWZmOjpNb2RlIHBvcnRlckR1ZmZNb2RlKQogewotICAgIFNrQXV0b1VucmVmIGF1KFNrUG9ydGVyRHVmZjo6Q3JlYXRlWGZlcm1vZGUobW9kZSkpOworICAgIFNrQXV0b1VucmVmIGF1KFNrUG9ydGVyRHVmZjo6Q3JlYXRlWGZlcm1vZGUocG9ydGVyRHVmZk1vZGUpKTsKKyAgICBTa1hmZXJtb2RlKiBtb2RlID0gKFNrWGZlcm1vZGUqKSBhdS5nZXQoKTsKKyAgICByZXR1cm4gbmV3IFNrQ29tcG9zZVNoYWRlcihzaGFkZXJBLCBzaGFkZXJCLCBtb2RlKTsKK30KIAotICAgIHJldHVybiBuZXcgU2tDb21wb3NlU2hhZGVyKHNoYWRlckEsIHNoYWRlckIsIChTa1hmZXJtb2RlKilhdS5nZXQoKSk7CitzdGF0aWMgU2tpYVNoYWRlciogQ29tcG9zZVNoYWRlcl9wb3N0Q3JlYXRlMihKTklFbnYqIGVudiwgam9iamVjdCBvLCBTa1NoYWRlciogc2hhZGVyLAorICAgICAgICBTa2lhU2hhZGVyKiBzaGFkZXJBLCBTa2lhU2hhZGVyKiBzaGFkZXJCLCBTa1BvcnRlckR1ZmY6Ok1vZGUgcG9ydGVyRHVmZk1vZGUpIHsKKyNpZmRlZiBVU0VfT1BFTkdMX1JFTkRFUkVSCisgICAgU2tYZmVybW9kZTo6TW9kZSBtb2RlID0gU2tQb3J0ZXJEdWZmOjpUb1hmZXJtb2RlTW9kZShwb3J0ZXJEdWZmTW9kZSk7CisgICAgcmV0dXJuIG5ldyBTa2lhQ29tcG9zZVNoYWRlcihzaGFkZXJBLCBzaGFkZXJCLCBtb2RlLCBzaGFkZXIpOworI2Vsc2UKKyAgICByZXR1cm4gTlVMTDsKKyNlbmRpZgorfQorCitzdGF0aWMgU2tpYVNoYWRlciogQ29tcG9zZVNoYWRlcl9wb3N0Q3JlYXRlMShKTklFbnYqIGVudiwgam9iamVjdCBvLCBTa1NoYWRlciogc2hhZGVyLAorICAgICAgICBTa2lhU2hhZGVyKiBzaGFkZXJBLCBTa2lhU2hhZGVyKiBzaGFkZXJCLCBTa1hmZXJtb2RlKiBtb2RlKSB7CisjaWZkZWYgVVNFX09QRU5HTF9SRU5ERVJFUgorICAgIFNrWGZlcm1vZGU6Ok1vZGUgc2tpYU1vZGU7CisgICAgaWYgKCFTa1hmZXJtb2RlOjpJc01vZGUobW9kZSwgJnNraWFNb2RlKSkgeworICAgICAgICAvLyBUT0RPOiBTdXBwb3J0IG90aGVyIG1vZGVzCisgICAgICAgIHNraWFNb2RlID0gU2tYZmVybW9kZTo6a1NyY092ZXJfTW9kZTsKKyAgICB9CisgICAgcmV0dXJuIG5ldyBTa2lhQ29tcG9zZVNoYWRlcihzaGFkZXJBLCBzaGFkZXJCLCBza2lhTW9kZSwgc2hhZGVyKTsKKyNlbHNlCisgICAgcmV0dXJuIE5VTEw7CisjZW5kaWYKIH0KIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KQEAgLTI0NCwxOCArMzYwLDIxIEBACiB9OwogCiBzdGF0aWMgSk5JTmF0aXZlTWV0aG9kIGdTaGFkZXJNZXRob2RzW10gPSB7Ci0gICAgeyAibmF0aXZlRGVzdHJ1Y3RvciIsICAgICAgICAiKEkpViIsICAgICAodm9pZCopU2hhZGVyX2Rlc3RydWN0b3IgICAgICAgIH0sCisgICAgeyAibmF0aXZlRGVzdHJ1Y3RvciIsICAgICAgICAiKElJKVYiLCAgICAodm9pZCopU2hhZGVyX2Rlc3RydWN0b3IgICAgICAgIH0sCiAgICAgeyAibmF0aXZlR2V0TG9jYWxNYXRyaXgiLCAgICAiKElJKVoiLCAgICAodm9pZCopU2hhZGVyX2dldExvY2FsTWF0cml4ICAgIH0sCi0gICAgeyAibmF0aXZlU2V0TG9jYWxNYXRyaXgiLCAgICAiKElJKVYiLCAgICAodm9pZCopU2hhZGVyX3NldExvY2FsTWF0cml4ICAgIH0KKyAgICB7ICJuYXRpdmVTZXRMb2NhbE1hdHJpeCIsICAgICIoSUlJKVYiLCAgICh2b2lkKilTaGFkZXJfc2V0TG9jYWxNYXRyaXggICAgfQogfTsKIAogc3RhdGljIEpOSU5hdGl2ZU1ldGhvZCBnQml0bWFwU2hhZGVyTWV0aG9kc1tdID0gewotICAgIHsgIm5hdGl2ZUNyZWF0ZSIsICAgIihJSUkpSSIsICAodm9pZCopQml0bWFwU2hhZGVyX2NvbnN0cnVjdG9yIH0KKyAgICB7ICJuYXRpdmVDcmVhdGUiLCAgICAgIihJSUkpSSIsICAodm9pZCopQml0bWFwU2hhZGVyX2NvbnN0cnVjdG9yIH0sCisgICAgeyAibmF0aXZlUG9zdENyZWF0ZSIsICIoSUlJSSlJIiwgKHZvaWQqKUJpdG1hcFNoYWRlcl9wb3N0Q29uc3RydWN0b3IgfQogfTsKIAogc3RhdGljIEpOSU5hdGl2ZU1ldGhvZCBnTGluZWFyR3JhZGllbnRNZXRob2RzW10gPSB7Ci0gICAgeyAibmF0aXZlQ3JlYXRlMSIsICAiKEZGRkZbSVtGSSlJIiwgKHZvaWQqKUxpbmVhckdyYWRpZW50X2NyZWF0ZTEgICB9LAotICAgIHsgIm5hdGl2ZUNyZWF0ZTIiLCAgIihGRkZGSUlJKUkiLCAgICh2b2lkKilMaW5lYXJHcmFkaWVudF9jcmVhdGUyICAgfQorICAgIHsgIm5hdGl2ZUNyZWF0ZTEiLCAgICAgIihGRkZGW0lbRkkpSSIsICAodm9pZCopTGluZWFyR3JhZGllbnRfY3JlYXRlMSAgICAgfSwKKyAgICB7ICJuYXRpdmVDcmVhdGUyIiwgICAgICIoRkZGRklJSSlJIiwgICAgKHZvaWQqKUxpbmVhckdyYWRpZW50X2NyZWF0ZTIgICAgIH0sCisgICAgeyAibmF0aXZlUG9zdENyZWF0ZTEiLCAiKElGRkZGW0lbRkkpSSIsICh2b2lkKilMaW5lYXJHcmFkaWVudF9wb3N0Q3JlYXRlMSB9LAorICAgIHsgIm5hdGl2ZVBvc3RDcmVhdGUyIiwgIihJRkZGRklJSSlJIiwgICAodm9pZCopTGluZWFyR3JhZGllbnRfcG9zdENyZWF0ZTIgfQogfTsKIAogc3RhdGljIEpOSU5hdGl2ZU1ldGhvZCBnUmFkaWFsR3JhZGllbnRNZXRob2RzW10gPSB7CkBAIC0yNjksOCArMzg4LDEwIEBACiB9OwogCiBzdGF0aWMgSk5JTmF0aXZlTWV0aG9kIGdDb21wb3NlU2hhZGVyTWV0aG9kc1tdID0gewotICAgIHsibmF0aXZlQ3JlYXRlMSIsICAiKElJSSlJIiwgICAgKHZvaWQqKUNvbXBvc2VTaGFkZXJfY3JlYXRlMSB9LAotICAgIHsibmF0aXZlQ3JlYXRlMiIsICAiKElJSSlJIiwgICAgKHZvaWQqKUNvbXBvc2VTaGFkZXJfY3JlYXRlMiB9CisgICAgeyJuYXRpdmVDcmVhdGUxIiwgICAgICAiKElJSSlJIiwgICAodm9pZCopQ29tcG9zZVNoYWRlcl9jcmVhdGUxICAgICB9LAorICAgIHsibmF0aXZlQ3JlYXRlMiIsICAgICAgIihJSUkpSSIsICAgKHZvaWQqKUNvbXBvc2VTaGFkZXJfY3JlYXRlMiAgICAgfSwKKyAgICB7Im5hdGl2ZVBvc3RDcmVhdGUxIiwgICIoSUlJSSlJIiwgICh2b2lkKilDb21wb3NlU2hhZGVyX3Bvc3RDcmVhdGUxIH0sCisgICAgeyJuYXRpdmVQb3N0Q3JlYXRlMiIsICAiKElJSUkpSSIsICAodm9pZCopQ29tcG9zZVNoYWRlcl9wb3N0Q3JlYXRlMiB9CiB9OwogCiAjaW5jbHVkZSA8YW5kcm9pZF9ydW50aW1lL0FuZHJvaWRSdW50aW1lLmg+CmRpZmYgLS1naXQgYS9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL1RleHRMYXlvdXQuY3BwIGIvY29yZS9qbmkvYW5kcm9pZC9ncmFwaGljcy9UZXh0TGF5b3V0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDdlMWZhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qbmkvYW5kcm9pZC9ncmFwaGljcy9UZXh0TGF5b3V0LmNwcApAQCAtMCwwICsxLDM0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJUZXh0TGF5b3V0LmgiCisKKyNpbmNsdWRlIDxhbmRyb2lkX3J1bnRpbWUvQW5kcm9pZFJ1bnRpbWUuaD4KKworI2luY2x1ZGUgIlNrVGVtcGxhdGVzLmgiCisjaW5jbHVkZSAidW5pY29kZS91YmlkaS5oIgorI2luY2x1ZGUgInVuaWNvZGUvdXNoYXBlLmgiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKworbmFtZXNwYWNlIGFuZHJvaWQgeworLy8gUmV0dXJucyB0cnVlIGlmIHdlIG1pZ2h0IG5lZWQgbGF5b3V0LiAgSWYgYmlkaUZsYWdzIGZvcmNlIExUUiwgYXNzdW1lIG5vIGxheW91dCwgaWYKKy8vIGJpZGlGbGFncyBpbmRpY2F0ZSB0aGVyZSBwcm9iYWJseSBpcyBSVEwsIGFzc3VtZSB3ZSBkbywgb3RoZXJ3aXNlIHNjYW4gdGhlIHRleHQKKy8vIGxvb2tpbmcgZm9yIGEgY2hhcmFjdGVyID49IHRoZSBmaXJzdCBSVEwgY2hhcmFjdGVyIGluIHVuaWNvZGUgYW5kIGFzc3VtZSB3ZSBkbyBpZgorLy8gd2UgZmluZCBvbmUuCitib29sIFRleHRMYXlvdXQ6Om5lZWRzTGF5b3V0KGNvbnN0IGpjaGFyKiB0ZXh0LCBqaW50IGxlbiwgamludCBiaWRpRmxhZ3MpIHsKKyAgICBpZiAoYmlkaUZsYWdzID09IGtCaWRpX0ZvcmNlX0xUUikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmICgoYmlkaUZsYWdzID09IGtCaWRpX1JUTCkgfHwgKGJpZGlGbGFncyA9PSBrQmlkaV9EZWZhdWx0X1JUTCkgfHwKKyAgICAgICAgICAgIGJpZGlGbGFncyA9PSBrQmlkaV9Gb3JjZV9SVEwpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyArK2kpIHsKKyAgICAgICAgaWYgKHRleHRbaV0gPj0gMHgwNTkwKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKy8qKgorICogQ2hhcmFjdGVyLWJhc2VkIEFyYWJpYyBzaGFwaW5nLgorICoKKyAqIFdlJ2xsIHVzZSBoYXJmYnV6eiBhbmQgZ2x5cGgtYmFzZWQgc2hhcGluZyBpbnN0ZWFkIG9uY2Ugd2UncmUgc2V0IHVwIGZvciBpdC4KKyAqCisgKiBAY29udGV4dCB0aGUgdGV4dCBjb250ZXh0CisgKiBAc3RhcnQgdGhlIHN0YXJ0IG9mIHRoZSB0ZXh0IHRvIHJlbmRlcgorICogQGNvdW50IHRoZSBsZW5ndGggb2YgdGhlIHRleHQgdG8gcmVuZGVyLCBzdGFydCArIGNvdW50ICBtdXN0IGJlIDw9IGNvbnRleHRDb3VudAorICogQGNvbnRleHRDb3VudCB0aGUgbGVuZ3RoIG9mIHRoZSBjb250ZXh0CisgKiBAc2hhcGVkIHdoZXJlIHRvIHB1dCB0aGUgc2hhcGVkIHRleHQsIG11c3QgaGF2ZSBjYXBhY2l0eSBmb3IgY291bnQgdWNoYXJzCisgKiBAcmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIHNoYXBlZCB0ZXh0LCBvciAtMSBpZiBlcnJvcgorICovCitpbnQgVGV4dExheW91dDo6c2hhcGVSdGxUZXh0KGNvbnN0IGpjaGFyKiBjb250ZXh0LCBqc2l6ZSBzdGFydCwganNpemUgY291bnQsIGpzaXplIGNvbnRleHRDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGpjaGFyKiBzaGFwZWQsIFVFcnJvckNvZGUgJnN0YXR1cykgeworICAgIGpjaGFyIGJ1ZmZlcltjb250ZXh0Q291bnRdOworCisgICAgLy8gVXNlIGZpeGVkIGxlbmd0aCBzaW5jZSB3ZSBuZWVkIHRvIGtlZXAgc3RhcnQgYW5kIGNvdW50IHZhbGlkCisgICAgdV9zaGFwZUFyYWJpYyhjb250ZXh0LCBjb250ZXh0Q291bnQsIGJ1ZmZlciwgY29udGV4dENvdW50LAorICAgICAgICAgICAgICAgICAgIFVfU0hBUEVfTEVOR1RIX0ZJWEVEX1NQQUNFU19ORUFSIHwKKyAgICAgICAgICAgICAgICAgICBVX1NIQVBFX1RFWFRfRElSRUNUSU9OX0xPR0lDQUwgfCBVX1NIQVBFX0xFVFRFUlNfU0hBUEUgfAorICAgICAgICAgICAgICAgICAgIFVfU0hBUEVfWF9MQU1BTEVGX1NVQl9BTFRFUk5BVEUsICZzdGF0dXMpOworCisgICAgaWYgKFVfU1VDQ0VTUyhzdGF0dXMpKSB7CisgICAgICAgIC8vIHRyaW0gb3V0IDB4ZmZmZiBmb2xsb3dpbmcgbGlnYXR1cmVzLCBpZiBhbnkKKyAgICAgICAgaW50IGVuZCA9IDA7CisgICAgICAgIGZvciAoaW50IGkgPSBzdGFydCwgZSA9IHN0YXJ0ICsgY291bnQ7IGkgPCBlOyArK2kpIHsKKyAgICAgICAgICAgIGlmIChidWZmZXJbaV0gIT0gMHhmZmZmKSB7CisgICAgICAgICAgICAgICAgYnVmZmVyW2VuZCsrXSA9IGJ1ZmZlcltpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjb3VudCA9IGVuZDsKKyAgICAgICAgLy8gTE9HKExPR19JTkZPLCAiQ1NSVEwiLCAic3RhcnQgJWQgY291bnQgJWQgY2NvdW50ICVkXG4iLCBzdGFydCwgY291bnQsIGNvbnRleHRDb3VudCk7CisgICAgICAgIHViaWRpX3dyaXRlUmV2ZXJzZShidWZmZXIsIGNvdW50LCBzaGFwZWQsIGNvdW50LCBVQklESV9ET19NSVJST1JJTkcgfCBVQklESV9PVVRQVVRfUkVWRVJTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBVQklESV9LRUVQX0JBU0VfQ09NQklOSU5HLCAmc3RhdHVzKTsKKyAgICAgICAgaWYgKFVfU1VDQ0VTUyhzdGF0dXMpKSB7CisgICAgICAgICAgICByZXR1cm4gY291bnQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gLTE7Cit9CisKKy8qKgorICogQmFzaWMgY2hhcmFjdGVyLWJhc2VkIGxheW91dCBzdXBwb3J0aW5nIHJ0bCBhbmQgYXJhYmljIHNoYXBpbmcuCisgKiBSdW5zIGJpZGkgb24gdGhlIHRleHQgYW5kIGdlbmVyYXRlcyBhIHJlb3JkZXJlZCwgc2hhcGVkIGxpbmUgaW4gYnVmZmVyLCByZXR1cm5pbmcKKyAqIHRoZSBsZW5ndGguCisgKiBAdGV4dCB0aGUgdGV4dAorICogQGxlbiB0aGUgbGVuZ3RoIG9mIHRoZSB0ZXh0IGluIHVjaGFycworICogQGRpciByZWNlaXZlcyB0aGUgcmVzb2x2ZWQgcGFyYWdyYXBoIGRpcmVjdGlvbgorICogQGJ1ZmZlciB0aGUgYnVmZmVyIHRvIHJlY2VpdmUgdGhlIHJlb3JkZXJlZCwgc2hhcGVkIGxpbmUuICBNdXN0IGhhdmUgY2FwYWNpdHkgb2YKKyAqIGF0IGxlYXN0IGxlbiBqY2hhcnMuCisgKiBAZmxhZ3MgbGluZSBiaWRpIGZsYWdzCisgKiBAcmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIHJlb3JkZXJlZCwgc2hhcGVkIGxpbmUsIG9yIC0xIGlmIGVycm9yCisgKi8KK2ppbnQgVGV4dExheW91dDo6bGF5b3V0TGluZShjb25zdCBqY2hhciogdGV4dCwgamludCBsZW4sIGppbnQgZmxhZ3MsIGludCAmZGlyLCBqY2hhciogYnVmZmVyLAorICAgICAgICBVRXJyb3JDb2RlICZzdGF0dXMpIHsKKyAgICBzdGF0aWMgY29uc3QgaW50IFJUTF9PUFRTID0gVUJJRElfRE9fTUlSUk9SSU5HIHwgVUJJRElfS0VFUF9CQVNFX0NPTUJJTklORyB8CisgICAgICAgICAgICBVQklESV9SRU1PVkVfQklESV9DT05UUk9MUyB8IFVCSURJX09VVFBVVF9SRVZFUlNFOworCisgICAgVUJpRGlMZXZlbCBiaWRpUmVxID0gMDsKKyAgICBzd2l0Y2ggKGZsYWdzKSB7CisgICAgY2FzZSBrQmlkaV9MVFI6IGJpZGlSZXEgPSAwOyBicmVhazsgLy8gbm8gSUNVIGNvbnN0YW50LCBjYW5vbmljYWwgTFRSIGxldmVsCisgICAgY2FzZSBrQmlkaV9SVEw6IGJpZGlSZXEgPSAxOyBicmVhazsgLy8gbm8gSUNVIGNvbnN0YW50LCBjYW5vbmljYWwgUlRMIGxldmVsCisgICAgY2FzZSBrQmlkaV9EZWZhdWx0X0xUUjogYmlkaVJlcSA9IFVCSURJX0RFRkFVTFRfTFRSOyBicmVhazsKKyAgICBjYXNlIGtCaWRpX0RlZmF1bHRfUlRMOiBiaWRpUmVxID0gVUJJRElfREVGQVVMVF9SVEw7IGJyZWFrOworICAgIGNhc2Uga0JpZGlfRm9yY2VfTFRSOiBtZW1jcHkoYnVmZmVyLCB0ZXh0LCBsZW4gKiBzaXplb2YoamNoYXIpKTsgcmV0dXJuIGxlbjsKKyAgICBjYXNlIGtCaWRpX0ZvcmNlX1JUTDogcmV0dXJuIHNoYXBlUnRsVGV4dCh0ZXh0LCAwLCBsZW4sIGxlbiwgYnVmZmVyLCBzdGF0dXMpOworICAgIH0KKworICAgIGludDMyX3QgcmVzdWx0ID0gLTE7CisKKyAgICBVQmlEaSogYmlkaSA9IHViaWRpX29wZW4oKTsKKyAgICBpZiAoYmlkaSkgeworICAgICAgICB1YmlkaV9zZXRQYXJhKGJpZGksIHRleHQsIGxlbiwgYmlkaVJlcSwgTlVMTCwgJnN0YXR1cyk7CisgICAgICAgIGlmIChVX1NVQ0NFU1Moc3RhdHVzKSkgeworICAgICAgICAgICAgZGlyID0gdWJpZGlfZ2V0UGFyYUxldmVsKGJpZGkpICYgMHgxOyAvLyAwIGlmIGx0ciwgMSBpZiBydGwKKworICAgICAgICAgICAgaW50IHJjID0gdWJpZGlfY291bnRSdW5zKGJpZGksICZzdGF0dXMpOworICAgICAgICAgICAgaWYgKFVfU1VDQ0VTUyhzdGF0dXMpKSB7CisgICAgICAgICAgICAgICAgLy8gTE9HKExPR19JTkZPLCAiTEFZT1VUIiwgInBhcmEgYmlkaVJlcT0lZCBkaXI9JWQgcmM9JWRcbiIsIGJpZGlSZXEsIGRpciwgcmMpOworCisgICAgICAgICAgICAgICAgaW50MzJfdCBzbGVuID0gMDsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJjOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzdGFydDsKKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBsZW5ndGg7CisgICAgICAgICAgICAgICAgICAgIFVCaURpRGlyZWN0aW9uIHJ1bkRpciA9IHViaWRpX2dldFZpc3VhbFJ1bihiaWRpLCBpLCAmc3RhcnQsICZsZW5ndGgpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChydW5EaXIgPT0gVUJJRElfUlRMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzbGVuICs9IHNoYXBlUnRsVGV4dCh0ZXh0ICsgc3RhcnQsIDAsIGxlbmd0aCwgbGVuZ3RoLCBidWZmZXIgKyBzbGVuLCBzdGF0dXMpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KGJ1ZmZlciArIHNsZW4sIHRleHQgKyBzdGFydCwgbGVuZ3RoICogc2l6ZW9mKGpjaGFyKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzbGVuICs9IGxlbmd0aDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoVV9TVUNDRVNTKHN0YXR1cykpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gc2xlbjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdWJpZGlfY2xvc2UoYmlkaSk7CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworYm9vbCBUZXh0TGF5b3V0OjpwcmVwYXJlVGV4dChTa1BhaW50ICpwYWludCwgY29uc3QgamNoYXIqIHRleHQsIGpzaXplIGxlbiwgamludCBiaWRpRmxhZ3MsCisgICAgICAgIGNvbnN0IGpjaGFyKiogb3V0VGV4dCwgaW50MzJfdCogb3V0Qnl0ZXMsIGpjaGFyKiogb3V0QnVmZmVyKSB7CisgICAgY29uc3QgamNoYXIgKndvcmtUZXh0ID0gdGV4dDsKKyAgICBqY2hhciAqYnVmZmVyID0gTlVMTDsKKyAgICBpbnQgZGlyID0ga0RpcmVjdGlvbl9MVFI7CisgICAgaWYgKG5lZWRzTGF5b3V0KHRleHQsIGxlbiwgYmlkaUZsYWdzKSkgeworICAgICAgICBidWZmZXIgPShqY2hhciAqKSBtYWxsb2MobGVuICogc2l6ZW9mKGpjaGFyKSk7CisgICAgICAgIGlmICghYnVmZmVyKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgVUVycm9yQ29kZSBzdGF0dXMgPSBVX1pFUk9fRVJST1I7CisgICAgICAgIGxlbiA9IGxheW91dExpbmUodGV4dCwgbGVuLCBiaWRpRmxhZ3MsIGRpciwgYnVmZmVyLCBzdGF0dXMpOyAvLyBtaWdodCBjaGFuZ2UgbGVuLCBkaXIKKyAgICAgICAgaWYgKCFVX1NVQ0NFU1Moc3RhdHVzKSkgeworICAgICAgICAgICAgTE9HKExPR19XQVJOLCAiTEFZT1VUIiwgImRyYXdUZXh0IGVycm9yICVkXG4iLCBzdGF0dXMpOworICAgICAgICAgICAgZnJlZShidWZmZXIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBjYW4ndCByZW5kZXIKKyAgICAgICAgfQorCisgICAgICAgIHdvcmtUZXh0ID0gYnVmZmVyOyAvLyB1c2UgdGhlIHNoYXBlZCB0ZXh0CisgICAgfQorCisgICAgYm9vbCB0cmltTGVmdCA9IGZhbHNlOworICAgIGJvb2wgdHJpbVJpZ2h0ID0gZmFsc2U7CisKKyAgICBTa1BhaW50OjpBbGlnbiBob3JpeiA9IHBhaW50LT5nZXRUZXh0QWxpZ24oKTsKKyAgICBzd2l0Y2ggKGhvcml6KSB7CisgICAgICAgIGNhc2UgU2tQYWludDo6a0xlZnRfQWxpZ246IHRyaW1MZWZ0ID0gZGlyICYga0RpcmVjdGlvbl9NYXNrOyBicmVhazsKKyAgICAgICAgY2FzZSBTa1BhaW50OjprQ2VudGVyX0FsaWduOiB0cmltTGVmdCA9IHRyaW1SaWdodCA9IHRydWU7IGJyZWFrOworICAgICAgICBjYXNlIFNrUGFpbnQ6OmtSaWdodF9BbGlnbjogdHJpbVJpZ2h0ID0gIShkaXIgJiBrRGlyZWN0aW9uX01hc2spOworICAgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICB9CisgICAgY29uc3QgamNoYXIqIHdvcmtMaW1pdCA9IHdvcmtUZXh0ICsgbGVuOworCisgICAgaWYgKHRyaW1MZWZ0KSB7CisgICAgICAgIHdoaWxlICh3b3JrVGV4dCA8IHdvcmtMaW1pdCAmJiAqd29ya1RleHQgPT0gJyAnKSB7CisgICAgICAgICAgICArK3dvcmtUZXh0OworICAgICAgICB9CisgICAgfQorICAgIGlmICh0cmltUmlnaHQpIHsKKyAgICAgICAgd2hpbGUgKHdvcmtMaW1pdCA+IHdvcmtUZXh0ICYmICood29ya0xpbWl0IC0gMSkgPT0gJyAnKSB7CisgICAgICAgICAgICAtLXdvcmtMaW1pdDsKKyAgICAgICAgfQorICAgIH0KKworICAgICpvdXRCeXRlcyA9ICh3b3JrTGltaXQgLSB3b3JrVGV4dCkgPDwgMTsKKyAgICAqb3V0VGV4dCA9IHdvcmtUZXh0OworICAgICpvdXRCdWZmZXIgPSBidWZmZXI7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gRHJhd3Mgb3IgZ2V0cyB0aGUgcGF0aCBvZiBhIHBhcmFncmFwaCBvZiB0ZXh0IG9uIGEgc2luZ2xlIGxpbmUsIHJ1bm5pbmcgYmlkaSBhbmQgc2hhcGluZy4KKy8vIFRoaXMgd2lsbCBkcmF3IGlmIGNhbnZhcyBpcyBub3QgbnVsbCwgb3RoZXJ3aXNlIHBhdGggbXVzdCBiZSBub24tbnVsbCBhbmQgaXQgd2lsbCBjcmVhdGUKKy8vIGEgcGF0aCByZXByZXNlbnRpbmcgdGhlIHRleHQgdGhhdCB3b3VsZCBoYXZlIGJlZW4gZHJhd24uCit2b2lkIFRleHRMYXlvdXQ6OmhhbmRsZVRleHQoU2tQYWludCAqcGFpbnQsIGNvbnN0IGpjaGFyKiB0ZXh0LCBqc2l6ZSBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgamludCBiaWRpRmxhZ3MsIGpmbG9hdCB4LCBqZmxvYXQgeSxTa0NhbnZhcyAqY2FudmFzLCBTa1BhdGggKnBhdGgpIHsKKyAgICBjb25zdCBqY2hhciAqd29ya1RleHQ7CisgICAgamNoYXIgKmJ1ZmZlciA9IE5VTEw7CisgICAgaW50MzJfdCB3b3JrQnl0ZXM7CisgICAgaWYgKHByZXBhcmVUZXh0KHBhaW50LCB0ZXh0LCBsZW4sIGJpZGlGbGFncywgJndvcmtUZXh0LCAmd29ya0J5dGVzLCAmYnVmZmVyKSkgeworICAgICAgICBTa1NjYWxhciB4XyA9IFNrRmxvYXRUb1NjYWxhcih4KTsKKyAgICAgICAgU2tTY2FsYXIgeV8gPSBTa0Zsb2F0VG9TY2FsYXIoeSk7CisgICAgICAgIGlmIChjYW52YXMpIHsKKyAgICAgICAgICAgIGNhbnZhcy0+ZHJhd1RleHQod29ya1RleHQsIHdvcmtCeXRlcywgeF8sIHlfLCAqcGFpbnQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcGFpbnQtPmdldFRleHRQYXRoKHdvcmtUZXh0LCB3b3JrQnl0ZXMsIHhfLCB5XywgcGF0aCk7CisgICAgICAgIH0KKyAgICAgICAgZnJlZShidWZmZXIpOworICAgIH0KK30KKworYm9vbCBUZXh0TGF5b3V0OjpwcmVwYXJlUnRsVGV4dFJ1bihjb25zdCBqY2hhciogY29udGV4dCwganNpemUgc3RhcnQsIGpzaXplJiBjb3VudCwKKyAgICAgICAganNpemUgY29udGV4dENvdW50LCBqY2hhciogc2hhcGVkKSB7CisgICAgVUVycm9yQ29kZSBzdGF0dXMgPSBVX1pFUk9fRVJST1I7CisgICAgY291bnQgPSBzaGFwZVJ0bFRleHQoY29udGV4dCwgc3RhcnQsIGNvdW50LCBjb250ZXh0Q291bnQsIHNoYXBlZCwgc3RhdHVzKTsKKyAgICBpZiAoVV9TVUNDRVNTKHN0YXR1cykpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HKExPR19XQVJOLCAiTEFZT1VUIiwgImRyYXdUZXh0UnVuIGVycm9yICVkXG4iLCBzdGF0dXMpOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgVGV4dExheW91dDo6ZHJhd1RleHRSdW4oU2tQYWludCogcGFpbnQsIGNvbnN0IGpjaGFyKiBjaGFycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamludCBzdGFydCwgamludCBjb3VudCwgamludCBjb250ZXh0Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkaXJGbGFncywgamZsb2F0IHgsIGpmbG9hdCB5LCBTa0NhbnZhcyogY2FudmFzKSB7CisKKyAgICAgU2tTY2FsYXIgeF8gPSBTa0Zsb2F0VG9TY2FsYXIoeCk7CisgICAgIFNrU2NhbGFyIHlfID0gU2tGbG9hdFRvU2NhbGFyKHkpOworCisgICAgIHVpbnQ4X3QgcnRsID0gZGlyRmxhZ3MgJiAweDE7CisgICAgIGlmIChydGwpIHsKKyAgICAgICAgIFNrQXV0b1NUTWFsbG9jPDgwLCBqY2hhcj4gYnVmZmVyKGNvbnRleHRDb3VudCk7CisgICAgICAgICBpZiAocHJlcGFyZVJ0bFRleHRSdW4oY2hhcnMsIHN0YXJ0LCBjb3VudCwgY29udGV4dENvdW50LCBidWZmZXIuZ2V0KCkpKSB7CisgICAgICAgICAgICAgY2FudmFzLT5kcmF3VGV4dChidWZmZXIuZ2V0KCksIGNvdW50IDw8IDEsIHhfLCB5XywgKnBhaW50KTsKKyAgICAgICAgIH0KKyAgICAgfSBlbHNlIHsKKyAgICAgICAgIGNhbnZhcy0+ZHJhd1RleHQoY2hhcnMgKyBzdGFydCwgY291bnQgPDwgMSwgeF8sIHlfLCAqcGFpbnQpOworICAgICB9CisgfQorCit2b2lkIFRleHRMYXlvdXQ6OmdldFRleHRSdW5BZHZhbmNlcyhTa1BhaW50ICpwYWludCwgY29uc3QgamNoYXIgKmNoYXJzLCBqaW50IHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamludCBjb3VudCwgamludCBjb250ZXh0Q291bnQsIGppbnQgZGlyRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqZmxvYXQgKnJlc3VsdEFkdmFuY2VzLCBqZmxvYXQgJnJlc3VsdFRvdGFsQWR2YW5jZSkgeworICAgIGpjaGFyIGJ1ZmZlcltjb250ZXh0Q291bnRdOworCisgICAgU2tTY2FsYXIqIHNjYWxhckFycmF5ID0gKFNrU2NhbGFyICopcmVzdWx0QWR2YW5jZXM7CisgICAgcmVzdWx0VG90YWxBZHZhbmNlID0gMDsKKworICAgIC8vIHRoaXMgaXMgd2hlcmUgd2UnZCBjYWxsIGhhcmZidXp6CisgICAgLy8gZm9yIG5vdyB3ZSBqdXN0IHVzZSB1c2hhcGUuYworCisgICAgaW50IHdpZHRoczsKKyAgICBjb25zdCBqY2hhciogdGV4dDsKKyAgICBpZiAoZGlyRmxhZ3MgJiAweDEpIHsgLy8gcnRsLCBjYWxsIGFyYWJpYyBzaGFwaW5nIGluIGNhc2UKKyAgICAgICAgVUVycm9yQ29kZSBzdGF0dXMgPSBVX1pFUk9fRVJST1I7CisgICAgICAgIC8vIFVzZSBmaXhlZCBsZW5ndGggc2luY2Ugd2UgbmVlZCB0byBrZWVwIHN0YXJ0IGFuZCBjb3VudCB2YWxpZAorICAgICAgICB1X3NoYXBlQXJhYmljKGNoYXJzLCBjb250ZXh0Q291bnQsIGJ1ZmZlciwgY29udGV4dENvdW50LAorICAgICAgICAgICAgICAgICAgICAgIFVfU0hBUEVfTEVOR1RIX0ZJWEVEX1NQQUNFU19ORUFSIHwKKyAgICAgICAgICAgICAgICAgICAgICBVX1NIQVBFX1RFWFRfRElSRUNUSU9OX0xPR0lDQUwgfCBVX1NIQVBFX0xFVFRFUlNfU0hBUEUgfAorICAgICAgICAgICAgICAgICAgICAgIFVfU0hBUEVfWF9MQU1BTEVGX1NVQl9BTFRFUk5BVEUsICZzdGF0dXMpOworICAgICAgICAvLyB3ZSBzaG91bGRuJ3QgZmFpbCB1bmxlc3MgdGhlcmUncyBhbiBvdXQgb2YgbWVtb3J5IGNvbmRpdGlvbiwKKyAgICAgICAgLy8gaW4gd2hpY2ggY2FzZSB3ZSdyZSBob3NlZCBhbnl3YXkKKyAgICAgICAgZm9yIChpbnQgaSA9IHN0YXJ0LCBlID0gaSArIGNvdW50OyBpIDwgZTsgKytpKSB7CisgICAgICAgICAgaWYgKGJ1ZmZlcltpXSA9PSAweGZmZmYpIHsKKyAgICAgICAgICAgIGJ1ZmZlcltpXSA9IDB4MjAwYjsgLy8gemVyby13aWR0aC1zcGFjZSBmb3Igc2tpYQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB0ZXh0ID0gYnVmZmVyICsgc3RhcnQ7CisgICAgICAgIHdpZHRocyA9IHBhaW50LT5nZXRUZXh0V2lkdGhzKHRleHQsIGNvdW50IDw8IDEsIHNjYWxhckFycmF5KTsKKyAgICB9IGVsc2UgeworICAgICAgICB0ZXh0ID0gY2hhcnMgKyBzdGFydDsKKyAgICAgICAgd2lkdGhzID0gcGFpbnQtPmdldFRleHRXaWR0aHModGV4dCwgY291bnQgPDwgMSwgc2NhbGFyQXJyYXkpOworICAgIH0KKworICAgIGlmICh3aWR0aHMgPCBjb3VudCkgeworICAgICAgICAvLyBTa2lhIG9wZXJhdGVzIG9uIGNvZGUgcG9pbnRzLCBub3QgY29kZSB1bml0cywgc28gc3Vycm9nYXRlIHBhaXJzIHJldHVybiBvbmx5CisgICAgICAgIC8vIG9uZSB2YWx1ZS4gRXhwYW5kIHRoZSByZXN1bHQgc28gd2UgaGF2ZSBvbmUgdmFsdWUgcGVyIFVURi0xNiBjb2RlIHVuaXQuCisKKyAgICAgICAgLy8gTm90ZSwgc2tpYSdzIGdldFRleHRXaWR0aCBnZXRzIGNvbmZ1c2VkIGlmIGl0IGVuY291bnRlcnMgYSBzdXJyb2dhdGUgcGFpciwKKyAgICAgICAgLy8gbGVhdmluZyB0aGUgcmVtYWluaW5nIHdpZHRocyB6ZXJvLiAgTm90IG5pY2UuCisgICAgICAgIGZvciAoaW50IGkgPSAwLCBwID0gMDsgaSA8IHdpZHRoczsgKytpKSB7CisgICAgICAgICAgICByZXN1bHRUb3RhbEFkdmFuY2UgKz0gcmVzdWx0QWR2YW5jZXNbcCsrXSA9IFNrU2NhbGFyVG9GbG9hdChzY2FsYXJBcnJheVtpXSk7CisgICAgICAgICAgICBpZiAocCA8IGNvdW50ICYmIHRleHRbcF0gPj0gMHhkYzAwICYmIHRleHRbcF0gPCAweGUwMDAgJiYKKyAgICAgICAgICAgICAgICAgICAgdGV4dFtwLTFdID49IDB4ZDgwMCAmJiB0ZXh0W3AtMV0gPCAweGRjMDApIHsKKyAgICAgICAgICAgICAgICByZXN1bHRBZHZhbmNlc1twKytdID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgcmVzdWx0VG90YWxBZHZhbmNlICs9IHJlc3VsdEFkdmFuY2VzW2ldID0gU2tTY2FsYXJUb0Zsb2F0KHNjYWxhckFycmF5W2ldKTsKKyAgICAgICAgfQorICAgIH0KK30KKworCisvLyBEcmF3cyBhIHBhcmFncmFwaCBvZiB0ZXh0IG9uIGEgc2luZ2xlIGxpbmUsIHJ1bm5pbmcgYmlkaSBhbmQgc2hhcGluZwordm9pZCBUZXh0TGF5b3V0OjpkcmF3VGV4dChTa1BhaW50KiBwYWludCwgY29uc3QgamNoYXIqIHRleHQsIGpzaXplIGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJpZGlGbGFncywgamZsb2F0IHgsIGpmbG9hdCB5LCBTa0NhbnZhcyogY2FudmFzKSB7CisKKyAgICBoYW5kbGVUZXh0KHBhaW50LCB0ZXh0LCBsZW4sIGJpZGlGbGFncywgeCwgeSwgY2FudmFzLCBOVUxMKTsKK30KKwordm9pZCBUZXh0TGF5b3V0OjpnZXRUZXh0UGF0aChTa1BhaW50ICpwYWludCwgY29uc3QgamNoYXIgKnRleHQsIGpzaXplIGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamludCBiaWRpRmxhZ3MsIGpmbG9hdCB4LCBqZmxvYXQgeSwgU2tQYXRoICpwYXRoKSB7CisgICAgaGFuZGxlVGV4dChwYWludCwgdGV4dCwgbGVuLCBiaWRpRmxhZ3MsIHgsIHksIE5VTEwsIHBhdGgpOworfQorCisKK3ZvaWQgVGV4dExheW91dDo6ZHJhd1RleHRPblBhdGgoU2tQYWludCogcGFpbnQsIGNvbnN0IGpjaGFyKiB0ZXh0LCBpbnQgY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiaWRpRmxhZ3MsIGpmbG9hdCBoT2Zmc2V0LCBqZmxvYXQgdk9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2tQYXRoKiBwYXRoLCBTa0NhbnZhcyogY2FudmFzKSB7CisKKyAgICBTa1NjYWxhciBoXyA9IFNrRmxvYXRUb1NjYWxhcihoT2Zmc2V0KTsKKyAgICBTa1NjYWxhciB2XyA9IFNrRmxvYXRUb1NjYWxhcih2T2Zmc2V0KTsKKworICAgIGlmICghbmVlZHNMYXlvdXQodGV4dCwgY291bnQsIGJpZGlGbGFncykpIHsKKyAgICAgICAgY2FudmFzLT5kcmF3VGV4dE9uUGF0aEhWKHRleHQsIGNvdW50IDw8IDEsICpwYXRoLCBoXywgdl8sICpwYWludCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBTa0F1dG9TVE1hbGxvYzw4MCwgamNoYXI+IGJ1ZmZlcihjb3VudCk7CisgICAgaW50IGRpciA9IGtEaXJlY3Rpb25fTFRSOworICAgIFVFcnJvckNvZGUgc3RhdHVzID0gVV9aRVJPX0VSUk9SOworICAgIGNvdW50ID0gbGF5b3V0TGluZSh0ZXh0LCBjb3VudCwgYmlkaUZsYWdzLCBkaXIsIGJ1ZmZlci5nZXQoKSwgc3RhdHVzKTsKKyAgICBpZiAoVV9TVUNDRVNTKHN0YXR1cykpIHsKKyAgICAgICAgY2FudmFzLT5kcmF3VGV4dE9uUGF0aEhWKGJ1ZmZlci5nZXQoKSwgY291bnQgPDwgMSwgKnBhdGgsIGhfLCB2XywgKnBhaW50KTsKKyAgICB9Cit9CisKK30KZGlmZiAtLWdpdCBhL2NvcmUvam5pL2FuZHJvaWQvZ3JhcGhpY3MvVGV4dExheW91dC5oIGIvY29yZS9qbmkvYW5kcm9pZC9ncmFwaGljcy9UZXh0TGF5b3V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGY2NjZjMAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvam5pL2FuZHJvaWQvZ3JhcGhpY3MvVGV4dExheW91dC5oCkBAIC0wLDAgKzEsODMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiam5pLmgiCisKKyNpbmNsdWRlICJTa0NhbnZhcy5oIgorI2luY2x1ZGUgIlNrUGFpbnQuaCIKKyNpbmNsdWRlICJ1bmljb2RlL3V0eXBlcy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIFRleHRMYXlvdXQgeworcHVibGljOgorCisgICAgZW51bSB7CisgICAgICAgIGtEaXJlY3Rpb25fTFRSID0gMCwKKyAgICAgICAga0RpcmVjdGlvbl9SVEwgPSAxLAorCisgICAgICAgIGtEaXJlY3Rpb25fTWFzayA9IDB4MQorICAgIH07CisKKyAgICBlbnVtIHsKKyAgICAgICAga0JpZGlfTFRSID0gMCwKKyAgICAgICAga0JpZGlfUlRMID0gMSwKKyAgICAgICAga0JpZGlfRGVmYXVsdF9MVFIgPSAyLAorICAgICAgICBrQmlkaV9EZWZhdWx0X1JUTCA9IDMsCisgICAgICAgIGtCaWRpX0ZvcmNlX0xUUiA9IDQsCisgICAgICAgIGtCaWRpX0ZvcmNlX1JUTCA9IDUsCisKKyAgICAgICAga0JpZGlfTWFzayA9IDB4NworICAgIH07CisKKyAgICAvKgorICAgICAqIERyYXdzIGEgdW5pZGlyZWN0aW9uYWwgcnVuIG9mIHRleHQuCisgICAgICovCisgICAgc3RhdGljIHZvaWQgZHJhd1RleHRSdW4oU2tQYWludCogcGFpbnQsIGNvbnN0IGpjaGFyKiBjaGFycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBqaW50IHN0YXJ0LCBqaW50IGNvdW50LCBqaW50IGNvbnRleHRDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGlyRmxhZ3MsIGpmbG9hdCB4LCBqZmxvYXQgeSwgU2tDYW52YXMqIGNhbnZhcyk7CisKKyAgICBzdGF0aWMgdm9pZCBnZXRUZXh0UnVuQWR2YW5jZXMoU2tQYWludCAqcGFpbnQsIGNvbnN0IGpjaGFyICpjaGFycywgamludCBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamludCBjb3VudCwgamludCBjb250ZXh0Q291bnQsIGppbnQgZGlyRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpmbG9hdCAqcmVzdWx0QWR2YW5jZXMsIGpmbG9hdCAmcmVzdWx0VG90YWxBZHZhbmNlKTsKKworICAgIHN0YXRpYyB2b2lkIGRyYXdUZXh0KFNrUGFpbnQqIHBhaW50LCBjb25zdCBqY2hhciogdGV4dCwganNpemUgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgIGppbnQgYmlkaUZsYWdzLCBqZmxvYXQgeCwgamZsb2F0IHksIFNrQ2FudmFzKiBjYW52YXMpOworCisgICAgc3RhdGljIHZvaWQgZ2V0VGV4dFBhdGgoU2tQYWludCAqcGFpbnQsIGNvbnN0IGpjaGFyICp0ZXh0LCBqc2l6ZSBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgamludCBiaWRpRmxhZ3MsIGpmbG9hdCB4LCBqZmxvYXQgeSwgU2tQYXRoICpwYXRoKTsKKworICAgIHN0YXRpYyB2b2lkIGRyYXdUZXh0T25QYXRoKFNrUGFpbnQqIHBhaW50LCBjb25zdCBqY2hhciogdGV4dCwganNpemUgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiaWRpRmxhZ3MsIGpmbG9hdCBoT2Zmc2V0LCBqZmxvYXQgdk9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTa1BhdGgqIHBhdGgsIFNrQ2FudmFzKiBjYW52YXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgc3RhdGljIGJvb2wgcHJlcGFyZVRleHQoU2tQYWludCAqcGFpbnQsIGNvbnN0IGpjaGFyKiB0ZXh0LCBqc2l6ZSBsZW4sIGppbnQgYmlkaUZsYWdzLAorICAgICAgICBjb25zdCBqY2hhcioqIG91dFRleHQsIGludDMyX3QqIG91dEJ5dGVzLCBqY2hhcioqIG91dEJ1ZmZlcik7CisgICAgc3RhdGljIGJvb2wgcHJlcGFyZVJ0bFRleHRSdW4oY29uc3QgamNoYXIqIGNvbnRleHQsIGpzaXplIHN0YXJ0LCBqc2l6ZSYgY291bnQsCisgICAgICAgIGpzaXplIGNvbnRleHRDb3VudCwgamNoYXIqIHNoYXBlZCk7CisgICAgICAgIAorCitwcml2YXRlOgorICAgIHN0YXRpYyBib29sIG5lZWRzTGF5b3V0KGNvbnN0IGpjaGFyKiB0ZXh0LCBqaW50IGxlbiwgamludCBiaWRpRmxhZ3MpOworICAgIHN0YXRpYyBpbnQgc2hhcGVSdGxUZXh0KGNvbnN0IGpjaGFyKiBjb250ZXh0LCBqc2l6ZSBzdGFydCwganNpemUgY291bnQsIGpzaXplIGNvbnRleHRDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBqY2hhciogc2hhcGVkLCBVRXJyb3JDb2RlICZzdGF0dXMpOworICAgIHN0YXRpYyBqaW50IGxheW91dExpbmUoY29uc3QgamNoYXIqIHRleHQsIGppbnQgbGVuLCBqaW50IGZsYWdzLCBpbnQgJmRpciwgamNoYXIqIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFVFcnJvckNvZGUgJnN0YXR1cyk7CisgICAgc3RhdGljIHZvaWQgaGFuZGxlVGV4dChTa1BhaW50ICpwYWludCwgY29uc3QgamNoYXIqIHRleHQsIGpzaXplIGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiaWRpRmxhZ3MsIGpmbG9hdCB4LCBqZmxvYXQgeSxTa0NhbnZhcyAqY2FudmFzLCBTa1BhdGggKnBhdGgpOworfTsKKworfQpkaWZmIC0tZ2l0IGEvY29yZS9qbmkvYW5kcm9pZC9ncmFwaGljcy9UeXBlZmFjZS5jcHAgYi9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL1R5cGVmYWNlLmNwcAppbmRleCA3YzdiZmViLi4xZmU3MmU2IDEwMDY0NAotLS0gYS9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL1R5cGVmYWNlLmNwcAorKysgYi9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL1R5cGVmYWNlLmNwcApAQCAtMTMwLDcgKzEzMCwxMyBAQAogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAgICAgCi0gICAgcmV0dXJuIFNrVHlwZWZhY2U6OkNyZWF0ZUZyb21TdHJlYW0obmV3IEFzc2V0U3RyZWFtKGFzc2V0LCB0cnVlKSk7CisgICAgU2tTdHJlYW0qIHN0cmVhbSA9IG5ldyBBc3NldFN0cmVhbShhc3NldCwgdHJ1ZSk7CisgICAgU2tUeXBlZmFjZSogZmFjZSA9IFNrVHlwZWZhY2U6OkNyZWF0ZUZyb21TdHJlYW0oc3RyZWFtKTsKKyAgICAvLyBTa1R5cGVGYWNlOjpDcmVhdGVGcm9tU3RyZWFtIGNhbGxzIHJlZigpIG9uIHRoZSBzdHJlYW0sIHNvIHdlCisgICAgLy8gbmVlZCB0byB1bnJlZiBpdCBoZXJlIG9yIGl0IHdvbid0IGJlIGZyZWVkIGxhdGVyIG9uCisgICAgc3RyZWFtLT51bnJlZigpOworCisgICAgcmV0dXJuIGZhY2U7CiB9CiAKIHN0YXRpYyBTa1R5cGVmYWNlKiBUeXBlZmFjZV9jcmVhdGVGcm9tRmlsZShKTklFbnYqIGVudiwgam9iamVjdCwganN0cmluZyBqcGF0aCkgewpkaWZmIC0tZ2l0IGEvY29yZS9qbmkvYW5kcm9pZF9ibHVldG9vdGhfU2NvU29ja2V0LmNwcCBiL2NvcmUvam5pL2FuZHJvaWRfYmx1ZXRvb3RoX1Njb1NvY2tldC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0ZTQ0MDkuLjAwMDAwMDAKLS0tIGEvY29yZS9qbmkvYW5kcm9pZF9ibHVldG9vdGhfU2NvU29ja2V0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDY4OSArMCwwIEBACi0vKgotKiogQ29weXJpZ2h0IDIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSoqCi0qKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotKioKLSoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSoqCi0qKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0qKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0qKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0qKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSovCi0KLSNkZWZpbmUgTE9HX1RBRyAiYmx1ZXRvb3RoX1Njb1NvY2tldC5jcHAiCi0KLSNpbmNsdWRlICJhbmRyb2lkX2JsdWV0b290aF9jb21tb24uaCIKLSNpbmNsdWRlICJhbmRyb2lkX3J1bnRpbWUvQW5kcm9pZFJ1bnRpbWUuaCIKLSNpbmNsdWRlICJKTklIZWxwLmgiCi0jaW5jbHVkZSAiam5pLmgiCi0jaW5jbHVkZSAidXRpbHMvTG9nLmgiCi0jaW5jbHVkZSAidXRpbHMvbWlzYy5oIgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPHB0aHJlYWQuaD4KLSNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3Vpby5oPgotI2luY2x1ZGUgPHN5cy9wb2xsLmg+Ci0KLSNpZmRlZiBIQVZFX0JMVUVUT09USAotI2luY2x1ZGUgPGJsdWV0b290aC9ibHVldG9vdGguaD4KLSNpbmNsdWRlIDxibHVldG9vdGgvc2NvLmg+Ci0jaW5jbHVkZSA8Ymx1ZXRvb3RoL2hjaS5oPgotCi0jZGVmaW5lIE1BWF9MSU5FIDI1NQotCi0vKgotICogRGVmaW5lcyB0aGUgbW9kdWxlIHN0cmluZ3MgdXNlZCBpbiB0aGUgYmxhY2tsaXN0IGZpbGUuCi0gKiBUaGVzZSBhcmUgdXNlZCBieSBjb25zdW1lcnMgb2YgdGhlIGJsYWNrbGlzdCBmaWxlIHRvIHNlZSBpZiB0aGUgbGluZSBpcwotICogdXNlZCBieSB0aGF0IG1vZHVsZS4KLSAqLwotI2RlZmluZSBTQ09fQkxBQ0tMSVNUX01PRFVMRV9OQU1FICJzY29Tb2NrZXQiCi0KLQotLyogRGVmaW5lIHRoZSB0eXBlIHN0cmluZ3MgdXNlZCBpbiB0aGUgYmxhY2tsaXN0IGZpbGUuICovCi0jZGVmaW5lIEJMQUNLTElTVF9CWV9OQU1FICJuYW1lIgotI2RlZmluZSBCTEFDS0xJU1RfQllfUEFSVElBTF9OQU1FICJwYXJ0aWFsX25hbWUiCi0jZGVmaW5lIEJMQUNLTElTVF9CWV9PVUkgInZlbmRvcl9vdWkiCi0KLSNlbmRpZgotCi0vKiBJZGVhbGx5LCBibG9ja2luZyBJL08gb24gYSBTQ08gc29ja2V0IHdvdWxkIHJldHVybiB3aGVuIGFub3RoZXIgdGhyZWFkCi0gKiBjYWxscyBjbG9zZSgpLiBIb3dldmVyIGl0IGRvZXMgbm90IHJpZ2h0IG5vdywgaW4gZmFjdCBjbG9zZSgpIG9uIGEgU0NPCi0gKiBzb2NrZXQgaGFzIHN0cmFuZ2UgYmVoYXZpb3IgKHJldHVybnMgYSBib2d1cyB2YWx1ZSkgd2hlbiBvdGhlciB0aHJlYWRzCi0gKiBhcmUgcGVyZm9ybWluZyBibG9ja2luZyBJL08gb24gdGhhdCBzb2NrZXQuIFNvLCB0byB3b3JrYXJvdW5kLCB3ZSBhbHdheXMKLSAqIGNhbGwgY2xvc2UoKSBmcm9tIHRoZSBzYW1lIHRocmVhZCB0aGF0IGRvZXMgYmxvY2tpbmcgSS9PLiBUaGlzIHJlcXVpcmVzIHRoZQotICogdXNlIG9mIGEgc29ja2V0cGFpciB0byBzaWduYWwgdGhlIGJsb2NraW5nIEkvTyB0byBhYm9ydC4KLSAqCi0gKiBVbmZvcnR1bmF0ZWx5IEkgZG9uJ3Qga25vdyBhIHdheSB0byBhYm9ydCBjb25uZWN0KCkgeWV0LCBidXQgYXQgbGVhc3QgdGhpcwotICogdGltZXMgb3V0IGFmdGVyIHRoZSBCVCBwYWdlIHRpbWVvdXQgKDEwIHNlY29uZHMgY3VycmVudGx5KSwgc28gdGhlIHRocmVhZAotICogd2lsbCBkaWUgZXZlbnR1YWxseS4gVGhlIGZhY3QgdGhhdCB0aGUgdGhyZWFkIGNhbiBvdXRsaXZlCi0gKiB0aGUgSmF2YSBvYmplY3QgZm9yY2VzIHVzIHRvIHVzZSBhIG11dGV4IGluIGRlc3RvcnlOYXRpdmUoKS4KLSAqCi0gKiBUaGUgSk5JIEFQSSBpcyBlbnRpcmVseSBhc3luYy4KLSAqCi0gKiBBbHNvIG5vdGUgdGhpcyBjbGFzcyBkZWFscyBvbmx5IHdpdGggU0NPIGNvbm5lY3Rpb25zLCBub3Qgd2l0aCBkYXRhCi0gKiB0cmFuc21pc3Npb24uCi0gKi8KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLSNpZmRlZiBIQVZFX0JMVUVUT09USAotCi1zdGF0aWMgSmF2YVZNICpqdm07Ci1zdGF0aWMgamZpZWxkSUQgZmllbGRfbU5hdGl2ZURhdGE7Ci1zdGF0aWMgam1ldGhvZElEIG1ldGhvZF9vbkFjY2VwdGVkOwotc3RhdGljIGptZXRob2RJRCBtZXRob2Rfb25Db25uZWN0ZWQ7Ci1zdGF0aWMgam1ldGhvZElEIG1ldGhvZF9vbkNsb3NlZDsKLQotc3RydWN0IHRocmVhZF9kYXRhX3Q7Ci1zdGF0aWMgdm9pZCAqd29ya190aHJlYWQodm9pZCAqYXJnKTsKLXN0YXRpYyBpbnQgY29ubmVjdF93b3JrKGNvbnN0IGNoYXIgKmFkZHJlc3MsIHVpbnQxNl90IHNjb19wa3RfdHlwZSk7Ci1zdGF0aWMgaW50IGFjY2VwdF93b3JrKGludCBzaWduYWxfc2spOwotc3RhdGljIHZvaWQgd2FpdF9mb3JfY2xvc2UoaW50IHNrLCBpbnQgc2lnbmFsX3NrKTsKLXN0YXRpYyB2b2lkIGNsb3NlTmF0aXZlKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iamVjdCk7Ci0KLXN0YXRpYyB2b2lkIHBhcnNlQmxhY2tsaXN0KHZvaWQpOwotc3RhdGljIHVpbnQxNl90IGdldFNjb1R5cGUoY2hhciAqYWRkcmVzcywgY29uc3QgY2hhciAqbmFtZSk7Ci0KLSNkZWZpbmUgQ09NUEFSRV9TVFJJTkcoa2V5LCBzKSAoIXN0cm5jbXAoa2V5LCBzLCBzdHJsZW4ocykpKQotCi0vKiBCbGFja2xpc3QgZGF0YSAqLwotdHlwZWRlZiBzdHJ1Y3Qgc2NvQmxhY2tsaXN0IHsKLSAgICBpbnQgZmllbGRUeXBlOwotICAgIGNoYXIgKnZhbHVlOwotICAgIHVpbnQxNl90IHNjb1R5cGU7Ci0gICAgc3RydWN0IHNjb0JsYWNrbGlzdCAqbmV4dDsKLX0gc2NvQmxhY2tsaXN0X3Q7Ci0KLSNkZWZpbmUgQkxfVFlQRV9OQU1FIDEgICAvLyBGaWVsZCB0eXBlIGlzIG5hbWUgc3RyaW5nCi0KLXN0YXRpYyBzY29CbGFja2xpc3RfdCAqYmxhY2tsaXN0ID0gTlVMTDsKLQotLyogc2hhcmVkIG5hdGl2ZSBkYXRhIC0gcHJvdGVjdGVkIGJ5IG11dGV4ICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgcHRocmVhZF9tdXRleF90IG11dGV4OwotICAgIGludCBzaWduYWxfc2s7ICAgICAgICAvLyBzb2NrZXQgdG8gc2lnbmFsIGJsb2NrZWQgSS9PIHRvIHVuYmxvY2sKLSAgICBqb2JqZWN0IG9iamVjdDsgICAgICAgLy8gSk5JIGdsb2JhbCByZWYgdG8gdGhlIEphdmEgb2JqZWN0Ci0gICAgdGhyZWFkX2RhdGFfdCAqdGhyZWFkX2RhdGE7ICAvLyBwb2ludGVyIHRvIHRocmVhZCBsb2NhbCBkYXRhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXggMSB0aHJlYWQgcGVyIHNjbyBzb2NrZXQKLX0gbmF0aXZlX2RhdGFfdDsKLQotLyogdGhyZWFkIGxvY2FsIGRhdGEgKi8KLXN0cnVjdCB0aHJlYWRfZGF0YV90IHsKLSAgICBuYXRpdmVfZGF0YV90ICpuYXQ7Ci0gICAgYm9vbCBpc19hY2NlcHQ7ICAgICAgICAvLyBhY2NlcHQgKGxpc3RlbmluZykgb3IgY29ubmVjdCAob3V0Z29pbmcpIHRocmVhZAotICAgIGludCBzaWduYWxfc2s7ICAgICAgICAgLy8gc29ja2V0IGZvciB0aHJlYWQgdG8gbGlzdGVuIGZvciB1bmJsb2NrIHNpZ25hbAotICAgIGNoYXIgYWRkcmVzc1tCVEFERFJfU0laRV07ICAvLyBCVCBhZGRyZXMgYXMgc3RyaW5nCi0gICAgdWludDE2X3Qgc2NvX3BrdF90eXBlOyAgIC8vIFNDTyBwYWNrZXQgdHlwZXMgc3VwcG9ydGVkCi19OwotCi1zdGF0aWMgaW5saW5lIG5hdGl2ZV9kYXRhX3QgKiBnZXRfbmF0aXZlX2RhdGEoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqZWN0KSB7Ci0gICAgcmV0dXJuIChuYXRpdmVfZGF0YV90ICopKGVudi0+R2V0SW50RmllbGQob2JqZWN0LCBmaWVsZF9tTmF0aXZlRGF0YSkpOwotfQotCi1zdGF0aWMgdWludDE2X3Qgc3RyMnNjb1R5cGUgKGNoYXIgKmtleSkgewotICAgIExPR1YoIiVzOiBrZXkgPSAlcyIsIF9fRlVOQ1RJT05fXywga2V5KTsKLSAgICBpZiAoQ09NUEFSRV9TVFJJTkcoa2V5LCAiRVNDT19IVjEiKSkKLSAgICAgICAgcmV0dXJuIEVTQ09fSFYxOwotICAgIGlmIChDT01QQVJFX1NUUklORyhrZXksICJFU0NPX0hWMiIpKQotICAgICAgICByZXR1cm4gRVNDT19IVjI7Ci0gICAgaWYgKENPTVBBUkVfU1RSSU5HKGtleSwgIkVTQ09fSFYzIikpCi0gICAgICAgIHJldHVybiBFU0NPX0hWMzsKLSAgICBpZiAoQ09NUEFSRV9TVFJJTkcoa2V5LCAiRVNDT19FVjMiKSkKLSAgICAgICAgcmV0dXJuIEVTQ09fRVYzOwotICAgIGlmIChDT01QQVJFX1NUUklORyhrZXksICJFU0NPX0VWNCIpKQotICAgICAgICByZXR1cm4gRVNDT19FVjQ7Ci0gICAgaWYgKENPTVBBUkVfU1RSSU5HKGtleSwgIkVTQ09fRVY1IikpCi0gICAgICAgIHJldHVybiBFU0NPX0VWNTsKLSAgICBpZiAoQ09NUEFSRV9TVFJJTkcoa2V5LCAiRVNDT18yRVYzIikpCi0gICAgICAgIHJldHVybiBFU0NPXzJFVjM7Ci0gICAgaWYgKENPTVBBUkVfU1RSSU5HKGtleSwgIkVTQ09fM0VWMyIpKQotICAgICAgICByZXR1cm4gRVNDT18zRVYzOwotICAgIGlmIChDT01QQVJFX1NUUklORyhrZXksICJFU0NPXzJFVjUiKSkKLSAgICAgICAgcmV0dXJuIEVTQ09fMkVWNTsKLSAgICBpZiAoQ09NUEFSRV9TVFJJTkcoa2V5LCAiRVNDT18zRVY1IikpCi0gICAgICAgIHJldHVybiBFU0NPXzNFVjU7Ci0gICAgaWYgKENPTVBBUkVfU1RSSU5HKGtleSwgIlNDT19FU0NPX01BU0siKSkKLSAgICAgICAgcmV0dXJuIFNDT19FU0NPX01BU0s7Ci0gICAgaWYgKENPTVBBUkVfU1RSSU5HKGtleSwgIkVEUl9FU0NPX01BU0siKSkKLSAgICAgICAgcmV0dXJuIEVEUl9FU0NPX01BU0s7Ci0gICAgaWYgKENPTVBBUkVfU1RSSU5HKGtleSwgIkFMTF9FU0NPX01BU0siKSkKLSAgICAgICAgcmV0dXJuIEFMTF9FU0NPX01BU0s7Ci0gICAgTE9HRSgiVW5rbm93biBTQ08gVHlwZSAoJXMpIHNraXBwaW5nIixrZXkpOwotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBwYXJzZUJsYWNrbGlzdCh2b2lkKSB7Ci0gICAgY29uc3QgY2hhciAqZmlsZW5hbWUgPSAiL2V0Yy9ibHVldG9vdGgvYmxhY2tsaXN0LmNvbmYiOwotICAgIGNoYXIgbGluZVtNQVhfTElORV07Ci0gICAgc2NvQmxhY2tsaXN0X3QgKmxpc3QgPSBOVUxMOwotICAgIHNjb0JsYWNrbGlzdF90ICpuZXdlbGVtOwotCi0gICAgTE9HVihfX0ZVTkNUSU9OX18pOwotCi0gICAgLyogT3BlbiBmaWxlICovCi0gICAgRklMRSAqZnAgPSBmb3BlbihmaWxlbmFtZSwgInIiKTsKLSAgICBpZighZnApIHsKLSAgICAgICAgTE9HRSgiRXJyb3IoJXMpb3BlbmluZyBibGFja2xpc3QgZmlsZSIsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICB3aGlsZSAoZmdldHMobGluZSwgTUFYX0xJTkUsIGZwKSAhPSBOVUxMKSB7Ci0gICAgICAgIGlmICgoQ09NUEFSRV9TVFJJTkcobGluZSwgIi8vIikpIHx8ICghc3RyY21wKGxpbmUsICIiKSkpCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgY2hhciAqbW9kdWxlID0gc3RydG9rKGxpbmUsIjoiKTsKLSAgICAgICAgaWYgKENPTVBBUkVfU1RSSU5HKG1vZHVsZSwgU0NPX0JMQUNLTElTVF9NT0RVTEVfTkFNRSkpIHsKLSAgICAgICAgICAgIG5ld2VsZW0gPSAoc2NvQmxhY2tsaXN0X3QgKiljYWxsb2MoMSwgc2l6ZW9mKHNjb0JsYWNrbGlzdF90KSk7Ci0gICAgICAgICAgICBpZiAobmV3ZWxlbSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgTE9HRSgiJXM6IG91dCBvZiBtZW1vcnkhIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBwYXJzZSBsaW5lCi0gICAgICAgICAgICBjaGFyICp0eXBlID0gc3RydG9rKE5VTEwsICIsIik7Ci0gICAgICAgICAgICBjaGFyICp2YWx1ZUxpc3QgPSBzdHJ0b2soTlVMTCwgIiwiKTsKLSAgICAgICAgICAgIGNoYXIgKnBhcmFtTGlzdCA9IHN0cnRvayhOVUxMLCAiLCIpOwotICAgICAgICAgICAgaWYgKENPTVBBUkVfU1RSSU5HKHR5cGUsIEJMQUNLTElTVF9CWV9OQU1FKSkgewotICAgICAgICAgICAgICAgIC8vIEV4dHJhY3QgTmFtZSBmcm9tIFZhbHVlIGxpc3QKLSAgICAgICAgICAgICAgICBuZXdlbGVtLT5maWVsZFR5cGUgPSBCTF9UWVBFX05BTUU7Ci0gICAgICAgICAgICAgICAgbmV3ZWxlbS0+dmFsdWUgPSAoY2hhciAqKWNhbGxvYygxLCBzdHJsZW4odmFsdWVMaXN0KSk7Ci0gICAgICAgICAgICAgICAgaWYgKG5ld2VsZW0tPnZhbHVlID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgTE9HRSgiJXM6IG91dCBvZiBtZW1vcnkhIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHZhbHVlTGlzdCsrOyAgLy8gU2tpcCBvcGVuIHF1b3RlCi0gICAgICAgICAgICAgICAgc3RybmNweShuZXdlbGVtLT52YWx1ZSwgdmFsdWVMaXN0LCBzdHJsZW4odmFsdWVMaXN0KSAtIDEpOwotCi0gICAgICAgICAgICAgICAgLy8gR2V0IFNjbyBTZXR0aW5ncyBmcm9tIFBhcmFtZXRlcnMKLSAgICAgICAgICAgICAgICBjaGFyICpwYXJhbSA9IHN0cnRvayhwYXJhbUxpc3QsICI7Iik7Ci0gICAgICAgICAgICAgICAgdWludDE2X3Qgc2NvVHlwZXMgPSAwOwotICAgICAgICAgICAgICAgIHdoaWxlIChwYXJhbSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHNjbzsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtWzBdID09ICctJykgewotICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0rKzsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNjbyA9IHN0cjJzY29UeXBlKHBhcmFtKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzY28gIT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY29UeXBlcyAmPSB+c2NvOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBhcmFtWzBdID09ICcrJykgewotICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0rKzsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNjbyA9IHN0cjJzY29UeXBlKHBhcmFtKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzY28gIT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY29UeXBlcyB8PSBzY287Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGFyYW1bMF0gPT0gJz0nKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbSsrOwotICAgICAgICAgICAgICAgICAgICAgICAgc2NvID0gc3RyMnNjb1R5cGUocGFyYW0pOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNjbyAhPSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjb1R5cGVzID0gc2NvOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgTE9HRSgiSW52YWxpZCBTQ08gdHlwZSBtdXN0IGJlID0sICsgb3IgLSIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBhcmFtID0gc3RydG9rKE5VTEwsICI7Iik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG5ld2VsZW0tPnNjb1R5cGUgPSBzY29UeXBlczsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgTE9HRSgiVW5rbm93biBTQ08gdHlwZSBlbnRyeSBpbiBCbGFja2xpc3QgZmlsZSIpOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGxpc3QpIHsKLSAgICAgICAgICAgICAgICBsaXN0LT5uZXh0ID0gbmV3ZWxlbTsKLSAgICAgICAgICAgICAgICBsaXN0ID0gbmV3ZWxlbTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYmxhY2tsaXN0ID0gbGlzdCA9IG5ld2VsZW07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBMT0dJKCJFbnRyeSBuYW1lID0gJXMgU2NvVHlwZXMgPSAweCV4IiwgbmV3ZWxlbS0+dmFsdWUsCi0gICAgICAgICAgICAgICAgIG5ld2VsZW0tPnNjb1R5cGUpOwotICAgICAgICB9Ci0gICAgfQotICAgIGZjbG9zZShmcCk7Ci0gICAgcmV0dXJuOwotfQotc3RhdGljIHVpbnQxNl90IGdldFNjb1R5cGUoY2hhciAqYWRkcmVzcywgY29uc3QgY2hhciAqbmFtZSkgewotICAgIHVpbnQxNl90IHJldCA9IDA7Ci0gICAgc2NvQmxhY2tsaXN0X3QgKmxpc3QgPSBibGFja2xpc3Q7Ci0KLSAgICB3aGlsZSAobGlzdCAhPSBOVUxMKSB7Ci0gICAgICAgIGlmIChsaXN0LT5maWVsZFR5cGUgPT0gQkxfVFlQRV9OQU1FKSB7Ci0gICAgICAgICAgICBpZiAoQ09NUEFSRV9TVFJJTkcobmFtZSwgbGlzdC0+dmFsdWUpKSB7Ci0gICAgICAgICAgICAgICAgcmV0ID0gbGlzdC0+c2NvVHlwZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBsaXN0ID0gbGlzdC0+bmV4dDsKLSAgICB9Ci0gICAgTE9HSSgiJXMgJXMgLSAweCV4IiwgIF9fRlVOQ1RJT05fXywgbmFtZSwgcmV0KTsKLSAgICByZXR1cm4gcmV0OwotfQotI2VuZGlmCi0KLXN0YXRpYyB2b2lkIGNsYXNzSW5pdE5hdGl2ZShKTklFbnYqIGVudiwgamNsYXNzIGNsYXp6KSB7Ci0gICAgTE9HVihfX0ZVTkNUSU9OX18pOwotI2lmZGVmIEhBVkVfQkxVRVRPT1RICi0gICAgaWYgKGVudi0+R2V0SmF2YVZNKCZqdm0pIDwgMCkgewotICAgICAgICBMT0dFKCJDb3VsZCBub3QgZ2V0IGhhbmRsZSB0byB0aGUgVk0iKTsKLSAgICB9Ci0gICAgZmllbGRfbU5hdGl2ZURhdGEgPSBnZXRfZmllbGQoZW52LCBjbGF6eiwgIm1OYXRpdmVEYXRhIiwgIkkiKTsKLSAgICBtZXRob2Rfb25BY2NlcHRlZCA9IGVudi0+R2V0TWV0aG9kSUQoY2xhenosICJvbkFjY2VwdGVkIiwgIihJKVYiKTsKLSAgICBtZXRob2Rfb25Db25uZWN0ZWQgPSBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCAib25Db25uZWN0ZWQiLCAiKEkpViIpOwotICAgIG1ldGhvZF9vbkNsb3NlZCA9IGVudi0+R2V0TWV0aG9kSUQoY2xhenosICJvbkNsb3NlZCIsICIoKVYiKTsKLQotICAgIC8qIFJlYWQgdGhlIGJsYWNrbGlzdCBmaWxlIGluIGhlcmUgKi8KLSAgICBwYXJzZUJsYWNrbGlzdCgpOwotI2VuZGlmCi19Ci0KLS8qIFJldHVybnMgZmFsc2UgaWYgYSBzZXJpb3VzIGVycm9yIG9jY3VyZWQgKi8KLXN0YXRpYyBqYm9vbGVhbiBpbml0TmF0aXZlKEpOSUVudiogZW52LCBqb2JqZWN0IG9iamVjdCkgewotICAgIExPR1YoX19GVU5DVElPTl9fKTsKLSNpZmRlZiBIQVZFX0JMVUVUT09USAotCi0gICAgbmF0aXZlX2RhdGFfdCAqbmF0ID0gKG5hdGl2ZV9kYXRhX3QgKikgY2FsbG9jKDEsIHNpemVvZihuYXRpdmVfZGF0YV90KSk7Ci0gICAgaWYgKG5hdCA9PSBOVUxMKSB7Ci0gICAgICAgIExPR0UoIiVzOiBvdXQgb2YgbWVtb3J5ISIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIHJldHVybiBKTklfRkFMU0U7Ci0gICAgfQotCi0gICAgcHRocmVhZF9tdXRleF9pbml0KCZuYXQtPm11dGV4LCBOVUxMKTsKLSAgICBlbnYtPlNldEludEZpZWxkKG9iamVjdCwgZmllbGRfbU5hdGl2ZURhdGEsIChqaW50KW5hdCk7Ci0gICAgbmF0LT5zaWduYWxfc2sgPSAtMTsKLSAgICBuYXQtPm9iamVjdCA9IE5VTEw7Ci0gICAgbmF0LT50aHJlYWRfZGF0YSA9IE5VTEw7Ci0KLSNlbmRpZgotICAgIHJldHVybiBKTklfVFJVRTsKLX0KLQotc3RhdGljIHZvaWQgZGVzdHJveU5hdGl2ZShKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QpIHsKLSAgICBMT0dWKF9fRlVOQ1RJT05fXyk7Ci0jaWZkZWYgSEFWRV9CTFVFVE9PVEgKLSAgICBuYXRpdmVfZGF0YV90ICpuYXQgPSBnZXRfbmF0aXZlX2RhdGEoZW52LCBvYmplY3QpOwotICAgIAotICAgIGNsb3NlTmF0aXZlKGVudiwgb2JqZWN0KTsKLSAgICAKLSAgICBwdGhyZWFkX211dGV4X2xvY2soJm5hdC0+bXV0ZXgpOwotICAgIGlmIChuYXQtPnRocmVhZF9kYXRhICE9IE5VTEwpIHsKLSAgICAgICAgbmF0LT50aHJlYWRfZGF0YS0+bmF0ID0gTlVMTDsKLSAgICB9Ci0gICAgcHRocmVhZF9tdXRleF91bmxvY2soJm5hdC0+bXV0ZXgpOwotICAgIHB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmbmF0LT5tdXRleCk7Ci0KLSAgICBmcmVlKG5hdCk7Ci0jZW5kaWYKLX0KLQotc3RhdGljIGpib29sZWFuIGFjY2VwdE5hdGl2ZShKTklFbnYgKmVudiwgam9iamVjdCBvYmplY3QpIHsKLSAgICBMT0dWKF9fRlVOQ1RJT05fXyk7Ci0jaWZkZWYgSEFWRV9CTFVFVE9PVEgKLSAgICBuYXRpdmVfZGF0YV90ICpuYXQgPSBnZXRfbmF0aXZlX2RhdGEoZW52LCBvYmplY3QpOwotICAgIGludCBzaWduYWxfc2tzWzJdOwotICAgIHB0aHJlYWRfdCB0aHJlYWQ7Ci0gICAgc3RydWN0IHRocmVhZF9kYXRhX3QgKmRhdGEgPSBOVUxMOwotCi0gICAgcHRocmVhZF9tdXRleF9sb2NrKCZuYXQtPm11dGV4KTsKLSAgICBpZiAobmF0LT5zaWduYWxfc2sgIT0gLTEpIHsKLSAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm5hdC0+bXV0ZXgpOwotICAgICAgICByZXR1cm4gSk5JX0ZBTFNFOwotICAgIH0KLQotICAgIC8vIHNldHVwIHNvY2tldHBhaXIgdG8gcGFzcyBtZXNzYWdlcyBiZXR3ZWVuIHRocmVhZHMKLSAgICBpZiAoc29ja2V0cGFpcihBRl9VTklYLCBTT0NLX1NUUkVBTSwgMCwgc2lnbmFsX3NrcykgPCAwKSB7Ci0gICAgICAgIExPR0UoIiVzOiBzb2NrZXRwYWlyKCkgZmFpbGVkOiAlcyIsIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm5hdC0+bXV0ZXgpOwotICAgICAgICByZXR1cm4gSk5JX0ZBTFNFOwotICAgIH0KLSAgICBuYXQtPnNpZ25hbF9zayA9IHNpZ25hbF9za3NbMF07Ci0gICAgbmF0LT5vYmplY3QgPSBlbnYtPk5ld0dsb2JhbFJlZihvYmplY3QpOwotCi0gICAgZGF0YSA9ICh0aHJlYWRfZGF0YV90ICopY2FsbG9jKDEsIHNpemVvZih0aHJlYWRfZGF0YV90KSk7Ci0gICAgaWYgKGRhdGEgPT0gTlVMTCkgewotICAgICAgICBMT0dFKCIlczogb3V0IG9mIG1lbW9yeSIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZuYXQtPm11dGV4KTsKLSAgICAgICAgcmV0dXJuIEpOSV9GQUxTRTsKLSAgICB9Ci0gICAgbmF0LT50aHJlYWRfZGF0YSA9IGRhdGE7Ci0gICAgcHRocmVhZF9tdXRleF91bmxvY2soJm5hdC0+bXV0ZXgpOwotCi0gICAgZGF0YS0+c2lnbmFsX3NrID0gc2lnbmFsX3Nrc1sxXTsKLSAgICBkYXRhLT5uYXQgPSBuYXQ7Ci0gICAgZGF0YS0+aXNfYWNjZXB0ID0gdHJ1ZTsKLQotICAgIGlmIChwdGhyZWFkX2NyZWF0ZSgmdGhyZWFkLCBOVUxMLCAmd29ya190aHJlYWQsICh2b2lkICopZGF0YSkgPCAwKSB7Ci0gICAgICAgIExPR0UoIiVzOiBwdGhyZWFkX2NyZWF0ZSgpIGZhaWxlZDogJXMiLCBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgIHJldHVybiBKTklfRkFMU0U7Ci0gICAgfQotICAgIHJldHVybiBKTklfVFJVRTsKLQotI2VuZGlmCi0gICAgcmV0dXJuIEpOSV9GQUxTRTsKLX0KLQotc3RhdGljIGpib29sZWFuIGNvbm5lY3ROYXRpdmUoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqZWN0LCBqc3RyaW5nIGFkZHJlc3MsCi0gICAgICAgIGpzdHJpbmcgbmFtZSkgewotCi0gICAgTE9HVihfX0ZVTkNUSU9OX18pOwotI2lmZGVmIEhBVkVfQkxVRVRPT1RICi0gICAgbmF0aXZlX2RhdGFfdCAqbmF0ID0gZ2V0X25hdGl2ZV9kYXRhKGVudiwgb2JqZWN0KTsKLSAgICBpbnQgc2lnbmFsX3Nrc1syXTsKLSAgICBwdGhyZWFkX3QgdGhyZWFkOwotICAgIHN0cnVjdCB0aHJlYWRfZGF0YV90ICpkYXRhOwotICAgIGNvbnN0IGNoYXIgKmNfYWRkcmVzczsKLSAgICBjb25zdCBjaGFyICpjX25hbWU7Ci0KLSAgICBwdGhyZWFkX211dGV4X2xvY2soJm5hdC0+bXV0ZXgpOwotICAgIGlmIChuYXQtPnNpZ25hbF9zayAhPSAtMSkgewotICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbmF0LT5tdXRleCk7Ci0gICAgICAgIHJldHVybiBKTklfRkFMU0U7Ci0gICAgfQotCi0gICAgLy8gc2V0dXAgc29ja2V0cGFpciB0byBwYXNzIG1lc3NhZ2VzIGJldHdlZW4gdGhyZWFkcwotICAgIGlmIChzb2NrZXRwYWlyKEFGX1VOSVgsIFNPQ0tfU1RSRUFNLCAwLCBzaWduYWxfc2tzKSA8IDApIHsKLSAgICAgICAgTE9HRSgiJXM6IHNvY2tldHBhaXIoKSBmYWlsZWQ6ICVzXG4iLCBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZuYXQtPm11dGV4KTsKLSAgICAgICAgcmV0dXJuIEpOSV9GQUxTRTsKLSAgICB9Ci0gICAgbmF0LT5zaWduYWxfc2sgPSBzaWduYWxfc2tzWzBdOwotICAgIG5hdC0+b2JqZWN0ID0gZW52LT5OZXdHbG9iYWxSZWYob2JqZWN0KTsKLQotICAgIGRhdGEgPSAodGhyZWFkX2RhdGFfdCAqKWNhbGxvYygxLCBzaXplb2YodGhyZWFkX2RhdGFfdCkpOwotICAgIGlmIChkYXRhID09IE5VTEwpIHsKLSAgICAgICAgTE9HRSgiJXM6IG91dCBvZiBtZW1vcnkiLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbmF0LT5tdXRleCk7Ci0gICAgICAgIHJldHVybiBKTklfRkFMU0U7Ci0gICAgfQotICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZuYXQtPm11dGV4KTsKLQotICAgIGRhdGEtPnNpZ25hbF9zayA9IHNpZ25hbF9za3NbMV07Ci0gICAgZGF0YS0+bmF0ID0gbmF0OwotICAgIGNfYWRkcmVzcyA9IGVudi0+R2V0U3RyaW5nVVRGQ2hhcnMoYWRkcmVzcywgTlVMTCk7Ci0gICAgc3RybGNweShkYXRhLT5hZGRyZXNzLCBjX2FkZHJlc3MsIEJUQUREUl9TSVpFKTsKLSAgICBlbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhhZGRyZXNzLCBjX2FkZHJlc3MpOwotICAgIGRhdGEtPmlzX2FjY2VwdCA9IGZhbHNlOwotCi0gICAgaWYgKG5hbWUgPT0gTlVMTCkgewotICAgICAgICBMT0dFKCIlczogTnVsbCBwb2ludGVyIHBhc3NlZCBpbiBmb3IgZGV2aWNlIG5hbWUiLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICBkYXRhLT5zY29fcGt0X3R5cGUgPSAwOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGNfbmFtZSA9IGVudi0+R2V0U3RyaW5nVVRGQ2hhcnMobmFtZSwgTlVMTCk7Ci0gICAgICAgIC8qIFNlZSBpZiB0aGlzIGRldmljZSBpcyBpbiB0aGUgYmxhY2sgbGlzdCAqLwotICAgICAgICBkYXRhLT5zY29fcGt0X3R5cGUgPSBnZXRTY29UeXBlKGRhdGEtPmFkZHJlc3MsIGNfbmFtZSk7Ci0gICAgICAgIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKG5hbWUsIGNfbmFtZSk7Ci0gICAgfQotICAgIGlmIChwdGhyZWFkX2NyZWF0ZSgmdGhyZWFkLCBOVUxMLCAmd29ya190aHJlYWQsICh2b2lkICopZGF0YSkgPCAwKSB7Ci0gICAgICAgIExPR0UoIiVzOiBwdGhyZWFkX2NyZWF0ZSgpIGZhaWxlZDogJXMiLCBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgIHJldHVybiBKTklfRkFMU0U7Ci0gICAgfQotICAgIHJldHVybiBKTklfVFJVRTsKLQotI2VuZGlmCi0gICAgcmV0dXJuIEpOSV9GQUxTRTsKLX0KLQotc3RhdGljIHZvaWQgY2xvc2VOYXRpdmUoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqZWN0KSB7Ci0gICAgTE9HVihfX0ZVTkNUSU9OX18pOwotI2lmZGVmIEhBVkVfQkxVRVRPT1RICi0gICAgbmF0aXZlX2RhdGFfdCAqbmF0ID0gZ2V0X25hdGl2ZV9kYXRhKGVudiwgb2JqZWN0KTsKLSAgICBpbnQgc2lnbmFsX3NrOwotCi0gICAgcHRocmVhZF9tdXRleF9sb2NrKCZuYXQtPm11dGV4KTsKLSAgICBzaWduYWxfc2sgPSBuYXQtPnNpZ25hbF9zazsKLSAgICBuYXQtPnNpZ25hbF9zayA9IC0xOwotICAgIGVudi0+RGVsZXRlR2xvYmFsUmVmKG5hdC0+b2JqZWN0KTsKLSAgICBuYXQtPm9iamVjdCA9IE5VTEw7Ci0gICAgcHRocmVhZF9tdXRleF91bmxvY2soJm5hdC0+bXV0ZXgpOwotCi0gICAgaWYgKHNpZ25hbF9zayA+PSAwKSB7Ci0gICAgICAgIExPR1YoIiVzOiBzaWduYWxfc2sgPSAlZCIsIF9fRlVOQ1RJT05fXywgc2lnbmFsX3NrKTsKLSAgICAgICAgdW5zaWduZWQgY2hhciBkdW1teTsKLSAgICAgICAgd3JpdGUoc2lnbmFsX3NrLCAmZHVtbXksIHNpemVvZihkdW1teSkpOwotICAgICAgICBjbG9zZShzaWduYWxfc2spOwotICAgIH0KLSNlbmRpZgotfQotCi0jaWZkZWYgSEFWRV9CTFVFVE9PVEgKLS8qIHRocmVhZCBlbnRyeSBwb2ludCAqLwotc3RhdGljIHZvaWQgKndvcmtfdGhyZWFkKHZvaWQgKmFyZykgewotICAgIEpOSUVudiogZW52OwotICAgIHRocmVhZF9kYXRhX3QgKmRhdGEgPSAodGhyZWFkX2RhdGFfdCAqKWFyZzsKLSAgICBpbnQgc2s7Ci0KLSAgICBMT0dWKF9fRlVOQ1RJT05fXyk7Ci0gICAgaWYgKGp2bS0+QXR0YWNoQ3VycmVudFRocmVhZCgmZW52LCBOVUxMKSAhPSBKTklfT0spIHsKLSAgICAgICAgTE9HRSgiJXM6IEF0dGFjaEN1cnJlbnRUaHJlYWQoKSBmYWlsZWQiLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICAvKiBjb25uZWN0IHRoZSBTQ08gc29ja2V0ICovCi0gICAgaWYgKGRhdGEtPmlzX2FjY2VwdCkgewotICAgICAgICBMT0dWKCJTQ08gT0JKRUNUICVwIEFDQ0VQVCAjIyMjIyIsIGRhdGEtPm5hdC0+b2JqZWN0KTsKLSAgICAgICAgc2sgPSBhY2NlcHRfd29yayhkYXRhLT5zaWduYWxfc2spOwotICAgICAgICBMT0dWKCJTQ08gT0JKRUNUICVwIEVORCBBQ0NFUFQgKioqKioiLCBkYXRhLT5uYXQtPm9iamVjdCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc2sgPSBjb25uZWN0X3dvcmsoZGF0YS0+YWRkcmVzcywgZGF0YS0+c2NvX3BrdF90eXBlKTsKLSAgICB9Ci0KLSAgICAvKiBjYWxsYmFjayB3aXRoIGNvbm5lY3Rpb24gcmVzdWx0ICovCi0gICAgaWYgKGRhdGEtPm5hdCA9PSBOVUxMKSB7Ci0gICAgICAgIExPR1YoIiVzOiBvYmplY3QgZGVzdHJveWVkISIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIGdvdG8gZG9uZTsKLSAgICB9Ci0gICAgcHRocmVhZF9tdXRleF9sb2NrKCZkYXRhLT5uYXQtPm11dGV4KTsKLSAgICBpZiAoZGF0YS0+bmF0LT5vYmplY3QgPT0gTlVMTCkgewotICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmZGF0YS0+bmF0LT5tdXRleCk7Ci0gICAgICAgIExPR1YoIiVzOiBjYWxsYmFjayBjYW5jZWxsZWQiLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICBnb3RvIGRvbmU7Ci0gICAgfQotICAgIGlmIChkYXRhLT5pc19hY2NlcHQpIHsKLSAgICAgICAgZW52LT5DYWxsVm9pZE1ldGhvZChkYXRhLT5uYXQtPm9iamVjdCwgbWV0aG9kX29uQWNjZXB0ZWQsIHNrKTsKLSAgICB9IGVsc2UgewotICAgICAgICBlbnYtPkNhbGxWb2lkTWV0aG9kKGRhdGEtPm5hdC0+b2JqZWN0LCBtZXRob2Rfb25Db25uZWN0ZWQsIHNrKTsKLSAgICB9Ci0gICAgcHRocmVhZF9tdXRleF91bmxvY2soJmRhdGEtPm5hdC0+bXV0ZXgpOwotCi0gICAgaWYgKHNrIDwgMCkgewotICAgICAgICBnb3RvIGRvbmU7Ci0gICAgfQotCi0gICAgTE9HVigiU0NPIE9CSkVDVCAlcCAlZCBDT05ORUNURUQgKysrICglcykiLCBkYXRhLT5uYXQtPm9iamVjdCwgc2ssCi0gICAgICAgICBkYXRhLT5pc19hY2NlcHQgPyAiaW4iIDogIm91dCIpOwotCi0gICAgLyogd2FpdCBmb3IgdGhlIHNvY2tldCB0byBjbG9zZSAqLwotICAgIExPR1YoIndhaXRfZm9yX2Nsb3NlKCkuLi4iKTsKLSAgICB3YWl0X2Zvcl9jbG9zZShzaywgZGF0YS0+c2lnbmFsX3NrKTsKLSAgICBMT0dWKCJ3YWl0X2Zvcl9jbG9zZSgpIHJldHVybmVkIik7Ci0KLSAgICAvKiBjYWxsYmFjayB3aXRoIGNsb3NlIHJlc3VsdCAqLwotICAgIGlmIChkYXRhLT5uYXQgPT0gTlVMTCkgewotICAgICAgICBMT0dWKCIlczogb2JqZWN0IGRlc3Ryb3llZCEiLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICBnb3RvIGRvbmU7Ci0gICAgfQotICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmZGF0YS0+bmF0LT5tdXRleCk7Ci0gICAgaWYgKGRhdGEtPm5hdC0+b2JqZWN0ID09IE5VTEwpIHsKLSAgICAgICAgTE9HVigiJXM6IGNhbGxiYWNrIGNhbmNlbGxlZCIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZW52LT5DYWxsVm9pZE1ldGhvZChkYXRhLT5uYXQtPm9iamVjdCwgbWV0aG9kX29uQ2xvc2VkKTsKLSAgICB9Ci0gICAgcHRocmVhZF9tdXRleF91bmxvY2soJmRhdGEtPm5hdC0+bXV0ZXgpOwotCi1kb25lOgotICAgIGlmIChzayA+PSAwKSB7Ci0gICAgICAgIGNsb3NlKHNrKTsKLSAgICAgICAgTE9HVigiU0NPIE9CSkVDVCAlcCAlZCBDTE9TRUQgLS0tICglcykiLCBkYXRhLT5uYXQtPm9iamVjdCwgc2ssIGRhdGEtPmlzX2FjY2VwdCA/ICJpbiIgOiAib3V0Iik7Ci0gICAgfQotICAgIGlmIChkYXRhLT5zaWduYWxfc2sgPj0gMCkgewotICAgICAgICBjbG9zZShkYXRhLT5zaWduYWxfc2spOwotICAgIH0KLSAgICBMT0dWKCJTQ08gc29ja2V0IGNsb3NlZCIpOwotCi0gICAgaWYgKGRhdGEtPm5hdCAhPSBOVUxMKSB7Ci0gICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmZGF0YS0+bmF0LT5tdXRleCk7Ci0gICAgICAgIGVudi0+RGVsZXRlR2xvYmFsUmVmKGRhdGEtPm5hdC0+b2JqZWN0KTsKLSAgICAgICAgZGF0YS0+bmF0LT5vYmplY3QgPSBOVUxMOwotICAgICAgICBkYXRhLT5uYXQtPnRocmVhZF9kYXRhID0gTlVMTDsKLSAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmRhdGEtPm5hdC0+bXV0ZXgpOwotICAgIH0KLQotICAgIGZyZWUoZGF0YSk7Ci0gICAgaWYgKGp2bS0+RGV0YWNoQ3VycmVudFRocmVhZCgpICE9IEpOSV9PSykgewotICAgICAgICBMT0dFKCIlczogRGV0YWNoQ3VycmVudFRocmVhZCgpIGZhaWxlZCIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgfQotCi0gICAgTE9HVigid29ya190aHJlYWQoKSBkb25lIik7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBpbnQgYWNjZXB0X3dvcmsoaW50IHNpZ25hbF9zaykgewotICAgIExPR1YoX19GVU5DVElPTl9fKTsKLSAgICBpbnQgc2s7Ci0gICAgaW50IG5zazsKLSAgICBpbnQgYWRkcl9zejsKLSAgICBpbnQgbWF4X2ZkOwotICAgIGZkX3NldCBmZHM7Ci0gICAgc3RydWN0IHNvY2thZGRyX3NjbyBhZGRyOwotCi0gICAgc2sgPSBzb2NrZXQoUEZfQkxVRVRPT1RILCBTT0NLX1NFUVBBQ0tFVCwgQlRQUk9UT19TQ08pOwotICAgIGlmIChzayA8IDApIHsKLSAgICAgICAgTE9HRSgiJXMgc29ja2V0KCkgZmFpbGVkOiAlcyIsIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIG1lbXNldCgmYWRkciwgMCwgc2l6ZW9mKGFkZHIpKTsKLSAgICBhZGRyLnNjb19mYW1pbHkgPSBBRl9CTFVFVE9PVEg7Ci0gICAgbWVtY3B5KCZhZGRyLnNjb19iZGFkZHIsIEJEQUREUl9BTlksIHNpemVvZihiZGFkZHJfdCkpOwotICAgIGlmIChiaW5kKHNrLCAoc3RydWN0IHNvY2thZGRyICopICZhZGRyLCBzaXplb2YoYWRkcikpIDwgMCkgewotICAgICAgICBMT0dFKCIlcyBiaW5kKCkgZmFpbGVkOiAlcyIsIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgZ290byBlcnJvcjsKLSAgICB9Ci0KLSAgICBpZiAobGlzdGVuKHNrLCAxKSkgewotICAgICAgICBMT0dFKCIlczogbGlzdGVuKCkgZmFpbGVkOiAlcyIsIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgZ290byBlcnJvcjsKLSAgICB9Ci0KLSAgICBtZW1zZXQoJmFkZHIsIDAsIHNpemVvZihhZGRyKSk7Ci0gICAgYWRkcl9zeiA9IHNpemVvZihhZGRyKTsKLQotICAgIEZEX1pFUk8oJmZkcyk7Ci0gICAgRkRfU0VUKHNrLCAmZmRzKTsKLSAgICBGRF9TRVQoc2lnbmFsX3NrLCAmZmRzKTsKLQotICAgIG1heF9mZCA9IChzayA+IHNpZ25hbF9zaykgPyBzayA6IHNpZ25hbF9zazsKLSAgICBMT0dJKCJMaXN0ZW5pbmcgU0NPIHNvY2tldC4uLiIpOwotICAgIHdoaWxlIChzZWxlY3QobWF4X2ZkICsgMSwgJmZkcywgTlVMTCwgTlVMTCwgTlVMTCkgPCAwKSB7Ci0gICAgICAgIGlmIChlcnJubyAhPSBFSU5UUikgewotICAgICAgICAgICAgTE9HRSgiJXM6IHNlbGVjdCgpIGZhaWxlZDogJXMiLCBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgICAgICBnb3RvIGVycm9yOwotICAgICAgICB9Ci0gICAgICAgIExPR1YoIiVzOiBzZWxlY3QoKSBFSU5UUiwgcmV0cnlpbmciLCBfX0ZVTkNUSU9OX18pOwotICAgIH0KLSAgICBMT0dWKCJzZWxlY3QoKSByZXR1cm5lZCIpOwotICAgIGlmIChGRF9JU1NFVChzaWduYWxfc2ssICZmZHMpKSB7Ci0gICAgICAgIC8vIHNpZ25hbCB0byBjYW5jZWwgbGlzdGVuaW5nCi0gICAgICAgIExPR1YoImNhbmNlbGxlZCBsaXN0ZW5pbmcgc29ja2V0LCBjbG9zaW5nIik7Ci0gICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgfQotICAgIGlmICghRkRfSVNTRVQoc2ssICZmZHMpKSB7Ci0gICAgICAgIExPR0UoImVycm9yOiBzZWxlY3QoKSByZXR1cm5lZCA+PSAwIHdpdGggbm8gZmRzIHNldCIpOwotICAgICAgICBnb3RvIGVycm9yOwotICAgIH0KLQotICAgIG5zayA9IGFjY2VwdChzaywgKHN0cnVjdCBzb2NrYWRkciAqKSZhZGRyLCAmYWRkcl9zeik7Ci0gICAgaWYgKG5zayA8IDApIHsKLSAgICAgICAgTE9HRSgiJXM6IGFjY2VwdCgpIGZhaWxlZDogJXMiLCBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgfQotICAgIExPR0koIkNvbm5lY3RlZCBTQ08gc29ja2V0IChpbmNvbWluZykiKTsKLSAgICBjbG9zZShzayk7ICAvLyBUaGUgbGlzdGVuaW5nIHNvY2tldAotCi0gICAgcmV0dXJuIG5zazsKLQotZXJyb3I6Ci0gICAgY2xvc2Uoc2spOwotCi0gICAgcmV0dXJuIC0xOwotfQotCi1zdGF0aWMgaW50IGNvbm5lY3Rfd29yayhjb25zdCBjaGFyICphZGRyZXNzLCB1aW50MTZfdCBzY29fcGt0X3R5cGUpIHsKLSAgICBMT0dWKF9fRlVOQ1RJT05fXyk7Ci0gICAgc3RydWN0IHNvY2thZGRyX3NjbyBhZGRyOwotICAgIGludCBzayA9IC0xOwotCi0gICAgc2sgPSBzb2NrZXQoUEZfQkxVRVRPT1RILCBTT0NLX1NFUVBBQ0tFVCwgQlRQUk9UT19TQ08pOwotICAgIGlmIChzayA8IDApIHsKLSAgICAgICAgTE9HRSgiJXM6IHNvY2tldCgpIGZhaWxlZDogJXMiLCBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICAvKiBCaW5kIHRvIGxvY2FsIGFkZHJlc3MgKi8KLSAgICBtZW1zZXQoJmFkZHIsIDAsIHNpemVvZihhZGRyKSk7Ci0gICAgYWRkci5zY29fZmFtaWx5ID0gQUZfQkxVRVRPT1RIOwotICAgIG1lbWNweSgmYWRkci5zY29fYmRhZGRyLCBCREFERFJfQU5ZLCBzaXplb2YoYmRhZGRyX3QpKTsKLSAgICBpZiAoYmluZChzaywgKHN0cnVjdCBzb2NrYWRkciAqKSAmYWRkciwgc2l6ZW9mKGFkZHIpKSA8IDApIHsKLSAgICAgICAgTE9HRSgiJXM6IGJpbmQoKSBmYWlsZWQ6ICVzIiwgX19GVU5DVElPTl9fLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICBnb3RvIGVycm9yOwotICAgIH0KLQotICAgIG1lbXNldCgmYWRkciwgMCwgc2l6ZW9mKGFkZHIpKTsKLSAgICBhZGRyLnNjb19mYW1pbHkgPSBBRl9CTFVFVE9PVEg7Ci0gICAgZ2V0X2JkYWRkcihhZGRyZXNzLCAmYWRkci5zY29fYmRhZGRyKTsKLSAgICBhZGRyLnNjb19wa3RfdHlwZSA9IHNjb19wa3RfdHlwZTsKLSAgICBMT0dJKCJDb25uZWN0aW5nIHRvIHNvY2tldCIpOwotICAgIHdoaWxlIChjb25uZWN0KHNrLCAoc3RydWN0IHNvY2thZGRyICopJmFkZHIsIHNpemVvZihhZGRyKSkgPCAwKSB7Ci0gICAgICAgIGlmIChlcnJubyAhPSBFSU5UUikgewotICAgICAgICAgICAgTE9HRSgiJXM6IGNvbm5lY3QoKSBmYWlsZWQ6ICVzIiwgX19GVU5DVElPTl9fLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICAgICAgZ290byBlcnJvcjsKLSAgICAgICAgfQotICAgICAgICBMT0dWKCIlczogY29ubmVjdCgpIEVJTlRSLCByZXRyeWluZyIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgfQotICAgIExPR0koIlNDTyBzb2NrZXQgY29ubmVjdGVkIChvdXRnb2luZykiKTsKLQotICAgIHJldHVybiBzazsKLQotZXJyb3I6Ci0gICAgaWYgKHNrID49IDApIGNsb3NlKHNrKTsKLSAgICByZXR1cm4gLTE7Ci19Ci0KLXN0YXRpYyB2b2lkIHdhaXRfZm9yX2Nsb3NlKGludCBzaywgaW50IHNpZ25hbF9zaykgewotICAgIExPR1YoX19GVU5DVElPTl9fKTsKLSAgICBwb2xsZmQgcFsyXTsKLQotICAgIG1lbXNldChwLCAwLCAyICogc2l6ZW9mKHBvbGxmZCkpOwotICAgIHBbMF0uZmQgPSBzazsKLSAgICBwWzFdLmZkID0gc2lnbmFsX3NrOwotICAgIHBbMV0uZXZlbnRzID0gUE9MTElOIHwgUE9MTFBSSTsKLQotICAgIExPR1YoInBvbGwuLi4iKTsKLQotICAgIHdoaWxlIChwb2xsKHAsIDIsIC0xKSA8IDApIHsgIC8vIGJsb2NrcwotICAgICAgICBpZiAoZXJybm8gIT0gRUlOVFIpIHsKLSAgICAgICAgICAgIExPR0UoIiVzOiBwb2xsKCkgZmFpbGVkOiAlcyIsIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIExPR1YoIiVzOiBwb2xsKCkgRUlOVFIsIHJldHJ5aW5nIiwgX19GVU5DVElPTl9fKTsKLSAgICB9Ci0KLSAgICBMT0dWKCJwb2xsKCkgcmV0dXJuZWQiKTsKLX0KLSNlbmRpZgotCi1zdGF0aWMgSk5JTmF0aXZlTWV0aG9kIHNNZXRob2RzW10gPSB7Ci0gICAgeyJjbGFzc0luaXROYXRpdmUiLCAiKClWIiwgKHZvaWQqKWNsYXNzSW5pdE5hdGl2ZX0sCi0gICAgeyJpbml0TmF0aXZlIiwgIigpViIsICh2b2lkICopaW5pdE5hdGl2ZX0sCi0gICAgeyJkZXN0cm95TmF0aXZlIiwgIigpViIsICh2b2lkICopZGVzdHJveU5hdGl2ZX0sCi0gICAgeyJjb25uZWN0TmF0aXZlIiwgIihMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZzspWiIsICh2b2lkICopY29ubmVjdE5hdGl2ZX0sCi0gICAgeyJhY2NlcHROYXRpdmUiLCAiKClaIiwgKHZvaWQgKilhY2NlcHROYXRpdmV9LAotICAgIHsiY2xvc2VOYXRpdmUiLCAiKClWIiwgKHZvaWQgKiljbG9zZU5hdGl2ZX0sCi19OwotCi1pbnQgcmVnaXN0ZXJfYW5kcm9pZF9ibHVldG9vdGhfU2NvU29ja2V0KEpOSUVudiAqZW52KSB7Ci0gICAgcmV0dXJuIEFuZHJvaWRSdW50aW1lOjpyZWdpc3Rlck5hdGl2ZU1ldGhvZHMoZW52LAotICAgICAgICAgICAgImFuZHJvaWQvYmx1ZXRvb3RoL1Njb1NvY2tldCIsIHNNZXRob2RzLCBORUxFTShzTWV0aG9kcykpOwotfQotCi19IC8qIG5hbWVzcGFjZSBhbmRyb2lkICovCmRpZmYgLS1naXQgYS9jb3JlL2puaS9hbmRyb2lkX2JsdWV0b290aF9jb21tb24uY3BwIGIvY29yZS9qbmkvYW5kcm9pZF9ibHVldG9vdGhfY29tbW9uLmNwcAppbmRleCA0M2MzYTk1Li5hYWUwZjIxIDEwMDY0NAotLS0gYS9jb3JlL2puaS9hbmRyb2lkX2JsdWV0b290aF9jb21tb24uY3BwCisrKyBiL2NvcmUvam5pL2FuZHJvaWRfYmx1ZXRvb3RoX2NvbW1vbi5jcHAKQEAgLTY5LDYgKzY5LDE2IEBACiAgICAgeyJVVUlEcyIsIERCVVNfVFlQRV9BUlJBWX0sCiB9OwogCitzdGF0aWMgUHJvcGVydGllcyBpbnB1dF9wcm9wZXJ0aWVzW10gPSB7CisgICAgeyJDb25uZWN0ZWQiLCBEQlVTX1RZUEVfQk9PTEVBTn0sCit9OworCitzdGF0aWMgUHJvcGVydGllcyBwYW5fcHJvcGVydGllc1tdID0geworICAgIHsiQ29ubmVjdGVkIiwgREJVU19UWVBFX0JPT0xFQU59LAorICAgIHsiSW50ZXJmYWNlIiwgREJVU19UWVBFX1NUUklOR30sCisgICAgeyJVVUlEIiwgREJVU19UWVBFX1NUUklOR30sCit9OworCiB0eXBlZGVmIHVuaW9uIHsKICAgICBjaGFyICpzdHJfdmFsOwogICAgIGludCBpbnRfdmFsOwpAQCAtMTg3LDYgKzE5Nyw3IEBACiAgICAgZGJ1c19ib29sX3QgcmV0OwogICAgIHZhX2xpc3QgbHN0OwogICAgIHZhX3N0YXJ0KGxzdCwgZmlyc3RfYXJnX3R5cGUpOworCiAgICAgcmV0ID0gZGJ1c19mdW5jX2FyZ3NfYXN5bmNfdmFsaXN0KGVudiwgY29ubiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dF9tcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbHksIHVzZXIsIG5hdCwKQEAgLTY5OSw2ICs3MTAsMTYgQEAKICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHJlbW90ZV9kZXZpY2VfcHJvcGVydGllcykgLyBzaXplb2YoUHJvcGVydGllcykpOwogfQogCitqb2JqZWN0QXJyYXkgcGFyc2VfaW5wdXRfcHJvcGVydHlfY2hhbmdlKEpOSUVudiAqZW52LCBEQnVzTWVzc2FnZSAqbXNnKSB7CisgICAgcmV0dXJuIHBhcnNlX3Byb3BlcnR5X2NoYW5nZShlbnYsIG1zZywgKFByb3BlcnRpZXMgKikgJmlucHV0X3Byb3BlcnRpZXMsCisgICAgICAgICAgICAgICAgICAgIHNpemVvZihpbnB1dF9wcm9wZXJ0aWVzKSAvIHNpemVvZihQcm9wZXJ0aWVzKSk7Cit9CisKK2pvYmplY3RBcnJheSBwYXJzZV9wYW5fcHJvcGVydHlfY2hhbmdlKEpOSUVudiAqZW52LCBEQnVzTWVzc2FnZSAqbXNnKSB7CisgICAgcmV0dXJuIHBhcnNlX3Byb3BlcnR5X2NoYW5nZShlbnYsIG1zZywgKFByb3BlcnRpZXMgKikgJnBhbl9wcm9wZXJ0aWVzLAorICAgICAgICAgICAgICAgICAgICBzaXplb2YocGFuX3Byb3BlcnRpZXMpIC8gc2l6ZW9mKFByb3BlcnRpZXMpKTsKK30KKwogam9iamVjdEFycmF5IHBhcnNlX2FkYXB0ZXJfcHJvcGVydGllcyhKTklFbnYgKmVudiwgREJ1c01lc3NhZ2VJdGVyICppdGVyKSB7CiAgICAgcmV0dXJuIHBhcnNlX3Byb3BlcnRpZXMoZW52LCBpdGVyLCAoUHJvcGVydGllcyAqKSAmYWRhcHRlcl9wcm9wZXJ0aWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihhZGFwdGVyX3Byb3BlcnRpZXMpIC8gc2l6ZW9mKFByb3BlcnRpZXMpKTsKQEAgLTcwOSw2ICs3MzAsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHJlbW90ZV9kZXZpY2VfcHJvcGVydGllcykgLyBzaXplb2YoUHJvcGVydGllcykpOwogfQogCitqb2JqZWN0QXJyYXkgcGFyc2VfaW5wdXRfcHJvcGVydGllcyhKTklFbnYgKmVudiwgREJ1c01lc3NhZ2VJdGVyICppdGVyKSB7CisgICAgcmV0dXJuIHBhcnNlX3Byb3BlcnRpZXMoZW52LCBpdGVyLCAoUHJvcGVydGllcyAqKSAmaW5wdXRfcHJvcGVydGllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGlucHV0X3Byb3BlcnRpZXMpIC8gc2l6ZW9mKFByb3BlcnRpZXMpKTsKK30KKwogaW50IGdldF9iZGFkZHIoY29uc3QgY2hhciAqc3RyLCBiZGFkZHJfdCAqYmEpIHsKICAgICBjaGFyICpkID0gKChjaGFyICopYmEpICsgNSwgKmVuZHA7CiAgICAgaW50IGk7CmRpZmYgLS1naXQgYS9jb3JlL2puaS9hbmRyb2lkX2JsdWV0b290aF9jb21tb24uaCBiL2NvcmUvam5pL2FuZHJvaWRfYmx1ZXRvb3RoX2NvbW1vbi5oCmluZGV4IDM3OGJiNmYuLjkyMjJlMWEgMTAwNjQ0Ci0tLSBhL2NvcmUvam5pL2FuZHJvaWRfYmx1ZXRvb3RoX2NvbW1vbi5oCisrKyBiL2NvcmUvam5pL2FuZHJvaWRfYmx1ZXRvb3RoX2NvbW1vbi5oCkBAIC0xNjIsNiArMTYyLDkgQEAKIGpvYmplY3RBcnJheSBwYXJzZV9yZW1vdGVfZGV2aWNlX3Byb3BlcnRpZXMoSk5JRW52ICplbnYsIERCdXNNZXNzYWdlSXRlciAqaXRlcik7CiBqb2JqZWN0QXJyYXkgcGFyc2VfcmVtb3RlX2RldmljZV9wcm9wZXJ0eV9jaGFuZ2UoSk5JRW52ICplbnYsIERCdXNNZXNzYWdlICptc2cpOwogam9iamVjdEFycmF5IHBhcnNlX2FkYXB0ZXJfcHJvcGVydHlfY2hhbmdlKEpOSUVudiAqZW52LCBEQnVzTWVzc2FnZSAqbXNnKTsKK2pvYmplY3RBcnJheSBwYXJzZV9pbnB1dF9wcm9wZXJ0aWVzKEpOSUVudiAqZW52LCBEQnVzTWVzc2FnZUl0ZXIgKml0ZXIpOworam9iamVjdEFycmF5IHBhcnNlX2lucHV0X3Byb3BlcnR5X2NoYW5nZShKTklFbnYgKmVudiwgREJ1c01lc3NhZ2UgKm1zZyk7Citqb2JqZWN0QXJyYXkgcGFyc2VfcGFuX3Byb3BlcnR5X2NoYW5nZShKTklFbnYgKmVudiwgREJ1c01lc3NhZ2UgKm1zZyk7CiB2b2lkIGFwcGVuZF92YXJpYW50KERCdXNNZXNzYWdlSXRlciAqaXRlciwgaW50IHR5cGUsIHZvaWQgKnZhbCk7CiBpbnQgZ2V0X2JkYWRkcihjb25zdCBjaGFyICpzdHIsIGJkYWRkcl90ICpiYSk7CiB2b2lkIGdldF9iZGFkZHJfYXNfc3RyaW5nKGNvbnN0IGJkYWRkcl90ICpiYSwgY2hhciAqc3RyKTsKZGlmZiAtLWdpdCBhL2NvcmUvam5pL2FuZHJvaWRfZGF0YWJhc2VfQ3Vyc29yV2luZG93LmNwcCBiL2NvcmUvam5pL2FuZHJvaWRfZGF0YWJhc2VfQ3Vyc29yV2luZG93LmNwcAppbmRleCA5MTQ0OWJjLi4wNDBkYWMzIDEwMDY0NAotLS0gYS9jb3JlL2puaS9hbmRyb2lkX2RhdGFiYXNlX0N1cnNvcldpbmRvdy5jcHAKKysrIGIvY29yZS9qbmkvYW5kcm9pZF9kYXRhYmFzZV9DdXJzb3JXaW5kb3cuY3BwCkBAIC0yOSw3ICsyOSw3IEBACiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAKLSNpbmNsdWRlICJDdXJzb3JXaW5kb3cuaCIKKyNpbmNsdWRlICJiaW5kZXIvQ3Vyc29yV2luZG93LmgiCiAjaW5jbHVkZSAic3FsaXRlM19leGNlcHRpb24uaCIKICNpbmNsdWRlICJhbmRyb2lkX3V0aWxfQmluZGVyLmgiCiAKQEAgLTIyNSw3MCArMjI1LDYgQEAKICAgICByZXR1cm4gTlVMTDsKIH0KIAotc3RhdGljIGpib29sZWFuIGlzQmxvYl9uYXRpdmUoSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqZWN0LCBqaW50IHJvdywgamludCBjb2x1bW4pCi17Ci0gICAgaW50MzJfdCBlcnI7Ci0gICAgQ3Vyc29yV2luZG93ICogd2luZG93ID0gR0VUX1dJTkRPVyhlbnYsIG9iamVjdCk7Ci1MT0dfV0lORE9XKCJDaGVja2luZyBpZiBjb2x1bW4gaXMgYSBibG9iIG9yIG51bGwgZm9yICVkLCVkIGZyb20gJXAiLCByb3csIGNvbHVtbiwgd2luZG93KTsKLQotICAgIGZpZWxkX3Nsb3RfdCBmaWVsZDsKLSAgICBlcnIgPSB3aW5kb3ctPnJlYWRfZmllbGRfc2xvdChyb3csIGNvbHVtbiwgJmZpZWxkKTsKLSAgICBpZiAoZXJyICE9IDApIHsKLSAgICAgICAgdGhyb3dFeGNlcHRpb25XaXRoUm93Q29sKGVudiwgcm93LCBjb2x1bW4pOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICByZXR1cm4gZmllbGQudHlwZSA9PSBGSUVMRF9UWVBFX0JMT0IgfHwgZmllbGQudHlwZSA9PSBGSUVMRF9UWVBFX05VTEw7Ci19Ci0KLXN0YXRpYyBqYm9vbGVhbiBpc1N0cmluZ19uYXRpdmUoSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqZWN0LCBqaW50IHJvdywgamludCBjb2x1bW4pCi17Ci0gICAgaW50MzJfdCBlcnI7Ci0gICAgQ3Vyc29yV2luZG93ICogd2luZG93ID0gR0VUX1dJTkRPVyhlbnYsIG9iamVjdCk7Ci1MT0dfV0lORE9XKCJDaGVja2luZyBpZiBjb2x1bW4gaXMgYSBzdHJpbmcgb3IgbnVsbCBmb3IgJWQsJWQgZnJvbSAlcCIsIHJvdywgY29sdW1uLCB3aW5kb3cpOwotCi0gICAgZmllbGRfc2xvdF90IGZpZWxkOwotICAgIGVyciA9IHdpbmRvdy0+cmVhZF9maWVsZF9zbG90KHJvdywgY29sdW1uLCAmZmllbGQpOwotICAgIGlmIChlcnIgIT0gMCkgewotICAgICAgICB0aHJvd0V4Y2VwdGlvbldpdGhSb3dDb2woZW52LCByb3csIGNvbHVtbik7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIHJldHVybiBmaWVsZC50eXBlID09IEZJRUxEX1RZUEVfU1RSSU5HIHx8IGZpZWxkLnR5cGUgPT0gRklFTERfVFlQRV9OVUxMOwotfQotCi1zdGF0aWMgamJvb2xlYW4gaXNJbnRlZ2VyX25hdGl2ZShKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QsIGppbnQgcm93LCBqaW50IGNvbHVtbikKLXsKLSAgICBpbnQzMl90IGVycjsKLSAgICBDdXJzb3JXaW5kb3cgKiB3aW5kb3cgPSBHRVRfV0lORE9XKGVudiwgb2JqZWN0KTsKLUxPR19XSU5ET1coIkNoZWNraW5nIGlmIGNvbHVtbiBpcyBhbiBpbnRlZ2VyIGZvciAlZCwlZCBmcm9tICVwIiwgcm93LCBjb2x1bW4sIHdpbmRvdyk7Ci0KLSAgICBmaWVsZF9zbG90X3QgZmllbGQ7Ci0gICAgZXJyID0gd2luZG93LT5yZWFkX2ZpZWxkX3Nsb3Qocm93LCBjb2x1bW4sICZmaWVsZCk7Ci0gICAgaWYgKGVyciAhPSAwKSB7Ci0gICAgICAgIHRocm93RXhjZXB0aW9uV2l0aFJvd0NvbChlbnYsIHJvdywgY29sdW1uKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgcmV0dXJuIGZpZWxkLnR5cGUgPT0gRklFTERfVFlQRV9JTlRFR0VSOwotfQotCi1zdGF0aWMgamJvb2xlYW4gaXNGbG9hdF9uYXRpdmUoSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqZWN0LCBqaW50IHJvdywgamludCBjb2x1bW4pCi17Ci0gICAgaW50MzJfdCBlcnI7Ci0gICAgQ3Vyc29yV2luZG93ICogd2luZG93ID0gR0VUX1dJTkRPVyhlbnYsIG9iamVjdCk7Ci1MT0dfV0lORE9XKCJDaGVja2luZyBpZiBjb2x1bW4gaXMgYSBmbG9hdCBmb3IgJWQsJWQgZnJvbSAlcCIsIHJvdywgY29sdW1uLCB3aW5kb3cpOwotCi0gICAgZmllbGRfc2xvdF90IGZpZWxkOwotICAgIGVyciA9IHdpbmRvdy0+cmVhZF9maWVsZF9zbG90KHJvdywgY29sdW1uLCAmZmllbGQpOwotICAgIGlmIChlcnIgIT0gMCkgewotICAgICAgICB0aHJvd0V4Y2VwdGlvbldpdGhSb3dDb2woZW52LCByb3csIGNvbHVtbik7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIHJldHVybiBmaWVsZC50eXBlID09IEZJRUxEX1RZUEVfRkxPQVQ7Ci19Ci0KIHN0YXRpYyBqc3RyaW5nIGdldFN0cmluZ19uYXRpdmUoSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqZWN0LCBqaW50IHJvdywgamludCBjb2x1bW4pCiB7CiAgICAgaW50MzJfdCBlcnI7CkBAIC00ODcsMTAgKzQyMyw5IEBACiAgICAgfQogfQogCi1zdGF0aWMgamJvb2xlYW4gaXNOdWxsX25hdGl2ZShKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QsIGppbnQgcm93LCBqaW50IGNvbHVtbikKK2Jvb2wgaXNOdWxsX25hdGl2ZShDdXJzb3JXaW5kb3cgKndpbmRvdywgamludCByb3csIGppbnQgY29sdW1uKQogewotICAgIEN1cnNvcldpbmRvdyAqIHdpbmRvdyA9IEdFVF9XSU5ET1coZW52LCBvYmplY3QpOwotTE9HX1dJTkRPVygiQ2hlY2tpbmcgZm9yIE5VTEwgYXQgJWQsJWQgZnJvbSAlcCIsIHJvdywgY29sdW1uLCB3aW5kb3cpOworICAgIExPR19XSU5ET1coIkNoZWNraW5nIGZvciBOVUxMIGF0ICVkLCVkIGZyb20gJXAiLCByb3csIGNvbHVtbiwgd2luZG93KTsKIAogICAgIGJvb2wgaXNOdWxsOwogICAgIGlmICh3aW5kb3ctPmdldE51bGwocm93LCBjb2x1bW4sICZpc051bGwpKSB7CkBAIC02NTIsNiArNTg3LDI2IEBACiAgICAgd2luZG93LT5mcmVlTGFzdFJvdygpOwogfQogCitzdGF0aWMgamludCBnZXRUeXBlX25hdGl2ZShKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QsIGppbnQgcm93LCBqaW50IGNvbHVtbikKK3sKKyAgICBpbnQzMl90IGVycjsKKyAgICBDdXJzb3JXaW5kb3cgKiB3aW5kb3cgPSBHRVRfV0lORE9XKGVudiwgb2JqZWN0KTsKKyAgICBMT0dfV0lORE9XKCJyZXR1cm5pbmcgY29sdW1uIHR5cGUgYWZmaW5pdHkgZm9yICVkLCVkIGZyb20gJXAiLCByb3csIGNvbHVtbiwgd2luZG93KTsKKworICAgIGlmIChpc051bGxfbmF0aXZlKHdpbmRvdywgcm93LCBjb2x1bW4pKSB7CisgICAgICByZXR1cm4gRklFTERfVFlQRV9OVUxMOworICAgIH0KKworICAgIGZpZWxkX3Nsb3RfdCBmaWVsZDsKKyAgICBlcnIgPSB3aW5kb3ctPnJlYWRfZmllbGRfc2xvdChyb3csIGNvbHVtbiwgJmZpZWxkKTsKKyAgICBpZiAoZXJyICE9IDApIHsKKyAgICAgICAgdGhyb3dFeGNlcHRpb25XaXRoUm93Q29sKGVudiwgcm93LCBjb2x1bW4pOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gZmllbGQudHlwZTsKK30KKwogc3RhdGljIEpOSU5hdGl2ZU1ldGhvZCBzTWV0aG9kc1tdID0KIHsKICAgICAgLyogbmFtZSwgc2lnbmF0dXJlLCBmdW5jUHRyICovCkBAIC02NjIsMTEgKzYxNyw5IEBACiAgICAgeyJjbG9zZV9uYXRpdmUiLCAiKClWIiwgKHZvaWQgKiluYXRpdmVfY2xvc2V9LAogICAgIHsiZ2V0TG9uZ19uYXRpdmUiLCAiKElJKUoiLCAodm9pZCAqKWdldExvbmdfbmF0aXZlfSwKICAgICB7ImdldEJsb2JfbmF0aXZlIiwgIihJSSlbQiIsICh2b2lkICopZ2V0QmxvYl9uYXRpdmV9LAotICAgIHsiaXNCbG9iX25hdGl2ZSIsICIoSUkpWiIsICh2b2lkICopaXNCbG9iX25hdGl2ZX0sCiAgICAgeyJnZXRTdHJpbmdfbmF0aXZlIiwgIihJSSlMamF2YS9sYW5nL1N0cmluZzsiLCAodm9pZCAqKWdldFN0cmluZ19uYXRpdmV9LAogICAgIHsiY29weVN0cmluZ1RvQnVmZmVyX25hdGl2ZSIsICIoSUlJTGFuZHJvaWQvZGF0YWJhc2UvQ2hhckFycmF5QnVmZmVyOylbQyIsICh2b2lkICopY29weVN0cmluZ1RvQnVmZmVyX25hdGl2ZX0sCiAgICAgeyJnZXREb3VibGVfbmF0aXZlIiwgIihJSSlEIiwgKHZvaWQgKilnZXREb3VibGVfbmF0aXZlfSwKLSAgICB7ImlzTnVsbF9uYXRpdmUiLCAiKElJKVoiLCAodm9pZCAqKWlzTnVsbF9uYXRpdmV9LAogICAgIHsiZ2V0TnVtUm93c19uYXRpdmUiLCAiKClJIiwgKHZvaWQgKilnZXROdW1Sb3dzfSwKICAgICB7InNldE51bUNvbHVtbnNfbmF0aXZlIiwgIihJKVoiLCAodm9pZCAqKXNldE51bUNvbHVtbnN9LAogICAgIHsiYWxsb2NSb3dfbmF0aXZlIiwgIigpWiIsICh2b2lkICopYWxsb2NSb3d9LApAQCAtNjc2LDkgKzYyOSw3IEBACiAgICAgeyJwdXREb3VibGVfbmF0aXZlIiwgIihESUkpWiIsICh2b2lkICopcHV0RG91YmxlX25hdGl2ZX0sCiAgICAgeyJmcmVlTGFzdFJvd19uYXRpdmUiLCAiKClWIiwgKHZvaWQgKilmcmVlTGFzdFJvd30sCiAgICAgeyJwdXROdWxsX25hdGl2ZSIsICIoSUkpWiIsICh2b2lkICopcHV0TnVsbF9uYXRpdmV9LAotICAgIHsiaXNTdHJpbmdfbmF0aXZlIiwgIihJSSlaIiwgKHZvaWQgKilpc1N0cmluZ19uYXRpdmV9LAotICAgIHsiaXNGbG9hdF9uYXRpdmUiLCAiKElJKVoiLCAodm9pZCAqKWlzRmxvYXRfbmF0aXZlfSwKLSAgICB7ImlzSW50ZWdlcl9uYXRpdmUiLCAiKElJKVoiLCAodm9pZCAqKWlzSW50ZWdlcl9uYXRpdmV9LAorICAgIHsiZ2V0VHlwZV9uYXRpdmUiLCAiKElJKUkiLCAodm9pZCAqKWdldFR5cGVfbmF0aXZlfSwKIH07CiAKIGludCByZWdpc3Rlcl9hbmRyb2lkX2RhdGFiYXNlX0N1cnNvcldpbmRvdyhKTklFbnYgKiBlbnYpCmRpZmYgLS1naXQgYS9jb3JlL2puaS9hbmRyb2lkX2RhdGFiYXNlX1NRTGl0ZUNvbXBpbGVkU3FsLmNwcCBiL2NvcmUvam5pL2FuZHJvaWRfZGF0YWJhc2VfU1FMaXRlQ29tcGlsZWRTcWwuY3BwCmluZGV4IDhkMWMzOWUuLmRlNGM1YzggMTAwNjQ0Ci0tLSBhL2NvcmUvam5pL2FuZHJvaWRfZGF0YWJhc2VfU1FMaXRlQ29tcGlsZWRTcWwuY3BwCisrKyBiL2NvcmUvam5pL2FuZHJvaWRfZGF0YWJhc2VfU1FMaXRlQ29tcGlsZWRTcWwuY3BwCkBAIC05MSwyMiArOTEsMTEgQEAKICAgICBjb21waWxlKGVudiwgb2JqZWN0LCBHRVRfSEFORExFKGVudiwgb2JqZWN0KSwgc3FsU3RyaW5nKTsKIH0KIAotc3RhdGljIHZvaWQgbmF0aXZlX2ZpbmFsaXplKEpOSUVudiogZW52LCBqb2JqZWN0IG9iamVjdCkKLXsKLSAgICBpbnQgZXJyOwotICAgIHNxbGl0ZTNfc3RtdCAqIHN0YXRlbWVudCA9IEdFVF9TVEFURU1FTlQoZW52LCBvYmplY3QpOwotCi0gICAgaWYgKHN0YXRlbWVudCAhPSBOVUxMKSB7Ci0gICAgICAgIHNxbGl0ZTNfZmluYWxpemUoc3RhdGVtZW50KTsKLSAgICAgICAgZW52LT5TZXRJbnRGaWVsZChvYmplY3QsIGdTdGF0ZW1lbnRGaWVsZCwgMCk7Ci0gICAgfQotfQogCiBzdGF0aWMgSk5JTmF0aXZlTWV0aG9kIHNNZXRob2RzW10gPQogewogICAgICAvKiBuYW1lLCBzaWduYXR1cmUsIGZ1bmNQdHIgKi8KICAgICB7Im5hdGl2ZV9jb21waWxlIiwgIihMamF2YS9sYW5nL1N0cmluZzspViIsICh2b2lkICopbmF0aXZlX2NvbXBpbGV9LAotICAgIHsibmF0aXZlX2ZpbmFsaXplIiwgIigpViIsICh2b2lkICopbmF0aXZlX2ZpbmFsaXplfSwKIH07CiAKIGludCByZWdpc3Rlcl9hbmRyb2lkX2RhdGFiYXNlX1NRTGl0ZUNvbXBpbGVkU3FsKEpOSUVudiAqIGVudikKZGlmZiAtLWdpdCBhL2NvcmUvam5pL2FuZHJvaWRfZGF0YWJhc2VfU1FMaXRlRGF0YWJhc2UuY3BwIGIvY29yZS9qbmkvYW5kcm9pZF9kYXRhYmFzZV9TUUxpdGVEYXRhYmFzZS5jcHAKaW5kZXggMzYyMzRhOS4uNGIzZjFjMCAxMDA2NDQKLS0tIGEvY29yZS9qbmkvYW5kcm9pZF9kYXRhYmFzZV9TUUxpdGVEYXRhYmFzZS5jcHAKKysrIGIvY29yZS9qbmkvYW5kcm9pZF9kYXRhYmFzZV9TUUxpdGVEYXRhYmFzZS5jcHAKQEAgLTE1LDcgKzE1LDcgQEAKICAqLwogCiAjdW5kZWYgTE9HX1RBRwotI2RlZmluZSBMT0dfVEFHICJEYXRhYmFzZSIKKyNkZWZpbmUgTE9HX1RBRyAiU3FsaXRlRGF0YWJhc2VDcHAiCiAKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CkBAIC02Miw5ICs2MiwxMSBAQAogfTsKIAogc3RhdGljIGpmaWVsZElEIG9mZnNldF9kYl9oYW5kbGU7CitzdGF0aWMgam1ldGhvZElEIG1ldGhvZF9jdXN0b21fZnVuY3Rpb25fY2FsbGJhY2s7CitzdGF0aWMgamNsYXNzIHN0cmluZ19jbGFzcyA9IE5VTEw7CiAKLXN0YXRpYyBjaGFyICpjcmVhdGVTdHIoY29uc3QgY2hhciAqcGF0aCkgewotICAgIGludCBsZW4gPSBzdHJsZW4ocGF0aCk7CitzdGF0aWMgY2hhciAqY3JlYXRlU3RyKGNvbnN0IGNoYXIgKnBhdGgsIHNob3J0IGV4dHJhKSB7CisgICAgaW50IGxlbiA9IHN0cmxlbihwYXRoKSArIGV4dHJhOwogICAgIGNoYXIgKnN0ciA9IChjaGFyICopbWFsbG9jKGxlbiArIDEpOwogICAgIHN0cm5jcHkoc3RyLCBwYXRoLCBsZW4pOwogICAgIHN0cltsZW5dID0gTlVMTDsKQEAgLTg1LDcgKzg3LDcgQEAKICAgICB9CiAKICAgICBMT0dWKCJSZWdpc3RlcmluZyBzcWxpdGUgbG9nZ2luZyBmdW5jIFxuIik7Ci0gICAgaW50IGVyciA9IHNxbGl0ZTNfY29uZmlnKFNRTElURV9DT05GSUdfTE9HLCAmc3FsTG9nZ2VyLCAodm9pZCAqKWNyZWF0ZVN0cihwYXRoKSk7CisgICAgaW50IGVyciA9IHNxbGl0ZTNfY29uZmlnKFNRTElURV9DT05GSUdfTE9HLCAmc3FsTG9nZ2VyLCAodm9pZCAqKWNyZWF0ZVN0cihwYXRoLCAwKSk7CiAgICAgaWYgKGVyciAhPSBTUUxJVEVfT0spIHsKICAgICAgICAgTE9HRSgic3FsaXRlX2NvbmZpZyBmYWlsZWQgZXJyb3JfY29kZSA9ICVkLiBUSElTIFNIT1VMRCBORVZFUiBvY2N1ci5cbiIsIGVycik7CiAgICAgICAgIHJldHVybjsKQEAgLTE3NiwxMyArMTc4LDE3IEBACiAgICAgaWYgKGhhbmRsZSAhPSBOVUxMKSBzcWxpdGUzX2Nsb3NlKGhhbmRsZSk7CiB9CiAKLXN0YXRpYyBjaGFyICpnZXREYXRhYmFzZU5hbWUoSk5JRW52KiBlbnYsIHNxbGl0ZTMgKiBoYW5kbGUsIGpzdHJpbmcgZGF0YWJhc2VOYW1lKSB7CitzdGF0aWMgY2hhciAqZ2V0RGF0YWJhc2VOYW1lKEpOSUVudiogZW52LCBzcWxpdGUzICogaGFuZGxlLCBqc3RyaW5nIGRhdGFiYXNlTmFtZSwgc2hvcnQgY29ubk51bSkgewogICAgIGNoYXIgY29uc3QgKnBhdGggPSBlbnYtPkdldFN0cmluZ1VURkNoYXJzKGRhdGFiYXNlTmFtZSwgTlVMTCk7CiAgICAgaWYgKHBhdGggPT0gTlVMTCkgewogICAgICAgICBMT0dFKCJGYWlsdXJlIGluIGdldERhdGFiYXNlTmFtZSgpLiBWTSByYW4gb3V0IG9mIG1lbW9yeT9cbiIpOwogICAgICAgICByZXR1cm4gTlVMTDsgLy8gVk0gd291bGQgaGF2ZSB0aHJvd24gT3V0T2ZNZW1vcnlFcnJvcgogICAgIH0KLSAgICBjaGFyICpkYk5hbWVTdHIgPSBjcmVhdGVTdHIocGF0aCk7CisgICAgY2hhciAqZGJOYW1lU3RyID0gY3JlYXRlU3RyKHBhdGgsIDQpOworICAgIGlmIChjb25uTnVtID4gOTk5KSB7IC8vIFRPRE86IGlmIG51bWJlciBvZiBwb29sZWQgY29ubmVjdGlvbnMgPiA5OTksIGZpeCB0aGlzIGxpbmUuCisgICAgICBjb25uTnVtID0gLTE7CisgICAgfQorICAgIHNwcmludGYoZGJOYW1lU3RyICsgc3RybGVuKHBhdGgpLCAifCUwM2QiLCBjb25uTnVtKTsKICAgICBlbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhkYXRhYmFzZU5hbWUsIHBhdGgpOwogICAgIHJldHVybiBkYk5hbWVTdHI7CiB9CkBAIC0xOTIsMTAgKzE5OCwxMCBAQAogfQogCiAvKiBwdWJsaWMgbmF0aXZlIHZvaWQgZW5hYmxlU3FsVHJhY2luZygpOyAqLwotc3RhdGljIHZvaWQgZW5hYmxlU3FsVHJhY2luZyhKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QsIGpzdHJpbmcgZGF0YWJhc2VOYW1lKQorc3RhdGljIHZvaWQgZW5hYmxlU3FsVHJhY2luZyhKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QsIGpzdHJpbmcgZGF0YWJhc2VOYW1lLCBqc2hvcnQgY29ublR5cGUpCiB7CiAgICAgc3FsaXRlMyAqIGhhbmRsZSA9IChzcWxpdGUzICopZW52LT5HZXRJbnRGaWVsZChvYmplY3QsIG9mZnNldF9kYl9oYW5kbGUpOwotICAgIHNxbGl0ZTNfdHJhY2UoaGFuZGxlLCAmc3FsVHJhY2UsICh2b2lkICopZ2V0RGF0YWJhc2VOYW1lKGVudiwgaGFuZGxlLCBkYXRhYmFzZU5hbWUpKTsKKyAgICBzcWxpdGUzX3RyYWNlKGhhbmRsZSwgJnNxbFRyYWNlLCAodm9pZCAqKWdldERhdGFiYXNlTmFtZShlbnYsIGhhbmRsZSwgZGF0YWJhc2VOYW1lLCBjb25uVHlwZSkpOwogfQogCiBzdGF0aWMgdm9pZCBzcWxQcm9maWxlKHZvaWQgKmRhdGFiYXNlTmFtZSwgY29uc3QgY2hhciAqc3FsLCBzcWxpdGUzX3VpbnQ2NCB0bSkgewpAQCAtMjA0LDEzICsyMTAsMTMgQEAKIH0KIAogLyogcHVibGljIG5hdGl2ZSB2b2lkIGVuYWJsZVNxbFByb2ZpbGluZygpOyAqLwotc3RhdGljIHZvaWQgZW5hYmxlU3FsUHJvZmlsaW5nKEpOSUVudiogZW52LCBqb2JqZWN0IG9iamVjdCwganN0cmluZyBkYXRhYmFzZU5hbWUpCitzdGF0aWMgdm9pZCBlbmFibGVTcWxQcm9maWxpbmcoSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqZWN0LCBqc3RyaW5nIGRhdGFiYXNlTmFtZSwganNob3J0IGNvbm5UeXBlKQogewogICAgIHNxbGl0ZTMgKiBoYW5kbGUgPSAoc3FsaXRlMyAqKWVudi0+R2V0SW50RmllbGQob2JqZWN0LCBvZmZzZXRfZGJfaGFuZGxlKTsKLSAgICBzcWxpdGUzX3Byb2ZpbGUoaGFuZGxlLCAmc3FsUHJvZmlsZSwgKHZvaWQgKilnZXREYXRhYmFzZU5hbWUoZW52LCBoYW5kbGUsIGRhdGFiYXNlTmFtZSkpOworICAgIHNxbGl0ZTNfcHJvZmlsZShoYW5kbGUsICZzcWxQcm9maWxlLCAodm9pZCAqKWdldERhdGFiYXNlTmFtZShlbnYsIGhhbmRsZSwgZGF0YWJhc2VOYW1lLAorICAgICAgICAgICAgY29ublR5cGUpKTsKIH0KIAotCiAvKiBwdWJsaWMgbmF0aXZlIHZvaWQgY2xvc2UoKTsgKi8KIHN0YXRpYyB2b2lkIGRiY2xvc2UoSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqZWN0KQogewpAQCAtMjQwLDczICsyNDYsNiBAQAogICAgIH0KIH0KIAotLyogcHVibGljIG5hdGl2ZSB2b2lkIG5hdGl2ZV9leGVjU1FMKFN0cmluZyBzcWwpOyAqLwotc3RhdGljIHZvaWQgbmF0aXZlX2V4ZWNTUUwoSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqZWN0LCBqc3RyaW5nIHNxbFN0cmluZykKLXsKLSAgICBpbnQgZXJyOwotICAgIGludCBzdGVwRXJyOwotICAgIHNxbGl0ZTNfc3RtdCAqIHN0YXRlbWVudCA9IE5VTEw7Ci0gICAgc3FsaXRlMyAqIGhhbmRsZSA9IChzcWxpdGUzICopZW52LT5HZXRJbnRGaWVsZChvYmplY3QsIG9mZnNldF9kYl9oYW5kbGUpOwotICAgIGpjaGFyIGNvbnN0ICogc3FsID0gZW52LT5HZXRTdHJpbmdDaGFycyhzcWxTdHJpbmcsIE5VTEwpOwotICAgIGpzaXplIHNxbExlbiA9IGVudi0+R2V0U3RyaW5nTGVuZ3RoKHNxbFN0cmluZyk7Ci0KLSAgICBpZiAoc3FsID09IE5VTEwgfHwgc3FsTGVuID09IDApIHsKLSAgICAgICAgam5pVGhyb3dFeGNlcHRpb24oZW52LCAiamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiIsICJZb3UgbXVzdCBzdXBwbHkgYW4gU1FMIHN0cmluZyIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgZXJyID0gc3FsaXRlM19wcmVwYXJlMTZfdjIoaGFuZGxlLCBzcWwsIHNxbExlbiAqIDIsICZzdGF0ZW1lbnQsIE5VTEwpOwotCi0gICAgZW52LT5SZWxlYXNlU3RyaW5nQ2hhcnMoc3FsU3RyaW5nLCBzcWwpOwotCi0gICAgaWYgKGVyciAhPSBTUUxJVEVfT0spIHsKLSAgICAgICAgY2hhciBjb25zdCAqIHNxbDggPSBlbnYtPkdldFN0cmluZ1VURkNoYXJzKHNxbFN0cmluZywgTlVMTCk7Ci0gICAgICAgIExPR0UoIkZhaWx1cmUgJWQgKCVzKSBvbiAlcCB3aGVuIHByZXBhcmluZyAnJXMnLlxuIiwgZXJyLCBzcWxpdGUzX2Vycm1zZyhoYW5kbGUpLCBoYW5kbGUsIHNxbDgpOwotICAgICAgICB0aHJvd19zcWxpdGUzX2V4Y2VwdGlvbihlbnYsIGhhbmRsZSwgc3FsOCk7Ci0gICAgICAgIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKHNxbFN0cmluZywgc3FsOCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBzdGVwRXJyID0gc3FsaXRlM19zdGVwKHN0YXRlbWVudCk7Ci0gICAgZXJyID0gc3FsaXRlM19maW5hbGl6ZShzdGF0ZW1lbnQpOwotCi0gICAgaWYgKHN0ZXBFcnIgIT0gU1FMSVRFX0RPTkUpIHsKLSAgICAgICAgaWYgKHN0ZXBFcnIgPT0gU1FMSVRFX1JPVykgewotICAgICAgICAgICAgdGhyb3dfc3FsaXRlM19leGNlcHRpb24oZW52LCAiUXVlcmllcyBjYW5ub3QgYmUgcGVyZm9ybWVkIHVzaW5nIGV4ZWNTUUwoKSwgdXNlIHF1ZXJ5KCkgaW5zdGVhZC4iKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNoYXIgY29uc3QgKiBzcWw4ID0gZW52LT5HZXRTdHJpbmdVVEZDaGFycyhzcWxTdHJpbmcsIE5VTEwpOwotICAgICAgICAgICAgTE9HRSgiRmFpbHVyZSAlZCAoJXMpIG9uICVwIHdoZW4gZXhlY3V0aW5nICclcydcbiIsIGVyciwgc3FsaXRlM19lcnJtc2coaGFuZGxlKSwgaGFuZGxlLCBzcWw4KTsKLSAgICAgICAgICAgIHRocm93X3NxbGl0ZTNfZXhjZXB0aW9uKGVudiwgaGFuZGxlLCBzcWw4KTsKLSAgICAgICAgICAgIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKHNxbFN0cmluZywgc3FsOCk7Ci0KLSAgICAgICAgfQotICAgIH0gZWxzZQotI2lmbmRlZiBEQl9MT0dfU1RBVEVNRU5UUwotICAgIElGX0xPR1YoKQotI2VuZGlmCi0gICAgewotICAgICAgICBjaGFyIGNvbnN0ICogc3FsOCA9IGVudi0+R2V0U3RyaW5nVVRGQ2hhcnMoc3FsU3RyaW5nLCBOVUxMKTsKLSAgICAgICAgTE9HVigiU3VjY2VzcyBvbiAlcCB3aGVuIGV4ZWN1dGluZyAnJXMnXG4iLCBoYW5kbGUsIHNxbDgpOwotICAgICAgICBlbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhzcWxTdHJpbmcsIHNxbDgpOwotICAgIH0KLX0KLQotLyogbmF0aXZlIGxvbmcgbGFzdEluc2VydFJvdygpOyAqLwotc3RhdGljIGpsb25nIGxhc3RJbnNlcnRSb3coSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqZWN0KQotewotICAgIHNxbGl0ZTMgKiBoYW5kbGUgPSAoc3FsaXRlMyAqKWVudi0+R2V0SW50RmllbGQob2JqZWN0LCBvZmZzZXRfZGJfaGFuZGxlKTsKLQotICAgIHJldHVybiBzcWxpdGUzX2xhc3RfaW5zZXJ0X3Jvd2lkKGhhbmRsZSk7Ci19Ci0KLS8qIG5hdGl2ZSBpbnQgbGFzdENoYW5nZUNvdW50KCk7ICovCi1zdGF0aWMgamludCBsYXN0Q2hhbmdlQ291bnQoSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqZWN0KQotewotICAgIHNxbGl0ZTMgKiBoYW5kbGUgPSAoc3FsaXRlMyAqKWVudi0+R2V0SW50RmllbGQob2JqZWN0LCBvZmZzZXRfZGJfaGFuZGxlKTsKLQotICAgIHJldHVybiBzcWxpdGUzX2NoYW5nZXMoaGFuZGxlKTsKLX0KLQogLyogbmF0aXZlIGludCBuYXRpdmVfZ2V0RGJMb29rYXNpZGUoKTsgKi8KIHN0YXRpYyBqaW50IG5hdGl2ZV9nZXREYkxvb2thc2lkZShKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QpCiB7CkBAIC00NDMsMTkgKzM4Miw5MyBAQAogICAgIHJldHVybiBzcWxpdGUzX3JlbGVhc2VfbWVtb3J5KFNRTElURV9TT0ZUX0hFQVBfTElNSVQpOwogfQogCitzdGF0aWMgdm9pZCBuYXRpdmVfZmluYWxpemUoSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqZWN0LCBqaW50IHN0YXRlbWVudElkKQoreworICAgIGlmIChzdGF0ZW1lbnRJZCA+IDApIHsKKyAgICAgICAgc3FsaXRlM19maW5hbGl6ZSgoc3FsaXRlM19zdG10ICopc3RhdGVtZW50SWQpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgY3VzdG9tX2Z1bmN0aW9uX2NhbGxiYWNrKHNxbGl0ZTNfY29udGV4dCAqIGNvbnRleHQsIGludCBhcmdjLCBzcWxpdGUzX3ZhbHVlICoqIGFyZ3YpIHsKKyAgICBKTklFbnYqIGVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBpZiAoIWVudikgeworICAgICAgICBMT0dFKCJjdXN0b21fZnVuY3Rpb25fY2FsbGJhY2sgY2Fubm90IGNhbGwgaW50byBKYXZhIG9uIHRoaXMgdGhyZWFkIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgLy8gZ2V0IGdsb2JhbCByZWYgdG8gQ3VzdG9tRnVuY3Rpb24gb2JqZWN0IGZyb20gb3VyIHVzZXIgZGF0YQorICAgIGpvYmplY3QgZnVuY3Rpb24gPSAoam9iamVjdClzcWxpdGUzX3VzZXJfZGF0YShjb250ZXh0KTsKKworICAgIC8vIHBhY2sgdXAgdGhlIGFyZ3VtZW50cyBpbnRvIGEgc3RyaW5nIGFycmF5CisgICAgaWYgKCFzdHJpbmdfY2xhc3MpCisgICAgICAgIHN0cmluZ19jbGFzcyA9IChqY2xhc3MpZW52LT5OZXdHbG9iYWxSZWYoZW52LT5GaW5kQ2xhc3MoImphdmEvbGFuZy9TdHJpbmciKSk7CisgICAgam9iamVjdEFycmF5IHN0ckFycmF5ID0gZW52LT5OZXdPYmplY3RBcnJheShhcmdjLCBzdHJpbmdfY2xhc3MsIE5VTEwpOworICAgIGlmICghc3RyQXJyYXkpCisgICAgICAgIGdvdG8gZG9uZTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ2M7IGkrKykgeworICAgICAgICBjaGFyKiBhcmcgPSAoY2hhciAqKXNxbGl0ZTNfdmFsdWVfdGV4dChhcmd2W2ldKTsKKyAgICAgICAgaWYgKCFhcmcpIHsKKyAgICAgICAgICAgIExPR0UoIk5VTEwgYXJndW1lbnQgaW4gY3VzdG9tX2Z1bmN0aW9uX2NhbGxiYWNrLiAgVGhpcyBzaG91bGQgbm90IGhhcHBlbi4iKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBqb2JqZWN0IG9iaiA9IGVudi0+TmV3U3RyaW5nVVRGKGFyZyk7CisgICAgICAgIGlmICghb2JqKQorICAgICAgICAgICAgZ290byBkb25lOworICAgICAgICBlbnYtPlNldE9iamVjdEFycmF5RWxlbWVudChzdHJBcnJheSwgaSwgb2JqKTsKKyAgICAgICAgZW52LT5EZWxldGVMb2NhbFJlZihvYmopOworICAgIH0KKworICAgIGVudi0+Q2FsbFZvaWRNZXRob2QoZnVuY3Rpb24sIG1ldGhvZF9jdXN0b21fZnVuY3Rpb25fY2FsbGJhY2ssIHN0ckFycmF5KTsKKworZG9uZToKKyAgICBpZiAoZW52LT5FeGNlcHRpb25DaGVjaygpKSB7CisgICAgICAgIExPR0UoIkFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duIGJ5IGN1c3RvbSBzcWxpdGUzIGZ1bmN0aW9uLiIpOworICAgICAgICBMT0dFX0VYKGVudik7CisgICAgICAgIGVudi0+RXhjZXB0aW9uQ2xlYXIoKTsKKyAgICB9Cit9CisKK3N0YXRpYyBqaW50IG5hdGl2ZV9hZGRDdXN0b21GdW5jdGlvbihKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QsCisgICAgICAgIGpzdHJpbmcgbmFtZSwgamludCBudW1BcmdzLCBqb2JqZWN0IGZ1bmN0aW9uKQoreworICAgIHNxbGl0ZTMgKiBoYW5kbGUgPSAoc3FsaXRlMyAqKWVudi0+R2V0SW50RmllbGQob2JqZWN0LCBvZmZzZXRfZGJfaGFuZGxlKTsKKyAgICBjaGFyIGNvbnN0ICpuYW1lU3RyID0gZW52LT5HZXRTdHJpbmdVVEZDaGFycyhuYW1lLCBOVUxMKTsKKyAgICBqb2JqZWN0IHJlZiA9IGVudi0+TmV3R2xvYmFsUmVmKGZ1bmN0aW9uKTsKKyAgICBMT0dEKCJuYXRpdmVfYWRkQ3VzdG9tRnVuY3Rpb24gJXMgcmVmOiAlcCIsIG5hbWVTdHIsIHJlZik7CisgICAgaW50IGVyciA9IHNxbGl0ZTNfY3JlYXRlX2Z1bmN0aW9uKGhhbmRsZSwgbmFtZVN0ciwgbnVtQXJncywgU1FMSVRFX1VURjgsCisgICAgICAgICAgICAodm9pZCAqKXJlZiwgY3VzdG9tX2Z1bmN0aW9uX2NhbGxiYWNrLCBOVUxMLCBOVUxMKTsKKyAgICBlbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhuYW1lLCBuYW1lU3RyKTsKKworICAgIGlmIChlcnIgPT0gU1FMSVRFX09LKQorICAgICAgICByZXR1cm4gKGludClyZWY7CisgICAgZWxzZSB7CisgICAgICAgIExPR0UoInNxbGl0ZTNfY3JlYXRlX2Z1bmN0aW9uIHJldHVybmVkICVkIiwgZXJyKTsKKyAgICAgICAgZW52LT5EZWxldGVHbG9iYWxSZWYocmVmKTsKKyAgICAgICAgdGhyb3dfc3FsaXRlM19leGNlcHRpb24oZW52LCBoYW5kbGUpOworICAgICAgICByZXR1cm4gMDsKKyAgICAgfQorfQorCitzdGF0aWMgdm9pZCBuYXRpdmVfcmVsZWFzZUN1c3RvbUZ1bmN0aW9uKEpOSUVudiogZW52LCBqb2JqZWN0IG9iamVjdCwgamludCByZWYpCit7CisgICAgTE9HRCgibmF0aXZlX3JlbGVhc2VDdXN0b21GdW5jdGlvbiAlZCIsIHJlZik7CisgICAgZW52LT5EZWxldGVHbG9iYWxSZWYoKGpvYmplY3QpcmVmKTsKK30KKwogc3RhdGljIEpOSU5hdGl2ZU1ldGhvZCBzTWV0aG9kc1tdID0KIHsKICAgICAvKiBuYW1lLCBzaWduYXR1cmUsIGZ1bmNQdHIgKi8KICAgICB7ImRib3BlbiIsICIoTGphdmEvbGFuZy9TdHJpbmc7SSlWIiwgKHZvaWQgKilkYm9wZW59LAogICAgIHsiZGJjbG9zZSIsICIoKVYiLCAodm9pZCAqKWRiY2xvc2V9LAotICAgIHsiZW5hYmxlU3FsVHJhY2luZyIsICIoTGphdmEvbGFuZy9TdHJpbmc7KVYiLCAodm9pZCAqKWVuYWJsZVNxbFRyYWNpbmd9LAotICAgIHsiZW5hYmxlU3FsUHJvZmlsaW5nIiwgIihMamF2YS9sYW5nL1N0cmluZzspViIsICh2b2lkICopZW5hYmxlU3FsUHJvZmlsaW5nfSwKLSAgICB7Im5hdGl2ZV9leGVjU1FMIiwgIihMamF2YS9sYW5nL1N0cmluZzspViIsICh2b2lkICopbmF0aXZlX2V4ZWNTUUx9LAotICAgIHsibGFzdEluc2VydFJvdyIsICIoKUoiLCAodm9pZCAqKWxhc3RJbnNlcnRSb3d9LAotICAgIHsibGFzdENoYW5nZUNvdW50IiwgIigpSSIsICh2b2lkICopbGFzdENoYW5nZUNvdW50fSwKKyAgICB7ImVuYWJsZVNxbFRyYWNpbmciLCAiKExqYXZhL2xhbmcvU3RyaW5nO1MpViIsICh2b2lkICopZW5hYmxlU3FsVHJhY2luZ30sCisgICAgeyJlbmFibGVTcWxQcm9maWxpbmciLCAiKExqYXZhL2xhbmcvU3RyaW5nO1MpViIsICh2b2lkICopZW5hYmxlU3FsUHJvZmlsaW5nfSwKICAgICB7Im5hdGl2ZV9zZXRMb2NhbGUiLCAiKExqYXZhL2xhbmcvU3RyaW5nO0kpViIsICh2b2lkICopbmF0aXZlX3NldExvY2FsZX0sCiAgICAgeyJuYXRpdmVfZ2V0RGJMb29rYXNpZGUiLCAiKClJIiwgKHZvaWQgKiluYXRpdmVfZ2V0RGJMb29rYXNpZGV9LAogICAgIHsicmVsZWFzZU1lbW9yeSIsICIoKUkiLCAodm9pZCAqKW5hdGl2ZV9yZWxlYXNlTWVtb3J5fSwKKyAgICB7Im5hdGl2ZV9maW5hbGl6ZSIsICIoSSlWIiwgKHZvaWQgKiluYXRpdmVfZmluYWxpemV9LAorICAgIHsibmF0aXZlX2FkZEN1c3RvbUZ1bmN0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgIihMamF2YS9sYW5nL1N0cmluZztJTGFuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZURhdGFiYXNlJEN1c3RvbUZ1bmN0aW9uOylJIiwKKyAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiluYXRpdmVfYWRkQ3VzdG9tRnVuY3Rpb259LAorICAgIHsibmF0aXZlX3JlbGVhc2VDdXN0b21GdW5jdGlvbiIsICIoSSlWIiwgKHZvaWQgKiluYXRpdmVfcmVsZWFzZUN1c3RvbUZ1bmN0aW9ufSwKIH07CiAKIGludCByZWdpc3Rlcl9hbmRyb2lkX2RhdGFiYXNlX1NRTGl0ZURhdGFiYXNlKEpOSUVudiAqZW52KQpAQCAtNDc0LDcgKzQ4NywxOSBAQAogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogCi0gICAgcmV0dXJuIEFuZHJvaWRSdW50aW1lOjpyZWdpc3Rlck5hdGl2ZU1ldGhvZHMoZW52LCAiYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlRGF0YWJhc2UiLCBzTWV0aG9kcywgTkVMRU0oc01ldGhvZHMpKTsKKyAgICBjbGF6eiA9IGVudi0+RmluZENsYXNzKCJhbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVEYXRhYmFzZSRDdXN0b21GdW5jdGlvbiIpOworICAgIGlmIChjbGF6eiA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIkNhbid0IGZpbmQgYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlRGF0YWJhc2UkQ3VzdG9tRnVuY3Rpb25cbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIG1ldGhvZF9jdXN0b21fZnVuY3Rpb25fY2FsbGJhY2sgPSBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCAiY2FsbGJhY2siLCAiKFtMamF2YS9sYW5nL1N0cmluZzspViIpOworICAgIGlmIChtZXRob2RfY3VzdG9tX2Z1bmN0aW9uX2NhbGxiYWNrID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiQ2FuJ3QgZmluZCBtZXRob2QgU1FMaXRlRGF0YWJhc2UuQ3VzdG9tRnVuY3Rpb24uY2FsbGJhY2tcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgcmV0dXJuIEFuZHJvaWRSdW50aW1lOjpyZWdpc3Rlck5hdGl2ZU1ldGhvZHMoZW52LCAiYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlRGF0YWJhc2UiLAorICAgICAgICAgICAgc01ldGhvZHMsIE5FTEVNKHNNZXRob2RzKSk7CiB9CiAKIC8qIHRocm93IGEgU1FMaXRlRXhjZXB0aW9uIHdpdGggYSBtZXNzYWdlIGFwcHJvcHJpYXRlIGZvciB0aGUgZXJyb3IgaW4gaGFuZGxlICovCkBAIC01MjMsNiArNTQ4LDcgQEAKICAgICAgICAgICAgIGV4Y2VwdGlvbkNsYXNzID0gImFuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZURpc2tJT0V4Y2VwdGlvbiI7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBTUUxJVEVfQ09SUlVQVDoKKyAgICAgICAgY2FzZSBTUUxJVEVfTk9UQURCOiAvLyB0cmVhdCAidW5zdXBwb3J0ZWQgZmlsZSBmb3JtYXQiIGVycm9yIGFzIGNvcnJ1cHRpb24gYWxzbwogICAgICAgICAgICAgZXhjZXB0aW9uQ2xhc3MgPSAiYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlRGF0YWJhc2VDb3JydXB0RXhjZXB0aW9uIjsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIFNRTElURV9DT05TVFJBSU5UOgpAQCAtNTQwLDYgKzU2NiwzMyBAQAogICAgICAgICBjYXNlIFNRTElURV9NSVNVU0U6CiAgICAgICAgICAgIGV4Y2VwdGlvbkNsYXNzID0gImFuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZU1pc3VzZUV4Y2VwdGlvbiI7CiAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNRTElURV9QRVJNOgorICAgICAgICAgICBleGNlcHRpb25DbGFzcyA9ICJhbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVBY2Nlc3NQZXJtRXhjZXB0aW9uIjsKKyAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU1FMSVRFX0JVU1k6CisgICAgICAgICAgIGV4Y2VwdGlvbkNsYXNzID0gImFuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZURhdGFiYXNlTG9ja2VkRXhjZXB0aW9uIjsKKyAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU1FMSVRFX0xPQ0tFRDoKKyAgICAgICAgICAgZXhjZXB0aW9uQ2xhc3MgPSAiYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlVGFibGVMb2NrZWRFeGNlcHRpb24iOworICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTUUxJVEVfUkVBRE9OTFk6CisgICAgICAgICAgIGV4Y2VwdGlvbkNsYXNzID0gImFuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZVJlYWRPbmx5RGF0YWJhc2VFeGNlcHRpb24iOworICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTUUxJVEVfQ0FOVE9QRU46CisgICAgICAgICAgIGV4Y2VwdGlvbkNsYXNzID0gImFuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZUNhbnRPcGVuRGF0YWJhc2VFeGNlcHRpb24iOworICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTUUxJVEVfVE9PQklHOgorICAgICAgICAgICBleGNlcHRpb25DbGFzcyA9ICJhbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVCbG9iVG9vQmlnRXhjZXB0aW9uIjsKKyAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU1FMSVRFX1JBTkdFOgorICAgICAgICAgICBleGNlcHRpb25DbGFzcyA9ICJhbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVCaW5kT3JDb2x1bW5JbmRleE91dE9mUmFuZ2VFeGNlcHRpb24iOworICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTUUxJVEVfTk9NRU06CisgICAgICAgICAgIGV4Y2VwdGlvbkNsYXNzID0gImFuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZU91dE9mTWVtb3J5RXhjZXB0aW9uIjsKKyAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU1FMSVRFX01JU01BVENIOgorICAgICAgICAgICBleGNlcHRpb25DbGFzcyA9ICJhbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVEYXRhdHlwZU1pc21hdGNoRXhjZXB0aW9uIjsKKyAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIGV4Y2VwdGlvbkNsYXNzID0gImFuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZUV4Y2VwdGlvbiI7CiAgICAgICAgICAgIGJyZWFrOwpkaWZmIC0tZ2l0IGEvY29yZS9qbmkvYW5kcm9pZF9kYXRhYmFzZV9TUUxpdGVRdWVyeS5jcHAgYi9jb3JlL2puaS9hbmRyb2lkX2RhdGFiYXNlX1NRTGl0ZVF1ZXJ5LmNwcAppbmRleCA0NDI3MTY4My4uNzQ3ZWU1MCAxMDA2NDQKLS0tIGEvY29yZS9qbmkvYW5kcm9pZF9kYXRhYmFzZV9TUUxpdGVRdWVyeS5jcHAKKysrIGIvY29yZS9qbmkvYW5kcm9pZF9kYXRhYmFzZV9TUUxpdGVRdWVyeS5jcHAKQEAgLTI5LDcgKzI5LDcgQEAKICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KIAotI2luY2x1ZGUgIkN1cnNvcldpbmRvdy5oIgorI2luY2x1ZGUgImJpbmRlci9DdXJzb3JXaW5kb3cuaCIKICNpbmNsdWRlICJzcWxpdGUzX2V4Y2VwdGlvbi5oIgogCiAKZGlmZiAtLWdpdCBhL2NvcmUvam5pL2FuZHJvaWRfZGF0YWJhc2VfU1FMaXRlU3RhdGVtZW50LmNwcCBiL2NvcmUvam5pL2FuZHJvaWRfZGF0YWJhc2VfU1FMaXRlU3RhdGVtZW50LmNwcAppbmRleCBmZjJlZDVkLi4wZjMxMTRiIDEwMDY0NAotLS0gYS9jb3JlL2puaS9hbmRyb2lkX2RhdGFiYXNlX1NRTGl0ZVN0YXRlbWVudC5jcHAKKysrIGIvY29yZS9qbmkvYW5kcm9pZF9kYXRhYmFzZV9TUUxpdGVTdGF0ZW1lbnQuY3BwCkBAIC0xNiw3ICsxNiw5IEBACiAqLwogCiAjdW5kZWYgTE9HX1RBRwotI2RlZmluZSBMT0dfVEFHICJDdXJzb3IiCisjZGVmaW5lIExPR19UQUcgIlNRTGl0ZVN0YXRlbWVudENwcCIKKworI2luY2x1ZGUgImFuZHJvaWRfdXRpbF9CaW5kZXIuaCIKIAogI2luY2x1ZGUgPGpuaS5oPgogI2luY2x1ZGUgPEpOSUhlbHAuaD4KQEAgLTI0LDExICsyNiwxNiBAQAogCiAjaW5jbHVkZSA8c3FsaXRlMy5oPgogCisjaW5jbHVkZSA8Y3V0aWxzL2FzaG1lbS5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCisjaW5jbHVkZSA8ZmNudGwuaD4KICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KIAogI2luY2x1ZGUgInNxbGl0ZTNfZXhjZXB0aW9uLmgiCiAKQEAgLTQ4LDIyICs1NSw0MCBAQAogICAgICAgICAoc3FsaXRlMyAqKWVudi0+R2V0SW50RmllbGQob2JqZWN0LCBnSGFuZGxlRmllbGQpCiAKIAotc3RhdGljIHZvaWQgbmF0aXZlX2V4ZWN1dGUoSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqZWN0KQorc3RhdGljIGppbnQgbmF0aXZlX2V4ZWN1dGUoSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqZWN0KQogewogICAgIGludCBlcnI7CiAgICAgc3FsaXRlMyAqIGhhbmRsZSA9IEdFVF9IQU5ETEUoZW52LCBvYmplY3QpOwogICAgIHNxbGl0ZTNfc3RtdCAqIHN0YXRlbWVudCA9IEdFVF9TVEFURU1FTlQoZW52LCBvYmplY3QpOworICAgIGludCBudW1DaGFuZ2VzID0gLTE7CiAKICAgICAvLyBFeGVjdXRlIHRoZSBzdGF0ZW1lbnQKICAgICBlcnIgPSBzcWxpdGUzX3N0ZXAoc3RhdGVtZW50KTsKIAotICAgIC8vIFRocm93IGFuIGV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cmVkCi0gICAgaWYgKGVyciAhPSBTUUxJVEVfRE9ORSkgeworICAgIC8vIFRocm93IGFuIGV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnJlZAorICAgIGlmIChlcnIgPT0gU1FMSVRFX1JPVykgeworICAgICAgICB0aHJvd19zcWxpdGUzX2V4Y2VwdGlvbihlbnYsCisgICAgICAgICAgICAgICAgIlF1ZXJpZXMgY2FuIGJlIHBlcmZvcm1lZCB1c2luZyBTUUxpdGVEYXRhYmFzZSBxdWVyeSBvciByYXdRdWVyeSBtZXRob2RzIG9ubHkuIik7CisgICAgfSBlbHNlIGlmIChlcnIgIT0gU1FMSVRFX0RPTkUpIHsKICAgICAgICAgdGhyb3dfc3FsaXRlM19leGNlcHRpb25fZXJyY29kZShlbnYsIGVyciwgc3FsaXRlM19lcnJtc2coaGFuZGxlKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbnVtQ2hhbmdlcyA9IHNxbGl0ZTNfY2hhbmdlcyhoYW5kbGUpOwogICAgIH0KIAotICAgIC8vIFJlc2V0IHRoZSBzdGF0bWVudCBzbyBpdCdzIHJlYWR5IHRvIHVzZSBhZ2FpbgorICAgIC8vIFJlc2V0IHRoZSBzdGF0ZW1lbnQgc28gaXQncyByZWFkeSB0byB1c2UgYWdhaW4KICAgICBzcWxpdGUzX3Jlc2V0KHN0YXRlbWVudCk7CisgICAgcmV0dXJuIG51bUNoYW5nZXM7Cit9CisKK3N0YXRpYyBqbG9uZyBuYXRpdmVfZXhlY3V0ZUluc2VydChKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QpCit7CisgICAgc3FsaXRlMyAqIGhhbmRsZSA9IEdFVF9IQU5ETEUoZW52LCBvYmplY3QpOworICAgIGppbnQgbnVtQ2hhbmdlcyA9IG5hdGl2ZV9leGVjdXRlKGVudiwgb2JqZWN0KTsKKyAgICBpZiAobnVtQ2hhbmdlcyA+IDApIHsKKyAgICAgICAgcmV0dXJuIHNxbGl0ZTNfbGFzdF9pbnNlcnRfcm93aWQoaGFuZGxlKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogfQogCiBzdGF0aWMgamxvbmcgbmF0aXZlXzF4MV9sb25nKEpOSUVudiogZW52LCBqb2JqZWN0IG9iamVjdCkKQEAgLTExNSwxMyArMTQwLDExMyBAQAogICAgIHJldHVybiB2YWx1ZTsKIH0KIAorc3RhdGljIGpvYmplY3QgY3JlYXRlUGFyY2VsRmlsZURlc2NyaXB0b3IoSk5JRW52ICogZW52LCBpbnQgZmQpCit7CisgICAgLy8gQ3JlYXRlIEZpbGVEZXNjcmlwdG9yIG9iamVjdAorICAgIGpvYmplY3QgZmlsZURlc2MgPSBuZXdGaWxlRGVzY3JpcHRvcihlbnYsIGZkKTsKKyAgICBpZiAoZmlsZURlc2MgPT0gTlVMTCkgeworICAgICAgICAvLyBGaWxlRGVzY3JpcHRvciBjb25zdHJ1Y3RvciBoYXMgdGhyb3duIGFuIGV4Y2VwdGlvbgorICAgICAgICBjbG9zZShmZCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIC8vIFdyYXAgaXQgaW4gYSBQYXJjZWxGaWxlRGVzY3JpcHRvcgorICAgIGpvYmplY3QgcGFyY2VsRmlsZURlc2MgPSBuZXdQYXJjZWxGaWxlRGVzY3JpcHRvcihlbnYsIGZpbGVEZXNjKTsKKyAgICBpZiAocGFyY2VsRmlsZURlc2MgPT0gTlVMTCkgeworICAgICAgICAvLyBQYXJjZWxGaWxlRGVzY3JpcHRvciBjb25zdHJ1Y3RvciBoYXMgdGhyb3duIGFuIGV4Y2VwdGlvbgorICAgICAgICBjbG9zZShmZCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHJldHVybiBwYXJjZWxGaWxlRGVzYzsKK30KKworLy8gQ3JlYXRlcyBhbiBhc2htZW0gYXJlYSwgY29waWVzIHNvbWUgZGF0YSBpbnRvIGl0LCBhbmQgcmV0dXJucworLy8gYSBQYXJjZWxGaWxlRGVzY3JpcHRvciBmb3IgdGhlIGFzaG1lbSBhcmVhLgorc3RhdGljIGpvYmplY3QgY3JlYXRlX2FzaG1lbV9yZWdpb25fd2l0aF9kYXRhKEpOSUVudiAqIGVudiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICogZGF0YSwgaW50IGxlbmd0aCkKK3sKKyAgICAvLyBDcmVhdGUgYXNobWVtIGFyZWEKKyAgICBpbnQgZmQgPSBhc2htZW1fY3JlYXRlX3JlZ2lvbihOVUxMLCBsZW5ndGgpOworICAgIGlmIChmZCA8IDApIHsKKyAgICAgICAgTE9HRSgiYXNobWVtX2NyZWF0ZV9yZWdpb24gZmFpbGVkOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgIGpuaVRocm93SU9FeGNlcHRpb24oZW52LCBlcnJubyk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGlmIChsZW5ndGggPiAwKSB7CisgICAgICAgIC8vIG1tYXAgdGhlIGFzaG1lbSBhcmVhCisgICAgICAgIHZvaWQgKiBhc2htZW1fcHRyID0KKyAgICAgICAgICAgICAgICBtbWFwKE5VTEwsIGxlbmd0aCwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwgTUFQX1NIQVJFRCwgZmQsIDApOworICAgICAgICBpZiAoYXNobWVtX3B0ciA9PSBNQVBfRkFJTEVEKSB7CisgICAgICAgICAgICBMT0dFKCJtbWFwIGZhaWxlZDogJXMiLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICAgICAgam5pVGhyb3dJT0V4Y2VwdGlvbihlbnYsIGVycm5vKTsKKyAgICAgICAgICAgIGNsb3NlKGZkKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ29weSBkYXRhIHRvIGFzaG1lbSBhcmVhCisgICAgICAgIG1lbWNweShhc2htZW1fcHRyLCBkYXRhLCBsZW5ndGgpOworCisgICAgICAgIC8vIG11bm1hcCBhc2htZW0gYXJlYQorICAgICAgICBpZiAobXVubWFwKGFzaG1lbV9wdHIsIGxlbmd0aCkgPCAwKSB7CisgICAgICAgICAgICBMT0dFKCJtdW5tYXAgZmFpbGVkOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgICAgICBqbmlUaHJvd0lPRXhjZXB0aW9uKGVudiwgZXJybm8pOworICAgICAgICAgICAgY2xvc2UoZmQpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBNYWtlIGFzaG1lbSBhcmVhIHJlYWQtb25seQorICAgIGlmIChhc2htZW1fc2V0X3Byb3RfcmVnaW9uKGZkLCBQUk9UX1JFQUQpIDwgMCkgeworICAgICAgICBMT0dFKCJhc2htZW1fc2V0X3Byb3RfcmVnaW9uIGZhaWxlZDogJXMiLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICBqbmlUaHJvd0lPRXhjZXB0aW9uKGVudiwgZXJybm8pOworICAgICAgICBjbG9zZShmZCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIC8vIFdyYXAgaXQgaW4gYSBQYXJjZWxGaWxlRGVzY3JpcHRvcgorICAgIHJldHVybiBjcmVhdGVQYXJjZWxGaWxlRGVzY3JpcHRvcihlbnYsIGZkKTsKK30KKworc3RhdGljIGpvYmplY3QgbmF0aXZlXzF4MV9ibG9iX2FzaG1lbShKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QpCit7CisgICAgaW50IGVycjsKKyAgICBzcWxpdGUzICogaGFuZGxlID0gR0VUX0hBTkRMRShlbnYsIG9iamVjdCk7CisgICAgc3FsaXRlM19zdG10ICogc3RhdGVtZW50ID0gR0VUX1NUQVRFTUVOVChlbnYsIG9iamVjdCk7CisgICAgam9iamVjdCB2YWx1ZSA9IE5VTEw7CisKKyAgICAvLyBFeGVjdXRlIHRoZSBzdGF0ZW1lbnQKKyAgICBlcnIgPSBzcWxpdGUzX3N0ZXAoc3RhdGVtZW50KTsKKworICAgIC8vIEhhbmRsZSB0aGUgcmVzdWx0CisgICAgaWYgKGVyciA9PSBTUUxJVEVfUk9XKSB7CisgICAgICAgIC8vIE5vIGVycm9ycywgcmVhZCB0aGUgZGF0YSBhbmQgcmV0dXJuIGl0CisgICAgICAgIGNvbnN0IHZvaWQgKiBibG9iID0gc3FsaXRlM19jb2x1bW5fYmxvYihzdGF0ZW1lbnQsIDApOworICAgICAgICBpZiAoYmxvYiAhPSBOVUxMKSB7CisgICAgICAgICAgICBpbnQgbGVuID0gc3FsaXRlM19jb2x1bW5fYnl0ZXMoc3RhdGVtZW50LCAwKTsKKyAgICAgICAgICAgIGlmIChsZW4gPj0gMCkgeworICAgICAgICAgICAgICAgIHZhbHVlID0gY3JlYXRlX2FzaG1lbV9yZWdpb25fd2l0aF9kYXRhKGVudiwgYmxvYiwgbGVuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHRocm93X3NxbGl0ZTNfZXhjZXB0aW9uX2VycmNvZGUoZW52LCBlcnIsIHNxbGl0ZTNfZXJybXNnKGhhbmRsZSkpOworICAgIH0KKworICAgIC8vIFJlc2V0IHRoZSBzdGF0bWVudCBzbyBpdCdzIHJlYWR5IHRvIHVzZSBhZ2FpbgorICAgIHNxbGl0ZTNfcmVzZXQoc3RhdGVtZW50KTsKKworICAgIHJldHVybiB2YWx1ZTsKK30KIAogc3RhdGljIEpOSU5hdGl2ZU1ldGhvZCBzTWV0aG9kc1tdID0KIHsKICAgICAgLyogbmFtZSwgc2lnbmF0dXJlLCBmdW5jUHRyICovCi0gICAgeyJuYXRpdmVfZXhlY3V0ZSIsICIoKVYiLCAodm9pZCAqKW5hdGl2ZV9leGVjdXRlfSwKKyAgICB7Im5hdGl2ZV9leGVjdXRlIiwgIigpSSIsICh2b2lkICopbmF0aXZlX2V4ZWN1dGV9LAorICAgIHsibmF0aXZlX2V4ZWN1dGVJbnNlcnQiLCAiKClKIiwgKHZvaWQgKiluYXRpdmVfZXhlY3V0ZUluc2VydH0sCiAgICAgeyJuYXRpdmVfMXgxX2xvbmciLCAiKClKIiwgKHZvaWQgKiluYXRpdmVfMXgxX2xvbmd9LAogICAgIHsibmF0aXZlXzF4MV9zdHJpbmciLCAiKClMamF2YS9sYW5nL1N0cmluZzsiLCAodm9pZCAqKW5hdGl2ZV8xeDFfc3RyaW5nfSwKKyAgICB7Im5hdGl2ZV8xeDFfYmxvYl9hc2htZW0iLCAiKClMYW5kcm9pZC9vcy9QYXJjZWxGaWxlRGVzY3JpcHRvcjsiLCAodm9pZCAqKW5hdGl2ZV8xeDFfYmxvYl9hc2htZW19LAogfTsKIAogaW50IHJlZ2lzdGVyX2FuZHJvaWRfZGF0YWJhc2VfU1FMaXRlU3RhdGVtZW50KEpOSUVudiAqIGVudikKZGlmZiAtLWdpdCBhL2NvcmUvam5pL2FuZHJvaWRfbmV0X05ldFV0aWxzLmNwcCBiL2NvcmUvam5pL2FuZHJvaWRfbmV0X05ldFV0aWxzLmNwcAppbmRleCBmZWIwZGFkLi4zY2RlOWQ2IDEwMDY0NAotLS0gYS9jb3JlL2puaS9hbmRyb2lkX25ldF9OZXRVdGlscy5jcHAKKysrIGIvY29yZS9qbmkvYW5kcm9pZF9uZXRfTmV0VXRpbHMuY3BwCkBAIC0yMjIsMTAgKzIyMiwxMCBAQAogCiAgICAgeyAiZW5hYmxlSW50ZXJmYWNlIiwgIihMamF2YS9sYW5nL1N0cmluZzspSSIsICAodm9pZCAqKWFuZHJvaWRfbmV0X3V0aWxzX2VuYWJsZUludGVyZmFjZSB9LAogICAgIHsgImRpc2FibGVJbnRlcmZhY2UiLCAiKExqYXZhL2xhbmcvU3RyaW5nOylJIiwgICh2b2lkICopYW5kcm9pZF9uZXRfdXRpbHNfZGlzYWJsZUludGVyZmFjZSB9LAotICAgIHsgImFkZEhvc3RSb3V0ZSIsICIoTGphdmEvbGFuZy9TdHJpbmc7SSlJIiwgICh2b2lkICopYW5kcm9pZF9uZXRfdXRpbHNfYWRkSG9zdFJvdXRlIH0sCisgICAgeyAiYWRkSG9zdFJvdXRlTmF0aXZlIiwgIihMamF2YS9sYW5nL1N0cmluZztJKUkiLCAgKHZvaWQgKilhbmRyb2lkX25ldF91dGlsc19hZGRIb3N0Um91dGUgfSwKICAgICB7ICJyZW1vdmVIb3N0Um91dGVzIiwgIihMamF2YS9sYW5nL1N0cmluZzspSSIsICAodm9pZCAqKWFuZHJvaWRfbmV0X3V0aWxzX3JlbW92ZUhvc3RSb3V0ZXMgfSwKLSAgICB7ICJzZXREZWZhdWx0Um91dGUiLCAiKExqYXZhL2xhbmcvU3RyaW5nO0kpSSIsICAodm9pZCAqKWFuZHJvaWRfbmV0X3V0aWxzX3NldERlZmF1bHRSb3V0ZSB9LAotICAgIHsgImdldERlZmF1bHRSb3V0ZSIsICIoTGphdmEvbGFuZy9TdHJpbmc7KUkiLCAgKHZvaWQgKilhbmRyb2lkX25ldF91dGlsc19nZXREZWZhdWx0Um91dGUgfSwKKyAgICB7ICJzZXREZWZhdWx0Um91dGVOYXRpdmUiLCAiKExqYXZhL2xhbmcvU3RyaW5nO0kpSSIsICAodm9pZCAqKWFuZHJvaWRfbmV0X3V0aWxzX3NldERlZmF1bHRSb3V0ZSB9LAorICAgIHsgImdldERlZmF1bHRSb3V0ZU5hdGl2ZSIsICIoTGphdmEvbGFuZy9TdHJpbmc7KUkiLCAgKHZvaWQgKilhbmRyb2lkX25ldF91dGlsc19nZXREZWZhdWx0Um91dGUgfSwKICAgICB7ICJyZW1vdmVEZWZhdWx0Um91dGUiLCAiKExqYXZhL2xhbmcvU3RyaW5nOylJIiwgICh2b2lkICopYW5kcm9pZF9uZXRfdXRpbHNfcmVtb3ZlRGVmYXVsdFJvdXRlIH0sCiAgICAgeyAicmVzZXRDb25uZWN0aW9ucyIsICIoTGphdmEvbGFuZy9TdHJpbmc7KUkiLCAgKHZvaWQgKilhbmRyb2lkX25ldF91dGlsc19yZXNldENvbm5lY3Rpb25zIH0sCiAgICAgeyAicnVuRGhjcCIsICIoTGphdmEvbGFuZy9TdHJpbmc7TGFuZHJvaWQvbmV0L0RoY3BJbmZvOylaIiwgICh2b2lkICopYW5kcm9pZF9uZXRfdXRpbHNfcnVuRGhjcCB9LApkaWZmIC0tZ2l0IGEvY29yZS9qbmkvYW5kcm9pZF9uZXRfd2lmaV9XaWZpLmNwcCBiL2NvcmUvam5pL2FuZHJvaWRfbmV0X3dpZmlfV2lmaS5jcHAKaW5kZXggOTAzMjgzZS4uYWVjNTM3ZCAxMDA2NDQKLS0tIGEvY29yZS9qbmkvYW5kcm9pZF9uZXRfd2lmaV9XaWZpLmNwcAorKysgYi9jb3JlL2puaS9hbmRyb2lkX25ldF93aWZpX1dpZmkuY3BwCkBAIC05OCw2ICs5OCwxMSBAQAogICAgIH0KIH0KIAorc3RhdGljIGpib29sZWFuIGFuZHJvaWRfbmV0X3dpZmlfaXNEcml2ZXJMb2FkZWQoSk5JRW52KiBlbnYsIGpvYmplY3QgY2xhenopCit7CisgICAgcmV0dXJuIChqYm9vbGVhbikoOjppc193aWZpX2RyaXZlcl9sb2FkZWQoKSA9PSAxKTsKK30KKwogc3RhdGljIGpib29sZWFuIGFuZHJvaWRfbmV0X3dpZmlfbG9hZERyaXZlcihKTklFbnYqIGVudiwgam9iamVjdCBjbGF6eikKIHsKICAgICByZXR1cm4gKGpib29sZWFuKSg6OndpZmlfbG9hZF9kcml2ZXIoKSA9PSAwKTsKQEAgLTQ5MywxNSArNDk4LDYgQEAKICAgICByZXR1cm4gZG9Cb29sZWFuQ29tbWFuZCgiQkxBQ0tMSVNUIGNsZWFyIiwgIk9LIik7CiB9CiAKLXN0YXRpYyBqYm9vbGVhbiBhbmRyb2lkX25ldF93aWZpX3NldFN1c3BlbmRPcHRpbWl6YXRpb25zQ29tbWFuZChKTklFbnYqIGVudiwgam9iamVjdCBjbGF6eiwgamJvb2xlYW4gZW5hYmxlZCkKLXsKLSAgICBjaGFyIGNtZHN0clsyNV07Ci0KLSAgICBzbnByaW50ZihjbWRzdHIsIHNpemVvZihjbWRzdHIpLCAiRFJJVkVSIFNFVFNVU1BFTkQgJWQiLCBlbmFibGVkID8gMCA6IDEpOwotICAgIHJldHVybiBkb0Jvb2xlYW5Db21tYW5kKGNtZHN0ciwgIk9LIik7Ci19Ci0KLQogc3RhdGljIGpib29sZWFuIGFuZHJvaWRfbmV0X3dpZmlfZG9EaGNwUmVxdWVzdChKTklFbnYqIGVudiwgam9iamVjdCBjbGF6eiwgam9iamVjdCBpbmZvKQogewogICAgIGppbnQgaXBhZGRyLCBnYXRld2F5LCBtYXNrLCBkbnMxLCBkbnMyLCBzZXJ2ZXIsIGxlYXNlOwpAQCAtNTMzLDYgKzUyOSw3IEBACiAgICAgLyogbmFtZSwgc2lnbmF0dXJlLCBmdW5jUHRyICovCiAKICAgICB7ICJsb2FkRHJpdmVyIiwgIigpWiIsICAodm9pZCAqKWFuZHJvaWRfbmV0X3dpZmlfbG9hZERyaXZlciB9LAorICAgIHsgImlzRHJpdmVyTG9hZGVkIiwgIigpWiIsICAodm9pZCAqKWFuZHJvaWRfbmV0X3dpZmlfaXNEcml2ZXJMb2FkZWR9LAogICAgIHsgInVubG9hZERyaXZlciIsICIoKVoiLCAgKHZvaWQgKilhbmRyb2lkX25ldF93aWZpX3VubG9hZERyaXZlciB9LAogICAgIHsgInN0YXJ0U3VwcGxpY2FudCIsICIoKVoiLCAgKHZvaWQgKilhbmRyb2lkX25ldF93aWZpX3N0YXJ0U3VwcGxpY2FudCB9LAogICAgIHsgInN0b3BTdXBwbGljYW50IiwgIigpWiIsICAodm9pZCAqKWFuZHJvaWRfbmV0X3dpZmlfc3RvcFN1cHBsaWNhbnQgfSwKQEAgLTU4MCw3ICs1NzcsNiBAQAogICAgIHsgInNldFNjYW5SZXN1bHRIYW5kbGluZ0NvbW1hbmQiLCAiKEkpWiIsICh2b2lkKikgYW5kcm9pZF9uZXRfd2lmaV9zZXRTY2FuUmVzdWx0SGFuZGxpbmdDb21tYW5kIH0sCiAgICAgeyAiYWRkVG9CbGFja2xpc3RDb21tYW5kIiwgIihMamF2YS9sYW5nL1N0cmluZzspWiIsICh2b2lkKikgYW5kcm9pZF9uZXRfd2lmaV9hZGRUb0JsYWNrbGlzdENvbW1hbmQgfSwKICAgICB7ICJjbGVhckJsYWNrbGlzdENvbW1hbmQiLCAiKClaIiwgKHZvaWQqKSBhbmRyb2lkX25ldF93aWZpX2NsZWFyQmxhY2tsaXN0Q29tbWFuZCB9LAotICAgIHsgInNldFN1c3BlbmRPcHRpbWl6YXRpb25zQ29tbWFuZCIsICIoWilaIiwgKHZvaWQqKSBhbmRyb2lkX25ldF93aWZpX3NldFN1c3BlbmRPcHRpbWl6YXRpb25zQ29tbWFuZH0sCiAKICAgICB7ICJkb0RoY3BSZXF1ZXN0IiwgIihMYW5kcm9pZC9uZXQvRGhjcEluZm87KVoiLCAodm9pZCopIGFuZHJvaWRfbmV0X3dpZmlfZG9EaGNwUmVxdWVzdCB9LAogICAgIHsgImdldERoY3BFcnJvciIsICIoKUxqYXZhL2xhbmcvU3RyaW5nOyIsICh2b2lkKikgYW5kcm9pZF9uZXRfd2lmaV9nZXREaGNwRXJyb3IgfSwKZGlmZiAtLWdpdCBhL2NvcmUvam5pL2FuZHJvaWRfb3NfRGVidWcuY3BwIGIvY29yZS9qbmkvYW5kcm9pZF9vc19EZWJ1Zy5jcHAKaW5kZXggM2VlNDA0YS4uNGE4NzdkMiAxMDA2NDQKLS0tIGEvY29yZS9qbmkvYW5kcm9pZF9vc19EZWJ1Zy5jcHAKKysrIGIvY29yZS9qbmkvYW5kcm9pZF9vc19EZWJ1Zy5jcHAKQEAgLTE0LDYgKzE0LDcgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKyNkZWZpbmUgTE9HX1RBRyAiYW5kcm9pZC5vcy5EZWJ1ZyIKICNpbmNsdWRlICJKTklIZWxwLmgiCiAjaW5jbHVkZSAiam5pLmgiCiAjaW5jbHVkZSAidXRpbHMvbWlzYy5oIgpAQCAtMjQsNiArMjUsOCBAQAogI2luY2x1ZGUgPHVuaXN0ZC5oPgogI2luY2x1ZGUgPHRpbWUuaD4KICNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CiAKICNpZmRlZiBIQVZFX01BTExPQ19ICiAjaW5jbHVkZSA8bWFsbG9jLmg+CkBAIC0yNzQsNiArMjc3LDE3NiBAQAogamludCBhbmRyb2lkX29zX0RlYnVnX2dldFByb3h5T2JqZWN0Q291bnQoSk5JRW52KiBlbnYsIGpvYmplY3QgY2xhenopOwogamludCBhbmRyb2lkX29zX0RlYnVnX2dldERlYXRoT2JqZWN0Q291bnQoSk5JRW52KiBlbnYsIGpvYmplY3QgY2xhenopOwogCisKKyNpZmRlZiBIQVZFX0FORFJPSURfT1MKKy8qIHB1bGxlZCBvdXQgb2YgYmlvbmljICovCitleHRlcm4gIkMiIHZvaWQgZ2V0X21hbGxvY19sZWFrX2luZm8odWludDhfdCoqIGluZm8sIHNpemVfdCogb3ZlcmFsbFNpemUsCisgICAgc2l6ZV90KiBpbmZvU2l6ZSwgc2l6ZV90KiB0b3RhbE1lbW9yeSwgc2l6ZV90KiBiYWNrdHJhY2VTaXplKTsKK2V4dGVybiAiQyIgdm9pZCBmcmVlX21hbGxvY19sZWFrX2luZm8odWludDhfdCogaW5mbyk7CisjZGVmaW5lIFNJWkVfRkxBR19aWUdPVEVfQ0hJTEQgICgxPDwzMSkKKyNkZWZpbmUgQkFDS1RSQUNFX1NJWkUgICAgICAgICAgMzIKKworLyoKKyAqIFRoaXMgaXMgYSBxc29ydCgpIGNhbGxiYWNrLgorICoKKyAqIFNlZSBkdW1wTmF0aXZlSGVhcCgpIGZvciBjb21tZW50cyBhYm91dCB0aGUgZGF0YSBmb3JtYXQgYW5kIHNvcnQgb3JkZXIuCisgKi8KK3N0YXRpYyBpbnQgY29tcGFyZUhlYXBSZWNvcmRzKGNvbnN0IHZvaWQqIHZyZWMxLCBjb25zdCB2b2lkKiB2cmVjMikKK3sKKyAgICBjb25zdCBzaXplX3QqIHJlYzEgPSAoY29uc3Qgc2l6ZV90KikgdnJlYzE7CisgICAgY29uc3Qgc2l6ZV90KiByZWMyID0gKGNvbnN0IHNpemVfdCopIHZyZWMyOworICAgIHNpemVfdCBzaXplMSA9ICpyZWMxOworICAgIHNpemVfdCBzaXplMiA9ICpyZWMyOworCisgICAgaWYgKHNpemUxIDwgc2l6ZTIpIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfSBlbHNlIGlmIChzaXplMSA+IHNpemUyKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBpbnRwdHJfdCogYnQxID0gKGludHB0cl90KikocmVjMSArIDIpOworICAgIGludHB0cl90KiBidDIgPSAoaW50cHRyX3QqKShyZWMyICsgMik7CisgICAgZm9yIChzaXplX3QgaWR4ID0gMDsgaWR4IDwgQkFDS1RSQUNFX1NJWkU7IGlkeCsrKSB7CisgICAgICAgIGludHB0cl90IGFkZHIxID0gYnQxW2lkeF07CisgICAgICAgIGludHB0cl90IGFkZHIyID0gYnQyW2lkeF07CisgICAgICAgIGlmIChhZGRyMSA9PSBhZGRyMikgeworICAgICAgICAgICAgaWYgKGFkZHIxID09IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYWRkcjEgPCBhZGRyMikgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9IGVsc2UgaWYgKGFkZHIxID4gYWRkcjIpIHsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKy8qCisgKiBUaGUgZ2V0X21hbGxvY19sZWFrX2luZm8oKSBjYWxsIHJldHVybnMgYW4gYXJyYXkgb2Ygc3RydWN0cyB0aGF0CisgKiBsb29rIGxpa2UgdGhpczoKKyAqCisgKiAgIHNpemVfdCBzaXplCisgKiAgIHNpemVfdCBhbGxvY2F0aW9ucworICogICBpbnRwdHJfdCBiYWNrdHJhY2VbMzJdCisgKgorICogInNpemUiIGlzIHRoZSBzaXplIG9mIHRoZSBhbGxvY2F0aW9uLCAiYmFja3RyYWNlIiBpcyBhIGZpeGVkLXNpemUKKyAqIGFycmF5IG9mIGZ1bmN0aW9uIHBvaW50ZXJzLCBhbmQgImFsbG9jYXRpb25zIiBpcyB0aGUgbnVtYmVyIG9mCisgKiBhbGxvY2F0aW9ucyB3aXRoIHRoZSBleGFjdCBzYW1lIHNpemUgYW5kIGJhY2t0cmFjZS4KKyAqCisgKiBUaGUgZW50cmllcyBhcmUgc29ydGVkIGJ5IGRlc2NlbmRpbmcgdG90YWwgc2l6ZSAoaS5lLiBzaXplKmFsbG9jYXRpb25zKQorICogdGhlbiBhbGxvY2F0aW9uIGNvdW50LiAgRm9yIGJlc3QgcmVzdWx0cyB3aXRoICJkaWZmIiB3ZSdkIGxpa2UgdG8gc29ydAorICogcHJpbWFyaWx5IGJ5IGluZGl2aWR1YWwgc2l6ZSB0aGVuIHN0YWNrIHRyYWNlLiAgU2luY2UgdGhlIGVudHJpZXMgYXJlCisgKiBmaXhlZC1zaXplLCBhbmQgd2UncmUgYWxsb3dlZCAoYnkgdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24pIHRvIG1hbmdsZQorICogdGhlbSwgd2UgY2FuIGRvIHRoaXMgaW4gcGxhY2UuCisgKi8KK3N0YXRpYyB2b2lkIGR1bXBOYXRpdmVIZWFwKEZJTEUqIGZwKQoreworICAgIHVpbnQ4X3QqIGluZm8gPSBOVUxMOworICAgIHNpemVfdCBvdmVyYWxsU2l6ZSwgaW5mb1NpemUsIHRvdGFsTWVtb3J5LCBiYWNrdHJhY2VTaXplOworCisgICAgZ2V0X21hbGxvY19sZWFrX2luZm8oJmluZm8sICZvdmVyYWxsU2l6ZSwgJmluZm9TaXplLCAmdG90YWxNZW1vcnksCisgICAgICAgICZiYWNrdHJhY2VTaXplKTsKKyAgICBpZiAoaW5mbyA9PSBOVUxMKSB7CisgICAgICAgIGZwcmludGYoZnAsICJOYXRpdmUgaGVhcCBkdW1wIG5vdCBhdmFpbGFibGUuIFRvIGVuYWJsZSwgcnVuIHRoZXNlIgorICAgICAgICAgICAgICAgICAgICAiIGNvbW1hbmRzIChyZXF1aXJlcyByb290KTpcbiIpOworICAgICAgICBmcHJpbnRmKGZwLCAiJCBhZGIgc2hlbGwgc2V0cHJvcCBsaWJjLmRlYnVnLm1hbGxvYyAxXG4iKTsKKyAgICAgICAgZnByaW50ZihmcCwgIiQgYWRiIHNoZWxsIHN0b3BcbiIpOworICAgICAgICBmcHJpbnRmKGZwLCAiJCBhZGIgc2hlbGwgc3RhcnRcbiIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGFzc2VydChpbmZvU2l6ZSAhPSAwKTsKKyAgICBhc3NlcnQob3ZlcmFsbFNpemUgJSBpbmZvU2l6ZSA9PSAwKTsKKworICAgIGZwcmludGYoZnAsICJBbmRyb2lkIE5hdGl2ZSBIZWFwIER1bXAgdjEuMFxuXG4iKTsKKworICAgIHNpemVfdCByZWNvcmRDb3VudCA9IG92ZXJhbGxTaXplIC8gaW5mb1NpemU7CisgICAgZnByaW50ZihmcCwgIlRvdGFsIG1lbW9yeTogJXp1XG4iLCB0b3RhbE1lbW9yeSk7CisgICAgZnByaW50ZihmcCwgIkFsbG9jYXRpb24gcmVjb3JkczogJXpkXG4iLCByZWNvcmRDb3VudCk7CisgICAgaWYgKGJhY2t0cmFjZVNpemUgIT0gQkFDS1RSQUNFX1NJWkUpIHsKKyAgICAgICAgZnByaW50ZihmcCwgIldBUk5JTkc6IG1pc21hdGNoZWQgYmFja3RyYWNlIHNpemVzICglZCB2cy4gJWQpXG4iLAorICAgICAgICAgICAgYmFja3RyYWNlU2l6ZSwgQkFDS1RSQUNFX1NJWkUpOworICAgIH0KKyAgICBmcHJpbnRmKGZwLCAiXG4iKTsKKworICAgIC8qIHJlLXNvcnQgdGhlIGVudHJpZXMgKi8KKyAgICBxc29ydChpbmZvLCByZWNvcmRDb3VudCwgaW5mb1NpemUsIGNvbXBhcmVIZWFwUmVjb3Jkcyk7CisKKyAgICAvKiBkdW1wIHRoZSBlbnRyaWVzIHRvIHRoZSBmaWxlICovCisgICAgY29uc3QgdWludDhfdCogcHRyID0gaW5mbzsKKyAgICBmb3IgKHNpemVfdCBpZHggPSAwOyBpZHggPCByZWNvcmRDb3VudDsgaWR4KyspIHsKKyAgICAgICAgc2l6ZV90IHNpemUgPSAqKHNpemVfdCopIHB0cjsKKyAgICAgICAgc2l6ZV90IGFsbG9jYXRpb25zID0gKihzaXplX3QqKSAocHRyICsgc2l6ZW9mKHNpemVfdCkpOworICAgICAgICBpbnRwdHJfdCogYmFja3RyYWNlID0gKGludHB0cl90KikgKHB0ciArIHNpemVvZihzaXplX3QpICogMik7CisKKyAgICAgICAgZnByaW50ZihmcCwgInogJWQgIHN6ICU4enUgIG51bSAlNHp1ICBidCIsCisgICAgICAgICAgICAgICAgKHNpemUgJiBTSVpFX0ZMQUdfWllHT1RFX0NISUxEKSAhPSAwLAorICAgICAgICAgICAgICAgIHNpemUgJiB+U0laRV9GTEFHX1pZR09URV9DSElMRCwKKyAgICAgICAgICAgICAgICBhbGxvY2F0aW9ucyk7CisgICAgICAgIGZvciAoc2l6ZV90IGJ0ID0gMDsgYnQgPCBiYWNrdHJhY2VTaXplOyBidCsrKSB7CisgICAgICAgICAgICBpZiAoYmFja3RyYWNlW2J0XSA9PSAwKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZwcmludGYoZnAsICIgJTA4eCIsIGJhY2t0cmFjZVtidF0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZwcmludGYoZnAsICJcbiIpOworCisgICAgICAgIHB0ciArPSBpbmZvU2l6ZTsKKyAgICB9CisKKyAgICBmcHJpbnRmKGZwLCAiRU5EXG4iKTsKKyAgICBmcmVlX21hbGxvY19sZWFrX2luZm8oaW5mbyk7Cit9CisjZW5kaWYgLypIQVZFX0FORFJPSURfT1MqLworCisvKgorICogRHVtcCB0aGUgbmF0aXZlIGhlYXAsIHdyaXRpbmcgaHVtYW4tcmVhZGFibGUgb3V0cHV0IHRvIHRoZSBzcGVjaWZpZWQKKyAqIGZpbGUgZGVzY3JpcHRvci4KKyAqLworc3RhdGljIHZvaWQgYW5kcm9pZF9vc19EZWJ1Z19kdW1wTmF0aXZlSGVhcChKTklFbnYqIGVudiwgam9iamVjdCBjbGF6eiwKKyAgICBqb2JqZWN0IGZpbGVEZXNjcmlwdG9yKQoreworICAgIGlmIChmaWxlRGVzY3JpcHRvciA9PSBOVUxMKSB7CisgICAgICAgIGpuaVRocm93TnVsbFBvaW50ZXJFeGNlcHRpb24oZW52LCBOVUxMKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpbnQgb3JpZ0ZkID0gam5pR2V0RkRGcm9tRmlsZURlc2NyaXB0b3IoZW52LCBmaWxlRGVzY3JpcHRvcik7CisgICAgaWYgKG9yaWdGZCA8IDApIHsKKyAgICAgICAgam5pVGhyb3dSdW50aW1lRXhjZXB0aW9uKGVudiwgIkludmFsaWQgZmlsZSBkZXNjcmlwdG9yIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKiBkdXAoKSB0aGUgZGVzY3JpcHRvciBzbyB3ZSBkb24ndCBjbG9zZSB0aGUgb3JpZ2luYWwgd2l0aCBmY2xvc2UoKSAqLworICAgIGludCBmZCA9IGR1cChvcmlnRmQpOworICAgIGlmIChmZCA8IDApIHsKKyAgICAgICAgTE9HVygiZHVwKCVkKSBmYWlsZWQ6ICVzXG4iLCBvcmlnRmQsIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgIGpuaVRocm93UnVudGltZUV4Y2VwdGlvbihlbnYsICJkdXAoKSBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEZJTEUqIGZwID0gZmRvcGVuKGZkLCAidyIpOworICAgIGlmIChmcCA9PSBOVUxMKSB7CisgICAgICAgIExPR1coImZkb3BlbiglZCkgZmFpbGVkOiAlc1xuIiwgZmQsIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgIGNsb3NlKGZkKTsKKyAgICAgICAgam5pVGhyb3dSdW50aW1lRXhjZXB0aW9uKGVudiwgImZkb3BlbigpIGZhaWxlZCIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisjaWZkZWYgSEFWRV9BTkRST0lEX09TCisgICAgTE9HRCgiTmF0aXZlIGhlYXAgZHVtcCBzdGFydGluZy4uLlxuIik7CisgICAgZHVtcE5hdGl2ZUhlYXAoZnApOworICAgIExPR0QoIk5hdGl2ZSBoZWFwIGR1bXAgY29tcGxldGUuXG4iKTsKKyNlbHNlCisgICAgZnByaW50ZihmcCwgIk5hdGl2ZSBoZWFwIGR1bXAgbm90IGF2YWlsYWJsZSBvbiB0aGlzIHBsYXRmb3JtXG4iKTsKKyNlbmRpZgorCisgICAgZmNsb3NlKGZwKTsKK30KKworCiAvKgogICogSk5JIHJlZ2lzdHJhdGlvbi4KICAqLwpAQCAtMjg5LDYgKzQ2Miw4IEBACiAgICAgICAgICAgICAodm9pZCopIGFuZHJvaWRfb3NfRGVidWdfZ2V0RGlydHlQYWdlcyB9LAogICAgIHsgImdldE1lbW9yeUluZm8iLCAgICAgICAgICAiKElMYW5kcm9pZC9vcy9EZWJ1ZyRNZW1vcnlJbmZvOylWIiwKICAgICAgICAgICAgICh2b2lkKikgYW5kcm9pZF9vc19EZWJ1Z19nZXREaXJ0eVBhZ2VzUGlkIH0sCisgICAgeyAiZHVtcE5hdGl2ZUhlYXAiLCAgICAgICAgICIoTGphdmEvaW8vRmlsZURlc2NyaXB0b3I7KVYiLAorICAgICAgICAgICAgKHZvaWQqKSBhbmRyb2lkX29zX0RlYnVnX2R1bXBOYXRpdmVIZWFwIH0sCiAgICAgeyAiZ2V0QmluZGVyU2VudFRyYW5zYWN0aW9ucyIsICIoKUkiLAogICAgICAgICAgICAgKHZvaWQqKSBhbmRyb2lkX29zX0RlYnVnX2dldEJpbmRlclNlbnRUcmFuc2FjdGlvbnMgfSwKICAgICB7ICJnZXRCaW5kZXJSZWNlaXZlZFRyYW5zYWN0aW9ucyIsICIoKUkiLApAQCAtMzIwLDQgKzQ5NSw0IEBACiAgICAgcmV0dXJuIGpuaVJlZ2lzdGVyTmF0aXZlTWV0aG9kcyhlbnYsICJhbmRyb2lkL29zL0RlYnVnIiwgZ01ldGhvZHMsIE5FTEVNKGdNZXRob2RzKSk7CiB9CiAKLX07Cit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvY29yZS9qbmkvYW5kcm9pZF9vc19GaWxlVXRpbHMuY3BwIGIvY29yZS9qbmkvYW5kcm9pZF9vc19GaWxlVXRpbHMuY3BwCmluZGV4IDIxY2I5MTkuLmQzZmFhMmYgMTAwNjQ0Ci0tLSBhL2NvcmUvam5pL2FuZHJvaWRfb3NfRmlsZVV0aWxzLmNwcAorKysgYi9jb3JlL2puaS9hbmRyb2lkX29zX0ZpbGVVdGlscy5jcHAKQEAgLTExMyw2ICsxMTMsMTEgQEAKICAgICAjZW5kaWYKIH0KIAoramludCBhbmRyb2lkX29zX0ZpbGVVdGlsc19zZXRVTWFzayhKTklFbnYqIGVudiwgam9iamVjdCBjbGF6eiwgamludCBtYXNrKQoreworICAgIHJldHVybiB1bWFzayhtYXNrKTsKK30KKwogamludCBhbmRyb2lkX29zX0ZpbGVVdGlsc19nZXRGYXRWb2x1bWVJZChKTklFbnYqIGVudiwgam9iamVjdCBjbGF6eiwganN0cmluZyBwYXRoKQogewogICAgICNpZiBIQVZFX0FORFJPSURfT1MKQEAgLTE3MCw2ICsxNzUsNyBAQAogc3RhdGljIGNvbnN0IEpOSU5hdGl2ZU1ldGhvZCBtZXRob2RzW10gPSB7CiAgICAgeyJzZXRQZXJtaXNzaW9ucyIsICAiKExqYXZhL2xhbmcvU3RyaW5nO0lJSSlJIiwgKHZvaWQqKWFuZHJvaWRfb3NfRmlsZVV0aWxzX3NldFBlcm1pc3Npb25zfSwKICAgICB7ImdldFBlcm1pc3Npb25zIiwgICIoTGphdmEvbGFuZy9TdHJpbmc7W0kpSSIsICh2b2lkKilhbmRyb2lkX29zX0ZpbGVVdGlsc19nZXRQZXJtaXNzaW9uc30sCisgICAgeyJzZXRVTWFzayIsICAgICAgICAiKEkpSSIsICAgICAgICAgICAgICAgICAgICAodm9pZCopYW5kcm9pZF9vc19GaWxlVXRpbHNfc2V0VU1hc2t9LAogICAgIHsiZ2V0RmF0Vm9sdW1lSWQiLCAgIihMamF2YS9sYW5nL1N0cmluZzspSSIsICh2b2lkKilhbmRyb2lkX29zX0ZpbGVVdGlsc19nZXRGYXRWb2x1bWVJZH0sCiAgICAgeyJnZXRGaWxlU3RhdHVzIiwgICIoTGphdmEvbGFuZy9TdHJpbmc7TGFuZHJvaWQvb3MvRmlsZVV0aWxzJEZpbGVTdGF0dXM7KVoiLCAodm9pZCopYW5kcm9pZF9vc19GaWxlVXRpbHNfZ2V0RmlsZVN0YXR1c30sCiB9OwpkaWZmIC0tZ2l0IGEvY29yZS9qbmkvYW5kcm9pZF9vc19QYXJjZWxGaWxlRGVzY3JpcHRvci5jcHAgYi9jb3JlL2puaS9hbmRyb2lkX29zX1BhcmNlbEZpbGVEZXNjcmlwdG9yLmNwcAppbmRleCA4NDhhNTdhLi5lY2VlZjFjIDEwMDY0NAotLS0gYS9jb3JlL2puaS9hbmRyb2lkX29zX1BhcmNlbEZpbGVEZXNjcmlwdG9yLmNwcAorKysgYi9jb3JlL2puaS9hbmRyb2lkX29zX1BhcmNlbEZpbGVEZXNjcmlwdG9yLmNwcApAQCAtNjYsNiArNjYsMjYgQEAKICAgICByZXR1cm4gZmlsZURlc2NyaXB0b3JDbG9uZTsKIH0KIAorc3RhdGljIGludCBhbmRyb2lkX29zX1BhcmNlbEZpbGVEZXNjcmlwdG9yX2NyZWF0ZVBpcGVOYXRpdmUoSk5JRW52KiBlbnYsCisgICAgam9iamVjdCBjbGF6eiwgam9iamVjdEFycmF5IG91dEZkcykKK3sKKyAgICBpbnQgZmRzWzJdOworICAgIGlmIChwaXBlKGZkcykgPCAwKSB7CisgICAgICAgIHJldHVybiAtZXJybm87CisgICAgfQorCisgICAgZm9yIChpbnQgaT0wOyBpPDI7IGkrKykgeworICAgICAgICBqb2JqZWN0IGZkT2JqID0gZW52LT5OZXdPYmplY3QoZ0ZpbGVEZXNjcmlwdG9yT2Zmc2V0cy5tQ2xhc3MsCisgICAgICAgICAgICAgICAgZ0ZpbGVEZXNjcmlwdG9yT2Zmc2V0cy5tQ29uc3RydWN0b3IpOworICAgICAgICBpZiAoZmRPYmogIT0gTlVMTCkgeworICAgICAgICAgICAgZW52LT5TZXRJbnRGaWVsZChmZE9iaiwgZ0ZpbGVEZXNjcmlwdG9yT2Zmc2V0cy5tRGVzY3JpcHRvciwgZmRzW2ldKTsKKyAgICAgICAgfQorICAgICAgICBlbnYtPlNldE9iamVjdEFycmF5RWxlbWVudChvdXRGZHMsIGksIGZkT2JqKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKwogc3RhdGljIGppbnQgZ2V0RmQoSk5JRW52KiBlbnYsIGpvYmplY3QgY2xhenopCiB7CiAgICAgam9iamVjdCBkZXNjcmlwdG9yID0gZW52LT5HZXRPYmplY3RGaWVsZChjbGF6eiwgZ1BhcmNlbEZpbGVEZXNjcmlwdG9yT2Zmc2V0cy5tRmlsZURlc2NyaXB0b3IpOwpAQCAtMTA5LDYgKzEyOSw4IEBACiBzdGF0aWMgY29uc3QgSk5JTmF0aXZlTWV0aG9kIGdQYXJjZWxGaWxlRGVzY3JpcHRvck1ldGhvZHNbXSA9IHsKICAgICB7ImdldEZpbGVEZXNjcmlwdG9yRnJvbVNvY2tldCIsICIoTGphdmEvbmV0L1NvY2tldDspTGphdmEvaW8vRmlsZURlc2NyaXB0b3I7IiwKICAgICAgICAgKHZvaWQqKWFuZHJvaWRfb3NfUGFyY2VsRmlsZURlc2NyaXB0b3JfZ2V0RmlsZURlc2NyaXB0b3JGcm9tU29ja2V0fSwKKyAgICB7ImNyZWF0ZVBpcGVOYXRpdmUiLCAiKFtMamF2YS9pby9GaWxlRGVzY3JpcHRvcjspSSIsCisgICAgICAgICh2b2lkKilhbmRyb2lkX29zX1BhcmNlbEZpbGVEZXNjcmlwdG9yX2NyZWF0ZVBpcGVOYXRpdmV9LAogICAgIHsiZ2V0U3RhdFNpemUiLCAiKClKIiwKICAgICAgICAgKHZvaWQqKWFuZHJvaWRfb3NfUGFyY2VsRmlsZURlc2NyaXB0b3JfZ2V0U3RhdFNpemV9LAogICAgIHsic2Vla1RvIiwgIihKKUoiLApkaWZmIC0tZ2l0IGEvY29yZS9qbmkvYW5kcm9pZF9zZXJ2ZXJfQmx1ZXRvb3RoRXZlbnRMb29wLmNwcCBiL2NvcmUvam5pL2FuZHJvaWRfc2VydmVyX0JsdWV0b290aEV2ZW50TG9vcC5jcHAKaW5kZXggMDFiNjcxMS4uNmVmMTU0ZSAxMDA2NDQKLS0tIGEvY29yZS9qbmkvYW5kcm9pZF9zZXJ2ZXJfQmx1ZXRvb3RoRXZlbnRMb29wLmNwcAorKysgYi9jb3JlL2puaS9hbmRyb2lkX3NlcnZlcl9CbHVldG9vdGhFdmVudExvb3AuY3BwCkBAIC02NCw2ICs2NCwxMSBAQAogc3RhdGljIGptZXRob2RJRCBtZXRob2Rfb25BZ2VudEF1dGhvcml6ZTsKIHN0YXRpYyBqbWV0aG9kSUQgbWV0aG9kX29uQWdlbnRDYW5jZWw7CiAKK3N0YXRpYyBqbWV0aG9kSUQgbWV0aG9kX29uSW5wdXREZXZpY2VQcm9wZXJ0eUNoYW5nZWQ7CitzdGF0aWMgam1ldGhvZElEIG1ldGhvZF9vbklucHV0RGV2aWNlQ29ubmVjdGlvblJlc3VsdDsKK3N0YXRpYyBqbWV0aG9kSUQgbWV0aG9kX29uUGFuRGV2aWNlUHJvcGVydHlDaGFuZ2VkOworc3RhdGljIGptZXRob2RJRCBtZXRob2Rfb25QYW5EZXZpY2VDb25uZWN0aW9uUmVzdWx0OworCiB0eXBlZGVmIGV2ZW50X2xvb3BfbmF0aXZlX2RhdGFfdCBuYXRpdmVfZGF0YV90OwogCiAjZGVmaW5lIEVWRU5UX0xPT1BfUkVGUyAxMApAQCAtMTE2LDYgKzEyMSwxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKExqYXZhL2xhbmcvU3RyaW5nO0kpViIpOwogICAgIG1ldGhvZF9vbkRpc3BsYXlQYXNza2V5ID0gZW52LT5HZXRNZXRob2RJRChjbGF6eiwgIm9uRGlzcGxheVBhc3NrZXkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKExqYXZhL2xhbmcvU3RyaW5nO0lJKVYiKTsKKyAgICBtZXRob2Rfb25JbnB1dERldmljZVByb3BlcnR5Q2hhbmdlZCA9IGVudi0+R2V0TWV0aG9kSUQoY2xhenosICJvbklucHV0RGV2aWNlUHJvcGVydHlDaGFuZ2VkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihMamF2YS9sYW5nL1N0cmluZztbTGphdmEvbGFuZy9TdHJpbmc7KVYiKTsKKyAgICBtZXRob2Rfb25JbnB1dERldmljZUNvbm5lY3Rpb25SZXN1bHQgPSBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCAib25JbnB1dERldmljZUNvbm5lY3Rpb25SZXN1bHQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKExqYXZhL2xhbmcvU3RyaW5nO1opViIpOworICAgIG1ldGhvZF9vblBhbkRldmljZVByb3BlcnR5Q2hhbmdlZCA9IGVudi0+R2V0TWV0aG9kSUQoY2xhenosICJvblBhbkRldmljZVByb3BlcnR5Q2hhbmdlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoTGphdmEvbGFuZy9TdHJpbmc7W0xqYXZhL2xhbmcvU3RyaW5nOylWIik7CisgICAgbWV0aG9kX29uUGFuRGV2aWNlQ29ubmVjdGlvblJlc3VsdCA9IGVudi0+R2V0TWV0aG9kSUQoY2xhenosICJvblBhbkRldmljZUNvbm5lY3Rpb25SZXN1bHQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKExqYXZhL2xhbmcvU3RyaW5nO1opViIpOwogCiAgICAgZmllbGRfbU5hdGl2ZURhdGEgPSBlbnYtPkdldEZpZWxkSUQoY2xhenosICJtTmF0aXZlRGF0YSIsICJJIik7CiAjZW5kaWYKQEAgLTIyNiw2ICsyMzksMjAgQEAKICAgICAgICAgICAgIHJldHVybiBKTklfRkFMU0U7CiAgICAgICAgIH0KICAgICAgICAgZGJ1c19idXNfYWRkX21hdGNoKG5hdC0+Y29ubiwKKyAgICAgICAgICAgICAgICAidHlwZT0nc2lnbmFsJyxpbnRlcmZhY2U9JyJCTFVFWl9EQlVTX0JBU0VfSUZDIi5JbnB1dCciLAorICAgICAgICAgICAgICAgICZlcnIpOworICAgICAgICBpZiAoZGJ1c19lcnJvcl9pc19zZXQoJmVycikpIHsKKyAgICAgICAgICAgIExPR19BTkRfRlJFRV9EQlVTX0VSUk9SKCZlcnIpOworICAgICAgICAgICAgcmV0dXJuIEpOSV9GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBkYnVzX2J1c19hZGRfbWF0Y2gobmF0LT5jb25uLAorICAgICAgICAgICAgICAgICJ0eXBlPSdzaWduYWwnLGludGVyZmFjZT0nIkJMVUVaX0RCVVNfQkFTRV9JRkMiLk5ldHdvcmsnIiwKKyAgICAgICAgICAgICAgICAmZXJyKTsKKyAgICAgICAgaWYgKGRidXNfZXJyb3JfaXNfc2V0KCZlcnIpKSB7CisgICAgICAgICAgICBMT0dfQU5EX0ZSRUVfREJVU19FUlJPUigmZXJyKTsKKyAgICAgICAgICAgIHJldHVybiBKTklfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgZGJ1c19idXNfYWRkX21hdGNoKG5hdC0+Y29ubiwKICAgICAgICAgICAgICAgICAidHlwZT0nc2lnbmFsJyxpbnRlcmZhY2U9J29yZy5ibHVlei5BdWRpb1NpbmsnIiwKICAgICAgICAgICAgICAgICAmZXJyKTsKICAgICAgICAgaWYgKGRidXNfZXJyb3JfaXNfc2V0KCZlcnIpKSB7CkBAIC04NTMsNyArODgwLDM5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kX29uRGV2aWNlRGlzY29ubmVjdFJlcXVlc3RlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnYtPk5ld1N0cmluZ1VURihyZW1vdGVfZGV2aWNlX3BhdGgpKTsKICAgICAgICAgZ290byBzdWNjZXNzOwotICAgIH0KKyAgICB9IGVsc2UgaWYgKGRidXNfbWVzc2FnZV9pc19zaWduYWwobXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmJsdWV6LklucHV0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlByb3BlcnR5Q2hhbmdlZCIpKSB7CisKKyAgICAgICAgam9iamVjdEFycmF5IHN0cl9hcnJheSA9CisgICAgICAgICAgICAgICAgICAgIHBhcnNlX2lucHV0X3Byb3BlcnR5X2NoYW5nZShlbnYsIG1zZyk7CisgICAgICAgIGlmIChzdHJfYXJyYXkgIT0gTlVMTCkgeworICAgICAgICAgICAgY29uc3QgY2hhciAqY19wYXRoID0gZGJ1c19tZXNzYWdlX2dldF9wYXRoKG1zZyk7CisgICAgICAgICAgICBlbnYtPkNhbGxWb2lkTWV0aG9kKG5hdC0+bWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZF9vbklucHV0RGV2aWNlUHJvcGVydHlDaGFuZ2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnYtPk5ld1N0cmluZ1VURihjX3BhdGgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJfYXJyYXkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTE9HX0FORF9GUkVFX0RCVVNfRVJST1JfV0lUSF9NU0coJmVyciwgbXNnKTsKKyAgICAgICAgfQorICAgICAgICBnb3RvIHN1Y2Nlc3M7CisgICAgfSBlbHNlIGlmIChkYnVzX21lc3NhZ2VfaXNfc2lnbmFsKG1zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmJsdWV6Lk5ldHdvcmsiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQcm9wZXJ0eUNoYW5nZWQiKSkgeworCisgICAgICAgam9iamVjdEFycmF5IHN0cl9hcnJheSA9CisgICAgICAgICAgICAgICAgICAgcGFyc2VfcGFuX3Byb3BlcnR5X2NoYW5nZShlbnYsIG1zZyk7CisgICAgICAgaWYgKHN0cl9hcnJheSAhPSBOVUxMKSB7CisgICAgICAgICAgIGNvbnN0IGNoYXIgKmNfcGF0aCA9IGRidXNfbWVzc2FnZV9nZXRfcGF0aChtc2cpOworICAgICAgICAgICBlbnYtPkNhbGxWb2lkTWV0aG9kKG5hdC0+bWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kX29uUGFuRGV2aWNlUHJvcGVydHlDaGFuZ2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudi0+TmV3U3RyaW5nVVRGKGNfcGF0aCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyX2FycmF5KTsKKyAgICAgICB9IGVsc2UgeworICAgICAgICAgICBMT0dfQU5EX0ZSRUVfREJVU19FUlJPUl9XSVRIX01TRygmZXJyLCBtc2cpOworICAgICAgIH0KKyAgICAgICBnb3RvIHN1Y2Nlc3M7CisgICB9CiAKICAgICByZXQgPSBhMmRwX2V2ZW50X2ZpbHRlcihtc2csIGVudik7CiAgICAgZW52LT5Qb3BMb2NhbEZyYW1lKE5VTEwpOwpAQCAtMTIxMCw2ICsxMjY5LDU3IEBACiAgICAgZW52LT5EZWxldGVMb2NhbFJlZihhZGRyKTsKICAgICBmcmVlKHVzZXIpOwogfQorCit2b2lkIG9uSW5wdXREZXZpY2VDb25uZWN0aW9uUmVzdWx0KERCdXNNZXNzYWdlICptc2csIHZvaWQgKnVzZXIsIHZvaWQgKm4pIHsKKyAgICBMT0dWKF9fRlVOQ1RJT05fXyk7CisKKyAgICBuYXRpdmVfZGF0YV90ICpuYXQgPSAobmF0aXZlX2RhdGFfdCAqKW47CisgICAgY29uc3QgY2hhciAqcGF0aCA9IChjb25zdCBjaGFyICopdXNlcjsKKyAgICBEQnVzRXJyb3IgZXJyOworICAgIGRidXNfZXJyb3JfaW5pdCgmZXJyKTsKKyAgICBKTklFbnYgKmVudjsKKyAgICBuYXQtPnZtLT5HZXRFbnYoKHZvaWQqKikmZW52LCBuYXQtPmVudlZlcik7CisKKyAgICBib29sIHJlc3VsdCA9IEpOSV9UUlVFOworICAgIGlmIChkYnVzX3NldF9lcnJvcl9mcm9tX21lc3NhZ2UoJmVyciwgbXNnKSkgeworICAgICAgICBMT0dfQU5EX0ZSRUVfREJVU19FUlJPUigmZXJyKTsKKyAgICAgICAgcmVzdWx0ID0gSk5JX0ZBTFNFOworICAgIH0KKyAgICBMT0dWKCIuLi4gRGV2aWNlIFBhdGggPSAlcywgcmVzdWx0ID0gJWQiLCBwYXRoLCByZXN1bHQpOworICAgIGpzdHJpbmcgalBhdGggPSBlbnYtPk5ld1N0cmluZ1VURihwYXRoKTsKKyAgICBlbnYtPkNhbGxWb2lkTWV0aG9kKG5hdC0+bWUsCisgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Rfb25JbnB1dERldmljZUNvbm5lY3Rpb25SZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICBqUGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCk7CisgICAgZW52LT5EZWxldGVMb2NhbFJlZihqUGF0aCk7CisgICAgZnJlZSh1c2VyKTsKK30KKwordm9pZCBvblBhbkRldmljZUNvbm5lY3Rpb25SZXN1bHQoREJ1c01lc3NhZ2UgKm1zZywgdm9pZCAqdXNlciwgdm9pZCAqbikgeworICAgIExPR1YoX19GVU5DVElPTl9fKTsKKworICAgIG5hdGl2ZV9kYXRhX3QgKm5hdCA9IChuYXRpdmVfZGF0YV90ICopbjsKKyAgICBjb25zdCBjaGFyICpwYXRoID0gKGNvbnN0IGNoYXIgKil1c2VyOworICAgIERCdXNFcnJvciBlcnI7CisgICAgZGJ1c19lcnJvcl9pbml0KCZlcnIpOworICAgIEpOSUVudiAqZW52OworICAgIG5hdC0+dm0tPkdldEVudigodm9pZCoqKSZlbnYsIG5hdC0+ZW52VmVyKTsKKworICAgIGJvb2wgcmVzdWx0ID0gSk5JX1RSVUU7CisgICAgaWYgKGRidXNfc2V0X2Vycm9yX2Zyb21fbWVzc2FnZSgmZXJyLCBtc2cpKSB7CisgICAgICAgIExPR19BTkRfRlJFRV9EQlVTX0VSUk9SKCZlcnIpOworICAgICAgICByZXN1bHQgPSBKTklfRkFMU0U7CisgICAgfQorICAgIExPR1YoIi4uLiBQYW4gRGV2aWNlIFBhdGggPSAlcywgcmVzdWx0ID0gJWQiLCBwYXRoLCByZXN1bHQpOworICAgIGpzdHJpbmcgalBhdGggPSBlbnYtPk5ld1N0cmluZ1VURihwYXRoKTsKKyAgICBlbnYtPkNhbGxWb2lkTWV0aG9kKG5hdC0+bWUsCisgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Rfb25QYW5EZXZpY2VDb25uZWN0aW9uUmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgalBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpOworICAgIGVudi0+RGVsZXRlTG9jYWxSZWYoalBhdGgpOworICAgIGZyZWUodXNlcik7Cit9CisKICNlbmRpZgogCiBzdGF0aWMgSk5JTmF0aXZlTWV0aG9kIHNNZXRob2RzW10gPSB7CmRpZmYgLS1naXQgYS9jb3JlL2puaS9hbmRyb2lkX3NlcnZlcl9CbHVldG9vdGhTZXJ2aWNlLmNwcCBiL2NvcmUvam5pL2FuZHJvaWRfc2VydmVyX0JsdWV0b290aFNlcnZpY2UuY3BwCmluZGV4IDQ0MjBhY2EuLjc0MTI3Y2YgMTAwNjQ0Ci0tLSBhL2NvcmUvam5pL2FuZHJvaWRfc2VydmVyX0JsdWV0b290aFNlcnZpY2UuY3BwCisrKyBiL2NvcmUvam5pL2FuZHJvaWRfc2VydmVyX0JsdWV0b290aFNlcnZpY2UuY3BwCkBAIC0xNiw2ICsxNiwxMSBAQAogCiAjZGVmaW5lIERCVVNfQURBUFRFUl9JRkFDRSBCTFVFWl9EQlVTX0JBU0VfSUZDICIuQWRhcHRlciIKICNkZWZpbmUgREJVU19ERVZJQ0VfSUZBQ0UgQkxVRVpfREJVU19CQVNFX0lGQyAiLkRldmljZSIKKyNkZWZpbmUgREJVU19JTlBVVF9JRkFDRSBCTFVFWl9EQlVTX0JBU0VfSUZDICIuSW5wdXQiCisjZGVmaW5lIERCVVNfTkVUV09SS19JRkFDRSBCTFVFWl9EQlVTX0JBU0VfSUZDICIuTmV0d29yayIKKyNkZWZpbmUgREJVU19ORVRXT1JLU0VSVkVSX0lGQUNFIEJMVUVaX0RCVVNfQkFTRV9JRkMgIi5OZXR3b3JrU2VydmVyIgorCisKICNkZWZpbmUgTE9HX1RBRyAiQmx1ZXRvb3RoU2VydmljZS5jcHAiCiAKICNpbmNsdWRlICJhbmRyb2lkX2JsdWV0b290aF9jb21tb24uaCIKQEAgLTY4LDYgKzczLDkgQEAKIHZvaWQgb25DcmVhdGVQYWlyZWREZXZpY2VSZXN1bHQoREJ1c01lc3NhZ2UgKm1zZywgdm9pZCAqdXNlciwgdm9pZCAqbmF0KTsKIHZvaWQgb25EaXNjb3ZlclNlcnZpY2VzUmVzdWx0KERCdXNNZXNzYWdlICptc2csIHZvaWQgKnVzZXIsIHZvaWQgKm5hdCk7CiB2b2lkIG9uQ3JlYXRlRGV2aWNlUmVzdWx0KERCdXNNZXNzYWdlICptc2csIHZvaWQgKnVzZXIsIHZvaWQgKm5hdCk7Cit2b2lkIG9uSW5wdXREZXZpY2VDb25uZWN0aW9uUmVzdWx0KERCdXNNZXNzYWdlICptc2csIHZvaWQgKnVzZXIsIHZvaWQgKm5hdCk7Cit2b2lkIG9uQ29ubmVjdFBhblJlc3VsdChEQnVzTWVzc2FnZSAqbXNnLCB2b2lkICp1c2VyLCB2b2lkICpuKTsKK3ZvaWQgb25QYW5EZXZpY2VDb25uZWN0aW9uUmVzdWx0KERCdXNNZXNzYWdlICptc2csIHZvaWQgKnVzZXIsIHZvaWQgKm5hdCk7CiAKIAogLyoqIEdldCBuYXRpdmUgZGF0YSBzdG9yZWQgaW4gdGhlIG9wYXF1ZSAoSmF2YSBjb2RlIG1haW50YWluZWQpIHBvaW50ZXIgbU5hdGl2ZURhdGEKQEAgLTg4MSw2ICs4ODksMTYwIEBACiAgICAgcmV0dXJuIEpOSV9GQUxTRTsKIH0KIAorc3RhdGljIGpib29sZWFuIGNvbm5lY3RJbnB1dERldmljZU5hdGl2ZShKTklFbnYgKmVudiwgam9iamVjdCBvYmplY3QsIGpzdHJpbmcgcGF0aCkgeworICAgIExPR1YoX19GVU5DVElPTl9fKTsKKyNpZmRlZiBIQVZFX0JMVUVUT09USAorICAgIG5hdGl2ZV9kYXRhX3QgKm5hdCA9IGdldF9uYXRpdmVfZGF0YShlbnYsIG9iamVjdCk7CisgICAgam9iamVjdCBldmVudExvb3AgPSBlbnYtPkdldE9iamVjdEZpZWxkKG9iamVjdCwgZmllbGRfbUV2ZW50TG9vcCk7CisgICAgc3RydWN0IGV2ZW50X2xvb3BfbmF0aXZlX2RhdGFfdCAqZXZlbnRMb29wTmF0ID0KKyAgICAgICAgICAgIGdldF9FdmVudExvb3BfbmF0aXZlX2RhdGEoZW52LCBldmVudExvb3ApOworCisgICAgaWYgKG5hdCAmJiBldmVudExvb3BOYXQpIHsKKyAgICAgICAgY29uc3QgY2hhciAqY19wYXRoID0gZW52LT5HZXRTdHJpbmdVVEZDaGFycyhwYXRoLCBOVUxMKTsKKworICAgICAgICBpbnQgbGVuID0gZW52LT5HZXRTdHJpbmdMZW5ndGgocGF0aCkgKyAxOworICAgICAgICBjaGFyICpjb250ZXh0X3BhdGggPSAoY2hhciAqKWNhbGxvYyhsZW4sIHNpemVvZihjaGFyKSk7CisgICAgICAgIHN0cmxjcHkoY29udGV4dF9wYXRoLCBjX3BhdGgsIGxlbik7ICAvLyBmb3IgY2FsbGJhY2sKKworICAgICAgICBib29sIHJldCA9IGRidXNfZnVuY19hcmdzX2FzeW5jKGVudiwgbmF0LT5jb25uLCAtMSwgb25JbnB1dERldmljZUNvbm5lY3Rpb25SZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dF9wYXRoLCBldmVudExvb3BOYXQsIGNfcGF0aCwgREJVU19JTlBVVF9JRkFDRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ29ubmVjdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpOworCisgICAgICAgIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKHBhdGgsIGNfcGF0aCk7CisgICAgICAgIHJldHVybiByZXQgPyBKTklfVFJVRSA6IEpOSV9GQUxTRTsKKyAgICB9CisjZW5kaWYKKyAgICByZXR1cm4gSk5JX0ZBTFNFOworfQorCitzdGF0aWMgamJvb2xlYW4gZGlzY29ubmVjdElucHV0RGV2aWNlTmF0aXZlKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqc3RyaW5nIHBhdGgpIHsKKyAgICBMT0dWKF9fRlVOQ1RJT05fXyk7CisjaWZkZWYgSEFWRV9CTFVFVE9PVEgKKyAgICBuYXRpdmVfZGF0YV90ICpuYXQgPSBnZXRfbmF0aXZlX2RhdGEoZW52LCBvYmplY3QpOworICAgIGpvYmplY3QgZXZlbnRMb29wID0gZW52LT5HZXRPYmplY3RGaWVsZChvYmplY3QsIGZpZWxkX21FdmVudExvb3ApOworICAgIHN0cnVjdCBldmVudF9sb29wX25hdGl2ZV9kYXRhX3QgKmV2ZW50TG9vcE5hdCA9CisgICAgICAgICAgICBnZXRfRXZlbnRMb29wX25hdGl2ZV9kYXRhKGVudiwgZXZlbnRMb29wKTsKKworICAgIGlmIChuYXQgJiYgZXZlbnRMb29wTmF0KSB7CisgICAgICAgIGNvbnN0IGNoYXIgKmNfcGF0aCA9IGVudi0+R2V0U3RyaW5nVVRGQ2hhcnMocGF0aCwgTlVMTCk7CisKKyAgICAgICAgaW50IGxlbiA9IGVudi0+R2V0U3RyaW5nTGVuZ3RoKHBhdGgpICsgMTsKKyAgICAgICAgY2hhciAqY29udGV4dF9wYXRoID0gKGNoYXIgKiljYWxsb2MobGVuLCBzaXplb2YoY2hhcikpOworICAgICAgICBzdHJsY3B5KGNvbnRleHRfcGF0aCwgY19wYXRoLCBsZW4pOyAgLy8gZm9yIGNhbGxiYWNrCisKKyAgICAgICAgYm9vbCByZXQgPSBkYnVzX2Z1bmNfYXJnc19hc3luYyhlbnYsIG5hdC0+Y29ubiwgLTEsIG9uSW5wdXREZXZpY2VDb25uZWN0aW9uUmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHRfcGF0aCwgZXZlbnRMb29wTmF0LCBjX3BhdGgsIERCVVNfSU5QVVRfSUZBQ0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRpc2Nvbm5lY3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKTsKKworICAgICAgICBlbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhwYXRoLCBjX3BhdGgpOworICAgICAgICByZXR1cm4gcmV0ID8gSk5JX1RSVUUgOiBKTklfRkFMU0U7CisgICAgfQorI2VuZGlmCisgICAgcmV0dXJuIEpOSV9GQUxTRTsKK30KKworc3RhdGljIGpib29sZWFuIHNldEJsdWV0b290aFRldGhlcmluZ05hdGl2ZShKTklFbnYgKmVudiwgam9iamVjdCBvYmplY3QsIGpib29sZWFuIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqc3RyaW5nIHNyY19yb2xlLCBqc3RyaW5nIGJyaWRnZSkgeworICAgIExPR1YoX19GVU5DVElPTl9fKTsKKyNpZmRlZiBIQVZFX0JMVUVUT09USAorICAgIG5hdGl2ZV9kYXRhX3QgKm5hdCA9IGdldF9uYXRpdmVfZGF0YShlbnYsIG9iamVjdCk7CisgICAgaWYgKG5hdCkgeworICAgICAgICBEQnVzTWVzc2FnZSAqcmVwbHk7CisgICAgICAgIGNvbnN0IGNoYXIgKmNfcm9sZSA9IGVudi0+R2V0U3RyaW5nVVRGQ2hhcnMoc3JjX3JvbGUsIE5VTEwpOworICAgICAgICBjb25zdCBjaGFyICpjX2JyaWRnZSA9IGVudi0+R2V0U3RyaW5nVVRGQ2hhcnMoYnJpZGdlLCBOVUxMKTsKKyAgICAgICAgaWYgKHZhbHVlKSB7CisgICAgICAgICAgICBMT0dFKCJzZXRCbHVldG9vdGhUZXRoZXJpbmdOYXRpdmUgdHJ1ZSIpOworICAgICAgICAgICAgcmVwbHkgPSBkYnVzX2Z1bmNfYXJncyhlbnYsIG5hdC0+Y29ubiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfYWRhcHRlcl9wYXRoKGVudiwgb2JqZWN0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX05FVFdPUktTRVJWRVJfSUZBQ0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlZ2lzdGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmY19yb2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsICZjX2JyaWRnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMT0dFKCJzZXRCbHVldG9vdGhUZXRoZXJpbmdOYXRpdmUgZmFsc2UiKTsKKyAgICAgICAgICAgIHJlcGx5ID0gZGJ1c19mdW5jX2FyZ3MoZW52LCBuYXQtPmNvbm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2FkYXB0ZXJfcGF0aChlbnYsIG9iamVjdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19ORVRXT1JLU0VSVkVSX0lGQUNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbnJlZ2lzdGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmY19yb2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKTsKKyAgICAgICAgfQorICAgICAgICBlbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhzcmNfcm9sZSwgY19yb2xlKTsKKyAgICAgICAgZW52LT5SZWxlYXNlU3RyaW5nVVRGQ2hhcnMoYnJpZGdlLCBjX2JyaWRnZSk7CisgICAgICAgIHJldHVybiByZXBseSA/IEpOSV9UUlVFIDogSk5JX0ZBTFNFOworICAgIH0KKyNlbmRpZgorICAgIHJldHVybiBKTklfRkFMU0U7Cit9CisKK3N0YXRpYyBqYm9vbGVhbiBjb25uZWN0UGFuRGV2aWNlTmF0aXZlKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iamVjdCwganN0cmluZyBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganN0cmluZyBzcmNSb2xlLCBqc3RyaW5nIGRzdFJvbGUpIHsKKyAgICBMT0dWKF9fRlVOQ1RJT05fXyk7CisjaWZkZWYgSEFWRV9CTFVFVE9PVEgKKyAgICBMT0dFKCJjb25uZWN0UGFuRGV2aWNlTmF0aXZlIik7CisgICAgbmF0aXZlX2RhdGFfdCAqbmF0ID0gZ2V0X25hdGl2ZV9kYXRhKGVudiwgb2JqZWN0KTsKKyAgICBqb2JqZWN0IGV2ZW50TG9vcCA9IGVudi0+R2V0T2JqZWN0RmllbGQob2JqZWN0LCBmaWVsZF9tRXZlbnRMb29wKTsKKyAgICBzdHJ1Y3QgZXZlbnRfbG9vcF9uYXRpdmVfZGF0YV90ICpldmVudExvb3BOYXQgPQorICAgICAgICAgICAgZ2V0X0V2ZW50TG9vcF9uYXRpdmVfZGF0YShlbnYsIGV2ZW50TG9vcCk7CisKKyAgICBpZiAobmF0ICYmIGV2ZW50TG9vcE5hdCkgeworICAgICAgICBjb25zdCBjaGFyICpjX3BhdGggPSBlbnYtPkdldFN0cmluZ1VURkNoYXJzKHBhdGgsIE5VTEwpOworICAgICAgICBjb25zdCBjaGFyICpzcmMgPSBlbnYtPkdldFN0cmluZ1VURkNoYXJzKHNyY1JvbGUsIE5VTEwpOworICAgICAgICBjb25zdCBjaGFyICpkc3QgPSBlbnYtPkdldFN0cmluZ1VURkNoYXJzKGRzdFJvbGUsIE5VTEwpOworCisgICAgICAgIGludCBsZW4gPSBlbnYtPkdldFN0cmluZ0xlbmd0aChwYXRoKSArIDE7CisgICAgICAgIGNoYXIgKmNvbnRleHRfcGF0aCA9IChjaGFyICopY2FsbG9jKGxlbiwgc2l6ZW9mKGNoYXIpKTsKKyAgICAgICAgc3RybGNweShjb250ZXh0X3BhdGgsIGNfcGF0aCwgbGVuKTsgIC8vIGZvciBjYWxsYmFjaworCisgICAgICAgIGJvb2wgcmV0ID0gZGJ1c19mdW5jX2FyZ3NfYXN5bmMoZW52LCBuYXQtPmNvbm4sIC0xLG9uUGFuRGV2aWNlQ29ubmVjdGlvblJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHRfcGF0aCwgZXZlbnRMb29wTmF0LCBjX3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX05FVFdPUktfSUZBQ0UsICJDb25uZWN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsICZzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpOworCisgICAgICAgIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKHBhdGgsIGNfcGF0aCk7CisgICAgICAgIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKHNyY1JvbGUsIHNyYyk7CisgICAgICAgIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKGRzdFJvbGUsIGRzdCk7CisgICAgICAgIHJldHVybiByZXQgPyBKTklfVFJVRSA6IEpOSV9GQUxTRTsKKyAgICB9CisjZW5kaWYKKyAgICByZXR1cm4gSk5JX0ZBTFNFOworfQorCitzdGF0aWMgamJvb2xlYW4gZGlzY29ubmVjdFBhbkRldmljZU5hdGl2ZShKTklFbnYgKmVudiwgam9iamVjdCBvYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganN0cmluZyBwYXRoKSB7CisgICAgTE9HVihfX0ZVTkNUSU9OX18pOworI2lmZGVmIEhBVkVfQkxVRVRPT1RICisgICAgTE9HRSgiZGlzY29ubmVjdFBhbkRldmljZU5hdGl2ZSIpOworICAgIG5hdGl2ZV9kYXRhX3QgKm5hdCA9IGdldF9uYXRpdmVfZGF0YShlbnYsIG9iamVjdCk7CisgICAgam9iamVjdCBldmVudExvb3AgPSBlbnYtPkdldE9iamVjdEZpZWxkKG9iamVjdCwgZmllbGRfbUV2ZW50TG9vcCk7CisgICAgc3RydWN0IGV2ZW50X2xvb3BfbmF0aXZlX2RhdGFfdCAqZXZlbnRMb29wTmF0ID0KKyAgICAgICAgICAgIGdldF9FdmVudExvb3BfbmF0aXZlX2RhdGEoZW52LCBldmVudExvb3ApOworCisgICAgaWYgKG5hdCAmJiBldmVudExvb3BOYXQpIHsKKyAgICAgICAgY29uc3QgY2hhciAqY19wYXRoID0gZW52LT5HZXRTdHJpbmdVVEZDaGFycyhwYXRoLCBOVUxMKTsKKworICAgICAgICBpbnQgbGVuID0gZW52LT5HZXRTdHJpbmdMZW5ndGgocGF0aCkgKyAxOworICAgICAgICBjaGFyICpjb250ZXh0X3BhdGggPSAoY2hhciAqKWNhbGxvYyhsZW4sIHNpemVvZihjaGFyKSk7CisgICAgICAgIHN0cmxjcHkoY29udGV4dF9wYXRoLCBjX3BhdGgsIGxlbik7ICAvLyBmb3IgY2FsbGJhY2sKKworICAgICAgICBib29sIHJldCA9IGRidXNfZnVuY19hcmdzX2FzeW5jKGVudiwgbmF0LT5jb25uLCAtMSxvblBhbkRldmljZUNvbm5lY3Rpb25SZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dF9wYXRoLCBldmVudExvb3BOYXQsIGNfcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX05FVFdPUktfSUZBQ0UsICJEaXNjb25uZWN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCk7CisKKyAgICAgICAgZW52LT5SZWxlYXNlU3RyaW5nVVRGQ2hhcnMocGF0aCwgY19wYXRoKTsKKyAgICAgICAgcmV0dXJuIHJldCA/IEpOSV9UUlVFIDogSk5JX0ZBTFNFOworICAgIH0KKyNlbmRpZgorICAgIHJldHVybiBKTklfRkFMU0U7Cit9CisKIHN0YXRpYyBKTklOYXRpdmVNZXRob2Qgc01ldGhvZHNbXSA9IHsKICAgICAgLyogbmFtZSwgc2lnbmF0dXJlLCBmdW5jUHRyICovCiAgICAgeyJjbGFzc0luaXROYXRpdmUiLCAiKClWIiwgKHZvaWQqKWNsYXNzSW5pdE5hdGl2ZX0sCkBAIC05MjYsOCArMTA4OCwxOCBAQAogICAgIHsiYWRkUmZjb21tU2VydmljZVJlY29yZE5hdGl2ZSIsICIoTGphdmEvbGFuZy9TdHJpbmc7SkpTKUkiLCAodm9pZCAqKWFkZFJmY29tbVNlcnZpY2VSZWNvcmROYXRpdmV9LAogICAgIHsicmVtb3ZlU2VydmljZVJlY29yZE5hdGl2ZSIsICIoSSlaIiwgKHZvaWQgKilyZW1vdmVTZXJ2aWNlUmVjb3JkTmF0aXZlfSwKICAgICB7InNldExpbmtUaW1lb3V0TmF0aXZlIiwgIihMamF2YS9sYW5nL1N0cmluZztJKVoiLCAodm9pZCAqKXNldExpbmtUaW1lb3V0TmF0aXZlfSwKKyAgICAvLyBISUQgZnVuY3Rpb25zCisgICAgeyJjb25uZWN0SW5wdXREZXZpY2VOYXRpdmUiLCAiKExqYXZhL2xhbmcvU3RyaW5nOylaIiwgKHZvaWQgKiljb25uZWN0SW5wdXREZXZpY2VOYXRpdmV9LAorICAgIHsiZGlzY29ubmVjdElucHV0RGV2aWNlTmF0aXZlIiwgIihMamF2YS9sYW5nL1N0cmluZzspWiIsICh2b2lkICopZGlzY29ubmVjdElucHV0RGV2aWNlTmF0aXZlfSwKKworICAgIHsic2V0Qmx1ZXRvb3RoVGV0aGVyaW5nTmF0aXZlIiwgIihaTGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmc7KVoiLAorICAgICAgICAgICAgICAodm9pZCAqKXNldEJsdWV0b290aFRldGhlcmluZ05hdGl2ZX0sCisgICAgeyJjb25uZWN0UGFuRGV2aWNlTmF0aXZlIiwgIihMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZzspWiIsCisgICAgICAgICAgICAgICh2b2lkICopY29ubmVjdFBhbkRldmljZU5hdGl2ZX0sCisgICAgeyJkaXNjb25uZWN0UGFuRGV2aWNlTmF0aXZlIiwgIihMamF2YS9sYW5nL1N0cmluZzspWiIsICh2b2lkICopZGlzY29ubmVjdFBhbkRldmljZU5hdGl2ZX0sCiB9OwogCisKIGludCByZWdpc3Rlcl9hbmRyb2lkX3NlcnZlcl9CbHVldG9vdGhTZXJ2aWNlKEpOSUVudiAqZW52KSB7CiAgICAgcmV0dXJuIEFuZHJvaWRSdW50aW1lOjpyZWdpc3Rlck5hdGl2ZU1ldGhvZHMoZW52LAogICAgICAgICAgICAgICAgICJhbmRyb2lkL3NlcnZlci9CbHVldG9vdGhTZXJ2aWNlIiwgc01ldGhvZHMsIE5FTEVNKHNNZXRob2RzKSk7CmRpZmYgLS1naXQgYS9jb3JlL2puaS9hbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzLmNwcCBiL2NvcmUvam5pL2FuZHJvaWRfdmlld19HTEVTMjBDYW52YXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4YzAzYTYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2puaS9hbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzLmNwcApAQCAtMCwwICsxLDQ0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiT3BlbkdMUmVuZGVyZXIiCisKKyNpbmNsdWRlICJqbmkuaCIKKyNpbmNsdWRlIDxuYXRpdmVoZWxwZXIvSk5JSGVscC5oPgorI2luY2x1ZGUgPGFuZHJvaWRfcnVudGltZS9BbmRyb2lkUnVudGltZS5oPgorI2luY2x1ZGUgPHV0aWxzL1Jlc291cmNlVHlwZXMuaD4KKworI2luY2x1ZGUgPFNrQml0bWFwLmg+CisjaW5jbHVkZSA8U2tDYW52YXMuaD4KKyNpbmNsdWRlIDxTa01hdHJpeC5oPgorI2luY2x1ZGUgPFNrUGFpbnQuaD4KKyNpbmNsdWRlIDxTa1JlZ2lvbi5oPgorI2luY2x1ZGUgPFNrU2NhbGVyQ29udGV4dC5oPgorI2luY2x1ZGUgPFNrVGVtcGxhdGVzLmg+CisjaW5jbHVkZSA8U2tYZmVybW9kZS5oPgorCisjaW5jbHVkZSA8T3BlbkdMUmVuZGVyZXIuaD4KKyNpbmNsdWRlIDxTa2lhU2hhZGVyLmg+CisjaW5jbHVkZSA8U2tpYUNvbG9yRmlsdGVyLmg+CisjaW5jbHVkZSA8UmVjdC5oPgorCisjaW5jbHVkZSAiVGV4dExheW91dC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3VzaW5nIG5hbWVzcGFjZSB1aXJlbmRlcmVyOworCisvKioKKyAqIE5vdGU6IE9wZW5HTFJlbmRlcmVyIEpOSSBsYXllciBpcyBnZW5lcmF0ZWQgYW5kIGNvbXBpbGVkIG9ubHkgb24gc3VwcG9ydGVkCisgKiAgICAgICBkZXZpY2VzLiBUaGlzIG1lYW5zIGFsbCB0aGUgbG9naWMgbXVzdCBiZSBjb21waWxlZCBvbmx5IHdoZW4gdGhlCisgKiAgICAgICBwcmVwcm9jZXNzb3IgdmFyaWFibGUgVVNFX09QRU5HTF9SRU5ERVJFUiBpcyBkZWZpbmVkLgorICovCisjaWZkZWYgVVNFX09QRU5HTF9SRU5ERVJFUgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBKYXZhIEFQSXMKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHN0cnVjdCB7CisgICAgamNsYXNzIGNsYXp6OworICAgIGptZXRob2RJRCBzZXQ7Cit9IGdSZWN0Q2xhc3NJbmZvOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDb25zdHJ1Y3RvcnMKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIE9wZW5HTFJlbmRlcmVyKiBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2NyZWF0ZVJlbmRlcmVyKEpOSUVudiogZW52LCBqb2JqZWN0IGNhbnZhcykgeworICAgIHJldHVybiBuZXcgT3BlbkdMUmVuZGVyZXI7Cit9CisKK3N0YXRpYyB2b2lkIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfZGVzdHJveVJlbmRlcmVyKEpOSUVudiogZW52LCBqb2JqZWN0IGNhbnZhcywKKyAgICAgICAgT3BlbkdMUmVuZGVyZXIqIHJlbmRlcmVyKSB7CisgICAgZGVsZXRlIHJlbmRlcmVyOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBTZXR1cAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZCBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX3NldFZpZXdwb3J0KEpOSUVudiogZW52LCBqb2JqZWN0IGNhbnZhcywKKyAgICAgICAgT3BlbkdMUmVuZGVyZXIqIHJlbmRlcmVyLCBqaW50IHdpZHRoLCBqaW50IGhlaWdodCkgeworICAgIHJlbmRlcmVyLT5zZXRWaWV3cG9ydCh3aWR0aCwgaGVpZ2h0KTsKK30KKworc3RhdGljIHZvaWQgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19wcmVwYXJlKEpOSUVudiogZW52LCBqb2JqZWN0IGNhbnZhcywKKyAgICAgICAgT3BlbkdMUmVuZGVyZXIqIHJlbmRlcmVyKSB7CisgICAgcmVuZGVyZXItPnByZXBhcmUoKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gU3RhdGUKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIGppbnQgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19zYXZlKEpOSUVudiogZW52LCBqb2JqZWN0IGNhbnZhcywgT3BlbkdMUmVuZGVyZXIqIHJlbmRlcmVyLAorICAgICAgICBqaW50IGZsYWdzKSB7CisgICAgcmV0dXJuIHJlbmRlcmVyLT5zYXZlKGZsYWdzKTsKK30KKworc3RhdGljIGppbnQgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19nZXRTYXZlQ291bnQoSk5JRW52KiBlbnYsIGpvYmplY3QgY2FudmFzLAorICAgICAgICBPcGVuR0xSZW5kZXJlciogcmVuZGVyZXIpIHsKKyAgICByZXR1cm4gcmVuZGVyZXItPmdldFNhdmVDb3VudCgpOworfQorCitzdGF0aWMgdm9pZCBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX3Jlc3RvcmUoSk5JRW52KiBlbnYsIGpvYmplY3QgY2FudmFzLAorICAgICAgICBPcGVuR0xSZW5kZXJlciogcmVuZGVyZXIpIHsKKyAgICByZW5kZXJlci0+cmVzdG9yZSgpOworfQorCitzdGF0aWMgdm9pZCBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX3Jlc3RvcmVUb0NvdW50KEpOSUVudiogZW52LCBqb2JqZWN0IGNhbnZhcywKKyAgICAgICAgT3BlbkdMUmVuZGVyZXIqIHJlbmRlcmVyLCBqaW50IHNhdmVDb3VudCkgeworICAgIHJlbmRlcmVyLT5yZXN0b3JlVG9Db3VudChzYXZlQ291bnQpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBMYXllcnMKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIGppbnQgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19zYXZlTGF5ZXIoSk5JRW52KiBlbnYsIGpvYmplY3QgY2FudmFzLAorICAgICAgICBPcGVuR0xSZW5kZXJlciogcmVuZGVyZXIsIGpmbG9hdCBsZWZ0LCBqZmxvYXQgdG9wLCBqZmxvYXQgcmlnaHQsIGpmbG9hdCBib3R0b20sCisgICAgICAgIFNrUGFpbnQqIHBhaW50LCBqaW50IHNhdmVGbGFncykgeworICAgIHJldHVybiByZW5kZXJlci0+c2F2ZUxheWVyKGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSwgcGFpbnQsIHNhdmVGbGFncyk7Cit9CisKK3N0YXRpYyBqaW50IGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfc2F2ZUxheWVyQWxwaGEoSk5JRW52KiBlbnYsIGpvYmplY3QgY2FudmFzLAorICAgICAgICBPcGVuR0xSZW5kZXJlciogcmVuZGVyZXIsIGpmbG9hdCBsZWZ0LCBqZmxvYXQgdG9wLCBqZmxvYXQgcmlnaHQsIGpmbG9hdCBib3R0b20sCisgICAgICAgIGppbnQgYWxwaGEsIGppbnQgc2F2ZUZsYWdzKSB7CisgICAgcmV0dXJuIHJlbmRlcmVyLT5zYXZlTGF5ZXJBbHBoYShsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20sIGFscGhhLCBzYXZlRmxhZ3MpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDbGlwcGluZworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgYm9vbCBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX3F1aWNrUmVqZWN0KEpOSUVudiogZW52LCBqb2JqZWN0IGNhbnZhcywKKyAgICAgICAgT3BlbkdMUmVuZGVyZXIqIHJlbmRlcmVyLCBqZmxvYXQgbGVmdCwgamZsb2F0IHRvcCwgamZsb2F0IHJpZ2h0LCBqZmxvYXQgYm90dG9tLAorICAgICAgICBTa0NhbnZhczo6RWRnZVR5cGUgZWRnZSkgeworICAgIHJldHVybiByZW5kZXJlci0+cXVpY2tSZWplY3QobGVmdCwgdG9wLCByaWdodCwgYm90dG9tKTsKK30KKworc3RhdGljIGJvb2wgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19jbGlwUmVjdEYoSk5JRW52KiBlbnYsIGpvYmplY3QgY2FudmFzLAorICAgICAgICBPcGVuR0xSZW5kZXJlciogcmVuZGVyZXIsIGpmbG9hdCBsZWZ0LCBqZmxvYXQgdG9wLCBqZmxvYXQgcmlnaHQsIGpmbG9hdCBib3R0b20sCisgICAgICAgIFNrUmVnaW9uOjpPcCBvcCkgeworICAgIHJldHVybiByZW5kZXJlci0+Y2xpcFJlY3QobGVmdCwgdG9wLCByaWdodCwgYm90dG9tLCBvcCk7Cit9CisKK3N0YXRpYyBib29sIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfY2xpcFJlY3QoSk5JRW52KiBlbnYsIGpvYmplY3QgY2FudmFzLAorICAgICAgICBPcGVuR0xSZW5kZXJlciogcmVuZGVyZXIsIGppbnQgbGVmdCwgamludCB0b3AsIGppbnQgcmlnaHQsIGppbnQgYm90dG9tLAorICAgICAgICBTa1JlZ2lvbjo6T3Agb3ApIHsKKyAgICByZXR1cm4gcmVuZGVyZXItPmNsaXBSZWN0KGZsb2F0KGxlZnQpLCBmbG9hdCh0b3ApLCBmbG9hdChyaWdodCksIGZsb2F0KGJvdHRvbSksIG9wKTsKK30KKworc3RhdGljIGJvb2wgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19nZXRDbGlwQm91bmRzKEpOSUVudiogZW52LCBqb2JqZWN0IGNhbnZhcywKKyAgICAgICAgT3BlbkdMUmVuZGVyZXIqIHJlbmRlcmVyLCBqb2JqZWN0IHJlY3QpIHsKKyAgICBjb25zdCBhbmRyb2lkOjp1aXJlbmRlcmVyOjpSZWN0JiBib3VuZHMocmVuZGVyZXItPmdldENsaXBCb3VuZHMoKSk7CisKKyAgICBlbnYtPkNhbGxWb2lkTWV0aG9kKHJlY3QsIGdSZWN0Q2xhc3NJbmZvLnNldCwKKyAgICAgICAgICAgIGludChib3VuZHMubGVmdCksIGludChib3VuZHMudG9wKSwgaW50KGJvdW5kcy5yaWdodCksIGludChib3VuZHMuYm90dG9tKSk7CisKKyAgICByZXR1cm4gIWJvdW5kcy5pc0VtcHR5KCk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFRyYW5zZm9ybXMKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc190cmFuc2xhdGUoSk5JRW52KiBlbnYsIGpvYmplY3QgY2FudmFzLAorICAgICAgICBPcGVuR0xSZW5kZXJlciogcmVuZGVyZXIsIGpmbG9hdCBkeCwgamZsb2F0IGR5KSB7CisgICAgcmVuZGVyZXItPnRyYW5zbGF0ZShkeCwgZHkpOworfQorCitzdGF0aWMgdm9pZCBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX3JvdGF0ZShKTklFbnYqIGVudiwgam9iamVjdCBjYW52YXMsCisgICAgICAgIE9wZW5HTFJlbmRlcmVyKiByZW5kZXJlciwgamZsb2F0IGRlZ3JlZXMpIHsKKyAgICByZW5kZXJlci0+cm90YXRlKGRlZ3JlZXMpOworfQorCitzdGF0aWMgdm9pZCBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX3NjYWxlKEpOSUVudiogZW52LCBqb2JqZWN0IGNhbnZhcywKKyAgICAgICAgT3BlbkdMUmVuZGVyZXIqIHJlbmRlcmVyLCBqZmxvYXQgc3gsIGpmbG9hdCBzeSkgeworICAgIHJlbmRlcmVyLT5zY2FsZShzeCwgc3kpOworfQorCitzdGF0aWMgdm9pZCBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX3NldE1hdHJpeChKTklFbnYqIGVudiwgam9iamVjdCBjYW52YXMsCisgICAgICAgIE9wZW5HTFJlbmRlcmVyKiByZW5kZXJlciwgU2tNYXRyaXgqIG1hdHJpeCkgeworICAgIHJlbmRlcmVyLT5zZXRNYXRyaXgobWF0cml4KTsKK30KKworc3RhdGljIHZvaWQgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19nZXRNYXRyaXgoSk5JRW52KiBlbnYsIGpvYmplY3QgY2FudmFzLAorICAgICAgICBPcGVuR0xSZW5kZXJlciogcmVuZGVyZXIsIFNrTWF0cml4KiBtYXRyaXgpIHsKKyAgICByZW5kZXJlci0+Z2V0TWF0cml4KG1hdHJpeCk7Cit9CisKK3N0YXRpYyB2b2lkIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfY29uY2F0TWF0cml4KEpOSUVudiogZW52LCBqb2JqZWN0IGNhbnZhcywKKyAgICAgICAgT3BlbkdMUmVuZGVyZXIqIHJlbmRlcmVyLCBTa01hdHJpeCogbWF0cml4KSB7CisgICAgcmVuZGVyZXItPmNvbmNhdE1hdHJpeChtYXRyaXgpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBEcmF3aW5nCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfZHJhd0JpdG1hcChKTklFbnYqIGVudiwgam9iamVjdCBjYW52YXMsCisgICAgICAgIE9wZW5HTFJlbmRlcmVyKiByZW5kZXJlciwgU2tCaXRtYXAqIGJpdG1hcCwgZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBTa1BhaW50KiBwYWludCkgeworICAgIHJlbmRlcmVyLT5kcmF3Qml0bWFwKGJpdG1hcCwgbGVmdCwgdG9wLCBwYWludCk7Cit9CisKK3N0YXRpYyB2b2lkIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfZHJhd0JpdG1hcFJlY3QoSk5JRW52KiBlbnYsIGpvYmplY3QgY2FudmFzLAorICAgICAgICBPcGVuR0xSZW5kZXJlciogcmVuZGVyZXIsIFNrQml0bWFwKiBiaXRtYXAsCisgICAgICAgIGZsb2F0IHNyY0xlZnQsIGZsb2F0IHNyY1RvcCwgZmxvYXQgc3JjUmlnaHQsIGZsb2F0IHNyY0JvdHRvbSwKKyAgICAgICAgZmxvYXQgZHN0TGVmdCwgZmxvYXQgZHN0VG9wLCBmbG9hdCBkc3RSaWdodCwgZmxvYXQgZHN0Qm90dG9tLCBTa1BhaW50KiBwYWludCkgeworICAgIHJlbmRlcmVyLT5kcmF3Qml0bWFwKGJpdG1hcCwgc3JjTGVmdCwgc3JjVG9wLCBzcmNSaWdodCwgc3JjQm90dG9tLAorICAgICAgICAgICAgZHN0TGVmdCwgZHN0VG9wLCBkc3RSaWdodCwgZHN0Qm90dG9tLCBwYWludCk7Cit9CisKK3N0YXRpYyB2b2lkIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfZHJhd0JpdG1hcE1hdHJpeChKTklFbnYqIGVudiwgam9iamVjdCBjYW52YXMsCisgICAgICAgIE9wZW5HTFJlbmRlcmVyKiByZW5kZXJlciwgU2tCaXRtYXAqIGJpdG1hcCwgU2tNYXRyaXgqIG1hdHJpeCwgU2tQYWludCogcGFpbnQpIHsKKyAgICByZW5kZXJlci0+ZHJhd0JpdG1hcChiaXRtYXAsIG1hdHJpeCwgcGFpbnQpOworfQorCitzdGF0aWMgdm9pZCBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2RyYXdQYXRjaChKTklFbnYqIGVudiwgam9iamVjdCBjYW52YXMsCisgICAgICAgIE9wZW5HTFJlbmRlcmVyKiByZW5kZXJlciwgU2tCaXRtYXAqIGJpdG1hcCwgamJ5dGVBcnJheSBjaHVua3MsCisgICAgICAgIGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwgU2tQYWludCogcGFpbnQpIHsKKyAgICBqYnl0ZSogc3RvcmFnZSA9IGVudi0+R2V0Qnl0ZUFycmF5RWxlbWVudHMoY2h1bmtzLCBOVUxMKTsKKyAgICBSZXNfcG5nXzlwYXRjaCogcGF0Y2ggPSByZWludGVycHJldF9jYXN0PFJlc19wbmdfOXBhdGNoKj4oc3RvcmFnZSk7CisgICAgUmVzX3BuZ185cGF0Y2g6OmRlc2VyaWFsaXplKHBhdGNoKTsKKworICAgIHJlbmRlcmVyLT5kcmF3UGF0Y2goYml0bWFwLCBwYXRjaCwgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tLCBwYWludCk7CisKKyAgICBlbnYtPlJlbGVhc2VCeXRlQXJyYXlFbGVtZW50cyhjaHVua3MsIHN0b3JhZ2UsIDApOworfQorCitzdGF0aWMgdm9pZCBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2RyYXdDb2xvcihKTklFbnYqIGVudiwgam9iamVjdCBjYW52YXMsCisgICAgICAgIE9wZW5HTFJlbmRlcmVyKiByZW5kZXJlciwgamludCBjb2xvciwgU2tYZmVybW9kZTo6TW9kZSBtb2RlKSB7CisgICAgcmVuZGVyZXItPmRyYXdDb2xvcihjb2xvciwgbW9kZSk7Cit9CisKK3N0YXRpYyB2b2lkIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfZHJhd1JlY3QoSk5JRW52KiBlbnYsIGpvYmplY3QgY2FudmFzLAorICAgICAgICBPcGVuR0xSZW5kZXJlciogcmVuZGVyZXIsIGpmbG9hdCBsZWZ0LCBqZmxvYXQgdG9wLCBqZmxvYXQgcmlnaHQsIGpmbG9hdCBib3R0b20sCisgICAgICAgIFNrUGFpbnQqIHBhaW50KSB7CisgICAgcmVuZGVyZXItPmRyYXdSZWN0KGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSwgcGFpbnQpOworfQorCitzdGF0aWMgdm9pZCBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2RyYXdSZWN0cyhKTklFbnYqIGVudiwgam9iamVjdCBjYW52YXMsCisgICAgICAgIE9wZW5HTFJlbmRlcmVyKiByZW5kZXJlciwgU2tSZWdpb24qIHJlZ2lvbiwgU2tQYWludCogcGFpbnQpIHsKKyAgICBTa1JlZ2lvbjo6SXRlcmF0b3IgaXQoKnJlZ2lvbik7CisgICAgd2hpbGUgKCFpdC5kb25lKCkpIHsKKyAgICAgICAgY29uc3QgU2tJUmVjdCYgciA9IGl0LnJlY3QoKTsKKyAgICAgICAgcmVuZGVyZXItPmRyYXdSZWN0KHIuZkxlZnQsIHIuZlRvcCwgci5mUmlnaHQsIHIuZkJvdHRvbSwgcGFpbnQpOworICAgICAgICBpdC5uZXh0KCk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2RyYXdQYXRoKEpOSUVudiogZW52LCBqb2JqZWN0IGNhbnZhcywKKyAgICAgICAgT3BlbkdMUmVuZGVyZXIqIHJlbmRlcmVyLCBTa1BhdGgqIHBhdGgsIFNrUGFpbnQqIHBhaW50KSB7CisgICAgcmVuZGVyZXItPmRyYXdQYXRoKHBhdGgsIHBhaW50KTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gU2hhZGVycyBhbmQgY29sb3IgZmlsdGVycworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZCBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX3Jlc2V0TW9kaWZpZXJzKEpOSUVudiogZW52LCBqb2JqZWN0IGNhbnZhcywKKyAgICAgICAgT3BlbkdMUmVuZGVyZXIqIHJlbmRlcmVyKSB7CisgICAgcmVuZGVyZXItPnJlc2V0U2hhZGVyKCk7CisgICAgcmVuZGVyZXItPnJlc2V0Q29sb3JGaWx0ZXIoKTsKKyAgICByZW5kZXJlci0+cmVzZXRTaGFkb3coKTsKK30KKworc3RhdGljIHZvaWQgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19zZXR1cFNoYWRlcihKTklFbnYqIGVudiwgam9iamVjdCBjYW52YXMsCisgICAgICAgIE9wZW5HTFJlbmRlcmVyKiByZW5kZXJlciwgU2tpYVNoYWRlciogc2hhZGVyKSB7CisgICAgcmVuZGVyZXItPnNldHVwU2hhZGVyKHNoYWRlcik7Cit9CisKK3N0YXRpYyB2b2lkIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfc2V0dXBDb2xvckZpbHRlcihKTklFbnYqIGVudiwgam9iamVjdCBjYW52YXMsCisgICAgICAgIE9wZW5HTFJlbmRlcmVyKiByZW5kZXJlciwgU2tpYUNvbG9yRmlsdGVyKiBmaWx0ZXIpIHsKKyAgICByZW5kZXJlci0+c2V0dXBDb2xvckZpbHRlcihmaWx0ZXIpOworfQorCitzdGF0aWMgdm9pZCBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX3NldHVwU2hhZG93KEpOSUVudiogZW52LCBqb2JqZWN0IGNhbnZhcywKKyAgICAgICAgT3BlbkdMUmVuZGVyZXIqIHJlbmRlcmVyLCBqZmxvYXQgcmFkaXVzLCBqZmxvYXQgZHgsIGpmbG9hdCBkeSwgamludCBjb2xvcikgeworICAgIHJlbmRlcmVyLT5zZXR1cFNoYWRvdyhyYWRpdXMsIGR4LCBkeSwgY29sb3IpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBUZXh0CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkIHJlbmRlclRleHQoT3BlbkdMUmVuZGVyZXIqIHJlbmRlcmVyLCBjb25zdCBqY2hhciogdGV4dCwgaW50IGNvdW50LAorICAgICAgICBqZmxvYXQgeCwgamZsb2F0IHksIGludCBmbGFncywgU2tQYWludCogcGFpbnQpIHsKKyAgICBjb25zdCBqY2hhciAqd29ya1RleHQ7CisgICAgamNoYXIqIGJ1ZmZlciA9IE5VTEw7CisgICAgaW50MzJfdCB3b3JrQnl0ZXM7CisgICAgaWYgKFRleHRMYXlvdXQ6OnByZXBhcmVUZXh0KHBhaW50LCB0ZXh0LCBjb3VudCwgZmxhZ3MsICZ3b3JrVGV4dCwgJndvcmtCeXRlcywgJmJ1ZmZlcikpIHsKKyAgICAgICAgcmVuZGVyZXItPmRyYXdUZXh0KChjb25zdCBjaGFyKikgd29ya1RleHQsIHdvcmtCeXRlcywgY291bnQsIHgsIHksIHBhaW50KTsKKyAgICAgICAgZnJlZShidWZmZXIpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgcmVuZGVyVGV4dFJ1bihPcGVuR0xSZW5kZXJlciogcmVuZGVyZXIsIGNvbnN0IGpjaGFyKiB0ZXh0LAorICAgICAgICBqaW50IHN0YXJ0LCBqaW50IGNvdW50LCBqaW50IGNvbnRleHRDb3VudCwgamZsb2F0IHgsIGpmbG9hdCB5LAorICAgICAgICBpbnQgZmxhZ3MsIFNrUGFpbnQqIHBhaW50KSB7CisgICAgdWludDhfdCBydGwgPSBmbGFncyAmIDB4MTsKKyAgICBpZiAocnRsKSB7CisgICAgICAgIFNrQXV0b1NUTWFsbG9jPDgwLCBqY2hhcj4gYnVmZmVyKGNvbnRleHRDb3VudCk7CisgICAgICAgIGpjaGFyKiBzaGFwZWQgPSBidWZmZXIuZ2V0KCk7CisgICAgICAgIGlmIChUZXh0TGF5b3V0OjpwcmVwYXJlUnRsVGV4dFJ1bih0ZXh0LCBzdGFydCwgY291bnQsIGNvbnRleHRDb3VudCwgc2hhcGVkKSkgeworICAgICAgICAgICAgcmVuZGVyZXItPmRyYXdUZXh0KChjb25zdCBjaGFyKikgc2hhcGVkLCBjb3VudCA8PCAxLCBjb3VudCwgeCwgeSwgcGFpbnQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTE9HVygiZHJhd1RleHRSdW4gZXJyb3IiKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHJlbmRlcmVyLT5kcmF3VGV4dCgoY29uc3QgY2hhciopICh0ZXh0ICsgc3RhcnQpLCBjb3VudCA8PCAxLCBjb3VudCwgeCwgeSwgcGFpbnQpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19kcmF3VGV4dEFycmF5KEpOSUVudiogZW52LCBqb2JqZWN0IGNhbnZhcywKKyAgICAgICAgT3BlbkdMUmVuZGVyZXIqIHJlbmRlcmVyLCBqY2hhckFycmF5IHRleHQsIGludCBpbmRleCwgaW50IGNvdW50LAorICAgICAgICBqZmxvYXQgeCwgamZsb2F0IHksIGludCBmbGFncywgU2tQYWludCogcGFpbnQpIHsKKyAgICBqY2hhciogdGV4dEFycmF5ID0gZW52LT5HZXRDaGFyQXJyYXlFbGVtZW50cyh0ZXh0LCBOVUxMKTsKKyAgICByZW5kZXJUZXh0KHJlbmRlcmVyLCB0ZXh0QXJyYXkgKyBpbmRleCwgY291bnQsIHgsIHksIGZsYWdzLCBwYWludCk7CisgICAgZW52LT5SZWxlYXNlQ2hhckFycmF5RWxlbWVudHModGV4dCwgdGV4dEFycmF5LCBKTklfQUJPUlQpOworfQorCitzdGF0aWMgdm9pZCBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2RyYXdUZXh0KEpOSUVudiogZW52LCBqb2JqZWN0IGNhbnZhcywKKyAgICAgICAgT3BlbkdMUmVuZGVyZXIqIHJlbmRlcmVyLCBqc3RyaW5nIHRleHQsIGludCBzdGFydCwgaW50IGVuZCwKKyAgICAgICAgamZsb2F0IHgsIGpmbG9hdCB5LCBpbnQgZmxhZ3MsIFNrUGFpbnQqIHBhaW50KSB7CisgICAgY29uc3QgamNoYXIqIHRleHRBcnJheSA9IGVudi0+R2V0U3RyaW5nQ2hhcnModGV4dCwgTlVMTCk7CisgICAgcmVuZGVyVGV4dChyZW5kZXJlciwgdGV4dEFycmF5ICsgc3RhcnQsIGVuZCAtIHN0YXJ0LCB4LCB5LCBmbGFncywgcGFpbnQpOworICAgIGVudi0+UmVsZWFzZVN0cmluZ0NoYXJzKHRleHQsIHRleHRBcnJheSk7Cit9CisKK3N0YXRpYyB2b2lkIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfZHJhd1RleHRSdW5BcnJheShKTklFbnYqIGVudiwgam9iamVjdCBjYW52YXMsCisgICAgICAgIE9wZW5HTFJlbmRlcmVyKiByZW5kZXJlciwgamNoYXJBcnJheSB0ZXh0LCBpbnQgaW5kZXgsIGludCBjb3VudCwKKyAgICAgICAgaW50IGNvbnRleHRJbmRleCwgaW50IGNvbnRleHRDb3VudCwgamZsb2F0IHgsIGpmbG9hdCB5LCBpbnQgZGlyRmxhZ3MsCisgICAgICAgIFNrUGFpbnQqIHBhaW50KSB7CisgICAgamNoYXIqIHRleHRBcnJheSA9IGVudi0+R2V0Q2hhckFycmF5RWxlbWVudHModGV4dCwgTlVMTCk7CisgICAgcmVuZGVyVGV4dFJ1bihyZW5kZXJlciwgdGV4dEFycmF5ICsgY29udGV4dEluZGV4LCBpbmRleCAtIGNvbnRleHRJbmRleCwKKyAgICAgICAgICAgIGNvdW50LCBjb250ZXh0Q291bnQsIHgsIHksIGRpckZsYWdzLCBwYWludCk7CisgICAgZW52LT5SZWxlYXNlQ2hhckFycmF5RWxlbWVudHModGV4dCwgdGV4dEFycmF5LCBKTklfQUJPUlQpOworIH0KKworc3RhdGljIHZvaWQgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19kcmF3VGV4dFJ1bihKTklFbnYqIGVudiwgam9iamVjdCBjYW52YXMsCisgICAgICAgIE9wZW5HTFJlbmRlcmVyKiByZW5kZXJlciwganN0cmluZyB0ZXh0LCBpbnQgc3RhcnQsIGludCBlbmQsCisgICAgICAgIGludCBjb250ZXh0U3RhcnQsIGludCBjb250ZXh0RW5kLCBqZmxvYXQgeCwgamZsb2F0IHksIGludCBkaXJGbGFncywKKyAgICAgICAgU2tQYWludCogcGFpbnQpIHsKKyAgICBjb25zdCBqY2hhciogdGV4dEFycmF5ID0gZW52LT5HZXRTdHJpbmdDaGFycyh0ZXh0LCBOVUxMKTsKKyAgICBqaW50IGNvdW50ID0gZW5kIC0gc3RhcnQ7CisgICAgamludCBjb250ZXh0Q291bnQgPSBjb250ZXh0RW5kIC0gY29udGV4dFN0YXJ0OworICAgIHJlbmRlclRleHRSdW4ocmVuZGVyZXIsIHRleHRBcnJheSArIGNvbnRleHRTdGFydCwgc3RhcnQgLSBjb250ZXh0U3RhcnQsCisgICAgICAgICAgICBjb3VudCwgY29udGV4dENvdW50LCB4LCB5LCBkaXJGbGFncywgcGFpbnQpOworICAgIGVudi0+UmVsZWFzZVN0cmluZ0NoYXJzKHRleHQsIHRleHRBcnJheSk7Cit9CisKKyNlbmRpZiAvLyBVU0VfT1BFTkdMX1JFTkRFUkVSCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENvbW1vbgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgamJvb2xlYW4gYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19pc0F2YWlsYWJsZShKTklFbnYqIGVudiwgam9iamVjdCBjbGF6eikgeworI2lmZGVmIFVTRV9PUEVOR0xfUkVOREVSRVIKKyAgICByZXR1cm4gSk5JX1RSVUU7CisjZWxzZQorICAgIHJldHVybiBKTklfRkFMU0U7CisjZW5kaWYKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSk5JIEdsdWUKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY29uc3QgY2hhciogY29uc3Qga0NsYXNzUGF0aE5hbWUgPSAiYW5kcm9pZC92aWV3L0dMRVMyMENhbnZhcyI7CisKK3N0YXRpYyBKTklOYXRpdmVNZXRob2QgZ01ldGhvZHNbXSA9IHsKKyAgICB7ICJuSXNBdmFpbGFibGUiLCAgICAgICAiKClaIiwgICAgICAgICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2lzQXZhaWxhYmxlIH0sCisKKyNpZmRlZiBVU0VfT1BFTkdMX1JFTkRFUkVSCisgICAgeyAibkNyZWF0ZVJlbmRlcmVyIiwgICAgIigpSSIsICAgICAgICAgICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19jcmVhdGVSZW5kZXJlciB9LAorICAgIHsgIm5EZXN0cm95UmVuZGVyZXIiLCAgICIoSSlWIiwgICAgICAgICAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfZGVzdHJveVJlbmRlcmVyIH0sCisgICAgeyAiblNldFZpZXdwb3J0IiwgICAgICAgIihJSUkpViIsICAgICAgICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19zZXRWaWV3cG9ydCB9LAorICAgIHsgIm5QcmVwYXJlIiwgICAgICAgICAgICIoSSlWIiwgICAgICAgICAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfcHJlcGFyZSB9LAorCisgICAgeyAiblNhdmUiLCAgICAgICAgICAgICAgIihJSSlJIiwgICAgICAgICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19zYXZlIH0sCisgICAgeyAiblJlc3RvcmUiLCAgICAgICAgICAgIihJKVYiLCAgICAgICAgICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19yZXN0b3JlIH0sCisgICAgeyAiblJlc3RvcmVUb0NvdW50IiwgICAgIihJSSlWIiwgICAgICAgICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19yZXN0b3JlVG9Db3VudCB9LAorICAgIHsgIm5HZXRTYXZlQ291bnQiLCAgICAgICIoSSlJIiwgICAgICAgICAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfZ2V0U2F2ZUNvdW50IH0sCisKKyAgICB7ICJuU2F2ZUxheWVyIiwgICAgICAgICAiKElGRkZGSUkpSSIsICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX3NhdmVMYXllciB9LAorICAgIHsgIm5TYXZlTGF5ZXJBbHBoYSIsICAgICIoSUZGRkZJSSlJIiwgICAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfc2F2ZUxheWVyQWxwaGEgfSwKKworICAgIHsgIm5RdWlja1JlamVjdCIsICAgICAgICIoSUZGRkZJKVoiLCAgICAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfcXVpY2tSZWplY3QgfSwKKyAgICB7ICJuQ2xpcFJlY3QiLCAgICAgICAgICAiKElGRkZGSSlaIiwgICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2NsaXBSZWN0RiB9LAorICAgIHsgIm5DbGlwUmVjdCIsICAgICAgICAgICIoSUlJSUlJKVoiLCAgICAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfY2xpcFJlY3QgfSwKKworICAgIHsgIm5UcmFuc2xhdGUiLCAgICAgICAgICIoSUZGKVYiLCAgICAgICAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfdHJhbnNsYXRlIH0sCisgICAgeyAiblJvdGF0ZSIsICAgICAgICAgICAgIihJRilWIiwgICAgICAgICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19yb3RhdGUgfSwKKyAgICB7ICJuU2NhbGUiLCAgICAgICAgICAgICAiKElGRilWIiwgICAgICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX3NjYWxlIH0sCisKKyAgICB7ICJuU2V0TWF0cml4IiwgICAgICAgICAiKElJKVYiLCAgICAgICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX3NldE1hdHJpeCB9LAorICAgIHsgIm5HZXRNYXRyaXgiLCAgICAgICAgICIoSUkpViIsICAgICAgICAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfZ2V0TWF0cml4IH0sCisgICAgeyAibkNvbmNhdE1hdHJpeCIsICAgICAgIihJSSlWIiwgICAgICAgICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19jb25jYXRNYXRyaXggfSwKKworICAgIHsgIm5EcmF3Qml0bWFwIiwgICAgICAgICIoSUlGRkkpViIsICAgICAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfZHJhd0JpdG1hcCB9LAorICAgIHsgIm5EcmF3Qml0bWFwIiwgICAgICAgICIoSUlGRkZGRkZGRkkpViIsICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfZHJhd0JpdG1hcFJlY3QgfSwKKyAgICB7ICJuRHJhd0JpdG1hcCIsICAgICAgICAiKElJSUkpViIsICAgICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2RyYXdCaXRtYXBNYXRyaXggfSwKKyAgICB7ICJuRHJhd1BhdGNoIiwgICAgICAgICAiKElJW0JGRkZGSSlWIiwgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2RyYXdQYXRjaCB9LAorICAgIHsgIm5EcmF3Q29sb3IiLCAgICAgICAgICIoSUlJKVYiLCAgICAgICAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfZHJhd0NvbG9yIH0sCisgICAgeyAibkRyYXdSZWN0IiwgICAgICAgICAgIihJRkZGRkkpViIsICAgICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19kcmF3UmVjdCB9LAorICAgIHsgIm5EcmF3UmVjdHMiLCAgICAgICAgICIoSUlJKVYiLCAgICAgICAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfZHJhd1JlY3RzIH0sCisgICAgeyAibkRyYXdQYXRoIiwgICAgICAgICAgIihJSUkpViIsICAgICAgICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19kcmF3UGF0aCB9LAorCisgICAgeyAiblJlc2V0TW9kaWZpZXJzIiwgICAgIihJKVYiLCAgICAgICAgICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19yZXNldE1vZGlmaWVycyB9LAorICAgIHsgIm5TZXR1cFNoYWRlciIsICAgICAgICIoSUkpViIsICAgICAgICAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfc2V0dXBTaGFkZXIgfSwKKyAgICB7ICJuU2V0dXBDb2xvckZpbHRlciIsICAiKElJKVYiLCAgICAgICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX3NldHVwQ29sb3JGaWx0ZXIgfSwKKyAgICB7ICJuU2V0dXBTaGFkb3ciLCAgICAgICAiKElGRkZJKVYiLCAgICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX3NldHVwU2hhZG93IH0sCisKKyAgICB7ICJuRHJhd1RleHQiLCAgICAgICAgICAiKElbQ0lJRkZJSSlWIiwgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2RyYXdUZXh0QXJyYXkgfSwKKyAgICB7ICJuRHJhd1RleHQiLCAgICAgICAgICAiKElMamF2YS9sYW5nL1N0cmluZztJSUZGSUkpViIsCisgICAgICAgICAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfZHJhd1RleHQgfSwKKworICAgIHsgIm5EcmF3VGV4dFJ1biIsICAgICAgICIoSVtDSUlJSUZGSUkpViIsICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfZHJhd1RleHRSdW5BcnJheSB9LAorICAgIHsgIm5EcmF3VGV4dFJ1biIsICAgICAgICIoSUxqYXZhL2xhbmcvU3RyaW5nO0lJSUlGRklJKVYiLAorICAgICAgICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2RyYXdUZXh0UnVuIH0sCisKKyAgICB7ICJuR2V0Q2xpcEJvdW5kcyIsICAgICAiKElMYW5kcm9pZC9ncmFwaGljcy9SZWN0OylaIiwKKyAgICAgICAgICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19nZXRDbGlwQm91bmRzIH0sCisjZW5kaWYKK307CisKKyNpZmRlZiBVU0VfT1BFTkdMX1JFTkRFUkVSCisgICAgI2RlZmluZSBGSU5EX0NMQVNTKHZhciwgY2xhc3NOYW1lKSBcCisgICAgICAgICAgICB2YXIgPSBlbnYtPkZpbmRDbGFzcyhjbGFzc05hbWUpOyBcCisgICAgICAgICAgICBMT0dfRkFUQUxfSUYoISB2YXIsICJVbmFibGUgdG8gZmluZCBjbGFzcyAiIGNsYXNzTmFtZSk7IFwKKyAgICAgICAgICAgIHZhciA9IGpjbGFzcyhlbnYtPk5ld0dsb2JhbFJlZih2YXIpKTsKKyAgICAKKyAgICAjZGVmaW5lIEdFVF9NRVRIT0RfSUQodmFyLCBjbGF6eiwgbWV0aG9kTmFtZSwgbWV0aG9kRGVzY3JpcHRvcikgXAorICAgICAgICAgICAgdmFyID0gZW52LT5HZXRNZXRob2RJRChjbGF6eiwgbWV0aG9kTmFtZSwgbWV0aG9kRGVzY3JpcHRvcik7IFwKKyAgICAgICAgICAgIExPR19GQVRBTF9JRighIHZhciwgIlVuYWJsZSB0byBmaW5kIG1ldGhvZCAiIG1ldGhvZE5hbWUpOworI2Vsc2UKKyAgICAjZGVmaW5lIEZJTkRfQ0xBU1ModmFyLCBjbGFzc05hbWUpCisgICAgI2RlZmluZSBHRVRfTUVUSE9EX0lEKHZhciwgY2xhenosIG1ldGhvZE5hbWUsIG1ldGhvZERlc2NyaXB0b3IpCisjZW5kaWYKKworaW50IHJlZ2lzdGVyX2FuZHJvaWRfdmlld19HTEVTMjBDYW52YXMoSk5JRW52KiBlbnYpIHsKKyAgICBGSU5EX0NMQVNTKGdSZWN0Q2xhc3NJbmZvLmNsYXp6LCAiYW5kcm9pZC9ncmFwaGljcy9SZWN0Iik7CisgICAgR0VUX01FVEhPRF9JRChnUmVjdENsYXNzSW5mby5zZXQsIGdSZWN0Q2xhc3NJbmZvLmNsYXp6LCAic2V0IiwgIihJSUlJKVYiKTsKKworICAgIHJldHVybiBBbmRyb2lkUnVudGltZTo6cmVnaXN0ZXJOYXRpdmVNZXRob2RzKGVudiwga0NsYXNzUGF0aE5hbWUsIGdNZXRob2RzLCBORUxFTShnTWV0aG9kcykpOworfQorCit9OwpkaWZmIC0tZ2l0IGEvY29yZS9qbmkvYW5kcm9pZF92aWV3X1ZpZXdSb290LmNwcCBiL2NvcmUvam5pL2FuZHJvaWRfdmlld19WaWV3Um9vdC5jcHAKaW5kZXggNTE3M2JiOC4uMjk4OGFlOCAxMDA2NDQKLS0tIGEvY29yZS9qbmkvYW5kcm9pZF92aWV3X1ZpZXdSb290LmNwcAorKysgYi9jb3JlL2puaS9hbmRyb2lkX3ZpZXdfVmlld1Jvb3QuY3BwCkBAIC03NiwxMCArNzYsNiBAQAogICAgIGNhbnZhcy0+cmVzdG9yZSgpOwogfQogCi1zdGF0aWMgdm9pZCBhbmRyb2lkX3ZpZXdfVmlld1Jvb3RfYWJhbmRvbkdsQ2FjaGVzKEpOSUVudiogZW52LCBqb2JqZWN0KSB7Ci0gICAgU2tHTENhbnZhczo6QWJhbmRvbkFsbFRleHR1cmVzKCk7Ci19Ci0KIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCkBAIC04Nyw5ICs4Myw3IEBACiAKIHN0YXRpYyBKTklOYXRpdmVNZXRob2QgZ01ldGhvZHNbXSA9IHsKICAgICB7ICAgIm5hdGl2ZVNob3dGUFMiLCAiKExhbmRyb2lkL2dyYXBoaWNzL0NhbnZhcztJKVYiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKilhbmRyb2lkX3ZpZXdfVmlld1Jvb3Rfc2hvd0ZQUyB9LAotICAgIHsgICAibmF0aXZlQWJhbmRvbkdsQ2FjaGVzIiwgIigpViIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopYW5kcm9pZF92aWV3X1ZpZXdSb290X2FiYW5kb25HbENhY2hlcyB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKWFuZHJvaWRfdmlld19WaWV3Um9vdF9zaG93RlBTIH0KIH07CiAKIGludCByZWdpc3Rlcl9hbmRyb2lkX3ZpZXdfVmlld1Jvb3QoSk5JRW52KiBlbnYpIHsKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL0FuZHJvaWQubWsgYi9jb3JlL3Jlcy9BbmRyb2lkLm1rCmluZGV4IDdkMTExNDguLjlmYWZjNTkgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL0FuZHJvaWQubWsKKysrIGIvY29yZS9yZXMvQW5kcm9pZC5tawpAQCAtMzMsOCArMzMsMTYgQEAKICMgUFJPRFVDVC1hZ25vc3RpYyByZXNvdXJjZSBkYXRhIGxpa2UgSURzIGFuZCB0eXBlIGRlZmluaXRpb25zLgogTE9DQUxfRVhQT1JUX1BBQ0tBR0VfUkVTT1VSQ0VTIDo9IHRydWUKIAorIyBJbmNsdWRlIHJlc291cmNlcyBnZW5lcmF0ZWQgYnkgc3lzdGVtIFJlbmRlclNjcmlwdCBmaWxlcy4KK2ZyYW1ld29ya19HRU5FUkFURURfU09VUkNFX0RJUiA6PSAkKGNhbGwgaW50ZXJtZWRpYXRlcy1kaXItZm9yLEpBVkFfTElCUkFSSUVTLGZyYW1ld29yaywsQ09NTU9OKS9zcmMKK2ZyYW1ld29ya19SZW5kZXJTY3JpcHRfU1RBTVBfRklMRSA6PSAkKGZyYW1ld29ya19HRU5FUkFURURfU09VUkNFX0RJUikvUmVuZGVyU2NyaXB0LnN0YW1wCitMT0NBTF9SRVNPVVJDRV9ESVIgOj0gJChmcmFtZXdvcmtfR0VORVJBVEVEX1NPVVJDRV9ESVIpL3JlbmRlcnNjcmlwdC9yZXMgJChMT0NBTF9QQVRIKS9yZXMKKwogaW5jbHVkZSAkKEJVSUxEX1BBQ0tBR0UpCiAKKyMgTWFrZSBzdXJlIHRoZSBzeXN0ZW0gLnJzIGZpbGVzIGdldCBjb21waWxlZCBiZWZvcmUgYnVpbGRpbmcgdGhlIHBhY2thZ2UtZXhwb3J0LmFway4KKyQocmVzb3VyY2VfZXhwb3J0X3BhY2thZ2UpOiAkKGZyYW1ld29ya19SZW5kZXJTY3JpcHRfU1RBTVBfRklMRSkKKwogIyBkZWZpbmUgYSBnbG9iYWwgaW50ZXJtZWRpYXRlIHRhcmdldCB0aGF0IG90aGVyIG1vZHVsZSBtYXkgZGVwZW5kIG9uLgogLlBIT05ZOiBmcmFtZXdvcmstcmVzLXBhY2thZ2UtdGFyZ2V0CiBmcmFtZXdvcmstcmVzLXBhY2thZ2UtdGFyZ2V0OiAkKExPQ0FMX0JVSUxUX01PRFVMRSkKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9jb3JlL3Jlcy9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IDE5YjMwY2MuLjFmNjZkMDUgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvY29yZS9yZXMvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtODMsNiArODMsOCBAQAogICAgIDxwcm90ZWN0ZWQtYnJvYWRjYXN0IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5oYXJkd2FyZS5hY3Rpb24uVVNCX0NPTk5FQ1RFRCIgLz4KICAgICA8cHJvdGVjdGVkLWJyb2FkY2FzdCBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaGFyZHdhcmUuYWN0aW9uLlVTQl9ESVNDT05ORUNURUQiIC8+CiAgICAgPHByb3RlY3RlZC1icm9hZGNhc3QgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmhhcmR3YXJlLmFjdGlvbi5VU0JfU1RBVEUiIC8+CisgICAgPHByb3RlY3RlZC1icm9hZGNhc3QgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmhhcmR3YXJlLmFjdGlvbi5VU0JfQ0FNRVJBX0FUVEFDSEVEIiAvPgorICAgIDxwcm90ZWN0ZWQtYnJvYWRjYXN0IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5oYXJkd2FyZS5hY3Rpb24uVVNCX0NBTUVSQV9ERVRBQ0hFRCIgLz4KIAogICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CiAgICAgPCEtLSBQZXJtaXNzaW9ucyBmb3IgdGhpbmdzIHRoYXQgY29zdCBtb25leSAtLT4KQEAgLTM0OCw2ICszNTAsMTMgQEAKICAgICAgICAgYW5kcm9pZDpkZXNjcmlwdGlvbj0iQHN0cmluZy9wZXJtZGVzY19hY2NvdW50TWFuYWdlclNlcnZpY2UiCiAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvcGVybWxhYl9hY2NvdW50TWFuYWdlclNlcnZpY2UiIC8+CiAKKyAgICA8IS0tIEFsbG93cyBhbiBpbnRlcm5hbCB1c2VyIHRvIHVzZSBwcml2YWxlZGdlZCBDb25uZWN0aXZpdHlNYW5hZ2VyCisgICAgQVBJcy4KKyAgICAgICAgQGhpZGUgLS0+CisgICAgPHBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uQ09OTkVDVElWSVRZX0lOVEVSTkFMIgorICAgICAgICBhbmRyb2lkOnBlcm1pc3Npb25Hcm91cD0iYW5kcm9pZC5wZXJtaXNzaW9uLWdyb3VwLk5FVFdPUksiCisgICAgICAgIGFuZHJvaWQ6cHJvdGVjdGlvbkxldmVsPSJzaWduYXR1cmVPclN5c3RlbSIgLz4KKwogICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KICAgICA8IS0tIFBlcm1pc3Npb25zIGZvciBhY2Nlc3NpbmcgYWNjb3VudHMgLS0+CiAgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvYXNzZXRzL2ltYWdlcy9jb21ib2JveC1kaXNhYmxlZC5wbmcgYi9jb3JlL3Jlcy9hc3NldHMvaW1hZ2VzL2NvbWJvYm94LWRpc2FibGVkLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmUyMjBlNC4uMDAwMDAwMAotLS0gYS9jb3JlL3Jlcy9hc3NldHMvaW1hZ2VzL2NvbWJvYm94LWRpc2FibGVkLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL2Fzc2V0cy9pbWFnZXMvY29tYm9ib3gtbm9IaWdobGlnaHQucG5nIGIvY29yZS9yZXMvYXNzZXRzL2ltYWdlcy9jb21ib2JveC1ub0hpZ2hsaWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiY2RmNzIuLjAwMDAwMDAKLS0tIGEvY29yZS9yZXMvYXNzZXRzL2ltYWdlcy9jb21ib2JveC1ub0hpZ2hsaWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9hc3NldHMvd2Via2l0L2h5cGhfZW5fVVMuZGljIGIvY29yZS9yZXMvYXNzZXRzL3dlYmtpdC9oeXBoX2VuX1VTLmRpYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTEyMDRiCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvYXNzZXRzL3dlYmtpdC9oeXBoX2VuX1VTLmRpYwpAQCAtMCwwICsxLDk3ODQgQEAKK0lTTzg4NTktMQorTEVGVEhZUEhFTk1JTiAyCitSSUdIVEhZUEhFTk1JTiAzCisuYTJjaDQKKy5hZDRkZXIKKy5hMmQKKy5hZDFkNAorLmEyZjF0CisuYTJmCisuYTRsM3QKKy5hbTVhdAorLjRhMW1hCisuYW41YworLmEybgorLjJhbmc0CisuYW4xaTVtCisuYW4xdDQKKy5hbjN0ZQorLmFudGk1cworLmFudDJpCisuYTRyNXMyCisuMmEycgorLmFyNHQyaWU0CisuYXIxdGkKKy5hcjR0eQorLmFzM2MKKy5hczFwCisuYTJzMXMKKy5hc3RlcjUKKy5hMnRvbTUKKy5hMXRvCisuYXUxZAorLmF2NGkKKy5hd240CisuYmE0ZworLmJhNW5hCisuYmEybgorLmJhczRlCisuYmVyNAorLmJlNXIxYQorLmJlM3MxbQorLjRiZXM0CisuYjRlNXMydG8KKy5icmkyCisuYnV0NHRpCisuYnU0dDN0MgorLmNhbTRwZQorLjFjYQorLmNhNG0xcAorLmNhbjVjCisuY2EybgorLmNhcGE1YgorLmNhMXBhCisuY2FyNW9sCisuYzJhMnIKKy5jYTR0CisuY2U0bGEKKy4yY2g0CisuY2hpbGw1aQorLmNoNGlsMgorLmNoaWwxbAorLjFjaTIKKy5jaXQ1cgorLjJjMWl0CisuY28zZTIKKy4xY28KKy5jbzRyCisuY29yNW4xZXIKKy5jb3JuMmUKKy5kZTRtb2kyCisuZDRlbQorLmRlMW1vCisuZGUzbworLmRlM3IxYQorLmRlM3IxaQorLmRlMXM0YworLmRlczIKKy5kaWMxdDJpbzUKKy4zZGkyYzF0CisuZG80dAorLjFkbworLmR1NGMKKy4xZHUKKy5kdTRtMWI1CisuZWFydGg1CisuZWFyMnQKKy5lMmEycgorLmVhczNpCisuMmUxYjQKKy5lZXI0CisuZWcyCisuZTJsNWQKKy5lbDNlbQorLmVuYW0zCisuZTFuYQorLmVuM2cKKy5lMm4zczIKKy5lcTV1aTV0CisuZTFxCisuZXF1MgorLmVxMnVpMgorLmVyNHJpCisuZXIxcjQKKy5lczMKKy40ZXUzCisuZXllNQorLmZlczMKKy5mb3I1bWVyCisuMWZvCisuZm8ycgorLmZvcjFtCisuZm9yMm1lCisuMWdhMgorLmdlMgorLmdlbjN0NAorLjFnZW4KKy5nZTVvMmcKKy4xZ2VvCisuMWcyaTVhCisuZ2k0YgorLmdvNHIKKy4xZ28KKy5oYW5kNWkKKy5oYTJuCisuaDRhbmQKKy5oYTRuNWsyCisuaGUyCisuaGVybzVpMgorLmgyZXJvCisuaDFlczMKKy5oZTR0MworLmhpM2IKKy5oaTNlcgorLmgyaWU0CisuaG9uNWV5CisuaG8ybgorLmhvbjNvCisuaG92NQorLmlkNGwKKy4yaWQKKy5pZG9sMworLmkxZG8KKy5pbTNtCisuaW01cDFpMm4KKy5pNG0xcAorLmltMnBpCisuaW4xCisuaW4zY2kKKy4yaW5lMgorLjRpNG4yazIKKy4yaTJuM3MyCisuaXI1cjQKKy40aXIKKy5pczRpCisuanUzcgorLmxhNGN5CisubGE0bQorLmxhdDVlcgorLmw0YXRoNQorLmxlMgorLmxlZzVlCisubGVuNAorLmxlcDUKKy5sZXYxCisubDJpNGcKKy5saTFnNWEKKy5saTJuCisubDJpM28KKy5sMWk0dAorLm1hMWc1YTUKKy4xbWEKKy5tYWw1bworLm1hMW41YQorLm1hMm4KKy5tYXI1dGkKKy5tMmEycgorLm1lMgorLm1lcjNjCisubWU1dGVyCisubWUxdGUKKy5tMmlzMQorLm1pczR0NWkKKy5tb24zZQorLjFtbworLm1vMm4KKy5tbzNybworLm1vMnIKKy5tdTV0YQorLjFtdQorLm11MnRhNWIKKy5uaTRjCisub2QyCisub2QxZDUKKy5vZjV0ZQorLm8yZnQKKy5vcjVhMXRvCisubzFyYQorLm9yM2MKKy5vcjFkCisub3IzdAorLm9zMworLm9zNHRsCisuNG90aDMKKy5vdXQzCisub3UyCisucGVkNWFsCisuMnAyZWQKKy5wMmUyZDJhCisucGU1dGUKKy5wZTJ0CisucGU1dGl0CisucDJpNGU0CisucGlvNW40CisuM3AyaTFvCisucGkydAorLnByZTNtCisucHIyCisucmE0YworLnJhbjR0CisucmEybgorLnJhdGlvNW4xYQorLnJhdGlvMm40CisucmExdDJpbworLnJlZTIKKy5yZTVtaXQKKy5yZXMyCisucmU1c3RhdAorLnJlczJ0CisucmVzMXRhCisucjJpNGcKKy5yaTJ0NXUKKy5ybzRxCisucm9zNXQKKy5yb3c1ZAorLnJ1NGQKKy4zczRjMmkzZTQKKy5zMWNpCisuNXNlMmwyZjUKKy5zZWwxbDUKKy5zZTJuCisuc2U1cjJpZTQKKy5zZXIxaQorLnMyaDIKKy5zaTIKKy5zM2luZzQKKy4yczFpbgorLnN0NAorLnN0YTViMmwyCisuczF0YQorLnMydGFiCisuczR5MgorLjF0YTQKKy50ZTQKKy4zdGVuNWEybgorLnRlMW5hCisudGgyCisudGkyCisudGlsNAorLnRpMW01bzUKKy4xdGltCisudGluZzQKKy4ydDFpbgorLnQ0aTRuNWsyCisudG8xbjRhCisuMXRvCisudG8ybgorLnRvNHAKKy50b3A1aQorLnRvMnU1cworLnRvdTIKKy50cmliNXV0CisudHI0aWIKKy51MW4xYQorLnVuM2NlCisudW5kZXI1CisudW4xZGUKKy51Mm4xZQorLnU0bjVrMgorLnVuNW8KKy51bjN1NAorLnVwMworLnVyZTMKKy51czVhMgorLjJ1cworLnZlbjRkZQorLnZlNXIxYQorLndpbDVpCisud2kyCisud2lsMgorLnllNAorNGFiLgorYTViYWwKK2E1YmEybgorYWJlMgorYWI1ZXJkCithYjJpNWEKK2FiNWkydDVhYgorYWJpMnQKK2FiaTF0YQorYWI1bGF0CithYjJsMgorYWI1bzVsMWl6CithYm9sMmkKKzRhYnIKK2FiNXJvZworYWIzdWwKK2E0YzJhMnIKK2ExY2EKK2FjNWFyZAorYWM1YXJvCithNWNlb3UyCithYzFlcgorYTVjaGU0dAorYTJjaAorYWNoZTIKKzRhMmNpCithM2MyaWU0CithMmMxaW4KK2EzYzJpbworYWM1cm9iCithY3Q1aWYyCithMmMxdAorYWMzdWwKK2FjNHVtCithMmQKK2FkNGQxaW4KK2FkMWQ0CithZDVlci4KKzJhZGkKK2EzZDRpM2EKK2FkM2kxY2EKK2FkaTRlcgorYWQyaWU0CithM2QyaW8KK2EzZGl0CithNWRpMXUKK2FkNGxlCithZDNvdworYTFkbworYWQ1cmEybgorYTFkcgorYWQ0c3UKK2EyZDFzMgorNGExZHUKK2EzZHUyYworYWQ1dW0KK2FlNHIKK2FlcjJpNGU0CithZXIxaQorYTJmCithNGYxZjQKK2E0Z2FiCithMWdhCithZ2E0bgorYWc1ZWwxbAorYTFnZTRvCis0YWc0ZXUKK2FnMWkKKzRhZzRsMgorYWcxbgorYTJnbworM2EzZzRvNGcKK2FnM28zbmkKK2FnbzJuMgorYTVndWVyCithMmd1ZQorYWc1dWwKK2E0Z3kKK2EzaGEKK2EzaGUKK2E0aDRsNAorYTNobworYWkyCithNWkxYQorYTNpYy4KK2FpNWx5CithNGk0bgorYWluNWluCithMmluaQorYTJpMW41bworYWl0NWVuCithMml0ZQorYTFqCithazFlbgorYWw1YWIKK2FsM2EyZAorYTRsMmEycgorNGFsZGk0CithMmxkCisyYWxlCithbDNlbmQKK2E0bGVudDJpCithMWxlbjF0CithNWxlNW8KK2FsMWkKK2FsNGlhLgorYWwyaTFhCithbDJpNGU0CithbDVsZXYKK2FsMWwKK2FsMmxlCis0YWxsaWMKK2FsbDJpCis0YTJsbQorYTVsb2cuCithNGx5LgorYTFseQorNGEybHlzNAorNWE1bHlzMXQKKzVhbHl0CiszYWx5egorNGExbWEKK2EybTVhYgorYW0zYWcKK2FtYTVyYQorYW0yYTJyCithbTVhc2MKK2E0bWEzdGlzCithNG01YTF0bworYW01ZXIxYQorYW0zaWMKK2FtNWlmCithbTVpMWx5CithbTFpbgorYW0yaTRubworYTJtbworYTVtbzJuCithbW9yNWkKK2FtbzJyCithbXA1ZW4KK2E0bTFwCithMm4KK2FuM2FnZQorYTFuYQorM2FuYTFseQorYTNuMmEycgorYW4zYXIzYworYW5hcjRpCithM25hdGkKK2FuMmF0Cis0YW5kCithbmRlNHMyCithbjFkZQorYW4zZGlzMQorYW4xZGwKK2FuNGRvdworYW4xZG8KK2E1bmVlCithM25lbgorYW41ZTJzdC4KK2ExbmVzCithMm5lc3QKK2EzbjRldQorMmFuZworYW5nNWllNAorYW4xZ2wyCithNG4xaWMKK2EzbmllcworYW4yaWU0CithbjNpM2YKK2FuNGltZQorYW4xaW0KK2E1bmltMWkKK2E1bjJpbmUKK2FuMWluCithbjNpNG8KK2EzbjJpcAorYW4zaXMyaAorYW4zaXQKK2EzbmkxdQorYW40a2xpCithNG5rMgorYW4xazFsCis1YW5uaXoKK2E0bjFuMgorYW5vNAorYW41b3QKK2FuNG90aDUKK2FuMnNhMgorYTJuMXMyCithbjRzMWNvCithbnM0YworYW40czFuNAorYW4yc3AKK2FuczNwbworYW40c3QKK2FuNHN1MnIKK2FuMXN1CithbnRhMmw0CithbjF0CithbjF0YQorYW40dDJpZTQKK2FudDJpCis0YW4xdG8KK2FuMnRyCithbjR0dzQKK2FuM3UxYQorYW4zdWwKK2E1bnVyCis0YW8KK2FwMmEycjQKK2ExcGEKK2FwNWF0CithcDVlcjNvCithM3BoNGVyCis0YXBoaQorYTRwaWxsYQorYXBpbDFsCithcDVpbGwyYTJyCithcDNpMm4KK2FwM2kxdGEKK2EzcGkydHUKK2EycDJsMgorYXBvNGM1CithcDVvMWxhCithcG9yNWkKK2ExcDRvcgorYXBvczN0CithMXBvcworYXBzNWU0cworYTJwMXMyCithcDJzZQorYTNwdQorYXF1ZTUKK2FxdTIKKzJhMnIKK2FyM2EyYzF0CithNXJhZGUKK2FyYTJkCithcjVhZGlzMQorYXIyYWRpCithcjNhbAorYTVyYW1lMXRlCithcmFtM2V0CithcjJhbjRnCithcmEybgorYXJhM3AKK2FyNGF0CithNXJhMXQyaW8KK2FyNWExdDJpdgorYTVyYXUKK2FyNWF2NAorYXJhdzQKK2FyYmFsNAorYXIxYgorYXI0Y2hhMm4KK2FyMWMKK2FyM2NoYQorYXIyY2gKK2FyNWQyaW5lCithcmQyaQorYXJkMWluNAorYXI0ZHIKK2FyNWVhcworYTNyZWUKK2FyM2VuMXQKK2E1cjJlMnNzCithcjRmaQorYXIxZgorYXI0ZjRsMgorYXIxaQorYXI1aTJhbAorYXIyaTNhCithcjNpMmEybgorYTNyaTVldAorYXIyaWU0CithcjRpbQorYXI1aW4yYXQKK2FyMmkxbmEKK2FyM2kxbworYXIyaXoKK2FyMm1pCithcjFtCithcjVvNWQKK2E1cm9uaQorYXJvMm4KK2Ezcm9vMgorYXIycAorYXIzcQorYXJyZTQKK2FyMXI0CithcjRzYTIKK2E0cnMyCithcjJzMmgKKzRhcy4KK2EyczRhYgorYXNhMgorYXMzYW4xdAorYXNhMm4KK2FzaGk0CithczJoCithNXNpYS4KK2FzMmkxYQorYTNzaTFiCithM3NpYworNWE1c2k0dAorYXNrM2kKK2FzazIKK2FzNGwyCithNHNvYworYTFzbworYXM1cGgKK2FzNHMyaAorYTJzcworYXMzdGVuCithczF0NHIKK2FzdTFyNWEKK2Exc3UKK2FzdTJyCithMnRhCithdDNhYjJsMgorYTJ0YWIKK2F0NWFjCithdDNhbG8KK2F0YTJsCithdDVhcAorYXRlNWMKK2F0NWUyY2gKK2F0M2UxZ28KK2F0ZWc0CithdDNlbi4KK2F0M2VyMWEKK2F0ZXI1bgorYTV0ZXIxbmEKK2F0M2VzdAorYXQ1ZXYKKzRhdGgKK2F0aDVlbQorYXRoMmUKK2E1dGhlMm4KK2F0NGhvCithdGg1b20KKzRhdGkuCithNXQyaTFhCithMnQ1aTViCithdDFpYworYXQzaWYyCithdGlvbjVhMnIKK2ExdDJpbworYXRpbzJuCithdGlvMW4xYQorYXQzaTF0dQorYTR0b2cKK2ExdG8KK2EydG9tCithdDVvbTJpegorYTR0b3AKK2E0dG9zMgorYTF0cgorYXQ1cm9wCithdDRzazIKK2E0dDFzMgorYXQ0dGFnCithNHQzdDIKK2F0MXRhCithdDV0ZQorYXQ0dGgKK2EydHUKK2F0NXUxYQorYTR0NXVlCithdDN1bAorYXQzdTFyYQorYTJ0eQorYXU0YgorYXVnaDMKK2F1M2d1CithdTRsMgorYXVuNWQKK2F1M3IKK2F1NXNpMWIKK2EydXMKK2E0dXQ1ZW4KK2F1MXRoCithMnZhCithdjNhZzQKK2E1dmEybgorYXY0ZTRubworYXYzZXIxYQorYXY1ZXJuCithdjVlcnkKK2F2MWkKK2F2aTRlcgorYXYyaWU0CithdjNpZworYXY1b2MKK2Exdm9yCiszYXdheQorYXczaTIKK2F3NGx5Cithd3M0CitheDRpNWMKK2F4M2kKK2F4NGlkCitheTVhbAorYXllNAorYXlzNAorYXppNGVyCithMnoxaQorYXoyaWU0CithejJ6NWkKK2E0ejF6MgorNWJhLgorYmFkNWdlcgorYmEyZAorYmE0Z2UKK2JhbDFhCitiYW41ZGFnCitiYTJuCitiNGFuZAorYmFuMWQyYQorYmFuNGUKK2JhbjNpCitiYXJiaTUKK2IyYTJyCitiYXIxYgorYmFyMmk0YQorYmFyMWkKK2JhczRzaQorYmEyc3MKKzFiYXQKK2JhNHoKKzJiMWIKK2IyYmUKK2IzYmVyCitiYmk0bmEKKzRiMWQKKzRiZS4KK2JlYWs0CitiZWEydDMKKzRiZTJkCitiMmUzZDJhCitiZTNkZQorYjRlM2RpCitiZTNnaQorYmU1Z3UKKzFiZWwKK2JlMWwyaQorYmUzbG8KKzRiZTVtCitiZTVuMmlnCitiZTVudQorNGJlczQKK2JlM3NwCitiMmU1c3Q0cgorM2JldAorYmUxdDVpegorYmU1dHIKK2JlM3R3NAorYmUzdworYmU1eTFvNAorMmJmCis0YjNoCitiaTJiCitiMmk0ZAorM2IyaWU0CitiaTVlbgorYmk0ZXIKKzJiM2lmCisxYmlsCitiaTNsMml6CitiaWwxaQorYmluMmE1cjQKK2JpMW5hCitiNGluNGQKK2JpNW5ldAorYjJpbmUKK2JpM28yZ3IKK2IyaW8KK2JpNW91MgorYmkydAorM2IyaTN0MmlvCitiaTF0aQorYmkzdHIKKzNiaXQ1dTFhCitiaTF0dQorYjVpNHR6CitiMWoKK2JrNAorYjJsMgorYmw0YXRoNQorYjRsZS4KK2JsZW40Cis1YmxlMXNwCitibGVzMgorYjNsaXMKK2I0bG8KK2JsdW40dAorNGIxbQorNGIzbgorYm5lNWcKKzNib2QKK2JvZDNpCitibzRlCitib2wzaWMKK2JvbDJpCitib200YmkKK2JvNG0xYgorYm8xbjRhCitibzJuCitib241YXQKKzNib28yCis1Ym9yLgorNGIxbzFyYQorYm9yNWQKKzVib3JlCis1Ym9yaQorNWJvczQKK2I1bzF0YQorYjRvdGg1CitibzR0bworYm91bjJkMworYm91MgorNGJwCis0YnJpdAorYnI0b3RoMworMmI1czIKK2Jzb3I0CitiMXNvCisyYnQKK2IydDRsCitiNHRvCitiM3RyCitidWY0ZmVyMQorYnU0ZjFmCitidTRnYQorYnUzbDJpCitidTFtaTQKK2J1NG4KK2J1bnQ0aQorYnVuMXQKK2J1M3JlCitidXM1aWU0CitiMnVzCitidXNzNGUKK2J1MnNzCis1YnVzdAorNGJ1MXRhCiszYnUxdDJpbworYjR1MXQyaQorYjV1MXRvCitiMXYKKzRiNXcKKzVieS4KK2J5czQKKzFjYQorY2FiM2luCitjYTFiMmwyCitjYTJjaDQKK2NhNWRlbgorY2EyZAorNGNhZzQKKzJjNWFoCitjYTNsYXQKK2NhbDRsYQorY2FsMWwKK2NhbDJsNWluNAorY2FsbDJpCis0Y2FsbworYzRhbjVkCitjYTJuCitjYW40ZQorY2E0bjRpYworY2FuNWlzCitjYW4zaXoKK2NhbjR0eQorY2FuMXQKK2Nhbnk0CitjYTVwZXIKK2NhcjVvbQorYzJhMnIKK2Nhc3Q1ZXIKK2NhczV0MmlnCitjYXN0MmkKKzRjYXM0eQorYzRhNHRoCis0Y2ExdDJpdgorY2F2NWFsCitjYTJ2YQorYzNjCitjY2hhNQorYzJjaAorYzNjMmk0YQorYzFjaQorY2NvbTFwYTUKK2MxY28KK2NjbzRtMXAKK2NjbzJuNAorY2NvdTN0CitjY291MgorMmNlLgorNGNlZC4KKzRjZTFkZW4KKzNjZWkyCis1Y2VsLgorM2NlbDFsCisxY2VuCiszY2VuYworMmNlbjRlCis0Y2VuaQorM2NlbjF0CiszY2VwCitjZTVyYW0KK2NlcjFhCis0Y2UxczRhMgorM2NlczFzaQorYzJlMnNzCitjZXM1c2k1YgorY2VzNXQKK2NldDQKK2M1ZTR0YQorY2V3NAorMmNoCis0Y2guCis0Y2gzYWIKKzVjaGE0bjFpYworY2hhMm4KK2NoNWE1bmlzCitjaGUyCitjaGVhcDMKKzRjaDRlZAorY2g1ZTVsbworM2NoZW1pCitjaDVlbmUKK2NoZTJuCitjaDNlci4KK2NoM2U0cjFzMgorNGNoMWluCis1Y2hpMm5lLgorY2gyaW5lCitjaDVpNW4yZTJzcworY2hpMW5lcworNWNoMmluaQorNWNoMmlvCiszY2hpdAorY2hpMnoKKzNjaG8yCitjaDR0aQorMWNpCiszYzJpMWEKK2NpMmE1YgorY2kyYTVyCitjaTVjCis0Y2llcgorYzJpZTQKKzVjNGkyZjNpYy4KK2NpMWZpCis0YzRpNWk0CitjaTRsYQorM2NpbDFpCisyY2ltCisyY2luCitjNGkxbmEKKzNjaW4yYXQKK2NpbjNlbQorYzJpbmUKK2MxaW5nCitjNWluZy4KKzVjMmkxbm8KK2NpbzJuNAorYzJpbworNGNpcGU0CitjMmlwCitjaTNwaAorNGNpcDRpYworY2lwM2kKKzRjaXMxdGEKKzRjaXMxdDJpCisyYzFpdAorY2kxdDNpegorY2kxdGkKKzVjaXoKK2NrMQorY2szaQorMWM0bDQKKzRjbDJhMnIKK2M1bGE1cmExdDJpbworY2xhcjRhdAorNWNsYXJlCitjbGU0bQorNGNsaWMKK2NsaW00CitjMWx5NAorYzVuCisxY28KK2NvNWFnCitjNG9hCitjb2UyCisyY29nCitjbzRncgorY29pNAorY28zaW5jCitjb2w1aQorNWNvbG8KK2NvbDNvNHIKK2NvbTVlcgorY28ybWUKK2NvMW40YQorY28ybgorYzRvbmUKK2NvbjNnCitjb241dAorY28zcGEKK2NvcDNpYworY280cDJsMgorNGNvcjFiCitjb3JvM24KK2NvczRlCitjb3YxCitjb3ZlNAorY293NWEKK2NvMno1ZQorY281ejFpCitjMXEKK2NyYXM1dAorY3IyYXMKKzVjcmF0LgorNWNyYXQxaWMKK2NyZTNhMnQKKzVjMnIyZWQKKzRjM3JlMXRhCitjcmU0djIKK2NyaTIKK2NyaTVmCitjNHJpbgorY3IyaXM0Cis1Y3JpMXRpCitjcm80cDJsMgorY3JvcDVvCitjcm9zNGUKK2NydTRkCis0YzNzMgorMmMxdAorYzJ0YTRiCitjMXRhCitjdDVhbmcKK2N0YTJuCitjNXRhbjF0CitjMnRlCitjM3RlcgorYzR0NGljMXUKK2N0aW0zaQorYzF0aW0KK2N0dTRyCitjMXR1CitjNHR3NAorY3VkNQorYzR1ZgorYzR1aTIKK2N1NWkxdHkKKzVjdWwyaQorY3VsNHRpczQKK2N1bDF0aQorY3U0bHQKKzNjNHVsMXR1MgorY3UybWEKK2MzdW1lCitjdTRtaQorM2N1bgorY3UzcGkKK2N1NXB5CitjdTJyNWE0YgorY3UxcmEKK2N1NXIyaTNhCisxYzJ1cworY3VzMXM0aQorY3Uyc3MKKzNjNHV0CitjdTR0MmllNAorYzR1MXQyaQorNGM1dTF0Mml2Cis0Y3V0cgorMWN5CitjMnplNAorMWQyYQorNWRhLgorMmQzYTRiCitkYTJjaDQKKzRkYTJmCisyZGFnCitkYTJtMgorZDJhbjNnCitkYTJuCitkYXJkNQorZDJhMnIKK2Rhcms1Cis0ZGFyeQorM2RhdAorNGRhMXQyaXYKKzRkYTF0bworNWRhdjQKK2RhdjVlCis1ZGF5CitkMWIKK2Q1YworZDFkNAorMmRlLgorZGVhMmY1CitkZTRiNWkydAorZDJlMWIKK2RlNGJvMm4KK2RlY2EybjQKK2RlMWNhCitkZTRjaWwKK2RlMWMyaQorZGU1Y29tCitkZTFjbworMmQxZWQKKzRkZWUuCitkZTVpZgorZGVpMgorZGVsMmk0ZTQKK2RlbDJpCitkZTRsNWk1cQorZGU1bG8KK2Q0ZW0KKzVkZW0uCiszZGVtaWMKK2RlbTVpYy4KK2RlNW1pbAorZGU0bW8ybjNzMgorZGUxbW8KK2RlbW8ybgorZGVtbzJyNQorMWRlbgorZGU0bjJhMnIKK2RlMW5hCitkNGUzbm8KK2RlbnRpNWYyCitkZW4xdAorZGVudDJpCitkZTNudQorZGUxcAorZGUzcGEKK2RlcGk0CitkZTJwdQorZDNlMXEKK2Q0ZXIxaDQKKzVkZXIzbTQKK2Q1ZXJuNWl6CitkZTRyNXMyCitkZXMyCitkMmVzLgorZGUxczJjCitkZTJzNW8KK2RlczN0MmkKK2QyZTNzdDRyCitkZTRzdQorZGUxdAorZGUydG8KK2RlMXYKK2RlMnYzaTRsCitkZTF2aQorNGRleQorNGQxZgorZDRnYQorZDNnZTR0CitkZzFpCitkMmd5CitkMWgyCis1ZGkuCisxZDRpM2EKK2RpYTViCitkNGk0Y2FtCitkaTFjYQorZDRpY2UKKzNkaTJjMXQKKzNkMmlkCis1ZGkzZW4KK2QyaWU0CitkMWlmCitkaTNnZQorZDJpZworZGk0bGExdG8KK2RpMWxhCitkMWluCisxZGkxbmEKKzNkaTJuZS4KK2QyaW5lCis1ZDJpbmkKK2RpNW5pegorMWQyaW8KK2RpbzVnCitkaTRwMmwyCitkMmlwCitkNGlyMgorZGkxcmUKK2RpcjF0NWkKK2RpczEKKzVkaXNpCitkNGlzM3QKK2QyaTF0aQorMWQyaTF2CitkMWoKK2Q1azIKKzRkNWxhCiszZGxlLgorM2RsZWQKKzNkbGVzLgorZGxlczIKKzRkM2wyZTJzcworMmQzbG8KKzRkNWx1CisyZDFseQorZDFtCis0ZDFuNAorMWRvCiszZG8uCitkbzVkZQorNWRvZQorMmQ1b2YKK2Q0b2cKK2RvNGxhCitkb2wyaTQKK2RvNWxvNHIKK2RvbTVpegorZG8zbjJhdAorZG8ybgorZG8xbjFhCitkb25pNAorZG9vM2QKK2RvbzIKK2RvNHA0cAorZDRvcgorM2RvcworNGQ1b3V0Citkb3UyCitkbzR2CiszZG94CitkMXAKKzFkcgorZHJhZzVvMm4yCitkcmEyZ28KKzRkcjJhaTIKK2RyZTQKK2RyZTJhNXIKKzVkcmVuCitkcjRpNGIKK2RyaWw0Citkcm80cAorNGRyb3cKKzVkcnVwbGkKK2RydTNwMmwyCis0ZHJ5CisyZDFzMgorZHM0cAorZDRzdzIKK2Q0czR5CitkMnRoCisxZHUKK2QxdTFhCitkdTJjCitkMXUzY2EKK2R1YzVlcgorNGR1Y3QuCitkdTJjMXQKKzRkdWM0dDFzMgorZHU1ZWwKK2R1NGcKK2QzdWw0ZQorZHVtNGJlCitkdTRtMWIKK2R1NG4KKzRkdXAKK2R1NHBlCitkMXYKK2QxdworZDJ5Cis1ZHluCitkeTRzMmUKK2R5czVwCitlMWE0YgorZTNhMmMxdAorZWEyZDEKK2VhZDVpZTQKK2UyYWRpCitlYTRnZQorZWE1Z2VyCitlYTRsCitlYWw1ZXIKK2UyYWxlCitlYWwzb3UyCitlYW0zZXIKK2U1YW5kCitlYTJuCitlYXIzYQorZTJhMnIKK2VhcjRjCitlYXI1ZXMKK2VhcjRpYworZWFyMWkKK2VhcjRpbAorZWFyNWsKK2VhcjJ0CitlYXJ0M2UKK2VhNXNwCitlM2Eyc3MKK2Vhc3QzCitlYTJ0CitlYXQ1ZW4KK2VhdGgzaQorZTRhdGgKK2U1YXQzaWYyCitlNGEzdHUKK2VhMnYKK2VhdjNlbgorZWF2NWkKK2VhdjVvCisyZTFiCitlNGJlbC4KK2UxYmVsCitlNGJlMmwxczIKK2U0YmVuCitlNGJpMnQKK2UzYnIKK2U0Y2EyZAorZTFjYQorZWNhbjVjCitlY2EybgorZWMxY2E1CitlYzNjCitlMWNlCitlYzVlczFzYTIKK2VjMmUyc3MKK2UxYzJpCitlNGNpYgorZWM1aWZpY2F0CitlY2kxZmkKK2VjaWZpMWNhCitlYzVpM2YyaWU0CitlYzVpMWZ5CitlMmMzaW0KK2UyYzFpNHQKK2U1YzJpdGUKK2U0Y2xhbQorZTFjNGw0CitlNGNsMnVzCitlMmNvbAorZTFjbworZTRjb20xbQorZTRjb21wZQorZWNvNG0xcAorZTRjb24xYworZWNvMm4KK2UyY29yCitlYzNvMXJhCitlY281cm8KK2UxY3IKK2U0Y3JlbQorZWM0dGEybgorZTJjMXQKK2VjMXRhCitlYzR0ZQorZTFjdQorZTRjdWwKK2VjM3UxbGEKKzJlMmQyYQorNGVkM2Q0CitlNGQxZXIKK2VkZTRzMgorNGVkaQorZTNkNGkzYQorZWQzaWIKK2VkM2kxY2EKK2VkM2ltCitlZDFpdAorZWRpNXoKKzRlMWRvCitlNGRvbAorZWRvMm4yCitlNGRyaQorZTFkcgorZTRkdWwKK2UxZHUKK2VkNXUxbDRvCitlZTJjCitlNGVkM2kKK2VlMmYKK2VlbDNpCitlZTRseQorZWUybQorZWU0bmEKK2VlNHAxCitlZTJzNAorZWVzdDQKK2VlNHR5CitlNWV4CitlMWYKK2U0ZjNlcmUKK2VmZXIxCisxZTRmMWYKK2U0ZmljCitlMWZpCis1ZWYyaTFjNGkKK2VmaWw0CitlM2YyaTJuZQorZTJmaW4KK2VmNWk1bjJpdGUKK2VmMmluaQorZWZpbjJpdAorM2VmaXQKK2Vmb3I1ZXMKK2UxZm8KK2VmbzJyCitlNGZ1NHNlLgorZTNmdQorZWYydXMKKzRlZ2FsCitlMWdhCitlZ2VyNAorZWc1aWIKK2VnNGljCitlZzVpbmcKK2U1Z2l0NQorZWc1bgorZTRnby4KK2UxZ28KK2U0Z29zCitlZzF1bAorZTVndXIKKzVlMWd5CitlMWg0CitlaGVyNAorZWkyCitlNWljCitlMmk1ZAorZTJpZzIKK2VpNWc0bDIKK2UzaTRtMWIKK2UzaW4zZgorZTFpbmcKK2U1aW5zdAorZTJpMm4xczIKK2VpcjRkCitlNGlyCitlMml0M2UKK2UyaTN0aAorZTVpMXR5CitlMWoKK2U0anVkCitlajV1ZGkKK2VraTRuCitlazFpCitlazRsYQorZWsxbAorZTFsYQorZTRsYS4KK2U0bGFjCitlM2w0YW40ZAorZWxhMm4KK2U0bDVhMXQyaXYKK2U0bGF3CitlbGF4MWE0CitlM2xlMmEKK2VsNWVicmEKK2VsMmUxYgorZWxlM2JyCis1ZWxlYworZTRsZWQKK2VsM2UxZ2EKK2U1bGVuCitlNGwxZXIKK2UxbGVzMgorZTJsMmYKK2VsMmkKK2UzbGliZTQKK2U0bDVpYy4KK2VsM2kxY2EKK2UzbGllcgorZWwyaWU0CitlbDVpM2dpYgorZWwyaWcKK2VsNGlnaQorZTVsaW0KK2U0bDNpbmcKK2UzbDJpbworZTJsaXMKK2VsNWlzMmgKK2UzbDJpdjMKKzRlbGxhCitlbDFsCitlbDRsYWIKK2VsbDRvNAorZTVsb2MKK2VsNW9nCitlbDNvcC4KK2VsMnMyaAorZTJsMXMyCitlbDR0YQorZTRsdAorZTVsdWQKK2VsNXVnCitlNG1hYworZTFtYQorZTRtYWcKK2U1bWEybgorZW01YTFuYQorZTRtNWIKK2UxbWUKK2UybWVsCitlNG1ldAorZW0zaTFjYQorZW0yaTRlNAorZW01aWdyYQorZW0yaWc0CitlbWkxZ3IKK2VtMWluMgorZW01aW5lCitlbTNpM25pCitlNG0yaXMKK2VtNWlzMmgKK2U1bTRpMnMxcworZW0zaXoKKzVlbW5pegorZTRtMW4KK2VtbzRnCitlMW1vCitlbW8zbjJpNW8KK2VtbzJuCitlbTNwaQorZTRtMXAKK2U0bXVsCitlMW11CitlbTV1MWxhCitlbXUzbjIKK2UzbXkKK2VuNWEybW8KK2UxbmEKK2U0bmFuMXQKK2VuMmEybgorZW5jaDRlcgorZW4yY2gKK2VuY2hlMgorZW4zZGljCitlNW5lYQorZTVuZWUKK2VuM2VtCitlbjVlcm8KK2VuMWVyCitlbjVlMXNpCitlMW5lcworZTJuNWVzdAorZW4zZXRyCitlM25lNHcKK2VuNWk0YzNzMgorZTVuMmllNAorZTVuaWwKK2UzbjJpNG8KK2VuM2lzMmgKK2VuM2l0CitlNW5pMXUKKzVlbml6Cis0ZTRuMW4yCis0ZW5vCitlNG5vNGcKK2U0bm9zCitlbjNvdgorZW40c3cyCitlMm4xczIKK2VudDVhZ2UKK2VuMXQKK2VuMXRhCis0ZW50aDFlcworZW50aDJlCitlbjN1MWEKK2VuNXVmCitlM255LgorNGU0bjN6CitlNW9mCitlbzJnCitlNG9pNAorZTNvbAorZW9wM2EycgorZW8ycGEKK2Uxb3IKK2VvM3JlCitlbzVyb2wKK2VvczQKK2U0b3QKK2VvNHRvCitlNW91dAorZW91MgorZTVvdworZTJwYQorZTNwNGFpMgorZXA1YW5jCitlcGEybgorZTVwZWwKK2UzcGVuMXQKK2VwNWU1dDJpMXQyaW8KK2VwZTJ0CitlcGV0aTF0aQorZXBoZTQKK2U0cGxpCitlMXAybDIKK2UxcG8KK2U0cHJlYworZXByMgorZXA1cmUxY2EKK2U0cDJyMmVkCitlcDNyZTFoNAorZTNwcm8KK2U0cHJvYgorZXA0czRoCitlMnAxczIKK2VwNXRpNWIKK2UycDF0CitlNHB1MnQKK2VwNXUxdGEKK2UxcQorZXF1aTNsCitlcXUyCitlcTJ1aTIKK2U0cTN1aTNzCitlcjFhCitlMnJhNGIKKzRlcjRhbmQKK2VyYTJuCitlcjNhMnIKKzRlcjRhdGkuCisyZXIxYgorZXI0YjJsMgorZXIzY2gKK2VyMWMKK2VyNGNoZTIKKzJlMnJlLgorZTNyZTFhNGwKK2VyZTVjbworZXJlM2luCitlcmVpMgorZXI1ZWwuCitlcjNlMW1vCitlcjVlMW5hCitlcjVlbmNlCis0ZXJlbmUKK2VyM2VuMXQKK2VyZTRxCitlcjVlMnNzCitlcjNlczJ0CitlcmV0NAorZXIxaDQKK2VyMWkKK2UxcjJpM2E0Cis1ZXJpY2sxCitlM3JpZW4KK2VyMmllNAorZXJpNGVyCitlcjNpbjRlCitlMXIyaTFvCis0ZXJpdAorZXI0aTF1CitlcjJpNHYKK2U0cmkxdmEKK2VyM200CitlcjRuaXM0Cis0ZXIzbjJpdAorNWVybml6CitlcjNubzQKKzJlcm8KK2VyNW9iCitlNXIyb2MKK2VybzRyCitlcjFvdTIKK2U0cjFzMgorZXIzc2V0CitlcjJzZQorZXJ0M2VyCis0ZXIydGwKK2VyM3R3NAorNGVydQorZXJ1NHQKKzVlcndhdQorZXIxdworZTFzNGEyCitlNHNhMmdlLgorZTRzYWdlcworZXMyYworZTJzMWNhCitlczVjYTJuCitlM3NjcgorZXM1Y3UKK2UxczJlCitlMnNlYworZXM1ZTFjcgorZTRzNWVuYworZTRzZXJ0LgorZTRzZXI0dDFzMgorZTRzZXIxdmEKKzRlczJoCitlM3NoYQorZXNoNWUybgorZTFzaQorZTJzaWMKK2UyczJpZAorZXM1aTFkZW4KK2U0czVpZzFuNGEKK2VzMmlnCitlMnM1aW0KK2UyczRpNG4KK2VzaXM0dGUKK2Uxc2lzCitlNXNpNHUKK2U1c2tpbgorZXNrMgorZXNrMWkKK2VzNG1pCitlMnMxbQorZTJzb2wKK2Uxc28KK2VzM29sdQorZTJzbzJuCitlczVvMW4xYTQKK2Uxc3AKK2UyczNwZXIKK2VzNXBpMXJhCitlc3A0aXIKK2VzNHByZQorZXNwcjIKKzJlMnNzCitlczRzaTRiCitlczFzaQorZXN0YTJuNAorZXMxdGEKK2VzM3QyaWcKK2VzdDJpCitlczV0aW0KKzRlczJ0bworZTNzdG8ybgorMmVzdDRyCitlNXN0cm8KK2VzdHJ1YzUKK2Uyc3UycgorZTFzdQorZXM1dXIxcjQKK2VzNHcyCitlMnRhNGIKK2UxdGEKK2UzdGVuNGQKK2UzdGVvCitldGhvZDMKK2V0MWljCitlNXRpZGUKK2V0MmlkCitlMnQxaW40CitldDJpNG5vCitlNXQ0aXIKK2U1dDJpMXQyaW8KK2V0aTF0aQorZXQ1aTF0Mml2Cis0ZTJ0MW4yCitldDVvMW4xYQorZTF0bworZXRvMm4KK2UzdHJhCitlM3RyZQorZXQzcmljCitldDVyaWYKK2V0M3JvZworZXQ1cm9zCitldDN1MWEKK2UxdHUKK2V0NXltCitlMXR5CitlNHQ1egorNGV1CitlNXVuCitlM3VwCitldTNybworZTJ1czQKK2V1dGU0CitldXRpNWwKK2U0dTF0MmkKK2V1NXRyCitldmEycDUKK2UxdmEKK2UydmFzCitldjVhc3QKK2U1dmVhCitldjNlbDFsCitldmU0bDNvCitlNXZlbmcKK2V2ZW40aQorZXYxZXIKK2U1djJlcjFiCitlMXZpCitldjNpZAorZTJ2aTRsCitlNHYxaW4KK2UzdjJpNHYKK2U1dm9jCitlNXZ1CitlMXdhCitlNHdhZworZTV3ZWUKK2Uzd2gKK2V3aWw1Citld2kyCitldzNpbjRnCitlM3dpdAorMWV4M3AKKzVleTFjCis1ZXllLgorZXlzNAorMWZhCitmYTNiMmwyCitmNGFiM3IKK2ZhNGNlCis0ZmFnCitmYTRpNG40CitmYWkyCitmYWwybDVlCitmYWwxbAorNGY0YTRtYQorZmFtNWlzCis1ZjJhMnIKK2ZhcjV0aAorZmEzdGEKK2ZhM3RoMmUKK2Y0YXRoCis0ZmExdG8KK2ZhdTRsdDUKK2ZhdTRsMgorNGY1YgorNGZkCis0ZmUuCitmZWFzNAorZmU0YXRoMworZmVhMnQKK2YyZTRiCis0ZmUxY2EKKzVmZTJjMXQKKzJmZWQKK2ZlM2wyaQorZmU0bW8KK2ZlbjJkCitmZW4xZDVlCitmZXIxCis1ZmVyMXI0CitmZXY0Cis0ZjFmCitmNGZlcworZjRmMmllNAorZjFmaQorZjVmMmluLgorZjJmaW4KK2YyZjVpcworZjRmMmx5NQorZmY0bDIKK2YyZnkKKzRmaAorMWZpCitmMmkzYQorMmYzaWMuCis0ZjNpY2FsCitmaTFjYQorZjNpY2EybgorNGZpY2F0ZQorZjNpMWNlbgorZmkzY2VyCitmMmkxYzRpCis1ZmkzYzJpMWEKKzVmaWMyaWU0Cis0Zmk0YzNzMgorZmkzY3UKK2ZpNWRlbAorZjJpZAorZmlnaHQ1CitmMmlnCitmaWw1aQorZmlsMmw1aW40CitmaWwxbAorZmlsbDJpCis0ZmkxbHkKKzJmaW4KKzVmaTFuYQorZjRpbjJkNQorZjJpMm5lCitmMWluM2cKK2YyaTRuNG4yCitmaXM0dDJpCitmNGwyCitmNWwyZTJzcworZmxlczIKK2ZsaW40CitmbG8zcmUKK2YybHk1Cis0Zm0KKzRmbgorMWZvCis1Zm8ybgorZm9uNGRlCitmMm9uZAorZm9uNHQKK2ZvMnIKK2ZvNXJhdAorZm8xcmEKK2ZvcjVheQorZm9yZTV0Citmb3I0aQorZm9yMXQ1YQorZm9zNQorNGY1cAorZnJhNHQKK2Y1cmVhCitmcmVzNWMKK2ZyaTIKK2ZyaWw0Citmcm9sNQorMmYzcworMmZ0CitmNHRvCitmMnR5CiszZnUKK2Z1NWVsCis0ZnVnCitmdTRtaW4KK2Z1MW1pCitmdTVuZQorZnUzcmkKK2Z1c2k0CitmMnVzCitmdTJzNHMKKzRmdTF0YQorMWZ5CisxZ2EKK2dhMmY0Cis1Z2FsLgorM2dhbDFpCitnYTNsbworMmdhbQorZ2E1bWV0CitnNWEybW8KK2dhbjVpcworZ2EybgorZ2Ezbml6CitnYW5pNXphMQorNGdhbm80CitnYXI1bjQKK2cyYTJyCitnYTJzczQKK2c0YXRoMworNGdhMXQyaXYKKzRnYXoKK2czYgorZ2Q0CisyZ2UuCisyZ2VkCitnZWV6NAorZ2VsNGluCitnZWwyaQorZ2U1bGlzCitnZTVsMWl6Cis0Z2UxbHkKKzFnZW4KK2dlNG4yYXQKK2dlMW5hCitnNWU1bml6Cis0ZzRlbm8KKzRnZW55CisxZ2VvCitnZTNvbQorZzRlcnkKKzVnZTFzaQorZ2V0aDUKKzRnZTF0bworZ2U0dHkKK2dlNHYKKzRnMWcyCitnMmdlCitnM2dlcgorZ2dsdTUKK2dnbDIKK2cxZ280CitnaDNpbgorZ2g1b3V0CitnaG91MgorZ2g0dG8KKzVnaS4KKzFnMmk0YQorZ2kyYTVyCitnMWljCis1Z2kzYzJpMWEKK2cyaTFjaQorZzRpMWNvCitnaWVuNQorZzJpZTQKKzVnaWVzLgorZ2lsNAorZzNpMW1lbgorM2c0aW4uCitnNGluNWdlCis1ZzRpMm4xczIKKzVnMmlvCiszZzRpcgorZ2lyNGwKK2czaXMxbDIKK2dpNHUKKzVnMml2CiszZ2l6CitnbDIKK2dsYTQKK2dsMmFkNWkKK2dsYTJkCis1Z2xhcworMWdsZQorZ2xpNGIKK2czbDJpZworM2dsbworZ2xvM3IKK2cxbQorZzRteQorZzFuNGEKK2c0bmEuCitnbmU0dDR0MgorZzFuaQorZzJuMWluCitnNG4yaTRvCitnMW5vCitnNG5vNG4KKzFnbworM2dvLgorZ29iNQorNWdvZQorM2c0bzRnCitnbzNpcworZ29pMgorZ28ybjIKKzRnM28zbjFhCitnb241ZG81CitnMm9uZAorZ28zbmkKKzVnb28yCitnbzVyaXoKK2dvcjVvdTIKKzVnb3MuCitnb3YxCitnM3AKKzFncgorNGdyYTFkMmEKK2dyYTJkCitnNHIyYWkyCitncmEybjIKKzVncmE0cGguCitnNXJhM3BoNGVyCis1Z3JhcGgxaWMKK2dyNGFwaGkKKzRnM3JhMXBoeQorNGdyYXkKK2dyZTRuCis0Z3Jlc3MuCitncjJlMnNzCis0Z3JpdAorZzRybworZ3J1ZjQKK2dzMgorZzVzdGUKK2d0aDMKK2d1NGEKKzNndWFyMmQKK2d1MmEycgorMmd1ZQorNWd1aTV0CitnMnVpMgorM2d1bgorM2cydXMKKzRndTR0CitnM3cKKzFneQorMmc1eTNuCitneTVyYQoraDNhYjRsMgoraGEyY2g0CitoYWU0bQoraGFlNHQKK2g1YWd1CitoYTNsYQoraGFsYTNtCitoYTRtCitoYW40Y2kKK2hhMm4KK2hhbjRjeQorNWhhbmQuCitoNGFuZAoraDJhbjRnCitoYW5nNWVyCitoYW4xZzVvCitoNWE1bml6CitoYTRuNGsyCitoYW40dGUKK2hhbjF0CitoYTJwM2wyCitoYTJwNXQKK2hhM3JhMm4KK2gyYTJyCitoYTVyMmFzCitoYXIyZAoraGFyZDNlCitoYXI0bGU0CitoYXIxbAoraGFycDVlbgoraGFyMnAKK2hhcjV0ZXIKK2hhMnM1cworaGF1bjQKKzVoYXoKK2hhejNhMQoraDFiCisxaGVhMmQxCiszaGUyYTJyCitoZTRjYTJuCitoZTFjYQoraDVlY2F0CitoNGVkCitoNGU1ZG81CitoZTNsNGkKK2hlbDRsaXMKK2hlbDFsCitoZWxsMmkKK2hlbDRseQoraDVlbG8KK2hlNG00cAoraGUybgoraGUxbmE0CitoZW41YXQKK2hlMW81cgoraGVwNQoraDRlcjFhCitoZXJhM3AKK2hlcjRiYQoraDJlcjFiCitoZXJlNWEKK2gzZXJuCitoNWVyMW91MgoraDJlcm8KK2gzZXJ5CitoMWVzCitoZTJzNXAKK2hlNHQKK2hlMnQ0ZWQKK2g0ZXU0CitoMWYKK2gxaAoraGk1YTJuCitoMmkxYQoraGk0Y28KK2hpZ2g1CitoMmlnCitoNGlsMgoraGltZXI0CitoNGkxbmEKK2hpb240ZQoraDJpbworaGlvMm4KK2gyaTRwCitoaXI0bAoraDRpcgoraGkzcm8KK2hpcjRwCitoaXI0cjQKK2hpczNlbAoraDRpc2UKK2g0aTJzNHMKK2hpdGg1ZXIKK2gyaXRoCitoaXRoMmUKK2gyaTJ2Cis0aGsKKzRoMWw0CitobGEybjQKK2gybG8KK2hsbzNyaQorNGgxbQoraG1ldDQKKzJoMW4KK2g1b2RpegoraDVvMmQxczIKK2hvNGcKK2hvMWdlNAoraG9sNWEycgoraG8xbGEKKzNob2w0ZQoraG80bWEKK2hvMm1lMworaG8xbjRhCitobzJuCitobzVueQorM2hvb2QKK2hvbzIKK2hvbzJuNAoraG9yNWF0CitobzFyYQoraG81cjJpcworaG9ydDNlCitobzVydQoraG9zNGUKK2hvNXNlbgoraG9zMXAKKzFobzJ1cworaG91MgoraG91c2UzCitob3Y1ZWwKKzRoNXAKKzRocjQKK2hyZWU1Citocm81bml6Citocm8ybgoraHJvM3BvCis0aDFzMgoraDRzMmgKK2g0dDJhMnIKK2gxdGEKK2h0MWVuCitodDVlcworaDR0eQoraHU0ZworaHU0bWluCitodTFtaQoraHVuNWtlCitodTRuazIKK2h1bjR0CitodXMzdDQKK2gydXMKK2h1NHQKK2gxdworaDR3YXI0dAoraHcyYTJyCitoeTNwZQoraHkzcGgKK2h5MnMKKzJpMWEKK2kyYWwKK2lhbTQKK2lhbTVlMXRlCitpMmEybgorNGlhbmMKK2lhbjNpCis0aWFuNHQKK2lhNXBlCitpYTJzczQKK2k0YTF0Mml2CitpYTR0cmljCitpYTF0cgoraTRhMnR1CitpYmU0CitpYjNlcjFhCitpYjVlcnQKK2liNWkxYQoraWIzaW4KK2liNWl0LgoraWJpMnQKK2liNWl0ZQoraTFiMmwyCitpYjNsaQoraTVibworaTFicgoraTJiNXJpCitpNWJ1NG4KKzRpY2FtCitpMWNhCis1aWNhcAorNGljMmEycgoraTRjYXIuCitpNGNhcmEKK2ljYXM1CitpNGNheQoraWNjdTQKK2ljM2MKKzRpY2VvCis0aTJjaAorMmkxY2kKK2k1YzJpZAoraWM1aTFuYQoraTJjaW4KK2kyYzJpcAoraWMzaTFwYQoraTRjMWx5NAoraTFjNGw0CitpMmM1b2MKK2kxY28KKzRpMWNyCis1aWNyYQoraTRjcnkKK2ljNHRlCitpMmMxdAoraWMxdHUyCitpYzR0M3UxYQoraWMzdTFsYQoraWM0dW0KK2ljNXVvCitpM2N1cgorMmlkCitpNGRhaTIKK2kxZDJhCitpZDVhbmMKK2lkYTJuCitpZDVkNAoraWRlM2E0bAoraWRlNHMyCitpMmRpCitpZDVpMmEybgoraTFkNGkzYQoraWRpNGEycgoraTVkMmllNAoraTFkM2lvCitpZGk1b3UyCitpZDFpdAoraWQ1aTF1CitpM2RsZQoraTRkb20KK2kxZG8KK2lkM293CitpNGRyCitpMmR1CitpZDV1bworMmllNAoraWVkNGUKKzVpZTVnYQoraWUybGQzCitpZTFuNWE0CitpZW40ZQoraTVlNG4xbjIKK2kzZW50MmkKK2llbjF0CitpMWVyLgoraTNlczJjCitpMWVzdAoraTNldAorNGlmLgoraWY1ZXJvCitpZmVyMQoraWZmNWVuCitpNGYxZgoraWY0ZnIKKzRpMmYzaWMuCitpMWZpCitpM2YyaWU0CitpM2Y0bDIKKzRpMmZ0CisyaWcKK2lnYTViCitpMWdhCitpZzNlcjFhCitpZ2h0M2kKKzRpZ2kKK2kzZ2liCitpZzNpbDQKK2lnM2luCitpZzNpdAoraTRnNGwyCitpMmdvCitpZzNvcgoraWc1b3QKK2k1Z3JlCitpMWdyCitpZzJ1NWkyCitpZzF1cgoraTNoCis0aTVpNAoraTNqCis0aWsKK2kxbGEKK2lsM2E0YgoraTRsNGFkZQoraWxhMmQKK2kybDVhbQoraWxhNXJhCitpbDJhMnIKK2kzbGVnCitpbDFlcgoraWxldjQKK2kybDVmCitpbDFpCitpbDNpMWEKK2lsMmliCitpbDNpbworaWw0aXN0CisyaWwxaXQKK2lsMml6CitpbGw1YWIKK2lsMWwKKzRpMmwxbjIKK2lsM28xcQoraWw0dHkKK2k0bHQKK2lsNXVyCitpbDN2CitpNG1hZworaTFtYQoraW0zYWdlCitpbWE1cnkKK2ltMmEycgoraW1lbnQyYTVyCitpMW1lbgoraTNtZW4xdAoraW1lbjF0YQorNGltZXQKK2ltMWkKK2ltNWkxZDRhCitpbTJpZAoraW1pNWxlCitpNW0yaW5pCis0aW1pdAoraW00bmkKK2k0bTFuCitpM21vMm4KK2kxbW8KK2kybXUKK2ltM3UxbGEKKzJpbi4KK2k0bjNhdQoraTFuYQorNGluYXYKK2luY2VsNAoraW4zY2VyCis0aW5kCitpbjVkbGluZworMmluZQoraTNuZWUKK2luNGVyNGEycgoraW4xZXIKK2luZXIxYQoraTVuMmUyc3MKK2kxbmVzCis0aW4xZ2EKKzRpbmdlCitpbjVnZW4KKzRpbmdpCitpbjVnbGluZworaW5nbDIKKzRpbjFnbworNGluMWd1CisyaW5pCitpNW5pLgoraTRuNGkxYQoraW4zaTRvCitpbjFpcworaTVuaTR0ZS4KK2luMml0CitpbjJpdGUKKzVpM24yaTF0MmlvCitpbmkxdGkKK2luM2kxdHkKKzRpNG5rMgorNGk0bjFsCisyaTRuMW4yCisyaTFubworaTRubzRjCitpbm80cworaTRub3QKKzJpMm4xczIKK2luM3NlCitpbnN1MXI1YQoraW4xc3UKK2luc3UycgorMmludC4KK2luMXQKKzJpbjR0aAoraW4xdQoraTVuMnVzCis0aW55CisyaW8KKzRpby4KK2lvMWdlNAoraW8yZ3IKK2kxb2wKK2lvNG0KK2lvbjNhdAoraW8ybgoraW8xbjFhCitpb240ZXJ5Citpb24xZXIKK2lvbjNpCitpMm81cGgKK2lvcjNpCitpNG9zCitpNG81dGgKK2k1b3RpCitpbzR0bworaTRvdXIKK2lvdTIKKzJpcAoraXBlNAoraXBocjJhczQKK2lwNGhyNAoraXAzaQoraXA0aWMKK2lwNHJlNAoraXByMgoraXAzdWwKK2kzcXVhCitpcXUyCitpcTV1ZTFmCitpcTN1MmlkCitpcTJ1aTIKK2lxM3VpM3QKKzRpcgoraTFyYQoraTJyYTRiCitpNHJhYworaXJkNWUKK2lyZTRkZQoraTJyMmVkCitpNHJlMWYKK2k0cmVsNAoraTRyZXMKK2lyNWdpCitpcmcyCitpcjFpCitpcmk1ZGUKK2lyMmlkCitpcjRpcworaXJpM3R1Cis1aTVyMml6CitpcjRtaW4KK2lyMW0KK2lybzRnCis1aXJvbi4KK2lybzJuCitpcjV1bAorMmlzLgoraXM1YWcKK2lzYTIKK2lzM2EycgoraXNhczUKKzJpczFjCitpczNjaDIKKzRpc2UKK2lzM2VyCiszaTRzM2YKK2lzNWhhMm4KK2lzMmgKK2lzM2hvMm4zCitpc2hvNAoraXNoNW9wCitpczNpMWIKK2lzMmk0ZAoraTVzaXMKK2lzNWkxdDJpdgoraXNpMXRpCis0aXM0azIKK2lzbGEybjQKK2lzMWwyCis0aXM0bTFzMgoraTJzMW0KK2kyc28KK2lzbzVtZXIKK2kzc29tCitpc28ybWUKK2lzMXAKK2lzMnBpCitpczRweQorNGkyczFzCitpczRzYWwKK2lzMXNhMgoraXNzZW40CitpczRzMWU0cworaXM0dGEuCitpczF0YQoraXMxdGUKK2lzMXQyaQoraXN0NGx5CitpczJ0bAorNGlzdHJhbAoraXN0NHIKK2lzMXRyYQoraTJzdQoraXM1dXMKKzRpM3RhLgoraTF0YQoraXRhNGJpCitpMnRhYgoraTR0YWcKKzRpdGE1bQoraTN0YTJuCitpM3RhdAorMml0ZQoraXQzZXIxYQoraTV0ZXIxaQoraXQ0ZXMKKzJpdGgKK2kxdGkKKzRpMXQyaTFhCis0aTJ0aWMKK2l0M2kxY2EKKzVpNXRpY2sxCitpMnQzaWcKK2l0NWlsMWwKK2kydGltCisyaTF0MmlvCis0aXRpcworaTR0aTJzNG0KK2kydDVvNW0KK2kxdG8KKzRpdG8ybgoraTR0cmFtCitpMXRyYQoraXQ1cnkKKzRpNHQzdDIKK2l0M3UxYXQKK2kxdHUKK2l0dTFhCitpNXR1ZDIKK2l0M3VsCis0aXR6LgoraTR0egoraTF1CisyaXYKK2l2M2VsMWwKK2l2M2VuLgoraTR2M2VyLgoraTR2ZXJzLgoraXZlNHIxczIKK2l2NWlsLgoraTJ2aWwKK2l2NWlvCitpdjFpdAoraTV2b3JlCitpdjNvM3JvCitpNHYzb3QKKzRpNXcKK2l4NG8KKzRpeQorNGl6MmEycjIKK2l6YTEKK2kyejFpNAorNWl6b24xdAoraTF6bworaXpvMm4KKzVqYQoramFjNHEKK2phNHAKKzFqZQoramU0cjVzMgorNGplczR0MmllNAoramVzdDJpCis0amVzMnR5CitqZXczCitqbzRwCis1anVkZworM2thLgorazNhYgorazVhZwora2FpczQKK2thaTIKK2thbDQKK2sxYgorazJlZAorMWtlZQora2U0Zwora2U1bDJpCitrM2VuNGQKK2sxZXIKK2tlczQKK2szZTJzdC4KK2tlNHR5CitrM2YKK2toNAorazFpCis1a2kuCis1azJpYworazRpbDFsCitraWxvNQorazRpbQorazRpbi4KK2tpbjRkZQorazRpbmQKK2s1aTVuMmUyc3MKK2syaW5lCitraTFuZXMKK2tpbjRnCitrMmk0cAora2lzNAorazVpczJoCitrazQKK2sxbAorNGszbGV5Cis0azFseQorazFtCitrNW5lcworMWsybm8KK2tvNXIKK2tvczJoNAorazNvdTIKK2tybzVuCis0azFzMgorazRzYwora3M0bDIKK2s0czR5CitrNXQKK2sxdworbGFiM2ljCitsNGFibworbDRhMmNpNAorbDRhZGUKK2xhMmQKK2xhM2QyeQorbGFnNG4KK2xhMm0zbworM2w0YW5kCitsYTJuCitsYW40ZGwKK2xhbjVldAorbGFuNHRlCitsYW4xdAorbGFyNGcyCitsMmEycgorbGFyM2kKK2xhczRlCitsYTV0YTJuCitsYTJ0YQorNGxhdGVsMmk0Cis0bGExdDJpdgorNGxhdgorbGE0djRhCisybDFiCitsYmluNAorNGwxYzIKK2xjZTQKK2wzY2kKKzJsZAorbDJkZQorbGQ0ZXJlCitsZDRlcjFpCitsZGk0CitsZDVpczEKK2wzZHIKK2w0ZHJpCitsZTJhCitsZTRiaQorbDJlMWIKK2xlMmZ0NQorbGUxZgorNWxlZy4KKzVsZTRnMWcyCitsZTRtYXQKK2xlMW1hCitsZW01YXQxaWMKKzRsZW4uCiszbGVuYworNWxlMm5lLgorMWxlbjF0CitsZTNwaAorbGU0cHIyCitsZTJyYTViCitsZXIxYQorbGVyNGUKKzNsZXJnMgorM2w0ZXIxaQorbDRlcm8KK2xlczIKK2xlNXMxY28KK2xlczJjCis1bGVzcQorM2wyZTJzcworNWxlc3MuCitsM2UxdmEKK2xldjRlci4KK2xldjFlcgorbGV2NGVyMWEKK2xldjRlNHIxczIKKzNsZXkKKzRsZXllCisybGYKK2w1ZnIKKzRsMWc0CitsNWdhCitsZzJhMnIzCitsNGdlcworbDFnbzMKKzJsM2gKK2xpNGFnCitsMmkxYQorbGkyYW00CitsaWFyNWl6CitsaTJhMnIKK2xpYXIxaQorbGk0YXMKK2xpNGExdG8KK2xpNWJpCis1bGljMmlvCitsMmkxY2kKK2xpNGNvcgorbGkxY28KKzRsaTRjM3MyCis0bGljdC4KK2xpMmMxdAorbDRpY3UKK2wzaTFjeQorbDNpMWQyYQorbDJpZAorbGlkNWVyCiszbGkyZGkKK2xpZjNlcjEKK2w0aTRmMWYKK2xpNGY0bDIKKzVsaWdhdGUKK2wyaWcKK2xpMWdhCiszbGlnaAorbGk0Z3JhCitsaTFncgorM2w0aWsKKzRsNGk0bAorbGltNGIybDIKK2xpNG0xYgorbGltM2kKK2xpNG1vCitsNGk0bTRwCitsNGkxbmEKKzFsNGluZQorbGluM2VhCitsMmluM2kKK2xpbms1ZXIKK2w0aTRuazIKK2xpNW9nCitsMmlvCis0bDRpcQorbGlzNHAKK2wxaXQKK2wyaXQuCis1bGl0M2kxY2EKK2xpMXRpCitsNGkydGljCitsNWk1dGk0YzNzMgorbGl2M2VyCitsMml2CitsMWl6Cis0bGoKK2xrYTMKK2wza2FsNAorbGthNHQKK2wxbAorbDRsYXcKK2wybGUKK2w1bGUyYQorbDNsZWMKK2wzbGVnCitsM2xlbAorbDNsZTRuCitsM2xlNHQKK2xsMmkKK2wybGluNAorbDVsNGkxbmEKK2xsNG8KK2xsb3EydWk1CitsbG8xcQorbGxvcXUyCitsMmw1b3V0CitsbG91MgorbDVsb3cKKzJsbQorbDVtZXQKK2xtM2luZworbDRtbzJkMQorbDFtbworbG1vMm40CisybDFuMgorM2xvLgorbG9iNWFsCitsbzRjaQorNGxvZgorM2xvZzFpYworbDVvMWdvCiszbG9ndQorbG9tM2VyCitsbzJtZQorNWxvbmcKK2xvMm4KK2xvbjRpCitsM28zbml6Citsb29kNQorbG9vMgorNWxvNHBlLgorbG9wM2kKK2wzbzRwMW0KK2xvMXJhNAorbG80cmExdG8KK2xvNXIyaWU0Citsb3I1b3UyCis1bG9zLgorbG9zNWV0Cis1bG9zNW8zcGhpegorbG8yc28KK2xvczRvcAorbG9zMm9waAorNWxvczVvMXBoeQorbG9zNHQKK2xvNHRhCitsb3VuNWQKK2xvdTIKKzJsb3V0Cis0bG92CisybHAKK2xwYTViCitsMXBhCitsM3BoYQorbDVwaGkKK2xwNWluZworbHBpMm4KK2wzcGl0CitsNHAybDIKK2w1cHIyCis0bDFyCisybDFzMgorbDRzYworbDJzZQorbDRzMmllNAorNGx0CitsdDVhZworbDF0YQorbHRhbmU1CitsdGEybgorbDF0ZQorbHRlbjQKK2x0ZXIxYTQKK2x0aDNpCitsNXRpZXMuCitsdDJpZTQKK2x0aXM0CitsMXRyCitsMXR1MgorbHR1MXIzYQorbHU1YQorbHUzYnIKK2x1MmNoNAorbHUzY2kKK2x1M2VuCitsdWY0CitsdTVpZAorbDJ1aTIKK2x1NG1hCis1bHUxbWkKK2w1dW1uLgorbHU0bTFuCis1bHVtM240aTFhCitsdTNvCitsdW8zcgorNGx1cAorbHUyc3M0CitsMnVzCitsdXMzdGUKKzFsdXQKK2w1dmVuCitsNXZldDQKKzJsMXcKKzFseQorNGx5YQorNGx5MWIKK2x5NW1lNAorbHkzbm8KKzJseXM0CitsNXkzczJlCisxbWEKKzJtYWIKK21hMmNhCittYTVjaDJpbmUKK21hMmNoCittYTRjaDFpbgorbWE0YzRsNAorbWFnNWluCittYWcxaQorNW1hZzFuCisybWFoCittYTJpZDUKK21haTIKKzRtYTJsZAorbWEzbDJpZworbWFsMWkKK21hNWxpbgorbWFsNGwyaQorbWFsMWwKK21hbDR0eQorbWE0bHQKKzVtYTNuNGkxYQorbWEybgorbWFuNWlzCittYW4zaXoKKzRtYXAKK21hNXJpMm5lLgorbTJhMnIKK21hcjFpCittYXIyaW40ZQorbWE1cjJpegorbWFyNGx5CittYXIxbAorbWFyM3YKK21hNXNjZQorbWFzNGUKK21hczF0Cis1bWF0ZQorbTRhdGgzCittYTN0aXMKKzRtYXRpM3phMQorbWExdGl6Cis0bTFiCittMWJhNHQ1CittNWJpbAorbTRiM2luZworbWIyaTR2Cis0bTVjCis0bWUuCisybWVkCis0bWVkLgorNW1lM2Q0aTNhCittNGVkaQorbWUzZDJpZTQKK201ZTVkMnkKK21lMmcKK21lbDVvMm4KK21lNGw0dAorbWUybQorbWUxbTFvMworMW1lbgorbWUxbjRhCittZW41YWMKK21lbjRkZQorNG1lbmUKK21lbjRpCittZTJuMXM0CittZW4xc3U1CiszbWVuMXQKK21lbjR0ZQorbWU1bzJuCittNWVyMXNhMgorbWU0cjFzMgorMm1lcworM21lc3QyaQorbWU0dGEKK21ldDNhMmwKK21lMXRlCittZTV0aGkKK200ZXRyCis1bWV0M3JpYworbWU1dHIyaWU0CittZTN0cnkKK21lNHYKKzRtMWYKKzJtaAorNW1pLgorbTJpM2EKK21pMWQ0YQorbTJpZAorbWlkNGcKK20yaWc0CiszbWlsM2kxYQorbWlsMWkKK201aTVsMmllNAorbTRpbDFsCittaTFuNGEKKzNtNGluZAorbTVpM25lZQorbTJpbmUKK200aW5nbDIKK21pbjVnbGkKK201aW5nMWx5CittaW40dAorbTRpbjF1CittaW90NAorbTJpbworbTJpcworbWk0czRlci4KK200aXNlCittaXMzZXIKK21pczVsMgorbWlzNHQyaQorbTVpNHN0cnkKK21pc3Q0cgorNG0yaXRoCittMml6Cis0bWsKKzRtMWwKK20xbQorbW1hNXJ5CittMW1hCittbTJhMnIKKzRtMW4KK20xbjRhCittNG4xaW4KK21uNG8KKzFtbworNG1vY3IKKzVtb2M1cmExdGl6CittbzJkMQorbW80Z28KK21vaXMyCittb2kyCittbzRpNXNlCis0bTJvaworbW81bGVzdAorbW9sZXMyCittbzNtZQorbW9uNWV0CittbzJuCittb241Z2UKK21vM240aTNhCittb240aTJzMW0KK21vbjFpcworbW9uNGlzdAorbW8zbml6Cittb25vbDQKK21vM255LgorbW8ycgorNG1vNXJhLgorbW8xcmEKK21vczIKK21vNXNleQorbW8zc3AKK200b3RoMworbTVvdWYKK21vdTIKKzNtbzJ1cworbW8ydgorNG0xcAorbXBhcmE1CittMXBhCittcDJhMnIKK21wYTVyYWIKK21wNGE0cjVpCittM3BlMnQKK21waGFzNAorbTJwaQorbXAyaTRhCittcDVpZXMKK21wMmllNAorbTRwMWkybgorbTVwNGlyCittcDVpcworbXBvM3JpCittMXA0b3IKK21wb3M1aXRlCittMXBvcworbTRwbzJ1cworbXBvdTIKK21wb3Y1CittcDR0cgorbTJwMXQKK20ycHkKKzRtM3IKKzRtMXMyCittNHMyaAorbTVzaQorNG10CisxbXUKK211bDJhNXI0CittdTFsYQorNW11NGx0CittdWwxdGkzCiszbXVtCittdW4yCis0bXVwCittdTR1Cis0bXcKKzFuYQorMm4xYTJiCituNGFidQorNG5hYy4KK25hNGNhCituNWEyYzF0CituYWc1ZXIuCituYWs0CituYTRsMWkKK25hNWwyaTFhCis0bmE0bHQKK25hNW1pdAorbjJhMm4KK25hbjFjaTQKK25hbjRpdAorbmE0bms0CituYXIzYworbjJhMnIKKzRuYXJlCituYXIzaQorbmFyNGwKK241YXIxbQorbjRhcworbmFzNGMKK25hczV0MmkKK24yYXQKK25hM3RhMmwKK25hMnRhCituYXQ1bzVtMml6CituYTJ0b20KK25hMXRvCituMmF1CituYXUzc2UKK25hMnVzCiszbmF1dAorbmF2NGUKKzRuMWI0CituYzJhMnI1CituMWNhCituNGNlcy4KK24zY2hhCituMmNoCituNWNoZW8KK25jaGUyCituNWNoNGlsMgorbjNjaGlzCituMmMxaW4KK24xY2kKK24yYzRpdAorbmNvdTFyNWEKK24xY28KK25jb3UyCituMWNyCituMWN1CituNGRhaTIKK24xZDJhCituNWRhMm4KK24xZGUKK25kNWUyc3QuCituZGVzMgorbmRpNGIKK241ZDJpZgorbjFkaXQKK24zZGl6CituNWR1MmMKK24xZHUKK25kdTRyCituZDJ3ZQorbmQxdworMm5lLgorbjNlMmEycgorbjJlMmIKK25lYjN1CituZTJjCis1bmVjazEKKzJuZWQKK25lNGdhdAorbmUxZ2EKK25lNGc1YTF0Mml2Cis1bmVnZQorbmU0bGEKK25lbDVpegorbmVsMmkKK25lNW1pCituZTRtbworMW5lbgorNG5lbmUKKzNuZW8KK25lNHBvCituZTJxCituMWVyCituZTJyYTViCituZXIxYQorbjRlcjNhMnIKK24yZXJlCituNGVyNWkKK25lcjRyNAorMW5lcworMm5lcy4KKzRuZTFzcAorMm5lc3QKKzRuZXM0dzIKKzNuZXQxaWMKK25lNHYKK241ZXZlCituZTR3CituM2YKK240Z2FiCituMWdhCituM2dlbAorbmdlNG40ZQorbjFnZW4KK241Z2VyZQorbjNnZXIxaQorbmc1aGEKK24zZ2liCituZzFpbgorbjVnaXQKK240Z2xhNAorbmdsMgorbmdvdjQKK24xZ28KK25nNXMyaAorbmdzMgorbjFndQorbjRndW0KK24yZ3kKKzRuMWg0CituaGE0CituaGFiMworbmhlNAorM240aTFhCituaTNhMm4KK25pNGFwCituaTNiYQorbmk0YjJsMgorbjJpNGQKK25pNWRpCituaTRlcgorbjJpZTQKK25pMmZpCituaTVmaWNhdAorbmlmaTFjYQorbjVpMWdyCituMmlnCituNGlrNAorbjFpbQorbmkzbTJpegorbmltMWkKK24xaW4KKzVuaTJuZS4KK24yaW5lCituaW40ZworbjJpNG8KKzVuMmlzLgorbmlzNHRhCituMml0CituNGl0aAorM24yaTF0MmlvCituaTF0aQorbjNpdG9yCituaTF0bworbmkzdHIKK24xagorNG5rMgorbjVrMmVybworbmsxZXIKK24za2V0CituazNpbgorbmsxaQorbjFrMWwKKzRuMWwKK241bQorbm1lNAorbm1ldDQKKzRuMW4yCitubmU0CitubmkzYWwKK24zbjRpMWEKK25uMmk0dgorbm9iNGwyCitubzNibGUKK241bzFjNGw0Cis0bjNvMmQKKzNub2UKKzRub2cKK25vMWdlNAorbm9pczVpCitub2kyCitubzVsNGkKKzVub2wxbzFnaXMKKzNub21pYworbjVvNW0yaXoKK25vNG1vCitubzNteQorbm80bgorbm9uNGFnCitubzFuMWEKK25vbjVpCituNW9uaXoKKzRub3AKKzVub3A1bzVsMmkKK25vMnI1YWIKK25vMXJhCitubzRyYXJ5Citub3IyYTJyCis0bm9zMmMKK25vczRlCitub3M1dAorbm81dGEKKzFub3UyCiszbm91bgorbm92M2VsMworbm93bDMKK24xcDQKK25waTQKK25wcmU0YworbnByMgorbjFxCituMXIKK25ydTQKKzJuMXMyCituMnM1YWIKK25zYTIKK25zYXRpNAorbnM0YworbjJzZQorbjRzM2U0cworbnMyaWQxCituczJpZzQKK24yczFsMgorbjJzM20KK240c29jCituMXNvCituczRwZQorbjVzcGkKK25zdGE1YjJsMgorbnMxdGEKK25zMnRhYgorbjF0CituMnRhNGIKK24xdGEKK250ZTRyM3MyCitudDJpCituNXRpMmIKK250aTRlcgorbnQyaWU0CitudGkyZjIKK24zdDJpbmUKK24ydDFpbgorbjR0M2luZworbnQyaTRwCitudHJvbDVsMmkKK250cm9sMWwKK240dDRzMgorbnR1M21lCituMXR1CituM3R1bQorbnUxYQorbnU0ZAorbnU1ZW4KK251ZjRmZQorbnU0ZjFmCituM3VpNG4KK24ydWkyCiszbnUzaXQKK240dW0KK251MW1lCituNXUxbWkKKzNudTRuCituM3VvCitudTN0cgorbjF2MgorbjF3NAorbnltNAorbnlwNAorNG56CituM3phMQorNG9hCitvYTJkMworbzVhNWxlczIKK28yYWxlCitvYXJkMworbzJhMnIKK29hczRlCitvYXN0NWUKK29hdDVpCitvYjNhM2IKK281YjJhMnIKK28xYmU0bAorbzFiaQorbzJiaW4KK29iNWluZworbzNicgorb2IzdWwKK28xY2UKK28yY2g0CitvM2NoZTR0CitvY2hlMgorb2NpZjMKK28xY2kKK280Y2lsCitvNGNsYW0KK28xYzRsNAorbzRjb2QKK28xY28KK29jM3JhYworb2M1cmExdGl6CitvY3JlMworNW9jcml0CitvY3JpMgorb2N0bzJyNWEKK28yYzF0CitvYzF0bworb2MzdTFsYQorbzVjdXJlCitvZDVkMWVkCitvZDFkNAorb2QzaWMKK28xZDJpM28KK28yZG80CitvZDRvcjMKK280ZDV1Y3QuCitvMWR1CitvZHUyYworb2R1MmMxdAorbzRkNXVjNHQxczIKK280ZWwKK281ZW5nCitvM2VyCitvZTR0YQorbzNldgorbzJmaQorb2Y1aXRlCitvZjRpNHQ0dDIKK28yZzVhNXIKK28xZ2EKK280ZzVhMXQyaXYKK280Z2ExdG8KK28xZ2UKK281Z2VuZQorbzFnZW4KK281Z2VvCitvNGdlcgorbzNnMmllNAorMW8xZ2lzCitvZzNpdAorbzRnbDIKK281ZzJseQorM29nbml6CitvZzFuaQorbzRnNHJvCitvMWdyCitvZzJ1NWkyCisxbzFneQorMm8yZzV5M24KK28xaDIKK29oYWI1CitvaTIKK29pYzNlcworb2kzZGVyCitvMmlkCitvaTRmMWY0CitvMmlnNAorb2k1bGV0CitvM2luZworb2ludDVlcgorb2luMXQKK281aTJzMW0KK29pNXNvMm4KK29pMnNvCitvaXN0NWVuCitvaXMxdGUKK29pM3RlcgorbzJpdGUKK281agorMm9rCitvM2tlbgorb2s1aWU0CitvazFpCitvMWxhCitvNGxhMm4KK29sYTJzczQKK28ybDJkCitvbDJkMWUKK29sM2VyCitvM2xlczJjCitvbGVzMgorbzNsZXQKK29sNGZpCitvMmxmCitvbDJpCitvM2wyaTFhCitvM2xpY2UKK29sNWlkLgorb2wyaWQKK28zbGk0ZgorbzVsNGk0bAorb2wzaW5nCitvNWwyaW8KK281bDJpcy4KK29sM2lzMmgKK281bDJpdGUKK29sMWl0CitvNWwyaTF0MmlvCitvbGkxdGkKK281bDJpdgorb2xsMmk0ZTQKK29sMWwKK29sbDJpCitvbDVvM2dpegorb2xvNHIKK29sNXAybDIKK28ybHAKK280bDJ0CitvbDN1Ygorb2wzdW1lCitvbDN1bgorbzVsMnVzCitvbDJ2CitvMmx5CitvMm01YWgKK28xbWEKK29tYTVsCitvbTVhMXRpegorb20yYmUKK280bTFiCitvbTRiMmwyCitvMm1lCitvbTNlMW40YQorbzFtZW4KK29tNWVyMnNlCitvbWU0cjFzMgorbzRtZXQKK29tNWUzdHJ5CitvbTRldHIKK28zbTJpM2EKK29tM2ljLgorb20zaTFjYQorbzVtMmlkCitvbTFpbgorbzVtMmluaQorNW9tbWVuZAorb20xbQorb20xbWVuCitvbW80Z2UKK28xbW8KK280bW8ybgorb20zcGkKK280bTFwCitvbXBybzUKK29tcHIyCitvMm4KK28xbjFhCitvbjRhYworbzNuMmEybgorb24xYworM29uY2lsCitvbjFjaQorMm9uZAorb241ZG8KK28zbmVuCitvMm41ZXN0CitvMW5lcworb240Z3UKK29uMWljCitvM24yaTRvCitvbjFpcworbzVuaTF1CitvbjNrZXkKK280bmsyCitvbjRvZGkKK280bjNvMmQKK29uM28zbXkKK28ybjNzMgorb241c3BpNAorb25zcGkxcjVhCitvbnNwNGlyCitvbjFzdTQKK29udGVuNAorb24xdAorb24zdDRpCitvbnRpMmY1CitvbjV1bQorb24xdmE1CitvbjF2Mgorb28yCitvb2Q1ZQorb29kNWkKK28ybzRrCitvb3AzaQorbzNvcmQKK29vc3Q1CitvMnBhCitvMnAyZTVkCitvcDFlcgorM29wZXIxYQorNG9wNGVyYWcKKzJvcGgKK281cGhhMm4KK281cGg0ZXIKK29wM2luZworb3BpMm4KK28zcGl0CitvNXBvMm4KK280cG9zaQorbzFwb3MKK28xcHIyCitvcDF1CitvcHk1CitvMXEKK28xcmEKK281cmEuCitvNHIzYWcKK29yNWFsMWl6CitvcmFsMWkKK29yNWFuNGdlCitvcmEybgorb3IyYW5nCitvcmU1YQorbzVyZTFhNGwKK29yM2VpMgorb3I0ZTVzMmgKK29yNWUyc3QuCitvcmVzMnQKK29yZXc0CitvcjRndQorb3JnMgorNG81cjJpM2EKK29yM2kxY2EKK281cmlsCitvcjFpbgorbzFyMmkxbworb3IzaTF0eQorbzNyaTF1CitvcjJtaQorb3IxbQorb3JuMmUKK281cm9mCitvcjNvdWcKK29yb3UyCitvcjVwZQorb3IxcAorM29ycmg0CitvcjFyNAorb3I0c2UKK280cnMyCitvcnM1ZW4KK29yc3Q0CitvcjN0aGkKK29yM3RoeQorb3I0dHkKK281cnVtCitvMXJ5CitvczNhbAorb3NhMgorb3MyYworb3M0Y2UKK28zc2NvcAorb3MxY28KKzRvc2NvcGkKK281c2NyCitvczRpNGU0CitvczVpMXQyaXYKK29zaTF0aQorb3MzaTF0bworb3MzaTF0eQorbzVzaTR1CitvczRsMgorbzJzbworbzJzNHBhCitvczRwbworb3MydGEKK281c3RhdGkKK29zNXRpbAorb3N0MmkKK29zNXRpdAorbzR0YTJuCitvMXRhCitvdGVsZTRnCitvdDNlci4KK290NWU0cjFzMgorbzR0ZXMKKzRvdGgKK290aDVlMXNpCitvdGgyZQorb3RoMWVzCitvdGgzaTQKK290M2ljLgorb3Q1aTFjYQorbzN0aWNlCitvM3RpZjIKK28zdGlzCitvdG81czIKK28xdG8KK291Mgorb3UzYjJsMgorb3VjaDVpCitvdTJjaAorb3U1ZXQKK291NGwKK291bmM1ZXIKK291bjJkCitvdTV2Mgorb3Y0ZW4KK292ZXI0bmUKK292ZTRyM3MyCitvdjRlcnQKK28zdmlzCitvNHZpMXRpNAorbzV2NG9sCitvdzNkZXIKK293M2VsCitvdzVlc3QzCitvdzFpMgorb3duNWkKK280d28yCitveTFhCisxcGEKK3BhNGNhCitwYTRjZQorcGEyYzR0CitwNGEyZAorNXBhZ2E0bgorcGExZ2EKK3AzYWdhdAorcDRhaTIKK3BhNGk0bjQKK3A0YWwKK3BhMW40YQorcGEybgorcGFuM2VsCitwYW40dHkKK3BhbjF0CitwYTNueQorcGExcAorcGE0cHUKK3BhcmE1YjJsMgorcDJhMnIKK3BhMnJhYgorcGFyNWFnZQorcGFyNWQyaQorM3BhcmUKK3BhcjVlbAorcDRhNHIxaQorcGFyNGlzCitwYTJ0ZQorcGE1dGVyCis1cGF0aGljCitwNGF0aAorcGE1dGh5CitwYTR0cmljCitwYTF0cgorcGF2NAorM3BheQorNHAxYgorcGQ0Cis0cGUuCiszcGU0YQorcGVhcjRsCitwZTJhMnIKK3BlMmMKKzJwMmVkCiszcGVkZQorM3A0ZWRpCitwZTNkNGkzYTQKK3BlZDRpYworcDRlZQorcGVlNGQKK3BlazQKK3BlNGxhCitwZWwyaTRlNAorcGVsMmkKK3BlNG4yYTJuCitwZTFuYQorcDRlbmMKK3BlbjR0aAorcGVuMXQKK3BlNW8ybgorcDRlcmEuCitwZXIxYQorcGVyYTViMmwyCitwZTJyYTRiCitwNGVyYWcKK3A0ZXIxaQorcGVyaTVzdAorcGVyMmlzCitwZXI0bWFsCitwZXIzbTQKK3BlcjFtYQorcGVyMm1lNQorcDRlcm4KK3AyZXIzbworcGVyM3RpCitwNGU1cnUKK3BlcjF2CitwZTJ0CitwZTV0ZW4KK3BlNXRpegorNHBmCis0cGcKKzRwaC4KK3BoYXI1aQorcGgyYTJyCitwaDRlM25vCitwaGUybgorcGg0ZXIKK3BoNGVzLgorcGgxZXMKK3BoMWljCis1cGgyaWU0CitwaDVpbmcKKzVwaGlzMXQyaQorM3BoaXoKK3A0aDJsNAorM3Bob2IKKzNwaG9uZQorcGhvMm4KKzVwaG9uaQorcGhvNHIKKzRwNGgxczIKK3BoM3QKKzVwaHUKKzFwaHkKK3AyaTNhCitwaTJhMm40CitwaTRjMmllNAorcDJpMWNpCitwaTRjeQorcDRpZAorcDVpMWQyYQorcGkzZGUKKzVwaTJkaQorM3BpZWMKK3AyaWU0CitwaTNlbgorcGk0Z3JhcAorcDJpZworcGkxZ3IKK3BpM2xvCitwaTJuCitwNGluLgorcDRpbmQ0CitwNGkxbm8KKzNwMmkxbworcGlvMm40CitwM2l0aAorcGk1dGhhCitwaTJ0dQorMnAzazIKKzFwMmwyCiszcGxhMm4KK3BsYXM1dAorcGwyaTNhCitwbGk1ZXIKK3BsMmllNAorNHBsMmlnCitwbGk0bgorcGxvaTQKK3BsdTRtCitwbHU0bTRiCis0cDFtCisycDNuCitwbzRjCis1cG9kLgorcG81ZW0KK3BvM2V0NQorNXBvNGcKK3BvaW4yCitwb2kyCis1cG9pbjF0Citwb2x5NXQKK3BvMmx5CitwbzRuaQorcG8ybgorcG80cAorMXA0b3IKK3BvNHJ5CisxcG9zCitwbzJzMXMKK3A0b3QKK3BvNHRhCis1cG91bgorcG91MgorNHAxcAorcHBhNXJhCitwMXBhCitwcDJhMnIKK3AycGUKK3A0cDJlZAorcDVwZWwKK3AzcGVuCitwM3BlcgorcDNwZTJ0CitwcG81czJpdGUKK3AxcG9zCitwcjIKK3ByYXk0ZTQKKzVwcmUxYzJpCitwcmU1Y28KK3ByZTNlMm0KK3ByZTRmNWFjCitwcmUxZgorcHJlMWZhCitwcmU0bGEKK3ByMWUzcjQKK3AzcmUxczJlCiszcHIyZTJzcworcHJlNXRlbgorcHJlM3YyCis1cHIyaTRlNAorcHJpbjR0MworcHIyaTRzCitwcmkyczNvCitwM3JvMWNhCitwcjJvYworcHJvZjVpdAorcHJvMmZpCitwcm8zbAorcHJvczNlCitwcm8xdAorMnAxczIKK3Ayc2UKK3BzNGgKK3A0c2kxYgorMnAxdAorcDJ0NWE0YgorcDF0YQorcDJ0ZQorcDJ0aAorcDF0aTNtCitwdHU0cgorcDF0dQorcDR0dzQKK3B1YjMKK3B1ZTQKK3B1ZjQKK3B1NGwzYzIKK3B1NG0KK3B1Mm4KK3B1cjRyNAorNXAydXMKK3B1MnQKKzVwdXRlCitwdXQzZXIKK3B1M3RyCitwdXQ0dDFlZAorcHU0dDN0MgorcHV0NHQxaW4KK3AzdworcXUyCitxdWE1djQKKzJxdWUuCiszcXVlcgorM3F1ZXQKKzJyYWIKK3JhM2JpCityYWNoNGUyCityYTJjaAorcjVhMWM0bDQKK3JhZjVmaQorcmEyZgorcmE0ZjFmNAorcmEyZjR0CityMmFpMgorcmE0bG8KK3JhbTNldAorcjJhbWkKK3JhM25lNW8KK3JhMm4KK3JhbjRnZQorcjJhbmcKK3I0YW5pCityYTVubzQKK3JhcDNlcgorM3JhMXBoeQorcmFyNWMKK3IyYTJyCityYXJlNAorcmFyNWUxZgorNHJhcmlsCityYXIxaQorcjJhcworcmF0aW8ybjQKK3JhMXQyaW8KK3JhdTR0CityYTV2YWkyCityYTJ2YQorcmF2M2VsCityYTV6MmllNAorcmEyejFpCityMWIKK3I0YmFiCityNGJhZworcmJpMgorcjJiM2k0ZgorcjJiaW4KK3I1YjJpbmUKK3JiNWluZy4KK3JiNG8KK3IxYworcjJjZQorcjFjZW40CityM2NoYQorcjJjaAorcmNoNGVyCityY2hlMgorcjRjaTRiCityMWNpCityMmM0aXQKK3JjdW0zCityNGRhbAorcjFkMmEKK3JkMmkKK3IxZDRpNGEKK3JkaTRlcgorcmQyaWU0CityZDFpbjQKK3JkM2luZworMnJlLgorcmUxYTRsCityZTNhMm4KK3JlNWFyMXI0CityZTJhMnIKKzVyZWEydgorcmU0YXcKK3I1ZWJyYXQKK3IyZTFiCityZTNicgorcmVjNW9sMWwKK3JlMmNvbAorcmUxY28KK3JlNGM1b21wZQorcmVjbzRtMXAKK3JlNGNyZQorcmUxY3IKKzJyMmVkCityZTFkZQorcmUzZGlzMQorcjRlZGkKK3JlZDVpdAorcmU0ZmFjCityZTFmCityZTFmYQorcmUyZmUKK3JlNWZlci4KK3JlZmVyMQorcmUzZmkKK3JlNGZ5CityZWczaXMKK3JlNWl0CityZWkyCityZTFsMmkKK3JlNWx1CityNGVuNHRhCityZW4xdAorcmVuNHRlCityZTFvCityZTVwaTJuCityZTRwb3NpCityZTFwbworcmUxcG9zCityZTFwdQorcjFlcjQKK3I0ZXIxaQorcjJlcm80CityNGU1cnUKK3I0ZXMuCityZTRzcGkKK3JlMXNwCityZXM0czVpNGIKK3IyZTJzcworcmVzMXNpCityZXMydAorcmU1czJ0YTJsCityZXMxdGEKK3IyZTNzdDRyCityZTR0ZXIKK3JlNHRpNHoKK3JlM3RyaQorcjRldTIKK3JlNXUxdDJpCityZXYyCityZTR2YWwKK3JlMXZhCityZXYzZWwKK3I1ZXY1ZXIuCityZXYxZXIKK3JlNXZlNHIxczIKK3JlNXZlcnQKK3JlNXZpNGwKK3JlMXZpCityZXY1b2x1CityZTR3aAorcjFmCityM2Z1NAorcjRmeQorcmcyCityZzNlcgorcjNnZXQKK3IzZzFpYworcmdpNG4KK3JnM2luZworcjVnaXMKK3I1Z2l0CityMWdsMgorcmdvNG4yCityMWdvCityM2d1CityaDQKKzRyaC4KKzRyaGFsCityMmkzYQorcmlhNGIKK3JpNGFnCityNGliCityaWIzYQorcmljNWFzNQorcmkxY2EKK3I0aWNlCis0cjJpMWNpCis1cmk1YzJpZAorcmk0YzJpZTQKK3I0aTFjbworcmlkNWVyCityMmlkCityaTNlbmMKK3IyaWU0CityaTNlbjF0CityaTFlcgorcmk1ZXQKK3JpZzVhMm4KK3IyaWcKK3JpMWdhCis1cjRpZ2kKK3JpbDNpegorcmlsMWkKKzVyaW1hMm4KK3JpMW1hCityaW01aQorM3JpMW1vCityaW00cGUKK3JpNG0xcAorcjJpMW5hCis1cmluYS4KK3I0aW40ZAorcjJpbjRlCityaW40ZworcjJpMW8KKzVyaXBoCityMmlwCityaXBoNWUKK3JpMnAybDIKK3JpcDVsaWMKK3I0aXEKK3IyaXMKK3I0aXMuCityMmlzNGMKK3IzaXMyaAorcmlzNHAKK3JpM3RhM2IKK3JpMXRhCityNWl0ZWQuCityMml0ZQorcmkydDFlZAorcml0NWVyLgorcml0NWU0cjFzMgorcjRpMnQzaWMKK3JpMXRpCityaTJ0dQorcml0NXVyCityaXY1ZWwKK3IyaXYKK3JpdjNldAorcml2M2kKK3IzagorcjNrZXQKK3JrNGxlCityazFsCityazRsaW4KK3IxbAorcmxlNAorcjJsZWQKK3I0bDJpZworcjRsaXMKK3JsNWlzMmgKK3IzbG80CityMW0KK3JtYTVjCityMW1hCityMm1lCityM21lbgorcm01ZTRyMXMyCitybTNpbmcKK3I0bWluZy4KK3I0bTJpbworcjNtaXQKK3I0bXkKK3I0bjJhMnIKK3IxbmEKK3IzbmVsCityNG4xZXIKK3I1bmV0CityM25leQorcjVuaWMKK3IxbmlzNAorcjNuMml0CityM24yaXYKK3JubzQKK3I0bm91MgorcjNudQorcm9iM2wyCityMm9jCitybzNjcgorcm80ZQorcm8xZmUKK3JvNWZpbAorcm8yZmkKK3Iyb2syCitybzVrMWVyCis1cm9sZS4KK3JvbTVlMXRlCitybzJtZQorcm80bWV0Cityb200aQorcm80bTRwCityb240YWwKK3JvMm4KK3JvMW4xYQorcm9uNGUKK3JvNW40aXMKK3JvbjR0YQorcm9uMXQKKzFyb29tCityb28yCis1cm9vdAorcm8zcGVsCityb3AzaWMKK3JvcjNpCitybzVybworcm8yczVwZXIKK3JvMnM0cworcm80dGgyZQorcjRvdGgKK3JvNHR5CitybzR2YQorcm92NWVsCityb3g1CityMXAKK3I0cGU0YQorcjVwZW4xdAorcnA1ZXIuCityM3BlMnQKK3JwNGg0CitycDNpbmcKK3JwaTJuCityM3BvCityMXI0CitycmU0YworcnJlNGYKK3I0cmUxbworcnJlNHMydAorcnIyaTRvCitycjJpNHYKK3JybzJuNAorcnJvczQKK3JyeXM0Cis0cnMyCityMXNhMgorcnNhNXRpCityczRjCityMnNlCityM3NlYworcnNlNGNyCityNHM1ZXIuCityczNlNHMKK3I1c2U1djIKK3IxczJoCityNXNoYQorcjFzaQorcjRzaTRiCityc28ybjMKK3Ixc28KK3Ixc3AKK3I1c3cyCitydGEyY2g0CityMXRhCityNHRhZworcjN0MmUxYgorcjN0ZW40ZAorcjF0ZTVvCityMXRpCityMnQ1aTJiCitydDJpNGQKK3I0dGllcgorcnQyaWU0CityM3QyaWcKK3J0aWwzaQorcnRpbDRsCityNHRpMWx5CityNHRpc3QKK3I0dDJpdgorcjN0cmkKK3J0cjJvcGg0CitydDRzMmg0CityNHQxczIKK3J1M2EKK3J1M2U0bAorcnUzZW4KK3J1NGdsMgorcnUzaTRuCityMnVpMgorcnVtM3AybDIKK3J1NG0ycAorcnUybgorcnU0bms1CitydW40dHkKK3J1bjF0CityNXVzYzIKK3IydXMKK3J1MnQxaTVuCityNHUxdDJpCitydjRlCitydmVsNGkKK3IzdmVuCitydjVlci4KK3I1dmVzdAorcnY0ZTJzCityM3ZleQorcjN2aWMKK3IzdjJpNHYKK3Izdm8KK3Ixdworcnk0YworNXJ5bmdlCityeW41ZworcnkzdAorc2EyCisyczFhYgorNXNhY2sxCitzYWMzcmkyCitzM2EyYzF0Cis1c2FpMgorc2E0bDJhMnI0CitzNGEybDRtCitzYTVsbworc2E0bDR0Ciszc2FuYworc2Eybgorc2FuNGRlCitzNGFuZAorczFhcAorc2E1dGEKKzVzYTN0MmlvCitzYTJ0M3UKK3NhdTQKK3NhNXZvcgorNXNhdworNHM1Ygorc2NhbjR0NQorczFjYQorc2NhMm4KK3NjYTRwCitzY2F2NQorczRjZWQKKzRzM2NlaTIKK3M0Y2VzCitzMmNoMgorczRjaG8yCiszczRjMmllNAorczFjaQorNXNjNGluNGQKK3MyY2luCitzY2xlNQorczFjNGw0CitzNGNsaQorc2NvZjQKK3MxY28KKzRzY29weTUKK3Njb3UxcjVhCitzY291MgorczFjdQorNHM1ZAorNHNlLgorc2U0YQorc2VhczQKK3NlYTV3CitzZTJjM28KKzNzZTJjMXQKKzRzNGVkCitzZTRkNGUKK3M1ZWRsCitzZTJnCitzZTFnM3IKKzVzZWkyCitzZTFsZQorNXNlMmwyZgorNXNlbHYKKzRzZTFtZQorc2U0bW9sCitzZTFtbworc2VuNWF0CitzZTFuYQorNHNlbmMKK3NlbjRkCitzNWUybmVkCitzZW41ZworczVlbjFpbgorNHNlbjR0MWQKK3NlbjF0Cis0c2VuMnRsCitzZTJwM2EzCis0czFlci4KK3M0ZXIxbAorczJlcjRvCis0c2VyM3ZvCitzMWU0cworczRlNXMyaAorc2VzNXQKKzVzZTV1bQorczRldQorNXNldgorc2V2M2VuCitzZXc0aTIKKzVzZXgKKzRzM2YKKzJzM2cKK3MyaAorMnNoLgorc2gxZXIKKzVzaGV2CitzaDFpbgorc2gzaW8KKzNzaDJpNHAKK3NoMmkydjUKK3NobzQKK3NoNW8ybDJkCitzaG8ybjMKK3Nob3I0CitzaG9ydDUKKzRzaDF3CitzaTFiCitzNWljM2MKKzNzaTJkZS4KK3MyaWQKKzVzaWRlNHMyCis1c2kyZGkKK3NpNWRpegorNHNpZzFuNGEKK3MyaWcKK3NpbDRlCis0c2kxbHkKKzJzMWluCitzMmkxbmEKKzVzaTJuZS4KK3MyaW5lCitzM2luZworMXMyaW8KKzVzaW8ybgorc2lvMW41YQorczRpMnIKK3NpMXI1YQorMXNpcworM3MyaTF0MmlvCitzaTF0aQorNXNpMXUKKzFzMml2Cis1c2l6CitzazIKKzRza2UKK3Mza2V0CitzazVpbmUKK3NrMWkKK3NrNWluNGcKK3MxbDIKK3MzbGF0CitzMmxlCitzbDJpdGg1CitzbDFpdAorMnMxbQorczNtYQorc21hbDFsMworc21hMm4zCitzbWVsNAorczVtZW4KKzVzNG0yaXRoCitzbW8ybDVkNAorczFtbworczFuNAorMXNvCitzbzRjZQorc28yZnQzCitzbzRsYWIKK3NvMWxhCitzbzJsM2QyCitzbzNsaWMKK3NvbDJpCis1c29sMnYKKzNzb20KKzNzNG9uLgorc28ybgorc28xbjFhNAorc29uNGcKK3M0b3AKKzVzb3BoMWljCitzMm9waAorczVvM3BoaXoKK3M1bzFwaHkKK3NvcjVjCitzb3I1ZAorNHNvdgorc281dmkKKzJzMXBhCis1c3A0YWkyCitzcGE0bgorc3BlbjRkCisyczVwZW8KKzJzcGVyCitzMnBoZQorM3NwaDRlcgorc3BobzUKK3NwaWw0CitzcDVpbmcKK3NwaTJuCis0czNwMmkxbworczRwMWx5CitzMXAybDIKK3M0cG8ybgorczFwNG9yNAorNHNwNG90CitzcXVhbDRsCitzcXUyCitzMXIKKzJzcworczFzYTIKK3NzYXMzCitzMnM1YworczNzZWwKK3M1c2VuNWcKK3M0c2VzLgorc3MxZTRzCitzNXNldAorczFzaQorczRzMmllNAorc3NpNGVyCitzNHM1aTFseQorczRzMWwyCitzczRsaQorczRzMW40Citzc3BlbjRkNAorc3MydAorc3N1MXI1YQorczFzdQorc3N1MnIKK3NzNXcyCisyc3QuCitzMnRhZworczF0YQorczJ0YTJsCitzdGFtNGkKKzVzdDRhbmQKK3N0YTJuCitzNHRhNHAKKzVzdGF0LgorczR0MWVkCitzdGVybjVpCitzNXQyZXJvCitzdGUydworc3RlMXc1YQorczN0aDJlCitzdDJpCitzNHRpLgorczV0MmkxYQorczF0aWMKKzVzNHRpY2sxCitzNHQyaWU0CitzM3RpZjIKK3N0M2luZworczJ0MWluCis1c3Q0aXIKK3MxdGxlCitzMnRsCis1c3RvY2sxCitzMXRvCitzdG8ybTNhCis1c3RvbmUKK3N0bzJuCitzNHRvcAorM3N0b3JlCitzdDRyCitzNHRyYTJkCitzMXRyYQorNXN0cmEydHUKK3M0dHJheQorczR0cjJpZAorNHN0cnkKKzRzdDN3NAorczJ0eQorMXN1CitzdTFhbAorc3U0YjMKK3N1MmczCitzdTVpcworczJ1aTIKK3N1aXQzCitzNHVsCitzdTJtCitzdTFtM2kKK3N1Mm4KK3N1MnIKKzRzdgorc3cyCis0czF3bzIKK3M0eQorNHN5MWMKKzNzeWwKK3N5bjVvCitzeTVyaW4KKzF0YQorM3RhLgorMnRhYgordGE1YmxlczIKK3RhYjJsMgorNXRhYjVvNWwxaXoKK3RhYm9sMmkKKzR0NGEyY2kKK3RhNWRvCit0YTJkCis0dGEyZjQKK3RhaTVsbwordGFpMgordGEybAordGE1bGEKK3RhbDVlbgordDJhbGUKK3RhbDNpCis0dGFsawordGFsNGxpcwordGFsMWwKK3RhbGwyaQordGE1bG9nCit0YTVtbwordGFuNGRlCit0YTJuCit0NGFuZAorMXRhbjF0YTMKK3RhbjF0Cit0YTVwZXIKK3RhNXAybDIKK3RhcjRhCit0MmEycgorNHRhcjFjCis0dGFyZQordGEzcjJpegordGFyMWkKK3RhczRlCit0YTVzNHkKKzR0YXQxaWMKK3RhNHR1cgordGEydHUKK3RhdW40Cit0YXY0CisydGF3Cit0YXg0aXMKK3RheDNpCisydDFiCis0dGMKK3Q0Y2gKK3RjaDVlNHQKK3RjaGUyCis0dDFkCis0dGUuCit0ZTJhZDRpCit0ZWEyZDEKKzR0ZWEydAordGUxY2U0Cis1dGUyYzF0CisydDFlZAordDRlNWRpCisxdGVlCit0ZWc0Cit0ZTVnZXI0Cit0ZTVnaQorM3RlbC4KK3RlbDJpNAorNXRlMmwxczIKK3RlMm1hMgordGVtM2F0CiszdGVuMmEybgordGUxbmEKKzN0ZW5jCiszdGVuZAorNHRlMW5lcworMXRlbjF0Cit0ZW40dGFnCit0ZW4xdGEKKzF0ZW8KK3RlNHAKK3RlNXBlCit0ZXIzYworNXRlcjNkCisxdGVyMWkKK3RlcjVpZXMKK3RlcjJpZTQKK3RlcjNpcwordGVyaTV6YTEKKzV0NGVyM24yaXQKK3RlcjV2Cis0dGVzLgorNHQyZTJzcwordDNlc3MuCit0ZXRoNWUKKzN0NGV1CiszdGV4Cis0dGV5CisydDFmCis0dDFnCisydGguCit0aGEybjQKK3RoMmUKKzR0aGVhCit0aDNlYXMKK3RoZTVhMnQKK3RoZTNpcwordGhlaTIKKzN0aGU0dAordGg1aWMuCit0aDVpMWNhCis0dGg0aWwyCis1dGg0aTRuazIKKzR0NGgxbDQKK3RoNW9kZQorNXRob2QzaWMKKzR0aG9vMgordGhvcjVpdAordGhvNXJpegorMnQ0aDFzMgorMXQyaTFhCit0aTRhYgordGk0YTF0bworMnRpMmIKKzR0aWNrMQordDRpMWNvCit0NGljMXUKKzV0aTJkaQordDJpZAorM3RpZW4KK3QyaWU0Cit0aWYyCit0aTVmeQorMnQyaWcKKzV0aWd1Cit0aWwybDVpbjQKK3RpbDFsCit0aWxsMmkKKzF0aW0KKzR0aTRtMXAKK3RpbTV1bAordGkybXUKKzJ0MWluCit0MmkxbmEKKzN0aTJuZS4KK3QyaW5lCiszdDJpbmkKKzF0MmlvCit0aTVvYwordGlvbjVlZQordGlvMm4KKzV0aXEKK3RpM3NhMgorM3Q0aXNlCit0aTJzNG0KK3RpNXNvCit0aXM0cAorNXRpc3RpMWNhCit0aXMxdDJpCit0aXMxdGljCit0aTN0bAordGk0dQorMXQyaXYKK3RpMXY0YQorMXRpegordGkzemExCit0aTN6ZTRuCit0aTJ6ZQorMnRsCit0NWxhCit0bGEybjQKKzN0bGUuCiszdGxlZAorM3RsZXMuCit0bGVzMgordDVsZXQuCit0NWxvCis0dDFtCit0bWU0CisydDFuMgorMXRvCit0bzNiCit0bzVjcmF0Cis0dG8yZG80CisydG9mCit0bzJncgordG81aWMKK3RvaTIKK3RvMm1hCit0bzRtNGIKK3RvM215Cit0b240YTRsMWkKK3RvMm4KK3RvMW4xYQordG8zbjJhdAorNHRvbm8KKzR0b255Cit0bzJyYQordG8zcjJpZTQKK3RvcjVpegordG9zMgorNXRvdXIKK3RvdTIKKzR0b3V0Cit0bzN3MmEycgorNHQxcAorMXRyYQordDJyYTNiCit0cmE1Y2gKK3RyNGEyY2k0Cit0cmEyYzRpdAordHJhYzR0ZQordHJhMmMxdAordHIyYXM0Cit0cmE1dmVuCit0cmF2NWUyczUKK3RyZTVmCit0cmU0bQordHJlbTVpCis1dHIyaTNhCit0cmk1Y2VzCit0cjRpY2UKKzV0cmkzYzJpMWEKK3Q0cjJpMWNpCis0dHJpNGMzczIKKzJ0cmltCit0cjJpNHYKK3RybzVtNGkKK3Ryb241aQordHJvMm4KKzR0cm9ueQordHJvNXBoZQordHIyb3BoCit0cm8zc3AKK3RybzN2Cit0cjJ1NWkyCit0cjJ1czQKKzR0MXMyCit0NHNjCit0czJoNAordDRzdzIKKzR0M3QyCit0NHRlcwordDV0bwordDF0dTQKKzF0dQordHUxYQordHUzYTJyCit0dTRiNGkKK3R1ZDIKKzR0dWUKKzR0dWY0Cis1dDJ1M2kyCiszdHVtCit0dTRuaXMKK3R1MW5pCisydDN1cC4KKzN0dXJlCis1dHVyaQordHVyM2lzCit0dXI1bwordHU1cnkKKzN0MnVzCis0dHYKK3R3NAorNHQxd2EKK3R3aXM0Cit0d2kyCis0dDF3bzIKKzF0eQorNHR5YQorMnR5bAordHlwZTMKK3R5NXBoCis0dHoKK3QyejRlCis0dWFiCit1YWM0Cit1YTVuYQordWEybgordWFuNGkKK3VhcjVhbjF0Cit1MmEycgordWFyYTJuCit1YXIyZAordWFyM2kKK3VhcjN0Cit1MWF0Cit1YXY0Cit1YjRlCit1NGJlbAordTNiZXIKK3U0YjJlcm8KK3UxYjRpCit1NGI1aW5nCit1M2I0bGUuCit1YjJsMgordTNjYQordWNpNGIKK3UxY2kKK3UyYzRpdAordWNsZTMKK3UxYzRsNAordTNjcgordTNjdQordTRjeQordWQ1ZDQKK3VkM2VyCit1ZDVlc3QKK3VkZXMyCit1ZGUxdjQKK3UxZGljCit1ZDNpZWQKK3VkMmllNAordWQzaWVzCit1ZDVpczEKK3U1ZGl0Cit1NGRvMm4KK3UxZG8KK3VkNHNpCit1MmQxczIKK3U0ZHUKK3U0ZW5lCit1ZTJuMXM0Cit1ZW40dGUKK3VlbjF0Cit1ZXI0aWwKK3VlcjFpCiszdTFmYQordTNmNGwyCit1Z2gzZTJuCit1ZzVpbgorMnVpMgordWlsNWl6Cit1aWwxaQordWk0bgordTFpbmcKK3VpcjRtCit1NGlyCit1aTF0YTQKK3UyaXYzCit1aTR2NGVyLgordTVqCis0dWsKK3UxbGEKK3VsYTViCit1NWxhdGkKK3VsMmNoNAordTRsMWMyCis1dWxjaGUyCit1bDNkZXIKK3UybGQKK3VsMmRlCit1bDRlCit1MWxlbgordWw0Z2kKK3U0bDFnNAordWwyaQordTVsMmkxYQordWwzaW5nCit1bDVpczJoCit1bDRsMmEycgordWwxbAordWw0bGk0YgordWxsMmkKK3VsNGxpcworNHUybDNtCit1MWw0bworNHUybDFzMgordWxzNWU0cwordWwyc2UKK3VsMXRpCit1NGx0Cit1bDF0cmEzCit1bDF0cgorNHVsMXR1MgordTNsdQordWw1dWwKK3VsNXYKK3UybTVhYgordTFtYQordW00YmkKK3U0bTFiCit1bTRiMWx5Cit1bWIybDIKK3UxbWkKK3U0bTNpbmcKK3Vtb3I1bwordTFtbwordW1vMnIKK3U0bTJwCit1bjJhdDQKK3UxbmEKK3UybmUKK3VuNGVyCit1MW5pCit1bjRpbQordTJuMWluCit1bjVpczJoCit1bjJpM3YKK3UybjNzNAordW40c3cyCit1bjJ0M2E0YgordW4xdAordW4xdGEKK3VuNHRlci4KK3VuNHRlcwordW51NAordW41eQordTRuNXoKK3U0bzRyczIKK3U1b3MKK3Uxb3UyCit1MXBlCit1cGU0cjVzMgordTVwMmkzYQordXAzaW5nCit1cGkybgordTNwMmwyCit1NHAzcAordXBwb3J0NQordXAxcDRvcgordXAydDVpMmIKK3UycDF0Cit1cDF0dTQKK3UxcmEKKzR1cmEuCit1NHJhZwordTRyMmFzCit1cjRiZQordXIxYgordXIxYzQKK3VyMWQKK3VyZTVhMnQKK3VyNGZlcjEKK3VyMWYKK3VyNGZyCit1M3JpZgordXJpNGZpYwordXJpMWZpCit1cjFpbgordTNyMmkxbwordTFyaXQKK3VyM2l6Cit1cjJsCit1cmw1aW5nLgordXI0bm80Cit1cm9zNAordXI0cGUKK3VyMXAKK3VyNHBpCit1cnM1ZXIKK3U0cnMyCit1cjJzZQordXI1dGVzCit1cjN0aDJlCit1cjF0aTQKK3VyNHQyaWU0Cit1M3J1CisydXMKK3U1c2EyZAordXNhMgordTVzYTJuCit1czRhcAordXNjMgordXMzY2kKK3VzZTVhCit1NXMyaTFhCit1M3NpYwordXM0bGluCit1czFsMgordXMxcAordXM1czFsMgordTJzcwordXM1dGVyZQordXMxdDRyCit1MnN1Cit1c3UycjQKK3UydGE0YgordTF0YQordTN0YXQKKzR1NHRlLgorNHV0ZWwKKzR1dGVuCit1dGVuNGkKKzR1MXQyaQordXRpNWwyaXoKK3V0aWwxaQordTN0MmluZQordTJ0MWluCit1dDNpbmcKK3V0aW8xbjVhCit1MXQyaW8KK3V0aW8ybgordTR0aXMKKzV1NXRpegordTR0MWwKK3UydDVvZgordTF0bwordXRvNWcKK3V0bzVtYXQxaWMKK3V0bzJtYQordTV0bzJuCit1NHRvdTIKK3U0dDFzNAordTN1Cit1dTRtCit1MXYyCit1eDF1MwordTJ6NGUKKzF2YQorNXZhLgorMnYxYTRiCit2YWM1aWwKK3Y0YTJjaQordmFjM3UKK3ZhZzQKK3ZhNGdlCit2YTVsMmk0ZTQKK3ZhbDFpCit2YWw1bwordmFsMXUKK3ZhNW1vCit2YTVuaXoKK3ZhMm4KK3ZhNXBpCit2YXI1aWVkCit2MmEycgordmFyMWkKK3ZhcjJpZTQKKzN2YXQKKzR2ZS4KKzR2ZWQKK3ZlZzMKK3YzZWwuCit2ZWwzbDJpCit2ZWwxbAordmU0bG8KK3Y0ZTFseQordmVuM29tCit2NGVubwordjVlbnVlCit2NGVyZAorNXYyZTJyZS4KK3Y0ZXJlbAordjNlcmVuCit2ZXI1ZW5jCit2NGVyZXMKK3ZlcjNpZTQKK3ZlcjFpCit2ZXJtaTRuCit2ZXIzbTQKKzN2ZXIyc2UKK3ZlNHIxczIKK3ZlcjN0aAordjRlMnMKKzR2ZXMuCit2ZXM0dGUKK3ZlNHRlCit2ZXQzZXIKK3ZlNHR5Cit2aTVhbDFpCit2MmkxYQordmkyYWwKKzV2aTJhMm4KKzV2aTJkZS4KK3YyaWQKKzV2aTJkMWVkCis0djNpMWRlbgorNXZpZGU0czIKKzV2aTJkaQordjNpZgordmk1Z24KK3YyaWcKK3Y0aWs0CisydmlsCis1djJpbDFpdAordmlsMWkKK3YzaTNsMml6Cit2MWluCis0dmk0bmEKK3YyaW5jCit2NGluNWQKKzR2aW5nCit2aTFvM2wKK3YyaW8KK3YzaW80cgordmkxb3UyCit2Mmk0cAordmk1cm8KK3Y0aXIKK3ZpczNpdAordmkzc28KK3ZpM3N1Cis0dmkxdGkKK3ZpdDNyCis0dmkxdHkKKzN2Mml2Cis1dm8uCit2b2k0CiszdjJvawordm80bGEKK3Y1b2xlCis1dm80bDJ0Ciszdm9sMnYKK3ZvbTVpCit2bzJyNWFiCit2bzFyYQordm9yaTQKK3ZvNHJ5Cit2bzR0YQorNHZvMXRlZQorNHZ2NAordjR5Cit3NWFiMmwyCisyd2FjCit3YTVnZXIKK3dhMmc1bword2FpdDUKK3dhaTIKK3c1YWwuCit3YW00Cit3YXI0dAordzJhMnIKK3dhczR0Cit3YTF0ZQord2E1dmVyCit3MWIKK3dlYTVyMmllNAord2UyYTJyCit3ZWFyMWkKK3dlNGF0aDMKK3dlYTJ0Cit3ZTRkNG40Cit3ZWV0Mword2VlNXYKK3dlbDRsCit3MWVyCit3ZXN0MwordzNldgord2hpNAord2kyCit3aWwyCit3aWwybDVpbjQKK3dpbDFsCit3aWxsMmkKK3dpbjRkZQordzRpbmQKK3dpbjRnCit3NGlyNAorM3c0aXNlCit3Mml0aDMKK3dpejUKK3c0aword2w0ZXMyCit3bDNpbgordzRubworMXdvMgord29tMQord281djRlbgordzVwCit3cmE0Cit3cmk0Cit3cmkxdGE0Cit3M3MyaAord3M0bDIKK3dzNHBlCit3NXM0dAorNHd0Cit3eTQKK3gxYQoreGFjNWUKK3g0YTJnbworeGFtMworeDRhcAoreGFzNQoreDNjMgoreDFlCit4ZTRjdTF0bworeGUxY3UKK3hlM2M0dXQKK3gyZWQKK3hlcjRpCit4MmU1cm8KK3gxaAoreGhpMgoreGg0aWw1Cit4aHU0Cit4M2kKK3gyaTVhCit4aTVjCit4aTVkaQoreDJpZAoreDRpbWUKK3hpNW0yaXoKK3hpbTFpCit4M28KK3g0b2IKK3gzcAoreHA0YW40ZAoreDFwYQoreHBhMm4KK3hwZWMxdG81Cit4cGUyYworeHBlMmMxdAoreDJwMmUzZAoreDF0MgoreDN0aQoreDF1Cit4dTNhCit4eDQKK3k1YWMKKzN5MmEycjQKK3k1YXQKK3kxYgoreTFjCit5MmNlCit5YzVlcgoreTNjaAoreWNoNGUyCit5Y29tNAoreTFjbworeWNvdDQKK3kxZAoreTVlZQoreTFlcgoreTRlcjFmCit5ZXM0Cit5ZTR0Cit5NWdpCis0eTNoCit5MWkKK3kzbGEKK3lsbGE1YjJsMgoreWwxbAoreTNsbworeTVsdQoreW1ib2w1Cit5NG0xYgoreW1lNAoreW0xcGEzCit5NG0xcAoreW4zYzRocjQKK3luMmNoCit5bjVkCit5bjVnCit5bjVpYworNXlueAoreTFvNAoreW81ZAoreTRvNWcKK3lvbTQKK3lvNW5ldAoreW8ybgoreTRvMm4zczIKK3k0b3MKK3k0cDJlZAoreXBlcjUKK3lwM2kKK3kzcG8KK3k0cG80YworeXAydGEKK3kycDF0Cit5NXB1Cit5cmE1bQoreXI1aTNhCit5M3JvCit5cjRyNAoreXM0YworeTNzMmUKK3lzM2kxY2EKK3kxczNpbworM3kxc2lzCit5NHNvCit5MnNzNAoreXMxdAoreXMzdGEKK3lzdTJyNAoreTFzdQoreTN0aGluCit5dDNpYworeTF3Cit6YTEKK3o1YTJiCit6MmEycjIKKzR6YgorMnplCit6ZTRuCit6ZTRwCit6MWVyCit6MmUzcm8KK3pldDQKKzJ6MWkKK3o0aWwKK3o0aXMKKzV6bAorNHptCisxem8KK3pvNG0KK3pvNW9sCit6b28yCit6dGU0Cis0ejF6MgorejR6eQorLmFzOXM4bzljOGk4YTh0ZS4KKy5hczFzbworLmFzc28xY2kKKy5hc3NvM2MyaTFhCisuYXM5czhvOWM4aThhOHQ4ZXMuCisuZGU4YzlsOGk5bjhhOXQ4aThvbi4KKy5kZTFjNGw0CisuZGVjbDRpMW5hCisuZGVjbGluMmF0CisuZGVjbGluYTF0MmlvCisuZGVjbGluYXRpbzJuCisub2I4bDhpOGc5YTl0OG84cnkuCisub2IybDIKKy5vYmwyaWcKKy5vYmxpMWdhCisub2JsaWdhMXRvCisub2JsaWdhdG8xcnkKKy5waDhpOGw5YThuOXQ4aDhyOG84cDhpYy4KKy5waDRpbDIKKy5waGkxbGEKKy5waGlsYTJuCisucGhpbGFuMXQKKy5waGlsYW50NGhyNAorLnBoaWxhbnRocm9wM2ljCisucHI4ZThzOGU4bnQuCisucDNyZTFzMmUKKy5wcmVzZW4xdAorLnByOGU4czhlOG44dHMuCisucHJlc2VuNHQ0czIKKy5wcjhvOGo4ZThjdC4KKy5wcm81agorLnBybzFqZQorLnByb2plMmMxdAorLnByOG84ajhlOGM4dHMuCisucHJvamVjNHQxczIKKy5yZThjOWk5cDhyOG84YzlpOXQ4eS4KKy5yZTFjMmkKKy5yZWMyaXAKKy5yZWNpcHIyCisucmVjaXByMm9jCisucmUxY2lwcm8xY2kKKy5yZWNpcHJvMmMxaXQKKy5yZWNpcHJvY2kxdHkKKy5yZTljOG84ZzluOGk5ejhhOG44Y2UuCisucmUxY28KKy5yZTJjb2cKKy5yZWMzb2duaXoKKy5yZWNvZzFuaQorLnJlY29nbml6YTEKKy5yZWNvZ25pemEybgorLnJlOGY5bzhyOW04YTl0OGk4b24uCisucmUxZgorLnJlMWZvCisucmVmbzJyCisucmVmb3IxbQorLnJlZm9yMW1hCisucmVmb3JtYTF0MmlvCisucmVmb3JtYXRpbzJuCisucmU4dDlyOGk5Yjh1OXQ4aThvbi4KKy5yZTN0cmkKKy5yZXRyNGliCisucmV0cmkzYnUxdDJpbworLnJldHJpYjR1MXQyaQorLnJldHJpYnV0aW8ybgorLnRhOWI4bGUuCisuMnRhYgorLnRhYjJsMgorLmFjOGE4ZDllOW04eS4KKy5hMWNhCisuYWNhMmQKKy5hY2FkNGVtCisuYWNhZGUzbXkKKy5hYzhhOGQ5ZTltOGk4ZThzLgorLmFjYWRlbTJpNGU0CisuYWM5Yzh1OXM4YTl0OGk4djhlLgorLmFjM2MKKy5hYzFjMnVzCisuYWNjdXNhMgorLmFjY3VzYTF0Mml2CisuYWM4cjhvOW44eThtLgorLmFjcm8ybgorLmFjcm9ueW00CisuYWM4cjh5OGw5YThtOGk4ZDhlLgorLmFjcnkzbGEKKy5hY3J5bGFtMmlkCisuYWM4cjh5OGw5YThtOGk4ZDhlOHMuCisuYWNyeWxhbWlkZTRzMgorLmFjOHI4eThsOWE4bDhkOGU5aDh5OGQ4ZS4KKy5hY3J5bGEybGQKKy5hY3J5bGFsMmRlCisuYWNyeWxhbGRlMWg0CisuYWNyeWxhbGRlaHkxZAorLmFkOGQ5YTliOGw4ZS4KKy5hZDFkMmEKKy5hZDJkM2E0YgorLmFkZGFiMmwyCisuYWQ4ZDlpOWI4bDhlLgorLmFkZGkxYjJsMgorLmFkOHI4ZThuOWE5bDhpOG44ZS4KKy5hMWRyCisuYWRyZTQKKy5hNWRyZW4KKy5hZHJlMW5hCisuYWRyZW5hNGwxaQorLmFkcmVuYTFsNGluZQorLmFlOHI4bzlzOHA4YThjOGUuCisuYWU0cgorLmEyZXJvCisuYWVybzJzNHBhCisuYWVyb3NwYTRjZQorLmFmOXQ4ZThyOXQ4aDhvOHU4ZzhoOHQuCisuYWZ0ZXJ0aG91MgorLmFmOXQ4ZThyOXQ4aDhvOHU4ZzhoOHQ4cy4KKy5hZnRlcnRob3VnaDR0MXMyCisuYWc4cjhvOG45bzltOGk4czh0LgorLmExZ3IKKy5hZzRybworLmFncm8ybgorLmFncm9ub20yaXMKKy5hZzhyOG84bjlvOW04aThzOHQ4cy4KKy5hZ3Jvbm9taXM0dDFzMgorLmFsOWc4ZTliOHI4YTlpOWM4YThsOWw4eS4KKy5hNGwxZzQKKy5hbGcyZTFiCisuYWxnZTNicgorLmFsZ2VicjJhaTIKKy5hbGdlYnJhaTFjYQorLmFsZ2VicmFpY2FsMWwKKy5hbGdlYnJhaWNhbDFseQorLmFtOXA4aDhlOHQ5YTltOGk4bjhlLgorLmE0bTFwCisuYW1waGU0dAorLmFtcGhlMXRhCisuYW1waGV0YW0xaW4KKy5hbXBoZXRhbTJpbmUKKy5hbTlwOGg4ZTh0OWE5bThpOG44ZThzLgorLmFtcGhldGFtaTFuZXMKKy5hbjlhOWw4eThzOGUuCisuM2FuYTFseQorLmExbmEKKy5hbjRhMmx5czQKKy5hbmFsNXkzczJlCisuYW45YTlsOHk4czhlOGQuCisuYW5hbHk0czRlZAorLmFuOGE4bDh5OXM4ZThzLgorLmFuYWx5czFlNHMKKy5hbjlpOHM4bzl0OHI4bzhwOWk4Yy4KKy5hbmkyc28KKy5hbmlzb3Ryb3AzaWMKKy5hbjlpOHM4bzl0OHI4bzhwOWk5YzhhOGw5bDh5LgorLmFuaXNvdHJvcGkxY2EKKy5hbmlzb3Ryb3BpY2FsMWwKKy5hbmlzb3Ryb3BpY2FsMWx5CisuYW45aThzOG84dDlyOG85cDhpOHM4bS4KKy5hbmlzb3Ryb3BpMnMxbQorLmFuOWk4czhvOHQ5cjhvOHA4eS4KKy5hbmlzb3Ryb3B5NQorLmFuOG84bTlhOGw4eS4KKy5hbm80CisuYW5vbWE1bAorLmFubzFtYQorLmFub21hMWx5CisuYW44bzhtOWE4bDhpOGU4cy4KKy5hbm9tYWwxaQorLmFub21hbDJpNGU0CisuYW44dDhpOWQ4ZThyOGk4djlhOXQ4aTh2OGUuCisuYW50MmlkCisuYW50aWRlcjFpCisuYW50aWRlcjJpNHYKKy5hbnRpZGU0cmkxdmEKKy5hbnRpZGVyaTN2YXQKKy5hbnRpZGVyMml2YTF0Mml2CisuYW44dDhpOWQ4ZThyOGk4djlhOXQ4aTh2OGU4cy4KKy5hbnRpZGVyaXZhdGl2NGUycworLmFuOHQ4aTloOG84bDhvOW04bzhyOXA4aDhpOGMuCisuYW50aTNoCisuYW50aWhvbG8xbW8KKy5hbnRpaG9sb21vMnIKKy5hbnRpaG9sb21vcjFwCisuYW50aWhvbG9tb3JwNGg0CisuYW50aWhvbG9tb3JwaDFpYworLmFuOXQ4aThuOW85bTh5LgorLmFuMnQxaW4KKy5hbnQyaTFubworLmFudGlubzNteQorLmFuOXQ4aThuOW85bThpOGU4cy4KKy5hbnRpbm9tMmllNAorLmFuOXQ4aTluOHU5YzhsOGU4YThyLgorLmFudGluMXUKKy5hbnRpbnVjbGUzCisuYW50aW51MWM0bDQKKy5hbnRpbnVjbGUyYQorLmFudGludWNsZTJhMnIKKy5hbjl0OGk5bjh1OWM4bDhlOW84bi4KKy5hbnRpbnVjbGVvMm4KKy5hbjl0OGk5cjhlOHY5bzlsOHU5dDhpOG84bjlhOHI4eS4KKy5hbnQ0aXIKKy5hbnRpcmV2MgorLmFudGlyZXY1b2x1CisuYW50aXJldm8xbHV0CisuYW50aXJldm9sNHUxdDJpCisuYW50aXJldm9sdXRpbzFuNWEKKy5hbnRpcmV2b2x1MXQyaW8KKy5hbnRpcmV2b2x1dGlvMm4KKy5hbnRpcmV2b2x1dGlvbjJhMnIKKy5hcDhvOHQ4aDllOW85czhlOHMuCisuYXA0b3QKKy5hcDRvdGgKKy5hcG90aDJlCisuYXBvdGhlb3M0CisuYXBvdGhlb3MxZTRzCisuYXA4bzh0OGg5ZTlvOXM4aThzLgorLmFwb3RoZW8xc2lzCisuYXA5cDhlOG45ZDhpOHguCisuYTRwMXAKKy5hcDJwZQorLmFwM3BlbgorLmFyOWM4aDhpOW04ZTlkOGU4YThuLgorLmFyMWMKKy5hcjJjaAorLmFyY2hpMm1lZAorLmFyY2hpbWVkZWEybgorLmFyOWM4aDhpOXA4ZThsOWE4ZzhvLgorLmFyY2gyaTRwCisuYXJjaGlwZTQKKy5hcmNoaXBlNGxhCisuYXJjaGlwZWxhMmdvCisuYXI5YzhoOGk5cDhlOGw5YTlnOG84cy4KKy5hcjljOGg4aTh2OGUuCisuYXJjaDJpMnYKKy5hcjljOGg4aTh2OGU4cy4KKy5hcmNoaXY0ZTJzCisuYXI5YzhoOGk4djlpOG44Zy4KKy5hcmNoaXYxaW4KKy5hcmNoaTR2aW5nCisuYXI5YzhoOGk4djlpOHM4dC4KKy5hcjljOGg4aTh2OWk4czh0OHMuCisuYXJjaGl2aXM0dDFzMgorLmFyOWM4aDhlOXQ4eThwOWE4bC4KKy5hcmNoZTIKKy5hcmNoZTR0CisuYXJjaGUxdHkKKy5hcmNoZXR5MXBhCisuYXJjaGV0eXA0YWwKKy5hcjljOGg4ZTl0OHk4cDlpOWM4YThsLgorLmFyY2hldHlwM2kKKy5hcmNoZXR5cGkxY2EKKy5hcjhjOXQ4YThuOWc4ZThuOHQuCisuYXIyYzF0CisuYXJjdDVhbmcKKy5hcmMxdGEKKy5hcmN0YTJuCisuYXJjdGFuMWdlbgorLmFyY3RhbmdlbjF0CisuYXI4Yzl0OGE4bjlnOGU4bjh0OHMuCisuYXJjdGFuZ2VuNHQ0czIKKy5hczlzOGk4ZzhuOWE5YjhsOGUuCisuYXMxc2kKKy5hczRzaWcxbjRhCisuYXNzMmlnCisuYXNzaWcybjFhMmIKKy5hc3NpZ25hYjJsMgorLmFzOXM4aThnOG45bzhyLgorLmFzc2lnMW5vCisuYXM5czhpOGc4bjlvOHI4cy4KKy5hc3NpZ25vNHJzMgorLmFzOXM4aThzOHQ5YThuOHQ5czhoOGk4cC4KKy5hczFzaXMKKy5hc3NpczF0YQorLmFzc2lzdGEybgorLmFzc2lzdGFuMXQKKy5hc3Npc3RhbjR0NHMyCisuYXNzaXN0YW50czJoNAorLmFzc2lzdGFudDNzaDJpNHAKKy5hczlzOGk4czh0OWE4bjh0OXM4aDhpOHA4cy4KKy5hc3Npc3RhbnRzaGkycDFzMgorLmFzOHk4bThwOXQ4bzltOGE4dDhpOGMuCisuYXM0eQorLmFzeTRtMXAKKy5hc3ltMnAxdAorLmFzeW1wMXRvCisuYXN5bXB0bzJtYQorLmFzeW1wdG9tYXQxaWMKKy5hczl5OG04cDl0OG84dDlpOGMuCisuYXM4eThuOWM4aDhyOG85bjhvOHU4cy4KKy5hc3luM2M0aHI0CisuYXN5bjJjaAorLmFzeW5jaHJvMm4KKy5hc3luY2hybzFub3UyCisuYXN5bmNocm9ubzJ1cworLmF0OGg5ZThyOW85czhjOGw4ZTlyOG85czhpOHMuCisuNGF0aAorLmF0aDJlCisuYXRoMmVybworLmF0aGVyb3MyYworLmF0aGVyb3NjbGU1CisuYXRoZXJvczFjNGw0CisuYXRoMmVyb3NjbDRlcm8KKy5hdGhlcm9zY2xlcm8xc2lzCisuYXQ5bThvOHM5cDhoOGU4cjhlLgorLmE0dDFtCisuYXQxbW8KKy5hdG1vczIKKy5hdG1vM3NwCisuYXRtb3MycGhlCisuYXRtbzNzcGg0ZXIKKy5hdDltOG84czlwOGg4ZThyOGU4cy4KKy5hdDl0OHI4aThiOXU4dDhlOGQuCisuYTR0M3QyCisuYXR0cjRpYgorLmF0dHJpYnUydDFlZAorLmF0OXQ4cjhpOGI5dTh0OWE4YjhsOGUuCisuYXR0cmk0YnUxdGEKKy5hdHRyaWJ1MnRhNGIKKy5hdHRyaWJ1dGFiMmwyCisuYXU5dDhvOW04YTl0OGk4bzhuLgorLmF1MXRvCisuYXV0bzJtYQorLmF1dG9tYTF0MmlvCisuYXV0b21hdGlvMm4KKy5hdTl0OG84bTlhOXQ4bzhuLgorLmF1dG9tYTF0bworLmF1dG9tYXRvMm4KKy5hdTl0OG84bTlhOXQ4YS4KKy5hdXRvbWEydGEKKy5hdTl0OG85bjh1OG05YjhlOHI5aThuOGcuCisuYXU1dG8ybgorLmF1dG9uNXVtCisuYXV0b251NG0xYgorLmF1dG9udW1iZXIxaQorLmF1dG9udW1iZXJpbjRnCisuYXU5dDhvOG45bzltOG84dThzLgorLmF1NHRvbm8KKy5hdXRvbm80bW8KKy5hdXRvbm8zbW8ydXMKKy5hdXRvbm9tb3UyCisuYXU4dDhvOXI4bzh1OG44ZDlpOG44Zy4KKy5hdXRvcm91MgorLmF1dG9yb3VuMmQKKy5hdXRvcm91bmQxaW4KKy5hdjlvOGk4cjlkOHU5cDhvOGk4cy4KKy5hdm9pNAorLmF2bzRpcgorLmF2b2lyMWR1CisuYXZvaXI0ZHVwCisuYXZvaXJkdXBvaTIKKy5iYThuOGQ5bDhlOGE4ZDhlOHIuCisuYjRhbmQKKy5iYW4xZGwKKy5iYW5kbGUyYQorLmJhbmRsZWEyZDEKKy5iYThuOGQ5bDhlOGE4ZDhlOHI4cy4KKy5iYW5kbGVhZGU0cjVzMgorLmJhOG44azlyOHU4cDh0LgorLmJhNG5rMgorLmJhbmtydTJwMXQKKy5iYThuOGs5cjh1OHA4dDljOHkuCisuYmFua3J1cDR0YworLmJhbmtydXB0MWN5CisuYmE4bjhrOXI4dThwOHQ5YzhpOGU4cy4KKy5iYW5rcnVwdDFjaQorLmJhbmtydXB0YzJpZTQKKy5iYThyOW84bjhpOGU4cy4KKy5iMmEycgorLmJhNXJvbmkKKy5iYXJvMm4KKy5iYXJvbjJpZTQKKy5iYThzOGU5bDhpOG44ZTlzOGs4aThwLgorLmJhc2VsMmkKKy5iYXNlMWw0aW5lCisuYmFzZWxpMW5lcworLmJhc2VsaW5lc2syCisuYmFzZWxpbmVzazFpCisuYmFzZWxpbmVzazJpNHAKKy5iYTl0OGg4eThtOWU5dDhyOHkuCisuMWJhdAorLmI0YXRoCisuYmF0aHltZTQKKy5iYXRoeW00ZXRyCisuYmF0aHltZTN0cnkKKy5iYTh0OGg4eTlzOGM4YThwOGg4ZS4KKy5iYXRoeTJzCisuYmF0aHlzNGMKKy5iYXRoeXNjYTRwCisuYmF0aHlzMWNhCisuYmU4YThuOWk4ZThzLgorLmJlYTJuCisuYmVhM25pZXMKKy5iZWFuMmllNAorLmJlOWg4YTh2OWk4bzh1OHIuCisuYmUxaDQKKy5iZWhhdjFpCisuYmVoYXZpMW91MgorLmJlaGF2MmlvCisuYmVoYXZpNG91cgorLmJlOWg4YTh2OWk4bzh1OHI4cy4KKy5iZWhhdmlvdTRyczIKKy5iZTh2OGk4ZThzLgorLmJlMXZpCisuYmV2MmllNAorLmJpOGI5bDhpOW84ZzlyOGE5cDhoOHk5czh0OHk4bDhlLgorLmJpMmIKKy5iaTFiMmwyCisuYmliM2xpCisuYmlibGk1b2cKKy5iaWJsMmlvCisuYmlibGlvMmdyCisuYmlibGlvNGczcmExcGh5CisuYmlibGlvZ3JhcGh5MnMKKy5iaWJsaW9ncmFwaHlzMXQKKy5iaWJsaW9ncmFwaHlzMnR5CisuYmlibGlvZ3JhcGh5czJ0eWwKKy5iaTlkOGk4ZjlmOGU4cjllOG45dDhpOGE4bC4KKy5iMmk0ZAorLmJpMmRpCisuYmlkMWlmCisuYmlkaTRmMWYKKy5iaWRpZmZlcjEKKy5iaWRpZmZlcjNlbjF0CisuYmlkaWZmZXJlbnQyaQorLmJpZGlmZmVyZW4xdDJpMWEKKy5iaWRpZmZlcmVudGkyYWwKKy5iaThnOWc4ZThzOHQuCisuYjJpZworLmJpNGcxZzIKKy5iaWcyZ2UKKy5iaThsOGw5YThiOGw4ZS4KKy4xYmlsCisuYmlsbDVhYgorLmJpbDFsCisuYmlsbGFiMmwyCisuYmk4bzltOGE4dDhoOWU5bThhOHQ5aThjOHMuCisuYjJpbworLmJpbzRtCisuYmlvMW1hCisuYmlvbTRhdGgzCisuYmlvbWF0aDVlbQorLmJpb21hdGgyZQorLmJpb21hdGhlMW1hCisuYmlvbWF0aGVtYXQxaWMKKy5iaW9tYXRoZW1hdGk0YzNzMgorLmJpOG85bThlOGQ5aTljOGE4bC4KKy5iaW8ybWUKKy5iaW8ybWVkCisuYmlvbTRlZGkKKy5iaW9tZWQzaTFjYQorLmJpOG85bThlOGQ5aTljOGk4bjhlLgorLmJpb21lZDJpMWNpCisuYmlvbWVkaTJjaW4KKy5iaW9tZWRpYzJpbmUKKy5iaThvOXI4aDh5OHQ4aDhtOHMuCisuYmlvcmg0CisuYmlvcmh5dDRoMW0KKy5iaW9yaHl0aDRtMXMyCisuYmk4dDltOGE4cC4KKy5iaTJ0CisuYmk0dDFtCisuYml0MW1hCisuYml0NG1hcAorLmJpOHQ5bThhOHA4cy4KKy5iaXRtYTJwMXMyCisuYmw4YThuOGQ5ZThyLgorLmIybDIKKy5iM2w0YW5kCisuYmxhMm4KKy5ibGFuMWRlCisuYmw4YThuOGQ5ZThzOHQuCisuYmxhbmRlNHMyCisuYmw4aThuOGQ5ZThyLgorLmJsNGluZAorLmJsaW4xZGUKKy5ibDhvOG44ZDhlOHMuCisuYjRsbworLmJsbzJuCisuYmwyb25kCisuYmxvbjFkZQorLmJsb25kZXMyCisuYmw4dThlOXA4cjhpOG44dC4KKy5ibHVlcHIyCisuYmx1ZXByaW40dDMKKy5ibDh1OGU5cDhyOGk4bjh0OHMuCisuYmx1ZXByaW40dDRzMgorLmJvOWw4bzhtOWU5dDhlOHIuCisuYm9sbzJtZQorLmJvbG80bWV0CisuYm9sb21lMXRlCisuYm84bzhrOXM4ZThsOGw5ZThyLgorLjNib28yCisuYm8ybzRrCisuYm9vNGsxczIKKy5ib29rc2VsMWwKKy5ib29rc2VsMmxlCisuYm84bzhrOXM4ZThsOGw5ZThyOHMuCisuYm9va3NlbGxlNHIxczIKKy5ibzhvOGw5ZThhOG4uCisuYm9vbGUyYQorLmJvb2xlYTJuCisuYm84bzhsOWU4YThuOHMuCisuYm9vbGVhMm4xczIKKy5ibzhyOW44bzlsOG84ZzlpOWM4YThsLgorLmJvcm5vNAorLmJvcm5vM2xvZzFpYworLmJvcm5vbG9naTFjYQorLmJvOHQ5dTlsOGk4czhtLgorLmJvMXR1CisuYm90dWwyaQorLmJvdHVsaTJzMW0KKy5icjh1OHM4cTh1OGU4ci4KKy5icjJ1cworLmJydXNxdTIKKy5icnVzM3F1ZXIKKy5idThmOWY4ZThyLgorLmJ1ZjRmZXIxCisuYnU0ZjFmCisuYnU4ZjlmOGU4cjhzLgorLmJ1ZmZlNHIxczIKKy5idThzOGk4ZThyLgorLmJ1czVpZTQKKy5iMnVzCisuYnU4czhpOGU4czh0LgorLmJ1c2kxZXN0CisuYnU4czhzOGk4bjhnLgorLmJ1MnNzCisuYnVzMXNpCisuYnVzMnMxaW4KKy5idXNzM2luZworLmJ1OHQ4dDhlOGQuCisuYnV0MnQxZWQKKy5idTh6OHo5dzhvOHI4ZC4KKy5idTR6MXoyCisuYnV6ejF3bzIKKy5idTh6OHo5dzhvOHI4ZDhzLgorLmJ1enp3b3IyZDFzMgorLmNhOWM4bzhwOGg5bzluOHkuCisuY2ExY28KKy5jYWMyb3BoCisuY2Fjb3BobzVueQorLmNhY29waG8ybgorLmNhOWM4bzhwOGg5bzluOGk4ZThzLgorLmNhY281cGhvbmkKKy5jYWNvcGhvbjJpZTQKKy5jYThsOGw5ZThyLgorLmNhbDFsCisuY2FsMmxlCisuY2E4bDhsOWU4cjhzLgorLmNhbGxlNHIxczIKKy5jYThtOWU4cjhhOW04ZThuLgorLmNhbTVlcjFhCisuY2FtZXJhMW1lbgorLmNhOHI4dDl3OGg4ZThlOGwuCisuY2FydHc0CisuY2E4cjh0OXc4aDhlOGU4bDhzLgorLmNhcnR3aGVlMmwxczIKKy5jYTl0OGE4cjhyOGg4cy4KKy5jYTJ0YQorLmNhdDJhMnIKKy5jYXRhcjFyNAorLmNhdGFycmg0CisuY2F0YXJyNGgxczIKKy5jYTh0OWE5czh0OHI4bzhwOGg5aThjLgorLmNhdGFzMXQ0cgorLmNhdGFzdHIyb3BoCisuY2F0YXN0cm9waDFpYworLmNhOHQ5YTlzOHQ4cjhvOHA4aDlpOWM4YThsOGw4eS4KKy5jYXRhc3Ryb3BoaTFjYQorLmNhdGFzdHJvcGhpY2FsMWwKKy5jYXRhc3Ryb3BoaWNhbDFseQorLmNhOHQ5ZTluOG84aThkLgorLmNhdDRlbm8KKy5jYXRlbm9pMgorLmNhdGVubzJpZAorLmNhOHQ5ZTluOG84aThkOHMuCisuY2F0ZW5vaTJkMXMyCisuY2E4dTlsOGk5ZjhsOG84dzllOHIuCisuY2F1NGwyCisuY2F1bDJpCisuY2F1bGk0ZjRsMgorLmNhdWxpZmxvdzFlcgorLmNoOGE4cDlhOHI5cjhhOGwuCisuY2hhcDJhMnI0CisuY2hhMXBhCisuY2hhcGFyMXI0CisuY2g4YThyOXQ4cjhlOHU4czhlLgorLmNoMmEycgorLmNoYXJ0cjRldTIKKy5jaGFydHJlMnVzNAorLmNoOGU4bThvOXQ4aDhlOHI5YThwOHkuCisuY2hlMgorLmNoZTFtbworLmNoZW00b3RoMworLmNoZW1vdGgyZQorLmNoZW1vdGg0ZXIxYQorLmNoZW1vdGhlcmEzcAorLmNoOGU4bThvOXQ4aDhlOHI5YTlwOGk4ZThzLgorLmNoZW1vdGhlcmFwMmllNAorLmNoOGw4bzhyOG85bThlOHQ4aDlhOG44ZS4KKy5jNGgxbDQKKy5jaDJsbworLmNobG9ybzJtZQorLmNobG9ybzRtZXQKKy5jaGxvcm9tZXRoYTJuNAorLmNoOGw4bzhyOG85bThlOHQ4aDlhOG44ZThzLgorLmNobG9yb21ldGhhMW5lcworLmNoOG85bDhlOHM5dDhlOHI4aThjLgorLjNjaG8yCisuYzNob2w0ZQorLmNob2xlczIKKy5jaG9sZXMxdGVyMWkKKy5jaThnOWE5cjhlOHQ4dDhlLgorLmMyaWcKKy5jaTFnYQorLmNpZzJhMnIKKy5jaWdhcmU0dDN0MgorLmNpOGc5YTlyOGU4dDh0OGU4cy4KKy5jaWdhcmV0NHRlcworLmNpOG44cTh1OGU5ZjhvOGk4bC4KKy4yY2luCisuY2luMXEKKy5jaW5xdTIKKy5jaW5xdWUxZgorLmNpbnF1ZTFmbworLmNpbnF1ZWZvaTIKKy5jbzlhOHM4czhvOWM4aThhOXQ4aTh2OGUuCisuYzRvYQorLmNvYTJzcworLmNvYXMxc28KKy5jb2Fzc28xY2kKKy5jb2Fzc28zYzJpMWEKKy5jb2Fzc29jaTRhMXQyaXYKKy5jbzlnOG44YThjLgorLjJjb2cKKy5jb2cxbjRhCisuY285ZzhuOGE4YzhzLgorLmNvZ25hNGMzczIKKy5jbzlrOGU4cjluOGU4bC4KKy5jMm9rCisuY29rMWVyCisuY29rZXIzbmVsCisuY285azhlOHI5bjhlOGw4cy4KKy5jb2tlcm5lMmwxczIKKy5jbzhsOWw4aThuOWU4YTl0OGk4bzhuLgorLmNvbDFsCisuY29sbDJpCisuY29sMmxpbjQKKy5jb2wxbDRpbmUKKy5jb2xsaW4zZWEKKy5jb2xsaW5lYTJ0CisuY29sbGluZWExdDJpbworLmNvbGxpbmVhdGlvMm4KKy5jbzhsOXU4bThuOHMuCisuY29sdTRtMW4KKy5jb2x1bTJuMXMyCisuY284bTlwOGE4cjlhOG44ZC4KKy5jbzRtMXAKKy5jb21wYXJhNQorLmNvbTFwYQorLmNvbXAyYTJyCisuY29tcGFyYTJuCisuY29tcGFyNGFuZAorLmNvOG05cDhhOHI5YThuOGQ4cy4KKy5jb21wYXJhbjJkMXMyCisuY284bTlwOGU4bjlkOGk4dThtLgorLmNvbXBlbmRpMXUKKy5jbzhtOXA4bzluOGU4bjh0OXc4aThzOGUuCisuY29tcG8ybgorLmNvbXBvM25lbgorLmNvbXBvbmVuMXQKKy5jb21wb25lbnR3NAorLmNvbXBvbmVudHdpczQKKy5jb21wb25lbnR3aTIKKy5jb21wb25lbnQzdzRpc2UKKy5jbzhtOHA5dDhyOG84bDlsOGU4ci4KKy5jb21wNHRyCisuY29tMnAxdAorLmNvbXB0cm9sMWwKKy5jb21wdHJvbDJsZQorLmNvOG04cDl0OHI4bzhsOWw4ZThyOHMuCisuY29tcHRyb2xsZTRyMXMyCisuY284bjlmOG84cjhtOWE4YjhsOGUuCisuY28ybgorLmNvbjNmCisuY29uMWZvCisuY29uZm8ycgorLmNvbmZvcjFtCisuY29uZm9yMW1hCisuY29uZm9yMm1hYgorLmNvbmZvcm1hYjJsMgorLmNvOG45ZjhvOHI4bTlpOHM4dC4KKy5jb25mb3IybWkKKy5jb25mb3JtMmlzCisuY284bjlmOG84cjhtOWk4czh0OHMuCisuY29uZm9ybWlzNHQxczIKKy5jbzhuOWY4bzhyOG05aTh0OHkuCisuY29uZm9yM21pdAorLmNvbmZvcm1pMXR5CisuY284bjlnOHI4ZThzOHMuCisuY29uM2cKKy5jb24xZ3IKKy5jb25ncjJlMnNzCisuY284bjlnOHI4ZThzOHM4ZThzLgorLmNvbmdyZXNzMWU0cworLmNvOG45dDhyOGk4Yjl1OHQ4ZS4KKy5jb241dAorLmNvbnRyNGliCisuY284bjl0OHI4aThiOXU4dDhlOHMuCisuY284bjl0OHI4aThiOXU4dDhlOGQuCisuY29udHJpYnUydDFlZAorLmNvOXI4ZTlsOGE5dDhpOG84bi4KKy5jb3JlMWxhCisuY29yZWxhMXQyaW8KKy5jb3JlbGF0aW8ybgorLmNvOXI4ZTlsOGE5dDhpOG84bjhzLgorLmNvcmVsYXRpbzJuM3MyCisuY285cjhlOWw4aTlnOGk4bzhuOWk4czh0LgorLmNvcmUxbDJpCisuY29yZWwyaWcKKy5jb3JlbDRpZ2kKKy5jb3JlbGk1ZzJpbworLmNvcmVsaWdpb24zaQorLmNvcmVsaWdpbzJuCisuY29yZWxpZ2lvbjFpcworLmNvOXI4ZTlsOGk5ZzhpOG84bjlpOHM4dDhzLgorLmNvcmVsaWdpb25pczR0MXMyCisuY285cjhlOW84cDlzOGk4cy4KKy5jb3JlMW8KKy5jb3JlbzJwMXMyCisuY29yZW9wMXNpcworLmNvOXI4ZTlzOHA4bzhuOWQ4ZThuOHQuCisuY29yZTFzcAorLmNvcmVzNHBvMm4KKy5jb3Jlc3Ayb25kCisuY29yZXNwb24xZGUKKy5jb3Jlc3BvbjFkZW4KKy5jb3Jlc3BvbmRlbjF0CisuY285cjhlOXM4cDhvOG45ZDhlOG44dDhzLgorLmNvcmVzcG9uZGVuNHQ0czIKKy5jbzlzOGU5YzhhOG44dC4KKy5jb3M0ZQorLmNvc2UxY2EKKy5jb3NlY2EybgorLmNvc2VjYW4xdAorLmNvOXQ4YThuOWc4ZThuOHQuCisuY280dGEybgorLmNvMXRhCisuY290MmFuZworLmNvdGFuMWdlbgorLmNvdGFuZ2VuMXQKKy5jbzh1OHI5czhlOHMuCisuY291MgorLmNvdTRyczIKKy5jb3VyMnNlCisuY291cnMzZTRzCisuY285dzhvOHI4azllOHIuCisuY280d28yCisuY293b3JrMWVyCisuY285dzhvOHI4azllOHI4cy4KKy5jb3dvcmtlNHIxczIKKy5jcjhhOG44azljOGE4czhlLgorLmNyYTJuCisuY3JhNG5rMgorLmNyYW5rMWNhCisuY3I4YThuOGs5czhoOGE4Zjh0LgorLmNyYW40azFzMgorLmNyYW5rczJoCisuY3JhbmtzaGEyZgorLmNyYW5rc2hhMmZ0CisuY3I4bzhjOW85ZDhpOGw4ZS4KKy5jcjJvYworLmNybzRjb2QKKy5jcm8xY28KKy5jcjhvOGM5bzlkOGk4bDhlOHMuCisuY3JvY29kaWxlczIKKy5jcjhvOHM4czloOGE4dDhjOGguCisuY3JvMnM0cworLmNyb3NzMmgKKy5jcm9zc2hhNHRjCisuY3Jvc3NoYXQ0Y2gKKy5jcjhvOHM4czloOGE4dDhjOGg4ZThkLgorLmNyb3NzaGF0Y2hlMgorLmNyb3NzaGF0NGNoNGVkCisuY3I4bzhzOHM5bzh2OGU4ci4KKy5jcm9zMXNvCisuY3JvczRzb3YKKy5jcjh5OHA5dDhvOWc4cjhhOG0uCisuY3J5MnAxdAorLmNyeXAxdG8KKy5jcnlwdG8yZ3IKKy5jcjh5OHA5dDhvOWc4cjhhOG04cy4KKy5jcnlwdG9ncmE0bTFzMgorLmN1OGY4ZjlsOGk4bjhrLgorLmM0dWYKKy5jdTRmMWYKKy5jdWZmNGwyCisuY3VmZmxpbjQKKy5jdWZmbDRpNG5rMgorLmN1OGY4ZjlsOGk4bjhrOHMuCisuY3VmZmxpbjRrMXMyCisuY3U5bjhlOGk5ZjhvOHI4bS4KKy4zY3VuCisuY3UybmUKKy5jdW5laTIKKy5jdW5laTFmbworLmN1bmVpZm8ycgorLmN1bmVpZm9yMW0KKy5jdThzOXQ4bzhtOWk4ejlhOWI4bDhlLgorLjFjMnVzCisuY3VzMXRvCisuY3VzdG9tMml6CisuY3VzdG9taXphMQorLmN1c3RvbWl6NWEyYgorLmN1c3RvbWl6YWIybDIKKy5jdThzOXQ4bzhtOWk4ejhlLgorLmN1c3RvbWkyemUKKy5jdThzOXQ4bzhtOWk4ejhlOHMuCisuY3U4czl0OG84bTlpOHo4ZThkLgorLmRhOGM4aDhzOWg4dThuOGQuCisuMWQyYQorLmRhMmNoNAorLmRhYzRoMXMyCisuZGFjaDRzMmgKKy5kYThtOXM4ZThsOWY4bDh5LgorLmRhMm0yCisuZGE0bTFzMgorLmRhbTVzZTJsMmYKKy5kYW1zZWxmNGwyCisuZGFtc2VsZjJseTUKKy5kYThtOXM4ZThsOWY4bDhpOGU4cy4KKy5kYW1zZWxmbDJpZTQKKy5kYThjOHQ4eThsOW85ZzhyOGE4bS4KKy5kYTJjMXQKKy5kYWMxdHkKKy5kYWMydHlsCisuZGFjdHkzbG8KKy5kYWN0eWxvMWdyCisuZGE4Yzh0OHk4bDlvOWc4cjhhOHA4aC4KKy5kYTh0OGE5YjhhOHM4ZS4KKy4zZGF0CisuZGEydGEKKy5kYTJ0YWIKKy5kYTh0OGE5YjhhOHM4ZThzLgorLmRhdGFiYXMxZTRzCisuZGE4dDhhOXA4YTh0OGguCisuZGF0NWFwCisuZGF0YXA1YXQKKy5kYXRhMXBhCisuZGF0YXA0YXRoCisuZGE4dDhhOXA4YTh0OGg4cy4KKy5kYXRhcGEydDRoMXMyCisuZGE4dDhlOXM4dDhhOG04cC4KKy5kYXQzZXN0CisuZGF0ZXMxdGEKKy5kYXRlc3RhNG0xcAorLmRhOHQ4ZTlzOHQ4YThtOHA4cy4KKy5kYXRlc3RhbTJwMXMyCisuZGU5YzhsOGE4cjlhOGI4bDhlLgorLmRlNGNsMmEycgorLmRlY2xhMnJhYgorLmRlY2xhcmFiMmwyCisuZGU5ZjhpOG45aTl0OGk4djhlLgorLmRlMWYKKy5kZTFmaQorLmRlMmZpbgorLmRlZjJpbmkKKy5kZWZpbjJpdAorLmRlZmluaTF0aQorLmRlZmluaTF0Mml2CisuZGU5bDhlOGM5dDhhOWI4bDhlLgorLmQ1ZWxlYworLmRlbGUyYzF0CisuZGVsZWMydGE0YgorLmRlbGVjMXRhCisuZGVsZWN0YWIybDIKKy5kZThtOGk5czhlOG04aTlxOHU4YTl2OGU4ci4KKy5kZTRtMmlzCisuZGVtNGlzZQorLmRlbWlzZW1pM3F1YQorLmRlbWlzZW1pcXUyCisuZGVtaXNlbWlxdWE1djQKKy5kZThtOGk5czhlOG04aTlxOHU4YTl2OGU4cjhzLgorLmRlbWlzZW1pcXVhdmU0cjFzMgorLmRlOW04bzhjOXI4YTl0OGk4czhtLgorLmRlNG1vY3IKKy5kZW1vY3JhdGkyczRtCisuZGU4bThvOHMuCisuZGVtb3MyCisuZGU5cjhpOHY5YTl0OGk4djhlLgorLmRlcjJpNHYKKy5kZTRyaTF2YQorLmRlcmkzdmF0CisuZGVyMml2YTF0Mml2CisuZGU5cjhpOHY5YTl0OGk4djhlOHMuCisuZGVyaXZhdGl2NGUycworLmRpOGE5bDhlOGM5dDhpOGMuCisuMWQ0aTNhCisuZGkyYWwKKy5kaTJhbGUKKy5kaWFsZTJjMXQKKy5kaThhOWw4ZThjOXQ4aThjOHMuCisuZGlhbGVjdGk0YzNzMgorLmRpOGE5bDhlOGM5dDhpOWM4aThhOG4uCisuZGlhbGVjdDJpMWNpCisuZDJpMWFsZWN0aTNjMmkxYQorLmRpYWxlY3RpY2kyYTJuCisuZGk4YTlsOGU4Yzl0OGk5YzhpOGE4bjhzLgorLmRpYWxlY3RpY2lhMm4xczIKKy5kaTljOGg4bDhvOHI4bzltOGU4dDhoOWE4bjhlLgorLmQ0aTJjaAorLmRpYzRoMWw0CisuZGljaDJsbworLmRpY2hsb3JvMm1lCisuZGljaGxvcm80bWV0CisuZGljaGxvcm9tZXRoYTJuNAorLmRpOGY5ZjhyOGE4Yzh0LgorLmQxaWYKKy5kaWY0ZnIKKy5kaTRmMWYKKy5kaWZmcmEyYzF0CisuZGk4ZjlmOHI4YThjOHQ4cy4KKy5kaWZmcmFjNHQxczIKKy5kaThmOWY4cjhhOGM5dDhpOG84bi4KKy5kaWZmcmFjMXQyaW8KKy5kaWZmcmFjdGlvMm4KKy5kaThmOWY4cjhhOGM5dDhpOG84bjhzLgorLmRpZmZyYWN0aW8ybjNzMgorLmRpOHI4ZThyLgorLmQ0aXIyCisuZGkxcmUKKy5kaXIxZXI0CisuZGk4cjhlOW44ZThzOHMuCisuZGlyZTFuZXMKKy5kaXJlbjJlMnNzCisuZGk4czlwOGE4cjlhOG44ZC4KKy5kaXMxCisuZGlzMXAKKy5kaTJzMXBhCisuZGlzcDJhMnIKKy5kaXNwYXJhMm4KKy5kaXNwYXI0YW5kCisuZGk4czlwOGE4cjlhOG44ZDhzLgorLmRpc3BhcmFuMmQxczIKKy5kaThzOXQ4cjhhOHU4ZzhoOHQ5bDh5LgorLmQ0aXMzdAorLmRpc3Q0cgorLmRpczF0cmEKKy5kaXN0cmF1Z2gzCisuZGlzdHJhdWdoMnRsCisuZGlzdHJhdWdodDFseQorLmRpOHM5dDhyOGk4Yjl1OHQ4ZS4KKy5kaXN0cjRpYgorLmRpOHM5dDhyOGk4Yjl1OHQ4ZThzLgorLmRpOHM5dDhyOGk4Yjl1OHQ4ZThkLgorLmRpc3RyaWJ1MnQxZWQKKy5kbzh1OWI4bDhlOXM4cDhhOGM4ZS4KKy5kb3UyCisuZG91M2IybDIKKy5kb3U1YmxlMXNwCisuZG91YmxlczIKKy5kb3VibGUyczFwYQorLmRvdWJsZXNwYTRjZQorLmRvOHU5YjhsOGU5czhwOGE4YzlpOG44Zy4KKy5kb3VibGVzcDRhMmNpCisuZG91Ymxlc3BhMmMxaW4KKy5kb3VibGVzcGFjMWluZworLmRvOGw4bDlpOHM4aC4KKy5kb2wxbAorLmRvbGwyaQorLmRvbGxpczJoCisuZHI4aThmOHQ5YThnOGUuCisuMWRyCisuZHI0aTJmdAorLmRyaWYxdGEKKy5kcjhpOHY5ZThyOHMuCisuZHIyaXYKKy5kcml2ZTRyMXMyCisuZHI4bzhtOWU5ZDhhOHI4eS4KKy5kcm8ybWUKKy5kcm8ybWVkCisuZHJvbTJlMmQyYQorLmRyb21lNGRhcnkKKy5kcm9tZWQyYTJyCisuZHI4bzhtOWU5ZDhhOHI4aThlOHMuCisuZHJvbWVkYXIxaQorLmRyb21lZGFyMmllNAorLmR1OW84cDlvOWw4aThzOHQuCisuZHVvcG9sMmkKKy5kdTlvOHA5bzlsOGk4czh0OHMuCisuZHVvcG9saXM0dDFzMgorLmR1OW84cDlvOGw4eS4KKy5kdW9wbzJseQorLmR5OHM5bDhlOHg4aThhLgorLmQyeQorLmR5czFsMgorLmR5czJsZQorLmR5c2xleDNpCisuZHlzbGV4Mmk1YQorLmR5OHM5bDhlOGM5dDhpOGMuCisuZHlzbGUyYzF0CisuZWE4czh0OWU4bjhkOWU4cjhzLgorLmVhc3QzCisuZWFzM3RlbgorLmVhczN0ZW5kCisuZWFzdGVuMWRlCisuZWFzdGVuZGU0cjVzMgorLmVjOG85bjhvOG05aThjOHMuCisuZTFjbworLmVjbzJuCisuZWNvM25vbWljCisuZWNvbm9taTRjM3MyCisuZWM4bzhuOW85bThpOHM4dC4KKy5lY29ub20yaXMKKy5lYzhvOG45bzltOGk4czh0OHMuCisuZWNvbm9taXM0dDFzMgorLmVpOWc4ZThuOWM4bDhhOHM4cy4KKy5laTIKKy5lMmlnMgorLmVpMWdlbgorLmVpZ2VuMWM0bDQKKy5laWdlbmNsYTJzcworLmVpOWc4ZThuOWM4bDhhOHM4czhlOHMuCisuZWlnZW5jbGFzczFlNHMKKy5laTlnOGU4bjl2OGE4bDl1OGUuCisuZWlnZW4xdjIKKy5laWdlbjF2YQorLmVpZ2VudmFsMXUKKy5laTlnOGU4bjl2OGE4bDl1OGU4cy4KKy5lbDhlOGM4dDhyOG85bThlOGM4aDhhOG45aTljOGE4bC4KKy41ZWxlYworLmVsZTJjMXQKKy5lbGVjdHJvMm1lCisuZWxlY3Ryb21lMmNoCisuZWxlY3Ryb21lNWNoYTRuMWljCisuZWxlY3Ryb21lY2hhMm4KKy5lbGVjdHJvbWVjaGFuaTFjYQorLmVsOGU4Yzh0OHI4bzltOGU4YzhoOGE4bjhvOWE4YzhvOHU4czh0OGk4Yy4KKy5lbGVjdHJvbWVjaGFubzQKKy5lbGVjdHJvbWVjaGFuNG9hCisuZWxlY3Ryb21lY2hhbm9hMWNvCisuZWxlY3Ryb21lY2hhbm9hY291MgorLmVsZWN0cm9tZWNoYW5vYWNvMnVzCisuZWxlY3Ryb21lY2hhbm9hY291c3QyaQorLmVsZWN0cm9tZWNoYW5vYWNvdXMxdGljCisuZWw4aTh0OWk4czh0LgorLmVsMmkKKy5lbDFpdAorLmVsaTF0aQorLmVsNGl0aXMKKy5lbDhpOHQ5aThzOHQ4cy4KKy5lbGl0aXM0dDFzMgorLmVuOXQ4cjhlOXA4cjhlOW44ZTh1OHIuCisuZW4xdAorLmVudHJlcHIyCisuZW50cmVwcmVuNGV1CisuZW45dDhyOGU5cDhyOGU5bjhlOHU4cjlpOGE4bC4KKy5lbnRyZXByZW5ldXIyaTNhCisuZW50cmVwcmVuZXVyaTJhbAorLmVwOWk5bjhlOHA4aDlyOGk4bjhlLgorLmVwaTJuCisuZXAyaW5lCisuZXBpbmVwNGhyNAorLmVwMmluZXBocjJpbjRlCisuZXE4dThpOXY4YThyOGk5YThuOHQuCisuZXF1Mml2MworLmVxdWkxdmEKKy5lcXVpdjJhMnIKKy5lcXVpdmFyMWkKKy5lcXVpdmFyM2kyYTJuCisuZXF1aXZhcjJpM2EKKy5lcXVpdmFyNGlhbjR0CisuZXE4dThpOXY4YThyOGk5YThuOGM4ZS4KKy5lcXVpdmFyNGlhbmMKKy5ldDhoOWE4bjhlLgorLmV0aGEybjQKKy5ldDhoOXk4bDllOG44ZS4KKy5ldjhlOHI5czhpOWI4bDhlLgorLmV2MWVyCisuZXZlNHIxczIKKy5ldmVyMXNpCisuZXZlcjRzaTRiCisuZXZlcnNpMWIybDIKKy5ldjhlOHI4dC4KKy5ldjhlOHI4dDhzLgorLmV2ZXI0dDFzMgorLmV2OGU4cjh0OWU4ZC4KKy5ldmVyMnQxZWQKKy5ldjhlOHI4dDlpOG44Zy4KKy5ldmVyMXRpCisuZXZlcjJ0MWluCisuZXg5cTh1OGk4czlpOHQ4ZS4KKy5leHF1MgorLmV4cTJ1aTIKKy5leHF1aXMyaXRlCisuZXg5dDhyOGE5bzhyOWQ4aTluOGE4cjh5LgorLmV4MXQyCisuZXgxdHJhCisuZXh0cjRhbworLmV4dHJhb3JkMmkKKy5leHRyYW9yZDFpbjQKKy5leHRyYW9yMWRpMW5hCisuZXh0cmFvcmRpbjJhMnIKKy5mYThsOGw5aThuOGcuCisuMWZhCisuZmFsMWwKKy5mYWxsMmkKKy5mYWwybGluNAorLmZlOHI4bThpOW84bjhzLgorLmZlcjEKKy5mZXIzbTQKKy5mZXI0bTJpbworLmZlcm1pbzJuCisuZmVybWlvMm4zczIKKy5maTluOGk4dDhlOWw4eS4KKy4xZmkKKy4yZmluCisuZjJpbmkKKy5maW4yaXQKKy5maW4yaXRlCisuZmluaXRlMWx5CisuZmw4YTlnOGU4bDlsOHU4bS4KKy5mNGwyCisuZmxhZzVlbDFsCisuZmw4YTlnOGU4bDlsOGEuCisuZmxhZzRlbGxhCisuZmw4YThtOW04YTliOGw4ZThzLgorLmZsYW0xbQorLmZsYW0xbWEKKy5mbGFtMm1hYgorLmZsYW1tYWIybDIKKy5mbGFtbWFibGVzMgorLmZsOGU4ZDhnOWw4aThuOGcuCisuZmxlZGdsMgorLmZsOG84dzljOGg4YThyOHQuCisuZmxvdzJjaAorLmZsb3djaDJhMnIKKy5mbDhvOHc5YzhoOGE4cjh0OHMuCisuZmxvd2NoYXI0dDFzMgorLmZsOHU4bzhyOG85YzhhOHI5YjhvOG4uCisuZmx1M28KKy5mbHVvM3IKKy5mbHVvcjJvYworLmZsdW9ybzFjYQorLmZsdW9yb2MyYTJyCisuZmx1b3JvY2FyMWIKKy5mbHVvcm9jYXJiNG8KKy5mbHVvcm9jYXJibzJuCisuZm84cjltOGk5ZDhhOWI4bDhlLgorLmZvcjJtaQorLmZvcm1pMWQ0YQorLmZvcm0yaWQKKy5mb3JtaTJkM2E0YgorLmZvcm1pZGFiMmwyCisuZm84cjltOGk5ZDhhOWI4bDh5LgorLmZvcm1pZGFiMWx5CisuZm84cjlzOHk4dDhoOWk4YS4KKy5mbzRyczIKKy5mb3JzNHkKKy5mb3JzeXRoMmkxYQorLmZvOHI4dDhoOXI4aThnOGg4dC4KKy5mb3J0NGhyNAorLmZvcnRocjJpZworLmZyOGU4ZTlsOG84YThkOGU4ci4KKy5mcmVlbDRvYQorLmZyZWVsb2EyZDMKKy5mcjhlOGU5bDhvOGE4ZDhlOHI4cy4KKy5mcmVlbG9hZGU0cjVzMgorLmZyOGk4ZThuOGQ5bDhpOGU4ci4KKy5mcmkyCisuZnIyaWU0CisuZnJpZW5kbDJpZTQKKy5mcjhpOXY4bzhsOWk4dDh5LgorLmZyMml2CisuZnJpdm9sMmkKKy5mcml2b2wxaXQKKy5mcml2b2xpMXR5CisuZnI4aTl2OG84bDlpOXQ4aThlOHMuCisuZnJpdm9saTF0aQorLmZyaXZvbGl0MmllNAorLmZyOGk4djlvOWw4bzh1OHMuCisuZnJpdm9sb3UyCisuZnJpdm9sbzJ1cworLmdhOWw4YThjOXQ4aThjLgorLmdhbGEyYzF0CisuZ2E4bDlhOHg4eS4KKy5nYThsOWE4eDlpOGU4cy4KKy5nYWxheDNpCisuZ2FsYXgyaWU0CisuZ2E4czlvOG05ZTl0OGU4ci4KKy5nYTFzbworLmdhM3NvbQorLmdhc28ybWUKKy5nYXNvNG1ldAorLmdhc29tZTF0ZQorLmdlOW85ZDhlOHM5aThjLgorLmdlb2RlczIKKy5nZW9kZTFzaQorLmdlb2RlMnNpYworLmdlOW85ZDhlOHQ5aThjLgorLmdlb2RlMXQKKy5nZW9kZXQxaWMKKy5nZThvOW04ZTh0OXI4aThjLgorLmdlM29tCisuZ2VvMm1lCisuZ2VvNG1ldAorLmdlb200ZXRyCisuZ2VvNW1ldDNyaWMKKy5nZThvOW04ZTh0OXI4aThjOHMuCisuZ2VvbWU0dHJpNGMzczIKKy5nZTlvOXM4dDhyOG84cDhoOGk4Yy4KKy5nZW9zNAorLmdlb3N0NHIKKy5nZW9zdHIyb3BoCisuZ2Vvc3Ryb3BoMWljCisuZ2U4bzl0OGg4ZThyOW04YThsLgorLmdlNG90CisuZ2U0b3RoCisuZ2VvdGgyZQorLmdlb3RoZXIzbTQKKy5nZW90aGVyMW1hCisuZ2U5bzh0OXI4bzlwOGk4czhtLgorLmdlb3Ryb3BpMnMxbQorLmduOG85bThvOG4uCisuZzFubworLmdubzRtbworLmdubzRtbzJuCisuZ244bzltOG84bjhzLgorLmdub21vMm4zczIKKy5ncjhhOG44ZDl1OG44YzhsOGUuCisuMWdyCisuZ3JhMm4yCisuZ3I0YW5kCisuZ3JhbjFkdQorLmdyYW5kdTRuCisuZ3JhbmR1bjFjNGw0CisuZ3I4YThuOGQ5dThuOGM4bDhlOHMuCisuZ3JhbmR1bmNsZXMyCisuZ3I4aThlOHY5YThuOGM4ZS4KKy5ncjJpZTQKKy5ncmllMXZhCisuZ3JpZXZhMm4KKy5ncjhpOGU4djlhOG44YzhlOHMuCisuZ3I4aThlOHY5bzh1OHMuCisuZ3JpZXZvdTIKKy5ncmlldm8ydXMKKy5ncjhpOGU4djlvOHU4czlsOHkuCisuZ3JpZXZvdXMxbDIKKy5ncmlldm91czFseQorLmhhOGk4cjlzOHQ4eThsOGUuCisuaGFpMgorLmhhNGlyCisuaGFpNHJzMgorLmhhaXJzMnR5CisuaGFpcnMydHlsCisuaGE4aThyOXM4dDh5OGw4ZThzLgorLmhhaXJzdHlsZXMyCisuaGE4aThyOXM4dDh5OGw5aThzOHQuCisuaGE4aThyOXM4dDh5OGw5aThzOHQ4cy4KKy5oYWlyc3R5bGlzNHQxczIKKy5oYThsOGY5czhwOGE4YzhlLgorLmhhMmxmCisuaGFsMmYzcworLmhhbGYyczFwYQorLmhhbGZzcGE0Y2UKKy5oYThsOGY5czhwOGE4YzhlOHMuCisuaGE4bDhmOXc4YTh5LgorLmhhOHI5YjhpOG45ZzhlOHIuCisuaDJhMnIKKy5oYXIxYgorLmhhcmJpMgorLmhhcjJiaW4KKy5oYXJiNGluZ2UKKy5oYThyOWI4aThuOWc4ZThyOHMuCisuaGFyYmluZ2U0cjFzMgorLmhhOHI5bDhlOXE4dThpOG4uCisuaGFyNGxlNAorLmhhcjFsCisuaGFybGUxcQorLmhhcmxlcXUyCisuaGFybGVxMnVpMgorLmhhcmxlcXVpNG4KKy5oYThyOWw4ZTlxOHU4aThuOHMuCisuaGFybGVxdTJpMm4xczIKKy5oYTh0OGM4aDllOHI4aThlOHMuCisuaGE0dGMKKy5oYXQ0Y2gKKy5oYXRjaGUyCisuaGF0Y2hlcjFpCisuaGF0Y2hlcjJpZTQKKy5oZThtOGk5ZDhlOG04aTlzOGU4bThpOXE4dThhOXY4ZThyLgorLmhlbTJpZAorLmhlbWlkNGVtCisuaGVtaWRlNG0yaXMKKy5oZW1pZGVtNGlzZQorLmhlbWlkZW1pc2VtaTNxdWEKKy5oZW1pZGVtaXNlbWlxdTIKKy5oZW1pZGVtaXNlbWlxdWE1djQKKy5oZThtOGk5ZDhlOG04aTlzOGU4bThpOXE4dThhOXY4ZThyOHMuCisuaGVtaWRlbWlzZW1pcXVhdmU0cjFzMgorLmhlOW04bzlnOGw4bzliOGk4bi4KKy5oZW1vNGcKKy5oZTFtbworLmhlbW80Z2wyCisuaGVtbzNnbG8KKy5oZW1vZ2xvMWJpCisuaGVtb2dsbzJiaW4KKy5oZTltOG85cDhoOGk4bDlpOGEuCisuaGVtMm9waAorLmhlbW9waDRpbDIKKy5oZW1vcGhpbDFpCisuaGVtb3BoaWwzaTFhCisuaGU5bThvOXA4aDhpOGw5aThhOGMuCisuaGU5bThvOXA4aDhpOGw5aThhOGM4cy4KKy5oZW1vcGhpbGlhNGMzczIKKy5oZThtOG85cjhoOGU5bzhsOW84Zzh5LgorLmhlbW8ycgorLmhlbW9yaDQKKy5oZW1vcmhlM29sCisuaGVtb3JoZW9sMW8xZ3kKKy5oZTlwOGE4dDlpOGMuCisuaGVwNQorLmhlMnBhCisuaGVwYXQxaWMKKy5oZThyOW04YThwOGg5cjhvOWQ4aTh0OGUuCisuaGVyM200CisuaGVyMW1hCisuaGVyNG1hcAorLmhlcm1hcDRocjQKKy5oZXJtYXBocm9kMml0ZQorLmhlOHI5bThhOHA4aDlyOG85ZDhpOHQ5aThjLgorLmhlcm1hcGhyb2QyaTF0aQorLmhlcm1hcGhyb2Q0aTJ0aWMKKy5oZTlyOG84ZThzLgorLmhlcm80ZQorLmhlOHg4YTlkOGU4YzlpOW04YThsLgorLmhleDFhCisuaGV4YTJkCisuaGV4YWRlMWMyaQorLmhleGFkZTJjM2ltCisuaGV4YWRlY2kxbWEKKy5obzlsOG85bjhvOW04eS4KKy5ob2xvMm4KKy5ob2xvbjNvM215CisuaG85bThlOG85bThvOHI5cDhoOGk4Yy4KKy5obzJtZTMKKy5ob21lbzFtbworLmhvbWVvbW8ycgorLmhvbWVvbW9yMXAKKy5ob21lb21vcnA0aDQKKy5ob21lb21vcnBoMWljCisuaG85bThlOG85bThvOHI5cDhoOGk4czhtLgorLmhvbWVvbW9ycGhpMnMxbQorLmhvOW04bzl0OGg4ZTh0OGk4Yy4KKy5obzFtbworLmhvbTRvdGgzCisuaG9tb3RoMmUKKy5ob21vM3RoZTR0CisuaG9tb3RoZXQxaWMKKy5obzhyOHM4ZTlyOGE4ZDlpOHM4aC4KKy5ob3I0c2UKKy5obzRyczIKKy5ob3JzZXIxYQorLmhvcnNlcmEyZAorLmhvcnNlcjJhZGkKKy5ob3JzZXJhZGlzMQorLmhvcnNlcmFkaXMyaAorLmhvOHQ5YjhlOGQuCisuaG8ydDFiCisuaG90NGJlMmQKKy5obzh0OWI4ZThkOHMuCisuaG90YmUyZDFzMgorLmh5OWQ4cjhvOXQ4aDhlOHI5bThhOGwuCisuaHkxZAorLmh5MWRyCisuaHlkcm80dGgyZQorLmh5ZHI0b3RoCisuaHlkcm90aGVyM200CisuaHlkcm90aGVyMW1hCisuaHk5cDhvOXQ4aDhhOGw5YTltOHU4cy4KKy5oeTNwbworLmh5cDRvdAorLmh5cDRvdGgKKy5oeXBvdGhhM2xhCisuaHlwb3RoYWxhM20KKy5oeXBvdGhhbGExbXUKKy5oeXBvdGhhbGFtMnVzCisuaWQ4ZThhOGw4cy4KKy5pZGUzYTRsCisuaWRlYTJsMXMyCisuaWQ4ZThvOWc4cjhhOHA4aDhzLgorLmlkZW8yZworLmlkZW8xZ3IKKy5pZGVvZ3JhNHA0aDFzMgorLmlkOGk4bzlzOHk4bjljOHI4YThzOHkuCisuaTJkaQorLmkxZDNpbworLmlkaTRvcworLmlkaW9zNHkKKy5pZGlvc3luMWNyCisuaWRpb3N5bmNyMmFzCisuaWRpb3N5bmNyYXM0eQorLmlkOGk4bzlzOHk4bjljOHI4YTlzOGk4ZThzLgorLmlkaW9zeW5jcmFzMmllNAorLmlkOGk4bzlzOHk4bjljOHI4YTh0OGk4Yy4KKy5pZGlvc3luNWNyYXQxaWMKKy5pZDhpOG85czh5OG45YzhyOGE4dDlpOWM4YThsOWw4eS4KKy5pZGlvc3luY3JhdGkxY2EKKy5pZGlvc3luY3JhdGljYWwxbAorLmlkaW9zeW5jcmF0aWNhbDFseQorLmlnOW44aTh0OWU4ci4KKy4yaWcKKy5pZzFuaQorLmlnbjJpdAorLmlnbjJpdGUKKy5pZzluOGk4dDllOHI4cy4KKy5pZ25pdGU0cjFzMgorLmlnOW44aTl0OG84ci4KKy5pZ24zaXRvcgorLmlnbmkxdG8KKy5pZzhuOG84cjhlOXM4cDhhOGM4ZThzLgorLmlnMW5vCisuaWdub3JlMXNwCisuaWdub3JlMnMxcGEKKy5pZ25vcmVzcGE0Y2UKKy5pbTlwOGU4ZDlhOG44YzhlLgorLmltMnAyZWQKKy5pbXAyZTJkMmEKKy5pbXBlZGEybgorLmltOXA4ZThkOWE4bjhjOGU4cy4KKy5pbjlkOHU5YjhpOXQ4YTliOGw4ZS4KKy40aW5kCisuaW4xZHUKKy5pbmR1MWI0aQorLmluZHViaTJ0CisuaW5kdWJpMXRhCisuaW5kdWJpMnRhYgorLmluZHViaXRhYjJsMgorLmluOWY4aThuOWk4dDhlOWw4eS4KKy5pbjNmCisuaW4xZmkKKy5pbjJmaW4KKy5pbmYyaW5pCisuaW5maW4yaXQKKy5pbmZpbjJpdGUKKy5pbmZpbml0ZTFseQorLmluOWY4aThuOWk5dDhlOHM5aTltOGE4bC4KKy5pbmZpbml0NGVzCisuaW5maW5pdGUxc2kKKy5pbmZpbml0ZTJzNWltCisuaW5maW5pdGVzaTFtYQorLmluOWY4cjhhOXM4dDhyOHU4Yzl0OHU4cjhlLgorLmluZnIyYXMKKy5pbmZyYXMxdDRyCisuaW5mcmFzdHJ1MmMxdAorLmluZnJhc3RydWN0dTRyCisuaW5mcmFzdHJ1YzF0dQorLmluZnJhc3RydWMzdHVyZQorLmluOWY4cjhhOXM4dDhyOHU4Yzl0OHU4cjhlOHMuCisuaW45czh0OGE4bDhsOWU4ci4KKy5pbnMydGEybAorLmluczF0YQorLmluc3RhbDFsCisuaW5zdGFsMmxlCisuaW45czh0OGE4bDhsOWU4cjhzLgorLmluc3RhbGxlNHIxczIKKy5pbjl0OGU4cjlkOGk4czljOGk5cDhsOGk5bjhhOHI4eS4KKy5pbjF0CisuaW41dGVyM2QKKy5pbnRlcmQyaQorLmludGVyZGlzMQorLmludGVyZDJpczFjCisuaW50ZXJkaXMxY2kKKy5pbnRlcmRpc2MyaXAKKy5pbnRlcmRpc2NpMXAybDIKKy5pbnRlcmRpc2NpcGxpNG4KKy5pbnRlcmRpc2NpcGw0aTFuYQorLmludGVyZGlzY2lwbGluMmEycgorLmluOXQ4ZThyOWc4YTlsOGE4Yzl0OGk4Yy4KKy5pbnRlcmcyCisuaW50ZXIxZ2EKKy5pbnRlcmdhbGEyYzF0CisuaW45dTh0OGk4bDhlLgorLmluMXUKKy5pbjR1MXQyaQorLmluOXU4dDhpOGw5aTl0OHkuCisuaW51dGlsMWkKKy5pbnV0MmlsMWl0CisuaW51dGlsaTF0eQorLmlyOXI4ZTlkOHU4YzlpOGI4bDhlLgorLmlyMnIyZWQKKy5pcnJlMWR1CisuaXJyZWR1MmMKKy5pcnJlZHVjaTRiCisuaXJyZWR1MWNpCisuaXJyZWR1Y2kxYjJsMgorLmlyOXI4ZTlkOHU4YzlpOGI4bDh5LgorLmlycmVkdWNpYjFseQorLmlyOXI4ZTh2OW85YzhhOWI4bDhlLgorLmlycmV2MgorLmlycmU1dm9jCisuaXJyZXZvMWNhCisuaXJyZXZvY2ExYjJsMgorLmlzOG84dDlyOG84cDh5LgorLmkyc28KKy5pc290cm9weTUKKy5pczhvOXQ4cjhvOHA5aThjLgorLmlzb3Ryb3AzaWMKKy5pdDhpOG45ZThyOWE4cjh5LgorLmkxdGkKKy5pMnQxaW4KKy5pdDJpbmUKKy5pdGluNGVyNGEycgorLml0aW4xZXIKKy5pdGluZXIxYQorLml0OGk4bjllOHI5YThyOWk4ZThzLgorLml0aW5lcmFyMWkKKy5pdGluZXJhcjJpZTQKKy5qZTlyOGU5bThpOWE4ZDhzLgorLjFqZQorLmplcmVtMmkzYQorLmplcmVtaWEyZAorLmplcmVtaWEyZDFzMgorLmtlOHk5bjhvOHQ4ZS4KKy5rZTh5OW44bzh0OGU4cy4KKy5rZXlubzR0ZXMKKy5rZTh5OXM4dDhyOG84azhlLgorLmtleXM0Cisua2V5czF0Cisua2V5c3Q0cgorLmtleXN0cjJvazIKKy5rZTh5OXM4dDhyOG84azhlOHMuCisua2V5c3Ryb2tlczQKKy5raThsOG45aThuOGcuCisuazFpCisuazRpMmwxbjIKKy5raWxuMWluCisua2lsbmluNGcKKy5sYThjOWk5ZThzOHQuCisubDRhMmNpNAorLmxhM2MyaWU0CisubGFjaTFlc3QKKy5sYThtOWU4bjl0OGE5YjhsOGUuCisubGExbWVuCisubGEzbWVuMXQKKy5sYW1lbjJ0YTRiCisubGFtZW4xdGEKKy5sYW1lbnRhYjJsMgorLmxhOG44ZDlzOGM4YThwOWU4ci4KKy4zbDRhbmQKKy5sYTJuCisubGFuMmQxczIKKy5sYW5kc2NhNHAKKy5sYW5kczFjYQorLmxhbmRzY2E1cGVyCisubGE4bjhkOXM4YzhhOHA5ZThyOHMuCisubGFuZHNjYXBlNHIxczIKKy5sYThyOWM4ZTluOHkuCisubDJhMnIKKy5sYXIxYworLmxhcjJjZQorLmxhcjFjZW40CisubGE4cjljOGU5bjlpOHM4dC4KKy5sYXI0Y2VuaQorLmxlOGE4ZjloOG84cDlwOGU4ci4KKy5sZTJhCisubGVhMmYKKy5sZWE0ZmgKKy5sZWFmaG80cDFwCisubGVhZmhvcDJwZQorLmxlYWZob3AzcGVyCisubGU4YThmOWg4bzhwOXA4ZThyOHMuCisubGVhZmhvcHBlNHIxczIKKy5sZTh0OXQ4ZThyOXM4cDhhOGM5aThuOGcuCisubGU0dDN0MgorLmxldHRlNHIxczIKKy5sZXR0ZXIxc3AKKy5sZXR0ZXIyczFwYQorLmxldHRlcnNwNGEyY2kKKy5sZXR0ZXJzcGEyYzFpbgorLmxldHRlcnNwYWMxaW5nCisubGk4ZjhlOXM4cDhhOG4uCisubGlmZTFzcAorLmxpZmUyczFwYQorLmxpZmVzcGE0bgorLmxpOGY4ZTlzOHA4YThuOHMuCisubGlmZXNwYTJuMXMyCisubGk4ZjhlOXM4dDh5OGw4ZS4KKy5saWZlczJ0eQorLmxpZmVzMnR5bAorLmxpOGY4ZTlzOHQ4eThsOGU4cy4KKy5saWZlc3R5bGVzMgorLmxpOGc4aDh0OXc4ZThpOGc4aDh0LgorLjNsaWdoCisubGlnaHR3NAorLmxpZ2h0d2VpMgorLmwyaWdodHdlMmlnMgorLmxpOG05bzh1OXM4aThuOGU4cy4KKy5saTRtbworLmxpM21vMnVzCisubGltb3UyCisubGltb3UyczFpbgorLmxpbW91czJpbmUKKy5saW1vdXNpMW5lcworLmxpOG44ZTliOGE4YzhrOGU4ci4KKy4xbDRpbmUKKy5saW4yZTJiCisubGluZWJhY2sxCisubGluZWJhY2sxZXIKKy5saThuOGU5czhwOGE4YzhpOG44Zy4KKy5saTFuZXMKKy5saTRuZTFzcAorLmxpbmUyczFwYQorLmxpbmVzcDRhMmNpCisubGluZXNwYTJjMWluCisubGluZXNwYWMxaW5nCisubGk5bzhuOWU4czhzLgorLmxpbzJuCisubGlvMW5lcworLmxpb24yZTJzcworLmxpOHQ4aDlvOWc4cjhhOHA4aDhlOGQuCisubDJpdGgKKy5saXRobzRnCisubGl0aG8xZ3IKKy5saXRob2dyYXBoNGVkCisubGk4dDhoOW85ZzhyOGE4cDhoOHMuCisubGl0aG9ncmE0cDRoMXMyCisubG85YjhvOHQ5bzhtOHkuCisubG9ibzR0bworLmxvYm90bzNteQorLmxvOWI4bzh0OW84bTlpOHo4ZS4KKy5sb2JvdG9tMml6CisubG9ib3RvbWkyemUKKy5sbzhnOGU4cy4KKy5sbzFnZQorLmxvOG44ZzllOHM4dC4KKy41bG9uZworLmxvMm4KKy5sbzlxOHU4YThjOWk4dDh5LgorLmxvMXEKKy5sb3F1MgorLmxvcXVhYzQKKy5sb3F1NGEyY2kKKy5sb3F1YTJjMWl0CisubG9xdWFjaTF0eQorLmxvOHY4ZTlzOHQ4cjh1OGM4ay4KKy40bG92CisubG92NGUycworLmxvdjJlc3Q0cgorLmxvdmVzdHJ1YzUKKy5sb3Zlc3RydWNrMQorLm1hOGM4cjhvOWU4YzhvOW44bzhtOGk4YzhzLgorLm1hY3JvNGUKKy5tYWNyb2UxY28KKy5tYWNyb2VjbzJuCisubWFjcm9lY28zbm9taWMKKy5tYWNyb2Vjb25vbWk0YzNzMgorLm1hOGw5YTlwOHI4bzhwOWk4czhtLgorLm1hbGFwcjIKKy5tYWxhcHJvcGkyczFtCisubWE4bDlhOXA4cjhvOHA5aThzOG04cy4KKy5tYWxhcHJvcDRpczRtMXMyCisubWE4bjlzOGw4YTh1OGc4aDl0OGU4ci4KKy5tYTJuMXMyCisubWFuMnMxbDIKKy5tYW5zbGF1Z2gzCisubWE4bjl1OXM4YzhyOGk4cDh0LgorLm1hbjJ1cworLm1hbnVzYzIKKy5tYW51c2NyaTIKKy5tYW51c2NyMmlwCisubWFudXNjcmkycDF0CisubWE4cjlnOGk4bjlhOGwuCisubWFyZzIKKy5tYXJnaTRuCisubWFyZ2kxbmEKKy5tYTh0OGg5ZTltOGE5dDhpOWM4aThhOG4uCisubTRhdGgzCisubWF0aDVlbQorLm1hdGgyZQorLjFtYXRoZTFtYQorLm1hdGhlbWF0MWljCisubWF0aGVtYXQyaTFjaQorLm1hdGhlbWF0aTNjMmkxYQorLm1hdGhlbWF0aWNpMmEybgorLm1hOHQ4aDllOW04YTl0OGk5YzhpOGE4bjhzLgorLm1hdGhlbWF0aWNpYTJuMXMyCisubWE4dDh0OGU4cy4KKy5tYXQ1dGUKKy5tYTR0M3QyCisubWF0NHRlcworLm1lOGQ5aThjOWE4aThkLgorLjJtZWQKKy5tNGVkaQorLm1lZDNpMWNhCisubWVkaWNhaTIKKy5tZWRpY2EyaWQKKy5tZThkOGk5bzhjOHI4ZS4KKy5tZTFkMmlvCisubWVkaW9jcmUzCisubWU4ZDhpOW84YzlyOGk5dDhpOGU4cy4KKy5tZWRpNW9jcml0CisubWVkaW9jcmkyCisubWVkaW81Y3JpMXRpCisubWVkaW9jcml0MmllNAorLm1lOGc4YTlsOGk4dDhoLgorLm1lMmcKKy5tNGVnYWwKKy5tZTFnYQorLm1lM2dhbDFpCisubWVnYWwxaXQKKy5tZWdhbDJpdGgKKy5tZThnOGE5bDhpOHQ4aDhzLgorLm1lZ2FsaTJ0NGgxczIKKy5tZTh0OGE5YjhvOGw5aThjLgorLm1lNHRhCisubWUydGE0YgorLm1ldGFib2wzaWMKKy5tZXRhYm9sMmkKKy5tZTl0OGE4YjlvOWw4aThzOG0uCisubWV0YWJvbGkyczFtCisubWU5dDhhOGI5bzlsOGk4czhtOHMuCisubWV0YWJvbDRpczRtMXMyCisubWU5dDhhOGI5bzlsOGk4dDhlLgorLm1ldGFibzVsMml0ZQorLm1ldGFib2wxaXQKKy5tZTl0OGE4YjlvOWw4aTh0OGU4cy4KKy5tZXRhYm9saXQ0ZXMKKy5tZTh0OGE5bDhhOG45Zzh1OGE4ZzhlLgorLm1ldDNhMmwKKy5tZXRhNWxhCisubWV0YWxhMm4KKy5tZXRhbDJhbmcKKy5tZXRhbGFuMWd1CisubWV0YWxhbmd1NGEKKy5tZTh0OGE5bDhhOG45Zzh1OGE4ZzhlOHMuCisubWU4dDhhOXA4aDhvOHI5aThjLgorLm1ldGFwaG80cgorLm1lOHQ4aDlhOG44ZS4KKy5tZXRoYTJuNAorLm1lOXQ4cjhvOHA5bzlsOGk4cy4KKy5tNGV0cgorLm1ldHJvcG9sMmkKKy5tZTl0OHI4bzhwOW85bDhpOHM4ZThzLgorLm1ldHJvcG9sNGlzZQorLm1ldHJvcG9saXMxZTRzCisubWU4dDlyOG85cDhvOGw5aTl0OGE4bi4KKy5tZXRyb3BvbDFpdAorLm1ldHJvcG9saTN0YTJuCisubWV0cm9wb2xpMXRhCisubWU4dDlyOG85cDhvOGw5aTl0OGE4bjhzLgorLm1ldHJvcG9saXRhMm4xczIKKy5taThjOHI4bzllOGM4bzluOG84bThpOGM4cy4KKy5tNGkxY3IKKy5taWNybzRlCisubWljcm9lMWNvCisubWljcm9lY28ybgorLm1pY3JvZWNvM25vbWljCisubWljcm9lY29ub21pNGMzczIKKy5taTljOHI4bzlmOGk4YzhoOGUuCisubWljcm8yZmkKKy5taWNyb2Y0aTJjaAorLm1pY3JvZmljaGUyCisubWk5YzhyOG85ZjhpOGM4aDhlOHMuCisubWljcm9maWNoMWVzCisubWk4YzhyOG85bzhyOGc4YThuOWk4czhtLgorLm1pY3JvbzIKKy5taWNyb29yZzIKKy5taWNyb29yMWdhCisubWljcm9vcmdhbjVpcworLm1pY3Jvb3JnYTJuCisubWljcm9vcmdhbmkyczFtCisubWk4YzhyOG85bzhyOGc4YThuOWk4czhtOHMuCisubWljcm9vcmdhbjRpczRtMXMyCisubWk4bDhsOWE4ZzhlLgorLm00aWwxbAorLm1pOGw5bDhpOWw4aTh0OGU4ci4KKy5taWxsMmkKKy5taWw0bDRpNGwKKy5taWxsaWwxaQorLm1pbGwyaWwxaXQKKy5taWxsaWwyaXRlCisubWk4bThlOG85ZzhyOGE4cDhoOGU4ZC4KKy5taW1lbzJnCisubWltZW8xZ3IKKy5taW1lb2dyYXBoNGVkCisubWk4bThlOG85ZzhyOGE4cDhoOHMuCisubWltZW9ncmE0cDRoMXMyCisubWk4bTlpOGM5cjhpOGU4cy4KKy5taW0xaQorLm1pbTRpMWNyCisubWltaWNyaTIKKy5taW1pY3IyaWU0CisubWk4bjlpOHMuCisubTJpbmkKKy5taW4xaXMKKy5taThuOGk5czh5OG05cDhvOXM4aTh1OG0uCisubWluaXM0eQorLm1pbmlzeTRtMXAKKy5taW5pc3ltMXBvcworLm1pbmlzeW1wbzVzaTR1CisubWk4bjhpOXM4eThtOXA4bzlzOGk4YS4KKy5taW5pc3ltcG9zMmkxYQorLm1pOW44dTh0OWU4ci4KKy5tNGluMXUKKy5taTluOHU4dDllOHM4dC4KKy5taThzOWM4aDhpOGU5djhvOHU4czlsOHkuCisubTJpczFjCisubWlzM2NoMgorLm1pc2NoMmllNAorLm1pc2NoaWV2b3UyCisubWlzY2hpZXZvMnVzCisubWlzY2hpZXZvdXMxbDIKKy5taXNjaGlldm91czFseQorLm1pOXM4ZThyOHMuCisubTRpc2UKKy5taXMzZXIKKy5taXNlNHIxczIKKy5taTlzOG84ZzlhOW04eS4KKy5taTJzbworLm1pc28xZ2EKKy5taXNvMmdhbQorLm1vOGQ5ZThsOWw4aThuOGcuCisubW8yZDEKKy5tb2RlbDFsCisubW9kZWxsMmkKKy5tb2RlbDJsaW40CisubW84bDllOWM4dThsOGUuCisubW9sZTFjdQorLm1vbGU0Y3VsCisubW9sZWN1bDRlCisubW84bDllOWM4dThsOGU4cy4KKy5tb2xlY3VsZXMyCisubW84bjlhOHI4YzhoOHMuCisubW8xbjFhCisubW9uYXIzYworLm1vbjJhMnIKKy5tb25hcjJjaAorLm1vbmFyYzRoMXMyCisubW84bjhlOHk5bDhlOG45ZDhlOHIuCisubW9uZXlsZW4xZGUKKy5tbzhuOGU4eTlsOGU4bjlkOGU4cjhzLgorLm1vbmV5bGVuZGU0cjVzMgorLm1vOG44bzljOGg4cjhvOG04ZS4KKy5tb25vMmNoNAorLm1vbm9jNGhyNAorLm1vbm9jaHJvMm1lCisubW84bjhvOWU4bjllOHI5ZzhlOHQ4aThjLgorLm1vM25vZQorLm1vbm9lbjFlcgorLm1vbm9lbmVyZzIKKy5tb25vZW5lcjNnZXQKKy5tb25vZW5lcmdldDFpYworLm1vOG45bzhpOGQuCisubW9ub2kyCisubW9ubzJpZAorLm1vOG44bzlwOG84bDhlLgorLm1vNG5vcAorLm1vOG44bzlwOG84bDhlOHMuCisubW9ub3BvbGVzMgorLm1vOW44bzhwOW84bDh5LgorLm1vbm9wbzJseQorLm1vOG44bzlzOHA4bDhpOG44ZS4KKy5tb25vczFwMmwyCisubW9ub3NwbGk0bgorLm1vbm9zcDFsNGluZQorLm1vOG44bzlzOHA4bDhpOG44ZThzLgorLm1vbm9zcGxpMW5lcworLm1vOG44bzlzOHQ4cjhvOGY4aThjLgorLm1vbm9zNXQKKy5tb25vc3Q0cgorLm1vbm9zdHJvMmZpCisubW85bjhvOHQ5bzluOGk4ZThzLgorLm1vbm8xdG8KKy5tbzJub3RvMm4KKy5tb25vdG9uMmllNAorLm1vOW44bzh0OW85bjhvOHU4cy4KKy5tb25vNHRvbm8KKy5tb25vdG8xbm91MgorLm1vbm90b25vMnVzCisubW85cjhvOG45aThzOG0uCisubW9ybzVuNGlzCisubW9ybzJuCisubW9yb25pMnMxbQorLm1vOHM5cTh1OGk5dDhvLgorLm1vczIKKy5tb3NxdTIKKy5tb3NxMnVpMgorLm1vc3F1aTF0bworLm1vOHM5cTh1OGk5dDhvOHMuCisubW9zcXVpdG9zMgorLm1vOHM5cTh1OGk5dDhvOGU4cy4KKy5tdThkOXI4bzhvOG0uCisubXUxZHIKKy5tdWQxcm9vbQorLm11ZHJvbzIKKy5tdThkOXI4bzhvOG04cy4KKy5tdWRyb280bTFzMgorLm11OGw5dDhpOWY4YThjOWU4dDhlOGQuCisuNW11NGx0CisubXVsMXRpMworLm11bHRpZjIKKy5tdWx0aTFmYQorLm11bHRpZmE0Y2UKKy5tdWx0aWZhY2V0NAorLm11bHRpZmFjZTJ0MWVkCisubXU4bDl0OGk5cDhsOGk4YzlhOGI4bDhlLgorLm11bHQyaXAKKy5tdWx0aTFwMmwyCisubXVsdGlwbGkxY2EKKy5tdWx0aXBsaWNhMWIybDIKKy5tdThsOHQ4aTl1OHM4ZThyLgorLm11bHRpNHUKKy5tdWx0aTJ1cworLm5lOG85ZjhpOGU4bDhkOHMuCisuM25lbworLm5lNW9mCisubmVvMmZpCisubmVvZjJpZTQKKy5uZW9maWUybGQzCisubmVvZmllbDJkMXMyCisubmU4bzluOGE4ejhpLgorLm5lbzJuCisubmVvMW4xYQorLm5lb25hMnoxaQorLm5lOG85bjhhOHo4aThzLgorLm5lb25hejRpcworLm5lOHA4aDllOHc4cy4KKy5uZXBoZTQKKy5uZThwOGg5cjhpOHQ4ZS4KKy5uZXA0aHI0CisubmVwaHIyaXRlCisubmU4cDhoOXI4aTh0OGk4Yy4KKy5uZXBocjRpMnQzaWMKKy5uZXBocmkxdGkKKy5uZTh3OWU4czh0LgorLm5lNHcKKy5uZXdlc3QzCisubmU4dzhzOWw4ZTh0OXQ4ZThyLgorLm5ld3M0bDIKKy5uZXdzMmxlCisubmV3c2xlNHQzdDIKKy5uZTh3OHM5bDhlOHQ5dDhlOHI4cy4KKy5uZXdzbGV0dGU0cjFzMgorLm5pOHQ4cjhvOW04ZTh0OGg5YThuOGUuCisubjJpdAorLm5pM3RyCisubml0cm8ybWUKKy5uaXRybzRtZXQKKy5uaXRyb21ldGhhMm40Cisubm85bjhhOG04ZS4KKy5ubzRuCisubm8xbjFhCisubm84bjlhOHI5aTh0OGg5bThlOHQ5aThjLgorLm5vbmFyM2kKKy5ub24yYTJyCisubm9uYXIyaXRoCisubm9uYXJpdDRoMW0KKy5ub25hcml0aG1ldDQKKy5ub25hcml0aG1ldDFpYworLm5vOG45ZThtOGU4cjlnOGU4bjhjOHkuCisubm9uZTFtZQorLm5vbmVtZXJnMgorLm5vbmVtZXIxZ2VuCisubm9uZW1lcmdlbjFjeQorLm5vOG45ZThxOHU4aTl2OGE4cjhpOWE4bjhjOGUuCisubm9uZTJxCisubm9uZXF1MgorLm5vbmVxMnVpMgorLm5vbmVxdTJpdjMKKy5ub25lcXVpMXZhCisubm9uZXF1aXYyYTJyCisubm9uZXF1aXZhcjFpCisubm9uZXF1aXZhcjNpMmEybgorLm5vbmVxdWl2YXIyaTNhCisubm9uZXF1aXZhcjRpYW5jCisubm84bjhlOXQ4aDhlOWw4ZThzOHMuCisubm9uZXRoMmUKKy5ub25ldGhlMWxlczIKKy5ub25ldGhlM2wyZTJzcworLm5vOG45ZTh1OGM4bDhpOGQ5ZThhOG4uCisubm9uNGV1Cisubm9uZXUxYzRsNAorLm5vbmV1Y2wyaWQKKy5ub25ldWNsaWRlYTJuCisubm84bjlpOHM4bzltOG84cjlwOGg4aThjLgorLm5vbjVpCisubm9uMWlzCisubm9uaTJzbworLm5vbmkzc29tCisubm9uaXNvMW1vCisubm9uaXNvbW8ycgorLm5vbmlzb21vcjFwCisubm9uaXNvbW9ycDRoNAorLm5vbmlzb21vcnBoMWljCisubm84bjlwOHM4ZTh1OGQ4bzljOG84bTlwOGE4Yzh0LgorLm5vbjFwNAorLm5vbjJwMXMyCisubm9ucDJzZQorLm5vbnBzNGV1Cisubm9ucHNldTFkbworLm5vbnBzZXVkbzFjbworLm5vbnBzZXVkb2NvNG0xcAorLm5vbnBzZXVkb2NvbTFwYQorLm5vbnBzZXVkb2NvbXBhMmM0dAorLm5vOG45czhtOG84bzh0OGguCisubm8ybjNzMgorLm5vbjJzM20KKy5ub25zMW1vCisubm9uc21vbzIKKy5ub25zbW80b3RoCisubm84bjl1OG44aTlmOG84cjhtLgorLm5vM251NG4KKy5ub251MW5pCisubm9udW5pMWZvCisubm9udW5pZm8ycgorLm5vbnVuaWZvcjFtCisubm84bjl1OG44aTlmOG84cjhtOWw4eS4KKy5ub251bmlmb3I0bTFsCisubm9udW5pZm9ybTFseQorLm5vOHI5ZThwOWk5bjhlOHA4aDlyOGk4bjhlLgorLm5vcmU1cGkybgorLm5vcmVwMmluZQorLm5vcmVwaW5lcDRocjQKKy5ub3JlcDJpbmVwaHIyaW40ZQorLm5vOHQ5dzhpOHQ4aDlzOHQ4YThuOGQ5aThuOGcuCisubm90dzQKKy5ub3R3aTIKKy5ub3R3Mml0aDMKKy5ub3R3aTJ0NGgxczIKKy5ub3R3aXRoNXN0NGFuZAorLm5vdHdpdGhzMXRhCisubm90d2l0aHN0YTJuCisubm90d2l0aHN0YW5kMWluCisubnU5YzhsOGU4bzl0OGk4ZDhlLgorLm51Y2xlMworLm51MWM0bDQKKy5udWNsZTRvdAorLm51Y2xlb3QyaWQKKy5udTljOGw4ZThvOXQ4aThkOGU4cy4KKy5udWNsZW90aWRlNHMyCisubnU4dDljOHI4YThjOGs5ZThyLgorLm51NHRjCisubnV0Y3JhY2sxCisubnV0Y3JhY2sxZXIKKy5udTh0OWM4cjhhOGM4azllOHI4cy4KKy5udXRjcmFja2U0cjFzMgorLm9lOHI5czh0OGU4ZDhzLgorLm8zZXIKKy5vZTRyMXMyCisub2VyczR0MWVkCisub2Vyc3RlMmQxczIKKy5vZjhmOWw4aThuOGUuCisubzRmMWYKKy5vZmY0bDIKKy5vZmZsaW40Cisub2ZmMWw0aW5lCisub2Y4ZjlsOG84YThkLgorLm9mZmw0b2EKKy5vZmZsb2EyZDMKKy5vZjhmOWw4bzhhOGQ4cy4KKy5vZmZsb2EyZDFzMgorLm9mOGY5bDhvOGE4ZDhlOGQuCisub2ZmbG9hMmQxZWQKKy5vbDhpOWc4bzhwOW85bDhpOHM4dC4KKy5vbDJpCisub2wyaWcKKy5vbGkyZ28KKy5vbDJpZ29wb2wyaQorLm9sOGk5ZzhvOHA5bzlsOGk4czh0OHMuCisub2xpZ29wb2xpczR0MXMyCisub2w4aTlnOG84cDlvOGw4eS4KKy5vbGlnb3BvMmx5Cisub2w4aTlnOG84cDlvOGw5aThlOHMuCisub2xpZ29wb2wyaWU0Cisub3A5ZThyOWE4bjhkLgorLm9wMWVyCisuM29wZXIxYQorLm9wNGVyNGFuZAorLm9wZXJhMm4KKy5vcDllOHI5YThuOGQ4cy4KKy5vcGVyYW4yZDFzMgorLm9yOGE4bjhnOXU4dDhhOG4uCisub3JhMm4KKy5vcjJhbmcKKy5vcmFuMWd1Cisub3JhbjRndTR0Cisub3Jhbmd1MXRhCisub3JhMm5ndXRhMm4KKy5vcjhhOG44Zzl1OHQ4YThuOHMuCisub3Jhbmd1dGEybjFzMgorLm9yOXQ4aDhvOWQ4bzhuOXQ4aThzOHQuCisub3J0aG8yZG80Cisub3J0aG9kbzJuCisub3J0aG9kb24zdDRpCisub3J0aG9kb24xdAorLm9yOXQ4aDhvOWQ4bzhuOXQ4aThzOHQ4cy4KKy5vcnRob2RvbnRpczR0MXMyCisub3I5dDhoOG85azhlOHI5YTl0OG84bDlvOGc4eS4KKy5vcnRoMm9rCisub3J0aG9rMWVyCisub3J0aG9rZXIxYQorLm9ydGhva2VyYTF0bworLm9ydGhva2VyYXRvbDFvMWd5Cisub3I4dDhoOG85bjhpOHQ4cjhvOXQ4bzhsOHU4ZThuOGUuCisub3J0aG8ybgorLm9ydGhvbjJpdAorLm9ydGhvbmkzdHIKKy5vcnRob25pdHJvMXRvCisub3J0aG9uaXRyb3RvbHUzZW4KKy5vcnRob25pdHJvdG9sdTRlbmUKKy5vdjhlOHI5djhpOGU4dy4KKy5vdmVydjJpZTQKKy5vdjhlOHI5djhpOGU4dzhzLgorLm94OWk4ZDlpOGMuCisub3gzaQorLm94aTVkaQorLm94MmlkCisucGE4ZDlkOGk4bjhnLgorLjFwYQorLnA0YTJkCisucGFkNGQxaW4KKy5wYWQxZDQKKy5wYThpOG45bDhlOHM4czlsOHkuCisucDRhaTIKKy5wYTRpNG40CisucGE0aTRuMWwKKy5wYWlubGVzMgorLnBhaW4zbDJlMnNzCisucGFpbmxlczRzMWwyCisucGFpbmxlc3MxbHkKKy5wYThsOWU4dDh0OGUuCisucDRhbAorLnAyYWxlCisucGFsZTR0M3QyCisucGE4bDllOHQ4dDhlOHMuCisucGFsZXQ0dGVzCisucGE4cjlhOWI4bzhsOGEuCisucDJhMnIKKy5wYTJyYWIKKy5wYXJhYm8xbGEKKy5wYThyOWE5YjhvOGw5aThjLgorLnBhcmFib2wzaWMKKy5wYXJhYm9sMmkKKy5wYTlyOGE4YjlvOWw4bzhpOGQuCisucGFyYWJvbG9pMgorLnBhcmFib2xvMmlkCisucGE4cjlhOWQ4aThnOG0uCisucGFyYTJkCisucGFyMmFkaQorLnBhcmFkMmlnCisucGFyYWRpZzFtCisucGE4cjlhOWQ4aThnOG04cy4KKy5wYXJhZGlnNG0xczIKKy5wYThyOGE5YzhoOHU4dDhlLgorLnBhcmEyY2gKKy5wYXJhY2h1NHQKKy5wYThyOGE5YzhoOHU4dDhlOHMuCisucGE4cjhhOWQ4aTltOGU4dDhoOHk4bDliOGU4bjh6OGU4bjhlLgorLnBhcmFkNGltZXQKKy5wYXJhZGltZXRoeTJsMWIKKy5wYXJhZGltZXRoeWxiNGU0bjN6CisucGFyYWRpbWV0aHlsYmVuMnplCisucGFyYWRpbWV0aHlsYmVuemU0bgorLnBhOHI4YTlmOGw4dThvOHI4bzl0OG84bDh1OGU4bjhlLgorLnBhcmEyZgorLnBhcmFmNGwyCisucGFyYWZsdTNvCisucGFyYWZsdW8zcgorLnBhcmFmbHVvcm8xdG8KKy5wYXJhZmx1b3JvdG9sdTNlbgorLnBhcmFmbHVvcm90b2x1NGVuZQorLnBhOHI4YTlnOHI4YThwOGg5ZThyLgorLnBhcmExZ3IKKy5wYXJhZzVyYTNwaDRlcgorLnBhOHI4YTlsOGU5ZzhhOGwuCisucGFyM2FsCisucGFyMmFsZQorLnBhcmFsNGVnYWwKKy5wYXJhbGUxZ2EKKy5wYThyOWE4bDlsOGU4bDlpOHM4bS4KKy5wYXJhbDFsCisucGFyYWwybGUKKy5wYXJhbDNsZWwKKy5wYXJhbGxlbDJpCisucGFyYWxsZTJsaXMKKy5wYXJhbGxlbGkyczFtCisucGE4cjhhOW04YThnOW44ZTh0OWk4czhtLgorLnBhcjRhMW1hCisucGFyYW0zYWcKKy5wYXJhNW1hZzFuCisucGFyYW1hZ25ldGkyczRtCisucGE4cjhhOW04ZThkOGk4Yy4KKy5wYXJhMm1lZAorLnBhcmFtNGVkaQorLnBhOHI4YTltOGU4dDhoOHk4bDlhOG44aThzOG84bDhlLgorLnBhcmFtM2V0CisucGFyYW1ldGh5M2xhCisucGFyYW1ldGh5bGEybgorLnBhcmFtZXRoeWxhbmkyc28KKy5wYTlyOGE4bTllOXQ4cjhpOHo4ZS4KKy5wYXJhbTRldHIKKy5wYXJhbWV0cmkyemUKKy5wYThyOGE5bThpOGw5aTl0OGE4cjh5LgorLnBhcjJhbWkKKy5wYXJhbWlsMWkKKy5wYXJhbTJpbDFpdAorLnBhcmFtaWxpMXRhCisucGFyYW1pbGl0MmEycgorLnBhOHI4YTltOG84dThuOHQuCisucGFyYTJtbworLnBhcmFtb3UyCisucGFyYW1vdW4xdAorLnBhOHQ4aDlvOWc4ZThuOWk4Yy4KKy5wNGF0aAorLnBhdDRobworLnBhdGhvNGcKKy5wYXRobzFnZTQKKy5wYXRobzFnZW4KKy5wZThlOHY5aThzOGguCisucDRlZQorLnBlZTF2aQorLnBlZXZpczJoCisucGU4ZTh2OWk4czhoOW44ZThzOHMuCisucGVldmlzMmgxbgorLnBlZXZpc2gxbmVzCisucGVldmlzaG4yZTJzcworLnBlOG45dDhhOWc4bzhuLgorLnBlbjF0CisucGVuMXRhCisucGVudGEyZ28KKy5wZW50YWdvMm4yCisucGU4bjl0OGE5ZzhvOG44cy4KKy5wZW50YWdvMm4zczIKKy5wZTl0OHI4bzlsOGU5dThtLgorLnBldHJvbDRldQorLnBoOGU5bjhvOG05ZTluOG84bi4KKy5waDRlM25vCisucGhlMm4KKy5waGVubzJtZQorLnBoZW5vMW1lbgorLnBoZW5vbTRlbm8KKy5waGVub21lbm80bgorLnBoOGU4bjh5OGw5YThsOGE5bjhpOG44ZS4KKy5waGVueTNsYQorLnBoZW55bGFsYTJuCisucGhlbnlsYWxhNW4yaW5lCisucGhlbnlsYWxhbjFpbgorLnBoOGk5bDhhOHQ5ZTlsOGk4czh0LgorLnBoaTRsYXRlbDJpNAorLnBoaWxhdGUybGlzCisucGg4aTlsOGE4dDllOWw4aThzOHQ4cy4KKy5waGlsYXRlbGlzNHQxczIKKy5waDhvOW44ZThtOGUuCisuM3Bob25lCisucGhvMm4KKy5waG9uZTFtZQorLnBoOG85bjhlOG04ZThzLgorLnBob25lMm1lcworLnBoOG85bjhlOW04aThjLgorLnBob25lNW1pCisucGg4bzhzOXA4aDhvOHI5aThjLgorLnBob3MxcAorLnBob3NwaG81CisucGhvc3BobzRyCisucGg4bzl0OG85ZzhyOGE4cDhoOHMuCisucGhvMXRvCisucGhvdG8yZ3IKKy5waG90b2dyYTRwNGgxczIKKy5waDhvOXQ4bzlvOGY4ZjlzOGU4dC4KKy5waG90b28yCisucGhvdG9vNGYxZgorLnBob3Rvb2YyZjNzCisucGk4YzlhOWQ4bzhyLgorLnBpMWNhCisucGljYTJkCisucGljYTFkbworLnBpY2FkNG9yCisucGk4YzlhOWQ4bzhyOHMuCisucGljYWRvNHJzMgorLnBpOHA4ZTlsOGk4bjhlLgorLnAyaXAKKy5waXBlNAorLnBpcGVsMmkKKy5waXBlMWw0aW5lCisucGk4cDhlOWw4aThuOGU4cy4KKy5waXBlbGkxbmVzCisucGk4cDhlOWw4aThuOWk4bjhnLgorLnBpcGVsMmluM2kKKy5waXBlbGluMWluCisucGlwZWxpbmluNGcKKy5waTlyOGE5bjhoOGE4cy4KKy5wNGlyCisucGkxcmEKKy5waXJhMm4KKy5waXJhNG4xaDQKKy5waXJhbmhhNAorLnBsOGE4YzhhOWI4bDhlLgorLjFwMmwyCisucGxhMWNhCisucGxhY2ExYjJsMgorLnBsOGE4bjh0OWg4bzhwOXA4ZThyLgorLjNwbGEybgorLnBsYW4xdAorLnBsYW50aG80cDFwCisucGxhbnRob3AycGUKKy5wbGFudGhvcDNwZXIKKy5wbDhhOG44dDloOG84cDlwOGU4cjhzLgorLnBsYW50aG9wcGU0cjFzMgorLnBsOGU4YThzOWE4bjhjOGUuCisucGxlMmEKKy5wbGVhc2EyCisucGxlYTNzYW5jCisucGxlYXNhMm4KKy5wbDh1OGc5aThuLgorLnBsdWc1aW4KKy5wbDh1OGc5aThuOHMuCisucGx1NWc0aTJuMXMyCisucG84bDl0OGU4cjlnOGU4aThzOHQuCisucG80bDJ0CisucG9sMXRlCisucG9sdGVyZzIKKy5wb2x0ZXJnZWkyCisucG84bDh5OWU4bjhlLgorLnBvMmx5CisucG84bDh5OWU4dDhoOXk4bDllOG44ZS4KKy5wb2x5ZTR0CisucG85bDh5OGc5YTltOGk4czh0LgorLnBvbHkxZ2EKKy5wb2x5MmdhbQorLnBvbHlnYW0yaXMKKy5wbzlsOHk4ZzlhOW04aThzOHQ4cy4KKy5wb2x5Z2FtaXM0dDFzMgorLnBvOGw4eThnOW84bjlpOXo4YTl0OGk4bzhuLgorLnBvbHkxZ28KKy5wb2x5Z28ybjIKKy5wb2x5Z28zbmkKKy5wb2x5Z29uaXphMQorLnBvbHlnb25pemExdDJpbworLnBvbHlnb25pemF0aW8ybgorLnBvOWw4eThwOGg5bzluOG84dThzLgorLnBvbHlwaG8ybgorLnBvbHlwaG8xbm91MgorLnBvbHlwaG9ubzJ1cworLnBvOGw4eTlzOHQ4eThyOGU4bjhlLgorLnBvMmx5czQKKy5wb2x5czF0CisucG9seXMydHkKKy5wbzhtOGU5ZzhyOGE4bjlhOHQ4ZS4KKy5wbzJtZQorLnBvbWUyZworLnBvbWUxZ3IKKy5wb21lZ3JhMm4yCisucG9tZWdyYTFuYQorLnBvbWVncmFuMmF0CisucG84cjhvOWU4bDhhOHM5dDhpOGMuCisuMXA0b3IKKy5wb3JvNGUKKy5wb3JvNGVsCisucG9yb2UxbGEKKy5wb3JvZWxhc3QyaQorLnBvcm9lbGFzMXRpYworLnBvOHI5bzh1OHMuCisucG9yb3UyCisucG9ybzJ1cworLnBvOHI5dDhhOWI4bDhlLgorLnBvcjF0YQorLnBvcjJ0YWIKKy5wb3J0YWIybDIKKy5wbzhzOHQ5YThtOWI4bDhlLgorLjFwb3MKKy5wb3MydGEKKy5wb3N0YTRtMWIKKy5wb3N0YW1iMmwyCisucG84czh0OWE4bTliOGw4ZThzLgorLnBvc3RhbWJsZXMyCisucG84czh0OWg4dTltOG84dThzLgorLnBvc3RodTFtbworLnBvc3RodTNtbzJ1cworLnBvc3RodW1vdTIKKy5wbzhzOHQ5czhjOHI4aThwOHQuCisucG9zNHQxczIKKy5wb3N0NHNjCisucG9zdHNjcmkyCisucG9zdHNjcjJpcAorLnBvc3RzY3JpMnAxdAorLnBvOHM4dDlzOGM4cjhpOHA4dDhzLgorLnBvc3RzY3JpcDR0MXMyCisucG84czl0OHU4cjlhOGwuCisucG9zMXR1CisucG9zdHUxcmEKKy5wcjhlOWE4bTliOGw4ZS4KKy5wcmVhNG0xYgorLnByZWFtYjJsMgorLnByOGU5YThtOWI4bDhlOHMuCisucHJlYW1ibGVzMgorLnByOGU5bDhvOGE4ZDhlOGQuCisucHJlbDRvYQorLnByZWxvYTJkMworLnByZWxvYTJkMWVkCisucHI4ZTlwOGE4cjlpOG44Zy4KKy5wcmUycGEKKy5wcmVwNGE0cjFpCisucHJlcDJhMnIKKy5wcmVwYXJpbjRnCisucHI4ZTlwOHI4aThuOHQuCisucHIyZXByMgorLnByZXByaW40dDMKKy5wcjhlOXA4cjhpOG44dDhzLgorLnByZXByaW40dDRzMgorLnByOGU5cDhyOG84YzhlOHM5czhvOHIuCisucHJlM3BybworLnByZXByMm9jCisucHJlcHJvMWNlCisucHJlcHJvYzJlMnNzCisucHJlcHJvY2VzMXNvCisucHI4ZTlwOHI4bzhjOGU4czlzOG84cjhzLgorLnByZXByb2Nlc3NvNHJzMgorLnByOGU5czhwOGw4aTh0OXQ4aThuOGcuCisucHJlMXNwCisucHJlczFwMmwyCisucHJlc3BsMWl0CisucHJlc3BsNGk0dDN0MgorLnByZXNwbGl0MnQxaW4KKy5wcjhlOXc4cjhhOHAuCisucHJld3JhNAorLnByOGU5dzhyOGE4cDhwOGU4ZC4KKy5wcmV3cmE0cDFwCisucHJld3JhcDJwZQorLnByZXdyYXA0cDJlZAorLnByOGk4ZThzOHQ5ZThzOHM4ZThzLgorLjVwcjJpNGU0CisucHJpMWVzdAorLnByaWVzNHQyZTJzcworLnByaWVzdGVzczFlNHMKKy5wcjhlOHQ5dDh5OXA4cjhpOG45dDhlOHIuCisucHJlNHQzdDIKKy5wcmV0MXR5CisucHIyZXR0eXByMgorLnByZXR0eXByaW40dDMKKy5wcjhlOHQ5dDh5OXA4cjhpOG45dDhpOG44Zy4KKy5wcmV0dHlwcmludDJpCisucHJldHR5cHJpbjR0M2luZworLnByZXR0eXByaW4ydDFpbgorLnByOG85YzhlOWQ4dThyOWE4bC4KKy5wcjJvYworLnBybzFjZQorLnByb2NlMWR1CisucHJvY2VkdTFyYQorLnByOG84YzhlOHM4cy4KKy5wcm9jMmUyc3MKKy5wcjhvOWM4dThyOWE4bjhjOGUuCisucHJvY3UxcmEKKy5wcm9jdXJhMm4KKy5wcjhvOGc5ZTluOGk4ZThzLgorLnBybzFnZQorLnBybzFnZW4KKy5wcm9nZTVuMmllNAorLnByOG84ZzllOW44eS4KKy5wcm80Z2VueQorLnByOG85ZzhyOGE4bTltOGE4YjhsOGUuCisucHJvMWdyCisucHJvZ3JhbTFtCisucHJvZ3JhbTFtYQorLnByb2dyYW0ybWFiCisucHJvZ3JhbW1hYjJsMgorLnByOG84bTlpOW44ZThuOHQuCisucHJvbTRpCisucHJvbTFpbgorLnByb20yaW5lCisucHJvbWkxbmVuCisucHJvbWluZW4xdAorLnByOG85bThpOHM5Yzh1OW84dThzLgorLnByb20yaXMKKy5wcm9tMmlzMWMKKy5wcm9taXMxY3UKKy5wcm9taXNjdTFvdTIKKy5wcm9taXNjdW8ydXMKKy5wcjhvOG05aThzOXM4bzhyOHkuCisucHJvbTRpMnMxcworLnByb21pczFzbworLnByb21pc3NvMXJ5CisucHI4bzhtOWk4czhlLgorLnByb200aXNlCisucHI4bzhtOWk4czhlOHMuCisucHJvbWlzMWU0cworLnByOG85cDhlOGw5bDhlOHIuCisucHJvM3BlbAorLnByb3BlbDFsCisucHJvcGVsMmxlCisucHI4bzlwOGU4bDlsOGU4cjhzLgorLnByb3BlbGxlNHIxczIKKy5wcjhvOXA4ZThsOWw4aThuOGcuCisucHJvcGVsbDJpCisucHJvcGVsMmxpbjQKKy5wcjhvOWg4aThiOWk5dDhpOHY4ZS4KKy5wcm8xaDIKKy5wcm9oaWJpMnQKKy5wcm9oaWJpMXRpCisucHJvaGliaTF0Mml2CisucHI4bzloOGk4YjlpOXQ4aTh2OGU5bDh5LgorLnByb2hpYml0aXY0ZTFseQorLnByOG85czhjOGk4dTh0OXQ4by4KKy5wcm9zMmMKKy5wcm9zMWNpCisucHJvc2NpMXUKKy5wcm9zY2l1NHQzdDIKKy5wcm9zY2l1dDV0bworLnByOG85dDhlOHM4dDllOHIuCisucHJvMXQKKy5wcm80dGVzCisucHI4bzl0OGU4czh0OWU4cjhzLgorLnByb3Rlc3RlNHIxczIKKy5wcjhvOXQ4ZThzOXQ4bzhyLgorLnByb3Q0ZXMydG8KKy5wcjhvOXQ4ZThzOXQ4bzhyOHMuCisucHJvdGVzdG80cnMyCisucHI4bzl0OG85bDhhOG45Zzh1OGE4ZzhlLgorLnBybzF0bworLnByb3RvMWxhCisucHJvdG80bGEybgorLnByb3RvbDJhbmcKKy5wcm90b2xhbjFndQorLnByb3RvbGFuZ3U0YQorLnByOG85dDhvOXQ4eThwOWE4bC4KKy5wcm90bzF0eQorLnByb3RvdHkxcGEKKy5wcm90b3R5cDRhbAorLnByOG84djlpOG44YzhlLgorLnByb3YxaW4KKy5wcm92MmluYworLnByOG84djlpOG44YzhlOHMuCisucHI4bzl2OGk4bjljOGk4YThsLgorLnByb3ZpbjFjaQorLnByb3ZpbjNjMmkxYQorLnByb3ZpbmNpMmFsCisucHI4bzh3OWU4czhzLgorLnByb3cyZTJzcworLnBzOGU4dTlkOG85ZDhpOGY5ZjhlOHI5ZThuOXQ4aThhOGwuCisuMnAxczIKKy5wMnNlCisucHM0ZXUKKy5wc2V1MWRvCisucHNldWRvZDFpZgorLnBzZXVkb2RpNGYxZgorLnBzZXVkb2RpZmZlcjEKKy5wc2V1ZG9kaWZmZXIzZW4xdAorLnBzZXVkb2RpZmZlcmVudDJpCisucHNldWRvZGlmZmVyZW4xdDJpMWEKKy5wc2V1ZG9kaWZmZXJlbnRpMmFsCisucHM4ZTh1OWQ4bzlmOGk5bjhpOHQ4ZS4KKy5wc2V1MmQ1b2YKKy5wc2V1ZG8yZmkKKy5wc2V1ZG8yZmluCisucHNldWRvZjJpbmkKKy5wc2V1ZG9maW4yaXQKKy5wc2V1ZG9maW4yaXRlCisucHM4ZTh1OWQ4bzlmOGk5bjhpOHQ4ZTlsOHkuCisucHNldWRvZmluaXRlMWx5CisucHM4ZTh1OWQ4bzlmOG84cjhjOGU4cy4KKy5wc2V1ZG8xZm8KKy5wc2V1ZG9mbzJyCisucHNldWRvZm9yMWMKKy5wc2V1ZG9mb3IyY2UKKy5wczhlOHU5ZDhvOGc5cjhhOXA4aDhlOHIuCisucHNldWQ0b2cKKy5wc2V1ZG8xZ3IKKy5wc2V1ZG9nNXJhM3BoNGVyCisucHM4ZTh1OWQ4bzlnOHI4bzh1OHAuCisucHNldWRvNGc0cm8KKy5wc2V1ZG9ncm91MgorLnBzOGU4dTlkOG85ZzhyOG84dThwOHMuCisucHNldWRvZ3JvdTJwMXMyCisucHM4ZTh1OWQ4bzluOHk4bS4KKy5wc2V1NGRvMm4KKy5wc2V1ZG9ueW00CisucHM4ZTh1OWQ4bzluOHk4bThzLgorLnBzZXVkb255NG0xczIKKy5wczhlOHU5ZDhvOXc4bzhyOGQuCisucHNldWRvNHdvMgorLnBzOGU4dTlkOG85dzhvOHI4ZDhzLgorLnBzZXVkb3dvcjJkMXMyCisucHM4eTljOGg4ZTlkOGU4bDlpOGMuCisucHM0eQorLnA0c3kxYworLnBzeTNjaAorLnBzeWNoNGUyCisucHN5NGNoNGVkCisucHN5Y2hlZGVsMmkKKy5wczh5OGM4aDhzLgorLnBzeWM0aDFzMgorLnB1OWI4ZThzOWM4ZThuOGM4ZS4KKy5wdWIzCisucHViNGUKKy5wdTRiZXM0CisucHViZXMyYworLnB1YmVzMWNlbgorLnB1YmVzM2NlbmMKKy5xdThhOGQ5ZDhpOG44Zy4KKy5xdTIKKy5xdWEyZAorLnF1YWQ0ZDFpbgorLnF1YWQxZDQKKy5xdThhOWQ4cjhhOHQ5aThjLgorLnF1YTFkcgorLnF1YWRyYXQxaWMKKy5xdThhOWQ4cjhhOHQ5aThjOHMuCisucXVhZHJhdGk0YzNzMgorLnF1OGE4ZDlyOGE5dDh1OHI4ZS4KKy5xdWFkcmEydHUKKy5xdWFkcmEzdHVyZQorLnF1OGE4ZDlyOGk5cDhsOGU4ZzlpOGMuCisucXVhZHJpMnAybDIKKy5xdWFkcjJpcAorLnF1YWRyaXBsZWc0aWMKKy5xdThhOGk4bjh0OWU4ci4KKy5xdWFpMgorLnF1YTRpNG4KKy5xdWFpbjF0CisucXU4YThpOG44dDllOHM4dC4KKy5xdThhOXM4aTllOHE4dThpOHY5YTlsOGU4bjhjOGUuCisucXVhczJpZTQKKy5xdWFzaWUxcQorLnF1MmFzaWVxdTIKKy5xdWFzaWVxMnVpMgorLnF1YXNpZXF1Mml2MworLnF1YXNpZXF1aTF2YQorLnF1YXNpZXF1aXYyYWxlCisucXVhc2llcXVpdmEzbGVuYworLnF1OGE5czhpOWU4cTh1OGk4djlhOWw4ZThuOGM4ZThzLgorLnF1OGE5czhpOWU4cTh1OGk4djlhOWw4ZThuOHQuCisucXVhc2llcXVpdmExbGVuMXQKKy5xdThhOXM4aTloOHk5cDhvOW44bzhyOW04YThsLgorLnF1YXNpM2gKKy5xdWFzaWh5M3BvCisucXVhc2loeXBvMm4KKy5xdWFzaWh5cG9ub3IxbQorLnF1YXNpaHlwb25vcjFtYQorLnF1OGE5czhpOXI4YThkOWk5YzhhOGwuCisucXVhczRpMnIKKy5xdWFzaTFyNWEKKy5xdWFzaXJhMmQKKy5xdWFzaXIyYWRpCisucXVhc2lyYWQzaTFjYQorLnF1OGE5czhpOXI4ZThzOGk4ZDl1OGE4bC4KKy5xdWFzaTRyZXMKKy5xdWFzaXJlMXNpCisucXVhc2lyZTJzMmlkCisucXVhc2lyZXNpMmR1CisucXVhc2lyZXNpZDF1MWEKKy5xdThhOXM4aTlzOG04bzhvOHQ4aC4KKy5xdWExc2lzCisucXVhc2kyczFtCisucXVhc2lzMW1vCisucXVhc2lzbW9vMgorLnF1YXNpc21vNG90aAorLnF1OGE5czhpOXM4dDhhOXQ4aThvOG45YThyOHkuCisucXVhc2lzMXRhCisucXVhc2lzdGF0aW9uNWEycgorLnF1YXNpc3RhMXQyaW8KKy5xdWFzaXN0YXRpbzJuCisucXVhc2lzdGF0aW8xbjFhCisucXU4YTlzOGk5dDhvOHA4bzhzLgorLnF1NWE1c2k0dAorLnF1YXNpMXRvCisucXVhc2l0bzFwb3MKKy5xdThhOXM4aTl0OHI4aTlhOG45Zzh1OWw4YThyLgorLnF1YXNpNXRyMmkzYQorLnF1YXNpdHJpMmEybgorLnF1YXNpdHJpMmFuZworLnF1YXNpdHJpYW4xZ3UKKy5xdWFzaXRyaWFuZ3UxbGEKKy5xdWFzaXRyaWFuZ3VsMmEycgorLnF1OGE5czhpOXQ4cjhpOHY5aThhOGwuCisucXVhc2l0cjJpNHYKKy5xdWFzaXRyaXYzaQorLnF1YXNpdHJpdjJpMWEKKy5xdWFzaXRyaXZpMmFsCisucXU4aThuOXQ4ZThzOXM4ZThuOGM4ZS4KKy5xMnVpMgorLnF1aTRuCisucXVpbjF0CisucXVpbjR0MmUyc3MKKy5xdWludGVzNHNlbmMKKy5xdThpOG45dDhlOHM5czhlOG44YzhlOHMuCisucXU4aThuOXQ4ZThzOXM4ZThuOXQ4aThhOGwuCisucXVpbnRlc3NlbjF0CisucXVpbnRlc3NlbnQyaQorLnF1aW50ZXNzZW4xdDJpMWEKKy5xdWludGVzc2VudGkyYWwKKy5yYThiOWI4aTh0OXI4eS4KKy4ycmFiCisucmEyYjFiCisucmFiYmkydAorLnJhYmJpM3RyCisucmFiYml0NXJ5CisucmE5ZDhpOW84ZzlyOGE5cDhoOHkuCisucmEyZAorLnIyYWRpCisucmEzZDJpbworLnJhZGlvNWcKKy5yYWRpbzJncgorLnJhZGlvNGczcmExcGh5CisucmE4ZjhmOWk4czhoLgorLnJhZjVmaQorLnJhMmYKKy5yYTRmMWY0CisucmFmMmY1aXMKKy5yYWZmaXMyaAorLnJhOGY4ZjlpOHM4aDlsOHkuCisucmFmZmlzNGgxbDQKKy5yYWZmaXNoMWx5CisucmE4bTlzOGg4YThjOGs4bDhlLgorLnJhNG0xczIKKy5yYW00czJoCisucmFtc2hhY2sxCisucmFtc2hhY2sxbAorLnJhOHY5ZThuOW84dThzLgorLnJhdjRlNG5vCisucmF2ZTFub3UyCisucmF2ZW5vMnVzCisucmU5YThyOHI4YThuOGc4ZTltOGU4bjh0LgorLnJlNWFyMXI0CisucmUyYTJyCisucmVhcnJhbjRnZQorLnJlYXJyYTJuCisucmVhcnIyYW5nCisucmVhcnJhbmdlMW1lCisucmVhcnJhbmdlMW1lbgorLnJlYXJyYW5nZTNtZW4xdAorLnJlOWE4cjhyOGE4bjhnOGU5bThlOG44dDhzLgorLnJlYXJyYW5nZW1lbjR0NHMyCisucmU4YzlpOXA4cjhvOGM5aTl0OGk4ZThzLgorLnJlY2lwcm9jaTF0aQorLnJlY2lwcm9jaXQyaWU0CisucmU4Yzl0OGE4bjlnOGw4ZS4KKy5yZWM0dGEybgorLnJlMmMxdAorLnJlY3Q1YW5nCisucmVjMXRhCisucmVjdGFuMWdsMgorLnJlY3RhbjFnbGUKKy5yZThjOXQ4YThuOWc4bDhlOHMuCisucmVjdGFuZ2xlczIKKy5yZThjOXQ4YThuOWc4dTlsOGE4ci4KKy5yZWN0YW4xZ3UKKy5yZWN0YW5ndTFsYQorLnJlY3Rhbmd1bDJhMnIKKy5yZTlkOGk5cjhlOGM4dC4KKy4ycjJlZAorLnI0ZWRpCisucmVkNGlyMgorLnJlZGkxcmUKKy5yZWRpcmUyYzF0CisucmU5ZDhpOXI4ZThjOHQ5aThvOG4uCisucmVkaXJlYzF0MmlvCisucmVkaXJlY3RpbzJuCisucmU5ZDh1OGM5aThiOGw4ZS4KKy5yZTFkdQorLnJlZHUyYworLnJlZHVjaTRiCisucmVkdTFjaQorLnJlZHVjaTFiMmwyCisucmU5ZThjOGg4by4KKy5yZWUyYworLnJlZTJjaAorLnJlZTNjaG8yCisucmU5cDhoOHI4YThzOGUuCisucmVwNGhyNAorLnJlcGhyMmFzCisucmU5cDhoOHI4YThzOGU4cy4KKy5yZXBocmFzMWU0cworLnJlOXA4aDhyOGE4czhlOGQuCisucmVwaHJhNHM0ZWQKKy5yZTlwOG85czhpOXQ4aThvOG4uCisucmU0cG9zaQorLnJlMXBvCisucmUxcG9zCisucmVwbzNzMmkxdDJpbworLnJlcG9zaTF0aQorLnJlcG9zaXRpbzJuCisucmU5cDhvOXM4aTl0OGk4bzhuOHMuCisucmVwb3NpdGlvMm4zczIKKy5yZTlwOHI4aThuOHQuCisucmVwcjIKKy5yZXByaW40dDMKKy5yZTlwOHI4aThuOHQ4cy4KKy5yZXByaW40dDRzMgorLnJlOXM4dDhvOHI5YThiOGw4ZS4KKy5yNGVzMnRvCisucmVzdG8ycmEKKy5yZXN0bzJyYWIKKy5yZXN0b3JhYjJsMgorLnJlOHQ4cjhvOWY4aTh0LgorLnJldHJvMmZpCisucmU4dDhyOG85ZjhpOHQ5dDhlOGQuCisucmV0cm9mNGk0dDR0MgorLnJldHJvZml0MnQxZWQKKy5yZTl1OHM5YThiOGw4ZS4KKy5yNGV1MgorLnJlMnVzNAorLnJldXNhMgorLnJldTJzMWFiCisucmV1c2FiMmwyCisucmU5dThzOGUuCisucmU5dzhpOHI4ZS4KKy5yZXdpMgorLnJldzRpcjQKKy5yZTl3OHI4YThwLgorLnJld3JhNAorLnJlOXc4cjhhOHA4cDhlOGQuCisucmV3cmE0cDFwCisucmV3cmFwMnBlCisucmV3cmFwNHAyZWQKKy5yZTl3OHI4aTh0OGUuCisucmV3cmk0CisucmV3cjJpdGUKKy5yaDhpOW44bzhjOWU4cjlvOHMuCisucmg0CisucmgyaTFubworLnJoaTRubzRjCisucmhpbm8xY2UKKy5yaGlub2MyZXJvCisucmk4ZzhoOHQ5ZThvOHU4cy4KKy5yaWdoMXRlbworLnJpZ2h0ZW91MgorLnJpZ2h0ZW8ydXMKKy5yaThnOGg4dDllOG84dThzOW44ZThzOHMuCisucmlnaHRlb3VzMW40CisucmlnaHRlb3VzMW5lcworLnJpZ2h0ZW91c24yZTJzcworLnJpOG44ZzlsOGU4YThkOGU4ci4KKy5yaW40ZworLnJpbmdsMgorLnJpbjFnbGUKKy5yaW5nbGUyYQorLnJpbmdsZWEyZDEKKy5yaThuOGc5bDhlOGE4ZDhlOHI4cy4KKy5yaW5nbGVhZGU0cjVzMgorLnJvOWI4bzh0LgorLnJvOWI4bzh0OHMuCisucm9ibzR0MXMyCisucm85YjhvOHQ4aThjLgorLnJvOWI4bzh0OWk4YzhzLgorLnJvYm90aTRjM3MyCisucm84dThuOGQ5dDhhOGI4bDhlLgorLnJvdTIKKy5yb3VuMmQKKy5yb3VuZDF0YQorLnJvdW5kMnRhYgorLnJvdW5kdGFiMmwyCisucm84dThuOGQ5dDhhOGI4bDhlOHMuCisucm91bmR0YTVibGVzMgorLnNhOGw4ZThzOWM4bDhlOHI4ay4KKy5zYTIKKy5zMmFsZQorLnNhbGVzMgorLnNhbGVzMmMKKy5zYWxlc2NsZTUKKy5zYWxlczFjNGw0Cisuc2E4bDhlOHM5YzhsOGU4cjhrOHMuCisuc2FsZXNjbGVyNGsxczIKKy5zYThsOGU4czl3OG84bThhOG4uCisuc2FsZXM0dzIKKy5zYWxlNHMxd28yCisuc2FsZXN3b20xCisuc2FsZXN3bzFtYQorLnNhbGVzd29tYTJuCisuc2E4bDhlOHM5dzhvOG04ZThuLgorLnNhbGVzd28ybWUKKy5zYWxlc3dvMW1lbgorLnNhOGw5bThvOW44ZThsOWw4YS4KKy5zNGEybDRtCisuc2FsbW8ybjQKKy5zYWwxbW8KKy5zYWxtb240ZWxsYQorLnNhbG1vbmVsMWwKKy5zYThsOXQ4YTl0OGk4bzhuLgorLnNhNGw0dAorLnNhbDF0YQorLnNhbHRhMXQyaW8KKy5zYWx0YXRpbzJuCisuc2E4cjlzOGE5cDhhOHI5aThsOWw4YS4KKy5zMmEycgorLnNhMnI0c2EyCisuc2E0cnMyCisuc2FyczFhcAorLnMyYTJyc2FwMmEycjQKKy5zYXJzYTFwYQorLnNhcnNhcDRhNHIxaQorLnNhcnNhcGFyaWwxbAorLnNhOHU4ZThyOWs4cjhhOHU4dC4KKy5zYXU0Cisuc2F1ZXJrcmF1NHQKKy5zYzhhOHQ5bzlsOG84ZzlpOWM4YThsLgorLnMxY2EKKy5zY2ExdG8KKy5zY2F0bzNsb2cxaWMKKy5zY2F0b2xvZ2kxY2EKKy5zYzhoOGU4ZDl1OGw5aThuOGcuCisuczJjaDIKKy5zY2hlMgorLnM0Y2g0ZWQKKy5zY2hlNGR1bAorLnNjaGUxZHUKKy5zY2hlZHVsMmkKKy5zY2hlZHVsM2luZworLnNjOGg4aTh6OW85cDhoOHI4ZThuOGk4Yy4KKy5zY2hpMnoKKy5zY2hpMXpvCisuc2NoaXoyb3BoCisuc2NoaXpvcDRocjQKKy5zYzhoOG44YTh1OXo4ZThyLgorLnNjMmgxbgorLnNjaDFuYQorLnNjaG4yYXUKKy5zY2huYXUyejRlCisuc2NobmF1ejFlcgorLnNjOGg4bzhvOGw5YzhoOGk4bDhkLgorLnM0Y2hvMgorLnNjaG9vMgorLnNjaG9vNGwxYzIKKy5zMmNob29sMmNoCisuc2Nob29sY2g0aWwyCisuc2Nob29sY2hpMmxkCisuc2M4aDhvOG84bDljOGg4aThsOGQ5cjhlOG4uCisuc2Nob29sY2hpbDNkcgorLnNjaG9vbGNoaWxkcmU0Cisuc2Nob29sY2hpbDVkcmVuCisuc2M4aDhvOG84bDl0OGU4YThjOGg4ZThyLgorLnNjaG9vNGwydAorLnNjaG9vbDF0ZQorLnMyY2hvb2x0ZWEyY2gKKy5zY2hvb2x0ZWFjaGUyCisuc2M4aDhvOG84bDl0OGU4YThjOGg5ZThyOHMuCisuc2Nob29sdGVhY2gzZTRyMXMyCisuc2M4cjh1OXQ4aTluOHkuCisuc2NydTJ0MWk1bgorLnNjcjR1MXQyaQorLnNjcnV0NGlueQorLnNjOHk4dDhoOWk4bjhnLgorLnMxY3kKKy5zY3kzdGhpbgorLnNlOGw4bDllOHIuCisuc2VsMmxlCisuc2U4bDhsOWU4cjhzLgorLnNlbGxlNHIxczIKKy5zZThjOXI4ZTl0OGE4cjlpOGE4dC4KKy5zZTFjcgorLnNlNGMzcmUxdGEKKy5zZWNyZXQyYTJyCisuc2VjcmV0YXIxaQorLnNlY3JldGFyMmkzYQorLnNlOGM5cjhlOXQ4YThyOWk4YTh0OHMuCisuc2VjcmV0YXJpYTR0MXMyCisuc2U4bTlhOXA4aDhvOHI4ZS4KKy5zZTFtYQorLnNlNG1hcAorLnNlbWFwaG80cgorLnNlOG05YTlwOGg4bzhyOGU4cy4KKy5zZTltOGU4czl0OGU4ci4KKy40c2UxbWUKKy5zZTJtZXMKKy5zZThtOGk5ZDhlOGY5aTluOGk4dDhlLgorLnNlbTJpZAorLnNlbWlkZTFmCisuc2VtaWRlZjVpNW4yaXRlCisuc2VtaWRlMWZpCisuc2VtaWRlMmZpbgorLnNlbWlkZWYyaW5pCisuc2VtaWRlZmluMml0Cisuc2U4bThpOWQ4aTlyOGU4Yzh0LgorLnNlbWkyZGkKKy5zZW1pZDRpcjIKKy5zZW1pZGkxcmUKKy5zZW1pZGlyZTJjMXQKKy5zZThtOGk5aDhvOW04bzl0OGg4ZTh0OWk4Yy4KKy5zZW1pM2gKKy5zZW1paG8xbW8KKy5zZW1paG9tNG90aDMKKy5zZW1paG9tb3RoMmUKKy5zZW1paG9tbzN0aGU0dAorLnNlbWlob21vdGhldDFpYworLnNlOG04aTlyOGk4bjhnLgorLnNlbTRpcgorLnNlbWlyMWkKKy5zZW1pcmluNGcKKy5zZThtOGk5cjhpOG44ZzhzLgorLnNlbWlyaW5nczIKKy5zZThtOGk5czhpOG05cDhsOGUuCisuc2U0bTJpcworLnNlbWlzaTRtMXAKKy5zZW1pc2ltMXAybDIKKy5zZThtOGk5czhrOGk4bDhsOGU4ZC4KKy5zZW00aXM0azIKKy5zZW1pc2sxaQorLnNlbWlzazRpbDFsCisuc2VtaXNraWwybGUKKy5zZThyOG85ZThwOGk5ZDhlOW04aTlvOWw4bzhnOWk5YzhhOGwuCisuczJlcjRvCisuc2VybzRlCisuc2Vyb2VwNGlkCisuc2Vyb2VwaTNkZQorLnNlcm9lcGlkNGVtCisuc2Vyb2VwaWRlbTJpbworLnNlcm9lcGlkZW1pMW9sCisuc2Vyb2VwaWRlbWlvM2xvZzFpYworLnNlcm9lcGlkZW1pb2xvZ2kxY2EKKy5zZThyOXY4bzltOGU4YzhoOWE4bjhpOHM4bS4KKy40c2VyM3ZvCisuc2Vydm8ybWUKKy5zZXJ2b21lMmNoCisuc2Vydm9tZWNoNWE1bmlzCisuc2Vydm9tZWNoYTJuCisuc2Vydm9tZWNoYW5pMnMxbQorLnNlOHI5djhvOW04ZThjOGg5YThuOGk4czhtOHMuCisuc2Vydm9tZWNoYW40aXM0bTFzMgorLnNlOHM5cTh1OGk5cDhlOWQ4YTlsOGk4YThuLgorLnMxZTRzCisuc2VzcXUyCisuc2VzcTJ1aTIKKy5zZXNxdTJpcAorLnNlc3F1aXBlNAorLnNlc3F1aTJwMmVkCisuc2VzcXVpcDJlMmQyYQorLnNlc3F1aXBlZGFsMWkKKy5zZXNxdWlwZWRhbDJpMWEKKy5zZXNxdWlwZWRhbGkyYTJuCisuc2U4dDl1OHAuCisuc2UxdHUKKy5zZTh0OXU4cDhzLgorLnNldHUycDFzMgorLnNlOXY4ZThyOGU5bDh5LgorLjVzZXYKKy5zZXYxZXIKKy5zZXY0ZXJlbAorLnNldmVyZTFseQorLnNoOGE4cDhlOWE4YjhsOGUuCisuc2hhM3BlNGEKKy5zaGFwZTFhNGIKKy5zaGFwZWFiMmwyCisuc2g4bzhlOXM4dDhyOGk4bjhnLgorLnNobzQKKy5zaG8yZXN0NHIKKy5zaG9lc3RyaW40ZworLnNoOG84ZTlzOHQ4cjhpOG44ZzhzLgorLnNob2VzdHJpbmdzMgorLnNpOGQ4ZTlzOHQ4ZThwLgorLjVzaWRlNHMyCisuczJpZAorLnNpZGVzdGU0cAorLnNpOGQ4ZTlzOHQ4ZThwOHMuCisuc2lkZXN0ZTJwMXMyCisuc2k4ZDhlOXM4dzhpOHA4ZS4KKy5zaWRlczR3MgorLnNpZGVzd2kyCisuc2lkZXN3MmlwCisuc2lkZXN3aXBlNAorLnNrOHk5czhjOHI4YThwOGU4ci4KKy5zazIKKy5za3lzNGMKKy5za3lzY3JhcDNlcgorLnNrOHk5czhjOHI4YThwOGU4cjhzLgorLnNreXNjcmFwZTRyMXMyCisuc204bzhrOGU5czh0OGE4YzhrLgorLjJzMW0KKy5zMW1vCisuczRtMm9rCisuc21va2VzNAorLnNtb2tlczF0YQorLnNtb2tlc3RhY2sxCisuc204bzhrOGU5czh0OGE4YzhrOHMuCisuc21va2VzdGFjNGsxczIKKy5zbjhvOHI5azhlOGw5aThuOGcuCisuczFuNAorLnNub3JrZTVsMmkKKy5zbm9ya2U0bDNpbmcKKy5zbzlsOGU5bjhvOGk4ZC4KKy4xc28KKy5zb2w0ZW5vCisuc29sZW5vaTIKKy5zb2xlbm8yaWQKKy5zbzlsOGU5bjhvOGk4ZDhzLgorLnNvbGVub2kyZDFzMgorLnNvOGw4dTh0OGUuCisuc28xbHV0Cisuc284bDh1OHQ4ZThzLgorLnNvOHY5ZThyOWU4aThnOG4uCisuNHNvdgorLnNvdmVyZWkyCisuc292ZXJlMmlnMgorLnNvOHY5ZThyOWU4aThnOG44cy4KKy5zb3ZlcmVpZzJuMXMyCisuc3A4YTljOGU4cy4KKy4yczFwYQorLnNwYTRjZQorLnNwOGU5YzhpOG84dThzLgorLnNwZTJjCisuc3BlMWMyaQorLnNwZWMyaW8KKy5zcGVjaW91MgorLnNwZWNpbzJ1cworLnNwOGU4bDhsOWU4ci4KKy5zcGVsMWwKKy5zcGVsMmxlCisuc3A4ZThsOGw5ZThyOHMuCisuc3BlbGxlNHIxczIKKy5zcDhlOGw4bDlpOG44Zy4KKy5zcGVsbDJpCisuc3BlbDJsaW40Cisuc3A4ZTlsOHU4bjhrOWU4ci4KKy5zcGVsdTRuazIKKy5zcGVsdW5rMWVyCisuc3A4ZThuOGQ5dDhoOHI4aThmOHQuCisuc3BlbjRkCisuc3BlbmQydGgKKy5zcGVuZHQ0aHI0Cisuc3BlbmR0aHI0aTJmdAorLnNwOGg4ZThyOW84aThkLgorLnMycGhlCisuM3NwaDRlcgorLnNwaDJlcm8KKy5zcGhlcm9pMgorLnNwaGVybzJpZAorLnNwOGg4ZThyOW84aThkOWE4bC4KKy5zcGhlcm9pMWQyYQorLnNwOGg4aThuOWc4ZThzLgorLnNwaDVpbmcKKy5zcGg0aW5nZQorLnNwOGk4YzlpOWw4eS4KKy5zcDJpMWNpCisuc3BpY2kxbHkKKy5zcDhpOG45bzhyOHMuCisuc3BpMm4KKy5zcDRpMW5vCisuc3Bpbm80cnMyCisuc3A4bzhrOGU4czl3OG84bThhOG4uCisuc3Ayb2sKKy5zcG9rZXM0Cisuc3Bva2VzNHcyCisuc3Bva2U0czF3bzIKKy5zcG9rZXN3b20xCisuc3Bva2Vzd28xbWEKKy5zcG9rZXN3b21hMm4KKy5zcDhvOGs4ZThzOXc4bzhtOGU4bi4KKy5zcG9rZXN3bzJtZQorLnNwb2tlc3dvMW1lbgorLnNwOG84cjh0OHM5YzhhOHM4dC4KKy5zMXA0b3I0Cisuc3BvcjR0MXMyCisuc3BvcnQ0c2MKKy5zcG9ydHMxY2EKKy5zcDhvOHI4dDhzOWM4YThzOHQ5ZThyLgorLnNwb3J0c2Nhc3Q1ZXIKKy5zcDhvOHI5dDhpOHY4ZTlsOHkuCisuc3BvcjF0aQorLnNwb3I0dDJpdgorLnNwb3J0aXY0ZTFseQorLnNwOG84cjh0OHM5dzhlOGE4ci4KKy5zcG9ydDRzdzIKKy5zcG9ydHN3ZTJhMnIKKy5zcDhvOHI4dDhzOXc4cjhpOHQ4ZThyLgorLnNwb3J0c3dyaTQKKy5zcG9ydHN3cjJpdGUKKy5zcDhvOHI4dDhzOXc4cjhpOHQ4ZThyOHMuCisuc3BvcnRzd3JpdDVlNHIxczIKKy5zcDhyOGk4ZzhoOHQ5bDhpOGU4ci4KKy5zcHIyCisuc3ByMmlnCisuc3ByaWdoMnRsCisuc3ByaWdodGwyaWU0Cisuc3E4dThlOGE5bThpOHM4aC4KKy5zcXUyCisuc3F1ZWFtMmlzCisuc3F1ZWFtaXMyaAorLnN0OGE4bjhkOWE4bDhvOG44ZS4KKy41c3Q0YW5kCisuc3RhMm4KKy5zdGFuMWQyYQorLnN0YW5kYWxvMm4KKy5zdDhhOHI5dDhsOGk4bjhnLgorLnN0MmEycgorLnN0YXIydGwKKy5zdDhhOHI5dDhsOGk4bjhnOWw4eS4KKy5zdGFydGxpbmdsMgorLnN0YXJ0bGluZzFseQorLnN0OGE5dDhpOHM5dDhpOGM4cy4KKy5zdGF0aXMxdDJpCisuc3RhdGlzMXRpYworLnN0YXRpc3RpNGMzczIKKy5zdDhlOGE4bDh0OGg5aThsOHkuCisuc3RlYTRsCisuc3RlYTRsdAorLnN0ZWFsdGgzaQorLnN0ZWFsNHRoNGlsMgorLnN0ZWFsdGhpMWx5Cisuc3Q4ZThlOHA4bDhlOWM4aDhhOHM4ZS4KKy5zMXRlZQorLnN0ZWU0cDEKKy5zdGVlMXAybDIKKy5zdGVlcGxlMmNoCisuc3Q4ZThyOGU4bzlnOHI4YThwOGg5aThjLgorLnN0ZXJlMW8KKy5zdGVyZW8yZworLnN0ZXJlbzFncgorLnN0ZXJlbzVncmFwaDFpYworLnN0ZXJlb2dyNGFwaGkKKy5zdDhvOWM4aDhhOHM5dDhpOGMuCisuczF0bworLnN0bzJjaDQKKy5zdG9jaGFzdDJpCisuc3RvY2hhczF0aWMKKy5zdDhyOGE4bjhnOGU5bjhlOHM4cy4KKy5zdDRyCisuczF0cmEKKy5zdHJhbjRnZQorLnN0cmEybgorLnN0cjJhbmcKKy5zdHJhbmdlNG40ZQorLnN0cmFuMWdlbgorLnN0cmFuZ2UxbmVzCisuc3RyYW5nZW4yZTJzcworLnN0OHI4YThwOWg4YThuOGc4ZThyLgorLnN0cmFwaDJhbjRnCisuc3RyYXBoYW5nNWVyCisuc3RyYXBoYTJuCisuc3Q4cjhhOHQ5YTlnOGU4bS4KKy5zdHJhMnRhCisuc3Q4cjhhOHQ5YTlnOGU4bThzLgorLnN0cmF0YWdlNG0xczIKKy5zdDhyOGU4dDhjOGg5aTllOHIuCisuc3RyZTR0YworLnN0cmV0NGNoCisuc3RyZXRjaDJpZTQKKy5zdDhyOGk4cDl0OGU4YThzOGUuCisuc3RyMmlwCisuc3RyaTJwMXQKKy5zdHJpcDJ0ZQorLnN0OHI4bzhuOGc5aDhvOGw4ZC4KKy5zdHJvMm4KKy5zdHJvbmdobzJsMmQKKy5zdDhyOG84bjhnOWU4czh0LgorLnN0OHU5cDhpOGQ5ZThyLgorLnMxdHUKKy5zdHVwNGlkCisuc3R1cGkzZGUKKy5zdDh1OXA4aThkOWU4czh0LgorLnN0dXBpZGU0czIKKy5zdThiOWQ4aThmOWY4ZThyOWU4bjl0OGk4YThsLgorLjFzdQorLnN1NGIzCisuc3U0YjFkCisuc3ViZDFpZgorLnN1YmRpNGYxZgorLnN1YmRpZmZlcjEKKy5zdWJkaWZmZXIzZW4xdAorLnN1YmRpZmZlcmVudDJpCisuc3ViZGlmZmVyZW4xdDJpMWEKKy5zdWJkaWZmZXJlbnRpMmFsCisuc3U4YjllOHg5cDhyOGU4czlzOGk4bzhuLgorLnN1YjRlCisuc3ViMWV4M3AKKy5zdWJleHByMgorLnN1YmV4M3ByMmUyc3MKKy5zdWJleHByZXMxc2kKKy5zdWJleHByZXMxczJpbworLnN1YmV4cHJlczVzaW8ybgorLnN1OGI5ZTh4OXA4cjhlOHM5czhpOG84bjhzLgorLnN1YmV4cHJlc3NpbzJuM3MyCisuc3U4bTltOGE5YjhsOGUuCisuc3UybQorLnN1bTFtCisuc3VtMW1hCisuc3VtMm1hYgorLnN1bW1hYjJsMgorLnN1OHA4ZThyOWU4ZzhvLgorLnN1MXBlCisuc3VwZXJlMWdvCisuc3U4cDhlOHI5ZThnOG84cy4KKy5zdXBlcmU0Z29zCisuc3U5cDhyOGU4bTlhOWM4aThzOHQuCisuc3VwcjIKKy5zdXByZTRtYWMKKy5zdXByZTFtYQorLnN1cHJlbTRhMmNpCisuc3U5cDhyOGU4bTlhOWM4aThzOHQ4cy4KKy5zdXByZW1hY2lzNHQxczIKKy5zdThyOXY4ZThpOGw5bDhhOG44YzhlLgorLnN1MnIKKy5zdXJ2NGUKKy5zdXJ2ZWkyCisuc3VydmVpbDFsCisuc3VydmVpbGxhMm4KKy5zdzhpOG05bThpOG44ZzlsOHkuCisuc3cyCisuc3dpMgorLnN3aW0xbQorLnN3aW1tNGluZ2wyCisuc3dpbW01aW5nMWx5Cisuc3k4bThwOXQ4bzltOGE4dDhpOGMuCisuc3k0bTFwCisuc3ltMnAxdAorLnN5bXAxdG8KKy5zeW1wdG8ybWEKKy5zeW1wdG9tYXQxaWMKKy5zeThuOWM4aDhyOG85bThlOHM4aC4KKy5zeW4zYzRocjQKKy5zeW4yY2gKKy5zeW5jaHJvMm1lCisuc3luY2hybzJtZXMKKy5zeW5jaHJvbTRlczJoCisuc3k4bjljOGg4cjhvOW44bzh1OHMuCisuc3luY2hybzJuCisuc3luY2hybzFub3UyCisuc3luY2hyb25vMnVzCisuc3k4bjljOGg4cjhvOXQ4cjhvOG4uCisuc3luY2hyb3RybzJuCisudGE4ZjhmOXI4YThpOGwuCisuNHRhMmY0CisudGE0ZjFmNAorLnRhZmZyMmFpMgorLnRhOGw4azlhOXQ4aTh2OGUuCisudGEybAorLjR0YWxrCisudGFsa2EzCisudGFsa2E0dAorLnRhbGthMXQyaXYKKy50YTlwOGU4czl0OHI4eS4KKy50YXAyZXN0NHIKKy50YXBlNHN0cnkKKy50YTlwOGU4czl0OHI4aThlOHMuCisudGFwZXN0cjJpZTQKKy50YThyOXA4YTh1OWw4aThuLgorLnQyYTJyCisudGFyMnAKKy50YXIxcGEKKy50YXJwYXU0bDIKKy50YXJwYXVsMmkKKy50YThyOXA4YTh1OWw4aThuOHMuCisudGFycGF1bDJpMm4xczIKKy50ZTlsOGU4ZzlyOGE5cDhoOGU4ci4KKy50ZWxlMWdyCisudGVsZWc1cmEzcGg0ZXIKKy50ZTlsOGU4ZzlyOGE5cDhoOGU4cjhzLgorLnRlbGVncmFwaGU0cjFzMgorLnRlOGw4ZTlrOGk5bjhlOHQ5aThjLgorLnRlbGVraTRuCisudGVsZWsxaQorLnRlbGVrMmluZQorLnRlbGVraTNuZXQxaWMKKy50ZThsOGU5azhpOW44ZTh0OWk4YzhzLgorLnRlbGVraW5ldGk0YzNzMgorLnRlOGw4ZTlyOG85YjhvOHQ5aThjOHMuCisudGU0bDFlcgorLnRlbDRlcm8KKy50ZWxlcjVvYgorLnRlbGVyb2JvdGk0YzNzMgorLnRlOGw4bDllOHIuCisudGVsMWwKKy50ZWwybGUKKy50ZThsOGw5ZThyOHMuCisudGVsbGU0cjFzMgorLnRlOG05cDhvOXI4YThyOWk4bDh5LgorLnRlNG0xcAorLnRlbTFwNG9yCisudGVtcG8xcmEKKy50ZW1wbzRyYXJpbAorLnRlbXBvcjJhMnIKKy50ZW1wb3JhcjFpCisudGVtcG9yYXJpMWx5CisudGU4bjl1OHI4ZS4KKy50ZThzOHQ5YjhlOGQuCisudGVzMnQxYgorLnRlc3Q0YmUyZAorLnRlOHg4dDl3OGk4ZDh0OGguCisuM3RleAorLnRleDF0MgorLnRleHR3NAorLnRleHR3aTIKKy50ZXh0dzJpZAorLnRleHR3aWQydGgKKy50aDhhOGw5YTltOHU4cy4KKy50aGEzbGEKKy50aGFsYTNtCisudGhhbGExbXUKKy50aGFsYW0ydXMKKy50aDhlOHI5bThvOWU4bDhhOHM5dDhpOGMuCisudGgyZQorLnRoZXIzbTQKKy50aGVyMW1vCisudGhlcm1vNGVsCisudGhlcm1vZTFsYQorLnRoZXJtb2VsYXN0MmkKKy50aGVybW9lbGFzMXRpYworLnRpOG04ZTlzOHQ4YThtOHAuCisudGkybWVzCisudGltZXMxdGEKKy50aW1lc3RhNG0xcAorLnRpOG04ZTlzOHQ4YThtOHA4cy4KKy50aW1lc3RhbTJwMXMyCisudG84bzhsOWs4aTh0LgorLnRvbzIKKy50b29sazFpCisudG84bzhsOWs4aTh0OHMuCisudG9vbGtpNHQxczIKKy50bzhwOG85ZzhyOGE4cDhoOWk5YzhhOGwuCisudG81cG80ZworLnRvcG8xZ3IKKy50b3BvNWdyYXBoMWljCisudG9wb2dyNGFwaGkKKy50b3BvZ3JhcGhpMWNhCisudG84cTh1OGU4cy4KKy50bzFxCisudG9xdTIKKy50cjhhOGk5dDhvOHI5bzh1OHMuCisuMXRyYQorLnRyMmFpMgorLnRyYWkxdG8KKy50cmFpdG9yb3UyCisudHJhaXRvcm8ydXMKKy50cjhhOG44czljOGU4aTh2OGU4ci4KKy50cmEybgorLnRyYTJuMXMyCisudHJhbnM0YworLnRyYW40czNjZWkyCisudHJhbnNjZTJpdgorLnRyOGE4bjhzOWM4ZThpOHY4ZThyOHMuCisudHJhbnNjZWl2ZTRyMXMyCisudHI4YThuOHM5ZzhyOGU4czhzLgorLnRyYW4yczNnCisudHJhbnMxZ3IKKy50cmFuc2dyMmUyc3MKKy50cjhhOG44czl2OGU4cjlzOGE4bC4KKy50cmFuNHN2CisudHJhbnN2ZTRyMXMyCisudHJhbnN2ZXIxc2EyCisudHI4YThuOHM5djhlOHI5czhhOGw4cy4KKy50cmFuc3ZlcnNhMmwxczIKKy50cjhhOG44czl2OGU4czl0OGk4dDhlLgorLnRyYW5zdjRlMnMKKy50cmFuc3Zlc3QyaQorLnRyYW5zdmVzdDJpdGUKKy50cjhhOG44czl2OGU4czl0OGk4dDhlOHMuCisudHJhbnN2ZXN0aXQ0ZXMKKy50cjhhOXY4ZThyOHM5YTliOGw4ZS4KKy50cmF2ZTRyMXMyCisudHJhdmVyMXNhMgorLnRyYXZlcjJzMWFiCisudHJhdmVyc2FiMmwyCisudHI4YTl2OGU4cjlzOGE4bC4KKy50cjhhOXY4ZThyOXM4YThsOHMuCisudHJhdmVyc2EybDFzMgorLnRyOGk5ZTh0OGg4eThsOWE4bThpOG44ZS4KKy50cmk1ZXQKKy50cjJpZTQKKy50cmlldGh5M2xhCisudHJpZXRoeWxhbTFpbgorLnRyaWV0aHlsYW0yaW5lCisudHI4ZThhOGM4aDllOHI4aThlOHMuCisudHJlYTJjaAorLnRyZWFjaGUyCisudHJlYWNoZXIxaQorLnRyZWFjaGVyMmllNAorLnRyOG84dTliOGE5ZDhvOHU4ci4KKy50cm91MgorLnRyb3ViYTJkCisudHJvdWJhMWRvCisudHJvdWJhZG91MgorLnR1OHI5azhlOHkuCisuMXR1CisudHU4cjlrOGU4eThzLgorLnR1cmtleXM0CisudHU4cjhuOWE4cjhvOHU4bjhkLgorLnR1cjRuMmEycgorLnR1cjFuYQorLnR1cm5hcm91MgorLnR1cm5hcm91bjJkCisudHU4cjhuOWE4cjhvOHU4bjhkOHMuCisudHVybmFyb3VuMmQxczIKKy50eThwOWE4bC4KKy4xdHkKKy50eTFwYQorLnR5cDRhbAorLnVuOWE4dDl0OGE4YzhoOGU4ZC4KKy51bjJhdDQKKy51bmE0dDN0MgorLnVuYXQxdGEKKy51bmF0dGEyY2gKKy51bmF0dGFjaGUyCisudW5hdHRhNGNoNGVkCisudW45ZThyOHI5aThuOGc5bDh5LgorLnVuNGVyCisudW5lcjRyNAorLnVuZXJyaW40ZworLnVuZXJyaW5nbDIKKy51bmVycmluZzFseQorLnVuOWY4cjhpOGU4bjhkOWw4eS4KKy51bjNmCisudW5mcmkyCisudW5mcjJpZTQKKy51bmZyaWVuMmQxbHkKKy51bjlmOHI4aThlOG44ZDlsOGk5ZThyLgorLnVuZnJpZW5kbDJpZTQKKy52YThnOHU4ZThyLgorLjF2YQorLnZhZzQKKy52YTVndWVyCisudmEyZ3VlCisudmE4dThkOGU5djhpOGw4bDhlLgorLnZhdWRlMXY0CisudmF1ZGUydjNpNGwKKy52YXVkZTF2aQorLnZhdWRldmlsMWwKKy52YXVkZXZpbDJsZQorLnZpOGM5YThyOHMuCisudjRpYzJhMnIKKy52aTFjYQorLnZpY2E0cnMyCisudmk4bDlsOGE4aThuOWU4czhzLgorLjJ2aWwKKy52aWwxbAorLnZpbGxhaTIKKy52aWxsYTRpNG4KKy52aWxsYTJpbmUKKy52aWxsYWk1bjJlMnNzCisudmlsbGFpMW5lcworLnZpOHM5dThhOGwuCisudmkzc3UKKy52aXN1MWFsCisudmk4czl1OGE4bDlsOHkuCisudmlzdWFsMWwKKy52aXN1YWwxbHkKKy52aTl2OGk4cDlhOXI4bzh1OHMuCisuM3YyaXYKKy52aXYyaTRwCisudml2aTFwYQorLnZpdmlwMmEycgorLnZpdmlwYXJvdTIKKy52aXZpcGFybzJ1cworLnZvOGk4YzhlOXA4cjhpOG44dC4KKy52b2k0Cisudm9pM2NlcAorLnZvaWNlcHIyCisudm9pY2VwcmluNHQzCisudnM4cDhhOGM4ZS4KKy52MnMxcGEKKy52c3BhNGNlCisud2E4ZDlkOGk4bjhnLgorLndhMmQKKy53YWQ0ZDFpbgorLndhZDFkNAorLndhOGw4bDlmOGw4bzh3OGU4ci4KKy53YWwxbAorLndhbDJsZgorLndhbGxmNGwyCisud2FsbGZsb3cxZXIKKy53YThsOGw5ZjhsOG84dzllOHI4cy4KKy53YWxsZmxvd2U0cjFzMgorLndhOHI4bTllOHM4dC4KKy53MmEycgorLndhcjFtCisud2FyMm1lCisud2FyMm1lcworLndhOHM4dDhlOXc4YTh0OGU4ci4KKy53YXM0dAorLndhc3RlMncKKy53YXN0ZTF3NWEKKy53YXN0ZXdhMXRlCisud2E4djhlOWc4dThpOGQ4ZS4KKy53YXZlZzMKKy53YXZlZzJ1aTIKKy53YXZlZ3UyaWQKKy53YTh2OGU5Zzh1OGk4ZDhlOHMuCisud2F2ZWd1aWRlNHMyCisud2E4djhlOWw4ZTh0LgorLndhOHY4ZTlsOGU4dDhzLgorLndhdmVsZTR0MXMyCisud2U4YjlsOGk4azhlLgorLncyZTFiCisud2ViMmwyCisud2ViM2w0aWsKKy53ZThlOGs5bjhpOGc4aDh0LgorLndlZWtuMmlnCisud2U4ZThrOW44aThnOGg4dDhzLgorLndlZWtuaWdoNHQxczIKKy53aDhlOGU4bDljOGg4YThpOHIuCisud2hlZTRsMWMyCisud2hlZWwyY2gKKy53aGVlbGNoYWkyCisud2hlZWxjaGE0aXIKKy53aDhlOGU4bDljOGg4YThpOHI4cy4KKy53aGVlbGNoYWk0cnMyCisud2g4aThjOGg5ZTh2OGU4ci4KKy53aGk0Cisud2g0aTJjaAorLndoaWNoZTIKKy53aGljaGV2MWVyCisud2g4aTh0OGU5czhpOGQ4ZThkLgorLndoMml0ZQorLndoaXQ0ZXMKKy53aGl0ZTFzaQorLndoaXRlMnMyaWQKKy53aGl0ZXNpMmQxZWQKKy53aDhpOHQ4ZTlzOHA4YThjOGUuCisud2hpdGUxc3AKKy53aGl0ZTJzMXBhCisud2hpdGVzcGE0Y2UKKy53aDhpOHQ4ZTlzOHA4YThjOGU4cy4KKy53aThkOGU5czhwOHI4ZThhOGQuCisudzJpZAorLndpZGU0czIKKy53aWRlMXNwCisud2lkZXM0cHJlCisud2lkZXNwcjIKKy53aWRlc3ByZWEyZDEKKy53aThuOGc5czhwOGE4bi4KKy53aW40ZworLndpbmdzMgorLndpbmcyczFwYQorLndpbmdzcGE0bgorLndpOG44ZzlzOHA4YThuOHMuCisud2luZ3NwYTJuMXMyCisud2k4bjhnOXM4cDhyOGU4YThkLgorLndpbmdzcHIyCisud2luZ3NwcmVhMmQxCisud2k4dDhjOGg5YzhyOGE4Zjh0LgorLndpNHRjCisud2l0NGNoCisud2l0Y2hjcmEyZjR0Cisud2l0Y2hjcmEyZgorLndvOHI4ZDlzOHA4YThjOWk4bjhnLgorLjF3bzIKKy53b3IyZDFzMgorLndvcmRzNHAKKy53b3JkMnMxcGEKKy53b3Jkc3A0YTJjaQorLndvcmRzcGEyYzFpbgorLndvcmRzcGFjMWluZworLndvOHI4azlhOHI4bzh1OG44ZC4KKy53b3JrMmEycgorLndvcmthcm91MgorLndvcmthcm91bjJkCisud284cjhrOWE4cjhvOHU4bjhkOHMuCisud29ya2Fyb3VuMmQxczIKKy53bzhyOGs5aDhvOHI4czhlLgorLndvcmtoNAorLndvcmtob3I0c2UKKy53b3JraG80cnMyCisud284cjhrOWg4bzhyOHM4ZThzLgorLndvcmtob3JzM2U0cworLndyOGE4cDlhOHI4bzh1OG44ZC4KKy53cmE0Cisud3JhcDJhMnI0Cisud3JhMXBhCisud3JhcGFyb3UyCisud3JhcGFyb3VuMmQKKy53cjhlOHQ4YzhoOWU4ZC4KKy53cmU0dGMKKy53cmV0NGNoCisud3JldGNoZTIKKy53cmV0NGNoNGVkCisud3I4ZTh0OGM4aDllOGQ5bDh5LgorLndyZXRjaGUyZDFseQorLnllOHM5dDhlOHI5eThlOGE4ci4KKy55ZXM0CisueWVzdGVyeWUyYTJyCisuYWw5ZzhlOWI4cjhhOGk5czhjOGg4ZS4KKy5hbGdlYnJhMmlzMWMKKy5hbGdlYnJhaXMzY2gyCisuYWxnZWJyYWlzY2hlMgorLmFsOWw4ZTlnOGg4ZTluOHkuCisuYWwxbAorLmFsMmxlCisuYWwzbGVnCisuYWxsZWdoZTJuCisuYXI5azhhOG45czhhOHMuCisuYXJrYTJuCisuYXJrYW4yc2EyCisuYXJrYTJuMXMyCisuYXQ4cDlhOHM4ZS4KKy5hNHQxcAorLmF0MXBhCisuYXQ4cDlhOHM4ZThzLgorLmF0cGFzMWU0cworLmF1OHM5dDhyOGE4bDlhOHM4aThhOG4uCisuYTJ1cworLmF1czF0NHIKKy5hdXMxdHJhCisuYXVzdHJhbGFzMmkxYQorLmF1c3RyYWxhc2kyYTJuCisuYXU4dDhvOW04YTh0OGk5czhpOGU4cjl0OGU4ci4KKy5hdXRvbWEzdGlzCisuYXV0b21hdGlzMmllNAorLmF1dG9tYXRpc2llcnQzZXIKKy5iZTlkOGk4ZTluOHU4bjhnLgorLjRiZTJkCisuYjRlM2RpCisuYmU1ZGkzZW4KKy5iZWQyaWU0CisuYmVkaWUzbnU0bgorLmJlOG04YjhvLgorLjRiZTVtCisuYmU0bTViCisuYmk4YjlsOGk5bzlnOHI4YTlwOGg4aTlzOGM4aDhlLgorLmJpYmxpb2dyNGFwaGkKKy5iaWJsaW9ncmFwaDJpczFjCisuYmlibGlvZ3JhcGhpczNjaDIKKy5iaWJsaW9ncmFwaGlzY2hlMgorLmJvOHM5dDhvOG4uCisuNWJvczQKKy5ib3MxdG8KKy5ib3N0bzJuCisuYnI4bzh3OG45aThhOG4uCisuYnJvd241aQorLmJyb3czbjRpMWEKKy5icm93bmkzYTJuCisuYnI4dThuOHM5dzhpOGM4ay4KKy5icnUybgorLmJydTJuM3M0CisuYnJ1bjRzdzIKKy5icnVuc3dpMgorLmJydW5zd2ljazEKKy5idTlkOGE5cDhlOHM4dC4KKy5idTFkMmEKKy5jYThyOWk4YjliOGU4YThuLgorLmNhcjFpCisuY2FyNGliCisuY2FyaTJiMWIKKy5jYXJpYjJiZQorLmNhcmliYmVhMm4KKy5jaDhhOHI4bDhlOHM5dDhvOG4uCisuY2hhcjRsZTQKKy5jaGFyMWwKKy5jaGFybGVzMgorLmNoYXJsNGVzMnRvCisuY2hhcmxlM3N0bzJuCisuY2g4YThyOWw4bzh0OHQ4ZThzOXY4aThsOGw4ZS4KKy5jaGFyM2xvNAorLmNoYXJsbzR0M3QyCisuY2hhcmxvdDR0ZXMKKy5jaGFybG90dGU0c3YKKy5jaGFybG90dGVzMnZpbAorLmNoYXJsb3R0ZXN2aWwxbAorLmNoYXJsb3R0ZXN2aWwybGUKKy5jbzlsOHU4bTliOGk4YS4KKy5jb2x1bTRiaQorLmNvbHU0bTFiCisuY29sdW1iMmkxYQorLmN6OGU4YzhoOG85czhsOG85djhhOWs4aThhLgorLmMyemU0CisuY3plMmNoCisuY3plM2NobzIKKy5jemVjaG9zNGwyCisuY3plY2hvczRsb3YKKy5jemVjaG9zbG8xdmEKKy5jemVjaG9zbG92YWsxaQorLmN6ZWNob3Nsb3ZhazJpMWEKKy5kZThsOWE5dzhhOHI4ZS4KKy5kZTFsYQorLmRlNGxhdworLmRlbGF3MmEycgorLmRpOGo4azlzOHQ4cjhhLgorLmRpM2oKKy5kaWo0azFzMgorLmRpamtzdDRyCisuZGlqa3MxdHJhCisuZHU4YThuOGUuCisuZDF1MWEKKy5kdWEybgorLmR5OW44YTltOGk5czhjOGg4ZS4KKy41ZHluCisuZHkxbmEKKy5keW5hbTJpcworLmR5bmFtMmlzMWMKKy5keW5hbWlzM2NoMgorLmR5bmFtaXNjaGUyCisuZW44ZzlsOGk4czhoLgorLmVuZ2wyCisuZW5nbGlzMmgKKy5ldThsOGU4cjlpOGE4bi4KKy5ldWw0ZQorLmV1M2w0ZXIxaQorLmV1bGUxcjJpM2E0CisuZXVsZXJpMmEybgorLmV2OGE4bjlzOHQ4bzhuLgorLmUxdmEKKy5ldmEybgorLmV2YW40c3QKKy5ldmEybjFzMgorLmV2YW5zMXRvCisuZXZhbnN0bzJuCisuZmU4YjlyOHU5YThyOHkuCisuZjJlNGIKKy5mZTNicgorLmZlYnJ1M2EKKy5mZWJydTJhMnIKKy5mZThzOHQ5czhjOGg4cjhpOGY4dC4KKy5mZXM0dDFzMgorLmZlc3Q0c2MKKy5mZXN0czJjaDIKKy5mZXN0c2M0aHI0CisuZmVzdHNjaHI0aTJmdAorLmZsOG84cjlpOWQ4YS4KKy5mbG9yMmlkCisuZmxvcmkxZDJhCisuZmw4bzhyOWk5ZDlpOGE4bi4KKy5mbG9yaTJkaQorLmZsb3JpZDVpMmEybgorLmZsb3JpMWQ0aTNhCisuZm84cjlzOGM4aDh1OG44ZzhzOWk4bjlzOHQ4aTl0OHU4dC4KKy5mb3JzNGMKKy5mb3JzMmNoMgorLmZvcnNjaHVuZ3MyCisuZm9yc2NodW5nMnMxaW4KKy5mb3JzY2h1bmdzMmkybjFzMgorLmZvcnNjaHVuZ3NpbnN0MmkKKy5mb3JzY2h1bmdzaW5zdGkxdHUKKy5mcjhlOGU5YjhzOGQuCisuZnJlMmUxYgorLmZyZWUyYjVzMgorLmZyZWViNHM1ZAorLmZ1OG44azl0OHM4aThvOG44YThsLgorLjNmdQorLmZ1NG5rMgorLmZ1bms1dAorLmZ1bms0dDFzMgorLmZ1bmt0MXMyaW8KKy5mdW5rdDVzaW8ybgorLmZ1bmt0c2lvMW41YQorLmdhOHU4czhzOWk4YThuLgorLmdhMnVzCisuZ2F1MnNzCisuZ2F1czFzaQorLmdhdXNzMmkxYQorLmdhdXNzaTJhMm4KKy5naDhvOHM4dDlzOGM4cjhpOHA4dC4KKy5naG9zNHQxczIKKy5naG9zdDRzYworLmdob3N0c2NyaTIKKy5naG9zdHNjcjJpcAorLmdob3N0c2NyaTJwMXQKKy5naDhvOHM4dDl2OGk4ZTh3LgorLmdob3M0dHYKKy5naG9zdHYyaWU0CisuZ3I4YThzOHM5bThhOG44bjlpOGE4bi4KKy5ncjJhcworLmdyYTJzcworLmdyYXMyczFtCisuZ3Jhc3MzbWEKKy5ncmFzc21hMm4zCisuZ3Jhc3NtYTRuMW4yCisuZ3Jhc3NtYW4zbjRpMWEKKy5ncmFzc21hMm5uaTNhMm4KKy5ncjhlOGk4ZjhzOXc4YThsOGQuCisuZ3JlaTIKKy5ncmVpMmYzcworLmdyZWlmc3cyCisuZ3JlaWZzd2EybGQKKy5ncjhvOHQ4aDhlOG45ZDhpOGU4YzhrLgorLmc0cm8KKy5ncm80dGgyZQorLmdyNG90aAorLmdyb3RoZTJuCisuZ3JvdGhlbmQyaWU0CisuZ3JvdGhlbmRpZWNrMQorLmdyOHU4bjhkOWw4ZThoOXI4ZThuLgorLmdydTJuCisuZ3J1bmRsZTFoNAorLmdydW5kbGU0aHI0CisuaGE5ZDhhOW04YThyOGQuCisuaGEyZAorLmhhMWQyYQorLmhhZGEybTIKKy5oYWQ0YTFtYQorLmhhZGFtMmEycgorLmhhOGk5ZjhhLgorLmhhaTFmYQorLmhhOG04aThsOXQ4bzhuOWk4YThuLgorLmhhNG0KKy5oYW1pNGx0CisuaGFtaWwxdG8KKy5oYW1pbHRvMm4KKy5oYW1pbHRvM240aTFhCisuaGFtaWx0b25pM2EybgorLmhlOGw5czhpOG44azhpLgorLmhlMmwxczIKKy5oZWwyczFpbgorLmhlbHM0aTRuazIKKy5oZWxzaW5rMWkKKy5oZThyOW04aTh0OWk4YThuLgorLmhlcjNtaXQKKy5oZXJtaTF0aQorLmhlcm00aTF0MmkxYQorLmhlcm1pdGkyYTJuCisuaGk4YjhiOHMuCisuaGkyYjFiCisuaGliMmI1czIKKy5obzhrOWs4YThpOWQ4by4KKy5oMm9rCisuaG9razQKKy5ob2trYWkyCisuaG9ra2EyaWQKKy5ob2trYWkxZG8KKy5qYThjOWs4bzh3OXM4azhpLgorLjVqYQorLmphY2sxCisuamFja293c2syCisuamFja293c2sxaQorLmphOG45dTlhOHI4eS4KKy5qYTJuCisuamFuM3UxYQorLmphbnUyYTJyCisuamE5cDhhOW44ZThzOGUuCisuamE0cAorLmphMXBhCisuamFwYTJuCisuamFwYTFuZXMKKy5qYXBhbmUxczJlCisua2E4ZDlvOG05dDhzOGU4di4KKy5rYTJkCisua2ExZG8KKy5rYWRvNG10Cisua2Fkb200dDFzMgorLmthZG9tdDVzZXYKKy5rYThuOXM4YThzLgorLmthMm4KKy5rYW4yc2EyCisua2EybjFzMgorLmthOHI4bDhzOXI4dThoOGUuCisuazJhMnIKKy5rYXIxbAorLmthcjJsMXMyCisua2FybHMxcgorLmtvOHI5dDhlOXc4ZThnLgorLmtvNXIKKy5rcjhpOHM4aDhuOGEuCisua3IyaXMKKy5rcjNpczJoCisua3JpczJoMW4KKy5rcmlzaDFuYQorLmtyOGk4czhoOW44YTlpOHM4bS4KKy5rcmlzaG5haTIKKy5rcmlzaG5haTJzMW0KKy5rcjhpOHM4aDluOGE4bi4KKy5rcmlzaG4yYTJuCisubGE4bjljOGE4czl0OGU4ci4KKy5sYW4xY2EKKy5sYW5jYXN0NWVyCisubGU5ZzhlOG44ZDhyOGUuCisubGUxZ2VuCisubGVnZW4xZHIKKy5sZWdlbmRyZTQKKy5sZThpOGM4ZThzOXQ4ZThyLgorLmxlaTIKKy5sZTVpYworLmxlaWNlczV0CisubGk4cDlzOGM4aDhpOHQ4ei4KKy5sMmlwCisubGkycDFzMgorLmxpcHMyY2gyCisubGlwczNjaGl0CisubGlwc2NoaTR0egorLmxpOHA5czhjOGg4aTh0OHo5aThhOG4uCisubGlwc2NoaXQyejFpCisubGlwc2NoaXR6MmkxYQorLmxpcHNjaGl0emkyYTJuCisubG84ajliOGE4bi4KKy5sbzVqCisubG9qYmEybgorLmxvOHU5aTlzOGk5YThuOGEuCisubG91MgorLmxvMnVpMgorLmxvdWlzMmkxYQorLmxvdWlzaTJhMm4KKy5sb3Vpc2lhMW5hCisubWE4YzlvOHMuCisubWExY28KKy5tYThuOWM4aDhlOHM5dDhlOHIuCisubWFuMmNoCisubWFuY2hlMgorLm1hbmNoMWVzCisubWE4cjlrOG84djlpOGE4bi4KKy5tYXJrbzV2aTJhMm4KKy5tYXJrb3YyaTFhCisubWE4cjhrOHQ5bzhiOGU4cjlkOG84cjhmLgorLm1hcms1dAorLm1hcmsxdG8KKy5tYXJrdG8zYgorLm1hcmt0b2JlcjFkbworLm1hcmt0b2JlcmQ0b3IKKy5tYXJrdG9iZXJkb3IxZgorLm1hOHM4czlhOWM4aDh1OXM4ZTh0OHQ4cy4KKy5tYTJzcworLm1hczFzYTIKKy5tYXNzYTJjaAorLm1hc3NhY2gydXMKKy5tYXNzYWNodXNlNHQzdDIKKy5tYXNzYWNodXNldDR0MXMyCisubWE4eDl3OGU4bDhsLgorLm1heHdlbDRsCisubWk5YzhyOG85czhvOGY4dC4KKy5taWNybzJzbworLm1pY3Jvc28yZnQzCisubWk4bjluOGU5YThwOW85bDhpOHMuCisubTJpNG4xbjIKKy5taW5uZTQKKy5taW5uZWFwb2wyaQorLm1pOG45bjhlOXM4bzh0OGEuCisubWluMW5lcworLm1pbm5lMXNvCisubWlubmVzbzF0YQorLm1vOHM5YzhvOHcuCisubW9zMmMKKy5tb3MxY28KKy5uYThjOGg5cjhpOGM4aDh0OGU4bi4KKy4xbmEKKy5uYTJjaAorLm5hYzRocjQKKy5uYTJjaHI0aTJjaAorLm5hY2hyaWNodDFlbgorLm5hOHM4aDl2OGk4bDhsOGUuCisubjRhcworLm5hczJoCisubmFzaDJ2aWwKKy5uYXNodmlsMWwKKy5uYXNodmlsMmxlCisubmU4dDliOHM4ZC4KKy5uZTJ0MWIKKy5uZXQyYjVzMgorLm5ldGI0czVkCisubmU4dDlzOGM4YThwOGUuCisubmU0dDFzMgorLm5ldDRzYworLm5ldHNjYTRwCisubmV0czFjYQorLm5pOGo5bThlOWc4ZThuLgorLm5pM2oKKy5uaWptZTJnCisubmlqbWUxZ2VuCisubm84ZTl0OGg4ZThyOWk4YThuLgorLjNub2UKKy5ub2V0aDJlCisubm9ldGhlcjFpCisubm9ldGhlMXIyaTNhNAorLm5vZXRoZXJpMmEybgorLm5vOG84cjhkOXc4aThqOGs4ZThyOWg4bzh1OHQuCisubm9vMgorLm5vM29yZAorLm5vb3JkMXcKKy5ub29yZHdpMgorLm5vb3Jkd2kzagorLm5vb3Jkd2lqazFlcgorLm5vb3Jkd2lqa2VyMWg0Cisubm9vcmR3aWprZXJob3UyCisubm85djhlOG05YjhlOHIuCisubm92ZTRtNWIKKy5vcDhlOG45YjhzOGQuCisub3BlNG4xYjQKKy5vcGVuMmI1czIKKy5vcGVuYjRzNWQKKy5vcDhlOG45bzhmOGY4aThjOGUuCisub3A0ZW5vCisub3Blbm80ZjFmCisub3Blbm9mMWZpCisucGE4bDhhOXQ4aThuOG8uCisucGFsYTJ0MWluCisucGFsYXQyaTFubworLnBhOWw4ZThyOW04by4KKy5wYWxlcjNtNAorLnBhbGVyMW1vCisucGU5dDhyOG84djlzOGs4aS4KKy5wZXRybzN2CisucGV0cm92c2syCisucGV0cm92c2sxaQorLnBmOGE4ZjhmOWk4YThuLgorLjRwZgorLnAxZmEKKy5wZmEyZgorLnBmYTRmMWY0CisucGZhZjFmaQorLnBmYWZmMmkzYQorLnBmYWZmaTJhMm4KKy5waDhpOGw5YTlkOGU4bDlwOGg4aThhLgorLnBoaTRsNGFkZQorLnBoaWxhMmQKKy5waGlsYWRlMmxwCisucGhpbGFkZWw1cGhpCisucGhpbGFkZWxwaDJpMWEKKy5waDhpOGw5bzlzOG84cDhoOWk5czhjOGg4ZS4KKy5waGlsbzJzbworLnBoaWxvczRvcAorLnBoaWxvczJvcGgKKy5waGlsb3NvcGgyaXMxYworLnBoaWxvc29waGlzM2NoMgorLnBoaWxvc29waGlzY2hlMgorLnBvOGk4bjljOGE4cjhlLgorLnBvaW4yCisucG9pMgorLnBvaW5jMmEycjUKKy5wb2luMWNhCisucG85dDhlOG45dDhpOGE4bDlnOGw4ZThpOWM4aDh1OG44Zy4KKy5wNG90CisucG8xdGVuMXQKKy5wb3RlbnQyaQorLnBvdGVuMXQyaTFhCisucG90ZW50aTJhbAorLnBvdGVudGlhNGwxZzQKKy5wb3RlbnRpYWxnbDIKKy5wb3RlbnRpYWwxZ2xlCisucG90ZW50aWFsZ2xlaTIKKy5wb3RlbnRpYWxnbGU1aWMKKy5wb3RlbnRpYWxnbGU0aTJjaAorLnJhOWQ4aDhhOWs4cjhpOHM4aDluOGE4bi4KKy5yYWQxaDIKKy5yYWRoYWtyMmlzCisucmFkaGFrcjNpczJoCisucmFkaGFrcmlzMmgxbgorLnJhZGhha3Jpc2gxbmEKKy5yYWRoYWtyaXNobjJhMm4KKy5yYTh0OGg4czlrOGU4bDlsOGU4ci4KKy5yNGF0aAorLnJhMnQ0aDFzMgorLnJhdGhzazIKKy5yYXRoNHNrZQorLnJhdGhza2VsMWwKKy5yYXRoc2tlbDJsZQorLnJpOGU5bThhOG44bjlpOGE4bi4KKy5yMmllNAorLnJpZTVtYTJuCisucmllMW1hCisucmllbWE0bjFuMgorLnJpZW1hbjNuNGkxYQorLnJpZW1hMm5uaTNhMm4KKy5yeThkOWI4ZThyOGcuCisucnkxZAorLnJ5ZDFiCisucnlkYmVyZzIKKy5zYzhoOG84dDl0OGk4czhjOGg4ZS4KKy5zY2hvNHQzdDIKKy5zY2hvdHQyaXMxYworLnMyY2gyb3R0aXMzY2gyCisuc2Nob3R0aXNjaGUyCisuc2M4aDhyOG85ZDhpOG44ZzllOHIuCisuc2M0aHI0Cisuc2Nocm9kMWluCisuc2Nocm9kNGluZ2UKKy5zYzhoOHc4YTliOGE5YzhoOGU4ci4KKy5zY2gxdworLnNjaHdhYmEyY2gKKy5zY2h3YWJhY2hlMgorLnNjOGg4dzhhOHI4ejlzOGM4aDhpOGw4ZC4KKy5zY2h3MmEycgorLnMyY2h3YXJ6czJjaDIKKy5zY2h3YXJ6c2NoNGlsMgorLnNjaHdhcnpzY2hpMmxkCisuc2U4cDl0OGU4bTliOGU4ci4KKy5zZTJwMXQKKy5zZXAydGUKKy5zZXB0ZTRtNWIKKy5zdDhvOGs4ZThzOXM4YzhoOGUuCisuc3Qyb2sKKy5zdG9rZXM0Cisuc3RvazJlMnNzCisuc3Rva2VzMnM1YworLnN0b2tlc3MyY2gyCisuc3Rva2Vzc2NoZTIKKy5zdDh1OHQ4dDlnOGE4cjh0LgorLnN0dTR0M3QyCisuc3R1dDR0MWcKKy5zdHV0dDFnYQorLnN0dXR0ZzJhMnIKKy5zdThzOXE4dThlOWg4YThuOW44YS4KKy5zMnVzCisuc3VzcXUyCisuc3VzcXVlMWg0Cisuc3VzcXVlaGEybgorLnN1c3F1ZWhhNG4xbjIKKy5zdXNxdWVoYW4xbmEKKy50YTh1OWI4ZThyOWk4YThuLgorLnRhdTRiCisudGF1YjRlCisudGF1M2JlcgorLnRhdWJlcjFpCisudGF1YmUxcjJpM2E0CisudGF1YmVyaTJhMm4KKy50ZThjOGg5bjhpOXM4YzhoOGUuCisudGUyY2gKKy50ZWMyaDFuCisudGVjaG4yaXMxYworLnRlMmNobmlzM2NoMgorLnRlY2huaXNjaGUyCisudGU4bjluOGU4czlzOGU4ZS4KKy50NGU0bjFuMgorLnRlbm5lNAorLnRlbjFuZXMKKy50ZW5uMmUyc3MKKy50bzltOGE5czh6OGU4dzlzOGs4aS4KKy50bzJtYQorLnRvbWFzMnplCisudG9tYXN6ZXdzazIKKy50b21hc3pld3NrMWkKKy50eTlwOG85ZzhyOGE4cDhoOGk4cTh1OGUuCisudHkzcG8KKy50eTVwbzRnCisudHlwbzFncgorLnR5cG9ncjRhcGhpCisudHlwb2dyYXBoaXF1MgorLnVrOHI4YThpOG45aThhOG4uCisuNHVrCisudWtyMmFpMgorLnVrcmE0aTRuCisudWtyYTJpbmkKKy51a3JhaTRuNGkxYQorLnVrcmFpbmkzYTJuCisudmU4cjlhOGw4bDlnOGU5bThlOGk4bjllOHI4dDhlLgorLnZlcmFsMWwKKy52ZXJhbDRsMWc0CisudmVyYWxsZ2UxbWUKKy52ZXJhbGxnZW1laTIKKy52ZXJhbGxnZW1lMmluZQorLnZlcmFsbGdlbWVpbjFlcgorLnZlOHI5ZThpOG45aTlnOHU4bjhnLgorLnZlcmUzaW4KKy52ZXJlaTIKKy52ZXJlMmluaQorLnZlcmVpbjJpZworLnZlcmVpbmkzZ3VuCisudmU4cjl0OGU4aTlsOHU4bjlnOGU4bi4KKy52ZXJ0ZWkyCisudmVydGVpbHVuMWdlbgorLnZpOGk4aTh0OGguCisudjRpNWk0Cisudmk0aTVpNAorLnZpaTJpdGgKKy52aThpOHQ4aC4KKy52aTJpdGgKKy53YThoOHI5czhjOGg4ZThpOG45bDhpOGM4aDlrOGU4aTh0OHM5dDhoOGU4bzlyOGk4ZS4KKy53YTRocjQKKy53YWg0cnMyCisud2FocnM0YworLndhaHJzMmNoMgorLndhaHJzY2hlMgorLndhaHJzY2hlaTIKKy53YWhyc2NoZTRpNG4xbAorLndhaHJzMmNoZWlubDRpMmNoCisud2FocnNjaGVpbmxpYzRoaworLndhaHJzY2hlaW5saWNoa2VpMgorLndhaHJzY2hlaW5saWNoa2VpNHQxczIKKy53YWhyc2NoZWlubGljaGtlaXRzM3RoMmUKKy53YWhyc2NoZWlubGljaGtlaXRzdGhlMW81cgorLndhaHJzY2hlaW5saWNoa2VpdHN0aGVvcjJpZTQKKy53ZThyOW44ZThyLgorLncxZXIKKy53ZXI0bjFlcgorLndlOHI5dDhoOGU4cjlpOGE4bi4KKy53ZXJ0aDJlCisud2VydGhlcjFpCisud2VydGhlMXIyaTNhNAorLndlcnRoZXJpMmEybgorLndpOG45YzhoOGU4czl0OGU4ci4KKy53aW4yY2gKKy53aW5jaGUyCisud2luY2gxZXMKKy53aThyOHQ5czhjOGg4YThmOHQuCisudzRpcjQKKy53aXI0dDFzMgorLndpcnQ0c2MKKy53aXJ0czJjaDIKKy53aXJ0c2NoYTJmCisud2lydHNjaGEyZnQKKy53aThzOXM4ZThuOXM4YzhoOGE4Zjh0OWw4aThjOGguCisudzRpMnMxcworLndpc3NlbjQKKy53aXNzZTJuMXMyCisud2lzc2VuczRjCisud2lzc2VuczJjaDIKKy53aXNzZW5zY2hhMmYKKy53aXNzZW5zY2hhMmZ0Cisud2lzc2Vuc2NoYWYydGwKKy53aXNzZW5zMmNoYWZ0bDRpMmNoCisueHY4aThpOGk4dDhoLgorLnh2NGk1aTQKKy54dmk0aTVpNAorLnh2aWkyaXRoCisueHY4aThpOHQ4aC4KKy54dmkyaXRoCisueHg4aThpOGk4cjhkLgorLnh4NAorLnh4M2kKKy54eDRpNWk0CisueHhpNGk1aTQKKy54eGlpNGlyCisueHg4aThpOG44ZC4KKy54eGk0aW5kCisueWk4bjhnOXk4bzhuOGcuCisueTFpCisueWluMmd5CisueWluZ3kxbzQKKy55aW5neW8ybgorLnNoOHU5eDh1OGUuCisuc2h1eDF1MworLmppOXM4dThhOG4uCisuamkyc3UKKy5qaXN1YTJuCisuemU4YTlsOGE4bjhkLgorLjJ6ZQorLnplYTRsCisuemVhM2w0YW5kCisuemVhbGEybgorLnplOGk4dDlzOGM4aDhyOGk4Zjh0LgorLnplaTIKKy56ZWk0dDFzMgorLnplaXQ0c2MKKy56ZWl0czJjaDIKKy56ZWl0c2M0aHI0CisuemVpdHNjaHI0aTJmdApkaWZmIC0tZ2l0IGEvY29yZS9yZXMvYXNzZXRzL3dlYmtpdC9pbmNvZ25pdG9fbW9kZV9zdGFydF9wYWdlLmh0bWwgYi9jb3JlL3Jlcy9hc3NldHMvd2Via2l0L2luY29nbml0b19tb2RlX3N0YXJ0X3BhZ2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDcwYzZkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvYXNzZXRzL3dlYmtpdC9pbmNvZ25pdG9fbW9kZV9zdGFydF9wYWdlLmh0bWwKQEAgLTAsMCArMSwyNCBAQAorPGh0bWw+CisgIDxoZWFkPgorICAgIDxtZXRhIG5hbWU9InZpZXdwb3J0IiBjb250ZW50PSJ3aWR0aD1kZXZpY2Utd2lkdGgsIGluaXRpYWwtc2NhbGU9MS4wLCB1c2VyLXNjYWxhYmxlPW5vIi8+CisgICAgPHRpdGxlPk5ldyBpbmNvZ25pdG8gd2luZG93PC90aXRsZT4KKyAgPC9oZWFkPgorICA8Ym9keT4KKyAgICA8cD48c3Ryb25nPllvdSd2ZSBnb25lIGluY29nbml0bzwvc3Ryb25nPi4gUGFnZXMgeW91IHZpZXcgaW4gdGhpcyB3aW5kb3cKKyAgICAgIHdvbid0IGFwcGVhciBpbiB5b3VyIGJyb3dzZXIgaGlzdG9yeSBvciBzZWFyY2ggaGlzdG9yeSwgYW5kIHRoZXkgd29uJ3QKKyAgICAgIGxlYXZlIG90aGVyIHRyYWNlcywgbGlrZSBjb29raWVzLCBvbiB5b3VyIGNvbXB1dGVyIGFmdGVyIHlvdSBjbG9zZSB0aGUKKyAgICAgIGluY29nbml0byB3aW5kb3cuIEFueSBmaWxlcyB5b3UgZG93bmxvYWQgb3IgYm9va21hcmtzIHlvdSBjcmVhdGUgd2lsbCBiZQorICAgICAgcHJlc2VydmVkLCBob3dldmVyLjwvcD4KKworICAgIDxwPjxzdHJvbmc+R29pbmcgaW5jb2duaXRvIGRvZXNuJ3QgYWZmZWN0IHRoZSBiZWhhdmlvciBvZiBvdGhlciBwZW9wbGUsCisJc2VydmVycywgb3Igc29mdHdhcmUuIEJlIHdhcnkgb2Y6PC9zdHJvbmc+PC9wPgorCisgICAgPHVsPgorICAgICAgPGxpPldlYnNpdGVzIHRoYXQgY29sbGVjdCBvciBzaGFyZSBpbmZvcm1hdGlvbiBhYm91dCB5b3U8L2xpPgorICAgICAgPGxpPkludGVybmV0IHNlcnZpY2UgcHJvdmlkZXJzIG9yIGVtcGxveWVycyB0aGF0IHRyYWNrIHRoZSBwYWdlcyB5b3UgdmlzaXQ8L2xpPgorICAgICAgPGxpPk1hbGljaW91cyBzb2Z0d2FyZSB0aGF0IHRyYWNrcyB5b3VyIGtleXN0cm9rZXMgaW4gZXhjaGFuZ2UgZm9yIGZyZWUgc21pbGV5czwvbGk+CisgICAgICA8bGk+U3VydmVpbGxhbmNlIGJ5IHNlY3JldCBhZ2VudHM8L2xpPgorICAgICAgPGxpPlBlb3BsZSBzdGFuZGluZyBiZWhpbmQgeW91PC9saT4KKyAgICA8L3VsPgorICA8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvYW5pbS9hbmltYXRvcl9mYWRlX2luLnhtbCBiL2NvcmUvcmVzL3Jlcy9hbmltL2FuaW1hdG9yX2ZhZGVfaW4ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkNTA0MmYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvYW5pbS9hbmltYXRvcl9mYWRlX2luLnhtbApAQCAtMCwwICsxLDI2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorLyoKKyoqIENvcHlyaWdodCAyMDEwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLS0+CisKKzxwcm9wZXJ0eSB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDppbnRlcnBvbGF0b3I9IkBhbmltL2FjY2VsZXJhdGVfaW50ZXJwb2xhdG9yIgorICAgIGFuZHJvaWQ6dmFsdWVGcm9tPSIwIgorICAgIGFuZHJvaWQ6dmFsdWVUbz0iMSIKKyAgICBhbmRyb2lkOnByb3BlcnR5TmFtZT0iYWxwaGEiCisgICAgYW5kcm9pZDpkdXJhdGlvbj0iQGFuZHJvaWQ6aW50ZWdlci9jb25maWdfbWVkaXVtQW5pbVRpbWUiCisvPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2FuaW0vYW5pbWF0b3JfZmFkZV9vdXQueG1sIGIvY29yZS9yZXMvcmVzL2FuaW0vYW5pbWF0b3JfZmFkZV9vdXQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmYjVkOWMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvYW5pbS9hbmltYXRvcl9mYWRlX291dC54bWwKQEAgLTAsMCArMSwyNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKy8qCisqKiBDb3B5cmlnaHQgMjAxMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorCis8cHJvcGVydHkgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6aW50ZXJwb2xhdG9yPSJAYW5pbS9hY2NlbGVyYXRlX2ludGVycG9sYXRvciIKKyAgICBhbmRyb2lkOnZhbHVlRnJvbT0iMS4wIgorICAgIGFuZHJvaWQ6dmFsdWVUbz0iMC4wIgorICAgIGFuZHJvaWQ6cHJvcGVydHlOYW1lPSJhbHBoYSIKKyAgICBhbmRyb2lkOmR1cmF0aW9uPSJAYW5kcm9pZDppbnRlZ2VyL2NvbmZpZ19tZWRpdW1BbmltVGltZSIKKy8+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvYW5pbS9mcmFnbWVudF9jbG9zZV9lbnRlci54bWwgYi9jb3JlL3Jlcy9yZXMvYW5pbS9mcmFnbWVudF9jbG9zZV9lbnRlci54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQwOTFlOAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9hbmltL2ZyYWdtZW50X2Nsb3NlX2VudGVyLnhtbApAQCAtMCwwICsxLDQ4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorLyoKKyoqIENvcHlyaWdodCAyMDEwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLS0+Cis8c2VxdWVuY2VyIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisgICAgPHByb3BlcnR5CisgICAgICAgIGFuZHJvaWQ6aW50ZXJwb2xhdG9yPSJAYW5pbS9kZWNlbGVyYXRlX2ludGVycG9sYXRvciIKKyAgICAgICAgYW5kcm9pZDp2YWx1ZUZyb209IjIiCisgICAgICAgIGFuZHJvaWQ6dmFsdWVUbz0iMSIKKyAgICAgICAgYW5kcm9pZDp2YWx1ZVR5cGU9ImZsb2F0VHlwZSIKKyAgICAgICAgYW5kcm9pZDpwcm9wZXJ0eU5hbWU9InNjYWxlWCIKKyAgICAgICAgYW5kcm9pZDpkdXJhdGlvbj0iQGFuZHJvaWQ6aW50ZWdlci9jb25maWdfbWVkaXVtQW5pbVRpbWUiLz4KKyAgICA8cHJvcGVydHkKKyAgICAgICAgYW5kcm9pZDppbnRlcnBvbGF0b3I9IkBhbmltL2RlY2VsZXJhdGVfaW50ZXJwb2xhdG9yIgorICAgICAgICBhbmRyb2lkOnZhbHVlRnJvbT0iMiIKKyAgICAgICAgYW5kcm9pZDp2YWx1ZVRvPSIxIgorICAgICAgICBhbmRyb2lkOnZhbHVlVHlwZT0iZmxvYXRUeXBlIgorICAgICAgICBhbmRyb2lkOnByb3BlcnR5TmFtZT0ic2NhbGVZIgorICAgICAgICBhbmRyb2lkOmR1cmF0aW9uPSJAYW5kcm9pZDppbnRlZ2VyL2NvbmZpZ19tZWRpdW1BbmltVGltZSIvPgorICAgIDxwcm9wZXJ0eQorICAgICAgICBhbmRyb2lkOmludGVycG9sYXRvcj0iQGFuaW0vZGVjZWxlcmF0ZV9pbnRlcnBvbGF0b3IiCisgICAgICAgIGFuZHJvaWQ6dmFsdWVGcm9tPSIwIgorICAgICAgICBhbmRyb2lkOnZhbHVlVG89IjEiCisgICAgICAgIGFuZHJvaWQ6dmFsdWVUeXBlPSJmbG9hdFR5cGUiCisgICAgICAgIGFuZHJvaWQ6cHJvcGVydHlOYW1lPSJhbHBoYSIKKyAgICAgICAgYW5kcm9pZDpkdXJhdGlvbj0iQGFuZHJvaWQ6aW50ZWdlci9jb25maWdfbWVkaXVtQW5pbVRpbWUiLz4KKyAgICA8cHJvcGVydHkKKyAgICAgICAgYW5kcm9pZDppbnRlcnBvbGF0b3I9IkBhbmltL2RlY2VsZXJhdGVfaW50ZXJwb2xhdG9yIgorICAgICAgICBhbmRyb2lkOnZhbHVlRnJvbT0iLTQwMCIKKyAgICAgICAgYW5kcm9pZDp2YWx1ZVRvPSIwIgorICAgICAgICBhbmRyb2lkOnZhbHVlVHlwZT0iZmxvYXRUeXBlIgorICAgICAgICBhbmRyb2lkOnByb3BlcnR5TmFtZT0idHJhbnNsYXRpb25YIgorICAgICAgICBhbmRyb2lkOmR1cmF0aW9uPSJAYW5kcm9pZDppbnRlZ2VyL2NvbmZpZ19tZWRpdW1BbmltVGltZSIvPgorPC9zZXF1ZW5jZXI+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2FuaW0vZnJhZ21lbnRfY2xvc2VfZXhpdC54bWwgYi9jb3JlL3Jlcy9yZXMvYW5pbS9mcmFnbWVudF9jbG9zZV9leGl0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTJjZDIyCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2FuaW0vZnJhZ21lbnRfY2xvc2VfZXhpdC54bWwKQEAgLTAsMCArMSw0OCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKy8qCisqKiBDb3B5cmlnaHQgMjAxMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorPHNlcXVlbmNlciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorICAgIDxwcm9wZXJ0eQorICAgICAgICBhbmRyb2lkOmludGVycG9sYXRvcj0iQGFuaW0vYWNjZWxlcmF0ZV9pbnRlcnBvbGF0b3IiCisgICAgICAgIGFuZHJvaWQ6dmFsdWVGcm9tPSIxIgorICAgICAgICBhbmRyb2lkOnZhbHVlVG89Ii41IgorICAgICAgICBhbmRyb2lkOnZhbHVlVHlwZT0iZmxvYXRUeXBlIgorICAgICAgICBhbmRyb2lkOnByb3BlcnR5TmFtZT0ic2NhbGVYIgorICAgICAgICBhbmRyb2lkOmR1cmF0aW9uPSJAYW5kcm9pZDppbnRlZ2VyL2NvbmZpZ19tZWRpdW1BbmltVGltZSIvPgorICAgIDxwcm9wZXJ0eQorICAgICAgICBhbmRyb2lkOmludGVycG9sYXRvcj0iQGFuaW0vYWNjZWxlcmF0ZV9pbnRlcnBvbGF0b3IiCisgICAgICAgIGFuZHJvaWQ6dmFsdWVGcm9tPSIxIgorICAgICAgICBhbmRyb2lkOnZhbHVlVG89Ii41IgorICAgICAgICBhbmRyb2lkOnZhbHVlVHlwZT0iZmxvYXRUeXBlIgorICAgICAgICBhbmRyb2lkOnByb3BlcnR5TmFtZT0ic2NhbGVZIgorICAgICAgICBhbmRyb2lkOmR1cmF0aW9uPSJAYW5kcm9pZDppbnRlZ2VyL2NvbmZpZ19tZWRpdW1BbmltVGltZSIvPgorICAgIDxwcm9wZXJ0eQorICAgICAgICBhbmRyb2lkOmludGVycG9sYXRvcj0iQGFuaW0vYWNjZWxlcmF0ZV9pbnRlcnBvbGF0b3IiCisgICAgICAgIGFuZHJvaWQ6dmFsdWVGcm9tPSIxIgorICAgICAgICBhbmRyb2lkOnZhbHVlVG89IjAiCisgICAgICAgIGFuZHJvaWQ6dmFsdWVUeXBlPSJmbG9hdFR5cGUiCisgICAgICAgIGFuZHJvaWQ6cHJvcGVydHlOYW1lPSJhbHBoYSIKKyAgICAgICAgYW5kcm9pZDpkdXJhdGlvbj0iQGFuZHJvaWQ6aW50ZWdlci9jb25maWdfbWVkaXVtQW5pbVRpbWUiLz4KKyAgICA8cHJvcGVydHkKKyAgICAgICAgYW5kcm9pZDppbnRlcnBvbGF0b3I9IkBhbmltL2FjY2VsZXJhdGVfaW50ZXJwb2xhdG9yIgorICAgICAgICBhbmRyb2lkOnZhbHVlRnJvbT0iMCIKKyAgICAgICAgYW5kcm9pZDp2YWx1ZVRvPSI0MDAiCisgICAgICAgIGFuZHJvaWQ6dmFsdWVUeXBlPSJmbG9hdFR5cGUiCisgICAgICAgIGFuZHJvaWQ6cHJvcGVydHlOYW1lPSJ0cmFuc2xhdGlvblgiCisgICAgICAgIGFuZHJvaWQ6ZHVyYXRpb249IkBhbmRyb2lkOmludGVnZXIvY29uZmlnX21lZGl1bUFuaW1UaW1lIi8+Cis8L3NlcXVlbmNlcj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvYW5pbS9mcmFnbWVudF9vcGVuX2VudGVyLnhtbCBiL2NvcmUvcmVzL3Jlcy9hbmltL2ZyYWdtZW50X29wZW5fZW50ZXIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4OTAwMWMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvYW5pbS9mcmFnbWVudF9vcGVuX2VudGVyLnhtbApAQCAtMCwwICsxLDQ2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorLyoKKyoqIENvcHlyaWdodCAyMDEwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLS0+Cis8c2VxdWVuY2VyIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisgICAgPHByb3BlcnR5CisgICAgICAgIGFuZHJvaWQ6aW50ZXJwb2xhdG9yPSJAYW5pbS9kZWNlbGVyYXRlX2ludGVycG9sYXRvciIKKyAgICAgICAgYW5kcm9pZDp2YWx1ZUZyb209IjIiCisgICAgICAgIGFuZHJvaWQ6dmFsdWVUbz0iMSIKKyAgICAgICAgYW5kcm9pZDp2YWx1ZVR5cGU9ImZsb2F0VHlwZSIKKyAgICAgICAgYW5kcm9pZDpwcm9wZXJ0eU5hbWU9InNjYWxlWCIKKyAgICAgICAgYW5kcm9pZDpkdXJhdGlvbj0iQGFuZHJvaWQ6aW50ZWdlci9jb25maWdfbWVkaXVtQW5pbVRpbWUiLz4KKyAgICA8cHJvcGVydHkKKyAgICAgICAgYW5kcm9pZDppbnRlcnBvbGF0b3I9IkBhbmltL2RlY2VsZXJhdGVfaW50ZXJwb2xhdG9yIgorICAgICAgICBhbmRyb2lkOnZhbHVlRnJvbT0iMiIKKyAgICAgICAgYW5kcm9pZDp2YWx1ZVRvPSIxIgorICAgICAgICBhbmRyb2lkOnZhbHVlVHlwZT0iZmxvYXRUeXBlIgorICAgICAgICBhbmRyb2lkOnByb3BlcnR5TmFtZT0ic2NhbGVZIgorICAgICAgICBhbmRyb2lkOmR1cmF0aW9uPSJAYW5kcm9pZDppbnRlZ2VyL2NvbmZpZ19tZWRpdW1BbmltVGltZSIvPgorICAgIDxwcm9wZXJ0eQorICAgICAgICBhbmRyb2lkOnZhbHVlRnJvbT0iMCIKKyAgICAgICAgYW5kcm9pZDp2YWx1ZVRvPSIxIgorICAgICAgICBhbmRyb2lkOnZhbHVlVHlwZT0iZmxvYXRUeXBlIgorICAgICAgICBhbmRyb2lkOnByb3BlcnR5TmFtZT0iYWxwaGEiCisgICAgICAgIGFuZHJvaWQ6ZHVyYXRpb249IkBhbmRyb2lkOmludGVnZXIvY29uZmlnX21lZGl1bUFuaW1UaW1lIi8+CisgICAgPHByb3BlcnR5CisgICAgICAgIGFuZHJvaWQ6dmFsdWVGcm9tPSI0MDAiCisgICAgICAgIGFuZHJvaWQ6dmFsdWVUbz0iMCIKKyAgICAgICAgYW5kcm9pZDp2YWx1ZVR5cGU9ImZsb2F0VHlwZSIKKyAgICAgICAgYW5kcm9pZDpwcm9wZXJ0eU5hbWU9InRyYW5zbGF0aW9uWCIKKyAgICAgICAgYW5kcm9pZDpkdXJhdGlvbj0iQGFuZHJvaWQ6aW50ZWdlci9jb25maWdfbWVkaXVtQW5pbVRpbWUiLz4KKzwvc2VxdWVuY2VyPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9hbmltL2ZyYWdtZW50X29wZW5fZXhpdC54bWwgYi9jb3JlL3Jlcy9yZXMvYW5pbS9mcmFnbWVudF9vcGVuX2V4aXQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyN2ZlNGYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvYW5pbS9mcmFnbWVudF9vcGVuX2V4aXQueG1sCkBAIC0wLDAgKzEsNDYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisvKgorKiogQ29weXJpZ2h0IDIwMTAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKzxzZXF1ZW5jZXIgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8cHJvcGVydHkKKyAgICAgICAgYW5kcm9pZDppbnRlcnBvbGF0b3I9IkBhbmltL2FjY2VsZXJhdGVfaW50ZXJwb2xhdG9yIgorICAgICAgICBhbmRyb2lkOnZhbHVlRnJvbT0iMSIKKyAgICAgICAgYW5kcm9pZDp2YWx1ZVRvPSIyIgorICAgICAgICBhbmRyb2lkOnZhbHVlVHlwZT0iZmxvYXRUeXBlIgorICAgICAgICBhbmRyb2lkOnByb3BlcnR5TmFtZT0ic2NhbGVYIgorICAgICAgICBhbmRyb2lkOmR1cmF0aW9uPSJAYW5kcm9pZDppbnRlZ2VyL2NvbmZpZ19tZWRpdW1BbmltVGltZSIvPgorICAgIDxwcm9wZXJ0eQorICAgICAgICBhbmRyb2lkOmludGVycG9sYXRvcj0iQGFuaW0vYWNjZWxlcmF0ZV9pbnRlcnBvbGF0b3IiCisgICAgICAgIGFuZHJvaWQ6dmFsdWVGcm9tPSIxIgorICAgICAgICBhbmRyb2lkOnZhbHVlVG89IjIiCisgICAgICAgIGFuZHJvaWQ6dmFsdWVUeXBlPSJmbG9hdFR5cGUiCisgICAgICAgIGFuZHJvaWQ6cHJvcGVydHlOYW1lPSJzY2FsZVkiCisgICAgICAgIGFuZHJvaWQ6ZHVyYXRpb249IkBhbmRyb2lkOmludGVnZXIvY29uZmlnX21lZGl1bUFuaW1UaW1lIi8+CisgICAgPHByb3BlcnR5CisgICAgICAgIGFuZHJvaWQ6dmFsdWVGcm9tPSIxIgorICAgICAgICBhbmRyb2lkOnZhbHVlVG89IjAiCisgICAgICAgIGFuZHJvaWQ6dmFsdWVUeXBlPSJmbG9hdFR5cGUiCisgICAgICAgIGFuZHJvaWQ6cHJvcGVydHlOYW1lPSJhbHBoYSIKKyAgICAgICAgYW5kcm9pZDpkdXJhdGlvbj0iQGFuZHJvaWQ6aW50ZWdlci9jb25maWdfbWVkaXVtQW5pbVRpbWUiLz4KKyAgICA8cHJvcGVydHkKKyAgICAgICAgYW5kcm9pZDp2YWx1ZUZyb209IjAiCisgICAgICAgIGFuZHJvaWQ6dmFsdWVUbz0iLTQwMCIKKyAgICAgICAgYW5kcm9pZDp2YWx1ZVR5cGU9ImZsb2F0VHlwZSIKKyAgICAgICAgYW5kcm9pZDpwcm9wZXJ0eU5hbWU9InRyYW5zbGF0aW9uWCIKKyAgICAgICAgYW5kcm9pZDpkdXJhdGlvbj0iQGFuZHJvaWQ6aW50ZWdlci9jb25maWdfbWVkaXVtQW5pbVRpbWUiLz4KKzwvc2VxdWVuY2VyPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9hbmltL3B1c2hfZG93bl9pbl9ub19hbHBoYS54bWwgYi9jb3JlL3Jlcy9yZXMvYW5pbS9wdXNoX2Rvd25faW5fbm9fYWxwaGEueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0NWQ2OTEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvYW5pbS9wdXNoX2Rvd25faW5fbm9fYWxwaGEueG1sCkBAIC0wLDAgKzEsMjAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxzZXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKwk8dHJhbnNsYXRlIGFuZHJvaWQ6ZnJvbVlEZWx0YT0iLTEwMCVwIiBhbmRyb2lkOnRvWURlbHRhPSIwIgorICAgICAgICAgICAgYW5kcm9pZDpkdXJhdGlvbj0iQGFuZHJvaWQ6aW50ZWdlci9jb25maWdfbG9uZ0FuaW1UaW1lIi8+Cis8L3NldD4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9hbmltL3B1c2hfZG93bl9vdXRfbm9fYWxwaGEueG1sIGIvY29yZS9yZXMvcmVzL2FuaW0vcHVzaF9kb3duX291dF9ub19hbHBoYS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2MyNDc0YQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9hbmltL3B1c2hfZG93bl9vdXRfbm9fYWxwaGEueG1sCkBAIC0wLDAgKzEsMjAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxzZXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKwk8dHJhbnNsYXRlIGFuZHJvaWQ6ZnJvbVlEZWx0YT0iMCIgYW5kcm9pZDp0b1lEZWx0YT0iMTAwJXAiCisgICAgICAgICAgICBhbmRyb2lkOmR1cmF0aW9uPSJAYW5kcm9pZDppbnRlZ2VyL2NvbmZpZ19sb25nQW5pbVRpbWUiLz4KKzwvc2V0PgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWVuLWhkcGkvc3ltX2tleWJvYXJkX2ZlZWRiYWNrX2RlbGV0ZS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtZW4taGRwaS9zeW1fa2V5Ym9hcmRfZmVlZGJhY2tfZGVsZXRlLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2E3NjM3NS4uMDAwMDAwMAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtZW4taGRwaS9zeW1fa2V5Ym9hcmRfZmVlZGJhY2tfZGVsZXRlLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vZmZfZGlzYWJsZV9mb2N1c2VkX2hvbG9fZGFyay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb2ZmX2Rpc2FibGVfZm9jdXNlZF9ob2xvX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3MmUyYjkKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb2ZmX2Rpc2FibGVfZm9jdXNlZF9ob2xvX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vZmZfZGlzYWJsZV9mb2N1c2VkX2hvbG9fbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29mZl9kaXNhYmxlX2ZvY3VzZWRfaG9sb19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQwYTA0NAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vZmZfZGlzYWJsZV9mb2N1c2VkX2hvbG9fbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vZmZfZGlzYWJsZV9ob2xvX2RhcmsucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29mZl9kaXNhYmxlX2hvbG9fZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDcyZTJiOQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vZmZfZGlzYWJsZV9ob2xvX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vZmZfZGlzYWJsZV9ob2xvX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vZmZfZGlzYWJsZV9ob2xvX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDBhMDQ0Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29mZl9kaXNhYmxlX2hvbG9fbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vZmZfaG9sb19kYXJrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vZmZfaG9sb19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTFlMWFhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29mZl9ob2xvX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vZmZfaG9sb19saWdodC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb2ZmX2hvbG9fbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjYTNjNTYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb2ZmX2hvbG9fbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vZmZfcHJlc3NlZF9ob2xvX2RhcmsucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29mZl9wcmVzc2VkX2hvbG9fZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDhmNDE4MQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vZmZfcHJlc3NlZF9ob2xvX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vZmZfcHJlc3NlZF9ob2xvX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vZmZfcHJlc3NlZF9ob2xvX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzc1NGRkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29mZl9wcmVzc2VkX2hvbG9fbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vZmZfc2VsZWN0ZWRfaG9sb19kYXJrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vZmZfc2VsZWN0ZWRfaG9sb19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjRmMTAyCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29mZl9zZWxlY3RlZF9ob2xvX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vZmZfc2VsZWN0ZWRfaG9sb19saWdodC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb2ZmX3NlbGVjdGVkX2hvbG9fbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4NTA2YmYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb2ZmX3NlbGVjdGVkX2hvbG9fbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vbl9kaXNhYmxlX2ZvY3VzZWRfaG9sb19kYXJrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vbl9kaXNhYmxlX2ZvY3VzZWRfaG9sb19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODA1NDU4Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29uX2Rpc2FibGVfZm9jdXNlZF9ob2xvX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vbl9kaXNhYmxlX2ZvY3VzZWRfaG9sb19saWdodC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb25fZGlzYWJsZV9mb2N1c2VkX2hvbG9fbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlMjY4ZDUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb25fZGlzYWJsZV9mb2N1c2VkX2hvbG9fbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vbl9kaXNhYmxlX2hvbG9fZGFyay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb25fZGlzYWJsZV9ob2xvX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4MDU0NTgKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb25fZGlzYWJsZV9ob2xvX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vbl9kaXNhYmxlX2hvbG9fbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29uX2Rpc2FibGVfaG9sb19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGUyNjhkNQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vbl9kaXNhYmxlX2hvbG9fbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vbl9ob2xvX2RhcmsucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29uX2hvbG9fZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU0MWM2NwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vbl9ob2xvX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vbl9ob2xvX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vbl9ob2xvX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjhjNGFmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29uX2hvbG9fbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vbl9wcmVzc2VkX2hvbG9fZGFyay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb25fcHJlc3NlZF9ob2xvX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3ZTM5NTMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb25fcHJlc3NlZF9ob2xvX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vbl9wcmVzc2VkX2hvbG9fbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29uX3ByZXNzZWRfaG9sb19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmMyOWU0NgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vbl9wcmVzc2VkX2hvbG9fbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vbl9zZWxlY3RlZF9ob2xvX2RhcmsucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29uX3NlbGVjdGVkX2hvbG9fZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTBiZWFjNAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vbl9zZWxlY3RlZF9ob2xvX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vbl9zZWxlY3RlZF9ob2xvX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vbl9zZWxlY3RlZF9ob2xvX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZGY0NWM3Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29uX3NlbGVjdGVkX2hvbG9fbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19vZmZfaG9sb19kYXJrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19vZmZfaG9sb19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDFjOTdkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX29mZl9ob2xvX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19vZmZfaG9sb19saWdodC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fb2ZmX2hvbG9fbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1N2M4ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fb2ZmX2hvbG9fbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19vZmZfcHJlc3NlZF9ob2xvX2RhcmsucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX29mZl9wcmVzc2VkX2hvbG9fZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWU2ZWYyYgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19vZmZfcHJlc3NlZF9ob2xvX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19vZmZfcHJlc3NlZF9ob2xvX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19vZmZfcHJlc3NlZF9ob2xvX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDJiZjExCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX29mZl9wcmVzc2VkX2hvbG9fbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19vZmZfc2VsZWN0ZWRfaG9sb19kYXJrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19vZmZfc2VsZWN0ZWRfaG9sb19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTFhZTg1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX29mZl9zZWxlY3RlZF9ob2xvX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19vZmZfc2VsZWN0ZWRfaG9sb19saWdodC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fb2ZmX3NlbGVjdGVkX2hvbG9fbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4YmQxZGYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fb2ZmX3NlbGVjdGVkX2hvbG9fbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19vbl9ob2xvX2RhcmsucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX29uX2hvbG9fZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWIwZGJlOAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19vbl9ob2xvX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19vbl9ob2xvX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19vbl9ob2xvX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWFlMzZiCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX29uX2hvbG9fbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19vbl9wcmVzc2VkX2hvbG9fZGFyay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fb25fcHJlc3NlZF9ob2xvX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzYTBkNDgKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fb25fcHJlc3NlZF9ob2xvX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19vbl9wcmVzc2VkX2hvbG9fbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX29uX3ByZXNzZWRfaG9sb19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2EyMjM1OAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19vbl9wcmVzc2VkX2hvbG9fbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19vbl9zZWxlY3RlZF9ob2xvX2RhcmsucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX29uX3NlbGVjdGVkX2hvbG9fZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmMwNWY0NwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19vbl9zZWxlY3RlZF9ob2xvX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19vbl9zZWxlY3RlZF9ob2xvX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19vbl9zZWxlY3RlZF9ob2xvX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTdmYTFlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX29uX3NlbGVjdGVkX2hvbG9fbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2NvbWJvYm94X2Rpc2FibGVkLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2NvbWJvYm94X2Rpc2FibGVkLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGViNDVlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvY29tYm9ib3hfZGlzYWJsZWQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2NvbWJvYm94X25vaGlnaGxpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2NvbWJvYm94X25vaGlnaGxpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDYwMzAxCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvY29tYm9ib3hfbm9oaWdobGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2RpdmlkZXJfaG9yaXpvbnRhbF9icmlnaHQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaXZpZGVyX2hvcml6b250YWxfYnJpZ2h0LjkucG5nCmluZGV4IDk5YTY3YjkuLjQxYjc3NmIgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2RpdmlkZXJfaG9yaXpvbnRhbF9icmlnaHQuOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZGl2aWRlcl9ob3Jpem9udGFsX2JyaWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaXZpZGVyX2hvcml6b250YWxfYnJpZ2h0X29wYXF1ZS45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2RpdmlkZXJfaG9yaXpvbnRhbF9icmlnaHRfb3BhcXVlLjkucG5nCmluZGV4IGNmZTI1OGIuLmViNzVhMjIgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2RpdmlkZXJfaG9yaXpvbnRhbF9icmlnaHRfb3BhcXVlLjkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2RpdmlkZXJfaG9yaXpvbnRhbF9icmlnaHRfb3BhcXVlLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2RpdmlkZXJfaG9yaXpvbnRhbF9kYXJrLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZGl2aWRlcl9ob3Jpem9udGFsX2RhcmsuOS5wbmcKaW5kZXggMzM4ZDg0MC4uNTVhNWU1MyAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZGl2aWRlcl9ob3Jpem9udGFsX2RhcmsuOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZGl2aWRlcl9ob3Jpem9udGFsX2RhcmsuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZGl2aWRlcl9ob3Jpem9udGFsX2Rhcmtfb3BhcXVlLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZGl2aWRlcl9ob3Jpem9udGFsX2Rhcmtfb3BhcXVlLjkucG5nCmluZGV4IDk0NDRmMGQuLjYwZTJjYjIgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2RpdmlkZXJfaG9yaXpvbnRhbF9kYXJrX29wYXF1ZS45LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaXZpZGVyX2hvcml6b250YWxfZGFya19vcGFxdWUuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZGl2aWRlcl9ob3Jpem9udGFsX2RpbV9kYXJrLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZGl2aWRlcl9ob3Jpem9udGFsX2RpbV9kYXJrLjkucG5nCmluZGV4IDYzODU5ZjcuLmNmMzQ2MTMgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2RpdmlkZXJfaG9yaXpvbnRhbF9kaW1fZGFyay45LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaXZpZGVyX2hvcml6b250YWxfZGltX2RhcmsuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZGl2aWRlcl92ZXJ0aWNhbF9icmlnaHQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaXZpZGVyX3ZlcnRpY2FsX2JyaWdodC45LnBuZwppbmRleCA5OWE2N2I5Li40MWI3NzZiIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaXZpZGVyX3ZlcnRpY2FsX2JyaWdodC45LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaXZpZGVyX3ZlcnRpY2FsX2JyaWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaXZpZGVyX3ZlcnRpY2FsX2JyaWdodF9vcGFxdWUuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaXZpZGVyX3ZlcnRpY2FsX2JyaWdodF9vcGFxdWUuOS5wbmcKaW5kZXggNWM1MzdlZS4uZWI3NWEyMiAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZGl2aWRlcl92ZXJ0aWNhbF9icmlnaHRfb3BhcXVlLjkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2RpdmlkZXJfdmVydGljYWxfYnJpZ2h0X29wYXF1ZS45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaXZpZGVyX3ZlcnRpY2FsX2RhcmsuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaXZpZGVyX3ZlcnRpY2FsX2RhcmsuOS5wbmcKaW5kZXggNzAyYjg3OC4uNTVhNWU1MyAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZGl2aWRlcl92ZXJ0aWNhbF9kYXJrLjkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2RpdmlkZXJfdmVydGljYWxfZGFyay45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaXZpZGVyX3ZlcnRpY2FsX2Rhcmtfb3BhcXVlLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZGl2aWRlcl92ZXJ0aWNhbF9kYXJrX29wYXF1ZS45LnBuZwppbmRleCA4ZjM1MzE1Li42MGUyY2IyIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaXZpZGVyX3ZlcnRpY2FsX2Rhcmtfb3BhcXVlLjkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2RpdmlkZXJfdmVydGljYWxfZGFya19vcGFxdWUuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZW1vX2ltX2VtYmFycmFzc2VkLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2Vtb19pbV9lbWJhcnJhc3NlZC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Y3ZGFmNwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2Vtb19pbV9lbWJhcnJhc3NlZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfYWdncmVnYXRlZC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19hZ2dyZWdhdGVkLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NhMTViMS4uMDAwMDAwMAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19hZ2dyZWdhdGVkLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX2J0bl9iYWNrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX2J0bl9iYWNrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOGIzMjg1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfYnRuX2JhY2sucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX2J0bl9uZXh0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX2J0bl9uZXh0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmM2ZTFiCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfYnRuX25leHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9kZWZhdWx0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2RlZmF1bHQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjVjNjI0MQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9kZWZhdWx0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9kZWZhdWx0X2xpZ2h0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2RlZmF1bHRfbGlnaHQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNlNjlmMAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9kZWZhdWx0X2xpZ2h0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9kaXNhYmxlZC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9kaXNhYmxlZC45LnBuZwppbmRleCBjNDAyMzNlLi5hYjM3N2Q4IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZGlzYWJsZWQuOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2Rpc2FibGVkLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9kaXNhYmxlZF9saWdodC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9kaXNhYmxlZF9saWdodC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZWRjOWNkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2Rpc2FibGVkX2xpZ2h0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9mb2N1cy45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9mb2N1cy45LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhlMTZiOS4uMDAwMDAwMAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZm9jdXMuOS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZm9jdXNlZC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9mb2N1c2VkLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwYmI0NTQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZm9jdXNlZC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZm9jdXNlZF9saWdodC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9mb2N1c2VkX2xpZ2h0LjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwYmI0NTQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZm9jdXNlZF9saWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZm9jdXNlZF9zZWxlY3RlZC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9mb2N1c2VkX3NlbGVjdGVkLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1MjdkYTEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZm9jdXNlZF9zZWxlY3RlZC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfbG9uZ3ByZXNzLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2xvbmdwcmVzcy45LnBuZwppbmRleCAxNjc2Y2E3Li5iZDc0NDI2IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfbG9uZ3ByZXNzLjkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9sb25ncHJlc3MuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2xvbmdwcmVzc19saWdodC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9sb25ncHJlc3NfbGlnaHQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmMyYmEyZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9sb25ncHJlc3NfbGlnaHQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX3ByZXNzZWQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfcHJlc3NlZC45LnBuZwppbmRleCBiYTc5Y2Y3Li5kMThkNmY3IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfcHJlc3NlZC45LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfcHJlc3NlZC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfcHJlc3NlZF9saWdodC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9wcmVzc2VkX2xpZ2h0LjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwNzg2ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfcHJlc3NlZF9saWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfc2VsZWN0ZWQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfc2VsZWN0ZWQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2JmNTBiMwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9zZWxlY3RlZC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfc2VsZWN0ZWRfbGlnaHQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfc2VsZWN0ZWRfbGlnaHQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzRlYTg2ZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9zZWxlY3RlZF9saWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9xdWlja2NvbnRhY3Rfbm9iYWRnZS45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3F1aWNrY29udGFjdF9ub2JhZGdlLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4ZDQzYzQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9xdWlja2NvbnRhY3Rfbm9iYWRnZS45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX2l0ZW1fYmFja2dyb3VuZF9ub3JtYWwuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX2l0ZW1fYmFja2dyb3VuZF9ub3JtYWwuOS5wbmcKaW5kZXggYzAxYzAxOC4uODEwYzk1MCAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdHVzX2Jhcl9pdGVtX2JhY2tncm91bmRfbm9ybWFsLjkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c19iYXJfaXRlbV9iYWNrZ3JvdW5kX25vcm1hbC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zeW1fYWN0aW9uX2NhbGwucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3ltX2FjdGlvbl9jYWxsLnBuZwppbmRleCAxMDVmN2QwLi5kYThhZmVlIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zeW1fYWN0aW9uX2NhbGwucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N5bV9hY3Rpb25fY2FsbC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGV4dF9zZWxlY3RfaGFuZGxlLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RleHRfc2VsZWN0X2hhbmRsZS5wbmcKaW5kZXggODBkNDhhYi4uOTNhNWExNSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGV4dF9zZWxlY3RfaGFuZGxlLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90ZXh0X3NlbGVjdF9oYW5kbGUucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RleHRmaWVsZF9kZWZhdWx0X2hvbG9fZGFyay45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RleHRmaWVsZF9kZWZhdWx0X2hvbG9fZGFyay45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjdkMDRkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGV4dGZpZWxkX2RlZmF1bHRfaG9sb19kYXJrLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RleHRmaWVsZF9kZWZhdWx0X2hvbG9fbGlnaHQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90ZXh0ZmllbGRfZGVmYXVsdF9ob2xvX2xpZ2h0LjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyOTJlYmYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90ZXh0ZmllbGRfZGVmYXVsdF9ob2xvX2xpZ2h0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RleHRmaWVsZF9kaXNhYmxlZF9ob2xvX2RhcmsuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90ZXh0ZmllbGRfZGlzYWJsZWRfaG9sb19kYXJrLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzOTk4MmEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90ZXh0ZmllbGRfZGlzYWJsZWRfaG9sb19kYXJrLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RleHRmaWVsZF9kaXNhYmxlZF9ob2xvX2xpZ2h0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGV4dGZpZWxkX2Rpc2FibGVkX2hvbG9fbGlnaHQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWYyMjRiOQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RleHRmaWVsZF9kaXNhYmxlZF9ob2xvX2xpZ2h0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RleHRmaWVsZF9kaXNhYmxlZF9zZWxlY3RlZF9ob2xvX2RhcmsuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90ZXh0ZmllbGRfZGlzYWJsZWRfc2VsZWN0ZWRfaG9sb19kYXJrLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2ZjE4Y2MKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90ZXh0ZmllbGRfZGlzYWJsZWRfc2VsZWN0ZWRfaG9sb19kYXJrLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RleHRmaWVsZF9kaXNhYmxlZF9zZWxlY3RlZF9ob2xvX2xpZ2h0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGV4dGZpZWxkX2Rpc2FibGVkX3NlbGVjdGVkX2hvbG9fbGlnaHQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjY2NDM4NAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RleHRmaWVsZF9kaXNhYmxlZF9zZWxlY3RlZF9ob2xvX2xpZ2h0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RleHRmaWVsZF9wcmVzc2VkX2hvbG9fZGFyay45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RleHRmaWVsZF9wcmVzc2VkX2hvbG9fZGFyay45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYmY1M2M1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGV4dGZpZWxkX3ByZXNzZWRfaG9sb19kYXJrLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RleHRmaWVsZF9wcmVzc2VkX2hvbG9fbGlnaHQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90ZXh0ZmllbGRfcHJlc3NlZF9ob2xvX2xpZ2h0LjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlNDliOGQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90ZXh0ZmllbGRfcHJlc3NlZF9ob2xvX2xpZ2h0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RleHRmaWVsZF9zZWxlY3RlZF9ob2xvX2RhcmsuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90ZXh0ZmllbGRfc2VsZWN0ZWRfaG9sb19kYXJrLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiZjUzYzUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90ZXh0ZmllbGRfc2VsZWN0ZWRfaG9sb19kYXJrLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RleHRmaWVsZF9zZWxlY3RlZF9ob2xvX2xpZ2h0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGV4dGZpZWxkX3NlbGVjdGVkX2hvbG9fbGlnaHQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U0OWI4ZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RleHRmaWVsZF9zZWxlY3RlZF9ob2xvX2xpZ2h0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1sYW5kLWhkcGkvaWNfam9nX2RpYWxfc291bmRfb2ZmLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1sYW5kLWhkcGkvaWNfam9nX2RpYWxfc291bmRfb2ZmLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDczZGI0OC4uMDAwMDAwMAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbGFuZC1oZHBpL2ljX2pvZ19kaWFsX3NvdW5kX29mZi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbGFuZC1oZHBpL2ljX2pvZ19kaWFsX3NvdW5kX29uLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1sYW5kLWhkcGkvaWNfam9nX2RpYWxfc291bmRfb24ucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5MGRhNmUzLi4wMDAwMDAwCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1sYW5kLWhkcGkvaWNfam9nX2RpYWxfc291bmRfb24ucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWxhbmQtaGRwaS9pY19qb2dfZGlhbF91bmxvY2sucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWxhbmQtaGRwaS9pY19qb2dfZGlhbF91bmxvY2sucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhOWFmMWFmLi4wMDAwMDAwCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1sYW5kLWhkcGkvaWNfam9nX2RpYWxfdW5sb2NrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vZmZfZGlzYWJsZV9mb2N1c2VkX2hvbG9fZGFyay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb2ZmX2Rpc2FibGVfZm9jdXNlZF9ob2xvX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2MDNmYjEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb2ZmX2Rpc2FibGVfZm9jdXNlZF9ob2xvX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vZmZfZGlzYWJsZV9mb2N1c2VkX2hvbG9fbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29mZl9kaXNhYmxlX2ZvY3VzZWRfaG9sb19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjllOWZmOQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vZmZfZGlzYWJsZV9mb2N1c2VkX2hvbG9fbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vZmZfZGlzYWJsZV9ob2xvX2RhcmsucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29mZl9kaXNhYmxlX2hvbG9fZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTYwM2ZiMQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vZmZfZGlzYWJsZV9ob2xvX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vZmZfZGlzYWJsZV9ob2xvX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vZmZfZGlzYWJsZV9ob2xvX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWU5ZmY5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29mZl9kaXNhYmxlX2hvbG9fbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vZmZfaG9sb19kYXJrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vZmZfaG9sb19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTQ0YzI5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29mZl9ob2xvX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vZmZfaG9sb19saWdodC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb2ZmX2hvbG9fbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViMmVjOTIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb2ZmX2hvbG9fbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vZmZfcHJlc3NlZF9ob2xvX2RhcmsucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29mZl9wcmVzc2VkX2hvbG9fZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjExYmIxZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vZmZfcHJlc3NlZF9ob2xvX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vZmZfcHJlc3NlZF9ob2xvX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vZmZfcHJlc3NlZF9ob2xvX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTBlYTQ0MQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vZmZfcHJlc3NlZF9ob2xvX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb2ZmX3NlbGVjdGVkX2hvbG9fZGFyay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb2ZmX3NlbGVjdGVkX2hvbG9fZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWEyOGRmMgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vZmZfc2VsZWN0ZWRfaG9sb19kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb2ZmX3NlbGVjdGVkX2hvbG9fbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29mZl9zZWxlY3RlZF9ob2xvX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZGUxMTM2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29mZl9zZWxlY3RlZF9ob2xvX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb25fZGlzYWJsZV9mb2N1c2VkX2hvbG9fZGFyay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb25fZGlzYWJsZV9mb2N1c2VkX2hvbG9fZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE5OTcyYQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vbl9kaXNhYmxlX2ZvY3VzZWRfaG9sb19kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb25fZGlzYWJsZV9mb2N1c2VkX2hvbG9fbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29uX2Rpc2FibGVfZm9jdXNlZF9ob2xvX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2VmNDZlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29uX2Rpc2FibGVfZm9jdXNlZF9ob2xvX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb25fZGlzYWJsZV9ob2xvX2RhcmsucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29uX2Rpc2FibGVfaG9sb19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTk5NzJhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29uX2Rpc2FibGVfaG9sb19kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb25fZGlzYWJsZV9ob2xvX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vbl9kaXNhYmxlX2hvbG9fbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzZWY0NmUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb25fZGlzYWJsZV9ob2xvX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb25faG9sb19kYXJrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vbl9ob2xvX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzMGQ1NjIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb25faG9sb19kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb25faG9sb19saWdodC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb25faG9sb19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmI3ODA4YgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vbl9ob2xvX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb25fcHJlc3NlZF9ob2xvX2RhcmsucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29uX3ByZXNzZWRfaG9sb19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjc1M2Y1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29uX3ByZXNzZWRfaG9sb19kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb25fcHJlc3NlZF9ob2xvX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vbl9wcmVzc2VkX2hvbG9fbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhNGRkMmMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb25fcHJlc3NlZF9ob2xvX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb25fc2VsZWN0ZWRfaG9sb19kYXJrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vbl9zZWxlY3RlZF9ob2xvX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1ODY4ODEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb25fc2VsZWN0ZWRfaG9sb19kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb25fc2VsZWN0ZWRfaG9sb19saWdodC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb25fc2VsZWN0ZWRfaG9sb19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ3MDFjZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vbl9zZWxlY3RlZF9ob2xvX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fcmFkaW9fb2ZmX2hvbG9fZGFyay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fcmFkaW9fb2ZmX2hvbG9fZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTZjMWM2YgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19vZmZfaG9sb19kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fcmFkaW9fb2ZmX2hvbG9fbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX29mZl9ob2xvX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODI4N2YzCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX29mZl9ob2xvX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fcmFkaW9fb2ZmX3ByZXNzZWRfaG9sb19kYXJrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19vZmZfcHJlc3NlZF9ob2xvX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyNTIxN2IKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fcmFkaW9fb2ZmX3ByZXNzZWRfaG9sb19kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fcmFkaW9fb2ZmX3ByZXNzZWRfaG9sb19saWdodC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fcmFkaW9fb2ZmX3ByZXNzZWRfaG9sb19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjYzYjliMAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19vZmZfcHJlc3NlZF9ob2xvX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fcmFkaW9fb2ZmX3NlbGVjdGVkX2hvbG9fZGFyay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fcmFkaW9fb2ZmX3NlbGVjdGVkX2hvbG9fZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmVmNzU3MgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19vZmZfc2VsZWN0ZWRfaG9sb19kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fcmFkaW9fb2ZmX3NlbGVjdGVkX2hvbG9fbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX29mZl9zZWxlY3RlZF9ob2xvX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjc1NGUxCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX29mZl9zZWxlY3RlZF9ob2xvX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fcmFkaW9fb25faG9sb19kYXJrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19vbl9ob2xvX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlZDc0NzEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fcmFkaW9fb25faG9sb19kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fcmFkaW9fb25faG9sb19saWdodC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fcmFkaW9fb25faG9sb19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjJhYWE0MQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19vbl9ob2xvX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fcmFkaW9fb25fcHJlc3NlZF9ob2xvX2RhcmsucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX29uX3ByZXNzZWRfaG9sb19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Y2Y5MWM2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX29uX3ByZXNzZWRfaG9sb19kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fcmFkaW9fb25fcHJlc3NlZF9ob2xvX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19vbl9wcmVzc2VkX2hvbG9fbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkOTM1MDcKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fcmFkaW9fb25fcHJlc3NlZF9ob2xvX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fcmFkaW9fb25fc2VsZWN0ZWRfaG9sb19kYXJrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19vbl9zZWxlY3RlZF9ob2xvX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2ZjZmNWIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fcmFkaW9fb25fc2VsZWN0ZWRfaG9sb19kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fcmFkaW9fb25fc2VsZWN0ZWRfaG9sb19saWdodC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fcmFkaW9fb25fc2VsZWN0ZWRfaG9sb19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDhkZDhlOQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19vbl9zZWxlY3RlZF9ob2xvX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9jb21ib2JveF9kaXNhYmxlZC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9jb21ib2JveF9kaXNhYmxlZC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzMyZGI3ZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2NvbWJvYm94X2Rpc2FibGVkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9jb21ib2JveF9ub2hpZ2hsaWdodC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9jb21ib2JveF9ub2hpZ2hsaWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTk2MzMxNgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2NvbWJvYm94X25vaGlnaGxpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kaXZpZGVyX2hvcml6b250YWxfYnJpZ2h0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGl2aWRlcl9ob3Jpem9udGFsX2JyaWdodC45LnBuZwppbmRleCAzOTUyMjdhLi40MWI3NzZiIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kaXZpZGVyX2hvcml6b250YWxfYnJpZ2h0LjkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpdmlkZXJfaG9yaXpvbnRhbF9icmlnaHQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGl2aWRlcl9ob3Jpem9udGFsX2JyaWdodF9vcGFxdWUuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kaXZpZGVyX2hvcml6b250YWxfYnJpZ2h0X29wYXF1ZS45LnBuZwppbmRleCA1YzUzN2VlLi5lYjc1YTIyIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kaXZpZGVyX2hvcml6b250YWxfYnJpZ2h0X29wYXF1ZS45LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kaXZpZGVyX2hvcml6b250YWxfYnJpZ2h0X29wYXF1ZS45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kaXZpZGVyX2hvcml6b250YWxfZGFyay45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpdmlkZXJfaG9yaXpvbnRhbF9kYXJrLjkucG5nCmluZGV4IGJmNDVlMzguLjU1YTVlNTMgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpdmlkZXJfaG9yaXpvbnRhbF9kYXJrLjkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpdmlkZXJfaG9yaXpvbnRhbF9kYXJrLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpdmlkZXJfaG9yaXpvbnRhbF9kYXJrX29wYXF1ZS45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpdmlkZXJfaG9yaXpvbnRhbF9kYXJrX29wYXF1ZS45LnBuZwppbmRleCA5NDQ0ZjBkLi42MGUyY2IyIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kaXZpZGVyX2hvcml6b250YWxfZGFya19vcGFxdWUuOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGl2aWRlcl9ob3Jpem9udGFsX2Rhcmtfb3BhcXVlLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpdmlkZXJfaG9yaXpvbnRhbF9kaW1fZGFyay45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpdmlkZXJfaG9yaXpvbnRhbF9kaW1fZGFyay45LnBuZwppbmRleCAwODgzOGNhLi5jZjM0NjEzIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kaXZpZGVyX2hvcml6b250YWxfZGltX2RhcmsuOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGl2aWRlcl9ob3Jpem9udGFsX2RpbV9kYXJrLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpdmlkZXJfdmVydGljYWxfYnJpZ2h0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGl2aWRlcl92ZXJ0aWNhbF9icmlnaHQuOS5wbmcKaW5kZXggMzk1MjI3YS4uNDFiNzc2YiAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGl2aWRlcl92ZXJ0aWNhbF9icmlnaHQuOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGl2aWRlcl92ZXJ0aWNhbF9icmlnaHQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGl2aWRlcl92ZXJ0aWNhbF9icmlnaHRfb3BhcXVlLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGl2aWRlcl92ZXJ0aWNhbF9icmlnaHRfb3BhcXVlLjkucG5nCmluZGV4IDVjNTM3ZWUuLmViNzVhMjIgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpdmlkZXJfdmVydGljYWxfYnJpZ2h0X29wYXF1ZS45LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kaXZpZGVyX3ZlcnRpY2FsX2JyaWdodF9vcGFxdWUuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGl2aWRlcl92ZXJ0aWNhbF9kYXJrLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGl2aWRlcl92ZXJ0aWNhbF9kYXJrLjkucG5nCmluZGV4IDcwMmI4NzguLjU1YTVlNTMgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpdmlkZXJfdmVydGljYWxfZGFyay45LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kaXZpZGVyX3ZlcnRpY2FsX2RhcmsuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGl2aWRlcl92ZXJ0aWNhbF9kYXJrX29wYXF1ZS45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpdmlkZXJfdmVydGljYWxfZGFya19vcGFxdWUuOS5wbmcKaW5kZXggOGYzNTMxNS4uNjBlMmNiMiAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGl2aWRlcl92ZXJ0aWNhbF9kYXJrX29wYXF1ZS45LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kaXZpZGVyX3ZlcnRpY2FsX2Rhcmtfb3BhcXVlLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9lbW9faW1fZW1iYXJyYXNzZWQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZW1vX2ltX2VtYmFycmFzc2VkLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gY29yZS9yZXMvcmVzL2RyYXdhYmxlL2Vtb19pbV9lbWJhcnJhc3NlZC5wbmcKcmVuYW1lIHRvIGNvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2Vtb19pbV9lbWJhcnJhc3NlZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfYWdncmVnYXRlZC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19hZ2dyZWdhdGVkLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2MyZTJiMC4uMDAwMDAwMAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19hZ2dyZWdhdGVkLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2J0bl9iYWNrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2J0bl9iYWNrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWJmZjRjCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfYnRuX2JhY2sucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2J0bl9uZXh0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2J0bl9uZXh0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jNmNmNDM2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfYnRuX25leHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9kZWZhdWx0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2RlZmF1bHQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2FjNzFiMAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9kZWZhdWx0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9kZWZhdWx0X2xpZ2h0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2RlZmF1bHRfbGlnaHQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRlZGZmZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9kZWZhdWx0X2xpZ2h0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9kaXNhYmxlZC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9kaXNhYmxlZC45LnBuZwppbmRleCBiZjk3MGIwLi42MGYxOWZlIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZGlzYWJsZWQuOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2Rpc2FibGVkLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9kaXNhYmxlZF9saWdodC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9kaXNhYmxlZF9saWdodC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzk5MjYxMgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9kaXNhYmxlZF9saWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZm9jdXMuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZm9jdXMuOS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzZTI0MTU4Li4wMDAwMDAwCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9mb2N1cy45LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9mb2N1c2VkLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2ZvY3VzZWQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWIxZjE5NQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9mb2N1c2VkLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9mb2N1c2VkX2xpZ2h0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2ZvY3VzZWRfbGlnaHQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWIxZjE5NQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9mb2N1c2VkX2xpZ2h0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9mb2N1c2VkX3NlbGVjdGVkLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2ZvY3VzZWRfc2VsZWN0ZWQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTViMGMxZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9mb2N1c2VkX3NlbGVjdGVkLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9sb25ncHJlc3MuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfbG9uZ3ByZXNzLjkucG5nCmluZGV4IDVjYmIyNTEuLjc4MTc2NjcgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9sb25ncHJlc3MuOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2xvbmdwcmVzcy45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfbG9uZ3ByZXNzX2xpZ2h0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2xvbmdwcmVzc19saWdodC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDZmYzY5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2xvbmdwcmVzc19saWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfcHJlc3NlZC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9wcmVzc2VkLjkucG5nCmluZGV4IDAyYjRlOWEuLjE1MzFkOWQgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9wcmVzc2VkLjkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9wcmVzc2VkLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9wcmVzc2VkX2xpZ2h0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX3ByZXNzZWRfbGlnaHQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmRmNmY0OQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9wcmVzc2VkX2xpZ2h0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9zZWxlY3RlZC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9zZWxlY3RlZC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNGFjMWUzCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX3NlbGVjdGVkLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9zZWxlY3RlZF9saWdodC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9zZWxlY3RlZF9saWdodC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDg2MTk0Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX3NlbGVjdGVkX2xpZ2h0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3F1aWNrY29udGFjdF9ub2JhZGdlLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvcXVpY2tjb250YWN0X25vYmFkZ2UuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWJlNzQ3YgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3F1aWNrY29udGFjdF9ub2JhZGdlLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3N0YXR1c19iYXJfaXRlbV9iYWNrZ3JvdW5kX25vcm1hbC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3N0YXR1c19iYXJfaXRlbV9iYWNrZ3JvdW5kX25vcm1hbC45LnBuZwppbmRleCBiOGUzOTlkLi5mMGU0ZDA2IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX2l0ZW1fYmFja2dyb3VuZF9ub3JtYWwuOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvc3RhdHVzX2Jhcl9pdGVtX2JhY2tncm91bmRfbm9ybWFsLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3RleHRmaWVsZF9kZWZhdWx0X2hvbG9fZGFyay45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3RleHRmaWVsZF9kZWZhdWx0X2hvbG9fZGFyay45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOWEyY2M2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvdGV4dGZpZWxkX2RlZmF1bHRfaG9sb19kYXJrLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3RleHRmaWVsZF9kZWZhdWx0X2hvbG9fbGlnaHQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS90ZXh0ZmllbGRfZGVmYXVsdF9ob2xvX2xpZ2h0LjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2MDAzY2YKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS90ZXh0ZmllbGRfZGVmYXVsdF9ob2xvX2xpZ2h0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3RleHRmaWVsZF9kaXNhYmxlZF9ob2xvX2RhcmsuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS90ZXh0ZmllbGRfZGlzYWJsZWRfaG9sb19kYXJrLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlYzgyZGQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS90ZXh0ZmllbGRfZGlzYWJsZWRfaG9sb19kYXJrLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3RleHRmaWVsZF9kaXNhYmxlZF9ob2xvX2xpZ2h0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvdGV4dGZpZWxkX2Rpc2FibGVkX2hvbG9fbGlnaHQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGE5YjExZgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3RleHRmaWVsZF9kaXNhYmxlZF9ob2xvX2xpZ2h0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3RleHRmaWVsZF9kaXNhYmxlZF9zZWxlY3RlZF9ob2xvX2RhcmsuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS90ZXh0ZmllbGRfZGlzYWJsZWRfc2VsZWN0ZWRfaG9sb19kYXJrLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0NTkyNGMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS90ZXh0ZmllbGRfZGlzYWJsZWRfc2VsZWN0ZWRfaG9sb19kYXJrLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3RleHRmaWVsZF9kaXNhYmxlZF9zZWxlY3RlZF9ob2xvX2xpZ2h0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvdGV4dGZpZWxkX2Rpc2FibGVkX3NlbGVjdGVkX2hvbG9fbGlnaHQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTNlZTI2YwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3RleHRmaWVsZF9kaXNhYmxlZF9zZWxlY3RlZF9ob2xvX2xpZ2h0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3RleHRmaWVsZF9wcmVzc2VkX2hvbG9fZGFyay45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3RleHRmaWVsZF9wcmVzc2VkX2hvbG9fZGFyay45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTdjMjRkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvdGV4dGZpZWxkX3ByZXNzZWRfaG9sb19kYXJrLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3RleHRmaWVsZF9wcmVzc2VkX2hvbG9fbGlnaHQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS90ZXh0ZmllbGRfcHJlc3NlZF9ob2xvX2xpZ2h0LjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlZTA5YTYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS90ZXh0ZmllbGRfcHJlc3NlZF9ob2xvX2xpZ2h0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3RleHRmaWVsZF9zZWxlY3RlZF9ob2xvX2RhcmsuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS90ZXh0ZmllbGRfc2VsZWN0ZWRfaG9sb19kYXJrLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlN2MyNGQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS90ZXh0ZmllbGRfc2VsZWN0ZWRfaG9sb19kYXJrLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3RleHRmaWVsZF9zZWxlY3RlZF9ob2xvX2xpZ2h0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvdGV4dGZpZWxkX3NlbGVjdGVkX2hvbG9fbGlnaHQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmVlMDlhNgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3RleHRmaWVsZF9zZWxlY3RlZF9ob2xvX2xpZ2h0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS14bGFyZ2UvZGVmYXVsdF93YWxscGFwZXIuanBnIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLXhsYXJnZS9kZWZhdWx0X3dhbGxwYXBlci5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZiMGFjYwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS14bGFyZ2UvZGVmYXVsdF93YWxscGFwZXIuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS14bGFyZ2UvaWNfbG9ja19pZGxlX2FsYXJtLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS14bGFyZ2UvaWNfbG9ja19pZGxlX2FsYXJtLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzZhODIwCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLXhsYXJnZS9pY19sb2NrX2lkbGVfYWxhcm0ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS14bGFyZ2UvaWNfbG9ja19pZGxlX2NoYXJnaW5nLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS14bGFyZ2UvaWNfbG9ja19pZGxlX2NoYXJnaW5nLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYmVmNTMxCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLXhsYXJnZS9pY19sb2NrX2lkbGVfY2hhcmdpbmcucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS14bGFyZ2UvaWNfbG9ja19pZGxlX2xvY2sucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLXhsYXJnZS9pY19sb2NrX2lkbGVfbG9jay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA1ZTIxOAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS14bGFyZ2UvaWNfbG9ja19pZGxlX2xvY2sucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS14bGFyZ2UvaWNfbG9ja19pZGxlX2xvd19iYXR0ZXJ5LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS14bGFyZ2UvaWNfbG9ja19pZGxlX2xvd19iYXR0ZXJ5LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzQ5YjYzCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLXhsYXJnZS9pY19sb2NrX2lkbGVfbG93X2JhdHRlcnkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9hY3Rpb25fYmFyX2JhY2tncm91bmQueG1sIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2FjdGlvbl9iYXJfYmFja2dyb3VuZC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzkyOWQ3ZgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9hY3Rpb25fYmFyX2JhY2tncm91bmQueG1sCkBAIC0wLDAgKzEsMjIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxzaGFwZSB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorICAgIDxncmFkaWVudAorICAgICAgICBhbmRyb2lkOnN0YXJ0Q29sb3I9IiNmZmQxZDJkNCIKKyAgICAgICAgYW5kcm9pZDplbmRDb2xvcj0iI2ZmODU4NzhhIgorICAgICAgICBhbmRyb2lkOmFuZ2xlPSIyNzAiIC8+Cis8L3NoYXBlPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2FjdGlvbl9iYXJfY29udGV4dF9iYWNrZ3JvdW5kLnhtbCBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9hY3Rpb25fYmFyX2NvbnRleHRfYmFja2dyb3VuZC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODc4OTg5OAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9hY3Rpb25fYmFyX2NvbnRleHRfYmFja2dyb3VuZC54bWwKQEAgLTAsMCArMSwyMyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHNoYXBlIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisgICAgPGdyYWRpZW50CisgICAgICAgIGFuZHJvaWQ6c3RhcnRDb2xvcj0iI2ZmMDAwMDAwIgorICAgICAgICBhbmRyb2lkOmNlbnRlckNvbG9yPSIjZmZkMWQyZDQiCisgICAgICAgIGFuZHJvaWQ6ZW5kQ29sb3I9IiNmZjg1ODc4YSIKKyAgICAgICAgYW5kcm9pZDphbmdsZT0iMjcwIiAvPgorPC9zaGFwZT4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9hY3Rpb25fYmFyX2RpdmlkZXIueG1sIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2FjdGlvbl9iYXJfZGl2aWRlci54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE0MzA5ZgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9hY3Rpb25fYmFyX2RpdmlkZXIueG1sCkBAIC0wLDAgKzEsMjIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxzaGFwZSB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorICAgIDxncmFkaWVudAorICAgICAgICBhbmRyb2lkOnN0YXJ0Q29sb3I9IiNmZmUxZTJlNCIKKyAgICAgICAgYW5kcm9pZDplbmRDb2xvcj0iI2ZmOTU5NzlhIgorICAgICAgICBhbmRyb2lkOmFuZ2xlPSIyNzAiIC8+Cis8L3NoYXBlPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2J0bl9jaGVja19ob2xvX2RhcmsueG1sIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2J0bl9jaGVja19ob2xvX2RhcmsueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkODVkNzIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvYnRuX2NoZWNrX2hvbG9fZGFyay54bWwKQEAgLTAsMCArMSw2NSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisKKyAgICA8IS0tIEVuYWJsZWQgc3RhdGVzIC0tPgorICAgICAgICAKKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9InRydWUiIGFuZHJvaWQ6c3RhdGVfd2luZG93X2ZvY3VzZWQ9ImZhbHNlIgorICAgICAgICAgIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0idHJ1ZSIKKyAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnRuX2NoZWNrX29uX2hvbG9fZGFyayIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9ImZhbHNlIiBhbmRyb2lkOnN0YXRlX3dpbmRvd19mb2N1c2VkPSJmYWxzZSIKKyAgICAgICAgICBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9InRydWUiCisgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9jaGVja19vZmZfaG9sb19kYXJrIiAvPgorCisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJ0cnVlIiBhbmRyb2lkOnN0YXRlX3ByZXNzZWQ9InRydWUiCisgICAgICAgICAgYW5kcm9pZDpzdGF0ZV9lbmFibGVkPSJ0cnVlIgorICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9idG5fY2hlY2tfb25fcHJlc3NlZF9ob2xvX2RhcmsiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJmYWxzZSIgYW5kcm9pZDpzdGF0ZV9wcmVzc2VkPSJ0cnVlIgorICAgICAgICAgIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0idHJ1ZSIKKyAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnRuX2NoZWNrX29mZl9wcmVzc2VkX2hvbG9fZGFyayIgLz4KKworICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfY2hlY2tlZD0idHJ1ZSIgYW5kcm9pZDpzdGF0ZV9mb2N1c2VkPSJ0cnVlIgorICAgICAgICAgIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0idHJ1ZSIKKyAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnRuX2NoZWNrX29uX3NlbGVjdGVkX2hvbG9fZGFyayIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9ImZhbHNlIiBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9InRydWUiCisgICAgICAgICAgYW5kcm9pZDpzdGF0ZV9lbmFibGVkPSJ0cnVlIgorICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9idG5fY2hlY2tfb2ZmX3NlbGVjdGVkX2hvbG9fZGFyayIgLz4KKworICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfY2hlY2tlZD0iZmFsc2UiCisgICAgICAgICAgYW5kcm9pZDpzdGF0ZV9lbmFibGVkPSJ0cnVlIgorICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9idG5fY2hlY2tfb2ZmX2hvbG9fZGFyayIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9InRydWUiCisgICAgICAgICAgYW5kcm9pZDpzdGF0ZV9lbmFibGVkPSJ0cnVlIgorICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9idG5fY2hlY2tfb25faG9sb19kYXJrIiAvPgorCisKKyAgICA8IS0tIERpc2FibGVkIHN0YXRlcyAtLT4KKworICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfY2hlY2tlZD0idHJ1ZSIgYW5kcm9pZDpzdGF0ZV93aW5kb3dfZm9jdXNlZD0iZmFsc2UiCisgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9jaGVja19vbl9kaXNhYmxlX2hvbG9fZGFyayIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9ImZhbHNlIiBhbmRyb2lkOnN0YXRlX3dpbmRvd19mb2N1c2VkPSJmYWxzZSIKKyAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnRuX2NoZWNrX29mZl9kaXNhYmxlX2hvbG9fZGFyayIgLz4KKworICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfY2hlY2tlZD0idHJ1ZSIgYW5kcm9pZDpzdGF0ZV9mb2N1c2VkPSJ0cnVlIgorICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9idG5fY2hlY2tfb25fZGlzYWJsZV9mb2N1c2VkX2hvbG9fZGFyayIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9ImZhbHNlIiBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9InRydWUiCisgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9jaGVja19vZmZfZGlzYWJsZV9mb2N1c2VkX2hvbG9fZGFyayIgLz4KKworICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfY2hlY2tlZD0iZmFsc2UiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9idG5fY2hlY2tfb2ZmX2Rpc2FibGVfaG9sb19kYXJrIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfY2hlY2tlZD0idHJ1ZSIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9jaGVja19vbl9kaXNhYmxlX2hvbG9fZGFyayIgLz4KKworPC9zZWxlY3Rvcj4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9idG5fY2hlY2tfaG9sb19saWdodC54bWwgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvYnRuX2NoZWNrX2hvbG9fbGlnaHQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmYjE2ZmEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvYnRuX2NoZWNrX2hvbG9fbGlnaHQueG1sCkBAIC0wLDAgKzEsNjUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxzZWxlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorCisgICAgPCEtLSBFbmFibGVkIHN0YXRlcyAtLT4KKyAgICAgICAgCisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJ0cnVlIiBhbmRyb2lkOnN0YXRlX3dpbmRvd19mb2N1c2VkPSJmYWxzZSIKKyAgICAgICAgICBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9InRydWUiCisgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9jaGVja19vbl9ob2xvX2xpZ2h0IiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfY2hlY2tlZD0iZmFsc2UiIGFuZHJvaWQ6c3RhdGVfd2luZG93X2ZvY3VzZWQ9ImZhbHNlIgorICAgICAgICAgIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0idHJ1ZSIKKyAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnRuX2NoZWNrX29mZl9ob2xvX2xpZ2h0IiAvPgorCisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJ0cnVlIiBhbmRyb2lkOnN0YXRlX3ByZXNzZWQ9InRydWUiCisgICAgICAgICAgYW5kcm9pZDpzdGF0ZV9lbmFibGVkPSJ0cnVlIgorICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9idG5fY2hlY2tfb25fcHJlc3NlZF9ob2xvX2xpZ2h0IiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfY2hlY2tlZD0iZmFsc2UiIGFuZHJvaWQ6c3RhdGVfcHJlc3NlZD0idHJ1ZSIKKyAgICAgICAgICBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9InRydWUiCisgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9jaGVja19vZmZfcHJlc3NlZF9ob2xvX2xpZ2h0IiAvPgorCisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJ0cnVlIiBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9InRydWUiCisgICAgICAgICAgYW5kcm9pZDpzdGF0ZV9lbmFibGVkPSJ0cnVlIgorICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9idG5fY2hlY2tfb25fc2VsZWN0ZWRfaG9sb19saWdodCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9ImZhbHNlIiBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9InRydWUiCisgICAgICAgICAgYW5kcm9pZDpzdGF0ZV9lbmFibGVkPSJ0cnVlIgorICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9idG5fY2hlY2tfb2ZmX3NlbGVjdGVkX2hvbG9fbGlnaHQiIC8+CisKKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9ImZhbHNlIgorICAgICAgICAgIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0idHJ1ZSIKKyAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnRuX2NoZWNrX29mZl9ob2xvX2xpZ2h0IiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfY2hlY2tlZD0idHJ1ZSIKKyAgICAgICAgICBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9InRydWUiCisgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9jaGVja19vbl9ob2xvX2xpZ2h0IiAvPgorCisKKyAgICA8IS0tIERpc2FibGVkIHN0YXRlcyAtLT4KKworICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfY2hlY2tlZD0idHJ1ZSIgYW5kcm9pZDpzdGF0ZV93aW5kb3dfZm9jdXNlZD0iZmFsc2UiCisgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9jaGVja19vbl9kaXNhYmxlX2hvbG9fbGlnaHQiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJmYWxzZSIgYW5kcm9pZDpzdGF0ZV93aW5kb3dfZm9jdXNlZD0iZmFsc2UiCisgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9jaGVja19vZmZfZGlzYWJsZV9ob2xvX2xpZ2h0IiAvPgorCisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJ0cnVlIiBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9InRydWUiCisgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9jaGVja19vbl9kaXNhYmxlX2ZvY3VzZWRfaG9sb19saWdodCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9ImZhbHNlIiBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9InRydWUiCisgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9jaGVja19vZmZfZGlzYWJsZV9mb2N1c2VkX2hvbG9fbGlnaHQiIC8+CisKKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9ImZhbHNlIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnRuX2NoZWNrX29mZl9kaXNhYmxlX2hvbG9fbGlnaHQiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJ0cnVlIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnRuX2NoZWNrX29uX2Rpc2FibGVfaG9sb19saWdodCIgLz4KKworPC9zZWxlY3Rvcj4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9idG5fcmFkaW9faG9sb19kYXJrLnhtbCBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9idG5fcmFkaW9faG9sb19kYXJrLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTg0ZjZkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2J0bl9yYWRpb19ob2xvX2RhcmsueG1sCkBAIC0wLDAgKzEsMzUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxzZWxlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfY2hlY2tlZD0idHJ1ZSIgYW5kcm9pZDpzdGF0ZV93aW5kb3dfZm9jdXNlZD0iZmFsc2UiCisgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9yYWRpb19vbl9ob2xvX2RhcmsiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJmYWxzZSIgYW5kcm9pZDpzdGF0ZV93aW5kb3dfZm9jdXNlZD0iZmFsc2UiCisgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9yYWRpb19vZmZfaG9sb19kYXJrIiAvPgorICAgICAgICAgIAorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfY2hlY2tlZD0idHJ1ZSIgYW5kcm9pZDpzdGF0ZV9wcmVzc2VkPSJ0cnVlIgorICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9idG5fcmFkaW9fb25fcHJlc3NlZF9ob2xvX2RhcmsiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJmYWxzZSIgYW5kcm9pZDpzdGF0ZV9wcmVzc2VkPSJ0cnVlIgorICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9idG5fcmFkaW9fb2ZmX3ByZXNzZWRfaG9sb19kYXJrIiAvPgorCisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJ0cnVlIiBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9InRydWUiCisgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9yYWRpb19vbl9zZWxlY3RlZF9ob2xvX2RhcmsiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJmYWxzZSIgYW5kcm9pZDpzdGF0ZV9mb2N1c2VkPSJ0cnVlIgorICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9idG5fcmFkaW9fb2ZmX3NlbGVjdGVkX2hvbG9fZGFyayIgLz4KKworICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfY2hlY2tlZD0iZmFsc2UiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9idG5fcmFkaW9fb2ZmX2hvbG9fZGFyayIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9InRydWUiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9idG5fcmFkaW9fb25faG9sb19kYXJrIiAvPgorPC9zZWxlY3Rvcj4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9idG5fcmFkaW9faG9sb19saWdodC54bWwgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvYnRuX3JhZGlvX2hvbG9fbGlnaHQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwMTUwOGMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvYnRuX3JhZGlvX2hvbG9fbGlnaHQueG1sCkBAIC0wLDAgKzEsMzUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxzZWxlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfY2hlY2tlZD0idHJ1ZSIgYW5kcm9pZDpzdGF0ZV93aW5kb3dfZm9jdXNlZD0iZmFsc2UiCisgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9yYWRpb19vbl9ob2xvX2xpZ2h0IiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfY2hlY2tlZD0iZmFsc2UiIGFuZHJvaWQ6c3RhdGVfd2luZG93X2ZvY3VzZWQ9ImZhbHNlIgorICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9idG5fcmFkaW9fb2ZmX2hvbG9fbGlnaHQiIC8+CisgICAgICAgICAgCisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJ0cnVlIiBhbmRyb2lkOnN0YXRlX3ByZXNzZWQ9InRydWUiCisgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9yYWRpb19vbl9wcmVzc2VkX2hvbG9fbGlnaHQiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJmYWxzZSIgYW5kcm9pZDpzdGF0ZV9wcmVzc2VkPSJ0cnVlIgorICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9idG5fcmFkaW9fb2ZmX3ByZXNzZWRfaG9sb19saWdodCIgLz4KKworICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfY2hlY2tlZD0idHJ1ZSIgYW5kcm9pZDpzdGF0ZV9mb2N1c2VkPSJ0cnVlIgorICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9idG5fcmFkaW9fb25fc2VsZWN0ZWRfaG9sb19saWdodCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9ImZhbHNlIiBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9InRydWUiCisgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9yYWRpb19vZmZfc2VsZWN0ZWRfaG9sb19saWdodCIgLz4KKworICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfY2hlY2tlZD0iZmFsc2UiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9idG5fcmFkaW9fb2ZmX2hvbG9fbGlnaHQiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJ0cnVlIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnRuX3JhZGlvX29uX2hvbG9fbGlnaHQiIC8+Cis8L3NlbGVjdG9yPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2VkaXRfdGV4dF9ob2xvX2RhcmsueG1sIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2VkaXRfdGV4dF9ob2xvX2RhcmsueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3ZDI0ZmYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvZWRpdF90ZXh0X2hvbG9fZGFyay54bWwKQEAgLTAsMCArMSwyOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAgCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgIAorICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxzZWxlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfd2luZG93X2ZvY3VzZWQ9ImZhbHNlIiBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9InRydWUiCisgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS90ZXh0ZmllbGRfZGVmYXVsdF9ob2xvX2RhcmsiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV93aW5kb3dfZm9jdXNlZD0iZmFsc2UiIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0iZmFsc2UiCisgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS90ZXh0ZmllbGRfZGlzYWJsZWRfaG9sb19kYXJrIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfcHJlc3NlZD0idHJ1ZSIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3RleHRmaWVsZF9wcmVzc2VkX2hvbG9fZGFyayIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9InRydWUiIGFuZHJvaWQ6c3RhdGVfZm9jdXNlZD0idHJ1ZSIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3RleHRmaWVsZF9zZWxlY3RlZF9ob2xvX2RhcmsiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9lbmFibGVkPSJ0cnVlIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvdGV4dGZpZWxkX2RlZmF1bHRfaG9sb19kYXJrIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfZm9jdXNlZD0idHJ1ZSIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3RleHRmaWVsZF9kaXNhYmxlZF9zZWxlY3RlZF9ob2xvX2RhcmsiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3RleHRmaWVsZF9kaXNhYmxlZF9ob2xvX2RhcmsiIC8+Cis8L3NlbGVjdG9yPgorCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvZWRpdF90ZXh0X2hvbG9fbGlnaHQueG1sIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2VkaXRfdGV4dF9ob2xvX2xpZ2h0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYWUzOWUzCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2VkaXRfdGV4dF9ob2xvX2xpZ2h0LnhtbApAQCAtMCwwICsxLDI4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICAKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV93aW5kb3dfZm9jdXNlZD0iZmFsc2UiIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3RleHRmaWVsZF9kZWZhdWx0X2hvbG9fbGlnaHQiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV93aW5kb3dfZm9jdXNlZD0iZmFsc2UiIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0iZmFsc2UiCisgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS90ZXh0ZmllbGRfZGlzYWJsZWRfaG9sb19saWdodCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX3ByZXNzZWQ9InRydWUiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS90ZXh0ZmllbGRfcHJlc3NlZF9ob2xvX2xpZ2h0IiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0idHJ1ZSIgYW5kcm9pZDpzdGF0ZV9mb2N1c2VkPSJ0cnVlIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvdGV4dGZpZWxkX3NlbGVjdGVkX2hvbG9fbGlnaHQiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9lbmFibGVkPSJ0cnVlIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvdGV4dGZpZWxkX2RlZmF1bHRfaG9sb19saWdodCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9InRydWUiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS90ZXh0ZmllbGRfZGlzYWJsZWRfc2VsZWN0ZWRfaG9sb19saWdodCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvdGV4dGZpZWxkX2Rpc2FibGVkX2hvbG9fbGlnaHQiIC8+Cis8L3NlbGVjdG9yPgorCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvbGlzdF9zZWxlY3RlZF9iYWNrZ3JvdW5kLnhtbCBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9saXN0X3NlbGVjdGVkX2JhY2tncm91bmQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiYjY1OTQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvbGlzdF9zZWxlY3RlZF9iYWNrZ3JvdW5kLnhtbApAQCAtMCwwICsxLDIyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICAKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisKKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9InRydWUiICAgYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJ0cnVlIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2ZvY3VzZWRfc2VsZWN0ZWQiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9mb2N1c2VkPSJmYWxzZSIgIGFuZHJvaWQ6c3RhdGVfY2hlY2tlZD0idHJ1ZSIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9zZWxlY3RlZCIgLz4KKworPC9zZWxlY3Rvcj4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9saXN0X3NlbGVjdGVkX2JhY2tncm91bmRfbGlnaHQueG1sIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2xpc3Rfc2VsZWN0ZWRfYmFja2dyb3VuZF9saWdodC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTVmYzFjYgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9saXN0X3NlbGVjdGVkX2JhY2tncm91bmRfbGlnaHQueG1sCkBAIC0wLDAgKzEsMjIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgIAorICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKworICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfZm9jdXNlZD0idHJ1ZSIgICBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9InRydWUiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZm9jdXNlZF9zZWxlY3RlZCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9ImZhbHNlIiAgYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJ0cnVlIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX3NlbGVjdGVkX2xpZ2h0IiAvPgorCis8L3NlbGVjdG9yPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZC54bWwgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kLnhtbAppbmRleCBiY2E5OTZjLi4wYTUxMTUyIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kLnhtbApAQCAtMTYsMjIgKzE2LDE0IEBACiAKIDxzZWxlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgogCi0gICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV93aW5kb3dfZm9jdXNlZD0iZmFsc2UiCi0gICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBjb2xvci90cmFuc3BhcmVudCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX3dpbmRvd19mb2N1c2VkPSJmYWxzZSIgYW5kcm9pZDpkcmF3YWJsZT0iQGNvbG9yL3RyYW5zcGFyZW50IiAvPgogCiAgICAgPCEtLSBFdmVuIHRob3VnaCB0aGVzZSB0d28gcG9pbnQgdG8gdGhlIHNhbWUgcmVzb3VyY2UsIGhhdmUgdHdvIHN0YXRlcyBzbyB0aGUgZHJhd2FibGUgd2lsbCBpbnZhbGlkYXRlIGl0c2VsZiB3aGVuIGNvbWluZyBvdXQgb2YgcHJlc3NlZCBzdGF0ZS4gLS0+Ci0gICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9mb2N1c2VkPSJ0cnVlIiBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9ImZhbHNlIgotICAgICAgICBhbmRyb2lkOnN0YXRlX3ByZXNzZWQ9InRydWUiCi0gICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZGlzYWJsZWQiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9mb2N1c2VkPSJ0cnVlIiBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9ImZhbHNlIgotICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2Rpc2FibGVkIiAvPgotCi0gICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9mb2N1c2VkPSJ0cnVlIiBhbmRyb2lkOnN0YXRlX3ByZXNzZWQ9InRydWUiCi0gICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfdHJhbnNpdGlvbiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9ImZhbHNlIiBhbmRyb2lkOnN0YXRlX3ByZXNzZWQ9InRydWUiCi0gICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfdHJhbnNpdGlvbiIgLz4KLQotICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfZm9jdXNlZD0idHJ1ZSIKLSAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9mb2N1cyIgLz4KLQorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfZm9jdXNlZD0idHJ1ZSIgIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0iZmFsc2UiIGFuZHJvaWQ6c3RhdGVfcHJlc3NlZD0idHJ1ZSIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9kaXNhYmxlZCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9InRydWUiICBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9ImZhbHNlIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZGlzYWJsZWQiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9mb2N1c2VkPSJ0cnVlIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpzdGF0ZV9wcmVzc2VkPSJ0cnVlIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX3RyYW5zaXRpb24iIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9mb2N1c2VkPSJmYWxzZSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpzdGF0ZV9wcmVzc2VkPSJ0cnVlIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX3RyYW5zaXRpb24iIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9mb2N1c2VkPSJ0cnVlIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2ZvY3VzZWQiIC8+CisgICAgPGl0ZW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2RlZmF1bHQiIC8+CisgICAgCiA8L3NlbGVjdG9yPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9saWdodC54bWwgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2xpZ2h0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Yjc5ODBjCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9saWdodC54bWwKQEAgLTAsMCArMSwyOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAgCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgIAorICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxzZWxlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorCisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV93aW5kb3dfZm9jdXNlZD0iZmFsc2UiIGFuZHJvaWQ6ZHJhd2FibGU9IkBjb2xvci90cmFuc3BhcmVudCIgLz4KKworICAgIDwhLS0gRXZlbiB0aG91Z2ggdGhlc2UgdHdvIHBvaW50IHRvIHRoZSBzYW1lIHJlc291cmNlLCBoYXZlIHR3byBzdGF0ZXMgc28gdGhlIGRyYXdhYmxlIHdpbGwgaW52YWxpZGF0ZSBpdHNlbGYgd2hlbiBjb21pbmcgb3V0IG9mIHByZXNzZWQgc3RhdGUuIC0tPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfZm9jdXNlZD0idHJ1ZSIgIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0iZmFsc2UiIGFuZHJvaWQ6c3RhdGVfcHJlc3NlZD0idHJ1ZSIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9kaXNhYmxlZF9saWdodCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9InRydWUiICBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9ImZhbHNlIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZGlzYWJsZWRfbGlnaHQiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9mb2N1c2VkPSJ0cnVlIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpzdGF0ZV9wcmVzc2VkPSJ0cnVlIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX3RyYW5zaXRpb25fbGlnaHQiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9mb2N1c2VkPSJmYWxzZSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpzdGF0ZV9wcmVzc2VkPSJ0cnVlIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX3RyYW5zaXRpb25fbGlnaHQiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9mb2N1c2VkPSJ0cnVlIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2ZvY3VzZWRfbGlnaHQiIC8+CisgICAgPGl0ZW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2RlZmF1bHRfbGlnaHQiIC8+CisKKzwvc2VsZWN0b3I+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX3RyYW5zaXRpb25fbGlnaHQueG1sIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF90cmFuc2l0aW9uX2xpZ2h0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzRmODk1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF90cmFuc2l0aW9uX2xpZ2h0LnhtbApAQCAtMCwwICsxLDIwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICAKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHRyYW5zaXRpb24geG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAYW5kcm9pZDpkcmF3YWJsZS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfcHJlc3NlZF9saWdodCIgIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGFuZHJvaWQ6ZHJhd2FibGUvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2xvbmdwcmVzc19saWdodCIgIC8+Cis8L3RyYW5zaXRpb24+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvcXVpY2tjb250YWN0X25vYmFkZ2UueG1sIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlL3F1aWNrY29udGFjdF9ub2JhZGdlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTIyZmEwZS4uMDAwMDAwMAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvcXVpY2tjb250YWN0X25vYmFkZ2UueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0KLS8qIGJ1YmJsZV93aXRoX2NoYXRzLnhtbAotKioKLSoqIENvcHlyaWdodCAyMDA5LCBHb29nbGUgSW5jLgotKioKLSoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0qKgotKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotKioKLSoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0qKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLS0tPgotPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+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+CisKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQteGxhcmdlL3NjcmVlbl9hY3Rpb25fYmFyLnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQteGxhcmdlL3NjcmVlbl9hY3Rpb25fYmFyLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGE3MzE4Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC14bGFyZ2Uvc2NyZWVuX2FjdGlvbl9iYXIueG1sCkBAIC0wLDAgKzEsNDUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzwhLS0KK1RoaXMgaXMgYW4gb3B0aW1pemVkIGxheW91dCBmb3IgYSBzY3JlZW4gd2l0aCB0aGUgQWN0aW9uIEJhciBlbmFibGVkLgorLS0+CisKKzxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgIGFuZHJvaWQ6Zml0c1N5c3RlbVdpbmRvd3M9InRydWUiPgorICAgIDxWaWV3QW5pbWF0b3IgYW5kcm9pZDppZD0iQCtpZC9hY3Rpb25fYmFyX2FuaW1hdG9yIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDppbkFuaW1hdGlvbj0iQGFuaW0vcHVzaF9kb3duX2luX25vX2FscGhhIgorICAgICAgICBhbmRyb2lkOm91dEFuaW1hdGlvbj0iQGFuaW0vcHVzaF9kb3duX291dF9ub19hbHBoYSI+CisgICAgICAgIDxjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuQWN0aW9uQmFyVmlldworICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9hY3Rpb25fYmFyIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgc3R5bGU9Ij9hbmRyb2lkOmF0dHIvd2luZG93QWN0aW9uQmFyU3R5bGUiIC8+CisgICAgICAgIDxjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuQWN0aW9uQmFyQ29udGV4dFZpZXcKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvYWN0aW9uX2NvbnRleHRfYmFyIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IiAvPgorICAgIDwvVmlld0FuaW1hdG9yPgorICAgIDxGcmFtZUxheW91dCBhbmRyb2lkOmlkPSJAYW5kcm9pZDppZC9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjBkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSIKKyAgICAgICAgYW5kcm9pZDpmb3JlZ3JvdW5kR3Jhdml0eT0iZmlsbF9ob3Jpem9udGFsfHRvcCIKKyAgICAgICAgYW5kcm9pZDpmb3JlZ3JvdW5kPSI/YW5kcm9pZDphdHRyL3dpbmRvd0NvbnRlbnRPdmVybGF5IiAvPgorPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbGF5b3V0LXhsYXJnZS9zY3JlZW5fYWN0aW9uX2Jhcl9vdmVybGF5LnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQteGxhcmdlL3NjcmVlbl9hY3Rpb25fYmFyX292ZXJsYXkueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiMzVhYzEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0LXhsYXJnZS9zY3JlZW5fYWN0aW9uX2Jhcl9vdmVybGF5LnhtbApAQCAtMCwwICsxLDQ4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8IS0tCitUaGlzIGlzIGFuIG9wdGltaXplZCBsYXlvdXQgZm9yIGEgc2NyZWVuIHdpdGgKK3RoZSBBY3Rpb24gQmFyIGVuYWJsZWQgb3ZlcmxheWluZyBhcHBsaWNhdGlvbiBjb250ZW50LgorLS0+CisKKzxSZWxhdGl2ZUxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpmaXRzU3lzdGVtV2luZG93cz0idHJ1ZSI+CisgICAgPEZyYW1lTGF5b3V0IGFuZHJvaWQ6aWQ9IkBhbmRyb2lkOmlkL2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IiAvPgorICAgIDxWaWV3QW5pbWF0b3IgYW5kcm9pZDppZD0iQCtpZC9hY3Rpb25fYmFyX2FuaW1hdG9yIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJ0b3AiCisgICAgICAgIGFuZHJvaWQ6aW5BbmltYXRpb249IkBhbmltL3B1c2hfZG93bl9pbl9ub19hbHBoYSIKKyAgICAgICAgYW5kcm9pZDpvdXRBbmltYXRpb249IkBhbmltL3B1c2hfZG93bl9vdXRfbm9fYWxwaGEiPgorICAgICAgICA8Y29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0LkFjdGlvbkJhclZpZXcKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvYWN0aW9uX2JhciIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIHN0eWxlPSI/YW5kcm9pZDphdHRyL3dpbmRvd0FjdGlvbkJhclN0eWxlIiAvPgorICAgICAgICA8Y29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0LkFjdGlvbkJhckNvbnRleHRWaWV3CisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2FjdGlvbl9jb250ZXh0X2JhciIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIgLz4KKyAgICA8L1ZpZXdBbmltYXRvcj4KKyAgICA8SW1hZ2VWaWV3IGFuZHJvaWQ6c3JjPSI/YW5kcm9pZDphdHRyL3dpbmRvd0NvbnRlbnRPdmVybGF5IgorICAgICAgICAgICAgICAgYW5kcm9pZDpzY2FsZVR5cGU9ImZpdFhZIgorICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYmVsb3c9IkBpZC9hY3Rpb25fYmFyX2FuaW1hdG9yIiAvPgorPC9SZWxhdGl2ZUxheW91dD4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQteGxhcmdlL3N0YXR1c19iYXJfbGF0ZXN0X2V2ZW50X2NvbnRlbnQueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC14bGFyZ2Uvc3RhdHVzX2Jhcl9sYXRlc3RfZXZlbnRfY29udGVudC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzY0YjkwZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQteGxhcmdlL3N0YXR1c19iYXJfbGF0ZXN0X2V2ZW50X2NvbnRlbnQueG1sCkBAIC0wLDAgKzEsNTYgQEAKKzxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCisgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1RvcD0iN2RwIgorICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSI1ZHAiCisgICAgICAgID4KKworICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCisgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1RvcD0iM2RwIgorICAgICAgICA+CisgICAgICAgIDwhLS1jb20uYW5kcm9pZC5zZXJ2ZXIuc3RhdHVzLkFuaW1hdGVkSW1hZ2VWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvaWNvbiIgLS0+CisgICAgICAgIDxJbWFnZVZpZXcgYW5kcm9pZDppZD0iQCtpZC9pY29uIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjI1ZHAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjI1ZHAiCisgICAgICAgICAgICBhbmRyb2lkOnNjYWxlVHlwZT0iZml0Q2VudGVyIgorICAgICAgICAgICAgYW5kcm9pZDpzcmM9IkBkcmF3YWJsZS9hcnJvd19kb3duX2Zsb2F0Ii8+CisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL3RpdGxlIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iQHN0eWxlL1RleHRBcHBlYXJhbmNlLlN0YXR1c0Jhci5FdmVudENvbnRlbnQuVGl0bGUiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCisgICAgICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCisgICAgICAgICAgICBhbmRyb2lkOmVsbGlwc2l6ZT0ibWFycXVlZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZmFkaW5nRWRnZT0iaG9yaXpvbnRhbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjRkcCIKKyAgICAgICAgICAgIC8+CisgICAgPC9MaW5lYXJMYXlvdXQ+CisgICAgPExpbmVhckxheW91dAorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICAgICAgPgorICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC90ZXh0IgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iQHN0eWxlL1RleHRBcHBlYXJhbmNlLlN0YXR1c0Jhci5FdmVudENvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCisgICAgICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCisgICAgICAgICAgICBhbmRyb2lkOmVsbGlwc2l6ZT0ibWFycXVlZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZmFkaW5nRWRnZT0iaG9yaXpvbnRhbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjRkcCIKKyAgICAgICAgICAgIC8+CisgICAgICAgIDxhbmRyb2lkLndpZGdldC5EYXRlVGltZVZpZXcgYW5kcm9pZDppZD0iQCtpZC90aW1lIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iQHN0eWxlL1RleHRBcHBlYXJhbmNlLlN0YXR1c0Jhci5FdmVudENvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSI0ZHAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCisgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iNWRwIgorICAgICAgICAgICAgLz4KKyAgICA8L0xpbmVhckxheW91dD4KKzwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC9hY3Rpb25fYmFyX3RpdGxlX2l0ZW0ueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC9hY3Rpb25fYmFyX3RpdGxlX2l0ZW0ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjMDQ2ZmUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L2FjdGlvbl9iYXJfdGl0bGVfaXRlbS54bWwKQEAgLTAsMCArMSwzMyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAgCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgIAorICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiID4KKyAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9hY3Rpb25fYmFyX3RpdGxlIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpzaW5nbGVMaW5lPSJ0cnVlIgorICAgICAgICBhbmRyb2lkOmVsbGlwc2l6ZT0iZW5kIgorICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlTWVkaXVtSW52ZXJzZSIgLz4KKyAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9hY3Rpb25fYmFyX3N1YnRpdGxlIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpzaW5nbGVMaW5lPSJ0cnVlIgorICAgICAgICBhbmRyb2lkOmVsbGlwc2l6ZT0iZW5kIgorICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlU21hbGxJbnZlcnNlIiAvPgorPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L2FjdGlvbl9tZW51X2l0ZW1fbGF5b3V0LnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvYWN0aW9uX21lbnVfaXRlbV9sYXlvdXQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkM2NjZTUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L2FjdGlvbl9tZW51X2l0ZW1fbGF5b3V0LnhtbApAQCAtMCwwICsxLDI5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICAKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5BY3Rpb25NZW51SXRlbVZpZXcgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiID4KKyAgICA8SW1hZ2VCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9pbWFnZUJ1dHRvbiIKKyAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIKKyAgICAgICAgICAgICAgICAgc3R5bGU9Ij9hdHRyL2FjdGlvbkJ1dHRvblN0eWxlIiAvPgorICAgIDxCdXR0b24gYW5kcm9pZDppZD0iQCtpZC90ZXh0QnV0dG9uIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIiAvPgorPC9jb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuQWN0aW9uTWVudUl0ZW1WaWV3PgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC9hY3Rpb25fbWVudV9sYXlvdXQueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC9hY3Rpb25fbWVudV9sYXlvdXQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4ZDU1MzEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L2FjdGlvbl9tZW51X2xheW91dC54bWwKQEAgLTAsMCArMSwyMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAgCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgIAorICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuQWN0aW9uTWVudVZpZXcKKyAgICAgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIgLz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvYWN0aW9uX21vZGVfYmFyLnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvYWN0aW9uX21vZGVfYmFyLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hY2YzMjdlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC9hY3Rpb25fbW9kZV9iYXIueG1sCkBAIC0wLDAgKzEsMjMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisvKgorKiogQ29weXJpZ2h0IDIwMTAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKzxjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuQWN0aW9uQmFyQ29udGV4dFZpZXcKKyAgICAgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIiAvPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC9hbGVydF9kaWFsb2cueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC9hbGVydF9kaWFsb2cueG1sCmluZGV4IDdhZTY4ZjkuLmI3NDZkMjggMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvYWxlcnRfZGlhbG9nLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L2FsZXJ0X2RpYWxvZy54bWwKQEAgLTExMiw3ICsxMTIsNyBAQAogICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nVG9wPSI0ZGlwIgogICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iMmRpcCIKICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSIyZGlwIgotICAgICAgICAgICAgYW5kcm9pZDp1c2VMYXJnZXN0Q2hpbGQ9InRydWUiPgorICAgICAgICAgICAgYW5kcm9pZDptZWFzdXJlV2l0aExhcmdlc3RDaGlsZD0idHJ1ZSI+CiAgICAgICAgICAgICA8TGluZWFyTGF5b3V0IGFuZHJvaWQ6aWQ9IkAraWQvbGVmdFNwYWNlciIKICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjAuMjUiCiAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjBkaXAiCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L2NvbnRhY3RfaGVhZGVyLnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvY29udGFjdF9oZWFkZXIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjQ2N2QzLi4wMDAwMDAwCi0tLSBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvY29udGFjdF9oZWFkZXIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIGFuZHJvaWQ6aWQ9IkAraWQvYmFubmVyIgotICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCi0gICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKLSAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBkcmF3YWJsZS90aXRsZV9iYXJfbWVkaXVtIgotICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSI1ZGlwIj4KLQotICAgIDxhbmRyb2lkLndpZGdldC5RdWlja0NvbnRhY3RCYWRnZSBhbmRyb2lkOmlkPSJAK2lkL3Bob3RvIgotICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJjZW50ZXJfdmVydGljYWwiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSI4ZGlwIgotICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSItMWRpcCIKLSAgICAgICAgc3R5bGU9IkAqYW5kcm9pZDpzdHlsZS9XaWRnZXQuUXVpY2tDb250YWN0QmFkZ2UuV2luZG93U21hbGwiIC8+Ci0gICAgLz4KLQotICAgIDxMaW5lYXJMYXlvdXQKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjBkaXAiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCi0gICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgotICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJjZW50ZXJfdmVydGljYWwiID4KLQotICAgICAgICA8TGluZWFyTGF5b3V0Ci0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIj4KLQotICAgICAgICAgICAgPEltYWdlVmlldwotICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvYWdncmVnYXRlX2JhZGdlIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjNkaXAiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nVG9wPSIzZGlwIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6c3JjPSJAZHJhd2FibGUvaWNfYWdncmVnYXRlZCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiCi0gICAgICAgICAgICAvPgotCi0gICAgICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9uYW1lIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpzaW5nbGVMaW5lPSJ0cnVlIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZWxsaXBzaXplPSJlbmQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZU1lZGl1bSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTdHlsZT0iYm9sZCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnNoYWRvd0NvbG9yPSIjQkIwMDAwMDAiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpzaGFkb3dSYWRpdXM9IjIuNzUiCi0gICAgICAgICAgICAgICAgLz4KLSAgICAgICAgPC9MaW5lYXJMYXlvdXQ+Ci0KLSAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvcGhvbmV0aWNfbmFtZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VTbWFsbCIKLSAgICAgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6ZWxsaXBzaXplPSJlbmQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9Ii0yZGlwIgotICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIgotICAgICAgICAvPgotCi0gICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL3N0YXR1cyIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VTbWFsbCIKLSAgICAgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6ZWxsaXBzaXplPSJlbmQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9Ii0yZGlwIgotICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIgotICAgICAgICAvPgotCi0gICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL3N0YXR1c19kYXRlIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMGRpcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VTbWFsbCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjEyc3AiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9Ii0yZGlwIgotICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIgotICAgICAgICAvPgotICAgIDwvTGluZWFyTGF5b3V0PgotCi0gICAgPEltYWdlVmlldwotICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3ByZXNlbmNlIgotICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iY2VudGVyX3ZlcnRpY2FsIgotICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSIzZGlwIgotICAgICAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iNmRpcCIKLSAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIgotICAgIC8+Ci0KLSAgICA8Q2hlY2tCb3gKLSAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9zdGFyIgotICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iY2VudGVyX3ZlcnRpY2FsIgotICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiCi0gICAgICAgIGFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uPSJAc3RyaW5nL2Rlc2NyaXB0aW9uX3N0YXIiCi0gICAgICAgIHN0eWxlPSI/YW5kcm9pZDphdHRyL3N0YXJTdHlsZSIgLz4KLQotPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L2tleWd1YXJkX3NjcmVlbl9wYXNzd29yZF9sYW5kc2NhcGUueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC9rZXlndWFyZF9zY3JlZW5fcGFzc3dvcmRfbGFuZHNjYXBlLnhtbAppbmRleCBhYjY3NWM3Li4zZDUyZjcxIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L2tleWd1YXJkX3NjcmVlbl9wYXNzd29yZF9sYW5kc2NhcGUueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQva2V5Z3VhcmRfc2NyZWVuX3Bhc3N3b3JkX2xhbmRzY2FwZS54bWwKQEAgLTI4LDcgKzI4LDcgQEAKICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCiAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiPgogICAgICAgICA8IS0tICJFbnRlciBQSU4oUGFzc3dvcmQpIHRvIHVubG9jayIgLS0+Ci0gICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL2VudGVyX3Bhc3N3b3JkX2xhYmVsIgorICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9zdGF0dXMxIgogICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjBkaXAiCiAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQva2V5Z3VhcmRfc2NyZWVuX3Bhc3N3b3JkX3BvcnRyYWl0LnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQva2V5Z3VhcmRfc2NyZWVuX3Bhc3N3b3JkX3BvcnRyYWl0LnhtbAppbmRleCA5ZWU4NzgxLi5hZjhhM2VmIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L2tleWd1YXJkX3NjcmVlbl9wYXNzd29yZF9wb3J0cmFpdC54bWwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC9rZXlndWFyZF9zY3JlZW5fcGFzc3dvcmRfcG9ydHJhaXQueG1sCkBAIC0yNCw3ICsyNCw3IEBACiAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfaG9yaXpvbnRhbCI+CiAKICAgICA8IS0tICJFbnRlciBQSU4oUGFzc3dvcmQpIHRvIHVubG9jayIgLS0+Ci0gICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvZW50ZXJfcGFzc3dvcmRfbGFiZWwiCisgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvc3RhdHVzMSIKICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCiAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L2tleWd1YXJkX3NjcmVlbl91bmxvY2tfbGFuZHNjYXBlLnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQva2V5Z3VhcmRfc2NyZWVuX3VubG9ja19sYW5kc2NhcGUueG1sCmluZGV4IGMxYjQwNmYuLjgzMzgxYTEgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQva2V5Z3VhcmRfc2NyZWVuX3VubG9ja19sYW5kc2NhcGUueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQva2V5Z3VhcmRfc2NyZWVuX3VubG9ja19sYW5kc2NhcGUueG1sCkBAIC01OCwxOCArNTgsMTkgQEAKICAgICAgICAgICAgIGFuZHJvaWQ6ZWxsaXBzaXplPSJtYXJxdWVlIgogICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJyaWdodHxib3R0b20iCiAgICAgICAgICAgICAvPgorCiAgICAgICAgIDxjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuRGlnaXRhbENsb2NrIGFuZHJvaWQ6aWQ9IkAraWQvdGltZSIKICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCiAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50VG9wPSJ0cnVlIgogICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRMZWZ0PSJ0cnVlIgogICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSI4ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSI4ZGlwIgogICAgICAgICAgICAgPgogCiAgICAgICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC90aW1lRGlzcGxheSIKICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iYm90dG9tIgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIKICAgICAgICAgICAgICAgICBhbmRyb2lkOmVsbGlwc2l6ZT0ibm9uZSIKICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSI3MnNwIgpAQCAtODQsOCArODUsOSBAQAogCiAgICAgICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9hbV9wbSIKICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iYm90dG9tIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3RvUmlnaHRPZj0iQGlkL3RpbWVEaXNwbGF5IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduQmFzZWxpbmU9IkBpZC90aW1lRGlzcGxheSIKICAgICAgICAgICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCiAgICAgICAgICAgICAgICAgYW5kcm9pZDplbGxpcHNpemU9Im5vbmUiCiAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMjJzcCIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQva2V5Z3VhcmRfc2NyZWVuX3VubG9ja19wb3J0cmFpdC54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L2tleWd1YXJkX3NjcmVlbl91bmxvY2tfcG9ydHJhaXQueG1sCmluZGV4IDc0YTBlZWUuLjhkYWNmYWYgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQva2V5Z3VhcmRfc2NyZWVuX3VubG9ja19wb3J0cmFpdC54bWwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC9rZXlndWFyZF9zY3JlZW5fdW5sb2NrX3BvcnRyYWl0LnhtbApAQCAtNTUsMTIgKzU1LDEyIEBACiAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudFRvcD0idHJ1ZSIKICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iMTVkaXAiCiAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSIyMGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iOGRpcCIKICAgICAgICAgICAgID4KIAogICAgICAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvdGltZURpc3BsYXkiCiAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImJvdHRvbSIKICAgICAgICAgICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCiAgICAgICAgICAgICAgICAgYW5kcm9pZDplbGxpcHNpemU9Im5vbmUiCiAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iNTZzcCIKQEAgLTc0LDggKzc0LDkgQEAKIAogICAgICAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvYW1fcG0iCiAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImJvdHRvbSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF90b1JpZ2h0T2Y9IkBpZC90aW1lRGlzcGxheSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnbkJhc2VsaW5lPSJAaWQvdGltZURpc3BsYXkiCiAgICAgICAgICAgICAgICAgYW5kcm9pZDpzaW5nbGVMaW5lPSJ0cnVlIgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZWxsaXBzaXplPSJub25lIgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjE4c3AiCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L2xpc3RfY29udGVudC54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L2xpc3RfY29udGVudC54bWwKaW5kZXggNmY5ZjFlMC4uMTQxNDAzMiAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2xheW91dC9saXN0X2NvbnRlbnQueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvbGlzdF9jb250ZW50LnhtbApAQCAtMSw4ICsxLDYgQEAKIDw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+CiA8IS0tCi0vKiAvL2RldmljZS9hcHBzL2NvbW1vbi9hc3NldHMvcmVzL2xheW91dC9saXN0X2NvbnRlbnQueG1sCi0qKgotKiogQ29weXJpZ2h0IDIwMDYsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8qIENvcHlyaWdodCAyMDEwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAqKgogKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAogKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKQEAgLTE3LDggKzE1LDQyIEBACiAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCiAtLT4KLTxMaXN0VmlldyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiIGFuZHJvaWQ6aWQ9IkBhbmRyb2lkOmlkL2xpc3QiCi0gICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIgCi0gICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCi0gICAgYW5kcm9pZDpkcmF3U2VsZWN0b3JPblRvcD0iZmFsc2UiCi0gICAgLz4KKzxGcmFtZUxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50Ij4KKyAgICAKKyAgICA8TGluZWFyTGF5b3V0IGFuZHJvaWQ6aWQ9IkAraWQvcHJvZ3Jlc3NDb250YWluZXIiCisgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiIAorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiCisgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciI+CisgICAgICAgIAorICAgICAgICA8UHJvZ3Jlc3NCYXIgc3R5bGU9Ij9hbmRyb2lkOmF0dHIvcHJvZ3Jlc3NCYXJTdHlsZUxhcmdlIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiIC8+CisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VTbWFsbCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvbG9hZGluZyIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdUb3A9IjRkaXAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpzaW5nbGVMaW5lPSJ0cnVlIiAvPgorICAgICAgICAgICAgCisgICAgPC9MaW5lYXJMYXlvdXQ+CisgICAgICAgIAorICAgIDxGcmFtZUxheW91dCBhbmRyb2lkOmlkPSJAK2lkL2xpc3RDb250YWluZXIiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IiAKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50Ij4KKyAgICAgICAgICAgIAorICAgICAgICA8TGlzdFZpZXcgYW5kcm9pZDppZD0iQGFuZHJvaWQ6aWQvbGlzdCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IiAKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmRyYXdTZWxlY3Rvck9uVG9wPSJmYWxzZSIgLz4KKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkArYW5kcm9pZDppZC9pbnRlcm5hbEVtcHR5IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZUxhcmdlIiAvPgorICAgIDwvRnJhbWVMYXlvdXQ+CisgICAgICAgIAorPC9GcmFtZUxheW91dD4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvbGlzdF9jb250ZW50X3NpbXBsZS54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L2xpc3RfY29udGVudF9zaW1wbGUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmOWYxZTAKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L2xpc3RfY29udGVudF9zaW1wbGUueG1sCkBAIC0wLDAgKzEsMjQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisvKiAvL2RldmljZS9hcHBzL2NvbW1vbi9hc3NldHMvcmVzL2xheW91dC9saXN0X2NvbnRlbnQueG1sCisqKgorKiogQ29weXJpZ2h0IDIwMDYsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorPExpc3RWaWV3IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIgYW5kcm9pZDppZD0iQGFuZHJvaWQ6aWQvbGlzdCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IiAKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOmRyYXdTZWxlY3Rvck9uVG9wPSJmYWxzZSIKKyAgICAvPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC9wcmVmZXJlbmNlX2xpc3RfY29udGVudC54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L3ByZWZlcmVuY2VfbGlzdF9jb250ZW50LnhtbAppbmRleCA4Zjg2OTgxLi5lZWJhMThlIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L3ByZWZlcmVuY2VfbGlzdF9jb250ZW50LnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L3ByZWZlcmVuY2VfbGlzdF9jb250ZW50LnhtbApAQCAtNCwyMiArNCw4MyBAQAogKioKICoqIENvcHlyaWdodCAyMDA2LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAqKgotKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAotKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKLSoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqKgotKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoqCi0qKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAotKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCi0qKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCi0qKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwogLS0+Ci08TGlzdFZpZXcgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIiBhbmRyb2lkOmlkPSJAYW5kcm9pZDppZC9saXN0IgotICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiIAorCis8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKLSAgICBhbmRyb2lkOmRyYXdTZWxlY3Rvck9uVG9wPSJmYWxzZSIKLSAgICBhbmRyb2lkOnNjcm9sbGJhckFsd2F5c0RyYXdWZXJ0aWNhbFRyYWNrPSJ0cnVlIgotICAgIC8+CisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCI+CisKKyAgICA8TGluZWFyTGF5b3V0CisgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMHB4IgorICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiPgorCisgICAgICAgIDxMaXN0VmlldyBhbmRyb2lkOmlkPSJAYW5kcm9pZDppZC9saXN0IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjBweCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIgorICAgICAgICAgICAgYW5kcm9pZDpkcmF3U2VsZWN0b3JPblRvcD0iZmFsc2UiCisgICAgICAgICAgICBhbmRyb2lkOnNjcm9sbGJhckFsd2F5c0RyYXdWZXJ0aWNhbFRyYWNrPSJ0cnVlIiAvPgorCisgICAgICAgIDxGcmFtZUxheW91dCBhbmRyb2lkOmlkPSJAK2lkL3ByZWZzIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIwcHgiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIzIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIgLz4KKyAgICA8L0xpbmVhckxheW91dD4KKworICAgIDxSZWxhdGl2ZUxheW91dCBhbmRyb2lkOmlkPSJAK2lkL2J1dHRvbl9iYXIiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjAiCisgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGFuZHJvaWQ6ZHJhd2FibGUvYm90dG9tX2JhciIKKyAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIj4KKworICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvYmFja19idXR0b24iCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMTUwZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW49IjVkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudExlZnQ9InRydWUiCisgICAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlTGVmdD0iQGRyYXdhYmxlL2ljX2J0bl9iYWNrIgorICAgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZVBhZGRpbmc9IjNkaXAiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYmFja19idXR0b25fbGFiZWwiCisgICAgICAgIC8+CisgICAgICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudFJpZ2h0PSJ0cnVlIj4KKworICAgICAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL3NraXBfYnV0dG9uIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIxNTBkaXAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luPSI1ZGlwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9za2lwX2J1dHRvbl9sYWJlbCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiCisgICAgICAgICAgICAvPgorCisgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvbmV4dF9idXR0b24iCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjE1MGRpcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW49IjVkaXAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZVJpZ2h0PSJAZHJhd2FibGUvaWNfYnRuX25leHQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZVBhZGRpbmc9IjNkaXAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL25leHRfYnV0dG9uX2xhYmVsIgorICAgICAgICAgICAgLz4KKyAgICAgICAgPC9MaW5lYXJMYXlvdXQ+CisgICAgPC9SZWxhdGl2ZUxheW91dD4KKzwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC9wcmVmZXJlbmNlX2xpc3RfaXRlbS54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L3ByZWZlcmVuY2VfbGlzdF9pdGVtLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjg4OGI0Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC9wcmVmZXJlbmNlX2xpc3RfaXRlbS54bWwKQEAgLTAsMCArMSw2MSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDA2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPCEtLSBMYXlvdXQgZm9yIGEgcHJlZmVyZW5jZSBjYXRlZ29yeSBpdGVtLCBjb250YWluaW5nIGFuIGljb24gYW5kIGxhYmVsLiAtLT4KKzxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6aWQ9IkArYW5kcm9pZDppZC93aWRnZXRfZnJhbWUiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICBhbmRyb2lkOm1pbkhlaWdodD0iP2FuZHJvaWQ6YXR0ci9saXN0UHJlZmVycmVkSXRlbUhlaWdodCIKKyAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbCIKKyAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iP2FuZHJvaWQ6YXR0ci9zY3JvbGxiYXJTaXplIj4KKworICAgIDxJbWFnZVZpZXcKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9pY29uIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iNmRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjZkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImNlbnRlciIgLz4KKworICAgIDxSZWxhdGl2ZUxheW91dAorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iMmRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjZkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iNmRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSI2ZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiPgorCisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2FuZHJvaWQ6aWQvdGl0bGUiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCisgICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlTGFyZ2UiCisgICAgICAgICAgICBhbmRyb2lkOmVsbGlwc2l6ZT0ibWFycXVlZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZmFkaW5nRWRnZT0iaG9yaXpvbnRhbCIgLz4KKworICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCthbmRyb2lkOmlkL3N1bW1hcnkiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9iZWxvdz0iQGFuZHJvaWQ6aWQvdGl0bGUiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnbkxlZnQ9IkBhbmRyb2lkOmlkL3RpdGxlIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZVNtYWxsIgorICAgICAgICAgICAgYW5kcm9pZDptYXhMaW5lcz0iMiIgLz4KKworICAgIDwvUmVsYXRpdmVMYXlvdXQ+CisKKzwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC9zY3JlZW4ueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC9zY3JlZW4ueG1sCmluZGV4IGRmYTk3MzEuLjcyZjczOTIgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2NyZWVuLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NjcmVlbi54bWwKQEAgLTI1LDYgKzI1LDEzIEBACiAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKID4KKyAgICA8IS0tIFBvcG91dCBiYXIgZm9yIGFjdGlvbiBtb2RlcyAtLT4KKyAgICA8Vmlld1N0dWIgYW5kcm9pZDppZD0iQCtpZC9hY3Rpb25fbW9kZV9iYXJfc3R1YiIKKyAgICAgICAgICAgICAgYW5kcm9pZDppbmZsYXRlZElkPSJAK2lkL2FjdGlvbl9tb2RlX2JhciIKKyAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXQ9IkBsYXlvdXQvYWN0aW9uX21vZGVfYmFyIgorICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIgLz4KKwogICAgIDwhLS0gVGl0bGUgYmFyIC0tPgogICAgIDxSZWxhdGl2ZUxheW91dCBhbmRyb2lkOmlkPSJAYW5kcm9pZDppZC90aXRsZV9jb250YWluZXIiCiAgICAgICAgIHN0eWxlPSI/YW5kcm9pZDphdHRyL3dpbmRvd1RpdGxlQmFja2dyb3VuZFN0eWxlIgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC9zY3JlZW5fYWN0aW9uX2Jhci54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NjcmVlbl9hY3Rpb25fYmFyLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzQ0YjhjCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC9zY3JlZW5fYWN0aW9uX2Jhci54bWwKQEAgLTAsMCArMSw1MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAgCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgIAorICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzwhLS0KK1RoaXMgaXMgYW4gb3B0aW1pemVkIGxheW91dCBmb3IgYSBzY3JlZW4gd2l0aCB0aGUgQWN0aW9uIEJhciBlbmFibGVkLgorLS0+CisKKzxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgIGFuZHJvaWQ6Zml0c1N5c3RlbVdpbmRvd3M9InRydWUiPgorICAgIDxWaWV3QW5pbWF0b3IgYW5kcm9pZDppZD0iQCtpZC9hY3Rpb25fYmFyX2FuaW1hdG9yIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDppbkFuaW1hdGlvbj0iQGFuaW0vcHVzaF9kb3duX2luX25vX2FscGhhIgorICAgICAgICBhbmRyb2lkOm91dEFuaW1hdGlvbj0iQGFuaW0vcHVzaF9kb3duX291dF9ub19hbHBoYSI+CisgICAgICAgIDxjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuQWN0aW9uQmFyVmlldworICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9hY3Rpb25fYmFyIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgc3R5bGU9Ij9hbmRyb2lkOmF0dHIvd2luZG93QWN0aW9uQmFyU3R5bGUiIC8+CisgICAgICAgIDxjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuQWN0aW9uQmFyQ29udGV4dFZpZXcKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvYWN0aW9uX2NvbnRleHRfYmFyIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IiAvPgorICAgIDwvVmlld0FuaW1hdG9yPgorICAgIDxGcmFtZUxheW91dCBhbmRyb2lkOmlkPSJAYW5kcm9pZDppZC9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IiAKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCisgICAgICAgIGFuZHJvaWQ6Zm9yZWdyb3VuZEdyYXZpdHk9ImZpbGxfaG9yaXpvbnRhbHx0b3AiCisgICAgICAgIGFuZHJvaWQ6Zm9yZWdyb3VuZD0iP2FuZHJvaWQ6YXR0ci93aW5kb3dDb250ZW50T3ZlcmxheSIgLz4KKyAgICA8TGluZWFyTGF5b3V0IGFuZHJvaWQ6aWQ9IkAraWQvbG93ZXJfYWN0aW9uX2NvbnRleHRfYmFyIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgc3R5bGU9Ij9hbmRyb2lkOmF0dHIvd2luZG93QWN0aW9uQmFyU3R5bGUiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiIC8+Cis8L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2NyZWVuX2FjdGlvbl9iYXJfb3ZlcmxheS54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NjcmVlbl9hY3Rpb25fYmFyX292ZXJsYXkueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4NTRjNmYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NjcmVlbl9hY3Rpb25fYmFyX292ZXJsYXkueG1sCkBAIC0wLDAgKzEsNTQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzwhLS0KK1RoaXMgaXMgYW4gb3B0aW1pemVkIGxheW91dCBmb3IgYSBzY3JlZW4gd2l0aAordGhlIEFjdGlvbiBCYXIgZW5hYmxlZCBvdmVybGF5aW5nIGFwcGxpY2F0aW9uIGNvbnRlbnQuCistLT4KKworPFJlbGF0aXZlTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOmZpdHNTeXN0ZW1XaW5kb3dzPSJ0cnVlIj4KKyAgICA8RnJhbWVMYXlvdXQgYW5kcm9pZDppZD0iQGFuZHJvaWQ6aWQvY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiIC8+CisgICAgPFZpZXdBbmltYXRvciBhbmRyb2lkOmlkPSJAK2lkL2FjdGlvbl9iYXJfYW5pbWF0b3IiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmdyYXZpdHk9InRvcCIKKyAgICAgICAgYW5kcm9pZDppbkFuaW1hdGlvbj0iQGFuaW0vcHVzaF9kb3duX2luX25vX2FscGhhIgorICAgICAgICBhbmRyb2lkOm91dEFuaW1hdGlvbj0iQGFuaW0vcHVzaF9kb3duX291dF9ub19hbHBoYSI+CisgICAgICAgIDxjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuQWN0aW9uQmFyVmlldworICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9hY3Rpb25fYmFyIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgc3R5bGU9Ij9hbmRyb2lkOmF0dHIvd2luZG93QWN0aW9uQmFyU3R5bGUiIC8+CisgICAgICAgIDxjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuQWN0aW9uQmFyQ29udGV4dFZpZXcKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvYWN0aW9uX2NvbnRleHRfYmFyIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IiAvPgorICAgIDwvVmlld0FuaW1hdG9yPgorICAgIDxJbWFnZVZpZXcgYW5kcm9pZDpzcmM9Ij9hbmRyb2lkOmF0dHIvd2luZG93Q29udGVudE92ZXJsYXkiCisgICAgICAgICAgICAgICBhbmRyb2lkOnNjYWxlVHlwZT0iZml0WFkiCisgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9iZWxvdz0iQGlkL2FjdGlvbl9iYXJfYW5pbWF0b3IiIC8+CisgICAgPExpbmVhckxheW91dCBhbmRyb2lkOmlkPSJAK2lkL2xvd2VyX2FjdGlvbl9jb250ZXh0X2JhciIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImJvdHRvbSIKKyAgICAgICAgICAgICAgICAgIHN0eWxlPSI/YW5kcm9pZDphdHRyL3dpbmRvd0FjdGlvbkJhclN0eWxlIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIiAvPgorPC9SZWxhdGl2ZUxheW91dD4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2NyZWVuX2N1c3RvbV90aXRsZS54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NjcmVlbl9jdXN0b21fdGl0bGUueG1sCmluZGV4IDM0YzlkZTAuLmM2MmEwNmEgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2NyZWVuX2N1c3RvbV90aXRsZS54bWwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC9zY3JlZW5fY3VzdG9tX3RpdGxlLnhtbApAQCAtMjEsNiArMjEsMTMgQEAKIDxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgogICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgogICAgIGFuZHJvaWQ6Zml0c1N5c3RlbVdpbmRvd3M9InRydWUiPgorICAgIDwhLS0gUG9wb3V0IGJhciBmb3IgYWN0aW9uIG1vZGVzIC0tPgorICAgIDxWaWV3U3R1YiBhbmRyb2lkOmlkPSJAK2lkL2FjdGlvbl9tb2RlX2Jhcl9zdHViIgorICAgICAgICAgICAgICBhbmRyb2lkOmluZmxhdGVkSWQ9IkAraWQvYWN0aW9uX21vZGVfYmFyIgorICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dD0iQGxheW91dC9hY3Rpb25fbW9kZV9iYXIiCisgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IiAvPgorCiAgICAgPEZyYW1lTGF5b3V0IGFuZHJvaWQ6aWQ9IkBhbmRyb2lkOmlkL3RpdGxlX2NvbnRhaW5lciIgCiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiIAogICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Ij9hbmRyb2lkOmF0dHIvd2luZG93VGl0bGVTaXplIgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC9zY3JlZW5fcHJvZ3Jlc3MueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC9zY3JlZW5fcHJvZ3Jlc3MueG1sCmluZGV4IDZlNjk0YzEuLmMzZjQxZmEgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2NyZWVuX3Byb2dyZXNzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NjcmVlbl9wcm9ncmVzcy54bWwKQEAgLTI2LDYgKzI2LDEzIEBACiAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKID4KKyAgICA8IS0tIFBvcG91dCBiYXIgZm9yIGFjdGlvbiBtb2RlcyAtLT4KKyAgICA8Vmlld1N0dWIgYW5kcm9pZDppZD0iQCtpZC9hY3Rpb25fbW9kZV9iYXJfc3R1YiIKKyAgICAgICAgICAgICAgYW5kcm9pZDppbmZsYXRlZElkPSJAK2lkL2FjdGlvbl9tb2RlX2JhciIKKyAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXQ9IkBsYXlvdXQvYWN0aW9uX21vZGVfYmFyIgorICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIgLz4KKwogICAgIDxSZWxhdGl2ZUxheW91dCBhbmRyb2lkOmlkPSJAYW5kcm9pZDppZC90aXRsZV9jb250YWluZXIiIAogICAgICAgICBzdHlsZT0iP2FuZHJvaWQ6YXR0ci93aW5kb3dUaXRsZUJhY2tncm91bmRTdHlsZSIKICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIgCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NjcmVlbl9zaW1wbGUueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC9zY3JlZW5fc2ltcGxlLnhtbAppbmRleCBkZjUxMWM2Li44N2MyOWY2IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NjcmVlbl9zaW1wbGUueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2NyZWVuX3NpbXBsZS54bWwKQEAgLTIxLDkgKzIxLDE5IEBACiBlbmFibGVkLgogLS0+CiAKLTxGcmFtZUxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgYW5kcm9pZDppZD0iQGFuZHJvaWQ6aWQvY29udGVudCIKKzxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgogICAgIGFuZHJvaWQ6Zml0c1N5c3RlbVdpbmRvd3M9InRydWUiCi0gICAgYW5kcm9pZDpmb3JlZ3JvdW5kSW5zaWRlUGFkZGluZz0iZmFsc2UiCi0gICAgYW5kcm9pZDpmb3JlZ3JvdW5kR3Jhdml0eT0iZmlsbF9ob3Jpem9udGFsfHRvcCIKLSAgICBhbmRyb2lkOmZvcmVncm91bmQ9Ij9hbmRyb2lkOmF0dHIvd2luZG93Q29udGVudE92ZXJsYXkiIC8+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIj4KKyAgICA8Vmlld1N0dWIgYW5kcm9pZDppZD0iQCtpZC9hY3Rpb25fbW9kZV9iYXJfc3R1YiIKKyAgICAgICAgICAgICAgYW5kcm9pZDppbmZsYXRlZElkPSJAK2lkL2FjdGlvbl9tb2RlX2JhciIKKyAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXQ9IkBsYXlvdXQvYWN0aW9uX21vZGVfYmFyIgorICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIgLz4KKyAgICA8RnJhbWVMYXlvdXQKKyAgICAgICAgIGFuZHJvaWQ6aWQ9IkBhbmRyb2lkOmlkL2NvbnRlbnQiCisgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgICAgICBhbmRyb2lkOmZvcmVncm91bmRJbnNpZGVQYWRkaW5nPSJmYWxzZSIKKyAgICAgICAgIGFuZHJvaWQ6Zm9yZWdyb3VuZEdyYXZpdHk9ImZpbGxfaG9yaXpvbnRhbHx0b3AiCisgICAgICAgICBhbmRyb2lkOmZvcmVncm91bmQ9Ij9hbmRyb2lkOmF0dHIvd2luZG93Q29udGVudE92ZXJsYXkiIC8+Cis8L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2NyZWVuX3RpdGxlLnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2NyZWVuX3RpdGxlLnhtbAppbmRleCAzOWVhMTMxLi5mNTEzNGY5IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NjcmVlbl90aXRsZS54bWwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC9zY3JlZW5fdGl0bGUueG1sCkBAIC0yMiw2ICsyMiwxMiBAQAogPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCiAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCiAgICAgYW5kcm9pZDpmaXRzU3lzdGVtV2luZG93cz0idHJ1ZSI+CisgICAgPCEtLSBQb3BvdXQgYmFyIGZvciBhY3Rpb24gbW9kZXMgLS0+CisgICAgPFZpZXdTdHViIGFuZHJvaWQ6aWQ9IkAraWQvYWN0aW9uX21vZGVfYmFyX3N0dWIiCisgICAgICAgICAgICAgIGFuZHJvaWQ6aW5mbGF0ZWRJZD0iQCtpZC9hY3Rpb25fbW9kZV9iYXIiCisgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0PSJAbGF5b3V0L2FjdGlvbl9tb2RlX2JhciIKKyAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiIC8+CiAgICAgPEZyYW1lTGF5b3V0CiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiIAogICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Ij9hbmRyb2lkOmF0dHIvd2luZG93VGl0bGVTaXplIgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC9zY3JlZW5fdGl0bGVfaWNvbnMueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC9zY3JlZW5fdGl0bGVfaWNvbnMueG1sCmluZGV4IDYyYTAyMjguLjUxZDZhMTUgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2NyZWVuX3RpdGxlX2ljb25zLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NjcmVlbl90aXRsZV9pY29ucy54bWwKQEAgLTIzLDYgKzIzLDEyIEBACiAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCiAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCI+CisgICAgPCEtLSBQb3BvdXQgYmFyIGZvciBhY3Rpb24gbW9kZXMgLS0+CisgICAgPFZpZXdTdHViIGFuZHJvaWQ6aWQ9IkAraWQvYWN0aW9uX21vZGVfYmFyX3N0dWIiCisgICAgICAgICAgICAgIGFuZHJvaWQ6aW5mbGF0ZWRJZD0iQCtpZC9hY3Rpb25fbW9kZV9iYXIiCisgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0PSJAbGF5b3V0L2FjdGlvbl9tb2RlX2JhciIKKyAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiIC8+CiAgICAgPFJlbGF0aXZlTGF5b3V0IGFuZHJvaWQ6aWQ9IkBhbmRyb2lkOmlkL3RpdGxlX2NvbnRhaW5lciIKICAgICAgICAgc3R5bGU9Ij9hbmRyb2lkOmF0dHIvd2luZG93VGl0bGVCYWNrZ3JvdW5kU3R5bGUiCiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NlbGVjdF9kaWFsb2dfbXVsdGljaG9pY2UueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC9zZWxlY3RfZGlhbG9nX211bHRpY2hvaWNlLnhtbAppbmRleCA1Nzg1ZDNiLi5iNjQ2YTRjIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NlbGVjdF9kaWFsb2dfbXVsdGljaG9pY2UueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2VsZWN0X2RpYWxvZ19tdWx0aWNob2ljZS54bWwKQEAgLTI0LDcgKzI0LDcgQEAKICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbCIKICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSIxMmRpcCIKICAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iN2RpcCIKLSAgICBhbmRyb2lkOmNoZWNrTWFyaz0iQGFuZHJvaWQ6ZHJhd2FibGUvYnRuX2NoZWNrIgorICAgIGFuZHJvaWQ6Y2hlY2tNYXJrPSI/YW5kcm9pZDphdHRyL2xpc3RDaG9pY2VJbmRpY2F0b3JNdWx0aXBsZSIKICAgICBhbmRyb2lkOmVsbGlwc2l6ZT0ibWFycXVlZSIKIC8+CiAKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2VsZWN0X2RpYWxvZ19zaW5nbGVjaG9pY2UueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC9zZWxlY3RfZGlhbG9nX3NpbmdsZWNob2ljZS54bWwKaW5kZXggMzU2MGZlZS4uYzNjMjA3MyAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2xheW91dC9zZWxlY3RfZGlhbG9nX3NpbmdsZWNob2ljZS54bWwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC9zZWxlY3RfZGlhbG9nX3NpbmdsZWNob2ljZS54bWwKQEAgLTI0LDYgKzI0LDYgQEAKICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbCIKICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSIxMmRpcCIKICAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iN2RpcCIKLSAgICBhbmRyb2lkOmNoZWNrTWFyaz0iQGFuZHJvaWQ6ZHJhd2FibGUvYnRuX3JhZGlvIgorICAgIGFuZHJvaWQ6Y2hlY2tNYXJrPSI/YW5kcm9pZDphdHRyL2xpc3RDaG9pY2VJbmRpY2F0b3JTaW5nbGUiCiAgICAgYW5kcm9pZDplbGxpcHNpemU9Im1hcnF1ZWUiCiAvPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC9zaW1wbGVfc2VsZWN0YWJsZV9saXN0X2l0ZW0ueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC9zaW1wbGVfc2VsZWN0YWJsZV9saXN0X2l0ZW0ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxOGJjZDAKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NpbXBsZV9zZWxlY3RhYmxlX2xpc3RfaXRlbS54bWwKQEAgLTAsMCArMSwyNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAgCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgIAorICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxDaGVja2VkVGV4dFZpZXcgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6aWQ9IkBhbmRyb2lkOmlkL3RleHQxIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSI/YW5kcm9pZDphdHRyL2xpc3RQcmVmZXJyZWRJdGVtSGVpZ2h0IgorICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VMYXJnZSIKKyAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbCIKKyAgICBhbmRyb2lkOmJhY2tncm91bmQ9Ij9hbmRyb2lkOmF0dHIvbGlzdENob2ljZUJhY2tncm91bmRJbmRpY2F0b3IiCisgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iNmRpcCIKKyAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iOWRpcCIKKy8+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L3dlYl9ydW50aW1lLnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvd2ViX3J1bnRpbWUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlYzA5NjQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L3dlYl9ydW50aW1lLnhtbApAQCAtMCwwICsxLDM2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8RnJhbWVMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9ImZpbGxfcGFyZW50IgorICAgID4KKyAgICA8V2ViVmlldworICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3dlYnZpZXciCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJmaWxsX3BhcmVudCIKKyAgICAvPgorCisgICAgPEltYWdlVmlldworICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3NwbGFzaHNjcmVlbiIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9ImZpbGxfcGFyZW50IgorICAgICAgICBhbmRyb2lkOnNjYWxlVHlwZT0iZml0U3RhcnQiCisgICAgLz4KKworPC9GcmFtZUxheW91dD4KKwpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3Jhdy1ybS9sb2FkZXJyb3IuaHRtbCBiL2NvcmUvcmVzL3Jlcy9yYXctcm0vbG9hZGVycm9yLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGU0YTNmZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9yYXctcm0vbG9hZGVycm9yLmh0bWwKQEAgLTAsMCArMSwxOCBAQAorPGh0bWw+CisgICAgPGhlYWQ+CisgICAgICAgIDx0aXRsZT5QYWdpbmEgZCdpbnRlcm5ldCBiZXRnIGRpc3BvbmlibGE8L3RpdGxlPgorICAgICAgICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgorICAgICAgICAgICAgYm9keSB7IG1hcmdpbi10b3A6IDBweDsgcGFkZGluZy10b3A6IDBweDsgfQorICAgICAgICAgICAgaDIgICB7IG1hcmdpbi10b3A6IDVweDsgcGFkZGluZy10b3A6IDBweDsgfQorICAgICAgICA8L3N0eWxlPgorCisgICAgICAgIDxib2R5PgorCisgICAgICAgICAgICA8aW1nIHNyYz0iZmlsZTovLy9hbmRyb2lkX2Fzc2V0L3dlYmtpdC9hbmRyb2lkLXdlYmVycm9yLnBuZyIgYWxpZ249InRvcCIgLz4KKyAgICAgICAgICAgIDxoMj5QYWdpbmEgZCdpbnRlcm5ldCBiZXRnIGRpc3BvbmlibGE8L2gyPgorICAgICAgICAgICAgPHA+SW1wdXNzaWJlbCBkYSBjaGFyZ2lhciBsYSBwYWdpbmEgZCdpbnRlcm5ldCBzdXQgPGEgaHJlZj0iJXMiPiVzPC9hPi4gRXJydXI6PC9wPgorICAgICAgICAgICAgPCEtLSBUaGUgJWUgaXMgcmVwbGFjZWQgYnkgYSBsb2NhbGl6ZWQgZXJyb3Igc3RyaW5nIC0tPgorICAgICAgICAgICAgPHA+JWU8L3A+CisgICAgICAgIDwvYm9keT4KKyAgICA8L2hlYWQ+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvcmF3LXJtL25vZG9tYWluLmh0bWwgYi9jb3JlL3Jlcy9yZXMvcmF3LXJtL25vZG9tYWluLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWUyODMzYgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9yYXctcm0vbm9kb21haW4uaHRtbApAQCAtMCwwICsxLDIzIEBACis8aHRtbD4KKyAgICA8aGVhZD4KKyAgICAgICAgPHRpdGxlPlBhZ2luYSBkJ2ludGVybmV0IGJldGcgZGlzcG9uaWJsYTwvdGl0bGU+CisgICAgICAgIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CisgICAgICAgICAgICBib2R5IHsgbWFyZ2luLXRvcDogMHB4OyBwYWRkaW5nLXRvcDogMHB4OyB9CisgICAgICAgICAgICBoMiAgIHsgbWFyZ2luLXRvcDogNXB4OyBwYWRkaW5nLXRvcDogMHB4OyB9CisgICAgICAgIDwvc3R5bGU+CisKKyAgICAgICAgPGJvZHk+CisKKyAgICAgICAgICAgIDxpbWcgc3JjPSJmaWxlOi8vL2FuZHJvaWRfYXNzZXQvd2Via2l0L2FuZHJvaWQtd2ViZXJyb3IucG5nIiBhbGlnbj0idG9wIiAvPgorICAgICAgICAgICAgPGgyPlBhZ2luYSBkJ2ludGVybmV0IGJldGcgZGlzcG9uaWJsYTwvaDI+CisgICAgICAgICAgICA8cD5MYSBwYWdpbmEgZCdpbnRlcm5ldCBzdXQgPGEgaHJlZj0iJXMiPiVzPC9hPiAmZWdyYXZlOyBldmVudHVhbG1haW4gZGVhY3RpdmFkYSB0ZW1wb3Jhcm1haW4gdSBzcHVzdGFkYSBkZWZpbml0aXZhbWFpbiBhZCBpbmEgbm92YSBhZHJlc3NhIGRhIHdlYi48L3A+CisKKyAgICAgICAgICAgIDxwPjxiPlF1YSBpbiBwJmVncmF2ZTtyIHByb3Bvc3Rhczo8L2I+PC9wPgorICAgICAgICAgICAgPHVsPgorICAgICAgICAgICAgICAgIDxsaT5Db250cm9sbGFpIGNoZSBWb3NzIGFwcGFyYXQgcmVjZXBlc2NoYSBpbiBzaWduYWwgZSBkaXNwb25hIGQnaW5hIGNvbm5leGl1biBkYSBkYXRhcy48L2xpPgorICAgICAgICAgICAgICAgIDxsaT5DaGFyZ2lhaSBwbGkgdGFyZCBkYW5vdmFtYWluIGxhIHBhZ2luYSBkJ2ludGVybmV0LjwvbGk+CisgICAgICAgICAgICAgICAgPGxpPkNoYXJnaWFpIGluYSBjb3BpYSBkYSBsYSBwYWdpbmEgZGEgd2ViIG1lbW9yaXNhZGEgZW4gaWwgY2FjaGUgZGEgR29vZ2xlLjwvbGk+CisgICAgICAgICAgICA8L3VsPgorICAgICAgICA8L2JvZHk+CisgICAgPC9oZWFkPgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1jcy9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtY3Mvc3RyaW5ncy54bWwKaW5kZXggMjQ1NjQzYi4uOWM1MWFlYiAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1jcy9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWNzL3N0cmluZ3MueG1sCkBAIC00MzYsNiArNDM2LDEwIEBACiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX2ZvcmNlTG9jayIgbXNnaWQ9IjI4MTk4Njg2NjQ5NDYwODk3NDAiPiJVcsSNdWplLCBrZHkgZG9qZGUgayB1emFtxI1lbsOtIHphxZnDrXplbsOtIGEgYnVkZSBwb8W+YWRvdsOhbm8gb3DEm3Rvdm7DqSB6YWTDoW7DrSBoZXNsYS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfd2lwZURhdGEiIG1zZ2lkPSIzOTEwNTQ1NDQ2NzU4NjM5NzEzIj4iVnltYXrDoW7DrSB2xaFlY2ggZGF0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY193aXBlRGF0YSIgbXNnaWQ9IjIzMTQwNjA5MzM3OTYzOTYyMDUiPiJCZXogZGFsxaHDrWhvIHBvdHZyemVuw60gb2Jub3bDrSB2w71jaG96w60gbmFzdGF2ZW7DrSB6IHbDvXJvYnkgYSBzbWHFvmUgdsWhZWNobmEgZGF0YS4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcG9saWN5bGFiX3NldEdsb2JhbFByb3h5ICgyNzg0ODI4MjkzNzQ3NzkxNDQ2KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBvbGljeWRlc2Nfc2V0R2xvYmFsUHJveHkgKDYzODc0OTc0NjY2NjAxNTQ5MzEpIC0tPgorICAgIDxza2lwIC8+CiAgIDxzdHJpbmctYXJyYXkgbmFtZT0icGhvbmVUeXBlcyI+CiAgICAgPGl0ZW0gbXNnaWQ9Ijg5MDEwOTgzMzY2NTg3MTAzNTkiPiJEb23FryI8L2l0ZW0+CiAgICAgPGl0ZW0gbXNnaWQ9Ijg2OTkyMzY1MDUyNzEzNjYxNSI+Ik1vYmlsIjwvaXRlbT4KQEAgLTUyOSwxMCArNTMzLDkgQEAKICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVXb3JrIiBtc2dpZD0iMjkyNjg4NzA1MDUzNjM4NzIiPiJQcsOhY2UiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlT3RoZXIiIG1zZ2lkPSIzOTUxNzgxMTMxNTcwMTI0MDgyIj4iSmluw6kiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlQ3VzdG9tIiBtc2dpZD0iMjI1NTIzNDE1MzcyMDg4MzIyIj4iVmxhc3Ruw60iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJjb250YWN0X3N0YXR1c191cGRhdGVfYXR0cmlidXRpb24iIG1zZ2lkPSI1MTEyNTg5ODg2MDk0NDAyNzk1Ij4icG9tb2PDrSA8eGxpZmY6ZyBpZD0iU09VUkNFIj4lMSRzPC94bGlmZjpnPiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbl93aXRoX2RhdGUiIG1zZ2lkPSI1OTQ1Mzg2Mzc2MzY5OTc5OTA5Ij4iPHhsaWZmOmcgaWQ9IkRBVEUiPiUxJHM8L3hsaWZmOmc+IHBvbW9jw60gPHhsaWZmOmcgaWQ9IlNPVVJDRSI+JTIkczwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9waW5fY29kZSIgbXNnaWQ9IjM3MzE0ODg4MjcyMTg4NzYxMTUiPiJaYWRlanRlIGvDs2QgUElOIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGFzc3dvcmRfY29kZSIgbXNnaWQ9IjkxMzgxNTgzNDQ4MTMyMTM3NTQiPiJaYWRlanRlIGhlc2xvIHBybyBvZGJsb2tvdsOhbsOtIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGluX3Bhc3N3b3JkX2NvZGUiIG1zZ2lkPSI2MzgzNDcwNzU2MjU0OTE1MTQiPiJaYWRlanRlIGvDs2QgUElOIHBybyBvZGJsb2tvdsOhbsOtIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfd3JvbmdfcGluX2NvZGUiIG1zZ2lkPSIxMjk1OTg0MTE0MzM4MTA3NzE4Ij4iTmVzcHLDoXZuw70ga8OzZCBQSU4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9sYWJlbF90ZXh0IiBtc2dpZD0iODYxNzk2NDYxMDI4Mjk4NDI0Ij4iQ2hjZXRlLWxpIHRlbGVmb24gb2RlbWtub3V0LCBzdGlza27Em3RlIE1lbnUgYSBwb3TDqSAwLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVtZXJnZW5jeV9jYWxsX2RpYWxvZ19udW1iZXJfZm9yX2Rpc3BsYXkiIG1zZ2lkPSI2OTYxOTIxMDMxOTUwOTA5NzAiPiLEjMOtc2xvIHTDrXPFiG92w6kgbGlua3kiPC9zdHJpbmc+CkBAIC01NDUsNiArNTQ4LDcgQEAKICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcmV0dXJuX3RvX2NhbGwiIG1zZ2lkPSI1MjQ0MjU5Nzg1NTAwMDQwMDIxIj4iWmF2b2xhdCB6cMSbdCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGF0dGVybl9jb3JyZWN0IiBtc2dpZD0iOTAzOTAwODY1MDM2MjI2MTIzNyI+IlNwcsOhdm7EmyEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BhdHRlcm5fd3JvbmciIG1zZ2lkPSI0ODE3NTgzMjc5MDUzMTEyMzEyIj4iWmt1c3RlIHRvIHByb3PDrW0gem5vdnUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Bhc3N3b3JkX3dyb25nIiBtc2dpZD0iNjIzNzQ0MzY1NzM1ODE2ODgxOSI+IlprdXN0ZSB0byBwcm9zw61tIHpub3Z1Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wbHVnZ2VkX2luIiBtc2dpZD0iNjEzMzQzODUyODQyOTQ0NDM1Ij4iTmFiw61qZW7DrSAoPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+PHhsaWZmOmcgaWQ9IlBFUkNFTlQiPiUlPC94bGlmZjpnPikiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2NoYXJnZWQiIG1zZ2lkPSI0OTM4OTMwNDU5NjIwOTg5OTcyIj4iTmFiaXRvLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fYmF0dGVyeV9zaG9ydCIgbXNnaWQ9IjM2MTc1NDkxNzg2MDMzNTQ2NTYiPiI8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz4gPHhsaWZmOmcgaWQ9IlBFUkNFTlQiPiUlPC94bGlmZjpnPiI8L3N0cmluZz4KQEAgLTU1OSw2ICs1NjMsOCBAQAogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9zaW1fbG9ja2VkX21lc3NhZ2UiIG1zZ2lkPSI4MDY2NjYwMTI5MjA2MDAxMDM5Ij4iS2FydGEgU0lNIGplIHphYmxva292w6FuYS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3NpbV91bmxvY2tfcHJvZ3Jlc3NfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI1OTUzMjMyMTQwNTI4ODEyNjQiPiJPZGJsb2tvdsOhbsOtIGthcnR5IFNJTS4uLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iMzUxNDc0MjEwNjA2Njg3NzQ3NiI+Ijx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+a3LDoXQganN0ZSBuYWtyZXNsaWxpIG5lc3Byw6F2bsOpIGJlenBlxI1ub3N0bsOtIGdlc3RvLiAiXG5cbiJPcGFrdWp0ZSBwcm9zw61tIGFrY2kgemEgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gcy4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9wYXNzd29yZF9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjQ5MDYwMzQzNzY0MjUxNzUzODEiPiJWw61jZWtyw6F0ICg8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPikganN0ZSBuZXNwcsOhdm7EmyB6YWRhbGkgaGVzbG8uICJcblxuIlprdXN0ZSB0byB6bm92dSB6YSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBzLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX3Bpbl9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjY4Mjc3NDkyMzE0NjUxNDU1OTAiPiJWw61jZWtyw6F0ICg8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPikganN0ZSBuZXNwcsOhdm7EmyB6YWRhbGkga8OzZCBQSU4uICJcblxuIlprdXN0ZSB0byB6bm92dSB6YSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBzLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fZmFpbGVkX2F0dGVtcHRzX2FsbW9zdF9nbG9naW4iIG1zZ2lkPSIzMzUxMDEzODQyMzIwMTI3ODI3Ij4iPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz5rcsOhdCBqc3RlIG5lc3Byw6F2bsSbIG5ha3Jlc2xpbGkgc3bDqSBiZXpwZcSNbm9zdG7DrSBnZXN0by4gUG8gZGFsxaHDrWNoIG5lw7pzcMSbxaFuw71jaCBwb2t1c2VjaCAoPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4pIGJ1ZGV0ZSBwb8W+w6Fkw6FuaSBvIG9kZW3EjWVuw60gdGVsZWZvbnUgcG9tb2PDrSBwxZlpaGzDocWhZW7DrSBkbyDDusSNdHUgR29vZ2xlLiJcblxuIiBBa2NpIHByb3PDrW0gb3Bha3VqdGUgemEgbsSba29saWsgc2VrdW5kICg8eGxpZmY6ZyBpZD0iTlVNQkVSXzIiPiVkPC94bGlmZjpnPikuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfYXR0ZW1wdHNfY291bnRkb3duIiBtc2dpZD0iNjI1MTQ4MDM0MzM5NDM4OTY2NSI+IlNla3VuZHkgemLDvXZhasOtY8OtIGRvIGRhbMWhw61obyBwb2t1c3U6IDx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2ZvcmdvdF9wYXR0ZXJuX2J1dHRvbl90ZXh0IiBtc2dpZD0iMjYyNjk5OTQ0OTYxMDY5NTkzMCI+IlphcG9tbsSbbGkganN0ZSBnZXN0bz8iPC9zdHJpbmc+CkBAIC03MDMsMTUgKzcwOSwxNyBAQAogICAgIDxzdHJpbmcgbmFtZT0iZWxhcHNlZF90aW1lX3Nob3J0X2Zvcm1hdF9tbV9zcyIgbXNnaWQ9IjQ0MzE1NTU5NDM4Mjg3MTE0NzMiPiI8eGxpZmY6ZyBpZD0iTUlOVVRFUyI+JTEkMDJkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iU0VDT05EUyI+JTIkMDJkPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVsYXBzZWRfdGltZV9zaG9ydF9mb3JtYXRfaF9tbV9zcyIgbXNnaWQ9IjE4NDYwNzE5OTc2MTY2NTQxMjQiPiI8eGxpZmY6ZyBpZD0iSE9VUlMiPiUxJGQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJNSU5VVEVTIj4lMiQwMmQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJTRUNPTkRTIj4lMyQwMmQ8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0QWxsIiBtc2dpZD0iNjg3NjUxODkyNTg0NDEyOTMzMSI+IlZ5YnJhdCB2xaFlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0VGV4dCIgbXNnaWQ9IjM4ODkxNDkxMjM2MjY4ODg2MzciPiJPem5hxI1pdCB0ZXh0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ic3RvcFNlbGVjdGluZ1RleHQiIG1zZ2lkPSI0MTU3OTMxNDYzODcyMzIwOTk2Ij4iWmFzdGF2aXQgb3puYcSNb3bDoW7DrSB0ZXh0dSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImN1dCIgbXNnaWQ9IjMwOTI1Njk0MDg0Mzg2MjYyNjEiPiJWeWptb3V0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY29weSIgbXNnaWQ9IjI2ODE5NDYyMjk1MzM1MTE5ODciPiJLb3DDrXJvdmF0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGFzdGUiIG1zZ2lkPSI1NjI5ODgwODM2ODA1MDM2NDMzIj4iVmxvxb5pdCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNvcHlVcmwiIG1zZ2lkPSIyNTM4MjExNTc5NTk2MDY3NDAyIj4iS29ww61yb3ZhdCBhZHJlc3UgVVJMIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNlbGVjdFRleHRNb2RlICg2NzM4NTU2MzQ4ODYxMzQ3MjQwKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHRleHRTZWxlY3Rpb25DQUJUaXRsZSAoNTIzNjg1MDM5NDM3MDgyMDM1NykgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9ImlucHV0TWV0aG9kIiBtc2dpZD0iMTY1MzYzMDA2MjMwNDU2Nzg3OSI+Ik1ldG9kYSB6YWTDoXbDoW7DrSBkYXQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJhZGRUb0RpY3Rpb25hcnkiIG1zZ2lkPSI4NzkzNjI0OTkxNjg2OTQ4NzA5Ij4iUMWZaWRhdCBzbG92byDigJ48eGxpZmY6ZyBpZD0iV09SRCI+JXM8L3hsaWZmOmc+4oCcIGRvIHNsb3Zuw61rdSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImVkaXRUZXh0TWVudVRpdGxlIiBtc2dpZD0iMTY3Mjk4OTE3Njk1ODU4MTQ1MiI+IsOacHJhdnkgdGV4dHUiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZWRpdFRleHRNZW51VGl0bGUgKDQ5MDkxMzU1NjQ5NDE4MTU0OTQpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJsb3dfaW50ZXJuYWxfc3RvcmFnZV92aWV3X3RpdGxlIiBtc2dpZD0iMTM5OTczMjQwODcwMTY5NzU0NiI+Ik3DoWxvIHBhbcSbdGkiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb3dfaW50ZXJuYWxfc3RvcmFnZV92aWV3X3RleHQiIG1zZ2lkPSI2MzUxMDY1NDQ2MTYzNzg4MzYiPiJWIHRlbGVmb251IHpiw712w6EgbcOhbG8gbcOtc3RhIHBybyB1a2zDoWTDoW7DrSBkYXQuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ib2siIG1zZ2lkPSI1OTcwMDYwNDMwNTYyNTI0OTEwIj4iT0siPC9zdHJpbmc+CkBAIC03MTksNiArNzI3LDcgQEAKICAgICA8c3RyaW5nIG5hbWU9InllcyIgbXNnaWQ9IjUzNjI5ODIzMDMzMzc5NjkzMTIiPiJPSyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im5vIiBtc2dpZD0iNTE0MTUzMTA0NDkzNTU0MTQ5NyI+IlpydcWhaXQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkaWFsb2dfYWxlcnRfdGl0bGUiIG1zZ2lkPSIyMDQ5NjU4NzA4NjA5MDQzMTAzIj4iVXBvem9ybsSbbsOtIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9hZGluZyIgbXNnaWQ9IjE3NjA3MjQ5OTg5MjgyNTUyNTAiPiJOYcSNw610w6Fuw60uLi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXBpdGFsX29uIiBtc2dpZD0iMTU0NDY4Mjc1NTUxNDQ5NDI5OCI+IlpBUE5VVE8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXBpdGFsX29mZiIgbXNnaWQ9IjY4MTU4NzAzODY5NzI4MDU4MzIiPiJWWVBOT1VUIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0id2hpY2hBcHBsaWNhdGlvbiIgbXNnaWQ9IjQ1MzMxODU5NDcwNjQ3NzMzODYiPiJEb2tvbsSNaXQgYWtjaSBwb21vY8OtIGFwbGlrYWNlIjwvc3RyaW5nPgpAQCAtODUzLDEzICs4NjIsMTcgQEAKICAgICA8c3RyaW5nIG5hbWU9ImwydHBfaXBzZWNfcHNrX3Zwbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM5NDUwNDM1NjQwMDgzMDMyMzkiPiJTw63FpSBWUE4gTDJUUC9JUFNlYyBzIHDFmWVkc2TDrWxlbsO9bSBrbMOtxI1lbSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImwydHBfaXBzZWNfY3J0X3Zwbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjUzODI3MTQwNzMxMDM2NTM1NzciPiJTw63FpSBWUE4gTDJUUC9JUFNlYyBzIGNlcnRpZmlrw6F0ZW0iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1cGxvYWRfZmlsZSIgbXNnaWQ9IjI4OTc5NTcxNzIzNjY3MzA0MTYiPiJadm9saXQgc291Ym9yIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fZmlsZV9jaG9zZW4iIG1zZ2lkPSI2MzYzNjQ4NTYyMTcwNzU5NDY1Ij4iTmVuw60gdnlicsOhbiDFvsOhZG7DvSBzb3Vib3IiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJyZXNldCIgbXNnaWQ9IjI0NDgxNjgwODA5NjQyMDk5MDgiPiJSZXNldG92YXQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzdWJtaXQiIG1zZ2lkPSIxNjAyMzM1NTcyMDg5OTExOTQxIj4iT2Rlc2xhdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImRlc2NyaXB0aW9uX3N0YXIiIG1zZ2lkPSIyNjU0MzE5ODc0OTA4NTc2MTMzIj4ib2Jsw61iZW7DqSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcl9tb2RlX2Rpc2FibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iMzE2NDc2ODIxMjAwMzg2NDMxNiI+IkFrdGl2b3bDoW4gcmXFvmltIFYgYXV0xJsiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXJfbW9kZV9kaXNhYmxlX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iNjY4NjYzNjI2NzIxNjc1NjE0Ij4iVnliZXJ0ZSwgY2hjZXRlLWxpIHVrb27EjWl0IHJlxb5pbSBOYSBjZXN0xJsuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGV0aGVyZWRfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iMzE0NjY5NDIzNDM5ODIwMjYwMSI+IkplIGFrdGl2bsOtIHRldGhlcmluZyBuZWJvIGhvdHNwb3QiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0ZXRoZXJlZF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjMwNjcxMDgzMjM5MDMwNDg5MjciPiJEb3R5a2VtIHphaMOhasOtdGUga29uZmlndXJhY2kiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJiYWNrX2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjIzMDA0NzAwMDQ1MDMzNDM0MzkiPiJacMSbdCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5leHRfYnV0dG9uX2xhYmVsIiBtc2dpZD0iMTA4MDU1NTEwNDY3Nzk5MjQwOCI+IkRhbMWhw60iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2tpcF9idXR0b25fbGFiZWwgKDEyNzUzNjIyOTk0NzE2MzE4MTkpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZV93YXJuaW5nX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjQ4OTA4OTQyNjc0NTQ4NjcyNzYiPiJWeXNva8OpIHZ5dcW+aXTDrSBtb2JpbG7DrWNoIGRhdCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlX3dhcm5pbmdfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIyNjA5NzM0NzYzODQ1NzA1NzA4Ij4iRG90eWtlbSB6b2JyYXrDrXRlIGRhbMWhw60gaW5mb3JtYWNlIG8gdnl1xb5pdMOtIG1vYmlsbsOtY2ggZGF0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVkX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjYyNjk1NDE4OTc3Mjk3ODEzMzIiPiJCeWwgcMWZZWtyb8SNZW4gbGltaXQgbW9iaWxuw61jaCBkYXQiPC9zdHJpbmc+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWRhL3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1kYS9zdHJpbmdzLnhtbAppbmRleCBlN2U4MDE5Li5jZjc2ODE4IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWRhL3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZGEvc3RyaW5ncy54bWwKQEAgLTQzNiw2ICs0MzYsMTAgQEAKICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfZm9yY2VMb2NrIiBtc2dpZD0iMjgxOTg2ODY2NDk0NjA4OTc0MCI+IktvbnRyb2wgbsOlciBlbmhlZGVuIGzDpXNlcywgc8OlIGR1IHNrYWwgaW5kdGFzdGUgYWRnYW5nc2tvZGVuIGlnZW4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX3dpcGVEYXRhIiBtc2dpZD0iMzkxMDU0NTQ0Njc1ODYzOTcxMyI+IlNsZXQgYWxsZSBkYXRhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY193aXBlRGF0YSIgbXNnaWQ9IjIzMTQwNjA5MzM3OTYzOTYyMDUiPiJGb3JldGFnIGVuIGZhYnJpa3NudWxzdGlsbGluZywgZGVyIHNsZXR0ZXIgYWxsZSBkaW5lIGRhdGEgdWRlbiBiZWtyw6ZmdGVsc2UuIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBvbGljeWxhYl9zZXRHbG9iYWxQcm94eSAoMjc4NDgyODI5Mzc0Nzc5MTQ0NikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwb2xpY3lkZXNjX3NldEdsb2JhbFByb3h5ICg2Mzg3NDk3NDY2NjYwMTU0OTMxKSAtLT4KKyAgICA8c2tpcCAvPgogICA8c3RyaW5nLWFycmF5IG5hbWU9InBob25lVHlwZXMiPgogICAgIDxpdGVtIG1zZ2lkPSI4OTAxMDk4MzM2NjU4NzEwMzU5Ij4iSGplbSI8L2l0ZW0+CiAgICAgPGl0ZW0gbXNnaWQ9Ijg2OTkyMzY1MDUyNzEzNjYxNSI+Ik1vYmlsIjwvaXRlbT4KQEAgLTUyOSwxMCArNTMzLDkgQEAKICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVXb3JrIiBtc2dpZD0iMjkyNjg4NzA1MDUzNjM4NzIiPiJBcmJlamRlIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZU90aGVyIiBtc2dpZD0iMzk1MTc4MTEzMTU3MDEyNDA4MiI+IkFuZHJlIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZUN1c3RvbSIgbXNnaWQ9IjIyNTUyMzQxNTM3MjA4ODMyMiI+IlRpbHBhc3NldCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbiIgbXNnaWQ9IjUxMTI1ODk4ODYwOTQ0MDI3OTUiPiJ2aWEgPHhsaWZmOmcgaWQ9IlNPVVJDRSI+JTEkczwveGxpZmY6Zz4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJjb250YWN0X3N0YXR1c191cGRhdGVfYXR0cmlidXRpb25fd2l0aF9kYXRlIiBtc2dpZD0iNTk0NTM4NjM3NjM2OTk3OTkwOSI+Ijx4bGlmZjpnIGlkPSJEQVRFIj4lMSRzPC94bGlmZjpnPiB2aWEgPHhsaWZmOmcgaWQ9IlNPVVJDRSI+JTIkczwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9waW5fY29kZSIgbXNnaWQ9IjM3MzE0ODg4MjcyMTg4NzYxMTUiPiJJbmR0YXN0IFBJTi1rb2RlIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGFzc3dvcmRfY29kZSIgbXNnaWQ9IjkxMzgxNTgzNDQ4MTMyMTM3NTQiPiJJbmR0YXN0IGFkZ2FuZ3Nrb2RlIGZvciBhdCBsw6VzZSBvcCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bpbl9wYXNzd29yZF9jb2RlIiBtc2dpZD0iNjM4MzQ3MDc1NjI1NDkxNTE0Ij4iSW5kdGFzdCBwaW5rb2RlIGZvciBhdCBsw6VzZSBvcCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX3dyb25nX3Bpbl9jb2RlIiBtc2dpZD0iMTI5NTk4NDExNDMzODEwNzcxOCI+IkZvcmtlcnQgUElOLWtvZGUhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfbGFiZWxfdGV4dCIgbXNnaWQ9Ijg2MTc5NjQ2MTAyODI5ODQyNCI+IlRyeWsgcMOlIE1lbnUgb2cgZGVybsOmc3QgcMOlIDAgZm9yIGF0IGzDpXNlIG9wLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVtZXJnZW5jeV9jYWxsX2RpYWxvZ19udW1iZXJfZm9yX2Rpc3BsYXkiIG1zZ2lkPSI2OTYxOTIxMDMxOTUwOTA5NzAiPiJOw7hkbnVtbWVyIjwvc3RyaW5nPgpAQCAtNTQ1LDYgKzU0OCw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3JldHVybl90b19jYWxsIiBtc2dpZD0iNTI0NDI1OTc4NTUwMDA0MDAyMSI+IlRpbGJhZ2UgdGlsIG9wa2FsZCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGF0dGVybl9jb3JyZWN0IiBtc2dpZD0iOTAzOTAwODY1MDM2MjI2MTIzNyI+IlJpZ3RpZ3QhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXR0ZXJuX3dyb25nIiBtc2dpZD0iNDgxNzU4MzI3OTA1MzExMjMxMiI+IkJla2xhZ2VyISBQcsO4diBpZ2VuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXNzd29yZF93cm9uZyIgbXNnaWQ9IjYyMzc0NDM2NTczNTgxNjg4MTkiPiJCZWtsYWdlciEgUHLDuHYgaWdlbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGx1Z2dlZF9pbiIgbXNnaWQ9IjYxMzM0Mzg1Mjg0Mjk0NDQzNSI+Ik9wbGFkZXIgKDx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPjx4bGlmZjpnIGlkPSJQRVJDRU5UIj4lJTwveGxpZmY6Zz4pIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9jaGFyZ2VkIiBtc2dpZD0iNDkzODkzMDQ1OTYyMDk4OTk3MiI+Ik9wbGFkdC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2JhdHRlcnlfc2hvcnQiIG1zZ2lkPSIzNjE3NTQ5MTc4NjAzMzU0NjU2Ij4iPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+IDx4bGlmZjpnIGlkPSJQRVJDRU5UIj4lJTwveGxpZmY6Zz4iPC9zdHJpbmc+CkBAIC01NTksNiArNTYzLDggQEAKICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fc2ltX2xvY2tlZF9tZXNzYWdlIiBtc2dpZD0iODA2NjY2MDEyOTIwNjAwMTAzOSI+IlNJTS1rb3J0ZXQgZXIgbMOlc3QuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9zaW1fdW5sb2NrX3Byb2dyZXNzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNTk1MzIzMjE0MDUyODgxMjY0Ij4iTMOlc2VyIFNJTS1rb3J0ZXQgb3AgLi4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSIzNTE0NzQyMTA2MDY2ODc3NDc2Ij4iRHUgaGFyIHRlZ25ldCBkaXQgb3Bsw6VzbmluZ3Ntw7huc3RlciBmb3JrZXJ0IDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IGdhbmdlLiAiXG5cbiJQcsO4diBpZ2VuIG9tIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IHNla3VuZGVyLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX3Bhc3N3b3JkX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNDkwNjAzNDM3NjQyNTE3NTM4MSI+IkR1IGhhciBpbmR0YXN0ZXQgZGluIGFkZ2FuZ3Nrb2RlIGZvcmtlcnQgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4gZ2FuZ2UuICJcblxuIlByw7h2IGlnZW4gb20gPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gc2VrdW5kZXIuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfcGluX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNjgyNzc0OTIzMTQ2NTE0NTU5MCI+IkR1IGhhciBpbmR0YXN0ZXQgZGluIHBpbmtvZGUgZm9ya2VydCA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiBnYW5nZS4gIlxuXG4iUHLDuHYgaWdlbiBvbSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBzZWt1bmRlci4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2ZhaWxlZF9hdHRlbXB0c19hbG1vc3RfZ2xvZ2luIiBtc2dpZD0iMzM1MTAxMzg0MjMyMDEyNzgyNyI+IkR1IGhhciB0ZWduZXQgZGl0IG9wbMOlc25pbmdzbcO4bnN0ZXIgZm9ya2VydCA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiBnYW5nZS4gRWZ0ZXIgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gZm9yc8O4ZyBtZXJlIHZpbCBkdSBibGl2ZSBiZWR0IG9tIGF0IGzDpXNlIGRpbiB0ZWxlZm9uIG9wIHZlZCBoasOmbHAgYWYgZGl0IEdvb2dsZS1sb2dpbiJcblxuIiBQcsO4diBpZ2VuIG9tIDx4bGlmZjpnIGlkPSJOVU1CRVJfMiI+JWQ8L3hsaWZmOmc+IHNla3VuZGVyLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX2F0dGVtcHRzX2NvdW50ZG93biIgbXNnaWQ9IjYyNTE0ODAzNDMzOTQzODk2NjUiPiJQcsO4diBpZ2VuIG9tIDx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPiBzZWt1bmRlci4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2ZvcmdvdF9wYXR0ZXJuX2J1dHRvbl90ZXh0IiBtc2dpZD0iMjYyNjk5OTQ0OTYxMDY5NTkzMCI+IkhhciBkdSBnbGVtdCBtw7huc3RyZXQ/Ijwvc3RyaW5nPgpAQCAtNzAzLDE1ICs3MDksMTcgQEAKICAgICA8c3RyaW5nIG5hbWU9ImVsYXBzZWRfdGltZV9zaG9ydF9mb3JtYXRfbW1fc3MiIG1zZ2lkPSI0NDMxNTU1OTQzODI4NzExNDczIj4iPHhsaWZmOmcgaWQ9Ik1JTlVURVMiPiUxJDAyZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9IlNFQ09ORFMiPiUyJDAyZDwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJlbGFwc2VkX3RpbWVfc2hvcnRfZm9ybWF0X2hfbW1fc3MiIG1zZ2lkPSIxODQ2MDcxOTk3NjE2NjU0MTI0Ij4iPHhsaWZmOmcgaWQ9IkhPVVJTIj4lMSRkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iTUlOVVRFUyI+JTIkMDJkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iU0VDT05EUyI+JTMkMDJkPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNlbGVjdEFsbCIgbXNnaWQ9IjY4NzY1MTg5MjU4NDQxMjkzMzEiPiJWw6ZsZyBhbGxlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0VGV4dCIgbXNnaWQ9IjM4ODkxNDkxMjM2MjY4ODg2MzciPiJNYXJrZXIgdGVrc3QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJzdG9wU2VsZWN0aW5nVGV4dCIgbXNnaWQ9IjQxNTc5MzE0NjM4NzIzMjA5OTYiPiJIb2xkIG9wIG1lZCBhdCBtYXJrZXJlIHRla3N0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY3V0IiBtc2dpZD0iMzA5MjU2OTQwODQzODYyNjI2MSI+IktsaXAiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjb3B5IiBtc2dpZD0iMjY4MTk0NjIyOTUzMzUxMTk4NyI+IktvcGllciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBhc3RlIiBtc2dpZD0iNTYyOTg4MDgzNjgwNTAzNjQzMyI+IkluZHPDpnQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjb3B5VXJsIiBtc2dpZD0iMjUzODIxMTU3OTU5NjA2NzQwMiI+IktvcGllciB3ZWJhZHJlc3NlIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNlbGVjdFRleHRNb2RlICg2NzM4NTU2MzQ4ODYxMzQ3MjQwKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHRleHRTZWxlY3Rpb25DQUJUaXRsZSAoNTIzNjg1MDM5NDM3MDgyMDM1NykgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9ImlucHV0TWV0aG9kIiBtc2dpZD0iMTY1MzYzMDA2MjMwNDU2Nzg3OSI+IklucHV0bWV0b2RlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iYWRkVG9EaWN0aW9uYXJ5IiBtc2dpZD0iODc5MzYyNDk5MTY4Njk0ODcwOSI+IkbDuGogXCI8eGxpZmY6ZyBpZD0iV09SRCI+JXM8L3hsaWZmOmc+XCIgdGlsIG9yZGJvZyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImVkaXRUZXh0TWVudVRpdGxlIiBtc2dpZD0iMTY3Mjk4OTE3Njk1ODU4MTQ1MiI+IlJlZGlnZXIgdGVrc3QiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZWRpdFRleHRNZW51VGl0bGUgKDQ5MDkxMzU1NjQ5NDE4MTU0OTQpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJsb3dfaW50ZXJuYWxfc3RvcmFnZV92aWV3X3RpdGxlIiBtc2dpZD0iMTM5OTczMjQwODcwMTY5NzU0NiI+IkRlciBlciBpa2tlIHPDpSBtZWdldCBwbGFkcyB0aWxiYWdlIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG93X2ludGVybmFsX3N0b3JhZ2Vfdmlld190ZXh0IiBtc2dpZD0iNjM1MTA2NTQ0NjE2Mzc4ODM2Ij4iRGVyIGVyIG7DpnN0ZW4gaWtrZSBtZXJlIHBsYWRzIHDDpSB0ZWxlZm9uZW4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ib2siIG1zZ2lkPSI1OTcwMDYwNDMwNTYyNTI0OTEwIj4iT0siPC9zdHJpbmc+CkBAIC03MTksNiArNzI3LDcgQEAKICAgICA8c3RyaW5nIG5hbWU9InllcyIgbXNnaWQ9IjUzNjI5ODIzMDMzMzc5NjkzMTIiPiJPSyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im5vIiBtc2dpZD0iNTE0MTUzMTA0NDkzNTU0MTQ5NyI+IkFubnVsbGVyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGlhbG9nX2FsZXJ0X3RpdGxlIiBtc2dpZD0iMjA0OTY1ODcwODYwOTA0MzEwMyI+IkJlbcOmcmsiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2FkaW5nIiBtc2dpZD0iMTc2MDcyNDk5ODkyODI1NTI1MCI+IkluZGzDpnNlci4uLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcGl0YWxfb24iIG1zZ2lkPSIxNTQ0NjgyNzU1NTE0NDk0Mjk4Ij4iVElMIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FwaXRhbF9vZmYiIG1zZ2lkPSI2ODE1ODcwMzg2OTcyODA1ODMyIj4iRlJBIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0id2hpY2hBcHBsaWNhdGlvbiIgbXNnaWQ9IjQ1MzMxODU5NDcwNjQ3NzMzODYiPiJGdWxkZsO4ciBoYW5kbGluZyB2ZWQgaGrDpmxwIGFmIjwvc3RyaW5nPgpAQCAtODUzLDEzICs4NjIsMTcgQEAKICAgICA8c3RyaW5nIG5hbWU9ImwydHBfaXBzZWNfcHNrX3Zwbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM5NDUwNDM1NjQwMDgzMDMyMzkiPiJMMlRQL0lQU2VjIFZQTiBiYXNlcmV0IHDDpSBmb3Jow6VuZHNkZWx0IG7DuGdsZWtvZG5pbmciPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsMnRwX2lwc2VjX2NydF92cG5fZGVzY3JpcHRpb24iIG1zZ2lkPSI1MzgyNzE0MDczMTAzNjUzNTc3Ij4iQ2VydGlmaWthdGJhc2VyZXQgTDJUUC9JUFNlYyBWUE4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1cGxvYWRfZmlsZSIgbXNnaWQ9IjI4OTc5NTcxNzIzNjY3MzA0MTYiPiJWw6ZsZyBmaWwiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJub19maWxlX2Nob3NlbiIgbXNnaWQ9IjYzNjM2NDg1NjIxNzA3NTk0NjUiPiJJbmdlbiBmaWwgZXIgdmFsZ3QiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJyZXNldCIgbXNnaWQ9IjI0NDgxNjgwODA5NjQyMDk5MDgiPiJOdWxzdGlsIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic3VibWl0IiBtc2dpZD0iMTYwMjMzNTU3MjA4OTkxMTk0MSI+IlNlbmQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJkZXNjcmlwdGlvbl9zdGFyIiBtc2dpZD0iMjY1NDMxOTg3NDkwODU3NjEzMyI+ImZhdm9yaXQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXJfbW9kZV9kaXNhYmxlX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjMxNjQ3NjgyMTIwMDM4NjQzMTYiPiJCaWx0aWxzdGFuZCBlciBha3RpdmVyZXQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXJfbW9kZV9kaXNhYmxlX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iNjY4NjYzNjI2NzIxNjc1NjE0Ij4iVsOmbGcgZm9yIGF0IGFmc2x1dHRlIGJpbHRpbHN0YW5kLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRldGhlcmVkX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjMxNDY2OTQyMzQzOTgyMDI2MDEiPiJUZXRoZXJpbmcgZWxsZXIgaG90c3BvdCBlciBha3RpdnQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0ZXRoZXJlZF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjMwNjcxMDgzMjM5MDMwNDg5MjciPiJUcnlrIGZvciBhdCBrb25maWd1cmVyZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImJhY2tfYnV0dG9uX2xhYmVsIiBtc2dpZD0iMjMwMDQ3MDAwNDUwMzM0MzQzOSI+IlRpbGJhZ2UiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJuZXh0X2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjEwODA1NTUxMDQ2Nzc5OTI0MDgiPiJOw6ZzdGUiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2tpcF9idXR0b25fbGFiZWwgKDEyNzUzNjIyOTk0NzE2MzE4MTkpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZV93YXJuaW5nX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjQ4OTA4OTQyNjc0NTQ4NjcyNzYiPiJIw7hqdCBtb2JpbGRhdGFmb3JicnVnIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVfd2FybmluZ19ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjI2MDk3MzQ3NjM4NDU3MDU3MDgiPiJUcnlrIGZvciBvcGx5c25pbmdlciBvbSBicnVnIGFmIG1vYmlsZGF0YSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlZF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI2MjY5NTQxODk3NzI5NzgxMzMyIj4iR3LDpm5zZW4gZm9yIG1vYmlsZGF0YSBlciBvdmVyc2tyZWRldCI8L3N0cmluZz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZGUvc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWRlL3N0cmluZ3MueG1sCmluZGV4IGVkYmU0YzQuLjcxMmUxMGUgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZGUvc3RyaW5ncy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1kZS9zdHJpbmdzLnhtbApAQCAtNDM2LDYgKzQzNiwxMCBAQAogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19mb3JjZUxvY2siIG1zZ2lkPSIyODE5ODY4NjY0OTQ2MDg5NzQwIj4iU3RldWVydW5nIGRlciBHZXLDpHRlc3BlcnJlOyBlcmZvcmRlcnQgZGllIGVybmV1dGUgUGFzc3dvcnRlaW5nYWJlIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX3dpcGVEYXRhIiBtc2dpZD0iMzkxMDU0NTQ0Njc1ODYzOTcxMyI+IkFsbGUgRGF0ZW4gbMO2c2NoZW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3dpcGVEYXRhIiBtc2dpZD0iMjMxNDA2MDkzMzc5NjM5NjIwNSI+Ilp1csO8Y2tzZXR6ZW4gYXVmIGRpZSBXZXJrc2VpbnN0ZWxsdW5nZW4uIERhYmVpIHdlcmRlbiBhbGxlIElocmUgRGF0ZW4gb2huZSBOYWNoZnJhZ2UgZ2Vsw7ZzY2h0LiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwb2xpY3lsYWJfc2V0R2xvYmFsUHJveHkgKDI3ODQ4MjgyOTM3NDc3OTE0NDYpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcG9saWN5ZGVzY19zZXRHbG9iYWxQcm94eSAoNjM4NzQ5NzQ2NjY2MDE1NDkzMSkgLS0+CisgICAgPHNraXAgLz4KICAgPHN0cmluZy1hcnJheSBuYW1lPSJwaG9uZVR5cGVzIj4KICAgICA8aXRlbSBtc2dpZD0iODkwMTA5ODMzNjY1ODcxMDM1OSI+IlByaXZhdCI8L2l0ZW0+CiAgICAgPGl0ZW0gbXNnaWQ9Ijg2OTkyMzY1MDUyNzEzNjYxNSI+Ik1vYmlsIjwvaXRlbT4KQEAgLTUyOSwxMCArNTMzLDkgQEAKICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVXb3JrIiBtc2dpZD0iMjkyNjg4NzA1MDUzNjM4NzIiPiJCZXJ1ZmxpY2giPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlT3RoZXIiIG1zZ2lkPSIzOTUxNzgxMTMxNTcwMTI0MDgyIj4iQW5kZXJlIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZUN1c3RvbSIgbXNnaWQ9IjIyNTUyMzQxNTM3MjA4ODMyMiI+IkJlbnV0emVyZGVmaW5pZXJ0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iY29udGFjdF9zdGF0dXNfdXBkYXRlX2F0dHJpYnV0aW9uIiBtc2dpZD0iNTExMjU4OTg4NjA5NDQwMjc5NSI+IsO8YmVyIDx4bGlmZjpnIGlkPSJTT1VSQ0UiPiUxJHM8L3hsaWZmOmc+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iY29udGFjdF9zdGF0dXNfdXBkYXRlX2F0dHJpYnV0aW9uX3dpdGhfZGF0ZSIgbXNnaWQ9IjU5NDUzODYzNzYzNjk5Nzk5MDkiPiI8eGxpZmY6ZyBpZD0iREFURSI+JTEkczwveGxpZmY6Zz4gw7xiZXIgPHhsaWZmOmcgaWQ9IlNPVVJDRSI+JTIkczwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9waW5fY29kZSIgbXNnaWQ9IjM3MzE0ODg4MjcyMTg4NzYxMTUiPiJQSU4tQ29kZSBlaW5nZWJlbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bhc3N3b3JkX2NvZGUiIG1zZ2lkPSI5MTM4MTU4MzQ0ODEzMjEzNzU0Ij4iUGFzc3dvcnQgenVtIEVudHNwZXJyZW4gZWluZ2ViZW4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9waW5fcGFzc3dvcmRfY29kZSIgbXNnaWQ9IjYzODM0NzA3NTYyNTQ5MTUxNCI+IlBJTiB6dW0gRW50c3BlcnJlbiBlaW5nZWJlbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX3dyb25nX3Bpbl9jb2RlIiBtc2dpZD0iMTI5NTk4NDExNDMzODEwNzcxOCI+IkZhbHNjaGVyIFBJTi1Db2RlISI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX2xhYmVsX3RleHQiIG1zZ2lkPSI4NjE3OTY0NjEwMjgyOTg0MjQiPiJEcsO8Y2tlbiBTaWUgenVtIEVudHNwZXJyZW4gZGllIE1lbsO8dGFzdGUgdW5kIGRhbm4gYXVmIFwiMFwiLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVtZXJnZW5jeV9jYWxsX2RpYWxvZ19udW1iZXJfZm9yX2Rpc3BsYXkiIG1zZ2lkPSI2OTYxOTIxMDMxOTUwOTA5NzAiPiJOb3RydWZudW1tZXIiPC9zdHJpbmc+CkBAIC01NDUsNiArNTQ4LDcgQEAKICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcmV0dXJuX3RvX2NhbGwiIG1zZ2lkPSI1MjQ0MjU5Nzg1NTAwMDQwMDIxIj4iWnVyw7xjayB6dW0gQW5ydWYiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BhdHRlcm5fY29ycmVjdCIgbXNnaWQ9IjkwMzkwMDg2NTAzNjIyNjEyMzciPiJLb3JyZWt0ISI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGF0dGVybl93cm9uZyIgbXNnaWQ9IjQ4MTc1ODMyNzkwNTMxMTIzMTIiPiJUdXQgdW5zIGxlaWQuIFZlcnN1Y2hlbiBTaWUgZXMgbm9jaCBlaW5tYWwuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXNzd29yZF93cm9uZyIgbXNnaWQ9IjYyMzc0NDM2NTczNTgxNjg4MTkiPiJUdXQgdW5zIGxlaWQuIFZlcnN1Y2hlbiBTaWUgZXMgbm9jaCBlaW5tYWwuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wbHVnZ2VkX2luIiBtc2dpZD0iNjEzMzQzODUyODQyOTQ0NDM1Ij4iV2lyZCBnZWxhZGVuICg8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz48eGxpZmY6ZyBpZD0iUEVSQ0VOVCI+JSU8L3hsaWZmOmc+KSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fY2hhcmdlZCIgbXNnaWQ9IjQ5Mzg5MzA0NTk2MjA5ODk5NzIiPiJBdWZnZWxhZGVuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9iYXR0ZXJ5X3Nob3J0IiBtc2dpZD0iMzYxNzU0OTE3ODYwMzM1NDY1NiI+Ijx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPiA8eGxpZmY6ZyBpZD0iUEVSQ0VOVCI+JSU8L3hsaWZmOmc+Ijwvc3RyaW5nPgpAQCAtNTU5LDYgKzU2Myw4IEBACiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3NpbV9sb2NrZWRfbWVzc2FnZSIgbXNnaWQ9IjgwNjY2NjAxMjkyMDYwMDEwMzkiPiJCaXR0ZSBQSU4tQ29kZSBlaW5nZWJlbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fc2ltX3VubG9ja19wcm9ncmVzc19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjU5NTMyMzIxNDA1Mjg4MTI2NCI+IlNJTS1LYXJ0ZSB3aXJkIGVudHNwZXJydC4uLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iMzUxNDc0MjEwNjA2Njg3NzQ3NiI+IlNpZSBoYWJlbiBJaHIgRW50c3BlcnJ1bmdzbXVzdGVyIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+LW1hbCBmYWxzY2ggZ2V6ZWljaG5ldC4gIlxuXG4iVmVyc3VjaGVuIFNpZSBlcyBpbiA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBTZWt1bmRlbiBlcm5ldXQuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfcGFzc3dvcmRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI0OTA2MDM0Mzc2NDI1MTc1MzgxIj4iU2llIGhhYmVuIElociBQYXNzd29ydCA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiBNYWwgZmFsc2NoIGVpbmdlZ2ViZW4uICJcblxuIlZlcnN1Y2hlbiBTaWUgZXMgaW4gPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gU2VrdW5kZW4gZXJuZXV0LiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX3Bpbl9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjY4Mjc3NDkyMzE0NjUxNDU1OTAiPiJTaWUgaGFiZW4gSWhyZSBQSU4gPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4gTWFsIGZhbHNjaCBlaW5nZWdlYmVuLiAiXG5cbiJWZXJzdWNoZW4gU2llIGVzIGluIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IFNla3VuZGVuIGVybmV1dC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2ZhaWxlZF9hdHRlbXB0c19hbG1vc3RfZ2xvZ2luIiBtc2dpZD0iMzM1MTAxMzg0MjMyMDEyNzgyNyI+IlNpZSBoYWJlbiBJaHIgRW50c3BlcnJ1bmdzbXVzdGVyIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+LW1hbCBmYWxzY2ggZ2V6ZWljaG5ldC4gTmFjaCA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiB3ZWl0ZXJlbiBlcmZvbGdsb3NlbiBWZXJzdWNoZW4gd2VyZGVuIFNpZSBhdWZnZWZvcmRlcnQsIElociBUZWxlZm9uIG1pdGhpbGZlIElocmVyIEdvb2dsZS1Bbm1lbGRlaW5mb3JtYXRpb25lbiB6dSBlbnRzcGVycmVuLiAiXG5cbiJWZXJzdWNoZW4gU2llIGVzIGluIDx4bGlmZjpnIGlkPSJOVU1CRVJfMiI+JWQ8L3hsaWZmOmc+IFNla3VuZGVuIGVybmV1dC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9hdHRlbXB0c19jb3VudGRvd24iIG1zZ2lkPSI2MjUxNDgwMzQzMzk0Mzg5NjY1Ij4iVmVyc3VjaGVuIFNpZSBlcyBpbiA8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz4gU2VrdW5kZW4gZXJuZXV0LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fZm9yZ290X3BhdHRlcm5fYnV0dG9uX3RleHQiIG1zZ2lkPSIyNjI2OTk5NDQ5NjEwNjk1OTMwIj4iTXVzdGVyIHZlcmdlc3Nlbj8iPC9zdHJpbmc+CkBAIC03MDMsMTUgKzcwOSwxNyBAQAogICAgIDxzdHJpbmcgbmFtZT0iZWxhcHNlZF90aW1lX3Nob3J0X2Zvcm1hdF9tbV9zcyIgbXNnaWQ9IjQ0MzE1NTU5NDM4Mjg3MTE0NzMiPiI8eGxpZmY6ZyBpZD0iTUlOVVRFUyI+JTEkMDJkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iU0VDT05EUyI+JTIkMDJkPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVsYXBzZWRfdGltZV9zaG9ydF9mb3JtYXRfaF9tbV9zcyIgbXNnaWQ9IjE4NDYwNzE5OTc2MTY2NTQxMjQiPiI8eGxpZmY6ZyBpZD0iSE9VUlMiPiUxJGQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJNSU5VVEVTIj4lMiQwMmQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJTRUNPTkRTIj4lMyQwMmQ8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0QWxsIiBtc2dpZD0iNjg3NjUxODkyNTg0NDEyOTMzMSI+IkFsbGVzIGF1c3fDpGhsZW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJzZWxlY3RUZXh0IiBtc2dpZD0iMzg4OTE0OTEyMzYyNjg4ODYzNyI+IlRleHQgYXVzd8OkaGxlbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InN0b3BTZWxlY3RpbmdUZXh0IiBtc2dpZD0iNDE1NzkzMTQ2Mzg3MjMyMDk5NiI+IlRleHRhdXN3YWhsIGJlZW5kZW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjdXQiIG1zZ2lkPSIzMDkyNTY5NDA4NDM4NjI2MjYxIj4iQXVzc2NobmVpZGVuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY29weSIgbXNnaWQ9IjI2ODE5NDYyMjk1MzM1MTE5ODciPiJLb3BpZXJlbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBhc3RlIiBtc2dpZD0iNTYyOTg4MDgzNjgwNTAzNjQzMyI+IkVpbmbDvGdlbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNvcHlVcmwiIG1zZ2lkPSIyNTM4MjExNTc5NTk2MDY3NDAyIj4iVVJMIGtvcGllcmVuIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNlbGVjdFRleHRNb2RlICg2NzM4NTU2MzQ4ODYxMzQ3MjQwKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHRleHRTZWxlY3Rpb25DQUJUaXRsZSAoNTIzNjg1MDM5NDM3MDgyMDM1NykgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9ImlucHV0TWV0aG9kIiBtc2dpZD0iMTY1MzYzMDA2MjMwNDU2Nzg3OSI+IkVpbmdhYmVtZXRob2RlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iYWRkVG9EaWN0aW9uYXJ5IiBtc2dpZD0iODc5MzYyNDk5MTY4Njk0ODcwOSI+IlwiPHhsaWZmOmcgaWQ9IldPUkQiPiVzPC94bGlmZjpnPlwiIHp1bSBXw7ZydGVyYnVjaCBoaW56dWbDvGdlbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImVkaXRUZXh0TWVudVRpdGxlIiBtc2dpZD0iMTY3Mjk4OTE3Njk1ODU4MTQ1MiI+IlRleHQgYmVhcmJlaXRlbiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBlZGl0VGV4dE1lbnVUaXRsZSAoNDkwOTEzNTU2NDk0MTgxNTQ5NCkgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9Imxvd19pbnRlcm5hbF9zdG9yYWdlX3ZpZXdfdGl0bGUiIG1zZ2lkPSIxMzk5NzMyNDA4NzAxNjk3NTQ2Ij4iR2VyaW5nZXIgU3BlaWNoZXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb3dfaW50ZXJuYWxfc3RvcmFnZV92aWV3X3RleHQiIG1zZ2lkPSI2MzUxMDY1NDQ2MTYzNzg4MzYiPiJLYXVtIG5vY2ggZnJlaWVyIFRlbGVmb25zcGVpY2hlciB2ZXJmw7xnYmFyLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9rIiBtc2dpZD0iNTk3MDA2MDQzMDU2MjUyNDkxMCI+Ik9LIjwvc3RyaW5nPgpAQCAtNzE5LDYgKzcyNyw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJ5ZXMiIG1zZ2lkPSI1MzYyOTgyMzAzMzM3OTY5MzEyIj4iT0siPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJubyIgbXNnaWQ9IjUxNDE1MzEwNDQ5MzU1NDE0OTciPiJBYmJyZWNoZW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkaWFsb2dfYWxlcnRfdGl0bGUiIG1zZ2lkPSIyMDQ5NjU4NzA4NjA5MDQzMTAzIj4iQWNodHVuZyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvYWRpbmciIG1zZ2lkPSIxNzYwNzI0OTk4OTI4MjU1MjUwIj4iV2lyZCBnZWxhZGVuLi4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FwaXRhbF9vbiIgbXNnaWQ9IjE1NDQ2ODI3NTU1MTQ0OTQyOTgiPiJFSU4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXBpdGFsX29mZiIgbXNnaWQ9IjY4MTU4NzAzODY5NzI4MDU4MzIiPiJBVVMiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ3aGljaEFwcGxpY2F0aW9uIiBtc2dpZD0iNDUzMzE4NTk0NzA2NDc3MzM4NiI+IkFrdGlvbiBkdXJjaGbDvGhyZW4gbWl0Ijwvc3RyaW5nPgpAQCAtODUzLDEzICs4NjIsMTcgQEAKICAgICA8c3RyaW5nIG5hbWU9ImwydHBfaXBzZWNfcHNrX3Zwbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM5NDUwNDM1NjQwMDgzMDMyMzkiPiJMMlRQL0lQU2VjLVZQTiBtaXQgdm9yaW5zdGFsbGllcnRlbSBTY2hsw7xzc2VsIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibDJ0cF9pcHNlY19jcnRfdnBuX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNTM4MjcxNDA3MzEwMzY1MzU3NyI+IlplcnRpZmlrYXQgbWl0IHZvcmluc3RhbGxpZXJ0ZW0gU2NobMO8c3NlbCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVwbG9hZF9maWxlIiBtc2dpZD0iMjg5Nzk1NzE3MjM2NjczMDQxNiI+IkRhdGVpIGF1c3fDpGhsZW4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJub19maWxlX2Nob3NlbiIgbXNnaWQ9IjYzNjM2NDg1NjIxNzA3NTk0NjUiPiJLZWluZSBEYXRlaSBhdXNnZXfDpGhsdCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InJlc2V0IiBtc2dpZD0iMjQ0ODE2ODA4MDk2NDIwOTkwOCI+Ilp1csO8Y2tzZXR6ZW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzdWJtaXQiIG1zZ2lkPSIxNjAyMzM1NTcyMDg5OTExOTQxIj4iU2VuZGVuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZGVzY3JpcHRpb25fc3RhciIgbXNnaWQ9IjI2NTQzMTk4NzQ5MDg1NzYxMzMiPiJGYXZvcml0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FyX21vZGVfZGlzYWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSIzMTY0NzY4MjEyMDAzODY0MzE2Ij4iQXV0b21vZHVzIGFrdGl2aWVydCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcl9tb2RlX2Rpc2FibGVfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI2Njg2NjM2MjY3MjE2NzU2MTQiPiJadW0gQmVlbmRlbiBkZXMgQXV0b21vZHVzIGF1c3fDpGhsZW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0ZXRoZXJlZF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSIzMTQ2Njk0MjM0Mzk4MjAyNjAxIj4iVGV0aGVyaW5nIG9kZXIgSG90c3BvdCBha3RpdiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRldGhlcmVkX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMzA2NzEwODMyMzkwMzA0ODkyNyI+Ilp1bSBLb25maWd1cmllcmVuIGJlcsO8aHJlbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImJhY2tfYnV0dG9uX2xhYmVsIiBtc2dpZD0iMjMwMDQ3MDAwNDUwMzM0MzQzOSI+Ilp1csO8Y2siPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJuZXh0X2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjEwODA1NTUxMDQ2Nzc5OTI0MDgiPiJXZWl0ZXIiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2tpcF9idXR0b25fbGFiZWwgKDEyNzUzNjIyOTk0NzE2MzE4MTkpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZV93YXJuaW5nX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjQ4OTA4OTQyNjc0NTQ4NjcyNzYiPiJIb2hlIE1vYmlsZGF0ZW5udXR6dW5nIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVfd2FybmluZ19ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjI2MDk3MzQ3NjM4NDU3MDU3MDgiPiJXZWl0ZXJlIEluZm9ybWF0aW9uZW4gw7xiZXIgZGllIE1vYmlsZGF0ZW5udXR6dW5nIGR1cmNoIEJlcsO8aHJlbiBhdWZydWZlbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlZF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI2MjY5NTQxODk3NzI5NzgxMzMyIj4iTW9iaWxkYXRlbmxpbWl0IMO8YmVyc2Nocml0dGVuIjwvc3RyaW5nPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1lbC9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZWwvc3RyaW5ncy54bWwKaW5kZXggY2ZhMzZkMi4uOWE2ZDllZSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1lbC9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWVsL3N0cmluZ3MueG1sCkBAIC00MzYsNiArNDM2LDEwIEBACiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX2ZvcmNlTG9jayIgbXNnaWQ9IjI4MTk4Njg2NjQ5NDYwODk3NDAiPiLOlc67zq3Os8+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+MIjwvaXRlbT4KQEAgLTUyOSwxMCArNTMzLDkgQEAKICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVXb3JrIiBtc2dpZD0iMjkyNjg4NzA1MDUzNjM4NzIiPiLOlc+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+CkBAIC01NDUsNiArNTQ4LDcgQEAKICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcmV0dXJuX3RvX2NhbGwiIG1zZ2lkPSI1MjQ0MjU5Nzg1NTAwMDQwMDIxIj4izpXPgM65z4PPhM+Bzr/Phs6uIM+Dz4TOt869IM66zrvOrs+DzrciPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BhdHRlcm5fY29ycmVjdCIgbXNnaWQ9IjkwMzkwMDg2NTAzNjIyNjEyMzciPiLOo8+Jz4PPhM+MISI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGF0dGVybl93cm9uZyIgbXNnaWQ9IjQ4MTc1ODMyNzkwNTMxMTIzMTIiPiLOoM+Bzr/Pg8+AzrHOuM6uz4PPhM61IM6xz4HOs8+Mz4TOtc+BzrEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Bhc3N3b3JkX3dyb25nIiBtc2dpZD0iNjIzNzQ0MzY1NzM1ODE2ODgxOSI+Is6gz4HOv8+Dz4DOsc64zq7Pg8+EzrUgzrHPgc6zz4zPhM61z4HOsSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGx1Z2dlZF9pbiIgbXNnaWQ9IjYxMzM0Mzg1Mjg0Mjk0NDQzNSI+Is6mz4zPgc+EzrnPg863ICg8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz48eGxpZmY6ZyBpZD0iUEVSQ0VOVCI+JSU8L3hsaWZmOmc+KSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fY2hhcmdlZCIgbXNnaWQ9IjQ5Mzg5MzA0NTk2MjA5ODk5NzIiPiLOps6/z4HPhM6vz4PPhM63zrrOtS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2JhdHRlcnlfc2hvcnQiIG1zZ2lkPSIzNjE3NTQ5MTc4NjAzMzU0NjU2Ij4iPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+PHhsaWZmOmcgaWQ9IlBFUkNFTlQiPiUlPC94bGlmZjpnPiI8L3N0cmluZz4KQEAgLTU1OSw2ICs1NjMsOCBAQAogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9zaW1fbG9ja2VkX21lc3NhZ2UiIG1zZ2lkPSI4MDY2NjYwMTI5MjA2MDAxMDM5Ij4izpcgzrrOrM+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/z4TOr86yzr87Ijwvc3RyaW5nPgpAQCAtNzAzLDE1ICs3MDksMTcgQEAKICAgICA8c3RyaW5nIG5hbWU9ImVsYXBzZWRfdGltZV9zaG9ydF9mb3JtYXRfbW1fc3MiIG1zZ2lkPSI0NDMxNTU1OTQzODI4NzExNDczIj4iPHhsaWZmOmcgaWQ9Ik1JTlVURVMiPiUxJDAyZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9IlNFQ09ORFMiPiUyJDAyZDwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJlbGFwc2VkX3RpbWVfc2hvcnRfZm9ybWF0X2hfbW1fc3MiIG1zZ2lkPSIxODQ2MDcxOTk3NjE2NjU0MTI0Ij4iPHhsaWZmOmcgaWQ9IkhPVVJTIj4lMSRkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iTUlOVVRFUyI+JTIkMDJkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iU0VDT05EUyI+JTMkMDJkPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNlbGVjdEFsbCIgbXNnaWQ9IjY4NzY1MTg5MjU4NDQxMjkzMzEiPiLOlc+AzrnOu86/zrPOriDPjM67z4nOvSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InNlbGVjdFRleHQiIG1zZ2lkPSIzODg5MTQ5MTIzNjI2ODg4NjM3Ij4izpXPgM65zrvOv86zzq4gzrrOtc65zrzOrc69zr/PhSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InN0b3BTZWxlY3RpbmdUZXh0IiBtc2dpZD0iNDE1NzkzMTQ2Mzg3MjMyMDk5NiI+Is6UzrnOsc66zr/PgM6uIM61z4DOuc67zr/Os86uz4IgzrrOtc65zrzOrc69zr/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+CiAgICAgPHN0cmluZyBuYW1lPSJvayIgbXNnaWQ9IjU5NzAwNjA0MzA1NjI1MjQ5MTAiPiJPSyI8L3N0cmluZz4KQEAgLTcxOSw2ICs3MjcsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ieWVzIiBtc2dpZD0iNTM2Mjk4MjMwMzMzNzk2OTMxMiI+Ik9LIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibm8iIG1zZ2lkPSI1MTQxNTMxMDQ0OTM1NTQxNDk3Ij4izpHOus+Nz4HPic+DzrciPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkaWFsb2dfYWxlcnRfdGl0bGUiIG1zZ2lkPSIyMDQ5NjU4NzA4NjA5MDQzMTAzIj4izqDPgc6/z4POv8+Hzq4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2FkaW5nIiBtc2dpZD0iMTc2MDcyNDk5ODkyODI1NTI1MCI+Is6mz4zPgc+Ez4nPg863Li4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FwaXRhbF9vbiIgbXNnaWQ9IjE1NDQ2ODI3NTU1MTQ0OTQyOTgiPiLOlc69zrXPgc6zzr/PgM6/zrnOt868zq3Ovc6/Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FwaXRhbF9vZmYiIG1zZ2lkPSI2ODE1ODcwMzg2OTcyODA1ODMyIj4izpHPgM61zr3Otc+BzrPOv8+Azr/Or863z4POtyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9IndoaWNoQXBwbGljYXRpb24iIG1zZ2lkPSI0NTMzMTg1OTQ3MDY0NzczMzg2Ij4izp/Ou86/zrrOu86uz4HPic+DzrcgzrXOvc6tz4HOs861zrnOsc+CIM68zrUgz4TOtyDPh8+Bzq7Pg863Ijwvc3RyaW5nPgpAQCAtODUzLDEzICs4NjIsMTcgQEAKICAgICA8c3RyaW5nIG5hbWU9ImwydHBfaXBzZWNfcHNrX3Zwbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM5NDUwNDM1NjQwMDgzMDMyMzkiPiLOms67zrXOuc60zq8gcHJlLXNoYXJlZCDOss6sz4POtc65IEwyVFAvSVBTZWMgVlBOIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibDJ0cF9pcHNlY19jcnRfdnBuX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNTM4MjcxNDA3MzEwMzY1MzU3NyI+Is6gzrnPg8+Ezr/PgM6/zrnOt8+EzrnOus+MIM6yzqzPg861zrkgTDJUUC9JUFNlYyBWUE4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1cGxvYWRfZmlsZSIgbXNnaWQ9IjI4OTc5NTcxNzIzNjY3MzA0MTYiPiLOlc+AzrnOu86/zrPOriDOsc+Bz4fOtc6vzr/PhSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5vX2ZpbGVfY2hvc2VuIiBtc2dpZD0iNjM2MzY0ODU2MjE3MDc1OTQ2NSI+Is6UzrXOvSDOrc+HzrXOuSDOtc+AzrnOu861zrPOtc6vIM6xz4HPh861zq/OvyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InJlc2V0IiBtc2dpZD0iMjQ0ODE2ODA4MDk2NDIwOTkwOCI+Is6Vz4DOsc69zrHPhs6/z4HOrCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InN1Ym1pdCIgbXNnaWQ9IjE2MDIzMzU1NzIwODk5MTE5NDEiPiLOpc+Azr/Oss6/zrvOriI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImRlc2NyaXB0aW9uX3N0YXIiIG1zZ2lkPSIyNjU0MzE5ODc0OTA4NTc2MTMzIj4izrHOs86xz4DOt868zq3Ovc6/Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FyX21vZGVfZGlzYWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSIzMTY0NzY4MjEyMDAzODY0MzE2Ij4izpcgzrvOtc65z4TOv8+Fz4HOs86vzrEgzrHPhc+Ezr/Ous65zr3Ors+Ezr/PhSDOtc6vzr3Osc65IM61zr3Otc+BzrPOv8+Azr/Ouc63zrzOrc69zrciPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXJfbW9kZV9kaXNhYmxlX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iNjY4NjYzNjI2NzIxNjc1NjE0Ij4izpXPgM65zrvOrc6+z4TOtSDOs865zrEgzq3Ovs6/zrTOvyDOsc+Az4wgz4TOtyDOu861zrnPhM6/z4XPgc6zzq/OsSDOsc+Fz4TOv866zrnOvc6uz4TOv8+FLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRldGhlcmVkX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjMxNDY2OTQyMzQzOTgyMDI2MDEiPiLOo8+Nzr3OtM61z4POtyDOvM6tz4PPiSDOus65zr3Ot8+Ezq7PgiDPg8+Fz4POus61z4XOrs+CIM6uIM+DzrfOvM61zq/Ov8+FIM+Az4HPjM+DzrLOsc+DzrfPgiDOtc69zrXPgc6zzq4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0ZXRoZXJlZF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjMwNjcxMDgzMjM5MDMwNDg5MjciPiLOkc6zzrPOr86+z4TOtSDOs865zrEgzr3OsSDOs86vzr3Otc65IM60zrnOsc68z4zPgc+Gz4nPg863Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iYmFja19idXR0b25fbGFiZWwiIG1zZ2lkPSIyMzAwNDcwMDA0NTAzMzQzNDM5Ij4izqDOr8+Dz4kiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJuZXh0X2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjEwODA1NTUxMDQ2Nzc5OTI0MDgiPiLOlc+Az4zOvM61zr3OvyI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBza2lwX2J1dHRvbl9sYWJlbCAoMTI3NTM2MjI5OTQ3MTYzMTgxOSkgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlX3dhcm5pbmdfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNDg5MDg5NDI2NzQ1NDg2NzI3NiI+Is6lz4jOt867zq4gz4fPgc6uz4POtyDOtM61zrTOv868zq3Ovc+Jzr0gzrrOuc69zrfPhM6uz4Igz4TOt867zrXPhs+Jzr3Or86xz4IiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZV93YXJuaW5nX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMjYwOTczNDc2Mzg0NTcwNTcwOCI+Is6RzrPOs86vzr7PhM61IM6zzrnOsSDOvc6xIM68zqzOuM61z4TOtSDPgM61z4HOuc+Dz4PPjM+EzrXPgc6xIM+Dz4fOtc+EzrnOus6sIM68zrUgz4TOtyDPh8+Bzq7Pg863IM60zrXOtM6/zrzOrc69z4nOvSDOus65zr3Ot8+Ezq7PgiDPhM63zrvOtc+Gz4nOvc6vzrHPgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlZF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI2MjY5NTQxODk3NzI5NzgxMzMyIj4izp7Otc+AzrXPgc6sz4PPhM63zrrOtSDPhM6/IM+Mz4HOuc6/IM60zrXOtM6/zrzOrc69z4nOvSDOus65zr3Ot8+Ezq7PgiDPhM63zrvOtc+Gz4nOvc6vzrHPgiI8L3N0cmluZz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZXMtclVTL3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1lcy1yVVMvc3RyaW5ncy54bWwKaW5kZXggZGJmMzJiNi4uYjcyMDMzOSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1lcy1yVVMvc3RyaW5ncy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1lcy1yVVMvc3RyaW5ncy54bWwKQEAgLTQzNiw2ICs0MzYsMTAgQEAKICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfZm9yY2VMb2NrIiBtc2dpZD0iMjgxOTg2ODY2NDk0NjA4OTc0MCI+IkNvbnRyb2xhciBjdWFuZG8gc2UgYmxvcXVlZSBlbCBkaXNwb3NpdGl2bywgcmVxdWllcmUgcXVlIHZ1ZWx2YXMgYSBpbmdyZXNhciB0dSBjb250cmFzZcOxYS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfd2lwZURhdGEiIG1zZ2lkPSIzOTEwNTQ1NDQ2NzU4NjM5NzEzIj4iQm9ycmFyIHRvZG9zIGxvcyBkYXRvcyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfd2lwZURhdGEiIG1zZ2lkPSIyMzE0MDYwOTMzNzk2Mzk2MjA1Ij4iUmVhbGl6YXIgdW4gcmVlc3RhYmxlY2ltaWVudG8gZGUgZsOhYnJpY2EgeSBib3JyYXIgdG9kb3MgdHVzIGRhdG9zIHNpbiBuaW5ndW5hIGNvbmZpcm1hY2nDs24uIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBvbGljeWxhYl9zZXRHbG9iYWxQcm94eSAoMjc4NDgyODI5Mzc0Nzc5MTQ0NikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwb2xpY3lkZXNjX3NldEdsb2JhbFByb3h5ICg2Mzg3NDk3NDY2NjYwMTU0OTMxKSAtLT4KKyAgICA8c2tpcCAvPgogICA8c3RyaW5nLWFycmF5IG5hbWU9InBob25lVHlwZXMiPgogICAgIDxpdGVtIG1zZ2lkPSI4OTAxMDk4MzM2NjU4NzEwMzU5Ij4iQ2FzYSI8L2l0ZW0+CiAgICAgPGl0ZW0gbXNnaWQ9Ijg2OTkyMzY1MDUyNzEzNjYxNSI+IkNlbHVsYXIiPC9pdGVtPgpAQCAtNTI5LDEwICs1MzMsOSBAQAogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZVdvcmsiIG1zZ2lkPSIyOTI2ODg3MDUwNTM2Mzg3MiI+IlRyYWJham8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlT3RoZXIiIG1zZ2lkPSIzOTUxNzgxMTMxNTcwMTI0MDgyIj4iT3RybyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVDdXN0b20iIG1zZ2lkPSIyMjU1MjM0MTUzNzIwODgzMjIiPiJQZXJzb25hbGl6YWRvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iY29udGFjdF9zdGF0dXNfdXBkYXRlX2F0dHJpYnV0aW9uIiBtc2dpZD0iNTExMjU4OTg4NjA5NDQwMjc5NSI+ImEgdHJhdsOpcyBkZSA8eGxpZmY6ZyBpZD0iU09VUkNFIj4lMSRzPC94bGlmZjpnPiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbl93aXRoX2RhdGUiIG1zZ2lkPSI1OTQ1Mzg2Mzc2MzY5OTc5OTA5Ij4iPHhsaWZmOmcgaWQ9IkRBVEUiPiUxJHM8L3hsaWZmOmc+IGEgdHJhdsOpcyBkZSA8eGxpZmY6ZyBpZD0iU09VUkNFIj4lMiRzPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bpbl9jb2RlIiBtc2dpZD0iMzczMTQ4ODgyNzIxODg3NjExNSI+IkluZ3Jlc2FyIGVsIGPDs2RpZ28gZGUgUElOIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGFzc3dvcmRfY29kZSIgbXNnaWQ9IjkxMzgxNTgzNDQ4MTMyMTM3NTQiPiJJbmdyZXNhciBsYSBjb250cmFzZcOxYSBwYXJhIGRlc2Jsb3F1ZWFyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGluX3Bhc3N3b3JkX2NvZGUiIG1zZ2lkPSI2MzgzNDcwNzU2MjU0OTE1MTQiPiJJbmdyZXNhIGVsIFBJTiBwYXJhIGRlc2Jsb3F1ZWFyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfd3JvbmdfcGluX2NvZGUiIG1zZ2lkPSIxMjk1OTg0MTE0MzM4MTA3NzE4Ij4iwqFDw7NkaWdvIGRlIFBJTiBpbmNvcnJlY3RvISI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX2xhYmVsX3RleHQiIG1zZ2lkPSI4NjE3OTY0NjEwMjgyOTg0MjQiPiJQYXJhIGRlc2Jsb3F1ZWFyLCBwcmVzaW9uYSBlbCBtZW7DuiB5IGx1ZWdvIDAuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZW1lcmdlbmN5X2NhbGxfZGlhbG9nX251bWJlcl9mb3JfZGlzcGxheSIgbXNnaWQ9IjY5NjE5MjEwMzE5NTA5MDk3MCI+Ik7Dum1lcm8gZGUgZW1lcmdlbmNpYSI8L3N0cmluZz4KQEAgLTU0NSw2ICs1NDgsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9yZXR1cm5fdG9fY2FsbCIgbXNnaWQ9IjUyNDQyNTk3ODU1MDAwNDAwMjEiPiJSZWdyZXNhciBhIGxsYW1hZGEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BhdHRlcm5fY29ycmVjdCIgbXNnaWQ9IjkwMzkwMDg2NTAzNjIyNjEyMzciPiJDb3JyZWN0byI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGF0dGVybl93cm9uZyIgbXNnaWQ9IjQ4MTc1ODMyNzkwNTMxMTIzMTIiPiJMbyBzZW50aW1vcywgdnVlbHZlIGEgaW50ZW50YXJsbyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGFzc3dvcmRfd3JvbmciIG1zZ2lkPSI2MjM3NDQzNjU3MzU4MTY4ODE5Ij4iTG8gc2VudGltb3MsIHZ1ZWx2ZSBhIGludGVudGFybG8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BsdWdnZWRfaW4iIG1zZ2lkPSI2MTMzNDM4NTI4NDI5NDQ0MzUiPiJDYXJnYW5kbyAoPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+PHhsaWZmOmcgaWQ9IlBFUkNFTlQiPiUlPC94bGlmZjpnPikiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2NoYXJnZWQiIG1zZ2lkPSI0OTM4OTMwNDU5NjIwOTg5OTcyIj4iQ2FyZ2FkYS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2JhdHRlcnlfc2hvcnQiIG1zZ2lkPSIzNjE3NTQ5MTc4NjAzMzU0NjU2Ij4iU2VnbWVudG8gPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+PHhsaWZmOmcgaWQ9IlBFUkNFTlQiPiUlPC94bGlmZjpnPiI8L3N0cmluZz4KQEAgLTU1OSw2ICs1NjMsOCBAQAogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9zaW1fbG9ja2VkX21lc3NhZ2UiIG1zZ2lkPSI4MDY2NjYwMTI5MjA2MDAxMDM5Ij4iTGEgdGFyamV0YSBTSU0gZXN0w6EgYmxvcXVlYWRhLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fc2ltX3VubG9ja19wcm9ncmVzc19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjU5NTMyMzIxNDA1Mjg4MTI2NCI+IkRlc2Jsb3F1ZWFuZG8gdGFyamV0YSBTSU3igKYiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjM1MTQ3NDIxMDYwNjY4Nzc0NzYiPiJIYXMgZXh0cmHDrWRvIGluY29ycmVjdGFtZW50ZSB0dSBwYXRyw7NuIGRlIGRlc2Jsb3F1ZW8gPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4gdmVjZXMuICJcblxuIlZ1ZWx2ZSBhIGludGVudGFybG8gZW4gPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gc2VndW5kb3MuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfcGFzc3dvcmRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI0OTA2MDM0Mzc2NDI1MTc1MzgxIj4iSGFzIGluZ3Jlc2FkbyB0dSBjb250cmFzZcOxYSBkZSBtYW5lcmEgaW5jb3JyZWN0YSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiB2ZWNlcy4gIlxuXG4iVnVlbHZlIGEgaW50ZW50YXJsbyBlbiA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBzZWd1bmRvcy4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9waW5fYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI2ODI3NzQ5MjMxNDY1MTQ1NTkwIj4iSGFzIGluZ3Jlc2FkbyB0dSBQSU4gZGUgbWFuZXJhIGluY29ycmVjdGEgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4gdmVjZXMuICJcblxuIlZ1ZWx2ZSBhIGludGVudGFybG8gZW4gPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gc2VndW5kb3MuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9mYWlsZWRfYXR0ZW1wdHNfYWxtb3N0X2dsb2dpbiIgbXNnaWQ9IjMzNTEwMTM4NDIzMjAxMjc4MjciPiJIYXMgZXh0cmHDrWRvIGluY29ycmVjdGFtZW50ZSB0dSBwYXRyw7NuIGRlIGRlc2Jsb3F1ZW8gPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4gdmVjZXMuIEx1ZWdvIGRlIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IGludGVudG9zIGluY29ycmVjdG9zLCBzZSB0ZSBzb2xpY2l0YXLDoSBxdWUgZGVzYmxvcXVlZXMgdHUgdGVsw6lmb25vIGFsIGluaWNpYXIgc2VzacOzbiBlbiBHb29nbGUuICJcblxuIiBWdWVsdmUgYSBpbnRlbnRhcmxvIGVuIDx4bGlmZjpnIGlkPSJOVU1CRVJfMiI+JWQ8L3hsaWZmOmc+IHNlZ3VuZG9zLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX2F0dGVtcHRzX2NvdW50ZG93biIgbXNnaWQ9IjYyNTE0ODAzNDMzOTQzODk2NjUiPiJWdWVsdmUgYSBpbnRlbnRhcmxvIGVuIDx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPiBzZWd1bmRvcy4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2ZvcmdvdF9wYXR0ZXJuX2J1dHRvbl90ZXh0IiBtc2dpZD0iMjYyNjk5OTQ0OTYxMDY5NTkzMCI+IsK/T2x2aWRhc3RlIGVsIHBhdHLDs24/Ijwvc3RyaW5nPgpAQCAtNzAzLDE1ICs3MDksMTcgQEAKICAgICA8c3RyaW5nIG5hbWU9ImVsYXBzZWRfdGltZV9zaG9ydF9mb3JtYXRfbW1fc3MiIG1zZ2lkPSI0NDMxNTU1OTQzODI4NzExNDczIj4iPHhsaWZmOmcgaWQ9Ik1JTlVURVMiPiUxJDAyZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9IlNFQ09ORFMiPiUyJDAyZDwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJlbGFwc2VkX3RpbWVfc2hvcnRfZm9ybWF0X2hfbW1fc3MiIG1zZ2lkPSIxODQ2MDcxOTk3NjE2NjU0MTI0Ij4iPHhsaWZmOmcgaWQ9IkhPVVJTIj4lMSRkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iTUlOVVRFUyI+JTIkMDJkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iU0VDT05EUyI+JTMkMDJkPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNlbGVjdEFsbCIgbXNnaWQ9IjY4NzY1MTg5MjU4NDQxMjkzMzEiPiJTZWxlY2Npb25hciB0b2RvcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InNlbGVjdFRleHQiIG1zZ2lkPSIzODg5MTQ5MTIzNjI2ODg4NjM3Ij4iU2VsZWNjaW9uYXIgdGV4dG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJzdG9wU2VsZWN0aW5nVGV4dCIgbXNnaWQ9IjQxNTc5MzE0NjM4NzIzMjA5OTYiPiJEZXRlbmVyIGxhIHNlbGVjY2nDs24gZGUgdGV4dG8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjdXQiIG1zZ2lkPSIzMDkyNTY5NDA4NDM4NjI2MjYxIj4iQ29ydGFyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY29weSIgbXNnaWQ9IjI2ODE5NDYyMjk1MzM1MTE5ODciPiJDb3BpYXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwYXN0ZSIgbXNnaWQ9IjU2Mjk4ODA4MzY4MDUwMzY0MzMiPiJQZWdhciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNvcHlVcmwiIG1zZ2lkPSIyNTM4MjExNTc5NTk2MDY3NDAyIj4iQ29waWFyIFVSTCI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzZWxlY3RUZXh0TW9kZSAoNjczODU1NjM0ODg2MTM0NzI0MCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciB0ZXh0U2VsZWN0aW9uQ0FCVGl0bGUgKDUyMzY4NTAzOTQzNzA4MjAzNTcpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJpbnB1dE1ldGhvZCIgbXNnaWQ9IjE2NTM2MzAwNjIzMDQ1Njc4NzkiPiJNw6l0b2RvIGRlIGVudHJhZGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJhZGRUb0RpY3Rpb25hcnkiIG1zZ2lkPSI4NzkzNjI0OTkxNjg2OTQ4NzA5Ij4iQWdyZWdhciBcIjx4bGlmZjpnIGlkPSJXT1JEIj4lczwveGxpZmY6Zz5cIiBhbCBkaWNjaW9uYXJpbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImVkaXRUZXh0TWVudVRpdGxlIiBtc2dpZD0iMTY3Mjk4OTE3Njk1ODU4MTQ1MiI+IkVkaXRhciB0ZXh0byI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBlZGl0VGV4dE1lbnVUaXRsZSAoNDkwOTEzNTU2NDk0MTgxNTQ5NCkgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9Imxvd19pbnRlcm5hbF9zdG9yYWdlX3ZpZXdfdGl0bGUiIG1zZ2lkPSIxMzk5NzMyNDA4NzAxNjk3NTQ2Ij4iUG9jbyBlc3BhY2lvIGRlIGFsbWFjZW5hbWllbnRvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG93X2ludGVybmFsX3N0b3JhZ2Vfdmlld190ZXh0IiBtc2dpZD0iNjM1MTA2NTQ0NjE2Mzc4ODM2Ij4iSGF5IHBvY28gZXNwYWNpbyBkZSBhbG1hY2VuYW1pZW50byBlbiBlbCB0ZWzDqWZvbm8uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ib2siIG1zZ2lkPSI1OTcwMDYwNDMwNTYyNTI0OTEwIj4iQWNlcHRhciI8L3N0cmluZz4KQEAgLTcxOSw2ICs3MjcsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ieWVzIiBtc2dpZD0iNTM2Mjk4MjMwMzMzNzk2OTMxMiI+IkFjZXB0YXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJubyIgbXNnaWQ9IjUxNDE1MzEwNDQ5MzU1NDE0OTciPiJDYW5jZWxhciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRpYWxvZ19hbGVydF90aXRsZSIgbXNnaWQ9IjIwNDk2NTg3MDg2MDkwNDMxMDMiPiJBdGVuY2nDs24iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2FkaW5nIiBtc2dpZD0iMTc2MDcyNDk5ODkyODI1NTI1MCI+IkNhcmdhbmRvLi4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FwaXRhbF9vbiIgbXNnaWQ9IjE1NDQ2ODI3NTU1MTQ0OTQyOTgiPiJFbmNlbmRpZG8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXBpdGFsX29mZiIgbXNnaWQ9IjY4MTU4NzAzODY5NzI4MDU4MzIiPiJBUEFHQURPIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0id2hpY2hBcHBsaWNhdGlvbiIgbXNnaWQ9IjQ1MzMxODU5NDcwNjQ3NzMzODYiPiJDb21wbGV0YXIgbGEgYWNjacOzbiBtZWRpYW50ZSI8L3N0cmluZz4KQEAgLTg1MywxMyArODYyLDE3IEBACiAgICAgPHN0cmluZyBuYW1lPSJsMnRwX2lwc2VjX3Bza192cG5fZGVzY3JpcHRpb24iIG1zZ2lkPSIzOTQ1MDQzNTY0MDA4MzAzMjM5Ij4iQ2xhdmUgcHJldmlhbWVudGUgY29tcGFydGlkYSBzZWfDum4gTDJUUC9JUFNlYyBWUE4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsMnRwX2lwc2VjX2NydF92cG5fZGVzY3JpcHRpb24iIG1zZ2lkPSI1MzgyNzE0MDczMTAzNjUzNTc3Ij4iQ2VydGlmaWNhZG8gc2Vnw7puIEwyVFAvSVBTZWMgVlBOIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXBsb2FkX2ZpbGUiIG1zZ2lkPSIyODk3OTU3MTcyMzY2NzMwNDE2Ij4iRWxlZ2lyIGFyY2hpdm8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJub19maWxlX2Nob3NlbiIgbXNnaWQ9IjYzNjM2NDg1NjIxNzA3NTk0NjUiPiJObyBzZSBzZWxlY2Npb27DsyB1biBhcmNoaXZvLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InJlc2V0IiBtc2dpZD0iMjQ0ODE2ODA4MDk2NDIwOTkwOCI+IlJlc3RhYmxlY2VyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic3VibWl0IiBtc2dpZD0iMTYwMjMzNTU3MjA4OTkxMTk0MSI+IkVudmlhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImRlc2NyaXB0aW9uX3N0YXIiIG1zZ2lkPSIyNjU0MzE5ODc0OTA4NTc2MTMzIj4iZmF2b3JpdG8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXJfbW9kZV9kaXNhYmxlX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjMxNjQ3NjgyMTIwMDM4NjQzMTYiPiJNb2RvIGF1dG8gaGFiaWxpdGFkbyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcl9tb2RlX2Rpc2FibGVfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI2Njg2NjM2MjY3MjE2NzU2MTQiPiJTZWxlY2Npb25hciBwYXJhIHNhbGlyIGRlbCBtb2RvIGF1dG8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0ZXRoZXJlZF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSIzMTQ2Njk0MjM0Mzk4MjAyNjAxIj4iQW5jbGFqZSBhIHJlZCBvIHpvbmEgYWN0aXZhIGNvbmVjdGFkb3MiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0ZXRoZXJlZF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjMwNjcxMDgzMjM5MDMwNDg5MjciPiJUb2NhciBwYXJhIGNvbmZpZ3VyYXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJiYWNrX2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjIzMDA0NzAwMDQ1MDMzNDM0MzkiPiJBdHLDoXMiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJuZXh0X2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjEwODA1NTUxMDQ2Nzc5OTI0MDgiPiJTaWd1aWVudGUiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2tpcF9idXR0b25fbGFiZWwgKDEyNzUzNjIyOTk0NzE2MzE4MTkpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZV93YXJuaW5nX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjQ4OTA4OTQyNjc0NTQ4NjcyNzYiPiJBbXBsaWEgdXRpbGl6YWNpw7NuIGRlIGRhdG9zIG3Ds3ZpbGVzIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVfd2FybmluZ19ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjI2MDk3MzQ3NjM4NDU3MDU3MDgiPiJUb2NhIHBhcmEgb2J0ZW5lciBtw6FzIGluZm9ybWFjacOzbiBhY2VyY2EgZGUgbGEgdXRpbGl6YWNpw7NuIGRlIGRhdG9zIG3Ds3ZpbGVzLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlZF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI2MjY5NTQxODk3NzI5NzgxMzMyIj4iTMOtbWl0ZSBkZSBkYXRvcyBtw7N2aWxlcyBleGNlZGlkbyAiPC9zdHJpbmc+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWVzL3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1lcy9zdHJpbmdzLnhtbAppbmRleCA0MjVmY2EzLi4wYWVhZjJlIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWVzL3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZXMvc3RyaW5ncy54bWwKQEAgLTQzNiw2ICs0MzYsMTAgQEAKICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfZm9yY2VMb2NrIiBtc2dpZD0iMjgxOTg2ODY2NDk0NjA4OTc0MCI+IlBlcm1pdGUgY29udHJvbGFyIGVsIG1vbWVudG8gZGUgYmxvcXVlbyBkZWwgZGlzcG9zaXRpdm8gc29saWNpdGFuZG8gYWwgdXN1YXJpbyBxdWUgdnVlbHZhIGEgaW50cm9kdWNpciBsYSBjb250cmFzZcOxYS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfd2lwZURhdGEiIG1zZ2lkPSIzOTEwNTQ1NDQ2NzU4NjM5NzEzIj4iQm9ycmFyIHRvZG9zIGxvcyBkYXRvcyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfd2lwZURhdGEiIG1zZ2lkPSIyMzE0MDYwOTMzNzk2Mzk2MjA1Ij4iUGVybWl0ZSByZWFsaXphciB1biByZXN0YWJsZWNpbWllbnRvIGRlIGbDoWJyaWNhIGVsaW1pbmFuZG8gdG9kb3MgbG9zIGRhdG9zIHNpbiBjb25maXJtYWNpw7NuLiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwb2xpY3lsYWJfc2V0R2xvYmFsUHJveHkgKDI3ODQ4MjgyOTM3NDc3OTE0NDYpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcG9saWN5ZGVzY19zZXRHbG9iYWxQcm94eSAoNjM4NzQ5NzQ2NjY2MDE1NDkzMSkgLS0+CisgICAgPHNraXAgLz4KICAgPHN0cmluZy1hcnJheSBuYW1lPSJwaG9uZVR5cGVzIj4KICAgICA8aXRlbSBtc2dpZD0iODkwMTA5ODMzNjY1ODcxMDM1OSI+IkNhc2EiPC9pdGVtPgogICAgIDxpdGVtIG1zZ2lkPSI4Njk5MjM2NTA1MjcxMzY2MTUiPiJNw7N2aWwiPC9pdGVtPgpAQCAtNTI5LDEwICs1MzMsOSBAQAogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZVdvcmsiIG1zZ2lkPSIyOTI2ODg3MDUwNTM2Mzg3MiI+IlRyYWJham8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlT3RoZXIiIG1zZ2lkPSIzOTUxNzgxMTMxNTcwMTI0MDgyIj4iT3RyYSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVDdXN0b20iIG1zZ2lkPSIyMjU1MjM0MTUzNzIwODgzMjIiPiJQZXJzb25hbGl6YWRhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iY29udGFjdF9zdGF0dXNfdXBkYXRlX2F0dHJpYnV0aW9uIiBtc2dpZD0iNTExMjU4OTg4NjA5NDQwMjc5NSI+ImEgdHJhdsOpcyBkZSA8eGxpZmY6ZyBpZD0iU09VUkNFIj4lMSRzPC94bGlmZjpnPiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbl93aXRoX2RhdGUiIG1zZ2lkPSI1OTQ1Mzg2Mzc2MzY5OTc5OTA5Ij4iPHhsaWZmOmcgaWQ9IkRBVEUiPiUxJHM8L3hsaWZmOmc+IGEgdHJhdsOpcyBkZSA8eGxpZmY6ZyBpZD0iU09VUkNFIj4lMiRzPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bpbl9jb2RlIiBtc2dpZD0iMzczMTQ4ODgyNzIxODg3NjExNSI+IkludHJvZHVjZSBlbCBjw7NkaWdvIFBJTiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bhc3N3b3JkX2NvZGUiIG1zZ2lkPSI5MTM4MTU4MzQ0ODEzMjEzNzU0Ij4iSW50cm9kdWNpciBjb250cmFzZcOxYSBwYXJhIGRlc2Jsb3F1ZWFyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGluX3Bhc3N3b3JkX2NvZGUiIG1zZ2lkPSI2MzgzNDcwNzU2MjU0OTE1MTQiPiJJbnRyb2R1Y2lyIFBJTiBwYXJhIGRlc2Jsb3F1ZWFyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfd3JvbmdfcGluX2NvZGUiIG1zZ2lkPSIxMjk1OTg0MTE0MzM4MTA3NzE4Ij4iRWwgY8OzZGlnbyBQSU4gZXMgaW5jb3JyZWN0by4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9sYWJlbF90ZXh0IiBtc2dpZD0iODYxNzk2NDYxMDI4Mjk4NDI0Ij4iUGFyYSBkZXNibG9xdWVhciBlbCB0ZWzDqWZvbm8sIHB1bHNhIGxhIHRlY2xhIGRlIG1lbsO6IHksIGEgY29udGludWFjacOzbiwgcHVsc2EgMC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJlbWVyZ2VuY3lfY2FsbF9kaWFsb2dfbnVtYmVyX2Zvcl9kaXNwbGF5IiBtc2dpZD0iNjk2MTkyMTAzMTk1MDkwOTcwIj4iTsO6bWVybyBkZSBlbWVyZ2VuY2lhIjwvc3RyaW5nPgpAQCAtNTQ1LDYgKzU0OCw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3JldHVybl90b19jYWxsIiBtc2dpZD0iNTI0NDI1OTc4NTUwMDA0MDAyMSI+IlZvbHZlciBhIGxsYW1hZGEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BhdHRlcm5fY29ycmVjdCIgbXNnaWQ9IjkwMzkwMDg2NTAzNjIyNjEyMzciPiJDb3JyZWN0byI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGF0dGVybl93cm9uZyIgbXNnaWQ9IjQ4MTc1ODMyNzkwNTMxMTIzMTIiPiJJbnTDqW50YWxvIGRlIG51ZXZvIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXNzd29yZF93cm9uZyIgbXNnaWQ9IjYyMzc0NDM2NTczNTgxNjg4MTkiPiJJbnTDqW50YWxvIGRlIG51ZXZvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wbHVnZ2VkX2luIiBtc2dpZD0iNjEzMzQzODUyODQyOTQ0NDM1Ij4iQ2FyZ2FuZG8gKDx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPjx4bGlmZjpnIGlkPSJQRVJDRU5UIj4lJTwveGxpZmY6Zz4pIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9jaGFyZ2VkIiBtc2dpZD0iNDkzODkzMDQ1OTYyMDk4OTk3MiI+IkNhcmdhZG8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2JhdHRlcnlfc2hvcnQiIG1zZ2lkPSIzNjE3NTQ5MTc4NjAzMzU0NjU2Ij4iPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+IDx4bGlmZjpnIGlkPSJQRVJDRU5UIj4lJTwveGxpZmY6Zz4iPC9zdHJpbmc+CkBAIC01NTksNiArNTYzLDggQEAKICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fc2ltX2xvY2tlZF9tZXNzYWdlIiBtc2dpZD0iODA2NjY2MDEyOTIwNjAwMTAzOSI+IkludHJvZHVjZSBlbCBjw7NkaWdvIFBJTi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3NpbV91bmxvY2tfcHJvZ3Jlc3NfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI1OTUzMjMyMTQwNTI4ODEyNjQiPiJEZXNibG9xdWVhbmRvIHRhcmpldGEgU0lNLi4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSIzNTE0NzQyMTA2MDY2ODc3NDc2Ij4iSGFzIHJlYWxpemFkbyA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiBpbnRlbnRvcyBmYWxsaWRvcyBkZSBjcmVhY2nDs24gZGUgdW4gcGF0csOzbiBkZSBkZXNibG9xdWVvLiAiXG5cbiJJbnTDqW50YWxvIGRlIG51ZXZvIGRlbnRybyBkZSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBzZWd1bmRvcy4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9wYXNzd29yZF9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjQ5MDYwMzQzNzY0MjUxNzUzODEiPiJIYXMgaW50cm9kdWNpZG8gdW5hIGNvbnRyYXNlw7FhIGluY29ycmVjdGEgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4gdmVjZXMuICJcblxuIkludMOpbnRhbG8gZGUgbnVldm8gZGVudHJvIGRlIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IHNlZ3VuZG9zLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX3Bpbl9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjY4Mjc3NDkyMzE0NjUxNDU1OTAiPiJIYXMgaW50cm9kdWNpZG8gdW4gUElOIGluY29ycmVjdG8gPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4gdmVjZXMuICJcblxuIkludMOpbnRhbG8gZGUgbnVldm8gZGVudHJvIGRlIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IHNlZ3VuZG9zLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fZmFpbGVkX2F0dGVtcHRzX2FsbW9zdF9nbG9naW4iIG1zZ2lkPSIzMzUxMDEzODQyMzIwMTI3ODI3Ij4iSGFzIHJlYWxpemFkbyA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiBpbnRlbnRvcyBmYWxsaWRvcyBkZSBjcmVhY2nDs24gZGVsIHBhdHLDs24gZGUgZGVzYmxvcXVlby4gU2kgcmVhbGl6YXMgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gaW50ZW50b3MgZmFsbGlkb3MgbcOhcywgc2UgdGUgcGVkaXLDoSBxdWUgZGVzYmxvcXVlZXMgZWwgdGVsw6lmb25vIGNvbiB0dXMgY3JlZGVuY2lhbGVzIGRlIGFjY2VzbyBkZSBHb29nbGUuIlxuXG4iIEVzcGVyYSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzIiPiVkPC94bGlmZjpnPiBzZWd1bmRvcyBlIGludMOpbnRhbG8gZGUgbnVldm8uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfYXR0ZW1wdHNfY291bnRkb3duIiBtc2dpZD0iNjI1MTQ4MDM0MzM5NDM4OTY2NSI+IkVzcGVyYSA8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz4gc2VndW5kb3MgeSB2dWVsdmUgYSBpbnRlbnRhcmxvLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fZm9yZ290X3BhdHRlcm5fYnV0dG9uX3RleHQiIG1zZ2lkPSIyNjI2OTk5NDQ5NjEwNjk1OTMwIj4iwr9IYXMgb2x2aWRhZG8gZWwgcGF0csOzbj8iPC9zdHJpbmc+CkBAIC03MDMsMTUgKzcwOSwxNyBAQAogICAgIDxzdHJpbmcgbmFtZT0iZWxhcHNlZF90aW1lX3Nob3J0X2Zvcm1hdF9tbV9zcyIgbXNnaWQ9IjQ0MzE1NTU5NDM4Mjg3MTE0NzMiPiI8eGxpZmY6ZyBpZD0iTUlOVVRFUyI+JTEkMDJkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iU0VDT05EUyI+JTIkMDJkPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVsYXBzZWRfdGltZV9zaG9ydF9mb3JtYXRfaF9tbV9zcyIgbXNnaWQ9IjE4NDYwNzE5OTc2MTY2NTQxMjQiPiI8eGxpZmY6ZyBpZD0iSE9VUlMiPiUxJGQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJNSU5VVEVTIj4lMiQwMmQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJTRUNPTkRTIj4lMyQwMmQ8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0QWxsIiBtc2dpZD0iNjg3NjUxODkyNTg0NDEyOTMzMSI+IlNlbGVjY2lvbmFyIHRvZG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJzZWxlY3RUZXh0IiBtc2dpZD0iMzg4OTE0OTEyMzYyNjg4ODYzNyI+IlNlbGVjY2lvbmFyIHRleHRvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ic3RvcFNlbGVjdGluZ1RleHQiIG1zZ2lkPSI0MTU3OTMxNDYzODcyMzIwOTk2Ij4iRGV0ZW5lciBzZWxlY2Npw7NuIGRlIHRleHRvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY3V0IiBtc2dpZD0iMzA5MjU2OTQwODQzODYyNjI2MSI+IkNvcnRhciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNvcHkiIG1zZ2lkPSIyNjgxOTQ2MjI5NTMzNTExOTg3Ij4iQ29waWFyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGFzdGUiIG1zZ2lkPSI1NjI5ODgwODM2ODA1MDM2NDMzIj4iUGVnYXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjb3B5VXJsIiBtc2dpZD0iMjUzODIxMTU3OTU5NjA2NzQwMiI+IkNvcGlhciBVUkwiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2VsZWN0VGV4dE1vZGUgKDY3Mzg1NTYzNDg4NjEzNDcyNDApIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgdGV4dFNlbGVjdGlvbkNBQlRpdGxlICg1MjM2ODUwMzk0MzcwODIwMzU3KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0iaW5wdXRNZXRob2QiIG1zZ2lkPSIxNjUzNjMwMDYyMzA0NTY3ODc5Ij4iTcOpdG9kbyBkZSBpbnRyb2R1Y2Npw7NuIGRlIHRleHRvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iYWRkVG9EaWN0aW9uYXJ5IiBtc2dpZD0iODc5MzYyNDk5MTY4Njk0ODcwOSI+IkHDsWFkaXIgXCI8eGxpZmY6ZyBpZD0iV09SRCI+JXM8L3hsaWZmOmc+XCIgYWwgZGljY2lvbmFyaW8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJlZGl0VGV4dE1lbnVUaXRsZSIgbXNnaWQ9IjE2NzI5ODkxNzY5NTg1ODE0NTIiPiJFZGl0YXIgdGV4dG8iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZWRpdFRleHRNZW51VGl0bGUgKDQ5MDkxMzU1NjQ5NDE4MTU0OTQpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJsb3dfaW50ZXJuYWxfc3RvcmFnZV92aWV3X3RpdGxlIiBtc2dpZD0iMTM5OTczMjQwODcwMTY5NzU0NiI+IlBvY28gZXNwYWNpbyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Imxvd19pbnRlcm5hbF9zdG9yYWdlX3ZpZXdfdGV4dCIgbXNnaWQ9IjYzNTEwNjU0NDYxNjM3ODgzNiI+IlNlIGVzdMOhIGFnb3RhbmRvIGVsIGVzcGFjaW8gZGUgYWxtYWNlbmFtaWVudG8gZGVsIHRlbMOpZm9uby4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvayIgbXNnaWQ9IjU5NzAwNjA0MzA1NjI1MjQ5MTAiPiJBY2VwdGFyIjwvc3RyaW5nPgpAQCAtNzE5LDYgKzcyNyw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJ5ZXMiIG1zZ2lkPSI1MzYyOTgyMzAzMzM3OTY5MzEyIj4iQWNlcHRhciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im5vIiBtc2dpZD0iNTE0MTUzMTA0NDkzNTU0MTQ5NyI+IkNhbmNlbGFyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGlhbG9nX2FsZXJ0X3RpdGxlIiBtc2dpZD0iMjA0OTY1ODcwODYwOTA0MzEwMyI+IkF0ZW5jacOzbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvYWRpbmciIG1zZ2lkPSIxNzYwNzI0OTk4OTI4MjU1MjUwIj4iQ2FyZ2FuZG/igKYiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXBpdGFsX29uIiBtc2dpZD0iMTU0NDY4Mjc1NTUxNDQ5NDI5OCI+IkFjdGl2YWRvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FwaXRhbF9vZmYiIG1zZ2lkPSI2ODE1ODcwMzg2OTcyODA1ODMyIj4iRGVzY29uZWN0YWRvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0id2hpY2hBcHBsaWNhdGlvbiIgbXNnaWQ9IjQ1MzMxODU5NDcwNjQ3NzMzODYiPiJDb21wbGV0YXIgYWNjacOzbiB1dGlsaXphbmRvIjwvc3RyaW5nPgpAQCAtODUzLDEzICs4NjIsMTcgQEAKICAgICA8c3RyaW5nIG5hbWU9ImwydHBfaXBzZWNfcHNrX3Zwbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM5NDUwNDM1NjQwMDgzMDMyMzkiPiJSZWQgcHJpdmFkYSB2aXJ0dWFsIEwyVFAvSVBTZWMgYmFzYWRhIGVuIGNsYXZlIGNvbXBhcnRpZGEgcHJldmlhbWVudGUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsMnRwX2lwc2VjX2NydF92cG5fZGVzY3JpcHRpb24iIG1zZ2lkPSI1MzgyNzE0MDczMTAzNjUzNTc3Ij4iUmVkIHByaXZhZGEgdmlydHVhbCBMMlRQL0lQU2VjIGJhc2FkYSBlbiBjZXJ0aWZpY2FkbyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVwbG9hZF9maWxlIiBtc2dpZD0iMjg5Nzk1NzE3MjM2NjczMDQxNiI+IlNlbGVjY2lvbmFyIGFyY2hpdm8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJub19maWxlX2Nob3NlbiIgbXNnaWQ9IjYzNjM2NDg1NjIxNzA3NTk0NjUiPiJBcmNoaXZvIG5vIHNlbGVjY2lvbmFkbyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InJlc2V0IiBtc2dpZD0iMjQ0ODE2ODA4MDk2NDIwOTkwOCI+IlJlc3RhYmxlY2VyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic3VibWl0IiBtc2dpZD0iMTYwMjMzNTU3MjA4OTkxMTk0MSI+IkVudmlhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImRlc2NyaXB0aW9uX3N0YXIiIG1zZ2lkPSIyNjU0MzE5ODc0OTA4NTc2MTMzIj4iZmF2b3JpdG9zIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FyX21vZGVfZGlzYWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSIzMTY0NzY4MjEyMDAzODY0MzE2Ij4iU2UgaGEgaGFiaWxpdGFkbyBlbCBtb2RvIGNvY2hlLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcl9tb2RlX2Rpc2FibGVfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI2Njg2NjM2MjY3MjE2NzU2MTQiPiJTZWxlY2Npb25hIGVzdGEgb3BjacOzbiBwYXJhIHNhbGlyIGRlbCBtb2RvIGNvY2hlLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRldGhlcmVkX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjMxNDY2OTQyMzQzOTgyMDI2MDEiPiJBbmNsYWplIGEgcmVkIGFjdGl2byBvIHpvbmEgV2ktRmkiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0ZXRoZXJlZF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjMwNjcxMDgzMjM5MDMwNDg5MjciPiJUb2NhIHBhcmEgaW5pY2lhciBsYSBjb25maWd1cmFjacOzbi4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJiYWNrX2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjIzMDA0NzAwMDQ1MDMzNDM0MzkiPiJBdHLDoXMiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJuZXh0X2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjEwODA1NTUxMDQ2Nzc5OTI0MDgiPiJTaWd1aWVudGUiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2tpcF9idXR0b25fbGFiZWwgKDEyNzUzNjIyOTk0NzE2MzE4MTkpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZV93YXJuaW5nX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjQ4OTA4OTQyNjc0NTQ4NjcyNzYiPiJVc28gZWxldmFkbyBkYXRvcyBtw7N2aWxlcyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlX3dhcm5pbmdfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIyNjA5NzM0NzYzODQ1NzA1NzA4Ij4iTcOhcyBpbmZvcm1hY2nDs24gc29icmUgdXNvIGRlIGRhdG9zIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVkX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjYyNjk1NDE4OTc3Mjk3ODEzMzIiPiJMw61taXRlIGRhdG9zIHN1cGVyYWRvIjwvc3RyaW5nPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1mci9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZnIvc3RyaW5ncy54bWwKaW5kZXggMmRhY2IzMC4uODg4NGRkYyAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1mci9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWZyL3N0cmluZ3MueG1sCkBAIC00MzYsNiArNDM2LDEwIEBACiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX2ZvcmNlTG9jayIgbXNnaWQ9IjI4MTk4Njg2NjQ5NDYwODk3NDAiPiJDb250csO0bGUgbGUgdmVycm91aWxsYWdlIGR1IHDDqXJpcGjDqXJpcXVlLCBhdmVjIG9ibGlnYXRpb24gZGUgc2Fpc2lyIMOgIG5vdXZlYXUgbGUgbW90IGRlIHBhc3NlLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl93aXBlRGF0YSIgbXNnaWQ9IjM5MTA1NDU0NDY3NTg2Mzk3MTMiPiJFZmZhY2VyIHRvdXRlcyBsZXMgZG9ubsOpZXMiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3dpcGVEYXRhIiBtc2dpZD0iMjMxNDA2MDkzMzc5NjM5NjIwNSI+IlLDqXRhYmxpdCBsZXMgcGFyYW3DqHRyZXMgZFwndXNpbmUsIHN1cHByaW1hbnQgdG91dGVzIHZvcyBkb25uw6llcyBzYW5zIGRlbWFuZGUgZGUgY29uZmlybWF0aW9uLiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwb2xpY3lsYWJfc2V0R2xvYmFsUHJveHkgKDI3ODQ4MjgyOTM3NDc3OTE0NDYpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcG9saWN5ZGVzY19zZXRHbG9iYWxQcm94eSAoNjM4NzQ5NzQ2NjY2MDE1NDkzMSkgLS0+CisgICAgPHNraXAgLz4KICAgPHN0cmluZy1hcnJheSBuYW1lPSJwaG9uZVR5cGVzIj4KICAgICA8aXRlbSBtc2dpZD0iODkwMTA5ODMzNjY1ODcxMDM1OSI+IkRvbWljaWxlIjwvaXRlbT4KICAgICA8aXRlbSBtc2dpZD0iODY5OTIzNjUwNTI3MTM2NjE1Ij4iUG9ydGFibGUiPC9pdGVtPgpAQCAtNTI5LDEwICs1MzMsOSBAQAogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZVdvcmsiIG1zZ2lkPSIyOTI2ODg3MDUwNTM2Mzg3MiI+IkJ1cmVhdSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVPdGhlciIgbXNnaWQ9IjM5NTE3ODExMzE1NzAxMjQwODIiPiJBdXRyZSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVDdXN0b20iIG1zZ2lkPSIyMjU1MjM0MTUzNzIwODgzMjIiPiJQZXJzb25uYWxpc8OpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iY29udGFjdF9zdGF0dXNfdXBkYXRlX2F0dHJpYnV0aW9uIiBtc2dpZD0iNTExMjU4OTg4NjA5NDQwMjc5NSI+InZpYSA8eGxpZmY6ZyBpZD0iU09VUkNFIj4lMSRzPC94bGlmZjpnPiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbl93aXRoX2RhdGUiIG1zZ2lkPSI1OTQ1Mzg2Mzc2MzY5OTc5OTA5Ij4iPHhsaWZmOmcgaWQ9IkRBVEUiPiUxJHM8L3hsaWZmOmc+IHZpYSA8eGxpZmY6ZyBpZD0iU09VUkNFIj4lMiRzPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bpbl9jb2RlIiBtc2dpZD0iMzczMTQ4ODgyNzIxODg3NjExNSI+IlNhaXNpc3NleiBsZSBjb2RlIFBJTiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bhc3N3b3JkX2NvZGUiIG1zZ2lkPSI5MTM4MTU4MzQ0ODEzMjEzNzU0Ij4iU2Fpc2lzc2V6IGxlIG1vdCBkZSBwYXNzZSBwb3VyIHByb2PDqWRlciBhdSBkw6l2ZXJyb3VpbGxhZ2UuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGluX3Bhc3N3b3JkX2NvZGUiIG1zZ2lkPSI2MzgzNDcwNzU2MjU0OTE1MTQiPiJTYWlzaXNzZXogbGUgY29kZSBQSU4gcG91ciBwcm9jw6lkZXIgYXUgZMOpdmVycm91aWxsYWdlLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX3dyb25nX3Bpbl9jb2RlIiBtc2dpZD0iMTI5NTk4NDExNDMzODEwNzcxOCI+IkxlIGNvZGUgUElOIGVzdCBpbmNvcnJlY3TCoCEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9sYWJlbF90ZXh0IiBtc2dpZD0iODYxNzk2NDYxMDI4Mjk4NDI0Ij4iUG91ciBkw6libG9xdWVyIGxlIGNsYXZpZXIsIGFwcHV5ZXogc3VyIFwiTWVudVwiIHB1aXMgc3VyIDAuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZW1lcmdlbmN5X2NhbGxfZGlhbG9nX251bWJlcl9mb3JfZGlzcGxheSIgbXNnaWQ9IjY5NjE5MjEwMzE5NTA5MDk3MCI+Ik51bcOpcm8gZFwndXJnZW5jZSI8L3N0cmluZz4KQEAgLTU0NSw2ICs1NDgsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9yZXR1cm5fdG9fY2FsbCIgbXNnaWQ9IjUyNDQyNTk3ODU1MDAwNDAwMjEiPiJSZXRvdXIgw6AgbFwnYXBwZWwiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BhdHRlcm5fY29ycmVjdCIgbXNnaWQ9IjkwMzkwMDg2NTAzNjIyNjEyMzciPiJDb21iaW5haXNvbiBjb3JyZWN0ZcKgISI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGF0dGVybl93cm9uZyIgbXNnaWQ9IjQ4MTc1ODMyNzkwNTMxMTIzMTIiPiJJbmNvcnJlY3QuIE1lcmNpIGRlIHLDqWVzc2F5ZXIuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXNzd29yZF93cm9uZyIgbXNnaWQ9IjYyMzc0NDM2NTczNTgxNjg4MTkiPiJJbmNvcnJlY3QuIE1lcmNpIGRlIHLDqWVzc2F5ZXIuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wbHVnZ2VkX2luIiBtc2dpZD0iNjEzMzQzODUyODQyOTQ0NDM1Ij4iQ2hhcmdlbWVudCAoPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+wqA8eGxpZmY6ZyBpZD0iUEVSQ0VOVCI+JSU8L3hsaWZmOmc+KSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fY2hhcmdlZCIgbXNnaWQ9IjQ5Mzg5MzA0NTk2MjA5ODk5NzIiPiJDaGFyZ8OpIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9iYXR0ZXJ5X3Nob3J0IiBtc2dpZD0iMzYxNzU0OTE3ODYwMzM1NDY1NiI+Ijx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPsKgPHhsaWZmOmcgaWQ9IlBFUkNFTlQiPiUlPC94bGlmZjpnPiI8L3N0cmluZz4KQEAgLTU1OSw2ICs1NjMsOCBAQAogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9zaW1fbG9ja2VkX21lc3NhZ2UiIG1zZ2lkPSI4MDY2NjYwMTI5MjA2MDAxMDM5Ij4iTGEgY2FydGUgU0lNIGVzdCB2ZXJyb3VpbGzDqWUuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9zaW1fdW5sb2NrX3Byb2dyZXNzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNTk1MzIzMjE0MDUyODgxMjY0Ij4iRMOpYmxvY2FnZSBkZSBsYSBjYXJ0ZSBTSU0uLi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjM1MTQ3NDIxMDYwNjY4Nzc0NzYiPiJWb3VzIGF2ZXogbWFsIHJlcHJvZHVpdCBsZSBzY2jDqW1hIGRlIGTDqXZlcnJvdWlsbGFnZSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiBmb2lzLiAiXG5cbiJWZXVpbGxleiByw6llc3NheWVyIGRhbnMgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gc2Vjb25kZXMuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfcGFzc3dvcmRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI0OTA2MDM0Mzc2NDI1MTc1MzgxIj4iVm91cyBhdmV6IHNhaXNpIHVuIG1vdCBkZSBwYXNzZSBpbmNvcnJlY3Qgw6AgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz7CoHJlcHJpc2VzLiAiXG5cbiJWZXVpbGxleiByw6llc3NheWVyIGRhbnMgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz7CoHNlY29uZGVzLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX3Bpbl9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjY4Mjc3NDkyMzE0NjUxNDU1OTAiPiJWb3VzIGF2ZXogc2Fpc2kgdW4gY29kZSBQSU4gaW5jb3JyZWN0IMOgIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+wqByZXByaXNlcy4gIlxuXG4iVmV1aWxsZXogcsOpZXNzYXllciBkYW5zIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+wqBzZWNvbmRlcy4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2ZhaWxlZF9hdHRlbXB0c19hbG1vc3RfZ2xvZ2luIiBtc2dpZD0iMzM1MTAxMzg0MjMyMDEyNzgyNyI+IlZvdXMgYXZleiBtYWwgc2Fpc2kgbGUgc2Now6ltYSBkZSBkw6l2ZXJyb3VpbGxhZ2UgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4gZm9pcy4gQXUgYm91dCBkZSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiB0ZW50YXRpdmVzIHN1cHBsw6ltZW50YWlyZXMsIHZvdXMgZGV2cmV6IGTDqWJsb3F1ZXIgdm90cmUgdMOpbMOpcGhvbmUgw6AgbFwnYWlkZSBkZSB2b3RyZSBpZGVudGlmaWFudCBHb29nbGUuIlxuXG4iTWVyY2kgZGUgcsOpZXNzYXllciBkYW5zIDx4bGlmZjpnIGlkPSJOVU1CRVJfMiI+JWQ8L3hsaWZmOmc+IHNlY29uZGVzLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX2F0dGVtcHRzX2NvdW50ZG93biIgbXNnaWQ9IjYyNTE0ODAzNDMzOTQzODk2NjUiPiJSw6llc3NheWV6IGRhbnMgPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+wqBzZWNvbmRlcy4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2ZvcmdvdF9wYXR0ZXJuX2J1dHRvbl90ZXh0IiBtc2dpZD0iMjYyNjk5OTQ0OTYxMDY5NTkzMCI+IlNjaMOpbWEgb3VibGnDqSA/Ijwvc3RyaW5nPgpAQCAtNzAzLDE1ICs3MDksMTcgQEAKICAgICA8c3RyaW5nIG5hbWU9ImVsYXBzZWRfdGltZV9zaG9ydF9mb3JtYXRfbW1fc3MiIG1zZ2lkPSI0NDMxNTU1OTQzODI4NzExNDczIj4iPHhsaWZmOmcgaWQ9Ik1JTlVURVMiPiUxJDAyZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9IlNFQ09ORFMiPiUyJDAyZDwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJlbGFwc2VkX3RpbWVfc2hvcnRfZm9ybWF0X2hfbW1fc3MiIG1zZ2lkPSIxODQ2MDcxOTk3NjE2NjU0MTI0Ij4iPHhsaWZmOmcgaWQ9IkhPVVJTIj4lMSRkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iTUlOVVRFUyI+JTIkMDJkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iU0VDT05EUyI+JTMkMDJkPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNlbGVjdEFsbCIgbXNnaWQ9IjY4NzY1MTg5MjU4NDQxMjkzMzEiPiJUb3V0IHPDqWxlY3Rpb25uZXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJzZWxlY3RUZXh0IiBtc2dpZD0iMzg4OTE0OTEyMzYyNjg4ODYzNyI+IlPDqWxlY3Rpb25uZXIgbGUgdGV4dGUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJzdG9wU2VsZWN0aW5nVGV4dCIgbXNnaWQ9IjQxNTc5MzE0NjM4NzIzMjA5OTYiPiJBcnLDqnRlciBzw6lsZWN0aW9uIGRlIHRleHRlIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY3V0IiBtc2dpZD0iMzA5MjU2OTQwODQzODYyNjI2MSI+IkNvdXBlciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNvcHkiIG1zZ2lkPSIyNjgxOTQ2MjI5NTMzNTExOTg3Ij4iQ29waWVyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGFzdGUiIG1zZ2lkPSI1NjI5ODgwODM2ODA1MDM2NDMzIj4iQ29sbGVyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY29weVVybCIgbXNnaWQ9IjI1MzgyMTE1Nzk1OTYwNjc0MDIiPiJDb3BpZXIgbFwnVVJMIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNlbGVjdFRleHRNb2RlICg2NzM4NTU2MzQ4ODYxMzQ3MjQwKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHRleHRTZWxlY3Rpb25DQUJUaXRsZSAoNTIzNjg1MDM5NDM3MDgyMDM1NykgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9ImlucHV0TWV0aG9kIiBtc2dpZD0iMTY1MzYzMDA2MjMwNDU2Nzg3OSI+Ik1vZGUgZGUgc2Fpc2llIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iYWRkVG9EaWN0aW9uYXJ5IiBtc2dpZD0iODc5MzYyNDk5MTY4Njk0ODcwOSI+IkFqb3V0ZXIgXCI8eGxpZmY6ZyBpZD0iV09SRCI+JXM8L3hsaWZmOmc+XCIgYXUgZGljdGlvbm5haXJlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZWRpdFRleHRNZW51VGl0bGUiIG1zZ2lkPSIxNjcyOTg5MTc2OTU4NTgxNDUyIj4iTW9kaWZpZXIgbGUgdGV4dGUiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZWRpdFRleHRNZW51VGl0bGUgKDQ5MDkxMzU1NjQ5NDE4MTU0OTQpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJsb3dfaW50ZXJuYWxfc3RvcmFnZV92aWV3X3RpdGxlIiBtc2dpZD0iMTM5OTczMjQwODcwMTY5NzU0NiI+IkVzcGFjZSBkaXNwb25pYmxlIGZhaWJsZSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Imxvd19pbnRlcm5hbF9zdG9yYWdlX3ZpZXdfdGV4dCIgbXNnaWQ9IjYzNTEwNjU0NDYxNjM3ODgzNiI+IkxhIG3DqW1vaXJlIGR1IHTDqWzDqXBob25lIGNvbW1lbmNlIMOgIMOqdHJlIHBsZWluZS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvayIgbXNnaWQ9IjU5NzAwNjA0MzA1NjI1MjQ5MTAiPiJPSyI8L3N0cmluZz4KQEAgLTcxOSw2ICs3MjcsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ieWVzIiBtc2dpZD0iNTM2Mjk4MjMwMzMzNzk2OTMxMiI+Ik9LIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibm8iIG1zZ2lkPSI1MTQxNTMxMDQ0OTM1NTQxNDk3Ij4iQW5udWxlciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRpYWxvZ19hbGVydF90aXRsZSIgbXNnaWQ9IjIwNDk2NTg3MDg2MDkwNDMxMDMiPiJBdHRlbnRpb24iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2FkaW5nIiBtc2dpZD0iMTc2MDcyNDk5ODkyODI1NTI1MCI+IkNoYXJnZW1lbnQgZW4gY291cnMuLi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXBpdGFsX29uIiBtc2dpZD0iMTU0NDY4Mjc1NTUxNDQ5NDI5OCI+Ik9OIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FwaXRhbF9vZmYiIG1zZ2lkPSI2ODE1ODcwMzg2OTcyODA1ODMyIj4iT0ZGIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0id2hpY2hBcHBsaWNhdGlvbiIgbXNnaWQ9IjQ1MzMxODU5NDcwNjQ3NzMzODYiPiJDb250aW51ZXIgYXZlYyI8L3N0cmluZz4KQEAgLTg1MywxMyArODYyLDE3IEBACiAgICAgPHN0cmluZyBuYW1lPSJsMnRwX2lwc2VjX3Bza192cG5fZGVzY3JpcHRpb24iIG1zZ2lkPSIzOTQ1MDQzNTY0MDA4MzAzMjM5Ij4iVlBOIEwyVFAvSVBTZWMgYmFzw6kgc3VyIHVuZSBjbMOpIHByw6ktcGFydGFnw6llIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibDJ0cF9pcHNlY19jcnRfdnBuX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNTM4MjcxNDA3MzEwMzY1MzU3NyI+IlZQTiBMMlRQL0lQU2VjIGJhc8OpIHN1ciB1biBjZXJ0aWZpY2F0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXBsb2FkX2ZpbGUiIG1zZ2lkPSIyODk3OTU3MTcyMzY2NzMwNDE2Ij4iU8OpbGVjdGlvbm5lciB1biBmaWNoaWVyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fZmlsZV9jaG9zZW4iIG1zZ2lkPSI2MzYzNjQ4NTYyMTcwNzU5NDY1Ij4iQXVjdW4gZmljaGllciBzw6lsZWN0aW9ubsOpIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icmVzZXQiIG1zZ2lkPSIyNDQ4MTY4MDgwOTY0MjA5OTA4Ij4iUsOpaW5pdGlhbGlzZXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzdWJtaXQiIG1zZ2lkPSIxNjAyMzM1NTcyMDg5OTExOTQxIj4iRW52b3llciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImRlc2NyaXB0aW9uX3N0YXIiIG1zZ2lkPSIyNjU0MzE5ODc0OTA4NTc2MTMzIj4iZmF2b3JpIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FyX21vZGVfZGlzYWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSIzMTY0NzY4MjEyMDAzODY0MzE2Ij4iTW9kZSBWb2l0dXJlIGFjdGl2w6kiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXJfbW9kZV9kaXNhYmxlX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iNjY4NjYzNjI2NzIxNjc1NjE0Ij4iU8OpbGVjdGlvbm5leiBjZXR0ZSBvcHRpb24gcG91ciBxdWl0dGVyIGxlIG1vZGUgVm9pdHVyZS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0ZXRoZXJlZF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSIzMTQ2Njk0MjM0Mzk4MjAyNjAxIj4iUGFydGFnZSBkZSBjb25uZXhpb24gb3UgcG9pbnQgZFwnYWNjw6hzIHNhbnMgZmlsIGFjdGl2w6kiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0ZXRoZXJlZF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjMwNjcxMDgzMjM5MDMwNDg5MjciPiJUb3VjaGVyIHBvdXIgY29uZmlndXJlciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImJhY2tfYnV0dG9uX2xhYmVsIiBtc2dpZD0iMjMwMDQ3MDAwNDUwMzM0MzQzOSI+IlJldG91ciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5leHRfYnV0dG9uX2xhYmVsIiBtc2dpZD0iMTA4MDU1NTEwNDY3Nzk5MjQwOCI+IlN1aXZhbnQiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2tpcF9idXR0b25fbGFiZWwgKDEyNzUzNjIyOTk0NzE2MzE4MTkpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZV93YXJuaW5nX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjQ4OTA4OTQyNjc0NTQ4NjcyNzYiPiJVdGlsaXNhdGlvbiDDqWxldsOpZSBkZXMgZG9ubsOpZXMgbW9iaWxlcyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlX3dhcm5pbmdfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIyNjA5NzM0NzYzODQ1NzA1NzA4Ij4iVG91Y2hleiBwb3VyIGVuIHNhdm9pciBwbHVzIHN1ciBsXCd1dGlsaXNhdGlvbiBkZXMgZG9ubsOpZXMgbW9iaWxlcyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlZF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI2MjY5NTQxODk3NzI5NzgxMzMyIj4iUXVvdGEgZFwndXRpbGlzYXRpb24gZGVzIGRvbm7DqWVzIG1vYmlsZXMgZMOpcGFzc8OpIjwvc3RyaW5nPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1pdC9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtaXQvc3RyaW5ncy54bWwKaW5kZXggYzdhYWM4Mi4uMGNmN2YzOCAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1pdC9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWl0L3N0cmluZ3MueG1sCkBAIC00MzYsNiArNDM2LDEwIEBACiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX2ZvcmNlTG9jayIgbXNnaWQ9IjI4MTk4Njg2NjQ5NDYwODk3NDAiPiJDb250cm9sbGEgcXVhbmRvIGlsIGRpc3Bvc2l0aXZvIHNpIGJsb2NjYSwgY2hpZWRlbmRvdGkgZGkgcmVpbnNlcmlyZSBsYSBwYXNzd29yZC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfd2lwZURhdGEiIG1zZ2lkPSIzOTEwNTQ1NDQ2NzU4NjM5NzEzIj4iQ2FuY2VsbGEgdHV0dGkgaSBkYXRpIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY193aXBlRGF0YSIgbXNnaWQ9IjIzMTQwNjA5MzM3OTYzOTYyMDUiPiJFc2VndWkgdW4gcmlwcmlzdGlubyBkaSBmYWJicmljYSwgZWxpbWluYW5kbyB0dXR0aSBpIHR1b2kgZGF0aSBzZW56YSBjb25mZXJtYS4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcG9saWN5bGFiX3NldEdsb2JhbFByb3h5ICgyNzg0ODI4MjkzNzQ3NzkxNDQ2KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBvbGljeWRlc2Nfc2V0R2xvYmFsUHJveHkgKDYzODc0OTc0NjY2NjAxNTQ5MzEpIC0tPgorICAgIDxza2lwIC8+CiAgIDxzdHJpbmctYXJyYXkgbmFtZT0icGhvbmVUeXBlcyI+CiAgICAgPGl0ZW0gbXNnaWQ9Ijg5MDEwOTgzMzY2NTg3MTAzNTkiPiJDYXNhIjwvaXRlbT4KICAgICA8aXRlbSBtc2dpZD0iODY5OTIzNjUwNTI3MTM2NjE1Ij4iQ2VsbHVsYXJlIjwvaXRlbT4KQEAgLTUyOSwxMCArNTMzLDkgQEAKICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVXb3JrIiBtc2dpZD0iMjkyNjg4NzA1MDUzNjM4NzIiPiJVZmZpY2lvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZU90aGVyIiBtc2dpZD0iMzk1MTc4MTEzMTU3MDEyNDA4MiI+IkFsdHJvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZUN1c3RvbSIgbXNnaWQ9IjIyNTUyMzQxNTM3MjA4ODMyMiI+IlBlcnNvbmFsaXp6YXRvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iY29udGFjdF9zdGF0dXNfdXBkYXRlX2F0dHJpYnV0aW9uIiBtc2dpZD0iNTExMjU4OTg4NjA5NDQwMjc5NSI+InRyYW1pdGUgPHhsaWZmOmcgaWQ9IlNPVVJDRSI+JTEkczwveGxpZmY6Zz4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJjb250YWN0X3N0YXR1c191cGRhdGVfYXR0cmlidXRpb25fd2l0aF9kYXRlIiBtc2dpZD0iNTk0NTM4NjM3NjM2OTk3OTkwOSI+Ijx4bGlmZjpnIGlkPSJEQVRFIj4lMSRzPC94bGlmZjpnPiB0cmFtaXRlIDx4bGlmZjpnIGlkPSJTT1VSQ0UiPiUyJHM8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGluX2NvZGUiIG1zZ2lkPSIzNzMxNDg4ODI3MjE4ODc2MTE1Ij4iSW5zZXJpc2NpIGlsIFBJTiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bhc3N3b3JkX2NvZGUiIG1zZ2lkPSI5MTM4MTU4MzQ0ODEzMjEzNzU0Ij4iSW5zZXJpc2NpIHBhc3N3b3JkIHBlciBzYmxvY2NhcmUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9waW5fcGFzc3dvcmRfY29kZSIgbXNnaWQ9IjYzODM0NzA3NTYyNTQ5MTUxNCI+Ikluc2VyaXNjaSBQSU4gcGVyIHNibG9jY2FyZSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX3dyb25nX3Bpbl9jb2RlIiBtc2dpZD0iMTI5NTk4NDExNDMzODEwNzcxOCI+IkNvZGljZSBQSU4gZXJyYXRvLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX2xhYmVsX3RleHQiIG1zZ2lkPSI4NjE3OTY0NjEwMjgyOTg0MjQiPiJQZXIgc2Jsb2NjYXJlLCBwcmVtaSBNZW51LCBwb2kgMC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJlbWVyZ2VuY3lfY2FsbF9kaWFsb2dfbnVtYmVyX2Zvcl9kaXNwbGF5IiBtc2dpZD0iNjk2MTkyMTAzMTk1MDkwOTcwIj4iTnVtZXJvIGRpIGVtZXJnZW56YSI8L3N0cmluZz4KQEAgLTU0NSw2ICs1NDgsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9yZXR1cm5fdG9fY2FsbCIgbXNnaWQ9IjUyNDQyNTk3ODU1MDAwNDAwMjEiPiJUb3JuYSBhIGNoaWFtYXRhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXR0ZXJuX2NvcnJlY3QiIG1zZ2lkPSI5MDM5MDA4NjUwMzYyMjYxMjM3Ij4iQ29ycmV0dGEuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXR0ZXJuX3dyb25nIiBtc2dpZD0iNDgxNzU4MzI3OTA1MzExMjMxMiI+IlJpcHJvdmEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Bhc3N3b3JkX3dyb25nIiBtc2dpZD0iNjIzNzQ0MzY1NzM1ODE2ODgxOSI+IlJpcHJvdmEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BsdWdnZWRfaW4iIG1zZ2lkPSI2MTMzNDM4NTI4NDI5NDQ0MzUiPiJJbiBjYXJpY2EgKDx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPjx4bGlmZjpnIGlkPSJQRVJDRU5UIj4lJTwveGxpZmY6Zz4pIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9jaGFyZ2VkIiBtc2dpZD0iNDkzODkzMDQ1OTYyMDk4OTk3MiI+IkNhcmljby4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2JhdHRlcnlfc2hvcnQiIG1zZ2lkPSIzNjE3NTQ5MTc4NjAzMzU0NjU2Ij4iPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+PHhsaWZmOmcgaWQ9IlBFUkNFTlQiPiUlPC94bGlmZjpnPiI8L3N0cmluZz4KQEAgLTU1OSw2ICs1NjMsOCBAQAogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9zaW1fbG9ja2VkX21lc3NhZ2UiIG1zZ2lkPSI4MDY2NjYwMTI5MjA2MDAxMDM5Ij4iTGEgU0lNIMOoIGJsb2NjYXRhLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fc2ltX3VubG9ja19wcm9ncmVzc19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjU5NTMyMzIxNDA1Mjg4MTI2NCI+IlNibG9jY28gU0lNLi4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSIzNTE0NzQyMTA2MDY2ODc3NDc2Ij4iPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4gdGVudGF0aXZpIGRpIGluc2VyaW1lbnRvIGRlbGxhIHNlcXVlbnphIGRpIHNibG9jY28uICJcblxuIlJpcHJvdmEgZnJhIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IHNlY29uZGkuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfcGFzc3dvcmRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI0OTA2MDM0Mzc2NDI1MTc1MzgxIj4iPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4gdGVudGF0aXZpIGVycmF0aSBkaSBpbnNlcmltZW50byBkZWxsYSBwYXNzd29yZC4gIlxuXG4iUmlwcm92YSB0cmEgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gc2Vjb25kaS4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9waW5fYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI2ODI3NzQ5MjMxNDY1MTQ1NTkwIj4iPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4gdGVudGF0aXZpIGVycmF0aSBkaSBpbnNlcmltZW50byBkZWwgUElOLiAiXG5cbiJSaXByb3ZhIHRyYSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBzZWNvbmRpLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fZmFpbGVkX2F0dGVtcHRzX2FsbW9zdF9nbG9naW4iIG1zZ2lkPSIzMzUxMDEzODQyMzIwMTI3ODI3Ij4iPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4gdGVudGF0aXZpIGRpIGluc2VyaW1lbnRvIGRlbGxhIHNlcXVlbnphIGRpIHNibG9jY28uIERvcG8gYWx0cmkgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gdGVudGF0aXZpIGZhbGxpdGksIHRpIHZlcnLDoCBjaGllc3RvIGRpIHNibG9jY2FyZSBpbCB0ZWxlZm9ubyB0cmFtaXRlIGkgZGF0aSBkaSBhY2Nlc3NvIGRpIEdvb2dsZS4iXG5cbiJSaXByb3ZhIGZyYSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzIiPiVkPC94bGlmZjpnPiBzZWNvbmRpLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX2F0dGVtcHRzX2NvdW50ZG93biIgbXNnaWQ9IjYyNTE0ODAzNDMzOTQzODk2NjUiPiJSaXByb3ZhIGZyYSA8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz4gc2Vjb25kaS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2ZvcmdvdF9wYXR0ZXJuX2J1dHRvbl90ZXh0IiBtc2dpZD0iMjYyNjk5OTQ0OTYxMDY5NTkzMCI+IkhhaSBkaW1lbnRpY2F0byBsYSBzZXF1ZW56YT8iPC9zdHJpbmc+CkBAIC03MDMsMTUgKzcwOSwxNyBAQAogICAgIDxzdHJpbmcgbmFtZT0iZWxhcHNlZF90aW1lX3Nob3J0X2Zvcm1hdF9tbV9zcyIgbXNnaWQ9IjQ0MzE1NTU5NDM4Mjg3MTE0NzMiPiI8eGxpZmY6ZyBpZD0iTUlOVVRFUyI+JTEkMDJkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iU0VDT05EUyI+JTIkMDJkPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVsYXBzZWRfdGltZV9zaG9ydF9mb3JtYXRfaF9tbV9zcyIgbXNnaWQ9IjE4NDYwNzE5OTc2MTY2NTQxMjQiPiI8eGxpZmY6ZyBpZD0iSE9VUlMiPiUxJGQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJNSU5VVEVTIj4lMiQwMmQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJTRUNPTkRTIj4lMyQwMmQ8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0QWxsIiBtc2dpZD0iNjg3NjUxODkyNTg0NDEyOTMzMSI+IlNlbGV6aW9uYSB0dXR0byI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InNlbGVjdFRleHQiIG1zZ2lkPSIzODg5MTQ5MTIzNjI2ODg4NjM3Ij4iU2VsZXppb25hIHRlc3RvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ic3RvcFNlbGVjdGluZ1RleHQiIG1zZ2lkPSI0MTU3OTMxNDYzODcyMzIwOTk2Ij4iVGVybWluYSBzZWxlemlvbmUgdGVzdG8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjdXQiIG1zZ2lkPSIzMDkyNTY5NDA4NDM4NjI2MjYxIj4iVGFnbGlhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY29weSIgbXNnaWQ9IjI2ODE5NDYyMjk1MzM1MTE5ODciPiJDb3BpYSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBhc3RlIiBtc2dpZD0iNTYyOTg4MDgzNjgwNTAzNjQzMyI+IkluY29sbGEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjb3B5VXJsIiBtc2dpZD0iMjUzODIxMTU3OTU5NjA2NzQwMiI+IkNvcGlhIFVSTCI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzZWxlY3RUZXh0TW9kZSAoNjczODU1NjM0ODg2MTM0NzI0MCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciB0ZXh0U2VsZWN0aW9uQ0FCVGl0bGUgKDUyMzY4NTAzOTQzNzA4MjAzNTcpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJpbnB1dE1ldGhvZCIgbXNnaWQ9IjE2NTM2MzAwNjIzMDQ1Njc4NzkiPiJNZXRvZG8gaW5zZXJpbWVudG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJhZGRUb0RpY3Rpb25hcnkiIG1zZ2lkPSI4NzkzNjI0OTkxNjg2OTQ4NzA5Ij4iQWdnaXVuZ2kgXCI8eGxpZmY6ZyBpZD0iV09SRCI+JXM8L3hsaWZmOmc+XCIgYWwgZGl6aW9uYXJpbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImVkaXRUZXh0TWVudVRpdGxlIiBtc2dpZD0iMTY3Mjk4OTE3Njk1ODU4MTQ1MiI+Ik1vZGlmaWNhIHRlc3RvIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGVkaXRUZXh0TWVudVRpdGxlICg0OTA5MTM1NTY0OTQxODE1NDk0KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0ibG93X2ludGVybmFsX3N0b3JhZ2Vfdmlld190aXRsZSIgbXNnaWQ9IjEzOTk3MzI0MDg3MDE2OTc1NDYiPiJTcGF6aW8gaW4gZXNhdXJpbWVudG8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb3dfaW50ZXJuYWxfc3RvcmFnZV92aWV3X3RleHQiIG1zZ2lkPSI2MzUxMDY1NDQ2MTYzNzg4MzYiPiJTcGF6aW8gZGkgYXJjaGl2aWF6aW9uZSBkZWwgdGVsZWZvbm8gaW4gZXNhdXJpbWVudG8uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ib2siIG1zZ2lkPSI1OTcwMDYwNDMwNTYyNTI0OTEwIj4iT0siPC9zdHJpbmc+CkBAIC03MTksNiArNzI3LDcgQEAKICAgICA8c3RyaW5nIG5hbWU9InllcyIgbXNnaWQ9IjUzNjI5ODIzMDMzMzc5NjkzMTIiPiJPSyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im5vIiBtc2dpZD0iNTE0MTUzMTA0NDkzNTU0MTQ5NyI+IkFubnVsbGEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkaWFsb2dfYWxlcnRfdGl0bGUiIG1zZ2lkPSIyMDQ5NjU4NzA4NjA5MDQzMTAzIj4iQXR0ZW56aW9uZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvYWRpbmciIG1zZ2lkPSIxNzYwNzI0OTk4OTI4MjU1MjUwIj4iQ2FyaWNhbWVudG8gaW4gY29yc28uLi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXBpdGFsX29uIiBtc2dpZD0iMTU0NDY4Mjc1NTUxNDQ5NDI5OCI+Ik9OIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FwaXRhbF9vZmYiIG1zZ2lkPSI2ODE1ODcwMzg2OTcyODA1ODMyIj4iT0ZGIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0id2hpY2hBcHBsaWNhdGlvbiIgbXNnaWQ9IjQ1MzMxODU5NDcwNjQ3NzMzODYiPiJDb21wbGV0YSBsXCdhemlvbmUgY29uIjwvc3RyaW5nPgpAQCAtODUzLDEzICs4NjIsMTcgQEAKICAgICA8c3RyaW5nIG5hbWU9ImwydHBfaXBzZWNfcHNrX3Zwbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM5NDUwNDM1NjQwMDgzMDMyMzkiPiJWUE4gTDJUUC9JUFNlYyBiYXNhdGEgc3UgY2hpYXZlIHByZWNvbmRpdmlzYSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImwydHBfaXBzZWNfY3J0X3Zwbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjUzODI3MTQwNzMxMDM2NTM1NzciPiJWUE4gTDJUUC9JUFNlYyBiYXNhdGEgc3UgY2VydGlmaWNhdG8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1cGxvYWRfZmlsZSIgbXNnaWQ9IjI4OTc5NTcxNzIzNjY3MzA0MTYiPiJTY2VnbGkgZmlsZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5vX2ZpbGVfY2hvc2VuIiBtc2dpZD0iNjM2MzY0ODU2MjE3MDc1OTQ2NSI+Ik5lc3N1biBmaWxlIMOoIHN0YXRvIHNjZWx0byI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InJlc2V0IiBtc2dpZD0iMjQ0ODE2ODA4MDk2NDIwOTkwOCI+IlJlaW1wb3N0YSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InN1Ym1pdCIgbXNnaWQ9IjE2MDIzMzU1NzIwODk5MTE5NDEiPiJJbnZpYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImRlc2NyaXB0aW9uX3N0YXIiIG1zZ2lkPSIyNjU0MzE5ODc0OTA4NTc2MTMzIj4icHJlZmVyaXRpIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FyX21vZGVfZGlzYWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSIzMTY0NzY4MjEyMDAzODY0MzE2Ij4iTW9kYWxpdMOgIGF1dG9tb2JpbGUgYXR0aXZhdGEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXJfbW9kZV9kaXNhYmxlX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iNjY4NjYzNjI2NzIxNjc1NjE0Ij4iU2VsZXppb25hIHBlciB1c2NpcmUgZGFsbGEgbW9kYWxpdMOgIGF1dG9tb2JpbGUuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGV0aGVyZWRfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iMzE0NjY5NDIzNDM5ODIwMjYwMSI+IlRldGhlcmluZyBvcHB1cmUgaG90c3BvdCBhdHRpdm8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0ZXRoZXJlZF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjMwNjcxMDgzMjM5MDMwNDg5MjciPiJUb2NjYSBwZXIgY29uZmlndXJhcmUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJiYWNrX2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjIzMDA0NzAwMDQ1MDMzNDM0MzkiPiJJbmRpZXRybyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5leHRfYnV0dG9uX2xhYmVsIiBtc2dpZD0iMTA4MDU1NTEwNDY3Nzk5MjQwOCI+IkF2YW50aSI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBza2lwX2J1dHRvbl9sYWJlbCAoMTI3NTM2MjI5OTQ3MTYzMTgxOSkgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlX3dhcm5pbmdfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNDg5MDg5NDI2NzQ1NDg2NzI3NiI+IlV0aWxpenpvIGRhdGkgY2VsbC4gZWxldmF0byI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlX3dhcm5pbmdfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIyNjA5NzM0NzYzODQ1NzA1NzA4Ij4iVG9jY2EgcGVyIGluZm9ybWF6aW9uaSBzdWxsXCd1dGlsaXp6byBkYXRpIGNlbGwuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVkX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjYyNjk1NDE4OTc3Mjk3ODEzMzIiPiJMaW1pdGUgZGF0aSBjZWxsLiBzdXBlcmF0byI8L3N0cmluZz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtamEvc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWphL3N0cmluZ3MueG1sCmluZGV4IDI1ZTk3N2QuLjQ2OGI2OTIgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtamEvc3RyaW5ncy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1qYS9zdHJpbmdzLnhtbApAQCAtNDM2LDYgKzQzNiwxMCBAQAogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19mb3JjZUxvY2siIG1zZ2lkPSIyODE5ODY4NjY0OTQ2MDg5NzQwIj4i5pC65biv6Zu76Kmx44Gu44Ot44OD44Kv5pmC44KS566h55CG44GX44G+44GZ44CC44OR44K544Ov44O844OJ44Gu5YaN5YWl5Yqb44GM5b+F6KaB44Go44Gq44KK44G+44GZ44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX3dpcGVEYXRhIiBtc2dpZD0iMzkxMDU0NTQ0Njc1ODYzOTcxMyI+IuOBmeOBueOBpuOBruODh+ODvOOCv+OCkua2iOWOuyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfd2lwZURhdGEiIG1zZ2lkPSIyMzE0MDYwOTMzNzk2Mzk2MjA1Ij4i5Ye66I235pmC6Kit5a6a44Gr44Oq44K744OD44OI44GX44G+44GZ44CC56K66KqN44Gq44GX44Gn44OH44O844K/44GM44GZ44G544Gm5YmK6Zmk44GV44KM44G+44GZ44CCIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBvbGljeWxhYl9zZXRHbG9iYWxQcm94eSAoMjc4NDgyODI5Mzc0Nzc5MTQ0NikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwb2xpY3lkZXNjX3NldEdsb2JhbFByb3h5ICg2Mzg3NDk3NDY2NjYwMTU0OTMxKSAtLT4KKyAgICA8c2tpcCAvPgogICA8c3RyaW5nLWFycmF5IG5hbWU9InBob25lVHlwZXMiPgogICAgIDxpdGVtIG1zZ2lkPSI4OTAxMDk4MzM2NjU4NzEwMzU5Ij4i6Ieq5a6FIjwvaXRlbT4KICAgICA8aXRlbSBtc2dpZD0iODY5OTIzNjUwNTI3MTM2NjE1Ij4i5pC65bivIjwvaXRlbT4KQEAgLTUyOSwxMCArNTMzLDkgQEAKICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVXb3JrIiBtc2dpZD0iMjkyNjg4NzA1MDUzNjM4NzIiPiLli6Tli5nlhYgiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlT3RoZXIiIG1zZ2lkPSIzOTUxNzgxMTMxNTcwMTI0MDgyIj4i44Gd44Gu5LuWIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZUN1c3RvbSIgbXNnaWQ9IjIyNTUyMzQxNTM3MjA4ODMyMiI+IuOCq+OCueOCv+ODoCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbiIgbXNnaWQ9IjUxMTI1ODk4ODYwOTQ0MDI3OTUiPiI8eGxpZmY6ZyBpZD0iU09VUkNFIj4lMSRzPC94bGlmZjpnPue1jOeUsSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbl93aXRoX2RhdGUiIG1zZ2lkPSI1OTQ1Mzg2Mzc2MzY5OTc5OTA5Ij4iPHhsaWZmOmcgaWQ9IkRBVEUiPiUxJHM8L3hsaWZmOmc+44CB5pu05paw5YWDOiA8eGxpZmY6ZyBpZD0iU09VUkNFIj4lMiRzPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bpbl9jb2RlIiBtc2dpZD0iMzczMTQ4ODgyNzIxODg3NjExNSI+IlBJTuOCs+ODvOODieOCkuWFpeWKmyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bhc3N3b3JkX2NvZGUiIG1zZ2lkPSI5MTM4MTU4MzQ0ODEzMjEzNzU0Ij4i44Ot44OD44Kv44KS6Kej6Zmk44GZ44KL44Gr44Gv44OR44K544Ov44O844OJ44KS5YWl5YqbIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGluX3Bhc3N3b3JkX2NvZGUiIG1zZ2lkPSI2MzgzNDcwNzU2MjU0OTE1MTQiPiLjg63jg4Pjgq/jgpLop6PpmaTjgZnjgovjgavjga9QSU7jgpLlhaXlipsiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF93cm9uZ19waW5fY29kZSIgbXNnaWQ9IjEyOTU5ODQxMTQzMzgxMDc3MTgiPiJQSU7jgrPjg7zjg4njgYzmraPjgZfjgY/jgYLjgorjgb7jgZvjgpPjgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9sYWJlbF90ZXh0IiBtc2dpZD0iODYxNzk2NDYxMDI4Mjk4NDI0Ij4iTUVOVeOAgTDjgq3jg7zjgafjg63jg4Pjgq/op6PpmaQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJlbWVyZ2VuY3lfY2FsbF9kaWFsb2dfbnVtYmVyX2Zvcl9kaXNwbGF5IiBtc2dpZD0iNjk2MTkyMTAzMTk1MDkwOTcwIj4i57eK5oCl6YCa5aCx55Wq5Y+3Ijwvc3RyaW5nPgpAQCAtNTQ1LDYgKzU0OCw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3JldHVybl90b19jYWxsIiBtc2dpZD0iNTI0NDI1OTc4NTUwMDA0MDAyMSI+IumAmuipseOBq+aIu+OCiyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGF0dGVybl9jb3JyZWN0IiBtc2dpZD0iOTAzOTAwODY1MDM2MjI2MTIzNyI+IuS4gOiHtOOBl+OBvuOBl+OBnyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGF0dGVybl93cm9uZyIgbXNnaWQ9IjQ4MTc1ODMyNzkwNTMxMTIzMTIiPiLjgoTjgornm7TjgZfjgabjgY/jgaDjgZXjgYQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Bhc3N3b3JkX3dyb25nIiBtc2dpZD0iNjIzNzQ0MzY1NzM1ODE2ODgxOSI+IuOChOOCiuebtOOBl+OBpuOBj+OBoOOBleOBhCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGx1Z2dlZF9pbiIgbXNnaWQ9IjYxMzM0Mzg1Mjg0Mjk0NDQzNSI+IuWFhembu+S4re+8iDx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPjx4bGlmZjpnIGlkPSJQRVJDRU5UIj4lJTwveGxpZmY6Zz7vvIkiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2NoYXJnZWQiIG1zZ2lkPSI0OTM4OTMwNDU5NjIwOTg5OTcyIj4i5YWF6Zu75a6M5LqG44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9iYXR0ZXJ5X3Nob3J0IiBtc2dpZD0iMzYxNzU0OTE3ODYwMzM1NDY1NiI+Ijx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPjx4bGlmZjpnIGlkPSJQRVJDRU5UIj4lJTwveGxpZmY6Zz4iPC9zdHJpbmc+CkBAIC01NTksNiArNTYzLDggQEAKICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fc2ltX2xvY2tlZF9tZXNzYWdlIiBtc2dpZD0iODA2NjY2MDEyOTIwNjAwMTAzOSI+IlNJTeOCq+ODvOODieOBr+ODreODg+OCr+OBleOCjOOBpuOBhOOBvuOBmeOAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fc2ltX3VubG9ja19wcm9ncmVzc19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjU5NTMyMzIxNDA1Mjg4MTI2NCI+IlNJTeOCq+ODvOODieOBruODreODg+OCr+ino+mZpOS4rS4uLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iMzUxNDc0MjEwNjA2Njg3NzQ3NiI+IuODreODg+OCr+ino+mZpOOBruODkeOCv+ODvOODs+OBrzx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+5Zue44Go44KC5q2j44GX44GP5oyH5a6a44GV44KM44Gm44GE44G+44Gb44KT44CCIlxuXG4iPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz7np5LlvozjgavjgoLjgYbkuIDluqbmjIflrprjgZfjgabjgY/jgaDjgZXjgYTjgIIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9wYXNzd29yZF9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjQ5MDYwMzQzNzY0MjUxNzUzODEiPiLlhaXlipvjgZfjgZ/jg5Hjgrnjg6/jg7zjg4njga88eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPuWbnuOBqOOCguato+OBl+OBj+OBguOCiuOBvuOBm+OCk+OBp+OBl+OBn+OAgiJcblxuIjx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+56eS5b6M44Gr44KC44GG5LiA5bqm5YWl5Yqb44GX44Gm44GP44Gg44GV44GE44CCIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfcGluX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNjgyNzc0OTIzMTQ2NTE0NTU5MCI+IuWFpeWKm+OBl+OBn1BJTuOBrzx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+5Zue44Go44KC5q2j44GX44GP44GC44KK44G+44Gb44KT44Gn44GX44Gf44CCIlxuXG4iPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz7np5LlvozjgavjgoLjgYbkuIDluqblhaXlipvjgZfjgabjgY/jgaDjgZXjgYTjgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2ZhaWxlZF9hdHRlbXB0c19hbG1vc3RfZ2xvZ2luIiBtc2dpZD0iMzM1MTAxMzg0MjMyMDEyNzgyNyI+IuaMh+WumuOBl+OBn+ODkeOCv+ODvOODs+OBrzx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+5Zue44Go44KC5q2j44GX44GP44GC44KK44G+44Gb44KT44CC44GC44GoPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz7lm57mjIflrprjgavlpLHmlZfjgZnjgovjgajjgIHmkLrluK/pm7voqbHjga7jg63jg4Pjgq/jga7op6PpmaTjgatHb29nbGXjgbjjga7jg63jgrDjgqTjg7PjgYzlv4XopoHjgavjgarjgorjgb7jgZnjgIIiXG5cbiI8eGxpZmY6ZyBpZD0iTlVNQkVSXzIiPiVkPC94bGlmZjpnPuenkuW+jOOBq+OCguOBhuS4gOW6puaMh+WumuOBl+OBpuOBj+OBoOOBleOBhOOAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX2F0dGVtcHRzX2NvdW50ZG93biIgbXNnaWQ9IjYyNTE0ODAzNDMzOTQzODk2NjUiPiI8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz7np5LlvozjgavjgoTjgornm7TjgZfjgabjgY/jgaDjgZXjgYTjgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2ZvcmdvdF9wYXR0ZXJuX2J1dHRvbl90ZXh0IiBtc2dpZD0iMjYyNjk5OTQ0OTYxMDY5NTkzMCI+IuODkeOCv+ODvOODs+OCkuW/mOOCjOOBn+WgtOWQiCI8L3N0cmluZz4KQEAgLTcwMywxNSArNzA5LDE3IEBACiAgICAgPHN0cmluZyBuYW1lPSJlbGFwc2VkX3RpbWVfc2hvcnRfZm9ybWF0X21tX3NzIiBtc2dpZD0iNDQzMTU1NTk0MzgyODcxMTQ3MyI+Ijx4bGlmZjpnIGlkPSJNSU5VVEVTIj4lMSQwMmQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJTRUNPTkRTIj4lMiQwMmQ8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZWxhcHNlZF90aW1lX3Nob3J0X2Zvcm1hdF9oX21tX3NzIiBtc2dpZD0iMTg0NjA3MTk5NzYxNjY1NDEyNCI+Ijx4bGlmZjpnIGlkPSJIT1VSUyI+JTEkZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9Ik1JTlVURVMiPiUyJDAyZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9IlNFQ09ORFMiPiUzJDAyZDwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RBbGwiIG1zZ2lkPSI2ODc2NTE4OTI1ODQ0MTI5MzMxIj4i44GZ44G544Gm6YG45oqeIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0VGV4dCIgbXNnaWQ9IjM4ODkxNDkxMjM2MjY4ODg2MzciPiLjg4bjgq3jgrnjg4jjgpLpgbjmip4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJzdG9wU2VsZWN0aW5nVGV4dCIgbXNnaWQ9IjQxNTc5MzE0NjM4NzIzMjA5OTYiPiLjg4bjgq3jgrnjg4jjga7pgbjmip7jgpLntYLkuoYiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjdXQiIG1zZ2lkPSIzMDkyNTY5NDA4NDM4NjI2MjYxIj4i5YiH44KK5Y+W44KKIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY29weSIgbXNnaWQ9IjI2ODE5NDYyMjk1MzM1MTE5ODciPiLjgrPjg5Tjg7wiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwYXN0ZSIgbXNnaWQ9IjU2Mjk4ODA4MzY4MDUwMzY0MzMiPiLosrzjgorku5jjgZEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjb3B5VXJsIiBtc2dpZD0iMjUzODIxMTU3OTU5NjA2NzQwMiI+IlVSTOOCkuOCs+ODlOODvCI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzZWxlY3RUZXh0TW9kZSAoNjczODU1NjM0ODg2MTM0NzI0MCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciB0ZXh0U2VsZWN0aW9uQ0FCVGl0bGUgKDUyMzY4NTAzOTQzNzA4MjAzNTcpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJpbnB1dE1ldGhvZCIgbXNnaWQ9IjE2NTM2MzAwNjIzMDQ1Njc4NzkiPiLlhaXlipvmlrnms5UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJhZGRUb0RpY3Rpb25hcnkiIG1zZ2lkPSI4NzkzNjI0OTkxNjg2OTQ4NzA5Ij4i6L6e5pu444Gr44CMPHhsaWZmOmcgaWQ9IldPUkQiPiVzPC94bGlmZjpnPuOAjeOCkui/veWKoCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImVkaXRUZXh0TWVudVRpdGxlIiBtc2dpZD0iMTY3Mjk4OTE3Njk1ODU4MTQ1MiI+IuODhuOCreOCueODiOOCkue3qOmbhiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBlZGl0VGV4dE1lbnVUaXRsZSAoNDkwOTEzNTU2NDk0MTgxNTQ5NCkgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9Imxvd19pbnRlcm5hbF9zdG9yYWdlX3ZpZXdfdGl0bGUiIG1zZ2lkPSIxMzk5NzMyNDA4NzAxNjk3NTQ2Ij4i56m644GN5a656YeP5L2O5LiLIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG93X2ludGVybmFsX3N0b3JhZ2Vfdmlld190ZXh0IiBtc2dpZD0iNjM1MTA2NTQ0NjE2Mzc4ODM2Ij4i5pC65biv6Zu76Kmx44Gu56m644GN5a656YeP44GM5bCR44Gq44GP44Gq44Gj44Gm44GE44G+44GZ44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ib2siIG1zZ2lkPSI1OTcwMDYwNDMwNTYyNTI0OTEwIj4iT0siPC9zdHJpbmc+CkBAIC03MTksNiArNzI3LDcgQEAKICAgICA8c3RyaW5nIG5hbWU9InllcyIgbXNnaWQ9IjUzNjI5ODIzMDMzMzc5NjkzMTIiPiJPSyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im5vIiBtc2dpZD0iNTE0MTUzMTA0NDkzNTU0MTQ5NyI+IuOCreODo+ODs+OCu+ODqyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRpYWxvZ19hbGVydF90aXRsZSIgbXNnaWQ9IjIwNDk2NTg3MDg2MDkwNDMxMDMiPiLms6jmhI8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2FkaW5nIiBtc2dpZD0iMTc2MDcyNDk5ODkyODI1NTI1MCI+IuiqreOBv+i+vOOBv+S4rS4uLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcGl0YWxfb24iIG1zZ2lkPSIxNTQ0NjgyNzU1NTE0NDk0Mjk4Ij4iT04iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXBpdGFsX29mZiIgbXNnaWQ9IjY4MTU4NzAzODY5NzI4MDU4MzIiPiJPRkYiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ3aGljaEFwcGxpY2F0aW9uIiBtc2dpZD0iNDUzMzE4NTk0NzA2NDc3MzM4NiI+IuOCouODl+ODquOCseODvOOCt+ODp+ODs+OCkumBuOaKniI8L3N0cmluZz4KQEAgLTg1MywxMyArODYyLDE3IEBACiAgICAgPHN0cmluZyBuYW1lPSJsMnRwX2lwc2VjX3Bza192cG5fZGVzY3JpcHRpb24iIG1zZ2lkPSIzOTQ1MDQzNTY0MDA4MzAzMjM5Ij4iTDJUUC9JUFNlYyBWUE7jg5njg7zjgrnjga7kuovliY3lhbHmnInpjbUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsMnRwX2lwc2VjX2NydF92cG5fZGVzY3JpcHRpb24iIG1zZ2lkPSI1MzgyNzE0MDczMTAzNjUzNTc3Ij4iTDJUUC9JUFNlYyBWUE7jg5njg7zjgrnjga7oqLzmmI7mm7giPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1cGxvYWRfZmlsZSIgbXNnaWQ9IjI4OTc5NTcxNzIzNjY3MzA0MTYiPiLjg5XjgqHjgqTjg6vjgpLpgbjmip4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJub19maWxlX2Nob3NlbiIgbXNnaWQ9IjYzNjM2NDg1NjIxNzA3NTk0NjUiPiLjg5XjgqHjgqTjg6vjgYzpgbjmip7jgZXjgozjgabjgYTjgb7jgZvjgpMiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJyZXNldCIgbXNnaWQ9IjI0NDgxNjgwODA5NjQyMDk5MDgiPiLjg6rjgrvjg4Pjg4giPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzdWJtaXQiIG1zZ2lkPSIxNjAyMzM1NTcyMDg5OTExOTQxIj4i6YCB5L+hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZGVzY3JpcHRpb25fc3RhciIgbXNnaWQ9IjI2NTQzMTk4NzQ5MDg1NzYxMzMiPiLjgYrmsJfjgavlhaXjgooiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXJfbW9kZV9kaXNhYmxlX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjMxNjQ3NjgyMTIwMDM4NjQzMTYiPiLpgYvou6Ljg6Ljg7zjg4njgpLmnInlirnjgavjgZnjgosiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXJfbW9kZV9kaXNhYmxlX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iNjY4NjYzNjI2NzIxNjc1NjE0Ij4i6YGL6Lui44Oi44O844OJ44KS57WC5LqG44GZ44KL44Gr44Gv6YG45oqe44GX44Gm44GP44Gg44GV44GE44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGV0aGVyZWRfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iMzE0NjY5NDIzNDM5ODIwMjYwMSI+IuODhuOCtuODquODs+OCsOOBvuOBn+OBr+OCouOCr+OCu+OCueODneOCpOODs+ODiOOBjOacieWKueOBp+OBmSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRldGhlcmVkX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMzA2NzEwODMyMzkwMzA0ODkyNyI+IuOCv+ODg+ODl+OBl+OBpuioreWumuOBmeOCiyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImJhY2tfYnV0dG9uX2xhYmVsIiBtc2dpZD0iMjMwMDQ3MDAwNDUwMzM0MzQzOSI+IuaIu+OCiyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5leHRfYnV0dG9uX2xhYmVsIiBtc2dpZD0iMTA4MDU1NTEwNDY3Nzk5MjQwOCI+IuasoeOBuCI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBza2lwX2J1dHRvbl9sYWJlbCAoMTI3NTM2MjI5OTQ3MTYzMTgxOSkgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlX3dhcm5pbmdfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNDg5MDg5NDI2NzQ1NDg2NzI3NiI+IuODouODkOOCpOODq+ODh+ODvOOCv+OBruS9v+eUqOmHj+OBjOWil+OBiOOBpuOBhOOBvuOBmSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlX3dhcm5pbmdfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIyNjA5NzM0NzYzODQ1NzA1NzA4Ij4i44K/44OD44OX44GX44Gm44Oi44OQ44Kk44Or44OH44O844K/5Yip55So44Gu6Kmz57Sw44KS6KGo56S644GX44G+44GZIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVkX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjYyNjk1NDE4OTc3Mjk3ODEzMzIiPiLjg6Ljg5DjgqTjg6vjg4fjg7zjgr/jga7liLbpmZDjgpLotoXjgYjjgb7jgZfjgZ8iPC9zdHJpbmc+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWtvL3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1rby9zdHJpbmdzLnhtbAppbmRleCBmYWY1ODllLi5jYjhmMzFiIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWtvL3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMta28vc3RyaW5ncy54bWwKQEAgLTQzNiw2ICs0MzYsMTAgQEAKICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfZm9yY2VMb2NrIiBtc2dpZD0iMjgxOTg2ODY2NDk0NjA4OTc0MCI+Iuq4sOq4sOqwgCDsnqDqsqgg7J6I7J2EIOuVjCDsnpHrj5ntlZjroKTrqbQg67mE67CA67KI7Zi466W8IOuLpOyLnCDsnoXroKXtlbTslbwg7ZWp64uI64ukLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl93aXBlRGF0YSIgbXNnaWQ9IjM5MTA1NDU0NDY3NTg2Mzk3MTMiPiLrqqjrk6Ag642w7J207YSwIOyCreygnCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfd2lwZURhdGEiIG1zZ2lkPSIyMzE0MDYwOTMzNzk2Mzk2MjA1Ij4i7LSI6riw7ZmU66W8IOyImO2Wie2VmOyXrCDrqqjrk6Ag642w7J207YSw66W8IO2ZleyduO2VmOyngCDslYrqs6Ag7IKt7KCc7ZWp64uI64ukLiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwb2xpY3lsYWJfc2V0R2xvYmFsUHJveHkgKDI3ODQ4MjgyOTM3NDc3OTE0NDYpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcG9saWN5ZGVzY19zZXRHbG9iYWxQcm94eSAoNjM4NzQ5NzQ2NjY2MDE1NDkzMSkgLS0+CisgICAgPHNraXAgLz4KICAgPHN0cmluZy1hcnJheSBuYW1lPSJwaG9uZVR5cGVzIj4KICAgICA8aXRlbSBtc2dpZD0iODkwMTA5ODMzNjY1ODcxMDM1OSI+IuynkSI8L2l0ZW0+CiAgICAgPGl0ZW0gbXNnaWQ9Ijg2OTkyMzY1MDUyNzEzNjYxNSI+IuuqqOuwlOydvCI8L2l0ZW0+CkBAIC01MjksMTAgKzUzMyw5IEBACiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlV29yayIgbXNnaWQ9IjI5MjY4ODcwNTA1MzYzODcyIj4i7KeB7J6lIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZU90aGVyIiBtc2dpZD0iMzk1MTc4MTEzMTU3MDEyNDA4MiI+Iuq4sO2DgCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVDdXN0b20iIG1zZ2lkPSIyMjU1MjM0MTUzNzIwODgzMjIiPiLrp57stqTshKTsoJUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJjb250YWN0X3N0YXR1c191cGRhdGVfYXR0cmlidXRpb24iIG1zZ2lkPSI1MTEyNTg5ODg2MDk0NDAyNzk1Ij4iPHhsaWZmOmcgaWQ9IlNPVVJDRSI+JTEkczwveGxpZmY6Zz7snYQo66W8KSDthrXtlbQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJjb250YWN0X3N0YXR1c191cGRhdGVfYXR0cmlidXRpb25fd2l0aF9kYXRlIiBtc2dpZD0iNTk0NTM4NjM3NjM2OTk3OTkwOSI+Ijx4bGlmZjpnIGlkPSJEQVRFIj4lMSRzPC94bGlmZjpnPig8eGxpZmY6ZyBpZD0iU09VUkNFIj4lMiRzPC94bGlmZjpnPiDsgqzsmqkpIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGluX2NvZGUiIG1zZ2lkPSIzNzMxNDg4ODI3MjE4ODc2MTE1Ij4iUElOIOy9lOuTnCDsnoXroKUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9wYXNzd29yZF9jb2RlIiBtc2dpZD0iOTEzODE1ODM0NDgxMzIxMzc1NCI+IuyeoOq4iOydhCDtlbTsoJztlZjroKTrqbQg67mE67CA67KI7Zi4IOyeheugpSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bpbl9wYXNzd29yZF9jb2RlIiBtc2dpZD0iNjM4MzQ3MDc1NjI1NDkxNTE0Ij4i7J6g6riI7J2EIO2VtOygnO2VmOugpOuptCBQSU4g7J6F66ClIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfd3JvbmdfcGluX2NvZGUiIG1zZ2lkPSIxMjk1OTg0MTE0MzM4MTA3NzE4Ij4iUElOIOy9lOuTnOqwgCDsnpjrqrvrkJjsl4jsirXri4jri6QuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfbGFiZWxfdGV4dCIgbXNnaWQ9Ijg2MTc5NjQ2MTAyODI5ODQyNCI+IuyeoOq4iO2VtOygnO2VmOugpOuptCDrqZTribTrpbwg64iE66W4IOuLpOydjCAw7J2EIOuIhOumheuLiOuLpC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJlbWVyZ2VuY3lfY2FsbF9kaWFsb2dfbnVtYmVyX2Zvcl9kaXNwbGF5IiBtc2dpZD0iNjk2MTkyMTAzMTk1MDkwOTcwIj4i67mE7IOBIOyghO2ZlOuyiO2YuCI8L3N0cmluZz4KQEAgLTU0NSw2ICs1NDgsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9yZXR1cm5fdG9fY2FsbCIgbXNnaWQ9IjUyNDQyNTk3ODU1MDAwNDAwMjEiPiLthrXtmZTroZwg64+M7JWE6rCA6riwIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXR0ZXJuX2NvcnJlY3QiIG1zZ2lkPSI5MDM5MDA4NjUwMzYyMjYxMjM3Ij4i66ee7Iq164uI64ukLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGF0dGVybl93cm9uZyIgbXNnaWQ9IjQ4MTc1ODMyNzkwNTMxMTIzMTIiPiLso4TshqHtlanri4jri6QuIOuLpOyLnCDsi5zrj4TtlZjshLjsmpQuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXNzd29yZF93cm9uZyIgbXNnaWQ9IjYyMzc0NDM2NTczNTgxNjg4MTkiPiLso4TshqHtlanri4jri6QuIOuLpOyLnCDsi5zrj4TtlbQg7KO87IS47JqULiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGx1Z2dlZF9pbiIgbXNnaWQ9IjYxMzM0Mzg1Mjg0Mjk0NDQzNSI+Iuy2qeyghCDspJEoPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+PHhsaWZmOmcgaWQ9IlBFUkNFTlQiPiUlPC94bGlmZjpnPikiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2NoYXJnZWQiIG1zZ2lkPSI0OTM4OTMwNDU5NjIwOTg5OTcyIj4i7Lap7KCE65CY7JeI7Iq164uI64ukLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fYmF0dGVyeV9zaG9ydCIgbXNnaWQ9IjM2MTc1NDkxNzg2MDMzNTQ2NTYiPiI8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz4gPHhsaWZmOmcgaWQ9IlBFUkNFTlQiPiUlPC94bGlmZjpnPiI8L3N0cmluZz4KQEAgLTU1OSw2ICs1NjMsOCBAQAogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9zaW1fbG9ja2VkX21lc3NhZ2UiIG1zZ2lkPSI4MDY2NjYwMTI5MjA2MDAxMDM5Ij4iU0lNIOy5tOuTnOqwgCDsnqDqsqgg7J6I7Iq164uI64ukLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fc2ltX3VubG9ja19wcm9ncmVzc19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjU5NTMyMzIxNDA1Mjg4MTI2NCI+IlNJTSDsubTrk5wg7J6g6riI7ZW07KCcIOykkS4uLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iMzUxNDc0MjEwNjA2Njg3NzQ3NiI+IuyeoOq4iO2VtOygnCDtjKjthLTsnYQgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz7tmowg7J6Y66q7IOq3uOuguOyKteuLiOuLpC4gIlxuXG4iPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz7stIgg7ZuE7JeQIOuLpOyLnCDsi5zrj4TtlZjshLjsmpQuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfcGFzc3dvcmRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI0OTA2MDM0Mzc2NDI1MTc1MzgxIj4i67mE67CA67KI7Zi466W8IDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+7ZqMIOyemOuquyDsnoXroKXtlojsirXri4jri6QuICJcblxuIjx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+7LSIIO2bhOyXkCDri6Tsi5wg7Iuc64+E7ZW0IOyjvOyEuOyalC4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9waW5fYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI2ODI3NzQ5MjMxNDY1MTQ1NTkwIj4iUElO7J2EIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+7ZqMIOyemOuquyDsnoXroKXtlojsirXri4jri6QuICJcblxuIjx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+7LSIIO2bhOyXkCDri6Tsi5wg7Iuc64+E7ZW0IOyjvOyEuOyalC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2ZhaWxlZF9hdHRlbXB0c19hbG1vc3RfZ2xvZ2luIiBtc2dpZD0iMzM1MTAxMzg0MjMyMDEyNzgyNyI+IuyeoOq4iO2VtOygnCDtjKjthLTsnYQgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz7tmowg7J6Y66q7IOq3uOuguOyKteuLiOuLpC4gPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz7tmowg642UIOyLpO2MqO2VmOuptCBHb29nbGUg66Gc6re47J247J2EIO2Gte2VtCDtnLTrjIDsoITtmZTrpbwg7J6g6riI7ZW07KCc7ZWY64+E66GdIOyalOyyreuQqeuLiOuLpC4gIlxuXG4iIDx4bGlmZjpnIGlkPSJOVU1CRVJfMiI+JWQ8L3hsaWZmOmc+7LSIIO2bhOyXkCDri6Tsi5wg7Iuc64+E7ZWY7IS47JqULiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX2F0dGVtcHRzX2NvdW50ZG93biIgbXNnaWQ9IjYyNTE0ODAzNDMzOTQzODk2NjUiPiI8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz7stIgg7ZuE7JeQIOuLpOyLnCDsi5zrj4TtlZjshLjsmpQuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9mb3Jnb3RfcGF0dGVybl9idXR0b25fdGV4dCIgbXNnaWQ9IjI2MjY5OTk0NDk2MTA2OTU5MzAiPiLtjKjthLTsnYQg7J6K7Jy87IWo64KY7JqUPyI8L3N0cmluZz4KQEAgLTcwMywxNSArNzA5LDE3IEBACiAgICAgPHN0cmluZyBuYW1lPSJlbGFwc2VkX3RpbWVfc2hvcnRfZm9ybWF0X21tX3NzIiBtc2dpZD0iNDQzMTU1NTk0MzgyODcxMTQ3MyI+Ijx4bGlmZjpnIGlkPSJNSU5VVEVTIj4lMSQwMmQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJTRUNPTkRTIj4lMiQwMmQ8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZWxhcHNlZF90aW1lX3Nob3J0X2Zvcm1hdF9oX21tX3NzIiBtc2dpZD0iMTg0NjA3MTk5NzYxNjY1NDEyNCI+Ijx4bGlmZjpnIGlkPSJIT1VSUyI+JTEkZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9Ik1JTlVURVMiPiUyJDAyZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9IlNFQ09ORFMiPiUzJDAyZDwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RBbGwiIG1zZ2lkPSI2ODc2NTE4OTI1ODQ0MTI5MzMxIj4i66qo65GQIOyEoO2DnSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InNlbGVjdFRleHQiIG1zZ2lkPSIzODg5MTQ5MTIzNjI2ODg4NjM3Ij4i7YWN7Iqk7Yq4IOyEoO2DnSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InN0b3BTZWxlY3RpbmdUZXh0IiBtc2dpZD0iNDE1NzkzMTQ2Mzg3MjMyMDk5NiI+Iu2FjeyKpO2KuCDshKDtg50g7KSR7KeAIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY3V0IiBtc2dpZD0iMzA5MjU2OTQwODQzODYyNjI2MSI+IuyemOudvOuCtOq4sCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNvcHkiIG1zZ2lkPSIyNjgxOTQ2MjI5NTMzNTExOTg3Ij4i67O17IKsIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGFzdGUiIG1zZ2lkPSI1NjI5ODgwODM2ODA1MDM2NDMzIj4i67aZ7Jes64Sj6riwIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY29weVVybCIgbXNnaWQ9IjI1MzgyMTE1Nzk1OTYwNjc0MDIiPiJVUkwg67O17IKsIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNlbGVjdFRleHRNb2RlICg2NzM4NTU2MzQ4ODYxMzQ3MjQwKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHRleHRTZWxlY3Rpb25DQUJUaXRsZSAoNTIzNjg1MDM5NDM3MDgyMDM1NykgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9ImlucHV0TWV0aG9kIiBtc2dpZD0iMTY1MzYzMDA2MjMwNDU2Nzg3OSI+IuyeheugpSDrsKnrspUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJhZGRUb0RpY3Rpb25hcnkiIG1zZ2lkPSI4NzkzNjI0OTkxNjg2OTQ4NzA5Ij4i7IKs7KCE7JeQIFwnPHhsaWZmOmcgaWQ9IldPUkQiPiVzPC94bGlmZjpnPlwnIOy2lOqwgCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImVkaXRUZXh0TWVudVRpdGxlIiBtc2dpZD0iMTY3Mjk4OTE3Njk1ODU4MTQ1MiI+Iu2FjeyKpO2KuCDsiJjsoJUiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZWRpdFRleHRNZW51VGl0bGUgKDQ5MDkxMzU1NjQ5NDE4MTU0OTQpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJsb3dfaW50ZXJuYWxfc3RvcmFnZV92aWV3X3RpdGxlIiBtc2dpZD0iMTM5OTczMjQwODcwMTY5NzU0NiI+IuyggOyepeqzteqwhCDrtoDsobEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb3dfaW50ZXJuYWxfc3RvcmFnZV92aWV3X3RleHQiIG1zZ2lkPSI2MzUxMDY1NDQ2MTYzNzg4MzYiPiLtnLTrjIDsoITtmZQg7KCA7J6l6rO16rCE7J20IOu2gOyhse2VqeuLiOuLpC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvayIgbXNnaWQ9IjU5NzAwNjA0MzA1NjI1MjQ5MTAiPiLtmZXsnbgiPC9zdHJpbmc+CkBAIC03MTksNiArNzI3LDcgQEAKICAgICA8c3RyaW5nIG5hbWU9InllcyIgbXNnaWQ9IjUzNjI5ODIzMDMzMzc5NjkzMTIiPiLtmZXsnbgiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJubyIgbXNnaWQ9IjUxNDE1MzEwNDQ5MzU1NDE0OTciPiLst6jshowiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkaWFsb2dfYWxlcnRfdGl0bGUiIG1zZ2lkPSIyMDQ5NjU4NzA4NjA5MDQzMTAzIj4i7KO87J2YIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9hZGluZyIgbXNnaWQ9IjE3NjA3MjQ5OTg5MjgyNTUyNTAiPiLroZzrk5wg7KSRLi4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FwaXRhbF9vbiIgbXNnaWQ9IjE1NDQ2ODI3NTU1MTQ0OTQyOTgiPiLsgqzsmqkiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXBpdGFsX29mZiIgbXNnaWQ9IjY4MTU4NzAzODY5NzI4MDU4MzIiPiLsgqzsmqkg7JWI7ZWoIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0id2hpY2hBcHBsaWNhdGlvbiIgbXNnaWQ9IjQ1MzMxODU5NDcwNjQ3NzMzODYiPiLsnpHsl4XsnYQg7IiY7ZaJ7ZWgIOuVjCDsgqzsmqntlZjripQg7JWg7ZSM66as7LyA7J207IWYIjwvc3RyaW5nPgpAQCAtODUzLDEzICs4NjIsMTcgQEAKICAgICA8c3RyaW5nIG5hbWU9ImwydHBfaXBzZWNfcHNrX3Zwbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM5NDUwNDM1NjQwMDgzMDMyMzkiPiLsgqzsoIQg6rO17JygIO2CpCDquLDrsJggTDJUUC9JUFNlYyBWUE4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsMnRwX2lwc2VjX2NydF92cG5fZGVzY3JpcHRpb24iIG1zZ2lkPSI1MzgyNzE0MDczMTAzNjUzNTc3Ij4i7J247Kad7IScIOq4sOuwmCBMMlRQL0lQU2VjIFZQTiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVwbG9hZF9maWxlIiBtc2dpZD0iMjg5Nzk1NzE3MjM2NjczMDQxNiI+Iu2MjOydvCDshKDtg50iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJub19maWxlX2Nob3NlbiIgbXNnaWQ9IjYzNjM2NDg1NjIxNzA3NTk0NjUiPiLtjIzsnbzsnYQg7ISg7YOd7ZWY7KeAIOyViuyVmOyKteuLiOuLpC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJyZXNldCIgbXNnaWQ9IjI0NDgxNjgwODA5NjQyMDk5MDgiPiLsnqzshKTsoJUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzdWJtaXQiIG1zZ2lkPSIxNjAyMzM1NTcyMDg5OTExOTQxIj4i7KCc7LacIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZGVzY3JpcHRpb25fc3RhciIgbXNnaWQ9IjI2NTQzMTk4NzQ5MDg1NzYxMzMiPiLsppDqsqjssL7quLAiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXJfbW9kZV9kaXNhYmxlX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjMxNjQ3NjgyMTIwMDM4NjQzMTYiPiLsmrTsoITrqqjrk5wg7IKs7JqpIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FyX21vZGVfZGlzYWJsZV9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjY2ODY2MzYyNjcyMTY3NTYxNCI+IuyatOyghOuqqOuTnOulvCDsooXro4ztlZjroKTrqbQg7ISg7YOd7ZWY7IS47JqULiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRldGhlcmVkX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjMxNDY2OTQyMzQzOTgyMDI2MDEiPiLthYzrjZTrp4Eg65iQ64qUIO2Vq+yKpO2MnyDsgqzsmqkiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0ZXRoZXJlZF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjMwNjcxMDgzMjM5MDMwNDg5MjciPiLqtazshLHtlZjroKTrqbQg7YSw7LmY7ZWY7IS47JqULiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImJhY2tfYnV0dG9uX2xhYmVsIiBtc2dpZD0iMjMwMDQ3MDAwNDUwMzM0MzQzOSI+IuuSpOuhnCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5leHRfYnV0dG9uX2xhYmVsIiBtc2dpZD0iMTA4MDU1NTEwNDY3Nzk5MjQwOCI+IuuLpOydjCI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBza2lwX2J1dHRvbl9sYWJlbCAoMTI3NTM2MjI5OTQ3MTYzMTgxOSkgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlX3dhcm5pbmdfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNDg5MDg5NDI2NzQ1NDg2NzI3NiI+IuuGkuydgCDrqqjrsJTsnbwg642w7J207YSwIOyCrOyaqeufiSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlX3dhcm5pbmdfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIyNjA5NzM0NzYzODQ1NzA1NzA4Ij4i66qo67CU7J28IOuNsOydtO2EsCDsgqzsmqnsl5Ag64yA7ZW0IOyekOyEuO2eiCDslYzslYTrs7TroKTrqbQg7YSw7LmY7ZWY7IS47JqULiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlZF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI2MjY5NTQxODk3NzI5NzgxMzMyIj4i66qo67CU7J28IOuNsOydtO2EsCDsoJztlZzsnYQg7LSI6rO87ZaI7Iq164uI64ukLiI8L3N0cmluZz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtbmIvc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLW5iL3N0cmluZ3MueG1sCmluZGV4IDJjMjNkNTMuLjQ0ODVkMjcgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtbmIvc3RyaW5ncy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1uYi9zdHJpbmdzLnhtbApAQCAtNDM2LDYgKzQzNiwxMCBAQAogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19mb3JjZUxvY2siIG1zZ2lkPSIyODE5ODY4NjY0OTQ2MDg5NzQwIj4iS29udHJvbGxlcmVyIG7DpXIgZW5oZXRlbiBsw6VzZXMuIER1IG3DpSBza3JpdmUgaW5uIHBhc3NvcmRldCBww6Ugbnl0dCBmb3Igw6UgbMOlc2UgZGVuIG9wcC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfd2lwZURhdGEiIG1zZ2lkPSIzOTEwNTQ1NDQ2NzU4NjM5NzEzIj4iU2xldHQgYWxsZSBkYXRhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY193aXBlRGF0YSIgbXNnaWQ9IjIzMTQwNjA5MzM3OTYzOTYyMDUiPiJVdGbDuHJlciB0aWxiYWtlc3RpbGxpbmcgdGlsIGZhYnJpa2tzdGFuZGFyZC4gQWxsZSBkYXRhIHNsZXR0ZXMgdXRlbiB2YXJzZWwuIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBvbGljeWxhYl9zZXRHbG9iYWxQcm94eSAoMjc4NDgyODI5Mzc0Nzc5MTQ0NikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwb2xpY3lkZXNjX3NldEdsb2JhbFByb3h5ICg2Mzg3NDk3NDY2NjYwMTU0OTMxKSAtLT4KKyAgICA8c2tpcCAvPgogICA8c3RyaW5nLWFycmF5IG5hbWU9InBob25lVHlwZXMiPgogICAgIDxpdGVtIG1zZ2lkPSI4OTAxMDk4MzM2NjU4NzEwMzU5Ij4iSGplbW1lbnVtbWVyIjwvaXRlbT4KICAgICA8aXRlbSBtc2dpZD0iODY5OTIzNjUwNTI3MTM2NjE1Ij4iTW9iaWwiPC9pdGVtPgpAQCAtNTI5LDEwICs1MzMsOSBAQAogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZVdvcmsiIG1zZ2lkPSIyOTI2ODg3MDUwNTM2Mzg3MiI+IkFyYmVpZCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVPdGhlciIgbXNnaWQ9IjM5NTE3ODExMzE1NzAxMjQwODIiPiJBbm5lbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVDdXN0b20iIG1zZ2lkPSIyMjU1MjM0MTUzNzIwODgzMjIiPiJFZ2VuZGVmaW5lcnQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJjb250YWN0X3N0YXR1c191cGRhdGVfYXR0cmlidXRpb24iIG1zZ2lkPSI1MTEyNTg5ODg2MDk0NDAyNzk1Ij4idmlhIDx4bGlmZjpnIGlkPSJTT1VSQ0UiPiUxJHM8L3hsaWZmOmc+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iY29udGFjdF9zdGF0dXNfdXBkYXRlX2F0dHJpYnV0aW9uX3dpdGhfZGF0ZSIgbXNnaWQ9IjU5NDUzODYzNzYzNjk5Nzk5MDkiPiI8eGxpZmY6ZyBpZD0iREFURSI+JTEkczwveGxpZmY6Zz4gdmlhIDx4bGlmZjpnIGlkPSJTT1VSQ0UiPiUyJHM8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGluX2NvZGUiIG1zZ2lkPSIzNzMxNDg4ODI3MjE4ODc2MTE1Ij4iU2tyaXYgaW5uIFBJTi1rb2RlOiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bhc3N3b3JkX2NvZGUiIG1zZ2lkPSI5MTM4MTU4MzQ0ODEzMjEzNzU0Ij4iU2tyaXYgaW5uIHBhc3NvcmQgZm9yIMOlIGzDpXNlIG9wcCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bpbl9wYXNzd29yZF9jb2RlIiBtc2dpZD0iNjM4MzQ3MDc1NjI1NDkxNTE0Ij4iU2tyaXYgaW5uIHBlcnNvbmxpZyBrb2RlIGZvciDDpSBsw6VzZSBvcHAiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF93cm9uZ19waW5fY29kZSIgbXNnaWQ9IjEyOTU5ODQxMTQzMzgxMDc3MTgiPiJHYWwgUElOLWtvZGUhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfbGFiZWxfdGV4dCIgbXNnaWQ9Ijg2MTc5NjQ2MTAyODI5ODQyNCI+IkZvciDDpSBsw6VzZSBvcHAsIHRyeWtrIHDDpSBtZW55a25hcHBlbiBvZyBkZXJldHRlciAwLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVtZXJnZW5jeV9jYWxsX2RpYWxvZ19udW1iZXJfZm9yX2Rpc3BsYXkiIG1zZ2lkPSI2OTYxOTIxMDMxOTUwOTA5NzAiPiJOw7hkbnVtbWVyIjwvc3RyaW5nPgpAQCAtNTQ1LDYgKzU0OCw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3JldHVybl90b19jYWxsIiBtc2dpZD0iNTI0NDI1OTc4NTUwMDA0MDAyMSI+IlRpbGJha2UgdGlsIHNhbXRhbGUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BhdHRlcm5fY29ycmVjdCIgbXNnaWQ9IjkwMzkwMDg2NTAzNjIyNjEyMzciPiJSaWt0aWchIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXR0ZXJuX3dyb25nIiBtc2dpZD0iNDgxNzU4MzI3OTA1MzExMjMxMiI+IkJla2xhZ2VyLCBwcsO4diBpZ2plbjoiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Bhc3N3b3JkX3dyb25nIiBtc2dpZD0iNjIzNzQ0MzY1NzM1ODE2ODgxOSI+IlByw7h2IGlnamVuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wbHVnZ2VkX2luIiBtc2dpZD0iNjEzMzQzODUyODQyOTQ0NDM1Ij4iTGFkZXIgKDx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPjx4bGlmZjpnIGlkPSJQRVJDRU5UIj4lJTwveGxpZmY6Zz4pIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9jaGFyZ2VkIiBtc2dpZD0iNDkzODkzMDQ1OTYyMDk4OTk3MiI+IkZ1bGx0IGxhZGV0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9iYXR0ZXJ5X3Nob3J0IiBtc2dpZD0iMzYxNzU0OTE3ODYwMzM1NDY1NiI+Ijx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPjx4bGlmZjpnIGlkPSJQRVJDRU5UIj4lJTwveGxpZmY6Zz4iPC9zdHJpbmc+CkBAIC01NTksNiArNTYzLDggQEAKICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fc2ltX2xvY2tlZF9tZXNzYWdlIiBtc2dpZD0iODA2NjY2MDEyOTIwNjAwMTAzOSI+IlNJTS1rb3J0ZXQgZXIgbMOlc3QuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9zaW1fdW5sb2NrX3Byb2dyZXNzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNTk1MzIzMjE0MDUyODgxMjY0Ij4iTMOlc2VyIG9wcCBTSU0ta29ydOKApiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iMzUxNDc0MjEwNjA2Njg3NzQ3NiI+IllvdSBoYXZlIGluY29ycmVjdGx5IGRyYXduIHlvdXIgdW5sb2NrIHBhdHRlcm4gPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4gdGltZXMuICJcblxuIlBsZWFzZSB0cnkgYWdhaW4gaW4gPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gc2Vjb25kcy4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9wYXNzd29yZF9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjQ5MDYwMzQzNzY0MjUxNzUzODEiPiJEdSBoYXIgb3BwZ2l0dCBmZWlsIHBhc3NvcmQgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4gZ2FuZ2VyLiAiXG5cbiJQcsO4diBpZ2plbiBvbSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBzZWt1bmRlci4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9waW5fYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI2ODI3NzQ5MjMxNDY1MTQ1NTkwIj4iRHUgaGFyIG9wcGdpdHQgZmVpbCBwZXJzb25saWcga29kZSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiBnYW5nZXIuICJcblxuIlByw7h2IGlnamVuIG9tIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IHNla3VuZGVyLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fZmFpbGVkX2F0dGVtcHRzX2FsbW9zdF9nbG9naW4iIG1zZ2lkPSIzMzUxMDEzODQyMzIwMTI3ODI3Ij4iWW91IGhhdmUgaW5jb3JyZWN0bHkgZHJhd24geW91ciB1bmxvY2sgcGF0dGVybiA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiB0aW1lcy4gQWZ0ZXIgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gbW9yZSB1bnN1Y2Nlc3NmdWwgYXR0ZW1wdHMsIHlvdSB3aWxsIGJlIGFza2VkIHRvIHVubG9jayB5b3VyIHBob25lIHVzaW5nIHlvdXIgR29vZ2xlIHNpZ24taW4uIlxuXG4iIFBsZWFzZSB0cnkgYWdhaW4gaW4gPHhsaWZmOmcgaWQ9Ik5VTUJFUl8yIj4lZDwveGxpZmY6Zz4gc2Vjb25kcy4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9hdHRlbXB0c19jb3VudGRvd24iIG1zZ2lkPSI2MjUxNDgwMzQzMzk0Mzg5NjY1Ij4iUHLDuHYgaWdqZW4gb20gPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+IHNla3VuZGVyLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fZm9yZ290X3BhdHRlcm5fYnV0dG9uX3RleHQiIG1zZ2lkPSIyNjI2OTk5NDQ5NjEwNjk1OTMwIj4iR2xlbXQgbcO4bnN0ZXJldD8iPC9zdHJpbmc+CkBAIC03MDMsMTUgKzcwOSwxNyBAQAogICAgIDxzdHJpbmcgbmFtZT0iZWxhcHNlZF90aW1lX3Nob3J0X2Zvcm1hdF9tbV9zcyIgbXNnaWQ9IjQ0MzE1NTU5NDM4Mjg3MTE0NzMiPiI8eGxpZmY6ZyBpZD0iTUlOVVRFUyI+JTEkMDJkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iU0VDT05EUyI+JTIkMDJkPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVsYXBzZWRfdGltZV9zaG9ydF9mb3JtYXRfaF9tbV9zcyIgbXNnaWQ9IjE4NDYwNzE5OTc2MTY2NTQxMjQiPiI8eGxpZmY6ZyBpZD0iSE9VUlMiPiUxJGQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJNSU5VVEVTIj4lMiQwMmQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJTRUNPTkRTIj4lMyQwMmQ8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0QWxsIiBtc2dpZD0iNjg3NjUxODkyNTg0NDEyOTMzMSI+Ik1lcmsgYWx0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0VGV4dCIgbXNnaWQ9IjM4ODkxNDkxMjM2MjY4ODg2MzciPiJNZXJrIHRla3N0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ic3RvcFNlbGVjdGluZ1RleHQiIG1zZ2lkPSI0MTU3OTMxNDYzODcyMzIwOTk2Ij4iU2x1dHQgw6UgbWVya2UgdGVrc3QiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjdXQiIG1zZ2lkPSIzMDkyNTY5NDA4NDM4NjI2MjYxIj4iS2xpcHAgdXQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjb3B5IiBtc2dpZD0iMjY4MTk0NjIyOTUzMzUxMTk4NyI+IktvcGllciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBhc3RlIiBtc2dpZD0iNTYyOTg4MDgzNjgwNTAzNjQzMyI+IkxpbSBpbm4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjb3B5VXJsIiBtc2dpZD0iMjUzODIxMTU3OTU5NjA2NzQwMiI+IktvcGllciBVUkwiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2VsZWN0VGV4dE1vZGUgKDY3Mzg1NTYzNDg4NjEzNDcyNDApIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgdGV4dFNlbGVjdGlvbkNBQlRpdGxlICg1MjM2ODUwMzk0MzcwODIwMzU3KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0iaW5wdXRNZXRob2QiIG1zZ2lkPSIxNjUzNjMwMDYyMzA0NTY3ODc5Ij4iSW5uZGF0YW1ldG9kZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImFkZFRvRGljdGlvbmFyeSIgbXNnaWQ9Ijg3OTM2MjQ5OTE2ODY5NDg3MDkiPiJMZWdnIMKrPHhsaWZmOmcgaWQ9IldPUkQiPiVzPC94bGlmZjpnPsK7IHRpbCBvcmRsaXN0ZW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJlZGl0VGV4dE1lbnVUaXRsZSIgbXNnaWQ9IjE2NzI5ODkxNzY5NTg1ODE0NTIiPiJSZWRpZ2VyIHRla3N0Ijwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGVkaXRUZXh0TWVudVRpdGxlICg0OTA5MTM1NTY0OTQxODE1NDk0KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0ibG93X2ludGVybmFsX3N0b3JhZ2Vfdmlld190aXRsZSIgbXNnaWQ9IjEzOTk3MzI0MDg3MDE2OTc1NDYiPiJMaXRlIHBsYXNzIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG93X2ludGVybmFsX3N0b3JhZ2Vfdmlld190ZXh0IiBtc2dpZD0iNjM1MTA2NTQ0NjE2Mzc4ODM2Ij4iRGV0IGJlZ3lubmVyIMOlIGJsaSBsaXRlIGxhZ3JpbmdzcGxhc3MgcMOlIHRlbGVmb25lbi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvayIgbXNnaWQ9IjU5NzAwNjA0MzA1NjI1MjQ5MTAiPiJPSyI8L3N0cmluZz4KQEAgLTcxOSw2ICs3MjcsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ieWVzIiBtc2dpZD0iNTM2Mjk4MjMwMzMzNzk2OTMxMiI+Ik9LIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibm8iIG1zZ2lkPSI1MTQxNTMxMDQ0OTM1NTQxNDk3Ij4iQXZicnl0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGlhbG9nX2FsZXJ0X3RpdGxlIiBtc2dpZD0iMjA0OTY1ODcwODYwOTA0MzEwMyI+Ik1lcmsiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2FkaW5nIiBtc2dpZD0iMTc2MDcyNDk5ODkyODI1NTI1MCI+Ikxhc3RlciBpbm4gLi4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FwaXRhbF9vbiIgbXNnaWQ9IjE1NDQ2ODI3NTU1MTQ0OTQyOTgiPiJQw6UiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXBpdGFsX29mZiIgbXNnaWQ9IjY4MTU4NzAzODY5NzI4MDU4MzIiPiJBdiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9IndoaWNoQXBwbGljYXRpb24iIG1zZ2lkPSI0NTMzMTg1OTQ3MDY0NzczMzg2Ij4iRnVsbGbDuHIgbWVkIjwvc3RyaW5nPgpAQCAtODUzLDEzICs4NjIsMTcgQEAKICAgICA8c3RyaW5nIG5hbWU9ImwydHBfaXBzZWNfcHNrX3Zwbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM5NDUwNDM1NjQwMDgzMDMyMzkiPiJQYXNzb3JkYmFzZXJ0IEwyVFAvSVBTZWMtVlBOIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibDJ0cF9pcHNlY19jcnRfdnBuX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNTM4MjcxNDA3MzEwMzY1MzU3NyI+IlNlcnRpZmlrYXRiYXNlcnQgTDJUUC9JUFNlYy1WUE4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1cGxvYWRfZmlsZSIgbXNnaWQ9IjI4OTc5NTcxNzIzNjY3MzA0MTYiPiJWZWxnIGZpbCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5vX2ZpbGVfY2hvc2VuIiBtc2dpZD0iNjM2MzY0ODU2MjE3MDc1OTQ2NSI+IkluZ2VuIGZpbCBlciB2YWxndCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InJlc2V0IiBtc2dpZD0iMjQ0ODE2ODA4MDk2NDIwOTkwOCI+IlRpbGJha2VzdGlsbCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InN1Ym1pdCIgbXNnaWQ9IjE2MDIzMzU1NzIwODk5MTE5NDEiPiJTZW5kIGlubiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImRlc2NyaXB0aW9uX3N0YXIiIG1zZ2lkPSIyNjU0MzE5ODc0OTA4NTc2MTMzIj4iZmF2b3JpdHQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXJfbW9kZV9kaXNhYmxlX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjMxNjQ3NjgyMTIwMDM4NjQzMTYiPiJCaWxtb2R1cyBlciBha3RpdmVydCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcl9tb2RlX2Rpc2FibGVfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI2Njg2NjM2MjY3MjE2NzU2MTQiPiJWZWxnIGZvciDDpSBhdnNsdXR0ZSBiaWxtb2R1cyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRldGhlcmVkX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjMxNDY2OTQyMzQzOTgyMDI2MDEiPiJUaWxrbnl0bmluZyBlbGxlciB0csOlZGzDuHMgc29uZSBlciBha3RpdiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRldGhlcmVkX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMzA2NzEwODMyMzkwMzA0ODkyNyI+IlRyeWtrIGZvciDDpSBrb25maWd1cmVyZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImJhY2tfYnV0dG9uX2xhYmVsIiBtc2dpZD0iMjMwMDQ3MDAwNDUwMzM0MzQzOSI+IlRpbGJha2UiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJuZXh0X2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjEwODA1NTUxMDQ2Nzc5OTI0MDgiPiJOZXN0ZSI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBza2lwX2J1dHRvbl9sYWJlbCAoMTI3NTM2MjI5OTQ3MTYzMTgxOSkgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlX3dhcm5pbmdfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNDg5MDg5NDI2NzQ1NDg2NzI3NiI+IkjDuHkgbW9iaWxkYXRhYnJ1ayI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlX3dhcm5pbmdfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIyNjA5NzM0NzYzODQ1NzA1NzA4Ij4iQmVyw7hyIGZvciDDpSBsZXNlIG1lciBvbSBicnVrIGF2IG1vYmlsZGF0YSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlZF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI2MjY5NTQxODk3NzI5NzgxMzMyIj4iR3JlbnNlbiBmb3IgbW9iaWxkYXRhYnJ1ayBlciBvdmVyc2tyZWRldCI8L3N0cmluZz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtbmwvc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLW5sL3N0cmluZ3MueG1sCmluZGV4IDEwYThlNzQuLmFiZDc5MWEgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtbmwvc3RyaW5ncy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1ubC9zdHJpbmdzLnhtbApAQCAtNDM2LDYgKzQzNiwxMCBAQAogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19mb3JjZUxvY2siIG1zZ2lkPSIyODE5ODY4NjY0OTQ2MDg5NzQwIj4iQmVoZXJlbiB3YW5uZWVyIGhldCBhcHBhcmFhdCB3b3JkdCB2ZXJncmVuZGVsZCwgd2F0IHZlcmVpc3QgZGF0IHUgaGV0IHdhY2h0d29vcmQgb3BuaWV1dyBpbnZvZXJ0LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl93aXBlRGF0YSIgbXNnaWQ9IjM5MTA1NDU0NDY3NTg2Mzk3MTMiPiJBbGxlIGdlZ2V2ZW5zIHdpc3NlbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfd2lwZURhdGEiIG1zZ2lkPSIyMzE0MDYwOTMzNzk2Mzk2MjA1Ij4iRGUgZmFicmlla3NpbnN0ZWxsaW5nZW4gaGVyc3RlbGxlbiwgd2FhcmJpaiBhbGxlIGdlZ2V2ZW5zIHdvcmRlbiB2ZXJ3aWpkZXJkIHpvbmRlciBiZXZlc3RpZ2luZy4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcG9saWN5bGFiX3NldEdsb2JhbFByb3h5ICgyNzg0ODI4MjkzNzQ3NzkxNDQ2KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBvbGljeWRlc2Nfc2V0R2xvYmFsUHJveHkgKDYzODc0OTc0NjY2NjAxNTQ5MzEpIC0tPgorICAgIDxza2lwIC8+CiAgIDxzdHJpbmctYXJyYXkgbmFtZT0icGhvbmVUeXBlcyI+CiAgICAgPGl0ZW0gbXNnaWQ9Ijg5MDEwOTgzMzY2NTg3MTAzNTkiPiJUaHVpcyI8L2l0ZW0+CiAgICAgPGl0ZW0gbXNnaWQ9Ijg2OTkyMzY1MDUyNzEzNjYxNSI+Ik1vYmllbCI8L2l0ZW0+CkBAIC01MjksMTAgKzUzMyw5IEBACiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlV29yayIgbXNnaWQ9IjI5MjY4ODcwNTA1MzYzODcyIj4iV2VyayI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVPdGhlciIgbXNnaWQ9IjM5NTE3ODExMzE1NzAxMjQwODIiPiJPdmVyaWciPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlQ3VzdG9tIiBtc2dpZD0iMjI1NTIzNDE1MzcyMDg4MzIyIj4iQWFuZ2VwYXN0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iY29udGFjdF9zdGF0dXNfdXBkYXRlX2F0dHJpYnV0aW9uIiBtc2dpZD0iNTExMjU4OTg4NjA5NDQwMjc5NSI+InZpYSA8eGxpZmY6ZyBpZD0iU09VUkNFIj4lMSRzPC94bGlmZjpnPiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbl93aXRoX2RhdGUiIG1zZ2lkPSI1OTQ1Mzg2Mzc2MzY5OTc5OTA5Ij4iPHhsaWZmOmcgaWQ9IkRBVEUiPiUxJHM8L3hsaWZmOmc+IHZpYSA8eGxpZmY6ZyBpZD0iU09VUkNFIj4lMiRzPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bpbl9jb2RlIiBtc2dpZD0iMzczMTQ4ODgyNzIxODg3NjExNSI+IlBJTi1jb2RlIGludm9lcmVuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGFzc3dvcmRfY29kZSIgbXNnaWQ9IjkxMzgxNTgzNDQ4MTMyMTM3NTQiPiJWb2VyIGhldCB3YWNodHdvb3JkIGluIG9tIHRlIG9udGdyZW5kZWxlbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bpbl9wYXNzd29yZF9jb2RlIiBtc2dpZD0iNjM4MzQ3MDc1NjI1NDkxNTE0Ij4iVm9lciBkZSBQSU4tY29kZSBpbiBvbSB0ZSBvbnRncmVuZGVsZW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF93cm9uZ19waW5fY29kZSIgbXNnaWQ9IjEyOTU5ODQxMTQzMzgxMDc3MTgiPiJPbmp1aXN0ZSBQSU4tY29kZSEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9sYWJlbF90ZXh0IiBtc2dpZD0iODYxNzk2NDYxMDI4Mjk4NDI0Ij4iRHJ1ayBvcCBcJ01lbnVcJyBlbiB2ZXJ2b2xnZW5zIG9wIDAgb20gdGUgb250Z3JlbmRlbGVuLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVtZXJnZW5jeV9jYWxsX2RpYWxvZ19udW1iZXJfZm9yX2Rpc3BsYXkiIG1zZ2lkPSI2OTYxOTIxMDMxOTUwOTA5NzAiPiJBbGFybW51bW1lciI8L3N0cmluZz4KQEAgLTU0NSw2ICs1NDgsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9yZXR1cm5fdG9fY2FsbCIgbXNnaWQ9IjUyNDQyNTk3ODU1MDAwNDAwMjEiPiJUZXJ1ZyBuYWFyIGdlc3ByZWsiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BhdHRlcm5fY29ycmVjdCIgbXNnaWQ9IjkwMzkwMDg2NTAzNjIyNjEyMzciPiJKdWlzdCEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BhdHRlcm5fd3JvbmciIG1zZ2lkPSI0ODE3NTgzMjc5MDUzMTEyMzEyIj4iUHJvYmVlciBoZXQgb3BuaWV1dyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGFzc3dvcmRfd3JvbmciIG1zZ2lkPSI2MjM3NDQzNjU3MzU4MTY4ODE5Ij4iUHJvYmVlciBoZXQgb3BuaWV1dyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGx1Z2dlZF9pbiIgbXNnaWQ9IjYxMzM0Mzg1Mjg0Mjk0NDQzNSI+Ik9wbGFkZW4gKDx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPjx4bGlmZjpnIGlkPSJQRVJDRU5UIj4lJTwveGxpZmY6Zz4pIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9jaGFyZ2VkIiBtc2dpZD0iNDkzODkzMDQ1OTYyMDk4OTk3MiI+Ik9wZ2VsYWRlbi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2JhdHRlcnlfc2hvcnQiIG1zZ2lkPSIzNjE3NTQ5MTc4NjAzMzU0NjU2Ij4iPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+PHhsaWZmOmcgaWQ9IlBFUkNFTlQiPiUlPC94bGlmZjpnPiI8L3N0cmluZz4KQEAgLTU1OSw2ICs1NjMsOCBAQAogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9zaW1fbG9ja2VkX21lc3NhZ2UiIG1zZ2lkPSI4MDY2NjYwMTI5MjA2MDAxMDM5Ij4iU0lNLWthYXJ0IGlzIHZlcmdyZW5kZWxkLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fc2ltX3VubG9ja19wcm9ncmVzc19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjU5NTMyMzIxNDA1Mjg4MTI2NCI+IlNJTS1rYWFydCBvbnRncmVuZGVsZW4uLi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjM1MTQ3NDIxMDYwNjY4Nzc0NzYiPiJVIGhlZWZ0IHV3IG9udGdyZW5kZWxpbmdzcGF0cm9vbiA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiBrZWVyIG9uanVpc3QgZ2V0ZWtlbmQuICJcblxuIlByb2JlZXIgaGV0IG92ZXIgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gc2Vjb25kZW4gb3BuaWV1dy4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9wYXNzd29yZF9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjQ5MDYwMzQzNzY0MjUxNzUzODEiPiJVIGhlZWZ0IHV3IHdhY2h0d29vcmQgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4ga2VlciBvbmp1aXN0IGluZ2V2b2VyZC4gIlxuXG4iUHJvYmVlciBoZXQgb3ZlciA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBzZWNvbmRlbiBvcG5pZXV3LiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX3Bpbl9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjY4Mjc3NDkyMzE0NjUxNDU1OTAiPiJVIGhlZWZ0IHV3IFBJTi1jb2RlIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IGtlZXIgb25qdWlzdCBpbmdldm9lcmQuICJcblxuIlByb2JlZXIgaGV0IG92ZXIgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gc2Vjb25kZW4gb3BuaWV1dy4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2ZhaWxlZF9hdHRlbXB0c19hbG1vc3RfZ2xvZ2luIiBtc2dpZD0iMzM1MTAxMzg0MjMyMDEyNzgyNyI+IlUgaGVlZnQgdXcgb250Z3JlbmRlbGluZ3NwYXRyb29uIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IGtlZXIgb25qdWlzdCBnZXRla2VuZC4gTmEgbm9nIGVlbnMgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gbWlzbHVrdGUgcG9naW5nZW4sIHdvcmR0IHUgZ2V2cmFhZ2Qgb20gdXcgdGVsZWZvb24gdGUgb250Z3JlbmRlbGVuIG1ldCB1dyBHb29nbGUgYWFubWVsZGluZy4iXG5cbiIgUHJvYmVlciBoZXQgb3ZlciA8eGxpZmY6ZyBpZD0iTlVNQkVSXzIiPiVkPC94bGlmZjpnPiBzZWNvbmRlbiBvcG5pZXV3LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX2F0dGVtcHRzX2NvdW50ZG93biIgbXNnaWQ9IjYyNTE0ODAzNDMzOTQzODk2NjUiPiJQcm9iZWVyIGhldCBvdmVyIDx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPiBzZWNvbmRlbiBvcG5pZXV3LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fZm9yZ290X3BhdHRlcm5fYnV0dG9uX3RleHQiIG1zZ2lkPSIyNjI2OTk5NDQ5NjEwNjk1OTMwIj4iUGF0cm9vbiB2ZXJnZXRlbj8iPC9zdHJpbmc+CkBAIC03MDMsMTUgKzcwOSwxNyBAQAogICAgIDxzdHJpbmcgbmFtZT0iZWxhcHNlZF90aW1lX3Nob3J0X2Zvcm1hdF9tbV9zcyIgbXNnaWQ9IjQ0MzE1NTU5NDM4Mjg3MTE0NzMiPiI8eGxpZmY6ZyBpZD0iTUlOVVRFUyI+JTEkMDJkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iU0VDT05EUyI+JTIkMDJkPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVsYXBzZWRfdGltZV9zaG9ydF9mb3JtYXRfaF9tbV9zcyIgbXNnaWQ9IjE4NDYwNzE5OTc2MTY2NTQxMjQiPiI8eGxpZmY6ZyBpZD0iSE9VUlMiPiUxJGQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJNSU5VVEVTIj4lMiQwMmQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJTRUNPTkRTIj4lMyQwMmQ8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0QWxsIiBtc2dpZD0iNjg3NjUxODkyNTg0NDEyOTMzMSI+IkFsbGVzIHNlbGVjdGVyZW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJzZWxlY3RUZXh0IiBtc2dpZD0iMzg4OTE0OTEyMzYyNjg4ODYzNyI+IlRla3N0IHNlbGVjdGVyZW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJzdG9wU2VsZWN0aW5nVGV4dCIgbXNnaWQ9IjQxNTc5MzE0NjM4NzIzMjA5OTYiPiJTdG9wcGVuIG1ldCB0ZWtzdCBzZWxlY3RlcmVuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY3V0IiBtc2dpZD0iMzA5MjU2OTQwODQzODYyNjI2MSI+IktuaXBwZW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjb3B5IiBtc2dpZD0iMjY4MTk0NjIyOTUzMzUxMTk4NyI+IktvcGnDq3JlbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBhc3RlIiBtc2dpZD0iNTYyOTg4MDgzNjgwNTAzNjQzMyI+IlBsYWtrZW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjb3B5VXJsIiBtc2dpZD0iMjUzODIxMTU3OTU5NjA2NzQwMiI+IlVSTCBrb3Bpw6tyZW4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2VsZWN0VGV4dE1vZGUgKDY3Mzg1NTYzNDg4NjEzNDcyNDApIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgdGV4dFNlbGVjdGlvbkNBQlRpdGxlICg1MjM2ODUwMzk0MzcwODIwMzU3KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0iaW5wdXRNZXRob2QiIG1zZ2lkPSIxNjUzNjMwMDYyMzA0NTY3ODc5Ij4iSW52b2VybWV0aG9kZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImFkZFRvRGljdGlvbmFyeSIgbXNnaWQ9Ijg3OTM2MjQ5OTE2ODY5NDg3MDkiPiJcJzx4bGlmZjpnIGlkPSJXT1JEIj4lczwveGxpZmY6Zz5cJyB0b2V2b2VnZW4gYWFuIHdvb3JkZW5ib2VrIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZWRpdFRleHRNZW51VGl0bGUiIG1zZ2lkPSIxNjcyOTg5MTc2OTU4NTgxNDUyIj4iVGVrc3QgYmV3ZXJrZW4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZWRpdFRleHRNZW51VGl0bGUgKDQ5MDkxMzU1NjQ5NDE4MTU0OTQpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJsb3dfaW50ZXJuYWxfc3RvcmFnZV92aWV3X3RpdGxlIiBtc2dpZD0iMTM5OTczMjQwODcwMTY5NzU0NiI+IldlaW5pZyBydWltdGUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb3dfaW50ZXJuYWxfc3RvcmFnZV92aWV3X3RleHQiIG1zZ2lkPSI2MzUxMDY1NDQ2MTYzNzg4MzYiPiJPcHNsYWdydWltdGUgdmFuIHRlbGVmb29uIHJhYWt0IG9wLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9rIiBtc2dpZD0iNTk3MDA2MDQzMDU2MjUyNDkxMCI+Ik9LIjwvc3RyaW5nPgpAQCAtNzE5LDYgKzcyNyw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJ5ZXMiIG1zZ2lkPSI1MzYyOTgyMzAzMzM3OTY5MzEyIj4iT0siPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJubyIgbXNnaWQ9IjUxNDE1MzEwNDQ5MzU1NDE0OTciPiJBbm51bGVyZW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkaWFsb2dfYWxlcnRfdGl0bGUiIG1zZ2lkPSIyMDQ5NjU4NzA4NjA5MDQzMTAzIj4iTGV0IG9wIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9hZGluZyIgbXNnaWQ9IjE3NjA3MjQ5OTg5MjgyNTUyNTAiPiJMYWRlbi4uLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcGl0YWxfb24iIG1zZ2lkPSIxNTQ0NjgyNzU1NTE0NDk0Mjk4Ij4iQUFOIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FwaXRhbF9vZmYiIG1zZ2lkPSI2ODE1ODcwMzg2OTcyODA1ODMyIj4iVUlUIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0id2hpY2hBcHBsaWNhdGlvbiIgbXNnaWQ9IjQ1MzMxODU5NDcwNjQ3NzMzODYiPiJBY3RpZSB2b2x0b29pZW4gbWV0Ijwvc3RyaW5nPgpAQCAtODUzLDEzICs4NjIsMTcgQEAKICAgICA8c3RyaW5nIG5hbWU9ImwydHBfaXBzZWNfcHNrX3Zwbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM5NDUwNDM1NjQwMDgzMDMyMzkiPiJWb29yYWYgZ2VkZWVsZGUgc2xldXRlbCBvcCBiYXNpcyB2YW4gTDJUUC9JUFNlYyBWUE4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsMnRwX2lwc2VjX2NydF92cG5fZGVzY3JpcHRpb24iIG1zZ2lkPSI1MzgyNzE0MDczMTAzNjUzNTc3Ij4iQ2VydGlmaWNhYXQgb3AgYmFzaXMgdmFuIEwyVFAvSVBTZWMgVlBOIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXBsb2FkX2ZpbGUiIG1zZ2lkPSIyODk3OTU3MTcyMzY2NzMwNDE2Ij4iQmVzdGFuZCBraWV6ZW4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJub19maWxlX2Nob3NlbiIgbXNnaWQ9IjYzNjM2NDg1NjIxNzA3NTk0NjUiPiJHZWVuIGJlc3RhbmQgZ2VzZWxlY3RlZXJkIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icmVzZXQiIG1zZ2lkPSIyNDQ4MTY4MDgwOTY0MjA5OTA4Ij4iT3BuaWV1dyBpbnN0ZWxsZW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzdWJtaXQiIG1zZ2lkPSIxNjAyMzM1NTcyMDg5OTExOTQxIj4iVmVyemVuZGVuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZGVzY3JpcHRpb25fc3RhciIgbXNnaWQ9IjI2NTQzMTk4NzQ5MDg1NzYxMzMiPiJmYXZvcmlldCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcl9tb2RlX2Rpc2FibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iMzE2NDc2ODIxMjAwMzg2NDMxNiI+IkF1dG9tb2R1cyBpbmdlc2NoYWtlbGQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXJfbW9kZV9kaXNhYmxlX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iNjY4NjYzNjI2NzIxNjc1NjE0Ij4iU2VsZWN0ZWVyIGRpdCBvbSBkZSBhdXRvbW9kdXMgYWYgdGUgc2x1aXRlbi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0ZXRoZXJlZF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSIzMTQ2Njk0MjM0Mzk4MjAyNjAxIj4iVGV0aGVyaW5nIG9mIGhvdHNwb3QgYWN0aWVmIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGV0aGVyZWRfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIzMDY3MTA4MzIzOTAzMDQ4OTI3Ij4iQWFucmFrZW4gb20gdGUgY29uZmlndXJlcmVuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iYmFja19idXR0b25fbGFiZWwiIG1zZ2lkPSIyMzAwNDcwMDA0NTAzMzQzNDM5Ij4iVm9yaWdlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibmV4dF9idXR0b25fbGFiZWwiIG1zZ2lkPSIxMDgwNTU1MTA0Njc3OTkyNDA4Ij4iVm9sZ2VuZGUiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2tpcF9idXR0b25fbGFiZWwgKDEyNzUzNjIyOTk0NzE2MzE4MTkpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZV93YXJuaW5nX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjQ4OTA4OTQyNjc0NTQ4NjcyNzYiPiJIb29nIG1vYmllbCBnZWdldmVuc2dlYnJ1aWsiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZV93YXJuaW5nX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMjYwOTczNDc2Mzg0NTcwNTcwOCI+IlJhYWsgYWFuIHZvb3IgbWVlciBpbmZvcm1hdGllIG92ZXIgbW9iaWVsIGdlZ2V2ZW5zZ2VicnVpayI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlZF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI2MjY5NTQxODk3NzI5NzgxMzMyIj4iTW9iaWVsZSBnZWdldmVuc2xpbWlldCBvdmVyc2NocmVkZW4iPC9zdHJpbmc+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXBsL3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1wbC9zdHJpbmdzLnhtbAppbmRleCA3MGMzMTcwLi4yOGJhNzU1IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXBsL3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtcGwvc3RyaW5ncy54bWwKQEAgLTQzNiw2ICs0MzYsMTAgQEAKICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfZm9yY2VMb2NrIiBtc2dpZD0iMjgxOTg2ODY2NDk0NjA4OTc0MCI+IktvbnRyb2x1amUsIGtpZWR5IHVyesSFZHplbmllIGplc3QgYmxva293YW5lLCB3eW1hZ2FqxIVjIHBvbm93bmVnbyB3cHJvd2FkemVuaWEgaGFzxYJhLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl93aXBlRGF0YSIgbXNnaWQ9IjM5MTA1NDU0NDY3NTg2Mzk3MTMiPiJVc3XFhCB3c3p5c3RraWUgZGFuZSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfd2lwZURhdGEiIG1zZ2lkPSIyMzE0MDYwOTMzNzk2Mzk2MjA1Ij4iV3lrb251amUgcmVzZXQgZmFicnljem55LCB1c3V3YWrEhWMgd3N6eXN0a2llIGRhbmUgdcW8eXRrb3duaWthIGJleiDFvGFkbmVnbyBwb3R3aWVyZHplbmlhLiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwb2xpY3lsYWJfc2V0R2xvYmFsUHJveHkgKDI3ODQ4MjgyOTM3NDc3OTE0NDYpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcG9saWN5ZGVzY19zZXRHbG9iYWxQcm94eSAoNjM4NzQ5NzQ2NjY2MDE1NDkzMSkgLS0+CisgICAgPHNraXAgLz4KICAgPHN0cmluZy1hcnJheSBuYW1lPSJwaG9uZVR5cGVzIj4KICAgICA8aXRlbSBtc2dpZD0iODkwMTA5ODMzNjY1ODcxMDM1OSI+IkRvbSI8L2l0ZW0+CiAgICAgPGl0ZW0gbXNnaWQ9Ijg2OTkyMzY1MDUyNzEzNjYxNSI+IktvbcOzcmthIjwvaXRlbT4KQEAgLTUyOSwxMCArNTMzLDkgQEAKICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVXb3JrIiBtc2dpZD0iMjkyNjg4NzA1MDUzNjM4NzIiPiJTxYJ1xbxib3d5Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZU90aGVyIiBtc2dpZD0iMzk1MTc4MTEzMTU3MDEyNDA4MiI+IklubnkiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlQ3VzdG9tIiBtc2dpZD0iMjI1NTIzNDE1MzcyMDg4MzIyIj4iTmllc3RhbmRhcmRvd3kiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJjb250YWN0X3N0YXR1c191cGRhdGVfYXR0cmlidXRpb24iIG1zZ2lkPSI1MTEyNTg5ODg2MDk0NDAyNzk1Ij4icHJ6ZXogPHhsaWZmOmcgaWQ9IlNPVVJDRSI+JTEkczwveGxpZmY6Zz4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJjb250YWN0X3N0YXR1c191cGRhdGVfYXR0cmlidXRpb25fd2l0aF9kYXRlIiBtc2dpZD0iNTk0NTM4NjM3NjM2OTk3OTkwOSI+Ijx4bGlmZjpnIGlkPSJEQVRFIj4lMSRzPC94bGlmZjpnPiBwcnpleiA8eGxpZmY6ZyBpZD0iU09VUkNFIj4lMiRzPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bpbl9jb2RlIiBtc2dpZD0iMzczMTQ4ODgyNzIxODg3NjExNSI+Ildwcm93YWTFuiBrb2QgUElOIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGFzc3dvcmRfY29kZSIgbXNnaWQ9IjkxMzgxNTgzNDQ4MTMyMTM3NTQiPiJXcHJvd2FkxbogaGFzxYJvLCBhYnkgb2RibG9rb3dhxIciPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9waW5fcGFzc3dvcmRfY29kZSIgbXNnaWQ9IjYzODM0NzA3NTYyNTQ5MTUxNCI+Ildwcm93YWTFuiBrb2QgUElOLCBhYnkgb2RibG9rb3dhxIciPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF93cm9uZ19waW5fY29kZSIgbXNnaWQ9IjEyOTU5ODQxMTQzMzgxMDc3MTgiPiJCxYLEmWRueSBrb2QgUElOISI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX2xhYmVsX3RleHQiIG1zZ2lkPSI4NjE3OTY0NjEwMjgyOTg0MjQiPiJBYnkgb2RibG9rb3dhxIcsIG5hY2nFm25paiBNZW51LCBhIG5hc3TEmXBuaWUgMC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJlbWVyZ2VuY3lfY2FsbF9kaWFsb2dfbnVtYmVyX2Zvcl9kaXNwbGF5IiBtc2dpZD0iNjk2MTkyMTAzMTk1MDkwOTcwIj4iTnVtZXIgYWxhcm1vd3kiPC9zdHJpbmc+CkBAIC01NDUsNiArNTQ4LDcgQEAKICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcmV0dXJuX3RvX2NhbGwiIG1zZ2lkPSI1MjQ0MjU5Nzg1NTAwMDQwMDIxIj4iUG93csOzdCBkbyBwb8WCxIVjemVuaWEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BhdHRlcm5fY29ycmVjdCIgbXNnaWQ9IjkwMzkwMDg2NTAzNjIyNjEyMzciPiJQb3ByYXduaWUhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXR0ZXJuX3dyb25nIiBtc2dpZD0iNDgxNzU4MzI3OTA1MzExMjMxMiI+Ik5pZXN0ZXR5LCBzcHLDs2J1aiBwb25vd25pZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGFzc3dvcmRfd3JvbmciIG1zZ2lkPSI2MjM3NDQzNjU3MzU4MTY4ODE5Ij4iU3Byw7NidWogcG9ub3duaWUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BsdWdnZWRfaW4iIG1zZ2lkPSI2MTMzNDM4NTI4NDI5NDQ0MzUiPiLFgWFkb3dhbmllICg8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz48eGxpZmY6ZyBpZD0iUEVSQ0VOVCI+JSU8L3hsaWZmOmc+KSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fY2hhcmdlZCIgbXNnaWQ9IjQ5Mzg5MzA0NTk2MjA5ODk5NzIiPiJOYcWCYWRvd2FueS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2JhdHRlcnlfc2hvcnQiIG1zZ2lkPSIzNjE3NTQ5MTc4NjAzMzU0NjU2Ij4iPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+PHhsaWZmOmcgaWQ9IlBFUkNFTlQiPiUlPC94bGlmZjpnPiI8L3N0cmluZz4KQEAgLTU1OSw2ICs1NjMsOCBAQAogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9zaW1fbG9ja2VkX21lc3NhZ2UiIG1zZ2lkPSI4MDY2NjYwMTI5MjA2MDAxMDM5Ij4iS2FydGEgU0lNIGplc3QgemFibG9rb3dhbmEuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9zaW1fdW5sb2NrX3Byb2dyZXNzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNTk1MzIzMjE0MDUyODgxMjY0Ij4iT2RibG9rb3d5d2FuaWUga2FydHkgU0lNLi4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSIzNTE0NzQyMTA2MDY2ODc3NDc2Ij4iV3rDs3Igb2RibG9rb3dhbmlhIHpvc3RhxYIgbmllcHJhd2lkxYJvd28gbmFyeXNvd2FueSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiByYXp5LiAiXG5cbiJTcHLDs2J1aiBwb25vd25pZSB6YSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBzZWt1bmQuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfcGFzc3dvcmRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI0OTA2MDM0Mzc2NDI1MTc1MzgxIj4iSGFzxYJvIHpvc3RhxYJvIG5pZXByYXdpZMWCb3dvIHdwcm93YWR6b25lIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IHJhenkuICJcblxuIlNwcsOzYnVqIHBvbm93bmllIHphIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IHMuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfcGluX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNjgyNzc0OTIzMTQ2NTE0NTU5MCI+Ik5pZXBvcHJhd25pZSB3cHJvd2Fkem9ubyBrb2QgUElOIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IHJhenkuICJcblxuIlNwcsOzYnVqIHBvbm93bmllIHphIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IHMuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9mYWlsZWRfYXR0ZW1wdHNfYWxtb3N0X2dsb2dpbiIgbXNnaWQ9IjMzNTEwMTM4NDIzMjAxMjc4MjciPiJXesOzciBvZGJsb2tvd2FuaWEgem9zdGHFgiBuYXJ5c293YW55IG5pZXByYXdpZMWCb3dvIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IHJhenkuIFBvIGtvbGVqbnljaCA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBuaWV1ZGFueWNoIHByw7NiYWNoIHRlbGVmb24gdHJ6ZWJhIGLEmWR6aWUgb2RibG9rb3dhxIcgcHJ6ZXogemFsb2dvd2FuaWUgbmEga29uY2llIEdvb2dsZS4iXG5cbiIgU3Byw7NidWogcG9ub3duaWUgemEgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8yIj4lZDwveGxpZmY6Zz4gc2VrdW5kLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX2F0dGVtcHRzX2NvdW50ZG93biIgbXNnaWQ9IjYyNTE0ODAzNDMzOTQzODk2NjUiPiJTcHLDs2J1aiBwb25vd25pZSB6YSA8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz4gc2VrdW5kLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fZm9yZ290X3BhdHRlcm5fYnV0dG9uX3RleHQiIG1zZ2lkPSIyNjI2OTk5NDQ5NjEwNjk1OTMwIj4iWmFwb21uaWHFgmXFmyB3em9ydT8iPC9zdHJpbmc+CkBAIC03MDMsMTUgKzcwOSwxNyBAQAogICAgIDxzdHJpbmcgbmFtZT0iZWxhcHNlZF90aW1lX3Nob3J0X2Zvcm1hdF9tbV9zcyIgbXNnaWQ9IjQ0MzE1NTU5NDM4Mjg3MTE0NzMiPiI8eGxpZmY6ZyBpZD0iTUlOVVRFUyI+JTEkMDJkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iU0VDT05EUyI+JTIkMDJkPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVsYXBzZWRfdGltZV9zaG9ydF9mb3JtYXRfaF9tbV9zcyIgbXNnaWQ9IjE4NDYwNzE5OTc2MTY2NTQxMjQiPiI8eGxpZmY6ZyBpZD0iSE9VUlMiPiUxJGQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJNSU5VVEVTIj4lMiQwMmQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJTRUNPTkRTIj4lMyQwMmQ8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0QWxsIiBtc2dpZD0iNjg3NjUxODkyNTg0NDEyOTMzMSI+Ilphem5hY3ogd3N6eXN0a28iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJzZWxlY3RUZXh0IiBtc2dpZD0iMzg4OTE0OTEyMzYyNjg4ODYzNyI+Ilphem5hY3ogdGVrc3QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJzdG9wU2VsZWN0aW5nVGV4dCIgbXNnaWQ9IjQxNTc5MzE0NjM4NzIzMjA5OTYiPiJaYXRyenltYWogd3liaWVyYW5pZSB0ZWtzdHUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjdXQiIG1zZ2lkPSIzMDkyNTY5NDA4NDM4NjI2MjYxIj4iV3l0bmlqIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY29weSIgbXNnaWQ9IjI2ODE5NDYyMjk1MzM1MTE5ODciPiJLb3BpdWoiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwYXN0ZSIgbXNnaWQ9IjU2Mjk4ODA4MzY4MDUwMzY0MzMiPiJXa2xlaiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNvcHlVcmwiIG1zZ2lkPSIyNTM4MjExNTc5NTk2MDY3NDAyIj4iS29waXVqIGFkcmVzIFVSTCI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzZWxlY3RUZXh0TW9kZSAoNjczODU1NjM0ODg2MTM0NzI0MCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciB0ZXh0U2VsZWN0aW9uQ0FCVGl0bGUgKDUyMzY4NTAzOTQzNzA4MjAzNTcpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJpbnB1dE1ldGhvZCIgbXNnaWQ9IjE2NTM2MzAwNjIzMDQ1Njc4NzkiPiJNZXRvZGEgd3Byb3dhZHphbmlhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iYWRkVG9EaWN0aW9uYXJ5IiBtc2dpZD0iODc5MzYyNDk5MTY4Njk0ODcwOSI+IkRvZGFqIHRlcm1pbiDigJ48eGxpZmY6ZyBpZD0iV09SRCI+JXM8L3hsaWZmOmc+4oCdIGRvIHPFgm93bmlrYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImVkaXRUZXh0TWVudVRpdGxlIiBtc2dpZD0iMTY3Mjk4OTE3Njk1ODU4MTQ1MiI+IkVkeXR1aiB0ZWtzdCI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBlZGl0VGV4dE1lbnVUaXRsZSAoNDkwOTEzNTU2NDk0MTgxNTQ5NCkgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9Imxvd19pbnRlcm5hbF9zdG9yYWdlX3ZpZXdfdGl0bGUiIG1zZ2lkPSIxMzk5NzMyNDA4NzAxNjk3NTQ2Ij4iTWHFgm8gbWllanNjYSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Imxvd19pbnRlcm5hbF9zdG9yYWdlX3ZpZXdfdGV4dCIgbXNnaWQ9IjYzNTEwNjU0NDYxNjM3ODgzNiI+Ik1hbGVqZSBpbG/Fm8SHIGRvc3TEmXBuZWogcGFtacSZY2kgdGVsZWZvbnUuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ib2siIG1zZ2lkPSI1OTcwMDYwNDMwNTYyNTI0OTEwIj4iT0siPC9zdHJpbmc+CkBAIC03MTksNiArNzI3LDcgQEAKICAgICA8c3RyaW5nIG5hbWU9InllcyIgbXNnaWQ9IjUzNjI5ODIzMDMzMzc5NjkzMTIiPiJPSyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im5vIiBtc2dpZD0iNTE0MTUzMTA0NDkzNTU0MTQ5NyI+IkFudWx1aiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRpYWxvZ19hbGVydF90aXRsZSIgbXNnaWQ9IjIwNDk2NTg3MDg2MDkwNDMxMDMiPiJVd2FnYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvYWRpbmciIG1zZ2lkPSIxNzYwNzI0OTk4OTI4MjU1MjUwIj4iV2N6eXR5d2FuaWUuLi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXBpdGFsX29uIiBtc2dpZD0iMTU0NDY4Mjc1NTUxNDQ5NDI5OCI+IlfFgsSFY3oiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXBpdGFsX29mZiIgbXNnaWQ9IjY4MTU4NzAzODY5NzI4MDU4MzIiPiJXecWCxIVjeiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9IndoaWNoQXBwbGljYXRpb24iIG1zZ2lkPSI0NTMzMTg1OTQ3MDY0NzczMzg2Ij4iWmFrb8WEY3ogY3p5bm5vxZvEhyBrb3J6eXN0YWrEhWMgeiI8L3N0cmluZz4KQEAgLTg1MywxMyArODYyLDE3IEBACiAgICAgPHN0cmluZyBuYW1lPSJsMnRwX2lwc2VjX3Bza192cG5fZGVzY3JpcHRpb24iIG1zZ2lkPSIzOTQ1MDQzNTY0MDA4MzAzMjM5Ij4iU2llxIcgVlBOIEwyVFAvSVBTZWMgeiBrbHVjemVtIFBTSyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImwydHBfaXBzZWNfY3J0X3Zwbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjUzODI3MTQwNzMxMDM2NTM1NzciPiJTaWXEhyBWUE4gTDJUUC9JUFNlYyB6IGNlcnR5ZmlrYXRlbSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVwbG9hZF9maWxlIiBtc2dpZD0iMjg5Nzk1NzE3MjM2NjczMDQxNiI+Ild5YmllcnogcGxpayI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5vX2ZpbGVfY2hvc2VuIiBtc2dpZD0iNjM2MzY0ODU2MjE3MDc1OTQ2NSI+Ik5pZSB3eWJyYW5vIHBsaWt1Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icmVzZXQiIG1zZ2lkPSIyNDQ4MTY4MDgwOTY0MjA5OTA4Ij4iUmVzZXR1aiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InN1Ym1pdCIgbXNnaWQ9IjE2MDIzMzU1NzIwODk5MTE5NDEiPiJQcnplxZtsaWoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJkZXNjcmlwdGlvbl9zdGFyIiBtc2dpZD0iMjY1NDMxOTg3NDkwODU3NjEzMyI+InVsdWJpb25lIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FyX21vZGVfZGlzYWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSIzMTY0NzY4MjEyMDAzODY0MzE2Ij4iVHJ5YiBzYW1vY2hvZG93eSB3xYLEhWN6b255Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FyX21vZGVfZGlzYWJsZV9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjY2ODY2MzYyNjcyMTY3NTYxNCI+Ild5YmllcnosIGFieSB6YWtvxYRjennEhyB0cnliIHNhbW9jaG9kb3d5LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRldGhlcmVkX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjMxNDY2OTQyMzQzOTgyMDI2MDEiPiJKZXN0IGFrdHl3bmUgcG93acSFemFuaWUgbHViIHB1bmt0IGRvc3TEmXB1Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGV0aGVyZWRfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIzMDY3MTA4MzIzOTAzMDQ4OTI3Ij4iRG90a25paiwgYWJ5IHNrb25maWd1cm93YcSHIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iYmFja19idXR0b25fbGFiZWwiIG1zZ2lkPSIyMzAwNDcwMDA0NTAzMzQzNDM5Ij4iV3LDs8SHIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibmV4dF9idXR0b25fbGFiZWwiIG1zZ2lkPSIxMDgwNTU1MTA0Njc3OTkyNDA4Ij4iRGFsZWoiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2tpcF9idXR0b25fbGFiZWwgKDEyNzUzNjIyOTk0NzE2MzE4MTkpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZV93YXJuaW5nX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjQ4OTA4OTQyNjc0NTQ4NjcyNzYiPiJXeXNva2kgcG96aW9tIHXFvHljaWEgZGFueWNoIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVfd2FybmluZ19ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjI2MDk3MzQ3NjM4NDU3MDU3MDgiPiJEb3RrbmlqLCBhYnkgem9iYWN6ecSHIHN0YXR5c3R5a2kgcHJ6ZXN5xYJ1IGRhbnljaCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlZF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI2MjY5NTQxODk3NzI5NzgxMzMyIj4iUHJ6ZWtyb2N6b25vIGxpbWl0IGRhbnljaCI8L3N0cmluZz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtcHQtclBUL3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1wdC1yUFQvc3RyaW5ncy54bWwKaW5kZXggOWE4YzZlOS4uMGNiYzdjMSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1wdC1yUFQvc3RyaW5ncy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1wdC1yUFQvc3RyaW5ncy54bWwKQEAgLTQzNiw2ICs0MzYsMTAgQEAKICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfZm9yY2VMb2NrIiBtc2dpZD0iMjgxOTg2ODY2NDk0NjA4OTc0MCI+IkNvbnRyb2xlIHF1YW5kbyBvIGRpc3Bvc2l0aXZvIMOpIGJsb3F1ZWFkbywgc2VuZG8gbmVjZXNzw6FyaW8gcmVpbnRyb2R1emlyIGEgcmVzcGVjdGl2YSBwYWxhdnJhLXBhc3NlLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl93aXBlRGF0YSIgbXNnaWQ9IjM5MTA1NDU0NDY3NTg2Mzk3MTMiPiJBcGFnYXIgdG9kb3Mgb3MgZGFkb3MiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3dpcGVEYXRhIiBtc2dpZD0iMjMxNDA2MDkzMzc5NjM5NjIwNSI+IkVmZWN0dWUgdW1hIHJlcG9zacOnw6NvIGRlIGbDoWJyaWNhLCBlbGltaW5hbmRvIHRvZG9zIG9zIGRhZG9zIHNlbSBxdWFscXVlciBjb25maXJtYcOnw6NvLiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwb2xpY3lsYWJfc2V0R2xvYmFsUHJveHkgKDI3ODQ4MjgyOTM3NDc3OTE0NDYpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcG9saWN5ZGVzY19zZXRHbG9iYWxQcm94eSAoNjM4NzQ5NzQ2NjY2MDE1NDkzMSkgLS0+CisgICAgPHNraXAgLz4KICAgPHN0cmluZy1hcnJheSBuYW1lPSJwaG9uZVR5cGVzIj4KICAgICA8aXRlbSBtc2dpZD0iODkwMTA5ODMzNjY1ODcxMDM1OSI+IlJlc2lkw6puY2lhIjwvaXRlbT4KICAgICA8aXRlbSBtc2dpZD0iODY5OTIzNjUwNTI3MTM2NjE1Ij4iTcOzdmVsIjwvaXRlbT4KQEAgLTUyOSwxMCArNTMzLDkgQEAKICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVXb3JrIiBtc2dpZD0iMjkyNjg4NzA1MDUzNjM4NzIiPiJFbXByZWdvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZU90aGVyIiBtc2dpZD0iMzk1MTc4MTEzMTU3MDEyNDA4MiI+Ik91dHJvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZUN1c3RvbSIgbXNnaWQ9IjIyNTUyMzQxNTM3MjA4ODMyMiI+IlBlcnNvbmFsaXphZG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJjb250YWN0X3N0YXR1c191cGRhdGVfYXR0cmlidXRpb24iIG1zZ2lkPSI1MTEyNTg5ODg2MDk0NDAyNzk1Ij4iYXRyYXbDqXMgZG8gPHhsaWZmOmcgaWQ9IlNPVVJDRSI+JTEkczwveGxpZmY6Zz4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJjb250YWN0X3N0YXR1c191cGRhdGVfYXR0cmlidXRpb25fd2l0aF9kYXRlIiBtc2dpZD0iNTk0NTM4NjM3NjM2OTk3OTkwOSI+Ijx4bGlmZjpnIGlkPSJEQVRFIj4lMSRzPC94bGlmZjpnPiBhdHJhdsOpcyBkZSA8eGxpZmY6ZyBpZD0iU09VUkNFIj4lMiRzPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bpbl9jb2RlIiBtc2dpZD0iMzczMTQ4ODgyNzIxODg3NjExNSI+IkludHJvZHV6aXIgY8OzZGlnbyBQSU4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9wYXNzd29yZF9jb2RlIiBtc2dpZD0iOTEzODE1ODM0NDgxMzIxMzc1NCI+IkludHJvZHV6YSBhIHBhbGF2cmEtcGFzc2UgcGFyYSBkZXNibG9xdWVhciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bpbl9wYXNzd29yZF9jb2RlIiBtc2dpZD0iNjM4MzQ3MDc1NjI1NDkxNTE0Ij4iSW50cm9kdXphIG8gUElOIHBhcmEgZGVzYmxvcXVlYXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF93cm9uZ19waW5fY29kZSIgbXNnaWQ9IjEyOTU5ODQxMTQzMzgxMDc3MTgiPiJDw7NkaWdvIFBJTiBpbmNvcnJlY3RvISI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX2xhYmVsX3RleHQiIG1zZ2lkPSI4NjE3OTY0NjEwMjgyOTg0MjQiPiJQYXJhIGRlc2Jsb3F1ZWFyLCBwcmltYSBNZW51IGUsIGVtIHNlZ3VpZGEsIDAuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZW1lcmdlbmN5X2NhbGxfZGlhbG9nX251bWJlcl9mb3JfZGlzcGxheSIgbXNnaWQ9IjY5NjE5MjEwMzE5NTA5MDk3MCI+Ik7Dum1lcm8gZGUgZW1lcmfDqm5jaWEiPC9zdHJpbmc+CkBAIC01NDUsNiArNTQ4LDcgQEAKICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcmV0dXJuX3RvX2NhbGwiIG1zZ2lkPSI1MjQ0MjU5Nzg1NTAwMDQwMDIxIj4iUmVncmVzc2FyIMOgIGNoYW1hZGEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BhdHRlcm5fY29ycmVjdCIgbXNnaWQ9IjkwMzkwMDg2NTAzNjIyNjEyMzciPiJDb3JyZWN0byEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BhdHRlcm5fd3JvbmciIG1zZ2lkPSI0ODE3NTgzMjc5MDUzMTEyMzEyIj4iTGFtZW50YW1vcywgdGVudGUgbm92YW1lbnRlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXNzd29yZF93cm9uZyIgbXNnaWQ9IjYyMzc0NDM2NTczNTgxNjg4MTkiPiJMYW1lbnRhbW9zLCB0ZW50ZSBub3ZhbWVudGUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BsdWdnZWRfaW4iIG1zZ2lkPSI2MTMzNDM4NTI4NDI5NDQ0MzUiPiJBIGNhcnJlZ2FyICg8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz48eGxpZmY6ZyBpZD0iUEVSQ0VOVCI+JSU8L3hsaWZmOmc+KSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fY2hhcmdlZCIgbXNnaWQ9IjQ5Mzg5MzA0NTk2MjA5ODk5NzIiPiJDYXJyZWdhZG8uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9iYXR0ZXJ5X3Nob3J0IiBtc2dpZD0iMzYxNzU0OTE3ODYwMzM1NDY1NiI+Ijx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPjx4bGlmZjpnIGlkPSJQRVJDRU5UIj4lJTwveGxpZmY6Zz4iPC9zdHJpbmc+CkBAIC01NTksNiArNTYzLDggQEAKICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fc2ltX2xvY2tlZF9tZXNzYWdlIiBtc2dpZD0iODA2NjY2MDEyOTIwNjAwMTAzOSI+Ik8gY2FydMOjbyBTSU0gZXN0w6EgYmxvcXVlYWRvLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fc2ltX3VubG9ja19wcm9ncmVzc19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjU5NTMyMzIxNDA1Mjg4MTI2NCI+IkEgZGVzYmxvcXVlYXIgY2FydMOjbyBTSU0uLi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjM1MTQ3NDIxMDYwNjY4Nzc0NzYiPiJFZmVjdHVvdSBpbmNvcnJlY3RhbWVudGUgbyBzZXUgcGFkcsOjbyBkZSBkZXNibG9xdWVpbyA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiB2ZXplcy4gIlxuXG4iVGVudGUgbm92YW1lbnRlIGRlbnRybyBkZSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBzZWd1bmRvcy4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9wYXNzd29yZF9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjQ5MDYwMzQzNzY0MjUxNzUzODEiPiJJbnRyb2R1eml1IGluY29ycmVjdGFtZW50ZSBhIHBhbGF2cmEtcGFzc2UgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4gdmV6ZXMuICJcblxuIlRlbnRlIG5vdmFtZW50ZSBkZW50cm8gZGUgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gc2VndW5kb3MuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfcGluX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNjgyNzc0OTIzMTQ2NTE0NTU5MCI+IkludHJvZHV6aXUgaW5jb3JyZWN0YW1lbnRlIG8gUElOIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IHZlemVzLiAiXG5cbiJUZW50ZSBub3ZhbWVudGUgZGVudHJvIGRlIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IHNlZ3VuZG9zLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fZmFpbGVkX2F0dGVtcHRzX2FsbW9zdF9nbG9naW4iIG1zZ2lkPSIzMzUxMDEzODQyMzIwMTI3ODI3Ij4iRWZlY3R1b3UgaW5jb3JyZWN0YW1lbnRlIG8gc2V1IHBhZHLDo28gZGUgZGVzYmxvcXVlaW8gPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4gdmV6ZXMuIEFww7NzIG91dHJhcyA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiB0ZW50YXRpdmFzIHNlbSBzdWNlc3NvLCBzZXItbGhlLcOhIHBlZGlkbyBwYXJhIGRlc2Jsb3F1ZWFyIG8gdGVsZWZvbmUgdXRpbGl6YW5kbyBvIHNldSBpbsOtY2lvIGRlIHNlc3PDo28gbm8gR29vZ2xlLiJcblxuIiBUZW50ZSBub3ZhbWVudGUgZGVudHJvIGRlIDx4bGlmZjpnIGlkPSJOVU1CRVJfMiI+JWQ8L3hsaWZmOmc+IHNlZ3VuZG9zLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX2F0dGVtcHRzX2NvdW50ZG93biIgbXNnaWQ9IjYyNTE0ODAzNDMzOTQzODk2NjUiPiJUZW50ZSBub3ZhbWVudGUgZGVudHJvIGRlIDx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPiBzZWd1bmRvcy4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2ZvcmdvdF9wYXR0ZXJuX2J1dHRvbl90ZXh0IiBtc2dpZD0iMjYyNjk5OTQ0OTYxMDY5NTkzMCI+IkVzcXVlY2V1LXNlIGRvIHBhZHLDo28/Ijwvc3RyaW5nPgpAQCAtNzAzLDE1ICs3MDksMTcgQEAKICAgICA8c3RyaW5nIG5hbWU9ImVsYXBzZWRfdGltZV9zaG9ydF9mb3JtYXRfbW1fc3MiIG1zZ2lkPSI0NDMxNTU1OTQzODI4NzExNDczIj4iPHhsaWZmOmcgaWQ9Ik1JTlVURVMiPiUxJDAyZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9IlNFQ09ORFMiPiUyJDAyZDwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJlbGFwc2VkX3RpbWVfc2hvcnRfZm9ybWF0X2hfbW1fc3MiIG1zZ2lkPSIxODQ2MDcxOTk3NjE2NjU0MTI0Ij4iPHhsaWZmOmcgaWQ9IkhPVVJTIj4lMSRkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iTUlOVVRFUyI+JTIkMDJkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iU0VDT05EUyI+JTMkMDJkPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNlbGVjdEFsbCIgbXNnaWQ9IjY4NzY1MTg5MjU4NDQxMjkzMzEiPiJTZWxlY2Npb25hciB0dWRvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0VGV4dCIgbXNnaWQ9IjM4ODkxNDkxMjM2MjY4ODg2MzciPiJTZWxlY2Npb25hciB0ZXh0byI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InN0b3BTZWxlY3RpbmdUZXh0IiBtc2dpZD0iNDE1NzkzMTQ2Mzg3MjMyMDk5NiI+IlBhcmFyIHNlbGVjw6fDo28gZGUgdGV4dG8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjdXQiIG1zZ2lkPSIzMDkyNTY5NDA4NDM4NjI2MjYxIj4iQ29ydGFyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY29weSIgbXNnaWQ9IjI2ODE5NDYyMjk1MzM1MTE5ODciPiJDb3BpYXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwYXN0ZSIgbXNnaWQ9IjU2Mjk4ODA4MzY4MDUwMzY0MzMiPiJDb2xhciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNvcHlVcmwiIG1zZ2lkPSIyNTM4MjExNTc5NTk2MDY3NDAyIj4iQ29waWFyIFVSTCI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzZWxlY3RUZXh0TW9kZSAoNjczODU1NjM0ODg2MTM0NzI0MCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciB0ZXh0U2VsZWN0aW9uQ0FCVGl0bGUgKDUyMzY4NTAzOTQzNzA4MjAzNTcpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJpbnB1dE1ldGhvZCIgbXNnaWQ9IjE2NTM2MzAwNjIzMDQ1Njc4NzkiPiJNw6l0b2RvIGRlIGVudHJhZGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJhZGRUb0RpY3Rpb25hcnkiIG1zZ2lkPSI4NzkzNjI0OTkxNjg2OTQ4NzA5Ij4iQWRpY2lvbmFyIFwiPHhsaWZmOmcgaWQ9IldPUkQiPiVzPC94bGlmZjpnPlwiIGFvIGRpY2lvbsOhcmlvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZWRpdFRleHRNZW51VGl0bGUiIG1zZ2lkPSIxNjcyOTg5MTc2OTU4NTgxNDUyIj4iRWRpdGFyIHRleHRvIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGVkaXRUZXh0TWVudVRpdGxlICg0OTA5MTM1NTY0OTQxODE1NDk0KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0ibG93X2ludGVybmFsX3N0b3JhZ2Vfdmlld190aXRsZSIgbXNnaWQ9IjEzOTk3MzI0MDg3MDE2OTc1NDYiPiJQb3VjbyBlc3Bhw6dvIGxpdnJlIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG93X2ludGVybmFsX3N0b3JhZ2Vfdmlld190ZXh0IiBtc2dpZD0iNjM1MTA2NTQ0NjE2Mzc4ODM2Ij4iTyBlc3Bhw6dvIGRlIGFybWF6ZW5hbWVudG8gZG8gdGVsZWZvbmUgZXN0w6EgYSBmaWNhciByZWR1emlkby4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvayIgbXNnaWQ9IjU5NzAwNjA0MzA1NjI1MjQ5MTAiPiJPSyI8L3N0cmluZz4KQEAgLTcxOSw2ICs3MjcsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ieWVzIiBtc2dpZD0iNTM2Mjk4MjMwMzMzNzk2OTMxMiI+Ik9LIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibm8iIG1zZ2lkPSI1MTQxNTMxMDQ0OTM1NTQxNDk3Ij4iQ2FuY2VsYXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkaWFsb2dfYWxlcnRfdGl0bGUiIG1zZ2lkPSIyMDQ5NjU4NzA4NjA5MDQzMTAzIj4iQXRlbsOnw6NvIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9hZGluZyIgbXNnaWQ9IjE3NjA3MjQ5OTg5MjgyNTUyNTAiPiJBIGNhcnJlZ2FyLi4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FwaXRhbF9vbiIgbXNnaWQ9IjE1NDQ2ODI3NTU1MTQ0OTQyOTgiPiJBY3RpdmFkbyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcGl0YWxfb2ZmIiBtc2dpZD0iNjgxNTg3MDM4Njk3MjgwNTgzMiI+IkRlc2FjdGl2YXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ3aGljaEFwcGxpY2F0aW9uIiBtc2dpZD0iNDUzMzE4NTk0NzA2NDc3MzM4NiI+IkNvbmNsdWlyIGFjw6fDo28gdXRpbGl6YW5kbyI8L3N0cmluZz4KQEAgLTg1MywxMyArODYyLDE3IEBACiAgICAgPHN0cmluZyBuYW1lPSJsMnRwX2lwc2VjX3Bza192cG5fZGVzY3JpcHRpb24iIG1zZ2lkPSIzOTQ1MDQzNTY0MDA4MzAzMjM5Ij4iVlBOIEwyVFAvSVBTZWMgYmFzZWFkYSBlbSBjaGF2ZSBwcsOpLSBwYXJ0aWxoYWRhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibDJ0cF9pcHNlY19jcnRfdnBuX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNTM4MjcxNDA3MzEwMzY1MzU3NyI+IlZQTiBMMlRQL0lQU2VjIGJhc2VhZGEgZW0gY2VydGlmaWNhZG8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1cGxvYWRfZmlsZSIgbXNnaWQ9IjI4OTc5NTcxNzIzNjY3MzA0MTYiPiJFc2NvbGhlciBmaWNoZWlybyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5vX2ZpbGVfY2hvc2VuIiBtc2dpZD0iNjM2MzY0ODU2MjE3MDc1OTQ2NSI+Ik7Do28gZm9pIHNlbGVjY2lvbmFkbyBuZW5odW0gZmljaGVpcm8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJyZXNldCIgbXNnaWQ9IjI0NDgxNjgwODA5NjQyMDk5MDgiPiJSZXBvciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InN1Ym1pdCIgbXNnaWQ9IjE2MDIzMzU1NzIwODk5MTE5NDEiPiJFbnZpYXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJkZXNjcmlwdGlvbl9zdGFyIiBtc2dpZD0iMjY1NDMxOTg3NDkwODU3NjEzMyI+ImZhdm9yaXRvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FyX21vZGVfZGlzYWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSIzMTY0NzY4MjEyMDAzODY0MzE2Ij4iTW9kbyBhdXRvbcOzdmVsIGFjdGl2YWRvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FyX21vZGVfZGlzYWJsZV9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjY2ODY2MzYyNjcyMTY3NTYxNCI+IlNlbGVjY2lvbmFyIHBhcmEgc2FpciBkbyBtb2RvIGF1dG9tw7N2ZWwuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGV0aGVyZWRfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iMzE0NjY5NDIzNDM5ODIwMjYwMSI+IkxpZ2HDp8OjbyBwb250byBhIHBvbnRvIG91IGhvdHNwb3QgYWN0aXZvcyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRldGhlcmVkX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMzA2NzEwODMyMzkwMzA0ODkyNyI+IlRvY2FyIHBhcmEgY29uZmlndXJhciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImJhY2tfYnV0dG9uX2xhYmVsIiBtc2dpZD0iMjMwMDQ3MDAwNDUwMzM0MzQzOSI+IkFudGVyaW9yIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibmV4dF9idXR0b25fbGFiZWwiIG1zZ2lkPSIxMDgwNTU1MTA0Njc3OTkyNDA4Ij4iU2VndWludGUiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2tpcF9idXR0b25fbGFiZWwgKDEyNzUzNjIyOTk0NzE2MzE4MTkpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZV93YXJuaW5nX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjQ4OTA4OTQyNjc0NTQ4NjcyNzYiPiJVdGlsaXphw6fDo28gZWxldmFkYSBkZSBkYWRvcyBtw7N2ZWlzIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVfd2FybmluZ19ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjI2MDk3MzQ3NjM4NDU3MDU3MDgiPiJUb3F1ZSBwYXJhIHNhYmVyIG1haXMgc29icmUgYSB1dGlsaXphw6fDo28gZGUgZGFkb3MgbcOzdmVpcyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlZF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI2MjY5NTQxODk3NzI5NzgxMzMyIj4iTGltaXRlIGRlIGRhZG9zIG3Ds3ZlaXMgZXhjZWRpZG8iPC9zdHJpbmc+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXB0L3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1wdC9zdHJpbmdzLnhtbAppbmRleCAyMTE5NTM5Li40ZjIyOWQ3IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXB0L3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtcHQvc3RyaW5ncy54bWwKQEAgLTQzNiw2ICs0MzYsMTAgQEAKICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfZm9yY2VMb2NrIiBtc2dpZD0iMjgxOTg2ODY2NDk0NjA4OTc0MCI+IkNvbnRyb2xhIG8gYmxvcXVlaW8gZG8gYXBhcmVsaG8sIGV4aWdpbmRvIHF1ZSBhIHNlbmhhIHNlamEgZGlnaXRhZGEgbm92YW1lbnRlLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl93aXBlRGF0YSIgbXNnaWQ9IjM5MTA1NDU0NDY3NTg2Mzk3MTMiPiJBcGFnYXIgdG9kb3Mgb3MgZGFkb3MiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3dpcGVEYXRhIiBtc2dpZD0iMjMxNDA2MDkzMzc5NjM5NjIwNSI+IkV4ZWN1dGUgdW1hIHJlZGVmaW5pw6fDo28gZGUgZsOhYnJpY2EsIGV4Y2x1aW5kbyB0b2RvcyBvcyBzZXVzIGRhZG9zIHNlbSBxdWFscXVlciBjb25maXJtYcOnw6NvLiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwb2xpY3lsYWJfc2V0R2xvYmFsUHJveHkgKDI3ODQ4MjgyOTM3NDc3OTE0NDYpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcG9saWN5ZGVzY19zZXRHbG9iYWxQcm94eSAoNjM4NzQ5NzQ2NjY2MDE1NDkzMSkgLS0+CisgICAgPHNraXAgLz4KICAgPHN0cmluZy1hcnJheSBuYW1lPSJwaG9uZVR5cGVzIj4KICAgICA8aXRlbSBtc2dpZD0iODkwMTA5ODMzNjY1ODcxMDM1OSI+IlJlc2lkZW5jaWFsIjwvaXRlbT4KICAgICA8aXRlbSBtc2dpZD0iODY5OTIzNjUwNTI3MTM2NjE1Ij4iQ2VsdWxhciI8L2l0ZW0+CkBAIC01MjksMTAgKzUzMyw5IEBACiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlV29yayIgbXNnaWQ9IjI5MjY4ODcwNTA1MzYzODcyIj4iQ29tZXJjaWFsIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZU90aGVyIiBtc2dpZD0iMzk1MTc4MTEzMTU3MDEyNDA4MiI+Ik91dHJvcyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVDdXN0b20iIG1zZ2lkPSIyMjU1MjM0MTUzNzIwODgzMjIiPiJQZXJzb25hbGl6YWRvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iY29udGFjdF9zdGF0dXNfdXBkYXRlX2F0dHJpYnV0aW9uIiBtc2dpZD0iNTExMjU4OTg4NjA5NDQwMjc5NSI+InBvciBtZWlvIGRlIDx4bGlmZjpnIGlkPSJTT1VSQ0UiPiUxJHM8L3hsaWZmOmc+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iY29udGFjdF9zdGF0dXNfdXBkYXRlX2F0dHJpYnV0aW9uX3dpdGhfZGF0ZSIgbXNnaWQ9IjU5NDUzODYzNzYzNjk5Nzk5MDkiPiI8eGxpZmY6ZyBpZD0iREFURSI+JTEkczwveGxpZmY6Zz4gdmlhIDx4bGlmZjpnIGlkPSJTT1VSQ0UiPiUyJHM8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGluX2NvZGUiIG1zZ2lkPSIzNzMxNDg4ODI3MjE4ODc2MTE1Ij4iRGlnaXRlIG8gY8OzZGlnbyBQSU4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9wYXNzd29yZF9jb2RlIiBtc2dpZD0iOTEzODE1ODM0NDgxMzIxMzc1NCI+IkRpZ2l0ZSBhIHNlbmhhIHBhcmEgZGVzYmxvcXVlYXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9waW5fcGFzc3dvcmRfY29kZSIgbXNnaWQ9IjYzODM0NzA3NTYyNTQ5MTUxNCI+IkRpZ2l0ZSBvIFBJTiBwYXJhIGRlc2Jsb3F1ZWFyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfd3JvbmdfcGluX2NvZGUiIG1zZ2lkPSIxMjk1OTg0MTE0MzM4MTA3NzE4Ij4iQ8OzZGlnbyBQSU4gaW5jb3JyZXRvISI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX2xhYmVsX3RleHQiIG1zZ2lkPSI4NjE3OTY0NjEwMjgyOTg0MjQiPiJQYXJhIGRlc2Jsb3F1ZWFyLCBwcmVzc2lvbmUgTWVudSBlLCBlbSBzZWd1aWRhLCAwLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVtZXJnZW5jeV9jYWxsX2RpYWxvZ19udW1iZXJfZm9yX2Rpc3BsYXkiIG1zZ2lkPSI2OTYxOTIxMDMxOTUwOTA5NzAiPiJOw7ptZXJvIGRlIGVtZXJnw6puY2lhIjwvc3RyaW5nPgpAQCAtNTQ1LDYgKzU0OCw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3JldHVybl90b19jYWxsIiBtc2dpZD0iNTI0NDI1OTc4NTUwMDA0MDAyMSI+IlJldG9ybmFyIMOgIGNoYW1hZGEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BhdHRlcm5fY29ycmVjdCIgbXNnaWQ9IjkwMzkwMDg2NTAzNjIyNjEyMzciPiJDb3JyZXRvISI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGF0dGVybl93cm9uZyIgbXNnaWQ9IjQ4MTc1ODMyNzkwNTMxMTIzMTIiPiJUZW50ZSBub3ZhbWVudGUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Bhc3N3b3JkX3dyb25nIiBtc2dpZD0iNjIzNzQ0MzY1NzM1ODE2ODgxOSI+IlRlbnRlIG5vdmFtZW50ZSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGx1Z2dlZF9pbiIgbXNnaWQ9IjYxMzM0Mzg1Mjg0Mjk0NDQzNSI+IkNhcnJlZ2FuZG8gKDx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPjx4bGlmZjpnIGlkPSJQRVJDRU5UIj4lJTwveGxpZmY6Zz4pIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9jaGFyZ2VkIiBtc2dpZD0iNDkzODkzMDQ1OTYyMDk4OTk3MiI+IkNhcnJlZ2Fkby4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2JhdHRlcnlfc2hvcnQiIG1zZ2lkPSIzNjE3NTQ5MTc4NjAzMzU0NjU2Ij4iPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+PHhsaWZmOmcgaWQ9IlBFUkNFTlQiPiUlPC94bGlmZjpnPiI8L3N0cmluZz4KQEAgLTU1OSw2ICs1NjMsOCBAQAogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9zaW1fbG9ja2VkX21lc3NhZ2UiIG1zZ2lkPSI4MDY2NjYwMTI5MjA2MDAxMDM5Ij4iTyBjYXJ0w6NvIFNJTSBlc3TDoSBibG9xdWVhZG8uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9zaW1fdW5sb2NrX3Byb2dyZXNzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNTk1MzIzMjE0MDUyODgxMjY0Ij4iRGVzYmxvcXVlYW5kbyBvIGNhcnTDo28gU0lN4oCmIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSIzNTE0NzQyMTA2MDY2ODc3NDc2Ij4iVm9jw6ogZGVzZW5ob3UgaW5jb3JyZXRhbWVudGUgbyBzZXUgcGFkcsOjbyBkZSBkZXNibG9xdWVpbyA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiB2ZXplcy4gIlxuXG4iVGVudGUgbm92YW1lbnRlIGVtIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IHNlZ3VuZG9zLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX3Bhc3N3b3JkX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNDkwNjAzNDM3NjQyNTE3NTM4MSI+IlZvY8OqIGluc2VyaXUgaW5jb3JyZXRhbWVudGUgYSBzdWEgc2VuaGEgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4gdmV6ZXMuICJcblxuIlRlbnRlIG5vdmFtZW50ZSBlbSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBzZWd1bmRvcy4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9waW5fYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI2ODI3NzQ5MjMxNDY1MTQ1NTkwIj4iVm9jw6ogZGlnaXRvdSBpbmNvcnJldGFtZW50ZSBvIHNldSBQSU4gPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4gdmV6ZXMuICJcblxuIlRlbnRlIG5vdmFtZW50ZSBlbSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBzZWd1bmRvcy4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2ZhaWxlZF9hdHRlbXB0c19hbG1vc3RfZ2xvZ2luIiBtc2dpZD0iMzM1MTAxMzg0MjMyMDEyNzgyNyI+IlZvY8OqIGRlc2VuaG91IG8gc2V1IHBhZHLDo28gZGUgZGVzYmxvcXVlaW8gaW5jb3JyZXRhbWVudGUgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4gdmV6ZXMuIE1haXMgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gdGVudGF0aXZhcyBpbmNvcnJldGFzIGUgdm9jw6ogcmVjZWJlcsOhIHVtYSBzb2xpY2l0YcOnw6NvIHBhcmEgZGVzYmxvcXVlYXIgbyBzZXUgdGVsZWZvbmUgdXNhbmRvIG8gc2V1IGxvZ2luIGRvIEdvb2dsZS4iXG5cbiIgVGVudGUgbm92YW1lbnRlIGVtIDx4bGlmZjpnIGlkPSJOVU1CRVJfMiI+JWQ8L3hsaWZmOmc+IHNlZ3VuZG9zLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX2F0dGVtcHRzX2NvdW50ZG93biIgbXNnaWQ9IjYyNTE0ODAzNDMzOTQzODk2NjUiPiJUZW50ZSBub3ZhbWVudGUgZW0gPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+IHNlZ3VuZG9zLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fZm9yZ290X3BhdHRlcm5fYnV0dG9uX3RleHQiIG1zZ2lkPSIyNjI2OTk5NDQ5NjEwNjk1OTMwIj4iRXNxdWVjZXUgbyBwYWRyw6NvPyI8L3N0cmluZz4KQEAgLTcwMywxNSArNzA5LDE3IEBACiAgICAgPHN0cmluZyBuYW1lPSJlbGFwc2VkX3RpbWVfc2hvcnRfZm9ybWF0X21tX3NzIiBtc2dpZD0iNDQzMTU1NTk0MzgyODcxMTQ3MyI+Ijx4bGlmZjpnIGlkPSJNSU5VVEVTIj4lMSQwMmQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJTRUNPTkRTIj4lMiQwMmQ8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZWxhcHNlZF90aW1lX3Nob3J0X2Zvcm1hdF9oX21tX3NzIiBtc2dpZD0iMTg0NjA3MTk5NzYxNjY1NDEyNCI+Ijx4bGlmZjpnIGlkPSJIT1VSUyI+JTEkZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9Ik1JTlVURVMiPiUyJDAyZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9IlNFQ09ORFMiPiUzJDAyZDwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RBbGwiIG1zZ2lkPSI2ODc2NTE4OTI1ODQ0MTI5MzMxIj4iU2VsZWNpb25hciB0dWRvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0VGV4dCIgbXNnaWQ9IjM4ODkxNDkxMjM2MjY4ODg2MzciPiJTZWxlY2lvbmFyIHRleHRvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ic3RvcFNlbGVjdGluZ1RleHQiIG1zZ2lkPSI0MTU3OTMxNDYzODcyMzIwOTk2Ij4iUGFyYXIgc2VsZcOnw6NvIGRlIHRleHRvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY3V0IiBtc2dpZD0iMzA5MjU2OTQwODQzODYyNjI2MSI+IlJlY29ydGFyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY29weSIgbXNnaWQ9IjI2ODE5NDYyMjk1MzM1MTE5ODciPiJDb3BpYXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwYXN0ZSIgbXNnaWQ9IjU2Mjk4ODA4MzY4MDUwMzY0MzMiPiJDb2xhciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNvcHlVcmwiIG1zZ2lkPSIyNTM4MjExNTc5NTk2MDY3NDAyIj4iQ29waWFyIFVSTCI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzZWxlY3RUZXh0TW9kZSAoNjczODU1NjM0ODg2MTM0NzI0MCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciB0ZXh0U2VsZWN0aW9uQ0FCVGl0bGUgKDUyMzY4NTAzOTQzNzA4MjAzNTcpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJpbnB1dE1ldGhvZCIgbXNnaWQ9IjE2NTM2MzAwNjIzMDQ1Njc4NzkiPiJNw6l0b2RvIGRlIGVudHJhZGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJhZGRUb0RpY3Rpb25hcnkiIG1zZ2lkPSI4NzkzNjI0OTkxNjg2OTQ4NzA5Ij4iQWRpY2lvbmFyIFwiPHhsaWZmOmcgaWQ9IldPUkQiPiVzPC94bGlmZjpnPlwiIGFvIGRpY2lvbsOhcmlvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZWRpdFRleHRNZW51VGl0bGUiIG1zZ2lkPSIxNjcyOTg5MTc2OTU4NTgxNDUyIj4iRWRpdGFyIHRleHRvIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGVkaXRUZXh0TWVudVRpdGxlICg0OTA5MTM1NTY0OTQxODE1NDk0KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0ibG93X2ludGVybmFsX3N0b3JhZ2Vfdmlld190aXRsZSIgbXNnaWQ9IjEzOTk3MzI0MDg3MDE2OTc1NDYiPiJQb3VjbyBlc3Bhw6dvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG93X2ludGVybmFsX3N0b3JhZ2Vfdmlld190ZXh0IiBtc2dpZD0iNjM1MTA2NTQ0NjE2Mzc4ODM2Ij4iTyBlc3Bhw6dvIGRlIGFybWF6ZW5hbWVudG8gZG8gdGVsZWZvbmUgZXN0w6EgZmljYW5kbyBiYWl4by4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvayIgbXNnaWQ9IjU5NzAwNjA0MzA1NjI1MjQ5MTAiPiJPSyI8L3N0cmluZz4KQEAgLTcxOSw2ICs3MjcsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ieWVzIiBtc2dpZD0iNTM2Mjk4MjMwMzMzNzk2OTMxMiI+Ik9LIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibm8iIG1zZ2lkPSI1MTQxNTMxMDQ0OTM1NTQxNDk3Ij4iQ2FuY2VsYXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkaWFsb2dfYWxlcnRfdGl0bGUiIG1zZ2lkPSIyMDQ5NjU4NzA4NjA5MDQzMTAzIj4iQXRlbsOnw6NvIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9hZGluZyIgbXNnaWQ9IjE3NjA3MjQ5OTg5MjgyNTUyNTAiPiJDYXJyZWdhbmRvLi4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FwaXRhbF9vbiIgbXNnaWQ9IjE1NDQ2ODI3NTU1MTQ0OTQyOTgiPiJBVElWQURPIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FwaXRhbF9vZmYiIG1zZ2lkPSI2ODE1ODcwMzg2OTcyODA1ODMyIj4iREVTQVRJVkFETyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9IndoaWNoQXBwbGljYXRpb24iIG1zZ2lkPSI0NTMzMTg1OTQ3MDY0NzczMzg2Ij4iQ29tcGxldGUgYSBhw6fDo28gdXNhbmRvIjwvc3RyaW5nPgpAQCAtODUzLDEzICs4NjIsMTcgQEAKICAgICA8c3RyaW5nIG5hbWU9ImwydHBfaXBzZWNfcHNrX3Zwbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM5NDUwNDM1NjQwMDgzMDMyMzkiPiJWUE4gTDJUUC9JUFNlYyBjb20gYmFzZSBlbSBjaGF2ZSBwcsOpLWNvbXBhcnRpbGhhZGEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsMnRwX2lwc2VjX2NydF92cG5fZGVzY3JpcHRpb24iIG1zZ2lkPSI1MzgyNzE0MDczMTAzNjUzNTc3Ij4iVlBOIEwyVFAvSVBTZWMgY29tIGJhc2UgZW0gY2VydGlmaWNhZG8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1cGxvYWRfZmlsZSIgbXNnaWQ9IjI4OTc5NTcxNzIzNjY3MzA0MTYiPiJFc2NvbGhlciBhcnF1aXZvIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fZmlsZV9jaG9zZW4iIG1zZ2lkPSI2MzYzNjQ4NTYyMTcwNzU5NDY1Ij4iTmVuaHVtIGFycXVpdm8gZXNjb2xoaWRvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icmVzZXQiIG1zZ2lkPSIyNDQ4MTY4MDgwOTY0MjA5OTA4Ij4iUmVkZWZpbmlyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic3VibWl0IiBtc2dpZD0iMTYwMjMzNTU3MjA4OTkxMTk0MSI+IkVudmlhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImRlc2NyaXB0aW9uX3N0YXIiIG1zZ2lkPSIyNjU0MzE5ODc0OTA4NTc2MTMzIj4iZmF2b3JpdG8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXJfbW9kZV9kaXNhYmxlX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjMxNjQ3NjgyMTIwMDM4NjQzMTYiPiJNb2RvIGRlIGNhcnJvIGF0aXZhZG8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXJfbW9kZV9kaXNhYmxlX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iNjY4NjYzNjI2NzIxNjc1NjE0Ij4iU2VsZWNpb25lIHBhcmEgc2FpciBkbyBtb2RvIGRlIGNhcnJvLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRldGhlcmVkX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjMxNDY2OTQyMzQzOTgyMDI2MDEiPiJWw61uY3VsbyBvdSBwb250byBkZSBhY2Vzc28gYXRpdm8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0ZXRoZXJlZF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjMwNjcxMDgzMjM5MDMwNDg5MjciPiJUb3F1ZSBwYXJhIGNvbmZpZ3VyYXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJiYWNrX2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjIzMDA0NzAwMDQ1MDMzNDM0MzkiPiJWb2x0YXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJuZXh0X2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjEwODA1NTUxMDQ2Nzc5OTI0MDgiPiJBdmFuw6dhciI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBza2lwX2J1dHRvbl9sYWJlbCAoMTI3NTM2MjI5OTQ3MTYzMTgxOSkgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlX3dhcm5pbmdfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNDg5MDg5NDI2NzQ1NDg2NzI3NiI+IkFsdG8gdXNvIGRlIGRhZG9zIGRvIGNlbHVsYXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZV93YXJuaW5nX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMjYwOTczNDc2Mzg0NTcwNTcwOCI+IlRvcXVlIHBhcmEgc2FiZXIgbWFpcyBzb2JyZSB1c28gZGUgZGFkb3MgZG8gY2VsdWxhciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlZF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI2MjY5NTQxODk3NzI5NzgxMzMyIj4iTGltaXRlIGRlIGRhZG9zIGRvIGNlbHVsYXIgZXhjZWRpZG8iPC9zdHJpbmc+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXJ1L3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1ydS9zdHJpbmdzLnhtbAppbmRleCBhOTkxMDdlLi5mZjAzZTM1IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXJ1L3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtcnUvc3RyaW5ncy54bWwKQEAgLTQzNiw2ICs0MzYsMTAgQEAKICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfZm9yY2VMb2NrIiBtc2dpZD0iMjgxOTg2ODY2NDk0NjA4OTc0MCI+ItCj0L/RgNCw0LLQu9C10L3QuNC1INCx0LvQvtC60LjRgNC+0LLQutC+0Lkg0YPRgdGC0YDQvtC50YHRgtCy0LAsINGC0YDQtdCx0YPRjtGJ0LXQuSDQstCy0L7QtNCwINC/0LDRgNC+0LvRjy4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfd2lwZURhdGEiIG1zZ2lkPSIzOTEwNTQ1NDQ2NzU4NjM5NzEzIj4i0KPQtNCw0LvQuNGC0Ywg0LLRgdC1INC00LDQvdC90YvQtSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfd2lwZURhdGEiIG1zZ2lkPSIyMzE0MDYwOTMzNzk2Mzk2MjA1Ij4i0JLRi9C/0L7Qu9C90LjRgtGMINGB0LHRgNC+0YEg0Log0L3QsNGH0LDQu9GM0L3Ri9C8INC90LDRgdGC0YDQvtC50LrQsNC8INGBINGD0LTQsNC70LXQvdC40LXQvCDQstGB0LXRhSDQtNCw0L3QvdGL0YUg0LHQtdC3INC30LDQv9GA0L7RgdCwINC/0L7QtNGC0LLQtdGA0LbQtNC10L3QuNGPLiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwb2xpY3lsYWJfc2V0R2xvYmFsUHJveHkgKDI3ODQ4MjgyOTM3NDc3OTE0NDYpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcG9saWN5ZGVzY19zZXRHbG9iYWxQcm94eSAoNjM4NzQ5NzQ2NjY2MDE1NDkzMSkgLS0+CisgICAgPHNraXAgLz4KICAgPHN0cmluZy1hcnJheSBuYW1lPSJwaG9uZVR5cGVzIj4KICAgICA8aXRlbSBtc2dpZD0iODkwMTA5ODMzNjY1ODcxMDM1OSI+ItCU0L7QvNCw0YjQvdC40LkiPC9pdGVtPgogICAgIDxpdGVtIG1zZ2lkPSI4Njk5MjM2NTA1MjcxMzY2MTUiPiLQnNC+0LHQuNC70YzQvdGL0LkiPC9pdGVtPgpAQCAtNTI5LDEwICs1MzMsOSBAQAogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZVdvcmsiIG1zZ2lkPSIyOTI2ODg3MDUwNTM2Mzg3MiI+ItCg0LDQsdC+0YLQsCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVPdGhlciIgbXNnaWQ9IjM5NTE3ODExMzE1NzAxMjQwODIiPiLQlNGA0YPQs9C+0LUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlQ3VzdG9tIiBtc2dpZD0iMjI1NTIzNDE1MzcyMDg4MzIyIj4i0KHQvtC30LTQsNGC0Ywg0YHQstC+0Lkg0Y/RgNC70YvQuiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbiIgbXNnaWQ9IjUxMTI1ODk4ODYwOTQ0MDI3OTUiPiLRgSDQv9C+0LzQvtGJ0YzRjiA8eGxpZmY6ZyBpZD0iU09VUkNFIj4lMSRzPC94bGlmZjpnPiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbl93aXRoX2RhdGUiIG1zZ2lkPSI1OTQ1Mzg2Mzc2MzY5OTc5OTA5Ij4iPHhsaWZmOmcgaWQ9IkRBVEUiPiUxJHM8L3hsaWZmOmc+INGBINC/0L7QvNC+0YnRjNGOIDx4bGlmZjpnIGlkPSJTT1VSQ0UiPiUyJHM8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGluX2NvZGUiIG1zZ2lkPSIzNzMxNDg4ODI3MjE4ODc2MTE1Ij4i0JLQstC10LTQuNGC0LUgUElOLdC60L7QtCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bhc3N3b3JkX2NvZGUiIG1zZ2lkPSI5MTM4MTU4MzQ0ODEzMjEzNzU0Ij4i0JLQstC10LTQuNGC0LUg0L/QsNGA0L7Qu9GMINC00LvRjyDRgNCw0LfQsdC70L7QutC40YDQvtCy0LrQuCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bpbl9wYXNzd29yZF9jb2RlIiBtc2dpZD0iNjM4MzQ3MDc1NjI1NDkxNTE0Ij4i0JLQstC10LTQuNGC0LUgUElOLdC60L7QtCDQtNC70Y8g0YDQsNC30LHQu9C+0LrQuNGA0L7QstC60LgiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF93cm9uZ19waW5fY29kZSIgbXNnaWQ9IjEyOTU5ODQxMTQzMzgxMDc3MTgiPiLQndC10LLQtdGA0L3Ri9C5IFBJTi3QutC+0LQhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfbGFiZWxfdGV4dCIgbXNnaWQ9Ijg2MTc5NjQ2MTAyODI5ODQyNCI+ItCU0LvRjyDRgNCw0LfQsdC70L7QutC40YDQvtCy0LrQuCDQvdCw0LbQvNC40YLQtSBcItCc0LXQvdGOXCIsINCwINC30LDRgtC10LwgMC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJlbWVyZ2VuY3lfY2FsbF9kaWFsb2dfbnVtYmVyX2Zvcl9kaXNwbGF5IiBtc2dpZD0iNjk2MTkyMTAzMTk1MDkwOTcwIj4i0K3QutGB0YLRgNC10L3QvdCw0Y8g0YHQu9GD0LbQsdCwIjwvc3RyaW5nPgpAQCAtNTQ1LDYgKzU0OCw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3JldHVybl90b19jYWxsIiBtc2dpZD0iNTI0NDI1OTc4NTUwMDA0MDAyMSI+ItCS0LXRgNC90YPRgtGM0YHRjyDQuiDQstGL0LfQvtCy0YMiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BhdHRlcm5fY29ycmVjdCIgbXNnaWQ9IjkwMzkwMDg2NTAzNjIyNjEyMzciPiLQn9GA0LDQstC40LvRjNC90L4hIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXR0ZXJuX3dyb25nIiBtc2dpZD0iNDgxNzU4MzI3OTA1MzExMjMxMiI+ItCf0L7QstGC0L7RgNC40YLQtSDQv9C+0L/Ri9GC0LrRgyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGFzc3dvcmRfd3JvbmciIG1zZ2lkPSI2MjM3NDQzNjU3MzU4MTY4ODE5Ij4i0J/QvtCy0YLQvtGA0LjRgtC1INC/0L7Qv9GL0YLQutGDIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wbHVnZ2VkX2luIiBtc2dpZD0iNjEzMzQzODUyODQyOTQ0NDM1Ij4i0JjQtNC10YIg0LfQsNGA0Y/QtNC60LAgKDx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPjx4bGlmZjpnIGlkPSJQRVJDRU5UIj4lJTwveGxpZmY6Zz4pIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9jaGFyZ2VkIiBtc2dpZD0iNDkzODkzMDQ1OTYyMDk4OTk3MiI+ItCX0LDRgNGP0LbQtdC90LAuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9iYXR0ZXJ5X3Nob3J0IiBtc2dpZD0iMzYxNzU0OTE3ODYwMzM1NDY1NiI+Ijx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPjx4bGlmZjpnIGlkPSJQRVJDRU5UIj4lJTwveGxpZmY6Zz4iPC9zdHJpbmc+CkBAIC01NTksNiArNTYzLDggQEAKICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fc2ltX2xvY2tlZF9tZXNzYWdlIiBtc2dpZD0iODA2NjY2MDEyOTIwNjAwMTAzOSI+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+ItCX0LDQsdGL0LvQuCDQs9GA0LDRhNC40YfQtdGB0LrQuNC5INC60LvRjtGHPyI8L3N0cmluZz4KQEAgLTcwMywxNSArNzA5LDE3IEBACiAgICAgPHN0cmluZyBuYW1lPSJlbGFwc2VkX3RpbWVfc2hvcnRfZm9ybWF0X21tX3NzIiBtc2dpZD0iNDQzMTU1NTk0MzgyODcxMTQ3MyI+Ijx4bGlmZjpnIGlkPSJNSU5VVEVTIj4lMSQwMmQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJTRUNPTkRTIj4lMiQwMmQ8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZWxhcHNlZF90aW1lX3Nob3J0X2Zvcm1hdF9oX21tX3NzIiBtc2dpZD0iMTg0NjA3MTk5NzYxNjY1NDEyNCI+Ijx4bGlmZjpnIGlkPSJIT1VSUyI+JTEkZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9Ik1JTlVURVMiPiUyJDAyZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9IlNFQ09ORFMiPiUzJDAyZDwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RBbGwiIG1zZ2lkPSI2ODc2NTE4OTI1ODQ0MTI5MzMxIj4i0JLRi9Cx0YDQsNGC0Ywg0LLRgdC1Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0VGV4dCIgbXNnaWQ9IjM4ODkxNDkxMjM2MjY4ODg2MzciPiLQktGL0LHRgNCw0YLRjCDRgtC10LrRgdGCIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ic3RvcFNlbGVjdGluZ1RleHQiIG1zZ2lkPSI0MTU3OTMxNDYzODcyMzIwOTk2Ij4i0J7RgdGC0LDQvdC+0LLQuNGC0Ywg0LLRi9C00LXQu9C10L3QuNC1INGC0LXQutGB0YLQsCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImN1dCIgbXNnaWQ9IjMwOTI1Njk0MDg0Mzg2MjYyNjEiPiLQktGL0YDQtdC30LDRgtGMIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY29weSIgbXNnaWQ9IjI2ODE5NDYyMjk1MzM1MTE5ODciPiLQmtC+0L/QuNGA0L7QstCw0YLRjCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBhc3RlIiBtc2dpZD0iNTYyOTg4MDgzNjgwNTAzNjQzMyI+ItCS0YHRgtCw0LLQuNGC0YwiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjb3B5VXJsIiBtc2dpZD0iMjUzODIxMTU3OTU5NjA2NzQwMiI+ItCa0L7Qv9C40YDQvtCy0LDRgtGMIFVSTCI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzZWxlY3RUZXh0TW9kZSAoNjczODU1NjM0ODg2MTM0NzI0MCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciB0ZXh0U2VsZWN0aW9uQ0FCVGl0bGUgKDUyMzY4NTAzOTQzNzA4MjAzNTcpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJpbnB1dE1ldGhvZCIgbXNnaWQ9IjE2NTM2MzAwNjIzMDQ1Njc4NzkiPiLQodC/0L7RgdC+0LEg0LLQstC+0LTQsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImFkZFRvRGljdGlvbmFyeSIgbXNnaWQ9Ijg3OTM2MjQ5OTE2ODY5NDg3MDkiPiLQlNC+0LHQsNCy0LjRgtGMIFwiPHhsaWZmOmcgaWQ9IldPUkQiPiVzPC94bGlmZjpnPlwiINCyINGB0LvQvtCy0LDRgNGMIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZWRpdFRleHRNZW51VGl0bGUiIG1zZ2lkPSIxNjcyOTg5MTc2OTU4NTgxNDUyIj4i0JjQt9C80LXQvdC40YLRjCDRgtC10LrRgdGCIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGVkaXRUZXh0TWVudVRpdGxlICg0OTA5MTM1NTY0OTQxODE1NDk0KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0ibG93X2ludGVybmFsX3N0b3JhZ2Vfdmlld190aXRsZSIgbXNnaWQ9IjEzOTk3MzI0MDg3MDE2OTc1NDYiPiLQndC10LTQvtGB0YLQsNGC0L7Rh9C90L4g0LzQtdGB0YLQsCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Imxvd19pbnRlcm5hbF9zdG9yYWdlX3ZpZXdfdGV4dCIgbXNnaWQ9IjYzNTEwNjU0NDYxNjM3ODgzNiI+ItCX0LDQutCw0L3Rh9C40LLQsNC10YLRgdGPINC80LXRgdGC0L4g0LIg0L/QsNC80Y/RgtC4INGC0LXQu9C10YTQvtC90LAuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ib2siIG1zZ2lkPSI1OTcwMDYwNDMwNTYyNTI0OTEwIj4i0J7QmiI8L3N0cmluZz4KQEAgLTcxOSw2ICs3MjcsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ieWVzIiBtc2dpZD0iNTM2Mjk4MjMwMzMzNzk2OTMxMiI+ItCe0JoiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJubyIgbXNnaWQ9IjUxNDE1MzEwNDQ5MzU1NDE0OTciPiLQntGC0LzQtdC90LAiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkaWFsb2dfYWxlcnRfdGl0bGUiIG1zZ2lkPSIyMDQ5NjU4NzA4NjA5MDQzMTAzIj4i0JLQvdC40LzQsNC90LjQtSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvYWRpbmciIG1zZ2lkPSIxNzYwNzI0OTk4OTI4MjU1MjUwIj4i0JfQsNCz0YDRg9C30LrQsC4uLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcGl0YWxfb24iIG1zZ2lkPSIxNTQ0NjgyNzU1NTE0NDk0Mjk4Ij4i0JLQmtCbIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FwaXRhbF9vZmYiIG1zZ2lkPSI2ODE1ODcwMzg2OTcyODA1ODMyIj4i0JLQq9Ca0JsiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ3aGljaEFwcGxpY2F0aW9uIiBtc2dpZD0iNDUzMzE4NTk0NzA2NDc3MzM4NiI+ItCn0YLQviDQuNGB0L/QvtC70YzQt9C+0LLQsNGC0Yw/Ijwvc3RyaW5nPgpAQCAtODUzLDEzICs4NjIsMTcgQEAKICAgICA8c3RyaW5nIG5hbWU9ImwydHBfaXBzZWNfcHNrX3Zwbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM5NDUwNDM1NjQwMDgzMDMyMzkiPiJMMlRQL0lQU2VjIFZQTiAo0L3QsCDQvtGB0L3QvtCy0LUg0L/RgNC10LTQsi4g0L7QsdGJLiDQutC70Y7Rh9CwKSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImwydHBfaXBzZWNfY3J0X3Zwbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjUzODI3MTQwNzMxMDM2NTM1NzciPiJMMlRQL0lQU2VjIFZQTiAo0L3QsCDQvtGB0L3QvtCy0LUg0YHQtdGA0YLQuNGE0LjQutCw0YLQsCkiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1cGxvYWRfZmlsZSIgbXNnaWQ9IjI4OTc5NTcxNzIzNjY3MzA0MTYiPiLQktGL0LHRgNCw0YLRjCDRhNCw0LnQuyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5vX2ZpbGVfY2hvc2VuIiBtc2dpZD0iNjM2MzY0ODU2MjE3MDc1OTQ2NSI+ItCd0LUg0LLRi9Cx0YDQsNC9INGE0LDQudC7Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icmVzZXQiIG1zZ2lkPSIyNDQ4MTY4MDgwOTY0MjA5OTA4Ij4i0KHQsdGA0L7RgdC40YLRjCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InN1Ym1pdCIgbXNnaWQ9IjE2MDIzMzU1NzIwODk5MTE5NDEiPiLQntGC0L/RgNCw0LLQuNGC0YwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJkZXNjcmlwdGlvbl9zdGFyIiBtc2dpZD0iMjY1NDMxOTg3NDkwODU3NjEzMyI+ItC40LfQsdGA0LDQvdC90L7QtSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcl9tb2RlX2Rpc2FibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iMzE2NDc2ODIxMjAwMzg2NDMxNiI+ItCg0LXQttC40Lwg0LPRgNC+0LzQutC+0Lkg0YHQstGP0LfQuCDQstC60LvRjtGH0LXQvSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcl9tb2RlX2Rpc2FibGVfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI2Njg2NjM2MjY3MjE2NzU2MTQiPiLQktGL0LHQtdGA0LjRgtC1INC00LvRjyDQstGL0YXQvtC00LAg0LjQtyDRgNC10LbQuNC80LAg0LPRgNC+0LzQutC+0Lkg0YHQstGP0LfQuC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0ZXRoZXJlZF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSIzMTQ2Njk0MjM0Mzk4MjAyNjAxIj4iVVNCLdC80L7QtNC10Lwg0LjQu9C4INGC0L7Rh9C60LAg0LTQvtGB0YLRg9C/0LAgV2ktRmkg0LDQutGC0LjQstC90YsiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0ZXRoZXJlZF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjMwNjcxMDgzMjM5MDMwNDg5MjciPiLQndCw0LbQvNC40YLQtSDQtNC70Y8g0L3QsNGB0YLRgNC+0LnQutC4Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iYmFja19idXR0b25fbGFiZWwiIG1zZ2lkPSIyMzAwNDcwMDA0NTAzMzQzNDM5Ij4i0J3QsNC30LDQtCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5leHRfYnV0dG9uX2xhYmVsIiBtc2dpZD0iMTA4MDU1NTEwNDY3Nzk5MjQwOCI+ItCU0LDQu9C10LUiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2tpcF9idXR0b25fbGFiZWwgKDEyNzUzNjIyOTk0NzE2MzE4MTkpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZV93YXJuaW5nX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjQ4OTA4OTQyNjc0NTQ4NjcyNzYiPiLQkNC60YLQuNCy0L3QsNGPINC/0LXRgNC10LTQsNGH0LAg0LTQsNC90L3Ri9GFIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVfd2FybmluZ19ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjI2MDk3MzQ3NjM4NDU3MDU3MDgiPiLQndCw0LbQvNC40YLQtSwg0YfRgtC+0LHRiyDRg9C30L3QsNGC0Ywg0LHQvtC70YzRiNC1INC+INC80L7QsdC40LvRjNC90L7QuSDQv9C10YDQtdC00LDRh9C1INC00LDQvdC90YvRhSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlZF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI2MjY5NTQxODk3NzI5NzgxMzMyIj4i0J/RgNC10LLRi9GI0LXQvSDQu9C40LzQuNGCINC90LAg0LzQvtCx0LjQu9GM0L3Ri9C1INC00LDQvdC90YvQtSI8L3N0cmluZz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtc3Yvc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXN2L3N0cmluZ3MueG1sCmluZGV4IGIzZTQxNWQuLjRkNzY5ODcgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtc3Yvc3RyaW5ncy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1zdi9zdHJpbmdzLnhtbApAQCAtNDM2LDYgKzQzNiwxMCBAQAogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19mb3JjZUxvY2siIG1zZ2lkPSIyODE5ODY4NjY0OTQ2MDg5NzQwIj4iS29udHJvbGxlcmEgbsOkciBlbmhldGVuIGzDpXNlcywgdmlsa2V0IGtyw6R2ZXIgYXR0IGR1IGFuZ2VyIGzDtnNlbm9yZGV0IGlnZW4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX3dpcGVEYXRhIiBtc2dpZD0iMzkxMDU0NTQ0Njc1ODYzOTcxMyI+IlJhZGVyYSBhbGxhIGRhdGEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3dpcGVEYXRhIiBtc2dpZD0iMjMxNDA2MDkzMzc5NjM5NjIwNSI+IsOFdGVyc3TDpGxsIGZhYnJpa3NpbnN0w6RsbG5pbmdhcm5hIG9jaCB0YSBib3J0IGFsbGEgZGF0YSB1dGFuIG7DpWdvbiBiZWtyw6RmdGVsc2UuIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBvbGljeWxhYl9zZXRHbG9iYWxQcm94eSAoMjc4NDgyODI5Mzc0Nzc5MTQ0NikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwb2xpY3lkZXNjX3NldEdsb2JhbFByb3h5ICg2Mzg3NDk3NDY2NjYwMTU0OTMxKSAtLT4KKyAgICA8c2tpcCAvPgogICA8c3RyaW5nLWFycmF5IG5hbWU9InBob25lVHlwZXMiPgogICAgIDxpdGVtIG1zZ2lkPSI4OTAxMDk4MzM2NjU4NzEwMzU5Ij4iSGVtIjwvaXRlbT4KICAgICA8aXRlbSBtc2dpZD0iODY5OTIzNjUwNTI3MTM2NjE1Ij4iTW9iaWwiPC9pdGVtPgpAQCAtNTI5LDEwICs1MzMsOSBAQAogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZVdvcmsiIG1zZ2lkPSIyOTI2ODg3MDUwNTM2Mzg3MiI+IkFyYmV0ZSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVPdGhlciIgbXNnaWQ9IjM5NTE3ODExMzE1NzAxMjQwODIiPiLDlnZyaWd0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZUN1c3RvbSIgbXNnaWQ9IjIyNTUyMzQxNTM3MjA4ODMyMiI+IkFucGFzc2FkIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iY29udGFjdF9zdGF0dXNfdXBkYXRlX2F0dHJpYnV0aW9uIiBtc2dpZD0iNTExMjU4OTg4NjA5NDQwMjc5NSI+InZpYSA8eGxpZmY6ZyBpZD0iU09VUkNFIj4lMSRzPC94bGlmZjpnPiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbl93aXRoX2RhdGUiIG1zZ2lkPSI1OTQ1Mzg2Mzc2MzY5OTc5OTA5Ij4iPHhsaWZmOmcgaWQ9IkRBVEUiPiUxJHM8L3hsaWZmOmc+IHZpYSA8eGxpZmY6ZyBpZD0iU09VUkNFIj4lMiRzPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bpbl9jb2RlIiBtc2dpZD0iMzczMTQ4ODgyNzIxODg3NjExNSI+IkFuZ2UgUElOLWtvZCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bhc3N3b3JkX2NvZGUiIG1zZ2lkPSI5MTM4MTU4MzQ0ODEzMjEzNzU0Ij4iQW5nZSBsw7ZzZW5vcmQgZsO2ciBhdHQgbMOlc2EgdXBwIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGluX3Bhc3N3b3JkX2NvZGUiIG1zZ2lkPSI2MzgzNDcwNzU2MjU0OTE1MTQiPiJBbmdlIFBJTi1rb2QgZsO2ciBhdHQgbMOlc2EgdXBwIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfd3JvbmdfcGluX2NvZGUiIG1zZ2lkPSIxMjk1OTg0MTE0MzM4MTA3NzE4Ij4iRmVsIFBJTi1rb2QhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfbGFiZWxfdGV4dCIgbXNnaWQ9Ijg2MTc5NjQ2MTAyODI5ODQyNCI+IlRyeWNrIHDDpSBNZW51IG9jaCBzZWRhbiBww6UgMCBvbSBkdSB2aWxsIGzDpXNhIHVwcC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJlbWVyZ2VuY3lfY2FsbF9kaWFsb2dfbnVtYmVyX2Zvcl9kaXNwbGF5IiBtc2dpZD0iNjk2MTkyMTAzMTk1MDkwOTcwIj4iTsO2ZHNhbXRhbHNudW1tZXIiPC9zdHJpbmc+CkBAIC01NDUsNiArNTQ4LDcgQEAKICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcmV0dXJuX3RvX2NhbGwiIG1zZ2lkPSI1MjQ0MjU5Nzg1NTAwMDQwMDIxIj4iw4V0ZXJnw6UgdGlsbCBzYW10YWxldCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGF0dGVybl9jb3JyZWN0IiBtc2dpZD0iOTAzOTAwODY1MDM2MjI2MTIzNyI+IktvcnJla3QhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXR0ZXJuX3dyb25nIiBtc2dpZD0iNDgxNzU4MzI3OTA1MzExMjMxMiI+IkbDtnJzw7ZrIGlnZW4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Bhc3N3b3JkX3dyb25nIiBtc2dpZD0iNjIzNzQ0MzY1NzM1ODE2ODgxOSI+IkbDtnJzw7ZrIGlnZW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BsdWdnZWRfaW4iIG1zZ2lkPSI2MTMzNDM4NTI4NDI5NDQ0MzUiPiJMYWRkYXIgKDx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPjx4bGlmZjpnIGlkPSJQRVJDRU5UIj4lJTwveGxpZmY6Zz4pIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9jaGFyZ2VkIiBtc2dpZD0iNDkzODkzMDQ1OTYyMDk4OTk3MiI+IkxhZGRhZC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2JhdHRlcnlfc2hvcnQiIG1zZ2lkPSIzNjE3NTQ5MTc4NjAzMzU0NjU2Ij4iPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+PHhsaWZmOmcgaWQ9IlBFUkNFTlQiPiUlPC94bGlmZjpnPiI8L3N0cmluZz4KQEAgLTU1OSw2ICs1NjMsOCBAQAogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9zaW1fbG9ja2VkX21lc3NhZ2UiIG1zZ2lkPSI4MDY2NjYwMTI5MjA2MDAxMDM5Ij4iU0lNLWtvcnRldCDDpHIgbMOlc3QuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9zaW1fdW5sb2NrX3Byb2dyZXNzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNTk1MzIzMjE0MDUyODgxMjY0Ij4iTMOlc2VyIHVwcCBTSU0ta29ydOKApiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iMzUxNDc0MjEwNjA2Njg3NzQ3NiI+IkR1IGhhciByaXRhdCBkaXR0IGdyYWZpc2thIGzDtnNlbm9yZCBmZWwgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4gZ8Olbmdlci4gIlxuXG4iRsO2cnPDtmsgaWdlbiBvbSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBzZWt1bmRlci4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9wYXNzd29yZF9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjQ5MDYwMzQzNzY0MjUxNzUzODEiPiJEdSBoYXIgYW5nZXR0IGZlbCBsw7ZzZW5vcmQgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4gZ8Olbmdlci4gIlxuXG4iRsO2cnPDtmsgaWdlbiBvbSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBzZWt1bmRlci4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9waW5fYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI2ODI3NzQ5MjMxNDY1MTQ1NTkwIj4iRHUgaGFyIGFuZ2V0dCBkaW4gUElOLWtvZCBmZWwgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4gZ8Olbmdlci4gIlxuXG4iRsO2cnPDtmsgaWdlbiBvbSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBzZWt1bmRlci4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2ZhaWxlZF9hdHRlbXB0c19hbG1vc3RfZ2xvZ2luIiBtc2dpZD0iMzM1MTAxMzg0MjMyMDEyNzgyNyI+IkR1IGhhciByaXRhdCBkaXR0IGdyYWZpc2thIGzDtnNlbm9yZCBmZWwgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4gZ8Olbmdlci4gRWZ0ZXIgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gZsO2cnPDtmsgdGlsbCBrb21tZXIgZHUgYXR0IHVwcG1hbmFzIGF0dCBsw6VzYSB1cHAgdGVsZWZvbmVuIG1lZCBkaW4gR29vZ2xlLWlubG9nZ25pbmcuIlxuXG4iIEbDtnJzw7ZrIGlnZW4gb20gPHhsaWZmOmcgaWQ9Ik5VTUJFUl8yIj4lZDwveGxpZmY6Zz4gc2VrdW5kZXIuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfYXR0ZW1wdHNfY291bnRkb3duIiBtc2dpZD0iNjI1MTQ4MDM0MzM5NDM4OTY2NSI+IkbDtnJzw7ZrIGlnZW4gb20gPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+IHNla3VuZGVyLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fZm9yZ290X3BhdHRlcm5fYnV0dG9uX3RleHQiIG1zZ2lkPSIyNjI2OTk5NDQ5NjEwNjk1OTMwIj4iR2zDtm10IGRpdHQgZ3JhZmlza2EgbMO2c2Vub3JkPyI8L3N0cmluZz4KQEAgLTcwMywxNSArNzA5LDE3IEBACiAgICAgPHN0cmluZyBuYW1lPSJlbGFwc2VkX3RpbWVfc2hvcnRfZm9ybWF0X21tX3NzIiBtc2dpZD0iNDQzMTU1NTk0MzgyODcxMTQ3MyI+Ijx4bGlmZjpnIGlkPSJNSU5VVEVTIj4lMSQwMmQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJTRUNPTkRTIj4lMiQwMmQ8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZWxhcHNlZF90aW1lX3Nob3J0X2Zvcm1hdF9oX21tX3NzIiBtc2dpZD0iMTg0NjA3MTk5NzYxNjY1NDEyNCI+Ijx4bGlmZjpnIGlkPSJIT1VSUyI+JTEkZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9Ik1JTlVURVMiPiUyJDAyZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9IlNFQ09ORFMiPiUzJDAyZDwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RBbGwiIG1zZ2lkPSI2ODc2NTE4OTI1ODQ0MTI5MzMxIj4iVsOkbGogYWxsYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InNlbGVjdFRleHQiIG1zZ2lkPSIzODg5MTQ5MTIzNjI2ODg4NjM3Ij4iTWFya2VyYSB0ZXh0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ic3RvcFNlbGVjdGluZ1RleHQiIG1zZ2lkPSI0MTU3OTMxNDYzODcyMzIwOTk2Ij4iU2x1dGEgdsOkbGphIHRleHQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjdXQiIG1zZ2lkPSIzMDkyNTY5NDA4NDM4NjI2MjYxIj4iS2xpcHAgdXQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjb3B5IiBtc2dpZD0iMjY4MTk0NjIyOTUzMzUxMTk4NyI+IktvcGllcmEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwYXN0ZSIgbXNnaWQ9IjU2Mjk4ODA4MzY4MDUwMzY0MzMiPiJLbGlzdHJhIGluIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY29weVVybCIgbXNnaWQ9IjI1MzgyMTE1Nzk1OTYwNjc0MDIiPiJLb3BpZXJhIHdlYmJhZHJlc3MiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2VsZWN0VGV4dE1vZGUgKDY3Mzg1NTYzNDg4NjEzNDcyNDApIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgdGV4dFNlbGVjdGlvbkNBQlRpdGxlICg1MjM2ODUwMzk0MzcwODIwMzU3KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0iaW5wdXRNZXRob2QiIG1zZ2lkPSIxNjUzNjMwMDYyMzA0NTY3ODc5Ij4iSW5kYXRhbWV0b2QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJhZGRUb0RpY3Rpb25hcnkiIG1zZ2lkPSI4NzkzNjI0OTkxNjg2OTQ4NzA5Ij4iTMOkZ2cgdGlsbCBcIjx4bGlmZjpnIGlkPSJXT1JEIj4lczwveGxpZmY6Zz5cIiBpIG9yZGxpc3RhbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImVkaXRUZXh0TWVudVRpdGxlIiBtc2dpZD0iMTY3Mjk4OTE3Njk1ODU4MTQ1MiI+IlJlZGlnZXJhIHRleHQiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZWRpdFRleHRNZW51VGl0bGUgKDQ5MDkxMzU1NjQ5NDE4MTU0OTQpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJsb3dfaW50ZXJuYWxfc3RvcmFnZV92aWV3X3RpdGxlIiBtc2dpZD0iMTM5OTczMjQwODcwMTY5NzU0NiI+IkTDpWxpZ3QgbWVkIHV0cnltbWUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb3dfaW50ZXJuYWxfc3RvcmFnZV92aWV3X3RleHQiIG1zZ2lkPSI2MzUxMDY1NDQ2MTYzNzg4MzYiPiJUZWxlZm9uZW5zIGxhZ3JpbmdzdXRyeW1tZSBow6VsbGVyIHDDpSBhdHQgdGEgc2x1dC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvayIgbXNnaWQ9IjU5NzAwNjA0MzA1NjI1MjQ5MTAiPiJPSyI8L3N0cmluZz4KQEAgLTcxOSw2ICs3MjcsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ieWVzIiBtc2dpZD0iNTM2Mjk4MjMwMzMzNzk2OTMxMiI+Ik9LIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibm8iIG1zZ2lkPSI1MTQxNTMxMDQ0OTM1NTQxNDk3Ij4iQXZicnl0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGlhbG9nX2FsZXJ0X3RpdGxlIiBtc2dpZD0iMjA0OTY1ODcwODYwOTA0MzEwMyI+Ik9icyEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2FkaW5nIiBtc2dpZD0iMTc2MDcyNDk5ODkyODI1NTI1MCI+IkzDpHNlciBpbi4uLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcGl0YWxfb24iIG1zZ2lkPSIxNTQ0NjgyNzU1NTE0NDk0Mjk4Ij4iUMOFIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FwaXRhbF9vZmYiIG1zZ2lkPSI2ODE1ODcwMzg2OTcyODA1ODMyIj4iQVYiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ3aGljaEFwcGxpY2F0aW9uIiBtc2dpZD0iNDUzMzE4NTk0NzA2NDc3MzM4NiI+IlNsdXRmw7ZyIMOldGfDpHJkIGdlbm9tIGF0dCBhbnbDpG5kYSI8L3N0cmluZz4KQEAgLTg1MywxMyArODYyLDE3IEBACiAgICAgPHN0cmluZyBuYW1lPSJsMnRwX2lwc2VjX3Bza192cG5fZGVzY3JpcHRpb24iIG1zZ2lkPSIzOTQ1MDQzNTY0MDA4MzAzMjM5Ij4iSSBmw7ZydsOkZyBkZWxhZCBMMlRQL0lQU2VjIFZQTi1ueWNrZWwiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsMnRwX2lwc2VjX2NydF92cG5fZGVzY3JpcHRpb24iIG1zZ2lkPSI1MzgyNzE0MDczMTAzNjUzNTc3Ij4iQ2VydGlmaWthdHNiYXNlcmFkIEwyVFAvSVBTZWMgVlBOIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXBsb2FkX2ZpbGUiIG1zZ2lkPSIyODk3OTU3MTcyMzY2NzMwNDE2Ij4iVsOkbGogZmlsIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fZmlsZV9jaG9zZW4iIG1zZ2lkPSI2MzYzNjQ4NTYyMTcwNzU5NDY1Ij4iSW5nZW4gZmlsIGhhciB2YWx0cyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InJlc2V0IiBtc2dpZD0iMjQ0ODE2ODA4MDk2NDIwOTkwOCI+IsOFdGVyc3TDpGxsIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic3VibWl0IiBtc2dpZD0iMTYwMjMzNTU3MjA4OTkxMTk0MSI+IlNraWNrYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImRlc2NyaXB0aW9uX3N0YXIiIG1zZ2lkPSIyNjU0MzE5ODc0OTA4NTc2MTMzIj4iZmF2b3JpdCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcl9tb2RlX2Rpc2FibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iMzE2NDc2ODIxMjAwMzg2NDMxNiI+IkJpbGzDpGdlIGFrdGl2ZXJhdCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcl9tb2RlX2Rpc2FibGVfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI2Njg2NjM2MjY3MjE2NzU2MTQiPiJWw6RsaiBvbSBkdSB2aWxsIGF2c2x1dGEgYmlsbMOkZ2UuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGV0aGVyZWRfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iMzE0NjY5NDIzNDM5ODIwMjYwMSI+IkludGVybmV0ZGVsbmluZyBlbGxlciBzdXJmcHVua3QgYWt0aXZlcmFkIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGV0aGVyZWRfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIzMDY3MTA4MzIzOTAzMDQ4OTI3Ij4iVHJ5Y2sgb20gZHUgdmlsbCBrb25maWd1cmVyYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImJhY2tfYnV0dG9uX2xhYmVsIiBtc2dpZD0iMjMwMDQ3MDAwNDUwMzM0MzQzOSI+IlRpbGxiYWthIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibmV4dF9idXR0b25fbGFiZWwiIG1zZ2lkPSIxMDgwNTU1MTA0Njc3OTkyNDA4Ij4iTsOkc3RhIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNraXBfYnV0dG9uX2xhYmVsICgxMjc1MzYyMjk5NDcxNjMxODE5KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVfd2FybmluZ19ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI0ODkwODk0MjY3NDU0ODY3Mjc2Ij4iSMO2ZyBtb2JpbGRhdGFhbnbDpG5kbmluZyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlX3dhcm5pbmdfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIyNjA5NzM0NzYzODQ1NzA1NzA4Ij4iVHJ5Y2sgb20gZHUgdmlsbCB2ZXRhIG1lciBvbSBtb2JpbGRhdGFhbnbDpG5kbmluZyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlZF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI2MjY5NTQxODk3NzI5NzgxMzMyIj4iR3LDpG5zZW4gZsO2ciBtb2JpbGRhdGEgaGFyIMO2dmVyc2tyaWRpdHMiPC9zdHJpbmc+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXRyL3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy10ci9zdHJpbmdzLnhtbAppbmRleCBhNmJjNDFlLi5iNDYyYzYxIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXRyL3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtdHIvc3RyaW5ncy54bWwKQEAgLTQzNiw2ICs0MzYsMTAgQEAKICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfZm9yY2VMb2NrIiBtc2dpZD0iMjgxOTg2ODY2NDk0NjA4OTc0MCI+IkNpaGF6IGtpbGl0bGVuZGnEn2luZGUsIMWfaWZyZXNpbmkgeWVuaWRlbiBnaXJtZW5pemkgZ2VyZWt0aXJlbiBkZW5ldGltLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl93aXBlRGF0YSIgbXNnaWQ9IjM5MTA1NDU0NDY3NTg2Mzk3MTMiPiJUw7xtIHZlcmlsZXJpIHNpbCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfd2lwZURhdGEiIG1zZ2lkPSIyMzE0MDYwOTMzNzk2Mzk2MjA1Ij4iVMO8bSB2ZXJpbGVyaW5pemkgb25heSBvbG1hZGFuIHNpbG1layBpw6dpbiBmYWJyaWthIGF5YXJsYXLEsW5hIHPEsWbEsXJsYXnEsW4uIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBvbGljeWxhYl9zZXRHbG9iYWxQcm94eSAoMjc4NDgyODI5Mzc0Nzc5MTQ0NikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwb2xpY3lkZXNjX3NldEdsb2JhbFByb3h5ICg2Mzg3NDk3NDY2NjYwMTU0OTMxKSAtLT4KKyAgICA8c2tpcCAvPgogICA8c3RyaW5nLWFycmF5IG5hbWU9InBob25lVHlwZXMiPgogICAgIDxpdGVtIG1zZ2lkPSI4OTAxMDk4MzM2NjU4NzEwMzU5Ij4iRXYiPC9pdGVtPgogICAgIDxpdGVtIG1zZ2lkPSI4Njk5MjM2NTA1MjcxMzY2MTUiPiJNb2JpbCI8L2l0ZW0+CkBAIC01MjksMTAgKzUzMyw5IEBACiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlV29yayIgbXNnaWQ9IjI5MjY4ODcwNTA1MzYzODcyIj4ixLDFnyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVPdGhlciIgbXNnaWQ9IjM5NTE3ODExMzE1NzAxMjQwODIiPiJEacSfZXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlQ3VzdG9tIiBtc2dpZD0iMjI1NTIzNDE1MzcyMDg4MzIyIj4iw5Z6ZWwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJjb250YWN0X3N0YXR1c191cGRhdGVfYXR0cmlidXRpb24iIG1zZ2lkPSI1MTEyNTg5ODg2MDk0NDAyNzk1Ij4iPHhsaWZmOmcgaWQ9IlNPVVJDRSI+JTEkczwveGxpZmY6Zz4gYXJhY8SxbMSxxJ/EsXlsYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbl93aXRoX2RhdGUiIG1zZ2lkPSI1OTQ1Mzg2Mzc2MzY5OTc5OTA5Ij4iPHhsaWZmOmcgaWQ9IlNPVVJDRSI+JTIkczwveGxpZmY6Zz4gaWxlIDx4bGlmZjpnIGlkPSJEQVRFIj4lMSRzPC94bGlmZjpnPiB0YXJpaGluZGUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9waW5fY29kZSIgbXNnaWQ9IjM3MzE0ODg4MjcyMTg4NzYxMTUiPiJQSU4ga29kdW51IGdpciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bhc3N3b3JkX2NvZGUiIG1zZ2lkPSI5MTM4MTU4MzQ0ODEzMjEzNzU0Ij4iS2lsaWRpIGHDp21hayBpw6dpbiDFn2lmcmV5aSBnaXJpbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bpbl9wYXNzd29yZF9jb2RlIiBtc2dpZD0iNjM4MzQ3MDc1NjI1NDkxNTE0Ij4iS2lsaWRpIGHDp21hayBpw6dpbiBQSU5cJ2kgZ2lyaW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF93cm9uZ19waW5fY29kZSIgbXNnaWQ9IjEyOTU5ODQxMTQzMzgxMDc3MTgiPiJZYW5sxLHFnyBQSU4ga29kdSEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9sYWJlbF90ZXh0IiBtc2dpZD0iODYxNzk2NDYxMDI4Mjk4NDI0Ij4iS2lsaWRpIGHDp21hayBpw6dpbiDDtm5jZSBNZW7DvFwneWUsIHNvbnJhIDBcJ2EgYmFzxLFuLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVtZXJnZW5jeV9jYWxsX2RpYWxvZ19udW1iZXJfZm9yX2Rpc3BsYXkiIG1zZ2lkPSI2OTYxOTIxMDMxOTUwOTA5NzAiPiJBY2lsIGR1cnVtIG51bWFyYXPEsSI8L3N0cmluZz4KQEAgLTU0NSw2ICs1NDgsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9yZXR1cm5fdG9fY2FsbCIgbXNnaWQ9IjUyNDQyNTk3ODU1MDAwNDAwMjEiPiLDh2HEn3LEsXlhIGTDtm4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BhdHRlcm5fY29ycmVjdCIgbXNnaWQ9IjkwMzkwMDg2NTAzNjIyNjEyMzciPiJEb8SfcnUhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXR0ZXJuX3dyb25nIiBtc2dpZD0iNDgxNzU4MzI3OTA1MzExMjMxMiI+IsOcemfDvG7DvHosIGzDvHRmZW4geWVuaWRlbiBkZW5leWluIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXNzd29yZF93cm9uZyIgbXNnaWQ9IjYyMzc0NDM2NTczNTgxNjg4MTkiPiJNYWFsZXNlZiwgdGVrcmFyIGRlbmV5aW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BsdWdnZWRfaW4iIG1zZ2lkPSI2MTMzNDM4NTI4NDI5NDQ0MzUiPiLFnmFyaiBvbHV5b3IgKDx4bGlmZjpnIGlkPSJQRVJDRU5UIj4lJTwveGxpZmY6Zz48eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz4pIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9jaGFyZ2VkIiBtc2dpZD0iNDkzODkzMDQ1OTYyMDk4OTk3MiI+IsWeYXJqIG9sZHUuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9iYXR0ZXJ5X3Nob3J0IiBtc2dpZD0iMzYxNzU0OTE3ODYwMzM1NDY1NiI+Ijx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPiA8eGxpZmY6ZyBpZD0iUEVSQ0VOVCI+JSU8L3hsaWZmOmc+Ijwvc3RyaW5nPgpAQCAtNTU5LDYgKzU2Myw4IEBACiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3NpbV9sb2NrZWRfbWVzc2FnZSIgbXNnaWQ9IjgwNjY2NjAxMjkyMDYwMDEwMzkiPiJTSU0ga2FydCBraWxpdGxpLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fc2ltX3VubG9ja19wcm9ncmVzc19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjU5NTMyMzIxNDA1Mjg4MTI2NCI+IlNJTSBrYXJ0IGtpbGlkaSBhw6fEsWzEsXlvcuKApiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iMzUxNDc0MjEwNjA2Njg3NzQ3NiI+IktpbGl0IGHDp21hIGRlc2VuaW5pemkgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4ga2V6IHlhbmzEscWfIMOnaXpkaW5pei4gIlxuXG4iTMO8dGZlbiA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBzYW5peWUgacOnaW5kZSB5ZW5pZGVuIGRlbmV5aW4uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfcGFzc3dvcmRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI0OTA2MDM0Mzc2NDI1MTc1MzgxIj4ixZ5pZnJlbml6aSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiBrZXogeWFubMSxxZ8gZ2lyZGluaXouICJcblxuIkzDvHRmZW4gPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gc2FuaXllIGnDp2luZGUgeWVuaWRlbiBkZW5leWluLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX3Bpbl9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjY4Mjc3NDkyMzE0NjUxNDU1OTAiPiJQSU5cJ2luaXppIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IGtleiB5YW5sxLHFnyBnaXJkaW5pei4gIlxuXG4iTMO8dGZlbiA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBzYW5peWUgacOnaW5kZSB5ZW5pZGVuIGRlbmV5aW4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9mYWlsZWRfYXR0ZW1wdHNfYWxtb3N0X2dsb2dpbiIgbXNnaWQ9IjMzNTEwMTM4NDIzMjAxMjc4MjciPiJLaWxpdCBhw6dtYSBkZXNlbmluaXppIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IGtleiB5YW5sxLHFnyDDp2l6ZGluaXouIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IGJhxZ9hcsSxc8SxeiBkZW5lbWVkZW4gc29ucmEgdGVsZWZvbnVudXp1IEdvb2dsZSBvdHVydW0gYcOnbWEgYmlsZ2lsZXJpbml6aSBrdWxsYW5hcmFrIGHDp21hbsSxeiBpc3RlbmlyLiJcblxuIiBMw7x0ZmVuIDx4bGlmZjpnIGlkPSJOVU1CRVJfMiI+JWQ8L3hsaWZmOmc+IHNhbml5ZSBpw6dpbmRlIHllbmlkZW4gZGVuZXlpbi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9hdHRlbXB0c19jb3VudGRvd24iIG1zZ2lkPSI2MjUxNDgwMzQzMzk0Mzg5NjY1Ij4iPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+IHNhbml5ZSBpw6dpbmRlIHllbmlkZW4gZGVuZXlpbi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2ZvcmdvdF9wYXR0ZXJuX2J1dHRvbl90ZXh0IiBtc2dpZD0iMjYyNjk5OTQ0OTYxMDY5NTkzMCI+IkRlc2VuaSB1bnV0dHVudXogbXU/Ijwvc3RyaW5nPgpAQCAtNzAzLDE1ICs3MDksMTcgQEAKICAgICA8c3RyaW5nIG5hbWU9ImVsYXBzZWRfdGltZV9zaG9ydF9mb3JtYXRfbW1fc3MiIG1zZ2lkPSI0NDMxNTU1OTQzODI4NzExNDczIj4iPHhsaWZmOmcgaWQ9Ik1JTlVURVMiPiUxJDAyZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9IlNFQ09ORFMiPiUyJDAyZDwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJlbGFwc2VkX3RpbWVfc2hvcnRfZm9ybWF0X2hfbW1fc3MiIG1zZ2lkPSIxODQ2MDcxOTk3NjE2NjU0MTI0Ij4iPHhsaWZmOmcgaWQ9IkhPVVJTIj4lMSRkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iTUlOVVRFUyI+JTIkMDJkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iU0VDT05EUyI+JTMkMDJkPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNlbGVjdEFsbCIgbXNnaWQ9IjY4NzY1MTg5MjU4NDQxMjkzMzEiPiJUw7xtw7xuw7wgc2XDpyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InNlbGVjdFRleHQiIG1zZ2lkPSIzODg5MTQ5MTIzNjI2ODg4NjM3Ij4iTWV0aW4gc2XDpyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InN0b3BTZWxlY3RpbmdUZXh0IiBtc2dpZD0iNDE1NzkzMTQ2Mzg3MjMyMDk5NiI+Ik1ldGluIHNlw6dtZXlpIGR1cmR1ciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImN1dCIgbXNnaWQ9IjMwOTI1Njk0MDg0Mzg2MjYyNjEiPiJLZXMiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjb3B5IiBtc2dpZD0iMjY4MTk0NjIyOTUzMzUxMTk4NyI+IktvcHlhbGEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwYXN0ZSIgbXNnaWQ9IjU2Mjk4ODA4MzY4MDUwMzY0MzMiPiJZYXDEscWfdMSxciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNvcHlVcmwiIG1zZ2lkPSIyNTM4MjExNTc5NTk2MDY3NDAyIj4iVVJMXCd5aSBrb3B5YWxhIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNlbGVjdFRleHRNb2RlICg2NzM4NTU2MzQ4ODYxMzQ3MjQwKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHRleHRTZWxlY3Rpb25DQUJUaXRsZSAoNTIzNjg1MDM5NDM3MDgyMDM1NykgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9ImlucHV0TWV0aG9kIiBtc2dpZD0iMTY1MzYzMDA2MjMwNDU2Nzg3OSI+IkdpcmnFnyB5w7ZudGVtaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImFkZFRvRGljdGlvbmFyeSIgbXNnaWQ9Ijg3OTM2MjQ5OTE2ODY5NDg3MDkiPiJcIjx4bGlmZjpnIGlkPSJXT1JEIj4lczwveGxpZmY6Zz5cIiBrZWxpbWVzaW5pIHPDtnpsw7zEn2UgZWtsZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImVkaXRUZXh0TWVudVRpdGxlIiBtc2dpZD0iMTY3Mjk4OTE3Njk1ODU4MTQ1MiI+Ik1ldGluIGTDvHplbmxlIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGVkaXRUZXh0TWVudVRpdGxlICg0OTA5MTM1NTY0OTQxODE1NDk0KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0ibG93X2ludGVybmFsX3N0b3JhZ2Vfdmlld190aXRsZSIgbXNnaWQ9IjEzOTk3MzI0MDg3MDE2OTc1NDYiPiJZZXIgYXoiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb3dfaW50ZXJuYWxfc3RvcmFnZV92aWV3X3RleHQiIG1zZ2lkPSI2MzUxMDY1NDQ2MTYzNzg4MzYiPiJUZWxlZm9udW4gZGVwb2xhbWEgYWxhbsSxIGF6YWzEsXlvci4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvayIgbXNnaWQ9IjU5NzAwNjA0MzA1NjI1MjQ5MTAiPiJUYW1hbSI8L3N0cmluZz4KQEAgLTcxOSw2ICs3MjcsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ieWVzIiBtc2dpZD0iNTM2Mjk4MjMwMzMzNzk2OTMxMiI+IlRhbWFtIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibm8iIG1zZ2lkPSI1MTQxNTMxMDQ0OTM1NTQxNDk3Ij4ixLBwdGFsIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGlhbG9nX2FsZXJ0X3RpdGxlIiBtc2dpZD0iMjA0OTY1ODcwODYwOTA0MzEwMyI+IkRpa2thdCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvYWRpbmciIG1zZ2lkPSIxNzYwNzI0OTk4OTI4MjU1MjUwIj4iWcO8a2xlbml5b3IuLi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXBpdGFsX29uIiBtc2dpZD0iMTU0NDY4Mjc1NTUxNDQ5NDI5OCI+IkHDh0lLIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FwaXRhbF9vZmYiIG1zZ2lkPSI2ODE1ODcwMzg2OTcyODA1ODMyIj4iS0FQQUxJIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0id2hpY2hBcHBsaWNhdGlvbiIgbXNnaWQ9IjQ1MzMxODU5NDcwNjQ3NzMzODYiPiLEsMWfbGVtaSDFn3VudSBrdWxsYW5hcmFrIHRhbWFtbGEiPC9zdHJpbmc+CkBAIC04NTMsMTMgKzg2MiwxNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ibDJ0cF9pcHNlY19wc2tfdnBuX2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzk0NTA0MzU2NDAwODMwMzIzOSI+IkwyVFAvSVBTZWMgVlBOIHRlbWVsbGkgw7ZuY2VkZW4gcGF5bGHFn8SxbG3EscWfIGFuYWh0YXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsMnRwX2lwc2VjX2NydF92cG5fZGVzY3JpcHRpb24iIG1zZ2lkPSI1MzgyNzE0MDczMTAzNjUzNTc3Ij4iTDJUUC9JUFNlYyBWUE4gdGVtZWxsaSBzZXJ0aWZpa2EiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1cGxvYWRfZmlsZSIgbXNnaWQ9IjI4OTc5NTcxNzIzNjY3MzA0MTYiPiJEb3N5YSBzZcOnIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fZmlsZV9jaG9zZW4iIG1zZ2lkPSI2MzYzNjQ4NTYyMTcwNzU5NDY1Ij4iU2XDp2lsaSBkb3N5YSB5b2siPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJyZXNldCIgbXNnaWQ9IjI0NDgxNjgwODA5NjQyMDk5MDgiPiJTxLFmxLFybGEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzdWJtaXQiIG1zZ2lkPSIxNjAyMzM1NTcyMDg5OTExOTQxIj4iR8O2bmRlciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImRlc2NyaXB0aW9uX3N0YXIiIG1zZ2lkPSIyNjU0MzE5ODc0OTA4NTc2MTMzIj4iZmF2b3JpIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FyX21vZGVfZGlzYWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSIzMTY0NzY4MjEyMDAzODY0MzE2Ij4iQXJhYmEgbW9kdSBldGtpbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcl9tb2RlX2Rpc2FibGVfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI2Njg2NjM2MjY3MjE2NzU2MTQiPiJBcmFiYSBtb2R1bmRhbiDDp8Sxa21hayBpw6dpbiBzZcOnaW4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGV0aGVyZWRfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iMzE0NjY5NDIzNDM5ODIwMjYwMSI+IkRvxJ9ydWRhbiBiYcSfbGFudMSxIHZleWEgb3J0YWsgZXJpxZ9pbSBub2t0YXPEsSBldGtpbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRldGhlcmVkX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMzA2NzEwODMyMzkwMzA0ODkyNyI+IllhcMSxbGFuZMSxcm1hayBpw6dpbiBkb2t1bnVuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iYmFja19idXR0b25fbGFiZWwiIG1zZ2lkPSIyMzAwNDcwMDA0NTAzMzQzNDM5Ij4iR2VyaSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5leHRfYnV0dG9uX2xhYmVsIiBtc2dpZD0iMTA4MDU1NTEwNDY3Nzk5MjQwOCI+IsSwbGVyaSI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBza2lwX2J1dHRvbl9sYWJlbCAoMTI3NTM2MjI5OTQ3MTYzMTgxOSkgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlX3dhcm5pbmdfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNDg5MDg5NDI2NzQ1NDg2NzI3NiI+IlnDvGtzZWsgZMO8emV5ZGUgbW9iaWwgdmVyaSBrdWxsYW7EsW3EsSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlX3dhcm5pbmdfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIyNjA5NzM0NzYzODQ1NzA1NzA4Ij4iTW9iaWwgdmVyaSBrdWxsYW7EsW3EsSBoYWtrxLFuZGEgZGFoYSBmYXpsYSBiaWxnaSBlZGlubWVrIGnDp2luIGRva3VudW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZWRfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNjI2OTU0MTg5NzcyOTc4MTMzMiI+Ik1vYmlsIHZlcmkgbGltaXRpIGHFn8SxbGTEsSI8L3N0cmluZz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMteGxhcmdlL2NvbmZpZy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXhsYXJnZS9jb25maWcueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5MmVkMTEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXhsYXJnZS9jb25maWcueG1sCkBAIC0wLDAgKzEsMzMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisvKgorKiogQ29weXJpZ2h0IDIwMDksIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorCis8IS0tIFRoZXNlIHJlc291cmNlcyBhcmUgYXJvdW5kIGp1c3QgdG8gYWxsb3cgdGhlaXIgdmFsdWVzIHRvIGJlIGN1c3RvbWl6ZWQKKyAgICAgZm9yIGRpZmZlcmVudCBoYXJkd2FyZSBhbmQgcHJvZHVjdCBidWlsZHMuIC0tPgorPHJlc291cmNlcyB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+CisgICAgPCEtLSBDb21wb25lbnQgdG8gYmUgdXNlZCBhcyB0aGUgc3RhdHVzIGJhciBzZXJ2aWNlLiAgTXVzdCBpbXBsZW1lbnQgdGhlIElTdGF0dXNCYXIKKyAgICAgICAgIGludGVyZmFjZS4gIFRoaXMgbmFtZSBpcyBpbiB0aGUgQ29tcG9uZW50TmFtZSBmbGF0dGVuZWQgZm9ybWF0IChwYWNrYWdlL2NsYXNzKSAgLS0+CisgICAgPHN0cmluZyBuYW1lPSJjb25maWdfc3RhdHVzQmFyQ29tcG9uZW50Ij5jb20uYW5kcm9pZC5zeXN0ZW11aS9jb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIudGFibGV0LlRhYmxldFN0YXR1c0JhclNlcnZpY2U8L3N0cmluZz4KKyAgICA8Ym9vbCBuYW1lPSJjb25maWdfc3RhdHVzQmFyQ2FuSGlkZSI+ZmFsc2U8L2Jvb2w+CisKKyAgICA8IS0tIFNob3cgc2xpZGluZyB0YWIgYmVmb3JlIGxvY2tzY3JlZW4gLS0+CisgICAgPGJvb2wgbmFtZT0iY29uZmlnX2VuYWJsZVNsaWRpbmdUYWJGaXJzdCI+ZmFsc2U8L2Jvb2w+CisgICAgPCEtLSBFbmFibGUgbG9ja3NjcmVlbiByb3RhdGlvbiAtLT4KKyAgICA8Ym9vbCBuYW1lPSJjb25maWdfZW5hYmxlTG9ja1NjcmVlblJvdGF0aW9uIj50cnVlPC9ib29sPgorPC9yZXNvdXJjZXM+CisKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMteGxhcmdlL2RpbWVucy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXhsYXJnZS9kaW1lbnMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhMTZkYTcKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXhsYXJnZS9kaW1lbnMueG1sCkBAIC0wLDAgKzEsMzMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisvKiAvL2RldmljZS9hcHBzL2NvbW1vbi9hc3NldHMvcmVzL2FueS9kaW1lbnMueG1sCisqKgorKiogQ29weXJpZ2h0IDIwMDYsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKzxyZXNvdXJjZXM+CisgICAgPGRpbWVuIG5hbWU9InN0YXR1c19iYXJfaGVpZ2h0Ij41MGRpcDwvZGltZW4+CisgICAgPCEtLSBIZWlnaHQgb2YgdGhlIHN0YXR1cyBiYXIgLS0+CisgICAgPGRpbWVuIG5hbWU9InN0YXR1c19iYXJfaWNvbl9zaXplIj41MGRpcDwvZGltZW4+CisgICAgPCEtLSBNYXJnaW4gYXQgdGhlIGVkZ2Ugb2YgdGhlIHNjcmVlbiB0byBpZ25vcmUgdG91Y2ggZXZlbnRzIGZvciBpbiB0aGUgd2luZG93c2hhZGUuIC0tPgorICAgIDwhLS0gTWFyZ2luIGZvciBwZXJtYW5lbnQgc2NyZWVuIGRlY29yYXRpb25zIGF0IHRoZSBib3R0b20uIC0tPgorICAgIDxkaW1lbiBuYW1lPSJzY3JlZW5fbWFyZ2luX2JvdHRvbSI+NTBkaXA8L2RpbWVuPgorICAgIAorICAgIDwhLS0gRGVmYXVsdCBoZWlnaHQgb2YgYSBrZXkgaW4gdGhlIHBhc3N3b3JkIGtleWJvYXJkIGZvciBhbHBoYSAtLT4KKyAgICA8ZGltZW4gbmFtZT0icGFzc3dvcmRfa2V5Ym9hcmRfa2V5X2hlaWdodF9hbHBoYSI+MC4zNWluPC9kaW1lbj4KKyAgICA8IS0tIERlZmF1bHQgaGVpZ2h0IG9mIGEga2V5IGluIHRoZSBwYXNzd29yZCBrZXlib2FyZCBmb3IgbnVtZXJpYyAtLT4KKyAgICA8ZGltZW4gbmFtZT0icGFzc3dvcmRfa2V5Ym9hcmRfa2V5X2hlaWdodF9udW1lcmljIj4wLjQ3aW48L2RpbWVuPgorPC9yZXNvdXJjZXM+CisKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMteGxhcmdlL3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy14bGFyZ2Uvc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmMyMGJlNgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMteGxhcmdlL3N0cmluZ3MueG1sCkBAIC0wLDAgKzEsMjUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisvKiAvL2RldmljZS9hcHBzL2NvbW1vbi9hc3NldHMvcmVzL2FueS9zdHJpbmdzLnhtbAorKioKKyoqIENvcHlyaWdodCAyMDEwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLS0+Cis8cmVzb3VyY2VzIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KKworICAgIDwhLS0gRG8gbm90IHRyYW5zbGF0ZS4gIFdlYlZpZXcgVXNlciBBZ2VudCB0YXJnZXRlZCBjb250ZW50IC0tPgorICAgIDxzdHJpbmcgbmFtZT0id2ViX3VzZXJfYWdlbnRfdGFyZ2V0X2NvbnRlbnQiIHRyYW5zbGF0YWJsZT0iZmFsc2UiPjwvc3RyaW5nPgorCis8L3Jlc291cmNlcz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXhsYXJnZS9zdHlsZXMueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy14bGFyZ2Uvc3R5bGVzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjdkZjdjCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy14bGFyZ2Uvc3R5bGVzLnhtbApAQCAtMCwwICsxLDM5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICAKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHJlc291cmNlcz4KKyAgICA8IS0tIFN0YXR1cyBCYXIgU3R5bGVzIC0tPgorCisgICAgPHN0eWxlIG5hbWU9IlRleHRBcHBlYXJhbmNlLlN0YXR1c0JhciI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dEFwcGVhcmFuY2UiPj9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VTbWFsbDwvaXRlbT4KKyAgICA8L3N0eWxlPgorICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5TdGF0dXNCYXIuVGlja2VyIj4KKyAgICA8L3N0eWxlPgorICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5TdGF0dXNCYXIuVGl0bGUiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRTdHlsZSI+Ym9sZDwvaXRlbT4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IlRleHRBcHBlYXJhbmNlLlN0YXR1c0Jhci5JY29uIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0U3R5bGUiPmJvbGQ8L2l0ZW0+CisgICAgPC9zdHlsZT4KKyAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuU3RhdHVzQmFyLkV2ZW50Q29udGVudCI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9yIj4/YW5kcm9pZDphdHRyL3RleHRDb2xvclByaW1hcnk8L2l0ZW0+CisgICAgPC9zdHlsZT4KKyAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuU3RhdHVzQmFyLkV2ZW50Q29udGVudC5UaXRsZSI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dFNpemUiPjE4c3A8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dFN0eWxlIj5ib2xkPC9pdGVtPgorICAgIDwvc3R5bGU+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtemgtckNOL3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy16aC1yQ04vc3RyaW5ncy54bWwKaW5kZXggYWEzZjEyZC4uZmY1ZDBlOSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy16aC1yQ04vc3RyaW5ncy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy16aC1yQ04vc3RyaW5ncy54bWwKQEAgLTQzNiw2ICs0MzYsMTAgQEAKICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfZm9yY2VMb2NrIiBtc2dpZD0iMjgxOTg2ODY2NDk0NjA4OTc0MCI+IuaOp+WItuS9leaXtumUgeWumuiuvuWkh++8jOi/memcgOimgeaCqOmHjeaWsOi+k+WFpeWvhueggeOAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl93aXBlRGF0YSIgbXNnaWQ9IjM5MTA1NDU0NDY3NTg2Mzk3MTMiPiLmuIXpmaTmiYDmnInmlbDmja4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3dpcGVEYXRhIiBtc2dpZD0iMjMxNDA2MDkzMzc5NjM5NjIwNSI+IuaBouWkjeWHuuWOguiuvue9ru+8jOi/meS8muWcqOS4jeaPkOekuuehruiupOeahOaDheWGteS4i+WIoOmZpOaCqOeahOaJgOacieaVsOaNruOAgiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwb2xpY3lsYWJfc2V0R2xvYmFsUHJveHkgKDI3ODQ4MjgyOTM3NDc3OTE0NDYpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcG9saWN5ZGVzY19zZXRHbG9iYWxQcm94eSAoNjM4NzQ5NzQ2NjY2MDE1NDkzMSkgLS0+CisgICAgPHNraXAgLz4KICAgPHN0cmluZy1hcnJheSBuYW1lPSJwaG9uZVR5cGVzIj4KICAgICA8aXRlbSBtc2dpZD0iODkwMTA5ODMzNjY1ODcxMDM1OSI+IuS9j+WuhSI8L2l0ZW0+CiAgICAgPGl0ZW0gbXNnaWQ9Ijg2OTkyMzY1MDUyNzEzNjYxNSI+IuaJi+acuiI8L2l0ZW0+CkBAIC01MjksMTAgKzUzMyw5IEBACiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlV29yayIgbXNnaWQ9IjI5MjY4ODcwNTA1MzYzODcyIj4i5YWs5Y+4Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZU90aGVyIiBtc2dpZD0iMzk1MTc4MTEzMTU3MDEyNDA4MiI+IuWFtuS7liI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVDdXN0b20iIG1zZ2lkPSIyMjU1MjM0MTUzNzIwODgzMjIiPiLoh6rlrprkuYkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJjb250YWN0X3N0YXR1c191cGRhdGVfYXR0cmlidXRpb24iIG1zZ2lkPSI1MTEyNTg5ODg2MDk0NDAyNzk1Ij4i6YCa6L+HIDx4bGlmZjpnIGlkPSJTT1VSQ0UiPiUxJHM8L3hsaWZmOmc+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iY29udGFjdF9zdGF0dXNfdXBkYXRlX2F0dHJpYnV0aW9uX3dpdGhfZGF0ZSIgbXNnaWQ9IjU5NDUzODYzNzYzNjk5Nzk5MDkiPiLml7bpl7TvvJo8eGxpZmY6ZyBpZD0iREFURSI+JTEkczwveGxpZmY6Zz7vvIzmlrnlvI/vvJo8eGxpZmY6ZyBpZD0iU09VUkNFIj4lMiRzPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bpbl9jb2RlIiBtc2dpZD0iMzczMTQ4ODgyNzIxODg3NjExNSI+Iui+k+WFpSBQSU4g56CBIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGFzc3dvcmRfY29kZSIgbXNnaWQ9IjkxMzgxNTgzNDQ4MTMyMTM3NTQiPiLovpPlhaXlr4bnoIHov5vooYzop6PplIEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9waW5fcGFzc3dvcmRfY29kZSIgbXNnaWQ9IjYzODM0NzA3NTYyNTQ5MTUxNCI+Iui+k+WFpSBQSU4g6L+b6KGM6Kej6ZSBIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfd3JvbmdfcGluX2NvZGUiIG1zZ2lkPSIxMjk1OTg0MTE0MzM4MTA3NzE4Ij4iUElOIOeggeS4jeato+ehru+8gSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX2xhYmVsX3RleHQiIG1zZ2lkPSI4NjE3OTY0NjEwMjgyOTg0MjQiPiLopoHop6PplIHvvIzor7flhYjmjIkgTUVOVSDlho3mjIkgMOOAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVtZXJnZW5jeV9jYWxsX2RpYWxvZ19udW1iZXJfZm9yX2Rpc3BsYXkiIG1zZ2lkPSI2OTYxOTIxMDMxOTUwOTA5NzAiPiLmgKXmlZHmiJbmiqXorabnlLXor50iPC9zdHJpbmc+CkBAIC01NDUsNiArNTQ4LDcgQEAKICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcmV0dXJuX3RvX2NhbGwiIG1zZ2lkPSI1MjQ0MjU5Nzg1NTAwMDQwMDIxIj4i6L+U5Zue6YCa6K+dIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXR0ZXJuX2NvcnJlY3QiIG1zZ2lkPSI5MDM5MDA4NjUwMzYyMjYxMjM3Ij4i5q2j56Gu77yBIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXR0ZXJuX3dyb25nIiBtc2dpZD0iNDgxNzU4MzI3OTA1MzExMjMxMiI+IuW+iOaKseatie+8jOivt+mHjeivlSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGFzc3dvcmRfd3JvbmciIG1zZ2lkPSI2MjM3NDQzNjU3MzU4MTY4ODE5Ij4i5b6I5oqx5q2J77yM6K+36YeN6K+VIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wbHVnZ2VkX2luIiBtc2dpZD0iNjEzMzQzODUyODQyOTQ0NDM1Ij4i5q2j5Zyo5YWF55S1ICg8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz48eGxpZmY6ZyBpZD0iUEVSQ0VOVCI+JSU8L3hsaWZmOmc+KSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fY2hhcmdlZCIgbXNnaWQ9IjQ5Mzg5MzA0NTk2MjA5ODk5NzIiPiLlt7LlhYXmu6HjgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2JhdHRlcnlfc2hvcnQiIG1zZ2lkPSIzNjE3NTQ5MTc4NjAzMzU0NjU2Ij4iPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+PHhsaWZmOmcgaWQ9IlBFUkNFTlQiPiUlPC94bGlmZjpnPiI8L3N0cmluZz4KQEAgLTU1OSw2ICs1NjMsOCBAQAogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9zaW1fbG9ja2VkX21lc3NhZ2UiIG1zZ2lkPSI4MDY2NjYwMTI5MjA2MDAxMDM5Ij4iU0lNIOWNoeiiq+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+8nyI8L3N0cmluZz4KQEAgLTcwMywxNSArNzA5LDE3IEBACiAgICAgPHN0cmluZyBuYW1lPSJlbGFwc2VkX3RpbWVfc2hvcnRfZm9ybWF0X21tX3NzIiBtc2dpZD0iNDQzMTU1NTk0MzgyODcxMTQ3MyI+Ijx4bGlmZjpnIGlkPSJNSU5VVEVTIj4lMSQwMmQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJTRUNPTkRTIj4lMiQwMmQ8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZWxhcHNlZF90aW1lX3Nob3J0X2Zvcm1hdF9oX21tX3NzIiBtc2dpZD0iMTg0NjA3MTk5NzYxNjY1NDEyNCI+Ijx4bGlmZjpnIGlkPSJIT1VSUyI+JTEkZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9Ik1JTlVURVMiPiUyJDAyZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9IlNFQ09ORFMiPiUzJDAyZDwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RBbGwiIG1zZ2lkPSI2ODc2NTE4OTI1ODQ0MTI5MzMxIj4i5YWo6YCJIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0VGV4dCIgbXNnaWQ9IjM4ODkxNDkxMjM2MjY4ODg2MzciPiLpgInmi6nmloflrZciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJzdG9wU2VsZWN0aW5nVGV4dCIgbXNnaWQ9IjQxNTc5MzE0NjM4NzIzMjA5OTYiPiLlgZzmraLpgInmi6nmloflrZciPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjdXQiIG1zZ2lkPSIzMDkyNTY5NDA4NDM4NjI2MjYxIj4i5Ymq5YiHIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY29weSIgbXNnaWQ9IjI2ODE5NDYyMjk1MzM1MTE5ODciPiLlpI3liLYiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwYXN0ZSIgbXNnaWQ9IjU2Mjk4ODA4MzY4MDUwMzY0MzMiPiLnspjotLQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjb3B5VXJsIiBtc2dpZD0iMjUzODIxMTU3OTU5NjA2NzQwMiI+IuWkjeWItue9keWdgCI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzZWxlY3RUZXh0TW9kZSAoNjczODU1NjM0ODg2MTM0NzI0MCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciB0ZXh0U2VsZWN0aW9uQ0FCVGl0bGUgKDUyMzY4NTAzOTQzNzA4MjAzNTcpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJpbnB1dE1ldGhvZCIgbXNnaWQ9IjE2NTM2MzAwNjIzMDQ1Njc4NzkiPiLovpPlhaXms5UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJhZGRUb0RpY3Rpb25hcnkiIG1zZ2lkPSI4NzkzNjI0OTkxNjg2OTQ4NzA5Ij4i5bCG4oCcPHhsaWZmOmcgaWQ9IldPUkQiPiVzPC94bGlmZjpnPuKAnea3u+WKoOWIsOivjeWFuCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImVkaXRUZXh0TWVudVRpdGxlIiBtc2dpZD0iMTY3Mjk4OTE3Njk1ODU4MTQ1MiI+Iue8lui+keaWh+WtlyI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBlZGl0VGV4dE1lbnVUaXRsZSAoNDkwOTEzNTU2NDk0MTgxNTQ5NCkgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9Imxvd19pbnRlcm5hbF9zdG9yYWdlX3ZpZXdfdGl0bGUiIG1zZ2lkPSIxMzk5NzMyNDA4NzAxNjk3NTQ2Ij4i5a2Y5YKo56m66Ze05LiN6LazIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG93X2ludGVybmFsX3N0b3JhZ2Vfdmlld190ZXh0IiBtc2dpZD0iNjM1MTA2NTQ0NjE2Mzc4ODM2Ij4i5omL5py65YaF5a2Y56m66Ze05omA5Ymp5LiN5aSa5LqG44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ib2siIG1zZ2lkPSI1OTcwMDYwNDMwNTYyNTI0OTEwIj4i56Gu5a6aIjwvc3RyaW5nPgpAQCAtNzE5LDYgKzcyNyw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJ5ZXMiIG1zZ2lkPSI1MzYyOTgyMzAzMzM3OTY5MzEyIj4i56Gu5a6aIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibm8iIG1zZ2lkPSI1MTQxNTMxMDQ0OTM1NTQxNDk3Ij4i5Y+W5raIIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGlhbG9nX2FsZXJ0X3RpdGxlIiBtc2dpZD0iMjA0OTY1ODcwODYwOTA0MzEwMyI+IuazqOaEjyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvYWRpbmciIG1zZ2lkPSIxNzYwNzI0OTk4OTI4MjU1MjUwIj4i5q2j5Zyo6L295YWlLi4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FwaXRhbF9vbiIgbXNnaWQ9IjE1NDQ2ODI3NTU1MTQ0OTQyOTgiPiLmiZPlvIAiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXBpdGFsX29mZiIgbXNnaWQ9IjY4MTU4NzAzODY5NzI4MDU4MzIiPiLlhbPpl60iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ3aGljaEFwcGxpY2F0aW9uIiBtc2dpZD0iNDUzMzE4NTk0NzA2NDc3MzM4NiI+IuS9v+eUqOS7peS4i+aWueW8j+WPkemAgSI8L3N0cmluZz4KQEAgLTg1MywxMyArODYyLDE3IEBACiAgICAgPHN0cmluZyBuYW1lPSJsMnRwX2lwc2VjX3Bza192cG5fZGVzY3JpcHRpb24iIG1zZ2lkPSIzOTQ1MDQzNTY0MDA4MzAzMjM5Ij4i5Z+65LqO6aKE5YWx5Lqr5a+G6ZKl55qEIEwyVFAvSVBTZWMgVlBOIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibDJ0cF9pcHNlY19jcnRfdnBuX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNTM4MjcxNDA3MzEwMzY1MzU3NyI+IuWfuuS6juivgeS5pueahCBMMlRQL0lQU2VjIFZQTiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVwbG9hZF9maWxlIiBtc2dpZD0iMjg5Nzk1NzE3MjM2NjczMDQxNiI+IumAieaLqeaWh+S7tiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5vX2ZpbGVfY2hvc2VuIiBtc2dpZD0iNjM2MzY0ODU2MjE3MDc1OTQ2NSI+IuacqumAieWumuS7u+S9leaWh+S7tiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InJlc2V0IiBtc2dpZD0iMjQ0ODE2ODA4MDk2NDIwOTkwOCI+IumHjee9riI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InN1Ym1pdCIgbXNnaWQ9IjE2MDIzMzU1NzIwODk5MTE5NDEiPiLmj5DkuqQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJkZXNjcmlwdGlvbl9zdGFyIiBtc2dpZD0iMjY1NDMxOTg3NDkwODU3NjEzMyI+IuaUtuiXjyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcl9tb2RlX2Rpc2FibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iMzE2NDc2ODIxMjAwMzg2NDMxNiI+IuW3suWQr+eUqOi9pui9veaooeW8jyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcl9tb2RlX2Rpc2FibGVfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI2Njg2NjM2MjY3MjE2NzU2MTQiPiLpgInmi6npgIDlh7rovabovb3mqKHlvI8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0ZXRoZXJlZF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSIzMTQ2Njk0MjM0Mzk4MjAyNjAxIj4iVVNCIOe7keWumuaIlueDreeCueW3suWQr+eUqCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRldGhlcmVkX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMzA2NzEwODMyMzkwMzA0ODkyNyI+IuinpuaRuOWPr+i/m+ihjOmFjee9riI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImJhY2tfYnV0dG9uX2xhYmVsIiBtc2dpZD0iMjMwMDQ3MDAwNDUwMzM0MzQzOSI+IuS4iuS4gOatpSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5leHRfYnV0dG9uX2xhYmVsIiBtc2dpZD0iMTA4MDU1NTEwNDY3Nzk5MjQwOCI+IuS4i+S4gOatpSI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBza2lwX2J1dHRvbl9sYWJlbCAoMTI3NTM2MjI5OTQ3MTYzMTgxOSkgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlX3dhcm5pbmdfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNDg5MDg5NDI2NzQ1NDg2NzI3NiI+IuaJi+acuua1gemHj+i/h+WkmiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlX3dhcm5pbmdfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIyNjA5NzM0NzYzODQ1NzA1NzA4Ij4i6L276Kem5Lul5LqG6Kej5pyJ5YWz5omL5py65rWB6YeP6K+m5oOFIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVkX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjYyNjk1NDE4OTc3Mjk3ODEzMzIiPiLlt7LotoXlh7rmiYvmnLrmlbDmja7kuIrpmZAiPC9zdHJpbmc+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXpoLXJUVy9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtemgtclRXL3N0cmluZ3MueG1sCmluZGV4IDViZjAzNDIuLjRkNDJhNGUgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtemgtclRXL3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtemgtclRXL3N0cmluZ3MueG1sCkBAIC00MzYsNiArNDM2LDEwIEBACiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX2ZvcmNlTG9jayIgbXNnaWQ9IjI4MTk4Njg2NjQ5NDYwODk3NDAiPiLoo53nva7pjpblrprmmYLlj6/lj5blvpfmjqfliLbvvIzkvYblv4XpoIjph43mlrDovLjlhaXlr4bnorzjgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfd2lwZURhdGEiIG1zZ2lkPSIzOTEwNTQ1NDQ2NzU4NjM5NzEzIj4i5riF6Zmk5omA5pyJ6LOH5paZIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY193aXBlRGF0YSIgbXNnaWQ9IjIzMTQwNjA5MzM3OTYzOTYyMDUiPiLph43oqK3ngrrljp/lu6DoqK3lrpogKOezu+e1seacg+WIqumZpOaJgOacieizh+aWme+8jOS4lOS4jeacg+WQkeaCqOmAsuihjOeiuuiqjSnjgIIiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcG9saWN5bGFiX3NldEdsb2JhbFByb3h5ICgyNzg0ODI4MjkzNzQ3NzkxNDQ2KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBvbGljeWRlc2Nfc2V0R2xvYmFsUHJveHkgKDYzODc0OTc0NjY2NjAxNTQ5MzEpIC0tPgorICAgIDxza2lwIC8+CiAgIDxzdHJpbmctYXJyYXkgbmFtZT0icGhvbmVUeXBlcyI+CiAgICAgPGl0ZW0gbXNnaWQ9Ijg5MDEwOTgzMzY2NTg3MTAzNTkiPiLkvY/lrrbpm7voqbEiPC9pdGVtPgogICAgIDxpdGVtIG1zZ2lkPSI4Njk5MjM2NTA1MjcxMzY2MTUiPiLooYzli5Xpm7voqbEiPC9pdGVtPgpAQCAtNTI5LDEwICs1MzMsOSBAQAogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZVdvcmsiIG1zZ2lkPSIyOTI2ODg3MDUwNTM2Mzg3MiI+IuWFrOWPuCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVPdGhlciIgbXNnaWQ9IjM5NTE3ODExMzE1NzAxMjQwODIiPiLlhbbku5YiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlQ3VzdG9tIiBtc2dpZD0iMjI1NTIzNDE1MzcyMDg4MzIyIj4i6Ieq6KiCIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iY29udGFjdF9zdGF0dXNfdXBkYXRlX2F0dHJpYnV0aW9uIiBtc2dpZD0iNTExMjU4OTg4NjA5NDQwMjc5NSI+IumAj+mBjiA8eGxpZmY6ZyBpZD0iU09VUkNFIj4lMSRzPC94bGlmZjpnPiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbl93aXRoX2RhdGUiIG1zZ2lkPSI1OTQ1Mzg2Mzc2MzY5OTc5OTA5Ij4iPHhsaWZmOmcgaWQ9IkRBVEUiPiUxJHM8L3hsaWZmOmc+6YCP6YGO44CMPHhsaWZmOmcgaWQ9IlNPVVJDRSI+JTIkczwveGxpZmY6Zz7jgI0iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9waW5fY29kZSIgbXNnaWQ9IjM3MzE0ODg4MjcyMTg4NzYxMTUiPiLovLjlhaUgUElOIOeivCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bhc3N3b3JkX2NvZGUiIG1zZ2lkPSI5MTM4MTU4MzQ0ODEzMjEzNzU0Ij4i6Ly45YWl5a+G56K85Y2z5Y+v6Kej6Y6WIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGluX3Bhc3N3b3JkX2NvZGUiIG1zZ2lkPSI2MzgzNDcwNzU2MjU0OTE1MTQiPiLovLjlhaUgUElOIOmAsuihjOino+mOliI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX3dyb25nX3Bpbl9jb2RlIiBtc2dpZD0iMTI5NTk4NDExNDMzODEwNzcxOCI+IlBJTiDnorzpjK/oqqTvvIEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9sYWJlbF90ZXh0IiBtc2dpZD0iODYxNzk2NDYxMDI4Mjk4NDI0Ij4i5aaC6KaB6Kej6Y6W77yM6KuL5oyJIE1lbnUg6Y2177yM54S25b6M5oyJIDDjgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJlbWVyZ2VuY3lfY2FsbF9kaWFsb2dfbnVtYmVyX2Zvcl9kaXNwbGF5IiBtc2dpZD0iNjk2MTkyMTAzMTk1MDkwOTcwIj4i57eK5oCl6Zu76Kmx6Jmf56K8Ijwvc3RyaW5nPgpAQCAtNTQ1LDYgKzU0OCw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3JldHVybl90b19jYWxsIiBtc2dpZD0iNTI0NDI1OTc4NTUwMDA0MDAyMSI+Iui/lOWbnumAmuipsSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGF0dGVybl9jb3JyZWN0IiBtc2dpZD0iOTAzOTAwODY1MDM2MjI2MTIzNyI+Iuato+eiuu+8gSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGF0dGVybl93cm9uZyIgbXNnaWQ9IjQ4MTc1ODMyNzkwNTMxMTIzMTIiPiLlvojmirHmrYnvvIzoq4vlho3oqabkuIDmrKEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Bhc3N3b3JkX3dyb25nIiBtc2dpZD0iNjIzNzQ0MzY1NzM1ODE2ODgxOSI+IuW+iOaKseatie+8jOiri+WGjeippuS4gOasoSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGx1Z2dlZF9pbiIgbXNnaWQ9IjYxMzM0Mzg1Mjg0Mjk0NDQzNSI+Iuato+WcqOWFhembuyAoPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+PHhsaWZmOmcgaWQ9IlBFUkNFTlQiPiUlPC94bGlmZjpnPikiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2NoYXJnZWQiIG1zZ2lkPSI0OTM4OTMwNDU5NjIwOTg5OTcyIj4i5YWF6Zu75a6M5oiQ44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9iYXR0ZXJ5X3Nob3J0IiBtc2dpZD0iMzYxNzU0OTE3ODYwMzM1NDY1NiI+Ijx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPjx4bGlmZjpnIGlkPSJQRVJDRU5UIj4lJTwveGxpZmY6Zz4iPC9zdHJpbmc+CkBAIC01NTksNiArNTYzLDggQEAKICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fc2ltX2xvY2tlZF9tZXNzYWdlIiBtc2dpZD0iODA2NjY2MDEyOTIwNjAwMTAzOSI+IlNJTSDljaHlt7LpjpblrprjgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3NpbV91bmxvY2tfcHJvZ3Jlc3NfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI1OTUzMjMyMTQwNTI4ODEyNjQiPiLop6PpjpYgU0lNIOWNoeS4rS4uLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iMzUxNDc0MjEwNjA2Njg3NzQ3NiI+IueVq+WHuuino+mOluWcluW9ouW3sumMr+iqpCA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiDmrKHjgIIiXG5cbiIg6KuL5ZyoIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IOenkuW+jOWGjeWYl+ippuOAgiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX3Bhc3N3b3JkX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNDkwNjAzNDM3NjQyNTE3NTM4MSI+IuaCqOW3siA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiDmrKHovLjlhaXkuI3mraPnorrnmoTlr4bnorzjgIIiXG5cbiLoq4vmlrwgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4g56eS5b6M5YaN6Kmm5LiA5qyh44CCIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfcGluX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNjgyNzc0OTIzMTQ2NTE0NTU5MCI+IuaCqOW3siA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiDmrKHovLjlhaXkuI3mraPnorrnmoQgUElO44CCIlxuXG4i6KuL5pa8IDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IOenkuW+jOWGjeippuS4gOasoeOAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fZmFpbGVkX2F0dGVtcHRzX2FsbW9zdF9nbG9naW4iIG1zZ2lkPSIzMzUxMDEzODQyMzIwMTI3ODI3Ij4i55Wr5Ye66Kej6Y6W5ZyW5b2i5bey6Yyv6KqkIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IOasoeOAguWGjemMr+iqpCA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiDmrKHlvozvvIzns7vntbHmnIPopoHmsYLkvb/nlKggR29vZ2xlIOeZu+WFpeS+huino+mOluOAgiJcblxuIiDoq4vlnKggPHhsaWZmOmcgaWQ9Ik5VTUJFUl8yIj4lZDwveGxpZmY6Zz4g56eS5b6M5YaN6Kmm5LiA5qyh44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfYXR0ZW1wdHNfY291bnRkb3duIiBtc2dpZD0iNjI1MTQ4MDM0MzM5NDM4OTY2NSI+Ijx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPiDnp5Llvozlho3oqabkuIDmrKHjgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2ZvcmdvdF9wYXR0ZXJuX2J1dHRvbl90ZXh0IiBtc2dpZD0iMjYyNjk5OTQ0OTYxMDY5NTkzMCI+IuW/mOiomOino+mOluWcluW9ou+8nyI8L3N0cmluZz4KQEAgLTcwMywxNSArNzA5LDE3IEBACiAgICAgPHN0cmluZyBuYW1lPSJlbGFwc2VkX3RpbWVfc2hvcnRfZm9ybWF0X21tX3NzIiBtc2dpZD0iNDQzMTU1NTk0MzgyODcxMTQ3MyI+Ijx4bGlmZjpnIGlkPSJNSU5VVEVTIj4lMSQwMmQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJTRUNPTkRTIj4lMiQwMmQ8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZWxhcHNlZF90aW1lX3Nob3J0X2Zvcm1hdF9oX21tX3NzIiBtc2dpZD0iMTg0NjA3MTk5NzYxNjY1NDEyNCI+Ijx4bGlmZjpnIGlkPSJIT1VSUyI+JTEkZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9Ik1JTlVURVMiPiUyJDAyZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9IlNFQ09ORFMiPiUzJDAyZDwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RBbGwiIG1zZ2lkPSI2ODc2NTE4OTI1ODQ0MTI5MzMxIj4i5YWo6YOo6YG45Y+WIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0VGV4dCIgbXNnaWQ9IjM4ODkxNDkxMjM2MjY4ODg2MzciPiLpgbjlj5bmloflrZciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJzdG9wU2VsZWN0aW5nVGV4dCIgbXNnaWQ9IjQxNTc5MzE0NjM4NzIzMjA5OTYiPiLlgZzmraLpgbjlj5bmloflrZciPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjdXQiIG1zZ2lkPSIzMDkyNTY5NDA4NDM4NjI2MjYxIj4i5Ymq5LiLIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY29weSIgbXNnaWQ9IjI2ODE5NDYyMjk1MzM1MTE5ODciPiLopIfoo70iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwYXN0ZSIgbXNnaWQ9IjU2Mjk4ODA4MzY4MDUwMzY0MzMiPiLosrzkuIoiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjb3B5VXJsIiBtc2dpZD0iMjUzODIxMTU3OTU5NjA2NzQwMiI+Iuikh+ijvee2suWdgCI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzZWxlY3RUZXh0TW9kZSAoNjczODU1NjM0ODg2MTM0NzI0MCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciB0ZXh0U2VsZWN0aW9uQ0FCVGl0bGUgKDUyMzY4NTAzOTQzNzA4MjAzNTcpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJpbnB1dE1ldGhvZCIgbXNnaWQ9IjE2NTM2MzAwNjIzMDQ1Njc4NzkiPiLovLjlhaXmlrnlvI8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJhZGRUb0RpY3Rpb25hcnkiIG1zZ2lkPSI4NzkzNjI0OTkxNjg2OTQ4NzA5Ij4i5bCH44CMPHhsaWZmOmcgaWQ9IldPUkQiPiVzPC94bGlmZjpnPuOAjeaWsOWinuiHs+Wtl+WFuCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImVkaXRUZXh0TWVudVRpdGxlIiBtc2dpZD0iMTY3Mjk4OTE3Njk1ODU4MTQ1MiI+Iue3qOi8r+aWh+WtlyI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBlZGl0VGV4dE1lbnVUaXRsZSAoNDkwOTEzNTU2NDk0MTgxNTQ5NCkgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9Imxvd19pbnRlcm5hbF9zdG9yYWdlX3ZpZXdfdGl0bGUiIG1zZ2lkPSIxMzk5NzMyNDA4NzAxNjk3NTQ2Ij4i5YSy5a2Y56m66ZaT5Y2z5bCH5LiN6LazIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG93X2ludGVybmFsX3N0b3JhZ2Vfdmlld190ZXh0IiBtc2dpZD0iNjM1MTA2NTQ0NjE2Mzc4ODM2Ij4i5omL5qmf5YSy5a2Y56m66ZaT5Y2z5bCH5LiN6Laz44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ib2siIG1zZ2lkPSI1OTcwMDYwNDMwNTYyNTI0OTEwIj4i56K65a6aIjwvc3RyaW5nPgpAQCAtNzE5LDYgKzcyNyw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJ5ZXMiIG1zZ2lkPSI1MzYyOTgyMzAzMzM3OTY5MzEyIj4i56K65a6aIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibm8iIG1zZ2lkPSI1MTQxNTMxMDQ0OTM1NTQxNDk3Ij4i5Y+W5raIIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGlhbG9nX2FsZXJ0X3RpdGxlIiBtc2dpZD0iMjA0OTY1ODcwODYwOTA0MzEwMyI+IuazqOaEjyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvYWRpbmciIG1zZ2lkPSIxNzYwNzI0OTk4OTI4MjU1MjUwIj4i6LyJ5YWl5LitLi4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FwaXRhbF9vbiIgbXNnaWQ9IjE1NDQ2ODI3NTU1MTQ0OTQyOTgiPiLplovllZ8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXBpdGFsX29mZiIgbXNnaWQ9IjY4MTU4NzAzODY5NzI4MDU4MzIiPiLpl5zplokiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ3aGljaEFwcGxpY2F0aW9uIiBtc2dpZD0iNDUzMzE4NTk0NzA2NDc3MzM4NiI+IuWujOaIkOaTjeS9nOmcgOS9v+eUqCI8L3N0cmluZz4KQEAgLTg1MywxMyArODYyLDE3IEBACiAgICAgPHN0cmluZyBuYW1lPSJsMnRwX2lwc2VjX3Bza192cG5fZGVzY3JpcHRpb24iIG1zZ2lkPSIzOTQ1MDQzNTY0MDA4MzAzMjM5Ij4i5o6h55So6aCQ5YWI5YWx55So6YeR6ZGw55qEIEwyVFAvSVBTZWMgVlBOIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibDJ0cF9pcHNlY19jcnRfdnBuX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNTM4MjcxNDA3MzEwMzY1MzU3NyI+IuaOoeeUqOaGkeitieeahCBMMlRQL0lQU2VjIFZQTiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVwbG9hZF9maWxlIiBtc2dpZD0iMjg5Nzk1NzE3MjM2NjczMDQxNiI+IumBuOaTh+aqlOahiCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5vX2ZpbGVfY2hvc2VuIiBtc2dpZD0iNjM2MzY0ODU2MjE3MDc1OTQ2NSI+IuacqumBuOaTh+S7u+S9leaqlOahiCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InJlc2V0IiBtc2dpZD0iMjQ0ODE2ODA4MDk2NDIwOTkwOCI+IumHjeiorSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InN1Ym1pdCIgbXNnaWQ9IjE2MDIzMzU1NzIwODk5MTE5NDEiPiLmj5DkuqQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJkZXNjcmlwdGlvbl9zdGFyIiBtc2dpZD0iMjY1NDMxOTg3NDkwODU3NjEzMyI+IuaIkeeahOacgOaEmyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcl9tb2RlX2Rpc2FibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iMzE2NDc2ODIxMjAwMzg2NDMxNiI+IuW3suWVn+eUqOi7iueUqOaooeW8jyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcl9tb2RlX2Rpc2FibGVfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI2Njg2NjM2MjY3MjE2NzU2MTQiPiLpgbjlj5bntZDmnZ/ou4rnlKjmqKHlvI/jgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0ZXRoZXJlZF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSIzMTQ2Njk0MjM0Mzk4MjAyNjAxIj4i5pW45pOa6YCj57ea5oiW54Sh57ea5Z+65Zyw5Y+w5bey5ZWf55SoIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGV0aGVyZWRfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIzMDY3MTA4MzIzOTAzMDQ4OTI3Ij4i6LyV6Ke45Lul6Kit5a6aIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iYmFja19idXR0b25fbGFiZWwiIG1zZ2lkPSIyMzAwNDcwMDA0NTAzMzQzNDM5Ij4i6L+U5ZueIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibmV4dF9idXR0b25fbGFiZWwiIG1zZ2lkPSIxMDgwNTU1MTA0Njc3OTkyNDA4Ij4i57m857qMIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNraXBfYnV0dG9uX2xhYmVsICgxMjc1MzYyMjk5NDcxNjMxODE5KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVfd2FybmluZ19ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI0ODkwODk0MjY3NDU0ODY3Mjc2Ij4i6auY6KGM5YuV6LOH5paZ55So6YePIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVfd2FybmluZ19ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjI2MDk3MzQ3NjM4NDU3MDU3MDgiPiLovJXop7jljbPlj6/nnq3op6Pmm7TlpJrmnInpl5zooYzli5Xos4fmlpnnlKjph4/nmoToqbPntLDos4foqIoiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZWRfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNjI2OTU0MTg5NzcyOTc4MTMzMiI+IuW3sumBlOihjOWLleizh+aWmeS4iumZkCI8L3N0cmluZz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMvYXR0cnMueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy9hdHRycy54bWwKaW5kZXggZDE2YjkxYy4uYmUyNzUyOCAxMDA3NTUKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy9hdHRycy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy9hdHRycy54bWwKQEAgLTE0LDggKzE0LDggQEAKICAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KIAotPCEtLSBGb3JtYXR0aW5nIG5vdGU6IHRlcm1pbmF0ZSBhbGwgY29tbWVudHMgd2l0aCBhIHBlcmlvZCwgdG8gYXZvaWQgYnJlYWtpbmcgCi0gICAgIHRoZSBkb2N1bWVudGF0aW9uIG91dHB1dC4gVG8gc3VwcHJlc3MgY29tbWVudCBsaW5lcyBmcm9tIHRoZSBkb2N1bWVudGF0aW9uIAorPCEtLSBGb3JtYXR0aW5nIG5vdGU6IHRlcm1pbmF0ZSBhbGwgY29tbWVudHMgd2l0aCBhIHBlcmlvZCwgdG8gYXZvaWQgYnJlYWtpbmcKKyAgICAgdGhlIGRvY3VtZW50YXRpb24gb3V0cHV0LiBUbyBzdXBwcmVzcyBjb21tZW50IGxpbmVzIGZyb20gdGhlIGRvY3VtZW50YXRpb24KICAgICAgb3V0cHV0LCBpbnNlcnQgYW4gZWF0LWNvbW1lbnQgZWxlbWVudCBhZnRlciB0aGUgY29tbWVudCBsaW5lcy4KIC0tPgogCkBAIC00Niw2ICs0Niw3IEBACiAgICAgICAgICAgICAgdGhlbWUgZG9lcyBub3Qgc2V0IHRoaXMgdmFsdWUsIG1lYW5pbmcgaXQgaXMgYmFzZWQgb24gd2hldGhlciB0aGUKICAgICAgICAgICAgICB3aW5kb3cgaXMgZmxvYXRpbmcuIC0tPgogICAgICAgICA8YXR0ciBuYW1lPSJiYWNrZ3JvdW5kRGltRW5hYmxlZCIgZm9ybWF0PSJib29sZWFuIiAvPgorICAgICAgICAKIAogICAgICAgICA8IS0tID09PT09PT09PT09IC0tPgogICAgICAgICA8IS0tIFRleHQgc3R5bGVzIC0tPgpAQCAtOTUsNiArOTYsMTIgQEAKIAogICAgICAgICA8IS0tIFRleHQgY29sb3IgZm9yIHVybHMgaW4gc2VhcmNoIHN1Z2dlc3Rpb25zLCB1c2VkIGJ5IHRoaW5ncyBsaWtlIGdsb2JhbCBzZWFyY2ggYW5kIHRoZSBicm93c2VyLiBAaGlkZSAtLT4KICAgICAgICAgPGF0dHIgbmFtZT0idGV4dENvbG9yU2VhcmNoVXJsIiBmb3JtYXQ9InJlZmVyZW5jZXxjb2xvciIgLz4KKworICAgICAgICA8IS0tIENvbG9yIG9mIGhpZ2hsaWdodGVkIHRleHQsIHdoZW4gdXNlZCBpbiBhIGxpZ2h0IHRoZW1lLiBAaGlkZSAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0idGV4dENvbG9ySGlnaGxpZ2h0SW52ZXJzZSIgZm9ybWF0PSJyZWZlcmVuY2V8Y29sb3IiIC8+CisgICAgICAgIDwhLS0gQ29sb3Igb2YgbGluayB0ZXh0IChVUkxzKSwgd2hlbiB1c2VkIGluIGEgbGlnaHQgdGhlbWUuIEBoaWRlIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJ0ZXh0Q29sb3JMaW5rSW52ZXJzZSIgZm9ybWF0PSJyZWZlcmVuY2V8Y29sb3IiIC8+CisgICAgICAgIAogICAgICAgICA8IS0tIFNlYXJjaCB3aWRnZXQgbW9yZSBjb3JwdXMgcmVzdWx0IGl0ZW0gYmFja2dyb3VuZC4gLS0+CiAgICAgICAgIDxhdHRyIG5hbWU9InNlYXJjaFdpZGdldENvcnB1c0l0ZW1CYWNrZ3JvdW5kIiBmb3JtYXQ9InJlZmVyZW5jZXxjb2xvciIgLz4KIApAQCAtMTE3LDEwICsxMjQsMTQgQEAKICAgICAgICAgPCEtLSBUZXh0IGNvbG9yLCB0eXBlZmFjZSwgc2l6ZSwgYW5kIHN0eWxlIGZvciBzeXN0ZW0gc2VhcmNoIHJlc3VsdCBzdWJ0aXRsZS4gRGVmYXVsdHMgdG8gcHJpbWFyeSBpbnZlcnNlIHRleHQgY29sb3IuIC0tPgogICAgICAgICA8YXR0ciBuYW1lPSJ0ZXh0QXBwZWFyYW5jZVNlYXJjaFJlc3VsdFN1YnRpdGxlIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KIAotCiAgICAgICAgIDwhLS0gVGV4dCBjb2xvciwgdHlwZWZhY2UsIHNpemUsIGFuZCBzdHlsZSBmb3IgdGhlIHRleHQgaW5zaWRlIG9mIGEgYnV0dG9uLiAtLT4KICAgICAgICAgPGF0dHIgbmFtZT0idGV4dEFwcGVhcmFuY2VCdXR0b24iIGZvcm1hdD0icmVmZXJlbmNlIiAvPgogCisgICAgICAgIDwhLS0gRWRpdFRleHQgdGV4dCBmb3JlZ3JvdW5kIGNvbG9yLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iZWRpdFRleHRDb2xvciIgZm9ybWF0PSJyZWZlcmVuY2V8Y29sb3IiIC8+CisgICAgICAgIDwhLS0gRWRpdFRleHQgYmFja2dyb3VuZCBkcmF3YWJsZS4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImVkaXRUZXh0QmFja2dyb3VuZCIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CisKICAgICAgICAgPCEtLSBBIHN0eWxlZCBzdHJpbmcsIHNwZWNpZnlpbmcgdGhlIHN0eWxlIHRvIGJlIHVzZWQgZm9yIHNob3dpbmcKICAgICAgICAgICAgICBpbmxpbmUgY2FuZGlkYXRlIHRleHQgd2hlbiBjb21wb3Npbmcgd2l0aCBhbiBpbnB1dCBtZXRob2QuICBUaGUKICAgICAgICAgICAgICB0ZXh0IGl0c2VsZiB3aWxsIGJlIGlnbm9yZWQsIGJ1dCB0aGUgc3R5bGUgc3BhbnMgd2lsbCBiZSBhcHBsaWVkCkBAIC0xMzcsNiArMTQ4LDkgQEAKICAgICAgICAgPCEtLSBEcmF3YWJsZSB0byB1c2UgZm9yIHNpbmdsZSBjaG9pY2UgaW5kaWNhdG9ycy4gLS0+CiAgICAgICAgIDxhdHRyIG5hbWU9Imxpc3RDaG9pY2VJbmRpY2F0b3JTaW5nbGUiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgogCisgICAgICAgIDwhLS0gRHJhd2FibGUgdXNlZCBhcyBhIGJhY2tncm91bmQgZm9yIHNlbGVjdGVkIGxpc3QgaXRlbXMuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJsaXN0Q2hvaWNlQmFja2dyb3VuZEluZGljYXRvciIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CisKICAgICAgICAgPCEtLSA9PT09PT09PT09PT09IC0tPgogICAgICAgICA8IS0tIEJ1dHRvbiBzdHlsZXMgLS0+CiAgICAgICAgIDwhLS0gPT09PT09PT09PT09PSAtLT4KQEAgLTI0NCw2ICsyNTgsMjggQEAKICAgICAgICAgICAgICB7QGxpbmsgYW5kcm9pZC5SLnN0eWxlYWJsZSNXaW5kb3dBbmltYXRpb259LiAtLT4KICAgICAgICAgPGF0dHIgbmFtZT0id2luZG93QW5pbWF0aW9uU3R5bGUiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgogCisgICAgICAgIDwhLS0gRmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhpcyB3aW5kb3cgc2hvdWxkIGhhdmUgYW4gQWN0aW9uIEJhcgorICAgICAgICAgICAgIGluIHBsYWNlIG9mIHRoZSB1c3VhbCB0aXRsZSBiYXIuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJ3aW5kb3dBY3Rpb25CYXIiIGZvcm1hdD0iYm9vbGVhbiIgLz4KKworICAgICAgICA8IS0tIEZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHRoaXMgd2luZG93J3MgQWN0aW9uIEJhciBzaG91bGQgb3ZlcmxheQorICAgICAgICAgICAgIGFwcGxpY2F0aW9uIGNvbnRlbnQuIERvZXMgbm90aGluZyBpZiB0aGUgd2luZG93IHdvdWxkIG5vdAorICAgICAgICAgICAgIGhhdmUgYW4gQWN0aW9uIEJhci4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9IndpbmRvd0FjdGlvbkJhck92ZXJsYXkiIGZvcm1hdD0iYm9vbGVhbiIgLz4KKworICAgICAgICA8IS0tIFJlZmVyZW5jZSB0byBhIHN0eWxlIGZvciB0aGUgQWN0aW9uIEJhciAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0id2luZG93QWN0aW9uQmFyU3R5bGUiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgorCisgICAgICAgIDwhLS0gU2l6ZSBvZiB0aGUgQWN0aW9uIEJhciwgaW5jbHVkaW5nIHRoZSBjb250ZXh0dWFsCisgICAgICAgICAgICAgYmFyIHVzZWQgdG8gcHJlc2VudCBBY3Rpb24gTW9kZXMuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJ3aW5kb3dBY3Rpb25CYXJTaXplIiBmb3JtYXQ9ImRpbWVuc2lvbiIgPgorICAgICAgICAgICAgPGVudW0gbmFtZT0id3JhcF9jb250ZW50IiB2YWx1ZT0iMCIgLz4KKyAgICAgICAgPC9hdHRyPgorCisgICAgICAgIDwhLS0gRmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgYWN0aW9uIG1vZGVzIHNob3VsZCBvdmVybGF5IHdpbmRvdyBjb250ZW50CisgICAgICAgICAgICAgd2hlbiB0aGVyZSBpcyBub3QgcmVzZXJ2ZWQgc3BhY2UgZm9yIHRoZWlyIFVJIChzdWNoIGFzIGFuIEFjdGlvbiBCYXIpLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0id2luZG93QWN0aW9uTW9kZU92ZXJsYXkiIGZvcm1hdD0iYm9vbGVhbiIgLz4KKwogICAgICAgICA8IS0tIERlZmluZXMgdGhlIGRlZmF1bHQgc29mdCBpbnB1dCBzdGF0ZSB0aGF0IHRoaXMgd2luZG93IHdvdWxkCiAgICAgICAgICAgICAgbGlrZSB3aGVuIGl0IGlzIGRpc3BsYXllZC4gLS0+CiAgICAgICAgIDxhdHRyIG5hbWU9IndpbmRvd1NvZnRJbnB1dE1vZGUiPgpAQCAtMzkwLDYgKzQyNiwxMiBAQAogICAgICAgICA8YXR0ciBuYW1lPSJob3Jpem9udGFsU2Nyb2xsVmlld1N0eWxlIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KICAgICAgICAgPCEtLSBEZWZhdWx0IFNwaW5uZXIgc3R5bGUuIC0tPgogICAgICAgICA8YXR0ciBuYW1lPSJzcGlubmVyU3R5bGUiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgorICAgICAgICA8IS0tIERlZmF1bHQgZHJvcGRvd24gU3Bpbm5lciBzdHlsZS4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImRyb3BEb3duU3Bpbm5lclN0eWxlIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KKyAgICAgICAgPCEtLSBEZWZhdWx0IEFjdGlvbkJhciBkcm9wZG93biBzdHlsZS4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImFjdGlvbkRyb3BEb3duU3R5bGUiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgorICAgICAgICA8IS0tIERlZmF1bHQgYWN0aW9uIGJ1dHRvbiBzdHlsZS4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImFjdGlvbkJ1dHRvblN0eWxlIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KICAgICAgICAgPCEtLSBEZWZhdWx0IFN0YXIgc3R5bGUuIC0tPgogICAgICAgICA8YXR0ciBuYW1lPSJzdGFyU3R5bGUiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgogICAgICAgICA8IS0tIERlZmF1bHQgVGFiV2lkZ2V0IHN0eWxlLiAtLT4KQEAgLTQyNiw2ICs0NjgsMjIgQEAKICAgICAgICAgPGF0dHIgbmFtZT0icXVpY2tDb250YWN0QmFkZ2VTdHlsZVNtYWxsV2luZG93TGFyZ2UiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgogCiAgICAgICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PSAtLT4KKyAgICAgICAgPCEtLSBBY3Rpb24gYmFyIHN0eWxlcyAgIC0tPgorICAgICAgICA8IS0tID09PT09PT09PT09PT09PT09PT0gLS0+CisgICAgICAgIDxlYXQtY29tbWVudCAvPgorICAgICAgICA8IS0tIERlZmF1bHQgYW1vdW50IG9mIHBhZGRpbmcgdG8gdXNlIGJldHdlZW4gYWN0aW9uIGJ1dHRvbnMuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJhY3Rpb25CdXR0b25QYWRkaW5nIiBmb3JtYXQ9ImRpbWVuc2lvbiIgLz4KKworICAgICAgICA8IS0tID09PT09PT09PT09PT09PT09PT0gLS0+CisgICAgICAgIDwhLS0gQWN0aW9uIG1vZGUgc3R5bGVzICAtLT4KKyAgICAgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09IC0tPgorICAgICAgICA8ZWF0LWNvbW1lbnQgLz4KKyAgICAgICAgPCEtLSBCYWNrZ3JvdW5kIGRyYXdhYmxlIHRvIHVzZSBmb3IgYWN0aW9uIG1vZGUgVUkgLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImFjdGlvbk1vZGVCYWNrZ3JvdW5kIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KKyAgICAgICAgPCEtLSBEcmF3YWJsZSB0byB1c2UgZm9yIHRoZSBjbG9zZSBhY3Rpb24gbW9kZSBidXR0b24gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImFjdGlvbk1vZGVDbG9zZURyYXdhYmxlIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KKworICAgICAgICA8IS0tID09PT09PT09PT09PT09PT09PT0gLS0+CiAgICAgICAgIDwhLS0gUHJlZmVyZW5jZSBzdHlsZXMgICAtLT4KICAgICAgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09IC0tPgogICAgICAgICA8ZWF0LWNvbW1lbnQgLz4KQEAgLTk2Myw2ICsxMDIxLDExIEBACiAgICAgICAgIDxhdHRyIG5hbWU9InRleHRDb2xvciIgLz4KICAgICAgICAgPGF0dHIgbmFtZT0iYmFja2dyb3VuZERpbUVuYWJsZWQiIC8+CiAgICAgICAgIDxhdHRyIG5hbWU9ImJhY2tncm91bmREaW1BbW91bnQiIC8+CisgICAgICAgIDxhdHRyIG5hbWU9IndpbmRvd0FjdGlvbkJhciIgLz4KKyAgICAgICAgPGF0dHIgbmFtZT0id2luZG93QWN0aW9uQmFyU3R5bGUiIC8+CisgICAgICAgIDxhdHRyIG5hbWU9IndpbmRvd0FjdGlvbk1vZGVPdmVybGF5IiAvPgorICAgICAgICA8YXR0ciBuYW1lPSJ3aW5kb3dBY3Rpb25CYXJPdmVybGF5IiAvPgorICAgICAgICA8YXR0ciBuYW1lPSJ3aW5kb3dBY3Rpb25CYXJTaXplIiAvPgogICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+CiAKICAgICA8IS0tIFRoZSBzZXQgb2YgYXR0cmlidXRlcyB0aGF0IGRlc2NyaWJlIGEgQWxlcnREaWFsb2cncyB0aGVtZS4gLS0+CkBAIC05NzksNiArMTA0MiwxNCBAQAogICAgICAgICA8YXR0ciBuYW1lPSJjZW50ZXJNZWRpdW0iIGZvcm1hdD0icmVmZXJlbmNlfGNvbG9yIiAvPgogICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+CiAKKyAgICA8IS0tIEZyYWdtZW50IGFuaW1hdGlvbiBjbGFzcyBhdHRyaWJ1dGVzLiAtLT4KKyAgICA8ZGVjbGFyZS1zdHlsZWFibGUgbmFtZT0iRnJhZ21lbnRBbmltYXRpb24iPgorICAgICAgICA8YXR0ciBuYW1lPSJmcmFnbWVudE9wZW5FbnRlckFuaW1hdGlvbiIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CisgICAgICAgIDxhdHRyIG5hbWU9ImZyYWdtZW50T3BlbkV4aXRBbmltYXRpb24iIGZvcm1hdD0icmVmZXJlbmNlIiAvPgorICAgICAgICA8YXR0ciBuYW1lPSJmcmFnbWVudENsb3NlRW50ZXJBbmltYXRpb24iIGZvcm1hdD0icmVmZXJlbmNlIiAvPgorICAgICAgICA8YXR0ciBuYW1lPSJmcmFnbWVudENsb3NlRXhpdEFuaW1hdGlvbiIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CisgICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KKwogICAgIDwhLS0gV2luZG93IGFuaW1hdGlvbiBjbGFzcyBhdHRyaWJ1dGVzLiAtLT4KICAgICA8ZGVjbGFyZS1zdHlsZWFibGUgbmFtZT0iV2luZG93QW5pbWF0aW9uIj4KICAgICAgICAgPCEtLSBUaGUgYW5pbWF0aW9uIHVzZWQgd2hlbiBhIHdpbmRvdyBpcyBiZWluZyBhZGRlZC4gLS0+CkBAIC05ODksNyArMTA2MCw3IEBACiAgICAgICAgIDxhdHRyIG5hbWU9IndpbmRvd1Nob3dBbmltYXRpb24iIGZvcm1hdD0icmVmZXJlbmNlIiAvPgogICAgICAgICA8IS0tIFRoZSBhbmltYXRpb24gdXNlZCB3aGVuIGEgd2luZG93IGlzIGdvaW5nIGZyb20gVklTSUJMRSB0byBJTlZJU0lCTEUuIC0tPgogICAgICAgICA8YXR0ciBuYW1lPSJ3aW5kb3dIaWRlQW5pbWF0aW9uIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KLSAgICAgICAgCisKICAgICAgICAgPCEtLSAgV2hlbiBvcGVuaW5nIGEgbmV3IGFjdGl2aXR5LCB0aGlzIGlzIHRoZSBhbmltYXRpb24gdGhhdCBpcwogICAgICAgICAgICAgICBydW4gb24gdGhlIG5leHQgYWN0aXZpdHkgKHdoaWNoIGlzIGVudGVyaW5nIHRoZSBzY3JlZW4pLiAtLT4KICAgICAgICAgPGF0dHIgbmFtZT0iYWN0aXZpdHlPcGVuRW50ZXJBbmltYXRpb24iIGZvcm1hdD0icmVmZXJlbmNlIiAvPgpAQCAtMTAzMCw3ICsxMTAxLDcgQEAKICAgICAgICAgICAgICAgYW5pbWF0aW9uIHRoYXQgaXMgcnVuIG9uIHRoZSB0b3AgYWN0aXZpdHkgb2YgdGhlIGN1cnJlbnQgdGFzawogICAgICAgICAgICAgICAod2hpY2ggaXMgZXhpdGluZyB0aGUgc2NyZWVuKS4gLS0+CiAgICAgICAgIDxhdHRyIG5hbWU9InRhc2tUb0JhY2tFeGl0QW5pbWF0aW9uIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KLSAgICAgICAgCisKICAgICAgICAgPCEtLSAgV2hlbiBvcGVuaW5nIGEgbmV3IGFjdGl2aXR5IHRoYXQgc2hvd3MgdGhlIHdhbGxwYXBlciwgd2hpbGUKICAgICAgICAgICAgICAgY3VycmVudGx5IG5vdCBzaG93aW5nIHRoZSB3YWxscGFwZXIsIHRoaXMgaXMgdGhlIGFuaW1hdGlvbiB0aGF0CiAgICAgICAgICAgICAgIGlzIHJ1biBvbiB0aGUgbmV3IHdhbGxwYXBlciBhY3Rpdml0eSAod2hpY2ggaXMgZW50ZXJpbmcgdGhlIHNjcmVlbikuIC0tPgpAQCAtMTA0Nyw3ICsxMTE4LDcgQEAKICAgICAgICAgICAgICAgY3VycmVudGx5IHNob3dpbmcgdGhlIHdhbGxwYXBlciwgdGhpcyBpcyB0aGUgYW5pbWF0aW9uIHRoYXQKICAgICAgICAgICAgICAgaXMgcnVuIG9uIHRoZSBvbGQgd2FsbHBhcGVyIGFjdGl2aXR5ICh3aGljaCBpcyBleGl0aW5nIHRoZSBzY3JlZW4pLiAtLT4KICAgICAgICAgPGF0dHIgbmFtZT0id2FsbHBhcGVyQ2xvc2VFeGl0QW5pbWF0aW9uIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KLSAgICAgICAgCisKICAgICAgICAgPCEtLSAgV2hlbiBvcGVuaW5nIGEgbmV3IGFjdGl2aXR5IHRoYXQgaXMgb24gdG9wIG9mIHRoZSB3YWxscGFwZXIKICAgICAgICAgICAgICAgd2hlbiB0aGUgY3VycmVudCBhY3Rpdml0eSBpcyBhbHNvIG9uIHRvcCBvZiB0aGUgd2FsbHBhcGVyLAogICAgICAgICAgICAgICB0aGlzIGlzIHRoZSBhbmltYXRpb24gdGhhdCBpcyBydW4gb24gdGhlIG5ldyBhY3Rpdml0eQpAQCAtMTM4NSw2ICsxNDU2LDE3IEBACiAgICAgICAgICAgICA8ZW51bSBuYW1lPSJibG9ja3NEZXNjZW5kYW50cyIgdmFsdWU9IjIiIC8+CiAgICAgICAgIDwvYXR0cj4KIAorICAgICAgICA8IS0tIFNldHMgd2hldGhlciB0aGlzIFZpZXdHcm91cCBzaG91bGQgc3BsaXQgTW90aW9uRXZlbnRzCisgICAgICAgICAgICAgdG8gc2VwYXJhdGUgY2hpbGQgdmlld3MgZHVyaW5nIHRvdWNoIGV2ZW50IGRpc3BhdGNoLgorICAgICAgICAgICAgIElmIGZhbHNlIChkZWZhdWx0KSwgdG91Y2ggZXZlbnRzIHdpbGwgYmUgZGlzcGF0Y2hlZCB0bworICAgICAgICAgICAgIHRoZSBjaGlsZCB2aWV3IHdoZXJlIHRoZSBmaXJzdCBwb2ludGVyIHdlbnQgZG93biB1bnRpbAorICAgICAgICAgICAgIHRoZSBsYXN0IHBvaW50ZXIgZ29lcyB1cC4KKyAgICAgICAgICAgICBJZiB0cnVlLCB0b3VjaCBldmVudHMgbWF5IGJlIGRpc3BhdGNoZWQgdG8gbXVsdGlwbGUgY2hpbGRyZW4uCisgICAgICAgICAgICAgTW90aW9uRXZlbnRzIGZvciBlYWNoIHBvaW50ZXIgd2lsbCBiZSBkaXNwYXRjaGVkIHRvIHRoZSBjaGlsZAorICAgICAgICAgICAgIHZpZXcgd2hlcmUgdGhlIGluaXRpYWwgQUNUSU9OX0RPV04gZXZlbnQgaGFwcGVuZWQuCisgICAgICAgICAgICAgU2VlIHtAbGluayBhbmRyb2lkLnZpZXcuVmlld0dyb3VwI3NldE1vdGlvbkV2ZW50U3BsaXR0aW5nRW5hYmxlZChib29sZWFuKX0KKyAgICAgICAgICAgICBmb3IgbW9yZSBpbmZvcm1hdGlvbi4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9InNwbGl0TW90aW9uRXZlbnRzIiBmb3JtYXQ9ImJvb2xlYW4iIC8+CiAgICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KIAogICAgIDwhLS0gQSB7QGxpbmsgYW5kcm9pZC52aWV3LlZpZXdTdHVifSBsZXRzIHlvdSBsYXppbHkgaW5jbHVkZSBvdGhlciBYTUwgbGF5b3V0cwpAQCAtMTQ4Niw2ICsxNTY4LDI4IEBACiAgICAgICAgIDxhdHRyIG5hbWU9ImlzRGVmYXVsdCIgZm9ybWF0PSJib29sZWFuIiAvPgogICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+CiAKKyAgICA8IS0tIFRoaXMgaXMgdGhlIHN1YnR5cGUgb2YgSW5wdXRNZXRob2QuIFN1YnR5cGUgY2FuIGRlc2NyaWJlIGxvY2FsZXMgKGUuZy4gZW5fVVMsIGZyX0ZSLi4uKQorICAgICAgICAgYW5kIG1vZGVzIChlLmcuIHZvaWNlLCBrZXlib2FyZC4uLiksIGFuZCBpcyB1c2VkIGZvciBJTUUgc3dpdGNoLiBUaGlzIHN1YnR5cGUgYWxsb3dzCisgICAgICAgICB0aGUgc3lzdGVtIHRvIGNhbGwgdGhlIHNwZWNpZmllZCBzdWJ0eXBlIG9mIHRoZSBJTUUgZGlyZWN0bHkuIC0tPgorICAgIDxkZWNsYXJlLXN0eWxlYWJsZSBuYW1lPSJJbnB1dE1ldGhvZF9TdWJ0eXBlIj4KKyAgICAgICAgPCEtLSBUaGUgbmFtZSBvZiB0aGUgc3VidHlwZS4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImxhYmVsIiAvPgorICAgICAgICA8IS0tIFRoZSBpY29uIG9mIHRoZSBzdWJ0eXBlLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iaWNvbiIgLz4KKyAgICAgICAgPCEtLSBUaGUgbG9jYWxlIG9mIHRoZSBzdWJ0eXBlLiBUaGlzIHN0cmluZyBzaG91bGQgYmUgYSBsb2NhbGUgKGUuZy4gZW5fVVMsIGZyX0ZSLi4uKQorICAgICAgICAgICAgIGFuZCB3aWxsIGJlIHBhc3NlZCB0byB0aGUgSU1FIHdoZW4gdGhlIGZyYW1ld29yayBjYWxscyB0aGUgSU1FCisgICAgICAgICAgICAgd2l0aCB0aGUgc3VidHlwZS4gVGhpcyBpcyBhbHNvIHVzZWQgYnkgdGhlIGZyYW1ld29yayB0byBrbm93IHRoZSBzdXBwb3J0ZWQgbG9jYWxlcworICAgICAgICAgICAgIG9mIHRoZSBJTUUuICAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iaW1lU3VidHlwZUxvY2FsZSIgZm9ybWF0PSJzdHJpbmciIC8+CisgICAgICAgIDwhLS0gVGhlIG1vZGUgb2YgdGhlIHN1YnR5cGUuIFRoaXMgc3RyaW5nIGNhbiBiZSBhIG1vZGUgKGUuZy4gdm9pY2UsIGtleWJvYXJkLi4uKSBhbmQgdGhpcworICAgICAgICAgICAgIHN0cmluZyB3aWxsIGJlIHBhc3NlZCB0byB0aGUgSU1FIHdoZW4gdGhlIGZyYW1ld29yayBjYWxscyB0aGUgSU1FIHdpdGggdGhlCisgICAgICAgICAgICAgc3VidHlwZS4gIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJpbWVTdWJ0eXBlTW9kZSIgZm9ybWF0PSJzdHJpbmciIC8+CisgICAgICAgIDwhLS0gVGhlIGV4dHJhIHZhbHVlIG9mIHRoZSBzdWJ0eXBlLiBUaGlzIHN0cmluZyBjYW4gYmUgYW55IHN0cmluZyBhbmQgd2lsbCBiZSBwYXNzZWQgdG8KKyAgICAgICAgICAgICB0aGUgSU1FIHdoZW4gdGhlIGZyYW1ld29yayBjYWxscyB0aGUgSU1FIHdpdGggdGhlIHN1YnR5cGUuICAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iaW1lU3VidHlwZUV4dHJhVmFsdWUiIGZvcm1hdD0ic3RyaW5nIiAvPgorICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+CisKICAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CiAgICAgPCEtLSBXaWRnZXQgcGFja2FnZSBjbGFzcyBhdHRyaWJ1dGVzIC0tPgogICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KQEAgLTE1MzUsNiArMTYzOSwyOCBAQAogICAgICAgICAgICAgIHdpbGwgdXNlIG9ubHkgdGhlIG51bWJlciBvZiBpdGVtcyBpbiB0aGUgYWRhcHRlciBhbmQgdGhlIG51bWJlciBvZiBpdGVtcyB2aXNpYmxlCiAgICAgICAgICAgICAgb24gc2NyZWVuIHRvIGRldGVybWluZSB0aGUgc2Nyb2xsYmFyJ3MgcHJvcGVydGllcy4gLS0+CiAgICAgICAgIDxhdHRyIG5hbWU9InNtb290aFNjcm9sbGJhciIgZm9ybWF0PSJib29sZWFuIiAvPgorICAgICAgICA8IS0tIEEgcmVmZXJlbmNlIHRvIGFuIFhNTCBkZXNjcmlwdGlvbiBvZiB0aGUgYWRhcHRlciB0byBhdHRhY2ggdG8gdGhlIGxpc3QuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJhZGFwdGVyIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KKyAgICAgICAgPCEtLSBEZWZpbmVzIHRoZSBjaG9pY2UgYmVoYXZpb3IgZm9yIHRoZSB2aWV3LiBCeSBkZWZhdWx0LCBsaXN0cyBkbyBub3QgaGF2ZQorICAgICAgICAgICAgIGFueSBjaG9pY2UgYmVoYXZpb3IuIEJ5IHNldHRpbmcgdGhlIGNob2ljZU1vZGUgdG8gc2luZ2xlQ2hvaWNlLCB0aGUgbGlzdAorICAgICAgICAgICAgIGFsbG93cyB1cCB0byBvbmUgaXRlbSB0byBiZSBpbiBhIGNob3NlbiBzdGF0ZS4gQnkgc2V0dGluZyB0aGUgY2hvaWNlTW9kZSB0bworICAgICAgICAgICAgIG11bHRpcGxlQ2hvaWNlLCB0aGUgbGlzdCBhbGxvd3MgYW55IG51bWJlciBvZiBpdGVtcyB0byBiZSBjaG9zZW4uCisgICAgICAgICAgICAgRmluYWxseSwgYnkgc2V0dGluZyB0aGUgY2hvaWNlTW9kZSB0byBtdWx0aXBsZUNob2ljZU1vZGFsIHRoZSBsaXN0IGFsbG93cworICAgICAgICAgICAgIGFueSBudW1iZXIgb2YgaXRlbXMgdG8gYmUgY2hvc2VuIGluIGEgc3BlY2lhbCBzZWxlY3Rpb24gbW9kZS4KKyAgICAgICAgICAgICBUaGUgYXBwbGljYXRpb24gd2lsbCBzdXBwbHkgYQorICAgICAgICAgICAgIHtAbGluayBhbmRyb2lkLndpZGdldC5BYnNMaXN0Vmlldy5NdWx0aUNob2ljZU1vZGVMaXN0ZW5lcn0gdXNpbmcKKyAgICAgICAgICAgICB7QGxpbmsgYW5kcm9pZC53aWRnZXQuQWJzTGlzdFZpZXcjc2V0TXVsdGlDaG9pY2VNb2RlTGlzdGVuZXJ9IHRvIGNvbnRyb2wgdGhlCisgICAgICAgICAgICAgc2VsZWN0aW9uIG1vZGUuIFRoaXMgdXNlcyB0aGUge0BsaW5rIGFuZHJvaWQudmlldy5BY3Rpb25Nb2RlfSBBUEkuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJjaG9pY2VNb2RlIj4KKyAgICAgICAgICAgIDwhLS0gTm9ybWFsIGxpc3QgdGhhdCBkb2VzIG5vdCBpbmRpY2F0ZSBjaG9pY2VzLiAtLT4KKyAgICAgICAgICAgIDxlbnVtIG5hbWU9Im5vbmUiIHZhbHVlPSIwIiAvPgorICAgICAgICAgICAgPCEtLSBUaGUgbGlzdCBhbGxvd3MgdXAgdG8gb25lIGNob2ljZS4gLS0+CisgICAgICAgICAgICA8ZW51bSBuYW1lPSJzaW5nbGVDaG9pY2UiIHZhbHVlPSIxIiAvPgorICAgICAgICAgICAgPCEtLSBUaGUgbGlzdCBhbGxvd3MgbXVsdGlwbGUgY2hvaWNlcy4gLS0+CisgICAgICAgICAgICA8ZW51bSBuYW1lPSJtdWx0aXBsZUNob2ljZSIgdmFsdWU9IjIiIC8+CisgICAgICAgICAgICA8IS0tIFRoZSBsaXN0IGFsbG93cyBtdWx0aXBsZSBjaG9pY2VzIGluIGEgY3VzdG9tIHNlbGVjdGlvbiBtb2RlLiAtLT4KKyAgICAgICAgICAgIDxlbnVtIG5hbWU9Im11bHRpcGxlQ2hvaWNlTW9kYWwiIHZhbHVlPSIzIiAvPgorICAgICAgICA8L2F0dHI+CiAgICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KICAgICA8ZGVjbGFyZS1zdHlsZWFibGUgbmFtZT0iQWJzU3Bpbm5lciI+CiAgICAgICAgIDwhLS0gUmVmZXJlbmNlIHRvIGFuIGFycmF5IHJlc291cmNlIHRoYXQgd2lsbCBwb3B1bGF0ZSB0aGUgU3Bpbm5lci4gIEZvciBzdGF0aWMgY29udGVudCwKQEAgLTE3MzAsNyArMTg1Niw3IEBACiAgICAgICAgIDwhLS0gV2hlbiBzZXQgdG8gdHJ1ZSwgYWxsIGNoaWxkcmVuIHdpdGggYSB3ZWlnaHQgd2lsbCBiZSBjb25zaWRlcmVkIGhhdmluZwogICAgICAgICAgICAgIHRoZSBtaW5pbXVtIHNpemUgb2YgdGhlIGxhcmdlc3QgY2hpbGQuIElmIGZhbHNlLCBhbGwgY2hpbGRyZW4gYXJlCiAgICAgICAgICAgICAgbWVhc3VyZWQgbm9ybWFsbHkuIC0tPgotICAgICAgICA8YXR0ciBuYW1lPSJ1c2VMYXJnZXN0Q2hpbGQiIGZvcm1hdD0iYm9vbGVhbiIgLz4KKyAgICAgICAgPGF0dHIgbmFtZT0ibWVhc3VyZVdpdGhMYXJnZXN0Q2hpbGQiIGZvcm1hdD0iYm9vbGVhbiIgLz4KICAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgogICAgIDxkZWNsYXJlLXN0eWxlYWJsZSBuYW1lPSJMaXN0VmlldyI+CiAgICAgICAgIDwhLS0gUmVmZXJlbmNlIHRvIGFuIGFycmF5IHJlc291cmNlIHRoYXQgd2lsbCBwb3B1bGF0ZSB0aGUgTGlzdFZpZXcuICBGb3Igc3RhdGljIGNvbnRlbnQsCkBAIC0xNzQxLDE4ICsxODY3LDYgQEAKICAgICAgICAgPCEtLSBIZWlnaHQgb2YgdGhlIGRpdmlkZXIuIFdpbGwgdXNlIHRoZSBpbnRyaW5zaWMgaGVpZ2h0IG9mIHRoZSBkaXZpZGVyIGlmIHRoaXMKICAgICAgICAgICAgICBpcyBub3Qgc3BlY2lmaWVkLiAtLT4KICAgICAgICAgPGF0dHIgbmFtZT0iZGl2aWRlckhlaWdodCIgZm9ybWF0PSJkaW1lbnNpb24iIC8+Ci0gICAgICAgIDwhLS0gRGVmaW5lcyB0aGUgY2hvaWNlIGJlaGF2aW9yIGZvciB0aGUgTGlzdFZpZXcuIEJ5IGRlZmF1bHQsIGxpc3RzIGRvIG5vdCBoYXZlCi0gICAgICAgICAgICAgYW55IGNob2ljZSBiZWhhdmlvci4gQnkgc2V0dGluZyB0aGUgY2hvaWNlTW9kZSB0byBzaW5nbGVDaG9pY2UsIHRoZSBMaXN0Ci0gICAgICAgICAgICAgYWxsb3dzIHVwIHRvIG9uZSBpdGVtIHRvIGJlIGluIGEgY2hvc2VuIHN0YXRlLiBCeSBzZXR0aW5nIHRoZSBjaG9pY2VNb2RlIHRvCi0gICAgICAgICAgICAgbXVsdGlwbGVDaG9pY2UsIHRoZSBsaXN0IGFsbG93cyBhbnkgbnVtYmVyIG9mIGl0ZW1zIHRvIGJlIGNob3Nlbi4gLS0+Ci0gICAgICAgIDxhdHRyIG5hbWU9ImNob2ljZU1vZGUiPgotICAgICAgICAgICAgPCEtLSBOb3JtYWwgbGlzdCB0aGF0IGRvZXMgbm90IGluZGljYXRlIGNob2ljZXMuIC0tPgotICAgICAgICAgICAgPGVudW0gbmFtZT0ibm9uZSIgdmFsdWU9IjAiIC8+Ci0gICAgICAgICAgICA8IS0tIFRoZSBsaXN0IGFsbG93cyB1cCB0byBvbmUgY2hvaWNlLiAtLT4KLSAgICAgICAgICAgIDxlbnVtIG5hbWU9InNpbmdsZUNob2ljZSIgdmFsdWU9IjEiIC8+Ci0gICAgICAgICAgICA8IS0tIFRoZSBsaXN0IGFsbG93cyBtdWx0aXBsZSBjaG9pY2VzLiAtLT4KLSAgICAgICAgICAgIDxlbnVtIG5hbWU9Im11bHRpcGxlQ2hvaWNlIiB2YWx1ZT0iMiIgLz4KLSAgICAgICAgPC9hdHRyPgogICAgICAgICA8IS0tIFdoZW4gc2V0IHRvIGZhbHNlLCB0aGUgTGlzdFZpZXcgd2lsbCBub3QgZHJhdyB0aGUgZGl2aWRlciBhZnRlciBlYWNoIGhlYWRlciB2aWV3LgogICAgICAgICAgICAgIFRoZSBkZWZhdWx0IHZhbHVlIGlzIHRydWUuIC0tPgogICAgICAgICA8YXR0ciBuYW1lPSJoZWFkZXJEaXZpZGVyc0VuYWJsZWQiIGZvcm1hdD0iYm9vbGVhbiIgLz4KQEAgLTIxNTQsNyArMjI2OCw3IEBACiAgICAgICAgIDxhdHRyIG5hbWU9ImRyb3BEb3duQW5jaG9yIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KICAgICAgICAgPCEtLSBTcGVjaWZpZXMgdGhlIGJhc2ljIHdpZHRoIG9mIHRoZSBkcm9wZG93bi4gSXRzIHZhbHVlIG1heQogICAgICAgICAgICAgIGJlIGEgZGltZW5zaW9uIChzdWNoIGFzICIxMmRpcCIpIGZvciBhIGNvbnN0YW50IHdpZHRoLAotICAgICAgICAgICAgIGZpbGxfcGFyZW50IG9yIG1hdGNoX3BhcmVudCB0byBtYXRjaCB0aGUgd2lkdGggb2YgdGhlIAorICAgICAgICAgICAgIGZpbGxfcGFyZW50IG9yIG1hdGNoX3BhcmVudCB0byBtYXRjaCB0aGUgd2lkdGggb2YgdGhlCiAgICAgICAgICAgICAgc2NyZWVuLCBvciB3cmFwX2NvbnRlbnQgdG8gbWF0Y2ggdGhlIHdpZHRoIG9mCiAgICAgICAgICAgICAgdGhlIGFuY2hvcmVkIHZpZXcuIC0tPgogICAgICAgICA8YXR0ciBuYW1lPSJkcm9wRG93bldpZHRoIiBmb3JtYXQ9ImRpbWVuc2lvbiI+CkBAIC0yMTkwLDE0ICsyMzA0LDMzIEBACiAgICAgICAgIDxhdHRyIG5hbWU9InBvcHVwQmFja2dyb3VuZCIgZm9ybWF0PSJyZWZlcmVuY2V8Y29sb3IiIC8+CiAgICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KICAgICA8ZGVjbGFyZS1zdHlsZWFibGUgbmFtZT0iVmlld0FuaW1hdG9yIj4KKyAgICAgICAgPCEtLSBJZGVudGlmaWVyIGZvciB0aGUgYW5pbWF0aW9uIHRvIHVzZSB3aGVuIGEgdmlldyBpcyBzaG93bi4gLS0+CiAgICAgICAgIDxhdHRyIG5hbWU9ImluQW5pbWF0aW9uIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KKyAgICAgICAgPCEtLSBJZGVudGlmaWVyIGZvciB0aGUgYW5pbWF0aW9uIHRvIHVzZSB3aGVuIGEgdmlldyBpcyBoaWRkZW4uIC0tPgogICAgICAgICA8YXR0ciBuYW1lPSJvdXRBbmltYXRpb24iIGZvcm1hdD0icmVmZXJlbmNlIiAvPgorICAgICAgICA8IS0tIERlZmluZXMgd2hldGhlciB0byBhbmltYXRlIHRoZSBjdXJyZW50IFZpZXcgd2hlbiB0aGUgVmlld0FuaW1hdGlvbgorICAgICAgICAgICAgIGlzIGZpcnN0IGRpc3BsYXllZC4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImFuaW1hdGVGaXJzdFZpZXciIGZvcm1hdD0iYm9vbGVhbiIgLz4KICAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgogICAgIDxkZWNsYXJlLXN0eWxlYWJsZSBuYW1lPSJWaWV3RmxpcHBlciI+CiAgICAgICAgIDxhdHRyIG5hbWU9ImZsaXBJbnRlcnZhbCIgZm9ybWF0PSJpbnRlZ2VyIiBtaW49IjAiIC8+CiAgICAgICAgIDwhLS0gV2hlbiB0cnVlLCBhdXRvbWF0aWNhbGx5IHN0YXJ0IGFuaW1hdGluZyAtLT4KICAgICAgICAgPGF0dHIgbmFtZT0iYXV0b1N0YXJ0IiBmb3JtYXQ9ImJvb2xlYW4iIC8+CiAgICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KKyAgICA8ZGVjbGFyZS1zdHlsZWFibGUgbmFtZT0iQWRhcHRlclZpZXdBbmltYXRvciI+CisgICAgICAgIDwhLS0gSWRlbnRpZmllciBmb3IgdGhlIGFuaW1hdGlvbiB0byB1c2Ugd2hlbiBhIHZpZXcgaXMgc2hvd24uIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJpbkFuaW1hdGlvbiIgLz4KKyAgICAgICAgPCEtLSBJZGVudGlmaWVyIGZvciB0aGUgYW5pbWF0aW9uIHRvIHVzZSB3aGVuIGEgdmlldyBpcyBoaWRkZW4uIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJvdXRBbmltYXRpb24iIC8+CisgICAgICAgIDwhLS0gRGVmaW5lcyB3aGV0aGVyIHRvIGFuaW1hdGUgdGhlIGN1cnJlbnQgVmlldyB3aGVuIHRoZSBWaWV3QW5pbWF0aW9uCisgICAgICAgICAgICAgaXMgZmlyc3QgZGlzcGxheWVkLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iYW5pbWF0ZUZpcnN0VmlldyIgLz4KKyAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgorICAgIDxkZWNsYXJlLXN0eWxlYWJsZSBuYW1lPSJBZGFwdGVyVmlld0ZsaXBwZXIiPgorICAgICAgICA8YXR0ciBuYW1lPSJmbGlwSW50ZXJ2YWwiIC8+CisgICAgICAgIDwhLS0gV2hlbiB0cnVlLCBhdXRvbWF0aWNhbGx5IHN0YXJ0IGFuaW1hdGluZyAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iYXV0b1N0YXJ0IiAvPgorICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+CiAgICAgPGRlY2xhcmUtc3R5bGVhYmxlIG5hbWU9IlZpZXdTd2l0Y2hlciI+CiAgICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KICAgICA8ZGVjbGFyZS1zdHlsZWFibGUgbmFtZT0iU2Nyb2xsVmlldyI+CkBAIC0yMjExLDYgKzIzNDQsMzAgQEAKICAgICA8ZGVjbGFyZS1zdHlsZWFibGUgbmFtZT0iU3Bpbm5lciI+CiAgICAgICAgIDwhLS0gVGhlIHByb21wdCB0byBkaXNwbGF5IHdoZW4gdGhlIHNwaW5uZXIncyBkaWFsb2cgaXMgc2hvd24uIC0tPgogICAgICAgICA8YXR0ciBuYW1lPSJwcm9tcHQiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgorICAgICAgICA8IS0tIERpc3BsYXkgbW9kZSBmb3Igc3Bpbm5lciBvcHRpb25zLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0ic3Bpbm5lck1vZGUiIGZvcm1hdD0iZW51bSI+CisgICAgICAgICAgICA8IS0tIFNwaW5uZXIgb3B0aW9ucyB3aWxsIGJlIHByZXNlbnRlZCB0byB0aGUgdXNlciBhcyBhIGRpYWxvZyB3aW5kb3cuIC0tPgorICAgICAgICAgICAgPGVudW0gbmFtZT0iZGlhbG9nIiB2YWx1ZT0iMCIgLz4KKyAgICAgICAgICAgIDwhLS0gU3Bpbm5lciBvcHRpb25zIHdpbGwgYmUgcHJlc2VudGVkIHRvIHRoZSB1c2VyIGFzIGFuIGlubGluZSBkcm9wZG93bgorICAgICAgICAgICAgICAgICBhbmNob3JlZCB0byB0aGUgc3Bpbm5lciB3aWRnZXQgaXRzZWxmLiAtLT4KKyAgICAgICAgICAgIDxlbnVtIG5hbWU9ImRyb3Bkb3duIiB2YWx1ZT0iMSIgLz4KKyAgICAgICAgPC9hdHRyPgorICAgICAgICA8IS0tIExpc3Qgc2VsZWN0b3IgdG8gdXNlIGZvciBzcGlubmVyTW9kZT0iZHJvcGRvd24iIGRpc3BsYXkuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJkcm9wRG93blNlbGVjdG9yIiAvPgorICAgICAgICA8IS0tIEJhY2tncm91bmQgZHJhd2FibGUgdG8gdXNlIGZvciB0aGUgZHJvcGRvd24gaW4gc3Bpbm5lck1vZGU9ImRyb3Bkb3duIi4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9InBvcHVwQmFja2dyb3VuZCIgLz4KKyAgICAgICAgPCEtLSBWZXJ0aWNhbCBvZmZzZXQgZnJvbSB0aGUgc3Bpbm5lciB3aWRnZXQgZm9yIHBvc2l0aW9uaW5nIHRoZSBkcm9wZG93biBpbgorICAgICAgICAgICAgIHNwaW5uZXJNb2RlPSJkcm9wZG93biIuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJkcm9wRG93blZlcnRpY2FsT2Zmc2V0IiAvPgorICAgICAgICA8IS0tIEhvcml6b250YWwgb2Zmc2V0IGZyb20gdGhlIHNwaW5uZXIgd2lkZ2V0IGZvciBwb3NpdGlvbmluZyB0aGUgZHJvcGRvd24KKyAgICAgICAgICAgICBpbiBzcGlubmVyTW9kZT0iZHJvcGRvd24iLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iZHJvcERvd25Ib3Jpem9udGFsT2Zmc2V0IiAvPgorICAgICAgICA8IS0tIFdpZHRoIG9mIHRoZSBkcm9wZG93biBpbiBzcGlubmVyTW9kZT0iZHJvcGRvd24iLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iZHJvcERvd25XaWR0aCIgLz4KKyAgICAgICAgPCEtLSBSZWZlcmVuY2UgdG8gYSBsYXlvdXQgdG8gdXNlIGZvciBkaXNwbGF5aW5nIGEgcHJvbXB0IGluIHRoZSBkcm9wZG93biBmb3IKKyAgICAgICAgICAgICBzcGlubmVyTW9kZT0iZHJvcGRvd24iLiBUaGlzIGxheW91dCBtdXN0IGNvbnRhaW4gYSBUZXh0VmlldyB3aXRoIHRoZSBpZAorICAgICAgICAgICAgIEBhbmRyb2lkOmlkL3RleHQxIHRvIGJlIHBvcHVsYXRlZCB3aXRoIHRoZSBwcm9tcHQgdGV4dC4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9InBvcHVwUHJvbXB0VmlldyIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CiAgICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KICAgICA8ZGVjbGFyZS1zdHlsZWFibGUgbmFtZT0iRGF0ZVBpY2tlciI+CiAgICAgICAgIDwhLS0gVGhlIGZpcnN0IHllYXIgKGluY2x1c2l2ZSksIGZvciBleGFtcGxlICIxOTQwIi4gLS0+CkBAIC0yNTIxLDYgKzI2NzgsMTAgQEAKICAgICAgICAgPGF0dHIgbmFtZT0iZHJhd2FibGUiIC8+CiAgICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KIAorICAgIDxkZWNsYXJlLXN0eWxlYWJsZSBuYW1lPSJNaXBtYXBEcmF3YWJsZUl0ZW0iPgorICAgICAgICA8YXR0ciBuYW1lPSJkcmF3YWJsZSIgLz4KKyAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgorCiAgICAgPGRlY2xhcmUtc3R5bGVhYmxlIG5hbWU9IlJvdGF0ZURyYXdhYmxlIj4KICAgICAgICAgPGF0dHIgbmFtZT0idmlzaWJsZSIgLz4KICAgICAgICAgPGF0dHIgbmFtZT0iZnJvbURlZ3JlZXMiIGZvcm1hdD0iZmxvYXQiIC8+CkBAIC0yODQ0LDYgKzMwMDUsNjkgQEAKICAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgogCiAgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgICA8IS0tIEFuaW1hdG9yIGNsYXNzIGF0dHJpYnV0ZXMgLS0+CisgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgICA8ZWF0LWNvbW1lbnQgLz4KKworICAgIDxkZWNsYXJlLXN0eWxlYWJsZSBuYW1lPSJBbmltYXRvciI+CisgICAgICAgIDwhLS0gRGVmaW5lcyB0aGUgaW50ZXJwb2xhdG9yIHVzZWQgdG8gc21vb3RoIHRoZSBhbmltYXRpb24gbW92ZW1lbnQgaW4gdGltZS4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImludGVycG9sYXRvciIgLz4KKyAgICAgICAgPCEtLSBXaGVuIHNldCB0byB0cnVlLCBmaWxsQWZ0ZXIgaXMgdGFrZW4gaW50byBhY2NvdW50LiAtLT4KKyAgICAgICAgPCEtLSBBbW91bnQgb2YgdGltZSAoaW4gbWlsbGlzZWNvbmRzKSBmb3IgdGhlIGFuaW1hdGlvbiB0byBydW4uIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJkdXJhdGlvbiIgLz4KKyAgICAgICAgPCEtLSBEZWxheSBpbiBtaWxsaXNlY29uZHMgYmVmb3JlIHRoZSBhbmltYXRpb24gcnVucywgb25jZSBzdGFydCB0aW1lIGlzIHJlYWNoZWQuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJzdGFydE9mZnNldCIvPgorICAgICAgICA8IS0tIERlZmluZXMgaG93IG1hbnkgdGltZXMgdGhlIGFuaW1hdGlvbiBzaG91bGQgcmVwZWF0LiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAwLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0icmVwZWF0Q291bnQiLz4KKyAgICAgICAgPCEtLSBEZWZpbmVzIHRoZSBhbmltYXRpb24gYmVoYXZpb3Igd2hlbiBpdCByZWFjaGVzIHRoZSBlbmQgYW5kIHRoZSByZXBlYXQgY291bnQgaXMKKyAgICAgICAgICAgICBncmVhdGVyIHRoYW4gMCBvciBpbmZpbml0ZS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgcmVzdGFydC4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9InJlcGVhdE1vZGUiLz4KKyAgICAgICAgPCEtLSBWYWx1ZSB0aGUgYW5pbWF0aW9uIHN0YXJ0cyBmcm9tLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0idmFsdWVGcm9tIiBmb3JtYXQ9ImZsb2F0fGludGVnZXIiLz4KKyAgICAgICAgPCEtLSBWYWx1ZSB0aGUgYW5pbWF0aW9uIGFuaW1hdGVzIHRvLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0idmFsdWVUbyIgZm9ybWF0PSJmbG9hdHxpbnRlZ2VyIi8+CisgICAgICAgIDwhLS0gVGhlIHR5cGUgb2YgdmFsdWVGcm9tIGFuZCB2YWx1ZVRvLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0idmFsdWVUeXBlIj4KKyAgICAgICAgICAgIDwhLS0gdmFsdWVGcm9tIGFuZCB2YWx1ZVRvIGFyZSBmbG9hdHMuIC0tPgorICAgICAgICAgICAgPGVudW0gbmFtZT0iZmxvYXRUeXBlIiB2YWx1ZT0iMCIgLz4KKyAgICAgICAgICAgIDwhLS0gdmFsdWVGcm9tIGFuZCB2YWx1ZVRvIGFyZSBpbnRlZ2Vycy4gLS0+CisgICAgICAgICAgICA8ZW51bSBuYW1lPSJpbnRUeXBlIiAgIHZhbHVlPSIxIiAvPgorICAgICAgICAgICAgPCEtLSB2YWx1ZUZyb20gYW5kIHZhbHVlVG8gYXJlIGRvdWJsZXMuIC0tPgorICAgICAgICAgICAgPGVudW0gbmFtZT0iZG91YmxlVHlwZSIgdmFsdWU9IjIiIC8+CisgICAgICAgICAgICA8IS0tIHZhbHVlRnJvbSBhbmQgdmFsdWVUbyBhcmUgY29sb3JzLiAtLT4KKyAgICAgICAgICAgIDxlbnVtIG5hbWU9ImNvbG9yVHlwZSIgdmFsdWU9IjMiIC8+CisgICAgICAgICAgICA8IS0tIHZhbHVlRnJvbSBhbmQgdmFsdWVUbyBhcmUgYSBjdXN0b20gdHlwZS4gLS0+CisgICAgICAgICAgICA8ZW51bSBuYW1lPSJjdXN0b21UeXBlIiB2YWx1ZT0iNCIgLz4KKyAgICAgICAgPC9hdHRyPgorICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+CisKKyAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorICAgIDwhLS0gUHJvcGVydHlBbmltYXRvciBjbGFzcyBhdHRyaWJ1dGVzIC0tPgorICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgICAgPGVhdC1jb21tZW50IC8+CisKKyAgICA8ZGVjbGFyZS1zdHlsZWFibGUgbmFtZT0iUHJvcGVydHlBbmltYXRvciI+CisgICAgICAgIDwhLS0gTmFtZSBvZiB0aGUgcHJvcGVydHkgYmVpbmcgYW5pbWF0ZWQuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJwcm9wZXJ0eU5hbWUiIGZvcm1hdD0ic3RyaW5nIi8+CisgICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KKworCisgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgICA8IS0tIFNlcXVlbmNlciBjbGFzcyBhdHRyaWJ1dGVzIC0tPgorICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgICAgPGVhdC1jb21tZW50IC8+CisKKyAgICA8ZGVjbGFyZS1zdHlsZWFibGUgbmFtZT0iU2VxdWVuY2VyIj4KKyAgICAgICAgPCEtLSBOYW1lIG9mIHRoZSBwcm9wZXJ0eSBiZWluZyBhbmltYXRlZC4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9Im9yZGVyaW5nIj4KKyAgICAgICAgICAgIDwhLS0gY2hpbGQgYW5pbWF0aW9ucyBzaG91bGQgYmUgcGxheWVkIHRvZ2V0aGVyLiAtLT4KKyAgICAgICAgICAgIDxlbnVtIG5hbWU9InRvZ2V0aGVyIiB2YWx1ZT0iMCIgLz4KKyAgICAgICAgICAgIDwhLS0gY2hpbGQgYW5pbWF0aW9ucyBzaG91bGQgYmUgcGxheWVkIHNlcXVlbnRpYWxseSwgaW4gdGhlIHNhbWUgb3JkZXIgYXMgdGhlIHhtbC4gLS0+CisgICAgICAgICAgICA8ZW51bSBuYW1lPSJzZXF1ZW50aWFsbHkiIHZhbHVlPSIxIiAvPgorICAgICAgICA8L2F0dHI+CisgICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KKworICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CiAgICAgPCEtLSBTdGF0ZSBhdHRyaWJ1dGVzICAgICAgICAgICAtLT4KICAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgogICAgIDxlYXQtY29tbWVudCAvPgpAQCAtMzI1Miw2ICszNDc2LDE3IEBACiAgICAgICAgIDwhLS0gV2hldGhlciB0aGUgaXRlbSBpcyBlbmFibGVkLiAtLT4KICAgICAgICAgPGF0dHIgbmFtZT0iZW5hYmxlZCIgLz4KIAorICAgICAgICA8IS0tIE5hbWUgb2YgYSBtZXRob2Qgb24gdGhlIENvbnRleHQgdXNlZCB0byBpbmZsYXRlIHRoZSBtZW51IHRoYXQgd2lsbCBiZQorICAgICAgICAgICAgIGNhbGxlZCB3aGVuIHRoZSBpdGVtIGlzIGNsaWNrZWQuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJvbkNsaWNrIiAvPgorCisgICAgICAgIDwhLS0gSG93IHRoaXMgaXRlbSBzaG91bGQgZGlzcGxheSBpbiB0aGUgQWN0aW9uIEJhciwgaWYgcHJlc2VudC4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9InNob3dBc0FjdGlvbiIgZm9ybWF0PSJlbnVtIj4KKyAgICAgICAgICAgIDxlbnVtIG5hbWU9Im5ldmVyIiB2YWx1ZT0iMCIgLz4KKyAgICAgICAgICAgIDxlbnVtIG5hbWU9ImlmUm9vbSIgdmFsdWU9IjEiIC8+CisgICAgICAgICAgICA8ZW51bSBuYW1lPSJhbHdheXMiIHZhbHVlPSIyIiAvPgorICAgICAgICA8L2F0dHI+CisKICAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgogCiAgICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgpAQCAtMzI2Nyw2ICszNTAyLDE5IEBACiAgICAgICAgIDxhdHRyIG5hbWU9Im9yZGVyaW5nRnJvbVhtbCIgZm9ybWF0PSJib29sZWFuIiAvPgogICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+CiAKKyAgICA8IS0tIEF0dHJpYnV0ZSBmb3IgYSBoZWFkZXIgZGVzY3JpYmluZyB0aGUgaXRlbSBzaG93biBpbiB0aGUgdG9wLWxldmVsIGxpc3QKKyAgICAgICAgIGZyb20gd2hpY2ggdGhlIHNlbGVjdHMgdGhlIHNldCBvZiBwcmVmZXJlbmNlIHRvIGRpZyBpbiB0by4gLS0+CisgICAgPGRlY2xhcmUtc3R5bGVhYmxlIG5hbWU9IlByZWZlcmVuY2VIZWFkZXIiPgorICAgICAgICA8IS0tIFRoZSB0aXRsZSBvZiB0aGUgaXRlbSB0aGF0IGlzIHNob3duIHRvIHRoZSB1c2VyLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0idGl0bGUiIC8+CisgICAgICAgIDwhLS0gVGhlIHN1bW1hcnkgZm9yIHRoZSBpdGVtLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0ic3VtbWFyeSIgZm9ybWF0PSJzdHJpbmciIC8+CisgICAgICAgIDwhLS0gQW4gaWNvbiBmb3IgdGhlIGl0ZW0uIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJpY29uIiAvPgorICAgICAgICA8IS0tIFRoZSBmcmFnbWVudCB0aGF0IGlzIGRpc3BsYXllZCB3aGVuIHRoZSB1c2VyIHNlbGVjdHMgdGhpcyBpdGVtLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iZnJhZ21lbnQiIGZvcm1hdD0ic3RyaW5nIiAvPgorICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+CisKICAgICA8IS0tIFdBUk5JTkc6ICBJZiBhZGRpbmcgYXR0cmlidXRlcyB0byBQcmVmZXJlbmNlLCBtYWtlIHN1cmUgaXQgZG9lcyBub3QgY29uZmxpY3QKICAgICAgICAgICAgICAgICAgICB3aXRoIGEgVmlldydzIGF0dHJpYnV0ZXMuICBTb21lIHN1YmNsYXNzZXMgKGUuZy4sIEVkaXRUZXh0UHJlZmVyZW5jZSkKICAgICAgICAgICAgICAgICAgICBwcm94eSBhbGwgYXR0cmlidXRlcyB0byBpdHMgRWRpdFRleHQgd2lkZ2V0LiAtLT4KQEAgLTMyNzksMTAgKzM1MjcsMTMgQEAKICAgICAgICAgPCEtLSBUaGUgdGl0bGUgZm9yIHRoZSBQcmVmZXJlbmNlIGluIGEgUHJlZmVyZW5jZUFjdGl2aXR5IHNjcmVlbi4gLS0+CiAgICAgICAgIDxhdHRyIG5hbWU9InRpdGxlIiAvPgogICAgICAgICA8IS0tIFRoZSBzdW1tYXJ5IGZvciB0aGUgUHJlZmVyZW5jZSBpbiBhIFByZWZlcmVuY2VBY3Rpdml0eSBzY3JlZW4uIC0tPgotICAgICAgICA8YXR0ciBuYW1lPSJzdW1tYXJ5IiBmb3JtYXQ9InN0cmluZyIgLz4KKyAgICAgICAgPGF0dHIgbmFtZT0ic3VtbWFyeSIgLz4KICAgICAgICAgPCEtLSBUaGUgb3JkZXIgZm9yIHRoZSBQcmVmZXJlbmNlIChsb3dlciB2YWx1ZXMgYXJlIHRvIGJlIG9yZGVyZWQgZmlyc3QpLiBJZiB0aGlzIGlzIG5vdAogICAgICAgICAgICAgIHNwZWNpZmllZCwgdGhlIGRlZmF1bHQgb3JkZXJpbiB3aWxsIGJlIGFscGhhYmV0aWMuIC0tPgogICAgICAgICA8YXR0ciBuYW1lPSJvcmRlciIgZm9ybWF0PSJpbnRlZ2VyIiAvPgorICAgICAgICA8IS0tIFdoZW4gdXNlZCBpbnNpZGUgb2YgYSBtb2Rlcm4gUHJlZmVyZW5jZUFjdGl2aXR5LCB0aGlzIGRlY2xhcmVzCisgICAgICAgICAgICAgYSBuZXcgUHJlZmVyZW5jZUZyYWdtZW50IHRvIGJlIHNob3duIHdoZW4gdGhlIHVzZXIgc2VsZWN0cyB0aGlzIGl0ZW0uIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJmcmFnbWVudCIgLz4KICAgICAgICAgPCEtLSBUaGUgbGF5b3V0IGZvciB0aGUgUHJlZmVyZW5jZSBpbiBhIFByZWZlcmVuY2VBY3Rpdml0eSBzY3JlZW4uIFRoaXMgc2hvdWxkCiAgICAgICAgICAgICAgcmFyZWx5IG5lZWQgdG8gYmUgY2hhbmdlZCwgbG9vayBhdCB3aWRnZXRMYXlvdXQgaW5zdGVhZC4gLS0+CiAgICAgICAgIDxhdHRyIG5hbWU9ImxheW91dCIgLz4KQEAgLTMzNTQsNiArMzYwNSwxNiBAQAogICAgICAgICA8YXR0ciBuYW1lPSJlbnRyeVZhbHVlcyIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CiAgICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KIAorICAgIDxkZWNsYXJlLXN0eWxlYWJsZSBuYW1lPSJNdWx0aVNlbGVjdExpc3RQcmVmZXJlbmNlIj4KKyAgICAgICAgPCEtLSBUaGUgaHVtYW4tcmVhZGFibGUgYXJyYXkgdG8gcHJlc2VudCBhcyBhIGxpc3QuIEVhY2ggZW50cnkgbXVzdCBoYXZlIGEgY29ycmVzcG9uZGluZworICAgICAgICAgICAgIGluZGV4IGluIGVudHJ5VmFsdWVzLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iZW50cmllcyIgLz4KKyAgICAgICAgPCEtLSBUaGUgYXJyYXkgdG8gZmluZCB0aGUgdmFsdWUgdG8gc2F2ZSBmb3IgYSBwcmVmZXJlbmNlIHdoZW4gYW4gZW50cnkgZnJvbQorICAgICAgICAgICAgIGVudHJpZXMgaXMgc2VsZWN0ZWQuIElmIGEgdXNlciBjbGlja3MgdGhlIHNlY29uZCBpdGVtIGluIGVudHJpZXMsIHRoZQorICAgICAgICAgICAgIHNlY29uZCBpdGVtIGluIHRoaXMgYXJyYXkgd2lsbCBiZSBzYXZlZCB0byB0aGUgcHJlZmVyZW5jZS4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImVudHJ5VmFsdWVzIiAvPgorICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+CisKICAgICA8IS0tIEJhc2UgYXR0cmlidXRlcyBhdmFpbGFibGUgdG8gUmluZ3RvbmVQcmVmZXJlbmNlLiAtLT4KICAgICA8ZGVjbGFyZS1zdHlsZWFibGUgbmFtZT0iUmluZ3RvbmVQcmVmZXJlbmNlIj4KICAgICAgICAgPCEtLSBXaGljaCByaW5ndG9uZSB0eXBlKHMpIHRvIHNob3cgaW4gdGhlIHBpY2tlci4gLS0+CkBAIC0zNTA1LDcgKzM3NjYsNyBAQAogICAgIDwhLS0gQXBwV2lkZ2V0IHBhY2thZ2UgY2xhc3MgYXR0cmlidXRlcyAtLT4KICAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CiAgICAgPGVhdC1jb21tZW50IC8+Ci0gICAgCisKICAgICA8IS0tIFVzZSA8Y29kZT5hcHB3aWRnZXQtcHJvdmlkZXI8L2NvZGU+IGFzIHRoZSByb290IHRhZyBvZiB0aGUgWE1MIHJlc291cmNlIHRoYXQKICAgICAgICAgIGRlc2NyaWJlcyBhbiBBcHBXaWRnZXQgcHJvdmlkZXIuICBTZWUge0BsaW5rIGFuZHJvaWQuYXBwd2lkZ2V0IGFuZHJvaWQuYXBwd2lkZ2V0fQogICAgICAgICAgcGFja2FnZSBmb3IgbW9yZSBpbmZvLgpAQCAtMzUyMiwxMyArMzc4Myw0OSBAQAogICAgICAgICA8IS0tIEEgY2xhc3MgbmFtZSBpbiB0aGUgQXBwV2lkZ2V0J3MgcGFja2FnZSB0byBiZSBsYXVuY2hlZCB0byBjb25maWd1cmUuCiAgICAgICAgICAgICAgSWYgbm90IHN1cHBsaWVkLCB0aGVuIG5vIGFjdGl2aXR5IHdpbGwgYmUgbGF1bmNoZWQuIC0tPgogICAgICAgICA8YXR0ciBuYW1lPSJjb25maWd1cmUiIGZvcm1hdD0ic3RyaW5nIiAvPgorICAgICAgICA8IS0tIEEgcHJldmlldyBvZiB3aGF0IHRoZSBBcHBXaWRnZXQgd2lsbCBsb29rIGxpa2UgYWZ0ZXIgaXQncyBjb25maWd1cmVkLgorICAgICAgIAkgICAgIElmIG5vdCBzdXBwbGllZCwgdGhlIEFwcFdpZGdldCdzIGljb24gd2lsbCBiZSB1c2VkLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0icHJldmlld0ltYWdlIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KICAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgogCiAgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgogICAgIDwhLS0gQXBwIHBhY2thZ2UgY2xhc3MgYXR0cmlidXRlcyAtLT4KICAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CiAgICAgPGVhdC1jb21tZW50IC8+Ci0gICAgCisKKyAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorICAgIDwhLS0gVmlldyBwYWNrYWdlIGNsYXNzIGF0dHJpYnV0ZXMgLS0+CisgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgICA8ZWF0LWNvbW1lbnQgLz4KKworICAgIDwhLS0gQXR0cmlidXRlcyB0aGF0IGNhbiBiZSB1c2VkIHdpdGggPGNvZGU+Jmx0O2ZyYWdtZW50Jmd0OzwvY29kZT4KKyAgICAgICAgIHRhZ3MgaW5zaWRlIG9mIHRoZSBsYXlvdXQgb2YgYW4gQWN0aXZpdHkuICBUaGlzIGluc3RhbnRpYXRlcworICAgICAgICAgdGhlIGdpdmVuIHtAbGluayBhbmRyb2lkLmFwcC5GcmFnbWVudH0gYW5kIGluc2VydHMgaXRzIGNvbnRlbnQKKyAgICAgICAgIHZpZXcgaW50byB0aGUgY3VycmVudCBsb2NhdGlvbiBpbiB0aGUgbGF5b3V0LiAtLT4KKyAgICA8ZGVjbGFyZS1zdHlsZWFibGUgbmFtZT0iRnJhZ21lbnQiPgorICAgICAgICA8IS0tIFN1cHBseSB0aGUgbmFtZSBvZiB0aGUgZnJhZ21lbnQgY2xhc3MgdG8gaW5zdGFudGlhdGUuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJuYW1lIiAvPgorCisgICAgICAgIDwhLS0gU3VwcGx5IGFuIGlkZW50aWZpZXIgbmFtZSBmb3IgdGhlIHRvcC1sZXZlbCB2aWV3LCB0byBsYXRlciByZXRyaWV2ZSBpdAorICAgICAgICAgICAgIHdpdGgge0BsaW5rIGFuZHJvaWQudmlldy5WaWV3I2ZpbmRWaWV3QnlJZCBWaWV3LmZpbmRWaWV3QnlJZCgpfSBvcgorICAgICAgICAgICAgIHtAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eSNmaW5kVmlld0J5SWQgQWN0aXZpdHkuZmluZFZpZXdCeUlkKCl9LgorICAgICAgICAgICAgIFRoaXMgbXVzdCBiZSBhCisgICAgICAgICAgICAgcmVzb3VyY2UgcmVmZXJlbmNlOyB0eXBpY2FsbHkgeW91IHNldCB0aGlzIHVzaW5nIHRoZQorICAgICAgICAgICAgIDxjb2RlPkArPC9jb2RlPiBzeW50YXggdG8gY3JlYXRlIGEgbmV3IElEIHJlc291cmNlcy4KKyAgICAgICAgICAgICBGb3IgZXhhbXBsZTogPGNvZGU+YW5kcm9pZDppZD0iQCtpZC9teV9pZCI8L2NvZGU+IHdoaWNoCisgICAgICAgICAgICAgYWxsb3dzIHlvdSB0byBsYXRlciByZXRyaWV2ZSB0aGUgdmlldworICAgICAgICAgICAgIHdpdGggPGNvZGU+ZmluZFZpZXdCeUlkKFIuaWQubXlfaWQpPC9jb2RlPi4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImlkIiAvPgorCisgICAgICAgIDwhLS0gU3VwcGx5IGEgdGFnIGZvciB0aGUgdG9wLWxldmVsIHZpZXcgY29udGFpbmluZyBhIFN0cmluZywgdG8gYmUgcmV0cmlldmVkCisgICAgICAgICAgICAgbGF0ZXIgd2l0aCB7QGxpbmsgYW5kcm9pZC52aWV3LlZpZXcjZ2V0VGFnIFZpZXcuZ2V0VGFnKCl9IG9yCisgICAgICAgICAgICAgc2VhcmNoZWQgZm9yIHdpdGgge0BsaW5rIGFuZHJvaWQudmlldy5WaWV3I2ZpbmRWaWV3V2l0aFRhZworICAgICAgICAgICAgIFZpZXcuZmluZFZpZXdXaXRoVGFnKCl9LiAgSXQgaXMgZ2VuZXJhbGx5IHByZWZlcmFibGUgdG8gdXNlCisgICAgICAgICAgICAgSURzICh0aHJvdWdoIHRoZSBhbmRyb2lkOmlkIGF0dHJpYnV0ZSkgaW5zdGVhZCBvZiB0YWdzIGJlY2F1c2UKKyAgICAgICAgICAgICB0aGV5IGFyZSBmYXN0ZXIgYW5kIGFsbG93IGZvciBjb21waWxlLXRpbWUgdHlwZSBjaGVja2luZy4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9InRhZyIgLz4KKyAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgorCiAgICAgPCEtLSBVc2UgPGNvZGU+ZGV2aWNlLWFkbWluPC9jb2RlPiBhcyB0aGUgcm9vdCB0YWcgb2YgdGhlIFhNTCByZXNvdXJjZSB0aGF0CiAgICAgICAgICBkZXNjcmliZXMgYQogICAgICAgICAge0BsaW5rIGFuZHJvaWQuYXBwLmFkbWluLkRldmljZUFkbWluUmVjZWl2ZXJ9LCB3aGljaCBpcwpAQCAtMzU2OCw3ICszODY1LDcgQEAKICAgICA8IS0tIEFjY291bnRzIHBhY2thZ2UgY2xhc3MgYXR0cmlidXRlcyAtLT4KICAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CiAgICAgPGVhdC1jb21tZW50IC8+Ci0gICAgCisKICAgICA8IS0tIFVzZSA8Y29kZT5hY2NvdW50LWF1dGhlbnRpY2F0b3I8L2NvZGU+IGFzIHRoZSByb290IHRhZyBvZiB0aGUgWE1MIHJlc291cmNlIHRoYXQKICAgICAgICAgIGRlc2NyaWJlcyBhbiBhY2NvdW50IGF1dGhlbnRpY2F0b3IuCiAgICAgIC0tPgpAQCAtMzU4OSw3ICszODg2LDcgQEAKICAgICA8IS0tIEFjY291bnRzIHBhY2thZ2UgY2xhc3MgYXR0cmlidXRlcyAtLT4KICAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CiAgICAgPGVhdC1jb21tZW50IC8+Ci0gICAgCisKICAgICA8IS0tIFVzZSA8Y29kZT5hY2NvdW50LWF1dGhlbnRpY2F0b3I8L2NvZGU+IGFzIHRoZSByb290IHRhZyBvZiB0aGUgWE1MIHJlc291cmNlIHRoYXQKICAgICAgICAgIGRlc2NyaWJlcyBhbiBhY2NvdW50IGF1dGhlbnRpY2F0b3IuCiAgICAgIC0tPgpAQCAtMzYwNSw3ICszOTAyLDcgQEAKICAgICA8IS0tIENvbnRhY3RzIG1ldGEtZGF0YSBhdHRyaWJ1dGVzIC0tPgogICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KICAgICA8ZWF0LWNvbW1lbnQgLz4KLSAgICAKKwogICAgIDwhLS0gVE9ETzogcmVtb3ZlIHRoaXMgZGVwcmVjYXRlZCBzdHlsZWFibGUuIC0tPgogICAgIDxlYXQtY29tbWVudCAvPgogICAgIDxkZWNsYXJlLXN0eWxlYWJsZSBuYW1lPSJJY29uIj4KQEAgLTM2MzEsNiArMzkyOCw5IEBACiAgICAgICAgIDxhdHRyIG5hbWU9ImRldGFpbENvbHVtbiIgZm9ybWF0PSJzdHJpbmciIC8+CiAgICAgICAgIDwhLS0gRmxhZyBpbmRpY2F0aW5nIHRoYXQgZGV0YWlsIHNob3VsZCBiZSBidWlsdCBmcm9tIFNvY2lhbFByb3ZpZGVyLiAtLT4KICAgICAgICAgPGF0dHIgbmFtZT0iZGV0YWlsU29jaWFsU3VtbWFyeSIgZm9ybWF0PSJib29sZWFuIiAvPgorICAgICAgICA8IS0tIFJlc291cmNlIHJlcHJlc2VudGluZyB0aGUgdGVybSAiQWxsIENvbnRhY3RzIiAoZS5nLiAiQWxsIEZyaWVuZHMiIG9yCisgICAgICAgICJBbGwgY29ubmVjdGlvbnMiKS4gT3B0aW9uYWwgKERlZmF1bHQgaXMgIkFsbCBDb250YWN0cyIpLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iYWxsQ29udGFjdHNOYW1lIiBmb3JtYXQ9InN0cmluZyIgLz4KICAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgogCiAgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgpAQCAtMzY2Miw0ICszOTYyLDEwNyBAQAogICAgICAgICA8YXR0ciBuYW1lPSJzZXR0aW5nc0FjdGl2aXR5IiAvPgogICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+CiAKKyAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgICAgPCEtLSBBZGFwdGVycyBhdHRyaWJ1dGVzICAgICAgICAgICAgIC0tPgorICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgICA8ZWF0LWNvbW1lbnQgLz4KKworICAgIDwhLS0gQWRhcHRlciB1c2VkIHRvIGJpbmQgY3Vyc29ycy4gLS0+CisgICAgPGRlY2xhcmUtc3R5bGVhYmxlIG5hbWU9IkN1cnNvckFkYXB0ZXIiPgorICAgICAgICA8IS0tIFVSSSB0byBnZXQgdGhlIGN1cnNvciBmcm9tLiBPcHRpb25hbC4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9InVyaSIgZm9ybWF0PSJzdHJpbmciIC8+CisgICAgICAgIDwhLS0gU2VsZWN0aW9uIHN0YXRlbWVudCBmb3IgdGhlIHF1ZXJ5LiBPcHRpb25hbC4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9InNlbGVjdGlvbiIgZm9ybWF0PSJzdHJpbmciIC8+CisgICAgICAgIDwhLS0gU29ydCBvcmRlciBzdGF0ZW1lbnQgZm9yIHRoZSBxdWVyeS4gT3B0aW9uYWwuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJzb3J0T3JkZXIiIGZvcm1hdD0ic3RyaW5nIiAvPgorICAgICAgICA8IS0tIExheW91dCByZXNvdXJjZSB1c2VkIHRvIGRpc3BsYXkgZWFjaCByb3cgZnJvbSB0aGUgY3Vyc29yLiBNYW5kYXRvcnkuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJsYXlvdXQiIC8+CisgICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KKworICAgIDwhLS0gQXR0cmlidXRlcyB1c2VkIGluIGJpbmQgaXRlbXMgZm9yIFhNTCBjdXJzb3IgYWRhcHRlcnMuIC0tPgorICAgIDxkZWNsYXJlLXN0eWxlYWJsZSBuYW1lPSJDdXJzb3JBZGFwdGVyX0JpbmRJdGVtIj4KKyAgICAgICAgPCEtLSBUaGUgbmFtZSBvZiB0aGUgY29sdW1uIHRvIGJpbmQgZnJvbS4gTWFuZGF0b3J5LiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iZnJvbSIgZm9ybWF0PSJzdHJpbmciIC8+CisgICAgICAgIDwhLS0gVGhlIHJlc291cmNlIGlkIG9mIHRoZSB2aWV3IHRvIGJpbmQgdG8uIE1hbmRhdG9yeS4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9InRvIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KKyAgICAgICAgPCEtLSBUaGUgdHlwZSBvZiBiaW5kaW5nLiBJZiB0aGlzIHZhbHVlIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSB0eXBlIHdpbGwgYmUKKyAgICAgICAgICAgICBpbmZlcnJlZCBmcm9tIHRoZSB0eXBlIG9mIHRoZSAidG8iIHRhcmdldCB2aWV3LiBNYW5kYXRvcnkuCisKKyAgICAgICAgICAgICBUaGUgdHlwZSBjYW4gYmUgb25lIG9mOgorICAgICAgICAgICAgIDx1bD4KKyAgICAgICAgICAgICA8bGk+c3RyaW5nLCBUaGUgY29udGVudCBvZiB0aGUgY29sdW1uIGlzIGludGVycHJldGVkIGFzIGEgc3RyaW5nLjwvbGk+CisgICAgICAgICAgICAgPGxpPmltYWdlLCBUaGUgY29udGVudCBvZiB0aGUgY29sdW1uIGlzIGludGVycHJldGVkIGFzIGEgYmxvYiBkZXNjcmliaW5nIGFuIGltYWdlLjwvbGk+CisgICAgICAgICAgICAgPGxpPmltYWdlLXVyaSwgVGhlIGNvbnRlbnQgb2YgdGhlIGNvbHVtbiBpcyBpbnRlcnByZXRlZCBhcyBhIFVSSSB0byBhbiBpbWFnZS48L2xpPgorICAgICAgICAgICAgIDxsaT5kcmF3YWJsZSwgVGhlIGNvbnRlbnQgb2YgdGhlIGNvbHVtbiBpcyBpbnRlcnByZXRlZCBhcyBhIHJlc291cmNlIGlkIHRvIGEgZHJhd2FibGUuPC9saT4KKyAgICAgICAgICAgICA8bGk+QSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSwgY29ycmVzcG9uZGluZyB0byBhbiBpbXBsZW1lbnRhdGlvbiBvZgorICAgICAgICAgICAgICAgICBhbmRyb2lkLndpZGdldC5BZGFwdGVycy5DdXJzb3JCaW5kZXIuPC9saT4KKyAgICAgICAgICAgICA8L3VsPgorICAgICAgICAgLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImFzIiBmb3JtYXQ9InN0cmluZyIgLz4KKyAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgorCisgICAgPCEtLSBBdHRyaWJ1dGVzIHVzZWQgaW4gc2VsZWN0IGl0ZW1zIGZvciBYTUwgY3Vyc29yIGFkYXB0ZXJzLiAtLT4KKyAgICA8ZGVjbGFyZS1zdHlsZWFibGUgbmFtZT0iQ3Vyc29yQWRhcHRlcl9TZWxlY3RJdGVtIj4KKyAgICAgICAgPCEtLSBUaGUgbmFtZSBvZiB0aGUgY29sdW1uIHRvIHNlbGVjdC4gTWFuZGF0b3J5LiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iY29sdW1uIiBmb3JtYXQ9InN0cmluZyIgLz4KKyAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgorCisgICAgPCEtLSBBdHRyaWJ1dGVzIHVzZWQgdG8gbWFwIHZhbHVlcyB0byBuZXcgdmFsdWVzIGluIFhNTCBjdXJzb3IgYWRhcHRlcnMnIGJpbmQgaXRlbXMuIC0tPgorICAgIDxkZWNsYXJlLXN0eWxlYWJsZSBuYW1lPSJDdXJzb3JBZGFwdGVyX01hcEl0ZW0iPgorICAgICAgICA8IS0tIFRoZSBvcmlnaW5hbCB2YWx1ZSBmcm9tIHRoZSBjb2x1bW4uIE1hbmRhdG9yeS4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImZyb21WYWx1ZSIgZm9ybWF0PSJzdHJpbmciIC8+CisgICAgICAgIDwhLS0gVGhlIG5ldyB2YWx1ZSBmcm9tIHRoZSBjb2x1bW4uIE1hbmRhdG9yeS4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9InRvVmFsdWUiIGZvcm1hdD0ic3RyaW5nIiAvPgorICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+CisKKyAgICA8IS0tIEF0dHJpYnV0ZXMgdXNlZCB0byBtYXAgdmFsdWVzIHRvIG5ldyB2YWx1ZXMgaW4gWE1MIGN1cnNvciBhZGFwdGVycycgYmluZCBpdGVtcy4gLS0+CisgICAgPGRlY2xhcmUtc3R5bGVhYmxlIG5hbWU9IkN1cnNvckFkYXB0ZXJfVHJhbnNmb3JtSXRlbSI+CisgICAgICAgIDwhLS0gVGhlIHRyYW5zZm9ybWF0aW9uIGV4cHJlc3Npb24uIE1hbmRhdG9yeSBpZiAid2l0aENsYXNzIiBpcyBub3Qgc3BlY2lmaWVkLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0id2l0aEV4cHJlc3Npb24iIGZvcm1hdD0ic3RyaW5nIiAvPgorICAgICAgICA8IS0tIFRoZSB0cmFuc2Zvcm1hdGlvbiBjbGFzcywgYW4gaW1wbGVtZW50YXRpb24gb2YKKyAgICAgICAgICAgICBhbmRyb2lkLndpZGdldC5BZGFwdGVycy5DdXJzb3JUcmFuc2Zvcm1hdGlvbi4gTWFuZGF0b3J5IGlmICJ3aXRoRXhwcmVzc2lvbiIKKyAgICAgICAgICAgICBpcyBub3Qgc3BlY2lmaWVkLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0id2l0aENsYXNzIiBmb3JtYXQ9InN0cmluZyIgLz4KKyAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgorCisgICAgPCEtLSBBdHRyaWJ1dGVzIHVzZWQgdG8gc3R5bGUgdGhlIEFjdGlvbiBCYXIuIC0tPgorICAgIDxkZWNsYXJlLXN0eWxlYWJsZSBuYW1lPSJBY3Rpb25CYXIiPgorICAgICAgICA8IS0tIFRoZSB0eXBlIG9mIG5hdmlnYXRpb24gdG8gdXNlLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0ibmF2aWdhdGlvbk1vZGUiPgorICAgICAgICAgICAgPCEtLSBOb3JtYWwgc3RhdGljIHRpdGxlIHRleHQgLS0+CisgICAgICAgICAgICA8ZW51bSBuYW1lPSJub3JtYWwiIHZhbHVlPSIwIiAvPgorICAgICAgICAgICAgPCEtLSBUaGUgYWN0aW9uIGJhciB3aWxsIHVzZSBhIGRyb3AtZG93biBzZWxlY3Rpb24gaW4gcGxhY2Ugb2YgdGl0bGUgdGV4dC4gLS0+CisgICAgICAgICAgICA8ZW51bSBuYW1lPSJkcm9wZG93bkxpc3QiIHZhbHVlPSIxIiAvPgorICAgICAgICAgICAgPCEtLSBUaGUgYWN0aW9uIGJhciB3aWxsIHVzZSBhIHNlcmllcyBvZiBob3Jpem9udGFsIHRhYnMgaW4gcGxhY2Ugb2YgdGl0bGUgdGV4dC4gLS0+CisgICAgICAgICAgICA8ZW51bSBuYW1lPSJ0YWJCYXIiIHZhbHVlPSIyIiAvPgorICAgICAgICA8L2F0dHI+CisgICAgICAgIDwhLS0gT3B0aW9ucyBhZmZlY3RpbmcgaG93IHRoZSBhY3Rpb24gYmFyIGlzIGRpc3BsYXllZC4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImRpc3BsYXlPcHRpb25zIj4KKyAgICAgICAgICAgIDxmbGFnIG5hbWU9InVzZUxvZ28iIHZhbHVlPSIxIiAvPgorICAgICAgICAgICAgPGZsYWcgbmFtZT0iaGlkZUhvbWUiIHZhbHVlPSIyIiAvPgorICAgICAgICA8L2F0dHI+CisgICAgICAgIDwhLS0gU3BlY2lmaWVzIHRoZSBjb2xvciB1c2VkIHRvIHN0eWxlIHRoZSBhY3Rpb24gYmFyLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iY29sb3JGaWx0ZXIiIGZvcm1hdD0iY29sb3IiIC8+CisgICAgICAgIDwhLS0gU3BlY2lmaWVzIHRpdGxlIHRleHQgdXNlZCBmb3IgbmF2aWdhdGlvbk1vZGU9Im5vcm1hbCIgLS0+CisgICAgICAgIDxhdHRyIG5hbWU9InRpdGxlIiAvPgorICAgICAgICA8IS0tIFNwZWNpZmllcyBzdWJ0aXRsZSB0ZXh0IHVzZWQgZm9yIG5hdmlnYXRpb25Nb2RlPSJub3JtYWwiIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJzdWJ0aXRsZSIgZm9ybWF0PSJzdHJpbmciIC8+CisgICAgICAgIDwhLS0gU3BlY2lmaWVzIGEgc3R5bGUgdG8gdXNlIGZvciB0aXRsZSB0ZXh0LiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0idGl0bGVUZXh0U3R5bGUiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgorICAgICAgICA8IS0tIFNwZWNpZmllcyBhIHN0eWxlIHRvIHVzZSBmb3Igc3VidGl0bGUgdGV4dC4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9InN1YnRpdGxlVGV4dFN0eWxlIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KKyAgICAgICAgPCEtLSBTcGVjaWZpZXMgdGhlIGRyYXdhYmxlIHVzZWQgZm9yIHRoZSBhcHBsaWNhdGlvbiBpY29uLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iaWNvbiIgLz4KKyAgICAgICAgPCEtLSBTcGVjaWZpZXMgdGhlIGRyYXdhYmxlIHVzZWQgZm9yIHRoZSBhcHBsaWNhdGlvbiBsb2dvLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0ibG9nbyIgLz4KKyAgICAgICAgPCEtLSBTcGVjaWZpZXMgdGhlIGRyYXdhYmxlIHVzZWQgZm9yIGl0ZW0gZGl2aWRlcnMuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJkaXZpZGVyIiAvPgorICAgICAgICA8IS0tIFNwZWNpZmllcyBhIGJhY2tncm91bmQgZHJhd2FibGUgZm9yIHRoZSBhY3Rpb24gYmFyLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iYmFja2dyb3VuZCIgLz4KKyAgICAgICAgPCEtLSBTcGVjaWZpZXMgYSBsYXlvdXQgZm9yIGN1c3RvbSBuYXZpZ2F0aW9uLiBPdmVycmlkZXMgbmF2aWdhdGlvbk1vZGUuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJjdXN0b21OYXZpZ2F0aW9uTGF5b3V0IiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KKyAgICAgICAgPCEtLSBTcGVjaWZpZXMgYSBmaXhlZCBoZWlnaHQuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJoZWlnaHQiIC8+CisgICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KKwogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzL2F0dHJzX21hbmlmZXN0LnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMvYXR0cnNfbWFuaWZlc3QueG1sCmluZGV4IGYxOGQxNGUuLmJjMTMwZjIgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMvYXR0cnNfbWFuaWZlc3QueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMvYXR0cnNfbWFuaWZlc3QueG1sCkBAIC0yMzUsNiArMjM1LDEwIEBACiAgICAgICAgICB0aGUgc2FmZSBtb2RlLiAgLS0+CiAgICAgPGF0dHIgbmFtZT0idm1TYWZlTW9kZSIgZm9ybWF0PSJib29sZWFuIiAvPgogCisgICAgPCEtLSBGbGFnIGluZGljYXRpbmcgd2hldGhlciB0aGUgYXBwbGljYXRpb24ncyByZW5kZXJpbmcgc2hvdWxkIGJlIGhhcmR3YXJlCisgICAgICAgICBhY2NlbGVyYXRlZCBpZiBwb3NzaWJsZS4gIC0tPgorICAgIDxhdHRyIG5hbWU9ImhhcmR3YXJlQWNjZWxlcmF0ZWQiIGZvcm1hdD0iYm9vbGVhbiIgLz4KKwogICAgIDwhLS0gRmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGdpdmVuIGFwcGxpY2F0aW9uIGNvbXBvbmVudCBpcyBhdmFpbGFibGUKICAgICAgICAgIHRvIG90aGVyIGFwcGxpY2F0aW9ucy4gIElmIGZhbHNlLCBpdCBjYW4gb25seSBiZSBhY2Nlc3NlZCBieQogICAgICAgICAgYXBwbGljYXRpb25zIHdpdGggaXRzIHNhbWUgdXNlciBpZCAod2hpY2ggdXN1YWxseSBtZWFucyBvbmx5IGJ5CkBAIC03MzQsNiArNzM4LDcgQEAKICAgICAgICAgPGF0dHIgbmFtZT0iZW5hYmxlZCIgLz4KICAgICAgICAgPGF0dHIgbmFtZT0iZGVidWdnYWJsZSIgLz4KICAgICAgICAgPGF0dHIgbmFtZT0idm1TYWZlTW9kZSIgLz4KKyAgICAgICAgPGF0dHIgbmFtZT0iaGFyZHdhcmVBY2NlbGVyYXRlZCIgLz4KICAgICAgICAgPCEtLSBOYW1lIG9mIGFjdGl2aXR5IHRvIGJlIGxhdW5jaGVkIGZvciBtYW5hZ2luZyB0aGUgYXBwbGljYXRpb24ncyBzcGFjZSBvbiB0aGUgZGV2aWNlLiAtLT4KICAgICAgICAgPGF0dHIgbmFtZT0ibWFuYWdlU3BhY2VBY3Rpdml0eSIgLz4KICAgICAgICAgPGF0dHIgbmFtZT0iYWxsb3dDbGVhclVzZXJEYXRhIiAvPgpAQCAtMTIwNSw2ICsxMjEwLDcgQEAKICAgICAgICAgICAgICBhbnkgdmFsdWUgaW4gdGhlIHRoZW1lLiAtLT4KICAgICAgICAgPGF0dHIgbmFtZT0id2luZG93U29mdElucHV0TW9kZSIgLz4KICAgICAgICAgPGF0dHIgbmFtZT0iaW1tZXJzaXZlIiAvPgorICAgICAgICA8YXR0ciBuYW1lPSJoYXJkd2FyZUFjY2VsZXJhdGVkIiAvPgogICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+CiAgICAgCiAgICAgPCEtLSBUaGUgPGNvZGU+YWN0aXZpdHktYWxpYXM8L2NvZGU+IHRhZyBkZWNsYXJlcyBhIG5ldwpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy9jb2xvcnMueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy9jb2xvcnMueG1sCmluZGV4IGI2YWY2YjIuLmU5YTRjYTMgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMvY29sb3JzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzL2NvbG9ycy54bWwKQEAgLTE4LDggKzE4LDggQEAKICovCiAtLT4KIDxyZXNvdXJjZXM+Ci0JPGRyYXdhYmxlIG5hbWU9InNjcmVlbl9iYWNrZ3JvdW5kX2xpZ2h0Ij4jZmZmZmZmZmY8L2RyYXdhYmxlPgotCTxkcmF3YWJsZSBuYW1lPSJzY3JlZW5fYmFja2dyb3VuZF9kYXJrIj4jZmYwMDAwMDA8L2RyYXdhYmxlPgorCTxkcmF3YWJsZSBuYW1lPSJzY3JlZW5fYmFja2dyb3VuZF9saWdodCI+I2ZmZWZlZmVmPC9kcmF3YWJsZT4KKwk8ZHJhd2FibGUgbmFtZT0ic2NyZWVuX2JhY2tncm91bmRfZGFyayI+I2ZmMTAxMDEwPC9kcmF3YWJsZT4KICAgICA8ZHJhd2FibGUgbmFtZT0ic3RhdHVzX2Jhcl9jbG9zZWRfZGVmYXVsdF9iYWNrZ3JvdW5kIj4jZmYwMDAwMDA8L2RyYXdhYmxlPgogICAgIDxkcmF3YWJsZSBuYW1lPSJzdGF0dXNfYmFyX29wZW5lZF9kZWZhdWx0X2JhY2tncm91bmQiPiNmZjAwMDAwMDwvZHJhd2FibGU+CiAgICAgPGRyYXdhYmxlIG5hbWU9InNlYXJjaF9iYXJfZGVmYXVsdF9jb2xvciI+I2ZmMDAwMDAwPC9kcmF3YWJsZT4KQEAgLTM2LDI0ICszNiwzMCBAQAogICAgIDxjb2xvciBuYW1lPSJ3aGl0ZSI+I2ZmZmZmZmZmPC9jb2xvcj4KICAgICA8Y29sb3IgbmFtZT0iYmxhY2siPiNmZjAwMDAwMDwvY29sb3I+CiAgICAgPGNvbG9yIG5hbWU9InRyYW5zcGFyZW50Ij4jMDAwMDAwMDA8L2NvbG9yPgotICAgIDxjb2xvciBuYW1lPSJiYWNrZ3JvdW5kX2RhcmsiPiNmZjAwMDAwMDwvY29sb3I+Ci0gICAgPGNvbG9yIG5hbWU9ImJyaWdodF9mb3JlZ3JvdW5kX2RhcmsiPiNmZmZmZmZmZjwvY29sb3I+CisgICAgPGNvbG9yIG5hbWU9ImJhY2tncm91bmRfZGFyayI+I2ZmMTAxMDEwPC9jb2xvcj4KKyAgICA8Y29sb3IgbmFtZT0iYmFja2dyb3VuZF9saWdodCI+I2ZmZWZlZmVmPC9jb2xvcj4KKyAgICA8Y29sb3IgbmFtZT0iYnJpZ2h0X2ZvcmVncm91bmRfZGFyayI+QGFuZHJvaWQ6Y29sb3IvYmFja2dyb3VuZF9saWdodDwvY29sb3I+CisgICAgPGNvbG9yIG5hbWU9ImJyaWdodF9mb3JlZ3JvdW5kX2xpZ2h0Ij5AYW5kcm9pZDpjb2xvci9iYWNrZ3JvdW5kX2Rhcms8L2NvbG9yPgogICAgIDxjb2xvciBuYW1lPSJicmlnaHRfZm9yZWdyb3VuZF9kYXJrX2Rpc2FibGVkIj4jODBmZmZmZmY8L2NvbG9yPgotICAgIDxjb2xvciBuYW1lPSJicmlnaHRfZm9yZWdyb3VuZF9kYXJrX2ludmVyc2UiPiNmZjAwMDAwMDwvY29sb3I+CisgICAgPGNvbG9yIG5hbWU9ImJyaWdodF9mb3JlZ3JvdW5kX2xpZ2h0X2Rpc2FibGVkIj4jODAwMDAwMDA8L2NvbG9yPgorICAgIDxjb2xvciBuYW1lPSJicmlnaHRfZm9yZWdyb3VuZF9kYXJrX2ludmVyc2UiPkBhbmRyb2lkOmNvbG9yL2JyaWdodF9mb3JlZ3JvdW5kX2xpZ2h0PC9jb2xvcj4KKyAgICA8Y29sb3IgbmFtZT0iYnJpZ2h0X2ZvcmVncm91bmRfbGlnaHRfaW52ZXJzZSI+QGFuZHJvaWQ6Y29sb3IvYnJpZ2h0X2ZvcmVncm91bmRfZGFyazwvY29sb3I+CiAgICAgPGNvbG9yIG5hbWU9ImRpbV9mb3JlZ3JvdW5kX2RhcmsiPiNiZWJlYmU8L2NvbG9yPgogICAgIDxjb2xvciBuYW1lPSJkaW1fZm9yZWdyb3VuZF9kYXJrX2Rpc2FibGVkIj4jODBiZWJlYmU8L2NvbG9yPgogICAgIDxjb2xvciBuYW1lPSJkaW1fZm9yZWdyb3VuZF9kYXJrX2ludmVyc2UiPiMzMjMyMzI8L2NvbG9yPgogICAgIDxjb2xvciBuYW1lPSJkaW1fZm9yZWdyb3VuZF9kYXJrX2ludmVyc2VfZGlzYWJsZWQiPiM4MDMyMzIzMjwvY29sb3I+CiAgICAgPGNvbG9yIG5hbWU9ImhpbnRfZm9yZWdyb3VuZF9kYXJrIj4jODA4MDgwPC9jb2xvcj4KLSAgICA8Y29sb3IgbmFtZT0iYmFja2dyb3VuZF9saWdodCI+I2ZmZmZmZmZmPC9jb2xvcj4KLSAgICA8Y29sb3IgbmFtZT0iYnJpZ2h0X2ZvcmVncm91bmRfbGlnaHQiPiNmZjAwMDAwMDwvY29sb3I+Ci0gICAgPGNvbG9yIG5hbWU9ImJyaWdodF9mb3JlZ3JvdW5kX2xpZ2h0X2ludmVyc2UiPiNmZmZmZmZmZjwvY29sb3I+Ci0gICAgPGNvbG9yIG5hbWU9ImJyaWdodF9mb3JlZ3JvdW5kX2xpZ2h0X2Rpc2FibGVkIj4jODAwMDAwMDA8L2NvbG9yPgogICAgIDxjb2xvciBuYW1lPSJkaW1fZm9yZWdyb3VuZF9saWdodCI+IzMyMzIzMjwvY29sb3I+CiAgICAgPGNvbG9yIG5hbWU9ImRpbV9mb3JlZ3JvdW5kX2xpZ2h0X2Rpc2FibGVkIj4jODAzMjMyMzI8L2NvbG9yPgogICAgIDxjb2xvciBuYW1lPSJkaW1fZm9yZWdyb3VuZF9saWdodF9pbnZlcnNlIj4jYmViZWJlPC9jb2xvcj4KICAgICA8Y29sb3IgbmFtZT0iZGltX2ZvcmVncm91bmRfbGlnaHRfaW52ZXJzZV9kaXNhYmxlZCI+IzgwYmViZWJlPC9jb2xvcj4KICAgICA8Y29sb3IgbmFtZT0iaGludF9mb3JlZ3JvdW5kX2xpZ2h0Ij4jODA4MDgwPC9jb2xvcj4KKyAgICA8Y29sb3IgbmFtZT0iaGlnaGxpZ2h0X2JhY2tncm91bmQiPiNjYzQ3NTkyNTwvY29sb3I+CisgICAgPGNvbG9yIG5hbWU9ImhpZ2hsaWdodF9iYWNrZ3JvdW5kX2ludmVyc2UiPiNjY2QyZTQ2MTwvY29sb3I+CisgICAgPGNvbG9yIG5hbWU9ImhpZ2hsaWdodGVkX3RleHRfZGFyayI+I2NjNDc1OTI1PC9jb2xvcj4KKyAgICA8Y29sb3IgbmFtZT0iaGlnaGxpZ2h0ZWRfdGV4dF9saWdodCI+I2NjZDJlNDYxPC9jb2xvcj4KKyAgICA8Y29sb3IgbmFtZT0ibGlua190ZXh0X2RhcmsiPiM1YzVjZmY8L2NvbG9yPgorICAgIDxjb2xvciBuYW1lPSJsaW5rX3RleHRfbGlnaHQiPiMwMDAwZWU8L2NvbG9yPgogCiAgICAgPGRyYXdhYmxlIG5hbWU9InN0YXRfbm90aWZ5X3N5bmNfbm9hbmltIj5AZHJhd2FibGUvc3RhdF9ub3RpZnlfc3luY19hbmltMDwvZHJhd2FibGU+CiAgICAgPGRyYXdhYmxlIG5hbWU9InN0YXRfc3lzX2Rvd25sb2FkX2RvbmUiPkBkcmF3YWJsZS9zdGF0X3N5c19kb3dubG9hZF9hbmltMDwvZHJhd2FibGU+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzL2NvbmZpZy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzL2NvbmZpZy54bWwKaW5kZXggODAwZWQxMy4uM2UzZjQ3YyAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy9jb25maWcueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMvY29uZmlnLnhtbApAQCAtMjIsNyArMjIsOCBAQAogPHJlc291cmNlcyB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+CiAgICAgPCEtLSBDb21wb25lbnQgdG8gYmUgdXNlZCBhcyB0aGUgc3RhdHVzIGJhciBzZXJ2aWNlLiAgTXVzdCBpbXBsZW1lbnQgdGhlIElTdGF0dXNCYXIKICAgICAgICAgIGludGVyZmFjZS4gIFRoaXMgbmFtZSBpcyBpbiB0aGUgQ29tcG9uZW50TmFtZSBmbGF0dGVuZWQgZm9ybWF0IChwYWNrYWdlL2NsYXNzKSAgLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJjb25maWdfc3RhdHVzQmFyQ29tcG9uZW50Ij5jb20uYW5kcm9pZC5zeXN0ZW11aS9jb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIuU3RhdHVzQmFyU2VydmljZTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY29uZmlnX3N0YXR1c0JhckNvbXBvbmVudCI+Y29tLmFuZHJvaWQuc3lzdGVtdWkvY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLlBob25lU3RhdHVzQmFyU2VydmljZTwvc3RyaW5nPgorICAgIDxib29sIG5hbWU9ImNvbmZpZ19zdGF0dXNCYXJDYW5IaWRlIj50cnVlPC9ib29sPgogCiAgICAgPCEtLSBEbyBub3QgdHJhbnNsYXRlLiBEZWZpbmVzIHRoZSBzbG90cyBmb3IgdGhlIHJpZ2h0LWhhbmQgc2lkZSBpY29ucy4gIFRoYXQgaXMgdG8gc2F5LCB0aGUKICAgICAgICAgIGljb25zIGluIHRoZSBzdGF0dXMgYmFyIHRoYXQgYXJlIG5vdCBub3RpZmljYXRpb25zLiAtLT4KQEAgLTcyLDYgKzczLDEzIEBACiAgICAgICAgICB3aGVuIHRoZXJlJ3Mgbm8gbmV0d29yayBjb25uZWN0aW9uLiBJZiB0aGUgc2NhbiBkb2Vzbid0IHRpbWVvdXQsIHVzZSB6ZXJvIC0tPgogICAgIDxpbnRlZ2VyIG5hbWU9ImNvbmZpZ19yYWRpb1NjYW5uaW5nVGltZW91dCI+MDwvaW50ZWdlcj4KIAorICAgIDwhLS0gU2V0IHRvIHRydWUgaWYgdGhlIGxvY2F0aW9uIHJldHVybmVkIEVudmlyb25tZW50LmdldEV4dGVybmFsU3RvcmFnZURpcmVjdG9yeSgpCisgICAgICAgICBpcyBhY3R1YWxseSBhIHN1YmRpcmVjdG9yeSBvZiB0aGUgaW50ZXJuYWwgc3RvcmFnZS4KKyAgICAgICAgIElmIHRoaXMgaXMgc2V0IHRoZW4gRW52aXJvbm1lbnQuZ2V0RXh0ZXJuYWxTdG9yYWdlU3RhdGUoKSB3aWxsIGFsd2F5cyByZXR1cm4KKyAgICAgICAgIE1FRElBX01PVU5URUQgYW5kIEludGVudC5BQ1RJT05fTUVESUFfTU9VTlRFRCB3aWxsIGJlIGJyb2FkY2FzdCBhdCBib290IHRpbWUKKyAgICAgICAgIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggYXBwcyB0aGF0IHJlcXVpcmUgZXh0ZXJuYWwgc3RvcmFnZS4gLS0+CisgICAgPGJvb2wgbmFtZT0iY29uZmlnX2VtdWxhdGVFeHRlcm5hbFN0b3JhZ2UiPmZhbHNlPC9ib29sPgorCiAgICAgPCEtLSBYWFhYWCBOT1RFIFRIRSBGT0xMT1dJTkcgUkVTT1VSQ0VTIFVTRSBUSEUgV1JPTkcgTkFNSU5HIENPTlZFTlRJT04uCiAgICAgICAgICBQbGVhc2UgZG9uJ3QgY29weSB0aGVtLCBjb3B5IGFueXRoaW5nIGVsc2UuIC0tPgogCkBAIC05OCw2ICsxMDYsOSBAQAogICAgICAgICA8aXRlbT4iMCwxIjwvaXRlbT4KICAgICA8L3N0cmluZy1hcnJheT4KIAorICAgIDwhLS0gVGhlIG1heGltdW0gZHVyYXRpb24gKGluIG1pbGxpc2Vjb25kcykgd2UgZXhwZWN0IGEgbmV0d29yayB0cmFuc2l0aW9uIHRvIHRha2UgLS0+CisgICAgPGludGVnZXIgbmFtZT0iY29uZmlnX25ldHdvcmtUcmFuc2l0aW9uVGltZW91dCI+NjAwMDA8L2ludGVnZXI+CisKICAgICA8IS0tIExpc3Qgb2YgcmVnZXhwcmVzc2lvbnMgZGVzY3JpYmluZyB0aGUgaW50ZXJmYWNlIChpZiBhbnkpIHRoYXQgcmVwcmVzZW50IHRldGhlcmFibGUKICAgICAgICAgIFVTQiBpbnRlcmZhY2VzLiAgSWYgdGhlIGRldmljZSBkb2Vzbid0IHdhbnQgdG8gc3VwcG9ydCB0ZXRoaW5nIG92ZXIgVVNCIHRoaXMgc2hvdWxkCiAgICAgICAgICBiZSBlbXB0eS4gIEFuIGV4YW1wbGUgd291bGQgYmUgInVzYi4qIiAtLT4KQEAgLTExMCw2ICsxMjEsMTIgQEAKICAgICA8c3RyaW5nLWFycmF5IHRyYW5zbGF0YWJsZT0iZmFsc2UiIG5hbWU9ImNvbmZpZ190ZXRoZXJfd2lmaV9yZWdleHMiPgogICAgIDwvc3RyaW5nLWFycmF5PgogCisgICAgPCEtLSBMaXN0IG9mIHJlZ2V4cHJlc3Npb25zIGRlc2NyaWJpbmcgdGhlIGludGVyZmFjZSAoaWYgYW55KSB0aGF0IHJlcHJlc2VudCB0ZXRoZXJhYmxlCisgICAgICAgICBibHVldG9vdGggaW50ZXJmYWNlcy4gIElmIHRoZSBkZXZpY2UgZG9lc24ndCB3YW50IHRvIHN1cHBvcnQgdGV0aGVyaW5nIG92ZXIgYmx1ZXRvb3RoIHRoaXMKKyAgICAgICAgIHNob3VsZCBiZSBlbXB0eS4gLS0+CisgICAgPHN0cmluZy1hcnJheSB0cmFuc2xhdGFibGU9ImZhbHNlIiBuYW1lPSJjb25maWdfdGV0aGVyX2JsdWV0b290aF9yZWdleHMiPgorICAgIDwvc3RyaW5nLWFycmF5PgorCiAgICAgPCEtLSBEaGNwIHJhbmdlIChtaW4sIG1heCkgdG8gdXNlIGZvciB0ZXRoZXJpbmcgcHVycG9zZXMgLS0+CiAgICAgPHN0cmluZy1hcnJheSB0cmFuc2xhdGFibGU9ImZhbHNlIiBuYW1lPSJjb25maWdfdGV0aGVyX2RoY3BfcmFuZ2UiPgogICAgIDwvc3RyaW5nLWFycmF5PgpAQCAtMTkxLDYgKzIwOCw5IEBACiAgICAgPCEtLSBJbmRpY2F0ZSB3aGV0aGVyIHRoZSBTRCBjYXJkIGlzIGFjY2Vzc2libGUgd2l0aG91dCByZW1vdmluZyB0aGUgYmF0dGVyeS4gLS0+CiAgICAgPGJvb2wgbmFtZT0iY29uZmlnX2JhdHRlcnlTZENhcmRBY2Nlc3NpYmlsaXR5Ij5mYWxzZTwvYm9vbD4KIAorICAgIDwhLS0gSW5kaWNhdGUgd2hldGhlciB0aGUgZGV2aWNlIGhhcyBVU0IgaG9zdCBzdXBwb3J0LiAtLT4KKyAgICA8Ym9vbCBuYW1lPSJjb25maWdfaGFzVXNiSG9zdFN1cHBvcnQiPmZhbHNlPC9ib29sPgorCiAgICAgPCEtLSBWaWJyYXRvciBwYXR0ZXJuIGZvciBmZWVkYmFjayBhYm91dCBhIGxvbmcgc2NyZWVuL2tleSBwcmVzcyAtLT4KICAgICA8aW50ZWdlci1hcnJheSBuYW1lPSJjb25maWdfbG9uZ1ByZXNzVmliZVBhdHRlcm4iPgogICAgICAgICA8aXRlbT4wPC9pdGVtPgpAQCAtMjczLDYgKzI5MywxMiBAQAogICAgIDwhLS0gQWxsb3cgdGhlIG1lbnUgaGFyZCBrZXkgdG8gYmUgZGlzYWJsZWQgaW4gTG9ja1NjcmVlbiBvbiBzb21lIGRldmljZXMgLS0+CiAgICAgPGJvb2wgbmFtZT0iY29uZmlnX2Rpc2FibGVNZW51S2V5SW5Mb2NrU2NyZWVuIj5mYWxzZTwvYm9vbD4KIAorICAgIDwhLS0gU2hvdyBzbGlkaW5nIHRhYiBiZWZvcmUgbG9ja3NjcmVlbiAtLT4KKyAgICA8Ym9vbCBuYW1lPSJjb25maWdfZW5hYmxlU2xpZGluZ1RhYkZpcnN0Ij50cnVlPC9ib29sPgorCisgICAgPCEtLSBEaWFibGUgbG9ja3NjcmVlbiByb3RhdGlvbiBieSBkZWZhdWx0IC0tPgorICAgIDxib29sIG5hbWU9ImNvbmZpZ19lbmFibGVMb2NrU2NyZWVuUm90YXRpb24iPmZhbHNlPC9ib29sPgorCiAgICAgPCEtLSBBcnJheSBvZiBsaWdodCBzZW5zb3IgTFVYIHZhbHVlcyB0byBkZWZpbmUgb3VyIGxldmVscyBmb3IgYXV0byBiYWNrbGlnaHQgYnJpZ2h0bmVzcyBzdXBwb3J0LgogICAgICAgICAgVGhlIE4gZW50cmllcyBvZiB0aGlzIGFycmF5IGRlZmluZSBOICsgMSB6b25lcyBhcyBmb2xsb3dzOgogCkBAIC0zNTcsNCArMzgzLDE3IEBACiAgICAgPCEtLSAyIG1lYW5zIGdpdmUgd2FybmluZyAtLT4KICAgICA8aW50ZWdlciBuYW1lPSJjb25maWdfZGF0YXVzZV9ub3RpZmljYXRpb25fdHlwZSI+MjwvaW50ZWdlcj4KIAorICAgIDwhLS0gRmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGN1cnJlbnQgZGV2aWNlIGlzICJ2b2ljZSBjYXBhYmxlIi4KKyAgICAgICAgIElmIHRydWUsIHRoaXMgbWVhbnMgdGhhdCB0aGUgZGV2aWNlIHN1cHBvcnRzIGNpcmN1aXQtc3dpdGNoZWQKKyAgICAgICAgIChpLmUuIHZvaWNlKSBwaG9uZSBjYWxscyBvdmVyIHRoZSB0ZWxlcGhvbnkgbmV0d29yaywgYW5kIGlzCisgICAgICAgICBhbGxvd2VkIHRvIGRpc3BsYXkgdGhlIGluLWNhbGwgVUkgd2hpbGUgYSBjZWxsdWxhciB2b2ljZSBjYWxsIGlzCisgICAgICAgICBhY3RpdmUuICBUaGlzIGNhbiBiZSBvdmVycmlkZGVuIHRvIGZhbHNlIGZvciAiZGF0YSBvbmx5IiBkZXZpY2VzCisgICAgICAgICB3aGljaCBjYW4ndCBtYWtlIHZvaWNlIGNhbGxzIGFuZCBkb24ndCBzdXBwb3J0IGFueSBpbi1jYWxsIFVJLgorCisgICAgICAgICBOb3RlOiB0aGlzIGZsYWcgaXMgc3VidGx5IGRpZmZlcmVudCBmcm9tIHRoZQorICAgICAgICAgUGFja2FnZU1hbmFnZXIuRkVBVFVSRV9URUxFUEhPTlkgc3lzdGVtIGZlYXR1cmUsIHdoaWNoIGlzCisgICAgICAgICBhdmFpbGFibGUgb24gKmFueSogZGV2aWNlIHdpdGggYSB0ZWxlcGhvbnkgcmFkaW8sIGV2ZW4gaWYgdGhlCisgICAgICAgICBkZXZpY2UgaXMgZGF0YS1vbmx5LiAtLT4KKyAgICA8Ym9vbCBuYW1lPSJjb25maWdfdm9pY2VfY2FwYWJsZSI+dHJ1ZTwvYm9vbD4KKwogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzL2RpbWVucy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzL2RpbWVucy54bWwKaW5kZXggMTFmM2U1MC4uZDNhYTJkNCAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy9kaW1lbnMueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMvZGltZW5zLnhtbApAQCAtMjUsNiArMjUsOSBAQAogICAgIDwhLS0gVGhlIHN0YW5kYXJkIHNpemUgKGJvdGggd2lkdGggYW5kIGhlaWdodCkgb2YgYW4gYXBwbGljYXRpb24gaWNvbiB0aGF0CiAgICAgICAgICB3aWxsIGJlIGRpc3BsYXllZCBpbiB0aGUgYXBwIGxhdW5jaGVyIGFuZCBlbHNld2hlcmUuIC0tPgogICAgIDxkaW1lbiBuYW1lPSJhcHBfaWNvbl9zaXplIj40OGRpcDwvZGltZW4+CisgICAgPCEtLSBUaGUgc3RhbmRhcmQgc2l6ZSAoYm90aCB3aWR0aCBhbmQgaGVpZ2h0KSBvZiBhbiBhY3Rpb24gaWNvbiB0aGF0IHdpbGwKKyAgICAgICAgIGJlIGRpc3BsYXllZCBpbiBhcHBsaWNhdGlvbiBhY3Rpb24gYmFycy4gLS0+CisgICAgPGRpbWVuIG5hbWU9ImFjdGlvbl9pY29uX3NpemUiPjQ4ZGlwPC9kaW1lbj4KICAgICA8ZGltZW4gbmFtZT0idG9hc3RfeV9vZmZzZXQiPjY0ZGlwPC9kaW1lbj4KICAgICA8IS0tIEhlaWdodCBvZiB0aGUgc3RhdHVzIGJhciAtLT4KICAgICA8ZGltZW4gbmFtZT0ic3RhdHVzX2Jhcl9oZWlnaHQiPjI1ZGlwPC9kaW1lbj4KQEAgLTMyLDE0ICszNSwxOCBAQAogICAgIDxkaW1lbiBuYW1lPSJzdGF0dXNfYmFyX2ljb25fc2l6ZSI+MjVkaXA8L2RpbWVuPgogICAgIDwhLS0gTWFyZ2luIGF0IHRoZSBlZGdlIG9mIHRoZSBzY3JlZW4gdG8gaWdub3JlIHRvdWNoIGV2ZW50cyBmb3IgaW4gdGhlIHdpbmRvd3NoYWRlLiAtLT4KICAgICA8ZGltZW4gbmFtZT0ic3RhdHVzX2Jhcl9lZGdlX2lnbm9yZSI+NWRwPC9kaW1lbj4KKyAgICA8IS0tIE1hcmdpbiBmb3IgcGVybWFuZW50IHNjcmVlbiBkZWNvcmF0aW9ucyBhdCB0aGUgYm90dG9tLiAtLT4KKyAgICA8ZGltZW4gbmFtZT0ic2NyZWVuX21hcmdpbl9ib3R0b20iPjBkaXA8L2RpbWVuPgogICAgIDwhLS0gU2l6ZSBvZiB0aGUgZmFzdHNjcm9sbCBoaW50IGxldHRlciAtLT4KICAgICA8ZGltZW4gbmFtZT0iZmFzdHNjcm9sbF9vdmVybGF5X3NpemUiPjEwNGRwPC9kaW1lbj4KICAgICA8IS0tIFdpZHRoIG9mIHRoZSBmYXN0c2Nyb2xsIHRodW1iIC0tPgogICAgIDxkaW1lbiBuYW1lPSJmYXN0c2Nyb2xsX3RodW1iX3dpZHRoIj42NGRwPC9kaW1lbj4KICAgICA8IS0tIEhlaWdodCBvZiB0aGUgZmFzdHNjcm9sbCB0aHVtYiAtLT4KICAgICA8ZGltZW4gbmFtZT0iZmFzdHNjcm9sbF90aHVtYl9oZWlnaHQiPjUyZHA8L2RpbWVuPgotICAgIDwhLS0gRGVmYXVsdCBoZWlnaHQgb2YgYSBrZXkgaW4gdGhlIHBhc3N3b3JkIGtleWJvYXJkIC0tPgotICAgIDxkaW1lbiBuYW1lPSJwYXNzd29yZF9rZXlib2FyZF9rZXlfaGVpZ2h0Ij41NmRpcDwvZGltZW4+CisgICAgPCEtLSBEZWZhdWx0IGhlaWdodCBvZiBhIGtleSBpbiB0aGUgcGFzc3dvcmQga2V5Ym9hcmQgZm9yIGFscGhhIC0tPgorICAgIDxkaW1lbiBuYW1lPSJwYXNzd29yZF9rZXlib2FyZF9rZXlfaGVpZ2h0X2FscGhhIj41NmRpcDwvZGltZW4+CisgICAgPCEtLSBEZWZhdWx0IGhlaWdodCBvZiBhIGtleSBpbiB0aGUgcGFzc3dvcmQga2V5Ym9hcmQgZm9yIG51bWVyaWMgLS0+CisgICAgPGRpbWVuIG5hbWU9InBhc3N3b3JkX2tleWJvYXJkX2tleV9oZWlnaHRfbnVtZXJpYyI+NTZkaXA8L2RpbWVuPgogICAgIDwhLS0gRGVmYXVsdCBjb3JyZWN0aW9uIGZvciB0aGUgc3BhY2Uga2V5IGluIHRoZSBwYXNzd29yZCBrZXlib2FyZCAtLT4KICAgICA8ZGltZW4gbmFtZT0icGFzc3dvcmRfa2V5Ym9hcmRfc3BhY2ViYXJfdmVydGljYWxfY29ycmVjdGlvbiI+NGRpcDwvZGltZW4+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMvaWRzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMvaWRzLnhtbAppbmRleCA4YjZhZjcxLi4zM2NkMTAwIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzL2lkcy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy9pZHMueG1sCkBAIC01OSw2ICs1OSw3IEBACiAgIDxpdGVtIHR5cGU9ImlkIiBuYW1lPSJjb3B5IiAvPgogICA8aXRlbSB0eXBlPSJpZCIgbmFtZT0icGFzdGUiIC8+CiAgIDxpdGVtIHR5cGU9ImlkIiBuYW1lPSJjb3B5VXJsIiAvPgorICA8aXRlbSB0eXBlPSJpZCIgbmFtZT0ic2VsZWN0VGV4dE1vZGUiIC8+CiAgIDxpdGVtIHR5cGU9ImlkIiBuYW1lPSJzd2l0Y2hJbnB1dE1ldGhvZCIgLz4KICAgPGl0ZW0gdHlwZT0iaWQiIG5hbWU9ImtleWJvYXJkVmlldyIgLz4KICAgPGl0ZW0gdHlwZT0iaWQiIG5hbWU9ImNsb3NlQnV0dG9uIiAvPgpAQCAtNjgsNCArNjksNSBAQAogICA8aXRlbSB0eXBlPSJpZCIgbmFtZT0iYWNjb3VudFByZWZlcmVuY2VzIiAvPgogICA8aXRlbSB0eXBlPSJpZCIgbmFtZT0ic21hbGxJY29uIiAvPgogICA8aXRlbSB0eXBlPSJpZCIgbmFtZT0iY3VzdG9tIiAvPgorICA8aXRlbSB0eXBlPSJpZCIgbmFtZT0iaG9tZSIgLz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy9wdWJsaWMueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy9wdWJsaWMueG1sCmluZGV4IDFkZjQyNGIuLmRkZDNjMDAgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMvcHVibGljLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzL3B1YmxpYy54bWwKQEAgLTExODMsNyArMTE4Myw3IEBACiAgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iY29sb3JCYWNrZ3JvdW5kQ2FjaGVIaW50IiBpZD0iMHgwMTAxMDJhYiIgLz4KICAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJkcm9wRG93bkhvcml6b250YWxPZmZzZXQiIGlkPSIweDAxMDEwMmFjIiAvPgogICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9ImRyb3BEb3duVmVydGljYWxPZmZzZXQiIGlkPSIweDAxMDEwMmFkIiAvPgotICAKKwogICA8cHVibGljIHR5cGU9InN0eWxlIiBuYW1lPSJUaGVtZS5XYWxscGFwZXIiIGlkPSIweDAxMDMwMDVlIiAvPgogICA8cHVibGljIHR5cGU9InN0eWxlIiBuYW1lPSJUaGVtZS5XYWxscGFwZXIuTm9UaXRsZUJhciIgaWQ9IjB4MDEwMzAwNWYiIC8+CiAgIDxwdWJsaWMgdHlwZT0ic3R5bGUiIG5hbWU9IlRoZW1lLldhbGxwYXBlci5Ob1RpdGxlQmFyLkZ1bGxzY3JlZW4iIGlkPSIweDAxMDMwMDYwIiAvPgpAQCAtMTE5MSw3ICsxMTkxLDcgQEAKICAgPHB1YmxpYyB0eXBlPSJzdHlsZSIgbmFtZT0iVGhlbWUuTGlnaHQuV2FsbHBhcGVyU2V0dGluZ3MiIGlkPSIweDAxMDMwMDYyIiAvPgogICA8cHVibGljIHR5cGU9InN0eWxlIiBuYW1lPSJUZXh0QXBwZWFyYW5jZS5TZWFyY2hSZXN1bHQuVGl0bGUiIGlkPSIweDAxMDMwMDYzIiAvPgogICA8cHVibGljIHR5cGU9InN0eWxlIiBuYW1lPSJUZXh0QXBwZWFyYW5jZS5TZWFyY2hSZXN1bHQuU3VidGl0bGUiIGlkPSIweDAxMDMwMDY0IiAvPgotICAKKwogICA8IS0tIFNlbWktdHJhbnNwYXJlbnQgYmFja2dyb3VuZCB0aGF0IGNhbiBiZSB1c2VkIHdoZW4gcGxhY2luZyBhIGRhcmsKICAgICAgICB0aGVtZWQgVUkgb24gdG9wIG9mIHNvbWUgYXJiaXRyYXJ5IGJhY2tncm91bmQgKHN1Y2ggYXMgdGhlCiAgICAgICAgd2FsbHBhcGVyKS4gIFRoaXMgZGFya2VucyB0aGUgYmFja2dyb3VuZCBzdWZmaWNpZW50bHkgdGhhdCB0aGUgVUkKQEAgLTExOTksNyArMTE5OSw3IEBACiAgIDxwdWJsaWMgdHlwZT0iZHJhd2FibGUiIG5hbWU9InNjcmVlbl9iYWNrZ3JvdW5kX2RhcmtfdHJhbnNwYXJlbnQiIGlkPSIweDAxMDgwMGE5IiAvPgogICA8cHVibGljIHR5cGU9ImRyYXdhYmxlIiBuYW1lPSJzY3JlZW5fYmFja2dyb3VuZF9saWdodF90cmFuc3BhcmVudCIgaWQ9IjB4MDEwODAwYWEiIC8+CiAgIDxwdWJsaWMgdHlwZT0iZHJhd2FibGUiIG5hbWU9InN0YXRfbm90aWZ5X3NkY2FyZF9wcmVwYXJlIiBpZD0iMHgwMTA4MDBhYiIgLz4KLSAgCisKIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgIFJlc291cmNlcyBhZGRlZCBpbiB2ZXJzaW9uIDYgb2YgdGhlIHBsYXRmb3JtIChFY2xhaXIgMi4wLjEpLgogICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CkBAIC0xMjExLDcgKzEyMTEsNyBAQAogICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9InF1aWNrQ29udGFjdEJhZGdlU3R5bGVTbWFsbFdpbmRvd1NtYWxsIiBpZD0iMHgwMTAxMDJiMSIgLz4KICAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJxdWlja0NvbnRhY3RCYWRnZVN0eWxlU21hbGxXaW5kb3dNZWRpdW0iIGlkPSIweDAxMDEwMmIyIiAvPgogICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9InF1aWNrQ29udGFjdEJhZGdlU3R5bGVTbWFsbFdpbmRvd0xhcmdlIiBpZD0iMHgwMTAxMDJiMyIgLz4KLSAgCisKIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgIFJlc291cmNlcyBhZGRlZCBpbiB2ZXJzaW9uIDcgb2YgdGhlIHBsYXRmb3JtIChFY2xhaXIgTVIxKS4KICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgpAQCAtMTIyMCw3ICsxMjIwLDcgQEAKICAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJhdXRob3IiIGlkPSIweDAxMDEwMmI0IiAvPgogICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9ImF1dG9TdGFydCIgaWQ9IjB4MDEwMTAyYjUiIC8+CiAKLSAgICAKKwogPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICAgUmVzb3VyY2VzIGFkZGVkIGluIHZlcnNpb24gOCBvZiB0aGUgcGxhdGZvcm0gKEVjbGFpciBNUjIpLgogICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CkBAIC0xMjQxLDE5ICsxMjQxLDE5IEBACiAgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0idGFiU3RyaXBFbmFibGVkIiBpZD0iMHgwMTAxMDJiZCIgLz4KIAogICA8cHVibGljIHR5cGU9ImlkIiBuYW1lPSJjdXN0b20iIGlkPSIweDAxMDIwMDJiIiAvPgotICAgIAorCiAgIDxwdWJsaWMgdHlwZT0iYW5pbSIgbmFtZT0iY3ljbGVfaW50ZXJwb2xhdG9yIiBpZD0iMHgwMTBhMDAwYyIgLz4KIAogPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICAgUmVzb3VyY2VzIGludHJvZHVjZWQgaW4gR2luZ2VyYnJlYWQuCiAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICAgCisgIDxlYXQtY29tbWVudCAvPgogICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9ImxvZ28iIGlkPSIweDAxMDEwMmJlIiAvPgogICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9InhsYXJnZVNjcmVlbnMiIGlkPSIweDAxMDEwMmJmIiAvPgogICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9ImhlYXZ5V2VpZ2h0IiBpZD0iMHgwMTAxMDJjMCIgLz4KICAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJpbW1lcnNpdmUiIGlkPSIweDAxMDEwMmMxIiAvPgogICA8cHVibGljLXBhZGRpbmcgdHlwZT0iYXR0ciIgbmFtZT0ia3Jha2VuX3Jlc291cmNlX3BhZCIgZW5kPSIweDAxMDEwMzAwIiAvPgotICAKKwogICA8cHVibGljLXBhZGRpbmcgdHlwZT0iaWQiIG5hbWU9ImtyYWtlbl9yZXNvdXJjZV9wYWQiIGVuZD0iMHgwMTAyMDA0MCIgLz4KICAgPHB1YmxpYy1wYWRkaW5nIHR5cGU9ImFuaW0iIG5hbWU9ImtyYWtlbl9yZXNvdXJjZV9wYWQiIGVuZD0iMHgwMTBhMDAyMCIgLz4KIApAQCAtMTI2Myw5ICsxMjYzLDkgQEAKICAgPHB1YmxpYyB0eXBlPSJkcmF3YWJsZSIgbmFtZT0icHJlc2VuY2VfdmlkZW9fb25saW5lIiBpZD0iMHgwMTA4MDBhZSIgLz4KICAgPHB1YmxpYyB0eXBlPSJkcmF3YWJsZSIgbmFtZT0icHJlc2VuY2VfYXVkaW9fYXdheSIgaWQ9IjB4MDEwODAwYWYiIC8+CiAgIDxwdWJsaWMgdHlwZT0iZHJhd2FibGUiIG5hbWU9InByZXNlbmNlX2F1ZGlvX2J1c3kiIGlkPSIweDAxMDgwMGIwIiAvPgotICA8cHVibGljIHR5cGU9ImRyYXdhYmxlIiBuYW1lPSJwcmVzZW5jZV9hdWRpb19vbmxpbmUiIGlkPSIweDAxMDgwMGIxIiAvPiAgCisgIDxwdWJsaWMgdHlwZT0iZHJhd2FibGUiIG5hbWU9InByZXNlbmNlX2F1ZGlvX29ubGluZSIgaWQ9IjB4MDEwODAwYjEiIC8+CiAgIDxwdWJsaWMtcGFkZGluZyB0eXBlPSJkcmF3YWJsZSIgbmFtZT0ia3Jha2VuX3Jlc291cmNlX3BhZCIgZW5kPSIweDAxMDgwMTAwIiAvPgotICAKKwogICA8cHVibGljLXBhZGRpbmcgdHlwZT0ic3R5bGUiIG5hbWU9ImtyYWtlbl9yZXNvdXJjZV9wYWQiIGVuZD0iMHgwMTAzMDA5MCIgLz4KICAgPHB1YmxpYy1wYWRkaW5nIHR5cGU9InN0cmluZyIgbmFtZT0ia3Jha2VuX3Jlc291cmNlX3BhZCIgZW5kPSIweDAxMDQwMDIwIiAvPgogICA8cHVibGljLXBhZGRpbmcgdHlwZT0iaW50ZWdlciIgbmFtZT0ia3Jha2VuX3Jlc291cmNlX3BhZCIgZW5kPSIweDAxMGUwMDEwIiAvPgpAQCAtMTI3Myw0ICsxMjczLDkxIEBACiAgIDxwdWJsaWMtcGFkZGluZyB0eXBlPSJkaW1lbiIgbmFtZT0ia3Jha2VuX3Jlc291cmNlX3BhZCIgZW5kPSIweDAxMDUwMDEwIiAvPgogICA8cHVibGljLXBhZGRpbmcgdHlwZT0iY29sb3IiIG5hbWU9ImtyYWtlbl9yZXNvdXJjZV9wYWQiIGVuZD0iMHgwMTA2MDAyMCIgLz4KICAgPHB1YmxpYy1wYWRkaW5nIHR5cGU9ImFycmF5IiBuYW1lPSJrcmFrZW5fcmVzb3VyY2VfcGFkIiBlbmQ9IjB4MDEwNzAwMTAiIC8+CisKKzwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgIFJlc291cmNlcyBwcm9wb3NlZCBmb3IgSG9uZXljb21iLgorICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgIDxlYXQtY29tbWVudCAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9ImFkYXB0ZXIiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0ic2VsZWN0aW9uIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9InNvcnRPcmRlciIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJ1cmkiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iZnJvbSIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJ0byIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJhcyIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJmcm9tVmFsdWUiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0idG9WYWx1ZSIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJjb2x1bW4iIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0id2l0aEV4cHJlc3Npb24iIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0id2l0aENsYXNzIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9ImFsbENvbnRhY3RzTmFtZSIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJ3aW5kb3dBY3Rpb25CYXIiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0id2luZG93QWN0aW9uQmFyU3R5bGUiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0ibmF2aWdhdGlvbk1vZGUiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iZGlzcGxheU9wdGlvbnMiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0ic3VidGl0bGUiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iY3VzdG9tTmF2aWdhdGlvbkxheW91dCIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJoYXJkd2FyZUFjY2VsZXJhdGVkIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9Im1lYXN1cmVXaXRoTGFyZ2VzdENoaWxkIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9ImFuaW1hdGVGaXJzdFZpZXciIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iZHJvcERvd25TcGlubmVyU3R5bGUiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iYWN0aW9uRHJvcERvd25TdHlsZSIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJhY3Rpb25CdXR0b25TdHlsZSIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJzaG93QXNBY3Rpb24iIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iYWN0aW9uQnV0dG9uUGFkZGluZyIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJwcmV2aWV3SW1hZ2UiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iYWN0aW9uTW9kZUJhY2tncm91bmQiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iYWN0aW9uTW9kZUNsb3NlRHJhd2FibGUiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0id2luZG93QWN0aW9uTW9kZU92ZXJsYXkiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0idmFsdWVGcm9tIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9InZhbHVlVG8iIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0idmFsdWVUeXBlIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9InByb3BlcnR5TmFtZSIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJvcmRlcmluZyIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJmcmFnbWVudCIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJ3aW5kb3dBY3Rpb25CYXJPdmVybGF5IiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9ImZyYWdtZW50T3BlbkVudGVyQW5pbWF0aW9uIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9ImZyYWdtZW50T3BlbkV4aXRBbmltYXRpb24iIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iZnJhZ21lbnRDbG9zZUVudGVyQW5pbWF0aW9uIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9ImZyYWdtZW50Q2xvc2VFeGl0QW5pbWF0aW9uIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9IndpbmRvd0FjdGlvbkJhclNpemUiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iaW1lU3VidHlwZUxvY2FsZSIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJpbWVTdWJ0eXBlTW9kZSIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJpbWVTdWJ0eXBlRXh0cmFWYWx1ZSIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJzcGxpdE1vdGlvbkV2ZW50cyIgLz4KKworICA8cHVibGljIHR5cGU9ImFuaW0iIG5hbWU9ImFuaW1hdG9yX2ZhZGVfaW4iIC8+CisgIDxwdWJsaWMgdHlwZT0iYW5pbSIgbmFtZT0iYW5pbWF0b3JfZmFkZV9vdXQiIC8+CisKKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJsaXN0Q2hvaWNlQmFja2dyb3VuZEluZGljYXRvciIgaWQ9IjB4MDEwMTAzMzAiIC8+CisKKyAgPHB1YmxpYyB0eXBlPSJpZCIgbmFtZT0iaG9tZSIgLz4KKyAgPCEtLSBDb250ZXh0IG1lbnUgSUQgZm9yIHRoZSAiU2VsZWN0IHRleHQuLi4iIG1lbnUgaXRlbSB0byBzd2l0Y2ggdG8gdGV4dAorICAgICAgIHNlbGVjdGlvbiBjb250ZXh0IG1vZGUgaW4gdGV4dCB2aWV3cy4gLS0+CisgIDxwdWJsaWMgdHlwZT0iaWQiIG5hbWU9InNlbGVjdFRleHRNb2RlIiAvPgorICAKKyAgPHB1YmxpYyB0eXBlPSJzdHlsZSIgbmFtZT0iVGhlbWUuV2l0aEFjdGlvbkJhciIgLz4KKyAgPHB1YmxpYyB0eXBlPSJzdHlsZSIgbmFtZT0iV2lkZ2V0LlNwaW5uZXIuRHJvcERvd24iIC8+CisgIDxwdWJsaWMgdHlwZT0ic3R5bGUiIG5hbWU9IldpZGdldC5BY3Rpb25CdXR0b24iIC8+CisgIDxwdWJsaWMgdHlwZT0ic3R5bGUiIG5hbWU9IlRoZW1lLkRpYWxvZy5Ob0ZyYW1lIiAvPgorICA8cHVibGljIHR5cGU9InN0eWxlIiBuYW1lPSJUaGVtZS5Ob1RpdGxlQmFyLk92ZXJsYXlBY3Rpb25Nb2RlcyIgLz4KKworICA8IS0tIFN0YW5kYXJkIGNvbnRlbnQgdmlldyBmb3IgYSB7QGxpbmsgYW5kcm9pZC5hcHAuTGlzdEZyYWdtZW50fS4KKyAgICAgICBJZiB5b3UgYXJlIGltcGxlbWVudGluZyBhIHN1YmNsYXNzIG9mIExpc3RGcmFnbWVudCB3aXRoIHlvdXIKKyAgICAgICBvd24gY3VzdG9taXplZCBjb250ZW50LCB5b3UgY2FuIGluY2x1ZGUgdGhpcyBsYXlvdXQgaW4gdGhhdAorICAgICAgIGNvbnRlbnQgdG8gc3RpbGwgcmV0YWluIGFsbCBvZiB0aGUgc3RhbmRhcmQgZnVuY3Rpb25hbGl0eSBvZgorICAgICAgIHRoZSBiYXNlIGNsYXNzLiAtLT4KKyAgPHB1YmxpYyB0eXBlPSJsYXlvdXQiIG5hbWU9Imxpc3RfY29udGVudCIgLz4KKworICA8cHVibGljIHR5cGU9InN0eWxlIiBuYW1lPSJUaGVtZS5Ib2xvIiAvPgorICA8cHVibGljIHR5cGU9InN0eWxlIiBuYW1lPSJUaGVtZS5MaWdodC5Ib2xvIiAvPgorICA8cHVibGljIHR5cGU9InN0eWxlIiBuYW1lPSJUaGVtZS5Ib2xvLk5vQWN0aW9uQmFyIiAvPgorICA8cHVibGljIHR5cGU9InN0eWxlIiBuYW1lPSJUaGVtZS5Ib2xvLk5vQWN0aW9uQmFyLkZ1bGxzY3JlZW4iIC8+CisgIDxwdWJsaWMgdHlwZT0ic3R5bGUiIG5hbWU9IlRoZW1lLkxpZ2h0LkhvbG8uTm9BY3Rpb25CYXIiIC8+CisgIDxwdWJsaWMgdHlwZT0ic3R5bGUiIG5hbWU9IlRoZW1lLkxpZ2h0LkhvbG8uTm9BY3Rpb25CYXIuRnVsbHNjcmVlbiIgLz4KKworICA8IS0tIEEgc2ltcGxlIExpc3RWaWV3IGl0ZW0gbGF5b3V0IHdoaWNoIGNhbiBjb250YWluIHRleHQgYW5kIHN1cHBvcnQgKHNpbmdsZSBvciBtdWx0aXBsZSkgaXRlbSBzZWxlY3Rpb24uIC0tPgorICA8cHVibGljIHR5cGU9ImxheW91dCIgbmFtZT0ic2ltcGxlX3NlbGVjdGFibGVfbGlzdF9pdGVtIiBpZD0iMHgwMTA5MDAyMiIgLz4KKworICA8cHVibGljIHR5cGU9InN0cmluZyIgbmFtZT0ic2VsZWN0VGV4dE1vZGUiIGlkPSIweDAxMDQwMDMwIiAvPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzL3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbAppbmRleCA1MmFiZTQ1Li5lMzhhMjI4IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKQEAgLTgwNyw4ICs4MDcsOCBAQAogICAgIDwhLS0gVGl0bGUgb2YgYW4gYXBwbGljYXRpb24gcGVybWlzc2lvbiwgbGlzdGVkIHNvIHRoZSB1c2VyIGNhbiBjaG9vc2Ugd2hldGhlciB0aGV5IHdhbnQgdG8gYWxsb3cgdGhlIGFwcGxpY2F0aW9uIHRvIGRvIHRoaXMuIC0tPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZUNhbGVuZGFyIj5hZGQgb3IgbW9kaWZ5IGNhbGVuZGFyIGV2ZW50cyBhbmQgc2VuZCBlbWFpbCB0byBndWVzdHM8L3N0cmluZz4KICAgICA8IS0tIERlc2NyaXB0aW9uIG9mIGFuIGFwcGxpY2F0aW9uIHBlcm1pc3Npb24sIGxpc3RlZCBzbyB0aGUgdXNlciBjYW4gY2hvb3NlIHdoZXRoZXIgdGhleSB3YW50IHRvIGFsbG93IHRoZSBhcHBsaWNhdGlvbiB0byBkbyB0aGlzLiAtLT4KLSAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlQ2FsZW5kYXIiPkFsbG93cyBhbiBhcHBsaWNhdGlvbiB0byBhZGQgb3IgY2hhbmdlIHRoZSAKLSAgICAgICAgZXZlbnRzIG9uIHlvdXIgY2FsZW5kYXIsIHdoaWNoIG1heSBzZW5kIGVtYWlsIHRvIGd1ZXN0cy4gTWFsaWNpb3VzIGFwcGxpY2F0aW9ucyBjYW4gdXNlIHRoaXMgCisgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZUNhbGVuZGFyIj5BbGxvd3MgYW4gYXBwbGljYXRpb24gdG8gYWRkIG9yIGNoYW5nZSB0aGUKKyAgICAgICAgZXZlbnRzIG9uIHlvdXIgY2FsZW5kYXIsIHdoaWNoIG1heSBzZW5kIGVtYWlsIHRvIGd1ZXN0cy4gTWFsaWNpb3VzIGFwcGxpY2F0aW9ucyBjYW4gdXNlIHRoaXMKICAgICAgICAgdG8gZXJhc2Ugb3IgbW9kaWZ5IHlvdXIgY2FsZW5kYXIgZXZlbnRzIG9yIHRvIHNlbmQgZW1haWwgdG8gZ3Vlc3RzLjwvc3RyaW5nPgogCiAgICAgPCEtLSBUaXRsZSBvZiBhbiBhcHBsaWNhdGlvbiBwZXJtaXNzaW9uLCBsaXN0ZWQgc28gdGhlIHVzZXIgY2FuIGNob29zZSB3aGV0aGVyIHRoZXkgd2FudCB0byBhbGxvdyB0aGUgYXBwbGljYXRpb24gdG8gZG8gdGhpcy4gLS0+CkBAIC0xMjUyLDYgKzEyNTIsMTEgQEAKICAgICA8IS0tIERlc2NyaXB0aW9uIG9mIHBvbGljeSBhY2Nlc3MgdG8gd2lwZSB0aGUgdXNlcidzIGRhdGEgLS0+CiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3dpcGVEYXRhIj5QZXJmb3JtIGEgZmFjdG9yeSByZXNldCwgZGVsZXRpbmcKICAgICAgICAgYWxsIG9mIHlvdXIgZGF0YSB3aXRob3V0IGFueSBjb25maXJtYXRpb24uPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfc2V0R2xvYmFsUHJveHkiPlNldCB0aGUgZGV2aWNlIGdsb2JhbCBwcm94eTwvc3RyaW5nPgorICAgIDwhLS0gRGVzY3JpcHRpb24gb2YgcG9saWN5IGFjY2VzcyB0byB3aXBlIHRoZSB1c2VyJ3MgZGF0YSAtLT4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfc2V0R2xvYmFsUHJveHkiPlNldCB0aGUgZGV2aWNlIGdsb2JhbCBwcm94eQorICAgICAgICB0byBiZSB1c2VkIHdoaWxlIHBvbGljeSBpcyBlbmFibGVkLiBPbmx5IHRoZSBmaXJzdCBkZXZpY2UgYWRtaW4KKyAgICAgICAgc2V0cyB0aGUgZWZmZWN0aXZlIGdsb2JhbCBwcm94eS48L3N0cmluZz4KIAogICAgIDwhLS0gVGhlIG9yZGVyIG9mIHRoZXNlIGlzIGltcG9ydGFudCwgZG9uJ3QgcmVvcmRlciB3aXRob3V0IGNoYW5naW5nIENvbnRhY3RzLmphdmEgLS0+IDxza2lwIC8+CiAgICAgPCEtLSBQaG9uZSBudW1iZXIgdHlwZXMgZnJvbSBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzLiBUaGlzIGNvdWxkIGJlIHVzZWQgd2hlbiBhZGRpbmcgYSBuZXcgcGhvbmUgbnVtYmVyIGZvciBhIGNvbnRhY3QsIGZvciBleGFtcGxlLiAtLT4KQEAgLTE0MjEsMjAgKzE0MjYsMTggQEAKICAgICA8IS0tIEN1c3RvbSBvcmdhbml6YXRpb24gdHlwZSAtLT4KICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVDdXN0b20iPkN1c3RvbTwvc3RyaW5nPgogCi0gICAgPCEtLSBBdHRidXRpb24gb2YgYSBjb250YWN0IHN0YXR1cyB1cGRhdGUsIHdoZW4gdGhlIHRpbWUgb2YgdXBkYXRlIGlzIHVua25vd24gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJjb250YWN0X3N0YXR1c191cGRhdGVfYXR0cmlidXRpb24iPnZpYSA8eGxpZmY6ZyBpZD0ic291cmNlIiBleGFtcGxlPSJHb29nbGUgVGFsayI+JTEkczwveGxpZmY6Zz48L3N0cmluZz4KLQotICAgIDwhLS0gQXR0YnV0aW9uIG9mIGEgY29udGFjdCBzdGF0dXMgdXBkYXRlLCB3aGVuIHRoZSB0aW1lIG9mIHVwZGF0ZSBpcyBrbm93biAtLT4KLSAgICA8c3RyaW5nIG5hbWU9ImNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbl93aXRoX2RhdGUiPjx4bGlmZjpnIGlkPSJkYXRlIiBleGFtcGxlPSIzIGhvdXJzIGFnbyI+JTEkczwveGxpZmY6Zz4gdmlhIDx4bGlmZjpnIGlkPSJzb3VyY2UiIGV4YW1wbGU9Ikdvb2dsZSBUYWxrIj4lMiRzPC94bGlmZjpnPjwvc3RyaW5nPgotCiAgICAgPCEtLSBJbnN0cnVjdGlvbnMgdGVsbGluZyB0aGUgdXNlciB0byBlbnRlciB0aGVpciBTSU0gUElOIHRvIHVubG9jayB0aGUga2V5Z3VhcmQuCiAgICAgICAgICBEaXNwbGF5ZWQgaW4gb25lIGxpbmUgaW4gYSBsYXJnZSBmb250LiAgLS0+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9waW5fY29kZSI+RW50ZXIgUElOIGNvZGU8L3N0cmluZz4KIAotICAgIDwhLS0gSW5zdHJ1Y3Rpb25zIHRlbGxpbmcgdGhlIHVzZXIgdG8gZW50ZXIgdGhlaXIgUElOIHBhc3N3b3JkIHRvIHVubG9jayB0aGUga2V5Z3VhcmQuCisgICAgPCEtLSBJbnN0cnVjdGlvbnMgdGVsbGluZyB0aGUgdXNlciB0byBlbnRlciB0aGVpciB0ZXh0IHBhc3N3b3JkIHRvIHVubG9jayB0aGUga2V5Z3VhcmQuCiAgICAgICAgICBEaXNwbGF5ZWQgaW4gb25lIGxpbmUgaW4gYSBsYXJnZSBmb250LiAgLS0+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9wYXNzd29yZF9jb2RlIj5FbnRlciBwYXNzd29yZCB0byB1bmxvY2s8L3N0cmluZz4KIAorICAgIDwhLS0gSW5zdHJ1Y3Rpb25zIHRlbGxpbmcgdGhlIHVzZXIgdG8gZW50ZXIgdGhlaXIgUElOIHBhc3N3b3JkIHRvIHVubG9jayB0aGUga2V5Z3VhcmQuCisgICAgICAgICBEaXNwbGF5ZWQgaW4gb25lIGxpbmUgaW4gYSBsYXJnZSBmb250LiAgLS0+CisgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9waW5fcGFzc3dvcmRfY29kZSI+RW50ZXIgUElOIHRvIHVubG9jazwvc3RyaW5nPgorCiAgICAgPCEtLSBJbnN0cnVjdGlvbnMgdGVsbGluZyB0aGUgdXNlciB0aGF0IHRoZXkgZW50ZXJlZCB0aGUgd3JvbmcgcGluIHdoaWxlIHRyeWluZwogICAgICAgICAgdG8gdW5sb2NrIHRoZSBrZXlndWFyZC4gIERpc3BsYXllZCBpbiBvbmUgbGluZSBpbiBhIGxhcmdlIGZvbnQuICAtLT4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX3dyb25nX3Bpbl9jb2RlIj5JbmNvcnJlY3QgUElOIGNvZGUhPC9zdHJpbmc+CkBAIC0xNDcxLDYgKzE0NzQsOCBAQAogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXR0ZXJuX2NvcnJlY3QiPkNvcnJlY3QhPC9zdHJpbmc+CiAgICAgPCEtLSBPbiB0aGUgdW5sb2NrIHBhdHRlcm4gc2NyZWVuLCBzaG93biB3aGVuIHRoZSB1c2VyIGVudGVycyB0aGUgd3JvbmcgbG9jayBwYXR0ZXJuIGFuZCBtdXN0IHRyeSBhZ2Fpbi4gLS0+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BhdHRlcm5fd3JvbmciPlNvcnJ5LCB0cnkgYWdhaW48L3N0cmluZz4KKyAgICA8IS0tIE9uIHRoZSB1bmxvY2sgcGFzc3dvcmQgc2NyZWVuLCBzaG93biB3aGVuIHRoZSB1c2VyIGVudGVycyB0aGUgd3JvbmcgbG9jayBwYXNzd29yZCBhbmQgbXVzdCB0cnkgYWdhaW4uIC0tPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXNzd29yZF93cm9uZyI+U29ycnksIHRyeSBhZ2Fpbjwvc3RyaW5nPgogCiAgICAgPCEtLSBXaGVuIHRoZSBsb2NrIHNjcmVlbiBpcyBzaG93aW5nIGFuZCB0aGUgcGhvbmUgcGx1Z2dlZCBpbiwgYW5kIHRoZSBiYXR0ZXJ5CiAgICAgICAgICBpcyBub3QgZnVsbHkgY2hhcmdlZCwgc2hvdyB0aGUgY3VycmVudCBjaGFyZ2UgJS4gIC0tPgpAQCAtMTUxNCwxMiArMTUxOSwyNyBAQAogICAgICAgICAgcHJvZ3Jlc3MgZGlhbG9nIGluIHRoZSBtZWFudGltZS4gIHRoaXMgaXMgdGhlIGVtc3NhZ2UuIC0tPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9zaW1fdW5sb2NrX3Byb2dyZXNzX2RpYWxvZ19tZXNzYWdlIj5VbmxvY2tpbmcgU0lNIGNhcmRcdTIwMjY8L3N0cmluZz4KIAotICAgIDwhLS0gRm9yIHRoZSB1bmxvY2sgc2NyZWVuLCBJbmZvcm1hdGlvbiBtZXNzYWdlIHNob3duIGluIGRpYWxvZyB3aGVuIHVzZXIgaGFzIHRvbyBtYW55IGZhaWxlZCBhdHRlbXB0cyAtLT4KKyAgICA8IS0tIEZvciB0aGUgdW5sb2NrIHNjcmVlbiwgSW5mb3JtYXRpb24gbWVzc2FnZSBzaG93biBpbiBkaWFsb2cgd2hlbiB1c2VyIGhhcyB0b28gbWFueSBmYWlsZWQgYXR0ZW1wdHMgYXQKKyAgICAgICAgIGRyYXdpbmcgdGhlIHVubG9jayBwYXR0ZXJuIC0tPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiPgogICAgICAgICBZb3UgaGF2ZSBpbmNvcnJlY3RseSBkcmF3biB5b3VyIHVubG9jayBwYXR0ZXJuIDx4bGlmZjpnIGlkPSJudW1iZXIiPiVkPC94bGlmZjpnPiB0aW1lcy4KICAgICAgICAgXG5cblBsZWFzZSB0cnkgYWdhaW4gaW4gPHhsaWZmOmcgaWQ9Im51bWJlciI+JWQ8L3hsaWZmOmc+IHNlY29uZHMuCiAgICAgPC9zdHJpbmc+CiAKKyAgICA8IS0tIEZvciB0aGUgdW5sb2NrIHNjcmVlbiwgSW5mb3JtYXRpb24gbWVzc2FnZSBzaG93biBpbiBkaWFsb2cgd2hlbiB1c2VyIGhhcyB0b28gbWFueSBmYWlsZWQgYXR0ZW1wdHMgYXQKKyAgICAgICAgIGVudGVyaW5nIHRoZSBwYXNzd29yZCAtLT4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX3Bhc3N3b3JkX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIj4KKyAgICAgICAgWW91IGhhdmUgaW5jb3JyZWN0bHkgZW50ZXJlZCB5b3VyIHBhc3N3b3JkIDx4bGlmZjpnIGlkPSJudW1iZXIiPiVkPC94bGlmZjpnPiB0aW1lcy4KKyAgICAgICAgXG5cblBsZWFzZSB0cnkgYWdhaW4gaW4gPHhsaWZmOmcgaWQ9Im51bWJlciI+JWQ8L3hsaWZmOmc+IHNlY29uZHMuCisgICAgPC9zdHJpbmc+CisKKyAgICA8IS0tIEZvciB0aGUgdW5sb2NrIHNjcmVlbiwgSW5mb3JtYXRpb24gbWVzc2FnZSBzaG93biBpbiBkaWFsb2cgd2hlbiB1c2VyIGhhcyB0b28gbWFueSBmYWlsZWQgYXR0ZW1wdHMgYXQKKyAgICAgICAgIGVudGVyaW5nIHRoZSBQSU4gLS0+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9waW5fYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiPgorICAgICAgICBZb3UgaGF2ZSBpbmNvcnJlY3RseSBlbnRlcmVkIHlvdXIgUElOIDx4bGlmZjpnIGlkPSJudW1iZXIiPiVkPC94bGlmZjpnPiB0aW1lcy4KKyAgICAgICAgXG5cblBsZWFzZSB0cnkgYWdhaW4gaW4gPHhsaWZmOmcgaWQ9Im51bWJlciI+JWQ8L3hsaWZmOmc+IHNlY29uZHMuCisgICAgPC9zdHJpbmc+CisKICAgICA8IS0tIEZvciB0aGUgdW5sb2NrIHNjcmVlbiwgSW5mb3JtYXRpb24gbWVzc2FnZSBzaG93biBpbiBkaWFsb2cgd2hlbiB1c2VyIGlzIGFsbW9zdCBhdCB0aGUgbGltaXQKICAgICAgICAgIHdoZXJlIHRoZXkgd2lsbCBiZSBsb2NrZWQgb3V0IGFuZCBtYXkgaGF2ZSB0byBlbnRlciBhbiBhbHRlcm5hdGUgdXNlcm5hbWUvcGFzc3dvcmQgdG8gdW5sb2NrIHRoZSBwaG9uZSAtLT4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fZmFpbGVkX2F0dGVtcHRzX2FsbW9zdF9nbG9naW4iPgpAQCAtMTU4OSw4ICsxNjA5LDEwIEBACiAgICAgPHN0cmluZyBuYW1lPSJmYWN0b3J5dGVzdF9yZWJvb3QiPlJlYm9vdDwvc3RyaW5nPgogCiAgICAgPCEtLSBEbyBub3QgdHJhbnNsYXRlLiAgV2ViVmlldyBVc2VyIEFnZW50IHN0cmluZyAtLT4KLSAgICA8c3RyaW5nIG5hbWU9IndlYl91c2VyX2FnZW50IiB0cmFuc2xhdGFibGU9ImZhbHNlIj48eGxpZmY6ZyBpZD0ieCI+TW96aWxsYS81LjAgKExpbnV4OyBVOyBBbmRyb2lkICVzKQotICAgICAgICBBcHBsZVdlYktpdC81MzMuMSAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vNC4wIE1vYmlsZSBTYWZhcmkvNTMzLjE8L3hsaWZmOmc+PC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ3ZWJfdXNlcl9hZ2VudCIgdHJhbnNsYXRhYmxlPSJmYWxzZSI+TW96aWxsYS81LjAgKExpbnV4OyBVOyA8eGxpZmY6ZyBpZD0ieCI+QW5kcm9pZCAlczwveGxpZmY6Zz4pCisgICAgICAgIEFwcGxlV2ViS2l0LzUzNC42IChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi80LjAgPHhsaWZmOmcgaWQ9Im1vYmlsZSI+JXM8L3hsaWZmOmc+U2FmYXJpLzUzNC42PC9zdHJpbmc+CisgICAgPCEtLSBEbyBub3QgdHJhbnNsYXRlLiAgV2ViVmlldyBVc2VyIEFnZW50IHRhcmdldGVkIGNvbnRlbnQgLS0+CisgICAgPHN0cmluZyBuYW1lPSJ3ZWJfdXNlcl9hZ2VudF90YXJnZXRfY29udGVudCIgdHJhbnNsYXRhYmxlPSJmYWxzZSI+Ik1vYmlsZSAiPC9zdHJpbmc+CiAKICAgICA8IS0tIFRpdGxlIGZvciBhIEphdmFTY3JpcHQgZGlhbG9nLiAiVGhlIHBhZ2UgYXQgPHVybCBvZiBjdXJyZW50IHBhZ2U+IHNheXM6IiAtLT4KICAgICA8c3RyaW5nIG5hbWU9ImpzX2RpYWxvZ190aXRsZSI+VGhlIHBhZ2UgYXQgXCc8eGxpZmY6ZyBpZD0idGl0bGUiPiVzPC94bGlmZjpnPlwnIHNheXM6PC9zdHJpbmc+CkBAIC0xODUzLDEyICsxODc1LDYgQEAKICAgICA8IS0tIEl0ZW0gb24gRWRpdFRleHQgY29udGV4dCBtZW51LiBUaGlzIGFjdGlvbiBpcyB1c2VkIHRvIHNlbGVjdCBhbGwgdGV4dCBpbiB0aGUgZWRpdCBmaWVsZC4gLS0+CiAgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RBbGwiPlNlbGVjdCBhbGw8L3N0cmluZz4KIAotICAgIDwhLS0gSXRlbSBvbiBFZGl0VGV4dCBjb250ZXh0IG1lbnUuIFRoaXMgYWN0aW9uIGlzIHVzZWQgdG8gc3RhcnQgc2VsZWN0aW5nIHRleHQgaW4gdGhlIGVkaXQgZmllbGQuIC0tPgotICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0VGV4dCI+U2VsZWN0IHdvcmQ8L3N0cmluZz4KLQotICAgIDwhLS0gSXRlbSBvbiBFZGl0VGV4dCBjb250ZXh0IG1lbnUuIFRoaXMgYWN0aW9uIGlzIHVzZWQgdG8gc3RvcCBzZWxlY3RpbmcgdGV4dCBpbiB0aGUgZWRpdCBmaWVsZC4gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJzdG9wU2VsZWN0aW5nVGV4dCI+U3RvcCBzZWxlY3RpbmcgdGV4dDwvc3RyaW5nPgotCiAgICAgPCEtLSBJdGVtIG9uIEVkaXRUZXh0IGNvbnRleHQgbWVudS4gIFRoaXMgYWN0aW9uIGlzIHVzZWQgdG8gY3V0IHNlbGVjdGVkIHRoZSB0ZXh0IGludG8gdGhlIGNsaXBib2FyZC4gIC0tPgogICAgIDxzdHJpbmcgbmFtZT0iY3V0Ij5DdXQ8L3N0cmluZz4KIApAQCAtMTg3MSwxNSArMTg4NywxNyBAQAogICAgIDwhLS0gSXRlbSBvbiBFZGl0VGV4dCBjb250ZXh0IG1lbnUuIFRoaXMgYWN0aW9uIGlzIHVzZWQgdG8gY29weSBhIFVSTCBmcm9tIHRoZSBlZGl0IGZpZWxkIGludG8gdGhlIGNsaXBib2FyZC4gLS0+CiAgICAgPHN0cmluZyBuYW1lPSJjb3B5VXJsIj5Db3B5IFVSTDwvc3RyaW5nPgogCisgICAgPCEtLSBJdGVtIG9uIEVkaXRUZXh0IGNvbnRleHQgbWVudS4gQWRkZWQgb25seSB3aGVuIHRoZSBjb250ZXh0IG1lbnUgaXMgbm90IGVtcHR5LCBpdCBlbmFibGUgc2VsZWN0aW9uIGNvbnRleHQgbW9kZS4gW0NIQVIgTElNSVQ9MjBdIC0tPgorICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0VGV4dE1vZGUiPlNlbGVjdCB0ZXh0Li4uPC9zdHJpbmc+CisKKyAgICA8IS0tIFRleHQgc2VsZWN0aW9uIGNvbnRleHR1YWwgbW9kZSB0aXRsZSwgZGlzcGxheWVkIGluIHRoZSBDQUIuIFtDSEFSIExJTUlUPTIwXSAtLT4KKyAgICA8c3RyaW5nIG5hbWU9InRleHRTZWxlY3Rpb25DQUJUaXRsZSI+VGV4dCBzZWxlY3Rpb248L3N0cmluZz4KKwogICAgIDwhLS0gRWRpdFRleHQgY29udGV4dCBtZW51IC0tPgogICAgIDxzdHJpbmcgbmFtZT0iaW5wdXRNZXRob2QiPklucHV0IG1ldGhvZDwvc3RyaW5nPgogCi0gICAgPCEtLSBJdGVtIG9uIEVkaXRUZXh0IGNvbnRleHQgbWVudSwgdXNlZCB0byBhZGQgYSB3b3JkIHRvIHRoZQotICAgICAgICAgaW5wdXQgbWV0aG9kIGRpY3Rpb25hcnkuIC0tPgotICAgIDxzdHJpbmcgbmFtZT0iYWRkVG9EaWN0aW9uYXJ5Ij4iQWRkIFwiPHhsaWZmOmcgaWQ9IndvcmQiIGV4YW1wbGU9InJpY2tyb2xsIj4lczwveGxpZmY6Zz5cIiB0byBkaWN0aW9uYXJ5PC9zdHJpbmc+Ci0KLSAgICA8IS0tIFRpdGxlIGZvciBFZGl0VGV4dCBjb250ZXh0IG1lbnUgLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJlZGl0VGV4dE1lbnVUaXRsZSI+RWRpdCB0ZXh0PC9zdHJpbmc+CisgICAgPCEtLSBUaXRsZSBmb3IgRWRpdFRleHQgY29udGV4dCBtZW51IFtDSEFSIExJTUlUPTIwXSAtLT4KKyAgICA8c3RyaW5nIG5hbWU9ImVkaXRUZXh0TWVudVRpdGxlIj5UZXh0IGFjdGlvbnM8L3N0cmluZz4KIAogICAgIDwhLS0gSWYgdGhlIGRldmljZSBpcyBnZXR0aW5nIGxvdyBvbiBpbnRlcm5hbCBzdG9yYWdlLCBhIG5vdGlmaWNhdGlvbiBpcyBzaG93biB0byB0aGUgdXNlci4gIFRoaXMgaXMgdGhlIHRpdGxlIG9mIHRoYXQgbm90aWZpY2F0aW9uLiAtLT4KICAgICA8c3RyaW5nIG5hbWU9Imxvd19pbnRlcm5hbF9zdG9yYWdlX3ZpZXdfdGl0bGUiPkxvdyBvbiBzcGFjZTwvc3RyaW5nPgpAQCAtMTg5OCw2ICsxOTE2LDkgQEAKICAgICAgICAgIGNvbWJpbmVkIHdpdGggc2V0SWNvbihhbmRyb2lkLlIuZHJhd2FibGUuaWNfZGlhbG9nX2FsZXJ0KSAtLT4KICAgICA8c3RyaW5nIG5hbWU9ImRpYWxvZ19hbGVydF90aXRsZSI+QXR0ZW50aW9uPC9zdHJpbmc+CiAKKyAgICA8IS0tIFRleHQgc2hvd24gYnkgbGlzdCBmcmFnbWVudCB3aGVuIHdhaXRpbmcgZm9yIGRhdGEgdG8gZGlzcGxheS4gLS0+CisgICAgPHN0cmluZyBuYW1lPSJsb2FkaW5nIj5Mb2FkaW5nLi4uPC9zdHJpbmc+CisKICAgICA8IS0tIERlZmF1bHQgdGV4dCBmb3IgYSBidXR0b24gdGhhdCBjYW4gYmUgdG9nZ2xlZCBvbiBhbmQgb2ZmLiAtLT4KICAgICA8c3RyaW5nIG5hbWU9ImNhcGl0YWxfb24iPk9OPC9zdHJpbmc+CiAgICAgPCEtLSBEZWZhdWx0IHRleHQgZm9yIGEgYnV0dG9uIHRoYXQgY2FuIGJlIHRvZ2dsZWQgb24gYW5kIG9mZi4gLS0+CkBAIC0xOTQ4LDIzICsxOTY5LDIzIEBACiAKICAgICA8IS0tIE5vdGlmaWNhdGlvbiB0ZXh0IHRvIHRlbGwgdGhlIHVzZXIgdGhhdCBhIGhlYXZ5LXdlaWdodCBhcHBsaWNhdGlvbiBpcyBydW5uaW5nLiAtLT4KICAgICA8c3RyaW5nIG5hbWU9ImhlYXZ5X3dlaWdodF9ub3RpZmljYXRpb24iPjx4bGlmZjpnIGlkPSJhcHAiPiUxJHM8L3hsaWZmOmc+IHJ1bm5pbmc8L3N0cmluZz4KLSAgICAKKwogICAgIDwhLS0gTm90aWZpY2F0aW9uIGRldGFpbHMgdG8gdGVsbCB0aGUgdXNlciB0aGF0IGEgaGVhdnktd2VpZ2h0IGFwcGxpY2F0aW9uIGlzIHJ1bm5pbmcuIC0tPgogICAgIDxzdHJpbmcgbmFtZT0iaGVhdnlfd2VpZ2h0X25vdGlmaWNhdGlvbl9kZXRhaWwiPlNlbGVjdCB0byBzd2l0Y2ggdG8gYXBwbGljYXRpb248L3N0cmluZz4KLSAgICAKKwogICAgIDwhLS0gVGl0bGUgb2YgZGlhbG9nIHByb21wdGluZyB3aGV0aGVyIHVzZXIgd2FudHMgdG8gc3dpdGNoIGJldHdlZW4gaGVhdnktd2VpZ2h0IGFwcHMuIC0tPgogICAgIDxzdHJpbmcgbmFtZT0iaGVhdnlfd2VpZ2h0X3N3aXRjaGVyX3RpdGxlIj5Td2l0Y2ggYXBwbGljYXRpb25zPzwvc3RyaW5nPgotICAgIAorCiAgICAgPCEtLSBEZXNjcmlwdGl2ZSB0ZXh0IGZvciBzd2l0Y2hpbmcgdG8gYSBuZXcgaGVhdnktd2VpZ2h0IGFwcGxpY2F0aW9uLiAtLT4KICAgICA8c3RyaW5nIG5hbWU9ImhlYXZ5X3dlaWdodF9zd2l0Y2hlcl90ZXh0Ij5Bbm90aGVyIGFwcGxpY2F0aW9uIGlzIGFscmVhZHkgcnVubmluZwogICAgIHRoYXQgbXVzdCBiZSBzdG9wcGVkIGJlZm9yZSB5b3UgY2FuIHN0YXJ0IGEgbmV3IG9uZS48L3N0cmluZz4KLSAgICAKKwogICAgIDxzdHJpbmcgbmFtZT0ib2xkX2FwcF9hY3Rpb24iPlJldHVybiB0byA8eGxpZmY6ZyBpZD0ib2xkX2FwcCI+JTEkczwveGxpZmY6Zz48L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9sZF9hcHBfZGVzY3JpcHRpb24iPkRvblwndCBzdGFydCB0aGUgbmV3IGFwcGxpY2F0aW9uLjwvc3RyaW5nPgotICAgIAorCiAgICAgPHN0cmluZyBuYW1lPSJuZXdfYXBwX2FjdGlvbiI+U3RhcnQgPHhsaWZmOmcgaWQ9Im9sZF9hcHAiPiUxJHM8L3hsaWZmOmc+PC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJuZXdfYXBwX2Rlc2NyaXB0aW9uIj5TdG9wIHRoZSBvbGQgYXBwbGljYXRpb24gd2l0aG91dCBzYXZpbmcuPC9zdHJpbmc+Ci0gICAgCisKICAgICA8IS0tIERpc3BsYXllZCBpbiB0aGUgdGl0bGUgb2YgdGhlIGNob29zZXIgZm9yIHRoaW5ncyB0byBkbyB3aXRoIHRleHQgdGhhdAogICAgICAgICAgaXMgdG8gYmUgc2VudCB0byBhbm90aGVyIGFwcGxpY2F0aW9uLiBGb3IgZXhhbXBsZSwgSSBjYW4gc2VuZAogICAgICAgICAgdGV4dCB0aHJvdWdoIFNNUyBvciBJTS4gIEEgZGlhbG9nIHdpdGggdGhvc2UgY2hvaWNlcyB3b3VsZCBiZSBzaG93biwKQEAgLTIyMzYsMTcgKzIyNTcsMTMgQEAKICAgICA8IS0tIExvY2FsaXplZCBzdHJpbmdzIGZvciBXZWJWaWV3IC0tPgogICAgIDwhLS0gTGFiZWwgZm9yIGJ1dHRvbiBpbiBhIFdlYlZpZXcgdGhhdCB3aWxsIG9wZW4gYSBjaG9vc2VyIHRvIGNob29zZSBhIGZpbGUgdG8gdXBsb2FkIC0tPgogICAgIDxzdHJpbmcgbmFtZT0idXBsb2FkX2ZpbGUiPkNob29zZSBmaWxlPC9zdHJpbmc+CisgICAgPCEtLSBMYWJlbCBmb3IgdGhlIGZpbGUgdXBsb2FkIGNvbnRyb2wgd2hlbiBubyBmaWxlIGhhcyBiZWVuIGNob3NlbiB5ZXQgLS0+CisgICAgPHN0cmluZyBuYW1lPSJub19maWxlX2Nob3NlbiI+Tm8gZmlsZSBjaG9zZW48L3N0cmluZz4KICAgICA8IS0tIExhYmVsIGZvciA8aW5wdXQgdHlwZT0icmVzZXQiPiBidXR0b24gaW4gaHRtbCAtLT4KICAgICA8c3RyaW5nIG5hbWU9InJlc2V0Ij5SZXNldDwvc3RyaW5nPgogICAgIDwhLS0gTGFiZWwgZm9yIDxpbnB1dCB0eXBlPSJzdWJtaXQiPiBidXR0b24gaW4gaHRtbCAtLT4KICAgICA8c3RyaW5nIG5hbWU9InN1Ym1pdCI+U3VibWl0PC9zdHJpbmc+CiAKLSAgICA8IS0tIFN0cmluZyBkZXNjcmliaW5nIHRoZSBTdGFyL0Zhdm9yaXRlIGNoZWNrYm94Ci0KLSAgICAgICAgIFVzZWQgYnkgQWNjZXNzaWJpbGl0eVNlcnZpY2UgdG8gYW5ub3VuY2UgdGhlIHB1cnBvc2Ugb2YgdGhlIHZpZXcuCi0gICAgLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJkZXNjcmlwdGlvbl9zdGFyIj5mYXZvcml0ZTwvc3RyaW5nPgotCiAgICAgPCEtLSBTdHJpbmdzIGZvciBjYXIgbW9kZSBub3RpZmljYXRpb24gLS0+CiAgICAgPCEtLSBTaG93biB3aGVuIGNhciBtb2RlIGlzIGVuYWJsZWQgLS0+CiAgICAgPHN0cmluZyBuYW1lPSJjYXJfbW9kZV9kaXNhYmxlX25vdGlmaWNhdGlvbl90aXRsZSI+Q2FyIG1vZGUgZW5hYmxlZDwvc3RyaW5nPgpAQCAtMjI1Nyw2ICsyMjc0LDEzIEBACiAgICAgPHN0cmluZyBuYW1lPSJ0ZXRoZXJlZF9ub3RpZmljYXRpb25fdGl0bGUiPlRldGhlcmluZyBvciBob3RzcG90IGFjdGl2ZTwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGV0aGVyZWRfbm90aWZpY2F0aW9uX21lc3NhZ2UiPlRvdWNoIHRvIGNvbmZpZ3VyZTwvc3RyaW5nPgogCisgICAgPCEtLSAgU3RyaW5ncyBmb3IgcG9zc2libGUgUHJlZmVyZW5jZUFjdGl2aXR5IEJhY2svTmV4dCBidXR0b25zIC0tPgorICAgIDxzdHJpbmcgbmFtZT0iYmFja19idXR0b25fbGFiZWwiPkJhY2s8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5leHRfYnV0dG9uX2xhYmVsIj5OZXh0PC9zdHJpbmc+CisKKyAgICA8IS0tIE9wdGlvbmFsIGJ1dHRvbiB0byBTa2lwIGEgUHJlZmVyZW5jZUFjdGl2aXR5IFtDSEFSIExJTUlUPTIwXSAtLT4KKyAgICA8c3RyaW5nIG5hbWU9InNraXBfYnV0dG9uX2xhYmVsIj5Ta2lwPC9zdHJpbmc+CisKICAgICA8IS0tIFN0cmluZ3MgZm9yIHRocm90dGxpbmcgbm90aWZpY2F0aW9uIC0tPgogICAgIDwhLS0gU2hvd24gd2hlbiB0aGUgdXNlciBpcyBpbiBkYW5nZXIgb2YgYmVpbmcgdGhyb3R0bGVkIC0tPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVfd2FybmluZ19ub3RpZmljYXRpb25fdGl0bGUiPkhpZ2ggbW9iaWxlIGRhdGEgdXNlPC9zdHJpbmc+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzL3N0eWxlcy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzL3N0eWxlcy54bWwKaW5kZXggMDJhNjAxYS4uNjk2NDgwOCAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy9zdHlsZXMueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMvc3R5bGVzLnhtbApAQCAtNzQsNiArNzQsMTAgQEAKICAgICAgICAgPGl0ZW0gbmFtZT0id2FsbHBhcGVySW50cmFPcGVuRXhpdEFuaW1hdGlvbiI+QGFuaW0vd2FsbHBhcGVyX2ludHJhX29wZW5fZXhpdDwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0id2FsbHBhcGVySW50cmFDbG9zZUVudGVyQW5pbWF0aW9uIj5AYW5pbS93YWxscGFwZXJfaW50cmFfY2xvc2VfZW50ZXI8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9IndhbGxwYXBlckludHJhQ2xvc2VFeGl0QW5pbWF0aW9uIj5AYW5pbS93YWxscGFwZXJfaW50cmFfY2xvc2VfZXhpdDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iZnJhZ21lbnRPcGVuRW50ZXJBbmltYXRpb24iPkBhbmltL2ZyYWdtZW50X29wZW5fZW50ZXI8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImZyYWdtZW50T3BlbkV4aXRBbmltYXRpb24iPkBhbmltL2ZyYWdtZW50X29wZW5fZXhpdDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iZnJhZ21lbnRDbG9zZUVudGVyQW5pbWF0aW9uIj5AYW5pbS9mcmFnbWVudF9jbG9zZV9lbnRlcjwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iZnJhZ21lbnRDbG9zZUV4aXRBbmltYXRpb24iPkBhbmltL2ZyYWdtZW50X2Nsb3NlX2V4aXQ8L2l0ZW0+CiAgICAgPC9zdHlsZT4KIAogICAgIDwhLS0gU3RhbmRhcmQgYW5pbWF0aW9ucyBmb3IgYSBub24tZnVsbC1zY3JlZW4gd2luZG93IG9yIGFjdGl2aXR5LiAtLT4KQEAgLTI3NiwxMiArMjgwLDEyIEBACiAKICAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkNvbXBvdW5kQnV0dG9uLkNoZWNrQm94Ij4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpiYWNrZ3JvdW5kIj5AYW5kcm9pZDpkcmF3YWJsZS9idG5fY2hlY2tfbGFiZWxfYmFja2dyb3VuZDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpidXR0b24iPkBhbmRyb2lkOmRyYXdhYmxlL2J0bl9jaGVjazwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpidXR0b24iPj9hbmRyb2lkOmF0dHIvbGlzdENob2ljZUluZGljYXRvck11bHRpcGxlPC9pdGVtPgogICAgIDwvc3R5bGU+CiAKICAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkNvbXBvdW5kQnV0dG9uLlJhZGlvQnV0dG9uIj4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpiYWNrZ3JvdW5kIj5AYW5kcm9pZDpkcmF3YWJsZS9idG5fcmFkaW9fbGFiZWxfYmFja2dyb3VuZDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpidXR0b24iPkBhbmRyb2lkOmRyYXdhYmxlL2J0bl9yYWRpbzwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpidXR0b24iPj9hbmRyb2lkOmF0dHIvbGlzdENob2ljZUluZGljYXRvclNpbmdsZTwvaXRlbT4KICAgICA8L3N0eWxlPgogCiAgICAgPHN0eWxlIG5hbWU9IldpZGdldC5Db21wb3VuZEJ1dHRvbi5TdGFyIj4KQEAgLTQxMSw5ICs0MTUsOSBAQAogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmZvY3VzYWJsZSI+dHJ1ZTwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpmb2N1c2FibGVJblRvdWNoTW9kZSI+dHJ1ZTwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpjbGlja2FibGUiPnRydWU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6YmFja2dyb3VuZCI+QGFuZHJvaWQ6ZHJhd2FibGUvZWRpdF90ZXh0PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmJhY2tncm91bmQiPj9hbmRyb2lkOmF0dHIvZWRpdFRleHRCYWNrZ3JvdW5kPC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRBcHBlYXJhbmNlIj4/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlTWVkaXVtSW52ZXJzZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3IiPkBhbmRyb2lkOmNvbG9yL3ByaW1hcnlfdGV4dF9saWdodDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3IiPj9hbmRyb2lkOmF0dHIvZWRpdFRleHRDb2xvcjwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpncmF2aXR5Ij5jZW50ZXJfdmVydGljYWw8L2l0ZW0+CiAgICAgPC9zdHlsZT4KICAgICAKQEAgLTQ1OCw2ICs0NjIsMTggQEAKICAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LlNwaW5uZXIiPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmJhY2tncm91bmQiPkBhbmRyb2lkOmRyYXdhYmxlL2J0bl9kcm9wZG93bjwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpjbGlja2FibGUiPnRydWU8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c3Bpbm5lck1vZGUiPmRpYWxvZzwvaXRlbT4KKworICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmRyb3BEb3duU2VsZWN0b3IiPkBhbmRyb2lkOmRyYXdhYmxlL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpwb3B1cEJhY2tncm91bmQiPkBhbmRyb2lkOmRyYXdhYmxlL3NwaW5uZXJfZHJvcGRvd25fYmFja2dyb3VuZDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpkcm9wRG93blZlcnRpY2FsT2Zmc2V0Ij4tMTBkaXA8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6ZHJvcERvd25Ib3Jpem9udGFsT2Zmc2V0Ij4wZGlwPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmRyb3BEb3duV2lkdGgiPndyYXBfY29udGVudDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpwb3B1cFByb21wdFZpZXciPkBhbmRyb2lkOmxheW91dC9zaW1wbGVfZHJvcGRvd25faGludDwvaXRlbT4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IldpZGdldC5TcGlubmVyLkRyb3BEb3duIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzcGlubmVyTW9kZSI+ZHJvcGRvd248L2l0ZW0+CiAgICAgPC9zdHlsZT4KIAogICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuVGV4dFZpZXcuUG9wdXBNZW51Ij4KQEAgLTQ3Nyw3ICs0OTMsNyBAQAogICAgIDwvc3R5bGU+CiAgICAgCiAgICAgPHN0eWxlIG5hbWU9IldpZGdldC5Ecm9wRG93bkl0ZW0uU3Bpbm5lciI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Y2hlY2tNYXJrIj5AYW5kcm9pZDpkcmF3YWJsZS9idG5fcmFkaW88L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Y2hlY2tNYXJrIj4/YW5kcm9pZDphdHRyL2xpc3RDaG9pY2VJbmRpY2F0b3JTaW5nbGU8L2l0ZW0+CiAgICAgPC9zdHlsZT4KIAogICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuU2Nyb2xsVmlldyI+CkBAIC00OTcsNyArNTEzLDcgQEAKICAgICA8L3N0eWxlPgogICAgIAogICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuTGlzdFZpZXcuV2hpdGUiIHBhcmVudD0iV2lkZ2V0LkFic0xpc3RWaWV3Ij4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsaXN0U2VsZWN0b3IiPkBhbmRyb2lkOmRyYXdhYmxlL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsaXN0U2VsZWN0b3IiPkBhbmRyb2lkOmRyYXdhYmxlL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9saWdodDwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpjYWNoZUNvbG9ySGludCI+P2FuZHJvaWQ6YXR0ci9jb2xvckJhY2tncm91bmRDYWNoZUhpbnQ8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6ZGl2aWRlciI+QGFuZHJvaWQ6ZHJhd2FibGUvZGl2aWRlcl9ob3Jpem9udGFsX2JyaWdodF9vcGFxdWU8L2l0ZW0+CiAgICAgPC9zdHlsZT4gICAgCkBAIC01NzQsNiArNTkwLDcgQEAKICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpiYWNrZ3JvdW5kIj5AYW5kcm9pZDpkcmF3YWJsZS9xdWlja2NvbnRhY3RfYmFkZ2U8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Y2xpY2thYmxlIj50cnVlPC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNjYWxlVHlwZSI+Zml0Q2VudGVyPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNyYyI+QGFuZHJvaWQ6ZHJhd2FibGUvaWNfY29udGFjdF9waWN0dXJlPC9pdGVtPgogICAgIDwvc3R5bGU+CiAgICAgCiAgICAgPHN0eWxlIG5hbWU9IldpZGdldC5RdWlja0NvbnRhY3RCYWRnZVNtYWxsIj4KQEAgLTYxMyw5ICs2MzAsOSBAQAogCiAgICAgPHN0eWxlIG5hbWU9IlRleHRBcHBlYXJhbmNlIj4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3IiPj90ZXh0Q29sb3JQcmltYXJ5PC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvckhpZ2hsaWdodCI+I0ZGRkY5MjAwPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvckhpZ2hsaWdodCI+P3RleHRDb2xvckhpZ2hsaWdodDwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3JIaW50Ij4/dGV4dENvbG9ySGludDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3JMaW5rIj4jNUM1Q0ZGPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvckxpbmsiPj90ZXh0Q29sb3JMaW5rPC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRTaXplIj4xNnNwPC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRTdHlsZSI+bm9ybWFsPC9pdGVtPgogICAgIDwvc3R5bGU+CkBAIC02MjMsNyArNjQwLDggQEAKICAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuSW52ZXJzZSI+CiAgICAgICAgIDxpdGVtIG5hbWU9InRleHRDb2xvciI+P3RleHRDb2xvclByaW1hcnlJbnZlcnNlPC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvckhpbnQiPj90ZXh0Q29sb3JIaW50SW52ZXJzZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3JMaW5rIj4jMDAwMEVFPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvckhpZ2hsaWdodCI+P3RleHRDb2xvckhpZ2hsaWdodEludmVyc2U8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9yTGluayI+P3RleHRDb2xvckxpbmtJbnZlcnNlPC9pdGVtPgogICAgIDwvc3R5bGU+CiAKICAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuVGhlbWUiPgpAQCAtNjMxLDQxICs2NDksNDAgQEAKIAogICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5EaWFsb2dXaW5kb3dUaXRsZSI+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dFNpemUiPjE4c3A8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dFN0eWxlIj5ub3JtYWw8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9yIj4/dGV4dENvbG9yUHJpbWFyeTwvaXRlbT4KICAgICA8L3N0eWxlPgogCiAgICAgPHN0eWxlIG5hbWU9IlRleHRBcHBlYXJhbmNlLkxhcmdlIj4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0U2l6ZSI+MjJzcDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0U3R5bGUiPm5vcm1hbDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3IiPj90ZXh0Q29sb3JQcmltYXJ5PC9pdGVtPgogICAgIDwvc3R5bGU+CiAKICAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuTGFyZ2UuSW52ZXJzZSI+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9yIj4/dGV4dENvbG9yUHJpbWFyeUludmVyc2U8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9ySGludCI+P3RleHRDb2xvckhpbnRJbnZlcnNlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvckhpZ2hsaWdodCI+P3RleHRDb2xvckhpZ2hsaWdodEludmVyc2U8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9yTGluayI+P3RleHRDb2xvckxpbmtJbnZlcnNlPC9pdGVtPgogICAgIDwvc3R5bGU+CiAKICAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuTWVkaXVtIj4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0U2l6ZSI+MThzcDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0U3R5bGUiPm5vcm1hbDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3IiPj90ZXh0Q29sb3JQcmltYXJ5PC9pdGVtPgogICAgIDwvc3R5bGU+CiAKICAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuTWVkaXVtLkludmVyc2UiPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvciI+P3RleHRDb2xvclByaW1hcnlJbnZlcnNlPC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvckhpbnQiPj90ZXh0Q29sb3JIaW50SW52ZXJzZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3JIaWdobGlnaHQiPj90ZXh0Q29sb3JIaWdobGlnaHRJbnZlcnNlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvckxpbmsiPj90ZXh0Q29sb3JMaW5rSW52ZXJzZTwvaXRlbT4KICAgICA8L3N0eWxlPgogCiAgICAgPHN0eWxlIG5hbWU9IlRleHRBcHBlYXJhbmNlLlNtYWxsIj4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0U2l6ZSI+MTRzcDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0U3R5bGUiPm5vcm1hbDwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3IiPj90ZXh0Q29sb3JTZWNvbmRhcnk8L2l0ZW0+CiAgICAgPC9zdHlsZT4KIAogICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5TbWFsbC5JbnZlcnNlIj4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3IiPj90ZXh0Q29sb3JTZWNvbmRhcnlJbnZlcnNlPC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvckhpbnQiPj90ZXh0Q29sb3JIaW50SW52ZXJzZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3JIaWdobGlnaHQiPj90ZXh0Q29sb3JIaWdobGlnaHRJbnZlcnNlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvckxpbmsiPj90ZXh0Q29sb3JMaW5rSW52ZXJzZTwvaXRlbT4KICAgICA8L3N0eWxlPgogCiAgICAgPHN0eWxlIG5hbWU9IlRleHRBcHBlYXJhbmNlLlRoZW1lLkRpYWxvZyIgcGFyZW50PSJUZXh0QXBwZWFyYW5jZS5UaGVtZSI+CkBAIC04NjEsNCArODc4LDE5IEBACiAgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6cGFkZGluZ0JvdHRvbSI+MWRpcDwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpiYWNrZ3JvdW5kIj5AYW5kcm9pZDpkcmF3YWJsZS9ib3R0b21fYmFyPC9pdGVtPgogICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iQWN0aW9uQmFyIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpiYWNrZ3JvdW5kIj5AYW5kcm9pZDpkcmF3YWJsZS9hY3Rpb25fYmFyX2JhY2tncm91bmQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6ZGlzcGxheU9wdGlvbnMiPnVzZUxvZ288L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6ZGl2aWRlciI+QGFuZHJvaWQ6ZHJhd2FibGUvYWN0aW9uX2Jhcl9kaXZpZGVyPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmhlaWdodCI+P2FuZHJvaWQ6YXR0ci93aW5kb3dBY3Rpb25CYXJTaXplPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnBhZGRpbmdMZWZ0Ij4zZGlwPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnBhZGRpbmdUb3AiPjNkaXA8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6cGFkZGluZ1JpZ2h0Ij4zZGlwPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnBhZGRpbmdCb3R0b20iPjNkaXA8L2l0ZW0+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuQWN0aW9uQnV0dG9uIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpiYWNrZ3JvdW5kIj5AbnVsbDwvaXRlbT4KKyAgICA8L3N0eWxlPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzL3RoZW1lcy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzL3RoZW1lcy54bWwKaW5kZXggZDU4NWQ5ZS4uNmVkN2I3MSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy90aGVtZXMueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMvdGhlbWVzLnhtbApAQCAtNTMsNiArNTMsMTAgQEAKICAgICAgICAgPGl0ZW0gbmFtZT0idGV4dENvbG9ySGludCI+QGFuZHJvaWQ6Y29sb3IvaGludF9mb3JlZ3JvdW5kX2Rhcms8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9InRleHRDb2xvckhpbnRJbnZlcnNlIj5AYW5kcm9pZDpjb2xvci9oaW50X2ZvcmVncm91bmRfbGlnaHQ8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9InRleHRDb2xvclNlYXJjaFVybCI+QGFuZHJvaWQ6Y29sb3Ivc2VhcmNoX3VybF90ZXh0PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJ0ZXh0Q29sb3JIaWdobGlnaHQiPkBhbmRyb2lkOmNvbG9yL2hpZ2hsaWdodGVkX3RleHRfZGFyazwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0idGV4dENvbG9ySGlnaGxpZ2h0SW52ZXJzZSI+QGFuZHJvaWQ6Y29sb3IvaGlnaGxpZ2h0ZWRfdGV4dF9saWdodDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0idGV4dENvbG9yTGluayI+QGFuZHJvaWQ6Y29sb3IvbGlua190ZXh0X2Rhcms8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InRleHRDb2xvckxpbmtJbnZlcnNlIj5AYW5kcm9pZDpjb2xvci9saW5rX3RleHRfbGlnaHQ8L2l0ZW0+CiAKICAgICAgICAgPGl0ZW0gbmFtZT0idGV4dEFwcGVhcmFuY2VMYXJnZSI+QGFuZHJvaWQ6c3R5bGUvVGV4dEFwcGVhcmFuY2UuTGFyZ2U8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9InRleHRBcHBlYXJhbmNlTWVkaXVtIj5AYW5kcm9pZDpzdHlsZS9UZXh0QXBwZWFyYW5jZS5NZWRpdW08L2l0ZW0+CkBAIC02NSw2ICs2OSw5IEBACiAgICAgICAgIAogICAgICAgICA8aXRlbSBuYW1lPSJ0ZXh0QXBwZWFyYW5jZUJ1dHRvbiI+QGFuZHJvaWQ6c3R5bGUvVGV4dEFwcGVhcmFuY2UuV2lkZ2V0LkJ1dHRvbjwvaXRlbT4KICAgICAgICAgCisgICAgICAgIDxpdGVtIG5hbWU9ImVkaXRUZXh0Q29sb3IiPj9hbmRyb2lkOmF0dHIvdGV4dENvbG9yUHJpbWFyeUludmVyc2U8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImVkaXRUZXh0QmFja2dyb3VuZCI+QGFuZHJvaWQ6ZHJhd2FibGUvZWRpdF90ZXh0PC9pdGVtPgorICAgICAgICAKICAgICAgICAgPGl0ZW0gbmFtZT0iY2FuZGlkYXRlc1RleHRTdHlsZVNwYW5zIj5AYW5kcm9pZDpzdHJpbmcvY2FuZGlkYXRlc19zdHlsZTwvaXRlbT4KICAgICAgICAgCiAgICAgICAgIDxpdGVtIG5hbWU9InRleHRDaGVja01hcmsiPkBhbmRyb2lkOmRyYXdhYmxlL2luZGljYXRvcl9jaGVja19tYXJrX2Rhcms8L2l0ZW0+CkBAIC04NCw5ICs5MSwxMSBAQAogICAgICAgICA8aXRlbSBuYW1lPSJzZWFyY2hSZXN1bHRMaXN0SXRlbUhlaWdodCI+NThkaXA8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9Imxpc3REaXZpZGVyIj5AZHJhd2FibGUvZGl2aWRlcl9ob3Jpem9udGFsX2Rhcms8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9Imxpc3RTZXBhcmF0b3JUZXh0Vmlld1N0eWxlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuVGV4dFZpZXcuTGlzdFNlcGFyYXRvcjwvaXRlbT4gICAKLSAgICAgICAgCi0JCTxpdGVtIG5hbWU9Imxpc3RDaG9pY2VJbmRpY2F0b3JTaW5nbGUiPkBhbmRyb2lkOmRyYXdhYmxlL2J0bl9yYWRpbzwvaXRlbT4KLSAgICAJPGl0ZW0gbmFtZT0ibGlzdENob2ljZUluZGljYXRvck11bHRpcGxlIj5AYW5kcm9pZDpkcmF3YWJsZS9idG5fY2hlY2s8L2l0ZW0+ICAgIAorCisgICAgICAgIDxpdGVtIG5hbWU9Imxpc3RDaG9pY2VJbmRpY2F0b3JTaW5nbGUiPkBhbmRyb2lkOmRyYXdhYmxlL2J0bl9yYWRpbzwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0ibGlzdENob2ljZUluZGljYXRvck11bHRpcGxlIj5AYW5kcm9pZDpkcmF3YWJsZS9idG5fY2hlY2s8L2l0ZW0+CisKKyAgICAgICAgPGl0ZW0gbmFtZT0ibGlzdENob2ljZUJhY2tncm91bmRJbmRpY2F0b3IiPkBhbmRyb2lkOmRyYXdhYmxlL2xpc3Rfc2VsZWN0ZWRfYmFja2dyb3VuZDwvaXRlbT4KIAogICAgICAgICA8aXRlbSBuYW1lPSJleHBhbmRhYmxlTGlzdFByZWZlcnJlZEl0ZW1QYWRkaW5nTGVmdCI+NDBkaXA8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9ImV4cGFuZGFibGVMaXN0UHJlZmVycmVkQ2hpbGRQYWRkaW5nTGVmdCI+CkBAIC0xMTUsNiArMTI0LDEwIEBACiAgICAgICAgIDxpdGVtIG5hbWU9IndpbmRvd1RpdGxlQmFja2dyb3VuZFN0eWxlIj5AYW5kcm9pZDpzdHlsZS9XaW5kb3dUaXRsZUJhY2tncm91bmQ8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6d2luZG93QW5pbWF0aW9uU3R5bGUiPkBhbmRyb2lkOnN0eWxlL0FuaW1hdGlvbi5BY3Rpdml0eTwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp3aW5kb3dTb2Z0SW5wdXRNb2RlIj5zdGF0ZVVuc3BlY2lmaWVkfGFkanVzdFVuc3BlY2lmaWVkPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJ3aW5kb3dBY3Rpb25CYXIiPmZhbHNlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJ3aW5kb3dBY3Rpb25Nb2RlT3ZlcmxheSI+ZmFsc2U8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9IndpbmRvd0FjdGlvbkJhclN0eWxlIj5AYW5kcm9pZDpzdHlsZS9BY3Rpb25CYXI8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9IndpbmRvd0FjdGlvbkJhclNpemUiPjUwZGlwPC9pdGVtPgogCiAgICAgICAgIDwhLS0gRGlhbG9nIGF0dHJpYnV0ZXMgLS0+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFsZXJ0RGlhbG9nU3R5bGUiPkBhbmRyb2lkOnN0eWxlL0FsZXJ0RGlhbG9nPC9pdGVtPgpAQCAtMTU3LDggKzE3MCw4IEBACiAgICAgICAgIDxpdGVtIG5hbWU9InByb2dyZXNzQmFyU3R5bGVTbWFsbFRpdGxlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuUHJvZ3Jlc3NCYXIuU21hbGwuVGl0bGU8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9InByb2dyZXNzQmFyU3R5bGVMYXJnZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LlByb2dyZXNzQmFyLkxhcmdlPC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJwcm9ncmVzc0JhclN0eWxlSW52ZXJzZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LlByb2dyZXNzQmFyLkludmVyc2U8L2l0ZW0+Ci0JCTxpdGVtIG5hbWU9InByb2dyZXNzQmFyU3R5bGVTbWFsbEludmVyc2UiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Qcm9ncmVzc0Jhci5TbWFsbC5JbnZlcnNlPC9pdGVtPgotCSAgICA8aXRlbSBuYW1lPSJwcm9ncmVzc0JhclN0eWxlTGFyZ2VJbnZlcnNlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuUHJvZ3Jlc3NCYXIuTGFyZ2UuSW52ZXJzZTwvaXRlbT4gCisgICAgICAgIDxpdGVtIG5hbWU9InByb2dyZXNzQmFyU3R5bGVTbWFsbEludmVyc2UiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Qcm9ncmVzc0Jhci5TbWFsbC5JbnZlcnNlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJwcm9ncmVzc0JhclN0eWxlTGFyZ2VJbnZlcnNlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuUHJvZ3Jlc3NCYXIuTGFyZ2UuSW52ZXJzZTwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0ic2Vla0JhclN0eWxlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuU2Vla0JhcjwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0icmF0aW5nQmFyU3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5SYXRpbmdCYXI8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9InJhdGluZ0JhclN0eWxlSW5kaWNhdG9yIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuUmF0aW5nQmFyLkluZGljYXRvcjwvaXRlbT4KQEAgLTE2Nyw2ICsxODAsOSBAQAogICAgICAgICA8aXRlbSBuYW1lPSJzY3JvbGxWaWV3U3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5TY3JvbGxWaWV3PC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJob3Jpem9udGFsU2Nyb2xsVmlld1N0eWxlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuSG9yaXpvbnRhbFNjcm9sbFZpZXc8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9InNwaW5uZXJTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LlNwaW5uZXI8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImRyb3BEb3duU3Bpbm5lclN0eWxlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuU3Bpbm5lci5Ecm9wRG93bjwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYWN0aW9uRHJvcERvd25TdHlsZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LlNwaW5uZXIuRHJvcERvd248L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFjdGlvbkJ1dHRvblN0eWxlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuQWN0aW9uQnV0dG9uPC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJzdGFyU3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Db21wb3VuZEJ1dHRvbi5TdGFyPC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJ0YWJXaWRnZXRTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LlRhYldpZGdldDwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0idGV4dFZpZXdTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LlRleHRWaWV3PC9pdGVtPgpAQCAtMTk4LDYgKzIxNCwxMSBAQAogCiAgICAgICAgIDwhLS0gU2VhcmNoIHdpZGdldCBzdHlsZXMgLS0+CiAgICAgICAgIDxpdGVtIG5hbWU9InNlYXJjaFdpZGdldENvcnB1c0l0ZW1CYWNrZ3JvdW5kIj5AYW5kcm9pZDpjb2xvci9zZWFyY2hfd2lkZ2V0X2NvcnB1c19pdGVtX2JhY2tncm91bmQ8L2l0ZW0+CisKKyAgICAgICAgPCEtLSBBY3Rpb24gYmFyIHN0eWxlcyAtLT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYWN0aW9uQnV0dG9uUGFkZGluZyI+MTJkaXA8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFjdGlvbk1vZGVCYWNrZ3JvdW5kIj5AYW5kcm9pZDpkcmF3YWJsZS9hY3Rpb25fYmFyX2NvbnRleHRfYmFja2dyb3VuZDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYWN0aW9uTW9kZUNsb3NlRHJhd2FibGUiPkBhbmRyb2lkOmRyYXdhYmxlL2ljX21lbnVfY2xvc2VfY2xlYXJfY2FuY2VsPC9pdGVtPgogICAgIDwvc3R5bGU+CiAgICAgCiAgICAgPCEtLSBWYXJpYW50IG9mIHRoZSBkZWZhdWx0IChkYXJrKSB0aGVtZSB3aXRoIG5vIHRpdGxlIGJhciAtLT4KQEAgLTIyMSw3ICsyNDIsNyBAQAogICAgICAgICA8aXRlbSBuYW1lPSJjb2xvckJhY2tncm91bmQiPkBhbmRyb2lkOmNvbG9yL2JhY2tncm91bmRfbGlnaHQ8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9ImNvbG9yRm9yZWdyb3VuZCI+QGNvbG9yL2JyaWdodF9mb3JlZ3JvdW5kX2xpZ2h0PC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJjb2xvckZvcmVncm91bmRJbnZlcnNlIj5AYW5kcm9pZDpjb2xvci9icmlnaHRfZm9yZWdyb3VuZF9saWdodF9pbnZlcnNlPC9pdGVtPgotCisgICAgICAgIAogICAgICAgICA8aXRlbSBuYW1lPSJ0ZXh0Q29sb3JQcmltYXJ5Ij5AYW5kcm9pZDpjb2xvci9wcmltYXJ5X3RleHRfbGlnaHQ8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9InRleHRDb2xvclNlY29uZGFyeSI+QGFuZHJvaWQ6Y29sb3Ivc2Vjb25kYXJ5X3RleHRfbGlnaHQ8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9InRleHRDb2xvclRlcnRpYXJ5Ij5AYW5kcm9pZDpjb2xvci90ZXJ0aWFyeV90ZXh0X2xpZ2h0PC9pdGVtPgpAQCAtMjM1LDggKzI1NiwxNSBAQAogICAgICAgICA8aXRlbSBuYW1lPSJ0ZXh0Q29sb3JQcmltYXJ5SW52ZXJzZU5vRGlzYWJsZSI+QGFuZHJvaWQ6Y29sb3IvcHJpbWFyeV90ZXh0X2Rhcmtfbm9kaXNhYmxlPC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJ0ZXh0Q29sb3JTZWNvbmRhcnlJbnZlcnNlTm9EaXNhYmxlIj5AYW5kcm9pZDpjb2xvci9zZWNvbmRhcnlfdGV4dF9kYXJrX25vZGlzYWJsZTwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0idGV4dENvbG9ySGludCI+QGFuZHJvaWQ6Y29sb3IvaGludF9mb3JlZ3JvdW5kX2xpZ2h0PC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJ0ZXh0Q29sb3JIaW50SW52ZXJzZSI+QGFuZHJvaWQ6Y29sb3IvaGludF9mb3JlZ3JvdW5kX2Rhcms8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InRleHRDb2xvckhpbnRJbnZlcnNlIj5AYW5kcm9pZDpjb2xvci9oaW50X2ZvcmVncm91bmRfZGFyazwvaXRlbT4gICAgICAgIAorICAgICAgICA8aXRlbSBuYW1lPSJ0ZXh0Q29sb3JIaWdobGlnaHQiPkBhbmRyb2lkOmNvbG9yL2hpZ2hsaWdodGVkX3RleHRfbGlnaHQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InRleHRDb2xvckhpZ2hsaWdodEludmVyc2UiPkBhbmRyb2lkOmNvbG9yL2hpZ2hsaWdodGVkX3RleHRfZGFyazwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0idGV4dENvbG9yTGluayI+QGFuZHJvaWQ6Y29sb3IvbGlua190ZXh0X2xpZ2h0PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJ0ZXh0Q29sb3JMaW5rSW52ZXJzZSI+QGFuZHJvaWQ6Y29sb3IvbGlua190ZXh0X2Rhcms8L2l0ZW0+CiAgICAgICAgIAorICAgICAgICA8aXRlbSBuYW1lPSJlZGl0VGV4dENvbG9yIj4/YW5kcm9pZDphdHRyL3RleHRDb2xvclByaW1hcnk8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9Imxpc3RDaG9pY2VCYWNrZ3JvdW5kSW5kaWNhdG9yIj5AYW5kcm9pZDpkcmF3YWJsZS9saXN0X3NlbGVjdGVkX2JhY2tncm91bmRfbGlnaHQ8L2l0ZW0+CisKICAgICAgICAgPGl0ZW0gbmFtZT0icG9wdXBXaW5kb3dTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LlBvcHVwV2luZG93PC9pdGVtPgogICAgICAgICAKICAgICAgICAgPGl0ZW0gbmFtZT0idGV4dENoZWNrTWFyayI+QGFuZHJvaWQ6ZHJhd2FibGUvaW5kaWNhdG9yX2NoZWNrX21hcmtfbGlnaHQ8L2l0ZW0+CkBAIC0yNDcsMTMgKzI3NSwxMyBAQAogICAgICAgICA8aXRlbSBuYW1lPSJsaXN0Vmlld1N0eWxlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuTGlzdFZpZXcuV2hpdGU8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9Imxpc3REaXZpZGVyIj5AZHJhd2FibGUvZGl2aWRlcl9ob3Jpem9udGFsX2JyaWdodDwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0ibGlzdFNlcGFyYXRvclRleHRWaWV3U3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5UZXh0Vmlldy5MaXN0U2VwYXJhdG9yLldoaXRlPC9pdGVtPgotICAgICAgICAKKwogICAgICAgICA8aXRlbSBuYW1lPSJwcm9ncmVzc0JhclN0eWxlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuUHJvZ3Jlc3NCYXIuSW52ZXJzZTwvaXRlbT4KLQkJPGl0ZW0gbmFtZT0icHJvZ3Jlc3NCYXJTdHlsZVNtYWxsIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuUHJvZ3Jlc3NCYXIuU21hbGwuSW52ZXJzZTwvaXRlbT4KLQkJPGl0ZW0gbmFtZT0icHJvZ3Jlc3NCYXJTdHlsZUxhcmdlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuUHJvZ3Jlc3NCYXIuTGFyZ2UuSW52ZXJzZTwvaXRlbT4KLQkJPGl0ZW0gbmFtZT0icHJvZ3Jlc3NCYXJTdHlsZUludmVyc2UiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Qcm9ncmVzc0JhcjwvaXRlbT4KLQkJPGl0ZW0gbmFtZT0icHJvZ3Jlc3NCYXJTdHlsZVNtYWxsSW52ZXJzZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LlByb2dyZXNzQmFyLlNtYWxsPC9pdGVtPgotCQk8aXRlbSBuYW1lPSJwcm9ncmVzc0JhclN0eWxlTGFyZ2VJbnZlcnNlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuUHJvZ3Jlc3NCYXIuTGFyZ2U8L2l0ZW0+IAorICAgICAgICA8aXRlbSBuYW1lPSJwcm9ncmVzc0JhclN0eWxlU21hbGwiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Qcm9ncmVzc0Jhci5TbWFsbC5JbnZlcnNlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJwcm9ncmVzc0JhclN0eWxlTGFyZ2UiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Qcm9ncmVzc0Jhci5MYXJnZS5JbnZlcnNlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJwcm9ncmVzc0JhclN0eWxlSW52ZXJzZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LlByb2dyZXNzQmFyPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJwcm9ncmVzc0JhclN0eWxlU21hbGxJbnZlcnNlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuUHJvZ3Jlc3NCYXIuU21hbGw8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InByb2dyZXNzQmFyU3R5bGVMYXJnZUludmVyc2UiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Qcm9ncmVzc0Jhci5MYXJnZTwvaXRlbT4KICAgICA8L3N0eWxlPgogICAgIAogICAgIDwhLS0gVmFyaWFudCBvZiB0aGUgbGlnaHQgdGhlbWUgd2l0aCBubyB0aXRsZSBiYXIgLS0+CkBAIC00MTYsMTMgKzQ0NCwyNSBAQAogICAgICAgICA8aXRlbSBuYW1lPSJ0ZXh0QXBwZWFyYW5jZVNtYWxsSW52ZXJzZSI+QGFuZHJvaWQ6c3R5bGUvVGV4dEFwcGVhcmFuY2UuU21hbGwuSW52ZXJzZTwvaXRlbT4KICAgICA8L3N0eWxlPgogCisgICAgPCEtLSBWYXJpYXRpb24gb2YgVGhlbWUuRGlhbG9nIHRoYXQgZG9lcyBub3QgaW5jbHVkZSBhIGZyYW1lIChvciBiYWNrZ3JvdW5kKS4KKyAgICAgICAgIFRoZSB2aWV3IGhpZXJhcmNoeSBvZiB0aGUgZGlhbG9nIGlzIHJlc3BvbnNpYmxlIGZvciBkcmF3aW5nIGFsbCBvZgorICAgICAgICAgaXRzIHBpeGVscy4gLS0+CisgICAgPHN0eWxlIG5hbWU9IlRoZW1lLkRpYWxvZy5Ob0ZyYW1lIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0id2luZG93QmFja2dyb3VuZCI+QGFuZHJvaWQ6Y29sb3IvdHJhbnNwYXJlbnQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6d2luZG93RnJhbWUiPkBudWxsPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJ3aW5kb3dDb250ZW50T3ZlcmxheSI+QG51bGw8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6d2luZG93QW5pbWF0aW9uU3R5bGUiPkBudWxsPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmJhY2tncm91bmREaW1FbmFibGVkIj5mYWxzZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp3aW5kb3dJc1RyYW5zbHVjZW50Ij50cnVlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOndpbmRvd05vVGl0bGUiPnRydWU8L2l0ZW0+CisgICAgPC9zdHlsZT4KKwogICAgIDwhLS0gRGVmYXVsdCB0aGVtZSBmb3IgYWxlcnQgZGlhbG9nIHdpbmRvd3MsIHdoaWNoIGlzIHVzZWQgYnkgdGhlCiAgICAgICAgICB7QGxpbmsgYW5kcm9pZC5hcHAuQWxlcnREaWFsb2d9IGNsYXNzLiAgVGhpcyBpcyBiYXNpY2FsbHkgYSBkaWFsb2cKICAgICAgICAgIGJ1dCBzZXRzIHRoZSBiYWNrZ3JvdW5kIHRvIGVtcHR5IHNvIGl0IGNhbiBkbyB0d28tdG9uZSBiYWNrZ3JvdW5kcy4gLS0+CiAgICAgPHN0eWxlIG5hbWU9IlRoZW1lLkRpYWxvZy5BbGVydCI+CiAgICAgICAgIDxpdGVtIG5hbWU9IndpbmRvd0JhY2tncm91bmQiPkBhbmRyb2lkOmNvbG9yL3RyYW5zcGFyZW50PC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJ3aW5kb3dUaXRsZVN0eWxlIj5AYW5kcm9pZDpzdHlsZS9EaWFsb2dXaW5kb3dUaXRsZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0id2luZG93SXNGbG9hdGluZyI+dHJ1ZTwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0id2luZG93Q29udGVudE92ZXJsYXkiPkBudWxsPC9pdGVtPgogICAgIDwvc3R5bGU+CiAgICAgCkBAIC01MjEsNSArNTYxLDY3IEBACiAgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6d2luZG93QW5pbWF0aW9uU3R5bGUiPkBhbmRyb2lkOnN0eWxlL0FuaW1hdGlvbi5SZWNlbnRBcHBsaWNhdGlvbnM8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9yIj5AYW5kcm9pZDpjb2xvci9zZWNvbmRhcnlfdGV4dF9ub2ZvY3VzPC9pdGVtPgogICAgIDwvc3R5bGU+CisKKyAgICA8IS0tIERlZmF1bHQgdGhlbWUgd2l0aCBhbiBBY3Rpb24gQmFyLiAtLT4KKyAgICA8c3R5bGUgbmFtZT0iVGhlbWUuV2l0aEFjdGlvbkJhciI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6d2luZG93QWN0aW9uQmFyIj50cnVlPC9pdGVtPgorICAgIDwvc3R5bGU+CisKKyAgICA8IS0tIE5vIHRpdGxlIGJhciwgYnV0IEFjdGlvbiBNb2RlIGJhcnMgd2lsbCBvdmVybGF5IGFwcGxpY2F0aW9uIGNvbnRlbnQKKyAgICAgICAgIGluc3RlYWQgb2YgcHVzaGluZyBpdCBkb3duIHRvIG1ha2Ugcm9vbS4gLS0+CisgICAgPHN0eWxlIG5hbWU9IlRoZW1lLk5vVGl0bGVCYXIuT3ZlcmxheUFjdGlvbk1vZGVzIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp3aW5kb3dBY3Rpb25Nb2RlT3ZlcmxheSI+dHJ1ZTwvaXRlbT4KKyAgICA8L3N0eWxlPgogICAgIAorICAgIDwhLS0gTmV3IEhvbmV5Y29tYiBob2xvZ3JhcGhpYyB0aGVtZS4gRGFyayB2ZXJzaW9uLiAgVGhlIHdpZGdldHMgaW4gdGhlCisgICAgICAgICBob2xvZ3JhcGhpYyB0aGVtZSBhcmUgdHJhbnNsdWNlbnQgb24gdGhlaXIgYnJhY2tncm91bmQsIHNvIGFwcGxpY2F0aW9ucworICAgICAgICAgbXVzdCBlbnN1cmUgdGhhdCBhbnkgYmFja2dyb3VuZCB0aGV5IHVzZSB3aXRoIHRoaXMgdGhlbWUgaXMgaXRzZWxmCisgICAgICAgICBkYXJrOyBvdGhlcndpc2UsIGl0IHdpbGwgYmUgZGlmZmljdWx0IHRvIHNlZSB0aGUgd2lkZ2V0cy4gIFRoZSBuZXcKKyAgICAgICAgIFVJIHN0eWxlIGFsc28gaW5jbHVkZXMgYSBmdWxsIGFjdGlvbiBiYXIgYnkgZGVmYXVsdC4gLS0+CisgICAgPHN0eWxlIG5hbWU9IlRoZW1lLkhvbG8iPgorICAgICAgICA8aXRlbSBuYW1lPSJlZGl0VGV4dEJhY2tncm91bmQiPkBhbmRyb2lkOmRyYXdhYmxlL2VkaXRfdGV4dF9ob2xvX2Rhcms8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImVkaXRUZXh0Q29sb3IiPj9hbmRyb2lkOmF0dHIvdGV4dENvbG9yUHJpbWFyeTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp3aW5kb3dBY3Rpb25CYXIiPnRydWU8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9Imxpc3RDaG9pY2VJbmRpY2F0b3JTaW5nbGUiPkBhbmRyb2lkOmRyYXdhYmxlL2J0bl9yYWRpb19ob2xvX2Rhcms8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9Imxpc3RDaG9pY2VJbmRpY2F0b3JNdWx0aXBsZSI+QGFuZHJvaWQ6ZHJhd2FibGUvYnRuX2NoZWNrX2hvbG9fZGFyazwvaXRlbT4KKyAgICA8L3N0eWxlPgorCisgICAgPCEtLSBOZXcgSG9uZXljb21iIGhvbG9ncmFwaGljIHRoZW1lLiBMaWdodCB2ZXJzaW9uLiAgVGhlIHdpZGdldHMgaW4gdGhlCisgICAgICAgICBob2xvZ3JhcGhpYyB0aGVtZSBhcmUgdHJhbnNsdWNlbnQgb24gdGhlaXIgYnJhY2tncm91bmQsIHNvIGFwcGxpY2F0aW9ucworICAgICAgICAgbXVzdCBlbnN1cmUgdGhhdCBhbnkgYmFja2dyb3VuZCB0aGV5IHVzZSB3aXRoIHRoaXMgdGhlbWUgaXMgaXRzZWxmCisgICAgICAgICBsaWdodDsgb3RoZXJ3aXNlLCBpdCB3aWxsIGJlIGRpZmZpY3VsdCB0byBzZWUgdGhlIHdpZGdldHMuICBUaGUgbmV3CisgICAgICAgICBVSSBzdHlsZSBhbHNvIGluY2x1ZGVzIGEgZnVsbCBhY3Rpb24gYmFyIGJ5IGRlZmF1bHQuIC0tPgorICAgIDxzdHlsZSBuYW1lPSJUaGVtZS5MaWdodC5Ib2xvIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0iZWRpdFRleHRCYWNrZ3JvdW5kIj5AYW5kcm9pZDpkcmF3YWJsZS9lZGl0X3RleHRfaG9sb19saWdodDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp3aW5kb3dBY3Rpb25CYXIiPnRydWU8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9Imxpc3RDaG9pY2VJbmRpY2F0b3JTaW5nbGUiPkBhbmRyb2lkOmRyYXdhYmxlL2J0bl9yYWRpb19ob2xvX2xpZ2h0PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJsaXN0Q2hvaWNlSW5kaWNhdG9yTXVsdGlwbGUiPkBhbmRyb2lkOmRyYXdhYmxlL2J0bl9jaGVja19ob2xvX2xpZ2h0PC9pdGVtPgorICAgIDwvc3R5bGU+CisKKyAgICA8IS0tIFZhcmlhbnQgb2YgdGhlIGhvbG9ncmFwaGljIChkYXJrKSB0aGVtZSB3aXRoIG5vIGFjdGlvbiBiYXIuIC0tPgorICAgIDxzdHlsZSBuYW1lPSJUaGVtZS5Ib2xvLk5vQWN0aW9uQmFyIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp3aW5kb3dBY3Rpb25CYXIiPmZhbHNlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOndpbmRvd05vVGl0bGUiPnRydWU8L2l0ZW0+CisgICAgPC9zdHlsZT4KKyAgICAKKyAgICA8IS0tIFZhcmlhbnQgb2YgdGhlIGhvbG9ncmFwaGljIChkYXJrKSB0aGVtZSB0aGF0IGhhcyBubyB0aXRsZSBiYXIgYW5kIGZpbGxzCisgICAgICAgICB0aGUgZW50aXJlIHNjcmVlbiAtLT4KKyAgICA8c3R5bGUgbmFtZT0iVGhlbWUuSG9sby5Ob0FjdGlvbkJhci5GdWxsc2NyZWVuIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp3aW5kb3dGdWxsc2NyZWVuIj50cnVlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOndpbmRvd0NvbnRlbnRPdmVybGF5Ij5AbnVsbDwvaXRlbT4KKyAgICA8L3N0eWxlPgorCisgICAgPCEtLSBWYXJpYW50IG9mIHRoZSBob2xvZ3JhcGhpYyBsaWdodCB0aGVtZSB3aXRoIG5vIGFjdGlvbiBiYXIgLS0+CisgICAgPHN0eWxlIG5hbWU9IlRoZW1lLkxpZ2h0LkhvbG8uTm9BY3Rpb25CYXIiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOndpbmRvd0FjdGlvbkJhciI+ZmFsc2U8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6d2luZG93Tm9UaXRsZSI+dHJ1ZTwvaXRlbT4KKyAgICA8L3N0eWxlPgorCisgICAgPCEtLSBWYXJpYW50IG9mIHRoZSBob2xvZ3JhcGhpYyBsaWdodCB0aGVtZSB0aGF0IGhhcyBubyB0aXRsZSBiYXIgYW5kIGZpbGxzCisgICAgICAgICB0aGUgZW50aXJlIHNjcmVlbiAtLT4KKyAgICA8c3R5bGUgbmFtZT0iVGhlbWUuTGlnaHQuSG9sby5Ob0FjdGlvbkJhci5GdWxsc2NyZWVuIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp3aW5kb3dGdWxsc2NyZWVuIj50cnVlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOndpbmRvd0NvbnRlbnRPdmVybGF5Ij5AbnVsbDwvaXRlbT4KKyAgICA8L3N0eWxlPgorIAogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMveG1sLWxhbmQvcGFzc3dvcmRfa2JkX3F3ZXJ0eS54bWwgYi9jb3JlL3Jlcy9yZXMveG1sLWxhbmQvcGFzc3dvcmRfa2JkX3F3ZXJ0eS54bWwKaW5kZXggNzAwYzUyNy4uZmQ4YmQ0OSAxMDA3NTUKLS0tIGEvY29yZS9yZXMvcmVzL3htbC1sYW5kL3Bhc3N3b3JkX2tiZF9xd2VydHkueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy94bWwtbGFuZC9wYXNzd29yZF9rYmRfcXdlcnR5LnhtbApAQCAtMjIsNyArMjIsNyBAQAogICAgIGFuZHJvaWQ6a2V5V2lkdGg9IjEwJXAiCiAgICAgYW5kcm9pZDpob3Jpem9udGFsR2FwPSIwcHgiCiAgICAgYW5kcm9pZDp2ZXJ0aWNhbEdhcD0iMHB4IgotICAgIGFuZHJvaWQ6a2V5SGVpZ2h0PSJAZGltZW4vcGFzc3dvcmRfa2V5Ym9hcmRfa2V5X2hlaWdodCIKKyAgICBhbmRyb2lkOmtleUhlaWdodD0iQGRpbWVuL3Bhc3N3b3JkX2tleWJvYXJkX2tleV9oZWlnaHRfYWxwaGEiCiAgICAgPgogCiAgICAgPFJvdz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy94bWwtbGFuZC9wYXNzd29yZF9rYmRfcXdlcnR5X3NoaWZ0ZWQueG1sIGIvY29yZS9yZXMvcmVzL3htbC1sYW5kL3Bhc3N3b3JkX2tiZF9xd2VydHlfc2hpZnRlZC54bWwKaW5kZXggMWUzN2I2Yy4uOWZmNmZkNyAxMDA3NTUKLS0tIGEvY29yZS9yZXMvcmVzL3htbC1sYW5kL3Bhc3N3b3JkX2tiZF9xd2VydHlfc2hpZnRlZC54bWwKKysrIGIvY29yZS9yZXMvcmVzL3htbC1sYW5kL3Bhc3N3b3JkX2tiZF9xd2VydHlfc2hpZnRlZC54bWwKQEAgLTIyLDcgKzIyLDcgQEAKICAgICBhbmRyb2lkOmtleVdpZHRoPSIxMCVwIgogICAgIGFuZHJvaWQ6aG9yaXpvbnRhbEdhcD0iMHB4IgogICAgIGFuZHJvaWQ6dmVydGljYWxHYXA9IjBweCIKLSAgICBhbmRyb2lkOmtleUhlaWdodD0iQGRpbWVuL3Bhc3N3b3JkX2tleWJvYXJkX2tleV9oZWlnaHQiCisgICAgYW5kcm9pZDprZXlIZWlnaHQ9IkBkaW1lbi9wYXNzd29yZF9rZXlib2FyZF9rZXlfaGVpZ2h0X2FscGhhIgogICAgID4KIAogICAgIDxSb3c+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMveG1sLW1kcGkvcGFzc3dvcmRfa2JkX3F3ZXJ0eS54bWwgYi9jb3JlL3Jlcy9yZXMveG1sLW1kcGkvcGFzc3dvcmRfa2JkX3F3ZXJ0eS54bWwKaW5kZXggYmFlMWI0Mi4uODJhN2M3NSAxMDA3NTUKLS0tIGEvY29yZS9yZXMvcmVzL3htbC1tZHBpL3Bhc3N3b3JkX2tiZF9xd2VydHkueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy94bWwtbWRwaS9wYXNzd29yZF9rYmRfcXdlcnR5LnhtbApAQCAtMjIsNyArMjIsNyBAQAogICAgIGFuZHJvaWQ6a2V5V2lkdGg9IjEwJXAiCiAgICAgYW5kcm9pZDpob3Jpem9udGFsR2FwPSIwcHgiCiAgICAgYW5kcm9pZDp2ZXJ0aWNhbEdhcD0iMHB4IgotICAgIGFuZHJvaWQ6a2V5SGVpZ2h0PSJAZGltZW4vcGFzc3dvcmRfa2V5Ym9hcmRfa2V5X2hlaWdodCIKKyAgICBhbmRyb2lkOmtleUhlaWdodD0iQGRpbWVuL3Bhc3N3b3JkX2tleWJvYXJkX2tleV9oZWlnaHRfYWxwaGEiCiAgICAgPgogCiAgICAgPFJvdz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy94bWwtbWRwaS9wYXNzd29yZF9rYmRfcXdlcnR5X3NoaWZ0ZWQueG1sIGIvY29yZS9yZXMvcmVzL3htbC1tZHBpL3Bhc3N3b3JkX2tiZF9xd2VydHlfc2hpZnRlZC54bWwKaW5kZXggNjEyZGY5Yy4uOWZmZjNjYyAxMDA3NTUKLS0tIGEvY29yZS9yZXMvcmVzL3htbC1tZHBpL3Bhc3N3b3JkX2tiZF9xd2VydHlfc2hpZnRlZC54bWwKKysrIGIvY29yZS9yZXMvcmVzL3htbC1tZHBpL3Bhc3N3b3JkX2tiZF9xd2VydHlfc2hpZnRlZC54bWwKQEAgLTIyLDcgKzIyLDcgQEAKICAgICBhbmRyb2lkOmtleVdpZHRoPSIxMCVwIgogICAgIGFuZHJvaWQ6aG9yaXpvbnRhbEdhcD0iMHB4IgogICAgIGFuZHJvaWQ6dmVydGljYWxHYXA9IjBweCIKLSAgICBhbmRyb2lkOmtleUhlaWdodD0iQGRpbWVuL3Bhc3N3b3JkX2tleWJvYXJkX2tleV9oZWlnaHQiCisgICAgYW5kcm9pZDprZXlIZWlnaHQ9IkBkaW1lbi9wYXNzd29yZF9rZXlib2FyZF9rZXlfaGVpZ2h0X2FscGhhIgogICAgID4KIAogICAgIDxSb3c+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMveG1sLXhsYXJnZS9wYXNzd29yZF9rYmRfcXdlcnR5LnhtbCBiL2NvcmUvcmVzL3Jlcy94bWwteGxhcmdlL3Bhc3N3b3JkX2tiZF9xd2VydHkueG1sCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjBhMzUwNDAKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMveG1sLXhsYXJnZS9wYXNzd29yZF9rYmRfcXdlcnR5LnhtbApAQCAtMCwwICsxLDEwMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKy8qCisqKgorKiogQ29weXJpZ2h0IDIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKworPEtleWJvYXJkIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOmtleVdpZHRoPSIxMCVwIgorICAgIGFuZHJvaWQ6aG9yaXpvbnRhbEdhcD0iMHB4IgorICAgIGFuZHJvaWQ6dmVydGljYWxHYXA9IjBweCIKKyAgICBhbmRyb2lkOmtleUhlaWdodD0iQGRpbWVuL3Bhc3N3b3JkX2tleWJvYXJkX2tleV9oZWlnaHRfYWxwaGEiCisgICAgPgorCisgICAgPFJvdyBhbmRyb2lkOnJvd0VkZ2VGbGFncz0idG9wIj4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSIxIiBhbmRyb2lkOmtleUVkZ2VGbGFncz0ibGVmdCIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9IjIiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSIzIi8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0iNCIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9IjUiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSI2Ii8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0iNyIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9IjgiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSI5Ii8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0iMCIgYW5kcm9pZDprZXlFZGdlRmxhZ3M9InJpZ2h0Ii8+CisgICAgPC9Sb3c+CisKKyAgICA8Um93PgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9InEiIGFuZHJvaWQ6a2V5RWRnZUZsYWdzPSJsZWZ0Ii8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0idyIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9ImUiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJyIi8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0idCIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9InkiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJ1Ii8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0iaSIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9Im8iLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJwIiBhbmRyb2lkOmtleUVkZ2VGbGFncz0icmlnaHQiLz4KKyAgICA8L1Jvdz4KKworICAgIDxSb3c+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0iYSIgYW5kcm9pZDpob3Jpem9udGFsR2FwPSI1JXAiCisgICAgICAgICAgICBhbmRyb2lkOmtleUVkZ2VGbGFncz0ibGVmdCIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9InMiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJkIi8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0iZiIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9ImciLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJoIi8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0iaiIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9ImsiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJsIiBhbmRyb2lkOmtleUVkZ2VGbGFncz0icmlnaHQiLz4KKyAgICA8L1Jvdz4KKworICAgIDxSb3c+CisgICAgICAgIDxLZXkgYW5kcm9pZDpjb2Rlcz0iLTEiIGFuZHJvaWQ6a2V5SWNvbj0iQGRyYXdhYmxlL3N5bV9rZXlib2FyZF9zaGlmdCIKKyAgICAgICAgICAgIGFuZHJvaWQ6a2V5V2lkdGg9IjE1JXAiIGFuZHJvaWQ6aXNNb2RpZmllcj0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6aWNvblByZXZpZXc9IkBkcmF3YWJsZS9zeW1fa2V5Ym9hcmRfZmVlZGJhY2tfc2hpZnQiCisgICAgICAgICAgICBhbmRyb2lkOmlzU3RpY2t5PSJ0cnVlIiBhbmRyb2lkOmtleUVkZ2VGbGFncz0ibGVmdCIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9InoiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJ4Ii8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0iYyIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9InYiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJiIi8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0ibiIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9Im0iLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmNvZGVzPSItNSIgYW5kcm9pZDprZXlJY29uPSJAZHJhd2FibGUvc3ltX2tleWJvYXJkX2RlbGV0ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6a2V5V2lkdGg9IjE1JXAiIGFuZHJvaWQ6a2V5RWRnZUZsYWdzPSJyaWdodCIKKyAgICAgICAgICAgIGFuZHJvaWQ6aWNvblByZXZpZXc9IkBkcmF3YWJsZS9zeW1fa2V5Ym9hcmRfZmVlZGJhY2tfZGVsZXRlIgorICAgICAgICAgICAgYW5kcm9pZDppc1JlcGVhdGFibGU9InRydWUiLz4KKyAgICA8L1Jvdz4KKworICAgIDxSb3cgYW5kcm9pZDprZXlib2FyZE1vZGU9IkAraWQvbW9kZV9ub3JtYWwiIGFuZHJvaWQ6cm93RWRnZUZsYWdzPSJib3R0b20iPgorICAgICAgICA8S2V5IGFuZHJvaWQ6Y29kZXM9Ii0yIiBhbmRyb2lkOmtleUxhYmVsPSJAc3RyaW5nL3Bhc3N3b3JkX2tleWJvYXJkX2xhYmVsX3N5bWJvbF9rZXkiCisgICAgICAgICAgICBhbmRyb2lkOmtleVdpZHRoPSIyMCVwIiBhbmRyb2lkOmtleUVkZ2VGbGFncz0ibGVmdCIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9IiwiIC8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0iLSIgLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmNvZGVzPSIzMiIgYW5kcm9pZDprZXlJY29uPSJAZHJhd2FibGUvc3ltX2tleWJvYXJkX3NwYWNlIgorICAgICAgICAgICAgYW5kcm9pZDppY29uUHJldmlldz0iQGRyYXdhYmxlL3N5bV9rZXlib2FyZF9mZWVkYmFja19zcGFjZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6a2V5V2lkdGg9IjIwJXAiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSI9IiAvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9Ii4iCisgICAgICAgICAgICBhbmRyb2lkOmtleVdpZHRoPSIxMCVwIi8+CisgICAgICAgIDxLZXkgYW5kcm9pZDpjb2Rlcz0iMTAiIGFuZHJvaWQ6a2V5SWNvbj0iQGRyYXdhYmxlL3N5bV9rZXlib2FyZF9vayIKKyAgICAgICAgICAgIGFuZHJvaWQ6aWNvblByZXZpZXc9IkBkcmF3YWJsZS9zeW1fa2V5Ym9hcmRfZmVlZGJhY2tfb2siCisgICAgICAgICAgICBhbmRyb2lkOmtleVdpZHRoPSIyMCVwIiBhbmRyb2lkOmtleUVkZ2VGbGFncz0icmlnaHQiLz4KKyAgICA8L1Jvdz4KKworPC9LZXlib2FyZD4KKwpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3htbC14bGFyZ2UvcGFzc3dvcmRfa2JkX3F3ZXJ0eV9zaGlmdGVkLnhtbCBiL2NvcmUvcmVzL3Jlcy94bWwteGxhcmdlL3Bhc3N3b3JkX2tiZF9xd2VydHlfc2hpZnRlZC54bWwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOWU5ZGI4MQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy94bWwteGxhcmdlL3Bhc3N3b3JkX2tiZF9xd2VydHlfc2hpZnRlZC54bWwKQEAgLTAsMCArMSwxMDEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisvKgorKioKKyoqIENvcHlyaWdodCAyMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLS0+CisKKzxLZXlib2FyZCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDprZXlXaWR0aD0iMTAlcCIKKyAgICBhbmRyb2lkOmhvcml6b250YWxHYXA9IjBweCIKKyAgICBhbmRyb2lkOnZlcnRpY2FsR2FwPSIwcHgiCisgICAgYW5kcm9pZDprZXlIZWlnaHQ9IkBkaW1lbi9wYXNzd29yZF9rZXlib2FyZF9rZXlfaGVpZ2h0X2FscGhhIgorICAgID4KKworICAgIDxSb3cgYW5kcm9pZDpyb3dFZGdlRmxhZ3M9InRvcCI+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0iXEAiIGFuZHJvaWQ6a2V5RWRnZUZsYWdzPSJsZWZ0Ii8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0iXCMiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSIkIi8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0iJSIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9IiZhbXA7Ii8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0iKiIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9Ii0iLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSIrIi8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0iKCIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9IikiIGFuZHJvaWQ6a2V5RWRnZUZsYWdzPSJyaWdodCIvPgorICAgIDwvUm93PgorCisgICAgPFJvdz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJxIiBhbmRyb2lkOmtleUVkZ2VGbGFncz0ibGVmdCIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9InciLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJlIi8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0iciIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9InQiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJ5Ii8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0idSIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9ImkiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJvIi8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0icCIgYW5kcm9pZDprZXlFZGdlRmxhZ3M9InJpZ2h0Ii8+CisgICAgPC9Sb3c+CisKKyAgICA8Um93PgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9ImEiIGFuZHJvaWQ6aG9yaXpvbnRhbEdhcD0iNSVwIgorICAgICAgICAgICAgYW5kcm9pZDprZXlFZGdlRmxhZ3M9ImxlZnQiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJzIi8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0iZCIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9ImYiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJnIi8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0iaCIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9ImoiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJrIi8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0ibCIgYW5kcm9pZDprZXlFZGdlRmxhZ3M9InJpZ2h0Ii8+CisgICAgPC9Sb3c+CisKKyAgICA8Um93PgorICAgICAgICA8S2V5IGFuZHJvaWQ6Y29kZXM9Ii0xIiBhbmRyb2lkOmtleUljb249IkBkcmF3YWJsZS9zeW1fa2V5Ym9hcmRfc2hpZnQiCisgICAgICAgICAgICBhbmRyb2lkOmtleVdpZHRoPSIxNSVwIiBhbmRyb2lkOmlzTW9kaWZpZXI9InRydWUiCisgICAgICAgICAgICBhbmRyb2lkOmljb25QcmV2aWV3PSJAZHJhd2FibGUvc3ltX2tleWJvYXJkX2ZlZWRiYWNrX3NoaWZ0IgorICAgICAgICAgICAgYW5kcm9pZDppc1N0aWNreT0idHJ1ZSIgYW5kcm9pZDprZXlFZGdlRmxhZ3M9ImxlZnQiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJ6Ii8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0ieCIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9ImMiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJ2Ii8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0iYiIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9Im4iLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJtIi8+CisgICAgICAgIDxLZXkgYW5kcm9pZDpjb2Rlcz0iLTUiIGFuZHJvaWQ6a2V5SWNvbj0iQGRyYXdhYmxlL3N5bV9rZXlib2FyZF9kZWxldGUiCisgICAgICAgICAgICBhbmRyb2lkOmtleVdpZHRoPSIxNSVwIiBhbmRyb2lkOmtleUVkZ2VGbGFncz0icmlnaHQiCisgICAgICAgICAgICBhbmRyb2lkOmljb25QcmV2aWV3PSJAZHJhd2FibGUvc3ltX2tleWJvYXJkX2ZlZWRiYWNrX2RlbGV0ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6aXNSZXBlYXRhYmxlPSJ0cnVlIi8+CisgICAgPC9Sb3c+CisKKyAgICA8Um93IGFuZHJvaWQ6a2V5Ym9hcmRNb2RlPSJAK2lkL21vZGVfbm9ybWFsIiBhbmRyb2lkOnJvd0VkZ2VGbGFncz0iYm90dG9tIj4KKyAgICAgICAgPEtleSBhbmRyb2lkOmNvZGVzPSItMiIgYW5kcm9pZDprZXlMYWJlbD0iQHN0cmluZy9wYXNzd29yZF9rZXlib2FyZF9sYWJlbF9zeW1ib2xfa2V5IgorICAgICAgICAgICAgYW5kcm9pZDprZXlXaWR0aD0iMjAlcCIgYW5kcm9pZDprZXlFZGdlRmxhZ3M9ImxlZnQiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSIsIiAvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9Il8iIC8+CisgICAgICAgIDxLZXkgYW5kcm9pZDpjb2Rlcz0iMzIiIGFuZHJvaWQ6a2V5SWNvbj0iQGRyYXdhYmxlL3N5bV9rZXlib2FyZF9zcGFjZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6aWNvblByZXZpZXc9IkBkcmF3YWJsZS9zeW1fa2V5Ym9hcmRfZmVlZGJhY2tfc3BhY2UiCisgICAgICAgICAgICBhbmRyb2lkOmtleVdpZHRoPSIyMCVwIi8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0iKyIgLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSIuIi8+CisgICAgICAgIDxLZXkgYW5kcm9pZDpjb2Rlcz0iMTAiIGFuZHJvaWQ6a2V5SWNvbj0iQGRyYXdhYmxlL3N5bV9rZXlib2FyZF9vayIKKyAgICAgICAgICAgIGFuZHJvaWQ6aWNvblByZXZpZXc9IkBkcmF3YWJsZS9zeW1fa2V5Ym9hcmRfZmVlZGJhY2tfb2siCisgICAgICAgICAgICBhbmRyb2lkOmtleVdpZHRoPSIyMCVwIiBhbmRyb2lkOmtleUVkZ2VGbGFncz0icmlnaHQiLz4KKyAgICA8L1Jvdz4KKworPC9LZXlib2FyZD4KKwpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3htbC9wYXNzd29yZF9rYmRfZXh0ZW5zaW9uLnhtbCBiL2NvcmUvcmVzL3Jlcy94bWwvcGFzc3dvcmRfa2JkX2V4dGVuc2lvbi54bWwKaW5kZXggMjhiN2VmZS4uZjNmYTU3YiAxMDA3NTUKLS0tIGEvY29yZS9yZXMvcmVzL3htbC9wYXNzd29yZF9rYmRfZXh0ZW5zaW9uLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMveG1sL3Bhc3N3b3JkX2tiZF9leHRlbnNpb24ueG1sCkBAIC0yMiw3ICsyMiw3IEBACiAgICAgYW5kcm9pZDprZXlXaWR0aD0iMTAlcCIKICAgICBhbmRyb2lkOmhvcml6b250YWxHYXA9IjBweCIKICAgICBhbmRyb2lkOnZlcnRpY2FsR2FwPSIwcHgiCi0gICAgYW5kcm9pZDprZXlIZWlnaHQ9IkBkaW1lbi9wYXNzd29yZF9rZXlib2FyZF9rZXlfaGVpZ2h0IgorICAgIGFuZHJvaWQ6a2V5SGVpZ2h0PSJAZGltZW4vcGFzc3dvcmRfa2V5Ym9hcmRfa2V5X2hlaWdodF9hbHBoYSIKICAgICA+CiAKICAgICA8Um93IGFuZHJvaWQ6cm93RWRnZUZsYWdzPSJ0b3AiPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3htbC9wYXNzd29yZF9rYmRfbnVtZXJpYy54bWwgYi9jb3JlL3Jlcy9yZXMveG1sL3Bhc3N3b3JkX2tiZF9udW1lcmljLnhtbAppbmRleCBlM2YxNjEyLi4yMjcwYjhhIDEwMDc1NQotLS0gYS9jb3JlL3Jlcy9yZXMveG1sL3Bhc3N3b3JkX2tiZF9udW1lcmljLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMveG1sL3Bhc3N3b3JkX2tiZF9udW1lcmljLnhtbApAQCAtMTksMzUgKzE5LDQxIEBACiAtLT4KIDxLZXlib2FyZCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCiAgICAgYW5kcm9pZDprZXlXaWR0aD0iMzMuMzMlcCIKLSAgICBhbmRyb2lkOmhvcml6b250YWxHYXA9IjJweCIKICAgICBhbmRyb2lkOnZlcnRpY2FsR2FwPSIwcHgiCi0gICAgYW5kcm9pZDprZXlIZWlnaHQ9IkBkaW1lbi9wYXNzd29yZF9rZXlib2FyZF9rZXlfaGVpZ2h0IgorICAgIGFuZHJvaWQ6a2V5SGVpZ2h0PSJAZGltZW4vcGFzc3dvcmRfa2V5Ym9hcmRfa2V5X2hlaWdodF9udW1lcmljIgogICAgID4KIAotICAgIDxSb3c+Ci0gICAgICAgIDxLZXkgYW5kcm9pZDpjb2Rlcz0iNDkiIGFuZHJvaWQ6a2V5SWNvbj0iQGRyYXdhYmxlL3N5bV9rZXlib2FyZF9udW0xIiBhbmRyb2lkOmtleUVkZ2VGbGFncz0ibGVmdCIvPgorICAgIDxSb3cgYW5kcm9pZDpyb3dFZGdlRmxhZ3M9InRvcCI+CisgICAgICAgIDxLZXkgYW5kcm9pZDpjb2Rlcz0iNDkiIGFuZHJvaWQ6a2V5SWNvbj0iQGRyYXdhYmxlL3N5bV9rZXlib2FyZF9udW0xIgorICAgICAgICAgICAgIGFuZHJvaWQ6a2V5RWRnZUZsYWdzPSJsZWZ0Ii8+CiAgICAgICAgIDxLZXkgYW5kcm9pZDpjb2Rlcz0iNTAiIGFuZHJvaWQ6a2V5SWNvbj0iQGRyYXdhYmxlL3N5bV9rZXlib2FyZF9udW0yIi8+Ci0gICAgICAgIDxLZXkgYW5kcm9pZDpjb2Rlcz0iNTEiIGFuZHJvaWQ6a2V5SWNvbj0iQGRyYXdhYmxlL3N5bV9rZXlib2FyZF9udW0zIi8+CisgICAgICAgIDxLZXkgYW5kcm9pZDpjb2Rlcz0iNTEiIGFuZHJvaWQ6a2V5SWNvbj0iQGRyYXdhYmxlL3N5bV9rZXlib2FyZF9udW0zIgorICAgICAgICAgICAgIGFuZHJvaWQ6a2V5RWRnZUZsYWdzPSJyaWdodCIvPgogICAgIDwvUm93PgogCiAgICAgPFJvdz4KLSAgICAgICAgPEtleSBhbmRyb2lkOmNvZGVzPSI1MiIgYW5kcm9pZDprZXlJY29uPSJAZHJhd2FibGUvc3ltX2tleWJvYXJkX251bTQiIGFuZHJvaWQ6a2V5RWRnZUZsYWdzPSJsZWZ0Ii8+CisgICAgICAgIDxLZXkgYW5kcm9pZDpjb2Rlcz0iNTIiIGFuZHJvaWQ6a2V5SWNvbj0iQGRyYXdhYmxlL3N5bV9rZXlib2FyZF9udW00IgorICAgICAgICAgICAgIGFuZHJvaWQ6a2V5RWRnZUZsYWdzPSJsZWZ0Ii8+CiAgICAgICAgIDxLZXkgYW5kcm9pZDpjb2Rlcz0iNTMiIGFuZHJvaWQ6a2V5SWNvbj0iQGRyYXdhYmxlL3N5bV9rZXlib2FyZF9udW01Ii8+Ci0gICAgICAgIDxLZXkgYW5kcm9pZDpjb2Rlcz0iNTQiIGFuZHJvaWQ6a2V5SWNvbj0iQGRyYXdhYmxlL3N5bV9rZXlib2FyZF9udW02Ii8+CisgICAgICAgIDxLZXkgYW5kcm9pZDpjb2Rlcz0iNTQiIGFuZHJvaWQ6a2V5SWNvbj0iQGRyYXdhYmxlL3N5bV9rZXlib2FyZF9udW02IgorICAgICAgICAgICAgIGFuZHJvaWQ6a2V5RWRnZUZsYWdzPSJyaWdodCIvPgogICAgIDwvUm93PgogCiAgICAgPFJvdz4KLSAgICAgICAgPEtleSBhbmRyb2lkOmNvZGVzPSI1NSIgYW5kcm9pZDprZXlJY29uPSJAZHJhd2FibGUvc3ltX2tleWJvYXJkX251bTciIGFuZHJvaWQ6a2V5RWRnZUZsYWdzPSJsZWZ0Ii8+CisgICAgICAgIDxLZXkgYW5kcm9pZDpjb2Rlcz0iNTUiIGFuZHJvaWQ6a2V5SWNvbj0iQGRyYXdhYmxlL3N5bV9rZXlib2FyZF9udW03IgorICAgICAgICAgICAgIGFuZHJvaWQ6a2V5RWRnZUZsYWdzPSJsZWZ0Ii8+CiAgICAgICAgIDxLZXkgYW5kcm9pZDpjb2Rlcz0iNTYiIGFuZHJvaWQ6a2V5SWNvbj0iQGRyYXdhYmxlL3N5bV9rZXlib2FyZF9udW04Ii8+Ci0gICAgICAgIDxLZXkgYW5kcm9pZDpjb2Rlcz0iNTciIGFuZHJvaWQ6a2V5SWNvbj0iQGRyYXdhYmxlL3N5bV9rZXlib2FyZF9udW05Ii8+CisgICAgICAgIDxLZXkgYW5kcm9pZDpjb2Rlcz0iNTciIGFuZHJvaWQ6a2V5SWNvbj0iQGRyYXdhYmxlL3N5bV9rZXlib2FyZF9udW05IgorICAgICAgICAgICAgIGFuZHJvaWQ6a2V5RWRnZUZsYWdzPSJyaWdodCIvPgogICAgIDwvUm93PgogCiAgICAgPFJvdyBhbmRyb2lkOnJvd0VkZ2VGbGFncz0iYm90dG9tIj4KLSAgICAgICAgPEtleSBhbmRyb2lkOmNvZGVzPSIxMCIgYW5kcm9pZDprZXlJY29uPSJAZHJhd2FibGUvc3ltX2tleWJvYXJkX29rIi8+CisgICAgICAgIDxLZXkgYW5kcm9pZDpjb2Rlcz0iMTAiIGFuZHJvaWQ6a2V5SWNvbj0iQGRyYXdhYmxlL3N5bV9rZXlib2FyZF9vayIKKyAgICAgICAgICAgICBhbmRyb2lkOmtleUVkZ2VGbGFncz0ibGVmdCIvPgogICAgICAgICA8S2V5IGFuZHJvaWQ6Y29kZXM9IjQ4IiBhbmRyb2lkOmtleUljb249IkBkcmF3YWJsZS9zeW1fa2V5Ym9hcmRfbnVtMF9ub19wbHVzIi8+CiAgICAgICAgIDxLZXkgYW5kcm9pZDpjb2Rlcz0iLTUiIGFuZHJvaWQ6a2V5SWNvbj0iQGRyYXdhYmxlL3N5bV9rZXlib2FyZF9kZWxldGUiCi0gICAgICAgICAgICBhbmRyb2lkOmljb25QcmV2aWV3PSJAZHJhd2FibGUvc3ltX2tleWJvYXJkX2ZlZWRiYWNrX2RlbGV0ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6aXNSZXBlYXRhYmxlPSJ0cnVlIiBhbmRyb2lkOmtleUVkZ2VGbGFncz0icmlnaHQiLz4KKyAgICAgICAgICAgICBhbmRyb2lkOmljb25QcmV2aWV3PSJAZHJhd2FibGUvc3ltX2tleWJvYXJkX2ZlZWRiYWNrX2RlbGV0ZSIKKyAgICAgICAgICAgICBhbmRyb2lkOmlzUmVwZWF0YWJsZT0idHJ1ZSIgYW5kcm9pZDprZXlFZGdlRmxhZ3M9InJpZ2h0Ii8+CiAgICAgPC9Sb3c+CiAKIDwvS2V5Ym9hcmQ+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMveG1sL3Bhc3N3b3JkX2tiZF9wb3B1cF90ZW1wbGF0ZS54bWwgYi9jb3JlL3Jlcy9yZXMveG1sL3Bhc3N3b3JkX2tiZF9wb3B1cF90ZW1wbGF0ZS54bWwKaW5kZXggNWRkZmQzZS4uOWI4NTNlMiAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3htbC9wYXNzd29yZF9rYmRfcG9wdXBfdGVtcGxhdGUueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy94bWwvcGFzc3dvcmRfa2JkX3BvcHVwX3RlbXBsYXRlLnhtbApAQCAtMjIsNiArMjIsNiBAQAogICAgIGFuZHJvaWQ6a2V5V2lkdGg9IjEwJXAiCiAgICAgYW5kcm9pZDpob3Jpem9udGFsR2FwPSIwcHgiCiAgICAgYW5kcm9pZDp2ZXJ0aWNhbEdhcD0iMHB4IgotICAgIGFuZHJvaWQ6a2V5SGVpZ2h0PSJAZGltZW4vcGFzc3dvcmRfa2V5Ym9hcmRfa2V5X2hlaWdodCIKKyAgICBhbmRyb2lkOmtleUhlaWdodD0iQGRpbWVuL3Bhc3N3b3JkX2tleWJvYXJkX2tleV9oZWlnaHRfYWxwaGEiCiAgICAgPgogPC9LZXlib2FyZD4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy94bWwvcGFzc3dvcmRfa2JkX3F3ZXJ0eS54bWwgYi9jb3JlL3Jlcy9yZXMveG1sL3Bhc3N3b3JkX2tiZF9xd2VydHkueG1sCmluZGV4IDVmYTliOGEuLjBhMzUwNDAgMTAwNzU1Ci0tLSBhL2NvcmUvcmVzL3Jlcy94bWwvcGFzc3dvcmRfa2JkX3F3ZXJ0eS54bWwKKysrIGIvY29yZS9yZXMvcmVzL3htbC9wYXNzd29yZF9rYmRfcXdlcnR5LnhtbApAQCAtMjIsNyArMjIsNyBAQAogICAgIGFuZHJvaWQ6a2V5V2lkdGg9IjEwJXAiCiAgICAgYW5kcm9pZDpob3Jpem9udGFsR2FwPSIwcHgiCiAgICAgYW5kcm9pZDp2ZXJ0aWNhbEdhcD0iMHB4IgotICAgIGFuZHJvaWQ6a2V5SGVpZ2h0PSJAZGltZW4vcGFzc3dvcmRfa2V5Ym9hcmRfa2V5X2hlaWdodCIKKyAgICBhbmRyb2lkOmtleUhlaWdodD0iQGRpbWVuL3Bhc3N3b3JkX2tleWJvYXJkX2tleV9oZWlnaHRfYWxwaGEiCiAgICAgPgogCiAgICAgPFJvdyBhbmRyb2lkOnJvd0VkZ2VGbGFncz0idG9wIj4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy94bWwvcGFzc3dvcmRfa2JkX3F3ZXJ0eV9zaGlmdGVkLnhtbCBiL2NvcmUvcmVzL3Jlcy94bWwvcGFzc3dvcmRfa2JkX3F3ZXJ0eV9zaGlmdGVkLnhtbAppbmRleCBlNDkxYWZmLi45ZTlkYjgxIDEwMDc1NQotLS0gYS9jb3JlL3Jlcy9yZXMveG1sL3Bhc3N3b3JkX2tiZF9xd2VydHlfc2hpZnRlZC54bWwKKysrIGIvY29yZS9yZXMvcmVzL3htbC9wYXNzd29yZF9rYmRfcXdlcnR5X3NoaWZ0ZWQueG1sCkBAIC0yMiw3ICsyMiw3IEBACiAgICAgYW5kcm9pZDprZXlXaWR0aD0iMTAlcCIKICAgICBhbmRyb2lkOmhvcml6b250YWxHYXA9IjBweCIKICAgICBhbmRyb2lkOnZlcnRpY2FsR2FwPSIwcHgiCi0gICAgYW5kcm9pZDprZXlIZWlnaHQ9IkBkaW1lbi9wYXNzd29yZF9rZXlib2FyZF9rZXlfaGVpZ2h0IgorICAgIGFuZHJvaWQ6a2V5SGVpZ2h0PSJAZGltZW4vcGFzc3dvcmRfa2V5Ym9hcmRfa2V5X2hlaWdodF9hbHBoYSIKICAgICA+CiAKICAgICA8Um93IGFuZHJvaWQ6cm93RWRnZUZsYWdzPSJ0b3AiPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3htbC9wYXNzd29yZF9rYmRfc3ltYm9scy54bWwgYi9jb3JlL3Jlcy9yZXMveG1sL3Bhc3N3b3JkX2tiZF9zeW1ib2xzLnhtbAppbmRleCAxNGE3ZWM4Li45YTk0OTMwIDEwMDc1NQotLS0gYS9jb3JlL3Jlcy9yZXMveG1sL3Bhc3N3b3JkX2tiZF9zeW1ib2xzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMveG1sL3Bhc3N3b3JkX2tiZF9zeW1ib2xzLnhtbApAQCAtMjIsMTAgKzIyLDEwIEBACiAgICAgYW5kcm9pZDprZXlXaWR0aD0iMTAlcCIKICAgICBhbmRyb2lkOmhvcml6b250YWxHYXA9IjBweCIKICAgICBhbmRyb2lkOnZlcnRpY2FsR2FwPSIwcHgiCi0gICAgYW5kcm9pZDprZXlIZWlnaHQ9IkBkaW1lbi9wYXNzd29yZF9rZXlib2FyZF9rZXlfaGVpZ2h0IgorICAgIGFuZHJvaWQ6a2V5SGVpZ2h0PSJAZGltZW4vcGFzc3dvcmRfa2V5Ym9hcmRfa2V5X2hlaWdodF9hbHBoYSIKICAgICA+CiAKLSAgICA8Um93PgorICAgIDxSb3cgYW5kcm9pZDpyb3dFZGdlRmxhZ3M9InRvcCI+CiAgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0iMSIgYW5kcm9pZDprZXlFZGdlRmxhZ3M9ImxlZnQiLz4KICAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSIyIi8+CiAgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0iMyIvPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3htbC9wYXNzd29yZF9rYmRfc3ltYm9sc19zaGlmdC54bWwgYi9jb3JlL3Jlcy9yZXMveG1sL3Bhc3N3b3JkX2tiZF9zeW1ib2xzX3NoaWZ0LnhtbAppbmRleCA0Yjg0ZjRiLi5hOTcyZWIyIDEwMDc1NQotLS0gYS9jb3JlL3Jlcy9yZXMveG1sL3Bhc3N3b3JkX2tiZF9zeW1ib2xzX3NoaWZ0LnhtbAorKysgYi9jb3JlL3Jlcy9yZXMveG1sL3Bhc3N3b3JkX2tiZF9zeW1ib2xzX3NoaWZ0LnhtbApAQCAtMjIsMTAgKzIyLDEwIEBACiAgICAgYW5kcm9pZDprZXlXaWR0aD0iMTAlcCIKICAgICBhbmRyb2lkOmhvcml6b250YWxHYXA9IjBweCIKICAgICBhbmRyb2lkOnZlcnRpY2FsR2FwPSIwcHgiCi0gICAgYW5kcm9pZDprZXlIZWlnaHQ9IkBkaW1lbi9wYXNzd29yZF9rZXlib2FyZF9rZXlfaGVpZ2h0IgorICAgIGFuZHJvaWQ6a2V5SGVpZ2h0PSJAZGltZW4vcGFzc3dvcmRfa2V5Ym9hcmRfa2V5X2hlaWdodF9hbHBoYSIKICAgICA+CiAKLSAgICA8Um93PgorICAgIDxSb3cgYW5kcm9pZDpyb3dFZGdlRmxhZ3M9InRvcCI+CiAgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0ifiIgYW5kcm9pZDprZXlFZGdlRmxhZ3M9ImxlZnQiLz4KICAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJgIi8+CiAgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0ifCIvPgpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfYmFja3NsYXNoLnZjZiBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX2JhY2tzbGFzaC52Y2YKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkMzAwMmIuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfYmFja3NsYXNoLnZjZgorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotQkVHSU46VkNBUkQNCi1WRVJTSU9OOjIuMQ0KLU46O0FcO0JcXDtDXFxcOztEO1w6RTtcXFxcOw0KLUZOOkE7QlxDXDtEOkVcXA0KLUVORDpWQ0FSRA0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX2NvbXBsaWNhdGVkLnZjZiBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX2NvbXBsaWNhdGVkLnZjZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGUzNGUxNi4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV9jb21wbGljYXRlZC52Y2YKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotQkVHSU46VkNBUkQNCi1WRVJTSU9OOjIuMQ0KLU46R3VtcDtGb3JyZXN0O0hvZ2U7UG9zO1Rhbw0KLUZOOkpvZSBEdWUNCi1PUkc6R3VtcCBTaHJpbXAgQ28uO1NhbGVzIERlcHQuXDtNYW5hZ2VyO0Zpc2gga2VlcGVyDQotUk9MRTpGaXNoIENha2UgS2VlcGVyIQ0KLVgtQ0xBU1M6UFVCTElDDQotVElUTEU6U2hyaW1wIE1hbg0KLVRFTDtXT1JLO1ZPSUNFOigxMTEpIDU1NS0xMjEyDQotVEVMO0hPTUU7Vk9JQ0U6KDQwNCkgNTU1LTEyMTINCi1URUw7Q0VMTDowMzExMTExMTExDQotVEVMO1ZJREVPOjAzMjIyMjIyMjINCi1URUw7Vk9JQ0U6MDMzMzMzMzMzMw0KLUFEUjtXT1JLOjs7MTAwIFdhdGVycyBFZGdlO0JheXRvd247TEE7MzAzMTQ7VW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhDQotTEFCRUw7V09SSztFTkNPRElORz1RVU9URUQtUFJJTlRBQkxFOjEwMCBXYXRlcnMgRWRnZT0wRD0wQUJheXRvd24sIExBIDMwMzE0PTBEPTBBVW5pdGVkICBTdGF0ZXMgb2YgQW1lcmljYQ0KLUFEUjtIT01FOjs7NDIgUGxhbnRhdGlvbiBTdC47QmF5dG93bjtMQTszMDMxNDtVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2ENCi1MQUJFTDtIT01FO0VOQ09ESU5HPVFVT1RFRC1QUklOVEFCTEU6NDIgUGxhbnRhdGlvbiBTdC49MEQ9MEE9DQotQmF5dG93biwgTEEgMzAzMTQ9MEQ9MEE9DQotVW5pdGVkICBTdGF0ZXMgb2YgQW1lcmljYQ0KLUVNQUlMO1BSRUY7SU5URVJORVQ6Zm9ycmVzdGd1bXBAd2FsbGFkYWxsYS5jb20NCi1FTUFJTDtDRUxMOmNlbGxAZXhhbXBsZS5jb20NCi1OT1RFOlRoZSBmb2xsb3dpbmcgbm90ZSBpcyB0aGUgZXhhbXBsZSBmcm9tIFJGQyAyMDQ1Lg0KLU5PVEU7RU5DT0RJTkc9UVVPVEVELVBSSU5UQUJMRTpOb3cncyB0aGUgdGltZSA9DQotZm9yIGFsbCBmb2xrIHRvIGNvbWU9DQotIHRvIHRoZSBhaWQgb2YgdGhlaXIgY291bnRyeS4NCi0NCi1QSE9UTztFTkNPRElORz1CQVNFNjQ7VFlQRT1KUEVHOg0KLSAvOWovNFFvUFJYaHBaZ0FBVFUwQUtnQUFBQWdBRFFFT0FBSUFBQUFQQUFBQXFnRVBBQUlBQUFBSEFBQUF1Z0VRQUFJQUFBQUcNCi0gQUFBQXdnRVNBQU1BQUFBQkFBRUFBQUVhQUFVQUFBQUJBQUFBeUFFYkFBVUFBQUFCQUFBQTBBRW9BQU1BQUFBQkFBSUFBQUV4DQotIEFBSUFBQUFPQUFBQTJBRXlBQUlBQUFBVUFBQUE1Z0lUQUFNQUFBQUJBQUVBQUlLWUFBSUFBQUFPQUFBQStvZHBBQVFBQUFBQg0KLSBBQUFCaE1TbEFBY0FBQUI4QUFBQkNBQUFCQjR5TURBNE1UQXlPVEV6TlRVek1RQUFSRzlEYjAxdkFBQkVPVEExYVFBQUFBQkkNCi0gQUFBQUFRQUFBRWdBQUFBQlJEa3dOV2tnVm1WeU1TNHdNQUF5TURBNE9qRXdPakk1SURFek9qVTFPalEzQUNBZ0lDQWdJQ0FnDQotIElDQWdJQ0FBVUhKcGJuUkpUUUF3TXpBd0FBQUFCZ0FCQUJRQUZBQUNBUUFBQUFBREFBQUFOQUVBQlFBQUFBRUJBUUFBQUFFUQ0KLSBnQUFBQUFBQUVRa0FBQ2NRQUFBUEN3QUFKeEFBQUFXWEFBQW5FQUFBQ0xBQUFDY1FBQUFjQVFBQUp4QUFBQUplQUFBbkVBQUENCi0gQUlzQUFDY1FBQUFEeXdBQUp4QUFBQnZsQUFBbkVBQW9ncG9BQlFBQUFBRUFBQU5xZ3AwQUJRQUFBQUVBQUFOeWlDSUFBd0FBDQotIEFBRUFBZ0FBa0FBQUJ3QUFBQVF3TWpJd2tBTUFBZ0FBQUJRQUFBTjZrQVFBQWdBQUFCUUFBQU9Pa1FFQUJ3QUFBQVFCQWdNQQ0KLSBrUUlBQlFBQUFBRUFBQU9pa2dFQUNnQUFBQUVBQUFPcWtnSUFCUUFBQUFFQUFBT3lrZ1FBQ2dBQUFBRUFBQU82a2dVQUJRQUENCi0gQUFFQUFBUENrZ2NBQXdBQUFBRUFBZ0FBa2dnQUF3QUFBQUVBQUFBQWtna0FBd0FBQUFFQUFBQUFrZ29BQlFBQUFBRUFBQVBLDQotIGtud0FCd0FBQUFFQUFBQUFrb1lBQndBQUFCWUFBQVBTb0FBQUJ3QUFBQVF3TVRBd29BRUFBd0FBQUFFQUFRQUFvQUlBQXdBQQ0KLSBBQUVBWUFBQW9BTUFBd0FBQUFFQVNBQUFvQVVBQkFBQUFBRUFBQVFBb2c0QUJRQUFBQUVBQUFQb29nOEFCUUFBQUFFQUFBUHcNCi0gb2hBQUF3QUFBQUVBQWdBQW9oY0FBd0FBQUFFQUFnQUFvd0FBQndBQUFBRURBQUFBb3dFQUJ3QUFBQUVCQUFBQXBBRUFBd0FBDQotIEFBRUFBQUFBcEFJQUF3QUFBQUVBQUFBQXBBTUFBd0FBQUFFQUFBQUFwQVFBQlFBQUFBRUFBQVA0cEFVQUF3QUFBQUVBSFFBQQ0KLSBwQVlBQXdBQUFBRUFBQUFBcEFjQUF3QUFBQUVBQUFBQXBBZ0FBd0FBQUFFQUFBQUFwQWtBQXdBQUFBRUFBQUFBcEFvQUF3QUENCi0gQUFFQUFBQUFwQXdBQXdBQUFBRUFBZ0FBQUFBQUFBQUFBRk1BQUNjUUFBQUJYZ0FBQUdReU1EQTRPakV3T2pJNUlERXpPalUxDQotIE9qTXhBREl3TURnNk1UQTZNamtnTVRNNk5UVTZORGNBQUFBcGlBQUFHd0FBQUFLeUFBQUFaQUFBQVY0QUFBQmtBQUFBQUFBQQ0KLSBBR1FBQUFBbEFBQUFDZ0FBRHBJQUFBUG9BQUFBQUFBQUFBQXlNREE0TVRBeU9URXpOVFV6TVFBQUlDb0FBQUFLQUFBcTRnQUENCi0gQUFvQUFBQUFBQUFBQVFBQ0FBRUFBZ0FBQUFSU09UZ0FBQUlBQndBQUFBUXdNVEF3QUFBQUFBQUdBUU1BQXdBQUFBRUFCZ0FBDQotIEFSb0FCUUFBQUFFQUFBUnNBUnNBQlFBQUFBRUFBQVIwQVNnQUF3QUFBQUVBQWdBQUFnRUFCQUFBQUFFQUFBUjhBZ0lBQkFBQQ0KLSBBQUVBQUFXTEFBQUFBQUFBQUVnQUFBQUJBQUFBU0FBQUFBSC8yUC9iQUlRQUlCWVlIQmdVSUJ3YUhDUWlJQ1l3VURRd0xDd3cNCi0gWWtaS09sQjBabnA0Y21ad2JvQ1F1SnlBaUs2S2JuQ2cycUt1dnNUTzBNNThtdUx5NE1qd3VNck94Z0VpSkNRd0tqQmVORFJlDQotIHhvUndoTWJHeHNiR3hzYkd4c2JHeHNiR3hzYkd4c2JHeHNiR3hzYkd4c2JHeHNiR3hzYkd4c2JHeHNiR3hzYkd4c2JHeHNiRw0KLSAvOEFBRVFnQWVBQ2dBd0VoQUFJUkFRTVJBZi9FQWFJQUFBRUZBUUVCQVFFQkFBQUFBQUFBQUFBQkFnTUVCUVlIQ0FrS0N4QUENCi0gQWdFREF3SUVBd1VGQkFRQUFBRjlBUUlEQUFRUkJSSWhNVUVHRTFGaEJ5SnhGREtCa2FFSUkwS3h3UlZTMGZBa00ySnlnZ2tLDQotIEZoY1lHUm9sSmljb0tTbzBOVFkzT0RrNlEwUkZSa2RJU1VwVFZGVldWMWhaV21Oa1pXWm5hR2xxYzNSMWRuZDRlWHFEaElXRw0KLSBoNGlKaXBLVGxKV1dsNWlabXFLanBLV21wNmlwcXJLenRMVzJ0N2k1dXNMRHhNWEd4OGpKeXRMVDFOWFcxOWpaMnVIaTQrVGwNCi0gNXVmbzZlcng4dlAwOWZiMytQbjZBUUFEQVFFQkFRRUJBUUVCQUFBQUFBQUFBUUlEQkFVR0J3Z0pDZ3NSQUFJQkFnUUVBd1FIDQotIEJRUUVBQUVDZHdBQkFnTVJCQVVoTVFZU1FWRUhZWEVUSWpLQkNCUkNrYUd4d1Frak0xTHdGV0p5MFFvV0pEVGhKZkVYR0JrYQ0KLSBKaWNvS1NvMU5qYzRPVHBEUkVWR1IwaEpTbE5VVlZaWFdGbGFZMlJsWm1kb2FXcHpkSFYyZDNoNWVvS0RoSVdHaDRpSmlwS1QNCi0gbEpXV2w1aVptcUtqcEtXbXA2aXBxckt6dExXMnQ3aTV1c0xEeE1YR3g4akp5dExUMU5YVzE5aloydUxqNU9YbTUranA2dkx6DQotIDlQWDI5L2o1K3YvYUFBd0RBUUFDRVFNUkFEOEFGRlNxS2taSW9xUlZwZ1NLS2VCVEVPQXB3RkFEc1VZcGdJUlNFVUFOSXBwRg0KLSBJQ05oVVRDZ0NNaW8yRklDSmhVTENnQzBvcVZhQUpGRlNxS0JrZ0ZPQXBpSENuQ2dCMktNVUNFTkpRQTBpbUVVREdNS2lZVUENCi0gUnRVYlVnSVdxSmhRQlpTcEZvQWxXcFZvR1BGUEZNUTd0U0syT0RRQTR5S085SG1LZTlGeEF6REhGSU9sQUFhWWFBR05VVFVEDQotIEltcU5xUUVUVkUxQUU2VktLQUpGTlNxYUFIZzA4R21BTklGRlFNNVk1cUpNQnVUNjBaTlFJY3JrVllTUU1LdUxHS2FhYXNReA0KLSBxaWFnWkUxUnRTQWphb21vQWtRMUtwb0FsVTFJcG9Ba1UwN09CVEFyTys1cWtWMTJZNzFsZlVCbWFLa0NSU3V6bnJURmJhMmENCi0gb0N3R3lNMEUxcUlqWTFHeG9HUk5VWk5JQ05xaWFnQnlHcGxOQUVpbXBGTk1CNFlEdlN1Y3B4U1lFSVUwNEthenNBdTFxQXJVDQotIFdFTHRQcFRTcG9zQk5FVHQ1cHhOYW9DTmpVYkdnQ05qVVpvR1J0VVRVZ0ZVMUtwb0FrQnFRSGlnQ0ZuTzdyVXFPZGxacDZnQQ0KLSBjK3RPRG4xcFhBWHpENjBlWWZXbmNRdm1OU0dRMDdnT01oQ1ZFSkd6MXB0Z1M1eUtZeHF3R0UxR3hvQWlhbUdrTWFwcVZUUUINCi0gS3BwK2VLQUlDZm1xV00vS2F6NmdBTk9CcVFGelJtbUF1YVROQUNzZmtxTUhtbTl3SnM4VTBtdFJER05Sc2FBSTJwaHBESTFODQotIFNxYUFKRk5TQThVQ0lTZm1xU00vS2F6NmpBSG1uQTFJQ2cwdWFBRnpTWnBnS3grU21EclRlNEUyZUthVFdvaU1tbU1hQUl6VA0KLSBEU0dSS2FrVTBBU0thZURURVJzZWFralB5bXMrb3hBYWNEVWdPQnBjMGdGelNacGdPWS9LS1l2M3FycUlscHByUUJqR295YUENCi0gR0dtbWtNZ1UxSXBwZ1BCcVFHZ1F1MEduNHd2Rkt3RVFwd05aREhacGMwQUxtaWdSS0JsZWFRS0JXdGdBMDAxUURHcU0wZ0dtDQotIG1Ha01ycWFrQm9BZXBwNE5NUklEVHdhQUUyQTAwOEdva2dIeGpkMXB6S0ZwVzB1QWc1TlNCQlRpcmdPcERXZ0RUVFRRQXcwdw0KLSAwZ0dHbW1nWldCcDRwQVNLYWVEVEVPQnA0TkFEd2FqYnJVeUJFa1hXblNVZEFHcjFxZWlBTVNrTldBaHBob0FhYVlhUUREVFQNCi0gU0dWUlR3YVlEeFR3YUJEd2FlRFFBNEdsSzVvYXVJZW8yMHBHYUxhQUtxZ1U2aEt3QlNHbUFocGhvQWFhWWFReGhwcHBES2dODQotIFBGTUI0cDRvRVBGT0JwZ1BCcDROQWh3cHdvQVdsb0FLU2dCRFRUUU1ZYVlhUURUVFRTR0EvOW4vMndDRUFBb0hCd2dIQmdvSQ0KLSBDQWdMQ2dvTERoZ1FEZzBORGgwVkZoRVlJeDhsSkNJZklpRW1LemN2SmlrMEtTRWlNRUV4TkRrN1BqNCtKUzVFU1VNOFNEYzkNCi0gUGpzQkNnc0xEZzBPSEJBUUhEc29JaWc3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3DQotIE96czdPenM3T3pzN096czdPLy9BQUJFSUFFZ0FZQU1CSVFBQ0VRRURFUUgveEFHaUFBQUJCUUVCQVFFQkFRQUFBQUFBQUFBQQ0KLSBBUUlEQkFVR0J3Z0pDZ3NRQUFJQkF3TUNCQU1GQlFRRUFBQUJmUUVDQXdBRUVRVVNJVEZCQmhOUllRY2ljUlF5Z1pHaENDTkMNCi0gc2NFVlV0SHdKRE5pY29JSkNoWVhHQmthSlNZbktDa3FORFUyTnpnNU9rTkVSVVpIU0VsS1UxUlZWbGRZV1ZwalpHVm1aMmhwDQotIGFuTjBkWFozZUhsNmc0U0Zob2VJaVlxU2s1U1ZscGVZbVpxaW82U2xwcWVvcWFxeXM3UzF0cmU0dWJyQ3c4VEZ4c2ZJeWNyUw0KLSAwOVRWMXRmWTJkcmg0dVBrNWVibjZPbnE4Zkx6OVBYMjkvajUrZ0VBQXdFQkFRRUJBUUVCQVFBQUFBQUFBQUVDQXdRRkJnY0kNCi0gQ1FvTEVRQUNBUUlFQkFNRUJ3VUVCQUFCQW5jQUFRSURFUVFGSVRFR0VrRlJCMkZ4RXlJeWdRZ1VRcEdoc2NFSkl6TlM4QlZpDQotIGN0RUtGaVEwNFNYeEZ4Z1pHaVluS0NrcU5UWTNPRGs2UTBSRlJrZElTVXBUVkZWV1YxaFpXbU5rWldabmFHbHFjM1IxZG5kNA0KLSBlWHFDZzRTRmhvZUlpWXFTazVTVmxwZVltWnFpbzZTbHBxZW9xYXF5czdTMXRyZTR1YnJDdzhURnhzZkl5Y3JTMDlUVjF0ZlkNCi0gMmRyaTQrVGw1dWZvNmVyeTgvVDE5dmY0K2ZyLzJnQU1Bd0VBQWhFREVRQS9BSjdTTGdjVnIyMEk0ck5GR3ZiUUFBSEZhRVVYDQotIFNyUWk1SENNZEtrOG9ZNlZTSll4NGhqcFZhV01lbEFGQzRpR0R4V1BkUjhta3htUmR4akJyRXZJK3Raak4yMHh0SE5iTnFBYw0KLSBVSURYZzZDcjBXS3RDWThYS1FPeXpPQjNGS05Xc3ljZVorbFM2c1k2TmtqdlBTZHdJbUJIVW1teTRxMDc2b0NqT09EV1BkZ2MNCi0gME1wR1BkQVlOWWw0bzVyTmpOS3preW9yWnRYeGloQWExdklEaXA3bTlGcmI3LzRqd0tjbnl4YkV6TjNpZUpwcFpzeVo0VTFIDQotIHVyelphdTRtV1ZsTnJHazBVdVdQVmExWXJvWEVJa0hmclhaaDVXOTBSV25jQUhtc2k2YkpOZFEwWk53M0JyR3VpTUdzMk1rcw0KLSBwdUJ6V3piemRPYUVCZU9wUjJvVXRrazloVHJ1N2l1bzRtOHdnZW1LeXFUaTA0c0JzZmtFZjY4ajhLbFVRWno5by9TdVpSajMNCi0gSllyaUFqaTQvU3A3VzZodGJWMmFYY3U3MHJhbW94bGU0Z043SGNJWGpiaXMrNGs1TmRhYWF1aG1WY3Yxckh1VzYxREdpRzFtDQotIDZjMXMyMC9UbWdBdjV2bWo1N1ZLazMraXhuUGMxeFZWNzBoOUNWSnVPdFNyTDcxaEZneHpTY1Vra24raVkvMnExaTl4RHJHVA0KLSA5eTMxcEo1T3RkMUwrR2hNeTdtVHJXWE8yU2FwalJuMjh2VG10YTNueGptZ0dPdkpkMncxS2t2K2lwei9BQkd1T292ZVlkQ2UNCi0gT2JqclU2eTVybHNBOHljVWtzbitpai9lTmF3NmlKTE5zVzU5elRKbjY4MTZGUDRFSm1iTytTYXo1bTYwMlVqSWdrNEhOYWR2DQotIEx3S2FCbCtNcElNT01pcHA0OTBTQ0plRjdDb3FRdkYySnVScVdRNFlFR3JTaVFKdUtuSHJYQnlNcGtpNzNHRkJOWElvaDluMg0KLSBTcm5uT0s2TVBUYmQzc1N3SVZGMnFNQ3FrekhtdXkxbFlSblRIclZHV3BaYU1LQitCV2xieWNZb1FNMElaRHh6VitHVThjMWENCi0gSVl5NVkrZG5IYXRBc2ZzQUhmQXJtUzFtUG9oMWdUOHg5cXRrMXJRWDd0Q2U1RElhcHpHdEdCUW03MVNscUdXam5JSDZWb3d0DQotIHptaEF5L0UzdlY2RjZ0RU11eGxXSXlBZnJWeENDQU8xVlpFRXlZQTRBQXB4Tkd3eUorbFZKUlVzYUtNdzYxU2xGUXpSQVAvWg0KLQ0KLVgtQVRUUklCVVRFOlNvbWUgU3RyaW5nDQotQkRBWToxOTgwMDEwMQ0KLUdFTzozNS42NTYzODU0LDEzOS42OTk0MjMzDQotVVJMOmh0dHA6Ly93d3cuZXhhbXBsZS5jb20vDQotUkVWOjIwMDgwNDI0VDE5NTI0M1oNCi1FTkQ6VkNBUkQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV9pbnZhbGlkX2NvbW1lbnRfbGluZS52Y2YgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV9pbnZhbGlkX2NvbW1lbnRfbGluZS52Y2YKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5MTA3MTAuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfaW52YWxpZF9jb21tZW50X2xpbmUudmNmCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotQkVHSU46dkNhcmQNCi1WRVJTSU9OOjIuMQ0KLVVJRDozNTcNCi1OOjtDb25mZXJlbmNlIENhbGwNCi1GTjpDb25mZXJlbmNlIENhbGwNCi0jIFRoaXMgbGluZSBtdXN0IGJlIGlnbm9yZWQuDQotTk9URTtFTkNPRElORz1RVU9URUQtUFJJTlRBQkxFOlRoaXMgaXMgYW4gKHNoYXJwIC0+PQ0KLSM8LSBzaGFycCkgZXhhbXBsZS4gVGhpcyBtZXNzYWdlIG11c3QgTk9UIGJlIGlnbm9yZWQuDQotIyBUaGlzIGxpbmUgbXVzdCBiZSBpZ25vcmVkIHRvby4NCi1FTkQ6dkNhcmQNCmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV9qYXBhbmVzZV8xLnZjZiBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX2phcGFuZXNlXzEudmNmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDVlMmZmLi4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX2phcGFuZXNlXzEudmNmCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1CRUdJTjpWQ0FSRA0KLVZFUlNJT046Mi4xDQotTjtDSEFSU0VUPVNISUZUX0pJUzqIwJOhg42DQ4NoOzs7Ow0KLVNPVU5EO1gtSVJNQy1OO0NIQVJTRVQ9U0hJRlRfSklTOrHdxN6z27LE3js7OzsNCi1URUw7UFJFRjtWT0lDRTowMzAwMDAwMDAwDQotRU5EOlZDQVJEDQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfamFwYW5lc2VfMi52Y2YgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV9qYXBhbmVzZV8yLnZjZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmE1NGFjYi4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV9qYXBhbmVzZV8yLnZjZgorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLUJFR0lOOlZDQVJEDQotVkVSU0lPTjoyLjENCi1GTjtDSEFSU0VUPVNISUZUX0pJUzqIwJOhIIONg0ODaCAxDQotTjtDSEFSU0VUPVNISUZUX0pJUzqIwJOhO4ONg0ODaDE7OzsNCi1TT1VORDtYLUlSTUMtTjtDSEFSU0VUPVNISUZUX0pJUzqx3cTeszvbssTeMTs7Ow0KLUFEUjtIT01FO0NIQVJTRVQ9U0hJRlRfSklTO0VOQ09ESU5HPVFVT1RFRC1QUklOVEFCTEU6Oz05Mz04Qz04Qj05RT05Mz03Mz0NCi09OEY9NjE9OTI9NEE9OEI9RTY9OEQ9Rjc9OEI9NzU9OTI9QUMyNi0xPTgzPTVBPTgzPThCPTgzPThBPTgzPTQxPTgzPTkzPQ0KLT04Mz01RT04Mz04Rj04MT01QjY9OEE9NEI7Ozs7MTUwLTg1MTI7DQotTk9URTtDSEFSU0VUPVNISUZUX0pJUztFTkNPRElORz1RVU9URUQtUFJJTlRBQkxFOj04Mz04MT04Mz04Mg0KLUVORDpWQ0FSRA0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX211bHRpcGxlX2VudHJ5LnZjZiBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX211bHRpcGxlX2VudHJ5LnZjZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJiYjE5YS4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV9tdWx0aXBsZV9lbnRyeS52Y2YKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi1CRUdJTjpWQ0FSRA0KLVZFUlNJT046Mi4xDQotTjtDSEFSU0VUPVNISUZUX0pJUzqIwJOhg42DQ4NoMzs7OzsNCi1TT1VORDtYLUlSTUMtTjtDSEFSU0VUPVNISUZUX0pJUzqx3cTes9uyxN4zOzs7Ow0KLVRFTDtYLU5FQy1TRUNSRVQ6OQ0KLVRFTDtYLU5FQy1IT1RFTDoxMA0KLVRFTDtYLU5FQy1TQ0hPT0w6MTENCi1URUw7SE9NRTtGQVg6MTINCi1FTkQ6VkNBUkQNCi0NCi0NCi1CRUdJTjpWQ0FSRA0KLVZFUlNJT046Mi4xDQotTjtDSEFSU0VUPVNISUZUX0pJUzqIwJOhg42DQ4NoNDs7OzsNCi1TT1VORDtYLUlSTUMtTjtDSEFSU0VUPVNISUZUX0pJUzqx3cTes9uyxN40Ozs7Ow0KLVRFTDtNT0RFTToxMw0KLVRFTDtQQUdFUjoxNA0KLVRFTDtYLU5FQy1GQU1JTFk6MTUNCi1URUw7WC1ORUMtR0lSTDoxNg0KLUVORDpWQ0FSRA0KLQ0KLQ0KLUJFR0lOOlZDQVJEDQotVkVSU0lPTjoyLjENCi1OO0NIQVJTRVQ9U0hJRlRfSklTOojAk6GDjYNDg2g1Ozs7Ow0KLVNPVU5EO1gtSVJNQy1OO0NIQVJTRVQ9U0hJRlRfSklTOrHdxN6z27LE3jU7Ozs7DQotVEVMO1gtTkVDLUJPWToxNw0KLVRFTDtYLU5FQy1GUklFTkQ6MTgNCi1URUw7WC1ORUMtUEhTOjE5DQotVEVMO1gtTkVDLVJFU1RBVVJBTlQ6MjANCi1FTkQ6VkNBUkQNCi0NCi0NCmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV9vcmdfYmVmb3JlX3RpdGxlLnZjZiBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX29yZ19iZWZvcmVfdGl0bGUudmNmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmYxMTkwLi4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX29yZ19iZWZvcmVfdGl0bGUudmNmCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1CRUdJTjpWQ0FSRA0KLVZFUlNJT046Mi4xDQotRk46Tm9ybWFsIEd1eQ0KLU9SRzpDb21wYW55O09yZ2FuaXphdGlvbjtEZXZpc2lvbjtSb29tO1NoZWV0IE5vLg0KLVRJVExFOkV4Y2VsbGVudCBKYW5pdG9yDQotRU5EOlZDQVJEDQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfcHJlZl9oYW5kbGluZy52Y2YgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV9wcmVmX2hhbmRsaW5nLnZjZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTEwNTMxMC4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV9wcmVmX2hhbmRsaW5nLnZjZgorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLUJFR0lOOlZDQVJECi1WRVJTSU9OOjIuMQotRk46U21pdGgKLVRFTDtIT01FOjEKLVRFTDtXT1JLO1BSRUY6MgotVEVMO0lTRE46MwotRU1BSUw7UFJFRjtIT01FOnRlc3RAZXhhbXBsZS5jb20KLUVNQUlMO0NFTEw7UFJFRjp0ZXN0MkBleGFtaW5hdGlvbi5jb20KLU9SRzpDb21wYW55Ci1USVRMRTpFbmdpbmVlcgotT1JHOk15c3RlcnkKLVRJVExFOkJsb2dnZXIKLU9SRzpQb2V0cnkKLVRJVExFOlBvZXQKLUVORDpWQ0FSRApkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfc2ltcGxlXzEudmNmIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfc2ltcGxlXzEudmNmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YWFiYjRjLi4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX3NpbXBsZV8xLnZjZgorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotQkVHSU46VkNBUkQNCi1OOkFuZG87Um9pZDsNCi1FTkQ6VkNBUkQNCmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV9zaW1wbGVfMi52Y2YgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV9zaW1wbGVfMi52Y2YKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwZDVhYjUuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfc2ltcGxlXzIudmNmCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1CRUdJTjpWQ0FSRA0KLUZOOkFuZG8gUm9pZA0KLUVORDpWQ0FSRA0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX3NpbXBsZV8zLnZjZiBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX3NpbXBsZV8zLnZjZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVkZGFiYi4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV9zaW1wbGVfMy52Y2YKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLUJFR0lOOlZDQVJEDQotTjpBbmRvO1JvaWQ7DQotRk46QW5kbyBSb2lkDQotRU5EOlZDQVJEDQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfdGl0bGVfYmVmb3JlX29yZy52Y2YgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV90aXRsZV9iZWZvcmVfb3JnLnZjZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWZkYzczOC4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV90aXRsZV9iZWZvcmVfb3JnLnZjZgorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotQkVHSU46VkNBUkQNCi1WRVJTSU9OOjIuMQ0KLUZOOk5pY2UgR3V5DQotVElUTEU6Q29vbCBUaXRsZQ0KLU9SRzpNYXJ2ZXJvdXM7UGVyZmVjdDtHcmVhdDtHb29kO0JhZDtQb29yDQotRU5EOlZDQVJEDQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfd2lubW9fNjUudmNmIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfd2lubW9fNjUudmNmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzgwZDBkLi4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX3dpbm1vXzY1LnZjZgorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLUJFR0lOOlZDQVJEDQotVkVSU0lPTjoyLjENCi1OOkV4YW1wbGU7Ozs7DQotRk46RXhhbXBsZQ0KLUFOTklWRVJTQVJZO1ZBTFVFPURBVEU6MjAwOTEwMTANCi1BR0VOVDpJbnZhbGlkIGxpbmUgd2hpY2ggbXVzdCBiZSBoYW5kbGVkIGNvcnJlY3RseS4NCi1YLUNMQVNTOlBVQkxJQw0KLVgtUkVEVUNUSU9OOg0KLVgtTk86DQotRU5EOlZDQVJEDQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MzBfY29tbWFfc2VwYXJhdGVkLnZjZiBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjMwX2NvbW1hX3NlcGFyYXRlZC52Y2YKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4YTdmMjAuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MzBfY29tbWFfc2VwYXJhdGVkLnZjZgorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotQkVHSU46VkNBUkQNCi1WRVJTSU9OOjMuMA0KLU46RjtHO007Ow0KLVRFTDtUWVBFPVBBR0VSLFdPUkssTVNHOjYxMDEyMzEyMzRAcGFnZXJzYW1wbGUuY29tDQotRU5EOlZDQVJEDQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MzBfbXVsdGlieXRlX3BhcmFtLnZjZiBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjMwX211bHRpYnl0ZV9wYXJhbS52Y2YKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkMjAwZTUuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MzBfbXVsdGlieXRlX3BhcmFtLnZjZgorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotQkVHSU46VkNBUkQNCi1WRVJTSU9OOjMuMA0KLU46RjtHO007Ow0KLVRFTDtUWVBFPSLotLkiOjENCi1FTkQ6VkNBUkQNCmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YzMF9zaW1wbGUudmNmIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MzBfc2ltcGxlLnZjZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDE4NjYxZi4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YzMF9zaW1wbGUudmNmCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotQkVHSU46VkNBUkQNCi1WRVJTSU9OOjMuMA0KLUZOOkFuZCBSb2lkDQotTjpBbmQ7Um9pZDs7Ow0KLU9SRzpPcGVuO0hhbmRzZXQ7IEFsbGlhbmNlDQotU09SVC1TVFJJTkc6YW5kcm9pZA0KLVRFTDtUWVBFPVBSRUY7VFlQRT1WT0lDRTowMzAwMDAwMDAwDQotQ0xBU1M6UFVCTElDDQotWC1HTk86MA0KLVgtR046Z3JvdXAwDQotWC1SRURVQ1RJT046MA0KLVJFVjoyMDA4MTAzMVQwNjU4NTRaDQotRU5EOlZDQVJEDQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvYWNjZXNzaWJpbGl0eXNlcnZpY2UvQWNjZXNzaWJpbGl0eVRlc3RTZXJ2aWNlLmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9hY2Nlc3NpYmlsaXR5c2VydmljZS9BY2Nlc3NpYmlsaXR5VGVzdFNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmE1MWVlYS4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9hY2Nlc3NpYmlsaXR5c2VydmljZS9BY2Nlc3NpYmlsaXR5VGVzdFNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlOwotCi1pbXBvcnQgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5BY2Nlc3NpYmlsaXR5U2VydmljZTsKLWltcG9ydCBhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLkFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbzsKLWltcG9ydCBhbmRyb2lkLmFwcC5Ob3RpZmljYXRpb247Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5RXZlbnQ7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eU1hbmFnZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVGltZXI7Ci1pbXBvcnQgamF2YS51dGlsLlRpbWVyVGFzazsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHRleHQgdGhlIGFjY2Vzc2liaWxpdHkgZnJhbWV3b3JrIGVuZCB0byBlbmQuCi0gKiA8cD4KLSAqIE5vdGU6IFNpbmNlIGFjY2Vzc2liaWxpdHkgaXMgcHJvdmlkZWQgYnkge0BsaW5rIEFjY2Vzc2liaWxpdHlTZXJ2aWNlfXMgd2UgY3JlYXRlIG9uZSwKLSAqIGFuZCBpdCBnZW5lcmF0ZXMgYW4gZXZlbnQgYW5kIGFuIGludGVycnVwdGlvbiBkaXNwYXRjaGluZyB0aGVtIHRocm91Z2ggdGhlCi0gKiB7QGxpbmsgQWNjZXNzaWJpbGl0eU1hbmFnZXJ9LiBXZSB2ZXJpZnkgdGhlIHJlY2VpdmVkIHJlc3VsdC4gVG8gdHJpZ2dlciB0aGUgdGVzdAotICogZ28gdG8gU2V0dGluZ3MtPkFjY2Vzc2liaWxpdHkgYW5kIHNlbGVjdCB0aGUgZW5hYmxlIGFjY2Vzc2liaWxpdHkgY2hlY2sgYW5kIHRoZW4KLSAqIHNlbGVjdCB0aGUgY2hlY2sgZm9yIHRoaXMgc2VydmljZSAoc2FtZSBuYW1lIGFzIHRoZSBjbGFzcykuCi0gKi8KLXB1YmxpYyBjbGFzcyBBY2Nlc3NpYmlsaXR5VGVzdFNlcnZpY2UgZXh0ZW5kcyBBY2Nlc3NpYmlsaXR5U2VydmljZSB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJBY2Nlc3NpYmlsaXR5VGVzdFNlcnZpY2UiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTX05BTUUgPSAiZm9vLmJhci5iYXouVGVzdCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBQ0tBR0VfTkFNRSA9ICJmb28uYmFyLmJheiI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFQgPSAiU29tZSBzdHVmZiI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJFRk9SRV9URVhUID0gIlNvbWUgb3RoZXIgc3R1ZmYiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlRfREVTQ1JJUFRJT04gPSAiQ29udGVudCBkZXNjcmlwdGlvbiI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSVRFTV9DT1VOVCA9IDEwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDVVJSRU5UX0lURU1fSU5ERVggPSAxOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJTlRFUlJVUFRfSU5WT0NBVElPTl9UWVBFID0gMHgwMDAwMDIwMDsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGUk9NX0lOREVYID0gMTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQURERURfQ09VTlQgPSAyOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRU1PVkVEX0NPVU5UID0gMTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOT1RJRklDQVRJT05fVElNRU9VVF9NSUxMSVMgPSA4MDsKLQotICAgIHByaXZhdGUgaW50IG1SZWNlaXZlZFJlc3VsdDsKLQotICAgIHByaXZhdGUgVGltZXIgbVRpbWVyID0gbmV3IFRpbWVyKCk7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblNlcnZpY2VDb25uZWN0ZWQoKSB7Ci0gICAgICAgIEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbyBpbmZvID0gbmV3IEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbygpOwotICAgICAgICBpbmZvLmV2ZW50VHlwZXMgPSBBY2Nlc3NpYmlsaXR5RXZlbnQuVFlQRVNfQUxMX01BU0s7Ci0gICAgICAgIGluZm8uZmVlZGJhY2tUeXBlID0gQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvLkZFRURCQUNLX0FVRElCTEU7Ci0gICAgICAgIGluZm8ubm90aWZpY2F0aW9uVGltZW91dCA9IE5PVElGSUNBVElPTl9USU1FT1VUX01JTExJUzsKLSAgICAgICAgaW5mby5mbGFncyAmPSBBY2Nlc3NpYmlsaXR5U2VydmljZUluZm8uREVGQVVMVDsKLSAgICAgICAgc2V0U2VydmljZUluZm8oaW5mbyk7Ci0KLSAgICAgICAgLy8gd2UgbmVlZCB0byB3YWl0IHVudGlsIHRoZSBzeXN0ZW0gcGlja3Mgb3VyIGNvbmZpZ3VyYXRpb24KLSAgICAgICAgLy8gb3RoZXJ3aXNlIGl0IHdpbGwgbm90IG5vdGlmeSB1cwotICAgICAgICBtVGltZXIuc2NoZWR1bGUobmV3IFRpbWVyVGFzaygpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHRlc3RBY2Nlc3NpYmlsaXR5RXZlbnREaXNwYXRjaGluZygpOwotICAgICAgICAgICAgICAgICAgICB0ZXN0SW50ZXJydXB0KCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIkVycm9yIGluIHRlc3RpbmcgQWNjZXNzaWJpbGl0eSBmZWF0dXJlIiwgZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9LCAxMDAwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVjayBoZXJlIGlmIHRoZSBldmVudCB3ZSByZWNlaXZlZCBpcyBhY3R1YWxseSB0aGUgb25lIHdlIHNlbnQuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25BY2Nlc3NpYmlsaXR5RXZlbnQoQWNjZXNzaWJpbGl0eUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIGFzc2VydChBY2Nlc3NpYmlsaXR5RXZlbnQuVFlQRV9OT1RJRklDQVRJT05fU1RBVEVfQ0hBTkdFRCA9PSBldmVudC5nZXRFdmVudFR5cGUoKSk7Ci0gICAgICAgIGFzc2VydChldmVudCAhPSBudWxsKTsKLSAgICAgICAgYXNzZXJ0KGV2ZW50LmdldEV2ZW50VGltZSgpID4gMCk7Ci0gICAgICAgIGFzc2VydChDTEFTU19OQU1FLmVxdWFscyhldmVudC5nZXRDbGFzc05hbWUoKSkpOwotICAgICAgICBhc3NlcnQoUEFDS0FHRV9OQU1FLmVxdWFscyhldmVudC5nZXRQYWNrYWdlTmFtZSgpKSk7Ci0gICAgICAgIGFzc2VydCgxID09IGV2ZW50LmdldFRleHQoKS5zaXplKCkpOwotICAgICAgICBhc3NlcnQoVEVYVC5lcXVhbHMoZXZlbnQuZ2V0VGV4dCgpLmdldCgwKSkpOwotICAgICAgICBhc3NlcnQoQkVGT1JFX1RFWFQuZXF1YWxzKGV2ZW50LmdldEJlZm9yZVRleHQoKSkpOwotICAgICAgICBhc3NlcnQoZXZlbnQuaXNDaGVja2VkKCkpOwotICAgICAgICBhc3NlcnQoQ09OVEVOVF9ERVNDUklQVElPTi5lcXVhbHMoZXZlbnQuZ2V0Q29udGVudERlc2NyaXB0aW9uKCkpKTsKLSAgICAgICAgYXNzZXJ0KElURU1fQ09VTlQgPT0gZXZlbnQuZ2V0SXRlbUNvdW50KCkpOwotICAgICAgICBhc3NlcnQoQ1VSUkVOVF9JVEVNX0lOREVYID09IGV2ZW50LmdldEN1cnJlbnRJdGVtSW5kZXgoKSk7Ci0gICAgICAgIGFzc2VydChldmVudC5pc0VuYWJsZWQoKSk7Ci0gICAgICAgIGFzc2VydChldmVudC5pc1Bhc3N3b3JkKCkpOwotICAgICAgICBhc3NlcnQoRlJPTV9JTkRFWCA9PSBldmVudC5nZXRGcm9tSW5kZXgoKSk7Ci0gICAgICAgIGFzc2VydChBRERFRF9DT1VOVCA9PSBldmVudC5nZXRBZGRlZENvdW50KCkpOwotICAgICAgICBhc3NlcnQoUkVNT1ZFRF9DT1VOVCA9PSBldmVudC5nZXRSZW1vdmVkQ291bnQoKSk7Ci0gICAgICAgIGFzc2VydChldmVudC5nZXRQYXJjZWxhYmxlRGF0YSgpICE9IG51bGwpOwotICAgICAgICBhc3NlcnQoMSA9PSAoKE5vdGlmaWNhdGlvbikgZXZlbnQuZ2V0UGFyY2VsYWJsZURhdGEoKSkuaWNvbik7Ci0KLSAgICAgICAgLy8gc2V0IHRoZSB0eXBlIG9mIHRoZSByZWNldmVkIHJlcXVlc3QKLSAgICAgICAgbVJlY2VpdmVkUmVzdWx0ID0gQWNjZXNzaWJpbGl0eUV2ZW50LlRZUEVfTk9USUZJQ0FUSU9OX1NUQVRFX0NIQU5HRUQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IGEgZmxhZyB0aGF0IHdlIHJlY2VpdmVkIHRoZSBpbnRlcnJ1cHQgcmVxdWVzdC4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkludGVycnVwdCgpIHsKLQotICAgICAgICAvLyBzZXQgdGhlIHR5cGUgb2YgdGhlIHJlY2V2ZWQgcmVxdWVzdAotICAgICAgICBtUmVjZWl2ZWRSZXN1bHQgPSBJTlRFUlJVUFRfSU5WT0NBVElPTl9UWVBFOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIElmIGFuIHtAbGluayBBY2Nlc3NpYmlsaXR5RXZlbnR9IGlzIHNlbnQgYW5kIHJlY2VpdmVkIGNvcnJlY3RseS4KLSAgICAgKi8KLSAgIHB1YmxpYyB2b2lkIHRlc3RBY2Nlc3NpYmlsaXR5RXZlbnREaXNwYXRjaGluZygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgIEFjY2Vzc2liaWxpdHlFdmVudCBldmVudCA9Ci0gICAgICAgICAgIEFjY2Vzc2liaWxpdHlFdmVudC5vYnRhaW4oQWNjZXNzaWJpbGl0eUV2ZW50LlRZUEVfTk9USUZJQ0FUSU9OX1NUQVRFX0NIQU5HRUQpOwotCi0gICAgICAgYXNzZXJ0KGV2ZW50ICE9IG51bGwpOwotICAgICAgIGV2ZW50LnNldENsYXNzTmFtZShDTEFTU19OQU1FKTsKLSAgICAgICBldmVudC5zZXRQYWNrYWdlTmFtZShQQUNLQUdFX05BTUUpOwotICAgICAgIGV2ZW50LmdldFRleHQoKS5hZGQoVEVYVCk7Ci0gICAgICAgZXZlbnQuc2V0QmVmb3JlVGV4dChCRUZPUkVfVEVYVCk7Ci0gICAgICAgZXZlbnQuc2V0Q2hlY2tlZCh0cnVlKTsKLSAgICAgICBldmVudC5zZXRDb250ZW50RGVzY3JpcHRpb24oQ09OVEVOVF9ERVNDUklQVElPTik7Ci0gICAgICAgZXZlbnQuc2V0SXRlbUNvdW50KElURU1fQ09VTlQpOwotICAgICAgIGV2ZW50LnNldEN1cnJlbnRJdGVtSW5kZXgoQ1VSUkVOVF9JVEVNX0lOREVYKTsKLSAgICAgICBldmVudC5zZXRFbmFibGVkKHRydWUpOwotICAgICAgIGV2ZW50LnNldFBhc3N3b3JkKHRydWUpOwotICAgICAgIGV2ZW50LnNldEZyb21JbmRleChGUk9NX0lOREVYKTsKLSAgICAgICBldmVudC5zZXRBZGRlZENvdW50KEFEREVEX0NPVU5UKTsKLSAgICAgICBldmVudC5zZXRSZW1vdmVkQ291bnQoUkVNT1ZFRF9DT1VOVCk7Ci0gICAgICAgZXZlbnQuc2V0UGFyY2VsYWJsZURhdGEobmV3IE5vdGlmaWNhdGlvbigxLCAiRm9vIiwgMTIzNCkpOwotCi0gICAgICAgQWNjZXNzaWJpbGl0eU1hbmFnZXIuZ2V0SW5zdGFuY2UodGhpcykuc2VuZEFjY2Vzc2liaWxpdHlFdmVudChldmVudCk7Ci0KLSAgICAgICBhc3NlcnQobVJlY2VpdmVkUmVzdWx0ID09IGV2ZW50LmdldEV2ZW50VHlwZSgpKTsKLQotICAgICAgIExvZy5pKExPR19UQUcsICJBY2Nlc3NpYmlsaXR5VGVzdFNlcnZpY2UjdGVzdEFjY2Vzc2liaWxpdHlFdmVudERpc3BhdGNoaW5nOiBTdWNjZXNzIik7Ci0gICB9Ci0KLSAgIC8qKgotICAgICogSWYgYWNjZXNzaWJpbGl0eSBmZWVkYmFjayBpbnRlcnJ1cHRpb24gaXMgdHJpZ2dlcmVkIGFuZCByZWNlaXZlZCBjb3JyZWN0bHkuCi0gICAgKi8KLSAgIHB1YmxpYyB2b2lkIHRlc3RJbnRlcnJ1cHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICBBY2Nlc3NpYmlsaXR5TWFuYWdlci5nZXRJbnN0YW5jZSh0aGlzKS5pbnRlcnJ1cHQoKTsKLQotICAgICAgIGFzc2VydChJTlRFUlJVUFRfSU5WT0NBVElPTl9UWVBFID09IG1SZWNlaXZlZFJlc3VsdCk7Ci0KLSAgICAgICBMb2cuaShMT0dfVEFHLCAiQWNjZXNzaWJpbGl0eVRlc3RTZXJ2aWNlI3Rlc3RJbnRlcnJ1cHQ6IFN1Y2Nlc3MiKTsKLSAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvY29udGVudC9NZW1vcnlGaWxlUHJvdmlkZXIuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2NvbnRlbnQvTWVtb3J5RmlsZVByb3ZpZGVyLmphdmEKaW5kZXggYzRiYzc2Ny4uNzM1MzBkNyAxMDA2NDQKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvY29udGVudC9NZW1vcnlGaWxlUHJvdmlkZXIuamF2YQorKysgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9jb250ZW50L01lbW9yeUZpbGVQcm92aWRlci5qYXZhCkBAIC0xNiwxNiArMTYsMTEgQEAKIAogcGFja2FnZSBhbmRyb2lkLmNvbnRlbnQ7CiAKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5VcmlNYXRjaGVyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQXNzZXRGaWxlRGVzY3JpcHRvcjsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcjsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkRhdGFiYXNlVXRpbHM7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2U7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlT3BlbkhlbHBlcjsKIGltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7Ci1pbXBvcnQgYW5kcm9pZC5vcy5NZW1vcnlGaWxlOwogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3I7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIApAQCAtMTM0LDY0ICsxMjksMzQgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQXNzZXRGaWxlRGVzY3JpcHRvciBvcGVuQXNzZXRGaWxlKFVyaSB1cmwsIFN0cmluZyBtb2RlKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgUGFyY2VsRmlsZURlc2NyaXB0b3Igb3BlbkZpbGUoVXJpIHVybCwgU3RyaW5nIG1vZGUpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24gewogICAgICAgICBpbnQgbWF0Y2ggPSBzVVJMTWF0Y2hlci5tYXRjaCh1cmwpOwogICAgICAgICBzd2l0Y2ggKG1hdGNoKSB7CiAgICAgICAgICAgICBjYXNlIERBVEFfSURfQkxPQjoKICAgICAgICAgICAgICAgICBTdHJpbmcgc3FsID0gIlNFTEVDVCBfYmxvYiBGUk9NIGRhdGEgV0hFUkUgX2lkPSIgKyB1cmwuZ2V0UGF0aFNlZ21lbnRzKCkuZ2V0KDEpOwotICAgICAgICAgICAgICAgIHJldHVybiBnZXRCbG9iQ29sdW1uQXNBc3NldEZpbGUodXJsLCBtb2RlLCBzcWwpOworICAgICAgICAgICAgICAgIHJldHVybiBnZXRCbG9iQ29sdW1uQXNGaWxlKHVybCwgbW9kZSwgc3FsKTsKICAgICAgICAgICAgIGNhc2UgSFVHRToKICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBNZW1vcnlGaWxlIG1lbW9yeUZpbGUgPSBuZXcgTWVtb3J5RmlsZShudWxsLCA1MDAwMDAwKTsKLSAgICAgICAgICAgICAgICAgICAgbWVtb3J5RmlsZS53cml0ZUJ5dGVzKFRFU1RfQkxPQiwgMCwgMTAwMDAwMCwgVEVTVF9CTE9CLmxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgICAgIG1lbW9yeUZpbGUuZGVhY3RpdmF0ZSgpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gQXNzZXRGaWxlRGVzY3JpcHRvci5mcm9tTWVtb3J5RmlsZShtZW1vcnlGaWxlKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFBhcmNlbEZpbGVEZXNjcmlwdG9yLmZyb21EYXRhKFRFU1RfQkxPQiwgbnVsbCk7CiAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbigiRXJyb3IgcmVhZGluZyAiICsgdXJsICsgIjoiICsgZXgudG9TdHJpbmcoKSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgY2FzZSBGSUxFOgogICAgICAgICAgICAgICAgIEZpbGUgZmlsZSA9IGdldENvbnRleHQoKS5nZXRGaWxlU3RyZWFtUGF0aChEQVRBX0ZJTEUpOwotICAgICAgICAgICAgICAgIFBhcmNlbEZpbGVEZXNjcmlwdG9yIGZkID0KLSAgICAgICAgICAgICAgICAgICAgICAgIFBhcmNlbEZpbGVEZXNjcmlwdG9yLm9wZW4oZmlsZSwgUGFyY2VsRmlsZURlc2NyaXB0b3IuTU9ERV9SRUFEX09OTFkpOwotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQXNzZXRGaWxlRGVzY3JpcHRvcihmZCwgMCwgQXNzZXRGaWxlRGVzY3JpcHRvci5VTktOT1dOX0xFTkdUSCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFBhcmNlbEZpbGVEZXNjcmlwdG9yLm9wZW4oZmlsZSwgUGFyY2VsRmlsZURlc2NyaXB0b3IuTU9ERV9SRUFEX09OTFkpOwogICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKCJObyBmaWxlcyBzdXBwb3J0ZWQgYnkgcHJvdmlkZXIgYXQgIiArIHVybCk7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcml2YXRlIEFzc2V0RmlsZURlc2NyaXB0b3IgZ2V0QmxvYkNvbHVtbkFzQXNzZXRGaWxlKFVyaSB1cmwsIFN0cmluZyBtb2RlLCBTdHJpbmcgc3FsKQorICAgIHByaXZhdGUgUGFyY2VsRmlsZURlc2NyaXB0b3IgZ2V0QmxvYkNvbHVtbkFzRmlsZShVcmkgdXJsLCBTdHJpbmcgbW9kZSwgU3RyaW5nIHNxbCkKICAgICAgICAgICAgIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24gewogICAgICAgICBpZiAoISJyIi5lcXVhbHMobW9kZSkpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24oIk1vZGUgIiArIG1vZGUgKyAiIG5vdCBzdXBwb3J0ZWQgZm9yICIgKyB1cmwpOwogICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTUUxpdGVEYXRhYmFzZSBkYiA9IG1PcGVuSGVscGVyLmdldFJlYWRhYmxlRGF0YWJhc2UoKTsKLSAgICAgICAgICAgIE1lbW9yeUZpbGUgZmlsZSA9IHNpbXBsZVF1ZXJ5Rm9yQmxvYk1lbW9yeUZpbGUoZGIsIHNxbCk7Ci0gICAgICAgICAgICBpZiAoZmlsZSA9PSBudWxsKSB0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKCJObyBzdWNoIGVudHJ5OiAiICsgdXJsKTsKLSAgICAgICAgICAgIEFzc2V0RmlsZURlc2NyaXB0b3IgYWZkID0gQXNzZXRGaWxlRGVzY3JpcHRvci5mcm9tTWVtb3J5RmlsZShmaWxlKTsKLSAgICAgICAgICAgIGZpbGUuZGVhY3RpdmF0ZSgpOwotICAgICAgICAgICAgLy8gbmVlZCB0byBkdXAgYW5kIHRoZW4gY2xvc2U/IG9wZW5GaWxlSGVscGVyKCkgZG9lc24ndCBkbyB0aGF0IHRob3VnaAotICAgICAgICAgICAgcmV0dXJuIGFmZDsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24oIkVycm9yIHJlYWRpbmcgIiArIHVybCArICI6IiArIGV4LnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgfQogCi0gICAgcHJpdmF0ZSBNZW1vcnlGaWxlIHNpbXBsZVF1ZXJ5Rm9yQmxvYk1lbW9yeUZpbGUoU1FMaXRlRGF0YWJhc2UgZGIsIFN0cmluZyBzcWwpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIEN1cnNvciBjdXJzb3IgPSBkYi5yYXdRdWVyeShzcWwsIG51bGwpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKCFjdXJzb3IubW92ZVRvRmlyc3QoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnl0ZVtdIGJ5dGVzID0gY3Vyc29yLmdldEJsb2IoMCk7Ci0gICAgICAgICAgICBNZW1vcnlGaWxlIGZpbGUgPSBuZXcgTWVtb3J5RmlsZShudWxsLCBieXRlcy5sZW5ndGgpOwotICAgICAgICAgICAgZmlsZS53cml0ZUJ5dGVzKGJ5dGVzLCAwLCAwLCBieXRlcy5sZW5ndGgpOwotICAgICAgICAgICAgcmV0dXJuIGZpbGU7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoY3Vyc29yICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjdXJzb3IuY2xvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgICAgICBTUUxpdGVEYXRhYmFzZSBkYiA9IG1PcGVuSGVscGVyLmdldFJlYWRhYmxlRGF0YWJhc2UoKTsKKyAgICAgICAgcmV0dXJuIERhdGFiYXNlVXRpbHMuYmxvYkZpbGVEZXNjcmlwdG9yRm9yUXVlcnkoZGIsIHNxbCwgbnVsbCk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9jb250ZW50L01lbW9yeUZpbGVQcm92aWRlclRlc3QuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2NvbnRlbnQvTWVtb3J5RmlsZVByb3ZpZGVyVGVzdC5qYXZhCmluZGV4IDYyYjRlN2UuLmJiZTdjMTAgMTAwNjQ0Ci0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2NvbnRlbnQvTWVtb3J5RmlsZVByb3ZpZGVyVGVzdC5qYXZhCisrKyBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2NvbnRlbnQvTWVtb3J5RmlsZVByb3ZpZGVyVGVzdC5qYXZhCkBAIC01Niw3ICs1Niw2IEBACiAgICAgICAgICAgICBVcmkgdXJpID0gVXJpLnBhcnNlKCJjb250ZW50Oi8vYW5kcm9pZC5jb250ZW50Lk1lbW9yeUZpbGVQcm92aWRlci9odWdlIik7CiAgICAgICAgICAgICBJbnB1dFN0cmVhbSBpbiA9IHJlc29sdmVyLm9wZW5JbnB1dFN0cmVhbSh1cmkpOwogICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCgiRmFpbGVkIHRvIG9wZW4gc3RyZWFtIG51bWJlciAiICsgaSwgaW4pOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEwMDAwMDAsIGluLnNraXAoMTAwMDAwMCkpOwogICAgICAgICAgICAgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlW01lbW9yeUZpbGVQcm92aWRlci5URVNUX0JMT0IubGVuZ3RoXTsKICAgICAgICAgICAgIGludCBjb3VudCA9IGluLnJlYWQoYnVmKTsKICAgICAgICAgICAgIGFzc2VydEVxdWFscyhidWYubGVuZ3RoLCBjb3VudCk7CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9kYXRhYmFzZS9EYXRhYmFzZUN1cnNvclRlc3QuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2RhdGFiYXNlL0RhdGFiYXNlQ3Vyc29yVGVzdC5qYXZhCmluZGV4IGZiNWEzNmYuLjA3MzMyMjkgMTAwNjQ0Ci0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2RhdGFiYXNlL0RhdGFiYXNlQ3Vyc29yVGVzdC5qYXZhCisrKyBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2RhdGFiYXNlL0RhdGFiYXNlQ3Vyc29yVGVzdC5qYXZhCkBAIC0zMyw3ICszMyw2IEBACiBpbXBvcnQgYW5kcm9pZC50ZXN0LlBlcmZvcm1hbmNlVGVzdENhc2U7CiBpbXBvcnQgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5hbm5vdGF0aW9uLkxhcmdlVGVzdDsKIGltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uTWVkaXVtVGVzdDsKLWltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uU21hbGxUZXN0OwogaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5TdXBwcmVzczsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCkBAIC00MSw4ICs0MCw2IEBACiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIGltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOwogCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCiBwdWJsaWMgY2xhc3MgRGF0YWJhc2VDdXJzb3JUZXN0IGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlIGltcGxlbWVudHMgUGVyZm9ybWFuY2VUZXN0Q2FzZSB7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgc1N0cmluZzEgPSAidGhpcyBpcyBhIHRlc3QiOwpAQCAtOTIsNDMgKzg5LDYgQEAKICAgICB9CiAKICAgICBATWVkaXVtVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RDdXJzb3JVcGRhdGUoKSB7Ci0gICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKAotICAgICAgICAgICAgIkNSRUFURSBUQUJMRSB0ZXN0IChfaWQgSU5URUdFUiBQUklNQVJZIEtFWSwgZCBJTlRFR0VSLCBzIElOVEVHRVIpOyIpOwotICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgMjA7IGkrKykgewotICAgICAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoIklOU0VSVCBJTlRPIHRlc3QgKGQsIHMpIFZBTFVFUyAoIiArIGkgKyAKLSAgICAgICAgICAgICAgICAiLCIgKyBpJTIgKyAiKTsiKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgQ3Vyc29yIGMgPSBtRGF0YWJhc2UucXVlcnkoInRlc3QiLCBudWxsLCAicyA9IDAiLCBudWxsLCBudWxsLCBudWxsLCBudWxsKTsKLSAgICAgICAgaW50IGRDb2wgPSBjLmdldENvbHVtbkluZGV4T3JUaHJvdygiZCIpOwotICAgICAgICBpbnQgc0NvbCA9IGMuZ2V0Q29sdW1uSW5kZXhPclRocm93KCJzIik7Ci0gICAgICAgIAotICAgICAgICBpbnQgY291bnQgPSAwOwotICAgICAgICB3aGlsZSAoYy5tb3ZlVG9OZXh0KCkpIHsKLSAgICAgICAgICAgIGFzc2VydFRydWUoYy51cGRhdGVJbnQoZENvbCwgMykpOwotICAgICAgICAgICAgY291bnQrKzsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRFcXVhbHMoMTAsIGNvdW50KTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydFRydWUoYy5jb21taXRVcGRhdGVzKCkpOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0VHJ1ZShjLnJlcXVlcnkoKSk7Ci0gICAgICAgIAotICAgICAgICBjb3VudCA9IDA7Ci0gICAgICAgIHdoaWxlIChjLm1vdmVUb05leHQoKSkgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIGMuZ2V0SW50KGRDb2wpKTsKLSAgICAgICAgICAgIGNvdW50Kys7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGFzc2VydEVxdWFscygxMCwgY291bnQpOwotICAgICAgICBhc3NlcnRUcnVlKGMubW92ZVRvRmlyc3QoKSk7Ci0gICAgICAgIGFzc2VydFRydWUoYy5kZWxldGVSb3coKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyg5LCBjLmdldENvdW50KCkpOwotICAgICAgICBjLmNsb3NlKCk7Ci0gICAgfQotICAgIAotICAgIEBNZWRpdW1UZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEJsb2IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgLy8gY3JlYXRlIHRhYmxlCiAgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKApAQCAtMTY0LDI0ICsxMjQsNyBAQAogICAgICAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoYmxvYiwgY0Jsb2IpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKHMsIGMuZ2V0U3RyaW5nKHNDb2wpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKChkb3VibGUpZCwgYy5nZXREb3VibGUoZENvbCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoKGxvbmcpbCwgYy5nZXRMb25nKGxDb2wpKTsKLSAgICAgICAgCi0gICAgICAgIC8vIG5ldyBieXRlW10KLSAgICAgICAgYnl0ZVtdIG5ld2Jsb2IgPSBuZXcgYnl0ZVsxMDAwXTsKLSAgICAgICAgdmFsdWUgPSA5ODsKLSAgICAgICAgQXJyYXlzLmZpbGwoYmxvYiwgdmFsdWUpOyAgICAgICAgCi0gICAgICAgIAotICAgICAgICBjLnVwZGF0ZUJsb2IoYkNvbCwgbmV3YmxvYik7Ci0gICAgICAgIGNCbG9iID0gIGMuZ2V0QmxvYihiQ29sKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ld2Jsb2IsIGNCbG9iKSk7Ci0gICAgICAgIAotICAgICAgICAvLyBjb21taXQKLSAgICAgICAgYXNzZXJ0VHJ1ZShjLmNvbW1pdFVwZGF0ZXMoKSk7Ci0gICAgICAgIGFzc2VydFRydWUoYy5yZXF1ZXJ5KCkpOwotICAgICAgICBjLm1vdmVUb05leHQoKTsKLSAgICAgICAgY0Jsb2IgPSAgYy5nZXRCbG9iKGJDb2wpOwotICAgICAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3YmxvYiwgY0Jsb2IpKTsgICAgICAgIAotICAgICAgICBjLmNsb3NlKCk7CisgICAgICAgIGFzc2VydEVxdWFscygobG9uZylsLCBjLmdldExvbmcobENvbCkpOyAgICAgICAgCiAgICAgfQogICAgIAogICAgIEBNZWRpdW1UZXN0CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9kYXRhYmFzZS9EYXRhYmFzZUdlbmVyYWxUZXN0LmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9kYXRhYmFzZS9EYXRhYmFzZUdlbmVyYWxUZXN0LmphdmEKaW5kZXggNjU2MDI5ZC4uY2QzOGJmMDcgMTAwNjQ0Ci0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2RhdGFiYXNlL0RhdGFiYXNlR2VuZXJhbFRlc3QuamF2YQorKysgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9kYXRhYmFzZS9EYXRhYmFzZUdlbmVyYWxUZXN0LmphdmEKQEAgLTIxLDE4ICsyMSwyMSBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlOwotaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZVN0YXRlbWVudDsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsOwogaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7CiBpbXBvcnQgYW5kcm9pZC50ZXN0LlBlcmZvcm1hbmNlVGVzdENhc2U7CitpbXBvcnQgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5hbm5vdGF0aW9uLkxhcmdlVGVzdDsKIGltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uTWVkaXVtVGVzdDsKIGltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uU21hbGxUZXN0OwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC51dGlsLlBhaXI7CiAKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0OwogCiBpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIGltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwogCkBAIC0zODIsNTQgKzM4NSwyOCBAQAogCiAgICAgQE1lZGl1bVRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2NoZW1hQ2hhbmdlMigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTUUxpdGVEYXRhYmFzZSBkYjEgPSBtRGF0YWJhc2U7Ci0gICAgICAgIFNRTGl0ZURhdGFiYXNlIGRiMiA9IFNRTGl0ZURhdGFiYXNlLm9wZW5PckNyZWF0ZURhdGFiYXNlKG1EYXRhYmFzZUZpbGUsIG51bGwpOwotICAgICAgICBDdXJzb3IgY3Vyc29yOwotCi0gICAgICAgIGRiMS5leGVjU1FMKCJDUkVBVEUgVEFCTEUgZGIxIChfaWQgSU5URUdFUiBQUklNQVJZIEtFWSwgZGF0YSBURVhUKTsiKTsKLQotICAgICAgICBjdXJzb3IgPSBkYjEucXVlcnkoImRiMSIsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwpOwotICAgICAgICBhc3NlcnROb3ROdWxsKCJDdXJzb3IgaXMgbnVsbCIsIGN1cnNvcik7CisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJDUkVBVEUgVEFCTEUgZGIxIChfaWQgSU5URUdFUiBQUklNQVJZIEtFWSwgZGF0YSBURVhUKTsiKTsKKyAgICAgICAgQ3Vyc29yIGN1cnNvciA9IG1EYXRhYmFzZS5xdWVyeSgiZGIxIiwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7CisgICAgICAgIGFzc2VydE5vdE51bGwoY3Vyc29yKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGN1cnNvci5nZXRDb3VudCgpKTsKLSAgICAgICAgY3Vyc29yLmRlYWN0aXZhdGUoKTsKLSAgICAgICAgLy8gdGhpcyBjYXVzZSBleGNlcHRpb24gYmVjYXVzZSB3ZSdyZSBzdGlsbCB1c2luZyBzcWxpdGVfcHJlcGF0ZTE2IGFuZCBub3QKLSAgICAgICAgLy8gc3FsaXRlX3ByZXBhcmUxNl92Mi4gVGhlIHYyIHZhcmlhbnQgYWRkZWQgdGhlIGFiaWxpdHkgdG8gY2hlY2sgdGhlCi0gICAgICAgIC8vIHNjaGVtYSB2ZXJzaW9uIGFuZCBoYW5kbGUgdGhlIGNhc2Ugd2hlbiB0aGUgc2NoZW1hIGhhcyBjaGFuZ2VkCi0gICAgICAgIC8vIE1hcmNvIE5lbGlzc2VuIGNsYWltIGl0IHdhcyAyeCBzbG93ZXIgdG8gY29tcGlsZSBTUUwgc3RhdGVtZW50cyBzbwotICAgICAgICAvLyBJIHJldmVydGVkIGJhY2sgdG8gdGhlIHYxIHZhcmlhbnQuCi0gICAgICAgIC8qIGRiMi5leGVjU1FMKCJDUkVBVEUgVEFCTEUgZGIyIChfaWQgSU5URUdFUiBQUklNQVJZIEtFWSwgZGF0YSBURVhUKTsiKTsKLQotICAgICAgICBjdXJzb3IgPSBkYjEucXVlcnkoImRiMSIsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwpOwotICAgICAgICBhc3NlcnROb3ROdWxsKCJDdXJzb3IgaXMgbnVsbCIsIGN1cnNvcik7Ci0gICAgICAgIGFzc2VydEVxdWFscygwLCBjdXJzb3IuY291bnQoKSk7Ci0gICAgICAgIGN1cnNvci5kZWFjdGl2YXRlKCk7Ci0gICAgICAgICovCisgICAgICAgIGN1cnNvci5jbG9zZSgpOwogICAgIH0KIAogICAgIEBNZWRpdW1UZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFNjaGVtYUNoYW5nZTMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU1FMaXRlRGF0YWJhc2UgZGIxID0gbURhdGFiYXNlOwotICAgICAgICBTUUxpdGVEYXRhYmFzZSBkYjIgPSBTUUxpdGVEYXRhYmFzZS5vcGVuT3JDcmVhdGVEYXRhYmFzZShtRGF0YWJhc2VGaWxlLCBudWxsKTsKLSAgICAgICAgQ3Vyc29yIGN1cnNvcjsKLQotCi0gICAgICAgIGRiMS5leGVjU1FMKCJDUkVBVEUgVEFCTEUgZGIxIChfaWQgSU5URUdFUiBQUklNQVJZIEtFWSwgZGF0YSBURVhUKTsiKTsKLSAgICAgICAgZGIxLmV4ZWNTUUwoIklOU0VSVCBJTlRPIGRiMSAoZGF0YSkgVkFMVUVTICgndGVzdCcpOyIpOwotCi0gICAgICAgIGN1cnNvciA9IGRiMS5xdWVyeSgiZGIxIiwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0gICAgICAgIC8vIHRoaXMgY2F1c2UgZXhjZXB0aW9uIGJlY2F1c2Ugd2UncmUgc3RpbGwgdXNpbmcgc3FsaXRlX3ByZXBhdGUxNiBhbmQgbm90Ci0gICAgICAgIC8vIHNxbGl0ZV9wcmVwYXJlMTZfdjIuIFRoZSB2MiB2YXJpYW50IGFkZGVkIHRoZSBhYmlsaXR5IHRvIGNoZWNrIHRoZQotICAgICAgICAvLyBzY2hlbWEgdmVyc2lvbiBhbmQgaGFuZGxlIHRoZSBjYXNlIHdoZW4gdGhlIHNjaGVtYSBoYXMgY2hhbmdlZAotICAgICAgICAvLyBNYXJjbyBOZWxpc3NlbiBjbGFpbSBpdCB3YXMgMnggc2xvd2VyIHRvIGNvbXBpbGUgU1FMIHN0YXRlbWVudHMgc28KLSAgICAgICAgLy8gSSByZXZlcnRlZCBiYWNrIHRvIHRoZSB2MSB2YXJpYW50LgotICAgICAgICAvKiBkYjIuZXhlY1NRTCgiQ1JFQVRFIFRBQkxFIGRiMiAoX2lkIElOVEVHRVIgUFJJTUFSWSBLRVksIGRhdGEgVEVYVCk7Iik7Ci0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbCgiQ3Vyc29yIGlzIG51bGwiLCBjdXJzb3IpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgY3Vyc29yLmNvdW50KCkpOwotICAgICAgICBhc3NlcnRUcnVlKGN1cnNvci5maXJzdCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXN0IiwgY3Vyc29yLmdldFN0cmluZyhjdXJzb3IuZ2V0Q29sdW1uSW5kZXhPclRocm93KCJkYXRhIikpKTsKLSAgICAgICAgY3Vyc29yLmRlYWN0aXZhdGUoKTsKLSAgICAgICAgKi8KKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoIkNSRUFURSBUQUJMRSBkYjEgKF9pZCBJTlRFR0VSIFBSSU1BUlkgS0VZLCBkYXRhIFRFWFQpOyIpOworICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiSU5TRVJUIElOVE8gZGIxIChkYXRhKSBWQUxVRVMgKCd0ZXN0Jyk7Iik7CisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJBTFRFUiBUQUJMRSBkYjEgQUREIENPTFVNTiBibGFoIGludDsiKTsKKyAgICAgICAgQ3Vyc29yIGMgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYyA9IG1EYXRhYmFzZS5yYXdRdWVyeSgic2VsZWN0IGJsYWggZnJvbSBkYjEiLCBudWxsKTsKKyAgICAgICAgfSBjYXRjaCAoU1FMaXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoInVuZXhwZWN0ZWQgZXhjZXB0aW9uOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKGMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGMuY2xvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgIH0KIAogICAgIHByaXZhdGUgY2xhc3MgQ2hhbmdlT2JzZXJ2ZXIgZXh0ZW5kcyBDb250ZW50T2JzZXJ2ZXIgewpAQCAtNDY3LDQ1ICs0NDQsNiBAQAogICAgIH0KIAogICAgIEBNZWRpdW1UZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdE5vdGlmaWNhdGlvblRlc3QxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8qCi0gICAgICAgIEN1cnNvciBjID0gbUNvbnRlbnRSZXNvbHZlci5xdWVyeShOb3Rlcy5DT05URU5UX1VSSSwKLSAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10ge05vdGVzLl9JRCwgTm90ZXMuTk9URX0sCi0gICAgICAgICAgICAgICAgbnVsbCwgbnVsbCk7Ci0gICAgICAgIGMucmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIobmV3IE15Q29udGVudE9ic2VydmVyKHRydWUpKTsKLSAgICAgICAgaW50IGNvdW50ID0gYy5jb3VudCgpOwotCi0gICAgICAgIE15Q29udGVudE9ic2VydmVyIG9ic2VydmVyID0gbmV3IE15Q29udGVudE9ic2VydmVyKGZhbHNlKTsKLSAgICAgICAgbUNvbnRlbnRSZXNvbHZlci5yZWdpc3RlckNvbnRlbnRPYnNlcnZlcihOb3Rlcy5DT05URU5UX1VSSSwgdHJ1ZSwgb2JzZXJ2ZXIpOwotCi0gICAgICAgIFVyaSB1cmk7Ci0KLSAgICAgICAgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gdmFsdWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0gICAgICAgIHZhbHVlcy5wdXQoTm90ZXMuTk9URSwgInRlc3Qgbm90ZTEiKTsKLSAgICAgICAgdXJpID0gbUNvbnRlbnRSZXNvbHZlci5pbnNlcnQoTm90ZXMuQ09OVEVOVF9VUkksIHZhbHVlcyk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBtQ3Vyc29yTm90aWZpY2F0aW9uQ291bnQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbU5vdGlmaWNhdGlvbkNvdW50KTsKLQotICAgICAgICBjLnJlcXVlcnkoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGNvdW50ICsgMSwgYy5jb3VudCgpKTsKLSAgICAgICAgYy5maXJzdCgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInRlc3Qgbm90ZTEiLCBjLmdldFN0cmluZyhjLmdldENvbHVtbkluZGV4KE5vdGVzLk5PVEUpKSk7Ci0gICAgICAgIGMudXBkYXRlU3RyaW5nKGMuZ2V0Q29sdW1uSW5kZXgoTm90ZXMuTk9URSksICJ0ZXN0IG5vdGUyIik7Ci0gICAgICAgIGMuY29tbWl0VXBkYXRlcygpOwotCi0gICAgICAgIGFzc2VydEVxdWFscygyLCBtQ3Vyc29yTm90aWZpY2F0aW9uQ291bnQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMiwgbU5vdGlmaWNhdGlvbkNvdW50KTsKLQotICAgICAgICBtQ29udGVudFJlc29sdmVyLmRlbGV0ZSh1cmksIG51bGwpOwotCi0gICAgICAgIGFzc2VydEVxdWFscygzLCBtQ3Vyc29yTm90aWZpY2F0aW9uQ291bnQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMywgbU5vdGlmaWNhdGlvbkNvdW50KTsKLQotICAgICAgICBtQ29udGVudFJlc29sdmVyLnVucmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIob2JzZXJ2ZXIpOwotICAgICAgICAqLwotICAgIH0KLQotICAgIEBNZWRpdW1UZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFNlbGVjdGlvbkFyZ3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoIkNSRUFURSBUQUJMRSB0ZXN0IChfaWQgSU5URUdFUiBQUklNQVJZIEtFWSwgZGF0YSBURVhUKTsiKTsKICAgICAgICAgQ29udGVudFZhbHVlcyB2YWx1ZXMgPSBuZXcgQ29udGVudFZhbHVlcygxKTsKQEAgLTk4OSwyMSArOTI3LDYgQEAKICAgICB9CiAKICAgICBATWVkaXVtVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3REYkNsb3NlUmVsZWFzaW5nQWxsQ2FjaGVkU3FsKCkgewotICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiQ1JFQVRFIFRBQkxFIHRlc3QgKF9pZCBJTlRFR0VSIFBSSU1BUlkgS0VZLCB0ZXh0MSBURVhULCB0ZXh0MiBURVhULCAiICsKLSAgICAgICAgICAgICAgICAibnVtMSBJTlRFR0VSLCBudW0yIElOVEVHRVIsIGltYWdlIEJMT0IpOyIpOwotICAgICAgICBmaW5hbCBTdHJpbmcgc3RhdGVtZW50ID0gIkRFTEVURSBGUk9NIHRlc3QgV0hFUkUgX2lkPT87IjsKLSAgICAgICAgU1FMaXRlU3RhdGVtZW50IHN0YXRlbWVudERvTm90Q2xvc2UgPSBtRGF0YWJhc2UuY29tcGlsZVN0YXRlbWVudChzdGF0ZW1lbnQpOwotICAgICAgICBhc3NlcnRUcnVlKHN0YXRlbWVudERvTm90Q2xvc2UuZ2V0VW5pcXVlSWQoKSA+IDApOwotICAgICAgICBpbnQgblN0YXRlbWVudCA9IHN0YXRlbWVudERvTm90Q2xvc2UuZ2V0VW5pcXVlSWQoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShzdGF0ZW1lbnREb05vdENsb3NlLmdldFVuaXF1ZUlkKCkgPT0gblN0YXRlbWVudCk7Ci0gICAgICAgIC8qIGRvIG5vdCBjbG9zZSBzdGF0ZW1lbnREb05vdENsb3NlIG9iamVjdC4gCi0gICAgICAgICAqIFRoYXQgc2hvdWxkIGxlYXZlIGl0IGluIFNRTGl0ZURhdGFiYXNlLm1Qcm9ncmFtcy4KLSAgICAgICAgICogbURhdGFiYXNlLmNsb3NlKCkgaW4gdGVhckRvd24oKSBzaG91bGQgcmVsZWFzZSBpdC4KLSAgICAgICAgICovCi0gICAgfQotCi0gICAgQE1lZGl1bVRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2VtaWNvbG9uc0luU3RhdGVtZW50cygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiQ1JFQVRFIFRBQkxFIHByYWdtYV90ZXN0ICgiICsKICAgICAgICAgICAgICAgICAiaSBJTlRFR0VSIERFRkFVTFQgMTIzNCwgIiArCkBAIC0xMDIzLDYgKzk0NiwzNCBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgQE1lZGl1bVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VW5pb25zV2l0aEJpbmRBcmdzKCkgeworICAgICAgICAvKiBtYWtlIHN1cmUgdW5pb25zIHdpdGggYmluZGFyZ3Mgd29yayBodHRwOi8vYi9pc3N1ZT9pZD0xMDYxMjkxICovCisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJDUkVBVEUgVEFCTEUgQSAoaSBpbnQpOyIpOworICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiY3JlYXRlIHRhYmxlIEIgKGsgaW50KTsiKTsKKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoImNyZWF0ZSB0YWJsZSBDIChuIGludCk7Iik7CisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJpbnNlcnQgaW50byBBIHZhbHVlcygxKTsiKTsKKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoImluc2VydCBpbnRvIEEgdmFsdWVzKDIpOyIpOworICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiaW5zZXJ0IGludG8gQSB2YWx1ZXMoMyk7Iik7CisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJpbnNlcnQgaW50byBCIHZhbHVlcygyMDEpOyIpOworICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiaW5zZXJ0IGludG8gQiB2YWx1ZXMoMjAyKTsiKTsKKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoImluc2VydCBpbnRvIEIgdmFsdWVzKDIwMyk7Iik7CisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJpbnNlcnQgaW50byBDIHZhbHVlcyg5MDEpOyIpOworICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiaW5zZXJ0IGludG8gQyB2YWx1ZXMoOTAyKTsiKTsKKyAgICAgICAgU3RyaW5nIHMgPSAic2VsZWN0IGkgZnJvbSBBIHdoZXJlIGkgPiAyICIgKworICAgICAgICAgICAgICAgICJVTklPTiBzZWxlY3QgayBmcm9tIEIgd2hlcmUgayA+IDIwMSAiICsKKyAgICAgICAgICAgICAgICAiVU5JT04gc2VsZWN0IG4gZnJvbSBDIHdoZXJlIG4gIT05MDA7IjsKKyAgICAgICAgQ3Vyc29yIGMgPSBtRGF0YWJhc2UucmF3UXVlcnkocywgbnVsbCk7CisgICAgICAgIGludCBuID0gYy5nZXRDb3VudCgpOworICAgICAgICBjLmNsb3NlKCk7CisgICAgICAgIFN0cmluZyBzMSA9ICJzZWxlY3QgaSBmcm9tIEEgd2hlcmUgaSA+ID8gIiArCisgICAgICAgICAgICAgICAgIlVOSU9OIHNlbGVjdCBrIGZyb20gQiB3aGVyZSBrID4gPyAiICsKKyAgICAgICAgICAgICAgICAiVU5JT04gc2VsZWN0IG4gZnJvbSBDIHdoZXJlIG4gIT0gPzsiOworICAgICAgICBDdXJzb3IgYzEgPSBtRGF0YWJhc2UucmF3UXVlcnkoczEsIG5ldyBTdHJpbmdbXXsiMiIsICIyMDEiLCAiOTAwIn0pOworICAgICAgICBhc3NlcnRFcXVhbHMobiwgYzEuZ2V0Q291bnQoKSk7CisgICAgICAgIGMxLmNsb3NlKCk7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogVGhpcyB0ZXN0IGlzIGF2YWlsYWJsZSBvbmx5IHdoZW4gdGhlIHBsYXRmb3JtIGhhcyBhIGxvY2FsZSB3aXRoIHRoZSBsYW5ndWFnZSAiamEiLgogICAgICAqIEl0IGZpbmlzaGVzIHdpdGhvdXQgZmFpbHVyZSB3aGVuIGl0IGlzIG5vdCBhdmFpbGFibGUuICAKQEAgLTExMDgsNSArMTA1OSwxMTMgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICB9ICAgIAorICAgIH0KKworICAgIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0TWF4Q2FoZXNpemUoKSB7CisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJDUkVBVEUgVEFCTEUgdGVzdCAoaSBpbnQsIGogaW50KTsiKTsKKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoImluc2VydCBpbnRvIHRlc3QgdmFsdWVzKDEsMSk7Iik7CisgICAgICAgIC8vIHNldCBjYWNoZSBzaXplCisgICAgICAgIGludCBOID0gU1FMaXRlRGF0YWJhc2UuTUFYX1NRTF9DQUNIRV9TSVpFOworICAgICAgICBtRGF0YWJhc2Uuc2V0TWF4U3FsQ2FjaGVTaXplKE4pOworCisgICAgICAgIC8vIHRyeSByZWR1Y2UgY2FjaGVzaXplCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtRGF0YWJhc2Uuc2V0TWF4U3FsQ2FjaGVTaXplKDEpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShlLmdldE1lc3NhZ2UoKS5jb250YWlucygiY2Fubm90IHNldCBjYWNoZVNpemUgdG8gYSB2YWx1ZSBsZXNzIHRoYW4iKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBATGFyZ2VUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERlZmF1bHREYXRhYmFzZUVycm9ySGFuZGxlcigpIHsKKyAgICAgICAgRGVmYXVsdERhdGFiYXNlRXJyb3JIYW5kbGVyIGVycm9ySGFuZGxlciA9IG5ldyBEZWZhdWx0RGF0YWJhc2VFcnJvckhhbmRsZXIoKTsKKworICAgICAgICAvLyBjbG9zZSB0aGUgZGF0YWJhc2UuIGFuZCBjYWxsIGNvcnJ1cHRpb24gaGFuZGxlci4KKyAgICAgICAgLy8gaXQgc2hvdWxkIGRlbGV0ZSB0aGUgZGF0YWJhc2UgZmlsZS4KKyAgICAgICAgRmlsZSBkYmZpbGUgPSBuZXcgRmlsZShtRGF0YWJhc2UuZ2V0UGF0aCgpKTsKKyAgICAgICAgbURhdGFiYXNlLmNsb3NlKCk7CisgICAgICAgIGFzc2VydEZhbHNlKG1EYXRhYmFzZS5pc09wZW4oKSk7CisgICAgICAgIGFzc2VydFRydWUoZGJmaWxlLmV4aXN0cygpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGVycm9ySGFuZGxlci5vbkNvcnJ1cHRpb24obURhdGFiYXNlKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKGRiZmlsZS5leGlzdHMoKSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJ1bmV4cGVjdGVkIik7CisgICAgICAgIH0KKworICAgICAgICAvLyBjcmVhdGUgYW4gaW4tbWVtb3J5IGRhdGFiYXNlLiBhbmQgY29ycnVwdGlvbiBoYW5kbGVyIHNob3VsZG4ndCB0cnkgdG8gZGVsZXRlIGl0CisgICAgICAgIFNRTGl0ZURhdGFiYXNlIG1lbW9yeURiID0gU1FMaXRlRGF0YWJhc2Uub3Blbk9yQ3JlYXRlRGF0YWJhc2UoIjptZW1vcnk6IiwgbnVsbCk7CisgICAgICAgIGFzc2VydE5vdE51bGwobWVtb3J5RGIpOworICAgICAgICBtZW1vcnlEYi5jbG9zZSgpOworICAgICAgICBhc3NlcnRGYWxzZShtZW1vcnlEYi5pc09wZW4oKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBlcnJvckhhbmRsZXIub25Db3JydXB0aW9uKG1lbW9yeURiKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoInVuZXhwZWN0ZWQiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGNyZWF0ZSBhIGRhdGFiYXNlLCBrZWVwIGl0IG9wZW4sIGNhbGwgY29ycnVwdGlvbiBoYW5kbGVyLiBkYXRhYmFzZSBmaWxlIHNob3VsZCBiZSBkZWxldGVkCisgICAgICAgIFNRTGl0ZURhdGFiYXNlIGRiT2JqID0gU1FMaXRlRGF0YWJhc2Uub3Blbk9yQ3JlYXRlRGF0YWJhc2UobURhdGFiYXNlLmdldFBhdGgoKSwgbnVsbCk7CisgICAgICAgIGFzc2VydFRydWUoZGJmaWxlLmV4aXN0cygpKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChkYk9iaik7CisgICAgICAgIGFzc2VydFRydWUoZGJPYmouaXNPcGVuKCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZXJyb3JIYW5kbGVyLm9uQ29ycnVwdGlvbihkYk9iaik7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShkYmZpbGUuZXhpc3RzKCkpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgidW5leHBlY3RlZCIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gY3JlYXRlIGEgZGF0YWJhc2UsIGF0dGFjaCAyIG1vcmUgZGF0YWJhc2VzIHRvIGl0CisgICAgICAgIC8vICAgIGF0dGFjaGVkIGRhdGFiYXNlICMgMTogIjptZW1vcnk6IgorICAgICAgICAvLyAgICBhdHRhY2hlZCBkYXRhYmFzZSAjIDI6IG1EYXRhYmFzZS5nZXRQYXRoKCkgKyAiMSI7CisgICAgICAgIC8vIGNhbGwgY29ycnVwdGlvbiBoYW5kbGVyLiBkYXRhYmFzZSBmaWxlcyBpbmNsdWRpbmcgdGhlIG9uZSBmb3IgYXR0YWNoZWQgZGF0YWJhc2UgIyAyCisgICAgICAgIC8vIHNob3VsZCBiZSBkZWxldGVkCisgICAgICAgIFN0cmluZyBhdHRhY2hlZERiMUZpbGUgPSBtRGF0YWJhc2UuZ2V0UGF0aCgpICsgIjEiOworICAgICAgICBkYk9iaiA9IFNRTGl0ZURhdGFiYXNlLm9wZW5PckNyZWF0ZURhdGFiYXNlKG1EYXRhYmFzZS5nZXRQYXRoKCksIG51bGwpOworICAgICAgICBkYk9iai5leGVjU1FMKCJBVFRBQ0ggREFUQUJBU0UgJzptZW1vcnk6JyBhcyBtZW1vcnlEYiIpOworICAgICAgICBkYk9iai5leGVjU1FMKCJBVFRBQ0ggREFUQUJBU0UgJyIgKyAgYXR0YWNoZWREYjFGaWxlICsgIicgYXMgYXR0YWNoZWREYjEiKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShkYmZpbGUuZXhpc3RzKCkpOworICAgICAgICBhc3NlcnRUcnVlKG5ldyBGaWxlKGF0dGFjaGVkRGIxRmlsZSkuZXhpc3RzKCkpOworICAgICAgICBhc3NlcnROb3ROdWxsKGRiT2JqKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShkYk9iai5pc09wZW4oKSk7CisgICAgICAgIEFycmF5TGlzdDxQYWlyPFN0cmluZywgU3RyaW5nPj4gYXR0YWNoZWREYnMgPSBkYk9iai5nZXRBdHRhY2hlZERicygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZXJyb3JIYW5kbGVyLm9uQ29ycnVwdGlvbihkYk9iaik7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShkYmZpbGUuZXhpc3RzKCkpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UobmV3IEZpbGUoYXR0YWNoZWREYjFGaWxlKS5leGlzdHMoKSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJ1bmV4cGVjdGVkIik7CisgICAgICAgIH0KKworICAgICAgICAvLyBzYW1lIGFzIGFib3ZlLCBleGNlcHQgdGhpcyBpcyBhIGJpdCBvZiBzdHJlc3MgdGVzdGluZy4gYXR0YWNoIDUgZGF0YWJhc2UgZmlsZXMKKyAgICAgICAgLy8gYW5kIG1ha2Ugc3VyZSB0aGV5IGFyZSBhbGwgcmVtb3ZlZC4KKyAgICAgICAgaW50IE4gPSA1OworICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBhdHRhY2hlZERiRmlsZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oTik7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSsrKSB7CisgICAgICAgICAgICBhdHRhY2hlZERiRmlsZXMuYWRkKG1EYXRhYmFzZS5nZXRQYXRoKCkgKyBpKTsKKyAgICAgICAgfQorICAgICAgICBkYk9iaiA9IFNRTGl0ZURhdGFiYXNlLm9wZW5PckNyZWF0ZURhdGFiYXNlKG1EYXRhYmFzZS5nZXRQYXRoKCksIG51bGwpOworICAgICAgICBkYk9iai5leGVjU1FMKCJBVFRBQ0ggREFUQUJBU0UgJzptZW1vcnk6JyBhcyBtZW1vcnlEYiIpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE47IGkrKykgeworICAgICAgICAgICAgZGJPYmouZXhlY1NRTCgiQVRUQUNIIERBVEFCQVNFICciICsgIGF0dGFjaGVkRGJGaWxlcy5nZXQoaSkgKyAiJyBhcyBhdHRhY2hlZERiIiArIGkpOworICAgICAgICB9CisgICAgICAgIGFzc2VydFRydWUoZGJmaWxlLmV4aXN0cygpKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyBpKyspIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUobmV3IEZpbGUoYXR0YWNoZWREYkZpbGVzLmdldChpKSkuZXhpc3RzKCkpOworICAgICAgICB9CisgICAgICAgIGFzc2VydE5vdE51bGwoZGJPYmopOworICAgICAgICBhc3NlcnRUcnVlKGRiT2JqLmlzT3BlbigpKTsKKyAgICAgICAgYXR0YWNoZWREYnMgPSBkYk9iai5nZXRBdHRhY2hlZERicygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZXJyb3JIYW5kbGVyLm9uQ29ycnVwdGlvbihkYk9iaik7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShkYmZpbGUuZXhpc3RzKCkpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyBpKyspIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRGYWxzZShuZXcgRmlsZShhdHRhY2hlZERiRmlsZXMuZ2V0KGkpKS5leGlzdHMoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJ1bmV4cGVjdGVkIik7CisgICAgICAgIH0KKyAgICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvRGF0YWJhc2VDb25uZWN0aW9uUG9vbFRlc3QuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9EYXRhYmFzZUNvbm5lY3Rpb25Qb29sVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyNWRkMmQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvRGF0YWJhc2VDb25uZWN0aW9uUG9vbFRlc3QuamF2YQpAQCAtMCwwICsxLDM2OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGU7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZVRlc3QuQ2xhc3NUb1Rlc3RTcWxDb21waWxhdGlvbkFuZENhY2hpbmc7CitpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKK2ltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKKworcHVibGljIGNsYXNzIERhdGFiYXNlQ29ubmVjdGlvblBvb2xUZXN0IGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkRhdGFiYXNlQ29ubmVjdGlvblBvb2xUZXN0IjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfQ09OTiA9IDU7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfU1FMID0gInNlbGVjdCAqIGZyb20gdGVzdCB3aGVyZSBpID0gPyBBTkQgaiA9IDEiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFRFU1RfU1FMUyA9IG5ldyBTdHJpbmdbXSB7CisgICAgICAgIFRFU1RfU1FMLCBURVNUX1NRTCArIDEsIFRFU1RfU1FMICsgMiwgVEVTVF9TUUwgKyAzLCBURVNUX1NRTCArIDQKKyAgICB9OworCisgICAgcHJpdmF0ZSBTUUxpdGVEYXRhYmFzZSBtRGF0YWJhc2U7CisgICAgcHJpdmF0ZSBGaWxlIG1EYXRhYmFzZUZpbGU7CisgICAgcHJpdmF0ZSBEYXRhYmFzZUNvbm5lY3Rpb25Qb29sIG1UZXN0UG9vbDsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnNldFVwKCk7CisKKyAgICAgICAgRmlsZSBkYkRpciA9IGdldENvbnRleHQoKS5nZXREaXIodGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSwgQ29udGV4dC5NT0RFX1BSSVZBVEUpOworICAgICAgICBtRGF0YWJhc2VGaWxlID0gbmV3IEZpbGUoZGJEaXIsICJkYXRhYmFzZV90ZXN0LmRiIik7CisgICAgICAgIGlmIChtRGF0YWJhc2VGaWxlLmV4aXN0cygpKSB7CisgICAgICAgICAgICBtRGF0YWJhc2VGaWxlLmRlbGV0ZSgpOworICAgICAgICB9CisgICAgICAgIG1EYXRhYmFzZSA9IFNRTGl0ZURhdGFiYXNlLm9wZW5PckNyZWF0ZURhdGFiYXNlKG1EYXRhYmFzZUZpbGUuZ2V0UGF0aCgpLCBudWxsKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChtRGF0YWJhc2UpOworICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiY3JlYXRlIHRhYmxlIHRlc3QgKGkgaW50LCBqIGludCk7Iik7CisgICAgICAgIG1UZXN0UG9vbCA9IG5ldyBEYXRhYmFzZUNvbm5lY3Rpb25Qb29sKG1EYXRhYmFzZSk7CisgICAgICAgIGFzc2VydE5vdE51bGwobVRlc3RQb29sKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBtVGVzdFBvb2wuY2xvc2UoKTsKKyAgICAgICAgbURhdGFiYXNlLmNsb3NlKCk7CisgICAgICAgIG1EYXRhYmFzZUZpbGUuZGVsZXRlKCk7CisgICAgICAgIHN1cGVyLnRlYXJEb3duKCk7CisgICAgfQorCisgICAgQFNtYWxsVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRBbmRSZWxlYXNlKCkgeworICAgICAgICBtVGVzdFBvb2wuc2V0TWF4UG9vbFNpemUoTUFYX0NPTk4pOworICAgICAgICAvLyBjb25uZWN0aW9ucyBzaG91bGQgYmUgbGF6aWx5IGNyZWF0ZWQuCisgICAgICAgIGFzc2VydEVxdWFscygwLCBtVGVzdFBvb2wuZ2V0U2l6ZSgpKTsKKyAgICAgICAgLy8gTUFYIHBvb2wgc2l6ZSBzaG91bGQgYmUgc2V0IHRvIE1BWF9DT05OCisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldE1heFBvb2xTaXplKCkpOworICAgICAgICAvLyBnZXQgYSBjb25uZWN0aW9uCisgICAgICAgIFNRTGl0ZURhdGFiYXNlIGRiID0gbVRlc3RQb29sLmdldChURVNUX1NRTCk7CisgICAgICAgIC8vIHBvb2wgc2l6ZSBzaG91bGQgYmUgb25lIC0gc2luY2Ugb25seSBvbmUgc2hvdWxkIGJlIGFsbG9jYXRlZCBmb3IgdGhlIGFib3ZlIGdldCgpCisgICAgICAgIGFzc2VydEVxdWFscygxLCBtVGVzdFBvb2wuZ2V0U2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1EYXRhYmFzZSwgZGIubVBhcmVudENvbm5PYmopOworICAgICAgICAvLyBubyBmcmVlIGNvbm5lY3Rpb25zIHNob3VsZCBiZSBhdmFpbGFibGUKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG1UZXN0UG9vbC5nZXRGcmVlUG9vbFNpemUoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKG1UZXN0UG9vbC5pc0RhdGFiYXNlT2JqRnJlZShkYikpOworICAgICAgICAvLyByZWxlYXNlIHRoZSBjb25uZWN0aW9uCisgICAgICAgIG1UZXN0UG9vbC5yZWxlYXNlKGRiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG1UZXN0UG9vbC5nZXRGcmVlUG9vbFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBtVGVzdFBvb2wuZ2V0U2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0TWF4UG9vbFNpemUoKSk7CisgICAgICAgIGFzc2VydFRydWUobVRlc3RQb29sLmlzRGF0YWJhc2VPYmpGcmVlKGRiKSk7CisgICAgICAgIC8vIHJlbGVhc2UgdGhlIHNhbWUgb2JqZWN0IGFnYWluIGFuZCBleHBlY3QgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtVGVzdFBvb2wucmVsZWFzZShkYik7CisgICAgICAgICAgICBmYWlsKCJpbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXhwZWN0ZWQiKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUgKSB7CisgICAgICAgICAgICAvLyBleHBlY3RlZC4KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIGdldCBhbGwgY29ubmVjdGlvbnMgZnJvbSB0aGUgcG9vbCBhbmQgYXNrIGZvciBvbmUgbW9yZS4KKyAgICAgKiBzaG91bGQgZ2V0IG9uZSBvZiB0aGUgY29ubmVjdGlvbnMgYWxyZWFkeSBnb3Qgc28gZmFyLiAKKyAgICAgKi8KKyAgICBAU21hbGxUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldEFsbENvbm5BbmRPbmVNb3JlKCkgeworICAgICAgICBtVGVzdFBvb2wuc2V0TWF4UG9vbFNpemUoTUFYX0NPTk4pOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRNYXhQb29sU2l6ZSgpKTsKKyAgICAgICAgQXJyYXlMaXN0PFNRTGl0ZURhdGFiYXNlPiBkYk9ianMgPSBuZXcgQXJyYXlMaXN0PFNRTGl0ZURhdGFiYXNlPigpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE1BWF9DT05OOyBpKyspIHsKKyAgICAgICAgICAgIFNRTGl0ZURhdGFiYXNlIGRiID0gbVRlc3RQb29sLmdldChURVNUX1NRTCk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShkYk9ianMuY29udGFpbnMoZGIpKTsKKyAgICAgICAgICAgIGRiT2Jqcy5hZGQoZGIpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG1EYXRhYmFzZSwgZGIubVBhcmVudENvbm5PYmopOworICAgICAgICB9CisgICAgICAgIGFzc2VydEVxdWFscygwLCBtVGVzdFBvb2wuZ2V0RnJlZVBvb2xTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRNYXhQb29sU2l6ZSgpKTsKKyAgICAgICAgLy8gcG9vbCBpcyBtYXhlZCBvdXQgYW5kIG5vIGZyZWUgY29ubmVjdGlvbnMuIGFzayBmb3Igb25lIG1vcmUgY29ubmVjdGlvbgorICAgICAgICBTUUxpdGVEYXRhYmFzZSBkYjEgPSBtVGVzdFBvb2wuZ2V0KFRFU1RfU1FMKTsKKyAgICAgICAgLy8gbWFrZSBzdXJlIGRiMSBpcyBvbmUgb2YgdGhlIGV4aXN0aW5nIG9uZXMKKyAgICAgICAgYXNzZXJ0VHJ1ZShkYk9ianMuY29udGFpbnMoZGIxKSk7CisgICAgICAgIC8vIHBvb2wgc2l6ZSBzaG91bGQgcmVtYWluIGF0IE1BWF9DT05OCisgICAgICAgIGFzc2VydEVxdWFscygwLCBtVGVzdFBvb2wuZ2V0RnJlZVBvb2xTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRNYXhQb29sU2l6ZSgpKTsKKyAgICAgICAgLy8gcmVsZWFzZSBkYjEgYnV0IHNpbmNlIGl0IGlzIGFsbG9jYXRlZCAyIHRpbWVzLCBpdCBzaG91bGQgc3RpbGwgcmVtYWluICdidXN5JworICAgICAgICBtVGVzdFBvb2wucmVsZWFzZShkYjEpOworICAgICAgICBhc3NlcnRGYWxzZShtVGVzdFBvb2wuaXNEYXRhYmFzZU9iakZyZWUoZGIxKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBtVGVzdFBvb2wuZ2V0RnJlZVBvb2xTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRNYXhQb29sU2l6ZSgpKTsKKyAgICAgICAgLy8gcmVsZWFzZSBhbGwgY29ubmVjdGlvbnMKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfQ09OTjsgaSsrKSB7CisgICAgICAgICAgICBtVGVzdFBvb2wucmVsZWFzZShkYk9ianMuZ2V0KGkpKTsKKyAgICAgICAgfQorICAgICAgICAvLyBhbGwgb2JqZWN0cyBpbiB0aGUgcG9vbCBzaG91bGQgYmUgZnJlZWQgbm93CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldEZyZWVQb29sU2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0U2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0TWF4UG9vbFNpemUoKSk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIHNhbWUgYXMgYWJvdmUgZXhjZXB0IHRoYXQgZWFjaCBjb25uZWN0aW9uIGhhcyBkaWZmZXJlbnQgU1FMIHN0YXRlbWVudCBhc3NvY2lhdGVkIHdpdGggaXQuIAorICAgICAqLworICAgIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29ublJldHJpZXZhbEZvclByZXZpb3VzbHlTZWVuU3FsKCkgeworICAgICAgICBtVGVzdFBvb2wuc2V0TWF4UG9vbFNpemUoTUFYX0NPTk4pOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRNYXhQb29sU2l6ZSgpKTsKKworICAgICAgICBIYXNoTWFwPFN0cmluZywgU1FMaXRlRGF0YWJhc2U+IGRiT2JqcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU1FMaXRlRGF0YWJhc2U+KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUFYX0NPTk47IGkrKykgeworICAgICAgICAgICAgU1FMaXRlRGF0YWJhc2UgZGIgPSBtVGVzdFBvb2wuZ2V0KFRFU1RfU1FMU1tpXSk7CisgICAgICAgICAgICBleGVjdXRlU3FsT25EYXRhYmFzZUNvbm4oZGIsIFRFU1RfU1FMU1tpXSk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShkYk9ianMudmFsdWVzKCkuY29udGFpbnMoZGIpKTsKKyAgICAgICAgICAgIGRiT2Jqcy5wdXQoVEVTVF9TUUxTW2ldLCBkYik7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG1UZXN0UG9vbC5nZXRGcmVlUG9vbFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldE1heFBvb2xTaXplKCkpOworICAgICAgICAvLyBwb29sIGlzIG1heGVkIG91dCBhbmQgbm8gZnJlZSBjb25uZWN0aW9ucy4gYXNrIGZvciBvbmUgbW9yZSBjb25uZWN0aW9uCisgICAgICAgIC8vIHVzZSBhIHByZXZpb3VzbHkgc2VlbiBTUUwgc3RhdGVtZW50CisgICAgICAgIFN0cmluZyB0ZXN0U3FsID0gVEVTVF9TUUxTW01BWF9DT05OIC0gMV07CisgICAgICAgIFNRTGl0ZURhdGFiYXNlIGRiMSA9IG1UZXN0UG9vbC5nZXQodGVzdFNxbCk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBtVGVzdFBvb2wuZ2V0RnJlZVBvb2xTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRNYXhQb29sU2l6ZSgpKTsKKyAgICAgICAgLy8gbWFrZSBzdXJlIGRiMSBpcyBvbmUgb2YgdGhlIGV4aXN0aW5nIG9uZXMKKyAgICAgICAgYXNzZXJ0VHJ1ZShkYk9ianMudmFsdWVzKCkuY29udGFpbnMoZGIxKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhkYjEsIGRiT2Jqcy5nZXQodGVzdFNxbCkpOworICAgICAgICAvLyBkbyB0aGUgc2FtZSBhZ2FpbgorICAgICAgICBTUUxpdGVEYXRhYmFzZSBkYjIgPSBtVGVzdFBvb2wuZ2V0KHRlc3RTcWwpOworICAgICAgICAvLyBtYWtlIHN1cmUgZGIxIGlzIG9uZSBvZiB0aGUgZXhpc3Rpbmcgb25lcworICAgICAgICBhc3NlcnRFcXVhbHMoZGIyLCBkYk9ianMuZ2V0KHRlc3RTcWwpKTsKKworICAgICAgICAvLyBwb29sIHNpemUgc2hvdWxkIHJlbWFpbiBhdCBNQVhfQ09OTgorICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbVRlc3RQb29sLmdldEZyZWVQb29sU2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0U2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0TWF4UG9vbFNpemUoKSk7CisKKyAgICAgICAgLy8gcmVsZWFzZSBkYjEgYnV0IHNpbmNlIHRoZSBzYW1lIGNvbm5lY3Rpb24gaXMgYWxsb2NhdGVkIDMgdGltZXMsCisgICAgICAgIC8vIGl0IHNob3VsZCBzdGlsbCByZW1haW4gJ2J1c3knCisgICAgICAgIG1UZXN0UG9vbC5yZWxlYXNlKGRiMSk7CisgICAgICAgIGFzc2VydEZhbHNlKG1UZXN0UG9vbC5pc0RhdGFiYXNlT2JqRnJlZShkYk9ianMuZ2V0KHRlc3RTcWwpKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBtVGVzdFBvb2wuZ2V0RnJlZVBvb2xTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRNYXhQb29sU2l6ZSgpKTsKKworICAgICAgICAvLyByZWxlYXNlIGRiMiBidXQgc2luY2UgdGhlIHNhbWUgY29ubmVjdGlvbiBpcyBhbGxvY2F0ZWQgMiB0aW1lcywKKyAgICAgICAgLy8gaXQgc2hvdWxkIHN0aWxsIHJlbWFpbiAnYnVzeScKKyAgICAgICAgbVRlc3RQb29sLnJlbGVhc2UoZGIyKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobVRlc3RQb29sLmlzRGF0YWJhc2VPYmpGcmVlKGRiT2Jqcy5nZXQodGVzdFNxbCkpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG1UZXN0UG9vbC5nZXRGcmVlUG9vbFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldE1heFBvb2xTaXplKCkpOworCisgICAgICAgIC8vIHJlbGVhc2UgYWxsIGNvbm5lY3Rpb25zCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUFYX0NPTk47IGkrKykgeworICAgICAgICAgICAgbVRlc3RQb29sLnJlbGVhc2UoZGJPYmpzLmdldChURVNUX1NRTFNbaV0pKTsKKyAgICAgICAgfQorICAgICAgICAvLyBhbGwgb2JqZWN0cyBpbiB0aGUgcG9vbCBzaG91bGQgYmUgZnJlZWQgbm93CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldEZyZWVQb29sU2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0U2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0TWF4UG9vbFNpemUoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGV4ZWN1dGVTcWxPbkRhdGFiYXNlQ29ubihTUUxpdGVEYXRhYmFzZSBkYiwgU3RyaW5nIHNxbCkgeworICAgICAgICAvLyBnZXQgdGhlIGdpdmVuIHNxbCBiZSBjb21waWxlZCBvbiB0aGUgZ2l2ZW4gZGF0YWJhc2UgY29ubmVjdGlvbi4KKyAgICAgICAgLy8gdGhpcyB3aWxsIGhlbHAgRGF0YWJhc2VDb25lbmN0aW9uUG9vbCBmaWd1cmUgb3V0IGlmIGEgZ2l2ZW4gU1FMIHN0YXRlbWVudAorICAgICAgICAvLyBpcyBhbHJlYWR5IGNhY2hlZCBieSBhIGRhdGFiYXNlIGNvbm5lY3Rpb24uCisgICAgICAgIENsYXNzVG9UZXN0U3FsQ29tcGlsYXRpb25BbmRDYWNoaW5nIGMgPQorICAgICAgICAgICAgICAgIENsYXNzVG9UZXN0U3FsQ29tcGlsYXRpb25BbmRDYWNoaW5nLmNyZWF0ZShkYiwgc3FsKTsKKyAgICAgICAgYy5jbG9zZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGdldCBhIGNvbm5lY3Rpb24gZm9yIGEgU1FMIHN0YXRlbWVudCAnYmxhaCcuIChjb25uZWN0aW9uX3MpCisgICAgICogbWFrZSBzdXJlIHRoZSBwb29sIGhhcyBhdCBsZWFzdCBvbmUgZnJlZSBjb25uZWN0aW9uIGV2ZW4gYWZ0ZXIgdGhpcyBnZXQoKS4KKyAgICAgKiBhbmQgZ2V0IGEgY29ubmVjdGlvbiBmb3IgdGhlIHNhbWUgU1FMIGFnYWluLgorICAgICAqICAgIHRoaXMgY29ubmVjdGlvbiBzaG91bGQgYmUgZGlmZmVyZW50IGZyb20gY29ubmVjdGlvbl9zLgorICAgICAqICAgIGV2ZW4gdGhvdWdoIHRoZXJlIGlzIGEgY29ubmVjdGlvbiB3aXRoIHRoZSBnaXZlbiBTUUwgcHJlLWNvbXBpbGVkLCBzaW5jZSBpcyBpdCBub3QgZnJlZQorICAgICAqICAgIEFORCBzaW5jZSB0aGUgcG9vbCBoYXMgZnJlZSBjb25uZWN0aW9ucyBhdmFpbGFibGUsIHNob3VsZCBnZXQgYSBuZXcgY29ubmVjdGlvbi4KKyAgICAgKi8KKyAgICBAU21hbGxUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldENvbm5Gb3JUaGVTYW1lU3FsKCkgeworICAgICAgICBtVGVzdFBvb2wuc2V0TWF4UG9vbFNpemUoTUFYX0NPTk4pOworCisgICAgICAgIFNRTGl0ZURhdGFiYXNlIGRiID0gbVRlc3RQb29sLmdldChURVNUX1NRTCk7CisgICAgICAgIGV4ZWN1dGVTcWxPbkRhdGFiYXNlQ29ubihkYiwgVEVTVF9TUUwpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbVRlc3RQb29sLmdldEZyZWVQb29sU2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG1UZXN0UG9vbC5nZXRTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRNYXhQb29sU2l6ZSgpKTsKKworICAgICAgICBhc3NlcnRGYWxzZShtVGVzdFBvb2wuaXNEYXRhYmFzZU9iakZyZWUoZGIpKTsKKworICAgICAgICBTUUxpdGVEYXRhYmFzZSBkYjEgPSBtVGVzdFBvb2wuZ2V0KFRFU1RfU1FMKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG1UZXN0UG9vbC5nZXRGcmVlUG9vbFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCBtVGVzdFBvb2wuZ2V0U2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0TWF4UG9vbFNpemUoKSk7CisKKyAgICAgICAgYXNzZXJ0RmFsc2UobVRlc3RQb29sLmlzRGF0YWJhc2VPYmpGcmVlKGRiMSkpOworICAgICAgICBhc3NlcnRGYWxzZShkYjEuZXF1YWxzKGRiKSk7CisKKyAgICAgICAgbVRlc3RQb29sLnJlbGVhc2UoZGIpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbVRlc3RQb29sLmdldEZyZWVQb29sU2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIG1UZXN0UG9vbC5nZXRTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRNYXhQb29sU2l6ZSgpKTsKKworICAgICAgICBtVGVzdFBvb2wucmVsZWFzZShkYjEpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgbVRlc3RQb29sLmdldEZyZWVQb29sU2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIG1UZXN0UG9vbC5nZXRTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRNYXhQb29sU2l6ZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBnZXQgdGhlIHNhbWUgY29ubmVjdGlvbiBOIHRpbWVzIGFuZCByZWxlYXNlIGl0IE4gdGltZXMuCisgICAgICogdGhpcyB0ZXN0cyBEYXRhYmFzZUNvbm5lY3Rpb25Qb29sLlBvb2xPYmoubU51bUhvbGRlcnMKKyAgICAgKi8KKyAgICBAU21hbGxUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldFNhbWVDb25uTnRpbWVzQW5kUmVsZWFzZUl0TnRpbWVzKCkgeworICAgICAgICBtVGVzdFBvb2wuc2V0TWF4UG9vbFNpemUoTUFYX0NPTk4pOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRNYXhQb29sU2l6ZSgpKTsKKworICAgICAgICBIYXNoTWFwPFN0cmluZywgU1FMaXRlRGF0YWJhc2U+IGRiT2JqcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU1FMaXRlRGF0YWJhc2U+KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUFYX0NPTk47IGkrKykgeworICAgICAgICAgICAgU1FMaXRlRGF0YWJhc2UgZGIgPSBtVGVzdFBvb2wuZ2V0KFRFU1RfU1FMU1tpXSk7CisgICAgICAgICAgICBleGVjdXRlU3FsT25EYXRhYmFzZUNvbm4oZGIsIFRFU1RfU1FMU1tpXSk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShkYk9ianMudmFsdWVzKCkuY29udGFpbnMoZGIpKTsKKyAgICAgICAgICAgIGRiT2Jqcy5wdXQoVEVTVF9TUUxTW2ldLCBkYik7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG1UZXN0UG9vbC5nZXRGcmVlUG9vbFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldE1heFBvb2xTaXplKCkpOworICAgICAgICAvLyBldmVyeSBjb25uZWN0aW9uIGluIHRoZSBwb29sIHNob3VsZCBoYXZlIG51bUhvbGRlcnMgPSAxCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUFYX0NPTk47IGkgKyspIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBtVGVzdFBvb2wuZ2V0UG9vbCgpLmdldChpKS5nZXROdW1Ib2xkZXJzKCkpOworICAgICAgICB9CisgICAgICAgIC8vIHBvb2wgaXMgbWF4ZWQgb3V0IGFuZCBubyBmcmVlIGNvbm5lY3Rpb25zLiBhc2sgZm9yIG9uZSBtb3JlIGNvbm5lY3Rpb24KKyAgICAgICAgLy8gdXNlIGEgcHJldmlvdXNseSBzZWVuIFNRTCBzdGF0ZW1lbnQKKyAgICAgICAgU3RyaW5nIHRlc3RTcWwgPSBURVNUX1NRTFNbTUFYX0NPTk4gLSAxXTsKKyAgICAgICAgU1FMaXRlRGF0YWJhc2UgZGIxID0gbVRlc3RQb29sLmdldCh0ZXN0U3FsKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG1UZXN0UG9vbC5nZXRGcmVlUG9vbFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldE1heFBvb2xTaXplKCkpOworICAgICAgICAvLyBtYWtlIHN1cmUgZGIxIGlzIG9uZSBvZiB0aGUgZXhpc3Rpbmcgb25lcworICAgICAgICBhc3NlcnRUcnVlKGRiT2Jqcy52YWx1ZXMoKS5jb250YWlucyhkYjEpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGRiMSwgZGJPYmpzLmdldCh0ZXN0U3FsKSk7CisgICAgICAgIGFzc2VydEZhbHNlKG1UZXN0UG9vbC5pc0RhdGFiYXNlT2JqRnJlZShkYjEpKTsKKyAgICAgICAgRGF0YWJhc2VDb25uZWN0aW9uUG9vbC5Qb29sT2JqIHBvb2xPYmogPSBtVGVzdFBvb2wuZ2V0UG9vbCgpLmdldChkYjEubUNvbm5lY3Rpb25OdW0gLSAxKTsKKyAgICAgICAgaW50IG51bUhvbGRlcnMgPSBwb29sT2JqLmdldE51bUhvbGRlcnMoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIG51bUhvbGRlcnMpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbVRlc3RQb29sLmdldEZyZWVQb29sU2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0U2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0TWF4UG9vbFNpemUoKSk7CisgICAgICAgIC8vIGdldCB0aGUgc2FtZSBjb25uZWN0aW9uIE4gdGltZXMgbW9yZQorICAgICAgICBpbnQgTiA9IDEwMDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyBpKyspIHsKKyAgICAgICAgICAgIFNRTGl0ZURhdGFiYXNlIGRiMiA9IG1UZXN0UG9vbC5nZXQodGVzdFNxbCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZGIxLCBkYjIpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UobVRlc3RQb29sLmlzRGF0YWJhc2VPYmpGcmVlKGRiMikpOworICAgICAgICAgICAgLy8gbnVtSG9sZGVycyBmb3IgdGhpcyBvYmplY3Qgc2hvdWxkIGJlIG5vdyB1cCBieSAxCisgICAgICAgICAgICBpbnQgcHJldiA9IG51bUhvbGRlcnM7CisgICAgICAgICAgICBudW1Ib2xkZXJzID0gcG9vbE9iai5nZXROdW1Ib2xkZXJzKCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMocHJldiArIDEsIG51bUhvbGRlcnMpOworICAgICAgICB9CisgICAgICAgIC8vIHJlbGVhc2UgaXQgTiB0aW1lcworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE47IGkrKykgeworICAgICAgICAgICAgbVRlc3RQb29sLnJlbGVhc2UoZGIxKTsKKyAgICAgICAgICAgIGludCBwcmV2ID0gbnVtSG9sZGVyczsKKyAgICAgICAgICAgIG51bUhvbGRlcnMgPSBwb29sT2JqLmdldE51bUhvbGRlcnMoKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhwcmV2IC0gMSwgbnVtSG9sZGVycyk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShtVGVzdFBvb2wuaXNEYXRhYmFzZU9iakZyZWUoZGIxKSk7CisgICAgICAgIH0KKyAgICAgICAgLy8gdGhlIGNvbm5lY3Rpb24gc2hvdWxkIHN0aWxsIGhhdmUgMiBtb3JlIGhvbGRlcnMKKyAgICAgICAgYXNzZXJ0RmFsc2UobVRlc3RQb29sLmlzRGF0YWJhc2VPYmpGcmVlKGRiMSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgcG9vbE9iai5nZXROdW1Ib2xkZXJzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbVRlc3RQb29sLmdldEZyZWVQb29sU2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0U2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0TWF4UG9vbFNpemUoKSk7CisgICAgICAgIC8vIHJlbGVhc2UgMiBtb3JlIHRpbWVzCisgICAgICAgIG1UZXN0UG9vbC5yZWxlYXNlKGRiMSk7CisgICAgICAgIG1UZXN0UG9vbC5yZWxlYXNlKGRiMSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBwb29sT2JqLmdldE51bUhvbGRlcnMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBtVGVzdFBvb2wuZ2V0RnJlZVBvb2xTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRNYXhQb29sU2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtVGVzdFBvb2wuaXNEYXRhYmFzZU9iakZyZWUoZGIxKSk7CisgICAgfQorCisgICAgQFNtYWxsVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJlc3NUZXN0KCkgeworICAgICAgICBtVGVzdFBvb2wuc2V0TWF4UG9vbFNpemUoTUFYX0NPTk4pOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRNYXhQb29sU2l6ZSgpKTsKKworICAgICAgICBIYXNoTWFwPFNRTGl0ZURhdGFiYXNlLCBJbnRlZ2VyPiBkYk1hcCA9IG5ldyBIYXNoTWFwPFNRTGl0ZURhdGFiYXNlLCBJbnRlZ2VyPigpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE1BWF9DT05OOyBpKyspIHsKKyAgICAgICAgICAgIFNRTGl0ZURhdGFiYXNlIGRiID0gbVRlc3RQb29sLmdldChURVNUX1NRTFNbaV0pOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UoZGJNYXAuY29udGFpbnNLZXkoZGIpKTsKKyAgICAgICAgICAgIGRiTWFwLnB1dChkYiwgMSk7CisgICAgICAgICAgICBleGVjdXRlU3FsT25EYXRhYmFzZUNvbm4oZGIsIFRFU1RfU1FMU1tpXSk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG1UZXN0UG9vbC5nZXRGcmVlUG9vbFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldE1heFBvb2xTaXplKCkpOworICAgICAgICAvLyBhc2sgZm9yIGxvdCBtb3JlIGNvbm5lY3Rpb25zIGJ1dCBzaW5jZSB0aGUgcG9vbCBpcyBtYXhlZCBvdXQsIHdlIHNob3VsZCBzdGFydCByZWNlaXZpbmcKKyAgICAgICAgLy8gY29ubmVjdGlvbnMgdGhhdCB3ZSBhbHJlYWR5IGdvdCBzbyBmYXIKKyAgICAgICAgZm9yIChpbnQgaSA9IE1BWF9DT05OOyBpIDwgMTAwMDsgaSsrKSB7CisgICAgICAgICAgICBTUUxpdGVEYXRhYmFzZSBkYiA9IG1UZXN0UG9vbC5nZXQoVEVTVF9TUUwgKyBpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoZGJNYXAuY29udGFpbnNLZXkoZGIpKTsKKyAgICAgICAgICAgIGludCBrID0gZGJNYXAuZ2V0KGRiKTsKKyAgICAgICAgICAgIGRiTWFwLnB1dChkYiwgKytrKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbVRlc3RQb29sLmdldEZyZWVQb29sU2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0U2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0TWF4UG9vbFNpemUoKSk7CisgICAgICAgIC8vIHByaW50IHRoZSBkaXN0cmlidXRpb24gb2YgdGhlIGRhdGFiYXNlIGNvbm5lY3Rpb24gaGFuZGxlcyByZWNlaXZlZCwgc2hvdWxkIGJlIHVuaWZvcm0uCisgICAgICAgIGZvciAoU1FMaXRlRGF0YWJhc2UgZCA6IGRiTWFwLmtleVNldCgpKSB7CisgICAgICAgICAgICBMb2cuaShUQUcsICJjb25uZWN0aW9uICMgIiArIGQubUNvbm5lY3Rpb25OdW0gKyAiLCBudW1Ib2xkZXJzOiAiICsgZGJNYXAuZ2V0KGQpKTsKKyAgICAgICAgfQorICAgICAgICAvLyBwcmludCB0aGUgcG9vbCBpbmZvCisgICAgICAgIExvZy5pKFRBRywgbVRlc3RQb29sLnRvU3RyaW5nKCkpOworICAgICAgICAvLyByZWxlYXNlIGFsbAorICAgICAgICBmb3IgKFNRTGl0ZURhdGFiYXNlIGQgOiBkYk1hcC5rZXlTZXQoKSkgeworICAgICAgICAgICAgaW50IG51bSA9IGRiTWFwLmdldChkKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtOyBpKyspIHsKKyAgICAgICAgICAgICAgICBtVGVzdFBvb2wucmVsZWFzZShkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRGcmVlUG9vbFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldE1heFBvb2xTaXplKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVDdXJzb3JUZXN0LmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlQ3Vyc29yVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjM2ZmM2YKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlQ3Vyc29yVGVzdC5qYXZhCkBAIC0wLDAgKzEsOTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKK2ltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uU21hbGxUZXN0OworCitpbXBvcnQgamF2YS5pby5GaWxlOworCitwdWJsaWMgY2xhc3MgU1FMaXRlQ3Vyc29yVGVzdCBleHRlbmRzIEFuZHJvaWRUZXN0Q2FzZSB7CisgICAgcHJpdmF0ZSBTUUxpdGVEYXRhYmFzZSBtRGF0YWJhc2U7CisgICAgcHJpdmF0ZSBGaWxlIG1EYXRhYmFzZUZpbGU7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBQkxFX05BTUUgPSAidGVzdEN1cnNvciI7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIuc2V0VXAoKTsKKworICAgICAgICBGaWxlIGRiRGlyID0gZ2V0Q29udGV4dCgpLmdldERpcih0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpLCBDb250ZXh0Lk1PREVfUFJJVkFURSk7CisgICAgICAgIG1EYXRhYmFzZUZpbGUgPSBuZXcgRmlsZShkYkRpciwgInNxbGl0ZWN1cnNvcl90ZXN0LmRiIik7CisgICAgICAgIGlmIChtRGF0YWJhc2VGaWxlLmV4aXN0cygpKSB7CisgICAgICAgICAgICBtRGF0YWJhc2VGaWxlLmRlbGV0ZSgpOworICAgICAgICB9CisgICAgICAgIG1EYXRhYmFzZSA9IFNRTGl0ZURhdGFiYXNlLm9wZW5PckNyZWF0ZURhdGFiYXNlKG1EYXRhYmFzZUZpbGUuZ2V0UGF0aCgpLCBudWxsKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChtRGF0YWJhc2UpOworICAgICAgICAvLyBjcmVhdGUgYSB0ZXN0IHRhYmxlCisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJDUkVBVEUgVEFCTEUgIiArIFRBQkxFX05BTUUgKyAiIChpIGludCwgaiBpbnQpOyIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG1EYXRhYmFzZS5jbG9zZSgpOworICAgICAgICBtRGF0YWJhc2VGaWxlLmRlbGV0ZSgpOworICAgICAgICBzdXBlci50ZWFyRG93bigpOworICAgIH0KKworICAgIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UXVlcnlPYmpSZWFzc2lnbm1lbnQoKSB7CisgICAgICAgIG1EYXRhYmFzZS5lbmFibGVXcml0ZUFoZWFkTG9nZ2luZygpOworICAgICAgICAvLyBoYXZlIGEgZmV3IGNvbm5lY3Rpb25zIGluIHRoZSBkYXRhYmFzZSBjb25uZWN0aW9uIHBvb2wKKyAgICAgICAgRGF0YWJhc2VDb25uZWN0aW9uUG9vbCBwb29sID0gbURhdGFiYXNlLm1Db25uZWN0aW9uUG9vbDsKKyAgICAgICAgcG9vbC5zZXRNYXhQb29sU2l6ZSg1KTsKKyAgICAgICAgU1FMaXRlQ3Vyc29yIGN1cnNvciA9CisgICAgICAgICAgICAgICAgKFNRTGl0ZUN1cnNvcikgbURhdGFiYXNlLnJhd1F1ZXJ5KCJzZWxlY3QgKiBmcm9tICIgKyBUQUJMRV9OQU1FLCBudWxsKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChjdXJzb3IpOworICAgICAgICAvLyBpdCBzaG91bGQgdXNlIGEgcG9vbGVkIGRhdGFiYXNlIGNvbm5lY3Rpb24KKyAgICAgICAgU1FMaXRlRGF0YWJhc2UgZGIgPSBjdXJzb3IuZ2V0RGF0YWJhc2UoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShkYi5tQ29ubmVjdGlvbk51bSA+IDApOworICAgICAgICBhc3NlcnRGYWxzZShtRGF0YWJhc2UuZXF1YWxzKGRiKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhtRGF0YWJhc2UsIGRiLm1QYXJlbnRDb25uT2JqKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShwb29sLmdldENvbm5lY3Rpb25MaXN0KCkuY29udGFpbnMoZGIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShkYi5pc09wZW4oKSk7CisgICAgICAgIC8vIGRvIGEgcmVxdWVyeS4gY3Vyc29yIHNob3VsZCBjb250aW51ZSB0byB1c2UgdGhlIGFib3ZlIHBvb2xlZCBjb25uZWN0aW9uCisgICAgICAgIGN1cnNvci5yZXF1ZXJ5KCk7CisgICAgICAgIFNRTGl0ZURhdGFiYXNlIGRiQWdhaW4gPSBjdXJzb3IuZ2V0RGF0YWJhc2UoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGRiLCBkYkFnYWluKTsKKyAgICAgICAgLy8gZGlzYWJsZSBXQUwgc28gdGhhdCB0aGUgcG9vbGVkIGNvbm5lY3Rpb24gaGVsZCBieSB0aGUgYWJvdmUgY3Vyc29yIGlzIGNsb3NlZAorICAgICAgICBtRGF0YWJhc2UuZGlzYWJsZVdyaXRlQWhlYWRMb2dnaW5nKCk7CisgICAgICAgIGFzc2VydEZhbHNlKGRiLmlzT3BlbigpKTsKKyAgICAgICAgYXNzZXJ0TnVsbChtRGF0YWJhc2UubUNvbm5lY3Rpb25Qb29sKTsKKyAgICAgICAgLy8gcmVxdWVyeSAtIHdoaWNoIHNob3VsZCBtYWtlIHRoZSBjdXJzb3IgdXNlIG1EYXRhYmFzZSBjb25uZWN0aW9uIHNpbmNlIHRoZSBwb29sZWQKKyAgICAgICAgLy8gY29ubmVjdGlvbiBpcyBubyBsb25nZXIgYXZhaWxhYmxlCisgICAgICAgIGN1cnNvci5yZXF1ZXJ5KCk7CisgICAgICAgIFNRTGl0ZURhdGFiYXNlIGRiMSA9IGN1cnNvci5nZXREYXRhYmFzZSgpOworICAgICAgICBhc3NlcnRUcnVlKGRiMS5tQ29ubmVjdGlvbk51bSA9PSAwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1EYXRhYmFzZSwgZGIxKTsKKyAgICAgICAgYXNzZXJ0TnVsbChtRGF0YWJhc2UubUNvbm5lY3Rpb25Qb29sKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShkYjEuaXNPcGVuKCkpOworICAgICAgICBhc3NlcnRGYWxzZShtRGF0YWJhc2UuZXF1YWxzKGRiKSk7CisgICAgICAgIC8vIGVuYWJsZSBXQUwgYW5kIHJlcXVlcnkgLSB0aGlzIHRpbWUgYSBwb29sZWQgY29ubmVjdGlvbiBzaG91bGQgYmUgdXNlZAorICAgICAgICBtRGF0YWJhc2UuZW5hYmxlV3JpdGVBaGVhZExvZ2dpbmcoKTsKKyAgICAgICAgY3Vyc29yLnJlcXVlcnkoKTsKKyAgICAgICAgZGIgPSBjdXJzb3IuZ2V0RGF0YWJhc2UoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShkYi5tQ29ubmVjdGlvbk51bSA+IDApOworICAgICAgICBhc3NlcnRGYWxzZShtRGF0YWJhc2UuZXF1YWxzKGRiKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhtRGF0YWJhc2UsIGRiLm1QYXJlbnRDb25uT2JqKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtRGF0YWJhc2UubUNvbm5lY3Rpb25Qb29sLmdldENvbm5lY3Rpb25MaXN0KCkuY29udGFpbnMoZGIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShkYi5pc09wZW4oKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZURhdGFiYXNlVGVzdC5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZURhdGFiYXNlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2ZWRhNzEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlRGF0YWJhc2VUZXN0LmphdmEKQEAgLTAsMCArMSw5NDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXM7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5EYXRhYmFzZUVycm9ySGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkRhdGFiYXNlVXRpbHM7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5EZWZhdWx0RGF0YWJhc2VFcnJvckhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2U7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2UuQ3Vyc29yRmFjdG9yeTsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVTdGF0ZW1lbnQ7CitpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKK2ltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uTGFyZ2VUZXN0OworaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5NZWRpdW1UZXN0OworaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5hbm5vdGF0aW9uLlN1cHByZXNzOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKworcHVibGljIGNsYXNzIFNRTGl0ZURhdGFiYXNlVGVzdCBleHRlbmRzIEFuZHJvaWRUZXN0Q2FzZSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJEYXRhYmFzZUdlbmVyYWxUZXN0IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9UQUJMRSA9ICJ0ZXN0IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ1VSUkVOVF9EQVRBQkFTRV9WRVJTSU9OID0gNDI7CisgICAgcHJpdmF0ZSBTUUxpdGVEYXRhYmFzZSBtRGF0YWJhc2U7CisgICAgcHJpdmF0ZSBGaWxlIG1EYXRhYmFzZUZpbGU7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElOU0VSVCA9IDE7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFVQREFURSA9IDI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFTEVURSA9IDM7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERCX05BTUUgPSAiZGF0YWJhc2VfdGVzdC5kYiI7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlci5zZXRVcCgpOworICAgICAgICBkYlNldFVwKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZGJUZWFyZG93bigpOworICAgICAgICBzdXBlci50ZWFyRG93bigpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkYlRlYXJkb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG1EYXRhYmFzZS5jbG9zZSgpOworICAgICAgICBtRGF0YWJhc2VGaWxlLmRlbGV0ZSgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkYlNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEZpbGUgZGJEaXIgPSBnZXRDb250ZXh0KCkuZ2V0RGlyKHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCksIENvbnRleHQuTU9ERV9QUklWQVRFKTsKKyAgICAgICAgbURhdGFiYXNlRmlsZSA9IG5ldyBGaWxlKGRiRGlyLCBEQl9OQU1FKTsKKyAgICAgICAgaWYgKG1EYXRhYmFzZUZpbGUuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgIG1EYXRhYmFzZUZpbGUuZGVsZXRlKCk7CisgICAgICAgIH0KKyAgICAgICAgbURhdGFiYXNlID0gU1FMaXRlRGF0YWJhc2Uub3Blbk9yQ3JlYXRlRGF0YWJhc2UobURhdGFiYXNlRmlsZS5nZXRQYXRoKCksIG51bGwsIG51bGwpOworICAgICAgICBhc3NlcnROb3ROdWxsKG1EYXRhYmFzZSk7CisgICAgICAgIG1EYXRhYmFzZS5zZXRWZXJzaW9uKENVUlJFTlRfREFUQUJBU0VfVkVSU0lPTik7CisgICAgfQorCisgICAgQFNtYWxsVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFbmFibGVXcml0ZUFoZWFkTG9nZ2luZygpIHsKKyAgICAgICAgbURhdGFiYXNlLmRpc2FibGVXcml0ZUFoZWFkTG9nZ2luZygpOworICAgICAgICBhc3NlcnROdWxsKG1EYXRhYmFzZS5tQ29ubmVjdGlvblBvb2wpOworICAgICAgICBtRGF0YWJhc2UuZW5hYmxlV3JpdGVBaGVhZExvZ2dpbmcoKTsKKyAgICAgICAgRGF0YWJhc2VDb25uZWN0aW9uUG9vbCBwb29sID0gbURhdGFiYXNlLm1Db25uZWN0aW9uUG9vbDsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChwb29sKTsKKyAgICAgICAgLy8gbWFrZSB0aGUgc2FtZSBjYWxsIGFnYWluIGFuZCBtYWtlIHN1cmUgdGhlIHBvb2wgYWxyZWFkeSBzZXR1cCBpcyBub3QgcmUtY3JlYXRlZAorICAgICAgICBtRGF0YWJhc2UuZW5hYmxlV3JpdGVBaGVhZExvZ2dpbmcoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHBvb2wsIG1EYXRhYmFzZS5tQ29ubmVjdGlvblBvb2wpOworICAgIH0KKworICAgIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGlzYWJsZVdyaXRlQWhlYWRMb2dnaW5nKCkgeworICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiY3JlYXRlIHRhYmxlIHRlc3QgKGkgaW50KTsiKTsKKyAgICAgICAgbURhdGFiYXNlLmVuYWJsZVdyaXRlQWhlYWRMb2dnaW5nKCk7CisgICAgICAgIGFzc2VydE5vdE51bGwobURhdGFiYXNlLm1Db25uZWN0aW9uUG9vbCk7CisgICAgICAgIC8vIGdldCBhIHBvb2xlZCBkYXRhYmFzZSBjb25uZWN0aW9uCisgICAgICAgIFNRTGl0ZURhdGFiYXNlIGRiID0gbURhdGFiYXNlLmdldERiQ29ubmVjdGlvbigic2VsZWN0ICogZnJvbSB0ZXN0Iik7CisgICAgICAgIGFzc2VydE5vdE51bGwoZGIpOworICAgICAgICBhc3NlcnRGYWxzZShtRGF0YWJhc2UuZXF1YWxzKGRiKSk7CisgICAgICAgIGFzc2VydFRydWUoZGIuaXNPcGVuKCkpOworICAgICAgICAvLyBkaXNhYmxlIFdBTCAtIHdoaWNoIHNob3VsZCBjbG9zZSBjb25uZWN0aW9uIHBvb2wgYW5kIGFsbCBwb29sZWQgY29ubmVjdGlvbnMKKyAgICAgICAgbURhdGFiYXNlLmRpc2FibGVXcml0ZUFoZWFkTG9nZ2luZygpOworICAgICAgICBhc3NlcnROdWxsKG1EYXRhYmFzZS5tQ29ubmVjdGlvblBvb2wpOworICAgICAgICBhc3NlcnRGYWxzZShkYi5pc09wZW4oKSk7CisgICAgfQorCisgICAgQFNtYWxsVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDdXJzb3JzV2l0aENsb3NlZERiQ29ubkFmdGVyRGlzYWJsZVdyaXRlQWhlYWRMb2dnaW5nKCkgeworICAgICAgICBtRGF0YWJhc2UuZGlzYWJsZVdyaXRlQWhlYWRMb2dnaW5nKCk7CisgICAgICAgIG1EYXRhYmFzZS5iZWdpblRyYW5zYWN0aW9uTm9uRXhjbHVzaXZlKCk7CisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJjcmVhdGUgdGFibGUgdGVzdCAoaSBpbnQpOyIpOworICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiaW5zZXJ0IGludG8gdGVzdCB2YWx1ZXMoMSk7Iik7CisgICAgICAgIG1EYXRhYmFzZS5zZXRUcmFuc2FjdGlvblN1Y2Nlc3NmdWwoKTsKKyAgICAgICAgbURhdGFiYXNlLmVuZFRyYW5zYWN0aW9uKCk7CisgICAgICAgIG1EYXRhYmFzZS5lbmFibGVXcml0ZUFoZWFkTG9nZ2luZygpOworICAgICAgICBhc3NlcnROb3ROdWxsKG1EYXRhYmFzZS5tQ29ubmVjdGlvblBvb2wpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbURhdGFiYXNlLm1Db25uZWN0aW9uUG9vbC5nZXRTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbURhdGFiYXNlLm1Db25uZWN0aW9uUG9vbC5nZXRGcmVlUG9vbFNpemUoKSk7CisgICAgICAgIC8vIGdldCBhIGN1cnNvciB3aGljaCBzaG91bGQgdXNlIHBvb2xlZCBkYXRhYmFzZSBjb25uZWN0aW9uCisgICAgICAgIEN1cnNvciBjID0gbURhdGFiYXNlLnJhd1F1ZXJ5KCJzZWxlY3QgKiBmcm9tIHRlc3QiLCBudWxsKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGMuZ2V0Q291bnQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBtRGF0YWJhc2UubUNvbm5lY3Rpb25Qb29sLmdldFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBtRGF0YWJhc2UubUNvbm5lY3Rpb25Qb29sLmdldEZyZWVQb29sU2l6ZSgpKTsKKyAgICAgICAgU1FMaXRlRGF0YWJhc2UgZGIgPSBtRGF0YWJhc2UubUNvbm5lY3Rpb25Qb29sLmdldENvbm5lY3Rpb25MaXN0KCkuZ2V0KDApOworICAgICAgICBhc3NlcnRUcnVlKG1EYXRhYmFzZS5tQ29ubmVjdGlvblBvb2wuaXNEYXRhYmFzZU9iakZyZWUoZGIpKTsKKyAgICAgICAgLy8gZGlzYWJsZSBXQUwgLSB3aGljaCBzaG91bGQgY2xvc2UgY29ubmVjdGlvbiBwb29sIGFuZCBhbGwgcG9vbGVkIGNvbm5lY3Rpb25zCisgICAgICAgIG1EYXRhYmFzZS5kaXNhYmxlV3JpdGVBaGVhZExvZ2dpbmcoKTsKKyAgICAgICAgYXNzZXJ0TnVsbChtRGF0YWJhc2UubUNvbm5lY3Rpb25Qb29sKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoZGIuaXNPcGVuKCkpOworICAgICAgICAvLyBjdXJzb3IgZGF0YSBzaG91bGQgc3RpbGwgYmUgYWNjZXNzaWJsZSBiZWNhdXNlIGl0IGlzIGZldGNoaW5nIGRhdGEgZnJvbSBDdXJzb3JXaW5kb3cKKyAgICAgICAgYy5tb3ZlVG9OZXh0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBjLmdldEludCgwKSk7CisgICAgICAgIGMucmVxdWVyeSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYy5nZXRDb3VudCgpKTsKKyAgICAgICAgYy5tb3ZlVG9OZXh0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBjLmdldEludCgwKSk7CisgICAgICAgIGMuY2xvc2UoKTsKKyAgICB9CisKKyAgICBAU21hbGxUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNldENvbm5lY3Rpb25Qb29sU2l6ZSgpIHsKKyAgICAgICAgbURhdGFiYXNlLmVuYWJsZVdyaXRlQWhlYWRMb2dnaW5nKCk7CisgICAgICAgIC8vIGNhbid0IHNldCBwb29sIHNpemUgdG8gemVybworICAgICAgICB0cnkgeworICAgICAgICAgICAgbURhdGFiYXNlLnNldENvbm5lY3Rpb25Qb29sU2l6ZSgwKTsKKyAgICAgICAgICAgIGZhaWwoIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleHBlY3RlZCIpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShlLmdldE1lc3NhZ2UoKS5jb250YWlucygibGVzcyB0aGFuIHRoZSBjdXJyZW50IG1heCB2YWx1ZSIpKTsKKyAgICAgICAgfQorICAgICAgICAvLyBzZXQgcG9vbCBzaXplIHRvIGEgdmFsaWQgdmFsdWUKKyAgICAgICAgbURhdGFiYXNlLnNldENvbm5lY3Rpb25Qb29sU2l6ZSgxMCk7CisgICAgICAgIGFzc2VydEVxdWFscygxMCwgbURhdGFiYXNlLm1Db25uZWN0aW9uUG9vbC5nZXRNYXhQb29sU2l6ZSgpKTsKKyAgICAgICAgLy8gY2FuJ3Qgc2V0IHBvb2wgc2l6ZSB0byA8IHRoZSB2YWx1ZSBhYm92ZQorICAgICAgICB0cnkgeworICAgICAgICAgICAgbURhdGFiYXNlLnNldENvbm5lY3Rpb25Qb29sU2l6ZSgxKTsKKyAgICAgICAgICAgIGZhaWwoIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleHBlY3RlZCIpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShlLmdldE1lc3NhZ2UoKS5jb250YWlucygibGVzcyB0aGFuIHRoZSBjdXJyZW50IG1heCB2YWx1ZSIpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIGEgdHJhbnNhY3Rpb24gc2hvdWxkIGJlIHN0YXJ0ZWQgYmVmb3JlIGEgc3RhbmRhbG9uZS11cGRhdGUvaW5zZXJ0L2RlbGV0ZSBzdGF0ZW1lbnQKKyAgICAgKi8KKyAgICBAU21hbGxUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN0YXJ0WGFjdEJlZm9yZVVwZGF0ZVNxbCgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIHJ1blRlc3RGb3JTdGFydFhhY3RCZWZvcmVVcGRhdGVTcWwoSU5TRVJUKTsKKyAgICAgICAgcnVuVGVzdEZvclN0YXJ0WGFjdEJlZm9yZVVwZGF0ZVNxbChVUERBVEUpOworICAgICAgICBydW5UZXN0Rm9yU3RhcnRYYWN0QmVmb3JlVXBkYXRlU3FsKERFTEVURSk7CisgICAgfQorICAgIHByaXZhdGUgdm9pZCBydW5UZXN0Rm9yU3RhcnRYYWN0QmVmb3JlVXBkYXRlU3FsKGludCBzdG10VHlwZSkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgY3JlYXRlVGFibGVBbmRDbGVhckNhY2hlKCk7CisKKyAgICAgICAgQ29udGVudFZhbHVlcyB2YWx1ZXMgPSBuZXcgQ29udGVudFZhbHVlcygpOworICAgICAgICAvLyBtYWtlIHNvbWUgY2hhbmdlcyB0byBkYXRhIGluIFRFU1RfVEFCTEUKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA1OyBpKyspIHsKKyAgICAgICAgICAgIHZhbHVlcy5wdXQoImkiLCBpKTsKKyAgICAgICAgICAgIHZhbHVlcy5wdXQoImoiLCAiaSIgKyBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7CisgICAgICAgICAgICBtRGF0YWJhc2UuaW5zZXJ0KFRFU1RfVEFCTEUsIG51bGwsIHZhbHVlcyk7CisgICAgICAgICAgICBzd2l0Y2ggKHN0bXRUeXBlKSB7CisgICAgICAgICAgICAgICAgY2FzZSBVUERBVEU6CisgICAgICAgICAgICAgICAgICAgIHZhbHVlcy5wdXQoImoiLCAidSIgKyBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7CisgICAgICAgICAgICAgICAgICAgIG1EYXRhYmFzZS51cGRhdGUoVEVTVF9UQUJMRSwgdmFsdWVzLCAiaSA9ICIgKyBpLCBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBERUxFVEU6CisgICAgICAgICAgICAgICAgICAgIG1EYXRhYmFzZS5kZWxldGUoVEVTVF9UQUJMRSwgImkgPSAxIiwgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIGRvIGEgcXVlcnkuIGV2ZW4gdGhvdWdoIHF1ZXJ5IHVzZXMgYSBkaWZmZXJlbnQgZGF0YWJhc2UgY29ubmVjdGlvbiwKKyAgICAgICAgLy8gaXQgc2hvdWxkIHN0aWxsIHNlZSB0aGUgYWJvdmUgY2hhbmdlcyB0byBkYXRhIGJlY2F1c2UgdGhlIGFib3ZlIHN0YW5kYWxvbmUKKyAgICAgICAgLy8gaW5zZXJ0L3VwZGF0ZS9kZWxldGVzIGFyZSBkb25lIGluIHRyYW5zYWN0aW9ucyBhdXRvbWF0aWNhbGx5LgorICAgICAgICBTdHJpbmcgc3FsID0gInNlbGVjdCBjb3VudCgqKSBmcm9tICIgKyBURVNUX1RBQkxFOworICAgICAgICBTUUxpdGVTdGF0ZW1lbnQgc3RtdCA9IG1EYXRhYmFzZS5jb21waWxlU3RhdGVtZW50KHNxbCk7CisgICAgICAgIGZpbmFsIGludCBleHBlY3RlZFZhbHVlID0gKHN0bXRUeXBlID09IERFTEVURSkgPyA0IDogNTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkVmFsdWUsIHN0bXQuc2ltcGxlUXVlcnlGb3JMb25nKCkpOworICAgICAgICBzdG10LmNsb3NlKCk7CisgICAgICAgIEN1cnNvciBjID0gbURhdGFiYXNlLnJhd1F1ZXJ5KHNxbCwgbnVsbCk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBjLmdldENvdW50KCkpOworICAgICAgICBjLm1vdmVUb0ZpcnN0KCk7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZFZhbHVlLCBjLmdldExvbmcoMCkpOworICAgICAgICBjLmNsb3NlKCk7CisKKyAgICAgICAgLy8gZG8gNSBtb3JlIGNoYW5nZXMgaW4gYSB0cmFuc2FjdGlvbiBidXQgZG8gYSBxdWVyeSBiZWZvcmUgYW5kIGFmdGVyIHRoZSBjb21taXQKKyAgICAgICAgbURhdGFiYXNlLmJlZ2luVHJhbnNhY3Rpb24oKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDEwOyBpIDwgMTU7IGkrKykgeworICAgICAgICAgICAgdmFsdWVzLnB1dCgiaSIsIGkpOworICAgICAgICAgICAgdmFsdWVzLnB1dCgiaiIsICJpIiArIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKKyAgICAgICAgICAgIG1EYXRhYmFzZS5pbnNlcnQoVEVTVF9UQUJMRSwgbnVsbCwgdmFsdWVzKTsKKyAgICAgICAgICAgIHN3aXRjaCAoc3RtdFR5cGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIFVQREFURToKKyAgICAgICAgICAgICAgICAgICAgdmFsdWVzLnB1dCgiaiIsICJ1IiArIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKKyAgICAgICAgICAgICAgICAgICAgbURhdGFiYXNlLnVwZGF0ZShURVNUX1RBQkxFLCB2YWx1ZXMsICJpID0gIiArIGksIG51bGwpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIERFTEVURToKKyAgICAgICAgICAgICAgICAgICAgbURhdGFiYXNlLmRlbGV0ZShURVNUX1RBQkxFLCAiaSA9IDEiLCBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbURhdGFiYXNlLnNldFRyYW5zYWN0aW9uU3VjY2Vzc2Z1bCgpOworICAgICAgICAvLyBkbyBhIHF1ZXJ5IGJlZm9yZSBjb21taXQgLSBzaG91bGQgc3RpbGwgaGF2ZSA1IHJvd3MKKyAgICAgICAgLy8gdGhpcyBxdWVyeSBzaG91bGQgcnVuIGluIGEgZGlmZmVyZW50IHRocmVhZCB0byBmb3JjZSBpdCB0byB1c2UgYSBkaWZmZXJlbnQgZGF0YWJhc2UKKyAgICAgICAgLy8gY29ubmVjdGlvbgorICAgICAgICBUaHJlYWQgdCA9IG5ldyBUaHJlYWQoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIFN0cmluZyBzcWwgPSAic2VsZWN0IGNvdW50KCopIGZyb20gIiArIFRFU1RfVEFCTEU7CisgICAgICAgICAgICAgICAgU1FMaXRlU3RhdGVtZW50IHN0bXQgPSBnZXREYigpLmNvbXBpbGVTdGF0ZW1lbnQoc3FsKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRWYWx1ZSwgc3RtdC5zaW1wbGVRdWVyeUZvckxvbmcoKSk7CisgICAgICAgICAgICAgICAgc3RtdC5jbG9zZSgpOworICAgICAgICAgICAgICAgIEN1cnNvciBjID0gZ2V0RGIoKS5yYXdRdWVyeShzcWwsIG51bGwpOworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBjLmdldENvdW50KCkpOworICAgICAgICAgICAgICAgIGMubW92ZVRvRmlyc3QoKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRWYWx1ZSwgYy5nZXRMb25nKDApKTsKKyAgICAgICAgICAgICAgICBjLmNsb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIHQuc3RhcnQoKTsKKyAgICAgICAgLy8gd2FpdCB1bnRpbCB0aGUgYWJvdmUgdGhyZWFkIGlzIGRvbmUKKyAgICAgICAgdC5qb2luKCk7CisgICAgICAgIC8vIGNvbW1pdCBhbmQgdGhlbiBxdWVyeS4gc2hvdWxkIHNlZSBjaGFuZ2VzIGZyb20gdGhlIHRyYW5zYWN0aW9uCisgICAgICAgIG1EYXRhYmFzZS5lbmRUcmFuc2FjdGlvbigpOworICAgICAgICBzdG10ID0gbURhdGFiYXNlLmNvbXBpbGVTdGF0ZW1lbnQoc3FsKTsKKyAgICAgICAgZmluYWwgaW50IGV4cGVjdGVkVmFsdWUyID0gKHN0bXRUeXBlID09IERFTEVURSkgPyA5IDogMTA7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZFZhbHVlMiwgc3RtdC5zaW1wbGVRdWVyeUZvckxvbmcoKSk7CisgICAgICAgIHN0bXQuY2xvc2UoKTsKKyAgICAgICAgYyA9IG1EYXRhYmFzZS5yYXdRdWVyeShzcWwsIG51bGwpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYy5nZXRDb3VudCgpKTsKKyAgICAgICAgYy5tb3ZlVG9GaXJzdCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRWYWx1ZTIsIGMuZ2V0TG9uZygwKSk7CisgICAgICAgIGMuY2xvc2UoKTsKKyAgICB9CisgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgU1FMaXRlRGF0YWJhc2UgZ2V0RGIoKSB7CisgICAgICAgIHJldHVybiBtRGF0YWJhc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCB0byBlbnN1cmUgdGhhdCByZWFkZXJzIGFyZSBhYmxlIHRvIHJlYWQgdGhlIGRhdGFiYXNlIGRhdGEgKG9sZCB2ZXJzaW9ucykKKyAgICAgKiBFVkVOIFdIRU4gdGhlIHdyaXRlciBpcyBpbiBhIHRyYW5zYWN0aW9uIG9uIHRoZSBzYW1lIGRhdGFiYXNlLgorICAgICAqPHA+CisgICAgICogVGhpcyB0ZXN0IHN0YXJ0cyAxIFdyaXRlciBhbmQgMiBSZWFkZXJzIGFuZCBzZXRzIHVwIGNvbm5lY3Rpb24gcG9vbCBmb3IgcmVhZGVycworICAgICAqIGJ5IGNhbGxpbmcgdGhlIG1ldGhvZCB7QGxpbmsgU1FMaXRlRGF0YWJhc2UjZW5hYmxlV3JpdGVBaGVhZExvZ2dpbmcoKX0uCisgICAgICogPHA+CisgICAgICogV3JpdGVyIGRvZXMgdGhlIGZvbGxvd2luZyBpbiBhIHRpZ2h0IGxvb3AKKyAgICAgKiA8cHJlPgorICAgICAqICAgICBiZWdpbiB0cmFuc2FjdGlvbgorICAgICAqICAgICBpbnNlcnQgaW50byB0YWJsZV8xCisgICAgICogICAgIGluc2VydCBpbnRvIHRhYmxlXzIKKyAgICAgKiAgICAgY29tbWl0CisgICAgICogPC9wcmU+CisgICAgICogPHA+CisgICAgICogQXMgbG9uZyBhIHRoZSB3cml0ZXIgaXMgYWxpdmUsIFJlYWRlcnMgZG8gdGhlIGZvbGxvd2luZyBpbiBhIHRpZ2h0IGxvb3AgYXQgdGhlIHNhbWUgdGltZQorICAgICAqIDxwcmU+CisgICAgICogICAgIFJlYWRlcl9LIGRvZXMgInNlbGVjdCBjb3VudCgqKSBmcm9tIHRhYmxlX0siICB3aGVyZSBLID0gMSBvciAyCisgICAgICogPC9wcmU+CisgICAgICogPHA+CisgICAgICogVGhlIHRlc3QgaXMgcnVuIGZvciBUSU1FX1RPX1JVTl9XQUxfVEVTVF9GT1Igc2VjLgorICAgICAqIDxwPgorICAgICAqIFRoZSB0ZXN0IGlzIHJlcGVhdGVkIGZvciBkaWZmZXJlbnQgY29ubmVjdGlvbi1wb29sLXNpemVzICgxLi4zKQorICAgICAqIDxwPgorICAgICAqIEFuZCBhdCB0aGUgZW5kIG9mIG9mIGVhY2ggdGVzdCwgdGhlIGZvbGxvd2luZyBzdGF0aXN0aWNzIGFyZSBwcmludGVkCisgICAgICogPHVsPgorICAgICAqICAgIDxsaT5jb25uZWN0aW9uLXBvb2wtc2l6ZTwvbGk+CisgICAgICogICAgPGxpPm51bWJlci1vZi10cmFuc2FjdGlvbnMgYnkgd3JpdGVyPC9saT4KKyAgICAgKiAgICA8bGk+bnVtYmVyIG9mIHJlYWRzIGJ5IHJlYWRlcl9LIHdoaWxlIHRoZSB3cml0ZXIgaXMgSU4gb3IgTk9ULUlOIHhhY3Rpb248L2xpPgorICAgICAqIDwvdWw+CisgICAgICovCisgICAgQExhcmdlVGVzdAorICAgIEBTdXBwcmVzcyAvLyBydW4gdGhpcyB0ZXN0IG9ubHkgaWYgeW91IG5lZWQgdG8gY29sbGVjdCB0aGUgbnVtYmVycyBmcm9tIHRoaXMgdGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb25jdXJyZW5jeUVmZmVjdHNPZkNvbm5Qb29sKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIHJ1biB0aGUgdGVzdCB3aXRoIHNxbGl0ZSBXQUwgZW5hYmxlCisgICAgICAgIHJ1bkNvbm5lY3Rpb25Qb29sVGVzdCh0cnVlKTsKKworICAgICAgICAvLyBydW4gdGhlIHNhbWUgdGVzdCBXSVRIT1VUIHNxbGl0ZSBXQUwgZW5hYmxlZAorICAgICAgICBydW5Db25uZWN0aW9uUG9vbFRlc3QoZmFsc2UpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBydW5Db25uZWN0aW9uUG9vbFRlc3QoYm9vbGVhbiB1c2VXYWwpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpbnQgTSA9IDM7CisgICAgICAgIFN0cmluZ0J1aWxkZXJbXSBidWZmID0gbmV3IFN0cmluZ0J1aWxkZXJbTV07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTTsgaSsrKSB7CisgICAgICAgICAgICBpZiAodXNlV2FsKSB7CisgICAgICAgICAgICAgICAgLy8gc2V0IHVwIGNvbm5lY3Rpb24gcG9vbAorICAgICAgICAgICAgICAgIG1EYXRhYmFzZS5lbmFibGVXcml0ZUFoZWFkTG9nZ2luZygpOworICAgICAgICAgICAgICAgIG1EYXRhYmFzZS5zZXRDb25uZWN0aW9uUG9vbFNpemUoaSArIDEpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtRGF0YWJhc2UuZGlzYWJsZVdyaXRlQWhlYWRMb2dnaW5nKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiQ1JFQVRFIFRBQkxFIHQxIChpIGludCwgaiBpbnQpOyIpOworICAgICAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoIkNSRUFURSBUQUJMRSB0MiAoaSBpbnQsIGogaW50KTsiKTsKKyAgICAgICAgICAgIG1EYXRhYmFzZS5iZWdpblRyYW5zYWN0aW9uKCk7CisgICAgICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IDU7IGsrKykgeworICAgICAgICAgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJpbnNlcnQgaW50byB0MSB2YWx1ZXMoPyw/KTsiLCBuZXcgU3RyaW5nW10ge2srIiIsIGsrIiJ9KTsKKyAgICAgICAgICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiaW5zZXJ0IGludG8gdDIgdmFsdWVzKD8sPyk7IiwgbmV3IFN0cmluZ1tdIHtrKyIiLCBrKyIifSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtRGF0YWJhc2Uuc2V0VHJhbnNhY3Rpb25TdWNjZXNzZnVsKCk7CisgICAgICAgICAgICBtRGF0YWJhc2UuZW5kVHJhbnNhY3Rpb24oKTsKKworICAgICAgICAgICAgLy8gc3RhcnQgYSB3cml0ZXIKKyAgICAgICAgICAgIFdyaXRlciB3ID0gbmV3IFdyaXRlcihtRGF0YWJhc2UpOworCisgICAgICAgICAgICAvLyBpbml0aWFsaXplIGFuIGFycmF5IG9mIGNvdW50ZXJzIHRvIGJlIHBhc3NlZCB0byB0aGUgcmVhZGVycworICAgICAgICAgICAgUmVhZGVyIHIxID0gbmV3IFJlYWRlcihtRGF0YWJhc2UsICJ0MSIsIHcsIDApOworICAgICAgICAgICAgUmVhZGVyIHIyID0gbmV3IFJlYWRlcihtRGF0YWJhc2UsICJ0MiIsIHcsIDEpOworICAgICAgICAgICAgdy5zdGFydCgpOworICAgICAgICAgICAgcjEuc3RhcnQoKTsKKyAgICAgICAgICAgIHIyLnN0YXJ0KCk7CisKKyAgICAgICAgICAgIC8vIHdhaXQgZm9yIGFsbCB0aHJlYWRzIHRvIGRpZQorICAgICAgICAgICAgdy5qb2luKCk7CisgICAgICAgICAgICByMS5qb2luKCk7CisgICAgICAgICAgICByMi5qb2luKCk7CisKKyAgICAgICAgICAgIC8vIHByaW50IHRoZSBzdGF0cworICAgICAgICAgICAgaW50W11bXSBjb3VudHMgPSBnZXRDb3VudHMoKTsKKyAgICAgICAgICAgIGJ1ZmZbaV0gPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgYnVmZltpXS5hcHBlbmQoImNvbm5wb29sLXNpemUgPSAiKTsKKyAgICAgICAgICAgIGJ1ZmZbaV0uYXBwZW5kKGkgKyAxKTsKKyAgICAgICAgICAgIGJ1ZmZbaV0uYXBwZW5kKCIsIG51bSB4YWN0cyBieSB3cml0ZXIgPSAiKTsKKyAgICAgICAgICAgIGJ1ZmZbaV0uYXBwZW5kKGdldE51bVhhY3RzKCkpOworICAgICAgICAgICAgYnVmZltpXS5hcHBlbmQoIiwgbnVtLXJlYWRzLWluLXhhY3QvTk9ULWluLXhhY3QgYnkgcmVhZGVyMSA9ICIpOworICAgICAgICAgICAgYnVmZltpXS5hcHBlbmQoY291bnRzWzBdWzFdICsgIi8iICsgY291bnRzWzBdWzBdKTsKKyAgICAgICAgICAgIGJ1ZmZbaV0uYXBwZW5kKCIsIGJ5IHJlYWRlcjIgPSAiKTsKKyAgICAgICAgICAgIGJ1ZmZbaV0uYXBwZW5kKGNvdW50c1sxXVsxXSArICIvIiArIGNvdW50c1sxXVswXSk7CisKKyAgICAgICAgICAgIExvZy5pKFRBRywgImRvbmUgdGVzdGluZyBmb3IgY29ubi1wb29sLXNpemUgb2YgIiArIChpKzEpKTsKKworICAgICAgICAgICAgZGJUZWFyZG93bigpOworICAgICAgICAgICAgZGJTZXRVcCgpOworICAgICAgICB9CisgICAgICAgIExvZy5pKFRBRywgImR1cmF0aW9uIG9mIHRlc3QgIiArIFRJTUVfVE9fUlVOX1dBTF9URVNUX0ZPUiArICIgc2VjIik7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTTsgaSsrKSB7CisgICAgICAgICAgICBMb2cuaShUQUcsIGJ1ZmZbaV0udG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaW5YYWN0ID0gZmFsc2U7CisgICAgcHJpdmF0ZSBpbnQgbnVtWGFjdHM7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRJTUVfVE9fUlVOX1dBTF9URVNUX0ZPUiA9IDE1OyAvLyBudW0gc2VjIHRoaXMgdGVzdCBzaG91bGQgcnVuCisgICAgcHJpdmF0ZSBpbnRbXVtdIGNvdW50cyA9IG5ldyBpbnRbMl1bMl07CisKKyAgICBwcml2YXRlIHN5bmNocm9uaXplZCBib29sZWFuIGluWGFjdCgpIHsKKyAgICAgICAgcmV0dXJuIGluWGFjdDsKKyAgICB9CisKKyAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIHNldEluWGFjdEZsYWcoYm9vbGVhbiBmbGFnKSB7CisgICAgICAgIGluWGFjdCA9IGZsYWc7CisgICAgfQorCisgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBzZXRDb3VudHMoaW50IHJlYWRlck51bSwgaW50W10gbnVtUmVhZHMpIHsKKyAgICAgICAgY291bnRzW3JlYWRlck51bV1bMF0gPSBudW1SZWFkc1swXTsKKyAgICAgICAgY291bnRzW3JlYWRlck51bV1bMV0gPSBudW1SZWFkc1sxXTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN5bmNocm9uaXplZCBpbnRbXVtdIGdldENvdW50cygpIHsKKyAgICAgICAgcmV0dXJuIGNvdW50czsKKyAgICB9CisKKyAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIHNldE51bVhhY3RzKGludCBudW0pIHsKKyAgICAgICAgbnVtWGFjdHMgPSBudW07CisgICAgfQorCisgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgaW50IGdldE51bVhhY3RzKCkgeworICAgICAgICByZXR1cm4gbnVtWGFjdHM7CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBXcml0ZXIgZXh0ZW5kcyBUaHJlYWQgeworICAgICAgICBwcml2YXRlIFNRTGl0ZURhdGFiYXNlIGRiID0gbnVsbDsKKyAgICAgICAgcHVibGljIFdyaXRlcihTUUxpdGVEYXRhYmFzZSBkYikgeworICAgICAgICAgICAgdGhpcy5kYiA9IGRiOworICAgICAgICB9CisgICAgICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAvLyBpbiBhIGxvb3AsIGZvciBOIHNlYywgZG8gdGhlIGZvbGxvd2luZworICAgICAgICAgICAgLy8gICAgQkVHSU4gdHJhbnNhY3Rpb24KKyAgICAgICAgICAgIC8vICAgIGluc2VydCBpbnRvIHRhYmxlIHQxLCB0MgorICAgICAgICAgICAgLy8gICAgQ29tbWl0CisgICAgICAgICAgICBsb25nIG5vdyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICAgICAgaW50IGs7CisgICAgICAgICAgICBmb3IgKGsgPSAwOyhTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIG5vdykgLyAxMDAwIDwgVElNRV9UT19SVU5fV0FMX1RFU1RfRk9SOyBrKyspIHsKKyAgICAgICAgICAgICAgICBkYi5iZWdpblRyYW5zYWN0aW9uTm9uRXhjbHVzaXZlKCk7CisgICAgICAgICAgICAgICAgc2V0SW5YYWN0RmxhZyh0cnVlKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgZGIuZXhlY1NRTCgiaW5zZXJ0IGludG8gdDEgdmFsdWVzKD8sPyk7IiwgbmV3IFN0cmluZ1tdIHtpKyIiLCBpKyIifSk7CisgICAgICAgICAgICAgICAgICAgIGRiLmV4ZWNTUUwoImluc2VydCBpbnRvIHQyIHZhbHVlcyg/LD8pOyIsIG5ldyBTdHJpbmdbXSB7aSsiIiwgaSsiIn0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkYi5zZXRUcmFuc2FjdGlvblN1Y2Nlc3NmdWwoKTsKKyAgICAgICAgICAgICAgICBzZXRJblhhY3RGbGFnKGZhbHNlKTsKKyAgICAgICAgICAgICAgICBkYi5lbmRUcmFuc2FjdGlvbigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0TnVtWGFjdHMoayk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIFJlYWRlciBleHRlbmRzIFRocmVhZCB7CisgICAgICAgIHByaXZhdGUgU1FMaXRlRGF0YWJhc2UgZGIgPSBudWxsOworICAgICAgICBwcml2YXRlIFN0cmluZyB0YWJsZSA9IG51bGw7CisgICAgICAgIHByaXZhdGUgV3JpdGVyIHcgPSBudWxsOworICAgICAgICBwcml2YXRlIGludCByZWFkZXJOdW07CisgICAgICAgIHByaXZhdGUgaW50W10gbnVtUmVhZHMgPSBuZXcgaW50WzJdOworICAgICAgICBwdWJsaWMgUmVhZGVyKFNRTGl0ZURhdGFiYXNlIGRiLCBTdHJpbmcgdGFibGUsIFdyaXRlciB3LCBpbnQgcmVhZGVyTnVtKSB7CisgICAgICAgICAgICB0aGlzLmRiID0gZGI7CisgICAgICAgICAgICB0aGlzLnRhYmxlID0gdGFibGU7CisgICAgICAgICAgICB0aGlzLncgPSB3OworICAgICAgICAgICAgdGhpcy5yZWFkZXJOdW0gPSByZWFkZXJOdW07CisgICAgICAgIH0KKyAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgIC8vIHdoaWxlIHRoZSB3cml0ZSBpcyBhbGl2ZSwgaW4gYSBsb29wIGRvIHRoZSBxdWVyeSBvbiBhIHRhYmxlCisgICAgICAgICAgICB3aGlsZSAody5pc0FsaXZlKCkpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5sb25nRm9yUXVlcnkoZGIsICJzZWxlY3QgY291bnQoKikgZnJvbSAiICsgdGhpcy50YWJsZSwgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBjb3VudCBvZiByZWFkcworICAgICAgICAgICAgICAgICAgICBudW1SZWFkc1tpblhhY3QoKSA/IDEgOiAwXSArPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldENvdW50cyhyZWFkZXJOdW0sIG51bVJlYWRzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ2xhc3NUb1Rlc3RTcWxDb21waWxhdGlvbkFuZENhY2hpbmcgZXh0ZW5kcyBTUUxpdGVQcm9ncmFtIHsKKyAgICAgICAgcHJpdmF0ZSBDbGFzc1RvVGVzdFNxbENvbXBpbGF0aW9uQW5kQ2FjaGluZyhTUUxpdGVEYXRhYmFzZSBkYiwgU3RyaW5nIHNxbCkgeworICAgICAgICAgICAgc3VwZXIoZGIsIHNxbCk7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIHN0YXRpYyBDbGFzc1RvVGVzdFNxbENvbXBpbGF0aW9uQW5kQ2FjaGluZyBjcmVhdGUoU1FMaXRlRGF0YWJhc2UgZGIsIFN0cmluZyBzcWwpIHsKKyAgICAgICAgICAgIGRiLmxvY2soKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDbGFzc1RvVGVzdFNxbENvbXBpbGF0aW9uQW5kQ2FjaGluZyhkYiwgc3FsKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgZGIudW5sb2NrKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAU21hbGxUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdExydUNhY2hpbmdPZlNxbGl0ZUNvbXBpbGVkU3FsT2JqcygpIHsKKyAgICAgICAgY3JlYXRlVGFibGVBbmRDbGVhckNhY2hlKCk7CisgICAgICAgIC8vIHNldCBjYWNoZSBzaXplCisgICAgICAgIGludCBOID0gU1FMaXRlRGF0YWJhc2UuTUFYX1NRTF9DQUNIRV9TSVpFOworICAgICAgICBtRGF0YWJhc2Uuc2V0TWF4U3FsQ2FjaGVTaXplKE4pOworCisgICAgICAgIC8vIGRvIE4rMSBxdWVyaWVzIC0gYW5kIHdoZW4gdGhlIDB0aCBlbnRyeSBpcyByZW1vdmVkIGZyb20gTFJVIGNhY2hlIGR1ZSB0byB0aGUKKyAgICAgICAgLy8gaW5zZXJ0aW9uIG9mIChOKzEpdGggZW50cnksIG1ha2Ugc3VyZSAwdGggZW50cnkgaXMgY2xvc2VkCisgICAgICAgIEFycmF5TGlzdDxJbnRlZ2VyPiBzdG10T2JqcyA9IG5ldyBBcnJheUxpc3Q8SW50ZWdlcj4oKTsKKyAgICAgICAgQXJyYXlMaXN0PFN0cmluZz4gc3FsU3RyaW5ncyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworICAgICAgICBpbnQgc3RtdDAgPSAwOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE4rMTsgaSsrKSB7CisgICAgICAgICAgICBTdHJpbmcgcyA9ICJpbnNlcnQgaW50byB0ZXN0IHZhbHVlcygiICsgaSArICIsPyk7IjsKKyAgICAgICAgICAgIHNxbFN0cmluZ3MuYWRkKHMpOworICAgICAgICAgICAgQ2xhc3NUb1Rlc3RTcWxDb21waWxhdGlvbkFuZENhY2hpbmcgYyA9CisgICAgICAgICAgICAgICAgICAgIENsYXNzVG9UZXN0U3FsQ29tcGlsYXRpb25BbmRDYWNoaW5nLmNyZWF0ZShtRGF0YWJhc2UsIHMpOworICAgICAgICAgICAgaW50IG4gPSBjLmdldFNxbFN0YXRlbWVudElkKCk7CisgICAgICAgICAgICBzdG10T2Jqcy5hZGQoaSwgbik7CisgICAgICAgICAgICBpZiAoaSA9PSAwKSB7CisgICAgICAgICAgICAgICAgLy8gc2F2ZSB0aGUgc3RhdGVtZW50SWQgb2YgdGhpcyBvYmouIHdlIHdhbnQgdG8gbWFrZSBzdXJlIGl0IGlzIHRocm93biBvdXQgb2YKKyAgICAgICAgICAgICAgICAvLyB0aGUgY2FjaGUgYXQgdGhlIGVuZCBvZiB0aGlzIHRlc3QuCisgICAgICAgICAgICAgICAgc3RtdDAgPSBuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYy5jbG9zZSgpOworICAgICAgICB9CisgICAgICAgIC8vIGlzIDAndGggZW50cnkgb3V0IG9mIHRoZSBjYWNoZT8gaXQgc2hvdWxkIGJlIGluIHRoZSBsaXN0IG9mIHN0YXRlbWVudElkcworICAgICAgICAvLyBjb3JyZXNwb25kaW5nIHRvIHRoZSBwcmUtY29tcGlsZWQgc3FsIHN0YXRlbWVudHMgdG8gYmUgZmluYWxpemVkLgorICAgICAgICBhc3NlcnRUcnVlKG1EYXRhYmFzZS5nZXRRdWV1ZWRVcFN0bXRMaXN0KCkuY29udGFpbnMoc3RtdDApKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBOKzE7IGkrKykgeworICAgICAgICAgICAgU1FMaXRlQ29tcGlsZWRTcWwgY29tcFNxbCA9IG1EYXRhYmFzZS5nZXRDb21waWxlZFN0YXRlbWVudEZvclNxbChzcWxTdHJpbmdzLmdldChpKSk7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKGNvbXBTcWwpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzdG10T2Jqcy5jb250YWlucyhjb21wU3FsLm5TdGF0ZW1lbnQpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBNZWRpdW1UZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERiQ2xvc2VSZWxlYXNpbmdBbGxDYWNoZWRTcWwoKSB7CisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJDUkVBVEUgVEFCTEUgdGVzdCAoX2lkIElOVEVHRVIgUFJJTUFSWSBLRVksIHRleHQxIFRFWFQsIHRleHQyIFRFWFQsICIgKworICAgICAgICAgICAgICAgICJudW0xIElOVEVHRVIsIG51bTIgSU5URUdFUiwgaW1hZ2UgQkxPQik7Iik7CisgICAgICAgIGZpbmFsIFN0cmluZyBzdGF0ZW1lbnQgPSAiREVMRVRFIEZST00gdGVzdCBXSEVSRSBfaWQ9PzsiOworICAgICAgICBTUUxpdGVTdGF0ZW1lbnQgc3RhdGVtZW50RG9Ob3RDbG9zZSA9IG1EYXRhYmFzZS5jb21waWxlU3RhdGVtZW50KHN0YXRlbWVudCk7CisgICAgICAgIHN0YXRlbWVudERvTm90Q2xvc2UuYmluZExvbmcoMSwgMSk7CisgICAgICAgIC8qIGRvIG5vdCBjbG9zZSBzdGF0ZW1lbnREb05vdENsb3NlIG9iamVjdC4KKyAgICAgICAgICogVGhhdCBzaG91bGQgbGVhdmUgaXQgaW4gU1FMaXRlRGF0YWJhc2UubVByb2dyYW1zLgorICAgICAgICAgKiBtRGF0YWJhc2UuY2xvc2UoKSBpbiB0ZWFyRG93bigpIHNob3VsZCByZWxlYXNlIGl0LgorICAgICAgICAgKi8KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY3JlYXRlVGFibGVBbmRDbGVhckNhY2hlKCkgeworICAgICAgICBtRGF0YWJhc2UuZGlzYWJsZVdyaXRlQWhlYWRMb2dnaW5nKCk7CisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJEUk9QIFRBQkxFIElGIEVYSVNUUyAiICsgVEVTVF9UQUJMRSk7CisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJDUkVBVEUgVEFCTEUgIiArIFRFU1RfVEFCTEUgKyAiIChpIGludCwgaiBpbnQpOyIpOworICAgICAgICBtRGF0YWJhc2UuZW5hYmxlV3JpdGVBaGVhZExvZ2dpbmcoKTsKKyAgICAgICAgbURhdGFiYXNlLmxvY2soKTsKKyAgICAgICAgLy8gZmx1c2ggdGhlIGFib3ZlIHN0YXRlbWVudCBmcm9tIGNhY2hlIGFuZCBjbG9zZSBhbGwgdGhlIHBlbmRpbmcgc3RhdGVtZW50cyB0byBiZSByZWxlYXNlZAorICAgICAgICBtRGF0YWJhc2UuZGVhbGxvY0NhY2hlZFNxbFN0YXRlbWVudHMoKTsKKyAgICAgICAgbURhdGFiYXNlLmNsb3NlUGVuZGluZ1N0YXRlbWVudHMoKTsKKyAgICAgICAgbURhdGFiYXNlLnVubG9jaygpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbURhdGFiYXNlLmdldFF1ZXVlZFVwU3RtdExpc3QoKS5zaXplKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHRlc3QgdG8gbWFrZSBzdXJlIHRoZSBzdGF0ZW1lbnQgZmluYWxpemF0aW9ucyBhcmUgbm90IGRvbmUgcmlnaHQgYXdheSBidXQKKyAgICAgKiBwaWdneS1iYWNrZWQgb250byB0aGUgbmV4dCBzcWwgc3RhdGVtZW50IGV4ZWN1dGlvbiBvbiB0aGUgc2FtZSBkYXRhYmFzZS4KKyAgICAgKi8KKyAgICBAU21hbGxUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN0YXRlbWVudENsb3NlKCkgeworICAgICAgICBjcmVhdGVUYWJsZUFuZENsZWFyQ2FjaGUoKTsKKyAgICAgICAgLy8gZmlsbCB1cCBzdGF0ZW1lbnQgY2FjaGUgaW4gbURhdGFiYXNlCisgICAgICAgIGludCBOID0gU1FMaXRlRGF0YWJhc2UuTUFYX1NRTF9DQUNIRV9TSVpFOworICAgICAgICBtRGF0YWJhc2Uuc2V0TWF4U3FsQ2FjaGVTaXplKE4pOworICAgICAgICBTUUxpdGVTdGF0ZW1lbnQgc3RtdDsKKyAgICAgICAgaW50IHN0bXQwSWQgPSAwOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE47IGkgKyspIHsKKyAgICAgICAgICAgIENsYXNzVG9UZXN0U3FsQ29tcGlsYXRpb25BbmRDYWNoaW5nIGMgPQorICAgICAgICAgICAgICAgICAgICBDbGFzc1RvVGVzdFNxbENvbXBpbGF0aW9uQW5kQ2FjaGluZy5jcmVhdGUobURhdGFiYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnNlcnQgaW50byB0ZXN0IHZhbHVlcygiICsgaSArICIsID8pOyIpOworICAgICAgICAgICAgLy8ga2VlcCB0cmFjayBvZiAwdGggZW50cnkKKyAgICAgICAgICAgIGlmIChpID09IDApIHsKKyAgICAgICAgICAgICAgICBzdG10MElkID0gYy5nZXRTcWxTdGF0ZW1lbnRJZCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYy5jbG9zZSgpOworICAgICAgICB9CisKKyAgICAgICAgLy8gYWRkIG9uZSBtb3JlIHRvIHRoZSBjYWNoZSAtIGFuZCB0aGUgYWJvdmUgJ3N0bXQwSWQnIHNob3VsZCBmYWxsIG91dCBvZiBjYWNoZQorICAgICAgICBDbGFzc1RvVGVzdFNxbENvbXBpbGF0aW9uQW5kQ2FjaGluZyBzdG10MSA9CisgICAgICAgICAgICAgICAgQ2xhc3NUb1Rlc3RTcWxDb21waWxhdGlvbkFuZENhY2hpbmcuY3JlYXRlKG1EYXRhYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJpbnNlcnQgaW50byB0ZXN0IHZhbHVlcygxMDAsID8pOyIpOworICAgICAgICBzdG10MS5jbG9zZSgpOworCisgICAgICAgIC8vIHRoZSBhYm92ZSBjbG9zZSgpIHNob3VsZCBoYXZlIHF1ZXVlZFVwIHRoZSBzdGF0ZW1lbnQgZm9yIGZpbmFsaXphdGlvbgorICAgICAgICBBcnJheUxpc3Q8SW50ZWdlcj4gc3RhdGVtZW50SWRzID0gbURhdGFiYXNlLmdldFF1ZXVlZFVwU3RtdExpc3QoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShzdGF0ZW1lbnRJZHMuY29udGFpbnMoc3RtdDBJZCkpOworCisgICAgICAgIC8vIGV4ZWN1dGUgc29tZXRoaW5nIHRvIHNlZSBpZiB0aGlzIHN0YXRlbWVudCBnZXRzIGZpbmFsaXplZAorICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiZGVsZXRlIGZyb20gdGVzdCB3aGVyZSBpID0gMTA7Iik7CisgICAgICAgIHN0YXRlbWVudElkcyA9IG1EYXRhYmFzZS5nZXRRdWV1ZWRVcFN0bXRMaXN0KCk7CisgICAgICAgIGFzc2VydEZhbHNlKHN0YXRlbWVudElkcy5jb250YWlucyhzdG10MElkKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogc2FtZSBhcyBhYm92ZSAtIGV4Y2VwdCB0aGF0IHRoZSBzdGF0ZW1lbnQgdG8gYmUgZmluYWxpemVkIGlzIGZyb20gVGhyZWFkICMgMS4KKyAgICAgKiBhbmQgaXQgaXMgZXZlbnR1YWxseSBmaW5hbGl6ZWQgaW4gVGhyZWFkICMgMiB3aGVuIGl0IGV4ZWN1dGVzIGEgU1FMIHN0YXRlbWVudC4KKyAgICAgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uCisgICAgICovCisgICAgQExhcmdlVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdGF0ZW1lbnRDbG9zZURpZmZUaHJlYWQoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBjcmVhdGVUYWJsZUFuZENsZWFyQ2FjaGUoKTsKKyAgICAgICAgZmluYWwgaW50IE4gPSBTUUxpdGVEYXRhYmFzZS5NQVhfU1FMX0NBQ0hFX1NJWkU7CisgICAgICAgIG1EYXRhYmFzZS5zZXRNYXhTcWxDYWNoZVNpemUoTik7CisgICAgICAgIC8vIGZpbGwgdXAgc3RhdGVtZW50IGNhY2hlIGluIG1EYXRhYmFzZSBpbiBhIHRocmVhZAorICAgICAgICBUaHJlYWQgdDEgPSBuZXcgVGhyZWFkKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICBTUUxpdGVTdGF0ZW1lbnQgc3RtdDsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE47IGkrKykgeworICAgICAgICAgICAgICAgICAgICBDbGFzc1RvVGVzdFNxbENvbXBpbGF0aW9uQW5kQ2FjaGluZyBjID0KKyAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzVG9UZXN0U3FsQ29tcGlsYXRpb25BbmRDYWNoaW5nLmNyZWF0ZShnZXREYigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5zZXJ0IGludG8gdGVzdCB2YWx1ZXMoIiArIGkgKyAiLCA/KTsiKTsKKyAgICAgICAgICAgICAgICAgICAgLy8ga2VlcCB0cmFjayBvZiAwdGggZW50cnkKKyAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RtdDBJZCA9IGMuZ2V0U3FsU3RhdGVtZW50SWQoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICB0MS5zdGFydCgpOworICAgICAgICAvLyB3YWl0IGZvciB0aGUgdGhyZWFkIHRvIGZpbmlzaAorICAgICAgICB0MS5qb2luKCk7CisgICAgICAgIC8vIG1EYXRhYmFzZSBzaG91bGRuJ3QgaGF2ZSBhbnkgc3RhdGVtZW50cyB0byBiZSByZWxlYXNlZAorICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbURhdGFiYXNlLmdldFF1ZXVlZFVwU3RtdExpc3QoKS5zaXplKCkpOworCisgICAgICAgIC8vIGFkZCBvbmUgbW9yZSB0byB0aGUgY2FjaGUgLSBhbmQgdGhlIGFib3ZlICdzdG10MElkJyBzaG91bGQgZmFsbCBvdXQgb2YgY2FjaGUKKyAgICAgICAgLy8ganVzdCBmb3IgdGhlIGhlY2sgb2YgaXQsIGRvIGl0IGluIGEgc2VwYXJhdGUgdGhyZWFkCisgICAgICAgIFRocmVhZCB0MiA9IG5ldyBUaHJlYWQoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIENsYXNzVG9UZXN0U3FsQ29tcGlsYXRpb25BbmRDYWNoaW5nIHN0bXQxID0KKyAgICAgICAgICAgICAgICAgICAgQ2xhc3NUb1Rlc3RTcWxDb21waWxhdGlvbkFuZENhY2hpbmcuY3JlYXRlKGdldERiKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluc2VydCBpbnRvIHRlc3QgdmFsdWVzKDEwMCwgPyk7Iik7CisgICAgICAgICAgICAgICAgc3RtdDEuYmluZExvbmcoMSwgMSk7CisgICAgICAgICAgICAgICAgc3RtdDEuY2xvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgdDIuc3RhcnQoKTsKKyAgICAgICAgdDIuam9pbigpOworCisgICAgICAgIC8vIGNsb3NlKCkgaW4gdGhlIGFib3ZlIHRocmVhZCBzaG91bGQgaGF2ZSBxdWV1ZWRVcCB0aGUgc3RtdDBJZCBmb3IgZmluYWxpemF0aW9uCisgICAgICAgIEFycmF5TGlzdDxJbnRlZ2VyPiBzdGF0ZW1lbnRJZHMgPSBnZXREYigpLmdldFF1ZXVlZFVwU3RtdExpc3QoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShzdGF0ZW1lbnRJZHMuY29udGFpbnMoZ2V0U3RtdDBJZCgpKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBzdGF0ZW1lbnRJZHMuc2l6ZSgpKTsKKworICAgICAgICAvLyBleGVjdXRlIHNvbWV0aGluZyB0byBzZWUgaWYgdGhpcyBzdGF0ZW1lbnQgZ2V0cyBmaW5hbGl6ZWQKKyAgICAgICAgLy8gYWdhaW4gZG8gaXQgaW4gYSBzZXBhcmF0ZSB0aHJlYWQKKyAgICAgICAgVGhyZWFkIHQzID0gbmV3IFRocmVhZCgpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgZ2V0RGIoKS5leGVjU1FMKCJkZWxldGUgZnJvbSB0ZXN0IHdoZXJlIGkgPSAxMDsiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgdDMuc3RhcnQoKTsKKyAgICAgICAgdDMuam9pbigpOworCisgICAgICAgIC8vIGlzIHRoZSBzdGF0ZW1lbnQgZmluYWxpemVkPworICAgICAgICBzdGF0ZW1lbnRJZHMgPSBnZXREYigpLmdldFF1ZXVlZFVwU3RtdExpc3QoKTsKKyAgICAgICAgYXNzZXJ0RmFsc2Uoc3RhdGVtZW50SWRzLmNvbnRhaW5zKGdldFN0bXQwSWQoKSkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9sYXRpbGUgaW50IHN0bXQwSWQgPSAwOworICAgIHByaXZhdGUgc3luY2hyb25pemVkIGludCBnZXRTdG10MElkKCkgeworICAgICAgICByZXR1cm4gdGhpcy5zdG10MElkOworICAgIH0KKworICAgIC8qKgorICAgICAqIHNhbWUgYXMgYWJvdmUgLSBleGNlcHQgdGhhdCB0aGUgcXVldWUgb2Ygc3RhdGVtZW50cyB0byBiZSBmaW5hbGl6ZWQgYXJlIGZpbmFsaXplZAorICAgICAqIGJ5IGRhdGFiYXNlIGNsb3NlKCkgb3BlcmF0aW9uLgorICAgICAqLworICAgIEBMYXJnZVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhdGVtZW50Q2xvc2VCeURiQ2xvc2UoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBjcmVhdGVUYWJsZUFuZENsZWFyQ2FjaGUoKTsKKyAgICAgICAgLy8gZmlsbCB1cCBzdGF0ZW1lbnQgY2FjaGUgaW4gbURhdGFiYXNlIGluIGEgdGhyZWFkCisgICAgICAgIFRocmVhZCB0MSA9IG5ldyBUaHJlYWQoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIGludCBOID0gU1FMaXRlRGF0YWJhc2UuTUFYX1NRTF9DQUNIRV9TSVpFOworICAgICAgICAgICAgICAgIGdldERiKCkuc2V0TWF4U3FsQ2FjaGVTaXplKE4pOworICAgICAgICAgICAgICAgIFNRTGl0ZVN0YXRlbWVudCBzdG10OworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSArKykgeworICAgICAgICAgICAgICAgICAgICBDbGFzc1RvVGVzdFNxbENvbXBpbGF0aW9uQW5kQ2FjaGluZyBjID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc1RvVGVzdFNxbENvbXBpbGF0aW9uQW5kQ2FjaGluZy5jcmVhdGUoZ2V0RGIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnNlcnQgaW50byB0ZXN0IHZhbHVlcygiICsgaSArICIsID8pOyIpOworICAgICAgICAgICAgICAgICAgICAvLyBrZWVwIHRyYWNrIG9mIDB0aCBlbnRyeQorICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdG10MElkID0gYy5nZXRTcWxTdGF0ZW1lbnRJZCgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGMuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIHQxLnN0YXJ0KCk7CisgICAgICAgIC8vIHdhaXQgZm9yIHRoZSB0aHJlYWQgdG8gZmluaXNoCisgICAgICAgIHQxLmpvaW4oKTsKKworICAgICAgICAvLyBhZGQgb25lIG1vcmUgdG8gdGhlIGNhY2hlIC0gYW5kIHRoZSBhYm92ZSAnc3RtdDBJZCcgc2hvdWxkIGZhbGwgb3V0IG9mIGNhY2hlCisgICAgICAgIC8vIGp1c3QgZm9yIHRoZSBoZWNrIG9mIGl0LCBkbyBpdCBpbiBhIHNlcGFyYXRlIHRocmVhZAorICAgICAgICBUaHJlYWQgdDIgPSBuZXcgVGhyZWFkKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICBDbGFzc1RvVGVzdFNxbENvbXBpbGF0aW9uQW5kQ2FjaGluZyBzdG10MSA9CisgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc1RvVGVzdFNxbENvbXBpbGF0aW9uQW5kQ2FjaGluZy5jcmVhdGUoZ2V0RGIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluc2VydCBpbnRvIHRlc3QgdmFsdWVzKDEwMCwgPyk7Iik7CisgICAgICAgICAgICAgICAgc3RtdDEuYmluZExvbmcoMSwgMSk7CisgICAgICAgICAgICAgICAgc3RtdDEuY2xvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgdDIuc3RhcnQoKTsKKyAgICAgICAgdDIuam9pbigpOworCisgICAgICAgIC8vIGNsb3NlKCkgaW4gdGhlIGFib3ZlIHRocmVhZCBzaG91bGQgaGF2ZSBxdWV1ZWRVcCB0aGUgc3RhdGVtZW50IGZvciBmaW5hbGl6YXRpb24KKyAgICAgICAgQXJyYXlMaXN0PEludGVnZXI+IHN0YXRlbWVudElkcyA9IGdldERiKCkuZ2V0UXVldWVkVXBTdG10TGlzdCgpOworICAgICAgICBhc3NlcnRUcnVlKGdldFN0bXQwSWQoKSA+IDApOworICAgICAgICBhc3NlcnRUcnVlKHN0YXRlbWVudElkcy5jb250YWlucyhzdG10MElkKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBzdGF0ZW1lbnRJZHMuc2l6ZSgpKTsKKworICAgICAgICAvLyBjbG9zZSB0aGUgZGF0YWJhc2UuIGV2ZXJ5dGhpbmcgZnJvbSBtQ2xvc2VkU3RhdGVtZW50SWRzIGluIG1EYXRhYmFzZQorICAgICAgICAvLyBzaG91bGQgYmUgZmluYWxpemVkIGFuZCBjbGVhcmVkIGZyb20gdGhlIGxpc3QKKyAgICAgICAgLy8gYWdhaW4gZG8gaXQgaW4gYSBzZXBhcmF0ZSB0aHJlYWQKKyAgICAgICAgVGhyZWFkIHQzID0gbmV3IFRocmVhZCgpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgZ2V0RGIoKS5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICB0My5zdGFydCgpOworICAgICAgICB0My5qb2luKCk7CisKKyAgICAgICAgLy8gY2hlY2sgbUNsb3NlZFN0YXRlbWVudElkcyBpbiBtRGF0YWJhc2UuIGl0IHNob3VsZCBiZSBlbXB0eQorICAgICAgICBzdGF0ZW1lbnRJZHMgPSBnZXREYigpLmdldFF1ZXVlZFVwU3RtdExpc3QoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHN0YXRlbWVudElkcy5zaXplKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgdGVzdCB0ZXN0cyB1c2FnZSBleGVjU1FMKCkgdG8gYmVnaW4gdHJhbnNhY3Rpb24gd29ya3MgaW4gdGhlIGZvbGxvd2luZyB3YXkKKyAgICAgKiAgIFRocmVhZCAjMSBkb2VzCisgICAgICogICAgICAgZXhlY1NRTCgiYmVnaW4gdHJhbnNhY3Rpb24iKTsKKyAgICAgKiAgICAgICBpbnNlcnQoKQorICAgICAqICAgVGhyZWFkICMgMgorICAgICAqICAgICAgIHF1ZXJ5KCkKKyAgICAgKiAgIFRocmVhZCMxICgiZW5kIHRyYW5zYWN0aW9uIikKKyAgICAgKiBUaHJlYWQgIyAyIHF1ZXJ5IHdpbGwgZXhlY3V0ZSAtIGJlY2F1c2UgamF2YSBsYXllciB3aWxsIG5vdCBoYXZlIGxvY2tlZCB0aGUgU1FMaXRlRGF0YWJhc2UKKyAgICAgKiBvYmplY3QgYW5kIHNxbGl0ZSB3aWxsIGNvbnNpZGVyIHRoaXMgcXVlcnkgdG8gYmUgcGFydCBvZiB0aGUgdHJhbnNhY3Rpb24uCisgICAgICoKKyAgICAgKiBidXQgaWYgdGhyZWFkICMgMSB1c2VzIGJlZ2luVHJhbnNhY3Rpb24oKSBpbnN0ZWFkIG9mIGV4ZWNTUUwoKSB0byBzdGFydCB0cmFuc2FjdGlvbiwKKyAgICAgKiB0aGVuIFRocmVhZCAjIDIncyBxdWVyeSB3aWxsIGhhdmUgYmVlbiBibG9ja2VkIGJ5IGphdmEgbGF5ZXIKKyAgICAgKiB1bnRpbCBUaHJlYWQjMSBlbmRzIHRyYW5zYWN0aW9uLgorICAgICAqCisgICAgICogQHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgorICAgICAqLworICAgIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXhlY1NxbFRvU3RhcnRBbmRFbmRUcmFuc2FjdGlvbigpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIHJ1bkV4ZWNTcWxUb1N0YXJ0QW5kRW5kVHJhbnNhY3Rpb24oIkVORCIpOworICAgICAgICAvLyBzYW1lIGFzIGFib3ZlLCBpbnN0ZWFkIG5vdyBkbyAiQ09NTUlUIiBvciAiUk9MTEJBQ0siIGluc3RlYWQgb2YgIkVORCIgdHJhbnNhY3Rpb24KKyAgICAgICAgcnVuRXhlY1NxbFRvU3RhcnRBbmRFbmRUcmFuc2FjdGlvbigiQ09NTUlUIik7CisgICAgICAgIHJ1bkV4ZWNTcWxUb1N0YXJ0QW5kRW5kVHJhbnNhY3Rpb24oIlJPTExCQUNLIik7CisgICAgfQorICAgIHByaXZhdGUgdm9pZCBydW5FeGVjU3FsVG9TdGFydEFuZEVuZFRyYW5zYWN0aW9uKFN0cmluZyBzdHIpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGNyZWF0ZVRhYmxlQW5kQ2xlYXJDYWNoZSgpOworICAgICAgICAvLyBkaXNhYmxlIFdBTCBqdXN0IHNvIHF1ZXJpZXMgYW5kIHVwZGF0ZXMgdXNlIHRoZSBzYW1lIGRhdGFiYXNlIGNvbm5lY3Rpb24KKyAgICAgICAgbURhdGFiYXNlLmRpc2FibGVXcml0ZUFoZWFkTG9nZ2luZygpOworICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiQkVHSU4gdHJhbnNhY3Rpb24iKTsKKyAgICAgICAgLy8gZXZlbiB0aG91Z2ggbURhdGFiYXNlLmJlZ2luVHJhbnNhY3Rpb24oKSBpcyBub3QgY2FsbGVkIHRvIHN0YXJ0IHRyYW5zYWN0aW9uLAorICAgICAgICAvLyBtRGF0YWJhc2UgY29ubmVjdGlvbiBzaG91bGQgbm93IGJlIGluIHRyYW5zYWN0aW9uIGFzIGEgcmVzdWx0IG9mCisgICAgICAgIC8vIG1EYXRhYmFzZS5leGVjU1FMKCJCRUdJTiB0cmFuc2FjdGlvbiIpCisgICAgICAgIC8vIGJ1dCBtRGF0YWJhc2UubUxvY2sgc2hvdWxkIG5vdCBiZSBoZWxkIGJ5IGFueSB0aHJlYWQKKyAgICAgICAgYXNzZXJ0VHJ1ZShtRGF0YWJhc2UuaW5UcmFuc2FjdGlvbigpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobURhdGFiYXNlLmlzRGJMb2NrZWRCeUN1cnJlbnRUaHJlYWQoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKG1EYXRhYmFzZS5pc0RiTG9ja2VkQnlPdGhlclRocmVhZHMoKSk7CisgICAgICAgIGFzc2VydFRydWUobURhdGFiYXNlLmFtSUluVHJhbnNhY3Rpb24oKSk7CisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJJTlNFUlQgaW50byAiICsgVEVTVF9UQUJMRSArICIgdmFsdWVzKDEwLCA5OTkpOyIpOworICAgICAgICBhc3NlcnRUcnVlKG1EYXRhYmFzZS5pblRyYW5zYWN0aW9uKCkpOworICAgICAgICBhc3NlcnRGYWxzZShtRGF0YWJhc2UuaXNEYkxvY2tlZEJ5Q3VycmVudFRocmVhZCgpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobURhdGFiYXNlLmlzRGJMb2NrZWRCeU90aGVyVGhyZWFkcygpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtRGF0YWJhc2UuYW1JSW5UcmFuc2FjdGlvbigpKTsKKyAgICAgICAgVGhyZWFkIHQgPSBuZXcgVGhyZWFkKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKG1EYXRhYmFzZS5hbUlJblRyYW5zYWN0aW9uKCkpOworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyg5OTksIERhdGFiYXNlVXRpbHMubG9uZ0ZvclF1ZXJ5KGdldERiKCksCisgICAgICAgICAgICAgICAgICAgICAgICAic2VsZWN0IGogZnJvbSAiICsgVEVTVF9UQUJMRSArICIgV0hFUkUgaSA9IDEwIiwgbnVsbCkpOworICAgICAgICAgICAgICAgIGFzc2VydFRydWUoZ2V0RGIoKS5pblRyYW5zYWN0aW9uKCkpOworICAgICAgICAgICAgICAgIGFzc2VydEZhbHNlKGdldERiKCkuaXNEYkxvY2tlZEJ5Q3VycmVudFRocmVhZCgpKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRGYWxzZShnZXREYigpLmlzRGJMb2NrZWRCeU90aGVyVGhyZWFkcygpKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKG1EYXRhYmFzZS5hbUlJblRyYW5zYWN0aW9uKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICB0LnN0YXJ0KCk7CisgICAgICAgIHQuam9pbigpOworICAgICAgICBhc3NlcnRUcnVlKG1EYXRhYmFzZS5hbUlJblRyYW5zYWN0aW9uKCkpOworICAgICAgICBhc3NlcnRUcnVlKG1EYXRhYmFzZS5pblRyYW5zYWN0aW9uKCkpOworICAgICAgICBhc3NlcnRGYWxzZShtRGF0YWJhc2UuaXNEYkxvY2tlZEJ5Q3VycmVudFRocmVhZCgpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobURhdGFiYXNlLmlzRGJMb2NrZWRCeU90aGVyVGhyZWFkcygpKTsKKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoc3RyKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobURhdGFiYXNlLmFtSUluVHJhbnNhY3Rpb24oKSk7CisgICAgICAgIGFzc2VydEZhbHNlKG1EYXRhYmFzZS5pblRyYW5zYWN0aW9uKCkpOworICAgICAgICBhc3NlcnRGYWxzZShtRGF0YWJhc2UuaXNEYkxvY2tlZEJ5Q3VycmVudFRocmVhZCgpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobURhdGFiYXNlLmlzRGJMb2NrZWRCeU90aGVyVGhyZWFkcygpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB0ZXN0IHRoZSBmb2xsb3dpbmcKKyAgICAgKiBodHRwOi8vYi9pc3N1ZT9pZD0yODcxMDM3CisgICAgICogICAgICAgICAgQ3Vyc29yIGN1cnNvciA9IGRiLnF1ZXJ5KC4uLik7CisgICAgICogICAgICAgICAgLy8gd2l0aCBXQUwgZW5hYmxlZCwgdGhlIGFib3ZlIHVzZXMgYSBwb29sZWQgZGF0YWJhc2UgY29ubmVjdGlvbgorICAgICAqICAgICAgICAgIGRiLmJlZ2luVHJhbnNhY3Rpb24oKQorICAgICAqICAgICAgICAgIHRyeSB7CisgICAgICogICAgICAgICAgICBkYi5pbnNlcnQoLi4uLi4uKTsKKyAgICAgKiAgICAgICAgICAgIGN1cnNvci5yZXF1ZXJ5KCk7CisgICAgICogICAgICAgICAgICAvLyBzaW5jZSB0aGUgY3Vyc29yIHVzZXMgcG9vbGVkIGRhdGFiYXNlIGNvbm5lY3Rpb24sIHRoZSBhYm92ZSByZXF1ZXJ5CisgICAgICogICAgICAgICAgICAvLyB3aWxsIG5vdCByZXR1cm4gdGhlIHJlc3VsdHMgdGhhdCB3ZXJlIGluc2VydGVkIGFib3ZlIHNpbmNlIHRoZSBpbnNlcnQgaXMKKyAgICAgKiAgICAgICAgICAgIC8vIGRvbmUgdXNpbmcgbWFpbiBkYXRhYmFzZSBjb25uZWN0aW9uIEFORCB0aGUgdHJhbnNhY3Rpb24gaXMgbm90IGNvbW1pdHRlZCB5ZXQuCisgICAgICogICAgICAgICAgICAvLyBmaXggaXMgdG8gbWFrZSB0aGUgYWJvdmUgY3Vyc29yIHVzZSB0aGUgbWFpbiBkYXRhYmFzZSBjb25uZWN0aW9uIC0gYW5kIE5PVAorICAgICAqICAgICAgICAgICAgLy8gdGhlIHBvb2xlZCBkYXRhYmFzZSBjb25uZWN0aW9uCisgICAgICogICAgICAgICAgICBkYi5zZXRUcmFuc2FjdGlvblN1Y2Nlc3NmdWwoKQorICAgICAqICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICogICAgICAgICAgICBkYi5lbmRUcmFuc2FjdGlvbigpCisgICAgICogICAgICAgICAgfQorICAgICAqCisgICAgICogQHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgorICAgICAqLworICAgIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VHJhbnNhY3Rpb25BbmRXYWxJbnRlcnBsYXkxKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgY3JlYXRlVGFibGVBbmRDbGVhckNhY2hlKCk7CisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJJTlNFUlQgaW50byAiICsgVEVTVF9UQUJMRSArICIgdmFsdWVzKDEwLCA5OTkpOyIpOworICAgICAgICBTdHJpbmcgc3FsID0gInNlbGVjdCAqIGZyb20gIiArIFRFU1RfVEFCTEU7CisgICAgICAgIEN1cnNvciBjID0gbURhdGFiYXNlLnJhd1F1ZXJ5KHNxbCwgbnVsbCk7CisgICAgICAgIC8vIHNob3VsZCBoYXZlIDEgcm93IGluIHRoZSB0YWJsZQorICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYy5nZXRDb3VudCgpKTsKKyAgICAgICAgbURhdGFiYXNlLmJlZ2luVHJhbnNhY3Rpb25Ob25FeGNsdXNpdmUoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJJTlNFUlQgaW50byAiICsgVEVTVF9UQUJMRSArICIgdmFsdWVzKDEwMCwgOTkwOSk7Iik7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMiwgRGF0YWJhc2VVdGlscy5sb25nRm9yUXVlcnkobURhdGFiYXNlLAorICAgICAgICAgICAgICAgICAgICAic2VsZWN0IGNvdW50KCopIGZyb20gIiArIFRFU1RfVEFCTEUsIG51bGwpKTsKKyAgICAgICAgICAgIC8vIHJlcXVlcnkgb24gdGhlIHByZXZpb3VzbHkgb3BlbmVkIGN1cnNvcgorICAgICAgICAgICAgLy8gY3Vyc29yIHNob3VsZCBub3cgdXNlIHRoZSBtYWluIGRhdGFiYXNlIGNvbm5lY3Rpb24gYW5kIHNlZSAyIHJvd3MKKyAgICAgICAgICAgIGMucmVxdWVyeSgpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGMuZ2V0Q291bnQoKSk7CisgICAgICAgICAgICBtRGF0YWJhc2Uuc2V0VHJhbnNhY3Rpb25TdWNjZXNzZnVsKCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBtRGF0YWJhc2UuZW5kVHJhbnNhY3Rpb24oKTsKKyAgICAgICAgfQorICAgICAgICBjLmNsb3NlKCk7CisKKyAgICAgICAgLy8gZG8gdGhlIHNhbWUgdGVzdCBidXQgbm93IGRvIHRoZSByZXF1ZXJ5IGluIGEgc2VwYXJhdGUgdGhyZWFkLgorICAgICAgICBjcmVhdGVUYWJsZUFuZENsZWFyQ2FjaGUoKTsKKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoIklOU0VSVCBpbnRvICIgKyBURVNUX1RBQkxFICsgIiB2YWx1ZXMoMTAsIDk5OSk7Iik7CisgICAgICAgIGZpbmFsIEN1cnNvciBjMSA9IG1EYXRhYmFzZS5yYXdRdWVyeSgic2VsZWN0IGNvdW50KCopIGZyb20gIiArIFRFU1RfVEFCTEUsIG51bGwpOworICAgICAgICAvLyBzaG91bGQgaGF2ZSAxIHJvdyBpbiB0aGUgdGFibGUKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGMxLmdldENvdW50KCkpOworICAgICAgICBtRGF0YWJhc2UuYmVnaW5UcmFuc2FjdGlvbk5vbkV4Y2x1c2l2ZSgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoIklOU0VSVCBpbnRvICIgKyBURVNUX1RBQkxFICsgIiB2YWx1ZXMoMTAwLCA5OTA5KTsiKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygyLCBEYXRhYmFzZVV0aWxzLmxvbmdGb3JRdWVyeShtRGF0YWJhc2UsCisgICAgICAgICAgICAgICAgICAgICJzZWxlY3QgY291bnQoKikgZnJvbSAiICsgVEVTVF9UQUJMRSwgbnVsbCkpOworICAgICAgICAgICAgLy8gcXVlcnkgaW4gYSBkaWZmZXJlbnQgdGhyZWFkLiB0aGF0IGNhdXNlcyB0aGUgY3Vyc29yIHRvIHVzZSBhIHBvb2xlZCBjb25uZWN0aW9uCisgICAgICAgICAgICAvLyBhbmQgc2luY2UgdGhpcyB0aHJlYWQgaGFzbid0IGNvbW1pdHRlZCBpdHMgY2hhbmdlcywgdGhlIGN1cnNvciBzaG91bGQgc3RpbGwgc2VlIG9ubHkKKyAgICAgICAgICAgIC8vIDEgcm93CisgICAgICAgICAgICBUaHJlYWQgdCA9IG5ldyBUaHJlYWQoKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgYzEucmVxdWVyeSgpOworICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYzEuZ2V0Q291bnQoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIHQuc3RhcnQoKTsKKyAgICAgICAgICAgIHQuam9pbigpOworICAgICAgICAgICAgLy8gc2hvdWxkIGJlIDIgcm93cyBub3cgLSBpbmNsdWRpbmcgdGhlIHRoZSByb3cgaW5zZXJ0ZWQgYWJvdmUKKyAgICAgICAgICAgIG1EYXRhYmFzZS5zZXRUcmFuc2FjdGlvblN1Y2Nlc3NmdWwoKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIG1EYXRhYmFzZS5lbmRUcmFuc2FjdGlvbigpOworICAgICAgICB9CisgICAgICAgIGMxLmNsb3NlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyB0ZXN0IGlzIHNhbWUgYXMge0BsaW5rICN0ZXN0VHJhbnNhY3Rpb25BbmRXYWxJbnRlcnBsYXkxKCl9IGV4Y2VwdCB0aGUgZm9sbG93aW5nOgorICAgICAqIGluc3RlYWQgb2YgbURhdGFiYXNlLmJlZ2luVHJhbnNhY3Rpb25Ob25FeGNsdXNpdmUoKSwgdXNlIGV4ZWNTUUwoIkJFR0lOIHRyYW5zYWN0aW9uIikKKyAgICAgKiBhbmQgaW5zdGVhZCBvZiBtRGF0YWJhc2UuZW5kVHJhbnNhY3Rpb24oKSwgdXNlIGV4ZWNTUUwoIkVORCIpOworICAgICAqLworICAgIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VHJhbnNhY3Rpb25BbmRXYWxJbnRlcnBsYXkyKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgY3JlYXRlVGFibGVBbmRDbGVhckNhY2hlKCk7CisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJJTlNFUlQgaW50byAiICsgVEVTVF9UQUJMRSArICIgdmFsdWVzKDEwLCA5OTkpOyIpOworICAgICAgICBTdHJpbmcgc3FsID0gInNlbGVjdCAqIGZyb20gIiArIFRFU1RfVEFCTEU7CisgICAgICAgIEN1cnNvciBjID0gbURhdGFiYXNlLnJhd1F1ZXJ5KHNxbCwgbnVsbCk7CisgICAgICAgIC8vIHNob3VsZCBoYXZlIDEgcm93IGluIHRoZSB0YWJsZQorICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYy5nZXRDb3VudCgpKTsKKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoIkJFR0lOIHRyYW5zYWN0aW9uIik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiSU5TRVJUIGludG8gIiArIFRFU1RfVEFCTEUgKyAiIHZhbHVlcygxMDAsIDk5MDkpOyIpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIERhdGFiYXNlVXRpbHMubG9uZ0ZvclF1ZXJ5KG1EYXRhYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgInNlbGVjdCBjb3VudCgqKSBmcm9tICIgKyBURVNUX1RBQkxFLCBudWxsKSk7CisgICAgICAgICAgICAvLyByZXF1ZXJ5IG9uIHRoZSBwcmV2aW91c2x5IG9wZW5lZCBjdXJzb3IKKyAgICAgICAgICAgIC8vIGN1cnNvciBzaG91bGQgbm93IHVzZSB0aGUgbWFpbiBkYXRhYmFzZSBjb25uZWN0aW9uIGFuZCBzZWUgMiByb3dzCisgICAgICAgICAgICBjLnJlcXVlcnkoKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygyLCBjLmdldENvdW50KCkpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoImNvbW1pdDsiKTsKKyAgICAgICAgfQorICAgICAgICBjLmNsb3NlKCk7CisKKyAgICAgICAgLy8gZG8gdGhlIHNhbWUgdGVzdCBidXQgbm93IGRvIHRoZSByZXF1ZXJ5IGluIGEgc2VwYXJhdGUgdGhyZWFkLgorICAgICAgICBjcmVhdGVUYWJsZUFuZENsZWFyQ2FjaGUoKTsKKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoIklOU0VSVCBpbnRvICIgKyBURVNUX1RBQkxFICsgIiB2YWx1ZXMoMTAsIDk5OSk7Iik7CisgICAgICAgIGZpbmFsIEN1cnNvciBjMSA9IG1EYXRhYmFzZS5yYXdRdWVyeSgic2VsZWN0IGNvdW50KCopIGZyb20gIiArIFRFU1RfVEFCTEUsIG51bGwpOworICAgICAgICAvLyBzaG91bGQgaGF2ZSAxIHJvdyBpbiB0aGUgdGFibGUKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGMxLmdldENvdW50KCkpOworICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiQkVHSU4gdHJhbnNhY3Rpb24iKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJJTlNFUlQgaW50byAiICsgVEVTVF9UQUJMRSArICIgdmFsdWVzKDEwMCwgOTkwOSk7Iik7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMiwgRGF0YWJhc2VVdGlscy5sb25nRm9yUXVlcnkobURhdGFiYXNlLAorICAgICAgICAgICAgICAgICAgICAic2VsZWN0IGNvdW50KCopIGZyb20gIiArIFRFU1RfVEFCTEUsIG51bGwpKTsKKyAgICAgICAgICAgIC8vIHF1ZXJ5IGluIGEgZGlmZmVyZW50IHRocmVhZC4gYnV0IHNpbmNlIHRoZSB0cmFuc2FjdGlvbiBpcyBzdGFydGVkIHVzaW5nCisgICAgICAgICAgICAvLyBleGVjU1EoKSBpbnN0ZWFkIG9mIGJlZ2luVHJhbnNhY3Rpb24oKSwgY3Vyc29yJ3MgcXVlcnkgaXMgY29uc2lkZXJlZCBwYXJ0IG9mCisgICAgICAgICAgICAvLyB0aGUgc2FtZSB0cmFuc2FjdGlvbiAtIGFuZCBoZW5jZSBpdCBzaG91bGQgc2VlIHRoZSBhYm92ZSBpbnNlcnRlZCByb3cKKyAgICAgICAgICAgIFRocmVhZCB0ID0gbmV3IFRocmVhZCgpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICBjMS5yZXF1ZXJ5KCk7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBjMS5nZXRDb3VudCgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICAgICAgdC5zdGFydCgpOworICAgICAgICAgICAgdC5qb2luKCk7CisgICAgICAgICAgICAvLyBzaG91bGQgYmUgMiByb3dzIG5vdyAtIGluY2x1ZGluZyB0aGUgdGhlIHJvdyBpbnNlcnRlZCBhYm92ZQorICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoImNvbW1pdCIpOworICAgICAgICB9CisgICAgICAgIGMxLmNsb3NlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyB0ZXN0IGlzIHNhbWUgYXMge0BsaW5rICN0ZXN0VHJhbnNhY3Rpb25BbmRXYWxJbnRlcnBsYXkyKCl9IGV4Y2VwdCB0aGUgZm9sbG93aW5nOgorICAgICAqIGluc3RlYWQgb2YgY29tbWl0dGluZyB0aGUgZGF0YSwgZG8gcm9sbGJhY2sgYW5kIG1ha2Ugc3VyZSB0aGUgZGF0YSBzZWVuIGJ5IHRoZSBxdWVyeQorICAgICAqIHdpdGhpbiB0aGUgdHJhbnNhY3Rpb24gaXMgbm93IGdvbmUuCisgICAgICovCisgICAgQFNtYWxsVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUcmFuc2FjdGlvbkFuZFdhbEludGVycGxheTMoKSB7CisgICAgICAgIGNyZWF0ZVRhYmxlQW5kQ2xlYXJDYWNoZSgpOworICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiSU5TRVJUIGludG8gIiArIFRFU1RfVEFCTEUgKyAiIHZhbHVlcygxMCwgOTk5KTsiKTsKKyAgICAgICAgU3RyaW5nIHNxbCA9ICJzZWxlY3QgKiBmcm9tICIgKyBURVNUX1RBQkxFOworICAgICAgICBDdXJzb3IgYyA9IG1EYXRhYmFzZS5yYXdRdWVyeShzcWwsIG51bGwpOworICAgICAgICAvLyBzaG91bGQgaGF2ZSAxIHJvdyBpbiB0aGUgdGFibGUKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGMuZ2V0Q291bnQoKSk7CisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJCRUdJTiB0cmFuc2FjdGlvbiIpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoIklOU0VSVCBpbnRvICIgKyBURVNUX1RBQkxFICsgIiB2YWx1ZXMoMTAwLCA5OTA5KTsiKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygyLCBEYXRhYmFzZVV0aWxzLmxvbmdGb3JRdWVyeShtRGF0YWJhc2UsCisgICAgICAgICAgICAgICAgICAgICJzZWxlY3QgY291bnQoKikgZnJvbSAiICsgVEVTVF9UQUJMRSwgbnVsbCkpOworICAgICAgICAgICAgLy8gcmVxdWVyeSBvbiB0aGUgcHJldmlvdXNseSBvcGVuZWQgY3Vyc29yCisgICAgICAgICAgICAvLyBjdXJzb3Igc2hvdWxkIG5vdyB1c2UgdGhlIG1haW4gZGF0YWJhc2UgY29ubmVjdGlvbiBhbmQgc2VlIDIgcm93cworICAgICAgICAgICAgYy5yZXF1ZXJ5KCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMiwgYy5nZXRDb3VudCgpKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIC8vIHJvbGxiYWNrIHRoZSBjaGFuZ2UKKyAgICAgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJyb2xsYmFjazsiKTsKKyAgICAgICAgfQorICAgICAgICAvLyBzaW5jZSB0aGUgY2hhbmdlIGlzIHJvbGxlZCBiYWNrLCBkbyB0aGUgc2FtZSBxdWVyeSBhZ2FpbiBhbmQgc2hvdWxkIG5vdyBmaW5kIG9ubHkgMSByb3cKKyAgICAgICAgYy5yZXF1ZXJ5KCk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBjLmdldENvdW50KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgRGF0YWJhc2VVdGlscy5sb25nRm9yUXVlcnkobURhdGFiYXNlLAorICAgICAgICAgICAgICAgICJzZWxlY3QgY291bnQoKikgZnJvbSAiICsgVEVTVF9UQUJMRSwgbnVsbCkpOworICAgICAgICBjLmNsb3NlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogaHR0cDovL2IvaXNzdWU/aWQ9Mjk0MzAyOAorICAgICAqIFNRTGl0ZU9wZW5IZWxwZXIgbWFpbnRhaW5zIGEgU2luZ2xldG9uIGV2ZW4gaWYgaXQgaXMgaW4gYmFkIHN0YXRlLgorICAgICAqLworICAgIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xvc2VBbmRSZW9wZW4oKSB7CisgICAgICAgIG1EYXRhYmFzZS5jbG9zZSgpOworICAgICAgICBUZXN0T3BlbkhlbHBlciBoZWxwZXIgPSBuZXcgVGVzdE9wZW5IZWxwZXIoZ2V0Q29udGV4dCgpLCBEQl9OQU1FLCBudWxsLAorICAgICAgICAgICAgICAgIENVUlJFTlRfREFUQUJBU0VfVkVSU0lPTiwgbmV3IERlZmF1bHREYXRhYmFzZUVycm9ySGFuZGxlcigpKTsKKyAgICAgICAgbURhdGFiYXNlID0gaGVscGVyLmdldFdyaXRhYmxlRGF0YWJhc2UoKTsKKyAgICAgICAgY3JlYXRlVGFibGVBbmRDbGVhckNhY2hlKCk7CisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJJTlNFUlQgaW50byAiICsgVEVTVF9UQUJMRSArICIgdmFsdWVzKDEwLCA5OTkpOyIpOworICAgICAgICBDdXJzb3IgYyA9IG1EYXRhYmFzZS5xdWVyeShURVNUX1RBQkxFLCBuZXcgU3RyaW5nW117ImkiLCAiaiJ9LCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGMuZ2V0Q291bnQoKSk7CisgICAgICAgIGMuY2xvc2UoKTsKKyAgICAgICAgbURhdGFiYXNlLmNsb3NlKCk7CisgICAgICAgIGFzc2VydEZhbHNlKG1EYXRhYmFzZS5pc09wZW4oKSk7CisgICAgICAgIG1EYXRhYmFzZSA9IGhlbHBlci5nZXRSZWFkYWJsZURhdGFiYXNlKCk7CisgICAgICAgIGFzc2VydFRydWUobURhdGFiYXNlLmlzT3BlbigpKTsKKyAgICAgICAgYyA9IG1EYXRhYmFzZS5xdWVyeShURVNUX1RBQkxFLCBuZXcgU3RyaW5nW117ImkiLCAiaiJ9LCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGMuZ2V0Q291bnQoKSk7CisgICAgICAgIGMuY2xvc2UoKTsKKyAgICB9CisgICAgcHJpdmF0ZSBjbGFzcyBUZXN0T3BlbkhlbHBlciBleHRlbmRzIFNRTGl0ZU9wZW5IZWxwZXIgeworICAgICAgICBwdWJsaWMgVGVzdE9wZW5IZWxwZXIoQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgbmFtZSwgQ3Vyc29yRmFjdG9yeSBmYWN0b3J5LCBpbnQgdmVyc2lvbiwKKyAgICAgICAgICAgICAgICBEYXRhYmFzZUVycm9ySGFuZGxlciBlcnJvckhhbmRsZXIpIHsKKyAgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIG5hbWUsIGZhY3RvcnksIHZlcnNpb24sIGVycm9ySGFuZGxlcik7CisgICAgICAgIH0KKyAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKFNRTGl0ZURhdGFiYXNlIGRiKSB7fQorICAgICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgb25VcGdyYWRlKFNRTGl0ZURhdGFiYXNlIGRiLCBpbnQgb2xkVmVyc2lvbiwgaW50IG5ld1ZlcnNpb24pIHt9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZUdlbmVyYWxUZXN0LmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlR2VuZXJhbFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWY3Y2NjZS4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlR2VuZXJhbFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZTsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7Ci1pbXBvcnQgYW5kcm9pZC50ZXN0LkZsYWt5VGVzdDsKLWltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uTGFyZ2VUZXN0OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1wdWJsaWMgY2xhc3MgU1FMaXRlR2VuZXJhbFRlc3QgZXh0ZW5kcyBBbmRyb2lkVGVzdENhc2UgewotCi0gICAgcHJpdmF0ZSBTUUxpdGVEYXRhYmFzZSBtRGF0YWJhc2U7Ci0gICAgcHJpdmF0ZSBGaWxlIG1EYXRhYmFzZUZpbGU7Ci0gICAgQm9vbGVhbiBleGNlcHRpb25SZWN2ZCA9IGZhbHNlOwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuc2V0VXAoKTsKLSAgICAgICAgZXhjZXB0aW9uUmVjdmQgPSBmYWxzZTsKLSAgICAgICAgRmlsZSBkYkRpciA9IGdldENvbnRleHQoKS5nZXREaXIodGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSwgQ29udGV4dC5NT0RFX1BSSVZBVEUpOwotICAgICAgICBtRGF0YWJhc2VGaWxlID0gbmV3IEZpbGUoZGJEaXIsICJkYXRhYmFzZV90ZXN0LmRiIik7Ci0gICAgICAgIGlmIChtRGF0YWJhc2VGaWxlLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICBtRGF0YWJhc2VGaWxlLmRlbGV0ZSgpOwotICAgICAgICB9Ci0gICAgICAgIG1EYXRhYmFzZSA9IFNRTGl0ZURhdGFiYXNlLm9wZW5PckNyZWF0ZURhdGFiYXNlKG1EYXRhYmFzZUZpbGUuZ2V0UGF0aCgpLCBudWxsKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChtRGF0YWJhc2UpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIG1EYXRhYmFzZS5jbG9zZSgpOwotICAgICAgICBtRGF0YWJhc2VGaWxlLmRlbGV0ZSgpOwotICAgICAgICBzdXBlci50ZWFyRG93bigpOwotICAgIH0KLQotICAgIEBMYXJnZVRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0VXNlT2ZTYW1lU3FsU3RhdGVtZW50QnkyVGhyZWFkcygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiQ1JFQVRFIFRBQkxFIHRlc3RfcHN0bXQgKGkgSU5URUdFUiBQUklNQVJZIEtFWSwgaiB0ZXh0KTsiKTsKLQotICAgICAgICAvLyB0aHJlYWQgMSBjcmVhdGVzIGEgcHJlcGFyZWQgc3RhdGVtZW50Ci0gICAgICAgIGZpbmFsIFN0cmluZyBzdG10ID0gIlNFTEVDVCAqIEZST00gdGVzdF9wc3RtdCBXSEVSRSBpID0gPyI7Ci0KLSAgICAgICAgLy8gc3RhcnQgMiB0aHJlYWRzIHRvIGRvIHJlcGVhdGVkbHkgZXhlY3V0ZSAic3RtdCIKLSAgICAgICAgLy8gc2luY2UgdGhlc2UgMiB0aHJlYWRzIGFyZSBleGVjdXRpbmcgdGhlIHNhbWUgc3FsLCB0aGV5IGVhY2ggc2hvdWxkIGdldAotICAgICAgICAvLyB0aGVpciBvd24gY29weSBhbmQKLSAgICAgICAgLy8gdGhlcmUgU0hPVUxEIE5PVCBiZSBhbiBlcnJvciBmcm9tIHNxbGl0ZTogInByZXBhcmVkIHN0YXRlbWVudCBpcyBidXN5IgotICAgICAgICBjbGFzcyBSdW5TdG10VGhyZWFkIGV4dGVuZHMgVGhyZWFkIHsKLSAgICAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOID0gMTAwMDsKLSAgICAgICAgICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgaW50IGkgPSAwOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGV4ZWN1dGUgbWFueSB0aW1lcwotICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTjsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTUUxpdGVTdGF0ZW1lbnQgczEgPSBtRGF0YWJhc2UuY29tcGlsZVN0YXRlbWVudChzdG10KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHMxLmJpbmRMb25nKDEsIGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgczEuZXhlY3V0ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgczEuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNRTGl0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZhaWwoIlNRTGl0ZUV4Y2VwdGlvbjogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGZhaWwoInJhbmRvbSB1bmV4cGVjdGVkIGV4Y2VwdGlvbjogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBSdW5TdG10VGhyZWFkIHQxID0gbmV3IFJ1blN0bXRUaHJlYWQoKTsKLSAgICAgICAgdDEuc3RhcnQoKTsKLSAgICAgICAgUnVuU3RtdFRocmVhZCB0MiA9IG5ldyBSdW5TdG10VGhyZWFkKCk7Ci0gICAgICAgIHQyLnN0YXJ0KCk7Ci0gICAgICAgIHdoaWxlICh0MS5pc0FsaXZlKCkgfHwgdDIuaXNBbGl2ZSgpKSB7Ci0gICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBARmxha3lUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFVzZU9mU2FtZVByZXBhcmVkU3RhdGVtZW50QnkyVGhyZWFkcygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiQ1JFQVRFIFRBQkxFIHRlc3RfcHN0bXQgKGkgSU5URUdFUiBQUklNQVJZIEtFWSwgaiB0ZXh0KTsiKTsKLQotICAgICAgICAvLyB0aHJlYWQgMSBjcmVhdGVzIGEgcHJlcGFyZWQgc3RhdGVtZW50Ci0gICAgICAgIGZpbmFsIFN0cmluZyBzdG10ID0gIlNFTEVDVCAqIEZST00gdGVzdF9wc3RtdCBXSEVSRSBpID0gPyI7Ci0gICAgICAgIGZpbmFsIFNRTGl0ZVN0YXRlbWVudCBzMSA9IG1EYXRhYmFzZS5jb21waWxlU3RhdGVtZW50KHN0bXQpOwotCi0gICAgICAgIC8vIHN0YXJ0IDIgdGhyZWFkcyB0byBkbyByZXBlYXRlZGx5IGV4ZWN1dGUgInN0bXQiCi0gICAgICAgIC8vIHNpbmNlIHRoZXNlIDIgdGhyZWFkcyBhcmUgZXhlY3V0aW5nIHRoZSBzYW1lIHByZXBhcmVkIHN0YXRlbWVudCwKLSAgICAgICAgLy8gc2hvdWxkIHNlZSBhbiBlcnJvciBmcm9tIHNxbGl0ZTogInByZXBhcmVkIHN0YXRlbWVudCBpcyBidXN5IgotICAgICAgICBjbGFzcyBSdW5TdG10VGhyZWFkIGV4dGVuZHMgVGhyZWFkIHsKLSAgICAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOID0gMTAwMDsKLSAgICAgICAgICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgaW50IGkgPSAwOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGV4ZWN1dGUgbWFueSB0aW1lcwotICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTjsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzMS5iaW5kTG9uZygxLCBpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHMxLmV4ZWN1dGUoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNRTGl0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGV4cGVjdCBpdAotICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGUuZ2V0TWVzc2FnZSgpLmNvbnRhaW5zKCJsaWJyYXJ5IHJvdXRpbmUgY2FsbGVkIG91dCBvZiBzZXF1ZW5jZToiKSk7Ci0gICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvblJlY3ZkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGZhaWwoInJhbmRvbSB1bmV4cGVjdGVkIGV4Y2VwdGlvbjogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBSdW5TdG10VGhyZWFkIHQxID0gbmV3IFJ1blN0bXRUaHJlYWQoKTsKLSAgICAgICAgdDEuc3RhcnQoKTsKLSAgICAgICAgUnVuU3RtdFRocmVhZCB0MiA9IG5ldyBSdW5TdG10VGhyZWFkKCk7Ci0gICAgICAgIHQyLnN0YXJ0KCk7Ci0gICAgICAgIHdoaWxlICh0MS5pc0FsaXZlKCkgfHwgdDIuaXNBbGl2ZSgpKSB7Ci0gICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0VHJ1ZShleGNlcHRpb25SZWN2ZCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZVN0YXRlbWVudFRlc3QuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVTdGF0ZW1lbnRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE3NTQ1ZgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVTdGF0ZW1lbnRUZXN0LmphdmEKQEAgLTAsMCArMSwyMTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKK2ltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uTGFyZ2VUZXN0OworaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5TbWFsbFRlc3Q7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5SZWVudHJhbnRMb2NrOworCitwdWJsaWMgY2xhc3MgU1FMaXRlU3RhdGVtZW50VGVzdCBleHRlbmRzIEFuZHJvaWRUZXN0Q2FzZSB7CisgICAgcHJpdmF0ZSBTUUxpdGVEYXRhYmFzZSBtRGF0YWJhc2U7CisgICAgcHJpdmF0ZSBGaWxlIG1EYXRhYmFzZUZpbGU7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlci5zZXRVcCgpOworCisgICAgICAgIEZpbGUgZGJEaXIgPSBnZXRDb250ZXh0KCkuZ2V0RGlyKHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCksIENvbnRleHQuTU9ERV9QUklWQVRFKTsKKyAgICAgICAgbURhdGFiYXNlRmlsZSA9IG5ldyBGaWxlKGRiRGlyLCAiZGF0YWJhc2VfdGVzdC5kYiIpOworICAgICAgICBpZiAobURhdGFiYXNlRmlsZS5leGlzdHMoKSkgeworICAgICAgICAgICAgbURhdGFiYXNlRmlsZS5kZWxldGUoKTsKKyAgICAgICAgfQorICAgICAgICBtRGF0YWJhc2UgPSBTUUxpdGVEYXRhYmFzZS5vcGVuT3JDcmVhdGVEYXRhYmFzZShtRGF0YWJhc2VGaWxlLmdldFBhdGgoKSwgbnVsbCk7CisgICAgICAgIGFzc2VydE5vdE51bGwobURhdGFiYXNlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBtRGF0YWJhc2UuY2xvc2UoKTsKKyAgICAgICAgbURhdGFiYXNlRmlsZS5kZWxldGUoKTsKKyAgICAgICAgc3VwZXIudGVhckRvd24oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdGFydCAyIHRocmVhZHMgdG8gcmVwZWF0ZWRseSBleGVjdXRlIHRoZSBhYm92ZSBTUUwgc3RhdGVtZW50LgorICAgICAqIEV2ZW4gdGhvdWdoIDIgdGhyZWFkcyBhcmUgZXhlY3V0aW5nIHRoZSBzYW1lIFNRTCwgdGhleSBlYWNoIHNob3VsZCBnZXQgdGhlaXIgb3duIGNvcHkgb2YKKyAgICAgKiBwcmVwYXJlZCBTUUwgc3RhdGVtZW50IGlkIGFuZCB0aGVyZSBTSE9VTEQgTk9UIGJlIGFuIGVycm9yIGZyb20gc3FsaXRlIG9yIGFuZHJvaWQuCisgICAgICogQHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB0aHJvd24gaWYgdGhlIHRlc3QgdGhyZWFkcyBzdGFydGVkIGJ5IHRoaXMgdGVzdCBhcmUgaW50ZXJydXB0ZWQKKyAgICAgKi8KKyAgICBATGFyZ2VUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFVzZU9mU2FtZVNxbFN0YXRlbWVudEJ5MlRocmVhZHMoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiQ1JFQVRFIFRBQkxFIHRlc3RfcHN0bXQgKGkgSU5URUdFUiBQUklNQVJZIEtFWSwgaiB0ZXh0KTsiKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIHN0bXQgPSAiU0VMRUNUICogRlJPTSB0ZXN0X3BzdG10IFdIRVJFIGkgPSA/IjsKKyAgICAgICAgY2xhc3MgUnVuU3RtdFRocmVhZCBleHRlbmRzIFRocmVhZCB7CisgICAgICAgICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIC8vIGRvIGl0IGVub3VnaCB0aW1lcyB0byBtYWtlIHN1cmUgdGhlcmUgYXJlIG5vIGNvcm5lciBjYXNlcyBnb2luZyB1bnRlc3RlZAorICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwMDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIFNRTGl0ZVN0YXRlbWVudCBzMSA9IG1EYXRhYmFzZS5jb21waWxlU3RhdGVtZW50KHN0bXQpOworICAgICAgICAgICAgICAgICAgICBzMS5iaW5kTG9uZygxLCBpKTsKKyAgICAgICAgICAgICAgICAgICAgczEuZXhlY3V0ZSgpOworICAgICAgICAgICAgICAgICAgICBzMS5jbG9zZSgpOworICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgUnVuU3RtdFRocmVhZCB0MSA9IG5ldyBSdW5TdG10VGhyZWFkKCk7CisgICAgICAgIHQxLnN0YXJ0KCk7CisgICAgICAgIFJ1blN0bXRUaHJlYWQgdDIgPSBuZXcgUnVuU3RtdFRocmVhZCgpOworICAgICAgICB0Mi5zdGFydCgpOworICAgICAgICAgd2hpbGUgKHQxLmlzQWxpdmUoKSB8fCB0Mi5pc0FsaXZlKCkpIHsKKyAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTApOworICAgICAgICAgfQorICAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIHNpbXBsZSB0ZXN0OiBzdGFydCAyIHRocmVhZHMgdG8gcmVwZWF0ZWRseSBleGVjdXRlIHRoZSBzYW1lIHtAbGluayBTUUxpdGVTdGF0ZW1lbnR9LgorICAgICAqIFRoZSAyIHRocmVhZHMgdGFrZSB0dXJucyB0byB1c2UgdGhlIHtAbGluayBTUUxpdGVTdGF0ZW1lbnR9OyBpLmUuLCBpdCBpcyBOT1QgaW4gdXNlCisgICAgICogYnkgYm90aCB0aGUgdGhyZWFkcyBhdCB0aGUgc2FtZSB0aW1lLgorICAgICAqCisgICAgICogQHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB0aHJvd24gaWYgdGhlIHRlc3QgdGhyZWFkcyBzdGFydGVkIGJ5IHRoaXMgdGVzdCBhcmUgaW50ZXJydXB0ZWQKKyAgICAgKi8KKyAgICBATGFyZ2VUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFVzZU9mU2FtZVNxbGl0ZVN0YXRlbWVudEJ5MlRocmVhZHMoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiQ1JFQVRFIFRBQkxFIHRlc3RfcHN0bXQgKGkgSU5URUdFUiBQUklNQVJZIEtFWSwgaiB0ZXh0KTsiKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIHN0bXQgPSAiU0VMRUNUICogRlJPTSB0ZXN0X3BzdG10IFdIRVJFIGkgPSA/IjsKKyAgICAgICAgZmluYWwgU1FMaXRlU3RhdGVtZW50IHMxID0gbURhdGFiYXNlLmNvbXBpbGVTdGF0ZW1lbnQoc3RtdCk7CisgICAgICAgIGNsYXNzIFJ1blN0bXRUaHJlYWQgZXh0ZW5kcyBUaHJlYWQgeworICAgICAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAvLyBkbyBpdCBlbm91Z2ggdGltZXMgdG8gbWFrZSBzdXJlIHRoZXJlIGFyZSBubyBjb3JuZXIgY2FzZXMgZ29pbmcgdW50ZXN0ZWQKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDA7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBsb2NrKCk7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzMS5iaW5kTG9uZygxLCBpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMxLmV4ZWN1dGUoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVubG9jaygpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIFRocmVhZC55aWVsZCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBSdW5TdG10VGhyZWFkIHQxID0gbmV3IFJ1blN0bXRUaHJlYWQoKTsKKyAgICAgICAgdDEuc3RhcnQoKTsKKyAgICAgICAgUnVuU3RtdFRocmVhZCB0MiA9IG5ldyBSdW5TdG10VGhyZWFkKCk7CisgICAgICAgIHQyLnN0YXJ0KCk7CisgICAgICAgIHdoaWxlICh0MS5pc0FsaXZlKCkgfHwgdDIuaXNBbGl2ZSgpKSB7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTApOworICAgICAgICB9CisgICAgfQorICAgIC8qKiBTeW5jaHJvbml6ZSBvbiB0aGlzIHdoZW4gYWNjZXNzaW5nIHRoZSBTcWxpdGVTdGF0ZW1ldCBpbiB0aGUgYWJvdmUgKi8KKyAgICBwcml2YXRlIGZpbmFsIFJlZW50cmFudExvY2sgbUxvY2sgPSBuZXcgUmVlbnRyYW50TG9jayh0cnVlKTsKKyAgICBwcml2YXRlIHZvaWQgbG9jaygpIHsKKyAgICAgICAgbUxvY2subG9jaygpOworICAgIH0KKyAgICBwcml2YXRlIHZvaWQgdW5sb2NrKCkgeworICAgICAgICBtTG9jay51bmxvY2soKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyB0aGUgZm9sbG93aW5nOiBhIHtAbGluayBTUUxpdGVTdGF0ZW1lbnR9IG9iamVjdCBzaG91bGQgbm90IHJlZmVyIHRvIGEKKyAgICAgKiBwcmUtY29tcGlsZWQgU1FMIHN0YXRlbWVudCBpZCBleGNlcHQgaW4gZHVyaW5nIHRoZSBwZXJpb2Qgb2YgYmluZGluZyB0aGUgYXJndW1lbnRzCisgICAgICogYW5kIGV4ZWN1dGluZyB0aGUgU1FMIHN0YXRlbWVudC4KKyAgICAgKi8KKyAgICBAU21hbGxUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlZmVyZW5jZVRvUHJlY29tcGlsZWRTdGF0ZW1lbnRJZCgpIHsKKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoImNyZWF0ZSB0YWJsZSB0IChpIGludCwgaiB0ZXh0KTsiKTsKKyAgICAgICAgdmVyaWZ5UmVmZXJlbmNlVG9QcmVjb21waWxlZFN0YXRlbWVudElkKGZhbHNlKTsKKyAgICAgICAgdmVyaWZ5UmVmZXJlbmNlVG9QcmVjb21waWxlZFN0YXRlbWVudElkKHRydWUpOworCisgICAgICAgIC8vIGEgc21hbGwgc3RyZXNzIHRlc3QgdG8gbWFrZSBzdXJlIHRoZXJlIGFyZSBubyBzaWRlIGVmZmVjdHMgb2YKKyAgICAgICAgLy8gdGhlIGFjcXVpcmUgJiByZWxlYXNlIG9mIHByZS1jb21waWxlZCBzdGF0ZW1lbnQgaWQgYnkgU1FMaXRlU3RhdGVtZW50IG9iamVjdC4KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDA7IGkrKykgeworICAgICAgICAgICAgdmVyaWZ5UmVmZXJlbmNlVG9QcmVjb21waWxlZFN0YXRlbWVudElkKGZhbHNlKTsKKyAgICAgICAgICAgIHZlcmlmeVJlZmVyZW5jZVRvUHJlY29tcGlsZWRTdGF0ZW1lbnRJZCh0cnVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCisgICAgcHJpdmF0ZSB2b2lkIHZlcmlmeVJlZmVyZW5jZVRvUHJlY29tcGlsZWRTdGF0ZW1lbnRJZChib29sZWFuIHdhbCkgeworICAgICAgICBpZiAod2FsKSB7CisgICAgICAgICAgICBtRGF0YWJhc2UuZW5hYmxlV3JpdGVBaGVhZExvZ2dpbmcoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1EYXRhYmFzZS5kaXNhYmxlV3JpdGVBaGVhZExvZ2dpbmcoKTsKKyAgICAgICAgfQorICAgICAgICAvLyB0ZXN0IHdpdGggSU5TRVJUIHN0YXRlbWVudCAtIGRvZXNuJ3QgdXNlIGNvbm5lY3Rpb24gcG9vbCwgaWYgV0FMIGlzIHNldAorICAgICAgICBTUUxpdGVTdGF0ZW1lbnQgc3RtdCA9IG1EYXRhYmFzZS5jb21waWxlU3RhdGVtZW50KCJpbnNlcnQgaW50byB0IHZhbHVlcyg/LD8pOyIpOworICAgICAgICBhc3NlcnRFcXVhbHMobURhdGFiYXNlLm1OYXRpdmVIYW5kbGUsIHN0bXQubkhhbmRsZSk7CisgICAgICAgIGFzc2VydEVxdWFscyhtRGF0YWJhc2UsIHN0bXQubURhdGFiYXNlKTsKKyAgICAgICAgLy8gc3FsIHN0YXRlbWVudCBzaG91bGQgbm90IGJlIGNvbXBpbGVkIHlldAorICAgICAgICBhc3NlcnRFcXVhbHMoMCwgc3RtdC5uU3RhdGVtZW50KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHN0bXQuZ2V0U3FsU3RhdGVtZW50SWQoKSk7CisgICAgICAgIGludCBjb2xWYWx1ZSA9IG5ldyBSYW5kb20oKS5uZXh0SW50KCk7CisgICAgICAgIHN0bXQuYmluZExvbmcoMSwgY29sVmFsdWUpOworICAgICAgICAvLyB2ZXJpZnkgdGhhdCB0aGUgc3FsIHN0YXRlbWVudCBpcyBzdGlsbCBub3QgY29tcGlsZWQKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHN0bXQuZ2V0U3FsU3RhdGVtZW50SWQoKSk7CisgICAgICAgIC8vIHNob3VsZCBzdGlsbCBiZSB1c2luZyB0aGUgbURhdGFiYXNlIGNvbm5lY3Rpb24gLSB2ZXJpZnkKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1EYXRhYmFzZS5tTmF0aXZlSGFuZGxlLCBzdG10Lm5IYW5kbGUpOworICAgICAgICBhc3NlcnRFcXVhbHMobURhdGFiYXNlLCBzdG10Lm1EYXRhYmFzZSk7CisgICAgICAgIHN0bXQuYmluZFN0cmluZygyLCAiYmxhaCIgKyBjb2xWYWx1ZSk7CisgICAgICAgIC8vIHZlcmlmeSB0aGF0IHRoZSBzcWwgc3RhdGVtZW50IGlzIHN0aWxsIG5vdCBjb21waWxlZAorICAgICAgICBhc3NlcnRFcXVhbHMoMCwgc3RtdC5nZXRTcWxTdGF0ZW1lbnRJZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1EYXRhYmFzZS5tTmF0aXZlSGFuZGxlLCBzdG10Lm5IYW5kbGUpOworICAgICAgICBhc3NlcnRFcXVhbHMobURhdGFiYXNlLCBzdG10Lm1EYXRhYmFzZSk7CisgICAgICAgIHN0bXQuZXhlY3V0ZUluc2VydCgpOworICAgICAgICAvLyBub3cgdGhhdCB0aGUgc3RhdGVtZW50IGlzIGV4ZWN1dGVkLCBwcmUtY29tcGlsZWQgc3RhdGVtZW50IHNob3VsZCBiZSByZWxlYXNlZAorICAgICAgICBhc3NlcnRFcXVhbHMoMCwgc3RtdC5uU3RhdGVtZW50KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHN0bXQuZ2V0U3FsU3RhdGVtZW50SWQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhtRGF0YWJhc2UubU5hdGl2ZUhhbmRsZSwgc3RtdC5uSGFuZGxlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1EYXRhYmFzZSwgc3RtdC5tRGF0YWJhc2UpOworICAgICAgICBzdG10LmNsb3NlKCk7CisgICAgICAgIC8vIHByZS1jb21waWxlZCBTUUwgc3RhdGVtZW50IHNob3VsZCBzdGlsbCByZW1haW4gcmVsZWFzZWQgZnJvbSB0aGlzIG9iamVjdAorICAgICAgICBhc3NlcnRFcXVhbHMoMCwgc3RtdC5uU3RhdGVtZW50KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHN0bXQuZ2V0U3FsU3RhdGVtZW50SWQoKSk7CisgICAgICAgIC8vIGJ1dCB0aGUgZGF0YWJhc2UgaGFuZGxlIHNob3VsZCBzdGlsbCBiZSB0aGUgc2FtZQorICAgICAgICBhc3NlcnRFcXVhbHMobURhdGFiYXNlLCBzdG10Lm1EYXRhYmFzZSk7CisKKyAgICAgICAgLy8gdGVzdCB3aXRoIGEgU0VMRUNUIHN0YXRlbWVudCAtIHVzZXMgY29ubmVjdGlvbiBwb29sIGlmIFdBTCBpcyBzZXQKKyAgICAgICAgc3RtdCA9IG1EYXRhYmFzZS5jb21waWxlU3RhdGVtZW50KCJzZWxlY3QgaSBmcm9tIHQgd2hlcmUgaj0/OyIpOworICAgICAgICAvLyBzcWwgc3RhdGVtZW50IHNob3VsZCBub3QgYmUgY29tcGlsZWQgeWV0CisgICAgICAgIGFzc2VydEVxdWFscygwLCBzdG10Lm5TdGF0ZW1lbnQpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgc3RtdC5nZXRTcWxTdGF0ZW1lbnRJZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1EYXRhYmFzZS5tTmF0aXZlSGFuZGxlLCBzdG10Lm5IYW5kbGUpOworICAgICAgICBhc3NlcnRFcXVhbHMobURhdGFiYXNlLCBzdG10Lm1EYXRhYmFzZSk7CisgICAgICAgIHN0bXQuYmluZFN0cmluZygxLCAiYmxhaCIgKyBjb2xWYWx1ZSk7CisgICAgICAgIC8vIHZlcmlmeSB0aGF0IHRoZSBzcWwgc3RhdGVtZW50IGlzIHN0aWxsIG5vdCBjb21waWxlZAorICAgICAgICBhc3NlcnRFcXVhbHMoMCwgc3RtdC5uU3RhdGVtZW50KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHN0bXQuZ2V0U3FsU3RhdGVtZW50SWQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhtRGF0YWJhc2UubU5hdGl2ZUhhbmRsZSwgc3RtdC5uSGFuZGxlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1EYXRhYmFzZSwgc3RtdC5tRGF0YWJhc2UpOworICAgICAgICAvLyBleGVjdXRlIHRoZSBzdGF0ZW1lbnQKKyAgICAgICAgTG9uZyBsID0gc3RtdC5zaW1wbGVRdWVyeUZvckxvbmcoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGNvbFZhbHVlLCBsLmludFZhbHVlKCkpOworICAgICAgICAvLyBub3cgdGhhdCB0aGUgc3RhdGVtZW50IGlzIGV4ZWN1dGVkLCBwcmUtY29tcGlsZWQgc3RhdGVtZW50IHNob3VsZCBiZSByZWxlYXNlZAorICAgICAgICBhc3NlcnRFcXVhbHMoMCwgc3RtdC5uU3RhdGVtZW50KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHN0bXQuZ2V0U3FsU3RhdGVtZW50SWQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhtRGF0YWJhc2UubU5hdGl2ZUhhbmRsZSwgc3RtdC5uSGFuZGxlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1EYXRhYmFzZSwgc3RtdC5tRGF0YWJhc2UpOworICAgICAgICBzdG10LmNsb3NlKCk7CisgICAgICAgIC8vIHByZS1jb21waWxlZCBTUUwgc3RhdGVtZW50IHNob3VsZCBzdGlsbCByZW1haW4gcmVsZWFzZWQgZnJvbSB0aGlzIG9iamVjdAorICAgICAgICBhc3NlcnRFcXVhbHMoMCwgc3RtdC5uU3RhdGVtZW50KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHN0bXQuZ2V0U3FsU3RhdGVtZW50SWQoKSk7CisgICAgICAgIC8vIGJ1dCB0aGUgZGF0YWJhc2UgaGFuZGxlIHNob3VsZCBzdGlsbCByZW1haW4gYXR0YWNoZWQgdG8gdGhlIHN0YXRlbWVudAorICAgICAgICBhc3NlcnRFcXVhbHMobURhdGFiYXNlLm1OYXRpdmVIYW5kbGUsIHN0bXQubkhhbmRsZSk7CisgICAgICAgIGFzc2VydEVxdWFscyhtRGF0YWJhc2UsIHN0bXQubURhdGFiYXNlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9vcy9NZW1vcnlGaWxlVGVzdC5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvb3MvTWVtb3J5RmlsZVRlc3QuamF2YQppbmRleCAwMDlhMGUyLi5lNjI3YmI0IDEwMDY0NAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9vcy9NZW1vcnlGaWxlVGVzdC5qYXZhCisrKyBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL29zL01lbW9yeUZpbGVUZXN0LmphdmEKQEAgLTIzNyw1MSArMjM3LDYgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIEBTbWFsbFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0SXNNZW1vcnlGaWxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIE1lbW9yeUZpbGUgZmlsZSA9IG5ldyBNZW1vcnlGaWxlKCJNZW1vcnlGaWxlVGVzdCIsIDEwMDAwMDApOwotICAgICAgICBGaWxlRGVzY3JpcHRvciBmZCA9IGZpbGUuZ2V0RmlsZURlc2NyaXB0b3IoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChmZCk7Ci0gICAgICAgIGFzc2VydFRydWUoZmQudmFsaWQoKSk7Ci0gICAgICAgIGFzc2VydFRydWUoTWVtb3J5RmlsZS5pc01lbW9yeUZpbGUoZmQpKTsKLSAgICAgICAgZmlsZS5jbG9zZSgpOwotCi0gICAgICAgIGFzc2VydEZhbHNlKE1lbW9yeUZpbGUuaXNNZW1vcnlGaWxlKEZpbGVEZXNjcmlwdG9yLmluKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKE1lbW9yeUZpbGUuaXNNZW1vcnlGaWxlKEZpbGVEZXNjcmlwdG9yLm91dCkpOwotICAgICAgICBhc3NlcnRGYWxzZShNZW1vcnlGaWxlLmlzTWVtb3J5RmlsZShGaWxlRGVzY3JpcHRvci5lcnIpKTsKLQotICAgICAgICBGaWxlIHRlbXBGaWxlID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgiTWVtb3J5RmlsZVRlc3QiLCIudG1wIiwgZ2V0Q29udGV4dCgpLmdldEZpbGVzRGlyKCkpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGZpbGUpOwotICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIG91dCA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBvdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbSh0ZW1wRmlsZSk7Ci0gICAgICAgICAgICBGaWxlRGVzY3JpcHRvciBmaWxlRmQgPSBvdXQuZ2V0RkQoKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoZmlsZUZkKTsKLSAgICAgICAgICAgIGFzc2VydEZhbHNlKE1lbW9yeUZpbGUuaXNNZW1vcnlGaWxlKGZpbGVGZCkpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKG91dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgb3V0LmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0ZW1wRmlsZS5kZWxldGUoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBTbWFsbFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RmlsZURlc2NyaXB0b3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgTWVtb3J5RmlsZSBmaWxlID0gbmV3IE1lbW9yeUZpbGUoIk1lbW9yeUZpbGVUZXN0IiwgMTAwMDAwMCk7Ci0gICAgICAgIE1lbW9yeUZpbGUgcmVmID0gbmV3IE1lbW9yeUZpbGUoZmlsZS5nZXRGaWxlRGVzY3JpcHRvcigpLCBmaWxlLmxlbmd0aCgpLCAiciIpOwotICAgICAgICBieXRlW10gYnVmZmVyOwotCi0gICAgICAgIC8vIHdyaXRlIHRvIG9yaWdpbmFsLCByZWFkIGZyb20gcmVmZXJlbmNlCi0gICAgICAgIGZpbGUud3JpdGVCeXRlcyh0ZXN0U3RyaW5nLCAwLCAyMDAwLCB0ZXN0U3RyaW5nLmxlbmd0aCk7Ci0gICAgICAgIGJ1ZmZlciA9IG5ldyBieXRlW3Rlc3RTdHJpbmcubGVuZ3RoXTsKLSAgICAgICAgcmVmLnJlYWRCeXRlcyhidWZmZXIsIDIwMDAsIDAsIHRlc3RTdHJpbmcubGVuZ3RoKTsKLSAgICAgICAgY29tcGFyZUJ1ZmZlcnModGVzdFN0cmluZywgYnVmZmVyLCB0ZXN0U3RyaW5nLmxlbmd0aCk7Ci0KLSAgICAgICAgZmlsZS5jbG9zZSgpOwotICAgICAgICByZWYuY2xvc2UoKTsgIC8vIERvZXNuJ3QgYWN0dWFsbHkgZG8gYW55dGhpbmcsIHNpbmNlIHRoZSBmaWxlIGRlc2NyaXB0b3IgaXMgbm90IGR1cCgyKTplZAotICAgIH0KLQogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSB0ZXN0U3RyaW5nID0gbmV3IGJ5dGVbXSB7CiAgICAgICAgIDMsIDEsIDQsIDEsIDUsIDksIDIsIDYsIDUsIDMsIDUsIDgsIDksIDcsIDksIDMsIDIsIDMsIDgsIDQsIDYsIDIsIDYsIDQsIDMsIDMsIDgsIDMsIDIsIDcsIDksIDUsIDAsIDIsIDgsIDgsIDQsIDEsIDksIDcsIDEsIDYsIDksIDMsIDksIDksIDMsIDcsIDUsIDEsIDAsIDUsIDgsIDIsIDAsIDksIDcsIDQsIDksIDQsIDQsIDUsIDksIDIsIDMsIDAsIDcsIDgsIDEsIDYsIDQsCiAgICAgICAgIDAsIDYsIDIsIDgsIDYsIDIsIDAsIDgsIDksIDksIDgsIDYsIDIsIDgsIDAsIDMsIDQsIDgsIDIsIDUsIDMsIDQsIDIsIDEsIDEsIDcsIDAsIDYsIDcsIDksIDgsIDIsIDEsIDQsIDgsIDAsIDgsIDYsIDUsIDEsIDMsIDIsIDgsIDIsIDMsIDAsIDYsIDYsIDQsIDcsIDAsIDksIDMsIDgsIDQsIDQsIDYsIDAsIDksIDUsIDUsIDAsIDUsIDgsIDIsIDIsIDMsIDEsIDcsIDIsCmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9vcy9NZXNzYWdlUXVldWVUZXN0LmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9vcy9NZXNzYWdlUXVldWVUZXN0LmphdmEKaW5kZXggYjdjMmQxZi4uZjgyYmZjZSAxMDA2NDQKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvb3MvTWVzc2FnZVF1ZXVlVGVzdC5qYXZhCisrKyBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL29zL01lc3NhZ2VRdWV1ZVRlc3QuamF2YQpAQCAtNDEsNiArNDEsMTAgQEAKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKKyAgICAgICAgICAgIGlmICghbXNnLmlzSW5Vc2UoKSkgeworICAgICAgICAgICAgICAgIGZhaWx1cmUobmV3IFJ1bnRpbWVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAibXNnLmlzSW51c2UgaXMgZmFsc2UsIHNob3VsZCBhbHdheXMgYmUgdHJ1ZSwgIyIgKyBtc2cud2hhdCkpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKG1Db3VudCA8PSBtTGFzdE1lc3NhZ2UpIHsKICAgICAgICAgICAgICAgICBpZiAobXNnLndoYXQgIT0gbUNvdW50KSB7CiAgICAgICAgICAgICAgICAgICAgIGZhaWx1cmUobmV3IFJ1bnRpbWVFeGNlcHRpb24oCkBAIC05OSw1ICsxMDMsMTc0IEBACiAKICAgICAgICAgdGVzdGVyLmRvVGVzdCgxMDAwKTsKICAgICB9Ci19CiAKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBUZXN0RmllbGRJbnRlZ3JpdHlIYW5kbGVyIGV4dGVuZHMgVGVzdEhhbmRsZXJUaHJlYWQgeworICAgICAgICBIYW5kbGVyIG1IYW5kbGVyOworICAgICAgICBpbnQgbUxhc3RNZXNzYWdlOworICAgICAgICBpbnQgbUNvdW50OworCisgICAgICAgIHB1YmxpYyBUZXN0RmllbGRJbnRlZ3JpdHlIYW5kbGVyKCkgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgZ28oKSB7CisgICAgICAgICAgICBtSGFuZGxlciA9IG5ldyBIYW5kbGVyKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKKyAgICAgICAgICAgICAgICAgICAgVGVzdEZpZWxkSW50ZWdyaXR5SGFuZGxlci50aGlzLmhhbmRsZU1lc3NhZ2UobXNnKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG1zZykgeworICAgICAgICAgICAgaWYgKCFtc2cuaXNJblVzZSgpKSB7CisgICAgICAgICAgICAgICAgZmFpbHVyZShuZXcgUnVudGltZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICJtc2cuaXNJbnVzZSBpcyBmYWxzZSwgc2hvdWxkIGFsd2F5cyBiZSB0cnVlLCAjIiArIG1zZy53aGF0KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobUNvdW50IDw9IG1MYXN0TWVzc2FnZSkgeworICAgICAgICAgICAgICAgIGlmIChtc2cud2hhdCAhPSBtQ291bnQpIHsKKyAgICAgICAgICAgICAgICAgICAgZmFpbHVyZShuZXcgUnVudGltZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgbWVzc2FnZSAjIiArIG1Db3VudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCByZWNlaXZlZCAjIiArIG1zZy53aGF0KSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtQ291bnQgPT0gbUxhc3RNZXNzYWdlKSB7CisgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3MoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbUNvdW50Kys7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZhaWx1cmUobmV3IFJ1bnRpbWVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAiTWVzc2FnZSByZWNlaXZlZCBhZnRlciBkb25lLCAjIiArIG1zZy53aGF0KSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBATWVkaXVtVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGaWVsZEludGVncml0eSgpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIFRlc3RIYW5kbGVyVGhyZWFkIHRlc3RlciA9IG5ldyBUZXN0RmllbGRJbnRlZ3JpdHlIYW5kbGVyKCkgeworICAgICAgICAgICAgQnVuZGxlIG1CdW5kbGU7CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGdvKCkgeworICAgICAgICAgICAgICAgIHN1cGVyLmdvKCk7CisgICAgICAgICAgICAgICAgbUxhc3RNZXNzYWdlID0gMTsKKyAgICAgICAgICAgICAgICBtQ291bnQgPSAwOworICAgICAgICAgICAgICAgIG1IYW5kbGVyLnNlbmRNZXNzYWdlKG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoMCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7CisgICAgICAgICAgICAgICAgc3VwZXIuaGFuZGxlTWVzc2FnZShtc2cpOworICAgICAgICAgICAgICAgIGlmIChtc2cud2hhdCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIG1zZy5mbGFncyA9IC0xOworICAgICAgICAgICAgICAgICAgICBtc2cud2hhdCA9IDE7CisgICAgICAgICAgICAgICAgICAgIG1zZy5hcmcxID0gNDU2OworICAgICAgICAgICAgICAgICAgICBtc2cuYXJnMiA9IDc4OTsKKyAgICAgICAgICAgICAgICAgICAgbXNnLm9iaiA9IHRoaXM7CisgICAgICAgICAgICAgICAgICAgIG1zZy5yZXBseVRvID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgbUJ1bmRsZSA9IG5ldyBCdW5kbGUoKTsKKyAgICAgICAgICAgICAgICAgICAgbXNnLmRhdGEgPSBtQnVuZGxlOworICAgICAgICAgICAgICAgICAgICBtc2cuZGF0YS5wdXRTdHJpbmcoImtleSIsICJ2YWx1ZSIpOworCisgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgbmV3TXNnID0gbUhhbmRsZXIub2J0YWluTWVzc2FnZSgpOworICAgICAgICAgICAgICAgICAgICBuZXdNc2cuY29weUZyb20obXNnKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5ld01zZy5pc0luVXNlKCkgIT0gZmFsc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhaWx1cmUobmV3IFJ1bnRpbWVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuZXdNc2cuaXNJblVzZSBpcyB0cnVlIHNob3VsZCBiZSBmYWxzZSBhZnRlciBjb3B5RnJvbSIpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAobmV3TXNnLmZsYWdzICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhaWx1cmUobmV3IFJ1bnRpbWVFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICJuZXdNc2cuZmxhZ3MgaXMgJWQgc2hvdWxkIGJlIDAgYWZ0ZXIgY29weUZyb20iLCBuZXdNc2cuZmxhZ3MpKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG5ld01zZy53aGF0ICE9IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhaWx1cmUobmV3IFJ1bnRpbWVFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5ld01zZy53aGF0IGlzICVkIHNob3VsZCBiZSAlZCBhZnRlciBjb3B5RnJvbSIsIG5ld01zZy53aGF0LCAxKSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChuZXdNc2cuYXJnMSAhPSA0NTYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhaWx1cmUobmV3IFJ1bnRpbWVFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5ld01zZy5hcmcxIGlzICVkIHNob3VsZCBiZSAlZCBhZnRlciBjb3B5RnJvbSIsIG1zZy5hcmcxLCA0NTYpKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG5ld01zZy5hcmcyICE9IDc4OSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmFpbHVyZShuZXcgUnVudGltZUV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmV3TXNnLmFyZzIgaXMgJWQgc2hvdWxkIGJlICVkIGFmdGVyIGNvcHlGcm9tIiwgbXNnLmFyZzIsIDc4OSkpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAobmV3TXNnLm9iaiAhPSB0aGlzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmYWlsdXJlKG5ldyBSdW50aW1lRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmV3TXNnLm9iaiBzaG91bGQgYmUgJ3RoaXMnIGFmdGVyIGNvcHlGcm9tIikpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChuZXdNc2cucmVwbHlUbyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmYWlsdXJlKG5ldyBSdW50aW1lRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmV3TXNnLnJlcGx5VG8gc2hvdWxkIGJlIG51bGwgYWZ0ZXIgY29weUZyb20iKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG5ld01zZy5kYXRhID09IG1CdW5kbGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhaWx1cmUobmV3IFJ1bnRpbWVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuZXdNc2cuZGF0YSBzaG91bGQgTk9UIGJlIG1CdW5kbGUgYWZ0ZXIgY29weUZyb20iKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKCFuZXdNc2cuZGF0YS5nZXRTdHJpbmcoImtleSIpLmVxdWFscyhtQnVuZGxlLmdldFN0cmluZygia2V5IikpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmYWlsdXJlKG5ldyBSdW50aW1lRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuZXdNc2cuZGF0YS5nZXRTdHJpbmcoXCJrZXlcIikgaXMgJXMgYW5kIGRvZXMgbm90IGVxdWFsIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgbUJ1bmRsZS5nZXRTdHJpbmcoXCJrZXlcIikgd2hpY2ggaXMgJXMgYWZ0ZXIgY29weUZyb20iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdNc2cuZGF0YS5nZXRTdHJpbmcoImtleSIpLCAgbUJ1bmRsZS5nZXRTdHJpbmcoImtleSIpKSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChuZXdNc2cud2hlbiAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmYWlsdXJlKG5ldyBSdW50aW1lRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuZXdNc2cud2hlbiBpcyAlZCBzaG91bGQgYmUgMCBhZnRlciBjb3B5RnJvbSIsIG5ld01zZy53aGVuKSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChuZXdNc2cudGFyZ2V0ICE9IG1IYW5kbGVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmYWlsdXJlKG5ldyBSdW50aW1lRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmV3TXNnLnRhcmdldCBpcyBOT1QgbUhhbmRsZXIgYWZ0ZXIgY29weUZyb20iKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG5ld01zZy5jYWxsYmFjayAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmYWlsdXJlKG5ldyBSdW50aW1lRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmV3TXNnLmNhbGxiYWNrIGlzIE5PVCBudWxsIGFmdGVyIGNvcHlGcm9tIikpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgbUhhbmRsZXIuc2VuZE1lc3NhZ2UobmV3TXNnKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1zZy53aGF0ID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1zZy5pc0luVXNlKCkgIT0gdHJ1ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmFpbHVyZShuZXcgUnVudGltZUV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibXNnLmlzSW5Vc2UgaXMgZmFsc2Ugc2hvdWxkIGJlIHRydWUgYWZ0ZXIgd2hlbiBwcm9jZXNzaW5nICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnLndoYXQpKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG1zZy5hcmcxICE9IDQ1NikgeworICAgICAgICAgICAgICAgICAgICAgICAgZmFpbHVyZShuZXcgUnVudGltZUV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibXNnLmFyZzEgaXMgJWQgc2hvdWxkIGJlICVkIHdoZW4gcHJvY2Vzc2luZyAjICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnLmFyZzEsIDQ1NiwgbXNnLndoYXQpKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG1zZy5hcmcyICE9IDc4OSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmFpbHVyZShuZXcgUnVudGltZUV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibXNnLmFyZzIgaXMgJWQgc2hvdWxkIGJlICVkIHdoZW4gcHJvY2Vzc2luZyAjICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnLmFyZzIsIDc4OSwgbXNnLndoYXQpKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG1zZy5vYmogIT0gdGhpcykgeworICAgICAgICAgICAgICAgICAgICAgICAgZmFpbHVyZShuZXcgUnVudGltZUV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibXNnLm9iaiBzaG91bGQgYmUgJ3RoaXMnIHdoZW4gcHJvY2Vzc2luZyAjICVkIiwgbXNnLndoYXQpKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG1zZy5yZXBseVRvICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhaWx1cmUobmV3IFJ1bnRpbWVFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1zZy5yZXBseVRvIHNob3VsZCBiZSBudWxsIHdoZW4gcHJvY2Vzc2luZyAjICVkIiwgbXNnLndoYXQpKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKCFtc2cuZGF0YS5nZXRTdHJpbmcoImtleSIpLmVxdWFscyhtQnVuZGxlLmdldFN0cmluZygia2V5IikpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmYWlsdXJlKG5ldyBSdW50aW1lRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtc2cuZGF0YS5nZXRTdHJpbmcoXCJrZXlcIikgaXMgJXMgYW5kIGRvZXMgbm90IGVxdWFsIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgbUJ1bmRsZS5nZXRTdHJpbmcoXCJrZXlcIikgd2hpY2ggaXMgJXMgd2hlbiBwcm9jZXNzaW5nICMgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2cuZGF0YS5nZXRTdHJpbmcoImtleSIpLCAgbUJ1bmRsZS5nZXRTdHJpbmcoImtleSIpLCBtc2cud2hhdCkpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAobXNnLndoZW4gIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmFpbHVyZShuZXcgUnVudGltZUV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibXNnLndoZW4gaXMgJWQgc2hvdWxkIGJlIDAgd2hlbiBwcm9jZXNzaW5nICMgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2cud2hlbiwgbXNnLndoYXQpKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG1zZy50YXJnZXQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmFpbHVyZShuZXcgUnVudGltZUV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibXNnLnRhcmdldCBpcyBOT1QgbnVsbCB3aGVuIHByb2Nlc3NpbmcgIyAlZCIsIG1zZy53aGF0KSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChtc2cuY2FsbGJhY2sgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmFpbHVyZShuZXcgUnVudGltZUV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibXNnLmNhbGxiYWNrIGlzIE5PVCBudWxsIHdoZW4gcHJvY2Vzc2luZyAjICVkIiwgbXNnLndoYXQpKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBmYWlsdXJlKG5ldyBSdW50aW1lRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVuZXhwZWN0ZWQgbXNnLndoYXQgaXMgJWQiICsgbXNnLndoYXQpKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIHRlc3Rlci5kb1Rlc3QoMTAwMCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL0NvbnRlbnRWYWx1ZXNCdWlsZGVyLmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvQ29udGVudFZhbHVlc0J1aWxkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjNjMDc3My4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvQ29udGVudFZhbHVlc0J1aWxkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXM7Ci0KLS8qKgotICogQ29udGVudFZhbHVlcy1saWtlIGNsYXNzIHdoaWNoIGVuYWJsZXMgdXNlcnMgdG8gY2hhaW4gcHV0KCkgbWV0aG9kcyBhbmQgcmVzdHJpY3RzCi0gKiB0aGUgb3RoZXIgbWV0aG9kcy4KLSAqLwotLyogcGFja2FnZSAqLyBjbGFzcyBDb250ZW50VmFsdWVzQnVpbGRlciB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBDb250ZW50VmFsdWVzIG1Db250ZW50VmFsdWVzOwotCi0gICAgcHVibGljIENvbnRlbnRWYWx1ZXNCdWlsZGVyKGZpbmFsIENvbnRlbnRWYWx1ZXMgY29udGVudFZhbHVlcykgewotICAgICAgICBtQ29udGVudFZhbHVlcyA9IGNvbnRlbnRWYWx1ZXM7Ci0gICAgfQotCi0gICAgcHVibGljIENvbnRlbnRWYWx1ZXNCdWlsZGVyIHB1dChTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgbUNvbnRlbnRWYWx1ZXMucHV0KGtleSwgdmFsdWUpOwotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29udGVudFZhbHVlc0J1aWxkZXIgcHV0KFN0cmluZyBrZXksIEJ5dGUgdmFsdWUpIHsKLSAgICAgICAgbUNvbnRlbnRWYWx1ZXMucHV0KGtleSwgdmFsdWUpOwotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29udGVudFZhbHVlc0J1aWxkZXIgcHV0KFN0cmluZyBrZXksIFNob3J0IHZhbHVlKSB7Ci0gICAgICAgIG1Db250ZW50VmFsdWVzLnB1dChrZXksIHZhbHVlKTsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgcHVibGljIENvbnRlbnRWYWx1ZXNCdWlsZGVyIHB1dChTdHJpbmcga2V5LCBJbnRlZ2VyIHZhbHVlKSB7Ci0gICAgICAgIG1Db250ZW50VmFsdWVzLnB1dChrZXksIHZhbHVlKTsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgcHVibGljIENvbnRlbnRWYWx1ZXNCdWlsZGVyIHB1dChTdHJpbmcga2V5LCBMb25nIHZhbHVlKSB7Ci0gICAgICAgIG1Db250ZW50VmFsdWVzLnB1dChrZXksIHZhbHVlKTsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgcHVibGljIENvbnRlbnRWYWx1ZXNCdWlsZGVyIHB1dChTdHJpbmcga2V5LCBGbG9hdCB2YWx1ZSkgewotICAgICAgICBtQ29udGVudFZhbHVlcy5wdXQoa2V5LCB2YWx1ZSk7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIHB1YmxpYyBDb250ZW50VmFsdWVzQnVpbGRlciBwdXQoU3RyaW5nIGtleSwgRG91YmxlIHZhbHVlKSB7Ci0gICAgICAgIG1Db250ZW50VmFsdWVzLnB1dChrZXksIHZhbHVlKTsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgcHVibGljIENvbnRlbnRWYWx1ZXNCdWlsZGVyIHB1dChTdHJpbmcga2V5LCBCb29sZWFuIHZhbHVlKSB7Ci0gICAgICAgIG1Db250ZW50VmFsdWVzLnB1dChrZXksIHZhbHVlKTsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgcHVibGljIENvbnRlbnRWYWx1ZXNCdWlsZGVyIHB1dChTdHJpbmcga2V5LCBieXRlW10gdmFsdWUpIHsKLSAgICAgICAgbUNvbnRlbnRWYWx1ZXMucHV0KGtleSwgdmFsdWUpOwotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29udGVudFZhbHVlc0J1aWxkZXIgcHV0TnVsbChTdHJpbmcga2V5KSB7Ci0gICAgICAgIG1Db250ZW50VmFsdWVzLnB1dE51bGwoa2V5KTsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL0NvbnRlbnRWYWx1ZXNWZXJpZmllci5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL0NvbnRlbnRWYWx1ZXNWZXJpZmllci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOWU5ODc1Li4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC9Db250ZW50VmFsdWVzVmVyaWZpZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQ7Ci0KLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5WQ2FyZENvbmZpZzsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5WQ2FyZEVudHJ5OwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLlZDYXJkRW50cnlDb25zdHJ1Y3RvcjsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5WQ2FyZEVudHJ5SGFuZGxlcjsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5WQ2FyZFBhcnNlcjsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5WQ2FyZFBhcnNlcl9WMjE7Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuVkNhcmRQYXJzZXJfVjMwOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLmV4Y2VwdGlvbi5WQ2FyZEV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qIHBhY2thZ2UgKi8gY2xhc3MgQ29udGVudFZhbHVlc1ZlcmlmaWVyIGltcGxlbWVudHMgVkNhcmRFbnRyeUhhbmRsZXIgewotICAgIHByaXZhdGUgQW5kcm9pZFRlc3RDYXNlIG1UZXN0Q2FzZTsKLSAgICBwcml2YXRlIExpc3Q8Q29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbT4gbUNvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW1MaXN0ID0KLSAgICAgICAgbmV3IEFycmF5TGlzdDxDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtPigpOwotICAgIHByaXZhdGUgaW50IG1JbmRleDsKLQotICAgIHB1YmxpYyBDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtIGFkZEVsZW0oQW5kcm9pZFRlc3RDYXNlIGFuZHJvaWRUZXN0Q2FzZSkgewotICAgICAgICBtVGVzdENhc2UgPSBhbmRyb2lkVGVzdENhc2U7Ci0gICAgICAgIENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0gaW1wb3J0VmVyaWZpZXIgPSBuZXcgQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbShhbmRyb2lkVGVzdENhc2UpOwotICAgICAgICBtQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbUxpc3QuYWRkKGltcG9ydFZlcmlmaWVyKTsKLSAgICAgICAgcmV0dXJuIGltcG9ydFZlcmlmaWVyOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHZlcmlmeShpbnQgcmVzSWQsIGludCB2Q2FyZFR5cGUpIHRocm93cyBJT0V4Y2VwdGlvbiwgVkNhcmRFeGNlcHRpb24gewotICAgICAgICB2ZXJpZnkobVRlc3RDYXNlLmdldENvbnRleHQoKS5nZXRSZXNvdXJjZXMoKS5vcGVuUmF3UmVzb3VyY2UocmVzSWQpLCB2Q2FyZFR5cGUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHZlcmlmeShpbnQgcmVzSWQsIGludCB2Q2FyZFR5cGUsIGZpbmFsIFZDYXJkUGFyc2VyIHZDYXJkUGFyc2VyKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgICAgIHZlcmlmeShtVGVzdENhc2UuZ2V0Q29udGV4dCgpLmdldFJlc291cmNlcygpLm9wZW5SYXdSZXNvdXJjZShyZXNJZCksCi0gICAgICAgICAgICAgICAgdkNhcmRUeXBlLCB2Q2FyZFBhcnNlcik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdmVyaWZ5KElucHV0U3RyZWFtIGlzLCBpbnQgdkNhcmRUeXBlKSB0aHJvd3MgSU9FeGNlcHRpb24sIFZDYXJkRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgVkNhcmRQYXJzZXIgdkNhcmRQYXJzZXI7Ci0gICAgICAgIGlmIChWQ2FyZENvbmZpZy5pc1YzMCh2Q2FyZFR5cGUpKSB7Ci0gICAgICAgICAgICB2Q2FyZFBhcnNlciA9IG5ldyBWQ2FyZFBhcnNlcl9WMzAodHJ1ZSk7ICAvLyB1c2UgU3RyaWN0UGFyc2luZwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdkNhcmRQYXJzZXIgPSBuZXcgVkNhcmRQYXJzZXJfVjIxKCk7Ci0gICAgICAgIH0KLSAgICAgICAgdmVyaWZ5KGlzLCB2Q2FyZFR5cGUsIHZDYXJkUGFyc2VyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB2ZXJpZnkoSW5wdXRTdHJlYW0gaXMsIGludCB2Q2FyZFR5cGUsIGZpbmFsIFZDYXJkUGFyc2VyIHZDYXJkUGFyc2VyKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgICAgIFZDYXJkRW50cnlDb25zdHJ1Y3RvciBidWlsZGVyID0KLSAgICAgICAgICAgIG5ldyBWQ2FyZEVudHJ5Q29uc3RydWN0b3IobnVsbCwgbnVsbCwgZmFsc2UsIHZDYXJkVHlwZSwgbnVsbCk7Ci0gICAgICAgIGJ1aWxkZXIuYWRkRW50cnlIYW5kbGVyKHRoaXMpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgdkNhcmRQYXJzZXIucGFyc2UoaXMsIGJ1aWxkZXIpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKGlzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBpcy5jbG9zZSgpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBvblN0YXJ0KCkgewotICAgICAgICBmb3IgKENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0gZWxlbSA6IG1Db250ZW50VmFsdWVzVmVyaWZpZXJFbGVtTGlzdCkgewotICAgICAgICAgICAgZWxlbS5vblBhcnNpbmdTdGFydCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgb25FbnRyeUNyZWF0ZWQoVkNhcmRFbnRyeSBlbnRyeSkgewotICAgICAgICBtVGVzdENhc2UuYXNzZXJ0VHJ1ZShtSW5kZXggPCBtQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbUxpc3Quc2l6ZSgpKTsKLSAgICAgICAgbUNvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW1MaXN0LmdldChtSW5kZXgpLm9uRW50cnlDcmVhdGVkKGVudHJ5KTsKLSAgICAgICAgbUluZGV4Kys7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgb25FbmQoKSB7Ci0gICAgICAgIGZvciAoQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSBlbGVtIDogbUNvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW1MaXN0KSB7Ci0gICAgICAgICAgICBlbGVtLm9uUGFyc2luZ0VuZCgpOwotICAgICAgICAgICAgZWxlbS52ZXJpZnlSZXNvbHZlcigpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL0NvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0uamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC9Db250ZW50VmFsdWVzVmVyaWZpZXJFbGVtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlZGJiMzYuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL0NvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZDsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLlZDYXJkQ29uZmlnOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLlZDYXJkRW50cnk7Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuVkNhcmRFbnRyeUNvbW1pdHRlcjsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5WQ2FyZEVudHJ5Q29uc3RydWN0b3I7Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuVkNhcmRFbnRyeUhhbmRsZXI7Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuVkNhcmRQYXJzZXI7Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuVkNhcmRQYXJzZXJfVjIxOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLlZDYXJkUGFyc2VyX1YzMDsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5leGNlcHRpb24uVkNhcmRFeGNlcHRpb247Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkRhdGE7Ci1pbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLQotLyogcGFja2FnZSAqLyBjbGFzcyBDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtIHsKLSAgICBwcml2YXRlIGZpbmFsIEFuZHJvaWRUZXN0Q2FzZSBtVGVzdENhc2U7Ci0gICAgcHJpdmF0ZSBmaW5hbCBJbXBvcnRUZXN0UmVzb2x2ZXIgbVJlc29sdmVyOwotICAgIHByaXZhdGUgZmluYWwgVkNhcmRFbnRyeUhhbmRsZXIgbUhhbmRsZXI7Ci0KLSAgICBwdWJsaWMgQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbShBbmRyb2lkVGVzdENhc2UgYW5kcm9pZFRlc3RDYXNlKSB7Ci0gICAgICAgIG1UZXN0Q2FzZSA9IGFuZHJvaWRUZXN0Q2FzZTsKLSAgICAgICAgbVJlc29sdmVyID0gbmV3IEltcG9ydFRlc3RSZXNvbHZlcihhbmRyb2lkVGVzdENhc2UpOwotICAgICAgICBtSGFuZGxlciA9IG5ldyBWQ2FyZEVudHJ5Q29tbWl0dGVyKG1SZXNvbHZlcik7Ci0gICAgfQotCi0gICAgcHVibGljIENvbnRlbnRWYWx1ZXNCdWlsZGVyIGFkZEV4cGVjdGVkKFN0cmluZyBtaW1lVHlwZSkgewotICAgICAgICBDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXMgPSBuZXcgQ29udGVudFZhbHVlcygpOwotICAgICAgICBjb250ZW50VmFsdWVzLnB1dChEYXRhLk1JTUVUWVBFLCBtaW1lVHlwZSk7Ci0gICAgICAgIG1SZXNvbHZlci5hZGRFeHBlY3RlZENvbnRlbnRWYWx1ZXMoY29udGVudFZhbHVlcyk7Ci0gICAgICAgIHJldHVybiBuZXcgQ29udGVudFZhbHVlc0J1aWxkZXIoY29udGVudFZhbHVlcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdmVyaWZ5KGludCByZXNJZCwgaW50IHZDYXJkVHlwZSkKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgVkNhcmRFeGNlcHRpb24gewotICAgICAgICB2ZXJpZnkobVRlc3RDYXNlLmdldENvbnRleHQoKS5nZXRSZXNvdXJjZXMoKS5vcGVuUmF3UmVzb3VyY2UocmVzSWQpLCB2Q2FyZFR5cGUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHZlcmlmeShJbnB1dFN0cmVhbSBpcywgaW50IHZDYXJkVHlwZSkgdGhyb3dzIElPRXhjZXB0aW9uLCBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIFZDYXJkUGFyc2VyIHZDYXJkUGFyc2VyOwotICAgICAgICBpZiAoVkNhcmRDb25maWcuaXNWMzAodkNhcmRUeXBlKSkgewotICAgICAgICAgICAgdkNhcmRQYXJzZXIgPSBuZXcgVkNhcmRQYXJzZXJfVjMwKHRydWUpOyAgLy8gdXNlIFN0cmljdFBhcnNpbmcKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHZDYXJkUGFyc2VyID0gbmV3IFZDYXJkUGFyc2VyX1YyMSgpOwotICAgICAgICB9Ci0gICAgICAgIFZDYXJkRW50cnlDb25zdHJ1Y3RvciBidWlsZGVyID0KLSAgICAgICAgICAgICAgICBuZXcgVkNhcmRFbnRyeUNvbnN0cnVjdG9yKG51bGwsIG51bGwsIGZhbHNlLCB2Q2FyZFR5cGUsIG51bGwpOwotICAgICAgICBidWlsZGVyLmFkZEVudHJ5SGFuZGxlcihtSGFuZGxlcik7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB2Q2FyZFBhcnNlci5wYXJzZShpcywgYnVpbGRlcik7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoaXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGlzLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB2ZXJpZnlSZXNvbHZlcigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHZlcmlmeVJlc29sdmVyKCkgewotICAgICAgICBtUmVzb2x2ZXIudmVyaWZ5KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgb25QYXJzaW5nU3RhcnQoKSB7Ci0gICAgICAgIG1IYW5kbGVyLm9uU3RhcnQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBvbkVudHJ5Q3JlYXRlZChWQ2FyZEVudHJ5IGVudHJ5KSB7Ci0gICAgICAgIG1IYW5kbGVyLm9uRW50cnlDcmVhdGVkKGVudHJ5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBvblBhcnNpbmdFbmQoKSB7Ci0gICAgICAgIG1IYW5kbGVyLm9uRW5kKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL0V4cG9ydFRlc3RSZXNvbHZlci5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL0V4cG9ydFRlc3RSZXNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTFkMGQ4Li4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC9FeHBvcnRUZXN0UmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKLSAqIHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0gKiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKLSAqIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQotICogTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKLSAqIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlczsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuRW50aXR5OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5FbnRpdHlJdGVyYXRvcjsKLWltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcjsKLWltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbnRhY3RzOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5EYXRhOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5SYXdDb250YWN0czsKLWltcG9ydCBhbmRyb2lkLnRlc3QubW9jay5Nb2NrQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQudGVzdC5tb2NrLk1vY2tDb250ZW50UmVzb2x2ZXI7Ci1pbXBvcnQgYW5kcm9pZC50ZXN0Lm1vY2suTW9ja0N1cnNvcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKiBwYWNrYWdlICovIHB1YmxpYyBjbGFzcyBFeHBvcnRUZXN0UmVzb2x2ZXIgZXh0ZW5kcyBNb2NrQ29udGVudFJlc29sdmVyIHsKLSAgICBFeHBvcnRUZXN0UHJvdmlkZXIgbVByb3ZpZGVyOwotICAgIHB1YmxpYyBFeHBvcnRUZXN0UmVzb2x2ZXIoVGVzdENhc2UgdGVzdENhc2UpIHsKLSAgICAgICAgbVByb3ZpZGVyID0gbmV3IEV4cG9ydFRlc3RQcm92aWRlcih0ZXN0Q2FzZSk7Ci0gICAgICAgIGFkZFByb3ZpZGVyKFZDYXJkQ29tcG9zZXIuVkNBUkRfVEVTVF9BVVRIT1JJVFksIG1Qcm92aWRlcik7Ci0gICAgICAgIGFkZFByb3ZpZGVyKFJhd0NvbnRhY3RzLkNPTlRFTlRfVVJJLmdldEF1dGhvcml0eSgpLCBtUHJvdmlkZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyBDb250YWN0RW50cnkgYWRkSW5wdXRDb250YWN0RW50cnkoKSB7Ci0gICAgICAgIHJldHVybiBtUHJvdmlkZXIuYnVpbGRJbnB1dEVudHJ5KCk7Ci0gICAgfQotCi0gICAgcHVibGljIEV4cG9ydFRlc3RQcm92aWRlciBnZXRQcm92aWRlcigpIHsKLSAgICAgICAgcmV0dXJuIG1Qcm92aWRlcjsKLSAgICB9Ci19Ci0KLS8qIHBhY2thZ2UgKi8gY2xhc3MgTW9ja0VudGl0eUl0ZXJhdG9yIGltcGxlbWVudHMgRW50aXR5SXRlcmF0b3IgewotICAgIExpc3Q8RW50aXR5PiBtRW50aXR5TGlzdDsKLSAgICBJdGVyYXRvcjxFbnRpdHk+IG1JdGVyYXRvcjsKLQotICAgIHB1YmxpYyBNb2NrRW50aXR5SXRlcmF0b3IoTGlzdDxDb250ZW50VmFsdWVzPiBjb250ZW50VmFsdWVzTGlzdCkgewotICAgICAgICBtRW50aXR5TGlzdCA9IG5ldyBBcnJheUxpc3Q8RW50aXR5PigpOwotICAgICAgICBFbnRpdHkgZW50aXR5ID0gbmV3IEVudGl0eShuZXcgQ29udGVudFZhbHVlcygpKTsKLSAgICAgICAgZm9yIChDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXMgOiBjb250ZW50VmFsdWVzTGlzdCkgewotICAgICAgICAgICAgICAgIGVudGl0eS5hZGRTdWJWYWx1ZShEYXRhLkNPTlRFTlRfVVJJLCBjb250ZW50VmFsdWVzKTsKLSAgICAgICAgfQotICAgICAgICBtRW50aXR5TGlzdC5hZGQoZW50aXR5KTsKLSAgICAgICAgbUl0ZXJhdG9yID0gbUVudGl0eUxpc3QuaXRlcmF0b3IoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotICAgICAgICByZXR1cm4gbUl0ZXJhdG9yLmhhc05leHQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRW50aXR5IG5leHQoKSB7Ci0gICAgICAgIHJldHVybiBtSXRlcmF0b3IubmV4dCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJyZW1vdmUgbm90IHN1cHBvcnRlZCIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkgewotICAgICAgICBtSXRlcmF0b3IgPSBtRW50aXR5TGlzdC5pdGVyYXRvcigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgewotICAgIH0KLX0KLQotLyoqCi0gKiBSZXByZXNlbnRzIG9uZSBjb250YWN0LCB3aGljaCBzaG91bGQgY29udGFpbiBtdWx0aXBsZSBDb250ZW50VmFsdWVzIGxpa2UKLSAqIFN0cnVjdHVyZWROYW1lLCBFbWFpbCwgZXRjLgotICovCi0vKiBwYWNrYWdlICovIGNsYXNzIENvbnRhY3RFbnRyeSB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBMaXN0PENvbnRlbnRWYWx1ZXM+IG1Db250ZW50VmFsdWVzTGlzdCA9IG5ldyBBcnJheUxpc3Q8Q29udGVudFZhbHVlcz4oKTsKLQotICAgIHB1YmxpYyBDb250ZW50VmFsdWVzQnVpbGRlciBhZGRDb250ZW50VmFsdWVzKFN0cmluZyBtaW1lVHlwZSkgewotICAgICAgICBDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXMgPSBuZXcgQ29udGVudFZhbHVlcygpOwotICAgICAgICBjb250ZW50VmFsdWVzLnB1dChEYXRhLk1JTUVUWVBFLCBtaW1lVHlwZSk7Ci0gICAgICAgIG1Db250ZW50VmFsdWVzTGlzdC5hZGQoY29udGVudFZhbHVlcyk7Ci0gICAgICAgIHJldHVybiBuZXcgQ29udGVudFZhbHVlc0J1aWxkZXIoY29udGVudFZhbHVlcyk7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8Q29udGVudFZhbHVlcz4gZ2V0TGlzdCgpIHsKLSAgICAgICAgcmV0dXJuIG1Db250ZW50VmFsdWVzTGlzdDsKLSAgICB9Ci19Ci0KLS8qIHBhY2thZ2UgKi8gY2xhc3MgRXhwb3J0VGVzdFByb3ZpZGVyIGV4dGVuZHMgTW9ja0NvbnRlbnRQcm92aWRlciB7Ci0gICAgZmluYWwgcHJpdmF0ZSBUZXN0Q2FzZSBtVGVzdENhc2U7Ci0gICAgZmluYWwgcHJpdmF0ZSBBcnJheUxpc3Q8Q29udGFjdEVudHJ5PiBtQ29udGFjdEVudHJ5TGlzdCA9IG5ldyBBcnJheUxpc3Q8Q29udGFjdEVudHJ5PigpOwotCi0gICAgcHVibGljIEV4cG9ydFRlc3RQcm92aWRlcihUZXN0Q2FzZSB0ZXN0Q2FzZSkgewotICAgICAgICBtVGVzdENhc2UgPSB0ZXN0Q2FzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29udGFjdEVudHJ5IGJ1aWxkSW5wdXRFbnRyeSgpIHsKLSAgICAgICAgQ29udGFjdEVudHJ5IGNvbnRhY3RFbnRyeSA9IG5ldyBDb250YWN0RW50cnkoKTsKLSAgICAgICAgbUNvbnRhY3RFbnRyeUxpc3QuYWRkKGNvbnRhY3RFbnRyeSk7Ci0gICAgICAgIHJldHVybiBjb250YWN0RW50cnk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogQW4gb2xkIG1ldGhvZCB3aGljaCBoYWQgZXhpc3RlZCBidXQgd2FzIHJlbW92ZWQgZnJvbSBDb250ZW50UmVzb2x2ZXIuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIFdlIHN0aWxsIGtlZXAgdXNpbmcgdGhpcyBtZXRob2Qgc2luY2Ugd2UgZG9uJ3QgaGF2ZSBhIHByb3BlZXIgd2F5IHRvIGtub3cKLSAgICAgKiB3aGljaCB2YWx1ZSBpbiB0aGUgQ29udGVudFZhbHVlIGNvcnJlc3BvbmRzIHRvIHRoZSBlbnRyeSBpbiBDb250YWN0cyBkYXRhYmFzZS4KLSAgICAgKiA8L3A+Ci0gICAgICogPHA+Ci0gICAgICogRGV0YWlsOgotICAgICAqIFRoZXJlJ3MgYW4gZWFzeSB3YXkgdG8ga25vdyB3aGljaCBpbmRleCAiZmFtaWx5IG5hbWUiIGNvcnJlc3BvbmRzIHRvLCB2aWEKLSAgICAgKiB7QGxpbmsgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0fS4KLSAgICAgKiBGQU1JTFlfTkFNRSBlcXVhbHMgREFUQTMsIHNvIHRoZSBjb3JyZXNwb25kaW5nIGluZGV4Ci0gICAgICogZm9yICJmYW1pbHkgbmFtZSIgc2hvdWxkIGJlIDIgKG5vdGUgdGhhdCBpbmRleCBpcyAwLW9yaWdpbikuCi0gICAgICogSG93ZXZlciwgd2UgY2Fubm90IGtub3cgd2hhdCB0aGUgaW5kZXggMiBjb3JyZXNwb25kcyB0bzsgaXQgbWF5IGJlICJmYW1pbHkgbmFtZSIsCi0gICAgICogImxhYmVsIiBmb3Igbm93LCBidXQgbWF5IGJlIHRoZSBvdGhlciBzb21lIGNvbHVtbiBpbiB0aGUgZnV0dXJlLiBXZSBkb24ndCBoYXZlCi0gICAgICogY29udmVuaWVudCB3YXkgdG8ga25vdyB0aGUgb3JpZ2luYWwgZGF0YSBzdHJ1Y3R1cmUuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBFbnRpdHlJdGVyYXRvciBxdWVyeUVudGl0aWVzKFVyaSB1cmksCi0gICAgICAgICAgICBTdHJpbmcgc2VsZWN0aW9uLCBTdHJpbmdbXSBzZWxlY3Rpb25BcmdzLCBTdHJpbmcgc29ydE9yZGVyKSB7Ci0gICAgICAgIG1UZXN0Q2FzZS5hc3NlcnRUcnVlKHVyaSAhPSBudWxsKTsKLSAgICAgICAgbVRlc3RDYXNlLmFzc2VydFRydWUoQ29udGVudFJlc29sdmVyLlNDSEVNRV9DT05URU5ULmVxdWFscyh1cmkuZ2V0U2NoZW1lKCkpKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIGF1dGhvcml0eSA9IHVyaS5nZXRBdXRob3JpdHkoKTsKLSAgICAgICAgbVRlc3RDYXNlLmFzc2VydFRydWUoUmF3Q29udGFjdHMuQ09OVEVOVF9VUkkuZ2V0QXV0aG9yaXR5KCkuZXF1YWxzKGF1dGhvcml0eSkpOwotICAgICAgICBtVGVzdENhc2UuYXNzZXJ0VHJ1ZSgoRGF0YS5DT05UQUNUX0lEICsgIj0/IikuZXF1YWxzKHNlbGVjdGlvbikpOwotICAgICAgICBtVGVzdENhc2UuYXNzZXJ0RXF1YWxzKDEsIHNlbGVjdGlvbkFyZ3MubGVuZ3RoKTsKLSAgICAgICAgZmluYWwgaW50IGlkID0gSW50ZWdlci5wYXJzZUludChzZWxlY3Rpb25BcmdzWzBdKTsKLSAgICAgICAgbVRlc3RDYXNlLmFzc2VydFRydWUoaWQgPj0gMCAmJiBpZCA8IG1Db250YWN0RW50cnlMaXN0LnNpemUoKSk7Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBNb2NrRW50aXR5SXRlcmF0b3IobUNvbnRhY3RFbnRyeUxpc3QuZ2V0KGlkKS5nZXRMaXN0KCkpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBDdXJzb3IgcXVlcnkoVXJpIHVyaSxTdHJpbmdbXSBwcm9qZWN0aW9uLAotICAgICAgICAgICAgU3RyaW5nIHNlbGVjdGlvbiwgU3RyaW5nW10gc2VsZWN0aW9uQXJncywgU3RyaW5nIHNvcnRPcmRlcikgewotICAgICAgICBtVGVzdENhc2UuYXNzZXJ0VHJ1ZShWQ2FyZENvbXBvc2VyLkNPTlRBQ1RTX1RFU1RfQ09OVEVOVF9VUkkuZXF1YWxzKHVyaSkpOwotICAgICAgICAvLyBJbiB0aGlzIHRlc3QsIGZvbGxvd2luZyBhcmd1bWVudHMgYXJlIG5vdCBzdXBwb3J0ZWQuCi0gICAgICAgIG1UZXN0Q2FzZS5hc3NlcnROdWxsKHNlbGVjdGlvbik7Ci0gICAgICAgIG1UZXN0Q2FzZS5hc3NlcnROdWxsKHNlbGVjdGlvbkFyZ3MpOwotICAgICAgICBtVGVzdENhc2UuYXNzZXJ0TnVsbChzb3J0T3JkZXIpOwotCi0gICAgICAgIHJldHVybiBuZXcgTW9ja0N1cnNvcigpIHsKLSAgICAgICAgICAgIGludCBtQ3VycmVudFBvc2l0aW9uID0gLTE7Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIGludCBnZXRDb3VudCgpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbUNvbnRhY3RFbnRyeUxpc3Quc2l6ZSgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIG1vdmVUb0ZpcnN0KCkgewotICAgICAgICAgICAgICAgIG1DdXJyZW50UG9zaXRpb24gPSAwOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIG1vdmVUb05leHQoKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1DdXJyZW50UG9zaXRpb24gPCBtQ29udGFjdEVudHJ5TGlzdC5zaXplKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRQb3NpdGlvbisrOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGlzQmVmb3JlRmlyc3QoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1DdXJyZW50UG9zaXRpb24gPCAwOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGlzQWZ0ZXJMYXN0KCkgewotICAgICAgICAgICAgICAgIHJldHVybiBtQ3VycmVudFBvc2l0aW9uID49IG1Db250YWN0RW50cnlMaXN0LnNpemUoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgaW50IGdldENvbHVtbkluZGV4KFN0cmluZyBjb2x1bW5OYW1lKSB7Ci0gICAgICAgICAgICAgICAgbVRlc3RDYXNlLmFzc2VydEVxdWFscyhDb250YWN0cy5fSUQsIGNvbHVtbk5hbWUpOwotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBpbnQgZ2V0SW50KGludCBjb2x1bW5JbmRleCkgewotICAgICAgICAgICAgICAgIG1UZXN0Q2FzZS5hc3NlcnRFcXVhbHMoMCwgY29sdW1uSW5kZXgpOwotICAgICAgICAgICAgICAgIG1UZXN0Q2FzZS5hc3NlcnRUcnVlKG1DdXJyZW50UG9zaXRpb24gPj0gMAotICAgICAgICAgICAgICAgICAgICAgICAgJiYgbUN1cnJlbnRQb3NpdGlvbiA8IG1Db250YWN0RW50cnlMaXN0LnNpemUoKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1DdXJyZW50UG9zaXRpb247Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXRTdHJpbmcoaW50IGNvbHVtbkluZGV4KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZy52YWx1ZU9mKGdldEludChjb2x1bW5JbmRleCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgewotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC9JbXBvcnRUZXN0UmVzb2x2ZXIuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC9JbXBvcnRUZXN0UmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTU2M2RhOS4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvSW1wb3J0VGVzdFJlc29sdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRQcm92aWRlck9wZXJhdGlvbjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFByb3ZpZGVyUmVzdWx0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzOwotaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLkVtYWlsOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuRXZlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5Hcm91cE1lbWJlcnNoaXA7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5JbTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLk5pY2tuYW1lOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuTm90ZTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLk9yZ2FuaXphdGlvbjsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLlBob25lOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuUGhvdG87Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5SZWxhdGlvbjsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLlN0cnVjdHVyZWROYW1lOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuU3RydWN0dXJlZFBvc3RhbDsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLldlYnNpdGU7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkRhdGE7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LlJhd0NvbnRhY3RzOwotaW1wb3J0IGFuZHJvaWQudGVzdC5tb2NrLk1vY2tDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC50ZXN0Lm1vY2suTW9ja0NvbnRlbnRSZXNvbHZlcjsKLWltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5Tb3J0ZWRNYXA7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVNYXA7Ci0KLS8qIHBhY2thZ2UgKi8gY2xhc3MgSW1wb3J0VGVzdFJlc29sdmVyIGV4dGVuZHMgTW9ja0NvbnRlbnRSZXNvbHZlciB7Ci0gICAgZmluYWwgSW1wb3J0VGVzdFByb3ZpZGVyIG1Qcm92aWRlcjsKLQotICAgIHB1YmxpYyBJbXBvcnRUZXN0UmVzb2x2ZXIoVGVzdENhc2UgdGVzdENhc2UpIHsKLSAgICAgICAgbVByb3ZpZGVyID0gbmV3IEltcG9ydFRlc3RQcm92aWRlcih0ZXN0Q2FzZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIENvbnRlbnRQcm92aWRlclJlc3VsdFtdIGFwcGx5QmF0Y2goU3RyaW5nIGF1dGhvcml0eSwKLSAgICAgICAgICAgIEFycmF5TGlzdDxDb250ZW50UHJvdmlkZXJPcGVyYXRpb24+IG9wZXJhdGlvbnMpIHsKLSAgICAgICAgZXF1YWxzU3RyaW5nKGF1dGhvcml0eSwgUmF3Q29udGFjdHMuQ09OVEVOVF9VUkkudG9TdHJpbmcoKSk7Ci0gICAgICAgIHJldHVybiBtUHJvdmlkZXIuYXBwbHlCYXRjaChvcGVyYXRpb25zKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRFeHBlY3RlZENvbnRlbnRWYWx1ZXMoQ29udGVudFZhbHVlcyBleHBlY3RlZENvbnRlbnRWYWx1ZXMpIHsKLSAgICAgICAgbVByb3ZpZGVyLmFkZEV4cGVjdGVkQ29udGVudFZhbHVlcyhleHBlY3RlZENvbnRlbnRWYWx1ZXMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHZlcmlmeSgpIHsKLSAgICAgICAgbVByb3ZpZGVyLnZlcmlmeSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gZXF1YWxzU3RyaW5nKFN0cmluZyBhLCBTdHJpbmcgYikgewotICAgICAgICBpZiAoYSA9PSBudWxsIHx8IGEubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIGIgPT0gbnVsbCB8fCBiLmxlbmd0aCgpID09IDA7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gYS5lcXVhbHMoYik7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLS8qIHBhY2thZ2UgKi8gY2xhc3MgSW1wb3J0VGVzdFByb3ZpZGVyIGV4dGVuZHMgTW9ja0NvbnRlbnRQcm92aWRlciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2V0PFN0cmluZz4gc0tub3duTWltZVR5cGVTZXQgPQotICAgICAgICBuZXcgSGFzaFNldDxTdHJpbmc+KEFycmF5cy5hc0xpc3QoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUsCi0gICAgICAgICAgICAgICAgTmlja25hbWUuQ09OVEVOVF9JVEVNX1RZUEUsIFBob25lLkNPTlRFTlRfSVRFTV9UWVBFLAotICAgICAgICAgICAgICAgIEVtYWlsLkNPTlRFTlRfSVRFTV9UWVBFLCBTdHJ1Y3R1cmVkUG9zdGFsLkNPTlRFTlRfSVRFTV9UWVBFLAotICAgICAgICAgICAgICAgIEltLkNPTlRFTlRfSVRFTV9UWVBFLCBPcmdhbml6YXRpb24uQ09OVEVOVF9JVEVNX1RZUEUsCi0gICAgICAgICAgICAgICAgRXZlbnQuQ09OVEVOVF9JVEVNX1RZUEUsIFBob3RvLkNPTlRFTlRfSVRFTV9UWVBFLAotICAgICAgICAgICAgICAgIE5vdGUuQ09OVEVOVF9JVEVNX1RZUEUsIFdlYnNpdGUuQ09OVEVOVF9JVEVNX1RZUEUsCi0gICAgICAgICAgICAgICAgUmVsYXRpb24uQ09OVEVOVF9JVEVNX1RZUEUsIEV2ZW50LkNPTlRFTlRfSVRFTV9UWVBFLAotICAgICAgICAgICAgICAgIEdyb3VwTWVtYmVyc2hpcC5DT05URU5UX0lURU1fVFlQRSkpOwotCi0gICAgZmluYWwgTWFwPFN0cmluZywgQ29sbGVjdGlvbjxDb250ZW50VmFsdWVzPj4gbU1pbWVUeXBlVG9FeHBlY3RlZENvbnRlbnRWYWx1ZXM7Ci0KLSAgICBwcml2YXRlIGZpbmFsIFRlc3RDYXNlIG1UZXN0Q2FzZTsKLQotICAgIHB1YmxpYyBJbXBvcnRUZXN0UHJvdmlkZXIoVGVzdENhc2UgdGVzdENhc2UpIHsKLSAgICAgICAgbVRlc3RDYXNlID0gdGVzdENhc2U7Ci0gICAgICAgIG1NaW1lVHlwZVRvRXhwZWN0ZWRDb250ZW50VmFsdWVzID0KLSAgICAgICAgICAgIG5ldyBIYXNoTWFwPFN0cmluZywgQ29sbGVjdGlvbjxDb250ZW50VmFsdWVzPj4oKTsKLSAgICAgICAgZm9yIChTdHJpbmcgYWNjZXB0YW5ibGVNaW1lVHlwZSA6IHNLbm93bk1pbWVUeXBlU2V0KSB7Ci0gICAgICAgICAgICAvLyBEbyBub3QgdXNlIEhhc2hTZXQgc2luY2UgdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gY2hhbmdlcyB0aGUgY29udGVudCBvZgotICAgICAgICAgICAgLy8gQ29udGVudFZhbHVlcyBhZnRlciB0aGUgaW5zZXJ0aW9uLCB3aGljaCBtYWtlIHRoZSByZXN1bHQgb2YgaGFzaENvZGUoKQotICAgICAgICAgICAgLy8gY2hhbmdlcy4uLgotICAgICAgICAgICAgbU1pbWVUeXBlVG9FeHBlY3RlZENvbnRlbnRWYWx1ZXMucHV0KAotICAgICAgICAgICAgICAgICAgICBhY2NlcHRhbmJsZU1pbWVUeXBlLCBuZXcgQXJyYXlMaXN0PENvbnRlbnRWYWx1ZXM+KCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkRXhwZWN0ZWRDb250ZW50VmFsdWVzKENvbnRlbnRWYWx1ZXMgZXhwZWN0ZWRDb250ZW50VmFsdWVzKSB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBtaW1lVHlwZSA9IGV4cGVjdGVkQ29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhEYXRhLk1JTUVUWVBFKTsKLSAgICAgICAgaWYgKCFzS25vd25NaW1lVHlwZVNldC5jb250YWlucyhtaW1lVHlwZSkpIHsKLSAgICAgICAgICAgIG1UZXN0Q2FzZS5mYWlsKFN0cmluZy5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICJVbmtub3cgTWltZVR5cGUgJXMgaW4gdGhlIHRlc3QgY29kZS4gVGVzdCBjb2RlIHNob3VsZCBiZSBicm9rZW4uIiwKLSAgICAgICAgICAgICAgICAgICAgbWltZVR5cGUpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIENvbGxlY3Rpb248Q29udGVudFZhbHVlcz4gY29udGVudFZhbHVlc0NvbGxlY3Rpb24gPQotICAgICAgICAgICAgICAgIG1NaW1lVHlwZVRvRXhwZWN0ZWRDb250ZW50VmFsdWVzLmdldChtaW1lVHlwZSk7Ci0gICAgICAgIGNvbnRlbnRWYWx1ZXNDb2xsZWN0aW9uLmFkZChleHBlY3RlZENvbnRlbnRWYWx1ZXMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBDb250ZW50UHJvdmlkZXJSZXN1bHRbXSBhcHBseUJhdGNoKAotICAgICAgICAgICAgQXJyYXlMaXN0PENvbnRlbnRQcm92aWRlck9wZXJhdGlvbj4gb3BlcmF0aW9ucykgewotICAgICAgICBpZiAob3BlcmF0aW9ucyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtVGVzdENhc2UuZmFpbCgiVGhlcmUgaXMgbm8gb3BlcmF0aW9uLiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgaW50IHNpemUgPSBvcGVyYXRpb25zLnNpemUoKTsKLSAgICAgICAgQ29udGVudFByb3ZpZGVyUmVzdWx0W10gZmFrZVJlc3VsdEFycmF5ID0gbmV3IENvbnRlbnRQcm92aWRlclJlc3VsdFtzaXplXTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgICAgIFVyaSB1cmkgPSBVcmkud2l0aEFwcGVuZGVkUGF0aChSYXdDb250YWN0cy5DT05URU5UX1VSSSwgU3RyaW5nLnZhbHVlT2YoaSkpOwotICAgICAgICAgICAgZmFrZVJlc3VsdEFycmF5W2ldID0gbmV3IENvbnRlbnRQcm92aWRlclJlc3VsdCh1cmkpOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgICAgIENvbnRlbnRQcm92aWRlck9wZXJhdGlvbiBvcGVyYXRpb24gPSBvcGVyYXRpb25zLmdldChpKTsKLSAgICAgICAgICAgIENvbnRlbnRWYWx1ZXMgY29udGVudFZhbHVlcyA9IG9wZXJhdGlvbi5yZXNvbHZlVmFsdWVCYWNrUmVmZXJlbmNlcygKLSAgICAgICAgICAgICAgICAgICAgZmFrZVJlc3VsdEFycmF5LCBpKTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICAgICAgQ29udGVudFByb3ZpZGVyT3BlcmF0aW9uIG9wZXJhdGlvbiA9IG9wZXJhdGlvbnMuZ2V0KGkpOwotICAgICAgICAgICAgQ29udGVudFZhbHVlcyBhY3R1YWxDb250ZW50VmFsdWVzID0gb3BlcmF0aW9uLnJlc29sdmVWYWx1ZUJhY2tSZWZlcmVuY2VzKAotICAgICAgICAgICAgICAgICAgICBmYWtlUmVzdWx0QXJyYXksIGkpOwotICAgICAgICAgICAgZmluYWwgVXJpIHVyaSA9IG9wZXJhdGlvbi5nZXRVcmkoKTsKLSAgICAgICAgICAgIGlmICh1cmkuZXF1YWxzKFJhd0NvbnRhY3RzLkNPTlRFTlRfVVJJKSkgewotICAgICAgICAgICAgICAgIG1UZXN0Q2FzZS5hc3NlcnROdWxsKGFjdHVhbENvbnRlbnRWYWx1ZXMuZ2V0KFJhd0NvbnRhY3RzLkFDQ09VTlRfTkFNRSkpOwotICAgICAgICAgICAgICAgIG1UZXN0Q2FzZS5hc3NlcnROdWxsKGFjdHVhbENvbnRlbnRWYWx1ZXMuZ2V0KFJhd0NvbnRhY3RzLkFDQ09VTlRfVFlQRSkpOwotICAgICAgICAgICAgfSBlbHNlIGlmICh1cmkuZXF1YWxzKERhdGEuQ09OVEVOVF9VUkkpKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1pbWVUeXBlID0gYWN0dWFsQ29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhEYXRhLk1JTUVUWVBFKTsKLSAgICAgICAgICAgICAgICBpZiAoIXNLbm93bk1pbWVUeXBlU2V0LmNvbnRhaW5zKG1pbWVUeXBlKSkgewotICAgICAgICAgICAgICAgICAgICBtVGVzdENhc2UuZmFpbChTdHJpbmcuZm9ybWF0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbmtub3duIE1pbWVUeXBlICVzLiBQcm9iYWJseSBhZGRlZCBhZnRlciBkZXZlbG9waW5nIHRoaXMgdGVzdCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWltZVR5cGUpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gUmVtb3ZlIGRhdGEgbWVhbmluZ2xlc3MgaW4gdGhpcyB1bml0IHRlc3RzLgotICAgICAgICAgICAgICAgIC8vIFNwZWNpZmljYWxseSwgRGF0YS5EQVRBMSAtIERBVEE3IGFyZSBzZXQgdG8gbnVsbCBvciBlbXB0eSBTdHJpbmcKLSAgICAgICAgICAgICAgICAvLyByZWdhcmRsZXNzIG9mIHRoZSBpbnB1dCwgYnV0IGl0IG1heSBjaGFuZ2UgZGVwZW5kaW5nIG9uIGhvdwotICAgICAgICAgICAgICAgIC8vIHJlc29sdmVyLXJlbGF0ZWQgY29kZSBoYW5kbGVzIGl0LgotICAgICAgICAgICAgICAgIC8vIEhlcmUsIHdlIGlnbm9yZSB0aGVzZSBpbXBsZW1lbnRhdGlvbi1kZXBlbmRlbnQgc3BlY3MgYW5kCi0gICAgICAgICAgICAgICAgLy8ganVzdCBjaGVjayB3aGV0aGVyIHZDYXJkIGltcG9ydGVyIGNvcnJlY3RseSBpbnNlcnRzIHJlbGxldmVudCBkYXRhLgotICAgICAgICAgICAgICAgIFNldDxTdHJpbmc+IGtleVRvQmVSZW1vdmVkID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotICAgICAgICAgICAgICAgIGZvciAoRW50cnk8U3RyaW5nLCBPYmplY3Q+IGVudHJ5IDogYWN0dWFsQ29udGVudFZhbHVlcy52YWx1ZVNldCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IGVudHJ5LmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsIHx8IFRleHRVdGlscy5pc0VtcHR5KHZhbHVlLnRvU3RyaW5nKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBrZXlUb0JlUmVtb3ZlZC5hZGQoZW50cnkuZ2V0S2V5KCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIGtleToga2V5VG9CZVJlbW92ZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgYWN0dWFsQ29udGVudFZhbHVlcy5yZW1vdmUoa2V5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLyogZm9yIHRlc3RpbmcKLSAgICAgICAgICAgICAgICBMb2cuZCgiQEBAIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoIk1pbWVUeXBlOiAlcywgZGF0YTogJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW1lVHlwZSwgYWN0dWFsQ29udGVudFZhbHVlcy50b1N0cmluZygpKSk7ICovCi0gICAgICAgICAgICAgICAgLy8gUmVtb3ZlIFJBV19DT05UQUNUX0lEIGVudHJ5IGp1c3QgZm9yIHNhZmV0eSwgc2luY2Ugd2UgZG8gbm90IGNhcmUKLSAgICAgICAgICAgICAgICAvLyBob3cgcmVzb2x2ZXItcmVsYXRlZCBjb2RlIGhhbmRsZXMgdGhlIGVudHJ5IGluIHRoaXMgdW5pdCB0ZXN0LAotICAgICAgICAgICAgICAgIGlmIChhY3R1YWxDb250ZW50VmFsdWVzLmNvbnRhaW5zS2V5KERhdGEuUkFXX0NPTlRBQ1RfSUQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFjdHVhbENvbnRlbnRWYWx1ZXMucmVtb3ZlKERhdGEuUkFXX0NPTlRBQ1RfSUQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmaW5hbCBDb2xsZWN0aW9uPENvbnRlbnRWYWx1ZXM+IGNvbnRlbnRWYWx1ZXNDb2xsZWN0aW9uID0KLSAgICAgICAgICAgICAgICAgICAgbU1pbWVUeXBlVG9FeHBlY3RlZENvbnRlbnRWYWx1ZXMuZ2V0KG1pbWVUeXBlKTsKLSAgICAgICAgICAgICAgICBpZiAoY29udGVudFZhbHVlc0NvbGxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1UZXN0Q2FzZS5mYWlsKCJDb250ZW50VmFsdWVzIGZvciBNaW1lVHlwZSAiICsgbWltZVR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgaXMgbm90IGV4cGVjdGVkIGF0IGFsbCAoIiArIGFjdHVhbENvbnRlbnRWYWx1ZXMgKyAiKSIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBib29sZWFuIGNoZWNrZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBmb3IgKENvbnRlbnRWYWx1ZXMgZXhwZWN0ZWRDb250ZW50VmFsdWVzIDogY29udGVudFZhbHVlc0NvbGxlY3Rpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgLypmb3IgdGVzdGluZwotICAgICAgICAgICAgICAgICAgICBMb2cuZCgiQEBAIiwgImV4cGVjdGVkOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBjb252ZXJ0VG9FYXNpbHlSZWFkYWJsZVN0cmluZyhleHBlY3RlZENvbnRlbnRWYWx1ZXMpKTsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoIkBAQCIsICJhY3R1YWwgIDogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgY29udmVydFRvRWFzaWx5UmVhZGFibGVTdHJpbmcoYWN0dWFsQ29udGVudFZhbHVlcykpOyovCi0gICAgICAgICAgICAgICAgICAgIGlmIChlcXVhbHNGb3JDb250ZW50VmFsdWVzKGV4cGVjdGVkQ29udGVudFZhbHVlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWxDb250ZW50VmFsdWVzKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbVRlc3RDYXNlLmFzc2VydFRydWUoY29udGVudFZhbHVlc0NvbGxlY3Rpb24ucmVtb3ZlKGV4cGVjdGVkQ29udGVudFZhbHVlcykpOwotICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoIWNoZWNrZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIlVuZXhwZWN0ZWQ6ICIpOwotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChjb252ZXJ0VG9FYXNpbHlSZWFkYWJsZVN0cmluZyhhY3R1YWxDb250ZW50VmFsdWVzKSk7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCJcbkV4cGVjdGVkOiAiKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChDb250ZW50VmFsdWVzIGV4cGVjdGVkQ29udGVudFZhbHVlcyA6IGNvbnRlbnRWYWx1ZXNDb2xsZWN0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChjb252ZXJ0VG9FYXNpbHlSZWFkYWJsZVN0cmluZyhleHBlY3RlZENvbnRlbnRWYWx1ZXMpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtVGVzdENhc2UuZmFpbChidWlsZGVyLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbVRlc3RDYXNlLmZhaWwoIlVuZXhwZWN0ZWQgVXJpIGhhcyBjb21lOiAiICsgdXJpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSAgLy8gZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgcmV0dXJuIGZha2VSZXN1bHRBcnJheTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB2ZXJpZnkoKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIGZvciAoQ29sbGVjdGlvbjxDb250ZW50VmFsdWVzPiBjb250ZW50VmFsdWVzQ29sbGVjdGlvbiA6Ci0gICAgICAgICAgICAgICAgbU1pbWVUeXBlVG9FeHBlY3RlZENvbnRlbnRWYWx1ZXMudmFsdWVzKCkpIHsKLSAgICAgICAgICAgIGZvciAoQ29udGVudFZhbHVlcyBleHBlY3RlZENvbnRlbnRWYWx1ZXM6IGNvbnRlbnRWYWx1ZXNDb2xsZWN0aW9uKSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoY29udmVydFRvRWFzaWx5UmVhZGFibGVTdHJpbmcoZXhwZWN0ZWRDb250ZW50VmFsdWVzKSk7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIlxuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGJ1aWxkZXIubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgZmFpbE1zZyA9Ci0gICAgICAgICAgICAgICAgIlRoZXJlIGlzKGFyZSkgcmVtYWluaW5nIGV4cGVjdGVkIENvbnRlbnRWYWx1ZXMgaW5zdGFuY2Uocyk6IFxuIgotICAgICAgICAgICAgICAgICAgICArIGJ1aWxkZXIudG9TdHJpbmcoKTsKLSAgICAgICAgICAgIG1UZXN0Q2FzZS5mYWlsKGZhaWxNc2cpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXRpbGl0eSBtZXRob2QgdG8gcHJpbnQgQ29udGVudFZhbHVlcyB3aG9zZSBjb250ZW50IGlzIHByaW50ZWQgd2l0aCBzb3J0ZWQga2V5cy4KLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBjb252ZXJ0VG9FYXNpbHlSZWFkYWJsZVN0cmluZyhDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXMpIHsKLSAgICAgICAgaWYgKGNvbnRlbnRWYWx1ZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuICJudWxsIjsKLSAgICAgICAgfQotICAgICAgICBTdHJpbmcgbWltZVR5cGVWYWx1ZSA9ICIiOwotICAgICAgICBTb3J0ZWRNYXA8U3RyaW5nLCBTdHJpbmc+IHNvcnRlZE1hcCA9IG5ldyBUcmVlTWFwPFN0cmluZywgU3RyaW5nPigpOwotICAgICAgICBmb3IgKEVudHJ5PFN0cmluZywgT2JqZWN0PiBlbnRyeSA6IGNvbnRlbnRWYWx1ZXMudmFsdWVTZXQoKSkgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGtleSA9IGVudHJ5LmdldEtleSgpOwotICAgICAgICAgICAgZmluYWwgT2JqZWN0IHZhbHVlID0gZW50cnkuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyB2YWx1ZVN0cmluZyA9ICh2YWx1ZSAhPSBudWxsID8gdmFsdWUudG9TdHJpbmcoKSA6IG51bGwpOwotICAgICAgICAgICAgaWYgKERhdGEuTUlNRVRZUEUuZXF1YWxzKGtleSkpIHsKLSAgICAgICAgICAgICAgICBtaW1lVHlwZVZhbHVlID0gdmFsdWVTdHJpbmc7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1UZXN0Q2FzZS5hc3NlcnROb3ROdWxsKGtleSk7Ci0gICAgICAgICAgICAgICAgc29ydGVkTWFwLnB1dChrZXksIHZhbHVlU3RyaW5nKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICBidWlsZGVyLmFwcGVuZChEYXRhLk1JTUVUWVBFKTsKLSAgICAgICAgYnVpbGRlci5hcHBlbmQoJz0nKTsKLSAgICAgICAgYnVpbGRlci5hcHBlbmQobWltZVR5cGVWYWx1ZSk7Ci0gICAgICAgIGZvciAoRW50cnk8U3RyaW5nLCBTdHJpbmc+IGVudHJ5IDogc29ydGVkTWFwLmVudHJ5U2V0KCkpIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBrZXkgPSBlbnRyeS5nZXRLZXkoKTsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyB2YWx1ZSA9IGVudHJ5LmdldFZhbHVlKCk7Ci0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgnICcpOwotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoa2V5KTsKLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCI9XCIiKTsKLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKHZhbHVlKTsKLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCciJyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGVxdWFsc0ZvckNvbnRlbnRWYWx1ZXMoCi0gICAgICAgICAgICBDb250ZW50VmFsdWVzIGV4cGVjdGVkLCBDb250ZW50VmFsdWVzIGFjdHVhbCkgewotICAgICAgICBpZiAoZXhwZWN0ZWQgPT0gYWN0dWFsKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIGlmIChleHBlY3RlZCA9PSBudWxsIHx8IGFjdHVhbCA9PSBudWxsIHx8IGV4cGVjdGVkLnNpemUoKSAhPSBhY3R1YWwuc2l6ZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKEVudHJ5PFN0cmluZywgT2JqZWN0PiBlbnRyeSA6IGV4cGVjdGVkLnZhbHVlU2V0KCkpIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBrZXkgPSBlbnRyeS5nZXRLZXkoKTsKLSAgICAgICAgICAgIGZpbmFsIE9iamVjdCB2YWx1ZSA9IGVudHJ5LmdldFZhbHVlKCk7Ci0gICAgICAgICAgICBpZiAoIWFjdHVhbC5jb250YWluc0tleShrZXkpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgYnl0ZVtdKSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IGFjdHVhbFZhbHVlID0gYWN0dWFsLmdldChrZXkpOwotICAgICAgICAgICAgICAgIGlmICghQXJyYXlzLmVxdWFscygoYnl0ZVtdKXZhbHVlLCAoYnl0ZVtdKWFjdHVhbFZhbHVlKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmICghdmFsdWUuZXF1YWxzKGFjdHVhbC5nZXQoa2V5KSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC9MaW5lVmVyaWZpZXIuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC9MaW5lVmVyaWZpZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2VmMTVmZC4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvTGluZVZlcmlmaWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQ7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5WQ2FyZENvbXBvc2VyOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotY2xhc3MgTGluZVZlcmlmaWVyIGltcGxlbWVudHMgVkNhcmRDb21wb3Nlci5PbmVFbnRyeUhhbmRsZXIgewotICAgIHByaXZhdGUgZmluYWwgVGVzdENhc2UgbVRlc3RDYXNlOwotICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0PExpbmVWZXJpZmllckVsZW0+IG1MaW5lVmVyaWZpZXJFbGVtTGlzdDsKLSAgICBwcml2YXRlIGludCBtVkNhcmRUeXBlOwotICAgIHByaXZhdGUgaW50IGluZGV4OwotCi0gICAgcHVibGljIExpbmVWZXJpZmllcihUZXN0Q2FzZSB0ZXN0Q2FzZSwgaW50IHZjYXJkVHlwZSkgewotICAgICAgICBtVGVzdENhc2UgPSB0ZXN0Q2FzZTsKLSAgICAgICAgbUxpbmVWZXJpZmllckVsZW1MaXN0ID0gbmV3IEFycmF5TGlzdDxMaW5lVmVyaWZpZXJFbGVtPigpOwotICAgICAgICBtVkNhcmRUeXBlID0gdmNhcmRUeXBlOwotICAgIH0KLQotICAgIHB1YmxpYyBMaW5lVmVyaWZpZXJFbGVtIGFkZExpbmVWZXJpZmllckVsZW0oKSB7Ci0gICAgICAgIExpbmVWZXJpZmllckVsZW0gbGluZVZlcmlmaWVyID0gbmV3IExpbmVWZXJpZmllckVsZW0obVRlc3RDYXNlLCBtVkNhcmRUeXBlKTsKLSAgICAgICAgbUxpbmVWZXJpZmllckVsZW1MaXN0LmFkZChsaW5lVmVyaWZpZXIpOwotICAgICAgICByZXR1cm4gbGluZVZlcmlmaWVyOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHZlcmlmeShTdHJpbmcgdmNhcmQpIHsKLSAgICAgICAgaWYgKGluZGV4ID49IG1MaW5lVmVyaWZpZXJFbGVtTGlzdC5zaXplKCkpIHsKLSAgICAgICAgICAgIG1UZXN0Q2FzZS5mYWlsKCJJbnN1ZmZpY2llbnQgbnVtYmVyIG9mIExpbmVWZXJpZmllciAoIiArIGluZGV4ICsgIikiKTsKLSAgICAgICAgfQotCi0gICAgICAgIExpbmVWZXJpZmllckVsZW0gbGluZVZlcmlmaWVyID0gbUxpbmVWZXJpZmllckVsZW1MaXN0LmdldChpbmRleCk7Ci0gICAgICAgIGxpbmVWZXJpZmllci52ZXJpZnkodmNhcmQpOwotCi0gICAgICAgIGluZGV4Kys7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gb25FbnRyeUNyZWF0ZWQoU3RyaW5nIHZjYXJkKSB7Ci0gICAgICAgIHZlcmlmeSh2Y2FyZCk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIG9uSW5pdChDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgb25UZXJtaW5hdGUoKSB7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL0xpbmVWZXJpZmllckVsZW0uamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC9MaW5lVmVyaWZpZXJFbGVtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyM2IyOWIuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL0xpbmVWZXJpZmllckVsZW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKLSAqIHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0gKiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKLSAqIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQotICogTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKLSAqIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkOwotCi1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuVkNhcmRDb25maWc7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWNsYXNzIExpbmVWZXJpZmllckVsZW0gewotICAgIHByaXZhdGUgZmluYWwgVGVzdENhc2UgbVRlc3RDYXNlOwotICAgIHByaXZhdGUgZmluYWwgTGlzdDxTdHJpbmc+IG1FeHBlY3RlZExpbmVMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1Jc1YzMDsKLQotICAgIHB1YmxpYyBMaW5lVmVyaWZpZXJFbGVtKFRlc3RDYXNlIHRlc3RDYXNlLCBpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIG1UZXN0Q2FzZSA9IHRlc3RDYXNlOwotICAgICAgICBtSXNWMzAgPSBWQ2FyZENvbmZpZy5pc1YzMCh2Y2FyZFR5cGUpOwotICAgIH0KLQotICAgIHB1YmxpYyBMaW5lVmVyaWZpZXJFbGVtIGFkZEV4cGVjdGVkKGZpbmFsIFN0cmluZyBsaW5lKSB7Ci0gICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkobGluZSkpIHsKLSAgICAgICAgICAgIG1FeHBlY3RlZExpbmVMaXN0LmFkZChsaW5lKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB2ZXJpZnkoZmluYWwgU3RyaW5nIHZjYXJkKSB7Ci0gICAgICAgIGZpbmFsIFN0cmluZ1tdIGxpbmVBcnJheSA9IHZjYXJkLnNwbGl0KCJcXHI/XFxuIik7Ci0gICAgICAgIGZpbmFsIGludCBsZW5ndGggPSBsaW5lQXJyYXkubGVuZ3RoOwotICAgICAgICBib29sZWFuIGJlZ2luRXhpc3RzID0gZmFsc2U7Ci0gICAgICAgIGJvb2xlYW4gZW5kRXhpc3RzID0gZmFsc2U7Ci0gICAgICAgIGJvb2xlYW4gdmVyc2lvbkV4aXN0cyA9IGZhbHNlOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBsaW5lID0gbGluZUFycmF5W2ldOwotICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KGxpbmUpKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICgiQkVHSU46VkNBUkQiLmVxdWFsc0lnbm9yZUNhc2UobGluZSkpIHsKLSAgICAgICAgICAgICAgICBpZiAoYmVnaW5FeGlzdHMpIHsKLSAgICAgICAgICAgICAgICAgICAgbVRlc3RDYXNlLmZhaWwoIk11bHRpcGxlIFwiQkVHSU46VkNBUkRcIiBsaW5lIGZvdW5kIik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYmVnaW5FeGlzdHMgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCJFTkQ6VkNBUkQiLmVxdWFsc0lnbm9yZUNhc2UobGluZSkpIHsKLSAgICAgICAgICAgICAgICBpZiAoZW5kRXhpc3RzKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1UZXN0Q2FzZS5mYWlsKCJNdWx0aXBsZSBcIkVORDpWQ0FSRFwiIGxpbmUgZm91bmQiKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBlbmRFeGlzdHMgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKChtSXNWMzAgPyAiVkVSU0lPTjozLjAiIDogIlZFUlNJT046Mi4xIikuZXF1YWxzSWdub3JlQ2FzZShsaW5lKSkgewotICAgICAgICAgICAgICAgIGlmICh2ZXJzaW9uRXhpc3RzKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1UZXN0Q2FzZS5mYWlsKCJNdWx0aXBsZSBWRVJTSU9OIGxpbmUgKyBmb3VuZCIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHZlcnNpb25FeGlzdHMgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghYmVnaW5FeGlzdHMpIHsKLSAgICAgICAgICAgICAgICBtVGVzdENhc2UuZmFpbCgiUHJvcGVydHkgb3RoZXIgdGhhbiBCRUdJTiBjYW1lIGJlZm9yZSBCRUdJTiBwcm9wZXJ0eTogIgotICAgICAgICAgICAgICAgICAgICAgICAgKyBsaW5lKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZW5kRXhpc3RzKSB7Ci0gICAgICAgICAgICAgICAgbVRlc3RDYXNlLmZhaWwoIlByb3BlcnR5IG90aGVyIHRoYW4gRU5EIGNhbWUgYWZ0ZXIgRU5EIHByb3BlcnR5OiAiCi0gICAgICAgICAgICAgICAgICAgICAgICArIGxpbmUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmaW5hbCBpbnQgaW5kZXggPSBtRXhwZWN0ZWRMaW5lTGlzdC5pbmRleE9mKGxpbmUpOwotICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgICAgICAgICBtRXhwZWN0ZWRMaW5lTGlzdC5yZW1vdmUoaW5kZXgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtVGVzdENhc2UuZmFpbCgiVW5leHBlY3RlZCBsaW5lOiAiICsgbGluZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIW1FeHBlY3RlZExpbmVMaXN0LmlzRW1wdHkoKSkgewotICAgICAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgIGZvciAoU3RyaW5nIGV4cGVjdGVkTGluZSA6IG1FeHBlY3RlZExpbmVMaXN0KSB7Ci0gICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChleHBlY3RlZExpbmUpOwotICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIlxuIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1UZXN0Q2FzZS5mYWlsKCJFeHBlY3RlZCBsaW5lKHMpIG5vdCBmb3VuZDoiICsgYnVmZmVyLnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL1Byb3BlcnR5Tm9kZS5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL1Byb3BlcnR5Tm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzFmNmQyLi4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC9Qcm9wZXJ0eU5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQ7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlczsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5WQ2FyZEVudHJ5OwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiBQcmV2aW91c2x5IHVzZWQgaW4gbWFpbiB2Q2FyZCBoYW5kbGluZyBjb2RlIGJ1dCBub3cgZXhpc3RzIG9ubHkgZm9yIHRlc3RpbmcuCi0gKgotICogRXNwZWNpYWxseSB1c2VmdWwgZm9yIHRlc3RpbmcgcGFyc2VyIGNvZGUgKFZDYXJkUGFyc2VyKSwgc2luY2UgYWxsIHByb3BlcnRpZXMgY2FuIGJlCi0gKiBjaGVja2VkIHZpYSB0aGlzIGNsYXNzIHVubGlrZSB7QGxpbmsgVkNhcmRFbnRyeX0sIHdoaWNoIG9ubHkgZW1pdHMgdGhlIHJlc3VsdCBvZgotICogaW50ZXJwcmV0YXRpb24gb2YgdGhlIGNvbnRlbnQgb2YgZWFjaCB2Q2FyZC4gV2UgY2Fubm90IGtub3cgd2hldGhlciB2Q2FyZCBwYXJzZXIgb3IKLSAqIENvbnRhY3RTdHJ1Y3QgaXMgd3Jvbmcgd2l0aG91dGggdGhpcyBjbGFzcy4KLSAqLwotcHVibGljIGNsYXNzIFByb3BlcnR5Tm9kZSB7Ci0gICAgcHVibGljIFN0cmluZyBwcm9wTmFtZTsKLSAgICBwdWJsaWMgU3RyaW5nIHByb3BWYWx1ZTsKLSAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IHByb3BWYWx1ZV92ZWN0b3I7Ci0KLSAgICAvKiogU3RvcmUgdmFsdWUgYXMgYnl0ZVtdLGFmdGVyIGRlY29kZS4KLSAgICAgKiBVc2VkIHdoZW4gcHJvcFZhbHVlIGlzIGVuY29kZWQgYnkgc29tZXRoaW5nIGxpa2UgQkFTRTY0LCBRVU9URUQtUFJJTlRBQkxFLCBldGMuCi0gICAgICovCi0gICAgcHVibGljIGJ5dGVbXSBwcm9wVmFsdWVfYnl0ZXM7Ci0KLSAgICAvKiogcGFyYW0gc3RvcmU6IGtleT1wYXJhbVR5cGUsIHZhbHVlPXBhcmFtVmFsdWUKLSAgICAgKiBOb3RlIHRoYXQgY3VycmVudGx5IFByb3BlcnR5Tm9kZSBjbGFzcyBkb2VzIG5vdCBzdXBwb3J0IG11bHRpcGxlIHBhcmFtLXZhbHVlcwotICAgICAqIGRlZmluZWQgaW4gdkNhcmQgMy4wIChTZWUgYWxzbyBSRkMgMjQyNikuIG11bHRpcGxlLXZhbHVlcyBhcmUgc3RvcmVkIGFzCi0gICAgICogb25lIFN0cmluZyB2YWx1ZSBsaWtlICJBLEIiLCBub3QgWyJBIiwgIkIiXS4uLgotICAgICAqIFRPRE86IGZpeCB0aGlzLiAKLSAgICAgKi8KLSAgICBwdWJsaWMgQ29udGVudFZhbHVlcyBwYXJhbU1hcDsKLQotICAgIC8qKiBPbmx5IGZvciBUWVBFPT8/PyBwYXJhbSBzdG9yZS4gKi8KLSAgICBwdWJsaWMgU2V0PFN0cmluZz4gcGFyYW1NYXBfVFlQRTsKLQotICAgIC8qKiBTdG9yZSBncm91cCB2YWx1ZXMuIFVzZWQgb25seSBpbiBWQ2FyZC4gKi8KLSAgICBwdWJsaWMgU2V0PFN0cmluZz4gcHJvcEdyb3VwU2V0OwotICAgIAotICAgIHB1YmxpYyBQcm9wZXJ0eU5vZGUoKSB7Ci0gICAgICAgIHByb3BOYW1lID0gIiI7Ci0gICAgICAgIHByb3BWYWx1ZSA9ICIiOwotICAgICAgICBwcm9wVmFsdWVfdmVjdG9yID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgIHBhcmFtTWFwID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKLSAgICAgICAgcGFyYW1NYXBfVFlQRSA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLSAgICAgICAgcHJvcEdyb3VwU2V0ID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgUHJvcGVydHlOb2RlKAotICAgICAgICAgICAgU3RyaW5nIHByb3BOYW1lLCBTdHJpbmcgcHJvcFZhbHVlLCBMaXN0PFN0cmluZz4gcHJvcFZhbHVlX3ZlY3RvciwKLSAgICAgICAgICAgIGJ5dGVbXSBwcm9wVmFsdWVfYnl0ZXMsIENvbnRlbnRWYWx1ZXMgcGFyYW1NYXAsIFNldDxTdHJpbmc+IHBhcmFtTWFwX1RZUEUsCi0gICAgICAgICAgICBTZXQ8U3RyaW5nPiBwcm9wR3JvdXBTZXQpIHsKLSAgICAgICAgaWYgKHByb3BOYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRoaXMucHJvcE5hbWUgPSBwcm9wTmFtZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRoaXMucHJvcE5hbWUgPSAiIjsKLSAgICAgICAgfQotICAgICAgICBpZiAocHJvcFZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRoaXMucHJvcFZhbHVlID0gcHJvcFZhbHVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhpcy5wcm9wVmFsdWUgPSAiIjsKLSAgICAgICAgfQotICAgICAgICBpZiAocHJvcFZhbHVlX3ZlY3RvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0aGlzLnByb3BWYWx1ZV92ZWN0b3IgPSBwcm9wVmFsdWVfdmVjdG9yOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhpcy5wcm9wVmFsdWVfdmVjdG9yID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgIH0KLSAgICAgICAgdGhpcy5wcm9wVmFsdWVfYnl0ZXMgPSBwcm9wVmFsdWVfYnl0ZXM7Ci0gICAgICAgIGlmIChwYXJhbU1hcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0aGlzLnBhcmFtTWFwID0gcGFyYW1NYXA7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aGlzLnBhcmFtTWFwID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocGFyYW1NYXBfVFlQRSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0aGlzLnBhcmFtTWFwX1RZUEUgPSBwYXJhbU1hcF9UWVBFOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhpcy5wYXJhbU1hcF9UWVBFID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwcm9wR3JvdXBTZXQgIT0gbnVsbCkgewotICAgICAgICAgICAgdGhpcy5wcm9wR3JvdXBTZXQgPSBwcm9wR3JvdXBTZXQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aGlzLnByb3BHcm91cFNldCA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgICAvLyB2Q2FyZCBtYXkgY29udGFpbiBtb3JlIHRoYW4gb25lIHNhbWUgbGluZSBpbiBvbmUgZW50cnksIHdoaWxlIEhhc2hTZXQgb3IgYW55IG90aGVyCi0gICAgICAgIC8vIGxpYnJhcnkgd2hpY2ggdXRpbGl6ZSBoYXNoQ29kZSgpIGRvZXMgbm90IGhvbm9yIHRoYXQsIHNvIGludGVudGlvbmFsbHkgdGhyb3cgYW4KLSAgICAgICAgLy8gRXhjZXB0aW9uLgotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgIlByb3BlcnR5Tm9kZSBkb2VzIG5vdCBwcm92aWRlIGhhc2hDb2RlKCkgaW1wbGVtZW50YXRpb24gaW50ZW50aW9uYWxseS4iKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotICAgICAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBQcm9wZXJ0eU5vZGUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIFByb3BlcnR5Tm9kZSBub2RlID0gKFByb3BlcnR5Tm9kZSlvYmo7Ci0gICAgICAgIAotICAgICAgICBpZiAocHJvcE5hbWUgPT0gbnVsbCB8fCAhcHJvcE5hbWUuZXF1YWxzKG5vZGUucHJvcE5hbWUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0gZWxzZSBpZiAoIXBhcmFtTWFwX1RZUEUuZXF1YWxzKG5vZGUucGFyYW1NYXBfVFlQRSkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfSBlbHNlIGlmICghcGFyYW1NYXBfVFlQRS5lcXVhbHMobm9kZS5wYXJhbU1hcF9UWVBFKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9IGVsc2UgaWYgKCFwcm9wR3JvdXBTZXQuZXF1YWxzKG5vZGUucHJvcEdyb3VwU2V0KSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHByb3BWYWx1ZV9ieXRlcyAhPSBudWxsICYmIEFycmF5cy5lcXVhbHMocHJvcFZhbHVlX2J5dGVzLCBub2RlLnByb3BWYWx1ZV9ieXRlcykpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKCFwcm9wVmFsdWUuZXF1YWxzKG5vZGUucHJvcFZhbHVlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gVGhlIHZhbHVlIGluIHByb3BWYWx1ZV92ZWN0b3IgaXMgbm90IGRlY29kZWQgZXZlbiBpZiBpdCBzaG91bGQgYmUKLSAgICAgICAgICAgIC8vIGRlY29kZWQgYnkgQkFTRTY0IG9yIFFVT1RFRC1QUklOVEFCTEUuIFdoZW4gdGhlIHNpemUgb2YgcHJvcFZhbHVlX3ZlY3RvcgotICAgICAgICAgICAgLy8gaXMgMSwgdGhlIGVuY29kZWQgdmFsdWUgaXMgc3RvcmVkIGluIHByb3BWYWx1ZSwgc28gd2UgZG8gbm90IGhhdmUgdG8KLSAgICAgICAgICAgIC8vIGNoZWNrIGl0LgotICAgICAgICAgICAgcmV0dXJuIChwcm9wVmFsdWVfdmVjdG9yLmVxdWFscyhub2RlLnByb3BWYWx1ZV92ZWN0b3IpIHx8Ci0gICAgICAgICAgICAgICAgICAgIHByb3BWYWx1ZV92ZWN0b3Iuc2l6ZSgpID09IDEgfHwKLSAgICAgICAgICAgICAgICAgICAgbm9kZS5wcm9wVmFsdWVfdmVjdG9yLnNpemUoKSA9PSAxKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICBidWlsZGVyLmFwcGVuZCgicHJvcE5hbWU6ICIpOwotICAgICAgICBidWlsZGVyLmFwcGVuZChwcm9wTmFtZSk7Ci0gICAgICAgIGJ1aWxkZXIuYXBwZW5kKCIsIHBhcmFtTWFwOiAiKTsKLSAgICAgICAgYnVpbGRlci5hcHBlbmQocGFyYW1NYXAudG9TdHJpbmcoKSk7Ci0gICAgICAgIGJ1aWxkZXIuYXBwZW5kKCIsIHBhcmFtTWFwX1RZUEU6IFsiKTsKLSAgICAgICAgYm9vbGVhbiBmaXJzdCA9IHRydWU7Ci0gICAgICAgIGZvciAoU3RyaW5nIGVsZW0gOiBwYXJhbU1hcF9UWVBFKSB7Ci0gICAgICAgICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiLCAiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCciJyk7Ci0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZChlbGVtKTsKLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCciJyk7Ci0gICAgICAgIH0KLSAgICAgICAgYnVpbGRlci5hcHBlbmQoIl0iKTsKLSAgICAgICAgaWYgKCFwcm9wR3JvdXBTZXQuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiLCBwcm9wR3JvdXBTZXQ6IFsiKTsKLSAgICAgICAgICAgIGZpcnN0ID0gdHJ1ZTsKLSAgICAgICAgICAgIGZvciAoU3RyaW5nIGVsZW0gOiBwcm9wR3JvdXBTZXQpIHsKLSAgICAgICAgICAgICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiLCAiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoJyInKTsKLSAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChlbGVtKTsKLSAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgnIicpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIl0iKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocHJvcFZhbHVlX3ZlY3RvciAhPSBudWxsICYmIHByb3BWYWx1ZV92ZWN0b3Iuc2l6ZSgpID4gMSkgewotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIiwgcHJvcFZhbHVlX3ZlY3RvciBzaXplOiAiKTsKLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKHByb3BWYWx1ZV92ZWN0b3Iuc2l6ZSgpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocHJvcFZhbHVlX2J5dGVzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCIsIHByb3BWYWx1ZV9ieXRlcyBzaXplOiAiKTsKLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKHByb3BWYWx1ZV9ieXRlcy5sZW5ndGgpOwotICAgICAgICB9Ci0gICAgICAgIGJ1aWxkZXIuYXBwZW5kKCIsIHByb3BWYWx1ZTogXCIiKTsKLSAgICAgICAgYnVpbGRlci5hcHBlbmQocHJvcFZhbHVlKTsKLSAgICAgICAgYnVpbGRlci5hcHBlbmQoIlwiIik7Ci0gICAgICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL1Byb3BlcnR5Tm9kZXNWZXJpZmllci5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL1Byb3BlcnR5Tm9kZXNWZXJpZmllci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZmRkMDc0Li4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC9Qcm9wZXJ0eU5vZGVzVmVyaWZpZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQ7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlczsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5WQ2FyZENvbmZpZzsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5WQ2FyZFBhcnNlcjsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5WQ2FyZFBhcnNlcl9WMjE7Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuVkNhcmRQYXJzZXJfVjMwOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLmV4Y2VwdGlvbi5WQ2FyZEV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyogcGFja2FnZSAqLyBjbGFzcyBQcm9wZXJ0eU5vZGVzVmVyaWZpZXIgZXh0ZW5kcyBWTm9kZUJ1aWxkZXIgewotICAgIHByaXZhdGUgZmluYWwgTGlzdDxQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtPiBtUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbUxpc3Q7Ci0gICAgcHJpdmF0ZSBmaW5hbCBBbmRyb2lkVGVzdENhc2UgbUFuZHJvaWRUZXN0Q2FzZTsKLSAgICBwcml2YXRlIGludCBtSW5kZXg7Ci0KLSAgICBwdWJsaWMgUHJvcGVydHlOb2Rlc1ZlcmlmaWVyKEFuZHJvaWRUZXN0Q2FzZSB0ZXN0Q2FzZSkgewotICAgICAgICBtUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbUxpc3QgPSBuZXcgQXJyYXlMaXN0PFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0+KCk7Ci0gICAgICAgIG1BbmRyb2lkVGVzdENhc2UgPSB0ZXN0Q2FzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSBhZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtKCkgewotICAgICAgICBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGVsZW0gPSBuZXcgUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbShtQW5kcm9pZFRlc3RDYXNlKTsKLSAgICAgICAgbVByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1MaXN0LmFkZChlbGVtKTsKLSAgICAgICAgcmV0dXJuIGVsZW07Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdmVyaWZ5KGludCByZXNJZCwgaW50IHZDYXJkVHlwZSkKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgVkNhcmRFeGNlcHRpb24gewotICAgICAgICB2ZXJpZnkobUFuZHJvaWRUZXN0Q2FzZS5nZXRDb250ZXh0KCkuZ2V0UmVzb3VyY2VzKCkub3BlblJhd1Jlc291cmNlKHJlc0lkKSwgdkNhcmRUeXBlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB2ZXJpZnkoaW50IHJlc0lkLCBpbnQgdkNhcmRUeXBlLCBmaW5hbCBWQ2FyZFBhcnNlciB2Q2FyZFBhcnNlcikKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgVkNhcmRFeGNlcHRpb24gewotICAgICAgICB2ZXJpZnkobUFuZHJvaWRUZXN0Q2FzZS5nZXRDb250ZXh0KCkuZ2V0UmVzb3VyY2VzKCkub3BlblJhd1Jlc291cmNlKHJlc0lkKSwKLSAgICAgICAgICAgICAgICB2Q2FyZFR5cGUsIHZDYXJkUGFyc2VyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB2ZXJpZnkoSW5wdXRTdHJlYW0gaXMsIGludCB2Q2FyZFR5cGUpIHRocm93cyBJT0V4Y2VwdGlvbiwgVkNhcmRFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBWQ2FyZFBhcnNlciB2Q2FyZFBhcnNlcjsKLSAgICAgICAgaWYgKFZDYXJkQ29uZmlnLmlzVjMwKHZDYXJkVHlwZSkpIHsKLSAgICAgICAgICAgIHZDYXJkUGFyc2VyID0gbmV3IFZDYXJkUGFyc2VyX1YzMCh0cnVlKTsgIC8vIFVzZSBTdHJpY3RQYXJzaW5nLgotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdkNhcmRQYXJzZXIgPSBuZXcgVkNhcmRQYXJzZXJfVjIxKCk7Ci0gICAgICAgIH0KLSAgICAgICAgdmVyaWZ5KGlzLCB2Q2FyZFR5cGUsIHZDYXJkUGFyc2VyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB2ZXJpZnkoSW5wdXRTdHJlYW0gaXMsIGludCB2Q2FyZFR5cGUsIGZpbmFsIFZDYXJkUGFyc2VyIHZDYXJkUGFyc2VyKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB2Q2FyZFBhcnNlci5wYXJzZShpcywgdGhpcyk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoaXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGlzLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGVuZEVudHJ5KCkgewotICAgICAgICBzdXBlci5lbmRFbnRyeSgpOwotICAgICAgICBtQW5kcm9pZFRlc3RDYXNlLmFzc2VydFRydWUobUluZGV4IDwgbVByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1MaXN0LnNpemUoKSk7Ci0gICAgICAgIG1BbmRyb2lkVGVzdENhc2UuYXNzZXJ0VHJ1ZShtSW5kZXggPCB2Tm9kZUxpc3Quc2l6ZSgpKTsKLSAgICAgICAgbVByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1MaXN0LmdldChtSW5kZXgpLnZlcmlmeSh2Tm9kZUxpc3QuZ2V0KG1JbmRleCkpOwotICAgICAgICBtSW5kZXgrKzsKLSAgICB9Ci19Ci0KLS8qKgotICogVXRpbGl0eSBjbGFzcyB3aGljaCB2ZXJpZmllcyBpbnB1dCBWTm9kZS4KLSAqCi0gKiBUaGlzIGNsYXNzIGZpcnN0IGNoZWNrcyB3aGV0aGVyIGVhY2ggcHJvcGVydHlOb2RlIGluIHRoZSBWTm9kZSBpcyBpbiB0aGUKLSAqICJvcmRlcmVkIGV4cGVjdGVkIHByb3BlcnR5IGxpc3QiLgotICogSWYgdGhlIG5vZGUgZG9lcyBub3QgZXhpc3QgaW4gdGhlICJvcmRlcmVkIGxpc3QiLCB0aGUgY2xhc3MgcmVmZXJzIHRvCi0gKiAidW5vcmRlcmQgZXhwZWN0ZWQgcHJvcGVydHkgc2V0IiBhbmQgY2hlY2tzIHRoZSBub2RlIGlzIGV4cGVjdGVkIHNvbWV3aGVyZS4KLSAqLwotLyogcGFja2FnZSAqLyBjbGFzcyBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIHsKLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFR5cGVTZXQgZXh0ZW5kcyBIYXNoU2V0PFN0cmluZz4gewotICAgICAgICBwdWJsaWMgVHlwZVNldChTdHJpbmcgLi4uIGFycmF5KSB7Ci0gICAgICAgICAgICBzdXBlcihBcnJheXMuYXNMaXN0KGFycmF5KSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEdyb3VwU2V0IGV4dGVuZHMgSGFzaFNldDxTdHJpbmc+IHsKLSAgICAgICAgcHVibGljIEdyb3VwU2V0KFN0cmluZyAuLi4gYXJyYXkpIHsKLSAgICAgICAgICAgIHN1cGVyKEFycmF5cy5hc0xpc3QoYXJyYXkpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgSGFzaE1hcDxTdHJpbmcsIExpc3Q8UHJvcGVydHlOb2RlPj4gbU9yZGVyZWROb2RlTWFwOwotICAgIC8vIEludGVudGlvbmFsbHkgdXNlIEFycmF5TGlzdCBpbnN0ZWFkIG9mIFNldCwgYXNzdW1pbmcgdGhlcmUgbWF5IGJlIG1vcmUgdGhhbiBvbmUKLSAgICAvLyBleGFjdGx5IHNhbWUgb2JqZWN0cy4KLSAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxQcm9wZXJ0eU5vZGU+IG1Vbm9yZGVyZWROb2RlTGlzdDsKLSAgICBwcml2YXRlIGZpbmFsIFRlc3RDYXNlIG1UZXN0Q2FzZTsKLQotICAgIHB1YmxpYyBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtKFRlc3RDYXNlIHRlc3RDYXNlKSB7Ci0gICAgICAgIG1PcmRlcmVkTm9kZU1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgTGlzdDxQcm9wZXJ0eU5vZGU+PigpOwotICAgICAgICBtVW5vcmRlcmVkTm9kZUxpc3QgPSBuZXcgQXJyYXlMaXN0PFByb3BlcnR5Tm9kZT4oKTsKLSAgICAgICAgbVRlc3RDYXNlID0gdGVzdENhc2U7Ci0gICAgfQotCi0gICAgLy8gV2l0aE9yZGVyCi0KLSAgICBwdWJsaWMgUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSBhZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoU3RyaW5nIHByb3BOYW1lLCBTdHJpbmcgcHJvcFZhbHVlKSB7Ci0gICAgICAgIHJldHVybiBhZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIocHJvcE5hbWUsIHByb3BWYWx1ZSwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0gYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKAotICAgICAgICAgICAgU3RyaW5nIHByb3BOYW1lLCBTdHJpbmcgcHJvcFZhbHVlLCBDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXMpIHsKLSAgICAgICAgcmV0dXJuIGFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcihwcm9wTmFtZSwgcHJvcFZhbHVlLCBudWxsLAotICAgICAgICAgICAgICAgIG51bGwsIGNvbnRlbnRWYWx1ZXMsIG51bGwsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigKLSAgICAgICAgICAgIFN0cmluZyBwcm9wTmFtZSwgTGlzdDxTdHJpbmc+IHByb3BWYWx1ZUxpc3QsIENvbnRlbnRWYWx1ZXMgY29udGVudFZhbHVlcykgewotICAgICAgICByZXR1cm4gYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKHByb3BOYW1lLCBudWxsLCBwcm9wVmFsdWVMaXN0LAotICAgICAgICAgICAgICAgIG51bGwsIGNvbnRlbnRWYWx1ZXMsIG51bGwsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigKLSAgICAgICAgICAgIFN0cmluZyBwcm9wTmFtZSwgU3RyaW5nIHByb3BWYWx1ZSwgTGlzdDxTdHJpbmc+IHByb3BWYWx1ZUxpc3QpIHsKLSAgICAgICAgcmV0dXJuIGFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcihwcm9wTmFtZSwgcHJvcFZhbHVlLCBwcm9wVmFsdWVMaXN0LCBudWxsLAotICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigKLSAgICAgICAgICAgIFN0cmluZyBwcm9wTmFtZSwgTGlzdDxTdHJpbmc+IHByb3BWYWx1ZUxpc3QpIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIHByb3BWYWx1ZSA9IGNvbmNhdGluYXRlTGlzdFdpdGhTZW1pQ29sb24ocHJvcFZhbHVlTGlzdCk7Ci0gICAgICAgIHJldHVybiBhZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIocHJvcE5hbWUsIHByb3BWYWx1ZS50b1N0cmluZygpLCBwcm9wVmFsdWVMaXN0LAotICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIG51bGwsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcihTdHJpbmcgcHJvcE5hbWUsIFN0cmluZyBwcm9wVmFsdWUsCi0gICAgICAgICAgICBUeXBlU2V0IHBhcmFtTWFwX1RZUEUpIHsKLSAgICAgICAgcmV0dXJuIGFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcihwcm9wTmFtZSwgcHJvcFZhbHVlLCBudWxsLAotICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIHBhcmFtTWFwX1RZUEUsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcihTdHJpbmcgcHJvcE5hbWUsCi0gICAgICAgICAgICBMaXN0PFN0cmluZz4gcHJvcFZhbHVlTGlzdCwgVHlwZVNldCBwYXJhbU1hcF9UWVBFKSB7Ci0gICAgICAgIHJldHVybiBhZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIocHJvcE5hbWUsIG51bGwsIHByb3BWYWx1ZUxpc3QsIG51bGwsIG51bGwsCi0gICAgICAgICAgICAgICAgcGFyYW1NYXBfVFlQRSwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0gYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKFN0cmluZyBwcm9wTmFtZSwgU3RyaW5nIHByb3BWYWx1ZSwKLSAgICAgICAgICAgIENvbnRlbnRWYWx1ZXMgcGFyYW1NYXAsIFR5cGVTZXQgcGFyYW1NYXBfVFlQRSkgewotICAgICAgICByZXR1cm4gYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKHByb3BOYW1lLCBwcm9wVmFsdWUsIG51bGwsIG51bGwsCi0gICAgICAgICAgICAgICAgcGFyYW1NYXAsIHBhcmFtTWFwX1RZUEUsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcihTdHJpbmcgcHJvcE5hbWUsIFN0cmluZyBwcm9wVmFsdWUsCi0gICAgICAgICAgICBMaXN0PFN0cmluZz4gcHJvcFZhbHVlTGlzdCwgVHlwZVNldCBwYXJhbU1hcF9UWVBFKSB7Ci0gICAgICAgIHJldHVybiBhZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIocHJvcE5hbWUsIHByb3BWYWx1ZSwgcHJvcFZhbHVlTGlzdCwgbnVsbCwgbnVsbCwKLSAgICAgICAgICAgICAgICBwYXJhbU1hcF9UWVBFLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSBhZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoU3RyaW5nIHByb3BOYW1lLCBTdHJpbmcgcHJvcFZhbHVlLAotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHByb3BWYWx1ZUxpc3QsIGJ5dGVbXSBwcm9wVmFsdWVfYnl0ZXMsCi0gICAgICAgICAgICBDb250ZW50VmFsdWVzIHBhcmFtTWFwLCBUeXBlU2V0IHBhcmFtTWFwX1RZUEUsIEdyb3VwU2V0IHByb3BHcm91cFNldCkgewotICAgICAgICBpZiAocHJvcFZhbHVlID09IG51bGwgJiYgcHJvcFZhbHVlTGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBwcm9wVmFsdWUgPSBjb25jYXRpbmF0ZUxpc3RXaXRoU2VtaUNvbG9uKHByb3BWYWx1ZUxpc3QpOwotICAgICAgICB9Ci0gICAgICAgIFByb3BlcnR5Tm9kZSBwcm9wZXJ0eU5vZGUgPSBuZXcgUHJvcGVydHlOb2RlKHByb3BOYW1lLAotICAgICAgICAgICAgICAgIHByb3BWYWx1ZSwgcHJvcFZhbHVlTGlzdCwgcHJvcFZhbHVlX2J5dGVzLAotICAgICAgICAgICAgICAgIHBhcmFtTWFwLCBwYXJhbU1hcF9UWVBFLCBwcm9wR3JvdXBTZXQpOwotICAgICAgICBMaXN0PFByb3BlcnR5Tm9kZT4gZXhwZWN0ZWROb2RlTGlzdCA9IG1PcmRlcmVkTm9kZU1hcC5nZXQocHJvcE5hbWUpOwotICAgICAgICBpZiAoZXhwZWN0ZWROb2RlTGlzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBleHBlY3RlZE5vZGVMaXN0ID0gbmV3IEFycmF5TGlzdDxQcm9wZXJ0eU5vZGU+KCk7Ci0gICAgICAgICAgICBtT3JkZXJlZE5vZGVNYXAucHV0KHByb3BOYW1lLCBleHBlY3RlZE5vZGVMaXN0KTsKLSAgICAgICAgfQotICAgICAgICBleHBlY3RlZE5vZGVMaXN0LmFkZChwcm9wZXJ0eU5vZGUpOwotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICAvLyBXaXRob3V0T3JkZXIKLQotICAgIHB1YmxpYyBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGFkZEV4cGVjdGVkTm9kZShTdHJpbmcgcHJvcE5hbWUsIFN0cmluZyBwcm9wVmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIGFkZEV4cGVjdGVkTm9kZShwcm9wTmFtZSwgcHJvcFZhbHVlLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSBhZGRFeHBlY3RlZE5vZGUoU3RyaW5nIHByb3BOYW1lLCBTdHJpbmcgcHJvcFZhbHVlLAotICAgICAgICAgICAgQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzKSB7Ci0gICAgICAgIHJldHVybiBhZGRFeHBlY3RlZE5vZGUocHJvcE5hbWUsIHByb3BWYWx1ZSwgbnVsbCwgbnVsbCwgY29udGVudFZhbHVlcywgbnVsbCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0gYWRkRXhwZWN0ZWROb2RlKFN0cmluZyBwcm9wTmFtZSwKLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBwcm9wVmFsdWVMaXN0LCBDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXMpIHsKLSAgICAgICAgcmV0dXJuIGFkZEV4cGVjdGVkTm9kZShwcm9wTmFtZSwgbnVsbCwKLSAgICAgICAgICAgICAgICBwcm9wVmFsdWVMaXN0LCBudWxsLCBjb250ZW50VmFsdWVzLCBudWxsLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSBhZGRFeHBlY3RlZE5vZGUoU3RyaW5nIHByb3BOYW1lLCBTdHJpbmcgcHJvcFZhbHVlLAotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHByb3BWYWx1ZUxpc3QpIHsKLSAgICAgICAgcmV0dXJuIGFkZEV4cGVjdGVkTm9kZShwcm9wTmFtZSwgcHJvcFZhbHVlLCBwcm9wVmFsdWVMaXN0LCBudWxsLCBudWxsLCBudWxsLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSBhZGRFeHBlY3RlZE5vZGUoU3RyaW5nIHByb3BOYW1lLAotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHByb3BWYWx1ZUxpc3QpIHsKLSAgICAgICAgcmV0dXJuIGFkZEV4cGVjdGVkTm9kZShwcm9wTmFtZSwgbnVsbCwgcHJvcFZhbHVlTGlzdCwKLSAgICAgICAgICAgICAgICBudWxsLCBudWxsLCBudWxsLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSBhZGRFeHBlY3RlZE5vZGUoU3RyaW5nIHByb3BOYW1lLCBTdHJpbmcgcHJvcFZhbHVlLAotICAgICAgICAgICAgVHlwZVNldCBwYXJhbU1hcF9UWVBFKSB7Ci0gICAgICAgIHJldHVybiBhZGRFeHBlY3RlZE5vZGUocHJvcE5hbWUsIHByb3BWYWx1ZSwgbnVsbCwgbnVsbCwgbnVsbCwgcGFyYW1NYXBfVFlQRSwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0gYWRkRXhwZWN0ZWROb2RlKFN0cmluZyBwcm9wTmFtZSwKLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBwcm9wVmFsdWVMaXN0LCBUeXBlU2V0IHBhcmFtTWFwX1RZUEUpIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIHByb3BWYWx1ZSA9IGNvbmNhdGluYXRlTGlzdFdpdGhTZW1pQ29sb24ocHJvcFZhbHVlTGlzdCk7Ci0gICAgICAgIHJldHVybiBhZGRFeHBlY3RlZE5vZGUocHJvcE5hbWUsIHByb3BWYWx1ZSwgcHJvcFZhbHVlTGlzdCwgbnVsbCwgbnVsbCwKLSAgICAgICAgICAgICAgICBwYXJhbU1hcF9UWVBFLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSBhZGRFeHBlY3RlZE5vZGUoU3RyaW5nIHByb3BOYW1lLCBTdHJpbmcgcHJvcFZhbHVlLAotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHByb3BWYWx1ZUxpc3QsIFR5cGVTZXQgcGFyYW1NYXBfVFlQRSkgewotICAgICAgICByZXR1cm4gYWRkRXhwZWN0ZWROb2RlKHByb3BOYW1lLCBwcm9wVmFsdWUsIHByb3BWYWx1ZUxpc3QsIG51bGwsIG51bGwsCi0gICAgICAgICAgICAgICAgcGFyYW1NYXBfVFlQRSwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0gYWRkRXhwZWN0ZWROb2RlKFN0cmluZyBwcm9wTmFtZSwgU3RyaW5nIHByb3BWYWx1ZSwKLSAgICAgICAgICAgIENvbnRlbnRWYWx1ZXMgcGFyYW1NYXAsIFR5cGVTZXQgcGFyYW1NYXBfVFlQRSkgewotICAgICAgICByZXR1cm4gYWRkRXhwZWN0ZWROb2RlKHByb3BOYW1lLCBwcm9wVmFsdWUsIG51bGwsIG51bGwsCi0gICAgICAgICAgICAgICAgcGFyYW1NYXAsIHBhcmFtTWFwX1RZUEUsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGFkZEV4cGVjdGVkTm9kZShTdHJpbmcgcHJvcE5hbWUsIFN0cmluZyBwcm9wVmFsdWUsCi0gICAgICAgICAgICBMaXN0PFN0cmluZz4gcHJvcFZhbHVlTGlzdCwgYnl0ZVtdIHByb3BWYWx1ZV9ieXRlcywKLSAgICAgICAgICAgIENvbnRlbnRWYWx1ZXMgcGFyYW1NYXAsIFR5cGVTZXQgcGFyYW1NYXBfVFlQRSwgR3JvdXBTZXQgcHJvcEdyb3VwU2V0KSB7Ci0gICAgICAgIGlmIChwcm9wVmFsdWUgPT0gbnVsbCAmJiBwcm9wVmFsdWVMaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHByb3BWYWx1ZSA9IGNvbmNhdGluYXRlTGlzdFdpdGhTZW1pQ29sb24ocHJvcFZhbHVlTGlzdCk7Ci0gICAgICAgIH0KLSAgICAgICAgbVVub3JkZXJlZE5vZGVMaXN0LmFkZChuZXcgUHJvcGVydHlOb2RlKHByb3BOYW1lLCBwcm9wVmFsdWUsCi0gICAgICAgICAgICAgICAgcHJvcFZhbHVlTGlzdCwgcHJvcFZhbHVlX2J5dGVzLCBwYXJhbU1hcCwgcGFyYW1NYXBfVFlQRSwgcHJvcEdyb3VwU2V0KSk7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHZlcmlmeShWTm9kZSB2bm9kZSkgewotICAgICAgICBmb3IgKFByb3BlcnR5Tm9kZSBhY3R1YWxOb2RlIDogdm5vZGUucHJvcExpc3QpIHsKLSAgICAgICAgICAgIHZlcmlmeU5vZGUoYWN0dWFsTm9kZS5wcm9wTmFtZSwgYWN0dWFsTm9kZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFtT3JkZXJlZE5vZGVNYXAuaXNFbXB0eSgpIHx8ICFtVW5vcmRlcmVkTm9kZUxpc3QuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBMaXN0PFN0cmluZz4gZXhwZWN0ZWRQcm9wcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICAgICAgZm9yIChMaXN0PFByb3BlcnR5Tm9kZT4gbm9kZXMgOiBtT3JkZXJlZE5vZGVNYXAudmFsdWVzKCkpIHsKLSAgICAgICAgICAgICAgICBmb3IgKFByb3BlcnR5Tm9kZSBub2RlIDogbm9kZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFleHBlY3RlZFByb3BzLmNvbnRhaW5zKG5vZGUucHJvcE5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZFByb3BzLmFkZChub2RlLnByb3BOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAoUHJvcGVydHlOb2RlIG5vZGUgOiBtVW5vcmRlcmVkTm9kZUxpc3QpIHsKLSAgICAgICAgICAgICAgICBpZiAoIWV4cGVjdGVkUHJvcHMuY29udGFpbnMobm9kZS5wcm9wTmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRQcm9wcy5hZGQobm9kZS5wcm9wTmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVRlc3RDYXNlLmZhaWwoIkV4cGVjdGVkIHByb3BlcnR5ICIgKyBBcnJheXMudG9TdHJpbmcoZXhwZWN0ZWRQcm9wcy50b0FycmF5KCkpCi0gICAgICAgICAgICAgICAgICAgICsgIiB3YXMgbm90IGZvdW5kLiIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHZlcmlmeU5vZGUoZmluYWwgU3RyaW5nIHByb3BOYW1lLCBmaW5hbCBQcm9wZXJ0eU5vZGUgYWN0dWFsTm9kZSkgewotICAgICAgICBMaXN0PFByb3BlcnR5Tm9kZT4gZXhwZWN0ZWROb2RlTGlzdCA9IG1PcmRlcmVkTm9kZU1hcC5nZXQocHJvcE5hbWUpOwotICAgICAgICBmaW5hbCBpbnQgc2l6ZSA9IChleHBlY3RlZE5vZGVMaXN0ICE9IG51bGwgPyBleHBlY3RlZE5vZGVMaXN0LnNpemUoKSA6IDApOwotICAgICAgICBpZiAoc2l6ZSA+IDApIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgUHJvcGVydHlOb2RlIGV4cGVjdGVkTm9kZSA9IGV4cGVjdGVkTm9kZUxpc3QuZ2V0KGkpOwotICAgICAgICAgICAgICAgIExpc3Q8UHJvcGVydHlOb2RlPiBleHBlY3RlZEJ1dERpZmZlcmVudFZhbHVlTGlzdCA9IG5ldyBBcnJheUxpc3Q8UHJvcGVydHlOb2RlPigpOwotICAgICAgICAgICAgICAgIGlmIChleHBlY3RlZE5vZGUucHJvcE5hbWUuZXF1YWxzKHByb3BOYW1lKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoZXhwZWN0ZWROb2RlLmVxdWFscyhhY3R1YWxOb2RlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWROb2RlTGlzdC5yZW1vdmUoaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXhwZWN0ZWROb2RlTGlzdC5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1PcmRlcmVkTm9kZU1hcC5yZW1vdmUocHJvcE5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRCdXREaWZmZXJlbnRWYWx1ZUxpc3QuYWRkKGV4cGVjdGVkTm9kZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyAiYWN0dWFsTm9kZSIgaXMgbm90IGluIG9yZGVyZWQgZXhwZWN0ZWQgbGlzdC4KLSAgICAgICAgICAgICAgICAvLyBUcnkgbG9va2luZyBvdmVyIHVub3JkZXJlZCBleHBlY3RlZCBsaXN0LgotICAgICAgICAgICAgICAgIGlmICh0cnlGb3VuZEV4cGVjdGVkTm9kZUZyb21Vbm9yZGVyZWRMaXN0KGFjdHVhbE5vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZEJ1dERpZmZlcmVudFZhbHVlTGlzdCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmICghZXhwZWN0ZWRCdXREaWZmZXJlbnRWYWx1ZUxpc3QuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFNhbWUgcHJvcE5hbWUgZXhpc3RzIGJ1dCB3aXRoIGRpZmZlcmVudCB2YWx1ZShzKS4KLSAgICAgICAgICAgICAgICAgICAgZmFpbFdpdGhFeHBlY3RlZE5vZGVMaXN0KHByb3BOYW1lLCBhY3R1YWxOb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkQnV0RGlmZmVyZW50VmFsdWVMaXN0KTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBUaGVyZSdzIG5vIGV4cGVjdGVkIG5vZGUgd2l0aCBzYW1lIHByb3BOYW1lLgotICAgICAgICAgICAgICAgICAgICBtVGVzdENhc2UuZmFpbCgiVW5leHBlY3RlZCBwcm9wZXJ0eSBcIiIgKyBwcm9wTmFtZSArICJcIiBleGlzdHMuIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTGlzdDxQcm9wZXJ0eU5vZGU+IGV4cGVjdGVkQnV0RGlmZmVyZW50VmFsdWVMaXN0ID0KLSAgICAgICAgICAgICAgICBuZXcgQXJyYXlMaXN0PFByb3BlcnR5Tm9kZT4oKTsKLSAgICAgICAgICAgIGlmICh0cnlGb3VuZEV4cGVjdGVkTm9kZUZyb21Vbm9yZGVyZWRMaXN0KGFjdHVhbE5vZGUsIGV4cGVjdGVkQnV0RGlmZmVyZW50VmFsdWVMaXN0KSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFleHBlY3RlZEJ1dERpZmZlcmVudFZhbHVlTGlzdC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gU2FtZSBwcm9wTmFtZSBleGlzdHMgYnV0IHdpdGggZGlmZmVyZW50IHZhbHVlKHMpLgotICAgICAgICAgICAgICAgICAgICBmYWlsV2l0aEV4cGVjdGVkTm9kZUxpc3QocHJvcE5hbWUsIGFjdHVhbE5vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRCdXREaWZmZXJlbnRWYWx1ZUxpc3QpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRoZXJlJ3Mgbm8gZXhwZWN0ZWQgbm9kZSB3aXRoIHNhbWUgcHJvcE5hbWUuCi0gICAgICAgICAgICAgICAgICAgIG1UZXN0Q2FzZS5mYWlsKCJVbmV4cGVjdGVkIHByb3BlcnR5IFwiIiArIHByb3BOYW1lICsgIlwiIGV4aXN0cy4iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBjb25jYXRpbmF0ZUxpc3RXaXRoU2VtaUNvbG9uKExpc3Q8U3RyaW5nPiBhcnJheSkgewotICAgICAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBib29sZWFuIGZpcnN0ID0gdHJ1ZTsKLSAgICAgICAgZm9yIChTdHJpbmcgcHJvcFZhbHVlRWxlbSA6IGFycmF5KSB7Ci0gICAgICAgICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCc7Jyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBidWZmZXIuYXBwZW5kKHByb3BWYWx1ZUVsZW0pOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiB0cnlGb3VuZEV4cGVjdGVkTm9kZUZyb21Vbm9yZGVyZWRMaXN0KFByb3BlcnR5Tm9kZSBhY3R1YWxOb2RlLAotICAgICAgICAgICAgTGlzdDxQcm9wZXJ0eU5vZGU+IGV4cGVjdGVkQnV0RGlmZmVyZW50VmFsdWVMaXN0KSB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBwcm9wTmFtZSA9IGFjdHVhbE5vZGUucHJvcE5hbWU7Ci0gICAgICAgIGludCB1bm9yZGVyZWRMaXN0U2l6ZSA9IG1Vbm9yZGVyZWROb2RlTGlzdC5zaXplKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdW5vcmRlcmVkTGlzdFNpemU7IGkrKykgewotICAgICAgICAgICAgUHJvcGVydHlOb2RlIHVub3JkZXJlZEV4cGVjdGVkTm9kZSA9IG1Vbm9yZGVyZWROb2RlTGlzdC5nZXQoaSk7Ci0gICAgICAgICAgICBpZiAodW5vcmRlcmVkRXhwZWN0ZWROb2RlLnByb3BOYW1lLmVxdWFscyhwcm9wTmFtZSkpIHsKLSAgICAgICAgICAgICAgICBpZiAodW5vcmRlcmVkRXhwZWN0ZWROb2RlLmVxdWFscyhhY3R1YWxOb2RlKSkgewotICAgICAgICAgICAgICAgICAgICBtVW5vcmRlcmVkTm9kZUxpc3QucmVtb3ZlKGkpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZXhwZWN0ZWRCdXREaWZmZXJlbnRWYWx1ZUxpc3QuYWRkKHVub3JkZXJlZEV4cGVjdGVkTm9kZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBmYWlsV2l0aEV4cGVjdGVkTm9kZUxpc3QoU3RyaW5nIHByb3BOYW1lLCBQcm9wZXJ0eU5vZGUgYWN0dWFsTm9kZSwKLSAgICAgICAgICAgIExpc3Q8UHJvcGVydHlOb2RlPiBleHBlY3RlZE5vZGVMaXN0KSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIGZvciAoUHJvcGVydHlOb2RlIGV4cGVjdGVkTm9kZSA6IGV4cGVjdGVkTm9kZUxpc3QpIHsKLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCJleHBlY3RlZDogIik7Ci0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZChleHBlY3RlZE5vZGUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiXG4iKTsKLSAgICAgICAgfQotICAgICAgICBtVGVzdENhc2UuZmFpbCgiUHJvcGVydHkgXCIiICsgcHJvcE5hbWUgKyAiXCIgaGFzIHdyb25nIHZhbHVlLlxuIgotICAgICAgICAgICAgICAgICsgYnVpbGRlci50b1N0cmluZygpCi0gICAgICAgICAgICAgICAgKyAiICBhY3R1YWw6ICIgKyBhY3R1YWxOb2RlLnRvU3RyaW5nKCkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZEV4cG9ydGVyVGVzdHMuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZEV4cG9ydGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjk2MmE5MjYuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkRXhwb3J0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTgxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXM7Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuVkNhcmRDb25maWc7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5FbWFpbDsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLkV2ZW50OwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuSW07Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5OaWNrbmFtZTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLk5vdGU7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5Pcmdhbml6YXRpb247Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5QaG9uZTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLlBob3RvOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuUmVsYXRpb247Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5TdHJ1Y3R1cmVkTmFtZTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLlN0cnVjdHVyZWRQb3N0YWw7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5XZWJzaXRlOwotCi1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbS5UeXBlU2V0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotLyoqCi0gKiBUZXN0cyBmb3IgdGhlIGNvZGUgcmVsYXRlZCB0byB2Q2FyZCBleHBvcnRlciwgaW5jdWxkaW5nIHZDYXJkIGNvbXBvc2VyLgotICogVGhpcyB0ZXN0IGNsYXNzIGRlcGVuZHMgb24gdkNhcmQgaW1wb3J0ZXIgY29kZSwgc28gaWYgdGVzdHMgZm9yIHZDYXJkIGltcG9ydGVyIGZhaWwsCi0gKiB0aGUgcmVzdWx0IG9mIHRoaXMgY2xhc3Mgd2lsbCBub3QgYmUgcmVsaWFibGUuCi0gKi8KLXB1YmxpYyBjbGFzcyBWQ2FyZEV4cG9ydGVyVGVzdHMgZXh0ZW5kcyBWQ2FyZFRlc3RzQmFzZSB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdIHNQaG90b0J5dGVBcnJheSA9Ci0gICAgICAgIFZDYXJkSW1wb3J0ZXJUZXN0cy5zUGhvdG9CeXRlQXJyYXlGb3JDb21wbGljYXRlZENhc2U7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlVjIxKCkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QoVjIxKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRkFNSUxZX05BTUUsICJBbmRvIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkdJVkVOX05BTUUsICJSb2lkIik7Ci0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJGTiIsICJSb2lkIEFuZG8iKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIk4iLCAiQW5kbztSb2lkOzs7IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoIkFuZG8iLCAiUm9pZCIsICIiLCAiIiwgIiIpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGVzdFN0cnVjdHVyZWROYW1lQmFzaWMoaW50IHZjYXJkVHlwZSkgewotICAgICAgICBmaW5hbCBib29sZWFuIGlzVjMwID0gVkNhcmRDb25maWcuaXNWMzAodmNhcmRUeXBlKTsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KHZjYXJkVHlwZSk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkZBTUlMWV9OQU1FLCAiQXBwcm9wcmlhdGVGYW1pbHlOYW1lIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkdJVkVOX05BTUUsICJBcHByb3ByaWF0ZUdpdmVuTmFtZSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5NSURETEVfTkFNRSwgIkFwcHJvcHJpYXRlTWlkZGxlTmFtZSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QUkVGSVgsICJBcHByb3ByaWF0ZVByZWZpeCIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5TVUZGSVgsICJBcHByb3ByaWF0ZVN1ZmZpeCIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19GQU1JTFlfTkFNRSwgIkFwcHJvcHJpYXRlUGhvbmV0aWNGYW1pbHkiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfR0lWRU5fTkFNRSwgIkFwcHJvcHJpYXRlUGhvbmV0aWNHaXZlbiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19NSURETEVfTkFNRSwgIkFwcHJvcHJpYXRlUGhvbmV0aWNNaWRkbGUiKTsKLQotICAgICAgICBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGVsZW0gPSBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiTiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiQXBwcm9wcmlhdGVGYW1pbHlOYW1lO0FwcHJvcHJpYXRlR2l2ZW5OYW1lO0FwcHJvcHJpYXRlTWlkZGxlTmFtZTsiCi0gICAgICAgICAgICAgICAgICAgICAgICArICJBcHByb3ByaWF0ZVByZWZpeDtBcHByb3ByaWF0ZVN1ZmZpeCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KCJBcHByb3ByaWF0ZUZhbWlseU5hbWUiLCAiQXBwcm9wcmlhdGVHaXZlbk5hbWUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXBwcm9wcmlhdGVNaWRkbGVOYW1lIiwgIkFwcHJvcHJpYXRlUHJlZml4IiwgIkFwcHJvcHJpYXRlU3VmZml4IikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiRk4iLAotICAgICAgICAgICAgICAgICAgICAgICAgIkFwcHJvcHJpYXRlUHJlZml4IEFwcHJvcHJpYXRlR2l2ZW5OYW1lICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIkFwcHJvcHJpYXRlTWlkZGxlTmFtZSBBcHByb3ByaWF0ZUZhbWlseU5hbWUgQXBwcm9wcmlhdGVTdWZmaXgiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtUEhPTkVUSUMtRklSU1QtTkFNRSIsICJBcHByb3ByaWF0ZVBob25ldGljR2l2ZW4iKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtUEhPTkVUSUMtTUlERExFLU5BTUUiLCAiQXBwcm9wcmlhdGVQaG9uZXRpY01pZGRsZSIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1QSE9ORVRJQy1MQVNULU5BTUUiLCAiQXBwcm9wcmlhdGVQaG9uZXRpY0ZhbWlseSIpOwotCi0gICAgICAgIGlmIChpc1YzMCkgewotICAgICAgICAgICAgZWxlbS5hZGRFeHBlY3RlZE5vZGUoIlNPUlQtU1RSSU5HIiwKLSAgICAgICAgICAgICAgICAgICAgIkFwcHJvcHJpYXRlUGhvbmV0aWNHaXZlbiBBcHByb3ByaWF0ZVBob25ldGljTWlkZGxlICIKLSAgICAgICAgICAgICAgICAgICAgKyAiQXBwcm9wcmlhdGVQaG9uZXRpY0ZhbWlseSIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFN0cnVjdHVyZWROYW1lQmFzaWNWMjEoKSB7Ci0gICAgICAgIHRlc3RTdHJ1Y3R1cmVkTmFtZUJhc2ljKFYyMSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFN0cnVjdHVyZWROYW1lQmFzaWNWMzAoKSB7Ci0gICAgICAgIHRlc3RTdHJ1Y3R1cmVkTmFtZUJhc2ljKFYzMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCB0aGF0IG9ubHkgInByaW1hcnkiIFN0cnVjdHVyZWROYW1lIGlzIGVtaXR0ZWQsIHNvIHRoYXQgb3VyIHZDYXJkIGZpbGUKLSAgICAgKiB3aWxsIG5vdCBjb25mdXNlIHRoZSBleHRlcm5hbCBpbXBvcnRlciwgYXNzdW1pbmcgdGhlcmUgbWF5IGJlIHNvbWUgaW1wb3J0ZXIKLSAgICAgKiB3aGljaCBwcmVzdW1lIHRoYXQgdGhlcmUncyBvbmx5IG9uZSBwcm9wZXJ0eSB0b3dhcmQgZWFjaCBvZiAgIk4iLCAiRk4iLCBldGMuCi0gICAgICogTm90ZSB0aGF0IG1vcmUgdGhhbiBvbmUgIk4iLCAiRk4iLCBldGMuIHByb3BlcnRpZXMgYXJlIGFjY2VwdGFibGUgaW4gdkNhcmQgc3BlYy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgdGVzdFN0cnVjdHVyZWROYW1lVXNlUHJpbWFyeUNvbW1vbihpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIGZpbmFsIGJvb2xlYW4gaXNWMzAgPSAodmNhcmRUeXBlID09IFYzMCk7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdCh2Y2FyZFR5cGUpOwotICAgICAgICBDb250YWN0RW50cnkgZW50cnkgPSBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRkFNSUxZX05BTUUsICJEb05vdEVtaXRGYW1pbHlOYW1lMSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5HSVZFTl9OQU1FLCAiRG9Ob3RFbWl0R2l2ZW5OYW1lMSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5NSURETEVfTkFNRSwgIkRvTm90RW1pdE1pZGRsZU5hbWUxIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBSRUZJWCwgIkRvTm90RW1pdFByZWZpeDEiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuU1VGRklYLCAiRG9Ob3RFbWl0U3VmZml4MSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19GQU1JTFlfTkFNRSwgIkRvTm90RW1pdFBob25ldGljRmFtaWx5MSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19HSVZFTl9OQU1FLCAiRG9Ob3RFbWl0UGhvbmV0aWNHaXZlbjEiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfTUlERExFX05BTUUsICJEb05vdEVtaXRQaG9uZXRpY01pZGRsZTEiKTsKLQotICAgICAgICAvLyBXaXRoICJJU19QUklNQVJZPTEiLiBUaGlzIGlzIHdoYXQgd2Ugc2hvdWxkIHVzZS4KLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkZBTUlMWV9OQU1FLCAiQXBwcm9wcmlhdGVGYW1pbHlOYW1lIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkdJVkVOX05BTUUsICJBcHByb3ByaWF0ZUdpdmVuTmFtZSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5NSURETEVfTkFNRSwgIkFwcHJvcHJpYXRlTWlkZGxlTmFtZSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QUkVGSVgsICJBcHByb3ByaWF0ZVByZWZpeCIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5TVUZGSVgsICJBcHByb3ByaWF0ZVN1ZmZpeCIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19GQU1JTFlfTkFNRSwgIkFwcHJvcHJpYXRlUGhvbmV0aWNGYW1pbHkiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfR0lWRU5fTkFNRSwgIkFwcHJvcHJpYXRlUGhvbmV0aWNHaXZlbiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19NSURETEVfTkFNRSwgIkFwcHJvcHJpYXRlUGhvbmV0aWNNaWRkbGUiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuSVNfUFJJTUFSWSwgMSk7Ci0KLSAgICAgICAgLy8gV2l0aCAiSVNfUFJJTUFSWT0xIiwgYnV0IHdlIHNob3VsZCBpZ25vcmUgdGhpcyB0aW1lLCBzaW5jZSB0aGlzIGlzIHNlY29uZCwgbm90IGZpcnN0LgotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRkFNSUxZX05BTUUsICJEb05vdEVtaXRGYW1pbHlOYW1lMiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5HSVZFTl9OQU1FLCAiRG9Ob3RFbWl0R2l2ZW5OYW1lMiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5NSURETEVfTkFNRSwgIkRvTm90RW1pdE1pZGRsZU5hbWUyIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBSRUZJWCwgIkRvTm90RW1pdFByZWZpeDIiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuU1VGRklYLCAiRG9Ob3RFbWl0U3VmZml4MiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19GQU1JTFlfTkFNRSwgIkRvTm90RW1pdFBob25ldGljRmFtaWx5MiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19HSVZFTl9OQU1FLCAiRG9Ob3RFbWl0UGhvbmV0aWNHaXZlbjIiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfTUlERExFX05BTUUsICJEb05vdEVtaXRQaG9uZXRpY01pZGRsZTIiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuSVNfUFJJTUFSWSwgMSk7Ci0KLSAgICAgICAgUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSBlbGVtID0gbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0oKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIk4iLAotICAgICAgICAgICAgICAgICAgICAgICAgIkFwcHJvcHJpYXRlRmFtaWx5TmFtZTtBcHByb3ByaWF0ZUdpdmVuTmFtZTtBcHByb3ByaWF0ZU1pZGRsZU5hbWU7IgotICAgICAgICAgICAgICAgICAgICAgICAgKyAiQXBwcm9wcmlhdGVQcmVmaXg7QXBwcm9wcmlhdGVTdWZmaXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgiQXBwcm9wcmlhdGVGYW1pbHlOYW1lIiwgIkFwcHJvcHJpYXRlR2l2ZW5OYW1lIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFwcHJvcHJpYXRlTWlkZGxlTmFtZSIsICJBcHByb3ByaWF0ZVByZWZpeCIsICJBcHByb3ByaWF0ZVN1ZmZpeCIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIkZOIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJBcHByb3ByaWF0ZVByZWZpeCBBcHByb3ByaWF0ZUdpdmVuTmFtZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICArICJBcHByb3ByaWF0ZU1pZGRsZU5hbWUgQXBwcm9wcmlhdGVGYW1pbHlOYW1lIEFwcHJvcHJpYXRlU3VmZml4IikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLVBIT05FVElDLUZJUlNULU5BTUUiLCAiQXBwcm9wcmlhdGVQaG9uZXRpY0dpdmVuIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLVBIT05FVElDLU1JRERMRS1OQU1FIiwgIkFwcHJvcHJpYXRlUGhvbmV0aWNNaWRkbGUiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtUEhPTkVUSUMtTEFTVC1OQU1FIiwgIkFwcHJvcHJpYXRlUGhvbmV0aWNGYW1pbHkiKTsKLQotICAgICAgICBpZiAoaXNWMzApIHsKLSAgICAgICAgICAgIGVsZW0uYWRkRXhwZWN0ZWROb2RlKCJTT1JULVNUUklORyIsCi0gICAgICAgICAgICAgICAgICAgICJBcHByb3ByaWF0ZVBob25ldGljR2l2ZW4gQXBwcm9wcmlhdGVQaG9uZXRpY01pZGRsZSAiCi0gICAgICAgICAgICAgICAgICAgICsgIkFwcHJvcHJpYXRlUGhvbmV0aWNGYW1pbHkiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJ1Y3R1cmVkTmFtZVVzZVByaW1hcnlWMjEoKSB7Ci0gICAgICAgIHRlc3RTdHJ1Y3R1cmVkTmFtZVVzZVByaW1hcnlDb21tb24oVjIxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RydWN0dXJlZE5hbWVVc2VQcmltYXJ5VjMwKCkgewotICAgICAgICB0ZXN0U3RydWN0dXJlZE5hbWVVc2VQcmltYXJ5Q29tbW9uKFYzMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgdGhhdCBvbmx5ICJzdXBlciBwcmltYXJ5IiBTdHJ1Y3R1cmVkTmFtZSBpcyBlbWl0dGVkLgotICAgICAqIFNlZSBhbHNvIHRoZSBjb21tZW50IGluIHtAbGluayAjdGVzdFN0cnVjdHVyZWROYW1lVXNlUHJpbWFyeUNvbW1vbihpbnQpfS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgdGVzdFN0cnVjdHVyZWROYW1lVXNlU3VwZXJQcmltYXJ5Q29tbW9uKGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgZmluYWwgYm9vbGVhbiBpc1YzMCA9ICh2Y2FyZFR5cGUgPT0gVjMwKTsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KHZjYXJkVHlwZSk7Ci0gICAgICAgIENvbnRhY3RFbnRyeSBlbnRyeSA9IG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgIkRvTm90RW1pdEZhbWlseU5hbWUxIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkdJVkVOX05BTUUsICJEb05vdEVtaXRHaXZlbk5hbWUxIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLk1JRERMRV9OQU1FLCAiRG9Ob3RFbWl0TWlkZGxlTmFtZTEiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUFJFRklYLCAiRG9Ob3RFbWl0UHJlZml4MSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5TVUZGSVgsICJEb05vdEVtaXRTdWZmaXgxIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0ZBTUlMWV9OQU1FLCAiRG9Ob3RFbWl0UGhvbmV0aWNGYW1pbHkxIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0dJVkVOX05BTUUsICJEb05vdEVtaXRQaG9uZXRpY0dpdmVuMSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19NSURETEVfTkFNRSwgIkRvTm90RW1pdFBob25ldGljTWlkZGxlMSIpOwotCi0gICAgICAgIC8vIFdpdGggIklTX1BSSU1BUlk9MSIsIGJ1dCB3ZSBzaG91bGQgaWdub3JlIHRoaXMgdGltZS4KLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkZBTUlMWV9OQU1FLCAiRG9Ob3RFbWl0RmFtaWx5TmFtZTIiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuR0lWRU5fTkFNRSwgIkRvTm90RW1pdEdpdmVuTmFtZTIiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuTUlERExFX05BTUUsICJEb05vdEVtaXRNaWRkbGVOYW1lMiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QUkVGSVgsICJEb05vdEVtaXRQcmVmaXgyIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlNVRkZJWCwgIkRvTm90RW1pdFN1ZmZpeDIiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfRkFNSUxZX05BTUUsICJEb05vdEVtaXRQaG9uZXRpY0ZhbWlseTIiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfR0lWRU5fTkFNRSwgIkRvTm90RW1pdFBob25ldGljR2l2ZW4yIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX01JRERMRV9OQU1FLCAiRG9Ob3RFbWl0UGhvbmV0aWNNaWRkbGUyIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLklTX1BSSU1BUlksIDEpOwotCi0gICAgICAgIC8vIFdpdGggIklTX1NVUEVSX1BSSU1BUlk9MSIuIFRoaXMgaXMgd2hhdCB3ZSBzaG91bGQgdXNlLgotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRkFNSUxZX05BTUUsICJBcHByb3ByaWF0ZUZhbWlseU5hbWUiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuR0lWRU5fTkFNRSwgIkFwcHJvcHJpYXRlR2l2ZW5OYW1lIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLk1JRERMRV9OQU1FLCAiQXBwcm9wcmlhdGVNaWRkbGVOYW1lIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBSRUZJWCwgIkFwcHJvcHJpYXRlUHJlZml4IikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlNVRkZJWCwgIkFwcHJvcHJpYXRlU3VmZml4IikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0ZBTUlMWV9OQU1FLCAiQXBwcm9wcmlhdGVQaG9uZXRpY0ZhbWlseSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19HSVZFTl9OQU1FLCAiQXBwcm9wcmlhdGVQaG9uZXRpY0dpdmVuIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX01JRERMRV9OQU1FLCAiQXBwcm9wcmlhdGVQaG9uZXRpY01pZGRsZSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5JU19TVVBFUl9QUklNQVJZLCAxKTsKLQotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRkFNSUxZX05BTUUsICJEb05vdEVtaXRGYW1pbHlOYW1lMyIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5HSVZFTl9OQU1FLCAiRG9Ob3RFbWl0R2l2ZW5OYW1lMyIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5NSURETEVfTkFNRSwgIkRvTm90RW1pdE1pZGRsZU5hbWUzIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBSRUZJWCwgIkRvTm90RW1pdFByZWZpeDMiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuU1VGRklYLCAiRG9Ob3RFbWl0U3VmZml4MyIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19GQU1JTFlfTkFNRSwgIkRvTm90RW1pdFBob25ldGljRmFtaWx5MyIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19HSVZFTl9OQU1FLCAiRG9Ob3RFbWl0UGhvbmV0aWNHaXZlbjMiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfTUlERExFX05BTUUsICJEb05vdEVtaXRQaG9uZXRpY01pZGRsZTMiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuSVNfUFJJTUFSWSwgMSk7Ci0KLSAgICAgICAgUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSBlbGVtID0gbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0oKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIk4iLAotICAgICAgICAgICAgICAgICAgICAgICAgIkFwcHJvcHJpYXRlRmFtaWx5TmFtZTtBcHByb3ByaWF0ZUdpdmVuTmFtZTtBcHByb3ByaWF0ZU1pZGRsZU5hbWU7IgotICAgICAgICAgICAgICAgICAgICAgICAgKyAiQXBwcm9wcmlhdGVQcmVmaXg7QXBwcm9wcmlhdGVTdWZmaXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgiQXBwcm9wcmlhdGVGYW1pbHlOYW1lIiwgIkFwcHJvcHJpYXRlR2l2ZW5OYW1lIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFwcHJvcHJpYXRlTWlkZGxlTmFtZSIsICJBcHByb3ByaWF0ZVByZWZpeCIsICJBcHByb3ByaWF0ZVN1ZmZpeCIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIkZOIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJBcHByb3ByaWF0ZVByZWZpeCBBcHByb3ByaWF0ZUdpdmVuTmFtZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICArICJBcHByb3ByaWF0ZU1pZGRsZU5hbWUgQXBwcm9wcmlhdGVGYW1pbHlOYW1lIEFwcHJvcHJpYXRlU3VmZml4IikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLVBIT05FVElDLUZJUlNULU5BTUUiLCAiQXBwcm9wcmlhdGVQaG9uZXRpY0dpdmVuIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLVBIT05FVElDLU1JRERMRS1OQU1FIiwgIkFwcHJvcHJpYXRlUGhvbmV0aWNNaWRkbGUiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtUEhPTkVUSUMtTEFTVC1OQU1FIiwgIkFwcHJvcHJpYXRlUGhvbmV0aWNGYW1pbHkiKTsKLQotICAgICAgICBpZiAoaXNWMzApIHsKLSAgICAgICAgICAgIGVsZW0uYWRkRXhwZWN0ZWROb2RlKCJTT1JULVNUUklORyIsCi0gICAgICAgICAgICAgICAgICAgICJBcHByb3ByaWF0ZVBob25ldGljR2l2ZW4gQXBwcm9wcmlhdGVQaG9uZXRpY01pZGRsZSIKLSAgICAgICAgICAgICAgICAgICAgKyAiIEFwcHJvcHJpYXRlUGhvbmV0aWNGYW1pbHkiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJ1Y3R1cmVkTmFtZVVzZVN1cGVyUHJpbWFyeVYyMSgpIHsKLSAgICAgICAgdGVzdFN0cnVjdHVyZWROYW1lVXNlU3VwZXJQcmltYXJ5Q29tbW9uKFYyMSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFN0cnVjdHVyZWROYW1lVXNlU3VwZXJQcmltYXJ5VjMwKCkgewotICAgICAgICB0ZXN0U3RydWN0dXJlZE5hbWVVc2VTdXBlclByaW1hcnlDb21tb24oVjMwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Tmlja05hbWVWMzAoKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdChWMzApOwotICAgICAgICBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpLmFkZENvbnRlbnRWYWx1ZXMoTmlja25hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChOaWNrbmFtZS5OQU1FLCAiTmlja3kiKTsKLQotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbVdpdGhFbXB0eU5hbWUoKQotICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiTklDS05BTUUiLCAiTmlja3kiKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGVzdFBob25lQmFzaWNDb21tb24oaW50IHZjYXJkVHlwZSkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QodmNhcmRUeXBlKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKS5hZGRDb250ZW50VmFsdWVzKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMSIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0hPTUUpOwotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbVdpdGhFbXB0eU5hbWUoKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICIxIiwgbmV3IFR5cGVTZXQoIkhPTUUiKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBob25lQmFzaWNWMjEoKSB7Ci0gICAgICAgIHRlc3RQaG9uZUJhc2ljQ29tbW9uKFYyMSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBob25lQmFzaWNWMzAoKSB7Ci0gICAgICAgIHRlc3RQaG9uZUJhc2ljQ29tbW9uKFYzMCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBob25lUmVmcmFpbkZvcm1hdHRpbmcoKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdChWMjEgfCBWQ2FyZENvbmZpZy5GTEFHX1JFRlJBSU5fUEhPTkVfTlVNQkVSX0ZPUk1BVFRJTkcpOwotICAgICAgICBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpLmFkZENvbnRlbnRWYWx1ZXMoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIxMjM0NTY3ODkwKGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6KSIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0hPTUUpOwotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbVdpdGhFbXB0eU5hbWUoKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICIxMjM0NTY3ODkwKGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6KSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgVHlwZVNldCgiSE9NRSIpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyB0aGF0IHZDYXJkIGNvbXBvc2VyIGVtaXRzIGNvcnJlc3BvbmRpbmcgdHlwZSBwYXJhbSB3aGljaCB3ZSBleHBlY3QuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RQaG9uZVZhcmlvdXNUeXBlU3VwcG9ydChpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdCh2Y2FyZFR5cGUpOwotICAgICAgICBDb250YWN0RW50cnkgZW50cnkgPSBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMTAiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9IT01FKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjIwIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfV09SSyk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIzMCIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0ZBWF9IT01FKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjQwIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfRkFYX1dPUkspOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiNTAiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9NT0JJTEUpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiNjAiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9QQUdFUik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICI3MCIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX09USEVSKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjgwIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfQ0FSKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjkwIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfQ09NUEFOWV9NQUlOKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjEwMCIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0lTRE4pOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMTEwIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfTUFJTik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIxMjAiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9PVEhFUl9GQVgpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMTMwIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfVEVMRVgpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMTQwIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfV09SS19NT0JJTEUpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMTUwIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfV09SS19QQUdFUik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIxNjAiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9NTVMpOwotCi0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtV2l0aEVtcHR5TmFtZSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjEwIiwgbmV3IFR5cGVTZXQoIkhPTUUiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiMjAiLCBuZXcgVHlwZVNldCgiV09SSyIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICIzMCIsIG5ldyBUeXBlU2V0KCJIT01FIiwgIkZBWCIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICI0MCIsIG5ldyBUeXBlU2V0KCJXT1JLIiwgIkZBWCIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICI1MCIsIG5ldyBUeXBlU2V0KCJDRUxMIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjYwIiwgbmV3IFR5cGVTZXQoIlBBR0VSIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjcwIiwgbmV3IFR5cGVTZXQoIlZPSUNFIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjgwIiwgbmV3IFR5cGVTZXQoIkNBUiIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICI5MCIsIG5ldyBUeXBlU2V0KCJXT1JLIiwgIlBSRUYiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiMTAwIiwgbmV3IFR5cGVTZXQoIklTRE4iKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiMTEwIiwgbmV3IFR5cGVTZXQoIlBSRUYiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiMTIwIiwgbmV3IFR5cGVTZXQoIkZBWCIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICIxMzAiLCBuZXcgVHlwZVNldCgiVExYIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjE0MCIsIG5ldyBUeXBlU2V0KCJXT1JLIiwgIkNFTEwiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiMTUwIiwgbmV3IFR5cGVTZXQoIldPUksiLCAiUEFHRVIiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiMTYwIiwgbmV3IFR5cGVTZXQoIk1TRyIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGhvbmVWYXJpb3VzVHlwZVN1cHBvcnRWMjEoKSB7Ci0gICAgICAgIHRlc3RQaG9uZVZhcmlvdXNUeXBlU3VwcG9ydChWMjEpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQaG9uZVZhcmlvdXNUeXBlU3VwcG9ydFYzMCgpIHsKLSAgICAgICAgdGVzdFBob25lVmFyaW91c1R5cGVTdXBwb3J0KFYzMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgdGhhdCAiUFJFRiJzIGFyZSBlbWl0dGVkIGFwcHJvcHJpYXRlbHkuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RQaG9uZVByZWZIYW5kbGluZ0NvbW1vbihpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdCh2Y2FyZFR5cGUpOwotICAgICAgICBDb250YWN0RW50cnkgZW50cnkgPSBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMSIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0hPTUUpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMiIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX1dPUkspCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5JU19QUklNQVJZLCAxKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjMiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9GQVhfSE9NRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLklTX1BSSU1BUlksIDEpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiNCIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0ZBWF9XT1JLKTsKLQotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbVdpdGhFbXB0eU5hbWUoKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICI0IiwgbmV3IFR5cGVTZXQoIldPUksiLCAiRkFYIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjMiLCBuZXcgVHlwZVNldCgiSE9NRSIsICJGQVgiLCAiUFJFRiIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICIyIiwgbmV3IFR5cGVTZXQoIldPUksiLCAiUFJFRiIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICIxIiwgbmV3IFR5cGVTZXQoIkhPTUUiKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBob25lUHJlZkhhbmRsaW5nVjIxKCkgewotICAgICAgICB0ZXN0UGhvbmVQcmVmSGFuZGxpbmdDb21tb24oVjIxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGhvbmVQcmVmSGFuZGxpbmdWMzAoKSB7Ci0gICAgICAgIHRlc3RQaG9uZVByZWZIYW5kbGluZ0NvbW1vbihWMzApOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0ZXN0TWlzY1Bob25lVHlwZUhhbmRsaW5nKGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KHZjYXJkVHlwZSk7Ci0gICAgICAgIENvbnRhY3RFbnRyeSBlbnRyeSA9IG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIxIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfQ1VTVE9NKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTEFCRUwsICJNb2RlbSIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMiIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0NVU1RPTSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLkxBQkVMLCAiTVNHIik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIzIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfQ1VTVE9NKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTEFCRUwsICJCQlMiKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjQiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9DVVNUT00pCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5MQUJFTCwgIlZJREVPIik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICI1IikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfQ1VTVE9NKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjYiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9DVVNUT00pCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5MQUJFTCwgIl9BVVRPX0NFTEwiKTsgIC8vIFRoZSBvbGQgaW5kaWNhdG9yIGZvciB0aGUgdHlwZSBtb2JpbGUuCi0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICI3IikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfQ1VTVE9NKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTEFCRUwsICJcdTY0M0FcdTVFMkYiKTsgIC8vIE1vYmlsZSBwaG9uZSBpbiBKYXBhbmVzZSBLYW5qaQotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiOCIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0NVU1RPTSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLkxBQkVMLCAiaW52YWxpZCIpOwotICAgICAgICBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGVsZW0gPSBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbVdpdGhFbXB0eU5hbWUoKTsKLSAgICAgICAgaWYgKFZDYXJkQ29uZmlnLmlzVjMwKHZjYXJkVHlwZSkpIHsKLSAgICAgICAgICAgIC8vIHZDYXJkIDMuMCBhY2NlcHRzICJpbnZhbGlkIi4gQWxzbyBzdG9wIHVzaW5nIHRvVXBwZXIoKQotICAgICAgICAgICAgZWxlbS5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICIxIiwgbmV3IFR5cGVTZXQoIk1vZGVtIikpCi0gICAgICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICIyIiwgbmV3IFR5cGVTZXQoIk1TRyIpKQotICAgICAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiMyIsIG5ldyBUeXBlU2V0KCJCQlMiKSkKLSAgICAgICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjQiLCBuZXcgVHlwZVNldCgiVklERU8iKSkKLSAgICAgICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjUiLCBuZXcgVHlwZVNldCgiVk9JQ0UiKSkKLSAgICAgICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjYiLCBuZXcgVHlwZVNldCgiQ0VMTCIpKQotICAgICAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiNyIsIG5ldyBUeXBlU2V0KCJDRUxMIikpCi0gICAgICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICI4IiwgbmV3IFR5cGVTZXQoImludmFsaWQiKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBlbGVtLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjEiLCBuZXcgVHlwZVNldCgiTU9ERU0iKSkKLSAgICAgICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjIiLCBuZXcgVHlwZVNldCgiTVNHIikpCi0gICAgICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICIzIiwgbmV3IFR5cGVTZXQoIkJCUyIpKQotICAgICAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiNCIsIG5ldyBUeXBlU2V0KCJWSURFTyIpKQotICAgICAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiNSIsIG5ldyBUeXBlU2V0KCJWT0lDRSIpKQotICAgICAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiNiIsIG5ldyBUeXBlU2V0KCJDRUxMIikpCi0gICAgICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICI3IiwgbmV3IFR5cGVTZXQoIkNFTEwiKSkKLSAgICAgICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjgiLCBuZXcgVHlwZVNldCgiWC1pbnZhbGlkIikpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBob25lVHlwZUhhbmRsaW5nVjIxKCkgewotICAgICAgICB0ZXN0TWlzY1Bob25lVHlwZUhhbmRsaW5nKFYyMSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBob25lVHlwZUhhbmRsaW5nVjMwKCkgewotICAgICAgICB0ZXN0TWlzY1Bob25lVHlwZUhhbmRsaW5nKFYzMCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RFbWFpbEJhc2ljQ29tbW9uKGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KHZjYXJkVHlwZSk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCkuYWRkQ29udGVudFZhbHVlcyhFbWFpbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KEVtYWlsLkRBVEEsICJzYW1wbGVAZXhhbXBsZS5jb20iKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1XaXRoRW1wdHlOYW1lKCkKLSAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkVNQUlMIiwgInNhbXBsZUBleGFtcGxlLmNvbSIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFbWFpbEJhc2ljVjIxKCkgewotICAgICAgICB0ZXN0RW1haWxCYXNpY0NvbW1vbihWMjEpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFbWFpbEJhc2ljVjMwKCkgewotICAgICAgICB0ZXN0RW1haWxCYXNpY0NvbW1vbihWMzApOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0ZXN0RW1haWxWYXJpb3VzVHlwZVN1cHBvcnRDb21tb24oaW50IHZjYXJkVHlwZSkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QodmNhcmRUeXBlKTsKLSAgICAgICAgQ29udGFjdEVudHJ5IGVudHJ5ID0gbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhFbWFpbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KEVtYWlsLkRBVEEsICJ0eXBlX2hvbWVAZXhhbXBsZS5jb20iKQotICAgICAgICAgICAgICAgIC5wdXQoRW1haWwuVFlQRSwgRW1haWwuVFlQRV9IT01FKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhFbWFpbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KEVtYWlsLkRBVEEsICJ0eXBlX3dvcmtAZXhhbXBsZS5jb20iKQotICAgICAgICAgICAgICAgIC5wdXQoRW1haWwuVFlQRSwgRW1haWwuVFlQRV9XT1JLKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhFbWFpbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KEVtYWlsLkRBVEEsICJ0eXBlX21vYmlsZUBleGFtcGxlLmNvbSIpCi0gICAgICAgICAgICAgICAgLnB1dChFbWFpbC5UWVBFLCBFbWFpbC5UWVBFX01PQklMRSk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoRW1haWwuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChFbWFpbC5EQVRBLCAidHlwZV9vdGhlckBleGFtcGxlLmNvbSIpCi0gICAgICAgICAgICAgICAgLnB1dChFbWFpbC5UWVBFLCBFbWFpbC5UWVBFX09USEVSKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1XaXRoRW1wdHlOYW1lKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJFTUFJTCIsICJ0eXBlX2hvbWVAZXhhbXBsZS5jb20iLCBuZXcgVHlwZVNldCgiSE9NRSIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkVNQUlMIiwgInR5cGVfd29ya0BleGFtcGxlLmNvbSIsIG5ldyBUeXBlU2V0KCJXT1JLIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiRU1BSUwiLCAidHlwZV9tb2JpbGVAZXhhbXBsZS5jb20iLCBuZXcgVHlwZVNldCgiQ0VMTCIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkVNQUlMIiwgInR5cGVfb3RoZXJAZXhhbXBsZS5jb20iKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RW1haWxWYXJpb3VzVHlwZVN1cHBvcnRWMjEoKSB7Ci0gICAgICAgIHRlc3RFbWFpbFZhcmlvdXNUeXBlU3VwcG9ydENvbW1vbihWMjEpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFbWFpbFZhcmlvdXNUeXBlU3VwcG9ydFYzMCgpIHsKLSAgICAgICAgdGVzdEVtYWlsVmFyaW91c1R5cGVTdXBwb3J0Q29tbW9uKFYzMCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RFbWFpbFByZWZIYW5kbGluZ0NvbW1vbihpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdCh2Y2FyZFR5cGUpOwotICAgICAgICBDb250YWN0RW50cnkgZW50cnkgPSBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKEVtYWlsLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoRW1haWwuREFUQSwgInR5cGVfaG9tZUBleGFtcGxlLmNvbSIpCi0gICAgICAgICAgICAgICAgLnB1dChFbWFpbC5UWVBFLCBFbWFpbC5UWVBFX0hPTUUpCi0gICAgICAgICAgICAgICAgLnB1dChFbWFpbC5JU19QUklNQVJZLCAxKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhFbWFpbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KEVtYWlsLkRBVEEsICJ0eXBlX25vdHlwZUBleGFtcGxlLmNvbSIpCi0gICAgICAgICAgICAgICAgLnB1dChFbWFpbC5JU19QUklNQVJZLCAxKTsKLQotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbVdpdGhFbXB0eU5hbWUoKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkVNQUlMIiwgInR5cGVfbm90eXBlQGV4YW1wbGUuY29tIiwgbmV3IFR5cGVTZXQoIlBSRUYiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJFTUFJTCIsICJ0eXBlX2hvbWVAZXhhbXBsZS5jb20iLCBuZXcgVHlwZVNldCgiSE9NRSIsICJQUkVGIikpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFbWFpbFByZWZIYW5kbGluZ1YyMSgpIHsKLSAgICAgICAgdGVzdEVtYWlsUHJlZkhhbmRsaW5nQ29tbW9uKFYyMSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEVtYWlsUHJlZkhhbmRsaW5nVjMwKCkgewotICAgICAgICB0ZXN0RW1haWxQcmVmSGFuZGxpbmdDb21tb24oVjMwKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGVzdFBvc3RhbEFkZHJlc3NDb21tb24oaW50IHZjYXJkVHlwZSkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QodmNhcmRUeXBlKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWRQb3N0YWwuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlBPQk9YLCAiUG9ib3giKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5ORUlHSEJPUkhPT0QsICJOZWlnaGJvcmhvb2QiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5TVFJFRVQsICJTdHJlZXQiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5DSVRZLCAiQ2l0eSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlJFR0lPTiwgIlJlZ2lvbiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlBPU1RDT0RFLCAiMTAwIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuQ09VTlRSWSwgIkNvdW50cnkiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5GT1JNQVRURURfQUREUkVTUywgIkZvcm1hdHRlZCBBZGRyZXNzIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuVFlQRSwgU3RydWN0dXJlZFBvc3RhbC5UWVBFX1dPUkspOwotICAgICAgICAvLyBhZHItdmFsdWUgICAgPSAwKjYodGV4dC12YWx1ZSAiOyIpIHRleHQtdmFsdWUKLSAgICAgICAgLy8gICAgICAgICAgICAgIDsgUE8gQm94LCBFeHRlbmRlZCBBZGRyZXNzLCBTdHJlZXQsIExvY2FsaXR5LCBSZWdpb24sIFBvc3RhbCBDb2RlLAotICAgICAgICAvLyAgICAgICAgICAgICAgOyBDb3VudHJ5IE5hbWUKLSAgICAgICAgLy8KLSAgICAgICAgLy8gVGhlIE5FSUdIQk9SSE9PRCBmaWVsZCBpcyBhcHBlbmRlZCBhZnRlciB0aGUgQ0lUWSBmaWVsZC4KLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1XaXRoRW1wdHlOYW1lKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJBRFIiLAotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgiUG9ib3giLCAiIiwgIlN0cmVldCIsICJDaXR5IE5laWdoYm9yaG9vZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZWdpb24iLCAiMTAwIiwgIkNvdW50cnkiKSwgbmV3IFR5cGVTZXQoIldPUksiKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBvc3RhbEFkZHJlc3NWMjEoKSB7Ci0gICAgICAgIHRlc3RQb3N0YWxBZGRyZXNzQ29tbW9uKFYyMSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBvc3RhbEFkZHJlc3NWMzAoKSB7Ci0gICAgICAgIHRlc3RQb3N0YWxBZGRyZXNzQ29tbW9uKFYzMCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RQb3N0YWxBZGRyZXNzTm9uTmVpZ2hib3Job29kKGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KHZjYXJkVHlwZSk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkUG9zdGFsLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5DSVRZLCAiQ2l0eSIpOwotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbVdpdGhFbXB0eU5hbWUoKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkFEUiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KCIiLCAiIiwgIiIsICJDaXR5IiwgIiIsICIiLCAiIiksIG5ldyBUeXBlU2V0KCJIT01FIikpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQb3N0YWxBZGRyZXNzTm9uTmVpZ2hib3Job29kVjIxKCkgewotICAgICAgICB0ZXN0UG9zdGFsQWRkcmVzc05vbk5laWdoYm9yaG9vZChWMjEpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQb3N0YWxBZGRyZXNzTm9uTmVpZ2hib3Job29kVjMwKCkgewotICAgICAgICB0ZXN0UG9zdGFsQWRkcmVzc05vbk5laWdoYm9yaG9vZChWMzApOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0ZXN0UG9zdGFsQWRkcmVzc05vbkNpdHkoaW50IHZjYXJkVHlwZSkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QodmNhcmRUeXBlKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWRQb3N0YWwuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLk5FSUdIQk9SSE9PRCwgIk5laWdoYm9yaG9vZCIpOwotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbVdpdGhFbXB0eU5hbWUoKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkFEUiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KCIiLCAiIiwgIiIsICJOZWlnaGJvcmhvb2QiLCAiIiwgIiIsICIiKSwgbmV3IFR5cGVTZXQoIkhPTUUiKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBvc3RhbEFkZHJlc3NOb25DaXR5VjIxKCkgewotICAgICAgICB0ZXN0UG9zdGFsQWRkcmVzc05vbkNpdHkoVjIxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zdGFsQWRkcmVzc05vbkNpdHlWMzAoKSB7Ci0gICAgICAgIHRlc3RQb3N0YWxBZGRyZXNzTm9uQ2l0eShWMzApOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0ZXN0UG9zdGFsT25seVdpdGhGb3JtYXR0ZWRBZGRyZXNzQ29tbW9uKGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KHZjYXJkVHlwZSk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkUG9zdGFsLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5SRUdJT04sICIiKSAgLy8gTXVzdCBiZSBpZ25vcmVkLgotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5GT1JNQVRURURfQUREUkVTUywKLSAgICAgICAgICAgICAgICAiRm9ybWF0dGVkIGFkZHJlc3MgQ0EgMTIzLTMzNCBVbml0ZWQgU3RhdHVlIik7Ci0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtV2l0aEVtcHR5TmFtZSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiQURSIiwgIjtGb3JtYXR0ZWQgYWRkcmVzcyBDQSAxMjMtMzM0IFVuaXRlZCBTdGF0dWU7Ozs7OyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KCIiLCAiRm9ybWF0dGVkIGFkZHJlc3MgQ0EgMTIzLTMzNCBVbml0ZWQgU3RhdHVlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIsICIiLCAiIiwgIiIsICIiKSwgbmV3IFR5cGVTZXQoIkhPTUUiKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBvc3RhbE9ubHlXaXRoRm9ybWF0dGVkQWRkcmVzc1YyMSgpIHsKLSAgICAgICAgdGVzdFBvc3RhbE9ubHlXaXRoRm9ybWF0dGVkQWRkcmVzc0NvbW1vbihWMjEpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQb3N0YWxPbmx5V2l0aEZvcm1hdHRlZEFkZHJlc3NWMzAoKSB7Ci0gICAgICAgIHRlc3RQb3N0YWxPbmx5V2l0aEZvcm1hdHRlZEFkZHJlc3NDb21tb24oVjMwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyB0aGF0IHRoZSB2Q2FyZCBjb21wb3NlciBob25vcnMgZm9ybWF0dGVkIGRhdGEgd2hlbiBpdCBpcyBhdmFpbGFibGUKLSAgICAgKiBldmVuIHdoZW4gaXQgaXMgcGFydGlhbC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgdGVzdFBvc3RhbFdpdGhCb3RoU3RydWN0dXJlZEFuZEZvcm1hdHRlZENvbW1vbihpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdCh2Y2FyZFR5cGUpOwotICAgICAgICBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpLmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZFBvc3RhbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuUE9CT1gsICJQb2JveCIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLkNPVU5UUlksICJDb3VudHJ5IikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuRk9STUFUVEVEX0FERFJFU1MsCi0gICAgICAgICAgICAgICAgICAgICAgICAiRm9ybWF0dGVkIGFkZHJlc3MgQ0EgMTIzLTMzNCBVbml0ZWQgU3RhdHVlIik7ICAvLyBTaG91bGQgYmUgaWdub3JlZAotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbVdpdGhFbXB0eU5hbWUoKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkFEUiIsICJQb2JveDs7Ozs7O0NvdW50cnkiLAotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgiUG9ib3giLCAiIiwgIiIsICIiLCAiIiwgIiIsICJDb3VudHJ5IiksCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgVHlwZVNldCgiSE9NRSIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zdGFsV2l0aEJvdGhTdHJ1Y3R1cmVkQW5kRm9ybWF0dGVkVjIxKCkgewotICAgICAgICB0ZXN0UG9zdGFsV2l0aEJvdGhTdHJ1Y3R1cmVkQW5kRm9ybWF0dGVkQ29tbW9uKFYyMSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBvc3RhbFdpdGhCb3RoU3RydWN0dXJlZEFuZEZvcm1hdHRlZFYzMCgpIHsKLSAgICAgICAgdGVzdFBvc3RhbFdpdGhCb3RoU3RydWN0dXJlZEFuZEZvcm1hdHRlZENvbW1vbihWMzApOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0ZXN0T3JnYW5pemF0aW9uQ29tbW9uKGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KHZjYXJkVHlwZSk7Ci0gICAgICAgIENvbnRhY3RFbnRyeSBlbnRyeSA9IG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoT3JnYW5pemF0aW9uLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoT3JnYW5pemF0aW9uLkNPTVBBTlksICJDb21wYW55WCIpCi0gICAgICAgICAgICAgICAgLnB1dChPcmdhbml6YXRpb24uREVQQVJUTUVOVCwgIkRlcGFydG1lbnRZIikKLSAgICAgICAgICAgICAgICAucHV0KE9yZ2FuaXphdGlvbi5USVRMRSwgIlRpdGxlWiIpCi0gICAgICAgICAgICAgICAgLnB1dChPcmdhbml6YXRpb24uSk9CX0RFU0NSSVBUSU9OLCAiRGVzY3JpcHRpb24gUmFtYmRhIikgIC8vIElnbm9yZWQuCi0gICAgICAgICAgICAgICAgLnB1dChPcmdhbml6YXRpb24uT0ZGSUNFX0xPQ0FUSU9OLCAiTW91bnRhaW4gVmlldyIpICAvLyBJZ25vcmVkLgotICAgICAgICAgICAgICAgIC5wdXQoT3JnYW5pemF0aW9uLlBIT05FVElDX05BTUUsICJQaG9uZXRpY05hbWUhIikgIC8vIElnbm9yZWQKLSAgICAgICAgICAgICAgICAucHV0KE9yZ2FuaXphdGlvbi5TWU1CT0wsICIoXm9eKS9+fiIpOyAgLy8gSWdub3JlIGhpbSAoaGVyKS4KLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhPcmdhbml6YXRpb24uQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dE51bGwoT3JnYW5pemF0aW9uLkNPTVBBTlkpCi0gICAgICAgICAgICAgICAgLnB1dChPcmdhbml6YXRpb24uREVQQVJUTUVOVCwgIkRlcGFydG1lbnRYWCIpCi0gICAgICAgICAgICAgICAgLnB1dE51bGwoT3JnYW5pemF0aW9uLlRJVExFKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhPcmdhbml6YXRpb24uQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChPcmdhbml6YXRpb24uQ09NUEFOWSwgIkNvbXBhbnlYWVoiKQotICAgICAgICAgICAgICAgIC5wdXROdWxsKE9yZ2FuaXphdGlvbi5ERVBBUlRNRU5UKQotICAgICAgICAgICAgICAgIC5wdXQoT3JnYW5pemF0aW9uLlRJVExFLCAiVGl0bGVYWVpZWCIpOwotICAgICAgICAvLyBDdXJyZW50bHkgd2UgZG8gbm90IHVzZSBncm91cCBidXQgZGVwZW5kIG9uIHRoZSBvcmRlci4KLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1XaXRoRW1wdHlOYW1lKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJPUkciLCAiQ29tcGFueVg7RGVwYXJ0bWVudFkiLAotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgiQ29tcGFueVgiLCAiRGVwYXJ0bWVudFkiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJUSVRMRSIsICJUaXRsZVoiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIk9SRyIsICJEZXBhcnRtZW50WFgiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIk9SRyIsICJDb21wYW55WFlaIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJUSVRMRSIsICJUaXRsZVhZWllYIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE9yZ2FuaXphdGlvblYyMSgpIHsKLSAgICAgICAgdGVzdE9yZ2FuaXphdGlvbkNvbW1vbihWMjEpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RPcmdhbml6YXRpb25WMzAoKSB7Ci0gICAgICAgIHRlc3RPcmdhbml6YXRpb25Db21tb24oVjMwKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGVzdEltVmFyaW91c1R5cGVTdXBwb3J0Q29tbW9uKGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KHZjYXJkVHlwZSk7Ci0gICAgICAgIENvbnRhY3RFbnRyeSBlbnRyeSA9IG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoSW0uQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChJbS5QUk9UT0NPTCwgSW0uUFJPVE9DT0xfQUlNKQotICAgICAgICAgICAgICAgIC5wdXQoSW0uREFUQSwgImFpbSIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKEltLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoSW0uUFJPVE9DT0wsIEltLlBST1RPQ09MX01TTikKLSAgICAgICAgICAgICAgICAucHV0KEltLkRBVEEsICJtc24iKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhJbS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KEltLlBST1RPQ09MLCBJbS5QUk9UT0NPTF9ZQUhPTykKLSAgICAgICAgICAgICAgICAucHV0KEltLkRBVEEsICJ5YWhvbyIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKEltLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoSW0uUFJPVE9DT0wsIEltLlBST1RPQ09MX1NLWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoSW0uREFUQSwgInNreXBlIik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoSW0uQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChJbS5QUk9UT0NPTCwgSW0uUFJPVE9DT0xfUVEpCi0gICAgICAgICAgICAgICAgLnB1dChJbS5EQVRBLCAicXEiKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhJbS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KEltLlBST1RPQ09MLCBJbS5QUk9UT0NPTF9HT09HTEVfVEFMSykKLSAgICAgICAgICAgICAgICAucHV0KEltLkRBVEEsICJnb29nbGUgdGFsayIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKEltLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoSW0uUFJPVE9DT0wsIEltLlBST1RPQ09MX0lDUSkKLSAgICAgICAgICAgICAgICAucHV0KEltLkRBVEEsICJpY3EiKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhJbS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KEltLlBST1RPQ09MLCBJbS5QUk9UT0NPTF9KQUJCRVIpCi0gICAgICAgICAgICAgICAgLnB1dChJbS5EQVRBLCAiamFiYmVyIik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoSW0uQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChJbS5QUk9UT0NPTCwgSW0uUFJPVE9DT0xfTkVUTUVFVElORykKLSAgICAgICAgICAgICAgICAucHV0KEltLkRBVEEsICJuZXRtZWV0aW5nIik7Ci0KLSAgICAgICAgLy8gTm8gZGV0ZXJtaW5lZCB3YXkgdG8gZXhwcmVzcyB1bmtub3duIHR5cGUuLi4KLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1XaXRoRW1wdHlOYW1lKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLUpBQkJFUiIsICJqYWJiZXIiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtSUNRIiwgImljcSIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1HT09HTEUtVEFMSyIsICJnb29nbGUgdGFsayIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1RUSIsICJxcSIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1TS1lQRS1VU0VSTkFNRSIsICJza3lwZSIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1ZQUhPTyIsICJ5YWhvbyIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1NU04iLCAibXNuIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLU5FVE1FRVRJTkciLCAibmV0bWVldGluZyIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1BSU0iLCAiYWltIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEltQmFzaVYyMSgpIHsKLSAgICAgICAgdGVzdEltVmFyaW91c1R5cGVTdXBwb3J0Q29tbW9uKFYyMSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEltQmFzaWNWMzAoKSB7Ci0gICAgICAgIHRlc3RJbVZhcmlvdXNUeXBlU3VwcG9ydENvbW1vbihWMzApOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0ZXN0SW1QcmVmSGFuZGxpbmdDb21tb24oaW50IHZjYXJkVHlwZSkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QodmNhcmRUeXBlKTsKLSAgICAgICAgQ29udGFjdEVudHJ5IGVudHJ5ID0gbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhJbS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KEltLlBST1RPQ09MLCBJbS5QUk9UT0NPTF9BSU0pCi0gICAgICAgICAgICAgICAgLnB1dChJbS5EQVRBLCAiYWltMSIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKEltLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoSW0uUFJPVE9DT0wsIEltLlBST1RPQ09MX0FJTSkKLSAgICAgICAgICAgICAgICAucHV0KEltLkRBVEEsICJhaW0yIikKLSAgICAgICAgICAgICAgICAucHV0KEltLlRZUEUsIEltLlRZUEVfSE9NRSkKLSAgICAgICAgICAgICAgICAucHV0KEltLklTX1BSSU1BUlksIDEpOwotCi0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtV2l0aEVtcHR5TmFtZSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1BSU0iLCAiYWltMSIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1BSU0iLCAiYWltMiIsIG5ldyBUeXBlU2V0KCJIT01FIiwgIlBSRUYiKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEltUHJlZkhhbmRsaW5nVjIxKCkgewotICAgICAgICB0ZXN0SW1QcmVmSGFuZGxpbmdDb21tb24oVjIxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW1QcmVmSGFuZGxpbmdWMzAoKSB7Ci0gICAgICAgIHRlc3RJbVByZWZIYW5kbGluZ0NvbW1vbihWMzApOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0ZXN0V2Vic2l0ZUNvbW1vbihpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdCh2Y2FyZFR5cGUpOwotICAgICAgICBDb250YWN0RW50cnkgZW50cnkgPSBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFdlYnNpdGUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChXZWJzaXRlLlVSTCwgImh0dHA6Ly93ZWJzaXRlLmV4YW1wbGUuYW5kcm9pZC5jb20vaW5kZXguaHRtbCIpCi0gICAgICAgICAgICAgICAgLnB1dChXZWJzaXRlLlRZUEUsIFdlYnNpdGUuVFlQRV9CTE9HKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhXZWJzaXRlLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoV2Vic2l0ZS5VUkwsICJmdHA6Ly9mdHAuZXhhbXBsZS5hbmRyb2lkLmNvbS9pbmRleC5odG1sIikKLSAgICAgICAgICAgICAgICAucHV0KFdlYnNpdGUuVFlQRSwgV2Vic2l0ZS5UWVBFX0ZUUCk7Ci0KLSAgICAgICAgLy8gV2UgZHJvcCBUWVBFIGluZm9ybWF0aW9uIHNpbmNlIHZDYXJkIChlc3BlY2lhbGx5IDMuMCkgZG9lcyBub3QgYWxsb3cgdXMgdG8gZW1pdCBpdC4KLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1XaXRoRW1wdHlOYW1lKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJVUkwiLCAiZnRwOi8vZnRwLmV4YW1wbGUuYW5kcm9pZC5jb20vaW5kZXguaHRtbCIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVVJMIiwgImh0dHA6Ly93ZWJzaXRlLmV4YW1wbGUuYW5kcm9pZC5jb20vaW5kZXguaHRtbCIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RXZWJzaXRlVjIxKCkgewotICAgICAgICB0ZXN0V2Vic2l0ZUNvbW1vbihWMjEpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RXZWJzaXRlVjMwKCkgewotICAgICAgICB0ZXN0V2Vic2l0ZUNvbW1vbihWMzApOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldEFuZHJvaWRQcm9wVmFsdWUoZmluYWwgU3RyaW5nIG1pbWVUeXBlLCBTdHJpbmcgdmFsdWUsIEludGVnZXIgdHlwZSkgewotICAgICAgICByZXR1cm4gZ2V0QW5kcm9pZFByb3BWYWx1ZShtaW1lVHlwZSwgdmFsdWUsIHR5cGUsIG51bGwpOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldEFuZHJvaWRQcm9wVmFsdWUoZmluYWwgU3RyaW5nIG1pbWVUeXBlLCBTdHJpbmcgdmFsdWUsCi0gICAgICAgICAgICBJbnRlZ2VyIHR5cGUsIFN0cmluZyBsYWJlbCkgewotICAgICAgICByZXR1cm4gKG1pbWVUeXBlICsgIjsiICsgdmFsdWUgKyAiOyIKLSAgICAgICAgICAgICAgICArICh0eXBlICE9IG51bGwgPyB0eXBlIDogIiIpICsgIjsiCi0gICAgICAgICAgICAgICAgKyAobGFiZWwgIT0gbnVsbCA/IGxhYmVsIDogIiIpICsgIjs7Ozs7Ozs7Ozs7OyIpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0ZXN0RXZlbnRDb21tb24oaW50IHZjYXJkVHlwZSkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QodmNhcmRUeXBlKTsKLSAgICAgICAgQ29udGFjdEVudHJ5IGVudHJ5ID0gbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhFdmVudC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KEV2ZW50LlRZUEUsIEV2ZW50LlRZUEVfQU5OSVZFUlNBUlkpCi0gICAgICAgICAgICAgICAgLnB1dChFdmVudC5TVEFSVF9EQVRFLCAiMTk4Mi0wNi0xNiIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKEV2ZW50LkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoRXZlbnQuVFlQRSwgRXZlbnQuVFlQRV9CSVJUSERBWSkKLSAgICAgICAgICAgICAgICAucHV0KEV2ZW50LlNUQVJUX0RBVEUsICIyMDA4LTEwLTIyIik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoRXZlbnQuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChFdmVudC5UWVBFLCBFdmVudC5UWVBFX09USEVSKQotICAgICAgICAgICAgICAgIC5wdXQoRXZlbnQuU1RBUlRfREFURSwgIjIwMTgtMDMtMTIiKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhFdmVudC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KEV2ZW50LlRZUEUsIEV2ZW50LlRZUEVfQ1VTVE9NKQotICAgICAgICAgICAgICAgIC5wdXQoRXZlbnQuTEFCRUwsICJUaGUgbGFzdCBkYXkiKQotICAgICAgICAgICAgICAgIC5wdXQoRXZlbnQuU1RBUlRfREFURSwgIldoZW4gdGhlIFRvd2VyIG9mIEhhbm9pIHdpdGggNjQgcmluZ3MgaXMgY29tcGxldGVkLiIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKEV2ZW50LkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoRXZlbnQuVFlQRSwgRXZlbnQuVFlQRV9CSVJUSERBWSkKLSAgICAgICAgICAgICAgICAucHV0KEV2ZW50LlNUQVJUX0RBVEUsICIyMDA5LTA1LTE5Iik7ICAvLyBTaG91bGQgYmUgaWdub3JlZC4KLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1XaXRoRW1wdHlOYW1lKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJCREFZIiwgIjIwMDgtMTAtMjIiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtQU5EUk9JRC1DVVNUT00iLAotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0QW5kcm9pZFByb3BWYWx1ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnQuQ09OVEVOVF9JVEVNX1RZUEUsICIxOTgyLTA2LTE2IiwgRXZlbnQuVFlQRV9BTk5JVkVSU0FSWSkpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1BTkRST0lELUNVU1RPTSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBnZXRBbmRyb2lkUHJvcFZhbHVlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFdmVudC5DT05URU5UX0lURU1fVFlQRSwgIjIwMTgtMDMtMTIiLCBFdmVudC5UWVBFX09USEVSKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLUFORFJPSUQtQ1VTVE9NIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldEFuZHJvaWRQcm9wVmFsdWUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50LkNPTlRFTlRfSVRFTV9UWVBFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiV2hlbiB0aGUgVG93ZXIgb2YgSGFub2kgd2l0aCA2NCByaW5ncyBpcyBjb21wbGV0ZWQuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnQuVFlQRV9DVVNUT00sICJUaGUgbGFzdCBkYXkiKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEV2ZW50VjIxKCkgewotICAgICAgICB0ZXN0RXZlbnRDb21tb24oVjIxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RXZlbnRWMzAoKSB7Ci0gICAgICAgIHRlc3RFdmVudENvbW1vbihWMzApOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0ZXN0Tm90ZUNvbW1vbihpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdCh2Y2FyZFR5cGUpOwotICAgICAgICBDb250YWN0RW50cnkgZW50cnkgPSBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKE5vdGUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChOb3RlLk5PVEUsICJub3RlMSIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKE5vdGUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChOb3RlLk5PVEUsICJub3RlMiIpCi0gICAgICAgICAgICAgICAgLnB1dChOb3RlLklTX1BSSU1BUlksIDEpOyAgLy8gSnVzdCBpZ25vcmVkLgotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbVdpdGhFbXB0eU5hbWUoKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIk5PVEUiLCAibm90ZTEiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIk5PVEUiLCAibm90ZTIiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Tm90ZVYyMSgpIHsKLSAgICAgICAgdGVzdE5vdGVDb21tb24oVjIxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Tm90ZVYzMCgpIHsKLSAgICAgICAgdGVzdE5vdGVDb21tb24oVjMwKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGVzdFBob3RvQ29tbW9uKGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgZmluYWwgYm9vbGVhbiBpc1YzMCA9IHZjYXJkVHlwZSA9PSBWMzA7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdCh2Y2FyZFR5cGUpOwotICAgICAgICBDb250YWN0RW50cnkgZW50cnkgPSBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRkFNSUxZX05BTUUsICJQaG90b1Rlc3QiKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhQaG90by5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob3RvLlBIT1RPLCBzUGhvdG9CeXRlQXJyYXkpOwotCi0gICAgICAgIENvbnRlbnRWYWx1ZXMgY29udGVudFZhbHVlc0ZvclBob3RvID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKLSAgICAgICAgY29udGVudFZhbHVlc0ZvclBob3RvLnB1dCgiRU5DT0RJTkciLCAoaXNWMzAgPyAiYiIgOiAiQkFTRTY0IikpOwotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiRk4iLCAiUGhvdG9UZXN0IikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJOIiwgIlBob3RvVGVzdDs7OzsiLAotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgiUGhvdG9UZXN0IiwgIiIsICIiLCAiIiwgIiIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIlBIT1RPIiwgbnVsbCwgbnVsbCwgc1Bob3RvQnl0ZUFycmF5LAotICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFZhbHVlc0ZvclBob3RvLCBuZXcgVHlwZVNldCgiSlBFRyIpLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGhvdG9WMjEoKSB7Ci0gICAgICAgIHRlc3RQaG90b0NvbW1vbihWMjEpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQaG90b1YzMCgpIHsKLSAgICAgICAgdGVzdFBob3RvQ29tbW9uKFYzMCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RSZWxhdGlvbkNvbW1vbihpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdCh2Y2FyZFR5cGUpOwotICAgICAgICBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpLmFkZENvbnRlbnRWYWx1ZXMoUmVsYXRpb24uQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChSZWxhdGlvbi5UWVBFLCBSZWxhdGlvbi5UWVBFX01PVEhFUikKLSAgICAgICAgICAgICAgICAucHV0KFJlbGF0aW9uLk5BTUUsICJNcy4gTW90aGVyIik7Ci0gICAgICAgIG1WZXJpZmllci5hZGRDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtKCkuYWRkRXhwZWN0ZWQoUmVsYXRpb24uQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChSZWxhdGlvbi5UWVBFLCBSZWxhdGlvbi5UWVBFX01PVEhFUikKLSAgICAgICAgICAgICAgICAucHV0KFJlbGF0aW9uLk5BTUUsICJNcy4gTW90aGVyIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFJlbGF0aW9uVjIxKCkgewotICAgICAgICB0ZXN0UmVsYXRpb25Db21tb24oVjIxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVsYXRpb25WMzAoKSB7Ci0gICAgICAgIHRlc3RSZWxhdGlvbkNvbW1vbihWMzApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RWMzBIYW5kbGVFc2NhcGUoKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdChWMzApOwotICAgICAgICBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpLmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgIlxcIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkdJVkVOX05BTUUsICI7IikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLk1JRERMRV9OQU1FLCAiLCIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QUkVGSVgsICJcbiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5ESVNQTEFZX05BTUUsICJbPHtVbmVzY2FwZWQ6QXNjaWlzfT5dIik7Ci0gICAgICAgIC8vIFZlcmlmaWVzIHRoZSB2Q2FyZCBTdHJpbmcgY29ycmVjdGx5IGVzY2FwZXMgZWFjaCBjaGFyYWN0ZXIgd2hpY2ggbXVzdCBiZSBlc2NhcGVkLgotICAgICAgICBtVmVyaWZpZXIuYWRkTGluZVZlcmlmaWVyRWxlbSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkKCJOOlxcXFw7XFw7O1xcLDtcXG47IikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWQoIkZOOls8e1VuZXNjYXBlZDpBc2NpaXN9Pl0iKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0oKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkZOIiwgIls8e1VuZXNjYXBlZDpBc2NpaXN9Pl0iKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIk4iLCBBcnJheXMuYXNMaXN0KCJcXCIsICI7IiwgIiwiLCAiXG4iLCAiIikpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZXJlJ3Mgbm8gIk5JQ0tOQU1FIiBwcm9wZXJ0eSBpbiB2Q2FyZCAyLjEsIHdoaWxlIHRoZXJlIGlzIGluIHZDYXJkIDMuMC4KLSAgICAgKiBXZSB1c2UgQW5kcm9pZC1zcGVjaWZpYyAiWC1BTkRST0lELUNVU1RPTSIgcHJvcGVydHkuCi0gICAgICogVGhpcyB0ZXN0IHZlcmlmaWVzIHRoZSBmdW5jdGlvbmFsaXR5LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3ROaWNrTmFtZVYyMSgpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KFYyMSk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCkuYWRkQ29udGVudFZhbHVlcyhOaWNrbmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KE5pY2tuYW1lLk5BTUUsICJOaWNreSIpOwotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbVdpdGhFbXB0eU5hbWUoKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtQU5EUk9JRC1DVVNUT00iLAotICAgICAgICAgICAgICAgICAgICAgICAgTmlja25hbWUuQ09OVEVOVF9JVEVNX1RZUEUgKyAiO05pY2t5Ozs7Ozs7Ozs7Ozs7OzsiKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0oKS5hZGRFeHBlY3RlZChOaWNrbmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KE5pY2tuYW1lLk5BTUUsICJOaWNreSIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RUb2xlcmF0ZUJyb2tlblBob25lTnVtYmVyRW50cnlWMjEoKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdChWMjEpOwotICAgICAgICBDb250YWN0RW50cnkgZW50cnkgPSBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9IT01FKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMTExLTIyMi0zMzMzIChNaWFtaSlcbjQ0NC01NTU1LTY2NiAoVG9reW8pOyIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIjc3Ny04ODgtOTk5OSAoQ2hpY2Fnbyk7MTExLTIyMi0zMzMzIChNaWFtaSkiKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1XaXRoRW1wdHlOYW1lKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiMTExLTIyMi0zMzMzIiwgbmV3IFR5cGVTZXQoIkhPTUUiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiNDQ0LTU1NS01NjY2IiwgbmV3IFR5cGVTZXQoIkhPTUUiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiNzc3LTg4OC05OTk5IiwgbmV3IFR5cGVTZXQoIkhPTUUiKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RQaWNrVXBOb25FbXB0eUNvbnRlbnRWYWx1ZXNDb21tb24oaW50IHZjYXJkVHlwZSkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QodmNhcmRUeXBlKTsKLSAgICAgICAgQ29udGFjdEVudHJ5IGVudHJ5ID0gbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLklTX1BSSU1BUlksIDEpOyAgLy8gRW1wdHkgbmFtZS4gU2hvdWxkIGJlIGlnbm9yZWQuCi0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgImZhbWlseTEiKTsgIC8vIE5vdCBwcmltYXJ5LiBTaG91bGQgYmUgaWdub3JlZC4KLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLklTX1BSSU1BUlksIDEpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgImZhbWlseTIiKTsgIC8vIFRoaXMgZW50cnkgaXMgd2hhdCB3ZSB3YW50LgotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuSVNfUFJJTUFSWSwgMSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkZBTUlMWV9OQU1FLCAiZmFtaWx5MyIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRkFNSUxZX05BTUUsICJmYW1pbHk0Iik7Ci0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJOIiwgQXJyYXlzLmFzTGlzdCgiZmFtaWx5MiIsICIiLCAiIiwgIiIsICIiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJGTiIsICJmYW1pbHkyIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBpY2tVcE5vbkVtcHR5Q29udGVudFZhbHVlc1YyMSgpIHsKLSAgICAgICAgdGVzdFBpY2tVcE5vbkVtcHR5Q29udGVudFZhbHVlc0NvbW1vbihWMjEpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQaWNrVXBOb25FbXB0eUNvbnRlbnRWYWx1ZXNWMzAoKSB7Ci0gICAgICAgIHRlc3RQaWNrVXBOb25FbXB0eUNvbnRlbnRWYWx1ZXNDb21tb24oVjMwKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRJbXBvcnRlclRlc3RzLmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRJbXBvcnRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwZTFmODcuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkSW1wb3J0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQ7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlczsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5WQ2FyZENvbmZpZzsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuRGF0YTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLkVtYWlsOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuRXZlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5Ob3RlOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuT3JnYW5pemF0aW9uOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuUGhvbmU7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5QaG90bzsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLlN0cnVjdHVyZWROYW1lOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuU3RydWN0dXJlZFBvc3RhbDsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLldlYnNpdGU7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5mcmFtZXdvcmtzLmNvcmV0ZXN0cy5SOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLlByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0uVHlwZVNldDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLXB1YmxpYyBjbGFzcyBWQ2FyZEltcG9ydGVyVGVzdHMgZXh0ZW5kcyBWQ2FyZFRlc3RzQmFzZSB7Ci0gICAgLy8gUHVzaCBkYXRhIGludG8gaW50IGFycmF5IGF0IGZpcnN0IHNpbmNlIHZhbHVlcyBsaWtlIDB4ODAgYXJlCi0gICAgLy8gaW50ZXJwcmV0ZWQgYXMgaW50IGJ5IHRoZSBjb21waWxlciBhbmQgY2FzdGluZyBhbGwgb2YgdGhlbSBpcwotICAgIC8vIGN1bWJlcnNvbWUuLi4KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXSBzUGhvdG9JbnRBcnJheUZvckNvbXBsaWNhdGVkQ2FzZSA9IHsKLSAgICAgICAgMHhmZiwgMHhkOCwgMHhmZiwgMHhlMSwgMHgwYSwgMHgwZiwgMHg0NSwgMHg3OCwgMHg2OSwgMHg2NiwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHg0ZCwgMHg0ZCwgMHgwMCwgMHgyYSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwMCwgMHgwZCwKLSAgICAgICAgMHgwMSwgMHgwZSwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwZiwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHhhYSwgMHgwMSwgMHgwZiwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNywgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHhiYSwgMHgwMSwgMHgxMCwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNiwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHhjMiwgMHgwMSwgMHgxMiwgMHgwMCwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwKLSAgICAgICAgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMSwgMHgxYSwgMHgwMCwgMHgwNSwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHhjOCwgMHgwMSwgMHgxYiwgMHgwMCwgMHgwNSwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHhkMCwgMHgwMSwgMHgyOCwgMHgwMCwgMHgwMywgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMSwgMHgzMSwgMHgwMCwgMHgwMiwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwZSwgMHgwMCwgMHgwMCwgMHgwMCwgMHhkOCwgMHgwMSwgMHgzMiwgMHgwMCwKLSAgICAgICAgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhlNiwgMHgwMiwgMHgxMywKLSAgICAgICAgMHgwMCwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHg4MiwKLSAgICAgICAgMHg5OCwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwZSwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmYSwKLSAgICAgICAgMHg4NywgMHg2OSwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMSwKLSAgICAgICAgMHg4NCwgMHhjNCwgMHhhNSwgMHgwMCwgMHgwNywgMHgwMCwgMHgwMCwgMHgwMCwgMHg3YywgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMSwgMHgwOCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgxZSwgMHgzMiwgMHgzMCwgMHgzMCwgMHgzOCwgMHgzMSwKLSAgICAgICAgMHgzMCwgMHgzMiwgMHgzOSwgMHgzMSwgMHgzMywgMHgzNSwgMHgzNSwgMHgzMywgMHgzMSwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHg0NCwgMHg2ZiwgMHg0MywgMHg2ZiwgMHg0ZCwgMHg2ZiwgMHgwMCwgMHgwMCwgMHg0NCwgMHgzOSwgMHgzMCwKLSAgICAgICAgMHgzNSwgMHg2OSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg0OCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHg0OCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg0NCwgMHgzOSwgMHgzMCwKLSAgICAgICAgMHgzNSwgMHg2OSwgMHgyMCwgMHg1NiwgMHg2NSwgMHg3MiwgMHgzMSwgMHgyZSwgMHgzMCwgMHgzMCwgMHgwMCwKLSAgICAgICAgMHgzMiwgMHgzMCwgMHgzMCwgMHgzOCwgMHgzYSwgMHgzMSwgMHgzMCwgMHgzYSwgMHgzMiwgMHgzOSwgMHgyMCwKLSAgICAgICAgMHgzMSwgMHgzMywgMHgzYSwgMHgzNSwgMHgzNSwgMHgzYSwgMHgzNCwgMHgzNywgMHgwMCwgMHgyMCwgMHgyMCwKLSAgICAgICAgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwKLSAgICAgICAgMHgwMCwgMHg1MCwgMHg3MiwgMHg2OSwgMHg2ZSwgMHg3NCwgMHg0OSwgMHg0ZCwgMHgwMCwgMHgzMCwgMHgzMywKLSAgICAgICAgMHgzMCwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNiwgMHgwMCwgMHgwMSwgMHgwMCwgMHgxNCwgMHgwMCwKLSAgICAgICAgMHgxNCwgMHgwMCwgMHgwMiwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMywgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgzNCwgMHgwMSwgMHgwMCwgMHgwNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMSwgMHgwMSwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgxMCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgxMSwgMHgwOSwgMHgwMCwgMHgwMCwgMHgyNywgMHgxMCwgMHgwMCwgMHgwMCwgMHgwZiwgMHgwYiwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgyNywgMHgxMCwgMHgwMCwgMHgwMCwgMHgwNSwgMHg5NywgMHgwMCwgMHgwMCwgMHgyNywgMHgxMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwOCwgMHhiMCwgMHgwMCwgMHgwMCwgMHgyNywgMHgxMCwgMHgwMCwgMHgwMCwgMHgxYywKLSAgICAgICAgMHgwMSwgMHgwMCwgMHgwMCwgMHgyNywgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMiwgMHg1ZSwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgyNywgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4YiwgMHgwMCwgMHgwMCwgMHgyNywgMHgxMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMywgMHhjYiwgMHgwMCwgMHgwMCwgMHgyNywgMHgxMCwgMHgwMCwgMHgwMCwgMHgxYiwgMHhlNSwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgyNywgMHgxMCwgMHgwMCwgMHgyOCwgMHg4MiwgMHg5YSwgMHgwMCwgMHgwNSwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMywgMHg2YSwgMHg4MiwgMHg5ZCwgMHgwMCwgMHgwNSwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMywgMHg3MiwgMHg4OCwgMHgyMiwgMHgwMCwKLSAgICAgICAgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMCwgMHg5MCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgzMCwgMHgzMiwgMHgzMiwgMHgzMCwgMHg5MCwKLSAgICAgICAgMHgwMywgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxNCwgMHgwMCwgMHgwMCwgMHgwMywgMHg3YSwKLSAgICAgICAgMHg5MCwgMHgwNCwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxNCwgMHgwMCwgMHgwMCwgMHgwMywKLSAgICAgICAgMHg4ZSwgMHg5MSwgMHgwMSwgMHgwMCwgMHgwNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMSwgMHgwMiwKLSAgICAgICAgMHgwMywgMHgwMCwgMHg5MSwgMHgwMiwgMHgwMCwgMHgwNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMywgMHhhMiwgMHg5MiwgMHgwMSwgMHgwMCwgMHgwYSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMywgMHhhYSwgMHg5MiwgMHgwMiwgMHgwMCwgMHgwNSwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMywgMHhiMiwgMHg5MiwgMHgwNCwgMHgwMCwgMHgwYSwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMywgMHhiYSwgMHg5MiwgMHgwNSwgMHgwMCwgMHgwNSwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMywgMHhjMiwgMHg5MiwgMHgwNywgMHgwMCwgMHgwMywKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMCwgMHg5MiwgMHgwOCwgMHgwMCwKLSAgICAgICAgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MiwgMHgwOSwKLSAgICAgICAgMHgwMCwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MiwKLSAgICAgICAgMHgwYSwgMHgwMCwgMHgwNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMywgMHhjYSwKLSAgICAgICAgMHg5MiwgMHg3YywgMHgwMCwgMHgwNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHg5MiwgMHg4NiwgMHgwMCwgMHgwNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgxNiwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMywgMHhkMiwgMHhhMCwgMHgwMCwgMHgwMCwgMHgwNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgzMCwKLSAgICAgICAgMHgzMSwgMHgzMCwgMHgzMCwgMHhhMCwgMHgwMSwgMHgwMCwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwKLSAgICAgICAgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHhhMCwgMHgwMiwgMHgwMCwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMSwgMHgwMCwgMHg2MCwgMHgwMCwgMHgwMCwgMHhhMCwgMHgwMywgMHgwMCwgMHgwMywgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMSwgMHgwMCwgMHg0OCwgMHgwMCwgMHgwMCwgMHhhMCwgMHgwNSwgMHgwMCwgMHgwNCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHhhMiwgMHgwZSwgMHgwMCwgMHgwNSwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMywgMHhlOCwgMHhhMiwgMHgwZiwgMHgwMCwKLSAgICAgICAgMHgwNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMywgMHhmMCwgMHhhMiwgMHgxMCwKLSAgICAgICAgMHgwMCwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMCwgMHhhMiwKLSAgICAgICAgMHgxNywgMHgwMCwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHhhMywgMHgwMCwgMHgwMCwgMHgwNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMywgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHhhMywgMHgwMSwgMHgwMCwgMHgwNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMSwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHhhNCwgMHgwMSwgMHgwMCwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHhhNCwgMHgwMiwgMHgwMCwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhhNCwgMHgwMywgMHgwMCwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhhNCwgMHgwNCwgMHgwMCwgMHgwNSwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMywgMHhmOCwgMHhhNCwgMHgwNSwgMHgwMCwgMHgwMywgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgxZCwgMHgwMCwgMHgwMCwgMHhhNCwgMHgwNiwgMHgwMCwgMHgwMywKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhhNCwgMHgwNywgMHgwMCwKLSAgICAgICAgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhhNCwgMHgwOCwKLSAgICAgICAgMHgwMCwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhhNCwKLSAgICAgICAgMHgwOSwgMHgwMCwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHhhNCwgMHgwYSwgMHgwMCwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHhhNCwgMHgwYywgMHgwMCwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMiwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg1MywgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgyNywgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg1ZSwgMHgwMCwgMHgwMCwgMHgwMCwgMHg2NCwKLSAgICAgICAgMHgzMiwgMHgzMCwgMHgzMCwgMHgzOCwgMHgzYSwgMHgzMSwgMHgzMCwgMHgzYSwgMHgzMiwgMHgzOSwgMHgyMCwKLSAgICAgICAgMHgzMSwgMHgzMywgMHgzYSwgMHgzNSwgMHgzNSwgMHgzYSwgMHgzMywgMHgzMSwgMHgwMCwgMHgzMiwgMHgzMCwKLSAgICAgICAgMHgzMCwgMHgzOCwgMHgzYSwgMHgzMSwgMHgzMCwgMHgzYSwgMHgzMiwgMHgzOSwgMHgyMCwgMHgzMSwgMHgzMywKLSAgICAgICAgMHgzYSwgMHgzNSwgMHgzNSwgMHgzYSwgMHgzNCwgMHgzNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgyOSwgMHg4OCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgxYiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMiwgMHhiMiwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHg2NCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg1ZSwgMHgwMCwgMHgwMCwgMHgwMCwgMHg2NCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg2NCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgyNSwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwYSwgMHgwMCwgMHgwMCwgMHgwZSwgMHg5MiwgMHgwMCwgMHgwMCwgMHgwMywgMHhlOCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgzMiwgMHgzMCwgMHgzMCwKLSAgICAgICAgMHgzOCwgMHgzMSwgMHgzMCwgMHgzMiwgMHgzOSwgMHgzMSwgMHgzMywgMHgzNSwgMHgzNSwgMHgzMywgMHgzMSwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgyMCwgMHgyYSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwYSwgMHgwMCwgMHgwMCwgMHgyYSwKLSAgICAgICAgMHhlMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwYSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwNCwgMHg1MiwgMHgzOSwgMHgzOCwgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwNywgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwNCwgMHgzMCwgMHgzMSwgMHgzMCwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwNiwgMHgwMSwgMHgwMywgMHgwMCwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwNiwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMSwgMHgxYSwgMHgwMCwgMHgwNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwNCwgMHg2YywgMHgwMSwgMHgxYiwgMHgwMCwgMHgwNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwNCwgMHg3NCwgMHgwMSwgMHgyOCwgMHgwMCwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMSwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMSwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwNCwgMHg3YywgMHgwMiwgMHgwMiwgMHgwMCwgMHgwNCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwNSwgMHg4YiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHg0OCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHg0OCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHhmZiwgMHhkOCwgMHhmZiwgMHhkYiwgMHgwMCwgMHg4NCwKLSAgICAgICAgMHgwMCwgMHgyMCwgMHgxNiwgMHgxOCwgMHgxYywgMHgxOCwgMHgxNCwgMHgyMCwgMHgxYywgMHgxYSwgMHgxYywKLSAgICAgICAgMHgyNCwgMHgyMiwgMHgyMCwgMHgyNiwgMHgzMCwgMHg1MCwgMHgzNCwgMHgzMCwgMHgyYywgMHgyYywgMHgzMCwKLSAgICAgICAgMHg2MiwgMHg0NiwgMHg0YSwgMHgzYSwgMHg1MCwgMHg3NCwgMHg2NiwgMHg3YSwgMHg3OCwgMHg3MiwgMHg2NiwKLSAgICAgICAgMHg3MCwgMHg2ZSwgMHg4MCwgMHg5MCwgMHhiOCwgMHg5YywgMHg4MCwgMHg4OCwgMHhhZSwgMHg4YSwgMHg2ZSwKLSAgICAgICAgMHg3MCwgMHhhMCwgMHhkYSwgMHhhMiwgMHhhZSwgMHhiZSwgMHhjNCwgMHhjZSwgMHhkMCwgMHhjZSwgMHg3YywKLSAgICAgICAgMHg5YSwgMHhlMiwgMHhmMiwgMHhlMCwgMHhjOCwgMHhmMCwgMHhiOCwgMHhjYSwgMHhjZSwgMHhjNiwgMHgwMSwKLSAgICAgICAgMHgyMiwgMHgyNCwgMHgyNCwgMHgzMCwgMHgyYSwgMHgzMCwgMHg1ZSwgMHgzNCwgMHgzNCwgMHg1ZSwgMHhjNiwKLSAgICAgICAgMHg4NCwgMHg3MCwgMHg4NCwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwKLSAgICAgICAgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwKLSAgICAgICAgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwKLSAgICAgICAgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwKLSAgICAgICAgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhmZiwgMHhjMCwKLSAgICAgICAgMHgwMCwgMHgxMSwgMHgwOCwgMHgwMCwgMHg3OCwgMHgwMCwgMHhhMCwgMHgwMywgMHgwMSwgMHgyMSwgMHgwMCwKLSAgICAgICAgMHgwMiwgMHgxMSwgMHgwMSwgMHgwMywgMHgxMSwgMHgwMSwgMHhmZiwgMHhjNCwgMHgwMSwgMHhhMiwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMSwgMHgwNSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwKLSAgICAgICAgMHgwNiwgMHgwNywgMHgwOCwgMHgwOSwgMHgwYSwgMHgwYiwgMHgxMCwgMHgwMCwgMHgwMiwgMHgwMSwgMHgwMywKLSAgICAgICAgMHgwMywgMHgwMiwgMHgwNCwgMHgwMywgMHgwNSwgMHgwNSwgMHgwNCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMSwKLSAgICAgICAgMHg3ZCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwMCwgMHgwNCwgMHgxMSwgMHgwNSwgMHgxMiwgMHgyMSwgMHgzMSwKLSAgICAgICAgMHg0MSwgMHgwNiwgMHgxMywgMHg1MSwgMHg2MSwgMHgwNywgMHgyMiwgMHg3MSwgMHgxNCwgMHgzMiwgMHg4MSwKLSAgICAgICAgMHg5MSwgMHhhMSwgMHgwOCwgMHgyMywgMHg0MiwgMHhiMSwgMHhjMSwgMHgxNSwgMHg1MiwgMHhkMSwgMHhmMCwKLSAgICAgICAgMHgyNCwgMHgzMywgMHg2MiwgMHg3MiwgMHg4MiwgMHgwOSwgMHgwYSwgMHgxNiwgMHgxNywgMHgxOCwgMHgxOSwKLSAgICAgICAgMHgxYSwgMHgyNSwgMHgyNiwgMHgyNywgMHgyOCwgMHgyOSwgMHgyYSwgMHgzNCwgMHgzNSwgMHgzNiwgMHgzNywKLSAgICAgICAgMHgzOCwgMHgzOSwgMHgzYSwgMHg0MywgMHg0NCwgMHg0NSwgMHg0NiwgMHg0NywgMHg0OCwgMHg0OSwgMHg0YSwKLSAgICAgICAgMHg1MywgMHg1NCwgMHg1NSwgMHg1NiwgMHg1NywgMHg1OCwgMHg1OSwgMHg1YSwgMHg2MywgMHg2NCwgMHg2NSwKLSAgICAgICAgMHg2NiwgMHg2NywgMHg2OCwgMHg2OSwgMHg2YSwgMHg3MywgMHg3NCwgMHg3NSwgMHg3NiwgMHg3NywgMHg3OCwKLSAgICAgICAgMHg3OSwgMHg3YSwgMHg4MywgMHg4NCwgMHg4NSwgMHg4NiwgMHg4NywgMHg4OCwgMHg4OSwgMHg4YSwgMHg5MiwKLSAgICAgICAgMHg5MywgMHg5NCwgMHg5NSwgMHg5NiwgMHg5NywgMHg5OCwgMHg5OSwgMHg5YSwgMHhhMiwgMHhhMywgMHhhNCwKLSAgICAgICAgMHhhNSwgMHhhNiwgMHhhNywgMHhhOCwgMHhhOSwgMHhhYSwgMHhiMiwgMHhiMywgMHhiNCwgMHhiNSwgMHhiNiwKLSAgICAgICAgMHhiNywgMHhiOCwgMHhiOSwgMHhiYSwgMHhjMiwgMHhjMywgMHhjNCwgMHhjNSwgMHhjNiwgMHhjNywgMHhjOCwKLSAgICAgICAgMHhjOSwgMHhjYSwgMHhkMiwgMHhkMywgMHhkNCwgMHhkNSwgMHhkNiwgMHhkNywgMHhkOCwgMHhkOSwgMHhkYSwKLSAgICAgICAgMHhlMSwgMHhlMiwgMHhlMywgMHhlNCwgMHhlNSwgMHhlNiwgMHhlNywgMHhlOCwgMHhlOSwgMHhlYSwgMHhmMSwKLSAgICAgICAgMHhmMiwgMHhmMywgMHhmNCwgMHhmNSwgMHhmNiwgMHhmNywgMHhmOCwgMHhmOSwgMHhmYSwgMHgwMSwgMHgwMCwKLSAgICAgICAgMHgwMywgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwKLSAgICAgICAgMHgwNywgMHgwOCwgMHgwOSwgMHgwYSwgMHgwYiwgMHgxMSwgMHgwMCwgMHgwMiwgMHgwMSwgMHgwMiwgMHgwNCwKLSAgICAgICAgMHgwNCwgMHgwMywgMHgwNCwgMHgwNywgMHgwNSwgMHgwNCwgMHgwNCwgMHgwMCwgMHgwMSwgMHgwMiwgMHg3NywKLSAgICAgICAgMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgxMSwgMHgwNCwgMHgwNSwgMHgyMSwgMHgzMSwgMHgwNiwgMHgxMiwKLSAgICAgICAgMHg0MSwgMHg1MSwgMHgwNywgMHg2MSwgMHg3MSwgMHgxMywgMHgyMiwgMHgzMiwgMHg4MSwgMHgwOCwgMHgxNCwKLSAgICAgICAgMHg0MiwgMHg5MSwgMHhhMSwgMHhiMSwgMHhjMSwgMHgwOSwgMHgyMywgMHgzMywgMHg1MiwgMHhmMCwgMHgxNSwKLSAgICAgICAgMHg2MiwgMHg3MiwgMHhkMSwgMHgwYSwgMHgxNiwgMHgyNCwgMHgzNCwgMHhlMSwgMHgyNSwgMHhmMSwgMHgxNywKLSAgICAgICAgMHgxOCwgMHgxOSwgMHgxYSwgMHgyNiwgMHgyNywgMHgyOCwgMHgyOSwgMHgyYSwgMHgzNSwgMHgzNiwgMHgzNywKLSAgICAgICAgMHgzOCwgMHgzOSwgMHgzYSwgMHg0MywgMHg0NCwgMHg0NSwgMHg0NiwgMHg0NywgMHg0OCwgMHg0OSwgMHg0YSwKLSAgICAgICAgMHg1MywgMHg1NCwgMHg1NSwgMHg1NiwgMHg1NywgMHg1OCwgMHg1OSwgMHg1YSwgMHg2MywgMHg2NCwgMHg2NSwKLSAgICAgICAgMHg2NiwgMHg2NywgMHg2OCwgMHg2OSwgMHg2YSwgMHg3MywgMHg3NCwgMHg3NSwgMHg3NiwgMHg3NywgMHg3OCwKLSAgICAgICAgMHg3OSwgMHg3YSwgMHg4MiwgMHg4MywgMHg4NCwgMHg4NSwgMHg4NiwgMHg4NywgMHg4OCwgMHg4OSwgMHg4YSwKLSAgICAgICAgMHg5MiwgMHg5MywgMHg5NCwgMHg5NSwgMHg5NiwgMHg5NywgMHg5OCwgMHg5OSwgMHg5YSwgMHhhMiwgMHhhMywKLSAgICAgICAgMHhhNCwgMHhhNSwgMHhhNiwgMHhhNywgMHhhOCwgMHhhOSwgMHhhYSwgMHhiMiwgMHhiMywgMHhiNCwgMHhiNSwKLSAgICAgICAgMHhiNiwgMHhiNywgMHhiOCwgMHhiOSwgMHhiYSwgMHhjMiwgMHhjMywgMHhjNCwgMHhjNSwgMHhjNiwgMHhjNywKLSAgICAgICAgMHhjOCwgMHhjOSwgMHhjYSwgMHhkMiwgMHhkMywgMHhkNCwgMHhkNSwgMHhkNiwgMHhkNywgMHhkOCwgMHhkOSwKLSAgICAgICAgMHhkYSwgMHhlMiwgMHhlMywgMHhlNCwgMHhlNSwgMHhlNiwgMHhlNywgMHhlOCwgMHhlOSwgMHhlYSwgMHhmMiwKLSAgICAgICAgMHhmMywgMHhmNCwgMHhmNSwgMHhmNiwgMHhmNywgMHhmOCwgMHhmOSwgMHhmYSwgMHhmZiwgMHhkYSwgMHgwMCwKLSAgICAgICAgMHgwYywgMHgwMywgMHgwMSwgMHgwMCwgMHgwMiwgMHgxMSwgMHgwMywgMHgxMSwgMHgwMCwgMHgzZiwgMHgwMCwKLSAgICAgICAgMHgxNCwgMHg1NCwgMHhhYSwgMHgyYSwgMHg0NiwgMHg0OCwgMHhhMiwgMHhhNCwgMHg1NSwgMHhhNiwgMHgwNCwKLSAgICAgICAgMHg4YSwgMHgyOSwgMHhlMCwgMHg1MywgMHgxMCwgMHhlMCwgMHgyOSwgMHhjMCwgMHg1MCwgMHgwMywgMHhiMSwKLSAgICAgICAgMHg0NiwgMHgyOSwgMHg4MCwgMHg4NCwgMHg1MiwgMHgxMSwgMHg0MCwgMHgwZCwgMHgyMiwgMHg5YSwgMHg0NSwKLSAgICAgICAgMHgyMCwgMHgyMywgMHg2MSwgMHg1MSwgMHgzMCwgMHhhMCwgMHgwOCwgMHhjOCwgMHhhOCwgMHhkOCwgMHg1MiwKLSAgICAgICAgMHgwMiwgMHgyNiwgMHgxNSwgMHgwYiwgMHgwYSwgMHgwMCwgMHhiNCwgMHhhMiwgMHhhNSwgMHg1YSwgMHgwMCwKLSAgICAgICAgMHg5MSwgMHg0NSwgMHg0YSwgMHhhMiwgMHg4MSwgMHg5MiwgMHgwMSwgMHg0ZSwgMHgwMiwgMHg5OCwgMHg4NywKLSAgICAgICAgMHgwYSwgMHg3MCwgMHhhMCwgMHgwNywgMHg2MiwgMHg4YywgMHg1MCwgMHgyMSwgMHgwZCwgMHgyNSwgMHgwMCwKLSAgICAgICAgMHgzNCwgMHg4YSwgMHg2MSwgMHgxNCwgMHgwYywgMHg2MywgMHgwYSwgMHg4OSwgMHg4NSwgMHgwMCwgMHg0NiwKLSAgICAgICAgMHhkNSwgMHgxYiwgMHg1MiwgMHgwMiwgMHgxNiwgMHhhOCwgMHg5OCwgMHg1MCwgMHgwNSwgMHg5NCwgMHhhOSwKLSAgICAgICAgMHgxNiwgMHg4MCwgMHgyNSwgMHg1YSwgMHg5NSwgMHg2OCwgMHgxOCwgMHhmMSwgMHg0ZiwgMHgxNCwgMHhjNCwKLSAgICAgICAgMHgzYiwgMHhiNSwgMHgyMiwgMHhiNiwgMHgzOCwgMHgzNCwgMHgwMCwgMHhlMywgMHgyMiwgMHg4ZSwgMHhmNCwKLSAgICAgICAgMHg3OSwgMHg4YSwgMHg3YiwgMHhkMSwgMHg3MSwgMHgwMywgMHgzMCwgMHhjNywgMHgxNCwgMHg4MywgMHhhNSwKLSAgICAgICAgMHgwMCwgMHgwNiwgMHg5OCwgMHg2OCwgMHgwMSwgMHg4ZCwgMHg1MSwgMHgzNSwgMHgwMywgMHgyMiwgMHg2YSwKLSAgICAgICAgMHg4ZCwgMHhhOSwgMHgwMSwgMHgxMywgMHg1NCwgMHg0ZCwgMHg0MCwgMHgxMywgMHhhNSwgMHg0YSwgMHgyOCwKLSAgICAgICAgMHgwMiwgMHg0NSwgMHgzNSwgMHgyYSwgMHg5YSwgMHgwMCwgMHg3OCwgMHgzNCwgMHhmMCwgMHg2OSwgMHg4MCwKLSAgICAgICAgMHgzNCwgMHg4MSwgMHg0NSwgMHg0MCwgMHhjZSwgMHg1OCwgMHhlNiwgMHhhMiwgMHg0YywgMHgwNiwgMHhlNCwKLSAgICAgICAgMHhmYSwgMHhkMSwgMHg5MywgMHg1MCwgMHgyMSwgMHhjYSwgMHhlNCwgMHg1NSwgMHg4NCwgMHg5MCwgMHgzMCwKLSAgICAgICAgMHhhYiwgMHg4YiwgMHgxOCwgMHhhNiwgMHg5YSwgMHg2YSwgMHhjNCwgMHgzMSwgMHhhYSwgMHgyNiwgMHhhMCwKLSAgICAgICAgMHg2NCwgMHg0ZCwgMHg1MSwgMHhiNSwgMHgyMCwgMHgyMywgMHg2YSwgMHg4OSwgMHhhOCwgMHgwMiwgMHg0NCwKLSAgICAgICAgMHgzNSwgMHgyYSwgMHg5YSwgMHgwMCwgMHg5NSwgMHg0ZCwgMHg0OCwgMHhhNiwgMHg4MCwgMHgyNCwgMHg1MywKLSAgICAgICAgMHg0ZSwgMHhjZSwgMHgwNSwgMHgzMCwgMHgyYiwgMHgzYiwgMHhlZSwgMHg2YSwgMHg5MSwgMHg1ZCwgMHg3NiwKLSAgICAgICAgMHg2MywgMHhiZCwgMHg2NSwgMHg3ZCwgMHg0MCwgMHg2NiwgMHg2OCwgMHhhOSwgMHgwMiwgMHg0NSwgMHgyYiwKLSAgICAgICAgMHhiMywgMHg5ZSwgMHhiNCwgMHhjNSwgMHg2ZCwgMHhhZCwgMHg5YSwgMHhhMCwgMHgyYywgMHgwNiwgMHhjOCwKLSAgICAgICAgMHhjZCwgMHgwNCwgMHhkNiwgMHhhMiwgMHgyMywgMHg2MywgMHg1MSwgMHhiMSwgMHhhMCwgMHg2NCwgMHg0ZCwKLSAgICAgICAgMHg1MSwgMHg5MywgMHg0OCwgMHgwOCwgMHhkYSwgMHhhMiwgMHg2YSwgMHgwMCwgMHg3MiwgMHgxYSwgMHg5OSwKLSAgICAgICAgMHg0ZCwgMHgwMCwgMHg0OCwgMHhhNiwgMHhhNCwgMHg1MywgMHg0YywgMHgwNywgMHg4NiwgMHgwMywgMHhiZCwKLSAgICAgICAgMHgyYiwgMHg5YywgMHhhNywgMHgxNCwgMHg5OCwgMHgxMCwgMHg4NSwgMHgzNCwgMHhlMCwgMHhhNiwgMHhiMywKLSAgICAgICAgMHhiMCwgMHgwYiwgMHhiNSwgMHhhOCwgMHgwYSwgMHhkNCwgMHg1OCwgMHg0MiwgMHhlZCwgMHgzZSwgMHg5NCwKLSAgICAgICAgMHhkMiwgMHhhNiwgMHg4YiwgMHgwMSwgMHgzNCwgMHg0NCwgMHhlZCwgMHhlNiwgMHg5YywgMHg0ZCwgMHg2YSwKLSAgICAgICAgMHg4MCwgMHg4ZCwgMHg4ZCwgMHg0NiwgMHhjNiwgMHg4MCwgMHgyMywgMHg2MywgMHg1MSwgMHg5YSwgMHgwNiwKLSAgICAgICAgMHg0NiwgMHhkNSwgMHgxMywgMHg1MiwgMHgwMSwgMHg1NCwgMHhkNCwgMHhhYSwgMHg2OCwgMHgwMiwgMHg0MCwKLSAgICAgICAgMHg2YSwgMHg0MCwgMHg3OCwgMHhhMCwgMHgwOCwgMHg1OSwgMHhjZSwgMHhlZSwgMHhiNSwgMHgyYSwgMHgzOSwKLSAgICAgICAgMHhkOSwgMHg1OSwgMHhhNywgMHhhOCwgMHgwMCwgMHg3MywgMHhlYiwgMHg0ZSwgMHgwZSwgMHg3ZCwgMHg2OSwKLSAgICAgICAgMHg1YywgMHgwNSwgMHhmMywgMHgwZiwgMHhhZCwgMHgxZSwgMHg2MSwgMHhmNSwgMHhhNywgMHg3MSwgMHgwYiwKLSAgICAgICAgMHhlNiwgMHgzNSwgMHgyMSwgMHg5MCwgMHhkMywgMHhiOCwgMHgwZSwgMHgzMiwgMHgxMCwgMHg5NSwgMHgxMCwKLSAgICAgICAgMHg5MSwgMHhiMywgMHhkNiwgMHg5YiwgMHg2MCwgMHg0YiwgMHg5YywgMHg4YSwgMHg2MywgMHgxYSwgMHhiMCwKLSAgICAgICAgMHgxOCwgMHg0ZCwgMHg0NiwgMHhjNiwgMHg4MCwgMHgyMiwgMHg2YSwgMHg2MSwgMHhhNCwgMHgzMSwgMHhhYSwKLSAgICAgICAgMHg2YSwgMHg1NSwgMHgzNCwgMHgwMSwgMHgyYSwgMHg5YSwgMHg3ZSwgMHg3OCwgMHhhMCwgMHgwOCwgMHgwOSwKLSAgICAgICAgMHhmOSwgMHhhYSwgMHg1OCwgMHhjZiwgMHhjYSwgMHg2YiwgMHgzZSwgMHhhMCwgMHgwMCwgMHhkMywgMHg4MSwKLSAgICAgICAgMHhhOSwgMHgwMSwgMHg3MywgMHg0NiwgMHg2OSwgMHg4MCwgMHhiOSwgMHhhNCwgMHhjZCwgMHgwMCwgMHgyYiwKLSAgICAgICAgMHgxZiwgMHg5MiwgMHhhMywgMHgwNywgMHg5YSwgMHg2ZiwgMHg3MCwgMHgyNiwgMHhjZiwgMHgxNCwgMHhkMiwKLSAgICAgICAgMHg2YiwgMHg1MSwgMHgwYywgMHg2MywgMHg1MSwgMHhiMSwgMHhhMCwgMHgwOCwgMHhkYSwgMHg5OCwgMHg2OSwKLSAgICAgICAgMHgwYywgMHg4ZCwgMHg0ZCwgMHg0YSwgMHhhNiwgMHg4MCwgMHgyNCwgMHg1MywgMHg1MiwgMHgwMywgMHhjNSwKLSAgICAgICAgMHgwMiwgMHgyMSwgMHgyNywgMHhlNiwgMHhhOSwgMHgyMywgMHgzZiwgMHgyOSwgMHhhYywgMHhmYSwgMHg4YywKLSAgICAgICAgMHgwMSwgMHhlNiwgMHg5YywgMHgwZCwgMHg0OCwgMHgwYSwgMHgwZCwgMHgyZSwgMHg2OCwgMHgwMSwgMHg3MywKLSAgICAgICAgMHg0OSwgMHg5YSwgMHg2MCwgMHgyYiwgMHgxZiwgMHg5MiwgMHg5OCwgMHgzYSwgMHhkMywgMHg3YiwgMHg4MSwKLSAgICAgICAgMHgzNiwgMHg3OCwgMHhhNiwgMHg5MywgMHg1YSwgMHg4OCwgMHg4YywgMHg5YSwgMHg2MywgMHgxYSwgMHgwMCwKLSAgICAgICAgMHg4YywgMHhkMywgMHgwZCwgMHgyMSwgMHg5MSwgMHgyOSwgMHhhOSwgMHgxNCwgMHhkMCwgMHgwNCwgMHg4YSwKLSAgICAgICAgMHg2OSwgMHhlMCwgMHhkMywgMHgxMSwgMHgxYiwgMHgxZSwgMHg2YSwgMHg0OCwgMHhjZiwgMHhjYSwgMHg2YiwKLSAgICAgICAgMHgzZSwgMHhhMywgMHgxMCwgMHgxYSwgMHg3MCwgMHgzNSwgMHgyMCwgMHgzOCwgMHgxYSwgMHg1YywgMHhkMiwKLSAgICAgICAgMHgwMSwgMHg3MywgMHg0OSwgMHg5YSwgMHg2MCwgMHgzOSwgMHg4ZiwgMHhjYSwgMHgyOSwgMHg4YiwgMHhmNywKLSAgICAgICAgMHhhYSwgMHhiYSwgMHg4OCwgMHg5NiwgMHg5YSwgMHg2YiwgMHg0MCwgMHgxOCwgMHhjNiwgMHhhMywgMHgyNiwKLSAgICAgICAgMHg4MCwgMHgxOCwgMHg2OSwgMHhhNiwgMHg5MCwgMHhjOCwgMHgxNCwgMHhkNCwgMHg4YSwgMHg2OSwgMHg4MCwKLSAgICAgICAgMHhmMCwgMHg2YSwgMHg0MCwgMHg2OCwgMHgxMCwgMHhiYiwgMHg0MSwgMHhhNywgMHhlMywgMHgwYiwgMHhjNSwKLSAgICAgICAgMHgyYiwgMHgwMSwgMHgxMCwgMHhhNywgMHgwMywgMHg1OSwgMHgwYywgMHg3NiwgMHg2OSwgMHg3MywgMHg0MCwKLSAgICAgICAgMHgwYiwgMHg5YSwgMHgyOCwgMHgxMSwgMHgyOCwgMHgxOSwgMHg1ZSwgMHg2OSwgMHgwMiwgMHg4MSwgMHg1YSwKLSAgICAgICAgMHhkOCwgMHgwMCwgMHhkMywgMHg0ZCwgMHg1MCwgMHgwYywgMHg2YSwgMHg4YywgMHhkMiwgMHgwMSwgMHhhNiwKLSAgICAgICAgMHg5OCwgMHg2OSwgMHgwYywgMHhhZSwgMHhhNiwgMHhhNCwgMHgwNiwgMHg4MCwgMHgxZSwgMHhhNiwgMHg5ZSwKLSAgICAgICAgMHgwZCwgMHgzMSwgMHgxMiwgMHgwMywgMHg0ZiwgMHgwNiwgMHg4MCwgMHgxMywgMHg2MCwgMHgzNCwgMHhkMywKLSAgICAgICAgMHhjMSwgMHhhOCwgMHg5MiwgMHgwMSwgMHhmMSwgMHg4ZCwgMHhkZCwgMHg2OSwgMHhjYywgMHhhMSwgMHg2OSwKLSAgICAgICAgMHg1YiwgMHg0YiwgMHg4MCwgMHg4MywgMHg5MywgMHg1MiwgMHgwNCwgMHgxNCwgMHhlMiwgMHhhZSwgMHgwMywKLSAgICAgICAgMHhhOSwgMHgwZCwgMHg2OCwgMHgwMywgMHg0ZCwgMHgzNCwgMHhkMCwgMHgwMywgMHgwZCwgMHgzMCwgMHhkMiwKLSAgICAgICAgMHgwMSwgMHg4NiwgMHg5YSwgMHg2OCwgMHgxOSwgMHg1OCwgMHgxYSwgMHg3OCwgMHhhNCwgMHgwNCwgMHg4YSwKLSAgICAgICAgMHg2OSwgMHhlMCwgMHhkMywgMHgxMCwgMHhlMCwgMHg2OSwgMHhlMCwgMHhkMCwgMHgwMywgMHhjMSwgMHhhOCwKLSAgICAgICAgMHhkYiwgMHhhZCwgMHg0YywgMHg4MSwgMHgxMiwgMHg0NSwgMHhkNiwgMHg5ZCwgMHgyNSwgMHgxZCwgMHgwMCwKLSAgICAgICAgMHg2YSwgMHhmNSwgMHhhOSwgMHhlOCwgMHg4MCwgMHgzMSwgMHgyOSwgMHgwZCwgMHg1OCwgMHgwOCwgMHg2OSwKLSAgICAgICAgMHg4NiwgMHg4MCwgMHgxYSwgMHg2OSwgMHg4NiwgMHg5MCwgMHgwYywgMHgzNCwgMHhkMywgMHg0OCwgMHg2NSwKLSAgICAgICAgMHg1MSwgMHg0ZiwgMHgwNiwgMHg5OCwgMHgwZiwgMHgxNCwgMHhmMCwgMHg2OCwgMHgxMCwgMHhmMCwgMHg2OSwKLSAgICAgICAgMHhlMCwgMHhkMCwgMHgwMywgMHg4MSwgMHhhNSwgMHgyYiwgMHg5YSwgMHgxYSwgMHhiOCwgMHg4NywgMHhhOCwKLSAgICAgICAgMHhkYiwgMHg0YSwgMHg0NiwgMHg2OCwgMHhiNiwgMHg4MCwgMHgyYSwgMHhhOCwgMHgxNCwgMHhlYSwgMHgxMiwKLSAgICAgICAgMHhiMCwgMHgwNSwgMHgyMSwgMHhhNiwgMHgwMiwgMHgxYSwgMHg2MSwgMHhhMCwgMHgwNiwgMHg5YSwgMHg2MSwKLSAgICAgICAgMHhhNCwgMHgzMSwgMHg4NiwgMHg5YSwgMHg2OSwgMHgwYywgMHhhOCwgMHgwZCwgMHgzYywgMHg1MywgMHgwMSwKLSAgICAgICAgMHhlMiwgMHg5ZSwgMHgyOCwgMHgxMCwgMHhmMSwgMHg0ZSwgMHgwNiwgMHg5OCwgMHgwZiwgMHgwNiwgMHg5ZSwKLSAgICAgICAgMHgwZCwgMHgwMiwgMHgxYywgMHgyOSwgMHhjMiwgMHg4MCwgMHgxNiwgMHg5NiwgMHg4MCwgMHgwYSwgMHg0YSwKLSAgICAgICAgMHgwMCwgMHg0MywgMHg0ZCwgMHgzNCwgMHgwYywgMHg2MSwgMHhhNiwgMHgxYSwgMHg0MCwgMHgzNCwgMHhkMywKLSAgICAgICAgMHg0ZCwgMHgyMSwgMHg4MCwgMHhmZiwgMHhkOSwgMHhmZiwgMHhkYiwgMHgwMCwgMHg4NCwgMHgwMCwgMHgwYSwKLSAgICAgICAgMHgwNywgMHgwNywgMHgwOCwgMHgwNywgMHgwNiwgMHgwYSwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwYiwgMHgwYSwKLSAgICAgICAgMHgwYSwgMHgwYiwgMHgwZSwgMHgxOCwgMHgxMCwgMHgwZSwgMHgwZCwgMHgwZCwgMHgwZSwgMHgxZCwgMHgxNSwKLSAgICAgICAgMHgxNiwgMHgxMSwgMHgxOCwgMHgyMywgMHgxZiwgMHgyNSwgMHgyNCwgMHgyMiwgMHgxZiwgMHgyMiwgMHgyMSwKLSAgICAgICAgMHgyNiwgMHgyYiwgMHgzNywgMHgyZiwgMHgyNiwgMHgyOSwgMHgzNCwgMHgyOSwgMHgyMSwgMHgyMiwgMHgzMCwKLSAgICAgICAgMHg0MSwgMHgzMSwgMHgzNCwgMHgzOSwgMHgzYiwgMHgzZSwgMHgzZSwgMHgzZSwgMHgyNSwgMHgyZSwgMHg0NCwKLSAgICAgICAgMHg0OSwgMHg0MywgMHgzYywgMHg0OCwgMHgzNywgMHgzZCwgMHgzZSwgMHgzYiwgMHgwMSwgMHgwYSwgMHgwYiwKLSAgICAgICAgMHgwYiwgMHgwZSwgMHgwZCwgMHgwZSwgMHgxYywgMHgxMCwgMHgxMCwgMHgxYywgMHgzYiwgMHgyOCwgMHgyMiwKLSAgICAgICAgMHgyOCwgMHgzYiwgMHgzYiwgMHgzYiwgMHgzYiwgMHgzYiwgMHgzYiwgMHgzYiwgMHgzYiwgMHgzYiwgMHgzYiwKLSAgICAgICAgMHgzYiwgMHgzYiwgMHgzYiwgMHgzYiwgMHgzYiwgMHgzYiwgMHgzYiwgMHgzYiwgMHgzYiwgMHgzYiwgMHgzYiwKLSAgICAgICAgMHgzYiwgMHgzYiwgMHgzYiwgMHgzYiwgMHgzYiwgMHgzYiwgMHgzYiwgMHgzYiwgMHgzYiwgMHgzYiwgMHgzYiwKLSAgICAgICAgMHgzYiwgMHgzYiwgMHgzYiwgMHgzYiwgMHgzYiwgMHgzYiwgMHgzYiwgMHgzYiwgMHgzYiwgMHgzYiwgMHgzYiwKLSAgICAgICAgMHgzYiwgMHgzYiwgMHgzYiwgMHgzYiwgMHgzYiwgMHgzYiwgMHgzYiwgMHhmZiwgMHhjMCwgMHgwMCwgMHgxMSwKLSAgICAgICAgMHgwOCwgMHgwMCwgMHg0OCwgMHgwMCwgMHg2MCwgMHgwMywgMHgwMSwgMHgyMSwgMHgwMCwgMHgwMiwgMHgxMSwKLSAgICAgICAgMHgwMSwgMHgwMywgMHgxMSwgMHgwMSwgMHhmZiwgMHhjNCwgMHgwMSwgMHhhMiwgMHgwMCwgMHgwMCwgMHgwMSwKLSAgICAgICAgMHgwNSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywKLSAgICAgICAgMHgwOCwgMHgwOSwgMHgwYSwgMHgwYiwgMHgxMCwgMHgwMCwgMHgwMiwgMHgwMSwgMHgwMywgMHgwMywgMHgwMiwKLSAgICAgICAgMHgwNCwgMHgwMywgMHgwNSwgMHgwNSwgMHgwNCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg3ZCwgMHgwMSwKLSAgICAgICAgMHgwMiwgMHgwMywgMHgwMCwgMHgwNCwgMHgxMSwgMHgwNSwgMHgxMiwgMHgyMSwgMHgzMSwgMHg0MSwgMHgwNiwKLSAgICAgICAgMHgxMywgMHg1MSwgMHg2MSwgMHgwNywgMHgyMiwgMHg3MSwgMHgxNCwgMHgzMiwgMHg4MSwgMHg5MSwgMHhhMSwKLSAgICAgICAgMHgwOCwgMHgyMywgMHg0MiwgMHhiMSwgMHhjMSwgMHgxNSwgMHg1MiwgMHhkMSwgMHhmMCwgMHgyNCwgMHgzMywKLSAgICAgICAgMHg2MiwgMHg3MiwgMHg4MiwgMHgwOSwgMHgwYSwgMHgxNiwgMHgxNywgMHgxOCwgMHgxOSwgMHgxYSwgMHgyNSwKLSAgICAgICAgMHgyNiwgMHgyNywgMHgyOCwgMHgyOSwgMHgyYSwgMHgzNCwgMHgzNSwgMHgzNiwgMHgzNywgMHgzOCwgMHgzOSwKLSAgICAgICAgMHgzYSwgMHg0MywgMHg0NCwgMHg0NSwgMHg0NiwgMHg0NywgMHg0OCwgMHg0OSwgMHg0YSwgMHg1MywgMHg1NCwKLSAgICAgICAgMHg1NSwgMHg1NiwgMHg1NywgMHg1OCwgMHg1OSwgMHg1YSwgMHg2MywgMHg2NCwgMHg2NSwgMHg2NiwgMHg2NywKLSAgICAgICAgMHg2OCwgMHg2OSwgMHg2YSwgMHg3MywgMHg3NCwgMHg3NSwgMHg3NiwgMHg3NywgMHg3OCwgMHg3OSwgMHg3YSwKLSAgICAgICAgMHg4MywgMHg4NCwgMHg4NSwgMHg4NiwgMHg4NywgMHg4OCwgMHg4OSwgMHg4YSwgMHg5MiwgMHg5MywgMHg5NCwKLSAgICAgICAgMHg5NSwgMHg5NiwgMHg5NywgMHg5OCwgMHg5OSwgMHg5YSwgMHhhMiwgMHhhMywgMHhhNCwgMHhhNSwgMHhhNiwKLSAgICAgICAgMHhhNywgMHhhOCwgMHhhOSwgMHhhYSwgMHhiMiwgMHhiMywgMHhiNCwgMHhiNSwgMHhiNiwgMHhiNywgMHhiOCwKLSAgICAgICAgMHhiOSwgMHhiYSwgMHhjMiwgMHhjMywgMHhjNCwgMHhjNSwgMHhjNiwgMHhjNywgMHhjOCwgMHhjOSwgMHhjYSwKLSAgICAgICAgMHhkMiwgMHhkMywgMHhkNCwgMHhkNSwgMHhkNiwgMHhkNywgMHhkOCwgMHhkOSwgMHhkYSwgMHhlMSwgMHhlMiwKLSAgICAgICAgMHhlMywgMHhlNCwgMHhlNSwgMHhlNiwgMHhlNywgMHhlOCwgMHhlOSwgMHhlYSwgMHhmMSwgMHhmMiwgMHhmMywKLSAgICAgICAgMHhmNCwgMHhmNSwgMHhmNiwgMHhmNywgMHhmOCwgMHhmOSwgMHhmYSwgMHgwMSwgMHgwMCwgMHgwMywgMHgwMSwKLSAgICAgICAgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgMHgwOCwKLSAgICAgICAgMHgwOSwgMHgwYSwgMHgwYiwgMHgxMSwgMHgwMCwgMHgwMiwgMHgwMSwgMHgwMiwgMHgwNCwgMHgwNCwgMHgwMywKLSAgICAgICAgMHgwNCwgMHgwNywgMHgwNSwgMHgwNCwgMHgwNCwgMHgwMCwgMHgwMSwgMHgwMiwgMHg3NywgMHgwMCwgMHgwMSwKLSAgICAgICAgMHgwMiwgMHgwMywgMHgxMSwgMHgwNCwgMHgwNSwgMHgyMSwgMHgzMSwgMHgwNiwgMHgxMiwgMHg0MSwgMHg1MSwKLSAgICAgICAgMHgwNywgMHg2MSwgMHg3MSwgMHgxMywgMHgyMiwgMHgzMiwgMHg4MSwgMHgwOCwgMHgxNCwgMHg0MiwgMHg5MSwKLSAgICAgICAgMHhhMSwgMHhiMSwgMHhjMSwgMHgwOSwgMHgyMywgMHgzMywgMHg1MiwgMHhmMCwgMHgxNSwgMHg2MiwgMHg3MiwKLSAgICAgICAgMHhkMSwgMHgwYSwgMHgxNiwgMHgyNCwgMHgzNCwgMHhlMSwgMHgyNSwgMHhmMSwgMHgxNywgMHgxOCwgMHgxOSwKLSAgICAgICAgMHgxYSwgMHgyNiwgMHgyNywgMHgyOCwgMHgyOSwgMHgyYSwgMHgzNSwgMHgzNiwgMHgzNywgMHgzOCwgMHgzOSwKLSAgICAgICAgMHgzYSwgMHg0MywgMHg0NCwgMHg0NSwgMHg0NiwgMHg0NywgMHg0OCwgMHg0OSwgMHg0YSwgMHg1MywgMHg1NCwKLSAgICAgICAgMHg1NSwgMHg1NiwgMHg1NywgMHg1OCwgMHg1OSwgMHg1YSwgMHg2MywgMHg2NCwgMHg2NSwgMHg2NiwgMHg2NywKLSAgICAgICAgMHg2OCwgMHg2OSwgMHg2YSwgMHg3MywgMHg3NCwgMHg3NSwgMHg3NiwgMHg3NywgMHg3OCwgMHg3OSwgMHg3YSwKLSAgICAgICAgMHg4MiwgMHg4MywgMHg4NCwgMHg4NSwgMHg4NiwgMHg4NywgMHg4OCwgMHg4OSwgMHg4YSwgMHg5MiwgMHg5MywKLSAgICAgICAgMHg5NCwgMHg5NSwgMHg5NiwgMHg5NywgMHg5OCwgMHg5OSwgMHg5YSwgMHhhMiwgMHhhMywgMHhhNCwgMHhhNSwKLSAgICAgICAgMHhhNiwgMHhhNywgMHhhOCwgMHhhOSwgMHhhYSwgMHhiMiwgMHhiMywgMHhiNCwgMHhiNSwgMHhiNiwgMHhiNywKLSAgICAgICAgMHhiOCwgMHhiOSwgMHhiYSwgMHhjMiwgMHhjMywgMHhjNCwgMHhjNSwgMHhjNiwgMHhjNywgMHhjOCwgMHhjOSwKLSAgICAgICAgMHhjYSwgMHhkMiwgMHhkMywgMHhkNCwgMHhkNSwgMHhkNiwgMHhkNywgMHhkOCwgMHhkOSwgMHhkYSwgMHhlMiwKLSAgICAgICAgMHhlMywgMHhlNCwgMHhlNSwgMHhlNiwgMHhlNywgMHhlOCwgMHhlOSwgMHhlYSwgMHhmMiwgMHhmMywgMHhmNCwKLSAgICAgICAgMHhmNSwgMHhmNiwgMHhmNywgMHhmOCwgMHhmOSwgMHhmYSwgMHhmZiwgMHhkYSwgMHgwMCwgMHgwYywgMHgwMywKLSAgICAgICAgMHgwMSwgMHgwMCwgMHgwMiwgMHgxMSwgMHgwMywgMHgxMSwgMHgwMCwgMHgzZiwgMHgwMCwgMHg5ZSwgMHhkMiwKLSAgICAgICAgMHgyZSwgMHgwNywgMHgxNSwgMHhhZiwgMHg2ZCwgMHgwOCwgMHhlMiwgMHhiMywgMHg0NSwgMHgxYSwgMHhmNiwKLSAgICAgICAgMHhkMCwgMHgwMCwgMHgwMSwgMHhjNSwgMHg2OCwgMHg0NSwgMHgxNywgMHg0YSwgMHhiNCwgMHgyMiwgMHhlNCwKLSAgICAgICAgMHg3MCwgMHg4YywgMHg3NCwgMHhhOSwgMHgzYywgMHhhMSwgMHg4ZSwgMHg5NSwgMHg0OCwgMHg5NiwgMHgzMSwKLSAgICAgICAgMHhlMiwgMHgxOCwgMHhlOSwgMHg1NSwgMHhhNSwgMHg4YywgMHg3YSwgMHg1MCwgMHgwNSwgMHgwYiwgMHg4OCwKLSAgICAgICAgMHg4NiwgMHgwZiwgMHgxNSwgMHg4ZiwgMHg3NSwgMHgxZiwgMHgyNiwgMHg5MywgMHgxOSwgMHg5MSwgMHg3NywKLSAgICAgICAgMHgxOCwgMHhjMSwgMHhhYywgMHg0YiwgMHhjOCwgMHhmYSwgMHhkNiwgMHg2MywgMHgzNywgMHg2ZCwgMHgzMSwKLSAgICAgICAgMHhiNCwgMHg3MywgMHg1YiwgMHgzNiwgMHhhMCwgMHgxYywgMHg1MCwgMHg4MCwgMHhkNywgMHg4MywgMHhhMCwKLSAgICAgICAgMHhhYiwgMHhkMSwgMHg2MiwgMHhhZCwgMHgwOSwgMHg4ZiwgMHgxNywgMHgyOSwgMHgwMywgMHhiMiwgMHhjYywKLSAgICAgICAgMHhlMCwgMHg3NywgMHgxNCwgMHhhMywgMHg1NiwgMHhiMywgMHgyNywgMHgxZSwgMHg2NywgMHhlOSwgMHg1MiwKLSAgICAgICAgMHhlYSwgMHhjNiwgMHgzYSwgMHgzNiwgMHg0OCwgMHhlZiwgMHgzZCwgMHgyNywgMHg3MCwgMHgyMiwgMHg2MCwKLSAgICAgICAgMHg0NywgMHg1MiwgMHg2OSwgMHhiMiwgMHhlMiwgMHhhZCwgMHgzYiwgMHhlYSwgMHg4MCwgMHhhMywgMHgzOCwKLSAgICAgICAgMHhlMCwgMHhkNiwgMHgzZCwgMHhkOCwgMHgxYywgMHhkMCwgMHhjYSwgMHg0NiwgMHgzZCwgMHhkMCwgMHgxOCwKLSAgICAgICAgMHgzNSwgMHg4OSwgMHg3OCwgMHhhMywgMHg5YSwgMHhjZCwgMHg4YywgMHhkMiwgMHhiMywgMHg5MywgMHgyYSwKLSAgICAgICAgMHgyYiwgMHg2NiwgMHhkNSwgMHhmMSwgMHg4YSwgMHgxMCwgMHgxYSwgMHhkNiwgMHhmMiwgMHgwMywgMHg4YSwKLSAgICAgICAgMHg5ZSwgMHhlNiwgMHhmNCwgMHg1YSwgMHhkYiwgMHhlZiwgMHhmZSwgMHgyMywgMHhjMCwgMHhhNywgMHgyNywKLSAgICAgICAgMHhjYiwgMHgxNiwgMHhjNCwgMHhjYywgMHhkZCwgMHhlMiwgMHg3OCwgMHg5YSwgMHg2OSwgMHg2NiwgMHhjYywKLSAgICAgICAgMHg5OSwgMHhlMSwgMHg0ZCwgMHg0NywgMHhiYSwgMHhiYywgMHhkOSwgMHg2YSwgMHhlZSwgMHgyNiwgMHg1OSwKLSAgICAgICAgMHg1OSwgMHg0ZCwgMHhhYywgMHg2OSwgMHgzNCwgMHg1MiwgMHhlNSwgMHg4ZiwgMHg1NSwgMHhhZCwgMHg1OCwKLSAgICAgICAgMHhhZSwgMHg4NSwgMHhjNCwgMHgyMiwgMHg0MSwgMHhkZiwgMHhhZCwgMHg3NiwgMHg2MSwgMHhlNSwgMHg2ZiwKLSAgICAgICAgMHg3NCwgMHg0NSwgMHg2OSwgMHhkYywgMHgwMCwgMHg3OSwgMHhhYywgMHg4YiwgMHhhNiwgMHhjOSwgMHgzNSwKLSAgICAgICAgMHhkNCwgMHgzNCwgMHg2NCwgMHhkYywgMHgzNywgMHgwNiwgMHhiMSwgMHhhZSwgMHg4OCwgMHhjMSwgMHhhYywKLSAgICAgICAgMHhkOCwgMHhjOSwgMHgyYywgMHhhNiwgMHhlMCwgMHg3MywgMHg1YiwgMHgzNiwgMHhmMywgMHg3NCwgMHhlNiwKLSAgICAgICAgMHg4NCwgMHgwNSwgMHhlMywgMHhhOSwgMHg0NywgMHg2YSwgMHgxNCwgMHhiNiwgMHg0OSwgMHgzZCwgMHg4NSwKLSAgICAgICAgMHgzYSwgMHhlZSwgMHhlZSwgMHgyYiwgMHhhOCwgMHhlMiwgMHg2ZiwgMHgzMCwgMHg4MSwgMHhlOSwgMHg4YSwKLSAgICAgICAgMHhjYSwgMHhhNCwgMHhlMiwgMHhkMywgMHg4YiwgMHgwMSwgMHhiMSwgMHhmOSwgMHgwNCwgMHg3ZiwgMHhhZiwKLSAgICAgICAgMHgyMywgMHhmMCwgMHhhOSwgMHg1NCwgMHg0MSwgMHg5YywgMHhmZCwgMHhhMywgMHhmNCwgMHhhZSwgMHg2NSwKLSAgICAgICAgMHgxOCwgMHhmNywgMHgyNSwgMHg4YSwgMHhlMiwgMHgwMiwgMHgzOCwgMHhiOCwgMHhmZCwgMHgyYSwgMHg3YiwKLSAgICAgICAgMHg1YiwgMHhhOCwgMHg2ZCwgMHg2ZCwgMHg1ZCwgMHg5YSwgMHg1ZCwgMHhjYiwgMHhiYiwgMHhkMiwgMHhiNiwKLSAgICAgICAgMHhhNiwgMHhhMywgMHgxOSwgMHg1ZSwgMHhlMiwgMHgwMywgMHg3YiwgMHgxZCwgMHhjMiwgMHgxNywgMHg4ZCwKLSAgICAgICAgMHhiOCwgMHhhYywgMHhmYiwgMHg4OSwgMHgzOSwgMHgzNSwgMHhkNiwgMHg5YSwgMHg2YSwgMHhlOCwgMHg2NiwKLSAgICAgICAgMHg1NSwgMHhjYiwgMHhmNSwgMHhhYywgMHg3YiwgMHg5NiwgMHhlYiwgMHg1MCwgMHhjNiwgMHg4OCwgMHg2ZCwKLSAgICAgICAgMHg2NiwgMHhlOSwgMHhjZCwgMHg2YywgMHhkYiwgMHg0ZiwgMHhkMywgMHg5YSwgMHgwMCwgMHgyZiwgMHhlNiwKLSAgICAgICAgMHhmOSwgMHhhMywgMHhlNywgMHhiNSwgMHg0YSwgMHg5MywgMHg3ZiwgMHhhMiwgMHhjNiwgMHg3MywgMHhkYywKLSAgICAgICAgMHhkNywgMHgxNSwgMHg1NSwgMHhlZiwgMHg0OCwgMHg3ZCwgMHgwOSwgMHg1MiwgMHg2ZSwgMHgzYSwgMHhkNCwKLSAgICAgICAgMHhhYiwgMHgyZiwgMHhiZCwgMHg2MSwgMHgxNiwgMHgwYywgMHg3MywgMHg0OSwgMHhjNSwgMHgyNCwgMHg5MiwKLSAgICAgICAgMHg3ZiwgMHhhMiwgMHg2MywgMHhmZCwgMHhhYSwgMHhkNiwgMHgyZiwgMHg3MSwgMHgwZSwgMHhiMSwgMHg5MywKLSAgICAgICAgMHhmNywgMHgyZCwgMHhmNSwgMHhhNCwgMHg5ZSwgMHg0ZSwgMHhiNSwgMHhkZCwgMHg0YiwgMHhmOCwgMHg2OCwKLSAgICAgICAgMHg0YywgMHhjYiwgMHhiOSwgMHg5MywgMHhhZCwgMHg2NSwgMHhjZSwgMHhkOSwgMHgyNiwgMHhhOSwgMHg4ZCwKLSAgICAgICAgMHgxOSwgMHhmNiwgMHhmMiwgMHhmNCwgMHhlNiwgMHhiNSwgMHhhZCwgMHhlNywgMHhjNiwgMHgzOSwgMHhhMCwKLSAgICAgICAgMHgxOCwgMHhlYiwgMHhjOSwgMHg3NywgMHg2YywgMHgzNSwgMHgyYSwgMHg0YiwgMHhmZSwgMHg4YSwgMHg5YywKLSAgICAgICAgMHhmZiwgMHgwMCwgMHgxMSwgMHhhZSwgMHgzYSwgMHg4YiwgMHhkZSwgMHg2MSwgMHhkMCwgMHg5ZSwgMHgzOSwKLSAgICAgICAgMHhiOCwgMHhlYiwgMHg1MywgMHhhYywgMHhiOSwgMHhhZSwgMHg1YiwgMHgwMCwgMHhmMywgMHgyNywgMHgxNCwKLSAgICAgICAgMHg5MiwgMHhjOSwgMHhmZSwgMHg4YSwgMHgzZiwgMHhkZSwgMHgzNSwgMHhhYywgMHgzYSwgMHg4OCwgMHg5MiwKLSAgICAgICAgMHhjZCwgMHhiMSwgMHg2ZSwgMHg3ZCwgMHhjZCwgMHgzMiwgMHg2NywgMHhlYiwgMHhjZCwgMHg3YSwgMHgxNCwKLSAgICAgICAgMHhmZSwgMHgwNCwgMHgyNiwgMHg2NiwgMHhjZSwgMHhmOSwgMHgyNiwgMHhiMywgMHhlNiwgMHg2ZSwgMHhiNCwKLSAgICAgICAgMHhkOSwgMHg0OCwgMHhjOCwgMHg4MiwgMHg0ZSwgMHgwNywgMHgzNSwgMHhhNywgMHg2ZiwgMHgyZiwgMHgwMiwKLSAgICAgICAgMHg5YSwgMHgwNiwgMHg1ZiwgMHg4YywgMHhhNCwgMHg4MywgMHgwZSwgMHgzMiwgMHgyYSwgMHg2OSwgMHhlMywKLSAgICAgICAgMHhkZCwgMHgxMiwgMHgwOCwgMHg5NywgMHg4NSwgMHhlYywgMHgyYSwgMHgyYSwgMHg0MiwgMHhmMSwgMHg3NiwKLSAgICAgICAgMHgyNiwgMHhlNCwgMHg2YSwgMHg1OSwgMHgwZSwgMHgxOCwgMHgxMCwgMHg2YSwgMHhkMiwgMHg4OSwgMHgwMiwKLSAgICAgICAgMHg2ZSwgMHgyYSwgMHg3MSwgMHhlYiwgMHg1YywgMHgxYywgMHg4YywgMHhhNiwgMHg0OCwgMHhiYiwgMHhkYywKLSAgICAgICAgMHg2MSwgMHg0MSwgMHgzNSwgMHg3MiwgMHgyOCwgMHg4NywgMHhkOSwgMHhmNiwgMHg0YSwgMHhiOSwgMHhlNywKLSAgICAgICAgMHgzOCwgMHhhZSwgMHg4YywgMHgzZCwgMHgzNiwgMHhkZCwgMHhkZSwgMHhjNCwgMHhiMCwgMHgyMSwgMHg1MSwKLSAgICAgICAgMHg3NiwgMHhhOCwgMHhjMCwgMHhhYSwgMHg5MywgMHgzMSwgMHhlNiwgMHhiYiwgMHgyZCwgMHg2NSwgMHg2MSwKLSAgICAgICAgMHgxOSwgMHhkMywgMHgxZSwgMHhiNSwgMHg0NiwgMHg1YSwgMHg5NiwgMHg1YSwgMHgzMCwgMHhhMCwgMHg3ZSwKLSAgICAgICAgMHgwNSwgMHg2OSwgMHg1YiwgMHhjOSwgMHhjNiwgMHgyOCwgMHg0MCwgMHhjZCwgMHgwOCwgMHg2NCwgMHgzYywKLSAgICAgICAgMHg3MywgMHg1NywgMHhlMSwgMHg5NCwgMHhmMSwgMHhjZCwgMHg1YSwgMHgyMSwgMHg4YywgMHhiOSwgMHg2MywKLSAgICAgICAgMHhlNywgMHg2NywgMHgxZCwgMHhhYiwgMHg0MCwgMHhiMSwgMHhmYiwgMHgwMCwgMHgxZCwgMHhmMCwgMHgyYiwKLSAgICAgICAgMHg5OSwgMHgyZCwgMHg2NiwgMHgzZSwgMHg4OCwgMHg3NSwgMHg4MSwgMHgzZiwgMHgzMSwgMHhmNiwgMHhhYiwKLSAgICAgICAgMHg2NCwgMHhkNiwgMHhiNCwgMHgxNywgMHhlZSwgMHhkMCwgMHg5ZSwgMHhlNCwgMHgzMiwgMHgxYSwgMHhhNywKLSAgICAgICAgMHgzMSwgMHhhZCwgMHgxOCwgMHgxNCwgMHgyNiwgMHhlZiwgMHg1NCwgMHhhNSwgMHhhOCwgMHg2NSwgMHhhMywKLSAgICAgICAgMHg5YywgMHg4MSwgMHhmYSwgMHg1NiwgMHg4YywgMHgyZCwgMHhjZSwgMHg2OCwgMHg0MCwgMHhjYiwgMHhmMSwKLSAgICAgICAgMHgzNywgMHhiZCwgMHg1ZSwgMHg4NSwgMHhlYSwgMHhkMSwgMHgwYywgMHhiYiwgMHgxOSwgMHg1NiwgMHgyMywKLSAgICAgICAgMHgyMCwgMHgxZiwgMHhhZCwgMHg1YywgMHg0MiwgMHgwOCwgMHgwMywgMHhiNSwgMHg1NSwgMHg5MSwgMHgwNCwKLSAgICAgICAgMHhjOSwgMHg4MCwgMHgzOCwgMHgwMCwgMHgwYSwgMHg3MSwgMHgzNCwgMHg2YywgMHgzMiwgMHgyNywgMHhlOSwKLSAgICAgICAgMHg1NSwgMHgyNSwgMHgxNSwgMHgyYywgMHg2OCwgMHhhMywgMHgzMCwgMHhlYiwgMHg1NCwgMHhhNSwgMHgxNSwKLSAgICAgICAgMHgwYywgMHhkMSwgMHgwMCwgMHhmZiwgMHhkOX07Ci0KLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBieXRlW10gc1Bob3RvQnl0ZUFycmF5Rm9yQ29tcGxpY2F0ZWRDYXNlOwotCi0gICAgc3RhdGljIHsKLSAgICAgICAgZmluYWwgaW50IGxlbmd0aCA9IHNQaG90b0ludEFycmF5Rm9yQ29tcGxpY2F0ZWRDYXNlLmxlbmd0aDsKLSAgICAgICAgc1Bob3RvQnl0ZUFycmF5Rm9yQ29tcGxpY2F0ZWRDYXNlID0gbmV3IGJ5dGVbbGVuZ3RoXTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotICAgICAgICAgICAgc1Bob3RvQnl0ZUFycmF5Rm9yQ29tcGxpY2F0ZWRDYXNlW2ldID0gKGJ5dGUpc1Bob3RvSW50QXJyYXlGb3JDb21wbGljYXRlZENhc2VbaV07Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VjIxU2ltcGxlQ2FzZTFfUGFyc2luZygpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JJbXBvcnRUZXN0KFYyMSwgUi5yYXcudjIxX3NpbXBsZV8xKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0oKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIk4iLCAiQW5kbztSb2lkOyIsIEFycmF5cy5hc0xpc3QoIkFuZG8iLCAiUm9pZCIsICIiKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFYyMVNpbXBsZUNhc2UxX1R5cGVfR2VuZXJpYygpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JJbXBvcnRUZXN0KFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfVjIxX0dFTkVSSUNfVVRGOCwgUi5yYXcudjIxX3NpbXBsZV8xKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0oKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZChTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRkFNSUxZX05BTUUsICJBbmRvIikKLSAgICAgICAgICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuR0lWRU5fTkFNRSwgIlJvaWQiKQotICAgICAgICAgICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5ESVNQTEFZX05BTUUsICJSb2lkIEFuZG8iKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VjIxU2ltcGxlQ2FzZTFfVHlwZV9KYXBhbmVzZSgpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JJbXBvcnRUZXN0KFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfVjIxX0pBUEFORVNFX1NKSVMsIFIucmF3LnYyMV9zaW1wbGVfMSk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWQoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkZBTUlMWV9OQU1FLCAiQW5kbyIpCi0gICAgICAgICAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkdJVkVOX05BTUUsICJSb2lkIikKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIG5hbWUtcmVsYXRlZCBzdHJpbmdzIG9ubHkgY29udGFpbnMgcHJpbnRhYmxlIEFzY2lpLAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIG9yZGVyIGlzIHJlbWFpbmVkIHRvIGJlIFVTJ3M6Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyAiUHJlZml4IEdpdmVuIE1pZGRsZSBGYW1pbHkgU3VmZml4IgotICAgICAgICAgICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5ESVNQTEFZX05BTUUsICJSb2lkIEFuZG8iKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VjIxU2ltcGxlQ2FzZTIoKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9ySW1wb3J0VGVzdChWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX1YyMV9KQVBBTkVTRV9TSklTLCBSLnJhdy52MjFfc2ltcGxlXzIpOwotICAgICAgICBtVmVyaWZpZXIuYWRkQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5ESVNQTEFZX05BTUUsICJBbmRvIFJvaWQiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VjIxU2ltcGxlQ2FzZTMoKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9ySW1wb3J0VGVzdChWMjEsIFIucmF3LnYyMV9zaW1wbGVfMyk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWQoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkZBTUlMWV9OQU1FLCAiQW5kbyIpCi0gICAgICAgICAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkdJVkVOX05BTUUsICJSb2lkIikKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vICJGTiIgZmllbGQgc2hvdWxkIGJlIHByZWZlcmVkIHNpbmNlIGl0IHNob3VsZCBjb250YWluIHRoZSBvcmlnaW5hbAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3JkZXIgaW50ZW5kZWQgYnkgdGhlIGF1dGhvciBvZiB0aGUgZmlsZS4KLSAgICAgICAgICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRElTUExBWV9OQU1FLCAiQW5kbyBSb2lkIik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgJzsnIGlzIHByb3Blcmx5IGhhbmRsZWQgYnkgVkNhcmRQYXJzZXIgaW1wbGVtZW50YXRpb24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFYyMUJhY2tzbGFzaENhc2VfUGFyc2luZygpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JJbXBvcnRUZXN0KFYyMSwgUi5yYXcudjIxX2JhY2tzbGFzaCk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJWRVJTSU9OIiwgIjIuMSIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiTiIsICI7QTtCXFw7Q1xcOztEOzpFO1xcXFw7IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoIiIsICJBO0JcXCIsICJDXFw7IiwgIkQiLCAiOkUiLCAiXFxcXCIsICIiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJGTiIsICJBO0JcXENcXDtEOkVcXFxcIik7Ci0gICAgICAgIAotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIENvbnRhY3RTdHJ1Y3QgY29ycmVjdGx5IGlnbm9yZXMgcmVkdW5kYW50IGZpZWxkcyBpbiAiTiIgcHJvcGVydHkgdmFsdWVzIGFuZAotICAgICAqIGluc2VydHMgbmFtZSByZWxhdGVkIGRhdGEuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFYyMUJhY2tzbGFzaENhc2UoKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9ySW1wb3J0VGVzdChWMjEsIFIucmF3LnYyMV9iYWNrc2xhc2gpOwotICAgICAgICBtVmVyaWZpZXIuYWRkQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gRkFNSUxZX05BTUUgaXMgZW1wdHkgYW5kIHJlbW92ZWQgaW4gdGhpcyB0ZXN0Li4uCi0gICAgICAgICAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkdJVkVOX05BTUUsICJBO0JcXCIpCi0gICAgICAgICAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLk1JRERMRV9OQU1FLCAiQ1xcOyIpCi0gICAgICAgICAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBSRUZJWCwgIkQiKQotICAgICAgICAgICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5TVUZGSVgsICI6RSIpCi0gICAgICAgICAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkRJU1BMQVlfTkFNRSwgIkE7QlxcQ1xcO0Q6RVxcXFwiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0T3JnQmVmb3JUaXRsZSgpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JJbXBvcnRUZXN0KFYyMSwgUi5yYXcudjIxX29yZ19iZWZvcmVfdGl0bGUpOwotICAgICAgICBDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtIGVsZW0gPSBtVmVyaWZpZXIuYWRkQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSgpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRElTUExBWV9OQU1FLCAiTm9ybWFsIEd1eSIpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKE9yZ2FuaXphdGlvbi5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KE9yZ2FuaXphdGlvbi5DT01QQU5ZLCAiQ29tcGFueSIpCi0gICAgICAgICAgICAgICAgLnB1dChPcmdhbml6YXRpb24uREVQQVJUTUVOVCwgIk9yZ2FuaXphdGlvbiBEZXZpc2lvbiBSb29tIFNoZWV0IE5vLiIpCi0gICAgICAgICAgICAgICAgLnB1dChPcmdhbml6YXRpb24uVElUTEUsICJFeGNlbGxlbnQgSmFuaXRvciIpCi0gICAgICAgICAgICAgICAgLnB1dChPcmdhbml6YXRpb24uVFlQRSwgT3JnYW5pemF0aW9uLlRZUEVfV09SSyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFRpdGxlQmVmb3JPcmcoKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9ySW1wb3J0VGVzdChWMjEsIFIucmF3LnYyMV90aXRsZV9iZWZvcmVfb3JnKTsKLSAgICAgICAgQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSBlbGVtID0gbVZlcmlmaWVyLmFkZENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0oKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkRJU1BMQVlfTkFNRSwgIk5pY2UgR3V5Iik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoT3JnYW5pemF0aW9uLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoT3JnYW5pemF0aW9uLkNPTVBBTlksICJNYXJ2ZXJvdXMiKQotICAgICAgICAgICAgICAgIC5wdXQoT3JnYW5pemF0aW9uLkRFUEFSVE1FTlQsICJQZXJmZWN0IEdyZWF0IEdvb2QgQmFkIFBvb3IiKQotICAgICAgICAgICAgICAgIC5wdXQoT3JnYW5pemF0aW9uLlRJVExFLCAiQ29vbCBUaXRsZSIpCi0gICAgICAgICAgICAgICAgLnB1dChPcmdhbml6YXRpb24uVFlQRSwgT3JnYW5pemF0aW9uLlRZUEVfV09SSyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVmVyaWZpZXMgdGhhdCB2Q2FyZCBpbXBvcnRlciBjb3JyZWN0bHkgaW50ZXJwcmV0ICJQUkVGIiBhdHRyaWJ1dGUgdG8gSVNfUFJJTUFSWS4KLSAgICAgKiBUaGUgZGF0YSBjb250YWluIHRocmVlIGNhc2VzOiBvbmUgIlBSRUYiLCBubyAiUFJFRiIgYW5kIG11bHRpcGxlICJQUkVGIiwgaW4gZWFjaCB0eXBlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RWMjFQcmVmVG9Jc1ByaW1hcnkoKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9ySW1wb3J0VGVzdChWMjEsIFIucmF3LnYyMV9wcmVmX2hhbmRsaW5nKTsKLSAgICAgICAgQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSBlbGVtID0gbVZlcmlmaWVyLmFkZENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0oKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KERhdGEuTUlNRVRZUEUsIFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRElTUExBWV9OQU1FLCAiU21pdGgiKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjEiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9IT01FKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjIiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9XT1JLKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuSVNfUFJJTUFSWSwgMSk7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIzIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfSVNETik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoRW1haWwuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChFbWFpbC5EQVRBLCAidGVzdEBleGFtcGxlLmNvbSIpCi0gICAgICAgICAgICAgICAgLnB1dChFbWFpbC5UWVBFLCBFbWFpbC5UWVBFX0hPTUUpCi0gICAgICAgICAgICAgICAgLnB1dChFbWFpbC5JU19QUklNQVJZLCAxKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChFbWFpbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KEVtYWlsLkRBVEEsICJ0ZXN0MkBleGFtaW5hdGlvbi5jb20iKQotICAgICAgICAgICAgICAgIC5wdXQoRW1haWwuVFlQRSwgRW1haWwuVFlQRV9NT0JJTEUpCi0gICAgICAgICAgICAgICAgLnB1dChFbWFpbC5JU19QUklNQVJZLCAxKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChPcmdhbml6YXRpb24uQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChPcmdhbml6YXRpb24uQ09NUEFOWSwgIkNvbXBhbnkiKQotICAgICAgICAgICAgICAgIC5wdXQoT3JnYW5pemF0aW9uLlRJVExFLCAiRW5naW5lZXIiKQotICAgICAgICAgICAgICAgIC5wdXQoT3JnYW5pemF0aW9uLlRZUEUsIE9yZ2FuaXphdGlvbi5UWVBFX1dPUkspOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKE9yZ2FuaXphdGlvbi5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KE9yZ2FuaXphdGlvbi5DT01QQU5ZLCAiTXlzdGVyeSIpCi0gICAgICAgICAgICAgICAgLnB1dChPcmdhbml6YXRpb24uVElUTEUsICJCbG9nZ2VyIikKLSAgICAgICAgICAgICAgICAucHV0KE9yZ2FuaXphdGlvbi5UWVBFLCBPcmdhbml6YXRpb24uVFlQRV9XT1JLKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChPcmdhbml6YXRpb24uQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChPcmdhbml6YXRpb24uQ09NUEFOWSwgIlBvZXRyeSIpCi0gICAgICAgICAgICAgICAgLnB1dChPcmdhbml6YXRpb24uVElUTEUsICJQb2V0IikKLSAgICAgICAgICAgICAgICAucHV0KE9yZ2FuaXphdGlvbi5UWVBFLCBPcmdhbml6YXRpb24uVFlQRV9XT1JLKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyBhbGwgdGhlIHByb3BlcnRpZXMgaW4gYSBjb21wbGljYXRlZCB2Q2FyZCBhcmUgY29ycmVjdGx5IHBhcnNlZCBieSB0aGUgVkNhcmRQYXJzZXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFYyMUNvbXBsaWNhdGVkQ2FzZV9QYXJzaW5nKCkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckltcG9ydFRlc3QoVjIxLCBSLnJhdy52MjFfY29tcGxpY2F0ZWQpOwotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiVkVSU0lPTiIsICIyLjEiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIk4iLCAiR3VtcDtGb3JyZXN0O0hvZ2U7UG9zO1RhbyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KCJHdW1wIiwgIkZvcnJlc3QiLCAiSG9nZSIsICJQb3MiLCAiVGFvIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiRk4iLCAiSm9lIER1ZSIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiT1JHIiwgIkd1bXAgU2hyaW1wIENvLjtTYWxlcyBEZXB0LjtNYW5hZ2VyO0Zpc2gga2VlcGVyIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoIkd1bXAgU2hyaW1wIENvLiIsICJTYWxlcyBEZXB0LjtNYW5hZ2VyIiwgIkZpc2gga2VlcGVyIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiUk9MRSIsICJGaXNoIENha2UgS2VlcGVyISIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiVElUTEUiLCAiU2hyaW1wIE1hbiIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiWC1DTEFTUyIsICJQVUJMSUMiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIlRFTCIsICIoMTExKSA1NTUtMTIxMiIsIG5ldyBUeXBlU2V0KCJXT1JLIiwgIlZPSUNFIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiVEVMIiwgIig0MDQpIDU1NS0xMjEyIiwgbmV3IFR5cGVTZXQoIkhPTUUiLCAiVk9JQ0UiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJURUwiLCAiMDMxMTExMTExMSIsIG5ldyBUeXBlU2V0KCJDRUxMIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiVEVMIiwgIjAzMjIyMjIyMjIiLCBuZXcgVHlwZVNldCgiVklERU8iKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJURUwiLCAiMDMzMzMzMzMzMyIsIG5ldyBUeXBlU2V0KCJWT0lDRSIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIkFEUiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiOzsxMDAgV2F0ZXJzIEVkZ2U7QmF5dG93bjtMQTszMDMxNDtVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EiLAotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgiIiwgIiIsICIxMDAgV2F0ZXJzIEVkZ2UiLCAiQmF5dG93biIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMQSIsICIzMDMxNCIsICJVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgbmV3IFR5cGVTZXQoIldPUksiKSwgbnVsbCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJMQUJFTCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiMTAwIFdhdGVycyBFZGdlXHJcbkJheXRvd24sIExBIDMwMzE0XHJcblVuaXRlZCAgU3RhdGVzIG9mIEFtZXJpY2EiLAotICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgbUNvbnRlbnRWYWx1ZXNGb3JRUCwgbmV3IFR5cGVTZXQoIldPUksiKSwgbnVsbCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJBRFIiLAotICAgICAgICAgICAgICAgICAgICAgICAgIjs7NDIgUGxhbnRhdGlvbiBTdC47QmF5dG93bjtMQTszMDMxNDtVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EiLAotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgiIiwgIiIsICI0MiBQbGFudGF0aW9uIFN0LiIsICJCYXl0b3duIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxBIiwgIjMwMzE0IiwgIlVuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYSIpLCBudWxsLCBudWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgVHlwZVNldCgiSE9NRSIpLCBudWxsKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIkxBQkVMIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICI0MiBQbGFudGF0aW9uIFN0LlxyXG5CYXl0b3duLCBMQSAzMDMxNFxyXG5Vbml0ZWQgIFN0YXRlcyBvZiBBbWVyaWNhIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIG1Db250ZW50VmFsdWVzRm9yUVAsCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgVHlwZVNldCgiSE9NRSIpLCBudWxsKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIkVNQUlMIiwgImZvcnJlc3RndW1wQHdhbGxhZGFsbGEuY29tIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBUeXBlU2V0KCJQUkVGIiwgIklOVEVSTkVUIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiRU1BSUwiLCAiY2VsbEBleGFtcGxlLmNvbSIsIG5ldyBUeXBlU2V0KCJDRUxMIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiTk9URSIsICJUaGUgZm9sbG93aW5nIG5vdGUgaXMgdGhlIGV4YW1wbGUgZnJvbSBSRkMgMjA0NS4iKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIk5PVEUiLAotICAgICAgICAgICAgICAgICAgICAgICAgIk5vdydzIHRoZSB0aW1lIGZvciBhbGwgZm9sayB0byBjb21lIHRvIHRoZSBhaWQgb2YgdGhlaXIgY291bnRyeS4iLAotICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgbUNvbnRlbnRWYWx1ZXNGb3JRUCwgbnVsbCwgbnVsbCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJQSE9UTyIsIG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBzUGhvdG9CeXRlQXJyYXlGb3JDb21wbGljYXRlZENhc2UsIG1Db250ZW50VmFsdWVzRm9yQmFzZTY0VjIxLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFR5cGVTZXQoIkpQRUciKSwgbnVsbCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJYLUFUVFJJQlVURSIsICJTb21lIFN0cmluZyIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiQkRBWSIsICIxOTgwMDEwMSIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiR0VPIiwgIjM1LjY1NjM4NTQsMTM5LjY5OTQyMzMiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIlVSTCIsICJodHRwOi8vd3d3LmV4YW1wbGUuY29tLyIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiUkVWIiwgIjIwMDgwNDI0VDE5NTI0M1oiKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVja3MgQ29udGFjdFN0cnVjdCBjb3JyZWN0bHkgaW5zZXJ0cyB2YWx1ZXMgaW4gYSBjb21wbGljYXRlZCB2Q2FyZAotICAgICAqIGludG8gQ29udGVudFJlc29sdmVyLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RWMjFDb21wbGljYXRlZENhc2UoKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9ySW1wb3J0VGVzdChWMjEsIFIucmF3LnYyMV9jb21wbGljYXRlZCk7Ci0gICAgICAgIENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0gZWxlbSA9IG1WZXJpZmllci5hZGRDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtKCk7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgIkd1bXAiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuR0lWRU5fTkFNRSwgIkZvcnJlc3QiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuTUlERExFX05BTUUsICJIb2dlIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBSRUZJWCwgIlBvcyIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5TVUZGSVgsICJUYW8iKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRElTUExBWV9OQU1FLCAiSm9lIER1ZSIpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKE9yZ2FuaXphdGlvbi5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KE9yZ2FuaXphdGlvbi5UWVBFLCBPcmdhbml6YXRpb24uVFlQRV9XT1JLKQotICAgICAgICAgICAgICAgIC5wdXQoT3JnYW5pemF0aW9uLkNPTVBBTlksICJHdW1wIFNocmltcCBDby4iKQotICAgICAgICAgICAgICAgIC5wdXQoT3JnYW5pemF0aW9uLkRFUEFSVE1FTlQsICJTYWxlcyBEZXB0LjtNYW5hZ2VyIEZpc2gga2VlcGVyIikKLSAgICAgICAgICAgICAgICAucHV0KE9yZ2FuaXphdGlvbi5USVRMRSwgIlNocmltcCBNYW4iKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfV09SSykKLSAgICAgICAgICAgICAgICAvLyBQaG9uZSBudW1iZXIgaXMgZXhwZWN0ZWQgdG8gYmUgZm9ybWF0ZWQgd2l0aCBOQU1QIGZvcm1hdCBpbiBkZWZhdWx0LgotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMTExLTU1NS0xMjEyIik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0hPTUUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICI0MDQtNTU1LTEyMTIiKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfTU9CSUxFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMDMxLTExMS0xMTExIik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0NVU1RPTSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLkxBQkVMLCAiVklERU8iKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMDMyLTIyMi0yMjIyIik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0NVU1RPTSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLkxBQkVMLCAiVk9JQ0UiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMDMzLTMzMy0zMzMzIik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoU3RydWN0dXJlZFBvc3RhbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuVFlQRSwgU3RydWN0dXJlZFBvc3RhbC5UWVBFX1dPUkspCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLkNPVU5UUlksICJVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5QT1NUQ09ERSwgIjMwMzE0IikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuUkVHSU9OLCAiTEEiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5DSVRZLCAiQmF5dG93biIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlNUUkVFVCwgIjEwMCBXYXRlcnMgRWRnZSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLkZPUk1BVFRFRF9BRERSRVNTLAotICAgICAgICAgICAgICAgICAgICAgICAgIjEwMCBXYXRlcnMgRWRnZSBCYXl0b3duIExBIDMwMzE0IFVuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYSIpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFN0cnVjdHVyZWRQb3N0YWwuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlRZUEUsIFN0cnVjdHVyZWRQb3N0YWwuVFlQRV9IT01FKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5DT1VOVFJZLCAiVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuUE9TVENPREUsICIzMDMxNCIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlJFR0lPTiwgIkxBIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuQ0lUWSwgIkJheXRvd24iKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5TVFJFRVQsICI0MiBQbGFudGF0aW9uIFN0LiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLkZPUk1BVFRFRF9BRERSRVNTLAotICAgICAgICAgICAgICAgICAgICAgICAgIjQyIFBsYW50YXRpb24gU3QuIEJheXRvd24gTEEgMzAzMTQgVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhIik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoRW1haWwuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLy8gIlRZUEU9SU5URVJORVQiIC0+IFRZUEVfQ1VTVE9NICsgdGhlIGxhYmVsICJJTlRFUk5FVCIKLSAgICAgICAgICAgICAgICAucHV0KEVtYWlsLlRZUEUsIEVtYWlsLlRZUEVfQ1VTVE9NKQotICAgICAgICAgICAgICAgIC5wdXQoRW1haWwuTEFCRUwsICJJTlRFUk5FVCIpCi0gICAgICAgICAgICAgICAgLnB1dChFbWFpbC5EQVRBLCAiZm9ycmVzdGd1bXBAd2FsbGFkYWxsYS5jb20iKQotICAgICAgICAgICAgICAgIC5wdXQoRW1haWwuSVNfUFJJTUFSWSwgMSk7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoRW1haWwuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChFbWFpbC5UWVBFLCBFbWFpbC5UWVBFX01PQklMRSkKLSAgICAgICAgICAgICAgICAucHV0KEVtYWlsLkRBVEEsICJjZWxsQGV4YW1wbGUuY29tIik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoTm90ZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KE5vdGUuTk9URSwgIlRoZSBmb2xsb3dpbmcgbm90ZSBpcyB0aGUgZXhhbXBsZSBmcm9tIFJGQyAyMDQ1LiIpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKE5vdGUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChOb3RlLk5PVEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAiTm93J3MgdGhlIHRpbWUgZm9yIGFsbCBmb2xrIHRvIGNvbWUgdG8gdGhlIGFpZCBvZiB0aGVpciBjb3VudHJ5LiIpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFBob3RvLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC8vIE5vIGluZm9ybWF0aW9uIGFib3V0IGl0cyBpbWFnZSBmb3JtYXQgY2FuIGJlIGluc2VydGVkLgotICAgICAgICAgICAgICAgIC5wdXQoUGhvdG8uUEhPVE8sIHNQaG90b0J5dGVBcnJheUZvckNvbXBsaWNhdGVkQ2FzZSk7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoRXZlbnQuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChFdmVudC5TVEFSVF9EQVRFLCAiMTk4MDAxMDEiKQotICAgICAgICAgICAgICAgIC5wdXQoRXZlbnQuVFlQRSwgRXZlbnQuVFlQRV9CSVJUSERBWSk7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoV2Vic2l0ZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFdlYnNpdGUuVVJMLCAiaHR0cDovL3d3dy5leGFtcGxlLmNvbS8iKQotICAgICAgICAgICAgICAgIC5wdXQoV2Vic2l0ZS5UWVBFLCBXZWJzaXRlLlRZUEVfSE9NRVBBR0UpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RWMzBTaW1wbGVfUGFyc2luZygpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JJbXBvcnRUZXN0KFYzMCwgUi5yYXcudjMwX3NpbXBsZSk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJWRVJTSU9OIiwgIjMuMCIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiRk4iLCAiQW5kIFJvaWQiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIk4iLCAiQW5kO1JvaWQ7OzsiLCBBcnJheXMuYXNMaXN0KCJBbmQiLCAiUm9pZCIsICIiLCAiIiwgIiIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIk9SRyIsICJPcGVuO0hhbmRzZXQ7IEFsbGlhbmNlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoIk9wZW4iLCAiSGFuZHNldCIsICIgQWxsaWFuY2UiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJTT1JULVNUUklORyIsICJhbmRyb2lkIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJURUwiLCAiMDMwMDAwMDAwMCIsIG5ldyBUeXBlU2V0KCJQUkVGIiwgIlZPSUNFIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiQ0xBU1MiLCAiUFVCTElDIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJYLUdOTyIsICIwIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJYLUdOIiwgImdyb3VwMCIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiWC1SRURVQ1RJT04iLCAiMCIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiUkVWIiwgIjIwMDgxMDMxVDA2NTg1NFoiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VjMwU2ltcGxlKCkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckltcG9ydFRlc3QoVjMwLCBSLnJhdy52MzBfc2ltcGxlKTsKLSAgICAgICAgQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSBlbGVtID0gbVZlcmlmaWVyLmFkZENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0oKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkZBTUlMWV9OQU1FLCAiQW5kIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkdJVkVOX05BTUUsICJSb2lkIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkRJU1BMQVlfTkFNRSwgIkFuZCBSb2lkIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0dJVkVOX05BTUUsICJhbmRyb2lkIik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoT3JnYW5pemF0aW9uLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoT3JnYW5pemF0aW9uLkNPTVBBTlksICJPcGVuIikKLSAgICAgICAgICAgICAgICAucHV0KE9yZ2FuaXphdGlvbi5ERVBBUlRNRU5ULCAiSGFuZHNldCAgQWxsaWFuY2UiKQotICAgICAgICAgICAgICAgIC5wdXQoT3JnYW5pemF0aW9uLlRZUEUsIE9yZ2FuaXphdGlvbi5UWVBFX1dPUkspOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9DVVNUT00pCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5MQUJFTCwgIlZPSUNFIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjAzMC0wMDAtMDAwMCIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5JU19QUklNQVJZLCAxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VjIxSmFwYW5lc2UxX1BhcnNpbmcoKSB7Ci0gICAgICAgIC8vIFRob3VnaCBKYXBhbmVzZSBjYXJlZXJzIGFwcGVuZCAiOzs7OyIgYXQgdGhlIGVuZCBvZiB0aGUgdmFsdWUgb2YgIlNPVU5EIiwKLSAgICAgICAgLy8gdkNhcmQgMi4xLzMuMCBzcGVjaWZpY2F0aW9uIGRvZXMgbm90IGFsbG93IG11bHRpcGxlIHZhbHVlcy4KLSAgICAgICAgLy8gRG8gbm90IG5lZWQgdG8gaGFuZGxlIGl0IGFzIG11bHRpcGxlIHZhbHVlcy4KLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JJbXBvcnRUZXN0KFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfVjIxX0pBUEFORVNFX1NKSVMsCi0gICAgICAgICAgICAgICAgUi5yYXcudjIxX2phcGFuZXNlXzEpOwotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiVkVSU0lPTiIsICIyLjEiLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIk4iLCAiXHU1Qjg5XHU4NUU0XHUzMEVEXHUzMEE0XHUzMEM5Ozs7OyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KCJcdTVCODlcdTg1RTRcdTMwRURcdTMwQTRcdTMwQzkiLCAiIiwgIiIsICIiLCAiIiksCi0gICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBtQ29udGVudFZhbHVlc0ZvclNKaXMsIG51bGwsIG51bGwpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiU09VTkQiLAotICAgICAgICAgICAgICAgICAgICAgICAgIlx1RkY3MVx1RkY5RFx1RkY4NFx1RkY5RVx1RkY3M1x1RkY5Qlx1RkY3Mlx1RkY4NFx1RkY5RTs7OzsiLAotICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgbUNvbnRlbnRWYWx1ZXNGb3JTSmlzLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFR5cGVTZXQoIlgtSVJNQy1OIiksIG51bGwpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiVEVMIiwgIjAzMDAwMDAwMDAiLCBudWxsLCBudWxsLCBudWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFR5cGVTZXQoIlZPSUNFIiwgIlBSRUYiKSwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RWMjFKYXBhbmVzZTFDb21tb24oaW50IHJlc0lkLCBpbnQgdmNhcmRUeXBlLCBib29sZWFuIGphcGFuZXNlKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9ySW1wb3J0VGVzdCh2Y2FyZFR5cGUsIHJlc0lkKTsKLSAgICAgICAgQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSBlbGVtID0gbVZlcmlmaWVyLmFkZENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0oKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkZBTUlMWV9OQU1FLCAiXHU1Qjg5XHU4NUU0XHUzMEVEXHUzMEE0XHUzMEM5IikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkRJU1BMQVlfTkFNRSwgIlx1NUI4OVx1ODVFNFx1MzBFRFx1MzBBNFx1MzBDOSIpCi0gICAgICAgICAgICAgICAgLy8gV2hpbGUgdkNhcmQgcGFyc2VyIGRvZXMgbm90IHNwbGl0ICJTT1VORCIgcHJvcGVydHkgdmFsdWVzLAotICAgICAgICAgICAgICAgIC8vIENvbnRhY3RTdHJ1Y3QgY2FyZSBpdC4KLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0dJVkVOX05BTUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHVGRjcxXHVGRjlEXHVGRjg0XHVGRjlFXHVGRjczXHVGRjlCXHVGRjcyXHVGRjg0XHVGRjlFIik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLy8gUGhvbmUgbnVtYmVyIGZvcm1hdHRpbmcgaXMgZGlmZmVyZW50LgotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAoamFwYW5lc2UgPyAiMDMtMDAwMC0wMDAwIiA6ICIwMzAtMDAwLTAwMDAiKSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfQ1VTVE9NKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTEFCRUwsICJWT0lDRSIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5JU19QUklNQVJZLCAxKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBWZXJpZmllcyB2Q2FyZCB3aXRoIEphcGFuZXNlIGNhbiBiZSBwYXJzZWQgY29ycmVjdGx5IHdpdGgKLSAgICAgKiB7QGxpbmsgYW5kcm9pZC5waW0udmNhcmQuVkNhcmRDb25maWcjVkNBUkRfVFlQRV9WMjFfR0VORVJJQ19VVEY4fS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VjIxSmFwYW5lc2UxX1R5cGVfR2VuZXJpY19VdGY4KCkgewotICAgICAgICB0ZXN0VjIxSmFwYW5lc2UxQ29tbW9uKAotICAgICAgICAgICAgICAgIFIucmF3LnYyMV9qYXBhbmVzZV8xLCBWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX1YyMV9HRU5FUklDX1VURjgsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBWZXJpZmllcyB2Q2FyZCB3aXRoIEphcGFuZXNlIGNhbiBiZSBwYXJzZWQgY29ycmVjdGx5IHdpdGgKLSAgICAgKiB7QGxpbmsgYW5kcm9pZC5waW0udmNhcmQuVkNhcmRDb25maWcjVkNBUkRfVFlQRV9WMjFfSkFQQU5FU0VfU0pJU30uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFYyMUphcGFuZXNlMV9UeXBlX0phcGFuZXNlX1NqaXMoKSB7Ci0gICAgICAgIHRlc3RWMjFKYXBhbmVzZTFDb21tb24oCi0gICAgICAgICAgICAgICAgUi5yYXcudjIxX2phcGFuZXNlXzEsIFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfVjIxX0pBUEFORVNFX1NKSVMsIHRydWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFZlcmlmaWVzIHZDYXJkIHdpdGggSmFwYW5lc2UgY2FuIGJlIHBhcnNlZCBjb3JyZWN0bHkgd2l0aAotICAgICAqIHtAbGluayBhbmRyb2lkLnBpbS52Y2FyZC5WQ2FyZENvbmZpZyNWQ0FSRF9UWVBFX1YyMV9KQVBBTkVTRV9VVEY4fS4KLSAgICAgKiBzaW5jZSB2Q2FyZCAyLjEgc3BlY2lmaWVzIHRoZSBjaGFyc2V0IG9mIGVhY2ggbGluZSBpZiBpdCBjb250YWlucyBub24tQXNjaWkuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFYyMUphcGFuZXNlMV9UeXBlX0phcGFuZXNlX1V0ZjgoKSB7Ci0gICAgICAgIHRlc3RWMjFKYXBhbmVzZTFDb21tb24oCi0gICAgICAgICAgICAgICAgUi5yYXcudjIxX2phcGFuZXNlXzEsIFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfVjIxX0pBUEFORVNFX1VURjgsIHRydWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RWMjFKYXBhbmVzZTJfUGFyc2luZygpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JJbXBvcnRUZXN0KFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfVjIxX0pBUEFORVNFX1NKSVMsCi0gICAgICAgICAgICAgICAgUi5yYXcudjIxX2phcGFuZXNlXzIpOwotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiVkVSU0lPTiIsICIyLjEiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIk4iLCAiXHU1Qjg5XHU4NUU0O1x1MzBFRFx1MzBBNFx1MzBDOVx1MDAzMTs7OyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KCJcdTVCODlcdTg1RTQiLCAiXHUzMEVEXHUzMEE0XHUzMEM5XHUwMDMxIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIsICIiLCAiIiksCi0gICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBtQ29udGVudFZhbHVlc0ZvclNKaXMsIG51bGwsIG51bGwpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiRk4iLCAiXHU1Qjg5XHU4NUU0XHUwMDIwXHUzMEVEXHUzMEE0XHUzMEM5XHUwMDIwXHUwMDMxIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIG1Db250ZW50VmFsdWVzRm9yU0ppcywgbnVsbCwgbnVsbCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJTT1VORCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHVGRjcxXHVGRjlEXHVGRjg0XHVGRjlFXHVGRjczO1x1RkY5Qlx1RkY3Mlx1RkY4NFx1RkY5RVx1MDAzMTs7OyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBudWxsLCBtQ29udGVudFZhbHVlc0ZvclNKaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgVHlwZVNldCgiWC1JUk1DLU4iKSwgbnVsbCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJBRFIiLAotICAgICAgICAgICAgICAgICAgICAgICAgIjtcdTY3NzFcdTRFQUNcdTkwRkRcdTZFMEJcdThDMzdcdTUzM0FcdTY4NUMiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJcdTRFMThcdTc1M0FcdTAwMzJcdTAwMzZcdTAwMkRcdTAwMzFcdTMwQkIiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJcdTMwRUJcdTMwRUFcdTMwQTJcdTMwRjNcdTMwQkZcdTMwRUZcdTMwRkNcdTAwMzYiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJcdTk2OEU7Ozs7MTUwLTg1MTI7IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTY3NzFcdTRFQUNcdTkwRkRcdTZFMEJcdThDMzdcdTUzM0FcdTY4NUMiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1NEUxOFx1NzUzQVx1MDAzMlx1MDAzNlx1MDAyRFx1MDAzMVx1MzBCQiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHUzMEVCXHUzMEVBXHUzMEEyXHUzMEYzXHUzMEJGXHUzMEVGXHUzMEZDIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTAwMzZcdTk2OEUiLCAiIiwgIiIsICIiLCAiMTUwLTg1MTIiLCAiIiksCi0gICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBtQ29udGVudFZhbHVlc0ZvclFQQW5kU0ppcywgbmV3IFR5cGVTZXQoIkhPTUUiKSwgbnVsbCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJOT1RFIiwgIlx1MzBFMVx1MzBFMiIsIG51bGwsIG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICBtQ29udGVudFZhbHVlc0ZvclFQQW5kU0ppcywgbnVsbCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFYyMUphcGFuZXNlMl9UeXBlX0dlbmVyaWNfVXRmOCgpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JJbXBvcnRUZXN0KFYyMSwgUi5yYXcudjIxX2phcGFuZXNlXzIpOwotICAgICAgICBDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtIGVsZW0gPSBtVmVyaWZpZXIuYWRkQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSgpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRkFNSUxZX05BTUUsICJcdTVCODlcdTg1RTQiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuR0lWRU5fTkFNRSwgIlx1MzBFRFx1MzBBNFx1MzBDOVx1MDAzMSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5ESVNQTEFZX05BTUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHU1Qjg5XHU4NUU0XHUwMDIwXHUzMEVEXHUzMEE0XHUzMEM5XHUwMDIwXHUwMDMxIikKLSAgICAgICAgICAgICAgICAvLyBDb250YWN0U3RydWN0IHNob3VsZCBjb3JyZWN0bHkgc3BsaXQgIlNPVU5EIiBwcm9wZXJ0eSBpbnRvIHNldmVyYWwgZWxlbWVudHMsCi0gICAgICAgICAgICAgICAgLy8gZXZlbiB0aG91Z2ggVkNhcmRQYXJzZXIgc2lkZSBkb2VzIG5vdCBjYXJlIGl0LgotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfRkFNSUxZX05BTUUsICJcdUZGNzFcdUZGOURcdUZGODRcdUZGOUVcdUZGNzMiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfR0lWRU5fTkFNRSwgIlx1RkY5Qlx1RkY3Mlx1RkY4NFx1RkY5RVx1MDAzMSIpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFN0cnVjdHVyZWRQb3N0YWwuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlBPU1RDT0RFLCAiMTUwLTg1MTIiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5TVFJFRVQsCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHU2NzcxXHU0RUFDXHU5MEZEXHU2RTBCXHU4QzM3XHU1MzNBXHU2ODVDIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHU0RTE4XHU3NTNBXHUwMDMyXHUwMDM2XHUwMDJEXHUwMDMxXHUzMEJCIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHUzMEVCXHUzMEVBXHUzMEEyXHUzMEYzXHUzMEJGXHUzMEVGXHUzMEZDIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHUwMDM2XHU5NjhFIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuRk9STUFUVEVEX0FERFJFU1MsCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHU2NzcxXHU0RUFDXHU5MEZEXHU2RTBCXHU4QzM3XHU1MzNBXHU2ODVDIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHU0RTE4XHU3NTNBXHUwMDMyXHUwMDM2XHUwMDJEXHUwMDMxXHUzMEJCIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHUzMEVCXHUzMEVBXHUzMEEyXHUzMEYzXHUzMEJGXHUzMEVGXHUzMEZDIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHUwMDM2XHU5NjhFIDE1MC04NTEyIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuVFlQRSwgU3RydWN0dXJlZFBvc3RhbC5UWVBFX0hPTUUpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKE5vdGUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChOb3RlLk5PVEUsICJcdTMwRTFcdTMwRTIiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VjIxTXVsdGlwbGVFbnRyeUNhc2VfUGFyc2UoKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9ySW1wb3J0VGVzdChWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX1YyMV9KQVBBTkVTRV9TSklTLAotICAgICAgICAgICAgICAgIFIucmF3LnYyMV9tdWx0aXBsZV9lbnRyeSk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJWRVJTSU9OIiwgIjIuMSIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiTiIsICJcdTVCODlcdTg1RTRcdTMwRURcdTMwQTRcdTMwQzlcdTAwMzM7Ozs7IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoIlx1NUI4OVx1ODVFNFx1MzBFRFx1MzBBNFx1MzBDOVx1MDAzMyIsICIiLCAiIiwgIiIsICIiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIG1Db250ZW50VmFsdWVzRm9yU0ppcywgbnVsbCwgbnVsbCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJTT1VORCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHVGRjcxXHVGRjlEXHVGRjg0XHVGRjlFXHVGRjczXHVGRjlCXHVGRjcyXHVGRjg0XHVGRjlFXHUwMDMzOzs7OyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBudWxsLCBtQ29udGVudFZhbHVlc0ZvclNKaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgVHlwZVNldCgiWC1JUk1DLU4iKSwgbnVsbCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJURUwiLCAiOSIsIG5ldyBUeXBlU2V0KCJYLU5FQy1TRUNSRVQiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJURUwiLCAiMTAiLCBuZXcgVHlwZVNldCgiWC1ORUMtSE9URUwiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJURUwiLCAiMTEiLCBuZXcgVHlwZVNldCgiWC1ORUMtU0NIT09MIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiVEVMIiwgIjEyIiwgbmV3IFR5cGVTZXQoIkZBWCIsICJIT01FIikpOwotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiVkVSU0lPTiIsICIyLjEiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIk4iLCAiXHU1Qjg5XHU4NUU0XHUzMEVEXHUzMEE0XHUzMEM5XHUwMDM0Ozs7OyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KCJcdTVCODlcdTg1RTRcdTMwRURcdTMwQTRcdTMwQzlcdTAwMzQiLCAiIiwgIiIsICIiLCAiIiksCi0gICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBtQ29udGVudFZhbHVlc0ZvclNKaXMsIG51bGwsIG51bGwpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiU09VTkQiLAotICAgICAgICAgICAgICAgICAgICAgICAgIlx1RkY3MVx1RkY5RFx1RkY4NFx1RkY5RVx1RkY3M1x1RkY5Qlx1RkY3Mlx1RkY4NFx1RkY5RVx1MDAzNDs7OzsiLAotICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgbUNvbnRlbnRWYWx1ZXNGb3JTSmlzLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFR5cGVTZXQoIlgtSVJNQy1OIiksIG51bGwpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiVEVMIiwgIjEzIiwgbmV3IFR5cGVTZXQoIk1PREVNIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiVEVMIiwgIjE0IiwgbmV3IFR5cGVTZXQoIlBBR0VSIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiVEVMIiwgIjE1IiwgbmV3IFR5cGVTZXQoIlgtTkVDLUZBTUlMWSIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIlRFTCIsICIxNiIsIG5ldyBUeXBlU2V0KCJYLU5FQy1HSVJMIikpOwotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiVkVSU0lPTiIsICIyLjEiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIk4iLCAiXHU1Qjg5XHU4NUU0XHUzMEVEXHUzMEE0XHUzMEM5XHUwMDM1Ozs7OyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KCJcdTVCODlcdTg1RTRcdTMwRURcdTMwQTRcdTMwQzlcdTAwMzUiLCAiIiwgIiIsICIiLCAiIiksCi0gICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBtQ29udGVudFZhbHVlc0ZvclNKaXMsIG51bGwsIG51bGwpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiU09VTkQiLAotICAgICAgICAgICAgICAgICAgICAgICAgIlx1RkY3MVx1RkY5RFx1RkY4NFx1RkY5RVx1RkY3M1x1RkY5Qlx1RkY3Mlx1RkY4NFx1RkY5RVx1MDAzNTs7OzsiLAotICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgbUNvbnRlbnRWYWx1ZXNGb3JTSmlzLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFR5cGVTZXQoIlgtSVJNQy1OIiksIG51bGwpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiVEVMIiwgIjE3IiwgbmV3IFR5cGVTZXQoIlgtTkVDLUJPWSIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIlRFTCIsICIxOCIsIG5ldyBUeXBlU2V0KCJYLU5FQy1GUklFTkQiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJURUwiLCAiMTkiLCBuZXcgVHlwZVNldCgiWC1ORUMtUEhTIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiVEVMIiwgIjIwIiwgbmV3IFR5cGVTZXQoIlgtTkVDLVJFU1RBVVJBTlQiKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFYyMU11bHRpcGxlRW50cnlDYXNlKCkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckltcG9ydFRlc3QoVkNhcmRDb25maWcuVkNBUkRfVFlQRV9WMjFfSkFQQU5FU0VfU0pJUywKLSAgICAgICAgICAgICAgICBSLnJhdy52MjFfbXVsdGlwbGVfZW50cnkpOwotICAgICAgICBDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtIGVsZW0gPSBtVmVyaWZpZXIuYWRkQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSgpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRkFNSUxZX05BTUUsICJcdTVCODlcdTg1RTRcdTMwRURcdTMwQTRcdTMwQzlcdTAwMzMiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRElTUExBWV9OQU1FLCAiXHU1Qjg5XHU4NUU0XHUzMEVEXHUzMEE0XHUzMEM5XHUwMDMzIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0dJVkVOX05BTUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHVGRjcxXHVGRjlEXHVGRjg0XHVGRjlFXHVGRjczXHVGRjlCXHVGRjcyXHVGRjg0XHVGRjlFXHUwMDMzIik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0NVU1RPTSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLkxBQkVMLCAiTkVDLVNFQ1JFVCIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICI5Iik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0NVU1RPTSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLkxBQkVMLCAiTkVDLUhPVEVMIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjEwIik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0NVU1RPTSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLkxBQkVMLCAiTkVDLVNDSE9PTCIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIxMSIpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9GQVhfSE9NRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjEyIik7Ci0KLSAgICAgICAgZWxlbSA9IG1WZXJpZmllci5hZGRDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtKCk7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgIlx1NUI4OVx1ODVFNFx1MzBFRFx1MzBBNFx1MzBDOVx1MDAzNCIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5ESVNQTEFZX05BTUUsICJcdTVCODlcdTg1RTRcdTMwRURcdTMwQTRcdTMwQzlcdTAwMzQiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfR0lWRU5fTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICJcdUZGNzFcdUZGOURcdUZGODRcdUZGOUVcdUZGNzNcdUZGOUJcdUZGNzJcdUZGODRcdUZGOUVcdTAwMzQiKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfQ1VTVE9NKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTEFCRUwsICJNT0RFTSIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIxMyIpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9QQUdFUikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjE0Iik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0NVU1RPTSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLkxBQkVMLCAiTkVDLUZBTUlMWSIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIxNSIpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9DVVNUT00pCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5MQUJFTCwgIk5FQy1HSVJMIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjE2Iik7Ci0KLSAgICAgICAgZWxlbSA9IG1WZXJpZmllci5hZGRDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtKCk7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgIlx1NUI4OVx1ODVFNFx1MzBFRFx1MzBBNFx1MzBDOVx1MDAzNSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5ESVNQTEFZX05BTUUsICJcdTVCODlcdTg1RTRcdTMwRURcdTMwQTRcdTMwQzlcdTAwMzUiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfR0lWRU5fTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICJcdUZGNzFcdUZGOURcdUZGODRcdUZGOUVcdUZGNzNcdUZGOUJcdUZGNzJcdUZGODRcdUZGOUVcdTAwMzUiKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfQ1VTVE9NKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTEFCRUwsICJORUMtQk9ZIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjE3Iik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0NVU1RPTSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLkxBQkVMLCAiTkVDLUZSSUVORCIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIxOCIpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9DVVNUT00pCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5MQUJFTCwgIk5FQy1QSFMiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMTkiKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfQ1VTVE9NKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTEFCRUwsICJORUMtUkVTVEFVUkFOVCIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIyMCIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RJZ25vcmVBZ2VudFYyMV9QYXJzZSgpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JJbXBvcnRUZXN0KFYyMSwgUi5yYXcudjIxX3dpbm1vXzY1KTsKLSAgICAgICAgQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzRm9yVmFsdWUgPSBuZXcgQ29udGVudFZhbHVlcygpOwotICAgICAgICBjb250ZW50VmFsdWVzRm9yVmFsdWUucHV0KCJWQUxVRSIsICJEQVRFIik7Ci0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJWRVJTSU9OIiwgIjIuMSIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiTiIsIEFycmF5cy5hc0xpc3QoIkV4YW1wbGUiLCAiIiwgIiIsICIiLCAiIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiRk4iLCAiRXhhbXBsZSIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiQU5OSVZFUlNBUlkiLCAiMjAwOTEwMTAiLCBjb250ZW50VmFsdWVzRm9yVmFsdWUpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiQUdFTlQiLCAiIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJYLUNMQVNTIiwgIlBVQkxJQyIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiWC1SRURVQ1RJT04iLCAiIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJYLU5PIiwgIiIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RJZ25vcmVBZ2VudFYyMSgpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JJbXBvcnRUZXN0KFYyMSwgUi5yYXcudjIxX3dpbm1vXzY1KTsKLSAgICAgICAgQ29udGVudFZhbHVlc1ZlcmlmaWVyIHZlcmlmaWVyID0gbmV3IENvbnRlbnRWYWx1ZXNWZXJpZmllcigpOwotICAgICAgICBDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtIGVsZW0gPSBtVmVyaWZpZXIuYWRkQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSgpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRkFNSUxZX05BTUUsICJFeGFtcGxlIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkRJU1BMQVlfTkFNRSwgIkV4YW1wbGUiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VG9sZXJhdGVJbnZhbGlkQ29tbWVudExpa2VMaW5lVjIxKCkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckltcG9ydFRlc3QoVjIxLCBSLnJhdy52MjFfaW52YWxpZF9jb21tZW50X2xpbmUpOwotICAgICAgICBDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtIGVsZW0gPSBtVmVyaWZpZXIuYWRkQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSgpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuR0lWRU5fTkFNRSwgIkNvbmZlcmVuY2UgQ2FsbCIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5ESVNQTEFZX05BTUUsICJDb25mZXJlbmNlIENhbGwiKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChOb3RlLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoTm90ZS5OT1RFLCAiVGhpcyBpcyBhbiAoc2hhcnAgLT4jPC0gc2hhcnApIGV4YW1wbGUuICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIlRoaXMgbWVzc2FnZSBtdXN0IE5PVCBiZSBpZ25vcmVkLiIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQYWdlclYzMF9QYXJzZSgpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JJbXBvcnRUZXN0KFYzMCwgUi5yYXcudjMwX2NvbW1hX3NlcGFyYXRlZCk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJWRVJTSU9OIiwgIjMuMCIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiTiIsIEFycmF5cy5hc0xpc3QoIkYiLCAiRyIsICJNIiwgIiIsICIiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJURUwiLCAiNjEwMTIzMTIzNEBwYWdlcnNhbXBsZS5jb20iLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFR5cGVTZXQoIldPUksiLCAiTVNHIiwgIlBBR0VSIikpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQYWdlclYzMCgpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JJbXBvcnRUZXN0KFYzMCwgUi5yYXcudjMwX2NvbW1hX3NlcGFyYXRlZCk7Ci0gICAgICAgIENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0gZWxlbSA9IG1WZXJpZmllci5hZGRDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtKCk7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgIkYiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuTUlERExFX05BTUUsICJNIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkdJVkVOX05BTUUsICJHIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkRJU1BMQVlfTkFNRSwgIkcgTSBGIik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX1BBR0VSKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiNjEwMTIzMTIzNEBwYWdlcnNhbXBsZS5jb20iKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlCeXRlUHJvcFYzMF9QYXJzZSgpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JJbXBvcnRUZXN0KFYzMCwgUi5yYXcudjMwX211bHRpYnl0ZV9wYXJhbSk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJWRVJTSU9OIiwgIjMuMCIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiTiIsIEFycmF5cy5hc0xpc3QoIkYiLCAiRyIsICJNIiwgIiIsICIiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJURUwiLCAiMSIsIG5ldyBUeXBlU2V0KCJcdThEMzkiKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE11bHRpQnl0ZVByb3BWMzAoKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9ySW1wb3J0VGVzdChWMzAsIFIucmF3LnYzMF9tdWx0aWJ5dGVfcGFyYW0pOwotICAgICAgICBmaW5hbCBDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtIGVsZW0gPSBtVmVyaWZpZXIuYWRkQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSgpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRkFNSUxZX05BTUUsICJGIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLk1JRERMRV9OQU1FLCAiTSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5HSVZFTl9OQU1FLCAiRyIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5ESVNQTEFZX05BTUUsICJHIE0gRiIpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9DVVNUT00pCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5MQUJFTCwgIlx1OEQzOSIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIxIik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkSmFwYW5pemF0aW9uVGVzdHMuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZEphcGFuaXphdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViNjAzNDIuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkSmFwYW5pemF0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZDsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLlZDYXJkQ29uZmlnOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuTmlja25hbWU7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5Ob3RlOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuUGhvbmU7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5TdHJ1Y3R1cmVkTmFtZTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLlN0cnVjdHVyZWRQb3N0YWw7Ci0KLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5Qcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtLlR5cGVTZXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1wdWJsaWMgY2xhc3MgVkNhcmRKYXBhbml6YXRpb25UZXN0cyBleHRlbmRzIFZDYXJkVGVzdHNCYXNlIHsKLSAgICBwcml2YXRlIHZvaWQgdGVzdE5hbWVVdGY4Q29tbW9uKGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KHZjYXJkVHlwZSk7Ci0gICAgICAgIENvbnRhY3RFbnRyeSBlbnRyeSA9IG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgIlx1MzA3NVx1MzA4Qlx1MzA2OSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5HSVZFTl9OQU1FLCAiXHUzMDkxXHUzMDhBXHUzMDRCIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLk1JRERMRV9OQU1FLCAiQiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QUkVGSVgsICJEci4iKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuU1VGRklYLCAiUGguRCIpOwotICAgICAgICBDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXMgPQotICAgICAgICAgICAgKFZDYXJkQ29uZmlnLmlzVjMwKHZjYXJkVHlwZSkgPyBudWxsIDogbUNvbnRlbnRWYWx1ZXNGb3JRUEFuZFV0ZjgpOwotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiRk4iLCAiRHIuIFx1MzA3NVx1MzA4Qlx1MzA2OSBCIFx1MzA5MVx1MzA4QVx1MzA0QiBQaC5EIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRWYWx1ZXMpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiTiIsICJcdTMwNzVcdTMwOEJcdTMwNjk7XHUzMDkxXHUzMDhBXHUzMDRCO0I7RHIuO1BoLkQiLAotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1MzA3NVx1MzA4Qlx1MzA2OSIsICJcdTMwOTFcdTMwOEFcdTMwNEIiLCAiQiIsICJEci4iLCAiUGguRCIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBjb250ZW50VmFsdWVzLCBudWxsLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TmFtZVV0ZjhWMjEoKSB7Ci0gICAgICAgIHRlc3ROYW1lVXRmOENvbW1vbihWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX1YyMV9KQVBBTkVTRV9VVEY4KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TmFtZVV0ZjhWMzAoKSB7Ci0gICAgICAgIHRlc3ROYW1lVXRmOENvbW1vbihWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX1YzMF9KQVBBTkVTRV9VVEY4KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TmFtZVNoaWZ0SmlzKCkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QoVkNhcmRDb25maWcuVkNBUkRfVFlQRV9WMzBfSkFQQU5FU0VfU0pJUyk7Ci0gICAgICAgIENvbnRhY3RFbnRyeSBlbnRyeSA9IG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgIlx1MzA3NVx1MzA4Qlx1MzA2OSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5HSVZFTl9OQU1FLCAiXHUzMDkxXHUzMDhBXHUzMDRCIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLk1JRERMRV9OQU1FLCAiQiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QUkVGSVgsICJEci4iKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuU1VGRklYLCAiUGguRCIpOwotCi0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJGTiIsICJEci4gXHUzMDc1XHUzMDhCXHUzMDY5IEIgXHUzMDkxXHUzMDhBXHUzMDRCIFBoLkQiLAotICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRlbnRWYWx1ZXNGb3JTSmlzKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIk4iLCAiXHUzMDc1XHUzMDhCXHUzMDY5O1x1MzA5MVx1MzA4QVx1MzA0QjtCO0RyLjtQaC5EIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTMwNzVcdTMwOEJcdTMwNjkiLCAiXHUzMDkxXHUzMDhBXHUzMDRCIiwgIkIiLCAiRHIuIiwgIlBoLkQiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgbUNvbnRlbnRWYWx1ZXNGb3JTSmlzLCBudWxsLCBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEb0NvTW8gcGhvbmVzIHJlcXVpcmUgYWxsIG5hbWUgZWxlbWVudHMgc2hvdWxkIGJlIGluICJmYW1pbHkgbmFtZSIgZmllbGQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdE5hbWVEb0NvTW8oKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdChWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX0RPQ09NTyk7Ci0gICAgICAgIENvbnRhY3RFbnRyeSBlbnRyeSA9IG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgIlx1MzA3NVx1MzA4Qlx1MzA2OSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5HSVZFTl9OQU1FLCAiXHUzMDkxXHUzMDhBXHUzMDRCIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLk1JRERMRV9OQU1FLCAiQiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QUkVGSVgsICJEci4iKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuU1VGRklYLCAiUGguRCIpOwotCi0gICAgICAgIGZpbmFsIFN0cmluZyBmdWxsTmFtZSA9ICJEci4gXHUzMDc1XHUzMDhCXHUzMDY5IEIgXHUzMDkxXHUzMDhBXHUzMDRCIFBoLkQiOwotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiTiIsIGZ1bGxOYW1lICsgIjs7OzsiLAotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdChmdWxsTmFtZSwgIiIsICIiLCAiIiwgIiIpLAotICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgbUNvbnRlbnRWYWx1ZXNGb3JTSmlzLCBudWxsLCBudWxsKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkZOIiwgZnVsbE5hbWUsIG1Db250ZW50VmFsdWVzRm9yU0ppcykKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJTT1VORCIsICI7Ozs7IiwgbmV3IFR5cGVTZXQoIlgtSVJNQy1OIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIiIsIG5ldyBUeXBlU2V0KCJIT01FIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiRU1BSUwiLCAiIiwgbmV3IFR5cGVTZXQoIkhPTUUiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJBRFIiLCAiIiwgbmV3IFR5cGVTZXQoIkhPTUUiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLUNMQVNTIiwgIlBVQkxJQyIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1SRURVQ1RJT04iLCAiIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLU5PIiwgIiIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1EQ00tSE1OLU1PREUiLCAiIik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RQaG9uZXRpY05hbWVDb21tb24oaW50IHZjYXJkVHlwZSkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QodmNhcmRUeXBlKTsKLSAgICAgICAgQ29udGFjdEVudHJ5IGVudHJ5ID0gbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0ZBTUlMWV9OQU1FLCAiXHUzMDg0XHUzMDdFXHUzMDYwIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX01JRERMRV9OQU1FLCAiXHUzMERGXHUzMEM5XHUzMEVCXHUzMENEXHUzMEZDXHUzMEUwIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0dJVkVOX05BTUUsICJcdTMwNUZcdTMwOERcdTMwNDYiKTsKLQotICAgICAgICBmaW5hbCBDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXMgPQotICAgICAgICAgICAgKFZDYXJkQ29uZmlnLnVzZXNTaGlmdEppcyh2Y2FyZFR5cGUpID8KLSAgICAgICAgICAgICAgICAgICAgKFZDYXJkQ29uZmlnLmlzVjMwKHZjYXJkVHlwZSkgPyBtQ29udGVudFZhbHVlc0ZvclNKaXMgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db250ZW50VmFsdWVzRm9yUVBBbmRTSmlzKSA6Ci0gICAgICAgICAgICAgICAgICAgIChWQ2FyZENvbmZpZy5pc1YzMCh2Y2FyZFR5cGUpID8gbnVsbCA6IG1Db250ZW50VmFsdWVzRm9yUVBBbmRVdGY4KSk7Ci0gICAgICAgIFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0gZWxlbSA9IG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtV2l0aEVtcHR5TmFtZSgpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkTm9kZSgiWC1QSE9ORVRJQy1MQVNULU5BTUUiLCAiXHUzMDg0XHUzMDdFXHUzMDYwIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRWYWx1ZXMpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1QSE9ORVRJQy1NSURETEUtTkFNRSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHUzMERGXHUzMEM5XHUzMEVCXHUzMENEXHUzMEZDXHUzMEUwIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRWYWx1ZXMpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1QSE9ORVRJQy1GSVJTVC1OQU1FIiwgIlx1MzA1Rlx1MzA4RFx1MzA0NiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50VmFsdWVzKTsKLSAgICAgICAgaWYgKFZDYXJkQ29uZmlnLmlzVjMwKHZjYXJkVHlwZSkpIHsKLSAgICAgICAgICAgIGVsZW0uYWRkRXhwZWN0ZWROb2RlKCJTT1JULVNUUklORyIsCi0gICAgICAgICAgICAgICAgICAgICJcdTMwODRcdTMwN0VcdTMwNjAgXHUzMERGXHUzMEM5XHUzMEVCXHUzMENEXHUzMEZDXHUzMEUwIFx1MzA1Rlx1MzA4RFx1MzA0NiIsCi0gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRWYWx1ZXMpOwotICAgICAgICB9Ci0gICAgICAgIENvbnRlbnRWYWx1ZXNCdWlsZGVyIGJ1aWxkZXIgPSBtVmVyaWZpZXIuYWRkQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKTsKLSAgICAgICAgYnVpbGRlci5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfRkFNSUxZX05BTUUsICJcdTMwODRcdTMwN0VcdTMwNjAiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfTUlERExFX05BTUUsICJcdTMwREZcdTMwQzlcdTMwRUJcdTMwQ0RcdTMwRkNcdTMwRTAiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfR0lWRU5fTkFNRSwgIlx1MzA1Rlx1MzA4RFx1MzA0NiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5ESVNQTEFZX05BTUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHUzMDg0XHUzMDdFXHUzMDYwIFx1MzBERlx1MzBDOVx1MzBFQlx1MzBDRFx1MzBGQ1x1MzBFMCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJcdTMwNUZcdTMwOERcdTMwNDYiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGhvbmV0aWNOYW1lRm9ySmFwYW5lc2VWMjFVdGY4KCkgewotICAgICAgICB0ZXN0UGhvbmV0aWNOYW1lQ29tbW9uKFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfVjIxX0pBUEFORVNFX1VURjgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQaG9uZXRpY05hbWVGb3JKYXBhbmVzZVYyMVNqaXMoKSB7Ci0gICAgICAgIHRlc3RQaG9uZXRpY05hbWVDb21tb24oVkNhcmRDb25maWcuVkNBUkRfVFlQRV9WMjFfSkFQQU5FU0VfU0pJUyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBob25ldGljTmFtZUZvckphcGFuZXNlVjMwVXRmOCgpIHsKLSAgICAgICAgdGVzdFBob25ldGljTmFtZUNvbW1vbihWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX1YzMF9KQVBBTkVTRV9VVEY4KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGhvbmV0aWNOYW1lRm9ySmFwYW5lc2VWMzBTSmlzKCkgewotICAgICAgICB0ZXN0UGhvbmV0aWNOYW1lQ29tbW9uKFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfVjMwX0pBUEFORVNFX1NKSVMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQaG9uZXRpY05hbWVGb3JNb2JpbGVWMjFfMSgpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfVjIxX0pBUEFORVNFX01PQklMRSk7Ci0gICAgICAgIENvbnRhY3RFbnRyeSBlbnRyeSA9IG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19GQU1JTFlfTkFNRSwgIlx1MzA4NFx1MzA3RVx1MzA2MCIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19NSURETEVfTkFNRSwgIlx1MzBERlx1MzBDOVx1MzBFQlx1MzBDRFx1MzBGQ1x1MzBFMCIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19HSVZFTl9OQU1FLCAiXHUzMDVGXHUzMDhEXHUzMDQ2Iik7Ci0KLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0oKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlNPVU5EIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJcdUZGOTRcdUZGOEZcdUZGODBcdUZGOUUgXHVGRjkwXHVGRjg0XHVGRjlFXHVGRjk5XHVGRjg4XHVGRjcwXHVGRjkxICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIlx1RkY4MFx1RkY5Qlx1RkY3Mzs7OzsiLAotICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRlbnRWYWx1ZXNGb3JTSmlzLCBuZXcgVHlwZVNldCgiWC1JUk1DLU4iKSk7Ci0gICAgICAgIENvbnRlbnRWYWx1ZXNCdWlsZGVyIGJ1aWxkZXIgPSBtVmVyaWZpZXIuYWRkQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKTsKLSAgICAgICAgYnVpbGRlci5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfRkFNSUxZX05BTUUsICJcdUZGOTRcdUZGOEZcdUZGODBcdUZGOUUiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfTUlERExFX05BTUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHVGRjkwXHVGRjg0XHVGRjlFXHVGRjk5XHVGRjg4XHVGRjcwXHVGRjkxIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0dJVkVOX05BTUUsICJcdUZGODBcdUZGOUJcdUZGNzMiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRElTUExBWV9OQU1FLAotICAgICAgICAgICAgICAgICAgICAgICAgIlx1RkY5NFx1RkY4Rlx1RkY4MFx1RkY5RSBcdUZGOTBcdUZGODRcdUZGOUVcdUZGOTlcdUZGODhcdUZGNzBcdUZGOTEgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHVGRjgwXHVGRjlCXHVGRjczIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBob25ldGljTmFtZUZvck1vYmlsZVYyMV8yKCkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QoVkNhcmRDb25maWcuVkNBUkRfVFlQRV9WMjFfSkFQQU5FU0VfTU9CSUxFKTsKLSAgICAgICAgQ29udGFjdEVudHJ5IGVudHJ5ID0gbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0ZBTUlMWV9OQU1FLCAiXHUzMDg0XHUzMDdFXHUzMDYwIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0dJVkVOX05BTUUsICJcdTMwNUZcdTMwOERcdTMwNDYiKTsKLQotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiU09VTkQiLCAiXHVGRjk0XHVGRjhGXHVGRjgwXHVGRjlFIFx1RkY4MFx1RkY5Qlx1RkY3Mzs7OzsiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29udGVudFZhbHVlc0ZvclNKaXMsIG5ldyBUeXBlU2V0KCJYLUlSTUMtTiIpKTsKLSAgICAgICAgQ29udGVudFZhbHVlc0J1aWxkZXIgYnVpbGRlciA9IG1WZXJpZmllci5hZGRDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWQoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpOwotICAgICAgICBidWlsZGVyLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19GQU1JTFlfTkFNRSwgIlx1RkY5NFx1RkY4Rlx1RkY4MFx1RkY5RSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19HSVZFTl9OQU1FLCAiXHVGRjgwXHVGRjlCXHVGRjczIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkRJU1BMQVlfTkFNRSwgIlx1RkY5NFx1RkY4Rlx1RkY4MFx1RkY5RSBcdUZGODBcdUZGOUJcdUZGNzMiKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGVzdFBvc3RhbEFkZHJlc3NXaXRoSmFwYW5lc2VDb21tb24oaW50IHZjYXJkVHlwZSkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QodmNhcmRUeXBlKTsKLSAgICAgICAgQ29udGFjdEVudHJ5IGVudHJ5ID0gbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkUG9zdGFsLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5QT0JPWCwgIlx1NzlDMVx1NjZGOFx1N0JCMTA3IikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuU1RSRUVULCAiXHU5NkRCXHU4OThCXHU2Q0EyXHU2NzUxIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuQ0lUWSwgIlx1OUU3Rlx1OUFBOFx1NUUwMiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlJFR0lPTiwgIlx1MDBEN1x1MDBEN1x1NzcwQyIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlBPU1RDT0RFLCAiNDk0LTEzMTMiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5DT1VOVFJZLCAiXHU2NUU1XHU2NzJDIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuRk9STUFUVEVEX0FERFJFU1MsCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHUzMDUzXHUzMDkzXHUzMDZBXHUzMDY4XHUzMDUzXHUzMDhEXHUzMDkyXHU4OThCIgotICAgICAgICAgICAgICAgICAgICAgICAgKyAiXHUzMDhCXHUzMDZBXHUzMDkzXHUzMDY2XHU2Njg3XHU0RUJBXHUzMDY3XHUzMDU5XHUzMDRCXHVGRjFGIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuVFlQRSwgU3RydWN0dXJlZFBvc3RhbC5UWVBFX0NVU1RPTSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuTEFCRUwsICJcdTMwNEFcdTMwODJcdTMwNjFcdTMwNEJcdTMwNDhcdTMwOEEiKTsKLQotICAgICAgICBDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXMgPSAoVkNhcmRDb25maWcudXNlc1NoaWZ0SmlzKHZjYXJkVHlwZSkgPwotICAgICAgICAgICAgICAgIChWQ2FyZENvbmZpZy5pc1YzMCh2Y2FyZFR5cGUpID8gbUNvbnRlbnRWYWx1ZXNGb3JTSmlzIDoKLSAgICAgICAgICAgICAgICAgICAgbUNvbnRlbnRWYWx1ZXNGb3JRUEFuZFNKaXMpIDoKLSAgICAgICAgICAgICAgICAoVkNhcmRDb25maWcuaXNWMzAodmNhcmRUeXBlKSA/IG1Db250ZW50VmFsdWVzRm9yVXRmOCA6Ci0gICAgICAgICAgICAgICAgICAgIG1Db250ZW50VmFsdWVzRm9yUVBBbmRVdGY4KSk7Ci0KLSAgICAgICAgUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSBlbGVtID0gbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1XaXRoRW1wdHlOYW1lKCk7Ci0gICAgICAgIC8vIExBQkVMIG11c3QgYmUgaWdub3JlZCBpbiB2Q2FyZCAyLjEuIEFzIGZvciB2Q2FyZCAzLjAsIHRoZSBjdXJyZW50IGJlaGF2aW9yIGlzCi0gICAgICAgIC8vIHNhbWUgYXMgdGhhdCBpbiB2Q2FyZCAzLjAsIHdoaWNoIGNhbiBiZSBjaGFuZ2VkIGluIHRoZSBmdXR1cmUuCi0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWROb2RlKCJBRFIiLCBBcnJheXMuYXNMaXN0KCJcdTc5QzFcdTY2RjhcdTdCQjEwNyIsCi0gICAgICAgICAgICAgICAgIiIsICJcdTk2REJcdTg5OEJcdTZDQTJcdTY3NTEiLCAiXHU5RTdGXHU5QUE4XHU1RTAyIiwgIlx1MDBEN1x1MDBEN1x1NzcwQyIsCi0gICAgICAgICAgICAgICAgIjQ5NC0xMzEzIiwgIlx1NjVFNVx1NjcyQyIpLAotICAgICAgICAgICAgICAgIGNvbnRlbnRWYWx1ZXMpOwotICAgICAgICBtVmVyaWZpZXIuYWRkQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSgpLmFkZEV4cGVjdGVkKFN0cnVjdHVyZWRQb3N0YWwuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlBPQk9YLCAiXHU3OUMxXHU2NkY4XHU3QkIxMDciKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5TVFJFRVQsICJcdTk2REJcdTg5OEJcdTZDQTJcdTY3NTEiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5DSVRZLCAiXHU5RTdGXHU5QUE4XHU1RTAyIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuUkVHSU9OLCAiXHUwMEQ3XHUwMEQ3XHU3NzBDIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuUE9TVENPREUsICI0OTQtMTMxMyIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLkNPVU5UUlksICJcdTY1RTVcdTY3MkMiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5GT1JNQVRURURfQUREUkVTUywKLSAgICAgICAgICAgICAgICAgICAgICAgICJcdTY1RTVcdTY3MkMgNDk0LTEzMTMgXHUwMEQ3XHUwMEQ3XHU3NzBDIFx1OUU3Rlx1OUFBOFx1NUUwMiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJcdTk2REJcdTg5OEJcdTZDQTJcdTY3NTEgIiArICJcdTc5QzFcdTY2RjhcdTdCQjEwNyIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlRZUEUsIFN0cnVjdHVyZWRQb3N0YWwuVFlQRV9IT01FKTsKLSAgICB9Ci0gICAgcHVibGljIHZvaWQgdGVzdFBvc3RhbEFkZHJlc3N3aXRoSmFwYW5lc2VWMjEoKSB7Ci0gICAgICAgIHRlc3RQb3N0YWxBZGRyZXNzV2l0aEphcGFuZXNlQ29tbW9uKFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfVjIxX0pBUEFORVNFX1NKSVMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFZlcmlmaWVzIHRoYXQgb25seSBvbmUgYWRkcmVzcyBmaWVsZCBpcyBlbWl0dGVkIHRvd2FyZCBEb0NvTW8gcGhvbmVzLgotICAgICAqIFByZWZlcmVkIHR5cGUgbXVzdCAoc2hvdWxkPykgYmU6IEhPTUUgPiBXT1JLID4gT1RIRVIgPiBDVVNUT00KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zdGFsQWRycmVzc0ZvckRvQ29Nb18xKCkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QoVkNhcmRDb25maWcuVkNBUkRfVFlQRV9ET0NPTU8pOwotICAgICAgICBDb250YWN0RW50cnkgZW50cnkgPSBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWRQb3N0YWwuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlRZUEUsIFN0cnVjdHVyZWRQb3N0YWwuVFlQRV9XT1JLKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5QT0JPWCwgIjEiKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkUG9zdGFsLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5UWVBFLCBTdHJ1Y3R1cmVkUG9zdGFsLlRZUEVfT1RIRVIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlBPQk9YLCAiMiIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWRQb3N0YWwuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlRZUEUsIFN0cnVjdHVyZWRQb3N0YWwuVFlQRV9IT01FKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5QT0JPWCwgIjMiKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkUG9zdGFsLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5UWVBFLCBTdHJ1Y3R1cmVkUG9zdGFsLlRZUEVfQ1VTVE9NKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5MQUJFTCwgImN1c3RvbSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlBPQk9YLCAiNCIpOwotCi0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtV2l0aEVtcHR5TmFtZSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIiIsIG5ldyBUeXBlU2V0KCJIT01FIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiRU1BSUwiLCAiIiwgbmV3IFR5cGVTZXQoIkhPTUUiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLUNMQVNTIiwgIlBVQkxJQyIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1SRURVQ1RJT04iLCAiIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLU5PIiwgIiIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1EQ00tSE1OLU1PREUiLCAiIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJBRFIiLAotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgiMyIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIpLCBuZXcgVHlwZVNldCgiSE9NRSIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zdGFsQWRycmVzc0ZvckRvQ29Nb18yKCkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QoVkNhcmRDb25maWcuVkNBUkRfVFlQRV9ET0NPTU8pOwotICAgICAgICBDb250YWN0RW50cnkgZW50cnkgPSBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWRQb3N0YWwuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlRZUEUsIFN0cnVjdHVyZWRQb3N0YWwuVFlQRV9PVEhFUikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuUE9CT1gsICIxIik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZFBvc3RhbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuVFlQRSwgU3RydWN0dXJlZFBvc3RhbC5UWVBFX1dPUkspCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlBPQk9YLCAiMiIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWRQb3N0YWwuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlRZUEUsIFN0cnVjdHVyZWRQb3N0YWwuVFlQRV9DVVNUT00pCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLkxBQkVMLCAiY3VzdG9tIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuUE9CT1gsICIzIik7Ci0KLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1XaXRoRW1wdHlOYW1lKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiIiwgbmV3IFR5cGVTZXQoIkhPTUUiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJFTUFJTCIsICIiLCBuZXcgVHlwZVNldCgiSE9NRSIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtQ0xBU1MiLCAiUFVCTElDIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLVJFRFVDVElPTiIsICIiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtTk8iLCAiIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLURDTS1ITU4tTU9ERSIsICIiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkFEUiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KCIyIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiksIG5ldyBUeXBlU2V0KCJXT1JLIikpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQb3N0YWxBZHJyZXNzRm9yRG9Db01vXzMoKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdChWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX0RPQ09NTyk7Ci0gICAgICAgIENvbnRhY3RFbnRyeSBlbnRyeSA9IG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZFBvc3RhbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuVFlQRSwgU3RydWN0dXJlZFBvc3RhbC5UWVBFX0NVU1RPTSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuTEFCRUwsICJjdXN0b20xIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuUE9CT1gsICIxIik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZFBvc3RhbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuVFlQRSwgU3RydWN0dXJlZFBvc3RhbC5UWVBFX09USEVSKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5QT0JPWCwgIjIiKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkUG9zdGFsLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5UWVBFLCBTdHJ1Y3R1cmVkUG9zdGFsLlRZUEVfQ1VTVE9NKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5MQUJFTCwgImN1c3RvbTIiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5QT0JPWCwgIjMiKTsKLQotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbVdpdGhFbXB0eU5hbWUoKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICIiLCBuZXcgVHlwZVNldCgiSE9NRSIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkVNQUlMIiwgIiIsIG5ldyBUeXBlU2V0KCJIT01FIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1DTEFTUyIsICJQVUJMSUMiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtUkVEVUNUSU9OIiwgIiIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1OTyIsICIiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtRENNLUhNTi1NT0RFIiwgIiIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiQURSIiwgQXJyYXlzLmFzTGlzdCgiMiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBWZXJpZmllcyB0aGUgdkNhcmQgZXhwb3J0ZXIgdG9sZXJhdGVzIG51bGwgVFlQRS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zdGFsQWRycmVzc0ZvckRvQ29Nb180KCkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QoVkNhcmRDb25maWcuVkNBUkRfVFlQRV9ET0NPTU8pOwotICAgICAgICBDb250YWN0RW50cnkgZW50cnkgPSBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWRQb3N0YWwuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlBPQk9YLCAiMSIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWRQb3N0YWwuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlRZUEUsIFN0cnVjdHVyZWRQb3N0YWwuVFlQRV9PVEhFUikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuUE9CT1gsICIyIik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZFBvc3RhbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuVFlQRSwgU3RydWN0dXJlZFBvc3RhbC5UWVBFX0hPTUUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlBPQk9YLCAiMyIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWRQb3N0YWwuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlRZUEUsIFN0cnVjdHVyZWRQb3N0YWwuVFlQRV9XT1JLKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5QT0JPWCwgIjQiKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkUG9zdGFsLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5QT0JPWCwgIjUiKTsKLQotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbVdpdGhFbXB0eU5hbWUoKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICIiLCBuZXcgVHlwZVNldCgiSE9NRSIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkVNQUlMIiwgIiIsIG5ldyBUeXBlU2V0KCJIT01FIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1DTEFTUyIsICJQVUJMSUMiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtUkVEVUNUSU9OIiwgIiIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1OTyIsICIiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtRENNLUhNTi1NT0RFIiwgIiIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiQURSIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoIjMiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiKSwgbmV3IFR5cGVTZXQoIkhPTUUiKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RKYXBhbmVzZVBob25lTnVtYmVyQ29tbW9uKGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KHZjYXJkVHlwZSk7Ci0gICAgICAgIENvbnRhY3RFbnRyeSBlbnRyeSA9IG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIwMzEyMzQxMjM0IikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfSE9NRSk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIwOTAxMjM0MTIzNCIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX01PQklMRSk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtV2l0aEVtcHR5TmFtZSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjAzLTEyMzQtMTIzNCIsIG5ldyBUeXBlU2V0KCJIT01FIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjA5MC0xMjM0LTEyMzQiLCBuZXcgVHlwZVNldCgiQ0VMTCIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SmFwYW5lc2VQaG9uZU51bWJlclYyMV8xKCkgewotICAgICAgICB0ZXN0SmFwYW5lc2VQaG9uZU51bWJlckNvbW1vbihWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX1YyMV9KQVBBTkVTRV9VVEY4KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SmFwYW5lc2VQaG9uZU51bWJlclYzMCgpIHsKLSAgICAgICAgdGVzdEphcGFuZXNlUGhvbmVOdW1iZXJDb21tb24oVkNhcmRDb25maWcuVkNBUkRfVFlQRV9WMzBfSkFQQU5FU0VfVVRGOCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEphcGFuZXNlUGhvbmVOdW1iZXJEb0NvTW8oKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdChWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX0RPQ09NTyk7Ci0gICAgICAgIENvbnRhY3RFbnRyeSBlbnRyeSA9IG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIwMzEyMzQxMjM0IikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfSE9NRSk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIwOTAxMjM0MTIzNCIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX01PQklMRSk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtV2l0aEVtcHR5TmFtZSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiRU1BSUwiLCAiIiwgbmV3IFR5cGVTZXQoIkhPTUUiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLUNMQVNTIiwgIlBVQkxJQyIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1SRURVQ1RJT04iLCAiIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLU5PIiwgIiIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1EQ00tSE1OLU1PREUiLCAiIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJBRFIiLCAiIiwgbmV3IFR5cGVTZXQoIkhPTUUiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiMDMtMTIzNC0xMjM0IiwgbmV3IFR5cGVTZXQoIkhPTUUiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiMDkwLTEyMzQtMTIzNCIsIG5ldyBUeXBlU2V0KCJDRUxMIikpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3ROb3RlRG9Db01vKCkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QoVkNhcmRDb25maWcuVkNBUkRfVFlQRV9ET0NPTU8pOwotICAgICAgICBDb250YWN0RW50cnkgZW50cnkgPSBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKE5vdGUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChOb3RlLk5PVEUsICJub3RlMSIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKE5vdGUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChOb3RlLk5PVEUsICJub3RlMiIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKE5vdGUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChOb3RlLk5PVEUsICJub3RlMyIpOwotCi0gICAgICAgIC8vIE1vcmUgdGhhbiBvbmUgbm90ZSBmaWVsZHMgbXVzdCBiZSBhZ2dyZWdhdGVkIGludG8gb25lIG5vdGUuCi0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtV2l0aEVtcHR5TmFtZSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIiIsIG5ldyBUeXBlU2V0KCJIT01FIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiRU1BSUwiLCAiIiwgbmV3IFR5cGVTZXQoIkhPTUUiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLUNMQVNTIiwgIlBVQkxJQyIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1SRURVQ1RJT04iLCAiIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLU5PIiwgIiIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1EQ00tSE1OLU1PREUiLCAiIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJBRFIiLCAiIiwgbmV3IFR5cGVTZXQoIkhPTUUiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJOT1RFIiwgIm5vdGUxXG5ub3RlMlxubm90ZTMiLCBtQ29udGVudFZhbHVlc0ZvclFQKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QW5kcm9pZEN1c3RvbVYyMSgpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfVjIxX0dFTkVSSUNfVVRGOCk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCkuYWRkQ29udGVudFZhbHVlcyhOaWNrbmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KE5pY2tuYW1lLk5BTUUsICJcdTMwNERcdTMwODNcdTMwRkNcdTMwQThcdTMwQzNcdTMwQzFcdTMwRkMiKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1XaXRoRW1wdHlOYW1lKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLUFORFJPSUQtQ1VTVE9NIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoTmlja25hbWUuQ09OVEVOVF9JVEVNX1RZUEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTMwNERcdTMwODNcdTMwRkNcdTMwQThcdTMwQzNcdTMwQzFcdTMwRkMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIpLAotICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRlbnRWYWx1ZXNGb3JRUEFuZFV0ZjgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZFRlc3RzQmFzZS5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkVGVzdHNCYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljNjAwM2YuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkVGVzdHNCYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZDsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzOwotaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7Ci0KLS8qKgotICogQmFzZUNsYXNzIGZvciB2Q2FyZCB1bml0IHRlc3RzIHdpdGggdXRpbGl0eSBjbGFzc2VzLgotICogUGxlYXNlIGRvIG5vdCBhZGQgZWFjaCB1bml0IHRlc3QgaGVyZS4KLSAqLwotcHVibGljIGNsYXNzIFZDYXJkVGVzdHNCYXNlIGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlIHsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWMjEgPSBWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX1YyMV9HRU5FUklDX1VURjg7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVjMwID0gVkNhcmRDb25maWcuVkNBUkRfVFlQRV9WMzBfR0VORVJJQ19VVEY4OwotCi0gICAgLy8gRG8gbm90IG1vZGlmeSB0aGVzZSBkdXJpbmcgdGVzdHMuCi0gICAgcHJvdGVjdGVkIGZpbmFsIENvbnRlbnRWYWx1ZXMgbUNvbnRlbnRWYWx1ZXNGb3JRUDsKLSAgICBwcm90ZWN0ZWQgZmluYWwgQ29udGVudFZhbHVlcyBtQ29udGVudFZhbHVlc0ZvclNKaXM7Ci0gICAgcHJvdGVjdGVkIGZpbmFsIENvbnRlbnRWYWx1ZXMgbUNvbnRlbnRWYWx1ZXNGb3JVdGY4OwotICAgIHByb3RlY3RlZCBmaW5hbCBDb250ZW50VmFsdWVzIG1Db250ZW50VmFsdWVzRm9yUVBBbmRTSmlzOwotICAgIHByb3RlY3RlZCBmaW5hbCBDb250ZW50VmFsdWVzIG1Db250ZW50VmFsdWVzRm9yUVBBbmRVdGY4OwotICAgIHByb3RlY3RlZCBmaW5hbCBDb250ZW50VmFsdWVzIG1Db250ZW50VmFsdWVzRm9yQmFzZTY0VjIxOwotICAgIHByb3RlY3RlZCBmaW5hbCBDb250ZW50VmFsdWVzIG1Db250ZW50VmFsdWVzRm9yQmFzZTY0VjMwOwotCi0gICAgcHJvdGVjdGVkIFZDYXJkVmVyaWZpZXIgbVZlcmlmaWVyOwotICAgIHByaXZhdGUgYm9vbGVhbiBtU2tpcFZlcmlmaWNhdGlvbjsKLQotICAgIHB1YmxpYyBWQ2FyZFRlc3RzQmFzZSgpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgbUNvbnRlbnRWYWx1ZXNGb3JRUCA9IG5ldyBDb250ZW50VmFsdWVzKCk7Ci0gICAgICAgIG1Db250ZW50VmFsdWVzRm9yUVAucHV0KCJFTkNPRElORyIsICJRVU9URUQtUFJJTlRBQkxFIik7Ci0gICAgICAgIG1Db250ZW50VmFsdWVzRm9yU0ppcyA9IG5ldyBDb250ZW50VmFsdWVzKCk7Ci0gICAgICAgIG1Db250ZW50VmFsdWVzRm9yU0ppcy5wdXQoIkNIQVJTRVQiLCAiU0hJRlRfSklTIik7Ci0gICAgICAgIG1Db250ZW50VmFsdWVzRm9yVXRmOCA9IG5ldyBDb250ZW50VmFsdWVzKCk7Ci0gICAgICAgIG1Db250ZW50VmFsdWVzRm9yVXRmOC5wdXQoIkNIQVJTRVQiLCAiVVRGLTgiKTsKLSAgICAgICAgbUNvbnRlbnRWYWx1ZXNGb3JRUEFuZFNKaXMgPSBuZXcgQ29udGVudFZhbHVlcygpOwotICAgICAgICBtQ29udGVudFZhbHVlc0ZvclFQQW5kU0ppcy5wdXQoIkVOQ09ESU5HIiwgIlFVT1RFRC1QUklOVEFCTEUiKTsKLSAgICAgICAgbUNvbnRlbnRWYWx1ZXNGb3JRUEFuZFNKaXMucHV0KCJDSEFSU0VUIiwgIlNISUZUX0pJUyIpOwotICAgICAgICBtQ29udGVudFZhbHVlc0ZvclFQQW5kVXRmOCA9IG5ldyBDb250ZW50VmFsdWVzKCk7Ci0gICAgICAgIG1Db250ZW50VmFsdWVzRm9yUVBBbmRVdGY4LnB1dCgiRU5DT0RJTkciLCAiUVVPVEVELVBSSU5UQUJMRSIpOwotICAgICAgICBtQ29udGVudFZhbHVlc0ZvclFQQW5kVXRmOC5wdXQoIkNIQVJTRVQiLCAiVVRGLTgiKTsKLSAgICAgICAgbUNvbnRlbnRWYWx1ZXNGb3JCYXNlNjRWMjEgPSBuZXcgQ29udGVudFZhbHVlcygpOwotICAgICAgICBtQ29udGVudFZhbHVlc0ZvckJhc2U2NFYyMS5wdXQoIkVOQ09ESU5HIiwgIkJBU0U2NCIpOwotICAgICAgICBtQ29udGVudFZhbHVlc0ZvckJhc2U2NFYzMCA9IG5ldyBDb250ZW50VmFsdWVzKCk7Ci0gICAgICAgIG1Db250ZW50VmFsdWVzRm9yQmFzZTY0VjMwLnB1dCgiRU5DT0RJTkciLCAiYiIpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHRlc3RBbmRyb2lkVGVzdENhc2VTZXR1cFByb3Blcmx5KCkgewotICAgICAgICBzdXBlci50ZXN0QW5kcm9pZFRlc3RDYXNlU2V0dXBQcm9wZXJseSgpOwotICAgICAgICBtU2tpcFZlcmlmaWNhdGlvbiA9IHRydWU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uewotICAgICAgICBzdXBlci5zZXRVcCgpOwotICAgICAgICBtVmVyaWZpZXIgPSBuZXcgVkNhcmRWZXJpZmllcih0aGlzKTsKLSAgICAgICAgbVNraXBWZXJpZmljYXRpb24gPSBmYWxzZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci50ZWFyRG93bigpOwotICAgICAgICBpZiAoIW1Ta2lwVmVyaWZpY2F0aW9uKSB7Ci0gICAgICAgICAgICBtVmVyaWZpZXIudmVyaWZ5KCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRVdGlsc1Rlc3RzLmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRVdGlsc1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4MDViZWUuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkVXRpbHNUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkOwotCi1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuVkNhcmRVdGlsczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1wdWJsaWMgY2xhc3MgVkNhcmRVdGlsc1Rlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotICAgIHB1YmxpYyB2b2lkIHRlc3RDb250YWluc09ubHlQcmludGFibGVBc2NpaSgpIHsKLSAgICAgICAgYXNzZXJ0VHJ1ZShWQ2FyZFV0aWxzLmNvbnRhaW5zT25seVByaW50YWJsZUFzY2lpKChTdHJpbmcpbnVsbCkpOwotICAgICAgICBhc3NlcnRUcnVlKFZDYXJkVXRpbHMuY29udGFpbnNPbmx5UHJpbnRhYmxlQXNjaWkoKFN0cmluZ1tdKW51bGwpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShWQ2FyZFV0aWxzLmNvbnRhaW5zT25seVByaW50YWJsZUFzY2lpKChMaXN0PFN0cmluZz4pbnVsbCkpOwotICAgICAgICBhc3NlcnRUcnVlKFZDYXJkVXRpbHMuY29udGFpbnNPbmx5UHJpbnRhYmxlQXNjaWkoIiIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShWQ2FyZFV0aWxzLmNvbnRhaW5zT25seVByaW50YWJsZUFzY2lpKCJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShWQ2FyZFV0aWxzLmNvbnRhaW5zT25seVByaW50YWJsZUFzY2lpKCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWiIpKTsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDB4MjA7IGkgPCAweDdGOyBpKyspIHsKLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKChjaGFyKWkpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFRydWUoVkNhcmRVdGlscy5jb250YWluc09ubHlQcmludGFibGVBc2NpaShidWlsZGVyLnRvU3RyaW5nKCkpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShWQ2FyZFV0aWxzLmNvbnRhaW5zT25seVByaW50YWJsZUFzY2lpKCJcclxuIikpOwotICAgICAgICBhc3NlcnRGYWxzZShWQ2FyZFV0aWxzLmNvbnRhaW5zT25seVByaW50YWJsZUFzY2lpKCJcdTAwMTkiKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKFZDYXJkVXRpbHMuY29udGFpbnNPbmx5UHJpbnRhYmxlQXNjaWkoIlx1MDA3RiIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKCkgewotICAgICAgICBhc3NlcnRUcnVlKFZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKChTdHJpbmcpbnVsbCkpOwotICAgICAgICBhc3NlcnRUcnVlKFZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKChTdHJpbmdbXSludWxsKSk7Ci0gICAgICAgIGFzc2VydFRydWUoVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkoKExpc3Q8U3RyaW5nPiludWxsKSk7Ci0gICAgICAgIGFzc2VydFRydWUoVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkoIiIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShWQ2FyZFV0aWxzLmNvbnRhaW5zT25seU5vbkNyTGZQcmludGFibGVBc2NpaSgiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiKSk7Ci0gICAgICAgIGFzc2VydFRydWUoVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkoIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaIikpOwotICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICBmb3IgKGludCBpID0gMHgyMDsgaSA8IDB4N0Y7IGkrKykgewotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoKGNoYXIpaSk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0VHJ1ZShWQ2FyZFV0aWxzLmNvbnRhaW5zT25seU5vbkNyTGZQcmludGFibGVBc2NpaShidWlsZGVyLnRvU3RyaW5nKCkpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkoIlx1MDAxOSIpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkoIlx1MDA3RiIpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkoIlxyIikpOwotICAgICAgICBhc3NlcnRGYWxzZShWQ2FyZFV0aWxzLmNvbnRhaW5zT25seU5vbkNyTGZQcmludGFibGVBc2NpaSgiXG4iKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdENvbnRhaW5zT25seUFscGhhRGlnaXRIeXBoZW4oKSB7Ci0gICAgICAgIGFzc2VydFRydWUoVkNhcmRVdGlscy5jb250YWluc09ubHlBbHBoYURpZ2l0SHlwaGVuKChTdHJpbmcpbnVsbCkpOwotICAgICAgICBhc3NlcnRUcnVlKFZDYXJkVXRpbHMuY29udGFpbnNPbmx5QWxwaGFEaWdpdEh5cGhlbigoU3RyaW5nW10pbnVsbCkpOwotICAgICAgICBhc3NlcnRUcnVlKFZDYXJkVXRpbHMuY29udGFpbnNPbmx5QWxwaGFEaWdpdEh5cGhlbigoTGlzdDxTdHJpbmc+KW51bGwpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShWQ2FyZFV0aWxzLmNvbnRhaW5zT25seUFscGhhRGlnaXRIeXBoZW4oIiIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShWQ2FyZFV0aWxzLmNvbnRhaW5zT25seU5vbkNyTGZQcmludGFibGVBc2NpaSgiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiKSk7Ci0gICAgICAgIGFzc2VydFRydWUoVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkoIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaIikpOwotICAgICAgICBhc3NlcnRUcnVlKFZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKCIwMTIzNDU2Nzg5LSIpKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAweDMwOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChpID09IDB4MkQpIHsgIC8vIC0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFzc2VydEZhbHNlKFZDYXJkVXRpbHMuY29udGFpbnNPbmx5QWxwaGFEaWdpdEh5cGhlbihTdHJpbmcudmFsdWVPZigoY2hhcilpKSkpOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGkgPSAweDNBOyBpIDwgMHg0MTsgaSsrKSB7Ci0gICAgICAgICAgICBhc3NlcnRGYWxzZShWQ2FyZFV0aWxzLmNvbnRhaW5zT25seUFscGhhRGlnaXRIeXBoZW4oU3RyaW5nLnZhbHVlT2YoKGNoYXIpaSkpKTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGludCBpID0gMHg1QjsgaSA8IDB4NjE7IGkrKykgewotICAgICAgICAgICAgYXNzZXJ0RmFsc2UoVkNhcmRVdGlscy5jb250YWluc09ubHlBbHBoYURpZ2l0SHlwaGVuKFN0cmluZy52YWx1ZU9mKChjaGFyKWkpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpbnQgaSA9IDB4N0I7IGkgPCAweDEwMDsgaSsrKSB7Ci0gICAgICAgICAgICBhc3NlcnRGYWxzZShWQ2FyZFV0aWxzLmNvbnRhaW5zT25seUFscGhhRGlnaXRIeXBoZW4oU3RyaW5nLnZhbHVlT2YoKGNoYXIpaSkpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RUb1N0cmluZ0F2YWlsYWJsZUFzVjMwUGFyYW1WYWx1ZSgpIHsKLSAgICAgICAgLy8gU21va2UgdGVzdHMuCi0gICAgICAgIGFzc2VydEVxdWFscygiSE9NRSIsIFZDYXJkVXRpbHMudG9TdHJpbmdBdmFpbGFibGVBc1YzMFBhcmFtZVZhbHVlKCJIT01FIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIlRFTCIsIFZDYXJkVXRpbHMudG9TdHJpbmdBdmFpbGFibGVBc1YzMFBhcmFtZVZhbHVlKCJURUwiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiUEFHRVIiLCBWQ2FyZFV0aWxzLnRvU3RyaW5nQXZhaWxhYmxlQXNWMzBQYXJhbWVWYWx1ZSgiUEFHRVIiKSk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJcIlwiIiwgVkNhcmRVdGlscy50b1N0cmluZ0F2YWlsYWJsZUFzVjMwUGFyYW1lVmFsdWUoIiIpKTsKLQotICAgICAgICAvLyBub24tQXNjaWkgbXVzdCBiZSBhbGxvd2VkCi0gICAgICAgIGFzc2VydEVxdWFscygiXHU0RThCXHU1MkQ5XHU2MjQwIiwKLSAgICAgICAgICAgICAgICBWQ2FyZFV0aWxzLnRvU3RyaW5nQXZhaWxhYmxlQXNWMzBQYXJhbWVWYWx1ZSgiXHU0RThCXHU1MkQ5XHU2MjQwIikpOwotICAgICAgICAvLyBSZXBvcnRlZCBhcyBidWcgcmVwb3J0LgotICAgICAgICBhc3NlcnRFcXVhbHMoIlx1OEQzOSIsIFZDYXJkVXRpbHMudG9TdHJpbmdBdmFpbGFibGVBc1YzMFBhcmFtZVZhbHVlKCJcdThEMzkiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiXCJjb21tYSxzZXBhcmF0ZWRcIiIsCi0gICAgICAgICAgICAgICAgVkNhcmRVdGlscy50b1N0cmluZ0F2YWlsYWJsZUFzVjMwUGFyYW1lVmFsdWUoImNvbW1hLHNlcGFyYXRlZCIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJcImNvbG9uOmF3YXJlXCIiLAotICAgICAgICAgICAgICAgIFZDYXJkVXRpbHMudG9TdHJpbmdBdmFpbGFibGVBc1YzMFBhcmFtZVZhbHVlKCJjb2xvbjphd2FyZSIpKTsKLSAgICAgICAgLy8gQ1RMIGNoYXJhY3RlcnMuCi0gICAgICAgIGFzc2VydEVxdWFscygiQ1RMRXhhbXBsZSIsCi0gICAgICAgICAgICAgICAgVkNhcmRVdGlscy50b1N0cmluZ0F2YWlsYWJsZUFzVjMwUGFyYW1lVmFsdWUoIkNUTFx1MDAwMUV4YW1wbGUiKSk7Ci0gICAgICAgIC8vIERRVU9URSBtdXN0IGJlIHJlbW92ZWQuCi0gICAgICAgIGFzc2VydEVxdWFscygicXVvdGVkIiwKLSAgICAgICAgICAgICAgICBWQ2FyZFV0aWxzLnRvU3RyaW5nQXZhaWxhYmxlQXNWMzBQYXJhbWVWYWx1ZSgiXCJxdW90ZWRcIiIpKTsKLSAgICAgICAgLy8gRFFVT1RFIG11c3QgYmUgcmVtb3ZlZCBiYXNpY2FsbHksIGJ1dCB3ZSBzaG91bGQgZGV0ZWN0IGEgc3BhY2UsIHdoaWNoCi0gICAgICAgIC8vIHJlcXVpcmUgdXMgdG8gdXNlIERRVU9URSBhZ2Fpbi4KLSAgICAgICAgLy8gUmlnaHQtc2lkZSBoYXMgb25lIG1vcmUgaWxsZWdhbCBkcXVvdGUgdG8gdGVzdCBxdW90ZS1oYW5kbGUgY29kZSB0aG9yb3VnaGx5LgotICAgICAgICBhc3NlcnRFcXVhbHMoIlwiQWxyZWFkeSBxdW90ZWRcIiIsCi0gICAgICAgICAgICAgICAgVkNhcmRVdGlscy50b1N0cmluZ0F2YWlsYWJsZUFzVjMwUGFyYW1lVmFsdWUoIlwiQWxyZWFkeSBxdW90ZWRcIlwiIikpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZFZlcmlmaWVyLmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRWZXJpZmllci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzY2I1YjliLi4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZFZlcmlmaWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90Ci0gKiB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotICogdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCi0gKiBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKLSAqIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCi0gKiB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZDsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuRW50aXR5SXRlcmF0b3I7Ci1pbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLlZDYXJkQ29tcG9zZXI7Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuVkNhcmRDb25maWc7Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuVkNhcmRFbnRyeUNvbnN0cnVjdG9yOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLlZDYXJkSW50ZXJwcmV0ZXI7Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuVkNhcmRJbnRlcnByZXRlckNvbGxlY3Rpb247Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuVkNhcmRQYXJzZXI7Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuVkNhcmRQYXJzZXJfVjIxOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLlZDYXJkUGFyc2VyX1YzMDsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5leGNlcHRpb24uVkNhcmRFeGNlcHRpb247Ci1pbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKLWltcG9ydCBhbmRyb2lkLnRlc3QubW9jay5Nb2NrQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLS8qIHBhY2thZ2UgKi8gY2xhc3MgQ3VzdG9tTW9ja0NvbnRleHQgZXh0ZW5kcyBNb2NrQ29udGV4dCB7Ci0gICAgZmluYWwgQ29udGVudFJlc29sdmVyIG1SZXNvbHZlcjsKLSAgICBwdWJsaWMgQ3VzdG9tTW9ja0NvbnRleHQoQ29udGVudFJlc29sdmVyIHJlc29sdmVyKSB7Ci0gICAgICAgIG1SZXNvbHZlciA9IHJlc29sdmVyOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBDb250ZW50UmVzb2x2ZXIgZ2V0Q29udGVudFJlc29sdmVyKCkgewotICAgICAgICByZXR1cm4gbVJlc29sdmVyOwotICAgIH0KLX0KLQotLyogcGFja2FnZSAqLyBjbGFzcyBWQ2FyZFZlcmlmaWVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJWQ2FyZFZlcmlmaWVyIjsKLQotICAgIHByaXZhdGUgY2xhc3MgVkNhcmRWZXJpZmllckludGVybmFsIGltcGxlbWVudHMgVkNhcmRDb21wb3Nlci5PbmVFbnRyeUhhbmRsZXIgewotICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbkluaXQoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbkVudHJ5Q3JlYXRlZChTdHJpbmcgdmNhcmQpIHsKLSAgICAgICAgICAgIHZlcmlmeU9uZVZDYXJkKHZjYXJkKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHB1YmxpYyB2b2lkIG9uVGVybWluYXRlKCkgewotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBBbmRyb2lkVGVzdENhc2UgbVRlc3RDYXNlOwotICAgIHByaXZhdGUgZmluYWwgVkNhcmRWZXJpZmllckludGVybmFsIG1WQ2FyZFZlcmlmaWVySW50ZXJuYWw7Ci0gICAgcHJpdmF0ZSBpbnQgbVZDYXJkVHlwZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gbUlzVjMwOwotICAgIHByaXZhdGUgYm9vbGVhbiBtSXNEb0NvTW87Ci0KLSAgICAvLyBPbmx5IG9uZSBvZiB0aGVtIG11c3QgYmUgbm9uLWVtcHR5LgotICAgIHByaXZhdGUgRXhwb3J0VGVzdFJlc29sdmVyIG1FeHBvcnRUZXN0UmVzb2x2ZXI7Ci0gICAgcHJpdmF0ZSBJbnB1dFN0cmVhbSBtSW5wdXRTdHJlYW07Ci0KLSAgICAvLyBUbyBhbGxvdyBkdXBsaWNhdGlvbiwgdXNlIGxpc3QgaW5zdGVhZCBvZiBzZXQuCi0gICAgLy8gV2hlbiBudWxsLCB3ZSBkb24ndCBuZWVkIHRvIGRvIHRoZSB2ZXJpZmljYXRpb24uCi0gICAgcHJpdmF0ZSBQcm9wZXJ0eU5vZGVzVmVyaWZpZXIgbVByb3BlcnR5Tm9kZXNWZXJpZmllcjsKLSAgICBwcml2YXRlIExpbmVWZXJpZmllciBtTGluZVZlcmlmaWVyOwotICAgIHByaXZhdGUgQ29udGVudFZhbHVlc1ZlcmlmaWVyIG1Db250ZW50VmFsdWVzVmVyaWZpZXI7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1Jbml0aWFsaXplZDsKLSAgICBwcml2YXRlIGJvb2xlYW4gbVZlcmlmaWVkID0gZmFsc2U7Ci0KLSAgICBwdWJsaWMgVkNhcmRWZXJpZmllcihBbmRyb2lkVGVzdENhc2UgYW5kcm9pZFRlc3RDYXNlKSB7Ci0gICAgICAgIG1UZXN0Q2FzZSA9IGFuZHJvaWRUZXN0Q2FzZTsKLSAgICAgICAgbVZDYXJkVmVyaWZpZXJJbnRlcm5hbCA9IG5ldyBWQ2FyZFZlcmlmaWVySW50ZXJuYWwoKTsKLSAgICAgICAgbUV4cG9ydFRlc3RSZXNvbHZlciA9IG51bGw7Ci0gICAgICAgIG1JbnB1dFN0cmVhbSA9IG51bGw7Ci0gICAgICAgIG1Jbml0aWFsaXplZCA9IGZhbHNlOwotICAgICAgICBtVmVyaWZpZWQgPSBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbml0Rm9yRXhwb3J0VGVzdChpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIGlmIChtSW5pdGlhbGl6ZWQpIHsKLSAgICAgICAgICAgIG1UZXN0Q2FzZS5mYWlsKCJBbHJlYWR5IGluaXRpYWxpemVkIik7Ci0gICAgICAgIH0KLSAgICAgICAgbUV4cG9ydFRlc3RSZXNvbHZlciA9IG5ldyBFeHBvcnRUZXN0UmVzb2x2ZXIobVRlc3RDYXNlKTsKLSAgICAgICAgbVZDYXJkVHlwZSA9IHZjYXJkVHlwZTsKLSAgICAgICAgbUlzVjMwID0gVkNhcmRDb25maWcuaXNWMzAodmNhcmRUeXBlKTsKLSAgICAgICAgbUlzRG9Db01vID0gVkNhcmRDb25maWcuaXNEb0NvTW8odmNhcmRUeXBlKTsKLSAgICAgICAgbUluaXRpYWxpemVkID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbml0Rm9ySW1wb3J0VGVzdChpbnQgdmNhcmRUeXBlLCBpbnQgcmVzSWQpIHsKLSAgICAgICAgaWYgKG1Jbml0aWFsaXplZCkgewotICAgICAgICAgICAgbVRlc3RDYXNlLmZhaWwoIkFscmVhZHkgaW5pdGlhbGl6ZWQiKTsKLSAgICAgICAgfQotICAgICAgICBtVkNhcmRUeXBlID0gdmNhcmRUeXBlOwotICAgICAgICBtSXNWMzAgPSBWQ2FyZENvbmZpZy5pc1YzMCh2Y2FyZFR5cGUpOwotICAgICAgICBtSXNEb0NvTW8gPSBWQ2FyZENvbmZpZy5pc0RvQ29Nbyh2Y2FyZFR5cGUpOwotICAgICAgICBzZXRJbnB1dFJlc291cmNlSWQocmVzSWQpOwotICAgICAgICBtSW5pdGlhbGl6ZWQgPSB0cnVlOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzZXRJbnB1dFJlc291cmNlSWQoaW50IHJlc0lkKSB7Ci0gICAgICAgIElucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gbVRlc3RDYXNlLmdldENvbnRleHQoKS5nZXRSZXNvdXJjZXMoKS5vcGVuUmF3UmVzb3VyY2UocmVzSWQpOwotICAgICAgICBpZiAoaW5wdXRTdHJlYW0gPT0gbnVsbCkgewotICAgICAgICAgICAgbVRlc3RDYXNlLmZhaWwoIldyb25nIHJlc0lkOiAiICsgcmVzSWQpOwotICAgICAgICB9Ci0gICAgICAgIHNldElucHV0U3RyZWFtKGlucHV0U3RyZWFtKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2V0SW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIHsKLSAgICAgICAgaWYgKG1FeHBvcnRUZXN0UmVzb2x2ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbVRlc3RDYXNlLmZhaWwoImFkZElucHV0RW50cnkoKSBpcyBjYWxsZWQuIik7Ci0gICAgICAgIH0gZWxzZSBpZiAobUlucHV0U3RyZWFtICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1UZXN0Q2FzZS5mYWlsKCJJbnB1dFN0cmVhbSBpcyBhbHJlYWR5IHNldCIpOwotICAgICAgICB9Ci0gICAgICAgIG1JbnB1dFN0cmVhbSA9IGlucHV0U3RyZWFtOwotICAgIH0KLQotICAgIHB1YmxpYyBDb250YWN0RW50cnkgYWRkSW5wdXRFbnRyeSgpIHsKLSAgICAgICAgaWYgKCFtSW5pdGlhbGl6ZWQpIHsKLSAgICAgICAgICAgIG1UZXN0Q2FzZS5mYWlsKCJOb3QgaW5pdGlhbGl6ZWQiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobUlucHV0U3RyZWFtICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1UZXN0Q2FzZS5mYWlsKCJzZXRJbnB1dFN0cmVhbSBpcyBjYWxsZWQiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbUV4cG9ydFRlc3RSZXNvbHZlci5hZGRJbnB1dENvbnRhY3RFbnRyeSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0oKSB7Ci0gICAgICAgIGlmICghbUluaXRpYWxpemVkKSB7Ci0gICAgICAgICAgICBtVGVzdENhc2UuZmFpbCgiTm90IGluaXRpYWxpemVkIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1Qcm9wZXJ0eU5vZGVzVmVyaWZpZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgbVByb3BlcnR5Tm9kZXNWZXJpZmllciA9IG5ldyBQcm9wZXJ0eU5vZGVzVmVyaWZpZXIobVRlc3RDYXNlKTsKLSAgICAgICAgfQotICAgICAgICBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGVsZW0gPQotICAgICAgICAgICAgICAgIG1Qcm9wZXJ0eU5vZGVzVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSgpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiVkVSU0lPTiIsIChtSXNWMzAgPyAiMy4wIiA6ICIyLjEiKSk7Ci0KLSAgICAgICAgcmV0dXJuIGVsZW07Ci0gICAgfQotCi0gICAgcHVibGljIFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0gYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbVdpdGhFbXB0eU5hbWUoKSB7Ci0gICAgICAgIGlmICghbUluaXRpYWxpemVkKSB7Ci0gICAgICAgICAgICBtVGVzdENhc2UuZmFpbCgiTm90IGluaXRpYWxpemVkIik7Ci0gICAgICAgIH0KLSAgICAgICAgUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSBlbGVtID0gYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSgpOwotICAgICAgICBpZiAobUlzVjMwKSB7Ci0gICAgICAgICAgICBlbGVtLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiTiIsICIiKS5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIkZOIiwgIiIpOwotICAgICAgICB9IGVsc2UgaWYgKG1Jc0RvQ29NbykgewotICAgICAgICAgICAgZWxlbS5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIk4iLCAiIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGVsZW07Ci0gICAgfQotCi0gICAgcHVibGljIExpbmVWZXJpZmllckVsZW0gYWRkTGluZVZlcmlmaWVyRWxlbSgpIHsKLSAgICAgICAgaWYgKCFtSW5pdGlhbGl6ZWQpIHsKLSAgICAgICAgICAgIG1UZXN0Q2FzZS5mYWlsKCJOb3QgaW5pdGlhbGl6ZWQiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobUxpbmVWZXJpZmllciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtTGluZVZlcmlmaWVyID0gbmV3IExpbmVWZXJpZmllcihtVGVzdENhc2UsIG1WQ2FyZFR5cGUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtTGluZVZlcmlmaWVyLmFkZExpbmVWZXJpZmllckVsZW0oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSBhZGRDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtKCkgewotICAgICAgICBpZiAoIW1Jbml0aWFsaXplZCkgewotICAgICAgICAgICAgbVRlc3RDYXNlLmZhaWwoIk5vdCBpbml0aWFsaXplZCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtQ29udGVudFZhbHVlc1ZlcmlmaWVyID09IG51bGwpIHsKLSAgICAgICAgICAgIG1Db250ZW50VmFsdWVzVmVyaWZpZXIgPSBuZXcgQ29udGVudFZhbHVlc1ZlcmlmaWVyKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbUNvbnRlbnRWYWx1ZXNWZXJpZmllci5hZGRFbGVtKG1UZXN0Q2FzZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHZlcmlmeU9uZVZDYXJkKGZpbmFsIFN0cmluZyB2Y2FyZCkgewotICAgICAgICAvLyBMb2cuZCgiQEBAIiwgdmNhcmQpOwotICAgICAgICBmaW5hbCBWQ2FyZEludGVycHJldGVyIGJ1aWxkZXI7Ci0gICAgICAgIGlmIChtQ29udGVudFZhbHVlc1ZlcmlmaWVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZpbmFsIFZOb2RlQnVpbGRlciB2bm9kZUJ1aWxkZXIgPSBtUHJvcGVydHlOb2Rlc1ZlcmlmaWVyOwotICAgICAgICAgICAgZmluYWwgVkNhcmRFbnRyeUNvbnN0cnVjdG9yIHZjYXJkRGF0YUJ1aWxkZXIgPQotICAgICAgICAgICAgICAgICAgICBuZXcgVkNhcmRFbnRyeUNvbnN0cnVjdG9yKG1WQ2FyZFR5cGUpOwotICAgICAgICAgICAgdmNhcmREYXRhQnVpbGRlci5hZGRFbnRyeUhhbmRsZXIobUNvbnRlbnRWYWx1ZXNWZXJpZmllcik7Ci0gICAgICAgICAgICBpZiAobVByb3BlcnR5Tm9kZXNWZXJpZmllciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlciA9IG5ldyBWQ2FyZEludGVycHJldGVyQ29sbGVjdGlvbihBcnJheXMuYXNMaXN0KAotICAgICAgICAgICAgICAgICAgICAgICAgbVByb3BlcnR5Tm9kZXNWZXJpZmllciwgdmNhcmREYXRhQnVpbGRlcikpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyID0gdm5vZGVCdWlsZGVyOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKG1Qcm9wZXJ0eU5vZGVzVmVyaWZpZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIgPSBtUHJvcGVydHlOb2Rlc1ZlcmlmaWVyOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBWQ2FyZFBhcnNlciBwYXJzZXIgPQotICAgICAgICAgICAgICAgIChtSXNWMzAgPyBuZXcgVkNhcmRQYXJzZXJfVjMwKHRydWUpIDogbmV3IFZDYXJkUGFyc2VyX1YyMSgpKTsKLSAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgU3RyaW5nIGNoYXJzZXQgPQotICAgICAgICAgICAgICAgIChWQ2FyZENvbmZpZy51c2VzU2hpZnRKaXMobVZDYXJkVHlwZSkgPyAiU0hJRlRfSklTIiA6ICJVVEYtOCIpOwotICAgICAgICAgICAgaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0odmNhcmQuZ2V0Qnl0ZXMoY2hhcnNldCkpOwotICAgICAgICAgICAgbVRlc3RDYXNlLmFzc2VydEVxdWFscyh0cnVlLCBwYXJzZXIucGFyc2UoaXMsIG51bGwsIGJ1aWxkZXIpKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgbVRlc3RDYXNlLmZhaWwoIlVuZXhwZWN0ZWQgSU9FeGNlcHRpb246ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKFZDYXJkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIG1UZXN0Q2FzZS5mYWlsKCJVbmV4cGVjdGVkIFZDYXJkRXhjZXB0aW9uOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKGlzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBpcy5jbG9zZSgpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB2ZXJpZnkoKSB7Ci0gICAgICAgIGlmICghbUluaXRpYWxpemVkKSB7Ci0gICAgICAgICAgICBtVGVzdENhc2UuZmFpbCgiTm90IGluaXRpYWxpemVkLiIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtVmVyaWZpZWQpIHsKLSAgICAgICAgICAgIG1UZXN0Q2FzZS5mYWlsKCJ2ZXJpZnkoKSB3YXMgY2FsbGVkIHR3aWNlLiIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtSW5wdXRTdHJlYW0gIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICB2ZXJpZnlGb3JJbXBvcnRUZXN0KCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgbVRlc3RDYXNlLmZhaWwoIklPRXhjZXB0aW9uIHdhcyB0aHJvd246ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChWQ2FyZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgbVRlc3RDYXNlLmZhaWwoIlZDYXJkRXhjZXB0aW9uIHdhcyB0aHJvd246ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAobUV4cG9ydFRlc3RSZXNvbHZlciAhPSBudWxsKXsKLSAgICAgICAgICAgIHZlcmlmeUZvckV4cG9ydFRlc3QoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1UZXN0Q2FzZS5mYWlsKCJObyBpbnB1dCBpcyBkZXRlcm1pbmVkIik7Ci0gICAgICAgIH0KLSAgICAgICAgbVZlcmlmaWVkID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdmVyaWZ5Rm9ySW1wb3J0VGVzdCgpIHRocm93cyBJT0V4Y2VwdGlvbiwgVkNhcmRFeGNlcHRpb24gewotICAgICAgICBpZiAobUxpbmVWZXJpZmllciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtVGVzdENhc2UuZmFpbCgiTm90IHN1cHBvcnRlZCBub3cuIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1Db250ZW50VmFsdWVzVmVyaWZpZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbUNvbnRlbnRWYWx1ZXNWZXJpZmllci52ZXJpZnkobUlucHV0U3RyZWFtLCBtVkNhcmRUeXBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgRW50aXR5SXRlcmF0b3IgbW9ja0dldEVudGl0eUl0ZXJhdG9yTWV0aG9kKAotICAgICAgICAgICAgZmluYWwgQ29udGVudFJlc29sdmVyIHJlc29sdmVyLAotICAgICAgICAgICAgZmluYWwgVXJpIHVyaSwgZmluYWwgU3RyaW5nIHNlbGVjdGlvbiwKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZ1tdIHNlbGVjdGlvbkFyZ3MsIGZpbmFsIFN0cmluZyBzb3J0T3JkZXIpIHsKLSAgICAgICAgaWYgKEV4cG9ydFRlc3RSZXNvbHZlci5jbGFzcy5lcXVhbHMocmVzb2x2ZXIuZ2V0Q2xhc3MoKSkpIHsKLSAgICAgICAgICAgIHJldHVybiAoKEV4cG9ydFRlc3RSZXNvbHZlcilyZXNvbHZlcikuZ2V0UHJvdmlkZXIoKS5xdWVyeUVudGl0aWVzKAotICAgICAgICAgICAgICAgICAgICB1cmksIHNlbGVjdGlvbiwgc2VsZWN0aW9uQXJncywgc29ydE9yZGVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIExvZy5lKExPR19UQUcsICJVbmV4cGVjdGVkIHByb3ZpZGVyIGdpdmVuLiIpOwotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIE1ldGhvZCBnZXRNb2NrR2V0RW50aXR5SXRlcmF0b3JNZXRob2QoKQotICAgICAgICAgICAgdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uLCBOb1N1Y2hNZXRob2RFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gdGhpcy5nZXRDbGFzcygpLmdldE1ldGhvZCgibW9ja0dldEVudGl0eUl0ZXJhdG9yTWV0aG9kIiwKLSAgICAgICAgICAgICAgICBDb250ZW50UmVzb2x2ZXIuY2xhc3MsIFVyaS5jbGFzcywgU3RyaW5nLmNsYXNzLCBTdHJpbmdbXS5jbGFzcywgU3RyaW5nLmNsYXNzKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdmVyaWZ5Rm9yRXhwb3J0VGVzdCgpIHsKLSAgICAgICBmaW5hbCBWQ2FyZENvbXBvc2VyIGNvbXBvc2VyID0KLSAgICAgICAgICAgIG5ldyBWQ2FyZENvbXBvc2VyKG5ldyBDdXN0b21Nb2NrQ29udGV4dChtRXhwb3J0VGVzdFJlc29sdmVyKSwgbVZDYXJkVHlwZSk7Ci0gICAgICAgIGNvbXBvc2VyLmFkZEhhbmRsZXIobUxpbmVWZXJpZmllcik7Ci0gICAgICAgIGNvbXBvc2VyLmFkZEhhbmRsZXIobVZDYXJkVmVyaWZpZXJJbnRlcm5hbCk7Ci0gICAgICAgIGlmICghY29tcG9zZXIuaW5pdChWQ2FyZENvbXBvc2VyLkNPTlRBQ1RTX1RFU1RfQ09OVEVOVF9VUkksIG51bGwsIG51bGwsIG51bGwpKSB7Ci0gICAgICAgICAgICBBbmRyb2lkVGVzdENhc2UuZmFpbCgiaW5pdCgpIGZhaWxlZC4gUmVhc29uOiAiICsgY29tcG9zZXIuZ2V0RXJyb3JSZWFzb24oKSk7Ci0gICAgICAgIH0KLSAgICAgICAgQW5kcm9pZFRlc3RDYXNlLmFzc2VydEZhbHNlKGNvbXBvc2VyLmlzQWZ0ZXJMYXN0KCkpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgd2hpbGUgKCFjb21wb3Nlci5pc0FmdGVyTGFzdCgpKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgTWV0aG9kIG1vY2tHZXRFbnRpdHlJdGVyYXRvck1ldGhvZCA9IGdldE1vY2tHZXRFbnRpdHlJdGVyYXRvck1ldGhvZCgpOwotICAgICAgICAgICAgICAgICAgICBBbmRyb2lkVGVzdENhc2UuYXNzZXJ0Tm90TnVsbChtb2NrR2V0RW50aXR5SXRlcmF0b3JNZXRob2QpOwotICAgICAgICAgICAgICAgICAgICBBbmRyb2lkVGVzdENhc2UuYXNzZXJ0VHJ1ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb3Nlci5jcmVhdGVPbmVFbnRyeShtb2NrR2V0RW50aXR5SXRlcmF0b3JNZXRob2QpKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgICAgICAgICBBbmRyb2lkVGVzdENhc2UuZmFpbCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGNvbXBvc2VyLnRlcm1pbmF0ZSgpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL1ZOb2RlLmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvVk5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzlmMTBkYy4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvVk5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLS8qKgotICogUHJldmlvdXNseSB1c2VkIGluIG1haW4gdkNhcmQgaGFuZGxpbmcgY29kZSBidXQgbm93IGV4aXN0cyBvbmx5IGZvciB0ZXN0aW5nLgotICovCi1wdWJsaWMgY2xhc3MgVk5vZGUgewotICAgIHB1YmxpYyBTdHJpbmcgVk5hbWU7Ci0KLSAgICBwdWJsaWMgQXJyYXlMaXN0PFByb3BlcnR5Tm9kZT4gcHJvcExpc3QgPSBuZXcgQXJyYXlMaXN0PFByb3BlcnR5Tm9kZT4oKTsKLQotICAgIC8qKiAwOnBhcnNlIG92ZXIuIDE6cGFyc2luZy4gKi8KLSAgICBwdWJsaWMgaW50IHBhcnNlU3RhdHVzID0gMTsKLX0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC9WTm9kZUJ1aWxkZXIuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC9WTm9kZUJ1aWxkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGU2YzMyNS4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvVk5vZGVCdWlsZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXM7Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuVkNhcmRJbnRlcnByZXRlcjsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5WQ2FyZENvbmZpZzsKLWltcG9ydCBhbmRyb2lkLnV0aWwuQ2hhcnNldFV0aWxzOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29kZWMuRGVjb2RlckV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29kZWMuYmluYXJ5LkJhc2U2NDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29kZWMubmV0LlF1b3RlZFByaW50YWJsZUNvZGVjOwotCi1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7Ci1pbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogU3RvcmUgdGhlIHBhcnNlIHJlc3VsdCB0byBjdXN0b20gZGF0YXN0cnVjdDogVk5vZGUsIFByb3BlcnR5Tm9kZQotICogTWF5YmUgc2V2ZXJhbCB2Y2FyZCBpbnN0YW5jZSwgc28gdXNlIHZOb2RlTGlzdCB0byBzdG9yZS4KLSAqIFZOb2RlOiBzdGFuZHkgYnkgYSB2Y2FyZCBpbnN0YW5jZS4KLSAqIFByb3BlcnR5Tm9kZTogc3RhbmR5IGJ5IGEgcHJvcGVydHkgbGluZSBvZiBhIGNhcmQuCi0gKgotICogUHJldmlvdXNseSB1c2VkIGluIG1haW4gdkNhcmQgaGFuZGxpbmcgY29kZSBidXQgbm93IGV4aXN0cyBvbmx5IGZvciB0ZXN0aW5nLgotICovCi1wdWJsaWMgY2xhc3MgVk5vZGVCdWlsZGVyIGltcGxlbWVudHMgVkNhcmRJbnRlcnByZXRlciB7Ci0gICAgc3RhdGljIHByaXZhdGUgU3RyaW5nIExPR19UQUcgPSAiVk5vZGVCdWlsZGVyIjsgCi0gICAgCi0gICAgLyoqCi0gICAgICogSWYgdGhlcmUncyBubyBvdGhlciBpbmZvcm1hdGlvbiBhdmFpbGFibGUsIHRoaXMgY2xhc3MgdXNlcyB0aGlzIGNoYXJzZXQgZm9yIGVuY29kaW5nCi0gICAgICogYnl0ZSBhcnJheXMuCi0gICAgICovCi0gICAgc3RhdGljIHB1YmxpYyBTdHJpbmcgVEFSR0VUX0NIQVJTRVQgPSAiVVRGLTgiOyAKLSAgICAKLSAgICAvKiogdHlwZT1WTm9kZSAqLwotICAgIHB1YmxpYyBMaXN0PFZOb2RlPiB2Tm9kZUxpc3QgPSBuZXcgQXJyYXlMaXN0PFZOb2RlPigpOwotICAgIHByaXZhdGUgaW50IG1Ob2RlTGlzdFBvcyA9IDA7Ci0gICAgcHJpdmF0ZSBWTm9kZSBtQ3VycmVudFZOb2RlOwotICAgIHByaXZhdGUgUHJvcGVydHlOb2RlIG1DdXJyZW50UHJvcE5vZGU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbUN1cnJlbnRQYXJhbVR5cGU7Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhlIGNoYXJzZXQgdXNpbmcgd2hpY2ggVlBhcnNlciBwYXJzZXMgdGhlIHRleHQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgbVNvdXJjZUNoYXJzZXQ7Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhlIGNoYXJzZXQgd2l0aCB3aGljaCBieXRlIGFycmF5IGlzIGVuY29kZWQgdG8gU3RyaW5nLgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIG1UYXJnZXRDaGFyc2V0OwotICAgIAotICAgIHByaXZhdGUgYm9vbGVhbiBtU3RyaWN0TGluZUJyZWFrUGFyc2luZzsKLSAgICAKLSAgICBwdWJsaWMgVk5vZGVCdWlsZGVyKCkgewotICAgICAgICB0aGlzKFZDYXJkQ29uZmlnLkRFRkFVTFRfQ0hBUlNFVCwgVEFSR0VUX0NIQVJTRVQsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVk5vZGVCdWlsZGVyKFN0cmluZyBjaGFyc2V0LCBib29sZWFuIHN0cmljdExpbmVCcmVha1BhcnNpbmcpIHsKLSAgICAgICAgdGhpcyhudWxsLCBjaGFyc2V0LCBzdHJpY3RMaW5lQnJlYWtQYXJzaW5nKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQGhpZGUgc291cmNlQ2hhcnNldCBpcyB0ZW1wb3JhbC4gCi0gICAgICovCi0gICAgcHVibGljIFZOb2RlQnVpbGRlcihTdHJpbmcgc291cmNlQ2hhcnNldCwgU3RyaW5nIHRhcmdldENoYXJzZXQsCi0gICAgICAgICAgICBib29sZWFuIHN0cmljdExpbmVCcmVha1BhcnNpbmcpIHsKLSAgICAgICAgaWYgKHNvdXJjZUNoYXJzZXQgIT0gbnVsbCkgewotICAgICAgICAgICAgbVNvdXJjZUNoYXJzZXQgPSBzb3VyY2VDaGFyc2V0OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbVNvdXJjZUNoYXJzZXQgPSBWQ2FyZENvbmZpZy5ERUZBVUxUX0NIQVJTRVQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHRhcmdldENoYXJzZXQgIT0gbnVsbCkgewotICAgICAgICAgICAgbVRhcmdldENoYXJzZXQgPSB0YXJnZXRDaGFyc2V0OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbVRhcmdldENoYXJzZXQgPSBUQVJHRVRfQ0hBUlNFVDsKLSAgICAgICAgfQotICAgICAgICBtU3RyaWN0TGluZUJyZWFrUGFyc2luZyA9IHN0cmljdExpbmVCcmVha1BhcnNpbmc7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc3RhcnQoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZW5kKCkgewotICAgIH0KLQotICAgIC8vIE5vdGU6IEkgZ3Vlc3MgdGhhdCB0aGlzIGNvZGUgYXNzdW1lcyB0aGUgUmVjb3JkIG1heSBuZXN0IGxpa2UgdGhpczoKLSAgICAvLyBTVEFSVDpWUE9TCi0gICAgLy8gLi4uCi0gICAgLy8gU1RBUlQ6VlBPUzIKLSAgICAvLyAuLi4KLSAgICAvLyBFTkQ6VlBPUzIKLSAgICAvLyAuLi4KLSAgICAvLyBFTkQ6VlBPUwotICAgIC8vCi0gICAgLy8gSG93ZXZlciB0aGUgZm9sbG93aW5nIGNvZGUgaGFzIGEgYnVnLgotICAgIC8vIFdoZW4gZXJyb3Igb2NjdXJzIGFmdGVyIGNhbGxpbmcgc3RhcnRSZWNvcmQoKSwgdGhlIGVudHJ5IHdoaWNoIGlzIHByb2JhYmx5Ci0gICAgLy8gdGhlIGNhdXNlIG9mIHRoZSBlcnJvciByZW1haW5zIHRvIGJlIGluIHZOb2RlTGlzdCwgd2hpbGUgZW5kUmVjb3JkKCkgaXMgbm90IGNhbGxlZC4KLSAgICAvLwotICAgIC8vIEkgbGVhdmUgdGhpcyBjb2RlIGFzIGlzIHNpbmNlIEknbSBub3QgZmFtaWxpYXIgd2l0aCB2Y2FsZW5kYXIgc3BlY2lmaWNhdGlvbi4KLSAgICAvLyBCdXQgSSBiZWxpZXZlIHdlIHNob3VsZCByZWZhY3RvciB0aGlzIGNvZGUgaW4gdGhlIGZ1dHVyZS4KLSAgICAvLyBVbnRpbCB0aGlzLCB0aGUgbGFzdCBlbnRyeSBoYXMgdG8gYmUgcmVtb3ZlZCB3aGVuIHNvbWUgZXJyb3Igb2NjdXJzLgotICAgIHB1YmxpYyB2b2lkIHN0YXJ0RW50cnkoKSB7Ci0gICAgICAgIFZOb2RlIHZub2RlID0gbmV3IFZOb2RlKCk7Ci0gICAgICAgIHZub2RlLnBhcnNlU3RhdHVzID0gMTsKLSAgICAgICAgdm5vZGUuVk5hbWUgPSAiVkNBUkQiOwotICAgICAgICAvLyBJIGZlZWwgdGhpcyBzaG91bGQgYmUgZG9uZSBpbiBlbmRSZWNvcmQoKSwgYnV0IGl0IGNhbm5vdCBiZSBkb25lIGJlY2F1c2Ugb2YKLSAgICAgICAgLy8gdGhlIHJlYXNvbiBhYm92ZS4KLSAgICAgICAgdk5vZGVMaXN0LmFkZCh2bm9kZSk7Ci0gICAgICAgIG1Ob2RlTGlzdFBvcyA9IHZOb2RlTGlzdC5zaXplKCkgLSAxOwotICAgICAgICBtQ3VycmVudFZOb2RlID0gdk5vZGVMaXN0LmdldChtTm9kZUxpc3RQb3MpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGVuZEVudHJ5KCkgewotICAgICAgICBWTm9kZSBlbmROb2RlID0gdk5vZGVMaXN0LmdldChtTm9kZUxpc3RQb3MpOwotICAgICAgICBlbmROb2RlLnBhcnNlU3RhdHVzID0gMDsKLSAgICAgICAgd2hpbGUobU5vZGVMaXN0UG9zID4gMCl7Ci0gICAgICAgICAgICBtTm9kZUxpc3RQb3MtLTsKLSAgICAgICAgICAgIGlmKCh2Tm9kZUxpc3QuZ2V0KG1Ob2RlTGlzdFBvcykpLnBhcnNlU3RhdHVzID09IDEpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgbUN1cnJlbnRWTm9kZSA9IHZOb2RlTGlzdC5nZXQobU5vZGVMaXN0UG9zKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzdGFydFByb3BlcnR5KCkgewotICAgICAgICBtQ3VycmVudFByb3BOb2RlID0gbmV3IFByb3BlcnR5Tm9kZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGVuZFByb3BlcnR5KCkgewotICAgICAgICBtQ3VycmVudFZOb2RlLnByb3BMaXN0LmFkZChtQ3VycmVudFByb3BOb2RlKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgcHJvcGVydHlOYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIG1DdXJyZW50UHJvcE5vZGUucHJvcE5hbWUgPSBuYW1lOwotICAgIH0KLQotICAgIC8vIFVzZWQgb25seSBpbiBWQ2FyZC4KLSAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eUdyb3VwKFN0cmluZyBncm91cCkgewotICAgICAgICBtQ3VycmVudFByb3BOb2RlLnByb3BHcm91cFNldC5hZGQoZ3JvdXApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eVBhcmFtVHlwZShTdHJpbmcgdHlwZSkgewotICAgICAgICBtQ3VycmVudFBhcmFtVHlwZSA9IHR5cGU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJvcGVydHlQYXJhbVZhbHVlKFN0cmluZyB2YWx1ZSkgewotICAgICAgICBpZiAobUN1cnJlbnRQYXJhbVR5cGUgPT0gbnVsbCB8fAotICAgICAgICAgICAgICAgIG1DdXJyZW50UGFyYW1UeXBlLmVxdWFsc0lnbm9yZUNhc2UoIlRZUEUiKSkgewotICAgICAgICAgICAgbUN1cnJlbnRQcm9wTm9kZS5wYXJhbU1hcF9UWVBFLmFkZCh2YWx1ZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtQ3VycmVudFByb3BOb2RlLnBhcmFtTWFwLnB1dChtQ3VycmVudFBhcmFtVHlwZSwgdmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgbUN1cnJlbnRQYXJhbVR5cGUgPSBudWxsOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGVuY29kZVN0cmluZyhTdHJpbmcgb3JpZ2luYWxTdHJpbmcsIFN0cmluZyB0YXJnZXRDaGFyc2V0KSB7Ci0gICAgICAgIGlmIChtU291cmNlQ2hhcnNldC5lcXVhbHNJZ25vcmVDYXNlKHRhcmdldENoYXJzZXQpKSB7Ci0gICAgICAgICAgICByZXR1cm4gb3JpZ2luYWxTdHJpbmc7Ci0gICAgICAgIH0KLSAgICAgICAgQ2hhcnNldCBjaGFyc2V0ID0gQ2hhcnNldC5mb3JOYW1lKG1Tb3VyY2VDaGFyc2V0KTsKLSAgICAgICAgQnl0ZUJ1ZmZlciBieXRlQnVmZmVyID0gY2hhcnNldC5lbmNvZGUob3JpZ2luYWxTdHJpbmcpOwotICAgICAgICAvLyBieXRlQnVmZmVyLmFycmF5KCkgIm1heSIgcmV0dXJuIGJ5dGUgYXJyYXkgd2hpY2ggaXMgbGFyZ2VyIHRoYW4KLSAgICAgICAgLy8gYnl0ZUJ1ZmZlci5yZW1haW5pbmcoKS4gSGVyZSwgd2Uga2VlcCBvbiB0aGUgc2FmZSBzaWRlLgotICAgICAgICBieXRlW10gYnl0ZXMgPSBuZXcgYnl0ZVtieXRlQnVmZmVyLnJlbWFpbmluZygpXTsKLSAgICAgICAgYnl0ZUJ1ZmZlci5nZXQoYnl0ZXMpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoYnl0ZXMsIHRhcmdldENoYXJzZXQpOwotICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJGYWlsZWQgdG8gZW5jb2RlOiBjaGFyc2V0PSIgKyB0YXJnZXRDaGFyc2V0KTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgU3RyaW5nIGhhbmRsZU9uZVZhbHVlKFN0cmluZyB2YWx1ZSwgU3RyaW5nIHRhcmdldENoYXJzZXQsIFN0cmluZyBlbmNvZGluZykgewotICAgICAgICBpZiAoZW5jb2RpbmcgIT0gbnVsbCkgewotICAgICAgICAgICAgZW5jb2RpbmcgPSBlbmNvZGluZy50b1VwcGVyQ2FzZSgpOwotICAgICAgICAgICAgaWYgKGVuY29kaW5nLmVxdWFscygiQkFTRTY0IikgfHwgZW5jb2RpbmcuZXF1YWxzKCJCIikpIHsKLSAgICAgICAgICAgICAgICAvLyBBc3N1bWUgQkFTRTY0IGlzIHVzZWQgb25seSB3aGVuIHRoZSBudW1iZXIgb2YgdmFsdWVzIGlzIDEuCi0gICAgICAgICAgICAgICAgbUN1cnJlbnRQcm9wTm9kZS5wcm9wVmFsdWVfYnl0ZXMgPQotICAgICAgICAgICAgICAgICAgICBCYXNlNjQuZGVjb2RlQmFzZTY0KHZhbHVlLmdldEJ5dGVzKCkpOwotICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZW5jb2RpbmcuZXF1YWxzKCJRVU9URUQtUFJJTlRBQkxFIikpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcXVvdGVkUHJpbnRhYmxlID0gdmFsdWUKLSAgICAgICAgICAgICAgICAucmVwbGFjZUFsbCgiPSAiLCAiICIpLnJlcGxhY2VBbGwoIj1cdCIsICJcdCIpOwotICAgICAgICAgICAgICAgIFN0cmluZ1tdIGxpbmVzOwotICAgICAgICAgICAgICAgIGlmIChtU3RyaWN0TGluZUJyZWFrUGFyc2luZykgewotICAgICAgICAgICAgICAgICAgICBsaW5lcyA9IHF1b3RlZFByaW50YWJsZS5zcGxpdCgiXHJcbiIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgICAgICAgICAgICAgIGludCBsZW5ndGggPSBxdW90ZWRQcmludGFibGUubGVuZ3RoKCk7Ci0gICAgICAgICAgICAgICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBjaCA9IHF1b3RlZFByaW50YWJsZS5jaGFyQXQoaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJ1xuJykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QuYWRkKGJ1aWxkZXIudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09ICdccicpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0LmFkZChidWlsZGVyLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpIDwgbGVuZ3RoIC0gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIG5leHRDaCA9IHF1b3RlZFByaW50YWJsZS5jaGFyQXQoaSArIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV4dENoID09ICdcbicpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoY2gpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBmaW5hbExpbmUgPSBidWlsZGVyLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmaW5hbExpbmUubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsaXN0LmFkZChmaW5hbExpbmUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGxpbmVzID0gbGlzdC50b0FycmF5KG5ldyBTdHJpbmdbMF0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIGxpbmUgOiBsaW5lcykgewotICAgICAgICAgICAgICAgICAgICBpZiAobGluZS5lbmRzV2l0aCgiPSIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsaW5lID0gbGluZS5zdWJzdHJpbmcoMCwgbGluZS5sZW5ndGgoKSAtIDEpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGxpbmUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBieXRlW10gYnl0ZXM7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgYnl0ZXMgPSBidWlsZGVyLnRvU3RyaW5nKCkuZ2V0Qnl0ZXMobVNvdXJjZUNoYXJzZXQpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZTEpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIkZhaWxlZCB0byBlbmNvZGU6IGNoYXJzZXQ9IiArIG1Tb3VyY2VDaGFyc2V0KTsKLSAgICAgICAgICAgICAgICAgICAgYnl0ZXMgPSBidWlsZGVyLnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgYnl0ZXMgPSBRdW90ZWRQcmludGFibGVDb2RlYy5kZWNvZGVRdW90ZWRQcmludGFibGUoYnl0ZXMpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKERlY29kZXJFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiRmFpbGVkIHRvIGRlY29kZSBxdW90ZWQtcHJpbnRhYmxlOiAiICsgZSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAiIjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhieXRlcywgdGFyZ2V0Q2hhcnNldCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJGYWlsZWQgdG8gZW5jb2RlOiBjaGFyc2V0PSIgKyB0YXJnZXRDaGFyc2V0KTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoYnl0ZXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIFVua25vd24gZW5jb2RpbmcuIEZhbGwgYmFjayB0byBkZWZhdWx0LgotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBlbmNvZGVTdHJpbmcodmFsdWUsIHRhcmdldENoYXJzZXQpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eVZhbHVlcyhMaXN0PFN0cmluZz4gdmFsdWVzKSB7Ci0gICAgICAgIGlmICh2YWx1ZXMgPT0gbnVsbCB8fCB2YWx1ZXMuc2l6ZSgpID09IDApIHsKLSAgICAgICAgICAgIG1DdXJyZW50UHJvcE5vZGUucHJvcFZhbHVlX2J5dGVzID0gbnVsbDsKLSAgICAgICAgICAgIG1DdXJyZW50UHJvcE5vZGUucHJvcFZhbHVlX3ZlY3Rvci5jbGVhcigpOwotICAgICAgICAgICAgbUN1cnJlbnRQcm9wTm9kZS5wcm9wVmFsdWVfdmVjdG9yLmFkZCgiIik7Ci0gICAgICAgICAgICBtQ3VycmVudFByb3BOb2RlLnByb3BWYWx1ZSA9ICIiOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBDb250ZW50VmFsdWVzIHBhcmFtTWFwID0gbUN1cnJlbnRQcm9wTm9kZS5wYXJhbU1hcDsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZyB0YXJnZXRDaGFyc2V0ID0gQ2hhcnNldFV0aWxzLm5hbWVGb3JEZWZhdWx0VmVuZG9yKHBhcmFtTWFwLmdldEFzU3RyaW5nKCJDSEFSU0VUIikpOyAKLSAgICAgICAgU3RyaW5nIGVuY29kaW5nID0gcGFyYW1NYXAuZ2V0QXNTdHJpbmcoIkVOQ09ESU5HIik7IAotICAgICAgICAKLSAgICAgICAgaWYgKHRhcmdldENoYXJzZXQgPT0gbnVsbCB8fCB0YXJnZXRDaGFyc2V0Lmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgIHRhcmdldENoYXJzZXQgPSBtVGFyZ2V0Q2hhcnNldDsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZm9yIChTdHJpbmcgdmFsdWUgOiB2YWx1ZXMpIHsKLSAgICAgICAgICAgIG1DdXJyZW50UHJvcE5vZGUucHJvcFZhbHVlX3ZlY3Rvci5hZGQoCi0gICAgICAgICAgICAgICAgICAgIGhhbmRsZU9uZVZhbHVlKHZhbHVlLCB0YXJnZXRDaGFyc2V0LCBlbmNvZGluZykpOwotICAgICAgICB9Ci0KLSAgICAgICAgbUN1cnJlbnRQcm9wTm9kZS5wcm9wVmFsdWUgPSBsaXN0VG9TdHJpbmcobUN1cnJlbnRQcm9wTm9kZS5wcm9wVmFsdWVfdmVjdG9yKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBsaXN0VG9TdHJpbmcoTGlzdDxTdHJpbmc+IGxpc3QpewotICAgICAgICBpbnQgc2l6ZSA9IGxpc3Quc2l6ZSgpOwotICAgICAgICBpZiAoc2l6ZSA+IDEpIHsKLSAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgdHlwZUxpc3RCID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgIGZvciAoU3RyaW5nIHR5cGUgOiBsaXN0KSB7Ci0gICAgICAgICAgICAgICAgdHlwZUxpc3RCLmFwcGVuZCh0eXBlKS5hcHBlbmQoIjsiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludCBsZW4gPSB0eXBlTGlzdEIubGVuZ3RoKCk7Ci0gICAgICAgICAgICBpZiAobGVuID4gMCAmJiB0eXBlTGlzdEIuY2hhckF0KGxlbiAtIDEpID09ICc7JykgewotICAgICAgICAgICAgICAgIHJldHVybiB0eXBlTGlzdEIuc3Vic3RyaW5nKDAsIGxlbiAtIDEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHR5cGVMaXN0Qi50b1N0cmluZygpOwotICAgICAgICB9IGVsc2UgaWYgKHNpemUgPT0gMSkgewotICAgICAgICAgICAgcmV0dXJuIGxpc3QuZ2V0KDApOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuICIiOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVzdWx0KCl7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3Byb3ZpZGVyL1NldHRpbmdzUHJvdmlkZXJUZXN0LmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9wcm92aWRlci9TZXR0aW5nc1Byb3ZpZGVyVGVzdC5qYXZhCmluZGV4IDM3MGFlNzguLmI4MmU2OTggMTAwNjQ0Ci0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3Byb3ZpZGVyL1NldHRpbmdzUHJvdmlkZXJUZXN0LmphdmEKKysrIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcHJvdmlkZXIvU2V0dGluZ3NQcm92aWRlclRlc3QuamF2YQpAQCAtMTQ0LDQgKzE0NCw1MSBAQAogCiAgICAgICAgIGFzc2VydEVxdWFscyhudWxsLCBTZXR0aW5ncy5Cb29rbWFya3MuZ2V0SW50ZW50Rm9yU2hvcnRjdXQociwgJyonKSk7CiAgICAgfQorCisgICAgQE1lZGl1bVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VQcm92aWRlckxpc3QoKSB7CisgICAgICAgIENvbnRlbnRSZXNvbHZlciByID0gZ2V0Q29udGV4dCgpLmdldENvbnRlbnRSZXNvbHZlcigpOworCisgICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBnZXQgb3V0IHdoYXQgd2UgcHV0IGluLgorICAgICAgICBTZXR0aW5ncy5TZWN1cmUucHV0U3RyaW5nKHIsIFNldHRpbmdzLlNlY3VyZS5MT0NBVElPTl9QUk9WSURFUlNfQUxMT1dFRCwKKyAgICAgICAgICAgICAgICAidGVzdDEsdGVzdDIsdGVzdDMiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFNldHRpbmdzLlNlY3VyZS5nZXRTdHJpbmcociwgU2V0dGluZ3MuU2VjdXJlLkxPQ0FUSU9OX1BST1ZJREVSU19BTExPV0VEKSwKKyAgICAgICAgICAgICAgICAidGVzdDEsdGVzdDIsdGVzdDMiKTsKKworICAgICAgICAvLyBUZXN0IGFkZGluZyBhIHZhbHVlCisgICAgICAgIFNldHRpbmdzLlNlY3VyZS5wdXRTdHJpbmcociwgU2V0dGluZ3MuU2VjdXJlLkxPQ0FUSU9OX1BST1ZJREVSU19BTExPV0VELAorICAgICAgICAgICAgICAgICIiKTsKKyAgICAgICAgU2V0dGluZ3MuU2VjdXJlLnB1dFN0cmluZyhyLCBTZXR0aW5ncy5TZWN1cmUuTE9DQVRJT05fUFJPVklERVJTX0FMTE9XRUQsICIrdGVzdDEiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXN0MSIsCisgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLmdldFN0cmluZyhyLCBTZXR0aW5ncy5TZWN1cmUuTE9DQVRJT05fUFJPVklERVJTX0FMTE9XRUQpKTsKKworICAgICAgICAvLyBUZXN0IGFkZGluZyBhIHNlY29uZCB2YWx1ZQorICAgICAgICBTZXR0aW5ncy5TZWN1cmUucHV0U3RyaW5nKHIsIFNldHRpbmdzLlNlY3VyZS5MT0NBVElPTl9QUk9WSURFUlNfQUxMT1dFRCwgIit0ZXN0MiIpOworICAgICAgICBhc3NlcnRFcXVhbHMoInRlc3QxLHRlc3QyIiwKKyAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuZ2V0U3RyaW5nKHIsIFNldHRpbmdzLlNlY3VyZS5MT0NBVElPTl9QUk9WSURFUlNfQUxMT1dFRCkpOworCisgICAgICAgIC8vIFRlc3QgYWRkaW5nIGEgdGhpcmQgdmFsdWUKKyAgICAgICAgU2V0dGluZ3MuU2VjdXJlLnB1dFN0cmluZyhyLCBTZXR0aW5ncy5TZWN1cmUuTE9DQVRJT05fUFJPVklERVJTX0FMTE9XRUQsICIrdGVzdDMiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXN0MSx0ZXN0Mix0ZXN0MyIsCisgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLmdldFN0cmluZyhyLCBTZXR0aW5ncy5TZWN1cmUuTE9DQVRJT05fUFJPVklERVJTX0FMTE9XRUQpKTsKKworICAgICAgICAvLyBUZXN0IGRlbGV0aW5nIHRoZSBmaXJzdCB2YWx1ZSBpbiBhIDMgaXRlbSBsaXN0CisgICAgICAgIFNldHRpbmdzLlNlY3VyZS5wdXRTdHJpbmcociwgU2V0dGluZ3MuU2VjdXJlLkxPQ0FUSU9OX1BST1ZJREVSU19BTExPV0VELCAiLXRlc3QxIik7CisgICAgICAgIGFzc2VydEVxdWFscygidGVzdDIsdGVzdDMiLAorICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5nZXRTdHJpbmcociwgU2V0dGluZ3MuU2VjdXJlLkxPQ0FUSU9OX1BST1ZJREVSU19BTExPV0VEKSk7CisKKyAgICAgICAgLy8gVGVzdCBkZWxldGluZyB0aGUgbWlkZGxlIHZhbHVlIGluIGEgMyBpdGVtIGxpc3QKKyAgICAgICAgU2V0dGluZ3MuU2VjdXJlLnB1dFN0cmluZyhyLCBTZXR0aW5ncy5TZWN1cmUuTE9DQVRJT05fUFJPVklERVJTX0FMTE9XRUQsCisgICAgICAgICAgICAgICAgInRlc3QxLHRlc3QyLHRlc3QzIik7CisgICAgICAgIFNldHRpbmdzLlNlY3VyZS5wdXRTdHJpbmcociwgU2V0dGluZ3MuU2VjdXJlLkxPQ0FUSU9OX1BST1ZJREVSU19BTExPV0VELCAiLXRlc3QyIik7CisgICAgICAgIGFzc2VydEVxdWFscygidGVzdDEsdGVzdDMiLAorICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5nZXRTdHJpbmcociwgU2V0dGluZ3MuU2VjdXJlLkxPQ0FUSU9OX1BST1ZJREVSU19BTExPV0VEKSk7CisKKyAgICAgICAgLy8gVGVzdCBkZWxldGluZyB0aGUgbGFzdCB2YWx1ZSBpbiBhIDMgaXRlbSBsaXN0CisgICAgICAgIFNldHRpbmdzLlNlY3VyZS5wdXRTdHJpbmcociwgU2V0dGluZ3MuU2VjdXJlLkxPQ0FUSU9OX1BST1ZJREVSU19BTExPV0VELAorICAgICAgICAgICAgICAgICJ0ZXN0MSx0ZXN0Mix0ZXN0MyIpOworICAgICAgICBTZXR0aW5ncy5TZWN1cmUucHV0U3RyaW5nKHIsIFNldHRpbmdzLlNlY3VyZS5MT0NBVElPTl9QUk9WSURFUlNfQUxMT1dFRCwgIi10ZXN0MyIpOworICAgICAgICBhc3NlcnRFcXVhbHMoInRlc3QxLHRlc3QyIiwKKyAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuZ2V0U3RyaW5nKHIsIFNldHRpbmdzLlNlY3VyZS5MT0NBVElPTl9QUk9WSURFUlNfQUxMT1dFRCkpOworICAgICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC90ZXh0L1N0YXRpY0xheW91dEJpZGlUZXN0LmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC90ZXh0L1N0YXRpY0xheW91dEJpZGlUZXN0LmphdmEKaW5kZXggOGU3ZTYzZS4uZmIwZjBjMSAxMDA2NDQKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvdGV4dC9TdGF0aWNMYXlvdXRCaWRpVGVzdC5qYXZhCisrKyBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3RleHQvU3RhdGljTGF5b3V0QmlkaVRlc3QuamF2YQpAQCAtMjIsNyArMjIsNyBAQAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKIAogLyoqCi0gKiBUZXN0cyBTdGF0aWNMYXlvdXQgYmlkaSBpbXBsZW1lbnRhdGlvbi4KKyAqIFF1aWNrIGNoZWNrIG9mIG5hdGl2ZSBiaWRpIGltcGxlbWVudGF0aW9uLgogICovCiBwdWJsaWMgY2xhc3MgU3RhdGljTGF5b3V0QmlkaVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAgICAgCkBAIC00MSw3MyArNDEsNDcgQEAKICAgICAKICAgICAvL0BTbWFsbFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0QWxsTHRyKCkgewotICAgICAgICBleHBlY3RCaWRpKFJFUV9ETCwgImEgdGVzdCIsICIwMDAwMDAiLCBMKTsKKyAgICAgICAgZXhwZWN0TmF0aXZlQmlkaShSRVFfREwsICJhIHRlc3QiLCAiMDAwMDAwIiwgTCk7CiAgICAgfQogICAgIAogICAgIC8vQFNtYWxsVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RMdHJSdGwoKSB7Ci0gICAgICAgIGV4cGVjdEJpZGkoUkVRX0RMLCAiYWJjICIgKyBBTEVGICsgQkVUICsgR0lNRUwsICIwMDAwMTExIiwgTCk7CisgICAgICAgIGV4cGVjdE5hdGl2ZUJpZGkoUkVRX0RMLCAiYWJjICIgKyBBTEVGICsgQkVUICsgR0lNRUwsICIwMDAwMTExIiwgTCk7CiAgICAgfQogICAgIAogICAgIC8vQFNtYWxsVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RBbGxSdGwoKSB7Ci0gICAgICAgIGV4cGVjdEJpZGkoUkVRX0RMLCBBTEVGICsgU1AgKyBBTEVGICsgQkVUICsgR0lNRUwgKyBEQUxFVCwgIjExMTExMSIsIFIpOworICAgICAgICBleHBlY3ROYXRpdmVCaWRpKFJFUV9ETCwgQUxFRiArIFNQICsgQUxFRiArIEJFVCArIEdJTUVMICsgREFMRVQsICIxMTExMTEiLCBSKTsKICAgICB9CiAgICAgCiAgICAgLy9AU21hbGxUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFJ0bEx0cigpIHsKLSAgICAgICAgZXhwZWN0QmlkaShSRVFfREwsICBBTEVGICsgQkVUICsgR0lNRUwgKyAiIGFiYyIsICIxMTExMDAwIiwgUik7CisgICAgICAgIGV4cGVjdE5hdGl2ZUJpZGkoUkVRX0RMLCAgQUxFRiArIEJFVCArIEdJTUVMICsgIiBhYmMiLCAiMTExMTIyMiIsIFIpOwogICAgIH0KICAgICAKICAgICAvL0BTbWFsbFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0UkFsbEx0cigpIHsKLSAgICAgICAgZXhwZWN0QmlkaShSRVFfUiwgImEgdGVzdCIsICIwMDAwMDAiLCBSKTsKKyAgICAgICAgZXhwZWN0TmF0aXZlQmlkaShSRVFfUiwgImEgdGVzdCIsICIyMjIyMjIiLCBSKTsKICAgICB9CiAgICAgCiAgICAgLy9AU21hbGxUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFJMdHJSdGwoKSB7Ci0gICAgICAgIGV4cGVjdEJpZGkoUkVRX1IsICJhYmMgIiArIEFMRUYgKyBCRVQgKyBHSU1FTCwgIjAwMDExMTEiLCBSKTsKKyAgICAgICAgZXhwZWN0TmF0aXZlQmlkaShSRVFfUiwgImFiYyAiICsgQUxFRiArIEJFVCArIEdJTUVMLCAiMjIyMTExMSIsIFIpOwogICAgIH0KICAgICAKICAgICAvL0BTbWFsbFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0TEFsbFJ0bCgpIHsKLSAgICAgICAgZXhwZWN0QmlkaShSRVFfTCwgQUxFRiArIFNQICsgQUxFRiArIEJFVCArIEdJTUVMICsgREFMRVQsICIxMTExMTEiLCBMKTsKKyAgICAgICAgZXhwZWN0TmF0aXZlQmlkaShSRVFfTCwgQUxFRiArIFNQICsgQUxFRiArIEJFVCArIEdJTUVMICsgREFMRVQsICIxMTExMTEiLCBMKTsKICAgICB9CiAgICAgCiAgICAgLy9AU21hbGxUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdExSdGxMdHIoKSB7Ci0gICAgICAgIGV4cGVjdEJpZGkoUkVRX0wsICBBTEVGICsgQkVUICsgR0lNRUwgKyAiIGFiYyIsICIxMTEwMDAwIiwgTCk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBleHBlY3RCaWRpKGludCBkaXIsIFN0cmluZyB0ZXh0LCAKLSAgICAgICAgICAgIFN0cmluZyBleHBlY3RlZExldmVscywgaW50IGV4cGVjdGVkRGlyKSB7Ci0gICAgICAgIGNoYXJbXSBjaHMgPSB0ZXh0LnRvQ2hhckFycmF5KCk7Ci0gICAgICAgIGludCBuID0gY2hzLmxlbmd0aDsKLSAgICAgICAgYnl0ZVtdIGNoSW5mbyA9IG5ldyBieXRlW25dOwotICAgICAgICAKLSAgICAgICAgaW50IHJlc3VsdERpciA9IFN0YXRpY0xheW91dC5iaWRpKGRpciwgY2hzLCBjaEluZm8sIG4sIGZhbHNlKTsKLSAgICAgICAgCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigiaW5mbzoiKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgKytpKSB7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIgIikuYXBwZW5kKFN0cmluZy52YWx1ZU9mKGNoSW5mb1tpXSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTG9nLmkoIkJJREkiLCBzYi50b1N0cmluZygpKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgY2hhcltdIHJlc3VsdExldmVsQ2hhcnMgPSBuZXcgY2hhcltuXTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyArK2kpIHsKLSAgICAgICAgICAgIHJlc3VsdExldmVsQ2hhcnNbaV0gPSAoY2hhcikoJzAnICsgY2hJbmZvW2ldKTsKLSAgICAgICAgfQotICAgICAgICBTdHJpbmcgcmVzdWx0TGV2ZWxzID0gbmV3IFN0cmluZyhyZXN1bHRMZXZlbENoYXJzKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJkaXJlY3Rpb24iLCBleHBlY3RlZERpciwgcmVzdWx0RGlyKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJsZXZlbHMiLCBleHBlY3RlZExldmVscywgcmVzdWx0TGV2ZWxzKTsKKyAgICAgICAgZXhwZWN0TmF0aXZlQmlkaShSRVFfREwsICBBTEVGICsgQkVUICsgR0lNRUwgKyAiIGFiYyIsICIxMTExMjIyIiwgUik7CiAgICAgfQogICAgIAogICAgIC8vQFNtYWxsVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3ROYXRpdmVCaWRpKCkgewotICAgICAgICAvLyBuYXRpdmUgYmlkaSByZXR1cm5zIGxldmVscywgbm90IHNpbXBseSBkaXJlY3Rpb25zCi0gICAgICAgIGV4cGVjdE5hdGl2ZUJpZGkoUkVRX0RMLCAgQUxFRiArIEJFVCArIEdJTUVMICsgIiBhYmMiLCAiMTExMTIyMiIsIFIpOworICAgICAgICBleHBlY3ROYXRpdmVCaWRpKFJFUV9MLCAgQUxFRiArIEJFVCArIEdJTUVMICsgIiBhYmMiLCAiMTExMDAwMCIsIEwpOwogICAgIH0KICAgICAKICAgICBwcml2YXRlIHZvaWQgZXhwZWN0TmF0aXZlQmlkaShpbnQgZGlyLCBTdHJpbmcgdGV4dCwgCmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC90ZXh0L1N0YXRpY0xheW91dERpcmVjdGlvbnNUZXN0LmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC90ZXh0L1N0YXRpY0xheW91dERpcmVjdGlvbnNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZkZTg0OQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3RleHQvU3RhdGljTGF5b3V0RGlyZWN0aW9uc1Rlc3QuamF2YQpAQCAtMCwwICsxLDI0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90CisgKiB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorICogdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisgKiBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKKyAqIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCisgKiB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQudGV4dDsKKworaW1wb3J0IGFuZHJvaWQudGV4dC5MYXlvdXQuRGlyZWN0aW9uczsKK2ltcG9ydCBhbmRyb2lkLnRleHQuU3RhdGljTGF5b3V0VGVzdC5MYXlvdXRCdWlsZGVyOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuRm9ybWF0dGVyOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitwdWJsaWMgY2xhc3MgU3RhdGljTGF5b3V0RGlyZWN0aW9uc1Rlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBBTEVGID0gJ1x1MDVkMCc7CisKKyAgICBwcml2YXRlIHN0YXRpYyBEaXJlY3Rpb25zIGRpcnMoaW50IC4uLiBkaXJzKSB7CisgICAgICAgIHJldHVybiBuZXcgRGlyZWN0aW9ucyhkaXJzKTsKKyAgICB9CisKKyAgICAvLyBjb25zdGFudHMgZnJvbSBMYXlvdXQgdGhhdCBhcmUgcGFja2FnZS1wcm90ZWN0ZWQKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUlVOX0xFTkdUSF9NQVNLID0gMHgwM2ZmZmZmZjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUlVOX0xFVkVMX1NISUZUID0gMjY7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJVTl9MRVZFTF9NQVNLID0gMHgzZjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUlVOX1JUTF9GTEFHID0gMSA8PCBSVU5fTEVWRUxfU0hJRlQ7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBEaXJlY3Rpb25zIERJUlNfQUxMX0xFRlRfVE9fUklHSFQgPQorICAgICAgICBuZXcgRGlyZWN0aW9ucyhuZXcgaW50W10geyAwLCBSVU5fTEVOR1RIX01BU0sgfSk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGlyZWN0aW9ucyBESVJTX0FMTF9SSUdIVF9UT19MRUZUID0KKyAgICAgICAgbmV3IERpcmVjdGlvbnMobmV3IGludFtdIHsgMCwgUlVOX0xFTkdUSF9NQVNLIHwgUlVOX1JUTF9GTEFHIH0pOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IExWTDFfMSA9IDEgfCAoMSA8PCBSVU5fTEVWRUxfU0hJRlQpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMVkwyXzEgPSAxIHwgKDIgPDwgUlVOX0xFVkVMX1NISUZUKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTFZMMl8yID0gMiB8ICgyIDw8IFJVTl9MRVZFTF9TSElGVCk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSB0ZXh0cyA9IHsKKyAgICAgICAgIiIsCisgICAgICAgICIgIiwKKyAgICAgICAgImEiLAorICAgICAgICAiYTEiLAorICAgICAgICAiYUEiLAorICAgICAgICAiYTFiIiwKKyAgICAgICAgImExQSIsCisgICAgICAgICJhQTEiLAorICAgICAgICAiYUFiIiwKKyAgICAgICAgImFBMUIiLAorICAgICAgICAiYUExQjIiLAorCisgICAgICAgIC8vIHJ0bAorICAgICAgICAiQSIsCisgICAgICAgICJBMSIsCisgICAgICAgICJBYSIsCisgICAgICAgICJBMUIiLAorICAgICAgICAiQTFhIiwKKyAgICAgICAgIkFhMSIsCisgICAgICAgICJBYUIiCisgICAgfTsKKworICAgIC8vIEV4cGVjdGVkIGRpcmVjdGlvbnMgYXJlIGFuIGFycmF5IG9mIHN0YXJ0L2xlbmd0aCtsZXZlbCBwYWlycywKKyAgICAvLyBpbiB2aXN1YWwgb3JkZXIgZnJvbSB0aGUgbGVhZGluZyBtYXJnaW4uCisgICAgcHJpdmF0ZSBzdGF0aWMgRGlyZWN0aW9uc1tdIGV4cGVjdGVkID0geworICAgICAgICBESVJTX0FMTF9MRUZUX1RPX1JJR0hULAorICAgICAgICBESVJTX0FMTF9MRUZUX1RPX1JJR0hULAorICAgICAgICBESVJTX0FMTF9MRUZUX1RPX1JJR0hULAorICAgICAgICBESVJTX0FMTF9MRUZUX1RPX1JJR0hULAorICAgICAgICBkaXJzKDAsIDEsIDEsIExWTDFfMSksCisgICAgICAgIERJUlNfQUxMX0xFRlRfVE9fUklHSFQsCisgICAgICAgIGRpcnMoMCwgMiwgMiwgTFZMMV8xKSwKKyAgICAgICAgZGlycygwLCAxLCAyLCBMVkwyXzEsIDEsIExWTDFfMSksCisgICAgICAgIGRpcnMoMCwgMSwgMSwgTFZMMV8xLCAyLCAxKSwKKyAgICAgICAgZGlycygwLCAxLCAzLCBMVkwxXzEsIDIsIExWTDJfMSwgMSwgTFZMMV8xKSwKKyAgICAgICAgZGlycygwLCAxLCA0LCBMVkwyXzEsIDMsIExWTDFfMSwgMiwgTFZMMl8xLCAxLCBMVkwxXzEpLAorCisgICAgICAgIC8vIHJ0bAorICAgICAgICBESVJTX0FMTF9SSUdIVF9UT19MRUZULAorICAgICAgICBkaXJzKDAsIExWTDFfMSwgMSwgTFZMMl8xKSwKKyAgICAgICAgZGlycygwLCBMVkwxXzEsIDEsIExWTDJfMSksCisgICAgICAgIGRpcnMoMCwgTFZMMV8xLCAxLCBMVkwyXzEsIDIsIExWTDFfMSksCisgICAgICAgIGRpcnMoMCwgTFZMMV8xLCAxLCBMVkwyXzIpLAorICAgICAgICBkaXJzKDAsIExWTDFfMSwgMSwgTFZMMl8yKSwKKyAgICAgICAgZGlycygwLCBMVkwxXzEsIDEsIExWTDJfMSwgMiwgTFZMMV8xKSwKKyAgICB9OworCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHBzZXVkb0JpZGlUb1JlYWwoU3RyaW5nIHNyYykgeworICAgICAgICBjaGFyW10gY2hhcnMgPSBzcmMudG9DaGFyQXJyYXkoKTsKKyAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBjaGFycy5sZW5ndGg7ICsraikgeworICAgICAgICAgICAgY2hhciBjID0gY2hhcnNbal07CisgICAgICAgICAgICBpZiAoYyA+PSAnQScgJiYgYyA8PSAnRCcpIHsKKyAgICAgICAgICAgICAgICBjaGFyc1tqXSA9IChjaGFyKShBTEVGICsgYyAtICdBJyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhjaGFycywgMCwgY2hhcnMubGVuZ3RoKTsKKyAgICB9CisKKyAgICAvLyBAU21hbGxUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERpcmVjdGlvbnMoKSB7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVmID0gbmV3IFN0cmluZ0J1aWxkZXIoIlxuIik7CisgICAgICAgIEZvcm1hdHRlciBmID0gbmV3IEZvcm1hdHRlcihidWYpOworCisgICAgICAgIExheW91dEJ1aWxkZXIgYiA9IFN0YXRpY0xheW91dFRlc3QuYnVpbGRlcigpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRleHRzLmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICBiLnNldFRleHQocHNldWRvQmlkaVRvUmVhbCh0ZXh0c1tpXSkpOworICAgICAgICAgICAgY2hlY2tEaXJlY3Rpb25zKGIuYnVpbGQoKSwgaSwgYi50ZXh0LCBleHBlY3RlZCwgZik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJ1Zi5sZW5ndGgoKSA+IDEpIHsKKyAgICAgICAgICAgIGZhaWwoYnVmLnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gQFNtYWxsVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUcmFpbGluZ1doaXRlc3BhY2UoKSB7CisgICAgICAgIExheW91dEJ1aWxkZXIgYiA9IFN0YXRpY0xheW91dFRlc3QuYnVpbGRlcigpOworICAgICAgICBiLnNldFRleHQocHNldWRvQmlkaVRvUmVhbCgiQWIgICBjIikpOworICAgICAgICBmbG9hdCB3aWR0aCA9IGIucGFpbnQubWVhc3VyZVRleHQoYi50ZXh0LCAwLCA1KTsgIC8vIGV4Y2x1ZGUgJ2MnCisgICAgICAgIGIuc2V0V2lkdGgoTWF0aC5yb3VuZCh3aWR0aCkpOworICAgICAgICBMYXlvdXQgbCA9IGIuYnVpbGQoKTsKKyAgICAgICAgaWYgKGwuZ2V0TGluZUNvdW50KCkgIT0gMikgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oImV4cGVjdGVkIDIgbGluZXMsIGdvdDogIiArIGwuZ2V0TGluZUNvdW50KCkpOworICAgICAgICB9CisgICAgICAgIERpcmVjdGlvbnMgcmVzdWx0ID0gbC5nZXRMaW5lRGlyZWN0aW9ucygwKTsKKyAgICAgICAgRGlyZWN0aW9ucyBleHBlY3RlZCA9IGRpcnMoMCwgTFZMMV8xLCAxLCBMVkwyXzEsIDIsIDMgfCAoMSA8PCBMYXlvdXQuUlVOX0xFVkVMX1NISUZUKSk7CisgICAgICAgIGV4cGVjdERpcmVjdGlvbnMoInNwbGl0IGxpbmUiLCBleHBlY3RlZCwgcmVzdWx0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TmV4dFRvUmlnaHRPZigpIHsKKyAgICAgICAgTGF5b3V0QnVpbGRlciBiID0gU3RhdGljTGF5b3V0VGVzdC5idWlsZGVyKCk7CisgICAgICAgIGIuc2V0VGV4dChwc2V1ZG9CaWRpVG9SZWFsKCJhQTFCMiIpKTsKKyAgICAgICAgLy8gdmlzdWFsIGEyQjFBIHBvc2l0aW9ucyAwNDMyMQorICAgICAgICAvLyAwOiB8YTJCMUEsIHN0cm9uZyBpcyBzb2wsIGFmdGVyIC0+IDAKKyAgICAgICAgLy8gMTogYXwyQjFBLCBzdHJvbmcgaXMgYSwgYWZ0ZXIgLT4sIDEKKyAgICAgICAgLy8gMjogYTJ8QjFBLCBzdHJvbmcgaXMgQiwgYWZ0ZXIgLT4gNAorICAgICAgICAvLyAzOiBhMkJ8MUEsIHN0cm9uZyBpcyBCLCBiZWZvcmUgLT4gMworICAgICAgICAvLyA0OiBhMkIxfEEsIHN0cm9uZyBpcyBBLCBhZnRlciAtPiAyCisgICAgICAgIC8vIDU6IGEyQjFBfCwgc3Ryb25nIGlzIGVvbCwgYmVmb3JlIC0+IDUKKyAgICAgICAgaW50W10gZXhwZWN0ZWQgPSB7IDAsIDEsIDQsIDMsIDIsIDUgfTsKKyAgICAgICAgTGF5b3V0IGwgPSBiLmJ1aWxkKCk7CisgICAgICAgIGludCBuID0gMDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBleHBlY3RlZC5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgaW50IHQgPSBsLmdldE9mZnNldFRvUmlnaHRPZihuKTsKKyAgICAgICAgICAgIGlmICh0ICE9IGV4cGVjdGVkW2ldKSB7CisgICAgICAgICAgICAgICAgZmFpbCgib2Zmc2V0WyIgKyBpICsgIl0gdG8gcmlnaHQgb2Y6ICIgKyBuICsgIiBleHBlY3RlZDogIiArCisgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZFtpXSArICIgZ290OiAiICsgdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBuID0gdDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3ROZXh0VG9MZWZ0T2YoKSB7CisgICAgICAgIExheW91dEJ1aWxkZXIgYiA9IFN0YXRpY0xheW91dFRlc3QuYnVpbGRlcigpOworICAgICAgICBiLnNldFRleHQocHNldWRvQmlkaVRvUmVhbCgiYUExQjIiKSk7CisgICAgICAgIGludFtdIGV4cGVjdGVkID0geyAwLCAxLCA0LCAzLCAyLCA1IH07CisgICAgICAgIExheW91dCBsID0gYi5idWlsZCgpOworICAgICAgICBpbnQgbiA9IDU7CisgICAgICAgIGZvciAoaW50IGkgPSBleHBlY3RlZC5sZW5ndGggLSAxOyAtLWkgPj0gMDspIHsKKyAgICAgICAgICAgIGludCB0ID0gbC5nZXRPZmZzZXRUb0xlZnRPZihuKTsKKyAgICAgICAgICAgIGlmICh0ICE9IGV4cGVjdGVkW2ldKSB7CisgICAgICAgICAgICAgICAgZmFpbCgib2Zmc2V0WyIgKyBpICsgIl0gdG8gbGVmdCBvZjogIiArIG4gKyAiIGV4cGVjdGVkOiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkW2ldICsgIiBnb3Q6ICIgKyB0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG4gPSB0OworICAgICAgICB9CisgICAgfQorCisgICAgLy8gdXRpbGl0eSwgbm90IHJlYWxseSBhIHRlc3QKKyAgICAvKgorICAgIHB1YmxpYyB2b2lkIHRlc3RNZWFzdXJlVGV4dDEoKSB7CisgICAgICAgIExheW91dEJ1aWxkZXIgYiA9IFN0YXRpY0xheW91dFRlc3QuYnVpbGRlcigpOworICAgICAgICBTdHJpbmcgdGV4dCA9ICJBQkMiOyAvLyAiYWJBQiIKKyAgICAgICAgYi5zZXRUZXh0KHBzZXVkb0JpZGlUb1JlYWwodGV4dCkpOworICAgICAgICBMYXlvdXQgbCA9IGIuYnVpbGQoKTsKKyAgICAgICAgRGlyZWN0aW9ucyBkaXJlY3Rpb25zID0gbC5nZXRMaW5lRGlyZWN0aW9ucygwKTsKKworICAgICAgICBUZXh0UGFpbnQgd29ya1BhaW50ID0gbmV3IFRleHRQYWludCgpOworCisgICAgICAgIGludCBkaXIgPSAtMTsgLy8gTEVGVF9UT19SSUdIVAorICAgICAgICBib29sZWFuIHRyYWlsaW5nID0gdHJ1ZTsKKyAgICAgICAgYm9vbGVhbiBhbHQgPSB0cnVlOworICAgICAgICBkbyB7CisgICAgICAgICAgICBkaXIgPSAtZGlyOworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIHRyYWlsaW5nID0gIXRyYWlsaW5nOworICAgICAgICAgICAgICAgIGZvciAoaW50IG9mZnNldCA9IDAsIGVuZCA9IGIudGV4dC5sZW5ndGgoKTsgb2Zmc2V0IDw9IGVuZDsgKytvZmZzZXQpIHsKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgd2lkdGggPSBMYXlvdXQubWVhc3VyZVRleHQoYi5wYWludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrUGFpbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYi50ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIG9mZnNldCwgZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpciwgZGlyZWN0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFpbGluZywgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgIExvZy5pKCJCSURJIiwgImRpcjogIiArIGRpciArICIgdHJhaWw6ICIgKyB0cmFpbGluZyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBvZmZzZXQ6ICIgKyBvZmZzZXQgKyAiIHdpZHRoOiAiICsgd2lkdGgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gd2hpbGUgKCF0cmFpbGluZyk7CisgICAgICAgIH0gd2hpbGUgKGRpciA+IDApOworICAgIH0KKyAgICAqLworCisgICAgLy8gdXRpbGl0eSBmb3IgZGlzcGxheWluZyBhcnJheXMgaW4gaGV4CisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGhleEFycmF5KGludFtdIGFycmF5KSB7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBzYi5hcHBlbmQoJ3snKTsKKyAgICAgICAgZm9yIChpbnQgaSA6IGFycmF5KSB7CisgICAgICAgICAgICBpZiAoc2IubGVuZ3RoKCkgPiAxKSB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIsICIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2IuYXBwZW5kKEludGVnZXIudG9IZXhTdHJpbmcoaSkpOworICAgICAgICB9CisgICAgICAgIHNiLmFwcGVuZCgnfScpOworICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY2hlY2tEaXJlY3Rpb25zKExheW91dCBsLCBpbnQgaSwgU3RyaW5nIHRleHQsCisgICAgICAgICAgICBEaXJlY3Rpb25zW10gZXhwZWN0ZWREaXJzLCBGb3JtYXR0ZXIgZikgeworICAgICAgICBEaXJlY3Rpb25zIGV4cGVjdGVkID0gZXhwZWN0ZWREaXJzW2ldOworICAgICAgICBEaXJlY3Rpb25zIHJlc3VsdCA9IGwuZ2V0TGluZURpcmVjdGlvbnMoMCk7CisgICAgICAgIGlmICghQXJyYXlzLmVxdWFscyhleHBlY3RlZC5tRGlyZWN0aW9ucywgcmVzdWx0Lm1EaXJlY3Rpb25zKSkgeworICAgICAgICAgICAgZi5mb3JtYXQoIiVuWyUyZF0gJyVzJywgJXMgIT0gJXMiLCBpLCB0ZXh0LAorICAgICAgICAgICAgICAgICAgICBoZXhBcnJheShleHBlY3RlZC5tRGlyZWN0aW9ucyksCisgICAgICAgICAgICAgICAgICAgIGhleEFycmF5KHJlc3VsdC5tRGlyZWN0aW9ucykpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGV4cGVjdERpcmVjdGlvbnMoU3RyaW5nIG1zZywgRGlyZWN0aW9ucyBleHBlY3RlZCwgRGlyZWN0aW9ucyByZXN1bHQpIHsKKyAgICAgICAgaWYgKCFBcnJheXMuZXF1YWxzKGV4cGVjdGVkLm1EaXJlY3Rpb25zLCByZXN1bHQubURpcmVjdGlvbnMpKSB7CisgICAgICAgICAgICBmYWlsKCJleHBlY3RlZDogIiArIGhleEFycmF5KGV4cGVjdGVkLm1EaXJlY3Rpb25zKSArCisgICAgICAgICAgICAgICAgICAgICIgZ290OiAiICsgaGV4QXJyYXkocmVzdWx0Lm1EaXJlY3Rpb25zKSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC90ZXh0L1N0YXRpY0xheW91dFRlc3QuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3RleHQvU3RhdGljTGF5b3V0VGVzdC5qYXZhCmluZGV4IDFmNThhMmMuLmQ1NTRhNTAgMTAwNjQ0Ci0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3RleHQvU3RhdGljTGF5b3V0VGVzdC5qYXZhCisrKyBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3RleHQvU3RhdGljTGF5b3V0VGVzdC5qYXZhCkBAIC0yMjgsMTEgKzIyOCwxMSBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgTGF5b3V0QnVpbGRlciBidWlsZGVyKCkgeworICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIExheW91dEJ1aWxkZXIgYnVpbGRlcigpIHsKICAgICAgICAgcmV0dXJuIG5ldyBMYXlvdXRCdWlsZGVyKCk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTGF5b3V0QnVpbGRlciB7CisgICAgLyogcGFja2FnZSAqLyBzdGF0aWMgY2xhc3MgTGF5b3V0QnVpbGRlciB7CiAgICAgICAgIFN0cmluZyB0ZXh0ID0gIlRoaXMgaXMgYSB0ZXN0IjsKICAgICAgICAgVGV4dFBhaW50IHBhaW50ID0gbmV3IFRleHRQYWludCgpOyAvLyBkZWZhdWx0CiAgICAgICAgIGludCB3aWR0aCA9IDEwMDsKZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3V0aWwvRXhwYW5kYWJsZUxpc3RTY2VuYXJpby5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvdXRpbC9FeHBhbmRhYmxlTGlzdFNjZW5hcmlvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhMTJiMGQuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvdXRpbC9FeHBhbmRhYmxlTGlzdFNjZW5hcmlvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGFuZHJvaWQudmlldy5HcmF2aXR5OwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuQWJzTGlzdFZpZXc7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuQmFzZUV4cGFuZGFibGVMaXN0QWRhcHRlcjsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5FeHBhbmRhYmxlTGlzdEFkYXB0ZXI7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuRXhwYW5kYWJsZUxpc3RWaWV3OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OwotCi0vKioKLSAqIFV0aWxpdHkgYmFzZSBjbGFzcyBmb3IgY3JlYXRpbmcgdmFyaW91cyBFeHBhbmRhYmxlIExpc3Qgc2NlbmFyaW9zLgotICogPHA+Ci0gKiBXQVJOSU5HOiBBIGxvdCBvZiB0aGUgZmVhdHVyZXMgYXJlIG1peGVkIGJldHdlZW4gTGlzdFZpZXcncyBleHBlY3RlZCBwb3NpdGlvbgotICogKGZsYXQgbGlzdCBwb3NpdGlvbikgYW5kIGFuIEV4cGFuZGFibGVMaXN0VmlldydzIGV4cGVjdGVkIHBvc2l0aW9uLiAgWW91IG11c3QgYWRkL2NoYW5nZQotICogZmVhdHVyZXMgYXMgeW91IG5lZWQgdGhlbS4KLSAqIAotICogQHNlZSBMaXN0U2NlbmFyaW8KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEV4cGFuZGFibGVMaXN0U2NlbmFyaW8gZXh0ZW5kcyBMaXN0U2NlbmFyaW8gewotICAgIHByb3RlY3RlZCBFeHBhbmRhYmxlTGlzdEFkYXB0ZXIgbUFkYXB0ZXI7IAotICAgIHByb3RlY3RlZCBMaXN0PE15R3JvdXA+IG1Hcm91cHM7Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIExpc3RWaWV3IGNyZWF0ZUxpc3RWaWV3KCkgewotICAgICAgICByZXR1cm4gbmV3IEV4cGFuZGFibGVMaXN0Vmlldyh0aGlzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgUGFyYW1zIGNyZWF0ZVBhcmFtcygpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBFeHBhbmRhYmxlUGFyYW1zKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0QWRhcHRlcihMaXN0VmlldyBsaXN0VmlldykgewotICAgICAgICAoKEV4cGFuZGFibGVMaXN0VmlldykgbGlzdFZpZXcpLnNldEFkYXB0ZXIobUFkYXB0ZXIgPSBjcmVhdGVBZGFwdGVyKCkpOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgRXhwYW5kYWJsZUxpc3RBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTXlBZGFwdGVyKCk7Ci0gICAgfQotICAgIAotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHJlYWRBbmRWYWxpZGF0ZVBhcmFtcyhQYXJhbXMgcGFyYW1zKSB7Ci0gICAgICAgIEV4cGFuZGFibGVQYXJhbXMgZXhwYW5kYWJsZVBhcmFtcyA9IChFeHBhbmRhYmxlUGFyYW1zKSBwYXJhbXM7Ci0gICAgICAgIAotICAgICAgICBpbnRbXSBudW1DaGlsZHJlbiA9IGV4cGFuZGFibGVQYXJhbXMubU51bUNoaWxkcmVuOwotICAgICAgICAKLSAgICAgICAgbUdyb3VwcyA9IG5ldyBBcnJheUxpc3Q8TXlHcm91cD4obnVtQ2hpbGRyZW4ubGVuZ3RoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1DaGlsZHJlbi5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgbUdyb3Vwcy5hZGQobmV3IE15R3JvdXAobnVtQ2hpbGRyZW5baV0pKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZXhwYW5kYWJsZVBhcmFtcy5zdXBlclNldE51bUl0ZW1zKCk7Ci0gICAgICAgIAotICAgICAgICBzdXBlci5yZWFkQW5kVmFsaWRhdGVQYXJhbXMocGFyYW1zKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIEV4cGFuZGFibGVMaXN0VmlldyB3aWRnZXQuCi0gICAgICogQHJldHVybiBUaGUgbWFpbiB3aWRnZXQuCi0gICAgICovCi0gICAgcHVibGljIEV4cGFuZGFibGVMaXN0VmlldyBnZXRFeHBhbmRhYmxlTGlzdFZpZXcoKSB7Ci0gICAgICAgIHJldHVybiAoRXhwYW5kYWJsZUxpc3RWaWV3KSBzdXBlci5nZXRMaXN0VmlldygpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRXhwYW5kYWJsZVBhcmFtcyBleHRlbmRzIFBhcmFtcyB7Ci0gICAgICAgIHByaXZhdGUgaW50W10gbU51bUNoaWxkcmVuOwotICAgICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgdGhlIG51bWJlciBvZiBjaGlsZHJlbiBwZXIgZ3JvdXAuCi0gICAgICAgICAqICAKLSAgICAgICAgICogQHBhcmFtIG51bUNoaWxkcmVuUGVyR3JvdXAgVGhlIG51bWJlciBvZiBjaGlsZHJlbiBwZXIgZ3JvdXAuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgRXhwYW5kYWJsZVBhcmFtcyBzZXROdW1DaGlsZHJlbihpbnRbXSBudW1DaGlsZHJlbikgewotICAgICAgICAgICAgbU51bUNoaWxkcmVuID0gbnVtQ2hpbGRyZW47Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSBudW1iZXIgb2YgaXRlbXMgb24gdGhlIHN1cGVyY2xhc3MgYmFzZWQgb24gdGhlIG51bWJlciBvZgotICAgICAgICAgKiBncm91cHMgYW5kIGNoaWxkcmVuIHBlciBncm91cC4KLSAgICAgICAgICovCi0gICAgICAgIHByaXZhdGUgRXhwYW5kYWJsZVBhcmFtcyBzdXBlclNldE51bUl0ZW1zKCkgewotICAgICAgICAgICAgaW50IG51bUl0ZW1zID0gMDsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKG1OdW1DaGlsZHJlbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IG1OdW1DaGlsZHJlbi5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewotICAgICAgICAgICAgICAgICAgICBudW1JdGVtcyArPSBtTnVtQ2hpbGRyZW5baV07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBzdXBlci5zZXROdW1JdGVtcyhudW1JdGVtcyk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFBhcmFtcyBzZXROdW1JdGVtcyhpbnQgbnVtSXRlbXMpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlVzZSBzZXROdW1Hcm91cHMgYW5kIHNldE51bUNoaWxkcmVuIGluc3RlYWQuIik7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEV4cGFuZGFibGVQYXJhbXMgc2V0RmFkaW5nRWRnZVNjcmVlblNpemVGYWN0b3IoZG91YmxlIGZhZGluZ0VkZ2VTY3JlZW5TaXplRmFjdG9yKSB7Ci0gICAgICAgICAgICByZXR1cm4gKEV4cGFuZGFibGVQYXJhbXMpIHN1cGVyLnNldEZhZGluZ0VkZ2VTY3JlZW5TaXplRmFjdG9yKGZhZGluZ0VkZ2VTY3JlZW5TaXplRmFjdG9yKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgRXhwYW5kYWJsZVBhcmFtcyBzZXRJdGVtU2NyZWVuU2l6ZUZhY3Rvcihkb3VibGUgaXRlbVNjcmVlblNpemVGYWN0b3IpIHsKLSAgICAgICAgICAgIHJldHVybiAoRXhwYW5kYWJsZVBhcmFtcykgc3VwZXIuc2V0SXRlbVNjcmVlblNpemVGYWN0b3IoaXRlbVNjcmVlblNpemVGYWN0b3IpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBFeHBhbmRhYmxlUGFyYW1zIHNldEl0ZW1zRm9jdXNhYmxlKGJvb2xlYW4gaXRlbXNGb2N1c2FibGUpIHsKLSAgICAgICAgICAgIHJldHVybiAoRXhwYW5kYWJsZVBhcmFtcykgc3VwZXIuc2V0SXRlbXNGb2N1c2FibGUoaXRlbXNGb2N1c2FibGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBFeHBhbmRhYmxlUGFyYW1zIHNldE11c3RGaWxsU2NyZWVuKGJvb2xlYW4gZmlsbFNjcmVlbikgewotICAgICAgICAgICAgcmV0dXJuIChFeHBhbmRhYmxlUGFyYW1zKSBzdXBlci5zZXRNdXN0RmlsbFNjcmVlbihmaWxsU2NyZWVuKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgRXhwYW5kYWJsZVBhcmFtcyBzZXRQb3NpdGlvblNjcmVlblNpemVGYWN0b3JPdmVycmlkZShpbnQgcG9zaXRpb24sIGRvdWJsZSBpdGVtU2NyZWVuU2l6ZUZhY3RvcikgewotICAgICAgICAgICAgcmV0dXJuIChFeHBhbmRhYmxlUGFyYW1zKSBzdXBlci5zZXRQb3NpdGlvblNjcmVlblNpemVGYWN0b3JPdmVycmlkZShwb3NpdGlvbiwgaXRlbVNjcmVlblNpemVGYWN0b3IpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBFeHBhbmRhYmxlUGFyYW1zIHNldFBvc2l0aW9uVW5zZWxlY3RhYmxlKGludCBwb3NpdGlvbikgewotICAgICAgICAgICAgcmV0dXJuIChFeHBhbmRhYmxlUGFyYW1zKSBzdXBlci5zZXRQb3NpdGlvblVuc2VsZWN0YWJsZShwb3NpdGlvbik7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEV4cGFuZGFibGVQYXJhbXMgc2V0U3RhY2tGcm9tQm90dG9tKGJvb2xlYW4gc3RhY2tGcm9tQm90dG9tKSB7Ci0gICAgICAgICAgICByZXR1cm4gKEV4cGFuZGFibGVQYXJhbXMpIHN1cGVyLnNldFN0YWNrRnJvbUJvdHRvbShzdGFja0Zyb21Cb3R0b20pOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBFeHBhbmRhYmxlUGFyYW1zIHNldFN0YXJ0aW5nU2VsZWN0aW9uUG9zaXRpb24oaW50IHN0YXJ0aW5nU2VsZWN0aW9uUG9zaXRpb24pIHsKLSAgICAgICAgICAgIHJldHVybiAoRXhwYW5kYWJsZVBhcmFtcykgc3VwZXIuc2V0U3RhcnRpbmdTZWxlY3Rpb25Qb3NpdGlvbihzdGFydGluZ1NlbGVjdGlvblBvc2l0aW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgRXhwYW5kYWJsZVBhcmFtcyBzZXRDb25uZWN0QWRhcHRlcihib29sZWFuIGNvbm5lY3RBZGFwdGVyKSB7Ci0gICAgICAgICAgICByZXR1cm4gKEV4cGFuZGFibGVQYXJhbXMpIHN1cGVyLnNldENvbm5lY3RBZGFwdGVyKGNvbm5lY3RBZGFwdGVyKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgYSBzdHJpbmcgZm9yIHRoZSB2YWx1ZSBvZiBzb21lIGl0ZW0uCi0gICAgICogQHBhcmFtIHBhY2tlZFBvc2l0aW9uIFRoZSBwb3NpdGlvbiBvZiB0aGUgaXRlbS4KLSAgICAgKiBAcmV0dXJuIFRoZSBzdHJpbmcuCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRWYWx1ZUF0UG9zaXRpb24obG9uZyBwYWNrZWRQb3NpdGlvbikgewotICAgICAgICBmaW5hbCBpbnQgdHlwZSA9IEV4cGFuZGFibGVMaXN0Vmlldy5nZXRQYWNrZWRQb3NpdGlvblR5cGUocGFja2VkUG9zaXRpb24pOwotICAgICAgICAKLSAgICAgICAgaWYgKHR5cGUgPT0gRXhwYW5kYWJsZUxpc3RWaWV3LlBBQ0tFRF9QT1NJVElPTl9UWVBFX0NISUxEKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUdyb3Vwcy5nZXQoRXhwYW5kYWJsZUxpc3RWaWV3LmdldFBhY2tlZFBvc2l0aW9uR3JvdXAocGFja2VkUG9zaXRpb24pKQotICAgICAgICAgICAgICAgICAgICAuY2hpbGRyZW4uZ2V0KEV4cGFuZGFibGVMaXN0Vmlldy5nZXRQYWNrZWRQb3NpdGlvbkNoaWxkKHBhY2tlZFBvc2l0aW9uKSkKLSAgICAgICAgICAgICAgICAgICAgLm5hbWU7Ci0gICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBFeHBhbmRhYmxlTGlzdFZpZXcuUEFDS0VEX1BPU0lUSU9OX1RZUEVfR1JPVVApIHsKLSAgICAgICAgICAgIHJldHVybiBtR3JvdXBzLmdldChFeHBhbmRhYmxlTGlzdFZpZXcuZ2V0UGFja2VkUG9zaXRpb25Hcm91cChwYWNrZWRQb3NpdGlvbikpCi0gICAgICAgICAgICAgICAgICAgIC5uYW1lOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigicGFja2VkUG9zaXRpb24gaXMgbm90IGEgdmFsaWQgcG9zaXRpb24uIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXaGV0aGVyIGEgcGFydGljdWxhciBwb3NpdGlvbiBpcyBvdXQgb2YgYm91bmRzLgotICAgICAqIAotICAgICAqIEBwYXJhbSBwYWNrZWRQb3NpdGlvbiBUaGUgcGFja2VkIHBvc2l0aW9uLgotICAgICAqIEByZXR1cm4gV2hldGhlciBpdCdzIG91dCBvZiBib3VuZHMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzT3V0T2ZCb3VuZHMobG9uZyBwYWNrZWRQb3NpdGlvbikgewotICAgICAgICBmaW5hbCBpbnQgdHlwZSA9IEV4cGFuZGFibGVMaXN0Vmlldy5nZXRQYWNrZWRQb3NpdGlvblR5cGUocGFja2VkUG9zaXRpb24pOwotICAgICAgICAKLSAgICAgICAgaWYgKHR5cGUgPT0gRXhwYW5kYWJsZUxpc3RWaWV3LlBBQ0tFRF9QT1NJVElPTl9UWVBFX05VTEwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInBhY2tlZFBvc2l0aW9uIGlzIG5vdCBhIHZhbGlkIHBvc2l0aW9uLiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgaW50IGdyb3VwID0gRXhwYW5kYWJsZUxpc3RWaWV3LmdldFBhY2tlZFBvc2l0aW9uR3JvdXAocGFja2VkUG9zaXRpb24pOyAKLSAgICAgICAgaWYgKGdyb3VwID49IG1Hcm91cHMuc2l6ZSgpIHx8IGdyb3VwIDwgMCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmICh0eXBlID09IEV4cGFuZGFibGVMaXN0Vmlldy5QQUNLRURfUE9TSVRJT05fVFlQRV9DSElMRCkgewotICAgICAgICAgICAgZmluYWwgaW50IGNoaWxkID0gRXhwYW5kYWJsZUxpc3RWaWV3LmdldFBhY2tlZFBvc2l0aW9uQ2hpbGQocGFja2VkUG9zaXRpb24pOyAKLSAgICAgICAgICAgIGlmIChjaGlsZCA+PSBtR3JvdXBzLmdldChncm91cCkuY2hpbGRyZW4uc2l6ZSgpIHx8IGNoaWxkIDwgMCkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEdldHMgYSB2aWV3IGZvciB0aGUgcGFja2VkIHBvc2l0aW9uLCBwb3NzaWJseSByZXVzaW5nIHRoZSBjb252ZXJ0Vmlldy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGFja2VkUG9zaXRpb24gVGhlIHBvc2l0aW9uIHRvIGdldCBhIHZpZXcgZm9yLgotICAgICAqIEBwYXJhbSBjb252ZXJ0VmlldyBPcHRpb25hbCB2aWV3IHRvIGNvbnZlcnQuCi0gICAgICogQHBhcmFtIHBhcmVudCBUaGUgZnV0dXJlIHBhcmVudC4KLSAgICAgKiBAcmV0dXJuIEEgdmlldy4KLSAgICAgKi8KLSAgICBwcml2YXRlIFZpZXcgZ2V0Vmlldyhsb25nIHBhY2tlZFBvc2l0aW9uLCBWaWV3IGNvbnZlcnRWaWV3LCBWaWV3R3JvdXAgcGFyZW50KSB7Ci0gICAgICAgIGlmIChpc091dE9mQm91bmRzKHBhY2tlZFBvc2l0aW9uKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigicG9zaXRpb24gb3V0IG9mIHJhbmdlIGZvciBhZGFwdGVyISIpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBFeHBhbmRhYmxlTGlzdFZpZXcgZWx2ID0gZ2V0RXhwYW5kYWJsZUxpc3RWaWV3KCk7Ci0gICAgICAgIGZpbmFsIGludCBmbFBvcyA9IGVsdi5nZXRGbGF0TGlzdFBvc2l0aW9uKHBhY2tlZFBvc2l0aW9uKTsgCi0gICAgICAgIAotICAgICAgICBpZiAoY29udmVydFZpZXcgIT0gbnVsbCkgewotICAgICAgICAgICAgKChUZXh0VmlldykgY29udmVydFZpZXcpLnNldFRleHQoZ2V0VmFsdWVBdFBvc2l0aW9uKHBhY2tlZFBvc2l0aW9uKSk7Ci0gICAgICAgICAgICBjb252ZXJ0Vmlldy5zZXRJZChmbFBvcyk7Ci0gICAgICAgICAgICByZXR1cm4gY29udmVydFZpZXc7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgZGVzaXJlZEhlaWdodCA9IGdldEhlaWdodEZvclBvc2l0aW9uKGZsUG9zKTsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZVZpZXcocGFja2VkUG9zaXRpb24sIGZsUG9zLCBwYXJlbnQsIGRlc2lyZWRIZWlnaHQpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSB2aWV3IGZvciBhIGdyb3VwIG9yIGNoaWxkIHBvc2l0aW9uLgotICAgICAqIAotICAgICAqIEBwYXJhbSBwYWNrZWRQb3NpdGlvbiBUaGUgcGFja2VkIHBvc2l0aW9uIChoYXMgdHlwZSwgZ3JvdXAgcG9zLCBhbmQgb3B0aW9uYWxseSBjaGlsZCBwb3MpLgotICAgICAqIEBwYXJhbSBmbFBvcyBUaGUgZmxhdCBsaXN0IHBvc2l0aW9uICh0aGUgcG9zaXRpb24gdGhhdCB0aGUgTGlzdFZpZXcgZ29lcyBieSkuCi0gICAgICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IHZpZXcuCi0gICAgICogQHBhcmFtIGRlc2lyZWRIZWlnaHQgVGhlIGRlc2lyZWQgaGVpZ2h0LgotICAgICAqIEByZXR1cm4gQSB2aWV3LgotICAgICAqLwotICAgIHByb3RlY3RlZCBWaWV3IGNyZWF0ZVZpZXcobG9uZyBwYWNrZWRQb3NpdGlvbiwgaW50IGZsUG9zLCBWaWV3R3JvdXAgcGFyZW50LCBpbnQgZGVzaXJlZEhlaWdodCkgewotICAgICAgICBUZXh0VmlldyByZXN1bHQgPSBuZXcgVGV4dFZpZXcocGFyZW50LmdldENvbnRleHQoKSk7Ci0gICAgICAgIHJlc3VsdC5zZXRIZWlnaHQoZGVzaXJlZEhlaWdodCk7Ci0gICAgICAgIHJlc3VsdC5zZXRUZXh0KGdldFZhbHVlQXRQb3NpdGlvbihwYWNrZWRQb3NpdGlvbikpOwotICAgICAgICBmaW5hbCBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zIGxwID0gbmV3IEFic0xpc3RWaWV3LkxheW91dFBhcmFtcygKLSAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCwKLSAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCk7Ci0gICAgICAgIHJlc3VsdC5zZXRMYXlvdXRQYXJhbXMobHApOwotICAgICAgICByZXN1bHQuc2V0R3Jhdml0eShHcmF2aXR5LkNFTlRFUl9WRVJUSUNBTCk7Ci0gICAgICAgIHJlc3VsdC5zZXRQYWRkaW5nKDM2LCAwLCAwLCAwKTsKLSAgICAgICAgcmVzdWx0LnNldElkKGZsUG9zKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIGdyb3VwIGluZGV4IGNvbnRhaW5pbmcgZWl0aGVyIHRoZSBudW1iZXIgb2YgY2hpbGRyZW4gb3IgYXQKLSAgICAgKiBsZWFzdCBvbmUgY2hpbGQuCi0gICAgICogCi0gICAgICogQHBhcmFtIG51bUNoaWxkcmVuIFRoZSBncm91cCBtdXN0IGhhdmUgdGhpcyBhbW91bnQsIG9yIC0xIGlmIHVzaW5nCi0gICAgICogICAgICAgICAgICBhdExlYXN0T25lQ2hpbGQuCi0gICAgICogQHBhcmFtIGF0TGVhc3RPbmVDaGlsZCBUaGUgZ3JvdXAgbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBjaGlsZCwgb3IgZmFsc2UKLSAgICAgKiAgICAgICAgICAgIGlmIHVzaW5nIG51bUNoaWxkcmVuLgotICAgICAqIEByZXR1cm4gQSBncm91cCBpbmRleCB3aXRoIHRoZSByZXF1aXJlbWVudHMuCi0gICAgICovCi0gICAgcHVibGljIGludCBmaW5kR3JvdXBXaXRoTnVtQ2hpbGRyZW4oaW50IG51bUNoaWxkcmVuLCBib29sZWFuIGF0TGVhc3RPbmVDaGlsZCkgewotICAgICAgICBmaW5hbCBFeHBhbmRhYmxlTGlzdEFkYXB0ZXIgYWRhcHRlciA9IG1BZGFwdGVyOwotICAgICAgICAKLSAgICAgICAgZm9yIChpbnQgaSA9IGFkYXB0ZXIuZ2V0R3JvdXBDb3VudCgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKLSAgICAgICAgICAgIGZpbmFsIGludCBjdXJOdW1DaGlsZHJlbiA9IGFkYXB0ZXIuZ2V0Q2hpbGRyZW5Db3VudChpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKG51bUNoaWxkcmVuID09IGN1ck51bUNoaWxkcmVuIHx8IGF0TGVhc3RPbmVDaGlsZCAmJiBjdXJOdW1DaGlsZHJlbiA+IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gaTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgTGlzdDxNeUdyb3VwPiBnZXRHcm91cHMoKSB7Ci0gICAgICAgIHJldHVybiBtR3JvdXBzOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgRXhwYW5kYWJsZUxpc3RBZGFwdGVyIGdldEFkYXB0ZXIoKSB7Ci0gICAgICAgIHJldHVybiBtQWRhcHRlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTaW1wbGUgZXhwYW5kYWJsZSBsaXN0IGFkYXB0ZXIuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGNsYXNzIE15QWRhcHRlciBleHRlbmRzIEJhc2VFeHBhbmRhYmxlTGlzdEFkYXB0ZXIgewotICAgICAgICBwdWJsaWMgT2JqZWN0IGdldENoaWxkKGludCBncm91cFBvc2l0aW9uLCBpbnQgY2hpbGRQb3NpdGlvbikgewotICAgICAgICAgICAgcmV0dXJuIGdldFZhbHVlQXRQb3NpdGlvbihFeHBhbmRhYmxlTGlzdFZpZXcuZ2V0UGFja2VkUG9zaXRpb25Gb3JDaGlsZChncm91cFBvc2l0aW9uLAotICAgICAgICAgICAgICAgICAgICBjaGlsZFBvc2l0aW9uKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgbG9uZyBnZXRDaGlsZElkKGludCBncm91cFBvc2l0aW9uLCBpbnQgY2hpbGRQb3NpdGlvbikgewotICAgICAgICAgICAgcmV0dXJuIG1Hcm91cHMuZ2V0KGdyb3VwUG9zaXRpb24pLmNoaWxkcmVuLmdldChjaGlsZFBvc2l0aW9uKS5pZDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0Q2hpbGRyZW5Db3VudChpbnQgZ3JvdXBQb3NpdGlvbikgewotICAgICAgICAgICAgcmV0dXJuIG1Hcm91cHMuZ2V0KGdyb3VwUG9zaXRpb24pLmNoaWxkcmVuLnNpemUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBWaWV3IGdldENoaWxkVmlldyhpbnQgZ3JvdXBQb3NpdGlvbiwgaW50IGNoaWxkUG9zaXRpb24sIGJvb2xlYW4gaXNMYXN0Q2hpbGQsCi0gICAgICAgICAgICAgICAgVmlldyBjb252ZXJ0VmlldywgVmlld0dyb3VwIHBhcmVudCkgewotICAgICAgICAgICAgcmV0dXJuIGdldFZpZXcoRXhwYW5kYWJsZUxpc3RWaWV3LmdldFBhY2tlZFBvc2l0aW9uRm9yQ2hpbGQoZ3JvdXBQb3NpdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgY2hpbGRQb3NpdGlvbiksIGNvbnZlcnRWaWV3LCBwYXJlbnQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE9iamVjdCBnZXRHcm91cChpbnQgZ3JvdXBQb3NpdGlvbikgewotICAgICAgICAgICAgcmV0dXJuIGdldFZhbHVlQXRQb3NpdGlvbihFeHBhbmRhYmxlTGlzdFZpZXcuZ2V0UGFja2VkUG9zaXRpb25Gb3JHcm91cChncm91cFBvc2l0aW9uKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgaW50IGdldEdyb3VwQ291bnQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUdyb3Vwcy5zaXplKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgbG9uZyBnZXRHcm91cElkKGludCBncm91cFBvc2l0aW9uKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUdyb3Vwcy5nZXQoZ3JvdXBQb3NpdGlvbikuaWQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgVmlldyBnZXRHcm91cFZpZXcoaW50IGdyb3VwUG9zaXRpb24sIGJvb2xlYW4gaXNFeHBhbmRlZCwgVmlldyBjb252ZXJ0VmlldywKLSAgICAgICAgICAgICAgICBWaWV3R3JvdXAgcGFyZW50KSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0VmlldyhFeHBhbmRhYmxlTGlzdFZpZXcuZ2V0UGFja2VkUG9zaXRpb25Gb3JHcm91cChncm91cFBvc2l0aW9uKSwKLSAgICAgICAgICAgICAgICAgICAgY29udmVydFZpZXcsIHBhcmVudCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0NoaWxkU2VsZWN0YWJsZShpbnQgZ3JvdXBQb3NpdGlvbiwgaW50IGNoaWxkUG9zaXRpb24pIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzU3RhYmxlSWRzKCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeUdyb3VwIHsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgbG9uZyBtTmV4dElkID0gMTAwMDsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZyBuYW1lOwotICAgICAgICBsb25nIGlkID0gbU5leHRJZCsrOwotICAgICAgICBMaXN0PE15Q2hpbGQ+IGNoaWxkcmVuOwotICAgICAgICAKLSAgICAgICAgcHVibGljIE15R3JvdXAoaW50IG51bUNoaWxkcmVuKSB7Ci0gICAgICAgICAgICBuYW1lID0gIkdyb3VwICIgKyBpZDsKLSAgICAgICAgICAgIGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdDxNeUNoaWxkPihudW1DaGlsZHJlbik7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUNoaWxkcmVuOyBpKyspIHsKLSAgICAgICAgICAgICAgICBjaGlsZHJlbi5hZGQobmV3IE15Q2hpbGQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeUNoaWxkIHsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgbG9uZyBtTmV4dElkID0gMjAwMDsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZyBuYW1lOwotICAgICAgICBsb25nIGlkID0gbU5leHRJZCsrOwotICAgICAgICAKLSAgICAgICAgcHVibGljIE15Q2hpbGQoKSB7Ci0gICAgICAgICAgICBuYW1lID0gIkNoaWxkICIgKyBpZDsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBpbml0KFBhcmFtcyBwYXJhbXMpIHsKLSAgICAgICAgaW5pdCgoRXhwYW5kYWJsZVBhcmFtcykgcGFyYW1zKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIExpc3RTY2VuYXJpbyNpbml0Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgaW5pdChFeHBhbmRhYmxlUGFyYW1zIHBhcmFtcyk7Ci19CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC91dGlsL0pzb25SZWFkZXJUZXN0LmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC91dGlsL0pzb25SZWFkZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2VkOTMxMAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3V0aWwvSnNvblJlYWRlclRlc3QuamF2YQpAQCAtMCwwICsxLDY4MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC51dGlsOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKKworcHVibGljIGZpbmFsIGNsYXNzIEpzb25SZWFkZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgcHVibGljIHZvaWQgdGVzdFJlYWRBcnJheSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEpzb25SZWFkZXIgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigiW3RydWUsIHRydWVdIikpOworICAgICAgICByZWFkZXIuYmVnaW5BcnJheSgpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgcmVhZGVyLm5leHRCb29sZWFuKCkpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgcmVhZGVyLm5leHRCb29sZWFuKCkpOworICAgICAgICByZWFkZXIuZW5kQXJyYXkoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEpzb25Ub2tlbi5FTkRfRE9DVU1FTlQsIHJlYWRlci5wZWVrKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RSZWFkRW1wdHlBcnJheSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEpzb25SZWFkZXIgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigiW10iKSk7CisgICAgICAgIHJlYWRlci5iZWdpbkFycmF5KCk7CisgICAgICAgIGFzc2VydEZhbHNlKHJlYWRlci5oYXNOZXh0KCkpOworICAgICAgICByZWFkZXIuZW5kQXJyYXkoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEpzb25Ub2tlbi5FTkRfRE9DVU1FTlQsIHJlYWRlci5wZWVrKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RSZWFkT2JqZWN0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgSnNvblJlYWRlciByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKAorICAgICAgICAgICAgICAgICJ7XCJhXCI6IFwiYW5kcm9pZFwiLCBcImJcIjogXCJiYW5hbmFcIn0iKSk7CisgICAgICAgIHJlYWRlci5iZWdpbk9iamVjdCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoImEiLCByZWFkZXIubmV4dE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiYW5kcm9pZCIsIHJlYWRlci5uZXh0U3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImIiLCByZWFkZXIubmV4dE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiYmFuYW5hIiwgcmVhZGVyLm5leHRTdHJpbmcoKSk7CisgICAgICAgIHJlYWRlci5lbmRPYmplY3QoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEpzb25Ub2tlbi5FTkRfRE9DVU1FTlQsIHJlYWRlci5wZWVrKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RSZWFkRW1wdHlPYmplY3QoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBKc29uUmVhZGVyIHJlYWRlciA9IG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoInt9IikpOworICAgICAgICByZWFkZXIuYmVnaW5PYmplY3QoKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UocmVhZGVyLmhhc05leHQoKSk7CisgICAgICAgIHJlYWRlci5lbmRPYmplY3QoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEpzb25Ub2tlbi5FTkRfRE9DVU1FTlQsIHJlYWRlci5wZWVrKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTa2lwT2JqZWN0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgSnNvblJlYWRlciByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKAorICAgICAgICAgICAgICAgICJ7XCJhXCI6IHsgXCJjXCI6IFtdLCBcImRcIjogW3RydWUsIHRydWUsIHt9XSB9LCBcImJcIjogXCJiYW5hbmFcIn0iKSk7CisgICAgICAgIHJlYWRlci5iZWdpbk9iamVjdCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoImEiLCByZWFkZXIubmV4dE5hbWUoKSk7CisgICAgICAgIHJlYWRlci5za2lwVmFsdWUoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJiIiwgcmVhZGVyLm5leHROYW1lKCkpOworICAgICAgICByZWFkZXIuc2tpcFZhbHVlKCk7CisgICAgICAgIHJlYWRlci5lbmRPYmplY3QoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEpzb25Ub2tlbi5FTkRfRE9DVU1FTlQsIHJlYWRlci5wZWVrKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RIZWxsb1dvcmxkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGpzb24gPSAie1xuIiArCisgICAgICAgICAgICAgICAgIiAgIFwiaGVsbG9cIjogdHJ1ZSxcbiIgKworICAgICAgICAgICAgICAgICIgICBcImZvb1wiOiBbXCJ3b3JsZFwiXVxuIiArCisgICAgICAgICAgICAgICAgIn0iOworICAgICAgICBKc29uUmVhZGVyIHJlYWRlciA9IG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoanNvbikpOworICAgICAgICByZWFkZXIuYmVnaW5PYmplY3QoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJoZWxsbyIsIHJlYWRlci5uZXh0TmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHJlYWRlci5uZXh0Qm9vbGVhbigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJmb28iLCByZWFkZXIubmV4dE5hbWUoKSk7CisgICAgICAgIHJlYWRlci5iZWdpbkFycmF5KCk7CisgICAgICAgIGFzc2VydEVxdWFscygid29ybGQiLCByZWFkZXIubmV4dFN0cmluZygpKTsKKyAgICAgICAgcmVhZGVyLmVuZEFycmF5KCk7CisgICAgICAgIHJlYWRlci5lbmRPYmplY3QoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEpzb25Ub2tlbi5FTkRfRE9DVU1FTlQsIHJlYWRlci5wZWVrKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3ROdWxscygpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5ldyBKc29uUmVhZGVyKG51bGwpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEVtcHR5U3RyaW5nKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoIiIpKS5iZWdpbkFycmF5KCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoIiIpKS5iZWdpbk9iamVjdCgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE5vVG9wTGV2ZWxPYmplY3QoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigidHJ1ZSIpKS5uZXh0Qm9vbGVhbigpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdENoYXJhY3RlclVuZXNjYXBpbmcoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTdHJpbmcganNvbiA9ICJbXCJhXCIsIgorICAgICAgICAgICAgICAgICsgIlwiYVxcXCJcIiwiCisgICAgICAgICAgICAgICAgKyAiXCJcXFwiXCIsIgorICAgICAgICAgICAgICAgICsgIlwiOlwiLCIKKyAgICAgICAgICAgICAgICArICJcIixcIiwiCisgICAgICAgICAgICAgICAgKyAiXCJcXGJcIiwiCisgICAgICAgICAgICAgICAgKyAiXCJcXGZcIiwiCisgICAgICAgICAgICAgICAgKyAiXCJcXG5cIiwiCisgICAgICAgICAgICAgICAgKyAiXCJcXHJcIiwiCisgICAgICAgICAgICAgICAgKyAiXCJcXHRcIiwiCisgICAgICAgICAgICAgICAgKyAiXCIgXCIsIgorICAgICAgICAgICAgICAgICsgIlwiXFxcXFwiLCIKKyAgICAgICAgICAgICAgICArICJcIntcIiwiCisgICAgICAgICAgICAgICAgKyAiXCJ9XCIsIgorICAgICAgICAgICAgICAgICsgIlwiW1wiLCIKKyAgICAgICAgICAgICAgICArICJcIl1cIiwiCisgICAgICAgICAgICAgICAgKyAiXCJcXHUwMDAwXCIsIgorICAgICAgICAgICAgICAgICsgIlwiXFx1MDAxOVwiLCIKKyAgICAgICAgICAgICAgICArICJcIlxcdTIwQUNcIiIKKyAgICAgICAgICAgICAgICArICJdIjsKKyAgICAgICAgSnNvblJlYWRlciByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKGpzb24pKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhIiwgcmVhZGVyLm5leHRTdHJpbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiYVwiIiwgcmVhZGVyLm5leHRTdHJpbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiXCIiLCByZWFkZXIubmV4dFN0cmluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCI6IiwgcmVhZGVyLm5leHRTdHJpbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiLCIsIHJlYWRlci5uZXh0U3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlxiIiwgcmVhZGVyLm5leHRTdHJpbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiXGYiLCByZWFkZXIubmV4dFN0cmluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJcbiIsIHJlYWRlci5uZXh0U3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlxyIiwgcmVhZGVyLm5leHRTdHJpbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiXHQiLCByZWFkZXIubmV4dFN0cmluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIgIiwgcmVhZGVyLm5leHRTdHJpbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiXFwiLCByZWFkZXIubmV4dFN0cmluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ7IiwgcmVhZGVyLm5leHRTdHJpbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygifSIsIHJlYWRlci5uZXh0U3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlsiLCByZWFkZXIubmV4dFN0cmluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJdIiwgcmVhZGVyLm5leHRTdHJpbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiXDAiLCByZWFkZXIubmV4dFN0cmluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJcdTAwMTkiLCByZWFkZXIubmV4dFN0cmluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJcdTIwQUMiLCByZWFkZXIubmV4dFN0cmluZygpKTsKKyAgICAgICAgcmVhZGVyLmVuZEFycmF5KCk7CisgICAgICAgIGFzc2VydEVxdWFscyhKc29uVG9rZW4uRU5EX0RPQ1VNRU5ULCByZWFkZXIucGVlaygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW50ZWdlcnNXaXRoRnJhY3Rpb25hbFBhcnRTcGVjaWZpZWQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBKc29uUmVhZGVyIHJlYWRlciA9IG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoIlsxLjAsMS4wLDEuMF0iKSk7CisgICAgICAgIHJlYWRlci5iZWdpbkFycmF5KCk7CisgICAgICAgIGFzc2VydEVxdWFscygxLjAsIHJlYWRlci5uZXh0RG91YmxlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgcmVhZGVyLm5leHRJbnQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxTCwgcmVhZGVyLm5leHRMb25nKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3REb3VibGVzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGpzb24gPSAiWy0wLjAsIgorICAgICAgICAgICAgICAgICsgIjEuMCwiCisgICAgICAgICAgICAgICAgKyAiMS43OTc2OTMxMzQ4NjIzMTU3RTMwOCwiCisgICAgICAgICAgICAgICAgKyAiNC45RS0zMjQsIgorICAgICAgICAgICAgICAgICsgIjAuMCwiCisgICAgICAgICAgICAgICAgKyAiLTAuNSwiCisgICAgICAgICAgICAgICAgKyAiMi4yMjUwNzM4NTg1MDcyMDE0RS0zMDgsIgorICAgICAgICAgICAgICAgICsgIjMuMTQxNTkyNjUzNTg5NzkzLCIKKyAgICAgICAgICAgICAgICArICIyLjcxODI4MTgyODQ1OTA0NV0iOworICAgICAgICBKc29uUmVhZGVyIHJlYWRlciA9IG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoanNvbikpOworICAgICAgICByZWFkZXIuYmVnaW5BcnJheSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoLTAuMCwgcmVhZGVyLm5leHREb3VibGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLjAsIHJlYWRlci5uZXh0RG91YmxlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMS43OTc2OTMxMzQ4NjIzMTU3RTMwOCwgcmVhZGVyLm5leHREb3VibGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyg0LjlFLTMyNCwgcmVhZGVyLm5leHREb3VibGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLjAsIHJlYWRlci5uZXh0RG91YmxlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoLTAuNSwgcmVhZGVyLm5leHREb3VibGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyLjIyNTA3Mzg1ODUwNzIwMTRFLTMwOCwgcmVhZGVyLm5leHREb3VibGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygzLjE0MTU5MjY1MzU4OTc5MywgcmVhZGVyLm5leHREb3VibGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyLjcxODI4MTgyODQ1OTA0NSwgcmVhZGVyLm5leHREb3VibGUoKSk7CisgICAgICAgIHJlYWRlci5lbmRBcnJheSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoSnNvblRva2VuLkVORF9ET0NVTUVOVCwgcmVhZGVyLnBlZWsoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE5vbkZpbml0ZURvdWJsZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTdHJpbmcganNvbiA9ICJbTmFOXSI7CisgICAgICAgIEpzb25SZWFkZXIgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcihqc29uKSk7CisgICAgICAgIHJlYWRlci5iZWdpbkFycmF5KCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZWFkZXIubmV4dERvdWJsZSgpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RMb25ncygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBqc29uID0gIlswLDAsMCwiCisgICAgICAgICAgICAgICAgKyAiMSwxLDEsIgorICAgICAgICAgICAgICAgICsgIi0xLC0xLC0xLCIKKyAgICAgICAgICAgICAgICArICItOTIyMzM3MjAzNjg1NDc3NTgwOCwiCisgICAgICAgICAgICAgICAgKyAiOTIyMzM3MjAzNjg1NDc3NTgwN10iOworICAgICAgICBKc29uUmVhZGVyIHJlYWRlciA9IG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoanNvbikpOworICAgICAgICByZWFkZXIuYmVnaW5BcnJheSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMEwsIHJlYWRlci5uZXh0TG9uZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHJlYWRlci5uZXh0SW50KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMC4wLCByZWFkZXIubmV4dERvdWJsZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDFMLCByZWFkZXIubmV4dExvbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCByZWFkZXIubmV4dEludCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEuMCwgcmVhZGVyLm5leHREb3VibGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygtMUwsIHJlYWRlci5uZXh0TG9uZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKC0xLCByZWFkZXIubmV4dEludCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKC0xLjAsIHJlYWRlci5uZXh0RG91YmxlKCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVhZGVyLm5leHRJbnQoKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKExvbmcuTUlOX1ZBTFVFLCByZWFkZXIubmV4dExvbmcoKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZWFkZXIubmV4dEludCgpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRFcXVhbHMoTG9uZy5NQVhfVkFMVUUsIHJlYWRlci5uZXh0TG9uZygpKTsKKyAgICAgICAgcmVhZGVyLmVuZEFycmF5KCk7CisgICAgICAgIGFzc2VydEVxdWFscyhKc29uVG9rZW4uRU5EX0RPQ1VNRU5ULCByZWFkZXIucGVlaygpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIHRlc3QgZmFpbHMgYmVjYXVzZSB0aGVyZSdzIG5vIGRvdWJsZSBmb3IgOTIyMzM3MjAzNjg1NDc3NTgwNiwgYW5kCisgICAgICogb3VyIGxvbmcgcGFyc2luZyB1c2VzIERvdWJsZS5wYXJzZURvdWJsZSgpIGZvciBmcmFjdGlvbmFsIHZhbHVlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0SGlnaFByZWNpc2lvbkxvbmcoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTdHJpbmcganNvbiA9ICJbOTIyMzM3MjAzNjg1NDc3NTgwNi4wMDBdIjsKKyAgICAgICAgSnNvblJlYWRlciByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKGpzb24pKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDkyMjMzNzIwMzY4NTQ3NzU4MDZMLCByZWFkZXIubmV4dExvbmcoKSk7CisgICAgICAgIHJlYWRlci5lbmRBcnJheSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3ROdW1iZXJXaXRoT2N0YWxQcmVmaXgoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTdHJpbmcganNvbiA9ICJbMDFdIjsKKyAgICAgICAgSnNvblJlYWRlciByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKGpzb24pKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlYWRlci5uZXh0SW50KCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZWFkZXIubmV4dExvbmcoKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlYWRlci5uZXh0RG91YmxlKCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgICAgIGFzc2VydEVxdWFscygiMDEiLCByZWFkZXIubmV4dFN0cmluZygpKTsKKyAgICAgICAgcmVhZGVyLmVuZEFycmF5KCk7CisgICAgICAgIGFzc2VydEVxdWFscyhKc29uVG9rZW4uRU5EX0RPQ1VNRU5ULCByZWFkZXIucGVlaygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Qm9vbGVhbnMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBKc29uUmVhZGVyIHJlYWRlciA9IG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoIlt0cnVlLGZhbHNlXSIpKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHJlYWRlci5uZXh0Qm9vbGVhbigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCByZWFkZXIubmV4dEJvb2xlYW4oKSk7CisgICAgICAgIHJlYWRlci5lbmRBcnJheSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoSnNvblRva2VuLkVORF9ET0NVTUVOVCwgcmVhZGVyLnBlZWsoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE1peGVkQ2FzZUxpdGVyYWxzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgSnNvblJlYWRlciByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJbVHJ1ZSxUcnVFLEZhbHNlLEZBTFNFLE5VTEwsbnVsTF0iKSk7CisgICAgICAgIHJlYWRlci5iZWdpbkFycmF5KCk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCByZWFkZXIubmV4dEJvb2xlYW4oKSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCByZWFkZXIubmV4dEJvb2xlYW4oKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgcmVhZGVyLm5leHRCb29sZWFuKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIHJlYWRlci5uZXh0Qm9vbGVhbigpKTsKKyAgICAgICAgcmVhZGVyLm5leHROdWxsKCk7CisgICAgICAgIHJlYWRlci5uZXh0TnVsbCgpOworICAgICAgICByZWFkZXIuZW5kQXJyYXkoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEpzb25Ub2tlbi5FTkRfRE9DVU1FTlQsIHJlYWRlci5wZWVrKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RNaXNzaW5nVmFsdWUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBKc29uUmVhZGVyIHJlYWRlciA9IG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoIntcImFcIjp9IikpOworICAgICAgICByZWFkZXIuYmVnaW5PYmplY3QoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhIiwgcmVhZGVyLm5leHROYW1lKCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVhZGVyLm5leHRTdHJpbmcoKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RQcmVtYXR1cmVFbmRPZklucHV0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgSnNvblJlYWRlciByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJ7XCJhXCI6dHJ1ZSwiKSk7CisgICAgICAgIHJlYWRlci5iZWdpbk9iamVjdCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoImEiLCByZWFkZXIubmV4dE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCByZWFkZXIubmV4dEJvb2xlYW4oKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZWFkZXIubmV4dE5hbWUoKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RQcmVtYXR1cmVseUNsb3NlZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBKc29uUmVhZGVyIHJlYWRlciA9IG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoIntcImFcIjpbXX0iKSk7CisgICAgICAgICAgICByZWFkZXIuYmVnaW5PYmplY3QoKTsKKyAgICAgICAgICAgIHJlYWRlci5jbG9zZSgpOworICAgICAgICAgICAgcmVhZGVyLm5leHROYW1lKCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEpzb25SZWFkZXIgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigie1wiYVwiOltdfSIpKTsKKyAgICAgICAgICAgIHJlYWRlci5jbG9zZSgpOworICAgICAgICAgICAgcmVhZGVyLmJlZ2luT2JqZWN0KCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEpzb25SZWFkZXIgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigie1wiYVwiOnRydWV9IikpOworICAgICAgICAgICAgcmVhZGVyLmJlZ2luT2JqZWN0KCk7CisgICAgICAgICAgICByZWFkZXIubmV4dE5hbWUoKTsKKyAgICAgICAgICAgIHJlYWRlci5wZWVrKCk7CisgICAgICAgICAgICByZWFkZXIuY2xvc2UoKTsKKyAgICAgICAgICAgIHJlYWRlci5uZXh0Qm9vbGVhbigpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3ROZXh0RmFpbHVyZXNEb05vdEFkdmFuY2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBKc29uUmVhZGVyIHJlYWRlciA9IG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoIntcImFcIjp0cnVlfSIpKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luT2JqZWN0KCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZWFkZXIubmV4dFN0cmluZygpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRFcXVhbHMoImEiLCByZWFkZXIubmV4dE5hbWUoKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZWFkZXIubmV4dE5hbWUoKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlYWRlci5iZWdpbkFycmF5KCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZWFkZXIuZW5kQXJyYXkoKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlYWRlci5iZWdpbk9iamVjdCgpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVhZGVyLmVuZE9iamVjdCgpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgcmVhZGVyLm5leHRCb29sZWFuKCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVhZGVyLm5leHRTdHJpbmcoKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlYWRlci5uZXh0TmFtZSgpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVhZGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlYWRlci5lbmRBcnJheSgpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgICAgICByZWFkZXIuZW5kT2JqZWN0KCk7CisgICAgICAgIGFzc2VydEVxdWFscyhKc29uVG9rZW4uRU5EX0RPQ1VNRU5ULCByZWFkZXIucGVlaygpKTsKKyAgICAgICAgcmVhZGVyLmNsb3NlKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFN0cmluZ051bGxJc05vdE51bGwoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBKc29uUmVhZGVyIHJlYWRlciA9IG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoIltcIm51bGxcIl0iKSk7CisgICAgICAgIHJlYWRlci5iZWdpbkFycmF5KCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZWFkZXIubmV4dE51bGwoKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TnVsbExpdGVyYWxJc05vdEFTdHJpbmcoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgIEpzb25SZWFkZXIgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigiW251bGxdIikpOworICAgICAgICByZWFkZXIuYmVnaW5BcnJheSgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVhZGVyLm5leHRTdHJpbmcoKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyaWN0TmFtZVZhbHVlU2VwYXJhdG9yKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgSnNvblJlYWRlciByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJ7XCJhXCI9dHJ1ZX0iKSk7CisgICAgICAgIHJlYWRlci5iZWdpbk9iamVjdCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoImEiLCByZWFkZXIubmV4dE5hbWUoKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZWFkZXIubmV4dEJvb2xlYW4oKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorCisgICAgICAgIHJlYWRlciA9IG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoIntcImFcIj0+dHJ1ZX0iKSk7CisgICAgICAgIHJlYWRlci5iZWdpbk9iamVjdCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoImEiLCByZWFkZXIubmV4dE5hbWUoKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZWFkZXIubmV4dEJvb2xlYW4oKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RMZW5pZW50TmFtZVZhbHVlU2VwYXJhdG9yKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgSnNvblJlYWRlciByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJ7XCJhXCI9dHJ1ZX0iKSk7CisgICAgICAgIHJlYWRlci5zZXRMZW5pZW50KHRydWUpOworICAgICAgICByZWFkZXIuYmVnaW5PYmplY3QoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhIiwgcmVhZGVyLm5leHROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgcmVhZGVyLm5leHRCb29sZWFuKCkpOworCisgICAgICAgIHJlYWRlciA9IG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoIntcImFcIj0+dHJ1ZX0iKSk7CisgICAgICAgIHJlYWRlci5zZXRMZW5pZW50KHRydWUpOworICAgICAgICByZWFkZXIuYmVnaW5PYmplY3QoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhIiwgcmVhZGVyLm5leHROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgcmVhZGVyLm5leHRCb29sZWFuKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpY3RDb21tZW50cygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEpzb25SZWFkZXIgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigiWy8vIGNvbW1lbnQgXG4gdHJ1ZV0iKSk7CisgICAgICAgIHJlYWRlci5iZWdpbkFycmF5KCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZWFkZXIubmV4dEJvb2xlYW4oKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorCisgICAgICAgIHJlYWRlciA9IG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoIlsjIGNvbW1lbnQgXG4gdHJ1ZV0iKSk7CisgICAgICAgIHJlYWRlci5iZWdpbkFycmF5KCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZWFkZXIubmV4dEJvb2xlYW4oKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorCisgICAgICAgIHJlYWRlciA9IG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoIlsvKiBjb21tZW50ICovIHRydWVdIikpOworICAgICAgICByZWFkZXIuYmVnaW5BcnJheSgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVhZGVyLm5leHRCb29sZWFuKCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGVuaWVudENvbW1lbnRzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgSnNvblJlYWRlciByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJbLy8gY29tbWVudCBcbiB0cnVlXSIpKTsKKyAgICAgICAgcmVhZGVyLnNldExlbmllbnQodHJ1ZSk7CisgICAgICAgIHJlYWRlci5iZWdpbkFycmF5KCk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCByZWFkZXIubmV4dEJvb2xlYW4oKSk7CisKKyAgICAgICAgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigiWyMgY29tbWVudCBcbiB0cnVlXSIpKTsKKyAgICAgICAgcmVhZGVyLnNldExlbmllbnQodHJ1ZSk7CisgICAgICAgIHJlYWRlci5iZWdpbkFycmF5KCk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCByZWFkZXIubmV4dEJvb2xlYW4oKSk7CisKKyAgICAgICAgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigiWy8qIGNvbW1lbnQgKi8gdHJ1ZV0iKSk7CisgICAgICAgIHJlYWRlci5zZXRMZW5pZW50KHRydWUpOworICAgICAgICByZWFkZXIuYmVnaW5BcnJheSgpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgcmVhZGVyLm5leHRCb29sZWFuKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpY3RVbnF1b3RlZE5hbWVzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgSnNvblJlYWRlciByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJ7YTp0cnVlfSIpKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luT2JqZWN0KCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZWFkZXIubmV4dE5hbWUoKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RMZW5pZW50VW5xdW90ZWROYW1lcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEpzb25SZWFkZXIgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigie2E6dHJ1ZX0iKSk7CisgICAgICAgIHJlYWRlci5zZXRMZW5pZW50KHRydWUpOworICAgICAgICByZWFkZXIuYmVnaW5PYmplY3QoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhIiwgcmVhZGVyLm5leHROYW1lKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpY3RTaW5nbGVRdW90ZWROYW1lcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEpzb25SZWFkZXIgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigieydhJzp0cnVlfSIpKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luT2JqZWN0KCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZWFkZXIubmV4dE5hbWUoKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RMZW5pZW50U2luZ2xlUXVvdGVkTmFtZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBKc29uUmVhZGVyIHJlYWRlciA9IG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoInsnYSc6dHJ1ZX0iKSk7CisgICAgICAgIHJlYWRlci5zZXRMZW5pZW50KHRydWUpOworICAgICAgICByZWFkZXIuYmVnaW5PYmplY3QoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhIiwgcmVhZGVyLm5leHROYW1lKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpY3RVbnF1b3RlZFN0cmluZ3MoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBKc29uUmVhZGVyIHJlYWRlciA9IG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoIlthXSIpKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlYWRlci5uZXh0U3RyaW5nKCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGVuaWVudFVucXVvdGVkU3RyaW5ncygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEpzb25SZWFkZXIgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigiW2FdIikpOworICAgICAgICByZWFkZXIuc2V0TGVuaWVudCh0cnVlKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhIiwgcmVhZGVyLm5leHRTdHJpbmcoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFN0cmljdFNpbmdsZVF1b3RlZFN0cmluZ3MoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBKc29uUmVhZGVyIHJlYWRlciA9IG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoIlsnYSddIikpOworICAgICAgICByZWFkZXIuYmVnaW5BcnJheSgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVhZGVyLm5leHRTdHJpbmcoKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RMZW5pZW50U2luZ2xlUXVvdGVkU3RyaW5ncygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEpzb25SZWFkZXIgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigiWydhJ10iKSk7CisgICAgICAgIHJlYWRlci5zZXRMZW5pZW50KHRydWUpOworICAgICAgICByZWFkZXIuYmVnaW5BcnJheSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoImEiLCByZWFkZXIubmV4dFN0cmluZygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyaWN0U2VtaWNvbG9uRGVsaW1pdGVkQXJyYXkoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBKc29uUmVhZGVyIHJlYWRlciA9IG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoIlt0cnVlO3RydWVdIikpOworICAgICAgICByZWFkZXIuYmVnaW5BcnJheSgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVhZGVyLm5leHRCb29sZWFuKCk7CisgICAgICAgICAgICByZWFkZXIubmV4dEJvb2xlYW4oKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RMZW5pZW50U2VtaWNvbG9uRGVsaW1pdGVkQXJyYXkoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBKc29uUmVhZGVyIHJlYWRlciA9IG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoIlt0cnVlO3RydWVdIikpOworICAgICAgICByZWFkZXIuc2V0TGVuaWVudCh0cnVlKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHJlYWRlci5uZXh0Qm9vbGVhbigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHJlYWRlci5uZXh0Qm9vbGVhbigpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyaWN0U2VtaWNvbG9uRGVsaW1pdGVkTmFtZVZhbHVlUGFpcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEpzb25SZWFkZXIgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigie1wiYVwiOnRydWU7XCJiXCI6dHJ1ZX0iKSk7CisgICAgICAgIHJlYWRlci5iZWdpbk9iamVjdCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoImEiLCByZWFkZXIubmV4dE5hbWUoKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZWFkZXIubmV4dEJvb2xlYW4oKTsKKyAgICAgICAgICAgIHJlYWRlci5uZXh0TmFtZSgpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdExlbmllbnRTZW1pY29sb25EZWxpbWl0ZWROYW1lVmFsdWVQYWlyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgSnNvblJlYWRlciByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJ7XCJhXCI6dHJ1ZTtcImJcIjp0cnVlfSIpKTsKKyAgICAgICAgcmVhZGVyLnNldExlbmllbnQodHJ1ZSk7CisgICAgICAgIHJlYWRlci5iZWdpbk9iamVjdCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoImEiLCByZWFkZXIubmV4dE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCByZWFkZXIubmV4dEJvb2xlYW4oKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiYiIsIHJlYWRlci5uZXh0TmFtZSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyaWN0VW5uZWNlc3NhcnlBcnJheVNlcGFyYXRvcnMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBKc29uUmVhZGVyIHJlYWRlciA9IG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoIlt0cnVlLCx0cnVlXSIpKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHJlYWRlci5uZXh0Qm9vbGVhbigpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlYWRlci5uZXh0TnVsbCgpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisKKyAgICAgICAgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigiWyx0cnVlXSIpKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlYWRlci5uZXh0TnVsbCgpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisKKyAgICAgICAgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigiW3RydWUsXSIpKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHJlYWRlci5uZXh0Qm9vbGVhbigpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlYWRlci5uZXh0TnVsbCgpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisKKyAgICAgICAgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigiWyxdIikpOworICAgICAgICByZWFkZXIuYmVnaW5BcnJheSgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVhZGVyLm5leHROdWxsKCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGVuaWVudFVubmVjZXNzYXJ5QXJyYXlTZXBhcmF0b3JzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgSnNvblJlYWRlciByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJbdHJ1ZSwsdHJ1ZV0iKSk7CisgICAgICAgIHJlYWRlci5zZXRMZW5pZW50KHRydWUpOworICAgICAgICByZWFkZXIuYmVnaW5BcnJheSgpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgcmVhZGVyLm5leHRCb29sZWFuKCkpOworICAgICAgICByZWFkZXIubmV4dE51bGwoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHJlYWRlci5uZXh0Qm9vbGVhbigpKTsKKyAgICAgICAgcmVhZGVyLmVuZEFycmF5KCk7CisKKyAgICAgICAgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigiWyx0cnVlXSIpKTsKKyAgICAgICAgcmVhZGVyLnNldExlbmllbnQodHJ1ZSk7CisgICAgICAgIHJlYWRlci5iZWdpbkFycmF5KCk7CisgICAgICAgIHJlYWRlci5uZXh0TnVsbCgpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgcmVhZGVyLm5leHRCb29sZWFuKCkpOworICAgICAgICByZWFkZXIuZW5kQXJyYXkoKTsKKworICAgICAgICByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJbdHJ1ZSxdIikpOworICAgICAgICByZWFkZXIuc2V0TGVuaWVudCh0cnVlKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHJlYWRlci5uZXh0Qm9vbGVhbigpKTsKKyAgICAgICAgcmVhZGVyLm5leHROdWxsKCk7CisgICAgICAgIHJlYWRlci5lbmRBcnJheSgpOworCisgICAgICAgIHJlYWRlciA9IG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoIlssXSIpKTsKKyAgICAgICAgcmVhZGVyLnNldExlbmllbnQodHJ1ZSk7CisgICAgICAgIHJlYWRlci5iZWdpbkFycmF5KCk7CisgICAgICAgIHJlYWRlci5uZXh0TnVsbCgpOworICAgICAgICByZWFkZXIubmV4dE51bGwoKTsKKyAgICAgICAgcmVhZGVyLmVuZEFycmF5KCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvdXRpbC9Kc29uV3JpdGVyVGVzdC5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvdXRpbC9Kc29uV3JpdGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhODQwMjMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC91dGlsL0pzb25Xcml0ZXJUZXN0LmphdmEKQEAgLTAsMCArMSw0MTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQudXRpbDsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7CisKK3B1YmxpYyBmaW5hbCBjbGFzcyBKc29uV3JpdGVyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIHB1YmxpYyB2b2lkIHRlc3RXcm9uZ1RvcExldmVsVHlwZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZ1dyaXRlciBzdHJpbmdXcml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisgICAgICAgIEpzb25Xcml0ZXIganNvbldyaXRlciA9IG5ldyBKc29uV3JpdGVyKHN0cmluZ1dyaXRlcik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBqc29uV3JpdGVyLnZhbHVlKCJhIik7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFR3b05hbWVzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nV3JpdGVyIHN0cmluZ1dyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKyAgICAgICAgSnNvbldyaXRlciBqc29uV3JpdGVyID0gbmV3IEpzb25Xcml0ZXIoc3RyaW5nV3JpdGVyKTsKKyAgICAgICAganNvbldyaXRlci5iZWdpbk9iamVjdCgpOworICAgICAgICBqc29uV3JpdGVyLm5hbWUoImEiKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGpzb25Xcml0ZXIubmFtZSgiYSIpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3ROYW1lV2l0aG91dFZhbHVlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nV3JpdGVyIHN0cmluZ1dyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKyAgICAgICAgSnNvbldyaXRlciBqc29uV3JpdGVyID0gbmV3IEpzb25Xcml0ZXIoc3RyaW5nV3JpdGVyKTsKKyAgICAgICAganNvbldyaXRlci5iZWdpbk9iamVjdCgpOworICAgICAgICBqc29uV3JpdGVyLm5hbWUoImEiKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGpzb25Xcml0ZXIuZW5kT2JqZWN0KCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFZhbHVlV2l0aG91dE5hbWUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTdHJpbmdXcml0ZXIgc3RyaW5nV3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOworICAgICAgICBKc29uV3JpdGVyIGpzb25Xcml0ZXIgPSBuZXcgSnNvbldyaXRlcihzdHJpbmdXcml0ZXIpOworICAgICAgICBqc29uV3JpdGVyLmJlZ2luT2JqZWN0KCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBqc29uV3JpdGVyLnZhbHVlKHRydWUpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aXBsZVRvcExldmVsVmFsdWVzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nV3JpdGVyIHN0cmluZ1dyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKyAgICAgICAgSnNvbldyaXRlciBqc29uV3JpdGVyID0gbmV3IEpzb25Xcml0ZXIoc3RyaW5nV3JpdGVyKTsKKyAgICAgICAganNvbldyaXRlci5iZWdpbkFycmF5KCkuZW5kQXJyYXkoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGpzb25Xcml0ZXIuYmVnaW5BcnJheSgpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RCYWROZXN0aW5nT2JqZWN0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nV3JpdGVyIHN0cmluZ1dyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKyAgICAgICAgSnNvbldyaXRlciBqc29uV3JpdGVyID0gbmV3IEpzb25Xcml0ZXIoc3RyaW5nV3JpdGVyKTsKKyAgICAgICAganNvbldyaXRlci5iZWdpbkFycmF5KCk7CisgICAgICAgIGpzb25Xcml0ZXIuYmVnaW5PYmplY3QoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGpzb25Xcml0ZXIuZW5kQXJyYXkoKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QmFkTmVzdGluZ0FycmF5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nV3JpdGVyIHN0cmluZ1dyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKyAgICAgICAgSnNvbldyaXRlciBqc29uV3JpdGVyID0gbmV3IEpzb25Xcml0ZXIoc3RyaW5nV3JpdGVyKTsKKyAgICAgICAganNvbldyaXRlci5iZWdpbkFycmF5KCk7CisgICAgICAgIGpzb25Xcml0ZXIuYmVnaW5BcnJheSgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAganNvbldyaXRlci5lbmRPYmplY3QoKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TnVsbE5hbWUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTdHJpbmdXcml0ZXIgc3RyaW5nV3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOworICAgICAgICBKc29uV3JpdGVyIGpzb25Xcml0ZXIgPSBuZXcgSnNvbldyaXRlcihzdHJpbmdXcml0ZXIpOworICAgICAgICBqc29uV3JpdGVyLmJlZ2luT2JqZWN0KCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBqc29uV3JpdGVyLm5hbWUobnVsbCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TnVsbFN0cmluZ1ZhbHVlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nV3JpdGVyIHN0cmluZ1dyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKyAgICAgICAgSnNvbldyaXRlciBqc29uV3JpdGVyID0gbmV3IEpzb25Xcml0ZXIoc3RyaW5nV3JpdGVyKTsKKyAgICAgICAganNvbldyaXRlci5iZWdpbk9iamVjdCgpOworICAgICAgICBqc29uV3JpdGVyLm5hbWUoImEiKTsKKyAgICAgICAganNvbldyaXRlci52YWx1ZShudWxsKTsKKyAgICAgICAganNvbldyaXRlci5lbmRPYmplY3QoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ7XCJhXCI6bnVsbH0iLCBzdHJpbmdXcml0ZXIudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE5vbkZpbml0ZURvdWJsZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTdHJpbmdXcml0ZXIgc3RyaW5nV3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOworICAgICAgICBKc29uV3JpdGVyIGpzb25Xcml0ZXIgPSBuZXcgSnNvbldyaXRlcihzdHJpbmdXcml0ZXIpOworICAgICAgICBqc29uV3JpdGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGpzb25Xcml0ZXIudmFsdWUoRG91YmxlLk5hTik7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBqc29uV3JpdGVyLnZhbHVlKERvdWJsZS5ORUdBVElWRV9JTkZJTklUWSk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBqc29uV3JpdGVyLnZhbHVlKERvdWJsZS5QT1NJVElWRV9JTkZJTklUWSk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdERvdWJsZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTdHJpbmdXcml0ZXIgc3RyaW5nV3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOworICAgICAgICBKc29uV3JpdGVyIGpzb25Xcml0ZXIgPSBuZXcgSnNvbldyaXRlcihzdHJpbmdXcml0ZXIpOworICAgICAgICBqc29uV3JpdGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAganNvbldyaXRlci52YWx1ZSgtMC4wKTsKKyAgICAgICAganNvbldyaXRlci52YWx1ZSgxLjApOworICAgICAgICBqc29uV3JpdGVyLnZhbHVlKERvdWJsZS5NQVhfVkFMVUUpOworICAgICAgICBqc29uV3JpdGVyLnZhbHVlKERvdWJsZS5NSU5fVkFMVUUpOworICAgICAgICBqc29uV3JpdGVyLnZhbHVlKDAuMCk7CisgICAgICAgIGpzb25Xcml0ZXIudmFsdWUoLTAuNSk7CisgICAgICAgIGpzb25Xcml0ZXIudmFsdWUoRG91YmxlLk1JTl9OT1JNQUwpOworICAgICAgICBqc29uV3JpdGVyLnZhbHVlKE1hdGguUEkpOworICAgICAgICBqc29uV3JpdGVyLnZhbHVlKE1hdGguRSk7CisgICAgICAgIGpzb25Xcml0ZXIuZW5kQXJyYXkoKTsKKyAgICAgICAganNvbldyaXRlci5jbG9zZSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlstMC4wLCIKKyAgICAgICAgICAgICAgICArICIxLjAsIgorICAgICAgICAgICAgICAgICsgIjEuNzk3NjkzMTM0ODYyMzE1N0UzMDgsIgorICAgICAgICAgICAgICAgICsgIjQuOUUtMzI0LCIKKyAgICAgICAgICAgICAgICArICIwLjAsIgorICAgICAgICAgICAgICAgICsgIi0wLjUsIgorICAgICAgICAgICAgICAgICsgIjIuMjI1MDczODU4NTA3MjAxNEUtMzA4LCIKKyAgICAgICAgICAgICAgICArICIzLjE0MTU5MjY1MzU4OTc5MywiCisgICAgICAgICAgICAgICAgKyAiMi43MTgyODE4Mjg0NTkwNDVdIiwgc3RyaW5nV3JpdGVyLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RMb25ncygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZ1dyaXRlciBzdHJpbmdXcml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisgICAgICAgIEpzb25Xcml0ZXIganNvbldyaXRlciA9IG5ldyBKc29uV3JpdGVyKHN0cmluZ1dyaXRlcik7CisgICAgICAgIGpzb25Xcml0ZXIuYmVnaW5BcnJheSgpOworICAgICAgICBqc29uV3JpdGVyLnZhbHVlKDApOworICAgICAgICBqc29uV3JpdGVyLnZhbHVlKDEpOworICAgICAgICBqc29uV3JpdGVyLnZhbHVlKC0xKTsKKyAgICAgICAganNvbldyaXRlci52YWx1ZShMb25nLk1JTl9WQUxVRSk7CisgICAgICAgIGpzb25Xcml0ZXIudmFsdWUoTG9uZy5NQVhfVkFMVUUpOworICAgICAgICBqc29uV3JpdGVyLmVuZEFycmF5KCk7CisgICAgICAgIGpzb25Xcml0ZXIuY2xvc2UoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJbMCwiCisgICAgICAgICAgICAgICAgKyAiMSwiCisgICAgICAgICAgICAgICAgKyAiLTEsIgorICAgICAgICAgICAgICAgICsgIi05MjIzMzcyMDM2ODU0Nzc1ODA4LCIKKyAgICAgICAgICAgICAgICArICI5MjIzMzcyMDM2ODU0Nzc1ODA3XSIsIHN0cmluZ1dyaXRlci50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Qm9vbGVhbnMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTdHJpbmdXcml0ZXIgc3RyaW5nV3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOworICAgICAgICBKc29uV3JpdGVyIGpzb25Xcml0ZXIgPSBuZXcgSnNvbldyaXRlcihzdHJpbmdXcml0ZXIpOworICAgICAgICBqc29uV3JpdGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAganNvbldyaXRlci52YWx1ZSh0cnVlKTsKKyAgICAgICAganNvbldyaXRlci52YWx1ZShmYWxzZSk7CisgICAgICAgIGpzb25Xcml0ZXIuZW5kQXJyYXkoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJbdHJ1ZSxmYWxzZV0iLCBzdHJpbmdXcml0ZXIudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE51bGxzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nV3JpdGVyIHN0cmluZ1dyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKyAgICAgICAgSnNvbldyaXRlciBqc29uV3JpdGVyID0gbmV3IEpzb25Xcml0ZXIoc3RyaW5nV3JpdGVyKTsKKyAgICAgICAganNvbldyaXRlci5iZWdpbkFycmF5KCk7CisgICAgICAgIGpzb25Xcml0ZXIubnVsbFZhbHVlKCk7CisgICAgICAgIGpzb25Xcml0ZXIuZW5kQXJyYXkoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJbbnVsbF0iLCBzdHJpbmdXcml0ZXIudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFN0cmluZ3MoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTdHJpbmdXcml0ZXIgc3RyaW5nV3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOworICAgICAgICBKc29uV3JpdGVyIGpzb25Xcml0ZXIgPSBuZXcgSnNvbldyaXRlcihzdHJpbmdXcml0ZXIpOworICAgICAgICBqc29uV3JpdGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAganNvbldyaXRlci52YWx1ZSgiYSIpOworICAgICAgICBqc29uV3JpdGVyLnZhbHVlKCJhXCIiKTsKKyAgICAgICAganNvbldyaXRlci52YWx1ZSgiXCIiKTsKKyAgICAgICAganNvbldyaXRlci52YWx1ZSgiOiIpOworICAgICAgICBqc29uV3JpdGVyLnZhbHVlKCIsIik7CisgICAgICAgIGpzb25Xcml0ZXIudmFsdWUoIlxiIik7CisgICAgICAgIGpzb25Xcml0ZXIudmFsdWUoIlxmIik7CisgICAgICAgIGpzb25Xcml0ZXIudmFsdWUoIlxuIik7CisgICAgICAgIGpzb25Xcml0ZXIudmFsdWUoIlxyIik7CisgICAgICAgIGpzb25Xcml0ZXIudmFsdWUoIlx0Iik7CisgICAgICAgIGpzb25Xcml0ZXIudmFsdWUoIiAiKTsKKyAgICAgICAganNvbldyaXRlci52YWx1ZSgiXFwiKTsKKyAgICAgICAganNvbldyaXRlci52YWx1ZSgieyIpOworICAgICAgICBqc29uV3JpdGVyLnZhbHVlKCJ9Iik7CisgICAgICAgIGpzb25Xcml0ZXIudmFsdWUoIlsiKTsKKyAgICAgICAganNvbldyaXRlci52YWx1ZSgiXSIpOworICAgICAgICBqc29uV3JpdGVyLnZhbHVlKCJcMCIpOworICAgICAgICBqc29uV3JpdGVyLnZhbHVlKCJcdTAwMTkiKTsKKyAgICAgICAganNvbldyaXRlci5lbmRBcnJheSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoIltcImFcIiwiCisgICAgICAgICAgICAgICAgKyAiXCJhXFxcIlwiLCIKKyAgICAgICAgICAgICAgICArICJcIlxcXCJcIiwiCisgICAgICAgICAgICAgICAgKyAiXCI6XCIsIgorICAgICAgICAgICAgICAgICsgIlwiLFwiLCIKKyAgICAgICAgICAgICAgICArICJcIlxcYlwiLCIKKyAgICAgICAgICAgICAgICArICJcIlxcZlwiLCIKKyAgICAgICAgICAgICAgICArICJcIlxcblwiLCIKKyAgICAgICAgICAgICAgICArICJcIlxcclwiLCIKKyAgICAgICAgICAgICAgICArICJcIlxcdFwiLCIKKyAgICAgICAgICAgICAgICArICJcIiBcIiwiCisgICAgICAgICAgICAgICAgKyAiXCJcXFxcXCIsIgorICAgICAgICAgICAgICAgICsgIlwie1wiLCIKKyAgICAgICAgICAgICAgICArICJcIn1cIiwiCisgICAgICAgICAgICAgICAgKyAiXCJbXCIsIgorICAgICAgICAgICAgICAgICsgIlwiXVwiLCIKKyAgICAgICAgICAgICAgICArICJcIlxcdTAwMDBcIiwiCisgICAgICAgICAgICAgICAgKyAiXCJcXHUwMDE5XCJdIiwgc3RyaW5nV3JpdGVyLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RFbXB0eUFycmF5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nV3JpdGVyIHN0cmluZ1dyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKyAgICAgICAgSnNvbldyaXRlciBqc29uV3JpdGVyID0gbmV3IEpzb25Xcml0ZXIoc3RyaW5nV3JpdGVyKTsKKyAgICAgICAganNvbldyaXRlci5iZWdpbkFycmF5KCk7CisgICAgICAgIGpzb25Xcml0ZXIuZW5kQXJyYXkoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJbXSIsIHN0cmluZ1dyaXRlci50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW1wdHlPYmplY3QoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTdHJpbmdXcml0ZXIgc3RyaW5nV3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOworICAgICAgICBKc29uV3JpdGVyIGpzb25Xcml0ZXIgPSBuZXcgSnNvbldyaXRlcihzdHJpbmdXcml0ZXIpOworICAgICAgICBqc29uV3JpdGVyLmJlZ2luT2JqZWN0KCk7CisgICAgICAgIGpzb25Xcml0ZXIuZW5kT2JqZWN0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygie30iLCBzdHJpbmdXcml0ZXIudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE9iamVjdHNJbkFycmF5cygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZ1dyaXRlciBzdHJpbmdXcml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisgICAgICAgIEpzb25Xcml0ZXIganNvbldyaXRlciA9IG5ldyBKc29uV3JpdGVyKHN0cmluZ1dyaXRlcik7CisgICAgICAgIGpzb25Xcml0ZXIuYmVnaW5BcnJheSgpOworICAgICAgICBqc29uV3JpdGVyLmJlZ2luT2JqZWN0KCk7CisgICAgICAgIGpzb25Xcml0ZXIubmFtZSgiYSIpLnZhbHVlKDUpOworICAgICAgICBqc29uV3JpdGVyLm5hbWUoImIiKS52YWx1ZShmYWxzZSk7CisgICAgICAgIGpzb25Xcml0ZXIuZW5kT2JqZWN0KCk7CisgICAgICAgIGpzb25Xcml0ZXIuYmVnaW5PYmplY3QoKTsKKyAgICAgICAganNvbldyaXRlci5uYW1lKCJjIikudmFsdWUoNik7CisgICAgICAgIGpzb25Xcml0ZXIubmFtZSgiZCIpLnZhbHVlKHRydWUpOworICAgICAgICBqc29uV3JpdGVyLmVuZE9iamVjdCgpOworICAgICAgICBqc29uV3JpdGVyLmVuZEFycmF5KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiW3tcImFcIjo1LFwiYlwiOmZhbHNlfSwiCisgICAgICAgICAgICAgICAgKyAie1wiY1wiOjYsXCJkXCI6dHJ1ZX1dIiwgc3RyaW5nV3JpdGVyLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RBcnJheXNJbk9iamVjdHMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTdHJpbmdXcml0ZXIgc3RyaW5nV3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOworICAgICAgICBKc29uV3JpdGVyIGpzb25Xcml0ZXIgPSBuZXcgSnNvbldyaXRlcihzdHJpbmdXcml0ZXIpOworICAgICAgICBqc29uV3JpdGVyLmJlZ2luT2JqZWN0KCk7CisgICAgICAgIGpzb25Xcml0ZXIubmFtZSgiYSIpOworICAgICAgICBqc29uV3JpdGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAganNvbldyaXRlci52YWx1ZSg1KTsKKyAgICAgICAganNvbldyaXRlci52YWx1ZShmYWxzZSk7CisgICAgICAgIGpzb25Xcml0ZXIuZW5kQXJyYXkoKTsKKyAgICAgICAganNvbldyaXRlci5uYW1lKCJiIik7CisgICAgICAgIGpzb25Xcml0ZXIuYmVnaW5BcnJheSgpOworICAgICAgICBqc29uV3JpdGVyLnZhbHVlKDYpOworICAgICAgICBqc29uV3JpdGVyLnZhbHVlKHRydWUpOworICAgICAgICBqc29uV3JpdGVyLmVuZEFycmF5KCk7CisgICAgICAgIGpzb25Xcml0ZXIuZW5kT2JqZWN0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygie1wiYVwiOls1LGZhbHNlXSwiCisgICAgICAgICAgICAgICAgKyAiXCJiXCI6WzYsdHJ1ZV19Iiwgc3RyaW5nV3JpdGVyLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3REZWVwTmVzdGluZ0FycmF5cygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZ1dyaXRlciBzdHJpbmdXcml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisgICAgICAgIEpzb25Xcml0ZXIganNvbldyaXRlciA9IG5ldyBKc29uV3JpdGVyKHN0cmluZ1dyaXRlcik7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjA7IGkrKykgeworICAgICAgICAgICAganNvbldyaXRlci5iZWdpbkFycmF5KCk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyMDsgaSsrKSB7CisgICAgICAgICAgICBqc29uV3JpdGVyLmVuZEFycmF5KCk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJbW1tbW1tbW1tbW1tbW1tbW1tbW11dXV1dXV1dXV1dXV1dXV1dXV1dIiwgc3RyaW5nV3JpdGVyLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3REZWVwTmVzdGluZ09iamVjdHMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTdHJpbmdXcml0ZXIgc3RyaW5nV3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOworICAgICAgICBKc29uV3JpdGVyIGpzb25Xcml0ZXIgPSBuZXcgSnNvbldyaXRlcihzdHJpbmdXcml0ZXIpOworICAgICAgICBqc29uV3JpdGVyLmJlZ2luT2JqZWN0KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjA7IGkrKykgeworICAgICAgICAgICAganNvbldyaXRlci5uYW1lKCJhIik7CisgICAgICAgICAgICBqc29uV3JpdGVyLmJlZ2luT2JqZWN0KCk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyMDsgaSsrKSB7CisgICAgICAgICAgICBqc29uV3JpdGVyLmVuZE9iamVjdCgpOworICAgICAgICB9CisgICAgICAgIGpzb25Xcml0ZXIuZW5kT2JqZWN0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygie1wiYVwiOntcImFcIjp7XCJhXCI6e1wiYVwiOntcImFcIjp7XCJhXCI6e1wiYVwiOntcImFcIjp7XCJhXCI6e1wiYVwiOiIKKyAgICAgICAgICAgICAgICArICJ7XCJhXCI6e1wiYVwiOntcImFcIjp7XCJhXCI6e1wiYVwiOntcImFcIjp7XCJhXCI6e1wiYVwiOntcImFcIjp7XCJhXCI6eyIKKyAgICAgICAgICAgICAgICArICJ9fX19fX19fX19fX19fX19fX19fX0iLCBzdHJpbmdXcml0ZXIudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFJlcGVhdGVkTmFtZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZ1dyaXRlciBzdHJpbmdXcml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisgICAgICAgIEpzb25Xcml0ZXIganNvbldyaXRlciA9IG5ldyBKc29uV3JpdGVyKHN0cmluZ1dyaXRlcik7CisgICAgICAgIGpzb25Xcml0ZXIuYmVnaW5PYmplY3QoKTsKKyAgICAgICAganNvbldyaXRlci5uYW1lKCJhIikudmFsdWUodHJ1ZSk7CisgICAgICAgIGpzb25Xcml0ZXIubmFtZSgiYSIpLnZhbHVlKGZhbHNlKTsKKyAgICAgICAganNvbldyaXRlci5lbmRPYmplY3QoKTsKKyAgICAgICAgLy8gSnNvbldyaXRlciBkb2Vzbid0IGF0dGVtcHQgdG8gZGV0ZWN0IGR1cGxpY2F0ZSBuYW1lcworICAgICAgICBhc3NlcnRFcXVhbHMoIntcImFcIjp0cnVlLFwiYVwiOmZhbHNlfSIsIHN0cmluZ1dyaXRlci50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJldHR5UHJpbnRPYmplY3QoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTdHJpbmdXcml0ZXIgc3RyaW5nV3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOworICAgICAgICBKc29uV3JpdGVyIGpzb25Xcml0ZXIgPSBuZXcgSnNvbldyaXRlcihzdHJpbmdXcml0ZXIpOworICAgICAgICBqc29uV3JpdGVyLnNldEluZGVudCgiICAgIik7CisKKyAgICAgICAganNvbldyaXRlci5iZWdpbk9iamVjdCgpOworICAgICAgICBqc29uV3JpdGVyLm5hbWUoImEiKS52YWx1ZSh0cnVlKTsKKyAgICAgICAganNvbldyaXRlci5uYW1lKCJiIikudmFsdWUoZmFsc2UpOworICAgICAgICBqc29uV3JpdGVyLm5hbWUoImMiKS52YWx1ZSg1LjApOworICAgICAgICBqc29uV3JpdGVyLm5hbWUoImUiKS5udWxsVmFsdWUoKTsKKyAgICAgICAganNvbldyaXRlci5uYW1lKCJmIikuYmVnaW5BcnJheSgpOworICAgICAgICBqc29uV3JpdGVyLnZhbHVlKDYuMCk7CisgICAgICAgIGpzb25Xcml0ZXIudmFsdWUoNy4wKTsKKyAgICAgICAganNvbldyaXRlci5lbmRBcnJheSgpOworICAgICAgICBqc29uV3JpdGVyLm5hbWUoImciKS5iZWdpbk9iamVjdCgpOworICAgICAgICBqc29uV3JpdGVyLm5hbWUoImgiKS52YWx1ZSg4LjApOworICAgICAgICBqc29uV3JpdGVyLm5hbWUoImkiKS52YWx1ZSg5LjApOworICAgICAgICBqc29uV3JpdGVyLmVuZE9iamVjdCgpOworICAgICAgICBqc29uV3JpdGVyLmVuZE9iamVjdCgpOworCisgICAgICAgIFN0cmluZyBleHBlY3RlZCA9ICJ7XG4iCisgICAgICAgICAgICAgICAgKyAiICAgXCJhXCI6IHRydWUsXG4iCisgICAgICAgICAgICAgICAgKyAiICAgXCJiXCI6IGZhbHNlLFxuIgorICAgICAgICAgICAgICAgICsgIiAgIFwiY1wiOiA1LjAsXG4iCisgICAgICAgICAgICAgICAgKyAiICAgXCJlXCI6IG51bGwsXG4iCisgICAgICAgICAgICAgICAgKyAiICAgXCJmXCI6IFtcbiIKKyAgICAgICAgICAgICAgICArICIgICAgICA2LjAsXG4iCisgICAgICAgICAgICAgICAgKyAiICAgICAgNy4wXG4iCisgICAgICAgICAgICAgICAgKyAiICAgXSxcbiIKKyAgICAgICAgICAgICAgICArICIgICBcImdcIjoge1xuIgorICAgICAgICAgICAgICAgICsgIiAgICAgIFwiaFwiOiA4LjAsXG4iCisgICAgICAgICAgICAgICAgKyAiICAgICAgXCJpXCI6IDkuMFxuIgorICAgICAgICAgICAgICAgICsgIiAgIH1cbiIKKyAgICAgICAgICAgICAgICArICJ9IjsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBzdHJpbmdXcml0ZXIudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFByZXR0eVByaW50QXJyYXkoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTdHJpbmdXcml0ZXIgc3RyaW5nV3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOworICAgICAgICBKc29uV3JpdGVyIGpzb25Xcml0ZXIgPSBuZXcgSnNvbldyaXRlcihzdHJpbmdXcml0ZXIpOworICAgICAgICBqc29uV3JpdGVyLnNldEluZGVudCgiICAgIik7CisKKyAgICAgICAganNvbldyaXRlci5iZWdpbkFycmF5KCk7CisgICAgICAgIGpzb25Xcml0ZXIudmFsdWUodHJ1ZSk7CisgICAgICAgIGpzb25Xcml0ZXIudmFsdWUoZmFsc2UpOworICAgICAgICBqc29uV3JpdGVyLnZhbHVlKDUuMCk7CisgICAgICAgIGpzb25Xcml0ZXIubnVsbFZhbHVlKCk7CisgICAgICAgIGpzb25Xcml0ZXIuYmVnaW5PYmplY3QoKTsKKyAgICAgICAganNvbldyaXRlci5uYW1lKCJhIikudmFsdWUoNi4wKTsKKyAgICAgICAganNvbldyaXRlci5uYW1lKCJiIikudmFsdWUoNy4wKTsKKyAgICAgICAganNvbldyaXRlci5lbmRPYmplY3QoKTsKKyAgICAgICAganNvbldyaXRlci5iZWdpbkFycmF5KCk7CisgICAgICAgIGpzb25Xcml0ZXIudmFsdWUoOC4wKTsKKyAgICAgICAganNvbldyaXRlci52YWx1ZSg5LjApOworICAgICAgICBqc29uV3JpdGVyLmVuZEFycmF5KCk7CisgICAgICAgIGpzb25Xcml0ZXIuZW5kQXJyYXkoKTsKKworICAgICAgICBTdHJpbmcgZXhwZWN0ZWQgPSAiW1xuIgorICAgICAgICAgICAgICAgICsgIiAgIHRydWUsXG4iCisgICAgICAgICAgICAgICAgKyAiICAgZmFsc2UsXG4iCisgICAgICAgICAgICAgICAgKyAiICAgNS4wLFxuIgorICAgICAgICAgICAgICAgICsgIiAgIG51bGwsXG4iCisgICAgICAgICAgICAgICAgKyAiICAge1xuIgorICAgICAgICAgICAgICAgICsgIiAgICAgIFwiYVwiOiA2LjAsXG4iCisgICAgICAgICAgICAgICAgKyAiICAgICAgXCJiXCI6IDcuMFxuIgorICAgICAgICAgICAgICAgICsgIiAgIH0sXG4iCisgICAgICAgICAgICAgICAgKyAiICAgW1xuIgorICAgICAgICAgICAgICAgICsgIiAgICAgIDguMCxcbiIKKyAgICAgICAgICAgICAgICArICIgICAgICA5LjBcbiIKKyAgICAgICAgICAgICAgICArICIgICBdXG4iCisgICAgICAgICAgICAgICAgKyAiXSI7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZCwgc3RyaW5nV3JpdGVyLnRvU3RyaW5nKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3V0aWwvUGF0dGVybnNUZXN0LmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC91dGlsL1BhdHRlcm5zVGVzdC5qYXZhCmluZGV4IGI5MGM5N2IuLmFhZDNmZTEgMTAwNjQ0Ci0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3V0aWwvUGF0dGVybnNUZXN0LmphdmEKKysrIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvdXRpbC9QYXR0ZXJuc1Rlc3QuamF2YQpAQCAtNjgsNiArNjgsMTMgQEAKICAgICAgICAgdCA9IFBhdHRlcm5zLldFQl9VUkwubWF0Y2hlcigieG4tLWZzcXUwMGEueG4tLTB6d201NmQiKS5tYXRjaGVzKCk7CiAgICAgICAgIGFzc2VydFRydWUoIlZhbGlkIFVSTCIsIHQpOwogCisgICAgICAgIC8vIFVybCBmb3IgdGVzdGluZyB0b3AgbGV2ZWwgQXJhYmljIGNvdW50cnkgY29kZSBkb21haW4gaW4gUHVueWNvZGU6CisgICAgICAgIC8vICAgaHR0cDovL3huLS00Z2JyaW0ueG4tLS0tcm1ja2JiYWpsYzZkajdieG5lMmMueG4tLXdnYmgxYy9hci9kZWZhdWx0LmFzcHgKKyAgICAgICAgdCA9IFBhdHRlcm5zLldFQl9VUkwubWF0Y2hlcigiaHR0cDovL3huLS00Z2JyaW0ueG4tLS0tcm1ja2JiYWpsYzZkajdieG5lMmMueG4tLXdnYmgxYy9hci9kZWZhdWx0LmFzcHgiKS5tYXRjaGVzKCk7CisgICAgICAgIGFzc2VydFRydWUoIlZhbGlkIFVSTCIsIHQpOworICAgICAgICB0ID0gUGF0dGVybnMuV0VCX1VSTC5tYXRjaGVyKCJ4bi0tNGdicmltLnhuLS0tLXJtY2tiYmFqbGM2ZGo3YnhuZTJjLnhuLS13Z2JoMWMvYXIvZGVmYXVsdC5hc3B4IikubWF0Y2hlcygpOworICAgICAgICBhc3NlcnRUcnVlKCJWYWxpZCBVUkwiLCB0KTsKKwogICAgICAgICAvLyBJbnRlcm5hdGlvbmFsaXplZCBVUkwuCiAgICAgICAgIHQgPSBQYXR0ZXJucy5XRUJfVVJMLm1hdGNoZXIoImh0dHA6Ly9cdUQ2MDRcdUFFMDhcdUM2MDFcdUMyMThcdUM5OUQua3IiKS5tYXRjaGVzKCk7CiAgICAgICAgIGFzc2VydFRydWUoIlZhbGlkIFVSTCIsIHQpOwpAQCAtMTA5LDcgKzExNiw3IEBACiAgICAgICAgIHQgPSBQYXR0ZXJucy5ET01BSU5fTkFNRS5tYXRjaGVyKCJtYWlsLmV4YW1wbGUuY29tIikubWF0Y2hlcygpOwogICAgICAgICBhc3NlcnRUcnVlKCJWYWxpZCBkb21haW4iLCB0KTsKIAotICAgICAgICB0ID0gUGF0dGVybnMuV0VCX1VSTC5tYXRjaGVyKCJnb29nbGUubWUiKS5tYXRjaGVzKCk7CisgICAgICAgIHQgPSBQYXR0ZXJucy5ET01BSU5fTkFNRS5tYXRjaGVyKCJnb29nbGUubWUiKS5tYXRjaGVzKCk7CiAgICAgICAgIGFzc2VydFRydWUoIlZhbGlkIGRvbWFpbiIsIHQpOwogCiAgICAgICAgIC8vIEludGVybmF0aW9uYWxpemVkIGRvbWFpbnMuCkBAIC0xMTgsNiArMTI1LDE0IEBACiAKICAgICAgICAgdCA9IFBhdHRlcm5zLkRPTUFJTl9OQU1FLm1hdGNoZXIoIl9fKyY0Mi54ZXIiKS5tYXRjaGVzKCk7CiAgICAgICAgIGFzc2VydEZhbHNlKCJJbnZhbGlkIGRvbWFpbiIsIHQpOworCisgICAgICAgIC8vIE9ic29sZXRlIGRvbWFpbiAueXUKKyAgICAgICAgdCA9IFBhdHRlcm5zLkRPTUFJTl9OQU1FLm1hdGNoZXIoInRlc3QueXUiKS5tYXRjaGVzKCk7CisgICAgICAgIGFzc2VydEZhbHNlKCJPYnNvbGV0ZSBjb3VudHJ5IGNvZGUgdG9wIGxldmVsIGRvbWFpbiIsIHQpOworCisgICAgICAgIC8vIFRlc3RpbmcgdG9wIGxldmVsIEFyYWJpYyBjb3VudHJ5IGNvZGUgZG9tYWluIGluIFB1bnljb2RlOgorICAgICAgICB0ID0gUGF0dGVybnMuRE9NQUlOX05BTUUubWF0Y2hlcigieG4tLTRnYnJpbS54bi0tLS1ybWNrYmJhamxjNmRqN2J4bmUyYy54bi0td2diaDFjIikubWF0Y2hlcygpOworICAgICAgICBhc3NlcnRUcnVlKCJWYWxpZCBkb21haW4iLCB0KTsKICAgICB9CiAKICAgICBAU21hbGxUZXN0CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC93ZWJraXQvWm9vbU1hbmFnZXJUZXN0LmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC93ZWJraXQvWm9vbU1hbmFnZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWM5ZGVmZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3dlYmtpdC9ab29tTWFuYWdlclRlc3QuamF2YQpAQCAtMCwwICsxLDEyNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGFuZHJvaWQud2Via2l0OworCitpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKKworcHVibGljIGNsYXNzIFpvb21NYW5hZ2VyVGVzdCBleHRlbmRzIEFuZHJvaWRUZXN0Q2FzZSB7CisKKyAgICBwcml2YXRlIFpvb21NYW5hZ2VyIHpvb21NYW5hZ2VyOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CisgICAgICAgIFdlYlZpZXcgd2ViVmlldyA9IG5ldyBXZWJWaWV3KHRoaXMuZ2V0Q29udGV4dCgpKTsKKyAgICAgICAgQ2FsbGJhY2tQcm94eSBjYWxsYmFja1Byb3h5ID0gbmV3IENhbGxiYWNrUHJveHkodGhpcy5nZXRDb250ZXh0KCksIHdlYlZpZXcpOworICAgICAgICB6b29tTWFuYWdlciA9IG5ldyBab29tTWFuYWdlcih3ZWJWaWV3LCBjYWxsYmFja1Byb3h5KTsKKworICAgICAgICB6b29tTWFuYWdlci5pbml0KDEuMDBmKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5pdCgpIHsKKyAgICAgICAgdGVzdEluaXQoMC4wMWYpOworICAgICAgICB0ZXN0SW5pdCgxLjAwZik7CisgICAgICAgIHRlc3RJbml0KDEuMjVmKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdGVzdEluaXQoZmxvYXQgZGVuc2l0eSkgeworICAgICAgICB6b29tTWFuYWdlci5pbml0KGRlbnNpdHkpOworICAgICAgICBhY3R1YWxTY2FsZVRlc3QoZGVuc2l0eSk7CisgICAgICAgIGRlZmF1bHRTY2FsZVRlc3QoZGVuc2l0eSk7CisgICAgICAgIGFzc2VydEVxdWFscyh6b29tTWFuYWdlci5nZXREZWZhdWx0TWF4Wm9vbVNjYWxlKCksIHpvb21NYW5hZ2VyLmdldE1heFpvb21TY2FsZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHpvb21NYW5hZ2VyLmdldERlZmF1bHRNaW5ab29tU2NhbGUoKSwgem9vbU1hbmFnZXIuZ2V0TWluWm9vbVNjYWxlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZGVuc2l0eSwgem9vbU1hbmFnZXIuZ2V0VGV4dFdyYXBTY2FsZSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRGVmYXVsdFpvb21EZW5zaXR5KCkgeworICAgICAgICAvLyB0ZXN0IHRoZSBiYXNpYyBjYXNlIHdoZXJlIHRoZSBhY3R1YWwgdmFsdWVzIGFyZSBlcXVhbCB0byB0aGUgZGVmYXVsdHMKKyAgICAgICAgdGVzdFVwZGF0ZURlZmF1bHRab29tRGVuc2l0eSgwLjAxZik7CisgICAgICAgIHRlc3RVcGRhdGVEZWZhdWx0Wm9vbURlbnNpdHkoMS4wMGYpOworICAgICAgICB0ZXN0VXBkYXRlRGVmYXVsdFpvb21EZW5zaXR5KDEuMjVmKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdGVzdFVwZGF0ZURlZmF1bHRab29tRGVuc2l0eShmbG9hdCBkZW5zaXR5KSB7CisgICAgICAgIHpvb21NYW5hZ2VyLnVwZGF0ZURlZmF1bHRab29tRGVuc2l0eShkZW5zaXR5KTsKKyAgICAgICAgZGVmYXVsdFNjYWxlVGVzdChkZW5zaXR5KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRGVmYXVsdFpvb21EZW5zaXR5V2l0aFNtYWxsTWluWm9vbSgpIHsKKyAgICAgICAgLy8gdGVzdCB0aGUgY2FzZSB3aGVyZSB0aGUgbWluWm9vbVNjYWxlIGhhcyBjaGFuZ2VkIHRvIGJlIDwgdGhlIGRlZmF1bHQKKyAgICAgICAgZmxvYXQgbmV3RGVmYXVsdFNjYWxlID0gMS41MGY7CisgICAgICAgIGZsb2F0IG1pblpvb21TY2FsZSA9IFpvb21NYW5hZ2VyLkRFRkFVTFRfTUlOX1pPT01fU0NBTEVfRkFDVE9SICogbmV3RGVmYXVsdFNjYWxlOworICAgICAgICBXZWJWaWV3Q29yZS5WaWV3U3RhdGUgbWluVmlld1N0YXRlID0gbmV3IFdlYlZpZXdDb3JlLlZpZXdTdGF0ZSgpOworICAgICAgICBtaW5WaWV3U3RhdGUubU1pblNjYWxlID0gbWluWm9vbVNjYWxlIC0gMC4xZjsKKyAgICAgICAgem9vbU1hbmFnZXIudXBkYXRlWm9vbVJhbmdlKG1pblZpZXdTdGF0ZSwgMCwgMCk7CisgICAgICAgIHpvb21NYW5hZ2VyLnVwZGF0ZURlZmF1bHRab29tRGVuc2l0eShuZXdEZWZhdWx0U2NhbGUpOworICAgICAgICBkZWZhdWx0U2NhbGVUZXN0KG5ld0RlZmF1bHRTY2FsZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFVwZGF0ZURlZmF1bHRab29tRGVuc2l0eVdpdGhMYXJnZU1pblpvb20oKSB7CisgICAgICAgIC8vIHRlc3QgdGhlIGNhc2Ugd2hlcmUgdGhlIG1pblpvb21TY2FsZSBoYXMgY2hhbmdlZCB0byBiZSA+IHRoZSBkZWZhdWx0CisgICAgICAgIGZsb2F0IG5ld0RlZmF1bHRTY2FsZSA9IDEuNTBmOworICAgICAgICBmbG9hdCBtaW5ab29tU2NhbGUgPSBab29tTWFuYWdlci5ERUZBVUxUX01JTl9aT09NX1NDQUxFX0ZBQ1RPUiAqIG5ld0RlZmF1bHRTY2FsZTsKKyAgICAgICAgV2ViVmlld0NvcmUuVmlld1N0YXRlIG1pblZpZXdTdGF0ZSA9IG5ldyBXZWJWaWV3Q29yZS5WaWV3U3RhdGUoKTsKKyAgICAgICAgbWluVmlld1N0YXRlLm1NaW5TY2FsZSA9IG1pblpvb21TY2FsZSArIDAuMWY7CisgICAgICAgIHpvb21NYW5hZ2VyLnVwZGF0ZVpvb21SYW5nZShtaW5WaWV3U3RhdGUsIDAsIDApOworICAgICAgICB6b29tTWFuYWdlci51cGRhdGVEZWZhdWx0Wm9vbURlbnNpdHkobmV3RGVmYXVsdFNjYWxlKTsKKyAgICAgICAgZGVmYXVsdFNjYWxlVGVzdChuZXdEZWZhdWx0U2NhbGUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RVcGRhdGVEZWZhdWx0Wm9vbURlbnNpdHlXaXRoU21hbGxNYXhab29tKCkgeworICAgICAgICAvLyB0ZXN0IHRoZSBjYXNlIHdoZXJlIHRoZSBtYXhab29tU2NhbGUgaGFzIGNoYW5nZWQgdG8gYmUgPCB0aGUgZGVmYXVsdAorICAgICAgICBmbG9hdCBuZXdEZWZhdWx0U2NhbGUgPSAxLjUwZjsKKyAgICAgICAgZmxvYXQgbWF4Wm9vbVNjYWxlID0gWm9vbU1hbmFnZXIuREVGQVVMVF9NQVhfWk9PTV9TQ0FMRV9GQUNUT1IgKiBuZXdEZWZhdWx0U2NhbGU7CisgICAgICAgIFdlYlZpZXdDb3JlLlZpZXdTdGF0ZSBtYXhWaWV3U3RhdGUgPSBuZXcgV2ViVmlld0NvcmUuVmlld1N0YXRlKCk7CisgICAgICAgIG1heFZpZXdTdGF0ZS5tTWF4U2NhbGUgPSBtYXhab29tU2NhbGUgLSAwLjFmOworICAgICAgICB6b29tTWFuYWdlci51cGRhdGVab29tUmFuZ2UobWF4Vmlld1N0YXRlLCAwLCAwKTsKKyAgICAgICAgem9vbU1hbmFnZXIudXBkYXRlRGVmYXVsdFpvb21EZW5zaXR5KG5ld0RlZmF1bHRTY2FsZSk7CisgICAgICAgIGRlZmF1bHRTY2FsZVRlc3QobmV3RGVmYXVsdFNjYWxlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRGVmYXVsdFpvb21EZW5zaXR5V2l0aExhcmdlTWF4Wm9vbSgpIHsKKyAgICAgICAgLy8gdGVzdCB0aGUgY2FzZSB3aGVyZSB0aGUgbWF4Wm9vbVNjYWxlIGhhcyBjaGFuZ2VkIHRvIGJlID4gdGhlIGRlZmF1bHQKKyAgICAgICAgZmxvYXQgbmV3RGVmYXVsdFNjYWxlID0gMS41MGY7CisgICAgICAgIGZsb2F0IG1heFpvb21TY2FsZSA9IFpvb21NYW5hZ2VyLkRFRkFVTFRfTUFYX1pPT01fU0NBTEVfRkFDVE9SICogbmV3RGVmYXVsdFNjYWxlOworICAgICAgICBXZWJWaWV3Q29yZS5WaWV3U3RhdGUgbWF4Vmlld1N0YXRlID0gbmV3IFdlYlZpZXdDb3JlLlZpZXdTdGF0ZSgpOworICAgICAgICBtYXhWaWV3U3RhdGUubU1heFNjYWxlID0gbWF4Wm9vbVNjYWxlICsgMC4xZjsKKyAgICAgICAgem9vbU1hbmFnZXIudXBkYXRlWm9vbVJhbmdlKG1heFZpZXdTdGF0ZSwgMCwgMCk7CisgICAgICAgIHpvb21NYW5hZ2VyLnVwZGF0ZURlZmF1bHRab29tRGVuc2l0eShuZXdEZWZhdWx0U2NhbGUpOworICAgICAgICBkZWZhdWx0U2NhbGVUZXN0KG5ld0RlZmF1bHRTY2FsZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdENvbXB1dGVTY2FsZVdpdGhMaW1pdHMoKSB7CisgICAgICAgIGZpbmFsIGZsb2F0IG1heFNjYWxlID0gem9vbU1hbmFnZXIuZ2V0TWF4Wm9vbVNjYWxlKCk7CisgICAgICAgIGZpbmFsIGZsb2F0IG1pblNjYWxlID0gem9vbU1hbmFnZXIuZ2V0TWluWm9vbVNjYWxlKCk7CisgICAgICAgIGFzc2VydFRydWUobWF4U2NhbGUgPiBtaW5TY2FsZSk7CisgICAgICAgIGFzc2VydEVxdWFscyhtYXhTY2FsZSwgem9vbU1hbmFnZXIuY29tcHV0ZVNjYWxlV2l0aExpbWl0cyhtYXhTY2FsZSkpOworICAgICAgICBhc3NlcnRFcXVhbHMobWF4U2NhbGUsIHpvb21NYW5hZ2VyLmNvbXB1dGVTY2FsZVdpdGhMaW1pdHMobWF4U2NhbGUgKyAuMDFmKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhtaW5TY2FsZSwgem9vbU1hbmFnZXIuY29tcHV0ZVNjYWxlV2l0aExpbWl0cyhtaW5TY2FsZSkpOworICAgICAgICBhc3NlcnRFcXVhbHMobWluU2NhbGUsIHpvb21NYW5hZ2VyLmNvbXB1dGVTY2FsZVdpdGhMaW1pdHMobWluU2NhbGUgLSAuMDFmKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFjdHVhbFNjYWxlVGVzdChmbG9hdCBhY3R1YWxTY2FsZSkgeworICAgICAgICBhc3NlcnRFcXVhbHMoYWN0dWFsU2NhbGUsIHpvb21NYW5hZ2VyLmdldFNjYWxlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSAvIGFjdHVhbFNjYWxlLCB6b29tTWFuYWdlci5nZXRJbnZTY2FsZSgpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZGVmYXVsdFNjYWxlVGVzdChmbG9hdCBkZWZhdWx0U2NhbGUpIHsKKyAgICAgICAgZmluYWwgZmxvYXQgbWF4RGVmYXVsdCA9IFpvb21NYW5hZ2VyLkRFRkFVTFRfTUFYX1pPT01fU0NBTEVfRkFDVE9SICogZGVmYXVsdFNjYWxlOworICAgICAgICBmaW5hbCBmbG9hdCBtaW5EZWZhdWx0ID0gWm9vbU1hbmFnZXIuREVGQVVMVF9NSU5fWk9PTV9TQ0FMRV9GQUNUT1IgKiBkZWZhdWx0U2NhbGU7CisgICAgICAgIGFzc2VydEVxdWFscyhkZWZhdWx0U2NhbGUsIHpvb21NYW5hZ2VyLmdldERlZmF1bHRTY2FsZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEgLyBkZWZhdWx0U2NhbGUsIHpvb21NYW5hZ2VyLmdldEludkRlZmF1bHRTY2FsZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1heERlZmF1bHQsIHpvb21NYW5hZ2VyLmdldERlZmF1bHRNYXhab29tU2NhbGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhtaW5EZWZhdWx0LCB6b29tTWFuYWdlci5nZXREZWZhdWx0TWluWm9vbVNjYWxlKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3dpZGdldC9leHBhbmRhYmxlbGlzdHZpZXcvRXhwYW5kYWJsZUxpc3RCYXNpY1Rlc3QuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3dpZGdldC9leHBhbmRhYmxlbGlzdHZpZXcvRXhwYW5kYWJsZUxpc3RCYXNpY1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTIzYjUxNi4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC93aWRnZXQvZXhwYW5kYWJsZWxpc3R2aWV3L0V4cGFuZGFibGVMaXN0QmFzaWNUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC53aWRnZXQuZXhwYW5kYWJsZWxpc3R2aWV3OwotCi1pbXBvcnQgYW5kcm9pZC50ZXN0LkFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uVGVzdENhc2UyOwotaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5NZWRpdW1UZXN0OwotaW1wb3J0IGFuZHJvaWQudXRpbC5FeHBhbmRhYmxlTGlzdFNjZW5hcmlvOwotaW1wb3J0IGFuZHJvaWQudXRpbC5MaXN0VXRpbDsKLWltcG9ydCBhbmRyb2lkLnV0aWwuRXhwYW5kYWJsZUxpc3RTY2VuYXJpby5NeUdyb3VwOwotaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5CYXNlRXhwYW5kYWJsZUxpc3RBZGFwdGVyOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkV4cGFuZGFibGVMaXN0QWRhcHRlcjsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5FeHBhbmRhYmxlTGlzdFZpZXc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotcHVibGljIGNsYXNzIEV4cGFuZGFibGVMaXN0QmFzaWNUZXN0IGV4dGVuZHMgQWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTI8RXhwYW5kYWJsZUxpc3RTaW1wbGU+IHsKLSAgICBwcml2YXRlIEV4cGFuZGFibGVMaXN0U2NlbmFyaW8gbUFjdGl2aXR5OwotICAgIHByaXZhdGUgRXhwYW5kYWJsZUxpc3RWaWV3IG1FeHBhbmRhYmxlTGlzdFZpZXc7Ci0gICAgcHJpdmF0ZSBFeHBhbmRhYmxlTGlzdEFkYXB0ZXIgbUFkYXB0ZXI7Ci0gICAgcHJpdmF0ZSBMaXN0VXRpbCBtTGlzdFV0aWw7Ci0gICAgCi0gICAgcHVibGljIEV4cGFuZGFibGVMaXN0QmFzaWNUZXN0KCkgewotICAgICAgICBzdXBlcihFeHBhbmRhYmxlTGlzdFNpbXBsZS5jbGFzcyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuc2V0VXAoKTsKLSAgICAgICAgCi0gICAgICAgIG1BY3Rpdml0eSA9IGdldEFjdGl2aXR5KCk7Ci0gICAgICAgIG1FeHBhbmRhYmxlTGlzdFZpZXcgPSBtQWN0aXZpdHkuZ2V0RXhwYW5kYWJsZUxpc3RWaWV3KCk7Ci0gICAgICAgIG1BZGFwdGVyID0gbUV4cGFuZGFibGVMaXN0Vmlldy5nZXRFeHBhbmRhYmxlTGlzdEFkYXB0ZXIoKTsKLSAgICAgICAgbUxpc3RVdGlsID0gbmV3IExpc3RVdGlsKG1FeHBhbmRhYmxlTGlzdFZpZXcsIGdldEluc3RydW1lbnRhdGlvbigpKTsKLSAgICB9Ci0gICAgCi0gICAgQE1lZGl1bVRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0UHJlY29uZGl0aW9ucygpIHsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChtQWN0aXZpdHkpOwotICAgICAgICBhc3NlcnROb3ROdWxsKG1FeHBhbmRhYmxlTGlzdFZpZXcpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIGludCBleHBhbmRHcm91cChpbnQgbnVtQ2hpbGRyZW4sIGJvb2xlYW4gYXRMZWFzdE9uZUNoaWxkKSB7Ci0gICAgICAgIGZpbmFsIGludCBncm91cFBvcyA9IG1BY3Rpdml0eS5maW5kR3JvdXBXaXRoTnVtQ2hpbGRyZW4obnVtQ2hpbGRyZW4sIGF0TGVhc3RPbmVDaGlsZCk7Ci0gICAgICAgIGFzc2VydFRydWUoIkNvdWxkIG5vdCBmaW5kIGdyb3VwIHRvIGV4cGFuZCIsIGdyb3VwUG9zID49IDApOwotCi0gICAgICAgIGFzc2VydEZhbHNlKCJHcm91cCBpcyBhbHJlYWR5IGV4cGFuZGVkIiwgbUV4cGFuZGFibGVMaXN0Vmlldy5pc0dyb3VwRXhwYW5kZWQoZ3JvdXBQb3MpKTsKLSAgICAgICAgbUxpc3RVdGlsLmFycm93U2Nyb2xsVG9TZWxlY3RlZFBvc2l0aW9uKGdyb3VwUG9zKTsKLSAgICAgICAgZ2V0SW5zdHJ1bWVudGF0aW9uKCkud2FpdEZvcklkbGVTeW5jKCk7Ci0gICAgICAgIHNlbmRLZXlzKEtleUV2ZW50LktFWUNPREVfRFBBRF9DRU5URVIpOwotICAgICAgICBnZXRJbnN0cnVtZW50YXRpb24oKS53YWl0Rm9ySWRsZVN5bmMoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiR3JvdXAgZGlkIG5vdCBleHBhbmQiLCBtRXhwYW5kYWJsZUxpc3RWaWV3LmlzR3JvdXBFeHBhbmRlZChncm91cFBvcykpOwotCi0gICAgICAgIHJldHVybiBncm91cFBvczsKLSAgICB9Ci0KLSAgICBATWVkaXVtVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RFeHBhbmRHcm91cCgpIHsKLSAgICAgICAgZXhwYW5kR3JvdXAoLTEsIHRydWUpOwotICAgIH0KLSAgICAKLSAgICBATWVkaXVtVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RDb2xsYXBzZUdyb3VwKCkgewotICAgICAgICBmaW5hbCBpbnQgZ3JvdXBQb3MgPSBleHBhbmRHcm91cCgtMSwgdHJ1ZSk7Ci0gICAgICAgIAotICAgICAgICBzZW5kS2V5cyhLZXlFdmVudC5LRVlDT0RFX0RQQURfQ0VOVEVSKTsKLSAgICAgICAgZ2V0SW5zdHJ1bWVudGF0aW9uKCkud2FpdEZvcklkbGVTeW5jKCk7Ci0gICAgICAgIGFzc2VydEZhbHNlKCJHcm91cCBkaWQgbm90IGNvbGxhcHNlIiwgbUV4cGFuZGFibGVMaXN0Vmlldy5pc0dyb3VwRXhwYW5kZWQoZ3JvdXBQb3MpKTsKLSAgICB9Ci0gICAgCi0gICAgQE1lZGl1bVRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RXhwYW5kZWRHcm91cE1vdmVtZW50KCkgewotICAgICAgICAvLyBFeHBhbmQgdGhlIGZpcnN0IGdyb3VwCi0gICAgICAgIG1MaXN0VXRpbC5hcnJvd1Njcm9sbFRvU2VsZWN0ZWRQb3NpdGlvbigwKTsKLSAgICAgICAgc2VuZEtleXMoS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0NFTlRFUik7Ci0gICAgICAgIGdldEluc3RydW1lbnRhdGlvbigpLndhaXRGb3JJZGxlU3luYygpOwotCi0gICAgICAgIC8vIEVuc3VyZSBpdCBleHBhbmRlZAotICAgICAgICBhc3NlcnRUcnVlKCJHcm91cCBkaWQgbm90IGV4cGFuZCIsIG1FeHBhbmRhYmxlTGlzdFZpZXcuaXNHcm91cEV4cGFuZGVkKDApKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFdhaXQgdW50aWwgdGhhdCdzIGFsbCBnb29kCi0gICAgICAgIGdldEluc3RydW1lbnRhdGlvbigpLndhaXRGb3JJZGxlU3luYygpOwotICAgICAgICAKLSAgICAgICAgLy8gTWFrZSBzdXJlIGl0IGV4cGFuZGVkCi0gICAgICAgIGFzc2VydFRydWUoIkdyb3VwIGRpZCBub3QgZXhwYW5kIiwgbUV4cGFuZGFibGVMaXN0Vmlldy5pc0dyb3VwRXhwYW5kZWQoMCkpOwotICAgICAgICAKLSAgICAgICAgLy8gSW5zZXJ0IGEgY29sbGFwc2VkIGdyb3VwIGluIGZyb250IG9mIHRoZSBvbmUganVzdCBleHBhbmRlZAotICAgICAgICBMaXN0PE15R3JvdXA+IGdyb3VwcyA9IG1BY3Rpdml0eS5nZXRHcm91cHMoKTsKLSAgICAgICAgTXlHcm91cCBpbnNlcnRlZEdyb3VwID0gbmV3IE15R3JvdXAoMSk7Ci0gICAgICAgIGdyb3Vwcy5hZGQoMCwgaW5zZXJ0ZWRHcm91cCk7Ci0gICAgICAgIAotICAgICAgICAvLyBOb3RpZnkgZGF0YSBjaGFuZ2UKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiQWRhcHRlciBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgdGhlIGJhc2UgYWRhcHRlciIsCi0gICAgICAgICAgICAgICAgbUFkYXB0ZXIgaW5zdGFuY2VvZiBCYXNlRXhwYW5kYWJsZUxpc3RBZGFwdGVyKTsKLSAgICAgICAgZmluYWwgQmFzZUV4cGFuZGFibGVMaXN0QWRhcHRlciBhZGFwdGVyID0gKEJhc2VFeHBhbmRhYmxlTGlzdEFkYXB0ZXIpIG1BZGFwdGVyOwotICAgICAKLSAgICAgICAgbUFjdGl2aXR5LnJ1bk9uVWlUaHJlYWQobmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgIGFkYXB0ZXIubm90aWZ5RGF0YVNldENoYW5nZWQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIGdldEluc3RydW1lbnRhdGlvbigpLndhaXRGb3JJZGxlU3luYygpOwotICAgICAgICAKLSAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSByaWdodCBncm91cCBpcyBleHBhbmRlZAotICAgICAgICBhc3NlcnRUcnVlKCJUaGUgZXhwYW5kZWQgc3RhdGUgZGlkbid0IHN0YXkgd2l0aCB0aGUgcHJvcGVyIGdyb3VwIiwKLSAgICAgICAgICAgICAgICBtRXhwYW5kYWJsZUxpc3RWaWV3LmlzR3JvdXBFeHBhbmRlZCgxKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKCJUaGUgZXhwYW5kZWQgc3RhdGUgd2FzIGdpdmVuIHRvIHRoZSBpbnNlcnRlZCBncm91cCIsCi0gICAgICAgICAgICAgICAgbUV4cGFuZGFibGVMaXN0Vmlldy5pc0dyb3VwRXhwYW5kZWQoMCkpOwotICAgIH0KLQotICAgIEBNZWRpdW1UZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdENvbnRleHRNZW51cygpIHsKLSAgICAgICAgRXhwYW5kYWJsZUxpc3RUZXN0ZXIgdGVzdGVyID0gbmV3IEV4cGFuZGFibGVMaXN0VGVzdGVyKG1FeHBhbmRhYmxlTGlzdFZpZXcsIHRoaXMpOwotICAgICAgICB0ZXN0ZXIudGVzdENvbnRleHRNZW51cygpOwotICAgIH0KLQotICAgIEBNZWRpdW1UZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdENvbnZlcnRpb25CZXR3ZWVuRmxhdEFuZFBhY2tlZCgpIHsKLSAgICAgICAgRXhwYW5kYWJsZUxpc3RUZXN0ZXIgdGVzdGVyID0gbmV3IEV4cGFuZGFibGVMaXN0VGVzdGVyKG1FeHBhbmRhYmxlTGlzdFZpZXcsIHRoaXMpOwotICAgICAgICB0ZXN0ZXIudGVzdENvbnZlcnRpb25CZXR3ZWVuRmxhdEFuZFBhY2tlZE9uR3JvdXBzKCk7Ci0gICAgICAgIHRlc3Rlci50ZXN0Q29udmVydGlvbkJldHdlZW5GbGF0QW5kUGFja2VkT25DaGlsZHJlbigpOwotICAgIH0KLQotICAgIEBNZWRpdW1UZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFNlbGVjdGVkUG9zaXRpb24oKSB7Ci0gICAgICAgIEV4cGFuZGFibGVMaXN0VGVzdGVyIHRlc3RlciA9IG5ldyBFeHBhbmRhYmxlTGlzdFRlc3RlcihtRXhwYW5kYWJsZUxpc3RWaWV3LCB0aGlzKTsKLSAgICAgICAgdGVzdGVyLnRlc3RTZWxlY3RlZFBvc2l0aW9uT25Hcm91cHMoKTsKLSAgICAgICAgdGVzdGVyLnRlc3RTZWxlY3RlZFBvc2l0aW9uT25DaGlsZHJlbigpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3dpZGdldC9leHBhbmRhYmxlbGlzdHZpZXcvRXhwYW5kYWJsZUxpc3RTaW1wbGUuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3dpZGdldC9leHBhbmRhYmxlbGlzdHZpZXcvRXhwYW5kYWJsZUxpc3RTaW1wbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhkYjI4Yy4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC93aWRnZXQvZXhwYW5kYWJsZWxpc3R2aWV3L0V4cGFuZGFibGVMaXN0U2ltcGxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLndpZGdldC5leHBhbmRhYmxlbGlzdHZpZXc7Ci0KLWltcG9ydCBhbmRyb2lkLnZpZXcuTWVudTsKLWltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUl0ZW07Ci1pbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnVJdGVtLk9uTWVudUl0ZW1DbGlja0xpc3RlbmVyOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkJhc2VFeHBhbmRhYmxlTGlzdEFkYXB0ZXI7Ci0KLWltcG9ydCBhbmRyb2lkLnV0aWwuRXhwYW5kYWJsZUxpc3RTY2VuYXJpbzsKLQotcHVibGljIGNsYXNzIEV4cGFuZGFibGVMaXN0U2ltcGxlIGV4dGVuZHMgRXhwYW5kYWJsZUxpc3RTY2VuYXJpbyB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50W10gTlVNX0NISUxEUkVOID0gezQsIDMsIDIsIDEsIDB9OwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdChFeHBhbmRhYmxlUGFyYW1zIHBhcmFtcykgewotICAgICAgICBwYXJhbXMuc2V0TnVtQ2hpbGRyZW4oTlVNX0NISUxEUkVOKQotICAgICAgICAgICAgICAgIC5zZXRJdGVtU2NyZWVuU2l6ZUZhY3RvcigwLjE0KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBvbkNyZWF0ZU9wdGlvbnNNZW51KE1lbnUgbWVudSkgewotCi0gICAgICAgIG1lbnUuYWRkKCJBZGQgaXRlbSIpLnNldE9uTWVudUl0ZW1DbGlja0xpc3RlbmVyKG5ldyBPbk1lbnVJdGVtQ2xpY2tMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIG9uTWVudUl0ZW1DbGljayhNZW51SXRlbSBpdGVtKSB7Ci0gICAgICAgICAgICAgICAgbUdyb3Vwcy5hZGQoMCwgbmV3IE15R3JvdXAoMikpOwotICAgICAgICAgICAgICAgICgoQmFzZUV4cGFuZGFibGVMaXN0QWRhcHRlcikgbUFkYXB0ZXIpLm5vdGlmeURhdGFTZXRDaGFuZ2VkKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvd2lkZ2V0L2V4cGFuZGFibGVsaXN0dmlldy9FeHBhbmRhYmxlTGlzdFRlc3Rlci5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvd2lkZ2V0L2V4cGFuZGFibGVsaXN0dmlldy9FeHBhbmRhYmxlTGlzdFRlc3Rlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZmIxMGZiLi4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3dpZGdldC9leHBhbmRhYmxlbGlzdHZpZXcvRXhwYW5kYWJsZUxpc3RUZXN0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLndpZGdldC5leHBhbmRhYmxlbGlzdHZpZXc7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5JbnN0cnVtZW50YXRpb247Ci1pbXBvcnQgYW5kcm9pZC50ZXN0LkFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uVGVzdENhc2UyOwotaW1wb3J0IGFuZHJvaWQudXRpbC5FeHBhbmRhYmxlTGlzdFNjZW5hcmlvOwotaW1wb3J0IGFuZHJvaWQudXRpbC5MaXN0VXRpbDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuRXhwYW5kYWJsZUxpc3RBZGFwdGVyOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkV4cGFuZGFibGVMaXN0VmlldzsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7Ci0KLXB1YmxpYyBjbGFzcyBFeHBhbmRhYmxlTGlzdFRlc3RlciB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBFeHBhbmRhYmxlTGlzdFZpZXcgbUV4cGFuZGFibGVMaXN0VmlldzsKLSAgICBwcml2YXRlIGZpbmFsIEV4cGFuZGFibGVMaXN0QWRhcHRlciBtQWRhcHRlcjsKLSAgICBwcml2YXRlIGZpbmFsIExpc3RVdGlsIG1MaXN0VXRpbDsKLQotICAgIHByaXZhdGUgZmluYWwgQWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTI8PyBleHRlbmRzIEV4cGFuZGFibGVMaXN0U2NlbmFyaW8+Ci0gICAgICAgIG1BY3Rpdml0eUluc3RydW1lbnRhdGlvbjsKLQotICAgIEluc3RydW1lbnRhdGlvbiBtSW5zdHJ1bWVudGF0aW9uOwotCi0gICAgcHVibGljIEV4cGFuZGFibGVMaXN0VGVzdGVyKAotICAgICAgICAgICAgRXhwYW5kYWJsZUxpc3RWaWV3IGV4cGFuZGFibGVMaXN0VmlldywKLSAgICAgICAgICAgIEFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uVGVzdENhc2UyPD8gZXh0ZW5kcyBFeHBhbmRhYmxlTGlzdFNjZW5hcmlvPgotICAgICAgICAgICAgYWN0aXZpdHlJbnN0cnVtZW50YXRpb24pIHsKLSAgICAgICAgbUV4cGFuZGFibGVMaXN0VmlldyA9IGV4cGFuZGFibGVMaXN0VmlldzsKLSAgICAgICAgSW5zdHJ1bWVudGF0aW9uIGluc3RydW1lbnRhdGlvbiA9IGFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uLmdldEluc3RydW1lbnRhdGlvbigpOwotICAgICAgICBtTGlzdFV0aWwgPSBuZXcgTGlzdFV0aWwobUV4cGFuZGFibGVMaXN0VmlldywgaW5zdHJ1bWVudGF0aW9uKTsKLSAgICAgICAgbUFkYXB0ZXIgPSBtRXhwYW5kYWJsZUxpc3RWaWV3LmdldEV4cGFuZGFibGVMaXN0QWRhcHRlcigpOwotICAgICAgICBtQWN0aXZpdHlJbnN0cnVtZW50YXRpb24gPSBhY3Rpdml0eUluc3RydW1lbnRhdGlvbjsKLSAgICAgICAgbUluc3RydW1lbnRhdGlvbiA9IG1BY3Rpdml0eUluc3RydW1lbnRhdGlvbi5nZXRJbnN0cnVtZW50YXRpb24oKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZXhwYW5kR3JvdXAoZmluYWwgaW50IGdyb3VwSW5kZXgsIGludCBmbGF0UG9zaXRpb24pIHsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKCJHcm91cCBpcyBhbHJlYWR5IGV4cGFuZGVkIiwgbUV4cGFuZGFibGVMaXN0VmlldwotICAgICAgICAgICAgICAgIC5pc0dyb3VwRXhwYW5kZWQoZ3JvdXBJbmRleCkpOwotICAgICAgICBtTGlzdFV0aWwuYXJyb3dTY3JvbGxUb1NlbGVjdGVkUG9zaXRpb24oZmxhdFBvc2l0aW9uKTsKLSAgICAgICAgbUluc3RydW1lbnRhdGlvbi53YWl0Rm9ySWRsZVN5bmMoKTsKLSAgICAgICAgbUFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uLnNlbmRLZXlzKEtleUV2ZW50LktFWUNPREVfRFBBRF9DRU5URVIpOwotICAgICAgICBtQWN0aXZpdHlJbnN0cnVtZW50YXRpb24uZ2V0SW5zdHJ1bWVudGF0aW9uKCkud2FpdEZvcklkbGVTeW5jKCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJHcm91cCBkaWQgbm90IGV4cGFuZCAiICsgZ3JvdXBJbmRleCwgCi0gICAgICAgICAgICAgICAgbUV4cGFuZGFibGVMaXN0Vmlldy5pc0dyb3VwRXhwYW5kZWQoZ3JvdXBJbmRleCkpOwotICAgIH0KLQotICAgIHZvaWQgdGVzdENvbnRleHRNZW51cygpIHsKLSAgICAgICAgLy8gQWRkIGEgcG9zaXRpb24gdGVzdGVyIENvbnRleHRNZW51IGxpc3RlbmVyIHRvIHRoZSBFeHBhbmRhYmxlTGlzdFZpZXcKLSAgICAgICAgUG9zaXRpb25UZXN0ZXJDb250ZXh0TWVudUxpc3RlbmVyIG1lbnVMaXN0ZW5lciA9IG5ldyBQb3NpdGlvblRlc3RlckNvbnRleHRNZW51TGlzdGVuZXIoKTsKLSAgICAgICAgbUV4cGFuZGFibGVMaXN0Vmlldy5zZXRPbkNyZWF0ZUNvbnRleHRNZW51TGlzdGVuZXIobWVudUxpc3RlbmVyKTsKLQotICAgICAgICBpbnQgaW5kZXggPSAwOwotCi0gICAgICAgIC8vIFNjcm9sbGluZyBvbiBoZWFkZXIgZWxlbWVudHMgc2hvdWxkIHRyaWdnZXIgYW4gQWRhcHRlckNvbnRleHRNZW51Ci0gICAgICAgIGZvciAoaW50IGk9MDsgaTxtRXhwYW5kYWJsZUxpc3RWaWV3LmdldEhlYWRlclZpZXdzQ291bnQoKTsgaSsrKSB7Ci0gICAgICAgICAgICAvLyBDaGVjayBncm91cCBpbmRleCBpbiBjb250ZXh0IG1lbnUKLSAgICAgICAgICAgIG1lbnVMaXN0ZW5lci5leHBlY3RBZGFwdGVyQ29udGV4dE1lbnUoaSk7Ci0gICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIGdyb3VwIGlzIHZpc2libGUgc28gdGhhdCBnZXRDaGlsZCBmaW5kcyBpdAotICAgICAgICAgICAgbUxpc3RVdGlsLmFycm93U2Nyb2xsVG9TZWxlY3RlZFBvc2l0aW9uKGluZGV4KTsKLSAgICAgICAgICAgIFZpZXcgaGVhZGVyQ2hpbGQgPSBtRXhwYW5kYWJsZUxpc3RWaWV3LmdldENoaWxkQXQoaW5kZXgKLSAgICAgICAgICAgICAgICAgICAgLSBtRXhwYW5kYWJsZUxpc3RWaWV3LmdldEZpcnN0VmlzaWJsZVBvc2l0aW9uKCkpOwotICAgICAgICAgICAgbUV4cGFuZGFibGVMaXN0Vmlldy5zaG93Q29udGV4dE1lbnVGb3JDaGlsZChoZWFkZXJDaGlsZCk7Ci0gICAgICAgICAgICBtSW5zdHJ1bWVudGF0aW9uLndhaXRGb3JJZGxlU3luYygpOwotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydE51bGwobWVudUxpc3RlbmVyLmdldEVycm9yTWVzc2FnZSgpLCBtZW51TGlzdGVuZXIuZ2V0RXJyb3JNZXNzYWdlKCkpOwotICAgICAgICAgICAgaW5kZXgrKzsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBncm91cENvdW50ID0gbUFkYXB0ZXIuZ2V0R3JvdXBDb3VudCgpOwotICAgICAgICBmb3IgKGludCBncm91cEluZGV4ID0gMDsgZ3JvdXBJbmRleCA8IGdyb3VwQ291bnQ7IGdyb3VwSW5kZXgrKykgewotCi0gICAgICAgICAgICAvLyBFeHBhbmQgZ3JvdXAKLSAgICAgICAgICAgIGV4cGFuZEdyb3VwKGdyb3VwSW5kZXgsIGluZGV4KTsKLQotICAgICAgICAgICAgLy8gQ2hlY2sgZ3JvdXAgaW5kZXggaW4gY29udGV4dCBtZW51Ci0gICAgICAgICAgICBtZW51TGlzdGVuZXIuZXhwZWN0R3JvdXBDb250ZXh0TWVudShncm91cEluZGV4KTsKLSAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgZ3JvdXAgaXMgdmlzaWJsZSBzbyB0aGF0IGdldENoaWxkIGZpbmRzIGl0Ci0gICAgICAgICAgICBtTGlzdFV0aWwuYXJyb3dTY3JvbGxUb1NlbGVjdGVkUG9zaXRpb24oaW5kZXgpOwotICAgICAgICAgICAgVmlldyBncm91cENoaWxkID0gbUV4cGFuZGFibGVMaXN0Vmlldy5nZXRDaGlsZEF0KGluZGV4Ci0gICAgICAgICAgICAgICAgICAgIC0gbUV4cGFuZGFibGVMaXN0Vmlldy5nZXRGaXJzdFZpc2libGVQb3NpdGlvbigpKTsKLSAgICAgICAgICAgIG1FeHBhbmRhYmxlTGlzdFZpZXcuc2hvd0NvbnRleHRNZW51Rm9yQ2hpbGQoZ3JvdXBDaGlsZCk7Ci0gICAgICAgICAgICBtSW5zdHJ1bWVudGF0aW9uLndhaXRGb3JJZGxlU3luYygpOwotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydE51bGwobWVudUxpc3RlbmVyLmdldEVycm9yTWVzc2FnZSgpLCBtZW51TGlzdGVuZXIuZ2V0RXJyb3JNZXNzYWdlKCkpOwotICAgICAgICAgICAgaW5kZXgrKzsKLQotICAgICAgICAgICAgZmluYWwgaW50IGNoaWxkcmVuQ291bnQgPSBtQWRhcHRlci5nZXRDaGlsZHJlbkNvdW50KGdyb3VwSW5kZXgpOwotICAgICAgICAgICAgZm9yIChpbnQgY2hpbGRJbmRleCA9IDA7IGNoaWxkSW5kZXggPCBjaGlsZHJlbkNvdW50OyBjaGlsZEluZGV4KyspIHsKLSAgICAgICAgICAgICAgICAvLyBDaGVjayBjaGlsZCBpbmRleCBpbiBjb250ZXh0IG1lbnUKLSAgICAgICAgICAgICAgICBtTGlzdFV0aWwuYXJyb3dTY3JvbGxUb1NlbGVjdGVkUG9zaXRpb24oaW5kZXgpOwotICAgICAgICAgICAgICAgIG1lbnVMaXN0ZW5lci5leHBlY3RDaGlsZENvbnRleHRNZW51KGdyb3VwSW5kZXgsIGNoaWxkSW5kZXgpOwotICAgICAgICAgICAgICAgIFZpZXcgY2hpbGQgPSBtRXhwYW5kYWJsZUxpc3RWaWV3LmdldENoaWxkQXQoaW5kZXgKLSAgICAgICAgICAgICAgICAgICAgICAgIC0gbUV4cGFuZGFibGVMaXN0Vmlldy5nZXRGaXJzdFZpc2libGVQb3NpdGlvbigpKTsKLSAgICAgICAgICAgICAgICBtRXhwYW5kYWJsZUxpc3RWaWV3LnNob3dDb250ZXh0TWVudUZvckNoaWxkKGNoaWxkKTsKLSAgICAgICAgICAgICAgICBtSW5zdHJ1bWVudGF0aW9uLndhaXRGb3JJZGxlU3luYygpOwotICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnROdWxsKG1lbnVMaXN0ZW5lci5nZXRFcnJvck1lc3NhZ2UoKSwgbWVudUxpc3RlbmVyLmdldEVycm9yTWVzc2FnZSgpKTsKLSAgICAgICAgICAgICAgICBpbmRleCsrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gU2Nyb2xsaW5nIG9uIGZvb3RlciBlbGVtZW50cyBzaG91bGQgdHJpZ2dlciBhbiBBZGFwdGVyQ29udGV4dE1lbnUKLSAgICAgICAgZm9yIChpbnQgaT0wOyBpPG1FeHBhbmRhYmxlTGlzdFZpZXcuZ2V0Rm9vdGVyVmlld3NDb3VudCgpOyBpKyspIHsKLSAgICAgICAgICAgIC8vIENoZWNrIGdyb3VwIGluZGV4IGluIGNvbnRleHQgbWVudQotICAgICAgICAgICAgbWVudUxpc3RlbmVyLmV4cGVjdEFkYXB0ZXJDb250ZXh0TWVudShpbmRleCk7Ci0gICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIGdyb3VwIGlzIHZpc2libGUgc28gdGhhdCBnZXRDaGlsZCBmaW5kcyBpdAotICAgICAgICAgICAgbUxpc3RVdGlsLmFycm93U2Nyb2xsVG9TZWxlY3RlZFBvc2l0aW9uKGluZGV4KTsKLSAgICAgICAgICAgIFZpZXcgZm9vdGVyQ2hpbGQgPSBtRXhwYW5kYWJsZUxpc3RWaWV3LmdldENoaWxkQXQoaW5kZXgKLSAgICAgICAgICAgICAgICAgICAgLSBtRXhwYW5kYWJsZUxpc3RWaWV3LmdldEZpcnN0VmlzaWJsZVBvc2l0aW9uKCkpOwotICAgICAgICAgICAgbUV4cGFuZGFibGVMaXN0Vmlldy5zaG93Q29udGV4dE1lbnVGb3JDaGlsZChmb290ZXJDaGlsZCk7Ci0gICAgICAgICAgICBtSW5zdHJ1bWVudGF0aW9uLndhaXRGb3JJZGxlU3luYygpOwotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydE51bGwobWVudUxpc3RlbmVyLmdldEVycm9yTWVzc2FnZSgpLCBtZW51TGlzdGVuZXIuZ2V0RXJyb3JNZXNzYWdlKCkpOwotICAgICAgICAgICAgaW5kZXgrKzsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIENsZWFudXA6IHJlbW92ZSB0aGUgbGlzdGVuZXIgd2UgYWRkZWQuCi0gICAgICAgIG1FeHBhbmRhYmxlTGlzdFZpZXcuc2V0T25DcmVhdGVDb250ZXh0TWVudUxpc3RlbmVyKG51bGwpOwotICAgIH0KLQotICAgIHByaXZhdGUgaW50IGV4cGFuZEFHcm91cCgpIHsKLSAgICAgICAgZmluYWwgaW50IGdyb3VwSW5kZXggPSAyOwotICAgICAgICBmaW5hbCBpbnQgaGVhZGVyQ291bnQgPSBtRXhwYW5kYWJsZUxpc3RWaWV3LmdldEhlYWRlclZpZXdzQ291bnQoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIk5vdCBlbm91Z2ggZ3JvdXBzIiwgZ3JvdXBJbmRleCA8IG1BZGFwdGVyLmdldEdyb3VwQ291bnQoKSk7Ci0gICAgICAgIGV4cGFuZEdyb3VwKGdyb3VwSW5kZXgsIGdyb3VwSW5kZXggKyBoZWFkZXJDb3VudCk7Ci0gICAgICAgIHJldHVybiBncm91cEluZGV4OwotICAgIH0KLQotICAgIC8vIFRoaXMgbWV0aG9kIGFzc3VtZXMgdGhhdCBOTyBncm91cCBpcyBleHBhbmRlZCB3aGVuIGNhbGxlZAotICAgIHZvaWQgdGVzdENvbnZlcnRpb25CZXR3ZWVuRmxhdEFuZFBhY2tlZE9uR3JvdXBzKCkgewotICAgICAgICBmaW5hbCBpbnQgaGVhZGVyQ291bnQgPSBtRXhwYW5kYWJsZUxpc3RWaWV3LmdldEhlYWRlclZpZXdzQ291bnQoKTsKLQotICAgICAgICBmb3IgKGludCBpPTA7IGk8aGVhZGVyQ291bnQ7IGkrKykgewotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiTm9uIE5VTEwgcG9zaXRpb24gZm9yIGhlYWRlciBpdGVtIiwKLSAgICAgICAgICAgICAgICAgICAgRXhwYW5kYWJsZUxpc3RWaWV3LlBBQ0tFRF9QT1NJVElPTl9WQUxVRV9OVUxMLAotICAgICAgICAgICAgICAgICAgICBtRXhwYW5kYWJsZUxpc3RWaWV3LmdldEV4cGFuZGFibGVMaXN0UG9zaXRpb24oaSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVGVzdCBhbGwgKG5vbiBleHBhbmRlZCkgZ3JvdXBzCi0gICAgICAgIGZpbmFsIGludCBncm91cENvdW50ID0gbUFkYXB0ZXIuZ2V0R3JvdXBDb3VudCgpOwotICAgICAgICBmb3IgKGludCBncm91cEluZGV4ID0gMDsgZ3JvdXBJbmRleCA8IGdyb3VwQ291bnQ7IGdyb3VwSW5kZXgrKykgewotICAgICAgICAgICAgaW50IGV4cGVjdGVkRmxhdFBvc2l0aW9uID0gaGVhZGVyQ291bnQgKyBncm91cEluZGV4OwotICAgICAgICAgICAgbG9uZyBwYWNrZWRQb3NpdGlvbkZvckdyb3VwID0gRXhwYW5kYWJsZUxpc3RWaWV3LmdldFBhY2tlZFBvc2l0aW9uRm9yR3JvdXAoZ3JvdXBJbmRleCk7Ci0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJHcm91cCBub3QgZm91bmQgYXQgZmxhdCBwb3NpdGlvbiAiICsgZXhwZWN0ZWRGbGF0UG9zaXRpb24sCi0gICAgICAgICAgICAgICAgICAgIHBhY2tlZFBvc2l0aW9uRm9yR3JvdXAsCi0gICAgICAgICAgICAgICAgICAgIG1FeHBhbmRhYmxlTGlzdFZpZXcuZ2V0RXhwYW5kYWJsZUxpc3RQb3NpdGlvbihleHBlY3RlZEZsYXRQb3NpdGlvbikpOwotCi0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJXcm9uZyBmbGF0IHBvc2l0aW9uIGZvciBncm91cCAiICsgZ3JvdXBJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRGbGF0UG9zaXRpb24sCi0gICAgICAgICAgICAgICAgICAgIG1FeHBhbmRhYmxlTGlzdFZpZXcuZ2V0RmxhdExpc3RQb3NpdGlvbihwYWNrZWRQb3NpdGlvbkZvckdyb3VwKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKGludCBpPTA7IGk8bUV4cGFuZGFibGVMaXN0Vmlldy5nZXRGb290ZXJWaWV3c0NvdW50KCk7IGkrKykgewotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiTm9uIE5VTEwgcG9zaXRpb24gZm9yIGhlYWRlciBpdGVtIiwKLSAgICAgICAgICAgICAgICAgICAgRXhwYW5kYWJsZUxpc3RWaWV3LlBBQ0tFRF9QT1NJVElPTl9WQUxVRV9OVUxMLAotICAgICAgICAgICAgICAgICAgICBtRXhwYW5kYWJsZUxpc3RWaWV3LmdldEV4cGFuZGFibGVMaXN0UG9zaXRpb24oaGVhZGVyQ291bnQgKyBncm91cENvdW50ICsgaSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gVGhpcyBtZXRob2QgYXNzdW1lcyB0aGF0IE5PIGdyb3VwIGlzIGV4cGFuZGVkIHdoZW4gY2FsbGVkCi0gICAgdm9pZCB0ZXN0Q29udmVydGlvbkJldHdlZW5GbGF0QW5kUGFja2VkT25DaGlsZHJlbigpIHsKLSAgICAgICAgLy8gVGVzdCB3aXRoIGFuIGV4cGFuZGVkIGdyb3VwCi0gICAgICAgIGZpbmFsIGludCBoZWFkZXJDb3VudCA9IG1FeHBhbmRhYmxlTGlzdFZpZXcuZ2V0SGVhZGVyVmlld3NDb3VudCgpOwotICAgICAgICBmaW5hbCBpbnQgZ3JvdXBJbmRleCA9IGV4cGFuZEFHcm91cCgpOwotCi0gICAgICAgIGZpbmFsIGludCBjaGlsZHJlbkNvdW50ID0gbUFkYXB0ZXIuZ2V0Q2hpbGRyZW5Db3VudChncm91cEluZGV4KTsKLSAgICAgICAgZm9yIChpbnQgY2hpbGRJbmRleCA9IDA7IGNoaWxkSW5kZXggPCBjaGlsZHJlbkNvdW50OyBjaGlsZEluZGV4KyspIHsKLSAgICAgICAgICAgIGludCBleHBlY3RlZEZsYXRQb3NpdGlvbiA9IGhlYWRlckNvdW50ICsgZ3JvdXBJbmRleCArIDEgKyBjaGlsZEluZGV4OwotICAgICAgICAgICAgbG9uZyBjaGlsZFBvcyA9IEV4cGFuZGFibGVMaXN0Vmlldy5nZXRQYWNrZWRQb3NpdGlvbkZvckNoaWxkKGdyb3VwSW5kZXgsIGNoaWxkSW5kZXgpOwotCi0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJXcm9uZyBmbGF0IHBvc2l0aW9uIGZvciBjaGlsZCAiLAotICAgICAgICAgICAgICAgICAgICBjaGlsZFBvcywKLSAgICAgICAgICAgICAgICAgICAgbUV4cGFuZGFibGVMaXN0Vmlldy5nZXRFeHBhbmRhYmxlTGlzdFBvc2l0aW9uKGV4cGVjdGVkRmxhdFBvc2l0aW9uKSk7Ci0KLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIldyb25nIGZsYXQgcG9zaXRpb24gZm9yIGNoaWxkICIsCi0gICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkRmxhdFBvc2l0aW9uLAotICAgICAgICAgICAgICAgICAgICBtRXhwYW5kYWJsZUxpc3RWaWV3LmdldEZsYXRMaXN0UG9zaXRpb24oY2hpbGRQb3MpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIFRoaXMgbWV0aG9kIGFzc3VtZXMgdGhhdCBOTyBncm91cCBpcyBleHBhbmRlZCB3aGVuIGNhbGxlZAotICAgIHZvaWQgdGVzdFNlbGVjdGVkUG9zaXRpb25Pbkdyb3VwcygpIHsKLSAgICAgICAgaW50IGluZGV4ID0gMDsKLQotICAgICAgICAvLyBTY3JvbGxpbmcgb24gaGVhZGVyIGVsZW1lbnRzIHNob3VsZCBub3QgZ2l2ZSBhIHZhbGlkIHNlbGVjdGVkIHBvc2l0aW9uLgotICAgICAgICBmb3IgKGludCBpPTA7IGk8bUV4cGFuZGFibGVMaXN0Vmlldy5nZXRIZWFkZXJWaWV3c0NvdW50KCk7IGkrKykgewotICAgICAgICAgICAgbUxpc3RVdGlsLmFycm93U2Nyb2xsVG9TZWxlY3RlZFBvc2l0aW9uKGluZGV4KTsKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIkhlYWRlciBpdGVtIGlzIHNlbGVjdGVkIiwKLSAgICAgICAgICAgICAgICAgICAgRXhwYW5kYWJsZUxpc3RWaWV3LlBBQ0tFRF9QT1NJVElPTl9WQUxVRV9OVUxMLAotICAgICAgICAgICAgICAgICAgICBtRXhwYW5kYWJsZUxpc3RWaWV3LmdldFNlbGVjdGVkUG9zaXRpb24oKSk7Ci0gICAgICAgICAgICBpbmRleCsrOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQ2hlY2sgc2VsZWN0aW9uIG9uIGdyb3VwIGl0ZW1zCi0gICAgICAgIGZpbmFsIGludCBncm91cENvdW50ID0gbUFkYXB0ZXIuZ2V0R3JvdXBDb3VudCgpOwotICAgICAgICBmb3IgKGludCBncm91cEluZGV4ID0gMDsgZ3JvdXBJbmRleCA8IGdyb3VwQ291bnQ7IGdyb3VwSW5kZXgrKykgewotICAgICAgICAgICAgbUxpc3RVdGlsLmFycm93U2Nyb2xsVG9TZWxlY3RlZFBvc2l0aW9uKGluZGV4KTsKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIkdyb3VwIGl0ZW0gaXMgbm90IHNlbGVjdGVkIiwKLSAgICAgICAgICAgICAgICAgICAgRXhwYW5kYWJsZUxpc3RWaWV3LmdldFBhY2tlZFBvc2l0aW9uRm9yR3JvdXAoZ3JvdXBJbmRleCksCi0gICAgICAgICAgICAgICAgICAgIG1FeHBhbmRhYmxlTGlzdFZpZXcuZ2V0U2VsZWN0ZWRQb3NpdGlvbigpKTsKLSAgICAgICAgICAgIGluZGV4Kys7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBTY3JvbGxpbmcgb24gZm9vdGVyIGVsZW1lbnRzIHNob3VsZCBub3QgZ2l2ZSBhIHZhbGlkIHNlbGVjdGVkIHBvc2l0aW9uLgotICAgICAgICBmb3IgKGludCBpPTA7IGk8bUV4cGFuZGFibGVMaXN0Vmlldy5nZXRGb290ZXJWaWV3c0NvdW50KCk7IGkrKykgewotICAgICAgICAgICAgbUxpc3RVdGlsLmFycm93U2Nyb2xsVG9TZWxlY3RlZFBvc2l0aW9uKGluZGV4KTsKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIkZvb3RlciBpdGVtIGlzIHNlbGVjdGVkIiwKLSAgICAgICAgICAgICAgICAgICAgRXhwYW5kYWJsZUxpc3RWaWV3LlBBQ0tFRF9QT1NJVElPTl9WQUxVRV9OVUxMLAotICAgICAgICAgICAgICAgICAgICBtRXhwYW5kYWJsZUxpc3RWaWV3LmdldFNlbGVjdGVkUG9zaXRpb24oKSk7Ci0gICAgICAgICAgICBpbmRleCsrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gVGhpcyBtZXRob2QgYXNzdW1lcyB0aGF0IE5PIGdyb3VwIGlzIGV4cGFuZGVkIHdoZW4gY2FsbGVkCi0gICAgdm9pZCB0ZXN0U2VsZWN0ZWRQb3NpdGlvbk9uQ2hpbGRyZW4oKSB7Ci0gICAgICAgIC8vIFRlc3Qgd2l0aCBhbiBleHBhbmRlZCBncm91cAotICAgICAgICBmaW5hbCBpbnQgaGVhZGVyQ291bnQgPSBtRXhwYW5kYWJsZUxpc3RWaWV3LmdldEhlYWRlclZpZXdzQ291bnQoKTsKLSAgICAgICAgZmluYWwgaW50IGdyb3VwSW5kZXggPSBleHBhbmRBR3JvdXAoKTsKLQotICAgICAgICBmaW5hbCBpbnQgY2hpbGRyZW5Db3VudCA9IG1BZGFwdGVyLmdldENoaWxkcmVuQ291bnQoZ3JvdXBJbmRleCk7Ci0gICAgICAgIGZvciAoaW50IGNoaWxkSW5kZXggPSAwOyBjaGlsZEluZGV4IDwgY2hpbGRyZW5Db3VudDsgY2hpbGRJbmRleCsrKSB7Ci0gICAgICAgICAgICBpbnQgY2hpbGRGbGF0UG9zaXRpb24gPSBoZWFkZXJDb3VudCArIGdyb3VwSW5kZXggKyAxICsgY2hpbGRJbmRleDsKLSAgICAgICAgICAgIG1MaXN0VXRpbC5hcnJvd1Njcm9sbFRvU2VsZWN0ZWRQb3NpdGlvbihjaGlsZEZsYXRQb3NpdGlvbik7Ci0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJHcm91cCBpdGVtIGlzIG5vdCBzZWxlY3RlZCIsCi0gICAgICAgICAgICAgICAgICAgIEV4cGFuZGFibGVMaXN0Vmlldy5nZXRQYWNrZWRQb3NpdGlvbkZvckNoaWxkKGdyb3VwSW5kZXgsIGNoaWxkSW5kZXgpLAotICAgICAgICAgICAgICAgICAgICBtRXhwYW5kYWJsZUxpc3RWaWV3LmdldFNlbGVjdGVkUG9zaXRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC93aWRnZXQvZXhwYW5kYWJsZWxpc3R2aWV3L0V4cGFuZGFibGVMaXN0V2l0aEhlYWRlcnMuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3dpZGdldC9leHBhbmRhYmxlbGlzdHZpZXcvRXhwYW5kYWJsZUxpc3RXaXRoSGVhZGVycy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjUxYzFkLi4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3dpZGdldC9leHBhbmRhYmxlbGlzdHZpZXcvRXhwYW5kYWJsZUxpc3RXaXRoSGVhZGVycy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC53aWRnZXQuZXhwYW5kYWJsZWxpc3R2aWV3OwotCi1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkV4cGFuZGFibGVMaXN0U2NlbmFyaW87Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuQnV0dG9uOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkV4cGFuZGFibGVMaXN0VmlldzsKLQotcHVibGljIGNsYXNzIEV4cGFuZGFibGVMaXN0V2l0aEhlYWRlcnMgZXh0ZW5kcyBFeHBhbmRhYmxlTGlzdFNjZW5hcmlvIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXSBzTnVtQ2hpbGRyZW4gPSB7MSwgNCwgMywgMiwgNn07Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IHNOdW1PZkhlYWRlcnNBbmRGb290ZXJzID0gMTI7Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdChFeHBhbmRhYmxlUGFyYW1zIHBhcmFtcykgewotICAgICAgICBwYXJhbXMuc2V0U3RhY2tGcm9tQm90dG9tKGZhbHNlKQotICAgICAgICAgICAgICAgIC5zZXRTdGFydGluZ1NlbGVjdGlvblBvc2l0aW9uKC0xKQotICAgICAgICAgICAgICAgIC5zZXROdW1DaGlsZHJlbihzTnVtQ2hpbGRyZW4pCi0gICAgICAgICAgICAgICAgLnNldEl0ZW1TY3JlZW5TaXplRmFjdG9yKDAuMTQpCi0gICAgICAgICAgICAgICAgLnNldENvbm5lY3RBZGFwdGVyKGZhbHNlKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgaWNpY2xlKSB7Ci0gICAgICAgIHN1cGVyLm9uQ3JlYXRlKGljaWNsZSk7Ci0KLSAgICAgICAgZmluYWwgRXhwYW5kYWJsZUxpc3RWaWV3IGV4cGFuZGFibGVMaXN0VmlldyA9IGdldEV4cGFuZGFibGVMaXN0VmlldygpOwotICAgICAgICBleHBhbmRhYmxlTGlzdFZpZXcuc2V0SXRlbXNDYW5Gb2N1cyh0cnVlKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNOdW1PZkhlYWRlcnNBbmRGb290ZXJzOyBpKyspIHsKLSAgICAgICAgICAgIEJ1dHRvbiBoZWFkZXIgPSBuZXcgQnV0dG9uKHRoaXMpOwotICAgICAgICAgICAgaGVhZGVyLnNldFRleHQoIkhlYWRlciBWaWV3ICIgKyBpKTsKLSAgICAgICAgICAgIGV4cGFuZGFibGVMaXN0Vmlldy5hZGRIZWFkZXJWaWV3KGhlYWRlcik7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNOdW1PZkhlYWRlcnNBbmRGb290ZXJzOyBpKyspIHsKLSAgICAgICAgICAgIEJ1dHRvbiBmb290ZXIgPSBuZXcgQnV0dG9uKHRoaXMpOwotICAgICAgICAgICAgZm9vdGVyLnNldFRleHQoIkZvb3RlciBWaWV3ICIgKyBpKTsKLSAgICAgICAgICAgIGV4cGFuZGFibGVMaXN0Vmlldy5hZGRGb290ZXJWaWV3KGZvb3Rlcik7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIFNldCBhZGFwdGVyIGhlcmUgQUZURVIgd2Ugc2V0IGhlYWRlciBhbmQgZm9vdGVyIHZpZXdzCi0gICAgICAgIHNldEFkYXB0ZXIoZXhwYW5kYWJsZUxpc3RWaWV3KTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHJldHVybiBUaGUgbnVtYmVyIG9mIGhlYWRlcnMgKGFuZCB0aGUgc2FtZSBudW1iZXIgb2YgZm9vdGVycykKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldE51bU9mSGVhZGVyc0FuZEZvb3RlcnMoKSB7Ci0gICAgICAgIHJldHVybiBzTnVtT2ZIZWFkZXJzQW5kRm9vdGVyczsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3dpZGdldC9leHBhbmRhYmxlbGlzdHZpZXcvRXhwYW5kYWJsZUxpc3RXaXRoSGVhZGVyc1Rlc3QuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3dpZGdldC9leHBhbmRhYmxlbGlzdHZpZXcvRXhwYW5kYWJsZUxpc3RXaXRoSGVhZGVyc1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc0Yzg1My4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC93aWRnZXQvZXhwYW5kYWJsZWxpc3R2aWV3L0V4cGFuZGFibGVMaXN0V2l0aEhlYWRlcnNUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLndpZGdldC5leHBhbmRhYmxlbGlzdHZpZXc7Ci0KLWltcG9ydCBhbmRyb2lkLnRlc3QuQWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTI7Ci1pbXBvcnQgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5hbm5vdGF0aW9uLkxhcmdlVGVzdDsKLWltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uTWVkaXVtVGVzdDsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTGlzdFV0aWw7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkV4cGFuZGFibGVMaXN0VmlldzsKLQotcHVibGljIGNsYXNzIEV4cGFuZGFibGVMaXN0V2l0aEhlYWRlcnNUZXN0IGV4dGVuZHMKLSAgICAgICAgQWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTI8RXhwYW5kYWJsZUxpc3RXaXRoSGVhZGVycz4gewotICAgIHByaXZhdGUgRXhwYW5kYWJsZUxpc3RWaWV3IG1FeHBhbmRhYmxlTGlzdFZpZXc7Ci0gICAgcHJpdmF0ZSBMaXN0VXRpbCBtTGlzdFV0aWw7Ci0gICAgCi0gICAgcHVibGljIEV4cGFuZGFibGVMaXN0V2l0aEhlYWRlcnNUZXN0KCkgewotICAgICAgICBzdXBlcihFeHBhbmRhYmxlTGlzdFdpdGhIZWFkZXJzLmNsYXNzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5zZXRVcCgpOwotICAgICAgICAKLSAgICAgICAgbUV4cGFuZGFibGVMaXN0VmlldyA9IGdldEFjdGl2aXR5KCkuZ2V0RXhwYW5kYWJsZUxpc3RWaWV3KCk7Ci0gICAgICAgIG1MaXN0VXRpbCA9IG5ldyBMaXN0VXRpbChtRXhwYW5kYWJsZUxpc3RWaWV3LCBnZXRJbnN0cnVtZW50YXRpb24oKSk7Ci0gICAgfQotICAgIAotICAgIEBNZWRpdW1UZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFByZWNvbmRpdGlvbnMoKSB7Ci0gICAgICAgIGFzc2VydE5vdE51bGwobUV4cGFuZGFibGVMaXN0Vmlldyk7Ci0gICAgfQotICAgIAotICAgIEBNZWRpdW1UZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEV4cGFuZE9uRmlyc3RQb3NpdGlvbigpIHsKLSAgICAgICAgLy8gU2hvdWxkIGJlIGEgaGVhZGVyLCBhbmQgaGVuY2UgdGhlIGZpcnN0IGdyb3VwIHNob3VsZCBOT1QgaGF2ZSBleHBhbmRlZAotICAgICAgICBtTGlzdFV0aWwuYXJyb3dTY3JvbGxUb1NlbGVjdGVkUG9zaXRpb24oMCk7Ci0gICAgICAgIHNlbmRLZXlzKEtleUV2ZW50LktFWUNPREVfRFBBRF9DRU5URVIpOwotICAgICAgICBnZXRJbnN0cnVtZW50YXRpb24oKS53YWl0Rm9ySWRsZVN5bmMoKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UobUV4cGFuZGFibGVMaXN0Vmlldy5pc0dyb3VwRXhwYW5kZWQoMCkpOwotICAgIH0KLQotICAgIEBMYXJnZVRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RXhwYW5kT25GaXJzdEdyb3VwKCkgewotICAgICAgICBtTGlzdFV0aWwuYXJyb3dTY3JvbGxUb1NlbGVjdGVkUG9zaXRpb24oZ2V0QWN0aXZpdHkoKS5nZXROdW1PZkhlYWRlcnNBbmRGb290ZXJzKCkpOwotICAgICAgICBzZW5kS2V5cyhLZXlFdmVudC5LRVlDT0RFX0RQQURfQ0VOVEVSKTsKLSAgICAgICAgZ2V0SW5zdHJ1bWVudGF0aW9uKCkud2FpdEZvcklkbGVTeW5jKCk7Ci0gICAgICAgIGFzc2VydFRydWUobUV4cGFuZGFibGVMaXN0Vmlldy5pc0dyb3VwRXhwYW5kZWQoMCkpOwotICAgIH0KLQotICAgIEBMYXJnZVRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29udGV4dE1lbnVzKCkgewotICAgICAgICBFeHBhbmRhYmxlTGlzdFRlc3RlciB0ZXN0ZXIgPSBuZXcgRXhwYW5kYWJsZUxpc3RUZXN0ZXIobUV4cGFuZGFibGVMaXN0VmlldywgdGhpcyk7Ci0gICAgICAgIHRlc3Rlci50ZXN0Q29udGV4dE1lbnVzKCk7Ci0gICAgfQotCi0gICAgQExhcmdlVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RDb252ZXJ0aW9uQmV0d2VlbkZsYXRBbmRQYWNrZWQoKSB7Ci0gICAgICAgIEV4cGFuZGFibGVMaXN0VGVzdGVyIHRlc3RlciA9IG5ldyBFeHBhbmRhYmxlTGlzdFRlc3RlcihtRXhwYW5kYWJsZUxpc3RWaWV3LCB0aGlzKTsKLSAgICAgICAgdGVzdGVyLnRlc3RDb252ZXJ0aW9uQmV0d2VlbkZsYXRBbmRQYWNrZWRPbkdyb3VwcygpOwotICAgICAgICB0ZXN0ZXIudGVzdENvbnZlcnRpb25CZXR3ZWVuRmxhdEFuZFBhY2tlZE9uQ2hpbGRyZW4oKTsKLSAgICB9Ci0KLSAgICBATGFyZ2VUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFNlbGVjdGVkUG9zaXRpb24oKSB7Ci0gICAgICAgIEV4cGFuZGFibGVMaXN0VGVzdGVyIHRlc3RlciA9IG5ldyBFeHBhbmRhYmxlTGlzdFRlc3RlcihtRXhwYW5kYWJsZUxpc3RWaWV3LCB0aGlzKTsKLSAgICAgICAgdGVzdGVyLnRlc3RTZWxlY3RlZFBvc2l0aW9uT25Hcm91cHMoKTsKLSAgICAgICAgdGVzdGVyLnRlc3RTZWxlY3RlZFBvc2l0aW9uT25DaGlsZHJlbigpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3dpZGdldC9leHBhbmRhYmxlbGlzdHZpZXcvSW5mbGF0ZWRFeHBhbmRhYmxlTGlzdFZpZXcuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3dpZGdldC9leHBhbmRhYmxlbGlzdHZpZXcvSW5mbGF0ZWRFeHBhbmRhYmxlTGlzdFZpZXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjRjOWQ1Ni4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC93aWRnZXQvZXhwYW5kYWJsZWxpc3R2aWV3L0luZmxhdGVkRXhwYW5kYWJsZUxpc3RWaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC53aWRnZXQuZXhwYW5kYWJsZWxpc3R2aWV3OwotCi1pbXBvcnQgY29tLmFuZHJvaWQuZnJhbWV3b3Jrcy5jb3JldGVzdHMuUjsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQudmlldy5HcmF2aXR5OwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuQWJzTGlzdFZpZXc7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuQmFzZUV4cGFuZGFibGVMaXN0QWRhcHRlcjsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5FeHBhbmRhYmxlTGlzdFZpZXc7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7Ci0KLXB1YmxpYyBjbGFzcyBJbmZsYXRlZEV4cGFuZGFibGVMaXN0VmlldyBleHRlbmRzIEFjdGl2aXR5IHsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKLSAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKLSAgICAgICAgCi0gICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0LmluZmxhdGVkX2V4cGFuZGFibGVsaXN0dmlldyk7Ci0gICAgICAgIAotICAgICAgICBFeHBhbmRhYmxlTGlzdFZpZXcgZWx2ID0gKEV4cGFuZGFibGVMaXN0VmlldykgZmluZFZpZXdCeUlkKFIuaWQuZWx2KTsKLSAgICAgICAgZWx2LnNldEFkYXB0ZXIobmV3IE15RXhwYW5kYWJsZUxpc3RBZGFwdGVyKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBjbGFzcyBNeUV4cGFuZGFibGVMaXN0QWRhcHRlciBleHRlbmRzIEJhc2VFeHBhbmRhYmxlTGlzdEFkYXB0ZXIgewotICAgICAgICAvLyBTYW1wbGUgZGF0YSBzZXQuICBjaGlsZHJlbltpXSBjb250YWlucyB0aGUgY2hpbGRyZW4gKFN0cmluZ1tdKSBmb3IgZ3JvdXBzW2ldLgotICAgICAgICBwcml2YXRlIFN0cmluZ1tdIGdyb3VwcyA9IHsgIlBlb3BsZSBOYW1lcyIsICJEb2cgTmFtZXMiLCAiQ2F0IE5hbWVzIiwgIkZpc2ggTmFtZXMiIH07Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nW11bXSBjaGlsZHJlbiA9IHsKLSAgICAgICAgICAgICAgICB7ICJBcm5vbGQiLCAiQmFycnkiLCAiQ2h1Y2siLCAiRGF2aWQiIH0sCi0gICAgICAgICAgICAgICAgeyAiQWNlIiwgIkJhbmRpdCIsICJDaGEtQ2hhIiwgIkRldWNlIiB9LAotICAgICAgICAgICAgICAgIHsgIkZsdWZmeSIsICJTbnVnZ2xlcyIgfSwKLSAgICAgICAgICAgICAgICB7ICJHb2xkeSIsICJCdWJibGVzIiB9Ci0gICAgICAgIH07Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgT2JqZWN0IGdldENoaWxkKGludCBncm91cFBvc2l0aW9uLCBpbnQgY2hpbGRQb3NpdGlvbikgewotICAgICAgICAgICAgcmV0dXJuIGNoaWxkcmVuW2dyb3VwUG9zaXRpb25dW2NoaWxkUG9zaXRpb25dOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGxvbmcgZ2V0Q2hpbGRJZChpbnQgZ3JvdXBQb3NpdGlvbiwgaW50IGNoaWxkUG9zaXRpb24pIHsKLSAgICAgICAgICAgIHJldHVybiBjaGlsZFBvc2l0aW9uOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGludCBnZXRDaGlsZHJlbkNvdW50KGludCBncm91cFBvc2l0aW9uKSB7Ci0gICAgICAgICAgICByZXR1cm4gY2hpbGRyZW5bZ3JvdXBQb3NpdGlvbl0ubGVuZ3RoOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFRleHRWaWV3IGdldEdlbmVyaWNWaWV3KCkgewotICAgICAgICAgICAgLy8gTGF5b3V0IHBhcmFtZXRlcnMgZm9yIHRoZSBFeHBhbmRhYmxlTGlzdFZpZXcKLSAgICAgICAgICAgIEFic0xpc3RWaWV3LkxheW91dFBhcmFtcyBscCA9IG5ldyBBYnNMaXN0Vmlldy5MYXlvdXRQYXJhbXMoCi0gICAgICAgICAgICAgICAgICAgIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5ULCA2NCk7Ci0KLSAgICAgICAgICAgIFRleHRWaWV3IHRleHRWaWV3ID0gbmV3IFRleHRWaWV3KEluZmxhdGVkRXhwYW5kYWJsZUxpc3RWaWV3LnRoaXMpOwotICAgICAgICAgICAgdGV4dFZpZXcuc2V0TGF5b3V0UGFyYW1zKGxwKTsKLSAgICAgICAgICAgIC8vIENlbnRlciB0aGUgdGV4dCB2ZXJ0aWNhbGx5Ci0gICAgICAgICAgICB0ZXh0Vmlldy5zZXRHcmF2aXR5KEdyYXZpdHkuQ0VOVEVSX1ZFUlRJQ0FMIHwgR3Jhdml0eS5MRUZUKTsKLSAgICAgICAgICAgIC8vIFNldCB0aGUgdGV4dCBzdGFydGluZyBwb3NpdGlvbgotICAgICAgICAgICAgdGV4dFZpZXcuc2V0UGFkZGluZygzNiwgMCwgMCwgMCk7Ci0gICAgICAgICAgICByZXR1cm4gdGV4dFZpZXc7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBWaWV3IGdldENoaWxkVmlldyhpbnQgZ3JvdXBQb3NpdGlvbiwgaW50IGNoaWxkUG9zaXRpb24sIGJvb2xlYW4gaXNMYXN0Q2hpbGQsCi0gICAgICAgICAgICAgICAgVmlldyBjb252ZXJ0VmlldywgVmlld0dyb3VwIHBhcmVudCkgewotICAgICAgICAgICAgVGV4dFZpZXcgdGV4dFZpZXcgPSBnZXRHZW5lcmljVmlldygpOwotICAgICAgICAgICAgdGV4dFZpZXcuc2V0VGV4dChnZXRDaGlsZChncm91cFBvc2l0aW9uLCBjaGlsZFBvc2l0aW9uKS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIHJldHVybiB0ZXh0VmlldzsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0R3JvdXAoaW50IGdyb3VwUG9zaXRpb24pIHsKLSAgICAgICAgICAgIHJldHVybiBncm91cHNbZ3JvdXBQb3NpdGlvbl07Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgaW50IGdldEdyb3VwQ291bnQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gZ3JvdXBzLmxlbmd0aDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBsb25nIGdldEdyb3VwSWQoaW50IGdyb3VwUG9zaXRpb24pIHsKLSAgICAgICAgICAgIHJldHVybiBncm91cFBvc2l0aW9uOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFZpZXcgZ2V0R3JvdXBWaWV3KGludCBncm91cFBvc2l0aW9uLCBib29sZWFuIGlzRXhwYW5kZWQsIFZpZXcgY29udmVydFZpZXcsCi0gICAgICAgICAgICAgICAgVmlld0dyb3VwIHBhcmVudCkgewotICAgICAgICAgICAgVGV4dFZpZXcgdGV4dFZpZXcgPSBnZXRHZW5lcmljVmlldygpOwotICAgICAgICAgICAgdGV4dFZpZXcuc2V0VGV4dChnZXRHcm91cChncm91cFBvc2l0aW9uKS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIHJldHVybiB0ZXh0VmlldzsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzQ2hpbGRTZWxlY3RhYmxlKGludCBncm91cFBvc2l0aW9uLCBpbnQgY2hpbGRQb3NpdGlvbikgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNTdGFibGVJZHMoKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvd2lkZ2V0L2V4cGFuZGFibGVsaXN0dmlldy9Qb3NpdGlvblRlc3RlckNvbnRleHRNZW51TGlzdGVuZXIuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3dpZGdldC9leHBhbmRhYmxlbGlzdHZpZXcvUG9zaXRpb25UZXN0ZXJDb250ZXh0TWVudUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkYmRmZjguLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvd2lkZ2V0L2V4cGFuZGFibGVsaXN0dmlldy9Qb3NpdGlvblRlc3RlckNvbnRleHRNZW51TGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLndpZGdldC5leHBhbmRhYmxlbGlzdHZpZXc7Ci0KLWltcG9ydCBhbmRyb2lkLnZpZXcuQ29udGV4dE1lbnU7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LkNvbnRleHRNZW51LkNvbnRleHRNZW51SW5mbzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldy5PbkNyZWF0ZUNvbnRleHRNZW51TGlzdGVuZXI7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuRXhwYW5kYWJsZUxpc3RWaWV3OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3LkFkYXB0ZXJDb250ZXh0TWVudUluZm87Ci0KLXB1YmxpYyBjbGFzcyBQb3NpdGlvblRlc3RlckNvbnRleHRNZW51TGlzdGVuZXIgaW1wbGVtZW50cyBPbkNyZWF0ZUNvbnRleHRNZW51TGlzdGVuZXIgewotCi0gICAgcHJpdmF0ZSBpbnQgZ3JvdXBQb3NpdGlvbiwgY2hpbGRQb3NpdGlvbjsKLQotICAgIC8vIEZha2UgY29uc3RhbnQgdG8gc3RvcmUgaW4gdGVzdFR5cGUgYSB0ZXN0IHR5cGUgc3BlY2lmaWMgdG8gaGVhZGVycyBhbmQgZm9vdGVycwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBREFQVEVSX1RZUEUgPSAtMTsKLSAgICBwcml2YXRlIGludCB0ZXN0VHlwZTsgLy8gYXMgcmV0dXJuZWQgYnkgZ2V0UGFja2VkUG9zaXRpb25UeXBlCi0KLSAgICAvLyBXaWxsIGJlIHNldCB0byBudWxsIGJ5IGVhY2ggY2FsbCB0byBvbkNyZWF0ZUNvbnRleHRNZW51LCB1bmxlc3MgYW4gZXJyb3Igb2NjdXJyZWQuIAotICAgIHByaXZhdGUgU3RyaW5nIGVycm9yTWVzc2FnZTsKLQotICAgIHB1YmxpYyB2b2lkIGV4cGVjdEdyb3VwQ29udGV4dE1lbnUoaW50IGdyb3VwUG9zaXRpb24pIHsKLSAgICAgICAgdGhpcy5ncm91cFBvc2l0aW9uID0gZ3JvdXBQb3NpdGlvbjsKLSAgICAgICAgdGVzdFR5cGUgPSBFeHBhbmRhYmxlTGlzdFZpZXcuUEFDS0VEX1BPU0lUSU9OX1RZUEVfR1JPVVA7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZXhwZWN0Q2hpbGRDb250ZXh0TWVudShpbnQgZ3JvdXBQb3NpdGlvbiwgaW50IGNoaWxkUG9zaXRpb24pIHsKLSAgICAgICAgdGhpcy5ncm91cFBvc2l0aW9uID0gZ3JvdXBQb3NpdGlvbjsKLSAgICAgICAgdGhpcy5jaGlsZFBvc2l0aW9uID0gY2hpbGRQb3NpdGlvbjsKLSAgICAgICAgdGVzdFR5cGUgPSBFeHBhbmRhYmxlTGlzdFZpZXcuUEFDS0VEX1BPU0lUSU9OX1RZUEVfQ0hJTEQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZXhwZWN0QWRhcHRlckNvbnRleHRNZW51KGludCBmbGF0UG9zaXRpb24pIHsKLSAgICAgICAgdGhpcy5ncm91cFBvc2l0aW9uID0gZmxhdFBvc2l0aW9uOwotICAgICAgICB0ZXN0VHlwZSA9IEFEQVBURVJfVFlQRTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZUNvbnRleHRNZW51KENvbnRleHRNZW51IG1lbnUsIFZpZXcgdiwgQ29udGV4dE1lbnVJbmZvIG1lbnVJbmZvKSB7Ci0gICAgICAgIGVycm9yTWVzc2FnZSA9IG51bGw7Ci0gICAgICAgIGlmICh0ZXN0VHlwZSA9PSBBREFQVEVSX1RZUEUpIHsKLSAgICAgICAgICAgIGlmICghaXNUcnVlKCJNZW51SW5mbyBpcyBub3QgYW4gQWRhcHRlckNvbnRleHRNZW51SW5mbyIsCi0gICAgICAgICAgICAgICAgICAgIG1lbnVJbmZvIGluc3RhbmNlb2YgQWRhcHRlckNvbnRleHRNZW51SW5mbykpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBBZGFwdGVyQ29udGV4dE1lbnVJbmZvIGFkYXB0ZXJDb250ZXh0TWVudUluZm8gPSAoQWRhcHRlckNvbnRleHRNZW51SW5mbykgbWVudUluZm87Ci0gICAgICAgICAgICBpZiAoIWFyZUVxdWFsKCJXcm9uZyBmbGF0IHBvc2l0aW9uIiwgZ3JvdXBQb3NpdGlvbiwgYWRhcHRlckNvbnRleHRNZW51SW5mby5wb3NpdGlvbikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoIWlzVHJ1ZSgiTWVudUluZm8gaXMgbm90IGFuIEV4cGFuZGFibGVMaXN0Q29udGV4dE1lbnVJbmZvIiwKLSAgICAgICAgICAgICAgICAgICAgbWVudUluZm8gaW5zdGFuY2VvZiBFeHBhbmRhYmxlTGlzdFZpZXcuRXhwYW5kYWJsZUxpc3RDb250ZXh0TWVudUluZm8pKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgRXhwYW5kYWJsZUxpc3RWaWV3LkV4cGFuZGFibGVMaXN0Q29udGV4dE1lbnVJbmZvIGVsdk1lbnVJbmZvID0KLSAgICAgICAgICAgICAgICAoRXhwYW5kYWJsZUxpc3RWaWV3LkV4cGFuZGFibGVMaXN0Q29udGV4dE1lbnVJbmZvKSBtZW51SW5mbzsKLSAgICAgICAgICAgIGxvbmcgcGFja2VkUG9zaXRpb24gPSBlbHZNZW51SW5mby5wYWNrZWRQb3NpdGlvbjsKLQotICAgICAgICAgICAgaW50IHBhY2tlZFBvc2l0aW9uVHlwZSA9IEV4cGFuZGFibGVMaXN0Vmlldy5nZXRQYWNrZWRQb3NpdGlvblR5cGUocGFja2VkUG9zaXRpb24pOwotICAgICAgICAgICAgaWYgKCFhcmVFcXVhbCgiV3JvbmcgcGFja2VkIHBvc2l0aW9uIHR5cGUiLCB0ZXN0VHlwZSwgcGFja2VkUG9zaXRpb25UeXBlKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaW50IHBhY2tlZFBvc2l0aW9uR3JvdXAgPSBFeHBhbmRhYmxlTGlzdFZpZXcuZ2V0UGFja2VkUG9zaXRpb25Hcm91cChwYWNrZWRQb3NpdGlvbik7Ci0gICAgICAgICAgICBpZiAoIWFyZUVxdWFsKCJXcm9uZyBncm91cCBwb3NpdGlvbiIsIGdyb3VwUG9zaXRpb24sIHBhY2tlZFBvc2l0aW9uR3JvdXApKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAodGVzdFR5cGUgPT0gRXhwYW5kYWJsZUxpc3RWaWV3LlBBQ0tFRF9QT1NJVElPTl9UWVBFX0NISUxEKSB7Ci0gICAgICAgICAgICAgICAgaW50IHBhY2tlZFBvc2l0aW9uQ2hpbGQgPSBFeHBhbmRhYmxlTGlzdFZpZXcuZ2V0UGFja2VkUG9zaXRpb25DaGlsZChwYWNrZWRQb3NpdGlvbik7Ci0gICAgICAgICAgICAgICAgaWYgKCFhcmVFcXVhbCgiV3JvbmcgY2hpbGQgcG9zaXRpb24iLCBjaGlsZFBvc2l0aW9uLCBwYWNrZWRQb3NpdGlvbkNoaWxkKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGFyZUVxdWFsKFN0cmluZyBtZXNzYWdlLCBpbnQgZXhwZWN0ZWQsIGludCBhY3R1YWwpIHsKLSAgICAgICAgaWYgKGV4cGVjdGVkICE9IGFjdHVhbCkgewotICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gU3RyaW5nLmZvcm1hdChtZXNzYWdlICsgIiAoJWQgdnMgJWQiLCBleHBlY3RlZCwgYWN0dWFsKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNUcnVlKFN0cmluZyBtZXNzYWdlLCBib29sZWFuIHZhbHVlKSB7Ci0gICAgICAgIGlmICghdmFsdWUpIHsKLSAgICAgICAgICAgIGVycm9yTWVzc2FnZSA9IG1lc3NhZ2U7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRFcnJvck1lc3NhZ2UoKSB7Ci0gICAgICAgIHJldHVybiBlcnJvck1lc3NhZ2U7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9ob3N0dGVzdHMvc3JjL2FuZHJvaWQvY29udGVudC9wbS9QYWNrYWdlTWFuYWdlckhvc3RUZXN0VXRpbHMuamF2YSBiL2NvcmUvdGVzdHMvaG9zdHRlc3RzL3NyYy9hbmRyb2lkL2NvbnRlbnQvcG0vUGFja2FnZU1hbmFnZXJIb3N0VGVzdFV0aWxzLmphdmEKaW5kZXggYjIyNWMzNy4uMzgxOTFiMCAxMDA2NDQKLS0tIGEvY29yZS90ZXN0cy9ob3N0dGVzdHMvc3JjL2FuZHJvaWQvY29udGVudC9wbS9QYWNrYWdlTWFuYWdlckhvc3RUZXN0VXRpbHMuamF2YQorKysgYi9jb3JlL3Rlc3RzL2hvc3R0ZXN0cy9zcmMvYW5kcm9pZC9jb250ZW50L3BtL1BhY2thZ2VNYW5hZ2VySG9zdFRlc3RVdGlscy5qYXZhCkBAIC0xMzAsNyArMTMwLDExIEBACiAgICAgICAgIFJlbW90ZUFuZHJvaWRUZXN0UnVubmVyIHRlc3RSdW5uZXIgPSBuZXcgUmVtb3RlQW5kcm9pZFRlc3RSdW5uZXIoCiAgICAgICAgICAgICAgICAgcGtnTmFtZSwgbURldmljZSk7CiAgICAgICAgIENvbGxlY3RpbmdUZXN0UnVuTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgQ29sbGVjdGluZ1Rlc3RSdW5MaXN0ZW5lcigpOwotICAgICAgICB0ZXN0UnVubmVyLnJ1bihsaXN0ZW5lcik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0ZXN0UnVubmVyLnJ1bihsaXN0ZW5lcik7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgImVuY291bnRlcmVkIElPRXhjZXB0aW9uICIgKyBpb2UpOworICAgICAgICB9CiAgICAgICAgIHJldHVybiBsaXN0ZW5lcjsKICAgICB9CiAKZGlmZiAtLWdpdCBhL2RhdGEvZXRjL3BsYXRmb3JtLnhtbCBiL2RhdGEvZXRjL3BsYXRmb3JtLnhtbAppbmRleCA3MzIyZTZjLi4wZTVkZjhjIDEwMDY0NAotLS0gYS9kYXRhL2V0Yy9wbGF0Zm9ybS54bWwKKysrIGIvZGF0YS9ldGMvcGxhdGZvcm0ueG1sCkBAIC01OCw2ICs1OCwxMCBAQAogICAgICAgICA8Z3JvdXAgZ2lkPSJzZGNhcmRfcnciIC8+CiAgICAgPC9wZXJtaXNzaW9uPgogCisgICAgPHBlcm1pc3Npb24gbmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkFDQ0VTU19VU0IiID4KKyAgICAgICAgPGdyb3VwIGdpZD0idXNiIiAvPgorICAgIDwvcGVybWlzc2lvbj4KKwogICAgIDwhLS0gVGhlIGdyb3VwIHRoYXQgL2NhY2hlIGJlbG9uZ3MgdG8sIGxpbmtlZCB0byB0aGUgcGVybWlzc2lvbgogICAgICAgICAgc2V0IG9uIHRoZSBhcHBsaWNhdGlvbnMgdGhhdCBjYW4gYWNjZXNzIC9jYWNoZSAtLT4KICAgICA8cGVybWlzc2lvbiBuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uQUNDRVNTX0NBQ0hFX0ZJTEVTWVNURU0iID4KZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvZnVuZGFtZW50YWxzLmpkIGIvZG9jcy9odG1sL2d1aWRlL3RvcGljcy9mdW5kYW1lbnRhbHMuamQKaW5kZXggNmQ2YWJkOC4uZGIwNmVmYyAxMDA2NDQKLS0tIGEvZG9jcy9odG1sL2d1aWRlL3RvcGljcy9mdW5kYW1lbnRhbHMuamQKKysrIGIvZG9jcy9odG1sL2d1aWRlL3RvcGljcy9mdW5kYW1lbnRhbHMuamQKQEAgLTI5Miw4ICsyOTIsOCBAQAogPGxpPjxwPkEgc2VydmljZSBpcyBzdGFydGVkIChvciBuZXcgaW5zdHJ1Y3Rpb25zIGFyZSBnaXZlbiB0byBhbiBvbmdvaW5nIAogc2VydmljZSkgYnkgcGFzc2luZyBhbiBJbnRlbnQgb2JqZWN0IHRvIDxjb2RlPntAbGluayAKIGFuZHJvaWQuY29udGVudC5Db250ZXh0I3N0YXJ0U2VydmljZSBDb250ZXh0LnN0YXJ0U2VydmljZSgpfTwvY29kZT4uICAKLUFuZHJvaWQgY2FsbHMgdGhlIHNlcnZpY2UncyA8Y29kZT57QGxpbmsgYW5kcm9pZC5hcHAuU2VydmljZSNvblN0YXJ0IAotb25TdGFydCgpfTwvY29kZT4gbWV0aG9kIGFuZCBwYXNzZXMgaXQgdGhlIEludGVudCBvYmplY3QuPC9wPgorQW5kcm9pZCBjYWxscyB0aGUgc2VydmljZSdzIDxjb2RlPntAbGluayBhbmRyb2lkLmFwcC5TZXJ2aWNlI29uU3RhcnRDb21tYW5kCitvblN0YXJ0Q29tbWFuZCgpfTwvY29kZT4gbWV0aG9kIGFuZCBwYXNzZXMgaXQgdGhlIEludGVudCBvYmplY3QuPC9wPgogCiA8cD4KIFNpbWlsYXJseSwgYW4gaW50ZW50IGNhbiBiZSBwYXNzZWQgdG8gPGNvZGU+e0BsaW5rIApAQCAtMTUwOCw5ICsxNTA4LDkgQEAKIGluIHtAY29kZSBvbkNyZWF0ZSgpfSwgYW5kIHRoZW4gc3RvcCB0aGUgdGhyZWFkIGluIHtAY29kZSBvbkRlc3Ryb3koKX0uPC9saT4KIAogPGxpPjxwPlRoZSA8Yj5hY3RpdmUgbGlmZXRpbWU8L2I+IG9mIGEgc2VydmljZSBiZWdpbnMgd2l0aCBhIGNhbGwgdG8gCi08Y29kZT57QGxpbmsgYW5kcm9pZC5hcHAuU2VydmljZSNvblN0YXJ0IG9uU3RhcnQoKX08L2NvZGU+LiAgVGhpcyBtZXRob2QgCis8Y29kZT57QGxpbmsgYW5kcm9pZC5hcHAuU2VydmljZSNvblN0YXJ0Q29tbWFuZCBvblN0YXJ0Q29tbWFuZCgpfTwvY29kZT4uICBUaGlzIG1ldGhvZAogaXMgaGFuZGVkIHRoZSBJbnRlbnQgb2JqZWN0IHRoYXQgd2FzIHBhc3NlZCB0byB7QGNvZGUgc3RhcnRTZXJ2aWNlKCl9LgotVGhlIG11c2ljIHNlcnZpY2Ugd291bGQgb3BlbiB0aGUgSW50ZW50IHRvIGRpc2NvdmVyIHdoaWNoIG11c2ljIHRvIAorVGhlIG11c2ljIHNlcnZpY2Ugd291bGQgb3BlbiB0aGUgSW50ZW50IHRvIGRpc2NvdmVyIHdoaWNoIG11c2ljIHRvCiBwbGF5LCBhbmQgYmVnaW4gdGhlIHBsYXliYWNrLjwvcD4KIAogPHA+CkBAIC0xNTI1LDcgKzE1MjUsNyBAQAogPGNvZGU+e0BsaW5rIGFuZHJvaWQuY29udGVudC5Db250ZXh0I3N0YXJ0U2VydmljZSBDb250ZXh0LnN0YXJ0U2VydmljZSgpfTwvY29kZT4KIG9yIAogPGNvZGU+e0BsaW5rIGFuZHJvaWQuY29udGVudC5Db250ZXh0I2JpbmRTZXJ2aWNlIENvbnRleHQuYmluZFNlcnZpY2UoKX08L2NvZGU+LgotSG93ZXZlciwge0Bjb2RlIG9uU3RhcnQoKX0gaXMgY2FsbGVkIG9ubHkgZm9yIHNlcnZpY2VzIHN0YXJ0ZWQgYnkge0Bjb2RlCitIb3dldmVyLCB7QGNvZGUgb25TdGFydENvbW1hbmQoKX0gaXMgY2FsbGVkIG9ubHkgZm9yIHNlcnZpY2VzIHN0YXJ0ZWQgYnkge0Bjb2RlCiBzdGFydFNlcnZpY2UoKX0uCiA8L3A+CiAKQEAgLTE2MjksNyArMTYyOSw3IEBACiAKIDxsaT48cD5JdCBoYXMgYSB7QGxpbmsgYW5kcm9pZC5hcHAuU2VydmljZX0gb2JqZWN0IHRoYXQncyBleGVjdXRpbmcKIG9uZSBvZiBpdHMgbGlmZWN5Y2xlIGNhbGxiYWNrcyAoPGNvZGU+e0BsaW5rIGFuZHJvaWQuYXBwLlNlcnZpY2Ujb25DcmVhdGUgCi1vbkNyZWF0ZSgpfTwvY29kZT4sIDxjb2RlPntAbGluayBhbmRyb2lkLmFwcC5TZXJ2aWNlI29uU3RhcnQgb25TdGFydCgpfTwvY29kZT4sIAorb25DcmVhdGUoKX08L2NvZGU+LCA8Y29kZT57QGxpbmsgYW5kcm9pZC5hcHAuU2VydmljZSNvblN0YXJ0Q29tbWFuZCBvblN0YXJ0Q29tbWFuZCgpfTwvY29kZT4sCiBvciA8Y29kZT57QGxpbmsgYW5kcm9pZC5hcHAuU2VydmljZSNvbkRlc3Ryb3kgb25EZXN0cm95KCl9PC9jb2RlPikuPC9wPjwvbGk+CiAKIDxsaT48cD5JdCBoYXMgYSB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyfSBvYmplY3QgdGhhdCdzIApkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2d1aWRlL3RvcGljcy9yZXNvdXJjZXMvc3RyaW5nLXJlc291cmNlLmpkIGIvZG9jcy9odG1sL2d1aWRlL3RvcGljcy9yZXNvdXJjZXMvc3RyaW5nLXJlc291cmNlLmpkCmluZGV4IDgxYzVkNTUuLjJkYjM4ZjEgMTAwNjQ0Ci0tLSBhL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvcmVzb3VyY2VzL3N0cmluZy1yZXNvdXJjZS5qZAorKysgYi9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL3Jlc291cmNlcy9zdHJpbmctcmVzb3VyY2UuamQKQEAgLTEyLDggKzEyLDggQEAKICAgICA8ZGQ+WE1MIHJlc291cmNlIHRoYXQgcHJvdmlkZXMgYSBzaW5nbGUgc3RyaW5nLjwvZGQ+CiAgIDxkdD48YSBocmVmPSIjU3RyaW5nQXJyYXkiPlN0cmluZyBBcnJheTwvYT48L2R0PgogICAgIDxkZD5YTUwgcmVzb3VyY2UgdGhhdCBwcm92aWRlcyBhbiBhcnJheSBvZiBzdHJpbmdzLjwvZGQ+Ci0gIDxkdD48YSBocmVmPSIjUGx1cmFscyI+UGx1cmFsczwvYT48L2R0PgotICAgIDxkZD5YTUwgcmVzb3VyY2UgdGhhdCBjYXJyaWVzIGRpZmZlcmVudCBzdHJpbmdzIGZvciBkaWZmZXJlbnQgcGx1cmFsaXphdGlvbnMKKyAgPGR0PjxhIGhyZWY9IiNQbHVyYWxzIj5RdWFudGl0eSBTdHJpbmdzIChQbHVyYWxzKTwvYT48L2R0PgorICAgIDxkZD5YTUwgcmVzb3VyY2UgdGhhdCBjYXJyaWVzIGRpZmZlcmVudCBzdHJpbmdzIGZvciBkaWZmZXJlbnQgcXVhbnRpdGllcwogICAgIG9mIHRoZSBzYW1lIHdvcmQgb3IgcGhyYXNlLjwvZGQ+CiA8L2RsPgogCkBAIC0yMTgsMTMgKzIxOCwzMCBAQAogCiAKIAotPGgyIGlkPSJQbHVyYWxzIj5QbHVyYWxzPC9oMj4KKzxoMiBpZD0iUGx1cmFscyI+UXVhbnRpdHkgU3RyaW5ncyAoUGx1cmFscyk8L2gyPgogCi08cD5BIHBhaXIgb2Ygc3RyaW5ncyB0aGF0IGVhY2ggcHJvdmlkZSBhIGRpZmZlcmVudCBwbHVyYWwgZm9ybSBvZiB0aGUgc2FtZSB3b3JkIG9yIHBocmFzZSwKLXdoaWNoIHlvdSBjYW4gY29sbGVjdGl2ZWx5IHJlZmVyZW5jZSBmcm9tIHRoZSBhcHBsaWNhdGlvbi4gV2hlbiB5b3UgcmVxdWVzdCB0aGUgcGx1cmFscwotcmVzb3VyY2UgdXNpbmcgYSBtZXRob2Qgc3VjaCBhcyB7QGxpbmsgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXMjZ2V0UXVhbnRpdHlTdHJpbmcoaW50LGludCkKLWdldFF1YW50aXR5U3RyaW5nKCl9LCB5b3UgbXVzdCBwYXNzIGEgImNvdW50Iiwgd2hpY2ggd2lsbCBkZXRlcm1pbmUgdGhlIHBsdXJhbCBmb3JtIHlvdQotcmVxdWlyZSBhbmQgcmV0dXJuIHRoYXQgc3RyaW5nIHRvIHlvdS48L3A+Cis8cD5EaWZmZXJlbnQgbGFuZ3VhZ2VzIGhhdmUgZGlmZmVyZW50IHJ1bGVzIGZvciBncmFtbWF0aWNhbCBhZ3JlZW1lbnQgd2l0aCBxdWFudGl0eS4gSW4gRW5nbGlzaCwKK2ZvciBleGFtcGxlLCB0aGUgcXVhbnRpdHkgMSBpcyBhIHNwZWNpYWwgY2FzZS4gV2Ugd3JpdGUgIjEgYm9vayIsIGJ1dCBmb3IgYW55IG90aGVyIHF1YW50aXR5IHdlJ2QKK3dyaXRlICI8aT5uPC9pPiBib29rcyIuIFRoaXMgZGlzdGluY3Rpb24gYmV0d2VlbiBzaW5ndWxhciBhbmQgcGx1cmFsIGlzIHZlcnkgY29tbW9uLCBidXQgb3RoZXIKK2xhbmd1YWdlcyBtYWtlIGZpbmVyIGRpc3RpbmN0aW9ucy4gVGhlIGZ1bGwgc2V0IHN1cHBvcnRlZCBieSBBbmRyb2lkIGlzIDxjb2RlPnplcm88L2NvZGU+LAorPGNvZGU+b25lPC9jb2RlPiwgPGNvZGU+dHdvPC9jb2RlPiwgPGNvZGU+ZmV3PC9jb2RlPiwgPGNvZGU+bWFueTwvY29kZT4sIGFuZCA8Y29kZT5vdGhlcjwvY29kZT4uCisKKzxwPlRoZSBydWxlcyBmb3IgZGVjaWRpbmcgd2hpY2ggY2FzZSB0byB1c2UgZm9yIGEgZ2l2ZW4gbGFuZ3VhZ2UgYW5kIHF1YW50aXR5IGNhbiBiZSB2ZXJ5IGNvbXBsZXgsCitzbyBBbmRyb2lkIHByb3ZpZGVzIHlvdSB3aXRoIG1ldGhvZHMgc3VjaCBhcwore0BsaW5rIGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzI2dldFF1YW50aXR5U3RyaW5nKGludCxpbnQpIGdldFF1YW50aXR5U3RyaW5nKCl9IHRvIHNlbGVjdAordGhlIGFwcHJvcHJpYXRlIHJlc291cmNlIGZvciB5b3UuCisKKzxwPk5vdGUgdGhhdCB0aGUgc2VsZWN0aW9uIGlzIG1hZGUgYmFzZWQgb24gZ3JhbW1hdGljYWwgbmVjZXNzaXR5LiBBIHN0cmluZyBmb3IgPGNvZGU+emVybzwvY29kZT4KK2luIEVuZ2xpc2ggd2lsbCBiZSBpZ25vcmVkIGV2ZW4gaWYgdGhlIHF1YW50aXR5IGlzIDAsIGJlY2F1c2UgMCBpc24ndCBncmFtbWF0aWNhbGx5IGRpZmZlcmVudAorZnJvbSAyLCBvciBhbnkgb3RoZXIgbnVtYmVyIGV4Y2VwdCAxICgiemVybyBib29rcyIsICJvbmUgYm9vayIsICJ0d28gYm9va3MiLCBldCBjZXRlcmEpLgorRG9uJ3QgYmUgbWlzbGVkIGVpdGhlciBieSB0aGUgZmFjdCB0aGF0LCBzYXksIDxjb2RlPnR3bzwvY29kZT4gc291bmRzIGxpa2UgaXQgY291bGQgb25seSBhcHBseSB0bwordGhlIHF1YW50aXR5IDI6IGEgbGFuZ3VhZ2UgbWF5IHJlcXVpcmUgdGhhdCAyLCAxMiwgMTAyIChldCBjZXRlcmEpIGFyZSBhbGwgdHJlYXRlZCBsaWtlIG9uZQorYW5vdGhlciBidXQgZGlmZmVyZW50bHkgdG8gb3RoZXIgcXVhbnRpdGllcy4gUmVseSBvbiB5b3VyIHRyYW5zbGF0b3IgdG8ga25vdyB3aGF0IGRpc3RpbmN0aW9ucwordGhlaXIgbGFuZ3VhZ2UgYWN0dWFsbHkgaW5zaXN0cyB1cG9uLgorCis8cD5JdCdzIG9mdGVuIHBvc3NpYmxlIHRvIGF2b2lkIHF1YW50aXR5IHN0cmluZ3MgYnkgdXNpbmcgcXVhbnRpdHktbmV1dHJhbCBmb3JtdWxhdGlvbnMgc3VjaCBhcworIkJvb2tzOiAxIi4gVGhpcyB3aWxsIG1ha2UgeW91ciBsaWZlIGFuZCB5b3VyIHRyYW5zbGF0b3JzJyBsaXZlcyBlYXNpZXIsIGlmIGl0J3MgYSBzdHlsZSB0aGF0J3MKK2luIGtlZXBpbmcgd2l0aCB5b3VyIGFwcGxpY2F0aW9uLgogCiA8cCBjbGFzcz0ibm90ZSI+PHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBBIHBsdXJhbHMgY29sbGVjdGlvbiBpcyBhIHNpbXBsZSByZXNvdXJjZSB0aGF0IGlzCiByZWZlcmVuY2VkIHVzaW5nIHRoZSB2YWx1ZSBwcm92aWRlZCBpbiB0aGUge0Bjb2RlIG5hbWV9IGF0dHJpYnV0ZSAobm90IHRoZSBuYW1lIG9mIHRoZSBYTUwKQEAgLTI1MSw3ICsyNjgsNyBAQAogICAgICZsdDs8YSBocmVmPSIjcGx1cmFscy1lbGVtZW50Ij5wbHVyYWxzPC9hPgogICAgICAgICBuYW1lPSI8ZW0+cGx1cmFsX25hbWU8L2VtPiI+CiAgICAgICAgICZsdDs8YSBocmVmPSIjcGx1cmFscy1pdGVtLWVsZW1lbnQiPml0ZW08L2E+Ci0gICAgICAgICAgICBxdWFudGl0eT1bIm9uZSIgfCAib3RoZXIiXQorICAgICAgICAgICAgcXVhbnRpdHk9WyJ6ZXJvIiB8ICJvbmUiIHwgInR3byIgfCAiZmV3IiB8ICJtYW55IiB8ICJvdGhlciJdCiAgICAgICAgICAgICAmZ3Q7PGVtPnRleHRfc3RyaW5nPC9lbT4mbHQ7L2l0ZW0+CiAgICAgJmx0Oy9wbHVyYWxzPgogJmx0Oy9yZXNvdXJjZXM+CkBAIC0yODUsMTYgKzMwMiwyNyBAQAogICAgICAgPHAgY2xhc3M9ImNhcHMiPmF0dHJpYnV0ZXM6PC9wPgogICAgICAgPGRsIGNsYXNzPSJhdG4tbGlzdCI+CiAgICAgICAgIDxkdD48Y29kZT5xdWFudGl0eTwvY29kZT48L2R0PgotICAgICAgICA8ZGQ+PGVtPktleXdvcmQ8L2VtPi4gQSB2YWx1ZSBpbmRpY2F0aW5nIHRoZSBjYXNlIGluIHdoaWNoIHRoaXMgc3RyaW5nIHNob3VsZCBiZSB1c2VkLiBWYWxpZAotdmFsdWVzOgorICAgICAgICA8ZGQ+PGVtPktleXdvcmQ8L2VtPi4gQSB2YWx1ZSBpbmRpY2F0aW5nIHdoZW4gdGhpcyBzdHJpbmcgc2hvdWxkIGJlIHVzZWQuIFZhbGlkCit2YWx1ZXMsIHdpdGggbm9uLWV4aGF1c3RpdmUgZXhhbXBsZXMgaW4gcGFyZW50aGVzZXM6CiAgICAgICAgICAgPHRhYmxlPgogICAgICAgICAgICAgPHRyPjx0aD5WYWx1ZTwvdGg+PHRoPkRlc2NyaXB0aW9uPC90aD48L3RyPgogICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICA8dGQ+e0Bjb2RlIG9uZX08L3RkPjx0ZD5XaGVuIHRoZXJlIGlzIG9uZSAoYSBzaW5ndWxhciBzdHJpbmcpLjwvdGQ+CisgICAgICAgICAgICAgIDx0ZD57QGNvZGUgemVyb308L3RkPjx0ZD5XaGVuIHRoZSBsYW5ndWFnZSByZXF1aXJlcyBzcGVjaWFsIHRyZWF0bWVudCBvZiB0aGUgbnVtYmVyIDAgKGFzIGluIEFyYWJpYykuPC90ZD4KICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgIDx0ZD57QGNvZGUgb3RoZXJ9PC90ZD48dGQ+V2hlbiB0aGUgcXVhbnRpdHkgaXMgYW55dGhpbmcgb3RoZXIgdGhhbiBvbmUgKGEgcGx1cmFsCi1zdHJpbmcsIGJ1dCBhbHNvIHVzZWQgd2hlbiB0aGUgY291bnQgaXMgemVybykuPC90ZD4KKyAgICAgICAgICAgICAgPHRkPntAY29kZSBvbmV9PC90ZD48dGQ+V2hlbiB0aGUgbGFuZ3VhZ2UgcmVxdWlyZXMgc3BlY2lhbCB0cmVhdG1lbnQgb2YgbnVtYmVycyBsaWtlIG9uZSAoYXMgd2l0aCB0aGUgbnVtYmVyIDEgaW4gRW5nbGlzaCBhbmQgbW9zdCBvdGhlciBsYW5ndWFnZXM7IGluIFJ1c3NpYW4sIGFueSBudW1iZXIgZW5kaW5nIGluIDEgYnV0IG5vdCBlbmRpbmcgaW4gMTEgaXMgaW4gdGhpcyBjbGFzcykuPC90ZD4KKyAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgIDx0ZD57QGNvZGUgdHdvfTwvdGQ+PHRkPldoZW4gdGhlIGxhbmd1YWdlIHJlcXVpcmVzIHNwZWNpYWwgdHJlYXRtZW50IG9mIG51bWJlcnMgbGlrZSB0d28gKGFzIGluIFdlbHNoKS48L3RkPgorICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgPHRkPntAY29kZSBmZXd9PC90ZD48dGQ+V2hlbiB0aGUgbGFuZ3VhZ2UgcmVxdWlyZXMgc3BlY2lhbCB0cmVhdG1lbnQgb2YgInNtYWxsIiBudW1iZXJzIChhcyB3aXRoIDIsIDMsIGFuZCA0IGluIEN6ZWNoOyBvciBudW1iZXJzIGVuZGluZyAyLCAzLCBvciA0IGJ1dCBub3QgMTIsIDEzLCBvciAxNCBpbiBQb2xpc2gpLjwvdGQ+CisgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICA8dGQ+e0Bjb2RlIG1hbnl9PC90ZD48dGQ+V2hlbiB0aGUgbGFuZ3VhZ2UgcmVxdWlyZXMgc3BlY2lhbCB0cmVhdG1lbnQgb2YgImxhcmdlIiBudW1iZXJzIChhcyB3aXRoIG51bWJlcnMgZW5kaW5nIDExLTk5IGluIE1hbHRlc2UpLjwvdGQ+CisgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICA8dGQ+e0Bjb2RlIG90aGVyfTwvdGQ+PHRkPldoZW4gdGhlIGxhbmd1YWdlIGRvZXMgbm90IHJlcXVpcmUgc3BlY2lhbCB0cmVhdG1lbnQgb2YgdGhlIGdpdmVuIHF1YW50aXR5LjwvdGQ+CiAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgIDwvZGQ+CkBAIC0zMTUsNiArMzQzLDE3IEBACiAgICAgJmx0Oy9wbHVyYWxzPgogJmx0Oy9yZXNvdXJjZXM+CiA8L3ByZT4KKyAgICA8cD5YTUwgZmlsZSBzYXZlZCBhdCB7QGNvZGUgcmVzL3ZhbHVlcy1wbC9zdHJpbmdzLnhtbH06PC9wPgorPHByZT4KKyZsdDs/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+CismbHQ7cmVzb3VyY2VzPgorICAgICZsdDtwbHVyYWxzIG5hbWU9Im51bWJlck9mU29uZ3NBdmFpbGFibGUiPgorICAgICAgICAmbHQ7aXRlbSBxdWFudGl0eT0ib25lIj5abmFsZXppb25vIGplZG4mI3gwMTA1OyBwaW9zZW5rJiN4MDExOTsuJmx0Oy9pdGVtPgorICAgICAgICAmbHQ7aXRlbSBxdWFudGl0eT0iZmV3Ij5abmFsZXppb25vICVkIHBpb3NlbmtpLiZsdDsvaXRlbT4KKyAgICAgICAgJmx0O2l0ZW0gcXVhbnRpdHk9Im90aGVyIj5abmFsZXppb25vICVkIHBpb3NlbmVrLiZsdDsvaXRlbT4KKyAgICAmbHQ7L3BsdXJhbHM+CismbHQ7L3Jlc291cmNlcz4KKzwvcHJlPgogICAgIDxwPkphdmEgY29kZTo8L3A+CiA8cHJlPgogaW50IGNvdW50ID0gZ2V0TnVtYmVyT2Zzb25nc0F2YWlsYWJsZSgpOwpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2d1aWRlL3RvcGljcy90ZXN0aW5nL3Rlc3RpbmdfYW5kcm9pZC5qZCBiL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvdGVzdGluZy90ZXN0aW5nX2FuZHJvaWQuamQKaW5kZXggNDZiYTc2OS4uOWFjZTFjYiAxMDA3NTUKLS0tIGEvZG9jcy9odG1sL2d1aWRlL3RvcGljcy90ZXN0aW5nL3Rlc3RpbmdfYW5kcm9pZC5qZAorKysgYi9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL3Rlc3RpbmcvdGVzdGluZ19hbmRyb2lkLmpkCkBAIC0yMyw5ICsyMyw5IEBACiAgICAgICAgIDxsaT4KICAgICAgICAgICA8YSBocmVmPSIjTW9ja09iamVjdHMiPk1vY2sgb2JqZWN0IGNsYXNzZXM8L2E+CiAgICAgICAgIDwvbGk+Ci0gICAgICAgICAgICA8bGk+Ci0gICAgICAgICAgICAgICAgPGEgaHJlZj0iI0luc3RydW1lbnRhdGlvblRlc3RSdW5uZXIiPkluc3RydW1lbnRhdGlvbiBUZXN0IFJ1bm5lcjwvYT4KLSAgICAgICAgICAgIDwvbGk+CisgICAgICAgIDxsaT4KKyAgICAgICAgICA8YSBocmVmPSIjSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lciI+SW5zdHJ1bWVudGF0aW9uIFRlc3QgUnVubmVyPC9hPgorICAgICAgICA8L2xpPgogICAgICAgPC9vbD4KICAgICA8L2xpPgogICAgIDxsaT4KQEAgLTY0LDcgKzY0LDggQEAKICAgPGgyPlJlbGF0ZWQgVHV0b3JpYWxzPC9oMj4KICAgICA8b2w+CiAgICAgICAgIDxsaT4KLSAgICAgICAgICAgIDxhIGhyZWY9IntAZG9jUm9vdH1yZXNvdXJjZXMvdHV0b3JpYWxzL3Rlc3RpbmcvaGVsbG9hbmRyb2lkX3Rlc3QuaHRtbCI+SGVsbG8sIFRlc3Rpbmc8L2E+CisgICAgICAgICAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9cmVzb3VyY2VzL3R1dG9yaWFscy90ZXN0aW5nL2hlbGxvYW5kcm9pZF90ZXN0Lmh0bWwiPgorICAgICAgICAgICAgSGVsbG8sIFRlc3Rpbmc8L2E+CiAgICAgICAgIDwvbGk+CiAgICAgICAgIDxsaT4KICAgICAgICAgICAgIDxhIGhyZWY9IntAZG9jUm9vdH1yZXNvdXJjZXMvdHV0b3JpYWxzL3Rlc3RpbmcvYWN0aXZpdHlfdGVzdC5odG1sIj5BY3Rpdml0eSBUZXN0aW5nPC9hPgpAQCAtNzMsMTAgKzc0LDEyIEBACiAgIDxoMj5TZWUgQWxzbzwvaDI+CiAgICAgICA8b2w+CiAgICAgICAgIDxsaT4KLSAgICAgICAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvZGV2ZWxvcGluZy90ZXN0aW5nL3Rlc3RpbmdfZWNsaXBzZS5odG1sIj5UZXN0aW5nIGluIEVjbGlwc2UsIHdpdGggQURUPC9hPgorICAgICAgICAgIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL3Rlc3RpbmcvdGVzdGluZ19lY2xpcHNlLmh0bWwiPgorICAgICAgICAgIFRlc3RpbmcgaW4gRWNsaXBzZSwgd2l0aCBBRFQ8L2E+CiAgICAgICAgIDwvbGk+CiAgICAgICAgIDxsaT4KLSAgICAgICAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvZGV2ZWxvcGluZy90ZXN0aW5nL3Rlc3Rpbmdfb3RoZXJpZGUuaHRtbCI+VGVzdGluZyBpbiBPdGhlciBJREVzPC9hPgorICAgICAgICAgIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL3Rlc3RpbmcvdGVzdGluZ19vdGhlcmlkZS5odG1sIj4KKyAgICAgICAgICBUZXN0aW5nIGluIE90aGVyIElERXM8L2E+CiAgICAgICAgIDwvbGk+CiAgICAgICA8L29sPgogICA8L2Rpdj4KQEAgLTExOCw0NSArMTIxLDU1IEBACiBpbiB0aGUgc2FtZSBwcm9jZXNzLiA8L3A+CiAKIDxwPllvdXIgdGVzdCBhcHBsaWNhdGlvbiBpcyBsaW5rZWQgdG8gdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QgYnkgbWVhbnMgb2YgYW4KLTxhCi1ocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL21hbmlmZXN0L2luc3RydW1lbnRhdGlvbi1lbGVtZW50Lmh0bWwiPjxjb2RlPiZsdDtpbnN0cnVtZW50YXRpb24mZ3Q7PC9jb2RlPjwvYT4KLWVsZW1lbnQgaW4gdGhlIHRlc3QgYXBwbGljYXRpb24ncyBtYW5pZmVzdCBmaWxlLiBUaGUgYXR0cmlidXRlcyBvZiB0aGUgZWxlbWVudAotc3BlY2lmeSB0aGUgcGFja2FnZSBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0IGFuZCBhbHNvIHRlbGwgQW5kcm9pZCBob3cKLXRvIHJ1biB0aGUgdGVzdCBhcHBsaWNhdGlvbi4gSW5zdHJ1bWVudGF0aW9uIGlzIGRlc2NyaWJlZCBpbiBtb3JlIGRldGFpbCBpbiB0aGUKLXNlY3Rpb24gPGEgaHJlZj0iI0luc3RydW1lbnRhdGlvblRlc3RSdW5uZXIiPkluc3RydW1lbnRhdGlvbiBUZXN0Ci1SdW5uZXI8L2E+LjwvcD4KKyAgICA8YQorICAgICAgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy9tYW5pZmVzdC9pbnN0cnVtZW50YXRpb24tZWxlbWVudC5odG1sIj4KKyAgICAgIDxjb2RlPiZsdDtpbnN0cnVtZW50YXRpb24mZ3Q7PC9jb2RlPjwvYT4gZWxlbWVudCBpbiB0aGUgdGVzdCBhcHBsaWNhdGlvbidzIG1hbmlmZXN0IGZpbGUuIAorICAgICAgVGhlIGF0dHJpYnV0ZXMgb2YgdGhlIGVsZW1lbnQgc3BlY2lmeSB0aGUgcGFja2FnZSBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0IGFuZCBhbHNvIAorICAgICAgdGVsbCBBbmRyb2lkIGhvdyB0byBydW4gdGhlIHRlc3QgYXBwbGljYXRpb24uIEluc3RydW1lbnRhdGlvbiBpcyBkZXNjcmliZWQgaW4gbW9yZSBkZXRhaWwgCisgICAgICBpbiB0aGUgc2VjdGlvbiA8YSBocmVmPSIjSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lciI+SW5zdHJ1bWVudGF0aW9uIFRlc3QgUnVubmVyPC9hPi4KKzwvcD4KIAogPHA+VGhlIGZvbGxvd2luZyBkaWFncmFtIHN1bW1hcml6ZXMgdGhlIEFuZHJvaWQgdGVzdGluZyBlbnZpcm9ubWVudDo8L3A+CiAKIDxpbWcgc3JjPSJ7QGRvY1Jvb3R9aW1hZ2VzL3Rlc3RpbmcvYW5kcm9pZF90ZXN0X2ZyYW1ld29yay5wbmciLz4KIAotPHA+SW4gQW5kcm9pZCwgdGVzdCBhcHBsaWNhdGlvbnMgYXJlIHRoZW1zZWx2ZXMgQW5kcm9pZCBhcHBsaWNhdGlvbnMsIHNvIHlvdQotd3JpdGUgdGhlbSBpbiBtdWNoIHRoZSBzYW1lIHdheSBhcyB0aGUgYXBwbGljYXRpb24geW91IGFyZSB0ZXN0aW5nLiBUaGUgU0RLCi10b29scyBoZWxwIHlvdSBjcmVhdGUgYSBtYWluIGFwcGxpY2F0aW9uIHByb2plY3QgYW5kIGl0cyB0ZXN0IHByb2plY3QgYXQgdGhlIHNhbWUKLXRpbWUuIFlvdSBjYW4gcnVuIEFuZHJvaWQgdGVzdHMgd2l0aGluIEVjbGlwc2Ugd2l0aCBBRFQgb3IgZnJvbSB0aGUgY29tbWFuZAotbGluZS4gRWNsaXBzZSB3aXRoIEFEVCBwcm92aWRlcyBhbiBleHRlbnNpdmUgc2V0IG9mIHRvb2xzIGZvciBjcmVhdGluZyB0ZXN0cywKLXJ1bm5pbmcgdGhlbSwgYW5kIHZpZXdpbmcgdGhlaXIgcmVzdWx0cy4gWW91IGNhbiBhbHNvIHVzZSB0aGUgPGNvZGU+YWRiPC9jb2RlPgotdG9vbCB0byBydW4gdGVzdHMsIG9yIHVzZSBhIGJ1aWx0LWluIEFudCB0YXJnZXQuPC9wPgorPHA+CisgICAgSW4gQW5kcm9pZCwgdGVzdCBhcHBsaWNhdGlvbnMgYXJlIHRoZW1zZWx2ZXMgQW5kcm9pZCBhcHBsaWNhdGlvbnMsIHNvIHlvdQorICAgIHdyaXRlIHRoZW0gaW4gbXVjaCB0aGUgc2FtZSB3YXkgYXMgdGhlIGFwcGxpY2F0aW9uIHlvdSBhcmUgdGVzdGluZy4gVGhlIFNESworICAgIHRvb2xzIGhlbHAgeW91IGNyZWF0ZSBhIG1haW4gYXBwbGljYXRpb24gcHJvamVjdCBhbmQgaXRzIHRlc3QgcHJvamVjdCBhdCB0aGUgc2FtZQorICAgIHRpbWUuIFlvdSBjYW4gcnVuIEFuZHJvaWQgdGVzdHMgd2l0aGluIEVjbGlwc2Ugd2l0aCBBRFQgb3IgZnJvbSB0aGUgY29tbWFuZAorICAgIGxpbmUuIEVjbGlwc2Ugd2l0aCBBRFQgcHJvdmlkZXMgYW4gZXh0ZW5zaXZlIHNldCBvZiB0b29scyBmb3IgY3JlYXRpbmcgdGVzdHMsCisgICAgcnVubmluZyB0aGVtLCBhbmQgdmlld2luZyB0aGVpciByZXN1bHRzLiBZb3UgY2FuIGFsc28gdXNlIHRoZSA8Y29kZT5hZGI8L2NvZGU+CisgICAgdG9vbCB0byBydW4gdGVzdHMsIG9yIHVzZSBhIGJ1aWx0LWluIEFudCB0YXJnZXQuCis8L3A+CiAKLTxwPlRvIGxlYXJuIGhvdyB0byBzZXQgdXAgYW5kIHJ1biB0ZXN0cyBpbiBFY2xpcHNlLCBwbGVhc2UgcmVmZXIgdG8gPGEKLWhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL3Rlc3RpbmcvdGVzdGluZ19lY2xpcHNlLmh0bWwiPlRlc3RpbmcgaW4KLUVjbGlwc2UsIHdpdGggQURUPC9hPi4gSWYgeW91J3JlIG5vdCB3b3JraW5nIGluIEVjbGlwc2UsIHJlZmVyIHRvIDxhCi1ocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvZGV2ZWxvcGluZy90ZXN0aW5nL3Rlc3Rpbmdfb3RoZXJpZGUuaHRtbCI+VGVzdGluZyBpbiBPdGhlcgotSURFczwvYT4uPC9wPgorPHA+CisgICAgVG8gbGVhcm4gaG93IHRvIHNldCB1cCBhbmQgcnVuIHRlc3RzIGluIEVjbGlwc2UsIHBsZWFzZSByZWZlciB0byA8YQorICAgIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL3Rlc3RpbmcvdGVzdGluZ19lY2xpcHNlLmh0bWwiPlRlc3RpbmcgaW4KKyAgICBFY2xpcHNlLCB3aXRoIEFEVDwvYT4uIElmIHlvdSdyZSBub3Qgd29ya2luZyBpbiBFY2xpcHNlLCByZWZlciB0byA8YQorICAgIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL3Rlc3RpbmcvdGVzdGluZ19vdGhlcmlkZS5odG1sIj5UZXN0aW5nIGluIE90aGVyCisgICAgSURFczwvYT4uCis8L3A+CiAKLTxwPklmIHlvdSB3YW50IGEgc3RlcC1ieS1zdGVwIGludHJvZHVjdGlvbiB0byBBbmRyb2lkIHRlc3RpbmcsIHRyeSBvbmUgb2YgdGhlCi10ZXN0aW5nIHR1dG9yaWFsczo8L3A+Cis8cD4KKyAgICBJZiB5b3Ugd2FudCBhIHN0ZXAtYnktc3RlcCBpbnRyb2R1Y3Rpb24gdG8gQW5kcm9pZCB0ZXN0aW5nLCB0cnkgb25lIG9mIHRoZQorICAgIHRlc3RpbmcgdHV0b3JpYWxzOgorPC9wPgogCiA8dWw+Ci0gIDxsaT5UaGUgPGEKLWhyZWY9IntAZG9jUm9vdH1yZXNvdXJjZXMvdHV0b3JpYWxzL3Rlc3RpbmcvaGVsbG9hbmRyb2lkX3Rlc3QuaHRtbCI+SGVsbG8sCi1UZXN0aW5nPC9hPiB0dXRvcmlhbCBpbnRyb2R1Y2VzIGJhc2ljIHRlc3RpbmcgY29uY2VwdHMgYW5kIHByb2NlZHVyZXMgaW4gdGhlCi1jb250ZXh0IG9mIHRoZSBIZWxsbywgV29ybGQgYXBwbGljYXRpb24uPC9saT4KLSAgPGxpPlRoZSA8YQotaHJlZj0ie0Bkb2NSb290fXJlc291cmNlcy90dXRvcmlhbHMvdGVzdGluZy9hY3Rpdml0eV90ZXN0Lmh0bWwiPkFjdGl2aXR5Ci1UZXN0aW5nPC9hPiB0dXRvcmlhbCBpcyBhbiBleGNlbGxlbnQgZm9sbG93LXVwIHRvIHRoZSBIZWxsbywgVGVzdGluZyB0dXRvcmlhbC4KLUl0IGd1aWRlcyB5b3UgdGhyb3VnaCBhIG1vcmUgY29tcGxleCB0ZXN0aW5nIHNjZW5hcmlvIHRoYXQgeW91IGRldmVsb3AgYWdhaW5zdCBhCi1tb3JlIHJlYWxpc3RpYyBhcHBsaWNhdGlvbi48L2xpPgorICAgIDxsaT4KKyAgICAgICAgVGhlIDxhCisgICAgICAgIGhyZWY9IntAZG9jUm9vdH1yZXNvdXJjZXMvdHV0b3JpYWxzL3Rlc3RpbmcvaGVsbG9hbmRyb2lkX3Rlc3QuaHRtbCI+SGVsbG8sCisgICAgICAgIFRlc3Rpbmc8L2E+IHR1dG9yaWFsIGludHJvZHVjZXMgYmFzaWMgdGVzdGluZyBjb25jZXB0cyBhbmQgcHJvY2VkdXJlcyBpbiB0aGUKKyAgICAgICAgY29udGV4dCBvZiB0aGUgSGVsbG8sIFdvcmxkIGFwcGxpY2F0aW9uLgorICAgIDwvbGk+CisgICAgPGxpPgorICAgICAgICBUaGUgPGEKKyAgICAgICAgaHJlZj0ie0Bkb2NSb290fXJlc291cmNlcy90dXRvcmlhbHMvdGVzdGluZy9hY3Rpdml0eV90ZXN0Lmh0bWwiPkFjdGl2aXR5CisgICAgICAgIFRlc3Rpbmc8L2E+IHR1dG9yaWFsIGlzIGFuIGV4Y2VsbGVudCBmb2xsb3ctdXAgdG8gdGhlIEhlbGxvLCBUZXN0aW5nIHR1dG9yaWFsLgorICAgICAgICBJdCBndWlkZXMgeW91IHRocm91Z2ggYSBtb3JlIGNvbXBsZXggdGVzdGluZyBzY2VuYXJpbyB0aGF0IHlvdSBkZXZlbG9wIGFnYWluc3QgYQorICAgICAgICBtb3JlIHJlYWxpc3RpYyBhcHBsaWNhdGlvbi4KKyAgICA8L2xpPgogPC91bD4KIAogPGgyIGlkPSJUZXN0QVBJIj5UaGUgVGVzdGluZyBBUEk8L2gyPgpAQCAtMTY2LDEyMCArMTc5LDE1NiBAQAogICAgIGEgcG93ZXJmdWwgaW5zdHJ1bWVudGF0aW9uIGZyYW1ld29yayB0aGF0IGxldHMgeW91ciB0ZXN0cyBhY2Nlc3MgdGhlIHN0YXRlIGFuZCBydW50aW1lIG9iamVjdHMKICAgICBvZiB0aGUgYXBwbGljYXRpb24gdW5kZXIgdGVzdHMuCiA8L3A+Ci08cD5UaGUgc2VjdGlvbnMgYmVsb3cgZGVzY3JpYmUgdGhlIG1ham9yIGNvbXBvbmVudHMgb2YgdGhlIHRlc3RpbmcgQVBJIGF2YWlsYWJsZSBpbiBBbmRyb2lkLjwvcD4KKzxwPgorICAgIFRoZSBzZWN0aW9ucyBiZWxvdyBkZXNjcmliZSB0aGUgbWFqb3IgY29tcG9uZW50cyBvZiB0aGUgdGVzdGluZyBBUEkgYXZhaWxhYmxlIGluIEFuZHJvaWQuCis8L3A+CiA8aDMgaWQ9IkV4dGVuc2lvbnMiPkpVbml0IHRlc3QgY2FzZSBjbGFzc2VzPC9oMz4KIDxwPgotICBTb21lIG9mIHRoZSBjbGFzc2VzIGluIHRoZSB0ZXN0aW5nIEFQSSBleHRlbmQgdGhlIEpVbml0IHtAbGluayBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UgVGVzdENhc2V9IGJ1dCBkbyBub3QgdXNlIHRoZSBpbnN0cnVtZW50YXRpb24gZnJhbWV3b3JrLiBUaGVzZSBjbGFzc2VzCi0gIGNvbnRhaW4gbWV0aG9kcyBmb3IgYWNjZXNzaW5nIHN5c3RlbSBvYmplY3RzIHN1Y2ggYXMgdGhlIENvbnRleHQgb2YgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QuIFdpdGggdGhpcyBDb250ZXh0LCB5b3UgY2FuIGxvb2sgYXQgaXRzIHJlc291cmNlcywgZmlsZXMsIGRhdGFiYXNlcywKLSAgYW5kIHNvIGZvcnRoLiBUaGUgYmFzZSBjbGFzcyBpcyB7QGxpbmsgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZX0sIGJ1dCB5b3UgdXN1YWxseSB1c2UgYSBzdWJjbGFzcyBhc3NvY2lhdGVkIHdpdGggYSBwYXJ0aWN1bGFyIGNvbXBvbmVudC4KKyAgU29tZSBvZiB0aGUgY2xhc3NlcyBpbiB0aGUgdGVzdGluZyBBUEkgZXh0ZW5kIHRoZSBKVW5pdCB7QGxpbmsganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlIFRlc3RDYXNlfSAKKyAgYnV0IGRvIG5vdCB1c2UgdGhlIGluc3RydW1lbnRhdGlvbiBmcmFtZXdvcmsuIFRoZXNlIGNsYXNzZXMgY29udGFpbiBtZXRob2RzIGZvciBhY2Nlc3Npbmcgc3lzdGVtIAorICBvYmplY3RzIHN1Y2ggYXMgdGhlIENvbnRleHQgb2YgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QuIFdpdGggdGhpcyBDb250ZXh0LCB5b3UgY2FuIGxvb2sgYXQgaXRzIAorICByZXNvdXJjZXMsIGZpbGVzLCBkYXRhYmFzZXMsIGFuZCBzbyBmb3J0aC4gVGhlIGJhc2UgY2xhc3MgaXMge0BsaW5rIGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2V9LAorICBidXQgeW91IHVzdWFsbHkgdXNlIGEgc3ViY2xhc3MgYXNzb2NpYXRlZCB3aXRoIGEgcGFydGljdWxhciBjb21wb25lbnQuCiA8cD4KICAgVGhlIHN1YmNsYXNzZXMgYXJlOgogPC9wPgogICA8dWw+CiAgICAgPGxpPgotICAgICAge0BsaW5rIGFuZHJvaWQudGVzdC5BcHBsaWNhdGlvblRlc3RDYXNlfSAtIEEgY2xhc3MgZm9yIHRlc3RpbmcgYW4gZW50aXJlIGFwcGxpY2F0aW9uLiBJdCBhbGxvd3MgeW91IHRvIGluamVjdCBhIG1vY2sgQ29udGV4dCBpbnRvIHRoZSBhcHBsaWNhdGlvbiwKLSAgICAgIHNldCB1cCBpbml0aWFsIHRlc3QgcGFyYW1ldGVycyBiZWZvcmUgdGhlIGFwcGxpY2F0aW9uIHN0YXJ0cywgYW5kIGV4YW1pbmUgdGhlIGFwcGxpY2F0aW9uIGFmdGVyIGl0IGZpbmlzaGVzIGJ1dCBiZWZvcmUgaXQgaXMgZGVzdHJveWVkLgorICAgICAge0BsaW5rIGFuZHJvaWQudGVzdC5BcHBsaWNhdGlvblRlc3RDYXNlfSAtIEEgY2xhc3MgZm9yIHRlc3RpbmcgYW4gZW50aXJlIGFwcGxpY2F0aW9uLiAKKyAgICAgIEl0IGFsbG93cyB5b3UgdG8gaW5qZWN0IGEgbW9jayBDb250ZXh0IGludG8gdGhlIGFwcGxpY2F0aW9uLCBzZXQgdXAgaW5pdGlhbCB0ZXN0IHBhcmFtZXRlcnMgCisgICAgICBiZWZvcmUgdGhlIGFwcGxpY2F0aW9uIHN0YXJ0cywgYW5kIGV4YW1pbmUgdGhlIGFwcGxpY2F0aW9uIGFmdGVyIGl0IGZpbmlzaGVzIGJ1dCBiZWZvcmUgaXQgCisgICAgICBpcyBkZXN0cm95ZWQuCiAgICAgPC9saT4KICAgICA8bGk+Ci0gICAgICB7QGxpbmsgYW5kcm9pZC50ZXN0LlByb3ZpZGVyVGVzdENhc2UyfSAtIEEgY2xhc3MgZm9yIGlzb2xhdGVkIHRlc3Rpbmcgb2YgYSBzaW5nbGUge0BsaW5rIGFuZHJvaWQuY29udGVudC5Db250ZW50UHJvdmlkZXJ9LiBTaW5jZSBpdCBpcyByZXN0cmljdGVkIHRvIHVzaW5nIGEKLSAgICAgIHtAbGluayBhbmRyb2lkLnRlc3QubW9jay5Nb2NrQ29udGVudFJlc29sdmVyfSBmb3IgdGhlIHByb3ZpZGVyLCBhbmQgaXQgaW5qZWN0cyBhbiB7QGxpbmsgYW5kcm9pZC50ZXN0Lklzb2xhdGVkQ29udGV4dH0sIHlvdXIgcHJvdmlkZXIgdGVzdGluZyBpcyBpc29sYXRlZAorICAgICAge0BsaW5rIGFuZHJvaWQudGVzdC5Qcm92aWRlclRlc3RDYXNlMn0gLSBBIGNsYXNzIGZvciBpc29sYXRlZCB0ZXN0aW5nIG9mIGEgc2luZ2xlIAorICAgICAge0BsaW5rIGFuZHJvaWQuY29udGVudC5Db250ZW50UHJvdmlkZXJ9LiBTaW5jZSBpdCBpcyByZXN0cmljdGVkIHRvIHVzaW5nIGEKKyAgICAgICB7QGxpbmsgYW5kcm9pZC50ZXN0Lm1vY2suTW9ja0NvbnRlbnRSZXNvbHZlcn0gZm9yIHRoZSBwcm92aWRlciwgYW5kIGl0IGluamVjdHMgYW4gCisgICAgICAge0BsaW5rIGFuZHJvaWQudGVzdC5Jc29sYXRlZENvbnRleHR9LCB5b3VyIHByb3ZpZGVyIHRlc3RpbmcgaXMgaXNvbGF0ZWQKICAgICAgIGZyb20gdGhlIHJlc3Qgb2YgdGhlIE9TLgogICAgIDwvbGk+CiAgICAgPGxpPgotICAgICAge0BsaW5rIGFuZHJvaWQudGVzdC5TZXJ2aWNlVGVzdENhc2V9IC0gYSBjbGFzcyBmb3IgaXNvbGF0ZWQgdGVzdGluZyBvZiBhIHNpbmdsZSB7QGxpbmsgYW5kcm9pZC5hcHAuU2VydmljZX0uIFlvdSBjYW4gaW5qZWN0IGEgbW9jayBDb250ZXh0IG9yCi0gICAgICBtb2NrIEFwcGxpY2F0aW9uIChvciBib3RoKSwgb3IgbGV0IEFuZHJvaWQgcHJvdmlkZSB5b3UgYSBmdWxsIENvbnRleHQgYW5kIGEge0BsaW5rIGFuZHJvaWQudGVzdC5tb2NrLk1vY2tBcHBsaWNhdGlvbn0uCisgICAgICB7QGxpbmsgYW5kcm9pZC50ZXN0LlNlcnZpY2VUZXN0Q2FzZX0gLSBhIGNsYXNzIGZvciBpc29sYXRlZCB0ZXN0aW5nIG9mIGEgc2luZ2xlIAorICAgICAge0BsaW5rIGFuZHJvaWQuYXBwLlNlcnZpY2V9LiBZb3UgY2FuIGluamVjdCBhIG1vY2sgQ29udGV4dCBvciBtb2NrIEFwcGxpY2F0aW9uIChvciBib3RoKSwgb3IgCisgICAgICBsZXQgQW5kcm9pZCBwcm92aWRlIHlvdSBhIGZ1bGwgQ29udGV4dCBhbmQgYSB7QGxpbmsgYW5kcm9pZC50ZXN0Lm1vY2suTW9ja0FwcGxpY2F0aW9ufS4KICAgICA8L2xpPgogICA8L3VsPgogPGgzIGlkPSJJbnN0cnVtZW50YXRpb24iPkluc3RydW1lbnRhdGlvbiB0ZXN0IGNhc2UgY2xhc3NlczwvaDM+CiA8cD4KLSAgVGhlIEFQSSBmb3IgdGVzdGluZyBhY3Rpdml0aWVzIGV4dGVuZHMgdGhlIEpVbml0IHtAbGluayBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UgVGVzdENhc2V9IGNsYXNzIGFuZCBhbHNvIHVzZXMgdGhlIGluc3RydW1lbnRhdGlvbiBmcmFtZXdvcmsuIFdpdGggaW5zdHJ1bWVudGF0aW9uLAotICBBbmRyb2lkIGNhbiBhdXRvbWF0ZSBVSSB0ZXN0aW5nIGJ5IHNlbmRpbmcgZXZlbnRzIHRvIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0LCBwcmVjaXNlbHkgY29udHJvbCB0aGUgc3RhcnQgb2YgYW4gYWN0aXZpdHksIGFuZCBtb25pdG9yIHRoZSBzdGF0ZSBvZiB0aGUKLSAgYWN0aXZpdHkgZHVyaW5nIGl0cyBsaWZlIGN5Y2xlLgorICBUaGUgQVBJIGZvciB0ZXN0aW5nIGFjdGl2aXRpZXMgZXh0ZW5kcyB0aGUgSlVuaXQge0BsaW5rIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSBUZXN0Q2FzZX0gY2xhc3MgCisgIGFuZCBhbHNvIHVzZXMgdGhlIGluc3RydW1lbnRhdGlvbiBmcmFtZXdvcmsuIFdpdGggaW5zdHJ1bWVudGF0aW9uLCBBbmRyb2lkIGNhbiBhdXRvbWF0ZSBVSSAKKyAgdGVzdGluZyBieSBzZW5kaW5nIGV2ZW50cyB0byB0aGUgYXBwbGljYXRpb24gdW5kZXIgdGVzdCwgcHJlY2lzZWx5IGNvbnRyb2wgdGhlIHN0YXJ0IG9mIGFuIAorICBhY3Rpdml0eSwgYW5kIG1vbml0b3IgdGhlIHN0YXRlIG9mIHRoZSBhY3Rpdml0eSBkdXJpbmcgaXRzIGxpZmUgY3ljbGUuCiA8L3A+CiA8cD4KLSAgVGhlIGJhc2UgY2xhc3MgaXMge0BsaW5rIGFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0Q2FzZX0uIEFsbCBvZiBpdHMgc3ViY2xhc3NlcyBoYXZlIHRoZSBhYmlsaXR5IHRvIHNlbmQgYSBrZXlzdHJva2Ugb3IgdG91Y2ggZXZlbnQgdG8gdGhlIFVJIG9mIHRoZSBhcHBsaWNhdGlvbgotICB1bmRlciB0ZXN0LiBUaGUgc3ViY2xhc3NlcyBjYW4gYWxzbyBpbmplY3QgYSBtb2NrIEludGVudC4KLSAgVGhlIHN1YmNsYXNzZXMgYXJlOgorICBUaGUgYmFzZSBjbGFzcyBpcyB7QGxpbmsgYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RDYXNlfS4gQWxsIG9mIGl0cyBzdWJjbGFzc2VzIGhhdmUgCisgIHRoZSBhYmlsaXR5IHRvIHNlbmQgYSBrZXlzdHJva2Ugb3IgdG91Y2ggZXZlbnQgdG8gdGhlIFVJIG9mIHRoZSBhcHBsaWNhdGlvbgorICB1bmRlciB0ZXN0LiBUaGUgc3ViY2xhc3NlcyBjYW4gYWxzbyBpbmplY3QgYSBtb2NrIEludGVudC4gVGhlIHN1YmNsYXNzZXMgYXJlOgogPC9wPgogICA8dWw+CiAgICAgPGxpPgogICAgICAge0BsaW5rIGFuZHJvaWQudGVzdC5BY3Rpdml0eVRlc3RDYXNlfSAtIEEgYmFzZSBjbGFzcyBmb3IgYWN0aXZpdHkgdGVzdCBjbGFzc2VzLgogICAgIDwvbGk+CiAgICAgPGxpPgotICAgICAge0BsaW5rIGFuZHJvaWQudGVzdC5TaW5nbGVMYXVuY2hBY3Rpdml0eVRlc3RDYXNlfSAtIEEgY29udmVuaWVuY2UgY2xhc3MgZm9yIHRlc3RpbmcgYSBzaW5nbGUgYWN0aXZpdHkuCi0gICAgICBJdCBpbnZva2VzIHtAbGluayBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKSBzZXRVcCgpfSBhbmQge0BsaW5rIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpIHRlYXJEb3duKCl9IG9ubHkKLSAgICAgIG9uY2UsIGluc3RlYWQgb2Ygb25jZSBwZXIgbWV0aG9kIGNhbGwuIFVzZSBpdCB3aGVuIGFsbCBvZiB5b3VyIHRlc3QgbWV0aG9kcyBydW4gYWdhaW5zdCB0aGUgc2FtZSBhY3Rpdml0eS4KKyAgICAgIHtAbGluayBhbmRyb2lkLnRlc3QuU2luZ2xlTGF1bmNoQWN0aXZpdHlUZXN0Q2FzZX0gLSBBIGNvbnZlbmllbmNlIGNsYXNzIGZvciAKKyAgICAgIHRlc3RpbmcgYSBzaW5nbGUgYWN0aXZpdHkuIEl0IGludm9rZXMge0BsaW5rIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpIHNldFVwKCl9IGFuZCAKKyAgICAgIHtAbGluayBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKSB0ZWFyRG93bigpfSBvbmx5IG9uY2UsIGluc3RlYWQgb2Ygb25jZSBwZXIgCisgICAgICBtZXRob2QgY2FsbC4gVXNlIGl0IHdoZW4gYWxsIG9mIHlvdXIgdGVzdCBtZXRob2RzIHJ1biBhZ2FpbnN0IHRoZSBzYW1lIGFjdGl2aXR5LgogICAgIDwvbGk+CiAgICAgPGxpPgotICAgICAge0BsaW5rIGFuZHJvaWQudGVzdC5TeW5jQmFzZUluc3RydW1lbnRhdGlvbn0gLSBBIGNsYXNzIHRoYXQgdGVzdHMgc3luY2hyb25pemF0aW9uIG9mIGEgY29udGVudCBwcm92aWRlci4gSXQgdXNlcyBpbnN0cnVtZW50YXRpb24gdG8gY2FuY2VsIGFuZCBkaXNhYmxlCi0gICAgICBleGlzdGluZyBzeW5jaHJvbml6YXRpb25zIGJlZm9yZSBzdGFydGluZyB0aGUgdGVzdCBzeW5jaHJvbml6YXRpb24uCisgICAgICB7QGxpbmsgYW5kcm9pZC50ZXN0LlN5bmNCYXNlSW5zdHJ1bWVudGF0aW9ufSAtIEEgY2xhc3MgdGhhdCB0ZXN0cyBzeW5jaHJvbml6YXRpb24gb2YgYSAKKyAgICAgIGNvbnRlbnQgcHJvdmlkZXIuIEl0IHVzZXMgaW5zdHJ1bWVudGF0aW9uIHRvIGNhbmNlbCBhbmQgZGlzYWJsZSBleGlzdGluZyBzeW5jaHJvbml6YXRpb25zIAorICAgICAgYmVmb3JlIHN0YXJ0aW5nIHRoZSB0ZXN0IHN5bmNocm9uaXphdGlvbi4KICAgICA8L2xpPgogICAgIDxsaT4KLSAgICAgIHtAbGluayBhbmRyb2lkLnRlc3QuQWN0aXZpdHlVbml0VGVzdENhc2V9IC0gVGhpcyBjbGFzcyBkb2VzIGFuIGlzb2xhdGVkIHRlc3Qgb2YgYSBzaW5nbGUgYWN0aXZpdHkuIFdpdGggaXQsIHlvdSBjYW4gaW5qZWN0IGEgbW9jayBjb250ZXh0IG9yIGFwcGxpY2F0aW9uLCBvciBib3RoLgotICAgICAgSXQgaXMgaW50ZW5kZWQgZm9yIGRvaW5nIHVuaXQgdGVzdHMgb2YgYW4gYWN0aXZpdHksIGFuZCBpcyB0aGUgYWN0aXZpdHkgZXF1aXZhbGVudCBvZiB0aGUgdGVzdCBjbGFzc2VzIGRlc2NyaWJlZCBpbiA8YSBocmVmPSIjRXh0ZW5zaW9ucyI+SlVuaXQgdGVzdCBjYXNlIGNsYXNzZXM8L2E+LgotICAgICAgPHA+IFVubGlrZSB0aGUgb3RoZXIgaW5zdHJ1bWVudGF0aW9uIGNsYXNzZXMsIHRoaXMgdGVzdCBjbGFzcyBjYW5ub3QgaW5qZWN0IGEgbW9jayBJbnRlbnQuPC9wPgorICAgICAge0BsaW5rIGFuZHJvaWQudGVzdC5BY3Rpdml0eVVuaXRUZXN0Q2FzZX0gLSBUaGlzIGNsYXNzIGRvZXMgYW4gaXNvbGF0ZWQgdGVzdCBvZiBhIHNpbmdsZSAKKyAgICAgIGFjdGl2aXR5LiBXaXRoIGl0LCB5b3UgY2FuIGluamVjdCBhIG1vY2sgY29udGV4dCBvciBhcHBsaWNhdGlvbiwgb3IgYm90aC4KKyAgICAgIEl0IGlzIGludGVuZGVkIGZvciBkb2luZyB1bml0IHRlc3RzIG9mIGFuIGFjdGl2aXR5LCBhbmQgaXMgdGhlIGFjdGl2aXR5IGVxdWl2YWxlbnQgb2YgdGhlIAorICAgICAgdGVzdCBjbGFzc2VzIGRlc2NyaWJlZCBpbiA8YSBocmVmPSIjRXh0ZW5zaW9ucyI+SlVuaXQgdGVzdCBjYXNlIGNsYXNzZXM8L2E+LgorICAgICAgPHA+CisgICAgICAgIFVubGlrZSB0aGUgb3RoZXIgaW5zdHJ1bWVudGF0aW9uIGNsYXNzZXMsIHRoaXMgdGVzdCBjbGFzcyBjYW5ub3QgaW5qZWN0IGEgbW9jayBJbnRlbnQuCisgICAgICA8L3A+CiAgICAgPC9saT4KICAgICA8bGk+Ci0gICAgICB7QGxpbmsgYW5kcm9pZC50ZXN0LkFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uVGVzdENhc2UyfSAtIFRoaXMgY2xhc3MgdGVzdHMgYSBzaW5nbGUgYWN0aXZpdHkgd2l0aGluIHRoZSBub3JtYWwgc3lzdGVtIGVudmlyb25tZW50LgotICAgICAgWW91IGNhbm5vdCBpbmplY3QgYSBtb2NrIENvbnRleHQsIGJ1dCB5b3UgY2FuIGluamVjdCBtb2NrIEludGVudHMuIEFsc28sIHlvdSBjYW4gcnVuIGEgdGVzdCBtZXRob2Qgb24gdGhlIFVJIHRocmVhZCAodGhlIG1haW4gdGhyZWFkIG9mIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0KSwKLSAgICAgIHdoaWNoIGFsbG93cyB5b3UgdG8gc2VuZCBrZXkgYW5kIHRvdWNoIGV2ZW50cyB0byB0aGUgYXBwbGljYXRpb24gVUkuCisgICAgICAgIHtAbGluayBhbmRyb2lkLnRlc3QuQWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTJ9IC0gVGhpcyBjbGFzcyB0ZXN0cyBhIHNpbmdsZSBhY3Rpdml0eSAKKyAgICAgICAgd2l0aGluIHRoZSBub3JtYWwgc3lzdGVtIGVudmlyb25tZW50LiBZb3UgY2Fubm90IGluamVjdCBhIG1vY2sgQ29udGV4dCwgYnV0IHlvdSBjYW4gaW5qZWN0IAorICAgICAgICBtb2NrIEludGVudHMuIEFsc28sIHlvdSBjYW4gcnVuIGEgdGVzdCBtZXRob2Qgb24gdGhlIFVJIHRocmVhZCAodGhlIG1haW4gdGhyZWFkIG9mIHRoZSAKKyAgICAgICAgYXBwbGljYXRpb24gdW5kZXIgdGVzdCksIHdoaWNoIGFsbG93cyB5b3UgdG8gc2VuZCBrZXkgYW5kIHRvdWNoIGV2ZW50cyB0byB0aGUgCisgICAgICAgIGFwcGxpY2F0aW9uIFVJLgogICAgIDwvbGk+CiAgIDwvdWw+CiA8aDMgaWQ9IkFzc2VydCI+QXNzZXJ0IGNsYXNzZXM8L2gzPgogPHA+Ci0gIEFuZHJvaWQgYWxzbyBleHRlbmRzIHRoZSBKVW5pdCB7QGxpbmsganVuaXQuZnJhbWV3b3JrLkFzc2VydH0gY2xhc3MgdGhhdCBpcyB0aGUgYmFzaXMgb2YgPGNvZGU+YXNzZXJ0KCk8L2NvZGU+IGNhbGxzIGluIHRlc3RzLgotICBUaGVyZSBhcmUgdHdvIGV4dGVuc2lvbnMgdG8gdGhpcyBjbGFzcywge0BsaW5rIGFuZHJvaWQudGVzdC5Nb3JlQXNzZXJ0c30gYW5kIHtAbGluayBhbmRyb2lkLnRlc3QuVmlld0Fzc2VydHN9OgorICBBbmRyb2lkIGFsc28gZXh0ZW5kcyB0aGUgSlVuaXQge0BsaW5rIGp1bml0LmZyYW1ld29yay5Bc3NlcnR9IGNsYXNzIHRoYXQgaXMgdGhlIGJhc2lzIG9mIAorICA8Y29kZT5hc3NlcnQoKTwvY29kZT4gY2FsbHMgaW4gdGVzdHMuIFRoZXJlIGFyZSB0d28gZXh0ZW5zaW9ucyB0byB0aGlzIGNsYXNzLCAKKyAge0BsaW5rIGFuZHJvaWQudGVzdC5Nb3JlQXNzZXJ0c30gYW5kIHtAbGluayBhbmRyb2lkLnRlc3QuVmlld0Fzc2VydHN9OgogPC9wPgogPHVsPgogICA8bGk+Ci0gICAgVGhlIDxjb2RlPk1vcmVBc3NlcnRzPC9jb2RlPiBjbGFzcyBjb250YWlucyBtb3JlIHBvd2VyZnVsIGFzc2VydGlvbnMgc3VjaCBhcyB7QGxpbmsgYW5kcm9pZC50ZXN0Lk1vcmVBc3NlcnRzI2Fzc2VydENvbnRhaW5zUmVnZXh9IHRoYXQgZG9lcyByZWd1bGFyIGV4cHJlc3Npb24gbWF0Y2hpbmcuCisgICAgVGhlIDxjb2RlPk1vcmVBc3NlcnRzPC9jb2RlPiBjbGFzcyBjb250YWlucyBtb3JlIHBvd2VyZnVsIGFzc2VydGlvbnMgc3VjaCBhcyAKKyAgICB7QGxpbmsgYW5kcm9pZC50ZXN0Lk1vcmVBc3NlcnRzI2Fzc2VydENvbnRhaW5zUmVnZXh9IHRoYXQgZG9lcyByZWd1bGFyIGV4cHJlc3Npb24gbWF0Y2hpbmcuCiAgIDwvbGk+CiAgIDxsaT4KLSAgICBUaGUge0BsaW5rIGFuZHJvaWQudGVzdC5WaWV3QXNzZXJ0c30gY2xhc3MgY29udGFpbnMgdXNlZnVsIGFzc2VydGlvbnMgYWJvdXQgQW5kcm9pZCBWaWV3cywgc3VjaCBhcyB7QGxpbmsgYW5kcm9pZC50ZXN0LlZpZXdBc3NlcnRzI2Fzc2VydEhhc1NjcmVlbkNvb3JkaW5hdGVzfSB0aGF0IHRlc3RzIGlmIGEgVmlldyBoYXMgYSBwYXJ0aWN1bGFyIFggYW5kIFkKLSAgICBwb3NpdGlvbiBvbiB0aGUgdmlzaWJsZSBzY3JlZW4uIFRoZXNlIGFzc2VydHMgc2ltcGxpZnkgdGVzdGluZyBvZiBnZW9tZXRyeSBhbmQgYWxpZ25tZW50IGluIHRoZSBVSS4KKyAgICBUaGUge0BsaW5rIGFuZHJvaWQudGVzdC5WaWV3QXNzZXJ0c30gY2xhc3MgY29udGFpbnMgdXNlZnVsIGFzc2VydGlvbnMgYWJvdXQgQW5kcm9pZCBWaWV3cywgCisgICAgc3VjaCBhcyB7QGxpbmsgYW5kcm9pZC50ZXN0LlZpZXdBc3NlcnRzI2Fzc2VydEhhc1NjcmVlbkNvb3JkaW5hdGVzfSB0aGF0IHRlc3RzIGlmIGEgVmlldyBoYXMgYSAKKyAgICBwYXJ0aWN1bGFyIFggYW5kIFkgcG9zaXRpb24gb24gdGhlIHZpc2libGUgc2NyZWVuLiBUaGVzZSBhc3NlcnRzIHNpbXBsaWZ5IHRlc3Rpbmcgb2YgZ2VvbWV0cnkgCisgICAgYW5kIGFsaWdubWVudCBpbiB0aGUgVUkuCiAgIDwvbGk+CiA8L3VsPgogPGgzIGlkPSJNb2NrT2JqZWN0cyI+TW9jayBvYmplY3QgY2xhc3NlczwvaDM+CiAgIDxwPgotICAgIEFuZHJvaWQgaGFzIGNvbnZlbmllbmNlIGNsYXNzZXMgZm9yIGNyZWF0aW5nIG1vY2sgc3lzdGVtIG9iamVjdHMgc3VjaCBhcyBhcHBsaWNhdGlvbnMsIGNvbnRleHRzLCBjb250ZW50IHJlc29sdmVycywgYW5kIHJlc291cmNlcy4gQW5kcm9pZCBhbHNvIHByb3ZpZGVzCi0gICAgbWV0aG9kcyBpbiBzb21lIHRlc3QgY2xhc3NlcyBmb3IgY3JlYXRpbmcgbW9jayBJbnRlbnRzLiBVc2UgdGhlc2UgbW9ja3MgdG8gZmFjaWxpdGF0ZSBkZXBlbmRlbmN5IGluamVjdGlvbiwgc2luY2UgdGhleSBhcmUgZWFzaWVyIHRvIHVzZSB0aGFuIGNyZWF0aW5nIHRoZWlyCi0gICAgcmVhbCBjb3VudGVycGFydHMuIFRoZXNlIGNvbnZlbmllbmNlIGNsYXNzZXMgYXJlIGZvdW5kIGluIHtAbGluayBhbmRyb2lkLnRlc3R9IGFuZCB7QGxpbmsgYW5kcm9pZC50ZXN0Lm1vY2t9LiBUaGV5IGFyZToKKyAgICBBbmRyb2lkIGhhcyBjb252ZW5pZW5jZSBjbGFzc2VzIGZvciBjcmVhdGluZyBtb2NrIHN5c3RlbSBvYmplY3RzIHN1Y2ggYXMgYXBwbGljYXRpb25zLCBjb250ZXh0cywKKyAgICBjb250ZW50IHJlc29sdmVycywgYW5kIHJlc291cmNlcy4gQW5kcm9pZCBhbHNvIHByb3ZpZGVzIG1ldGhvZHMgaW4gc29tZSB0ZXN0IGNsYXNzZXMgZm9yIAorICAgIGNyZWF0aW5nIG1vY2sgSW50ZW50cy4gVXNlIHRoZXNlIG1vY2tzIHRvIGZhY2lsaXRhdGUgZGVwZW5kZW5jeSBpbmplY3Rpb24sIHNpbmNlIHRoZXkgYXJlIAorICAgIGVhc2llciB0byB1c2UgdGhhbiBjcmVhdGluZyB0aGVpciByZWFsIGNvdW50ZXJwYXJ0cy4gVGhlc2UgY29udmVuaWVuY2UgY2xhc3NlcyBhcmUgZm91bmQgaW4gCisgICAge0BsaW5rIGFuZHJvaWQudGVzdH0gYW5kIHtAbGluayBhbmRyb2lkLnRlc3QubW9ja30uIFRoZXkgYXJlOgogICA8L3A+CiAgICAgPHVsPgogICAgICAgPGxpPgotICAgICAgICB7QGxpbmsgYW5kcm9pZC50ZXN0Lklzb2xhdGVkQ29udGV4dH0gLSBNb2NrcyBhIENvbnRleHQgc28gdGhhdCB0aGUgYXBwbGljYXRpb24gdXNpbmcgaXQgcnVucyBpbiBpc29sYXRpb24uCi0gICAgICAgIEF0IHRoZSBzYW1lIHRpbWUsIGl0IGhhcyBlbm91Z2ggc3R1YiBjb2RlIHRvIHNhdGlzZnkgT1MgY29kZSB0aGF0IHRyaWVzIHRvIGNvbW11bmljYXRlIHdpdGggY29udGV4dHMuIFRoaXMgY2xhc3MgaXMgdXNlZnVsIGluIHVuaXQgdGVzdGluZy4KKyAgICAgICAge0BsaW5rIGFuZHJvaWQudGVzdC5Jc29sYXRlZENvbnRleHR9IC0gTW9ja3MgYSBDb250ZXh0IHNvIHRoYXQgdGhlIGFwcGxpY2F0aW9uIHVzaW5nIGl0IAorICAgICAgICBydW5zIGluIGlzb2xhdGlvbi4gQXQgdGhlIHNhbWUgdGltZSwgaXQgaGFzIGVub3VnaCBzdHViIGNvZGUgdG8gc2F0aXNmeSBPUyBjb2RlIHRoYXQgdHJpZXMgCisgICAgICAgIHRvIGNvbW11bmljYXRlIHdpdGggY29udGV4dHMuIFRoaXMgY2xhc3MgaXMgdXNlZnVsIGluIHVuaXQgdGVzdGluZy4KICAgICAgIDwvbGk+CiAgICAgICA8bGk+Ci0gICAgICAgIHtAbGluayBhbmRyb2lkLnRlc3QuUmVuYW1pbmdEZWxlZ2F0aW5nQ29udGV4dH0gLSBEZWxlZ2F0ZXMgbW9zdCBjb250ZXh0IGZ1bmN0aW9ucyB0byBhbiBleGlzdGluZywgbm9ybWFsIGNvbnRleHQgd2hpbGUgY2hhbmdpbmcgdGhlIGRlZmF1bHQgZmlsZSBhbmQgZGF0YWJhc2UKLSAgICAgICAgbmFtZXMgaW4gdGhlIGNvbnRleHQuIFVzZSB0aGlzIHRvIHRlc3QgZmlsZSBhbmQgZGF0YWJhc2Ugb3BlcmF0aW9ucyB3aXRoIGEgbm9ybWFsIHN5c3RlbSBjb250ZXh0LCB1c2luZyB0ZXN0IG5hbWVzLgorICAgICAgICB7QGxpbmsgYW5kcm9pZC50ZXN0LlJlbmFtaW5nRGVsZWdhdGluZ0NvbnRleHR9IC0gRGVsZWdhdGVzIG1vc3QgY29udGV4dCBmdW5jdGlvbnMgdG8gYW4gCisgICAgICAgIGV4aXN0aW5nLCBub3JtYWwgY29udGV4dCB3aGlsZSBjaGFuZ2luZyB0aGUgZGVmYXVsdCBmaWxlIGFuZCBkYXRhYmFzZQorICAgICAgICBuYW1lcyBpbiB0aGUgY29udGV4dC4gVXNlIHRoaXMgdG8gdGVzdCBmaWxlIGFuZCBkYXRhYmFzZSBvcGVyYXRpb25zIHdpdGggYSBub3JtYWwgc3lzdGVtIAorICAgICAgICBjb250ZXh0LCB1c2luZyB0ZXN0IG5hbWVzLgogICAgICAgPC9saT4KICAgICAgIDxsaT4KLSAgICAgICAge0BsaW5rIGFuZHJvaWQudGVzdC5tb2NrLk1vY2tBcHBsaWNhdGlvbn0sIHtAbGluayBhbmRyb2lkLnRlc3QubW9jay5Nb2NrQ29udGVudFJlc29sdmVyfSwge0BsaW5rIGFuZHJvaWQudGVzdC5tb2NrLk1vY2tDb250ZXh0fSwKLSAgICAgICAge0BsaW5rIGFuZHJvaWQudGVzdC5tb2NrLk1vY2tEaWFsb2dJbnRlcmZhY2V9LCB7QGxpbmsgYW5kcm9pZC50ZXN0Lm1vY2suTW9ja1BhY2thZ2VNYW5hZ2VyfSwKLSAgICAgICAge0BsaW5rIGFuZHJvaWQudGVzdC5tb2NrLk1vY2tSZXNvdXJjZXN9IC0gQ2xhc3NlcyB0aGF0IGNyZWF0ZSBtb2NrIEFuZHJvaWQgc3lzdGVtIG9iamVjdHMgZm9yIHVzZSBpbiB0ZXN0aW5nLiBUaGV5IGV4cG9zZSBvbmx5IHRob3NlIG1ldGhvZHMgdGhhdCBhcmUKLSAgICAgICAgdXNlZnVsIGluIG1hbmFnaW5nIHRoZSBvYmplY3QuIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9ucyBvZiB0aGVzZSBtZXRob2RzIHNpbXBseSB0aHJvdyBhbiBFeGNlcHRpb24uIFlvdSBhcmUgZXhwZWN0ZWQgdG8gZXh0ZW5kIHRoZSBjbGFzc2VzIGFuZAotICAgICAgICBvdmVycmlkZSBhbnkgbWV0aG9kcyB0aGF0IGFyZSBjYWxsZWQgYnkgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QuCisgICAgICAgIHtAbGluayBhbmRyb2lkLnRlc3QubW9jay5Nb2NrQXBwbGljYXRpb259LCB7QGxpbmsgYW5kcm9pZC50ZXN0Lm1vY2suTW9ja0NvbnRlbnRSZXNvbHZlcn0sIAorICAgICAgICB7QGxpbmsgYW5kcm9pZC50ZXN0Lm1vY2suTW9ja0NvbnRleHR9LCB7QGxpbmsgYW5kcm9pZC50ZXN0Lm1vY2suTW9ja0RpYWxvZ0ludGVyZmFjZX0sIAorICAgICAgICB7QGxpbmsgYW5kcm9pZC50ZXN0Lm1vY2suTW9ja1BhY2thZ2VNYW5hZ2VyfSwge0BsaW5rIGFuZHJvaWQudGVzdC5tb2NrLk1vY2tSZXNvdXJjZXN9IC0gCisgICAgICAgIENsYXNzZXMgdGhhdCBjcmVhdGUgbW9jayBBbmRyb2lkIHN5c3RlbSBvYmplY3RzIGZvciB1c2UgaW4gdGVzdGluZy4gVGhleSBleHBvc2Ugb25seSB0aG9zZSAKKyAgICAgICAgbWV0aG9kcyB0aGF0IGFyZSB1c2VmdWwgaW4gbWFuYWdpbmcgdGhlIG9iamVjdC4gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb25zIG9mIHRoZXNlIG1ldGhvZHMKKyAgICAgICAgc2ltcGx5IHRocm93IGFuIEV4Y2VwdGlvbi4gWW91IGFyZSBleHBlY3RlZCB0byBleHRlbmQgdGhlIGNsYXNzZXMgYW5kIG92ZXJyaWRlIGFueSBtZXRob2RzICcKKyAgICAgICAgdGhhdCBhcmUgY2FsbGVkIGJ5IHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0LgogICAgICAgPC9saT4KICAgICA8L3VsPgogPGgzIGlkPSJJbnN0cnVtZW50YXRpb25UZXN0UnVubmVyIj5JbnN0cnVtZW50YXRpb24gVGVzdCBSdW5uZXI8L2gzPgogPHA+CiAgIEFuZHJvaWQgcHJvdmlkZXMgYSBjdXN0b20gY2xhc3MgZm9yIHJ1bm5pbmcgdGVzdHMgd2l0aCBpbnN0cnVtZW50YXRpb24gY2FsbGVkIGNhbGxlZAogICB7QGxpbmsgYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RSdW5uZXJ9LiBUaGlzIGNsYXNzCi0gIGNvbnRyb2xzIG9mIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0LCBydW5zIHRoZSB0ZXN0IGFwcGxpY2F0aW9uIGFuZCB0aGUgbWFpbiBhcHBsaWNhdGlvbiBpbiB0aGUgc2FtZSBwcm9jZXNzLCBhbmQgcm91dGVzCi0gIHRlc3Qgb3V0cHV0IHRvIHRoZSBhcHByb3ByaWF0ZSBwbGFjZS4gVXNpbmcgaW5zdHJ1bWVudGF0aW9uIGlzIGtleSB0byB0aGUgYWJpbGl0eSBvZiA8Y29kZT5JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyPC9jb2RlPiB0byBjb250cm9sIHRoZSBlbnRpcmUgdGVzdAotICBlbnZpcm9ubWVudCBhdCBydW50aW1lLiBOb3RpY2UgdGhhdCB5b3UgdXNlIHRoaXMgdGVzdCBydW5uZXIgZXZlbiBpZiB5b3VyIHRlc3QgY2xhc3MgZG9lcyBub3QgaXRzZWxmIHVzZSBpbnN0cnVtZW50YXRpb24uCisgIGNvbnRyb2xzIG9mIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0LCBydW5zIHRoZSB0ZXN0IGFwcGxpY2F0aW9uIGFuZCB0aGUgbWFpbiBhcHBsaWNhdGlvbiBpbiB0aGUgCisgIHNhbWUgcHJvY2VzcywgYW5kIHJvdXRlcyB0ZXN0IG91dHB1dCB0byB0aGUgYXBwcm9wcmlhdGUgcGxhY2UuIFVzaW5nIGluc3RydW1lbnRhdGlvbiBpcyBrZXkgdG8gdGhlCisgIGFiaWxpdHkgb2YgPGNvZGU+SW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lcjwvY29kZT4gdG8gY29udHJvbCB0aGUgZW50aXJlIHRlc3QKKyAgZW52aXJvbm1lbnQgYXQgcnVudGltZS4gTm90aWNlIHRoYXQgeW91IHVzZSB0aGlzIHRlc3QgcnVubmVyIGV2ZW4gaWYgeW91ciB0ZXN0IGNsYXNzIGRvZXMgbm90IAorICBpdHNlbGYgdXNlIGluc3RydW1lbnRhdGlvbi4KIDwvcD4KIDxwPgotICBXaGVuIHlvdSBydW4gYSB0ZXN0IGFwcGxpY2F0aW9uLCB5b3UgZmlyc3QgcnVuIGEgc3lzdGVtIHV0aWxpdHkgY2FsbGVkIEFjdGl2aXR5IE1hbmFnZXIuIEFjdGl2aXR5IE1hbmFnZXIgdXNlcyB0aGUgaW5zdHJ1bWVudGF0aW9uIGZyYW1ld29yayB0byBzdGFydCBhbmQgY29udHJvbCB0aGUgdGVzdCBydW5uZXIsIHdoaWNoIGluIHR1cm4gdXNlcyBpbnN0cnVtZW50YXRpb24gdG8gc2h1dCBkb3duIGFueSBydW5uaW5nIGluc3RhbmNlcwotICBvZiB0aGUgbWFpbiBhcHBsaWNhdGlvbiwgc3RhcnRzIHRoZSB0ZXN0IGFwcGxpY2F0aW9uLCBhbmQgdGhlbiBzdGFydHMgdGhlIG1haW4gYXBwbGljYXRpb24gaW4gdGhlIHNhbWUgcHJvY2Vzcy4gVGhpcyBhbGxvd3MgdmFyaW91cyBhc3BlY3RzIG9mIHRoZSB0ZXN0IGFwcGxpY2F0aW9uIHRvIHdvcmsgZGlyZWN0bHkgd2l0aCB0aGUgbWFpbiBhcHBsaWNhdGlvbi4KKyAgV2hlbiB5b3UgcnVuIGEgdGVzdCBhcHBsaWNhdGlvbiwgeW91IGZpcnN0IHJ1biBhIHN5c3RlbSB1dGlsaXR5IGNhbGxlZCBBY3Rpdml0eSBNYW5hZ2VyLiBBY3Rpdml0eSAKKyAgTWFuYWdlciB1c2VzIHRoZSBpbnN0cnVtZW50YXRpb24gZnJhbWV3b3JrIHRvIHN0YXJ0IGFuZCBjb250cm9sIHRoZSB0ZXN0IHJ1bm5lciwgd2hpY2ggaW4gdHVybiAKKyAgdXNlcyBpbnN0cnVtZW50YXRpb24gdG8gc2h1dCBkb3duIGFueSBydW5uaW5nIGluc3RhbmNlcyBvZiB0aGUgbWFpbiBhcHBsaWNhdGlvbiwgc3RhcnRzIHRoZSB0ZXN0IAorICBhcHBsaWNhdGlvbiwgYW5kIHRoZW4gc3RhcnRzIHRoZSBtYWluIGFwcGxpY2F0aW9uIGluIHRoZSBzYW1lIHByb2Nlc3MuIFRoaXMgYWxsb3dzIHZhcmlvdXMgCisgIGFzcGVjdHMgb2YgdGhlIHRlc3QgYXBwbGljYXRpb24gdG8gd29yayBkaXJlY3RseSB3aXRoIHRoZSBtYWluIGFwcGxpY2F0aW9uLgogPC9wPgogPHA+Ci0gIElmIHlvdSBhcmUgZGV2ZWxvcGluZyBpbiBFY2xpcHNlLCB0aGUgQURUIHBsdWdpbiBhc3Npc3RzIHlvdSBpbiB0aGUgc2V0dXAgb2YgPGNvZGU+SW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lcjwvY29kZT4gb3Igb3RoZXIgdGVzdCBydW5uZXJzLgotICBUaGUgcGx1Z2luIFVJIHByb21wdHMgeW91IHRvIHNwZWNpZnkgdGhlIHRlc3QgcnVubmVyIGNsYXNzIHRvIHVzZSwgYXMgd2VsbCBhcyB0aGUgcGFja2FnZSBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0LgotICBUaGUgcGx1Z2luIHRoZW4gYWRkcyBhbiA8Y29kZT4mbHQ7aW5zdHJ1bWVudGF0aW9uJmd0OzwvY29kZT4gZWxlbWVudCB3aXRoIGFwcHJvcHJpYXRlIGF0dHJpYnV0ZXMgdG8gdGhlIG1hbmlmZXN0IGZpbGUgb2YgdGhlIHRlc3QgYXBwbGljYXRpb24uCi0gIEVjbGlwc2Ugd2l0aCBBRFQgYXV0b21hdGljYWxseSBzdGFydHMgYSB0ZXN0IGFwcGxpY2F0aW9uIHVuZGVyIHRoZSBjb250cm9sIG9mIEFjdGl2aXR5IE1hbmFnZXIgdXNpbmcgaW5zdHJ1bWVudGF0aW9uLAotICBhbmQgcmVkaXJlY3RzIHRoZSB0ZXN0IG91dHB1dCB0byB0aGUgRWNsaXBzZSB3aW5kb3cncyBKVW5pdCB2aWV3LgorICBJZiB5b3UgYXJlIGRldmVsb3BpbmcgaW4gRWNsaXBzZSwgdGhlIEFEVCBwbHVnaW4gYXNzaXN0cyB5b3UgaW4gdGhlIHNldHVwIG9mIAorICA8Y29kZT5JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyPC9jb2RlPiBvciBvdGhlciB0ZXN0IHJ1bm5lcnMuIFRoZSBwbHVnaW4gVUkgcHJvbXB0cyB5b3UgdG8gc3BlY2lmeSAKKyAgdGhlIHRlc3QgcnVubmVyIGNsYXNzIHRvIHVzZSwgYXMgd2VsbCBhcyB0aGUgcGFja2FnZSBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0LgorICBUaGUgcGx1Z2luIHRoZW4gYWRkcyBhbiA8Y29kZT4mbHQ7aW5zdHJ1bWVudGF0aW9uJmd0OzwvY29kZT4gZWxlbWVudCB3aXRoIGFwcHJvcHJpYXRlIGF0dHJpYnV0ZXMgCisgIHRvIHRoZSBtYW5pZmVzdCBmaWxlIG9mIHRoZSB0ZXN0IGFwcGxpY2F0aW9uLiBFY2xpcHNlIHdpdGggQURUIGF1dG9tYXRpY2FsbHkgc3RhcnRzIGEgdGVzdCAKKyAgYXBwbGljYXRpb24gdW5kZXIgdGhlIGNvbnRyb2wgb2YgQWN0aXZpdHkgTWFuYWdlciB1c2luZyBpbnN0cnVtZW50YXRpb24sIGFuZCByZWRpcmVjdHMgdGhlIHRlc3QgCisgIG91dHB1dCB0byB0aGUgRWNsaXBzZSB3aW5kb3cncyBKVW5pdCB2aWV3LgogPC9wPgogPHA+CiAgIElmIHlvdSBwcmVmZXIgd29ya2luZyBmcm9tIHRoZSBjb21tYW5kIGxpbmUsIHlvdSBjYW4gdXNlIEFudCBhbmQgdGhlIDxjb2RlPmFuZHJvaWQ8L2NvZGU+CkBAIC0yODksNjggKzMzOCwxMDUgQEAKIDwvcD4KIDxoMiBpZD0iVGVzdEVudmlyb21lbnQiPldvcmtpbmcgaW4gdGhlIFRlc3QgRW52aXJvbm1lbnQ8L2gyPgogPHA+Ci0gICAgVGhlIHRlc3RzIGZvciBhbiBBbmRyb2lkIGFwcGxpY2F0aW9uIGFyZSBjb250YWluZWQgaW4gYSB0ZXN0IGFwcGxpY2F0aW9uLCB3aGljaCBpdHNlbGYgaXMgYW4gQW5kcm9pZCBhcHBsaWNhdGlvbi4gQSB0ZXN0IGFwcGxpY2F0aW9uIHJlc2lkZXMgaW4gYSBzZXBhcmF0ZSBBbmRyb2lkIHByb2plY3QgdGhhdCBoYXMgdGhlCi0gICAgc2FtZSBmaWxlcyBhbmQgZGlyZWN0b3JpZXMgYXMgYSByZWd1bGFyIEFuZHJvaWQgYXBwbGljYXRpb24uIFRoZSB0ZXN0IHByb2plY3QgaXMgbGlua2VkIHRvIHRoZSBwcm9qZWN0IG9mIHRoZSBhcHBsaWNhdGlvbiBpdCB0ZXN0cwotICAgIChrbm93biBhcyB0aGUgYXBwbGljYXRpb24gdW5kZXIgdGVzdCkgYnkgaXRzIG1hbmlmZXN0IGZpbGUuCisgICAgVGhlIHRlc3RzIGZvciBhbiBBbmRyb2lkIGFwcGxpY2F0aW9uIGFyZSBjb250YWluZWQgaW4gYSB0ZXN0IGFwcGxpY2F0aW9uLCB3aGljaCBpdHNlbGYgaXMgYW4gCisgICAgQW5kcm9pZCBhcHBsaWNhdGlvbi4gQSB0ZXN0IGFwcGxpY2F0aW9uIHJlc2lkZXMgaW4gYSBzZXBhcmF0ZSBBbmRyb2lkIHByb2plY3QgdGhhdCBoYXMgdGhlCisgICAgc2FtZSBmaWxlcyBhbmQgZGlyZWN0b3JpZXMgYXMgYSByZWd1bGFyIEFuZHJvaWQgYXBwbGljYXRpb24uIFRoZSB0ZXN0IHByb2plY3QgaXMgbGlua2VkIHRvIHRoZSAKKyAgICBwcm9qZWN0IG9mIHRoZSBhcHBsaWNhdGlvbiBpdCB0ZXN0cyAoa25vd24gYXMgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QpIGJ5IGl0cyBtYW5pZmVzdCBmaWxlLgogPC9wPgogPHA+CiAgICAgRWFjaCB0ZXN0IGFwcGxpY2F0aW9uIGNvbnRhaW5zIG9uZSBvciBtb3JlIHRlc3QgY2FzZSBjbGFzc2VzIGJhc2VkIG9uIGFuIEFuZHJvaWQgY2xhc3MgZm9yIGEKLSAgICBwYXJ0aWN1bGFyIHR5cGUgb2YgY29tcG9uZW50LiBUaGUgdGVzdCBjYXNlIGNsYXNzIGNvbnRhaW5zIG1ldGhvZHMgdGhhdCBkZWZpbmUgdGVzdHMgb24gc29tZSBwYXJ0IG9mIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0LiBXaGVuIHlvdSBydW4gdGhlIHRlc3QgYXBwbGljYXRpb24sIEFuZHJvaWQKLSAgICBzdGFydHMgaXQsIGxvYWRzIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0IGludG8gdGhlIHNhbWUgcHJvY2VzcywgYW5kIHRoZW4gaW52b2tlcyBlYWNoIG1ldGhvZCBpbiB0aGUgdGVzdCBjYXNlIGNsYXNzLgorICAgIHBhcnRpY3VsYXIgdHlwZSBvZiBjb21wb25lbnQuIFRoZSB0ZXN0IGNhc2UgY2xhc3MgY29udGFpbnMgbWV0aG9kcyB0aGF0IGRlZmluZSB0ZXN0cyBvbiBzb21lIAorICAgIHBhcnQgb2YgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QuIFdoZW4geW91IHJ1biB0aGUgdGVzdCBhcHBsaWNhdGlvbiwgQW5kcm9pZAorICAgIHN0YXJ0cyBpdCwgbG9hZHMgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QgaW50byB0aGUgc2FtZSBwcm9jZXNzLCBhbmQgdGhlbiBpbnZva2VzIGVhY2ggbWV0aG9kIAorICAgIGluIHRoZSB0ZXN0IGNhc2UgY2xhc3MuCiA8L3A+CiA8cD4KLSAgICBUaGUgdG9vbHMgYW5kIHByb2NlZHVyZXMgeW91IHVzZSB3aXRoIHRlc3RpbmcgZGVwZW5kIG9uIHRoZSBkZXZlbG9wbWVudCBlbnZpcm9ubWVudCB5b3UgYXJlIHVzaW5nLiBJZiB5b3UgdXNlIEVjbGlwc2UsIHRoZW4gdGhlIEFEVCBwbHVnIGluIGZvciBFY2xpcHNlIHByb3ZpZGVzIHRvb2xzIHRoYXQKLSAgICBhbGxvdyB5b3UgdG8gZGV2ZWxvcCBhbmQgcnVuIHRlc3RzIGVudGlyZWx5IHdpdGhpbiBFY2xpcHNlLiBUaGlzIGlzIGRvY3VtZW50ZWQgaW4gdGhlIHRvcGljIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL3Rlc3RpbmcvdGVzdGluZ19lY2xpcHNlLmh0bWwiPlRlc3RpbmcgaW4gRWNsaXBzZSwgd2l0aCBBRFQ8L2E+LgotICAgIElmIHlvdSB1c2UgYW5vdGhlciBkZXZlbG9wbWVudCBlbnZpcm9ubWVudCwgdGhlbiB5b3UgdXNlIEFuZHJvaWQncyBjb21tYW5kLWxpbmUgdG9vbHMsIGFzIGRvY3VtZW50ZWQgaW4gdGhlIHRvcGljIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL3Rlc3RpbmcvdGVzdGluZ19vdGhlcmlkZS5odG1sIj5UZXN0aW5nIGluIE90aGVyIElERXM8L2E+LgorICAgIFRoZSB0b29scyBhbmQgcHJvY2VkdXJlcyB5b3UgdXNlIHdpdGggdGVzdGluZyBkZXBlbmQgb24gdGhlIGRldmVsb3BtZW50IGVudmlyb25tZW50IHlvdSBhcmUgCisgICAgdXNpbmcuIElmIHlvdSB1c2UgRWNsaXBzZSwgdGhlbiB0aGUgQURUIHBsdWcgaW4gZm9yIEVjbGlwc2UgcHJvdmlkZXMgdG9vbHMgdGhhdCBhbGxvdyB5b3UgdG8gCisgICAgZGV2ZWxvcCBhbmQgcnVuIHRlc3RzIGVudGlyZWx5IHdpdGhpbiBFY2xpcHNlLiBUaGlzIGlzIGRvY3VtZW50ZWQgaW4gdGhlIHRvcGljIAorICAgIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL3Rlc3RpbmcvdGVzdGluZ19lY2xpcHNlLmh0bWwiPgorICAgIFRlc3RpbmcgaW4gRWNsaXBzZSwgd2l0aCBBRFQ8L2E+LiBJZiB5b3UgdXNlIGFub3RoZXIgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQsIHRoZW4geW91IHVzZSAKKyAgICBBbmRyb2lkJ3MgY29tbWFuZC1saW5lIHRvb2xzLCBhcyBkb2N1bWVudGVkIGluIHRoZSB0b3BpYyAKKyAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvZGV2ZWxvcGluZy90ZXN0aW5nL3Rlc3Rpbmdfb3RoZXJpZGUuaHRtbCI+VGVzdGluZyBpbiBPdGhlciBJREVzPC9hPi4KIDwvcD4KIDxoMyBpZD0iVGVzdFByb2plY3RzIj5Xb3JraW5nIHdpdGggdGVzdCBwcm9qZWN0czwvaDM+CiA8cD4KLSAgICBUbyBzdGFydCB0ZXN0aW5nIGFuIEFuZHJvaWQgYXBwbGljYXRpb24sIHlvdSBjcmVhdGUgYSB0ZXN0IHByb2plY3QgZm9yIGl0IHVzaW5nIEFuZHJvaWQgdG9vbHMuIFRoZSB0b29scyBjcmVhdGUgdGhlIHByb2plY3QgZGlyZWN0b3J5IGFuZCB0aGUgZmlsZXMgYW5kIHN1YmRpcmVjdG9yaWVzIG5lZWRlZC4KLSAgICBUaGUgdG9vbHMgYWxzbyBjcmVhdGUgYSBtYW5pZmVzdCBmaWxlIHRoYXQgbGlua3MgdGhlIGFwcGxpY2F0aW9uIGluIHRoZSB0ZXN0IHByb2plY3QgdG8gdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QuIFRoZSBwcm9jZWR1cmUgZm9yIGNyZWF0aW5nIGEgdGVzdCBwcm9qZWN0IGluIEVjbGlwc2Ugd2l0aAotICAgIEFEVCBpcyBkb2N1bWVudGVkIGluIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL3Rlc3RpbmcvdGVzdGluZ19lY2xpcHNlLmh0bWwiPlRlc3RpbmcgaW4gRWNsaXBzZSwgd2l0aCBBRFQ8L2E+LiBUaGUgcHJvY2VkdXJlIGZvciBjcmVhdGluZyBhIHRlc3QgcHJvamVjdCBmb3IgdXNlIHdpdGggZGV2ZWxvcG1lbnQKLSAgICB0b29scyBvdGhlciB0aGFuIEVjbGlwc2UgaXMgZG9jdW1lbnRlZCBpbiA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvZGV2ZWxvcGluZy90ZXN0aW5nL3Rlc3Rpbmdfb3RoZXJpZGUuaHRtbCI+VGVzdGluZyBpbiBPdGhlciBJREVzPC9hPi4KKyAgICBUbyBzdGFydCB0ZXN0aW5nIGFuIEFuZHJvaWQgYXBwbGljYXRpb24sIHlvdSBjcmVhdGUgYSB0ZXN0IHByb2plY3QgZm9yIGl0IHVzaW5nIEFuZHJvaWQgdG9vbHMuIAorICAgIFRoZSB0b29scyBjcmVhdGUgdGhlIHByb2plY3QgZGlyZWN0b3J5IGFuZCB0aGUgZmlsZXMgYW5kIHN1YmRpcmVjdG9yaWVzIG5lZWRlZC4KKyAgICBUaGUgdG9vbHMgYWxzbyBjcmVhdGUgYSBtYW5pZmVzdCBmaWxlIHRoYXQgbGlua3MgdGhlIGFwcGxpY2F0aW9uIGluIHRoZSB0ZXN0IHByb2plY3QgdG8gdGhlIAorICAgIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QuIFRoZSBwcm9jZWR1cmUgZm9yIGNyZWF0aW5nIGEgdGVzdCBwcm9qZWN0IGluIEVjbGlwc2Ugd2l0aCBBRFQgaXMgCisgICAgZG9jdW1lbnRlZCBpbiA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvZGV2ZWxvcGluZy90ZXN0aW5nL3Rlc3RpbmdfZWNsaXBzZS5odG1sIj4KKyAgICBUZXN0aW5nIGluIEVjbGlwc2UsIHdpdGggQURUPC9hPi4gVGhlIHByb2NlZHVyZSBmb3IgY3JlYXRpbmcgYSB0ZXN0IHByb2plY3QgZm9yIHVzZSB3aXRoIAorICAgIGRldmVsb3BtZW50IHRvb2xzIG90aGVyIHRoYW4gRWNsaXBzZSBpcyBkb2N1bWVudGVkIGluIAorICAgIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL3Rlc3RpbmcvdGVzdGluZ19vdGhlcmlkZS5odG1sIj5UZXN0aW5nIGluIE90aGVyIElERXM8L2E+LgogPC9wPgogPGgzIGlkPSJUZXN0Q2xhc3NlcyI+V29ya2luZyB3aXRoIHRlc3QgY2FzZSBjbGFzc2VzPC9oMz4KIDxwPgotICAgIEEgdGVzdCBhcHBsaWNhdGlvbiBjb250YWlucyBvbmUgb3IgbW9yZSB0ZXN0IGNhc2UgY2xhc3NlcyB0aGF0IGV4dGVuZCBhbiBBbmRyb2lkIHRlc3QgY2FzZSBjbGFzcy4gWW91IGNob29zZSBhIHRlc3QgY2FzZSBjbGFzcyBiYXNlZCBvbiB0aGUgdHlwZSBvZiBBbmRyb2lkIGNvbXBvbmVudCB5b3UgYXJlIHRlc3RpbmcgYW5kIHRoZQotICAgIHRlc3RzIHlvdSBhcmUgZG9pbmcuIEEgdGVzdCBhcHBsaWNhdGlvbiBjYW4gdGVzdCBkaWZmZXJlbnQgY29tcG9uZW50cywgYnV0IGVhY2ggdGVzdCBjYXNlIGNsYXNzIGlzIGRlc2lnbmVkIHRvIHRlc3QgYSBzaW5nbGUgdHlwZSBvZiBjb21wb25lbnQuCi0gICAgVGhlIEFuZHJvaWQgdGVzdCBjYXNlIGNsYXNzZXMgYXJlIGRlc2NyaWJlZCBpbiB0aGUgc2VjdGlvbiA8YSBocmVmPSIjVGVzdEFQSSI+VGhlIFRlc3RpbmcgQVBJPC9hPi4KKyAgICBBIHRlc3QgYXBwbGljYXRpb24gY29udGFpbnMgb25lIG9yIG1vcmUgdGVzdCBjYXNlIGNsYXNzZXMgdGhhdCBleHRlbmQgYW4gQW5kcm9pZCB0ZXN0IGNhc2UgCisgICAgY2xhc3MuIFlvdSBjaG9vc2UgYSB0ZXN0IGNhc2UgY2xhc3MgYmFzZWQgb24gdGhlIHR5cGUgb2YgQW5kcm9pZCBjb21wb25lbnQgeW91IGFyZSB0ZXN0aW5nIGFuZCAKKyAgICB0aGUgdGVzdHMgeW91IGFyZSBkb2luZy4gQSB0ZXN0IGFwcGxpY2F0aW9uIGNhbiB0ZXN0IGRpZmZlcmVudCBjb21wb25lbnRzLCBidXQgZWFjaCB0ZXN0IGNhc2UgCisgICAgY2xhc3MgaXMgZGVzaWduZWQgdG8gdGVzdCBhIHNpbmdsZSB0eXBlIG9mIGNvbXBvbmVudC4gVGhlIEFuZHJvaWQgdGVzdCBjYXNlIGNsYXNzZXMgYXJlIAorICAgIGRlc2NyaWJlZCBpbiB0aGUgc2VjdGlvbiA8YSBocmVmPSIjVGVzdEFQSSI+VGhlIFRlc3RpbmcgQVBJPC9hPi4KIDwvcD4KIDxwPgotICAgIFNvbWUgQW5kcm9pZCBjb21wb25lbnRzIGhhdmUgbW9yZSB0aGFuIG9uZSBhc3NvY2lhdGVkIHRlc3QgY2FzZSBjbGFzcy4gSW4gdGhpcyBjYXNlLCB5b3UgY2hvb3NlIGFtb25nIHRoZSBhdmFpbGFibGUgY2xhc3NlcyBiYXNlZCBvbiB0aGUgdHlwZSBvZiB0ZXN0cyB5b3Ugd2FudCB0byBkby4gRm9yIGFjdGl2aXRpZXMsCi0gICAgZm9yIGV4YW1wbGUsIHlvdSBoYXZlIHRoZSBjaG9pY2Ugb2YgZWl0aGVyIHtAbGluayBhbmRyb2lkLnRlc3QuQWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTJ9IG9yIHtAbGluayBhbmRyb2lkLnRlc3QuQWN0aXZpdHlVbml0VGVzdENhc2V9LgorICAgIFNvbWUgQW5kcm9pZCBjb21wb25lbnRzIGhhdmUgbW9yZSB0aGFuIG9uZSBhc3NvY2lhdGVkIHRlc3QgY2FzZSBjbGFzcy4gSW4gdGhpcyBjYXNlLCB5b3UgY2hvb3NlIAorICAgIGFtb25nIHRoZSBhdmFpbGFibGUgY2xhc3NlcyBiYXNlZCBvbiB0aGUgdHlwZSBvZiB0ZXN0cyB5b3Ugd2FudCB0byBkby4gRm9yIGFjdGl2aXRpZXMsIGZvciAKKyAgICBleGFtcGxlLCB5b3UgaGF2ZSB0aGUgY2hvaWNlIG9mIGVpdGhlciB7QGxpbmsgYW5kcm9pZC50ZXN0LkFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uVGVzdENhc2UyfSBvciAKKyAgICB7QGxpbmsgYW5kcm9pZC50ZXN0LkFjdGl2aXR5VW5pdFRlc3RDYXNlfS4KIDxwPgotICAgIDxjb2RlPkFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uVGVzdENhc2UyPC9jb2RlPiBpcyBkZXNpZ25lZCB0byBkbyBmdW5jdGlvbmFsIHRlc3RpbmcsIHNvIGl0IHRlc3RzIGFjdGl2aXRpZXMgaW4gYSBub3JtYWwgc3lzdGVtIGluZnJhc3RydWN0dXJlLiBZb3UgY2FuIGluamVjdCBtb2NrZWQgSW50ZW50cywgYnV0IG5vdAorICAgIDxjb2RlPkFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uVGVzdENhc2UyPC9jb2RlPiBpcyBkZXNpZ25lZCB0byBkbyBmdW5jdGlvbmFsIHRlc3RpbmcsIHNvIGl0IHRlc3RzIAorICAgIGFjdGl2aXRpZXMgaW4gYSBub3JtYWwgc3lzdGVtIGluZnJhc3RydWN0dXJlLiBZb3UgY2FuIGluamVjdCBtb2NrZWQgSW50ZW50cywgYnV0IG5vdAogICAgIG1vY2tlZCBDb250ZXh0cy4gSW4gZ2VuZXJhbCwgeW91IGNhbid0IG1vY2sgZGVwZW5kZW5jaWVzIGZvciB0aGUgYWN0aXZpdHkgdW5kZXIgdGVzdC4KIDwvcD4KIDxwPgotICAgIEluIGNvbXBhcmlzb24sIDxjb2RlPkFjdGl2aXR5VW5pdFRlc3RDYXNlPC9jb2RlPiBpcyBkZXNpZ25lZCBmb3IgdW5pdCB0ZXN0aW5nLCBzbyBpdCB0ZXN0cyBhY3Rpdml0aWVzIGluIGFuIGlzb2xhdGVkIHN5c3RlbSBpbmZyYXN0cnVjdHVyZS4gWW91IGNhbiBpbmplY3QgbW9ja2VkIG9yIHdyYXBwZXJlZCBkZXBlbmRlbmNpZXMgZm9yCi0gICAgdGhlIGFjdGl2aXR5IHVuZGVyIHRlc3QsIHBhcnRpY3VsYXJseSBtb2NrZWQgQ29udGV4dHMuIE9uIHRoZSBvdGhlciBoYW5kLCB3aGVuIHlvdSB1c2UgdGhpcyB0ZXN0IGNhc2UgY2xhc3MgdGhlIGFjdGl2aXR5IHVuZGVyIHRlc3QgcnVucyBpbiBpc29sYXRpb24gYW5kIGNhbid0IGludGVyYWN0IHdpdGggb3RoZXIgYWN0aXZpdGllcy4KKyAgICBJbiBjb21wYXJpc29uLCA8Y29kZT5BY3Rpdml0eVVuaXRUZXN0Q2FzZTwvY29kZT4gaXMgZGVzaWduZWQgZm9yIHVuaXQgdGVzdGluZywgc28gaXQgdGVzdHMgCisgICAgYWN0aXZpdGllcyBpbiBhbiBpc29sYXRlZCBzeXN0ZW0gaW5mcmFzdHJ1Y3R1cmUuIFlvdSBjYW4gaW5qZWN0IG1vY2tlZCBvciB3cmFwcGVyZWQgCisgICAgZGVwZW5kZW5jaWVzIGZvciB0aGUgYWN0aXZpdHkgdW5kZXIgdGVzdCwgcGFydGljdWxhcmx5IG1vY2tlZCBDb250ZXh0cy4gT24gdGhlIG90aGVyIGhhbmQsIAorICAgIHdoZW4geW91IHVzZSB0aGlzIHRlc3QgY2FzZSBjbGFzcyB0aGUgYWN0aXZpdHkgdW5kZXIgdGVzdCBydW5zIGluIGlzb2xhdGlvbiBhbmQgY2FuJ3QgaW50ZXJhY3QgCisgICAgd2l0aCBvdGhlciBhY3Rpdml0aWVzLgogPC9wPgogPHA+Ci0gICAgQXMgYSBydWxlIG9mIHRodW1iLCBpZiB5b3Ugd2FudGVkIHRvIHRlc3QgYW4gYWN0aXZpdHkncyBpbnRlcmFjdGlvbiB3aXRoIHRoZSByZXN0IG9mIEFuZHJvaWQsIHlvdSB3b3VsZCB1c2UgPGNvZGU+QWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTI8L2NvZGU+LiBJZiB5b3Ugd2FudGVkIHRvIGRvIHJlZ3Jlc3Npb24gdGVzdGluZwotICAgIG9uIGFuIGFjdGl2aXR5LCB5b3Ugd291bGQgdXNlIDxjb2RlPkFjdGl2aXR5VW5pdFRlc3RDYXNlPC9jb2RlPi4KKyAgICBBcyBhIHJ1bGUgb2YgdGh1bWIsIGlmIHlvdSB3YW50ZWQgdG8gdGVzdCBhbiBhY3Rpdml0eSdzIGludGVyYWN0aW9uIHdpdGggdGhlIHJlc3Qgb2YgQW5kcm9pZCwgCisgICAgeW91IHdvdWxkIHVzZSA8Y29kZT5BY3Rpdml0eUluc3RydW1lbnRhdGlvblRlc3RDYXNlMjwvY29kZT4uIElmIHlvdSB3YW50ZWQgdG8gZG8gcmVncmVzc2lvbiAKKyAgICB0ZXN0aW5nIG9uIGFuIGFjdGl2aXR5LCB5b3Ugd291bGQgdXNlIDxjb2RlPkFjdGl2aXR5VW5pdFRlc3RDYXNlPC9jb2RlPi4KIDwvcD4KIDxoMyBpZD0iVGVzdHMiPldvcmtpbmcgd2l0aCB0ZXN0IG1ldGhvZHM8L2gzPgogPHA+Ci0gICAgRWFjaCB0ZXN0IGNhc2UgY2xhc3MgcHJvdmlkZXMgbWV0aG9kcyB0aGF0IHlvdSB1c2UgdG8gc2V0IHVwIHRoZSB0ZXN0IGVudmlyb25tZW50IGFuZCBjb250cm9sIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0LiBGb3IgZXhhbXBsZSwgYWxsIHRlc3QgY2FzZSBjbGFzc2VzIHByb3ZpZGUgdGhlIEpVbml0IHtAbGluayBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKSBzZXRVcCgpfQotICAgIG1ldGhvZCB0aGF0IHlvdSBjYW4gb3ZlcnJpZGUgdG8gc2V0IHVwIGZpeHR1cmVzLiBJbiBhZGRpdGlvbiwgeW91IGFkZCBtZXRob2RzIHRvIHRoZSBjbGFzcyB0byBkZWZpbmUgaW5kaXZpZHVhbCB0ZXN0cy4gRWFjaCBtZXRob2QgeW91IGFkZCBpcyBydW4gb25jZSBlYWNoIHRpbWUgeW91IHJ1biB0aGUgdGVzdCBhcHBsaWNhdGlvbi4gSWYgeW91IG92ZXJyaWRlIHRoZSA8Y29kZT5zZXRVcCgpPC9jb2RlPgotICAgIG1ldGhvZCwgaXQgcnVucyBiZWZvcmUgZWFjaCBvZiB5b3VyIG1ldGhvZHMuIFNpbWlsYXJseSwgdGhlIEpVbml0IHtAbGluayBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKSB0ZWFyRG93bigpfSBtZXRob2QgaXMgcnVuIG9uY2UgYWZ0ZXIgZWFjaCBvZiB5b3VyIG1ldGhvZHMuCisgICAgRWFjaCB0ZXN0IGNhc2UgY2xhc3MgcHJvdmlkZXMgbWV0aG9kcyB0aGF0IHlvdSB1c2UgdG8gc2V0IHVwIHRoZSB0ZXN0IGVudmlyb25tZW50IGFuZCBjb250cm9sIAorICAgIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0LiBGb3IgZXhhbXBsZSwgYWxsIHRlc3QgY2FzZSBjbGFzc2VzIHByb3ZpZGUgdGhlIEpVbml0IAorICAgIHtAbGluayBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKSBzZXRVcCgpfSBtZXRob2QgdGhhdCB5b3UgY2FuIG92ZXJyaWRlIHRvIHNldCB1cCAKKyAgICBmaXh0dXJlcy4gSW4gYWRkaXRpb24sIHlvdSBhZGQgbWV0aG9kcyB0byB0aGUgY2xhc3MgdG8gZGVmaW5lIGluZGl2aWR1YWwgdGVzdHMuIEVhY2ggbWV0aG9kIHlvdQorICAgIGFkZCBpcyBydW4gb25jZSBlYWNoIHRpbWUgeW91IHJ1biB0aGUgdGVzdCBhcHBsaWNhdGlvbi4gSWYgeW91IG92ZXJyaWRlIHRoZSA8Y29kZT5zZXRVcCgpPC9jb2RlPgorICAgIG1ldGhvZCwgaXQgcnVucyBiZWZvcmUgZWFjaCBvZiB5b3VyIG1ldGhvZHMuIFNpbWlsYXJseSwgdGhlIEpVbml0IAorICAgIHtAbGluayBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKSB0ZWFyRG93bigpfSBtZXRob2QgaXMgcnVuIG9uY2UgYWZ0ZXIgZWFjaCBvZiAKKyAgICB5b3VyIG1ldGhvZHMuCiA8L3A+CiA8cD4KLSAgICBUaGUgdGVzdCBjYXNlIGNsYXNzZXMgZ2l2ZSB5b3Ugc3Vic3RhbnRpYWwgY29udHJvbCBvdmVyIHN0YXJ0aW5nIGFuZCBzdG9wcGluZyBjb21wb25lbnRzLiBGb3IgdGhpcyByZWFzb24sIHlvdSBoYXZlIHRvIHNwZWNpZmljYWxseSB0ZWxsIEFuZHJvaWQgdG8gc3RhcnQgYSBjb21wb25lbnQgYmVmb3JlIHlvdSBydW4gdGVzdHMgYWdhaW5zdCBpdC4gRm9yIGV4YW1wbGUsIHlvdSB1c2UgdGhlCi0gICAge0BsaW5rIGFuZHJvaWQudGVzdC5BY3Rpdml0eUluc3RydW1lbnRhdGlvblRlc3RDYXNlMiNnZXRBY3Rpdml0eSgpfSBtZXRob2QgdG8gc3RhcnQgdGhlIGFjdGl2aXR5IHVuZGVyIHRlc3QuIFlvdSBjYW4gY2FsbCB0aGlzIG1ldGhvZCBvbmNlIGR1cmluZyB0aGUgZW50aXJlIHRlc3QgY2FzZSwgb3Igb25jZSBmb3IgZWFjaCB0ZXN0IG1ldGhvZC4gWW91IGNhbiBldmVuIGRlc3Ryb3kgdGhlCi0gICAgYWN0aXZpdHkgdW5kZXIgdGVzdCBieSBjYWxsaW5nIGl0cyB7QGxpbmsgYW5kcm9pZC5hcHAuQWN0aXZpdHkjZmluaXNoKCl9IG1ldGhvZCBhbmQgdGhlbiByZXN0YXJ0IGl0IHdpdGggPGNvZGU+Z2V0QWN0aXZpdHkoKTwvY29kZT4gd2l0aGluIGEgc2luZ2xlIHRlc3QgbWV0aG9kLgorICAgIFRoZSB0ZXN0IGNhc2UgY2xhc3NlcyBnaXZlIHlvdSBzdWJzdGFudGlhbCBjb250cm9sIG92ZXIgc3RhcnRpbmcgYW5kIHN0b3BwaW5nIGNvbXBvbmVudHMuIEZvciAKKyAgICB0aGlzIHJlYXNvbiwgeW91IGhhdmUgdG8gc3BlY2lmaWNhbGx5IHRlbGwgQW5kcm9pZCB0byBzdGFydCBhIGNvbXBvbmVudCBiZWZvcmUgeW91IHJ1biB0ZXN0cyAKKyAgICBhZ2FpbnN0IGl0LiBGb3IgZXhhbXBsZSwgeW91IHVzZSB0aGUKKyAgICB7QGxpbmsgYW5kcm9pZC50ZXN0LkFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uVGVzdENhc2UyI2dldEFjdGl2aXR5KCl9IG1ldGhvZCB0byBzdGFydCB0aGUgYWN0aXZpdHkKKyAgICB1bmRlciB0ZXN0LiBZb3UgY2FuIGNhbGwgdGhpcyBtZXRob2Qgb25jZSBkdXJpbmcgdGhlIGVudGlyZSB0ZXN0IGNhc2UsIG9yIG9uY2UgZm9yIGVhY2ggdGVzdCAKKyAgICBtZXRob2QuIFlvdSBjYW4gZXZlbiBkZXN0cm95IHRoZSBhY3Rpdml0eSB1bmRlciB0ZXN0IGJ5IGNhbGxpbmcgaXRzIAorICAgIHtAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eSNmaW5pc2goKX0gbWV0aG9kIGFuZCB0aGVuIHJlc3RhcnQgaXQgd2l0aCAKKyAgICA8Y29kZT5nZXRBY3Rpdml0eSgpPC9jb2RlPiB3aXRoaW4gYSBzaW5nbGUgdGVzdCBtZXRob2QuCiA8L3A+CiA8aDMgaWQ9IlJ1blRlc3RzIj5SdW5uaW5nIHRlc3RzIGFuZCBzZWVpbmcgdGhlIHJlc3VsdHM8L2gzPgogPHA+Ci0gICAgVG8gcnVuIHlvdXIgdGVzdHMsIHlvdSBidWlsZCB5b3VyIHRlc3QgcHJvamVjdCBhbmQgdGhlbiBydW4gdGhlIHRlc3QgYXBwbGljYXRpb24gdXNpbmcgdGhlIHN5c3RlbSB1dGlsaXR5IEFjdGl2aXR5IE1hbmFnZXIgd2l0aCBpbnN0cnVtZW50YXRpb24uIFlvdSBwcm92aWRlIHRvIEFjdGl2aXR5IE1hbmFnZXIgdGhlIG5hbWUgb2YgdGhlIHRlc3QgcnVubmVyICh1c3VhbGx5Ci0gICAge0BsaW5rIGFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyfSkgeW91IHNwZWNpZmllZCBmb3IgeW91ciBhcHBsaWNhdGlvbjsgdGhlIG5hbWUgaW5jbHVkZXMgYm90aCB5b3VyIHRlc3QgYXBwbGljYXRpb24ncyBwYWNrYWdlIG5hbWUgYW5kIHRoZSB0ZXN0IHJ1bm5lciBjbGFzcyBuYW1lLiBBY3Rpdml0eSBNYW5hZ2VyIGxvYWRzIGFuZCBzdGFydHMgeW91cgotICAgIHRlc3QgYXBwbGljYXRpb24sIGtpbGxzIGFueSBpbnN0YW5jZXMgb2YgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QsIGxvYWRzIGFuIGluc3RhbmNlIG9mIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0IGludG8gdGhlIHNhbWUgcHJvY2VzcyBhcyB0aGUgdGVzdCBhcHBsaWNhdGlvbiwgYW5kIHRoZW4gcGFzc2VzIGNvbnRyb2wgdG8gdGhlIGZpcnN0IHRlc3QgY2FzZQotICAgIGNsYXNzIGluIHlvdXIgdGVzdCBhcHBsaWNhdGlvbi4gVGhlIHRlc3QgcnVubmVyIHRoZW4gdGFrZXMgY29udHJvbCBvZiB0aGUgdGVzdHMsIHJ1bm5pbmcgZWFjaCBvZiB5b3VyIHRlc3QgbWV0aG9kcyBhZ2FpbnN0IHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0IHVudGlsIGFsbCB0aGUgbWV0aG9kcyBpbiBhbGwgdGhlIGNsYXNzZXMgaGF2ZSBiZWVuIHJ1bi4KKyAgICBUbyBydW4geW91ciB0ZXN0cywgeW91IGJ1aWxkIHlvdXIgdGVzdCBwcm9qZWN0IGFuZCB0aGVuIHJ1biB0aGUgdGVzdCBhcHBsaWNhdGlvbiB1c2luZyB0aGUgCisgICAgc3lzdGVtIHV0aWxpdHkgQWN0aXZpdHkgTWFuYWdlciB3aXRoIGluc3RydW1lbnRhdGlvbi4gWW91IHByb3ZpZGUgdG8gQWN0aXZpdHkgTWFuYWdlciB0aGUgbmFtZSAKKyAgICBvZiB0aGUgdGVzdCBydW5uZXIgKHVzdWFsbHkge0BsaW5rIGFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyfSkgeW91IHNwZWNpZmllZCBmb3IgCisgICAgeW91ciBhcHBsaWNhdGlvbjsgdGhlIG5hbWUgaW5jbHVkZXMgYm90aCB5b3VyIHRlc3QgYXBwbGljYXRpb24ncyBwYWNrYWdlIG5hbWUgYW5kIHRoZSB0ZXN0IAorICAgIHJ1bm5lciBjbGFzcyBuYW1lLiBBY3Rpdml0eSBNYW5hZ2VyIGxvYWRzIGFuZCBzdGFydHMgeW91ciB0ZXN0IGFwcGxpY2F0aW9uLCBraWxscyBhbnkgaW5zdGFuY2VzCisgICAgb2YgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QsIGxvYWRzIGFuIGluc3RhbmNlIG9mIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0IGludG8gdGhlIHNhbWUgCisgICAgcHJvY2VzcyBhcyB0aGUgdGVzdCBhcHBsaWNhdGlvbiwgYW5kIHRoZW4gcGFzc2VzIGNvbnRyb2wgdG8gdGhlIGZpcnN0IHRlc3QgY2FzZSBjbGFzcyBpbiB5b3VyIAorICAgIHRlc3QgYXBwbGljYXRpb24uIFRoZSB0ZXN0IHJ1bm5lciB0aGVuIHRha2VzIGNvbnRyb2wgb2YgdGhlIHRlc3RzLCBydW5uaW5nIGVhY2ggb2YgeW91ciB0ZXN0IAorICAgIG1ldGhvZHMgYWdhaW5zdCB0aGUgYXBwbGljYXRpb24gdW5kZXIgdGVzdCB1bnRpbCBhbGwgdGhlIG1ldGhvZHMgaW4gYWxsIHRoZSBjbGFzc2VzIGhhdmUgYmVlbiAKKyAgICBydW4uCiA8L3A+CiA8cD4KLSAgICBJZiB5b3UgcnVuIGEgdGVzdCB3aXRoaW4gRWNsaXBzZSB3aXRoIEFEVCwgdGhlIG91dHB1dCBhcHBlYXJzIGluIGEgbmV3IEpVbml0IHZpZXcgcGFuZS4gSWYgeW91IHJ1biBhIHRlc3QgZnJvbSB0aGUgY29tbWFuZCBsaW5lLCB0aGUgb3V0cHV0IGdvZXMgdG8gU1RET1VULgorICAgIElmIHlvdSBydW4gYSB0ZXN0IHdpdGhpbiBFY2xpcHNlIHdpdGggQURULCB0aGUgb3V0cHV0IGFwcGVhcnMgaW4gYSBuZXcgSlVuaXQgdmlldyBwYW5lLiBJZiB5b3UgCisgICAgcnVuIGEgdGVzdCBmcm9tIHRoZSBjb21tYW5kIGxpbmUsIHRoZSBvdXRwdXQgZ29lcyB0byBTVERPVVQuCiA8L3A+CiA8aDIgaWQ9IlRlc3RBcmVhcyI+V2hhdCB0byBUZXN0PC9oMj4KIDxwPgpAQCAtMzU5LDU4ICs0NDUsNjQgQEAKIDwvcD4KICAgPHVsPgogICAgIDxsaT4KLSAgICAgIEFjdGl2aXR5IGxpZmVjeWNsZSBldmVudHM6IFlvdSBzaG91bGQgdGVzdCB0aGF0IHlvdXIgYWN0aXZpdGllcyBoYW5kbGUgbGlmZWN5Y2xlIGV2ZW50cyBjb3JyZWN0bHkuIEZvciBleGFtcGxlCi0gICAgICBhbiBhY3Rpdml0eSBzaG91bGQgcmVzcG9uZCB0byBwYXVzZSBvciBkZXN0cm95IGV2ZW50cyBieSBzYXZpbmcgaXRzIHN0YXRlLiBSZW1lbWJlciB0aGF0IGV2ZW4gYSBjaGFuZ2UgaW4gc2NyZWVuIG9yaWVudGF0aW9uCi0gICAgICBjYXVzZXMgdGhlIGN1cnJlbnQgYWN0aXZpdHkgdG8gYmUgZGVzdHJveWVkLCBzbyB5b3Ugc2hvdWxkIHRlc3QgdGhhdCBhY2NpZGVudGFsIGRldmljZSBtb3ZlbWVudHMgZG9uJ3QgYWNjaWRlbnRhbGx5IGxvc2UgdGhlCisgICAgICBBY3Rpdml0eSBsaWZlY3ljbGUgZXZlbnRzOiBZb3Ugc2hvdWxkIHRlc3QgdGhhdCB5b3VyIGFjdGl2aXRpZXMgaGFuZGxlIGxpZmVjeWNsZSBldmVudHMgCisgICAgICBjb3JyZWN0bHkuIEZvciBleGFtcGxlLCBhbiBhY3Rpdml0eSBzaG91bGQgcmVzcG9uZCB0byBwYXVzZSBvciBkZXN0cm95IGV2ZW50cyBieSBzYXZpbmcgaXRzIAorICAgICAgc3RhdGUuIFJlbWVtYmVyIHRoYXQgZXZlbiBhIGNoYW5nZSBpbiBzY3JlZW4gb3JpZW50YXRpb24gY2F1c2VzIHRoZSBjdXJyZW50IGFjdGl2aXR5IHRvIGJlIAorICAgICAgZGVzdHJveWVkLCBzbyB5b3Ugc2hvdWxkIHRlc3QgdGhhdCBhY2NpZGVudGFsIGRldmljZSBtb3ZlbWVudHMgZG9uJ3QgYWNjaWRlbnRhbGx5IGxvc2UgdGhlCiAgICAgICBhcHBsaWNhdGlvbiBzdGF0ZS4KICAgICA8L2xpPgogICAgIDxsaT4KLSAgICAgIERhdGFiYXNlIG9wZXJhdGlvbnM6IFlvdSBzaG91bGQgZW5zdXJlIHRoYXQgZGF0YWJhc2Ugb3BlcmF0aW9ucyBjb3JyZWN0bHkgaGFuZGxlIGNoYW5nZXMgdG8gdGhlIGFwcGxpY2F0aW9uJ3Mgc3RhdGUuCi0gICAgICBUbyBkbyB0aGlzLCB1c2UgbW9jayBvYmplY3RzIGZyb20gdGhlIHBhY2thZ2Uge0BsaW5rIGFuZHJvaWQudGVzdC5tb2NrIGFuZHJvaWQudGVzdC5tb2NrfS4KKyAgICAgIERhdGFiYXNlIG9wZXJhdGlvbnM6IFlvdSBzaG91bGQgZW5zdXJlIHRoYXQgZGF0YWJhc2Ugb3BlcmF0aW9ucyBjb3JyZWN0bHkgaGFuZGxlIGNoYW5nZXMgdG8gCisgICAgICB0aGUgYXBwbGljYXRpb24ncyBzdGF0ZS4gVG8gZG8gdGhpcywgdXNlIG1vY2sgb2JqZWN0cyBmcm9tIHRoZSBwYWNrYWdlIAorICAgICAge0BsaW5rIGFuZHJvaWQudGVzdC5tb2NrIGFuZHJvaWQudGVzdC5tb2NrfS4KICAgICA8L2xpPgogICAgIDxsaT4KLSAgICAgICAgU2NyZWVuIHNpemVzIGFuZCByZXNvbHV0aW9uczogQmVmb3JlIHlvdSBwdWJsaXNoIHlvdXIgYXBwbGljYXRpb24sIG1ha2Ugc3VyZSB0byB0ZXN0IGl0IG9uIGFsbCBvZiB0aGUKLSAgICAgICAgc2NyZWVuIHNpemVzIGFuZCBkZW5zaXRpZXMgb24gd2hpY2ggeW91IHdhbnQgaXQgdG8gcnVuLiBZb3UgY2FuIHRlc3QgdGhlIGFwcGxpY2F0aW9uIG9uIG11bHRpcGxlIHNpemVzIGFuZCBkZW5zaXRpZXMgdXNpbmcKLSAgICAgICAgQVZEcywgb3IgeW91IGNhbiB0ZXN0IHlvdXIgYXBwbGljYXRpb24gZGlyZWN0bHkgb24gdGhlIGRldmljZXMgdGhhdCB5b3UgYXJlIHRhcmdldGluZy4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZQotICAgICAgICB0aGUgdG9waWMgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3ByYWN0aWNlcy9zY3JlZW5zX3N1cHBvcnQuaHRtbCI+U3VwcG9ydGluZyBNdWx0aXBsZSBTY3JlZW5zPC9hPi4KKyAgICAgICAgU2NyZWVuIHNpemVzIGFuZCByZXNvbHV0aW9uczogQmVmb3JlIHlvdSBwdWJsaXNoIHlvdXIgYXBwbGljYXRpb24sIG1ha2Ugc3VyZSB0byB0ZXN0IGl0IG9uIAorICAgICAgICBhbGwgb2YgdGhlIHNjcmVlbiBzaXplcyBhbmQgZGVuc2l0aWVzIG9uIHdoaWNoIHlvdSB3YW50IGl0IHRvIHJ1bi4gWW91IGNhbiB0ZXN0IHRoZSAKKyAgICAgICAgYXBwbGljYXRpb24gb24gbXVsdGlwbGUgc2l6ZXMgYW5kIGRlbnNpdGllcyB1c2luZyBBVkRzLCBvciB5b3UgY2FuIHRlc3QgeW91ciBhcHBsaWNhdGlvbiAKKyAgICAgICAgZGlyZWN0bHkgb24gdGhlIGRldmljZXMgdGhhdCB5b3UgYXJlIHRhcmdldGluZy4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSB0aGUgdG9waWMgCisgICAgICAgIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9wcmFjdGljZXMvc2NyZWVuc19zdXBwb3J0Lmh0bWwiPlN1cHBvcnRpbmcgTXVsdGlwbGUgU2NyZWVuczwvYT4uCiAgICAgPC9saT4KICAgPC91bD4KIDxwPgotICBXaGVuIHBvc3NpYmxlLCB5b3Ugc2hvdWxkIHJ1biB0aGVzZSB0ZXN0cyBvbiBhbiBhY3R1YWwgZGV2aWNlLiBJZiB0aGlzIGlzIG5vdCBwb3NzaWJsZSwgeW91IGNhbgotICB1c2UgdGhlIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL3Rvb2xzL2VtdWxhdG9yLmh0bWwiPkFuZHJvaWQgRW11bGF0b3I8L2E+IHdpdGgKLSAgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL2RldmVsb3BpbmcvdG9vbHMvYXZkLmh0bWwiPkFuZHJvaWQgVmlydHVhbCBEZXZpY2VzPC9hPiBjb25maWd1cmVkIGZvcgotICB0aGUgaGFyZHdhcmUsIHNjcmVlbnMsIGFuZCB2ZXJzaW9ucyB5b3Ugd2FudCB0byB0ZXN0LgorICAgIFdoZW4gcG9zc2libGUsIHlvdSBzaG91bGQgcnVuIHRoZXNlIHRlc3RzIG9uIGFuIGFjdHVhbCBkZXZpY2UuIElmIHRoaXMgaXMgbm90IHBvc3NpYmxlLCB5b3UgY2FuCisgICAgdXNlIHRoZSA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvZGV2ZWxvcGluZy90b29scy9lbXVsYXRvci5odG1sIj5BbmRyb2lkIEVtdWxhdG9yPC9hPiB3aXRoCisgICAgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL2RldmVsb3BpbmcvdG9vbHMvYXZkLmh0bWwiPkFuZHJvaWQgVmlydHVhbCBEZXZpY2VzPC9hPiBjb25maWd1cmVkIGZvcgorICAgIHRoZSBoYXJkd2FyZSwgc2NyZWVucywgYW5kIHZlcnNpb25zIHlvdSB3YW50IHRvIHRlc3QuCiA8L3A+CiA8aDIgaWQ9IlVJVGVzdGluZyI+QXBwZW5kaXg6IFVJIFRlc3RpbmcgTm90ZXM8L2gyPgogPHA+Ci0gIFRoZSBmb2xsb3dpbmcgc2VjdGlvbnMgaGF2ZSB0aXBzIGZvciB0ZXN0aW5nIHRoZSBVSSBvZiB5b3VyIEFuZHJvaWQgYXBwbGljYXRpb24sIHNwZWNpZmljYWxseQotICB0byBoZWxwIHlvdSBoYW5kbGUgYWN0aW9ucyB0aGF0IHJ1biBpbiB0aGUgVUkgdGhyZWFkLCB0b3VjaCBzY3JlZW4gYW5kIGtleWJvYXJkIGV2ZW50cywgYW5kIGhvbWUKLSAgc2NyZWVuIHVubG9jayBkdXJpbmcgdGVzdGluZy4KKyAgICBUaGUgZm9sbG93aW5nIHNlY3Rpb25zIGhhdmUgdGlwcyBmb3IgdGVzdGluZyB0aGUgVUkgb2YgeW91ciBBbmRyb2lkIGFwcGxpY2F0aW9uLCBzcGVjaWZpY2FsbHkKKyAgICB0byBoZWxwIHlvdSBoYW5kbGUgYWN0aW9ucyB0aGF0IHJ1biBpbiB0aGUgVUkgdGhyZWFkLCB0b3VjaCBzY3JlZW4gYW5kIGtleWJvYXJkIGV2ZW50cywgYW5kIGhvbWUKKyAgICBzY3JlZW4gdW5sb2NrIGR1cmluZyB0ZXN0aW5nLgogPC9wPgogPGgzIGlkPSJSdW5PblVJVGhyZWFkIj5UZXN0aW5nIG9uIHRoZSBVSSB0aHJlYWQ8L2gzPgogPHA+Ci0gIEFuIGFwcGxpY2F0aW9uJ3MgYWN0aXZpdGllcyBydW4gb24gdGhlIGFwcGxpY2F0aW9uJ3MgPHN0cm9uZz5VSSB0aHJlYWQ8L3N0cm9uZz4uIE9uY2UgdGhlCi0gIFVJIGlzIGluc3RhbnRpYXRlZCwgZm9yIGV4YW1wbGUgaW4gdGhlIGFjdGl2aXR5J3MgPGNvZGU+b25DcmVhdGUoKTwvY29kZT4gbWV0aG9kLCB0aGVuIGFsbAotICBpbnRlcmFjdGlvbnMgd2l0aCB0aGUgVUkgbXVzdCBydW4gaW4gdGhlIFVJIHRocmVhZC4gV2hlbiB5b3UgcnVuIHRoZSBhcHBsaWNhdGlvbiBub3JtYWxseSwgaXQKLSAgaGFzIGFjY2VzcyB0byB0aGUgdGhyZWFkIGFuZCBkb2VzIG5vdCBoYXZlIHRvIGRvIGFueXRoaW5nIHNwZWNpYWwuCisgICAgQW4gYXBwbGljYXRpb24ncyBhY3Rpdml0aWVzIHJ1biBvbiB0aGUgYXBwbGljYXRpb24ncyA8c3Ryb25nPlVJIHRocmVhZDwvc3Ryb25nPi4gT25jZSB0aGUKKyAgICBVSSBpcyBpbnN0YW50aWF0ZWQsIGZvciBleGFtcGxlIGluIHRoZSBhY3Rpdml0eSdzIDxjb2RlPm9uQ3JlYXRlKCk8L2NvZGU+IG1ldGhvZCwgdGhlbiBhbGwKKyAgICBpbnRlcmFjdGlvbnMgd2l0aCB0aGUgVUkgbXVzdCBydW4gaW4gdGhlIFVJIHRocmVhZC4gV2hlbiB5b3UgcnVuIHRoZSBhcHBsaWNhdGlvbiBub3JtYWxseSwgaXQKKyAgICBoYXMgYWNjZXNzIHRvIHRoZSB0aHJlYWQgYW5kIGRvZXMgbm90IGhhdmUgdG8gZG8gYW55dGhpbmcgc3BlY2lhbC4KIDwvcD4KIDxwPgotICBUaGlzIGNoYW5nZXMgd2hlbiB5b3UgcnVuIHRlc3RzIGFnYWluc3QgdGhlIGFwcGxpY2F0aW9uLiBXaXRoIGluc3RydW1lbnRhdGlvbi1iYXNlZCBjbGFzc2VzLAotICB5b3UgY2FuIGludm9rZSBtZXRob2RzIGFnYWluc3QgdGhlIFVJIG9mIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0LiBUaGUgb3RoZXIgdGVzdCBjbGFzc2VzIGRvbid0IGFsbG93IHRoaXMuCi0gIFRvIHJ1biBhbiBlbnRpcmUgdGVzdCBtZXRob2Qgb24gdGhlIFVJIHRocmVhZCwgeW91IGNhbiBhbm5vdGF0ZSB0aGUgdGhyZWFkIHdpdGggPGNvZGU+QFVJVGhyZWFkVGVzdDwvY29kZT4uCi0gIE5vdGljZSB0aGF0IHRoaXMgd2lsbCBydW4gPGVtPmFsbDwvZW0+IG9mIHRoZSBtZXRob2Qgc3RhdGVtZW50cyBvbiB0aGUgVUkgdGhyZWFkLiAgTWV0aG9kcyB0aGF0IGRvIG5vdCBpbnRlcmFjdCB3aXRoIHRoZSBVSQotICBhcmUgbm90IGFsbG93ZWQ7IGZvciBleGFtcGxlLCB5b3UgY2FuJ3QgaW52b2tlIDxjb2RlPkluc3RydW1lbnRhdGlvbi53YWl0Rm9ySWRsZVN5bmMoKTwvY29kZT4uCisgICAgVGhpcyBjaGFuZ2VzIHdoZW4geW91IHJ1biB0ZXN0cyBhZ2FpbnN0IHRoZSBhcHBsaWNhdGlvbi4gV2l0aCBpbnN0cnVtZW50YXRpb24tYmFzZWQgY2xhc3NlcywKKyAgICB5b3UgY2FuIGludm9rZSBtZXRob2RzIGFnYWluc3QgdGhlIFVJIG9mIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0LiBUaGUgb3RoZXIgdGVzdCBjbGFzc2VzIAorICAgIGRvbid0IGFsbG93IHRoaXMuIFRvIHJ1biBhbiBlbnRpcmUgdGVzdCBtZXRob2Qgb24gdGhlIFVJIHRocmVhZCwgeW91IGNhbiBhbm5vdGF0ZSB0aGUgdGhyZWFkIAorICAgIHdpdGggPGNvZGU+QFVJVGhyZWFkVGVzdDwvY29kZT4uIE5vdGljZSB0aGF0IHRoaXMgd2lsbCBydW4gPGVtPmFsbDwvZW0+IG9mIHRoZSBtZXRob2Qgc3RhdGVtZW50cyAKKyAgICBvbiB0aGUgVUkgdGhyZWFkLiAgTWV0aG9kcyB0aGF0IGRvIG5vdCBpbnRlcmFjdCB3aXRoIHRoZSBVSSBhcmUgbm90IGFsbG93ZWQ7IGZvciBleGFtcGxlLCB5b3UgCisgICAgY2FuJ3QgaW52b2tlIDxjb2RlPkluc3RydW1lbnRhdGlvbi53YWl0Rm9ySWRsZVN5bmMoKTwvY29kZT4uCiA8L3A+CiA8cD4KLSAgVG8gcnVuIGEgc3Vic2V0IG9mIGEgdGVzdCBtZXRob2Qgb24gdGhlIFVJIHRocmVhZCwgY3JlYXRlIGFuIGFub255bW91cyBjbGFzcyBvZiB0eXBlCi0gIDxjb2RlPlJ1bm5hYmxlPC9jb2RlPiwgcHV0IHRoZSBzdGF0ZW1lbnRzIHlvdSB3YW50IGluIHRoZSA8Y29kZT5ydW4oKTwvY29kZT4gbWV0aG9kLCBhbmQgaW5zdGFudGlhdGUgYSBuZXcKLSAgaW5zdGFuY2Ugb2YgdGhlIGNsYXNzIGFzIGEgcGFyYW1ldGVyIHRvIHRoZSBtZXRob2QgPGNvZGU+PGVtPmFwcEFjdGl2aXR5PC9lbT4ucnVuT25VaVRocmVhZCgpPC9jb2RlPiwgd2hlcmUKLSAgPGNvZGU+PGVtPmFwcEFjdGl2aXR5PC9lbT48L2NvZGU+IGlzIHRoZSBpbnN0YW5jZSBvZiB0aGUgYXBwIHlvdSBhcmUgdGVzdGluZy4KKyAgICBUbyBydW4gYSBzdWJzZXQgb2YgYSB0ZXN0IG1ldGhvZCBvbiB0aGUgVUkgdGhyZWFkLCBjcmVhdGUgYW4gYW5vbnltb3VzIGNsYXNzIG9mIHR5cGUKKyAgICA8Y29kZT5SdW5uYWJsZTwvY29kZT4sIHB1dCB0aGUgc3RhdGVtZW50cyB5b3Ugd2FudCBpbiB0aGUgPGNvZGU+cnVuKCk8L2NvZGU+IG1ldGhvZCwgYW5kIAorICAgIGluc3RhbnRpYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBjbGFzcyBhcyBhIHBhcmFtZXRlciB0byB0aGUgbWV0aG9kIAorICAgIDxjb2RlPjxlbT5hcHBBY3Rpdml0eTwvZW0+LnJ1bk9uVWlUaHJlYWQoKTwvY29kZT4sIHdoZXJlIDxjb2RlPjxlbT5hcHBBY3Rpdml0eTwvZW0+PC9jb2RlPiBpcyAKKyAgICB0aGUgaW5zdGFuY2Ugb2YgdGhlIGFwcCB5b3UgYXJlIHRlc3RpbmcuCiA8L3A+CiA8cD4KLSAgRm9yIGV4YW1wbGUsIHRoaXMgY29kZSBpbnN0YW50aWF0ZXMgYW4gYWN0aXZpdHkgdG8gdGVzdCwgcmVxdWVzdHMgZm9jdXMgKGEgVUkgYWN0aW9uKSBmb3IgdGhlIFNwaW5uZXIgZGlzcGxheWVkCi0gIGJ5IHRoZSBhY3Rpdml0eSwgYW5kIHRoZW4gc2VuZHMgYSBrZXkgdG8gaXQuIE5vdGljZSB0aGF0IHRoZSBjYWxscyB0byA8Y29kZT53YWl0Rm9ySWRsZVN5bmM8L2NvZGU+IGFuZCA8Y29kZT5zZW5kS2V5czwvY29kZT4KLSAgYXJlbid0IGFsbG93ZWQgdG8gcnVuIG9uIHRoZSBVSSB0aHJlYWQ6PC9wPgorICAgIEZvciBleGFtcGxlLCB0aGlzIGNvZGUgaW5zdGFudGlhdGVzIGFuIGFjdGl2aXR5IHRvIHRlc3QsIHJlcXVlc3RzIGZvY3VzIChhIFVJIGFjdGlvbikgZm9yIHRoZSAKKyAgICBTcGlubmVyIGRpc3BsYXllZCBieSB0aGUgYWN0aXZpdHksIGFuZCB0aGVuIHNlbmRzIGEga2V5IHRvIGl0LiBOb3RpY2UgdGhhdCB0aGUgY2FsbHMgdG8gCisgICAgPGNvZGU+d2FpdEZvcklkbGVTeW5jPC9jb2RlPiBhbmQgPGNvZGU+c2VuZEtleXM8L2NvZGU+IGFyZW4ndCBhbGxvd2VkIHRvIHJ1biBvbiB0aGUgVUkgdGhyZWFkOgorPC9wPgogPHByZT4KICAgcHJpdmF0ZSBNeUFjdGl2aXR5IG1BY3Rpdml0eTsgLy8gTXlBY3Rpdml0eSBpcyB0aGUgY2xhc3MgbmFtZSBvZiB0aGUgYXBwIHVuZGVyIHRlc3QKICAgcHJpdmF0ZSBTcGlubmVyIG1TcGlubmVyOwpAQCAtNDQ5LDMxICs1NDEsMzYgQEAKIAogPGgzIGlkPSJOb3RvdWNoTW9kZSI+VHVybmluZyBvZmYgdG91Y2ggbW9kZTwvaDM+CiA8cD4KLSAgVG8gY29udHJvbCB0aGUgZW11bGF0b3Igb3IgYSBkZXZpY2Ugd2l0aCBrZXkgZXZlbnRzIHlvdSBzZW5kIGZyb20geW91ciB0ZXN0cywgeW91IG11c3QgdHVybiBvZmYKLSAgdG91Y2ggbW9kZS4gSWYgeW91IGRvIG5vdCBkbyB0aGlzLCB0aGUga2V5IGV2ZW50cyBhcmUgaWdub3JlZC4KKyAgICBUbyBjb250cm9sIHRoZSBlbXVsYXRvciBvciBhIGRldmljZSB3aXRoIGtleSBldmVudHMgeW91IHNlbmQgZnJvbSB5b3VyIHRlc3RzLCB5b3UgbXVzdCB0dXJuIG9mZgorICAgIHRvdWNoIG1vZGUuIElmIHlvdSBkbyBub3QgZG8gdGhpcywgdGhlIGtleSBldmVudHMgYXJlIGlnbm9yZWQuCiA8L3A+CiA8cD4KLSAgVG8gdHVybiBvZmYgdG91Y2ggbW9kZSwgeW91IGludm9rZSA8Y29kZT5BY3Rpdml0eUluc3RydW1lbnRhdGlvblRlc3RDYXNlMi5zZXRBY3Rpdml0eVRvdWNoTW9kZShmYWxzZSk8L2NvZGU+Ci0gIDxlbT5iZWZvcmU8L2VtPiB5b3UgY2FsbCA8Y29kZT5nZXRBY3Rpdml0eSgpPC9jb2RlPiB0byBzdGFydCB0aGUgYWN0aXZpdHkuIFlvdSBtdXN0IGludm9rZSB0aGUgbWV0aG9kIGluIGEgdGVzdCBtZXRob2QKLSAgdGhhdCBpcyA8ZW0+bm90PC9lbT4gcnVubmluZyBvbiB0aGUgVUkgdGhyZWFkLiBGb3IgdGhpcyByZWFzb24sIHlvdSBjYW4ndCBpbnZva2UgdGhlIHRvdWNoIG1vZGUgbWV0aG9kCi0gIGZyb20gYSB0ZXN0IG1ldGhvZCB0aGF0IGlzIGFubm90YXRlZCB3aXRoIDxjb2RlPkBVSVRocmVhZDwvY29kZT4uIEluc3RlYWQsIGludm9rZSB0aGUgdG91Y2ggbW9kZSBtZXRob2QgZnJvbSA8Y29kZT5zZXRVcCgpPC9jb2RlPi4KKyAgICBUbyB0dXJuIG9mZiB0b3VjaCBtb2RlLCB5b3UgaW52b2tlIAorICAgIDxjb2RlPkFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uVGVzdENhc2UyLnNldEFjdGl2aXR5VG91Y2hNb2RlKGZhbHNlKTwvY29kZT4KKyAgICA8ZW0+YmVmb3JlPC9lbT4geW91IGNhbGwgPGNvZGU+Z2V0QWN0aXZpdHkoKTwvY29kZT4gdG8gc3RhcnQgdGhlIGFjdGl2aXR5LiBZb3UgbXVzdCBpbnZva2UgdGhlIAorICAgIG1ldGhvZCBpbiBhIHRlc3QgbWV0aG9kIHRoYXQgaXMgPGVtPm5vdDwvZW0+IHJ1bm5pbmcgb24gdGhlIFVJIHRocmVhZC4gRm9yIHRoaXMgcmVhc29uLCB5b3UgCisgICAgY2FuJ3QgaW52b2tlIHRoZSB0b3VjaCBtb2RlIG1ldGhvZCBmcm9tIGEgdGVzdCBtZXRob2QgdGhhdCBpcyBhbm5vdGF0ZWQgd2l0aCAKKyAgICA8Y29kZT5AVUlUaHJlYWQ8L2NvZGU+LiBJbnN0ZWFkLCBpbnZva2UgdGhlIHRvdWNoIG1vZGUgbWV0aG9kIGZyb20gPGNvZGU+c2V0VXAoKTwvY29kZT4uCiA8L3A+CiA8aDMgaWQ9IlVubG9ja0RldmljZSI+VW5sb2NraW5nIHRoZSBlbXVsYXRvciBvciBkZXZpY2U8L2gzPgogPHA+Ci0gIFlvdSBtYXkgZmluZCB0aGF0IFVJIHRlc3RzIGRvbid0IHdvcmsgaWYgdGhlIGVtdWxhdG9yJ3Mgb3IgZGV2aWNlJ3MgaG9tZSBzY3JlZW4gaXMgZGlzYWJsZWQgd2l0aCB0aGUga2V5Z3VhcmQgcGF0dGVybi4KLSAgVGhpcyBpcyBiZWNhdXNlIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0IGNhbid0IHJlY2VpdmUga2V5IGV2ZW50cyBzZW50IGJ5IDxjb2RlPnNlbmRLZXlzKCk8L2NvZGU+LiBUaGUgYmVzdAotICB3YXkgdG8gYXZvaWQgdGhpcyBpcyB0byBzdGFydCB5b3VyIGVtdWxhdG9yIG9yIGRldmljZSBmaXJzdCBhbmQgdGhlbiBkaXNhYmxlIHRoZSBrZXlndWFyZCBmb3IgdGhlIGhvbWUgc2NyZWVuLgorICAgIFlvdSBtYXkgZmluZCB0aGF0IFVJIHRlc3RzIGRvbid0IHdvcmsgaWYgdGhlIGVtdWxhdG9yJ3Mgb3IgZGV2aWNlJ3MgaG9tZSBzY3JlZW4gaXMgZGlzYWJsZWQgd2l0aCAKKyAgICB0aGUga2V5Z3VhcmQgcGF0dGVybi4gVGhpcyBpcyBiZWNhdXNlIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0IGNhbid0IHJlY2VpdmUga2V5IGV2ZW50cyBzZW50ICcKKyAgICBieSA8Y29kZT5zZW5kS2V5cygpPC9jb2RlPi4gVGhlIGJlc3Qgd2F5IHRvIGF2b2lkIHRoaXMgaXMgdG8gc3RhcnQgeW91ciBlbXVsYXRvciBvciBkZXZpY2UgCisgICAgZmlyc3QgYW5kIHRoZW4gZGlzYWJsZSB0aGUga2V5Z3VhcmQgZm9yIHRoZSBob21lIHNjcmVlbi4KIDwvcD4KIDxwPgotICBZb3UgY2FuIGFsc28gZXhwbGljaXRseSBkaXNhYmxlIHRoZSBrZXlndWFyZC4gVG8gZG8gdGhpcywKLSAgeW91IG5lZWQgdG8gYWRkIGEgcGVybWlzc2lvbiBpbiB0aGUgbWFuaWZlc3QgZmlsZSAoPGNvZGU+QW5kcm9pZE1hbmlmZXN0LnhtbDwvY29kZT4pIGFuZAotICB0aGVuIGRpc2FibGUgdGhlIGtleWd1YXJkIGluIHlvdXIgYXBwbGljYXRpb24gdW5kZXIgdGVzdC4gTm90ZSwgdGhvdWdoLCB0aGF0IHlvdSBlaXRoZXIgaGF2ZSB0byByZW1vdmUgdGhpcyBiZWZvcmUKLSAgeW91IHB1Ymxpc2ggeW91ciBhcHBsaWNhdGlvbiwgb3IgeW91IGhhdmUgdG8gZGlzYWJsZSBpdCBwcm9ncmFtbWF0aWNhbGx5IGluIHRoZSBwdWJsaXNoZWQgYXBwLgorICAgIFlvdSBjYW4gYWxzbyBleHBsaWNpdGx5IGRpc2FibGUgdGhlIGtleWd1YXJkLiBUbyBkbyB0aGlzLAorICAgIHlvdSBuZWVkIHRvIGFkZCBhIHBlcm1pc3Npb24gaW4gdGhlIG1hbmlmZXN0IGZpbGUgKDxjb2RlPkFuZHJvaWRNYW5pZmVzdC54bWw8L2NvZGU+KSBhbmQKKyAgICB0aGVuIGRpc2FibGUgdGhlIGtleWd1YXJkIGluIHlvdXIgYXBwbGljYXRpb24gdW5kZXIgdGVzdC4gTm90ZSwgdGhvdWdoLCB0aGF0IHlvdSBlaXRoZXIgaGF2ZSB0byAKKyAgICByZW1vdmUgdGhpcyBiZWZvcmUgeW91IHB1Ymxpc2ggeW91ciBhcHBsaWNhdGlvbiwgb3IgeW91IGhhdmUgdG8gZGlzYWJsZSBpdCBwcm9ncmFtbWF0aWNhbGx5IGluIAorICAgIHRoZSBwdWJsaXNoZWQgYXBwLgogPC9wPgogPHA+Ci0gIFRvIGFkZCB0aGUgdGhlIHBlcm1pc3Npb24sIGFkZCB0aGUgZWxlbWVudCA8Y29kZT4mbHQ7dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkRJU0FCTEVfS0VZR1VBUkQiLyZndDs8L2NvZGU+Ci0gIGFzIGEgY2hpbGQgb2YgdGhlIDxjb2RlPiZsdDttYW5pZmVzdCZndDs8L2NvZGU+IGVsZW1lbnQuIFRvIGRpc2FibGUgdGhlIEtleUd1YXJkLCBhZGQgdGhlIGZvbGxvd2luZyBjb2RlCi0gIHRvIHRoZSA8Y29kZT5vbkNyZWF0ZSgpPC9jb2RlPiBtZXRob2Qgb2YgYWN0aXZpdGllcyB5b3UgaW50ZW5kIHRvIHRlc3Q6CisgICAgVG8gYWRkIHRoZSB0aGUgcGVybWlzc2lvbiwgYWRkIHRoZSBlbGVtZW50IAorICAgIDxjb2RlPiZsdDt1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uRElTQUJMRV9LRVlHVUFSRCIvJmd0OzwvY29kZT4KKyAgICBhcyBhIGNoaWxkIG9mIHRoZSA8Y29kZT4mbHQ7bWFuaWZlc3QmZ3Q7PC9jb2RlPiBlbGVtZW50LiBUbyBkaXNhYmxlIHRoZSBLZXlHdWFyZCwgYWRkIHRoZSAKKyAgICBmb2xsb3dpbmcgY29kZSB0byB0aGUgPGNvZGU+b25DcmVhdGUoKTwvY29kZT4gbWV0aG9kIG9mIGFjdGl2aXRpZXMgeW91IGludGVuZCB0byB0ZXN0OgogPC9wPgogPHByZT4KICAgbUtleUd1YXJkTWFuYWdlciA9IChLZXlndWFyZE1hbmFnZXIpIGdldFN5c3RlbVNlcnZpY2UoS0VZR1VBUkRfU0VSVklDRSk7CkBAIC00ODMsNyArNTgwLDggQEAKIDxwPndoZXJlIDxjb2RlPjxlbT5hY3Rpdml0eV9jbGFzc25hbWU8L2VtPjwvY29kZT4gaXMgdGhlIGNsYXNzIG5hbWUgb2YgdGhlIGFjdGl2aXR5LjwvcD4KIDxoMyBpZD0iVUlUZXN0VHJvdWJsZXNob290aW5nIj5Ucm91Ymxlc2hvb3RpbmcgVUkgdGVzdHM8L2gzPgogPHA+Ci0gIFRoaXMgc2VjdGlvbiBsaXN0cyBzb21lIG9mIHRoZSBjb21tb24gdGVzdCBmYWlsdXJlcyB5b3UgbWF5IGVuY291bnRlciBpbiBVSSB0ZXN0aW5nLCBhbmQgdGhlaXIgY2F1c2VzOgorICAgIFRoaXMgc2VjdGlvbiBsaXN0cyBzb21lIG9mIHRoZSBjb21tb24gdGVzdCBmYWlsdXJlcyB5b3UgbWF5IGVuY291bnRlciBpbiBVSSB0ZXN0aW5nLCBhbmQgdGhlaXIgCisgICAgY2F1c2VzOgogPC9wPgogPGRsPgogICAgIDxkdD48Y29kZT5Xcm9uZ1RocmVhZEV4Y2VwdGlvbjwvY29kZT48L2R0PgpAQCAtNDkxLDI3ICs1ODksMzMgQEAKICAgICAgIDxwPjxzdHJvbmc+UHJvYmxlbTo8L3N0cm9uZz48L3A+CiAgICAgICBGb3IgYSBmYWlsZWQgdGVzdCwgdGhlIEZhaWx1cmUgVHJhY2UgY29udGFpbnMgdGhlIGZvbGxvd2luZyBlcnJvciBtZXNzYWdlOgogICAgICAgPGNvZGU+Ci0gICAgICAgIGFuZHJvaWQudmlldy5WaWV3Um9vdCRDYWxsZWRGcm9tV3JvbmdUaHJlYWRFeGNlcHRpb246IE9ubHkgdGhlIG9yaWdpbmFsIHRocmVhZCB0aGF0IGNyZWF0ZWQgYSB2aWV3IGhpZXJhcmNoeSBjYW4gdG91Y2ggaXRzIHZpZXdzLgorICAgICAgICBhbmRyb2lkLnZpZXcuVmlld1Jvb3QkQ2FsbGVkRnJvbVdyb25nVGhyZWFkRXhjZXB0aW9uOiBPbmx5IHRoZSBvcmlnaW5hbCB0aHJlYWQgdGhhdCBjcmVhdGVkIAorICAgICAgICBhIHZpZXcgaGllcmFyY2h5IGNhbiB0b3VjaCBpdHMgdmlld3MuCiAgICAgICA8L2NvZGU+CiAgICAgICA8cD48c3Ryb25nPlByb2JhYmxlIENhdXNlOjwvc3Ryb25nPjwvcD4KLSAgICAgICAgVGhpcyBlcnJvciBpcyBjb21tb24gaWYgeW91IHRyaWVkIHRvIHNlbmQgVUkgZXZlbnRzIHRvIHRoZSBVSSB0aHJlYWQgZnJvbSBvdXRzaWRlIHRoZSBVSSB0aHJlYWQuIFRoaXMgY29tbW9ubHkgaGFwcGVucyBpZiB5b3Ugc2VuZCBVSSBldmVudHMKLSAgICAgICAgZnJvbSB0aGUgdGVzdCBhcHBsaWNhdGlvbiwgYnV0IHlvdSBkb24ndCB1c2UgdGhlIDxjb2RlPkBVSVRocmVhZDwvY29kZT4gYW5ub3RhdGlvbiBvciB0aGUgPGNvZGU+cnVuT25VaVRocmVhZCgpPC9jb2RlPiBtZXRob2QuIFRoZSB0ZXN0IG1ldGhvZCB0cmllZCB0byBpbnRlcmFjdCB3aXRoIHRoZSBVSSBvdXRzaWRlIHRoZSBVSSB0aHJlYWQuCisgICAgICAgIFRoaXMgZXJyb3IgaXMgY29tbW9uIGlmIHlvdSB0cmllZCB0byBzZW5kIFVJIGV2ZW50cyB0byB0aGUgVUkgdGhyZWFkIGZyb20gb3V0c2lkZSB0aGUgVUkgCisgICAgICAgIHRocmVhZC4gVGhpcyBjb21tb25seSBoYXBwZW5zIGlmIHlvdSBzZW5kIFVJIGV2ZW50cyBmcm9tIHRoZSB0ZXN0IGFwcGxpY2F0aW9uLCBidXQgeW91IGRvbid0CisgICAgICAgIHVzZSB0aGUgPGNvZGU+QFVJVGhyZWFkPC9jb2RlPiBhbm5vdGF0aW9uIG9yIHRoZSA8Y29kZT5ydW5PblVpVGhyZWFkKCk8L2NvZGU+IG1ldGhvZC4gVGhlIAorICAgICAgICB0ZXN0IG1ldGhvZCB0cmllZCB0byBpbnRlcmFjdCB3aXRoIHRoZSBVSSBvdXRzaWRlIHRoZSBVSSB0aHJlYWQuCiAgICAgICA8cD48c3Ryb25nPlN1Z2dlc3RlZCBSZXNvbHV0aW9uOjwvc3Ryb25nPjwvcD4KLSAgICAgICAgUnVuIHRoZSBpbnRlcmFjdGlvbiBvbiB0aGUgVUkgdGhyZWFkLiBVc2UgYSB0ZXN0IGNsYXNzIHRoYXQgcHJvdmlkZXMgaW5zdHJ1bWVudGF0aW9uLiBTZWUgdGhlIHByZXZpb3VzIHNlY3Rpb24gPGEgaHJlZj0iI1J1bk9uVUlUaHJlYWQiPlRlc3Rpbmcgb24gdGhlIFVJIFRocmVhZDwvYT4KKyAgICAgICAgUnVuIHRoZSBpbnRlcmFjdGlvbiBvbiB0aGUgVUkgdGhyZWFkLiBVc2UgYSB0ZXN0IGNsYXNzIHRoYXQgcHJvdmlkZXMgaW5zdHJ1bWVudGF0aW9uLiBTZWUgCisgICAgICAgIHRoZSBwcmV2aW91cyBzZWN0aW9uIDxhIGhyZWY9IiNSdW5PblVJVGhyZWFkIj5UZXN0aW5nIG9uIHRoZSBVSSBUaHJlYWQ8L2E+CiAgICAgICAgIGZvciBtb3JlIGRldGFpbHMuCiAgICAgPC9kZD4KICAgICA8ZHQ+PGNvZGU+amF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb248L2NvZGU+PC9kdD4KICAgICA8ZGQ+CiAgICAgICA8cD48c3Ryb25nPlByb2JsZW06PC9zdHJvbmc+PC9wPgotICAgICAgRm9yIGEgZmFpbGVkIHRlc3QsIHRoZSBGYWlsdXJlIFRyYWNlIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgZXJyb3IgbWVzc2FnZToKKyAgICAgICAgRm9yIGEgZmFpbGVkIHRlc3QsIHRoZSBGYWlsdXJlIFRyYWNlIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgZXJyb3IgbWVzc2FnZToKICAgICAgIDxjb2RlPgogICAgICAgICBqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbjogVGhpcyBtZXRob2QgY2FuIG5vdCBiZSBjYWxsZWQgZnJvbSB0aGUgbWFpbiBhcHBsaWNhdGlvbiB0aHJlYWQKICAgICAgIDwvY29kZT4KICAgICAgIDxwPjxzdHJvbmc+UHJvYmFibGUgQ2F1c2U6PC9zdHJvbmc+PC9wPgotICAgICAgICBUaGlzIGVycm9yIGlzIGNvbW1vbiBpZiB5b3VyIHRlc3QgbWV0aG9kIGlzIGFubm90YXRlZCB3aXRoIDxjb2RlPkBVaVRocmVhZFRlc3Q8L2NvZGU+IGJ1dCB0aGVuIHRyaWVzIHRvCi0gICAgICAgIGRvIHNvbWV0aGluZyBvdXRzaWRlIHRoZSBVSSB0aHJlYWQgb3IgdHJpZXMgdG8gaW52b2tlIDxjb2RlPnJ1bk9uVWlUaHJlYWQoKTwvY29kZT4uCisgICAgICAgIFRoaXMgZXJyb3IgaXMgY29tbW9uIGlmIHlvdXIgdGVzdCBtZXRob2QgaXMgYW5ub3RhdGVkIHdpdGggPGNvZGU+QFVpVGhyZWFkVGVzdDwvY29kZT4gYnV0IAorICAgICAgICB0aGVuIHRyaWVzIHRvIGRvIHNvbWV0aGluZyBvdXRzaWRlIHRoZSBVSSB0aHJlYWQgb3IgdHJpZXMgdG8gaW52b2tlIAorICAgICAgICA8Y29kZT5ydW5PblVpVGhyZWFkKCk8L2NvZGU+LgogICAgICAgPHA+PHN0cm9uZz5TdWdnZXN0ZWQgUmVzb2x1dGlvbjo8L3N0cm9uZz48L3A+Ci0gICAgICAgIFJlbW92ZSB0aGUgPGNvZGU+QFVpVGhyZWFkVGVzdDwvY29kZT4gYW5ub3RhdGlvbiwgcmVtb3ZlIHRoZSA8Y29kZT5ydW5PblVpVGhyZWFkKCk8L2NvZGU+IGNhbGwsIG9yIHJlLWZhY3RvciB5b3VyIHRlc3RzLgorICAgICAgICBSZW1vdmUgdGhlIDxjb2RlPkBVaVRocmVhZFRlc3Q8L2NvZGU+IGFubm90YXRpb24sIHJlbW92ZSB0aGUgPGNvZGU+cnVuT25VaVRocmVhZCgpPC9jb2RlPiAKKyAgICAgICAgY2FsbCwgb3IgcmUtZmFjdG9yIHlvdXIgdGVzdHMuCiAgICAgPC9kZD4KIDwvZGw+CiAKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9yZXNvdXJjZXMvYnJvd3Nlci5qZCBiL2RvY3MvaHRtbC9yZXNvdXJjZXMvYnJvd3Nlci5qZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTA4NzY5Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9odG1sL3Jlc291cmNlcy9icm93c2VyLmpkCkBAIC0wLDAgKzEsNDkgQEAKK3BhZ2UudGl0bGU9VGVjaG5pY2FsIFJlc291cmNlcworQGpkOmJvZHkKKworPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KKyAge0BsaXRlcmFsIEBpbXBvcnR9ICJ7QGRvY1Jvb3R9YXNzZXRzL2FuZHJvaWQtZGV2ZWxvcGVyLXJlc291cmNlLWJyb3dzZXIuY3NzIjsKKzwvc3R5bGU+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+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL0JpdG1hcC5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL0JpdG1hcC5qYXZhCmluZGV4IDdjYTM3NDEuLmQ5ZWUzZWMgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9CaXRtYXAuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvQml0bWFwLmphdmEKQEAgLTE5LDEyICsxOSwxNiBAQAogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsOwogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsYWJsZTsKIGltcG9ydCBhbmRyb2lkLnV0aWwuRGlzcGxheU1ldHJpY3M7CitpbXBvcnQgYW5kcm9pZC51dGlsLkZpbmFsaXplcnM7CiAKIGltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLm5pby5CdWZmZXI7CiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKIGltcG9ydCBqYXZhLm5pby5JbnRCdWZmZXI7CiBpbXBvcnQgamF2YS5uaW8uU2hvcnRCdWZmZXI7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CiAKIHB1YmxpYyBmaW5hbCBjbGFzcyBCaXRtYXAgaW1wbGVtZW50cyBQYXJjZWxhYmxlIHsKICAgICAvKioKQEAgLTM1LDkgKzM5LDEzIEBACiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVOU0lUWV9OT05FID0gMDsKICAgICAKLSAgICAvLyBOb3RlOiAgbU5hdGl2ZUJpdG1hcCBpcyB1c2VkIGJ5IEZhY2VEZXRlY3Rvcl9qbmkuY3BwCi0gICAgLy8gRG9uJ3QgY2hhbmdlL3JlbmFtZSB3aXRob3V0IHVwZGF0aW5nIEZhY2VEZXRlY3Rvcl9qbmkuY3BwCi0gICAgcHJpdmF0ZSBmaW5hbCBpbnQgbU5hdGl2ZUJpdG1hcDsKKyAgICAvKioKKyAgICAgKiBOb3RlOiAgbU5hdGl2ZUJpdG1hcCBpcyB1c2VkIGJ5IEZhY2VEZXRlY3Rvcl9qbmkuY3BwCisgICAgICogRG9uJ3QgY2hhbmdlL3JlbmFtZSB3aXRob3V0IHVwZGF0aW5nIEZhY2VEZXRlY3Rvcl9qbmkuY3BwCisgICAgICogCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgaW50IG1OYXRpdmVCaXRtYXA7CiAKICAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gbUlzTXV0YWJsZTsKICAgICBwcml2YXRlIGJ5dGVbXSBtTmluZVBhdGNoQ2h1bms7ICAgLy8gbWF5IGJlIG51bGwKQEAgLTUxLDcgKzU5LDcgQEAKICAgICBwcml2YXRlIHN0YXRpYyB2b2xhdGlsZSBNYXRyaXggc1NjYWxlTWF0cml4OwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgdm9sYXRpbGUgaW50IHNEZWZhdWx0RGVuc2l0eSA9IC0xOwotICAgIAorCiAgICAgLyoqCiAgICAgICogRm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCBhbGxvd3MgdGhlIGFwcCBsYXllciB0byBjaGFuZ2UgdGhlIGRlZmF1bHQKICAgICAgKiBkZW5zaXR5IHdoZW4gcnVubmluZyBvbGQgYXBwcy4KQEAgLTc3LDggKzg1LDcgQEAKIAogICAgICAgICBUaGlzIGNhbiBiZSBjYWxsZWQgZnJvbSBKTkkgY29kZS4KICAgICAqLwotICAgIHByaXZhdGUgQml0bWFwKGludCBuYXRpdmVCaXRtYXAsIGJvb2xlYW4gaXNNdXRhYmxlLCBieXRlW10gbmluZVBhdGNoQ2h1bmssCi0gICAgICAgICAgICBpbnQgZGVuc2l0eSkgeworICAgIHByaXZhdGUgQml0bWFwKGludCBuYXRpdmVCaXRtYXAsIGJvb2xlYW4gaXNNdXRhYmxlLCBieXRlW10gbmluZVBhdGNoQ2h1bmssIGludCBkZW5zaXR5KSB7CiAgICAgICAgIGlmIChuYXRpdmVCaXRtYXAgPT0gMCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oImludGVybmFsIGVycm9yOiBuYXRpdmUgYml0bWFwIGlzIDAiKTsKICAgICAgICAgfQpAQCAtOTAsNiArOTcsMTMgQEAKICAgICAgICAgaWYgKGRlbnNpdHkgPj0gMCkgewogICAgICAgICAgICAgbURlbnNpdHkgPSBkZW5zaXR5OwogICAgICAgICB9CisKKyAgICAgICAgLy8gSWYgdGhlIGZpbmFsaXplcnMgcXVldWUgaXMgbnVsbCwgd2UgYXJlIHJ1bm5pbmcgaW4genlnb3RlIGFuZCB0aGUKKyAgICAgICAgLy8gYml0bWFwIHdpbGwgbmV2ZXIgYmUgcmVjbGFpbWVkLCBzbyB3ZSBkb24ndCBuZWVkIHRvIHJ1biBvdXIgbmF0aXZlCisgICAgICAgIC8vIGRlc3RydWN0b3IKKyAgICAgICAgaWYgKEZpbmFsaXplcnMuZ2V0UXVldWUoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBuZXcgQml0bWFwRmluYWxpemVyKHRoaXMpOworICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCkBAIC0xNzIsNiArMTg2LDE5IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgZ2VuZXJhdGlvbiBJRCBvZiB0aGlzIGJpdG1hcC4gVGhlIGdlbmVyYXRpb24gSUQgY2hhbmdlcworICAgICAqIHdoZW5ldmVyIHRoZSBiaXRtYXAgaXMgbW9kaWZpZWQuIFRoaXMgY2FuIGJlIHVzZWQgYXMgYW4gZWZmaWNpZW50IHdheSB0bworICAgICAqIGNoZWNrIGlmIGEgYml0bWFwIGhhcyBjaGFuZ2VkLgorICAgICAqIAorICAgICAqIEByZXR1cm4gVGhlIGN1cnJlbnQgZ2VuZXJhdGlvbiBJRCBmb3IgdGhpcyBiaXRtYXAuCisgICAgICogCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldEdlbmVyYXRpb25JZCgpIHsKKyAgICAgICAgcmV0dXJuIG5hdGl2ZUdlbmVyYXRpb25JZChtTmF0aXZlQml0bWFwKTsKKyAgICB9CisgICAgCisgICAgLyoqCiAgICAgICogVGhpcyBpcyBjYWxsZWQgYnkgbWV0aG9kcyB0aGF0IHdhbnQgdG8gdGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBiaXRtYXAKICAgICAgKiBoYXMgYWxyZWFkeSBiZWVuIHJlY3ljbGVkLgogICAgICAqLwpAQCAtOTk5LDEyICsxMDI2LDIyIEBACiAgICAgICAgIG5hdGl2ZVByZXBhcmVUb0RyYXcobU5hdGl2ZUJpdG1hcCk7CiAgICAgfQogCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgdHJ5IHsKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBCaXRtYXBGaW5hbGl6ZXIgZXh0ZW5kcyBGaW5hbGl6ZXJzLlJlY2xhaW1hYmxlUmVmZXJlbmNlPEJpdG1hcD4geworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTZXQ8Qml0bWFwRmluYWxpemVyPiBzRmluYWxpemVycyA9IENvbGxlY3Rpb25zLnN5bmNocm9uaXplZFNldCgKKyAgICAgICAgICAgICAgICBuZXcgSGFzaFNldDxCaXRtYXBGaW5hbGl6ZXI+KCkpOworCisgICAgICAgIHByaXZhdGUgaW50IG1OYXRpdmVCaXRtYXA7CisKKyAgICAgICAgQml0bWFwRmluYWxpemVyKEJpdG1hcCBiKSB7CisgICAgICAgICAgICBzdXBlcihiLCBGaW5hbGl6ZXJzLmdldFF1ZXVlKCkpOworICAgICAgICAgICAgbU5hdGl2ZUJpdG1hcCA9IGIubU5hdGl2ZUJpdG1hcDsKKyAgICAgICAgICAgIHNGaW5hbGl6ZXJzLmFkZCh0aGlzKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCByZWNsYWltKCkgewogICAgICAgICAgICAgbmF0aXZlRGVzdHJ1Y3RvcihtTmF0aXZlQml0bWFwKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHN1cGVyLmZpbmFsaXplKCk7CisgICAgICAgICAgICBzRmluYWxpemVycy5yZW1vdmUodGhpcyk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTEwNDEsNiArMTA3OCw3IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlQ29weVBpeGVsc1RvQnVmZmVyKGludCBuYXRpdmVCaXRtYXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlciBkc3QpOwogICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZUNvcHlQaXhlbHNGcm9tQnVmZmVyKGludCBuYiwgQnVmZmVyIHNyYyk7CisgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludCBuYXRpdmVHZW5lcmF0aW9uSWQoaW50IG5hdGl2ZUJpdG1hcCk7CiAKICAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgQml0bWFwIG5hdGl2ZUNyZWF0ZUZyb21QYXJjZWwoUGFyY2VsIHApOwogICAgIC8vIHJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvQml0bWFwRmFjdG9yeS5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL0JpdG1hcEZhY3RvcnkuamF2YQppbmRleCAwMmUxNmNkLi41ZGJiZDcwIDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvQml0bWFwRmFjdG9yeS5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9CaXRtYXBGYWN0b3J5LmphdmEKQEAgLTE4LDcgKzE4LDYgQEAKIAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQXNzZXRNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOwotaW1wb3J0IGFuZHJvaWQub3MuTWVtb3J5RmlsZTsKIGltcG9ydCBhbmRyb2lkLnV0aWwuRGlzcGxheU1ldHJpY3M7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlR5cGVkVmFsdWU7CiAKQEAgLTg0LDcgKzgzLDcgQEAKICAgICAgICAgLyoqCiAgICAgICAgICAqIFRoZSBwaXhlbCBkZW5zaXR5IHRvIHVzZSBmb3IgdGhlIGJpdG1hcC4gIFRoaXMgd2lsbCBhbHdheXMgcmVzdWx0CiAgICAgICAgICAqIGluIHRoZSByZXR1cm5lZCBiaXRtYXAgaGF2aW5nIGEgZGVuc2l0eSBzZXQgZm9yIGl0IChzZWUKLSAgICAgICAgICoge0BsaW5rIEJpdG1hcCNzZXREZW5zaXR5KGludCkgQml0bWFwLnNldERlbnNpdHkoaW50KSkuICBJbiBhZGRpdGlvbiwKKyAgICAgICAgICoge0BsaW5rIEJpdG1hcCNzZXREZW5zaXR5KGludCkgQml0bWFwLnNldERlbnNpdHkoaW50KSl9LiAgSW4gYWRkaXRpb24sCiAgICAgICAgICAqIGlmIHtAbGluayAjaW5TY2FsZWR9IGlzIHNldCAod2hpY2ggaXQgaXMgYnkgZGVmYXVsdH0gYW5kIHRoaXMKICAgICAgICAgICogZGVuc2l0eSBkb2VzIG5vdCBtYXRjaCB7QGxpbmsgI2luVGFyZ2V0RGVuc2l0eX0sIHRoZW4gdGhlIGJpdG1hcAogICAgICAgICAgKiB3aWxsIGJlIHNjYWxlZCB0byB0aGUgdGFyZ2V0IGRlbnNpdHkgYmVmb3JlIGJlaW5nIHJldHVybmVkLgpAQCAtNTA3LDkgKzUwNiw3IEBACiAgICAgICoKICAgICAgKiBAcGFyYW0gaXMgVGhlIGlucHV0IHN0cmVhbSB0aGF0IGhvbGRzIHRoZSByYXcgZGF0YSB0byBiZSBkZWNvZGVkIGludG8gYQogICAgICAqICAgICAgICAgICBiaXRtYXAuCi0gICAgICogQHJldHVybiBUaGUgZGVjb2RlZCBiaXRtYXAsIG9yIG51bGwgaWYgdGhlIGltYWdlIGRhdGEgY291bGQgbm90IGJlCi0gICAgICogICAgICAgICBkZWNvZGVkLCBvciwgaWYgb3B0cyBpcyBub24tbnVsbCwgaWYgb3B0cyByZXF1ZXN0ZWQgb25seSB0aGUKLSAgICAgKiAgICAgICAgIHNpemUgYmUgcmV0dXJuZWQgKGluIG9wdHMub3V0V2lkdGggYW5kIG9wdHMub3V0SGVpZ2h0KQorICAgICAqIEByZXR1cm4gVGhlIGRlY29kZWQgYml0bWFwLCBvciBudWxsIGlmIHRoZSBpbWFnZSBkYXRhIGNvdWxkIG5vdCBiZSBkZWNvZGVkLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgQml0bWFwIGRlY29kZVN0cmVhbShJbnB1dFN0cmVhbSBpcykgewogICAgICAgICByZXR1cm4gZGVjb2RlU3RyZWFtKGlzLCBudWxsLCBudWxsKTsKQEAgLTUzMCwxOCArNTI3LDYgQEAKICAgICAgKiBAcmV0dXJuIHRoZSBkZWNvZGVkIGJpdG1hcCwgb3IgbnVsbAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgQml0bWFwIGRlY29kZUZpbGVEZXNjcmlwdG9yKEZpbGVEZXNjcmlwdG9yIGZkLCBSZWN0IG91dFBhZGRpbmcsIE9wdGlvbnMgb3B0cykgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKE1lbW9yeUZpbGUuaXNNZW1vcnlGaWxlKGZkKSkgewotICAgICAgICAgICAgICAgIGludCBtYXBwZWRsZW5ndGggPSBNZW1vcnlGaWxlLmdldFNpemUoZmQpOwotICAgICAgICAgICAgICAgIE1lbW9yeUZpbGUgZmlsZSA9IG5ldyBNZW1vcnlGaWxlKGZkLCBtYXBwZWRsZW5ndGgsICJyIik7Ci0gICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBmaWxlLmdldElucHV0U3RyZWFtKCk7Ci0gICAgICAgICAgICAgICAgQml0bWFwIGJtID0gZGVjb2RlU3RyZWFtKGlzLCBvdXRQYWRkaW5nLCBvcHRzKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmluaXNoRGVjb2RlKGJtLCBvdXRQYWRkaW5nLCBvcHRzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIC8vIGludmFsaWQgZmlsZWRlc2NyaXB0b3IsIG5vIG5lZWQgdG8gY2FsbCBuYXRpdmVEZWNvZGVGaWxlRGVzY3JpcHRvcigpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQogICAgICAgICBCaXRtYXAgYm0gPSBuYXRpdmVEZWNvZGVGaWxlRGVzY3JpcHRvcihmZCwgb3V0UGFkZGluZywgb3B0cyk7CiAgICAgICAgIHJldHVybiBmaW5pc2hEZWNvZGUoYm0sIG91dFBhZGRpbmcsIG9wdHMpOwogICAgIH0KQEAgLTYyOCwxMiArNjEzLDYgQEAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIExhcmdlQml0bWFwIGNyZWF0ZUxhcmdlQml0bWFwKAogICAgICAgICAgICAgRmlsZURlc2NyaXB0b3IgZmQsIGJvb2xlYW4gaXNTaGFyZWFibGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChNZW1vcnlGaWxlLmlzTWVtb3J5RmlsZShmZCkpIHsKLSAgICAgICAgICAgIGludCBtYXBwZWRsZW5ndGggPSBNZW1vcnlGaWxlLmdldFNpemUoZmQpOwotICAgICAgICAgICAgTWVtb3J5RmlsZSBmaWxlID0gbmV3IE1lbW9yeUZpbGUoZmQsIG1hcHBlZGxlbmd0aCwgInIiKTsKLSAgICAgICAgICAgIElucHV0U3RyZWFtIGlzID0gZmlsZS5nZXRJbnB1dFN0cmVhbSgpOwotICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUxhcmdlQml0bWFwKGlzLCBpc1NoYXJlYWJsZSk7Ci0gICAgICAgIH0KICAgICAgICAgcmV0dXJuIG5hdGl2ZUNyZWF0ZUxhcmdlQml0bWFwKGZkLCBpc1NoYXJlYWJsZSk7CiAgICAgfQogCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvQml0bWFwU2hhZGVyLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvQml0bWFwU2hhZGVyLmphdmEKaW5kZXggNjEyYjBhYi4uNGJhNjc5YiAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL0JpdG1hcFNoYWRlci5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9CaXRtYXBTaGFkZXIuamF2YQpAQCAtMTYsMTAgKzE2LDE2IEBACiAKIHBhY2thZ2UgYW5kcm9pZC5ncmFwaGljczsKIAorLyoqCisgKiBTaGFkZXIgdXNlZCB0byBkcmF3IGEgYml0bWFwIGFzIGEgdGV4dHVyZS4gVGhlIGJpdG1hcCBjYW4gYmUgcmVwZWF0ZWQgb3IKKyAqIG1pcnJvcmVkIGJ5IHNldHRpbmcgdGhlIHRpbGluZyBtb2RlLgorICovCiBwdWJsaWMgY2xhc3MgQml0bWFwU2hhZGVyIGV4dGVuZHMgU2hhZGVyIHsKLQotICAgIC8vIHdlIGhvbGQgb24ganVzdCBmb3IgdGhlIEdDLCBzaW5jZSBvdXIgbmF0aXZlIGNvdW50ZXJwYXJ0IGlzIHVzaW5nIGl0Ci0gICAgcHJpdmF0ZSBCaXRtYXAgbUJpdG1hcDsKKyAgICAvKioKKyAgICAgKiBQcmV2ZW50IGdhcmJhZ2UgY29sbGVjdGlvbi4KKyAgICAgKi8KKyAgICBAU3VwcHJlc3NXYXJuaW5ncyh7IkZpZWxkQ2FuQmVMb2NhbCIsICJVbnVzZWREZWNsYXJhdGlvbiJ9KQorICAgIHByaXZhdGUgZmluYWwgQml0bWFwIG1CaXRtYXA7CiAKICAgICAvKioKICAgICAgKiBDYWxsIHRoaXMgdG8gY3JlYXRlIGEgbmV3IHNoYWRlciB0aGF0IHdpbGwgZHJhdyB3aXRoIGEgYml0bWFwLgpAQCAtMzAsMTIgKzM2LDEzIEBACiAgICAgICovCiAgICAgcHVibGljIEJpdG1hcFNoYWRlcihCaXRtYXAgYml0bWFwLCBUaWxlTW9kZSB0aWxlWCwgVGlsZU1vZGUgdGlsZVkpIHsKICAgICAgICAgbUJpdG1hcCA9IGJpdG1hcDsKLSAgICAgICAgbmF0aXZlX2luc3RhbmNlID0gbmF0aXZlQ3JlYXRlKGJpdG1hcC5uaSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGlsZVgubmF0aXZlSW50LCB0aWxlWS5uYXRpdmVJbnQpOworICAgICAgICBmaW5hbCBpbnQgYiA9IGJpdG1hcC5uaSgpOworICAgICAgICBuYXRpdmVfaW5zdGFuY2UgPSBuYXRpdmVDcmVhdGUoYiwgdGlsZVgubmF0aXZlSW50LCB0aWxlWS5uYXRpdmVJbnQpOworICAgICAgICBuYXRpdmVfc2hhZGVyID0gbmF0aXZlUG9zdENyZWF0ZShuYXRpdmVfaW5zdGFuY2UsIGIsIHRpbGVYLm5hdGl2ZUludCwgdGlsZVkubmF0aXZlSW50KTsKICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgaW50IG5hdGl2ZUNyZWF0ZShpbnQgbmF0aXZlX2JpdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2hhZGVyVGlsZU1vZGVYLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaGFkZXJUaWxlTW9kZVkpOyAgICAKKyAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgaW50IG5hdGl2ZUNyZWF0ZShpbnQgbmF0aXZlX2JpdG1hcCwgaW50IHNoYWRlclRpbGVNb2RlWCwKKyAgICAgICAgICAgIGludCBzaGFkZXJUaWxlTW9kZVkpOworICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgbmF0aXZlUG9zdENyZWF0ZShpbnQgbmF0aXZlX3NoYWRlciwgaW50IG5hdGl2ZV9iaXRtYXAsCisgICAgICAgICAgICBpbnQgc2hhZGVyVGlsZU1vZGVYLCBpbnQgc2hhZGVyVGlsZU1vZGVZKTsKIH0KLQpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL0NhbnZhcy5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL0NhbnZhcy5qYXZhCmluZGV4IDc2Y2RlNzMuLjM2YThlNTcgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9DYW52YXMuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvQ2FudmFzLmphdmEKQEAgLTE2LDExICsxNiwxMCBAQAogCiBwYWNrYWdlIGFuZHJvaWQuZ3JhcGhpY3M7CiAKLWltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwotaW1wb3J0IGFuZHJvaWQudGV4dC5TcGFubmVkU3RyaW5nOwotaW1wb3J0IGFuZHJvaWQudGV4dC5TcGFubmFibGVTdHJpbmc7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LkdyYXBoaWNzT3BlcmF0aW9uczsKLWltcG9ydCBhbmRyb2lkLnV0aWwuRGlzcGxheU1ldHJpY3M7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlNwYW5uYWJsZVN0cmluZzsKK2ltcG9ydCBhbmRyb2lkLnRleHQuU3Bhbm5lZFN0cmluZzsKK2ltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwogCiBpbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXMuR0w7CiAKQEAgLTQzLDIyICs0MiwzOSBAQAogICAgICAgICBmb3IgYm90aCB0byBiZSBudWxsLgogICAgICovCiAgICAgcHJpdmF0ZSBCaXRtYXAgIG1CaXRtYXA7ICAgIC8vIGlmIG5vdCBudWxsLCBtR0wgbXVzdCBiZSBudWxsCi0gICAgcHJpdmF0ZSBHTCAgICAgIG1HTDsgICAgICAgIC8vIGlmIG5vdCBudWxsLCBtQml0bWFwIG11c3QgYmUgbnVsbAogICAgIAogICAgIC8vIG9wdGlvbmFsIGZpZWxkIHNldCBieSB0aGUgY2FsbGVyCi0gICAgcHJpdmF0ZSBEcmF3RmlsdGVyICBtRHJhd0ZpbHRlcjsKKyAgICBwcml2YXRlIERyYXdGaWx0ZXIgbURyYXdGaWx0ZXI7CiAKLSAgICAvLyBQYWNrYWdlLXNjb3BlZCBmb3IgcXVpY2sgYWNjZXNzLgotICAgIC8qcGFja2FnZSovIGludCBtRGVuc2l0eSA9IEJpdG1hcC5ERU5TSVRZX05PTkU7CisgICAgLyoqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgaW50IG1EZW5zaXR5ID0gQml0bWFwLkRFTlNJVFlfTk9ORTsKIAotICAgIC8vIFVzZWQgdG8gZGV0ZXJtaW5lIHdoZW4gY29tcGF0aWJpbGl0eSBzY2FsaW5nIGlzIGluIGVmZmVjdC4KLSAgICBwcml2YXRlIGludCBtU2NyZWVuRGVuc2l0eSA9IEJpdG1hcC5ERU5TSVRZX05PTkU7CisgICAgLyoqCisgICAgICogVXNlZCB0byBkZXRlcm1pbmUgd2hlbiBjb21wYXRpYmlsaXR5IHNjYWxpbmcgaXMgaW4gZWZmZWN0LgorICAgICAqIAorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHJvdGVjdGVkIGludCBtU2NyZWVuRGVuc2l0eSA9IEJpdG1hcC5ERU5TSVRZX05PTkU7CiAgICAgCiAgICAgLy8gVXNlZCBieSBuYXRpdmUgY29kZQogICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsiVW51c2VkRGVjbGFyYXRpb24ifSkKICAgICBwcml2YXRlIGludCAgICAgICAgIG1TdXJmYWNlRm9ybWF0OwogCiAgICAgLyoqCisgICAgICogRmxhZyBmb3IgZHJhd1RleHRSdW4gaW5kaWNhdGluZyBsZWZ0LXRvLXJpZ2h0IHJ1biBkaXJlY3Rpb24uCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBESVJFQ1RJT05fTFRSID0gMDsKKyAgICAKKyAgICAvKioKKyAgICAgKiBGbGFnIGZvciBkcmF3VGV4dFJ1biBpbmRpY2F0aW5nIHJpZ2h0LXRvLWxlZnQgcnVuIGRpcmVjdGlvbi4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJUkVDVElPTl9SVEwgPSAxOworICAgIAorICAgIC8qKgogICAgICAqIENvbnN0cnVjdCBhbiBlbXB0eSByYXN0ZXIgY2FudmFzLiBVc2Ugc2V0Qml0bWFwKCkgdG8gc3BlY2lmeSBhIGJpdG1hcCB0bwogICAgICAqIGRyYXcgaW50by4gIFRoZSBpbml0aWFsIHRhcmdldCBkZW5zaXR5IGlzIHtAbGluayBCaXRtYXAjREVOU0lUWV9OT05FfTsKICAgICAgKiB0aGlzIHdpbGwgdHlwaWNhbGx5IGJlIHJlcGxhY2VkIHdoZW4gYSB0YXJnZXQgYml0bWFwIGlzIHNldCBmb3IgdGhlCkBAIC04OSw0NyArMTA1LDM3IEBACiAgICAgICAgIG1EZW5zaXR5ID0gYml0bWFwLm1EZW5zaXR5OwogICAgIH0KICAgICAKLSAgICAvKnBhY2thZ2UqLyBDYW52YXMoaW50IG5hdGl2ZUNhbnZhcykgeworICAgIENhbnZhcyhpbnQgbmF0aXZlQ2FudmFzKSB7CiAgICAgICAgIGlmIChuYXRpdmVDYW52YXMgPT0gMCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwogICAgICAgICB9CiAgICAgICAgIG1OYXRpdmVDYW52YXMgPSBuYXRpdmVDYW52YXM7CiAgICAgICAgIG1EZW5zaXR5ID0gQml0bWFwLmdldERlZmF1bHREZW5zaXR5KCk7CiAgICAgfQotICAgIAorCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0IGEgY2FudmFzIHdpdGggdGhlIHNwZWNpZmllZCBnbCBjb250ZXh0LiBBbGwgZHJhd2luZyB0aHJvdWdoCi0gICAgICogdGhpcyBjYW52YXMgd2lsbCBiZSByZWRpcmVjdGVkIHRvIE9wZW5HTC4gTm90ZTogc29tZSBmZWF0dXJlcyBtYXkgbm90Ci0gICAgICogYmUgc3VwcG9ydGVkIGluIHRoaXMgbW9kZSAoZS5nLiBzb21lIEdMIGltcGxlbWVudGF0aW9ucyBtYXkgbm90IHN1cHBvcnQKLSAgICAgKiBhbnRpYWxpYXNpbmcgb3IgY2VydGFpbiBlZmZlY3RzIGxpa2UgQ29sb3JNYXRyaXggb3IgY2VydGFpbiBYZmVybW9kZXMpLgotICAgICAqIEhvd2V2ZXIsIG5vIGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93biBpbiB0aG9zZSBjYXNlcy4KKyAgICAgKiBSZXR1cm5zIG51bGwuCiAgICAgICogCi0gICAgICogPHA+VGhlIGluaXRpYWwgdGFyZ2V0IGRlbnNpdHkgb2YgdGhlIGNhbnZhcyBpcyB0aGUgc2FtZSBhcyB0aGUgaW5pdGlhbAotICAgICAqIGRlbnNpdHkgb2YgYml0bWFwcyBhcyBwZXIge0BsaW5rIEJpdG1hcCNnZXREZW5zaXR5KCkgQml0bWFwLmdldERlbnNpdHkoKX0uCisgICAgICogQGRlcHJlY2F0ZWQgVGhpcyBtZXRob2QgaXMgbm90IHN1cHBvcnRlZCBhbmQgc2hvdWxkIG5vdCBiZSBpbnZva2VkLgogICAgICAqLwotICAgIHB1YmxpYyBDYW52YXMoR0wgZ2wpIHsKLSAgICAgICAgbU5hdGl2ZUNhbnZhcyA9IGluaXRHTCgpOwotICAgICAgICBtR0wgPSBnbDsKLSAgICAgICAgbURlbnNpdHkgPSBCaXRtYXAuZ2V0RGVmYXVsdERlbnNpdHkoKTsKKyAgICBARGVwcmVjYXRlZAorICAgIHByb3RlY3RlZCBHTCBnZXRHTCgpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQotICAgIAorCiAgICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBHTCBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY2FudmFzLCBvciBudWxsIGlmIGl0IGlzIG5vdAotICAgICAqIGJhY2tlZCBieSBHTC4KKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIENhbnZhcyB1c2VzIGhhcmR3YXJlIGFjY2VsZXJhdGlvbi4KKyAgICAgKiAKKyAgICAgKiBOb3RlIHRoYXQgdGhpcyBtZXRob2QgZG9lcyBub3QgZGVmaW5lIHdoYXQgdHlwZSBvZiBoYXJkd2FyZSBhY2NlbGVyYXRpb24KKyAgICAgKiBtYXkgb3IgbWF5IG5vdCBiZSB1c2VkLgorICAgICAqIAorICAgICAqIEByZXR1cm4gVHJ1ZSBpZiBkcmF3aW5nIG9wZXJhdGlvbnMgYXJlIGhhcmR3YXJlIGFjY2VsZXJhdGVkLAorICAgICAqICAgICAgICAgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAqLwotICAgIHB1YmxpYyBHTCBnZXRHTCgpIHsKLSAgICAgICAgcmV0dXJuIG1HTDsKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0hhcmR3YXJlQWNjZWxlcmF0ZWQoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ2FsbCB0aGlzIHRvIGZyZWUgdXAgT3BlbkdMIHJlc291cmNlcyB0aGF0IG1heSBiZSBjYWNoZWQgb3IgYWxsb2NhdGVkCi0gICAgICogb24gYmVoYWxmIG9mIHRoZSBDYW52YXMuIEFueSBzdWJzZXF1ZW50IGRyYXdpbmcgd2l0aCBhIEdMLWJhY2tlZCBDYW52YXMKLSAgICAgKiB3aWxsIGhhdmUgdG8gcmVjcmVhdGUgdGhvc2UgcmVzb3VyY2VzLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBmcmVlR2xDYWNoZXMoKSB7Ci0gICAgICAgIGZyZWVDYWNoZXMoKTsKLSAgICB9Ci0gICAgICAgIAorCiAgICAgLyoqCiAgICAgICogU3BlY2lmeSBhIGJpdG1hcCBmb3IgdGhlIGNhbnZhcyB0byBkcmF3IGludG8uICBBcyBhIHNpZGUtZWZmZWN0LCBhbHNvCiAgICAgICogdXBkYXRlcyB0aGUgY2FudmFzJ3MgdGFyZ2V0IGRlbnNpdHkgdG8gbWF0Y2ggdGhhdCBvZiB0aGUgYml0bWFwLgpAQCAtMTQzLDcgKzE0OSw3IEBACiAgICAgICAgIGlmICghYml0bWFwLmlzTXV0YWJsZSgpKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKG1HTCAhPSBudWxsKSB7CisgICAgICAgIGlmIChpc0hhcmR3YXJlQWNjZWxlcmF0ZWQoKSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkNhbid0IHNldCBhIGJpdG1hcCBkZXZpY2Ugb24gYSBHTCBjYW52YXMiKTsKICAgICAgICAgfQogICAgICAgICB0aHJvd0lmUmVjeWNsZWQoYml0bWFwKTsKQEAgLTE1NywxMyArMTYzLDEyIEBACiAgICAgICogU2V0IHRoZSB2aWV3cG9ydCBkaW1lbnNpb25zIGlmIHRoaXMgY2FudmFzIGlzIEdMIGJhc2VkLiBJZiBpdCBpcyBub3QsCiAgICAgICogdGhpcyBtZXRob2QgaXMgaWdub3JlZCBhbmQgbm8gZXhjZXB0aW9uIGlzIHRocm93bi4KICAgICAgKgotICAgICAqICBAcGFyYW0gd2lkdGggICAgVGhlIHdpZHRoIG9mIHRoZSB2aWV3cG9ydAotICAgICAqICBAcGFyYW0gaGVpZ2h0ICAgVGhlIGhlaWdodCBvZiB0aGUgdmlld3BvcnQKKyAgICAgKiBAcGFyYW0gd2lkdGggVGhlIHdpZHRoIG9mIHRoZSB2aWV3cG9ydAorICAgICAqIEBwYXJhbSBoZWlnaHQgVGhlIGhlaWdodCBvZiB0aGUgdmlld3BvcnQKKyAgICAgKiAKKyAgICAgKiBAaGlkZQogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFZpZXdwb3J0KGludCB3aWR0aCwgaW50IGhlaWdodCkgewotICAgICAgICBpZiAobUdMICE9IG51bGwpIHsKLSAgICAgICAgICAgIG5hdGl2ZVNldFZpZXdwb3J0KG1OYXRpdmVDYW52YXMsIHdpZHRoLCBoZWlnaHQpOwotICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCkBAIC0zNzcsOCArMzgyLDggQEAKICAgICAgKgogICAgICAqIEBwYXJhbSBzeCBUaGUgYW1vdW50IHRvIHNjYWxlIGluIFgKICAgICAgKiBAcGFyYW0gc3kgVGhlIGFtb3VudCB0byBzY2FsZSBpbiBZCi0gICAgICogQHBhcmFtIHB4IFRoZSB4LWNvb3JkIGZvciB0aGUgcGl2b3QgcG9pbnQgKHVuY2hhbmdlZCBieSB0aGUgcm90YXRpb24pCi0gICAgICogQHBhcmFtIHB5IFRoZSB5LWNvb3JkIGZvciB0aGUgcGl2b3QgcG9pbnQgKHVuY2hhbmdlZCBieSB0aGUgcm90YXRpb24pCisgICAgICogQHBhcmFtIHB4IFRoZSB4LWNvb3JkIGZvciB0aGUgcGl2b3QgcG9pbnQgKHVuY2hhbmdlZCBieSB0aGUgc2NhbGUpCisgICAgICogQHBhcmFtIHB5IFRoZSB5LWNvb3JkIGZvciB0aGUgcGl2b3QgcG9pbnQgKHVuY2hhbmdlZCBieSB0aGUgc2NhbGUpCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIHZvaWQgc2NhbGUoZmxvYXQgc3gsIGZsb2F0IHN5LCBmbG9hdCBweCwgZmxvYXQgcHkpIHsKICAgICAgICAgdHJhbnNsYXRlKHB4LCBweSk7CkBAIC02MjEsNyArNjI2LDExIEBACiAgICAgICAgIEVkZ2VUeXBlKGludCBuYXRpdmVJbnQpIHsKICAgICAgICAgICAgIHRoaXMubmF0aXZlSW50ID0gbmF0aXZlSW50OwogICAgICAgICB9Ci0gICAgICAgIGZpbmFsIGludCBuYXRpdmVJbnQ7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBoaWRlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgZmluYWwgaW50IG5hdGl2ZUludDsKICAgICB9CiAKICAgICAvKioKQEAgLTk1OCw2ICs5NjcsMjEgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBEcmF3cyB0aGUgc3BlY2lmaWVkIGJpdG1hcCBhcyBhbiBOLXBhdGNoIChtb3N0IG9mdGVuLCBhIDktcGF0Y2hlcy4pCisgICAgICoKKyAgICAgKiBOb3RlOiBPbmx5IHN1cHBvcnRlZCBieSBoYXJkd2FyZSBhY2NlbGVyYXRlZCBjYW52YXMgYXQgdGhlIG1vbWVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBiaXRtYXAgVGhlIGJpdG1hcCB0byBkcmF3IGFzIGFuIE4tcGF0Y2gKKyAgICAgKiBAcGFyYW0gY2h1bmtzIFRoZSBwYXRjaGVzIGluZm9ybWF0aW9uIChtYXRjaGVzIHRoZSBuYXRpdmUgc3RydWN0IFJlc19wbmdfOXBhdGNoKQorICAgICAqIEBwYXJhbSBkc3QgVGhlIGRlc3RpbmF0aW9uIHJlY3RhbmdsZS4KKyAgICAgKiBAcGFyYW0gcGFpbnQgVGhlIHBhaW50IHRvIGRyYXcgdGhlIGJpdG1hcCB3aXRoLiBtYXkgYmUgbnVsbAorICAgICAqIAorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHZvaWQgZHJhd1BhdGNoKEJpdG1hcCBiaXRtYXAsIGJ5dGVbXSBjaHVua3MsIFJlY3RGIGRzdCwgUGFpbnQgcGFpbnQpIHsKKyAgICB9ICAgIAorICAgIAorICAgIC8qKgogICAgICAqIERyYXcgdGhlIHNwZWNpZmllZCBiaXRtYXAsIHdpdGggaXRzIHRvcC9sZWZ0IGNvcm5lciBhdCAoeCx5KSwgdXNpbmcKICAgICAgKiB0aGUgc3BlY2lmaWVkIHBhaW50LCB0cmFuc2Zvcm1lZCBieSB0aGUgY3VycmVudCBtYXRyaXguCiAgICAgICogCkBAIC0xMjQ2LDggKzEyNzAsOCBAQAogICAgICAgICAgICAgKHRleHQubGVuZ3RoIC0gaW5kZXggLSBjb3VudCkpIDwgMCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKICAgICAgICAgfQotICAgICAgICBuYXRpdmVfZHJhd1RleHQobU5hdGl2ZUNhbnZhcywgdGV4dCwgaW5kZXgsIGNvdW50LCB4LCB5LAotICAgICAgICAgICAgICAgICAgICAgICAgcGFpbnQubU5hdGl2ZVBhaW50KTsKKyAgICAgICAgbmF0aXZlX2RyYXdUZXh0KG1OYXRpdmVDYW52YXMsIHRleHQsIGluZGV4LCBjb3VudCwgeCwgeSwgcGFpbnQubUJpZGlGbGFncywKKyAgICAgICAgICAgICAgICBwYWludC5tTmF0aXZlUGFpbnQpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTI1OSw3ICsxMjgzLDEwIEBACiAgICAgICogQHBhcmFtIHkgICAgIFRoZSB5LWNvb3JkaW5hdGUgb2YgdGhlIG9yaWdpbiBvZiB0aGUgdGV4dCBiZWluZyBkcmF3bgogICAgICAqIEBwYXJhbSBwYWludCBUaGUgcGFpbnQgdXNlZCBmb3IgdGhlIHRleHQgKGUuZy4gY29sb3IsIHNpemUsIHN0eWxlKQogICAgICAqLwotICAgIHB1YmxpYyBuYXRpdmUgdm9pZCBkcmF3VGV4dChTdHJpbmcgdGV4dCwgZmxvYXQgeCwgZmxvYXQgeSwgUGFpbnQgcGFpbnQpOworICAgIHB1YmxpYyB2b2lkIGRyYXdUZXh0KFN0cmluZyB0ZXh0LCBmbG9hdCB4LCBmbG9hdCB5LCBQYWludCBwYWludCkgeworICAgICAgICBuYXRpdmVfZHJhd1RleHQobU5hdGl2ZUNhbnZhcywgdGV4dCwgMCwgdGV4dC5sZW5ndGgoKSwgeCwgeSwgcGFpbnQubUJpZGlGbGFncywKKyAgICAgICAgICAgICAgICBwYWludC5tTmF0aXZlUGFpbnQpOworICAgIH0KIAogICAgIC8qKgogICAgICAqIERyYXcgdGhlIHRleHQsIHdpdGggb3JpZ2luIGF0ICh4LHkpLCB1c2luZyB0aGUgc3BlY2lmaWVkIHBhaW50LgpAQCAtMTI3Nyw4ICsxMzA0LDggQEAKICAgICAgICAgaWYgKChzdGFydCB8IGVuZCB8IChlbmQgLSBzdGFydCkgfCAodGV4dC5sZW5ndGgoKSAtIGVuZCkpIDwgMCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKICAgICAgICAgfQotICAgICAgICBuYXRpdmVfZHJhd1RleHQobU5hdGl2ZUNhbnZhcywgdGV4dCwgc3RhcnQsIGVuZCwgeCwgeSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhaW50Lm1OYXRpdmVQYWludCk7CisgICAgICAgIG5hdGl2ZV9kcmF3VGV4dChtTmF0aXZlQ2FudmFzLCB0ZXh0LCBzdGFydCwgZW5kLCB4LCB5LCBwYWludC5tQmlkaUZsYWdzLAorICAgICAgICAgICAgICAgIHBhaW50Lm1OYXRpdmVQYWludCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMjk5LDE2ICsxMzI2LDEwOCBAQAogICAgICAgICBpZiAodGV4dCBpbnN0YW5jZW9mIFN0cmluZyB8fCB0ZXh0IGluc3RhbmNlb2YgU3Bhbm5lZFN0cmluZyB8fAogICAgICAgICAgICAgdGV4dCBpbnN0YW5jZW9mIFNwYW5uYWJsZVN0cmluZykgewogICAgICAgICAgICAgbmF0aXZlX2RyYXdUZXh0KG1OYXRpdmVDYW52YXMsIHRleHQudG9TdHJpbmcoKSwgc3RhcnQsIGVuZCwgeCwgeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWludC5tTmF0aXZlUGFpbnQpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHRleHQgaW5zdGFuY2VvZiBHcmFwaGljc09wZXJhdGlvbnMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWludC5tQmlkaUZsYWdzLCBwYWludC5tTmF0aXZlUGFpbnQpOworICAgICAgICB9IGVsc2UgaWYgKHRleHQgaW5zdGFuY2VvZiBHcmFwaGljc09wZXJhdGlvbnMpIHsKICAgICAgICAgICAgICgoR3JhcGhpY3NPcGVyYXRpb25zKSB0ZXh0KS5kcmF3VGV4dCh0aGlzLCBzdGFydCwgZW5kLCB4LCB5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWludCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7CisgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBjaGFyW10gYnVmID0gVGVtcG9yYXJ5QnVmZmVyLm9idGFpbihlbmQgLSBzdGFydCk7CiAgICAgICAgICAgICBUZXh0VXRpbHMuZ2V0Q2hhcnModGV4dCwgc3RhcnQsIGVuZCwgYnVmLCAwKTsKLSAgICAgICAgICAgIGRyYXdUZXh0KGJ1ZiwgMCwgZW5kIC0gc3RhcnQsIHgsIHksIHBhaW50KTsKKyAgICAgICAgICAgIG5hdGl2ZV9kcmF3VGV4dChtTmF0aXZlQ2FudmFzLCBidWYsIDAsIGVuZCAtIHN0YXJ0LCB4LCB5LCAKKyAgICAgICAgICAgICAgICAgICAgcGFpbnQubUJpZGlGbGFncywgcGFpbnQubU5hdGl2ZVBhaW50KTsKKyAgICAgICAgICAgIFRlbXBvcmFyeUJ1ZmZlci5yZWN5Y2xlKGJ1Zik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW5kZXIgYSBydW4gb2YgYWxsIExUUiBvciBhbGwgUlRMIHRleHQsIHdpdGggc2hhcGluZy4gVGhpcyBkb2VzIG5vdCBydW4KKyAgICAgKiBiaWRpIG9uIHRoZSBwcm92aWRlZCB0ZXh0LCBidXQgcmVuZGVycyBpdCBhcyBhIHVuaWZvcm0gcmlnaHQtdG8tbGVmdCBvcgorICAgICAqIGxlZnQtdG8tcmlnaHQgcnVuLCBhcyBpbmRpY2F0ZWQgYnkgZGlyLiBBbGlnbm1lbnQgb2YgdGhlIHRleHQgaXMgYXMKKyAgICAgKiBkZXRlcm1pbmVkIGJ5IHRoZSBQYWludCdzIFRleHRBbGlnbiB2YWx1ZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdGV4dCB0aGUgdGV4dCB0byByZW5kZXIKKyAgICAgKiBAcGFyYW0gaW5kZXggdGhlIHN0YXJ0IG9mIHRoZSB0ZXh0IHRvIHJlbmRlcgorICAgICAqIEBwYXJhbSBjb3VudCB0aGUgY291bnQgb2YgY2hhcnMgdG8gcmVuZGVyCisgICAgICogQHBhcmFtIGNvbnRleHRJbmRleCB0aGUgc3RhcnQgb2YgdGhlIGNvbnRleHQgZm9yIHNoYXBpbmcuICBNdXN0IGJlCisgICAgICogICAgICAgICBubyBncmVhdGVyIHRoYW4gaW5kZXguCisgICAgICogQHBhcmFtIGNvbnRleHRDb3VudCB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gdGhlIGNvbnRleHQgZm9yIHNoYXBpbmcuCisgICAgICogICAgICAgICBDb250ZXhJbmRleCArIGNvbnRleHRDb3VudCBtdXN0IGJlIG5vIGxlc3MgdGhhbiBpbmRleAorICAgICAqICAgICAgICAgKyBjb3VudC4KKyAgICAgKiBAcGFyYW0geCB0aGUgeCBwb3NpdGlvbiBhdCB3aGljaCB0byBkcmF3IHRoZSB0ZXh0CisgICAgICogQHBhcmFtIHkgdGhlIHkgcG9zaXRpb24gYXQgd2hpY2ggdG8gZHJhdyB0aGUgdGV4dAorICAgICAqIEBwYXJhbSBkaXIgdGhlIHJ1biBkaXJlY3Rpb24sIGVpdGhlciB7QGxpbmsgI0RJUkVDVElPTl9MVFJ9IG9yCisgICAgICogICAgICAgICB7QGxpbmsgI0RJUkVDVElPTl9SVEx9LgorICAgICAqIEBwYXJhbSBwYWludCB0aGUgcGFpbnQKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGRyYXdUZXh0UnVuKGNoYXJbXSB0ZXh0LCBpbnQgaW5kZXgsIGludCBjb3VudCwKKyAgICAgICAgICAgIGludCBjb250ZXh0SW5kZXgsIGludCBjb250ZXh0Q291bnQsIGZsb2F0IHgsIGZsb2F0IHksIGludCBkaXIsCisgICAgICAgICAgICBQYWludCBwYWludCkgeworCisgICAgICAgIGlmICh0ZXh0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigidGV4dCBpcyBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBhaW50ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigicGFpbnQgaXMgbnVsbCIpOworICAgICAgICB9CisgICAgICAgIGlmICgoaW5kZXggfCBjb3VudCB8IHRleHQubGVuZ3RoIC0gaW5kZXggLSBjb3VudCkgPCAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIGlmIChkaXIgIT0gRElSRUNUSU9OX0xUUiAmJiBkaXIgIT0gRElSRUNUSU9OX1JUTCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidW5rbm93biBkaXI6ICIgKyBkaXIpOworICAgICAgICB9CisKKyAgICAgICAgbmF0aXZlX2RyYXdUZXh0UnVuKG1OYXRpdmVDYW52YXMsIHRleHQsIGluZGV4LCBjb3VudCwKKyAgICAgICAgICAgICAgICBjb250ZXh0SW5kZXgsIGNvbnRleHRDb3VudCwgeCwgeSwgZGlyLCBwYWludC5tTmF0aXZlUGFpbnQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbmRlciBhIHJ1biBvZiBhbGwgTFRSIG9yIGFsbCBSVEwgdGV4dCwgd2l0aCBzaGFwaW5nLiBUaGlzIGRvZXMgbm90IHJ1bgorICAgICAqIGJpZGkgb24gdGhlIHByb3ZpZGVkIHRleHQsIGJ1dCByZW5kZXJzIGl0IGFzIGEgdW5pZm9ybSByaWdodC10by1sZWZ0IG9yCisgICAgICogbGVmdC10by1yaWdodCBydW4sIGFzIGluZGljYXRlZCBieSBkaXIuIEFsaWdubWVudCBvZiB0aGUgdGV4dCBpcyBhcworICAgICAqIGRldGVybWluZWQgYnkgdGhlIFBhaW50J3MgVGV4dEFsaWduIHZhbHVlLgorICAgICAqCisgICAgICogQHBhcmFtIHRleHQgdGhlIHRleHQgdG8gcmVuZGVyCisgICAgICogQHBhcmFtIHN0YXJ0IHRoZSBzdGFydCBvZiB0aGUgdGV4dCB0byByZW5kZXIuIERhdGEgYmVmb3JlIHRoaXMgcG9zaXRpb24KKyAgICAgKiAgICAgICAgICAgIGNhbiBiZSB1c2VkIGZvciBzaGFwaW5nIGNvbnRleHQuCisgICAgICogQHBhcmFtIGVuZCB0aGUgZW5kIG9mIHRoZSB0ZXh0IHRvIHJlbmRlci4gRGF0YSBhdCBvciBhZnRlciB0aGlzCisgICAgICogICAgICAgICAgICBwb3NpdGlvbiBjYW4gYmUgdXNlZCBmb3Igc2hhcGluZyBjb250ZXh0LgorICAgICAqIEBwYXJhbSB4IHRoZSB4IHBvc2l0aW9uIGF0IHdoaWNoIHRvIGRyYXcgdGhlIHRleHQKKyAgICAgKiBAcGFyYW0geSB0aGUgeSBwb3NpdGlvbiBhdCB3aGljaCB0byBkcmF3IHRoZSB0ZXh0CisgICAgICogQHBhcmFtIGRpciB0aGUgcnVuIGRpcmVjdGlvbiwgZWl0aGVyIDAgZm9yIExUUiBvciAxIGZvciBSVEwuCisgICAgICogQHBhcmFtIHBhaW50IHRoZSBwYWludAorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHZvaWQgZHJhd1RleHRSdW4oQ2hhclNlcXVlbmNlIHRleHQsIGludCBzdGFydCwgaW50IGVuZCwKKyAgICAgICAgICAgIGludCBjb250ZXh0U3RhcnQsIGludCBjb250ZXh0RW5kLCBmbG9hdCB4LCBmbG9hdCB5LCBpbnQgZGlyLAorICAgICAgICAgICAgUGFpbnQgcGFpbnQpIHsKKworICAgICAgICBpZiAodGV4dCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oInRleHQgaXMgbnVsbCIpOworICAgICAgICB9CisgICAgICAgIGlmIChwYWludCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oInBhaW50IGlzIG51bGwiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKHN0YXJ0IHwgZW5kIHwgZW5kIC0gc3RhcnQgfCB0ZXh0Lmxlbmd0aCgpIC0gZW5kKSA8IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBpbnQgZmxhZ3MgPSBkaXIgPT0gMCA/IDAgOiAxOworCisgICAgICAgIGlmICh0ZXh0IGluc3RhbmNlb2YgU3RyaW5nIHx8IHRleHQgaW5zdGFuY2VvZiBTcGFubmVkU3RyaW5nIHx8CisgICAgICAgICAgICAgICAgdGV4dCBpbnN0YW5jZW9mIFNwYW5uYWJsZVN0cmluZykgeworICAgICAgICAgICAgbmF0aXZlX2RyYXdUZXh0UnVuKG1OYXRpdmVDYW52YXMsIHRleHQudG9TdHJpbmcoKSwgc3RhcnQsIGVuZCwKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dFN0YXJ0LCBjb250ZXh0RW5kLCB4LCB5LCBmbGFncywgcGFpbnQubU5hdGl2ZVBhaW50KTsKKyAgICAgICAgfSBlbHNlIGlmICh0ZXh0IGluc3RhbmNlb2YgR3JhcGhpY3NPcGVyYXRpb25zKSB7CisgICAgICAgICAgICAoKEdyYXBoaWNzT3BlcmF0aW9ucykgdGV4dCkuZHJhd1RleHRSdW4odGhpcywgc3RhcnQsIGVuZCwKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dFN0YXJ0LCBjb250ZXh0RW5kLCB4LCB5LCBmbGFncywgcGFpbnQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW50IGNvbnRleHRMZW4gPSBjb250ZXh0RW5kIC0gY29udGV4dFN0YXJ0OworICAgICAgICAgICAgaW50IGxlbiA9IGVuZCAtIHN0YXJ0OworICAgICAgICAgICAgY2hhcltdIGJ1ZiA9IFRlbXBvcmFyeUJ1ZmZlci5vYnRhaW4oY29udGV4dExlbik7CisgICAgICAgICAgICBUZXh0VXRpbHMuZ2V0Q2hhcnModGV4dCwgY29udGV4dFN0YXJ0LCBjb250ZXh0RW5kLCBidWYsIDApOworICAgICAgICAgICAgbmF0aXZlX2RyYXdUZXh0UnVuKG1OYXRpdmVDYW52YXMsIGJ1Ziwgc3RhcnQgLSBjb250ZXh0U3RhcnQsIGxlbiwKKyAgICAgICAgICAgICAgICAgICAgMCwgY29udGV4dExlbiwgeCwgeSwgZmxhZ3MsIHBhaW50Lm1OYXRpdmVQYWludCk7CiAgICAgICAgICAgICBUZW1wb3JhcnlCdWZmZXIucmVjeWNsZShidWYpOwogICAgICAgICB9CiAgICAgfQpAQCAtMTM2OCw3ICsxNDg3LDcgQEAKICAgICAgICAgfQogICAgICAgICBuYXRpdmVfZHJhd1RleHRPblBhdGgobU5hdGl2ZUNhbnZhcywgdGV4dCwgaW5kZXgsIGNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aC5uaSgpLCBoT2Zmc2V0LCB2T2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFpbnQubU5hdGl2ZVBhaW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhaW50Lm1CaWRpRmxhZ3MsIHBhaW50Lm1OYXRpdmVQYWludCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMzg4LDcgKzE1MDcsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHZPZmZzZXQsIFBhaW50IHBhaW50KSB7CiAgICAgICAgIGlmICh0ZXh0Lmxlbmd0aCgpID4gMCkgewogICAgICAgICAgICAgbmF0aXZlX2RyYXdUZXh0T25QYXRoKG1OYXRpdmVDYW52YXMsIHRleHQsIHBhdGgubmkoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoT2Zmc2V0LCB2T2Zmc2V0LCBwYWludC5tTmF0aXZlUGFpbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhPZmZzZXQsIHZPZmZzZXQsIHBhaW50Lm1CaWRpRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFpbnQubU5hdGl2ZVBhaW50KTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTQzMiwyNyArMTU1MiwyOCBAQAogICAgICAgICByZXN0b3JlKCk7CiAgICAgfQogICAgIAorICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIHN1cGVyLmZpbmFsaXplKCk7Ci0gICAgICAgIC8vIElmIHRoZSBjb25zdHJ1Y3RvciB0aHJldyBhbiBleGNlcHRpb24gYmVmb3JlIHNldHRpbmcgbU5hdGl2ZUNhbnZhcywgdGhlIG5hdGl2ZSBmaW5hbGl6ZXIKLSAgICAgICAgLy8gbXVzdCBub3QgYmUgaW52b2tlZC4KLSAgICAgICAgaWYgKG1OYXRpdmVDYW52YXMgIT0gMCkgewotICAgICAgICAgICAgZmluYWxpemVyKG1OYXRpdmVDYW52YXMpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3VwZXIuZmluYWxpemUoKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIC8vIElmIHRoZSBjb25zdHJ1Y3RvciB0aHJldyBhbiBleGNlcHRpb24gYmVmb3JlIHNldHRpbmcgbU5hdGl2ZUNhbnZhcywKKyAgICAgICAgICAgIC8vIHRoZSBuYXRpdmUgZmluYWxpemVyIG11c3Qgbm90IGJlIGludm9rZWQuCisgICAgICAgICAgICBpZiAobU5hdGl2ZUNhbnZhcyAhPSAwKSB7CisgICAgICAgICAgICAgICAgZmluYWxpemVyKG1OYXRpdmVDYW52YXMpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogRnJlZSB1cCBhcyBtdWNoIG1lbW9yeSBhcyBwb3NzaWJsZSBmcm9tIHByaXZhdGUgY2FjaGVzIChlLmcuIGZvbnRzLAotICAgICAqIGltYWdlcykKKyAgICAgKiBGcmVlIHVwIGFzIG11Y2ggbWVtb3J5IGFzIHBvc3NpYmxlIGZyb20gcHJpdmF0ZSBjYWNoZXMgKGUuZy4gZm9udHMsIGltYWdlcykKICAgICAgKgotICAgICAqIEBoaWRlIC0gZm9yIG5vdworICAgICAqIEBoaWRlCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBmcmVlQ2FjaGVzKCk7CiAKICAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgaW50IGluaXRSYXN0ZXIoaW50IG5hdGl2ZUJpdG1hcE9yWmVybyk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludCBpbml0R0woKTsKICAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBuYXRpdmVfc2V0Qml0bWFwKGludCBuYXRpdmVDYW52YXMsIGludCBiaXRtYXApOwotICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZVNldFZpZXdwb3J0KGludCBuQ2FudmFzLCBpbnQgdywgaW50IGgpOwogICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgbmF0aXZlX3NhdmVMYXllcihpbnQgbmF0aXZlQ2FudmFzLCBSZWN0RiBib3VuZHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwYWludCwgaW50IGxheWVyRmxhZ3MpOwogICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgbmF0aXZlX3NhdmVMYXllcihpbnQgbmF0aXZlQ2FudmFzLCBmbG9hdCBsLApAQCAtMTU1NSwxMCArMTY3NiwxOSBAQAogICAgIAogICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZV9kcmF3VGV4dChpbnQgbmF0aXZlQ2FudmFzLCBjaGFyW10gdGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LCBpbnQgY291bnQsIGZsb2F0IHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHksIGludCBwYWludCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHksIGludCBmbGFncywgaW50IHBhaW50KTsKICAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBuYXRpdmVfZHJhd1RleHQoaW50IG5hdGl2ZUNhbnZhcywgU3RyaW5nIHRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydCwgaW50IGVuZCwgZmxvYXQgeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeSwgaW50IHBhaW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeSwgaW50IGZsYWdzLCBpbnQgcGFpbnQpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlX2RyYXdUZXh0UnVuKGludCBuYXRpdmVDYW52YXMsIFN0cmluZyB0ZXh0LAorICAgICAgICAgICAgaW50IHN0YXJ0LCBpbnQgZW5kLCBpbnQgY29udGV4dFN0YXJ0LCBpbnQgY29udGV4dEVuZCwKKyAgICAgICAgICAgIGZsb2F0IHgsIGZsb2F0IHksIGludCBmbGFncywgaW50IHBhaW50KTsKKworICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZV9kcmF3VGV4dFJ1bihpbnQgbmF0aXZlQ2FudmFzLCBjaGFyW10gdGV4dCwKKyAgICAgICAgICAgIGludCBzdGFydCwgaW50IGNvdW50LCBpbnQgY29udGV4dFN0YXJ0LCBpbnQgY29udGV4dENvdW50LAorICAgICAgICAgICAgZmxvYXQgeCwgZmxvYXQgeSwgaW50IGZsYWdzLCBpbnQgcGFpbnQpOworCiAgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlX2RyYXdQb3NUZXh0KGludCBuYXRpdmVDYW52YXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJbXSB0ZXh0LCBpbnQgaW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCwgZmxvYXRbXSBwb3MsCkBAIC0xNTcwLDExICsxNzAwLDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJbXSB0ZXh0LCBpbnQgaW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCwgaW50IHBhdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGhPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHZPZmZzZXQsIGludCBwYWludCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHZPZmZzZXQsIGludCBiaWRpRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwYWludCk7CiAgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlX2RyYXdUZXh0T25QYXRoKGludCBuYXRpdmVDYW52YXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0ZXh0LCBpbnQgcGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgaE9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdk9mZnNldCwgaW50IHBhaW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgaE9mZnNldCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHZPZmZzZXQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZ3MsIGludCBwYWludCk7CiAgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlX2RyYXdQaWN0dXJlKGludCBuYXRpdmVDYW52YXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuYXRpdmVQaWN0dXJlKTsKICAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBmaW5hbGl6ZXIoaW50IG5hdGl2ZUNhbnZhcyk7CmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvQ29sb3JGaWx0ZXIuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9Db2xvckZpbHRlci5qYXZhCmluZGV4IDc2ZjJjN2YuLmU1Y2Y4MzAgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9Db2xvckZpbHRlci5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9Db2xvckZpbHRlci5qYXZhCkBAIC0yMywxMiArMjMsMjAgQEAKIAogCiBwdWJsaWMgY2xhc3MgQ29sb3JGaWx0ZXIgeworICAgIGludCBuYXRpdmVfaW5zdGFuY2U7CisKKyAgICAvKioKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBpbnQgbmF0aXZlQ29sb3JGaWx0ZXI7CiAKICAgICBwcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICBmaW5hbGl6ZXIobmF0aXZlX2luc3RhbmNlKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN1cGVyLmZpbmFsaXplKCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBmaW5hbGl6ZXIobmF0aXZlX2luc3RhbmNlLCBuYXRpdmVDb2xvckZpbHRlcik7CisgICAgICAgIH0KICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBmaW5hbGl6ZXIoaW50IG5hdGl2ZV9pbnN0YW5jZSk7Ci0KLSAgICBpbnQgbmF0aXZlX2luc3RhbmNlOworICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIGZpbmFsaXplcihpbnQgbmF0aXZlX2luc3RhbmNlLCBpbnQgbmF0aXZlQ29sb3JGaWx0ZXIpOwogfQpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL0NvbG9yTWF0cml4Q29sb3JGaWx0ZXIuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9Db2xvck1hdHJpeENvbG9yRmlsdGVyLmphdmEKaW5kZXggNWQ3M2NmZi4uMjQ1YzYxNSAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL0NvbG9yTWF0cml4Q29sb3JGaWx0ZXIuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvQ29sb3JNYXRyaXhDb2xvckZpbHRlci5qYXZhCkBAIC0yNSw3ICsyNSw5IEBACiAgICAgICogICAgICAgICAgICAgICBpcyBjb25zdHJ1Y3RlZCB3aWxsIG5vdCBiZSByZWZsZWN0ZWQgaW4gdGhlIGZpbHRlci4KICAgICAgKi8KICAgICBwdWJsaWMgQ29sb3JNYXRyaXhDb2xvckZpbHRlcihDb2xvck1hdHJpeCBtYXRyaXgpIHsKLSAgICAgICAgbmF0aXZlX2luc3RhbmNlID0gbmF0aXZlQ29sb3JNYXRyaXhGaWx0ZXIobWF0cml4LmdldEFycmF5KCkpOworICAgICAgICBmaW5hbCBmbG9hdFtdIGNvbG9yTWF0cml4ID0gbWF0cml4LmdldEFycmF5KCk7CisgICAgICAgIG5hdGl2ZV9pbnN0YW5jZSA9IG5hdGl2ZUNvbG9yTWF0cml4RmlsdGVyKGNvbG9yTWF0cml4KTsKKyAgICAgICAgbmF0aXZlQ29sb3JGaWx0ZXIgPSBuQ29sb3JNYXRyaXhGaWx0ZXIoY29sb3JNYXRyaXgpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNDAsNyArNDIsOSBAQAogICAgICAgICAgICAgdGhyb3cgbmV3IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOwogICAgICAgICB9CiAgICAgICAgIG5hdGl2ZV9pbnN0YW5jZSA9IG5hdGl2ZUNvbG9yTWF0cml4RmlsdGVyKGFycmF5KTsKKyAgICAgICAgbmF0aXZlQ29sb3JGaWx0ZXIgPSBuQ29sb3JNYXRyaXhGaWx0ZXIoYXJyYXkpOwogICAgIH0KIAogICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgbmF0aXZlQ29sb3JNYXRyaXhGaWx0ZXIoZmxvYXRbXSBhcnJheSk7CisgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludCBuQ29sb3JNYXRyaXhGaWx0ZXIoZmxvYXRbXSBhcnJheSk7CiB9CmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvQ29tcG9zZVNoYWRlci5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL0NvbXBvc2VTaGFkZXIuamF2YQppbmRleCBhMDZkMzBiLi44ZDVjOTEzIDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvQ29tcG9zZVNoYWRlci5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9Db21wb3NlU2hhZGVyLmphdmEKQEAgLTIwLDYgKzIwLDE0IEBACiAgICAgYW4ge0BsaW5rIGFuZHJvaWQuZ3JhcGhpY3MuWGZlcm1vZGV9IHN1YmNsYXNzLgogKi8KIHB1YmxpYyBjbGFzcyBDb21wb3NlU2hhZGVyIGV4dGVuZHMgU2hhZGVyIHsKKyAgICAvKioKKyAgICAgKiBIb2xkIG9udG8gdGhlIHNoYWRlcnMgdG8gYXZvaWQgR0MuCisgICAgICovCisgICAgQFN1cHByZXNzV2FybmluZ3MoeyJVbnVzZWREZWNsYXJhdGlvbiJ9KQorICAgIHByaXZhdGUgZmluYWwgU2hhZGVyIG1TaGFkZXJBOworICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsiVW51c2VkRGVjbGFyYXRpb24ifSkKKyAgICBwcml2YXRlIGZpbmFsIFNoYWRlciBtU2hhZGVyQjsKKwogICAgIC8qKiBDcmVhdGUgYSBuZXcgY29tcG9zZSBzaGFkZXIsIGdpdmVuIHNoYWRlcnMgQSwgQiwgYW5kIGEgY29tYmluaW5nIG1vZGUuCiAgICAgICAgIFdoZW4gdGhlIG1vZGUgaXMgYXBwbGllZCwgaXQgd2lsbCBiZSBnaXZlbiB0aGUgcmVzdWx0IGZyb20gc2hhZGVyIEEgYXMgaXRzCiAgICAgICAgICJkc3QiLCBhbmQgdGhlIHJlc3VsdCBvZiBmcm9tIHNoYWRlciBCIGFzIGl0cyAic3JjIi4KQEAgLTI5LDggKzM3LDE4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBpcyBudWxsLCB0aGVuIFNSQ19PVkVSIGlzIGFzc3VtZWQuCiAgICAgKi8KICAgICBwdWJsaWMgQ29tcG9zZVNoYWRlcihTaGFkZXIgc2hhZGVyQSwgU2hhZGVyIHNoYWRlckIsIFhmZXJtb2RlIG1vZGUpIHsKKyAgICAgICAgbVNoYWRlckEgPSBzaGFkZXJBOworICAgICAgICBtU2hhZGVyQiA9IHNoYWRlckI7CiAgICAgICAgIG5hdGl2ZV9pbnN0YW5jZSA9IG5hdGl2ZUNyZWF0ZTEoc2hhZGVyQS5uYXRpdmVfaW5zdGFuY2UsIHNoYWRlckIubmF0aXZlX2luc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtb2RlICE9IG51bGwpID8gbW9kZS5uYXRpdmVfaW5zdGFuY2UgOiAwKTsKKyAgICAgICAgICAgICAgICAobW9kZSAhPSBudWxsKSA/IG1vZGUubmF0aXZlX2luc3RhbmNlIDogMCk7CisgICAgICAgIGlmIChtb2RlIGluc3RhbmNlb2YgUG9ydGVyRHVmZlhmZXJtb2RlKSB7CisgICAgICAgICAgICBQb3J0ZXJEdWZmLk1vZGUgcGRNb2RlID0gKChQb3J0ZXJEdWZmWGZlcm1vZGUpIG1vZGUpLm1vZGU7CisgICAgICAgICAgICBuYXRpdmVfc2hhZGVyID0gbmF0aXZlUG9zdENyZWF0ZTIobmF0aXZlX2luc3RhbmNlLCBzaGFkZXJBLm5hdGl2ZV9zaGFkZXIsCisgICAgICAgICAgICAgICAgICAgIHNoYWRlckIubmF0aXZlX3NoYWRlciwgcGRNb2RlICE9IG51bGwgPyBwZE1vZGUubmF0aXZlSW50IDogMCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBuYXRpdmVfc2hhZGVyID0gbmF0aXZlUG9zdENyZWF0ZTEobmF0aXZlX2luc3RhbmNlLCBzaGFkZXJBLm5hdGl2ZV9zaGFkZXIsCisgICAgICAgICAgICAgICAgICAgIHNoYWRlckIubmF0aXZlX3NoYWRlciwgbW9kZSAhPSBudWxsID8gbW9kZS5uYXRpdmVfaW5zdGFuY2UgOiAwKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qKiBDcmVhdGUgYSBuZXcgY29tcG9zZSBzaGFkZXIsIGdpdmVuIHNoYWRlcnMgQSwgQiwgYW5kIGEgY29tYmluaW5nIFBvcnRlckR1ZmYgbW9kZS4KQEAgLTQxLDExICs1OSwyMCBAQAogICAgICAgICBAcGFyYW0gbW9kZSAgICAgVGhlIFBvcnRlckR1ZmYgbW9kZSB0aGF0IGNvbWJpbmVzIHRoZSBjb2xvcnMgZnJvbSB0aGUgdHdvIHNoYWRlcnMuCiAgICAgKi8KICAgICBwdWJsaWMgQ29tcG9zZVNoYWRlcihTaGFkZXIgc2hhZGVyQSwgU2hhZGVyIHNoYWRlckIsIFBvcnRlckR1ZmYuTW9kZSBtb2RlKSB7CisgICAgICAgIG1TaGFkZXJBID0gc2hhZGVyQTsKKyAgICAgICAgbVNoYWRlckIgPSBzaGFkZXJCOwogICAgICAgICBuYXRpdmVfaW5zdGFuY2UgPSBuYXRpdmVDcmVhdGUyKHNoYWRlckEubmF0aXZlX2luc3RhbmNlLCBzaGFkZXJCLm5hdGl2ZV9pbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlLm5hdGl2ZUludCk7CisgICAgICAgICAgICAgICAgbW9kZS5uYXRpdmVJbnQpOworICAgICAgICBuYXRpdmVfc2hhZGVyID0gbmF0aXZlUG9zdENyZWF0ZTIobmF0aXZlX2luc3RhbmNlLCBzaGFkZXJBLm5hdGl2ZV9zaGFkZXIsCisgICAgICAgICAgICAgICAgc2hhZGVyQi5uYXRpdmVfc2hhZGVyLCBtb2RlLm5hdGl2ZUludCk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludCBuYXRpdmVDcmVhdGUxKGludCBuYXRpdmVfc2hhZGVyQSwgaW50IG5hdGl2ZV9zaGFkZXJCLCBpbnQgbmF0aXZlX21vZGUpOwotICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgbmF0aXZlQ3JlYXRlMihpbnQgbmF0aXZlX3NoYWRlckEsIGludCBuYXRpdmVfc2hhZGVyQiwgaW50IHBvcnRlckR1ZmZNb2RlKTsKKyAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgaW50IG5hdGl2ZUNyZWF0ZTEoaW50IG5hdGl2ZV9zaGFkZXJBLCBpbnQgbmF0aXZlX3NoYWRlckIsCisgICAgICAgICAgICBpbnQgbmF0aXZlX21vZGUpOworICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgbmF0aXZlQ3JlYXRlMihpbnQgbmF0aXZlX3NoYWRlckEsIGludCBuYXRpdmVfc2hhZGVyQiwKKyAgICAgICAgICAgIGludCBwb3J0ZXJEdWZmTW9kZSk7CisgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludCBuYXRpdmVQb3N0Q3JlYXRlMShpbnQgbmF0aXZlX3NoYWRlciwgaW50IG5hdGl2ZV9za2lhU2hhZGVyQSwKKyAgICAgICAgICAgIGludCBuYXRpdmVfc2tpYVNoYWRlckIsIGludCBuYXRpdmVfbW9kZSk7CisgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludCBuYXRpdmVQb3N0Q3JlYXRlMihpbnQgbmF0aXZlX3NoYWRlciwgaW50IG5hdGl2ZV9za2lhU2hhZGVyQSwKKyAgICAgICAgICAgIGludCBuYXRpdmVfc2tpYVNoYWRlckIsIGludCBwb3J0ZXJEdWZmTW9kZSk7CiB9Ci0KZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9MaWdodGluZ0NvbG9yRmlsdGVyLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvTGlnaHRpbmdDb2xvckZpbHRlci5qYXZhCmluZGV4IDU1NjIzODkuLjcxNWNlODYgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9MaWdodGluZ0NvbG9yRmlsdGVyLmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL0xpZ2h0aW5nQ29sb3JGaWx0ZXIuamF2YQpAQCAtMzAsNyArMzAsOSBAQAogICAgICAqLwogICAgIHB1YmxpYyBMaWdodGluZ0NvbG9yRmlsdGVyKGludCBtdWwsIGludCBhZGQpIHsKICAgICAgICAgbmF0aXZlX2luc3RhbmNlID0gbmF0aXZlX0NyZWF0ZUxpZ2h0aW5nRmlsdGVyKG11bCwgYWRkKTsKKyAgICAgICAgbmF0aXZlQ29sb3JGaWx0ZXIgPSBuQ3JlYXRlTGlnaHRpbmdGaWx0ZXIobXVsLCBhZGQpOwogICAgIH0KIAogICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgbmF0aXZlX0NyZWF0ZUxpZ2h0aW5nRmlsdGVyKGludCBtdWwsIGludCBhZGQpOworICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgbkNyZWF0ZUxpZ2h0aW5nRmlsdGVyKGludCBtdWwsIGludCBhZGQpOwogfQpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL0xpbmVhckdyYWRpZW50LmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvTGluZWFyR3JhZGllbnQuamF2YQppbmRleCBlM2RiMTA1Li44MmVkMTk5IDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvTGluZWFyR3JhZGllbnQuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvTGluZWFyR3JhZGllbnQuamF2YQpAQCAtMTcsNyArMTcsNiBAQAogcGFja2FnZSBhbmRyb2lkLmdyYXBoaWNzOwogCiBwdWJsaWMgY2xhc3MgTGluZWFyR3JhZGllbnQgZXh0ZW5kcyBTaGFkZXIgewotCiAJLyoqCUNyZWF0ZSBhIHNoYWRlciB0aGF0IGRyYXdzIGEgbGluZWFyIGdyYWRpZW50IGFsb25nIGEgbGluZS4KICAgICAgICAgQHBhcmFtIHgwICAgICAgICAgICBUaGUgeC1jb29yZGluYXRlIGZvciB0aGUgc3RhcnQgb2YgdGhlIGdyYWRpZW50IGxpbmUKICAgICAgICAgQHBhcmFtIHkwICAgICAgICAgICBUaGUgeS1jb29yZGluYXRlIGZvciB0aGUgc3RhcnQgb2YgdGhlIGdyYWRpZW50IGxpbmUKQEAgLTM4LDYgKzM3LDggQEAKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNvbG9yIGFuZCBwb3NpdGlvbiBhcnJheXMgbXVzdCBiZSBvZiBlcXVhbCBsZW5ndGgiKTsKICAgICAgICAgfQogICAgICAgICBuYXRpdmVfaW5zdGFuY2UgPSBuYXRpdmVDcmVhdGUxKHgwLCB5MCwgeDEsIHkxLCBjb2xvcnMsIHBvc2l0aW9ucywgdGlsZS5uYXRpdmVJbnQpOworICAgICAgICBuYXRpdmVfc2hhZGVyID0gbmF0aXZlUG9zdENyZWF0ZTEobmF0aXZlX2luc3RhbmNlLCB4MCwgeTAsIHgxLCB5MSwgY29sb3JzLCBwb3NpdGlvbnMsCisgICAgICAgICAgICAgICAgdGlsZS5uYXRpdmVJbnQpOwogICAgIH0KIAogCS8qKglDcmVhdGUgYSBzaGFkZXIgdGhhdCBkcmF3cyBhIGxpbmVhciBncmFkaWVudCBhbG9uZyBhIGxpbmUuCkBAIC01MiwxMiArNTMsMTYgQEAKIAlwdWJsaWMgTGluZWFyR3JhZGllbnQoZmxvYXQgeDAsIGZsb2F0IHkwLCBmbG9hdCB4MSwgZmxvYXQgeTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb2xvcjAsIGludCBjb2xvcjEsIFRpbGVNb2RlIHRpbGUpIHsKICAgICAgICAgbmF0aXZlX2luc3RhbmNlID0gbmF0aXZlQ3JlYXRlMih4MCwgeTAsIHgxLCB5MSwgY29sb3IwLCBjb2xvcjEsIHRpbGUubmF0aXZlSW50KTsKKyAgICAgICAgbmF0aXZlX3NoYWRlciA9IG5hdGl2ZVBvc3RDcmVhdGUyKG5hdGl2ZV9pbnN0YW5jZSwgeDAsIHkwLCB4MSwgeTEsIGNvbG9yMCwgY29sb3IxLAorICAgICAgICAgICAgICAgIHRpbGUubmF0aXZlSW50KTsKICAgICB9CiAKLQotCXByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgbmF0aXZlQ3JlYXRlMShmbG9hdCB4MCwgZmxvYXQgeTAsIGZsb2F0IHgxLCBmbG9hdCB5MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvbG9yc1tdLCBmbG9hdCBwb3NpdGlvbnNbXSwgaW50IHRpbGVNb2RlKTsKLQlwcml2YXRlIHN0YXRpYyBuYXRpdmUgaW50IG5hdGl2ZUNyZWF0ZTIoZmxvYXQgeDAsIGZsb2F0IHkwLCBmbG9hdCB4MSwgZmxvYXQgeTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb2xvcjAsIGludCBjb2xvcjEsIGludCB0aWxlTW9kZSk7CisJcHJpdmF0ZSBuYXRpdmUgaW50IG5hdGl2ZUNyZWF0ZTEoZmxvYXQgeDAsIGZsb2F0IHkwLCBmbG9hdCB4MSwgZmxvYXQgeTEsCisgICAgICAgICAgICBpbnQgY29sb3JzW10sIGZsb2F0IHBvc2l0aW9uc1tdLCBpbnQgdGlsZU1vZGUpOworCXByaXZhdGUgbmF0aXZlIGludCBuYXRpdmVDcmVhdGUyKGZsb2F0IHgwLCBmbG9hdCB5MCwgZmxvYXQgeDEsIGZsb2F0IHkxLAorICAgICAgICAgICAgaW50IGNvbG9yMCwgaW50IGNvbG9yMSwgaW50IHRpbGVNb2RlKTsKKyAgICBwcml2YXRlIG5hdGl2ZSBpbnQgbmF0aXZlUG9zdENyZWF0ZTEoaW50IG5hdGl2ZV9zaGFkZXIsIGZsb2F0IHgwLCBmbG9hdCB5MCwgZmxvYXQgeDEsIGZsb2F0IHkxLAorICAgICAgICAgICAgaW50IGNvbG9yc1tdLCBmbG9hdCBwb3NpdGlvbnNbXSwgaW50IHRpbGVNb2RlKTsKKyAgICBwcml2YXRlIG5hdGl2ZSBpbnQgbmF0aXZlUG9zdENyZWF0ZTIoaW50IG5hdGl2ZV9zaGFkZXIsIGZsb2F0IHgwLCBmbG9hdCB5MCwgZmxvYXQgeDEsIGZsb2F0IHkxLAorICAgICAgICAgICAgaW50IGNvbG9yMCwgaW50IGNvbG9yMSwgaW50IHRpbGVNb2RlKTsKIH0KLQpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL01hdHJpeC5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL01hdHJpeC5qYXZhCmluZGV4IGY1NDk5MDAuLmIzMzY5OTUgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9NYXRyaXguamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvTWF0cml4LmphdmEKQEAgLTM3LDcgKzM3LDEwIEBACiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVBFUlNQXzEgPSA3OyAgIC8vITwgdXNlIHdpdGggZ2V0VmFsdWVzL3NldFZhbHVlcwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1QRVJTUF8yID0gODsgICAvLyE8IHVzZSB3aXRoIGdldFZhbHVlcy9zZXRWYWx1ZXMKIAotICAgIC8qIHBhY2thZ2UgKi8gaW50IG5hdGl2ZV9pbnN0YW5jZTsKKyAgICAvKioKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBpbnQgbmF0aXZlX2luc3RhbmNlOwogCiAgICAgLyoqCiAgICAgICogQ3JlYXRlIGFuIGlkZW50aXR5IG1hdHJpeApkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL05pbmVQYXRjaC5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL05pbmVQYXRjaC5qYXZhCmluZGV4IDg4ZGZkNjcuLmRmNmZlYmEgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9OaW5lUGF0Y2guamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvTmluZVBhdGNoLmphdmEKQEAgLTM1LDYgKzM1LDEyIEBACiAgKiA8L3A+CiAgKi8KIHB1YmxpYyBjbGFzcyBOaW5lUGF0Y2ggeworICAgIHByaXZhdGUgZmluYWwgQml0bWFwIG1CaXRtYXA7CisgICAgcHJpdmF0ZSBmaW5hbCBieXRlW10gbUNodW5rOworICAgIHByaXZhdGUgUGFpbnQgbVBhaW50OworICAgIHByaXZhdGUgU3RyaW5nIG1TcmNOYW1lOyAgLy8gVXNlZnVsIGZvciBkZWJ1Z2dpbmcKKyAgICBwcml2YXRlIGZpbmFsIFJlY3RGIG1SZWN0ID0gbmV3IFJlY3RGKCk7CisgICAgCiAgICAgLyoqIAogICAgICAqIENyZWF0ZSBhIGRyYXdhYmxlIHByb2plY3Rpb24gZnJvbSBhIGJpdG1hcCB0byBuaW5lIHBhdGNoZXMuCiAgICAgICoKQEAgLTc0LDEwICs4MCwxNCBAQAogICAgICAqIEBwYXJhbSBsb2NhdGlvbiAgV2hlcmUgdG8gZHJhdyB0aGUgYml0bWFwLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGRyYXcoQ2FudmFzIGNhbnZhcywgUmVjdEYgbG9jYXRpb24pIHsKLSAgICAgICAgbmF0aXZlRHJhdyhjYW52YXMubU5hdGl2ZUNhbnZhcywgbG9jYXRpb24sCi0gICAgICAgICAgICAgICAgICAgbUJpdG1hcC5uaSgpLCBtQ2h1bmssCi0gICAgICAgICAgICAgICAgICAgbVBhaW50ICE9IG51bGwgPyBtUGFpbnQubU5hdGl2ZVBhaW50IDogMCwKLSAgICAgICAgICAgICAgICAgICBjYW52YXMubURlbnNpdHksIG1CaXRtYXAubURlbnNpdHkpOworICAgICAgICBpZiAoIWNhbnZhcy5pc0hhcmR3YXJlQWNjZWxlcmF0ZWQoKSkgeworICAgICAgICAgICAgbmF0aXZlRHJhdyhjYW52YXMubU5hdGl2ZUNhbnZhcywgbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgIG1CaXRtYXAubmkoKSwgbUNodW5rLAorICAgICAgICAgICAgICAgICAgICAgICBtUGFpbnQgIT0gbnVsbCA/IG1QYWludC5tTmF0aXZlUGFpbnQgOiAwLAorICAgICAgICAgICAgICAgICAgICAgICBjYW52YXMubURlbnNpdHksIG1CaXRtYXAubURlbnNpdHkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY2FudmFzLmRyYXdQYXRjaChtQml0bWFwLCBtQ2h1bmssIGxvY2F0aW9uLCBudWxsKTsKKyAgICAgICAgfQogICAgIH0KICAgICAKICAgICAvKiogCkBAIC04NywxMCArOTcsMTUgQEAKICAgICAgKiBAcGFyYW0gbG9jYXRpb24gIFdoZXJlIHRvIGRyYXcgdGhlIGJpdG1hcC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBkcmF3KENhbnZhcyBjYW52YXMsIFJlY3QgbG9jYXRpb24pIHsKLSAgICAgICAgbmF0aXZlRHJhdyhjYW52YXMubU5hdGl2ZUNhbnZhcywgbG9jYXRpb24sCi0gICAgICAgICAgICAgICAgbUJpdG1hcC5uaSgpLCBtQ2h1bmssCi0gICAgICAgICAgICAgICAgbVBhaW50ICE9IG51bGwgPyBtUGFpbnQubU5hdGl2ZVBhaW50IDogMCwKLSAgICAgICAgICAgICAgICBjYW52YXMubURlbnNpdHksIG1CaXRtYXAubURlbnNpdHkpOworICAgICAgICBpZiAoIWNhbnZhcy5pc0hhcmR3YXJlQWNjZWxlcmF0ZWQoKSkgeworICAgICAgICAgICAgbmF0aXZlRHJhdyhjYW52YXMubU5hdGl2ZUNhbnZhcywgbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICBtQml0bWFwLm5pKCksIG1DaHVuaywKKyAgICAgICAgICAgICAgICAgICAgICAgIG1QYWludCAhPSBudWxsID8gbVBhaW50Lm1OYXRpdmVQYWludCA6IDAsCisgICAgICAgICAgICAgICAgICAgICAgICBjYW52YXMubURlbnNpdHksIG1CaXRtYXAubURlbnNpdHkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVJlY3Quc2V0KGxvY2F0aW9uKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UGF0Y2gobUJpdG1hcCwgbUNodW5rLCBtUmVjdCwgbnVsbCk7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKiogCkBAIC0xMDEsOSArMTE2LDE0IEBACiAgICAgICogQHBhcmFtIHBhaW50ICAgICBUaGUgUGFpbnQgdG8gZHJhdyB0aHJvdWdoLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGRyYXcoQ2FudmFzIGNhbnZhcywgUmVjdCBsb2NhdGlvbiwgUGFpbnQgcGFpbnQpIHsKLSAgICAgICAgbmF0aXZlRHJhdyhjYW52YXMubU5hdGl2ZUNhbnZhcywgbG9jYXRpb24sCi0gICAgICAgICAgICAgICAgbUJpdG1hcC5uaSgpLCBtQ2h1bmssIHBhaW50ICE9IG51bGwgPyBwYWludC5tTmF0aXZlUGFpbnQgOiAwLAotICAgICAgICAgICAgICAgIGNhbnZhcy5tRGVuc2l0eSwgbUJpdG1hcC5tRGVuc2l0eSk7CisgICAgICAgIGlmICghY2FudmFzLmlzSGFyZHdhcmVBY2NlbGVyYXRlZCgpKSB7CisgICAgICAgICAgICBuYXRpdmVEcmF3KGNhbnZhcy5tTmF0aXZlQ2FudmFzLCBsb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgbUJpdG1hcC5uaSgpLCBtQ2h1bmssIHBhaW50ICE9IG51bGwgPyBwYWludC5tTmF0aXZlUGFpbnQgOiAwLAorICAgICAgICAgICAgICAgICAgICBjYW52YXMubURlbnNpdHksIG1CaXRtYXAubURlbnNpdHkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVJlY3Quc2V0KGxvY2F0aW9uKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UGF0Y2gobUJpdG1hcCwgbUNodW5rLCBtUmVjdCwgcGFpbnQpOworICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMzMsMTEgKzE1Myw2IEBACiAgICAgCiAgICAgcHVibGljIG5hdGl2ZSBzdGF0aWMgYm9vbGVhbiBpc05pbmVQYXRjaENodW5rKGJ5dGVbXSBjaHVuayk7CiAKLSAgICBwcml2YXRlIGZpbmFsIEJpdG1hcCBtQml0bWFwOwotICAgIHByaXZhdGUgZmluYWwgYnl0ZVtdIG1DaHVuazsKLSAgICBwcml2YXRlIFBhaW50ICAgICAgICBtUGFpbnQ7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgICAgICAgbVNyY05hbWU7ICAvLyBVc2VmdWwgZm9yIGRlYnVnZ2luZwotCiAgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgdmFsaWRhdGVOaW5lUGF0Y2hDaHVuayhpbnQgYml0bWFwLCBieXRlW10gY2h1bmspOwogICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZURyYXcoaW50IGNhbnZhc19pbnN0YW5jZSwgUmVjdEYgbG9jLCBpbnQgYml0bWFwX2luc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIGMsIGludCBwYWludF9pbnN0YW5jZV9vcl9udWxsLApkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL1BhaW50LmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvUGFpbnQuamF2YQppbmRleCAzZTNmODdiLi42MmZiZmI0IDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvUGFpbnQuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvUGFpbnQuamF2YQpAQCAtMTYsMTAgKzE2LDEwIEBACiAKIHBhY2thZ2UgYW5kcm9pZC5ncmFwaGljczsKIAotaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CitpbXBvcnQgYW5kcm9pZC50ZXh0LkdyYXBoaWNzT3BlcmF0aW9uczsKIGltcG9ydCBhbmRyb2lkLnRleHQuU3Bhbm5hYmxlU3RyaW5nOwogaW1wb3J0IGFuZHJvaWQudGV4dC5TcGFubmVkU3RyaW5nOwotaW1wb3J0IGFuZHJvaWQudGV4dC5HcmFwaGljc09wZXJhdGlvbnM7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKIAogLyoqCiAgKiBUaGUgUGFpbnQgY2xhc3MgaG9sZHMgdGhlIHN0eWxlIGFuZCBjb2xvciBpbmZvcm1hdGlvbiBhYm91dCBob3cgdG8gZHJhdwpAQCAtMjcsNyArMjcsMTEgQEAKICAqLwogcHVibGljIGNsYXNzIFBhaW50IHsKIAotICAgIC8qcGFja2FnZSovIGludCAgICAgbU5hdGl2ZVBhaW50OworICAgIC8qKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGludCBtTmF0aXZlUGFpbnQ7CisKICAgICBwcml2YXRlIENvbG9yRmlsdGVyIG1Db2xvckZpbHRlcjsKICAgICBwcml2YXRlIE1hc2tGaWx0ZXIgIG1NYXNrRmlsdGVyOwogICAgIHByaXZhdGUgUGF0aEVmZmVjdCAgbVBhdGhFZmZlY3Q7CkBAIC0zOSw2ICs0MywzMiBAQAogICAgIHByaXZhdGUgYm9vbGVhbiAgICAgbUhhc0NvbXBhdFNjYWxpbmc7CiAgICAgcHJpdmF0ZSBmbG9hdCAgICAgICBtQ29tcGF0U2NhbGluZzsKICAgICBwcml2YXRlIGZsb2F0ICAgICAgIG1JbnZDb21wYXRTY2FsaW5nOworCisgICAgLyoqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNTaGFkb3c7CisgICAgLyoqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgZmxvYXQgc2hhZG93RHg7CisgICAgLyoqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgZmxvYXQgc2hhZG93RHk7CisgICAgLyoqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgZmxvYXQgc2hhZG93UmFkaXVzOworICAgIC8qKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGludCBzaGFkb3dDb2xvcjsKKworICAgIC8qKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljICBpbnQgICAgICAgICBtQmlkaUZsYWdzID0gQklESV9ERUZBVUxUX0xUUjsKICAgICAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHlsZVtdIHNTdHlsZUFycmF5ID0gewogICAgICAgICBTdHlsZS5GSUxMLCBTdHlsZS5TVFJPS0UsIFN0eWxlLkZJTExfQU5EX1NUUk9LRQpAQCAtNzYsOCArMTA2LDExNiBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX1BBSU5UX0ZMQUdTID0gREVWX0tFUk5fVEVYVF9GTEFHOwogCiAgICAgLyoqCi0gICAgICogVGhlIFN0eWxlIHNwZWNpZmllcyBpZiB0aGUgcHJpbWl0aXZlIGJlaW5nIGRyYXduIGlzIGZpbGxlZCwKLSAgICAgKiBzdHJva2VkLCBvciBib3RoIChpbiB0aGUgc2FtZSBjb2xvcikuIFRoZSBkZWZhdWx0IGlzIEZJTEwuCisgICAgICogQmlkaSBmbGFnIHRvIHNldCBMVFIgcGFyYWdyYXBoIGRpcmVjdGlvbi4KKyAgICAgKiAKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJJRElfTFRSID0gMHgwOworCisgICAgLyoqCisgICAgICogQmlkaSBmbGFnIHRvIHNldCBSVEwgcGFyYWdyYXBoIGRpcmVjdGlvbi4KKyAgICAgKiAKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJJRElfUlRMID0gMHgxOworCisgICAgLyoqCisgICAgICogQmlkaSBmbGFnIHRvIGRldGVjdCBwYXJhZ3JhcGggZGlyZWN0aW9uIHZpYSBoZXVyaXN0aWNzLCBkZWZhdWx0aW5nIHRvCisgICAgICogTFRSLgorICAgICAqIAorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQklESV9ERUZBVUxUX0xUUiA9IDB4MjsKKworICAgIC8qKgorICAgICAqIEJpZGkgZmxhZyB0byBkZXRlY3QgcGFyYWdyYXBoIGRpcmVjdGlvbiB2aWEgaGV1cmlzdGljcywgZGVmYXVsdGluZyB0bworICAgICAqIFJUTC4KKyAgICAgKiAKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJJRElfREVGQVVMVF9SVEwgPSAweDM7CisKKyAgICAvKioKKyAgICAgKiBCaWRpIGZsYWcgdG8gb3ZlcnJpZGUgZGlyZWN0aW9uIHRvIGFsbCBMVFIgKGlnbm9yZSBiaWRpKS4KKyAgICAgKiAKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJJRElfRk9SQ0VfTFRSID0gMHg0OworCisgICAgLyoqCisgICAgICogQmlkaSBmbGFnIHRvIG92ZXJyaWRlIGRpcmVjdGlvbiB0byBhbGwgUlRMIChpZ25vcmUgYmlkaSkuCisgICAgICogCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCSURJX0ZPUkNFX1JUTCA9IDB4NTsKKworICAgIC8qKgorICAgICAqIE1heGltdW0gQmlkaSBmbGFnIHZhbHVlLgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJJRElfTUFYX0ZMQUdfVkFMVUUgPSBCSURJX0ZPUkNFX1JUTDsKKworICAgIC8qKgorICAgICAqIE1hc2sgZm9yIGJpZGkgZmxhZ3MuCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQklESV9GTEFHX01BU0sgPSAweDc7CisKKyAgICAvKioKKyAgICAgKiBGbGFnIGZvciBnZXRUZXh0UnVuQWR2YW5jZXMgaW5kaWNhdGluZyBsZWZ0LXRvLXJpZ2h0IHJ1biBkaXJlY3Rpb24uCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBESVJFQ1RJT05fTFRSID0gMDsKKworICAgIC8qKgorICAgICAqIEZsYWcgZm9yIGdldFRleHRSdW5BZHZhbmNlcyBpbmRpY2F0aW5nIHJpZ2h0LXRvLWxlZnQgcnVuIGRpcmVjdGlvbi4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJUkVDVElPTl9SVEwgPSAxOworCisgICAgLyoqCisgICAgICogT3B0aW9uIGZvciBnZXRUZXh0UnVuQ3Vyc29yIHRvIGNvbXB1dGUgdGhlIHZhbGlkIGN1cnNvciBhZnRlcgorICAgICAqIG9mZnNldCBvciB0aGUgbGltaXQgb2YgdGhlIGNvbnRleHQsIHdoaWNoZXZlciBpcyBsZXNzLgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ1VSU09SX0FGVEVSID0gMDsKKworICAgIC8qKgorICAgICAqIE9wdGlvbiBmb3IgZ2V0VGV4dFJ1bkN1cnNvciB0byBjb21wdXRlIHRoZSB2YWxpZCBjdXJzb3IgYXQgb3IgYWZ0ZXIKKyAgICAgKiB0aGUgb2Zmc2V0IG9yIHRoZSBsaW1pdCBvZiB0aGUgY29udGV4dCwgd2hpY2hldmVyIGlzIGxlc3MuCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDVVJTT1JfQVRfT1JfQUZURVIgPSAxOworCisgICAgIC8qKgorICAgICAqIE9wdGlvbiBmb3IgZ2V0VGV4dFJ1bkN1cnNvciB0byBjb21wdXRlIHRoZSB2YWxpZCBjdXJzb3IgYmVmb3JlCisgICAgICogb2Zmc2V0IG9yIHRoZSBzdGFydCBvZiB0aGUgY29udGV4dCwgd2hpY2hldmVyIGlzIGdyZWF0ZXIuCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDVVJTT1JfQkVGT1JFID0gMjsKKworICAgLyoqCisgICAgICogT3B0aW9uIGZvciBnZXRUZXh0UnVuQ3Vyc29yIHRvIGNvbXB1dGUgdGhlIHZhbGlkIGN1cnNvciBhdCBvciBiZWZvcmUKKyAgICAgKiBvZmZzZXQgb3IgdGhlIHN0YXJ0IG9mIHRoZSBjb250ZXh0LCB3aGljaGV2ZXIgaXMgZ3JlYXRlci4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENVUlNPUl9BVF9PUl9CRUZPUkUgPSAzOworCisgICAgLyoqCisgICAgICogT3B0aW9uIGZvciBnZXRUZXh0UnVuQ3Vyc29yIHRvIHJldHVybiBvZmZzZXQgaWYgdGhlIGN1cnNvciBhdCBvZmZzZXQKKyAgICAgKiBpcyB2YWxpZCwgb3IgLTEgaWYgaXQgaXNuJ3QuCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDVVJTT1JfQVQgPSA0OworCisgICAgLyoqCisgICAgICogTWF4aW11bSBjdXJzb3Igb3B0aW9uIHZhbHVlLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDVVJTT1JfT1BUX01BWF9WQUxVRSA9IENVUlNPUl9BVDsKKworICAgIC8qKgorICAgICAqIFRoZSBTdHlsZSBzcGVjaWZpZXMgaWYgdGhlIHByaW1pdGl2ZSBiZWluZyBkcmF3biBpcyBmaWxsZWQsIHN0cm9rZWQsIG9yCisgICAgICogYm90aCAoaW4gdGhlIHNhbWUgY29sb3IpLiBUaGUgZGVmYXVsdCBpcyBGSUxMLgogICAgICAqLwogICAgIHB1YmxpYyBlbnVtIFN0eWxlIHsKICAgICAgICAgLyoqCkBAIC05Myw3ICsyMzEsOSBAQAogICAgICAgICAvKioKICAgICAgICAgICogR2VvbWV0cnkgYW5kIHRleHQgZHJhd24gd2l0aCB0aGlzIHN0eWxlIHdpbGwgYmUgYm90aCBmaWxsZWQgYW5kCiAgICAgICAgICAqIHN0cm9rZWQgYXQgdGhlIHNhbWUgdGltZSwgcmVzcGVjdGluZyB0aGUgc3Ryb2tlLXJlbGF0ZWQgZmllbGRzIG9uCi0gICAgICAgICAqIHRoZSBwYWludC4KKyAgICAgICAgICogdGhlIHBhaW50LiBUaGlzIG1vZGUgY2FuIGdpdmUgdW5leHBlY3RlZCByZXN1bHRzIGlmIHRoZSBnZW9tZXRyeQorICAgICAgICAgKiBpcyBvcmllbnRlZCBjb3VudGVyLWNsb2Nrd2lzZS4gVGhpcyByZXN0cmljdGlvbiBkb2VzIG5vdCBhcHBseSB0bworICAgICAgICAgKiBlaXRoZXIgRklMTCBvciBTVFJPS0UuCiAgICAgICAgICAqLwogICAgICAgICBGSUxMX0FORF9TVFJPS0UgKDIpOwogICAgICAgICAKQEAgLTIwOCw2ICszNDgsNyBAQAogICAgICAgICBtSGFzQ29tcGF0U2NhbGluZyA9IHBhaW50Lm1IYXNDb21wYXRTY2FsaW5nOwogICAgICAgICBtQ29tcGF0U2NhbGluZyA9IHBhaW50Lm1Db21wYXRTY2FsaW5nOwogICAgICAgICBtSW52Q29tcGF0U2NhbGluZyA9IHBhaW50Lm1JbnZDb21wYXRTY2FsaW5nOworICAgICAgICBtQmlkaUZsYWdzID0gcGFpbnQubUJpZGlGbGFnczsKICAgICB9CiAKICAgICAvKiogUmVzdG9yZXMgdGhlIHBhaW50IHRvIGl0cyBkZWZhdWx0IHNldHRpbmdzLiAqLwpAQCAtMjE2LDYgKzM1Nyw3IEBACiAgICAgICAgIHNldEZsYWdzKERFRkFVTFRfUEFJTlRfRkxBR1MpOwogICAgICAgICBtSGFzQ29tcGF0U2NhbGluZyA9IGZhbHNlOwogICAgICAgICBtQ29tcGF0U2NhbGluZyA9IG1JbnZDb21wYXRTY2FsaW5nID0gMTsKKyAgICAgICAgbUJpZGlGbGFncyA9IEJJRElfREVGQVVMVF9MVFI7CiAgICAgfQogICAgIAogICAgIC8qKgpAQCAtMjM4LDYgKzM4MCw3IEBACiAgICAgICAgICAgICBtSGFzQ29tcGF0U2NhbGluZyA9IHNyYy5tSGFzQ29tcGF0U2NhbGluZzsKICAgICAgICAgICAgIG1Db21wYXRTY2FsaW5nICAgID0gc3JjLm1Db21wYXRTY2FsaW5nOwogICAgICAgICAgICAgbUludkNvbXBhdFNjYWxpbmcgPSBzcmMubUludkNvbXBhdFNjYWxpbmc7CisgICAgICAgICAgICBtQmlkaUZsYWdzICAgICAgPSBzcmMubUJpZGlGbGFnczsKICAgICAgICAgfQogICAgIH0KIApAQCAtMjUyLDEwICszOTUsMzMgQEAKICAgICAgICAgICAgIG1JbnZDb21wYXRTY2FsaW5nID0gMS4wZi9mYWN0b3I7CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGJpZGkgZmxhZ3Mgb24gdGhlIHBhaW50LgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGJpZGkgZmxhZ3Mgb24gdGhlIHBhaW50CisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldEJpZGlGbGFncygpIHsKKyAgICAgICAgcmV0dXJuIG1CaWRpRmxhZ3M7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBiaWRpIGZsYWdzIG9uIHRoZSBwYWludC4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEJpZGlGbGFncyhpbnQgZmxhZ3MpIHsKKyAgICAgICAgLy8gb25seSBmbGFnIHZhbHVlIGlzIHRoZSAzLWJpdCBCSURJIGNvbnRyb2wgc2V0dGluZworICAgICAgICBmbGFncyAmPSBCSURJX0ZMQUdfTUFTSzsKKyAgICAgICAgaWYgKGZsYWdzID4gQklESV9NQVhfRkxBR19WQUxVRSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidW5rbm93biBiaWRpIGZsYWc6ICIgKyBmbGFncyk7CisgICAgICAgIH0KKyAgICAgICAgbUJpZGlGbGFncyA9IGZsYWdzOworICAgIH0KKwogICAgIC8qKgogICAgICAqIFJldHVybiB0aGUgcGFpbnQncyBmbGFncy4gVXNlIHRoZSBGbGFnIGVudW0gdG8gdGVzdCBmbGFnIHZhbHVlcy4KLSAgICAgKgorICAgICAqIAogICAgICAqIEByZXR1cm4gdGhlIHBhaW50J3MgZmxhZ3MgKHNlZSBlbnVtcyBlbmRpbmcgaW4gX0ZsYWcgZm9yIGJpdCBtYXNrcykKICAgICAgKi8KICAgICBwdWJsaWMgbmF0aXZlIGludCBnZXRGbGFncygpOwpAQCAtNzg3LDE4ICs5NTMsMjcgQEAKICAgICB9CiAgICAgCiAgICAgLyoqCi0gICAgICogVGVtcG9yYXJ5IEFQSSB0byBleHBvc2UgbGF5ZXIgZHJhd2luZy4gVGhpcyBkcmF3cyBhIHNoYWRvdyBsYXllciBiZWxvdwotICAgICAqIHRoZSBtYWluIGxheWVyLCB3aXRoIHRoZSBzcGVjaWZpZWQgb2Zmc2V0IGFuZCBjb2xvciwgYW5kIGJsdXIgcmFkaXVzLgotICAgICAqIElmIHJhZGl1cyBpcyAwLCB0aGVuIHRoZSBzaGFkb3cgbGF5ZXIgaXMgcmVtb3ZlZC4KKyAgICAgKiBUaGlzIGRyYXdzIGEgc2hhZG93IGxheWVyIGJlbG93IHRoZSBtYWluIGxheWVyLCB3aXRoIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBvZmZzZXQgYW5kIGNvbG9yLCBhbmQgYmx1ciByYWRpdXMuIElmIHJhZGl1cyBpcyAwLCB0aGVuIHRoZSBzaGFkb3cKKyAgICAgKiBsYXllciBpcyByZW1vdmVkLgogICAgICAqLwotICAgIHB1YmxpYyBuYXRpdmUgdm9pZCBzZXRTaGFkb3dMYXllcihmbG9hdCByYWRpdXMsIGZsb2F0IGR4LCBmbG9hdCBkeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvbG9yKTsKKyAgICBwdWJsaWMgdm9pZCBzZXRTaGFkb3dMYXllcihmbG9hdCByYWRpdXMsIGZsb2F0IGR4LCBmbG9hdCBkeSwgaW50IGNvbG9yKSB7CisgICAgICAgIGhhc1NoYWRvdyA9IHJhZGl1cyA+IDAuMGY7CisgICAgICAgIHNoYWRvd1JhZGl1cyA9IHJhZGl1czsKKyAgICAgICAgc2hhZG93RHggPSBkeDsKKyAgICAgICAgc2hhZG93RHkgPSBkeTsKKyAgICAgICAgc2hhZG93Q29sb3IgPSBjb2xvcjsKKyAgICAgICAgblNldFNoYWRvd0xheWVyKHJhZGl1cywgZHgsIGR5LCBjb2xvcik7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgblNldFNoYWRvd0xheWVyKGZsb2F0IHJhZGl1cywgZmxvYXQgZHgsIGZsb2F0IGR5LCBpbnQgY29sb3IpOwogCiAgICAgLyoqCi0gICAgICogVGVtcG9yYXJ5IEFQSSB0byBjbGVhciB0aGUgc2hhZG93IGxheWVyLgorICAgICAqIENsZWFyIHRoZSBzaGFkb3cgbGF5ZXIuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgY2xlYXJTaGFkb3dMYXllcigpIHsKLSAgICAgICAgc2V0U2hhZG93TGF5ZXIoMCwgMCwgMCwgMCk7CisgICAgICAgIGhhc1NoYWRvdyA9IGZhbHNlOworICAgICAgICBuU2V0U2hhZG93TGF5ZXIoMCwgMCwgMCwgMCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMjMyLDEwICsxNDA3LDEwIEBACiAgICAgICAgIH0KIAogICAgICAgICBjaGFyW10gYnVmID0gVGVtcG9yYXJ5QnVmZmVyLm9idGFpbihlbmQgLSBzdGFydCk7Ci0gICAgCVRleHRVdGlscy5nZXRDaGFycyh0ZXh0LCBzdGFydCwgZW5kLCBidWYsIDApOwotICAgIAlpbnQgcmVzdWx0ID0gZ2V0VGV4dFdpZHRocyhidWYsIDAsIGVuZCAtIHN0YXJ0LCB3aWR0aHMpOworICAgICAgICBUZXh0VXRpbHMuZ2V0Q2hhcnModGV4dCwgc3RhcnQsIGVuZCwgYnVmLCAwKTsKKyAgICAgICAgaW50IHJlc3VsdCA9IGdldFRleHRXaWR0aHMoYnVmLCAwLCBlbmQgLSBzdGFydCwgd2lkdGhzKTsKICAgICAgICAgVGVtcG9yYXJ5QnVmZmVyLnJlY3ljbGUoYnVmKTsKLSAgICAJcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CiAKICAgICAvKioKQEAgLTEyODIsNiArMTQ1NywyODQgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBDb252ZW5pZW5jZSBvdmVybG9hZCB0aGF0IHRha2VzIGEgY2hhciBhcnJheSBpbnN0ZWFkIG9mIGEKKyAgICAgKiBTdHJpbmcuCisgICAgICoKKyAgICAgKiBAc2VlICNnZXRUZXh0UnVuQWR2YW5jZXMoU3RyaW5nLCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgZmxvYXRbXSwgaW50KQorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGZsb2F0IGdldFRleHRSdW5BZHZhbmNlcyhjaGFyW10gY2hhcnMsIGludCBpbmRleCwgaW50IGNvdW50LAorICAgICAgICAgICAgaW50IGNvbnRleHRJbmRleCwgaW50IGNvbnRleHRDb3VudCwgaW50IGZsYWdzLCBmbG9hdFtdIGFkdmFuY2VzLAorICAgICAgICAgICAgaW50IGFkdmFuY2VzSW5kZXgpIHsKKworICAgICAgICBpZiAoKGluZGV4IHwgY291bnQgfCBjb250ZXh0SW5kZXggfCBjb250ZXh0Q291bnQgfCBhZHZhbmNlc0luZGV4CisgICAgICAgICAgICAgICAgfCAoaW5kZXggLSBjb250ZXh0SW5kZXgpCisgICAgICAgICAgICAgICAgfCAoKGNvbnRleHRJbmRleCArIGNvbnRleHRDb3VudCkgLSAoaW5kZXggKyBjb3VudCkpCisgICAgICAgICAgICAgICAgfCAoY2hhcnMubGVuZ3RoIC0gKGNvbnRleHRJbmRleCArIGNvbnRleHRDb3VudCkpCisgICAgICAgICAgICAgICAgfCAoYWR2YW5jZXMgPT0gbnVsbCA/IDAgOgorICAgICAgICAgICAgICAgICAgICAoYWR2YW5jZXMubGVuZ3RoIC0gKGFkdmFuY2VzSW5kZXggKyBjb3VudCkpKSkgPCAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIGlmIChmbGFncyAhPSBESVJFQ1RJT05fTFRSICYmIGZsYWdzICE9IERJUkVDVElPTl9SVEwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVua25vd24gZmxhZ3MgdmFsdWU6ICIgKyBmbGFncyk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIW1IYXNDb21wYXRTY2FsaW5nKSB7CisgICAgICAgICAgICByZXR1cm4gbmF0aXZlX2dldFRleHRSdW5BZHZhbmNlcyhtTmF0aXZlUGFpbnQsIGNoYXJzLCBpbmRleCwgY291bnQsCisgICAgICAgICAgICAgICAgICAgIGNvbnRleHRJbmRleCwgY29udGV4dENvdW50LCBmbGFncywgYWR2YW5jZXMsIGFkdmFuY2VzSW5kZXgpOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgZmxvYXQgb2xkU2l6ZSA9IGdldFRleHRTaXplKCk7CisgICAgICAgIHNldFRleHRTaXplKG9sZFNpemUgKiBtQ29tcGF0U2NhbGluZyk7CisgICAgICAgIGZsb2F0IHJlcyA9IG5hdGl2ZV9nZXRUZXh0UnVuQWR2YW5jZXMobU5hdGl2ZVBhaW50LCBjaGFycywgaW5kZXgsIGNvdW50LAorICAgICAgICAgICAgICAgIGNvbnRleHRJbmRleCwgY29udGV4dENvdW50LCBmbGFncywgYWR2YW5jZXMsIGFkdmFuY2VzSW5kZXgpOworICAgICAgICBzZXRUZXh0U2l6ZShvbGRTaXplKTsKKworICAgICAgICBpZiAoYWR2YW5jZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IGFkdmFuY2VzSW5kZXgsIGUgPSBpICsgY291bnQ7IGkgPCBlOyBpKyspIHsKKyAgICAgICAgICAgICAgICBhZHZhbmNlc1tpXSAqPSBtSW52Q29tcGF0U2NhbGluZzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzICogbUludkNvbXBhdFNjYWxpbmc7IC8vIGFzc3VtZSBlcnJvcnMgYXJlIG5vdCBzaWduaWZpY2FudAorICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlbmllbmNlIG92ZXJsb2FkIHRoYXQgdGFrZXMgYSBDaGFyU2VxdWVuY2UgaW5zdGVhZCBvZiBhCisgICAgICogU3RyaW5nLgorICAgICAqCisgICAgICogQHNlZSAjZ2V0VGV4dFJ1bkFkdmFuY2VzKFN0cmluZywgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGZsb2F0W10sIGludCkKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBmbG9hdCBnZXRUZXh0UnVuQWR2YW5jZXMoQ2hhclNlcXVlbmNlIHRleHQsIGludCBzdGFydCwgaW50IGVuZCwKKyAgICAgICAgICAgIGludCBjb250ZXh0U3RhcnQsIGludCBjb250ZXh0RW5kLCBpbnQgZmxhZ3MsIGZsb2F0W10gYWR2YW5jZXMsCisgICAgICAgICAgICBpbnQgYWR2YW5jZXNJbmRleCkgeworCisgICAgICAgIGlmICh0ZXh0IGluc3RhbmNlb2YgU3RyaW5nKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0VGV4dFJ1bkFkdmFuY2VzKChTdHJpbmcpIHRleHQsIHN0YXJ0LCBlbmQsCisgICAgICAgICAgICAgICAgICAgIGNvbnRleHRTdGFydCwgY29udGV4dEVuZCwgZmxhZ3MsIGFkdmFuY2VzLCBhZHZhbmNlc0luZGV4KTsKKyAgICAgICAgfQorICAgICAgICBpZiAodGV4dCBpbnN0YW5jZW9mIFNwYW5uZWRTdHJpbmcgfHwKKyAgICAgICAgICAgIHRleHQgaW5zdGFuY2VvZiBTcGFubmFibGVTdHJpbmcpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRUZXh0UnVuQWR2YW5jZXModGV4dC50b1N0cmluZygpLCBzdGFydCwgZW5kLAorICAgICAgICAgICAgICAgICAgICBjb250ZXh0U3RhcnQsIGNvbnRleHRFbmQsIGZsYWdzLCBhZHZhbmNlcywgYWR2YW5jZXNJbmRleCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRleHQgaW5zdGFuY2VvZiBHcmFwaGljc09wZXJhdGlvbnMpIHsKKyAgICAgICAgICAgIHJldHVybiAoKEdyYXBoaWNzT3BlcmF0aW9ucykgdGV4dCkuZ2V0VGV4dFJ1bkFkdmFuY2VzKHN0YXJ0LCBlbmQsCisgICAgICAgICAgICAgICAgICAgIGNvbnRleHRTdGFydCwgY29udGV4dEVuZCwgZmxhZ3MsIGFkdmFuY2VzLCBhZHZhbmNlc0luZGV4LCB0aGlzKTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBjb250ZXh0TGVuID0gY29udGV4dEVuZCAtIGNvbnRleHRTdGFydDsKKyAgICAgICAgaW50IGxlbiA9IGVuZCAtIHN0YXJ0OworICAgICAgICBjaGFyW10gYnVmID0gVGVtcG9yYXJ5QnVmZmVyLm9idGFpbihjb250ZXh0TGVuKTsKKyAgICAgICAgVGV4dFV0aWxzLmdldENoYXJzKHRleHQsIHN0YXJ0LCBlbmQsIGJ1ZiwgMCk7CisgICAgICAgIGZsb2F0IHJlc3VsdCA9IGdldFRleHRSdW5BZHZhbmNlcyhidWYsIHN0YXJ0IC0gY29udGV4dFN0YXJ0LCBsZW4sCisgICAgICAgICAgICAgICAgMCwgY29udGV4dExlbiwgZmxhZ3MsIGFkdmFuY2VzLCBhZHZhbmNlc0luZGV4KTsKKyAgICAgICAgVGVtcG9yYXJ5QnVmZmVyLnJlY3ljbGUoYnVmKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB0b3RhbCBhZHZhbmNlIHdpZHRoIGZvciB0aGUgY2hhcmFjdGVycyBpbiB0aGUgcnVuCisgICAgICogYmV0d2VlbiBzdGFydCBhbmQgZW5kLCBhbmQgaWYgYWR2YW5jZXMgaXMgbm90IG51bGwsIHRoZSBhZHZhbmNlCisgICAgICogYXNzaWduZWQgdG8gZWFjaCBvZiB0aGVzZSBjaGFyYWN0ZXJzIChqYXZhIGNoYXJzKS4KKyAgICAgKgorICAgICAqIDxwPlRoZSB0cmFpbGluZyBzdXJyb2dhdGUgaW4gYSB2YWxpZCBzdXJyb2dhdGUgcGFpciBpcyBhc3NpZ25lZAorICAgICAqIGFuIGFkdmFuY2Ugb2YgMC4gIFRodXMgdGhlIG51bWJlciBvZiByZXR1cm5lZCBhZHZhbmNlcyBpcworICAgICAqIGFsd2F5cyBlcXVhbCB0byBjb3VudCwgbm90IHRvIHRoZSBudW1iZXIgb2YgdW5pY29kZSBjb2RlcG9pbnRzCisgICAgICogcmVwcmVzZW50ZWQgYnkgdGhlIHJ1bi4KKyAgICAgKgorICAgICAqIDxwPkluIHRoZSBjYXNlIG9mIGNvbmp1bmN0cyBvciBjb21iaW5pbmcgbWFya3MsIHRoZSB0b3RhbAorICAgICAqIGFkdmFuY2UgaXMgYXNzaWduZWQgdG8gdGhlIGZpcnN0IGxvZ2ljYWwgY2hhcmFjdGVyLCBhbmQgdGhlCisgICAgICogZm9sbG93aW5nIGNoYXJhY3RlcnMgYXJlIGFzc2lnbmVkIGFuIGFkdmFuY2Ugb2YgMC4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgZ2VuZXJhdGVzIHRoZSBzdW0gb2YgdGhlIGFkdmFuY2VzIG9mIGdseXBocyBmb3IKKyAgICAgKiBjaGFyYWN0ZXJzIGluIGEgcmVvcmRlcmVkIGNsdXN0ZXIgYXMgdGhlIHdpZHRoIG9mIHRoZSBmaXJzdAorICAgICAqIGxvZ2ljYWwgY2hhcmFjdGVyIGluIHRoZSBjbHVzdGVyLCBhbmQgMCBmb3IgdGhlIHdpZHRocyBvZiBhbGwKKyAgICAgKiBvdGhlciBjaGFyYWN0ZXJzIGluIHRoZSBjbHVzdGVyLiAgSW4gZWZmZWN0LCBzdWNoIGNsdXN0ZXJzIGFyZQorICAgICAqIHRyZWF0ZWQgbGlrZSBjb25qdW5jdHMuCisgICAgICoKKyAgICAgKiA8cD5UaGUgc2hhcGluZyBib3VuZHMgbGltaXQgdGhlIGFtb3VudCBvZiBjb250ZXh0IGF2YWlsYWJsZQorICAgICAqIG91dHNpZGUgc3RhcnQgYW5kIGVuZCB0aGF0IGNhbiBiZSB1c2VkIGZvciBzaGFwaW5nIGFuYWx5c2lzLgorICAgICAqIFRoZXNlIGJvdW5kcyB0eXBpY2FsbHkgcmVmbGVjdCBjaGFuZ2VzIGluIGJpZGkgbGV2ZWwgb3IgZm9udAorICAgICAqIG1ldHJpY3MgYWNyb3NzIHdoaWNoIHNoYXBpbmcgZG9lcyBub3Qgb2NjdXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGV4dCB0aGUgdGV4dCB0byBtZWFzdXJlCisgICAgICogQHBhcmFtIHN0YXJ0IHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyIHRvIG1lYXN1cmUKKyAgICAgKiBAcGFyYW0gZW5kIHRoZSBpbmRleCBwYXN0IHRoZSBsYXN0IGNoYXJhY3RlciB0byBtZWFzdXJlCisgICAgICogQHBhcmFtIGNvbnRleHRTdGFydCB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGNoYXJhY3RlciB0byB1c2UgZm9yIHNoYXBpbmcgY29udGV4dCwKKyAgICAgKiBtdXN0IGJlIDw9IHN0YXJ0CisgICAgICogQHBhcmFtIGNvbnRleHRFbmQgdGhlIGluZGV4IHBhc3QgdGhlIGxhc3QgY2hhcmFjdGVyIHRvIHVzZSBmb3Igc2hhcGluZyBjb250ZXh0LAorICAgICAqIG11c3QgYmUgPj0gZW5kCisgICAgICogQHBhcmFtIGZsYWdzIHRoZSBmbGFncyB0byBjb250cm9sIHRoZSBhZHZhbmNlcywgZWl0aGVyIHtAbGluayAjRElSRUNUSU9OX0xUUn0KKyAgICAgKiBvciB7QGxpbmsgI0RJUkVDVElPTl9SVEx9CisgICAgICogQHBhcmFtIGFkdmFuY2VzIGFycmF5IHRvIHJlY2VpdmUgdGhlIGFkdmFuY2VzLCBtdXN0IGhhdmUgcm9vbSBmb3IgYWxsIGFkdmFuY2VzLAorICAgICAqIGNhbiBiZSBudWxsIGlmIG9ubHkgdG90YWwgYWR2YW5jZSBpcyBuZWVkZWQKKyAgICAgKiBAcGFyYW0gYWR2YW5jZXNJbmRleCB0aGUgcG9zaXRpb24gaW4gYWR2YW5jZXMgYXQgd2hpY2ggdG8gcHV0IHRoZQorICAgICAqIGFkdmFuY2UgY29ycmVzcG9uZGluZyB0byB0aGUgY2hhcmFjdGVyIGF0IHN0YXJ0CisgICAgICogQHJldHVybiB0aGUgdG90YWwgYWR2YW5jZQorICAgICAqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgZmxvYXQgZ2V0VGV4dFJ1bkFkdmFuY2VzKFN0cmluZyB0ZXh0LCBpbnQgc3RhcnQsIGludCBlbmQsIGludCBjb250ZXh0U3RhcnQsCisgICAgICAgICAgICBpbnQgY29udGV4dEVuZCwgaW50IGZsYWdzLCBmbG9hdFtdIGFkdmFuY2VzLCBpbnQgYWR2YW5jZXNJbmRleCkgeworCisgICAgICAgIGlmICgoc3RhcnQgfCBlbmQgfCBjb250ZXh0U3RhcnQgfCBjb250ZXh0RW5kIHwgYWR2YW5jZXNJbmRleCB8IChlbmQgLSBzdGFydCkKKyAgICAgICAgICAgICAgICB8IChzdGFydCAtIGNvbnRleHRTdGFydCkgfCAoY29udGV4dEVuZCAtIGVuZCkKKyAgICAgICAgICAgICAgICB8ICh0ZXh0Lmxlbmd0aCgpIC0gY29udGV4dEVuZCkKKyAgICAgICAgICAgICAgICB8IChhZHZhbmNlcyA9PSBudWxsID8gMCA6CisgICAgICAgICAgICAgICAgICAgIChhZHZhbmNlcy5sZW5ndGggLSBhZHZhbmNlc0luZGV4IC0gKGVuZCAtIHN0YXJ0KSkpKSA8IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZsYWdzICE9IERJUkVDVElPTl9MVFIgJiYgZmxhZ3MgIT0gRElSRUNUSU9OX1JUTCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidW5rbm93biBmbGFncyB2YWx1ZTogIiArIGZsYWdzKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghbUhhc0NvbXBhdFNjYWxpbmcpIHsKKyAgICAgICAgICAgIHJldHVybiBuYXRpdmVfZ2V0VGV4dFJ1bkFkdmFuY2VzKG1OYXRpdmVQYWludCwgdGV4dCwgc3RhcnQsIGVuZCwKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dFN0YXJ0LCBjb250ZXh0RW5kLCBmbGFncywgYWR2YW5jZXMsIGFkdmFuY2VzSW5kZXgpOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgZmxvYXQgb2xkU2l6ZSA9IGdldFRleHRTaXplKCk7CisgICAgICAgIHNldFRleHRTaXplKG9sZFNpemUgKiBtQ29tcGF0U2NhbGluZyk7CisgICAgICAgIGZsb2F0IHRvdGFsQWR2YW5jZSA9IG5hdGl2ZV9nZXRUZXh0UnVuQWR2YW5jZXMobU5hdGl2ZVBhaW50LCB0ZXh0LCBzdGFydCwgZW5kLAorICAgICAgICAgICAgICAgIGNvbnRleHRTdGFydCwgY29udGV4dEVuZCwgZmxhZ3MsIGFkdmFuY2VzLCBhZHZhbmNlc0luZGV4KTsKKyAgICAgICAgc2V0VGV4dFNpemUob2xkU2l6ZSk7CisKKyAgICAgICAgaWYgKGFkdmFuY2VzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSBhZHZhbmNlc0luZGV4LCBlID0gaSArIChlbmQgLSBzdGFydCk7IGkgPCBlOyBpKyspIHsKKyAgICAgICAgICAgICAgICBhZHZhbmNlc1tpXSAqPSBtSW52Q29tcGF0U2NhbGluZzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdG90YWxBZHZhbmNlICogbUludkNvbXBhdFNjYWxpbmc7IC8vIGFzc3VtZSBlcnJvcnMgYXJlIGluc2lnbmlmaWNhbnQKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBuZXh0IGN1cnNvciBwb3NpdGlvbiBpbiB0aGUgcnVuLiAgVGhpcyBhdm9pZHMgcGxhY2luZyB0aGUKKyAgICAgKiBjdXJzb3IgYmV0d2VlbiBzdXJyb2dhdGVzLCBiZXR3ZWVuIGNoYXJhY3RlcnMgdGhhdCBmb3JtIGNvbmp1bmN0cywKKyAgICAgKiBiZXR3ZWVuIGJhc2UgY2hhcmFjdGVycyBhbmQgY29tYmluaW5nIG1hcmtzLCBvciB3aXRoaW4gYSByZW9yZGVyaW5nCisgICAgICogY2x1c3Rlci4KKyAgICAgKgorICAgICAqIDxwPkNvbnRleHRTdGFydCBhbmQgb2Zmc2V0IGFyZSByZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgdGV4dC4KKyAgICAgKiBUaGUgY29udGV4dCBpcyB0aGUgc2hhcGluZyBjb250ZXh0IGZvciBjdXJzb3IgbW92ZW1lbnQsIGdlbmVyYWxseQorICAgICAqIHRoZSBib3VuZHMgb2YgdGhlIG1ldHJpYyBzcGFuIGVuY2xvc2luZyB0aGUgY3Vyc29yIGluIHRoZSBkaXJlY3Rpb24gb2YKKyAgICAgKiBtb3ZlbWVudC4KKyAgICAgKgorICAgICAqIDxwPklmIGN1cnNvck9wdCBpcyB7QGxpbmsgI0NVUlNPUl9BVH0gYW5kIHRoZSBvZmZzZXQgaXMgbm90IGEgdmFsaWQKKyAgICAgKiBjdXJzb3IgcG9zaXRpb24sIHRoaXMgcmV0dXJucyAtMS4gIE90aGVyd2lzZSB0aGlzIHdpbGwgbmV2ZXIgcmV0dXJuIGEKKyAgICAgKiB2YWx1ZSBiZWZvcmUgY29udGV4dFN0YXJ0IG9yIGFmdGVyIGNvbnRleHRTdGFydCArIGNvbnRleHRMZW5ndGguCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGV4dCB0aGUgdGV4dAorICAgICAqIEBwYXJhbSBjb250ZXh0U3RhcnQgdGhlIHN0YXJ0IG9mIHRoZSBjb250ZXh0CisgICAgICogQHBhcmFtIGNvbnRleHRMZW5ndGggdGhlIGxlbmd0aCBvZiB0aGUgY29udGV4dAorICAgICAqIEBwYXJhbSBmbGFncyBlaXRoZXIge0BsaW5rICNESVJFQ1RJT05fUlRMfSBvciB7QGxpbmsgI0RJUkVDVElPTl9MVFJ9CisgICAgICogQHBhcmFtIG9mZnNldCB0aGUgY3Vyc29yIHBvc2l0aW9uIHRvIG1vdmUgZnJvbQorICAgICAqIEBwYXJhbSBjdXJzb3JPcHQgaG93IHRvIG1vdmUgdGhlIGN1cnNvciwgb25lIG9mIHtAbGluayAjQ1VSU09SX0FGVEVSfSwKKyAgICAgKiB7QGxpbmsgI0NVUlNPUl9BVF9PUl9BRlRFUn0sIHtAbGluayAjQ1VSU09SX0JFRk9SRX0sCisgICAgICoge0BsaW5rICNDVVJTT1JfQVRfT1JfQkVGT1JFfSwgb3Ige0BsaW5rICNDVVJTT1JfQVR9CisgICAgICogQHJldHVybiB0aGUgb2Zmc2V0IG9mIHRoZSBuZXh0IHBvc2l0aW9uLCBvciAtMQorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGludCBnZXRUZXh0UnVuQ3Vyc29yKGNoYXJbXSB0ZXh0LCBpbnQgY29udGV4dFN0YXJ0LCBpbnQgY29udGV4dExlbmd0aCwKKyAgICAgICAgICAgIGludCBmbGFncywgaW50IG9mZnNldCwgaW50IGN1cnNvck9wdCkgeworICAgICAgICBpbnQgY29udGV4dEVuZCA9IGNvbnRleHRTdGFydCArIGNvbnRleHRMZW5ndGg7CisgICAgICAgIGlmICgoKGNvbnRleHRTdGFydCB8IGNvbnRleHRFbmQgfCBvZmZzZXQgfCAoY29udGV4dEVuZCAtIGNvbnRleHRTdGFydCkKKyAgICAgICAgICAgICAgICB8IChvZmZzZXQgLSBjb250ZXh0U3RhcnQpIHwgKGNvbnRleHRFbmQgLSBvZmZzZXQpCisgICAgICAgICAgICAgICAgfCAodGV4dC5sZW5ndGggLSBjb250ZXh0RW5kKSB8IGN1cnNvck9wdCkgPCAwKQorICAgICAgICAgICAgICAgIHx8IGN1cnNvck9wdCA+IENVUlNPUl9PUFRfTUFYX1ZBTFVFKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG5hdGl2ZV9nZXRUZXh0UnVuQ3Vyc29yKG1OYXRpdmVQYWludCwgdGV4dCwKKyAgICAgICAgICAgICAgICBjb250ZXh0U3RhcnQsIGNvbnRleHRMZW5ndGgsIGZsYWdzLCBvZmZzZXQsIGN1cnNvck9wdCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbmV4dCBjdXJzb3IgcG9zaXRpb24gaW4gdGhlIHJ1bi4gIFRoaXMgYXZvaWRzIHBsYWNpbmcgdGhlCisgICAgICogY3Vyc29yIGJldHdlZW4gc3Vycm9nYXRlcywgYmV0d2VlbiBjaGFyYWN0ZXJzIHRoYXQgZm9ybSBjb25qdW5jdHMsCisgICAgICogYmV0d2VlbiBiYXNlIGNoYXJhY3RlcnMgYW5kIGNvbWJpbmluZyBtYXJrcywgb3Igd2l0aGluIGEgcmVvcmRlcmluZworICAgICAqIGNsdXN0ZXIuCisgICAgICoKKyAgICAgKiA8cD5Db250ZXh0U3RhcnQsIGNvbnRleHRFbmQsIGFuZCBvZmZzZXQgYXJlIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZgorICAgICAqIHRleHQuICBUaGUgY29udGV4dCBpcyB0aGUgc2hhcGluZyBjb250ZXh0IGZvciBjdXJzb3IgbW92ZW1lbnQsIGdlbmVyYWxseQorICAgICAqIHRoZSBib3VuZHMgb2YgdGhlIG1ldHJpYyBzcGFuIGVuY2xvc2luZyB0aGUgY3Vyc29yIGluIHRoZSBkaXJlY3Rpb24gb2YKKyAgICAgKiBtb3ZlbWVudC4KKyAgICAgKgorICAgICAqIDxwPklmIGN1cnNvck9wdCBpcyB7QGxpbmsgI0NVUlNPUl9BVH0gYW5kIHRoZSBvZmZzZXQgaXMgbm90IGEgdmFsaWQKKyAgICAgKiBjdXJzb3IgcG9zaXRpb24sIHRoaXMgcmV0dXJucyAtMS4gIE90aGVyd2lzZSB0aGlzIHdpbGwgbmV2ZXIgcmV0dXJuIGEKKyAgICAgKiB2YWx1ZSBiZWZvcmUgY29udGV4dFN0YXJ0IG9yIGFmdGVyIGNvbnRleHRFbmQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGV4dCB0aGUgdGV4dAorICAgICAqIEBwYXJhbSBjb250ZXh0U3RhcnQgdGhlIHN0YXJ0IG9mIHRoZSBjb250ZXh0CisgICAgICogQHBhcmFtIGNvbnRleHRFbmQgdGhlIGVuZCBvZiB0aGUgY29udGV4dAorICAgICAqIEBwYXJhbSBmbGFncyBlaXRoZXIge0BsaW5rICNESVJFQ1RJT05fUlRMfSBvciB7QGxpbmsgI0RJUkVDVElPTl9MVFJ9CisgICAgICogQHBhcmFtIG9mZnNldCB0aGUgY3Vyc29yIHBvc2l0aW9uIHRvIG1vdmUgZnJvbQorICAgICAqIEBwYXJhbSBjdXJzb3JPcHQgaG93IHRvIG1vdmUgdGhlIGN1cnNvciwgb25lIG9mIHtAbGluayAjQ1VSU09SX0FGVEVSfSwKKyAgICAgKiB7QGxpbmsgI0NVUlNPUl9BVF9PUl9BRlRFUn0sIHtAbGluayAjQ1VSU09SX0JFRk9SRX0sCisgICAgICoge0BsaW5rICNDVVJTT1JfQVRfT1JfQkVGT1JFfSwgb3Ige0BsaW5rICNDVVJTT1JfQVR9CisgICAgICogQHJldHVybiB0aGUgb2Zmc2V0IG9mIHRoZSBuZXh0IHBvc2l0aW9uLCBvciAtMQorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGludCBnZXRUZXh0UnVuQ3Vyc29yKENoYXJTZXF1ZW5jZSB0ZXh0LCBpbnQgY29udGV4dFN0YXJ0LAorICAgICAgICAgICBpbnQgY29udGV4dEVuZCwgaW50IGZsYWdzLCBpbnQgb2Zmc2V0LCBpbnQgY3Vyc29yT3B0KSB7CisKKyAgICAgICAgaWYgKHRleHQgaW5zdGFuY2VvZiBTdHJpbmcgfHwgdGV4dCBpbnN0YW5jZW9mIFNwYW5uZWRTdHJpbmcgfHwKKyAgICAgICAgICAgICAgICB0ZXh0IGluc3RhbmNlb2YgU3Bhbm5hYmxlU3RyaW5nKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0VGV4dFJ1bkN1cnNvcih0ZXh0LnRvU3RyaW5nKCksIGNvbnRleHRTdGFydCwgY29udGV4dEVuZCwKKyAgICAgICAgICAgICAgICAgICAgZmxhZ3MsIG9mZnNldCwgY3Vyc29yT3B0KTsKKyAgICAgICAgfQorICAgICAgICBpZiAodGV4dCBpbnN0YW5jZW9mIEdyYXBoaWNzT3BlcmF0aW9ucykgeworICAgICAgICAgICAgcmV0dXJuICgoR3JhcGhpY3NPcGVyYXRpb25zKSB0ZXh0KS5nZXRUZXh0UnVuQ3Vyc29yKAorICAgICAgICAgICAgICAgICAgICBjb250ZXh0U3RhcnQsIGNvbnRleHRFbmQsIGZsYWdzLCBvZmZzZXQsIGN1cnNvck9wdCwgdGhpcyk7CisgICAgICAgIH0KKworICAgICAgICBpbnQgY29udGV4dExlbiA9IGNvbnRleHRFbmQgLSBjb250ZXh0U3RhcnQ7CisgICAgICAgIGNoYXJbXSBidWYgPSBUZW1wb3JhcnlCdWZmZXIub2J0YWluKGNvbnRleHRMZW4pOworICAgICAgICBUZXh0VXRpbHMuZ2V0Q2hhcnModGV4dCwgY29udGV4dFN0YXJ0LCBjb250ZXh0RW5kLCBidWYsIDApOworICAgICAgICBpbnQgcmVzdWx0ID0gZ2V0VGV4dFJ1bkN1cnNvcihidWYsIDAsIGNvbnRleHRMZW4sIGZsYWdzLCBvZmZzZXQsIGN1cnNvck9wdCk7CisgICAgICAgIFRlbXBvcmFyeUJ1ZmZlci5yZWN5Y2xlKGJ1Zik7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbmV4dCBjdXJzb3IgcG9zaXRpb24gaW4gdGhlIHJ1bi4gIFRoaXMgYXZvaWRzIHBsYWNpbmcgdGhlCisgICAgICogY3Vyc29yIGJldHdlZW4gc3Vycm9nYXRlcywgYmV0d2VlbiBjaGFyYWN0ZXJzIHRoYXQgZm9ybSBjb25qdW5jdHMsCisgICAgICogYmV0d2VlbiBiYXNlIGNoYXJhY3RlcnMgYW5kIGNvbWJpbmluZyBtYXJrcywgb3Igd2l0aGluIGEgcmVvcmRlcmluZworICAgICAqIGNsdXN0ZXIuCisgICAgICoKKyAgICAgKiA8cD5Db250ZXh0U3RhcnQsIGNvbnRleHRFbmQsIGFuZCBvZmZzZXQgYXJlIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZgorICAgICAqIHRleHQuICBUaGUgY29udGV4dCBpcyB0aGUgc2hhcGluZyBjb250ZXh0IGZvciBjdXJzb3IgbW92ZW1lbnQsIGdlbmVyYWxseQorICAgICAqIHRoZSBib3VuZHMgb2YgdGhlIG1ldHJpYyBzcGFuIGVuY2xvc2luZyB0aGUgY3Vyc29yIGluIHRoZSBkaXJlY3Rpb24gb2YKKyAgICAgKiBtb3ZlbWVudC4KKyAgICAgKgorICAgICAqIDxwPklmIGN1cnNvck9wdCBpcyB7QGxpbmsgI0NVUlNPUl9BVH0gYW5kIHRoZSBvZmZzZXQgaXMgbm90IGEgdmFsaWQKKyAgICAgKiBjdXJzb3IgcG9zaXRpb24sIHRoaXMgcmV0dXJucyAtMS4gIE90aGVyd2lzZSB0aGlzIHdpbGwgbmV2ZXIgcmV0dXJuIGEKKyAgICAgKiB2YWx1ZSBiZWZvcmUgY29udGV4dFN0YXJ0IG9yIGFmdGVyIGNvbnRleHRFbmQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGV4dCB0aGUgdGV4dAorICAgICAqIEBwYXJhbSBjb250ZXh0U3RhcnQgdGhlIHN0YXJ0IG9mIHRoZSBjb250ZXh0CisgICAgICogQHBhcmFtIGNvbnRleHRFbmQgdGhlIGVuZCBvZiB0aGUgY29udGV4dAorICAgICAqIEBwYXJhbSBmbGFncyBlaXRoZXIge0BsaW5rICNESVJFQ1RJT05fUlRMfSBvciB7QGxpbmsgI0RJUkVDVElPTl9MVFJ9CisgICAgICogQHBhcmFtIG9mZnNldCB0aGUgY3Vyc29yIHBvc2l0aW9uIHRvIG1vdmUgZnJvbQorICAgICAqIEBwYXJhbSBjdXJzb3JPcHQgaG93IHRvIG1vdmUgdGhlIGN1cnNvciwgb25lIG9mIHtAbGluayAjQ1VSU09SX0FGVEVSfSwKKyAgICAgKiB7QGxpbmsgI0NVUlNPUl9BVF9PUl9BRlRFUn0sIHtAbGluayAjQ1VSU09SX0JFRk9SRX0sCisgICAgICoge0BsaW5rICNDVVJTT1JfQVRfT1JfQkVGT1JFfSwgb3Ige0BsaW5rICNDVVJTT1JfQVR9CisgICAgICogQHJldHVybiB0aGUgb2Zmc2V0IG9mIHRoZSBuZXh0IHBvc2l0aW9uLCBvciAtMQorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGludCBnZXRUZXh0UnVuQ3Vyc29yKFN0cmluZyB0ZXh0LCBpbnQgY29udGV4dFN0YXJ0LCBpbnQgY29udGV4dEVuZCwKKyAgICAgICAgICAgIGludCBmbGFncywgaW50IG9mZnNldCwgaW50IGN1cnNvck9wdCkgeworICAgICAgICBpZiAoKChjb250ZXh0U3RhcnQgfCBjb250ZXh0RW5kIHwgb2Zmc2V0IHwgKGNvbnRleHRFbmQgLSBjb250ZXh0U3RhcnQpCisgICAgICAgICAgICAgICAgfCAob2Zmc2V0IC0gY29udGV4dFN0YXJ0KSB8IChjb250ZXh0RW5kIC0gb2Zmc2V0KQorICAgICAgICAgICAgICAgIHwgKHRleHQubGVuZ3RoKCkgLSBjb250ZXh0RW5kKSB8IGN1cnNvck9wdCkgPCAwKQorICAgICAgICAgICAgICAgIHx8IGN1cnNvck9wdCA+IENVUlNPUl9PUFRfTUFYX1ZBTFVFKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG5hdGl2ZV9nZXRUZXh0UnVuQ3Vyc29yKG1OYXRpdmVQYWludCwgdGV4dCwKKyAgICAgICAgICAgICAgICBjb250ZXh0U3RhcnQsIGNvbnRleHRFbmQsIGZsYWdzLCBvZmZzZXQsIGN1cnNvck9wdCk7CisgICAgfQorCisgICAgLyoqCiAgICAgICogUmV0dXJuIHRoZSBwYXRoIChvdXRsaW5lKSBmb3IgdGhlIHNwZWNpZmllZCB0ZXh0LgogICAgICAqIE5vdGU6IGp1c3QgbGlrZSBDYW52YXMuZHJhd1RleHQsIHRoaXMgd2lsbCByZXNwZWN0IHRoZSBBbGlnbiBzZXR0aW5nIGluCiAgICAgICogdGhlIHBhaW50LgpAQCAtMTI5OSw3ICsxNzUyLDggQEAKICAgICAgICAgaWYgKChpbmRleCB8IGNvdW50KSA8IDAgfHwgaW5kZXggKyBjb3VudCA+IHRleHQubGVuZ3RoKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CiAgICAgICAgIH0KLSAgICAgICAgbmF0aXZlX2dldFRleHRQYXRoKG1OYXRpdmVQYWludCwgdGV4dCwgaW5kZXgsIGNvdW50LCB4LCB5LCBwYXRoLm5pKCkpOworICAgICAgICBuYXRpdmVfZ2V0VGV4dFBhdGgobU5hdGl2ZVBhaW50LCBtQmlkaUZsYWdzLCB0ZXh0LCBpbmRleCwgY291bnQsIHgsIHksIAorICAgICAgICAgICAgICAgIHBhdGgubmkoKSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMzIwLDcgKzE3NzQsOCBAQAogICAgICAgICBpZiAoKHN0YXJ0IHwgZW5kIHwgKGVuZCAtIHN0YXJ0KSB8ICh0ZXh0Lmxlbmd0aCgpIC0gZW5kKSkgPCAwKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOwogICAgICAgICB9Ci0gICAgICAgIG5hdGl2ZV9nZXRUZXh0UGF0aChtTmF0aXZlUGFpbnQsIHRleHQsIHN0YXJ0LCBlbmQsIHgsIHksIHBhdGgubmkoKSk7CisgICAgICAgIG5hdGl2ZV9nZXRUZXh0UGF0aChtTmF0aXZlUGFpbnQsIG1CaWRpRmxhZ3MsIHRleHQsIHN0YXJ0LCBlbmQsIHgsIHksIAorICAgICAgICAgICAgICAgIHBhdGgubmkoKSk7CiAgICAgfQogICAgIAogICAgIC8qKgpAQCAtMTQwNCw5ICsxODU5LDIyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcltdIHRleHQsIGludCBpbmRleCwgaW50IGNvdW50LCBmbG9hdFtdIHdpZHRocyk7CiAgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludCBuYXRpdmVfZ2V0VGV4dFdpZHRocyhpbnQgbmF0aXZlX29iamVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdGV4dCwgaW50IHN0YXJ0LCBpbnQgZW5kLCBmbG9hdFtdIHdpZHRocyk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlX2dldFRleHRQYXRoKGludCBuYXRpdmVfb2JqZWN0LAorCisgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGZsb2F0IG5hdGl2ZV9nZXRUZXh0UnVuQWR2YW5jZXMoaW50IG5hdGl2ZV9vYmplY3QsCisgICAgICAgICAgICBjaGFyW10gdGV4dCwgaW50IGluZGV4LCBpbnQgY291bnQsIGludCBjb250ZXh0SW5kZXgsIGludCBjb250ZXh0Q291bnQsCisgICAgICAgICAgICBpbnQgZmxhZ3MsIGZsb2F0W10gYWR2YW5jZXMsIGludCBhZHZhbmNlc0luZGV4KTsKKyAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgZmxvYXQgbmF0aXZlX2dldFRleHRSdW5BZHZhbmNlcyhpbnQgbmF0aXZlX29iamVjdCwKKyAgICAgICAgICAgIFN0cmluZyB0ZXh0LCBpbnQgc3RhcnQsIGludCBlbmQsIGludCBjb250ZXh0U3RhcnQsIGludCBjb250ZXh0RW5kLAorICAgICAgICAgICAgaW50IGZsYWdzLCBmbG9hdFtdIGFkdmFuY2VzLCBpbnQgYWR2YW5jZXNJbmRleCk7CisKKyAgICBwcml2YXRlIG5hdGl2ZSBpbnQgbmF0aXZlX2dldFRleHRSdW5DdXJzb3IoaW50IG5hdGl2ZV9vYmplY3QsIGNoYXJbXSB0ZXh0LAorICAgICAgICAgICAgaW50IGNvbnRleHRTdGFydCwgaW50IGNvbnRleHRMZW5ndGgsIGludCBmbGFncywgaW50IG9mZnNldCwgaW50IGN1cnNvck9wdCk7CisgICAgcHJpdmF0ZSBuYXRpdmUgaW50IG5hdGl2ZV9nZXRUZXh0UnVuQ3Vyc29yKGludCBuYXRpdmVfb2JqZWN0LCBTdHJpbmcgdGV4dCwKKyAgICAgICAgICAgIGludCBjb250ZXh0U3RhcnQsIGludCBjb250ZXh0RW5kLCBpbnQgZmxhZ3MsIGludCBvZmZzZXQsIGludCBjdXJzb3JPcHQpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlX2dldFRleHRQYXRoKGludCBuYXRpdmVfb2JqZWN0LCBpbnQgYmlkaUZsYWdzLAogICAgICAgICAgICAgICAgIGNoYXJbXSB0ZXh0LCBpbnQgaW5kZXgsIGludCBjb3VudCwgZmxvYXQgeCwgZmxvYXQgeSwgaW50IHBhdGgpOwotICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZV9nZXRUZXh0UGF0aChpbnQgbmF0aXZlX29iamVjdCwKKyAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBuYXRpdmVfZ2V0VGV4dFBhdGgoaW50IG5hdGl2ZV9vYmplY3QsIGludCBiaWRpRmxhZ3MsCiAgICAgICAgICAgICAgICAgU3RyaW5nIHRleHQsIGludCBzdGFydCwgaW50IGVuZCwgZmxvYXQgeCwgZmxvYXQgeSwgaW50IHBhdGgpOwogICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZUdldFN0cmluZ0JvdW5kcyhpbnQgbmF0aXZlUGFpbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0ZXh0LCBpbnQgc3RhcnQsIGludCBlbmQsIFJlY3QgYm91bmRzKTsKQEAgLTE0MTQsNCArMTg4MiwzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJbXSB0ZXh0LCBpbnQgaW5kZXgsIGludCBjb3VudCwgUmVjdCBib3VuZHMpOwogICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIGZpbmFsaXplcihpbnQgbmF0aXZlUGFpbnQpOwogfQotCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvUGF0aC5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL1BhdGguamF2YQppbmRleCAyODE4MjNhLi5jMzQxNmEwIDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvUGF0aC5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9QYXRoLmphdmEKQEAgLTE2LDYgKzE2LDggQEAKIAogcGFja2FnZSBhbmRyb2lkLmdyYXBoaWNzOwogCitpbXBvcnQgYW5kcm9pZC52aWV3LkhhcmR3YXJlUmVuZGVyZXI7CisKIC8qKgogICogVGhlIFBhdGggY2xhc3MgZW5jYXBzdWxhdGVzIGNvbXBvdW5kIChtdWx0aXBsZSBjb250b3VyKSBnZW9tZXRyaWMgcGF0aHMKICAqIGNvbnNpc3Rpbmcgb2Ygc3RyYWlnaHQgbGluZSBzZWdtZW50cywgcXVhZHJhdGljIGN1cnZlcywgYW5kIGN1YmljIGN1cnZlcy4KQEAgLTI0LDEyICsyNiwyNyBAQAogICogdGV4dCBvbiBhIHBhdGguCiAgKi8KIHB1YmxpYyBjbGFzcyBQYXRoIHsKKyAgICAvKioKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBpbnQgbU5hdGl2ZVBhdGg7CisKKyAgICAvKioKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzU2ltcGxlUGF0aCA9IHRydWU7CisgICAgLyoqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgUmVnaW9uIHJlY3RzOworICAgIHByaXZhdGUgYm9vbGVhbiBtRGV0ZWN0U2ltcGxlUGF0aHM7CiAKICAgICAvKioKICAgICAgKiBDcmVhdGUgYW4gZW1wdHkgcGF0aAogICAgICAqLwogICAgIHB1YmxpYyBQYXRoKCkgewogICAgICAgICBtTmF0aXZlUGF0aCA9IGluaXQxKCk7CisgICAgICAgIG1EZXRlY3RTaW1wbGVQYXRocyA9IEhhcmR3YXJlUmVuZGVyZXIuaXNBdmFpbGFibGUoKTsKICAgICB9CiAKICAgICAvKioKQEAgLTQzLDYgKzYwLDcgQEAKICAgICAgICAgICAgIHZhbE5hdGl2ZSA9IHNyYy5tTmF0aXZlUGF0aDsKICAgICAgICAgfQogICAgICAgICBtTmF0aXZlUGF0aCA9IGluaXQyKHZhbE5hdGl2ZSk7CisgICAgICAgIG1EZXRlY3RTaW1wbGVQYXRocyA9IEhhcmR3YXJlUmVuZGVyZXIuaXNBdmFpbGFibGUoKTsKICAgICB9CiAgICAgCiAgICAgLyoqCkBAIC01MCw2ICs2OCwxMCBAQAogICAgICAqIFRoaXMgZG9lcyBOT1QgY2hhbmdlIHRoZSBmaWxsLXR5cGUgc2V0dGluZy4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCByZXNldCgpIHsKKyAgICAgICAgaXNTaW1wbGVQYXRoID0gdHJ1ZTsKKyAgICAgICAgaWYgKG1EZXRlY3RTaW1wbGVQYXRocykgeworICAgICAgICAgICAgaWYgKHJlY3RzICE9IG51bGwpIHJlY3RzLnNldEVtcHR5KCk7CisgICAgICAgIH0KICAgICAgICAgbmF0aXZlX3Jlc2V0KG1OYXRpdmVQYXRoKTsKICAgICB9CiAKQEAgLTU4LDYgKzgwLDEwIEBACiAgICAgICoga2VlcHMgdGhlIGludGVybmFsIGRhdGEgc3RydWN0dXJlIGZvciBmYXN0ZXIgcmV1c2UuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgcmV3aW5kKCkgeworICAgICAgICBpc1NpbXBsZVBhdGggPSB0cnVlOworICAgICAgICBpZiAobURldGVjdFNpbXBsZVBhdGhzKSB7CisgICAgICAgICAgICBpZiAocmVjdHMgIT0gbnVsbCkgcmVjdHMuc2V0RW1wdHkoKTsKKyAgICAgICAgfQogICAgICAgICBuYXRpdmVfcmV3aW5kKG1OYXRpdmVQYXRoKTsKICAgICB9CiAKQEAgLTY1LDYgKzkxLDcgQEAKICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldChQYXRoIHNyYykgewogICAgICAgICBpZiAodGhpcyAhPSBzcmMpIHsKKyAgICAgICAgICAgIGlzU2ltcGxlUGF0aCA9IHNyYy5pc1NpbXBsZVBhdGg7CiAgICAgICAgICAgICBuYXRpdmVfc2V0KG1OYXRpdmVQYXRoLCBzcmMubU5hdGl2ZVBhdGgpOwogICAgICAgICB9CiAgICAgfQpAQCAtMTYwLDYgKzE4Nyw3IEBACiAgICAgICogQHBhcmFtIGJvdW5kcyBSZXR1cm5zIHRoZSBjb21wdXRlZCBib3VuZHMgb2YgdGhlIHBhdGgncyBjb250cm9sIHBvaW50cy4KICAgICAgKiBAcGFyYW0gZXhhY3QgVGhpcyBwYXJhbWV0ZXIgaXMgbm8gbG9uZ2VyIHVzZWQuCiAgICAgICovCisgICAgQFN1cHByZXNzV2FybmluZ3MoeyJVbnVzZWREZWNsYXJhdGlvbiJ9KQogICAgIHB1YmxpYyB2b2lkIGNvbXB1dGVCb3VuZHMoUmVjdEYgYm91bmRzLCBib29sZWFuIGV4YWN0KSB7CiAgICAgICAgIG5hdGl2ZV9jb21wdXRlQm91bmRzKG1OYXRpdmVQYXRoLCBib3VuZHMpOwogICAgIH0KQEAgLTIzNiw2ICsyNjQsNyBAQAogICAgICAqIEBwYXJhbSB5MiBUaGUgeS1jb29yZGluYXRlIG9mIHRoZSBlbmQgcG9pbnQgb24gYSBxdWFkcmF0aWMgY3VydmUKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBxdWFkVG8oZmxvYXQgeDEsIGZsb2F0IHkxLCBmbG9hdCB4MiwgZmxvYXQgeTIpIHsKKyAgICAgICAgaXNTaW1wbGVQYXRoID0gZmFsc2U7CiAgICAgICAgIG5hdGl2ZV9xdWFkVG8obU5hdGl2ZVBhdGgsIHgxLCB5MSwgeDIsIHkyKTsKICAgICB9CiAKQEAgLTI1NCw2ICsyODMsNyBAQAogICAgICAqICAgICAgICAgICAgdGhpcyBjb250b3VyLCBmb3IgdGhlIGVuZCBwb2ludCBvZiBhIHF1YWRyYXRpYyBjdXJ2ZQogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHJRdWFkVG8oZmxvYXQgZHgxLCBmbG9hdCBkeTEsIGZsb2F0IGR4MiwgZmxvYXQgZHkyKSB7CisgICAgICAgIGlzU2ltcGxlUGF0aCA9IGZhbHNlOwogICAgICAgICBuYXRpdmVfclF1YWRUbyhtTmF0aXZlUGF0aCwgZHgxLCBkeTEsIGR4MiwgZHkyKTsKICAgICB9CiAKQEAgLTI3MSw2ICszMDEsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGN1YmljVG8oZmxvYXQgeDEsIGZsb2F0IHkxLCBmbG9hdCB4MiwgZmxvYXQgeTIsCiAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4MywgZmxvYXQgeTMpIHsKKyAgICAgICAgaXNTaW1wbGVQYXRoID0gZmFsc2U7CiAgICAgICAgIG5hdGl2ZV9jdWJpY1RvKG1OYXRpdmVQYXRoLCB4MSwgeTEsIHgyLCB5MiwgeDMsIHkzKTsKICAgICB9CiAKQEAgLTI4MSw2ICszMTIsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHJDdWJpY1RvKGZsb2F0IHgxLCBmbG9hdCB5MSwgZmxvYXQgeDIsIGZsb2F0IHkyLAogICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHgzLCBmbG9hdCB5MykgeworICAgICAgICBpc1NpbXBsZVBhdGggPSBmYWxzZTsKICAgICAgICAgbmF0aXZlX3JDdWJpY1RvKG1OYXRpdmVQYXRoLCB4MSwgeTEsIHgyLCB5MiwgeDMsIHkzKTsKICAgICB9CiAKQEAgLTI5OSw2ICszMzEsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGFyY1RvKFJlY3RGIG92YWwsIGZsb2F0IHN0YXJ0QW5nbGUsIGZsb2F0IHN3ZWVwQW5nbGUsCiAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBmb3JjZU1vdmVUbykgeworICAgICAgICBpc1NpbXBsZVBhdGggPSBmYWxzZTsKICAgICAgICAgbmF0aXZlX2FyY1RvKG1OYXRpdmVQYXRoLCBvdmFsLCBzdGFydEFuZ2xlLCBzd2VlcEFuZ2xlLCBmb3JjZU1vdmVUbyk7CiAgICAgfQogICAgIApAQCAtMzE0LDYgKzM0Nyw3IEBACiAgICAgICogQHBhcmFtIHN3ZWVwQW5nbGUgIFN3ZWVwIGFuZ2xlIChpbiBkZWdyZWVzKSBtZWFzdXJlZCBjbG9ja3dpc2UKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBhcmNUbyhSZWN0RiBvdmFsLCBmbG9hdCBzdGFydEFuZ2xlLCBmbG9hdCBzd2VlcEFuZ2xlKSB7CisgICAgICAgIGlzU2ltcGxlUGF0aCA9IGZhbHNlOwogICAgICAgICBuYXRpdmVfYXJjVG8obU5hdGl2ZVBhdGgsIG92YWwsIHN0YXJ0QW5nbGUsIHN3ZWVwQW5nbGUsIGZhbHNlKTsKICAgICB9CiAgICAgCkBAIC0zMjIsNiArMzU2LDcgQEAKICAgICAgKiBmaXJzdCBwb2ludCBvZiB0aGUgY29udG91ciwgYSBsaW5lIHNlZ21lbnQgaXMgYXV0b21hdGljYWxseSBhZGRlZC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKKyAgICAgICAgaXNTaW1wbGVQYXRoID0gZmFsc2U7CiAgICAgICAgIG5hdGl2ZV9jbG9zZShtTmF0aXZlUGF0aCk7CiAgICAgfQogCkBAIC0zNTEsNiArMzg2LDExIEBACiAgICAgICAgIGlmIChyZWN0ID09IG51bGwpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigibmVlZCByZWN0IHBhcmFtZXRlciIpOwogICAgICAgICB9CisgICAgICAgIGlmIChtRGV0ZWN0U2ltcGxlUGF0aHMpIHsKKyAgICAgICAgICAgIGlmIChyZWN0cyA9PSBudWxsKSByZWN0cyA9IG5ldyBSZWdpb24oKTsKKyAgICAgICAgICAgIHJlY3RzLm9wKChpbnQpIHJlY3QubGVmdCwgKGludCkgcmVjdC50b3AsIChpbnQpIHJlY3QucmlnaHQsIChpbnQpIHJlY3QuYm90dG9tLAorICAgICAgICAgICAgICAgICAgICBSZWdpb24uT3AuVU5JT04pOworICAgICAgICB9CiAgICAgICAgIG5hdGl2ZV9hZGRSZWN0KG1OYXRpdmVQYXRoLCByZWN0LCBkaXIubmF0aXZlSW50KTsKICAgICB9CiAKQEAgLTM2Myw4ICs0MDMsMTEgQEAKICAgICAgKiBAcGFyYW0gYm90dG9tIFRoZSBib3R0b20gb2YgYSByZWN0YW5nbGUgdG8gYWRkIHRvIHRoZSBwYXRoCiAgICAgICogQHBhcmFtIGRpciAgICBUaGUgZGlyZWN0aW9uIHRvIHdpbmQgdGhlIHJlY3RhbmdsZSdzIGNvbnRvdXIKICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRSZWN0KGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwKLSAgICAgICAgICAgICAgICAgICAgICAgIERpcmVjdGlvbiBkaXIpIHsKKyAgICBwdWJsaWMgdm9pZCBhZGRSZWN0KGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwgRGlyZWN0aW9uIGRpcikgeworICAgICAgICBpZiAobURldGVjdFNpbXBsZVBhdGhzKSB7CisgICAgICAgICAgICBpZiAocmVjdHMgPT0gbnVsbCkgcmVjdHMgPSBuZXcgUmVnaW9uKCk7CisgICAgICAgICAgICByZWN0cy5vcCgoaW50KSBsZWZ0LCAoaW50KSB0b3AsIChpbnQpIHJpZ2h0LCAoaW50KSBib3R0b20sIFJlZ2lvbi5PcC5VTklPTik7CisgICAgICAgIH0KICAgICAgICAgbmF0aXZlX2FkZFJlY3QobU5hdGl2ZVBhdGgsIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSwgZGlyLm5hdGl2ZUludCk7CiAgICAgfQogCkBAIC0zNzgsNiArNDIxLDcgQEAKICAgICAgICAgaWYgKG92YWwgPT0gbnVsbCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJuZWVkIG92YWwgcGFyYW1ldGVyIik7CiAgICAgICAgIH0KKyAgICAgICAgaXNTaW1wbGVQYXRoID0gZmFsc2U7CiAgICAgICAgIG5hdGl2ZV9hZGRPdmFsKG1OYXRpdmVQYXRoLCBvdmFsLCBkaXIubmF0aXZlSW50KTsKICAgICB9CiAKQEAgLTM5MCw2ICs0MzQsNyBAQAogICAgICAqIEBwYXJhbSBkaXIgICAgVGhlIGRpcmVjdGlvbiB0byB3aW5kIHRoZSBjaXJjbGUncyBjb250b3VyCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYWRkQ2lyY2xlKGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHJhZGl1cywgRGlyZWN0aW9uIGRpcikgeworICAgICAgICBpc1NpbXBsZVBhdGggPSBmYWxzZTsKICAgICAgICAgbmF0aXZlX2FkZENpcmNsZShtTmF0aXZlUGF0aCwgeCwgeSwgcmFkaXVzLCBkaXIubmF0aXZlSW50KTsKICAgICB9CiAKQEAgLTQwNCw2ICs0NDksNyBAQAogICAgICAgICBpZiAob3ZhbCA9PSBudWxsKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIm5lZWQgb3ZhbCBwYXJhbWV0ZXIiKTsKICAgICAgICAgfQorICAgICAgICBpc1NpbXBsZVBhdGggPSBmYWxzZTsKICAgICAgICAgbmF0aXZlX2FkZEFyYyhtTmF0aXZlUGF0aCwgb3ZhbCwgc3RhcnRBbmdsZSwgc3dlZXBBbmdsZSk7CiAgICAgfQogCkBAIC00MTksNiArNDY1LDcgQEAKICAgICAgICAgaWYgKHJlY3QgPT0gbnVsbCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJuZWVkIHJlY3QgcGFyYW1ldGVyIik7CiAgICAgICAgIH0KKyAgICAgICAgaXNTaW1wbGVQYXRoID0gZmFsc2U7CiAgICAgICAgIG5hdGl2ZV9hZGRSb3VuZFJlY3QobU5hdGl2ZVBhdGgsIHJlY3QsIHJ4LCByeSwgZGlyLm5hdGl2ZUludCk7CiAgICAgfQogICAgIApAQCAtNDM4LDYgKzQ4NSw3IEBACiAgICAgICAgIGlmIChyYWRpaS5sZW5ndGggPCA4KSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCJyYWRpaVtdIG5lZWRzIDggdmFsdWVzIik7CiAgICAgICAgIH0KKyAgICAgICAgaXNTaW1wbGVQYXRoID0gZmFsc2U7CiAgICAgICAgIG5hdGl2ZV9hZGRSb3VuZFJlY3QobU5hdGl2ZVBhdGgsIHJlY3QsIHJhZGlpLCBkaXIubmF0aXZlSW50KTsKICAgICB9CiAgICAgCkBAIC00NDgsNiArNDk2LDcgQEAKICAgICAgKiBAcGFyYW0gZHggIFRoZSBhbW91bnQgdG8gdHJhbnNsYXRlIHRoZSBwYXRoIGluIFggYXMgaXQgaXMgYWRkZWQKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBhZGRQYXRoKFBhdGggc3JjLCBmbG9hdCBkeCwgZmxvYXQgZHkpIHsKKyAgICAgICAgaXNTaW1wbGVQYXRoID0gZmFsc2U7CiAgICAgICAgIG5hdGl2ZV9hZGRQYXRoKG1OYXRpdmVQYXRoLCBzcmMubU5hdGl2ZVBhdGgsIGR4LCBkeSk7CiAgICAgfQogCkBAIC00NTcsNiArNTA2LDcgQEAKICAgICAgKiBAcGFyYW0gc3JjIFRoZSBwYXRoIHRoYXQgaXMgYXBwZW5kZWQgdG8gdGhlIGN1cnJlbnQgcGF0aAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGFkZFBhdGgoUGF0aCBzcmMpIHsKKyAgICAgICAgaXNTaW1wbGVQYXRoID0gZmFsc2U7CiAgICAgICAgIG5hdGl2ZV9hZGRQYXRoKG1OYXRpdmVQYXRoLCBzcmMubU5hdGl2ZVBhdGgpOwogICAgIH0KIApAQCAtNDY2LDYgKzUxNiw3IEBACiAgICAgICogQHBhcmFtIHNyYyBUaGUgcGF0aCB0byBhZGQgYXMgYSBuZXcgY29udG91cgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGFkZFBhdGgoUGF0aCBzcmMsIE1hdHJpeCBtYXRyaXgpIHsKKyAgICAgICAgaWYgKCFzcmMuaXNTaW1wbGVQYXRoKSBpc1NpbXBsZVBhdGggPSBmYWxzZTsKICAgICAgICAgbmF0aXZlX2FkZFBhdGgobU5hdGl2ZVBhdGgsIHNyYy5tTmF0aXZlUGF0aCwgbWF0cml4Lm5hdGl2ZV9pbnN0YW5jZSk7CiAgICAgfQogCkBAIC01MDIsNiArNTUzLDcgQEAKICAgICAgKiBAcGFyYW0gZHkgVGhlIG5ldyBZIGNvb3JkaW5hdGUgZm9yIHRoZSBsYXN0IHBvaW50CiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0TGFzdFBvaW50KGZsb2F0IGR4LCBmbG9hdCBkeSkgeworICAgICAgICBpc1NpbXBsZVBhdGggPSBmYWxzZTsKICAgICAgICAgbmF0aXZlX3NldExhc3RQb2ludChtTmF0aXZlUGF0aCwgZHgsIGR5KTsKICAgICB9CiAKQEAgLTUzNyw4ICs1ODksOCBAQAogICAgICAgICAgICAgc3VwZXIuZmluYWxpemUoKTsKICAgICAgICAgfQogICAgIH0KLSAgICAKLSAgICAvKnBhY2thZ2UqLyBmaW5hbCBpbnQgbmkoKSB7CisKKyAgICBmaW5hbCBpbnQgbmkoKSB7CiAgICAgICAgIHJldHVybiBtTmF0aXZlUGF0aDsKICAgICB9CiAKQEAgLTU5Miw2ICs2NDQsNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRzdF9wYXRoKTsKICAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBuYXRpdmVfdHJhbnNmb3JtKGludCBuUGF0aCwgaW50IG1hdHJpeCk7CiAgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgZmluYWxpemVyKGludCBuUGF0aCk7Ci0KLSAgICBwcml2YXRlIGZpbmFsIGludCBtTmF0aXZlUGF0aDsKIH0KZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9Qb3J0ZXJEdWZmLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvUG9ydGVyRHVmZi5qYXZhCmluZGV4IDM5MDQyMzQuLjJlZjE2NjIgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9Qb3J0ZXJEdWZmLmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL1BvcnRlckR1ZmYuamF2YQpAQCAtNTMsMTEgKzUzLDE4IEBACiAgICAgICAgIC8qKiBbU2EgKiBEYSwgU2MgKiBEY10gKi8KICAgICAgICAgTVVMVElQTFkgICAgKDE0KSwKICAgICAgICAgLyoqIFtTYSArIERhIC0gU2EgKiBEYSwgU2MgKyBEYyAtIFNjICogRGNdICovCi0gICAgICAgIFNDUkVFTiAgICAgICgxNSk7CisgICAgICAgIFNDUkVFTiAgICAgICgxNSksCisgICAgICAgIC8qKiBTYXR1cmF0ZShTICsgRCkgKi8KKyAgICAgICAgQUREICAgICAgICAgKDE2KSwKKyAgICAgICAgT1ZFUkxBWSAgICAgKDE3KTsKIAogICAgICAgICBNb2RlKGludCBuYXRpdmVJbnQpIHsKICAgICAgICAgICAgIHRoaXMubmF0aXZlSW50ID0gbmF0aXZlSW50OwogICAgICAgICB9Ci0gICAgICAgIGZpbmFsIGludCBuYXRpdmVJbnQ7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBoaWRlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgZmluYWwgaW50IG5hdGl2ZUludDsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvUG9ydGVyRHVmZkNvbG9yRmlsdGVyLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvUG9ydGVyRHVmZkNvbG9yRmlsdGVyLmphdmEKaW5kZXggMDY3MjRiZC4uYjAyZGFiMSAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL1BvcnRlckR1ZmZDb2xvckZpbHRlci5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9Qb3J0ZXJEdWZmQ29sb3JGaWx0ZXIuamF2YQpAQCAtMjUsMTAgKzI1LDEwIEBACiAgICAgICogQHBhcmFtIG1vZGUgICAgICAgICAgIFRoZSBwb3J0ZXItZHVmZiBtb2RlIHRoYXQgaXMgYXBwbGllZAogICAgICAqLwogICAgIHB1YmxpYyBQb3J0ZXJEdWZmQ29sb3JGaWx0ZXIoaW50IHNyY0NvbG9yLCBQb3J0ZXJEdWZmLk1vZGUgbW9kZSkgewotICAgICAgICBuYXRpdmVfaW5zdGFuY2UgPSBuYXRpdmVfQ3JlYXRlUG9ydGVyRHVmZkZpbHRlcihzcmNDb2xvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZS5uYXRpdmVJbnQpOworICAgICAgICBuYXRpdmVfaW5zdGFuY2UgPSBuYXRpdmVfQ3JlYXRlUG9ydGVyRHVmZkZpbHRlcihzcmNDb2xvciwgbW9kZS5uYXRpdmVJbnQpOworICAgICAgICBuYXRpdmVDb2xvckZpbHRlciA9IG5DcmVhdGVQb3J0ZXJEdWZmRmlsdGVyKHNyY0NvbG9yLCBtb2RlLm5hdGl2ZUludCk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludCBuYXRpdmVfQ3JlYXRlUG9ydGVyRHVmZkZpbHRlcihpbnQgc3JjQ29sb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcG9ydGVyRHVmZk1vZGUpOworICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgbmF0aXZlX0NyZWF0ZVBvcnRlckR1ZmZGaWx0ZXIoaW50IHNyY0NvbG9yLCBpbnQgcG9ydGVyRHVmZk1vZGUpOworICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgbkNyZWF0ZVBvcnRlckR1ZmZGaWx0ZXIoaW50IHNyY0NvbG9yLCBpbnQgcG9ydGVyRHVmZk1vZGUpOwogfQpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL1BvcnRlckR1ZmZYZmVybW9kZS5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL1BvcnRlckR1ZmZYZmVybW9kZS5qYXZhCmluZGV4IGNiMTI3ZmQuLjZiYTA2NGMgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9Qb3J0ZXJEdWZmWGZlcm1vZGUuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvUG9ydGVyRHVmZlhmZXJtb2RlLmphdmEKQEAgLTE4LDExICsxOCwxNyBAQAogCiBwdWJsaWMgY2xhc3MgUG9ydGVyRHVmZlhmZXJtb2RlIGV4dGVuZHMgWGZlcm1vZGUgewogICAgIC8qKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGZpbmFsIFBvcnRlckR1ZmYuTW9kZSBtb2RlOworCisgICAgLyoqCiAgICAgICogQ3JlYXRlIGFuIHhmZXJtb2RlIHRoYXQgdXNlcyB0aGUgc3BlY2lmaWVkIHBvcnRlci1kdWZmIG1vZGUuCiAgICAgICoKICAgICAgKiBAcGFyYW0gbW9kZSAgICAgICAgICAgVGhlIHBvcnRlci1kdWZmIG1vZGUgdGhhdCBpcyBhcHBsaWVkCiAgICAgICovCiAgICAgcHVibGljIFBvcnRlckR1ZmZYZmVybW9kZShQb3J0ZXJEdWZmLk1vZGUgbW9kZSkgeworICAgICAgICB0aGlzLm1vZGUgPSBtb2RlOwogICAgICAgICBuYXRpdmVfaW5zdGFuY2UgPSBuYXRpdmVDcmVhdGVYZmVybW9kZShtb2RlLm5hdGl2ZUludCk7CiAgICAgfQogICAgIApkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL1JlZ2lvbi5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL1JlZ2lvbi5qYXZhCmluZGV4IDJiMDgwYWEuLmU1NDA4MDYgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9SZWdpb24uamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvUmVnaW9uLmphdmEKQEAgLTIwLDYgKzIwLDEwIEBACiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxhYmxlOwogCiBwdWJsaWMgY2xhc3MgUmVnaW9uIGltcGxlbWVudHMgUGFyY2VsYWJsZSB7CisgICAgLyoqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgaW50IG1OYXRpdmVSZWdpb247CiAKICAgICAvLyB0aGUgbmF0aXZlIHZhbHVlcyBmb3IgdGhlc2UgbXVzdCBtYXRjaCB1cCB3aXRoIHRoZSBlbnVtIGluIFNrUmVnaW9uLmgKICAgICBwdWJsaWMgZW51bSBPcCB7CkBAIC0zMyw3ICszNywxMSBAQAogICAgICAgICBPcChpbnQgbmF0aXZlSW50KSB7CiAgICAgICAgICAgICB0aGlzLm5hdGl2ZUludCA9IG5hdGl2ZUludDsKICAgICAgICAgfQotICAgICAgICBmaW5hbCBpbnQgbmF0aXZlSW50OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAaGlkZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGZpbmFsIGludCBuYXRpdmVJbnQ7CiAgICAgfQogCiAgICAgLyoqIENyZWF0ZSBhbiBlbXB0eSByZWdpb24KQEAgLTMyNSwxMCArMzMzLDE0IEBACiAgICAgfQogCiAgICAgcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgbmF0aXZlRGVzdHJ1Y3RvcihtTmF0aXZlUmVnaW9uKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5hdGl2ZURlc3RydWN0b3IobU5hdGl2ZVJlZ2lvbik7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBzdXBlci5maW5hbGl6ZSgpOworICAgICAgICB9CiAgICAgfQogICAgIAotICAgIC8qcGFja2FnZSovIFJlZ2lvbihpbnQgbmkpIHsKKyAgICBSZWdpb24oaW50IG5pKSB7CiAgICAgICAgIGlmIChuaSA9PSAwKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOwogICAgICAgICB9CkBAIC0zNDEsNyArMzUzLDcgQEAKICAgICAgICAgdGhpcyhuaSk7CiAgICAgfQogCi0gICAgLypwYWNrYWdlKi8gZmluYWwgaW50IG5pKCkgeworICAgIGZpbmFsIGludCBuaSgpIHsKICAgICAgICAgcmV0dXJuIG1OYXRpdmVSZWdpb247CiAgICAgfQogCkBAIC0zNzAsNiArMzgyLDQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmNlbCBwKTsKIAogICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBib29sZWFuIG5hdGl2ZUVxdWFscyhpbnQgbmF0aXZlX3IxLCBpbnQgbmF0aXZlX3IyKTsKLQotICAgIHByaXZhdGUgZmluYWwgaW50IG1OYXRpdmVSZWdpb247CiB9CmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvU2hhZGVyLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvU2hhZGVyLmphdmEKaW5kZXggYWUwMzA0ZS4uYjM5NzY2MiAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL1NoYWRlci5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9TaGFkZXIuamF2YQpAQCAtMjMsOSArMjMsMTYgQEAKICAqIGRyYXduIHdpdGggdGhhdCBwYWludCB3aWxsIGdldCBpdHMgY29sb3IocykgZnJvbSB0aGUgc2hhZGVyLgogICovCiBwdWJsaWMgY2xhc3MgU2hhZGVyIHsKLQotICAgIC8vIHRoaXMgaXMgc2V0IGJ5IHN1YmNsYXNzZXMsIGJ1dCBkb24ndCBtYWtlIGl0IHB1YmxpYwotICAgIC8qIHBhY2thZ2UgKi8gaW50IG5hdGl2ZV9pbnN0YW5jZTsKKyAgICAvKioKKyAgICAgKiBUaGlzIGlzIHNldCBieSBzdWJjbGFzc2VzLCBidXQgZG9uJ3QgbWFrZSBpdCBwdWJsaWMuCisgICAgICogCisgICAgICogQGhpZGUgCisgICAgICovCisgICAgcHVibGljIGludCBuYXRpdmVfaW5zdGFuY2U7CisgICAgLyoqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IG5hdGl2ZV9zaGFkZXI7CiAKICAgICBwdWJsaWMgZW51bSBUaWxlTW9kZSB7CiAgICAgICAgIC8qKgpAQCAtNjQsMTcgKzcxLDIwIEBACiAgICAgICogQHBhcmFtIGxvY2FsTSBUaGUgc2hhZGVyJ3MgbmV3IGxvY2FsIG1hdHJpeCwgb3IgbnVsbCB0byBzcGVjaWZ5IGlkZW50aXR5CiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0TG9jYWxNYXRyaXgoTWF0cml4IGxvY2FsTSkgewotICAgICAgICBuYXRpdmVTZXRMb2NhbE1hdHJpeChuYXRpdmVfaW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsTSAhPSBudWxsID8gbG9jYWxNLm5hdGl2ZV9pbnN0YW5jZSA6IDApOworICAgICAgICBuYXRpdmVTZXRMb2NhbE1hdHJpeChuYXRpdmVfaW5zdGFuY2UsIG5hdGl2ZV9zaGFkZXIsIGxvY2FsTS5uYXRpdmVfaW5zdGFuY2UpOwogICAgIH0KIAogICAgIHByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIG5hdGl2ZURlc3RydWN0b3IobmF0aXZlX2luc3RhbmNlKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN1cGVyLmZpbmFsaXplKCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBuYXRpdmVEZXN0cnVjdG9yKG5hdGl2ZV9pbnN0YW5jZSwgbmF0aXZlX3NoYWRlcik7CisgICAgICAgIH0KICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBuYXRpdmVEZXN0cnVjdG9yKGludCBuYXRpdmVfc2hhZGVyKTsKKyAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBuYXRpdmVEZXN0cnVjdG9yKGludCBuYXRpdmVfc2hhZGVyLCBpbnQgbmF0aXZlX3NraWFTaGFkZXIpOwogICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBib29sZWFuIG5hdGl2ZUdldExvY2FsTWF0cml4KGludCBuYXRpdmVfc2hhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXRyaXhfaW5zdGFuY2UpOworICAgICAgICAgICAgaW50IG1hdHJpeF9pbnN0YW5jZSk7IAogICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZVNldExvY2FsTWF0cml4KGludCBuYXRpdmVfc2hhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXRyaXhfaW5zdGFuY2UpOworICAgICAgICAgICAgaW50IG5hdGl2ZV9za2lhU2hhZGVyLCBpbnQgbWF0cml4X2luc3RhbmNlKTsKIH0KZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9UZW1wb3JhcnlCdWZmZXIuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9UZW1wb3JhcnlCdWZmZXIuamF2YQppbmRleCAxZDdmZTAxLi5jNWI4MTQzIDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvVGVtcG9yYXJ5QnVmZmVyLmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL1RlbXBvcmFyeUJ1ZmZlci5qYXZhCkBAIC0xOCw5ICsxOCwxMSBAQAogCiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudXRpbC5BcnJheVV0aWxzOwogCi0vKiBwYWNrYWdlICovIGNsYXNzIFRlbXBvcmFyeUJ1ZmZlcgotewotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGNoYXJbXSBvYnRhaW4oaW50IGxlbikgeworLyoqCisgKiBAaGlkZQorICovCitwdWJsaWMgY2xhc3MgVGVtcG9yYXJ5QnVmZmVyIHsKKyAgICBwdWJsaWMgc3RhdGljIGNoYXJbXSBvYnRhaW4oaW50IGxlbikgewogICAgICAgICBjaGFyW10gYnVmOwogCiAgICAgICAgIHN5bmNocm9uaXplZCAoVGVtcG9yYXJ5QnVmZmVyLmNsYXNzKSB7CkBAIC0yOCwxNSArMzAsMTUgQEAKICAgICAgICAgICAgIHNUZW1wID0gbnVsbDsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChidWYgPT0gbnVsbCB8fCBidWYubGVuZ3RoIDwgbGVuKQorICAgICAgICBpZiAoYnVmID09IG51bGwgfHwgYnVmLmxlbmd0aCA8IGxlbikgewogICAgICAgICAgICAgYnVmID0gbmV3IGNoYXJbQXJyYXlVdGlscy5pZGVhbENoYXJBcnJheVNpemUobGVuKV07CisgICAgICAgIH0KIAogICAgICAgICByZXR1cm4gYnVmOwogICAgIH0KIAotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIHZvaWQgcmVjeWNsZShjaGFyW10gdGVtcCkgewotICAgICAgICBpZiAodGVtcC5sZW5ndGggPiAxMDAwKQotICAgICAgICAgICAgcmV0dXJuOworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZWN5Y2xlKGNoYXJbXSB0ZW1wKSB7CisgICAgICAgIGlmICh0ZW1wLmxlbmd0aCA+IDEwMDApIHJldHVybjsKIAogICAgICAgICBzeW5jaHJvbml6ZWQgKFRlbXBvcmFyeUJ1ZmZlci5jbGFzcykgewogICAgICAgICAgICAgc1RlbXAgPSB0ZW1wOwpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL1hmZXJtb2RlLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvWGZlcm1vZGUuamF2YQppbmRleCA0MmM0MTBlLi4yNDY3YmRjIDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvWGZlcm1vZGUuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvWGZlcm1vZGUuamF2YQpAQCAtMzEsNyArMzEsMTEgQEAKIHB1YmxpYyBjbGFzcyBYZmVybW9kZSB7CiAKICAgICBwcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICBmaW5hbGl6ZXIobmF0aXZlX2luc3RhbmNlKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZpbmFsaXplcihuYXRpdmVfaW5zdGFuY2UpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgc3VwZXIuZmluYWxpemUoKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIGZpbmFsaXplcihpbnQgbmF0aXZlX2luc3RhbmNlKTsKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9EcmF3YWJsZS5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL0RyYXdhYmxlLmphdmEKaW5kZXggMzEyNTMyMS4uN2IyZDlkNyAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL0RyYXdhYmxlLmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL0RyYXdhYmxlLmphdmEKQEAgLTE2LDIxICsxNiwzMCBAQAogCiBwYWNrYWdlIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGU7CiAKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQogaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXI7CiBpbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjsKIAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheTsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLio7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXBGYWN0b3J5OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ29sb3JGaWx0ZXI7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5OaW5lUGF0Y2g7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QaXhlbEZvcm1hdDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBvcnRlckR1ZmY7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmQ29sb3JGaWx0ZXI7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVnaW9uOwogaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkRpc3BsYXlNZXRyaWNzOwogaW1wb3J0IGFuZHJvaWQudXRpbC5TdGF0ZVNldDsKLWltcG9ydCBhbmRyb2lkLnV0aWwuWG1sOwogaW1wb3J0IGFuZHJvaWQudXRpbC5UeXBlZFZhbHVlOworaW1wb3J0IGFuZHJvaWQudXRpbC5YbWw7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIAogLyoqCiAgKiBBIERyYXdhYmxlIGlzIGEgZ2VuZXJhbCBhYnN0cmFjdGlvbiBmb3IgInNvbWV0aGluZyB0aGF0IGNhbiBiZSBkcmF3bi4iICBNb3N0CkBAIC02NDUsNiArNjU0LDggQEAKICAgICAgKiBDYWxsaW5nIHRoaXMgbWV0aG9kIG9uIGEgbXV0YWJsZSBEcmF3YWJsZSB3aWxsIGhhdmUgbm8gZWZmZWN0LgogICAgICAqCiAgICAgICogQHJldHVybiBUaGlzIGRyYXdhYmxlLgorICAgICAqIEBzZWUgQ29uc3RhbnRTdGF0ZQorICAgICAqIEBzZWUgI2dldENvbnN0YW50U3RhdGUoKQogICAgICAqLwogICAgIHB1YmxpYyBEcmF3YWJsZSBtdXRhdGUoKSB7CiAgICAgICAgIHJldHVybiB0aGlzOwpAQCAtNzQ5LDYgKzc2MCw4IEBACiAgICAgICAgICAgICBkcmF3YWJsZSA9IG5ldyBTdGF0ZUxpc3REcmF3YWJsZSgpOwogICAgICAgICB9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKCJsZXZlbC1saXN0IikpIHsKICAgICAgICAgICAgIGRyYXdhYmxlID0gbmV3IExldmVsTGlzdERyYXdhYmxlKCk7CisgICAgICAgIH0gZWxzZSBpZiAobmFtZS5lcXVhbHMoIm1pcG1hcCIpKSB7CisgICAgICAgICAgICBkcmF3YWJsZSA9IG5ldyBNaXBtYXBEcmF3YWJsZSgpOwogICAgICAgICB9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKCJsYXllci1saXN0IikpIHsKICAgICAgICAgICAgIGRyYXdhYmxlID0gbmV3IExheWVyRHJhd2FibGUoKTsKICAgICAgICAgfSBlbHNlIGlmIChuYW1lLmVxdWFscygidHJhbnNpdGlvbiIpKSB7CkBAIC03NzAsNyArNzgzLDcgQEAKICAgICAgICAgfSBlbHNlIGlmIChuYW1lLmVxdWFscygiaW5zZXQiKSkgewogICAgICAgICAgICAgZHJhd2FibGUgPSBuZXcgSW5zZXREcmF3YWJsZSgpOwogICAgICAgICB9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKCJiaXRtYXAiKSkgewotICAgICAgICAgICAgZHJhd2FibGUgPSBuZXcgQml0bWFwRHJhd2FibGUoKTsKKyAgICAgICAgICAgIGRyYXdhYmxlID0gbmV3IEJpdG1hcERyYXdhYmxlKHIpOwogICAgICAgICAgICAgaWYgKHIgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgKChCaXRtYXBEcmF3YWJsZSkgZHJhd2FibGUpLnNldFRhcmdldERlbnNpdHkoci5nZXREaXNwbGF5TWV0cmljcygpKTsKICAgICAgICAgICAgIH0KQEAgLTgwNSw2ICs4MTgsOSBAQAogICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBJbmZsYXRlIHRoaXMgRHJhd2FibGUgZnJvbSBhbiBYTUwgcmVzb3VyY2UuCisgICAgICovCiAgICAgcHVibGljIHZvaWQgaW5mbGF0ZShSZXNvdXJjZXMgciwgWG1sUHVsbFBhcnNlciBwYXJzZXIsIEF0dHJpYnV0ZVNldCBhdHRycykKICAgICAgICAgICAgIHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAKQEAgLTgxMyw2ICs4MjksMTIgQEAKICAgICAgICAgYS5yZWN5Y2xlKCk7CiAgICAgfQogCisgICAgLyoqCisgICAgICogSW5mbGF0ZSBhIERyYXdhYmxlIGZyb20gYW4gWE1MIHJlc291cmNlLgorICAgICAqCisgICAgICogQHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqLwogICAgIHZvaWQgaW5mbGF0ZVdpdGhBdHRyaWJ1dGVzKFJlc291cmNlcyByLCBYbWxQdWxsUGFyc2VyIHBhcnNlciwKICAgICAgICAgICAgIFR5cGVkQXJyYXkgYXR0cnMsIGludCB2aXNpYmxlQXR0cikKICAgICAgICAgICAgIHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CkBAIC04MjAsMTIgKzg0MiwyNyBAQAogICAgICAgICBtVmlzaWJsZSA9IGF0dHJzLmdldEJvb2xlYW4odmlzaWJsZUF0dHIsIG1WaXNpYmxlKTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBUaGlzIGFic3RyYWN0IGNsYXNzIGlzIHVzZWQgYnkge0BsaW5rIERyYXdhYmxlfXMgdG8gc3RvcmUgc2hhcmVkIGNvbnN0YW50IHN0YXRlIGFuZCBkYXRhCisgICAgICogYmV0d2VlbiBEcmF3YWJsZXMuIHtAbGluayBCaXRtYXBEcmF3YWJsZX1zIGNyZWF0ZWQgZnJvbSB0aGUgc2FtZSByZXNvdXJjZSB3aWxsIGZvciBpbnN0YW5jZQorICAgICAqIHNoYXJlIGEgdW5pcXVlIGJpdG1hcCBzdG9yZWQgaW4gdGhlaXIgQ29uc3RhbnRTdGF0ZS4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIHtAbGluayAjbmV3RHJhd2FibGUoUmVzb3VyY2VzKX0gY2FuIGJlIHVzZWQgYXMgYSBmYWN0b3J5IHRvIGNyZWF0ZSBuZXcgRHJhd2FibGUgaW5zdGFuY2VzCisgICAgICogZnJvbSB0aGlzIENvbnN0YW50U3RhdGUuCisgICAgICogPC9wPgorICAgICAqCisgICAgICogVXNlIHtAbGluayBEcmF3YWJsZSNnZXRDb25zdGFudFN0YXRlKCl9IHRvIHJldHJpZXZlIHRoZSBDb25zdGFudFN0YXRlIG9mIGEgRHJhd2FibGUuIENhbGxpbmcKKyAgICAgKiB7QGxpbmsgRHJhd2FibGUjbXV0YXRlKCl9IG9uIGEgRHJhd2FibGUgc2hvdWxkIHR5cGljYWxseSBjcmVhdGUgYSBuZXcgQ29uc3RhbnRTdGF0ZSBmb3IgdGhhdAorICAgICAqIERyYXdhYmxlLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgQ29uc3RhbnRTdGF0ZSB7CiAgICAgICAgIC8qKgogICAgICAgICAgKiBDcmVhdGUgYSBuZXcgZHJhd2FibGUgd2l0aG91dCBzdXBwbHlpbmcgcmVzb3VyY2VzIHRoZSBjYWxsZXIKICAgICAgICAgICogaXMgcnVubmluZyBpbi4gIE5vdGUgdGhhdCB1c2luZyB0aGlzIG1lYW5zIHRoZSBkZW5zaXR5LWRlcGVuZGVudAogICAgICAgICAgKiBkcmF3YWJsZXMgKGxpa2UgYml0bWFwcykgd2lsbCBub3QgYmUgYWJsZSB0byB1cGRhdGUgdGhlaXIgdGFyZ2V0Ci0gICAgICAgICAqIGRlbnNpdHkgY29ycmVjdGx5LgorICAgICAgICAgKiBkZW5zaXR5IGNvcnJlY3RseS4gT25lIHNob3VsZCB1c2Uge0BsaW5rICNuZXdEcmF3YWJsZShSZXNvdXJjZXMpfQorICAgICAgICAgKiBpbnN0ZWFkIHRvIHByb3ZpZGUgYSByZXNvdXJjZS4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBEcmF3YWJsZSBuZXdEcmF3YWJsZSgpOwogICAgICAgICAvKioKQEAgLTg0NCw2ICs4ODEsMTMgQEAKICAgICAgICAgcHVibGljIGFic3RyYWN0IGludCBnZXRDaGFuZ2luZ0NvbmZpZ3VyYXRpb25zKCk7CiAgICAgfQogCisgICAgLyoqCisgICAgICogUmV0dXJuIGEge0BsaW5rIENvbnN0YW50U3RhdGV9IGluc3RhbmNlIHRoYXQgaG9sZHMgdGhlIHNoYXJlZCBzdGF0ZSBvZiB0aGlzIERyYXdhYmxlLgorICAgICAqcQorICAgICAqIEByZXR1cm4gVGhlIENvbnN0YW50U3RhdGUgYXNzb2NpYXRlZCB0byB0aGF0IERyYXdhYmxlLgorICAgICAqIEBzZWUgQ29uc3RhbnRTdGF0ZQorICAgICAqIEBzZWUgRHJhd2FibGUjbXV0YXRlKCkKKyAgICAgKi8KICAgICBwdWJsaWMgQ29uc3RhbnRTdGF0ZSBnZXRDb25zdGFudFN0YXRlKCkgewogICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvRHJhd2FibGVDb250YWluZXIuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9EcmF3YWJsZUNvbnRhaW5lci5qYXZhCmluZGV4IGM2ZjU3ZDQuLjEyNGQ5MDcgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9EcmF3YWJsZUNvbnRhaW5lci5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9EcmF3YWJsZUNvbnRhaW5lci5qYXZhCkBAIC0xNyw4ICsxNywxNiBAQAogcGFja2FnZSBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlOwogCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy4qOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ29sb3JGaWx0ZXI7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QaXhlbEZvcm1hdDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7CiAKKy8qKgorICogQSBoZWxwZXIgY2xhc3MgdGhhdCBjb250YWlucyBzZXZlcmFsIHtAbGluayBEcmF3YWJsZX1zIGFuZCBzZWxlY3RzIHdoaWNoIG9uZSB0byB1c2UuCisgKgorICogWW91IGNhbiBzdWJjbGFzcyBpdCB0byBjcmVhdGUgeW91ciBvd24gRHJhd2FibGVDb250YWluZXJzIG9yIGRpcmVjdGx5IHVzZSBvbmUgaXRzIGNoaWxkIGNsYXNzZXMuCisgKi8KIHB1YmxpYyBjbGFzcyBEcmF3YWJsZUNvbnRhaW5lciBleHRlbmRzIERyYXdhYmxlIGltcGxlbWVudHMgRHJhd2FibGUuQ2FsbGJhY2sgewogCiAgICAgLyoqCkBAIC0xOTYsOCArMjA0LDcgQEAKICAgICAgICAgICAgICAgICBtRHJhd2FibGVDb250YWluZXJTdGF0ZS5nZXRPcGFjaXR5KCk7CiAgICAgfQogCi0gICAgcHVibGljIGJvb2xlYW4gc2VsZWN0RHJhd2FibGUoaW50IGlkeCkKLSAgICB7CisgICAgcHVibGljIGJvb2xlYW4gc2VsZWN0RHJhd2FibGUoaW50IGlkeCkgewogICAgICAgICBpZiAoaWR4ID09IG1DdXJJbmRleCkgewogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CkBAIC0yNTUsNiArMjYyLDEyIEBACiAgICAgICAgIHJldHVybiB0aGlzOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIEEgQ29uc3RhbnRTdGF0ZSB0aGF0IGNhbiBjb250YWluIHNldmVyYWwge0BsaW5rIERyYXdhYmxlfXMuCisgICAgICoKKyAgICAgKiBUaGlzIGNsYXNzIHdhcyBtYWRlIHB1YmxpYyB0byBlbmFibGUgdGVzdGluZywgYW5kIGl0cyB2aXNpYmlsaXR5IG1heSBjaGFuZ2UgaW4gYSBmdXR1cmUKKyAgICAgKiByZWxlYXNlLgorICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBzdGF0aWMgY2xhc3MgRHJhd2FibGVDb250YWluZXJTdGF0ZSBleHRlbmRzIENvbnN0YW50U3RhdGUgewogICAgICAgICBmaW5hbCBEcmF3YWJsZUNvbnRhaW5lciBtT3duZXI7CiAKQEAgLTQ0MywxMiArNDU2LDEyIEBACiAgICAgICAgICAgICByZXR1cm4gbUNvbnN0YW50TWluaW11bUhlaWdodDsKICAgICAgICAgfQogCi0gICAgICAgIHByaXZhdGUgdm9pZCBjb21wdXRlQ29uc3RhbnRTaXplKCkgeworICAgICAgICBwcm90ZWN0ZWQgdm9pZCBjb21wdXRlQ29uc3RhbnRTaXplKCkgewogICAgICAgICAgICAgbUNvbXB1dGVkQ29uc3RhbnRTaXplID0gdHJ1ZTsKIAogICAgICAgICAgICAgZmluYWwgaW50IE4gPSBnZXRDaGlsZENvdW50KCk7CiAgICAgICAgICAgICBmaW5hbCBEcmF3YWJsZVtdIGRyYXdhYmxlcyA9IG1EcmF3YWJsZXM7Ci0gICAgICAgICAgICBtQ29uc3RhbnRXaWR0aCA9IG1Db25zdGFudEhlaWdodCA9IDA7CisgICAgICAgICAgICBtQ29uc3RhbnRXaWR0aCA9IG1Db25zdGFudEhlaWdodCA9IC0xOwogICAgICAgICAgICAgbUNvbnN0YW50TWluaW11bVdpZHRoID0gbUNvbnN0YW50TWluaW11bUhlaWdodCA9IDA7CiAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE47IGkrKykgewogICAgICAgICAgICAgICAgIERyYXdhYmxlIGRyID0gZHJhd2FibGVzW2ldOwpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL0dyYWRpZW50RHJhd2FibGUuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9HcmFkaWVudERyYXdhYmxlLmphdmEKaW5kZXggMzNlY2JlYS4uODhmNmQ0MyAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL0dyYWRpZW50RHJhd2FibGUuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvR3JhZGllbnREcmF3YWJsZS5qYXZhCkBAIC0zMTMsMTggKzMxMywxNiBAQAogICAgICAgICAgICAgY2FzZSBSRUNUQU5HTEU6CiAgICAgICAgICAgICAgICAgaWYgKHN0Lm1SYWRpdXNBcnJheSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgIG1QYXRoLnJlc2V0KCk7Ci0gICAgICAgICAgICAgICAgICAgIG1QYXRoLmFkZFJvdW5kUmVjdChtUmVjdCwgc3QubVJhZGl1c0FycmF5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGF0aC5EaXJlY3Rpb24uQ1cpOworICAgICAgICAgICAgICAgICAgICBtUGF0aC5hZGRSb3VuZFJlY3QobVJlY3QsIHN0Lm1SYWRpdXNBcnJheSwgUGF0aC5EaXJlY3Rpb24uQ1cpOwogICAgICAgICAgICAgICAgICAgICBjYW52YXMuZHJhd1BhdGgobVBhdGgsIG1GaWxsUGFpbnQpOwogICAgICAgICAgICAgICAgICAgICBpZiAoaGF2ZVN0cm9rZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgY2FudmFzLmRyYXdQYXRoKG1QYXRoLCBtU3Ryb2tlUGFpbnQpOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3QubVJhZGl1cyA+IDAuMGYpIHsKICAgICAgICAgICAgICAgICAgICAgLy8gc2luY2UgdGhlIGNhbGxlciBpcyBvbmx5IGdpdmluZyB1cyAxIHZhbHVlLCB3ZSB3aWxsIGZvcmNlCiAgICAgICAgICAgICAgICAgICAgIC8vIGl0IHRvIGJlIHNxdWFyZSBpZiB0aGUgcmVjdCBpcyB0b28gc21hbGwgaW4gb25lIGRpbWVuc2lvbgogICAgICAgICAgICAgICAgICAgICAvLyB0byBzaG93IGl0LiBJZiB3ZSBkaWQgbm90aGluZywgU2tpYSB3b3VsZCBjbGFtcCB0aGUgcmFkCi0gICAgICAgICAgICAgICAgICAgIC8vIGluZGVwZW5kZW50bHkgYWxvbmcgZWFjaCBheGlzLCBnaXZpbmcgdXMgYSB0aGluIGVsbGlwcworICAgICAgICAgICAgICAgICAgICAvLyBpbmRlcGVuZGVudGx5IGFsb25nIGVhY2ggYXhpcywgZ2l2aW5nIHVzIGEgdGhpbiBlbGxpcHNlCiAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSByZWN0IHdlcmUgdmVyeSB3aWRlIGJ1dCBub3QgdmVyeSB0YWxsCiAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHJhZCA9IHN0Lm1SYWRpdXM7CiAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHIgPSBNYXRoLm1pbihtUmVjdC53aWR0aCgpLCBtUmVjdC5oZWlnaHQoKSkgKiAwLjVmOwpAQCAtMzM1LDYgKzMzMywxMSBAQAogICAgICAgICAgICAgICAgICAgICBpZiAoaGF2ZVN0cm9rZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgY2FudmFzLmRyYXdSb3VuZFJlY3QobVJlY3QsIHJhZCwgcmFkLCBtU3Ryb2tlUGFpbnQpOwogICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KG1SZWN0LCBtRmlsbFBhaW50KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGhhdmVTdHJva2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdChtUmVjdCwgbVN0cm9rZVBhaW50KTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgT1ZBTDoKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9MYXllckRyYXdhYmxlLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvTGF5ZXJEcmF3YWJsZS5qYXZhCmluZGV4IDgwNDdkZDQuLjUwMWNjYTkgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9MYXllckRyYXdhYmxlLmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL0xheWVyRHJhd2FibGUuamF2YQpAQCAtMjY2LDYgKzI2Niw3IEBACiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gc2V0RHJhd2FibGVCeUxheWVySWQoaW50IGlkLCBEcmF3YWJsZSBkcmF3YWJsZSkgewogICAgICAgICBmaW5hbCBDaGlsZERyYXdhYmxlW10gbGF5ZXJzID0gbUxheWVyU3RhdGUubUNoaWxkcmVuOworICAgICAgICBkcmF3YWJsZS5zZXRDYWxsYmFjayh0aGlzKTsKICAgICAgICAgCiAgICAgICAgIGZvciAoaW50IGkgPSBtTGF5ZXJTdGF0ZS5tTnVtIC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgICAgICAgIGlmIChsYXllcnNbaV0ubUlkID09IGlkKSB7CmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvTWlwbWFwRHJhd2FibGUuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9NaXBtYXBEcmF3YWJsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1ZmRlZWQKLS0tIC9kZXYvbnVsbAorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvTWlwbWFwRHJhd2FibGUuamF2YQpAQCAtMCwwICsxLDMwOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZTsKKworaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXI7CitpbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7CitpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKKy8qKgorICogQSByZXNvdXJjZSB0aGF0IG1hbmFnZXMgYSBudW1iZXIgb2YgYWx0ZXJuYXRlIERyYXdhYmxlcywgYW5kIHdoaWNoIGFjdHVhbGx5IGRyYXdzIHRoZSBvbmUgd2hpY2gKKyAqIHNpemUgbWF0Y2hlcyB0aGUgbW9zdCBjbG9zZWx5IHRoZSBkcmF3aW5nIGJvdW5kcy4gUHJvdmlkaW5nIHNldmVyYWwgcHJlLXNjYWxlZCB2ZXJzaW9uIG9mIHRoZQorICogZHJhd2FibGUgaGVscHMgbWluaW1pemluZyB0aGUgYWxpYXNpbmcgYXJ0aWZhY3RzIHRoYXQgY2FuIGJlIGludHJvZHVjZWQgYnkgdGhlIHNjYWxpbmcuCisgKgorICogPHA+CisgKiBVc2Uge0BsaW5rICNhZGREcmF3YWJsZShEcmF3YWJsZSl9IHRvIGRlZmluZSB0aGUgZGlmZmVyZW50IERyYXdhYmxlcyB0aGF0IHdpbGwgcmVwcmVzZW50IHRoZQorICogbWlwbWFwIGxldmVscyBvZiB0aGlzIE1pcG1hcERyYXdhYmxlLiBUaGUgbWlwbWFwIERyYXdhYmxlIHRoYXQgd2lsbCBhY3R1YWxseSBiZSB1c2VkIHdoZW4gdGhpcworICogTWlwbWFwRHJhd2FibGUgaXMgZHJhd24gaXMgdGhlIG9uZSB3aGljaCBoYXMgdGhlIHNtYWxsZXN0IGludHJpbnNpYyBoZWlnaHQgZ3JlYXRlciBvciBlcXVhbCB0aGFuCisgKiB0aGUgYm91bmRzJyBoZWlnaHQuIFRoaXMgc2VsZWN0aW9uIGVuc3VyZXMgdGhhdCB0aGUgYmVzdCBhdmFpbGFibGUgbWlwbWFwIGxldmVsIGlzIHNjYWxlZCBkb3duIHRvCisgKiBkcmF3IHRoaXMgTWlwbWFwRHJhd2FibGUuCisgKiA8L3A+CisgKgorICogSWYgdGhlIGJvdW5kcycgaGVpZ2h0IGlzIGxhcmdlciB0aGFuIHRoZSBsYXJnZXN0IG1pcG1hcCwgdGhlIGxhcmdlc3QgbWlwbWFwIHdpbGwgYmUgc2NhbGVkIHVwLgorICogTm90ZSB0aGF0IERyYXdhYmxlcyB3aXRob3V0IGludHJpbnNpYyBoZWlnaHQgKGkuZS4gd2l0aCBhIG5lZ2F0aXZlIHZhbHVlLCBzdWNoIGFzIENvbG9yKSB3aWxsCisgKiBvbmx5IGJlIHVzZWQgaWYgbm8gb3RoZXIgbWlwbWFwIERyYXdhYmxlIGFyZSBwcm92aWRlZC4gVGhlIERyYXdhYmxlcycgaW50cmluc2ljIGhlaWdodHMgc2hvdWxkCisgKiBub3QgYmUgY2hhbmdlZCBhZnRlciB0aGUgRHJhd2FibGUgaGFzIGJlZW4gYWRkZWQgdG8gdGhpcyBNaXBtYXBEcmF3YWJsZS4KKyAqCisgKiA8cD4KKyAqIFRoZSBkaWZmZXJlbnQgbWlwbWFwcycgcGFyYW1ldGVycyAob3BhY2l0eSwgcGFkZGluZywgY29sb3IgZmlsdGVyLCBncmF2aXR5Li4uKSBzaG91bGQgdHlwaWNhbGx5CisgKiBiZSBzaW1pbGFyIHRvIGVuc3VyZSBhIGNvbnRpbnVvdXMgdmlzdWFsIGFwcGVhcmFuY2Ugd2hlbiB0aGUgTWlwbWFwRHJhd2FibGUgaXMgc2NhbGVkLiBUaGUgYXNwZWN0CisgKiByYXRpbyBvZiB0aGUgZGlmZmVyZW50IG1pcG1hcHMgc2hvdWxkIGVzcGVjaWFsbHkgYmUgZXF1YWwuCisgKiA8L3A+CisgKgorICogQSB0eXBpY2FsIGV4YW1wbGUgdXNlIG9mIGEgTWlwbWFwRHJhd2FibGUgd291bGQgYmUgZm9yIGFuIGltYWdlIHdoaWNoIGlzIGludGVuZGVkIHRvIGJlIHNjYWxlZCBhdAorICogdmFyaW91cyBzaXplcywgYW5kIGZvciB3aGljaCBvbmUgd2FudHMgdG8gcHJvdmlkZSBwcmUtc2NhbGVkIHZlcnNpb25zIHRvIHByZWNpc2VseSBjb250cm9sIGl0cworICogYXBwZWFyYW5jZS4KKyAqCisgKiA8cD4KKyAqIFRoZSBpbnRyaW5zaWMgc2l6ZSBvZiBhIE1pcG1hcERyYXdhYmxlIGFyZSBpbmZlcnJlZCBmcm9tIHRob3NlIG9mIHRoZSBsYXJnZXN0IG1pcG1hcCAoaW4gdGVybXMgb2YKKyAqIHtAbGluayBEcmF3YWJsZSNnZXRJbnRyaW5zaWNIZWlnaHQoKX0pLiBPbiB0aGUgb3Bwb3NpdGUsIGl0cyBtaW5pbXVtCisgKiBzaXplIGlzIGRlZmluZWQgYnkgdGhlIHNtYWxsZXN0IHByb3ZpZGVkIG1pcG1hcC4KKyAqIDwvcD4KKworICogSXQgY2FuIGJlIGRlZmluZWQgaW4gYW4gWE1MIGZpbGUgd2l0aCB0aGUgPGNvZGU+Jmx0O21pcG1hcD48L2NvZGU+IGVsZW1lbnQuCisgKiBFYWNoIG1pcG1hcCBEcmF3YWJsZSBpcyBkZWZpbmVkIGluIGEgbmVzdGVkIDxjb2RlPiZsdDtpdGVtPjwvY29kZT4uIEZvciBleGFtcGxlOgorICogPHByZT4KKyAqICZsdDttaXBtYXAgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAqICAmbHQ7aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvbXlfaW1hZ2VfOCIgLz4KKyAqICAmbHQ7aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvbXlfaW1hZ2VfMzIiIC8+CisgKiAgJmx0O2l0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL215X2ltYWdlXzEyOCIgLz4KKyAqICZsdDsvbWlwbWFwPgorICo8L3ByZT4KKyAqIDxwPgorICogV2l0aCB0aGlzIFhNTCBzYXZlZCBpbnRvIHRoZSByZXMvZHJhd2FibGUvIGZvbGRlciBvZiB0aGUgcHJvamVjdCwgaXQgY2FuIGJlIHJlZmVyZW5jZWQgYXMKKyAqIHRoZSBkcmF3YWJsZSBmb3IgYW4ge0BsaW5rIGFuZHJvaWQud2lkZ2V0LkltYWdlVmlld30uIEFzc3VtaW5nIHRoYXQgdGhlIGhlaWdodHMgb2YgdGhlIHByb3ZpZGVkCisgKiBkcmF3YWJsZXMgYXJlIHJlc3BlY3RpdmVseSA4LCAzMiBhbmQgMTI4IHBpeGVscywgdGhlIGZpcnN0IG9uZSB3aWxsIGJlIHNjYWxlZCBkb3duIHdoZW4gdGhlCisgKiBib3VuZHMnIGhlaWdodCBpcyBsb3dlciBvciBlcXVhbCB0aGFuIDggcGl4ZWxzLiBUaGUgc2Vjb25kIGRyYXdhYmxlIHdpbGwgdGhlbiBiZSB1c2VkIHVwIHRvIGEKKyAqIGhlaWdodCBvZiAzMiBwaXhlbHMgYW5kIHRoZSBsYXJnZXN0IGRyYXdhYmxlIHdpbGwgYmUgdXNlZCBmb3IgZ3JlYXRlciBoZWlnaHRzLgorICogPC9wPgorICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjTWlwbWFwRHJhd2FibGVJdGVtX2RyYXdhYmxlCisgKi8KK3B1YmxpYyBjbGFzcyBNaXBtYXBEcmF3YWJsZSBleHRlbmRzIERyYXdhYmxlQ29udGFpbmVyIHsKKyAgICBwcml2YXRlIGZpbmFsIE1pcG1hcENvbnRhaW5lclN0YXRlIG1NaXBtYXBDb250YWluZXJTdGF0ZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gbU11dGF0ZWQ7CisKKyAgICBwdWJsaWMgTWlwbWFwRHJhd2FibGUoKSB7CisgICAgICAgIHRoaXMobnVsbCwgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBhIERyYXdhYmxlIHRvIHRoZSBsaXN0IG9mIGF2YWlsYWJsZSBtaXBtYXAgRHJhd2FibGVzLiBUaGUgRHJhd2FibGUgYWN0dWFsbHkgdXNlZCB3aGVuCisgICAgICogdGhpcyBNaXBtYXBEcmF3YWJsZSBpcyBkcmF3biBpcyBkZXRlcm1pbmVkIGZyb20gaXRzIGJvdW5kcy4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIGhhcyBubyBlZmZlY3QgaWYgZHJhd2FibGUgaXMgbnVsbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkcmF3YWJsZSBUaGUgRHJhd2FibGUgdGhhdCB3aWxsIGJlIGFkZGVkIHRvIGxpc3Qgb2YgYXZhaWxhYmxlIG1pcG1hcCBEcmF3YWJsZXMuCisgICAgICovCisKKyAgICBwdWJsaWMgdm9pZCBhZGREcmF3YWJsZShEcmF3YWJsZSBkcmF3YWJsZSkgeworICAgICAgICBpZiAoZHJhd2FibGUgIT0gbnVsbCkgeworICAgICAgICAgICAgbU1pcG1hcENvbnRhaW5lclN0YXRlLmFkZERyYXdhYmxlKGRyYXdhYmxlKTsKKyAgICAgICAgICAgIG9uRHJhd2FibGVBZGRlZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIG9uRHJhd2FibGVBZGRlZCgpIHsKKyAgICAgICAgLy8gc2VsZWN0RHJhd2FibGUgYXNzdW1lcyB0aGF0IHRoZSBjb250YWluZXIgY29udGVudCBkb2VzIG5vdCBjaGFuZ2UuCisgICAgICAgIC8vIFdoZW4gYSBEcmF3YWJsZSBpcyBhZGRlZCwgdGhlIHNhbWUgaW5kZXggY2FuIGNvcnJlc3BvbmQgdG8gYSBuZXcgRHJhd2FibGUsIGFuZCBzaW5jZQorICAgICAgICAvLyBzZWxlY3REcmF3YWJsZSBoYXMgYSBmYXN0IGV4aXQgY2FzZSB3aGVuIG9sZEluZGV4PT1uZXdJbmRleCwgdGhlIG5ldyBkcmF3YWJsZSBjb3VsZCBlbmQKKyAgICAgICAgLy8gdXAgbm90IGJlaW5nIHVzZWQgaW4gcGxhY2Ugb2YgdGhlIHByZXZpb3VzIG9uZSBpZiB0aGV5IGhhcHBlbiB0byBzaGFyZSB0aGUgc2FtZSBpbmRleC4KKyAgICAgICAgLy8gVGhpcyBtYWtlIHN1cmUgdGhlIG5ldyBjb21wdXRlZCBpbmRleCBjYW4gYWN0dWFsbHkgcmVwbGFjZSB0aGUgcHJldmlvdXMgb25lLgorICAgICAgICBzZWxlY3REcmF3YWJsZSgtMSk7CisgICAgICAgIG9uQm91bmRzQ2hhbmdlKGdldEJvdW5kcygpKTsKKyAgICB9CisKKyAgICAvLyBvdmVycmlkZXMgZnJvbSBEcmF3YWJsZQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25Cb3VuZHNDaGFuZ2UoUmVjdCBib3VuZHMpIHsKKyAgICAgICAgZmluYWwgaW50IGluZGV4ID0gbU1pcG1hcENvbnRhaW5lclN0YXRlLmluZGV4Rm9yQm91bmRzKGJvdW5kcyk7CisKKyAgICAgICAgLy8gV2lsbCBjYWxsIGludmFsaWRhdGVTZWxmKCkgaWYgbmVlZGVkCisgICAgICAgIHNlbGVjdERyYXdhYmxlKGluZGV4KTsKKworICAgICAgICBzdXBlci5vbkJvdW5kc0NoYW5nZShib3VuZHMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGluZmxhdGUoUmVzb3VyY2VzIHIsIFhtbFB1bGxQYXJzZXIgcGFyc2VyLCBBdHRyaWJ1dGVTZXQgYXR0cnMpCisgICAgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKworICAgICAgICBzdXBlci5pbmZsYXRlKHIsIHBhcnNlciwgYXR0cnMpOworCisgICAgICAgIGludCB0eXBlOworCisgICAgICAgIGZpbmFsIGludCBpbm5lckRlcHRoID0gcGFyc2VyLmdldERlcHRoKCkgKyAxOworICAgICAgICBpbnQgZGVwdGg7CisgICAgICAgIHdoaWxlICgodHlwZSA9IHBhcnNlci5uZXh0KCkpICE9IFhtbFB1bGxQYXJzZXIuRU5EX0RPQ1VNRU5UCisgICAgICAgICAgICAgICAgJiYgKChkZXB0aCA9IHBhcnNlci5nZXREZXB0aCgpKSA+PSBpbm5lckRlcHRoCisgICAgICAgICAgICAgICAgICAgICAgICB8fCB0eXBlICE9IFhtbFB1bGxQYXJzZXIuRU5EX1RBRykpIHsKKyAgICAgICAgICAgIGlmICh0eXBlICE9IFhtbFB1bGxQYXJzZXIuU1RBUlRfVEFHKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChkZXB0aCA+IGlubmVyRGVwdGggfHwgIXBhcnNlci5nZXROYW1lKCkuZXF1YWxzKCJpdGVtIikpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgVHlwZWRBcnJheSBhID0gci5vYnRhaW5BdHRyaWJ1dGVzKGF0dHJzLAorICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5NaXBtYXBEcmF3YWJsZUl0ZW0pOworCisgICAgICAgICAgICBpbnQgZHJhd2FibGVSZXMgPSBhLmdldFJlc291cmNlSWQoCisgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLk1pcG1hcERyYXdhYmxlSXRlbV9kcmF3YWJsZSwgMCk7CisKKyAgICAgICAgICAgIGEucmVjeWNsZSgpOworCisgICAgICAgICAgICBEcmF3YWJsZSBkcjsKKyAgICAgICAgICAgIGlmIChkcmF3YWJsZVJlcyAhPSAwKSB7CisgICAgICAgICAgICAgICAgZHIgPSByLmdldERyYXdhYmxlKGRyYXdhYmxlUmVzKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgd2hpbGUgKCh0eXBlID0gcGFyc2VyLm5leHQoKSkgPT0gWG1sUHVsbFBhcnNlci5URVhUKSB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICh0eXBlICE9IFhtbFB1bGxQYXJzZXIuU1RBUlRfVEFHKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci5nZXRQb3NpdGlvbkRlc2NyaXB0aW9uKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICI6IDxpdGVtPiB0YWcgcmVxdWlyZXMgYSAnZHJhd2FibGUnIGF0dHJpYnV0ZSBvciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiY2hpbGQgdGFnIGRlZmluaW5nIGEgZHJhd2FibGUiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZHIgPSBEcmF3YWJsZS5jcmVhdGVGcm9tWG1sSW5uZXIociwgcGFyc2VyLCBhdHRycyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1NaXBtYXBDb250YWluZXJTdGF0ZS5hZGREcmF3YWJsZShkcik7CisgICAgICAgIH0KKworICAgICAgICBvbkRyYXdhYmxlQWRkZWQoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgRHJhd2FibGUgbXV0YXRlKCkgeworICAgICAgICBpZiAoIW1NdXRhdGVkICYmIHN1cGVyLm11dGF0ZSgpID09IHRoaXMpIHsKKyAgICAgICAgICAgIG1NaXBtYXBDb250YWluZXJTdGF0ZS5tTWlwbWFwSGVpZ2h0cyA9IG1NaXBtYXBDb250YWluZXJTdGF0ZS5tTWlwbWFwSGVpZ2h0cy5jbG9uZSgpOworICAgICAgICAgICAgbU11dGF0ZWQgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGNsYXNzIE1pcG1hcENvbnRhaW5lclN0YXRlIGV4dGVuZHMgRHJhd2FibGVDb250YWluZXJTdGF0ZSB7CisgICAgICAgIHByaXZhdGUgaW50W10gbU1pcG1hcEhlaWdodHM7CisKKyAgICAgICAgTWlwbWFwQ29udGFpbmVyU3RhdGUoTWlwbWFwQ29udGFpbmVyU3RhdGUgb3JpZywgTWlwbWFwRHJhd2FibGUgb3duZXIsIFJlc291cmNlcyByZXMpIHsKKyAgICAgICAgICAgIHN1cGVyKG9yaWcsIG93bmVyLCByZXMpOworCisgICAgICAgICAgICBpZiAob3JpZyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbU1pcG1hcEhlaWdodHMgPSBvcmlnLm1NaXBtYXBIZWlnaHRzOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtTWlwbWFwSGVpZ2h0cyA9IG5ldyBpbnRbZ2V0Q2hpbGRyZW4oKS5sZW5ndGhdOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBDaGFuZ2UgdGhlIGRlZmF1bHQgdmFsdWUKKyAgICAgICAgICAgIHNldENvbnN0YW50U2l6ZSh0cnVlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgY2hpbGQgbWlwbWFwIGRyYXdhYmxlIHRoYXQgd2lsbCBiZXN0IGZpdCB0aGUgcHJvdmlkZWQgYm91bmRzLgorICAgICAgICAgKiBUaGlzIGluZGV4IGlzIGRldGVybWluZWQgYnkgY29tcGFyaW5nIGJvdW5kcycgaGVpZ2h0IGFuZCBjaGlsZHJlbiBpbnRyaW5zaWMgaGVpZ2h0cy4KKyAgICAgICAgICogVGhlIHJldHVybmVkIG1pcG1hcCBpbmRleCBpcyB0aGUgc21hbGxlc3QgbWlwbWFwIHdoaWNoIGhlaWdodCBpcyBncmVhdGVyIG9yIGVxdWFsIHRoYW4KKyAgICAgICAgICogdGhlIGJvdW5kcycgaGVpZ2h0LiBJZiB0aGUgYm91bmRzJyBoZWlnaHQgaXMgbGFyZ2VyIHRoYW4gdGhlIGxhcmdlc3QgbWlwbWFwLCB0aGUgbGFyZ2VzdAorICAgICAgICAgKiBtaXBtYXAgaW5kZXggaXMgcmV0dXJuZWQuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBib3VuZHMgVGhlIGJvdW5kcyBvZiB0aGUgTWlwTWFwRHJhd2FibGUuCisgICAgICAgICAqIEByZXR1cm4gVGhlIGluZGV4IG9mIHRoZSBjaGlsZCBEcmF3YWJsZSB0aGF0IHdpbGwgYmVzdCBmaXQgdGhlc2UgYm91bmRzLCBvciAtMSBpZiB0aGVyZQorICAgICAgICAgKiBhcmUgbm8gY2hpbGRyZW4gbWlwbWFwcy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBpbnQgaW5kZXhGb3JCb3VuZHMoUmVjdCBib3VuZHMpIHsKKyAgICAgICAgICAgIGZpbmFsIGludCBib3VuZHNIZWlnaHQgPSBib3VuZHMuaGVpZ2h0KCk7CisgICAgICAgICAgICBmaW5hbCBpbnQgTiA9IGdldENoaWxkQ291bnQoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGJvdW5kc0hlaWdodCA8PSBtTWlwbWFwSGVpZ2h0c1tpXSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIE5vIG1pcG1hcCBsYXJnZXIgdGhhbiBib3VuZHMgZm91bmQuIFVzZSBsYXJnZXN0IG9uZSB3aGljaCB3aWxsIGJlIHNjYWxlZCB1cC4KKyAgICAgICAgICAgIGlmIChOID4gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBOIC0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIE5vIERyYXdhYmxlIG1pcG1hcCBhdCBhbGwKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBBZGRzIGEgRHJhd2FibGUgdG8gdGhlIGxpc3Qgb2YgYXZhaWxhYmxlIG1pcG1hcCBEcmF3YWJsZXMuIFRoaXMgbGlzdCBjYW4gYmUgcmV0cmlldmVkCisgICAgICAgICAqIHVzaW5nIHtAbGluayBEcmF3YWJsZUNvbnRhaW5lci5EcmF3YWJsZUNvbnRhaW5lclN0YXRlI2dldENoaWxkcmVuKCl9IGFuZCB0aGlzIG1ldGhvZAorICAgICAgICAgKiBlbnN1cmVzIHRoYXQgaXQgaXMgYWx3YXlzIHNvcnRlZCBieSBpbmNyZWFzaW5nIHtAbGluayBEcmF3YWJsZSNnZXRJbnRyaW5zaWNIZWlnaHQoKX0uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBkcmF3YWJsZSBUaGUgRHJhd2FibGUgdGhhdCB3aWxsIGJlIGFkZGVkIHRvIGNoaWxkcmVuIGxpc3QKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIGFkZERyYXdhYmxlKERyYXdhYmxlIGRyYXdhYmxlKSB7CisgICAgICAgICAgICAvLyBJbnNlcnQgZHJhd2FibGUgaW4gbGFzdCBwb3NpdGlvbiwgY29ycmVjdGx5IHJlc2V0dGluZyBjYWNoZWQgdmFsdWVzIGFuZAorICAgICAgICAgICAgLy8gZXNwZWNpYWxseSBtQ29tcHV0ZWRDb25zdGFudFNpemUKKyAgICAgICAgICAgIGludCBwb3MgPSBhZGRDaGlsZChkcmF3YWJsZSk7CisKKyAgICAgICAgICAgIC8vIEJ1YmJsZSBzb3J0IHRoZSBsYXN0IGRyYXdhYmxlIHRvIHJlc3RvcmUgdGhlIHNvcnQgYnkgaW50cmluc2ljIGhlaWdodAorICAgICAgICAgICAgZmluYWwgaW50IGRyYXdhYmxlSGVpZ2h0ID0gZHJhd2FibGUuZ2V0SW50cmluc2ljSGVpZ2h0KCk7CisKKyAgICAgICAgICAgIHdoaWxlIChwb3MgPiAwKSB7CisgICAgICAgICAgICAgICAgZmluYWwgRHJhd2FibGUgcHJldmlvdXNEcmF3YWJsZSA9IG1EcmF3YWJsZXNbcG9zLTFdOworICAgICAgICAgICAgICAgIGZpbmFsIGludCBwcmV2aW91c0ludHJpbnNpY0hlaWdodCA9IHByZXZpb3VzRHJhd2FibGUuZ2V0SW50cmluc2ljSGVpZ2h0KCk7CisKKyAgICAgICAgICAgICAgICBpZiAoZHJhd2FibGVIZWlnaHQgPCBwcmV2aW91c0ludHJpbnNpY0hlaWdodCkgeworICAgICAgICAgICAgICAgICAgICBtRHJhd2FibGVzW3Bvc10gPSBwcmV2aW91c0RyYXdhYmxlOworICAgICAgICAgICAgICAgICAgICBtTWlwbWFwSGVpZ2h0c1twb3NdID0gcHJldmlvdXNJbnRyaW5zaWNIZWlnaHQ7CisKKyAgICAgICAgICAgICAgICAgICAgbURyYXdhYmxlc1twb3MtMV0gPSBkcmF3YWJsZTsKKyAgICAgICAgICAgICAgICAgICAgbU1pcG1hcEhlaWdodHNbcG9zLTFdID0gZHJhd2FibGVIZWlnaHQ7CisgICAgICAgICAgICAgICAgICAgIHBvcy0tOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBJbnRyaW5zaWMgc2l6ZXMgYXJlIHRob3NlIG9mIHRoZSBsYXJnZXN0IGF2YWlsYWJsZSBtaXBtYXAuCisgICAgICAgICAqIE1pbmltdW0gc2l6ZXMgYXJlIHRob3NlIG9mIHRoZSBzbWFsbGVzdCBhdmFpbGFibGUgbWlwbWFwLgorICAgICAgICAgKi8KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIGNvbXB1dGVDb25zdGFudFNpemUoKSB7CisgICAgICAgICAgICBmaW5hbCBpbnQgTiA9IGdldENoaWxkQ291bnQoKTsKKyAgICAgICAgICAgIGlmIChOID4gMCkgeworICAgICAgICAgICAgICAgIGZpbmFsIERyYXdhYmxlIHNtYWxsZXN0RHJhd2FibGUgPSBtRHJhd2FibGVzWzBdOworICAgICAgICAgICAgICAgIG1Db25zdGFudE1pbmltdW1XaWR0aCA9IHNtYWxsZXN0RHJhd2FibGUuZ2V0TWluaW11bVdpZHRoKCk7CisgICAgICAgICAgICAgICAgbUNvbnN0YW50TWluaW11bUhlaWdodCA9IHNtYWxsZXN0RHJhd2FibGUuZ2V0TWluaW11bUhlaWdodCgpOworCisgICAgICAgICAgICAgICAgZmluYWwgRHJhd2FibGUgbGFyZ2VzdERyYXdhYmxlID0gbURyYXdhYmxlc1tOLTFdOworICAgICAgICAgICAgICAgIG1Db25zdGFudFdpZHRoID0gbGFyZ2VzdERyYXdhYmxlLmdldEludHJpbnNpY1dpZHRoKCk7CisgICAgICAgICAgICAgICAgbUNvbnN0YW50SGVpZ2h0ID0gbGFyZ2VzdERyYXdhYmxlLmdldEludHJpbnNpY0hlaWdodCgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtQ29uc3RhbnRXaWR0aCA9IG1Db25zdGFudEhlaWdodCA9IC0xOworICAgICAgICAgICAgICAgIG1Db25zdGFudE1pbmltdW1XaWR0aCA9IG1Db25zdGFudE1pbmltdW1IZWlnaHQgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUNvbXB1dGVkQ29uc3RhbnRTaXplID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgRHJhd2FibGUgbmV3RHJhd2FibGUoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IE1pcG1hcERyYXdhYmxlKHRoaXMsIG51bGwpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBEcmF3YWJsZSBuZXdEcmF3YWJsZShSZXNvdXJjZXMgcmVzKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IE1pcG1hcERyYXdhYmxlKHRoaXMsIHJlcyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZ3Jvd0FycmF5KGludCBvbGRTaXplLCBpbnQgbmV3U2l6ZSkgeworICAgICAgICAgICAgc3VwZXIuZ3Jvd0FycmF5KG9sZFNpemUsIG5ld1NpemUpOworICAgICAgICAgICAgaW50W10gbmV3SW50cyA9IG5ldyBpbnRbbmV3U2l6ZV07CisgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KG1NaXBtYXBIZWlnaHRzLCAwLCBuZXdJbnRzLCAwLCBvbGRTaXplKTsKKyAgICAgICAgICAgIG1NaXBtYXBIZWlnaHRzID0gbmV3SW50czsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgTWlwbWFwRHJhd2FibGUoTWlwbWFwQ29udGFpbmVyU3RhdGUgc3RhdGUsIFJlc291cmNlcyByZXMpIHsKKyAgICAgICAgTWlwbWFwQ29udGFpbmVyU3RhdGUgYXMgPSBuZXcgTWlwbWFwQ29udGFpbmVyU3RhdGUoc3RhdGUsIHRoaXMsIHJlcyk7CisgICAgICAgIG1NaXBtYXBDb250YWluZXJTdGF0ZSA9IGFzOworICAgICAgICBzZXRDb25zdGFudFN0YXRlKGFzKTsKKyAgICAgICAgb25EcmF3YWJsZUFkZGVkKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL05pbmVQYXRjaERyYXdhYmxlLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvTmluZVBhdGNoRHJhd2FibGUuamF2YQppbmRleCBiYWQ5NGZiLi45YTk4ZDUzIDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvTmluZVBhdGNoRHJhd2FibGUuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvTmluZVBhdGNoRHJhd2FibGUuamF2YQpAQCAtMTc1LDE2ICsxNzUsOSBAQAogICAgICAgICAgICAgZGVzdC5ib3R0b20gPSBCaXRtYXAuc2NhbGVGcm9tRGVuc2l0eShzcmMuYm90dG9tLCBzZGVuc2l0eSwgdGRlbnNpdHkpOwogICAgICAgICB9CiAgICAgfQotICAgIAotICAgIC8vIG92ZXJyaWRlcwogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgZHJhdyhDYW52YXMgY2FudmFzKSB7Ci0gICAgICAgIGlmIChmYWxzZSkgewotICAgICAgICAgICAgZmxvYXRbXSBwdHMgPSBuZXcgZmxvYXRbMl07Ci0gICAgICAgICAgICBjYW52YXMuZ2V0TWF0cml4KCkubWFwUG9pbnRzKHB0cyk7Ci0gICAgICAgICAgICBMb2cudigiOXBhdGNoIiwgIkRyYXdpbmcgOS1wYXRjaCBAICIgKyBwdHNbMF0gKyAiLCIgKyBwdHNbMV0gKyAiOiAiICsgZ2V0Qm91bmRzKCkpOwotICAgICAgICB9CiAgICAgICAgIG1OaW5lUGF0Y2guZHJhdyhjYW52YXMsIGdldEJvdW5kcygpLCBtUGFpbnQpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL3NoYXBlcy9Sb3VuZFJlY3RTaGFwZS5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL3NoYXBlcy9Sb3VuZFJlY3RTaGFwZS5qYXZhCmluZGV4IGY0Y2YxNWMuLmI0NjlkMmEgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9zaGFwZXMvUm91bmRSZWN0U2hhcGUuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvc2hhcGVzL1JvdW5kUmVjdFNoYXBlLmphdmEKQEAgLTU3LDEzICs1NywxMSBAQAogICAgICAqLwogICAgIHB1YmxpYyBSb3VuZFJlY3RTaGFwZShmbG9hdFtdIG91dGVyUmFkaWksIFJlY3RGIGluc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdFtdIGlubmVyUmFkaWkpIHsKLSAgICAgICAgaWYgKG91dGVyUmFkaWkubGVuZ3RoIDwgOCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3V0ZXIgcmFkaWkgbXVzdCBoYXZlID49IDggdmFsdWVzIik7CisgICAgICAgIGlmIChvdXRlclJhZGlpICE9IG51bGwgJiYgb3V0ZXJSYWRpaS5sZW5ndGggPCA4KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCJvdXRlciByYWRpaSBtdXN0IGhhdmUgPj0gOCB2YWx1ZXMiKTsKICAgICAgICAgfQogICAgICAgICBpZiAoaW5uZXJSYWRpaSAhPSBudWxsICYmIGlubmVyUmFkaWkubGVuZ3RoIDwgOCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5uZXIgcmFkaWkgbXVzdCBoYXZlID49IDggdmFsdWVzIik7CisgICAgICAgICAgICB0aHJvdyBuZXcgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCJpbm5lciByYWRpaSBtdXN0IGhhdmUgPj0gOCB2YWx1ZXMiKTsKICAgICAgICAgfQogICAgICAgICBtT3V0ZXJSYWRpaSA9IG91dGVyUmFkaWk7CiAgICAgICAgIG1JbnNldCA9IGluc2V0OwpAQCAtOTcsOCArOTUsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgci5yaWdodCAtIG1JbnNldC5yaWdodCwgci5ib3R0b20gLSBtSW5zZXQuYm90dG9tKTsKICAgICAgICAgICAgIGlmIChtSW5uZXJSZWN0LndpZHRoKCkgPCB3ICYmIG1Jbm5lclJlY3QuaGVpZ2h0KCkgPCBoKSB7CiAgICAgICAgICAgICAgICAgaWYgKG1Jbm5lclJhZGlpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbVBhdGguYWRkUm91bmRSZWN0KG1Jbm5lclJlY3QsIG1Jbm5lclJhZGlpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGF0aC5EaXJlY3Rpb24uQ0NXKTsKKyAgICAgICAgICAgICAgICAgICAgbVBhdGguYWRkUm91bmRSZWN0KG1Jbm5lclJlY3QsIG1Jbm5lclJhZGlpLCBQYXRoLkRpcmVjdGlvbi5DQ1cpOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIG1QYXRoLmFkZFJlY3QobUlubmVyUmVjdCwgUGF0aC5EaXJlY3Rpb24uQ0NXKTsKICAgICAgICAgICAgICAgICB9CkBAIC0xMDksOCArMTA2LDggQEAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgUm91bmRSZWN0U2hhcGUgY2xvbmUoKSB0aHJvd3MgQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gewogICAgICAgICBSb3VuZFJlY3RTaGFwZSBzaGFwZSA9IChSb3VuZFJlY3RTaGFwZSkgc3VwZXIuY2xvbmUoKTsKLSAgICAgICAgc2hhcGUubU91dGVyUmFkaWkgPSBtT3V0ZXJSYWRpaS5jbG9uZSgpOwotICAgICAgICBzaGFwZS5tSW5uZXJSYWRpaSA9IG1Jbm5lclJhZGlpLmNsb25lKCk7CisgICAgICAgIHNoYXBlLm1PdXRlclJhZGlpID0gbU91dGVyUmFkaWkgIT0gbnVsbCA/IG1PdXRlclJhZGlpLmNsb25lKCkgOiBudWxsOworICAgICAgICBzaGFwZS5tSW5uZXJSYWRpaSA9IG1Jbm5lclJhZGlpICE9IG51bGwgPyBtSW5uZXJSYWRpaS5jbG9uZSgpIDogbnVsbDsKICAgICAgICAgc2hhcGUubUluc2V0ID0gbmV3IFJlY3RGKG1JbnNldCk7CiAgICAgICAgIHNoYXBlLm1Jbm5lclJlY3QgPSBuZXcgUmVjdEYobUlubmVyUmVjdCk7CiAgICAgICAgIHNoYXBlLm1QYXRoID0gbmV3IFBhdGgobVBhdGgpOwpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9BbGxvY2F0aW9uLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0FsbG9jYXRpb24uamF2YQppbmRleCBiMjdjN2Y1Li42Nzc1YzA4IDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0FsbG9jYXRpb24uamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0FsbG9jYXRpb24uamF2YQpAQCAtMzUsMTEgKzM1LDI1IEBACiAgICAgQml0bWFwIG1CaXRtYXA7CiAKICAgICBBbGxvY2F0aW9uKGludCBpZCwgUmVuZGVyU2NyaXB0IHJzLCBUeXBlIHQpIHsKLSAgICAgICAgc3VwZXIocnMpOwotICAgICAgICBtSUQgPSBpZDsKKyAgICAgICAgc3VwZXIoaWQsIHJzKTsKICAgICAgICAgbVR5cGUgPSB0OwogICAgIH0KIAorICAgIEFsbG9jYXRpb24oaW50IGlkLCBSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgc3VwZXIoaWQsIHJzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICB2b2lkIHVwZGF0ZUZyb21OYXRpdmUoKSB7CisgICAgICAgIG1SUy52YWxpZGF0ZSgpOworICAgICAgICBtTmFtZSA9IG1SUy5uR2V0TmFtZShtSUQpOworICAgICAgICBpbnQgdHlwZUlEID0gbVJTLm5BbGxvY2F0aW9uR2V0VHlwZShtSUQpOworICAgICAgICBpZih0eXBlSUQgIT0gMCkgeworICAgICAgICAgICAgbVR5cGUgPSBuZXcgVHlwZSh0eXBlSUQsIG1SUyk7CisgICAgICAgICAgICBtVHlwZS51cGRhdGVGcm9tTmF0aXZlKCk7CisgICAgICAgIH0KKyAgICB9CisKICAgICBwdWJsaWMgVHlwZSBnZXRUeXBlKCkgewogICAgICAgICByZXR1cm4gbVR5cGU7CiAgICAgfQpAQCAtNzYsMTAgKzkwLDMwIEBACiAgICAgICAgIHN1YkRhdGExRCgwLCBtVHlwZS5nZXRFbGVtZW50Q291bnQoKSwgZCk7CiAgICAgfQogCisgICAgcHVibGljIHZvaWQgc3ViRGF0YShpbnQgb2ZmLCBGaWVsZFBhY2tlciBmcCkgeworICAgICAgICBpbnQgZVNpemUgPSBtVHlwZS5tRWxlbWVudC5nZXRTaXplQnl0ZXMoKTsKKyAgICAgICAgZmluYWwgYnl0ZVtdIGRhdGEgPSBmcC5nZXREYXRhKCk7CisKKyAgICAgICAgaW50IGNvdW50ID0gZGF0YS5sZW5ndGggLyBlU2l6ZTsKKyAgICAgICAgaWYgKChlU2l6ZSAqIGNvdW50KSAhPSBkYXRhLmxlbmd0aCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiRmllbGQgcGFja2VyIGxlbmd0aCAiICsgZGF0YS5sZW5ndGggKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIG5vdCBkaXZpc2libGUgYnkgZWxlbWVudCBzaXplICIgKyBlU2l6ZSArICIuIik7CisgICAgICAgIH0KKyAgICAgICAgZGF0YTFEQ2hlY2tzKG9mZiwgY291bnQsIGRhdGEubGVuZ3RoLCBkYXRhLmxlbmd0aCk7CisgICAgICAgIG1SUy5uQWxsb2NhdGlvblN1YkRhdGExRChtSUQsIG9mZiwgY291bnQsIGRhdGEsIGRhdGEubGVuZ3RoKTsKKyAgICB9CisKICAgICBwcml2YXRlIHZvaWQgZGF0YTFEQ2hlY2tzKGludCBvZmYsIGludCBjb3VudCwgaW50IGxlbiwgaW50IGRhdGFTaXplKSB7CiAgICAgICAgIG1SUy52YWxpZGF0ZSgpOwotICAgICAgICBpZigob2ZmIDwgMCkgfHwgKGNvdW50IDwgMSkgfHwgKChvZmYgKyBjb3VudCkgPiBtVHlwZS5nZXRFbGVtZW50Q291bnQoKSkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk9mZnNldCBvciBDb3VudCBvdXQgb2YgYm91bmRzLiIpOworICAgICAgICBpZihvZmYgPCAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJPZmZzZXQgbXVzdCBiZSA+PSAwLiIpOworICAgICAgICB9CisgICAgICAgIGlmKGNvdW50IDwgMSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ291bnQgbXVzdCBiZSA+PSAxLiIpOworICAgICAgICB9CisgICAgICAgIGlmKChvZmYgKyBjb3VudCkgPiBtVHlwZS5nZXRFbGVtZW50Q291bnQoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiT3ZlcmZsb3csIEF2YWlsYWJsZSBjb3VudCAiICsgbVR5cGUuZ2V0RWxlbWVudENvdW50KCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLCBnb3QgIiArIGNvdW50ICsgIiBhdCBvZmZzZXQgIiArIG9mZiArICIuIik7CiAgICAgICAgIH0KICAgICAgICAgaWYoKGxlbikgPCBkYXRhU2l6ZSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQXJyYXkgdG9vIHNtYWxsIGZvciBhbGxvY2F0aW9uIHR5cGUuIik7CkBAIC0xNDYsOCArMTgwLDcgQEAKIAogICAgIHB1YmxpYyBjbGFzcyBBZGFwdGVyMUQgZXh0ZW5kcyBCYXNlT2JqIHsKICAgICAgICAgQWRhcHRlcjFEKGludCBpZCwgUmVuZGVyU2NyaXB0IHJzKSB7Ci0gICAgICAgICAgICBzdXBlcihycyk7Ci0gICAgICAgICAgICBtSUQgPSBpZDsKKyAgICAgICAgICAgIHN1cGVyKGlkLCBycyk7CiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgdm9pZCBzZXRDb25zdHJhaW50KERpbWVuc2lvbiBkaW0sIGludCB2YWx1ZSkgewpAQCAtMTg5LDggKzIyMiw3IEBACiAKICAgICBwdWJsaWMgY2xhc3MgQWRhcHRlcjJEIGV4dGVuZHMgQmFzZU9iaiB7CiAgICAgICAgIEFkYXB0ZXIyRChpbnQgaWQsIFJlbmRlclNjcmlwdCBycykgewotICAgICAgICAgICAgc3VwZXIocnMpOwotICAgICAgICAgICAgbUlEID0gaWQ7CisgICAgICAgICAgICBzdXBlcihpZCwgcnMpOwogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIHZvaWQgc2V0Q29uc3RyYWludChEaW1lbnNpb24gZGltLCBpbnQgdmFsdWUpIHsKQEAgLTM3Nyw2ICs0MDksMjEgQEAKICAgICAgICAgQml0bWFwIGIgPSBCaXRtYXBGYWN0b3J5LmRlY29kZVJlc291cmNlKHJlcywgaWQsIG1CaXRtYXBPcHRpb25zKTsKICAgICAgICAgcmV0dXJuIGNyZWF0ZUZyb21CaXRtYXBCb3hlZChycywgYiwgZHN0Rm10LCBnZW5NaXBzKTsKICAgICB9CisKKyAgICBzdGF0aWMgcHVibGljIEFsbG9jYXRpb24gY3JlYXRlRnJvbVN0cmluZyhSZW5kZXJTY3JpcHQgcnMsIFN0cmluZyBzdHIpCisgICAgICAgIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24geworICAgICAgICBieXRlW10gYWxsb2NBcnJheSA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhbGxvY0FycmF5ID0gc3RyLmdldEJ5dGVzKCJVVEYtOCIpOworICAgICAgICAgICAgQWxsb2NhdGlvbiBhbGxvYyA9IEFsbG9jYXRpb24uY3JlYXRlU2l6ZWQocnMsIEVsZW1lbnQuVTgocnMpLCBhbGxvY0FycmF5Lmxlbmd0aCk7CisgICAgICAgICAgICBhbGxvYy5kYXRhKGFsbG9jQXJyYXkpOworICAgICAgICAgICAgcmV0dXJuIGFsbG9jOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoInJzIiwgImNvdWxkIG5vdCBjb252ZXJ0IHN0cmluZyB0byB1dGYtOCIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KIH0KIAogCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0Jhc2VPYmouamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvQmFzZU9iai5qYXZhCmluZGV4IDAwMmZjNzguLjMxOThlM2YgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvQmFzZU9iai5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvQmFzZU9iai5qYXZhCkBAIC0yNCwxMCArMjQsMTAgQEAKICAqKi8KIGNsYXNzIEJhc2VPYmogewogCi0gICAgQmFzZU9iaihSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICBCYXNlT2JqKGludCBpZCwgUmVuZGVyU2NyaXB0IHJzKSB7CiAgICAgICAgIHJzLnZhbGlkYXRlKCk7CiAgICAgICAgIG1SUyA9IHJzOwotICAgICAgICBtSUQgPSAwOworICAgICAgICBtSUQgPSBpZDsKICAgICAgICAgbURlc3Ryb3llZCA9IGZhbHNlOwogICAgIH0KIApAQCAtNjIsNyArNjIsNyBAQAogICAgIHsKICAgICAgICAgaWYgKCFtRGVzdHJveWVkKSB7CiAgICAgICAgICAgICBpZihtSUQgIT0gMCAmJiBtUlMuaXNBbGl2ZSgpKSB7Ci0gICAgICAgICAgICAgICAgbVJTLm5PYmpEZXN0cm95T09CKG1JRCk7CisgICAgICAgICAgICAgICAgbVJTLm5PYmpEZXN0cm95KG1JRCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtUlMgPSBudWxsOwogICAgICAgICAgICAgbUlEID0gMDsKQEAgLTgxLDUgKzgxLDEwIEBACiAgICAgICAgIG1SUy5uT2JqRGVzdHJveShtSUQpOwogICAgIH0KIAorICAgIC8vIElmIGFuIG9iamVjdCBjYW1lIGZyb20gYW4gYTNkIGZpbGUsIGphdmEgZmllbGRzIG5lZWQgdG8gYmUKKyAgICAvLyBjcmVhdGVkIHdpdGggb2JqZWN0cyBmcm9tIHRoZSBuYXRpdmUgbGF5ZXIKKyAgICB2b2lkIHVwZGF0ZUZyb21OYXRpdmUoKSB7CisgICAgfQorCiB9CiAKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvQnl0ZTIuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvQnl0ZTIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NWNmODhjCi0tLSAvZGV2L251bGwKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9CeXRlMi5qYXZhCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQucmVuZGVyc2NyaXB0OworCitpbXBvcnQgamF2YS5sYW5nLk1hdGg7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworCisvKioKKyAqIEBoaWRlCisgKgorICoqLworcHVibGljIGNsYXNzIEJ5dGUyIHsKKyAgICBwdWJsaWMgQnl0ZTIoKSB7CisgICAgfQorCisgICAgcHVibGljIGJ5dGUgeDsKKyAgICBwdWJsaWMgYnl0ZSB5OworfQorCisKKworCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0J5dGUzLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0J5dGUzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTZjMGNhOQotLS0gL2Rldi9udWxsCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvQnl0ZTMuamF2YQpAQCAtMCwwICsxLDM4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnJlbmRlcnNjcmlwdDsKKworaW1wb3J0IGphdmEubGFuZy5NYXRoOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKKworLyoqCisgKiBAaGlkZQorICoKKyAqKi8KK3B1YmxpYyBjbGFzcyBCeXRlMyB7CisgICAgcHVibGljIEJ5dGUzKCkgeworICAgIH0KKworICAgIHB1YmxpYyBieXRlIHg7CisgICAgcHVibGljIGJ5dGUgeTsKKyAgICBwdWJsaWMgYnl0ZSB6OworfQorCisKKworCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0J5dGU0LmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0J5dGU0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTViZmM2MQotLS0gL2Rldi9udWxsCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvQnl0ZTQuamF2YQpAQCAtMCwwICsxLDM4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnJlbmRlcnNjcmlwdDsKKworaW1wb3J0IGphdmEubGFuZy5NYXRoOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKKworLyoqCisgKiBAaGlkZQorICoKKyAqKi8KK3B1YmxpYyBjbGFzcyBCeXRlNCB7CisgICAgcHVibGljIEJ5dGU0KCkgeworICAgIH0KKworICAgIHB1YmxpYyBieXRlIHg7CisgICAgcHVibGljIGJ5dGUgeTsKKyAgICBwdWJsaWMgYnl0ZSB6OworICAgIHB1YmxpYyBieXRlIHc7Cit9CisKKworCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0VsZW1lbnQuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvRWxlbWVudC5qYXZhCmluZGV4IDEwZWYwNWEuLmI4MTE0NzkgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvRWxlbWVudC5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvRWxlbWVudC5qYXZhCkBAIC0xNyw2ICsxNyw3IEBACiBwYWNrYWdlIGFuZHJvaWQucmVuZGVyc2NyaXB0OwogCiBpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAogLyoqCiAgKiBAaGlkZQpAQCAtNDcsMjAgKzQ4LDIyIEBACiAgICAgICAgIFVOU0lHTkVEXzMyICgxMCwgNCksCiAgICAgICAgIC8vVU5TSUdORURfNjQgKDExLCA4KSwKIAotICAgICAgICBVTlNJR05FRF81XzZfNSAoMTIsIDIpLAotICAgICAgICBVTlNJR05FRF81XzVfNV8xICgxMywgMiksCi0gICAgICAgIFVOU0lHTkVEXzRfNF80XzQgKDE0LCAyKSwKKyAgICAgICAgQk9PTEVBTigxMiwgMSksCiAKLSAgICAgICAgUlNfRUxFTUVOVCAoMTUsIDQpLAotICAgICAgICBSU19UWVBFICgxNiwgNCksCi0gICAgICAgIFJTX0FMTE9DQVRJT04gKDE3LCA0KSwKLSAgICAgICAgUlNfU0FNUExFUiAoMTgsIDQpLAotICAgICAgICBSU19TQ1JJUFQgKDE5LCA0KSwKLSAgICAgICAgUlNfTUVTSCAoMjAsIDQpLAotICAgICAgICBSU19QUk9HUkFNX0ZSQUdNRU5UICgyMSwgNCksCi0gICAgICAgIFJTX1BST0dSQU1fVkVSVEVYICgyMiwgNCksCi0gICAgICAgIFJTX1BST0dSQU1fUkFTVEVSICgyMywgNCksCi0gICAgICAgIFJTX1BST0dSQU1fU1RPUkUgKDI0LCA0KTsKKyAgICAgICAgVU5TSUdORURfNV82XzUgKDEzLCAyKSwKKyAgICAgICAgVU5TSUdORURfNV81XzVfMSAoMTQsIDIpLAorICAgICAgICBVTlNJR05FRF80XzRfNF80ICgxNSwgMiksCisKKyAgICAgICAgUlNfRUxFTUVOVCAoMTYsIDQpLAorICAgICAgICBSU19UWVBFICgxNywgNCksCisgICAgICAgIFJTX0FMTE9DQVRJT04gKDE4LCA0KSwKKyAgICAgICAgUlNfU0FNUExFUiAoMTksIDQpLAorICAgICAgICBSU19TQ1JJUFQgKDIwLCA0KSwKKyAgICAgICAgUlNfTUVTSCAoMjEsIDQpLAorICAgICAgICBSU19QUk9HUkFNX0ZSQUdNRU5UICgyMiwgNCksCisgICAgICAgIFJTX1BST0dSQU1fVkVSVEVYICgyMywgNCksCisgICAgICAgIFJTX1BST0dSQU1fUkFTVEVSICgyNCwgNCksCisgICAgICAgIFJTX1BST0dSQU1fU1RPUkUgKDI1LCA0KTsKIAogICAgICAgICBpbnQgbUlEOwogICAgICAgICBpbnQgbVNpemU7CkBAIC03MiwxMiArNzUsNiBAQAogCiAgICAgcHVibGljIGVudW0gRGF0YUtpbmQgewogICAgICAgICBVU0VSICgwKSwKLSAgICAgICAgQ09MT1IgKDEpLAotICAgICAgICBQT1NJVElPTiAoMiksCi0gICAgICAgIFRFWFRVUkUgKDMpLAotICAgICAgICBOT1JNQUwgKDQpLAotICAgICAgICBJTkRFWCAoNSksCi0gICAgICAgIFBPSU5UX1NJWkUoNiksCiAKICAgICAgICAgUElYRUxfTCAoNyksCiAgICAgICAgIFBJWEVMX0EgKDgpLApAQCAtOTEsNDEgKzg4LDEzMyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBFbGVtZW50IFVTRVJfVTgoUmVuZGVyU2NyaXB0IHJzKSB7Ci0gICAgICAgIGlmKHJzLm1FbGVtZW50X1VTRVJfVTggPT0gbnVsbCkgewotICAgICAgICAgICAgcnMubUVsZW1lbnRfVVNFUl9VOCA9IGNyZWF0ZVVzZXIocnMsIERhdGFUeXBlLlVOU0lHTkVEXzgpOworICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBCT09MRUFOKFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tRWxlbWVudF9CT09MRUFOID09IG51bGwpIHsKKyAgICAgICAgICAgIHJzLm1FbGVtZW50X0JPT0xFQU4gPSBjcmVhdGVVc2VyKHJzLCBEYXRhVHlwZS5CT09MRUFOKTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gcnMubUVsZW1lbnRfVVNFUl9VODsKKyAgICAgICAgcmV0dXJuIHJzLm1FbGVtZW50X0JPT0xFQU47CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBFbGVtZW50IFVTRVJfSTgoUmVuZGVyU2NyaXB0IHJzKSB7Ci0gICAgICAgIGlmKHJzLm1FbGVtZW50X1VTRVJfSTggPT0gbnVsbCkgewotICAgICAgICAgICAgcnMubUVsZW1lbnRfVVNFUl9JOCA9IGNyZWF0ZVVzZXIocnMsIERhdGFUeXBlLlNJR05FRF84KTsKKyAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgVTgoUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1FbGVtZW50X1U4ID09IG51bGwpIHsKKyAgICAgICAgICAgIHJzLm1FbGVtZW50X1U4ID0gY3JlYXRlVXNlcihycywgRGF0YVR5cGUuVU5TSUdORURfOCk7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJzLm1FbGVtZW50X1VTRVJfSTg7CisgICAgICAgIHJldHVybiBycy5tRWxlbWVudF9VODsKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgVVNFUl9VMzIoUmVuZGVyU2NyaXB0IHJzKSB7Ci0gICAgICAgIGlmKHJzLm1FbGVtZW50X1VTRVJfVTMyID09IG51bGwpIHsKLSAgICAgICAgICAgIHJzLm1FbGVtZW50X1VTRVJfVTMyID0gY3JlYXRlVXNlcihycywgRGF0YVR5cGUuVU5TSUdORURfMzIpOworICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBJOChSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgaWYocnMubUVsZW1lbnRfSTggPT0gbnVsbCkgeworICAgICAgICAgICAgcnMubUVsZW1lbnRfSTggPSBjcmVhdGVVc2VyKHJzLCBEYXRhVHlwZS5TSUdORURfOCk7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJzLm1FbGVtZW50X1VTRVJfVTMyOworICAgICAgICByZXR1cm4gcnMubUVsZW1lbnRfSTg7CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBFbGVtZW50IFVTRVJfSTMyKFJlbmRlclNjcmlwdCBycykgewotICAgICAgICBpZihycy5tRWxlbWVudF9VU0VSX0kzMiA9PSBudWxsKSB7Ci0gICAgICAgICAgICBycy5tRWxlbWVudF9VU0VSX0kzMiA9IGNyZWF0ZVVzZXIocnMsIERhdGFUeXBlLlNJR05FRF8zMik7CisgICAgcHVibGljIHN0YXRpYyBFbGVtZW50IFUxNihSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgaWYocnMubUVsZW1lbnRfVTE2ID09IG51bGwpIHsKKyAgICAgICAgICAgIHJzLm1FbGVtZW50X1UxNiA9IGNyZWF0ZVVzZXIocnMsIERhdGFUeXBlLlVOU0lHTkVEXzE2KTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gcnMubUVsZW1lbnRfVVNFUl9JMzI7CisgICAgICAgIHJldHVybiBycy5tRWxlbWVudF9VMTY7CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBFbGVtZW50IFVTRVJfRjMyKFJlbmRlclNjcmlwdCBycykgewotICAgICAgICBpZihycy5tRWxlbWVudF9VU0VSX0YzMiA9PSBudWxsKSB7Ci0gICAgICAgICAgICBycy5tRWxlbWVudF9VU0VSX0YzMiA9IGNyZWF0ZVVzZXIocnMsIERhdGFUeXBlLkZMT0FUXzMyKTsKKyAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgSTE2KFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tRWxlbWVudF9JMTYgPT0gbnVsbCkgeworICAgICAgICAgICAgcnMubUVsZW1lbnRfSTE2ID0gY3JlYXRlVXNlcihycywgRGF0YVR5cGUuU0lHTkVEXzE2KTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gcnMubUVsZW1lbnRfVVNFUl9GMzI7CisgICAgICAgIHJldHVybiBycy5tRWxlbWVudF9JMTY7CiAgICAgfQogCisgICAgcHVibGljIHN0YXRpYyBFbGVtZW50IFUzMihSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgaWYocnMubUVsZW1lbnRfVTMyID09IG51bGwpIHsKKyAgICAgICAgICAgIHJzLm1FbGVtZW50X1UzMiA9IGNyZWF0ZVVzZXIocnMsIERhdGFUeXBlLlVOU0lHTkVEXzMyKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcnMubUVsZW1lbnRfVTMyOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBJMzIoUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1FbGVtZW50X0kzMiA9PSBudWxsKSB7CisgICAgICAgICAgICBycy5tRWxlbWVudF9JMzIgPSBjcmVhdGVVc2VyKHJzLCBEYXRhVHlwZS5TSUdORURfMzIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBycy5tRWxlbWVudF9JMzI7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBFbGVtZW50IEYzMihSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgaWYocnMubUVsZW1lbnRfRjMyID09IG51bGwpIHsKKyAgICAgICAgICAgIHJzLm1FbGVtZW50X0YzMiA9IGNyZWF0ZVVzZXIocnMsIERhdGFUeXBlLkZMT0FUXzMyKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcnMubUVsZW1lbnRfRjMyOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBFTEVNRU5UKFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tRWxlbWVudF9FTEVNRU5UID09IG51bGwpIHsKKyAgICAgICAgICAgIHJzLm1FbGVtZW50X0VMRU1FTlQgPSBjcmVhdGVVc2VyKHJzLCBEYXRhVHlwZS5SU19FTEVNRU5UKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcnMubUVsZW1lbnRfRUxFTUVOVDsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgVFlQRShSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgaWYocnMubUVsZW1lbnRfVFlQRSA9PSBudWxsKSB7CisgICAgICAgICAgICBycy5tRWxlbWVudF9UWVBFID0gY3JlYXRlVXNlcihycywgRGF0YVR5cGUuUlNfVFlQRSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJzLm1FbGVtZW50X1RZUEU7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBFbGVtZW50IEFMTE9DQVRJT04oUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1FbGVtZW50X0FMTE9DQVRJT04gPT0gbnVsbCkgeworICAgICAgICAgICAgcnMubUVsZW1lbnRfQUxMT0NBVElPTiA9IGNyZWF0ZVVzZXIocnMsIERhdGFUeXBlLlJTX0FMTE9DQVRJT04pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBycy5tRWxlbWVudF9BTExPQ0FUSU9OOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBTQU1QTEVSKFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tRWxlbWVudF9TQU1QTEVSID09IG51bGwpIHsKKyAgICAgICAgICAgIHJzLm1FbGVtZW50X1NBTVBMRVIgPSBjcmVhdGVVc2VyKHJzLCBEYXRhVHlwZS5SU19TQU1QTEVSKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcnMubUVsZW1lbnRfU0FNUExFUjsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgU0NSSVBUKFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tRWxlbWVudF9TQ1JJUFQgPT0gbnVsbCkgeworICAgICAgICAgICAgcnMubUVsZW1lbnRfU0NSSVBUID0gY3JlYXRlVXNlcihycywgRGF0YVR5cGUuUlNfU0NSSVBUKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcnMubUVsZW1lbnRfU0NSSVBUOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBNRVNIKFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tRWxlbWVudF9NRVNIID09IG51bGwpIHsKKyAgICAgICAgICAgIHJzLm1FbGVtZW50X01FU0ggPSBjcmVhdGVVc2VyKHJzLCBEYXRhVHlwZS5SU19NRVNIKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcnMubUVsZW1lbnRfTUVTSDsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgUFJPR1JBTV9GUkFHTUVOVChSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgaWYocnMubUVsZW1lbnRfUFJPR1JBTV9GUkFHTUVOVCA9PSBudWxsKSB7CisgICAgICAgICAgICBycy5tRWxlbWVudF9QUk9HUkFNX0ZSQUdNRU5UID0gY3JlYXRlVXNlcihycywgRGF0YVR5cGUuUlNfUFJPR1JBTV9GUkFHTUVOVCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJzLm1FbGVtZW50X1BST0dSQU1fRlJBR01FTlQ7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBFbGVtZW50IFBST0dSQU1fVkVSVEVYKFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tRWxlbWVudF9QUk9HUkFNX1ZFUlRFWCA9PSBudWxsKSB7CisgICAgICAgICAgICBycy5tRWxlbWVudF9QUk9HUkFNX1ZFUlRFWCA9IGNyZWF0ZVVzZXIocnMsIERhdGFUeXBlLlJTX1BST0dSQU1fVkVSVEVYKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcnMubUVsZW1lbnRfUFJPR1JBTV9WRVJURVg7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBFbGVtZW50IFBST0dSQU1fUkFTVEVSKFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tRWxlbWVudF9QUk9HUkFNX1JBU1RFUiA9PSBudWxsKSB7CisgICAgICAgICAgICBycy5tRWxlbWVudF9QUk9HUkFNX1JBU1RFUiA9IGNyZWF0ZVVzZXIocnMsIERhdGFUeXBlLlJTX1BST0dSQU1fUkFTVEVSKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcnMubUVsZW1lbnRfUFJPR1JBTV9SQVNURVI7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBFbGVtZW50IFBST0dSQU1fU1RPUkUoUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1FbGVtZW50X1BST0dSQU1fU1RPUkUgPT0gbnVsbCkgeworICAgICAgICAgICAgcnMubUVsZW1lbnRfUFJPR1JBTV9TVE9SRSA9IGNyZWF0ZVVzZXIocnMsIERhdGFUeXBlLlJTX1BST0dSQU1fU1RPUkUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBycy5tRWxlbWVudF9QUk9HUkFNX1NUT1JFOworICAgIH0KKworCiAgICAgcHVibGljIHN0YXRpYyBFbGVtZW50IEFfOChSZW5kZXJTY3JpcHQgcnMpIHsKICAgICAgICAgaWYocnMubUVsZW1lbnRfQV84ID09IG51bGwpIHsKICAgICAgICAgICAgIHJzLm1FbGVtZW50X0FfOCA9IGNyZWF0ZVBpeGVsKHJzLCBEYXRhVHlwZS5VTlNJR05FRF84LCBEYXRhS2luZC5QSVhFTF9BKTsKQEAgLTE2OCwxNjggKzI1NywxMTcgQEAKICAgICAgICAgcmV0dXJuIHJzLm1FbGVtZW50X1JHQkFfODg4ODsKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgSU5ERVhfMTYoUmVuZGVyU2NyaXB0IHJzKSB7Ci0gICAgICAgIGlmKHJzLm1FbGVtZW50X0lOREVYXzE2ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJzLm1FbGVtZW50X0lOREVYXzE2ID0gY3JlYXRlSW5kZXgocnMpOworICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBGMzJfMihSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgaWYocnMubUVsZW1lbnRfRkxPQVRfMiA9PSBudWxsKSB7CisgICAgICAgICAgICBycy5tRWxlbWVudF9GTE9BVF8yID0gY3JlYXRlVmVjdG9yKHJzLCBEYXRhVHlwZS5GTE9BVF8zMiwgMik7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJzLm1FbGVtZW50X0lOREVYXzE2OworICAgICAgICByZXR1cm4gcnMubUVsZW1lbnRfRkxPQVRfMjsKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgQVRUUklCX1BPU0lUSU9OXzIoUmVuZGVyU2NyaXB0IHJzKSB7Ci0gICAgICAgIGlmKHJzLm1FbGVtZW50X1BPU0lUSU9OXzIgPT0gbnVsbCkgewotICAgICAgICAgICAgcnMubUVsZW1lbnRfUE9TSVRJT05fMiA9IGNyZWF0ZUF0dHJpYihycywgRGF0YVR5cGUuRkxPQVRfMzIsIERhdGFLaW5kLlBPU0lUSU9OLCAyKTsKKyAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgRjMyXzMoUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1FbGVtZW50X0ZMT0FUXzMgPT0gbnVsbCkgeworICAgICAgICAgICAgcnMubUVsZW1lbnRfRkxPQVRfMyA9IGNyZWF0ZVZlY3RvcihycywgRGF0YVR5cGUuRkxPQVRfMzIsIDMpOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBycy5tRWxlbWVudF9QT1NJVElPTl8yOworICAgICAgICByZXR1cm4gcnMubUVsZW1lbnRfRkxPQVRfMzsKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgQVRUUklCX1BPU0lUSU9OXzMoUmVuZGVyU2NyaXB0IHJzKSB7Ci0gICAgICAgIGlmKHJzLm1FbGVtZW50X1BPU0lUSU9OXzMgPT0gbnVsbCkgewotICAgICAgICAgICAgcnMubUVsZW1lbnRfUE9TSVRJT05fMyA9IGNyZWF0ZUF0dHJpYihycywgRGF0YVR5cGUuRkxPQVRfMzIsIERhdGFLaW5kLlBPU0lUSU9OLCAzKTsKKyAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgRjMyXzQoUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1FbGVtZW50X0ZMT0FUXzQgPT0gbnVsbCkgeworICAgICAgICAgICAgcnMubUVsZW1lbnRfRkxPQVRfNCA9IGNyZWF0ZVZlY3RvcihycywgRGF0YVR5cGUuRkxPQVRfMzIsIDQpOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBycy5tRWxlbWVudF9QT1NJVElPTl8zOworICAgICAgICByZXR1cm4gcnMubUVsZW1lbnRfRkxPQVRfNDsKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgQVRUUklCX1RFWFRVUkVfMihSZW5kZXJTY3JpcHQgcnMpIHsKLSAgICAgICAgaWYocnMubUVsZW1lbnRfVEVYVFVSRV8yID09IG51bGwpIHsKLSAgICAgICAgICAgIHJzLm1FbGVtZW50X1RFWFRVUkVfMiA9IGNyZWF0ZUF0dHJpYihycywgRGF0YVR5cGUuRkxPQVRfMzIsIERhdGFLaW5kLlRFWFRVUkUsIDIpOworICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBVOF80KFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tRWxlbWVudF9VQ0hBUl80ID09IG51bGwpIHsKKyAgICAgICAgICAgIHJzLm1FbGVtZW50X1VDSEFSXzQgPSBjcmVhdGVWZWN0b3IocnMsIERhdGFUeXBlLlVOU0lHTkVEXzgsIDQpOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBycy5tRWxlbWVudF9URVhUVVJFXzI7CisgICAgICAgIHJldHVybiBycy5tRWxlbWVudF9VQ0hBUl80OwogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBBVFRSSUJfTk9STUFMXzMoUmVuZGVyU2NyaXB0IHJzKSB7Ci0gICAgICAgIGlmKHJzLm1FbGVtZW50X05PUk1BTF8zID09IG51bGwpIHsKLSAgICAgICAgICAgIHJzLm1FbGVtZW50X05PUk1BTF8zID0gY3JlYXRlQXR0cmliKHJzLCBEYXRhVHlwZS5GTE9BVF8zMiwgRGF0YUtpbmQuTk9STUFMLCAzKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcnMubUVsZW1lbnRfTk9STUFMXzM7Ci0gICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBFbGVtZW50IEFUVFJJQl9DT0xPUl9VOF80KFJlbmRlclNjcmlwdCBycykgewotICAgICAgICBpZihycy5tRWxlbWVudF9DT0xPUl9VOF80ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJzLm1FbGVtZW50X0NPTE9SX1U4XzQgPSBjcmVhdGVBdHRyaWIocnMsIERhdGFUeXBlLlVOU0lHTkVEXzgsIERhdGFLaW5kLkNPTE9SLCA0KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcnMubUVsZW1lbnRfQ09MT1JfVThfNDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgQVRUUklCX0NPTE9SX0YzMl80KFJlbmRlclNjcmlwdCBycykgewotICAgICAgICBpZihycy5tRWxlbWVudF9DT0xPUl9GMzJfNCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBycy5tRWxlbWVudF9DT0xPUl9GMzJfNCA9IGNyZWF0ZUF0dHJpYihycywgRGF0YVR5cGUuRkxPQVRfMzIsIERhdGFLaW5kLkNPTE9SLCA0KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcnMubUVsZW1lbnRfQ09MT1JfRjMyXzQ7Ci0gICAgfQotCi0gICAgRWxlbWVudChSZW5kZXJTY3JpcHQgcnMsIEVsZW1lbnRbXSBlLCBTdHJpbmdbXSBuKSB7Ci0gICAgICAgIHN1cGVyKHJzKTsKKyAgICBFbGVtZW50KGludCBpZCwgUmVuZGVyU2NyaXB0IHJzLCBFbGVtZW50W10gZSwgU3RyaW5nW10gbikgeworICAgICAgICBzdXBlcihpZCwgcnMpOwogICAgICAgICBtU2l6ZSA9IDA7CiAgICAgICAgIG1FbGVtZW50cyA9IGU7CiAgICAgICAgIG1FbGVtZW50TmFtZXMgPSBuOwotICAgICAgICBpbnRbXSBpZHMgPSBuZXcgaW50W21FbGVtZW50cy5sZW5ndGhdOwogICAgICAgICBmb3IgKGludCBjdCA9IDA7IGN0IDwgbUVsZW1lbnRzLmxlbmd0aDsgY3QrKyApIHsKICAgICAgICAgICAgIG1TaXplICs9IG1FbGVtZW50c1tjdF0ubVNpemU7Ci0gICAgICAgICAgICBpZHNbY3RdID0gbUVsZW1lbnRzW2N0XS5tSUQ7CiAgICAgICAgIH0KLSAgICAgICAgbUlEID0gcnMubkVsZW1lbnRDcmVhdGUyKGlkcywgbUVsZW1lbnROYW1lcyk7CiAgICAgfQogCi0gICAgRWxlbWVudChSZW5kZXJTY3JpcHQgcnMsIERhdGFUeXBlIGR0LCBEYXRhS2luZCBkaywgYm9vbGVhbiBub3JtLCBpbnQgc2l6ZSkgewotICAgICAgICBzdXBlcihycyk7CisgICAgRWxlbWVudChpbnQgaWQsIFJlbmRlclNjcmlwdCBycywgRGF0YVR5cGUgZHQsIERhdGFLaW5kIGRrLCBib29sZWFuIG5vcm0sIGludCBzaXplKSB7CisgICAgICAgIHN1cGVyKGlkLCBycyk7CiAgICAgICAgIG1TaXplID0gZHQubVNpemUgKiBzaXplOwogICAgICAgICBtVHlwZSA9IGR0OwogICAgICAgICBtS2luZCA9IGRrOwogICAgICAgICBtTm9ybWFsaXplZCA9IG5vcm07CiAgICAgICAgIG1WZWN0b3JTaXplID0gc2l6ZTsKLSAgICAgICAgbUlEID0gcnMubkVsZW1lbnRDcmVhdGUoZHQubUlELCBkay5tSUQsIG5vcm0sIHNpemUpOworICAgIH0KKworICAgIEVsZW1lbnQoaW50IGlkLCBSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgc3VwZXIoaWQsIHJzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICB2b2lkIHVwZGF0ZUZyb21OYXRpdmUoKSB7CisKKyAgICAgICAgLy8gd2Ugd2lsbCBwYWNrIG1UeXBlOyBtS2luZDsgbU5vcm1hbGl6ZWQ7IG1WZWN0b3JTaXplOyBOdW1TdWJFbGVtZW50cworICAgICAgICBpbnRbXSBkYXRhQnVmZmVyID0gbmV3IGludFs1XTsKKyAgICAgICAgbVJTLm5FbGVtZW50R2V0TmF0aXZlRGF0YShtSUQsIGRhdGFCdWZmZXIpOworCisgICAgICAgIG1Ob3JtYWxpemVkID0gZGF0YUJ1ZmZlclsyXSA9PSAxID8gdHJ1ZSA6IGZhbHNlOworICAgICAgICBtVmVjdG9yU2l6ZSA9IGRhdGFCdWZmZXJbM107CisgICAgICAgIG1TaXplID0gMDsKKyAgICAgICAgZm9yIChEYXRhVHlwZSBkdDogRGF0YVR5cGUudmFsdWVzKCkpIHsKKyAgICAgICAgICAgIGlmKGR0Lm1JRCA9PSBkYXRhQnVmZmVyWzBdKXsKKyAgICAgICAgICAgICAgICBtVHlwZSA9IGR0OworICAgICAgICAgICAgICAgIG1TaXplID0gbVR5cGUubVNpemUgKiBtVmVjdG9yU2l6ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmb3IgKERhdGFLaW5kIGRrOiBEYXRhS2luZC52YWx1ZXMoKSkgeworICAgICAgICAgICAgaWYoZGsubUlEID09IGRhdGFCdWZmZXJbMV0peworICAgICAgICAgICAgICAgIG1LaW5kID0gZGs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpbnQgbnVtU3ViRWxlbWVudHMgPSBkYXRhQnVmZmVyWzRdOworICAgICAgICBpZihudW1TdWJFbGVtZW50cyA+IDApIHsKKyAgICAgICAgICAgIG1FbGVtZW50cyA9IG5ldyBFbGVtZW50W251bVN1YkVsZW1lbnRzXTsKKyAgICAgICAgICAgIG1FbGVtZW50TmFtZXMgPSBuZXcgU3RyaW5nW251bVN1YkVsZW1lbnRzXTsKKworICAgICAgICAgICAgaW50W10gc3ViRWxlbWVudElkcyA9IG5ldyBpbnRbbnVtU3ViRWxlbWVudHNdOworICAgICAgICAgICAgbVJTLm5FbGVtZW50R2V0U3ViRWxlbWVudHMobUlELCBzdWJFbGVtZW50SWRzLCBtRWxlbWVudE5hbWVzKTsKKyAgICAgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBudW1TdWJFbGVtZW50czsgaSArKykgeworICAgICAgICAgICAgICAgIG1FbGVtZW50c1tpXSA9IG5ldyBFbGVtZW50KHN1YkVsZW1lbnRJZHNbaV0sIG1SUyk7CisgICAgICAgICAgICAgICAgbUVsZW1lbnRzW2ldLnVwZGF0ZUZyb21OYXRpdmUoKTsKKyAgICAgICAgICAgICAgICBtU2l6ZSArPSBtRWxlbWVudHNbaV0ubVNpemU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIGRlc3Ryb3koKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKICAgICAgICAgc3VwZXIuZGVzdHJveSgpOwogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBjcmVhdGVGcm9tQ2xhc3MoUmVuZGVyU2NyaXB0IHJzLCBDbGFzcyBjKSB7Ci0gICAgICAgIHJzLnZhbGlkYXRlKCk7Ci0gICAgICAgIEZpZWxkW10gZmllbGRzID0gYy5nZXRGaWVsZHMoKTsKLSAgICAgICAgQnVpbGRlciBiID0gbmV3IEJ1aWxkZXIocnMpOwotCi0gICAgICAgIGZvcihGaWVsZCBmOiBmaWVsZHMpIHsKLSAgICAgICAgICAgIENsYXNzIGZjID0gZi5nZXRUeXBlKCk7Ci0gICAgICAgICAgICBpZihmYyA9PSBpbnQuY2xhc3MpIHsKLSAgICAgICAgICAgICAgICBiLmFkZChjcmVhdGVVc2VyKHJzLCBEYXRhVHlwZS5TSUdORURfMzIpLCBmLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYoZmMgPT0gc2hvcnQuY2xhc3MpIHsKLSAgICAgICAgICAgICAgICBiLmFkZChjcmVhdGVVc2VyKHJzLCBEYXRhVHlwZS5TSUdORURfMTYpLCBmLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYoZmMgPT0gYnl0ZS5jbGFzcykgewotICAgICAgICAgICAgICAgIGIuYWRkKGNyZWF0ZVVzZXIocnMsIERhdGFUeXBlLlNJR05FRF84KSwgZi5nZXROYW1lKCkpOwotICAgICAgICAgICAgfSBlbHNlIGlmKGZjID09IGZsb2F0LmNsYXNzKSB7Ci0gICAgICAgICAgICAgICAgYi5hZGQoY3JlYXRlVXNlcihycywgRGF0YVR5cGUuRkxPQVRfMzIpLCBmLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVua293biBmaWVsZCB0eXBlIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGIuY3JlYXRlKCk7Ci0gICAgfQotCi0KICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBjcmVhdGVVc2VyKFJlbmRlclNjcmlwdCBycywgRGF0YVR5cGUgZHQpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBFbGVtZW50KHJzLCBkdCwgRGF0YUtpbmQuVVNFUiwgZmFsc2UsIDEpOworICAgICAgICBEYXRhS2luZCBkayA9IERhdGFLaW5kLlVTRVI7CisgICAgICAgIGJvb2xlYW4gbm9ybSA9IGZhbHNlOworICAgICAgICBpbnQgdmVjU2l6ZSA9IDE7CisgICAgICAgIGludCBpZCA9IHJzLm5FbGVtZW50Q3JlYXRlKGR0Lm1JRCwgZGsubUlELCBub3JtLCB2ZWNTaXplKTsKKyAgICAgICAgcmV0dXJuIG5ldyBFbGVtZW50KGlkLCBycywgZHQsIGRrLCBub3JtLCB2ZWNTaXplKTsKICAgICB9CiAKICAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgY3JlYXRlVmVjdG9yKFJlbmRlclNjcmlwdCBycywgRGF0YVR5cGUgZHQsIGludCBzaXplKSB7CiAgICAgICAgIGlmIChzaXplIDwgMiB8fCBzaXplID4gNCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQmFkIHNpemUiKTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IEVsZW1lbnQocnMsIGR0LCBEYXRhS2luZC5VU0VSLCBmYWxzZSwgc2l6ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBFbGVtZW50IGNyZWF0ZUluZGV4KFJlbmRlclNjcmlwdCBycykgewotICAgICAgICByZXR1cm4gbmV3IEVsZW1lbnQocnMsIERhdGFUeXBlLlVOU0lHTkVEXzE2LCBEYXRhS2luZC5JTkRFWCwgZmFsc2UsIDEpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBjcmVhdGVBdHRyaWIoUmVuZGVyU2NyaXB0IHJzLCBEYXRhVHlwZSBkdCwgRGF0YUtpbmQgZGssIGludCBzaXplKSB7Ci0gICAgICAgIGlmICghKGR0ID09IERhdGFUeXBlLkZMT0FUXzMyIHx8Ci0gICAgICAgICAgICAgIGR0ID09IERhdGFUeXBlLlVOU0lHTkVEXzggfHwKLSAgICAgICAgICAgICAgZHQgPT0gRGF0YVR5cGUuVU5TSUdORURfMTYgfHwKLSAgICAgICAgICAgICAgZHQgPT0gRGF0YVR5cGUuVU5TSUdORURfMzIgfHwKLSAgICAgICAgICAgICAgZHQgPT0gRGF0YVR5cGUuU0lHTkVEXzggfHwKLSAgICAgICAgICAgICAgZHQgPT0gRGF0YVR5cGUuU0lHTkVEXzE2IHx8Ci0gICAgICAgICAgICAgIGR0ID09IERhdGFUeXBlLlNJR05FRF8zMikpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVuc3VwcG9ydGVkIERhdGFUeXBlIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIShkayA9PSBEYXRhS2luZC5DT0xPUiB8fAotICAgICAgICAgICAgICBkayA9PSBEYXRhS2luZC5QT1NJVElPTiB8fAotICAgICAgICAgICAgICBkayA9PSBEYXRhS2luZC5URVhUVVJFIHx8Ci0gICAgICAgICAgICAgIGRrID09IERhdGFLaW5kLk5PUk1BTCB8fAotICAgICAgICAgICAgICBkayA9PSBEYXRhS2luZC5QT0lOVF9TSVpFIHx8Ci0gICAgICAgICAgICAgIGRrID09IERhdGFLaW5kLlVTRVIpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbnN1cHBvcnRlZCBEYXRhS2luZCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGRrID09IERhdGFLaW5kLkNPTE9SICYmCi0gICAgICAgICAgICAoKGR0ICE9IERhdGFUeXBlLkZMT0FUXzMyICYmIGR0ICE9IERhdGFUeXBlLlVOU0lHTkVEXzgpIHx8Ci0gICAgICAgICAgICAgc2l6ZSA8IDMgfHwgc2l6ZSA+IDQpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJCYWQgY29tYm8iKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZGsgPT0gRGF0YUtpbmQuUE9TSVRJT04gJiYgKHNpemUgPCAxIHx8IHNpemUgPiA0KSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQmFkIGNvbWJvIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGRrID09IERhdGFLaW5kLlRFWFRVUkUgJiYKLSAgICAgICAgICAgIChkdCAhPSBEYXRhVHlwZS5GTE9BVF8zMiB8fCBzaXplIDwgMSB8fCBzaXplID4gNCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkJhZCBjb21ibyIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChkayA9PSBEYXRhS2luZC5OT1JNQUwgJiYKLSAgICAgICAgICAgIChkdCAhPSBEYXRhVHlwZS5GTE9BVF8zMiB8fCBzaXplICE9IDMpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJCYWQgY29tYm8iKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZGsgPT0gRGF0YUtpbmQuUE9JTlRfU0laRSAmJgotICAgICAgICAgICAgKGR0ICE9IERhdGFUeXBlLkZMT0FUXzMyIHx8IHNpemUgIT0gMSkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkJhZCBjb21ibyIpOwotICAgICAgICB9Ci0KKyAgICAgICAgRGF0YUtpbmQgZGsgPSBEYXRhS2luZC5VU0VSOwogICAgICAgICBib29sZWFuIG5vcm0gPSBmYWxzZTsKLSAgICAgICAgaWYgKGRrID09IERhdGFLaW5kLkNPTE9SICYmIGR0ID09IERhdGFUeXBlLlVOU0lHTkVEXzgpIHsKLSAgICAgICAgICAgIG5vcm0gPSB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBFbGVtZW50KHJzLCBkdCwgZGssIG5vcm0sIHNpemUpOworICAgICAgICBpbnQgaWQgPSBycy5uRWxlbWVudENyZWF0ZShkdC5tSUQsIGRrLm1JRCwgbm9ybSwgc2l6ZSk7CisgICAgICAgIHJldHVybiBuZXcgRWxlbWVudChpZCwgcnMsIGR0LCBkaywgbm9ybSwgc2l6ZSk7CiAgICAgfQogCiAgICAgcHVibGljIHN0YXRpYyBFbGVtZW50IGNyZWF0ZVBpeGVsKFJlbmRlclNjcmlwdCBycywgRGF0YVR5cGUgZHQsIERhdGFLaW5kIGRrKSB7CkBAIC0zNjcsNyArNDA1LDkgQEAKICAgICAgICAgICAgIHNpemUgPSA0OwogICAgICAgICB9CiAKLSAgICAgICAgcmV0dXJuIG5ldyBFbGVtZW50KHJzLCBkdCwgZGssIHRydWUsIHNpemUpOworICAgICAgICBib29sZWFuIG5vcm0gPSB0cnVlOworICAgICAgICBpbnQgaWQgPSBycy5uRWxlbWVudENyZWF0ZShkdC5tSUQsIGRrLm1JRCwgbm9ybSwgc2l6ZSk7CisgICAgICAgIHJldHVybiBuZXcgRWxlbWVudChpZCwgcnMsIGR0LCBkaywgbm9ybSwgc2l6ZSk7CiAgICAgfQogCiAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBCdWlsZGVyIHsKQEAgLTQwMyw3ICs0NDMsMTMgQEAKICAgICAgICAgICAgIFN0cmluZ1tdIHNpbiA9IG5ldyBTdHJpbmdbbUNvdW50XTsKICAgICAgICAgICAgIGphdmEubGFuZy5TeXN0ZW0uYXJyYXljb3B5KG1FbGVtZW50cywgMCwgZWluLCAwLCBtQ291bnQpOwogICAgICAgICAgICAgamF2YS5sYW5nLlN5c3RlbS5hcnJheWNvcHkobUVsZW1lbnROYW1lcywgMCwgc2luLCAwLCBtQ291bnQpOwotICAgICAgICAgICAgcmV0dXJuIG5ldyBFbGVtZW50KG1SUywgZWluLCBzaW4pOworCisgICAgICAgICAgICBpbnRbXSBpZHMgPSBuZXcgaW50W2Vpbi5sZW5ndGhdOworICAgICAgICAgICAgZm9yIChpbnQgY3QgPSAwOyBjdCA8IGVpbi5sZW5ndGg7IGN0KysgKSB7CisgICAgICAgICAgICAgICAgaWRzW2N0XSA9IGVpbltjdF0ubUlEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50IGlkID0gbVJTLm5FbGVtZW50Q3JlYXRlMihpZHMsIHNpbik7CisgICAgICAgICAgICByZXR1cm4gbmV3IEVsZW1lbnQoaWQsIG1SUywgZWluLCBzaW4pOwogICAgICAgICB9CiAgICAgfQogCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0ZpZWxkUGFja2VyLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0ZpZWxkUGFja2VyLmphdmEKaW5kZXggYjI2ZTQ3ZC4uMjRmMDQwOSAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9GaWVsZFBhY2tlci5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvRmllbGRQYWNrZXIuamF2YQpAQCAtMzMsMjEgKzMzLDI4IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICB2b2lkIHJlc2V0KCkgeworICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkgewogICAgICAgICBtUG9zID0gMDsKICAgICB9CisgICAgcHVibGljIHZvaWQgcmVzZXQoaW50IGkpIHsKKyAgICAgICAgbVBvcyA9IGk7CisgICAgfQogCi0gICAgdm9pZCBhZGRJOChieXRlIHYpIHsKKyAgICBwdWJsaWMgdm9pZCBza2lwKGludCBpKSB7CisgICAgICAgIG1Qb3MgKz0gaTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRJOChieXRlIHYpIHsKICAgICAgICAgbURhdGFbbVBvcysrXSA9IHY7CiAgICAgfQogCi0gICAgdm9pZCBhZGRJMTYoc2hvcnQgdikgeworICAgIHB1YmxpYyB2b2lkIGFkZEkxNihzaG9ydCB2KSB7CiAgICAgICAgIGFsaWduKDIpOwogICAgICAgICBtRGF0YVttUG9zKytdID0gKGJ5dGUpKHYgJiAweGZmKTsKICAgICAgICAgbURhdGFbbVBvcysrXSA9IChieXRlKSh2ID4+IDgpOwogICAgIH0KIAotICAgIHZvaWQgYWRkSTMyKGludCB2KSB7CisgICAgcHVibGljIHZvaWQgYWRkSTMyKGludCB2KSB7CiAgICAgICAgIGFsaWduKDQpOwogICAgICAgICBtRGF0YVttUG9zKytdID0gKGJ5dGUpKHYgJiAweGZmKTsKICAgICAgICAgbURhdGFbbVBvcysrXSA9IChieXRlKSgodiA+PiA4KSAmIDB4ZmYpOwpAQCAtNTUsNyArNjIsNyBAQAogICAgICAgICBtRGF0YVttUG9zKytdID0gKGJ5dGUpKCh2ID4+IDI0KSAmIDB4ZmYpOwogICAgIH0KIAotICAgIHZvaWQgYWRkSTY0KGxvbmcgdikgeworICAgIHB1YmxpYyB2b2lkIGFkZEk2NChsb25nIHYpIHsKICAgICAgICAgYWxpZ24oOCk7CiAgICAgICAgIG1EYXRhW21Qb3MrK10gPSAoYnl0ZSkodiAmIDB4ZmYpOwogICAgICAgICBtRGF0YVttUG9zKytdID0gKGJ5dGUpKCh2ID4+IDgpICYgMHhmZik7CkBAIC02NywxNSArNzQsMTcgQEAKICAgICAgICAgbURhdGFbbVBvcysrXSA9IChieXRlKSgodiA+PiA1NikgJiAweGZmKTsKICAgICB9CiAKLSAgICB2b2lkIGFkZFU4KHNob3J0IHYpIHsKKyAgICBwdWJsaWMgdm9pZCBhZGRVOChzaG9ydCB2KSB7CiAgICAgICAgIGlmICgodiA8IDApIHx8ICh2ID4gMHhmZikpIHsKKyAgICAgICAgICAgIGFuZHJvaWQudXRpbC5Mb2cuZSgicnMiLCAiRmllbGRQYWNrZXIuYWRkVTgoICIgKyB2ICsgIiApIik7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJTYXZpbmcgdmFsdWUgb3V0IG9mIHJhbmdlIGZvciB0eXBlIik7CiAgICAgICAgIH0KICAgICAgICAgbURhdGFbbVBvcysrXSA9IChieXRlKXY7CiAgICAgfQogCi0gICAgdm9pZCBhZGRVMTYoaW50IHYpIHsKKyAgICBwdWJsaWMgdm9pZCBhZGRVMTYoaW50IHYpIHsKICAgICAgICAgaWYgKCh2IDwgMCkgfHwgKHYgPiAweGZmZmYpKSB7CisgICAgICAgICAgICBhbmRyb2lkLnV0aWwuTG9nLmUoInJzIiwgIkZpZWxkUGFja2VyLmFkZFUxNiggIiArIHYgKyAiICkiKTsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlNhdmluZyB2YWx1ZSBvdXQgb2YgcmFuZ2UgZm9yIHR5cGUiKTsKICAgICAgICAgfQogICAgICAgICBhbGlnbigyKTsKQEAgLTgzLDggKzkyLDkgQEAKICAgICAgICAgbURhdGFbbVBvcysrXSA9IChieXRlKSh2ID4+IDgpOwogICAgIH0KIAotICAgIHZvaWQgYWRkVTMyKGxvbmcgdikgewotICAgICAgICBpZiAoKHYgPCAwKSB8fCAodiA+IDB4ZmZmZmZmZmYpKSB7CisgICAgcHVibGljIHZvaWQgYWRkVTMyKGxvbmcgdikgeworICAgICAgICBpZiAoKHYgPCAwKSB8fCAodiA+IDB4ZmZmZmZmZmZMKSkgeworICAgICAgICAgICAgYW5kcm9pZC51dGlsLkxvZy5lKCJycyIsICJGaWVsZFBhY2tlci5hZGRVMzIoICIgKyB2ICsgIiApIik7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJTYXZpbmcgdmFsdWUgb3V0IG9mIHJhbmdlIGZvciB0eXBlIik7CiAgICAgICAgIH0KICAgICAgICAgYWxpZ24oNCk7CkBAIC05NCw4ICsxMDQsOSBAQAogICAgICAgICBtRGF0YVttUG9zKytdID0gKGJ5dGUpKCh2ID4+IDI0KSAmIDB4ZmYpOwogICAgIH0KIAotICAgIHZvaWQgYWRkVTY0KGxvbmcgdikgeworICAgIHB1YmxpYyB2b2lkIGFkZFU2NChsb25nIHYpIHsKICAgICAgICAgaWYgKHYgPCAwKSB7CisgICAgICAgICAgICBhbmRyb2lkLnV0aWwuTG9nLmUoInJzIiwgIkZpZWxkUGFja2VyLmFkZFU2NCggIiArIHYgKyAiICkiKTsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlNhdmluZyB2YWx1ZSBvdXQgb2YgcmFuZ2UgZm9yIHR5cGUiKTsKICAgICAgICAgfQogICAgICAgICBhbGlnbig4KTsKQEAgLTEwOSwxNSArMTIwLDEzOSBAQAogICAgICAgICBtRGF0YVttUG9zKytdID0gKGJ5dGUpKCh2ID4+IDU2KSAmIDB4ZmYpOwogICAgIH0KIAotICAgIHZvaWQgYWRkRjMyKGZsb2F0IHYpIHsKKyAgICBwdWJsaWMgdm9pZCBhZGRGMzIoZmxvYXQgdikgewogICAgICAgICBhZGRJMzIoRmxvYXQuZmxvYXRUb1Jhd0ludEJpdHModikpOwogICAgIH0KIAotICAgIHZvaWQgYWRkRjY0KGZsb2F0IHYpIHsKKyAgICBwdWJsaWMgdm9pZCBhZGRGNjQoZmxvYXQgdikgewogICAgICAgICBhZGRJNjQoRG91YmxlLmRvdWJsZVRvUmF3TG9uZ0JpdHModikpOwogICAgIH0KIAotICAgIGZpbmFsIGJ5dGVbXSBnZXREYXRhKCkgeworICAgIHB1YmxpYyB2b2lkIGFkZE9iaihCYXNlT2JqIG9iaikgeworICAgICAgICBpZiAob2JqICE9IG51bGwpIHsKKyAgICAgICAgICAgIGFkZEkzMihvYmouZ2V0SUQoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhZGRJMzIoMCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRGMzIoRmxvYXQyIHYpIHsKKyAgICAgICAgYWRkRjMyKHYueCk7CisgICAgICAgIGFkZEYzMih2LnkpOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBhZGRGMzIoRmxvYXQzIHYpIHsKKyAgICAgICAgYWRkRjMyKHYueCk7CisgICAgICAgIGFkZEYzMih2LnkpOworICAgICAgICBhZGRGMzIodi56KTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgYWRkRjMyKEZsb2F0NCB2KSB7CisgICAgICAgIGFkZEYzMih2LngpOworICAgICAgICBhZGRGMzIodi55KTsKKyAgICAgICAgYWRkRjMyKHYueik7CisgICAgICAgIGFkZEYzMih2LncpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZEk4KEJ5dGUyIHYpIHsKKyAgICAgICAgYWRkSTgodi54KTsKKyAgICAgICAgYWRkSTgodi55KTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgYWRkSTgoQnl0ZTMgdikgeworICAgICAgICBhZGRJOCh2LngpOworICAgICAgICBhZGRJOCh2LnkpOworICAgICAgICBhZGRJOCh2LnopOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBhZGRJOChCeXRlNCB2KSB7CisgICAgICAgIGFkZEk4KHYueCk7CisgICAgICAgIGFkZEk4KHYueSk7CisgICAgICAgIGFkZEk4KHYueik7CisgICAgICAgIGFkZEk4KHYudyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkVTgoU2hvcnQyIHYpIHsKKyAgICAgICAgYWRkVTgodi54KTsKKyAgICAgICAgYWRkVTgodi55KTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgYWRkVTgoU2hvcnQzIHYpIHsKKyAgICAgICAgYWRkVTgodi54KTsKKyAgICAgICAgYWRkVTgodi55KTsKKyAgICAgICAgYWRkVTgodi56KTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgYWRkVTgoU2hvcnQ0IHYpIHsKKyAgICAgICAgYWRkVTgodi54KTsKKyAgICAgICAgYWRkVTgodi55KTsKKyAgICAgICAgYWRkVTgodi56KTsKKyAgICAgICAgYWRkVTgodi53KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRJMTYoU2hvcnQyIHYpIHsKKyAgICAgICAgYWRkSTE2KHYueCk7CisgICAgICAgIGFkZEkxNih2LnkpOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBhZGRJMTYoU2hvcnQzIHYpIHsKKyAgICAgICAgYWRkSTE2KHYueCk7CisgICAgICAgIGFkZEkxNih2LnkpOworICAgICAgICBhZGRJMTYodi56KTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgYWRkSTE2KFNob3J0NCB2KSB7CisgICAgICAgIGFkZEkxNih2LngpOworICAgICAgICBhZGRJMTYodi55KTsKKyAgICAgICAgYWRkSTE2KHYueik7CisgICAgICAgIGFkZEkxNih2LncpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZFUxNihJbnQyIHYpIHsKKyAgICAgICAgYWRkVTE2KHYueCk7CisgICAgICAgIGFkZFUxNih2LnkpOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBhZGRVMTYoSW50MyB2KSB7CisgICAgICAgIGFkZFUxNih2LngpOworICAgICAgICBhZGRVMTYodi55KTsKKyAgICAgICAgYWRkVTE2KHYueik7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIGFkZFUxNihJbnQ0IHYpIHsKKyAgICAgICAgYWRkVTE2KHYueCk7CisgICAgICAgIGFkZFUxNih2LnkpOworICAgICAgICBhZGRVMTYodi56KTsKKyAgICAgICAgYWRkVTE2KHYudyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkSTMyKEludDIgdikgeworICAgICAgICBhZGRJMzIodi54KTsKKyAgICAgICAgYWRkSTMyKHYueSk7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIGFkZEkzMihJbnQzIHYpIHsKKyAgICAgICAgYWRkSTMyKHYueCk7CisgICAgICAgIGFkZEkzMih2LnkpOworICAgICAgICBhZGRJMzIodi56KTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgYWRkSTMyKEludDQgdikgeworICAgICAgICBhZGRJMzIodi54KTsKKyAgICAgICAgYWRkSTMyKHYueSk7CisgICAgICAgIGFkZEkzMih2LnopOworICAgICAgICBhZGRJMzIodi53KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRVMzIoSW50MiB2KSB7CisgICAgICAgIGFkZFUzMih2LngpOworICAgICAgICBhZGRVMzIodi55KTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgYWRkVTMyKEludDMgdikgeworICAgICAgICBhZGRVMzIodi54KTsKKyAgICAgICAgYWRkVTMyKHYueSk7CisgICAgICAgIGFkZFUzMih2LnopOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBhZGRVMzIoSW50NCB2KSB7CisgICAgICAgIGFkZFUzMih2LngpOworICAgICAgICBhZGRVMzIodi55KTsKKyAgICAgICAgYWRkVTMyKHYueik7CisgICAgICAgIGFkZFUzMih2LncpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZEJvb2xlYW4oYm9vbGVhbiB2KSB7CisgICAgICAgIGFkZEk4KChieXRlKSh2ID8gMSA6IDApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgYnl0ZVtdIGdldERhdGEoKSB7CiAgICAgICAgIHJldHVybiBtRGF0YTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvRmlsZUEzRC5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9GaWxlQTNELmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQxNDA2MgotLS0gL2Rldi9udWxsCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvRmlsZUEzRC5qYXZhCkBAIC0wLDAgKzEsMjE3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnJlbmRlcnNjcmlwdDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQXNzZXRNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwRmFjdG9yeTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudXRpbC5UeXBlZFZhbHVlOworCisvKioKKyAqIEBoaWRlCisgKgorICoqLworcHVibGljIGNsYXNzIEZpbGVBM0QgZXh0ZW5kcyBCYXNlT2JqIHsKKworICAgIHB1YmxpYyBlbnVtIENsYXNzSUQgeworCisgICAgICAgIFVOS05PV04sCisgICAgICAgIE1FU0gsCisgICAgICAgIFRZUEUsCisgICAgICAgIEVMRU1FTlQsCisgICAgICAgIEFMTE9DQVRJT04sCisgICAgICAgIFBST0dSQU1fVkVSVEVYLAorICAgICAgICBQUk9HUkFNX1JBU1RFUiwKKyAgICAgICAgUFJPR1JBTV9GUkFHTUVOVCwKKyAgICAgICAgUFJPR1JBTV9TVE9SRSwKKyAgICAgICAgU0FNUExFUiwKKyAgICAgICAgQU5JTUFUSU9OLAorICAgICAgICBMSUdIVCwKKyAgICAgICAgQURBUFRFUl8xRCwKKyAgICAgICAgQURBUFRFUl8yRCwKKyAgICAgICAgU0NSSVBUX0M7CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBDbGFzc0lEIHRvQ2xhc3NJRChpbnQgaW50SUQpIHsKKyAgICAgICAgICAgIHJldHVybiBDbGFzc0lELnZhbHVlcygpW2ludElEXTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFJlYWQgb25seSBjbGFzcyB3aXRoIGluZGV4IGVudHJpZXMKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEluZGV4RW50cnkgeworICAgICAgICBSZW5kZXJTY3JpcHQgbVJTOworICAgICAgICBpbnQgbUluZGV4OworICAgICAgICBpbnQgbUlEOworICAgICAgICBTdHJpbmcgbU5hbWU7CisgICAgICAgIENsYXNzSUQgbUNsYXNzSUQ7CisgICAgICAgIEJhc2VPYmogbUxvYWRlZE9iajsKKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgICAgICByZXR1cm4gbU5hbWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQ2xhc3NJRCBnZXRDbGFzc0lEKCkgeworICAgICAgICAgICAgcmV0dXJuIG1DbGFzc0lEOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEJhc2VPYmogZ2V0T2JqZWN0KCkgeworICAgICAgICAgICAgbVJTLnZhbGlkYXRlKCk7CisgICAgICAgICAgICBCYXNlT2JqIG9iaiA9IGludGVybmFsQ3JlYXRlKG1SUywgdGhpcyk7CisgICAgICAgICAgICByZXR1cm4gb2JqOworICAgICAgICB9CisKKyAgICAgICAgc3RhdGljIHN5bmNocm9uaXplZCBCYXNlT2JqIGludGVybmFsQ3JlYXRlKFJlbmRlclNjcmlwdCBycywgSW5kZXhFbnRyeSBlbnRyeSkgeworICAgICAgICAgICAgaWYoZW50cnkubUxvYWRlZE9iaiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVudHJ5Lm1Mb2FkZWRPYmo7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKGVudHJ5Lm1DbGFzc0lEID09IENsYXNzSUQuVU5LTk9XTikgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnQgb2JqZWN0SUQgPSBycy5uRmlsZUEzREdldEVudHJ5QnlJbmRleChlbnRyeS5tSUQsIGVudHJ5Lm1JbmRleCk7CisgICAgICAgICAgICBpZihvYmplY3RJRCA9PSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAoZW50cnkubUNsYXNzSUQpIHsKKyAgICAgICAgICAgIGNhc2UgTUVTSDoKKyAgICAgICAgICAgICAgICBlbnRyeS5tTG9hZGVkT2JqID0gbmV3IE1lc2gob2JqZWN0SUQsIHJzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgVFlQRToKKyAgICAgICAgICAgICAgICBlbnRyeS5tTG9hZGVkT2JqID0gbmV3IFR5cGUob2JqZWN0SUQsIHJzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRUxFTUVOVDoKKyAgICAgICAgICAgICAgICBlbnRyeS5tTG9hZGVkT2JqID0gbnVsbDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQUxMT0NBVElPTjoKKyAgICAgICAgICAgICAgICBlbnRyeS5tTG9hZGVkT2JqID0gbnVsbDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUFJPR1JBTV9WRVJURVg6CisgICAgICAgICAgICAgICAgZW50cnkubUxvYWRlZE9iaiA9IG5ldyBQcm9ncmFtVmVydGV4KG9iamVjdElELCBycyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFBST0dSQU1fUkFTVEVSOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBQUk9HUkFNX0ZSQUdNRU5UOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBQUk9HUkFNX1NUT1JFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTQU1QTEVSOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBTklNQVRJT046CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIExJR0hUOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBREFQVEVSXzFEOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBREFQVEVSXzJEOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTQ1JJUFRfQzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZW50cnkubUxvYWRlZE9iai51cGRhdGVGcm9tTmF0aXZlKCk7CisKKyAgICAgICAgICAgIHJldHVybiBlbnRyeS5tTG9hZGVkT2JqOworICAgICAgICB9CisKKyAgICAgICAgSW5kZXhFbnRyeShSZW5kZXJTY3JpcHQgcnMsIGludCBpbmRleCwgaW50IGlkLCBTdHJpbmcgbmFtZSwgQ2xhc3NJRCBjbGFzc0lEKSB7CisgICAgICAgICAgICBtUlMgPSByczsKKyAgICAgICAgICAgIG1JbmRleCA9IGluZGV4OworICAgICAgICAgICAgbUlEID0gaWQ7CisgICAgICAgICAgICBtTmFtZSA9IG5hbWU7CisgICAgICAgICAgICBtQ2xhc3NJRCA9IGNsYXNzSUQ7CisgICAgICAgICAgICBtTG9hZGVkT2JqID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIEluZGV4RW50cnlbXSBtRmlsZUVudHJpZXM7CisKKyAgICBGaWxlQTNEKGludCBpZCwgUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIHN1cGVyKGlkLCBycyk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGluaXRFbnRyaWVzKCkgeworICAgICAgICBpbnQgbnVtRmlsZUVudHJpZXMgPSBtUlMubkZpbGVBM0RHZXROdW1JbmRleEVudHJpZXMobUlEKTsKKyAgICAgICAgaWYobnVtRmlsZUVudHJpZXMgPD0gMCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgbUZpbGVFbnRyaWVzID0gbmV3IEluZGV4RW50cnlbbnVtRmlsZUVudHJpZXNdOworICAgICAgICBpbnRbXSBpZHMgPSBuZXcgaW50W251bUZpbGVFbnRyaWVzXTsKKyAgICAgICAgU3RyaW5nW10gbmFtZXMgPSBuZXcgU3RyaW5nW251bUZpbGVFbnRyaWVzXTsKKworICAgICAgICBtUlMubkZpbGVBM0RHZXRJbmRleEVudHJpZXMobUlELCBudW1GaWxlRW50cmllcywgaWRzLCBuYW1lcyk7CisKKyAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IG51bUZpbGVFbnRyaWVzOyBpICsrKSB7CisgICAgICAgICAgICBtRmlsZUVudHJpZXNbaV0gPSBuZXcgSW5kZXhFbnRyeShtUlMsIGksIG1JRCwgbmFtZXNbaV0sIENsYXNzSUQudG9DbGFzc0lEKGlkc1tpXSkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGludCBnZXROdW1JbmRleEVudHJpZXMoKSB7CisgICAgICAgIGlmKG1GaWxlRW50cmllcyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbUZpbGVFbnRyaWVzLmxlbmd0aDsKKyAgICB9CisKKyAgICBwdWJsaWMgSW5kZXhFbnRyeSBnZXRJbmRleEVudHJ5KGludCBpbmRleCkgeworICAgICAgICBpZihnZXROdW1JbmRleEVudHJpZXMoKSA9PSAwIHx8IGluZGV4IDwgMCB8fCBpbmRleCA+PSBtRmlsZUVudHJpZXMubGVuZ3RoKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbUZpbGVFbnRyaWVzW2luZGV4XTsKKyAgICB9CisKKyAgICBzdGF0aWMgcHVibGljIEZpbGVBM0QgY3JlYXRlRnJvbVJlc291cmNlKFJlbmRlclNjcmlwdCBycywgUmVzb3VyY2VzIHJlcywgaW50IGlkKQorICAgICAgICB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKKworICAgICAgICBycy52YWxpZGF0ZSgpOworICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmaW5hbCBUeXBlZFZhbHVlIHZhbHVlID0gbmV3IFR5cGVkVmFsdWUoKTsKKyAgICAgICAgICAgIGlzID0gcmVzLm9wZW5SYXdSZXNvdXJjZShpZCwgdmFsdWUpOworCisgICAgICAgICAgICBpbnQgYXNzZXQgPSAoKEFzc2V0TWFuYWdlci5Bc3NldElucHV0U3RyZWFtKSBpcykuZ2V0QXNzZXRJbnQoKTsKKworICAgICAgICAgICAgaW50IGZpbGVJZCA9IHJzLm5GaWxlQTNEQ3JlYXRlRnJvbUFzc2V0U3RyZWFtKGFzc2V0KTsKKworICAgICAgICAgICAgaWYoZmlsZUlkID09IDApIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJMb2FkIGZhaWxlZC4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZpbGVBM0QgZmEzZCA9IG5ldyBGaWxlQTNEKGZpbGVJZCwgcnMpOworICAgICAgICAgICAgZmEzZC5pbml0RW50cmllcygpOworICAgICAgICAgICAgcmV0dXJuIGZhM2Q7CisKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIElnbm9yZQorICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKGlzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBpcy5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gSWdub3JlCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9GbG9hdDIuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvRmxvYXQyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg5YmY3YgotLS0gL2Rldi9udWxsCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvRmxvYXQyLmphdmEKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5yZW5kZXJzY3JpcHQ7CisKK2ltcG9ydCBqYXZhLmxhbmcuTWF0aDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCisKKy8qKgorICogQGhpZGUKKyAqCisgKiovCitwdWJsaWMgY2xhc3MgRmxvYXQyIHsKKyAgICBwdWJsaWMgRmxvYXQyKCkgeworICAgIH0KKworICAgIHB1YmxpYyBGbG9hdDIoZmxvYXQgaW5pdFgsIGZsb2F0IGluaXRZKSB7CisgICAgICAgIHggPSBpbml0WDsKKyAgICAgICAgeSA9IGluaXRZOworICAgIH0KKworICAgIHB1YmxpYyBmbG9hdCB4OworICAgIHB1YmxpYyBmbG9hdCB5OworfQorCisKKworCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0Zsb2F0My5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9GbG9hdDMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYmUxNDBkCi0tLSAvZGV2L251bGwKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9GbG9hdDMuamF2YQpAQCAtMCwwICsxLDQzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnJlbmRlcnNjcmlwdDsKKworaW1wb3J0IGphdmEubGFuZy5NYXRoOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKKworLyoqCisgKiBAaGlkZQorICoKKyAqKi8KK3B1YmxpYyBjbGFzcyBGbG9hdDMgeworICAgIHB1YmxpYyBGbG9hdDMoKSB7CisgICAgfQorICAgIHB1YmxpYyBGbG9hdDMoZmxvYXQgaW5pdFgsIGZsb2F0IGluaXRZLCBmbG9hdCBpbml0WikgeworICAgICAgICB4ID0gaW5pdFg7CisgICAgICAgIHkgPSBpbml0WTsKKyAgICAgICAgeiA9IGluaXRaOworICAgIH0KKworICAgIHB1YmxpYyBmbG9hdCB4OworICAgIHB1YmxpYyBmbG9hdCB5OworICAgIHB1YmxpYyBmbG9hdCB6OworfQorCisKKworCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0Zsb2F0NC5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9GbG9hdDQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDc3MzJmCi0tLSAvZGV2L251bGwKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9GbG9hdDQuamF2YQpAQCAtMCwwICsxLDQ1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnJlbmRlcnNjcmlwdDsKKworaW1wb3J0IGphdmEubGFuZy5NYXRoOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKKworLyoqCisgKiBAaGlkZQorICoKKyAqKi8KK3B1YmxpYyBjbGFzcyBGbG9hdDQgeworICAgIHB1YmxpYyBGbG9hdDQoKSB7CisgICAgfQorCisgICAgcHVibGljIEZsb2F0NChmbG9hdCBpbml0WCwgZmxvYXQgaW5pdFksIGZsb2F0IGluaXRaLCBmbG9hdCBpbml0VykgeworICAgICAgICB4ID0gaW5pdFg7CisgICAgICAgIHkgPSBpbml0WTsKKyAgICAgICAgeiA9IGluaXRaOworICAgICAgICB3ID0gaW5pdFc7CisgICAgfQorCisgICAgcHVibGljIGZsb2F0IHg7CisgICAgcHVibGljIGZsb2F0IHk7CisgICAgcHVibGljIGZsb2F0IHo7CisgICAgcHVibGljIGZsb2F0IHc7Cit9CisKKworCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0ZvbnQuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvRm9udC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlMjUwMTQKLS0tIC9kZXYvbnVsbAorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0ZvbnQuamF2YQpAQCAtMCwwICsxLDE2NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5yZW5kZXJzY3JpcHQ7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQXNzZXRNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC51dGlsLlR5cGVkVmFsdWU7CisKKy8qKgorICogQGhpZGUKKyAqCisgKiovCitwdWJsaWMgY2xhc3MgRm9udCBleHRlbmRzIEJhc2VPYmogeworCisgICAgLy9UaGVzZSBoZWxwIHVzIGNyZWF0ZSBhIGZvbnQgYnkgZmFtaWx5IG5hbWUKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBzU2Fuc05hbWVzID0geworICAgICAgICAic2Fucy1zZXJpZiIsICJhcmlhbCIsICJoZWx2ZXRpY2EiLCAidGFob21hIiwgInZlcmRhbmEiCisgICAgfTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIHNTZXJpZk5hbWVzID0geworICAgICAgICAic2VyaWYiLCAidGltZXMiLCAidGltZXMgbmV3IHJvbWFuIiwgInBhbGF0aW5vIiwgImdlb3JnaWEiLCAiYmFza2VydmlsbGUiLAorICAgICAgICAiZ291ZHkiLCAiZmFudGFzeSIsICJjdXJzaXZlIiwgIklUQyBTdG9uZSBTZXJpZiIKKyAgICB9OworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gc01vbm9OYW1lcyA9IHsKKyAgICAgICAgIm1vbm9zcGFjZSIsICJjb3VyaWVyIiwgImNvdXJpZXIgbmV3IiwgIm1vbmFjbyIKKyAgICB9OworCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRm9udEZhbWlseSB7CisgICAgICAgIFN0cmluZ1tdIG1OYW1lczsKKyAgICAgICAgU3RyaW5nIG1Ob3JtYWxGaWxlTmFtZTsKKyAgICAgICAgU3RyaW5nIG1Cb2xkRmlsZU5hbWU7CisgICAgICAgIFN0cmluZyBtSXRhbGljRmlsZU5hbWU7CisgICAgICAgIFN0cmluZyBtQm9sZEl0YWxpY0ZpbGVOYW1lOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIEZvbnRGYW1pbHk+IHNGb250RmFtaWx5TWFwOworCisgICAgcHVibGljIGVudW0gU3R5bGUgeworICAgICAgICBOT1JNQUwsCisgICAgICAgIEJPTEQsCisgICAgICAgIElUQUxJQywKKyAgICAgICAgQk9MRF9JVEFMSUM7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRGYW1pbHlUb01hcChGb250RmFtaWx5IGZhbWlseSkgeworICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgZmFtaWx5Lm1OYW1lcy5sZW5ndGg7IGkgKyspIHsKKyAgICAgICAgICAgIHNGb250RmFtaWx5TWFwLnB1dChmYW1pbHkubU5hbWVzW2ldLCBmYW1pbHkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBpbml0Rm9udEZhbWlseU1hcCgpIHsKKyAgICAgICAgc0ZvbnRGYW1pbHlNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEZvbnRGYW1pbHk+KCk7CisKKyAgICAgICAgRm9udEZhbWlseSBzYW5zRmFtaWx5ID0gbmV3IEZvbnRGYW1pbHkoKTsKKyAgICAgICAgc2Fuc0ZhbWlseS5tTmFtZXMgPSBzU2Fuc05hbWVzOworICAgICAgICBzYW5zRmFtaWx5Lm1Ob3JtYWxGaWxlTmFtZSA9ICJEcm9pZFNhbnMudHRmIjsKKyAgICAgICAgc2Fuc0ZhbWlseS5tQm9sZEZpbGVOYW1lID0gIkRyb2lkU2Fucy1Cb2xkLnR0ZiI7CisgICAgICAgIHNhbnNGYW1pbHkubUl0YWxpY0ZpbGVOYW1lID0gIkRyb2lkU2Fucy50dGYiOworICAgICAgICBzYW5zRmFtaWx5Lm1Cb2xkSXRhbGljRmlsZU5hbWUgPSAiRHJvaWRTYW5zLUJvbGQudHRmIjsKKyAgICAgICAgYWRkRmFtaWx5VG9NYXAoc2Fuc0ZhbWlseSk7CisKKyAgICAgICAgRm9udEZhbWlseSBzZXJpZkZhbWlseSA9IG5ldyBGb250RmFtaWx5KCk7CisgICAgICAgIHNlcmlmRmFtaWx5Lm1OYW1lcyA9IHNTZXJpZk5hbWVzOworICAgICAgICBzZXJpZkZhbWlseS5tTm9ybWFsRmlsZU5hbWUgPSAiRHJvaWRTZXJpZi1SZWd1bGFyLnR0ZiI7CisgICAgICAgIHNlcmlmRmFtaWx5Lm1Cb2xkRmlsZU5hbWUgPSAiRHJvaWRTZXJpZi1Cb2xkLnR0ZiI7CisgICAgICAgIHNlcmlmRmFtaWx5Lm1JdGFsaWNGaWxlTmFtZSA9ICJEcm9pZFNlcmlmLUl0YWxpYy50dGYiOworICAgICAgICBzZXJpZkZhbWlseS5tQm9sZEl0YWxpY0ZpbGVOYW1lID0gIkRyb2lkU2VyaWYtQm9sZEl0YWxpYy50dGYiOworICAgICAgICBhZGRGYW1pbHlUb01hcChzZXJpZkZhbWlseSk7CisKKyAgICAgICAgRm9udEZhbWlseSBtb25vRmFtaWx5ID0gbmV3IEZvbnRGYW1pbHkoKTsKKyAgICAgICAgbW9ub0ZhbWlseS5tTmFtZXMgPSBzTW9ub05hbWVzOworICAgICAgICBtb25vRmFtaWx5Lm1Ob3JtYWxGaWxlTmFtZSA9ICJEcm9pZFNhbnNNb25vLnR0ZiI7CisgICAgICAgIG1vbm9GYW1pbHkubUJvbGRGaWxlTmFtZSA9ICJEcm9pZFNhbnNNb25vLnR0ZiI7CisgICAgICAgIG1vbm9GYW1pbHkubUl0YWxpY0ZpbGVOYW1lID0gIkRyb2lkU2Fuc01vbm8udHRmIjsKKyAgICAgICAgbW9ub0ZhbWlseS5tQm9sZEl0YWxpY0ZpbGVOYW1lID0gIkRyb2lkU2Fuc01vbm8udHRmIjsKKyAgICAgICAgYWRkRmFtaWx5VG9NYXAobW9ub0ZhbWlseSk7CisgICAgfQorCisgICAgc3RhdGljIHsKKyAgICAgICAgaW5pdEZvbnRGYW1pbHlNYXAoKTsKKyAgICB9CisKKyAgICBzdGF0aWMgU3RyaW5nIGdldEZvbnRGaWxlTmFtZShTdHJpbmcgZmFtaWx5TmFtZSwgU3R5bGUgc3R5bGUpIHsKKyAgICAgICAgRm9udEZhbWlseSBmYW1pbHkgPSBzRm9udEZhbWlseU1hcC5nZXQoZmFtaWx5TmFtZSk7CisgICAgICAgIGlmKGZhbWlseSAhPSBudWxsKSB7CisgICAgICAgICAgICBzd2l0Y2goc3R5bGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIE5PUk1BTDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbWlseS5tTm9ybWFsRmlsZU5hbWU7CisgICAgICAgICAgICAgICAgY2FzZSBCT0xEOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFtaWx5Lm1Cb2xkRmlsZU5hbWU7CisgICAgICAgICAgICAgICAgY2FzZSBJVEFMSUM6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYW1pbHkubUl0YWxpY0ZpbGVOYW1lOworICAgICAgICAgICAgICAgIGNhc2UgQk9MRF9JVEFMSUM6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYW1pbHkubUJvbGRJdGFsaWNGaWxlTmFtZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBGYWxsYmFjayBpZiB3ZSBjb3VsZCBub3QgZmluZCB0aGUgZGVzaXJlZCBmYW1pbHkKKyAgICAgICAgcmV0dXJuICJEcm9pZFNhbnMudHRmIjsKKyAgICB9CisKKyAgICBGb250KGludCBpZCwgUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIHN1cGVyKGlkLCBycyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGFrZXMgYSBzcGVjaWZpYyBmaWxlIG5hbWUgYXMgYW4gYXJndW1lbnQKKyAgICAgKi8KKyAgICBzdGF0aWMgcHVibGljIEZvbnQgY3JlYXRlKFJlbmRlclNjcmlwdCBycywgUmVzb3VyY2VzIHJlcywgU3RyaW5nIGZpbGVOYW1lLCBpbnQgc2l6ZSkKKyAgICAgICAgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CisKKyAgICAgICAgcnMudmFsaWRhdGUoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBkcGkgPSByZXMuZ2V0RGlzcGxheU1ldHJpY3MoKS5kZW5zaXR5RHBpOworICAgICAgICAgICAgaW50IGZvbnRJZCA9IHJzLm5Gb250Q3JlYXRlRnJvbUZpbGUoZmlsZU5hbWUsIHNpemUsIGRwaSk7CisKKyAgICAgICAgICAgIGlmKGZvbnRJZCA9PSAwKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiRmFpbGVkIGxvYWRpbmcgYSBmb250Iik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGb250IHJzRm9udCA9IG5ldyBGb250KGZvbnRJZCwgcnMpOworCisgICAgICAgICAgICByZXR1cm4gcnNGb250OworCisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBJZ25vcmUKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFjY2VwdHMgb25lIG9mIHRoZSBmb2xsb3dpbmcgZmFtaWx5IG5hbWVzIGFzIGFuIGFyZ3VtZW50CisgICAgICogYW5kIHdpbGwgYXR0ZW1wIHRvIHByb2R1Y2UgdGhlIGJlc3QgbWF0Y2ggd2l0aCBhIHN5c3RlbSBmb250CisgICAgICogInNhbnMtc2VyaWYiICJhcmlhbCIgImhlbHZldGljYSIgInRhaG9tYSIgInZlcmRhbmEiCisgICAgICogInNlcmlmIiAidGltZXMiICJ0aW1lcyBuZXcgcm9tYW4iICJwYWxhdGlubyIgImdlb3JnaWEiICJiYXNrZXJ2aWxsZSIKKyAgICAgKiAiZ291ZHkiICJmYW50YXN5IiAiY3Vyc2l2ZSIgIklUQyBTdG9uZSBTZXJpZiIKKyAgICAgKiAibW9ub3NwYWNlIiAiY291cmllciIgImNvdXJpZXIgbmV3IiAibW9uYWNvIgorICAgICAqIFJldHVybnMgZGVmYXVsdCBmb250IGlmIG5vIG1hdGNoIGNvdWxkIGJlIGZvdW5kCisgICAgICovCisgICAgc3RhdGljIHB1YmxpYyBGb250IGNyZWF0ZUZyb21GYW1pbHkoUmVuZGVyU2NyaXB0IHJzLCBSZXNvdXJjZXMgcmVzLCBTdHJpbmcgZmFtaWx5TmFtZSwgU3R5bGUgZm9udFN0eWxlLCBpbnQgc2l6ZSkKKyAgICB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGZpbGVOYW1lID0gZ2V0Rm9udEZpbGVOYW1lKGZhbWlseU5hbWUsIGZvbnRTdHlsZSk7CisgICAgICAgIHJldHVybiBjcmVhdGUocnMsIHJlcywgZmlsZU5hbWUsIHNpemUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvSW50Mi5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9JbnQyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZlMmZlOQotLS0gL2Rldi9udWxsCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvSW50Mi5qYXZhCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQucmVuZGVyc2NyaXB0OworCitpbXBvcnQgamF2YS5sYW5nLk1hdGg7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworCisvKioKKyAqIEBoaWRlCisgKgorICoqLworcHVibGljIGNsYXNzIEludDIgeworICAgIHB1YmxpYyBJbnQyKCkgeworICAgIH0KKworICAgIHB1YmxpYyBpbnQgeDsKKyAgICBwdWJsaWMgaW50IHk7Cit9CisKKworCisKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvSW50My5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9JbnQzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWIyNzUwOQotLS0gL2Rldi9udWxsCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvSW50My5qYXZhCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQucmVuZGVyc2NyaXB0OworCitpbXBvcnQgamF2YS5sYW5nLk1hdGg7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworCisvKioKKyAqIEBoaWRlCisgKgorICoqLworcHVibGljIGNsYXNzIEludDMgeworICAgIHB1YmxpYyBJbnQzKCkgeworICAgIH0KKworICAgIHB1YmxpYyBpbnQgeDsKKyAgICBwdWJsaWMgaW50IHk7CisgICAgcHVibGljIGludCB6OworfQorCisKKworCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0ludDQuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvSW50NC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkNmYzZjUKLS0tIC9kZXYvbnVsbAorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0ludDQuamF2YQpAQCAtMCwwICsxLDM4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnJlbmRlcnNjcmlwdDsKKworaW1wb3J0IGphdmEubGFuZy5NYXRoOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKKworLyoqCisgKiBAaGlkZQorICoKKyAqKi8KK3B1YmxpYyBjbGFzcyBJbnQ0IHsKKyAgICBwdWJsaWMgSW50NCgpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IHg7CisgICAgcHVibGljIGludCB5OworICAgIHB1YmxpYyBpbnQgejsKKyAgICBwdWJsaWMgaW50IHc7Cit9CisKKworCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0xpZ2h0LmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0xpZ2h0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhYjY1NmYuLjAwMDAwMDAKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9MaWdodC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5yZW5kZXJzY3JpcHQ7Ci0KLWltcG9ydCBhbmRyb2lkLnV0aWwuQ29uZmlnOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KLS8qKgotICogQGhpZGUKLSAqCi0gKiovCi1wdWJsaWMgY2xhc3MgTGlnaHQgZXh0ZW5kcyBCYXNlT2JqIHsKLSAgICBMaWdodChpbnQgaWQsIFJlbmRlclNjcmlwdCBycykgewotICAgICAgICBzdXBlcihycyk7Ci0gICAgICAgIG1JRCA9IGlkOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENvbG9yKGZsb2F0IHIsIGZsb2F0IGcsIGZsb2F0IGIpIHsKLSAgICAgICAgbVJTLnZhbGlkYXRlKCk7Ci0gICAgICAgIG1SUy5uTGlnaHRTZXRDb2xvcihtSUQsIHIsIGcsIGIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBvc2l0aW9uKGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopIHsKLSAgICAgICAgbVJTLnZhbGlkYXRlKCk7Ci0gICAgICAgIG1SUy5uTGlnaHRTZXRQb3NpdGlvbihtSUQsIHgsIHksIHopOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQnVpbGRlciB7Ci0gICAgICAgIFJlbmRlclNjcmlwdCBtUlM7Ci0gICAgICAgIGJvb2xlYW4gbUlzTW9ubzsKLSAgICAgICAgYm9vbGVhbiBtSXNMb2NhbDsKLQotICAgICAgICBwdWJsaWMgQnVpbGRlcihSZW5kZXJTY3JpcHQgcnMpIHsKLSAgICAgICAgICAgIG1SUyA9IHJzOwotICAgICAgICAgICAgbUlzTW9ubyA9IGZhbHNlOwotICAgICAgICAgICAgbUlzTG9jYWwgPSBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGxpZ2h0U2V0SXNNb25vKGJvb2xlYW4gaXNNb25vKSB7Ci0gICAgICAgICAgICBtSXNNb25vID0gaXNNb25vOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgbGlnaHRTZXRJc0xvY2FsKGJvb2xlYW4gaXNMb2NhbCkgewotICAgICAgICAgICAgbUlzTG9jYWwgPSBpc0xvY2FsOwotICAgICAgICB9Ci0KLSAgICAgICAgc3RhdGljIHN5bmNocm9uaXplZCBMaWdodCBpbnRlcm5hbENyZWF0ZShSZW5kZXJTY3JpcHQgcnMsIEJ1aWxkZXIgYikgewotICAgICAgICAgICAgcnMublNhbXBsZXJCZWdpbigpOwotICAgICAgICAgICAgcnMubkxpZ2h0U2V0SXNNb25vKGIubUlzTW9ubyk7Ci0gICAgICAgICAgICBycy5uTGlnaHRTZXRJc0xvY2FsKGIubUlzTG9jYWwpOwotICAgICAgICAgICAgaW50IGlkID0gcnMubkxpZ2h0Q3JlYXRlKCk7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IExpZ2h0KGlkLCBycyk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgTGlnaHQgY3JlYXRlKCkgewotICAgICAgICAgICAgbVJTLnZhbGlkYXRlKCk7Ci0gICAgICAgICAgICByZXR1cm4gaW50ZXJuYWxDcmVhdGUobVJTLCB0aGlzKTsKLSAgICAgICAgfQotICAgIH0KLQotfQotCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0xvbmcyLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0xvbmcyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFlYWQyZgotLS0gL2Rldi9udWxsCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvTG9uZzIuamF2YQpAQCAtMCwwICsxLDM3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnJlbmRlcnNjcmlwdDsKKworaW1wb3J0IGphdmEubGFuZy5NYXRoOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKKworLyoqCisgKiBAaGlkZQorICoKKyAqKi8KK3B1YmxpYyBjbGFzcyBMb25nMiB7CisgICAgcHVibGljIExvbmcyKCkgeworICAgIH0KKworICAgIHB1YmxpYyBsb25nIHg7CisgICAgcHVibGljIGxvbmcgeTsKK30KKworCisKKwpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9Mb25nMy5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9Mb25nMy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2MDQ1MzIKLS0tIC9kZXYvbnVsbAorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0xvbmczLmphdmEKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5yZW5kZXJzY3JpcHQ7CisKK2ltcG9ydCBqYXZhLmxhbmcuTWF0aDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCisKKy8qKgorICogQGhpZGUKKyAqCisgKiovCitwdWJsaWMgY2xhc3MgTG9uZzMgeworICAgIHB1YmxpYyBMb25nMygpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgbG9uZyB4OworICAgIHB1YmxpYyBsb25nIHk7CisgICAgcHVibGljIGxvbmcgejsKK30KKworCisKKwpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9Mb25nNC5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9Mb25nNC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmZDI3NDcKLS0tIC9kZXYvbnVsbAorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0xvbmc0LmphdmEKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5yZW5kZXJzY3JpcHQ7CisKK2ltcG9ydCBqYXZhLmxhbmcuTWF0aDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCisKKy8qKgorICogQGhpZGUKKyAqCisgKiovCitwdWJsaWMgY2xhc3MgTG9uZzQgeworICAgIHB1YmxpYyBMb25nNCgpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgbG9uZyB4OworICAgIHB1YmxpYyBsb25nIHk7CisgICAgcHVibGljIGxvbmcgejsKKyAgICBwdWJsaWMgbG9uZyB3OworfQorCisKKwpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9NYXRyaXgyZi5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9NYXRyaXgyZi5qYXZhCmluZGV4IDRiNWU2MWIuLjk5ZDIzZGIgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvTWF0cml4MmYuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L01hdHJpeDJmLmphdmEKQEAgLTUxLDYgKzUxLDU3IEBACiAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkobU1hdCwgMCwgc3JjLCAwLCA0KTsKICAgICB9CiAKKyAgICBwdWJsaWMgdm9pZCBsb2FkUm90YXRlKGZsb2F0IHJvdCkgeworICAgICAgICBmbG9hdCBjLCBzOworICAgICAgICByb3QgKj0gKGZsb2F0KShqYXZhLmxhbmcuTWF0aC5QSSAvIDE4MC4wZik7CisgICAgICAgIGMgPSAoZmxvYXQpamF2YS5sYW5nLk1hdGguY29zKHJvdCk7CisgICAgICAgIHMgPSAoZmxvYXQpamF2YS5sYW5nLk1hdGguc2luKHJvdCk7CisgICAgICAgIG1NYXRbMF0gPSBjOworICAgICAgICBtTWF0WzFdID0gLXM7CisgICAgICAgIG1NYXRbMl0gPSBzOworICAgICAgICBtTWF0WzNdID0gYzsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBsb2FkU2NhbGUoZmxvYXQgeCwgZmxvYXQgeSkgeworICAgICAgICBsb2FkSWRlbnRpdHkoKTsKKyAgICAgICAgbU1hdFswXSA9IHg7CisgICAgICAgIG1NYXRbM10gPSB5OworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBsb2FkTXVsdGlwbHkoTWF0cml4MmYgbGhzLCBNYXRyaXgyZiByaHMpIHsKKyAgICAgICAgZm9yIChpbnQgaT0wIDsgaTwyIDsgaSsrKSB7CisgICAgICAgICAgICBmbG9hdCByaTAgPSAwOworICAgICAgICAgICAgZmxvYXQgcmkxID0gMDsKKyAgICAgICAgICAgIGZvciAoaW50IGo9MCA7IGo8MiA7IGorKykgeworICAgICAgICAgICAgICAgIGZsb2F0IHJoc19paiA9IHJocy5nZXQoaSxqKTsKKyAgICAgICAgICAgICAgICByaTAgKz0gbGhzLmdldChqLDApICogcmhzX2lqOworICAgICAgICAgICAgICAgIHJpMSArPSBsaHMuZ2V0KGosMSkgKiByaHNfaWo7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQoaSwwLCByaTApOworICAgICAgICAgICAgc2V0KGksMSwgcmkxKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG11bHRpcGx5KE1hdHJpeDJmIHJocykgeworICAgICAgICBNYXRyaXgyZiB0bXAgPSBuZXcgTWF0cml4MmYoKTsKKyAgICAgICAgdG1wLmxvYWRNdWx0aXBseSh0aGlzLCByaHMpOworICAgICAgICBsb2FkKHRtcCk7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHJvdGF0ZShmbG9hdCByb3QpIHsKKyAgICAgICAgTWF0cml4MmYgdG1wID0gbmV3IE1hdHJpeDJmKCk7CisgICAgICAgIHRtcC5sb2FkUm90YXRlKHJvdCk7CisgICAgICAgIG11bHRpcGx5KHRtcCk7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHNjYWxlKGZsb2F0IHgsIGZsb2F0IHkpIHsKKyAgICAgICAgTWF0cml4MmYgdG1wID0gbmV3IE1hdHJpeDJmKCk7CisgICAgICAgIHRtcC5sb2FkU2NhbGUoeCwgeSk7CisgICAgICAgIG11bHRpcGx5KHRtcCk7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHRyYW5zcG9zZSgpIHsKKyAgICAgICAgZmxvYXQgdGVtcCA9IG1NYXRbMV07CisgICAgICAgIG1NYXRbMV0gPSBtTWF0WzJdOworICAgICAgICBtTWF0WzJdID0gdGVtcDsKKyAgICB9CisKICAgICBmaW5hbCBmbG9hdFtdIG1NYXQ7CiB9CiAKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvTWF0cml4M2YuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvTWF0cml4M2YuamF2YQppbmRleCAxOWQ3YjQzLi45NjFiYzVkIDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L01hdHJpeDNmLmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9NYXRyaXgzZi5qYXZhCkBAIC01Nyw2ICs1NywxMjQgQEAKICAgICAgICAgU3lzdGVtLmFycmF5Y29weShtTWF0LCAwLCBzcmMsIDAsIDkpOwogICAgIH0KIAorICAgIHB1YmxpYyB2b2lkIGxvYWRSb3RhdGUoZmxvYXQgcm90LCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KSB7CisgICAgICAgIGZsb2F0IGMsIHM7CisgICAgICAgIHJvdCAqPSAoZmxvYXQpKGphdmEubGFuZy5NYXRoLlBJIC8gMTgwLjBmKTsKKyAgICAgICAgYyA9IChmbG9hdClqYXZhLmxhbmcuTWF0aC5jb3Mocm90KTsKKyAgICAgICAgcyA9IChmbG9hdClqYXZhLmxhbmcuTWF0aC5zaW4ocm90KTsKKworICAgICAgICBmbG9hdCBsZW4gPSAoZmxvYXQpamF2YS5sYW5nLk1hdGguc3FydCh4KnggKyB5KnkgKyB6KnopOworICAgICAgICBpZiAoIShsZW4gIT0gMSkpIHsKKyAgICAgICAgICAgIGZsb2F0IHJlY2lwTGVuID0gMS5mIC8gbGVuOworICAgICAgICAgICAgeCAqPSByZWNpcExlbjsKKyAgICAgICAgICAgIHkgKj0gcmVjaXBMZW47CisgICAgICAgICAgICB6ICo9IHJlY2lwTGVuOworICAgICAgICB9CisgICAgICAgIGZsb2F0IG5jID0gMS4wZiAtIGM7CisgICAgICAgIGZsb2F0IHh5ID0geCAqIHk7CisgICAgICAgIGZsb2F0IHl6ID0geSAqIHo7CisgICAgICAgIGZsb2F0IHp4ID0geiAqIHg7CisgICAgICAgIGZsb2F0IHhzID0geCAqIHM7CisgICAgICAgIGZsb2F0IHlzID0geSAqIHM7CisgICAgICAgIGZsb2F0IHpzID0geiAqIHM7CisgICAgICAgIG1NYXRbMF0gPSB4KngqbmMgKyAgYzsKKyAgICAgICAgbU1hdFszXSA9ICB4eSpuYyAtIHpzOworICAgICAgICBtTWF0WzZdID0gIHp4Km5jICsgeXM7CisgICAgICAgIG1NYXRbMV0gPSAgeHkqbmMgKyB6czsKKyAgICAgICAgbU1hdFs0XSA9IHkqeSpuYyArICBjOworICAgICAgICBtTWF0WzldID0gIHl6Km5jIC0geHM7CisgICAgICAgIG1NYXRbMl0gPSAgengqbmMgLSB5czsKKyAgICAgICAgbU1hdFs2XSA9ICB5eipuYyArIHhzOworICAgICAgICBtTWF0WzhdID0geip6Km5jICsgIGM7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbG9hZFJvdGF0ZShmbG9hdCByb3QpIHsKKyAgICAgICAgZmxvYXQgYywgczsKKyAgICAgICAgcm90ICo9IChmbG9hdCkoamF2YS5sYW5nLk1hdGguUEkgLyAxODAuMGYpOworICAgICAgICBjID0gKGZsb2F0KWphdmEubGFuZy5NYXRoLmNvcyhyb3QpOworICAgICAgICBzID0gKGZsb2F0KWphdmEubGFuZy5NYXRoLnNpbihyb3QpOworICAgICAgICBtTWF0WzBdID0gYzsKKyAgICAgICAgbU1hdFsxXSA9IC1zOworICAgICAgICBtTWF0WzNdID0gczsKKyAgICAgICAgbU1hdFs0XSA9IGM7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbG9hZFNjYWxlKGZsb2F0IHgsIGZsb2F0IHkpIHsKKyAgICAgICAgbG9hZElkZW50aXR5KCk7CisgICAgICAgIG1NYXRbMF0gPSB4OworICAgICAgICBtTWF0WzRdID0geTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBsb2FkU2NhbGUoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeikgeworICAgICAgICBsb2FkSWRlbnRpdHkoKTsKKyAgICAgICAgbU1hdFswXSA9IHg7CisgICAgICAgIG1NYXRbNF0gPSB5OworICAgICAgICBtTWF0WzhdID0gejsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBsb2FkVHJhbnNsYXRlKGZsb2F0IHgsIGZsb2F0IHkpIHsKKyAgICAgICAgbG9hZElkZW50aXR5KCk7CisgICAgICAgIG1NYXRbNl0gPSB4OworICAgICAgICBtTWF0WzddID0geTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBsb2FkTXVsdGlwbHkoTWF0cml4M2YgbGhzLCBNYXRyaXgzZiByaHMpIHsKKyAgICAgICAgZm9yIChpbnQgaT0wIDsgaTwzIDsgaSsrKSB7CisgICAgICAgICAgICBmbG9hdCByaTAgPSAwOworICAgICAgICAgICAgZmxvYXQgcmkxID0gMDsKKyAgICAgICAgICAgIGZsb2F0IHJpMiA9IDA7CisgICAgICAgICAgICBmb3IgKGludCBqPTAgOyBqPDMgOyBqKyspIHsKKyAgICAgICAgICAgICAgICBmbG9hdCByaHNfaWogPSByaHMuZ2V0KGksaik7CisgICAgICAgICAgICAgICAgcmkwICs9IGxocy5nZXQoaiwwKSAqIHJoc19pajsKKyAgICAgICAgICAgICAgICByaTEgKz0gbGhzLmdldChqLDEpICogcmhzX2lqOworICAgICAgICAgICAgICAgIHJpMiArPSBsaHMuZ2V0KGosMikgKiByaHNfaWo7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQoaSwwLCByaTApOworICAgICAgICAgICAgc2V0KGksMSwgcmkxKTsKKyAgICAgICAgICAgIHNldChpLDIsIHJpMik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBtdWx0aXBseShNYXRyaXgzZiByaHMpIHsKKyAgICAgICAgTWF0cml4M2YgdG1wID0gbmV3IE1hdHJpeDNmKCk7CisgICAgICAgIHRtcC5sb2FkTXVsdGlwbHkodGhpcywgcmhzKTsKKyAgICAgICAgbG9hZCh0bXApOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCByb3RhdGUoZmxvYXQgcm90LCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KSB7CisgICAgICAgIE1hdHJpeDNmIHRtcCA9IG5ldyBNYXRyaXgzZigpOworICAgICAgICB0bXAubG9hZFJvdGF0ZShyb3QsIHgsIHksIHopOworICAgICAgICBtdWx0aXBseSh0bXApOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCByb3RhdGUoZmxvYXQgcm90KSB7CisgICAgICAgIE1hdHJpeDNmIHRtcCA9IG5ldyBNYXRyaXgzZigpOworICAgICAgICB0bXAubG9hZFJvdGF0ZShyb3QpOworICAgICAgICBtdWx0aXBseSh0bXApOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBzY2FsZShmbG9hdCB4LCBmbG9hdCB5KSB7CisgICAgICAgIE1hdHJpeDNmIHRtcCA9IG5ldyBNYXRyaXgzZigpOworICAgICAgICB0bXAubG9hZFNjYWxlKHgsIHkpOworICAgICAgICBtdWx0aXBseSh0bXApOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBzY2FsZShmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KSB7CisgICAgICAgIE1hdHJpeDNmIHRtcCA9IG5ldyBNYXRyaXgzZigpOworICAgICAgICB0bXAubG9hZFNjYWxlKHgsIHksIHopOworICAgICAgICBtdWx0aXBseSh0bXApOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCB0cmFuc2xhdGUoZmxvYXQgeCwgZmxvYXQgeSkgeworICAgICAgICBNYXRyaXgzZiB0bXAgPSBuZXcgTWF0cml4M2YoKTsKKyAgICAgICAgdG1wLmxvYWRUcmFuc2xhdGUoeCwgeSk7CisgICAgICAgIG11bHRpcGx5KHRtcCk7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHRyYW5zcG9zZSgpIHsKKyAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IDI7ICsraSkgeworICAgICAgICAgICAgZm9yKGludCBqID0gaSArIDE7IGogPCAzOyArK2opIHsKKyAgICAgICAgICAgICAgICBmbG9hdCB0ZW1wID0gbU1hdFtpKjMgKyBqXTsKKyAgICAgICAgICAgICAgICBtTWF0W2kqMyArIGpdID0gbU1hdFtqKjMgKyBpXTsKKyAgICAgICAgICAgICAgICBtTWF0W2oqMyArIGldID0gdGVtcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKwogICAgIGZpbmFsIGZsb2F0W10gbU1hdDsKIH0KIApkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9NYXRyaXg0Zi5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9NYXRyaXg0Zi5qYXZhCmluZGV4IGViZDViZGUuLjVmZmMyMWEgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvTWF0cml4NGYuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L01hdHJpeDRmLmphdmEKQEAgLTE3OSw2ICsxNzksODUgQEAKICAgICAgICAgdG1wLmxvYWRUcmFuc2xhdGUoeCwgeSwgeik7CiAgICAgICAgIG11bHRpcGx5KHRtcCk7CiAgICAgfQorICAgIHByaXZhdGUgZmxvYXQgY29tcHV0ZUNvZmFjdG9yKGludCBpLCBpbnQgaikgeworICAgICAgICBpbnQgYzAgPSAoaSsxKSAlIDQ7CisgICAgICAgIGludCBjMSA9IChpKzIpICUgNDsKKyAgICAgICAgaW50IGMyID0gKGkrMykgJSA0OworICAgICAgICBpbnQgcjAgPSAoaisxKSAlIDQ7CisgICAgICAgIGludCByMSA9IChqKzIpICUgNDsKKyAgICAgICAgaW50IHIyID0gKGorMykgJSA0OworCisgICAgICAgIGZsb2F0IG1pbm9yID0gKG1NYXRbYzAgKyA0KnIwXSAqIChtTWF0W2MxICsgNCpyMV0gKiBtTWF0W2MyICsgNCpyMl0gLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTWF0W2MxICsgNCpyMl0gKiBtTWF0W2MyICsgNCpyMV0pKQorICAgICAgICAgICAgICAgICAgICAgLSAobU1hdFtjMCArIDQqcjFdICogKG1NYXRbYzEgKyA0KnIwXSAqIG1NYXRbYzIgKyA0KnIyXSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1NYXRbYzEgKyA0KnIyXSAqIG1NYXRbYzIgKyA0KnIwXSkpCisgICAgICAgICAgICAgICAgICAgICArIChtTWF0W2MwICsgNCpyMl0gKiAobU1hdFtjMSArIDQqcjBdICogbU1hdFtjMiArIDQqcjFdIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1hdFtjMSArIDQqcjFdICogbU1hdFtjMiArIDQqcjBdKSk7CisKKyAgICAgICAgZmxvYXQgY29mYWN0b3IgPSAoKGkraikgJiAxKSAhPSAwID8gLW1pbm9yIDogbWlub3I7CisgICAgICAgIHJldHVybiBjb2ZhY3RvcjsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpbnZlcnNlKCkgeworCisgICAgICAgIE1hdHJpeDRmIHJlc3VsdCA9IG5ldyBNYXRyaXg0ZigpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgKytpKSB7CisgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IDQ7ICsraikgeworICAgICAgICAgICAgICAgIHJlc3VsdC5tTWF0WzQqaSArIGpdID0gY29tcHV0ZUNvZmFjdG9yKGksIGopOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gRG90IHByb2R1Y3Qgb2YgMHRoIGNvbHVtbiBvZiBzb3VyY2UgYW5kIDB0aCByb3cgb2YgcmVzdWx0CisgICAgICAgIGZsb2F0IGRldCA9IG1NYXRbMF0qcmVzdWx0Lm1NYXRbMF0gKyBtTWF0WzRdKnJlc3VsdC5tTWF0WzFdICsKKyAgICAgICAgICAgICAgICAgICAgIG1NYXRbOF0qcmVzdWx0Lm1NYXRbMl0gKyBtTWF0WzEyXSpyZXN1bHQubU1hdFszXTsKKworICAgICAgICBpZiAoTWF0aC5hYnMoZGV0KSA8IDFlLTYpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGRldCA9IDEuMGYgLyBkZXQ7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTY7ICsraSkgeworICAgICAgICAgICAgbU1hdFtpXSA9IHJlc3VsdC5tTWF0W2ldICogZGV0OworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaW52ZXJzZVRyYW5zcG9zZSgpIHsKKworICAgICAgICBNYXRyaXg0ZiByZXN1bHQgPSBuZXcgTWF0cml4NGYoKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDQ7ICsraSkgeworICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCA0OyArK2opIHsKKyAgICAgICAgICAgICAgICByZXN1bHQubU1hdFs0KmogKyBpXSA9IGNvbXB1dGVDb2ZhY3RvcihpLCBqKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZsb2F0IGRldCA9IG1NYXRbMF0qcmVzdWx0Lm1NYXRbMF0gKyBtTWF0WzRdKnJlc3VsdC5tTWF0WzRdICsKKyAgICAgICAgICAgICAgICAgICAgIG1NYXRbOF0qcmVzdWx0Lm1NYXRbOF0gKyBtTWF0WzEyXSpyZXN1bHQubU1hdFsxMl07CisKKyAgICAgICAgaWYgKE1hdGguYWJzKGRldCkgPCAxZS02KSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBkZXQgPSAxLjBmIC8gZGV0OworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDE2OyArK2kpIHsKKyAgICAgICAgICAgIG1NYXRbaV0gPSByZXN1bHQubU1hdFtpXSAqIGRldDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRyYW5zcG9zZSgpIHsKKyAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IDM7ICsraSkgeworICAgICAgICAgICAgZm9yKGludCBqID0gaSArIDE7IGogPCA0OyArK2opIHsKKyAgICAgICAgICAgICAgICBmbG9hdCB0ZW1wID0gbU1hdFtpKjQgKyBqXTsKKyAgICAgICAgICAgICAgICBtTWF0W2kqNCArIGpdID0gbU1hdFtqKjQgKyBpXTsKKyAgICAgICAgICAgICAgICBtTWF0W2oqNCArIGldID0gdGVtcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIAogICAgIGZpbmFsIGZsb2F0W10gbU1hdDsKIH0KZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvTWVzaC5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9NZXNoLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc0YzFmOAotLS0gL2Rldi9udWxsCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvTWVzaC5qYXZhCkBAIC0wLDAgKzEsNDc5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnJlbmRlcnNjcmlwdDsKKworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CisKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQ29uZmlnOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKKy8qKgorICogQGhpZGUKKyAqCisgKiovCitwdWJsaWMgY2xhc3MgTWVzaCBleHRlbmRzIEJhc2VPYmogeworCisgICAgQWxsb2NhdGlvbltdIG1WZXJ0ZXhCdWZmZXJzOworICAgIEFsbG9jYXRpb25bXSBtSW5kZXhCdWZmZXJzOworICAgIFByaW1pdGl2ZVtdIG1QcmltaXRpdmVzOworCisgICAgTWVzaChpbnQgaWQsIFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBzdXBlcihpZCwgcnMpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0VmVydGV4QWxsb2NhdGlvbkNvdW50KCkgeworICAgICAgICBpZihtVmVydGV4QnVmZmVycyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbVZlcnRleEJ1ZmZlcnMubGVuZ3RoOworICAgIH0KKyAgICBwdWJsaWMgQWxsb2NhdGlvbiBnZXRWZXJ0ZXhBbGxvY2F0aW9uKGludCBzbG90KSB7CisgICAgICAgIHJldHVybiBtVmVydGV4QnVmZmVyc1tzbG90XTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFByaW1pdGl2ZUNvdW50KCkgeworICAgICAgICBpZihtSW5kZXhCdWZmZXJzID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtSW5kZXhCdWZmZXJzLmxlbmd0aDsKKyAgICB9CisgICAgcHVibGljIEFsbG9jYXRpb24gZ2V0SW5kZXhBbGxvY2F0aW9uKGludCBzbG90KSB7CisgICAgICAgIHJldHVybiBtSW5kZXhCdWZmZXJzW3Nsb3RdOworICAgIH0KKyAgICBwdWJsaWMgUHJpbWl0aXZlIGdldFByaW1pdGl2ZShpbnQgc2xvdCkgeworICAgICAgICByZXR1cm4gbVByaW1pdGl2ZXNbc2xvdF07CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgdm9pZCB1cGRhdGVGcm9tTmF0aXZlKCkgeworICAgICAgICBtTmFtZSA9IG1SUy5uR2V0TmFtZShtSUQpOworICAgICAgICBpbnQgdnR4Q291bnQgPSBtUlMubk1lc2hHZXRWZXJ0ZXhCdWZmZXJDb3VudChtSUQpOworICAgICAgICBpbnQgaWR4Q291bnQgPSBtUlMubk1lc2hHZXRJbmRleENvdW50KG1JRCk7CisKKyAgICAgICAgaW50W10gdnR4SURzID0gbmV3IGludFt2dHhDb3VudF07CisgICAgICAgIGludFtdIGlkeElEcyA9IG5ldyBpbnRbaWR4Q291bnRdOworICAgICAgICBpbnRbXSBwcmltaXRpdmVzID0gbmV3IGludFtpZHhDb3VudF07CisKKyAgICAgICAgbVJTLm5NZXNoR2V0VmVydGljZXMobUlELCB2dHhJRHMsIHZ0eENvdW50KTsKKyAgICAgICAgbVJTLm5NZXNoR2V0SW5kaWNlcyhtSUQsIGlkeElEcywgcHJpbWl0aXZlcywgdnR4Q291bnQpOworCisgICAgICAgIG1WZXJ0ZXhCdWZmZXJzID0gbmV3IEFsbG9jYXRpb25bdnR4Q291bnRdOworICAgICAgICBtSW5kZXhCdWZmZXJzID0gbmV3IEFsbG9jYXRpb25baWR4Q291bnRdOworICAgICAgICBtUHJpbWl0aXZlcyA9IG5ldyBQcmltaXRpdmVbaWR4Q291bnRdOworCisgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCB2dHhDb3VudDsgaSArKykgeworICAgICAgICAgICAgaWYodnR4SURzW2ldICE9IDApIHsKKyAgICAgICAgICAgICAgICBtVmVydGV4QnVmZmVyc1tpXSA9IG5ldyBBbGxvY2F0aW9uKHZ0eElEc1tpXSwgbVJTKTsKKyAgICAgICAgICAgICAgICBtVmVydGV4QnVmZmVyc1tpXS51cGRhdGVGcm9tTmF0aXZlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgaWR4Q291bnQ7IGkgKyspIHsKKyAgICAgICAgICAgIGlmKGlkeElEc1tpXSAhPSAwKSB7CisgICAgICAgICAgICAgICAgbUluZGV4QnVmZmVyc1tpXSA9IG5ldyBBbGxvY2F0aW9uKGlkeElEc1tpXSwgbVJTKTsKKyAgICAgICAgICAgICAgICBtSW5kZXhCdWZmZXJzW2ldLnVwZGF0ZUZyb21OYXRpdmUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1QcmltaXRpdmVzW2ldID0gUHJpbWl0aXZlLnZhbHVlcygpW3ByaW1pdGl2ZXNbaV1dOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBCdWlsZGVyIHsKKyAgICAgICAgUmVuZGVyU2NyaXB0IG1SUzsKKworICAgICAgICBjbGFzcyBFbnRyeSB7CisgICAgICAgICAgICBUeXBlIHQ7CisgICAgICAgICAgICBFbGVtZW50IGU7CisgICAgICAgICAgICBpbnQgc2l6ZTsKKyAgICAgICAgICAgIFByaW1pdGl2ZSBwcmltOworICAgICAgICB9CisKKyAgICAgICAgaW50IG1WZXJ0ZXhUeXBlQ291bnQ7CisgICAgICAgIEVudHJ5W10gbVZlcnRleFR5cGVzOworICAgICAgICBWZWN0b3IgbUluZGV4VHlwZXM7CisKKyAgICAgICAgcHVibGljIEJ1aWxkZXIoUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgICAgICBtUlMgPSByczsKKyAgICAgICAgICAgIG1WZXJ0ZXhUeXBlQ291bnQgPSAwOworICAgICAgICAgICAgbVZlcnRleFR5cGVzID0gbmV3IEVudHJ5WzE2XTsKKyAgICAgICAgICAgIG1JbmRleFR5cGVzID0gbmV3IFZlY3RvcigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBhZGRWZXJ0ZXhUeXBlKFR5cGUgdCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7CisgICAgICAgICAgICBpZiAobVZlcnRleFR5cGVDb3VudCA+PSBtVmVydGV4VHlwZXMubGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiTWF4IHZlcnRleCB0eXBlcyBleGNlZWRlZC4iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50IGFkZGVkSW5kZXggPSBtVmVydGV4VHlwZUNvdW50OworICAgICAgICAgICAgbVZlcnRleFR5cGVzW21WZXJ0ZXhUeXBlQ291bnRdID0gbmV3IEVudHJ5KCk7CisgICAgICAgICAgICBtVmVydGV4VHlwZXNbbVZlcnRleFR5cGVDb3VudF0udCA9IHQ7CisgICAgICAgICAgICBtVmVydGV4VHlwZXNbbVZlcnRleFR5cGVDb3VudF0uZSA9IG51bGw7CisgICAgICAgICAgICBtVmVydGV4VHlwZUNvdW50Kys7CisgICAgICAgICAgICByZXR1cm4gYWRkZWRJbmRleDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgYWRkVmVydGV4VHlwZShFbGVtZW50IGUsIGludCBzaXplKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGlmIChtVmVydGV4VHlwZUNvdW50ID49IG1WZXJ0ZXhUeXBlcy5sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJNYXggdmVydGV4IHR5cGVzIGV4Y2VlZGVkLiIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnQgYWRkZWRJbmRleCA9IG1WZXJ0ZXhUeXBlQ291bnQ7CisgICAgICAgICAgICBtVmVydGV4VHlwZXNbbVZlcnRleFR5cGVDb3VudF0gPSBuZXcgRW50cnkoKTsKKyAgICAgICAgICAgIG1WZXJ0ZXhUeXBlc1ttVmVydGV4VHlwZUNvdW50XS50ID0gbnVsbDsKKyAgICAgICAgICAgIG1WZXJ0ZXhUeXBlc1ttVmVydGV4VHlwZUNvdW50XS5lID0gZTsKKyAgICAgICAgICAgIG1WZXJ0ZXhUeXBlc1ttVmVydGV4VHlwZUNvdW50XS5zaXplID0gc2l6ZTsKKyAgICAgICAgICAgIG1WZXJ0ZXhUeXBlQ291bnQrKzsKKyAgICAgICAgICAgIHJldHVybiBhZGRlZEluZGV4OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBhZGRJbmRleFR5cGUoVHlwZSB0LCBQcmltaXRpdmUgcCkgeworICAgICAgICAgICAgaW50IGFkZGVkSW5kZXggID0gbUluZGV4VHlwZXMuc2l6ZSgpOworICAgICAgICAgICAgRW50cnkgaW5kZXhUeXBlID0gbmV3IEVudHJ5KCk7CisgICAgICAgICAgICBpbmRleFR5cGUudCA9IHQ7CisgICAgICAgICAgICBpbmRleFR5cGUuZSA9IG51bGw7CisgICAgICAgICAgICBpbmRleFR5cGUuc2l6ZSA9IDA7CisgICAgICAgICAgICBpbmRleFR5cGUucHJpbSA9IHA7CisgICAgICAgICAgICBtSW5kZXhUeXBlcy5hZGRFbGVtZW50KGluZGV4VHlwZSk7CisgICAgICAgICAgICByZXR1cm4gYWRkZWRJbmRleDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgYWRkSW5kZXhUeXBlKFByaW1pdGl2ZSBwKSB7CisgICAgICAgICAgICBpbnQgYWRkZWRJbmRleCAgPSBtSW5kZXhUeXBlcy5zaXplKCk7CisgICAgICAgICAgICBFbnRyeSBpbmRleFR5cGUgPSBuZXcgRW50cnkoKTsKKyAgICAgICAgICAgIGluZGV4VHlwZS50ID0gbnVsbDsKKyAgICAgICAgICAgIGluZGV4VHlwZS5lID0gbnVsbDsKKyAgICAgICAgICAgIGluZGV4VHlwZS5zaXplID0gMDsKKyAgICAgICAgICAgIGluZGV4VHlwZS5wcmltID0gcDsKKyAgICAgICAgICAgIG1JbmRleFR5cGVzLmFkZEVsZW1lbnQoaW5kZXhUeXBlKTsKKyAgICAgICAgICAgIHJldHVybiBhZGRlZEluZGV4OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBhZGRJbmRleFR5cGUoRWxlbWVudCBlLCBpbnQgc2l6ZSwgUHJpbWl0aXZlIHApIHsKKyAgICAgICAgICAgIGludCBhZGRlZEluZGV4ICA9IG1JbmRleFR5cGVzLnNpemUoKTsKKyAgICAgICAgICAgIEVudHJ5IGluZGV4VHlwZSA9IG5ldyBFbnRyeSgpOworICAgICAgICAgICAgaW5kZXhUeXBlLnQgPSBudWxsOworICAgICAgICAgICAgaW5kZXhUeXBlLmUgPSBlOworICAgICAgICAgICAgaW5kZXhUeXBlLnNpemUgPSBzaXplOworICAgICAgICAgICAgaW5kZXhUeXBlLnByaW0gPSBwOworICAgICAgICAgICAgbUluZGV4VHlwZXMuYWRkRWxlbWVudChpbmRleFR5cGUpOworICAgICAgICAgICAgcmV0dXJuIGFkZGVkSW5kZXg7CisgICAgICAgIH0KKworICAgICAgICBUeXBlIG5ld1R5cGUoRWxlbWVudCBlLCBpbnQgc2l6ZSkgeworICAgICAgICAgICAgVHlwZS5CdWlsZGVyIHRiID0gbmV3IFR5cGUuQnVpbGRlcihtUlMsIGUpOworICAgICAgICAgICAgdGIuYWRkKERpbWVuc2lvbi5YLCBzaXplKTsKKyAgICAgICAgICAgIHJldHVybiB0Yi5jcmVhdGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXRpYyBzeW5jaHJvbml6ZWQgTWVzaCBpbnRlcm5hbENyZWF0ZShSZW5kZXJTY3JpcHQgcnMsIEJ1aWxkZXIgYikgeworCisgICAgICAgICAgICBpbnQgaWQgPSBycy5uTWVzaENyZWF0ZShiLm1WZXJ0ZXhUeXBlQ291bnQsIGIubUluZGV4VHlwZXMuc2l6ZSgpKTsKKyAgICAgICAgICAgIE1lc2ggbmV3TWVzaCA9IG5ldyBNZXNoKGlkLCBycyk7CisgICAgICAgICAgICBuZXdNZXNoLm1JbmRleEJ1ZmZlcnMgPSBuZXcgQWxsb2NhdGlvbltiLm1JbmRleFR5cGVzLnNpemUoKV07CisgICAgICAgICAgICBuZXdNZXNoLm1QcmltaXRpdmVzID0gbmV3IFByaW1pdGl2ZVtiLm1JbmRleFR5cGVzLnNpemUoKV07CisgICAgICAgICAgICBuZXdNZXNoLm1WZXJ0ZXhCdWZmZXJzID0gbmV3IEFsbG9jYXRpb25bYi5tVmVydGV4VHlwZUNvdW50XTsKKworICAgICAgICAgICAgZm9yKGludCBjdCA9IDA7IGN0IDwgYi5tSW5kZXhUeXBlcy5zaXplKCk7IGN0ICsrKSB7CisgICAgICAgICAgICAgICAgQWxsb2NhdGlvbiBhbGxvYyA9IG51bGw7CisgICAgICAgICAgICAgICAgRW50cnkgZW50cnkgPSAoRW50cnkpYi5tSW5kZXhUeXBlcy5lbGVtZW50QXQoY3QpOworICAgICAgICAgICAgICAgIGlmIChlbnRyeS50ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgYWxsb2MgPSBBbGxvY2F0aW9uLmNyZWF0ZVR5cGVkKHJzLCBlbnRyeS50KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZihlbnRyeS5lICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgYWxsb2MgPSBBbGxvY2F0aW9uLmNyZWF0ZVNpemVkKHJzLCBlbnRyeS5lLCBlbnRyeS5zaXplKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW50IGFsbG9jSUQgPSAoYWxsb2MgPT0gbnVsbCkgPyAwIDogYWxsb2MuZ2V0SUQoKTsKKyAgICAgICAgICAgICAgICBycy5uTWVzaEJpbmRJbmRleChpZCwgYWxsb2NJRCwgZW50cnkucHJpbS5tSUQsIGN0KTsKKyAgICAgICAgICAgICAgICBuZXdNZXNoLm1JbmRleEJ1ZmZlcnNbY3RdID0gYWxsb2M7CisgICAgICAgICAgICAgICAgbmV3TWVzaC5tUHJpbWl0aXZlc1tjdF0gPSBlbnRyeS5wcmltOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IoaW50IGN0ID0gMDsgY3QgPCBiLm1WZXJ0ZXhUeXBlQ291bnQ7IGN0ICsrKSB7CisgICAgICAgICAgICAgICAgQWxsb2NhdGlvbiBhbGxvYyA9IG51bGw7CisgICAgICAgICAgICAgICAgRW50cnkgZW50cnkgPSBiLm1WZXJ0ZXhUeXBlc1tjdF07CisgICAgICAgICAgICAgICAgaWYgKGVudHJ5LnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBhbGxvYyA9IEFsbG9jYXRpb24uY3JlYXRlVHlwZWQocnMsIGVudHJ5LnQpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZihlbnRyeS5lICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgYWxsb2MgPSBBbGxvY2F0aW9uLmNyZWF0ZVNpemVkKHJzLCBlbnRyeS5lLCBlbnRyeS5zaXplKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcnMubk1lc2hCaW5kVmVydGV4KGlkLCBhbGxvYy5nZXRJRCgpLCBjdCk7CisgICAgICAgICAgICAgICAgbmV3TWVzaC5tVmVydGV4QnVmZmVyc1tjdF0gPSBhbGxvYzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIG5ld01lc2g7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgTWVzaCBjcmVhdGUoKSB7CisgICAgICAgICAgICBtUlMudmFsaWRhdGUoKTsKKyAgICAgICAgICAgIE1lc2ggc20gPSBpbnRlcm5hbENyZWF0ZShtUlMsIHRoaXMpOworICAgICAgICAgICAgcmV0dXJuIHNtOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBBbGxvY2F0aW9uQnVpbGRlciB7CisgICAgICAgIFJlbmRlclNjcmlwdCBtUlM7CisKKyAgICAgICAgY2xhc3MgRW50cnkgeworICAgICAgICAgICAgQWxsb2NhdGlvbiBhOworICAgICAgICAgICAgUHJpbWl0aXZlIHByaW07CisgICAgICAgIH0KKworICAgICAgICBpbnQgbVZlcnRleFR5cGVDb3VudDsKKyAgICAgICAgRW50cnlbXSBtVmVydGV4VHlwZXM7CisKKyAgICAgICAgVmVjdG9yIG1JbmRleFR5cGVzOworCisgICAgICAgIHB1YmxpYyBBbGxvY2F0aW9uQnVpbGRlcihSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgICAgIG1SUyA9IHJzOworICAgICAgICAgICAgbVZlcnRleFR5cGVDb3VudCA9IDA7CisgICAgICAgICAgICBtVmVydGV4VHlwZXMgPSBuZXcgRW50cnlbMTZdOworICAgICAgICAgICAgbUluZGV4VHlwZXMgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGFkZFZlcnRleEFsbG9jYXRpb24oQWxsb2NhdGlvbiBhKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGlmIChtVmVydGV4VHlwZUNvdW50ID49IG1WZXJ0ZXhUeXBlcy5sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJNYXggdmVydGV4IHR5cGVzIGV4Y2VlZGVkLiIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnQgYWRkZWRJbmRleCA9IG1WZXJ0ZXhUeXBlQ291bnQ7CisgICAgICAgICAgICBtVmVydGV4VHlwZXNbbVZlcnRleFR5cGVDb3VudF0gPSBuZXcgRW50cnkoKTsKKyAgICAgICAgICAgIG1WZXJ0ZXhUeXBlc1ttVmVydGV4VHlwZUNvdW50XS5hID0gYTsKKyAgICAgICAgICAgIG1WZXJ0ZXhUeXBlQ291bnQrKzsKKyAgICAgICAgICAgIHJldHVybiBhZGRlZEluZGV4OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBhZGRJbmRleEFsbG9jYXRpb24oQWxsb2NhdGlvbiBhLCBQcmltaXRpdmUgcCkgeworICAgICAgICAgICAgaW50IGFkZGVkSW5kZXggID0gbUluZGV4VHlwZXMuc2l6ZSgpOworICAgICAgICAgICAgRW50cnkgaW5kZXhUeXBlID0gbmV3IEVudHJ5KCk7CisgICAgICAgICAgICBpbmRleFR5cGUuYSA9IGE7CisgICAgICAgICAgICBpbmRleFR5cGUucHJpbSA9IHA7CisgICAgICAgICAgICBtSW5kZXhUeXBlcy5hZGRFbGVtZW50KGluZGV4VHlwZSk7CisgICAgICAgICAgICByZXR1cm4gYWRkZWRJbmRleDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgYWRkSW5kZXhUeXBlKFByaW1pdGl2ZSBwKSB7CisgICAgICAgICAgICBpbnQgYWRkZWRJbmRleCAgPSBtSW5kZXhUeXBlcy5zaXplKCk7CisgICAgICAgICAgICBFbnRyeSBpbmRleFR5cGUgPSBuZXcgRW50cnkoKTsKKyAgICAgICAgICAgIGluZGV4VHlwZS5hID0gbnVsbDsKKyAgICAgICAgICAgIGluZGV4VHlwZS5wcmltID0gcDsKKyAgICAgICAgICAgIG1JbmRleFR5cGVzLmFkZEVsZW1lbnQoaW5kZXhUeXBlKTsKKyAgICAgICAgICAgIHJldHVybiBhZGRlZEluZGV4OworICAgICAgICB9CisKKyAgICAgICAgc3RhdGljIHN5bmNocm9uaXplZCBNZXNoIGludGVybmFsQ3JlYXRlKFJlbmRlclNjcmlwdCBycywgQWxsb2NhdGlvbkJ1aWxkZXIgYikgeworCisgICAgICAgICAgICBpbnQgaWQgPSBycy5uTWVzaENyZWF0ZShiLm1WZXJ0ZXhUeXBlQ291bnQsIGIubUluZGV4VHlwZXMuc2l6ZSgpKTsKKyAgICAgICAgICAgIE1lc2ggbmV3TWVzaCA9IG5ldyBNZXNoKGlkLCBycyk7CisgICAgICAgICAgICBuZXdNZXNoLm1JbmRleEJ1ZmZlcnMgPSBuZXcgQWxsb2NhdGlvbltiLm1JbmRleFR5cGVzLnNpemUoKV07CisgICAgICAgICAgICBuZXdNZXNoLm1QcmltaXRpdmVzID0gbmV3IFByaW1pdGl2ZVtiLm1JbmRleFR5cGVzLnNpemUoKV07CisgICAgICAgICAgICBuZXdNZXNoLm1WZXJ0ZXhCdWZmZXJzID0gbmV3IEFsbG9jYXRpb25bYi5tVmVydGV4VHlwZUNvdW50XTsKKworICAgICAgICAgICAgZm9yKGludCBjdCA9IDA7IGN0IDwgYi5tSW5kZXhUeXBlcy5zaXplKCk7IGN0ICsrKSB7CisgICAgICAgICAgICAgICAgRW50cnkgZW50cnkgPSAoRW50cnkpYi5tSW5kZXhUeXBlcy5lbGVtZW50QXQoY3QpOworICAgICAgICAgICAgICAgIGludCBhbGxvY0lEID0gKGVudHJ5LmEgPT0gbnVsbCkgPyAwIDogZW50cnkuYS5nZXRJRCgpOworICAgICAgICAgICAgICAgIHJzLm5NZXNoQmluZEluZGV4KGlkLCBhbGxvY0lELCBlbnRyeS5wcmltLm1JRCwgY3QpOworICAgICAgICAgICAgICAgIG5ld01lc2gubUluZGV4QnVmZmVyc1tjdF0gPSBlbnRyeS5hOworICAgICAgICAgICAgICAgIG5ld01lc2gubVByaW1pdGl2ZXNbY3RdID0gZW50cnkucHJpbTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yKGludCBjdCA9IDA7IGN0IDwgYi5tVmVydGV4VHlwZUNvdW50OyBjdCArKykgeworICAgICAgICAgICAgICAgIEVudHJ5IGVudHJ5ID0gYi5tVmVydGV4VHlwZXNbY3RdOworICAgICAgICAgICAgICAgIHJzLm5NZXNoQmluZFZlcnRleChpZCwgZW50cnkuYS5tSUQsIGN0KTsKKyAgICAgICAgICAgICAgICBuZXdNZXNoLm1WZXJ0ZXhCdWZmZXJzW2N0XSA9IGVudHJ5LmE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBuZXdNZXNoOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE1lc2ggY3JlYXRlKCkgeworICAgICAgICAgICAgbVJTLnZhbGlkYXRlKCk7CisgICAgICAgICAgICBNZXNoIHNtID0gaW50ZXJuYWxDcmVhdGUobVJTLCB0aGlzKTsKKyAgICAgICAgICAgIHJldHVybiBzbTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUcmlhbmdsZU1lc2hCdWlsZGVyIHsKKyAgICAgICAgZmxvYXQgbVZ0eERhdGFbXTsKKyAgICAgICAgaW50IG1WdHhDb3VudDsKKyAgICAgICAgc2hvcnQgbUluZGV4RGF0YVtdOworICAgICAgICBpbnQgbUluZGV4Q291bnQ7CisgICAgICAgIFJlbmRlclNjcmlwdCBtUlM7CisgICAgICAgIEVsZW1lbnQgbUVsZW1lbnQ7CisKKyAgICAgICAgZmxvYXQgbU5YID0gMDsKKyAgICAgICAgZmxvYXQgbU5ZID0gMDsKKyAgICAgICAgZmxvYXQgbU5aID0gLTE7CisgICAgICAgIGZsb2F0IG1TMCA9IDA7CisgICAgICAgIGZsb2F0IG1UMCA9IDA7CisgICAgICAgIGZsb2F0IG1SID0gMTsKKyAgICAgICAgZmxvYXQgbUcgPSAxOworICAgICAgICBmbG9hdCBtQiA9IDE7CisgICAgICAgIGZsb2F0IG1BID0gMTsKKworICAgICAgICBpbnQgbVZ0eFNpemU7CisgICAgICAgIGludCBtRmxhZ3M7CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09MT1IgPSAweDAwMDE7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PUk1BTCA9IDB4MDAwMjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEVYVFVSRV8wID0gMHgwMTAwOworCisgICAgICAgIHB1YmxpYyBUcmlhbmdsZU1lc2hCdWlsZGVyKFJlbmRlclNjcmlwdCBycywgaW50IHZ0eFNpemUsIGludCBmbGFncykgeworICAgICAgICAgICAgbVJTID0gcnM7CisgICAgICAgICAgICBtVnR4Q291bnQgPSAwOworICAgICAgICAgICAgbUluZGV4Q291bnQgPSAwOworICAgICAgICAgICAgbVZ0eERhdGEgPSBuZXcgZmxvYXRbMTI4XTsKKyAgICAgICAgICAgIG1JbmRleERhdGEgPSBuZXcgc2hvcnRbMTI4XTsKKyAgICAgICAgICAgIG1WdHhTaXplID0gdnR4U2l6ZTsKKyAgICAgICAgICAgIG1GbGFncyA9IGZsYWdzOworCisgICAgICAgICAgICBpZiAodnR4U2l6ZSA8IDIgfHwgdnR4U2l6ZSA+IDMpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJWZXJ0ZXggc2l6ZSBvdXQgb2YgcmFuZ2UuIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgbWFrZVNwYWNlKGludCBjb3VudCkgeworICAgICAgICAgICAgaWYgKChtVnR4Q291bnQgKyBjb3VudCkgPj0gbVZ0eERhdGEubGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgZmxvYXQgdFtdID0gbmV3IGZsb2F0W21WdHhEYXRhLmxlbmd0aCAqIDJdOworICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkobVZ0eERhdGEsIDAsIHQsIDAsIG1WdHhEYXRhLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgbVZ0eERhdGEgPSB0OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGxhdGNoKCkgeworICAgICAgICAgICAgaWYgKChtRmxhZ3MgJiBDT0xPUikgIT0gMCkgeworICAgICAgICAgICAgICAgIG1ha2VTcGFjZSg0KTsKKyAgICAgICAgICAgICAgICBtVnR4RGF0YVttVnR4Q291bnQrK10gPSBtUjsKKyAgICAgICAgICAgICAgICBtVnR4RGF0YVttVnR4Q291bnQrK10gPSBtRzsKKyAgICAgICAgICAgICAgICBtVnR4RGF0YVttVnR4Q291bnQrK10gPSBtQjsKKyAgICAgICAgICAgICAgICBtVnR4RGF0YVttVnR4Q291bnQrK10gPSBtQTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgobUZsYWdzICYgVEVYVFVSRV8wKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgbWFrZVNwYWNlKDIpOworICAgICAgICAgICAgICAgIG1WdHhEYXRhW21WdHhDb3VudCsrXSA9IG1TMDsKKyAgICAgICAgICAgICAgICBtVnR4RGF0YVttVnR4Q291bnQrK10gPSBtVDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKG1GbGFncyAmIE5PUk1BTCkgIT0gMCkgeworICAgICAgICAgICAgICAgIG1ha2VTcGFjZSgzKTsKKyAgICAgICAgICAgICAgICBtVnR4RGF0YVttVnR4Q291bnQrK10gPSBtTlg7CisgICAgICAgICAgICAgICAgbVZ0eERhdGFbbVZ0eENvdW50KytdID0gbU5ZOworICAgICAgICAgICAgICAgIG1WdHhEYXRhW21WdHhDb3VudCsrXSA9IG1OWjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGFkZFZlcnRleChmbG9hdCB4LCBmbG9hdCB5KSB7CisgICAgICAgICAgICBpZiAobVZ0eFNpemUgIT0gMikgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImFkZCBtaXN0bWF0Y2ggd2l0aCBkZWNsYXJlZCBjb21wb25lbnRzLiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWFrZVNwYWNlKDIpOworICAgICAgICAgICAgbVZ0eERhdGFbbVZ0eENvdW50KytdID0geDsKKyAgICAgICAgICAgIG1WdHhEYXRhW21WdHhDb3VudCsrXSA9IHk7CisgICAgICAgICAgICBsYXRjaCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgYWRkVmVydGV4KGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopIHsKKyAgICAgICAgICAgIGlmIChtVnR4U2l6ZSAhPSAzKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiYWRkIG1pc3RtYXRjaCB3aXRoIGRlY2xhcmVkIGNvbXBvbmVudHMuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYWtlU3BhY2UoMyk7CisgICAgICAgICAgICBtVnR4RGF0YVttVnR4Q291bnQrK10gPSB4OworICAgICAgICAgICAgbVZ0eERhdGFbbVZ0eENvdW50KytdID0geTsKKyAgICAgICAgICAgIG1WdHhEYXRhW21WdHhDb3VudCsrXSA9IHo7CisgICAgICAgICAgICBsYXRjaCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0VGV4dHVyZShmbG9hdCBzLCBmbG9hdCB0KSB7CisgICAgICAgICAgICBpZiAoKG1GbGFncyAmIFRFWFRVUkVfMCkgPT0gMCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImFkZCBtaXN0bWF0Y2ggd2l0aCBkZWNsYXJlZCBjb21wb25lbnRzLiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVMwID0gczsKKyAgICAgICAgICAgIG1UMCA9IHQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXROb3JtYWwoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeikgeworICAgICAgICAgICAgaWYgKChtRmxhZ3MgJiBOT1JNQUwpID09IDApIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJhZGQgbWlzdG1hdGNoIHdpdGggZGVjbGFyZWQgY29tcG9uZW50cy4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1OWCA9IHg7CisgICAgICAgICAgICBtTlkgPSB5OworICAgICAgICAgICAgbU5aID0gejsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldENvbG9yKGZsb2F0IHIsIGZsb2F0IGcsIGZsb2F0IGIsIGZsb2F0IGEpIHsKKyAgICAgICAgICAgIGlmICgobUZsYWdzICYgQ09MT1IpID09IDApIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJhZGQgbWlzdG1hdGNoIHdpdGggZGVjbGFyZWQgY29tcG9uZW50cy4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1SID0gcjsKKyAgICAgICAgICAgIG1HID0gZzsKKyAgICAgICAgICAgIG1CID0gYjsKKyAgICAgICAgICAgIG1BID0gYTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGFkZFRyaWFuZ2xlKGludCBpZHgxLCBpbnQgaWR4MiwgaW50IGlkeDMpIHsKKyAgICAgICAgICAgIGlmKChpZHgxID49IG1WdHhDb3VudCkgfHwgKGlkeDEgPCAwKSB8fAorICAgICAgICAgICAgICAgKGlkeDIgPj0gbVZ0eENvdW50KSB8fCAoaWR4MiA8IDApIHx8CisgICAgICAgICAgICAgICAoaWR4MyA+PSBtVnR4Q291bnQpIHx8IChpZHgzIDwgMCkpIHsKKyAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkluZGV4IHByb3ZpZGVkIGdyZWF0ZXIgdGhhbiB2ZXJ0ZXggY291bnQuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKG1JbmRleENvdW50ICsgMykgPj0gbUluZGV4RGF0YS5sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICBzaG9ydCB0W10gPSBuZXcgc2hvcnRbbUluZGV4RGF0YS5sZW5ndGggKiAyXTsKKyAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KG1JbmRleERhdGEsIDAsIHQsIDAsIG1JbmRleERhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBtSW5kZXhEYXRhID0gdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1JbmRleERhdGFbbUluZGV4Q291bnQrK10gPSAoc2hvcnQpaWR4MTsKKyAgICAgICAgICAgIG1JbmRleERhdGFbbUluZGV4Q291bnQrK10gPSAoc2hvcnQpaWR4MjsKKyAgICAgICAgICAgIG1JbmRleERhdGFbbUluZGV4Q291bnQrK10gPSAoc2hvcnQpaWR4MzsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBNZXNoIGNyZWF0ZShib29sZWFuIHVwbG9hZFRvQnVmZmVyT2JqZWN0KSB7CisgICAgICAgICAgICBFbGVtZW50LkJ1aWxkZXIgYiA9IG5ldyBFbGVtZW50LkJ1aWxkZXIobVJTKTsKKyAgICAgICAgICAgIGludCBmbG9hdENvdW50ID0gbVZ0eFNpemU7CisgICAgICAgICAgICBiLmFkZChFbGVtZW50LmNyZWF0ZVZlY3RvcihtUlMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50LkRhdGFUeXBlLkZMT0FUXzMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVZ0eFNpemUpLCAicG9zaXRpb24iKTsKKyAgICAgICAgICAgIGlmICgobUZsYWdzICYgQ09MT1IpICE9IDApIHsKKyAgICAgICAgICAgICAgICBmbG9hdENvdW50ICs9IDQ7CisgICAgICAgICAgICAgICAgYi5hZGQoRWxlbWVudC5GMzJfNChtUlMpLCAiY29sb3IiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgobUZsYWdzICYgVEVYVFVSRV8wKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgZmxvYXRDb3VudCArPSAyOworICAgICAgICAgICAgICAgIGIuYWRkKEVsZW1lbnQuRjMyXzIobVJTKSwgInRleHR1cmUwIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKG1GbGFncyAmIE5PUk1BTCkgIT0gMCkgeworICAgICAgICAgICAgICAgIGZsb2F0Q291bnQgKz0gMzsKKyAgICAgICAgICAgICAgICBiLmFkZChFbGVtZW50LkYzMl8zKG1SUyksICJub3JtYWwiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1FbGVtZW50ID0gYi5jcmVhdGUoKTsKKworICAgICAgICAgICAgQnVpbGRlciBzbWIgPSBuZXcgQnVpbGRlcihtUlMpOworICAgICAgICAgICAgc21iLmFkZFZlcnRleFR5cGUobUVsZW1lbnQsIG1WdHhDb3VudCAvIGZsb2F0Q291bnQpOworICAgICAgICAgICAgc21iLmFkZEluZGV4VHlwZShFbGVtZW50LlUxNihtUlMpLCBtSW5kZXhDb3VudCwgUHJpbWl0aXZlLlRSSUFOR0xFKTsKKworICAgICAgICAgICAgTWVzaCBzbSA9IHNtYi5jcmVhdGUoKTsKKworICAgICAgICAgICAgc20uZ2V0VmVydGV4QWxsb2NhdGlvbigwKS5kYXRhKG1WdHhEYXRhKTsKKyAgICAgICAgICAgIGlmKHVwbG9hZFRvQnVmZmVyT2JqZWN0KSB7CisgICAgICAgICAgICAgICAgc20uZ2V0VmVydGV4QWxsb2NhdGlvbigwKS51cGxvYWRUb0J1ZmZlck9iamVjdCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzbS5nZXRJbmRleEFsbG9jYXRpb24oMCkuZGF0YShtSW5kZXhEYXRhKTsKKyAgICAgICAgICAgIHNtLmdldEluZGV4QWxsb2NhdGlvbigwKS51cGxvYWRUb0J1ZmZlck9iamVjdCgpOworCisgICAgICAgICAgICByZXR1cm4gc207CisgICAgICAgIH0KKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvUHJvZ3JhbS5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9Qcm9ncmFtLmphdmEKaW5kZXggMTYxNGVjNS4uMTYyOGE5NyAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9Qcm9ncmFtLmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9Qcm9ncmFtLmphdmEKQEAgLTM4LDggKzM4LDcgQEAKICAgICBTdHJpbmcgbVNoYWRlcjsKIAogICAgIFByb2dyYW0oaW50IGlkLCBSZW5kZXJTY3JpcHQgcnMpIHsKLSAgICAgICAgc3VwZXIocnMpOwotICAgICAgICBtSUQgPSBpZDsKKyAgICAgICAgc3VwZXIoaWQsIHJzKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBiaW5kQ29uc3RhbnRzKEFsbG9jYXRpb24gYSwgaW50IHNsb3QpIHsKQEAgLTkxLDggKzkwLDkgQEAKICAgICAgICAgICAgIG1UZXh0dXJlQ291bnQgPSAwOwogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIHZvaWQgc2V0U2hhZGVyKFN0cmluZyBzKSB7CisgICAgICAgIHB1YmxpYyBCYXNlUHJvZ3JhbUJ1aWxkZXIgc2V0U2hhZGVyKFN0cmluZyBzKSB7CiAgICAgICAgICAgICBtU2hhZGVyID0gczsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIHZvaWQgYWRkSW5wdXQoRWxlbWVudCBlKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKQEAgLTEyMCwxMiArMTIwLDEzIEBACiAgICAgICAgICAgICByZXR1cm4gbUNvbnN0YW50Q291bnQrKzsKICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFRleHR1cmVDb3VudChpbnQgY291bnQpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24geworICAgICAgICBwdWJsaWMgQmFzZVByb2dyYW1CdWlsZGVyIHNldFRleHR1cmVDb3VudChpbnQgY291bnQpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewogICAgICAgICAgICAgLy8gU2hvdWxkIGNoZWNrIGZvciBjb25zaXN0YW50IGFuZCBub24tY29uZmxpY3RpbmcgbmFtZXMuLi4KICAgICAgICAgICAgIGlmKGNvdW50ID49IE1BWF9DT05TVEFOVCkgewogICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk1heCB0ZXh0dXJlIGNvdW50IGV4Y2VlZGVkLiIpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgbVRleHR1cmVDb3VudCA9IGNvdW50OworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgIH0KIAogICAgICAgICBwcm90ZWN0ZWQgdm9pZCBpbml0UHJvZ3JhbShQcm9ncmFtIHApIHsKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvUHJvZ3JhbUZyYWdtZW50LmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1Byb2dyYW1GcmFnbWVudC5qYXZhCmluZGV4IDVlMDRmMGMuLjA0MDkxYTMgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvUHJvZ3JhbUZyYWdtZW50LmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9Qcm9ncmFtRnJhZ21lbnQuamF2YQpAQCAtNjYsNiArNjYsNyBAQAogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQVhfVEVYVFVSRSA9IDI7CiAgICAgICAgIFJlbmRlclNjcmlwdCBtUlM7CiAgICAgICAgIGJvb2xlYW4gbVBvaW50U3ByaXRlRW5hYmxlOworICAgICAgICBib29sZWFuIG1WYXJ5aW5nQ29sb3JFbmFibGU7CiAKICAgICAgICAgcHVibGljIGVudW0gRW52TW9kZSB7CiAgICAgICAgICAgICBSRVBMQUNFICgxKSwKQEAgLTEwNiwyMSArMTA3LDI4IEBACiAgICAgICAgICAgICBtUG9pbnRTcHJpdGVFbmFibGUgPSBmYWxzZTsKICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFRleHR1cmUoRW52TW9kZSBlbnYsIEZvcm1hdCBmbXQsIGludCBzbG90KQorICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRUZXh0dXJlKEVudk1vZGUgZW52LCBGb3JtYXQgZm10LCBpbnQgc2xvdCkKICAgICAgICAgICAgIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewogICAgICAgICAgICAgaWYoKHNsb3QgPCAwKSB8fCAoc2xvdCA+PSBNQVhfVEVYVFVSRSkpIHsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJNQVhfVEVYVFVSRSBleGNlZWRlZC4iKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1TbG90c1tzbG90XSA9IG5ldyBTbG90KGVudiwgZm10KTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIHZvaWQgc2V0UG9pbnRTcHJpdGVUZXhDb29yZGluYXRlUmVwbGFjZW1lbnQoYm9vbGVhbiBlbmFibGUpIHsKKyAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0UG9pbnRTcHJpdGVUZXhDb29yZGluYXRlUmVwbGFjZW1lbnQoYm9vbGVhbiBlbmFibGUpIHsKICAgICAgICAgICAgIG1Qb2ludFNwcml0ZUVuYWJsZSA9IGVuYWJsZTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0VmFyeWluZ0NvbG9yKGJvb2xlYW4gZW5hYmxlKSB7CisgICAgICAgICAgICBtVmFyeWluZ0NvbG9yRW5hYmxlID0gZW5hYmxlOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgUHJvZ3JhbUZyYWdtZW50IGNyZWF0ZSgpIHsKICAgICAgICAgICAgIG1SUy52YWxpZGF0ZSgpOwotICAgICAgICAgICAgaW50W10gdG1wID0gbmV3IGludFtNQVhfVEVYVFVSRSAqIDIgKyAxXTsKKyAgICAgICAgICAgIGludFtdIHRtcCA9IG5ldyBpbnRbTUFYX1RFWFRVUkUgKiAyICsgMl07CiAgICAgICAgICAgICBpZiAobVNsb3RzWzBdICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICB0bXBbMF0gPSBtU2xvdHNbMF0uZW52Lm1JRDsKICAgICAgICAgICAgICAgICB0bXBbMV0gPSBtU2xvdHNbMF0uZm9ybWF0Lm1JRDsKQEAgLTEzMCw2ICsxMzgsNyBAQAogICAgICAgICAgICAgICAgIHRtcFszXSA9IG1TbG90c1sxXS5mb3JtYXQubUlEOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgdG1wWzRdID0gbVBvaW50U3ByaXRlRW5hYmxlID8gMSA6IDA7CisgICAgICAgICAgICB0bXBbNV0gPSBtVmFyeWluZ0NvbG9yRW5hYmxlID8gMSA6IDA7CiAgICAgICAgICAgICBpbnQgaWQgPSBtUlMublByb2dyYW1GcmFnbWVudENyZWF0ZSh0bXApOwogICAgICAgICAgICAgUHJvZ3JhbUZyYWdtZW50IHBmID0gbmV3IFByb2dyYW1GcmFnbWVudChpZCwgbVJTKTsKICAgICAgICAgICAgIHBmLm1UZXh0dXJlQ291bnQgPSBNQVhfVEVYVFVSRTsKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvUHJvZ3JhbVJhc3Rlci5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9Qcm9ncmFtUmFzdGVyLmphdmEKaW5kZXggNTZmOWJmNC4uZmQ4OWI2ZSAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9Qcm9ncmFtUmFzdGVyLmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9Qcm9ncmFtUmFzdGVyLmphdmEKQEAgLTI2LDIzICsyNiwzMyBAQAogICoKICAqKi8KIHB1YmxpYyBjbGFzcyBQcm9ncmFtUmFzdGVyIGV4dGVuZHMgQmFzZU9iaiB7CisKKyAgICBwdWJsaWMgZW51bSBDdWxsTW9kZSB7CisgICAgICAgIEJBQ0sgKDApLAorICAgICAgICBGUk9OVCAoMSksCisgICAgICAgIE5PTkUgKDIpOworCisgICAgICAgIGludCBtSUQ7CisgICAgICAgIEN1bGxNb2RlKGludCBpZCkgeworICAgICAgICAgICAgbUlEID0gaWQ7CisgICAgICAgIH0KKyAgICB9CisKICAgICBib29sZWFuIG1Qb2ludFNtb290aDsKICAgICBib29sZWFuIG1MaW5lU21vb3RoOwogICAgIGJvb2xlYW4gbVBvaW50U3ByaXRlOwotICAgIGZsb2F0IG1Qb2ludFNpemU7CiAgICAgZmxvYXQgbUxpbmVXaWR0aDsKLSAgICBFbGVtZW50IG1JbjsKLSAgICBFbGVtZW50IG1PdXQ7CisgICAgQ3VsbE1vZGUgbUN1bGxNb2RlOwogCiAgICAgUHJvZ3JhbVJhc3RlcihpbnQgaWQsIFJlbmRlclNjcmlwdCBycykgewotICAgICAgICBzdXBlcihycyk7Ci0gICAgICAgIG1JRCA9IGlkOworICAgICAgICBzdXBlcihpZCwgcnMpOwogCi0gICAgICAgIG1Qb2ludFNpemUgPSAxLjBmOwogICAgICAgICBtTGluZVdpZHRoID0gMS4wZjsKICAgICAgICAgbVBvaW50U21vb3RoID0gZmFsc2U7CiAgICAgICAgIG1MaW5lU21vb3RoID0gZmFsc2U7CiAgICAgICAgIG1Qb2ludFNwcml0ZSA9IGZhbHNlOworCisgICAgICAgIG1DdWxsTW9kZSA9IEN1bGxNb2RlLkJBQ0s7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgc2V0TGluZVdpZHRoKGZsb2F0IHcpIHsKQEAgLTUxLDUxICs2MSw3OCBAQAogICAgICAgICBtUlMublByb2dyYW1SYXN0ZXJTZXRMaW5lV2lkdGgobUlELCB3KTsKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBzZXRQb2ludFNpemUoZmxvYXQgcykgeworICAgIHB1YmxpYyB2b2lkIHNldEN1bGxNb2RlKEN1bGxNb2RlIG0pIHsKICAgICAgICAgbVJTLnZhbGlkYXRlKCk7Ci0gICAgICAgIG1Qb2ludFNpemUgPSBzOwotICAgICAgICBtUlMublByb2dyYW1SYXN0ZXJTZXRQb2ludFNpemUobUlELCBzKTsKKyAgICAgICAgbUN1bGxNb2RlID0gbTsKKyAgICAgICAgbVJTLm5Qcm9ncmFtUmFzdGVyU2V0Q3VsbE1vZGUobUlELCBtLm1JRCk7CiAgICAgfQogCi0gICAgdm9pZCBpbnRlcm5hbEluaXQoKSB7Ci0gICAgICAgIGludCBpbklEID0gMDsKLSAgICAgICAgaW50IG91dElEID0gMDsKLSAgICAgICAgaWYgKG1JbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbklEID0gbUluLm1JRDsKKyAgICBwdWJsaWMgc3RhdGljIFByb2dyYW1SYXN0ZXIgQ1VMTF9CQUNLKFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tUHJvZ3JhbVJhc3Rlcl9DVUxMX0JBQ0sgPT0gbnVsbCkgeworICAgICAgICAgICAgUHJvZ3JhbVJhc3Rlci5CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgUHJvZ3JhbVJhc3Rlci5CdWlsZGVyKHJzKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0Q3VsbE1vZGUoQ3VsbE1vZGUuQkFDSyk7CisgICAgICAgICAgICBycy5tUHJvZ3JhbVJhc3Rlcl9DVUxMX0JBQ0sgPSBidWlsZGVyLmNyZWF0ZSgpOwogICAgICAgICB9Ci0gICAgICAgIGlmIChtT3V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIG91dElEID0gbU91dC5tSUQ7Ci0gICAgICAgIH0KLSAgICAgICAgbUlEID0gbVJTLm5Qcm9ncmFtUmFzdGVyQ3JlYXRlKGluSUQsIG91dElELCBtUG9pbnRTbW9vdGgsIG1MaW5lU21vb3RoLCBtUG9pbnRTcHJpdGUpOworICAgICAgICByZXR1cm4gcnMubVByb2dyYW1SYXN0ZXJfQ1VMTF9CQUNLOwogICAgIH0KIAorICAgIHB1YmxpYyBzdGF0aWMgUHJvZ3JhbVJhc3RlciBDVUxMX0ZST05UKFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tUHJvZ3JhbVJhc3Rlcl9DVUxMX0ZST05UID09IG51bGwpIHsKKyAgICAgICAgICAgIFByb2dyYW1SYXN0ZXIuQnVpbGRlciBidWlsZGVyID0gbmV3IFByb2dyYW1SYXN0ZXIuQnVpbGRlcihycyk7CisgICAgICAgICAgICBidWlsZGVyLnNldEN1bGxNb2RlKEN1bGxNb2RlLkZST05UKTsKKyAgICAgICAgICAgIHJzLm1Qcm9ncmFtUmFzdGVyX0NVTExfRlJPTlQgPSBidWlsZGVyLmNyZWF0ZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBycy5tUHJvZ3JhbVJhc3Rlcl9DVUxMX0ZST05UOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgUHJvZ3JhbVJhc3RlciBDVUxMX05PTkUoUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1Qcm9ncmFtUmFzdGVyX0NVTExfTk9ORSA9PSBudWxsKSB7CisgICAgICAgICAgICBQcm9ncmFtUmFzdGVyLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBQcm9ncmFtUmFzdGVyLkJ1aWxkZXIocnMpOworICAgICAgICAgICAgYnVpbGRlci5zZXRDdWxsTW9kZShDdWxsTW9kZS5OT05FKTsKKyAgICAgICAgICAgIHJzLm1Qcm9ncmFtUmFzdGVyX0NVTExfTk9ORSA9IGJ1aWxkZXIuY3JlYXRlKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJzLm1Qcm9ncmFtUmFzdGVyX0NVTExfTk9ORTsKKyAgICB9CiAKICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJ1aWxkZXIgewogICAgICAgICBSZW5kZXJTY3JpcHQgbVJTOwotICAgICAgICBQcm9ncmFtUmFzdGVyIG1QUjsKKyAgICAgICAgYm9vbGVhbiBtUG9pbnRTcHJpdGU7CisgICAgICAgIGJvb2xlYW4gbVBvaW50U21vb3RoOworICAgICAgICBib29sZWFuIG1MaW5lU21vb3RoOworICAgICAgICBDdWxsTW9kZSBtQ3VsbE1vZGU7CiAKLSAgICAgICAgcHVibGljIEJ1aWxkZXIoUmVuZGVyU2NyaXB0IHJzLCBFbGVtZW50IGluLCBFbGVtZW50IG91dCkgeworICAgICAgICBwdWJsaWMgQnVpbGRlcihSZW5kZXJTY3JpcHQgcnMpIHsKICAgICAgICAgICAgIG1SUyA9IHJzOwotICAgICAgICAgICAgbVBSID0gbmV3IFByb2dyYW1SYXN0ZXIoMCwgcnMpOworICAgICAgICAgICAgbVBvaW50U21vb3RoID0gZmFsc2U7CisgICAgICAgICAgICBtTGluZVNtb290aCA9IGZhbHNlOworICAgICAgICAgICAgbVBvaW50U3ByaXRlID0gZmFsc2U7CisgICAgICAgICAgICBtQ3VsbE1vZGUgPSBDdWxsTW9kZS5CQUNLOwogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIHZvaWQgc2V0UG9pbnRTcHJpdGVFbmFibGUoYm9vbGVhbiBlbmFibGUpIHsKLSAgICAgICAgICAgIG1QUi5tUG9pbnRTcHJpdGUgPSBlbmFibGU7CisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldFBvaW50U3ByaXRlRW5hYmxlKGJvb2xlYW4gZW5hYmxlKSB7CisgICAgICAgICAgICBtUG9pbnRTcHJpdGUgPSBlbmFibGU7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFBvaW50U21vb3RoRW5hYmxlKGJvb2xlYW4gZW5hYmxlKSB7Ci0gICAgICAgICAgICBtUFIubVBvaW50U21vb3RoID0gZW5hYmxlOworICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRQb2ludFNtb290aEVuYWJsZShib29sZWFuIGVuYWJsZSkgeworICAgICAgICAgICAgbVBvaW50U21vb3RoID0gZW5hYmxlOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgIH0KIAotICAgICAgICBwdWJsaWMgdm9pZCBzZXRMaW5lU21vb3RoRW5hYmxlKGJvb2xlYW4gZW5hYmxlKSB7Ci0gICAgICAgICAgICBtUFIubUxpbmVTbW9vdGggPSBlbmFibGU7CisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldExpbmVTbW9vdGhFbmFibGUoYm9vbGVhbiBlbmFibGUpIHsKKyAgICAgICAgICAgIG1MaW5lU21vb3RoID0gZW5hYmxlOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgIH0KIAorICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRDdWxsTW9kZShDdWxsTW9kZSBtKSB7CisgICAgICAgICAgICBtQ3VsbE1vZGUgPSBtOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KIAogICAgICAgICBzdGF0aWMgc3luY2hyb25pemVkIFByb2dyYW1SYXN0ZXIgaW50ZXJuYWxDcmVhdGUoUmVuZGVyU2NyaXB0IHJzLCBCdWlsZGVyIGIpIHsKLSAgICAgICAgICAgIGIubVBSLmludGVybmFsSW5pdCgpOwotICAgICAgICAgICAgUHJvZ3JhbVJhc3RlciBwciA9IGIubVBSOwotICAgICAgICAgICAgYi5tUFIgPSBuZXcgUHJvZ3JhbVJhc3RlcigwLCBiLm1SUyk7CisgICAgICAgICAgICBpbnQgaWQgPSBycy5uUHJvZ3JhbVJhc3RlckNyZWF0ZShiLm1Qb2ludFNtb290aCwgYi5tTGluZVNtb290aCwgYi5tUG9pbnRTcHJpdGUpOworICAgICAgICAgICAgUHJvZ3JhbVJhc3RlciBwciA9IG5ldyBQcm9ncmFtUmFzdGVyKGlkLCBycyk7CisgICAgICAgICAgICBwci5zZXRDdWxsTW9kZShiLm1DdWxsTW9kZSk7CiAgICAgICAgICAgICByZXR1cm4gcHI7CiAgICAgICAgIH0KIApAQCAtMTExLDMgKzE0OCw0IEBACiAKIAogCisKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvUHJvZ3JhbVN0b3JlLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1Byb2dyYW1TdG9yZS5qYXZhCmluZGV4IDY5YmUyNDUuLjMyYzBkMDEgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvUHJvZ3JhbVN0b3JlLmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9Qcm9ncmFtU3RvcmUuamF2YQpAQCAtNzYsMTEgKzc2LDE0MyBAQAogCiAKICAgICBQcm9ncmFtU3RvcmUoaW50IGlkLCBSZW5kZXJTY3JpcHQgcnMpIHsKLSAgICAgICAgc3VwZXIocnMpOwotICAgICAgICBtSUQgPSBpZDsKKyAgICAgICAgc3VwZXIoaWQsIHJzKTsKICAgICB9CiAKKyAgICBwdWJsaWMgc3RhdGljIFByb2dyYW1TdG9yZSBCTEVORF9OT05FX0RFUFRIX1RFU1QoUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1Qcm9ncmFtU3RvcmVfQkxFTkRfTk9ORV9ERVBUSF9URVNUID09IG51bGwpIHsKKyAgICAgICAgICAgIFByb2dyYW1TdG9yZS5CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgUHJvZ3JhbVN0b3JlLkJ1aWxkZXIocnMpOworICAgICAgICAgICAgYnVpbGRlci5zZXREZXB0aEZ1bmMoUHJvZ3JhbVN0b3JlLkRlcHRoRnVuYy5MRVNTKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0QmxlbmRGdW5jKEJsZW5kU3JjRnVuYy5PTkUsIEJsZW5kRHN0RnVuYy5aRVJPKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0RGl0aGVyRW5hYmxlKGZhbHNlKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0RGVwdGhNYXNrKHRydWUpOworICAgICAgICAgICAgcnMubVByb2dyYW1TdG9yZV9CTEVORF9OT05FX0RFUFRIX1RFU1QgPSBidWlsZGVyLmNyZWF0ZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBycy5tUHJvZ3JhbVN0b3JlX0JMRU5EX05PTkVfREVQVEhfVEVTVDsKKyAgICB9CisgICAgcHVibGljIHN0YXRpYyBQcm9ncmFtU3RvcmUgQkxFTkRfTk9ORV9ERVBUSF9OT19ERVBUSChSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgaWYocnMubVByb2dyYW1TdG9yZV9CTEVORF9OT05FX0RFUFRIX05PX0RFUFRIID09IG51bGwpIHsKKyAgICAgICAgICAgIFByb2dyYW1TdG9yZS5CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgUHJvZ3JhbVN0b3JlLkJ1aWxkZXIocnMpOworICAgICAgICAgICAgYnVpbGRlci5zZXREZXB0aEZ1bmMoUHJvZ3JhbVN0b3JlLkRlcHRoRnVuYy5BTFdBWVMpOworICAgICAgICAgICAgYnVpbGRlci5zZXRCbGVuZEZ1bmMoQmxlbmRTcmNGdW5jLk9ORSwgQmxlbmREc3RGdW5jLlpFUk8pOworICAgICAgICAgICAgYnVpbGRlci5zZXREaXRoZXJFbmFibGUoZmFsc2UpOworICAgICAgICAgICAgYnVpbGRlci5zZXREZXB0aE1hc2soZmFsc2UpOworICAgICAgICAgICAgcnMubVByb2dyYW1TdG9yZV9CTEVORF9OT05FX0RFUFRIX05PX0RFUFRIID0gYnVpbGRlci5jcmVhdGUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcnMubVByb2dyYW1TdG9yZV9CTEVORF9OT05FX0RFUFRIX05PX0RFUFRIOworICAgIH0KKyAgICBwdWJsaWMgc3RhdGljIFByb2dyYW1TdG9yZSBCTEVORF9OT05FX0RFUFRIX05PX1RFU1QoUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1Qcm9ncmFtU3RvcmVfQkxFTkRfTk9ORV9ERVBUSF9OT19URVNUID09IG51bGwpIHsKKyAgICAgICAgICAgIFByb2dyYW1TdG9yZS5CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgUHJvZ3JhbVN0b3JlLkJ1aWxkZXIocnMpOworICAgICAgICAgICAgYnVpbGRlci5zZXREZXB0aEZ1bmMoUHJvZ3JhbVN0b3JlLkRlcHRoRnVuYy5BTFdBWVMpOworICAgICAgICAgICAgYnVpbGRlci5zZXRCbGVuZEZ1bmMoQmxlbmRTcmNGdW5jLk9ORSwgQmxlbmREc3RGdW5jLlpFUk8pOworICAgICAgICAgICAgYnVpbGRlci5zZXREaXRoZXJFbmFibGUoZmFsc2UpOworICAgICAgICAgICAgYnVpbGRlci5zZXREZXB0aE1hc2sodHJ1ZSk7CisgICAgICAgICAgICBycy5tUHJvZ3JhbVN0b3JlX0JMRU5EX05PTkVfREVQVEhfTk9fVEVTVCA9IGJ1aWxkZXIuY3JlYXRlKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJzLm1Qcm9ncmFtU3RvcmVfQkxFTkRfTk9ORV9ERVBUSF9OT19URVNUOworICAgIH0KKyAgICBwdWJsaWMgc3RhdGljIFByb2dyYW1TdG9yZSBCTEVORF9OT05FX0RFUFRIX05PX1dSSVRFKFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tUHJvZ3JhbVN0b3JlX0JMRU5EX05PTkVfREVQVEhfTk9fV1JJVEUgPT0gbnVsbCkgeworICAgICAgICAgICAgUHJvZ3JhbVN0b3JlLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBQcm9ncmFtU3RvcmUuQnVpbGRlcihycyk7CisgICAgICAgICAgICBidWlsZGVyLnNldERlcHRoRnVuYyhQcm9ncmFtU3RvcmUuRGVwdGhGdW5jLkxFU1MpOworICAgICAgICAgICAgYnVpbGRlci5zZXRCbGVuZEZ1bmMoQmxlbmRTcmNGdW5jLk9ORSwgQmxlbmREc3RGdW5jLlpFUk8pOworICAgICAgICAgICAgYnVpbGRlci5zZXREaXRoZXJFbmFibGUoZmFsc2UpOworICAgICAgICAgICAgYnVpbGRlci5zZXREZXB0aE1hc2soZmFsc2UpOworICAgICAgICAgICAgcnMubVByb2dyYW1TdG9yZV9CTEVORF9OT05FX0RFUFRIX05PX1dSSVRFID0gYnVpbGRlci5jcmVhdGUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcnMubVByb2dyYW1TdG9yZV9CTEVORF9OT05FX0RFUFRIX05PX1dSSVRFOworICAgIH0KIAorICAgIHB1YmxpYyBzdGF0aWMgUHJvZ3JhbVN0b3JlIEJMRU5EX0FMUEhBX0RFUFRIX1RFU1QoUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1Qcm9ncmFtU3RvcmVfQkxFTkRfQUxQSEFfREVQVEhfVEVTVCA9PSBudWxsKSB7CisgICAgICAgICAgICBQcm9ncmFtU3RvcmUuQnVpbGRlciBidWlsZGVyID0gbmV3IFByb2dyYW1TdG9yZS5CdWlsZGVyKHJzKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0RGVwdGhGdW5jKFByb2dyYW1TdG9yZS5EZXB0aEZ1bmMuTEVTUyk7CisgICAgICAgICAgICBidWlsZGVyLnNldEJsZW5kRnVuYyhCbGVuZFNyY0Z1bmMuU1JDX0FMUEhBLCBCbGVuZERzdEZ1bmMuT05FX01JTlVTX1NSQ19BTFBIQSk7CisgICAgICAgICAgICBidWlsZGVyLnNldERpdGhlckVuYWJsZShmYWxzZSk7CisgICAgICAgICAgICBidWlsZGVyLnNldERlcHRoTWFzayh0cnVlKTsKKyAgICAgICAgICAgIHJzLm1Qcm9ncmFtU3RvcmVfQkxFTkRfQUxQSEFfREVQVEhfVEVTVCA9IGJ1aWxkZXIuY3JlYXRlKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJzLm1Qcm9ncmFtU3RvcmVfQkxFTkRfQUxQSEFfREVQVEhfVEVTVDsKKyAgICB9CisgICAgcHVibGljIHN0YXRpYyBQcm9ncmFtU3RvcmUgQkxFTkRfQUxQSEFfREVQVEhfTk9fREVQVEgoUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1Qcm9ncmFtU3RvcmVfQkxFTkRfQUxQSEFfREVQVEhfTk9fREVQVEggPT0gbnVsbCkgeworICAgICAgICAgICAgUHJvZ3JhbVN0b3JlLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBQcm9ncmFtU3RvcmUuQnVpbGRlcihycyk7CisgICAgICAgICAgICBidWlsZGVyLnNldERlcHRoRnVuYyhQcm9ncmFtU3RvcmUuRGVwdGhGdW5jLkFMV0FZUyk7CisgICAgICAgICAgICBidWlsZGVyLnNldEJsZW5kRnVuYyhCbGVuZFNyY0Z1bmMuU1JDX0FMUEhBLCBCbGVuZERzdEZ1bmMuT05FX01JTlVTX1NSQ19BTFBIQSk7CisgICAgICAgICAgICBidWlsZGVyLnNldERpdGhlckVuYWJsZShmYWxzZSk7CisgICAgICAgICAgICBidWlsZGVyLnNldERlcHRoTWFzayhmYWxzZSk7CisgICAgICAgICAgICBycy5tUHJvZ3JhbVN0b3JlX0JMRU5EX0FMUEhBX0RFUFRIX05PX0RFUFRIID0gYnVpbGRlci5jcmVhdGUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcnMubVByb2dyYW1TdG9yZV9CTEVORF9BTFBIQV9ERVBUSF9OT19ERVBUSDsKKyAgICB9CisgICAgcHVibGljIHN0YXRpYyBQcm9ncmFtU3RvcmUgQkxFTkRfQUxQSEFfREVQVEhfTk9fVEVTVChSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgaWYocnMubVByb2dyYW1TdG9yZV9CTEVORF9BTFBIQV9ERVBUSF9OT19URVNUID09IG51bGwpIHsKKyAgICAgICAgICAgIFByb2dyYW1TdG9yZS5CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgUHJvZ3JhbVN0b3JlLkJ1aWxkZXIocnMpOworICAgICAgICAgICAgYnVpbGRlci5zZXREZXB0aEZ1bmMoUHJvZ3JhbVN0b3JlLkRlcHRoRnVuYy5BTFdBWVMpOworICAgICAgICAgICAgYnVpbGRlci5zZXRCbGVuZEZ1bmMoQmxlbmRTcmNGdW5jLlNSQ19BTFBIQSwgQmxlbmREc3RGdW5jLk9ORV9NSU5VU19TUkNfQUxQSEEpOworICAgICAgICAgICAgYnVpbGRlci5zZXREaXRoZXJFbmFibGUoZmFsc2UpOworICAgICAgICAgICAgYnVpbGRlci5zZXREZXB0aE1hc2sodHJ1ZSk7CisgICAgICAgICAgICBycy5tUHJvZ3JhbVN0b3JlX0JMRU5EX0FMUEhBX0RFUFRIX05PX1RFU1QgPSBidWlsZGVyLmNyZWF0ZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBycy5tUHJvZ3JhbVN0b3JlX0JMRU5EX0FMUEhBX0RFUFRIX05PX1RFU1Q7CisgICAgfQorICAgIHB1YmxpYyBzdGF0aWMgUHJvZ3JhbVN0b3JlIEJMRU5EX0FMUEhBX0RFUFRIX05PX1dSSVRFKFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tUHJvZ3JhbVN0b3JlX0JMRU5EX0FMUEhBX0RFUFRIX05PX1dSSVRFID09IG51bGwpIHsKKyAgICAgICAgICAgIFByb2dyYW1TdG9yZS5CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgUHJvZ3JhbVN0b3JlLkJ1aWxkZXIocnMpOworICAgICAgICAgICAgYnVpbGRlci5zZXREZXB0aEZ1bmMoUHJvZ3JhbVN0b3JlLkRlcHRoRnVuYy5MRVNTKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0QmxlbmRGdW5jKEJsZW5kU3JjRnVuYy5TUkNfQUxQSEEsIEJsZW5kRHN0RnVuYy5PTkVfTUlOVVNfU1JDX0FMUEhBKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0RGl0aGVyRW5hYmxlKGZhbHNlKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0RGVwdGhNYXNrKGZhbHNlKTsKKyAgICAgICAgICAgIHJzLm1Qcm9ncmFtU3RvcmVfQkxFTkRfQUxQSEFfREVQVEhfTk9fV1JJVEUgPSBidWlsZGVyLmNyZWF0ZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBycy5tUHJvZ3JhbVN0b3JlX0JMRU5EX0FMUEhBX0RFUFRIX05PX1dSSVRFOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgUHJvZ3JhbVN0b3JlIEJMRU5EX0FERF9ERVBUSF9URVNUKFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tUHJvZ3JhbVN0b3JlX0JMRU5EX0FERF9ERVBUSF9URVNUID09IG51bGwpIHsKKyAgICAgICAgICAgIFByb2dyYW1TdG9yZS5CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgUHJvZ3JhbVN0b3JlLkJ1aWxkZXIocnMpOworICAgICAgICAgICAgYnVpbGRlci5zZXREZXB0aEZ1bmMoUHJvZ3JhbVN0b3JlLkRlcHRoRnVuYy5MRVNTKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0QmxlbmRGdW5jKEJsZW5kU3JjRnVuYy5PTkUsIEJsZW5kRHN0RnVuYy5PTkUpOworICAgICAgICAgICAgYnVpbGRlci5zZXREaXRoZXJFbmFibGUoZmFsc2UpOworICAgICAgICAgICAgYnVpbGRlci5zZXREZXB0aE1hc2sodHJ1ZSk7CisgICAgICAgICAgICBycy5tUHJvZ3JhbVN0b3JlX0JMRU5EX0FERF9ERVBUSF9URVNUID0gYnVpbGRlci5jcmVhdGUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcnMubVByb2dyYW1TdG9yZV9CTEVORF9BRERfREVQVEhfVEVTVDsKKyAgICB9CisgICAgcHVibGljIHN0YXRpYyBQcm9ncmFtU3RvcmUgQkxFTkRfQUREX0RFUFRIX05PX0RFUFRIKFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tUHJvZ3JhbVN0b3JlX0JMRU5EX0FERF9ERVBUSF9OT19ERVBUSCA9PSBudWxsKSB7CisgICAgICAgICAgICBQcm9ncmFtU3RvcmUuQnVpbGRlciBidWlsZGVyID0gbmV3IFByb2dyYW1TdG9yZS5CdWlsZGVyKHJzKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0RGVwdGhGdW5jKFByb2dyYW1TdG9yZS5EZXB0aEZ1bmMuQUxXQVlTKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0QmxlbmRGdW5jKEJsZW5kU3JjRnVuYy5PTkUsIEJsZW5kRHN0RnVuYy5PTkUpOworICAgICAgICAgICAgYnVpbGRlci5zZXREaXRoZXJFbmFibGUoZmFsc2UpOworICAgICAgICAgICAgYnVpbGRlci5zZXREZXB0aE1hc2soZmFsc2UpOworICAgICAgICAgICAgcnMubVByb2dyYW1TdG9yZV9CTEVORF9BRERfREVQVEhfTk9fREVQVEggPSBidWlsZGVyLmNyZWF0ZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBycy5tUHJvZ3JhbVN0b3JlX0JMRU5EX0FERF9ERVBUSF9OT19ERVBUSDsKKyAgICB9CisgICAgcHVibGljIHN0YXRpYyBQcm9ncmFtU3RvcmUgQkxFTkRfQUREX0RFUFRIX05PX1RFU1QoUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1Qcm9ncmFtU3RvcmVfQkxFTkRfQUREX0RFUFRIX05PX1RFU1QgPT0gbnVsbCkgeworICAgICAgICAgICAgUHJvZ3JhbVN0b3JlLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBQcm9ncmFtU3RvcmUuQnVpbGRlcihycyk7CisgICAgICAgICAgICBidWlsZGVyLnNldERlcHRoRnVuYyhQcm9ncmFtU3RvcmUuRGVwdGhGdW5jLkFMV0FZUyk7CisgICAgICAgICAgICBidWlsZGVyLnNldEJsZW5kRnVuYyhCbGVuZFNyY0Z1bmMuT05FLCBCbGVuZERzdEZ1bmMuT05FKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0RGl0aGVyRW5hYmxlKGZhbHNlKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0RGVwdGhNYXNrKHRydWUpOworICAgICAgICAgICAgcnMubVByb2dyYW1TdG9yZV9CTEVORF9BRERfREVQVEhfTk9fREVQVEggPSBidWlsZGVyLmNyZWF0ZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBycy5tUHJvZ3JhbVN0b3JlX0JMRU5EX0FERF9ERVBUSF9OT19URVNUOworICAgIH0KKyAgICBwdWJsaWMgc3RhdGljIFByb2dyYW1TdG9yZSBCTEVORF9BRERfREVQVEhfTk9fV1JJVEUoUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1Qcm9ncmFtU3RvcmVfQkxFTkRfQUREX0RFUFRIX05PX1dSSVRFID09IG51bGwpIHsKKyAgICAgICAgICAgIFByb2dyYW1TdG9yZS5CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgUHJvZ3JhbVN0b3JlLkJ1aWxkZXIocnMpOworICAgICAgICAgICAgYnVpbGRlci5zZXREZXB0aEZ1bmMoUHJvZ3JhbVN0b3JlLkRlcHRoRnVuYy5BTFdBWVMpOworICAgICAgICAgICAgYnVpbGRlci5zZXRCbGVuZEZ1bmMoQmxlbmRTcmNGdW5jLk9ORSwgQmxlbmREc3RGdW5jLk9ORSk7CisgICAgICAgICAgICBidWlsZGVyLnNldERpdGhlckVuYWJsZShmYWxzZSk7CisgICAgICAgICAgICBidWlsZGVyLnNldERlcHRoTWFzayhmYWxzZSk7CisgICAgICAgICAgICBycy5tUHJvZ3JhbVN0b3JlX0JMRU5EX0FERF9ERVBUSF9OT19XUklURSA9IGJ1aWxkZXIuY3JlYXRlKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJzLm1Qcm9ncmFtU3RvcmVfQkxFTkRfQUREX0RFUFRIX05PX1dSSVRFOworICAgIH0KIAogICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQnVpbGRlciB7CiAgICAgICAgIFJlbmRlclNjcmlwdCBtUlM7CkBAIC0xMTAsMzIgKzI0Miw0OSBAQAogICAgICAgICAgICAgbUNvbG9yTWFza0EgPSB0cnVlOwogICAgICAgICAgICAgbUJsZW5kU3JjID0gQmxlbmRTcmNGdW5jLk9ORTsKICAgICAgICAgICAgIG1CbGVuZERzdCA9IEJsZW5kRHN0RnVuYy5aRVJPOwotCi0KICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldERlcHRoRnVuYyhEZXB0aEZ1bmMgZnVuYykgeworICAgICAgICBwdWJsaWMgQnVpbGRlcihSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgICAgIG1SUyA9IHJzOworICAgICAgICAgICAgbUluID0gbnVsbDsKKyAgICAgICAgICAgIG1PdXQgPSBudWxsOworICAgICAgICAgICAgbURlcHRoRnVuYyA9IERlcHRoRnVuYy5BTFdBWVM7CisgICAgICAgICAgICBtRGVwdGhNYXNrID0gZmFsc2U7CisgICAgICAgICAgICBtQ29sb3JNYXNrUiA9IHRydWU7CisgICAgICAgICAgICBtQ29sb3JNYXNrRyA9IHRydWU7CisgICAgICAgICAgICBtQ29sb3JNYXNrQiA9IHRydWU7CisgICAgICAgICAgICBtQ29sb3JNYXNrQSA9IHRydWU7CisgICAgICAgICAgICBtQmxlbmRTcmMgPSBCbGVuZFNyY0Z1bmMuT05FOworICAgICAgICAgICAgbUJsZW5kRHN0ID0gQmxlbmREc3RGdW5jLlpFUk87CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXREZXB0aEZ1bmMoRGVwdGhGdW5jIGZ1bmMpIHsKICAgICAgICAgICAgIG1EZXB0aEZ1bmMgPSBmdW5jOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgIH0KIAotICAgICAgICBwdWJsaWMgdm9pZCBzZXREZXB0aE1hc2soYm9vbGVhbiBlbmFibGUpIHsKKyAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0RGVwdGhNYXNrKGJvb2xlYW4gZW5hYmxlKSB7CiAgICAgICAgICAgICBtRGVwdGhNYXNrID0gZW5hYmxlOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgIH0KIAotICAgICAgICBwdWJsaWMgdm9pZCBzZXRDb2xvck1hc2soYm9vbGVhbiByLCBib29sZWFuIGcsIGJvb2xlYW4gYiwgYm9vbGVhbiBhKSB7CisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldENvbG9yTWFzayhib29sZWFuIHIsIGJvb2xlYW4gZywgYm9vbGVhbiBiLCBib29sZWFuIGEpIHsKICAgICAgICAgICAgIG1Db2xvck1hc2tSID0gcjsKICAgICAgICAgICAgIG1Db2xvck1hc2tHID0gZzsKICAgICAgICAgICAgIG1Db2xvck1hc2tCID0gYjsKICAgICAgICAgICAgIG1Db2xvck1hc2tBID0gYTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIHZvaWQgc2V0QmxlbmRGdW5jKEJsZW5kU3JjRnVuYyBzcmMsIEJsZW5kRHN0RnVuYyBkc3QpIHsKKyAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0QmxlbmRGdW5jKEJsZW5kU3JjRnVuYyBzcmMsIEJsZW5kRHN0RnVuYyBkc3QpIHsKICAgICAgICAgICAgIG1CbGVuZFNyYyA9IHNyYzsKICAgICAgICAgICAgIG1CbGVuZERzdCA9IGRzdDsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIHZvaWQgc2V0RGl0aGVyRW5hYmxlKGJvb2xlYW4gZW5hYmxlKSB7CisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldERpdGhlckVuYWJsZShib29sZWFuIGVuYWJsZSkgewogICAgICAgICAgICAgbURpdGhlciA9IGVuYWJsZTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICB9CiAKICAgICAgICAgc3RhdGljIHN5bmNocm9uaXplZCBQcm9ncmFtU3RvcmUgaW50ZXJuYWxDcmVhdGUoUmVuZGVyU2NyaXB0IHJzLCBCdWlsZGVyIGIpIHsKQEAgLTE0NywxNyArMjk2LDE3IEBACiAgICAgICAgICAgICBpZiAoYi5tT3V0ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBvdXRJRCA9IGIubU91dC5tSUQ7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBycy5uUHJvZ3JhbUZyYWdtZW50U3RvcmVCZWdpbihpbklELCBvdXRJRCk7Ci0gICAgICAgICAgICBycy5uUHJvZ3JhbUZyYWdtZW50U3RvcmVEZXB0aEZ1bmMoYi5tRGVwdGhGdW5jLm1JRCk7Ci0gICAgICAgICAgICBycy5uUHJvZ3JhbUZyYWdtZW50U3RvcmVEZXB0aE1hc2soYi5tRGVwdGhNYXNrKTsKLSAgICAgICAgICAgIHJzLm5Qcm9ncmFtRnJhZ21lbnRTdG9yZUNvbG9yTWFzayhiLm1Db2xvck1hc2tSLAorICAgICAgICAgICAgcnMublByb2dyYW1TdG9yZUJlZ2luKGluSUQsIG91dElEKTsKKyAgICAgICAgICAgIHJzLm5Qcm9ncmFtU3RvcmVEZXB0aEZ1bmMoYi5tRGVwdGhGdW5jLm1JRCk7CisgICAgICAgICAgICBycy5uUHJvZ3JhbVN0b3JlRGVwdGhNYXNrKGIubURlcHRoTWFzayk7CisgICAgICAgICAgICBycy5uUHJvZ3JhbVN0b3JlQ29sb3JNYXNrKGIubUNvbG9yTWFza1IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYi5tQ29sb3JNYXNrRywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLm1Db2xvck1hc2tCLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIubUNvbG9yTWFza0EpOwotICAgICAgICAgICAgcnMublByb2dyYW1GcmFnbWVudFN0b3JlQmxlbmRGdW5jKGIubUJsZW5kU3JjLm1JRCwgYi5tQmxlbmREc3QubUlEKTsKLSAgICAgICAgICAgIHJzLm5Qcm9ncmFtRnJhZ21lbnRTdG9yZURpdGhlcihiLm1EaXRoZXIpOworICAgICAgICAgICAgcnMublByb2dyYW1TdG9yZUJsZW5kRnVuYyhiLm1CbGVuZFNyYy5tSUQsIGIubUJsZW5kRHN0Lm1JRCk7CisgICAgICAgICAgICBycy5uUHJvZ3JhbVN0b3JlRGl0aGVyKGIubURpdGhlcik7CiAKLSAgICAgICAgICAgIGludCBpZCA9IHJzLm5Qcm9ncmFtRnJhZ21lbnRTdG9yZUNyZWF0ZSgpOworICAgICAgICAgICAgaW50IGlkID0gcnMublByb2dyYW1TdG9yZUNyZWF0ZSgpOwogICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9ncmFtU3RvcmUoaWQsIHJzKTsKICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1Byb2dyYW1WZXJ0ZXguamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvUHJvZ3JhbVZlcnRleC5qYXZhCmluZGV4IDFiMTU1ZDcuLmM5OWVmZDYgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvUHJvZ3JhbVZlcnRleC5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvUHJvZ3JhbVZlcnRleC5qYXZhCkBAIC00Niw5ICs0NiwxMyBAQAogICAgICAgICBwdWJsaWMgQnVpbGRlcihSZW5kZXJTY3JpcHQgcnMsIEVsZW1lbnQgaW4sIEVsZW1lbnQgb3V0KSB7CiAgICAgICAgICAgICBtUlMgPSByczsKICAgICAgICAgfQorICAgICAgICBwdWJsaWMgQnVpbGRlcihSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgICAgIG1SUyA9IHJzOworICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIHZvaWQgc2V0VGV4dHVyZU1hdHJpeEVuYWJsZShib29sZWFuIGVuYWJsZSkgeworICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRUZXh0dXJlTWF0cml4RW5hYmxlKGJvb2xlYW4gZW5hYmxlKSB7CiAgICAgICAgICAgICBtVGV4dHVyZU1hdHJpeEVuYWJsZSA9IGVuYWJsZTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIFByb2dyYW1WZXJ0ZXggY3JlYXRlKCkgewpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9SZW5kZXJTY3JpcHQuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvUmVuZGVyU2NyaXB0LmphdmEKaW5kZXggYTkzNTI0My4uYWIxZDc2NSAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9SZW5kZXJTY3JpcHQuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1JlbmRlclNjcmlwdC5qYXZhCkBAIC01NywxNTEgKzU3LDQ3OCBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgLy8gTm9uLXRocmVhZHNhZmUgZnVuY3Rpb25zLgogICAgIG5hdGl2ZSB2b2lkIG5Jbml0RWxlbWVudHMoaW50IGE4LCBpbnQgcmdiYTQ0NDQsIGludCByZ2JhODg4OCwgaW50IHJnYjU2NSk7Ci0KICAgICBuYXRpdmUgaW50ICBuRGV2aWNlQ3JlYXRlKCk7CiAgICAgbmF0aXZlIHZvaWQgbkRldmljZURlc3Ryb3koaW50IGRldik7CiAgICAgbmF0aXZlIHZvaWQgbkRldmljZVNldENvbmZpZyhpbnQgZGV2LCBpbnQgcGFyYW0sIGludCB2YWx1ZSk7Ci0gICAgbmF0aXZlIGludCAgbkNvbnRleHRDcmVhdGVHTChpbnQgZGV2LCBpbnQgdmVyLCBib29sZWFuIHVzZURlcHRoKTsKLSAgICBuYXRpdmUgaW50ICBuQ29udGV4dENyZWF0ZShpbnQgZGV2LCBpbnQgdmVyKTsKLSAgICBuYXRpdmUgdm9pZCBuQ29udGV4dERlc3Ryb3koaW50IGNvbik7Ci0gICAgbmF0aXZlIHZvaWQgbkNvbnRleHRTZXRTdXJmYWNlKGludCB3LCBpbnQgaCwgU3VyZmFjZSBzdXIpOwotICAgIG5hdGl2ZSB2b2lkIG5Db250ZXh0U2V0UHJpb3JpdHkoaW50IHApOwotICAgIG5hdGl2ZSB2b2lkIG5Db250ZXh0RHVtcChpbnQgYml0cyk7Ci0KLSAgICBuYXRpdmUgdm9pZCBuQ29udGV4dEJpbmRSb290U2NyaXB0KGludCBzY3JpcHQpOwotICAgIG5hdGl2ZSB2b2lkIG5Db250ZXh0QmluZFNhbXBsZXIoaW50IHNhbXBsZXIsIGludCBzbG90KTsKLSAgICBuYXRpdmUgdm9pZCBuQ29udGV4dEJpbmRQcm9ncmFtRnJhZ21lbnRTdG9yZShpbnQgcGZzKTsKLSAgICBuYXRpdmUgdm9pZCBuQ29udGV4dEJpbmRQcm9ncmFtRnJhZ21lbnQoaW50IHBmKTsKLSAgICBuYXRpdmUgdm9pZCBuQ29udGV4dEJpbmRQcm9ncmFtVmVydGV4KGludCBwZik7Ci0gICAgbmF0aXZlIHZvaWQgbkNvbnRleHRCaW5kUHJvZ3JhbVJhc3RlcihpbnQgcHIpOwotICAgIG5hdGl2ZSB2b2lkIG5Db250ZXh0UGF1c2UoKTsKLSAgICBuYXRpdmUgdm9pZCBuQ29udGV4dFJlc3VtZSgpOwotICAgIG5hdGl2ZSBpbnQgbkNvbnRleHRHZXRNZXNzYWdlKGludFtdIGRhdGEsIGJvb2xlYW4gd2FpdCk7Ci0gICAgbmF0aXZlIHZvaWQgbkNvbnRleHRJbml0VG9DbGllbnQoKTsKLSAgICBuYXRpdmUgdm9pZCBuQ29udGV4dERlaW5pdFRvQ2xpZW50KCk7Ci0KLSAgICBuYXRpdmUgdm9pZCBuQXNzaWduTmFtZShpbnQgb2JqLCBieXRlW10gbmFtZSk7Ci0gICAgbmF0aXZlIHZvaWQgbk9iakRlc3Ryb3koaW50IGlkKTsKLSAgICBuYXRpdmUgdm9pZCBuT2JqRGVzdHJveU9PQihpbnQgaWQpOwotICAgIG5hdGl2ZSBpbnQgIG5GaWxlT3BlbihieXRlW10gbmFtZSk7CisgICAgbmF0aXZlIGludCAgbkNvbnRleHRHZXRNZXNzYWdlKGludCBjb24sIGludFtdIGRhdGEsIGJvb2xlYW4gd2FpdCk7CisgICAgbmF0aXZlIHZvaWQgbkNvbnRleHRJbml0VG9DbGllbnQoaW50IGNvbik7CisgICAgbmF0aXZlIHZvaWQgbkNvbnRleHREZWluaXRUb0NsaWVudChpbnQgY29uKTsKIAogCi0gICAgbmF0aXZlIGludCAgbkVsZW1lbnRDcmVhdGUoaW50IHR5cGUsIGludCBraW5kLCBib29sZWFuIG5vcm0sIGludCB2ZWNTaXplKTsKLSAgICBuYXRpdmUgaW50ICBuRWxlbWVudENyZWF0ZTIoaW50W10gZWxlbWVudHMsIFN0cmluZ1tdIG5hbWVzKTsKKyAgICAvLyBNZXRob2RzIGJlbG93IGFyZSB3cmFwcGVkIHRvIHByb3RlY3QgdGhlIG5vbi10aHJlYWRzYWZlCisgICAgLy8gbG9ja2xlc3MgZmlmby4KKyAgICBuYXRpdmUgaW50ICByc25Db250ZXh0Q3JlYXRlR0woaW50IGRldiwgaW50IHZlciwgYm9vbGVhbiB1c2VEZXB0aCk7CisgICAgc3luY2hyb25pemVkIGludCBuQ29udGV4dENyZWF0ZUdMKGludCBkZXYsIGludCB2ZXIsIGJvb2xlYW4gdXNlRGVwdGgpIHsKKyAgICAgICAgcmV0dXJuIHJzbkNvbnRleHRDcmVhdGVHTChkZXYsIHZlciwgdXNlRGVwdGgpOworICAgIH0KKyAgICBuYXRpdmUgaW50ICByc25Db250ZXh0Q3JlYXRlKGludCBkZXYsIGludCB2ZXIpOworICAgIHN5bmNocm9uaXplZCBpbnQgbkNvbnRleHRDcmVhdGUoaW50IGRldiwgaW50IHZlcikgeworICAgICAgICByZXR1cm4gcnNuQ29udGV4dENyZWF0ZShkZXYsIHZlcik7CisgICAgfQorICAgIG5hdGl2ZSB2b2lkIHJzbkNvbnRleHREZXN0cm95KGludCBjb24pOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5Db250ZXh0RGVzdHJveSgpIHsKKyAgICAgICAgcnNuQ29udGV4dERlc3Ryb3kobUNvbnRleHQpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25Db250ZXh0U2V0U3VyZmFjZShpbnQgY29uLCBpbnQgdywgaW50IGgsIFN1cmZhY2Ugc3VyKTsKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBuQ29udGV4dFNldFN1cmZhY2UoaW50IHcsIGludCBoLCBTdXJmYWNlIHN1cikgeworICAgICAgICByc25Db250ZXh0U2V0U3VyZmFjZShtQ29udGV4dCwgdywgaCwgc3VyKTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuQ29udGV4dFNldFByaW9yaXR5KGludCBjb24sIGludCBwKTsKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBuQ29udGV4dFNldFByaW9yaXR5KGludCBwKSB7CisgICAgICAgIHJzbkNvbnRleHRTZXRQcmlvcml0eShtQ29udGV4dCwgcCk7CisgICAgfQorICAgIG5hdGl2ZSB2b2lkIHJzbkNvbnRleHREdW1wKGludCBjb24sIGludCBiaXRzKTsKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBuQ29udGV4dER1bXAoaW50IGJpdHMpIHsKKyAgICAgICAgcnNuQ29udGV4dER1bXAobUNvbnRleHQsIGJpdHMpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25Db250ZXh0RmluaXNoKGludCBjb24pOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5Db250ZXh0RmluaXNoKCkgeworICAgICAgICByc25Db250ZXh0RmluaXNoKG1Db250ZXh0KTsKKyAgICB9CiAKLSAgICBuYXRpdmUgdm9pZCBuVHlwZUJlZ2luKGludCBlbGVtZW50SUQpOwotICAgIG5hdGl2ZSB2b2lkIG5UeXBlQWRkKGludCBkaW0sIGludCB2YWwpOwotICAgIG5hdGl2ZSBpbnQgIG5UeXBlQ3JlYXRlKCk7Ci0gICAgbmF0aXZlIHZvaWQgblR5cGVGaW5hbERlc3Ryb3koVHlwZSB0KTsKLSAgICBuYXRpdmUgdm9pZCBuVHlwZVNldHVwRmllbGRzKFR5cGUgdCwgaW50W10gdHlwZXMsIGludFtdIGJpdHMsIEZpZWxkW10gSURzKTsKKyAgICBuYXRpdmUgdm9pZCByc25Db250ZXh0QmluZFJvb3RTY3JpcHQoaW50IGNvbiwgaW50IHNjcmlwdCk7CisgICAgc3luY2hyb25pemVkIHZvaWQgbkNvbnRleHRCaW5kUm9vdFNjcmlwdChpbnQgc2NyaXB0KSB7CisgICAgICAgIHJzbkNvbnRleHRCaW5kUm9vdFNjcmlwdChtQ29udGV4dCwgc2NyaXB0KTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuQ29udGV4dEJpbmRTYW1wbGVyKGludCBjb24sIGludCBzYW1wbGVyLCBpbnQgc2xvdCk7CisgICAgc3luY2hyb25pemVkIHZvaWQgbkNvbnRleHRCaW5kU2FtcGxlcihpbnQgc2FtcGxlciwgaW50IHNsb3QpIHsKKyAgICAgICAgcnNuQ29udGV4dEJpbmRTYW1wbGVyKG1Db250ZXh0LCBzYW1wbGVyLCBzbG90KTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuQ29udGV4dEJpbmRQcm9ncmFtU3RvcmUoaW50IGNvbiwgaW50IHBmcyk7CisgICAgc3luY2hyb25pemVkIHZvaWQgbkNvbnRleHRCaW5kUHJvZ3JhbVN0b3JlKGludCBwZnMpIHsKKyAgICAgICAgcnNuQ29udGV4dEJpbmRQcm9ncmFtU3RvcmUobUNvbnRleHQsIHBmcyk7CisgICAgfQorICAgIG5hdGl2ZSB2b2lkIHJzbkNvbnRleHRCaW5kUHJvZ3JhbUZyYWdtZW50KGludCBjb24sIGludCBwZik7CisgICAgc3luY2hyb25pemVkIHZvaWQgbkNvbnRleHRCaW5kUHJvZ3JhbUZyYWdtZW50KGludCBwZikgeworICAgICAgICByc25Db250ZXh0QmluZFByb2dyYW1GcmFnbWVudChtQ29udGV4dCwgcGYpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25Db250ZXh0QmluZFByb2dyYW1WZXJ0ZXgoaW50IGNvbiwgaW50IHB2KTsKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBuQ29udGV4dEJpbmRQcm9ncmFtVmVydGV4KGludCBwdikgeworICAgICAgICByc25Db250ZXh0QmluZFByb2dyYW1WZXJ0ZXgobUNvbnRleHQsIHB2KTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuQ29udGV4dEJpbmRQcm9ncmFtUmFzdGVyKGludCBjb24sIGludCBwcik7CisgICAgc3luY2hyb25pemVkIHZvaWQgbkNvbnRleHRCaW5kUHJvZ3JhbVJhc3RlcihpbnQgcHIpIHsKKyAgICAgICAgcnNuQ29udGV4dEJpbmRQcm9ncmFtUmFzdGVyKG1Db250ZXh0LCBwcik7CisgICAgfQorICAgIG5hdGl2ZSB2b2lkIHJzbkNvbnRleHRQYXVzZShpbnQgY29uKTsKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBuQ29udGV4dFBhdXNlKCkgeworICAgICAgICByc25Db250ZXh0UGF1c2UobUNvbnRleHQpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25Db250ZXh0UmVzdW1lKGludCBjb24pOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5Db250ZXh0UmVzdW1lKCkgeworICAgICAgICByc25Db250ZXh0UmVzdW1lKG1Db250ZXh0KTsKKyAgICB9CiAKLSAgICBuYXRpdmUgaW50ICBuQWxsb2NhdGlvbkNyZWF0ZVR5cGVkKGludCB0eXBlKTsKLSAgICBuYXRpdmUgaW50ICBuQWxsb2NhdGlvbkNyZWF0ZUZyb21CaXRtYXAoaW50IGRzdEZtdCwgYm9vbGVhbiBnZW5NaXBzLCBCaXRtYXAgYm1wKTsKLSAgICBuYXRpdmUgaW50ICBuQWxsb2NhdGlvbkNyZWF0ZUJpdG1hcFJlZihpbnQgdHlwZSwgQml0bWFwIGJtcCk7Ci0gICAgbmF0aXZlIGludCAgbkFsbG9jYXRpb25DcmVhdGVGcm9tQml0bWFwQm94ZWQoaW50IGRzdEZtdCwgYm9vbGVhbiBnZW5NaXBzLCBCaXRtYXAgYm1wKTsKLSAgICBuYXRpdmUgaW50ICBuQWxsb2NhdGlvbkNyZWF0ZUZyb21Bc3NldFN0cmVhbShpbnQgZHN0Rm10LCBib29sZWFuIGdlbk1pcHMsIGludCBhc3NldFN0cmVhbSk7CisgICAgbmF0aXZlIHZvaWQgcnNuQXNzaWduTmFtZShpbnQgY29uLCBpbnQgb2JqLCBieXRlW10gbmFtZSk7CisgICAgc3luY2hyb25pemVkIHZvaWQgbkFzc2lnbk5hbWUoaW50IG9iaiwgYnl0ZVtdIG5hbWUpIHsKKyAgICAgICAgcnNuQXNzaWduTmFtZShtQ29udGV4dCwgb2JqLCBuYW1lKTsKKyAgICB9CisgICAgbmF0aXZlIFN0cmluZyByc25HZXROYW1lKGludCBjb24sIGludCBvYmopOworICAgIHN5bmNocm9uaXplZCBTdHJpbmcgbkdldE5hbWUoaW50IG9iaikgeworICAgICAgICByZXR1cm4gcnNuR2V0TmFtZShtQ29udGV4dCwgb2JqKTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuT2JqRGVzdHJveShpbnQgY29uLCBpbnQgaWQpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5PYmpEZXN0cm95KGludCBpZCkgeworICAgICAgICByc25PYmpEZXN0cm95KG1Db250ZXh0LCBpZCk7CisgICAgfQorICAgIG5hdGl2ZSBpbnQgIHJzbkZpbGVPcGVuKGludCBjb24sIGJ5dGVbXSBuYW1lKTsKKyAgICBzeW5jaHJvbml6ZWQgaW50IG5GaWxlT3BlbihieXRlW10gbmFtZSkgeworICAgICAgICByZXR1cm4gcnNuRmlsZU9wZW4obUNvbnRleHQsIG5hbWUpOworICAgIH0KIAotICAgIG5hdGl2ZSB2b2lkIG5BbGxvY2F0aW9uVXBsb2FkVG9UZXh0dXJlKGludCBhbGxvYywgYm9vbGVhbiBnZW5NaXBzLCBpbnQgYmFzZU1pb0xldmVsKTsKLSAgICBuYXRpdmUgdm9pZCBuQWxsb2NhdGlvblVwbG9hZFRvQnVmZmVyT2JqZWN0KGludCBhbGxvYyk7CisgICAgbmF0aXZlIGludCAgcnNuRWxlbWVudENyZWF0ZShpbnQgY29uLCBpbnQgdHlwZSwgaW50IGtpbmQsIGJvb2xlYW4gbm9ybSwgaW50IHZlY1NpemUpOworICAgIHN5bmNocm9uaXplZCBpbnQgbkVsZW1lbnRDcmVhdGUoaW50IHR5cGUsIGludCBraW5kLCBib29sZWFuIG5vcm0sIGludCB2ZWNTaXplKSB7CisgICAgICAgIHJldHVybiByc25FbGVtZW50Q3JlYXRlKG1Db250ZXh0LCB0eXBlLCBraW5kLCBub3JtLCB2ZWNTaXplKTsKKyAgICB9CisgICAgbmF0aXZlIGludCAgcnNuRWxlbWVudENyZWF0ZTIoaW50IGNvbiwgaW50W10gZWxlbWVudHMsIFN0cmluZ1tdIG5hbWVzKTsKKyAgICBzeW5jaHJvbml6ZWQgaW50IG5FbGVtZW50Q3JlYXRlMihpbnRbXSBlbGVtZW50cywgU3RyaW5nW10gbmFtZXMpIHsKKyAgICAgICAgcmV0dXJuIHJzbkVsZW1lbnRDcmVhdGUyKG1Db250ZXh0LCBlbGVtZW50cywgbmFtZXMpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25FbGVtZW50R2V0TmF0aXZlRGF0YShpbnQgY29uLCBpbnQgaWQsIGludFtdIGVsZW1lbnREYXRhKTsKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBuRWxlbWVudEdldE5hdGl2ZURhdGEoaW50IGlkLCBpbnRbXSBlbGVtZW50RGF0YSkgeworICAgICAgICByc25FbGVtZW50R2V0TmF0aXZlRGF0YShtQ29udGV4dCwgaWQsIGVsZW1lbnREYXRhKTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuRWxlbWVudEdldFN1YkVsZW1lbnRzKGludCBjb24sIGludCBpZCwgaW50W10gSURzLCBTdHJpbmdbXSBuYW1lcyk7CisgICAgc3luY2hyb25pemVkIHZvaWQgbkVsZW1lbnRHZXRTdWJFbGVtZW50cyhpbnQgaWQsIGludFtdIElEcywgU3RyaW5nW10gbmFtZXMpIHsKKyAgICAgICAgcnNuRWxlbWVudEdldFN1YkVsZW1lbnRzKG1Db250ZXh0LCBpZCwgSURzLCBuYW1lcyk7CisgICAgfQogCi0gICAgbmF0aXZlIHZvaWQgbkFsbG9jYXRpb25TdWJEYXRhMUQoaW50IGlkLCBpbnQgb2ZmLCBpbnQgY291bnQsIGludFtdIGQsIGludCBzaXplQnl0ZXMpOwotICAgIG5hdGl2ZSB2b2lkIG5BbGxvY2F0aW9uU3ViRGF0YTFEKGludCBpZCwgaW50IG9mZiwgaW50IGNvdW50LCBzaG9ydFtdIGQsIGludCBzaXplQnl0ZXMpOwotICAgIG5hdGl2ZSB2b2lkIG5BbGxvY2F0aW9uU3ViRGF0YTFEKGludCBpZCwgaW50IG9mZiwgaW50IGNvdW50LCBieXRlW10gZCwgaW50IHNpemVCeXRlcyk7Ci0gICAgbmF0aXZlIHZvaWQgbkFsbG9jYXRpb25TdWJEYXRhMUQoaW50IGlkLCBpbnQgb2ZmLCBpbnQgY291bnQsIGZsb2F0W10gZCwgaW50IHNpemVCeXRlcyk7CisgICAgbmF0aXZlIHZvaWQgcnNuVHlwZUJlZ2luKGludCBjb24sIGludCBlbGVtZW50SUQpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5UeXBlQmVnaW4oaW50IGVsZW1lbnRJRCkgeworICAgICAgICByc25UeXBlQmVnaW4obUNvbnRleHQsIGVsZW1lbnRJRCk7CisgICAgfQorICAgIG5hdGl2ZSB2b2lkIHJzblR5cGVBZGQoaW50IGNvbiwgaW50IGRpbSwgaW50IHZhbCk7CisgICAgc3luY2hyb25pemVkIHZvaWQgblR5cGVBZGQoaW50IGRpbSwgaW50IHZhbCkgeworICAgICAgICByc25UeXBlQWRkKG1Db250ZXh0LCBkaW0sIHZhbCk7CisgICAgfQorICAgIG5hdGl2ZSBpbnQgIHJzblR5cGVDcmVhdGUoaW50IGNvbik7CisgICAgc3luY2hyb25pemVkIGludCBuVHlwZUNyZWF0ZSgpIHsKKyAgICAgICAgcmV0dXJuIHJzblR5cGVDcmVhdGUobUNvbnRleHQpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25UeXBlRmluYWxEZXN0cm95KGludCBjb24sIFR5cGUgdCk7CisgICAgc3luY2hyb25pemVkIHZvaWQgblR5cGVGaW5hbERlc3Ryb3koVHlwZSB0KSB7CisgICAgICAgIHJzblR5cGVGaW5hbERlc3Ryb3kobUNvbnRleHQsIHQpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25UeXBlU2V0dXBGaWVsZHMoaW50IGNvbiwgVHlwZSB0LCBpbnRbXSB0eXBlcywgaW50W10gYml0cywgRmllbGRbXSBJRHMpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5UeXBlU2V0dXBGaWVsZHMoVHlwZSB0LCBpbnRbXSB0eXBlcywgaW50W10gYml0cywgRmllbGRbXSBJRHMpIHsKKyAgICAgICAgcnNuVHlwZVNldHVwRmllbGRzKG1Db250ZXh0LCB0LCB0eXBlcywgYml0cywgSURzKTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuVHlwZUdldE5hdGl2ZURhdGEoaW50IGNvbiwgaW50IGlkLCBpbnRbXSB0eXBlRGF0YSk7CisgICAgc3luY2hyb25pemVkIHZvaWQgblR5cGVHZXROYXRpdmVEYXRhKGludCBpZCwgaW50W10gdHlwZURhdGEpIHsKKyAgICAgICAgcnNuVHlwZUdldE5hdGl2ZURhdGEobUNvbnRleHQsIGlkLCB0eXBlRGF0YSk7CisgICAgfQogCi0gICAgbmF0aXZlIHZvaWQgbkFsbG9jYXRpb25TdWJEYXRhMkQoaW50IGlkLCBpbnQgeG9mZiwgaW50IHlvZmYsIGludCB3LCBpbnQgaCwgaW50W10gZCwgaW50IHNpemVCeXRlcyk7Ci0gICAgbmF0aXZlIHZvaWQgbkFsbG9jYXRpb25TdWJEYXRhMkQoaW50IGlkLCBpbnQgeG9mZiwgaW50IHlvZmYsIGludCB3LCBpbnQgaCwgZmxvYXRbXSBkLCBpbnQgc2l6ZUJ5dGVzKTsKLSAgICBuYXRpdmUgdm9pZCBuQWxsb2NhdGlvblJlYWQoaW50IGlkLCBpbnRbXSBkKTsKLSAgICBuYXRpdmUgdm9pZCBuQWxsb2NhdGlvblJlYWQoaW50IGlkLCBmbG9hdFtdIGQpOwotICAgIG5hdGl2ZSB2b2lkIG5BbGxvY2F0aW9uU3ViRGF0YUZyb21PYmplY3QoaW50IGlkLCBUeXBlIHQsIGludCBvZmZzZXQsIE9iamVjdCBvKTsKLSAgICBuYXRpdmUgdm9pZCBuQWxsb2NhdGlvblN1YlJlYWRGcm9tT2JqZWN0KGludCBpZCwgVHlwZSB0LCBpbnQgb2Zmc2V0LCBPYmplY3Qgbyk7CisgICAgbmF0aXZlIGludCAgcnNuQWxsb2NhdGlvbkNyZWF0ZVR5cGVkKGludCBjb24sIGludCB0eXBlKTsKKyAgICBzeW5jaHJvbml6ZWQgaW50IG5BbGxvY2F0aW9uQ3JlYXRlVHlwZWQoaW50IHR5cGUpIHsKKyAgICAgICAgcmV0dXJuIHJzbkFsbG9jYXRpb25DcmVhdGVUeXBlZChtQ29udGV4dCwgdHlwZSk7CisgICAgfQorICAgIG5hdGl2ZSBpbnQgIHJzbkFsbG9jYXRpb25DcmVhdGVGcm9tQml0bWFwKGludCBjb24sIGludCBkc3RGbXQsIGJvb2xlYW4gZ2VuTWlwcywgQml0bWFwIGJtcCk7CisgICAgc3luY2hyb25pemVkIGludCBuQWxsb2NhdGlvbkNyZWF0ZUZyb21CaXRtYXAoaW50IGRzdEZtdCwgYm9vbGVhbiBnZW5NaXBzLCBCaXRtYXAgYm1wKSB7CisgICAgICAgIHJldHVybiByc25BbGxvY2F0aW9uQ3JlYXRlRnJvbUJpdG1hcChtQ29udGV4dCwgZHN0Rm10LCBnZW5NaXBzLCBibXApOworICAgIH0KKyAgICBuYXRpdmUgaW50ICByc25BbGxvY2F0aW9uQ3JlYXRlQml0bWFwUmVmKGludCBjb24sIGludCB0eXBlLCBCaXRtYXAgYm1wKTsKKyAgICBzeW5jaHJvbml6ZWQgaW50IG5BbGxvY2F0aW9uQ3JlYXRlQml0bWFwUmVmKGludCB0eXBlLCBCaXRtYXAgYm1wKSB7CisgICAgICAgIHJldHVybiByc25BbGxvY2F0aW9uQ3JlYXRlQml0bWFwUmVmKG1Db250ZXh0LCB0eXBlLCBibXApOworICAgIH0KKyAgICBuYXRpdmUgaW50ICByc25BbGxvY2F0aW9uQ3JlYXRlRnJvbUJpdG1hcEJveGVkKGludCBjb24sIGludCBkc3RGbXQsIGJvb2xlYW4gZ2VuTWlwcywgQml0bWFwIGJtcCk7CisgICAgc3luY2hyb25pemVkIGludCBuQWxsb2NhdGlvbkNyZWF0ZUZyb21CaXRtYXBCb3hlZChpbnQgZHN0Rm10LCBib29sZWFuIGdlbk1pcHMsIEJpdG1hcCBibXApIHsKKyAgICAgICAgcmV0dXJuIHJzbkFsbG9jYXRpb25DcmVhdGVGcm9tQml0bWFwQm94ZWQobUNvbnRleHQsIGRzdEZtdCwgZ2VuTWlwcywgYm1wKTsKKyAgICB9CisgICAgbmF0aXZlIGludCAgcnNuQWxsb2NhdGlvbkNyZWF0ZUZyb21Bc3NldFN0cmVhbShpbnQgY29uLCBpbnQgZHN0Rm10LCBib29sZWFuIGdlbk1pcHMsIGludCBhc3NldFN0cmVhbSk7CisgICAgc3luY2hyb25pemVkIGludCBuQWxsb2NhdGlvbkNyZWF0ZUZyb21Bc3NldFN0cmVhbShpbnQgZHN0Rm10LCBib29sZWFuIGdlbk1pcHMsIGludCBhc3NldFN0cmVhbSkgeworICAgICAgICByZXR1cm4gcnNuQWxsb2NhdGlvbkNyZWF0ZUZyb21Bc3NldFN0cmVhbShtQ29udGV4dCwgZHN0Rm10LCBnZW5NaXBzLCBhc3NldFN0cmVhbSk7CisgICAgfQogCi0gICAgbmF0aXZlIHZvaWQgbkFkYXB0ZXIxREJpbmRBbGxvY2F0aW9uKGludCBhZCwgaW50IGFsbG9jKTsKLSAgICBuYXRpdmUgdm9pZCBuQWRhcHRlcjFEU2V0Q29uc3RyYWludChpbnQgYWQsIGludCBkaW0sIGludCB2YWx1ZSk7Ci0gICAgbmF0aXZlIHZvaWQgbkFkYXB0ZXIxRERhdGEoaW50IGFkLCBpbnRbXSBkKTsKLSAgICBuYXRpdmUgdm9pZCBuQWRhcHRlcjFERGF0YShpbnQgYWQsIGZsb2F0W10gZCk7Ci0gICAgbmF0aXZlIHZvaWQgbkFkYXB0ZXIxRFN1YkRhdGEoaW50IGFkLCBpbnQgb2ZmLCBpbnQgY291bnQsIGludFtdIGQpOwotICAgIG5hdGl2ZSB2b2lkIG5BZGFwdGVyMURTdWJEYXRhKGludCBhZCwgaW50IG9mZiwgaW50IGNvdW50LCBmbG9hdFtdIGQpOwotICAgIG5hdGl2ZSBpbnQgIG5BZGFwdGVyMURDcmVhdGUoKTsKKyAgICBuYXRpdmUgdm9pZCByc25BbGxvY2F0aW9uVXBsb2FkVG9UZXh0dXJlKGludCBjb24sIGludCBhbGxvYywgYm9vbGVhbiBnZW5NaXBzLCBpbnQgYmFzZU1pb0xldmVsKTsKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBuQWxsb2NhdGlvblVwbG9hZFRvVGV4dHVyZShpbnQgYWxsb2MsIGJvb2xlYW4gZ2VuTWlwcywgaW50IGJhc2VNaW9MZXZlbCkgeworICAgICAgICByc25BbGxvY2F0aW9uVXBsb2FkVG9UZXh0dXJlKG1Db250ZXh0LCBhbGxvYywgZ2VuTWlwcywgYmFzZU1pb0xldmVsKTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuQWxsb2NhdGlvblVwbG9hZFRvQnVmZmVyT2JqZWN0KGludCBjb24sIGludCBhbGxvYyk7CisgICAgc3luY2hyb25pemVkIHZvaWQgbkFsbG9jYXRpb25VcGxvYWRUb0J1ZmZlck9iamVjdChpbnQgYWxsb2MpIHsKKyAgICAgICAgcnNuQWxsb2NhdGlvblVwbG9hZFRvQnVmZmVyT2JqZWN0KG1Db250ZXh0LCBhbGxvYyk7CisgICAgfQogCi0gICAgbmF0aXZlIHZvaWQgbkFkYXB0ZXIyREJpbmRBbGxvY2F0aW9uKGludCBhZCwgaW50IGFsbG9jKTsKLSAgICBuYXRpdmUgdm9pZCBuQWRhcHRlcjJEU2V0Q29uc3RyYWludChpbnQgYWQsIGludCBkaW0sIGludCB2YWx1ZSk7Ci0gICAgbmF0aXZlIHZvaWQgbkFkYXB0ZXIyRERhdGEoaW50IGFkLCBpbnRbXSBkKTsKLSAgICBuYXRpdmUgdm9pZCBuQWRhcHRlcjJERGF0YShpbnQgYWQsIGZsb2F0W10gZCk7Ci0gICAgbmF0aXZlIHZvaWQgbkFkYXB0ZXIyRFN1YkRhdGEoaW50IGFkLCBpbnQgeG9mZiwgaW50IHlvZmYsIGludCB3LCBpbnQgaCwgaW50W10gZCk7Ci0gICAgbmF0aXZlIHZvaWQgbkFkYXB0ZXIyRFN1YkRhdGEoaW50IGFkLCBpbnQgeG9mZiwgaW50IHlvZmYsIGludCB3LCBpbnQgaCwgZmxvYXRbXSBkKTsKLSAgICBuYXRpdmUgaW50ICBuQWRhcHRlcjJEQ3JlYXRlKCk7CisgICAgbmF0aXZlIHZvaWQgcnNuQWxsb2NhdGlvblN1YkRhdGExRChpbnQgY29uLCBpbnQgaWQsIGludCBvZmYsIGludCBjb3VudCwgaW50W10gZCwgaW50IHNpemVCeXRlcyk7CisgICAgc3luY2hyb25pemVkIHZvaWQgbkFsbG9jYXRpb25TdWJEYXRhMUQoaW50IGlkLCBpbnQgb2ZmLCBpbnQgY291bnQsIGludFtdIGQsIGludCBzaXplQnl0ZXMpIHsKKyAgICAgICAgcnNuQWxsb2NhdGlvblN1YkRhdGExRChtQ29udGV4dCwgaWQsIG9mZiwgY291bnQsIGQsIHNpemVCeXRlcyk7CisgICAgfQorICAgIG5hdGl2ZSB2b2lkIHJzbkFsbG9jYXRpb25TdWJEYXRhMUQoaW50IGNvbiwgaW50IGlkLCBpbnQgb2ZmLCBpbnQgY291bnQsIHNob3J0W10gZCwgaW50IHNpemVCeXRlcyk7CisgICAgc3luY2hyb25pemVkIHZvaWQgbkFsbG9jYXRpb25TdWJEYXRhMUQoaW50IGlkLCBpbnQgb2ZmLCBpbnQgY291bnQsIHNob3J0W10gZCwgaW50IHNpemVCeXRlcykgeworICAgICAgICByc25BbGxvY2F0aW9uU3ViRGF0YTFEKG1Db250ZXh0LCBpZCwgb2ZmLCBjb3VudCwgZCwgc2l6ZUJ5dGVzKTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuQWxsb2NhdGlvblN1YkRhdGExRChpbnQgY29uLCBpbnQgaWQsIGludCBvZmYsIGludCBjb3VudCwgYnl0ZVtdIGQsIGludCBzaXplQnl0ZXMpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5BbGxvY2F0aW9uU3ViRGF0YTFEKGludCBpZCwgaW50IG9mZiwgaW50IGNvdW50LCBieXRlW10gZCwgaW50IHNpemVCeXRlcykgeworICAgICAgICByc25BbGxvY2F0aW9uU3ViRGF0YTFEKG1Db250ZXh0LCBpZCwgb2ZmLCBjb3VudCwgZCwgc2l6ZUJ5dGVzKTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuQWxsb2NhdGlvblN1YkRhdGExRChpbnQgY29uLCBpbnQgaWQsIGludCBvZmYsIGludCBjb3VudCwgZmxvYXRbXSBkLCBpbnQgc2l6ZUJ5dGVzKTsKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBuQWxsb2NhdGlvblN1YkRhdGExRChpbnQgaWQsIGludCBvZmYsIGludCBjb3VudCwgZmxvYXRbXSBkLCBpbnQgc2l6ZUJ5dGVzKSB7CisgICAgICAgIHJzbkFsbG9jYXRpb25TdWJEYXRhMUQobUNvbnRleHQsIGlkLCBvZmYsIGNvdW50LCBkLCBzaXplQnl0ZXMpOworICAgIH0KIAotICAgIG5hdGl2ZSB2b2lkIG5TY3JpcHRCaW5kQWxsb2NhdGlvbihpbnQgc2NyaXB0LCBpbnQgYWxsb2MsIGludCBzbG90KTsKLSAgICBuYXRpdmUgdm9pZCBuU2NyaXB0U2V0Q2xlYXJDb2xvcihpbnQgc2NyaXB0LCBmbG9hdCByLCBmbG9hdCBnLCBmbG9hdCBiLCBmbG9hdCBhKTsKLSAgICBuYXRpdmUgdm9pZCBuU2NyaXB0U2V0Q2xlYXJEZXB0aChpbnQgc2NyaXB0LCBmbG9hdCBkZXB0aCk7Ci0gICAgbmF0aXZlIHZvaWQgblNjcmlwdFNldENsZWFyU3RlbmNpbChpbnQgc2NyaXB0LCBpbnQgc3RlbmNpbCk7Ci0gICAgbmF0aXZlIHZvaWQgblNjcmlwdFNldFRpbWVab25lKGludCBzY3JpcHQsIGJ5dGVbXSB0aW1lWm9uZSk7Ci0gICAgbmF0aXZlIHZvaWQgblNjcmlwdFNldFR5cGUoaW50IHR5cGUsIGJvb2xlYW4gd3JpdGFibGUsIFN0cmluZyBuYW1lLCBpbnQgc2xvdCk7Ci0gICAgbmF0aXZlIHZvaWQgblNjcmlwdFNldFJvb3QoYm9vbGVhbiBpc1Jvb3QpOwotICAgIG5hdGl2ZSB2b2lkIG5TY3JpcHRTZXRJbnZva2FibGUoU3RyaW5nIG5hbWUsIGludCBzbG90KTsKLSAgICBuYXRpdmUgdm9pZCBuU2NyaXB0SW52b2tlKGludCBpZCwgaW50IHNsb3QpOworICAgIG5hdGl2ZSB2b2lkIHJzbkFsbG9jYXRpb25TdWJEYXRhMkQoaW50IGNvbiwgaW50IGlkLCBpbnQgeG9mZiwgaW50IHlvZmYsIGludCB3LCBpbnQgaCwgaW50W10gZCwgaW50IHNpemVCeXRlcyk7CisgICAgc3luY2hyb25pemVkIHZvaWQgbkFsbG9jYXRpb25TdWJEYXRhMkQoaW50IGlkLCBpbnQgeG9mZiwgaW50IHlvZmYsIGludCB3LCBpbnQgaCwgaW50W10gZCwgaW50IHNpemVCeXRlcykgeworICAgICAgICByc25BbGxvY2F0aW9uU3ViRGF0YTJEKG1Db250ZXh0LCBpZCwgeG9mZiwgeW9mZiwgdywgaCwgZCwgc2l6ZUJ5dGVzKTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuQWxsb2NhdGlvblN1YkRhdGEyRChpbnQgY29uLCBpbnQgaWQsIGludCB4b2ZmLCBpbnQgeW9mZiwgaW50IHcsIGludCBoLCBmbG9hdFtdIGQsIGludCBzaXplQnl0ZXMpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5BbGxvY2F0aW9uU3ViRGF0YTJEKGludCBpZCwgaW50IHhvZmYsIGludCB5b2ZmLCBpbnQgdywgaW50IGgsIGZsb2F0W10gZCwgaW50IHNpemVCeXRlcykgeworICAgICAgICByc25BbGxvY2F0aW9uU3ViRGF0YTJEKG1Db250ZXh0LCBpZCwgeG9mZiwgeW9mZiwgdywgaCwgZCwgc2l6ZUJ5dGVzKTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuQWxsb2NhdGlvblJlYWQoaW50IGNvbiwgaW50IGlkLCBpbnRbXSBkKTsKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBuQWxsb2NhdGlvblJlYWQoaW50IGlkLCBpbnRbXSBkKSB7CisgICAgICAgIHJzbkFsbG9jYXRpb25SZWFkKG1Db250ZXh0LCBpZCwgZCk7CisgICAgfQorICAgIG5hdGl2ZSB2b2lkIHJzbkFsbG9jYXRpb25SZWFkKGludCBjb24sIGludCBpZCwgZmxvYXRbXSBkKTsKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBuQWxsb2NhdGlvblJlYWQoaW50IGlkLCBmbG9hdFtdIGQpIHsKKyAgICAgICAgcnNuQWxsb2NhdGlvblJlYWQobUNvbnRleHQsIGlkLCBkKTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuQWxsb2NhdGlvblN1YkRhdGFGcm9tT2JqZWN0KGludCBjb24sIGludCBpZCwgVHlwZSB0LCBpbnQgb2Zmc2V0LCBPYmplY3Qgbyk7CisgICAgc3luY2hyb25pemVkIHZvaWQgbkFsbG9jYXRpb25TdWJEYXRhRnJvbU9iamVjdChpbnQgaWQsIFR5cGUgdCwgaW50IG9mZnNldCwgT2JqZWN0IG8pIHsKKyAgICAgICAgcnNuQWxsb2NhdGlvblN1YkRhdGFGcm9tT2JqZWN0KG1Db250ZXh0LCBpZCwgdCwgb2Zmc2V0LCBvKTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuQWxsb2NhdGlvblN1YlJlYWRGcm9tT2JqZWN0KGludCBjb24sIGludCBpZCwgVHlwZSB0LCBpbnQgb2Zmc2V0LCBPYmplY3Qgbyk7CisgICAgc3luY2hyb25pemVkIHZvaWQgbkFsbG9jYXRpb25TdWJSZWFkRnJvbU9iamVjdChpbnQgaWQsIFR5cGUgdCwgaW50IG9mZnNldCwgT2JqZWN0IG8pIHsKKyAgICAgICAgcnNuQWxsb2NhdGlvblN1YlJlYWRGcm9tT2JqZWN0KG1Db250ZXh0LCBpZCwgdCwgb2Zmc2V0LCBvKTsKKyAgICB9CisgICAgbmF0aXZlIGludCAgcnNuQWxsb2NhdGlvbkdldFR5cGUoaW50IGNvbiwgaW50IGlkKTsKKyAgICBzeW5jaHJvbml6ZWQgaW50IG5BbGxvY2F0aW9uR2V0VHlwZShpbnQgaWQpIHsKKyAgICAgICAgcmV0dXJuIHJzbkFsbG9jYXRpb25HZXRUeXBlKG1Db250ZXh0LCBpZCk7CisgICAgfQogCi0gICAgbmF0aXZlIHZvaWQgblNjcmlwdENCZWdpbigpOwotICAgIG5hdGl2ZSB2b2lkIG5TY3JpcHRDU2V0U2NyaXB0KGJ5dGVbXSBzY3JpcHQsIGludCBvZmZzZXQsIGludCBsZW5ndGgpOwotICAgIG5hdGl2ZSBpbnQgIG5TY3JpcHRDQ3JlYXRlKCk7Ci0gICAgbmF0aXZlIHZvaWQgblNjcmlwdENBZGREZWZpbmVJMzIoU3RyaW5nIG5hbWUsIGludCB2YWx1ZSk7Ci0gICAgbmF0aXZlIHZvaWQgblNjcmlwdENBZGREZWZpbmVGKFN0cmluZyBuYW1lLCBmbG9hdCB2YWx1ZSk7CisgICAgbmF0aXZlIGludCAgcnNuRmlsZUEzRENyZWF0ZUZyb21Bc3NldFN0cmVhbShpbnQgY29uLCBpbnQgYXNzZXRTdHJlYW0pOworICAgIHN5bmNocm9uaXplZCBpbnQgbkZpbGVBM0RDcmVhdGVGcm9tQXNzZXRTdHJlYW0oaW50IGFzc2V0U3RyZWFtKSB7CisgICAgICAgIHJldHVybiByc25GaWxlQTNEQ3JlYXRlRnJvbUFzc2V0U3RyZWFtKG1Db250ZXh0LCBhc3NldFN0cmVhbSk7CisgICAgfQorICAgIG5hdGl2ZSBpbnQgIHJzbkZpbGVBM0RHZXROdW1JbmRleEVudHJpZXMoaW50IGNvbiwgaW50IGZpbGVBM0QpOworICAgIHN5bmNocm9uaXplZCBpbnQgbkZpbGVBM0RHZXROdW1JbmRleEVudHJpZXMoaW50IGZpbGVBM0QpIHsKKyAgICAgICAgcmV0dXJuIHJzbkZpbGVBM0RHZXROdW1JbmRleEVudHJpZXMobUNvbnRleHQsIGZpbGVBM0QpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25GaWxlQTNER2V0SW5kZXhFbnRyaWVzKGludCBjb24sIGludCBmaWxlQTNELCBpbnQgbnVtRW50cmllcywgaW50W10gSURzLCBTdHJpbmdbXSBuYW1lcyk7CisgICAgc3luY2hyb25pemVkIHZvaWQgbkZpbGVBM0RHZXRJbmRleEVudHJpZXMoaW50IGZpbGVBM0QsIGludCBudW1FbnRyaWVzLCBpbnRbXSBJRHMsIFN0cmluZ1tdIG5hbWVzKSB7CisgICAgICAgIHJzbkZpbGVBM0RHZXRJbmRleEVudHJpZXMobUNvbnRleHQsIGZpbGVBM0QsIG51bUVudHJpZXMsIElEcywgbmFtZXMpOworICAgIH0KKyAgICBuYXRpdmUgaW50ICByc25GaWxlQTNER2V0RW50cnlCeUluZGV4KGludCBjb24sIGludCBmaWxlQTNELCBpbnQgaW5kZXgpOworICAgIHN5bmNocm9uaXplZCBpbnQgbkZpbGVBM0RHZXRFbnRyeUJ5SW5kZXgoaW50IGZpbGVBM0QsIGludCBpbmRleCkgeworICAgICAgICByZXR1cm4gcnNuRmlsZUEzREdldEVudHJ5QnlJbmRleChtQ29udGV4dCwgZmlsZUEzRCwgaW5kZXgpOworICAgIH0KIAotICAgIG5hdGl2ZSB2b2lkIG5TYW1wbGVyQmVnaW4oKTsKLSAgICBuYXRpdmUgdm9pZCBuU2FtcGxlclNldChpbnQgcGFyYW0sIGludCB2YWx1ZSk7Ci0gICAgbmF0aXZlIGludCAgblNhbXBsZXJDcmVhdGUoKTsKKyAgICBuYXRpdmUgaW50ICByc25Gb250Q3JlYXRlRnJvbUZpbGUoaW50IGNvbiwgU3RyaW5nIGZpbGVOYW1lLCBpbnQgc2l6ZSwgaW50IGRwaSk7CisgICAgc3luY2hyb25pemVkIGludCBuRm9udENyZWF0ZUZyb21GaWxlKFN0cmluZyBmaWxlTmFtZSwgaW50IHNpemUsIGludCBkcGkpIHsKKyAgICAgICAgcmV0dXJuIHJzbkZvbnRDcmVhdGVGcm9tRmlsZShtQ29udGV4dCwgZmlsZU5hbWUsIHNpemUsIGRwaSk7CisgICAgfQogCi0gICAgbmF0aXZlIHZvaWQgblByb2dyYW1GcmFnbWVudFN0b3JlQmVnaW4oaW50IGluLCBpbnQgb3V0KTsKLSAgICBuYXRpdmUgdm9pZCBuUHJvZ3JhbUZyYWdtZW50U3RvcmVEZXB0aEZ1bmMoaW50IGZ1bmMpOwotICAgIG5hdGl2ZSB2b2lkIG5Qcm9ncmFtRnJhZ21lbnRTdG9yZURlcHRoTWFzayhib29sZWFuIGVuYWJsZSk7Ci0gICAgbmF0aXZlIHZvaWQgblByb2dyYW1GcmFnbWVudFN0b3JlQ29sb3JNYXNrKGJvb2xlYW4gciwgYm9vbGVhbiBnLCBib29sZWFuIGIsIGJvb2xlYW4gYSk7Ci0gICAgbmF0aXZlIHZvaWQgblByb2dyYW1GcmFnbWVudFN0b3JlQmxlbmRGdW5jKGludCBzcmMsIGludCBkc3QpOwotICAgIG5hdGl2ZSB2b2lkIG5Qcm9ncmFtRnJhZ21lbnRTdG9yZURpdGhlcihib29sZWFuIGVuYWJsZSk7Ci0gICAgbmF0aXZlIGludCAgblByb2dyYW1GcmFnbWVudFN0b3JlQ3JlYXRlKCk7CisgICAgbmF0aXZlIHZvaWQgcnNuQWRhcHRlcjFEQmluZEFsbG9jYXRpb24oaW50IGNvbiwgaW50IGFkLCBpbnQgYWxsb2MpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5BZGFwdGVyMURCaW5kQWxsb2NhdGlvbihpbnQgYWQsIGludCBhbGxvYykgeworICAgICAgICByc25BZGFwdGVyMURCaW5kQWxsb2NhdGlvbihtQ29udGV4dCwgYWQsIGFsbG9jKTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuQWRhcHRlcjFEU2V0Q29uc3RyYWludChpbnQgY29uLCBpbnQgYWQsIGludCBkaW0sIGludCB2YWx1ZSk7CisgICAgc3luY2hyb25pemVkIHZvaWQgbkFkYXB0ZXIxRFNldENvbnN0cmFpbnQoaW50IGFkLCBpbnQgZGltLCBpbnQgdmFsdWUpIHsKKyAgICAgICAgcnNuQWRhcHRlcjFEU2V0Q29uc3RyYWludChtQ29udGV4dCwgYWQsIGRpbSwgdmFsdWUpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25BZGFwdGVyMUREYXRhKGludCBjb24sIGludCBhZCwgaW50W10gZCk7CisgICAgc3luY2hyb25pemVkIHZvaWQgbkFkYXB0ZXIxRERhdGEoaW50IGFkLCBpbnRbXSBkKSB7CisgICAgICAgIHJzbkFkYXB0ZXIxRERhdGEobUNvbnRleHQsIGFkLCBkKTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuQWRhcHRlcjFERGF0YShpbnQgY29uLCBpbnQgYWQsIGZsb2F0W10gZCk7CisgICAgc3luY2hyb25pemVkIHZvaWQgbkFkYXB0ZXIxRERhdGEoaW50IGFkLCBmbG9hdFtdIGQpIHsKKyAgICAgICAgcnNuQWRhcHRlcjFERGF0YShtQ29udGV4dCwgYWQsIGQpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25BZGFwdGVyMURTdWJEYXRhKGludCBjb24sIGludCBhZCwgaW50IG9mZiwgaW50IGNvdW50LCBpbnRbXSBkKTsKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBuQWRhcHRlcjFEU3ViRGF0YShpbnQgYWQsIGludCBvZmYsIGludCBjb3VudCwgaW50W10gZCkgeworICAgICAgICByc25BZGFwdGVyMURTdWJEYXRhKG1Db250ZXh0LCBhZCwgb2ZmLCBjb3VudCwgZCk7CisgICAgfQorICAgIG5hdGl2ZSB2b2lkIHJzbkFkYXB0ZXIxRFN1YkRhdGEoaW50IGNvbiwgaW50IGFkLCBpbnQgb2ZmLCBpbnQgY291bnQsIGZsb2F0W10gZCk7CisgICAgc3luY2hyb25pemVkIHZvaWQgbkFkYXB0ZXIxRFN1YkRhdGEoaW50IGFkLCBpbnQgb2ZmLCBpbnQgY291bnQsIGZsb2F0W10gZCkgeworICAgICAgICByc25BZGFwdGVyMURTdWJEYXRhKG1Db250ZXh0LCBhZCwgb2ZmLCBjb3VudCwgZCk7CisgICAgfQorICAgIG5hdGl2ZSBpbnQgIHJzbkFkYXB0ZXIxRENyZWF0ZShpbnQgY29uKTsKKyAgICBzeW5jaHJvbml6ZWQgaW50IG5BZGFwdGVyMURDcmVhdGUoKSB7CisgICAgICAgIHJldHVybiByc25BZGFwdGVyMURDcmVhdGUobUNvbnRleHQpOworICAgIH0KIAotICAgIG5hdGl2ZSBpbnQgIG5Qcm9ncmFtUmFzdGVyQ3JlYXRlKGludCBpbiwgaW50IG91dCwgYm9vbGVhbiBwb2ludFNtb290aCwgYm9vbGVhbiBsaW5lU21vb3RoLCBib29sZWFuIHBvaW50U3ByaXRlKTsKLSAgICBuYXRpdmUgdm9pZCBuUHJvZ3JhbVJhc3RlclNldExpbmVXaWR0aChpbnQgcHIsIGZsb2F0IHYpOwotICAgIG5hdGl2ZSB2b2lkIG5Qcm9ncmFtUmFzdGVyU2V0UG9pbnRTaXplKGludCBwciwgZmxvYXQgdik7CisgICAgbmF0aXZlIHZvaWQgcnNuQWRhcHRlcjJEQmluZEFsbG9jYXRpb24oaW50IGNvbiwgaW50IGFkLCBpbnQgYWxsb2MpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5BZGFwdGVyMkRCaW5kQWxsb2NhdGlvbihpbnQgYWQsIGludCBhbGxvYykgeworICAgICAgICByc25BZGFwdGVyMkRCaW5kQWxsb2NhdGlvbihtQ29udGV4dCwgYWQsIGFsbG9jKTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuQWRhcHRlcjJEU2V0Q29uc3RyYWludChpbnQgY29uLCBpbnQgYWQsIGludCBkaW0sIGludCB2YWx1ZSk7CisgICAgc3luY2hyb25pemVkIHZvaWQgbkFkYXB0ZXIyRFNldENvbnN0cmFpbnQoaW50IGFkLCBpbnQgZGltLCBpbnQgdmFsdWUpIHsKKyAgICAgICAgcnNuQWRhcHRlcjJEU2V0Q29uc3RyYWludChtQ29udGV4dCwgYWQsIGRpbSwgdmFsdWUpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25BZGFwdGVyMkREYXRhKGludCBjb24sIGludCBhZCwgaW50W10gZCk7CisgICAgc3luY2hyb25pemVkIHZvaWQgbkFkYXB0ZXIyRERhdGEoaW50IGFkLCBpbnRbXSBkKSB7CisgICAgICAgIHJzbkFkYXB0ZXIyRERhdGEobUNvbnRleHQsIGFkLCBkKTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuQWRhcHRlcjJERGF0YShpbnQgY29uLCBpbnQgYWQsIGZsb2F0W10gZCk7CisgICAgc3luY2hyb25pemVkIHZvaWQgbkFkYXB0ZXIyRERhdGEoaW50IGFkLCBmbG9hdFtdIGQpIHsKKyAgICAgICAgcnNuQWRhcHRlcjJERGF0YShtQ29udGV4dCwgYWQsIGQpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25BZGFwdGVyMkRTdWJEYXRhKGludCBjb24sIGludCBhZCwgaW50IHhvZmYsIGludCB5b2ZmLCBpbnQgdywgaW50IGgsIGludFtdIGQpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5BZGFwdGVyMkRTdWJEYXRhKGludCBhZCwgaW50IHhvZmYsIGludCB5b2ZmLCBpbnQgdywgaW50IGgsIGludFtdIGQpIHsKKyAgICAgICAgcnNuQWRhcHRlcjJEU3ViRGF0YShtQ29udGV4dCwgYWQsIHhvZmYsIHlvZmYsIHcsIGgsIGQpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25BZGFwdGVyMkRTdWJEYXRhKGludCBjb24sIGludCBhZCwgaW50IHhvZmYsIGludCB5b2ZmLCBpbnQgdywgaW50IGgsIGZsb2F0W10gZCk7CisgICAgc3luY2hyb25pemVkIHZvaWQgbkFkYXB0ZXIyRFN1YkRhdGEoaW50IGFkLCBpbnQgeG9mZiwgaW50IHlvZmYsIGludCB3LCBpbnQgaCwgZmxvYXRbXSBkKSB7CisgICAgICAgIHJzbkFkYXB0ZXIyRFN1YkRhdGEobUNvbnRleHQsIGFkLCB4b2ZmLCB5b2ZmLCB3LCBoLCBkKTsKKyAgICB9CisgICAgbmF0aXZlIGludCAgcnNuQWRhcHRlcjJEQ3JlYXRlKGludCBjb24pOworICAgIHN5bmNocm9uaXplZCBpbnQgbkFkYXB0ZXIyRENyZWF0ZSgpIHsKKyAgICAgICAgcmV0dXJuIHJzbkFkYXB0ZXIyRENyZWF0ZShtQ29udGV4dCk7CisgICAgfQogCi0gICAgbmF0aXZlIHZvaWQgblByb2dyYW1CaW5kQ29uc3RhbnRzKGludCBwdiwgaW50IHNsb3QsIGludCBtSUQpOwotICAgIG5hdGl2ZSB2b2lkIG5Qcm9ncmFtQmluZFRleHR1cmUoaW50IHZwZiwgaW50IHNsb3QsIGludCBhKTsKLSAgICBuYXRpdmUgdm9pZCBuUHJvZ3JhbUJpbmRTYW1wbGVyKGludCB2cGYsIGludCBzbG90LCBpbnQgcyk7CisgICAgbmF0aXZlIHZvaWQgcnNuU2NyaXB0QmluZEFsbG9jYXRpb24oaW50IGNvbiwgaW50IHNjcmlwdCwgaW50IGFsbG9jLCBpbnQgc2xvdCk7CisgICAgc3luY2hyb25pemVkIHZvaWQgblNjcmlwdEJpbmRBbGxvY2F0aW9uKGludCBzY3JpcHQsIGludCBhbGxvYywgaW50IHNsb3QpIHsKKyAgICAgICAgcnNuU2NyaXB0QmluZEFsbG9jYXRpb24obUNvbnRleHQsIHNjcmlwdCwgYWxsb2MsIHNsb3QpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25TY3JpcHRTZXRUaW1lWm9uZShpbnQgY29uLCBpbnQgc2NyaXB0LCBieXRlW10gdGltZVpvbmUpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5TY3JpcHRTZXRUaW1lWm9uZShpbnQgc2NyaXB0LCBieXRlW10gdGltZVpvbmUpIHsKKyAgICAgICAgcnNuU2NyaXB0U2V0VGltZVpvbmUobUNvbnRleHQsIHNjcmlwdCwgdGltZVpvbmUpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25TY3JpcHRJbnZva2UoaW50IGNvbiwgaW50IGlkLCBpbnQgc2xvdCk7CisgICAgc3luY2hyb25pemVkIHZvaWQgblNjcmlwdEludm9rZShpbnQgaWQsIGludCBzbG90KSB7CisgICAgICAgIHJzblNjcmlwdEludm9rZShtQ29udGV4dCwgaWQsIHNsb3QpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25TY3JpcHRJbnZva2VWKGludCBjb24sIGludCBpZCwgaW50IHNsb3QsIGJ5dGVbXSBwYXJhbXMpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5TY3JpcHRJbnZva2VWKGludCBpZCwgaW50IHNsb3QsIGJ5dGVbXSBwYXJhbXMpIHsKKyAgICAgICAgcnNuU2NyaXB0SW52b2tlVihtQ29udGV4dCwgaWQsIHNsb3QsIHBhcmFtcyk7CisgICAgfQorICAgIG5hdGl2ZSB2b2lkIHJzblNjcmlwdFNldFZhckkoaW50IGNvbiwgaW50IGlkLCBpbnQgc2xvdCwgaW50IHZhbCk7CisgICAgc3luY2hyb25pemVkIHZvaWQgblNjcmlwdFNldFZhckkoaW50IGlkLCBpbnQgc2xvdCwgaW50IHZhbCkgeworICAgICAgICByc25TY3JpcHRTZXRWYXJJKG1Db250ZXh0LCBpZCwgc2xvdCwgdmFsKTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuU2NyaXB0U2V0VmFyRihpbnQgY29uLCBpbnQgaWQsIGludCBzbG90LCBmbG9hdCB2YWwpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5TY3JpcHRTZXRWYXJGKGludCBpZCwgaW50IHNsb3QsIGZsb2F0IHZhbCkgeworICAgICAgICByc25TY3JpcHRTZXRWYXJGKG1Db250ZXh0LCBpZCwgc2xvdCwgdmFsKTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuU2NyaXB0U2V0VmFyVihpbnQgY29uLCBpbnQgaWQsIGludCBzbG90LCBieXRlW10gdmFsKTsKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBuU2NyaXB0U2V0VmFyVihpbnQgaWQsIGludCBzbG90LCBieXRlW10gdmFsKSB7CisgICAgICAgIHJzblNjcmlwdFNldFZhclYobUNvbnRleHQsIGlkLCBzbG90LCB2YWwpOworICAgIH0KIAotICAgIG5hdGl2ZSBpbnQgIG5Qcm9ncmFtRnJhZ21lbnRDcmVhdGUoaW50W10gcGFyYW1zKTsKLSAgICBuYXRpdmUgaW50ICBuUHJvZ3JhbUZyYWdtZW50Q3JlYXRlMihTdHJpbmcgc2hhZGVyLCBpbnRbXSBwYXJhbXMpOworICAgIG5hdGl2ZSB2b2lkIHJzblNjcmlwdENCZWdpbihpbnQgY29uKTsKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBuU2NyaXB0Q0JlZ2luKCkgeworICAgICAgICByc25TY3JpcHRDQmVnaW4obUNvbnRleHQpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25TY3JpcHRDU2V0U2NyaXB0KGludCBjb24sIGJ5dGVbXSBzY3JpcHQsIGludCBvZmZzZXQsIGludCBsZW5ndGgpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5TY3JpcHRDU2V0U2NyaXB0KGJ5dGVbXSBzY3JpcHQsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKKyAgICAgICAgcnNuU2NyaXB0Q1NldFNjcmlwdChtQ29udGV4dCwgc2NyaXB0LCBvZmZzZXQsIGxlbmd0aCk7CisgICAgfQorICAgIG5hdGl2ZSBpbnQgIHJzblNjcmlwdENDcmVhdGUoaW50IGNvbik7CisgICAgc3luY2hyb25pemVkIGludCBuU2NyaXB0Q0NyZWF0ZSgpIHsKKyAgICAgICAgcmV0dXJuIHJzblNjcmlwdENDcmVhdGUobUNvbnRleHQpOworICAgIH0KIAotICAgIG5hdGl2ZSBpbnQgIG5Qcm9ncmFtVmVydGV4Q3JlYXRlKGJvb2xlYW4gdGV4TWF0KTsKLSAgICBuYXRpdmUgaW50ICBuUHJvZ3JhbVZlcnRleENyZWF0ZTIoU3RyaW5nIHNoYWRlciwgaW50W10gcGFyYW1zKTsKKyAgICBuYXRpdmUgdm9pZCByc25TYW1wbGVyQmVnaW4oaW50IGNvbik7CisgICAgc3luY2hyb25pemVkIHZvaWQgblNhbXBsZXJCZWdpbigpIHsKKyAgICAgICAgcnNuU2FtcGxlckJlZ2luKG1Db250ZXh0KTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuU2FtcGxlclNldChpbnQgY29uLCBpbnQgcGFyYW0sIGludCB2YWx1ZSk7CisgICAgc3luY2hyb25pemVkIHZvaWQgblNhbXBsZXJTZXQoaW50IHBhcmFtLCBpbnQgdmFsdWUpIHsKKyAgICAgICAgcnNuU2FtcGxlclNldChtQ29udGV4dCwgcGFyYW0sIHZhbHVlKTsKKyAgICB9CisgICAgbmF0aXZlIGludCAgcnNuU2FtcGxlckNyZWF0ZShpbnQgY29uKTsKKyAgICBzeW5jaHJvbml6ZWQgaW50IG5TYW1wbGVyQ3JlYXRlKCkgeworICAgICAgICByZXR1cm4gcnNuU2FtcGxlckNyZWF0ZShtQ29udGV4dCk7CisgICAgfQogCi0gICAgbmF0aXZlIHZvaWQgbkxpZ2h0QmVnaW4oKTsKLSAgICBuYXRpdmUgdm9pZCBuTGlnaHRTZXRJc01vbm8oYm9vbGVhbiBpc01vbm8pOwotICAgIG5hdGl2ZSB2b2lkIG5MaWdodFNldElzTG9jYWwoYm9vbGVhbiBpc0xvY2FsKTsKLSAgICBuYXRpdmUgaW50ICBuTGlnaHRDcmVhdGUoKTsKLSAgICBuYXRpdmUgdm9pZCBuTGlnaHRTZXRDb2xvcihpbnQgbCwgZmxvYXQgciwgZmxvYXQgZywgZmxvYXQgYik7Ci0gICAgbmF0aXZlIHZvaWQgbkxpZ2h0U2V0UG9zaXRpb24oaW50IGwsIGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopOworICAgIG5hdGl2ZSB2b2lkIHJzblByb2dyYW1TdG9yZUJlZ2luKGludCBjb24sIGludCBpbiwgaW50IG91dCk7CisgICAgc3luY2hyb25pemVkIHZvaWQgblByb2dyYW1TdG9yZUJlZ2luKGludCBpbiwgaW50IG91dCkgeworICAgICAgICByc25Qcm9ncmFtU3RvcmVCZWdpbihtQ29udGV4dCwgaW4sIG91dCk7CisgICAgfQorICAgIG5hdGl2ZSB2b2lkIHJzblByb2dyYW1TdG9yZURlcHRoRnVuYyhpbnQgY29uLCBpbnQgZnVuYyk7CisgICAgc3luY2hyb25pemVkIHZvaWQgblByb2dyYW1TdG9yZURlcHRoRnVuYyhpbnQgZnVuYykgeworICAgICAgICByc25Qcm9ncmFtU3RvcmVEZXB0aEZ1bmMobUNvbnRleHQsIGZ1bmMpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25Qcm9ncmFtU3RvcmVEZXB0aE1hc2soaW50IGNvbiwgYm9vbGVhbiBlbmFibGUpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5Qcm9ncmFtU3RvcmVEZXB0aE1hc2soYm9vbGVhbiBlbmFibGUpIHsKKyAgICAgICAgcnNuUHJvZ3JhbVN0b3JlRGVwdGhNYXNrKG1Db250ZXh0LCBlbmFibGUpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25Qcm9ncmFtU3RvcmVDb2xvck1hc2soaW50IGNvbiwgYm9vbGVhbiByLCBib29sZWFuIGcsIGJvb2xlYW4gYiwgYm9vbGVhbiBhKTsKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBuUHJvZ3JhbVN0b3JlQ29sb3JNYXNrKGJvb2xlYW4gciwgYm9vbGVhbiBnLCBib29sZWFuIGIsIGJvb2xlYW4gYSkgeworICAgICAgICByc25Qcm9ncmFtU3RvcmVDb2xvck1hc2sobUNvbnRleHQsIHIsIGcsIGIsIGEpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25Qcm9ncmFtU3RvcmVCbGVuZEZ1bmMoaW50IGNvbiwgaW50IHNyYywgaW50IGRzdCk7CisgICAgc3luY2hyb25pemVkIHZvaWQgblByb2dyYW1TdG9yZUJsZW5kRnVuYyhpbnQgc3JjLCBpbnQgZHN0KSB7CisgICAgICAgIHJzblByb2dyYW1TdG9yZUJsZW5kRnVuYyhtQ29udGV4dCwgc3JjLCBkc3QpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25Qcm9ncmFtU3RvcmVEaXRoZXIoaW50IGNvbiwgYm9vbGVhbiBlbmFibGUpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5Qcm9ncmFtU3RvcmVEaXRoZXIoYm9vbGVhbiBlbmFibGUpIHsKKyAgICAgICAgcnNuUHJvZ3JhbVN0b3JlRGl0aGVyKG1Db250ZXh0LCBlbmFibGUpOworICAgIH0KKyAgICBuYXRpdmUgaW50ICByc25Qcm9ncmFtU3RvcmVDcmVhdGUoaW50IGNvbik7CisgICAgc3luY2hyb25pemVkIGludCBuUHJvZ3JhbVN0b3JlQ3JlYXRlKCkgeworICAgICAgICByZXR1cm4gcnNuUHJvZ3JhbVN0b3JlQ3JlYXRlKG1Db250ZXh0KTsKKyAgICB9CiAKLSAgICBuYXRpdmUgaW50ICBuU2ltcGxlTWVzaENyZWF0ZShpbnQgYmF0Y2hJRCwgaW50IGlkeElELCBpbnRbXSB2dHhJRCwgaW50IHByaW0pOwotICAgIG5hdGl2ZSB2b2lkIG5TaW1wbGVNZXNoQmluZFZlcnRleChpbnQgaWQsIGludCBhbGxvYywgaW50IHNsb3QpOwotICAgIG5hdGl2ZSB2b2lkIG5TaW1wbGVNZXNoQmluZEluZGV4KGludCBpZCwgaW50IGFsbG9jKTsKKyAgICBuYXRpdmUgaW50ICByc25Qcm9ncmFtUmFzdGVyQ3JlYXRlKGludCBjb24sIGJvb2xlYW4gcG9pbnRTbW9vdGgsIGJvb2xlYW4gbGluZVNtb290aCwgYm9vbGVhbiBwb2ludFNwcml0ZSk7CisgICAgc3luY2hyb25pemVkIGludCBuUHJvZ3JhbVJhc3RlckNyZWF0ZShib29sZWFuIHBvaW50U21vb3RoLCBib29sZWFuIGxpbmVTbW9vdGgsIGJvb2xlYW4gcG9pbnRTcHJpdGUpIHsKKyAgICAgICAgcmV0dXJuIHJzblByb2dyYW1SYXN0ZXJDcmVhdGUobUNvbnRleHQsIHBvaW50U21vb3RoLCBsaW5lU21vb3RoLCBwb2ludFNwcml0ZSk7CisgICAgfQorICAgIG5hdGl2ZSB2b2lkIHJzblByb2dyYW1SYXN0ZXJTZXRMaW5lV2lkdGgoaW50IGNvbiwgaW50IHByLCBmbG9hdCB2KTsKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBuUHJvZ3JhbVJhc3RlclNldExpbmVXaWR0aChpbnQgcHIsIGZsb2F0IHYpIHsKKyAgICAgICAgcnNuUHJvZ3JhbVJhc3RlclNldExpbmVXaWR0aChtQ29udGV4dCwgcHIsIHYpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25Qcm9ncmFtUmFzdGVyU2V0Q3VsbE1vZGUoaW50IGNvbiwgaW50IHByLCBpbnQgbW9kZSk7CisgICAgc3luY2hyb25pemVkIHZvaWQgblByb2dyYW1SYXN0ZXJTZXRDdWxsTW9kZShpbnQgcHIsIGludCBtb2RlKSB7CisgICAgICAgIHJzblByb2dyYW1SYXN0ZXJTZXRDdWxsTW9kZShtQ29udGV4dCwgcHIsIG1vZGUpOworICAgIH0KIAotICAgIG5hdGl2ZSB2b2lkIG5BbmltYXRpb25CZWdpbihpbnQgYXR0cmliQ291bnQsIGludCBrZXlmcmFtZUNvdW50KTsKLSAgICBuYXRpdmUgdm9pZCBuQW5pbWF0aW9uQWRkKGZsb2F0IHRpbWUsIGZsb2F0W10gYXR0cmlicyk7Ci0gICAgbmF0aXZlIGludCAgbkFuaW1hdGlvbkNyZWF0ZSgpOworICAgIG5hdGl2ZSB2b2lkIHJzblByb2dyYW1CaW5kQ29uc3RhbnRzKGludCBjb24sIGludCBwdiwgaW50IHNsb3QsIGludCBtSUQpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5Qcm9ncmFtQmluZENvbnN0YW50cyhpbnQgcHYsIGludCBzbG90LCBpbnQgbUlEKSB7CisgICAgICAgIHJzblByb2dyYW1CaW5kQ29uc3RhbnRzKG1Db250ZXh0LCBwdiwgc2xvdCwgbUlEKTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuUHJvZ3JhbUJpbmRUZXh0dXJlKGludCBjb24sIGludCB2cGYsIGludCBzbG90LCBpbnQgYSk7CisgICAgc3luY2hyb25pemVkIHZvaWQgblByb2dyYW1CaW5kVGV4dHVyZShpbnQgdnBmLCBpbnQgc2xvdCwgaW50IGEpIHsKKyAgICAgICAgcnNuUHJvZ3JhbUJpbmRUZXh0dXJlKG1Db250ZXh0LCB2cGYsIHNsb3QsIGEpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25Qcm9ncmFtQmluZFNhbXBsZXIoaW50IGNvbiwgaW50IHZwZiwgaW50IHNsb3QsIGludCBzKTsKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBuUHJvZ3JhbUJpbmRTYW1wbGVyKGludCB2cGYsIGludCBzbG90LCBpbnQgcykgeworICAgICAgICByc25Qcm9ncmFtQmluZFNhbXBsZXIobUNvbnRleHQsIHZwZiwgc2xvdCwgcyk7CisgICAgfQorCisgICAgbmF0aXZlIGludCAgcnNuUHJvZ3JhbUZyYWdtZW50Q3JlYXRlKGludCBjb24sIGludFtdIHBhcmFtcyk7CisgICAgc3luY2hyb25pemVkIGludCBuUHJvZ3JhbUZyYWdtZW50Q3JlYXRlKGludFtdIHBhcmFtcykgeworICAgICAgICByZXR1cm4gcnNuUHJvZ3JhbUZyYWdtZW50Q3JlYXRlKG1Db250ZXh0LCBwYXJhbXMpOworICAgIH0KKyAgICBuYXRpdmUgaW50ICByc25Qcm9ncmFtRnJhZ21lbnRDcmVhdGUyKGludCBjb24sIFN0cmluZyBzaGFkZXIsIGludFtdIHBhcmFtcyk7CisgICAgc3luY2hyb25pemVkIGludCBuUHJvZ3JhbUZyYWdtZW50Q3JlYXRlMihTdHJpbmcgc2hhZGVyLCBpbnRbXSBwYXJhbXMpIHsKKyAgICAgICAgcmV0dXJuIHJzblByb2dyYW1GcmFnbWVudENyZWF0ZTIobUNvbnRleHQsIHNoYWRlciwgcGFyYW1zKTsKKyAgICB9CisKKyAgICBuYXRpdmUgaW50ICByc25Qcm9ncmFtVmVydGV4Q3JlYXRlKGludCBjb24sIGJvb2xlYW4gdGV4TWF0KTsKKyAgICBzeW5jaHJvbml6ZWQgaW50IG5Qcm9ncmFtVmVydGV4Q3JlYXRlKGJvb2xlYW4gdGV4TWF0KSB7CisgICAgICAgIHJldHVybiByc25Qcm9ncmFtVmVydGV4Q3JlYXRlKG1Db250ZXh0LCB0ZXhNYXQpOworICAgIH0KKyAgICBuYXRpdmUgaW50ICByc25Qcm9ncmFtVmVydGV4Q3JlYXRlMihpbnQgY29uLCBTdHJpbmcgc2hhZGVyLCBpbnRbXSBwYXJhbXMpOworICAgIHN5bmNocm9uaXplZCBpbnQgblByb2dyYW1WZXJ0ZXhDcmVhdGUyKFN0cmluZyBzaGFkZXIsIGludFtdIHBhcmFtcykgeworICAgICAgICByZXR1cm4gcnNuUHJvZ3JhbVZlcnRleENyZWF0ZTIobUNvbnRleHQsIHNoYWRlciwgcGFyYW1zKTsKKyAgICB9CisKKworICAgIG5hdGl2ZSBpbnQgIHJzbk1lc2hDcmVhdGUoaW50IGNvbiwgaW50IHZ0eENvdW50LCBpbnQgaW5kZXhDb3VudCk7CisgICAgc3luY2hyb25pemVkIGludCBuTWVzaENyZWF0ZShpbnQgdnR4Q291bnQsIGludCBpbmRleENvdW50KSB7CisgICAgICAgIHJldHVybiByc25NZXNoQ3JlYXRlKG1Db250ZXh0LCB2dHhDb3VudCwgaW5kZXhDb3VudCk7CisgICAgfQorICAgIG5hdGl2ZSB2b2lkIHJzbk1lc2hCaW5kVmVydGV4KGludCBjb24sIGludCBpZCwgaW50IGFsbG9jLCBpbnQgc2xvdCk7CisgICAgc3luY2hyb25pemVkIHZvaWQgbk1lc2hCaW5kVmVydGV4KGludCBpZCwgaW50IGFsbG9jLCBpbnQgc2xvdCkgeworICAgICAgICByc25NZXNoQmluZFZlcnRleChtQ29udGV4dCwgaWQsIGFsbG9jLCBzbG90KTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuTWVzaEJpbmRJbmRleChpbnQgY29uLCBpbnQgaWQsIGludCBhbGxvYywgaW50IHByaW0sIGludCBzbG90KTsKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBuTWVzaEJpbmRJbmRleChpbnQgaWQsIGludCBhbGxvYywgaW50IHByaW0sIGludCBzbG90KSB7CisgICAgICAgIHJzbk1lc2hCaW5kSW5kZXgobUNvbnRleHQsIGlkLCBhbGxvYywgcHJpbSwgc2xvdCk7CisgICAgfQorICAgIG5hdGl2ZSBpbnQgIHJzbk1lc2hHZXRWZXJ0ZXhCdWZmZXJDb3VudChpbnQgY29uLCBpbnQgaWQpOworICAgIHN5bmNocm9uaXplZCBpbnQgbk1lc2hHZXRWZXJ0ZXhCdWZmZXJDb3VudChpbnQgaWQpIHsKKyAgICAgICAgcmV0dXJuIHJzbk1lc2hHZXRWZXJ0ZXhCdWZmZXJDb3VudChtQ29udGV4dCwgaWQpOworICAgIH0KKyAgICBuYXRpdmUgaW50ICByc25NZXNoR2V0SW5kZXhDb3VudChpbnQgY29uLCBpbnQgaWQpOworICAgIHN5bmNocm9uaXplZCBpbnQgbk1lc2hHZXRJbmRleENvdW50KGludCBpZCkgeworICAgICAgICByZXR1cm4gcnNuTWVzaEdldEluZGV4Q291bnQobUNvbnRleHQsIGlkKTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuTWVzaEdldFZlcnRpY2VzKGludCBjb24sIGludCBpZCwgaW50W10gdnR4SWRzLCBpbnQgdnR4SWRDb3VudCk7CisgICAgc3luY2hyb25pemVkIHZvaWQgbk1lc2hHZXRWZXJ0aWNlcyhpbnQgaWQsIGludFtdIHZ0eElkcywgaW50IHZ0eElkQ291bnQpIHsKKyAgICAgICAgcnNuTWVzaEdldFZlcnRpY2VzKG1Db250ZXh0LCBpZCwgdnR4SWRzLCB2dHhJZENvdW50KTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuTWVzaEdldEluZGljZXMoaW50IGNvbiwgaW50IGlkLCBpbnRbXSBpZHhJZHMsIGludFtdIHByaW1pdGl2ZXMsIGludCB2dHhJZENvdW50KTsKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBuTWVzaEdldEluZGljZXMoaW50IGlkLCBpbnRbXSBpZHhJZHMsIGludFtdIHByaW1pdGl2ZXMsIGludCB2dHhJZENvdW50KSB7CisgICAgICAgIHJzbk1lc2hHZXRJbmRpY2VzKG1Db250ZXh0LCBpZCwgaWR4SWRzLCBwcmltaXRpdmVzLCB2dHhJZENvdW50KTsKKyAgICB9CisKIAogICAgIHByb3RlY3RlZCBpbnQgICAgIG1EZXY7CiAgICAgcHJvdGVjdGVkIGludCAgICAgbUNvbnRleHQ7CiAgICAgQFN1cHByZXNzV2FybmluZ3MoeyJGaWVsZENhbkJlTG9jYWwifSkKICAgICBwcm90ZWN0ZWQgTWVzc2FnZVRocmVhZCBtTWVzc2FnZVRocmVhZDsKIAotICAgIEVsZW1lbnQgbUVsZW1lbnRfVVNFUl9VODsKLSAgICBFbGVtZW50IG1FbGVtZW50X1VTRVJfSTg7Ci0gICAgRWxlbWVudCBtRWxlbWVudF9VU0VSX1UxNjsKLSAgICBFbGVtZW50IG1FbGVtZW50X1VTRVJfSTE2OwotICAgIEVsZW1lbnQgbUVsZW1lbnRfVVNFUl9VMzI7Ci0gICAgRWxlbWVudCBtRWxlbWVudF9VU0VSX0kzMjsKLSAgICBFbGVtZW50IG1FbGVtZW50X1VTRVJfRjMyOworICAgIEVsZW1lbnQgbUVsZW1lbnRfVTg7CisgICAgRWxlbWVudCBtRWxlbWVudF9JODsKKyAgICBFbGVtZW50IG1FbGVtZW50X1UxNjsKKyAgICBFbGVtZW50IG1FbGVtZW50X0kxNjsKKyAgICBFbGVtZW50IG1FbGVtZW50X1UzMjsKKyAgICBFbGVtZW50IG1FbGVtZW50X0kzMjsKKyAgICBFbGVtZW50IG1FbGVtZW50X0YzMjsKKyAgICBFbGVtZW50IG1FbGVtZW50X0JPT0xFQU47CisKKyAgICBFbGVtZW50IG1FbGVtZW50X0VMRU1FTlQ7CisgICAgRWxlbWVudCBtRWxlbWVudF9UWVBFOworICAgIEVsZW1lbnQgbUVsZW1lbnRfQUxMT0NBVElPTjsKKyAgICBFbGVtZW50IG1FbGVtZW50X1NBTVBMRVI7CisgICAgRWxlbWVudCBtRWxlbWVudF9TQ1JJUFQ7CisgICAgRWxlbWVudCBtRWxlbWVudF9NRVNIOworICAgIEVsZW1lbnQgbUVsZW1lbnRfUFJPR1JBTV9GUkFHTUVOVDsKKyAgICBFbGVtZW50IG1FbGVtZW50X1BST0dSQU1fVkVSVEVYOworICAgIEVsZW1lbnQgbUVsZW1lbnRfUFJPR1JBTV9SQVNURVI7CisgICAgRWxlbWVudCBtRWxlbWVudF9QUk9HUkFNX1NUT1JFOwogCiAgICAgRWxlbWVudCBtRWxlbWVudF9BXzg7CiAgICAgRWxlbWVudCBtRWxlbWVudF9SR0JfNTY1OwpAQCAtMjEwLDEzICs1MzcsMzQgQEAKICAgICBFbGVtZW50IG1FbGVtZW50X1JHQkFfNDQ0NDsKICAgICBFbGVtZW50IG1FbGVtZW50X1JHQkFfODg4ODsKIAotICAgIEVsZW1lbnQgbUVsZW1lbnRfSU5ERVhfMTY7Ci0gICAgRWxlbWVudCBtRWxlbWVudF9QT1NJVElPTl8yOwotICAgIEVsZW1lbnQgbUVsZW1lbnRfUE9TSVRJT05fMzsKLSAgICBFbGVtZW50IG1FbGVtZW50X1RFWFRVUkVfMjsKLSAgICBFbGVtZW50IG1FbGVtZW50X05PUk1BTF8zOwotICAgIEVsZW1lbnQgbUVsZW1lbnRfQ09MT1JfVThfNDsKLSAgICBFbGVtZW50IG1FbGVtZW50X0NPTE9SX0YzMl80OworICAgIEVsZW1lbnQgbUVsZW1lbnRfRkxPQVRfMjsKKyAgICBFbGVtZW50IG1FbGVtZW50X0ZMT0FUXzM7CisgICAgRWxlbWVudCBtRWxlbWVudF9GTE9BVF80OworICAgIEVsZW1lbnQgbUVsZW1lbnRfVUNIQVJfNDsKKworICAgIFNhbXBsZXIgbVNhbXBsZXJfQ0xBTVBfTkVBUkVTVDsKKyAgICBTYW1wbGVyIG1TYW1wbGVyX0NMQU1QX0xJTkVBUjsKKyAgICBTYW1wbGVyIG1TYW1wbGVyX0NMQU1QX0xJTkVBUl9NSVBfTElORUFSOworICAgIFNhbXBsZXIgbVNhbXBsZXJfV1JBUF9ORUFSRVNUOworICAgIFNhbXBsZXIgbVNhbXBsZXJfV1JBUF9MSU5FQVI7CisgICAgU2FtcGxlciBtU2FtcGxlcl9XUkFQX0xJTkVBUl9NSVBfTElORUFSOworCisgICAgUHJvZ3JhbVN0b3JlIG1Qcm9ncmFtU3RvcmVfQkxFTkRfTk9ORV9ERVBUSF9URVNUOworICAgIFByb2dyYW1TdG9yZSBtUHJvZ3JhbVN0b3JlX0JMRU5EX05PTkVfREVQVEhfTk9fREVQVEg7CisgICAgUHJvZ3JhbVN0b3JlIG1Qcm9ncmFtU3RvcmVfQkxFTkRfTk9ORV9ERVBUSF9OT19URVNUOworICAgIFByb2dyYW1TdG9yZSBtUHJvZ3JhbVN0b3JlX0JMRU5EX05PTkVfREVQVEhfTk9fV1JJVEU7CisgICAgUHJvZ3JhbVN0b3JlIG1Qcm9ncmFtU3RvcmVfQkxFTkRfQUxQSEFfREVQVEhfVEVTVDsKKyAgICBQcm9ncmFtU3RvcmUgbVByb2dyYW1TdG9yZV9CTEVORF9BTFBIQV9ERVBUSF9OT19ERVBUSDsKKyAgICBQcm9ncmFtU3RvcmUgbVByb2dyYW1TdG9yZV9CTEVORF9BTFBIQV9ERVBUSF9OT19URVNUOworICAgIFByb2dyYW1TdG9yZSBtUHJvZ3JhbVN0b3JlX0JMRU5EX0FMUEhBX0RFUFRIX05PX1dSSVRFOworICAgIFByb2dyYW1TdG9yZSBtUHJvZ3JhbVN0b3JlX0JMRU5EX0FERF9ERVBUSF9URVNUOworICAgIFByb2dyYW1TdG9yZSBtUHJvZ3JhbVN0b3JlX0JMRU5EX0FERF9ERVBUSF9OT19ERVBUSDsKKyAgICBQcm9ncmFtU3RvcmUgbVByb2dyYW1TdG9yZV9CTEVORF9BRERfREVQVEhfTk9fVEVTVDsKKyAgICBQcm9ncmFtU3RvcmUgbVByb2dyYW1TdG9yZV9CTEVORF9BRERfREVQVEhfTk9fV1JJVEU7CisKKyAgICBQcm9ncmFtUmFzdGVyIG1Qcm9ncmFtUmFzdGVyX0NVTExfQkFDSzsKKyAgICBQcm9ncmFtUmFzdGVyIG1Qcm9ncmFtUmFzdGVyX0NVTExfRlJPTlQ7CisgICAgUHJvZ3JhbVJhc3RlciBtUHJvZ3JhbVJhc3Rlcl9DVUxMX05PTkU7CiAKICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgIC8vCkBAIC0yNjQsOSArNjEyLDkgQEAKICAgICAgICAgICAgIC8vIFRoaXMgZnVuY3Rpb24gaXMgYSB0ZW1wb3Jhcnkgc29sdXRpb24uICBUaGUgZmluYWwgc29sdXRpb24gd2lsbAogICAgICAgICAgICAgLy8gdXNlZCB0eXBlZCBhbGxvY2F0aW9ucyB3aGVyZSB0aGUgbWVzc2FnZSBpZCBpcyB0aGUgdHlwZSBpbmRpY2F0b3IuCiAgICAgICAgICAgICBpbnRbXSByYnVmID0gbmV3IGludFsxNl07Ci0gICAgICAgICAgICBtUlMubkNvbnRleHRJbml0VG9DbGllbnQoKTsKKyAgICAgICAgICAgIG1SUy5uQ29udGV4dEluaXRUb0NsaWVudChtUlMubUNvbnRleHQpOwogICAgICAgICAgICAgd2hpbGUobVJ1bikgewotICAgICAgICAgICAgICAgIGludCBtc2cgPSBtUlMubkNvbnRleHRHZXRNZXNzYWdlKHJidWYsIHRydWUpOworICAgICAgICAgICAgICAgIGludCBtc2cgPSBtUlMubkNvbnRleHRHZXRNZXNzYWdlKG1SUy5tQ29udGV4dCwgcmJ1ZiwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgaWYgKG1zZyA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIFNob3VsZCBvbmx5IGhhcHBlbiBkdXJpbmcgdGVhcmRvd24uCiAgICAgICAgICAgICAgICAgICAgIC8vIEJ1dCB3ZSB3YW50IHRvIGF2b2lkIHN0YXJ2aW5nIG90aGVyIHRocmVhZHMgZHVyaW5nCkBAIC0yODIsNyArNjMwLDYgQEAKICAgICAgICAgICAgICAgICAgICAgbVJTLm1NZXNzYWdlQ2FsbGJhY2subUlEID0gbXNnOwogICAgICAgICAgICAgICAgICAgICBtUlMubU1lc3NhZ2VDYWxsYmFjay5ydW4oKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy9Mb2cuZChMT0dfVEFHLCAiTWVzc2FnZVRocmVhZCBtc2cgIiArIG1zZyArICIgdjEgIiArIHJidWZbMF0gKyAiIHYyICIgKyByYnVmWzFdICsgIiB2MyAiICtyYnVmWzJdKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICJNZXNzYWdlVGhyZWFkIGV4aXRpbmcuIik7CiAgICAgICAgIH0KQEAgLTMwNywxMiArNjU0LDE2IEBACiAgICAgICAgIG5Db250ZXh0RHVtcChiaXRzKTsKICAgICB9CiAKKyAgICBwdWJsaWMgdm9pZCBmaW5pc2goKSB7CisgICAgICAgIG5Db250ZXh0RmluaXNoKCk7CisgICAgfQorCiAgICAgcHVibGljIHZvaWQgZGVzdHJveSgpIHsKICAgICAgICAgdmFsaWRhdGUoKTsKLSAgICAgICAgbkNvbnRleHREZWluaXRUb0NsaWVudCgpOworICAgICAgICBuQ29udGV4dERlaW5pdFRvQ2xpZW50KG1Db250ZXh0KTsKICAgICAgICAgbU1lc3NhZ2VUaHJlYWQubVJ1biA9IGZhbHNlOwogCi0gICAgICAgIG5Db250ZXh0RGVzdHJveShtQ29udGV4dCk7CisgICAgICAgIG5Db250ZXh0RGVzdHJveSgpOwogICAgICAgICBtQ29udGV4dCA9IDA7CiAKICAgICAgICAgbkRldmljZURlc3Ryb3kobURldik7CkBAIC0zMzUsMyArNjg2LDQgQEAKIH0KIAogCisKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvUmVuZGVyU2NyaXB0R0wuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvUmVuZGVyU2NyaXB0R0wuamF2YQppbmRleCBkMWRmMjNkLi42MWVjYzhkIDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1JlbmRlclNjcmlwdEdMLmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9SZW5kZXJTY3JpcHRHTC5qYXZhCkBAIC03NCw5ICs3NCw5IEBACiAgICAgICAgIG5Db250ZXh0QmluZFJvb3RTY3JpcHQoc2FmZUlEKHMpKTsKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBjb250ZXh0QmluZFByb2dyYW1GcmFnbWVudFN0b3JlKFByb2dyYW1TdG9yZSBwKSB7CisgICAgcHVibGljIHZvaWQgY29udGV4dEJpbmRQcm9ncmFtU3RvcmUoUHJvZ3JhbVN0b3JlIHApIHsKICAgICAgICAgdmFsaWRhdGUoKTsKLSAgICAgICAgbkNvbnRleHRCaW5kUHJvZ3JhbUZyYWdtZW50U3RvcmUoc2FmZUlEKHApKTsKKyAgICAgICAgbkNvbnRleHRCaW5kUHJvZ3JhbVN0b3JlKHNhZmVJRChwKSk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgY29udGV4dEJpbmRQcm9ncmFtRnJhZ21lbnQoUHJvZ3JhbUZyYWdtZW50IHApIHsKQEAgLTEwMiw4ICsxMDIsNyBAQAogCiAgICAgcHVibGljIGNsYXNzIEZpbGUgZXh0ZW5kcyBCYXNlT2JqIHsKICAgICAgICAgRmlsZShpbnQgaWQpIHsKLSAgICAgICAgICAgIHN1cGVyKFJlbmRlclNjcmlwdEdMLnRoaXMpOwotICAgICAgICAgICAgbUlEID0gaWQ7CisgICAgICAgICAgICBzdXBlcihpZCwgUmVuZGVyU2NyaXB0R0wudGhpcyk7CiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvU2FtcGxlci5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9TYW1wbGVyLmphdmEKaW5kZXggNDBiYTcyMi4uMzQzZmNkYiAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9TYW1wbGVyLmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9TYW1wbGVyLmphdmEKQEAgLTQ3LDEwICs0Nyw4MiBAQAogICAgIH0KIAogICAgIFNhbXBsZXIoaW50IGlkLCBSZW5kZXJTY3JpcHQgcnMpIHsKLSAgICAgICAgc3VwZXIocnMpOwotICAgICAgICBtSUQgPSBpZDsKKyAgICAgICAgc3VwZXIoaWQsIHJzKTsKICAgICB9CiAKKyAgICBwdWJsaWMgc3RhdGljIFNhbXBsZXIgQ0xBTVBfTkVBUkVTVChSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgaWYocnMubVNhbXBsZXJfQ0xBTVBfTkVBUkVTVCA9PSBudWxsKSB7CisgICAgICAgICAgICBCdWlsZGVyIGIgPSBuZXcgQnVpbGRlcihycyk7CisgICAgICAgICAgICBiLnNldE1pbihWYWx1ZS5ORUFSRVNUKTsKKyAgICAgICAgICAgIGIuc2V0TWFnKFZhbHVlLk5FQVJFU1QpOworICAgICAgICAgICAgYi5zZXRXcmFwUyhWYWx1ZS5DTEFNUCk7CisgICAgICAgICAgICBiLnNldFdyYXBUKFZhbHVlLkNMQU1QKTsKKyAgICAgICAgICAgIHJzLm1TYW1wbGVyX0NMQU1QX05FQVJFU1QgPSBiLmNyZWF0ZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBycy5tU2FtcGxlcl9DTEFNUF9ORUFSRVNUOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU2FtcGxlciBDTEFNUF9MSU5FQVIoUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1TYW1wbGVyX0NMQU1QX0xJTkVBUiA9PSBudWxsKSB7CisgICAgICAgICAgICBCdWlsZGVyIGIgPSBuZXcgQnVpbGRlcihycyk7CisgICAgICAgICAgICBiLnNldE1pbihWYWx1ZS5MSU5FQVIpOworICAgICAgICAgICAgYi5zZXRNYWcoVmFsdWUuTElORUFSKTsKKyAgICAgICAgICAgIGIuc2V0V3JhcFMoVmFsdWUuQ0xBTVApOworICAgICAgICAgICAgYi5zZXRXcmFwVChWYWx1ZS5DTEFNUCk7CisgICAgICAgICAgICBycy5tU2FtcGxlcl9DTEFNUF9MSU5FQVIgPSBiLmNyZWF0ZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBycy5tU2FtcGxlcl9DTEFNUF9MSU5FQVI7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTYW1wbGVyIENMQU1QX0xJTkVBUl9NSVBfTElORUFSKFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tU2FtcGxlcl9DTEFNUF9MSU5FQVJfTUlQX0xJTkVBUiA9PSBudWxsKSB7CisgICAgICAgICAgICBCdWlsZGVyIGIgPSBuZXcgQnVpbGRlcihycyk7CisgICAgICAgICAgICBiLnNldE1pbihWYWx1ZS5MSU5FQVJfTUlQX0xJTkVBUik7CisgICAgICAgICAgICBiLnNldE1hZyhWYWx1ZS5MSU5FQVIpOworICAgICAgICAgICAgYi5zZXRXcmFwUyhWYWx1ZS5DTEFNUCk7CisgICAgICAgICAgICBiLnNldFdyYXBUKFZhbHVlLkNMQU1QKTsKKyAgICAgICAgICAgIHJzLm1TYW1wbGVyX0NMQU1QX0xJTkVBUl9NSVBfTElORUFSID0gYi5jcmVhdGUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcnMubVNhbXBsZXJfQ0xBTVBfTElORUFSX01JUF9MSU5FQVI7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTYW1wbGVyIFdSQVBfTkVBUkVTVChSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgaWYocnMubVNhbXBsZXJfV1JBUF9ORUFSRVNUID09IG51bGwpIHsKKyAgICAgICAgICAgIEJ1aWxkZXIgYiA9IG5ldyBCdWlsZGVyKHJzKTsKKyAgICAgICAgICAgIGIuc2V0TWluKFZhbHVlLk5FQVJFU1QpOworICAgICAgICAgICAgYi5zZXRNYWcoVmFsdWUuTkVBUkVTVCk7CisgICAgICAgICAgICBiLnNldFdyYXBTKFZhbHVlLldSQVApOworICAgICAgICAgICAgYi5zZXRXcmFwVChWYWx1ZS5XUkFQKTsKKyAgICAgICAgICAgIHJzLm1TYW1wbGVyX1dSQVBfTkVBUkVTVCA9IGIuY3JlYXRlKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJzLm1TYW1wbGVyX1dSQVBfTkVBUkVTVDsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFNhbXBsZXIgV1JBUF9MSU5FQVIoUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1TYW1wbGVyX1dSQVBfTElORUFSID09IG51bGwpIHsKKyAgICAgICAgICAgIEJ1aWxkZXIgYiA9IG5ldyBCdWlsZGVyKHJzKTsKKyAgICAgICAgICAgIGIuc2V0TWluKFZhbHVlLkxJTkVBUik7CisgICAgICAgICAgICBiLnNldE1hZyhWYWx1ZS5MSU5FQVIpOworICAgICAgICAgICAgYi5zZXRXcmFwUyhWYWx1ZS5XUkFQKTsKKyAgICAgICAgICAgIGIuc2V0V3JhcFQoVmFsdWUuV1JBUCk7CisgICAgICAgICAgICBycy5tU2FtcGxlcl9XUkFQX0xJTkVBUiA9IGIuY3JlYXRlKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJzLm1TYW1wbGVyX1dSQVBfTElORUFSOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU2FtcGxlciBXUkFQX0xJTkVBUl9NSVBfTElORUFSKFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tU2FtcGxlcl9XUkFQX0xJTkVBUl9NSVBfTElORUFSID09IG51bGwpIHsKKyAgICAgICAgICAgIEJ1aWxkZXIgYiA9IG5ldyBCdWlsZGVyKHJzKTsKKyAgICAgICAgICAgIGIuc2V0TWluKFZhbHVlLkxJTkVBUl9NSVBfTElORUFSKTsKKyAgICAgICAgICAgIGIuc2V0TWFnKFZhbHVlLkxJTkVBUik7CisgICAgICAgICAgICBiLnNldFdyYXBTKFZhbHVlLldSQVApOworICAgICAgICAgICAgYi5zZXRXcmFwVChWYWx1ZS5XUkFQKTsKKyAgICAgICAgICAgIHJzLm1TYW1wbGVyX1dSQVBfTElORUFSX01JUF9MSU5FQVIgPSBiLmNyZWF0ZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBycy5tU2FtcGxlcl9XUkFQX0xJTkVBUl9NSVBfTElORUFSOworICAgIH0KKworCiAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBCdWlsZGVyIHsKICAgICAgICAgUmVuZGVyU2NyaXB0IG1SUzsKICAgICAgICAgVmFsdWUgbU1pbjsKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvU2NyaXB0LmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1NjcmlwdC5qYXZhCmluZGV4IDU3Y2NmYTMuLjE5YzQ0NGMgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvU2NyaXB0LmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9TY3JpcHQuamF2YQpAQCAtNDIsMjkgKzQyLDQ2IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwcm90ZWN0ZWQgdm9pZCBpbnZva2UoaW50IHNsb3QpIHsKKyAgICAgICAgbVJTLm5TY3JpcHRJbnZva2UobUlELCBzbG90KTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBpbnZva2UoaW50IHNsb3QsIEZpZWxkUGFja2VyIHYpIHsKKyAgICAgICAgaWYgKHYgIT0gbnVsbCkgeworICAgICAgICAgICAgbVJTLm5TY3JpcHRJbnZva2VWKG1JRCwgc2xvdCwgdi5nZXREYXRhKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVJTLm5TY3JpcHRJbnZva2UobUlELCBzbG90KTsKKyAgICAgICAgfQorICAgIH0KKworCiAgICAgU2NyaXB0KGludCBpZCwgUmVuZGVyU2NyaXB0IHJzKSB7Ci0gICAgICAgIHN1cGVyKHJzKTsKLSAgICAgICAgbUlEID0gaWQ7CisgICAgICAgIHN1cGVyKGlkLCBycyk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgYmluZEFsbG9jYXRpb24oQWxsb2NhdGlvbiB2YSwgaW50IHNsb3QpIHsKICAgICAgICAgbVJTLnZhbGlkYXRlKCk7Ci0gICAgICAgIG1SUy5uU2NyaXB0QmluZEFsbG9jYXRpb24obUlELCB2YS5tSUQsIHNsb3QpOworICAgICAgICBpZiAodmEgIT0gbnVsbCkgeworICAgICAgICAgICAgbVJTLm5TY3JpcHRCaW5kQWxsb2NhdGlvbihtSUQsIHZhLm1JRCwgc2xvdCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtUlMublNjcmlwdEJpbmRBbGxvY2F0aW9uKG1JRCwgMCwgc2xvdCk7CisgICAgICAgIH0KICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBzZXRDbGVhckNvbG9yKGZsb2F0IHIsIGZsb2F0IGcsIGZsb2F0IGIsIGZsb2F0IGEpIHsKLSAgICAgICAgbVJTLnZhbGlkYXRlKCk7Ci0gICAgICAgIG1SUy5uU2NyaXB0U2V0Q2xlYXJDb2xvcihtSUQsIHIsIGcsIGIsIGEpOworICAgIHB1YmxpYyB2b2lkIHNldFZhcihpbnQgaW5kZXgsIGZsb2F0IHYpIHsKKyAgICAgICAgbVJTLm5TY3JpcHRTZXRWYXJGKG1JRCwgaW5kZXgsIHYpOwogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIHNldENsZWFyRGVwdGgoZmxvYXQgZCkgewotICAgICAgICBtUlMudmFsaWRhdGUoKTsKLSAgICAgICAgbVJTLm5TY3JpcHRTZXRDbGVhckRlcHRoKG1JRCwgZCk7CisgICAgcHVibGljIHZvaWQgc2V0VmFyKGludCBpbmRleCwgaW50IHYpIHsKKyAgICAgICAgbVJTLm5TY3JpcHRTZXRWYXJJKG1JRCwgaW5kZXgsIHYpOwogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIHNldENsZWFyU3RlbmNpbChpbnQgc3RlbmNpbCkgewotICAgICAgICBtUlMudmFsaWRhdGUoKTsKLSAgICAgICAgbVJTLm5TY3JpcHRTZXRDbGVhclN0ZW5jaWwobUlELCBzdGVuY2lsKTsKKyAgICBwdWJsaWMgdm9pZCBzZXRWYXIoaW50IGluZGV4LCBib29sZWFuIHYpIHsKKyAgICAgICAgbVJTLm5TY3JpcHRTZXRWYXJJKG1JRCwgaW5kZXgsIHYgPyAxIDogMCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VmFyKGludCBpbmRleCwgRmllbGRQYWNrZXIgdikgeworICAgICAgICBtUlMublNjcmlwdFNldFZhclYobUlELCBpbmRleCwgdi5nZXREYXRhKCkpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHNldFRpbWVab25lKFN0cmluZyB0aW1lWm9uZSkgewpAQCAtNzgsNzIgKzk1LDU0IEBACiAKICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJ1aWxkZXIgewogICAgICAgICBSZW5kZXJTY3JpcHQgbVJTOwotICAgICAgICBib29sZWFuIG1Jc1Jvb3QgPSBmYWxzZTsKLSAgICAgICAgVHlwZVtdIG1UeXBlczsKLSAgICAgICAgU3RyaW5nW10gbU5hbWVzOwotICAgICAgICBib29sZWFuW10gbVdyaXRhYmxlOwotICAgICAgICBpbnQgbUludm9rYWJsZUNvdW50ID0gMDsKLSAgICAgICAgSW52b2thYmxlW10gbUludm9rYWJsZXM7CiAKICAgICAgICAgQnVpbGRlcihSZW5kZXJTY3JpcHQgcnMpIHsKICAgICAgICAgICAgIG1SUyA9IHJzOwotICAgICAgICAgICAgbVR5cGVzID0gbmV3IFR5cGVbTUFYX1NMT1RdOwotICAgICAgICAgICAgbU5hbWVzID0gbmV3IFN0cmluZ1tNQVhfU0xPVF07Ci0gICAgICAgICAgICBtV3JpdGFibGUgPSBuZXcgYm9vbGVhbltNQVhfU0xPVF07Ci0gICAgICAgICAgICBtSW52b2thYmxlcyA9IG5ldyBJbnZva2FibGVbTUFYX1NMT1RdOwogICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0VHlwZShUeXBlIHQsIGludCBzbG90KSB7Ci0gICAgICAgICAgICBtVHlwZXNbc2xvdF0gPSB0OwotICAgICAgICAgICAgbU5hbWVzW3Nsb3RdID0gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFR5cGUoVHlwZSB0LCBTdHJpbmcgbmFtZSwgaW50IHNsb3QpIHsKLSAgICAgICAgICAgIG1UeXBlc1tzbG90XSA9IHQ7Ci0gICAgICAgICAgICBtTmFtZXNbc2xvdF0gPSBuYW1lOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEludm9rYWJsZSBhZGRJbnZva2FibGUoU3RyaW5nIGZ1bmMpIHsKLSAgICAgICAgICAgIEludm9rYWJsZSBpID0gbmV3IEludm9rYWJsZSgpOwotICAgICAgICAgICAgaS5tTmFtZSA9IGZ1bmM7Ci0gICAgICAgICAgICBpLm1SUyA9IG1SUzsKLSAgICAgICAgICAgIGkubVNsb3QgPSBtSW52b2thYmxlQ291bnQ7Ci0gICAgICAgICAgICBtSW52b2thYmxlc1ttSW52b2thYmxlQ291bnQrK10gPSBpOwotICAgICAgICAgICAgcmV0dXJuIGk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRUeXBlKGJvb2xlYW4gd3JpdGFibGUsIGludCBzbG90KSB7Ci0gICAgICAgICAgICBtV3JpdGFibGVbc2xvdF0gPSB3cml0YWJsZTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgdHJhbnNmZXJDcmVhdGUoKSB7Ci0gICAgICAgICAgICBtUlMublNjcmlwdFNldFJvb3QobUlzUm9vdCk7Ci0gICAgICAgICAgICBmb3IoaW50IGN0PTA7IGN0IDwgbVR5cGVzLmxlbmd0aDsgY3QrKykgewotICAgICAgICAgICAgICAgIGlmKG1UeXBlc1tjdF0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtUlMublNjcmlwdFNldFR5cGUobVR5cGVzW2N0XS5tSUQsIG1Xcml0YWJsZVtjdF0sIG1OYW1lc1tjdF0sIGN0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IoaW50IGN0PTA7IGN0IDwgbUludm9rYWJsZUNvdW50OyBjdCsrKSB7Ci0gICAgICAgICAgICAgICAgbVJTLm5TY3JpcHRTZXRJbnZva2FibGUobUludm9rYWJsZXNbY3RdLm1OYW1lLCBjdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHRyYW5zZmVyT2JqZWN0KFNjcmlwdCBzKSB7Ci0gICAgICAgICAgICBzLm1Jc1Jvb3QgPSBtSXNSb290OwotICAgICAgICAgICAgcy5tVHlwZXMgPSBtVHlwZXM7Ci0gICAgICAgICAgICBzLm1JbnZva2FibGVzID0gbmV3IEludm9rYWJsZVttSW52b2thYmxlQ291bnRdOwotICAgICAgICAgICAgZm9yKGludCBjdD0wOyBjdCA8IG1JbnZva2FibGVDb3VudDsgY3QrKykgewotICAgICAgICAgICAgICAgIHMubUludm9rYWJsZXNbY3RdID0gbUludm9rYWJsZXNbY3RdOwotICAgICAgICAgICAgICAgIHMubUludm9rYWJsZXNbY3RdLm1TY3JpcHQgPSBzOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcy5tSW52b2thYmxlcyA9IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRSb290KGJvb2xlYW4gcikgewotICAgICAgICAgICAgbUlzUm9vdCA9IHI7Ci0gICAgICAgIH0KLQogICAgIH0KIAorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBGaWVsZEJhc2UgeworICAgICAgICBwcm90ZWN0ZWQgRWxlbWVudCBtRWxlbWVudDsKKyAgICAgICAgcHJvdGVjdGVkIFR5cGUgbVR5cGU7CisgICAgICAgIHByb3RlY3RlZCBBbGxvY2F0aW9uIG1BbGxvY2F0aW9uOworCisgICAgICAgIHByb3RlY3RlZCB2b2lkIGluaXQoUmVuZGVyU2NyaXB0IHJzLCBpbnQgZGlteCkgeworICAgICAgICAgICAgbUFsbG9jYXRpb24gPSBBbGxvY2F0aW9uLmNyZWF0ZVNpemVkKHJzLCBtRWxlbWVudCwgZGlteCk7CisgICAgICAgICAgICBtVHlwZSA9IG1BbGxvY2F0aW9uLmdldFR5cGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBGaWVsZEJhc2UoKSB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgRWxlbWVudCBnZXRFbGVtZW50KCkgeworICAgICAgICAgICAgcmV0dXJuIG1FbGVtZW50OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFR5cGUgZ2V0VHlwZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtVHlwZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBBbGxvY2F0aW9uIGdldEFsbG9jYXRpb24oKSB7CisgICAgICAgICAgICByZXR1cm4gbUFsbG9jYXRpb247CisgICAgICAgIH0KKworICAgICAgICAvL0BPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB1cGRhdGVBbGxvY2F0aW9uKCkgeworICAgICAgICB9CisKKworICAgICAgICAvLworICAgICAgICAvKgorICAgICAgICBwdWJsaWMgY2xhc3MgU2NyaXB0RmllbGRfVXNlckZpZWxkCisgICAgICAgICAgICBleHRlbmRzIGFuZHJvaWQucmVuZGVyc2NyaXB0LlNjcmlwdC5GaWVsZEJhc2UgeworCisgICAgICAgICAgICBwcm90ZWN0ZWQKKworICAgICAgICB9CisKKyAgICAgICAgKi8KKworICAgIH0KIH0KIApkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9TY3JpcHRDLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1NjcmlwdEMuamF2YQppbmRleCBiYjk5ZTIzLi41OTU5YmU0IDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1NjcmlwdEMuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1NjcmlwdEMuamF2YQpAQCAtMzcsMTEgKzM3LDQ5IEBACiAgICAgICAgIHN1cGVyKGlkLCBycyk7CiAgICAgfQogCisgICAgcHJvdGVjdGVkIFNjcmlwdEMoUmVuZGVyU2NyaXB0IHJzLCBSZXNvdXJjZXMgcmVzb3VyY2VzLCBpbnQgcmVzb3VyY2VJRCwgYm9vbGVhbiBpc1Jvb3QpIHsKKyAgICAgICAgc3VwZXIoMCwgcnMpOworICAgICAgICBtSUQgPSBpbnRlcm5hbENyZWF0ZShycywgcmVzb3VyY2VzLCByZXNvdXJjZUlEKTsKKyAgICB9CisKKworICAgIHByaXZhdGUgc3RhdGljIHN5bmNocm9uaXplZCBpbnQgaW50ZXJuYWxDcmVhdGUoUmVuZGVyU2NyaXB0IHJzLCBSZXNvdXJjZXMgcmVzb3VyY2VzLCBpbnQgcmVzb3VyY2VJRCkgeworICAgICAgICBieXRlW10gcGdtOworICAgICAgICBpbnQgcGdtTGVuZ3RoOworICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IHJlc291cmNlcy5vcGVuUmF3UmVzb3VyY2UocmVzb3VyY2VJRCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHBnbSA9IG5ldyBieXRlWzEwMjRdOworICAgICAgICAgICAgICAgIHBnbUxlbmd0aCA9IDA7CisgICAgICAgICAgICAgICAgd2hpbGUodHJ1ZSkgeworICAgICAgICAgICAgICAgICAgICBpbnQgYnl0ZXNMZWZ0ID0gcGdtLmxlbmd0aCAtIHBnbUxlbmd0aDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJ5dGVzTGVmdCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBieXRlW10gYnVmMiA9IG5ldyBieXRlW3BnbS5sZW5ndGggKiAyXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkocGdtLCAwLCBidWYyLCAwLCBwZ20ubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBnbSA9IGJ1ZjI7CisgICAgICAgICAgICAgICAgICAgICAgICBieXRlc0xlZnQgPSBwZ20ubGVuZ3RoIC0gcGdtTGVuZ3RoOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGludCBieXRlc1JlYWQgPSBpcy5yZWFkKHBnbSwgcGdtTGVuZ3RoLCBieXRlc0xlZnQpOworICAgICAgICAgICAgICAgICAgICBpZiAoYnl0ZXNSZWFkIDw9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHBnbUxlbmd0aCArPSBieXRlc1JlYWQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBpcy5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSZXNvdXJjZXMuTm90Rm91bmRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIHJzLm5TY3JpcHRDQmVnaW4oKTsKKyAgICAgICAgcnMublNjcmlwdENTZXRTY3JpcHQocGdtLCAwLCBwZ21MZW5ndGgpOworICAgICAgICByZXR1cm4gcnMublNjcmlwdENDcmVhdGUoKTsKKyAgICB9CisKICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJ1aWxkZXIgZXh0ZW5kcyBTY3JpcHQuQnVpbGRlciB7CiAgICAgICAgIGJ5dGVbXSBtUHJvZ3JhbTsKICAgICAgICAgaW50IG1Qcm9ncmFtTGVuZ3RoOwotICAgICAgICBIYXNoTWFwPFN0cmluZyxJbnRlZ2VyPiBtSW50RGVmaW5lcyA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgIEhhc2hNYXA8U3RyaW5nLEZsb2F0PiBtRmxvYXREZWZpbmVzID0gbmV3IEhhc2hNYXAoKTsKIAogICAgICAgICBwdWJsaWMgQnVpbGRlcihSZW5kZXJTY3JpcHQgcnMpIHsKICAgICAgICAgICAgIHN1cGVyKHJzKTsKQEAgLTkyLDY2ICsxMzAsMjAgQEAKIAogICAgICAgICBzdGF0aWMgc3luY2hyb25pemVkIFNjcmlwdEMgaW50ZXJuYWxDcmVhdGUoQnVpbGRlciBiKSB7CiAgICAgICAgICAgICBiLm1SUy5uU2NyaXB0Q0JlZ2luKCk7Ci0gICAgICAgICAgICBiLnRyYW5zZmVyQ3JlYXRlKCk7CiAKLSAgICAgICAgICAgIGZvciAoRW50cnk8U3RyaW5nLEludGVnZXI+IGU6IGIubUludERlZmluZXMuZW50cnlTZXQoKSkgewotICAgICAgICAgICAgICAgIGIubVJTLm5TY3JpcHRDQWRkRGVmaW5lSTMyKGUuZ2V0S2V5KCksIGUuZ2V0VmFsdWUoKS5pbnRWYWx1ZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAoRW50cnk8U3RyaW5nLEZsb2F0PiBlOiBiLm1GbG9hdERlZmluZXMuZW50cnlTZXQoKSkgewotICAgICAgICAgICAgICAgIGIubVJTLm5TY3JpcHRDQWRkRGVmaW5lRihlLmdldEtleSgpLCBlLmdldFZhbHVlKCkuZmxvYXRWYWx1ZSgpKTsKLSAgICAgICAgICAgIH0KLQorICAgICAgICAgICAgYW5kcm9pZC51dGlsLkxvZy5lKCJycyIsICJsZW4gPSAiICsgYi5tUHJvZ3JhbUxlbmd0aCk7CiAgICAgICAgICAgICBiLm1SUy5uU2NyaXB0Q1NldFNjcmlwdChiLm1Qcm9ncmFtLCAwLCBiLm1Qcm9ncmFtTGVuZ3RoKTsKIAogICAgICAgICAgICAgaW50IGlkID0gYi5tUlMublNjcmlwdENDcmVhdGUoKTsKICAgICAgICAgICAgIFNjcmlwdEMgb2JqID0gbmV3IFNjcmlwdEMoaWQsIGIubVJTKTsKLSAgICAgICAgICAgIGIudHJhbnNmZXJPYmplY3Qob2JqKTsKLQogICAgICAgICAgICAgcmV0dXJuIG9iajsKICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyB2b2lkIGFkZERlZmluZShTdHJpbmcgbmFtZSwgaW50IHZhbHVlKSB7Ci0gICAgICAgICAgICBtSW50RGVmaW5lcy5wdXQobmFtZSwgdmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgYWRkRGVmaW5lKFN0cmluZyBuYW1lLCBmbG9hdCB2YWx1ZSkgewotICAgICAgICAgICAgbUZsb2F0RGVmaW5lcy5wdXQobmFtZSwgdmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRha2VzIHRoZSBhbGwgcHVibGljIHN0YXRpYyBmaW5hbCBmaWVsZHMgZm9yIGEgY2xhc3MsIGFuZCBhZGRzIGRlZmluZXMKLSAgICAgICAgICogZm9yIHRoZW0sIHVzaW5nIHRoZSBuYW1lIG9mIHRoZSBmaWVsZCBhcyB0aGUgbmFtZSBvZiB0aGUgZGVmaW5lLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgYWRkRGVmaW5lcyhDbGFzcyBjbCkgewotICAgICAgICAgICAgYWRkRGVmaW5lcyhjbC5nZXRGaWVsZHMoKSwgKE1vZGlmaWVyLlNUQVRJQyB8IE1vZGlmaWVyLkZJTkFMIHwgTW9kaWZpZXIuUFVCTElDKSwgbnVsbCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogVGFrZXMgdGhlIGFsbCBwdWJsaWMgZmllbGRzIGZvciBhbiBvYmplY3QsIGFuZCBhZGRzIGRlZmluZXMKLSAgICAgICAgICogZm9yIHRoZW0sIHVzaW5nIHRoZSBuYW1lIG9mIHRoZSBmaWVsZCBhcyB0aGUgbmFtZSBvZiB0aGUgZGVmaW5lLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgYWRkRGVmaW5lcyhPYmplY3QgbykgewotICAgICAgICAgICAgYWRkRGVmaW5lcyhvLmdldENsYXNzKCkuZ2V0RmllbGRzKCksIE1vZGlmaWVyLlBVQkxJQywgbyk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIGFkZERlZmluZXMoRmllbGRbXSBmaWVsZHMsIGludCBtYXNrLCBPYmplY3QgbykgewotICAgICAgICAgICAgZm9yIChGaWVsZCBmOiBmaWVsZHMpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBpZiAoKGYuZ2V0TW9kaWZpZXJzKCkgJiBtYXNrKSA9PSBtYXNrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDbGFzcyB0ID0gZi5nZXRUeXBlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodCA9PSBpbnQuY2xhc3MpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW50RGVmaW5lcy5wdXQoZi5nZXROYW1lKCksIGYuZ2V0SW50KG8pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHQgPT0gZmxvYXQuY2xhc3MpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRmxvYXREZWZpbmVzLnB1dChmLmdldE5hbWUoKSwgZi5nZXRGbG9hdChvKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IERvIHdlIHdhbnQgdGhpcyBsb2c/Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgImFkZERlZmluZXMgc2tpcHBpbmcgZmllbGQgIiArIGYuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICAgICAgcHVibGljIHZvaWQgYWRkRGVmaW5lKFN0cmluZyBuYW1lLCBpbnQgdmFsdWUpIHt9CisgICAgICAgIHB1YmxpYyB2b2lkIGFkZERlZmluZShTdHJpbmcgbmFtZSwgZmxvYXQgdmFsdWUpIHt9CisgICAgICAgIHB1YmxpYyB2b2lkIGFkZERlZmluZXMoQ2xhc3MgY2wpIHt9CisgICAgICAgIHB1YmxpYyB2b2lkIGFkZERlZmluZXMoT2JqZWN0IG8pIHt9CisgICAgICAgIHZvaWQgYWRkRGVmaW5lcyhGaWVsZFtdIGZpZWxkcywgaW50IG1hc2ssIE9iamVjdCBvKSB7fQogCiAgICAgICAgIHB1YmxpYyBTY3JpcHRDIGNyZWF0ZSgpIHsKICAgICAgICAgICAgIHJldHVybiBpbnRlcm5hbENyZWF0ZSh0aGlzKTsKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvU2hvcnQyLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1Nob3J0Mi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyNjgwMWYKLS0tIC9kZXYvbnVsbAorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1Nob3J0Mi5qYXZhCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQucmVuZGVyc2NyaXB0OworCitpbXBvcnQgamF2YS5sYW5nLk1hdGg7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworCisvKioKKyAqIEBoaWRlCisgKgorICoqLworcHVibGljIGNsYXNzIFNob3J0MiB7CisgICAgcHVibGljIFNob3J0MigpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgc2hvcnQgeDsKKyAgICBwdWJsaWMgc2hvcnQgeTsKK30KKworCisKKwpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9TaG9ydDMuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvU2hvcnQzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I5YzMwNQotLS0gL2Rldi9udWxsCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvU2hvcnQzLmphdmEKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5yZW5kZXJzY3JpcHQ7CisKK2ltcG9ydCBqYXZhLmxhbmcuTWF0aDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCisKKy8qKgorICogQGhpZGUKKyAqCisgKiovCitwdWJsaWMgY2xhc3MgU2hvcnQzIHsKKyAgICBwdWJsaWMgU2hvcnQzKCkgeworICAgIH0KKworICAgIHB1YmxpYyBzaG9ydCB4OworICAgIHB1YmxpYyBzaG9ydCB5OworICAgIHB1YmxpYyBzaG9ydCB6OworfQorCisKKworCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1Nob3J0NC5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9TaG9ydDQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTQ3NGUyCi0tLSAvZGV2L251bGwKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9TaG9ydDQuamF2YQpAQCAtMCwwICsxLDM4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnJlbmRlcnNjcmlwdDsKKworaW1wb3J0IGphdmEubGFuZy5NYXRoOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKKworLyoqCisgKiBAaGlkZQorICoKKyAqKi8KK3B1YmxpYyBjbGFzcyBTaG9ydDQgeworICAgIHB1YmxpYyBTaG9ydDQoKSB7CisgICAgfQorCisgICAgcHVibGljIHNob3J0IHg7CisgICAgcHVibGljIHNob3J0IHk7CisgICAgcHVibGljIHNob3J0IHo7CisgICAgcHVibGljIHNob3J0IHc7Cit9CisKKworCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1NpbXBsZU1lc2guamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvU2ltcGxlTWVzaC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTIxN2E5Li4wMDAwMDAwCi0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvU2ltcGxlTWVzaC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzY0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQucmVuZGVyc2NyaXB0OwotCi1pbXBvcnQgYW5kcm9pZC51dGlsLkNvbmZpZzsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotCi0vKioKLSAqIEBoaWRlCi0gKgotICoqLwotcHVibGljIGNsYXNzIFNpbXBsZU1lc2ggZXh0ZW5kcyBCYXNlT2JqIHsKLSAgICBUeXBlW10gbVZlcnRleFR5cGVzOwotICAgIFR5cGUgbUluZGV4VHlwZTsKLSAgICAvL1R5cGUgbUJhdGNoZVR5cGU7Ci0gICAgUHJpbWl0aXZlIG1QcmltaXRpdmU7Ci0KLSAgICBTaW1wbGVNZXNoKGludCBpZCwgUmVuZGVyU2NyaXB0IHJzKSB7Ci0gICAgICAgIHN1cGVyKHJzKTsKLSAgICAgICAgbUlEID0gaWQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYmluZFZlcnRleEFsbG9jYXRpb24oQWxsb2NhdGlvbiBhLCBpbnQgc2xvdCkgewotICAgICAgICBtUlMudmFsaWRhdGUoKTsKLSAgICAgICAgbVJTLm5TaW1wbGVNZXNoQmluZFZlcnRleChtSUQsIGEubUlELCBzbG90KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBiaW5kSW5kZXhBbGxvY2F0aW9uKEFsbG9jYXRpb24gYSkgewotICAgICAgICBtUlMudmFsaWRhdGUoKTsKLSAgICAgICAgbVJTLm5TaW1wbGVNZXNoQmluZEluZGV4KG1JRCwgYS5tSUQpOwotICAgIH0KLQotICAgIHB1YmxpYyBBbGxvY2F0aW9uIGNyZWF0ZVZlcnRleEFsbG9jYXRpb24oaW50IHNsb3QpIHsKLSAgICAgICAgbVJTLnZhbGlkYXRlKCk7Ci0gICAgICAgIHJldHVybiBBbGxvY2F0aW9uLmNyZWF0ZVR5cGVkKG1SUywgbVZlcnRleFR5cGVzW3Nsb3RdKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQWxsb2NhdGlvbiBjcmVhdGVJbmRleEFsbG9jYXRpb24oKSB7Ci0gICAgICAgIG1SUy52YWxpZGF0ZSgpOwotICAgICAgICByZXR1cm4gQWxsb2NhdGlvbi5jcmVhdGVUeXBlZChtUlMsIG1JbmRleFR5cGUpOwotICAgIH0KLQotICAgIHB1YmxpYyBUeXBlIGdldFZlcnRleFR5cGUoaW50IHNsb3QpIHsKLSAgICAgICAgcmV0dXJuIG1WZXJ0ZXhUeXBlc1tzbG90XTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVHlwZSBnZXRJbmRleFR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBtSW5kZXhUeXBlOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQnVpbGRlciB7Ci0gICAgICAgIFJlbmRlclNjcmlwdCBtUlM7Ci0KLSAgICAgICAgY2xhc3MgRW50cnkgewotICAgICAgICAgICAgVHlwZSB0OwotICAgICAgICAgICAgRWxlbWVudCBlOwotICAgICAgICAgICAgaW50IHNpemU7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgbVZlcnRleFR5cGVDb3VudDsKLSAgICAgICAgRW50cnlbXSBtVmVydGV4VHlwZXM7Ci0gICAgICAgIEVudHJ5IG1JbmRleFR5cGU7Ci0gICAgICAgIC8vRW50cnkgbUJhdGNoVHlwZTsKLSAgICAgICAgUHJpbWl0aXZlIG1QcmltaXRpdmU7Ci0KLQotICAgICAgICBwdWJsaWMgQnVpbGRlcihSZW5kZXJTY3JpcHQgcnMpIHsKLSAgICAgICAgICAgIG1SUyA9IHJzOwotICAgICAgICAgICAgbVZlcnRleFR5cGVDb3VudCA9IDA7Ci0gICAgICAgICAgICBtVmVydGV4VHlwZXMgPSBuZXcgRW50cnlbMTZdOwotICAgICAgICAgICAgbUluZGV4VHlwZSA9IG5ldyBFbnRyeSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGludCBhZGRWZXJ0ZXhUeXBlKFR5cGUgdCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBpZiAobVZlcnRleFR5cGVDb3VudCA+PSBtVmVydGV4VHlwZXMubGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiTWF4IHZlcnRleCB0eXBlcyBleGNlZWRlZC4iKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaW50IGFkZGVkSW5kZXggPSBtVmVydGV4VHlwZUNvdW50OwotICAgICAgICAgICAgbVZlcnRleFR5cGVzW21WZXJ0ZXhUeXBlQ291bnRdID0gbmV3IEVudHJ5KCk7Ci0gICAgICAgICAgICBtVmVydGV4VHlwZXNbbVZlcnRleFR5cGVDb3VudF0udCA9IHQ7Ci0gICAgICAgICAgICBtVmVydGV4VHlwZUNvdW50Kys7Ci0gICAgICAgICAgICByZXR1cm4gYWRkZWRJbmRleDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgYWRkVmVydGV4VHlwZShFbGVtZW50IGUsIGludCBzaXplKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGlmIChtVmVydGV4VHlwZUNvdW50ID49IG1WZXJ0ZXhUeXBlcy5sZW5ndGgpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJNYXggdmVydGV4IHR5cGVzIGV4Y2VlZGVkLiIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbnQgYWRkZWRJbmRleCA9IG1WZXJ0ZXhUeXBlQ291bnQ7Ci0gICAgICAgICAgICBtVmVydGV4VHlwZXNbbVZlcnRleFR5cGVDb3VudF0gPSBuZXcgRW50cnkoKTsKLSAgICAgICAgICAgIG1WZXJ0ZXhUeXBlc1ttVmVydGV4VHlwZUNvdW50XS5lID0gZTsKLSAgICAgICAgICAgIG1WZXJ0ZXhUeXBlc1ttVmVydGV4VHlwZUNvdW50XS5zaXplID0gc2l6ZTsKLSAgICAgICAgICAgIG1WZXJ0ZXhUeXBlQ291bnQrKzsKLSAgICAgICAgICAgIHJldHVybiBhZGRlZEluZGV4OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0SW5kZXhUeXBlKFR5cGUgdCkgewotICAgICAgICAgICAgbUluZGV4VHlwZS50ID0gdDsKLSAgICAgICAgICAgIG1JbmRleFR5cGUuZSA9IG51bGw7Ci0gICAgICAgICAgICBtSW5kZXhUeXBlLnNpemUgPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0SW5kZXhUeXBlKEVsZW1lbnQgZSwgaW50IHNpemUpIHsKLSAgICAgICAgICAgIG1JbmRleFR5cGUudCA9IG51bGw7Ci0gICAgICAgICAgICBtSW5kZXhUeXBlLmUgPSBlOwotICAgICAgICAgICAgbUluZGV4VHlwZS5zaXplID0gc2l6ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFByaW1pdGl2ZShQcmltaXRpdmUgcCkgewotICAgICAgICAgICAgbVByaW1pdGl2ZSA9IHA7Ci0gICAgICAgIH0KLQotCi0gICAgICAgIFR5cGUgbmV3VHlwZShFbGVtZW50IGUsIGludCBzaXplKSB7Ci0gICAgICAgICAgICBUeXBlLkJ1aWxkZXIgdGIgPSBuZXcgVHlwZS5CdWlsZGVyKG1SUywgZSk7Ci0gICAgICAgICAgICB0Yi5hZGQoRGltZW5zaW9uLlgsIHNpemUpOwotICAgICAgICAgICAgcmV0dXJuIHRiLmNyZWF0ZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgc3RhdGljIHN5bmNocm9uaXplZCBTaW1wbGVNZXNoIGludGVybmFsQ3JlYXRlKFJlbmRlclNjcmlwdCBycywgQnVpbGRlciBiKSB7Ci0gICAgICAgICAgICBUeXBlW10gdG9EZXN0cm95ID0gbmV3IFR5cGVbMThdOwotICAgICAgICAgICAgaW50IHRvRGVzdHJveUNvdW50ID0gMDsKLQotICAgICAgICAgICAgaW50IGluZGV4SUQgPSAwOwotICAgICAgICAgICAgaWYgKGIubUluZGV4VHlwZS50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpbmRleElEID0gYi5tSW5kZXhUeXBlLnQubUlEOwotICAgICAgICAgICAgfSBlbHNlIGlmIChiLm1JbmRleFR5cGUuc2l6ZSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgYi5tSW5kZXhUeXBlLnQgPSBiLm5ld1R5cGUoYi5tSW5kZXhUeXBlLmUsIGIubUluZGV4VHlwZS5zaXplKTsKLSAgICAgICAgICAgICAgICBpbmRleElEID0gYi5tSW5kZXhUeXBlLnQubUlEOwotICAgICAgICAgICAgICAgIHRvRGVzdHJveVt0b0Rlc3Ryb3lDb3VudCsrXSA9IGIubUluZGV4VHlwZS50OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbnRbXSBJRHMgPSBuZXcgaW50W2IubVZlcnRleFR5cGVDb3VudF07Ci0gICAgICAgICAgICBmb3IoaW50IGN0PTA7IGN0IDwgYi5tVmVydGV4VHlwZUNvdW50OyBjdCsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGIubVZlcnRleFR5cGVzW2N0XS50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgSURzW2N0XSA9IGIubVZlcnRleFR5cGVzW2N0XS50Lm1JRDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBiLm1WZXJ0ZXhUeXBlc1tjdF0udCA9IGIubmV3VHlwZShiLm1WZXJ0ZXhUeXBlc1tjdF0uZSwgYi5tVmVydGV4VHlwZXNbY3RdLnNpemUpOwotICAgICAgICAgICAgICAgICAgICBJRHNbY3RdID0gYi5tVmVydGV4VHlwZXNbY3RdLnQubUlEOwotICAgICAgICAgICAgICAgICAgICB0b0Rlc3Ryb3lbdG9EZXN0cm95Q291bnQrK10gPSBiLm1WZXJ0ZXhUeXBlc1tjdF0udDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGludCBpZCA9IHJzLm5TaW1wbGVNZXNoQ3JlYXRlKDAsIGluZGV4SUQsIElEcywgYi5tUHJpbWl0aXZlLm1JRCk7Ci0gICAgICAgICAgICBmb3IoaW50IGN0PTA7IGN0IDwgdG9EZXN0cm95Q291bnQ7IGN0KyspIHsKLSAgICAgICAgICAgICAgICB0b0Rlc3Ryb3lbY3RdLmRlc3Ryb3koKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIG5ldyBTaW1wbGVNZXNoKGlkLCBycyk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU2ltcGxlTWVzaCBjcmVhdGUoKSB7Ci0gICAgICAgICAgICBtUlMudmFsaWRhdGUoKTsKLSAgICAgICAgICAgIFNpbXBsZU1lc2ggc20gPSBpbnRlcm5hbENyZWF0ZShtUlMsIHRoaXMpOwotICAgICAgICAgICAgc20ubVZlcnRleFR5cGVzID0gbmV3IFR5cGVbbVZlcnRleFR5cGVDb3VudF07Ci0gICAgICAgICAgICBmb3IoaW50IGN0PTA7IGN0IDwgbVZlcnRleFR5cGVDb3VudDsgY3QrKykgewotICAgICAgICAgICAgICAgIHNtLm1WZXJ0ZXhUeXBlc1tjdF0gPSBtVmVydGV4VHlwZXNbY3RdLnQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzbS5tSW5kZXhUeXBlID0gbUluZGV4VHlwZS50OwotICAgICAgICAgICAgc20ubVByaW1pdGl2ZSA9IG1QcmltaXRpdmU7Ci0gICAgICAgICAgICByZXR1cm4gc207Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRyaWFuZ2xlTWVzaEJ1aWxkZXIgewotICAgICAgICBmbG9hdCBtVnR4RGF0YVtdOwotICAgICAgICBpbnQgbVZ0eENvdW50OwotICAgICAgICBzaG9ydCBtSW5kZXhEYXRhW107Ci0gICAgICAgIGludCBtSW5kZXhDb3VudDsKLSAgICAgICAgUmVuZGVyU2NyaXB0IG1SUzsKLSAgICAgICAgRWxlbWVudCBtRWxlbWVudDsKLQotICAgICAgICBmbG9hdCBtTlggPSAwOwotICAgICAgICBmbG9hdCBtTlkgPSAwOwotICAgICAgICBmbG9hdCBtTlogPSAtMTsKLSAgICAgICAgZmxvYXQgbVMwID0gMDsKLSAgICAgICAgZmxvYXQgbVQwID0gMDsKLSAgICAgICAgZmxvYXQgbVIgPSAxOwotICAgICAgICBmbG9hdCBtRyA9IDE7Ci0gICAgICAgIGZsb2F0IG1CID0gMTsKLSAgICAgICAgZmxvYXQgbUEgPSAxOwotCi0gICAgICAgIGludCBtVnR4U2l6ZTsKLSAgICAgICAgaW50IG1GbGFnczsKLQotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT0xPUiA9IDB4MDAwMTsKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9STUFMID0gMHgwMDAyOwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBURVhUVVJFXzAgPSAweDAxMDA7Ci0KLSAgICAgICAgcHVibGljIFRyaWFuZ2xlTWVzaEJ1aWxkZXIoUmVuZGVyU2NyaXB0IHJzLCBpbnQgdnR4U2l6ZSwgaW50IGZsYWdzKSB7Ci0gICAgICAgICAgICBtUlMgPSByczsKLSAgICAgICAgICAgIG1WdHhDb3VudCA9IDA7Ci0gICAgICAgICAgICBtSW5kZXhDb3VudCA9IDA7Ci0gICAgICAgICAgICBtVnR4RGF0YSA9IG5ldyBmbG9hdFsxMjhdOwotICAgICAgICAgICAgbUluZGV4RGF0YSA9IG5ldyBzaG9ydFsxMjhdOwotICAgICAgICAgICAgbVZ0eFNpemUgPSB2dHhTaXplOwotICAgICAgICAgICAgbUZsYWdzID0gZmxhZ3M7Ci0KLSAgICAgICAgICAgIGlmICh2dHhTaXplIDwgMiB8fCB2dHhTaXplID4gMykgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlZlcnRleCBzaXplIG91dCBvZiByYW5nZS4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBtYWtlU3BhY2UoaW50IGNvdW50KSB7Ci0gICAgICAgICAgICBpZiAoKG1WdHhDb3VudCArIGNvdW50KSA+PSBtVnR4RGF0YS5sZW5ndGgpIHsKLSAgICAgICAgICAgICAgICBmbG9hdCB0W10gPSBuZXcgZmxvYXRbbVZ0eERhdGEubGVuZ3RoICogMl07Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShtVnR4RGF0YSwgMCwgdCwgMCwgbVZ0eERhdGEubGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBtVnR4RGF0YSA9IHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgbGF0Y2goKSB7Ci0gICAgICAgICAgICBpZiAoKG1GbGFncyAmIENPTE9SKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgbWFrZVNwYWNlKDQpOwotICAgICAgICAgICAgICAgIG1WdHhEYXRhW21WdHhDb3VudCsrXSA9IG1SOwotICAgICAgICAgICAgICAgIG1WdHhEYXRhW21WdHhDb3VudCsrXSA9IG1HOwotICAgICAgICAgICAgICAgIG1WdHhEYXRhW21WdHhDb3VudCsrXSA9IG1COwotICAgICAgICAgICAgICAgIG1WdHhEYXRhW21WdHhDb3VudCsrXSA9IG1BOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKChtRmxhZ3MgJiBURVhUVVJFXzApICE9IDApIHsKLSAgICAgICAgICAgICAgICBtYWtlU3BhY2UoMik7Ci0gICAgICAgICAgICAgICAgbVZ0eERhdGFbbVZ0eENvdW50KytdID0gbVMwOwotICAgICAgICAgICAgICAgIG1WdHhEYXRhW21WdHhDb3VudCsrXSA9IG1UMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICgobUZsYWdzICYgTk9STUFMKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgbWFrZVNwYWNlKDMpOwotICAgICAgICAgICAgICAgIG1WdHhEYXRhW21WdHhDb3VudCsrXSA9IG1OWDsKLSAgICAgICAgICAgICAgICBtVnR4RGF0YVttVnR4Q291bnQrK10gPSBtTlk7Ci0gICAgICAgICAgICAgICAgbVZ0eERhdGFbbVZ0eENvdW50KytdID0gbU5aOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgYWRkVmVydGV4KGZsb2F0IHgsIGZsb2F0IHkpIHsKLSAgICAgICAgICAgIGlmIChtVnR4U2l6ZSAhPSAyKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiYWRkIG1pc3RtYXRjaCB3aXRoIGRlY2xhcmVkIGNvbXBvbmVudHMuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYWtlU3BhY2UoMik7Ci0gICAgICAgICAgICBtVnR4RGF0YVttVnR4Q291bnQrK10gPSB4OwotICAgICAgICAgICAgbVZ0eERhdGFbbVZ0eENvdW50KytdID0geTsKLSAgICAgICAgICAgIGxhdGNoKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBhZGRWZXJ0ZXgoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeikgewotICAgICAgICAgICAgaWYgKG1WdHhTaXplICE9IDMpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJhZGQgbWlzdG1hdGNoIHdpdGggZGVjbGFyZWQgY29tcG9uZW50cy4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1ha2VTcGFjZSgzKTsKLSAgICAgICAgICAgIG1WdHhEYXRhW21WdHhDb3VudCsrXSA9IHg7Ci0gICAgICAgICAgICBtVnR4RGF0YVttVnR4Q291bnQrK10gPSB5OwotICAgICAgICAgICAgbVZ0eERhdGFbbVZ0eENvdW50KytdID0gejsKLSAgICAgICAgICAgIGxhdGNoKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRUZXh0dXJlKGZsb2F0IHMsIGZsb2F0IHQpIHsKLSAgICAgICAgICAgIGlmICgobUZsYWdzICYgVEVYVFVSRV8wKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiYWRkIG1pc3RtYXRjaCB3aXRoIGRlY2xhcmVkIGNvbXBvbmVudHMuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtUzAgPSBzOwotICAgICAgICAgICAgbVQwID0gdDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldE5vcm1hbChmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KSB7Ci0gICAgICAgICAgICBpZiAoKG1GbGFncyAmIE5PUk1BTCkgPT0gMCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImFkZCBtaXN0bWF0Y2ggd2l0aCBkZWNsYXJlZCBjb21wb25lbnRzLiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbU5YID0geDsKLSAgICAgICAgICAgIG1OWSA9IHk7Ci0gICAgICAgICAgICBtTlogPSB6OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0Q29sb3IoZmxvYXQgciwgZmxvYXQgZywgZmxvYXQgYiwgZmxvYXQgYSkgewotICAgICAgICAgICAgaWYgKChtRmxhZ3MgJiBDT0xPUikgPT0gMCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImFkZCBtaXN0bWF0Y2ggd2l0aCBkZWNsYXJlZCBjb21wb25lbnRzLiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVIgPSByOwotICAgICAgICAgICAgbUcgPSBnOwotICAgICAgICAgICAgbUIgPSBiOwotICAgICAgICAgICAgbUEgPSBhOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgYWRkVHJpYW5nbGUoaW50IGlkeDEsIGludCBpZHgyLCBpbnQgaWR4MykgewotICAgICAgICAgICAgaWYoKGlkeDEgPj0gbVZ0eENvdW50KSB8fCAoaWR4MSA8IDApIHx8Ci0gICAgICAgICAgICAgICAoaWR4MiA+PSBtVnR4Q291bnQpIHx8IChpZHgyIDwgMCkgfHwKLSAgICAgICAgICAgICAgIChpZHgzID49IG1WdHhDb3VudCkgfHwgKGlkeDMgPCAwKSkgewotICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiSW5kZXggcHJvdmlkZWQgZ3JlYXRlciB0aGFuIHZlcnRleCBjb3VudC4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICgobUluZGV4Q291bnQgKyAzKSA+PSBtSW5kZXhEYXRhLmxlbmd0aCkgewotICAgICAgICAgICAgICAgIHNob3J0IHRbXSA9IG5ldyBzaG9ydFttSW5kZXhEYXRhLmxlbmd0aCAqIDJdOwotICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkobUluZGV4RGF0YSwgMCwgdCwgMCwgbUluZGV4RGF0YS5sZW5ndGgpOwotICAgICAgICAgICAgICAgIG1JbmRleERhdGEgPSB0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUluZGV4RGF0YVttSW5kZXhDb3VudCsrXSA9IChzaG9ydClpZHgxOwotICAgICAgICAgICAgbUluZGV4RGF0YVttSW5kZXhDb3VudCsrXSA9IChzaG9ydClpZHgyOwotICAgICAgICAgICAgbUluZGV4RGF0YVttSW5kZXhDb3VudCsrXSA9IChzaG9ydClpZHgzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFNpbXBsZU1lc2ggY3JlYXRlKCkgewotICAgICAgICAgICAgRWxlbWVudC5CdWlsZGVyIGIgPSBuZXcgRWxlbWVudC5CdWlsZGVyKG1SUyk7Ci0gICAgICAgICAgICBpbnQgZmxvYXRDb3VudCA9IG1WdHhTaXplOwotICAgICAgICAgICAgYi5hZGQoRWxlbWVudC5jcmVhdGVBdHRyaWIobVJTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWxlbWVudC5EYXRhVHlwZS5GTE9BVF8zMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnQuRGF0YUtpbmQuUE9TSVRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVnR4U2l6ZSksICJwb3NpdGlvbiIpOwotICAgICAgICAgICAgaWYgKChtRmxhZ3MgJiBDT0xPUikgIT0gMCkgewotICAgICAgICAgICAgICAgIGZsb2F0Q291bnQgKz0gNDsKLSAgICAgICAgICAgICAgICBiLmFkZChFbGVtZW50LmNyZWF0ZUF0dHJpYihtUlMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWxlbWVudC5EYXRhVHlwZS5GTE9BVF8zMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50LkRhdGFLaW5kLkNPTE9SLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQpLCAiY29sb3IiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICgobUZsYWdzICYgVEVYVFVSRV8wKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgZmxvYXRDb3VudCArPSAyOwotICAgICAgICAgICAgICAgIGIuYWRkKEVsZW1lbnQuY3JlYXRlQXR0cmliKG1SUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50LkRhdGFUeXBlLkZMT0FUXzMyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnQuRGF0YUtpbmQuVEVYVFVSRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyKSwgInRleHR1cmUiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICgobUZsYWdzICYgTk9STUFMKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgZmxvYXRDb3VudCArPSAzOwotICAgICAgICAgICAgICAgIGIuYWRkKEVsZW1lbnQuY3JlYXRlQXR0cmliKG1SUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50LkRhdGFUeXBlLkZMT0FUXzMyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnQuRGF0YUtpbmQuTk9STUFMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMpLCAibm9ybWFsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtRWxlbWVudCA9IGIuY3JlYXRlKCk7Ci0KLSAgICAgICAgICAgIEJ1aWxkZXIgc21iID0gbmV3IEJ1aWxkZXIobVJTKTsKLSAgICAgICAgICAgIHNtYi5hZGRWZXJ0ZXhUeXBlKG1FbGVtZW50LCBtVnR4Q291bnQgLyBmbG9hdENvdW50KTsKLSAgICAgICAgICAgIHNtYi5zZXRJbmRleFR5cGUoRWxlbWVudC5jcmVhdGVJbmRleChtUlMpLCBtSW5kZXhDb3VudCk7Ci0gICAgICAgICAgICBzbWIuc2V0UHJpbWl0aXZlKFByaW1pdGl2ZS5UUklBTkdMRSk7Ci0gICAgICAgICAgICBTaW1wbGVNZXNoIHNtID0gc21iLmNyZWF0ZSgpOwotCi0gICAgICAgICAgICBBbGxvY2F0aW9uIHZlcnRleEFsbG9jID0gc20uY3JlYXRlVmVydGV4QWxsb2NhdGlvbigwKTsKLSAgICAgICAgICAgIEFsbG9jYXRpb24gaW5kZXhBbGxvYyA9IHNtLmNyZWF0ZUluZGV4QWxsb2NhdGlvbigpOwotICAgICAgICAgICAgc20uYmluZFZlcnRleEFsbG9jYXRpb24odmVydGV4QWxsb2MsIDApOwotICAgICAgICAgICAgc20uYmluZEluZGV4QWxsb2NhdGlvbihpbmRleEFsbG9jKTsKLQotICAgICAgICAgICAgdmVydGV4QWxsb2MuZGF0YShtVnR4RGF0YSk7Ci0gICAgICAgICAgICB2ZXJ0ZXhBbGxvYy51cGxvYWRUb0J1ZmZlck9iamVjdCgpOwotCi0gICAgICAgICAgICBpbmRleEFsbG9jLmRhdGEobUluZGV4RGF0YSk7Ci0gICAgICAgICAgICBpbmRleEFsbG9jLnVwbG9hZFRvQnVmZmVyT2JqZWN0KCk7Ci0KLSAgICAgICAgICAgIHJldHVybiBzbTsKLSAgICAgICAgfQotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9UeXBlLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1R5cGUuamF2YQppbmRleCA2MmQzODY3Li4yMTA1M2M5IDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1R5cGUuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1R5cGUuamF2YQpAQCAtMTYsNyArMTYsOSBAQAogCiBwYWNrYWdlIGFuZHJvaWQucmVuZGVyc2NyaXB0OwogCisKIGltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCiAvKioKICAqIEBoaWRlCkBAIC05NSw4ICs5Nyw3IEBACiAKIAogICAgIFR5cGUoaW50IGlkLCBSZW5kZXJTY3JpcHQgcnMpIHsKLSAgICAgICAgc3VwZXIocnMpOwotICAgICAgICBtSUQgPSBpZDsKKyAgICAgICAgc3VwZXIoaWQsIHJzKTsKICAgICAgICAgbU5hdGl2ZUNhY2hlID0gMDsKICAgICB9CiAKQEAgLTEwOCw0OCArMTA5LDMwIEBACiAgICAgICAgIHN1cGVyLmZpbmFsaXplKCk7CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBUeXBlIGNyZWF0ZUZyb21DbGFzcyhSZW5kZXJTY3JpcHQgcnMsIENsYXNzIGMsIGludCBzaXplKSB7Ci0gICAgICAgIEVsZW1lbnQgZSA9IEVsZW1lbnQuY3JlYXRlRnJvbUNsYXNzKHJzLCBjKTsKLSAgICAgICAgQnVpbGRlciBiID0gbmV3IEJ1aWxkZXIocnMsIGUpOwotICAgICAgICBiLmFkZChEaW1lbnNpb24uWCwgc2l6ZSk7Ci0gICAgICAgIFR5cGUgdCA9IGIuY3JlYXRlKCk7Ci0gICAgICAgIGUuZGVzdHJveSgpOworICAgIEBPdmVycmlkZQorICAgIHZvaWQgdXBkYXRlRnJvbU5hdGl2ZSgpIHsKKyAgICAgICAgLy8gV2UgaGF2ZSA2IGludGVnZXIgdG8gb2J0YWluIG1EaW1YOyBtRGltWTsgbURpbVo7CisgICAgICAgIC8vIG1EaW1MT0Q7IG1EaW1GYWNlczsgbUVsZW1lbnQ7CisgICAgICAgIGludFtdIGRhdGFCdWZmZXIgPSBuZXcgaW50WzZdOworICAgICAgICBtUlMublR5cGVHZXROYXRpdmVEYXRhKG1JRCwgZGF0YUJ1ZmZlcik7CiAKLSAgICAgICAgLy8gbmF0aXZlIGZpZWxkcwotICAgICAgICB7Ci0gICAgICAgICAgICBGaWVsZFtdIGZpZWxkcyA9IGMuZ2V0RmllbGRzKCk7Ci0gICAgICAgICAgICBpbnRbXSBhclR5cGVzID0gbmV3IGludFtmaWVsZHMubGVuZ3RoXTsKLSAgICAgICAgICAgIGludFtdIGFyQml0cyA9IG5ldyBpbnRbZmllbGRzLmxlbmd0aF07CisgICAgICAgIG1EaW1YID0gZGF0YUJ1ZmZlclswXTsKKyAgICAgICAgbURpbVkgPSBkYXRhQnVmZmVyWzFdOworICAgICAgICBtRGltWiA9IGRhdGFCdWZmZXJbMl07CisgICAgICAgIG1EaW1MT0QgPSBkYXRhQnVmZmVyWzNdID09IDEgPyB0cnVlIDogZmFsc2U7CisgICAgICAgIG1EaW1GYWNlcyA9IGRhdGFCdWZmZXJbNF0gPT0gMSA/IHRydWUgOiBmYWxzZTsKIAotICAgICAgICAgICAgZm9yKGludCBjdD0wOyBjdCA8IGZpZWxkcy5sZW5ndGg7IGN0KyspIHsKLSAgICAgICAgICAgICAgICBGaWVsZCBmID0gZmllbGRzW2N0XTsKLSAgICAgICAgICAgICAgICBDbGFzcyBmYyA9IGYuZ2V0VHlwZSgpOwotICAgICAgICAgICAgICAgIGlmKGZjID09IGludC5jbGFzcykgewotICAgICAgICAgICAgICAgICAgICBhclR5cGVzW2N0XSA9IEVsZW1lbnQuRGF0YVR5cGUuU0lHTkVEXzMyLm1JRDsKLSAgICAgICAgICAgICAgICAgICAgYXJCaXRzW2N0XSA9IDMyOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZihmYyA9PSBzaG9ydC5jbGFzcykgewotICAgICAgICAgICAgICAgICAgICBhclR5cGVzW2N0XSA9IEVsZW1lbnQuRGF0YVR5cGUuU0lHTkVEXzE2Lm1JRDsKLSAgICAgICAgICAgICAgICAgICAgYXJCaXRzW2N0XSA9IDE2OwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZihmYyA9PSBieXRlLmNsYXNzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFyVHlwZXNbY3RdID0gRWxlbWVudC5EYXRhVHlwZS5TSUdORURfOC5tSUQ7Ci0gICAgICAgICAgICAgICAgICAgIGFyQml0c1tjdF0gPSA4OwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZihmYyA9PSBmbG9hdC5jbGFzcykgewotICAgICAgICAgICAgICAgICAgICBhclR5cGVzW2N0XSA9IEVsZW1lbnQuRGF0YVR5cGUuRkxPQVRfMzIubUlEOwotICAgICAgICAgICAgICAgICAgICBhckJpdHNbY3RdID0gMzI7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5rb3duIGZpZWxkIHR5cGUiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBycy5uVHlwZVNldHVwRmllbGRzKHQsIGFyVHlwZXMsIGFyQml0cywgZmllbGRzKTsKKyAgICAgICAgaW50IGVsZW1lbnRJRCA9IGRhdGFCdWZmZXJbNV07CisgICAgICAgIGlmKGVsZW1lbnRJRCAhPSAwKSB7CisgICAgICAgICAgICBtRWxlbWVudCA9IG5ldyBFbGVtZW50KGVsZW1lbnRJRCwgbVJTKTsKKyAgICAgICAgICAgIG1FbGVtZW50LnVwZGF0ZUZyb21OYXRpdmUoKTsKICAgICAgICAgfQotICAgICAgICB0Lm1KYXZhQ2xhc3MgPSBjOwotICAgICAgICByZXR1cm4gdDsKKyAgICAgICAgY2FsY0VsZW1lbnRDb3VudCgpOwogICAgIH0KIAogICAgIHB1YmxpYyBzdGF0aWMgVHlwZSBjcmVhdGVGcm9tQ2xhc3MoUmVuZGVyU2NyaXB0IHJzLCBDbGFzcyBjLCBpbnQgc2l6ZSwgU3RyaW5nIHNjcmlwdE5hbWUpIHsKLSAgICAgICAgVHlwZSB0ID0gY3JlYXRlRnJvbUNsYXNzKHJzLCBjLCBzaXplKTsKLSAgICAgICAgdC5zZXROYW1lKHNjcmlwdE5hbWUpOwotICAgICAgICByZXR1cm4gdDsKKyAgICAgICAgYW5kcm9pZC51dGlsLkxvZy5lKCJSZW5kZXJTY3JpcHQiLCAiQ2FsbGluZyBkZXByaWNhdGVkIGNyZWF0ZUZyb21DbGFzcyIpOworICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CiAKIApkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9WZWN0b3IyZi5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9WZWN0b3IyZi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjdkNTdmYS4uMDAwMDAwMAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1ZlY3RvcjJmLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLnJlbmRlcnNjcmlwdDsKLQotaW1wb3J0IGphdmEubGFuZy5NYXRoOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KLQotLyoqCi0gKiBAaGlkZQotICoKLSAqKi8KLXB1YmxpYyBjbGFzcyBWZWN0b3IyZiB7Ci0gICAgcHVibGljIFZlY3RvcjJmKCkgewotICAgIH0KLQotICAgIHB1YmxpYyBmbG9hdCB4OwotICAgIHB1YmxpYyBmbG9hdCB5OwotfQotCi0KLQotCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1ZlY3RvcjNmLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1ZlY3RvcjNmLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyODQyZjMuLjAwMDAwMDAKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9WZWN0b3IzZi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5yZW5kZXJzY3JpcHQ7Ci0KLWltcG9ydCBqYXZhLmxhbmcuTWF0aDsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotCi0KLS8qKgotICogQGhpZGUKLSAqCi0gKiovCi1wdWJsaWMgY2xhc3MgVmVjdG9yM2YgewotICAgIHB1YmxpYyBWZWN0b3IzZigpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmxvYXQgeDsKLSAgICBwdWJsaWMgZmxvYXQgeTsKLSAgICBwdWJsaWMgZmxvYXQgejsKLX0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9WZWN0b3I0Zi5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9WZWN0b3I0Zi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYWJkOTU5Li4wMDAwMDAwCi0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvVmVjdG9yNGYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQucmVuZGVyc2NyaXB0OwotCi1pbXBvcnQgamF2YS5sYW5nLk1hdGg7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQotCi0vKioKLSAqIEBoaWRlCi0gKgotICoqLwotcHVibGljIGNsYXNzIFZlY3RvcjRmIHsKLSAgICBwdWJsaWMgVmVjdG9yNGYoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIGZsb2F0IHg7Ci0gICAgcHVibGljIGZsb2F0IHk7Ci0gICAgcHVibGljIGZsb2F0IHo7Ci0gICAgcHVibGljIGZsb2F0IHc7Ci19Ci0KLQotCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qbmkvYW5kcm9pZF9yZW5kZXJzY3JpcHRfUmVuZGVyU2NyaXB0LmNwcCBiL2dyYXBoaWNzL2puaS9hbmRyb2lkX3JlbmRlcnNjcmlwdF9SZW5kZXJTY3JpcHQuY3BwCmluZGV4IDQ1Y2M3MmUuLmIyZThkZDkgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2puaS9hbmRyb2lkX3JlbmRlcnNjcmlwdF9SZW5kZXJTY3JpcHQuY3BwCisrKyBiL2dyYXBoaWNzL2puaS9hbmRyb2lkX3JlbmRlcnNjcmlwdF9SZW5kZXJTY3JpcHQuY3BwCkBAIC0zNyw2ICszNyw3IEBACiAjaW5jbHVkZSAiam5pLmgiCiAjaW5jbHVkZSAiSk5JSGVscC5oIgogI2luY2x1ZGUgImFuZHJvaWRfcnVudGltZS9BbmRyb2lkUnVudGltZS5oIgorI2luY2x1ZGUgImFuZHJvaWRfcnVudGltZS9hbmRyb2lkX3ZpZXdfU3VyZmFjZS5oIgogCiAjaW5jbHVkZSA8UmVuZGVyU2NyaXB0Lmg+CiAjaW5jbHVkZSA8UmVuZGVyU2NyaXB0RW52Lmg+CkBAIC04NSw0MSArODYsNDMgQEAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBzdGF0aWMgdm9pZAotbkFzc2lnbk5hbWUoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IG9iaiwgamJ5dGVBcnJheSBzdHIpCituQ29udGV4dEZpbmlzaChKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24pCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7Ci0gICAgTE9HX0FQSSgibkFzc2lnbk5hbWUsIGNvbiglcCksIG9iaiglcCkiLCBjb24sICh2b2lkICopb2JqKTsKKyAgICBMT0dfQVBJKCJuQ29udGV4dEZpbmlzaCwgY29uKCVwKSIsIGNvbik7CisgICAgcnNDb250ZXh0RmluaXNoKGNvbik7Cit9CiAKK3N0YXRpYyB2b2lkCituQXNzaWduTmFtZShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgb2JqLCBqYnl0ZUFycmF5IHN0cikKK3sKKyAgICBMT0dfQVBJKCJuQXNzaWduTmFtZSwgY29uKCVwKSwgb2JqKCVwKSIsIGNvbiwgKHZvaWQgKilvYmopOwogICAgIGppbnQgbGVuID0gX2Vudi0+R2V0QXJyYXlMZW5ndGgoc3RyKTsKICAgICBqYnl0ZSAqIGNwdHIgPSAoamJ5dGUgKikgX2Vudi0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChzdHIsIDApOwogICAgIHJzQXNzaWduTmFtZShjb24sICh2b2lkICopb2JqLCAoY29uc3QgY2hhciAqKWNwdHIsIGxlbik7CiAgICAgX2Vudi0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoc3RyLCBjcHRyLCBKTklfQUJPUlQpOwogfQogCi1zdGF0aWMgdm9pZAotbk9iakRlc3Ryb3koSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IG9iaikKK3N0YXRpYyBqc3RyaW5nCituR2V0TmFtZShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgb2JqKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOworICAgIExPR19BUEkoIm5HZXROYW1lLCBjb24oJXApLCBvYmooJXApIiwgY29uLCAodm9pZCAqKW9iaik7CisgICAgY29uc3QgY2hhciAqbmFtZSA9IE5VTEw7CisgICAgcnNHZXROYW1lKGNvbiwgKHZvaWQgKilvYmosICZuYW1lKTsKKyAgICByZXR1cm4gX2Vudi0+TmV3U3RyaW5nVVRGKG5hbWUpOworfQorCitzdGF0aWMgdm9pZAorbk9iakRlc3Ryb3koSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IG9iaikKK3sKICAgICBMT0dfQVBJKCJuT2JqRGVzdHJveSwgY29uKCVwKSBvYmooJXApIiwgY29uLCAodm9pZCAqKW9iaik7CiAgICAgcnNPYmpEZXN0cm95KGNvbiwgKHZvaWQgKilvYmopOwogfQogCi1zdGF0aWMgdm9pZAotbk9iakRlc3Ryb3lPT0IoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IG9iaikKLXsKLSAgICAvLyBUaGlzIGZ1bmN0aW9uIG9ubHkgZGlmZmVycyBmcm9tIG5PYmpEZXN0cm95IGluIHRoYXQgaXQgY2FsbHMgdGhlCi0gICAgLy8gc3BlY2lhbCBPdXQgT2YgQmFuZCB2ZXJzaW9uIG9mIE9iakRlc3Ryb3kgd2hpY2ggaXMgdGhyZWFkIHNhZmUuCi0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7Ci0gICAgTE9HX0FQSSgibk9iakRlc3Ryb3lPT0IsIGNvbiglcCkgb2JqKCVwKSIsIGNvbiwgKHZvaWQgKilvYmopOwotICAgIHJzT2JqRGVzdHJveU9PQihjb24sICh2b2lkICopb2JqKTsKLX0KIAogc3RhdGljIGppbnQKLW5GaWxlT3BlbihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGpieXRlQXJyYXkgc3RyKQorbkZpbGVPcGVuKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamJ5dGVBcnJheSBzdHIpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgTE9HX0FQSSgibkZpbGVPcGVuLCBjb24oJXApIiwgY29uKTsKLQogICAgIGppbnQgbGVuID0gX2Vudi0+R2V0QXJyYXlMZW5ndGgoc3RyKTsKICAgICBqYnl0ZSAqIGNwdHIgPSAoamJ5dGUgKikgX2Vudi0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChzdHIsIDApOwogICAgIGppbnQgcmV0ID0gKGppbnQpcnNGaWxlT3Blbihjb24sIChjb25zdCBjaGFyICopY3B0ciwgbGVuKTsKQEAgLTE2NSw5ICsxNjgsOCBAQAogfQogCiBzdGF0aWMgdm9pZAotbkNvbnRleHRTZXRQcmlvcml0eShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgcCkKK25Db250ZXh0U2V0UHJpb3JpdHkoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IHApCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgTE9HX0FQSSgiQ29udGV4dFNldFByaW9yaXR5LCBjb24oJXApLCBwcmlvcml0eSglaSkiLCBjb24sIHApOwogICAgIHJzQ29udGV4dFNldFByaW9yaXR5KGNvbiwgcCk7CiB9CkBAIC0xNzUsNTggKzE3Nyw1MSBAQAogCiAKIHN0YXRpYyB2b2lkCi1uQ29udGV4dFNldFN1cmZhY2UoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IHdpZHRoLCBqaW50IGhlaWdodCwgam9iamVjdCB3bmQpCituQ29udGV4dFNldFN1cmZhY2UoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IHdpZHRoLCBqaW50IGhlaWdodCwgam9iamVjdCB3bmQpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgTE9HX0FQSSgibkNvbnRleHRTZXRTdXJmYWNlLCBjb24oJXApLCB3aWR0aCglaSksIGhlaWdodCglaSksIHN1cmZhY2UoJXApIiwgY29uLCB3aWR0aCwgaGVpZ2h0LCAoU3VyZmFjZSAqKXduZCk7CiAKICAgICBTdXJmYWNlICogd2luZG93ID0gTlVMTDsKICAgICBpZiAod25kID09IE5VTEwpIHsKIAogICAgIH0gZWxzZSB7Ci0gICAgICAgIGpjbGFzcyBzdXJmYWNlX2NsYXNzID0gX2Vudi0+RmluZENsYXNzKCJhbmRyb2lkL3ZpZXcvU3VyZmFjZSIpOwotICAgICAgICBqZmllbGRJRCBzdXJmYWNlRmllbGRJRCA9IF9lbnYtPkdldEZpZWxkSUQoc3VyZmFjZV9jbGFzcywgQU5EUk9JRF9WSUVXX1NVUkZBQ0VfSk5JX0lELCAiSSIpOwotICAgICAgICB3aW5kb3cgPSAoU3VyZmFjZSopX2Vudi0+R2V0SW50RmllbGQod25kLCBzdXJmYWNlRmllbGRJRCk7CisgICAgICAgIHdpbmRvdyA9IChTdXJmYWNlKikgYW5kcm9pZF9TdXJmYWNlX2dldE5hdGl2ZVdpbmRvdyhfZW52LCB3bmQpLmdldCgpOwogICAgIH0KIAogICAgIHJzQ29udGV4dFNldFN1cmZhY2UoY29uLCB3aWR0aCwgaGVpZ2h0LCB3aW5kb3cpOwogfQogCiBzdGF0aWMgdm9pZAotbkNvbnRleHREZXN0cm95KEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBjb24pCituQ29udGV4dERlc3Ryb3koSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uKQogewotICAgIExPR19BUEkoIm5Db250ZXh0RGVzdHJveSwgY29uKCVwKSIsIChSc0NvbnRleHQpY29uKTsKLSAgICByc0NvbnRleHREZXN0cm95KChSc0NvbnRleHQpY29uKTsKKyAgICBMT0dfQVBJKCJuQ29udGV4dERlc3Ryb3ksIGNvbiglcCkiLCBjb24pOworICAgIHJzQ29udGV4dERlc3Ryb3koY29uKTsKIH0KIAogc3RhdGljIHZvaWQKLW5Db250ZXh0RHVtcChKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgYml0cykKK25Db250ZXh0RHVtcChKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgYml0cykKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKICAgICBMT0dfQVBJKCJuQ29udGV4dER1bXAsIGNvbiglcCkgIGJpdHMoJWkpIiwgKFJzQ29udGV4dCljb24sIGJpdHMpOwogICAgIHJzQ29udGV4dER1bXAoKFJzQ29udGV4dCljb24sIGJpdHMpOwogfQogCiBzdGF0aWMgdm9pZAotbkNvbnRleHRQYXVzZShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMpCituQ29udGV4dFBhdXNlKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbikKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKICAgICBMT0dfQVBJKCJuQ29udGV4dFBhdXNlLCBjb24oJXApIiwgY29uKTsKICAgICByc0NvbnRleHRQYXVzZShjb24pOwogfQogCiBzdGF0aWMgdm9pZAotbkNvbnRleHRSZXN1bWUoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzKQorbkNvbnRleHRSZXN1bWUoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIExPR19BUEkoIm5Db250ZXh0UmVzdW1lLCBjb24oJXApIiwgY29uKTsKICAgICByc0NvbnRleHRSZXN1bWUoY29uKTsKIH0KIAogc3RhdGljIGppbnQKLW5Db250ZXh0R2V0TWVzc2FnZShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnRBcnJheSBkYXRhLCBqYm9vbGVhbiB3YWl0KQorbkNvbnRleHRHZXRNZXNzYWdlKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludEFycmF5IGRhdGEsIGpib29sZWFuIHdhaXQpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgamludCBsZW4gPSBfZW52LT5HZXRBcnJheUxlbmd0aChkYXRhKTsKICAgICBMT0dfQVBJKCJuQ29udGV4dEdldE1lc3NhZ2UsIGNvbiglcCksIGxlbiglaSkiLCBjb24sIGxlbik7CiAgICAgamludCAqcHRyID0gX2Vudi0+R2V0SW50QXJyYXlFbGVtZW50cyhkYXRhLCBOVUxMKTsKQEAgLTIzOSwzNCArMjM0LDMwIEBACiAgICAgcmV0dXJuIGlkOwogfQogCi1zdGF0aWMgdm9pZCBuQ29udGV4dEluaXRUb0NsaWVudChKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMpCitzdGF0aWMgdm9pZCBuQ29udGV4dEluaXRUb0NsaWVudChKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24pCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgTE9HX0FQSSgibkNvbnRleHRJbml0VG9DbGllbnQsIGNvbiglcCkiLCBjb24pOwogICAgIHJzQ29udGV4dEluaXRUb0NsaWVudChjb24pOwogfQogCi1zdGF0aWMgdm9pZCBuQ29udGV4dERlaW5pdFRvQ2xpZW50KEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcykKK3N0YXRpYyB2b2lkIG5Db250ZXh0RGVpbml0VG9DbGllbnQoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIExPR19BUEkoIm5Db250ZXh0RGVpbml0VG9DbGllbnQsIGNvbiglcCkiLCBjb24pOwogICAgIHJzQ29udGV4dERlaW5pdFRvQ2xpZW50KGNvbik7CiB9CiAKIAogc3RhdGljIGppbnQKLW5FbGVtZW50Q3JlYXRlKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCB0eXBlLCBqaW50IGtpbmQsIGpib29sZWFuIG5vcm0sIGppbnQgc2l6ZSkKK25FbGVtZW50Q3JlYXRlKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCB0eXBlLCBqaW50IGtpbmQsIGpib29sZWFuIG5vcm0sIGppbnQgc2l6ZSkKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKICAgICBMT0dfQVBJKCJuRWxlbWVudENyZWF0ZSwgY29uKCVwKSwgdHlwZSglaSksIGtpbmQoJWkpLCBub3JtKCVpKSwgc2l6ZSglaSkiLCBjb24sIHR5cGUsIGtpbmQsIG5vcm0sIHNpemUpOwogICAgIHJldHVybiAoamludClyc0VsZW1lbnRDcmVhdGUoY29uLCAoUnNEYXRhVHlwZSl0eXBlLCAoUnNEYXRhS2luZClraW5kLCBub3JtLCBzaXplKTsKIH0KIAogc3RhdGljIGppbnQKLW5FbGVtZW50Q3JlYXRlMihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnRBcnJheSBfaWRzLCBqb2JqZWN0QXJyYXkgX25hbWVzKQorbkVsZW1lbnRDcmVhdGUyKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludEFycmF5IF9pZHMsIGpvYmplY3RBcnJheSBfbmFtZXMpCiB7CiAgICAgaW50IGZpZWxkQ291bnQgPSBfZW52LT5HZXRBcnJheUxlbmd0aChfaWRzKTsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKICAgICBMT0dfQVBJKCJuRWxlbWVudENyZWF0ZTIsIGNvbiglcCkiLCBjb24pOwogCiAgICAgamludCAqaWRzID0gX2Vudi0+R2V0SW50QXJyYXlFbGVtZW50cyhfaWRzLCBOVUxMKTsKQEAgLTI4OSwzMiArMjgwLDg1IEBACiAgICAgcmV0dXJuIChqaW50KWlkOwogfQogCitzdGF0aWMgdm9pZAorbkVsZW1lbnRHZXROYXRpdmVEYXRhKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBpZCwgamludEFycmF5IF9lbGVtZW50RGF0YSkKK3sKKyAgICBpbnQgZGF0YVNpemUgPSBfZW52LT5HZXRBcnJheUxlbmd0aChfZWxlbWVudERhdGEpOworICAgIExPR19BUEkoIm5FbGVtZW50R2V0TmF0aXZlRGF0YSwgY29uKCVwKSIsIGNvbik7CisKKyAgICAvLyB3ZSB3aWxsIHBhY2sgbVR5cGU7IG1LaW5kOyBtTm9ybWFsaXplZDsgbVZlY3RvclNpemU7IE51bVN1YkVsZW1lbnRzCisgICAgYXNzZXJ0KGRhdGFTaXplID09IDUpOworCisgICAgdWludDMyX3QgZWxlbWVudERhdGFbNV07CisgICAgcnNFbGVtZW50R2V0TmF0aXZlRGF0YShjb24sIChSc0VsZW1lbnQpaWQsIGVsZW1lbnREYXRhLCBkYXRhU2l6ZSk7CisKKyAgICBmb3IoamludCBpID0gMDsgaSA8IGRhdGFTaXplOyBpICsrKSB7CisgICAgICAgIF9lbnYtPlNldEludEFycmF5UmVnaW9uKF9lbGVtZW50RGF0YSwgaSwgMSwgKGNvbnN0IGppbnQqKSZlbGVtZW50RGF0YVtpXSk7CisgICAgfQorfQorCisKK3N0YXRpYyB2b2lkCituRWxlbWVudEdldFN1YkVsZW1lbnRzKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBpZCwgamludEFycmF5IF9JRHMsIGpvYmplY3RBcnJheSBfbmFtZXMpCit7CisgICAgaW50IGRhdGFTaXplID0gX2Vudi0+R2V0QXJyYXlMZW5ndGgoX0lEcyk7CisgICAgTE9HX0FQSSgibkVsZW1lbnRHZXRTdWJFbGVtZW50cywgY29uKCVwKSIsIGNvbik7CisKKyAgICB1aW50MzJfdCAqaWRzID0gKHVpbnQzMl90ICopbWFsbG9jKCh1aW50MzJfdClkYXRhU2l6ZSAqIHNpemVvZih1aW50MzJfdCkpOworICAgIGNvbnN0IGNoYXIgKipuYW1lcyA9IChjb25zdCBjaGFyICoqKW1hbGxvYygodWludDMyX3QpZGF0YVNpemUgKiBzaXplb2YoY29uc3QgY2hhciAqKSk7CisKKyAgICByc0VsZW1lbnRHZXRTdWJFbGVtZW50cyhjb24sIChSc0VsZW1lbnQpaWQsIGlkcywgbmFtZXMsICh1aW50MzJfdClkYXRhU2l6ZSk7CisKKyAgICBmb3IoamludCBpID0gMDsgaSA8IGRhdGFTaXplOyBpICsrKSB7CisgICAgICAgIF9lbnYtPlNldE9iamVjdEFycmF5RWxlbWVudChfbmFtZXMsIGksIF9lbnYtPk5ld1N0cmluZ1VURihuYW1lc1tpXSkpOworICAgICAgICBfZW52LT5TZXRJbnRBcnJheVJlZ2lvbihfSURzLCBpLCAxLCAoY29uc3QgamludCopJmlkc1tpXSk7CisgICAgfQorCisgICAgZnJlZShpZHMpOworICAgIGZyZWUobmFtZXMpOworfQorCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBzdGF0aWMgdm9pZAotblR5cGVCZWdpbihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgZUlEKQorblR5cGVCZWdpbihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgZUlEKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIExPR19BUEkoIm5UeXBlQmVnaW4sIGNvbiglcCkgZSglcCkiLCBjb24sIChSc0VsZW1lbnQpZUlEKTsKICAgICByc1R5cGVCZWdpbihjb24sIChSc0VsZW1lbnQpZUlEKTsKIH0KIAogc3RhdGljIHZvaWQKLW5UeXBlQWRkKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBkaW0sIGppbnQgdmFsKQorblR5cGVBZGQoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IGRpbSwgamludCB2YWwpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgTE9HX0FQSSgiblR5cGVBZGQsIGNvbiglcCkgZGltKCVpKSwgdmFsKCVpKSIsIGNvbiwgZGltLCB2YWwpOwogICAgIHJzVHlwZUFkZChjb24sIChSc0RpbWVuc2lvbilkaW0sIHZhbCk7CiB9CiAKIHN0YXRpYyBqaW50Ci1uVHlwZUNyZWF0ZShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMpCituVHlwZUNyZWF0ZShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24pCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgTE9HX0FQSSgiblR5cGVDcmVhdGUsIGNvbiglcCkiLCBjb24pOwogICAgIHJldHVybiAoamludClyc1R5cGVDcmVhdGUoY29uKTsKIH0KIAorc3RhdGljIHZvaWQKK25UeXBlR2V0TmF0aXZlRGF0YShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgaWQsIGppbnRBcnJheSBfdHlwZURhdGEpCit7CisgICAgLy8gV2UgYXJlIHBhY2tpbmcgNiBpdGVtczogbURpbVg7IG1EaW1ZOyBtRGltWjsKKyAgICAvLyBtRGltTE9EOyBtRGltRmFjZXM7IG1FbGVtZW50OyBpbnRvIHR5cGVEYXRhCisgICAgaW50IGVsZW1lbnRDb3VudCA9IF9lbnYtPkdldEFycmF5TGVuZ3RoKF90eXBlRGF0YSk7CisKKyAgICBhc3NlcnQoZWxlbWVudENvdW50ID09IDYpOworICAgIExPR19BUEkoIm5UeXBlQ3JlYXRlLCBjb24oJXApIiwgY29uKTsKKworICAgIHVpbnQzMl90IHR5cGVEYXRhWzZdOworICAgIHJzVHlwZUdldE5hdGl2ZURhdGEoY29uLCAoUnNUeXBlKWlkLCB0eXBlRGF0YSwgNik7CisKKyAgICBmb3IoamludCBpID0gMDsgaSA8IGVsZW1lbnRDb3VudDsgaSArKykgeworICAgICAgICBfZW52LT5TZXRJbnRBcnJheVJlZ2lvbihfdHlwZURhdGEsIGksIDEsIChjb25zdCBqaW50KikmdHlwZURhdGFbaV0pOworICAgIH0KK30KKwogc3RhdGljIHZvaWQgKiBTRl9Mb2FkSW50KEpOSUVudiAqX2Vudiwgam9iamVjdCBfb2JqLCBqZmllbGRJRCBfZmllbGQsIHZvaWQgKmJ1ZmZlcikKIHsKICAgICAoKGludDMyX3QgKilidWZmZXIpWzBdID0gX2Vudi0+R2V0SW50RmllbGQoX29iaiwgX2ZpZWxkKTsKQEAgLTM3OCw3ICs0MjIsNyBAQAogCiAvL3siblR5cGVGaW5hbERlc3Ryb3kiLCAgICAgICAgICAgICAgIihMYW5kcm9pZC9yZW5kZXJzY3JpcHQvVHlwZTspViIsICAgICAgICh2b2lkKiluVHlwZUZpbmFsRGVzdHJveSB9LAogc3RhdGljIHZvaWQKLW5UeXBlRmluYWxEZXN0cm95KEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgam9iamVjdCBfdHlwZSkKK25UeXBlRmluYWxEZXN0cm95KEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgam9iamVjdCBfdHlwZSkKIHsKICAgICBUeXBlQ2FjaGUgKnRjID0gKFR5cGVDYWNoZSAqKV9lbnYtPkdldEludEZpZWxkKF90eXBlLCBnVHlwZU5hdGl2ZUNhY2hlKTsKICAgICBmcmVlKHRjKTsKQEAgLTM4Niw3ICs0MzAsNyBAQAogCiAvLyBuYXRpdmUgdm9pZCBuVHlwZVNldHVwRmllbGRzKFR5cGUgdCwgaW50W10gdHlwZXMsIGludFtdIGJpdHMsIEZpZWxkW10gSURzKTsKIHN0YXRpYyB2b2lkCi1uVHlwZVNldHVwRmllbGRzKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgam9iamVjdCBfdHlwZSwgamludEFycmF5IF90eXBlcywgamludEFycmF5IF9iaXRzLCBqb2JqZWN0QXJyYXkgX0lEcykKK25UeXBlU2V0dXBGaWVsZHMoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqb2JqZWN0IF90eXBlLCBqaW50QXJyYXkgX3R5cGVzLCBqaW50QXJyYXkgX2JpdHMsIGpvYmplY3RBcnJheSBfSURzKQogewogICAgIGludCBmaWVsZENvdW50ID0gX2Vudi0+R2V0QXJyYXlMZW5ndGgoX3R5cGVzKTsKICAgICBzaXplX3Qgc3RydWN0U2l6ZSA9IHNpemVvZihUeXBlQ2FjaGUpICsgKHNpemVvZihUeXBlRmllbGRDYWNoZSkgKiAoZmllbGRDb3VudC0xKSk7CkBAIC00MzYsMjUgKzQ4MCwyMiBAQAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogc3RhdGljIGppbnQKLW5BbGxvY2F0aW9uQ3JlYXRlVHlwZWQoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IGUpCituQWxsb2NhdGlvbkNyZWF0ZVR5cGVkKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBlKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIExPR19BUEkoIm5BbGxvY2F0aW9uQ3JlYXRlVHlwZWQsIGNvbiglcCksIGUoJXApIiwgY29uLCAoUnNFbGVtZW50KWUpOwogICAgIHJldHVybiAoamludCkgcnNBbGxvY2F0aW9uQ3JlYXRlVHlwZWQoY29uLCAoUnNFbGVtZW50KWUpOwogfQogCiBzdGF0aWMgdm9pZAotbkFsbG9jYXRpb25VcGxvYWRUb1RleHR1cmUoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IGEsIGpib29sZWFuIGdlbk1pcCwgamludCBtaXApCituQWxsb2NhdGlvblVwbG9hZFRvVGV4dHVyZShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgYSwgamJvb2xlYW4gZ2VuTWlwLCBqaW50IG1pcCkKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKICAgICBMT0dfQVBJKCJuQWxsb2NhdGlvblVwbG9hZFRvVGV4dHVyZSwgY29uKCVwKSwgYSglcCksIGdlbk1pcCglaSksIG1pcCglaSkiLCBjb24sIChSc0FsbG9jYXRpb24pYSwgZ2VuTWlwLCBtaXApOwogICAgIHJzQWxsb2NhdGlvblVwbG9hZFRvVGV4dHVyZShjb24sIChSc0FsbG9jYXRpb24pYSwgZ2VuTWlwLCBtaXApOwogfQogCiBzdGF0aWMgdm9pZAotbkFsbG9jYXRpb25VcGxvYWRUb0J1ZmZlck9iamVjdChKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgYSkKK25BbGxvY2F0aW9uVXBsb2FkVG9CdWZmZXJPYmplY3QoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IGEpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgTE9HX0FQSSgibkFsbG9jYXRpb25VcGxvYWRUb0J1ZmZlck9iamVjdCwgY29uKCVwKSwgYSglcCkiLCBjb24sIChSc0FsbG9jYXRpb24pYSk7CiAgICAgcnNBbGxvY2F0aW9uVXBsb2FkVG9CdWZmZXJPYmplY3QoY29uLCAoUnNBbGxvY2F0aW9uKWEpOwogfQpAQCAtNDgwLDkgKzUyMSw4IEBACiB9CiAKIHN0YXRpYyBpbnQKLW5BbGxvY2F0aW9uQ3JlYXRlRnJvbUJpdG1hcChKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgZHN0Rm10LCBqYm9vbGVhbiBnZW5NaXBzLCBqb2JqZWN0IGpiaXRtYXApCituQWxsb2NhdGlvbkNyZWF0ZUZyb21CaXRtYXAoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IGRzdEZtdCwgamJvb2xlYW4gZ2VuTWlwcywgam9iamVjdCBqYml0bWFwKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIFNrQml0bWFwIGNvbnN0ICogbmF0aXZlQml0bWFwID0KICAgICAgICAgICAgIChTa0JpdG1hcCBjb25zdCAqKV9lbnYtPkdldEludEZpZWxkKGpiaXRtYXAsIGdOYXRpdmVCaXRtYXBJRCk7CiAgICAgY29uc3QgU2tCaXRtYXAmIGJpdG1hcCgqbmF0aXZlQml0bWFwKTsKQEAgLTUwOCw5ICs1NDgsOCBAQAogfQogCiBzdGF0aWMgaW50Ci1uQWxsb2NhdGlvbkNyZWF0ZUJpdG1hcFJlZihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgdHlwZSwgam9iamVjdCBqYml0bWFwKQorbkFsbG9jYXRpb25DcmVhdGVCaXRtYXBSZWYoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IHR5cGUsIGpvYmplY3QgamJpdG1hcCkKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKICAgICBTa0JpdG1hcCAqIG5hdGl2ZUJpdG1hcCA9CiAgICAgICAgICAgICAoU2tCaXRtYXAgKilfZW52LT5HZXRJbnRGaWVsZChqYml0bWFwLCBnTmF0aXZlQml0bWFwSUQpOwogCkBAIC01MjIsMTAgKzU2MSw4IEBACiB9CiAKIHN0YXRpYyBpbnQKLW5BbGxvY2F0aW9uQ3JlYXRlRnJvbUFzc2V0U3RyZWFtKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBkc3RGbXQsIGpib29sZWFuIGdlbk1pcHMsIGppbnQgbmF0aXZlX2Fzc2V0KQorbkFsbG9jYXRpb25DcmVhdGVGcm9tQXNzZXRTdHJlYW0oSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IGRzdEZtdCwgamJvb2xlYW4gZ2VuTWlwcywgamludCBuYXRpdmVfYXNzZXQpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7Ci0KICAgICBBc3NldCogYXNzZXQgPSByZWludGVycHJldF9jYXN0PEFzc2V0Kj4obmF0aXZlX2Fzc2V0KTsKICAgICBTa0JpdG1hcCBiaXRtYXA7CiAgICAgU2tJbWFnZURlY29kZXI6OkRlY29kZU1lbW9yeShhc3NldC0+Z2V0QnVmZmVyKGZhbHNlKSwgYXNzZXQtPmdldExlbmd0aCgpLApAQCAtNTQ4LDkgKzU4NSw4IEBACiB9CiAKIHN0YXRpYyBpbnQKLW5BbGxvY2F0aW9uQ3JlYXRlRnJvbUJpdG1hcEJveGVkKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBkc3RGbXQsIGpib29sZWFuIGdlbk1pcHMsIGpvYmplY3QgamJpdG1hcCkKK25BbGxvY2F0aW9uQ3JlYXRlRnJvbUJpdG1hcEJveGVkKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBkc3RGbXQsIGpib29sZWFuIGdlbk1pcHMsIGpvYmplY3QgamJpdG1hcCkKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKICAgICBTa0JpdG1hcCBjb25zdCAqIG5hdGl2ZUJpdG1hcCA9CiAgICAgICAgICAgICAoU2tCaXRtYXAgY29uc3QgKilfZW52LT5HZXRJbnRGaWVsZChqYml0bWFwLCBnTmF0aXZlQml0bWFwSUQpOwogICAgIGNvbnN0IFNrQml0bWFwJiBiaXRtYXAoKm5hdGl2ZUJpdG1hcCk7CkBAIC01NzIsOSArNjA4LDggQEAKIAogCiBzdGF0aWMgdm9pZAotbkFsbG9jYXRpb25TdWJEYXRhMURfaShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgYWxsb2MsIGppbnQgb2Zmc2V0LCBqaW50IGNvdW50LCBqaW50QXJyYXkgZGF0YSwgaW50IHNpemVCeXRlcykKK25BbGxvY2F0aW9uU3ViRGF0YTFEX2koSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IGFsbG9jLCBqaW50IG9mZnNldCwgamludCBjb3VudCwgamludEFycmF5IGRhdGEsIGludCBzaXplQnl0ZXMpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgamludCBsZW4gPSBfZW52LT5HZXRBcnJheUxlbmd0aChkYXRhKTsKICAgICBMT0dfQVBJKCJuQWxsb2NhdGlvbjFEU3ViRGF0YV9pLCBjb24oJXApLCBhZGFwdGVyKCVwKSwgb2Zmc2V0KCVpKSwgY291bnQoJWkpLCBsZW4oJWkpLCBzaXplQnl0ZXMoJWkpIiwgY29uLCAoUnNBbGxvY2F0aW9uKWFsbG9jLCBvZmZzZXQsIGNvdW50LCBsZW4sIHNpemVCeXRlcyk7CiAgICAgamludCAqcHRyID0gX2Vudi0+R2V0SW50QXJyYXlFbGVtZW50cyhkYXRhLCBOVUxMKTsKQEAgLTU4Myw5ICs2MTgsOCBAQAogfQogCiBzdGF0aWMgdm9pZAotbkFsbG9jYXRpb25TdWJEYXRhMURfcyhKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgYWxsb2MsIGppbnQgb2Zmc2V0LCBqaW50IGNvdW50LCBqc2hvcnRBcnJheSBkYXRhLCBpbnQgc2l6ZUJ5dGVzKQorbkFsbG9jYXRpb25TdWJEYXRhMURfcyhKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgYWxsb2MsIGppbnQgb2Zmc2V0LCBqaW50IGNvdW50LCBqc2hvcnRBcnJheSBkYXRhLCBpbnQgc2l6ZUJ5dGVzKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIGppbnQgbGVuID0gX2Vudi0+R2V0QXJyYXlMZW5ndGgoZGF0YSk7CiAgICAgTE9HX0FQSSgibkFsbG9jYXRpb24xRFN1YkRhdGFfcywgY29uKCVwKSwgYWRhcHRlciglcCksIG9mZnNldCglaSksIGNvdW50KCVpKSwgbGVuKCVpKSwgc2l6ZUJ5dGVzKCVpKSIsIGNvbiwgKFJzQWxsb2NhdGlvbilhbGxvYywgb2Zmc2V0LCBjb3VudCwgbGVuLCBzaXplQnl0ZXMpOwogICAgIGpzaG9ydCAqcHRyID0gX2Vudi0+R2V0U2hvcnRBcnJheUVsZW1lbnRzKGRhdGEsIE5VTEwpOwpAQCAtNTk0LDkgKzYyOCw4IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1uQWxsb2NhdGlvblN1YkRhdGExRF9iKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBhbGxvYywgamludCBvZmZzZXQsIGppbnQgY291bnQsIGpieXRlQXJyYXkgZGF0YSwgaW50IHNpemVCeXRlcykKK25BbGxvY2F0aW9uU3ViRGF0YTFEX2IoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IGFsbG9jLCBqaW50IG9mZnNldCwgamludCBjb3VudCwgamJ5dGVBcnJheSBkYXRhLCBpbnQgc2l6ZUJ5dGVzKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIGppbnQgbGVuID0gX2Vudi0+R2V0QXJyYXlMZW5ndGgoZGF0YSk7CiAgICAgTE9HX0FQSSgibkFsbG9jYXRpb24xRFN1YkRhdGFfYiwgY29uKCVwKSwgYWRhcHRlciglcCksIG9mZnNldCglaSksIGNvdW50KCVpKSwgbGVuKCVpKSwgc2l6ZUJ5dGVzKCVpKSIsIGNvbiwgKFJzQWxsb2NhdGlvbilhbGxvYywgb2Zmc2V0LCBjb3VudCwgbGVuLCBzaXplQnl0ZXMpOwogICAgIGpieXRlICpwdHIgPSBfZW52LT5HZXRCeXRlQXJyYXlFbGVtZW50cyhkYXRhLCBOVUxMKTsKQEAgLTYwNSw5ICs2MzgsOCBAQAogfQogCiBzdGF0aWMgdm9pZAotbkFsbG9jYXRpb25TdWJEYXRhMURfZihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgYWxsb2MsIGppbnQgb2Zmc2V0LCBqaW50IGNvdW50LCBqZmxvYXRBcnJheSBkYXRhLCBpbnQgc2l6ZUJ5dGVzKQorbkFsbG9jYXRpb25TdWJEYXRhMURfZihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgYWxsb2MsIGppbnQgb2Zmc2V0LCBqaW50IGNvdW50LCBqZmxvYXRBcnJheSBkYXRhLCBpbnQgc2l6ZUJ5dGVzKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIGppbnQgbGVuID0gX2Vudi0+R2V0QXJyYXlMZW5ndGgoZGF0YSk7CiAgICAgTE9HX0FQSSgibkFsbG9jYXRpb24xRFN1YkRhdGFfZiwgY29uKCVwKSwgYWRhcHRlciglcCksIG9mZnNldCglaSksIGNvdW50KCVpKSwgbGVuKCVpKSwgc2l6ZUJ5dGVzKCVpKSIsIGNvbiwgKFJzQWxsb2NhdGlvbilhbGxvYywgb2Zmc2V0LCBjb3VudCwgbGVuLCBzaXplQnl0ZXMpOwogICAgIGpmbG9hdCAqcHRyID0gX2Vudi0+R2V0RmxvYXRBcnJheUVsZW1lbnRzKGRhdGEsIE5VTEwpOwpAQCAtNjE2LDkgKzY0OCw4IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1uQWxsb2NhdGlvblN1YkRhdGEyRF9pKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBhbGxvYywgamludCB4b2ZmLCBqaW50IHlvZmYsIGppbnQgdywgamludCBoLCBqaW50QXJyYXkgZGF0YSwgaW50IHNpemVCeXRlcykKK25BbGxvY2F0aW9uU3ViRGF0YTJEX2koSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IGFsbG9jLCBqaW50IHhvZmYsIGppbnQgeW9mZiwgamludCB3LCBqaW50IGgsIGppbnRBcnJheSBkYXRhLCBpbnQgc2l6ZUJ5dGVzKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIGppbnQgbGVuID0gX2Vudi0+R2V0QXJyYXlMZW5ndGgoZGF0YSk7CiAgICAgTE9HX0FQSSgibkFsbG9jYXRpb24yRFN1YkRhdGFfaSwgY29uKCVwKSwgYWRhcHRlciglcCksIHhvZmYoJWkpLCB5b2ZmKCVpKSwgdyglaSksIGgoJWkpLCBsZW4oJWkpIiwgY29uLCAoUnNBbGxvY2F0aW9uKWFsbG9jLCB4b2ZmLCB5b2ZmLCB3LCBoLCBsZW4pOwogICAgIGppbnQgKnB0ciA9IF9lbnYtPkdldEludEFycmF5RWxlbWVudHMoZGF0YSwgTlVMTCk7CkBAIC02MjcsOSArNjU4LDggQEAKIH0KIAogc3RhdGljIHZvaWQKLW5BbGxvY2F0aW9uU3ViRGF0YTJEX2YoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IGFsbG9jLCBqaW50IHhvZmYsIGppbnQgeW9mZiwgamludCB3LCBqaW50IGgsIGpmbG9hdEFycmF5IGRhdGEsIGludCBzaXplQnl0ZXMpCituQWxsb2NhdGlvblN1YkRhdGEyRF9mKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBhbGxvYywgamludCB4b2ZmLCBqaW50IHlvZmYsIGppbnQgdywgamludCBoLCBqZmxvYXRBcnJheSBkYXRhLCBpbnQgc2l6ZUJ5dGVzKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIGppbnQgbGVuID0gX2Vudi0+R2V0QXJyYXlMZW5ndGgoZGF0YSk7CiAgICAgTE9HX0FQSSgibkFsbG9jYXRpb24yRFN1YkRhdGFfaSwgY29uKCVwKSwgYWRhcHRlciglcCksIHhvZmYoJWkpLCB5b2ZmKCVpKSwgdyglaSksIGgoJWkpLCBsZW4oJWkpIiwgY29uLCAoUnNBbGxvY2F0aW9uKWFsbG9jLCB4b2ZmLCB5b2ZmLCB3LCBoLCBsZW4pOwogICAgIGpmbG9hdCAqcHRyID0gX2Vudi0+R2V0RmxvYXRBcnJheUVsZW1lbnRzKGRhdGEsIE5VTEwpOwpAQCAtNjM4LDkgKzY2OCw4IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1uQWxsb2NhdGlvblJlYWRfaShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgYWxsb2MsIGppbnRBcnJheSBkYXRhKQorbkFsbG9jYXRpb25SZWFkX2koSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IGFsbG9jLCBqaW50QXJyYXkgZGF0YSkKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKICAgICBqaW50IGxlbiA9IF9lbnYtPkdldEFycmF5TGVuZ3RoKGRhdGEpOwogICAgIExPR19BUEkoIm5BbGxvY2F0aW9uUmVhZF9pLCBjb24oJXApLCBhbGxvYyglcCksIGxlbiglaSkiLCBjb24sIChSc0FsbG9jYXRpb24pYWxsb2MsIGxlbik7CiAgICAgamludCAqcHRyID0gX2Vudi0+R2V0SW50QXJyYXlFbGVtZW50cyhkYXRhLCBOVUxMKTsKQEAgLTY0OSw5ICs2NzgsOCBAQAogfQogCiBzdGF0aWMgdm9pZAotbkFsbG9jYXRpb25SZWFkX2YoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IGFsbG9jLCBqZmxvYXRBcnJheSBkYXRhKQorbkFsbG9jYXRpb25SZWFkX2YoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IGFsbG9jLCBqZmxvYXRBcnJheSBkYXRhKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIGppbnQgbGVuID0gX2Vudi0+R2V0QXJyYXlMZW5ndGgoZGF0YSk7CiAgICAgTE9HX0FQSSgibkFsbG9jYXRpb25SZWFkX2YsIGNvbiglcCksIGFsbG9jKCVwKSwgbGVuKCVpKSIsIGNvbiwgKFJzQWxsb2NhdGlvbilhbGxvYywgbGVuKTsKICAgICBqZmxvYXQgKnB0ciA9IF9lbnYtPkdldEZsb2F0QXJyYXlFbGVtZW50cyhkYXRhLCBOVUxMKTsKQEAgLTY2Miw5ICs2OTAsOCBAQAogCiAvL3sibkFsbG9jYXRpb25EYXRhRnJvbU9iamVjdCIsICAgICAgIihJTGFuZHJvaWQvcmVuZGVyc2NyaXB0L1R5cGU7TGphdmEvbGFuZy9PYmplY3Q7KVYiLCAgICh2b2lkKiluQWxsb2NhdGlvbkRhdGFGcm9tT2JqZWN0IH0sCiBzdGF0aWMgdm9pZAotbkFsbG9jYXRpb25TdWJEYXRhRnJvbU9iamVjdChKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgYWxsb2MsIGpvYmplY3QgX3R5cGUsIGppbnQgb2Zmc2V0LCBqb2JqZWN0IF9vKQorbkFsbG9jYXRpb25TdWJEYXRhRnJvbU9iamVjdChKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgYWxsb2MsIGpvYmplY3QgX3R5cGUsIGppbnQgb2Zmc2V0LCBqb2JqZWN0IF9vKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIExPR19BUEkoIm5BbGxvY2F0aW9uRGF0YUZyb21PYmplY3QgY29uKCVwKSwgYWxsb2MoJXApIiwgY29uLCAoUnNBbGxvY2F0aW9uKWFsbG9jKTsKIAogICAgIGNvbnN0IFR5cGVDYWNoZSAqdGMgPSAoVHlwZUNhY2hlICopX2Vudi0+R2V0SW50RmllbGQoX3R5cGUsIGdUeXBlTmF0aXZlQ2FjaGUpOwpAQCAtNjgwLDkgKzcwNyw4IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1uQWxsb2NhdGlvblN1YlJlYWRGcm9tT2JqZWN0KEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBhbGxvYywgam9iamVjdCBfdHlwZSwgamludCBvZmZzZXQsIGpvYmplY3QgX28pCituQWxsb2NhdGlvblN1YlJlYWRGcm9tT2JqZWN0KEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBhbGxvYywgam9iamVjdCBfdHlwZSwgamludCBvZmZzZXQsIGpvYmplY3QgX28pCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgTE9HX0FQSSgibkFsbG9jYXRpb25SZWFkRnJvbU9iamVjdCBjb24oJXApLCBhbGxvYyglcCkiLCBjb24sIChSc0FsbG9jYXRpb24pYWxsb2MpOwogCiAgICAgYXNzZXJ0KG9mZnNldCA9PSAwKTsKQEAgLTcwMCwyOSArNzI2LDg5IEBACiAgICAgZnJlZShidWZBbGxvYyk7CiB9CiAKK3N0YXRpYyBqaW50CituQWxsb2NhdGlvbkdldFR5cGUoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IGEpCit7CisgICAgTE9HX0FQSSgibkFsbG9jYXRpb25HZXRUeXBlLCBjb24oJXApLCBhKCVwKSIsIGNvbiwgKFJzQWxsb2NhdGlvbilhKTsKKyAgICByZXR1cm4gKGppbnQpIHJzQWxsb2NhdGlvbkdldFR5cGUoY29uLCAoUnNBbGxvY2F0aW9uKWEpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgaW50CituRmlsZUEzRENyZWF0ZUZyb21Bc3NldFN0cmVhbShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgbmF0aXZlX2Fzc2V0KQoreworICAgIExPR1YoIl9fX19fX25GaWxlQTNEICV1IiwgKHVpbnQzMl90KSBuYXRpdmVfYXNzZXQpOworCisgICAgQXNzZXQqIGFzc2V0ID0gcmVpbnRlcnByZXRfY2FzdDxBc3NldCo+KG5hdGl2ZV9hc3NldCk7CisKKyAgICBqaW50IGlkID0gKGppbnQpcnNGaWxlQTNEQ3JlYXRlRnJvbUFzc2V0U3RyZWFtKGNvbiwgYXNzZXQtPmdldEJ1ZmZlcihmYWxzZSksIGFzc2V0LT5nZXRMZW5ndGgoKSk7CisgICAgcmV0dXJuIGlkOworfQorCitzdGF0aWMgaW50CituRmlsZUEzREdldE51bUluZGV4RW50cmllcyhKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgZmlsZUEzRCkKK3sKKyAgICBpbnQzMl90IG51bUVudHJpZXMgPSAwOworICAgIHJzRmlsZUEzREdldE51bUluZGV4RW50cmllcyhjb24sICZudW1FbnRyaWVzLCAoUnNGaWxlKWZpbGVBM0QpOworICAgIHJldHVybiBudW1FbnRyaWVzOworfQorCitzdGF0aWMgdm9pZAorbkZpbGVBM0RHZXRJbmRleEVudHJpZXMoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IGZpbGVBM0QsIGppbnQgbnVtRW50cmllcywgamludEFycmF5IF9pZHMsIGpvYmplY3RBcnJheSBfZW50cmllcykKK3sKKyAgICBMT0dWKCJfX19fX19uRmlsZUEzRCAldSIsICh1aW50MzJfdCkgZmlsZUEzRCk7CisgICAgUnNGaWxlSW5kZXhFbnRyeSAqZmlsZUVudHJpZXMgPSAoUnNGaWxlSW5kZXhFbnRyeSopbWFsbG9jKCh1aW50MzJfdCludW1FbnRyaWVzICogc2l6ZW9mKFJzRmlsZUluZGV4RW50cnkpKTsKKworICAgIHJzRmlsZUEzREdldEluZGV4RW50cmllcyhjb24sIGZpbGVFbnRyaWVzLCAodWludDMyX3QpbnVtRW50cmllcywgKFJzRmlsZSlmaWxlQTNEKTsKKworICAgIGZvcihqaW50IGkgPSAwOyBpIDwgbnVtRW50cmllczsgaSArKykgeworICAgICAgICBfZW52LT5TZXRPYmplY3RBcnJheUVsZW1lbnQoX2VudHJpZXMsIGksIF9lbnYtPk5ld1N0cmluZ1VURihmaWxlRW50cmllc1tpXS5vYmplY3ROYW1lKSk7CisgICAgICAgIF9lbnYtPlNldEludEFycmF5UmVnaW9uKF9pZHMsIGksIDEsIChjb25zdCBqaW50KikmZmlsZUVudHJpZXNbaV0uY2xhc3NJRCk7CisgICAgfQorCisgICAgZnJlZShmaWxlRW50cmllcyk7Cit9CisKK3N0YXRpYyBpbnQKK25GaWxlQTNER2V0RW50cnlCeUluZGV4KEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBmaWxlQTNELCBqaW50IGluZGV4KQoreworICAgIExPR1YoIl9fX19fX25GaWxlQTNEICV1IiwgKHVpbnQzMl90KSBmaWxlQTNEKTsKKyAgICBqaW50IGlkID0gKGppbnQpcnNGaWxlQTNER2V0RW50cnlCeUluZGV4KGNvbiwgKHVpbnQzMl90KWluZGV4LCAoUnNGaWxlKWZpbGVBM0QpOworICAgIHJldHVybiBpZDsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIGludAorbkZvbnRDcmVhdGVGcm9tRmlsZShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGpzdHJpbmcgZmlsZU5hbWUsIGppbnQgZm9udFNpemUsIGppbnQgZHBpKQoreworICAgIGNvbnN0IGNoYXIqIGZpbGVOYW1lVVRGID0gX2Vudi0+R2V0U3RyaW5nVVRGQ2hhcnMoZmlsZU5hbWUsIE5VTEwpOworCisgICAgamludCBpZCA9IChqaW50KXJzRm9udENyZWF0ZUZyb21GaWxlKGNvbiwgZmlsZU5hbWVVVEYsIGZvbnRTaXplLCBkcGkpOworICAgIHJldHVybiBpZDsKK30KKwogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBzdGF0aWMgdm9pZAotbkFkYXB0ZXIxREJpbmRBbGxvY2F0aW9uKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBhZGFwdGVyLCBqaW50IGFsbG9jKQorbkFkYXB0ZXIxREJpbmRBbGxvY2F0aW9uKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBhZGFwdGVyLCBqaW50IGFsbG9jKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIExPR19BUEkoIm5BZGFwdGVyMURCaW5kQWxsb2NhdGlvbiwgY29uKCVwKSwgYWRhcHRlciglcCksIGFsbG9jKCVwKSIsIGNvbiwgKFJzQWRhcHRlcjFEKWFkYXB0ZXIsIChSc0FsbG9jYXRpb24pYWxsb2MpOwogICAgIHJzQWRhcHRlcjFEQmluZEFsbG9jYXRpb24oY29uLCAoUnNBZGFwdGVyMUQpYWRhcHRlciwgKFJzQWxsb2NhdGlvbilhbGxvYyk7CiB9CiAKIHN0YXRpYyB2b2lkCi1uQWRhcHRlcjFEU2V0Q29uc3RyYWludChKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgYWRhcHRlciwgamludCBkaW0sIGppbnQgdmFsdWUpCituQWRhcHRlcjFEU2V0Q29uc3RyYWludChKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgYWRhcHRlciwgamludCBkaW0sIGppbnQgdmFsdWUpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgTE9HX0FQSSgibkFkYXB0ZXIxRFNldENvbnN0cmFpbnQsIGNvbiglcCksIGFkYXB0ZXIoJXApLCBkaW0oJWkpLCB2YWx1ZSglaSkiLCBjb24sIChSc0FkYXB0ZXIxRClhZGFwdGVyLCBkaW0sIHZhbHVlKTsKICAgICByc0FkYXB0ZXIxRFNldENvbnN0cmFpbnQoY29uLCAoUnNBZGFwdGVyMUQpYWRhcHRlciwgKFJzRGltZW5zaW9uKWRpbSwgdmFsdWUpOwogfQogCiBzdGF0aWMgdm9pZAotbkFkYXB0ZXIxRERhdGFfaShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgYWRhcHRlciwgamludEFycmF5IGRhdGEpCituQWRhcHRlcjFERGF0YV9pKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBhZGFwdGVyLCBqaW50QXJyYXkgZGF0YSkKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKICAgICBqaW50IGxlbiA9IF9lbnYtPkdldEFycmF5TGVuZ3RoKGRhdGEpOwogICAgIExPR19BUEkoIm5BZGFwdGVyMUREYXRhX2ksIGNvbiglcCksIGFkYXB0ZXIoJXApLCBsZW4oJWkpIiwgY29uLCAoUnNBZGFwdGVyMUQpYWRhcHRlciwgbGVuKTsKICAgICBqaW50ICpwdHIgPSBfZW52LT5HZXRJbnRBcnJheUVsZW1lbnRzKGRhdGEsIE5VTEwpOwpAQCAtNzMxLDkgKzgxNyw4IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1uQWRhcHRlcjFEU3ViRGF0YV9pKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBhZGFwdGVyLCBqaW50IG9mZnNldCwgamludCBjb3VudCwgamludEFycmF5IGRhdGEpCituQWRhcHRlcjFEU3ViRGF0YV9pKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBhZGFwdGVyLCBqaW50IG9mZnNldCwgamludCBjb3VudCwgamludEFycmF5IGRhdGEpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgamludCBsZW4gPSBfZW52LT5HZXRBcnJheUxlbmd0aChkYXRhKTsKICAgICBMT0dfQVBJKCJuQWRhcHRlcjFEU3ViRGF0YV9pLCBjb24oJXApLCBhZGFwdGVyKCVwKSwgb2Zmc2V0KCVpKSwgY291bnQoJWkpLCBsZW4oJWkpIiwgY29uLCAoUnNBZGFwdGVyMUQpYWRhcHRlciwgb2Zmc2V0LCBjb3VudCwgbGVuKTsKICAgICBqaW50ICpwdHIgPSBfZW52LT5HZXRJbnRBcnJheUVsZW1lbnRzKGRhdGEsIE5VTEwpOwpAQCAtNzQyLDkgKzgyNyw4IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1uQWRhcHRlcjFERGF0YV9mKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBhZGFwdGVyLCBqZmxvYXRBcnJheSBkYXRhKQorbkFkYXB0ZXIxRERhdGFfZihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgYWRhcHRlciwgamZsb2F0QXJyYXkgZGF0YSkKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKICAgICBqaW50IGxlbiA9IF9lbnYtPkdldEFycmF5TGVuZ3RoKGRhdGEpOwogICAgIExPR19BUEkoIm5BZGFwdGVyMUREYXRhX2YsIGNvbiglcCksIGFkYXB0ZXIoJXApLCBsZW4oJWkpIiwgY29uLCAoUnNBZGFwdGVyMUQpYWRhcHRlciwgbGVuKTsKICAgICBqZmxvYXQgKnB0ciA9IF9lbnYtPkdldEZsb2F0QXJyYXlFbGVtZW50cyhkYXRhLCBOVUxMKTsKQEAgLTc1Myw5ICs4MzcsOCBAQAogfQogCiBzdGF0aWMgdm9pZAotbkFkYXB0ZXIxRFN1YkRhdGFfZihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgYWRhcHRlciwgamludCBvZmZzZXQsIGppbnQgY291bnQsIGpmbG9hdEFycmF5IGRhdGEpCituQWRhcHRlcjFEU3ViRGF0YV9mKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBhZGFwdGVyLCBqaW50IG9mZnNldCwgamludCBjb3VudCwgamZsb2F0QXJyYXkgZGF0YSkKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKICAgICBqaW50IGxlbiA9IF9lbnYtPkdldEFycmF5TGVuZ3RoKGRhdGEpOwogICAgIExPR19BUEkoIm5BZGFwdGVyMURTdWJEYXRhX2YsIGNvbiglcCksIGFkYXB0ZXIoJXApLCBvZmZzZXQoJWkpLCBjb3VudCglaSksIGxlbiglaSkiLCBjb24sIChSc0FkYXB0ZXIxRClhZGFwdGVyLCBvZmZzZXQsIGNvdW50LCBsZW4pOwogICAgIGpmbG9hdCAqcHRyID0gX2Vudi0+R2V0RmxvYXRBcnJheUVsZW1lbnRzKGRhdGEsIE5VTEwpOwpAQCAtNzY0LDkgKzg0Nyw4IEBACiB9CiAKIHN0YXRpYyBqaW50Ci1uQWRhcHRlcjFEQ3JlYXRlKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcykKK25BZGFwdGVyMURDcmVhdGUoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIExPR19BUEkoIm5BZGFwdGVyMURDcmVhdGUsIGNvbiglcCkiLCBjb24pOwogICAgIHJldHVybiAoamludClyc0FkYXB0ZXIxRENyZWF0ZShjb24pOwogfQpAQCAtNzc0LDI1ICs4NTYsMjIgQEAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIHN0YXRpYyB2b2lkCi1uQWRhcHRlcjJEQmluZEFsbG9jYXRpb24oSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IGFkYXB0ZXIsIGppbnQgYWxsb2MpCituQWRhcHRlcjJEQmluZEFsbG9jYXRpb24oSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IGFkYXB0ZXIsIGppbnQgYWxsb2MpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgTE9HX0FQSSgibkFkYXB0ZXIyREJpbmRBbGxvY2F0aW9uLCBjb24oJXApLCBhZGFwdGVyKCVwKSwgYWxsb2MoJXApIiwgY29uLCAoUnNBZGFwdGVyMkQpYWRhcHRlciwgKFJzQWxsb2NhdGlvbilhbGxvYyk7CiAgICAgcnNBZGFwdGVyMkRCaW5kQWxsb2NhdGlvbihjb24sIChSc0FkYXB0ZXIyRClhZGFwdGVyLCAoUnNBbGxvY2F0aW9uKWFsbG9jKTsKIH0KIAogc3RhdGljIHZvaWQKLW5BZGFwdGVyMkRTZXRDb25zdHJhaW50KEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBhZGFwdGVyLCBqaW50IGRpbSwgamludCB2YWx1ZSkKK25BZGFwdGVyMkRTZXRDb25zdHJhaW50KEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBhZGFwdGVyLCBqaW50IGRpbSwgamludCB2YWx1ZSkKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKICAgICBMT0dfQVBJKCJuQWRhcHRlcjJEU2V0Q29uc3RyYWludCwgY29uKCVwKSwgYWRhcHRlciglcCksIGRpbSglaSksIHZhbHVlKCVpKSIsIGNvbiwgKFJzQWRhcHRlcjJEKWFkYXB0ZXIsIGRpbSwgdmFsdWUpOwogICAgIHJzQWRhcHRlcjJEU2V0Q29uc3RyYWludChjb24sIChSc0FkYXB0ZXIyRClhZGFwdGVyLCAoUnNEaW1lbnNpb24pZGltLCB2YWx1ZSk7CiB9CiAKIHN0YXRpYyB2b2lkCi1uQWRhcHRlcjJERGF0YV9pKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBhZGFwdGVyLCBqaW50QXJyYXkgZGF0YSkKK25BZGFwdGVyMkREYXRhX2koSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IGFkYXB0ZXIsIGppbnRBcnJheSBkYXRhKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIGppbnQgbGVuID0gX2Vudi0+R2V0QXJyYXlMZW5ndGgoZGF0YSk7CiAgICAgTE9HX0FQSSgibkFkYXB0ZXIyRERhdGFfaSwgY29uKCVwKSwgYWRhcHRlciglcCksIGxlbiglaSkiLCBjb24sIChSc0FkYXB0ZXIyRClhZGFwdGVyLCBsZW4pOwogICAgIGppbnQgKnB0ciA9IF9lbnYtPkdldEludEFycmF5RWxlbWVudHMoZGF0YSwgTlVMTCk7CkBAIC04MDEsOSArODgwLDggQEAKIH0KIAogc3RhdGljIHZvaWQKLW5BZGFwdGVyMkREYXRhX2YoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IGFkYXB0ZXIsIGpmbG9hdEFycmF5IGRhdGEpCituQWRhcHRlcjJERGF0YV9mKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBhZGFwdGVyLCBqZmxvYXRBcnJheSBkYXRhKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIGppbnQgbGVuID0gX2Vudi0+R2V0QXJyYXlMZW5ndGgoZGF0YSk7CiAgICAgTE9HX0FQSSgibkFkYXB0ZXIyRERhdGFfZiwgY29uKCVwKSwgYWRhcHRlciglcCksIGxlbiglaSkiLCBjb24sIChSc0FkYXB0ZXIyRClhZGFwdGVyLCBsZW4pOwogICAgIGpmbG9hdCAqcHRyID0gX2Vudi0+R2V0RmxvYXRBcnJheUVsZW1lbnRzKGRhdGEsIE5VTEwpOwpAQCAtODEyLDkgKzg5MCw4IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1uQWRhcHRlcjJEU3ViRGF0YV9pKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBhZGFwdGVyLCBqaW50IHhvZmYsIGppbnQgeW9mZiwgamludCB3LCBqaW50IGgsIGppbnRBcnJheSBkYXRhKQorbkFkYXB0ZXIyRFN1YkRhdGFfaShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgYWRhcHRlciwgamludCB4b2ZmLCBqaW50IHlvZmYsIGppbnQgdywgamludCBoLCBqaW50QXJyYXkgZGF0YSkKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKICAgICBqaW50IGxlbiA9IF9lbnYtPkdldEFycmF5TGVuZ3RoKGRhdGEpOwogICAgIExPR19BUEkoIm5BZGFwdGVyMkRTdWJEYXRhX2ksIGNvbiglcCksIGFkYXB0ZXIoJXApLCB4b2ZmKCVpKSwgeW9mZiglaSksIHcoJWkpLCBoKCVpKSwgbGVuKCVpKSIsCiAgICAgICAgICAgICBjb24sIChSc0FkYXB0ZXIyRClhZGFwdGVyLCB4b2ZmLCB5b2ZmLCB3LCBoLCBsZW4pOwpAQCAtODI0LDkgKzkwMSw4IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1uQWRhcHRlcjJEU3ViRGF0YV9mKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBhZGFwdGVyLCBqaW50IHhvZmYsIGppbnQgeW9mZiwgamludCB3LCBqaW50IGgsIGpmbG9hdEFycmF5IGRhdGEpCituQWRhcHRlcjJEU3ViRGF0YV9mKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBhZGFwdGVyLCBqaW50IHhvZmYsIGppbnQgeW9mZiwgamludCB3LCBqaW50IGgsIGpmbG9hdEFycmF5IGRhdGEpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgamludCBsZW4gPSBfZW52LT5HZXRBcnJheUxlbmd0aChkYXRhKTsKICAgICBMT0dfQVBJKCJuQWRhcHRlcjJEU3ViRGF0YV9mLCBjb24oJXApLCBhZGFwdGVyKCVwKSwgeG9mZiglaSksIHlvZmYoJWkpLCB3KCVpKSwgaCglaSksIGxlbiglaSkiLAogICAgICAgICAgICAgY29uLCAoUnNBZGFwdGVyMkQpYWRhcHRlciwgeG9mZiwgeW9mZiwgdywgaCwgbGVuKTsKQEAgLTgzNiw5ICs5MTIsOCBAQAogfQogCiBzdGF0aWMgamludAotbkFkYXB0ZXIyRENyZWF0ZShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMpCituQWRhcHRlcjJEQ3JlYXRlKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbikKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKICAgICBMT0dfQVBJKCJuQWRhcHRlcjJEQ3JlYXRlLCBjb24oJXApIiwgY29uKTsKICAgICByZXR1cm4gKGppbnQpcnNBZGFwdGVyMkRDcmVhdGUoY29uKTsKIH0KQEAgLTg0Niw0MSArOTIxLDQwIEBACiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBzdGF0aWMgdm9pZAotblNjcmlwdEJpbmRBbGxvY2F0aW9uKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBzY3JpcHQsIGppbnQgYWxsb2MsIGppbnQgc2xvdCkKK25TY3JpcHRCaW5kQWxsb2NhdGlvbihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgc2NyaXB0LCBqaW50IGFsbG9jLCBqaW50IHNsb3QpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgTE9HX0FQSSgiblNjcmlwdEJpbmRBbGxvY2F0aW9uLCBjb24oJXApLCBzY3JpcHQoJXApLCBhbGxvYyglcCksIHNsb3QoJWkpIiwgY29uLCAoUnNTY3JpcHQpc2NyaXB0LCAoUnNBbGxvY2F0aW9uKWFsbG9jLCBzbG90KTsKICAgICByc1NjcmlwdEJpbmRBbGxvY2F0aW9uKGNvbiwgKFJzU2NyaXB0KXNjcmlwdCwgKFJzQWxsb2NhdGlvbilhbGxvYywgc2xvdCk7CiB9CiAKIHN0YXRpYyB2b2lkCi1uU2NyaXB0U2V0Q2xlYXJDb2xvcihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgc2NyaXB0LCBqZmxvYXQgciwgamZsb2F0IGcsIGpmbG9hdCBiLCBqZmxvYXQgYSkKK25TY3JpcHRTZXRWYXJJKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBzY3JpcHQsIGppbnQgc2xvdCwgamludCB2YWwpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7Ci0gICAgTE9HX0FQSSgiblNjcmlwdFNldENsZWFyQ29sb3IsIGNvbiglcCksIHMoJXApLCByKCVmKSwgZyglZiksIGIoJWYpLCBhKCVmKSIsIGNvbiwgKHZvaWQgKilzY3JpcHQsIHIsIGcsIGIsIGEpOwotICAgIHJzU2NyaXB0U2V0Q2xlYXJDb2xvcihjb24sIChSc1NjcmlwdClzY3JpcHQsIHIsIGcsIGIsIGEpOworICAgIExPR19BUEkoIm5TY3JpcHRTZXRWYXJJLCBjb24oJXApLCBzKCVwKSwgc2xvdCglaSksIHZhbCglaSksIGIoJWYpLCBhKCVmKSIsIGNvbiwgKHZvaWQgKilzY3JpcHQsIHNsb3QsIHZhbCk7CisgICAgcnNTY3JpcHRTZXRWYXJJKGNvbiwgKFJzU2NyaXB0KXNjcmlwdCwgc2xvdCwgdmFsKTsKIH0KIAogc3RhdGljIHZvaWQKLW5TY3JpcHRTZXRDbGVhckRlcHRoKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBzY3JpcHQsIGpmbG9hdCBkKQorblNjcmlwdFNldFZhckYoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IHNjcmlwdCwgamludCBzbG90LCBmbG9hdCB2YWwpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7Ci0gICAgTE9HX0FQSSgiblNjcmlwdENTZXRDbGVhckRlcHRoLCBjb24oJXApLCBzKCVwKSwgZGVwdGgoJWYpIiwgY29uLCAodm9pZCAqKXNjcmlwdCwgZCk7Ci0gICAgcnNTY3JpcHRTZXRDbGVhckRlcHRoKGNvbiwgKFJzU2NyaXB0KXNjcmlwdCwgZCk7CisgICAgTE9HX0FQSSgiblNjcmlwdFNldFZhckksIGNvbiglcCksIHMoJXApLCBzbG90KCVpKSwgdmFsKCVpKSwgYiglZiksIGEoJWYpIiwgY29uLCAodm9pZCAqKXNjcmlwdCwgc2xvdCwgdmFsKTsKKyAgICByc1NjcmlwdFNldFZhckYoY29uLCAoUnNTY3JpcHQpc2NyaXB0LCBzbG90LCB2YWwpOwogfQogCiBzdGF0aWMgdm9pZAotblNjcmlwdFNldENsZWFyU3RlbmNpbChKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgc2NyaXB0LCBqaW50IHN0ZW5jaWwpCituU2NyaXB0U2V0VmFyVihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgc2NyaXB0LCBqaW50IHNsb3QsIGpieXRlQXJyYXkgZGF0YSkKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKLSAgICBMT0dfQVBJKCJuU2NyaXB0Q1NldENsZWFyU3RlbmNpbCwgY29uKCVwKSwgcyglcCksIHN0ZW5jaWwoJWkpIiwgY29uLCAodm9pZCAqKXNjcmlwdCwgc3RlbmNpbCk7Ci0gICAgcnNTY3JpcHRTZXRDbGVhclN0ZW5jaWwoY29uLCAoUnNTY3JpcHQpc2NyaXB0LCBzdGVuY2lsKTsKKyAgICBMT0dfQVBJKCJuU2NyaXB0U2V0VmFyViwgY29uKCVwKSwgcyglcCksIHNsb3QoJWkpIiwgY29uLCAodm9pZCAqKXNjcmlwdCwgc2xvdCk7CisgICAgamludCBsZW4gPSBfZW52LT5HZXRBcnJheUxlbmd0aChkYXRhKTsKKyAgICBqYnl0ZSAqcHRyID0gX2Vudi0+R2V0Qnl0ZUFycmF5RWxlbWVudHMoZGF0YSwgTlVMTCk7CisgICAgcnNTY3JpcHRTZXRWYXJWKGNvbiwgKFJzU2NyaXB0KXNjcmlwdCwgc2xvdCwgcHRyLCBsZW4pOworICAgIF9lbnYtPlJlbGVhc2VCeXRlQXJyYXlFbGVtZW50cyhkYXRhLCBwdHIsIEpOSV9BQk9SVCk7CiB9CiAKKwogc3RhdGljIHZvaWQKLW5TY3JpcHRTZXRUaW1lWm9uZShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgc2NyaXB0LCBqYnl0ZUFycmF5IHRpbWVab25lKQorblNjcmlwdFNldFRpbWVab25lKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBzY3JpcHQsIGpieXRlQXJyYXkgdGltZVpvbmUpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgTE9HX0FQSSgiblNjcmlwdENTZXRUaW1lWm9uZSwgY29uKCVwKSwgcyglcCksIHRpbWVab25lKCVzKSIsIGNvbiwgKHZvaWQgKilzY3JpcHQsIChjb25zdCBjaGFyICopdGltZVpvbmUpOwogCiAgICAgamludCBsZW5ndGggPSBfZW52LT5HZXRBcnJheUxlbmd0aCh0aW1lWm9uZSk7CkBAIC04OTUsNjYgKzk2OSwzNiBAQAogfQogCiBzdGF0aWMgdm9pZAotblNjcmlwdFNldFR5cGUoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IHR5cGUsIGpib29sZWFuIHdyaXRhYmxlLCBqc3RyaW5nIF9zdHIsIGppbnQgc2xvdCkKK25TY3JpcHRJbnZva2UoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IG9iaiwgamludCBzbG90KQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwotICAgIExPR19BUEkoIm5TY3JpcHRDQWRkVHlwZSwgY29uKCVwKSwgdHlwZSglcCksIHdyaXRhYmxlKCVpKSwgc2xvdCglaSkiLCBjb24sIChSc1R5cGUpdHlwZSwgd3JpdGFibGUsIHNsb3QpOwotICAgIGNvbnN0IGNoYXIqIG4gPSBOVUxMOwotICAgIGlmIChfc3RyKSB7Ci0gICAgICAgIG4gPSBfZW52LT5HZXRTdHJpbmdVVEZDaGFycyhfc3RyLCBOVUxMKTsKLSAgICB9Ci0gICAgcnNTY3JpcHRTZXRUeXBlKGNvbiwgKFJzVHlwZSl0eXBlLCBzbG90LCB3cml0YWJsZSwgbik7Ci0gICAgaWYgKG4pIHsKLSAgICAgICAgX2Vudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKF9zdHIsIG4pOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLW5TY3JpcHRTZXRJbnZva2UoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqc3RyaW5nIF9zdHIsIGppbnQgc2xvdCkKLXsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKLSAgICBMT0dfQVBJKCJuU2NyaXB0U2V0SW52b2tlLCBjb24oJXApIiwgY29uKTsKLSAgICBjb25zdCBjaGFyKiBuID0gTlVMTDsKLSAgICBpZiAoX3N0cikgewotICAgICAgICBuID0gX2Vudi0+R2V0U3RyaW5nVVRGQ2hhcnMoX3N0ciwgTlVMTCk7Ci0gICAgfQotICAgIHJzU2NyaXB0U2V0SW52b2tlKGNvbiwgbiwgc2xvdCk7Ci0gICAgaWYgKG4pIHsKLSAgICAgICAgX2Vudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKF9zdHIsIG4pOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLW5TY3JpcHRJbnZva2UoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IG9iaiwgamludCBzbG90KQotewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIExPR19BUEkoIm5TY3JpcHRJbnZva2UsIGNvbiglcCksIHNjcmlwdCglcCkiLCBjb24sICh2b2lkICopb2JqKTsKICAgICByc1NjcmlwdEludm9rZShjb24sIChSc1NjcmlwdClvYmosIHNsb3QpOwogfQogCiBzdGF0aWMgdm9pZAotblNjcmlwdFNldFJvb3QoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqYm9vbGVhbiBpc1Jvb3QpCituU2NyaXB0SW52b2tlVihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgc2NyaXB0LCBqaW50IHNsb3QsIGpieXRlQXJyYXkgZGF0YSkKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKLSAgICBMT0dfQVBJKCJuU2NyaXB0Q1NldFJvb3QsIGNvbiglcCksIGlzUm9vdCglaSkiLCBjb24sIGlzUm9vdCk7Ci0gICAgcnNTY3JpcHRTZXRSb290KGNvbiwgaXNSb290KTsKKyAgICBMT0dfQVBJKCJuU2NyaXB0SW52b2tlViwgY29uKCVwKSwgcyglcCksIHNsb3QoJWkpIiwgY29uLCAodm9pZCAqKXNjcmlwdCwgc2xvdCk7CisgICAgamludCBsZW4gPSBfZW52LT5HZXRBcnJheUxlbmd0aChkYXRhKTsKKyAgICBqYnl0ZSAqcHRyID0gX2Vudi0+R2V0Qnl0ZUFycmF5RWxlbWVudHMoZGF0YSwgTlVMTCk7CisgICAgcnNTY3JpcHRJbnZva2VWKGNvbiwgKFJzU2NyaXB0KXNjcmlwdCwgc2xvdCwgcHRyLCBsZW4pOworICAgIF9lbnYtPlJlbGVhc2VCeXRlQXJyYXlFbGVtZW50cyhkYXRhLCBwdHIsIEpOSV9BQk9SVCk7CiB9CiAKKwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogc3RhdGljIHZvaWQKLW5TY3JpcHRDQmVnaW4oSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzKQorblNjcmlwdENCZWdpbihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24pCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgTE9HX0FQSSgiblNjcmlwdENCZWdpbiwgY29uKCVwKSIsIGNvbik7CiAgICAgcnNTY3JpcHRDQmVnaW4oY29uKTsKIH0KIAogc3RhdGljIHZvaWQKLW5TY3JpcHRDU2V0U2NyaXB0KEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamJ5dGVBcnJheSBzY3JpcHRSZWYsCituU2NyaXB0Q1NldFNjcmlwdChKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGpieXRlQXJyYXkgc2NyaXB0UmVmLAogICAgICAgICAgICAgICAgICAgamludCBvZmZzZXQsIGppbnQgbGVuZ3RoKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIExPR19BUEkoIiEhISBuU2NyaXB0Q1NldFNjcmlwdCwgY29uKCVwKSIsIGNvbik7CiAgICAgamludCBfZXhjZXB0aW9uID0gMDsKICAgICBqaW50IHJlbWFpbmluZzsKQEAgLTk5NSwxMTQgKzEwMzksODIgQEAKIH0KIAogc3RhdGljIGppbnQKLW5TY3JpcHRDQ3JlYXRlKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcykKK25TY3JpcHRDQ3JlYXRlKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbikKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKICAgICBMT0dfQVBJKCJuU2NyaXB0Q0NyZWF0ZSwgY29uKCVwKSIsIGNvbik7CiAgICAgcmV0dXJuIChqaW50KXJzU2NyaXB0Q0NyZWF0ZShjb24pOwogfQogCi1zdGF0aWMgdm9pZAotblNjcmlwdENBZGREZWZpbmVJMzIoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqc3RyaW5nIG5hbWUsIGppbnQgdmFsdWUpCi17Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7Ci0gICAgY29uc3QgY2hhciogbiA9IF9lbnYtPkdldFN0cmluZ1VURkNoYXJzKG5hbWUsIE5VTEwpOwotICAgIExPR19BUEkoIm5TY3JpcHRDQWRkRGVmaW5lSTMyLCBjb24oJXApIG5hbWUoJXMpIHZhbHVlKCVkKSIsIGNvbiwgbiwgdmFsdWUpOwotICAgIHJzU2NyaXB0Q1NldERlZmluZUkzMihjb24sIG4sIHZhbHVlKTsKLSAgICBfZW52LT5SZWxlYXNlU3RyaW5nVVRGQ2hhcnMobmFtZSwgbik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1uU2NyaXB0Q0FkZERlZmluZUYoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqc3RyaW5nIG5hbWUsIGpmbG9hdCB2YWx1ZSkKLXsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKLSAgICBjb25zdCBjaGFyKiBuID0gX2Vudi0+R2V0U3RyaW5nVVRGQ2hhcnMobmFtZSwgTlVMTCk7Ci0gICAgTE9HX0FQSSgiblNjcmlwdENBZGREZWZpbmVGLCBjb24oJXApIG5hbWUoJXMpIHZhbHVlKCVmKSIsIGNvbiwgbiwgdmFsdWUpOwotICAgIHJzU2NyaXB0Q1NldERlZmluZUYoY29uLCBuLCB2YWx1ZSk7Ci0gICAgX2Vudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKG5hbWUsIG4pOwotfQotCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogc3RhdGljIHZvaWQKLW5Qcm9ncmFtRnJhZ21lbnRTdG9yZUJlZ2luKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBpbiwgamludCBvdXQpCituUHJvZ3JhbVN0b3JlQmVnaW4oSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IGluLCBqaW50IG91dCkKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKLSAgICBMT0dfQVBJKCJuUHJvZ3JhbUZyYWdtZW50U3RvcmVCZWdpbiwgY29uKCVwKSwgaW4oJXApLCBvdXQoJXApIiwgY29uLCAoUnNFbGVtZW50KWluLCAoUnNFbGVtZW50KW91dCk7Ci0gICAgcnNQcm9ncmFtRnJhZ21lbnRTdG9yZUJlZ2luKGNvbiwgKFJzRWxlbWVudClpbiwgKFJzRWxlbWVudClvdXQpOworICAgIExPR19BUEkoIm5Qcm9ncmFtU3RvcmVCZWdpbiwgY29uKCVwKSwgaW4oJXApLCBvdXQoJXApIiwgY29uLCAoUnNFbGVtZW50KWluLCAoUnNFbGVtZW50KW91dCk7CisgICAgcnNQcm9ncmFtU3RvcmVCZWdpbihjb24sIChSc0VsZW1lbnQpaW4sIChSc0VsZW1lbnQpb3V0KTsKIH0KIAogc3RhdGljIHZvaWQKLW5Qcm9ncmFtRnJhZ21lbnRTdG9yZURlcHRoRnVuYyhKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgZnVuYykKK25Qcm9ncmFtU3RvcmVEZXB0aEZ1bmMoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IGZ1bmMpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7Ci0gICAgTE9HX0FQSSgiblByb2dyYW1GcmFnbWVudFN0b3JlRGVwdGhGdW5jLCBjb24oJXApLCBmdW5jKCVpKSIsIGNvbiwgZnVuYyk7Ci0gICAgcnNQcm9ncmFtRnJhZ21lbnRTdG9yZURlcHRoRnVuYyhjb24sIChSc0RlcHRoRnVuYylmdW5jKTsKKyAgICBMT0dfQVBJKCJuUHJvZ3JhbVN0b3JlRGVwdGhGdW5jLCBjb24oJXApLCBmdW5jKCVpKSIsIGNvbiwgZnVuYyk7CisgICAgcnNQcm9ncmFtU3RvcmVEZXB0aEZ1bmMoY29uLCAoUnNEZXB0aEZ1bmMpZnVuYyk7CiB9CiAKIHN0YXRpYyB2b2lkCi1uUHJvZ3JhbUZyYWdtZW50U3RvcmVEZXB0aE1hc2soSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqYm9vbGVhbiBlbmFibGUpCituUHJvZ3JhbVN0b3JlRGVwdGhNYXNrKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamJvb2xlYW4gZW5hYmxlKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwotICAgIExPR19BUEkoIm5Qcm9ncmFtRnJhZ21lbnRTdG9yZURlcHRoTWFzaywgY29uKCVwKSwgZW5hYmxlKCVpKSIsIGNvbiwgZW5hYmxlKTsKLSAgICByc1Byb2dyYW1GcmFnbWVudFN0b3JlRGVwdGhNYXNrKGNvbiwgZW5hYmxlKTsKKyAgICBMT0dfQVBJKCJuUHJvZ3JhbVN0b3JlRGVwdGhNYXNrLCBjb24oJXApLCBlbmFibGUoJWkpIiwgY29uLCBlbmFibGUpOworICAgIHJzUHJvZ3JhbVN0b3JlRGVwdGhNYXNrKGNvbiwgZW5hYmxlKTsKIH0KIAogc3RhdGljIHZvaWQKLW5Qcm9ncmFtRnJhZ21lbnRTdG9yZUNvbG9yTWFzayhKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGpib29sZWFuIHIsIGpib29sZWFuIGcsIGpib29sZWFuIGIsIGpib29sZWFuIGEpCituUHJvZ3JhbVN0b3JlQ29sb3JNYXNrKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamJvb2xlYW4gciwgamJvb2xlYW4gZywgamJvb2xlYW4gYiwgamJvb2xlYW4gYSkKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKLSAgICBMT0dfQVBJKCJuUHJvZ3JhbUZyYWdtZW50U3RvcmVDb2xvck1hc2ssIGNvbiglcCksIHIoJWkpLCBnKCVpKSwgYiglaSksIGEoJWkpIiwgY29uLCByLCBnLCBiLCBhKTsKLSAgICByc1Byb2dyYW1GcmFnbWVudFN0b3JlQ29sb3JNYXNrKGNvbiwgciwgZywgYiwgYSk7CisgICAgTE9HX0FQSSgiblByb2dyYW1TdG9yZUNvbG9yTWFzaywgY29uKCVwKSwgciglaSksIGcoJWkpLCBiKCVpKSwgYSglaSkiLCBjb24sIHIsIGcsIGIsIGEpOworICAgIHJzUHJvZ3JhbVN0b3JlQ29sb3JNYXNrKGNvbiwgciwgZywgYiwgYSk7CiB9CiAKIHN0YXRpYyB2b2lkCi1uUHJvZ3JhbUZyYWdtZW50U3RvcmVCbGVuZEZ1bmMoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBpbnQgc3JjLCBpbnQgZHN0KQorblByb2dyYW1TdG9yZUJsZW5kRnVuYyhKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGludCBzcmMsIGludCBkc3QpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7Ci0gICAgTE9HX0FQSSgiblByb2dyYW1GcmFnbWVudFN0b3JlQmxlbmRGdW5jLCBjb24oJXApLCBzcmMoJWkpLCBkc3QoJWkpIiwgY29uLCBzcmMsIGRzdCk7Ci0gICAgcnNQcm9ncmFtRnJhZ21lbnRTdG9yZUJsZW5kRnVuYyhjb24sIChSc0JsZW5kU3JjRnVuYylzcmMsIChSc0JsZW5kRHN0RnVuYylkc3QpOworICAgIExPR19BUEkoIm5Qcm9ncmFtU3RvcmVCbGVuZEZ1bmMsIGNvbiglcCksIHNyYyglaSksIGRzdCglaSkiLCBjb24sIHNyYywgZHN0KTsKKyAgICByc1Byb2dyYW1TdG9yZUJsZW5kRnVuYyhjb24sIChSc0JsZW5kU3JjRnVuYylzcmMsIChSc0JsZW5kRHN0RnVuYylkc3QpOwogfQogCiBzdGF0aWMgdm9pZAotblByb2dyYW1GcmFnbWVudFN0b3JlRGl0aGVyKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamJvb2xlYW4gZW5hYmxlKQorblByb2dyYW1TdG9yZURpdGhlcihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGpib29sZWFuIGVuYWJsZSkKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKLSAgICBMT0dfQVBJKCJuUHJvZ3JhbUZyYWdtZW50U3RvcmVEaXRoZXIsIGNvbiglcCksIGVuYWJsZSglaSkiLCBjb24sIGVuYWJsZSk7Ci0gICAgcnNQcm9ncmFtRnJhZ21lbnRTdG9yZURpdGhlcihjb24sIGVuYWJsZSk7CisgICAgTE9HX0FQSSgiblByb2dyYW1TdG9yZURpdGhlciwgY29uKCVwKSwgZW5hYmxlKCVpKSIsIGNvbiwgZW5hYmxlKTsKKyAgICByc1Byb2dyYW1TdG9yZURpdGhlcihjb24sIGVuYWJsZSk7CiB9CiAKIHN0YXRpYyBqaW50Ci1uUHJvZ3JhbUZyYWdtZW50U3RvcmVDcmVhdGUoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzKQorblByb2dyYW1TdG9yZUNyZWF0ZShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24pCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7Ci0gICAgTE9HX0FQSSgiblByb2dyYW1GcmFnbWVudFN0b3JlQ3JlYXRlLCBjb24oJXApIiwgY29uKTsKLQotICAgIHJldHVybiAoamludClyc1Byb2dyYW1GcmFnbWVudFN0b3JlQ3JlYXRlKGNvbik7CisgICAgTE9HX0FQSSgiblByb2dyYW1TdG9yZUNyZWF0ZSwgY29uKCVwKSIsIGNvbik7CisgICAgcmV0dXJuIChqaW50KXJzUHJvZ3JhbVN0b3JlQ3JlYXRlKGNvbik7CiB9CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBzdGF0aWMgdm9pZAotblByb2dyYW1CaW5kQ29uc3RhbnRzKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCB2cHYsIGppbnQgc2xvdCwgamludCBhKQorblByb2dyYW1CaW5kQ29uc3RhbnRzKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCB2cHYsIGppbnQgc2xvdCwgamludCBhKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIExPR19BUEkoIm5Qcm9ncmFtQmluZENvbnN0YW50cywgY29uKCVwKSwgdnBmKCVwKSwgc2xvYXQoJWkpLCBhKCVwKSIsIGNvbiwgKFJzUHJvZ3JhbVZlcnRleCl2cHYsIHNsb3QsIChSc0FsbG9jYXRpb24pYSk7CiAgICAgcnNQcm9ncmFtQmluZENvbnN0YW50cyhjb24sIChSc1Byb2dyYW0pdnB2LCBzbG90LCAoUnNBbGxvY2F0aW9uKWEpOwogfQogCiBzdGF0aWMgdm9pZAotblByb2dyYW1CaW5kVGV4dHVyZShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgdnBmLCBqaW50IHNsb3QsIGppbnQgYSkKK25Qcm9ncmFtQmluZFRleHR1cmUoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IHZwZiwgamludCBzbG90LCBqaW50IGEpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgTE9HX0FQSSgiblByb2dyYW1CaW5kVGV4dHVyZSwgY29uKCVwKSwgdnBmKCVwKSwgc2xvdCglaSksIGEoJXApIiwgY29uLCAoUnNQcm9ncmFtRnJhZ21lbnQpdnBmLCBzbG90LCAoUnNBbGxvY2F0aW9uKWEpOwogICAgIHJzUHJvZ3JhbUJpbmRUZXh0dXJlKGNvbiwgKFJzUHJvZ3JhbUZyYWdtZW50KXZwZiwgc2xvdCwgKFJzQWxsb2NhdGlvbilhKTsKIH0KIAogc3RhdGljIHZvaWQKLW5Qcm9ncmFtQmluZFNhbXBsZXIoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IHZwZiwgamludCBzbG90LCBqaW50IGEpCituUHJvZ3JhbUJpbmRTYW1wbGVyKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCB2cGYsIGppbnQgc2xvdCwgamludCBhKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIExPR19BUEkoIm5Qcm9ncmFtQmluZFNhbXBsZXIsIGNvbiglcCksIHZwZiglcCksIHNsb3QoJWkpLCBhKCVwKSIsIGNvbiwgKFJzUHJvZ3JhbUZyYWdtZW50KXZwZiwgc2xvdCwgKFJzU2FtcGxlcilhKTsKICAgICByc1Byb2dyYW1CaW5kU2FtcGxlcihjb24sIChSc1Byb2dyYW1GcmFnbWVudCl2cGYsIHNsb3QsIChSc1NhbXBsZXIpYSk7CiB9CkBAIC0xMTEwLDkgKzExMjIsOCBAQAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIHN0YXRpYyBqaW50Ci1uUHJvZ3JhbUZyYWdtZW50Q3JlYXRlKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludEFycmF5IHBhcmFtcykKK25Qcm9ncmFtRnJhZ21lbnRDcmVhdGUoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50QXJyYXkgcGFyYW1zKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIGppbnQgKnBhcmFtUHRyID0gX2Vudi0+R2V0SW50QXJyYXlFbGVtZW50cyhwYXJhbXMsIE5VTEwpOwogICAgIGppbnQgcGFyYW1MZW4gPSBfZW52LT5HZXRBcnJheUxlbmd0aChwYXJhbXMpOwogCkBAIC0xMTI0LDkgKzExMzUsOCBAQAogfQogCiBzdGF0aWMgamludAotblByb2dyYW1GcmFnbWVudENyZWF0ZTIoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqc3RyaW5nIHNoYWRlciwgamludEFycmF5IHBhcmFtcykKK25Qcm9ncmFtRnJhZ21lbnRDcmVhdGUyKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwganN0cmluZyBzaGFkZXIsIGppbnRBcnJheSBwYXJhbXMpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgY29uc3QgY2hhciogc2hhZGVyVVRGID0gX2Vudi0+R2V0U3RyaW5nVVRGQ2hhcnMoc2hhZGVyLCBOVUxMKTsKICAgICBqaW50IHNoYWRlckxlbiA9IF9lbnYtPkdldFN0cmluZ1VURkxlbmd0aChzaGFkZXIpOwogICAgIGppbnQgKnBhcmFtUHRyID0gX2Vudi0+R2V0SW50QXJyYXlFbGVtZW50cyhwYXJhbXMsIE5VTEwpOwpAQCAtMTE0NCwxNyArMTE1NCwxNSBAQAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIHN0YXRpYyBqaW50Ci1uUHJvZ3JhbVZlcnRleENyZWF0ZShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGpib29sZWFuIHRleE1hdCkKK25Qcm9ncmFtVmVydGV4Q3JlYXRlKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamJvb2xlYW4gdGV4TWF0KQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIExPR19BUEkoIm5Qcm9ncmFtVmVydGV4Q3JlYXRlLCBjb24oJXApLCB0ZXhNYXQoJWkpIiwgY29uLCB0ZXhNYXQpOwogICAgIHJldHVybiAoamludClyc1Byb2dyYW1WZXJ0ZXhDcmVhdGUoY29uLCB0ZXhNYXQpOwogfQogCiBzdGF0aWMgamludAotblByb2dyYW1WZXJ0ZXhDcmVhdGUyKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywganN0cmluZyBzaGFkZXIsIGppbnRBcnJheSBwYXJhbXMpCituUHJvZ3JhbVZlcnRleENyZWF0ZTIoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqc3RyaW5nIHNoYWRlciwgamludEFycmF5IHBhcmFtcykKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKICAgICBjb25zdCBjaGFyKiBzaGFkZXJVVEYgPSBfZW52LT5HZXRTdHJpbmdVVEZDaGFycyhzaGFkZXIsIE5VTEwpOwogICAgIGppbnQgc2hhZGVyTGVuID0gX2Vudi0+R2V0U3RyaW5nVVRGTGVuZ3RoKHNoYWRlcik7CiAgICAgamludCAqcGFyYW1QdHIgPSBfZW52LT5HZXRJbnRBcnJheUVsZW1lbnRzKHBhcmFtcywgTlVMTCk7CkBAIC0xMTcxLDcwICsxMTc5LDYxIEBACiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogc3RhdGljIGppbnQKLW5Qcm9ncmFtUmFzdGVyQ3JlYXRlKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBpbiwgamludCBvdXQsCi0gICAgICAgICAgICAgICAgICAgICBqYm9vbGVhbiBwb2ludFNtb290aCwgamJvb2xlYW4gbGluZVNtb290aCwgamJvb2xlYW4gcG9pbnRTcHJpdGUpCituUHJvZ3JhbVJhc3RlckNyZWF0ZShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGpib29sZWFuIHBvaW50U21vb3RoLCBqYm9vbGVhbiBsaW5lU21vb3RoLCBqYm9vbGVhbiBwb2ludFNwcml0ZSkKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKLSAgICBMT0dfQVBJKCJuUHJvZ3JhbVJhc3RlckNyZWF0ZSwgY29uKCVwKSwgaW4oJXApLCBvdXQoJXApLCBwb2ludFNtb290aCglaSksIGxpbmVTbW9vdGgoJWkpLCBwb2ludFNwcml0ZSglaSkiLAotICAgICAgICAgICAgY29uLCAoUnNFbGVtZW50KWluLCAoUnNFbGVtZW50KW91dCwgcG9pbnRTbW9vdGgsIGxpbmVTbW9vdGgsIHBvaW50U3ByaXRlKTsKLSAgICByZXR1cm4gKGppbnQpcnNQcm9ncmFtUmFzdGVyQ3JlYXRlKGNvbiwgKFJzRWxlbWVudClpbiwgKFJzRWxlbWVudClvdXQsIHBvaW50U21vb3RoLCBsaW5lU21vb3RoLCBwb2ludFNwcml0ZSk7CisgICAgTE9HX0FQSSgiblByb2dyYW1SYXN0ZXJDcmVhdGUsIGNvbiglcCksIHBvaW50U21vb3RoKCVpKSwgbGluZVNtb290aCglaSksIHBvaW50U3ByaXRlKCVpKSIsCisgICAgICAgICAgICBjb24sIHBvaW50U21vb3RoLCBsaW5lU21vb3RoLCBwb2ludFNwcml0ZSk7CisgICAgcmV0dXJuIChqaW50KXJzUHJvZ3JhbVJhc3RlckNyZWF0ZShjb24sIHBvaW50U21vb3RoLCBsaW5lU21vb3RoLCBwb2ludFNwcml0ZSk7CiB9CiAKIHN0YXRpYyB2b2lkCi1uUHJvZ3JhbVJhc3RlclNldFBvaW50U2l6ZShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgdnByLCBqZmxvYXQgdikKK25Qcm9ncmFtUmFzdGVyU2V0TGluZVdpZHRoKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCB2cHIsIGpmbG9hdCB2KQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwotICAgIExPR19BUEkoIm5Qcm9ncmFtUmFzdGVyU2V0UG9pbnRTaXplLCBjb24oJXApLCB2cGYoJXApLCB2YWx1ZSglZikiLCBjb24sIChSc1Byb2dyYW1SYXN0ZXIpdnByLCB2KTsKLSAgICByc1Byb2dyYW1SYXN0ZXJTZXRQb2ludFNpemUoY29uLCAoUnNQcm9ncmFtRnJhZ21lbnQpdnByLCB2KTsKLX0KLQotc3RhdGljIHZvaWQKLW5Qcm9ncmFtUmFzdGVyU2V0TGluZVdpZHRoKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCB2cHIsIGpmbG9hdCB2KQotewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIExPR19BUEkoIm5Qcm9ncmFtUmFzdGVyU2V0TGluZVdpZHRoLCBjb24oJXApLCB2cGYoJXApLCB2YWx1ZSglZikiLCBjb24sIChSc1Byb2dyYW1SYXN0ZXIpdnByLCB2KTsKLSAgICByc1Byb2dyYW1SYXN0ZXJTZXRMaW5lV2lkdGgoY29uLCAoUnNQcm9ncmFtRnJhZ21lbnQpdnByLCB2KTsKKyAgICByc1Byb2dyYW1SYXN0ZXJTZXRMaW5lV2lkdGgoY29uLCAoUnNQcm9ncmFtUmFzdGVyKXZwciwgdik7Cit9CisKK3N0YXRpYyB2b2lkCituUHJvZ3JhbVJhc3RlclNldEN1bGxNb2RlKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCB2cHIsIGppbnQgdikKK3sKKyAgICBMT0dfQVBJKCJuUHJvZ3JhbVJhc3RlclNldEN1bGxNb2RlLCBjb24oJXApLCB2cGYoJXApLCB2YWx1ZSglaSkiLCBjb24sIChSc1Byb2dyYW1SYXN0ZXIpdnByLCB2KTsKKyAgICByc1Byb2dyYW1SYXN0ZXJTZXRDdWxsTW9kZShjb24sIChSc1Byb2dyYW1SYXN0ZXIpdnByLCAoUnNDdWxsTW9kZSl2KTsKIH0KIAogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogc3RhdGljIHZvaWQKLW5Db250ZXh0QmluZFJvb3RTY3JpcHQoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IHNjcmlwdCkKK25Db250ZXh0QmluZFJvb3RTY3JpcHQoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IHNjcmlwdCkKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKICAgICBMT0dfQVBJKCJuQ29udGV4dEJpbmRSb290U2NyaXB0LCBjb24oJXApLCBzY3JpcHQoJXApIiwgY29uLCAoUnNTY3JpcHQpc2NyaXB0KTsKICAgICByc0NvbnRleHRCaW5kUm9vdFNjcmlwdChjb24sIChSc1NjcmlwdClzY3JpcHQpOwogfQogCiBzdGF0aWMgdm9pZAotbkNvbnRleHRCaW5kUHJvZ3JhbUZyYWdtZW50U3RvcmUoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IHBmcykKK25Db250ZXh0QmluZFByb2dyYW1TdG9yZShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgcGZzKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwotICAgIExPR19BUEkoIm5Db250ZXh0QmluZFByb2dyYW1GcmFnbWVudFN0b3JlLCBjb24oJXApLCBwZnMoJXApIiwgY29uLCAoUnNQcm9ncmFtRnJhZ21lbnRTdG9yZSlwZnMpOwotICAgIHJzQ29udGV4dEJpbmRQcm9ncmFtRnJhZ21lbnRTdG9yZShjb24sIChSc1Byb2dyYW1GcmFnbWVudFN0b3JlKXBmcyk7CisgICAgTE9HX0FQSSgibkNvbnRleHRCaW5kUHJvZ3JhbVN0b3JlLCBjb24oJXApLCBwZnMoJXApIiwgY29uLCAoUnNQcm9ncmFtU3RvcmUpcGZzKTsKKyAgICByc0NvbnRleHRCaW5kUHJvZ3JhbVN0b3JlKGNvbiwgKFJzUHJvZ3JhbVN0b3JlKXBmcyk7CiB9CiAKIHN0YXRpYyB2b2lkCi1uQ29udGV4dEJpbmRQcm9ncmFtRnJhZ21lbnQoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IHBmKQorbkNvbnRleHRCaW5kUHJvZ3JhbUZyYWdtZW50KEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBwZikKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKICAgICBMT0dfQVBJKCJuQ29udGV4dEJpbmRQcm9ncmFtRnJhZ21lbnQsIGNvbiglcCksIHBmKCVwKSIsIGNvbiwgKFJzUHJvZ3JhbUZyYWdtZW50KXBmKTsKICAgICByc0NvbnRleHRCaW5kUHJvZ3JhbUZyYWdtZW50KGNvbiwgKFJzUHJvZ3JhbUZyYWdtZW50KXBmKTsKIH0KIAogc3RhdGljIHZvaWQKLW5Db250ZXh0QmluZFByb2dyYW1WZXJ0ZXgoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IHBmKQorbkNvbnRleHRCaW5kUHJvZ3JhbVZlcnRleChKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgcGYpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgTE9HX0FQSSgibkNvbnRleHRCaW5kUHJvZ3JhbVZlcnRleCwgY29uKCVwKSwgcGYoJXApIiwgY29uLCAoUnNQcm9ncmFtVmVydGV4KXBmKTsKICAgICByc0NvbnRleHRCaW5kUHJvZ3JhbVZlcnRleChjb24sIChSc1Byb2dyYW1WZXJ0ZXgpcGYpOwogfQogCiBzdGF0aWMgdm9pZAotbkNvbnRleHRCaW5kUHJvZ3JhbVJhc3RlcihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgcGYpCituQ29udGV4dEJpbmRQcm9ncmFtUmFzdGVyKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBwZikKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKICAgICBMT0dfQVBJKCJuQ29udGV4dEJpbmRQcm9ncmFtUmFzdGVyLCBjb24oJXApLCBwZiglcCkiLCBjb24sIChSc1Byb2dyYW1SYXN0ZXIpcGYpOwogICAgIHJzQ29udGV4dEJpbmRQcm9ncmFtUmFzdGVyKGNvbiwgKFJzUHJvZ3JhbVJhc3RlcilwZik7CiB9CkBAIC0xMjQzLDEwOCArMTI0MiwxMDAgQEAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBzdGF0aWMgdm9pZAotblNhbXBsZXJCZWdpbihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMpCituU2FtcGxlckJlZ2luKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbikKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKICAgICBMT0dfQVBJKCJuU2FtcGxlckJlZ2luLCBjb24oJXApIiwgY29uKTsKICAgICByc1NhbXBsZXJCZWdpbihjb24pOwogfQogCiBzdGF0aWMgdm9pZAotblNhbXBsZXJTZXQoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IHAsIGppbnQgdikKK25TYW1wbGVyU2V0KEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBwLCBqaW50IHYpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgTE9HX0FQSSgiblNhbXBsZXJTZXQsIGNvbiglcCksIHBhcmFtKCVpKSwgdmFsdWUoJWkpIiwgY29uLCBwLCB2KTsKICAgICByc1NhbXBsZXJTZXQoY29uLCAoUnNTYW1wbGVyUGFyYW0pcCwgKFJzU2FtcGxlclZhbHVlKXYpOwogfQogCiBzdGF0aWMgamludAotblNhbXBsZXJDcmVhdGUoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzKQorblNhbXBsZXJDcmVhdGUoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIExPR19BUEkoIm5TYW1wbGVyQ3JlYXRlLCBjb24oJXApIiwgY29uKTsKICAgICByZXR1cm4gKGppbnQpcnNTYW1wbGVyQ3JlYXRlKGNvbik7CiB9CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1zdGF0aWMgdm9pZAotbkxpZ2h0QmVnaW4oSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzKQotewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwotICAgIExPR19BUEkoIm5MaWdodEJlZ2luLCBjb24oJXApIiwgY29uKTsKLSAgICByc0xpZ2h0QmVnaW4oY29uKTsKLX0KLQotc3RhdGljIHZvaWQKLW5MaWdodFNldElzTW9ubyhKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGpib29sZWFuIGlzTW9ubykKLXsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKLSAgICBMT0dfQVBJKCJuTGlnaHRTZXRJc01vbm8sIGNvbiglcCksIGlzTW9ubyglaSkiLCBjb24sIGlzTW9ubyk7Ci0gICAgcnNMaWdodFNldE1vbm9jaHJvbWF0aWMoY29uLCBpc01vbm8pOwotfQotCi1zdGF0aWMgdm9pZAotbkxpZ2h0U2V0SXNMb2NhbChKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGpib29sZWFuIGlzTG9jYWwpCi17Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7Ci0gICAgTE9HX0FQSSgibkxpZ2h0U2V0SXNMb2NhbCwgY29uKCVwKSwgaXNMb2NhbCglaSkiLCBjb24sIGlzTG9jYWwpOwotICAgIHJzTGlnaHRTZXRMb2NhbChjb24sIGlzTG9jYWwpOwotfQotCiBzdGF0aWMgamludAotbkxpZ2h0Q3JlYXRlKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcykKK25NZXNoQ3JlYXRlKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCB2dHhDb3VudCwgamludCBpZHhDb3VudCkKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKLSAgICBMT0dfQVBJKCJuTGlnaHRDcmVhdGUsIGNvbiglcCkiLCBjb24pOwotICAgIHJldHVybiAoamludClyc0xpZ2h0Q3JlYXRlKGNvbik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1uTGlnaHRTZXRDb2xvcihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgbGlnaHQsIGZsb2F0IHIsIGZsb2F0IGcsIGZsb2F0IGIpCi17Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7Ci0gICAgTE9HX0FQSSgibkxpZ2h0U2V0Q29sb3IsIGNvbiglcCksIGxpZ2h0KCVwKSwgciglZiksIGcoJWYpLCBiKCVmKSIsIGNvbiwgKFJzTGlnaHQpbGlnaHQsIHIsIGcsIGIpOwotICAgIHJzTGlnaHRTZXRDb2xvcihjb24sIChSc0xpZ2h0KWxpZ2h0LCByLCBnLCBiKTsKLX0KLQotc3RhdGljIHZvaWQKLW5MaWdodFNldFBvc2l0aW9uKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBsaWdodCwgZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeikKLXsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKLSAgICBMT0dfQVBJKCJuTGlnaHRTZXRQb3NpdGlvbiwgY29uKCVwKSwgbGlnaHQoJXApLCB4KCVmKSwgeSglZiksIHooJWYpIiwgY29uLCAoUnNMaWdodClsaWdodCwgeCwgeSwgeik7Ci0gICAgcnNMaWdodFNldFBvc2l0aW9uKGNvbiwgKFJzTGlnaHQpbGlnaHQsIHgsIHksIHopOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIGppbnQKLW5TaW1wbGVNZXNoQ3JlYXRlKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBiYXRjaElELCBqaW50IGluZGV4SUQsIGppbnRBcnJheSB2dHhJRHMsIGppbnQgcHJpbUlEKQotewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwotICAgIGppbnQgbGVuID0gX2Vudi0+R2V0QXJyYXlMZW5ndGgodnR4SURzKTsKLSAgICBMT0dfQVBJKCJuU2ltcGxlTWVzaENyZWF0ZSwgY29uKCVwKSwgYmF0Y2hJRCglaSksIGluZGV4SUQoJWkpLCB2dHhJRHMubGVuKCVpKSwgcHJpbUlEKCVpKSIsCi0gICAgICAgICAgICBjb24sIGJhdGNoSUQsIGluZGV4SUQsIGxlbiwgcHJpbUlEKTsKLSAgICBqaW50ICpwdHIgPSBfZW52LT5HZXRJbnRBcnJheUVsZW1lbnRzKHZ0eElEcywgTlVMTCk7Ci0gICAgaW50IGlkID0gKGludClyc1NpbXBsZU1lc2hDcmVhdGUoY29uLCAodm9pZCAqKWJhdGNoSUQsICh2b2lkICopaW5kZXhJRCwgKHZvaWQgKiopcHRyLCBsZW4sIHByaW1JRCk7Ci0gICAgX2Vudi0+UmVsZWFzZUludEFycmF5RWxlbWVudHModnR4SURzLCBwdHIsIDAvKkpOSV9BQk9SVCovKTsKKyAgICBMT0dfQVBJKCJuTWVzaENyZWF0ZSwgY29uKCVwKSwgdnR4Q291bnQoJWkpLCBpZHhDb3VudCglaSkiLCBjb24sIHZ0eENvdW50LCBpZHhDb3VudCk7CisgICAgaW50IGlkID0gKGludClyc01lc2hDcmVhdGUoY29uLCB2dHhDb3VudCwgaWR4Q291bnQpOwogICAgIHJldHVybiBpZDsKIH0KIAogc3RhdGljIHZvaWQKLW5TaW1wbGVNZXNoQmluZFZlcnRleChKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgcywgamludCBhbGxvYywgamludCBzbG90KQorbk1lc2hCaW5kVmVydGV4KEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBtZXNoLCBqaW50IGFsbG9jLCBqaW50IHNsb3QpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7Ci0gICAgTE9HX0FQSSgiblNpbXBsZU1lc2hCaW5kVmVydGV4LCBjb24oJXApLCBTaW1wbGVNZXNoKCVwKSwgQWxsb2MoJXApLCBzbG90KCVpKSIsIGNvbiwgKFJzU2ltcGxlTWVzaClzLCAoUnNBbGxvY2F0aW9uKWFsbG9jLCBzbG90KTsKLSAgICByc1NpbXBsZU1lc2hCaW5kVmVydGV4KGNvbiwgKFJzU2ltcGxlTWVzaClzLCAoUnNBbGxvY2F0aW9uKWFsbG9jLCBzbG90KTsKKyAgICBMT0dfQVBJKCJuTWVzaEJpbmRWZXJ0ZXgsIGNvbiglcCksIE1lc2goJXApLCBBbGxvYyglcCksIHNsb3QoJWkpIiwgY29uLCAoUnNNZXNoKW1lc2gsIChSc0FsbG9jYXRpb24pYWxsb2MsIHNsb3QpOworICAgIHJzTWVzaEJpbmRWZXJ0ZXgoY29uLCAoUnNNZXNoKW1lc2gsIChSc0FsbG9jYXRpb24pYWxsb2MsIHNsb3QpOwogfQogCiBzdGF0aWMgdm9pZAotblNpbXBsZU1lc2hCaW5kSW5kZXgoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IHMsIGppbnQgYWxsb2MpCituTWVzaEJpbmRJbmRleChKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgbWVzaCwgamludCBhbGxvYywgamludCBwcmltSUQsIGppbnQgc2xvdCkKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKLSAgICBMT0dfQVBJKCJuU2ltcGxlTWVzaEJpbmRJbmRleCwgY29uKCVwKSwgU2ltcGxlTWVzaCglcCksIEFsbG9jKCVwKSIsIGNvbiwgKFJzU2ltcGxlTWVzaClzLCAoUnNBbGxvY2F0aW9uKWFsbG9jKTsKLSAgICByc1NpbXBsZU1lc2hCaW5kSW5kZXgoY29uLCAoUnNTaW1wbGVNZXNoKXMsIChSc0FsbG9jYXRpb24pYWxsb2MpOworICAgIExPR19BUEkoIm5NZXNoQmluZEluZGV4LCBjb24oJXApLCBNZXNoKCVwKSwgQWxsb2MoJXApIiwgY29uLCAoUnNNZXNoKW1lc2gsIChSc0FsbG9jYXRpb24pYWxsb2MpOworICAgIHJzTWVzaEJpbmRJbmRleChjb24sIChSc01lc2gpbWVzaCwgKFJzQWxsb2NhdGlvbilhbGxvYywgcHJpbUlELCBzbG90KTsKK30KKworc3RhdGljIGppbnQKK25NZXNoR2V0VmVydGV4QnVmZmVyQ291bnQoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IG1lc2gpCit7CisgICAgTE9HX0FQSSgibk1lc2hHZXRWZXJ0ZXhCdWZmZXJDb3VudCwgY29uKCVwKSwgTWVzaCglcCkiLCBjb24sIChSc01lc2gpbWVzaCk7CisgICAgamludCB2dHhDb3VudCA9IDA7CisgICAgcnNNZXNoR2V0VmVydGV4QnVmZmVyQ291bnQoY29uLCAoUnNNZXNoKW1lc2gsICZ2dHhDb3VudCk7CisgICAgcmV0dXJuIHZ0eENvdW50OworfQorCitzdGF0aWMgamludAorbk1lc2hHZXRJbmRleENvdW50KEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBtZXNoKQoreworICAgIExPR19BUEkoIm5NZXNoR2V0SW5kZXhDb3VudCwgY29uKCVwKSwgTWVzaCglcCkiLCBjb24sIChSc01lc2gpbWVzaCk7CisgICAgamludCBpZHhDb3VudCA9IDA7CisgICAgcnNNZXNoR2V0SW5kZXhDb3VudChjb24sIChSc01lc2gpbWVzaCwgJmlkeENvdW50KTsKKyAgICByZXR1cm4gaWR4Q291bnQ7Cit9CisKK3N0YXRpYyB2b2lkCituTWVzaEdldFZlcnRpY2VzKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBtZXNoLCBqaW50QXJyYXkgX2lkcywgaW50IG51bVZ0eElEcykKK3sKKyAgICBMT0dfQVBJKCJuTWVzaEdldFZlcnRpY2VzLCBjb24oJXApLCBNZXNoKCVwKSIsIGNvbiwgKFJzTWVzaCltZXNoKTsKKworICAgIFJzQWxsb2NhdGlvbiAqYWxsb2NzID0gKFJzQWxsb2NhdGlvbiopbWFsbG9jKCh1aW50MzJfdCludW1WdHhJRHMgKiBzaXplb2YoUnNBbGxvY2F0aW9uKSk7CisgICAgcnNNZXNoR2V0VmVydGljZXMoY29uLCAoUnNNZXNoKW1lc2gsIGFsbG9jcywgKHVpbnQzMl90KW51bVZ0eElEcyk7CisKKyAgICBmb3IoamludCBpID0gMDsgaSA8IG51bVZ0eElEczsgaSArKykgeworICAgICAgICBfZW52LT5TZXRJbnRBcnJheVJlZ2lvbihfaWRzLCBpLCAxLCAoY29uc3QgamludCopJmFsbG9jc1tpXSk7CisgICAgfQorCisgICAgZnJlZShhbGxvY3MpOworfQorCitzdGF0aWMgdm9pZAorbk1lc2hHZXRJbmRpY2VzKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBtZXNoLCBqaW50QXJyYXkgX2lkeElkcywgamludEFycmF5IF9wcmltaXRpdmVzLCBpbnQgbnVtSW5kaWNlcykKK3sKKyAgICBMT0dfQVBJKCJuTWVzaEdldFZlcnRpY2VzLCBjb24oJXApLCBNZXNoKCVwKSIsIGNvbiwgKFJzTWVzaCltZXNoKTsKKworICAgIFJzQWxsb2NhdGlvbiAqYWxsb2NzID0gKFJzQWxsb2NhdGlvbiopbWFsbG9jKCh1aW50MzJfdCludW1JbmRpY2VzICogc2l6ZW9mKFJzQWxsb2NhdGlvbikpOworICAgIHVpbnQzMl90ICpwcmltcz0gKHVpbnQzMl90KiltYWxsb2MoKHVpbnQzMl90KW51bUluZGljZXMgKiBzaXplb2YodWludDMyX3QpKTsKKworICAgIHJzTWVzaEdldEluZGljZXMoY29uLCAoUnNNZXNoKW1lc2gsIGFsbG9jcywgcHJpbXMsICh1aW50MzJfdCludW1JbmRpY2VzKTsKKworICAgIGZvcihqaW50IGkgPSAwOyBpIDwgbnVtSW5kaWNlczsgaSArKykgeworICAgICAgICBfZW52LT5TZXRJbnRBcnJheVJlZ2lvbihfaWR4SWRzLCBpLCAxLCAoY29uc3QgamludCopJmFsbG9jc1tpXSk7CisgICAgICAgIF9lbnYtPlNldEludEFycmF5UmVnaW9uKF9wcmltaXRpdmVzLCBpLCAxLCAoY29uc3QgamludCopJnByaW1zW2ldKTsKKyAgICB9CisKKyAgICBmcmVlKGFsbG9jcyk7CisgICAgZnJlZShwcmltcyk7CiB9CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMTM1OSwxMjQgKzEzNTAsMTMyIEBACiB7Im5EZXZpY2VDcmVhdGUiLCAgICAgICAgICAgICAgICAgICIoKUkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkRldmljZUNyZWF0ZSB9LAogeyJuRGV2aWNlRGVzdHJveSIsICAgICAgICAgICAgICAgICAiKEkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5EZXZpY2VEZXN0cm95IH0sCiB7Im5EZXZpY2VTZXRDb25maWciLCAgICAgICAgICAgICAgICIoSUlJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkRldmljZVNldENvbmZpZyB9LAoteyJuQ29udGV4dENyZWF0ZSIsICAgICAgICAgICAgICAgICAiKElJKUkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Db250ZXh0Q3JlYXRlIH0sCi17Im5Db250ZXh0Q3JlYXRlR0wiLCAgICAgICAgICAgICAgICIoSUlaKUkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkNvbnRleHRDcmVhdGVHTCB9LAoteyJuQ29udGV4dFNldFByaW9yaXR5IiwgICAgICAgICAgICAiKEkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Db250ZXh0U2V0UHJpb3JpdHkgfSwKLXsibkNvbnRleHRTZXRTdXJmYWNlIiwgICAgICAgICAgICAgIihJSUxhbmRyb2lkL3ZpZXcvU3VyZmFjZTspViIsICAgICAgICAgICh2b2lkKiluQ29udGV4dFNldFN1cmZhY2UgfSwKLXsibkNvbnRleHREZXN0cm95IiwgICAgICAgICAgICAgICAgIihJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQ29udGV4dERlc3Ryb3kgfSwKLXsibkNvbnRleHREdW1wIiwgICAgICAgICAgICAgICAgICAgIihJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQ29udGV4dER1bXAgfSwKLXsibkNvbnRleHRQYXVzZSIsICAgICAgICAgICAgICAgICAgIigpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQ29udGV4dFBhdXNlIH0sCi17Im5Db250ZXh0UmVzdW1lIiwgICAgICAgICAgICAgICAgICIoKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkNvbnRleHRSZXN1bWUgfSwKLXsibkFzc2lnbk5hbWUiLCAgICAgICAgICAgICAgICAgICAgIihJW0IpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQXNzaWduTmFtZSB9LAoteyJuT2JqRGVzdHJveSIsICAgICAgICAgICAgICAgICAgICAiKEkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5PYmpEZXN0cm95IH0sCi17Im5PYmpEZXN0cm95T09CIiwgICAgICAgICAgICAgICAgICIoSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbk9iakRlc3Ryb3lPT0IgfSwKLXsibkNvbnRleHRHZXRNZXNzYWdlIiwgICAgICAgICAgICAgIihbSVopSSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQ29udGV4dEdldE1lc3NhZ2UgfSwKLXsibkNvbnRleHRJbml0VG9DbGllbnQiLCAgICAgICAgICAgIigpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQ29udGV4dEluaXRUb0NsaWVudCB9LAoteyJuQ29udGV4dERlaW5pdFRvQ2xpZW50IiwgICAgICAgICAiKClWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Db250ZXh0RGVpbml0VG9DbGllbnQgfSwKK3sibkNvbnRleHRHZXRNZXNzYWdlIiwgICAgICAgICAgICAgIihJW0laKUkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkNvbnRleHRHZXRNZXNzYWdlIH0sCit7Im5Db250ZXh0SW5pdFRvQ2xpZW50IiwgICAgICAgICAgICIoSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Db250ZXh0SW5pdFRvQ2xpZW50IH0sCit7Im5Db250ZXh0RGVpbml0VG9DbGllbnQiLCAgICAgICAgICIoSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Db250ZXh0RGVpbml0VG9DbGllbnQgfSwKIAoteyJuRmlsZU9wZW4iLCAgICAgICAgICAgICAgICAgICAgICAiKFtCKUkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5GaWxlT3BlbiB9LAogCi17Im5FbGVtZW50Q3JlYXRlIiwgICAgICAgICAgICAgICAgICIoSUlaSSlJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkVsZW1lbnRDcmVhdGUgfSwKLXsibkVsZW1lbnRDcmVhdGUyIiwgICAgICAgICAgICAgICAgIihbSVtMamF2YS9sYW5nL1N0cmluZzspSSIsICAgICAgICAgICAgICh2b2lkKiluRWxlbWVudENyZWF0ZTIgfSwKKy8vIEFsbCBtZXRob2RzIGJlbG93IGFyZSB0aHJlYWQgcHJvdGVjdGVkIGluIGphdmEuCit7InJzbkNvbnRleHRDcmVhdGUiLCAgICAgICAgICAgICAgICAgIihJSSlJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQ29udGV4dENyZWF0ZSB9LAoreyJyc25Db250ZXh0Q3JlYXRlR0wiLCAgICAgICAgICAgICAgICIoSUlaKUkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkNvbnRleHRDcmVhdGVHTCB9LAoreyJyc25Db250ZXh0RmluaXNoIiwgICAgICAgICAgICAgICAgICIoSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Db250ZXh0RmluaXNoIH0sCit7InJzbkNvbnRleHRTZXRQcmlvcml0eSIsICAgICAgICAgICAgIihJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkNvbnRleHRTZXRQcmlvcml0eSB9LAoreyJyc25Db250ZXh0U2V0U3VyZmFjZSIsICAgICAgICAgICAgICIoSUlJTGFuZHJvaWQvdmlldy9TdXJmYWNlOylWIiwgICAgICAgICAgKHZvaWQqKW5Db250ZXh0U2V0U3VyZmFjZSB9LAoreyJyc25Db250ZXh0RGVzdHJveSIsICAgICAgICAgICAgICAgICIoSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkNvbnRleHREZXN0cm95IH0sCit7InJzbkNvbnRleHREdW1wIiwgICAgICAgICAgICAgICAgICAgIihJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkNvbnRleHREdW1wIH0sCit7InJzbkNvbnRleHRQYXVzZSIsICAgICAgICAgICAgICAgICAgIihJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkNvbnRleHRQYXVzZSB9LAoreyJyc25Db250ZXh0UmVzdW1lIiwgICAgICAgICAgICAgICAgICIoSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Db250ZXh0UmVzdW1lIH0sCit7InJzbkFzc2lnbk5hbWUiLCAgICAgICAgICAgICAgICAgICAgIihJSVtCKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFzc2lnbk5hbWUgfSwKK3sicnNuR2V0TmFtZSIsICAgICAgICAgICAgICAgICAgICAgICAiKElJKUxqYXZhL2xhbmcvU3RyaW5nOyIsICAgICAgICAgICAgICAgKHZvaWQqKW5HZXROYW1lIH0sCit7InJzbk9iakRlc3Ryb3kiLCAgICAgICAgICAgICAgICAgICAgIihJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbk9iakRlc3Ryb3kgfSwKIAoteyJuVHlwZUJlZ2luIiwgICAgICAgICAgICAgICAgICAgICAiKEkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5UeXBlQmVnaW4gfSwKLXsiblR5cGVBZGQiLCAgICAgICAgICAgICAgICAgICAgICAgIihJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluVHlwZUFkZCB9LAoteyJuVHlwZUNyZWF0ZSIsICAgICAgICAgICAgICAgICAgICAiKClJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5UeXBlQ3JlYXRlIH0sCi17Im5UeXBlRmluYWxEZXN0cm95IiwgICAgICAgICAgICAgICIoTGFuZHJvaWQvcmVuZGVyc2NyaXB0L1R5cGU7KVYiLCAgICAgICAodm9pZCopblR5cGVGaW5hbERlc3Ryb3kgfSwKLXsiblR5cGVTZXR1cEZpZWxkcyIsICAgICAgICAgICAgICAgIihMYW5kcm9pZC9yZW5kZXJzY3JpcHQvVHlwZTtbSVtJW0xqYXZhL2xhbmcvcmVmbGVjdC9GaWVsZDspViIsICh2b2lkKiluVHlwZVNldHVwRmllbGRzIH0sCit7InJzbkZpbGVPcGVuIiwgICAgICAgICAgICAgICAgICAgICAgIihJW0IpSSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkZpbGVPcGVuIH0sCit7InJzbkZpbGVBM0RDcmVhdGVGcm9tQXNzZXRTdHJlYW0iLCAgIihJSSlJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkZpbGVBM0RDcmVhdGVGcm9tQXNzZXRTdHJlYW0gfSwKK3sicnNuRmlsZUEzREdldE51bUluZGV4RW50cmllcyIsICAgICAiKElJKUkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluRmlsZUEzREdldE51bUluZGV4RW50cmllcyB9LAoreyJyc25GaWxlQTNER2V0SW5kZXhFbnRyaWVzIiwgICAgICAgICIoSUlJW0lbTGphdmEvbGFuZy9TdHJpbmc7KVYiLCAgICAgICAgICAodm9pZCopbkZpbGVBM0RHZXRJbmRleEVudHJpZXMgfSwKK3sicnNuRmlsZUEzREdldEVudHJ5QnlJbmRleCIsICAgICAgICAiKElJSSlJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluRmlsZUEzREdldEVudHJ5QnlJbmRleCB9LAogCi17Im5BbGxvY2F0aW9uQ3JlYXRlVHlwZWQiLCAgICAgICAgICIoSSlJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFsbG9jYXRpb25DcmVhdGVUeXBlZCB9LAoteyJuQWxsb2NhdGlvbkNyZWF0ZUZyb21CaXRtYXAiLCAgICAiKElaTGFuZHJvaWQvZ3JhcGhpY3MvQml0bWFwOylJIiwgICAgICAgKHZvaWQqKW5BbGxvY2F0aW9uQ3JlYXRlRnJvbUJpdG1hcCB9LAoteyJuQWxsb2NhdGlvbkNyZWF0ZUJpdG1hcFJlZiIsICAgICAiKElMYW5kcm9pZC9ncmFwaGljcy9CaXRtYXA7KUkiLCAgICAgICAgKHZvaWQqKW5BbGxvY2F0aW9uQ3JlYXRlQml0bWFwUmVmIH0sCi17Im5BbGxvY2F0aW9uQ3JlYXRlRnJvbUJpdG1hcEJveGVkIiwiKElaTGFuZHJvaWQvZ3JhcGhpY3MvQml0bWFwOylJIiwgICAgICAodm9pZCopbkFsbG9jYXRpb25DcmVhdGVGcm9tQml0bWFwQm94ZWQgfSwKLXsibkFsbG9jYXRpb25DcmVhdGVGcm9tQXNzZXRTdHJlYW0iLCIoSVpJKUkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQWxsb2NhdGlvbkNyZWF0ZUZyb21Bc3NldFN0cmVhbSB9LAoteyJuQWxsb2NhdGlvblVwbG9hZFRvVGV4dHVyZSIsICAgICAiKElaSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5BbGxvY2F0aW9uVXBsb2FkVG9UZXh0dXJlIH0sCi17Im5BbGxvY2F0aW9uVXBsb2FkVG9CdWZmZXJPYmplY3QiLCIoSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFsbG9jYXRpb25VcGxvYWRUb0J1ZmZlck9iamVjdCB9LAoteyJuQWxsb2NhdGlvblN1YkRhdGExRCIsICAgICAgICAgICAiKElJSVtJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5BbGxvY2F0aW9uU3ViRGF0YTFEX2kgfSwKLXsibkFsbG9jYXRpb25TdWJEYXRhMUQiLCAgICAgICAgICAgIihJSUlbU0kpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQWxsb2NhdGlvblN1YkRhdGExRF9zIH0sCi17Im5BbGxvY2F0aW9uU3ViRGF0YTFEIiwgICAgICAgICAgICIoSUlJW0JJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFsbG9jYXRpb25TdWJEYXRhMURfYiB9LAoteyJuQWxsb2NhdGlvblN1YkRhdGExRCIsICAgICAgICAgICAiKElJSVtGSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5BbGxvY2F0aW9uU3ViRGF0YTFEX2YgfSwKLXsibkFsbG9jYXRpb25TdWJEYXRhMkQiLCAgICAgICAgICAgIihJSUlJSVtJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQWxsb2NhdGlvblN1YkRhdGEyRF9pIH0sCi17Im5BbGxvY2F0aW9uU3ViRGF0YTJEIiwgICAgICAgICAgICIoSUlJSUlbRkkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFsbG9jYXRpb25TdWJEYXRhMkRfZiB9LAoteyJuQWxsb2NhdGlvblJlYWQiLCAgICAgICAgICAgICAgICAiKElbSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5BbGxvY2F0aW9uUmVhZF9pIH0sCi17Im5BbGxvY2F0aW9uUmVhZCIsICAgICAgICAgICAgICAgICIoSVtGKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFsbG9jYXRpb25SZWFkX2YgfSwKLXsibkFsbG9jYXRpb25TdWJEYXRhRnJvbU9iamVjdCIsICAgIihJTGFuZHJvaWQvcmVuZGVyc2NyaXB0L1R5cGU7SUxqYXZhL2xhbmcvT2JqZWN0OylWIiwgICAodm9pZCopbkFsbG9jYXRpb25TdWJEYXRhRnJvbU9iamVjdCB9LAoteyJuQWxsb2NhdGlvblN1YlJlYWRGcm9tT2JqZWN0IiwgICAiKElMYW5kcm9pZC9yZW5kZXJzY3JpcHQvVHlwZTtJTGphdmEvbGFuZy9PYmplY3Q7KVYiLCAgICh2b2lkKiluQWxsb2NhdGlvblN1YlJlYWRGcm9tT2JqZWN0IH0sCit7InJzbkZvbnRDcmVhdGVGcm9tRmlsZSIsICAgICAgICAgICAgIihJTGphdmEvbGFuZy9TdHJpbmc7SUkpSSIsICAgICAgICAgICAgICh2b2lkKiluRm9udENyZWF0ZUZyb21GaWxlIH0sCiAKLXsibkFkYXB0ZXIxREJpbmRBbGxvY2F0aW9uIiwgICAgICAgIihJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQWRhcHRlcjFEQmluZEFsbG9jYXRpb24gfSwKLXsibkFkYXB0ZXIxRFNldENvbnN0cmFpbnQiLCAgICAgICAgIihJSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQWRhcHRlcjFEU2V0Q29uc3RyYWludCB9LAoteyJuQWRhcHRlcjFERGF0YSIsICAgICAgICAgICAgICAgICAiKElbSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5BZGFwdGVyMUREYXRhX2kgfSwKLXsibkFkYXB0ZXIxRERhdGEiLCAgICAgICAgICAgICAgICAgIihJW0YpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQWRhcHRlcjFERGF0YV9mIH0sCi17Im5BZGFwdGVyMURTdWJEYXRhIiwgICAgICAgICAgICAgICIoSUlJW0kpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFkYXB0ZXIxRFN1YkRhdGFfaSB9LAoteyJuQWRhcHRlcjFEU3ViRGF0YSIsICAgICAgICAgICAgICAiKElJSVtGKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5BZGFwdGVyMURTdWJEYXRhX2YgfSwKLXsibkFkYXB0ZXIxRENyZWF0ZSIsICAgICAgICAgICAgICAgIigpSSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQWRhcHRlcjFEQ3JlYXRlIH0sCit7InJzbkVsZW1lbnRDcmVhdGUiLCAgICAgICAgICAgICAgICAgIihJSUlaSSlJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkVsZW1lbnRDcmVhdGUgfSwKK3sicnNuRWxlbWVudENyZWF0ZTIiLCAgICAgICAgICAgICAgICAiKElbSVtMamF2YS9sYW5nL1N0cmluZzspSSIsICAgICAgICAgICAgICh2b2lkKiluRWxlbWVudENyZWF0ZTIgfSwKK3sicnNuRWxlbWVudEdldE5hdGl2ZURhdGEiLCAgICAgICAgICAiKElJW0kpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluRWxlbWVudEdldE5hdGl2ZURhdGEgfSwKK3sicnNuRWxlbWVudEdldFN1YkVsZW1lbnRzIiwgICAgICAgICAiKElJW0lbTGphdmEvbGFuZy9TdHJpbmc7KVYiLCAgICAgICAgICAgKHZvaWQqKW5FbGVtZW50R2V0U3ViRWxlbWVudHMgfSwKIAoteyJuQWRhcHRlcjJEQmluZEFsbG9jYXRpb24iLCAgICAgICAiKElJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5BZGFwdGVyMkRCaW5kQWxsb2NhdGlvbiB9LAoteyJuQWRhcHRlcjJEU2V0Q29uc3RyYWludCIsICAgICAgICAiKElJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5BZGFwdGVyMkRTZXRDb25zdHJhaW50IH0sCi17Im5BZGFwdGVyMkREYXRhIiwgICAgICAgICAgICAgICAgICIoSVtJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFkYXB0ZXIyRERhdGFfaSB9LAoteyJuQWRhcHRlcjJERGF0YSIsICAgICAgICAgICAgICAgICAiKElbRilWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5BZGFwdGVyMkREYXRhX2YgfSwKLXsibkFkYXB0ZXIyRFN1YkRhdGEiLCAgICAgICAgICAgICAgIihJSUlJSVtJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQWRhcHRlcjJEU3ViRGF0YV9pIH0sCi17Im5BZGFwdGVyMkRTdWJEYXRhIiwgICAgICAgICAgICAgICIoSUlJSUlbRilWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFkYXB0ZXIyRFN1YkRhdGFfZiB9LAoteyJuQWRhcHRlcjJEQ3JlYXRlIiwgICAgICAgICAgICAgICAiKClJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5BZGFwdGVyMkRDcmVhdGUgfSwKK3sicnNuVHlwZUJlZ2luIiwgICAgICAgICAgICAgICAgICAgICAiKElJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluVHlwZUJlZ2luIH0sCit7InJzblR5cGVBZGQiLCAgICAgICAgICAgICAgICAgICAgICAgIihJSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblR5cGVBZGQgfSwKK3sicnNuVHlwZUNyZWF0ZSIsICAgICAgICAgICAgICAgICAgICAiKEkpSSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluVHlwZUNyZWF0ZSB9LAoreyJyc25UeXBlRmluYWxEZXN0cm95IiwgICAgICAgICAgICAgICIoSUxhbmRyb2lkL3JlbmRlcnNjcmlwdC9UeXBlOylWIiwgICAgICAgKHZvaWQqKW5UeXBlRmluYWxEZXN0cm95IH0sCit7InJzblR5cGVTZXR1cEZpZWxkcyIsICAgICAgICAgICAgICAgIihJTGFuZHJvaWQvcmVuZGVyc2NyaXB0L1R5cGU7W0lbSVtMamF2YS9sYW5nL3JlZmxlY3QvRmllbGQ7KVYiLCAodm9pZCopblR5cGVTZXR1cEZpZWxkcyB9LAoreyJyc25UeXBlR2V0TmF0aXZlRGF0YSIsICAgICAgICAgICAgICIoSUlbSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluVHlwZUdldE5hdGl2ZURhdGEgfSwKIAoteyJuU2NyaXB0QmluZEFsbG9jYXRpb24iLCAgICAgICAgICAiKElJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5TY3JpcHRCaW5kQWxsb2NhdGlvbiB9LAoteyJuU2NyaXB0U2V0Q2xlYXJDb2xvciIsICAgICAgICAgICAiKElGRkZGKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5TY3JpcHRTZXRDbGVhckNvbG9yIH0sCi17Im5TY3JpcHRTZXRDbGVhckRlcHRoIiwgICAgICAgICAgICIoSUYpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblNjcmlwdFNldENsZWFyRGVwdGggfSwKLXsiblNjcmlwdFNldENsZWFyU3RlbmNpbCIsICAgICAgICAgIihJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluU2NyaXB0U2V0Q2xlYXJTdGVuY2lsIH0sCi17Im5TY3JpcHRTZXRUaW1lWm9uZSIsICAgICAgICAgICAgICIoSVtCKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblNjcmlwdFNldFRpbWVab25lIH0sCi17Im5TY3JpcHRTZXRUeXBlIiwgICAgICAgICAgICAgICAgICIoSVpMamF2YS9sYW5nL1N0cmluZztJKVYiLCAgICAgICAgICAgICAodm9pZCopblNjcmlwdFNldFR5cGUgfSwKLXsiblNjcmlwdFNldFJvb3QiLCAgICAgICAgICAgICAgICAgIihaKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluU2NyaXB0U2V0Um9vdCB9LAoteyJuU2NyaXB0U2V0SW52b2thYmxlIiwgICAgICAgICAgICAiKExqYXZhL2xhbmcvU3RyaW5nO0kpViIsICAgICAgICAgICAgICAgKHZvaWQqKW5TY3JpcHRTZXRJbnZva2UgfSwKLXsiblNjcmlwdEludm9rZSIsICAgICAgICAgICAgICAgICAgIihJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluU2NyaXB0SW52b2tlIH0sCit7InJzbkFsbG9jYXRpb25DcmVhdGVUeXBlZCIsICAgICAgICAgIihJSSlJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFsbG9jYXRpb25DcmVhdGVUeXBlZCB9LAoreyJyc25BbGxvY2F0aW9uQ3JlYXRlRnJvbUJpdG1hcCIsICAgICIoSUlaTGFuZHJvaWQvZ3JhcGhpY3MvQml0bWFwOylJIiwgICAgICAgKHZvaWQqKW5BbGxvY2F0aW9uQ3JlYXRlRnJvbUJpdG1hcCB9LAoreyJyc25BbGxvY2F0aW9uQ3JlYXRlQml0bWFwUmVmIiwgICAgICIoSUlMYW5kcm9pZC9ncmFwaGljcy9CaXRtYXA7KUkiLCAgICAgICAgKHZvaWQqKW5BbGxvY2F0aW9uQ3JlYXRlQml0bWFwUmVmIH0sCit7InJzbkFsbG9jYXRpb25DcmVhdGVGcm9tQml0bWFwQm94ZWQiLCIoSUlaTGFuZHJvaWQvZ3JhcGhpY3MvQml0bWFwOylJIiwgICAgICAodm9pZCopbkFsbG9jYXRpb25DcmVhdGVGcm9tQml0bWFwQm94ZWQgfSwKK3sicnNuQWxsb2NhdGlvbkNyZWF0ZUZyb21Bc3NldFN0cmVhbSIsIihJSVpJKUkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQWxsb2NhdGlvbkNyZWF0ZUZyb21Bc3NldFN0cmVhbSB9LAoreyJyc25BbGxvY2F0aW9uVXBsb2FkVG9UZXh0dXJlIiwgICAgICIoSUlaSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5BbGxvY2F0aW9uVXBsb2FkVG9UZXh0dXJlIH0sCit7InJzbkFsbG9jYXRpb25VcGxvYWRUb0J1ZmZlck9iamVjdCIsIihJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFsbG9jYXRpb25VcGxvYWRUb0J1ZmZlck9iamVjdCB9LAoreyJyc25BbGxvY2F0aW9uU3ViRGF0YTFEIiwgICAgICAgICAgICIoSUlJSVtJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5BbGxvY2F0aW9uU3ViRGF0YTFEX2kgfSwKK3sicnNuQWxsb2NhdGlvblN1YkRhdGExRCIsICAgICAgICAgICAiKElJSUlbU0kpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQWxsb2NhdGlvblN1YkRhdGExRF9zIH0sCit7InJzbkFsbG9jYXRpb25TdWJEYXRhMUQiLCAgICAgICAgICAgIihJSUlJW0JJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFsbG9jYXRpb25TdWJEYXRhMURfYiB9LAoreyJyc25BbGxvY2F0aW9uU3ViRGF0YTFEIiwgICAgICAgICAgICIoSUlJSVtGSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5BbGxvY2F0aW9uU3ViRGF0YTFEX2YgfSwKK3sicnNuQWxsb2NhdGlvblN1YkRhdGEyRCIsICAgICAgICAgICAiKElJSUlJSVtJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQWxsb2NhdGlvblN1YkRhdGEyRF9pIH0sCit7InJzbkFsbG9jYXRpb25TdWJEYXRhMkQiLCAgICAgICAgICAgIihJSUlJSUlbRkkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFsbG9jYXRpb25TdWJEYXRhMkRfZiB9LAoreyJyc25BbGxvY2F0aW9uUmVhZCIsICAgICAgICAgICAgICAgICIoSUlbSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5BbGxvY2F0aW9uUmVhZF9pIH0sCit7InJzbkFsbG9jYXRpb25SZWFkIiwgICAgICAgICAgICAgICAgIihJSVtGKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFsbG9jYXRpb25SZWFkX2YgfSwKK3sicnNuQWxsb2NhdGlvblN1YkRhdGFGcm9tT2JqZWN0IiwgICAiKElJTGFuZHJvaWQvcmVuZGVyc2NyaXB0L1R5cGU7SUxqYXZhL2xhbmcvT2JqZWN0OylWIiwgICAodm9pZCopbkFsbG9jYXRpb25TdWJEYXRhRnJvbU9iamVjdCB9LAoreyJyc25BbGxvY2F0aW9uU3ViUmVhZEZyb21PYmplY3QiLCAgICIoSUlMYW5kcm9pZC9yZW5kZXJzY3JpcHQvVHlwZTtJTGphdmEvbGFuZy9PYmplY3Q7KVYiLCAgICh2b2lkKiluQWxsb2NhdGlvblN1YlJlYWRGcm9tT2JqZWN0IH0sCit7InJzbkFsbG9jYXRpb25HZXRUeXBlIiwgICAgICAgICAgICAgIihJSSlJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFsbG9jYXRpb25HZXRUeXBlfSwKIAoteyJuU2NyaXB0Q0JlZ2luIiwgICAgICAgICAgICAgICAgICAiKClWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5TY3JpcHRDQmVnaW4gfSwKLXsiblNjcmlwdENTZXRTY3JpcHQiLCAgICAgICAgICAgICAgIihbQklJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluU2NyaXB0Q1NldFNjcmlwdCB9LAoteyJuU2NyaXB0Q0NyZWF0ZSIsICAgICAgICAgICAgICAgICAiKClJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5TY3JpcHRDQ3JlYXRlIH0sCi17Im5TY3JpcHRDQWRkRGVmaW5lSTMyIiwgICAgICAgICAgICIoTGphdmEvbGFuZy9TdHJpbmc7SSlWIiwgICAgICAgICAgICAgICAodm9pZCopblNjcmlwdENBZGREZWZpbmVJMzIgfSwKLXsiblNjcmlwdENBZGREZWZpbmVGIiwgICAgICAgICAgICAgIihMamF2YS9sYW5nL1N0cmluZztGKVYiLCAgICAgICAgICAgICAgICh2b2lkKiluU2NyaXB0Q0FkZERlZmluZUYgfSwKK3sicnNuQWRhcHRlcjFEQmluZEFsbG9jYXRpb24iLCAgICAgICAiKElJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQWRhcHRlcjFEQmluZEFsbG9jYXRpb24gfSwKK3sicnNuQWRhcHRlcjFEU2V0Q29uc3RyYWludCIsICAgICAgICAiKElJSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQWRhcHRlcjFEU2V0Q29uc3RyYWludCB9LAoreyJyc25BZGFwdGVyMUREYXRhIiwgICAgICAgICAgICAgICAgICIoSUlbSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5BZGFwdGVyMUREYXRhX2kgfSwKK3sicnNuQWRhcHRlcjFERGF0YSIsICAgICAgICAgICAgICAgICAiKElJW0YpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQWRhcHRlcjFERGF0YV9mIH0sCit7InJzbkFkYXB0ZXIxRFN1YkRhdGEiLCAgICAgICAgICAgICAgIihJSUlJW0kpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFkYXB0ZXIxRFN1YkRhdGFfaSB9LAoreyJyc25BZGFwdGVyMURTdWJEYXRhIiwgICAgICAgICAgICAgICIoSUlJSVtGKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5BZGFwdGVyMURTdWJEYXRhX2YgfSwKK3sicnNuQWRhcHRlcjFEQ3JlYXRlIiwgICAgICAgICAgICAgICAiKEkpSSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQWRhcHRlcjFEQ3JlYXRlIH0sCiAKLXsiblByb2dyYW1GcmFnbWVudFN0b3JlQmVnaW4iLCAgICAgIihJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluUHJvZ3JhbUZyYWdtZW50U3RvcmVCZWdpbiB9LAoteyJuUHJvZ3JhbUZyYWdtZW50U3RvcmVEZXB0aEZ1bmMiLCAiKEkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Qcm9ncmFtRnJhZ21lbnRTdG9yZURlcHRoRnVuYyB9LAoteyJuUHJvZ3JhbUZyYWdtZW50U3RvcmVEZXB0aE1hc2siLCAiKFopViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Qcm9ncmFtRnJhZ21lbnRTdG9yZURlcHRoTWFzayB9LAoteyJuUHJvZ3JhbUZyYWdtZW50U3RvcmVDb2xvck1hc2siLCAiKFpaWlopViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Qcm9ncmFtRnJhZ21lbnRTdG9yZUNvbG9yTWFzayB9LAoteyJuUHJvZ3JhbUZyYWdtZW50U3RvcmVCbGVuZEZ1bmMiLCAiKElJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Qcm9ncmFtRnJhZ21lbnRTdG9yZUJsZW5kRnVuYyB9LAoteyJuUHJvZ3JhbUZyYWdtZW50U3RvcmVEaXRoZXIiLCAgICAiKFopViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Qcm9ncmFtRnJhZ21lbnRTdG9yZURpdGhlciB9LAoteyJuUHJvZ3JhbUZyYWdtZW50U3RvcmVDcmVhdGUiLCAgICAiKClJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Qcm9ncmFtRnJhZ21lbnRTdG9yZUNyZWF0ZSB9LAoreyJyc25BZGFwdGVyMkRCaW5kQWxsb2NhdGlvbiIsICAgICAgICIoSUlJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5BZGFwdGVyMkRCaW5kQWxsb2NhdGlvbiB9LAoreyJyc25BZGFwdGVyMkRTZXRDb25zdHJhaW50IiwgICAgICAgICIoSUlJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5BZGFwdGVyMkRTZXRDb25zdHJhaW50IH0sCit7InJzbkFkYXB0ZXIyRERhdGEiLCAgICAgICAgICAgICAgICAgIihJSVtJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFkYXB0ZXIyRERhdGFfaSB9LAoreyJyc25BZGFwdGVyMkREYXRhIiwgICAgICAgICAgICAgICAgICIoSUlbRilWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5BZGFwdGVyMkREYXRhX2YgfSwKK3sicnNuQWRhcHRlcjJEU3ViRGF0YSIsICAgICAgICAgICAgICAiKElJSUlJSVtJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQWRhcHRlcjJEU3ViRGF0YV9pIH0sCit7InJzbkFkYXB0ZXIyRFN1YkRhdGEiLCAgICAgICAgICAgICAgIihJSUlJSUlbRilWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFkYXB0ZXIyRFN1YkRhdGFfZiB9LAoreyJyc25BZGFwdGVyMkRDcmVhdGUiLCAgICAgICAgICAgICAgICIoSSlJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5BZGFwdGVyMkRDcmVhdGUgfSwKIAoteyJuUHJvZ3JhbUJpbmRDb25zdGFudHMiLCAgICAgICAgICAiKElJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Qcm9ncmFtQmluZENvbnN0YW50cyB9LAoteyJuUHJvZ3JhbUJpbmRUZXh0dXJlIiwgICAgICAgICAgICAiKElJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Qcm9ncmFtQmluZFRleHR1cmUgfSwKLXsiblByb2dyYW1CaW5kU2FtcGxlciIsICAgICAgICAgICAgIihJSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluUHJvZ3JhbUJpbmRTYW1wbGVyIH0sCit7InJzblNjcmlwdEJpbmRBbGxvY2F0aW9uIiwgICAgICAgICAgIihJSUlJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblNjcmlwdEJpbmRBbGxvY2F0aW9uIH0sCit7InJzblNjcmlwdFNldFRpbWVab25lIiwgICAgICAgICAgICAgIihJSVtCKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblNjcmlwdFNldFRpbWVab25lIH0sCit7InJzblNjcmlwdEludm9rZSIsICAgICAgICAgICAgICAgICAgIihJSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblNjcmlwdEludm9rZSB9LAoreyJyc25TY3JpcHRJbnZva2VWIiwgICAgICAgICAgICAgICAgICIoSUlJW0IpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5TY3JpcHRJbnZva2VWIH0sCit7InJzblNjcmlwdFNldFZhckkiLCAgICAgICAgICAgICAgICAgIihJSUlJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblNjcmlwdFNldFZhckkgfSwKK3sicnNuU2NyaXB0U2V0VmFyRiIsICAgICAgICAgICAgICAgICAiKElJSUYpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluU2NyaXB0U2V0VmFyRiB9LAoreyJyc25TY3JpcHRTZXRWYXJWIiwgICAgICAgICAgICAgICAgICIoSUlJW0IpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5TY3JpcHRTZXRWYXJWIH0sCiAKLXsiblByb2dyYW1GcmFnbWVudENyZWF0ZSIsICAgICAgICAgIihbSSlJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluUHJvZ3JhbUZyYWdtZW50Q3JlYXRlIH0sCi17Im5Qcm9ncmFtRnJhZ21lbnRDcmVhdGUyIiwgICAgICAgICIoTGphdmEvbGFuZy9TdHJpbmc7W0kpSSIsICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1GcmFnbWVudENyZWF0ZTIgfSwKK3sicnNuU2NyaXB0Q0JlZ2luIiwgICAgICAgICAgICAgICAgICAiKEkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluU2NyaXB0Q0JlZ2luIH0sCit7InJzblNjcmlwdENTZXRTY3JpcHQiLCAgICAgICAgICAgICAgIihJW0JJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblNjcmlwdENTZXRTY3JpcHQgfSwKK3sicnNuU2NyaXB0Q0NyZWF0ZSIsICAgICAgICAgICAgICAgICAiKEkpSSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluU2NyaXB0Q0NyZWF0ZSB9LAogCi17Im5Qcm9ncmFtUmFzdGVyQ3JlYXRlIiwgICAgICAgICAgICIoSUlaWlopSSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1SYXN0ZXJDcmVhdGUgfSwKLXsiblByb2dyYW1SYXN0ZXJTZXRQb2ludFNpemUiLCAgICAgIihJRilWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluUHJvZ3JhbVJhc3RlclNldFBvaW50U2l6ZSB9LAoteyJuUHJvZ3JhbVJhc3RlclNldExpbmVXaWR0aCIsICAgICAiKElGKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Qcm9ncmFtUmFzdGVyU2V0TGluZVdpZHRoIH0sCit7InJzblByb2dyYW1TdG9yZUJlZ2luIiwgICAgICAgICAgICAgIihJSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1TdG9yZUJlZ2luIH0sCit7InJzblByb2dyYW1TdG9yZURlcHRoRnVuYyIsICAgICAgICAgIihJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1TdG9yZURlcHRoRnVuYyB9LAoreyJyc25Qcm9ncmFtU3RvcmVEZXB0aE1hc2siLCAgICAgICAgICIoSVopViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Qcm9ncmFtU3RvcmVEZXB0aE1hc2sgfSwKK3sicnNuUHJvZ3JhbVN0b3JlQ29sb3JNYXNrIiwgICAgICAgICAiKElaWlpaKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluUHJvZ3JhbVN0b3JlQ29sb3JNYXNrIH0sCit7InJzblByb2dyYW1TdG9yZUJsZW5kRnVuYyIsICAgICAgICAgIihJSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1TdG9yZUJsZW5kRnVuYyB9LAoreyJyc25Qcm9ncmFtU3RvcmVEaXRoZXIiLCAgICAgICAgICAgICIoSVopViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Qcm9ncmFtU3RvcmVEaXRoZXIgfSwKK3sicnNuUHJvZ3JhbVN0b3JlQ3JlYXRlIiwgICAgICAgICAgICAiKEkpSSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluUHJvZ3JhbVN0b3JlQ3JlYXRlIH0sCiAKLXsiblByb2dyYW1WZXJ0ZXhDcmVhdGUiLCAgICAgICAgICAgIihaKUkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluUHJvZ3JhbVZlcnRleENyZWF0ZSB9LAoteyJuUHJvZ3JhbVZlcnRleENyZWF0ZTIiLCAgICAgICAgICAiKExqYXZhL2xhbmcvU3RyaW5nO1tJKUkiLCAgICAgICAgICAgICAgKHZvaWQqKW5Qcm9ncmFtVmVydGV4Q3JlYXRlMiB9LAoreyJyc25Qcm9ncmFtQmluZENvbnN0YW50cyIsICAgICAgICAgICIoSUlJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Qcm9ncmFtQmluZENvbnN0YW50cyB9LAoreyJyc25Qcm9ncmFtQmluZFRleHR1cmUiLCAgICAgICAgICAgICIoSUlJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Qcm9ncmFtQmluZFRleHR1cmUgfSwKK3sicnNuUHJvZ3JhbUJpbmRTYW1wbGVyIiwgICAgICAgICAgICAiKElJSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluUHJvZ3JhbUJpbmRTYW1wbGVyIH0sCiAKLXsibkxpZ2h0QmVnaW4iLCAgICAgICAgICAgICAgICAgICAgIigpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluTGlnaHRCZWdpbiB9LAoteyJuTGlnaHRTZXRJc01vbm8iLCAgICAgICAgICAgICAgICAiKFopViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5MaWdodFNldElzTW9ubyB9LAoteyJuTGlnaHRTZXRJc0xvY2FsIiwgICAgICAgICAgICAgICAiKFopViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5MaWdodFNldElzTG9jYWwgfSwKLXsibkxpZ2h0Q3JlYXRlIiwgICAgICAgICAgICAgICAgICAgIigpSSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluTGlnaHRDcmVhdGUgfSwKLXsibkxpZ2h0U2V0Q29sb3IiLCAgICAgICAgICAgICAgICAgIihJRkZGKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluTGlnaHRTZXRDb2xvciB9LAoteyJuTGlnaHRTZXRQb3NpdGlvbiIsICAgICAgICAgICAgICAiKElGRkYpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5MaWdodFNldFBvc2l0aW9uIH0sCit7InJzblByb2dyYW1GcmFnbWVudENyZWF0ZSIsICAgICAgICAgIihJW0kpSSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1GcmFnbWVudENyZWF0ZSB9LAoreyJyc25Qcm9ncmFtRnJhZ21lbnRDcmVhdGUyIiwgICAgICAgICIoSUxqYXZhL2xhbmcvU3RyaW5nO1tJKUkiLCAgICAgICAgICAgICAgKHZvaWQqKW5Qcm9ncmFtRnJhZ21lbnRDcmVhdGUyIH0sCiAKLXsibkNvbnRleHRCaW5kUm9vdFNjcmlwdCIsICAgICAgICAgIihJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQ29udGV4dEJpbmRSb290U2NyaXB0IH0sCi17Im5Db250ZXh0QmluZFByb2dyYW1GcmFnbWVudFN0b3JlIiwiKEkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkNvbnRleHRCaW5kUHJvZ3JhbUZyYWdtZW50U3RvcmUgfSwKLXsibkNvbnRleHRCaW5kUHJvZ3JhbUZyYWdtZW50IiwgICAgIihJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQ29udGV4dEJpbmRQcm9ncmFtRnJhZ21lbnQgfSwKLXsibkNvbnRleHRCaW5kUHJvZ3JhbVZlcnRleCIsICAgICAgIihJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQ29udGV4dEJpbmRQcm9ncmFtVmVydGV4IH0sCi17Im5Db250ZXh0QmluZFByb2dyYW1SYXN0ZXIiLCAgICAgICIoSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkNvbnRleHRCaW5kUHJvZ3JhbVJhc3RlciB9LAoreyJyc25Qcm9ncmFtUmFzdGVyQ3JlYXRlIiwgICAgICAgICAgICIoSVpaWilJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluUHJvZ3JhbVJhc3RlckNyZWF0ZSB9LAoreyJyc25Qcm9ncmFtUmFzdGVyU2V0TGluZVdpZHRoIiwgICAgICIoSUlGKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Qcm9ncmFtUmFzdGVyU2V0TGluZVdpZHRoIH0sCit7InJzblByb2dyYW1SYXN0ZXJTZXRDdWxsTW9kZSIsICAgICAgIihJSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1SYXN0ZXJTZXRDdWxsTW9kZSB9LAogCi17Im5TYW1wbGVyQmVnaW4iLCAgICAgICAgICAgICAgICAgICIoKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblNhbXBsZXJCZWdpbiB9LAoteyJuU2FtcGxlclNldCIsICAgICAgICAgICAgICAgICAgICAiKElJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5TYW1wbGVyU2V0IH0sCi17Im5TYW1wbGVyQ3JlYXRlIiwgICAgICAgICAgICAgICAgICIoKUkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblNhbXBsZXJDcmVhdGUgfSwKK3sicnNuUHJvZ3JhbVZlcnRleENyZWF0ZSIsICAgICAgICAgICAiKElaKUkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluUHJvZ3JhbVZlcnRleENyZWF0ZSB9LAoreyJyc25Qcm9ncmFtVmVydGV4Q3JlYXRlMiIsICAgICAgICAgICIoSUxqYXZhL2xhbmcvU3RyaW5nO1tJKUkiLCAgICAgICAgICAgICAgKHZvaWQqKW5Qcm9ncmFtVmVydGV4Q3JlYXRlMiB9LAogCi17Im5TaW1wbGVNZXNoQ3JlYXRlIiwgICAgICAgICAgICAgICIoSUlbSUkpSSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblNpbXBsZU1lc2hDcmVhdGUgfSwKLXsiblNpbXBsZU1lc2hCaW5kVmVydGV4IiwgICAgICAgICAgIihJSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluU2ltcGxlTWVzaEJpbmRWZXJ0ZXggfSwKLXsiblNpbXBsZU1lc2hCaW5kSW5kZXgiLCAgICAgICAgICAgIihJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluU2ltcGxlTWVzaEJpbmRJbmRleCB9LAoreyJyc25Db250ZXh0QmluZFJvb3RTY3JpcHQiLCAgICAgICAgICIoSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Db250ZXh0QmluZFJvb3RTY3JpcHQgfSwKK3sicnNuQ29udGV4dEJpbmRQcm9ncmFtU3RvcmUiLCAgICAgICAiKElJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Db250ZXh0QmluZFByb2dyYW1TdG9yZSB9LAoreyJyc25Db250ZXh0QmluZFByb2dyYW1GcmFnbWVudCIsICAgICIoSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Db250ZXh0QmluZFByb2dyYW1GcmFnbWVudCB9LAoreyJyc25Db250ZXh0QmluZFByb2dyYW1WZXJ0ZXgiLCAgICAgICIoSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Db250ZXh0QmluZFByb2dyYW1WZXJ0ZXggfSwKK3sicnNuQ29udGV4dEJpbmRQcm9ncmFtUmFzdGVyIiwgICAgICAiKElJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQ29udGV4dEJpbmRQcm9ncmFtUmFzdGVyIH0sCisKK3sicnNuU2FtcGxlckJlZ2luIiwgICAgICAgICAgICAgICAgICAiKEkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluU2FtcGxlckJlZ2luIH0sCit7InJzblNhbXBsZXJTZXQiLCAgICAgICAgICAgICAgICAgICAgIihJSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblNhbXBsZXJTZXQgfSwKK3sicnNuU2FtcGxlckNyZWF0ZSIsICAgICAgICAgICAgICAgICAiKEkpSSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluU2FtcGxlckNyZWF0ZSB9LAorCit7InJzbk1lc2hDcmVhdGUiLCAgICAgICAgICAgICAgICAgICAgIihJSUkpSSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbk1lc2hDcmVhdGUgfSwKK3sicnNuTWVzaEJpbmRWZXJ0ZXgiLCAgICAgICAgICAgICAgICAiKElJSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluTWVzaEJpbmRWZXJ0ZXggfSwKK3sicnNuTWVzaEJpbmRJbmRleCIsICAgICAgICAgICAgICAgICAiKElJSUlJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluTWVzaEJpbmRJbmRleCB9LAorCit7InJzbk1lc2hHZXRWZXJ0ZXhCdWZmZXJDb3VudCIsICAgICAgIihJSSlJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbk1lc2hHZXRWZXJ0ZXhCdWZmZXJDb3VudCB9LAoreyJyc25NZXNoR2V0SW5kZXhDb3VudCIsICAgICAgICAgICAgICIoSUkpSSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5NZXNoR2V0SW5kZXhDb3VudCB9LAoreyJyc25NZXNoR2V0VmVydGljZXMiLCAgICAgICAgICAgICAgICIoSUlbSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbk1lc2hHZXRWZXJ0aWNlcyB9LAoreyJyc25NZXNoR2V0SW5kaWNlcyIsICAgICAgICAgICAgICAgICIoSUlbSVtJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5NZXNoR2V0SW5kaWNlcyB9LAogCiB9OwogCkBAIC0xNTEwLDMgKzE1MDksNCBAQAogYmFpbDoKICAgICByZXR1cm4gcmVzdWx0OwogfQorCmRpZmYgLS1naXQgYS9pY3U0ai9qYXZhL2FuZHJvaWQvaWN1L3RleHQvQXJhYmljU2hhcGluZy5qYXZhIGIvaWN1NGovamF2YS9hbmRyb2lkL2ljdS90ZXh0L0FyYWJpY1NoYXBpbmcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2UyMTc1Ci0tLSAvZGV2L251bGwKKysrIGIvaWN1NGovamF2YS9hbmRyb2lkL2ljdS90ZXh0L0FyYWJpY1NoYXBpbmcuamF2YQpAQCAtMCwwICsxLDE5NDcgQEAKKy8qCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICAgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDksIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMKKyogICBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCisKKy8qCisgKiBQb3J0ZWQgd2l0aCBtaW5vciBtb2RpZmljYXRpb25zIGZyb20gSUNVNEogNC4yJ3MKKyAqIGNvbS5pYm0uaWN1LnRleHQuQXJhYmljU2hhcGluZyBjbGFzcy4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuaWN1LnRleHQ7CisKKworLyoqCisgKiBTaGFwZSBBcmFiaWMgdGV4dCBvbiBhIGNoYXJhY3RlciBiYXNpcy4KKyAqCisgKiA8cD5BcmFiaWNTaGFwaW5nIHBlcmZvcm1zIGJhc2ljIG9wZXJhdGlvbnMgZm9yICJzaGFwaW5nIiBBcmFiaWMgdGV4dC4gSXQgaXMgbW9zdAorICogdXNlZnVsIGZvciB1c2Ugd2l0aCBsZWdhY3kgZGF0YSBmb3JtYXRzIGFuZCBsZWdhY3kgZGlzcGxheSB0ZWNobm9sb2d5CisgKiAoc2ltcGxlIHRlcm1pbmFscykuIEFsbCBvcGVyYXRpb25zIGFyZSBwZXJmb3JtZWQgb24gVW5pY29kZSBjaGFyYWN0ZXJzLjwvcD4KKyAqCisgKiA8cD5UZXh0LWJhc2VkIHNoYXBpbmcgbWVhbnMgdGhhdCBzb21lIGNoYXJhY3RlciBjb2RlIHBvaW50cyBpbiB0aGUgdGV4dCBhcmUKKyAqIHJlcGxhY2VkIGJ5IG90aGVycyBkZXBlbmRpbmcgb24gdGhlIGNvbnRleHQuIEl0IHRyYW5zZm9ybXMgb25lIGtpbmQgb2YgdGV4dAorICogaW50byBhbm90aGVyLiBJbiBjb21wYXJpc29uLCBtb2Rlcm4gZGlzcGxheXMgZm9yIEFyYWJpYyB0ZXh0IHNlbGVjdAorICogYXBwcm9wcmlhdGUsIGNvbnRleHQtZGVwZW5kZW50IGZvbnQgZ2x5cGhzIGZvciBlYWNoIHRleHQgZWxlbWVudCwgd2hpY2ggbWVhbnMKKyAqIHRoYXQgdGhleSB0cmFuc2Zvcm0gdGV4dCBpbnRvIGEgZ2x5cGggdmVjdG9yLjwvcD4KKyAqCisgKiA8cD5UZXh0IHRyYW5zZm9ybWF0aW9ucyBhcmUgbmVjZXNzYXJ5IHdoZW4gbW9kZXJuIGRpc3BsYXkgdGVjaG5vbG9neSBpcyBub3QKKyAqIGF2YWlsYWJsZSBvciB3aGVuIHRleHQgbmVlZHMgdG8gYmUgdHJhbnNmb3JtZWQgdG8gb3IgZnJvbSBsZWdhY3kgZm9ybWF0cyB0aGF0CisgKiB1c2UgInNoYXBlZCIgY2hhcmFjdGVycy4gU2luY2UgdGhlIEFyYWJpYyBzY3JpcHQgaXMgY3Vyc2l2ZSwgY29ubmVjdGluZworICogYWRqYWNlbnQgbGV0dGVycyB0byBlYWNoIG90aGVyLCBjb21wdXRlcnMgc2VsZWN0IGltYWdlcyBmb3IgZWFjaCBsZXR0ZXIgYmFzZWQKKyAqIG9uIHRoZSBzdXJyb3VuZGluZyBsZXR0ZXJzLiBUaGlzIHVzdWFsbHkgcmVzdWx0cyBpbiBmb3VyIGltYWdlcyBwZXIgQXJhYmljCisgKiBsZXR0ZXI6IGluaXRpYWwsIG1pZGRsZSwgZmluYWwsIGFuZCBpc29sYXRlZCBmb3Jtcy4gSW4gVW5pY29kZSwgb24gdGhlIG90aGVyCisgKiBoYW5kLCBsZXR0ZXJzIGFyZSBub3JtYWxseSBzdG9yZWQgYWJzdHJhY3QsIGFuZCBhIGRpc3BsYXkgc3lzdGVtIGlzIGV4cGVjdGVkCisgKiB0byBzZWxlY3QgdGhlIG5lY2Vzc2FyeSBnbHlwaHMuIChUaGlzIG1ha2VzIHNlYXJjaGluZyBhbmQgb3RoZXIgdGV4dAorICogcHJvY2Vzc2luZyBlYXNpZXIgYmVjYXVzZSB0aGUgc2FtZSBsZXR0ZXIgaGFzIG9ubHkgb25lIGNvZGUuKSBJdCBpcyBwb3NzaWJsZQorICogdG8gbWltaWMgdGhpcyB3aXRoIHRleHQgdHJhbnNmb3JtYXRpb25zIGJlY2F1c2UgdGhlcmUgYXJlIGNoYXJhY3RlcnMgaW4KKyAqIFVuaWNvZGUgdGhhdCBhcmUgcmVuZGVyZWQgYXMgbGV0dGVycyB3aXRoIGEgc3BlY2lmaWMgc2hhcGUKKyAqIChvciBjdXJzaXZlIGNvbm5lY3Rpdml0eSkuIFRoZXkgd2VyZSBpbmNsdWRlZCBmb3IgaW50ZXJvcGVyYWJpbGl0eSB3aXRoCisgKiBsZWdhY3kgc3lzdGVtcyBhbmQgY29kZXBhZ2VzLCBhbmQgZm9yIHVuc29waGlzdGljYXRlZCBkaXNwbGF5IHN5c3RlbXMuPC9wPgorICoKKyAqIDxwPkEgc2Vjb25kIGtpbmQgb2YgdGV4dCB0cmFuc2Zvcm1hdGlvbnMgaXMgc3VwcG9ydGVkIGZvciBBcmFiaWMgZGlnaXRzOgorICogRm9yIGNvbXBhdGliaWxpdHkgd2l0aCBsZWdhY3kgY29kZXBhZ2VzIHRoYXQgb25seSBpbmNsdWRlIEV1cm9wZWFuIGRpZ2l0cywKKyAqIGl0IGlzIHBvc3NpYmxlIHRvIHJlcGxhY2Ugb25lIHNldCBvZiBkaWdpdHMgYnkgYW5vdGhlciwgY2hhbmdpbmcgdGhlCisgKiBjaGFyYWN0ZXIgY29kZSBwb2ludHMuIFRoZXNlIG9wZXJhdGlvbnMgY2FuIGJlIHBlcmZvcm1lZCBmb3IgZWl0aGVyCisgKiBBcmFiaWMtSW5kaWMgRGlnaXRzIChVKzA2NjAuLi5VKzA2NjkpIG9yIEVhc3Rlcm4gKEV4dGVuZGVkKSBBcmFiaWMtSW5kaWMKKyAqIGRpZ2l0cyAoVSswNmYwLi4uVSswNmY5KS48L3A+CisgKgorICogPHA+U29tZSByZXBsYWNlbWVudHMgbWF5IHJlc3VsdCBpbiBtb3JlIG9yIGZld2VyIGNoYXJhY3RlcnMgKGNvZGUgcG9pbnRzKS4KKyAqIEJ5IGRlZmF1bHQsIHRoaXMgbWVhbnMgdGhhdCB0aGUgZGVzdGluYXRpb24gYnVmZmVyIG1heSByZWNlaXZlIHRleHQgd2l0aCBhCisgKiBsZW5ndGggZGlmZmVyZW50IGZyb20gdGhlIHNvdXJjZSBsZW5ndGguIFNvbWUgbGVnYWN5IHN5c3RlbXMgcmVseSBvbiB0aGUKKyAqIGxlbmd0aCBvZiB0aGUgdGV4dCB0byBiZSBjb25zdGFudC4gVGhleSBleHBlY3QgZXh0cmEgc3BhY2VzIHRvIGJlIGFkZGVkCisgKiBvciBjb25zdW1lZCBlaXRoZXIgbmV4dCB0byB0aGUgYWZmZWN0ZWQgY2hhcmFjdGVyIG9yIGF0IHRoZSBlbmQgb2YgdGhlCisgKiB0ZXh0LjwvcD4KKyAqIEBzdGFibGUgSUNVIDIuMAorICoKKyAqIEBoaWRlCisgKi8KK3B1YmxpYyBjbGFzcyBBcmFiaWNTaGFwaW5nIHsKKyAgICBwcml2YXRlIGZpbmFsIGludCBvcHRpb25zOworICAgIHByaXZhdGUgYm9vbGVhbiBpc0xvZ2ljYWw7IC8vIGNvbnZlbmllbmNlCisgICAgcHJpdmF0ZSBib29sZWFuIHNwYWNlc1JlbGF0aXZlVG9UZXh0QmVnaW5FbmQ7CisgICAgcHJpdmF0ZSBjaGFyIHRhaWxDaGFyOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBBcmFiaWNTaGFwaW5nIFNIQVBFUiA9IG5ldyBBcmFiaWNTaGFwaW5nKAorICAgICAgICAgICAgQXJhYmljU2hhcGluZy5URVhUX0RJUkVDVElPTl9MT0dJQ0FMIHwKKyAgICAgICAgICAgIEFyYWJpY1NoYXBpbmcuTEVOR1RIX0ZJWEVEX1NQQUNFU19ORUFSIHwKKyAgICAgICAgICAgIEFyYWJpY1NoYXBpbmcuTEVUVEVSU19TSEFQRSB8CisgICAgICAgICAgICBBcmFiaWNTaGFwaW5nLkRJR0lUU19OT09QKTsKKworICAgIC8qKgorICAgICAqIENvbnZlcnQgYSByYW5nZSBvZiB0ZXh0IGluIHRoZSBzb3VyY2UgYXJyYXksIHB1dHRpbmcgdGhlIHJlc3VsdAorICAgICAqIGludG8gYSByYW5nZSBvZiB0ZXh0IGluIHRoZSBkZXN0aW5hdGlvbiBhcnJheSwgYW5kIHJldHVybiB0aGUgbnVtYmVyCisgICAgICogb2YgY2hhcmFjdGVycyB3cml0dGVuLgorICAgICAqCisgICAgICogQHBhcmFtIHNvdXJjZSBBbiBhcnJheSBjb250YWluaW5nIHRoZSBpbnB1dCB0ZXh0CisgICAgICogQHBhcmFtIHNvdXJjZVN0YXJ0IFRoZSBzdGFydCBvZiB0aGUgcmFuZ2Ugb2YgdGV4dCB0byBjb252ZXJ0CisgICAgICogQHBhcmFtIHNvdXJjZUxlbmd0aCBUaGUgbGVuZ3RoIG9mIHRoZSByYW5nZSBvZiB0ZXh0IHRvIGNvbnZlcnQKKyAgICAgKiBAcGFyYW0gZGVzdCBUaGUgZGVzdGluYXRpb24gYXJyYXkgdGhhdCB3aWxsIHJlY2VpdmUgdGhlIHJlc3VsdC4KKyAgICAgKiAgIEl0IG1heSBiZSA8Y29kZT5OVUxMPC9jb2RlPiBvbmx5IGlmICA8Y29kZT5kZXN0U2l6ZTwvY29kZT4gaXMgMC4KKyAgICAgKiBAcGFyYW0gZGVzdFN0YXJ0IFRoZSBzdGFydCBvZiB0aGUgcmFuZ2Ugb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlciB0byB1c2UuCisgICAgICogQHBhcmFtIGRlc3RTaXplIFRoZSBzaXplIChjYXBhY2l0eSkgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci4KKyAgICAgKiAgIElmIDxjb2RlPmRlc3RTaXplPC9jb2RlPiBpcyAwLCB0aGVuIG5vIG91dHB1dCBpcyBwcm9kdWNlZCwKKyAgICAgKiAgIGJ1dCB0aGUgbmVjZXNzYXJ5IGJ1ZmZlciBzaXplIGlzIHJldHVybmVkICgicHJlZmxpZ2h0aW5nIikuICBUaGlzCisgICAgICogICBkb2VzIG5vdCB2YWxpZGF0ZSB0aGUgdGV4dCBhZ2FpbnN0IHRoZSBvcHRpb25zLCBmb3IgZXhhbXBsZSwKKyAgICAgKiAgIGlmIGxldHRlcnMgYXJlIGJlaW5nIHVuc2hhcGVkLCBhbmQgc3BhY2VzIGFyZSBiZWluZyBjb25zdW1lZAorICAgICAqICAgZm9sbG93aW5nIGxhbWFsZWYsIHRoaXMgd2lsbCBub3QgZGV0ZWN0IGEgbGFtYWxlZiB3aXRob3V0IGEKKyAgICAgKiAgIGNvcnJlc3BvbmRpbmcgc3BhY2UuICBBbiBlcnJvciB3aWxsIGJlIHRocm93biB3aGVuIHRoZSBhY3R1YWwKKyAgICAgKiAgIGNvbnZlcnNpb24gaXMgYXR0ZW1wdGVkLgorICAgICAqIEByZXR1cm4gVGhlIG51bWJlciBvZiBjaGFycyB3cml0dGVuIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIuCisgICAgICogICBJZiBhbiBlcnJvciBvY2N1cnMsIHRoZW4gbm8gb3V0cHV0IHdhcyB3cml0dGVuLCBvciBpdCBtYXkgYmUKKyAgICAgKiAgIGluY29tcGxldGUuCisgICAgICogQHRocm93cyBBcmFiaWNTaGFwaW5nRXhjZXB0aW9uIGlmIHRoZSB0ZXh0IGNhbm5vdCBiZSBjb252ZXJ0ZWQgYWNjb3JkaW5nIHRvIHRoZSBvcHRpb25zLgorICAgICAqIEBzdGFibGUgSUNVIDIuMAorICAgICAqLworICAgIHB1YmxpYyBpbnQgc2hhcGUoY2hhcltdIHNvdXJjZSwgaW50IHNvdXJjZVN0YXJ0LCBpbnQgc291cmNlTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgY2hhcltdIGRlc3QsIGludCBkZXN0U3RhcnQsIGludCBkZXN0U2l6ZSkgdGhyb3dzIEFyYWJpY1NoYXBpbmdFeGNlcHRpb24geworICAgICAgICBpZiAoc291cmNlID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInNvdXJjZSBjYW4gbm90IGJlIG51bGwiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc291cmNlU3RhcnQgPCAwIHx8IHNvdXJjZUxlbmd0aCA8IDAgfHwgc291cmNlU3RhcnQgKyBzb3VyY2VMZW5ndGggPiBzb3VyY2UubGVuZ3RoKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJiYWQgc291cmNlIHN0YXJ0ICgiICsgc291cmNlU3RhcnQgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKSBvciBsZW5ndGggKCIgKyBzb3VyY2VMZW5ndGggKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKSBmb3IgYnVmZmVyIG9mIGxlbmd0aCAiICsgc291cmNlLmxlbmd0aCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRlc3QgPT0gbnVsbCAmJiBkZXN0U2l6ZSAhPSAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJudWxsIGRlc3QgcmVxdWlyZXMgZGVzdFNpemUgPT0gMCIpOworICAgICAgICB9CisgICAgICAgIGlmICgoZGVzdFNpemUgIT0gMCkgJiYKKyAgICAgICAgICAgIChkZXN0U3RhcnQgPCAwIHx8IGRlc3RTaXplIDwgMCB8fCBkZXN0U3RhcnQgKyBkZXN0U2l6ZSA+IGRlc3QubGVuZ3RoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiYmFkIGRlc3Qgc3RhcnQgKCIgKyBkZXN0U3RhcnQgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKSBvciBzaXplICgiICsgZGVzdFNpemUgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKSBmb3IgYnVmZmVyIG9mIGxlbmd0aCAiICsgZGVzdC5sZW5ndGgpOworICAgICAgICB9CisgICAgICAgIC8qIFZhbGlkYXRlIGlucHV0IG9wdGlvbnMgKi8KKyAgICAgICAgaWYgKCAoKG9wdGlvbnMmVEFTSEtFRUxfTUFTSykgPiAwKSAmJgorICAgICAgICAgICAgICEoKChvcHRpb25zICYgVEFTSEtFRUxfTUFTSyk9PVRBU0hLRUVMX0JFR0lOKSAgfHwKKyAgICAgICAgICAgICAgICgob3B0aW9ucyAmIFRBU0hLRUVMX01BU0spPT1UQVNIS0VFTF9FTkQgKSAgIHx8CisgICAgICAgICAgICAgICAoKG9wdGlvbnMgJiBUQVNIS0VFTF9NQVNLKT09VEFTSEtFRUxfUkVTSVpFICl8fAorICAgICAgICAgICAgICAgKChvcHRpb25zICYgVEFTSEtFRUxfTUFTSyk9PVRBU0hLRUVMX1JFUExBQ0VfQllfVEFUV0VFTCkpICl7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJXcm9uZyBUYXNoa2VlbCBhcmd1bWVudCIpOworICAgICAgICB9CisKKyAgICAgICAvLy9DTE9WRVI6T0ZGCisgICAgICAgLy9BY2NvcmRpbmcgdG8gU3RldmVuIExvb21pcywgdGhlIGNvZGUgaXMgdW5yZWFjaGFibGUgd2hlbiB5b3UgT1IgYWxsIHRoZSBjb25zdGFudHMgd2l0aGluIHRoZSBpZiBzdGF0ZW1lbnRzCisgICAgICAgaWYoKChvcHRpb25zJkxBTUFMRUZfTUFTSykgPiAwKSYmCisgICAgICAgICAgICAgICEoKChvcHRpb25zICYgTEFNQUxFRl9NQVNLKT09TEFNQUxFRl9CRUdJTikgIHx8CisgICAgICAgICAgICAgICAgKChvcHRpb25zICYgTEFNQUxFRl9NQVNLKT09TEFNQUxFRl9FTkQgKSAgIHx8CisgICAgICAgICAgICAgICAgKChvcHRpb25zICYgTEFNQUxFRl9NQVNLKT09TEFNQUxFRl9SRVNJWkUgKXx8CisgICAgICAgICAgICAgICAgICgob3B0aW9ucyAmIExBTUFMRUZfTUFTSyk9PUxBTUFMRUZfQVVUTykgIHx8CisgICAgICAgICAgICAgICAgICgob3B0aW9ucyAmIExBTUFMRUZfTUFTSyk9PUxBTUFMRUZfTkVBUikpKXsKKyAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiV3JvbmcgTGFtIEFsZWYgYXJndW1lbnQiKTsKKyAgICAgICB9CisgICAgICAgLy8vQ0xPVkVSOk9OCisKKyAgICAgICAvKiBWYWxpZGF0ZSBUYXNoa2VlbCAoVGFzaGtlZWwgcmVwbGFjZW1lbnQgb3B0aW9ucyBzaG91bGQgYmUgZW5hYmxlZCBpbiBzaGFwaW5nIG1vZGUgb25seSkqLworICAgICAgIGlmKCgob3B0aW9ucyZUQVNIS0VFTF9NQVNLKSA+IDApICYmIChvcHRpb25zJkxFVFRFUlNfTUFTSykgPT0gTEVUVEVSU19VTlNIQVBFKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUYXNoa2VlbCByZXBsYWNlbWVudCBzaG91bGQgbm90IGJlIGVuYWJsZWQgaW4gZGVzaGFwaW5nIG1vZGUgIik7CisgICAgICAgfQorICAgICAgIHJldHVybiBpbnRlcm5hbFNoYXBlKHNvdXJjZSwgc291cmNlU3RhcnQsIHNvdXJjZUxlbmd0aCwgZGVzdCwgZGVzdFN0YXJ0LCBkZXN0U2l6ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVydCBhIHJhbmdlIG9mIHRleHQgaW4gcGxhY2UuICBUaGlzIG1heSBvbmx5IGJlIHVzZWQgaWYgdGhlIExlbmd0aCBvcHRpb24KKyAgICAgKiBkb2VzIG5vdCBncm93IG9yIHNocmluayB0aGUgdGV4dC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzb3VyY2UgQW4gYXJyYXkgY29udGFpbmluZyB0aGUgaW5wdXQgdGV4dAorICAgICAqIEBwYXJhbSBzdGFydCBUaGUgc3RhcnQgb2YgdGhlIHJhbmdlIG9mIHRleHQgdG8gY29udmVydAorICAgICAqIEBwYXJhbSBsZW5ndGggVGhlIGxlbmd0aCBvZiB0aGUgcmFuZ2Ugb2YgdGV4dCB0byBjb252ZXJ0CisgICAgICogQHRocm93cyBBcmFiaWNTaGFwaW5nRXhjZXB0aW9uIGlmIHRoZSB0ZXh0IGNhbm5vdCBiZSBjb252ZXJ0ZWQgYWNjb3JkaW5nIHRvIHRoZSBvcHRpb25zLgorICAgICAqIEBzdGFibGUgSUNVIDIuMAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNoYXBlKGNoYXJbXSBzb3VyY2UsIGludCBzdGFydCwgaW50IGxlbmd0aCkgdGhyb3dzIEFyYWJpY1NoYXBpbmdFeGNlcHRpb24geworICAgICAgICBpZiAoKG9wdGlvbnMgJiBMQU1BTEVGX01BU0spID09IExBTUFMRUZfUkVTSVpFKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQXJhYmljU2hhcGluZ0V4Y2VwdGlvbigiQ2Fubm90IHNoYXBlIGluIHBsYWNlIHdpdGggbGVuZ3RoIG9wdGlvbiByZXNpemUuIik7CisgICAgICAgIH0KKyAgICAgICAgc2hhcGUoc291cmNlLCBzdGFydCwgbGVuZ3RoLCBzb3VyY2UsIHN0YXJ0LCBsZW5ndGgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlcnQgYSBzdHJpbmcsIHJldHVybmluZyB0aGUgbmV3IHN0cmluZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0ZXh0IHRoZSBzdHJpbmcgdG8gY29udmVydAorICAgICAqIEByZXR1cm4gdGhlIGNvbnZlcnRlZCBzdHJpbmcKKyAgICAgKiBAdGhyb3dzIEFyYWJpY1NoYXBpbmdFeGNlcHRpb24gaWYgdGhlIHN0cmluZyBjYW5ub3QgYmUgY29udmVydGVkIGFjY29yZGluZyB0byB0aGUgb3B0aW9ucy4KKyAgICAgKiBAc3RhYmxlIElDVSAyLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHNoYXBlKFN0cmluZyB0ZXh0KSB0aHJvd3MgQXJhYmljU2hhcGluZ0V4Y2VwdGlvbiB7CisgICAgICAgIGNoYXJbXSBzcmMgPSB0ZXh0LnRvQ2hhckFycmF5KCk7CisgICAgICAgIGNoYXJbXSBkZXN0ID0gc3JjOworICAgICAgICBpZiAoKChvcHRpb25zICYgTEFNQUxFRl9NQVNLKSA9PSBMQU1BTEVGX1JFU0laRSkgJiYKKyAgICAgICAgICAgICgob3B0aW9ucyAmIExFVFRFUlNfTUFTSykgPT0gTEVUVEVSU19VTlNIQVBFKSkgeworCisgICAgICAgICAgICBkZXN0ID0gbmV3IGNoYXJbc3JjLmxlbmd0aCAqIDJdOyAvLyBtYXgKKyAgICAgICAgfQorICAgICAgICBpbnQgbGVuID0gc2hhcGUoc3JjLCAwLCBzcmMubGVuZ3RoLCBkZXN0LCAwLCBkZXN0Lmxlbmd0aCk7CisKKyAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoZGVzdCwgMCwgbGVuKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgQXJhYmljU2hhcGluZyB1c2luZyB0aGUgb3B0aW9ucyBmbGFncy4KKyAgICAgKiBUaGUgZmxhZ3MgYXJlIGFzIGZvbGxvd3M6PGJyPgorICAgICAqICdMRU5HVEgnIGZsYWdzIGNvbnRyb2wgd2hldGhlciB0aGUgdGV4dCBjYW4gY2hhbmdlIHNpemUsIGFuZCBpZiBub3QsCisgICAgICogaG93IHRvIG1haW50YWluIHRoZSBzaXplIG9mIHRoZSB0ZXh0IHdoZW4gTGFtQWxlZiBsaWdhdHVyZXMgYXJlCisgICAgICogZm9ybWVkIG9yIGJyb2tlbi48YnI+CisgICAgICogJ1RFWFRfRElSRUNUSU9OJyBmbGFncyBjb250cm9sIHdoZXRoZXIgdGhlIHRleHQgaXMgcmVhZCBhbmQgd3JpdHRlbgorICAgICAqIGluIHZpc3VhbCBvcmRlciBvciBpbiBsb2dpY2FsIG9yZGVyLjxicj4KKyAgICAgKiAnTEVUVEVSU19TSEFQRScgZmxhZ3MgY29udHJvbCB3aGV0aGVyIGNvbnZlcnNpb24gaXMgdG8gb3IgZnJvbQorICAgICAqIHByZXNlbnRhdGlvbiBmb3Jtcy48YnI+CisgICAgICogJ0RJR0lUUycgZmxhZ3MgY29udHJvbCB3aGV0aGVyIGRpZ2l0cyBhcmUgc2hhcGVkLCBhbmQgd2hldGhlciBmcm9tCisgICAgICogRXVyb3BlYW4gdG8gQXJhYmljLUluZGljIG9yIHZpY2UtdmVyc2EuPGJyPgorICAgICAqICdESUdJVF9UWVBFJyBmbGFncyBjb250cm9sIHdoZXRoZXIgc3RhbmRhcmQgb3IgZXh0ZW5kZWQgQXJhYmljLUluZGljCisgICAgICogZGlnaXRzIGFyZSB1c2VkIHdoZW4gcGVyZm9ybWluZyBkaWdpdCBjb252ZXJzaW9uLgorICAgICAqIEBzdGFibGUgSUNVIDIuMAorICAgICAqLworICAgIHB1YmxpYyBBcmFiaWNTaGFwaW5nKGludCBvcHRpb25zKSB7CisgICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7CisgICAgICAgIGlmICgob3B0aW9ucyAmIERJR0lUU19NQVNLKSA+IDB4ODApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImJhZCBESUdJVFMgb3B0aW9ucyIpOworICAgICAgICB9CisKKyAgICAgICAgaXNMb2dpY2FsID0gKCAob3B0aW9ucyAmIFRFWFRfRElSRUNUSU9OX01BU0spID09IFRFWFRfRElSRUNUSU9OX0xPR0lDQUwgKTsKKyAgICAgICAgLyogVmFsaWRhdGUgb3B0aW9ucyAqLworICAgICAgICBzcGFjZXNSZWxhdGl2ZVRvVGV4dEJlZ2luRW5kID0gKCAob3B0aW9ucyAmIFNQQUNFU19SRUxBVElWRV9UT19URVhUX01BU0spID09IFNQQUNFU19SRUxBVElWRV9UT19URVhUX0JFR0lOX0VORCApOworICAgICAgICBpZiAoIChvcHRpb25zJlNIQVBFX1RBSUxfVFlQRV9NQVNLKSA9PSBTSEFQRV9UQUlMX05FV19VTklDT0RFKXsKKyAgICAgICAgICAgIHRhaWxDaGFyID0gTkVXX1RBSUxfQ0hBUjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRhaWxDaGFyID0gT0xEX1RBSUxfQ0hBUjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIFNlZW4gVGFpbCBvcHRpb25zICovCisgICAgLyoqCisgICAgICogTWVtb3J5IG9wdGlvbjogdGhlIHJlc3VsdCBtdXN0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoIGFzIHRoZSBzb3VyY2UuCisgICAgICogU2hhcGluZyBtb2RlOiBUaGUgU0VFTiBmYW1pbHkgY2hhcmFjdGVyIHdpbGwgZXhwYW5kIGludG8gdHdvIGNoYXJhY3RlcnMgdXNpbmcgc3BhY2UgbmVhcgorICAgICAqICAgICAgICAgICAgICAgdGhlIFNFRU4gZmFtaWx5IGNoYXJhY3RlcihpLmUuIHRoZSBzcGFjZSBhZnRlciB0aGUgY2hhcmFjdGVyKS4KKyAgICAgKiAgICAgICAgICAgICAgIGlmIHRoZXJlIGFyZSBubyBzcGFjZXMgZm91bmQsIEFyYWJpY1NoYXBpbmdFeGNlcHRpb24gd2lsbCBiZSB0aHJvd24KKyAgICAgKgorICAgICAqIERlLXNoYXBpbmcgbW9kZTogQW55IFNlZW4gY2hhcmFjdGVyIGZvbGxvd2VkIGJ5IFRhaWwgY2hhcmFjdGVyIHdpbGwgYmUKKyAgICAgKiAgICAgICAgICAgICAgICAgIHJlcGxhY2VkIGJ5IG9uZSBjZWxsIFNlZW4gYW5kIGEgc3BhY2Ugd2lsbCByZXBsYWNlIHRoZSBUYWlsLgorICAgICAqIEFmZmVjdHM6IFNlZW4gb3B0aW9ucworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFRU5fVFdPQ0VMTF9ORUFSID0gMHgyMDAwMDA7CisKKyAgICAvKiogQml0IG1hc2sgZm9yIFNlZW4gbWVtb3J5IG9wdGlvbnMuICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VFTl9NQVNLID0gMHg3MDAwMDA7CisKKyAgICAvKiBZZWhIYW16YSBvcHRpb25zICovCisgICAgLyoqCisgICAgICogTWVtb3J5IG9wdGlvbjogdGhlIHJlc3VsdCBtdXN0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoIGFzIHRoZSBzb3VyY2UuCisgICAgICogU2hhcGluZyBtb2RlOiBUaGUgWUVISEFNWkEgY2hhcmFjdGVyIHdpbGwgZXhwYW5kIGludG8gdHdvIGNoYXJhY3RlcnMgdXNpbmcgc3BhY2UgbmVhciBpdAorICAgICAqICAgICAgICAgICAgICAoaS5lLiB0aGUgc3BhY2UgYWZ0ZXIgdGhlIGNoYXJhY3RlcikKKyAgICAgKiAgICAgICAgICAgICAgIGlmIHRoZXJlIGFyZSBubyBzcGFjZXMgZm91bmQsIEFyYWJpY1NoYXBpbmdFeGNlcHRpb24gd2lsbCBiZSB0aHJvd24KKyAgICAgKgorICAgICAqIERlLXNoYXBpbmcgbW9kZTogQW55IFllaCAoZmluYWwgb3IgaXNvbGF0ZWQpIGNoYXJhY3RlciBmb2xsb3dlZCBieSBIYW16YSBjaGFyYWN0ZXIgd2lsbCBiZQorICAgICAqICAgICAgICAgICAgICAgICAgcmVwbGFjZWQgYnkgb25lIGNlbGwgWWVoSGFtemEgYW5kIHNwYWNlIHdpbGwgcmVwbGFjZSB0aGUgSGFtemEuCisgICAgICogQWZmZWN0czogWWVoSGFtemEgb3B0aW9ucworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFlFSEhBTVpBX1RXT0NFTExfTkVBUiAgPSAweDEwMDAwMDA7CisKKworICAgIC8qKiBCaXQgbWFzayBmb3IgWWVoSGFtemEgbWVtb3J5IG9wdGlvbnMuICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWUVISEFNWkFfTUFTSyA9IDB4MzgwMDAwMDsKKworICAgIC8qIE5ldyBUYXNoa2VlbCBvcHRpb25zICovCisgICAgLyoqCisgICAgICogTWVtb3J5IG9wdGlvbjogdGhlIHJlc3VsdCBtdXN0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoIGFzIHRoZSBzb3VyY2UuCisgICAgICogU2hhcGluZyBtb2RlOiBUYXNoa2VlbCBjaGFyYWN0ZXJzIHdpbGwgYmUgcmVwbGFjZWQgYnkgc3BhY2VzLgorICAgICAqICAgICAgICAgICAgICAgU3BhY2VzIHdpbGwgYmUgcGxhY2VkIGF0IGJlZ2lubmluZyBvZiB0aGUgYnVmZmVyCisgICAgICoKKyAgICAgKiBEZS1zaGFwaW5nIG1vZGU6IE4vQQorICAgICAqIEFmZmVjdHM6IFRhc2hrZWVsIG9wdGlvbnMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUQVNIS0VFTF9CRUdJTiA9IDB4NDAwMDA7CisKKyAgICAvKioKKyAgICAgKiBNZW1vcnkgb3B0aW9uOiB0aGUgcmVzdWx0IG11c3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGggYXMgdGhlIHNvdXJjZS4KKyAgICAgKiBTaGFwaW5nIG1vZGU6IFRhc2hrZWVsIGNoYXJhY3RlcnMgd2lsbCBiZSByZXBsYWNlZCBieSBzcGFjZXMuCisgICAgICogICAgICAgICAgICAgICBTcGFjZXMgd2lsbCBiZSBwbGFjZWQgYXQgZW5kIG9mIHRoZSBidWZmZXIKKyAgICAgKgorICAgICAqIERlLXNoYXBpbmcgbW9kZTogTi9BCisgICAgICogQWZmZWN0czogVGFzaGtlZWwgb3B0aW9ucworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRBU0hLRUVMX0VORCA9IDB4NjAwMDA7CisKKyAgICAvKioKKyAgICAgKiBNZW1vcnkgb3B0aW9uOiBhbGxvdyB0aGUgcmVzdWx0IHRvIGhhdmUgYSBkaWZmZXJlbnQgbGVuZ3RoIHRoYW4gdGhlIHNvdXJjZS4KKyAgICAgKiBTaGFwaW5nIG1vZGU6IFRhc2hrZWVsIGNoYXJhY3RlcnMgd2lsbCBiZSByZW1vdmVkLCBidWZmZXIgbGVuZ3RoIHdpbGwgc2hyaW5rLgorICAgICAqIERlLXNoYXBpbmcgbW9kZTogTi9BCisgICAgICoKKyAgICAgKiBBZmZlY3RzOiBUYXNoa2VlbCBvcHRpb25zCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEFTSEtFRUxfUkVTSVpFID0gMHg4MDAwMDsKKworICAgIC8qKgorICAgICAqIE1lbW9yeSBvcHRpb246IHRoZSByZXN1bHQgbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aCBhcyB0aGUgc291cmNlLgorICAgICAqIFNoYXBpbmcgbW9kZTogVGFzaGtlZWwgY2hhcmFjdGVycyB3aWxsIGJlIHJlcGxhY2VkIGJ5IFRhdHdlZWwgaWYgaXQgaXMgY29ubmVjdGVkIHRvIGFkamFjZW50CisgICAgICogICAgICAgICAgICAgICBjaGFyYWN0ZXJzIChpLmUuIHNoYXBlZCBvbiBUYXR3ZWVsKSBvciByZXBsYWNlZCBieSBzcGFjZSBpZiBpdCBpcyBub3QgY29ubmVjdGVkLgorICAgICAqCisgICAgICogRGUtc2hhcGluZyBtb2RlOiBOL0EKKyAgICAgKiBBZmZlY3RzOiBZZWhIYW16YSBvcHRpb25zCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEFTSEtFRUxfUkVQTEFDRV9CWV9UQVRXRUVMID0gMHhDMDAwMDsKKworICAgIC8qKiBCaXQgbWFzayBmb3IgVGFzaGtlZWwgcmVwbGFjZW1lbnQgd2l0aCBTcGFjZSBvciBUYXR3ZWVsIG1lbW9yeSBvcHRpb25zLiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRBU0hLRUVMX01BU0sgID0gMHhFMDAwMDsKKworICAgIC8qIFNwYWNlIGxvY2F0aW9uIENvbnRyb2wgb3B0aW9ucyAqLworICAgIC8qKgorICAgICAqIFRoaXMgb3B0aW9uIGVmZmVjdHMgdGhlIG1lYW5pbmcgb2YgQkVHSU4gYW5kIEVORCBvcHRpb25zLiBpZiB0aGlzIG9wdGlvbiBpcyBub3QgdXNlZCB0aGUgZGVmYXVsdAorICAgICAqIGZvciBCRUdJTiBhbmQgRU5EIHdpbGwgYmUgYXMgZm9sbG93aW5nOgorICAgICAqIFRoZSBEZWZhdWx0IChmb3IgYm90aCBWaXN1YWwgTFRSLCBWaXN1YWwgUlRMIGFuZCBMb2dpY2FsIFRleHQpCisgICAgICogICAgICAgICAgIDEuIEJFR0lOIGFsd2F5cyByZWZlcnMgdG8gdGhlIHN0YXJ0IGFkZHJlc3Mgb2YgcGh5c2ljYWwgbWVtb3J5LgorICAgICAqICAgICAgICAgICAyLiBFTkQgYWx3YXlzIHJlZmVycyB0byB0aGUgZW5kIGFkZHJlc3Mgb2YgcGh5c2ljYWwgbWVtb3J5LgorICAgICAqCisgICAgICogSWYgdGhpcyBvcHRpb24gaXMgdXNlZCBpdCB3aWxsIHN3YXAgdGhlIG1lYW5pbmcgb2YgQkVHSU4gYW5kIEVORCBvbmx5IGZvciBWaXN1YWwgTFRSIHRleHQuCisgICAgICoKKyAgICAgKiBUaGUgYWZmZWN0IG9uIEJFR0lOIGFuZCBFTkQgTWVtb3J5IE9wdGlvbnMgd2lsbCBiZSBhcyBmb2xsb3dpbmc6CisgICAgICogICAgQS4gQkVHSU4gRm9yIFZpc3VhbCBMVFIgdGV4dDogVGhpcyB3aWxsIGJlIHRoZSBiZWdpbm5pbmcgKHJpZ2h0IHNpZGUpIG9mIHRoZSB2aXN1YWwgdGV4dAorICAgICAqICAgICAgIChjb3JyZXNwb25kaW5nIHRvIHRoZSBwaHlzaWNhbCBtZW1vcnkgYWRkcmVzcyBlbmQsIHNhbWUgYXMgRU5EIGluIGRlZmF1bHQgYmVoYXZpb3IpCisgICAgICogICAgQi4gQkVHSU4gRm9yIExvZ2ljYWwgdGV4dDogU2FtZSBhcyBCRUdJTiBpbiBkZWZhdWx0IGJlaGF2aW9yLgorICAgICAqICAgIEMuIEVORCBGb3IgVmlzdWFsIExUUiB0ZXh0OiBUaGlzIHdpbGwgYmUgdGhlIGVuZCAobGVmdCBzaWRlKSBvZiB0aGUgdmlzdWFsIHRleHQuIChjb3JyZXNwb25kaW5nIHRvCisgICAgICogICAgICB0aGUgcGh5c2ljYWwgbWVtb3J5IGFkZHJlc3MgYmVnaW5uaW5nLCBzYW1lIGFzIEJFR0lOIGluIGRlZmF1bHQgYmVoYXZpb3IpCisgICAgICogICAgRC4gRU5EIEZvciBMb2dpY2FsIHRleHQ6IFNhbWUgYXMgRU5EIGluIGRlZmF1bHQgYmVoYXZpb3IuCisgICAgICogQWZmZWN0czogQWxsIExhbUFsZWYgQkVHSU4sIEVORCBhbmQgQVVUTyBvcHRpb25zLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNQQUNFU19SRUxBVElWRV9UT19URVhUX0JFR0lOX0VORCA9IDB4NDAwMDAwMDsKKworICAgIC8qKiBCaXQgbWFzayBmb3Igc3dhcHBpbmcgQkVHSU4gYW5kIEVORCBmb3IgVmlzdWFsIExUUiB0ZXh0ICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1BBQ0VTX1JFTEFUSVZFX1RPX1RFWFRfTUFTSyA9IDB4NDAwMDAwMDsKKworICAgIC8qKgorICAgICAqIElmIHRoaXMgb3B0aW9uIGlzIHVzZWQsIHNoYXBpbmcgd2lsbCB1c2UgdGhlIG5ldyBVbmljb2RlIGNvZGUgcG9pbnQgZm9yIFRBSUwgKGkuZS4gMHhGRTczKS4KKyAgICAgKiBJZiB0aGlzIG9wdGlvbiBpcyBub3Qgc3BlY2lmaWVkIChEZWZhdWx0KSwgb2xkIHVub2ZmaWNpYWwgVW5pY29kZSBUQUlMIGNvZGUgcG9pbnQgaXMgdXNlZCAoaS5lLiAweDIwMEIpCisgICAgICogRGUtc2hhcGluZyB3aWxsIG5vdCB1c2UgdGhpcyBvcHRpb24gYXMgaXQgd2lsbCBhbHdheXMgc2VhcmNoIGZvciBib3RoIHRoZSBuZXcgVW5pY29kZSBjb2RlIHBvaW50IGZvciB0aGUKKyAgICAgKiBUQUlMIChpLmUuIDB4RkU3Mykgb3IgdGhlIG9sZCB1bm9mZmljaWFsIFVuaWNvZGUgVEFJTCBjb2RlIHBvaW50IChpLmUuIDB4MjAwQikgYW5kIGRlLXNoYXBlIHRoZQorICAgICAqIFNlZW4tRmFtaWx5IGxldHRlciBhY2NvcmRpbmdseS4KKyAgICAgKgorICAgICAqIFNoYXBpbmcgTW9kZTogT25seSBzaGFwaW5nLgorICAgICAqIERlLXNoYXBpbmcgTW9kZTogTi9BLgorICAgICAqIEFmZmVjdHM6IEFsbCBTZWVuIG9wdGlvbnMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSEFQRV9UQUlMX05FV19VTklDT0RFID0gMHg4MDAwMDAwOworCisgICAgLyoqIEJpdCBtYXNrIGZvciBuZXcgVW5pY29kZSBUYWlsIG9wdGlvbiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNIQVBFX1RBSUxfVFlQRV9NQVNLID0gMHg4MDAwMDAwOworCisgICAgLyoqCisgICAgICogTWVtb3J5IG9wdGlvbjogYWxsb3cgdGhlIHJlc3VsdCB0byBoYXZlIGEgZGlmZmVyZW50IGxlbmd0aCB0aGFuIHRoZSBzb3VyY2UuCisgICAgICogQHN0YWJsZSBJQ1UgMi4wCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTEVOR1RIX0dST1dfU0hSSU5LID0gMDsKKworICAgIC8qKgorICAgICAqIE1lbW9yeSBvcHRpb246IGFsbG93IHRoZSByZXN1bHQgdG8gaGF2ZSBhIGRpZmZlcmVudCBsZW5ndGggdGhhbiB0aGUgc291cmNlLgorICAgICAqIEFmZmVjdHM6IExhbUFsZWYgb3B0aW9ucworICAgICAqIFRoaXMgb3B0aW9uIGlzIGFuIGFsaWFzIHRvIExFTkdUSF9HUk9XX1NIUklOSworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExBTUFMRUZfUkVTSVpFICAgPSAwOworCisgICAgLyoqCisgICAgICogTWVtb3J5IG9wdGlvbjogdGhlIHJlc3VsdCBtdXN0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoIGFzIHRoZSBzb3VyY2UuCisgICAgICogSWYgbW9yZSByb29tIGlzIG5lY2Vzc2FyeSwgdGhlbiB0cnkgdG8gY29uc3VtZSBzcGFjZXMgbmV4dCB0byBtb2RpZmllZCBjaGFyYWN0ZXJzLgorICAgICAqIEBzdGFibGUgSUNVIDIuMAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExFTkdUSF9GSVhFRF9TUEFDRVNfTkVBUiA9IDE7CisKKyAgICAvKioKKyAgICAgKiBNZW1vcnkgb3B0aW9uOiB0aGUgcmVzdWx0IG11c3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGggYXMgdGhlIHNvdXJjZS4KKyAgICAgKiBJZiBtb3JlIHJvb20gaXMgbmVjZXNzYXJ5LCB0aGVuIHRyeSB0byBjb25zdW1lIHNwYWNlcyBuZXh0IHRvIG1vZGlmaWVkIGNoYXJhY3RlcnMuCisgICAgICogQWZmZWN0czogTGFtQWxlZiBvcHRpb25zCisgICAgICogVGhpcyBvcHRpb24gaXMgYW4gYWxpYXMgdG8gTEVOR1RIX0ZJWEVEX1NQQUNFU19ORUFSCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTEFNQUxFRl9ORUFSID0gMSA7CisKKyAgICAvKioKKyAgICAgKiBNZW1vcnkgb3B0aW9uOiB0aGUgcmVzdWx0IG11c3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGggYXMgdGhlIHNvdXJjZS4KKyAgICAgKiBJZiBtb3JlIHJvb20gaXMgbmVjZXNzYXJ5LCB0aGVuIHRyeSB0byBjb25zdW1lIHNwYWNlcyBhdCB0aGUgZW5kIG9mIHRoZSB0ZXh0LgorICAgICAqIEBzdGFibGUgSUNVIDIuMAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExFTkdUSF9GSVhFRF9TUEFDRVNfQVRfRU5EID0gMjsKKworCisgICAgLyoqCisgICAgICogTWVtb3J5IG9wdGlvbjogdGhlIHJlc3VsdCBtdXN0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoIGFzIHRoZSBzb3VyY2UuCisgICAgICogSWYgbW9yZSByb29tIGlzIG5lY2Vzc2FyeSwgdGhlbiB0cnkgdG8gY29uc3VtZSBzcGFjZXMgYXQgdGhlIGVuZCBvZiB0aGUgdGV4dC4KKyAgICAgKiBBZmZlY3RzOiBMYW1BbGVmIG9wdGlvbnMKKyAgICAgKiBUaGlzIG9wdGlvbiBpcyBhbiBhbGlhcyB0byBMRU5HVEhfRklYRURfU1BBQ0VTX0FUX0VORAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExBTUFMRUZfRU5EID0gMjsKKworICAgIC8qKgorICAgICAqIE1lbW9yeSBvcHRpb246IHRoZSByZXN1bHQgbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aCBhcyB0aGUgc291cmNlLgorICAgICAqIElmIG1vcmUgcm9vbSBpcyBuZWNlc3NhcnksIHRoZW4gdHJ5IHRvIGNvbnN1bWUgc3BhY2VzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHRleHQuCisgICAgICogQHN0YWJsZSBJQ1UgMi4wCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTEVOR1RIX0ZJWEVEX1NQQUNFU19BVF9CRUdJTk5JTkcgPSAzOworCisgICAgLyoqCisgICAgICogTWVtb3J5IG9wdGlvbjogdGhlIHJlc3VsdCBtdXN0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoIGFzIHRoZSBzb3VyY2UuCisgICAgICogSWYgbW9yZSByb29tIGlzIG5lY2Vzc2FyeSwgdGhlbiB0cnkgdG8gY29uc3VtZSBzcGFjZXMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgdGV4dC4KKyAgICAgKiBBZmZlY3RzOiBMYW1BbGVmIG9wdGlvbnMKKyAgICAgKiBUaGlzIG9wdGlvbiBpcyBhbiBhbGlhcyB0byBMRU5HVEhfRklYRURfU1BBQ0VTX0FUX0JFR0lOTklORworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExBTUFMRUZfQkVHSU4gPSAzOworCisgICAgLyoqCisgICAgICogTWVtb3J5IG9wdGlvbjogdGhlIHJlc3VsdCBtdXN0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoIGFzIHRoZSBzb3VyY2UuCisgICAgICogU2hhcGluZyBNb2RlOiBGb3IgZWFjaCBMQU1BTEVGIGNoYXJhY3RlciBmb3VuZCwgZXhwYW5kIExBTUFMRUYgdXNpbmcgc3BhY2UgYXQgZW5kLgorICAgICAqICAgICAgICAgICAgICAgSWYgdGhlcmUgaXMgbm8gc3BhY2UgYXQgZW5kLCB1c2Ugc3BhY2VzIGF0IGJlZ2lubmluZyBvZiB0aGUgYnVmZmVyLiBJZiB0aGVyZQorICAgICAqICAgICAgICAgICAgICAgaXMgbm8gc3BhY2UgYXQgYmVnaW5uaW5nIG9mIHRoZSBidWZmZXIsIHVzZSBzcGFjZXMgYXQgdGhlIG5lYXIgKGkuZS4gdGhlIHNwYWNlCisgICAgICogICAgICAgICAgICAgICBhZnRlciB0aGUgTEFNQUxFRiBjaGFyYWN0ZXIpLgorICAgICAqCisgICAgICogRGVzaGFwaW5nIE1vZGU6IFBlcmZvcm0gdGhlIHNhbWUgZnVuY3Rpb24gYXMgdGhlIGZsYWcgZXF1YWxzIExBTUFMRUZfRU5ELgorICAgICAqIEFmZmVjdHM6IExhbUFsZWYgb3B0aW9ucworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExBTUFMRUZfQVVUTyAgPSAweDEwMDAwOworCisgICAgLyoqCisgICAgICogQml0IG1hc2sgZm9yIG1lbW9yeSBvcHRpb25zLgorICAgICAqIEBzdGFibGUgSUNVIDIuMAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExFTkdUSF9NQVNLID0gMHgxMDAwMzsKKworICAgIC8qKiBCaXQgbWFzayBmb3IgTGFtQWxlZiBtZW1vcnkgb3B0aW9ucy4gKi8KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExBTUFMRUZfTUFTSyAgPSAweDEwMDAzOworCisgICAgLyoqCisgICAgICogRGlyZWN0aW9uIGluZGljYXRvcjogdGhlIHNvdXJjZSBpcyBpbiBsb2dpY2FsIChrZXlib2FyZCkgb3JkZXIuCisgICAgICogQHN0YWJsZSBJQ1UgMi4wCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEVYVF9ESVJFQ1RJT05fTE9HSUNBTCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBEaXJlY3Rpb24gaW5kaWNhdG9yOnRoZSBzb3VyY2UgaXMgaW4gdmlzdWFsIFJUTCBvcmRlciwKKyAgICAgKiB0aGUgcmlnaHRtb3N0IGRpc3BsYXllZCBjaGFyYWN0ZXIgc3RvcmVkIGZpcnN0LgorICAgICAqIFRoaXMgb3B0aW9uIGlzIGFuIGFsaWFzIHRvIFVfU0hBUEVfVEVYVF9ESVJFQ1RJT05fTE9HSUNBTAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRFWFRfRElSRUNUSU9OX1ZJU1VBTF9SVEwgPSAwOworCisgICAgLyoqCisgICAgICogRGlyZWN0aW9uIGluZGljYXRvcjogdGhlIHNvdXJjZSBpcyBpbiB2aXN1YWwgKGRpc3BsYXkpIG9yZGVyLCB0aGF0IGlzLAorICAgICAqIHRoZSBsZWZ0bW9zdCBkaXNwbGF5ZWQgY2hhcmFjdGVyIGlzIHN0b3JlZCBmaXJzdC4KKyAgICAgKiBAc3RhYmxlIElDVSAyLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBURVhUX0RJUkVDVElPTl9WSVNVQUxfTFRSID0gNDsKKworICAgIC8qKgorICAgICAqIEJpdCBtYXNrIGZvciBkaXJlY3Rpb24gaW5kaWNhdG9ycy4KKyAgICAgKiBAc3RhYmxlIElDVSAyLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBURVhUX0RJUkVDVElPTl9NQVNLID0gNDsKKworCisgICAgLyoqCisgICAgICogTGV0dGVyIHNoYXBpbmcgb3B0aW9uOiBkbyBub3QgcGVyZm9ybSBsZXR0ZXIgc2hhcGluZy4KKyAgICAgKiBAc3RhYmxlIElDVSAyLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMRVRURVJTX05PT1AgPSAwOworCisgICAgLyoqCisgICAgICogTGV0dGVyIHNoYXBpbmcgb3B0aW9uOiByZXBsYWNlIG5vcm1hdGl2ZSBsZXR0ZXIgY2hhcmFjdGVycyBpbiB0aGUgVSswNjAwIChBcmFiaWMpIGJsb2NrLAorICAgICAqIGJ5IHNoYXBlZCBvbmVzIGluIHRoZSBVK0ZFNzAgKFByZXNlbnRhdGlvbiBGb3JtcyBCKSBibG9jay4gUGVyZm9ybXMgTGFtLUFsZWYgbGlnYXR1cmUKKyAgICAgKiBzdWJzdGl0dXRpb24uCisgICAgICogQHN0YWJsZSBJQ1UgMi4wCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTEVUVEVSU19TSEFQRSA9IDg7CisKKyAgICAvKioKKyAgICAgKiBMZXR0ZXIgc2hhcGluZyBvcHRpb246IHJlcGxhY2Ugc2hhcGVkIGxldHRlciBjaGFyYWN0ZXJzIGluIHRoZSBVK0ZFNzAgKFByZXNlbnRhdGlvbiBGb3JtcyBCKSBibG9jaworICAgICAqIGJ5IG5vcm1hdGl2ZSBvbmVzIGluIHRoZSBVKzA2MDAgKEFyYWJpYykgYmxvY2suICBDb252ZXJ0cyBMYW0tQWxlZiBsaWdhdHVyZXMgdG8gcGFpcnMgb2YgTGFtIGFuZAorICAgICAqIEFsZWYgY2hhcmFjdGVycywgY29uc3VtaW5nIHNwYWNlcyBpZiByZXF1aXJlZC4KKyAgICAgKiBAc3RhYmxlIElDVSAyLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMRVRURVJTX1VOU0hBUEUgPSAweDEwOworCisgICAgLyoqCisgICAgICogTGV0dGVyIHNoYXBpbmcgb3B0aW9uOiByZXBsYWNlIG5vcm1hdGl2ZSBsZXR0ZXIgY2hhcmFjdGVycyBpbiB0aGUgVSswNjAwIChBcmFiaWMpIGJsb2NrLAorICAgICAqIGV4Y2VwdCBmb3IgdGhlIFRBU0hLRUVMIGNoYXJhY3RlcnMgYXQgVSswNjRCLi4uVSswNjUyLCBieSBzaGFwZWQgb25lcyBpbiB0aGUgVStGZTcwCisgICAgICogKFByZXNlbnRhdGlvbiBGb3JtcyBCKSBibG9jay4gIFRoZSBUQVNIS0VFTCBjaGFyYWN0ZXJzIHdpbGwgYWx3YXlzIGJlIGNvbnZlcnRlZCB0bworICAgICAqIHRoZSBpc29sYXRlZCBmb3JtcyByYXRoZXIgdGhhbiB0byB0aGVpciBjb3JyZWN0IHNoYXBlLgorICAgICAqIEBzdGFibGUgSUNVIDIuMAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExFVFRFUlNfU0hBUEVfVEFTSEtFRUxfSVNPTEFURUQgPSAweDE4OworCisgICAgLyoqCisgICAgICogQml0IG1hc2sgZm9yIGxldHRlciBzaGFwaW5nIG9wdGlvbnMuCisgICAgICogQHN0YWJsZSBJQ1UgMi4wCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTEVUVEVSU19NQVNLID0gMHgxODsKKworCisgICAgLyoqCisgICAgICogRGlnaXQgc2hhcGluZyBvcHRpb246IGRvIG5vdCBwZXJmb3JtIGRpZ2l0IHNoYXBpbmcuCisgICAgICogQHN0YWJsZSBJQ1UgMi4wCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElHSVRTX05PT1AgPSAwOworCisgICAgLyoqCisgICAgICogRGlnaXQgc2hhcGluZyBvcHRpb246IFJlcGxhY2UgRXVyb3BlYW4gZGlnaXRzIChVKzAwMzAuLi5VKzAwMzkpIGJ5IEFyYWJpYy1JbmRpYyBkaWdpdHMuCisgICAgICogQHN0YWJsZSBJQ1UgMi4wCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElHSVRTX0VOMkFOID0gMHgyMDsKKworICAgIC8qKgorICAgICAqIERpZ2l0IHNoYXBpbmcgb3B0aW9uOiBSZXBsYWNlIEFyYWJpYy1JbmRpYyBkaWdpdHMgYnkgRXVyb3BlYW4gZGlnaXRzIChVKzAwMzAuLi5VKzAwMzkpLgorICAgICAqIEBzdGFibGUgSUNVIDIuMAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJR0lUU19BTjJFTiA9IDB4NDA7CisKKyAgICAvKioKKyAgICAgKiBEaWdpdCBzaGFwaW5nIG9wdGlvbjoKKyAgICAgKiBSZXBsYWNlIEV1cm9wZWFuIGRpZ2l0cyAoVSswMDMwLi4uVSswMDM5KSBieSBBcmFiaWMtSW5kaWMgZGlnaXRzCisgICAgICogaWYgdGhlIG1vc3QgcmVjZW50IHN0cm9uZ2x5IGRpcmVjdGlvbmFsIGNoYXJhY3RlcgorICAgICAqIGlzIGFuIEFyYWJpYyBsZXR0ZXIgKGl0cyBCaWRpIGRpcmVjdGlvbiB2YWx1ZSBpcyBSSUdIVF9UT19MRUZUX0FSQUJJQykuCisgICAgICogVGhlIGluaXRpYWwgc3RhdGUgYXQgdGhlIHN0YXJ0IG9mIHRoZSB0ZXh0IGlzIGFzc3VtZWQgdG8gYmUgbm90IGFuIEFyYWJpYywKKyAgICAgKiBsZXR0ZXIsIHNvIEV1cm9wZWFuIGRpZ2l0cyBhdCB0aGUgc3RhcnQgb2YgdGhlIHRleHQgd2lsbCBub3QgY2hhbmdlLgorICAgICAqIENvbXBhcmUgdG8gRElHSVRTX0FMRU4yQU5fSU5JVF9BTC4KKyAgICAgKiBAc3RhYmxlIElDVSAyLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBESUdJVFNfRU4yQU5fSU5JVF9MUiA9IDB4NjA7CisKKyAgICAvKioKKyAgICAgKiBEaWdpdCBzaGFwaW5nIG9wdGlvbjoKKyAgICAgKiBSZXBsYWNlIEV1cm9wZWFuIGRpZ2l0cyAoVSswMDMwLi4uVSswMDM5KSBieSBBcmFiaWMtSW5kaWMgZGlnaXRzCisgICAgICogaWYgdGhlIG1vc3QgcmVjZW50IHN0cm9uZ2x5IGRpcmVjdGlvbmFsIGNoYXJhY3RlcgorICAgICAqIGlzIGFuIEFyYWJpYyBsZXR0ZXIgKGl0cyBCaWRpIGRpcmVjdGlvbiB2YWx1ZSBpcyBSSUdIVF9UT19MRUZUX0FSQUJJQykuCisgICAgICogVGhlIGluaXRpYWwgc3RhdGUgYXQgdGhlIHN0YXJ0IG9mIHRoZSB0ZXh0IGlzIGFzc3VtZWQgdG8gYmUgYW4gQXJhYmljLAorICAgICAqIGxldHRlciwgc28gRXVyb3BlYW4gZGlnaXRzIGF0IHRoZSBzdGFydCBvZiB0aGUgdGV4dCB3aWxsIGNoYW5nZS4KKyAgICAgKiBDb21wYXJlIHRvIERJR0lUU19BTEVOMkFOX0lOVF9MUi4KKyAgICAgKiBAc3RhYmxlIElDVSAyLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBESUdJVFNfRU4yQU5fSU5JVF9BTCA9IDB4ODA7CisKKyAgICAvKiogTm90IGEgdmFsaWQgb3B0aW9uIHZhbHVlLiAqLworICAgIC8vcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERJR0lUU19SRVNFUlZFRCA9IDB4YTA7CisKKyAgICAvKioKKyAgICAgKiBCaXQgbWFzayBmb3IgZGlnaXQgc2hhcGluZyBvcHRpb25zLgorICAgICAqIEBzdGFibGUgSUNVIDIuMAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJR0lUU19NQVNLID0gMHhlMDsKKworICAgIC8qKgorICAgICAqIERpZ2l0IHR5cGUgb3B0aW9uOiBVc2UgQXJhYmljLUluZGljIGRpZ2l0cyAoVSswNjYwLi4uVSswNjY5KS4KKyAgICAgKiBAc3RhYmxlIElDVSAyLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBESUdJVF9UWVBFX0FOID0gMDsKKworICAgIC8qKgorICAgICAqIERpZ2l0IHR5cGUgb3B0aW9uOiBVc2UgRWFzdGVybiAoRXh0ZW5kZWQpIEFyYWJpYy1JbmRpYyBkaWdpdHMgKFUrMDZmMC4uLlUrMDZmOSkuCisgICAgICogQHN0YWJsZSBJQ1UgMi4wCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElHSVRfVFlQRV9BTl9FWFRFTkRFRCA9IDB4MTAwOworCisgICAgLyoqCisgICAgICogQml0IG1hc2sgZm9yIGRpZ2l0IHR5cGUgb3B0aW9ucy4KKyAgICAgKiBAc3RhYmxlIElDVSAyLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBESUdJVF9UWVBFX01BU0sgPSAweDAxMDA7IC8vIDB4M2YwMD8KKworICAgIC8qKgorICAgICAqIHNvbWUgY29uc3RhbnRzCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBIQU1aQUZFX0NIQVIgICAgICAgPSAnXHVmZTgwJzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIEhBTVpBMDZfQ0hBUiAgICAgICA9ICdcdTA2MjEnOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgWUVIX0hBTVpBX0NIQVIgICAgID0gJ1x1MDYyNic7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBZRUhfSEFNWkFGRV9DSEFSICAgPSAnXHVGRTg5JzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIExBTUFMRUZfU1BBQ0VfU1VCICA9ICdcdWZmZmYnOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgVEFTSEtFRUxfU1BBQ0VfU1VCID0gJ1x1ZmZmZSc7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBMQU1fQ0hBUiAgICAgID0gJ1x1MDY0NCc7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBTUEFDRV9DSEFSICAgID0gJ1x1MDAyMCc7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBTUEFDRV9DSEFSX0ZPUl9MQU1BTEVGID0gJ1x1ZmVmZic7IC8vIFhYWDogdHdlYWsgZm9yIFRleHRMaW5lIHVzZQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgU0hBRERBX0NIQVIgICA9ICdcdUZFN0MnOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgVEFUV0VFTF9DSEFSICA9ICdcdTA2NDAnOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgU0hBRERBX1RBVFdFRUxfQ0hBUiA9ICdcdUZFN0QnOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgTkVXX1RBSUxfQ0hBUiA9ICdcdUZFNzMnOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgT0xEX1RBSUxfQ0hBUiA9ICdcdTIwMEInOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTSEFQRV9NT0RFICAgICAgPSAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERVNIQVBFX01PREUgICAgPSAxOworCisgICAgLyoqCisgICAgICogQHN0YWJsZSBJQ1UgMi4wCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCByaHMpIHsKKyAgICAgICAgcmV0dXJuIHJocyAhPSBudWxsICYmCisgICAgICAgICAgICByaHMuZ2V0Q2xhc3MoKSA9PSBBcmFiaWNTaGFwaW5nLmNsYXNzICYmCisgICAgICAgICAgICBvcHRpb25zID09ICgoQXJhYmljU2hhcGluZylyaHMpLm9wdGlvbnM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHN0YWJsZSBJQ1UgMi4wCisgICAgICovCisgICAgIC8vL0NMT1ZFUjpPRkYKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICByZXR1cm4gb3B0aW9uczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAc3RhYmxlIElDVSAyLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKKyAgICAgICAgYnVmLmFwcGVuZCgnWycpOworCisgICAgICAgIHN3aXRjaCAob3B0aW9ucyAmIExBTUFMRUZfTUFTSykgeworICAgICAgICBjYXNlIExBTUFMRUZfUkVTSVpFOiBidWYuYXBwZW5kKCJMYW1BbGVmIHJlc2l6ZSIpOyBicmVhazsKKyAgICAgICAgY2FzZSBMQU1BTEVGX05FQVI6IGJ1Zi5hcHBlbmQoIkxhbUFsZWYgc3BhY2VzIGF0IG5lYXIiKTsgYnJlYWs7CisgICAgICAgIGNhc2UgTEFNQUxFRl9CRUdJTjogYnVmLmFwcGVuZCgiTGFtQWxlZiBzcGFjZXMgYXQgYmVnaW4iKTsgYnJlYWs7CisgICAgICAgIGNhc2UgTEFNQUxFRl9FTkQ6IGJ1Zi5hcHBlbmQoIkxhbUFsZWYgc3BhY2VzIGF0IGVuZCIpOyBicmVhazsKKyAgICAgICAgY2FzZSBMQU1BTEVGX0FVVE86IGJ1Zi5hcHBlbmQoImxhbUFsZWYgYXV0byIpOyBicmVhazsKKyAgICAgICAgfQorICAgICAgICBzd2l0Y2ggKG9wdGlvbnMgJiBURVhUX0RJUkVDVElPTl9NQVNLKSB7CisgICAgICAgIGNhc2UgVEVYVF9ESVJFQ1RJT05fTE9HSUNBTDogYnVmLmFwcGVuZCgiLCBsb2dpY2FsIik7IGJyZWFrOworICAgICAgICBjYXNlIFRFWFRfRElSRUNUSU9OX1ZJU1VBTF9MVFI6IGJ1Zi5hcHBlbmQoIiwgdmlzdWFsIik7IGJyZWFrOworICAgICAgICB9CisgICAgICAgIHN3aXRjaCAob3B0aW9ucyAmIExFVFRFUlNfTUFTSykgeworICAgICAgICBjYXNlIExFVFRFUlNfTk9PUDogYnVmLmFwcGVuZCgiLCBubyBsZXR0ZXIgc2hhcGluZyIpOyBicmVhazsKKyAgICAgICAgY2FzZSBMRVRURVJTX1NIQVBFOiBidWYuYXBwZW5kKCIsIHNoYXBlIGxldHRlcnMiKTsgYnJlYWs7CisgICAgICAgIGNhc2UgTEVUVEVSU19TSEFQRV9UQVNIS0VFTF9JU09MQVRFRDogYnVmLmFwcGVuZCgiLCBzaGFwZSBsZXR0ZXJzIHRhc2hrZWVsIGlzb2xhdGVkIik7IGJyZWFrOworICAgICAgICBjYXNlIExFVFRFUlNfVU5TSEFQRTogYnVmLmFwcGVuZCgiLCB1bnNoYXBlIGxldHRlcnMiKTsgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoIChvcHRpb25zICYgU0VFTl9NQVNLKSB7CisgICAgICAgIGNhc2UgU0VFTl9UV09DRUxMX05FQVI6IGJ1Zi5hcHBlbmQoIiwgU2VlbiBhdCBuZWFyIik7IGJyZWFrOworICAgICAgICB9CisgICAgICAgIHN3aXRjaCAob3B0aW9ucyAmIFlFSEhBTVpBX01BU0spIHsKKyAgICAgICAgY2FzZSBZRUhIQU1aQV9UV09DRUxMX05FQVI6IGJ1Zi5hcHBlbmQoIiwgWWVoIEhhbXphIGF0IG5lYXIiKTsgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoIChvcHRpb25zICYgVEFTSEtFRUxfTUFTSykgeworICAgICAgICBjYXNlIFRBU0hLRUVMX0JFR0lOOiBidWYuYXBwZW5kKCIsIFRhc2hrZWVsIGF0IGJlZ2luIik7IGJyZWFrOworICAgICAgICBjYXNlIFRBU0hLRUVMX0VORDogYnVmLmFwcGVuZCgiLCBUYXNoa2VlbCBhdCBlbmQiKTsgYnJlYWs7CisgICAgICAgIGNhc2UgVEFTSEtFRUxfUkVQTEFDRV9CWV9UQVRXRUVMOiBidWYuYXBwZW5kKCIsIFRhc2hrZWVsIHJlcGxhY2Ugd2l0aCB0YXR3ZWVsIik7IGJyZWFrOworICAgICAgICBjYXNlIFRBU0hLRUVMX1JFU0laRTogYnVmLmFwcGVuZCgiLCBUYXNoa2VlbCByZXNpemUiKTsgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2ggKG9wdGlvbnMgJiBESUdJVFNfTUFTSykgeworICAgICAgICBjYXNlIERJR0lUU19OT09QOiBidWYuYXBwZW5kKCIsIG5vIGRpZ2l0IHNoYXBpbmciKTsgYnJlYWs7CisgICAgICAgIGNhc2UgRElHSVRTX0VOMkFOOiBidWYuYXBwZW5kKCIsIHNoYXBlIGRpZ2l0cyB0byBBTiIpOyBicmVhazsKKyAgICAgICAgY2FzZSBESUdJVFNfQU4yRU46IGJ1Zi5hcHBlbmQoIiwgc2hhcGUgZGlnaXRzIHRvIEVOIik7IGJyZWFrOworICAgICAgICBjYXNlIERJR0lUU19FTjJBTl9JTklUX0xSOiBidWYuYXBwZW5kKCIsIHNoYXBlIGRpZ2l0cyB0byBBTiBjb250ZXh0dWFsbHk6IGRlZmF1bHQgRU4iKTsgYnJlYWs7CisgICAgICAgIGNhc2UgRElHSVRTX0VOMkFOX0lOSVRfQUw6IGJ1Zi5hcHBlbmQoIiwgc2hhcGUgZGlnaXRzIHRvIEFOIGNvbnRleHR1YWxseTogZGVmYXVsdCBBTCIpOyBicmVhazsKKyAgICAgICAgfQorICAgICAgICBzd2l0Y2ggKG9wdGlvbnMgJiBESUdJVF9UWVBFX01BU0spIHsKKyAgICAgICAgY2FzZSBESUdJVF9UWVBFX0FOOiBidWYuYXBwZW5kKCIsIHN0YW5kYXJkIEFyYWJpYy1JbmRpYyBkaWdpdHMiKTsgYnJlYWs7CisgICAgICAgIGNhc2UgRElHSVRfVFlQRV9BTl9FWFRFTkRFRDogYnVmLmFwcGVuZCgiLCBleHRlbmRlZCBBcmFiaWMtSW5kaWMgZGlnaXRzIik7IGJyZWFrOworICAgICAgICB9CisgICAgICAgIGJ1Zi5hcHBlbmQoIl0iKTsKKworICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7CisgICAgfQorICAgIC8vL0NMT1ZFUjpPTgorCisgICAgLy8KKyAgICAvLyBwb3J0ZWQgYXBpCisgICAgLy8KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJUlJFTEVWQU5UID0gNDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTEFNVFlQRSA9IDE2OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBTEVGVFlQRSA9IDMyOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IExJTktSID0gMTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTElOS0wgPSAyOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMSU5LX01BU0sgPSAzOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IGlycmVsZXZhbnRQb3NbXSA9IHsKKyAgICAgICAgMHgwLCAweDIsIDB4NCwgMHg2LCAweDgsIDB4QSwgMHhDLCAweEUKKyAgICB9OworCisvKgorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgY29udmVydExhbUFsZWZbXSA9ICB7CisgICAgICAgICdcdTA2MjInLCAvLyBGRUY1CisgICAgICAgICdcdTA2MjInLCAvLyBGRUY2CisgICAgICAgICdcdTA2MjMnLCAvLyBGRUY3CisgICAgICAgICdcdTA2MjMnLCAvLyBGRUY4CisgICAgICAgICdcdTA2MjUnLCAvLyBGRUY5CisgICAgICAgICdcdTA2MjUnLCAvLyBGRUZBCisgICAgICAgICdcdTA2MjcnLCAvLyBGRUZCCisgICAgICAgICdcdTA2MjcnICAvLyBGRUZDCisgICAgfTsKKyovCisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgdGFpbEZhbWlseUlzb2xhdGVkRmluYWxbXSA9IHsKKyAgICAgICAgLyogRkVCMSAqLyAxLAorICAgICAgICAvKiBGRUIyICovIDEsCisgICAgICAgIC8qIEZFQjMgKi8gMCwKKyAgICAgICAgLyogRkVCNCAqLyAwLAorICAgICAgICAvKiBGRUI1ICovIDEsCisgICAgICAgIC8qIEZFQjYgKi8gMSwKKyAgICAgICAgLyogRkVCNyAqLyAwLAorICAgICAgICAvKiBGRUI4ICovIDAsCisgICAgICAgIC8qIEZFQjkgKi8gMSwKKyAgICAgICAgLyogRkVCQSAqLyAxLAorICAgICAgICAvKiBGRUJCICovIDAsCisgICAgICAgIC8qIEZFQkMgKi8gMCwKKyAgICAgICAgLyogRkVCRCAqLyAxLAorICAgICAgICAvKiBGRUJFICovIDEKKyAgICB9OworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IHRhc2hrZWVsTWVkaWFsW10gPSB7CisgICAgICAgIC8qIEZFNzAgKi8gMCwKKyAgICAgICAgLyogRkU3MSAqLyAxLAorICAgICAgICAvKiBGRTcyICovIDAsCisgICAgICAgIC8qIEZFNzMgKi8gMCwKKyAgICAgICAgLyogRkU3NCAqLyAwLAorICAgICAgICAvKiBGRTc1ICovIDAsCisgICAgICAgIC8qIEZFNzYgKi8gMCwKKyAgICAgICAgLyogRkU3NyAqLyAxLAorICAgICAgICAvKiBGRTc4ICovIDAsCisgICAgICAgIC8qIEZFNzkgKi8gMSwKKyAgICAgICAgLyogRkU3QSAqLyAwLAorICAgICAgICAvKiBGRTdCICovIDEsCisgICAgICAgIC8qIEZFN0MgKi8gMCwKKyAgICAgICAgLyogRkU3RCAqLyAxLAorICAgICAgICAvKiBGRTdFICovIDAsCisgICAgICAgIC8qIEZFN0YgKi8gMQorICAgIH07CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIHllaEhhbXphVG9ZZWhbXSA9CisgICAgeworICAgIC8qIGlzb2xhdGVkKi8gMHhGRUVGLAorICAgIC8qIGZpbmFsICAgKi8gMHhGRUYwCisgICAgfTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgY29udmVydE5vcm1hbGl6ZWRMYW1BbGVmW10gPSB7CisgICAgICAgICdcdTA2MjInLCAvLyAwNjVDCisgICAgICAgICdcdTA2MjMnLCAvLyAwNjVECisgICAgICAgICdcdTA2MjUnLCAvLyAwNjVFCisgICAgICAgICdcdTA2MjcnLCAvLyAwNjVGCisgICAgfTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludFtdIGFyYUxpbmsgPSB7CisgICAgICAgIDEgICAgICAgICAgICsgMzIgKyAyNTYgKiAweDExLCAgLyoweDA2MjIqLworICAgICAgICAxICAgICAgICAgICArIDMyICsgMjU2ICogMHgxMywgIC8qMHgwNjIzKi8KKyAgICAgICAgMSAgICAgICAgICAgICAgICArIDI1NiAqIDB4MTUsICAvKjB4MDYyNCovCisgICAgICAgIDEgICAgICAgICAgICsgMzIgKyAyNTYgKiAweDE3LCAgLyoweDA2MjUqLworICAgICAgICAxICsgMiAgICAgICAgICAgICsgMjU2ICogMHgxOSwgIC8qMHgwNjI2Ki8KKyAgICAgICAgMSAgICAgICAgICAgKyAzMiArIDI1NiAqIDB4MUQsICAvKjB4MDYyNyovCisgICAgICAgIDEgKyAyICAgICAgICAgICAgKyAyNTYgKiAweDFGLCAgLyoweDA2MjgqLworICAgICAgICAxICAgICAgICAgICAgICAgICsgMjU2ICogMHgyMywgIC8qMHgwNjI5Ki8KKyAgICAgICAgMSArIDIgICAgICAgICAgICArIDI1NiAqIDB4MjUsICAvKjB4MDYyQSovCisgICAgICAgIDEgKyAyICAgICAgICAgICAgKyAyNTYgKiAweDI5LCAgLyoweDA2MkIqLworICAgICAgICAxICsgMiAgICAgICAgICAgICsgMjU2ICogMHgyRCwgIC8qMHgwNjJDKi8KKyAgICAgICAgMSArIDIgICAgICAgICAgICArIDI1NiAqIDB4MzEsICAvKjB4MDYyRCovCisgICAgICAgIDEgKyAyICAgICAgICAgICAgKyAyNTYgKiAweDM1LCAgLyoweDA2MkUqLworICAgICAgICAxICAgICAgICAgICAgICAgICsgMjU2ICogMHgzOSwgIC8qMHgwNjJGKi8KKyAgICAgICAgMSAgICAgICAgICAgICAgICArIDI1NiAqIDB4M0IsICAvKjB4MDYzMCovCisgICAgICAgIDEgICAgICAgICAgICAgICAgKyAyNTYgKiAweDNELCAgLyoweDA2MzEqLworICAgICAgICAxICAgICAgICAgICAgICAgICsgMjU2ICogMHgzRiwgIC8qMHgwNjMyKi8KKyAgICAgICAgMSArIDIgICAgICAgICAgICArIDI1NiAqIDB4NDEsICAvKjB4MDYzMyovCisgICAgICAgIDEgKyAyICAgICAgICAgICAgKyAyNTYgKiAweDQ1LCAgLyoweDA2MzQqLworICAgICAgICAxICsgMiAgICAgICAgICAgICsgMjU2ICogMHg0OSwgIC8qMHgwNjM1Ki8KKyAgICAgICAgMSArIDIgICAgICAgICAgICArIDI1NiAqIDB4NEQsICAvKjB4MDYzNiovCisgICAgICAgIDEgKyAyICAgICAgICAgICAgKyAyNTYgKiAweDUxLCAgLyoweDA2MzcqLworICAgICAgICAxICsgMiAgICAgICAgICAgICsgMjU2ICogMHg1NSwgIC8qMHgwNjM4Ki8KKyAgICAgICAgMSArIDIgICAgICAgICAgICArIDI1NiAqIDB4NTksICAvKjB4MDYzOSovCisgICAgICAgIDEgKyAyICAgICAgICAgICAgKyAyNTYgKiAweDVELCAgLyoweDA2M0EqLworICAgICAgICAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgIC8qMHgwNjNCLTB4MDYzRiovCisgICAgICAgIDEgKyAyLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyoweDA2NDAqLworICAgICAgICAxICsgMiAgICAgICAgICAgICsgMjU2ICogMHg2MSwgIC8qMHgwNjQxKi8KKyAgICAgICAgMSArIDIgICAgICAgICAgICArIDI1NiAqIDB4NjUsICAvKjB4MDY0MiovCisgICAgICAgIDEgKyAyICAgICAgICAgICAgKyAyNTYgKiAweDY5LCAgLyoweDA2NDMqLworICAgICAgICAxICsgMiAgICAgICArIDE2ICsgMjU2ICogMHg2RCwgIC8qMHgwNjQ0Ki8KKyAgICAgICAgMSArIDIgICAgICAgICAgICArIDI1NiAqIDB4NzEsICAvKjB4MDY0NSovCisgICAgICAgIDEgKyAyICAgICAgICAgICAgKyAyNTYgKiAweDc1LCAgLyoweDA2NDYqLworICAgICAgICAxICsgMiAgICAgICAgICAgICsgMjU2ICogMHg3OSwgIC8qMHgwNjQ3Ki8KKyAgICAgICAgMSAgICAgICAgICAgICAgICArIDI1NiAqIDB4N0QsICAvKjB4MDY0OCovCisgICAgICAgIDEgICAgICAgICAgICAgICAgKyAyNTYgKiAweDdGLCAgLyoweDA2NDkqLworICAgICAgICAxICsgMiAgICAgICAgICAgICsgMjU2ICogMHg4MSwgIC8qMHgwNjRBKi8KKyAgICAgICAgNCwgNCwgNCwgNCwgICAgICAgICAgICAgICAgICAgICAvKjB4MDY0Qi0weDA2NEUqLworICAgICAgICA0LCA0LCA0LCA0LCAgICAgICAgICAgICAgICAgICAgIC8qMHgwNjRGLTB4MDY1MiovCisgICAgICAgIDQsIDQsIDQsIDAsIDAsICAgICAgICAgICAgICAgICAgLyoweDA2NTMtMHgwNjU3Ki8KKyAgICAgICAgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAvKjB4MDY1OC0weDA2NUIqLworICAgICAgICAxICAgICAgICAgICAgICAgICsgMjU2ICogMHg4NSwgIC8qMHgwNjVDKi8KKyAgICAgICAgMSAgICAgICAgICAgICAgICArIDI1NiAqIDB4ODcsICAvKjB4MDY1RCovCisgICAgICAgIDEgICAgICAgICAgICAgICAgKyAyNTYgKiAweDg5LCAgLyoweDA2NUUqLworICAgICAgICAxICAgICAgICAgICAgICAgICsgMjU2ICogMHg4QiwgIC8qMHgwNjVGKi8KKyAgICAgICAgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAvKjB4MDY2MC0weDA2NjQqLworICAgICAgICAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgIC8qMHgwNjY1LTB4MDY2OSovCisgICAgICAgIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgLyoweDA2NkEtMHgwNjZGKi8KKyAgICAgICAgNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKjB4MDY3MCovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoweDA2NzEqLworICAgICAgICAxICAgICAgICAgICArIDMyLCAgICAgICAgICAgICAgIC8qMHgwNjcyKi8KKyAgICAgICAgMSAgICAgICAgICAgKyAzMiwgICAgICAgICAgICAgICAvKjB4MDY3MyovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoweDA2NzQqLworICAgICAgICAxICAgICAgICAgICArIDMyLCAgICAgICAgICAgICAgIC8qMHgwNjc1Ki8KKyAgICAgICAgMSwgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKjB4MDY3Ni0weDA2NzcqLworICAgICAgICAxKzIsIDErMiwgMSsyLCAxKzIsIDErMiwgMSsyLCAgIC8qMHgwNjc4LTB4MDY3RCovCisgICAgICAgIDErMiwgMSsyLCAxKzIsIDErMiwgMSsyLCAxKzIsICAgLyoweDA2N0UtMHgwNjgzKi8KKyAgICAgICAgMSsyLCAxKzIsIDErMiwgMSsyLCAgICAgICAgICAgICAvKjB4MDY4NC0weDA2ODcqLworICAgICAgICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAgIC8qMHgwNjg4LTB4MDY5MSovCisgICAgICAgIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsICAgICAgICAgLyoweDA2OTItMHgwNjk5Ki8KKyAgICAgICAgMSsyLCAxKzIsIDErMiwgMSsyLCAxKzIsIDErMiwgICAvKjB4MDY5QS0weDA2QTMqLworICAgICAgICAxKzIsIDErMiwgMSsyLCAxKzIsICAgICAgICAgICAgIC8qMHgwNjlBLTB4MDZBMyovCisgICAgICAgIDErMiwgMSsyLCAxKzIsIDErMiwgMSsyLCAxKzIsICAgLyoweDA2QTQtMHgwNkFEKi8KKyAgICAgICAgMSsyLCAxKzIsIDErMiwgMSsyLCAgICAgICAgICAgICAvKjB4MDZBNC0weDA2QUQqLworICAgICAgICAxKzIsIDErMiwgMSsyLCAxKzIsIDErMiwgMSsyLCAgIC8qMHgwNkFFLTB4MDZCNyovCisgICAgICAgIDErMiwgMSsyLCAxKzIsIDErMiwgICAgICAgICAgICAgLyoweDA2QUUtMHgwNkI3Ki8KKyAgICAgICAgMSsyLCAxKzIsIDErMiwgMSsyLCAxKzIsIDErMiwgICAvKjB4MDZCOC0weDA2QkYqLworICAgICAgICAxKzIsIDErMiwgICAgICAgICAgICAgICAgICAgICAgIC8qMHgwNkI4LTB4MDZCRiovCisgICAgICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoweDA2QzAqLworICAgICAgICAxKzIsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qMHgwNkMxKi8KKyAgICAgICAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgICAvKjB4MDZDMi0weDA2Q0IqLworICAgICAgICAxKzIsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qMHgwNkNDKi8KKyAgICAgICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKjB4MDZDRCovCisgICAgICAgIDErMiwgMSsyLCAxKzIsIDErMiwgICAgICAgICAgICAgLyoweDA2Q0UtMHgwNkQxKi8KKyAgICAgICAgMSwgMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKjB4MDZEMi0weDA2RDMqLworICAgIH07CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXSBwcmVzTGluayA9IHsKKyAgICAgICAgMSArIDIsICAgICAgICAgICAgICAgICAgICAgICAgLyoweEZFNzAqLworICAgICAgICAxICsgMiwgICAgICAgICAgICAgICAgICAgICAgICAvKjB4RkU3MSovCisgICAgICAgIDEgKyAyLCAwLCAxKyAyLCAwLCAxKyAyLCAgICAgIC8qMHhGRTcyLTB4RkU3NiovCisgICAgICAgIDEgKyAyLCAgICAgICAgICAgICAgICAgICAgICAgIC8qMHhGRTc3Ki8KKyAgICAgICAgMSsgMiwgMSArIDIsIDErMiwgMSArIDIsICAgICAgLyoweEZFNzgtMHhGRTgxKi8KKyAgICAgICAgMSsgMiwgMSArIDIsIDErMiwgMSArIDIsICAgICAgLyoweEZFODItMHhGRTg1Ki8KKyAgICAgICAgMCwgMCArIDMyLCAxICsgMzIsIDAgKyAzMiwgICAgLyoweEZFODYtMHhGRTg5Ki8KKyAgICAgICAgMSArIDMyLCAwLCAxLCAgMCArIDMyLCAgICAgICAgLyoweEZFOEEtMHhGRThEKi8KKyAgICAgICAgMSArIDMyLCAwLCAyLCAgMSArIDIsICAgICAgICAgLyoweEZFOEUtMHhGRTkxKi8KKyAgICAgICAgMSwgMCArIDMyLCAxICsgMzIsIDAsICAgICAgICAgLyoweEZFOTItMHhGRTk1Ki8KKyAgICAgICAgMiwgMSArIDIsIDEsIDAsICAgICAgICAgICAgICAgLyoweEZFOTYtMHhGRTk5Ki8KKyAgICAgICAgMSwgMCwgMiwgMSArIDIsICAgICAgICAgICAgICAgLyoweEZFOUEtMHhGRTlEKi8KKyAgICAgICAgMSwgMCwgMiwgMSArIDIsICAgICAgICAgICAgICAgLyoweEZFOUUtMHhGRUExKi8KKyAgICAgICAgMSwgMCwgMiwgMSArIDIsICAgICAgICAgICAgICAgLyoweEZFQTItMHhGRUE1Ki8KKyAgICAgICAgMSwgMCwgMiwgMSArIDIsICAgICAgICAgICAgICAgLyoweEZFQTYtMHhGRUE5Ki8KKyAgICAgICAgMSwgMCwgMiwgMSArIDIsICAgICAgICAgICAgICAgLyoweEZFQUEtMHhGRUFEKi8KKyAgICAgICAgMSwgMCwgMSwgMCwgICAgICAgICAgICAgICAgICAgLyoweEZFQUUtMHhGRUIxKi8KKyAgICAgICAgMSwgMCwgMSwgMCwgICAgICAgICAgICAgICAgICAgLyoweEZFQjItMHhGRUI1Ki8KKyAgICAgICAgMSwgMCwgMiwgMSsyLCAgICAgICAgICAgICAgICAgLyoweEZFQjYtMHhGRUI5Ki8KKyAgICAgICAgMSwgMCwgMiwgMSsyLCAgICAgICAgICAgICAgICAgLyoweEZFQkEtMHhGRUJEKi8KKyAgICAgICAgMSwgMCwgMiwgMSsyLCAgICAgICAgICAgICAgICAgLyoweEZFQkUtMHhGRUMxKi8KKyAgICAgICAgMSwgMCwgMiwgMSsyLCAgICAgICAgICAgICAgICAgLyoweEZFQzItMHhGRUM1Ki8KKyAgICAgICAgMSwgMCwgMiwgMSsyLCAgICAgICAgICAgICAgICAgLyoweEZFQzYtMHhGRUM5Ki8KKyAgICAgICAgMSwgMCwgMiwgMSsyLCAgICAgICAgICAgICAgICAgLyoweEZFQ0EtMHhGRUNEKi8KKyAgICAgICAgMSwgMCwgMiwgMSsyLCAgICAgICAgICAgICAgICAgLyoweEZFQ0UtMHhGRUQxKi8KKyAgICAgICAgMSwgMCwgMiwgMSsyLCAgICAgICAgICAgICAgICAgLyoweEZFRDItMHhGRUQ1Ki8KKyAgICAgICAgMSwgMCwgMiwgMSsyLCAgICAgICAgICAgICAgICAgLyoweEZFRDYtMHhGRUQ5Ki8KKyAgICAgICAgMSwgMCwgMiwgMSsyLCAgICAgICAgICAgICAgICAgLyoweEZFREEtMHhGRUREKi8KKyAgICAgICAgMSwgMCwgMiwgMSsyLCAgICAgICAgICAgICAgICAgLyoweEZFREUtMHhGRUUxKi8KKyAgICAgICAgMSwgMCArIDE2LCAyICsgMTYsIDEgKyAyICsxNiwgLyoweEZFRTItMHhGRUU1Ki8KKyAgICAgICAgMSArIDE2LCAwLCAyLCAxKzIsICAgICAgICAgICAgLyoweEZFRTYtMHhGRUU5Ki8KKyAgICAgICAgMSwgMCwgMiwgMSsyLCAgICAgICAgICAgICAgICAgLyoweEZFRUEtMHhGRUVEKi8KKyAgICAgICAgMSwgMCwgMiwgMSsyLCAgICAgICAgICAgICAgICAgLyoweEZFRUUtMHhGRUYxKi8KKyAgICAgICAgMSwgMCwgMSwgMCwgICAgICAgICAgICAgICAgICAgLyoweEZFRjItMHhGRUY1Ki8KKyAgICAgICAgMSwgMCwgMiwgMSsyLCAgICAgICAgICAgICAgICAgLyoweEZFRjYtMHhGRUY5Ki8KKyAgICAgICAgMSwgMCwgMSwgMCwgICAgICAgICAgICAgICAgICAgLyoweEZFRkEtMHhGRUZEKi8KKyAgICAgICAgMSwgMCwgMSwgMCwKKyAgICAgICAgMQorICAgIH07CisKKyAgICBwcml2YXRlIHN0YXRpYyBpbnRbXSBjb252ZXJ0RkV0bzA2ID0geworICAgICAgICAvKioqKioqKioqKiowKioqKioqMSoqKioqKjIqKioqKiozKioqKioqNCoqKioqKjUqKioqKio2KioqKioqNyoqKioqKjgqKioqKio5KioqKioqQSoqKioqKkIqKioqKipDKioqKioqRCoqKioqKkUqKioqKipGKioqLworICAgICAgICAvKkZFNyovICAgMHg2NEIsIDB4NjRCLCAweDY0QywgMHg2NEMsIDB4NjRELCAweDY0RCwgMHg2NEUsIDB4NjRFLCAweDY0RiwgMHg2NEYsIDB4NjUwLCAweDY1MCwgMHg2NTEsIDB4NjUxLCAweDY1MiwgMHg2NTIsCisgICAgICAgIC8qRkU4Ki8gICAweDYyMSwgMHg2MjIsIDB4NjIyLCAweDYyMywgMHg2MjMsIDB4NjI0LCAweDYyNCwgMHg2MjUsIDB4NjI1LCAweDYyNiwgMHg2MjYsIDB4NjI2LCAweDYyNiwgMHg2MjcsIDB4NjI3LCAweDYyOCwKKyAgICAgICAgLypGRTkqLyAgIDB4NjI4LCAweDYyOCwgMHg2MjgsIDB4NjI5LCAweDYyOSwgMHg2MkEsIDB4NjJBLCAweDYyQSwgMHg2MkEsIDB4NjJCLCAweDYyQiwgMHg2MkIsIDB4NjJCLCAweDYyQywgMHg2MkMsIDB4NjJDLAorICAgICAgICAvKkZFQSovICAgMHg2MkMsIDB4NjJELCAweDYyRCwgMHg2MkQsIDB4NjJELCAweDYyRSwgMHg2MkUsIDB4NjJFLCAweDYyRSwgMHg2MkYsIDB4NjJGLCAweDYzMCwgMHg2MzAsIDB4NjMxLCAweDYzMSwgMHg2MzIsCisgICAgICAgIC8qRkVCKi8gICAweDYzMiwgMHg2MzMsIDB4NjMzLCAweDYzMywgMHg2MzMsIDB4NjM0LCAweDYzNCwgMHg2MzQsIDB4NjM0LCAweDYzNSwgMHg2MzUsIDB4NjM1LCAweDYzNSwgMHg2MzYsIDB4NjM2LCAweDYzNiwKKyAgICAgICAgLypGRUMqLyAgIDB4NjM2LCAweDYzNywgMHg2MzcsIDB4NjM3LCAweDYzNywgMHg2MzgsIDB4NjM4LCAweDYzOCwgMHg2MzgsIDB4NjM5LCAweDYzOSwgMHg2MzksIDB4NjM5LCAweDYzQSwgMHg2M0EsIDB4NjNBLAorICAgICAgICAvKkZFRCovICAgMHg2M0EsIDB4NjQxLCAweDY0MSwgMHg2NDEsIDB4NjQxLCAweDY0MiwgMHg2NDIsIDB4NjQyLCAweDY0MiwgMHg2NDMsIDB4NjQzLCAweDY0MywgMHg2NDMsIDB4NjQ0LCAweDY0NCwgMHg2NDQsCisgICAgICAgIC8qRkVFKi8gICAweDY0NCwgMHg2NDUsIDB4NjQ1LCAweDY0NSwgMHg2NDUsIDB4NjQ2LCAweDY0NiwgMHg2NDYsIDB4NjQ2LCAweDY0NywgMHg2NDcsIDB4NjQ3LCAweDY0NywgMHg2NDgsIDB4NjQ4LCAweDY0OSwKKyAgICAgICAgLypGRUYqLyAgIDB4NjQ5LCAweDY0QSwgMHg2NEEsIDB4NjRBLCAweDY0QSwgMHg2NUMsIDB4NjVDLCAweDY1RCwgMHg2NUQsIDB4NjVFLCAweDY1RSwgMHg2NUYsIDB4NjVGCisgICAgfTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBzaGFwZVRhYmxlW11bXVtdID0geworICAgICAgICB7IHswLDAsMCwwfSwgezAsMCwwLDB9LCB7MCwxLDAsM30sIHswLDEsMCwxfSB9LAorICAgICAgICB7IHswLDAsMiwyfSwgezAsMCwxLDJ9LCB7MCwxLDEsMn0sIHswLDEsMSwzfSB9LAorICAgICAgICB7IHswLDAsMCwwfSwgezAsMCwwLDB9LCB7MCwxLDAsM30sIHswLDEsMCwzfSB9LAorICAgICAgICB7IHswLDAsMSwyfSwgezAsMCwxLDJ9LCB7MCwxLDEsMn0sIHswLDEsMSwzfSB9CisgICAgfTsKKworICAgIC8qCisgICAgICogVGhpcyBmdW5jdGlvbiBzaGFwZXMgRXVyb3BlYW4gZGlnaXRzIHRvIEFyYWJpYy1JbmRpYyBkaWdpdHMKKyAgICAgKiBpbi1wbGFjZSwgd3JpdGluZyBvdmVyIHRoZSBpbnB1dCBjaGFyYWN0ZXJzLiAgRGF0YSBpcyBpbiB2aXN1YWwKKyAgICAgKiBvcmRlci4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgc2hhcGVUb0FyYWJpY0RpZ2l0c1dpdGhDb250ZXh0KGNoYXJbXSBkZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgZGlnaXRCYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBsYXN0U3Ryb25nV2FzQUwpIHsKKyAgICAgICAgZGlnaXRCYXNlIC09ICcwJzsgLy8gbW92ZSBjb21tb24gYWRqdXN0bWVudCBvdXQgb2YgbG9vcAorCisgICAgICAgIGZvcihpbnQgaSA9IHN0YXJ0ICsgbGVuZ3RoOyAtLWkgPj0gc3RhcnQ7KSB7CisgICAgICAgICAgICBjaGFyIGNoID0gZGVzdFtpXTsKKyAgICAgICAgICAgIHN3aXRjaCAoQ2hhcmFjdGVyLmdldERpcmVjdGlvbmFsaXR5KGNoKSkgeworICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfTEVGVF9UT19SSUdIVDoKKyAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX1JJR0hUX1RPX0xFRlQ6CisgICAgICAgICAgICAgICAgbGFzdFN0cm9uZ1dhc0FMID0gZmFsc2U7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9SSUdIVF9UT19MRUZUX0FSQUJJQzoKKyAgICAgICAgICAgICAgICBsYXN0U3Ryb25nV2FzQUwgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfRVVST1BFQU5fTlVNQkVSOgorICAgICAgICAgICAgICAgIGlmIChsYXN0U3Ryb25nV2FzQUwgJiYgY2ggPD0gJ1x1MDAzOScpIHsKKyAgICAgICAgICAgICAgICAgICAgZGVzdFtpXSA9IChjaGFyKShjaCArIGRpZ2l0QmFzZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogTmFtZSAgICA6IGludmVydEJ1ZmZlcgorICAgICAqIEZ1bmN0aW9uOiBUaGlzIGZ1bmN0aW9uIGludmVydHMgdGhlIGJ1ZmZlciwgaXQncyB1c2VkCisgICAgICogICAgICAgICAgIGluIGNhc2UgdGhlIHVzZXIgc3BlY2lmaWVzIHRoZSBidWZmZXIgdG8gYmUKKyAgICAgKiAgICAgICAgICAgVEVYVF9ESVJFQ1RJT05fTE9HSUNBTAorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgaW52ZXJ0QnVmZmVyKGNoYXJbXSBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW5ndGgpIHsKKworICAgICAgICBmb3IoaW50IGkgPSBzdGFydCwgaiA9IHN0YXJ0ICsgbGVuZ3RoIC0gMTsgaSA8IGo7IGkrKywgLS1qKSB7CisgICAgICAgICAgICBjaGFyIHRlbXAgPSBidWZmZXJbaV07CisgICAgICAgICAgICBidWZmZXJbaV0gPSBidWZmZXJbal07CisgICAgICAgICAgICBidWZmZXJbal0gPSB0ZW1wOworICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBOYW1lICAgIDogY2hhbmdlTGFtQWxlZgorICAgICAqIEZ1bmN0aW9uOiBDb252ZXJ0cyB0aGUgQWxlZiBjaGFyYWN0ZXJzIGludG8gYW4gZXF1aXZhbGVudAorICAgICAqICAgICAgICAgICBMYW1BbGVmIGxvY2F0aW9uIGluIHRoZSAweDA2eHggUmFuZ2UsIHRoaXMgaXMgYW4KKyAgICAgKiAgICAgICAgICAgaW50ZXJtZWRpYXRlIHN0YWdlIGluIHRoZSBvcGVyYXRpb24gb2YgdGhlIHByb2dyYW0KKyAgICAgKiAgICAgICAgICAgbGF0ZXIgaXQnbGwgYmUgY29udmVydGVkIGludG8gdGhlIDB4RkV4eCBMYW1BbGVmcworICAgICAqICAgICAgICAgICBpbiB0aGUgc2hhcGluZyBmdW5jdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjaGFyIGNoYW5nZUxhbUFsZWYoY2hhciBjaCkgeworICAgICAgICBzd2l0Y2goY2gpIHsKKyAgICAgICAgY2FzZSAnXHUwNjIyJzogcmV0dXJuICdcdTA2NUMnOworICAgICAgICBjYXNlICdcdTA2MjMnOiByZXR1cm4gJ1x1MDY1RCc7CisgICAgICAgIGNhc2UgJ1x1MDYyNSc6IHJldHVybiAnXHUwNjVFJzsKKyAgICAgICAgY2FzZSAnXHUwNjI3JzogcmV0dXJuICdcdTA2NUYnOworICAgICAgICBkZWZhdWx0OiAgcmV0dXJuICdcdTAwMDAnOyAvLyBub3QgYSBsYW1hbGVmCisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIE5hbWUgICAgOiBzcGVjaWFsQ2hhcgorICAgICAqIEZ1bmN0aW9uOiBTcGVjaWFsIEFyYWJpYyBjaGFyYWN0ZXJzIG5lZWQgc3BlY2lhbCBoYW5kbGluZyBpbiB0aGUgc2hhcGVVbmljb2RlCisgICAgICogICAgICAgICAgIGZ1bmN0aW9uLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgMSBvciAyIGZvciB0aGVzZSBzcGVjaWFsIGNoYXJhY3RlcnMKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgc3BlY2lhbENoYXIoY2hhciBjaCkgeworICAgICAgICBpZiAoKGNoID4gJ1x1MDYyMScgJiYgY2ggPCAnXHUwNjI2JykgfHwKKyAgICAgICAgICAgIChjaCA9PSAnXHUwNjI3JykgfHwKKyAgICAgICAgICAgIChjaCA+ICdcdTA2MkUnICYmIGNoIDwgJ1x1MDYzMycpIHx8CisgICAgICAgICAgICAoY2ggPiAnXHUwNjQ3JyAmJiBjaCA8ICdcdTA2NEEnKSB8fAorICAgICAgICAgICAgKGNoID09ICdcdTA2MjknKSkgeworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0gZWxzZSBpZiAoY2ggPj0gJ1x1MDY0QicgJiYgY2g8PSAnXHUwNjUyJykgeworICAgICAgICAgICAgcmV0dXJuIDI7CisgICAgICAgIH0gZWxzZSBpZiAoY2ggPj0gMHgwNjUzICYmIGNoIDw9IDB4MDY1NSB8fAorICAgICAgICAgICAgICAgICAgIGNoID09IDB4MDY3MCB8fAorICAgICAgICAgICAgICAgICAgIGNoID49IDB4RkU3MCAmJiBjaCA8PSAweEZFN0YpIHsKKyAgICAgICAgICAgIHJldHVybiAzOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIE5hbWUgICAgOiBnZXRMaW5rCisgICAgICogRnVuY3Rpb246IFJlc29sdmVzIHRoZSBsaW5rIGJldHdlZW4gdGhlIGNoYXJhY3RlcnMgYXMKKyAgICAgKiAgICAgICAgICAgQXJhYmljIGNoYXJhY3RlcnMgaGF2ZSBmb3VyIGZvcm1zIDoKKyAgICAgKiAgICAgICAgICAgSXNvbGF0ZWQsIEluaXRpYWwsIE1pZGRsZSBhbmQgRmluYWwgRm9ybQorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGludCBnZXRMaW5rKGNoYXIgY2gpIHsKKyAgICAgICAgaWYgKGNoID49ICdcdTA2MjInICYmIGNoIDw9ICdcdTA2RDMnKSB7CisgICAgICAgICAgICByZXR1cm4gYXJhTGlua1tjaCAtICdcdTA2MjInXTsKKyAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnXHUyMDBEJykgeworICAgICAgICAgICAgcmV0dXJuIDM7CisgICAgICAgIH0gZWxzZSBpZiAoY2ggPj0gJ1x1MjA2RCcgJiYgY2ggPD0gJ1x1MjA2RicpIHsKKyAgICAgICAgICAgIHJldHVybiA0OworICAgICAgICB9IGVsc2UgaWYgKGNoID49ICdcdUZFNzAnICYmIGNoIDw9ICdcdUZFRkMnKSB7CisgICAgICAgICAgICByZXR1cm4gcHJlc0xpbmtbY2ggLSAnXHVGRTcwJ107CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogTmFtZSAgICA6IGNvdW50U3BhY2VzCisgICAgICogRnVuY3Rpb246IENvdW50cyB0aGUgbnVtYmVyIG9mIHNwYWNlcworICAgICAqICAgICAgICAgICBhdCBlYWNoIGVuZCBvZiB0aGUgbG9naWNhbCBidWZmZXIKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgY291bnRTcGFjZXNMZWZ0KGNoYXJbXSBkZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50KSB7CisgICAgICAgIGZvciAoaW50IGkgPSBzdGFydCwgZSA9IHN0YXJ0ICsgY291bnQ7IGkgPCBlOyArK2kpIHsKKyAgICAgICAgICAgIGlmIChkZXN0W2ldICE9IFNQQUNFX0NIQVIpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaSAtIHN0YXJ0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBjb3VudDsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgY291bnRTcGFjZXNSaWdodChjaGFyW10gZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50KSB7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IHN0YXJ0ICsgY291bnQ7IC0taSA+PSBzdGFydDspIHsKKyAgICAgICAgICAgIGlmIChkZXN0W2ldICE9IFNQQUNFX0NIQVIpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhcnQgKyBjb3VudCAtIDEgLSBpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBjb3VudDsKKyAgICB9CisKKyAgICAvKgorICAgICAqIE5hbWUgICAgOiBpc1Rhc2hrZWVsQ2hhcgorICAgICAqIEZ1bmN0aW9uOiBSZXR1cm5zIHRydWUgZm9yIFRhc2hrZWVsIGNoYXJhY3RlcnMgZWxzZSByZXR1cm4gZmFsc2UKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzVGFzaGtlZWxDaGFyKGNoYXIgY2gpIHsKKyAgICAgICAgcmV0dXJuICggY2ggPj0nXHUwNjRCJyAmJiBjaCA8PSAnXHUwNjUyJyApOworICAgIH0KKworICAgIC8qCisgICAgICpOYW1lICAgICA6IGlzU2VlblRhaWxGYW1pbHlDaGFyCisgICAgICpGdW5jdGlvbiA6IHJldHVybnMgMSBpZiB0aGUgY2hhcmFjdGVyIGlzIGEgc2VlbiBmYW1pbHkgaXNvbGF0ZWQgY2hhcmFjdGVyCisgICAgICogICAgICAgICAgIGluIHRoZSBGRSByYW5nZSBvdGhlcndpc2UgcmV0dXJucyAwCisgICAgICovCisKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgaXNTZWVuVGFpbEZhbWlseUNoYXIoY2hhciBjaCkgeworICAgICAgICBpZiAoY2ggPj0gMHhmZWIxICYmIGNoIDwgMHhmZWJmKXsKKyAgICAgICAgICAgICByZXR1cm4gdGFpbEZhbWlseUlzb2xhdGVkRmluYWwgW2NoIC0gMHhGRUIxXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgICAvKiBOYW1lICAgICA6IGlzU2VlbkZhbWlseUNoYXIKKyAgICAgICogRnVuY3Rpb24gOiByZXR1cm5zIDEgaWYgdGhlIGNoYXJhY3RlciBpcyBhIHNlZW4gZmFtaWx5IGNoYXJhY3RlciBpbiB0aGUgVW5pY29kZQorICAgICAgKiAgICAgICAgICAgIDA2IHJhbmdlIG90aGVyd2lzZSByZXR1cm5zIDAKKyAgICAgKi8KKworICAgIHByaXZhdGUgc3RhdGljIGludCBpc1NlZW5GYW1pbHlDaGFyKGNoYXIgIGNoKXsKKyAgICAgICAgaWYgKGNoID49IDB4NjMzICYmIGNoIDw9IDB4NjM2KXsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9ZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICpOYW1lICAgICA6IGlzVGFpbENoYXIKKyAgICAgKkZ1bmN0aW9uIDogcmV0dXJucyB0cnVlIGlmIHRoZSBjaGFyYWN0ZXIgbWF0Y2hlcyBvbmUgb2YgdGhlIHRhaWwgY2hhcmFjdGVycworICAgICAqICAgICAgICAgICAoMHhmZTczIG9yIDB4MjAwYikgb3RoZXJ3aXNlIHJldHVybnMgZmFsc2UKKyAgICAgKi8KKworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNUYWlsQ2hhcihjaGFyIGNoKSB7CisgICAgICAgIGlmKGNoID09IE9MRF9UQUlMX0NIQVIgfHwgY2ggPT0gTkVXX1RBSUxfQ0hBUil7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICpOYW1lICAgICA6IGlzQWxlZk1ha3NvdXJhQ2hhcgorICAgICAqRnVuY3Rpb24gOiByZXR1cm5zIHRydWUgaWYgdGhlIGNoYXJhY3RlciBpcyBhIEFsZWYgTWFrc291cmEgRmluYWwgb3IgaXNvbGF0ZWQKKyAgICAgKiAgICAgICAgICAgb3RoZXJ3aXNlIHJldHVybnMgZmFsc2UKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzQWxlZk1ha3NvdXJhQ2hhcihjaGFyIGNoKSB7CisgICAgICAgIHJldHVybiAoIChjaCA9PSAweEZFRUYpIHx8ICggY2ggPT0gMHhGRUYwKSB8fCAoY2ggPT0gMHgwNjQ5KSk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBOYW1lICAgICA6IGlzWWVoSGFtemFDaGFyCisgICAgICogRnVuY3Rpb24gOiByZXR1cm5zIHRydWUgaWYgdGhlIGNoYXJhY3RlciBpcyBhIHllaEhhbXphIGlzb2xhdGVkIG9yIHllaGhhbXphCisgICAgICogICAgICAgICAgICBmaW5hbCBpcyBmb3VuZCBvdGhlcndpc2UgcmV0dXJucyBmYWxzZQorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNZZWhIYW16YUNoYXIoY2hhciBjaCkgeworICAgICAgICBpZigoY2g9PTB4RkU4OSl8fChjaD09MHhGRThBKSl7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfWVsc2V7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqTmFtZSAgICAgOiBpc1Rhc2hrZWVsQ2hhckZFCisgICAgICpGdW5jdGlvbiA6IFJldHVybnMgdHJ1ZSBmb3IgVGFzaGtlZWwgY2hhcmFjdGVycyBpbiBGRSByYW5nZSBlbHNlIHJldHVybiBmYWxzZQorICAgICAqLworCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1Rhc2hrZWVsQ2hhckZFKGNoYXIgY2gpIHsKKyAgICAgICAgcmV0dXJuICggY2ghPTB4RkU3NSAmJihjaD49MHhGRTcwICYmIGNoPD0gMHhGRTdGKSApOworICAgIH0KKworICAgIC8qCisgICAgICogTmFtZTogaXNUYXNoa2VlbE9uVGF0d2VlbENoYXIKKyAgICAgKiBGdW5jdGlvbjogQ2hlY2tzIGlmIHRoZSBUYXNoa2VlbCBDaGFyYWN0ZXIgaXMgb24gVGF0d2VlbCBvciBub3QsaWYgdGhlCisgICAgICogICAgICAgICAgIFRhc2hrZWVsIG9uIHRhdHdlZWwgKEZFIHJhbmdlKSwgaXQgcmV0dXJucyAxIGVsc2UgaWYgdGhlCisgICAgICogICAgICAgICAgIFRhc2hrZWVsIHdpdGggc2hhZGRhIG9uIHRhdHdlZWwgKEZDIHJhbmdlKXJldHVybiAyIG90aGVyd2lzZQorICAgICAqICAgICAgICAgICByZXR1cm5zIDAKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgaXNUYXNoa2VlbE9uVGF0d2VlbENoYXIoY2hhciBjaCl7CisgICAgICAgIGlmIChjaCA+PSAweGZlNzAgJiYgY2ggPD0gMHhmZTdmICYmIGNoICE9IE5FV19UQUlMX0NIQVIgJiYgY2ggIT0gMHhGRTc1ICYmIGNoICE9IFNIQUREQV9UQVRXRUVMX0NIQVIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB0YXNoa2VlbE1lZGlhbCBbY2ggLSAweEZFNzBdOworICAgICAgICB9IGVsc2UgaWYoIChjaCA+PSAweGZjZjIgJiYgY2ggPD0gMHhmY2Y0KSB8fCAoY2ggPT0gU0hBRERBX1RBVFdFRUxfQ0hBUikpIHsKKyAgICAgICAgICAgIHJldHVybiAyOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIE5hbWU6IGlzSXNvbGF0ZWRUYXNoa2VlbENoYXIKKyAgICAgKiBGdW5jdGlvbjogQ2hlY2tzIGlmIHRoZSBUYXNoa2VlbCBDaGFyYWN0ZXIgaXMgaW4gdGhlIGlzb2xhdGVkIGZvcm0KKyAgICAgKiAgICAgICAgICAgKGkuZS4gVW5pY29kZSBGRSByYW5nZSkgcmV0dXJucyAxIGVsc2UgaWYgdGhlIFRhc2hrZWVsCisgICAgICogICAgICAgICAgIHdpdGggc2hhZGRhIGlzIGluIHRoZSBpc29sYXRlZCBmb3JtIChpLmUuIFVuaWNvZGUgRkMgcmFuZ2UpCisgICAgICogICAgICAgICAgIHJldHVybnMgMSBvdGhlcndpc2UgcmV0dXJucyAwCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IGlzSXNvbGF0ZWRUYXNoa2VlbENoYXIoY2hhciBjaCl7CisgICAgICAgIGlmIChjaCA+PSAweGZlNzAgJiYgY2ggPD0gMHhmZTdmICYmIGNoICE9IE5FV19UQUlMX0NIQVIgJiYgY2ggIT0gMHhGRTc1KXsKKyAgICAgICAgICAgIHJldHVybiAoMSAtIHRhc2hrZWVsTWVkaWFsIFtjaCAtIDB4RkU3MF0pOworICAgICAgICB9IGVsc2UgaWYoY2ggPj0gMHhmYzVlICYmIGNoIDw9IDB4ZmM2Myl7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfSBlbHNleworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIE5hbWUgICAgOiBpc0FsZWZDaGFyCisgICAgICogRnVuY3Rpb246IFJldHVybnMgMSBmb3IgQWxlZiBjaGFyYWN0ZXJzIGVsc2UgcmV0dXJuIDAKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzQWxlZkNoYXIoY2hhciBjaCkgeworICAgICAgICByZXR1cm4gY2ggPT0gJ1x1MDYyMicgfHwgY2ggPT0gJ1x1MDYyMycgfHwgY2ggPT0gJ1x1MDYyNScgfHwgY2ggPT0gJ1x1MDYyNyc7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBOYW1lICAgIDogaXNMYW1BbGVmQ2hhcgorICAgICAqIEZ1bmN0aW9uOiBSZXR1cm5zIHRydWUgZm9yIExhbUFsZWYgY2hhcmFjdGVycyBlbHNlIHJldHVybiBmYWxzZQorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNMYW1BbGVmQ2hhcihjaGFyIGNoKSB7CisgICAgICAgIHJldHVybiBjaCA+PSAnXHVGRUY1JyAmJiBjaCA8PSAnXHVGRUZDJzsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzTm9ybWFsaXplZExhbUFsZWZDaGFyKGNoYXIgY2gpIHsKKyAgICAgICAgcmV0dXJuIGNoID49ICdcdTA2NUMnICYmIGNoIDw9ICdcdTA2NUYnOworICAgIH0KKworICAgIC8qCisgICAgICogTmFtZSAgICA6IGNhbGN1bGF0ZVNpemUKKyAgICAgKiBGdW5jdGlvbjogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBkZXN0U2l6ZSB0byBiZSB1c2VkIGluIHByZWZsaWdodGluZworICAgICAqICAgICAgICAgICB3aGVuIHRoZSBkZXN0U2l6ZSBpcyBlcXVhbCB0byAwCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgY2FsY3VsYXRlU2l6ZShjaGFyW10gc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNvdXJjZVN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNvdXJjZUxlbmd0aCkgeworCisgICAgICAgIGludCBkZXN0U2l6ZSA9IHNvdXJjZUxlbmd0aDsKKworICAgICAgICBzd2l0Y2ggKG9wdGlvbnMgJiBMRVRURVJTX01BU0spIHsKKyAgICAgICAgY2FzZSBMRVRURVJTX1NIQVBFOgorICAgICAgICBjYXNlIExFVFRFUlNfU0hBUEVfVEFTSEtFRUxfSVNPTEFURUQ6CisgICAgICAgICAgICBpZiAoaXNMb2dpY2FsKSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IHNvdXJjZVN0YXJ0LCBlID0gc291cmNlU3RhcnQgKyBzb3VyY2VMZW5ndGggLSAxOyBpIDwgZTsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICgoc291cmNlW2ldID09IExBTV9DSEFSICYmIGlzQWxlZkNoYXIoc291cmNlW2krMV0pKSB8fCBpc1Rhc2hrZWVsQ2hhckZFKHNvdXJjZVtpXSkpeworICAgICAgICAgICAgICAgICAgICAgICAgLS1kZXN0U2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7IC8vIHZpc3VhbAorICAgICAgICAgICAgICAgIGZvcihpbnQgaSA9IHNvdXJjZVN0YXJ0ICsgMSwgZSA9IHNvdXJjZVN0YXJ0ICsgc291cmNlTGVuZ3RoOyBpIDwgZTsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICgoc291cmNlW2ldID09IExBTV9DSEFSICYmIGlzQWxlZkNoYXIoc291cmNlW2ktMV0pKSB8fCBpc1Rhc2hrZWVsQ2hhckZFKHNvdXJjZVtpXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC0tZGVzdFNpemU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIExFVFRFUlNfVU5TSEFQRToKKyAgICAgICAgICAgIGZvcihpbnQgaSA9IHNvdXJjZVN0YXJ0LCBlID0gc291cmNlU3RhcnQgKyBzb3VyY2VMZW5ndGg7IGkgPCBlOyArK2kpIHsKKyAgICAgICAgICAgICAgICBpZiAoaXNMYW1BbGVmQ2hhcihzb3VyY2VbaV0pKSB7CisgICAgICAgICAgICAgICAgICAgIGRlc3RTaXplKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGRlc3RTaXplOworICAgIH0KKworCisgICAgLyoKKyAgICAgKiBOYW1lICAgIDogY291bnRTcGFjZVN1YgorICAgICAqIEZ1bmN0aW9uOiBDb3VudHMgbnVtYmVyIG9mIHRpbWVzIHRoZSBzdWJDaGFyIGFwcGVhcnMgaW4gdGhlIGFycmF5CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBpbnQgY291bnRTcGFjZVN1YihjaGFyIFtdIGRlc3QsaW50IGxlbmd0aCwgY2hhciBzdWJDaGFyKXsKKyAgICAgICAgaW50IGkgPSAwOworICAgICAgICBpbnQgY291bnQgPSAwOworICAgICAgICB3aGlsZSAoaSA8IGxlbmd0aCkgeworICAgICAgICAgIGlmIChkZXN0W2ldID09IHN1YkNoYXIpIHsKKyAgICAgICAgICAgICAgY291bnQrKzsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgIGkrKzsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY291bnQ7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBOYW1lICAgIDogc2hpZnRBcnJheQorICAgICAqIEZ1bmN0aW9uOiBTaGlmdHMgY2hhcmFjdGVycyB0byByZXBsYWNlIHNwYWNlIHN1YiBjaGFyYWN0ZXJzCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHNoaWZ0QXJyYXkoY2hhciBbXSBkZXN0LGludCBzdGFydCwgaW50IGUsIGNoYXIgc3ViQ2hhcil7CisgICAgICAgIGludCB3ID0gZTsKKyAgICAgICAgaW50IHIgPSBlOworICAgICAgICB3aGlsZSAoLS1yID49IHN0YXJ0KSB7CisgICAgICAgICAgY2hhciBjaCA9IGRlc3Rbcl07CisgICAgICAgICAgaWYgKGNoICE9IHN1YkNoYXIpIHsKKyAgICAgICAgICAgIC0tdzsKKyAgICAgICAgICAgIGlmICh3ICE9IHIpIHsKKyAgICAgICAgICAgICAgZGVzdFt3XSA9IGNoOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgfQorCisgICAgLyoKKyAgICAgKiBOYW1lICAgIDogZmxpcEFycmF5CisgICAgICogRnVuY3Rpb246IGludmVydHMgYXJyYXksIHNvIHRoYXQgc3RhcnQgYmVjb21lcyBlbmQgYW5kIHZpY2UgdmVyc2EKKyAgICAgKi8KKyAgICAgIHB1YmxpYyBzdGF0aWMgaW50IGZsaXBBcnJheShjaGFyIFtdIGRlc3QsIGludCBzdGFydCwgaW50IGUsIGludCB3KXsKKyAgICAgICAgaW50IHI7CisgICAgICAgIGlmICh3ID4gc3RhcnQpIHsKKyAgICAgICAgLy8gc2hpZnQsIGFzc3VtZSBzbWFsbCBidWZmZXIgc2l6ZSBzbyBkb24ndCB1c2UgYXJyYXljb3B5CisgICAgICAgICAgciA9IHc7CisgICAgICAgICAgdyA9IHN0YXJ0OworICAgICAgICAgIHdoaWxlIChyIDwgZSkgeworICAgICAgICAgICAgZGVzdFt3KytdID0gZGVzdFtyKytdOworICAgICAgICAgICB9CisgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgIHcgPSBlOworICAgICAgICAgfQorICAgICAgICByZXR1cm4gdzsKKyAgICAgIH0KKworICAgIC8qCisgICAgICogTmFtZSAgICAgOiBoYW5kbGVUYXNoa2VlbFdpdGhUYXR3ZWVsCisgICAgICogRnVuY3Rpb24gOiBSZXBsYWNlcyBUYXNoa2VlbCBhcyBmb2xsb3dpbmc6CisgICAgICogICAgICAgICAgICBDYXNlIDEgOmlmIHRoZSBUYXNoa2VlbCBvbiB0YXR3ZWVsLCByZXBsYWNlIGl0IHdpdGggVGF0d2VlbC4KKyAgICAgKiAgICAgICAgICAgIENhc2UgMiA6aWYgdGhlIFRhc2hrZWVsIGFnZ3JlZ2F0ZWQgd2l0aCBTaGFkZGEgb24gVGF0d2VlbCwgcmVwbGFjZQorICAgICAqICAgICAgICAgICAgICAgICAgIGl0IHdpdGggU2hhZGRhIG9uIFRhdHdlZWwuCisgICAgICogICAgICAgICAgICBDYXNlIDM6IGlmIHRoZSBUYXNoa2VlbCBpcyBpc29sYXRlZCByZXBsYWNlIGl0IHdpdGggU3BhY2UuCisgICAgICoKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgaGFuZGxlVGFzaGtlZWxXaXRoVGF0d2VlbChjaGFyW10gZGVzdCwgaW50IHNvdXJjZUxlbmd0aCkgeworICAgICAgICAgICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICAgICAgICAgICBmb3IoaSA9IDA7IGkgPCBzb3VyY2VMZW5ndGg7IGkrKyl7CisgICAgICAgICAgICAgICAgICAgICAgICAgaWYoKGlzVGFzaGtlZWxPblRhdHdlZWxDaGFyKGRlc3RbaV0pID09IDEpKXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdFtpXSA9IFRBVFdFRUxfQ0hBUjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlIGlmKChpc1Rhc2hrZWVsT25UYXR3ZWVsQ2hhcihkZXN0W2ldKSA9PSAyKSl7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RbaV0gPSBTSEFEREFfVEFUV0VFTF9DSEFSOworICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2UgaWYoKGlzSXNvbGF0ZWRUYXNoa2VlbENoYXIoZGVzdFtpXSk9PTEpICYmIGRlc3RbaV0gIT0gU0hBRERBX0NIQVIpeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0W2ldID0gU1BBQ0VfQ0hBUjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzb3VyY2VMZW5ndGg7CisgICAgfQorCisgICAgLyoKKyAgICAgKk5hbWUgICAgIDogaGFuZGxlR2VuZXJhdGVkU3BhY2VzCisgICAgICpGdW5jdGlvbiA6IFRoZSBzaGFwZVVuaWNvZGUgZnVuY3Rpb24gY29udmVydHMgTGFtICsgQWxlZiBpbnRvIExhbUFsZWYgKyBzcGFjZSwKKyAgICAgKiAgICAgICAgICAgYW5kIFRhc2hrZWVsIHRvIHNwYWNlLgorICAgICAqICAgICAgICAgICBoYW5kbGVHZW5lcmF0ZWRTcGFjZXMgZnVuY3Rpb24gcHV0cyB0aGVzZSBnZW5lcmF0ZWQgc3BhY2VzCisgICAgICogICAgICAgICAgIGFjY29yZGluZyB0byB0aGUgb3B0aW9ucyB0aGUgdXNlciBzcGVjaWZpZXMuIExhbUFsZWYgYW5kIFRhc2hrZWVsCisgICAgICogICAgICAgICAgIHNwYWNlcyBjYW4gYmUgcmVwbGFjZWQgYXQgYmVnaW4sIGF0IGVuZCwgYXQgbmVhciBvciBkZWNyZWFzZSB0aGUKKyAgICAgKiAgICAgICAgICAgYnVmZmVyIHNpemUuCisgICAgICoKKyAgICAgKiAgICAgICAgICAgVGhlcmUgaXMgYWxzbyBBdXRvIG9wdGlvbiBmb3IgTGFtQWxlZiBhbmQgdGFzaGtlZWwsIHdoaWNoIHdpbGwgcHV0CisgICAgICogICAgICAgICAgIHRoZSBzcGFjZXMgYXQgZW5kIG9mIHRoZSBidWZmZXIgKG9yIGVuZCBvZiB0ZXh0IGlmIHRoZSB1c2VyIHVzZWQKKyAgICAgKiAgICAgICAgICAgdGhlIG9wdGlvbiBTUEFDRVNfUkVMQVRJVkVfVE9fVEVYVF9CRUdJTl9FTkQpLgorICAgICAqCisgICAgICogICAgICAgICAgIElmIHRoZSB0ZXh0IHR5cGUgd2FzIHZpc3VhbF9MVFIgYW5kIHRoZSBvcHRpb24KKyAgICAgKiAgICAgICAgICAgU1BBQ0VTX1JFTEFUSVZFX1RPX1RFWFRfQkVHSU5fRU5EIHdhcyBzZWxlY3RlZCB0aGUgRU5ECisgICAgICogICAgICAgICAgIG9wdGlvbiB3aWxsIHBsYWNlIHRoZSBzcGFjZSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBidWZmZXIgYW5kCisgICAgICogICAgICAgICAgIEJFR0lOIHdpbGwgcGxhY2UgdGhlIHNwYWNlIGF0IHRoZSBlbmQgb2YgdGhlIGJ1ZmZlci4KKyAgICAgKi8KKyAgcHJpdmF0ZSBpbnQgaGFuZGxlR2VuZXJhdGVkU3BhY2VzKGNoYXJbXSBkZXN0LAorICAgICAgICAgICAgaW50IHN0YXJ0LAorICAgICAgICAgICAgaW50IGxlbmd0aCkgeworCisgICAgICBpbnQgbGVuT3B0aW9uc0xhbUFsZWYgPSBvcHRpb25zICYgTEFNQUxFRl9NQVNLOworICAgICAgaW50IGxlbk9wdGlvbnNUYXNoa2VlbCA9IG9wdGlvbnMgJiBUQVNIS0VFTF9NQVNLOworICAgICAgYm9vbGVhbiBsYW1BbGVmT24gPSBmYWxzZTsKKyAgICAgIGJvb2xlYW4gdGFzaGtlZWxPbiA9IGZhbHNlOworCisgICAgICBpZiAoIWlzTG9naWNhbCAmICFzcGFjZXNSZWxhdGl2ZVRvVGV4dEJlZ2luRW5kKSB7CisgICAgICAgICAgc3dpdGNoIChsZW5PcHRpb25zTGFtQWxlZikgeworICAgICAgICAgIGNhc2UgTEFNQUxFRl9CRUdJTjogbGVuT3B0aW9uc0xhbUFsZWYgPSBMQU1BTEVGX0VORDsgYnJlYWs7CisgICAgICAgICAgY2FzZSBMQU1BTEVGX0VORDogbGVuT3B0aW9uc0xhbUFsZWYgPSBMQU1BTEVGX0JFR0lOOyBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgICAgIH0KKyAgICAgICAgICBzd2l0Y2ggKGxlbk9wdGlvbnNUYXNoa2VlbCl7CisgICAgICAgICAgY2FzZSBUQVNIS0VFTF9CRUdJTjogbGVuT3B0aW9uc1Rhc2hrZWVsID0gVEFTSEtFRUxfRU5EOyBicmVhazsKKyAgICAgICAgICBjYXNlIFRBU0hLRUVMX0VORDogbGVuT3B0aW9uc1Rhc2hrZWVsID0gVEFTSEtFRUxfQkVHSU47IGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisKKyAgICAgIGlmIChsZW5PcHRpb25zTGFtQWxlZiA9PSBMQU1BTEVGX05FQVIpIHsKKyAgICAgICAgICBmb3IgKGludCBpID0gc3RhcnQsIGUgPSBpICsgbGVuZ3RoOyBpIDwgZTsgKytpKSB7CisgICAgICAgICAgICAgIGlmIChkZXN0W2ldID09IExBTUFMRUZfU1BBQ0VfU1VCKSB7CisgICAgICAgICAgICAgICAgICBkZXN0W2ldID0gU1BBQ0VfQ0hBUl9GT1JfTEFNQUxFRjsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgfSBlbHNlIHsKKworICAgICAgICAgIGZpbmFsIGludCBlID0gc3RhcnQgKyBsZW5ndGg7CisgICAgICAgICAgaW50IHdMID0gY291bnRTcGFjZVN1YihkZXN0LCBsZW5ndGgsIExBTUFMRUZfU1BBQ0VfU1VCKTsKKyAgICAgICAgICBpbnQgd1QgPSBjb3VudFNwYWNlU3ViKGRlc3QsIGxlbmd0aCwgVEFTSEtFRUxfU1BBQ0VfU1VCKTsKKworICAgICAgICAgIGlmIChsZW5PcHRpb25zTGFtQWxlZiA9PSBMQU1BTEVGX0VORCl7CisgICAgICAgICAgICBsYW1BbGVmT24gPSB0cnVlOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAobGVuT3B0aW9uc1Rhc2hrZWVsID09IFRBU0hLRUVMX0VORCl7CisgICAgICAgICAgICB0YXNoa2VlbE9uID0gdHJ1ZTsKKyAgICAgICAgICB9CisKKworICAgICAgICAgIGlmIChsYW1BbGVmT24gJiYgKGxlbk9wdGlvbnNMYW1BbGVmID09IExBTUFMRUZfRU5EKSkgeworICAgICAgICAgICAgc2hpZnRBcnJheShkZXN0LCBzdGFydCwgZSwgTEFNQUxFRl9TUEFDRV9TVUIpOworICAgICAgICAgICAgd2hpbGUgKHdMID4gc3RhcnQpIHsKKyAgICAgICAgICAgICAgICBkZXN0Wy0td0xdID0gU1BBQ0VfQ0hBUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAodGFzaGtlZWxPbiAmJiAobGVuT3B0aW9uc1Rhc2hrZWVsID09IFRBU0hLRUVMX0VORCkpeworICAgICAgICAgICAgc2hpZnRBcnJheShkZXN0LCBzdGFydCwgZSwgVEFTSEtFRUxfU1BBQ0VfU1VCKTsKKyAgICAgICAgICAgIHdoaWxlICh3VCA+IHN0YXJ0KSB7CisgICAgICAgICAgICAgICAgIGRlc3RbLS13VF0gPSBTUEFDRV9DSEFSOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIGxhbUFsZWZPbiA9IGZhbHNlOworICAgICAgICAgIHRhc2hrZWVsT24gPSBmYWxzZTsKKworICAgICAgICAgIGlmIChsZW5PcHRpb25zTGFtQWxlZiA9PSBMQU1BTEVGX1JFU0laRSl7CisgICAgICAgICAgICBsYW1BbGVmT24gPSB0cnVlOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAobGVuT3B0aW9uc1Rhc2hrZWVsID09IFRBU0hLRUVMX1JFU0laRSl7CisgICAgICAgICAgICB0YXNoa2VlbE9uID0gdHJ1ZTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAobGFtQWxlZk9uICYmIChsZW5PcHRpb25zTGFtQWxlZiA9PSBMQU1BTEVGX1JFU0laRSkpeworICAgICAgICAgICAgICBzaGlmdEFycmF5KGRlc3QsIHN0YXJ0LCBlLCBMQU1BTEVGX1NQQUNFX1NVQik7CisgICAgICAgICAgICAgIHdMID0gZmxpcEFycmF5KGRlc3Qsc3RhcnQsZSwgd0wpOworICAgICAgICAgICAgICBsZW5ndGggPSB3TCAtIHN0YXJ0OworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAodGFzaGtlZWxPbiAmJiAobGVuT3B0aW9uc1Rhc2hrZWVsID09IFRBU0hLRUVMX1JFU0laRSkpIHsKKyAgICAgICAgICAgICAgc2hpZnRBcnJheShkZXN0LCBzdGFydCwgZSwgVEFTSEtFRUxfU1BBQ0VfU1VCKTsKKyAgICAgICAgICAgICAgd1QgPSBmbGlwQXJyYXkoZGVzdCxzdGFydCxlLCB3VCk7CisgICAgICAgICAgICAgIGxlbmd0aCA9IHdUIC0gc3RhcnQ7CisgICAgICAgICAgfQorCisgICAgICAgICAgbGFtQWxlZk9uID0gZmFsc2U7CisgICAgICAgICAgdGFzaGtlZWxPbiA9IGZhbHNlOworCisgICAgICAgICAgaWYgKChsZW5PcHRpb25zTGFtQWxlZiA9PSBMQU1BTEVGX0JFR0lOKSB8fAorICAgICAgICAgICAgICAobGVuT3B0aW9uc0xhbUFsZWYgPT0gTEFNQUxFRl9BVVRPKSl7CisgICAgICAgICAgICAgICAgbGFtQWxlZk9uID0gdHJ1ZTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKGxlbk9wdGlvbnNUYXNoa2VlbCA9PSBUQVNIS0VFTF9CRUdJTil7CisgICAgICAgICAgICAgICAgdGFzaGtlZWxPbiA9IHRydWU7CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKGxhbUFsZWZPbiAmJiAoKGxlbk9wdGlvbnNMYW1BbGVmID09IExBTUFMRUZfQkVHSU4pfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAobGVuT3B0aW9uc0xhbUFsZWYgPT0gTEFNQUxFRl9BVVRPKSkpIHsgLy8gc3BhY2VzIGF0IGJlZ2lubmluZworICAgICAgICAgICAgICBzaGlmdEFycmF5KGRlc3QsIHN0YXJ0LCBlLCBMQU1BTEVGX1NQQUNFX1NVQik7CisgICAgICAgICAgICAgICB3TCA9IGZsaXBBcnJheShkZXN0LHN0YXJ0LGUsIHdMKTsKKyAgICAgICAgICAgICAgICAgIHdoaWxlICh3TCA8IGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICBkZXN0W3dMKytdID0gU1BBQ0VfQ0hBUjsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBpZih0YXNoa2VlbE9uICYmIChsZW5PcHRpb25zVGFzaGtlZWwgPT0gVEFTSEtFRUxfQkVHSU4pKXsKKyAgICAgICAgICAgICAgIHNoaWZ0QXJyYXkoZGVzdCwgc3RhcnQsIGUsIFRBU0hLRUVMX1NQQUNFX1NVQik7CisgICAgICAgICAgICAgICB3VCA9IGZsaXBBcnJheShkZXN0LHN0YXJ0LGUsIHdUKTsKKyAgICAgICAgICAgICAgICAgIHdoaWxlICh3VCA8IGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICBkZXN0W3dUKytdID0gU1BBQ0VfQ0hBUjsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICB9CisKKyAgICAgIHJldHVybiBsZW5ndGg7CisgIH0KKworCisgIC8qCisgICAqTmFtZSAgICAgOmV4cGFuZENvbXBvc2l0Q2hhckF0QmVnaW4KKyAgICpGdW5jdGlvbiA6RXhwYW5kcyB0aGUgTGFtQWxlZiBjaGFyYWN0ZXIgdG8gTGFtIGFuZCBBbGVmIGNvbnN1bWluZyB0aGUgcmVxdWlyZWQKKyAgICogICAgICAgICBzcGFjZSBmcm9tIGJlZ2lubmluZyBvZiB0aGUgYnVmZmVyLiBJZiB0aGUgdGV4dCB0eXBlIHdhcyB2aXN1YWxfTFRSCisgICAqICAgICAgICAgYW5kIHRoZSBvcHRpb24gU1BBQ0VTX1JFTEFUSVZFX1RPX1RFWFRfQkVHSU5fRU5EIHdhcyBzZWxlY3RlZAorICAgKiAgICAgICAgIHRoZSBzcGFjZXMgd2lsbCBiZSBsb2NhdGVkIGF0IGVuZCBvZiBidWZmZXIuCisgICAqICAgICAgICAgSWYgdGhlcmUgYXJlIG5vIHNwYWNlcyB0byBleHBhbmQgdGhlIExhbUFsZWYsIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24uCisqLworIHByaXZhdGUgYm9vbGVhbiBleHBhbmRDb21wb3NpdENoYXJBdEJlZ2luKGNoYXJbXSBkZXN0LGludCBzdGFydCwgaW50IGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGFjb3VudCkgeworICAgICBib29sZWFuIHNwYWNlTm90Rm91bmQgPSBmYWxzZTsKKworICAgICBpZiAobGFjb3VudCA+IGNvdW50U3BhY2VzUmlnaHQoZGVzdCwgc3RhcnQsIGxlbmd0aCkpIHsKKyAgICAgICAgIHNwYWNlTm90Rm91bmQgPSB0cnVlOworICAgICAgICAgcmV0dXJuIHNwYWNlTm90Rm91bmQ7CisgICAgIH0KKyAgICAgZm9yIChpbnQgciA9IHN0YXJ0ICsgbGVuZ3RoIC0gbGFjb3VudCwgdyA9IHN0YXJ0ICsgbGVuZ3RoOyAtLXIgPj0gc3RhcnQ7KSB7CisgICAgICAgICBjaGFyIGNoID0gZGVzdFtyXTsKKyAgICAgICAgIGlmIChpc05vcm1hbGl6ZWRMYW1BbGVmQ2hhcihjaCkpIHsKKyAgICAgICAgICAgICBkZXN0Wy0td10gPSBMQU1fQ0hBUjsKKyAgICAgICAgICAgICBkZXN0Wy0td10gPSBjb252ZXJ0Tm9ybWFsaXplZExhbUFsZWZbY2ggLSAnXHUwNjVDJ107CisgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgIGRlc3RbLS13XSA9IGNoOworICAgICAgICAgfQorICAgICB9CisgICAgIHJldHVybiBzcGFjZU5vdEZvdW5kOworCisgIH0KKworICAvKgorICAgKk5hbWUgICAgIDogZXhwYW5kQ29tcG9zaXRDaGFyQXRFbmQKKyAgICpGdW5jdGlvbiA6IEV4cGFuZHMgdGhlIExhbUFsZWYgY2hhcmFjdGVyIHRvIExhbSBhbmQgQWxlZiBjb25zdW1pbmcgdGhlCisgICAqICAgICAgICAgICByZXF1aXJlZCBzcGFjZSBmcm9tIGVuZCBvZiB0aGUgYnVmZmVyLiBJZiB0aGUgdGV4dCB0eXBlIHdhcworICAgKiAgICAgICAgICAgVmlzdWFsIExUUiBhbmQgdGhlIG9wdGlvbiBTUEFDRVNfUkVMQVRJVkVfVE9fVEVYVF9CRUdJTl9FTkQKKyAgICogICAgICAgICAgIHdhcyB1c2VkLCB0aGUgc3BhY2VzIHdpbGwgYmUgY29uc3VtZWQgZnJvbSBiZWdpbiBvZiBidWZmZXIuIElmCisgICAqICAgICAgICAgICB0aGVyZSBhcmUgbm8gc3BhY2VzIHRvIGV4cGFuZCB0aGUgTGFtQWxlZiwgYW4gZXhjZXB0aW9uIGlzIHRocm93bi4KKyAgICovCisKKyAgcHJpdmF0ZSBib29sZWFuICBleHBhbmRDb21wb3NpdENoYXJBdEVuZChjaGFyW10gZGVzdCxpbnQgc3RhcnQsIGludCBsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsYWNvdW50KXsKKyAgICAgIGJvb2xlYW4gc3BhY2VOb3RGb3VuZCA9IGZhbHNlOworCisgICAgICBpZiAobGFjb3VudCA+IGNvdW50U3BhY2VzTGVmdChkZXN0LCBzdGFydCwgbGVuZ3RoKSkgeworICAgICAgICAgIHNwYWNlTm90Rm91bmQgPSB0cnVlOworICAgICAgICAgIHJldHVybiBzcGFjZU5vdEZvdW5kOworICAgICAgfQorICAgICAgZm9yIChpbnQgciA9IHN0YXJ0ICsgbGFjb3VudCwgdyA9IHN0YXJ0LCBlID0gc3RhcnQgKyBsZW5ndGg7IHIgPCBlOyArK3IpIHsKKyAgICAgICAgICBjaGFyIGNoID0gZGVzdFtyXTsKKyAgICAgICAgICBpZiAoaXNOb3JtYWxpemVkTGFtQWxlZkNoYXIoY2gpKSB7CisgICAgICAgICAgICAgIGRlc3RbdysrXSA9IGNvbnZlcnROb3JtYWxpemVkTGFtQWxlZltjaCAtICdcdTA2NUMnXTsKKyAgICAgICAgICAgICAgZGVzdFt3KytdID0gTEFNX0NIQVI7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgZGVzdFt3KytdID0gY2g7CisgICAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIHNwYWNlTm90Rm91bmQ7CisgIH0KKworICAvKgorICAgKk5hbWUgICAgIDogZXhwYW5kQ29tcG9zaXRDaGFyQXROZWFyCisgICAqRnVuY3Rpb24gOiBFeHBhbmRzIHRoZSBMYW1BbGVmIGNoYXJhY3RlciBpbnRvIExhbSArIEFsZWYsIFllaEhhbXphIGNoYXJhY3RlcgorICAgKiAgICAgICAgICAgaW50byBZZWggKyBIYW16YSwgU2VlbkZhbWlseSBjaGFyYWN0ZXIgaW50byBTZWVuRmFtaWx5IGNoYXJhY3RlcgorICAgKiAgICAgICAgICAgKyBUYWlsLCB3aGlsZSBjb25zdW1pbmcgdGhlIHNwYWNlIG5leHQgdG8gdGhlIGNoYXJhY3Rlci4KKyAgICovCisKKyAgcHJpdmF0ZSBib29sZWFuIGV4cGFuZENvbXBvc2l0Q2hhckF0TmVhcihjaGFyW10gZGVzdCxpbnQgc3RhcnQsIGludCBsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeWVoSGFtemFPcHRpb24sIGludCBzZWVuVGFpbE9wdGlvbiwgaW50IGxhbUFsZWZPcHRpb24peworCisgICAgICBib29sZWFuIHNwYWNlTm90Rm91bmQgPSBmYWxzZTsKKworCisKKyAgICAgIGlmIChpc05vcm1hbGl6ZWRMYW1BbGVmQ2hhcihkZXN0W3N0YXJ0XSkpIHsKKyAgICAgICAgICBzcGFjZU5vdEZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICByZXR1cm4gc3BhY2VOb3RGb3VuZDsKKyAgICAgIH0KKyAgICAgIGZvciAoaW50IGkgPSBzdGFydCArIGxlbmd0aDsgLS1pID49c3RhcnQ7KSB7CisgICAgICAgICAgY2hhciBjaCA9IGRlc3RbaV07CisgICAgICAgICAgaWYgKGxhbUFsZWZPcHRpb24gPT0gMSAmJiBpc05vcm1hbGl6ZWRMYW1BbGVmQ2hhcihjaCkpIHsKKyAgICAgICAgICAgICAgaWYgKGk+c3RhcnQgJiZkZXN0W2ktMV0gPT0gU1BBQ0VfQ0hBUikgeworICAgICAgICAgICAgICAgICAgZGVzdFtpXSA9IExBTV9DSEFSOworICAgICAgICAgICAgICAgICAgZGVzdFstLWldID0gY29udmVydE5vcm1hbGl6ZWRMYW1BbGVmW2NoIC0gJ1x1MDY1QyddOworICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgc3BhY2VOb3RGb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICByZXR1cm4gc3BhY2VOb3RGb3VuZDsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgIH1lbHNlIGlmKHNlZW5UYWlsT3B0aW9uID09IDEgJiYgaXNTZWVuVGFpbEZhbWlseUNoYXIoY2gpID09IDEpeworICAgICAgICAgICAgICBpZihpPnN0YXJ0ICYmZGVzdFtpLTFdID09IFNQQUNFX0NIQVIpeworICAgICAgICAgICAgICAgICAgZGVzdFtpLTFdID0gdGFpbENoYXI7CisgICAgICAgICAgICAgIH0gZWxzZXsKKyAgICAgICAgICAgICAgICAgIHNwYWNlTm90Rm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgcmV0dXJuIHNwYWNlTm90Rm91bmQ7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICB9ZWxzZSBpZih5ZWhIYW16YU9wdGlvbiA9PSAxICYmIGlzWWVoSGFtemFDaGFyKGNoKSl7CisKKyAgICAgICAgICAgICAgIGlmKGk+c3RhcnQgJiZkZXN0W2ktMV0gPT0gU1BBQ0VfQ0hBUil7CisgICAgICAgICAgICAgICAgICBkZXN0W2ldID0geWVoSGFtemFUb1llaFtjaCAtIFlFSF9IQU1aQUZFX0NIQVJdOworICAgICAgICAgICAgICAgICAgZGVzdFtpLTFdID0gSEFNWkFGRV9DSEFSOworICAgICAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICAgIHNwYWNlTm90Rm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgcmV0dXJuIHNwYWNlTm90Rm91bmQ7CisgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgfQorCisgICAgLyoKKyAgICAgKiBOYW1lICAgIDogZXhwYW5kQ29tcG9zaXRDaGFyCisgICAgICogRnVuY3Rpb246IExhbUFsZWYgbmVlZHMgc3BlY2lhbCBoYW5kbGluZyBhcyB0aGUgTGFtQWxlZiBpcworICAgICAqICAgICAgICAgICBvbmUgY2hhcmFjdGVyIHdoaWxlIGV4cGFuZGluZyBpdCB3aWxsIGdpdmUgdHdvCisgICAgICogICAgICAgICAgIGNoYXJhY3RlcnMgTGFtICsgQWxlZiwgc28gd2UgbmVlZCB0byBleHBhbmQgdGhlIExhbUFsZWYKKyAgICAgKiAgICAgICAgICAgaW4gbmVhciBvciBmYXIgc3BhY2VzIGFjY29yZGluZyB0byB0aGUgb3B0aW9ucyB0aGUgdXNlcgorICAgICAqICAgICAgICAgICBzcGVjaWZpZXMgb3IgaW5jcmVhc2UgdGhlIGJ1ZmZlciBzaXplLgorICAgICAqICAgICAgICAgICBEZXN0IGhhcyBlbm91Z2ggcm9vbSBmb3IgdGhlIGV4cGFuc2lvbiBpZiB3ZSBhcmUgZ3Jvd2luZy4KKyAgICAgKiAgICAgICAgICAgbGFtYWxlZiBhcmUgbm9ybWFsaXplZCB0byB0aGUgJ3NwZWNpYWwgY2hhcmFjdGVycycKKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBleHBhbmRDb21wb3NpdENoYXIoY2hhcltdIGRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxhY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2hhcGluZ01vZGUpIHRocm93cyBBcmFiaWNTaGFwaW5nRXhjZXB0aW9uIHsKKworICAgICAgICBpbnQgbGVuT3B0aW9uc0xhbUFsZWYgPSBvcHRpb25zICYgTEFNQUxFRl9NQVNLOworICAgICAgICBpbnQgbGVuT3B0aW9uc1NlZW4gPSBvcHRpb25zICYgU0VFTl9NQVNLOworICAgICAgICBpbnQgbGVuT3B0aW9uc1llaEhhbXphID0gb3B0aW9ucyAmIFlFSEhBTVpBX01BU0s7CisgICAgICAgIGJvb2xlYW4gc3BhY2VOb3RGb3VuZCA9IGZhbHNlOworCisgICAgICAgIGlmICghaXNMb2dpY2FsICYmICFzcGFjZXNSZWxhdGl2ZVRvVGV4dEJlZ2luRW5kKSB7CisgICAgICAgICAgICBzd2l0Y2ggKGxlbk9wdGlvbnNMYW1BbGVmKSB7CisgICAgICAgICAgICBjYXNlIExBTUFMRUZfQkVHSU46IGxlbk9wdGlvbnNMYW1BbGVmID0gTEFNQUxFRl9FTkQ7IGJyZWFrOworICAgICAgICAgICAgY2FzZSBMQU1BTEVGX0VORDogbGVuT3B0aW9uc0xhbUFsZWYgPSBMQU1BTEVGX0JFR0lOOyBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYoc2hhcGluZ01vZGUgPT0gMSl7CisgICAgICAgICAgICBpZihsZW5PcHRpb25zTGFtQWxlZiA9PSBMQU1BTEVGX0FVVE8peworICAgICAgICAgICAgICAgIGlmKGlzTG9naWNhbCl7CisgICAgICAgICAgICAgICAgICAgIHNwYWNlTm90Rm91bmQgPSBleHBhbmRDb21wb3NpdENoYXJBdEVuZChkZXN0LCBzdGFydCwgbGVuZ3RoLCBsYWNvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgaWYoc3BhY2VOb3RGb3VuZCl7CisgICAgICAgICAgICAgICAgICAgICAgICBzcGFjZU5vdEZvdW5kID0gZXhwYW5kQ29tcG9zaXRDaGFyQXRCZWdpbihkZXN0LCBzdGFydCwgbGVuZ3RoLCBsYWNvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZihzcGFjZU5vdEZvdW5kKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwYWNlTm90Rm91bmQgPSBleHBhbmRDb21wb3NpdENoYXJBdE5lYXIoZGVzdCwgc3RhcnQsIGxlbmd0aCwwLDAsMSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYoc3BhY2VOb3RGb3VuZCl7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJhYmljU2hhcGluZ0V4Y2VwdGlvbigiTm8gc3BhY2Vmb3IgbGFtYWxlZiIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgICAgIHNwYWNlTm90Rm91bmQgPSBleHBhbmRDb21wb3NpdENoYXJBdEJlZ2luKGRlc3QsIHN0YXJ0LCBsZW5ndGgsIGxhY291bnQpOworICAgICAgICAgICAgICAgICAgICBpZihzcGFjZU5vdEZvdW5kKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwYWNlTm90Rm91bmQgPSBleHBhbmRDb21wb3NpdENoYXJBdEVuZChkZXN0LCBzdGFydCwgbGVuZ3RoLCBsYWNvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZihzcGFjZU5vdEZvdW5kKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwYWNlTm90Rm91bmQgPSBleHBhbmRDb21wb3NpdENoYXJBdE5lYXIoZGVzdCwgc3RhcnQsIGxlbmd0aCwwLDAsMSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYoc3BhY2VOb3RGb3VuZCl7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJhYmljU2hhcGluZ0V4Y2VwdGlvbigiTm8gc3BhY2Vmb3IgbGFtYWxlZiIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfWVsc2UgaWYobGVuT3B0aW9uc0xhbUFsZWYgPT0gTEFNQUxFRl9FTkQpeworICAgICAgICAgICAgICAgIHNwYWNlTm90Rm91bmQgPSBleHBhbmRDb21wb3NpdENoYXJBdEVuZChkZXN0LCBzdGFydCwgbGVuZ3RoLCBsYWNvdW50KTsKKyAgICAgICAgICAgICAgICBpZihzcGFjZU5vdEZvdW5kKXsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyYWJpY1NoYXBpbmdFeGNlcHRpb24oIk5vIHNwYWNlZm9yIGxhbWFsZWYiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9ZWxzZSBpZihsZW5PcHRpb25zTGFtQWxlZiA9PSBMQU1BTEVGX0JFR0lOKXsKKyAgICAgICAgICAgICAgICBzcGFjZU5vdEZvdW5kID0gZXhwYW5kQ29tcG9zaXRDaGFyQXRCZWdpbihkZXN0LCBzdGFydCwgbGVuZ3RoLCBsYWNvdW50KTsKKyAgICAgICAgICAgICAgICBpZihzcGFjZU5vdEZvdW5kKXsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyYWJpY1NoYXBpbmdFeGNlcHRpb24oIk5vIHNwYWNlZm9yIGxhbWFsZWYiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9ZWxzZSBpZihsZW5PcHRpb25zTGFtQWxlZiA9PSBMQU1BTEVGX05FQVIpeworICAgICAgICAgICAgICAgIHNwYWNlTm90Rm91bmQgPSBleHBhbmRDb21wb3NpdENoYXJBdE5lYXIoZGVzdCwgc3RhcnQsIGxlbmd0aCwwLDAsMSk7CisgICAgICAgICAgICAgICAgaWYoc3BhY2VOb3RGb3VuZCl7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmFiaWNTaGFwaW5nRXhjZXB0aW9uKCJObyBzcGFjZWZvciBsYW1hbGVmIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB9ZWxzZSBpZihsZW5PcHRpb25zTGFtQWxlZiA9PSBMQU1BTEVGX1JFU0laRSl7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgciA9IHN0YXJ0ICsgbGVuZ3RoLCB3ID0gciArIGxhY291bnQ7IC0tciA+PSBzdGFydDspIHsKKyAgICAgICAgICAgICAgICAgICAgY2hhciBjaCA9IGRlc3Rbcl07CisgICAgICAgICAgICAgICAgICAgIGlmIChpc05vcm1hbGl6ZWRMYW1BbGVmQ2hhcihjaCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RbLS13XSA9ICdcdTA2NDQnOworICAgICAgICAgICAgICAgICAgICAgICAgZGVzdFstLXddID0gY29udmVydE5vcm1hbGl6ZWRMYW1BbGVmW2NoIC0gJ1x1MDY1QyddOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZGVzdFstLXddID0gY2g7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbGVuZ3RoICs9IGxhY291bnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICBpZihsZW5PcHRpb25zU2VlbiA9PSBTRUVOX1RXT0NFTExfTkVBUil7CisgICAgICAgICAgICAgICAgc3BhY2VOb3RGb3VuZCA9IGV4cGFuZENvbXBvc2l0Q2hhckF0TmVhcihkZXN0LCBzdGFydCwgbGVuZ3RoLDAsMSwwKTsKKyAgICAgICAgICAgICAgICBpZihzcGFjZU5vdEZvdW5kKXsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyYWJpY1NoYXBpbmdFeGNlcHRpb24oIk5vIHNwYWNlIGZvciBTZWVuIHRhaWwgZXhwYW5zaW9uIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYobGVuT3B0aW9uc1llaEhhbXphID09IFlFSEhBTVpBX1RXT0NFTExfTkVBUil7CisgICAgICAgICAgICAgICAgc3BhY2VOb3RGb3VuZCA9IGV4cGFuZENvbXBvc2l0Q2hhckF0TmVhcihkZXN0LCBzdGFydCwgbGVuZ3RoLDEsMCwwKTsKKyAgICAgICAgICAgICAgICBpZihzcGFjZU5vdEZvdW5kKXsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyYWJpY1NoYXBpbmdFeGNlcHRpb24oIk5vIHNwYWNlIGZvciBZZWhIYW16YSBleHBhbnNpb24iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIHJldHVybiBsZW5ndGg7CisgICAgfQorCisKKyAgICAvKiBDb252ZXJ0IHRoZSBpbnB1dCBidWZmZXIgZnJvbSBGRXh4IFJhbmdlIGludG8gMDZ4eCBSYW5nZQorICAgICAqIHRvIHB1dCBhbGwgY2hhcmFjdGVycyBpbnRvIHRoZSAwNnh4IHJhbmdlCisgICAgICogZXZlbiB0aGUgbGFtYWxlZiBpcyBjb252ZXJ0ZWQgdG8gdGhlIHNwZWNpYWwgcmVnaW9uIGluCisgICAgICogdGhlIDA2eHggcmFuZ2UuICBSZXR1cm4gdGhlIG51bWJlciBvZiBsYW1hbGVmIGNoYXJzIGZvdW5kLgorICAgICAqLworICAgIHByaXZhdGUgaW50IG5vcm1hbGl6ZShjaGFyW10gZGVzdCwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7CisgICAgICAgIGludCBsYWNvdW50ID0gMDsKKyAgICAgICAgZm9yIChpbnQgaSA9IHN0YXJ0LCBlID0gaSArIGxlbmd0aDsgaSA8IGU7ICsraSkgeworICAgICAgICAgICAgY2hhciBjaCA9IGRlc3RbaV07CisgICAgICAgICAgICBpZiAoY2ggPj0gJ1x1RkU3MCcgJiYgY2ggPD0gJ1x1RkVGQycpIHsKKyAgICAgICAgICAgICAgICBpZiAoaXNMYW1BbGVmQ2hhcihjaCkpIHsKKyAgICAgICAgICAgICAgICAgICAgKytsYWNvdW50OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkZXN0W2ldID0gKGNoYXIpY29udmVydEZFdG8wNltjaCAtICdcdUZFNzAnXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbGFjb3VudDsKKyAgICB9CisKKyAgICAvKgorICAgICAqIE5hbWUgICAgOiBkZXNoYXBlTm9ybWFsaXplCisgICAgICogRnVuY3Rpb246IENvbnZlcnQgdGhlIGlucHV0IGJ1ZmZlciBmcm9tIEZFeHggUmFuZ2UgaW50byAwNnh4IFJhbmdlCisgICAgICogICAgICAgICAgIGV2ZW4gdGhlIGxhbWFsZWYgaXMgY29udmVydGVkIHRvIHRoZSBzcGVjaWFsIHJlZ2lvbiBpbiB0aGUgMDZ4eCByYW5nZS4KKyAgICAgKiAgICAgICAgICAgQWNjb3JkaW5nIHRvIHRoZSBvcHRpb25zIHRoZSB1c2VyIGVudGVycywgYWxsIHNlZW4gZmFtaWx5IGNoYXJhY3RlcnMKKyAgICAgKiAgICAgICAgICAgZm9sbG93ZWQgYnkgYSB0YWlsIGNoYXJhY3RlciBhcmUgbWVyZ2VkIHRvIHNlZW4gdGFpbCBmYW1pbHkgY2hhcmFjdGVyIGFuZAorICAgICAqICAgICAgICAgICBhbnkgeWVoIGZvbGxvd2VkIGJ5IGEgaGFtemEgY2hhcmFjdGVyIGFyZSBtZXJnZWQgdG8geWVoaGFtemEgY2hhcmFjdGVyLgorICAgICAqICAgICAgICAgICBNZXRob2QgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGxhbWFsZWYgY2hhcnMgZm91bmQuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgZGVzaGFwZU5vcm1hbGl6ZShjaGFyW10gZGVzdCwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7CisgICAgICAgIGludCBsYWNvdW50ID0gMDsKKyAgICAgICAgaW50IHllaEhhbXphQ29tcG9zZUVuYWJsZWQgPSAwOworICAgICAgICBpbnQgc2VlbkNvbXBvc2VFbmFibGVkID0gMDsKKworICAgICAgICB5ZWhIYW16YUNvbXBvc2VFbmFibGVkID0gKChvcHRpb25zJllFSEhBTVpBX01BU0spID09IFlFSEhBTVpBX1RXT0NFTExfTkVBUikgPyAxIDogMDsKKyAgICAgICAgc2VlbkNvbXBvc2VFbmFibGVkID0gKChvcHRpb25zJlNFRU5fTUFTSykgPT0gU0VFTl9UV09DRUxMX05FQVIpPyAxIDogMDsKKworICAgICAgICBmb3IgKGludCBpID0gc3RhcnQsIGUgPSBpICsgbGVuZ3RoOyBpIDwgZTsgKytpKSB7CisgICAgICAgICAgICBjaGFyIGNoID0gZGVzdFtpXTsKKworICAgICAgICBpZiggKHllaEhhbXphQ29tcG9zZUVuYWJsZWQgPT0gMSkgJiYgKChjaCA9PSBIQU1aQTA2X0NIQVIpIHx8IChjaCA9PSBIQU1aQUZFX0NIQVIpKQorICAgICAgICAgICAgICAgJiYgKGkgPCAobGVuZ3RoIC0gMSkpICYmIGlzQWxlZk1ha3NvdXJhQ2hhcihkZXN0W2krMV0gKSkgeworICAgICAgICAgICAgICAgIGRlc3RbaV0gPSBTUEFDRV9DSEFSOworICAgICAgICAgICAgICAgIGRlc3RbaSsxXSA9IFlFSF9IQU1aQV9DSEFSOworICAgICAgIH0gZWxzZSBpZiAoIChzZWVuQ29tcG9zZUVuYWJsZWQgPT0gMSkgJiYgKGlzVGFpbENoYXIoY2gpKSAmJiAoaTwgKGxlbmd0aCAtIDEpKQorICAgICAgICAgICAgICAgICAgICAgICAmJiAoaXNTZWVuVGFpbEZhbWlseUNoYXIoZGVzdFtpKzFdKT09MSkgKSB7CisgICAgICAgICAgICAgICBkZXN0W2ldID0gU1BBQ0VfQ0hBUjsKKyAgICAgICB9CisgICAgICAgZWxzZSBpZiAoY2ggPj0gJ1x1RkU3MCcgJiYgY2ggPD0gJ1x1RkVGQycpIHsKKyAgICAgICAgICAgICAgICBpZiAoaXNMYW1BbGVmQ2hhcihjaCkpIHsKKyAgICAgICAgICAgICAgICAgICAgKytsYWNvdW50OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkZXN0W2ldID0gKGNoYXIpY29udmVydEZFdG8wNltjaCAtICdcdUZFNzAnXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbGFjb3VudDsKKyAgICB9CisKKyAgICAvKgorICAgICAqIE5hbWUgICAgOiBzaGFwZVVuaWNvZGUKKyAgICAgKiBGdW5jdGlvbjogQ29udmVydHMgYW4gQXJhYmljIFVuaWNvZGUgYnVmZmVyIGluIDA2eHggUmFuZ2UgaW50byBhIHNoYXBlZAorICAgICAqICAgICAgICAgICBhcmFiaWMgVW5pY29kZSBidWZmZXIgaW4gRkV4eCBSYW5nZQorICAgICAqLworICAgIHByaXZhdGUgaW50IHNoYXBlVW5pY29kZShjaGFyW10gZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0YXNoa2VlbEZsYWcpdGhyb3dzIEFyYWJpY1NoYXBpbmdFeGNlcHRpb24geworCisgICAgICAgIGludCBsYW1hbGVmX2NvdW50ID0gbm9ybWFsaXplKGRlc3QsIHN0YXJ0LCBsZW5ndGgpOworCisgICAgICAgIC8vIHJlc29sdmUgdGhlIGxpbmsgYmV0d2VlbiB0aGUgY2hhcmFjdGVycy4KKyAgICAgICAgLy8gQXJhYmljIGNoYXJhY3RlcnMgaGF2ZSBmb3VyIGZvcm1zOiBJc29sYXRlZCwgSW5pdGlhbCwgTWVkaWFsIGFuZCBGaW5hbC4KKyAgICAgICAgLy8gVGFzaGtlZWwgY2hhcmFjdGVycyBoYXZlIHR3bywgaXNvbGF0ZWQgb3IgbWVkaWFsLCBhbmQgc29tZXRpbWVzIG9ubHkgaXNvbGF0ZWQuCisgICAgICAgIC8vIHRhc2hrZWVsRmxhZyA9PSAwOiBzaGFwZSBub3JtYWxseSwgMTogc2hhcGUgaXNvbGF0ZWQsIDI6IGRvbid0IHNoYXBlCisKKyAgICAgICAgYm9vbGVhbiBsYW1hbGVmX2ZvdW5kID0gZmFsc2UsIHNlZW5mYW1fZm91bmQgPSBmYWxzZTsKKyAgICAgICAgYm9vbGVhbiB5ZWhoYW16YV9mb3VuZCA9IGZhbHNlLCB0YXNoa2VlbF9mb3VuZCA9IGZhbHNlOworICAgICAgICBpbnQgaSA9IHN0YXJ0ICsgbGVuZ3RoIC0gMTsKKyAgICAgICAgaW50IGN1cnJMaW5rID0gZ2V0TGluayhkZXN0W2ldKTsKKyAgICAgICAgaW50IG5leHRMaW5rID0gMDsKKyAgICAgICAgaW50IHByZXZMaW5rID0gMDsKKyAgICAgICAgaW50IGxhc3RMaW5rID0gMDsKKyAgICAgICAgLy9pbnQgcHJldlBvcyA9IGk7CisgICAgICAgIGludCBsYXN0UG9zID0gaTsKKyAgICAgICAgaW50IG54ID0gLTI7CisgICAgICAgIGludCBudyA9IDA7CisKKyAgICAgICAgd2hpbGUgKGkgPj0gMCkgeworICAgICAgICAgICAgLy8gSWYgaGlnaCBieXRlIG9mIGN1cnJMaW5rID4gMCB0aGVuIHRoZXJlIG1pZ2h0IGJlIG1vcmUgdGhhbiBvbmUgc2hhcGUKKyAgICAgICAgICAgIGlmICgoY3VyckxpbmsgJiAnXHVGRjAwJykgPiAwIHx8IGlzVGFzaGtlZWxDaGFyKGRlc3RbaV0pKSB7CisgICAgICAgICAgICAgICAgbncgPSBpIC0gMTsKKyAgICAgICAgICAgICAgICBueCA9IC0yOworICAgICAgICAgICAgICAgIHdoaWxlIChueCA8IDApIHsgLy8gd2UgbmVlZCB0byBrbm93IGFib3V0IG5leHQgY2hhcgorICAgICAgICAgICAgICAgICAgICBpZiAobncgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5leHRMaW5rID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIG54ID0gSW50ZWdlci5NQVhfVkFMVUU7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXh0TGluayA9IGdldExpbmsoZGVzdFtud10pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChuZXh0TGluayAmIElSUkVMRVZBTlQpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBueCA9IG53OworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLW53OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCgoY3VyckxpbmsgJiBBTEVGVFlQRSkgPiAwKSAmJiAoKGxhc3RMaW5rICYgTEFNVFlQRSkgPiAwKSkgeworICAgICAgICAgICAgICAgICAgICBsYW1hbGVmX2ZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgY2hhciB3TGFtYWxlZiA9IGNoYW5nZUxhbUFsZWYoZGVzdFtpXSk7IC8vIGdldCBmcm9tIDB4MDY1Qy0weDA2NWYKKyAgICAgICAgICAgICAgICAgICAgaWYgKHdMYW1hbGVmICE9ICdcdTAwMDAnKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXBsYWNlIGFsZWYgYnkgbWFya2VyLCBpdCB3aWxsIGJlIHJlbW92ZWQgbGF0ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RbaV0gPSAnXHVmZmZmJzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RbbGFzdFBvc10gPSB3TGFtYWxlZjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGkgPSBsYXN0UG9zOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgbGFzdExpbmsgPSBwcmV2TGluazsKKyAgICAgICAgICAgICAgICAgICAgY3VyckxpbmsgPSBnZXRMaW5rKHdMYW1hbGVmKTsgLy8gcmVxdWlyZXMgJ1x1MDAwMCcsIHVuZm9ydHVuYXRlbHkKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKChpID4gMCkgJiYgKGRlc3RbaS0xXSA9PSBTUEFDRV9DSEFSKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICggaXNTZWVuRmFtaWx5Q2hhcihkZXN0W2ldKSA9PSAxKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlZW5mYW1fZm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRlc3RbaV0gPT0gWUVIX0hBTVpBX0NIQVIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHllaGhhbXphX2ZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmKGk9PTApeworICAgICAgICAgICAgICAgICAgICBpZiAoIGlzU2VlbkZhbWlseUNoYXIoZGVzdFtpXSkgPT0gMSl7CisgICAgICAgICAgICAgICAgICAgICAgICBzZWVuZmFtX2ZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkZXN0W2ldID09IFlFSF9IQU1aQV9DSEFSKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB5ZWhoYW16YV9mb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgcHJvcGVyIHNoYXBlIGFjY29yZGluZyB0byBsaW5rIGFiaWxpdHkgb2YgbmVpZ2hib3JzCisgICAgICAgICAgICAgICAgLy8gYW5kIG9mIGNoYXJhY3RlcjsgZGVwZW5kcyBvbiB0aGUgb3JkZXIgb2YgdGhlIHNoYXBlcworICAgICAgICAgICAgICAgIC8vIChpc29sYXRlZCwgaW5pdGlhbCwgbWlkZGxlLCBmaW5hbCkgaW4gdGhlIGNvbXBhdGliaWxpdHkgYXJlYQorCisgICAgICAgICAgICAgICAgaW50IGZsYWcgPSBzcGVjaWFsQ2hhcihkZXN0W2ldKTsKKworICAgICAgICAgICAgICAgIGludCBzaGFwZSA9IHNoYXBlVGFibGVbbmV4dExpbmsgJiBMSU5LX01BU0tdCisgICAgICAgICAgICAgICAgICAgIFtsYXN0TGluayAmIExJTktfTUFTS10KKyAgICAgICAgICAgICAgICAgICAgW2N1cnJMaW5rICYgTElOS19NQVNLXTsKKworICAgICAgICAgICAgICAgIGlmIChmbGFnID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgc2hhcGUgJj0gMHgxOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZmxhZyA9PSAyKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh0YXNoa2VlbEZsYWcgPT0gMCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgKChsYXN0TGluayAmIExJTktMKSAhPSAwKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgKChuZXh0TGluayAmIExJTktSKSAhPSAwKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgZGVzdFtpXSAhPSAnXHUwNjRDJyAmJgorICAgICAgICAgICAgICAgICAgICAgICAgZGVzdFtpXSAhPSAnXHUwNjREJyAmJgorICAgICAgICAgICAgICAgICAgICAgICAgISgobmV4dExpbmsgJiBBTEVGVFlQRSkgPT0gQUxFRlRZUEUgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGxhc3RMaW5rICYgTEFNVFlQRSkgPT0gTEFNVFlQRSkpIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgc2hhcGUgPSAxOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgc2hhcGUgPSAwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChmbGFnID09IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRhc2hrZWVsRmxhZyA9PSAyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkZXN0W2ldID0gVEFTSEtFRUxfU1BBQ0VfU1VCOworICAgICAgICAgICAgICAgICAgICAgICAgdGFzaGtlZWxfZm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2V7CisgICAgICAgICAgICAgICAgICAgICAgICBkZXN0W2ldID0gKGNoYXIpKCdcdUZFNzAnICsgaXJyZWxldmFudFBvc1tkZXN0W2ldIC0gJ1x1MDY0QiddICsgc2hhcGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIGVsc2UgbGVhdmUgdGFzaGtlZWwgYWxvbmUKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBkZXN0W2ldID0gKGNoYXIpKCdcdUZFNzAnICsgKGN1cnJMaW5rID4+IDgpICsgc2hhcGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gbW92ZSBvbmUgbm90Y2ggZm9yd2FyZAorICAgICAgICAgICAgaWYgKChjdXJyTGluayAmIElSUkVMRVZBTlQpID09IDApIHsKKyAgICAgICAgICAgICAgICBwcmV2TGluayA9IGxhc3RMaW5rOworICAgICAgICAgICAgICAgIGxhc3RMaW5rID0gY3Vyckxpbms7CisgICAgICAgICAgICAgICAgLy9wcmV2UG9zID0gbGFzdFBvczsKKyAgICAgICAgICAgICAgICBsYXN0UG9zID0gaTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLS1pOworICAgICAgICAgICAgaWYgKGkgPT0gbngpIHsKKyAgICAgICAgICAgICAgICBjdXJyTGluayA9IG5leHRMaW5rOworICAgICAgICAgICAgICAgIG54ID0gLTI7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGkgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICBjdXJyTGluayA9IGdldExpbmsoZGVzdFtpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBJZiB3ZSBmb3VuZCBhIGxhbS9hbGVmIHBhaXIgaW4gdGhlIGJ1ZmZlcgorICAgICAgICAvLyBjYWxsIGhhbmRsZUdlbmVyYXRlZFNwYWNlcyB0byByZW1vdmUgdGhlIHNwYWNlcyB0aGF0IHdlcmUgYWRkZWQKKworICAgICAgICBkZXN0U2l6ZSA9IGxlbmd0aDsKKyAgICAgICAgaWYgKGxhbWFsZWZfZm91bmQgfHwgdGFzaGtlZWxfZm91bmQpIHsKKyAgICAgICAgICAgIGRlc3RTaXplID0gaGFuZGxlR2VuZXJhdGVkU3BhY2VzKGRlc3QsIHN0YXJ0LCBsZW5ndGgpOworICAgICAgICB9CisgICAgICAgIGlmIChzZWVuZmFtX2ZvdW5kIHx8IHllaGhhbXphX2ZvdW5kKXsKKyAgICAgICAgICAgIGRlc3RTaXplID0gZXhwYW5kQ29tcG9zaXRDaGFyKGRlc3QsIHN0YXJ0LCBkZXN0U2l6ZSwgbGFtYWxlZl9jb3VudCwgU0hBUEVfTU9ERSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGRlc3RTaXplOworICAgIH0KKworICAgIC8qCisgICAgICogTmFtZSAgICA6IGRlU2hhcGVVbmljb2RlCisgICAgICogRnVuY3Rpb246IENvbnZlcnRzIGFuIEFyYWJpYyBVbmljb2RlIGJ1ZmZlciBpbiBGRXh4IFJhbmdlIGludG8gdW5zaGFwZWQKKyAgICAgKiAgICAgICAgICAgYXJhYmljIFVuaWNvZGUgYnVmZmVyIGluIDA2eHggUmFuZ2UKKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBkZVNoYXBlVW5pY29kZShjaGFyW10gZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdFNpemUpIHRocm93cyBBcmFiaWNTaGFwaW5nRXhjZXB0aW9uIHsKKworICAgICAgICBpbnQgbGFtYWxlZl9jb3VudCA9IGRlc2hhcGVOb3JtYWxpemUoZGVzdCwgc3RhcnQsIGxlbmd0aCk7CisKKyAgICAgICAgLy8gSWYgdGhlcmUgd2FzIGEgbGFtYWxlZiBpbiB0aGUgYnVmZmVyIGNhbGwgZXhwYW5kTGFtQWxlZgorICAgICAgICBpZiAobGFtYWxlZl9jb3VudCAhPSAwKSB7CisgICAgICAgICAgICAvLyBuZWVkIHRvIGFkanVzdCBkZXN0IHRvIGZpdCBleHBhbmRlZCBidWZmZXIuLi4gISEhCisgICAgICAgICAgICBkZXN0U2l6ZSA9IGV4cGFuZENvbXBvc2l0Q2hhcihkZXN0LCBzdGFydCwgbGVuZ3RoLCBsYW1hbGVmX2NvdW50LERFU0hBUEVfTU9ERSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkZXN0U2l6ZSA9IGxlbmd0aDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBkZXN0U2l6ZTsKKyAgICB9CisKKyAgICBwcml2YXRlIGludCBpbnRlcm5hbFNoYXBlKGNoYXJbXSBzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc291cmNlU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc291cmNlTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcltdIGRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdFN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RTaXplKSB0aHJvd3MgQXJhYmljU2hhcGluZ0V4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKHNvdXJjZUxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChkZXN0U2l6ZSA9PSAwKSB7CisgICAgICAgICAgICBpZiAoKChvcHRpb25zICYgTEVUVEVSU19NQVNLKSAhPSBMRVRURVJTX05PT1ApICYmCisgICAgICAgICAgICAgICAgKChvcHRpb25zICYgTEFNQUxFRl9NQVNLKSA9PSBMQU1BTEVGX1JFU0laRSkpIHsKKworICAgICAgICAgICAgICAgIHJldHVybiBjYWxjdWxhdGVTaXplKHNvdXJjZSwgc291cmNlU3RhcnQsIHNvdXJjZUxlbmd0aCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBzb3VyY2VMZW5ndGg7IC8vIGJ5IGRlZmluaXRpb24KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIGFsd2F5cyB1c2UgdGVtcCBidWZmZXIKKyAgICAgICAgY2hhcltdIHRlbXAgPSBuZXcgY2hhcltzb3VyY2VMZW5ndGggKiAyXTsgLy8gYWxsIGxhbWFsZWZzIHJlcXVpcmluZyBleHBhbnNpb24KKyAgICAgICAgU3lzdGVtLmFycmF5Y29weShzb3VyY2UsIHNvdXJjZVN0YXJ0LCB0ZW1wLCAwLCBzb3VyY2VMZW5ndGgpOworCisgICAgICAgIGlmIChpc0xvZ2ljYWwpIHsKKyAgICAgICAgICAgIGludmVydEJ1ZmZlcih0ZW1wLCAwLCBzb3VyY2VMZW5ndGgpOworICAgICAgICB9CisKKyAgICAgICAgaW50IG91dHB1dFNpemUgPSBzb3VyY2VMZW5ndGg7CisKKyAgICAgICAgc3dpdGNoIChvcHRpb25zICYgTEVUVEVSU19NQVNLKSB7CisgICAgICAgIGNhc2UgTEVUVEVSU19TSEFQRV9UQVNIS0VFTF9JU09MQVRFRDoKKyAgICAgICAgICAgIG91dHB1dFNpemUgPSBzaGFwZVVuaWNvZGUodGVtcCwgMCwgc291cmNlTGVuZ3RoLCBkZXN0U2l6ZSwgMSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIExFVFRFUlNfU0hBUEU6CisgICAgICAgICAgICBpZiggKChvcHRpb25zJlRBU0hLRUVMX01BU0spPiAwKSAmJgorICAgICAgICAgICAgICAgICgob3B0aW9ucyZUQVNIS0VFTF9NQVNLKSAhPVRBU0hLRUVMX1JFUExBQ0VfQllfVEFUV0VFTCkpIHsKKyAgICAgICAgICAgICAgICAgICAvKiBDYWxsIHRoZSBzaGFwaW5nIGZ1bmN0aW9uIHdpdGggdGFzaGtlZWwgZmxhZyA9PSAyIGZvciByZW1vdmFsIG9mIHRhc2hrZWVsICovCisgICAgICAgICAgICAgICAgb3V0cHV0U2l6ZSA9IHNoYXBlVW5pY29kZSh0ZW1wLCAwLCBzb3VyY2VMZW5ndGgsIGRlc3RTaXplLCAyKTsKKyAgICAgICAgICAgICAgICB9ZWxzZSB7CisgICAgICAgICAgICAgICAgICAgLy9kZWZhdWx0IENhbGwgdGhlIHNoYXBpbmcgZnVuY3Rpb24gd2l0aCB0YXNoa2VlbCBmbGFnID09IDEgKi8KKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0U2l6ZSA9IHNoYXBlVW5pY29kZSh0ZW1wLCAwLCBzb3VyY2VMZW5ndGgsIGRlc3RTaXplLCAwKTsKKworICAgICAgICAgICAgICAgICAgIC8qQWZ0ZXIgc2hhcGluZyB0ZXh0IGNoZWNrIGlmIHVzZXIgd2FudHMgdG8gcmVtb3ZlIHRhc2hrZWVsIGFuZCByZXBsYWNlIGl0IHdpdGggdGF0d2VlbCovCisgICAgICAgICAgICAgICAgICAgaWYoIChvcHRpb25zJlRBU0hLRUVMX01BU0spID09IFRBU0hLRUVMX1JFUExBQ0VfQllfVEFUV0VFTCl7CisgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFNpemUgPSBoYW5kbGVUYXNoa2VlbFdpdGhUYXR3ZWVsKHRlbXAsc291cmNlTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIExFVFRFUlNfVU5TSEFQRToKKyAgICAgICAgICAgIG91dHB1dFNpemUgPSBkZVNoYXBlVW5pY29kZSh0ZW1wLCAwLCBzb3VyY2VMZW5ndGgsIGRlc3RTaXplKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChvdXRwdXRTaXplID4gZGVzdFNpemUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBBcmFiaWNTaGFwaW5nRXhjZXB0aW9uKCJub3QgZW5vdWdoIHJvb20gZm9yIHJlc3VsdCBkYXRhIik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKG9wdGlvbnMgJiBESUdJVFNfTUFTSykgIT0gRElHSVRTX05PT1ApIHsKKyAgICAgICAgICAgIGNoYXIgZGlnaXRCYXNlID0gJ1x1MDAzMCc7IC8vIEV1cm9wZWFuIGRpZ2l0cworICAgICAgICAgICAgc3dpdGNoIChvcHRpb25zICYgRElHSVRfVFlQRV9NQVNLKSB7CisgICAgICAgICAgICBjYXNlIERJR0lUX1RZUEVfQU46CisgICAgICAgICAgICAgICAgZGlnaXRCYXNlID0gJ1x1MDY2MCc7ICAvLyBBcmFiaWMtSW5kaWMgZGlnaXRzCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgRElHSVRfVFlQRV9BTl9FWFRFTkRFRDoKKyAgICAgICAgICAgICAgICBkaWdpdEJhc2UgPSAnXHUwNmYwJzsgIC8vIEVhc3Rlcm4gQXJhYmljLUluZGljIGRpZ2l0cyAoUGVyc2lhbiBhbmQgVXJkdSkKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoIChvcHRpb25zICYgRElHSVRTX01BU0spIHsKKyAgICAgICAgICAgIGNhc2UgRElHSVRTX0VOMkFOOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGRpZ2l0RGVsdGEgPSBkaWdpdEJhc2UgLSAnXHUwMDMwJzsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBvdXRwdXRTaXplOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgY2ggPSB0ZW1wW2ldOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoIDw9ICdcdTAwMzknICYmIGNoID49ICdcdTAwMzAnKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcFtpXSArPSBkaWdpdERlbHRhOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIERJR0lUU19BTjJFTjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNoYXIgZGlnaXRUb3AgPSAoY2hhcikoZGlnaXRCYXNlICsgOSk7CisgICAgICAgICAgICAgICAgICAgIGludCBkaWdpdERlbHRhID0gJ1x1MDAzMCcgLSBkaWdpdEJhc2U7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgb3V0cHV0U2l6ZTsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGNoID0gdGVtcFtpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaCA8PSBkaWdpdFRvcCAmJiBjaCA+PSBkaWdpdEJhc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wW2ldICs9IGRpZ2l0RGVsdGE7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgRElHSVRTX0VOMkFOX0lOSVRfTFI6CisgICAgICAgICAgICAgICAgc2hhcGVUb0FyYWJpY0RpZ2l0c1dpdGhDb250ZXh0KHRlbXAsIDAsIG91dHB1dFNpemUsIGRpZ2l0QmFzZSwgZmFsc2UpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIERJR0lUU19FTjJBTl9JTklUX0FMOgorICAgICAgICAgICAgICAgIHNoYXBlVG9BcmFiaWNEaWdpdHNXaXRoQ29udGV4dCh0ZW1wLCAwLCBvdXRwdXRTaXplLCBkaWdpdEJhc2UsIHRydWUpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGlzTG9naWNhbCkgeworICAgICAgICAgICAgaW52ZXJ0QnVmZmVyKHRlbXAsIDAsIG91dHB1dFNpemUpOworICAgICAgICB9CisKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weSh0ZW1wLCAwLCBkZXN0LCBkZXN0U3RhcnQsIG91dHB1dFNpemUpOworCisgICAgICAgIHJldHVybiBvdXRwdXRTaXplOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEFyYWJpY1NoYXBpbmdFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKKyAgICAgICAgQXJhYmljU2hhcGluZ0V4Y2VwdGlvbihTdHJpbmcgbXNnKSB7CisgICAgICAgICAgICBzdXBlcihtc2cpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvaWN1NGovbGljZW5zZS5odG1sIGIvaWN1NGovbGljZW5zZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5MDVkZGYKLS0tIC9kZXYvbnVsbAorKysgYi9pY3U0ai9saWNlbnNlLmh0bWwKQEAgLTAsMCArMSw1MSBAQAorPGh0bWw+CisKKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiPjwvbWV0YT4KKzx0aXRsZT5JQ1UgTGljZW5zZSAtIElDVSAxLjguMSBhbmQgbGF0ZXI8L3RpdGxlPgorPC9oZWFkPgorCis8Ym9keSBCR0NPTE9SPSIjZmZmZmZmIj4KKzxoMj5JQ1UgTGljZW5zZSAtIElDVSAxLjguMSBhbmQgbGF0ZXI8L2gyPgorCis8cD5DT1BZUklHSFQgQU5EIFBFUk1JU1NJT04gTk9USUNFPC9wPgorCis8cD4KK0NvcHlyaWdodCAoYykgMTk5NS0yMDA2IEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24gYW5kIG90aGVycworPC9wPgorPHA+CitBbGwgcmlnaHRzIHJlc2VydmVkLgorPC9wPgorPHA+CitQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CitvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKK3RvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KK3RoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBhbmQvb3Igc2VsbAorY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zCit0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCitjb3B5cmlnaHQgbm90aWNlKHMpIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzCitvZiB0aGUgU29mdHdhcmUgYW5kIHRoYXQgYm90aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZShzKSBhbmQgdGhpcworcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4KKzwvcD4KKzxwPgorVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IgSU1QTElFRCwgCitJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQQorUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQgT0YgVEhJUkQgUEFSVFkgUklHSFRTLiBJTiBOTyBFVkVOVCBTSEFMTAorVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgSE9MREVSUyBJTkNMVURFRCBJTiBUSElTIE5PVElDRSBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwKK09SIEFOWSBTUEVDSUFMIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUywgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUgorUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCitORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQorVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCis8L3A+Cis8cD4KK0V4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lIG9mIGEgY29weXJpZ2h0IGhvbGRlciBzaGFsbCBub3QgYmUKK3VzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlIHNhbGUsIHVzZSBvciBvdGhlciBkZWFsaW5ncyBpbgordGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlci4KKzwvcD4KKworPGhyPgorPHA+PHNtYWxsPgorQWxsIHRyYWRlbWFya3MgYW5kIHJlZ2lzdGVyZWQgdHJhZGVtYXJrcyBtZW50aW9uZWQgaGVyZWluIGFyZSB0aGUgcHJvcGVydHkgb2YgdGhlaXIgcmVzcGVjdGl2ZSBvd25lcnMuCis8L3NtYWxsPjwvcD4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYW5kcm9pZF9ydW50aW1lL0FuZHJvaWRSdW50aW1lLmggYi9pbmNsdWRlL2FuZHJvaWRfcnVudGltZS9BbmRyb2lkUnVudGltZS5oCmluZGV4IDA5ZjBkZTEuLjIyYzliNzIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYW5kcm9pZF9ydW50aW1lL0FuZHJvaWRSdW50aW1lLmgKKysrIGIvaW5jbHVkZS9hbmRyb2lkX3J1bnRpbWUvQW5kcm9pZFJ1bnRpbWUuaApAQCAtMzAsNyArMzAsOSBAQAogCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKLSAgICAKKworY2xhc3MgQ3Vyc29yV2luZG93OworCiBjbGFzcyBBbmRyb2lkUnVudGltZQogewogcHVibGljOgpAQCAtMTIyLDYgKzEyNCw4IEBACiAvLyBSZXR1cm5zIHRoZSBVbml4IGZpbGUgZGVzY3JpcHRvciBmb3IgYSBQYXJjZWxGaWxlRGVzY3JpcHRvciBvYmplY3QKIGV4dGVybiBpbnQgZ2V0UGFyY2VsRmlsZURlc2NyaXB0b3JGRChKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QpOwogCitleHRlcm4gQ3Vyc29yV2luZG93ICogZ2V0X3dpbmRvd19mcm9tX29iamVjdChKTklFbnYgKiBlbnYsIGpvYmplY3QgamF2YVdpbmRvdyk7CisKIH0KIAogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2JpbmRlci9DdXJzb3JXaW5kb3cuaCBiL2luY2x1ZGUvYmluZGVyL0N1cnNvcldpbmRvdy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmYmZmMmEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2JpbmRlci9DdXJzb3JXaW5kb3cuaApAQCAtMCwwICsxLDIwMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX0FORFJPSURfX0RBVEFCQVNFX1dJTkRPV19ICisjZGVmaW5lIF9BTkRST0lEX19EQVRBQkFTRV9XSU5ET1dfSAorCisjaW5jbHVkZSA8Y3V0aWxzL2xvZy5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisKKyNkZWZpbmUgREVGQVVMVF9XSU5ET1dfU0laRSA0MDk2CisjZGVmaW5lIE1BWF9XSU5ET1dfU0laRSAoMTAyNCAqIDEwMjQpCisjZGVmaW5lIFdJTkRPV19BTExPQ0FUSU9OX1NJWkUgNDA5NgorCisjZGVmaW5lIFJPV19TTE9UX0NIVU5LX05VTV9ST1dTIDE2CisKKy8vIFJvdyBzbG90cyBhcmUgYWxsb2NhdGVkIGluIGNodW5rcyBvZiBST1dfU0xPVF9DSFVOS19OVU1fUk9XUywKKy8vIHdpdGggYW4gb2Zmc2V0IGFmdGVyIHRoZSByb3dzIHRoYXQgcG9pbnRzIHRvIHRoZSBuZXh0IGNodW5rCisjZGVmaW5lIFJPV19TTE9UX0NIVU5LX1NJWkUgKChST1dfU0xPVF9DSFVOS19OVU1fUk9XUyAqIHNpemVvZihyb3dfc2xvdF90KSkgKyBzaXplb2YodWludDMyX3QpKQorCisKKyNpZiBMT0dfTkRFQlVHCisKKyNkZWZpbmUgSUZfTE9HX1dJTkRPVygpIGlmIChmYWxzZSkKKyNkZWZpbmUgTE9HX1dJTkRPVyguLi4pCisKKyNlbHNlCisKKyNkZWZpbmUgSUZfTE9HX1dJTkRPVygpIElGX0xPRyhMT0dfREVCVUcsICJDdXJzb3JXaW5kb3ciKQorI2RlZmluZSBMT0dfV0lORE9XKC4uLikgTE9HKExPR19ERUJVRywgIkN1cnNvcldpbmRvdyIsIF9fVkFfQVJHU19fKQorCisjZW5kaWYKKworCisvLyBXaGVuIGRlZmluZWQgdG8gdHJ1ZSBzdHJpbmdzIGFyZSBzdG9yZWQgYXMgVVRGOCwgb3RoZXJ3aXNlIHRoZXkncmUgVVRGMTYKKyNkZWZpbmUgV0lORE9XX1NUT1JBR0VfVVRGOCAxCisKKy8vIFdoZW4gZGVmaW5lZCB0byB0cnVlIG51bWJlcmljIHZhbHVlcyBhcmUgc3RvcmVkIGlubGluZSBpbiB0aGUgZmllbGRfc2xvdF90LCBvdGhlcndpc2UgdGhleSdyZSBhbGxvY2F0ZWQgaW4gdGhlIHdpbmRvdworI2RlZmluZSBXSU5ET1dfU1RPUkFHRV9JTkxJTkVfTlVNRVJJQ1MgMQorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdWludDMyX3QgbnVtUm93czsKKyAgICB1aW50MzJfdCBudW1Db2x1bW5zOworfSB3aW5kb3dfaGVhZGVyX3Q7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdWludDMyX3Qgb2Zmc2V0OworfSByb3dfc2xvdF90OworCit0eXBlZGVmIHN0cnVjdAoreworICAgIHVpbnQ4X3QgdHlwZTsKKyAgICB1bmlvbiB7CisgICAgICAgIGRvdWJsZSBkOworICAgICAgICBpbnQ2NF90IGw7CisgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICB1aW50MzJfdCBvZmZzZXQ7CisgICAgICAgICAgICB1aW50MzJfdCBzaXplOworICAgICAgICB9IGJ1ZmZlcjsKKyAgICB9IGRhdGE7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIGZpZWxkX3Nsb3RfdDsKKworI2RlZmluZSBGSUVMRF9UWVBFX05VTEwgMAorI2RlZmluZSBGSUVMRF9UWVBFX0lOVEVHRVIgMQorI2RlZmluZSBGSUVMRF9UWVBFX0ZMT0FUIDIKKyNkZWZpbmUgRklFTERfVFlQRV9TVFJJTkcgMworI2RlZmluZSBGSUVMRF9UWVBFX0JMT0IgNAorCisvKioKKyAqIFRoaXMgY2xhc3Mgc3RvcmVzIGEgc2V0IG9mIHJvd3MgZnJvbSBhIGRhdGFiYXNlIGluIGEgYnVmZmVyLiBUaGUgYmVnaW5pbmcgb2YgdGhlCisgKiB3aW5kb3cgaGFzIGZpcnN0IGNodW5rIG9mIHJvd19zbG90X3RzLCB3aGljaCBhcmUgb2Zmc2V0cyB0byB0aGUgcm93IGRpcmVjdG9yeSwgZm9sbG93ZWQgYnkKKyAqIGFuIG9mZnNldCB0byB0aGUgbmV4dCBjaHVuayBpbiBhIGxpbmtlZC1saXN0IG9mIGFkZGl0aW9uYWwgY2h1bmsgb2Ygcm93X3Nsb3RfdHMgaW4gY2FzZQorICogdGhlIHByZS1hbGxvY2F0ZWQgY2h1bmsgaXNuJ3QgYmlnIGVub3VnaCB0byByZWZlciB0byBhbGwgcm93cy4gRWFjaCByb3cgZGlyZWN0b3J5IGhhcyBhCisgKiBmaWVsZF9zbG90X3QgcGVyIGNvbHVtbiwgd2hpY2ggaGFzIHRoZSBzaXplLCBvZmZzZXQsIGFuZCB0eXBlIG9mIHRoZSBkYXRhIGZvciB0aGF0IGZpZWxkLgorICogTm90ZSB0aGF0IHRoZSBkYXRhIHR5cGVzIGNvbWUgZnJvbSBzcWxpdGUzLmguCisgKi8KK2NsYXNzIEN1cnNvcldpbmRvdworeworcHVibGljOgorICAgICAgICAgICAgICAgICAgICAgICAgQ3Vyc29yV2luZG93KHNpemVfdCBtYXhTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEN1cnNvcldpbmRvdygpe30KKyAgICBib29sICAgICAgICAgICAgICAgIHNldE1lbW9yeShjb25zdCBzcDxJTWVtb3J5PiYpOworICAgICAgICAgICAgICAgICAgICAgICAgfkN1cnNvcldpbmRvdygpOworCisgICAgYm9vbCAgICAgICAgICAgICAgICBpbml0QnVmZmVyKGJvb2wgbG9jYWxPbmx5KTsKKyAgICBzcDxJTWVtb3J5PiAgICAgICAgIGdldE1lbW9yeSgpIHtyZXR1cm4gbU1lbW9yeTt9CisKKyAgICBzaXplX3QgICAgICAgICAgICAgIHNpemUoKSB7cmV0dXJuIG1TaXplO30KKyAgICB1aW50OF90ICogICAgICAgICAgIGRhdGEoKSB7cmV0dXJuIG1EYXRhO30KKyAgICB1aW50MzJfdCAgICAgICAgICAgIGdldE51bVJvd3MoKSB7cmV0dXJuIG1IZWFkZXItPm51bVJvd3M7fQorICAgIHVpbnQzMl90ICAgICAgICAgICAgZ2V0TnVtQ29sdW1ucygpIHtyZXR1cm4gbUhlYWRlci0+bnVtQ29sdW1uczt9CisgICAgdm9pZCAgICAgICAgICAgICAgICBmcmVlTGFzdFJvdygpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUhlYWRlci0+bnVtUm93cyA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUhlYWRlci0+bnVtUm93cy0tOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICBib29sICAgICAgICAgICAgICAgIHNldE51bUNvbHVtbnModWludDMyX3QgbnVtQ29sdW1ucykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGN1ciA9IG1IZWFkZXItPm51bUNvbHVtbnM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXIgPiAwICYmIGN1ciAhPSBudW1Db2x1bW5zKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0dFKCJUcnlpbmcgdG8gZ28gZnJvbSAlZCBjb2x1bW5zIHRvICVkIiwgY3VyLCBudW1Db2x1bW5zKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSGVhZGVyLT5udW1Db2x1bW5zID0gbnVtQ29sdW1uczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgaW50MzJfdCAgICAgICAgICAgICBmcmVlU3BhY2UoKTsKKworICAgIHZvaWQgICAgICAgICAgICAgICAgY2xlYXIoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBBbGxvY2F0ZSBhIHJvdyBzbG90IGFuZCBpdHMgZGlyZWN0b3J5LiBUaGUgcmV0dXJuZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIHBvaW50ZXIgcG9pbnRzIHRvIHRoZSBiZWdpbmluZyBvZiB0aGUgcm93J3MgZGlyZWN0b3J5CisgICAgICAgICAgICAgICAgICAgICAgICAgKiBvciBOVUxMIGlmIHRoZXJlIHdhc24ndCByb29tLiBUaGUgZGlyZWN0b3J5IGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBpbml0aWFsaWVkIHdpdGggTlVMTCBlbnRyaWVzIGZvciBlYWNoIGZpZWxkLgorICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgZmllbGRfc2xvdF90ICogICAgICBhbGxvY1JvdygpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIEFsbG9jYXRlIGEgcG9ydGlvbiBvZiB0aGUgd2luZG93LiBSZXR1cm5zIHRoZSBvZmZzZXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIG9mIHRoZSBhbGxvY2F0aW9uLCBvciAwIGlmIHRoZXJlIGlzbid0IGVub3VnaCBzcGFjZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAqIElmIGFsaWduZWQgaXMgdHJ1ZSwgdGhlIGFsbG9jYXRpb24gZ2V0cyA0IGJ5dGUgYWxpZ25tZW50LgorICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgdWludDMyX3QgICAgICAgICAgICBhbGxvYyhzaXplX3Qgc2l6ZSwgYm9vbCBhbGlnbmVkID0gZmFsc2UpOworCisgICAgdWludDMyX3QgICAgICAgICAgICByZWFkX2ZpZWxkX3Nsb3QoaW50IHJvdywgaW50IGNvbHVtbiwgZmllbGRfc2xvdF90ICogc2xvdCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICAgICAgICAgICAgICogQ29weSBkYXRhIGludG8gdGhlIHdpbmRvdyBhdCB0aGUgZ2l2ZW4gb2Zmc2V0LgorICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgdm9pZCAgICAgICAgICAgICAgICBjb3B5SW4odWludDMyX3Qgb2Zmc2V0LCB1aW50OF90IGNvbnN0ICogZGF0YSwgc2l6ZV90IHNpemUpOworICAgIHZvaWQgICAgICAgICAgICAgICAgY29weUluKHVpbnQzMl90IG9mZnNldCwgaW50NjRfdCBkYXRhKTsKKyAgICB2b2lkICAgICAgICAgICAgICAgIGNvcHlJbih1aW50MzJfdCBvZmZzZXQsIGRvdWJsZSBkYXRhKTsKKworICAgIHZvaWQgICAgICAgICAgICAgICAgY29weU91dCh1aW50MzJfdCBvZmZzZXQsIHVpbnQ4X3QgKiBkYXRhLCBzaXplX3Qgc2l6ZSk7CisgICAgaW50NjRfdCAgICAgICAgICAgICBjb3B5T3V0TG9uZyh1aW50MzJfdCBvZmZzZXQpOworICAgIGRvdWJsZSAgICAgICAgICAgICAgY29weU91dERvdWJsZSh1aW50MzJfdCBvZmZzZXQpOworCisgICAgYm9vbCAgICAgICAgICAgICAgICBwdXRMb25nKHVuc2lnbmVkIGludCByb3csIHVuc2lnbmVkIGludCBjb2wsIGludDY0X3QgdmFsdWUpOworICAgIGJvb2wgICAgICAgICAgICAgICAgcHV0RG91YmxlKHVuc2lnbmVkIGludCByb3csIHVuc2lnbmVkIGludCBjb2wsIGRvdWJsZSB2YWx1ZSk7CisgICAgYm9vbCAgICAgICAgICAgICAgICBwdXROdWxsKHVuc2lnbmVkIGludCByb3csIHVuc2lnbmVkIGludCBjb2wpOworCisgICAgYm9vbCAgICAgICAgICAgICAgICBnZXRMb25nKHVuc2lnbmVkIGludCByb3csIHVuc2lnbmVkIGludCBjb2wsIGludDY0X3QgKiB2YWx1ZU91dCk7CisgICAgYm9vbCAgICAgICAgICAgICAgICBnZXREb3VibGUodW5zaWduZWQgaW50IHJvdywgdW5zaWduZWQgaW50IGNvbCwgZG91YmxlICogdmFsdWVPdXQpOworICAgIGJvb2wgICAgICAgICAgICAgICAgZ2V0TnVsbCh1bnNpZ25lZCBpbnQgcm93LCB1bnNpZ25lZCBpbnQgY29sLCBib29sICogdmFsdWVPdXQpOworCisgICAgdWludDhfdCAqICAgICAgICAgICBvZmZzZXRUb1B0cih1aW50MzJfdCBvZmZzZXQpIHtyZXR1cm4gbURhdGEgKyBvZmZzZXQ7fQorCisgICAgcm93X3Nsb3RfdCAqICAgICAgICBhbGxvY1Jvd1Nsb3QoKTsKKworICAgIHJvd19zbG90X3QgKiAgICAgICAgZ2V0Um93U2xvdChpbnQgcm93KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgICAgICAgICAgICAgKiByZXR1cm4gTlVMTCBpZiBGYWlsZWQgdG8gZmluZCByb3dTbG90IG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBJbnZhbGlkIHJvd1Nsb3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGZpZWxkX3Nsb3RfdCAqICAgICAgZ2V0RmllbGRTbG90V2l0aENoZWNrKGludCByb3csIGludCBjb2x1bW4pOworICAgIGZpZWxkX3Nsb3RfdCAqICAgICAgZ2V0RmllbGRTbG90KGludCByb3csIGludCBjb2x1bW4pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmllbGREaXJPZmZzZXQgPSBnZXRSb3dTbG90KHJvdyktPm9mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgoZmllbGRfc2xvdF90ICopb2Zmc2V0VG9QdHIoZmllbGREaXJPZmZzZXQpKSArIGNvbHVtbjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKK3ByaXZhdGU6CisgICAgdWludDhfdCAqIG1EYXRhOworICAgIHNpemVfdCBtU2l6ZTsKKyAgICBzaXplX3QgbU1heFNpemU7CisgICAgd2luZG93X2hlYWRlcl90ICogbUhlYWRlcjsKKyAgICBzcDxJTWVtb3J5PiBtTWVtb3J5OworCisgICAgLyoqCisgICAgICogT2Zmc2V0IG9mIHRoZSBsb3dlc3QgdW51c2VkIGRhdGEgYnl0ZSBpbiB0aGUgYXJyYXkuCisgICAgICovCisgICAgdWludDMyX3QgbUZyZWVPZmZzZXQ7Cit9OworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2FtZXJhL0NhbWVyYS5oIGIvaW5jbHVkZS9jYW1lcmEvQ2FtZXJhLmgKaW5kZXggOTY0NzAwYi4uNzVjZjVmZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jYW1lcmEvQ2FtZXJhLmgKKysrIGIvaW5jbHVkZS9jYW1lcmEvQ2FtZXJhLmgKQEAgLTIyLDggKzIyLDYgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1jbGFzcyBJU3VyZmFjZTsKLQogLyoKICAqIEEgc2V0IG9mIGJpdCBtYXNrcyBmb3Igc3BlY2lmeWluZyBob3cgdGhlIHJlY2VpdmVkIHByZXZpZXcgZnJhbWVzIGFyZQogICogaGFuZGxlZCBiZWZvcmUgdGhlIHByZXZpZXdDYWxsYmFjaygpIGNhbGwuCkBAIC0xNTIsOSArMTUwLDggQEAKIAogICAgICAgICAgICAgc3RhdHVzX3QgICAgZ2V0U3RhdHVzKCkgeyByZXR1cm4gbVN0YXR1czsgfQogCi0gICAgICAgICAgICAvLyBwYXNzIHRoZSBidWZmZXJlZCBJU3VyZmFjZSB0byB0aGUgY2FtZXJhIHNlcnZpY2UKKyAgICAgICAgICAgIC8vIHBhc3MgdGhlIGJ1ZmZlcmVkIFN1cmZhY2UgdG8gdGhlIGNhbWVyYSBzZXJ2aWNlCiAgICAgICAgICAgICBzdGF0dXNfdCAgICBzZXRQcmV2aWV3RGlzcGxheShjb25zdCBzcDxTdXJmYWNlPiYgc3VyZmFjZSk7Ci0gICAgICAgICAgICBzdGF0dXNfdCAgICBzZXRQcmV2aWV3RGlzcGxheShjb25zdCBzcDxJU3VyZmFjZT4mIHN1cmZhY2UpOwogCiAgICAgICAgICAgICAvLyBzdGFydCBwcmV2aWV3IG1vZGUsIG11c3QgY2FsbCBzZXRQcmV2aWV3RGlzcGxheSBmaXJzdAogICAgICAgICAgICAgc3RhdHVzX3QgICAgc3RhcnRQcmV2aWV3KCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2NhbWVyYS9DYW1lcmFIYXJkd2FyZUludGVyZmFjZS5oIGIvaW5jbHVkZS9jYW1lcmEvQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UuaAppbmRleCA2YTY2ZTNjLi41MTVkODc5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NhbWVyYS9DYW1lcmFIYXJkd2FyZUludGVyZmFjZS5oCisrKyBiL2luY2x1ZGUvY2FtZXJhL0NhbWVyYUhhcmR3YXJlSW50ZXJmYWNlLmgKQEAgLTE4LDYgKzE4LDcgQEAKICNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9DQU1FUkFfSEFSRFdBUkVfSU5URVJGQUNFX0gKIAogI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+CisjaW5jbHVkZSA8dWkvZWdsL2FuZHJvaWRfbmF0aXZlcy5oPgogI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KICNpbmNsdWRlIDxzdXJmYWNlZmxpbmdlci9JU3VyZmFjZS5oPgogI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmEuaD4KQEAgLTg2LDggKzg3LDggQEAKIHB1YmxpYzoKICAgICB2aXJ0dWFsIH5DYW1lcmFIYXJkd2FyZUludGVyZmFjZSgpIHsgfQogCi0gICAgLyoqIFJldHVybiB0aGUgSU1lbW9yeUhlYXAgZm9yIHRoZSBwcmV2aWV3IGltYWdlIGhlYXAgKi8KLSAgICB2aXJ0dWFsIHNwPElNZW1vcnlIZWFwPiAgICAgICAgIGdldFByZXZpZXdIZWFwKCkgY29uc3QgPSAwOworICAgIC8qKiBTZXQgdGhlIElTdXJmYWNlIGZyb20gd2hpY2ggdGhlIHByZXZpZXcgYnVmZmVycyBzaG91bGQgYmUgZGVxdWV1ZWQgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFByZXZpZXdXaW5kb3coY29uc3Qgc3A8QU5hdGl2ZVdpbmRvdz4mIGJ1ZikgPSAwOwogCiAgICAgLyoqIFJldHVybiB0aGUgSU1lbW9yeUhlYXAgZm9yIHRoZSByYXcgaW1hZ2UgaGVhcCAqLwogICAgIHZpcnR1YWwgc3A8SU1lbW9yeUhlYXA+ICAgICAgICAgZ2V0UmF3SGVhcCgpIGNvbnN0ID0gMDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2FtZXJhL0lDYW1lcmEuaCBiL2luY2x1ZGUvY2FtZXJhL0lDYW1lcmEuaAppbmRleCA2ZmNmOWU1Li44YmNlZWE1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NhbWVyYS9JQ2FtZXJhLmgKKysrIGIvaW5jbHVkZS9jYW1lcmEvSUNhbWVyYS5oCkBAIC0yMCw3ICsyMCw3IEBACiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgogI2luY2x1ZGUgPGJpbmRlci9JSW50ZXJmYWNlLmg+CiAjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgotI2luY2x1ZGUgPHN1cmZhY2VmbGluZ2VyL0lTdXJmYWNlLmg+CisjaW5jbHVkZSA8c3VyZmFjZWZsaW5nZXIvU3VyZmFjZS5oPgogI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmEuaD4KQEAgLTQ1LDggKzQ1LDggQEAKICAgICAvLyBhbGxvdyBvdGhlciBwcm9jZXNzZXMgdG8gdXNlIHRoaXMgSUNhbWVyYSBpbnRlcmZhY2UKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICB1bmxvY2soKSA9IDA7CiAKLSAgICAvLyBwYXNzIHRoZSBidWZmZXJlZCBJU3VyZmFjZSB0byB0aGUgY2FtZXJhIHNlcnZpY2UKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzZXRQcmV2aWV3RGlzcGxheShjb25zdCBzcDxJU3VyZmFjZT4mIHN1cmZhY2UpID0gMDsKKyAgICAvLyBwYXNzIHRoZSBidWZmZXJlZCBTdXJmYWNlIHRvIHRoZSBjYW1lcmEgc2VydmljZQorICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHNldFByZXZpZXdEaXNwbGF5KGNvbnN0IHNwPFN1cmZhY2U+JiBzdXJmYWNlKSA9IDA7CiAKICAgICAvLyBzZXQgdGhlIHByZXZpZXcgY2FsbGJhY2sgZmxhZyB0byBhZmZlY3QgaG93IHRoZSByZWNlaXZlZCBmcmFtZXMgZnJvbQogICAgIC8vIHByZXZpZXcgYXJlIGhhbmRsZWQuCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0lNZWRpYVBsYXllci5oIGIvaW5jbHVkZS9tZWRpYS9JTWVkaWFQbGF5ZXIuaAppbmRleCBhZjlhN2VkLi5hMWNlMTEzIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL0lNZWRpYVBsYXllci5oCisrKyBiL2luY2x1ZGUvbWVkaWEvSU1lZGlhUGxheWVyLmgKQEAgLTI1LDYgKzI1LDcgQEAKIAogY2xhc3MgUGFyY2VsOwogY2xhc3MgSVN1cmZhY2U7CitjbGFzcyBTdXJmYWNlOwogCiBjbGFzcyBJTWVkaWFQbGF5ZXI6IHB1YmxpYyBJSW50ZXJmYWNlCiB7CkBAIC0zMyw3ICszNCw4IEBACiAKICAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICBkaXNjb25uZWN0KCkgPSAwOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc2V0VmlkZW9TdXJmYWNlKGNvbnN0IHNwPElTdXJmYWNlPiYgc3VyZmFjZSkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHNldFZpZGVvSVN1cmZhY2UoY29uc3Qgc3A8SVN1cmZhY2U+JiBzdXJmYWNlKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc2V0VmlkZW9TdXJmYWNlKGNvbnN0IHNwPFN1cmZhY2U+JiBzdXJmYWNlKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgcHJlcGFyZUFzeW5jKCkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHN0YXJ0KCkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHN0b3AoKSA9IDA7CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0lNZWRpYVJlY29yZGVyLmggYi9pbmNsdWRlL21lZGlhL0lNZWRpYVJlY29yZGVyLmgKaW5kZXggNTRhZGNhOC4uNTRiMTk3YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9JTWVkaWFSZWNvcmRlci5oCisrKyBiL2luY2x1ZGUvbWVkaWEvSU1lZGlhUmVjb3JkZXIuaApAQCAtMjIsNyArMjIsNyBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLWNsYXNzIElTdXJmYWNlOworY2xhc3MgU3VyZmFjZTsKIGNsYXNzIElDYW1lcmE7CiBjbGFzcyBJTWVkaWFSZWNvcmRlckNsaWVudDsKIApAQCAtMzIsNyArMzIsNyBAQAogICAgIERFQ0xBUkVfTUVUQV9JTlRFUkZBQ0UoTWVkaWFSZWNvcmRlcik7CiAKICAgICB2aXJ0dWFsCXN0YXR1c190CQlzZXRDYW1lcmEoY29uc3Qgc3A8SUNhbWVyYT4mIGNhbWVyYSkgPSAwOwotICAgIHZpcnR1YWwJc3RhdHVzX3QJCXNldFByZXZpZXdTdXJmYWNlKGNvbnN0IHNwPElTdXJmYWNlPiYgc3VyZmFjZSkgPSAwOworICAgIHZpcnR1YWwJc3RhdHVzX3QJCXNldFByZXZpZXdTdXJmYWNlKGNvbnN0IHNwPFN1cmZhY2U+JiBzdXJmYWNlKSA9IDA7CiAgICAgdmlydHVhbAlzdGF0dXNfdAkJc2V0VmlkZW9Tb3VyY2UoaW50IHZzKSA9IDA7CiAgICAgdmlydHVhbAlzdGF0dXNfdAkJc2V0QXVkaW9Tb3VyY2UoaW50IGFzKSA9IDA7CiAgICAgdmlydHVhbAlzdGF0dXNfdAkJc2V0T3V0cHV0Rm9ybWF0KGludCBvZikgPSAwOwpAQCAtNjgsNCArNjgsMyBAQAogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogI2VuZGlmIC8vIEFORFJPSURfSU1FRElBUkVDT1JERVJfSAotCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL01lZGlhUGxheWVySW50ZXJmYWNlLmggYi9pbmNsdWRlL21lZGlhL01lZGlhUGxheWVySW50ZXJmYWNlLmgKaW5kZXggMzY2Mjk4My4uMTNjNzNhYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9NZWRpYVBsYXllckludGVyZmFjZS5oCisrKyBiL2luY2x1ZGUvbWVkaWEvTWVkaWFQbGF5ZXJJbnRlcmZhY2UuaApAQCAtMzMsNiArMzMsNyBAQAogCiBjbGFzcyBQYXJjZWw7CiBjbGFzcyBJU3VyZmFjZTsKK2NsYXNzIFN1cmZhY2U7CiAKIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IGNsYXNzIFNvcnRlZFZlY3RvcjsKIApAQCAtMTA0LDcgKzEwNSw4IEBACiAgICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycyA9IE5VTEwpID0gMDsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0RGF0YVNvdXJjZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCkgPSAwOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0VmlkZW9TdXJmYWNlKGNvbnN0IHNwPElTdXJmYWNlPiYgc3VyZmFjZSkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0VmlkZW9JU3VyZmFjZShjb25zdCBzcDxJU3VyZmFjZT4mIHN1cmZhY2UpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldFZpZGVvU3VyZmFjZShjb25zdCBzcDxTdXJmYWNlPiYgc3VyZmFjZSkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgcHJlcGFyZSgpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHByZXBhcmVBc3luYygpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHN0YXJ0KCkgPSAwOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9NZWRpYVJlY29yZGVyQmFzZS5oIGIvaW5jbHVkZS9tZWRpYS9NZWRpYVJlY29yZGVyQmFzZS5oCmluZGV4IDVlOWUzNjguLmU1ZWRkMjkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvTWVkaWFSZWNvcmRlckJhc2UuaAorKysgYi9pbmNsdWRlL21lZGlhL01lZGlhUmVjb3JkZXJCYXNlLmgKQEAgLTIyLDcgKzIyLDcgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1jbGFzcyBJU3VyZmFjZTsKK2NsYXNzIFN1cmZhY2U7CiAKIHN0cnVjdCBNZWRpYVJlY29yZGVyQmFzZSB7CiAgICAgTWVkaWFSZWNvcmRlckJhc2UoKSB7fQpAQCAtMzcsNyArMzcsNyBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0VmlkZW9TaXplKGludCB3aWR0aCwgaW50IGhlaWdodCkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0VmlkZW9GcmFtZVJhdGUoaW50IGZyYW1lc19wZXJfc2Vjb25kKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRDYW1lcmEoY29uc3Qgc3A8SUNhbWVyYT4mIGNhbWVyYSkgPSAwOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UHJldmlld1N1cmZhY2UoY29uc3Qgc3A8SVN1cmZhY2U+JiBzdXJmYWNlKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQcmV2aWV3U3VyZmFjZShjb25zdCBzcDxTdXJmYWNlPiYgc3VyZmFjZSkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0T3V0cHV0RmlsZShjb25zdCBjaGFyICpwYXRoKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRPdXRwdXRGaWxlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIHBhcmFtcykgPSAwOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9QVk1lZGlhUmVjb3JkZXIuaCBiL2luY2x1ZGUvbWVkaWEvUFZNZWRpYVJlY29yZGVyLmgKaW5kZXggYzA5MWMzOS4uNGI0NGNjYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9QVk1lZGlhUmVjb3JkZXIuaAorKysgYi9pbmNsdWRlL21lZGlhL1BWTWVkaWFSZWNvcmRlci5oCkBAIC0yMyw3ICsyMyw3IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotY2xhc3MgSVN1cmZhY2U7CitjbGFzcyBTdXJmYWNlOwogY2xhc3MgSUNhbWVyYTsKIGNsYXNzIEF1dGhvckRyaXZlcldyYXBwZXI7CiAKQEAgLTQxLDcgKzQxLDcgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZpZGVvU2l6ZShpbnQgd2lkdGgsIGludCBoZWlnaHQpOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0VmlkZW9GcmFtZVJhdGUoaW50IGZyYW1lc19wZXJfc2Vjb25kKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldENhbWVyYShjb25zdCBzcDxJQ2FtZXJhPiYgY2FtZXJhKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFByZXZpZXdTdXJmYWNlKGNvbnN0IHNwPElTdXJmYWNlPiYgc3VyZmFjZSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQcmV2aWV3U3VyZmFjZShjb25zdCBzcDxTdXJmYWNlPiYgc3VyZmFjZSk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRPdXRwdXRGaWxlKGNvbnN0IGNoYXIgKnBhdGgpOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0T3V0cHV0RmlsZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIHBhcmFtcyk7CkBAIC02Niw0ICs2NiwzIEBACiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCiAjZW5kaWYgLy8gQU5EUk9JRF9QVk1FRElBUkVDT1JERVJfSAotCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL1BWUGxheWVyLmggYi9pbmNsdWRlL21lZGlhL1BWUGxheWVyLmgKaW5kZXggZGY1MDk4MS4uNjU3ZTdhNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9QVlBsYXllci5oCisrKyBiL2luY2x1ZGUvbWVkaWEvUFZQbGF5ZXIuaApAQCAtNDMsNyArNDMsOCBAQAogICAgICAgICAgICAgY29uc3QgY2hhciAqdXJsLCBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycyk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldERhdGFTb3VyY2UoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0VmlkZW9TdXJmYWNlKGNvbnN0IHNwPElTdXJmYWNlPiYgc3VyZmFjZSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRWaWRlb0lTdXJmYWNlKGNvbnN0IHNwPElTdXJmYWNlPiYgc3VyZmFjZSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRWaWRlb1N1cmZhY2UoY29uc3Qgc3A8U3VyZmFjZT4mIHN1cmZhY2UpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgcHJlcGFyZSgpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgcHJlcGFyZUFzeW5jKCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzdGFydCgpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9DYW1lcmFTb3VyY2UuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlLmgKaW5kZXggMzE5MmQwMy4uZWQ1ZjA5ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9DYW1lcmFTb3VyY2UuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZS5oCkBAIC0yMiw3ICsyMiw2IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KICNpbmNsdWRlIDx1dGlscy9MaXN0Lmg+CiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC00NywxMiArNDYsMzQgQEAKIAogICAgIHZpcnR1YWwgdm9pZCBzaWduYWxCdWZmZXJSZXR1cm5lZChNZWRpYUJ1ZmZlciogYnVmZmVyKTsKIAotcHJpdmF0ZToKLSAgICBmcmllbmQgY2xhc3MgQ2FtZXJhU291cmNlTGlzdGVuZXI7Ci0KK3Byb3RlY3RlZDoKICAgICBzcDxDYW1lcmE+IG1DYW1lcmE7CiAgICAgc3A8TWV0YURhdGE+IG1NZXRhOwogCisgICAgaW50NjRfdCBtU3RhcnRUaW1lVXM7CisgICAgaW50MzJfdCBtTnVtRnJhbWVzUmVjZWl2ZWQ7CisgICAgaW50NjRfdCBtTGFzdEZyYW1lVGltZXN0YW1wVXM7CisgICAgYm9vbCBtU3RhcnRlZDsKKworICAgIENhbWVyYVNvdXJjZShjb25zdCBzcDxDYW1lcmE+ICZjYW1lcmEpOworCisgICAgdmlydHVhbCB2b2lkIHN0YXJ0Q2FtZXJhUmVjb3JkaW5nKCk7CisgICAgdmlydHVhbCB2b2lkIHN0b3BDYW1lcmFSZWNvcmRpbmcoKTsKKyAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZVJlY29yZGluZ0ZyYW1lKGNvbnN0IHNwPElNZW1vcnk+JiBmcmFtZSk7CisKKyAgICAvLyBSZXR1cm5zIHRydWUgaWYgbmVlZCB0byBza2lwIHRoZSBjdXJyZW50IGZyYW1lLgorICAgIC8vIENhbGxlZCBmcm9tIGRhdGFDYWxsYmFja1RpbWVzdGFtcC4KKyAgICB2aXJ0dWFsIGJvb2wgc2tpcEN1cnJlbnRGcmFtZShpbnQ2NF90IHRpbWVzdGFtcFVzKSB7cmV0dXJuIGZhbHNlO30KKworICAgIC8vIENhbGxiYWNrIGNhbGxlZCB3aGVuIHN0aWxsIGNhbWVyYSByYXcgZGF0YSBpcyBhdmFpbGFibGUuCisgICAgdmlydHVhbCB2b2lkIGRhdGFDYWxsYmFjayhpbnQzMl90IG1zZ1R5cGUsIGNvbnN0IHNwPElNZW1vcnk+ICZkYXRhKSB7fQorCisgICAgdmlydHVhbCB2b2lkIGRhdGFDYWxsYmFja1RpbWVzdGFtcChpbnQ2NF90IHRpbWVzdGFtcFVzLCBpbnQzMl90IG1zZ1R5cGUsCisgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiAmZGF0YSk7CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIENhbWVyYVNvdXJjZUxpc3RlbmVyOworCiAgICAgTXV0ZXggbUxvY2s7CiAgICAgQ29uZGl0aW9uIG1GcmFtZUF2YWlsYWJsZUNvbmRpdGlvbjsKICAgICBDb25kaXRpb24gbUZyYW1lQ29tcGxldGVDb25kaXRpb247CkBAIC02MCwyMSArODEsMTIgQEAKICAgICBMaXN0PHNwPElNZW1vcnk+ID4gbUZyYW1lc0JlaW5nRW5jb2RlZDsKICAgICBMaXN0PGludDY0X3Q+IG1GcmFtZVRpbWVzOwogCi0gICAgaW50NjRfdCBtU3RhcnRUaW1lVXM7CiAgICAgaW50NjRfdCBtRmlyc3RGcmFtZVRpbWVVczsKLSAgICBpbnQ2NF90IG1MYXN0RnJhbWVUaW1lc3RhbXBVczsKLSAgICBpbnQzMl90IG1OdW1GcmFtZXNSZWNlaXZlZDsKICAgICBpbnQzMl90IG1OdW1GcmFtZXNFbmNvZGVkOwogICAgIGludDMyX3QgbU51bUZyYW1lc0Ryb3BwZWQ7CiAgICAgaW50MzJfdCBtTnVtR2xpdGNoZXM7CiAgICAgaW50NjRfdCBtR2xpdGNoRHVyYXRpb25UaHJlc2hvbGRVczsKICAgICBib29sIG1Db2xsZWN0U3RhdHM7Ci0gICAgYm9vbCBtU3RhcnRlZDsKLQotICAgIENhbWVyYVNvdXJjZShjb25zdCBzcDxDYW1lcmE+ICZjYW1lcmEpOwotCi0gICAgdm9pZCBkYXRhQ2FsbGJhY2tUaW1lc3RhbXAoCi0gICAgICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcFVzLCBpbnQzMl90IG1zZ1R5cGUsIGNvbnN0IHNwPElNZW1vcnk+ICZkYXRhKTsKIAogICAgIHZvaWQgcmVsZWFzZVF1ZXVlZEZyYW1lcygpOwogICAgIHZvaWQgcmVsZWFzZU9uZVJlY29yZGluZ0ZyYW1lKGNvbnN0IHNwPElNZW1vcnk+JiBmcmFtZSk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZVRpbWVMYXBzZS5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9DYW1lcmFTb3VyY2VUaW1lTGFwc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTM1YTMzCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9DYW1lcmFTb3VyY2VUaW1lTGFwc2UuaApAQCAtMCwwICsxLDE4MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQ0FNRVJBX1NPVVJDRV9USU1FX0xBUFNFX0hfCisKKyNkZWZpbmUgQ0FNRVJBX1NPVVJDRV9USU1FX0xBUFNFX0hfCisKKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisKKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIElDYW1lcmE7CitjbGFzcyBJTWVtb3J5OworY2xhc3MgQ2FtZXJhOworCitjbGFzcyBDYW1lcmFTb3VyY2VUaW1lTGFwc2UgOiBwdWJsaWMgQ2FtZXJhU291cmNlIHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgQ2FtZXJhU291cmNlVGltZUxhcHNlICpDcmVhdGUoYm9vbCB1c2VTdGlsbENhbWVyYUZvclRpbWVMYXBzZSwKKyAgICAgICAgaW50NjRfdCB0aW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZVVzLAorICAgICAgICBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCwKKyAgICAgICAgaW50MzJfdCB2aWRlb0ZyYW1lUmF0ZSk7CisKKyAgICBzdGF0aWMgQ2FtZXJhU291cmNlVGltZUxhcHNlICpDcmVhdGVGcm9tQ2FtZXJhKGNvbnN0IHNwPENhbWVyYT4gJmNhbWVyYSwKKyAgICAgICAgYm9vbCB1c2VTdGlsbENhbWVyYUZvclRpbWVMYXBzZSwKKyAgICAgICAgaW50NjRfdCB0aW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZVVzLAorICAgICAgICBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCwKKyAgICAgICAgaW50MzJfdCB2aWRlb0ZyYW1lUmF0ZSk7CisKKyAgICB2aXJ0dWFsIH5DYW1lcmFTb3VyY2VUaW1lTGFwc2UoKTsKKworcHJpdmF0ZToKKyAgICAvLyBJZiB0cnVlLCB3aWxsIHVzZSBzdGlsbCBjYW1lcmEgdGFrZVBpY3R1cmUoKSBmb3IgdGltZSBsYXBzZSBmcmFtZXMKKyAgICAvLyBJZiBmYWxzZSwgd2lsbCB1c2UgdGhlIHZpZGVvY2FtZXJhIGZyYW1lcyBpbnN0ZWFkLgorICAgIGJvb2wgbVVzZVN0aWxsQ2FtZXJhRm9yVGltZUxhcHNlOworCisgICAgLy8gU2l6ZSBvZiBwaWN0dXJlIHRha2VuIGZyb20gc3RpbGwgY2FtZXJhLiBUaGlzIG1heSBiZSBsYXJnZXIgdGhhbiB0aGUgc2l6ZQorICAgIC8vIG9mIHRoZSB2aWRlbywgYXMgc3RpbGwgY2FtZXJhIG1heSBub3Qgc3VwcG9ydCB0aGUgZXhhY3QgdmlkZW8gcmVzb2x1dGlvbgorICAgIC8vIGRlbWFuZGVkLiBTZWUgc2V0UGljdHVyZVNpemVUb0Nsb3Nlc3RTdXBwb3J0ZWQoKS4KKyAgICBpbnQzMl90IG1QaWN0dXJlV2lkdGg7CisgICAgaW50MzJfdCBtUGljdHVyZUhlaWdodDsKKworICAgIC8vIHNpemUgb2YgdGhlIGVuY29kZWQgdmlkZW8uCisgICAgaW50MzJfdCBtVmlkZW9XaWR0aDsKKyAgICBpbnQzMl90IG1WaWRlb0hlaWdodDsKKworICAgIC8vIFRydWUgaWYgd2UgbmVlZCB0byBjcm9wIHRoZSBzdGlsbCBjYW1lcmEgaW1hZ2UgdG8gZ2V0IHRoZSB2aWRlbyBmcmFtZS4KKyAgICBib29sIG1OZWVkQ3JvcHBpbmc7CisKKyAgICAvLyBTdGFydCBsb2NhdGlvbiBvZiB0aGUgY3JvcHBpbmcgcmVjdGFuZ2xlLgorICAgIGludDMyX3QgbUNyb3BSZWN0U3RhcnRYOworICAgIGludDMyX3QgbUNyb3BSZWN0U3RhcnRZOworCisgICAgLy8gVGltZSBiZXR3ZWVuIGNhcHR1cmUgb2YgdHdvIGZyYW1lcyBkdXJpbmcgdGltZSBsYXBzZSByZWNvcmRpbmcKKyAgICAvLyBOZWdhdGl2ZSB2YWx1ZSBpbmRpY2F0ZXMgdGhhdCB0aW1lbGFwc2UgaXMgZGlzYWJsZWQuCisgICAgaW50NjRfdCBtVGltZUJldHdlZW5UaW1lTGFwc2VGcmFtZUNhcHR1cmVVczsKKworICAgIC8vIFRpbWUgYmV0d2VlbiB0d28gZnJhbWVzIGluIGZpbmFsIHZpZGVvICgxL2ZyYW1lUmF0ZSkKKyAgICBpbnQ2NF90IG1UaW1lQmV0d2VlblRpbWVMYXBzZVZpZGVvRnJhbWVzVXM7CisKKyAgICAvLyBSZWFsIHRpbWVzdGFtcCBvZiB0aGUgbGFzdCBlbmNvZGVkIHRpbWUgbGFwc2UgZnJhbWUKKyAgICBpbnQ2NF90IG1MYXN0VGltZUxhcHNlRnJhbWVSZWFsVGltZXN0YW1wVXM7CisKKyAgICAvLyBUaHJlYWQgaWQgb2YgdGhyZWFkIHdoaWNoIHRha2VzIHN0aWxsIHBpY3R1cmUgYW5kIHNsZWVwcyBpbiBhIGxvb3AuCisgICAgcHRocmVhZF90IG1UaHJlYWRUaW1lTGFwc2U7CisKKyAgICAvLyBWYXJpYWJsZSBzZXQgaW4gZGF0YUNhbGxiYWNrVGltZXN0YW1wKCkgdG8gaGVscCBza2lwQ3VycmVudEZyYW1lKCkKKyAgICAvLyB0byBrbm93IGlmIGN1cnJlbnQgZnJhbWUgbmVlZHMgdG8gYmUgc2tpcHBlZC4KKyAgICBib29sIG1Ta2lwQ3VycmVudEZyYW1lOworCisgICAgLy8gVHJ1ZSBpZiBjYW1lcmEgaXMgaW4gcHJldmlldyBtb2RlIGFuZCByZWFkeSBmb3IgdGFrZVBpY3R1cmUoKS4KKyAgICBib29sIG1DYW1lcmFJZGxlOworCisgICAgQ2FtZXJhU291cmNlVGltZUxhcHNlKGNvbnN0IHNwPENhbWVyYT4gJmNhbWVyYSwKKyAgICAgICAgYm9vbCB1c2VTdGlsbENhbWVyYUZvclRpbWVMYXBzZSwKKyAgICAgICAgaW50NjRfdCB0aW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZVVzLAorICAgICAgICBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCwKKyAgICAgICAgaW50MzJfdCB2aWRlb0ZyYW1lUmF0ZSk7CisKKyAgICAvLyBGb3Igc3RpbGwgY2FtZXJhIGNhc2Ugc3RhcnRzIGEgdGhyZWFkIHdoaWNoIGNhbGxzIGNhbWVyYSdzIHRha2VQaWN0dXJlKCkKKyAgICAvLyBpbiBhIGxvb3AuIEZvciB2aWRlbyBjYW1lcmEgY2FzZSwganVzdCBzdGFydHMgdGhlIGNhbWVyYSdzIHZpZGVvIHJlY29yZGluZy4KKyAgICB2aXJ0dWFsIHZvaWQgc3RhcnRDYW1lcmFSZWNvcmRpbmcoKTsKKworICAgIC8vIEZvciBzdGlsbCBjYW1lcmEgY2FzZSBqb2lucyB0aGUgdGhyZWFkIGNyZWF0ZWQgaW4gc3RhcnRDYW1lcmFSZWNvcmRpbmcoKS4KKyAgICAvLyBGb3IgdmlkZW8gY2FtZXJhIGNhc2UsIGp1c3Qgc3RvcHMgdGhlIGNhbWVyYSdzIHZpZGVvIHJlY29yZGluZy4KKyAgICB2aXJ0dWFsIHZvaWQgc3RvcENhbWVyYVJlY29yZGluZygpOworCisgICAgLy8gRm9yIHN0aWxsIGNhbWVyYSBjYXNlIGRvbid0IG5lZWQgdG8gZG8gYW55dGhpbmcgYXMgbWVtb3J5IGlzIGxvY2FsbHkKKyAgICAvLyBhbGxvY2F0ZWQgd2l0aCByZWZjb3VudGluZy4KKyAgICAvLyBGb3IgdmlkZW8gY2FtZXJhIGNhc2UganVzdCB0ZWxsIHRoZSBjYW1lcmEgdG8gcmVsZWFzZSB0aGUgZnJhbWUuCisgICAgdmlydHVhbCB2b2lkIHJlbGVhc2VSZWNvcmRpbmdGcmFtZShjb25zdCBzcDxJTWVtb3J5PiYgZnJhbWUpOworCisgICAgLy8gbVNraXBDdXJyZW50RnJhbWUgaXMgc2V0IHRvIHRydWUgaW4gZGF0YUNhbGxiYWNrVGltZXN0YW1wKCkgaWYgdGhlIGN1cnJlbnQKKyAgICAvLyBmcmFtZSBuZWVkcyB0byBiZSBza2lwcGVkIGFuZCB0aGlzIGZ1bmN0aW9uIGp1c3QgcmV0dXJucyB0aGUgdmFsdWUgb2YgbVNraXBDdXJyZW50RnJhbWUuCisgICAgdmlydHVhbCBib29sIHNraXBDdXJyZW50RnJhbWUoaW50NjRfdCB0aW1lc3RhbXBVcyk7CisKKyAgICAvLyBIYW5kbGVzIHRoZSBjYWxsYmFjayB0byBoYW5kbGUgcmF3IGZyYW1lIGRhdGEgZnJvbSB0aGUgc3RpbGwgY2FtZXJhLgorICAgIC8vIENyZWF0ZXMgYSBjb3B5IG9mIHRoZSBmcmFtZSBkYXRhIGFzIHRoZSBjYW1lcmEgY2FuIHJldXNlIHRoZSBmcmFtZSBtZW1vcnkKKyAgICAvLyBvbmNlIHRoaXMgY2FsbGJhY2sgcmV0dXJucy4gVGhlIGZ1bmN0aW9uIGFsc28gc2V0cyBhIG5ldyB0aW1zdGFtcCBjb3JyZXNwb25kaW5nCisgICAgLy8gdG8gb25lIGZyYW1lIHRpbWUgYWhlYWQgb2YgdGhlIGxhc3QgZW5jb2RlZCBmcmFtZSdzIHRpbWUgc3RhbXAuIEl0IHRoZW4KKyAgICAvLyBjYWxscyBkYXRhQ2FsbGJhY2tUaW1lc3RhbXAoKSBvZiB0aGUgYmFzZSBjbGFzcyB3aXRoIHRoZSBjb3BpZWQgZGF0YSBhbmQgdGhlCisgICAgLy8gbW9kaWZpZWQgdGltZXN0YW1wLCB3aGljaCB3aWxsIHRoaW5rIHRoYXQgaXQgcmVjaWV2ZWQgdGhlIGZyYW1lIGZyb20gYSB2aWRlbworICAgIC8vIGNhbWVyYSBhbmQgcHJvY2VlZCBhcyB1c3VhbC4KKyAgICB2aXJ0dWFsIHZvaWQgZGF0YUNhbGxiYWNrKGludDMyX3QgbXNnVHlwZSwgY29uc3Qgc3A8SU1lbW9yeT4gJmRhdGEpOworCisgICAgLy8gSW4gdGhlIHZpZGVvIGNhbWVyYSBjYXNlIGNhbGxzIHNraXBGcmFtZUFuZE1vZGlmeVRpbWVTdGFtcCgpIHRvIG1vZGlmeQorICAgIC8vIHRpbWVzdGFtcCBhbmQgc2V0IG1Ta2lwQ3VycmVudEZyYW1lLgorICAgIC8vIFRoZW4gaXQgY2FsbHMgdGhlIGJhc2UgQ2FtZXJhU291cmNlOjpkYXRhQ2FsbGJhY2tUaW1lc3RhbXAoKQorICAgIHZpcnR1YWwgdm9pZCBkYXRhQ2FsbGJhY2tUaW1lc3RhbXAoaW50NjRfdCB0aW1lc3RhbXBVcywgaW50MzJfdCBtc2dUeXBlLAorICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4gJmRhdGEpOworCisgICAgLy8gVGhlIHN0aWxsIGNhbWVyYSBtYXkgbm90IHN1cHBvcnQgdGhlIGRlbWFuZGVkIHZpZGVvIHdpZHRoIGFuZCBoZWlnaHQuCisgICAgLy8gV2UgbG9vayBmb3IgdGhlIHN1cHBvcnRlZCBwaWN0dXJlIHNpemVzIGZyb20gdGhlIHN0aWxsIGNhbWVyYSBhbmQKKyAgICAvLyBjaG9vc2UgdGhlIHNtYWxsZXN0IG9uZSB3aXRoIGVpdGhlciBkaW1lbnNpb25zIGhpZ2hlciB0aGFuIHRoZSBjb3JyZXNwb25kaW5nCisgICAgLy8gdmlkZW8gZGltZW5zaW9ucy4gVGhlIHN0aWxsIHBpY3R1cmUgd2lsbCBiZSBjcm9wcGVkIHRvIGdldCB0aGUgdmlkZW8gZnJhbWUuCisgICAgLy8gVGhlIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBpZiB0aGUgY2FtZXJhIHN1cHBvcnRzIHBpY3R1cmUgc2l6ZXMgZ3JlYXRlciB0aGFuCisgICAgLy8gb3IgZXF1YWwgdG8gdGhlIHBhc3NlZCBpbiB3aWR0aCBhbmQgaGVpZ2h0LCBhbmQgZmFsc2Ugb3RoZXJ3aXNlLgorICAgIGJvb2wgc2V0UGljdHVyZVNpemVUb0Nsb3Nlc3RTdXBwb3J0ZWQoaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQpOworCisgICAgLy8gQ29tcHV0ZXMgdGhlIG9mZnNldCBvZiB0aGUgcmVjdGFuZ2xlIGZyb20gd2hlcmUgdG8gc3RhcnQgY3JvcHBpbmcgdGhlCisgICAgLy8gc3RpbGwgaW1hZ2UgaW50byB0aGUgdmlkZW8gZnJhbWUuIFdlIGNob29zZSB0aGUgY2VudGVyIG9mIHRoZSBpbWFnZSB0byBiZQorICAgIC8vIGNyb3BwZWQuIFRoZSBvZmZzZXQgaXMgc3RvcmVkIGluIChtQ3JvcFJlY3RTdGFydFgsIG1Dcm9wUmVjdFN0YXJ0WSkuCisgICAgYm9vbCBjb21wdXRlQ3JvcFJlY3RhbmdsZU9mZnNldCgpOworCisgICAgLy8gQ3JvcHMgdGhlIHNvdXJjZSBkYXRhIGludG8gYSBzbWFsbGVyIGltYWdlIHN0YXJ0aW5nIGF0CisgICAgLy8gKG1Dcm9wUmVjdFN0YXJ0WCwgbUNyb3BSZWN0U3RhcnRZKSBhbmQgb2YgdGhlIHNpemUgb2YgdGhlIHZpZGVvIGZyYW1lLgorICAgIC8vIFRoZSBkYXRhIGlzIHJldHVybmVkIGludG8gYSBuZXdseSBhbGxvY2F0ZWQgSU1lbW9yeS4KKyAgICBzcDxJTWVtb3J5PiBjcm9wWVVWSW1hZ2UoY29uc3Qgc3A8SU1lbW9yeT4gJnNvdXJjZV9kYXRhKTsKKworICAgIC8vIFdoZW4gdmlkZW8gY2FtZXJhIGlzIHVzZWQgZm9yIHRpbWUgbGFwc2UgY2FwdHVyZSwgcmV0dXJucyB0cnVlCisgICAgLy8gdW50aWwgZW5vdWdoIHRpbWUgaGFzIHBhc3NlZCBmb3IgdGhlIG5leHQgdGltZSBsYXBzZSBmcmFtZS4gV2hlbgorICAgIC8vIHRoZSBmcmFtZSBuZWVkcyB0byBiZSBlbmNvZGVkLCBpdCByZXR1cm5zIGZhbHNlIGFuZCBhbHNvIG1vZGlmaWVzCisgICAgLy8gdGhlIHRpbWUgc3RhbXAgdG8gYmUgb25lIGZyYW1lIHRpbWUgYWhlYWQgb2YgdGhlIGxhc3QgZW5jb2RlZAorICAgIC8vIGZyYW1lJ3MgdGltZSBzdGFtcC4KKyAgICBib29sIHNraXBGcmFtZUFuZE1vZGlmeVRpbWVTdGFtcChpbnQ2NF90ICp0aW1lc3RhbXBVcyk7CisKKyAgICAvLyBXcmFwcGVyIHRvIGVudGVyIHRocmVhZFRpbWVMYXBzZUVudHJ5KCkKKyAgICBzdGF0aWMgdm9pZCAqVGhyZWFkVGltZUxhcHNlV3JhcHBlcih2b2lkICptZSk7CisKKyAgICAvLyBSdW5zIGEgbG9vcCB3aGljaCBzbGVlcHMgdW50aWwgYSBzdGlsbCBwaWN0dXJlIGlzIHJlcXVpcmVkCisgICAgLy8gYW5kIHRoZW4gY2FsbHMgbUNhbWVyYS0+dGFrZVBpY3R1cmUoKSB0byB0YWtlIHRoZSBzdGlsbCBwaWN0dXJlLgorICAgIC8vIFVzZWQgb25seSBpbiB0aGUgY2FzZSBtVXNlU3RpbGxDYW1lcmFGb3JUaW1lTGFwc2UgPSB0cnVlLgorICAgIHZvaWQgdGhyZWFkVGltZUxhcHNlRW50cnkoKTsKKworICAgIC8vIFdyYXBwZXIgdG8gZW50ZXIgdGhyZWFkU3RhcnRQcmV2aWV3KCkKKyAgICBzdGF0aWMgdm9pZCAqVGhyZWFkU3RhcnRQcmV2aWV3V3JhcHBlcih2b2lkICptZSk7CisKKyAgICAvLyBTdGFydHMgdGhlIGNhbWVyYSdzIHByZXZpZXcuCisgICAgdm9pZCB0aHJlYWRTdGFydFByZXZpZXcoKTsKKworICAgIC8vIFN0YXJ0cyB0aHJlYWQgVGhyZWFkU3RhcnRQcmV2aWV3V3JhcHBlcigpIGZvciByZXN0YXJ0aW5nIHByZXZpZXcuCisgICAgLy8gTmVlZHMgdG8gYmUgZG9uZSBpbiBhIHRocmVhZCBzbyB0aGF0IGRhdGFDYWxsYmFjaygpIHdoaWNoIGNhbGxzIHRoaXMgZnVuY3Rpb24KKyAgICAvLyBjYW4gcmV0dXJuLCBhbmQgdGhlIGNhbWVyYSBjYW4ga25vdyB0aGF0IHRha2VQaWN0dXJlKCkgaXMgZG9uZS4KKyAgICB2b2lkIHJlc3RhcnRQcmV2aWV3KCk7CisKKyAgICAvLyBDcmVhdGVzIGEgY29weSBvZiBzb3VyY2VfZGF0YSBpbnRvIGEgbmV3IG1lbW9yeSBvZiBmaW5hbCB0eXBlIE1lbW9yeUJhc2UuCisgICAgc3A8SU1lbW9yeT4gY3JlYXRlSU1lbW9yeUNvcHkoY29uc3Qgc3A8SU1lbW9yeT4gJnNvdXJjZV9kYXRhKTsKKworICAgIENhbWVyYVNvdXJjZVRpbWVMYXBzZShjb25zdCBDYW1lcmFTb3VyY2VUaW1lTGFwc2UgJik7CisgICAgQ2FtZXJhU291cmNlVGltZUxhcHNlICZvcGVyYXRvcj0oY29uc3QgQ2FtZXJhU291cmNlVGltZUxhcHNlICYpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBDQU1FUkFfU09VUkNFX1RJTUVfTEFQU0VfSF8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvWVVWQ2FudmFzLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1lVVkNhbnZhcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmNzA5MjMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1lVVkNhbnZhcy5oCkBAIC0wLDAgKzEsNzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBZVVZDYW52YXMgaG9sZHMgYSByZWZlcmVuY2UgdG8gYSBZVVZJbWFnZSBvbiB3aGljaCBpdCBjYW4gZG8gdmFyaW91cworLy8gZHJhd2luZyBvcGVyYXRpb25zLiBJdCBwcm92aWRlcyB2YXJpb3VzIHV0aWxpdHkgZnVuY3Rpb25zIGZvciBmaWxsaW5nLAorLy8gY3JvcHBpbmcsIGV0Yy4KKworCisjaWZuZGVmIFlVVl9DQU5WQVNfSF8KKworI2RlZmluZSBZVVZfQ0FOVkFTX0hfCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBZVVZJbWFnZTsKK2NsYXNzIFJlY3Q7CisKK2NsYXNzIFlVVkNhbnZhcyB7CitwdWJsaWM6CisKKyAgICAvLyBDb25zdHJ1Y3RvciB0YWtlcyBpbiByZWZlcmVuY2UgdG8gYSB5dXZJbWFnZSBvbiB3aGljaCBpdCBjYW4gZG8KKyAgICAvLyB2YXJpb3VzIGRyYXdpbmcgb3ByZWF0aW9ucy4KKyAgICBZVVZDYW52YXMoWVVWSW1hZ2UgJnl1dkltYWdlKTsKKyAgICB+WVVWQ2FudmFzKCk7CisKKyAgICAvLyBGaWxscyB0aGUgZW50aXJlIGltYWdlIHdpdGggdGhlIGdpdmVuIFlVViB2YWx1ZXMuCisgICAgdm9pZCBGaWxsWVVWKHVpbnQ4X3QgeVZhbHVlLCB1aW50OF90IHVWYWx1ZSwgdWludDhfdCB2VmFsdWUpOworCisgICAgLy8gRmlsbHMgdGhlIHJlY3Rhbmd1bGFyIHJlZ2lvbiBbc3RhcnRYLGVuZFhdeFtzdGFydFksZW5kWV0gd2l0aCB0aGUgZ2l2ZW4gWVVWIHZhbHVlcy4KKyAgICB2b2lkIEZpbGxZVVZSZWN0YW5nbGUoY29uc3QgUmVjdCYgcmVjdCwKKyAgICAgICAgICAgIHVpbnQ4X3QgeVZhbHVlLCB1aW50OF90IHVWYWx1ZSwgdWludDhfdCB2VmFsdWUpOworCisgICAgLy8gQ29waWVzIHRoZSByZWdpb24gW3N0YXJ0WCxlbmRYXXhbc3RhcnRZLGVuZFldIGZyb20gc3JjSW1hZ2UgaW50byB0aGUKKyAgICAvLyBjYW52YXMnIHRhcmdldCBpbWFnZSAobVlVVkltYWdlKSBzdGFydGluZyBhdAorICAgIC8vIChkZXN0aW5hdGlvblN0YXJ0WCxkZXN0aW5hdGlvblN0YXJ0WSkuCisgICAgLy8gTm90ZSB0aGF0IHVuZGVmaW5lZCBiZWhhdmlvciBtYXkgb2NjdXIgaWYgc3JjSW1hZ2UgaXMgc2FtZSBhcyB0aGUgY2FudmFzJworICAgIC8vIHRhcmdldCBpbWFnZS4KKyAgICB2b2lkIENvcHlJbWFnZVJlY3QoCisgICAgICAgICAgICBjb25zdCBSZWN0JiBzcmNSZWN0LAorICAgICAgICAgICAgaW50MzJfdCBkZXN0U3RhcnRYLCBpbnQzMl90IGRlc3RTdGFydFksCisgICAgICAgICAgICBjb25zdCBZVVZJbWFnZSAmc3JjSW1hZ2UpOworCisgICAgLy8gRG93bnNhbXBsZXMgdGhlIHNyY0ltYWdlIGludG8gdGhlIGNhbnZhcycgdGFyZ2V0IGltYWdlIChtWVVWSW1hZ2UpCisgICAgLy8gVGhlIGRvd25zYW1wbGluZyBjb3BpZXMgcGl4ZWxzIGZyb20gdGhlIHNvdXJjZSBpbWFnZSBzdGFydGluZyBhdAorICAgIC8vIChzcmNPZmZzZXRYLCBzcmNPZmZzZXRZKSB0byB0aGUgdGFyZ2V0IGltYWdlLCBzdGFydGluZyBhdCAoMCwgMCkuCisgICAgLy8gRm9yIGVhY2ggWCBpbmNyZW1lbnQgaW4gdGhlIHRhcmdldCBpbWFnZSwgc2tpcFggcGl4ZWxzIGFyZSBza2lwcGVkCisgICAgLy8gaW4gdGhlIHNvdXJjZSBpbWFnZS4KKyAgICAvLyBTaW1pbGFybHkgZm9yIGVhY2ggWSBpbmNyZW1lbnQgaW4gdGhlIHRhcmdldCBpbWFnZSwgc2tpcFkgcGl4ZWxzCisgICAgLy8gYXJlIHNraXBwZWQgaW4gdGhlIHNvdXJjZSBpbWFnZS4KKyAgICB2b2lkIGRvd25zYW1wbGUoCisgICAgICAgICAgICBpbnQzMl90IHNyY09mZnNldFgsIGludDMyX3Qgc3JjT2Zmc2V0WSwKKyAgICAgICAgICAgIGludDMyX3Qgc2tpcFgsIGludDMyX3Qgc2tpcFksCisgICAgICAgICAgICBjb25zdCBZVVZJbWFnZSAmc3JjSW1hZ2UpOworCitwcml2YXRlOgorICAgIFlVVkltYWdlJiBtWVVWSW1hZ2U7CisKKyAgICBZVVZDYW52YXMoY29uc3QgWVVWQ2FudmFzICYpOworICAgIFlVVkNhbnZhcyAmb3BlcmF0b3I9KGNvbnN0IFlVVkNhbnZhcyAmKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gWVVWX0NBTlZBU19IXwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9ZVVZJbWFnZS5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9ZVVZJbWFnZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlOTg2MTgKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1lVVkltYWdlLmgKQEAgLTAsMCArMSwxNzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBBIGNvbnRhaW5lciBjbGFzcyB0byBob2xkIFlVViBkYXRhIGFuZCBwcm92aWRlIHZhcmlvdXMgdXRpbGl0aWVzLAorLy8gZS5nLiB0byBzZXQvZ2V0IHBpeGVsIHZhbHVlcy4KKy8vIFN1cHBvcnRlZCBmb3JtYXRzOgorLy8gIC0gWVVWNDIwIFBsYW5hcgorLy8gIC0gWVVWNDIwIFNlbWkgUGxhbmFyCisvLworLy8gIEN1cnJlbnRseSBkb2VzIG5vdCBzdXBwb3J0IHZhcmlhYmxlIHN0cmlkZXMuCisvLworLy8gIEltcGxlbWVudGF0aW9uOiBUd28gc2ltcGxlIGFic3RyYWN0aW9ucyBhcmUgZG9uZSB0byBzaW1wbGlmeSBhY2Nlc3MKKy8vICB0byBZVVYgY2hhbm5lbHMgZm9yIGRpZmZlcmVudCBmb3JtYXRzOgorLy8gIC0gaW5pdGlhbGl6ZVlVVlBvaW50ZXJzKCkgc2V0cyB1cCBwb2ludGVycyAobVlkYXRhLCBtVWRhdGEsIG1WZGF0YSkgdG8KKy8vICBwb2ludCB0byB0aGUgcmlnaHQgc3RhcnQgbG9jYXRpb25zIG9mIHRoZSBkaWZmZXJlbnQgY2hhbm5lbCBkYXRhIGRlcGVuZGluZworLy8gIG9uIHRoZSBmb3JtYXQuCisvLyAgLSBnZXRPZmZzZXRzKCkgcmV0dXJucyB0aGUgY29ycmVjdCBvZmZzZXQgZm9yIHRoZSBkaWZmZXJlbnQgY2hhbm5lbHMKKy8vICBkZXBlbmRpbmcgb24gdGhlIGZvcm1hdC4KKy8vICBMb2NhdGlvbiBvZiBhbnkgcGl4ZWwncyBZVVYgY2hhbm5lbHMgY2FuIHRoZW4gYmUgZWFzaWx5IGNvbXB1dGVkIHVzaW5nIHRoZXNlLgorLy8KKworI2lmbmRlZiBZVVZfSU1BR0VfSF8KKworI2RlZmluZSBZVVZfSU1BR0VfSF8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPGNzdHJpbmc+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgUmVjdDsKKworY2xhc3MgWVVWSW1hZ2UgeworcHVibGljOgorICAgIC8vIFN1cHBvcnRlZCBZVVYgZm9ybWF0cworICAgIGVudW0gWVVWRm9ybWF0IHsKKyAgICAgICAgWVVWNDIwUGxhbmFyLAorICAgICAgICBZVVY0MjBTZW1pUGxhbmFyCisgICAgfTsKKworICAgIC8vIENvbnN0cnVjdHMgYW4gaW1hZ2Ugd2l0aCB0aGUgZ2l2ZW4gc2l6ZSwgZm9ybWF0LiBBbHNvIGFsbG9jYXRlcyBhbmQgb3ducworICAgIC8vIHRoZSByZXF1aXJlZCBtZW1vcnkuCisgICAgWVVWSW1hZ2UoWVVWRm9ybWF0IHl1dkZvcm1hdCwgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQpOworCisgICAgLy8gQ29uc3RydWN0cyBhbiBpbWFnZSB3aXRoIHRoZSBnaXZlbiBzaXplLCBmb3JtYXQuIFRoZSBtZW1vcnkgaXMgcHJvdmlkZWQKKyAgICAvLyBieSB0aGUgY2FsbGVyIGFuZCB3ZSBkb24ndCBvd24gaXQuCisgICAgWVVWSW1hZ2UoWVVWRm9ybWF0IHl1dkZvcm1hdCwgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQsIHVpbnQ4X3QgKmJ1ZmZlcik7CisKKyAgICAvLyBEZXN0cnVjdG9yIHRvIGRlbGV0ZSB0aGUgbWVtb3J5IGlmIGl0IG93bnMgaXQuCisgICAgfllVVkltYWdlKCk7CisKKyAgICAvLyBSZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBidWZmZXIgcmVxdWlyZWQgdG8gc3RvcmUgdGhlIFlVViBkYXRhIGZvciB0aGUgZ2l2ZW4KKyAgICAvLyBmb3JtYXQgYW5kIGdlb21ldHJ5LiBVc2VmdWwgd2hlbiB0aGUgY2FsbGVyIHdhbnRzIHRvIGFsbG9jYXRlIHRoZSByZXF1aXNpdGUKKyAgICAvLyBtZW1vcnkuCisgICAgc3RhdGljIHNpemVfdCBidWZmZXJTaXplKFlVVkZvcm1hdCB5dXZGb3JtYXQsIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0KTsKKworICAgIGludDMyX3Qgd2lkdGgoKSBjb25zdCB7cmV0dXJuIG1XaWR0aDt9CisgICAgaW50MzJfdCBoZWlnaHQoKSBjb25zdCB7cmV0dXJuIG1IZWlnaHQ7fQorCisgICAgLy8gUmV0dXJucyB0cnVlIGlmIHBpeGVsIGlzIHRoZSByYW5nZSBbMCwgd2lkdGgtMV0geCBbMCwgaGVpZ2h0LTFdCisgICAgLy8gYW5kIGZhbHNlIG90aGVyd2lzZS4KKyAgICBib29sIHZhbGlkUGl4ZWwoaW50MzJfdCB4LCBpbnQzMl90IHkpIGNvbnN0OworCisgICAgLy8gR2V0IHRoZSBwaXhlbCBZVVYgdmFsdWUgYXQgcGl4ZWwgKHgseSkuCisgICAgLy8gTm90ZSB0aGF0IHRoZSByYW5nZSBvZiB4IGlzIFswLCB3aWR0aC0xXSBhbmQgdGhlIHJhbmdlIG9mIHkgaXMgWzAsIGhlaWdodC0xXS4KKyAgICAvLyBSZXR1cm5zIHRydWUgaWYgZ2V0IHdhcyBzdWNjZXNzZnVsIGFuZCBmYWxzZSBvdGhlcndpc2UuCisgICAgYm9vbCBnZXRQaXhlbFZhbHVlKGludDMyX3QgeCwgaW50MzJfdCB5LAorICAgICAgICAgICAgdWludDhfdCAqeVB0ciwgdWludDhfdCAqdVB0ciwgdWludDhfdCAqdlB0cikgY29uc3Q7CisKKyAgICAvLyBTZXQgdGhlIHBpeGVsIFlVViB2YWx1ZSBhdCBwaXhlbCAoeCx5KS4KKyAgICAvLyBOb3RlIHRoYXQgdGhlIHJhbmdlIG9mIHggaXMgWzAsIHdpZHRoLTFdIGFuZCB0aGUgcmFuZ2Ugb2YgeSBpcyBbMCwgaGVpZ2h0LTFdLgorICAgIC8vIFJldHVybnMgdHJ1ZSBpZiBzZXQgd2FzIHN1Y2Nlc3NmdWwgYW5kIGZhbHNlIG90aGVyd2lzZS4KKyAgICBib29sIHNldFBpeGVsVmFsdWUoaW50MzJfdCB4LCBpbnQzMl90IHksCisgICAgICAgICAgICB1aW50OF90IHlWYWx1ZSwgdWludDhfdCB1VmFsdWUsIHVpbnQ4X3QgdlZhbHVlKTsKKworICAgIC8vIFVzZXMgbWVtY3B5IHRvIGNvcHkgYW4gZW50aXJlIHJvdyBvZiBkYXRhCisgICAgc3RhdGljIHZvaWQgZmFzdENvcHlSZWN0YW5nbGU0MjBQbGFuYXIoCisgICAgICAgICAgICBjb25zdCBSZWN0JiBzcmNSZWN0LAorICAgICAgICAgICAgaW50MzJfdCBkZXN0U3RhcnRYLCBpbnQzMl90IGRlc3RTdGFydFksCisgICAgICAgICAgICBjb25zdCBZVVZJbWFnZSAmc3JjSW1hZ2UsIFlVVkltYWdlICZkZXN0SW1hZ2UpOworCisgICAgLy8gVXNlcyBtZW1jcHkgdG8gY29weSBhbiBlbnRpcmUgcm93IG9mIGRhdGEKKyAgICBzdGF0aWMgdm9pZCBmYXN0Q29weVJlY3RhbmdsZTQyMFNlbWlQbGFuYXIoCisgICAgICAgICAgICBjb25zdCBSZWN0JiBzcmNSZWN0LAorICAgICAgICAgICAgaW50MzJfdCBkZXN0U3RhcnRYLCBpbnQzMl90IGRlc3RTdGFydFksCisgICAgICAgICAgICBjb25zdCBZVVZJbWFnZSAmc3JjSW1hZ2UsIFlVVkltYWdlICZkZXN0SW1hZ2UpOworCisgICAgLy8gVHJpZXMgdG8gdXNlIG1lbWNvcHkgdG8gY29weSBlbnRpcmUgcm93cyBvZiBkYXRhLgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgZmFzdCBjb3B5IGlzIG5vdCBwb3NzaWJsZSBmb3IgdGhlIHBhc3NlZCBpbWFnZSBmb3JtYXRzLgorICAgIHN0YXRpYyBib29sIGZhc3RDb3B5UmVjdGFuZ2xlKAorICAgICAgICAgICAgY29uc3QgUmVjdCYgc3JjUmVjdCwKKyAgICAgICAgICAgIGludDMyX3QgZGVzdFN0YXJ0WCwgaW50MzJfdCBkZXN0U3RhcnRZLAorICAgICAgICAgICAgY29uc3QgWVVWSW1hZ2UgJnNyY0ltYWdlLCBZVVZJbWFnZSAmZGVzdEltYWdlKTsKKworICAgIC8vIENvbnZlcnQgdGhlIGdpdmVuIFlVViB2YWx1ZSB0byBSR0IuCisgICAgdm9pZCB5dXYycmdiKHVpbnQ4X3QgeVZhbHVlLCB1aW50OF90IHVWYWx1ZSwgdWludDhfdCB2VmFsdWUsCisgICAgICAgIHVpbnQ4X3QgKnIsIHVpbnQ4X3QgKmcsIHVpbnQ4X3QgKmIpIGNvbnN0OworCisgICAgLy8gV3JpdGUgdGhlIGltYWdlIHRvIGEgaHVtYW4gcmVhZGFibGUgUFBNIGZpbGUuCisgICAgLy8gUmV0dXJucyB0cnVlIGlmIHdyaXRlIHdhcyBzdWNjZXNmdWwgYW5kIGZhbHNlIG90aGVyd2lzZS4KKyAgICBib29sIHdyaXRlVG9QUE0oY29uc3QgY2hhciAqZmlsZW5hbWUpIGNvbnN0OworCitwcml2YXRlOgorICAgIC8vIFlVViBGb3JtYXQgb2YgdGhlIGltYWdlLgorICAgIFlVVkZvcm1hdCBtWVVWRm9ybWF0OworCisgICAgaW50MzJfdCBtV2lkdGg7CisgICAgaW50MzJfdCBtSGVpZ2h0OworCisgICAgLy8gUG9pbnRlciB0byB0aGUgbWVtb3J5IGJ1ZmZlci4KKyAgICB1aW50OF90ICptQnVmZmVyOworCisgICAgLy8gQm9vbGVhbiB0ZWxsaW5nIHdoZXRoZXIgd2Ugb3duIHRoZSBtZW1vcnkgYnVmZmVyLgorICAgIGJvb2wgbU93bkJ1ZmZlcjsKKworICAgIC8vIFBvaW50ZXIgdG8gc3RhcnQgb2YgdGhlIFkgZGF0YSBwbGFuZS4KKyAgICB1aW50OF90ICptWWRhdGE7CisKKyAgICAvLyBQb2ludGVyIHRvIHN0YXJ0IG9mIHRoZSBVIGRhdGEgcGxhbmUuIE5vdGUgdGhhdCBpbiBjYXNlIG9mIGludGVybGVhdmVkIGZvcm1hdHMgbGlrZQorICAgIC8vIFlVVjQyMCBzZW1pcGxhbmFyLCBtVWRhdGEgcG9pbnRzIHRvIHRoZSBzdGFydCBvZiB0aGUgVSBkYXRhIGluIHRoZSBVViBwbGFuZS4KKyAgICB1aW50OF90ICptVWRhdGE7CisKKyAgICAvLyBQb2ludGVyIHRvIHN0YXJ0IG9mIHRoZSBWIGRhdGEgcGxhbmUuIE5vdGUgdGhhdCBpbiBjYXNlIG9mIGludGVybGVhdmVkIGZvcm1hdHMgbGlrZQorICAgIC8vIFlVVjQyMCBzZW1pcGxhbmFyLCBtVmRhdGEgcG9pbnRzIHRvIHRoZSBzdGFydCBvZiB0aGUgViBkYXRhIGluIHRoZSBVViBwbGFuZS4KKyAgICB1aW50OF90ICptVmRhdGE7CisKKyAgICAvLyBJbml0aWFsaXplIHRoZSBwb2ludGVycyBtWWRhdGEsIG1VZGF0YSwgbVZkYXRhIHRvIHBvaW50IHRvIHRoZSByaWdodCBsb2NhdGlvbnMgZm9yCisgICAgLy8gdGhlIGdpdmVuIGZvcm1hdCBhbmQgZ2VvbWV0cnkuCisgICAgLy8gUmV0dXJucyB0cnVlIGlmIGluaXRpYWxpemUgd2FzIHN1Y2Nlc2Z1bCBhbmQgZmFsc2Ugb3RoZXJ3aXNlLgorICAgIGJvb2wgaW5pdGlhbGl6ZVlVVlBvaW50ZXJzKCk7CisKKyAgICAvLyBGb3IgdGhlIGdpdmVuIHBpeGVsIGxvY2F0aW9uLCB0aGlzIHJldHVybnMgdGhlIG9mZnNldCBvZiB0aGUgbG9jYXRpb24gb2YgeSwgdSBhbmQgdgorICAgIC8vIGRhdGEgZnJvbSB0aGUgY29ycmVzcG9uZGluZyBiYXNlIHBvaW50ZXJzIC0tIG1ZZGF0YSwgbVVkYXRhLCBtVmRhdGEuCisgICAgLy8gTm90ZSB0aGF0IHRoZSByYW5nZSBvZiB4IGlzIFswLCB3aWR0aC0xXSBhbmQgdGhlIHJhbmdlIG9mIHkgaXMgWzAsIGhlaWdodC0xXS4KKyAgICAvLyBSZXR1cm5zIHRydWUgaWYgZ2V0dGluZyBvZmZzZXRzIHdhcyBzdWNjZXNmdWwgYW5kIGZhbHNlIG90aGVyd2lzZS4KKyAgICBib29sIGdldE9mZnNldHMoaW50MzJfdCB4LCBpbnQzMl90IHksCisgICAgICAgIGludDMyX3QgKnlPZmZzZXQsIGludDMyX3QgKnVPZmZzZXQsIGludDMyX3QgKnZPZmZzZXQpIGNvbnN0OworCisgICAgLy8gUmV0dXJucyB0aGUgb2Zmc2V0IGluY3JlbWVudHMgaW5jdXJyZWQgaW4gZ29pbmcgZnJvbSBvbmUgZGF0YSByb3cgdG8gdGhlIG5leHQgZGF0YSByb3cKKyAgICAvLyBmb3IgdGhlIFlVViBjaGFubmVscy4gTm90ZSB0aGF0IHRoaXMgY29ycmVzcG9uZHMgdG8gZGF0YSByb3dzIGFuZCBub3QgcGl4ZWwgcm93cy4KKyAgICAvLyBFLmcuIGRlcGVuZGluZyBvbiBmb3JtYXRzLCBVL1YgY2hhbm5lbHMgbWF5IGhhdmUgb25seSBvbmUgZGF0YSByb3cgY29ycmVzcG9uZGluZworICAgIC8vIHRvIHR3byBwaXhlbCByb3dzLgorICAgIGJvb2wgZ2V0T2Zmc2V0SW5jcmVtZW50c1BlckRhdGFSb3coCisgICAgICAgIGludDMyX3QgKnlEYXRhT2Zmc2V0SW5jcmVtZW50LAorICAgICAgICBpbnQzMl90ICp1RGF0YU9mZnNldEluY3JlbWVudCwKKyAgICAgICAgaW50MzJfdCAqdkRhdGFPZmZzZXRJbmNyZW1lbnQpIGNvbnN0OworCisgICAgLy8gR2l2ZW4gdGhlIG9mZnNldCByZXR1cm4gdGhlIGFkZHJlc3Mgb2YgdGhlIGNvcnJlc3BvbmRpbmcgY2hhbm5lbCdzIGRhdGEuCisgICAgdWludDhfdCogZ2V0WUFkZHJlc3MoaW50MzJfdCBvZmZzZXQpIGNvbnN0OworICAgIHVpbnQ4X3QqIGdldFVBZGRyZXNzKGludDMyX3Qgb2Zmc2V0KSBjb25zdDsKKyAgICB1aW50OF90KiBnZXRWQWRkcmVzcyhpbnQzMl90IG9mZnNldCkgY29uc3Q7CisKKyAgICAvLyBHaXZlbiB0aGUgcGl4ZWwgbG9jYXRpb24sIHJldHVybnMgdGhlIGFkZHJlc3Mgb2YgdGhlIGNvcnJlc3BvbmRpbmcgY2hhbm5lbCdzIGRhdGEuCisgICAgLy8gTm90ZSB0aGF0IHRoZSByYW5nZSBvZiB4IGlzIFswLCB3aWR0aC0xXSBhbmQgdGhlIHJhbmdlIG9mIHkgaXMgWzAsIGhlaWdodC0xXS4KKyAgICBib29sIGdldFlVVkFkZHJlc3NlcyhpbnQzMl90IHgsIGludDMyX3QgeSwKKyAgICAgICAgdWludDhfdCAqKnlBZGRyLCB1aW50OF90ICoqdUFkZHIsIHVpbnQ4X3QgKip2QWRkcikgY29uc3Q7CisKKyAgICAvLyBEaXNhbGxvdyBpbXBsaWNpdCBjYXN0aW5nIGFuZCBjb3B5aW5nLgorICAgIFlVVkltYWdlKGNvbnN0IFlVVkltYWdlICYpOworICAgIFlVVkltYWdlICZvcGVyYXRvcj0oY29uc3QgWVVWSW1hZ2UgJik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIFlVVl9JTUFHRV9IXwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zdXJmYWNlZmxpbmdlci9TdXJmYWNlLmggYi9pbmNsdWRlL3N1cmZhY2VmbGluZ2VyL1N1cmZhY2UuaAppbmRleCA3YzVhMzliLi5hMjEwODgwIDEwMDY0NAotLS0gYS9pbmNsdWRlL3N1cmZhY2VmbGluZ2VyL1N1cmZhY2UuaAorKysgYi9pbmNsdWRlL3N1cmZhY2VmbGluZ2VyL1N1cmZhY2UuaApAQCAtOTQsNyArOTQsNyBAQAogICAgIGZyaWVuZCBjbGFzcyBTdXJmYWNlQ29tcG9zZXJDbGllbnQ7CiAKICAgICAvLyBjYW1lcmEgYW5kIGNhbWNvcmRlciBuZWVkIGFjY2VzcyB0byB0aGUgSVN1cmZhY2UgYmluZGVyIGludGVyZmFjZSBmb3IgcHJldmlldwotICAgIGZyaWVuZCBjbGFzcyBDYW1lcmE7CisgICAgZnJpZW5kIGNsYXNzIENhbWVyYVNlcnZpY2U7CiAgICAgZnJpZW5kIGNsYXNzIE1lZGlhUmVjb3JkZXI7CiAgICAgLy8gbWVkaWFwbGF5ZXIgbmVlZHMgYWNjZXNzIHRvIElTdXJmYWNlIGZvciBkaXNwbGF5CiAgICAgZnJpZW5kIGNsYXNzIE1lZGlhUGxheWVyOwpAQCAtMTczLDExICsxNzMsMTIgQEAKICAgICAgKiAoZXZlbnR1YWxseSB0aGlzIHNob3VsZCBnbyBhd2F5IGFuZCBiZSByZXBsYWNlZCBieSBwcm9wZXIgQVBJcykKICAgICAgKi8KICAgICAvLyBjYW1lcmEgYW5kIGNhbWNvcmRlciBuZWVkIGFjY2VzcyB0byB0aGUgSVN1cmZhY2UgYmluZGVyIGludGVyZmFjZSBmb3IgcHJldmlldwotICAgIGZyaWVuZCBjbGFzcyBDYW1lcmE7CisgICAgZnJpZW5kIGNsYXNzIENhbWVyYVNlcnZpY2U7CiAgICAgZnJpZW5kIGNsYXNzIE1lZGlhUmVjb3JkZXI7CiAgICAgLy8gTWVkaWFQbGF5ZXIgbmVlZHMgYWNjZXNzIHRvIElTdXJmYWNlIGZvciBkaXNwbGF5CiAgICAgZnJpZW5kIGNsYXNzIE1lZGlhUGxheWVyOwogICAgIGZyaWVuZCBjbGFzcyBJT01YOworICAgIGZyaWVuZCBjbGFzcyBTb2Z0d2FyZVJlbmRlcmVyOwogICAgIC8vIHRoaXMgaXMganVzdCB0byBiZSBhYmxlIHRvIHdyaXRlIHNvbWUgdW5pdCB0ZXN0cwogICAgIGZyaWVuZCBjbGFzcyBUZXN0OwogCkBAIC0zMTIsNCArMzEzLDMgQEAKIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKICNlbmRpZiAvLyBBTkRST0lEX1NGX1NVUkZBQ0VfSAotCmRpZmYgLS1naXQgYS9saWJzL2JpbmRlci9BbmRyb2lkLm1rIGIvbGlicy9iaW5kZXIvQW5kcm9pZC5tawppbmRleCAxM2RjNTAwLi5mOWQ5ZjI1IDEwMDY0NAotLS0gYS9saWJzL2JpbmRlci9BbmRyb2lkLm1rCisrKyBiL2xpYnMvYmluZGVyL0FuZHJvaWQubWsKQEAgLTE2LDYgKzE2LDcgQEAKIHNvdXJjZXMgOj0gXAogICAgIEJpbmRlci5jcHAgXAogICAgIEJwQmluZGVyLmNwcCBcCisgICAgQ3Vyc29yV2luZG93LmNwcCBcCiAgICAgSUludGVyZmFjZS5jcHAgXAogICAgIElNZW1vcnkuY3BwIFwKICAgICBJUENUaHJlYWRTdGF0ZS5jcHAgXApkaWZmIC0tZ2l0IGEvbGlicy9iaW5kZXIvQ3Vyc29yV2luZG93LmNwcCBiL2xpYnMvYmluZGVyL0N1cnNvcldpbmRvdy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjBiMjdjOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvYmluZGVyL0N1cnNvcldpbmRvdy5jcHAKQEAgLTAsMCArMSw0MDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAorICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3VuZGVmIExPR19UQUcKKyNkZWZpbmUgTE9HX1RBRyAiQ3Vyc29yV2luZG93IgorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+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+IHN1cmZhY2UgPSBpbnRlcmZhY2VfY2FzdDxJU3VyZmFjZT4oZGF0YS5yZWFkU3Ryb25nQmluZGVyKCkpOworICAgICAgICAgICAgc3A8U3VyZmFjZT4gc3VyZmFjZSA9IFN1cmZhY2U6OnJlYWRGcm9tUGFyY2VsKGRhdGEpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc2V0UHJldmlld0Rpc3BsYXkoc3VyZmFjZSkpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwpAQCAtMzc2LDQgKzM3NiwzIEBACiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9BbmRyb2lkLm1rIGIvbGlicy9od3VpL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGVkM2Q3YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvaHd1aS9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsNDIgQEAKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKKyMgT25seSBidWlsZCBsaWJod3VpIHdoZW4gVVNFX09QRU5HTF9SRU5ERVJFUiBpcworIyBkZWZpbmVkIGluIHRoZSBjdXJyZW50IGRldmljZS9ib2FyZCBjb25maWd1cmF0aW9uCitpZmVxICgkKFVTRV9PUEVOR0xfUkVOREVSRVIpLHRydWUpCisJTE9DQUxfU1JDX0ZJTEVTOj0gXAorCQlGb250UmVuZGVyZXIuY3BwIFwKKwkJR3JhZGllbnRDYWNoZS5jcHAgXAorCQlMYXllckNhY2hlLmNwcCBcCisJCU1hdHJpeC5jcHAgXAorCQlPcGVuR0xSZW5kZXJlci5jcHAgXAorCQlQYXRjaC5jcHAgXAorCQlQYXRjaENhY2hlLmNwcCBcCisJCVBhdGhDYWNoZS5jcHAgXAorCQlQcm9ncmFtLmNwcCBcCisJCVByb2dyYW1DYWNoZS5jcHAgXAorCQlTa2lhQ29sb3JGaWx0ZXIuY3BwIFwKKwkJU2tpYVNoYWRlci5jcHAgXAorCQlUZXh0dXJlQ2FjaGUuY3BwIFwKKwkJVGV4dERyb3BTaGFkb3dDYWNoZS5jcHAKKwkKKwlMT0NBTF9DX0lOQ0xVREVTICs9IFwKKwkJJChKTklfSF9JTkNMVURFKSBcCisJCSQoTE9DQUxfUEFUSCkvLi4vLi4vaW5jbHVkZS91dGlscyBcCisJCWV4dGVybmFsL3NraWEvaW5jbHVkZS9jb3JlIFwKKwkJZXh0ZXJuYWwvc2tpYS9pbmNsdWRlL2VmZmVjdHMgXAorCQlleHRlcm5hbC9za2lhL2luY2x1ZGUvaW1hZ2VzIFwKKwkJZXh0ZXJuYWwvc2tpYS9zcmMvcG9ydHMgXAorCQlleHRlcm5hbC9za2lhL2luY2x1ZGUvdXRpbHMKKworCUxPQ0FMX0NGTEFHUyArPSAtRFVTRV9PUEVOR0xfUkVOREVSRVIKKwlMT0NBTF9NT0RVTEVfQ0xBU1MgOj0gU0hBUkVEX0xJQlJBUklFUworCUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliY3V0aWxzIGxpYnV0aWxzIGxpYkdMRVN2MiBsaWJza2lhCisJTE9DQUxfTU9EVUxFIDo9IGxpYmh3dWkKKwlMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorCUxPQ0FMX1BSRUxJTktfTU9EVUxFIDo9IGZhbHNlCisJCisJaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQorCisgICAgaW5jbHVkZSAkKGNhbGwgYWxsLW1ha2VmaWxlcy11bmRlciwkKExPQ0FMX1BBVEgpKQorZW5kaWYKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9DYWNoZXMuaCBiL2xpYnMvaHd1aS9DYWNoZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTFlMjlmCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL0NhY2hlcy5oCkBAIC0wLDAgKzEsNzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfVUlfQ0FDSEVTX0gKKyNkZWZpbmUgQU5EUk9JRF9VSV9DQUNIRVNfSAorCisjZGVmaW5lIExPR19UQUcgIk9wZW5HTFJlbmRlcmVyIgorCisjaW5jbHVkZSA8dXRpbHMvU2luZ2xldG9uLmg+CisKKyNpbmNsdWRlICJUZXh0dXJlQ2FjaGUuaCIKKyNpbmNsdWRlICJMYXllckNhY2hlLmgiCisjaW5jbHVkZSAiR3JhZGllbnRDYWNoZS5oIgorI2luY2x1ZGUgIlBhdGNoQ2FjaGUuaCIKKyNpbmNsdWRlICJGb250UmVuZGVyZXIuaCIKKyNpbmNsdWRlICJQcm9ncmFtQ2FjaGUuaCIKKyNpbmNsdWRlICJQYXRoQ2FjaGUuaCIKKyNpbmNsdWRlICJUZXh0RHJvcFNoYWRvd0NhY2hlLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSB1aXJlbmRlcmVyIHsKKworc3RydWN0IENhY2hlTG9nZ2VyIHsKKyAgICBDYWNoZUxvZ2dlcigpIHsKKyAgICAgICAgTE9HRCgiQ3JlYXRpbmcgY2FjaGVzIik7CisgICAgfQorfTsgLy8gc3RydWN0IENhY2hlTG9nZ2VyCisKK2NsYXNzIENhY2hlczogcHVibGljIFNpbmdsZXRvbjxDYWNoZXM+IHsKKyAgICBDYWNoZXMoKTogU2luZ2xldG9uPENhY2hlcz4oKSwgYmxlbmQoZmFsc2UpLCBsYXN0U3JjTW9kZShHTF9aRVJPKSwKKyAgICAgICAgICAgIGxhc3REc3RNb2RlKEdMX1pFUk8pLCBjdXJyZW50UHJvZ3JhbShOVUxMKSB7CisgICAgICAgIGRyb3BTaGFkb3dDYWNoZS5zZXRGb250UmVuZGVyZXIoZm9udFJlbmRlcmVyKTsKKyAgICB9CisKKyAgICBmcmllbmQgY2xhc3MgU2luZ2xldG9uPENhY2hlcz47CisKKyAgICBDYWNoZUxvZ2dlciBsb2dnZXI7CisKK3B1YmxpYzoKKyAgICBib29sIGJsZW5kOworICAgIEdMZW51bSBsYXN0U3JjTW9kZTsKKyAgICBHTGVudW0gbGFzdERzdE1vZGU7CisgICAgUHJvZ3JhbSogY3VycmVudFByb2dyYW07CisKKyAgICBUZXh0dXJlQ2FjaGUgdGV4dHVyZUNhY2hlOworICAgIExheWVyQ2FjaGUgbGF5ZXJDYWNoZTsKKyAgICBHcmFkaWVudENhY2hlIGdyYWRpZW50Q2FjaGU7CisgICAgUHJvZ3JhbUNhY2hlIHByb2dyYW1DYWNoZTsKKyAgICBQYXRoQ2FjaGUgcGF0aENhY2hlOworICAgIFBhdGNoQ2FjaGUgcGF0Y2hDYWNoZTsKKyAgICBUZXh0RHJvcFNoYWRvd0NhY2hlIGRyb3BTaGFkb3dDYWNoZTsKKyAgICBGb250UmVuZGVyZXIgZm9udFJlbmRlcmVyOworfTsgLy8gY2xhc3MgQ2FjaGVzCisKK307IC8vIG5hbWVzcGFjZSB1aXJlbmRlcmVyCisKKyNpZmRlZiBVU0VfT1BFTkdMX1JFTkRFUkVSCit1c2luZyBuYW1lc3BhY2UgdWlyZW5kZXJlcjsKK0FORFJPSURfU0lOR0xFVE9OX1NUQVRJQ19JTlNUQU5DRShDYWNoZXMpOworI2VuZGlmCisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX1VJX0NBQ0hFU19ICmRpZmYgLS1naXQgYS9saWJzL2h3dWkvRXh0ZW5zaW9ucy5oIGIvbGlicy9od3VpL0V4dGVuc2lvbnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Nzc4MjkwCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL0V4dGVuc2lvbnMuaApAQCAtMCwwICsxLDc3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1VJX0VYVEVOU0lPTlNfSAorI2RlZmluZSBBTkRST0lEX1VJX0VYVEVOU0lPTlNfSAorCisjaW5jbHVkZSA8dXRpbHMvU29ydGVkVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorCisjaW5jbHVkZSA8R0xFUzIvZ2wyLmg+CisjaW5jbHVkZSA8R0xFUzIvZ2wyZXh0Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSB1aXJlbmRlcmVyIHsKKworY2xhc3MgRXh0ZW5zaW9ucyB7CitwdWJsaWM6CisgICAgRXh0ZW5zaW9ucygpIHsKKyAgICAgICAgY29uc3QgY2hhciogYnVmZmVyID0gKGNvbnN0IGNoYXIqKSBnbEdldFN0cmluZyhHTF9FWFRFTlNJT05TKTsKKyAgICAgICAgY29uc3QgY2hhciogY3VycmVudCA9IGJ1ZmZlcjsKKyAgICAgICAgY29uc3QgY2hhciogaGVhZCA9IGN1cnJlbnQ7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGhlYWQgPSBzdHJjaHIoY3VycmVudCwgJyAnKTsKKyAgICAgICAgICAgIFN0cmluZzggcyhjdXJyZW50LCBoZWFkID8gaGVhZCAtIGN1cnJlbnQgOiBzdHJsZW4oY3VycmVudCkpOworICAgICAgICAgICAgaWYgKHMubGVuZ3RoKCkpIHsKKyAgICAgICAgICAgICAgICBtRXh0ZW5zaW9uTGlzdC5hZGQocyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjdXJyZW50ID0gaGVhZCArIDE7CisgICAgICAgIH0gd2hpbGUgKGhlYWQpOworCisgICAgICAgIG1IYXNOUG90ID0gaGFzRXh0ZW5zaW9uKCJHTF9PRVNfdGV4dHVyZV9ucG90Iik7CisgICAgICAgIG1IYXNEcmF3UGF0aCA9IGhhc0V4dGVuc2lvbigiR0xfTlZfZHJhd19wYXRoIik7CisgICAgICAgIG1IYXNDb3ZlcmFnZVNhbXBsZSA9IGhhc0V4dGVuc2lvbigiR0xfTlZfY292ZXJhZ2Vfc2FtcGxlIik7CisKKyAgICAgICAgbUV4dGVuc2lvbnMgPSBidWZmZXI7CisgICAgfQorCisgICAgaW5saW5lIGJvb2wgaGFzTlBvdCgpIGNvbnN0IHsgcmV0dXJuIG1IYXNOUG90OyB9CisgICAgaW5saW5lIGJvb2wgaGFzRHJhd1BhdGgoKSBjb25zdCB7IHJldHVybiBtSGFzRHJhd1BhdGg7IH0KKyAgICBpbmxpbmUgYm9vbCBoYXNDb3ZlcmFnZVNhbXBsZSgpIGNvbnN0IHsgcmV0dXJuIG1IYXNDb3ZlcmFnZVNhbXBsZTsgfQorCisgICAgYm9vbCBoYXNFeHRlbnNpb24oY29uc3QgY2hhciogZXh0ZW5zaW9uKSBjb25zdCB7CisgICAgICAgIGNvbnN0IFN0cmluZzggcyhleHRlbnNpb24pOworICAgICAgICByZXR1cm4gbUV4dGVuc2lvbkxpc3QuaW5kZXhPZihzKSA+PSAwOworICAgIH0KKworICAgIHZvaWQgZHVtcCgpIHsKKyAgICAgICAgTE9HRCgiU3VwcG9ydGVkIGV4dGVuc2lvbnM6XG4lcyIsIG1FeHRlbnNpb25zKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgU29ydGVkVmVjdG9yPFN0cmluZzg+IG1FeHRlbnNpb25MaXN0OworCisgICAgY29uc3QgY2hhciogbUV4dGVuc2lvbnM7CisKKyAgICBib29sIG1IYXNOUG90OworICAgIGJvb2wgbUhhc0RyYXdQYXRoOworICAgIGJvb2wgbUhhc0NvdmVyYWdlU2FtcGxlOworfTsgLy8gY2xhc3MgRXh0ZW5zaW9ucworCit9OyAvLyBuYW1lc3BhY2UgdWlyZW5kZXJlcgorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfVUlfRVhURU5TSU9OU19ICmRpZmYgLS1naXQgYS9saWJzL2h3dWkvRm9udFJlbmRlcmVyLmNwcCBiL2xpYnMvaHd1aS9Gb250UmVuZGVyZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjYzkyZWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2h3dWkvRm9udFJlbmRlcmVyLmNwcApAQCAtMCwwICsxLDgxNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiT3BlbkdMUmVuZGVyZXIiCisKKyNpbmNsdWRlIDxTa1V0aWxzLmg+CisKKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiRm9udFJlbmRlcmVyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSB1aXJlbmRlcmVyIHsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gRGVmaW5lcworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisjZGVmaW5lIERFRkFVTFRfVEVYVF9DQUNIRV9XSURUSCAxMDI0CisjZGVmaW5lIERFRkFVTFRfVEVYVF9DQUNIRV9IRUlHSFQgMjU2CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEZvbnQKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworRm9udDo6Rm9udChGb250UmVuZGVyZXIqIHN0YXRlLCB1aW50MzJfdCBmb250SWQsIGZsb2F0IGZvbnRTaXplKSA6CisgICAgbVN0YXRlKHN0YXRlKSwgbUZvbnRJZChmb250SWQpLCBtRm9udFNpemUoZm9udFNpemUpIHsKK30KKworCitGb250Ojp+Rm9udCgpIHsKKyAgICBmb3IgKHVpbnQzMl90IGN0ID0gMDsgY3QgPCBtU3RhdGUtPm1BY3RpdmVGb250cy5zaXplKCk7IGN0KyspIHsKKyAgICAgICAgaWYgKG1TdGF0ZS0+bUFjdGl2ZUZvbnRzW2N0XSA9PSB0aGlzKSB7CisgICAgICAgICAgICBtU3RhdGUtPm1BY3RpdmVGb250cy5yZW1vdmVBdChjdCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBtQ2FjaGVkR2x5cGhzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIENhY2hlZEdseXBoSW5mbyogZ2x5cGggPSBtQ2FjaGVkR2x5cGhzLnZhbHVlQXQoaSk7CisgICAgICAgIGRlbGV0ZSBnbHlwaDsKKyAgICB9Cit9CisKK3ZvaWQgRm9udDo6aW52YWxpZGF0ZVRleHR1cmVDYWNoZSgpIHsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbUNhY2hlZEdseXBocy5zaXplKCk7IGkrKykgeworICAgICAgICBtQ2FjaGVkR2x5cGhzLnZhbHVlQXQoaSktPm1Jc1ZhbGlkID0gZmFsc2U7CisgICAgfQorfQorCit2b2lkIEZvbnQ6Om1lYXN1cmVDYWNoZWRHbHlwaChDYWNoZWRHbHlwaEluZm8gKmdseXBoLCBpbnQgeCwgaW50IHksIFJlY3QgKmJvdW5kcykgeworICAgIGludCBuUGVuWCA9IHggKyBnbHlwaC0+bUJpdG1hcExlZnQ7CisgICAgaW50IG5QZW5ZID0geSArIGdseXBoLT5tQml0bWFwVG9wOworCisgICAgaW50IHdpZHRoID0gKGludCkgZ2x5cGgtPm1CaXRtYXBXaWR0aDsKKyAgICBpbnQgaGVpZ2h0ID0gKGludCkgZ2x5cGgtPm1CaXRtYXBIZWlnaHQ7CisKKyAgICBpZiAoYm91bmRzLT5ib3R0b20gPiBuUGVuWSkgeworICAgICAgICBib3VuZHMtPmJvdHRvbSA9IG5QZW5ZOworICAgIH0KKyAgICBpZiAoYm91bmRzLT5sZWZ0ID4gblBlblgpIHsKKyAgICAgICAgYm91bmRzLT5sZWZ0ID0gblBlblg7CisgICAgfQorICAgIGlmIChib3VuZHMtPnJpZ2h0IDwgblBlblggKyB3aWR0aCkgeworICAgICAgICBib3VuZHMtPnJpZ2h0ID0gblBlblggKyB3aWR0aDsKKyAgICB9CisgICAgaWYgKGJvdW5kcy0+dG9wIDwgblBlblkgKyBoZWlnaHQpIHsKKyAgICAgICAgYm91bmRzLT50b3AgPSBuUGVuWSArIGhlaWdodDsKKyAgICB9Cit9CisKK3ZvaWQgRm9udDo6ZHJhd0NhY2hlZEdseXBoKENhY2hlZEdseXBoSW5mbyogZ2x5cGgsIGludCB4LCBpbnQgeSkgeworICAgIGludCBuUGVuWCA9IHggKyBnbHlwaC0+bUJpdG1hcExlZnQ7CisgICAgaW50IG5QZW5ZID0geSArIGdseXBoLT5tQml0bWFwVG9wICsgZ2x5cGgtPm1CaXRtYXBIZWlnaHQ7CisKKyAgICBmbG9hdCB1MSA9IGdseXBoLT5tQml0bWFwTWluVTsKKyAgICBmbG9hdCB1MiA9IGdseXBoLT5tQml0bWFwTWF4VTsKKyAgICBmbG9hdCB2MSA9IGdseXBoLT5tQml0bWFwTWluVjsKKyAgICBmbG9hdCB2MiA9IGdseXBoLT5tQml0bWFwTWF4VjsKKworICAgIGludCB3aWR0aCA9IChpbnQpIGdseXBoLT5tQml0bWFwV2lkdGg7CisgICAgaW50IGhlaWdodCA9IChpbnQpIGdseXBoLT5tQml0bWFwSGVpZ2h0OworCisgICAgbVN0YXRlLT5hcHBlbmRNZXNoUXVhZChuUGVuWCwgblBlblksIDAsIHUxLCB2MiwKKyAgICAgICAgICAgIG5QZW5YICsgd2lkdGgsIG5QZW5ZLCAwLCB1MiwgdjIsCisgICAgICAgICAgICBuUGVuWCArIHdpZHRoLCBuUGVuWSAtIGhlaWdodCwgMCwgdTIsIHYxLAorICAgICAgICAgICAgblBlblgsIG5QZW5ZIC0gaGVpZ2h0LCAwLCB1MSwgdjEpOworfQorCit2b2lkIEZvbnQ6OmRyYXdDYWNoZWRHbHlwaChDYWNoZWRHbHlwaEluZm8gKmdseXBoLCBpbnQgeCwgaW50IHksCisgICAgICAgIHVpbnQ4X3QgKmJpdG1hcCwgdWludDMyX3QgYml0bWFwVywgdWludDMyX3QgYml0bWFwSCkgeworICAgIGludCBuUGVuWCA9IHggKyBnbHlwaC0+bUJpdG1hcExlZnQ7CisgICAgaW50IG5QZW5ZID0geSArIGdseXBoLT5tQml0bWFwVG9wOworCisgICAgdWludDMyX3QgZW5kWCA9IGdseXBoLT5tU3RhcnRYICsgZ2x5cGgtPm1CaXRtYXBXaWR0aDsKKyAgICB1aW50MzJfdCBlbmRZID0gZ2x5cGgtPm1TdGFydFkgKyBnbHlwaC0+bUJpdG1hcEhlaWdodDsKKworICAgIHVpbnQzMl90IGNhY2hlV2lkdGggPSBtU3RhdGUtPmdldENhY2hlV2lkdGgoKTsKKyAgICBjb25zdCB1aW50OF90KiBjYWNoZUJ1ZmZlciA9IG1TdGF0ZS0+Z2V0VGV4dFRleHR1cmVEYXRhKCk7CisKKyAgICB1aW50MzJfdCBjYWNoZVggPSAwLCBjYWNoZVkgPSAwOworICAgIGludDMyX3QgYlggPSAwLCBiWSA9IDA7CisgICAgZm9yIChjYWNoZVggPSBnbHlwaC0+bVN0YXJ0WCwgYlggPSBuUGVuWDsgY2FjaGVYIDwgZW5kWDsgY2FjaGVYKyssIGJYKyspIHsKKyAgICAgICAgZm9yIChjYWNoZVkgPSBnbHlwaC0+bVN0YXJ0WSwgYlkgPSBuUGVuWTsgY2FjaGVZIDwgZW5kWTsgY2FjaGVZKyssIGJZKyspIHsKKyAgICAgICAgICAgIGlmIChiWCA8IDAgfHwgYlkgPCAwIHx8IGJYID49IChpbnQzMl90KWJpdG1hcFcgfHwgYlkgPj0gKGludDMyX3QpYml0bWFwSCkgeworICAgICAgICAgICAgICAgIExPR0UoIlNraXBwaW5nIGludmFsaWQgaW5kZXgiKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHVpbnQ4X3QgdGVtcENvbCA9IGNhY2hlQnVmZmVyW2NhY2hlWSAqIGNhY2hlV2lkdGggKyBjYWNoZVhdOworICAgICAgICAgICAgYml0bWFwW2JZICogYml0bWFwVyArIGJYXSA9IHRlbXBDb2w7CisgICAgICAgIH0KKyAgICB9CisKK30KKworRm9udDo6Q2FjaGVkR2x5cGhJbmZvKiBGb250OjpnZXRDYWNoZWRVVEZDaGFyKFNrUGFpbnQqIHBhaW50LCBpbnQzMl90IHV0ZkNoYXIpIHsKKyAgICBDYWNoZWRHbHlwaEluZm8qIGNhY2hlZEdseXBoID0gTlVMTDsKKyAgICBzc2l6ZV90IGluZGV4ID0gbUNhY2hlZEdseXBocy5pbmRleE9mS2V5KHV0ZkNoYXIpOworICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgIGNhY2hlZEdseXBoID0gbUNhY2hlZEdseXBocy52YWx1ZUF0KGluZGV4KTsKKyAgICB9IGVsc2UgeworICAgICAgICBjYWNoZWRHbHlwaCA9IGNhY2hlR2x5cGgocGFpbnQsIHV0ZkNoYXIpOworICAgIH0KKworICAgIC8vIElzIHRoZSBnbHlwaCBzdGlsbCBpbiB0ZXh0dXJlIGNhY2hlPworICAgIGlmICghY2FjaGVkR2x5cGgtPm1Jc1ZhbGlkKSB7CisgICAgICAgIGNvbnN0IFNrR2x5cGgmIHNraWFHbHlwaCA9IHBhaW50LT5nZXRVbmljaGFyTWV0cmljcyh1dGZDaGFyKTsKKyAgICAgICAgdXBkYXRlR2x5cGhDYWNoZShwYWludCwgc2tpYUdseXBoLCBjYWNoZWRHbHlwaCk7CisgICAgfQorCisgICAgcmV0dXJuIGNhY2hlZEdseXBoOworfQorCit2b2lkIEZvbnQ6OnJlbmRlclVURihTa1BhaW50KiBwYWludCwgY29uc3QgY2hhciogdGV4dCwgdWludDMyX3Qgc3RhcnQsIHVpbnQzMl90IGxlbiwKKyAgICAgICAgaW50IG51bUdseXBocywgaW50IHgsIGludCB5LCB1aW50OF90ICpiaXRtYXAsIHVpbnQzMl90IGJpdG1hcFcsIHVpbnQzMl90IGJpdG1hcEgpIHsKKyAgICBpZiAoYml0bWFwICE9IE5VTEwgJiYgYml0bWFwVyA+IDAgJiYgYml0bWFwSCA+IDApIHsKKyAgICAgICAgcmVuZGVyVVRGKHBhaW50LCB0ZXh0LCBzdGFydCwgbGVuLCBudW1HbHlwaHMsIHgsIHksIEJJVE1BUCwgYml0bWFwLAorICAgICAgICAgICAgICAgIGJpdG1hcFcsIGJpdG1hcEgsIE5VTEwpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJlbmRlclVURihwYWludCwgdGV4dCwgc3RhcnQsIGxlbiwgbnVtR2x5cGhzLCB4LCB5LCBGUkFNRUJVRkZFUiwgTlVMTCwgMCwgMCwgTlVMTCk7CisgICAgfQorCit9CisKK3ZvaWQgRm9udDo6bWVhc3VyZVVURihTa1BhaW50KiBwYWludCwgY29uc3QgY2hhciogdGV4dCwgdWludDMyX3Qgc3RhcnQsIHVpbnQzMl90IGxlbiwKKyAgICAgICAgaW50IG51bUdseXBocywgUmVjdCAqYm91bmRzKSB7CisgICAgaWYgKGJvdW5kcyA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIk5vIHJldHVybiByZWN0YW5nbGUgcHJvdmlkZWQgdG8gbWVhc3VyZSB0ZXh0Iik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgYm91bmRzLT5zZXQoMWU2LCAtMWU2LCAtMWU2LCAxZTYpOworICAgIHJlbmRlclVURihwYWludCwgdGV4dCwgc3RhcnQsIGxlbiwgbnVtR2x5cGhzLCAwLCAwLCBNRUFTVVJFLCBOVUxMLCAwLCAwLCBib3VuZHMpOworfQorCit2b2lkIEZvbnQ6OnJlbmRlclVURihTa1BhaW50KiBwYWludCwgY29uc3QgY2hhciogdGV4dCwgdWludDMyX3Qgc3RhcnQsIHVpbnQzMl90IGxlbiwKKyAgICAgICAgaW50IG51bUdseXBocywgaW50IHgsIGludCB5LCBSZW5kZXJNb2RlIG1vZGUsIHVpbnQ4X3QgKmJpdG1hcCwKKyAgICAgICAgdWludDMyX3QgYml0bWFwVywgdWludDMyX3QgYml0bWFwSCxSZWN0ICpib3VuZHMpIHsKKyAgICBpZiAobnVtR2x5cGhzID09IDAgfHwgdGV4dCA9PSBOVUxMIHx8IGxlbiA9PSAwKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpbnQgcGVuWCA9IHgsIHBlblkgPSB5OworICAgIGludCBnbHlwaHNMZWZ0ID0gMTsKKyAgICBpZiAobnVtR2x5cGhzID4gMCkgeworICAgICAgICBnbHlwaHNMZWZ0ID0gbnVtR2x5cGhzOworICAgIH0KKworICAgIHRleHQgKz0gc3RhcnQ7CisKKyAgICB3aGlsZSAoZ2x5cGhzTGVmdCA+IDApIHsKKyAgICAgICAgaW50MzJfdCB1dGZDaGFyID0gU2tVVEYxNl9OZXh0VW5pY2hhcigoY29uc3QgdWludDE2X3QqKikgJnRleHQpOworCisgICAgICAgIC8vIFJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgc3RyaW5nCisgICAgICAgIGlmICh1dGZDaGFyIDwgMCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBDYWNoZWRHbHlwaEluZm8qIGNhY2hlZEdseXBoID0gZ2V0Q2FjaGVkVVRGQ2hhcihwYWludCwgdXRmQ2hhcik7CisKKyAgICAgICAgLy8gSWYgaXQncyBzdGlsbCBub3QgdmFsaWQsIHdlIGNvdWxkbid0IGNhY2hlIGl0LCBzbyB3ZSBzaG91bGRuJ3QgZHJhdyBnYXJiYWdlCisgICAgICAgIGlmIChjYWNoZWRHbHlwaC0+bUlzVmFsaWQpIHsKKyAgICAgICAgICAgIHN3aXRjaChtb2RlKSB7CisgICAgICAgICAgICBjYXNlIEZSQU1FQlVGRkVSOgorICAgICAgICAgICAgICAgIGRyYXdDYWNoZWRHbHlwaChjYWNoZWRHbHlwaCwgcGVuWCwgcGVuWSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJJVE1BUDoKKyAgICAgICAgICAgICAgICBkcmF3Q2FjaGVkR2x5cGgoY2FjaGVkR2x5cGgsIHBlblgsIHBlblksIGJpdG1hcCwgYml0bWFwVywgYml0bWFwSCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE1FQVNVUkU6CisgICAgICAgICAgICAgICAgbWVhc3VyZUNhY2hlZEdseXBoKGNhY2hlZEdseXBoLCBwZW5YLCBwZW5ZLCBib3VuZHMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcGVuWCArPSBTa0ZpeGVkRmxvb3IoY2FjaGVkR2x5cGgtPm1BZHZhbmNlWCk7CisKKyAgICAgICAgLy8gSWYgd2Ugd2VyZSBnaXZlbiBhIHNwZWNpZmljIG51bWJlciBvZiBnbHlwaHMsIGRlY3JlbWVudAorICAgICAgICBpZiAobnVtR2x5cGhzID4gMCkgeworICAgICAgICAgICAgZ2x5cGhzTGVmdC0tOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIEZvbnQ6OnVwZGF0ZUdseXBoQ2FjaGUoU2tQYWludCogcGFpbnQsIGNvbnN0IFNrR2x5cGgmIHNraWFHbHlwaCwgQ2FjaGVkR2x5cGhJbmZvKiBnbHlwaCkgeworICAgIGdseXBoLT5tQWR2YW5jZVggPSBza2lhR2x5cGguZkFkdmFuY2VYOworICAgIGdseXBoLT5tQWR2YW5jZVkgPSBza2lhR2x5cGguZkFkdmFuY2VZOworICAgIGdseXBoLT5tQml0bWFwTGVmdCA9IHNraWFHbHlwaC5mTGVmdDsKKyAgICBnbHlwaC0+bUJpdG1hcFRvcCA9IHNraWFHbHlwaC5mVG9wOworCisgICAgdWludDMyX3Qgc3RhcnRYID0gMDsKKyAgICB1aW50MzJfdCBzdGFydFkgPSAwOworCisgICAgLy8gR2V0IHRoZSBiaXRtYXAgZm9yIHRoZSBnbHlwaAorICAgIHBhaW50LT5maW5kSW1hZ2Uoc2tpYUdseXBoKTsKKyAgICBnbHlwaC0+bUlzVmFsaWQgPSBtU3RhdGUtPmNhY2hlQml0bWFwKHNraWFHbHlwaCwgJnN0YXJ0WCwgJnN0YXJ0WSk7CisKKyAgICBpZiAoIWdseXBoLT5tSXNWYWxpZCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgdWludDMyX3QgZW5kWCA9IHN0YXJ0WCArIHNraWFHbHlwaC5mV2lkdGg7CisgICAgdWludDMyX3QgZW5kWSA9IHN0YXJ0WSArIHNraWFHbHlwaC5mSGVpZ2h0OworCisgICAgZ2x5cGgtPm1TdGFydFggPSBzdGFydFg7CisgICAgZ2x5cGgtPm1TdGFydFkgPSBzdGFydFk7CisgICAgZ2x5cGgtPm1CaXRtYXBXaWR0aCA9IHNraWFHbHlwaC5mV2lkdGg7CisgICAgZ2x5cGgtPm1CaXRtYXBIZWlnaHQgPSBza2lhR2x5cGguZkhlaWdodDsKKworICAgIHVpbnQzMl90IGNhY2hlV2lkdGggPSBtU3RhdGUtPmdldENhY2hlV2lkdGgoKTsKKyAgICB1aW50MzJfdCBjYWNoZUhlaWdodCA9IG1TdGF0ZS0+Z2V0Q2FjaGVIZWlnaHQoKTsKKworICAgIGdseXBoLT5tQml0bWFwTWluVSA9IChmbG9hdCkgc3RhcnRYIC8gKGZsb2F0KSBjYWNoZVdpZHRoOworICAgIGdseXBoLT5tQml0bWFwTWluViA9IChmbG9hdCkgc3RhcnRZIC8gKGZsb2F0KSBjYWNoZUhlaWdodDsKKyAgICBnbHlwaC0+bUJpdG1hcE1heFUgPSAoZmxvYXQpIGVuZFggLyAoZmxvYXQpIGNhY2hlV2lkdGg7CisgICAgZ2x5cGgtPm1CaXRtYXBNYXhWID0gKGZsb2F0KSBlbmRZIC8gKGZsb2F0KSBjYWNoZUhlaWdodDsKKworICAgIG1TdGF0ZS0+bVVwbG9hZFRleHR1cmUgPSB0cnVlOworfQorCitGb250OjpDYWNoZWRHbHlwaEluZm8qIEZvbnQ6OmNhY2hlR2x5cGgoU2tQYWludCogcGFpbnQsIGludDMyX3QgZ2x5cGgpIHsKKyAgICBDYWNoZWRHbHlwaEluZm8qIG5ld0dseXBoID0gbmV3IENhY2hlZEdseXBoSW5mbygpOworICAgIG1DYWNoZWRHbHlwaHMuYWRkKGdseXBoLCBuZXdHbHlwaCk7CisKKyAgICBjb25zdCBTa0dseXBoJiBza2lhR2x5cGggPSBwYWludC0+Z2V0VW5pY2hhck1ldHJpY3MoZ2x5cGgpOworICAgIG5ld0dseXBoLT5tR2x5cGhJbmRleCA9IHNraWFHbHlwaC5mSUQ7CisgICAgbmV3R2x5cGgtPm1Jc1ZhbGlkID0gZmFsc2U7CisKKyAgICB1cGRhdGVHbHlwaENhY2hlKHBhaW50LCBza2lhR2x5cGgsIG5ld0dseXBoKTsKKworICAgIHJldHVybiBuZXdHbHlwaDsKK30KKworRm9udCogRm9udDo6Y3JlYXRlKEZvbnRSZW5kZXJlciogc3RhdGUsIHVpbnQzMl90IGZvbnRJZCwgZmxvYXQgZm9udFNpemUpIHsKKyAgICBWZWN0b3I8Rm9udCo+ICZhY3RpdmVGb250cyA9IHN0YXRlLT5tQWN0aXZlRm9udHM7CisKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgYWN0aXZlRm9udHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgRm9udCogZm9udCA9IGFjdGl2ZUZvbnRzW2ldOworICAgICAgICBpZiAoZm9udC0+bUZvbnRJZCA9PSBmb250SWQgJiYgZm9udC0+bUZvbnRTaXplID09IGZvbnRTaXplKSB7CisgICAgICAgICAgICByZXR1cm4gZm9udDsKKyAgICAgICAgfQorICAgIH0KKworICAgIEZvbnQqIG5ld0ZvbnQgPSBuZXcgRm9udChzdGF0ZSwgZm9udElkLCBmb250U2l6ZSk7CisgICAgYWN0aXZlRm9udHMucHVzaChuZXdGb250KTsKKyAgICByZXR1cm4gbmV3Rm9udDsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gRm9udFJlbmRlcmVyCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK0ZvbnRSZW5kZXJlcjo6Rm9udFJlbmRlcmVyKCkgeworICAgIExPR0QoIkNyZWF0aW5nIEZvbnRSZW5kZXJlciIpOworCisgICAgbUluaXRpYWxpemVkID0gZmFsc2U7CisgICAgbU1heE51bWJlck9mUXVhZHMgPSAxMDI0OworICAgIG1DdXJyZW50UXVhZEluZGV4ID0gMDsKKyAgICBtVGV4dHVyZUlkID0gMDsKKworICAgIG1UZXh0TWVzaFB0ciA9IE5VTEw7CisgICAgbVRleHRUZXh0dXJlID0gTlVMTDsKKworICAgIG1JbmRleEJ1ZmZlcklEID0gMDsKKworICAgIG1DYWNoZVdpZHRoID0gREVGQVVMVF9URVhUX0NBQ0hFX1dJRFRIOworICAgIG1DYWNoZUhlaWdodCA9IERFRkFVTFRfVEVYVF9DQUNIRV9IRUlHSFQ7CisKKyAgICBjaGFyIHByb3BlcnR5W1BST1BFUlRZX1ZBTFVFX01BWF07CisgICAgaWYgKHByb3BlcnR5X2dldChQUk9QRVJUWV9URVhUX0NBQ0hFX1dJRFRILCBwcm9wZXJ0eSwgTlVMTCkgPiAwKSB7CisgICAgICAgIExPR0QoIiAgU2V0dGluZyB0ZXh0IGNhY2hlIHdpZHRoIHRvICVzIHBpeGVscyIsIHByb3BlcnR5KTsKKyAgICAgICAgbUNhY2hlV2lkdGggPSBhdG9pKHByb3BlcnR5KTsKKyAgICB9IGVsc2UgeworICAgICAgICBMT0dEKCIgIFVzaW5nIGRlZmF1bHQgdGV4dCBjYWNoZSB3aWR0aCBvZiAlaSBwaXhlbHMiLCBtQ2FjaGVXaWR0aCk7CisgICAgfQorCisgICAgaWYgKHByb3BlcnR5X2dldChQUk9QRVJUWV9URVhUX0NBQ0hFX0hFSUdIVCwgcHJvcGVydHksIE5VTEwpID4gMCkgeworICAgICAgICBMT0dEKCIgIFNldHRpbmcgdGV4dCBjYWNoZSB3aWR0aCB0byAlcyBwaXhlbHMiLCBwcm9wZXJ0eSk7CisgICAgICAgIG1DYWNoZUhlaWdodCA9IGF0b2kocHJvcGVydHkpOworICAgIH0gZWxzZSB7CisgICAgICAgIExPR0QoIiAgVXNpbmcgZGVmYXVsdCB0ZXh0IGNhY2hlIGhlaWdodCBvZiAlaSBwaXhlbHMiLCBtQ2FjaGVIZWlnaHQpOworICAgIH0KK30KKworRm9udFJlbmRlcmVyOjp+Rm9udFJlbmRlcmVyKCkgeworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBtQ2FjaGVMaW5lcy5zaXplKCk7IGkrKykgeworICAgICAgICBkZWxldGUgbUNhY2hlTGluZXNbaV07CisgICAgfQorICAgIG1DYWNoZUxpbmVzLmNsZWFyKCk7CisKKyAgICBpZiAobUluaXRpYWxpemVkKSB7CisgICAgICAgIGRlbGV0ZVtdIG1UZXh0TWVzaFB0cjsKKyAgICAgICAgZGVsZXRlW10gbVRleHRUZXh0dXJlOworICAgIH0KKworICAgIGlmIChtVGV4dHVyZUlkKSB7CisgICAgICAgIGdsRGVsZXRlVGV4dHVyZXMoMSwgJm1UZXh0dXJlSWQpOworICAgIH0KKworICAgIFZlY3RvcjxGb250Kj4gZm9udHNUb0RlcmVmZXJlbmNlID0gbUFjdGl2ZUZvbnRzOworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBmb250c1RvRGVyZWZlcmVuY2Uuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgZGVsZXRlIGZvbnRzVG9EZXJlZmVyZW5jZVtpXTsKKyAgICB9Cit9CisKK3ZvaWQgRm9udFJlbmRlcmVyOjpmbHVzaEFsbEFuZEludmFsaWRhdGUoKSB7CisgICAgaWYgKG1DdXJyZW50UXVhZEluZGV4ICE9IDApIHsKKyAgICAgICAgaXNzdWVEcmF3Q29tbWFuZCgpOworICAgICAgICBtQ3VycmVudFF1YWRJbmRleCA9IDA7CisgICAgfQorICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBtQWN0aXZlRm9udHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgbUFjdGl2ZUZvbnRzW2ldLT5pbnZhbGlkYXRlVGV4dHVyZUNhY2hlKCk7CisgICAgfQorICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBtQ2FjaGVMaW5lcy5zaXplKCk7IGkrKykgeworICAgICAgICBtQ2FjaGVMaW5lc1tpXS0+bUN1cnJlbnRDb2wgPSAwOworICAgIH0KK30KKworYm9vbCBGb250UmVuZGVyZXI6OmNhY2hlQml0bWFwKGNvbnN0IFNrR2x5cGgmIGdseXBoLCB1aW50MzJfdCogcmV0T3JpZ2luWCwgdWludDMyX3QqIHJldE9yaWdpblkpIHsKKyAgICAvLyBJZiB0aGUgZ2x5cGggaXMgdG9vIHRhbGwsIGRvbid0IGNhY2hlIGl0CisgICAgaWYgKGdseXBoLmZXaWR0aCA+IG1DYWNoZUxpbmVzW21DYWNoZUxpbmVzLnNpemUoKSAtIDFdLT5tTWF4SGVpZ2h0KSB7CisgICAgICAgIExPR0UoIkZvbnQgc2l6ZSB0byBsYXJnZSB0byBmaXQgaW4gY2FjaGUuIHdpZHRoLCBoZWlnaHQgPSAlaSwgJWkiLAorICAgICAgICAgICAgICAgIChpbnQpIGdseXBoLmZXaWR0aCwgKGludCkgZ2x5cGguZkhlaWdodCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBOb3cgY29weSB0aGUgYml0bWFwIGludG8gdGhlIGNhY2hlIHRleHR1cmUKKyAgICB1aW50MzJfdCBzdGFydFggPSAwOworICAgIHVpbnQzMl90IHN0YXJ0WSA9IDA7CisKKyAgICBib29sIGJpdG1hcEZpdCA9IGZhbHNlOworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBtQ2FjaGVMaW5lcy5zaXplKCk7IGkrKykgeworICAgICAgICBiaXRtYXBGaXQgPSBtQ2FjaGVMaW5lc1tpXS0+Zml0Qml0bWFwKGdseXBoLCAmc3RhcnRYLCAmc3RhcnRZKTsKKyAgICAgICAgaWYgKGJpdG1hcEZpdCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBJZiB0aGUgbmV3IGdseXBoIGRpZG4ndCBmaXQsIGZsdXNoIHRoZSBzdGF0ZSBzbyBmYXIgYW5kIGludmFsaWRhdGUgZXZlcnl0aGluZworICAgIGlmICghYml0bWFwRml0KSB7CisgICAgICAgIGZsdXNoQWxsQW5kSW52YWxpZGF0ZSgpOworCisgICAgICAgIC8vIFRyeSB0byBmaXQgaXQgYWdhaW4KKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG1DYWNoZUxpbmVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBiaXRtYXBGaXQgPSBtQ2FjaGVMaW5lc1tpXS0+Zml0Qml0bWFwKGdseXBoLCAmc3RhcnRYLCAmc3RhcnRZKTsKKyAgICAgICAgICAgIGlmIChiaXRtYXBGaXQpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIGlmIHdlIHN0aWxsIGRvbid0IGZpdCwgc29tZXRoaW5nIGlzIHdyb25nIGFuZCB3ZSBzaG91bGRuJ3QgZHJhdworICAgICAgICBpZiAoIWJpdG1hcEZpdCkgeworICAgICAgICAgICAgTE9HRSgiQml0bWFwIGRvZXNuJ3QgZml0IGluIGNhY2hlLiB3aWR0aCwgaGVpZ2h0ID0gJWksICVpIiwKKyAgICAgICAgICAgICAgICAgICAgKGludCkgZ2x5cGguZldpZHRoLCAoaW50KSBnbHlwaC5mSGVpZ2h0KTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgICpyZXRPcmlnaW5YID0gc3RhcnRYOworICAgICpyZXRPcmlnaW5ZID0gc3RhcnRZOworCisgICAgdWludDMyX3QgZW5kWCA9IHN0YXJ0WCArIGdseXBoLmZXaWR0aDsKKyAgICB1aW50MzJfdCBlbmRZID0gc3RhcnRZICsgZ2x5cGguZkhlaWdodDsKKworICAgIHVpbnQzMl90IGNhY2hlV2lkdGggPSBtQ2FjaGVXaWR0aDsKKworICAgIHVpbnQ4X3QqIGNhY2hlQnVmZmVyID0gbVRleHRUZXh0dXJlOworICAgIHVpbnQ4X3QqIGJpdG1hcEJ1ZmZlciA9ICh1aW50OF90KikgZ2x5cGguZkltYWdlOworICAgIHVuc2lnbmVkIGludCBzdHJpZGUgPSBnbHlwaC5yb3dCeXRlcygpOworCisgICAgdWludDMyX3QgY2FjaGVYID0gMCwgYlggPSAwLCBjYWNoZVkgPSAwLCBiWSA9IDA7CisgICAgZm9yIChjYWNoZVggPSBzdGFydFgsIGJYID0gMDsgY2FjaGVYIDwgZW5kWDsgY2FjaGVYKyssIGJYKyspIHsKKyAgICAgICAgZm9yIChjYWNoZVkgPSBzdGFydFksIGJZID0gMDsgY2FjaGVZIDwgZW5kWTsgY2FjaGVZKyssIGJZKyspIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgdGVtcENvbCA9IGJpdG1hcEJ1ZmZlcltiWSAqIHN0cmlkZSArIGJYXTsKKyAgICAgICAgICAgIGNhY2hlQnVmZmVyW2NhY2hlWSAqIGNhY2hlV2lkdGggKyBjYWNoZVhdID0gdGVtcENvbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIEZvbnRSZW5kZXJlcjo6aW5pdFRleHRUZXh0dXJlKCkgeworICAgIG1UZXh0VGV4dHVyZSA9IG5ldyB1aW50OF90W21DYWNoZVdpZHRoICogbUNhY2hlSGVpZ2h0XTsKKyAgICBtVXBsb2FkVGV4dHVyZSA9IGZhbHNlOworCisgICAgZ2xHZW5UZXh0dXJlcygxLCAmbVRleHR1cmVJZCk7CisgICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCBtVGV4dHVyZUlkKTsKKyAgICBnbFBpeGVsU3RvcmVpKEdMX1VOUEFDS19BTElHTk1FTlQsIDEpOworICAgIC8vIEluaXRpYWxpemUgdGV4dHVyZSBkaW1lbnRpb25zCisgICAgZ2xUZXhJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIEdMX0FMUEhBLCBtQ2FjaGVXaWR0aCwgbUNhY2hlSGVpZ2h0LCAwLAorICAgICAgICAgICAgR0xfQUxQSEEsIEdMX1VOU0lHTkVEX0JZVEUsIDApOworCisgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUlOX0ZJTFRFUiwgR0xfTkVBUkVTVCk7CisgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUFHX0ZJTFRFUiwgR0xfTkVBUkVTVCk7CisKKyAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9XUkFQX1MsIEdMX0NMQU1QX1RPX0VER0UpOworICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX1dSQVBfVCwgR0xfQ0xBTVBfVE9fRURHRSk7CisKKyAgICAvLyBTcGxpdCB1cCBvdXIgY2FjaGUgdGV4dHVyZSBpbnRvIGxpbmVzIG9mIGNlcnRhaW4gd2lkdGhzCisgICAgaW50IG5leHRMaW5lID0gMDsKKyAgICBtQ2FjaGVMaW5lcy5wdXNoKG5ldyBDYWNoZVRleHR1cmVMaW5lKG1DYWNoZVdpZHRoLCAxNiwgbmV4dExpbmUsIDApKTsKKyAgICBuZXh0TGluZSArPSBtQ2FjaGVMaW5lcy50b3AoKS0+bU1heEhlaWdodDsKKyAgICBtQ2FjaGVMaW5lcy5wdXNoKG5ldyBDYWNoZVRleHR1cmVMaW5lKG1DYWNoZVdpZHRoLCAyNCwgbmV4dExpbmUsIDApKTsKKyAgICBuZXh0TGluZSArPSBtQ2FjaGVMaW5lcy50b3AoKS0+bU1heEhlaWdodDsKKyAgICBtQ2FjaGVMaW5lcy5wdXNoKG5ldyBDYWNoZVRleHR1cmVMaW5lKG1DYWNoZVdpZHRoLCAyNCwgbmV4dExpbmUsIDApKTsKKyAgICBuZXh0TGluZSArPSBtQ2FjaGVMaW5lcy50b3AoKS0+bU1heEhlaWdodDsKKyAgICBtQ2FjaGVMaW5lcy5wdXNoKG5ldyBDYWNoZVRleHR1cmVMaW5lKG1DYWNoZVdpZHRoLCAzMiwgbmV4dExpbmUsIDApKTsKKyAgICBuZXh0TGluZSArPSBtQ2FjaGVMaW5lcy50b3AoKS0+bU1heEhlaWdodDsKKyAgICBtQ2FjaGVMaW5lcy5wdXNoKG5ldyBDYWNoZVRleHR1cmVMaW5lKG1DYWNoZVdpZHRoLCAzMiwgbmV4dExpbmUsIDApKTsKKyAgICBuZXh0TGluZSArPSBtQ2FjaGVMaW5lcy50b3AoKS0+bU1heEhlaWdodDsKKyAgICBtQ2FjaGVMaW5lcy5wdXNoKG5ldyBDYWNoZVRleHR1cmVMaW5lKG1DYWNoZVdpZHRoLCA0MCwgbmV4dExpbmUsIDApKTsKKyAgICBuZXh0TGluZSArPSBtQ2FjaGVMaW5lcy50b3AoKS0+bU1heEhlaWdodDsKKyAgICBtQ2FjaGVMaW5lcy5wdXNoKG5ldyBDYWNoZVRleHR1cmVMaW5lKG1DYWNoZVdpZHRoLCBtQ2FjaGVIZWlnaHQgLSBuZXh0TGluZSwgbmV4dExpbmUsIDApKTsKK30KKworLy8gQXZvaWQgaGF2aW5nIHRvIHJlYWxsb2NhdGUgbWVtb3J5IGFuZCByZW5kZXIgcXVhZCBieSBxdWFkCit2b2lkIEZvbnRSZW5kZXJlcjo6aW5pdFZlcnRleEFycmF5QnVmZmVycygpIHsKKyAgICB1aW50MzJfdCBudW1JbmRpY2llcyA9IG1NYXhOdW1iZXJPZlF1YWRzICogNjsKKyAgICB1aW50MzJfdCBpbmRleEJ1ZmZlclNpemVCeXRlcyA9IG51bUluZGljaWVzICogc2l6ZW9mKHVpbnQxNl90KTsKKyAgICB1aW50MTZfdCogaW5kZXhCdWZmZXJEYXRhID0gKHVpbnQxNl90KikgbWFsbG9jKGluZGV4QnVmZmVyU2l6ZUJ5dGVzKTsKKworICAgIC8vIEZvdXIgdmVydHMsIHR3byB0cmlhbmdsZXMgLCBzaXggaW5kaWNlcyBwZXIgcXVhZAorICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBtTWF4TnVtYmVyT2ZRdWFkczsgaSsrKSB7CisgICAgICAgIGludCBpNiA9IGkgKiA2OworICAgICAgICBpbnQgaTQgPSBpICogNDsKKworICAgICAgICBpbmRleEJ1ZmZlckRhdGFbaTYgKyAwXSA9IGk0ICsgMDsKKyAgICAgICAgaW5kZXhCdWZmZXJEYXRhW2k2ICsgMV0gPSBpNCArIDE7CisgICAgICAgIGluZGV4QnVmZmVyRGF0YVtpNiArIDJdID0gaTQgKyAyOworCisgICAgICAgIGluZGV4QnVmZmVyRGF0YVtpNiArIDNdID0gaTQgKyAwOworICAgICAgICBpbmRleEJ1ZmZlckRhdGFbaTYgKyA0XSA9IGk0ICsgMjsKKyAgICAgICAgaW5kZXhCdWZmZXJEYXRhW2k2ICsgNV0gPSBpNCArIDM7CisgICAgfQorCisgICAgZ2xHZW5CdWZmZXJzKDEsICZtSW5kZXhCdWZmZXJJRCk7CisgICAgZ2xCaW5kQnVmZmVyKEdMX0FSUkFZX0JVRkZFUiwgbUluZGV4QnVmZmVySUQpOworICAgIGdsQnVmZmVyRGF0YShHTF9BUlJBWV9CVUZGRVIsIGluZGV4QnVmZmVyU2l6ZUJ5dGVzLCBpbmRleEJ1ZmZlckRhdGEsIEdMX0RZTkFNSUNfRFJBVyk7CisgICAgZ2xCaW5kQnVmZmVyKEdMX0FSUkFZX0JVRkZFUiwgMCk7CisKKyAgICBmcmVlKGluZGV4QnVmZmVyRGF0YSk7CisKKyAgICB1aW50MzJfdCBjb29yZFNpemUgPSAzOworICAgIHVpbnQzMl90IHV2U2l6ZSA9IDI7CisgICAgdWludDMyX3QgdmVydHNQZXJRdWFkID0gNDsKKyAgICB1aW50MzJfdCB2ZXJ0ZXhCdWZmZXJTaXplID0gbU1heE51bWJlck9mUXVhZHMgKiB2ZXJ0c1BlclF1YWQgKiBjb29yZFNpemUgKiB1dlNpemU7CisgICAgbVRleHRNZXNoUHRyID0gbmV3IGZsb2F0W3ZlcnRleEJ1ZmZlclNpemVdOworfQorCisvLyBXZSBkb24ndCB3YW50IHRvIGFsbG9jYXRlIGFueXRoaW5nIHVubGVzcyB3ZSBhY3R1YWxseSBkcmF3IHRleHQKK3ZvaWQgRm9udFJlbmRlcmVyOjpjaGVja0luaXQoKSB7CisgICAgaWYgKG1Jbml0aWFsaXplZCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaW5pdFRleHRUZXh0dXJlKCk7CisgICAgaW5pdFZlcnRleEFycmF5QnVmZmVycygpOworCisgICAgLy8gV2Ugc3RvcmUgYSBzdHJpbmcgd2l0aCBsZXR0ZXJzIGluIGEgcm91Z2ggZnJlcXVlbmN5IG9mIG9jY3VycmVuY2UKKyAgICBtTGF0aW5QcmVjYWNoZSA9IFN0cmluZzE2KCJlaXNhcm50b2xjZHVncG1oYnlmdmt3enhqcSAiKTsKKyAgICBtTGF0aW5QcmVjYWNoZSArPSBTdHJpbmcxNigiRUlTQVJOVE9MQ0RVR1BNSEJZRlZLV1pYSlEiKTsKKyAgICBtTGF0aW5QcmVjYWNoZSArPSBTdHJpbmcxNigiLC4/ISgpLStAOzpgJyIpOworICAgIG1MYXRpblByZWNhY2hlICs9IFN0cmluZzE2KCIwMTIzNDU2Nzg5Iik7CisKKyAgICBtSW5pdGlhbGl6ZWQgPSB0cnVlOworfQorCit2b2lkIEZvbnRSZW5kZXJlcjo6Y2hlY2tUZXh0dXJlVXBkYXRlKCkgeworICAgIGlmICghbVVwbG9hZFRleHR1cmUpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgbVRleHR1cmVJZCk7CisKKyAgICAvLyBJdGVyYXRlIG92ZXIgYWxsIHRoZSBjYWNoZSBsaW5lcyBhbmQgc2VlIHdoaWNoIG9uZXMgbmVlZCB0byBiZSB1cGRhdGVkCisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG1DYWNoZUxpbmVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIENhY2hlVGV4dHVyZUxpbmUqIGNsID0gbUNhY2hlTGluZXNbaV07CisgICAgICAgIGlmKGNsLT5tRGlydHkpIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHhPZmZzZXQgPSAwOworICAgICAgICAgICAgdWludDMyX3QgeU9mZnNldCA9IGNsLT5tQ3VycmVudFJvdzsKKyAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoICAgPSBtQ2FjaGVXaWR0aDsKKyAgICAgICAgICAgIHVpbnQzMl90IGhlaWdodCAgPSBjbC0+bU1heEhlaWdodDsKKyAgICAgICAgICAgIHZvaWQqIHRleHR1cmVEYXRhID0gbVRleHRUZXh0dXJlICsgeU9mZnNldCp3aWR0aDsKKworICAgICAgICAgICAgZ2xUZXhTdWJJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIHhPZmZzZXQsIHlPZmZzZXQsIHdpZHRoLCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgIEdMX0FMUEhBLCBHTF9VTlNJR05FRF9CWVRFLCB0ZXh0dXJlRGF0YSk7CisKKyAgICAgICAgICAgIGNsLT5tRGlydHkgPSBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIG1VcGxvYWRUZXh0dXJlID0gZmFsc2U7Cit9CisKK3ZvaWQgRm9udFJlbmRlcmVyOjppc3N1ZURyYXdDb21tYW5kKCkgeworICAgIGNoZWNrVGV4dHVyZVVwZGF0ZSgpOworCisgICAgZmxvYXQqIHZ0eCA9IG1UZXh0TWVzaFB0cjsKKyAgICBmbG9hdCogdGV4ID0gdnR4ICsgMzsKKworICAgIC8vIHBvc2l0aW9uIGlzIHNsb3QgMAorICAgIHVpbnQzMl90IHNsb3QgPSAwOworICAgIGdsVmVydGV4QXR0cmliUG9pbnRlcihzbG90LCAzLCBHTF9GTE9BVCwgZmFsc2UsIDIwLCB2dHgpOworCisgICAgLy8gdGV4dHVyZTAgaXMgc2xvdCAxCisgICAgc2xvdCA9IDE7CisgICAgZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyKHNsb3QsIDIsIEdMX0ZMT0FULCBmYWxzZSwgMjAsIHRleCk7CisKKyAgICBnbEJpbmRCdWZmZXIoR0xfRUxFTUVOVF9BUlJBWV9CVUZGRVIsIG1JbmRleEJ1ZmZlcklEKTsKKyAgICBnbERyYXdFbGVtZW50cyhHTF9UUklBTkdMRVMsIG1DdXJyZW50UXVhZEluZGV4ICogNiwgR0xfVU5TSUdORURfU0hPUlQsIE5VTEwpOworfQorCit2b2lkIEZvbnRSZW5kZXJlcjo6YXBwZW5kTWVzaFF1YWQoZmxvYXQgeDEsIGZsb2F0IHkxLCBmbG9hdCB6MSwgZmxvYXQgdTEsIGZsb2F0IHYxLCBmbG9hdCB4MiwKKyAgICAgICAgZmxvYXQgeTIsIGZsb2F0IHoyLCBmbG9hdCB1MiwgZmxvYXQgdjIsIGZsb2F0IHgzLCBmbG9hdCB5MywgZmxvYXQgejMsIGZsb2F0IHUzLCBmbG9hdCB2MywKKyAgICAgICAgZmxvYXQgeDQsIGZsb2F0IHk0LCBmbG9hdCB6NCwgZmxvYXQgdTQsIGZsb2F0IHY0KSB7CisgICAgaWYgKHgxID4gbUNsaXAtPnJpZ2h0IHx8IHkxIDwgbUNsaXAtPnRvcCB8fCB4MiA8IG1DbGlwLT5sZWZ0IHx8IHk0ID4gbUNsaXAtPmJvdHRvbSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgY29uc3QgdWludDMyX3QgdmVydHNQZXJRdWFkID0gNDsKKyAgICBjb25zdCB1aW50MzJfdCBmbG9hdHNQZXJWZXJ0ID0gNTsKKyAgICBmbG9hdCogY3VycmVudFBvcyA9IG1UZXh0TWVzaFB0ciArIG1DdXJyZW50UXVhZEluZGV4ICogdmVydHNQZXJRdWFkICogZmxvYXRzUGVyVmVydDsKKworICAgICgqY3VycmVudFBvcysrKSA9IHgxOworICAgICgqY3VycmVudFBvcysrKSA9IHkxOworICAgICgqY3VycmVudFBvcysrKSA9IHoxOworICAgICgqY3VycmVudFBvcysrKSA9IHUxOworICAgICgqY3VycmVudFBvcysrKSA9IHYxOworCisgICAgKCpjdXJyZW50UG9zKyspID0geDI7CisgICAgKCpjdXJyZW50UG9zKyspID0geTI7CisgICAgKCpjdXJyZW50UG9zKyspID0gejI7CisgICAgKCpjdXJyZW50UG9zKyspID0gdTI7CisgICAgKCpjdXJyZW50UG9zKyspID0gdjI7CisKKyAgICAoKmN1cnJlbnRQb3MrKykgPSB4MzsKKyAgICAoKmN1cnJlbnRQb3MrKykgPSB5MzsKKyAgICAoKmN1cnJlbnRQb3MrKykgPSB6MzsKKyAgICAoKmN1cnJlbnRQb3MrKykgPSB1MzsKKyAgICAoKmN1cnJlbnRQb3MrKykgPSB2MzsKKworICAgICgqY3VycmVudFBvcysrKSA9IHg0OworICAgICgqY3VycmVudFBvcysrKSA9IHk0OworICAgICgqY3VycmVudFBvcysrKSA9IHo0OworICAgICgqY3VycmVudFBvcysrKSA9IHU0OworICAgICgqY3VycmVudFBvcysrKSA9IHY0OworCisgICAgbUN1cnJlbnRRdWFkSW5kZXgrKzsKKworICAgIGlmIChtQ3VycmVudFF1YWRJbmRleCA9PSBtTWF4TnVtYmVyT2ZRdWFkcykgeworICAgICAgICBpc3N1ZURyYXdDb21tYW5kKCk7CisgICAgICAgIG1DdXJyZW50UXVhZEluZGV4ID0gMDsKKyAgICB9Cit9CisKK3VpbnQzMl90IEZvbnRSZW5kZXJlcjo6Z2V0UmVtYWluaW5nQ2FjaGVDYXBhY2l0eSgpIHsKKyAgICB1aW50MzJfdCByZW1haW5pbmdDYXBhY2l0eSA9IDA7CisgICAgZmxvYXQgdG90YWxQaXhlbHMgPSAwOworICAgIGZvcih1aW50MzJfdCBpID0gMDsgaSA8IG1DYWNoZUxpbmVzLnNpemUoKTsgaSArKykgeworICAgICAgICAgcmVtYWluaW5nQ2FwYWNpdHkgKz0gKG1DYWNoZUxpbmVzW2ldLT5tTWF4V2lkdGggLSBtQ2FjaGVMaW5lc1tpXS0+bUN1cnJlbnRDb2wpOworICAgICAgICAgdG90YWxQaXhlbHMgKz0gbUNhY2hlTGluZXNbaV0tPm1NYXhXaWR0aDsKKyAgICB9CisgICAgcmVtYWluaW5nQ2FwYWNpdHkgPSAocmVtYWluaW5nQ2FwYWNpdHkgKiAxMDApIC8gdG90YWxQaXhlbHM7CisgICAgcmV0dXJuIHJlbWFpbmluZ0NhcGFjaXR5OworfQorCit2b2lkIEZvbnRSZW5kZXJlcjo6cHJlY2FjaGVMYXRpbihTa1BhaW50KiBwYWludCkgeworICAgIC8vIFJlbWFpbmluZyBjYXBhY2l0eSBpcyBtZWFzdXJlZCBpbiAlCisgICAgdWludDMyX3QgcmVtYWluaW5nQ2FwYWNpdHkgPSBnZXRSZW1haW5pbmdDYWNoZUNhcGFjaXR5KCk7CisgICAgdWludDMyX3QgcHJlY2FjaGVJZHggPSAwOworICAgIHdoaWxlKHJlbWFpbmluZ0NhcGFjaXR5ID4gMjUgJiYgcHJlY2FjaGVJZHggPCBtTGF0aW5QcmVjYWNoZS5zaXplKCkpIHsKKyAgICAgICAgbUN1cnJlbnRGb250LT5nZXRDYWNoZWRVVEZDaGFyKHBhaW50LCAoaW50MzJfdCltTGF0aW5QcmVjYWNoZVtwcmVjYWNoZUlkeF0pOworICAgICAgICByZW1haW5pbmdDYXBhY2l0eSA9IGdldFJlbWFpbmluZ0NhY2hlQ2FwYWNpdHkoKTsKKyAgICAgICAgcHJlY2FjaGVJZHggKys7CisgICAgfQorfQorCit2b2lkIEZvbnRSZW5kZXJlcjo6c2V0Rm9udChTa1BhaW50KiBwYWludCwgdWludDMyX3QgZm9udElkLCBmbG9hdCBmb250U2l6ZSkgeworICAgIHVpbnQzMl90IGN1cnJlbnROdW1Gb250cyA9IG1BY3RpdmVGb250cy5zaXplKCk7CisgICAgbUN1cnJlbnRGb250ID0gRm9udDo6Y3JlYXRlKHRoaXMsIGZvbnRJZCwgZm9udFNpemUpOworCisgICAgY29uc3QgZmxvYXQgbWF4UHJlY2FjaGVGb250U2l6ZSA9IDQwLjBmOworICAgIGJvb2wgaXNOZXdGb250ID0gY3VycmVudE51bUZvbnRzICE9IG1BY3RpdmVGb250cy5zaXplKCk7CisKKyAgICBpZihpc05ld0ZvbnQgJiYgZm9udFNpemUgPD0gbWF4UHJlY2FjaGVGb250U2l6ZSApeworICAgICAgICBwcmVjYWNoZUxhdGluKHBhaW50KTsKKyAgICB9Cit9CitGb250UmVuZGVyZXI6OkRyb3BTaGFkb3cgRm9udFJlbmRlcmVyOjpyZW5kZXJEcm9wU2hhZG93KFNrUGFpbnQqIHBhaW50LCBjb25zdCBjaGFyICp0ZXh0LAorICAgICAgICB1aW50MzJfdCBzdGFydEluZGV4LCB1aW50MzJfdCBsZW4sIGludCBudW1HbHlwaHMsIHVpbnQzMl90IHJhZGl1cykgeworICAgIGNoZWNrSW5pdCgpOworCisgICAgaWYgKCFtQ3VycmVudEZvbnQpIHsKKyAgICAgICAgRHJvcFNoYWRvdyBpbWFnZTsKKyAgICAgICAgaW1hZ2Uud2lkdGggPSAwOworICAgICAgICBpbWFnZS5oZWlnaHQgPSAwOworICAgICAgICBpbWFnZS5pbWFnZSA9IE5VTEw7CisgICAgICAgIGltYWdlLnBlblggPSAwOworICAgICAgICBpbWFnZS5wZW5ZID0gMDsKKyAgICAgICAgcmV0dXJuIGltYWdlOworICAgIH0KKworICAgIFJlY3QgYm91bmRzOworICAgIG1DdXJyZW50Rm9udC0+bWVhc3VyZVVURihwYWludCwgdGV4dCwgc3RhcnRJbmRleCwgbGVuLCBudW1HbHlwaHMsICZib3VuZHMpOworICAgIHVpbnQzMl90IHBhZGRlZFdpZHRoID0gKHVpbnQzMl90KSAoYm91bmRzLnJpZ2h0IC0gYm91bmRzLmxlZnQpICsgMiAqIHJhZGl1czsKKyAgICB1aW50MzJfdCBwYWRkZWRIZWlnaHQgPSAodWludDMyX3QpIChib3VuZHMudG9wIC0gYm91bmRzLmJvdHRvbSkgKyAyICogcmFkaXVzOworICAgIHVpbnQ4X3QqIGRhdGFCdWZmZXIgPSBuZXcgdWludDhfdFtwYWRkZWRXaWR0aCAqIHBhZGRlZEhlaWdodF07CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHBhZGRlZFdpZHRoICogcGFkZGVkSGVpZ2h0OyBpKyspIHsKKyAgICAgICAgZGF0YUJ1ZmZlcltpXSA9IDA7CisgICAgfQorCisgICAgaW50IHBlblggPSByYWRpdXMgLSBib3VuZHMubGVmdDsKKyAgICBpbnQgcGVuWSA9IHJhZGl1cyAtIGJvdW5kcy5ib3R0b207CisKKyAgICBtQ3VycmVudEZvbnQtPnJlbmRlclVURihwYWludCwgdGV4dCwgc3RhcnRJbmRleCwgbGVuLCBudW1HbHlwaHMsIHBlblgsIHBlblksCisgICAgICAgICAgICBkYXRhQnVmZmVyLCBwYWRkZWRXaWR0aCwgcGFkZGVkSGVpZ2h0KTsKKyAgICBibHVySW1hZ2UoZGF0YUJ1ZmZlciwgcGFkZGVkV2lkdGgsIHBhZGRlZEhlaWdodCwgcmFkaXVzKTsKKworICAgIERyb3BTaGFkb3cgaW1hZ2U7CisgICAgaW1hZ2Uud2lkdGggPSBwYWRkZWRXaWR0aDsKKyAgICBpbWFnZS5oZWlnaHQgPSBwYWRkZWRIZWlnaHQ7CisgICAgaW1hZ2UuaW1hZ2UgPSBkYXRhQnVmZmVyOworICAgIGltYWdlLnBlblggPSBwZW5YOworICAgIGltYWdlLnBlblkgPSBwZW5ZOworICAgIHJldHVybiBpbWFnZTsKK30KKwordm9pZCBGb250UmVuZGVyZXI6OnJlbmRlclRleHQoU2tQYWludCogcGFpbnQsIGNvbnN0IFJlY3QqIGNsaXAsIGNvbnN0IGNoYXIgKnRleHQsCisgICAgICAgIHVpbnQzMl90IHN0YXJ0SW5kZXgsIHVpbnQzMl90IGxlbiwgaW50IG51bUdseXBocywgaW50IHgsIGludCB5KSB7CisgICAgY2hlY2tJbml0KCk7CisKKyAgICBpZiAoIW1DdXJyZW50Rm9udCkgeworICAgICAgICBMT0dFKCJObyBmb250IHNldCIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbUNsaXAgPSBjbGlwOworICAgIG1DdXJyZW50Rm9udC0+cmVuZGVyVVRGKHBhaW50LCB0ZXh0LCBzdGFydEluZGV4LCBsZW4sIG51bUdseXBocywgeCwgeSk7CisKKyAgICBpZiAobUN1cnJlbnRRdWFkSW5kZXggIT0gMCkgeworICAgICAgICBpc3N1ZURyYXdDb21tYW5kKCk7CisgICAgICAgIG1DdXJyZW50UXVhZEluZGV4ID0gMDsKKyAgICB9Cit9CisKK3ZvaWQgRm9udFJlbmRlcmVyOjpjb21wdXRlR2F1c3NpYW5XZWlnaHRzKGZsb2F0KiB3ZWlnaHRzLCBpbnQzMl90IHJhZGl1cykgeworICAgIC8vIENvbXB1dGUgZ2F1c3NpYW4gd2VpZ2h0cyBmb3IgdGhlIGJsdXIKKyAgICAvLyBlIGlzIHRoZSBldWxlcidzIG51bWJlcgorICAgIGZsb2F0IGUgPSAyLjcxODI4MTgyODQ1OTA0NWY7CisgICAgZmxvYXQgcGkgPSAzLjE0MTU5MjY1MzU4OTc5MzJmOworICAgIC8vIGcoeCkgPSAoIDEgLyBzcXJ0KCAyICogcGkgKSAqIHNpZ21hKSAqIGUgXiAoIC14XjIgLyAyICogc2lnbWFeMiApCisgICAgLy8geCBpcyBvZiB0aGUgZm9ybSBbLXJhZGl1cyAuLiAwIC4uIHJhZGl1c10KKyAgICAvLyBhbmQgc2lnbWEgdmFyaWVzIHdpdGggcmFkaXVzLgorICAgIC8vIEJhc2VkIG9uIHNvbWUgZXhwZXJpbWVudGFsIHJhZGl1cyB2YWx1ZXMgYW5kIHNpZ21hJ3MKKyAgICAvLyB3ZSBhcHByb3hpbWF0ZWx5IGZpdCBzaWdtYSA9IGYocmFkaXVzKSBhcworICAgIC8vIHNpZ21hID0gcmFkaXVzICogMC4zICArIDAuNgorICAgIC8vIFRoZSBsYXJnZXIgdGhlIHJhZGl1cyBnZXRzLCB0aGUgbW9yZSBvdXIgZ2F1c3NpYW4gYmx1cgorICAgIC8vIHdpbGwgcmVzZW1ibGUgYSBib3ggYmx1ciBzaW5jZSB3aXRoIGxhcmdlIHNpZ21hCisgICAgLy8gdGhlIGdhdXNzaWFuIGN1cnZlIGJlZ2lucyB0byBsb3NlIGl0cyBzaGFwZQorICAgIGZsb2F0IHNpZ21hID0gMC4zZiAqIChmbG9hdClyYWRpdXMgKyAwLjZmOworCisgICAgLy8gTm93IGNvbXB1dGUgdGhlIGNvZWZmaWNpbnRzCisgICAgLy8gV2Ugd2lsbCBzdG9yZSBzb21lIHJlZHVuZGFudCB2YWx1ZXMgdG8gc2F2ZSBzb21lIG1hdGggZHVyaW5nCisgICAgLy8gdGhlIGJsdXIgY2FsY3VsYXRpb25zCisgICAgLy8gcHJlY29tcHV0ZSBzb21lIHZhbHVlcworICAgIGZsb2F0IGNvZWZmMSA9IDEuMGYgLyAoc3FydCggMi4wZiAqIHBpICkgKiBzaWdtYSk7CisgICAgZmxvYXQgY29lZmYyID0gLSAxLjBmIC8gKDIuMGYgKiBzaWdtYSAqIHNpZ21hKTsKKworICAgIGZsb2F0IG5vcm1hbGl6ZUZhY3RvciA9IDAuMGY7CisgICAgZm9yKGludDMyX3QgciA9IC1yYWRpdXM7IHIgPD0gcmFkaXVzOyByICsrKSB7CisgICAgICAgIGZsb2F0IGZsb2F0UiA9IChmbG9hdClyOworICAgICAgICB3ZWlnaHRzW3IgKyByYWRpdXNdID0gY29lZmYxICogcG93KGUsIGZsb2F0UiAqIGZsb2F0UiAqIGNvZWZmMik7CisgICAgICAgIG5vcm1hbGl6ZUZhY3RvciArPSB3ZWlnaHRzW3IgKyByYWRpdXNdOworICAgIH0KKworICAgIC8vTm93IHdlIG5lZWQgdG8gbm9ybWFsaXplIHRoZSB3ZWlnaHRzIGJlY2F1c2UgYWxsIG91ciBjb2VmZmljaWVudHMgbmVlZCB0byBhZGQgdXAgdG8gb25lCisgICAgbm9ybWFsaXplRmFjdG9yID0gMS4wZiAvIG5vcm1hbGl6ZUZhY3RvcjsKKyAgICBmb3IoaW50MzJfdCByID0gLXJhZGl1czsgciA8PSByYWRpdXM7IHIgKyspIHsKKyAgICAgICAgd2VpZ2h0c1tyICsgcmFkaXVzXSAqPSBub3JtYWxpemVGYWN0b3I7CisgICAgfQorfQorCit2b2lkIEZvbnRSZW5kZXJlcjo6aG9yaXpvbnRhbEJsdXIoZmxvYXQqIHdlaWdodHMsIGludDMyX3QgcmFkaXVzLAorICAgICAgICBjb25zdCB1aW50OF90KiBzb3VyY2UsIHVpbnQ4X3QqIGRlc3QsIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0KSB7CisgICAgZmxvYXQgYmx1cnJlZFBpeGVsID0gMC4wZjsKKyAgICBmbG9hdCBjdXJyZW50UGl4ZWwgPSAwLjBmOworCisgICAgZm9yKGludDMyX3QgeSA9IDA7IHkgPCBoZWlnaHQ7IHkgKyspIHsKKworICAgICAgICBjb25zdCB1aW50OF90KiBpbnB1dCA9IHNvdXJjZSArIHkgKiB3aWR0aDsKKyAgICAgICAgdWludDhfdCogb3V0cHV0ID0gZGVzdCArIHkgKiB3aWR0aDsKKworICAgICAgICBmb3IoaW50MzJfdCB4ID0gMDsgeCA8IHdpZHRoOyB4ICsrKSB7CisgICAgICAgICAgICBibHVycmVkUGl4ZWwgPSAwLjBmOworICAgICAgICAgICAgY29uc3QgZmxvYXQqIGdQdHIgPSB3ZWlnaHRzOworICAgICAgICAgICAgLy8gT3B0aW1pemF0aW9uIGZvciBub24tYm9yZGVyIHBpeGVscworICAgICAgICAgICAgaWYgKCh4ID4gcmFkaXVzKSAmJiAoeCA8ICh3aWR0aCAtIHJhZGl1cykpKSB7CisgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqaSA9IGlucHV0ICsgKHggLSByYWRpdXMpOworICAgICAgICAgICAgICAgIGZvcihpbnQgciA9IC1yYWRpdXM7IHIgPD0gcmFkaXVzOyByICsrKSB7CisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRQaXhlbCA9IChmbG9hdCkoKmkpOworICAgICAgICAgICAgICAgICAgICBibHVycmVkUGl4ZWwgKz0gY3VycmVudFBpeGVsICogZ1B0clswXTsKKyAgICAgICAgICAgICAgICAgICAgZ1B0cisrOworICAgICAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmb3IoaW50MzJfdCByID0gLXJhZGl1czsgciA8PSByYWRpdXM7IHIgKyspIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gU3RlcHBpbmcgbGVmdCBhbmQgcmlnaHQgYXdheSBmcm9tIHRoZSBwaXhlbAorICAgICAgICAgICAgICAgICAgICBpbnQgdmFsaWRXID0geCArIHI7CisgICAgICAgICAgICAgICAgICAgIGlmKHZhbGlkVyA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkVyA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYodmFsaWRXID4gd2lkdGggLSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZFcgPSB3aWR0aCAtIDE7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBjdXJyZW50UGl4ZWwgPSAoZmxvYXQpKGlucHV0W3ZhbGlkV10pOworICAgICAgICAgICAgICAgICAgICBibHVycmVkUGl4ZWwgKz0gY3VycmVudFBpeGVsICogZ1B0clswXTsKKyAgICAgICAgICAgICAgICAgICAgZ1B0cisrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpvdXRwdXQgPSAodWludDhfdClibHVycmVkUGl4ZWw7CisgICAgICAgICAgICBvdXRwdXQgKys7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgRm9udFJlbmRlcmVyOjp2ZXJ0aWNhbEJsdXIoZmxvYXQqIHdlaWdodHMsIGludDMyX3QgcmFkaXVzLAorICAgICAgICBjb25zdCB1aW50OF90KiBzb3VyY2UsIHVpbnQ4X3QqIGRlc3QsIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0KSB7CisgICAgZmxvYXQgYmx1cnJlZFBpeGVsID0gMC4wZjsKKyAgICBmbG9hdCBjdXJyZW50UGl4ZWwgPSAwLjBmOworCisgICAgZm9yKGludDMyX3QgeSA9IDA7IHkgPCBoZWlnaHQ7IHkgKyspIHsKKworICAgICAgICB1aW50OF90KiBvdXRwdXQgPSBkZXN0ICsgeSAqIHdpZHRoOworCisgICAgICAgIGZvcihpbnQzMl90IHggPSAwOyB4IDwgd2lkdGg7IHggKyspIHsKKyAgICAgICAgICAgIGJsdXJyZWRQaXhlbCA9IDAuMGY7CisgICAgICAgICAgICBjb25zdCBmbG9hdCogZ1B0ciA9IHdlaWdodHM7CisgICAgICAgICAgICBjb25zdCB1aW50OF90KiBpbnB1dCA9IHNvdXJjZSArIHg7CisgICAgICAgICAgICAvLyBPcHRpbWl6YXRpb24gZm9yIG5vbi1ib3JkZXIgcGl4ZWxzCisgICAgICAgICAgICBpZiAoKHkgPiByYWRpdXMpICYmICh5IDwgKGhlaWdodCAtIHJhZGl1cykpKSB7CisgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqaSA9IGlucHV0ICsgKCh5IC0gcmFkaXVzKSAqIHdpZHRoKTsKKyAgICAgICAgICAgICAgICBmb3IoaW50MzJfdCByID0gLXJhZGl1czsgciA8PSByYWRpdXM7IHIgKyspIHsKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudFBpeGVsID0gKGZsb2F0KSgqaSk7CisgICAgICAgICAgICAgICAgICAgIGJsdXJyZWRQaXhlbCArPSBjdXJyZW50UGl4ZWwgKiBnUHRyWzBdOworICAgICAgICAgICAgICAgICAgICBnUHRyKys7CisgICAgICAgICAgICAgICAgICAgIGkgKz0gd2lkdGg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmb3IoaW50MzJfdCByID0gLXJhZGl1czsgciA8PSByYWRpdXM7IHIgKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IHZhbGlkSCA9IHkgKyByOworICAgICAgICAgICAgICAgICAgICAvLyBDbGFtcCB0byB6ZXJvIGFuZCB3aWR0aAorICAgICAgICAgICAgICAgICAgICBpZih2YWxpZEggPCAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZEggPSAwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmKHZhbGlkSCA+IGhlaWdodCAtIDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkSCA9IGhlaWdodCAtIDE7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICppID0gaW5wdXQgKyB2YWxpZEggKiB3aWR0aDsKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudFBpeGVsID0gKGZsb2F0KSgqaSk7CisgICAgICAgICAgICAgICAgICAgIGJsdXJyZWRQaXhlbCArPSBjdXJyZW50UGl4ZWwgKiBnUHRyWzBdOworICAgICAgICAgICAgICAgICAgICBnUHRyKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgKm91dHB1dCA9ICh1aW50OF90KWJsdXJyZWRQaXhlbDsKKyAgICAgICAgICAgIG91dHB1dCArKzsKKyAgICAgICAgfQorICAgIH0KK30KKworCit2b2lkIEZvbnRSZW5kZXJlcjo6Ymx1ckltYWdlKHVpbnQ4X3QgKmltYWdlLCBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCwgaW50MzJfdCByYWRpdXMpIHsKKyAgICBmbG9hdCAqZ2F1c3NpYW4gPSBuZXcgZmxvYXRbMiAqIHJhZGl1cyArIDFdOworICAgIGNvbXB1dGVHYXVzc2lhbldlaWdodHMoZ2F1c3NpYW4sIHJhZGl1cyk7CisgICAgdWludDhfdCogc2NyYXRjaCA9IG5ldyB1aW50OF90W3dpZHRoICogaGVpZ2h0XTsKKyAgICBob3Jpem9udGFsQmx1cihnYXVzc2lhbiwgcmFkaXVzLCBpbWFnZSwgc2NyYXRjaCwgd2lkdGgsIGhlaWdodCk7CisgICAgdmVydGljYWxCbHVyKGdhdXNzaWFuLCByYWRpdXMsIHNjcmF0Y2gsIGltYWdlLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICBkZWxldGVbXSBnYXVzc2lhbjsKKyAgICBkZWxldGVbXSBzY3JhdGNoOworfQorCit9OyAvLyBuYW1lc3BhY2UgdWlyZW5kZXJlcgorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9Gb250UmVuZGVyZXIuaCBiL2xpYnMvaHd1aS9Gb250UmVuZGVyZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NmM5MmQ1Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL0ZvbnRSZW5kZXJlci5oCkBAIC0wLDAgKzEsMjU3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1VJX0ZPTlRfUkVOREVSRVJfSAorI2RlZmluZSBBTkRST0lEX1VJX0ZPTlRfUkVOREVSRVJfSAorCisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzE2Lmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KKworI2luY2x1ZGUgPFNrU2NhbGVyQ29udGV4dC5oPgorI2luY2x1ZGUgPFNrUGFpbnQuaD4KKworI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgorCisjaW5jbHVkZSAiUmVjdC5oIgorI2luY2x1ZGUgIlByb3BlcnRpZXMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHVpcmVuZGVyZXIgeworCitjbGFzcyBGb250UmVuZGVyZXI7CisKKy8qKgorICogUmVwcmVzZW50cyBhIGZvbnQsIGRlZmluZWQgYnkgYSBTa2lhIGZvbnQgaWQgYW5kIGEgZm9udCBzaXplLiBBIGZvbnQgaXMgdXNlZAorICogdG8gZ2VuZXJhdGUgZ2x5cGhzIGFuZCBjYWNoZSB0aGVtIGluIHRoZSBGb250U3RhdGUuCisgKi8KK2NsYXNzIEZvbnQgeworcHVibGljOgorICAgIH5Gb250KCk7CisKKyAgICAvKioKKyAgICAgKiBSZW5kZXJzIHRoZSBzcGVjaWZpZWQgc3RyaW5nIG9mIHRleHQuCisgICAgICogSWYgYml0bWFwIGlzIHNwZWNpZmllZCwgaXQgd2lsbCBiZSB1c2VkIGFzIHRoZSByZW5kZXIgdGFyZ2V0CisgICAgICovCisgICAgdm9pZCByZW5kZXJVVEYoU2tQYWludCogcGFpbnQsIGNvbnN0IGNoYXIgKnRleHQsIHVpbnQzMl90IHN0YXJ0LCB1aW50MzJfdCBsZW4sCisgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtR2x5cGhzLCBpbnQgeCwgaW50IHksCisgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpiaXRtYXAgPSBOVUxMLCB1aW50MzJfdCBiaXRtYXBXID0gMCwgdWludDMyX3QgYml0bWFwSCA9IDApOworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgZm9udCBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBmb250IHN0YXRlLgorICAgICAqLworICAgIHN0YXRpYyBGb250KiBjcmVhdGUoRm9udFJlbmRlcmVyKiBzdGF0ZSwgdWludDMyX3QgZm9udElkLCBmbG9hdCBmb250U2l6ZSk7CisKK3Byb3RlY3RlZDoKKyAgICBmcmllbmQgY2xhc3MgRm9udFJlbmRlcmVyOworCisgICAgZW51bSBSZW5kZXJNb2RlIHsKKyAgICAgICAgRlJBTUVCVUZGRVIsCisgICAgICAgIEJJVE1BUCwKKyAgICAgICAgTUVBU1VSRSwKKyAgICB9OworCisgICAgdm9pZCByZW5kZXJVVEYoU2tQYWludCogcGFpbnQsIGNvbnN0IGNoYXIgKnRleHQsIHVpbnQzMl90IHN0YXJ0LCB1aW50MzJfdCBsZW4sCisgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtR2x5cGhzLCBpbnQgeCwgaW50IHksIFJlbmRlck1vZGUgbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmJpdG1hcCwgdWludDMyX3QgYml0bWFwVywgdWludDMyX3QgYml0bWFwSCwKKyAgICAgICAgICAgICAgICAgICAgIFJlY3QgKmJvdW5kcyk7CisKKyAgICB2b2lkIG1lYXN1cmVVVEYoU2tQYWludCogcGFpbnQsIGNvbnN0IGNoYXIqIHRleHQsIHVpbnQzMl90IHN0YXJ0LCB1aW50MzJfdCBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgaW50IG51bUdseXBocywgUmVjdCAqYm91bmRzKTsKKworICAgIHN0cnVjdCBDYWNoZWRHbHlwaEluZm8geworICAgICAgICAvLyBIYXMgdGhlIGNhY2hlIGJlZW4gaW52YWxpZGF0ZWQ/CisgICAgICAgIGJvb2wgbUlzVmFsaWQ7CisgICAgICAgIC8vIExvY2F0aW9uIG9mIHRoZSBjYWNoZWQgZ2x5cGggaW4gdGhlIGJpdG1hcAorICAgICAgICAvLyBpbiBjYXNlIHdlIG5lZWQgdG8gcmVzaXplIHRoZSB0ZXh0dXJlIG9yCisgICAgICAgIC8vIHJlbmRlciB0byBiaXRtYXAKKyAgICAgICAgdWludDMyX3QgbVN0YXJ0WDsKKyAgICAgICAgdWludDMyX3QgbVN0YXJ0WTsKKyAgICAgICAgdWludDMyX3QgbUJpdG1hcFdpZHRoOworICAgICAgICB1aW50MzJfdCBtQml0bWFwSGVpZ2h0OworICAgICAgICAvLyBBbHNvIGNhY2hlIHRleHR1cmUgY29vcmRzIGZvciB0aGUgcXVhZAorICAgICAgICBmbG9hdCBtQml0bWFwTWluVTsKKyAgICAgICAgZmxvYXQgbUJpdG1hcE1pblY7CisgICAgICAgIGZsb2F0IG1CaXRtYXBNYXhVOworICAgICAgICBmbG9hdCBtQml0bWFwTWF4VjsKKyAgICAgICAgLy8gTWluaW1pemUgaG93IG11Y2ggd2UgY2FsbCBmcmVldHlwZQorICAgICAgICB1aW50MzJfdCBtR2x5cGhJbmRleDsKKyAgICAgICAgdWludDMyX3QgbUFkdmFuY2VYOworICAgICAgICB1aW50MzJfdCBtQWR2YW5jZVk7CisgICAgICAgIC8vIFZhbHVlcyBiZWxvdyBjb250YWluIGEgZ2x5cGgncyBvcmlnaW4gaW4gdGhlIGJpdG1hcAorICAgICAgICBpbnQzMl90IG1CaXRtYXBMZWZ0OworICAgICAgICBpbnQzMl90IG1CaXRtYXBUb3A7CisgICAgfTsKKworICAgIEZvbnQoRm9udFJlbmRlcmVyKiBzdGF0ZSwgdWludDMyX3QgZm9udElkLCBmbG9hdCBmb250U2l6ZSk7CisKKyAgICBEZWZhdWx0S2V5ZWRWZWN0b3I8aW50MzJfdCwgQ2FjaGVkR2x5cGhJbmZvKj4gbUNhY2hlZEdseXBoczsKKworICAgIHZvaWQgaW52YWxpZGF0ZVRleHR1cmVDYWNoZSgpOworCisgICAgQ2FjaGVkR2x5cGhJbmZvKiBjYWNoZUdseXBoKFNrUGFpbnQqIHBhaW50LCBpbnQzMl90IGdseXBoKTsKKyAgICB2b2lkIHVwZGF0ZUdseXBoQ2FjaGUoU2tQYWludCogcGFpbnQsIGNvbnN0IFNrR2x5cGgmIHNraWFHbHlwaCwgQ2FjaGVkR2x5cGhJbmZvICpnbHlwaCk7CisgICAgdm9pZCBtZWFzdXJlQ2FjaGVkR2x5cGgoQ2FjaGVkR2x5cGhJbmZvICpnbHlwaCwgaW50IHgsIGludCB5LCBSZWN0ICpib3VuZHMpOworICAgIHZvaWQgZHJhd0NhY2hlZEdseXBoKENhY2hlZEdseXBoSW5mbyAqZ2x5cGgsIGludCB4LCBpbnQgeSk7CisgICAgdm9pZCBkcmF3Q2FjaGVkR2x5cGgoQ2FjaGVkR2x5cGhJbmZvICpnbHlwaCwgaW50IHgsIGludCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpiaXRtYXAsIHVpbnQzMl90IGJpdG1hcFcsIHVpbnQzMl90IGJpdG1hcEgpOworCisgICAgQ2FjaGVkR2x5cGhJbmZvKiBnZXRDYWNoZWRVVEZDaGFyKFNrUGFpbnQqIHBhaW50LCBpbnQzMl90IHV0ZkNoYXIpOworCisgICAgRm9udFJlbmRlcmVyKiBtU3RhdGU7CisgICAgdWludDMyX3QgbUZvbnRJZDsKKyAgICBmbG9hdCBtRm9udFNpemU7Cit9OworCitjbGFzcyBGb250UmVuZGVyZXIgeworcHVibGljOgorICAgIEZvbnRSZW5kZXJlcigpOworICAgIH5Gb250UmVuZGVyZXIoKTsKKworICAgIHZvaWQgaW5pdCgpOworICAgIHZvaWQgZGVpbml0KCk7CisKKyAgICB2b2lkIHNldEZvbnQoU2tQYWludCogcGFpbnQsIHVpbnQzMl90IGZvbnRJZCwgZmxvYXQgZm9udFNpemUpOworICAgIHZvaWQgcmVuZGVyVGV4dChTa1BhaW50KiBwYWludCwgY29uc3QgUmVjdCogY2xpcCwgY29uc3QgY2hhciAqdGV4dCwgdWludDMyX3Qgc3RhcnRJbmRleCwKKyAgICAgICAgICAgIHVpbnQzMl90IGxlbiwgaW50IG51bUdseXBocywgaW50IHgsIGludCB5KTsKKworICAgIHN0cnVjdCBEcm9wU2hhZG93IHsKKyAgICAgICAgRHJvcFNoYWRvdygpIHsgfTsKKworICAgICAgICBEcm9wU2hhZG93KGNvbnN0IERyb3BTaGFkb3cmIGRyb3BTaGFkb3cpOgorICAgICAgICAgICAgd2lkdGgoZHJvcFNoYWRvdy53aWR0aCksIGhlaWdodChkcm9wU2hhZG93LmhlaWdodCksCisgICAgICAgICAgICBpbWFnZShkcm9wU2hhZG93LmltYWdlKSwgcGVuWChkcm9wU2hhZG93LnBlblgpLAorICAgICAgICAgICAgcGVuWShkcm9wU2hhZG93LnBlblkpIHsKKyAgICAgICAgfQorCisgICAgICAgIHVpbnQzMl90IHdpZHRoOworICAgICAgICB1aW50MzJfdCBoZWlnaHQ7CisgICAgICAgIHVpbnQ4X3QqIGltYWdlOworICAgICAgICBpbnQzMl90IHBlblg7CisgICAgICAgIGludDMyX3QgcGVuWTsKKyAgICB9OworCisgICAgLy8gQWZ0ZXIgcmVuZGVyRHJvcFNoYWRvdyByZXR1cm5zLCB0aGUgY2FsbGVkIG93bnMgdGhlIG1lbW9yeSBpbiBEcm9wU2hhZG93LmltYWdlCisgICAgLy8gYW5kIGlzIHJlc3BvbnNpYmxlIGZvciByZWxlYXNpbmcgaXQgd2hlbiBpdCdzIGRvbmUgd2l0aCBpdAorICAgIERyb3BTaGFkb3cgcmVuZGVyRHJvcFNoYWRvdyhTa1BhaW50KiBwYWludCwgY29uc3QgY2hhciAqdGV4dCwgdWludDMyX3Qgc3RhcnRJbmRleCwKKyAgICAgICAgICAgIHVpbnQzMl90IGxlbiwgaW50IG51bUdseXBocywgdWludDMyX3QgcmFkaXVzKTsKKworICAgIEdMdWludCBnZXRUZXh0dXJlKCkgeworICAgICAgICBjaGVja0luaXQoKTsKKyAgICAgICAgcmV0dXJuIG1UZXh0dXJlSWQ7CisgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgZnJpZW5kIGNsYXNzIEZvbnQ7CisKKyAgICBzdHJ1Y3QgQ2FjaGVUZXh0dXJlTGluZSB7CisgICAgICAgIHVpbnQxNl90IG1NYXhIZWlnaHQ7CisgICAgICAgIHVpbnQxNl90IG1NYXhXaWR0aDsKKyAgICAgICAgdWludDMyX3QgbUN1cnJlbnRSb3c7CisgICAgICAgIHVpbnQzMl90IG1DdXJyZW50Q29sOworICAgICAgICBib29sIG1EaXJ0eTsKKworICAgICAgICBDYWNoZVRleHR1cmVMaW5lKHVpbnQxNl90IG1heFdpZHRoLCB1aW50MTZfdCBtYXhIZWlnaHQsIHVpbnQzMl90IGN1cnJlbnRSb3csCisgICAgICAgICAgICAgICAgdWludDMyX3QgY3VycmVudENvbCk6CisgICAgICAgICAgICAgICAgICAgIG1NYXhIZWlnaHQobWF4SGVpZ2h0KSwKKyAgICAgICAgICAgICAgICAgICAgbU1heFdpZHRoKG1heFdpZHRoKSwKKyAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRSb3coY3VycmVudFJvdyksCisgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50Q29sKGN1cnJlbnRDb2wpLAorICAgICAgICAgICAgICAgICAgICBtRGlydHkoZmFsc2UpIHsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2wgZml0Qml0bWFwKGNvbnN0IFNrR2x5cGgmIGdseXBoLCB1aW50MzJfdCAqcmV0T3JpZ2luWCwgdWludDMyX3QgKnJldE9yaWdpblkpIHsKKyAgICAgICAgICAgIGlmIChnbHlwaC5mSGVpZ2h0ID4gbU1heEhlaWdodCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1DdXJyZW50Q29sICsgZ2x5cGguZldpZHRoIDwgbU1heFdpZHRoKSB7CisgICAgICAgICAgICAgICAgKnJldE9yaWdpblggPSBtQ3VycmVudENvbDsKKyAgICAgICAgICAgICAgICAqcmV0T3JpZ2luWSA9IG1DdXJyZW50Um93OworICAgICAgICAgICAgICAgIG1DdXJyZW50Q29sICs9IGdseXBoLmZXaWR0aDsKKyAgICAgICAgICAgICAgICBtRGlydHkgPSB0cnVlOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9OworCisgICAgdWludDMyX3QgZ2V0Q2FjaGVXaWR0aCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1DYWNoZVdpZHRoOworICAgIH0KKworICAgIHVpbnQzMl90IGdldENhY2hlSGVpZ2h0KCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUNhY2hlSGVpZ2h0OworICAgIH0KKworICAgIHZvaWQgaW5pdFRleHRUZXh0dXJlKCk7CisgICAgYm9vbCBjYWNoZUJpdG1hcChjb25zdCBTa0dseXBoJiBnbHlwaCwgdWludDMyX3QgKnJldE9yaWdpblgsIHVpbnQzMl90ICpyZXRPcmlnaW5ZKTsKKworICAgIHZvaWQgZmx1c2hBbGxBbmRJbnZhbGlkYXRlKCk7CisgICAgdm9pZCBpbml0VmVydGV4QXJyYXlCdWZmZXJzKCk7CisKKyAgICB2b2lkIGNoZWNrSW5pdCgpOworCisgICAgU3RyaW5nMTYgbUxhdGluUHJlY2FjaGU7CisgICAgdm9pZCBwcmVjYWNoZUxhdGluKFNrUGFpbnQqIHBhaW50KTsKKworICAgIHZvaWQgaXNzdWVEcmF3Q29tbWFuZCgpOworICAgIHZvaWQgYXBwZW5kTWVzaFF1YWQoZmxvYXQgeDEsIGZsb2F0IHkxLCBmbG9hdCB6MSwgZmxvYXQgdTEsIGZsb2F0IHYxLCBmbG9hdCB4MiwgZmxvYXQgeTIsCisgICAgICAgICAgICBmbG9hdCB6MiwgZmxvYXQgdTIsIGZsb2F0IHYyLCBmbG9hdCB4MywgZmxvYXQgeTMsIGZsb2F0IHozLCBmbG9hdCB1MywgZmxvYXQgdjMsCisgICAgICAgICAgICBmbG9hdCB4NCwgZmxvYXQgeTQsIGZsb2F0IHo0LCBmbG9hdCB1NCwgZmxvYXQgdjQpOworCisgICAgdWludDMyX3QgbUNhY2hlV2lkdGg7CisgICAgdWludDMyX3QgbUNhY2hlSGVpZ2h0OworCisgICAgVmVjdG9yPENhY2hlVGV4dHVyZUxpbmUqPiBtQ2FjaGVMaW5lczsKKyAgICB1aW50MzJfdCBnZXRSZW1haW5pbmdDYWNoZUNhcGFjaXR5KCk7CisKKyAgICBGb250KiBtQ3VycmVudEZvbnQ7CisgICAgVmVjdG9yPEZvbnQqPiBtQWN0aXZlRm9udHM7CisKKyAgICAvLyBUZXh0dXJlIHRvIGNhY2hlIGdseXBoIGJpdG1hcHMKKyAgICB1aW50OF90KiBtVGV4dFRleHR1cmU7CisgICAgY29uc3QgdWludDhfdCogZ2V0VGV4dFRleHR1cmVEYXRhKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVRleHRUZXh0dXJlOworICAgIH0KKyAgICBHTHVpbnQgbVRleHR1cmVJZDsKKyAgICB2b2lkIGNoZWNrVGV4dHVyZVVwZGF0ZSgpOworICAgIGJvb2wgbVVwbG9hZFRleHR1cmU7CisKKyAgICAvLyBQb2ludGVyIHRvIHZlcnRleCBkYXRhIHRvIHNwZWVkIHVwIGZyYW1lIHRvIGZyYW1lIHdvcmsKKyAgICBmbG9hdCAqbVRleHRNZXNoUHRyOworICAgIHVpbnQzMl90IG1DdXJyZW50UXVhZEluZGV4OworICAgIHVpbnQzMl90IG1NYXhOdW1iZXJPZlF1YWRzOworCisgICAgdWludDMyX3QgbUluZGV4QnVmZmVySUQ7CisKKyAgICBjb25zdCBSZWN0KiBtQ2xpcDsKKworICAgIGJvb2wgbUluaXRpYWxpemVkOworCisgICAgdm9pZCBjb21wdXRlR2F1c3NpYW5XZWlnaHRzKGZsb2F0KiB3ZWlnaHRzLCBpbnQzMl90IHJhZGl1cyk7CisgICAgdm9pZCBob3Jpem9udGFsQmx1cihmbG9hdCogd2VpZ2h0cywgaW50MzJfdCByYWRpdXMsIGNvbnN0IHVpbnQ4X3QgKnNvdXJjZSwgdWludDhfdCAqZGVzdCwKKyAgICAgICAgICAgIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0KTsKKyAgICB2b2lkIHZlcnRpY2FsQmx1cihmbG9hdCogd2VpZ2h0cywgaW50MzJfdCByYWRpdXMsIGNvbnN0IHVpbnQ4X3QgKnNvdXJjZSwgdWludDhfdCAqZGVzdCwKKyAgICAgICAgICAgIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0KTsKKyAgICB2b2lkIGJsdXJJbWFnZSh1aW50OF90KiBpbWFnZSwgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQsIGludDMyX3QgcmFkaXVzKTsKK307CisKK307IC8vIG5hbWVzcGFjZSB1aXJlbmRlcmVyCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9VSV9GT05UX1JFTkRFUkVSX0gKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9HZW5lcmF0aW9uQ2FjaGUuaCBiL2xpYnMvaHd1aS9HZW5lcmF0aW9uQ2FjaGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzU4YzgwCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL0dlbmVyYXRpb25DYWNoZS5oCkBAIC0wLDAgKzEsMjM0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1VJX0dFTkVSQVRJT05fQ0FDSEVfSAorI2RlZmluZSBBTkRST0lEX1VJX0dFTkVSQVRJT05fQ0FDSEVfSAorCisjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSB1aXJlbmRlcmVyIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgRW50cnlLZXksIHR5cGVuYW1lIEVudHJ5VmFsdWU+CitjbGFzcyBPbkVudHJ5UmVtb3ZlZCB7CitwdWJsaWM6CisgICAgdmlydHVhbCB+T25FbnRyeVJlbW92ZWQoKSB7IH07CisgICAgdmlydHVhbCB2b2lkIG9wZXJhdG9yKCkoRW50cnlLZXkmIGtleSwgRW50cnlWYWx1ZSYgdmFsdWUpID0gMDsKK307IC8vIGNsYXNzIE9uRW50cnlSZW1vdmVkCisKK3RlbXBsYXRlPHR5cGVuYW1lIEVudHJ5S2V5LCB0eXBlbmFtZSBFbnRyeVZhbHVlPgorc3RydWN0IEVudHJ5OiBwdWJsaWMgTGlnaHRSZWZCYXNlPEVudHJ5PEVudHJ5S2V5LCBFbnRyeVZhbHVlPiA+IHsKKyAgICBFbnRyeSgpIHsgfQorICAgIEVudHJ5KGNvbnN0IEVudHJ5PEVudHJ5S2V5LCBFbnRyeVZhbHVlPiYgZSk6CisgICAgICAgICAgICBrZXkoZS5rZXkpLCB2YWx1ZShlLnZhbHVlKSwgcGFyZW50KGUucGFyZW50KSwgY2hpbGQoZS5jaGlsZCkgeyB9CisgICAgRW50cnkoc3A8RW50cnk8RW50cnlLZXksIEVudHJ5VmFsdWU+ID4gZSk6CisgICAgICAgICAgICBrZXkoZS0+a2V5KSwgdmFsdWUoZS0+dmFsdWUpLCBwYXJlbnQoZS0+cGFyZW50KSwgY2hpbGQoZS0+Y2hpbGQpIHsgfQorCisgICAgRW50cnlLZXkga2V5OworICAgIEVudHJ5VmFsdWUgdmFsdWU7CisKKyAgICBzcDxFbnRyeTxFbnRyeUtleSwgRW50cnlWYWx1ZT4gPiBwYXJlbnQ7CisgICAgc3A8RW50cnk8RW50cnlLZXksIEVudHJ5VmFsdWU+ID4gY2hpbGQ7Cit9OyAvLyBzdHJ1Y3QgRW50cnkKKwordGVtcGxhdGU8dHlwZW5hbWUgSywgdHlwZW5hbWUgVj4KK2NsYXNzIEdlbmVyYXRpb25DYWNoZSB7CitwdWJsaWM6CisgICAgR2VuZXJhdGlvbkNhY2hlKHVpbnQzMl90IG1heENhcGFjaXR5KTsKKyAgICB2aXJ0dWFsIH5HZW5lcmF0aW9uQ2FjaGUoKTsKKworICAgIGVudW0gQ2FwYWNpdHkgeworICAgICAgICBrVW5saW1pdGVkQ2FwYWNpdHksCisgICAgfTsKKworICAgIHZvaWQgc2V0T25FbnRyeVJlbW92ZWRMaXN0ZW5lcihPbkVudHJ5UmVtb3ZlZDxLLCBWPiogbGlzdGVuZXIpOworCisgICAgdm9pZCBjbGVhcigpOworCisgICAgYm9vbCBjb250YWlucyhLIGtleSkgY29uc3Q7CisgICAgViBnZXQoSyBrZXkpOworICAgIHZvaWQgcHV0KEsga2V5LCBWIHZhbHVlKTsKKyAgICBWIHJlbW92ZShLIGtleSk7CisgICAgViByZW1vdmVPbGRlc3QoKTsKKworICAgIHVpbnQzMl90IHNpemUoKSBjb25zdDsKKworICAgIHZvaWQgYWRkVG9DYWNoZShzcDxFbnRyeTxLLCBWPiA+IGVudHJ5LCBLIGtleSwgViB2YWx1ZSk7CisgICAgdm9pZCBhdHRhY2hUb0NhY2hlKHNwPEVudHJ5PEssIFY+ID4gZW50cnkpOworICAgIHZvaWQgZGV0YWNoRnJvbUNhY2hlKHNwPEVudHJ5PEssIFY+ID4gZW50cnkpOworCisgICAgViByZW1vdmVBdChzc2l6ZV90IGluZGV4KTsKKworICAgIEtleWVkVmVjdG9yPEssIHNwPEVudHJ5PEssIFY+ID4gPiBtQ2FjaGU7CisgICAgdWludDMyX3QgbU1heENhcGFjaXR5OworCisgICAgT25FbnRyeVJlbW92ZWQ8SywgVj4qIG1MaXN0ZW5lcjsKKworICAgIHNwPEVudHJ5PEssIFY+ID4gbU9sZGVzdDsKKyAgICBzcDxFbnRyeTxLLCBWPiA+IG1Zb3VuZ2VzdDsKK307IC8vIGNsYXNzIEdlbmVyYXRpb25DYWNoZQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBLLCB0eXBlbmFtZSBWPgorR2VuZXJhdGlvbkNhY2hlPEssIFY+OjpHZW5lcmF0aW9uQ2FjaGUodWludDMyX3QgbWF4Q2FwYWNpdHkpOiBtTWF4Q2FwYWNpdHkobWF4Q2FwYWNpdHkpLCBtTGlzdGVuZXIoTlVMTCkgeworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgSywgdHlwZW5hbWUgVj4KK0dlbmVyYXRpb25DYWNoZTxLLCBWPjo6fkdlbmVyYXRpb25DYWNoZSgpIHsKKyAgICBjbGVhcigpOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgSywgdHlwZW5hbWUgVj4KK3VpbnQzMl90IEdlbmVyYXRpb25DYWNoZTxLLCBWPjo6c2l6ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUNhY2hlLnNpemUoKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgSywgdHlwZW5hbWUgVj4KK3ZvaWQgR2VuZXJhdGlvbkNhY2hlPEssIFY+OjpzZXRPbkVudHJ5UmVtb3ZlZExpc3RlbmVyKE9uRW50cnlSZW1vdmVkPEssIFY+KiBsaXN0ZW5lcikgeworICAgIG1MaXN0ZW5lciA9IGxpc3RlbmVyOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBLLCB0eXBlbmFtZSBWPgordm9pZCBHZW5lcmF0aW9uQ2FjaGU8SywgVj46OmNsZWFyKCkgeworICAgIGlmIChtTGlzdGVuZXIpIHsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG1DYWNoZS5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgc3A8RW50cnk8SywgVj4gPiBlbnRyeSA9IG1DYWNoZS52YWx1ZUF0KGkpOworICAgICAgICAgICAgaWYgKG1MaXN0ZW5lcikgeworICAgICAgICAgICAgICAgICgqbUxpc3RlbmVyKShlbnRyeS0+a2V5LCBlbnRyeS0+dmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIG1DYWNoZS5jbGVhcigpOworICAgIG1Zb3VuZ2VzdC5jbGVhcigpOworICAgIG1PbGRlc3QuY2xlYXIoKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgSywgdHlwZW5hbWUgVj4KK2Jvb2wgR2VuZXJhdGlvbkNhY2hlPEssIFY+Ojpjb250YWlucyhLIGtleSkgY29uc3QgeworICAgIHJldHVybiBtQ2FjaGUuaW5kZXhPZktleShrZXkpID49IDA7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIEssIHR5cGVuYW1lIFY+CitWIEdlbmVyYXRpb25DYWNoZTxLLCBWPjo6Z2V0KEsga2V5KSB7CisgICAgc3NpemVfdCBpbmRleCA9IG1DYWNoZS5pbmRleE9mS2V5KGtleSk7CisgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgc3A8RW50cnk8SywgVj4gPiBlbnRyeSA9IG1DYWNoZS52YWx1ZUF0KGluZGV4KTsKKyAgICAgICAgaWYgKGVudHJ5LmdldCgpKSB7CisgICAgICAgICAgICBkZXRhY2hGcm9tQ2FjaGUoZW50cnkpOworICAgICAgICAgICAgYXR0YWNoVG9DYWNoZShlbnRyeSk7CisgICAgICAgICAgICByZXR1cm4gZW50cnktPnZhbHVlOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIEssIHR5cGVuYW1lIFY+Cit2b2lkIEdlbmVyYXRpb25DYWNoZTxLLCBWPjo6cHV0KEsga2V5LCBWIHZhbHVlKSB7CisgICAgaWYgKG1NYXhDYXBhY2l0eSAhPSBrVW5saW1pdGVkQ2FwYWNpdHkgJiYgbUNhY2hlLnNpemUoKSA+PSBtTWF4Q2FwYWNpdHkpIHsKKyAgICAgICAgcmVtb3ZlT2xkZXN0KCk7CisgICAgfQorCisgICAgc3NpemVfdCBpbmRleCA9IG1DYWNoZS5pbmRleE9mS2V5KGtleSk7CisgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgc3A8RW50cnk8SywgVj4gPiBlbnRyeSA9IG1DYWNoZS52YWx1ZUF0KGluZGV4KTsKKyAgICAgICAgZGV0YWNoRnJvbUNhY2hlKGVudHJ5KTsKKyAgICAgICAgYWRkVG9DYWNoZShlbnRyeSwga2V5LCB2YWx1ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3A8RW50cnk8SywgVj4gPiBlbnRyeSA9IG5ldyBFbnRyeTxLLCBWPjsKKyAgICAgICAgYWRkVG9DYWNoZShlbnRyeSwga2V5LCB2YWx1ZSk7CisgICAgfQorfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBLLCB0eXBlbmFtZSBWPgordm9pZCBHZW5lcmF0aW9uQ2FjaGU8SywgVj46OmFkZFRvQ2FjaGUoc3A8RW50cnk8SywgVj4gPiBlbnRyeSwgSyBrZXksIFYgdmFsdWUpIHsKKyAgICBlbnRyeS0+a2V5ID0ga2V5OworICAgIGVudHJ5LT52YWx1ZSA9IHZhbHVlOworICAgIG1DYWNoZS5hZGQoa2V5LCBlbnRyeSk7CisgICAgYXR0YWNoVG9DYWNoZShlbnRyeSk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIEssIHR5cGVuYW1lIFY+CitWIEdlbmVyYXRpb25DYWNoZTxLLCBWPjo6cmVtb3ZlKEsga2V5KSB7CisgICAgc3NpemVfdCBpbmRleCA9IG1DYWNoZS5pbmRleE9mS2V5KGtleSk7CisgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgcmV0dXJuIHJlbW92ZUF0KGluZGV4KTsKKyAgICB9CisKKyAgICByZXR1cm4gTlVMTDsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgSywgdHlwZW5hbWUgVj4KK1YgR2VuZXJhdGlvbkNhY2hlPEssIFY+OjpyZW1vdmVBdChzc2l6ZV90IGluZGV4KSB7CisgICAgc3A8RW50cnk8SywgVj4gPiBlbnRyeSA9IG1DYWNoZS52YWx1ZUF0KGluZGV4KTsKKyAgICBpZiAobUxpc3RlbmVyKSB7CisgICAgICAgICgqbUxpc3RlbmVyKShlbnRyeS0+a2V5LCBlbnRyeS0+dmFsdWUpOworICAgIH0KKyAgICBtQ2FjaGUucmVtb3ZlSXRlbXNBdChpbmRleCwgMSk7CisgICAgZGV0YWNoRnJvbUNhY2hlKGVudHJ5KTsKKworICAgIHJldHVybiBlbnRyeS0+dmFsdWU7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIEssIHR5cGVuYW1lIFY+CitWIEdlbmVyYXRpb25DYWNoZTxLLCBWPjo6cmVtb3ZlT2xkZXN0KCkgeworICAgIGlmIChtT2xkZXN0LmdldCgpKSB7CisgICAgICAgIHNzaXplX3QgaW5kZXggPSBtQ2FjaGUuaW5kZXhPZktleShtT2xkZXN0LT5rZXkpOworICAgICAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICAgICAgcmV0dXJuIHJlbW92ZUF0KGluZGV4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBOVUxMOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBLLCB0eXBlbmFtZSBWPgordm9pZCBHZW5lcmF0aW9uQ2FjaGU8SywgVj46OmF0dGFjaFRvQ2FjaGUoc3A8RW50cnk8SywgVj4gPiBlbnRyeSkgeworICAgIGlmICghbVlvdW5nZXN0LmdldCgpKSB7CisgICAgICAgIG1Zb3VuZ2VzdCA9IG1PbGRlc3QgPSBlbnRyeTsKKyAgICB9IGVsc2UgeworICAgICAgICBlbnRyeS0+cGFyZW50ID0gbVlvdW5nZXN0OworICAgICAgICBtWW91bmdlc3QtPmNoaWxkID0gZW50cnk7CisgICAgICAgIG1Zb3VuZ2VzdCA9IGVudHJ5OworICAgIH0KK30KKwordGVtcGxhdGU8dHlwZW5hbWUgSywgdHlwZW5hbWUgVj4KK3ZvaWQgR2VuZXJhdGlvbkNhY2hlPEssIFY+OjpkZXRhY2hGcm9tQ2FjaGUoc3A8RW50cnk8SywgVj4gPiBlbnRyeSkgeworICAgIGlmIChlbnRyeS0+cGFyZW50LmdldCgpKSB7CisgICAgICAgIGVudHJ5LT5wYXJlbnQtPmNoaWxkID0gZW50cnktPmNoaWxkOworICAgIH0KKworICAgIGlmIChlbnRyeS0+Y2hpbGQuZ2V0KCkpIHsKKyAgICAgICAgZW50cnktPmNoaWxkLT5wYXJlbnQgPSBlbnRyeS0+cGFyZW50OworICAgIH0KKworICAgIGlmIChtT2xkZXN0ID09IGVudHJ5KSB7CisgICAgICAgIG1PbGRlc3QgPSBlbnRyeS0+Y2hpbGQ7CisgICAgfQorCisgICAgaWYgKG1Zb3VuZ2VzdCA9PSBlbnRyeSkgeworICAgICAgICBtWW91bmdlc3QgPSBlbnRyeS0+cGFyZW50OworICAgIH0KKworICAgIGVudHJ5LT5wYXJlbnQuY2xlYXIoKTsKKyAgICBlbnRyeS0+Y2hpbGQuY2xlYXIoKTsKK30KKworfTsgLy8gbmFtZXNwYWNlIHVpcmVuZGVyZXIKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX1VJX0dFTkVSQVRJT05fQ0FDSEVfSApkaWZmIC0tZ2l0IGEvbGlicy9od3VpL0dyYWRpZW50Q2FjaGUuY3BwIGIvbGlicy9od3VpL0dyYWRpZW50Q2FjaGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4OTIwYmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2h3dWkvR3JhZGllbnRDYWNoZS5jcHAKQEAgLTAsMCArMSwxNzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIk9wZW5HTFJlbmRlcmVyIgorCisjaW5jbHVkZSA8R0xFUzIvZ2wyLmg+CisKKyNpbmNsdWRlIDxTa0NhbnZhcy5oPgorI2luY2x1ZGUgPFNrR3JhZGllbnRTaGFkZXIuaD4KKworI2luY2x1ZGUgIkdyYWRpZW50Q2FjaGUuaCIKKyNpbmNsdWRlICJQcm9wZXJ0aWVzLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSB1aXJlbmRlcmVyIHsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQ29uc3RydWN0b3JzL2Rlc3RydWN0b3IKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworR3JhZGllbnRDYWNoZTo6R3JhZGllbnRDYWNoZSgpOgorICAgICAgICBtQ2FjaGUoR2VuZXJhdGlvbkNhY2hlPFNrU2hhZGVyKiwgVGV4dHVyZSo+OjprVW5saW1pdGVkQ2FwYWNpdHkpLAorICAgICAgICBtU2l6ZSgwKSwgbU1heFNpemUoTUIoREVGQVVMVF9HUkFESUVOVF9DQUNIRV9TSVpFKSkgeworICAgIGNoYXIgcHJvcGVydHlbUFJPUEVSVFlfVkFMVUVfTUFYXTsKKyAgICBpZiAocHJvcGVydHlfZ2V0KFBST1BFUlRZX0dSQURJRU5UX0NBQ0hFX1NJWkUsIHByb3BlcnR5LCBOVUxMKSA+IDApIHsKKyAgICAgICAgTE9HRCgiICBTZXR0aW5nIGdyYWRpZW50IGNhY2hlIHNpemUgdG8gJXNNQiIsIHByb3BlcnR5KTsKKyAgICAgICAgc2V0TWF4U2l6ZShNQihhdG9mKHByb3BlcnR5KSkpOworICAgIH0gZWxzZSB7CisgICAgICAgIExPR0QoIiAgVXNpbmcgZGVmYXVsdCBncmFkaWVudCBjYWNoZSBzaXplIG9mICUuMmZNQiIsIERFRkFVTFRfR1JBRElFTlRfQ0FDSEVfU0laRSk7CisgICAgfQorCisgICAgbUNhY2hlLnNldE9uRW50cnlSZW1vdmVkTGlzdGVuZXIodGhpcyk7Cit9CisKK0dyYWRpZW50Q2FjaGU6OkdyYWRpZW50Q2FjaGUodWludDMyX3QgbWF4Qnl0ZVNpemUpOgorICAgICAgICBtQ2FjaGUoR2VuZXJhdGlvbkNhY2hlPFNrU2hhZGVyKiwgVGV4dHVyZSo+OjprVW5saW1pdGVkQ2FwYWNpdHkpLAorICAgICAgICBtU2l6ZSgwKSwgbU1heFNpemUobWF4Qnl0ZVNpemUpIHsKKyAgICBtQ2FjaGUuc2V0T25FbnRyeVJlbW92ZWRMaXN0ZW5lcih0aGlzKTsKK30KKworR3JhZGllbnRDYWNoZTo6fkdyYWRpZW50Q2FjaGUoKSB7CisgICAgbUNhY2hlLmNsZWFyKCk7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFNpemUgbWFuYWdlbWVudAorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit1aW50MzJfdCBHcmFkaWVudENhY2hlOjpnZXRTaXplKCkgeworICAgIHJldHVybiBtU2l6ZTsKK30KKwordWludDMyX3QgR3JhZGllbnRDYWNoZTo6Z2V0TWF4U2l6ZSgpIHsKKyAgICByZXR1cm4gbU1heFNpemU7Cit9CisKK3ZvaWQgR3JhZGllbnRDYWNoZTo6c2V0TWF4U2l6ZSh1aW50MzJfdCBtYXhTaXplKSB7CisgICAgbU1heFNpemUgPSBtYXhTaXplOworICAgIHdoaWxlIChtU2l6ZSA+IG1NYXhTaXplKSB7CisgICAgICAgIG1DYWNoZS5yZW1vdmVPbGRlc3QoKTsKKyAgICB9Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENhbGxiYWNrcworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit2b2lkIEdyYWRpZW50Q2FjaGU6Om9wZXJhdG9yKCkoU2tTaGFkZXIqJiBzaGFkZXIsIFRleHR1cmUqJiB0ZXh0dXJlKSB7CisgICAgaWYgKHNoYWRlcikgeworICAgICAgICBjb25zdCB1aW50MzJfdCBzaXplID0gdGV4dHVyZS0+d2lkdGggKiB0ZXh0dXJlLT5oZWlnaHQgKiA0OworICAgICAgICBtU2l6ZSAtPSBzaXplOworICAgIH0KKworICAgIGlmICh0ZXh0dXJlKSB7CisgICAgICAgIGdsRGVsZXRlVGV4dHVyZXMoMSwgJnRleHR1cmUtPmlkKTsKKyAgICAgICAgZGVsZXRlIHRleHR1cmU7CisgICAgfQorfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDYWNoaW5nCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK1RleHR1cmUqIEdyYWRpZW50Q2FjaGU6OmdldChTa1NoYWRlciogc2hhZGVyKSB7CisgICAgcmV0dXJuIG1DYWNoZS5nZXQoc2hhZGVyKTsKK30KKwordm9pZCBHcmFkaWVudENhY2hlOjpyZW1vdmUoU2tTaGFkZXIqIHNoYWRlcikgeworICAgIG1DYWNoZS5yZW1vdmUoc2hhZGVyKTsKK30KKwordm9pZCBHcmFkaWVudENhY2hlOjpjbGVhcigpIHsKKyAgICBtQ2FjaGUuY2xlYXIoKTsKK30KKworVGV4dHVyZSogR3JhZGllbnRDYWNoZTo6YWRkTGluZWFyR3JhZGllbnQoU2tTaGFkZXIqIHNoYWRlciwgZmxvYXQqIGJvdW5kcywgdWludDMyX3QqIGNvbG9ycywKKyAgICAgICAgZmxvYXQqIHBvc2l0aW9ucywgaW50IGNvdW50LCBTa1NoYWRlcjo6VGlsZU1vZGUgdGlsZU1vZGUpIHsKKyAgICBTa0JpdG1hcCBiaXRtYXA7CisgICAgYml0bWFwLnNldENvbmZpZyhTa0JpdG1hcDo6a0FSR0JfODg4OF9Db25maWcsIDEwMjQsIDEpOworICAgIGJpdG1hcC5hbGxvY1BpeGVscygpOworICAgIGJpdG1hcC5lcmFzZUNvbG9yKDApOworCisgICAgU2tDYW52YXMgY2FudmFzKGJpdG1hcCk7CisKKyAgICBTa1BvaW50IHBvaW50c1syXTsKKyAgICBwb2ludHNbMF0uc2V0KDAuMGYsIDAuMGYpOworICAgIHBvaW50c1sxXS5zZXQoYml0bWFwLndpZHRoKCksIDAuMGYpOworCisgICAgU2tTaGFkZXIqIGxvY2FsU2hhZGVyID0gU2tHcmFkaWVudFNoYWRlcjo6Q3JlYXRlTGluZWFyKHBvaW50cywKKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgU2tDb2xvcio+KGNvbG9ycyksIHBvc2l0aW9ucywgY291bnQsIHRpbGVNb2RlKTsKKworICAgIFNrUGFpbnQgcDsKKyAgICBwLnNldFN0eWxlKFNrUGFpbnQ6OmtTdHJva2VBbmRGaWxsX1N0eWxlKTsKKyAgICBwLnNldFNoYWRlcihsb2NhbFNoYWRlciktPnVucmVmKCk7CisKKyAgICBjYW52YXMuZHJhd1JlY3RDb29yZHMoMC4wZiwgMC4wZiwgYml0bWFwLndpZHRoKCksIDEuMGYsIHApOworCisgICAgLy8gQXN1bWUgdGhlIGNhY2hlIGlzIGFsd2F5cyBiaWcgZW5vdWdoCisgICAgY29uc3QgdWludDMyX3Qgc2l6ZSA9IGJpdG1hcC5yb3dCeXRlcygpICogYml0bWFwLmhlaWdodCgpOworICAgIHdoaWxlIChtU2l6ZSArIHNpemUgPiBtTWF4U2l6ZSkgeworICAgICAgICBtQ2FjaGUucmVtb3ZlT2xkZXN0KCk7CisgICAgfQorCisgICAgVGV4dHVyZSogdGV4dHVyZSA9IG5ldyBUZXh0dXJlOworICAgIGdlbmVyYXRlVGV4dHVyZSgmYml0bWFwLCB0ZXh0dXJlKTsKKworICAgIG1TaXplICs9IHNpemU7CisgICAgbUNhY2hlLnB1dChzaGFkZXIsIHRleHR1cmUpOworCisgICAgcmV0dXJuIHRleHR1cmU7Cit9CisKK3ZvaWQgR3JhZGllbnRDYWNoZTo6Z2VuZXJhdGVUZXh0dXJlKFNrQml0bWFwKiBiaXRtYXAsIFRleHR1cmUqIHRleHR1cmUpIHsKKyAgICBTa0F1dG9Mb2NrUGl4ZWxzIGF1dG9Mb2NrKCpiaXRtYXApOworICAgIGlmICghYml0bWFwLT5yZWFkeVRvRHJhdygpKSB7CisgICAgICAgIExPR0UoIkNhbm5vdCBnZW5lcmF0ZSB0ZXh0dXJlIGZyb20gc2hhZGVyIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB0ZXh0dXJlLT5nZW5lcmF0aW9uID0gYml0bWFwLT5nZXRHZW5lcmF0aW9uSUQoKTsKKyAgICB0ZXh0dXJlLT53aWR0aCA9IGJpdG1hcC0+d2lkdGgoKTsKKyAgICB0ZXh0dXJlLT5oZWlnaHQgPSBiaXRtYXAtPmhlaWdodCgpOworCisgICAgZ2xHZW5UZXh0dXJlcygxLCAmdGV4dHVyZS0+aWQpOworCisgICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCB0ZXh0dXJlLT5pZCk7CisgICAgZ2xQaXhlbFN0b3JlaShHTF9VTlBBQ0tfQUxJR05NRU5ULCBiaXRtYXAtPmJ5dGVzUGVyUGl4ZWwoKSk7CisKKyAgICB0ZXh0dXJlLT5ibGVuZCA9ICFiaXRtYXAtPmlzT3BhcXVlKCk7CisgICAgZ2xUZXhJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIEdMX1JHQkEsIGJpdG1hcC0+cm93Qnl0ZXNBc1BpeGVscygpLCB0ZXh0dXJlLT5oZWlnaHQsIDAsCisgICAgICAgICAgICBHTF9SR0JBLCBHTF9VTlNJR05FRF9CWVRFLCBiaXRtYXAtPmdldFBpeGVscygpKTsKKworICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01JTl9GSUxURVIsIEdMX0xJTkVBUik7CisgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUFHX0ZJTFRFUiwgR0xfTElORUFSKTsKKworICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX1dSQVBfUywgR0xfQ0xBTVBfVE9fRURHRSk7CisgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9ULCBHTF9DTEFNUF9UT19FREdFKTsKK30KKworfTsgLy8gbmFtZXNwYWNlIHVpcmVuZGVyZXIKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJzL2h3dWkvR3JhZGllbnRDYWNoZS5oIGIvbGlicy9od3VpL0dyYWRpZW50Q2FjaGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Nzk1OTIwCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL0dyYWRpZW50Q2FjaGUuaApAQCAtMCwwICsxLDkwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1VJX0dSQURJRU5UX0NBQ0hFX0gKKyNkZWZpbmUgQU5EUk9JRF9VSV9HUkFESUVOVF9DQUNIRV9ICisKKyNpbmNsdWRlIDxTa1NoYWRlci5oPgorCisjaW5jbHVkZSAiVGV4dHVyZS5oIgorI2luY2x1ZGUgIkdlbmVyYXRpb25DYWNoZS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgdWlyZW5kZXJlciB7CisKKy8qKgorICogQSBzaW1wbGUgTFJVIGdyYWRpZW50IGNhY2hlLiBUaGUgY2FjaGUgaGFzIGEgbWF4aW11bSBzaXplIGV4cHJlc3NlZCBpbiBieXRlcy4KKyAqIEFueSB0ZXh0dXJlIGFkZGVkIHRvIHRoZSBjYWNoZSBjYXVzaW5nIHRoZSBjYWNoZSB0byBncm93IGJleW9uZCB0aGUgbWF4aW11bQorICogYWxsb3dlZCBzaXplIHdpbGwgYWxzbyBjYXVzZSB0aGUgb2xkZXN0IHRleHR1cmUgdG8gYmUga2lja2VkIG91dC4KKyAqLworY2xhc3MgR3JhZGllbnRDYWNoZTogcHVibGljIE9uRW50cnlSZW1vdmVkPFNrU2hhZGVyKiwgVGV4dHVyZSo+IHsKK3B1YmxpYzoKKyAgICBHcmFkaWVudENhY2hlKCk7CisgICAgR3JhZGllbnRDYWNoZSh1aW50MzJfdCBtYXhCeXRlU2l6ZSk7CisgICAgfkdyYWRpZW50Q2FjaGUoKTsKKworICAgIC8qKgorICAgICAqIFVzZWQgYXMgYSBjYWxsYmFjayB3aGVuIGFuIGVudHJ5IGlzIHJlbW92ZWQgZnJvbSB0aGUgY2FjaGUuCisgICAgICogRG8gbm90IGludm9rZSBkaXJlY3RseS4KKyAgICAgKi8KKyAgICB2b2lkIG9wZXJhdG9yKCkoU2tTaGFkZXIqJiBzaGFkZXIsIFRleHR1cmUqJiB0ZXh0dXJlKTsKKworICAgIC8qKgorICAgICAqIEFkZHMgYSBuZXcgbGluZWFyIGdyYWRpZW50IHRvIHRoZSBjYWNoZS4gVGhlIGdlbmVyYXRlZCB0ZXh0dXJlIGlzCisgICAgICogcmV0dXJuZWQuCisgICAgICovCisgICAgVGV4dHVyZSogYWRkTGluZWFyR3JhZGllbnQoU2tTaGFkZXIqIHNoYWRlciwgZmxvYXQqIGJvdW5kcywgdWludDMyX3QqIGNvbG9ycywKKyAgICAgICAgICAgIGZsb2F0KiBwb3NpdGlvbnMsIGludCBjb3VudCwgU2tTaGFkZXI6OlRpbGVNb2RlIHRpbGVNb2RlKTsKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB0ZXh0dXJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIHNoYWRlci4KKyAgICAgKi8KKyAgICBUZXh0dXJlKiBnZXQoU2tTaGFkZXIqIHNoYWRlcik7CisgICAgLyoqCisgICAgICogUmVtb3ZlcyB0aGUgdGV4dHVyZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBzaGFkZXIuIFJldHVybnMgTlVMTAorICAgICAqIGlmIHRoZSB0ZXh0dXJlIGNhbm5vdCBiZSBmb3VuZC4gVXBvbiByZW1vdmUgdGhlIHRleHR1cmUgaXMgZnJlZWQuCisgICAgICovCisgICAgdm9pZCByZW1vdmUoU2tTaGFkZXIqIHNoYWRlcik7CisgICAgLyoqCisgICAgICogQ2xlYXJzIHRoZSBjYWNoZS4gVGhpcyBjYXVzZXMgYWxsIHRleHR1cmVzIHRvIGJlIGRlbGV0ZWQuCisgICAgICovCisgICAgdm9pZCBjbGVhcigpOworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgbWF4aW11bSBzaXplIG9mIHRoZSBjYWNoZSBpbiBieXRlcy4KKyAgICAgKi8KKyAgICB2b2lkIHNldE1heFNpemUodWludDMyX3QgbWF4U2l6ZSk7CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbWF4aW11bSBzaXplIG9mIHRoZSBjYWNoZSBpbiBieXRlcy4KKyAgICAgKi8KKyAgICB1aW50MzJfdCBnZXRNYXhTaXplKCk7CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY3VycmVudCBzaXplIG9mIHRoZSBjYWNoZSBpbiBieXRlcy4KKyAgICAgKi8KKyAgICB1aW50MzJfdCBnZXRTaXplKCk7CisKK3ByaXZhdGU6CisgICAgdm9pZCBnZW5lcmF0ZVRleHR1cmUoU2tCaXRtYXAqIGJpdG1hcCwgVGV4dHVyZSogdGV4dHVyZSk7CisKKyAgICBHZW5lcmF0aW9uQ2FjaGU8U2tTaGFkZXIqLCBUZXh0dXJlKj4gbUNhY2hlOworCisgICAgdWludDMyX3QgbVNpemU7CisgICAgdWludDMyX3QgbU1heFNpemU7Cit9OyAvLyBjbGFzcyBHcmFkaWVudENhY2hlCisKK307IC8vIG5hbWVzcGFjZSB1aXJlbmRlcmVyCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9VSV9HUkFESUVOVF9DQUNIRV9ICmRpZmYgLS1naXQgYS9saWJzL2h3dWkvTGF5ZXIuaCBiL2xpYnMvaHd1aS9MYXllci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0ZGI3ODIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2h3dWkvTGF5ZXIuaApAQCAtMCwwICsxLDk5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1VJX0xBWUVSX0gKKyNkZWZpbmUgQU5EUk9JRF9VSV9MQVlFUl9ICisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgorCisjaW5jbHVkZSA8U2tYZmVybW9kZS5oPgorCisjaW5jbHVkZSAiUmVjdC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgdWlyZW5kZXJlciB7CisKKy8qKgorICogRGltZW5zaW9ucyBvZiBhIGxheWVyLgorICovCitzdHJ1Y3QgTGF5ZXJTaXplIHsKKyAgICBMYXllclNpemUoKTogd2lkdGgoMCksIGhlaWdodCgwKSwgaWQoMCkgeyB9CisgICAgTGF5ZXJTaXplKGNvbnN0IHVpbnQzMl90IHdpZHRoLCBjb25zdCB1aW50MzJfdCBoZWlnaHQpOiB3aWR0aCh3aWR0aCksIGhlaWdodChoZWlnaHQpLCBpZCgwKSB7IH0KKyAgICBMYXllclNpemUoY29uc3QgTGF5ZXJTaXplJiBzaXplKTogd2lkdGgoc2l6ZS53aWR0aCksIGhlaWdodChzaXplLmhlaWdodCksIGlkKHNpemUuaWQpIHsgfQorCisgICAgdWludDMyX3Qgd2lkdGg7CisgICAgdWludDMyX3QgaGVpZ2h0OworCisgICAgLy8gSW5jcmVtZW50YWwgaWQgdXNlZCBieSB0aGUgbGF5ZXIgY2FjaGUgdG8gc3RvcmUgbXVsdGlwbGUKKyAgICAvLyBMYXllclNpemUgd2l0aCB0aGUgc2FtZSBkaW1lbnNpb25zCisgICAgdWludDMyX3QgaWQ7CisKKyAgICBib29sIG9wZXJhdG9yPChjb25zdCBMYXllclNpemUmIHJocykgY29uc3QgeworICAgICAgICBpZiAoaWQgIT0gMCAmJiByaHMuaWQgIT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIGlkIDwgcmhzLmlkOworICAgICAgICB9CisgICAgICAgIGlmICh3aWR0aCA9PSByaHMud2lkdGgpIHsKKyAgICAgICAgICAgIHJldHVybiBoZWlnaHQgPCByaHMuaGVpZ2h0OworICAgICAgICB9CisgICAgICAgIHJldHVybiB3aWR0aCA8IHJocy53aWR0aDsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgTGF5ZXJTaXplJiByaHMpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIHdpZHRoID09IHJocy53aWR0aCAmJiBoZWlnaHQgPT0gcmhzLmhlaWdodDsKKyAgICB9Cit9OyAvLyBzdHJ1Y3QgTGF5ZXJTaXplCisKKy8qKgorICogQSBsYXllciBoYXMgZGltZW5zaW9ucyBhbmQgaXMgYmFja2VkIGJ5IGFuIE9wZW5HTCB0ZXh0dXJlLgorICovCitzdHJ1Y3QgTGF5ZXIgeworICAgIC8qKgorICAgICAqIENvb3JkaW5hdGVzIG9mIHRoZSBsYXllciBjb3JyZXNwb25kaW5nIHRvIHRoaXMgc25hcHNob3QuCisgICAgICogT25seSBzZXQgd2hlbiB0aGUgZmxhZyBrRmxhZ0lzTGF5ZXIgaXMgc2V0LgorICAgICAqLworICAgIFJlY3QgbGF5ZXI7CisgICAgLyoqCisgICAgICogTmFtZSBvZiB0aGUgdGV4dHVyZSB1c2VkIHRvIHJlbmRlciB0aGUgbGF5ZXIuCisgICAgICogT25seSBzZXQgd2hlbiB0aGUgZmxhZyBrRmxhZ0lzTGF5ZXIgaXMgc2V0LgorICAgICAqLworICAgIEdMdWludCB0ZXh0dXJlOworICAgIC8qKgorICAgICAqIE5hbWUgb2YgdGhlIEZCTyB1c2VkIHRvIHJlbmRlciB0aGUgbGF5ZXIuCisgICAgICogT25seSBzZXQgd2hlbiB0aGUgZmxhZyBrRmxhZ0lzTGF5ZXIgaXMgc2V0LgorICAgICAqLworICAgIEdMdWludCBmYm87CisgICAgLyoqCisgICAgICogT3BhY2l0eSBvZiB0aGUgbGF5ZXIuCisgICAgICogT25seSBzZXQgd2hlbiB0aGUgZmxhZyBrRmxhZ0lzTGF5ZXIgaXMgc2V0LgorICAgICAqLworICAgIGZsb2F0IGFscGhhOworICAgIC8qKgorICAgICAqIEJsZW5kaW5nIG1vZGUgb2YgdGhlIGxheWVyLgorICAgICAqIE9ubHkgc2V0IHdoZW4gdGhlIGZsYWcga0ZsYWdJc0xheWVyIGlzIHNldC4KKyAgICAgKi8KKyAgICBTa1hmZXJtb2RlOjpNb2RlIG1vZGU7CisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBsYXllciBzaG91bGQgYmUgYmxlbmRlZC4KKyAgICAgKi8KKyAgICBib29sIGJsZW5kOworfTsgLy8gc3RydWN0IExheWVyCisKK307IC8vIG5hbWVzcGFjZSB1aXJlbmRlcmVyCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9VSV9MQVlFUl9ICmRpZmYgLS1naXQgYS9saWJzL2h3dWkvTGF5ZXJDYWNoZS5jcHAgYi9saWJzL2h3dWkvTGF5ZXJDYWNoZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTIwNDc3OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvaHd1aS9MYXllckNhY2hlLmNwcApAQCAtMCwwICsxLDE3MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiT3BlbkdMUmVuZGVyZXIiCisKKyNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiTGF5ZXJDYWNoZS5oIgorI2luY2x1ZGUgIlByb3BlcnRpZXMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHVpcmVuZGVyZXIgeworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDb25zdHJ1Y3RvcnMvZGVzdHJ1Y3RvcgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitMYXllckNhY2hlOjpMYXllckNhY2hlKCk6CisgICAgICAgIG1DYWNoZShHZW5lcmF0aW9uQ2FjaGU8TGF5ZXJTaXplLCBMYXllcio+OjprVW5saW1pdGVkQ2FwYWNpdHkpLAorICAgICAgICBtSWRHZW5lcmF0b3IoMSksIG1TaXplKDApLCBtTWF4U2l6ZShNQihERUZBVUxUX0xBWUVSX0NBQ0hFX1NJWkUpKSB7CisgICAgY2hhciBwcm9wZXJ0eVtQUk9QRVJUWV9WQUxVRV9NQVhdOworICAgIGlmIChwcm9wZXJ0eV9nZXQoUFJPUEVSVFlfTEFZRVJfQ0FDSEVfU0laRSwgcHJvcGVydHksIE5VTEwpID4gMCkgeworICAgICAgICBMT0dEKCIgIFNldHRpbmcgbGF5ZXIgY2FjaGUgc2l6ZSB0byAlc01CIiwgcHJvcGVydHkpOworICAgICAgICBzZXRNYXhTaXplKE1CKGF0b2YocHJvcGVydHkpKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HRCgiICBVc2luZyBkZWZhdWx0IGxheWVyIGNhY2hlIHNpemUgb2YgJS4yZk1CIiwgREVGQVVMVF9MQVlFUl9DQUNIRV9TSVpFKTsKKyAgICB9Cit9CisKK0xheWVyQ2FjaGU6OkxheWVyQ2FjaGUodWludDMyX3QgbWF4Qnl0ZVNpemUpOgorICAgICAgICBtQ2FjaGUoR2VuZXJhdGlvbkNhY2hlPExheWVyU2l6ZSwgTGF5ZXIqPjo6a1VubGltaXRlZENhcGFjaXR5KSwKKyAgICAgICAgbUlkR2VuZXJhdG9yKDEpLCBtU2l6ZSgwKSwgbU1heFNpemUobWF4Qnl0ZVNpemUpIHsKK30KKworTGF5ZXJDYWNoZTo6fkxheWVyQ2FjaGUoKSB7CisgICAgY2xlYXIoKTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gU2l6ZSBtYW5hZ2VtZW50CisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3VpbnQzMl90IExheWVyQ2FjaGU6OmdldFNpemUoKSB7CisgICAgcmV0dXJuIG1TaXplOworfQorCit1aW50MzJfdCBMYXllckNhY2hlOjpnZXRNYXhTaXplKCkgeworICAgIHJldHVybiBtTWF4U2l6ZTsKK30KKwordm9pZCBMYXllckNhY2hlOjpzZXRNYXhTaXplKHVpbnQzMl90IG1heFNpemUpIHsKKyAgICBtTWF4U2l6ZSA9IG1heFNpemU7CisgICAgd2hpbGUgKG1TaXplID4gbU1heFNpemUpIHsKKyAgICAgICAgTGF5ZXIqIG9sZGVzdCA9IG1DYWNoZS5yZW1vdmVPbGRlc3QoKTsKKyAgICAgICAgZGVsZXRlTGF5ZXIob2xkZXN0KTsKKyAgICB9Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENhbGxiYWNrcworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit2b2lkIExheWVyQ2FjaGU6Om9wZXJhdG9yKCkoTGF5ZXJTaXplJiBzaXplLCBMYXllciomIGxheWVyKSB7CisgICAgZGVsZXRlTGF5ZXIobGF5ZXIpOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDYWNoaW5nCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3ZvaWQgTGF5ZXJDYWNoZTo6ZGVsZXRlTGF5ZXIoTGF5ZXIqIGxheWVyKSB7CisgICAgaWYgKGxheWVyKSB7CisgICAgICAgIG1TaXplIC09IGxheWVyLT5sYXllci5nZXRXaWR0aCgpICogbGF5ZXItPmxheWVyLmdldEhlaWdodCgpICogNDsKKworICAgICAgICBnbERlbGV0ZUZyYW1lYnVmZmVycygxLCAmbGF5ZXItPmZibyk7CisgICAgICAgIGdsRGVsZXRlVGV4dHVyZXMoMSwgJmxheWVyLT50ZXh0dXJlKTsKKyAgICAgICAgZGVsZXRlIGxheWVyOworICAgIH0KK30KKwordm9pZCBMYXllckNhY2hlOjpjbGVhcigpIHsKKyAgICBtQ2FjaGUuc2V0T25FbnRyeVJlbW92ZWRMaXN0ZW5lcih0aGlzKTsKKyAgICBtQ2FjaGUuY2xlYXIoKTsKKyAgICBtQ2FjaGUuc2V0T25FbnRyeVJlbW92ZWRMaXN0ZW5lcihOVUxMKTsKK30KKworTGF5ZXIqIExheWVyQ2FjaGU6OmdldChMYXllclNpemUmIHNpemUsIEdMdWludCBwcmV2aW91c0ZibykgeworICAgIExheWVyKiBsYXllciA9IG1DYWNoZS5yZW1vdmUoc2l6ZSk7CisgICAgaWYgKGxheWVyKSB7CisgICAgICAgIExBWUVSX0xPR0QoIlJldXNpbmcgbGF5ZXIiKTsKKworICAgICAgICBtU2l6ZSAtPSBsYXllci0+bGF5ZXIuZ2V0V2lkdGgoKSAqIGxheWVyLT5sYXllci5nZXRIZWlnaHQoKSAqIDQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTEFZRVJfTE9HRCgiQ3JlYXRpbmcgbmV3IGxheWVyIik7CisKKyAgICAgICAgbGF5ZXIgPSBuZXcgTGF5ZXI7CisgICAgICAgIGxheWVyLT5ibGVuZCA9IHRydWU7CisKKyAgICAgICAgLy8gR2VuZXJhdGUgdGhlIEZCTyBhbmQgYXR0YWNoIHRoZSB0ZXh0dXJlCisgICAgICAgIGdsR2VuRnJhbWVidWZmZXJzKDEsICZsYXllci0+ZmJvKTsKKyAgICAgICAgZ2xCaW5kRnJhbWVidWZmZXIoR0xfRlJBTUVCVUZGRVIsIGxheWVyLT5mYm8pOworCisgICAgICAgIC8vIEdlbmVyYXRlIHRoZSB0ZXh0dXJlIGluIHdoaWNoIHRoZSBGQk8gd2lsbCBkcmF3CisgICAgICAgIGdsR2VuVGV4dHVyZXMoMSwgJmxheWVyLT50ZXh0dXJlKTsKKyAgICAgICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCBsYXllci0+dGV4dHVyZSk7CisKKyAgICAgICAgLy8gVGhlIEZCTyB3aWxsIG5vdCBiZSBzY2FsZWQsIHNvIHdlIGNhbiB1c2UgbG93ZXIgcXVhbGl0eSBmaWx0ZXJpbmcKKyAgICAgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUlOX0ZJTFRFUiwgR0xfTkVBUkVTVCk7CisgICAgICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01BR19GSUxURVIsIEdMX05FQVJFU1QpOworCisgICAgICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX1dSQVBfUywgR0xfQ0xBTVBfVE9fRURHRSk7CisgICAgICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX1dSQVBfVCwgR0xfQ0xBTVBfVE9fRURHRSk7CisKKyAgICAgICAgZ2xUZXhJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIEdMX1JHQkEsIHNpemUud2lkdGgsIHNpemUuaGVpZ2h0LCAwLAorICAgICAgICAgICAgICAgIEdMX1JHQkEsIEdMX1VOU0lHTkVEX0JZVEUsIE5VTEwpOworCisgICAgICAgIC8vIEJpbmQgdGV4dHVyZSB0byBGQk8KKyAgICAgICAgZ2xGcmFtZWJ1ZmZlclRleHR1cmUyRChHTF9GUkFNRUJVRkZFUiwgR0xfQ09MT1JfQVRUQUNITUVOVDAsIEdMX1RFWFRVUkVfMkQsCisgICAgICAgICAgICAgICAgbGF5ZXItPnRleHR1cmUsIDApOworCisgICAgICAgIEdMZW51bSBzdGF0dXMgPSBnbENoZWNrRnJhbWVidWZmZXJTdGF0dXMoR0xfRlJBTUVCVUZGRVIpOworICAgICAgICBpZiAoc3RhdHVzICE9IEdMX0ZSQU1FQlVGRkVSX0NPTVBMRVRFKSB7CisgICAgICAgICAgICBMT0dFKCJGcmFtZWJ1ZmZlciBpbmNvbXBsZXRlIChHTCBlcnJvciBjb2RlIDB4JXgpIiwgc3RhdHVzKTsKKworICAgICAgICAgICAgZ2xCaW5kRnJhbWVidWZmZXIoR0xfRlJBTUVCVUZGRVIsIHByZXZpb3VzRmJvKTsKKworICAgICAgICAgICAgZ2xEZWxldGVGcmFtZWJ1ZmZlcnMoMSwgJmxheWVyLT5mYm8pOworICAgICAgICAgICAgZ2xEZWxldGVUZXh0dXJlcygxLCAmbGF5ZXItPnRleHR1cmUpOworICAgICAgICAgICAgZGVsZXRlIGxheWVyOworCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBsYXllcjsKK30KKworYm9vbCBMYXllckNhY2hlOjpwdXQoTGF5ZXJTaXplJiBsYXllclNpemUsIExheWVyKiBsYXllcikgeworICAgIGNvbnN0IHVpbnQzMl90IHNpemUgPSBsYXllclNpemUud2lkdGggKiBsYXllclNpemUuaGVpZ2h0ICogNDsKKyAgICAvLyBEb24ndCBldmVuIHRyeSB0byBjYWNoZSBhIGxheWVyIHRoYXQncyBiaWdnZXIgdGhhbiB0aGUgY2FjaGUKKyAgICBpZiAoc2l6ZSA8IG1NYXhTaXplKSB7CisgICAgICAgIHdoaWxlIChtU2l6ZSArIHNpemUgPiBtTWF4U2l6ZSkgeworICAgICAgICAgICAgTGF5ZXIqIG9sZGVzdCA9IG1DYWNoZS5yZW1vdmVPbGRlc3QoKTsKKyAgICAgICAgICAgIGRlbGV0ZUxheWVyKG9sZGVzdCk7CisgICAgICAgIH0KKworICAgICAgICBsYXllclNpemUuaWQgPSBtSWRHZW5lcmF0b3IrKzsKKyAgICAgICAgbUNhY2hlLnB1dChsYXllclNpemUsIGxheWVyKTsKKyAgICAgICAgbVNpemUgKz0gc2l6ZTsKKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCit9OyAvLyBuYW1lc3BhY2UgdWlyZW5kZXJlcgorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9MYXllckNhY2hlLmggYi9saWJzL2h3dWkvTGF5ZXJDYWNoZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4NjA5OTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2h3dWkvTGF5ZXJDYWNoZS5oCkBAIC0wLDAgKzEsMTEwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1VJX0xBWUVSX0NBQ0hFX0gKKyNkZWZpbmUgQU5EUk9JRF9VSV9MQVlFUl9DQUNIRV9ICisKKyNpbmNsdWRlICJMYXllci5oIgorI2luY2x1ZGUgIkdlbmVyYXRpb25DYWNoZS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgdWlyZW5kZXJlciB7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIERlZmluZXMKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLy8gRGVidWcKKyNkZWZpbmUgREVCVUdfTEFZRVJTIDAKKworLy8gRGVidWcKKyNpZiBERUJVR19MQVlFUlMKKyAgICAjZGVmaW5lIExBWUVSX0xPR0QoLi4uKSBMT0dEKF9fVkFfQVJHU19fKQorI2Vsc2UKKyAgICAjZGVmaW5lIExBWUVSX0xPR0QoLi4uKQorI2VuZGlmCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENhY2hlCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2NsYXNzIExheWVyQ2FjaGU6IHB1YmxpYyBPbkVudHJ5UmVtb3ZlZDxMYXllclNpemUsIExheWVyKj4geworcHVibGljOgorICAgIExheWVyQ2FjaGUoKTsKKyAgICBMYXllckNhY2hlKHVpbnQzMl90IG1heEJ5dGVTaXplKTsKKyAgICB+TGF5ZXJDYWNoZSgpOworCisgICAgLyoqCisgICAgICogVXNlZCBhcyBhIGNhbGxiYWNrIHdoZW4gYW4gZW50cnkgaXMgcmVtb3ZlZCBmcm9tIHRoZSBjYWNoZS4KKyAgICAgKiBEbyBub3QgaW52b2tlIGRpcmVjdGx5LgorICAgICAqLworICAgIHZvaWQgb3BlcmF0b3IoKShMYXllclNpemUmIHNpemUsIExheWVyKiYgbGF5ZXIpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbGF5ZXIgb2Ygc3BlY2lmaWVkIGRpbWVuc2lvbnMuIElmIG5vdCBzdWl0YWJsZSBsYXllcgorICAgICAqIGNhbiBiZSBmb3VuZCwgYSBuZXcgb25lIGlzIGNyZWF0ZWQgYW5kIHJldHVybmVkLiBJZiBjcmVhdGluZyBhIG5ldworICAgICAqIGxheWVyIGZhaWxzLCBOVUxMIGlzIHJldHVybmVkLgorICAgICAqCisgICAgICogV2hlbiBhIGxheWVyIGlzIG9idGFpbmVkIGZyb20gdGhlIGNhY2hlLCBpdCBpcyByZW1vdmVkIGFuZCB0aGUgdG90YWwKKyAgICAgKiBzaXplIG9mIHRoZSBjYWNoZSBnb2VzIGRvd24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2l6ZSBUaGUgZGltZW5zaW9ucyBvZiB0aGUgZGVzaXJlZCBsYXllcgorICAgICAqIEBwYXJhbSBwcmV2aW91c0ZibyBUaGUgbmFtZSBvZiB0aGUgRkJPIHRvIGJpbmQgdG8gaWYgY3JlYXRpbmcgYSBuZXcKKyAgICAgKiAgICAgICAgbGF5ZXIgZmFpbHMKKyAgICAgKi8KKyAgICBMYXllciogZ2V0KExheWVyU2l6ZSYgc2l6ZSwgR0x1aW50IHByZXZpb3VzRmJvKTsKKyAgICAvKioKKyAgICAgKiBBZGRzIHRoZSBsYXllciB0byB0aGUgY2FjaGUuIFRoZSBsYXllciB3aWxsIG5vdCBiZSBhZGRlZCBpZiB0aGVyZSBpcworICAgICAqIG5vdCBlbm91Z2ggc3BhY2UgYXZhaWxhYmxlLgorICAgICAqCisgICAgICogQHBhcmFtIHNpemUgVGhlIGRpbWVuc2lvbnMgb2YgdGhlIGxheWVyCisgICAgICogQHBhcmFtIGxheWVyIFRoZSBsYXllciB0byBhZGQgdG8gdGhlIGNhY2hlCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGxheWVyIHdhcyBhZGRlZCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqLworICAgIGJvb2wgcHV0KExheWVyU2l6ZSYgc2l6ZSwgTGF5ZXIqIGxheWVyKTsKKyAgICAvKioKKyAgICAgKiBDbGVhcnMgdGhlIGNhY2hlLiBUaGlzIGNhdXNlcyBhbGwgbGF5ZXJzIHRvIGJlIGRlbGV0ZWQuCisgICAgICovCisgICAgdm9pZCBjbGVhcigpOworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgbWF4aW11bSBzaXplIG9mIHRoZSBjYWNoZSBpbiBieXRlcy4KKyAgICAgKi8KKyAgICB2b2lkIHNldE1heFNpemUodWludDMyX3QgbWF4U2l6ZSk7CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbWF4aW11bSBzaXplIG9mIHRoZSBjYWNoZSBpbiBieXRlcy4KKyAgICAgKi8KKyAgICB1aW50MzJfdCBnZXRNYXhTaXplKCk7CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY3VycmVudCBzaXplIG9mIHRoZSBjYWNoZSBpbiBieXRlcy4KKyAgICAgKi8KKyAgICB1aW50MzJfdCBnZXRTaXplKCk7CisKK3ByaXZhdGU6CisgICAgdm9pZCBkZWxldGVMYXllcihMYXllciogbGF5ZXIpOworCisgICAgR2VuZXJhdGlvbkNhY2hlPExheWVyU2l6ZSwgTGF5ZXIqPiBtQ2FjaGU7CisgICAgdWludDMyX3QgbUlkR2VuZXJhdG9yOworCisgICAgdWludDMyX3QgbVNpemU7CisgICAgdWludDMyX3QgbU1heFNpemU7Cit9OyAvLyBjbGFzcyBMYXllckNhY2hlCisKK307IC8vIG5hbWVzcGFjZSB1aXJlbmRlcmVyCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9VSV9MQVlFUl9DQUNIRV9ICmRpZmYgLS1naXQgYS9saWJzL2h3dWkvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMiBiL2xpYnMvaHd1aS9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2h3dWkvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpkaWZmIC0tZ2l0IGEvbGlicy9od3VpL01hdHJpeC5jcHAgYi9saWJzL2h3dWkvTWF0cml4LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjRhZDNkCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL01hdHJpeC5jcHAKQEAgLTAsMCArMSwzMDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIk9wZW5HTFJlbmRlcmVyIgorCisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxTa01hdHJpeC5oPgorCisjaW5jbHVkZSAiTWF0cml4LmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSB1aXJlbmRlcmVyIHsKKwordm9pZCBNYXRyaXg0Ojpsb2FkSWRlbnRpdHkoKSB7CisgICAgZGF0YVtrU2NhbGVYXSAgICAgICA9IDEuMGY7CisgICAgZGF0YVtrU2tld1ldICAgICAgICA9IDAuMGY7CisgICAgZGF0YVsyXSAgICAgICAgICAgICA9IDAuMGY7CisgICAgZGF0YVtrUGVyc3BlY3RpdmUwXSA9IDAuMGY7CisKKyAgICBkYXRhW2tTa2V3WF0gICAgICAgID0gMC4wZjsKKyAgICBkYXRhW2tTY2FsZVldICAgICAgID0gMS4wZjsKKyAgICBkYXRhWzZdICAgICAgICAgICAgID0gMC4wZjsKKyAgICBkYXRhW2tQZXJzcGVjdGl2ZTFdID0gMC4wZjsKKworICAgIGRhdGFbOF0gICAgICAgICAgICAgPSAwLjBmOworICAgIGRhdGFbOV0gICAgICAgICAgICAgPSAwLjBmOworICAgIGRhdGFba1NjYWxlWl0gICAgICAgPSAxLjBmOworICAgIGRhdGFbMTFdICAgICAgICAgICAgPSAwLjBmOworCisgICAgZGF0YVtrVHJhbnNsYXRlWF0gICA9IDAuMGY7CisgICAgZGF0YVtrVHJhbnNsYXRlWV0gICA9IDAuMGY7CisgICAgZGF0YVtrVHJhbnNsYXRlWl0gICA9IDAuMGY7CisgICAgZGF0YVtrUGVyc3BlY3RpdmUyXSA9IDEuMGY7CisKKyAgICBtU2ltcGxlTWF0cml4ID0gdHJ1ZTsKK30KKwordm9pZCBNYXRyaXg0Ojpsb2FkKGNvbnN0IGZsb2F0KiB2KSB7CisgICAgbWVtY3B5KGRhdGEsIHYsIHNpemVvZihkYXRhKSk7CisgICAgbVNpbXBsZU1hdHJpeCA9IGZhbHNlOworfQorCit2b2lkIE1hdHJpeDQ6OmxvYWQoY29uc3QgTWF0cml4NCYgdikgeworICAgIG1lbWNweShkYXRhLCB2LmRhdGEsIHNpemVvZihkYXRhKSk7CisgICAgbVNpbXBsZU1hdHJpeCA9IHYubVNpbXBsZU1hdHJpeDsKK30KKwordm9pZCBNYXRyaXg0Ojpsb2FkKGNvbnN0IFNrTWF0cml4JiB2KSB7CisgICAgbWVtc2V0KGRhdGEsIDAsIHNpemVvZihkYXRhKSk7CisKKyAgICBkYXRhW2tTY2FsZVhdICAgICA9IHZbU2tNYXRyaXg6OmtNU2NhbGVYXTsKKyAgICBkYXRhW2tTa2V3WF0gICAgICA9IHZbU2tNYXRyaXg6OmtNU2tld1hdOworICAgIGRhdGFba1RyYW5zbGF0ZVhdID0gdltTa01hdHJpeDo6a01UcmFuc1hdOworCisgICAgZGF0YVtrU2tld1ldICAgICAgPSB2W1NrTWF0cml4OjprTVNrZXdZXTsKKyAgICBkYXRhW2tTY2FsZVldICAgICA9IHZbU2tNYXRyaXg6OmtNU2NhbGVZXTsKKyAgICBkYXRhW2tUcmFuc2xhdGVZXSA9IHZbU2tNYXRyaXg6OmtNVHJhbnNZXTsKKworICAgIGRhdGFba1BlcnNwZWN0aXZlMF0gID0gdltTa01hdHJpeDo6a01QZXJzcDBdOworICAgIGRhdGFba1BlcnNwZWN0aXZlMV0gID0gdltTa01hdHJpeDo6a01QZXJzcDFdOworICAgIGRhdGFba1BlcnNwZWN0aXZlMl0gID0gdltTa01hdHJpeDo6a01QZXJzcDJdOworCisgICAgZGF0YVtrU2NhbGVaXSA9IDEuMGY7CisKKyAgICBtU2ltcGxlTWF0cml4ID0gKHYuZ2V0VHlwZSgpIDw9IFNrTWF0cml4OjprU2NhbGVfTWFzayk7Cit9CisKK3ZvaWQgTWF0cml4NDo6Y29weVRvKFNrTWF0cml4JiB2KSBjb25zdCB7CisgICAgdi5yZXNldCgpOworCisgICAgdi5zZXQoU2tNYXRyaXg6OmtNU2NhbGVYLCBkYXRhW2tTY2FsZVhdKTsKKyAgICB2LnNldChTa01hdHJpeDo6a01Ta2V3WCwgIGRhdGFba1NrZXdYXSk7CisgICAgdi5zZXQoU2tNYXRyaXg6OmtNVHJhbnNYLCBkYXRhW2tUcmFuc2xhdGVYXSk7CisKKyAgICB2LnNldChTa01hdHJpeDo6a01Ta2V3WSwgIGRhdGFba1NrZXdZXSk7CisgICAgdi5zZXQoU2tNYXRyaXg6OmtNU2NhbGVZLCBkYXRhW2tTY2FsZVldKTsKKyAgICB2LnNldChTa01hdHJpeDo6a01UcmFuc1ksIGRhdGFba1RyYW5zbGF0ZVldKTsKKworICAgIHYuc2V0KFNrTWF0cml4OjprTVBlcnNwMCwgZGF0YVtrUGVyc3BlY3RpdmUwXSk7CisgICAgdi5zZXQoU2tNYXRyaXg6OmtNUGVyc3AxLCBkYXRhW2tQZXJzcGVjdGl2ZTFdKTsKKyAgICB2LnNldChTa01hdHJpeDo6a01QZXJzcDIsIGRhdGFba1BlcnNwZWN0aXZlMl0pOworfQorCit2b2lkIE1hdHJpeDQ6OmxvYWRJbnZlcnNlKGNvbnN0IE1hdHJpeDQmIHYpIHsKKyAgICBkb3VibGUgc2NhbGUgPSAxLjAgLworICAgICAgICAgICAgKHYuZGF0YVtrU2NhbGVYXSAqICgoZG91YmxlKSB2LmRhdGFba1NjYWxlWV0gICogdi5kYXRhW2tQZXJzcGVjdGl2ZTJdIC0KKyAgICAgICAgICAgICAgICAgICAgKGRvdWJsZSkgdi5kYXRhW2tUcmFuc2xhdGVZXSAqIHYuZGF0YVtrUGVyc3BlY3RpdmUxXSkgKworICAgICAgICAgICAgIHYuZGF0YVtrU2tld1hdICogKChkb3VibGUpIHYuZGF0YVtrVHJhbnNsYXRlWV0gKiB2LmRhdGFba1BlcnNwZWN0aXZlMF0gLQorICAgICAgICAgICAgICAgICAgICAgKGRvdWJsZSkgdi5kYXRhW2tTa2V3WV0gKiB2LmRhdGFba1BlcnNwZWN0aXZlMl0pICsKKyAgICAgICAgICAgICB2LmRhdGFba1RyYW5zbGF0ZVhdICogKChkb3VibGUpIHYuZGF0YVtrU2tld1ldICogdi5kYXRhW2tQZXJzcGVjdGl2ZTFdIC0KKyAgICAgICAgICAgICAgICAgICAgIChkb3VibGUpIHYuZGF0YVtrU2NhbGVZXSAqIHYuZGF0YVtrUGVyc3BlY3RpdmUwXSkpOworCisgICAgZGF0YVtrU2NhbGVYXSA9ICh2LmRhdGFba1NjYWxlWV0gKiB2LmRhdGFba1BlcnNwZWN0aXZlMl0gLQorICAgICAgICAgICAgdi5kYXRhW2tUcmFuc2xhdGVZXSAqIHYuZGF0YVtrUGVyc3BlY3RpdmUxXSkgICogc2NhbGU7CisgICAgZGF0YVtrU2tld1hdID0gKHYuZGF0YVtrVHJhbnNsYXRlWF0gKiB2LmRhdGFba1BlcnNwZWN0aXZlMV0gLQorICAgICAgICAgICAgdi5kYXRhW2tTa2V3WF0gICogdi5kYXRhW2tQZXJzcGVjdGl2ZTJdKSAqIHNjYWxlOworICAgIGRhdGFba1RyYW5zbGF0ZVhdID0gKHYuZGF0YVtrU2tld1hdICogdi5kYXRhW2tUcmFuc2xhdGVZXSAtCisgICAgICAgICAgICB2LmRhdGFba1RyYW5zbGF0ZVhdICogdi5kYXRhW2tTY2FsZVldKSAgKiBzY2FsZTsKKworICAgIGRhdGFba1NrZXdZXSA9ICh2LmRhdGFba1RyYW5zbGF0ZVldICogdi5kYXRhW2tQZXJzcGVjdGl2ZTBdIC0KKyAgICAgICAgICAgIHYuZGF0YVtrU2tld1ldICAqIHYuZGF0YVtrUGVyc3BlY3RpdmUyXSkgKiBzY2FsZTsKKyAgICBkYXRhW2tTY2FsZVldID0gKHYuZGF0YVtrU2NhbGVYXSAqIHYuZGF0YVtrUGVyc3BlY3RpdmUyXSAtCisgICAgICAgICAgICB2LmRhdGFba1RyYW5zbGF0ZVhdICogdi5kYXRhW2tQZXJzcGVjdGl2ZTBdKSAgKiBzY2FsZTsKKyAgICBkYXRhW2tUcmFuc2xhdGVZXSA9ICh2LmRhdGFba1RyYW5zbGF0ZVhdICogdi5kYXRhW2tTa2V3WV0gLQorICAgICAgICAgICAgdi5kYXRhW2tTY2FsZVhdICAqIHYuZGF0YVtrVHJhbnNsYXRlWV0pICogc2NhbGU7CisKKyAgICBkYXRhW2tQZXJzcGVjdGl2ZTBdID0gKHYuZGF0YVtrU2tld1ldICogdi5kYXRhW2tQZXJzcGVjdGl2ZTFdIC0KKyAgICAgICAgICAgIHYuZGF0YVtrU2NhbGVZXSAqIHYuZGF0YVtrUGVyc3BlY3RpdmUwXSkgKiBzY2FsZTsKKyAgICBkYXRhW2tQZXJzcGVjdGl2ZTFdID0gKHYuZGF0YVtrU2tld1hdICogdi5kYXRhW2tQZXJzcGVjdGl2ZTBdIC0KKyAgICAgICAgICAgIHYuZGF0YVtrU2NhbGVYXSAqIHYuZGF0YVtrUGVyc3BlY3RpdmUxXSkgKiBzY2FsZTsKKyAgICBkYXRhW2tQZXJzcGVjdGl2ZTJdID0gKHYuZGF0YVtrU2NhbGVYXSAqIHYuZGF0YVtrU2NhbGVZXSAtCisgICAgICAgICAgICB2LmRhdGFba1NrZXdYXSAqIHYuZGF0YVtrU2tld1ldKSAqIHNjYWxlOworCisgICAgbVNpbXBsZU1hdHJpeCA9IHYubVNpbXBsZU1hdHJpeDsKK30KKwordm9pZCBNYXRyaXg0Ojpjb3B5VG8oZmxvYXQqIHYpIGNvbnN0IHsKKyAgICBtZW1jcHkodiwgZGF0YSwgc2l6ZW9mKGRhdGEpKTsKK30KKworZmxvYXQgTWF0cml4NDo6Z2V0VHJhbnNsYXRlWCgpIHsKKyAgICByZXR1cm4gZGF0YVtrVHJhbnNsYXRlWF07Cit9CisKK2Zsb2F0IE1hdHJpeDQ6OmdldFRyYW5zbGF0ZVkoKSB7CisgICAgcmV0dXJuIGRhdGFba1RyYW5zbGF0ZVldOworfQorCit2b2lkIE1hdHJpeDQ6OmxvYWRUcmFuc2xhdGUoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeikgeworICAgIGxvYWRJZGVudGl0eSgpOworICAgIGRhdGFba1RyYW5zbGF0ZVhdID0geDsKKyAgICBkYXRhW2tUcmFuc2xhdGVZXSA9IHk7CisgICAgZGF0YVtrVHJhbnNsYXRlWl0gPSB6OworfQorCit2b2lkIE1hdHJpeDQ6OmxvYWRTY2FsZShmbG9hdCBzeCwgZmxvYXQgc3ksIGZsb2F0IHN6KSB7CisgICAgbG9hZElkZW50aXR5KCk7CisgICAgZGF0YVtrU2NhbGVYXSA9IHN4OworICAgIGRhdGFba1NjYWxlWV0gPSBzeTsKKyAgICBkYXRhW2tTY2FsZVpdID0gc3o7Cit9CisKK3ZvaWQgTWF0cml4NDo6bG9hZFJvdGF0ZShmbG9hdCBhbmdsZSwgZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeikgeworICAgIGRhdGFba1BlcnNwZWN0aXZlMF0gID0gMC4wZjsKKyAgICBkYXRhW2tQZXJzcGVjdGl2ZTFdICA9IDAuMGY7CisgICAgZGF0YVsxMV0gICAgICAgICAgICAgPSAwLjBmOworICAgIGRhdGFba1RyYW5zbGF0ZVhdICAgID0gMC4wZjsKKyAgICBkYXRhW2tUcmFuc2xhdGVZXSAgICA9IDAuMGY7CisgICAgZGF0YVtrVHJhbnNsYXRlWl0gICAgPSAwLjBmOworICAgIGRhdGFba1BlcnNwZWN0aXZlMl0gID0gMS4wZjsKKworICAgIGFuZ2xlICo9IGZsb2F0KE1fUEkgLyAxODAuMGYpOworICAgIGZsb2F0IGMgPSBjb3NmKGFuZ2xlKTsKKyAgICBmbG9hdCBzID0gc2luZihhbmdsZSk7CisKKyAgICBjb25zdCBmbG9hdCBsZW5ndGggPSBzcXJ0Zih4ICogeCArIHkgKiB5ICsgeiAqIHopOworICAgIGZsb2F0IHJlY2lwTGVuID0gMS4wZiAvIGxlbmd0aDsKKyAgICB4ICo9IHJlY2lwTGVuOworICAgIHkgKj0gcmVjaXBMZW47CisgICAgeiAqPSByZWNpcExlbjsKKworICAgIGNvbnN0IGZsb2F0IG5jID0gMS4wZiAtIGM7CisgICAgY29uc3QgZmxvYXQgeHkgPSB4ICogeTsKKyAgICBjb25zdCBmbG9hdCB5eiA9IHkgKiB6OworICAgIGNvbnN0IGZsb2F0IHp4ID0geiAqIHg7CisgICAgY29uc3QgZmxvYXQgeHMgPSB4ICogczsKKyAgICBjb25zdCBmbG9hdCB5cyA9IHkgKiBzOworICAgIGNvbnN0IGZsb2F0IHpzID0geiAqIHM7CisKKyAgICBkYXRhW2tTY2FsZVhdID0geCAqIHggKiBuYyArICBjOworICAgIGRhdGFba1NrZXdYXSAgPSAgICB4eSAqIG5jIC0genM7CisgICAgZGF0YVs4XSAgICAgICA9ICAgIHp4ICogbmMgKyB5czsKKyAgICBkYXRhW2tTa2V3WV0gID0gICAgeHkgKiBuYyArIHpzOworICAgIGRhdGFba1NjYWxlWV0gPSB5ICogeSAqIG5jICsgIGM7CisgICAgZGF0YVs5XSAgICAgICA9ICAgIHl6ICogbmMgLSB4czsKKyAgICBkYXRhWzJdICAgICAgID0gICAgenggKiBuYyAtIHlzOworICAgIGRhdGFbNl0gICAgICAgPSAgICB5eiAqIG5jICsgeHM7CisgICAgZGF0YVtrU2NhbGVaXSA9IHogKiB6ICogbmMgKyAgYzsKKworICAgIG1TaW1wbGVNYXRyaXggPSBmYWxzZTsKK30KKwordm9pZCBNYXRyaXg0Ojpsb2FkTXVsdGlwbHkoY29uc3QgTWF0cml4NCYgdSwgY29uc3QgTWF0cml4NCYgdikgeworICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IDQgOyBpKyspIHsKKyAgICAgICAgZmxvYXQgeCA9IDA7CisgICAgICAgIGZsb2F0IHkgPSAwOworICAgICAgICBmbG9hdCB6ID0gMDsKKyAgICAgICAgZmxvYXQgdyA9IDA7CisKKyAgICAgICAgZm9yIChpbnQgaiA9IDAgOyBqIDwgNCA7IGorKykgeworICAgICAgICAgICAgY29uc3QgZmxvYXQgZSA9IHYuZ2V0KGksIGopOworICAgICAgICAgICAgeCArPSB1LmdldChqLCAwKSAqIGU7CisgICAgICAgICAgICB5ICs9IHUuZ2V0KGosIDEpICogZTsKKyAgICAgICAgICAgIHogKz0gdS5nZXQoaiwgMikgKiBlOworICAgICAgICAgICAgdyArPSB1LmdldChqLCAzKSAqIGU7CisgICAgICAgIH0KKworICAgICAgICBzZXQoaSwgMCwgeCk7CisgICAgICAgIHNldChpLCAxLCB5KTsKKyAgICAgICAgc2V0KGksIDIsIHopOworICAgICAgICBzZXQoaSwgMywgdyk7CisgICAgfQorCisgICAgbVNpbXBsZU1hdHJpeCA9IHUubVNpbXBsZU1hdHJpeCAmJiB2Lm1TaW1wbGVNYXRyaXg7Cit9CisKK3ZvaWQgTWF0cml4NDo6bG9hZE9ydGhvKGZsb2F0IGxlZnQsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sIGZsb2F0IHRvcCwgZmxvYXQgbmVhciwgZmxvYXQgZmFyKSB7CisgICAgbG9hZElkZW50aXR5KCk7CisgICAgZGF0YVtrU2NhbGVYXSA9IDIuMGYgLyAocmlnaHQgLSBsZWZ0KTsKKyAgICBkYXRhW2tTY2FsZVldID0gMi4wZiAvICh0b3AgLSBib3R0b20pOworICAgIGRhdGFba1NjYWxlWl0gPSAtMi4wZiAvIChmYXIgLSBuZWFyKTsKKyAgICBkYXRhW2tUcmFuc2xhdGVYXSA9IC0ocmlnaHQgKyBsZWZ0KSAvIChyaWdodCAtIGxlZnQpOworICAgIGRhdGFba1RyYW5zbGF0ZVldID0gLSh0b3AgKyBib3R0b20pIC8gKHRvcCAtIGJvdHRvbSk7CisgICAgZGF0YVtrVHJhbnNsYXRlWl0gPSAtKGZhciArIG5lYXIpIC8gKGZhciAtIG5lYXIpOworfQorCisjZGVmaW5lIE1VTF9BRERfU1RPUkUoYSwgYiwgYykgYSA9IChhKSAqIChiKSArIChjKQorCit2b2lkIE1hdHJpeDQ6Om1hcFBvaW50KGZsb2F0JiB4LCBmbG9hdCYgeSkgY29uc3QgeworICAgIGlmIChtU2ltcGxlTWF0cml4KSB7CisgICAgICAgIE1VTF9BRERfU1RPUkUoeCwgZGF0YVtrU2NhbGVYXSwgZGF0YVtrVHJhbnNsYXRlWF0pOworICAgICAgICBNVUxfQUREX1NUT1JFKHksIGRhdGFba1NjYWxlWV0sIGRhdGFba1RyYW5zbGF0ZVldKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGZsb2F0IGR4ID0geCAqIGRhdGFba1NjYWxlWF0gKyB5ICogZGF0YVtrU2tld1hdICsgZGF0YVtrVHJhbnNsYXRlWF07CisgICAgZmxvYXQgZHkgPSB4ICogZGF0YVtrU2tld1ldICsgeSAqIGRhdGFba1NjYWxlWV0gKyBkYXRhW2tUcmFuc2xhdGVZXTsKKyAgICBmbG9hdCBkeiA9IHggKiBkYXRhW2tQZXJzcGVjdGl2ZTBdICsgeSAqIGRhdGFba1BlcnNwZWN0aXZlMV0gKyBkYXRhW2tQZXJzcGVjdGl2ZTJdOworICAgIGlmIChkeikgZHogPSAxLjBmIC8gZHo7CisKKyAgICB4ID0gZHggKiBkejsKKyAgICB5ID0gZHkgKiBkejsKK30KKwordm9pZCBNYXRyaXg0OjptYXBSZWN0KFJlY3QmIHIpIGNvbnN0IHsKKyAgICBpZiAobVNpbXBsZU1hdHJpeCkgeworICAgICAgICBNVUxfQUREX1NUT1JFKHIubGVmdCwgZGF0YVtrU2NhbGVYXSwgZGF0YVtrVHJhbnNsYXRlWF0pOworICAgICAgICBNVUxfQUREX1NUT1JFKHIucmlnaHQsIGRhdGFba1NjYWxlWF0sIGRhdGFba1RyYW5zbGF0ZVhdKTsKKyAgICAgICAgTVVMX0FERF9TVE9SRShyLnRvcCwgZGF0YVtrU2NhbGVZXSwgZGF0YVtrVHJhbnNsYXRlWV0pOworICAgICAgICBNVUxfQUREX1NUT1JFKHIuYm90dG9tLCBkYXRhW2tTY2FsZVldLCBkYXRhW2tUcmFuc2xhdGVZXSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBmbG9hdCB2ZXJ0aWNlc1tdID0geworICAgICAgICByLmxlZnQsIHIudG9wLAorICAgICAgICByLnJpZ2h0LCByLnRvcCwKKyAgICAgICAgci5yaWdodCwgci5ib3R0b20sCisgICAgICAgIHIubGVmdCwgci5ib3R0b20KKyAgICB9OworCisgICAgZmxvYXQgeCwgeSwgejsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgODsgaSs9IDIpIHsKKyAgICAgICAgZmxvYXQgcHggPSB2ZXJ0aWNlc1tpXTsKKyAgICAgICAgZmxvYXQgcHkgPSB2ZXJ0aWNlc1tpICsgMV07CisKKyAgICAgICAgeCA9IHB4ICogZGF0YVtrU2NhbGVYXSArIHB5ICogZGF0YVtrU2tld1hdICsgZGF0YVtrVHJhbnNsYXRlWF07CisgICAgICAgIHkgPSBweCAqIGRhdGFba1NrZXdZXSArIHB5ICogZGF0YVtrU2NhbGVZXSArIGRhdGFba1RyYW5zbGF0ZVldOworICAgICAgICB6ID0gcHggKiBkYXRhW2tQZXJzcGVjdGl2ZTBdICsgcHkgKiBkYXRhW2tQZXJzcGVjdGl2ZTFdICsgZGF0YVtrUGVyc3BlY3RpdmUyXTsKKyAgICAgICAgaWYgKHopIHogPSAxLjBmIC8gejsKKworICAgICAgICB2ZXJ0aWNlc1tpXSA9IHggKiB6OworICAgICAgICB2ZXJ0aWNlc1tpICsgMV0gPSB5ICogejsKKyAgICB9CisKKyAgICByLmxlZnQgPSByLnJpZ2h0ID0gdmVydGljZXNbMF07CisgICAgci50b3AgPSByLmJvdHRvbSA9IHZlcnRpY2VzWzFdOworCisgICAgZm9yIChpbnQgaSA9IDI7IGkgPCA4OyBpICs9IDIpIHsKKyAgICAgICAgeCA9IHZlcnRpY2VzW2ldOworICAgICAgICB5ID0gdmVydGljZXNbaSArIDFdOworCisgICAgICAgIGlmICh4IDwgci5sZWZ0KSByLmxlZnQgPSB4OworICAgICAgICBlbHNlIGlmICh4ID4gci5yaWdodCkgci5yaWdodCA9IHg7CisgICAgICAgIGlmICh5IDwgci50b3ApIHIudG9wID0geTsKKyAgICAgICAgZWxzZSBpZiAoeSA+IHIuYm90dG9tKSByLmJvdHRvbSA9IHk7CisgICAgfQorfQorCit2b2lkIE1hdHJpeDQ6OmR1bXAoKSBjb25zdCB7CisgICAgTE9HRCgiTWF0cml4NFtzaW1wbGU9JWQiLCBtU2ltcGxlTWF0cml4KTsKKyAgICBMT0dEKCIgICVmICVmICVmICVmIiwgZGF0YVtrU2NhbGVYXSwgZGF0YVtrU2tld1hdLCBkYXRhWzhdLCBkYXRhW2tUcmFuc2xhdGVYXSk7CisgICAgTE9HRCgiICAlZiAlZiAlZiAlZiIsIGRhdGFba1NrZXdZXSwgZGF0YVtrU2NhbGVZXSwgZGF0YVs5XSwgZGF0YVtrVHJhbnNsYXRlWV0pOworICAgIExPR0QoIiAgJWYgJWYgJWYgJWYiLCBkYXRhWzJdLCBkYXRhWzZdLCBkYXRhW2tTY2FsZVpdLCBkYXRhW2tUcmFuc2xhdGVaXSk7CisgICAgTE9HRCgiICAlZiAlZiAlZiAlZiIsIGRhdGFba1BlcnNwZWN0aXZlMF0sIGRhdGFba1BlcnNwZWN0aXZlMV0sIGRhdGFbMTFdLCBkYXRhW2tQZXJzcGVjdGl2ZTJdKTsKKyAgICBMT0dEKCJdIik7Cit9CisKK307IC8vIG5hbWVzcGFjZSB1aXJlbmRlcmVyCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlicy9od3VpL01hdHJpeC5oIGIvbGlicy9od3VpL01hdHJpeC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyNDdhNjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2h3dWkvTWF0cml4LmgKQEAgLTAsMCArMSwxMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfVUlfTUFUUklYX0gKKyNkZWZpbmUgQU5EUk9JRF9VSV9NQVRSSVhfSAorCisjaW5jbHVkZSA8U2tNYXRyaXguaD4KKworI2luY2x1ZGUgIlJlY3QuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHVpcmVuZGVyZXIgeworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDbGFzc2VzCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2NsYXNzIE1hdHJpeDQgeworcHVibGljOgorICAgIGZsb2F0IGRhdGFbMTZdOworCisgICAgZW51bSBFbnRyeSB7CisgICAgICAgIGtTY2FsZVggPSAwLAorICAgICAgICBrU2tld1kgPSAxLAorICAgICAgICBrUGVyc3BlY3RpdmUwID0gMywKKyAgICAgICAga1NrZXdYID0gNCwKKyAgICAgICAga1NjYWxlWSA9IDUsCisgICAgICAgIGtQZXJzcGVjdGl2ZTEgPSA3LAorICAgICAgICBrU2NhbGVaID0gMTAsCisgICAgICAgIGtUcmFuc2xhdGVYID0gMTIsCisgICAgICAgIGtUcmFuc2xhdGVZID0gMTMsCisgICAgICAgIGtUcmFuc2xhdGVaID0gMTQsCisgICAgICAgIGtQZXJzcGVjdGl2ZTIgPSAxNQorICAgIH07CisKKyAgICBNYXRyaXg0KCkgeworICAgICAgICBsb2FkSWRlbnRpdHkoKTsKKyAgICB9CisKKyAgICBNYXRyaXg0KGNvbnN0IGZsb2F0KiB2KSB7CisgICAgICAgIGxvYWQodik7CisgICAgfQorCisgICAgTWF0cml4NChjb25zdCBNYXRyaXg0JiB2KSB7CisgICAgICAgIGxvYWQodik7CisgICAgfQorCisgICAgTWF0cml4NChjb25zdCBTa01hdHJpeCYgdikgeworICAgICAgICBsb2FkKHYpOworICAgIH0KKworICAgIHZvaWQgbG9hZElkZW50aXR5KCk7CisKKyAgICB2b2lkIGxvYWQoY29uc3QgZmxvYXQqIHYpOworICAgIHZvaWQgbG9hZChjb25zdCBNYXRyaXg0JiB2KTsKKyAgICB2b2lkIGxvYWQoY29uc3QgU2tNYXRyaXgmIHYpOworCisgICAgdm9pZCBsb2FkSW52ZXJzZShjb25zdCBNYXRyaXg0JiB2KTsKKworICAgIHZvaWQgbG9hZFRyYW5zbGF0ZShmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KTsKKyAgICB2b2lkIGxvYWRTY2FsZShmbG9hdCBzeCwgZmxvYXQgc3ksIGZsb2F0IHN6KTsKKyAgICB2b2lkIGxvYWRSb3RhdGUoZmxvYXQgYW5nbGUsIGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopOworICAgIHZvaWQgbG9hZE11bHRpcGx5KGNvbnN0IE1hdHJpeDQmIHUsIGNvbnN0IE1hdHJpeDQmIHYpOworCisgICAgdm9pZCBsb2FkT3J0aG8oZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwgZmxvYXQgdG9wLCBmbG9hdCBuZWFyLCBmbG9hdCBmYXIpOworCisgICAgdm9pZCBtdWx0aXBseShjb25zdCBNYXRyaXg0JiB2KSB7CisgICAgICAgIE1hdHJpeDQgdTsKKyAgICAgICAgdS5sb2FkTXVsdGlwbHkoKnRoaXMsIHYpOworICAgICAgICBsb2FkKHUpOworICAgIH0KKworICAgIHZvaWQgdHJhbnNsYXRlKGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopIHsKKyAgICAgICAgTWF0cml4NCB1OworICAgICAgICB1LmxvYWRUcmFuc2xhdGUoeCwgeSwgeik7CisgICAgICAgIG11bHRpcGx5KHUpOworICAgIH0KKworICAgIHZvaWQgc2NhbGUoZmxvYXQgc3gsIGZsb2F0IHN5LCBmbG9hdCBzeikgeworICAgICAgICBNYXRyaXg0IHU7CisgICAgICAgIHUubG9hZFNjYWxlKHN4LCBzeSwgc3opOworICAgICAgICBtdWx0aXBseSh1KTsKKyAgICB9CisKKyAgICB2b2lkIHJvdGF0ZShmbG9hdCBhbmdsZSwgZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeikgeworICAgICAgICBNYXRyaXg0IHU7CisgICAgICAgIHUubG9hZFJvdGF0ZShhbmdsZSwgeCwgeSwgeik7CisgICAgICAgIG11bHRpcGx5KHUpOworICAgIH0KKworICAgIHZvaWQgY29weVRvKGZsb2F0KiB2KSBjb25zdDsKKyAgICB2b2lkIGNvcHlUbyhTa01hdHJpeCYgdikgY29uc3Q7CisKKyAgICB2b2lkIG1hcFJlY3QoUmVjdCYgcikgY29uc3Q7CisgICAgdm9pZCBtYXBQb2ludChmbG9hdCYgeCwgZmxvYXQmIHkpIGNvbnN0OworCisgICAgZmxvYXQgZ2V0VHJhbnNsYXRlWCgpOworICAgIGZsb2F0IGdldFRyYW5zbGF0ZVkoKTsKKworICAgIHZvaWQgZHVtcCgpIGNvbnN0OworCitwcml2YXRlOgorICAgIGJvb2wgbVNpbXBsZU1hdHJpeDsKKworICAgIGlubGluZSBmbG9hdCBnZXQoaW50IGksIGludCBqKSBjb25zdCB7CisgICAgICAgIHJldHVybiBkYXRhW2kgKiA0ICsgal07CisgICAgfQorCisgICAgaW5saW5lIHZvaWQgc2V0KGludCBpLCBpbnQgaiwgZmxvYXQgdikgeworICAgICAgICBkYXRhW2kgKiA0ICsgal0gPSB2OworICAgIH0KK307IC8vIGNsYXNzIE1hdHJpeDQKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gVHlwZXMKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordHlwZWRlZiBNYXRyaXg0IG1hdDQ7CisKK307IC8vIG5hbWVzcGFjZSB1aXJlbmRlcmVyCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9VSV9NQVRSSVhfSApkaWZmIC0tZ2l0IGEvbGlicy9od3VpL05PVElDRSBiL2xpYnMvaHd1aS9OT1RJQ0UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzViMWVmYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvaHd1aS9OT1RJQ0UKQEAgLTAsMCArMSwxOTAgQEAKKworICAgQ29weXJpZ2h0IChjKSAyMDA1LTIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0CisgICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCisKKyAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgorCisgICAxLiBEZWZpbml0aW9ucy4KKworICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKKyAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgorCisgICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQorICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgorCisgICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCisgICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCisgICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAorICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCisgICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgorICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCisgICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgorCisgICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5CisgICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgorCisgICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKKyAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KKyAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCisKKyAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCisgICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0CisgICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCisgICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCisKKyAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCisgICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCisgICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKKyAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCisKKyAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKKyAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKKyAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKKyAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCisgICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KKyAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKKyAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCisKKyAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCisgICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCisgICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKKyAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKKyAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgorICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCisgICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50CisgICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bworICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKKyAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCisgICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKKyAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCisgICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKKworICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKKyAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAorICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCisKKyAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAorICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKKyAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAorICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCisgICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgorCisgICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKKyAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCisgICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKKyAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAorICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKKyAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCisgICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCisgICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQorICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKKyAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKKyAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0CisgICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCisgICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKKyAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KKworICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKKyAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAorICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKKyAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCisgICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgorICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCisKKyAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKKyAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKKworICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCisgICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAorICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCisgICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgorICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKKworICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCisgICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAorICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAorICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAorICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQorICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCisgICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgorICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAorICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKKyAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKKyAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCisgICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KKyAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQorICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAorICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAorICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KKworICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCisgICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCisgICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKKyAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAorICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KKworICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAorICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCisgICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCisgICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5CisgICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAorICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgorCisgICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCisgICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCisgICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKKyAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgorCisgICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKKyAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKKyAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisgICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucworICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQorICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCisgICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKKyAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KKworICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCisgICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKKyAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5CisgICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQorICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAorICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCisgICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCisgICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCisgICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAorICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgorICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgorCisgICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCisgICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAorICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKKyAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCisgICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQorICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKKyAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKKyAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQorICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgorICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCisKKyAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUworCmRpZmYgLS1naXQgYS9saWJzL2h3dWkvT3BlbkdMUmVuZGVyZXIuY3BwIGIvbGlicy9od3VpL09wZW5HTFJlbmRlcmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzNkOGUyCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL09wZW5HTFJlbmRlcmVyLmNwcApAQCAtMCwwICsxLDk4MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiT3BlbkdMUmVuZGVyZXIiCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPFNrQ2FudmFzLmg+CisjaW5jbHVkZSA8U2tUeXBlZmFjZS5oPgorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJPcGVuR0xSZW5kZXJlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgdWlyZW5kZXJlciB7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIERlZmluZXMKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworI2RlZmluZSBSRVFVSVJFRF9URVhUVVJFX1VOSVRTX0NPVU5UIDMKKworLy8gR2VuZXJhdGVzIHNpbXBsZSBhbmQgdGV4dHVyZWQgdmVydGljZXMKKyNkZWZpbmUgRlYoeCwgeSwgdSwgdikgeyB7IHgsIHkgfSwgeyB1LCB2IH0gfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBHbG9iYWxzCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8vIFRoaXMgYXJyYXkgaXMgbmV2ZXIgdXNlZCBkaXJlY3RseSBidXQgdXNlZCBhcyBhIG1lbWNweSBzb3VyY2UgaW4gdGhlCisvLyBPcGVuR0xSZW5kZXJlciBjb25zdHJ1Y3Rvcgorc3RhdGljIGNvbnN0IFRleHR1cmVWZXJ0ZXggZ01lc2hWZXJ0aWNlc1tdID0geworICAgICAgICBGVigwLjBmLCAwLjBmLCAwLjBmLCAwLjBmKSwKKyAgICAgICAgRlYoMS4wZiwgMC4wZiwgMS4wZiwgMC4wZiksCisgICAgICAgIEZWKDAuMGYsIDEuMGYsIDAuMGYsIDEuMGYpLAorICAgICAgICBGVigxLjBmLCAxLjBmLCAxLjBmLCAxLjBmKQorfTsKK3N0YXRpYyBjb25zdCBHTHNpemVpIGdNZXNoU3RyaWRlID0gc2l6ZW9mKFRleHR1cmVWZXJ0ZXgpOworc3RhdGljIGNvbnN0IEdMc2l6ZWkgZ01lc2hDb3VudCA9IDQ7CisKKy8qKgorICogU3RydWN0dXJlIG1hcHBpbmcgU2tpYSB4ZmVybW9kZXMgdG8gT3BlbkdMIGJsZW5kaW5nIGZhY3RvcnMuCisgKi8KK3N0cnVjdCBCbGVuZGVyIHsKKyAgICBTa1hmZXJtb2RlOjpNb2RlIG1vZGU7CisgICAgR0xlbnVtIHNyYzsKKyAgICBHTGVudW0gZHN0OworfTsgLy8gc3RydWN0IEJsZW5kZXIKKworLy8gSW4gdGhpcyBhcnJheSwgdGhlIGluZGV4IG9mIGVhY2ggQmxlbmRlciBlcXVhbHMgdGhlIHZhbHVlIG9mIHRoZSBmaXJzdAorLy8gZW50cnkuIEZvciBpbnN0YW5jZSwgZ0JsZW5kc1sxXSA9PSBnQmxlbmRzW1NrWGZlcm1vZGU6OmtTcmNfTW9kZV0KK3N0YXRpYyBjb25zdCBCbGVuZGVyIGdCbGVuZHNbXSA9IHsKKyAgICAgICAgeyBTa1hmZXJtb2RlOjprQ2xlYXJfTW9kZSwgICBHTF9aRVJPLCAgICAgICAgICAgICAgICAgR0xfWkVSTyB9LAorICAgICAgICB7IFNrWGZlcm1vZGU6OmtTcmNfTW9kZSwgICAgIEdMX09ORSwgICAgICAgICAgICAgICAgICBHTF9aRVJPIH0sCisgICAgICAgIHsgU2tYZmVybW9kZTo6a0RzdF9Nb2RlLCAgICAgR0xfWkVSTywgICAgICAgICAgICAgICAgIEdMX09ORSB9LAorICAgICAgICB7IFNrWGZlcm1vZGU6OmtTcmNPdmVyX01vZGUsIEdMX09ORSwgICAgICAgICAgICAgICAgICBHTF9PTkVfTUlOVVNfU1JDX0FMUEhBIH0sCisgICAgICAgIHsgU2tYZmVybW9kZTo6a0RzdE92ZXJfTW9kZSwgR0xfT05FX01JTlVTX0RTVF9BTFBIQSwgIEdMX09ORSB9LAorICAgICAgICB7IFNrWGZlcm1vZGU6OmtTcmNJbl9Nb2RlLCAgIEdMX0RTVF9BTFBIQSwgICAgICAgICAgICBHTF9aRVJPIH0sCisgICAgICAgIHsgU2tYZmVybW9kZTo6a0RzdEluX01vZGUsICAgR0xfWkVSTywgICAgICAgICAgICAgICAgIEdMX1NSQ19BTFBIQSB9LAorICAgICAgICB7IFNrWGZlcm1vZGU6OmtTcmNPdXRfTW9kZSwgIEdMX09ORV9NSU5VU19EU1RfQUxQSEEsICBHTF9aRVJPIH0sCisgICAgICAgIHsgU2tYZmVybW9kZTo6a0RzdE91dF9Nb2RlLCAgR0xfWkVSTywgICAgICAgICAgICAgICAgIEdMX09ORV9NSU5VU19TUkNfQUxQSEEgfSwKKyAgICAgICAgeyBTa1hmZXJtb2RlOjprU3JjQVRvcF9Nb2RlLCBHTF9EU1RfQUxQSEEsICAgICAgICAgICAgR0xfT05FX01JTlVTX1NSQ19BTFBIQSB9LAorICAgICAgICB7IFNrWGZlcm1vZGU6OmtEc3RBVG9wX01vZGUsIEdMX09ORV9NSU5VU19EU1RfQUxQSEEsICBHTF9TUkNfQUxQSEEgfSwKKyAgICAgICAgeyBTa1hmZXJtb2RlOjprWG9yX01vZGUsICAgICBHTF9PTkVfTUlOVVNfRFNUX0FMUEhBLCAgR0xfT05FX01JTlVTX1NSQ19BTFBIQSB9Cit9OworCitzdGF0aWMgY29uc3QgR0xlbnVtIGdUZXh0dXJlVW5pdHNbXSA9IHsKKyAgICAgICAgR0xfVEVYVFVSRTAsCisgICAgICAgIEdMX1RFWFRVUkUxLAorICAgICAgICBHTF9URVhUVVJFMgorfTsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQ29uc3RydWN0b3JzL2Rlc3RydWN0b3IKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworT3BlbkdMUmVuZGVyZXI6Ok9wZW5HTFJlbmRlcmVyKCk6IG1DYWNoZXMoQ2FjaGVzOjpnZXRJbnN0YW5jZSgpKSB7CisgICAgTE9HRCgiQ3JlYXRlIE9wZW5HTFJlbmRlcmVyIik7CisKKyAgICBtU2hhZGVyID0gTlVMTDsKKyAgICBtQ29sb3JGaWx0ZXIgPSBOVUxMOworICAgIG1IYXNTaGFkb3cgPSBmYWxzZTsKKworICAgIG1lbWNweShtTWVzaFZlcnRpY2VzLCBnTWVzaFZlcnRpY2VzLCBzaXplb2YoZ01lc2hWZXJ0aWNlcykpOworCisgICAgbUZpcnN0U25hcHNob3QgPSBuZXcgU25hcHNob3Q7CisKKyAgICBHTGludCBtYXhUZXh0dXJlVW5pdHM7CisgICAgZ2xHZXRJbnRlZ2VydihHTF9NQVhfQ09NQklORURfVEVYVFVSRV9JTUFHRV9VTklUUywgJm1heFRleHR1cmVVbml0cyk7CisgICAgaWYgKG1heFRleHR1cmVVbml0cyA8IFJFUVVJUkVEX1RFWFRVUkVfVU5JVFNfQ09VTlQpIHsKKyAgICAgICAgTE9HVygiQXQgbGVhc3QgJWQgdGV4dHVyZSB1bml0cyBhcmUgcmVxdWlyZWQhIiwgUkVRVUlSRURfVEVYVFVSRV9VTklUU19DT1VOVCk7CisgICAgfQorfQorCitPcGVuR0xSZW5kZXJlcjo6fk9wZW5HTFJlbmRlcmVyKCkgeworICAgIExPR0QoIkRlc3Ryb3kgT3BlbkdMUmVuZGVyZXIiKTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gU2V0dXAKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordm9pZCBPcGVuR0xSZW5kZXJlcjo6c2V0Vmlld3BvcnQoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CisgICAgZ2xWaWV3cG9ydCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICBtT3J0aG9NYXRyaXgubG9hZE9ydGhvKDAsIHdpZHRoLCBoZWlnaHQsIDAsIC0xLCAxKTsKKworICAgIG1XaWR0aCA9IHdpZHRoOworICAgIG1IZWlnaHQgPSBoZWlnaHQ7CisgICAgbUZpcnN0U25hcHNob3QtPmhlaWdodCA9IGhlaWdodDsKKyAgICBtRmlyc3RTbmFwc2hvdC0+dmlld3BvcnQuc2V0KDAsIDAsIHdpZHRoLCBoZWlnaHQpOworfQorCit2b2lkIE9wZW5HTFJlbmRlcmVyOjpwcmVwYXJlKCkgeworICAgIG1TbmFwc2hvdCA9IG5ldyBTbmFwc2hvdChtRmlyc3RTbmFwc2hvdCk7CisgICAgbVNhdmVDb3VudCA9IDE7CisKKyAgICBnbFZpZXdwb3J0KDAsIDAsIG1XaWR0aCwgbUhlaWdodCk7CisKKyAgICBnbERpc2FibGUoR0xfU0NJU1NPUl9URVNUKTsKKworICAgIGdsQ2xlYXJDb2xvcigwLjBmLCAwLjBmLCAwLjBmLCAwLjBmKTsKKyAgICBnbENsZWFyKEdMX0NPTE9SX0JVRkZFUl9CSVQpOworCisgICAgZ2xFbmFibGUoR0xfU0NJU1NPUl9URVNUKTsKKyAgICBnbFNjaXNzb3IoMCwgMCwgbVdpZHRoLCBtSGVpZ2h0KTsKKworICAgIG1TbmFwc2hvdC0+c2V0Q2xpcCgwLjBmLCAwLjBmLCBtV2lkdGgsIG1IZWlnaHQpOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBTdGF0ZSBtYW5hZ2VtZW50CisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2ludCBPcGVuR0xSZW5kZXJlcjo6Z2V0U2F2ZUNvdW50KCkgY29uc3QgeworICAgIHJldHVybiBtU2F2ZUNvdW50OworfQorCitpbnQgT3BlbkdMUmVuZGVyZXI6OnNhdmUoaW50IGZsYWdzKSB7CisgICAgcmV0dXJuIHNhdmVTbmFwc2hvdCgpOworfQorCit2b2lkIE9wZW5HTFJlbmRlcmVyOjpyZXN0b3JlKCkgeworICAgIGlmIChtU2F2ZUNvdW50ID4gMSkgeworICAgICAgICByZXN0b3JlU25hcHNob3QoKTsKKyAgICB9Cit9CisKK3ZvaWQgT3BlbkdMUmVuZGVyZXI6OnJlc3RvcmVUb0NvdW50KGludCBzYXZlQ291bnQpIHsKKyAgICBpZiAoc2F2ZUNvdW50IDwgMSkgc2F2ZUNvdW50ID0gMTsKKworICAgIHdoaWxlIChtU2F2ZUNvdW50ID4gc2F2ZUNvdW50KSB7CisgICAgICAgIHJlc3RvcmVTbmFwc2hvdCgpOworICAgIH0KK30KKworaW50IE9wZW5HTFJlbmRlcmVyOjpzYXZlU25hcHNob3QoKSB7CisgICAgbVNuYXBzaG90ID0gbmV3IFNuYXBzaG90KG1TbmFwc2hvdCk7CisgICAgcmV0dXJuIG1TYXZlQ291bnQrKzsKK30KKworYm9vbCBPcGVuR0xSZW5kZXJlcjo6cmVzdG9yZVNuYXBzaG90KCkgeworICAgIGJvb2wgcmVzdG9yZUNsaXAgPSBtU25hcHNob3QtPmZsYWdzICYgU25hcHNob3Q6OmtGbGFnQ2xpcFNldDsKKyAgICBib29sIHJlc3RvcmVMYXllciA9IG1TbmFwc2hvdC0+ZmxhZ3MgJiBTbmFwc2hvdDo6a0ZsYWdJc0xheWVyOworICAgIGJvb2wgcmVzdG9yZU9ydGhvID0gbVNuYXBzaG90LT5mbGFncyAmIFNuYXBzaG90OjprRmxhZ0RpcnR5T3J0aG87CisKKyAgICBzcDxTbmFwc2hvdD4gY3VycmVudCA9IG1TbmFwc2hvdDsKKyAgICBzcDxTbmFwc2hvdD4gcHJldmlvdXMgPSBtU25hcHNob3QtPnByZXZpb3VzOworCisgICAgaWYgKHJlc3RvcmVPcnRobykgeworICAgICAgICBSZWN0JiByID0gcHJldmlvdXMtPnZpZXdwb3J0OworICAgICAgICBnbFZpZXdwb3J0KHIubGVmdCwgci50b3AsIHIucmlnaHQsIHIuYm90dG9tKTsKKyAgICAgICAgbU9ydGhvTWF0cml4LmxvYWQoY3VycmVudC0+b3J0aG9NYXRyaXgpOworICAgIH0KKworICAgIG1TYXZlQ291bnQtLTsKKyAgICBtU25hcHNob3QgPSBwcmV2aW91czsKKworICAgIGlmIChyZXN0b3JlTGF5ZXIpIHsKKyAgICAgICAgY29tcG9zZUxheWVyKGN1cnJlbnQsIHByZXZpb3VzKTsKKyAgICB9CisKKyAgICBpZiAocmVzdG9yZUNsaXApIHsKKyAgICAgICAgc2V0U2Npc3NvckZyb21DbGlwKCk7CisgICAgfQorCisgICAgcmV0dXJuIHJlc3RvcmVDbGlwOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBMYXllcnMKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworaW50IE9wZW5HTFJlbmRlcmVyOjpzYXZlTGF5ZXIoZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLAorICAgICAgICBjb25zdCBTa1BhaW50KiBwLCBpbnQgZmxhZ3MpIHsKKyAgICBpbnQgY291bnQgPSBzYXZlU25hcHNob3QoKTsKKworICAgIGludCBhbHBoYSA9IDI1NTsKKyAgICBTa1hmZXJtb2RlOjpNb2RlIG1vZGU7CisKKyAgICBpZiAocCkgeworICAgICAgICBhbHBoYSA9IHAtPmdldEFscGhhKCk7CisgICAgICAgIGNvbnN0IGJvb2wgaXNNb2RlID0gU2tYZmVybW9kZTo6SXNNb2RlKHAtPmdldFhmZXJtb2RlKCksICZtb2RlKTsKKyAgICAgICAgaWYgKCFpc01vZGUpIHsKKyAgICAgICAgICAgIC8vIEFzc3VtZSBTUkNfT1ZFUgorICAgICAgICAgICAgbW9kZSA9IFNrWGZlcm1vZGU6OmtTcmNPdmVyX01vZGU7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBtb2RlID0gU2tYZmVybW9kZTo6a1NyY092ZXJfTW9kZTsKKyAgICB9CisKKyAgICBpZiAoYWxwaGEgPiAwICYmICFtU25hcHNob3QtPmludmlzaWJsZSkgeworICAgICAgICBjcmVhdGVMYXllcihtU25hcHNob3QsIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSwgYWxwaGEsIG1vZGUsIGZsYWdzKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtU25hcHNob3QtPmludmlzaWJsZSA9IHRydWU7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCitpbnQgT3BlbkdMUmVuZGVyZXI6OnNhdmVMYXllckFscGhhKGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwKKyAgICAgICAgaW50IGFscGhhLCBpbnQgZmxhZ3MpIHsKKyAgICBpbnQgY291bnQgPSBzYXZlU25hcHNob3QoKTsKKyAgICBpZiAoYWxwaGEgPiAwICYmICFtU25hcHNob3QtPmludmlzaWJsZSkgeworICAgICAgICBjcmVhdGVMYXllcihtU25hcHNob3QsIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSwgYWxwaGEsIFNrWGZlcm1vZGU6OmtTcmNPdmVyX01vZGUsIGZsYWdzKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtU25hcHNob3QtPmludmlzaWJsZSA9IHRydWU7CisgICAgfQorICAgIHJldHVybiBjb3VudDsKK30KKworYm9vbCBPcGVuR0xSZW5kZXJlcjo6Y3JlYXRlTGF5ZXIoc3A8U25hcHNob3Q+IHNuYXBzaG90LCBmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsCisgICAgICAgIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sIGludCBhbHBoYSwgU2tYZmVybW9kZTo6TW9kZSBtb2RlLGludCBmbGFncykgeworICAgIExBWUVSX0xPR0QoIlJlcXVlc3RpbmcgbGF5ZXIgJWZ4JWYiLCByaWdodCAtIGxlZnQsIGJvdHRvbSAtIHRvcCk7CisgICAgTEFZRVJfTE9HRCgiTGF5ZXIgY2FjaGUgc2l6ZSA9ICVkIiwgbUNhY2hlcy5sYXllckNhY2hlLmdldFNpemUoKSk7CisKKyAgICBHTHVpbnQgcHJldmlvdXNGYm8gPSBzbmFwc2hvdC0+cHJldmlvdXMuZ2V0KCkgPyBzbmFwc2hvdC0+cHJldmlvdXMtPmZibyA6IDA7CisgICAgTGF5ZXJTaXplIHNpemUocmlnaHQgLSBsZWZ0LCBib3R0b20gLSB0b3ApOworCisgICAgTGF5ZXIqIGxheWVyID0gbUNhY2hlcy5sYXllckNhY2hlLmdldChzaXplLCBwcmV2aW91c0Zibyk7CisgICAgaWYgKCFsYXllcikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgZ2xCaW5kRnJhbWVidWZmZXIoR0xfRlJBTUVCVUZGRVIsIGxheWVyLT5mYm8pOworCisgICAgLy8gQ2xlYXIgdGhlIEZCTworICAgIGdsRGlzYWJsZShHTF9TQ0lTU09SX1RFU1QpOworICAgIGdsQ2xlYXJDb2xvcigwLjBmLCAwLjBmLCAwLjBmLCAwLjBmKTsKKyAgICBnbENsZWFyKEdMX0NPTE9SX0JVRkZFUl9CSVQpOworICAgIGdsRW5hYmxlKEdMX1NDSVNTT1JfVEVTVCk7CisKKyAgICBsYXllci0+bW9kZSA9IG1vZGU7CisgICAgbGF5ZXItPmFscGhhID0gYWxwaGEgLyAyNTUuMGY7CisgICAgbGF5ZXItPmxheWVyLnNldChsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20pOworCisgICAgLy8gU2F2ZSB0aGUgbGF5ZXIgaW4gdGhlIHNuYXBzaG90CisgICAgc25hcHNob3QtPmZsYWdzIHw9IFNuYXBzaG90OjprRmxhZ0lzTGF5ZXI7CisgICAgc25hcHNob3QtPmxheWVyID0gbGF5ZXI7CisgICAgc25hcHNob3QtPmZibyA9IGxheWVyLT5mYm87CisgICAgc25hcHNob3QtPnRyYW5zZm9ybS5sb2FkVHJhbnNsYXRlKC1sZWZ0LCAtdG9wLCAwLjBmKTsKKyAgICBzbmFwc2hvdC0+c2V0Q2xpcCgwLjBmLCAwLjBmLCByaWdodCAtIGxlZnQsIGJvdHRvbSAtIHRvcCk7CisgICAgc25hcHNob3QtPnZpZXdwb3J0LnNldCgwLjBmLCAwLjBmLCByaWdodCAtIGxlZnQsIGJvdHRvbSAtIHRvcCk7CisgICAgc25hcHNob3QtPmhlaWdodCA9IGJvdHRvbSAtIHRvcDsKKyAgICBzbmFwc2hvdC0+ZmxhZ3MgfD0gU25hcHNob3Q6OmtGbGFnRGlydHlPcnRobzsKKyAgICBzbmFwc2hvdC0+b3J0aG9NYXRyaXgubG9hZChtT3J0aG9NYXRyaXgpOworCisgICAgc2V0U2Npc3NvckZyb21DbGlwKCk7CisKKyAgICAvLyBDaGFuZ2UgdGhlIG9ydGhvIHByb2plY3Rpb24KKyAgICBnbFZpZXdwb3J0KDAsIDAsIHJpZ2h0IC0gbGVmdCwgYm90dG9tIC0gdG9wKTsKKyAgICBtT3J0aG9NYXRyaXgubG9hZE9ydGhvKDAuMGYsIHJpZ2h0IC0gbGVmdCwgYm90dG9tIC0gdG9wLCAwLjBmLCAtMS4wZiwgMS4wZik7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBPcGVuR0xSZW5kZXJlcjo6Y29tcG9zZUxheWVyKHNwPFNuYXBzaG90PiBjdXJyZW50LCBzcDxTbmFwc2hvdD4gcHJldmlvdXMpIHsKKyAgICBpZiAoIWN1cnJlbnQtPmxheWVyKSB7CisgICAgICAgIExPR0UoIkF0dGVtcHRpbmcgdG8gY29tcG9zZSBhIGxheWVyIHRoYXQgZG9lcyBub3QgZXhpc3QiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIFVuYmluZCBjdXJyZW50IEZCTyBhbmQgcmVzdG9yZSBwcmV2aW91cyBvbmUKKyAgICAvLyBNb3N0IG9mIHRoZSB0aW1lLCBwcmV2aW91cy0+ZmJvIHdpbGwgYmUgMCB0byBiaW5kIHRoZSBkZWZhdWx0IGJ1ZmZlcgorICAgIGdsQmluZEZyYW1lYnVmZmVyKEdMX0ZSQU1FQlVGRkVSLCBwcmV2aW91cy0+ZmJvKTsKKworICAgIC8vIFJlc3RvcmUgdGhlIGNsaXAgZnJvbSB0aGUgcHJldmlvdXMgc25hcHNob3QKKyAgICBjb25zdCBSZWN0JiBjbGlwID0gcHJldmlvdXMtPmNsaXBSZWN0OworICAgIGdsU2Npc3NvcihjbGlwLmxlZnQsIG1IZWlnaHQgLSBjbGlwLmJvdHRvbSwgY2xpcC5nZXRXaWR0aCgpLCBjbGlwLmdldEhlaWdodCgpKTsKKworICAgIExheWVyKiBsYXllciA9IGN1cnJlbnQtPmxheWVyOworICAgIGNvbnN0IFJlY3QmIHJlY3QgPSBsYXllci0+bGF5ZXI7CisKKyAgICAvLyBGQk9zIGFyZSBhbHJlYWR5IGRyYXduIHdpdGggYSB0b3AtbGVmdCBvcmlnaW4sIGRvbid0IGZsaXAgdGhlIHRleHR1cmUKKyAgICByZXNldERyYXdUZXh0dXJlVGV4Q29vcmRzKDAuMGYsIDEuMGYsIDEuMGYsIDAuMGYpOworCisgICAgZHJhd1RleHR1cmVSZWN0KHJlY3QubGVmdCwgcmVjdC50b3AsIHJlY3QucmlnaHQsIHJlY3QuYm90dG9tLAorICAgICAgICAgICAgbGF5ZXItPnRleHR1cmUsIGxheWVyLT5hbHBoYSwgbGF5ZXItPm1vZGUsIGxheWVyLT5ibGVuZCk7CisKKyAgICByZXNldERyYXdUZXh0dXJlVGV4Q29vcmRzKDAuMGYsIDAuMGYsIDEuMGYsIDEuMGYpOworCisgICAgTGF5ZXJTaXplIHNpemUocmVjdC5nZXRXaWR0aCgpLCByZWN0LmdldEhlaWdodCgpKTsKKyAgICAvLyBGYWlsaW5nIHRvIGFkZCB0aGUgbGF5ZXIgdG8gdGhlIGNhY2hlIHNob3VsZCBoYXBwZW4gb25seSBpZiB0aGUKKyAgICAvLyBsYXllciBpcyB0b28gbGFyZ2UKKyAgICBpZiAoIW1DYWNoZXMubGF5ZXJDYWNoZS5wdXQoc2l6ZSwgbGF5ZXIpKSB7CisgICAgICAgIExBWUVSX0xPR0QoIkRlbGV0aW5nIGxheWVyIik7CisKKyAgICAgICAgZ2xEZWxldGVGcmFtZWJ1ZmZlcnMoMSwgJmxheWVyLT5mYm8pOworICAgICAgICBnbERlbGV0ZVRleHR1cmVzKDEsICZsYXllci0+dGV4dHVyZSk7CisKKyAgICAgICAgZGVsZXRlIGxheWVyOworICAgIH0KK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gVHJhbnNmb3JtcworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit2b2lkIE9wZW5HTFJlbmRlcmVyOjp0cmFuc2xhdGUoZmxvYXQgZHgsIGZsb2F0IGR5KSB7CisgICAgbVNuYXBzaG90LT50cmFuc2Zvcm0udHJhbnNsYXRlKGR4LCBkeSwgMC4wZik7Cit9CisKK3ZvaWQgT3BlbkdMUmVuZGVyZXI6OnJvdGF0ZShmbG9hdCBkZWdyZWVzKSB7CisgICAgbVNuYXBzaG90LT50cmFuc2Zvcm0ucm90YXRlKGRlZ3JlZXMsIDAuMGYsIDAuMGYsIDEuMGYpOworfQorCit2b2lkIE9wZW5HTFJlbmRlcmVyOjpzY2FsZShmbG9hdCBzeCwgZmxvYXQgc3kpIHsKKyAgICBtU25hcHNob3QtPnRyYW5zZm9ybS5zY2FsZShzeCwgc3ksIDEuMGYpOworfQorCit2b2lkIE9wZW5HTFJlbmRlcmVyOjpzZXRNYXRyaXgoU2tNYXRyaXgqIG1hdHJpeCkgeworICAgIG1TbmFwc2hvdC0+dHJhbnNmb3JtLmxvYWQoKm1hdHJpeCk7Cit9CisKK3ZvaWQgT3BlbkdMUmVuZGVyZXI6OmdldE1hdHJpeChTa01hdHJpeCogbWF0cml4KSB7CisgICAgbVNuYXBzaG90LT50cmFuc2Zvcm0uY29weVRvKCptYXRyaXgpOworfQorCit2b2lkIE9wZW5HTFJlbmRlcmVyOjpjb25jYXRNYXRyaXgoU2tNYXRyaXgqIG1hdHJpeCkgeworICAgIG1hdDQgbSgqbWF0cml4KTsKKyAgICBtU25hcHNob3QtPnRyYW5zZm9ybS5tdWx0aXBseShtKTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQ2xpcHBpbmcKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordm9pZCBPcGVuR0xSZW5kZXJlcjo6c2V0U2Npc3NvckZyb21DbGlwKCkgeworICAgIGNvbnN0IFJlY3QmIGNsaXAgPSBtU25hcHNob3QtPmNsaXBSZWN0OworICAgIGdsU2Npc3NvcihjbGlwLmxlZnQsIG1TbmFwc2hvdC0+aGVpZ2h0IC0gY2xpcC5ib3R0b20sIGNsaXAuZ2V0V2lkdGgoKSwgY2xpcC5nZXRIZWlnaHQoKSk7Cit9CisKK2NvbnN0IFJlY3QmIE9wZW5HTFJlbmRlcmVyOjpnZXRDbGlwQm91bmRzKCkgeworICAgIHJldHVybiBtU25hcHNob3QtPmdldExvY2FsQ2xpcCgpOworfQorCitib29sIE9wZW5HTFJlbmRlcmVyOjpxdWlja1JlamVjdChmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20pIHsKKyAgICBpZiAobVNuYXBzaG90LT5pbnZpc2libGUpIHJldHVybiB0cnVlOworCisgICAgUmVjdCByKGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSk7CisgICAgbVNuYXBzaG90LT50cmFuc2Zvcm0ubWFwUmVjdChyKTsKKyAgICByZXR1cm4gIW1TbmFwc2hvdC0+Y2xpcFJlY3QuaW50ZXJzZWN0cyhyKTsKK30KKworYm9vbCBPcGVuR0xSZW5kZXJlcjo6Y2xpcFJlY3QoZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLCBTa1JlZ2lvbjo6T3Agb3ApIHsKKyAgICBib29sIGNsaXBwZWQgPSBtU25hcHNob3QtPmNsaXAobGVmdCwgdG9wLCByaWdodCwgYm90dG9tLCBvcCk7CisgICAgaWYgKGNsaXBwZWQpIHsKKyAgICAgICAgc2V0U2Npc3NvckZyb21DbGlwKCk7CisgICAgfQorICAgIHJldHVybiAhbVNuYXBzaG90LT5jbGlwUmVjdC5pc0VtcHR5KCk7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIERyYXdpbmcKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordm9pZCBPcGVuR0xSZW5kZXJlcjo6ZHJhd0JpdG1hcChTa0JpdG1hcCogYml0bWFwLCBmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGNvbnN0IFNrUGFpbnQqIHBhaW50KSB7CisgICAgY29uc3QgZmxvYXQgcmlnaHQgPSBsZWZ0ICsgYml0bWFwLT53aWR0aCgpOworICAgIGNvbnN0IGZsb2F0IGJvdHRvbSA9IHRvcCArIGJpdG1hcC0+aGVpZ2h0KCk7CisKKyAgICBpZiAocXVpY2tSZWplY3QobGVmdCwgdG9wLCByaWdodCwgYm90dG9tKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZ2xBY3RpdmVUZXh0dXJlKEdMX1RFWFRVUkUwKTsKKyAgICBjb25zdCBUZXh0dXJlKiB0ZXh0dXJlID0gbUNhY2hlcy50ZXh0dXJlQ2FjaGUuZ2V0KGJpdG1hcCk7CisgICAgaWYgKCF0ZXh0dXJlKSByZXR1cm47CisgICAgY29uc3QgQXV0b1RleHR1cmUgYXV0b0NsZWFudXAodGV4dHVyZSk7CisKKyAgICBkcmF3VGV4dHVyZVJlY3QobGVmdCwgdG9wLCByaWdodCwgYm90dG9tLCB0ZXh0dXJlLCBwYWludCk7Cit9CisKK3ZvaWQgT3BlbkdMUmVuZGVyZXI6OmRyYXdCaXRtYXAoU2tCaXRtYXAqIGJpdG1hcCwgY29uc3QgU2tNYXRyaXgqIG1hdHJpeCwgY29uc3QgU2tQYWludCogcGFpbnQpIHsKKyAgICBSZWN0IHIoMC4wZiwgMC4wZiwgYml0bWFwLT53aWR0aCgpLCBiaXRtYXAtPmhlaWdodCgpKTsKKyAgICBjb25zdCBtYXQ0IHRyYW5zZm9ybSgqbWF0cml4KTsKKyAgICB0cmFuc2Zvcm0ubWFwUmVjdChyKTsKKworICAgIGlmIChxdWlja1JlamVjdChyLmxlZnQsIHIudG9wLCByLnJpZ2h0LCByLmJvdHRvbSkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGdsQWN0aXZlVGV4dHVyZShHTF9URVhUVVJFMCk7CisgICAgY29uc3QgVGV4dHVyZSogdGV4dHVyZSA9IG1DYWNoZXMudGV4dHVyZUNhY2hlLmdldChiaXRtYXApOworICAgIGlmICghdGV4dHVyZSkgcmV0dXJuOworICAgIGNvbnN0IEF1dG9UZXh0dXJlIGF1dG9DbGVhbnVwKHRleHR1cmUpOworCisgICAgZHJhd1RleHR1cmVSZWN0KHIubGVmdCwgci50b3AsIHIucmlnaHQsIHIuYm90dG9tLCB0ZXh0dXJlLCBwYWludCk7Cit9CisKK3ZvaWQgT3BlbkdMUmVuZGVyZXI6OmRyYXdCaXRtYXAoU2tCaXRtYXAqIGJpdG1hcCwKKyAgICAgICAgIGZsb2F0IHNyY0xlZnQsIGZsb2F0IHNyY1RvcCwgZmxvYXQgc3JjUmlnaHQsIGZsb2F0IHNyY0JvdHRvbSwKKyAgICAgICAgIGZsb2F0IGRzdExlZnQsIGZsb2F0IGRzdFRvcCwgZmxvYXQgZHN0UmlnaHQsIGZsb2F0IGRzdEJvdHRvbSwKKyAgICAgICAgIGNvbnN0IFNrUGFpbnQqIHBhaW50KSB7CisgICAgaWYgKHF1aWNrUmVqZWN0KGRzdExlZnQsIGRzdFRvcCwgZHN0UmlnaHQsIGRzdEJvdHRvbSkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGdsQWN0aXZlVGV4dHVyZShHTF9URVhUVVJFMCk7CisgICAgY29uc3QgVGV4dHVyZSogdGV4dHVyZSA9IG1DYWNoZXMudGV4dHVyZUNhY2hlLmdldChiaXRtYXApOworICAgIGlmICghdGV4dHVyZSkgcmV0dXJuOworICAgIGNvbnN0IEF1dG9UZXh0dXJlIGF1dG9DbGVhbnVwKHRleHR1cmUpOworCisgICAgY29uc3QgZmxvYXQgd2lkdGggPSB0ZXh0dXJlLT53aWR0aDsKKyAgICBjb25zdCBmbG9hdCBoZWlnaHQgPSB0ZXh0dXJlLT5oZWlnaHQ7CisKKyAgICBjb25zdCBmbG9hdCB1MSA9IHNyY0xlZnQgLyB3aWR0aDsKKyAgICBjb25zdCBmbG9hdCB2MSA9IHNyY1RvcCAvIGhlaWdodDsKKyAgICBjb25zdCBmbG9hdCB1MiA9IHNyY1JpZ2h0IC8gd2lkdGg7CisgICAgY29uc3QgZmxvYXQgdjIgPSBzcmNCb3R0b20gLyBoZWlnaHQ7CisKKyAgICByZXNldERyYXdUZXh0dXJlVGV4Q29vcmRzKHUxLCB2MSwgdTIsIHYyKTsKKworICAgIGRyYXdUZXh0dXJlUmVjdChkc3RMZWZ0LCBkc3RUb3AsIGRzdFJpZ2h0LCBkc3RCb3R0b20sIHRleHR1cmUsIHBhaW50KTsKKworICAgIHJlc2V0RHJhd1RleHR1cmVUZXhDb29yZHMoMC4wZiwgMC4wZiwgMS4wZiwgMS4wZik7Cit9CisKK3ZvaWQgT3BlbkdMUmVuZGVyZXI6OmRyYXdQYXRjaChTa0JpdG1hcCogYml0bWFwLCBSZXNfcG5nXzlwYXRjaCogcGF0Y2gsCisgICAgICAgIGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwgY29uc3QgU2tQYWludCogcGFpbnQpIHsKKyAgICBpZiAocXVpY2tSZWplY3QobGVmdCwgdG9wLCByaWdodCwgYm90dG9tKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZ2xBY3RpdmVUZXh0dXJlKEdMX1RFWFRVUkUwKTsKKyAgICBjb25zdCBUZXh0dXJlKiB0ZXh0dXJlID0gbUNhY2hlcy50ZXh0dXJlQ2FjaGUuZ2V0KGJpdG1hcCk7CisgICAgaWYgKCF0ZXh0dXJlKSByZXR1cm47CisgICAgY29uc3QgQXV0b1RleHR1cmUgYXV0b0NsZWFudXAodGV4dHVyZSk7CisKKyAgICBpbnQgYWxwaGE7CisgICAgU2tYZmVybW9kZTo6TW9kZSBtb2RlOworICAgIGdldEFscGhhQW5kTW9kZShwYWludCwgJmFscGhhLCAmbW9kZSk7CisKKyAgICBQYXRjaCogbWVzaCA9IG1DYWNoZXMucGF0Y2hDYWNoZS5nZXQocGF0Y2gpOworICAgIG1lc2gtPnVwZGF0ZVZlcnRpY2VzKGJpdG1hcCwgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tLAorICAgICAgICAgICAgJnBhdGNoLT54RGl2c1swXSwgJnBhdGNoLT55RGl2c1swXSwgcGF0Y2gtPm51bVhEaXZzLCBwYXRjaC0+bnVtWURpdnMpOworCisgICAgLy8gU3BlY2lmeSByaWdodCBhbmQgYm90dG9tIGFzICsxLjBmIGZyb20gbGVmdC90b3AgdG8gcHJldmVudCBzY2FsaW5nIHNpbmNlIHRoZQorICAgIC8vIHBhdGNoIG1lc2ggYWxyZWFkeSBkZWZpbmVzIHRoZSBmaW5hbCBzaXplCisgICAgZHJhd1RleHR1cmVNZXNoKGxlZnQsIHRvcCwgbGVmdCArIDEuMGYsIHRvcCArIDEuMGYsIHRleHR1cmUtPmlkLCBhbHBoYSAvIDI1NS4wZiwKKyAgICAgICAgICAgIG1vZGUsIHRleHR1cmUtPmJsZW5kLCAmbWVzaC0+dmVydGljZXNbMF0ucG9zaXRpb25bMF0sCisgICAgICAgICAgICAmbWVzaC0+dmVydGljZXNbMF0udGV4dHVyZVswXSwgbWVzaC0+aW5kaWNlcywgbWVzaC0+aW5kaWNlc0NvdW50KTsKK30KKwordm9pZCBPcGVuR0xSZW5kZXJlcjo6ZHJhd0NvbG9yKGludCBjb2xvciwgU2tYZmVybW9kZTo6TW9kZSBtb2RlKSB7CisgICAgaWYgKG1TbmFwc2hvdC0+aW52aXNpYmxlKSByZXR1cm47CisgICAgY29uc3QgUmVjdCYgY2xpcCA9IG1TbmFwc2hvdC0+Y2xpcFJlY3Q7CisgICAgZHJhd0NvbG9yUmVjdChjbGlwLmxlZnQsIGNsaXAudG9wLCBjbGlwLnJpZ2h0LCBjbGlwLmJvdHRvbSwgY29sb3IsIG1vZGUsIHRydWUpOworfQorCit2b2lkIE9wZW5HTFJlbmRlcmVyOjpkcmF3UmVjdChmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sIGNvbnN0IFNrUGFpbnQqIHApIHsKKyAgICBpZiAocXVpY2tSZWplY3QobGVmdCwgdG9wLCByaWdodCwgYm90dG9tKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgU2tYZmVybW9kZTo6TW9kZSBtb2RlOworCisgICAgY29uc3QgYm9vbCBpc01vZGUgPSBTa1hmZXJtb2RlOjpJc01vZGUocC0+Z2V0WGZlcm1vZGUoKSwgJm1vZGUpOworICAgIGlmICghaXNNb2RlKSB7CisgICAgICAgIC8vIEFzc3VtZSBTUkNfT1ZFUgorICAgICAgICBtb2RlID0gU2tYZmVybW9kZTo6a1NyY092ZXJfTW9kZTsKKyAgICB9CisKKyAgICAvLyBTa2lhIGRyYXdzIHVzaW5nIHRoZSBjb2xvcidzIGFscGhhIGNoYW5uZWwgaWYgPCAyNTUKKyAgICAvLyBPdGhlcndpc2UsIGl0IHVzZXMgdGhlIHBhaW50J3MgYWxwaGEKKyAgICBpbnQgY29sb3IgPSBwLT5nZXRDb2xvcigpOworICAgIGlmICgoKGNvbG9yID4+IDI0KSAmIDB4ZmYpID09IDI1NSkgeworICAgICAgICBjb2xvciB8PSBwLT5nZXRBbHBoYSgpIDw8IDI0OworICAgIH0KKworICAgIGRyYXdDb2xvclJlY3QobGVmdCwgdG9wLCByaWdodCwgYm90dG9tLCBjb2xvciwgbW9kZSk7Cit9CisKK3ZvaWQgT3BlbkdMUmVuZGVyZXI6OmRyYXdUZXh0KGNvbnN0IGNoYXIqIHRleHQsIGludCBieXRlc0NvdW50LCBpbnQgY291bnQsCisgICAgICAgIGZsb2F0IHgsIGZsb2F0IHksIFNrUGFpbnQqIHBhaW50KSB7CisgICAgaWYgKG1TbmFwc2hvdC0+aW52aXNpYmxlIHx8IHRleHQgPT0gTlVMTCB8fCBjb3VudCA9PSAwIHx8CisgICAgICAgICAgICAocGFpbnQtPmdldEFscGhhKCkgPT0gMCAmJiBwYWludC0+Z2V0WGZlcm1vZGUoKSA9PSBOVUxMKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZmxvYXQgc2NhbGVYID0gcGFpbnQtPmdldFRleHRTY2FsZVgoKTsKKyAgICBib29sIGFwcGx5U2NhbGVYID0gc2NhbGVYIDwgMC45OTk5ZiB8fCBzY2FsZVggPiAxLjAwMDFmOworICAgIGlmIChhcHBseVNjYWxlWCkgeworICAgICAgICBzYXZlKDApOworICAgICAgICB0cmFuc2xhdGUoeCAtICh4ICogc2NhbGVYKSwgMC4wZik7CisgICAgICAgIHNjYWxlKHNjYWxlWCwgMS4wZik7CisgICAgfQorCisgICAgZmxvYXQgbGVuZ3RoID0gLTEuMGY7CisgICAgc3dpdGNoIChwYWludC0+Z2V0VGV4dEFsaWduKCkpIHsKKyAgICAgICAgY2FzZSBTa1BhaW50OjprQ2VudGVyX0FsaWduOgorICAgICAgICAgICAgbGVuZ3RoID0gcGFpbnQtPm1lYXN1cmVUZXh0KHRleHQsIGJ5dGVzQ291bnQpOworICAgICAgICAgICAgeCAtPSBsZW5ndGggLyAyLjBmOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU2tQYWludDo6a1JpZ2h0X0FsaWduOgorICAgICAgICAgICAgbGVuZ3RoID0gcGFpbnQtPm1lYXN1cmVUZXh0KHRleHQsIGJ5dGVzQ291bnQpOworICAgICAgICAgICAgeCAtPSBsZW5ndGg7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGludCBhbHBoYTsKKyAgICBTa1hmZXJtb2RlOjpNb2RlIG1vZGU7CisgICAgZ2V0QWxwaGFBbmRNb2RlKHBhaW50LCAmYWxwaGEsICZtb2RlKTsKKworICAgIHVpbnQzMl90IGNvbG9yID0gcGFpbnQtPmdldENvbG9yKCk7CisgICAgY29uc3QgR0xmbG9hdCBhID0gYWxwaGEgLyAyNTUuMGY7CisgICAgY29uc3QgR0xmbG9hdCByID0gYSAqICgoY29sb3IgPj4gMTYpICYgMHhGRikgLyAyNTUuMGY7CisgICAgY29uc3QgR0xmbG9hdCBnID0gYSAqICgoY29sb3IgPj4gIDgpICYgMHhGRikgLyAyNTUuMGY7CisgICAgY29uc3QgR0xmbG9hdCBiID0gYSAqICgoY29sb3IgICAgICApICYgMHhGRikgLyAyNTUuMGY7CisKKyAgICBtQ2FjaGVzLmZvbnRSZW5kZXJlci5zZXRGb250KHBhaW50LCBTa1R5cGVmYWNlOjpVbmlxdWVJRChwYWludC0+Z2V0VHlwZWZhY2UoKSksCisgICAgICAgICAgICBwYWludC0+Z2V0VGV4dFNpemUoKSk7CisgICAgaWYgKG1IYXNTaGFkb3cpIHsKKyAgICAgICAgZ2xBY3RpdmVUZXh0dXJlKGdUZXh0dXJlVW5pdHNbMF0pOworICAgICAgICBjb25zdCBTaGFkb3dUZXh0dXJlKiBzaGFkb3cgPSBtQ2FjaGVzLmRyb3BTaGFkb3dDYWNoZS5nZXQocGFpbnQsIHRleHQsIGJ5dGVzQ291bnQsCisgICAgICAgICAgICAgICAgY291bnQsIG1TaGFkb3dSYWRpdXMpOworICAgICAgICBjb25zdCBBdXRvVGV4dHVyZSBhdXRvQ2xlYW51cChzaGFkb3cpOworCisgICAgICAgIHNldHVwU2hhZG93KHNoYWRvdywgeCwgeSwgbW9kZSwgYSk7CisKKyAgICAgICAgLy8gRHJhdyB0aGUgbWVzaAorICAgICAgICBnbERyYXdBcnJheXMoR0xfVFJJQU5HTEVfU1RSSVAsIDAsIGdNZXNoQ291bnQpOworICAgICAgICBnbERpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheShtQ2FjaGVzLmN1cnJlbnRQcm9ncmFtLT5nZXRBdHRyaWIoInRleENvb3JkcyIpKTsKKyAgICB9CisKKyAgICBHTHVpbnQgdGV4dHVyZVVuaXQgPSAwOworICAgIGdsQWN0aXZlVGV4dHVyZShnVGV4dHVyZVVuaXRzW3RleHR1cmVVbml0XSk7CisKKyAgICBzZXR1cFRleHR1cmVBbHBoYTgobUNhY2hlcy5mb250UmVuZGVyZXIuZ2V0VGV4dHVyZSgpLCAwLCAwLCB0ZXh0dXJlVW5pdCwgeCwgeSwgciwgZywgYiwgYSwKKyAgICAgICAgICAgIG1vZGUsIGZhbHNlLCB0cnVlKTsKKworICAgIGNvbnN0IFJlY3QmIGNsaXAgPSBtU25hcHNob3QtPmdldExvY2FsQ2xpcCgpOworICAgIG1DYWNoZXMuZm9udFJlbmRlcmVyLnJlbmRlclRleHQocGFpbnQsICZjbGlwLCB0ZXh0LCAwLCBieXRlc0NvdW50LCBjb3VudCwgeCwgeSk7CisKKyAgICBnbEJpbmRCdWZmZXIoR0xfRUxFTUVOVF9BUlJBWV9CVUZGRVIsIDApOworICAgIGdsRGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KG1DYWNoZXMuY3VycmVudFByb2dyYW0tPmdldEF0dHJpYigidGV4Q29vcmRzIikpOworCisgICAgZHJhd1RleHREZWNvcmF0aW9ucyh0ZXh0LCBieXRlc0NvdW50LCBsZW5ndGgsIHgsIHksIHBhaW50KTsKKworICAgIGlmIChhcHBseVNjYWxlWCkgeworICAgICAgICByZXN0b3JlKCk7CisgICAgfQorfQorCit2b2lkIE9wZW5HTFJlbmRlcmVyOjpkcmF3UGF0aChTa1BhdGgqIHBhdGgsIFNrUGFpbnQqIHBhaW50KSB7CisgICAgaWYgKG1TbmFwc2hvdC0+aW52aXNpYmxlKSByZXR1cm47CisKKyAgICBHTHVpbnQgdGV4dHVyZVVuaXQgPSAwOworICAgIGdsQWN0aXZlVGV4dHVyZShnVGV4dHVyZVVuaXRzW3RleHR1cmVVbml0XSk7CisKKyAgICBjb25zdCBQYXRoVGV4dHVyZSogdGV4dHVyZSA9IG1DYWNoZXMucGF0aENhY2hlLmdldChwYXRoLCBwYWludCk7CisgICAgaWYgKCF0ZXh0dXJlKSByZXR1cm47CisgICAgY29uc3QgQXV0b1RleHR1cmUgYXV0b0NsZWFudXAodGV4dHVyZSk7CisKKyAgICBjb25zdCBmbG9hdCB4ID0gdGV4dHVyZS0+bGVmdCAtIHRleHR1cmUtPm9mZnNldDsKKyAgICBjb25zdCBmbG9hdCB5ID0gdGV4dHVyZS0+dG9wIC0gdGV4dHVyZS0+b2Zmc2V0OworCisgICAgaWYgKHF1aWNrUmVqZWN0KHgsIHksIHggKyB0ZXh0dXJlLT53aWR0aCwgeSArIHRleHR1cmUtPmhlaWdodCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGludCBhbHBoYTsKKyAgICBTa1hmZXJtb2RlOjpNb2RlIG1vZGU7CisgICAgZ2V0QWxwaGFBbmRNb2RlKHBhaW50LCAmYWxwaGEsICZtb2RlKTsKKworICAgIHVpbnQzMl90IGNvbG9yID0gcGFpbnQtPmdldENvbG9yKCk7CisgICAgY29uc3QgR0xmbG9hdCBhID0gYWxwaGEgLyAyNTUuMGY7CisgICAgY29uc3QgR0xmbG9hdCByID0gYSAqICgoY29sb3IgPj4gMTYpICYgMHhGRikgLyAyNTUuMGY7CisgICAgY29uc3QgR0xmbG9hdCBnID0gYSAqICgoY29sb3IgPj4gIDgpICYgMHhGRikgLyAyNTUuMGY7CisgICAgY29uc3QgR0xmbG9hdCBiID0gYSAqICgoY29sb3IgICAgICApICYgMHhGRikgLyAyNTUuMGY7CisKKyAgICBzZXR1cFRleHR1cmVBbHBoYTgodGV4dHVyZSwgdGV4dHVyZVVuaXQsIHgsIHksIHIsIGcsIGIsIGEsIG1vZGUsIHRydWUsIHRydWUpOworCisgICAgLy8gRHJhdyB0aGUgbWVzaAorICAgIGdsRHJhd0FycmF5cyhHTF9UUklBTkdMRV9TVFJJUCwgMCwgZ01lc2hDb3VudCk7CisgICAgZ2xEaXNhYmxlVmVydGV4QXR0cmliQXJyYXkobUNhY2hlcy5jdXJyZW50UHJvZ3JhbS0+Z2V0QXR0cmliKCJ0ZXhDb29yZHMiKSk7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFNoYWRlcnMKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordm9pZCBPcGVuR0xSZW5kZXJlcjo6cmVzZXRTaGFkZXIoKSB7CisgICAgbVNoYWRlciA9IE5VTEw7Cit9CisKK3ZvaWQgT3BlbkdMUmVuZGVyZXI6OnNldHVwU2hhZGVyKFNraWFTaGFkZXIqIHNoYWRlcikgeworICAgIG1TaGFkZXIgPSBzaGFkZXI7CisgICAgaWYgKG1TaGFkZXIpIHsKKyAgICAgICAgbVNoYWRlci0+c2V0KCZtQ2FjaGVzLnRleHR1cmVDYWNoZSwgJm1DYWNoZXMuZ3JhZGllbnRDYWNoZSk7CisgICAgfQorfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDb2xvciBmaWx0ZXJzCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3ZvaWQgT3BlbkdMUmVuZGVyZXI6OnJlc2V0Q29sb3JGaWx0ZXIoKSB7CisgICAgbUNvbG9yRmlsdGVyID0gTlVMTDsKK30KKwordm9pZCBPcGVuR0xSZW5kZXJlcjo6c2V0dXBDb2xvckZpbHRlcihTa2lhQ29sb3JGaWx0ZXIqIGZpbHRlcikgeworICAgIG1Db2xvckZpbHRlciA9IGZpbHRlcjsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gRHJvcCBzaGFkb3cKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordm9pZCBPcGVuR0xSZW5kZXJlcjo6cmVzZXRTaGFkb3coKSB7CisgICAgbUhhc1NoYWRvdyA9IGZhbHNlOworfQorCit2b2lkIE9wZW5HTFJlbmRlcmVyOjpzZXR1cFNoYWRvdyhmbG9hdCByYWRpdXMsIGZsb2F0IGR4LCBmbG9hdCBkeSwgaW50IGNvbG9yKSB7CisgICAgbUhhc1NoYWRvdyA9IHRydWU7CisgICAgbVNoYWRvd1JhZGl1cyA9IHJhZGl1czsKKyAgICBtU2hhZG93RHggPSBkeDsKKyAgICBtU2hhZG93RHkgPSBkeTsKKyAgICBtU2hhZG93Q29sb3IgPSBjb2xvcjsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gRHJhd2luZyBpbXBsZW1lbnRhdGlvbgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit2b2lkIE9wZW5HTFJlbmRlcmVyOjpzZXR1cFNoYWRvdyhjb25zdCBTaGFkb3dUZXh0dXJlKiB0ZXh0dXJlLCBmbG9hdCB4LCBmbG9hdCB5LAorICAgICAgICBTa1hmZXJtb2RlOjpNb2RlIG1vZGUsIGZsb2F0IGFscGhhKSB7CisgICAgY29uc3QgZmxvYXQgc3ggPSB4IC0gdGV4dHVyZS0+bGVmdCArIG1TaGFkb3dEeDsKKyAgICBjb25zdCBmbG9hdCBzeSA9IHkgLSB0ZXh0dXJlLT50b3AgKyBtU2hhZG93RHk7CisKKyAgICBjb25zdCBpbnQgc2hhZG93QWxwaGEgPSAoKG1TaGFkb3dDb2xvciA+PiAyNCkgJiAweEZGKTsKKyAgICBjb25zdCBHTGZsb2F0IGEgPSBzaGFkb3dBbHBoYSA8IDI1NSA/IHNoYWRvd0FscGhhIC8gMjU1LjBmIDogYWxwaGE7CisgICAgY29uc3QgR0xmbG9hdCByID0gYSAqICgobVNoYWRvd0NvbG9yID4+IDE2KSAmIDB4RkYpIC8gMjU1LjBmOworICAgIGNvbnN0IEdMZmxvYXQgZyA9IGEgKiAoKG1TaGFkb3dDb2xvciA+PiAgOCkgJiAweEZGKSAvIDI1NS4wZjsKKyAgICBjb25zdCBHTGZsb2F0IGIgPSBhICogKChtU2hhZG93Q29sb3IgICAgICApICYgMHhGRikgLyAyNTUuMGY7CisKKyAgICBHTHVpbnQgdGV4dHVyZVVuaXQgPSAwOworICAgIHNldHVwVGV4dHVyZUFscGhhOCh0ZXh0dXJlLCB0ZXh0dXJlVW5pdCwgc3gsIHN5LCByLCBnLCBiLCBhLCBtb2RlLCB0cnVlLCBmYWxzZSk7Cit9CisKK3ZvaWQgT3BlbkdMUmVuZGVyZXI6OnNldHVwVGV4dHVyZUFscGhhOChjb25zdCBUZXh0dXJlKiB0ZXh0dXJlLCBHTHVpbnQmIHRleHR1cmVVbml0LAorICAgICAgICBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCByLCBmbG9hdCBnLCBmbG9hdCBiLCBmbG9hdCBhLCBTa1hmZXJtb2RlOjpNb2RlIG1vZGUsCisgICAgICAgIGJvb2wgdHJhbnNmb3JtcywgYm9vbCBhcHBseUZpbHRlcnMpIHsKKyAgICBzZXR1cFRleHR1cmVBbHBoYTgodGV4dHVyZS0+aWQsIHRleHR1cmUtPndpZHRoLCB0ZXh0dXJlLT5oZWlnaHQsIHRleHR1cmVVbml0LAorICAgICAgICAgICAgeCwgeSwgciwgZywgYiwgYSwgbW9kZSwgdHJhbnNmb3JtcywgYXBwbHlGaWx0ZXJzKTsKK30KKwordm9pZCBPcGVuR0xSZW5kZXJlcjo6c2V0dXBUZXh0dXJlQWxwaGE4KEdMdWludCB0ZXh0dXJlLCB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LAorICAgICAgICBHTHVpbnQmIHRleHR1cmVVbml0LCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCByLCBmbG9hdCBnLCBmbG9hdCBiLCBmbG9hdCBhLAorICAgICAgICBTa1hmZXJtb2RlOjpNb2RlIG1vZGUsIGJvb2wgdHJhbnNmb3JtcywgYm9vbCBhcHBseUZpbHRlcnMpIHsKKyAgICAgLy8gRGVzY3JpYmUgdGhlIHJlcXVpcmVkIHNoYWRlcnMKKyAgICAgUHJvZ3JhbURlc2NyaXB0aW9uIGRlc2NyaXB0aW9uOworICAgICBkZXNjcmlwdGlvbi5oYXNUZXh0dXJlID0gdHJ1ZTsKKyAgICAgZGVzY3JpcHRpb24uaGFzQWxwaGE4VGV4dHVyZSA9IHRydWU7CisKKyAgICAgaWYgKGFwcGx5RmlsdGVycykgeworICAgICAgICAgaWYgKG1TaGFkZXIpIHsKKyAgICAgICAgICAgICBtU2hhZGVyLT5kZXNjcmliZShkZXNjcmlwdGlvbiwgbUV4dGVuc2lvbnMpOworICAgICAgICAgfQorICAgICAgICAgaWYgKG1Db2xvckZpbHRlcikgeworICAgICAgICAgICAgIG1Db2xvckZpbHRlci0+ZGVzY3JpYmUoZGVzY3JpcHRpb24sIG1FeHRlbnNpb25zKTsKKyAgICAgICAgIH0KKyAgICAgfQorCisgICAgIC8vIEJ1aWxkIGFuZCB1c2UgdGhlIGFwcHJvcHJpYXRlIHNoYWRlcgorICAgICB1c2VQcm9ncmFtKG1DYWNoZXMucHJvZ3JhbUNhY2hlLmdldChkZXNjcmlwdGlvbikpOworCisgICAgIC8vIFNldHVwIHRoZSBibGVuZGluZyBtb2RlCisgICAgIGNob29zZUJsZW5kaW5nKHRydWUsIG1vZGUpOworICAgICBiaW5kVGV4dHVyZSh0ZXh0dXJlLCBHTF9DTEFNUF9UT19FREdFLCBHTF9DTEFNUF9UT19FREdFLCB0ZXh0dXJlVW5pdCk7CisgICAgIGdsVW5pZm9ybTFpKG1DYWNoZXMuY3VycmVudFByb2dyYW0tPmdldFVuaWZvcm0oInNhbXBsZXIiKSwgdGV4dHVyZVVuaXQpOworCisgICAgIGludCB0ZXhDb29yZHNTbG90ID0gbUNhY2hlcy5jdXJyZW50UHJvZ3JhbS0+Z2V0QXR0cmliKCJ0ZXhDb29yZHMiKTsKKyAgICAgZ2xFbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSh0ZXhDb29yZHNTbG90KTsKKworICAgICAvLyBTZXR1cCBhdHRyaWJ1dGVzCisgICAgIGdsVmVydGV4QXR0cmliUG9pbnRlcihtQ2FjaGVzLmN1cnJlbnRQcm9ncmFtLT5wb3NpdGlvbiwgMiwgR0xfRkxPQVQsIEdMX0ZBTFNFLAorICAgICAgICAgICAgIGdNZXNoU3RyaWRlLCAmbU1lc2hWZXJ0aWNlc1swXS5wb3NpdGlvblswXSk7CisgICAgIGdsVmVydGV4QXR0cmliUG9pbnRlcih0ZXhDb29yZHNTbG90LCAyLCBHTF9GTE9BVCwgR0xfRkFMU0UsCisgICAgICAgICAgICAgZ01lc2hTdHJpZGUsICZtTWVzaFZlcnRpY2VzWzBdLnRleHR1cmVbMF0pOworCisgICAgIC8vIFNldHVwIHVuaWZvcm1zCisgICAgIGlmICh0cmFuc2Zvcm1zKSB7CisgICAgICAgICBtTW9kZWxWaWV3LmxvYWRUcmFuc2xhdGUoeCwgeSwgMC4wZik7CisgICAgICAgICBtTW9kZWxWaWV3LnNjYWxlKHdpZHRoLCBoZWlnaHQsIDEuMGYpOworICAgICB9IGVsc2UgeworICAgICAgICAgbU1vZGVsVmlldy5sb2FkSWRlbnRpdHkoKTsKKyAgICAgfQorICAgICBtQ2FjaGVzLmN1cnJlbnRQcm9ncmFtLT5zZXQobU9ydGhvTWF0cml4LCBtTW9kZWxWaWV3LCBtU25hcHNob3QtPnRyYW5zZm9ybSk7CisgICAgIGdsVW5pZm9ybTRmKG1DYWNoZXMuY3VycmVudFByb2dyYW0tPmNvbG9yLCByLCBnLCBiLCBhKTsKKworICAgICB0ZXh0dXJlVW5pdCsrOworICAgICBpZiAoYXBwbHlGaWx0ZXJzKSB7CisgICAgICAgICAvLyBTZXR1cCBhdHRyaWJ1dGVzIGFuZCB1bmlmb3JtcyByZXF1aXJlZCBieSB0aGUgc2hhZGVycworICAgICAgICAgaWYgKG1TaGFkZXIpIHsKKyAgICAgICAgICAgICBtU2hhZGVyLT5zZXR1cFByb2dyYW0obUNhY2hlcy5jdXJyZW50UHJvZ3JhbSwgbU1vZGVsVmlldywgKm1TbmFwc2hvdCwgJnRleHR1cmVVbml0KTsKKyAgICAgICAgIH0KKyAgICAgICAgIGlmIChtQ29sb3JGaWx0ZXIpIHsKKyAgICAgICAgICAgICBtQ29sb3JGaWx0ZXItPnNldHVwUHJvZ3JhbShtQ2FjaGVzLmN1cnJlbnRQcm9ncmFtKTsKKyAgICAgICAgIH0KKyAgICAgfQorfQorCisjZGVmaW5lIGtTdGRTdHJpa2VUaHJ1X09mZnNldCAgICgtNi4wZiAvIDIxLjBmKQorI2RlZmluZSBrU3RkVW5kZXJsaW5lX09mZnNldCAgICAoMS4wZiAvIDkuMGYpCisjZGVmaW5lIGtTdGRVbmRlcmxpbmVfVGhpY2tuZXNzICgxLjBmIC8gMTguMGYpCisKK3ZvaWQgT3BlbkdMUmVuZGVyZXI6OmRyYXdUZXh0RGVjb3JhdGlvbnMoY29uc3QgY2hhciogdGV4dCwgaW50IGJ5dGVzQ291bnQsIGZsb2F0IGxlbmd0aCwKKyAgICAgICAgZmxvYXQgeCwgZmxvYXQgeSwgU2tQYWludCogcGFpbnQpIHsKKyAgICAvLyBIYW5kbGUgdW5kZXJsaW5lIGFuZCBzdHJpa2UtdGhyb3VnaAorICAgIHVpbnQzMl90IGZsYWdzID0gcGFpbnQtPmdldEZsYWdzKCk7CisgICAgaWYgKGZsYWdzICYgKFNrUGFpbnQ6OmtVbmRlcmxpbmVUZXh0X0ZsYWcgfCBTa1BhaW50OjprU3RyaWtlVGhydVRleHRfRmxhZykpIHsKKyAgICAgICAgZmxvYXQgdW5kZXJsaW5lV2lkdGggPSBsZW5ndGg7CisgICAgICAgIC8vIElmIGxlbmd0aCBpcyA+IDAuMGYsIHdlIGFscmVhZHkgbWVhc3VyZWQgdGhlIHRleHQgZm9yIHRoZSB0ZXh0IGFsaWdubWVudAorICAgICAgICBpZiAobGVuZ3RoIDw9IDAuMGYpIHsKKyAgICAgICAgICAgIHVuZGVybGluZVdpZHRoID0gcGFpbnQtPm1lYXN1cmVUZXh0KHRleHQsIGJ5dGVzQ291bnQpOworICAgICAgICB9CisKKyAgICAgICAgZmxvYXQgb2Zmc2V0WCA9IDA7CisgICAgICAgIHN3aXRjaCAocGFpbnQtPmdldFRleHRBbGlnbigpKSB7CisgICAgICAgICAgICBjYXNlIFNrUGFpbnQ6OmtDZW50ZXJfQWxpZ246CisgICAgICAgICAgICAgICAgb2Zmc2V0WCA9IHVuZGVybGluZVdpZHRoICogMC41ZjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU2tQYWludDo6a1JpZ2h0X0FsaWduOgorICAgICAgICAgICAgICAgIG9mZnNldFggPSB1bmRlcmxpbmVXaWR0aDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAodW5kZXJsaW5lV2lkdGggPiAwLjBmKSB7CisgICAgICAgICAgICBmbG9hdCB0ZXh0U2l6ZSA9IHBhaW50LT5nZXRUZXh0U2l6ZSgpOworICAgICAgICAgICAgZmxvYXQgaGVpZ2h0ID0gdGV4dFNpemUgKiBrU3RkVW5kZXJsaW5lX1RoaWNrbmVzczsKKworICAgICAgICAgICAgZmxvYXQgbGVmdCA9IHggLSBvZmZzZXRYOworICAgICAgICAgICAgZmxvYXQgdG9wID0gMC4wZjsKKyAgICAgICAgICAgIGZsb2F0IHJpZ2h0ID0gbGVmdCArIHVuZGVybGluZVdpZHRoOworICAgICAgICAgICAgZmxvYXQgYm90dG9tID0gMC4wZjsKKworICAgICAgICAgICAgaWYgKGZsYWdzICYgU2tQYWludDo6a1VuZGVybGluZVRleHRfRmxhZykgeworICAgICAgICAgICAgICAgIHRvcCA9IHkgKyB0ZXh0U2l6ZSAqIGtTdGRVbmRlcmxpbmVfT2Zmc2V0OworICAgICAgICAgICAgICAgIGJvdHRvbSA9IHRvcCArIGhlaWdodDsKKyAgICAgICAgICAgICAgICBkcmF3UmVjdChsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20sIHBhaW50KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZsYWdzICYgU2tQYWludDo6a1N0cmlrZVRocnVUZXh0X0ZsYWcpIHsKKyAgICAgICAgICAgICAgICB0b3AgPSB5ICsgdGV4dFNpemUgKiBrU3RkU3RyaWtlVGhydV9PZmZzZXQ7CisgICAgICAgICAgICAgICAgYm90dG9tID0gdG9wICsgaGVpZ2h0OworICAgICAgICAgICAgICAgIGRyYXdSZWN0KGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSwgcGFpbnQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCit2b2lkIE9wZW5HTFJlbmRlcmVyOjpkcmF3Q29sb3JSZWN0KGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwKKyAgICAgICAgaW50IGNvbG9yLCBTa1hmZXJtb2RlOjpNb2RlIG1vZGUsIGJvb2wgaWdub3JlVHJhbnNmb3JtKSB7CisgICAgLy8gSWYgYSBzaGFkZXIgaXMgc2V0LCBwcmVzZXJ2ZSBvbmx5IHRoZSBhbHBoYQorICAgIGlmIChtU2hhZGVyKSB7CisgICAgICAgIGNvbG9yIHw9IDB4MDBmZmZmZmY7CisgICAgfQorCisgICAgLy8gUmVuZGVyIHVzaW5nIHByZS1tdWx0aXBsaWVkIGFscGhhCisgICAgY29uc3QgaW50IGFscGhhID0gKGNvbG9yID4+IDI0KSAmIDB4RkY7CisgICAgY29uc3QgR0xmbG9hdCBhID0gYWxwaGEgLyAyNTUuMGY7CisgICAgY29uc3QgR0xmbG9hdCByID0gYSAqICgoY29sb3IgPj4gMTYpICYgMHhGRikgLyAyNTUuMGY7CisgICAgY29uc3QgR0xmbG9hdCBnID0gYSAqICgoY29sb3IgPj4gIDgpICYgMHhGRikgLyAyNTUuMGY7CisgICAgY29uc3QgR0xmbG9hdCBiID0gYSAqICgoY29sb3IgICAgICApICYgMHhGRikgLyAyNTUuMGY7CisKKyAgICBHTHVpbnQgdGV4dHVyZVVuaXQgPSAwOworCisgICAgLy8gU2V0dXAgdGhlIGJsZW5kaW5nIG1vZGUKKyAgICBjaG9vc2VCbGVuZGluZyhhbHBoYSA8IDI1NSB8fCAobVNoYWRlciAmJiBtU2hhZGVyLT5ibGVuZCgpKSwgbW9kZSk7CisKKyAgICAvLyBEZXNjcmliZSB0aGUgcmVxdWlyZWQgc2hhZGVycworICAgIFByb2dyYW1EZXNjcmlwdGlvbiBkZXNjcmlwdGlvbjsKKyAgICBpZiAobVNoYWRlcikgeworICAgICAgICBtU2hhZGVyLT5kZXNjcmliZShkZXNjcmlwdGlvbiwgbUV4dGVuc2lvbnMpOworICAgIH0KKyAgICBpZiAobUNvbG9yRmlsdGVyKSB7CisgICAgICAgIG1Db2xvckZpbHRlci0+ZGVzY3JpYmUoZGVzY3JpcHRpb24sIG1FeHRlbnNpb25zKTsKKyAgICB9CisKKyAgICAvLyBCdWlsZCBhbmQgdXNlIHRoZSBhcHByb3ByaWF0ZSBzaGFkZXIKKyAgICB1c2VQcm9ncmFtKG1DYWNoZXMucHJvZ3JhbUNhY2hlLmdldChkZXNjcmlwdGlvbikpOworCisgICAgLy8gU2V0dXAgYXR0cmlidXRlcworICAgIGdsVmVydGV4QXR0cmliUG9pbnRlcihtQ2FjaGVzLmN1cnJlbnRQcm9ncmFtLT5wb3NpdGlvbiwgMiwgR0xfRkxPQVQsIEdMX0ZBTFNFLAorICAgICAgICAgICAgZ01lc2hTdHJpZGUsICZtTWVzaFZlcnRpY2VzWzBdLnBvc2l0aW9uWzBdKTsKKworICAgIC8vIFNldHVwIHVuaWZvcm1zCisgICAgbU1vZGVsVmlldy5sb2FkVHJhbnNsYXRlKGxlZnQsIHRvcCwgMC4wZik7CisgICAgbU1vZGVsVmlldy5zY2FsZShyaWdodCAtIGxlZnQsIGJvdHRvbSAtIHRvcCwgMS4wZik7CisgICAgaWYgKCFpZ25vcmVUcmFuc2Zvcm0pIHsKKyAgICAgICAgbUNhY2hlcy5jdXJyZW50UHJvZ3JhbS0+c2V0KG1PcnRob01hdHJpeCwgbU1vZGVsVmlldywgbVNuYXBzaG90LT50cmFuc2Zvcm0pOworICAgIH0gZWxzZSB7CisgICAgICAgIG1hdDQgaWRlbnRpdHk7CisgICAgICAgIG1DYWNoZXMuY3VycmVudFByb2dyYW0tPnNldChtT3J0aG9NYXRyaXgsIG1Nb2RlbFZpZXcsIGlkZW50aXR5KTsKKyAgICB9CisgICAgZ2xVbmlmb3JtNGYobUNhY2hlcy5jdXJyZW50UHJvZ3JhbS0+Y29sb3IsIHIsIGcsIGIsIGEpOworCisgICAgLy8gU2V0dXAgYXR0cmlidXRlcyBhbmQgdW5pZm9ybXMgcmVxdWlyZWQgYnkgdGhlIHNoYWRlcnMKKyAgICBpZiAobVNoYWRlcikgeworICAgICAgICBtU2hhZGVyLT5zZXR1cFByb2dyYW0obUNhY2hlcy5jdXJyZW50UHJvZ3JhbSwgbU1vZGVsVmlldywgKm1TbmFwc2hvdCwgJnRleHR1cmVVbml0KTsKKyAgICB9CisgICAgaWYgKG1Db2xvckZpbHRlcikgeworICAgICAgICBtQ29sb3JGaWx0ZXItPnNldHVwUHJvZ3JhbShtQ2FjaGVzLmN1cnJlbnRQcm9ncmFtKTsKKyAgICB9CisKKyAgICAvLyBEcmF3IHRoZSBtZXNoCisgICAgZ2xEcmF3QXJyYXlzKEdMX1RSSUFOR0xFX1NUUklQLCAwLCBnTWVzaENvdW50KTsKK30KKwordm9pZCBPcGVuR0xSZW5kZXJlcjo6ZHJhd1RleHR1cmVSZWN0KGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwKKyAgICAgICAgY29uc3QgVGV4dHVyZSogdGV4dHVyZSwgY29uc3QgU2tQYWludCogcGFpbnQpIHsKKyAgICBpbnQgYWxwaGE7CisgICAgU2tYZmVybW9kZTo6TW9kZSBtb2RlOworICAgIGdldEFscGhhQW5kTW9kZShwYWludCwgJmFscGhhLCAmbW9kZSk7CisKKyAgICBkcmF3VGV4dHVyZU1lc2gobGVmdCwgdG9wLCByaWdodCwgYm90dG9tLCB0ZXh0dXJlLT5pZCwgYWxwaGEgLyAyNTUuMGYsIG1vZGUsIHRleHR1cmUtPmJsZW5kLAorICAgICAgICAgICAgJm1NZXNoVmVydGljZXNbMF0ucG9zaXRpb25bMF0sICZtTWVzaFZlcnRpY2VzWzBdLnRleHR1cmVbMF0sIE5VTEwpOworfQorCit2b2lkIE9wZW5HTFJlbmRlcmVyOjpkcmF3VGV4dHVyZVJlY3QoZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLAorICAgICAgICBHTHVpbnQgdGV4dHVyZSwgZmxvYXQgYWxwaGEsIFNrWGZlcm1vZGU6Ok1vZGUgbW9kZSwgYm9vbCBibGVuZCkgeworICAgIGRyYXdUZXh0dXJlTWVzaChsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20sIHRleHR1cmUsIGFscGhhLCBtb2RlLCBibGVuZCwKKyAgICAgICAgICAgICZtTWVzaFZlcnRpY2VzWzBdLnBvc2l0aW9uWzBdLCAmbU1lc2hWZXJ0aWNlc1swXS50ZXh0dXJlWzBdLCBOVUxMKTsKK30KKwordm9pZCBPcGVuR0xSZW5kZXJlcjo6ZHJhd1RleHR1cmVNZXNoKGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwKKyAgICAgICAgR0x1aW50IHRleHR1cmUsIGZsb2F0IGFscGhhLCBTa1hmZXJtb2RlOjpNb2RlIG1vZGUsIGJvb2wgYmxlbmQsCisgICAgICAgIEdMdm9pZCogdmVydGljZXMsIEdMdm9pZCogdGV4Q29vcmRzLCBHTHZvaWQqIGluZGljZXMsIEdMc2l6ZWkgZWxlbWVudHNDb3VudCkgeworICAgIFByb2dyYW1EZXNjcmlwdGlvbiBkZXNjcmlwdGlvbjsKKyAgICBkZXNjcmlwdGlvbi5oYXNUZXh0dXJlID0gdHJ1ZTsKKyAgICBpZiAobUNvbG9yRmlsdGVyKSB7CisgICAgICAgIG1Db2xvckZpbHRlci0+ZGVzY3JpYmUoZGVzY3JpcHRpb24sIG1FeHRlbnNpb25zKTsKKyAgICB9CisKKyAgICBtTW9kZWxWaWV3LmxvYWRUcmFuc2xhdGUobGVmdCwgdG9wLCAwLjBmKTsKKyAgICBtTW9kZWxWaWV3LnNjYWxlKHJpZ2h0IC0gbGVmdCwgYm90dG9tIC0gdG9wLCAxLjBmKTsKKworICAgIHVzZVByb2dyYW0obUNhY2hlcy5wcm9ncmFtQ2FjaGUuZ2V0KGRlc2NyaXB0aW9uKSk7CisgICAgbUNhY2hlcy5jdXJyZW50UHJvZ3JhbS0+c2V0KG1PcnRob01hdHJpeCwgbU1vZGVsVmlldywgbVNuYXBzaG90LT50cmFuc2Zvcm0pOworCisgICAgY2hvb3NlQmxlbmRpbmcoYmxlbmQgfHwgYWxwaGEgPCAxLjBmLCBtb2RlKTsKKworICAgIC8vIFRleHR1cmUKKyAgICBiaW5kVGV4dHVyZSh0ZXh0dXJlLCBHTF9DTEFNUF9UT19FREdFLCBHTF9DTEFNUF9UT19FREdFLCAwKTsKKyAgICBnbFVuaWZvcm0xaShtQ2FjaGVzLmN1cnJlbnRQcm9ncmFtLT5nZXRVbmlmb3JtKCJzYW1wbGVyIiksIDApOworCisgICAgLy8gQWx3YXlzIHByZW11bHRpcGxpZWQKKyAgICBnbFVuaWZvcm00ZihtQ2FjaGVzLmN1cnJlbnRQcm9ncmFtLT5jb2xvciwgYWxwaGEsIGFscGhhLCBhbHBoYSwgYWxwaGEpOworCisgICAgLy8gTWVzaAorICAgIGludCB0ZXhDb29yZHNTbG90ID0gbUNhY2hlcy5jdXJyZW50UHJvZ3JhbS0+Z2V0QXR0cmliKCJ0ZXhDb29yZHMiKTsKKyAgICBnbEVuYWJsZVZlcnRleEF0dHJpYkFycmF5KHRleENvb3Jkc1Nsb3QpOworICAgIGdsVmVydGV4QXR0cmliUG9pbnRlcihtQ2FjaGVzLmN1cnJlbnRQcm9ncmFtLT5wb3NpdGlvbiwgMiwgR0xfRkxPQVQsIEdMX0ZBTFNFLAorICAgICAgICAgICAgZ01lc2hTdHJpZGUsIHZlcnRpY2VzKTsKKyAgICBnbFZlcnRleEF0dHJpYlBvaW50ZXIodGV4Q29vcmRzU2xvdCwgMiwgR0xfRkxPQVQsIEdMX0ZBTFNFLCBnTWVzaFN0cmlkZSwgdGV4Q29vcmRzKTsKKworICAgIC8vIENvbG9yIGZpbHRlcgorICAgIGlmIChtQ29sb3JGaWx0ZXIpIHsKKyAgICAgICAgbUNvbG9yRmlsdGVyLT5zZXR1cFByb2dyYW0obUNhY2hlcy5jdXJyZW50UHJvZ3JhbSk7CisgICAgfQorCisgICAgaWYgKCFpbmRpY2VzKSB7CisgICAgICAgIGdsRHJhd0FycmF5cyhHTF9UUklBTkdMRV9TVFJJUCwgMCwgZ01lc2hDb3VudCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZ2xEcmF3RWxlbWVudHMoR0xfVFJJQU5HTEVTLCBlbGVtZW50c0NvdW50LCBHTF9VTlNJR05FRF9TSE9SVCwgaW5kaWNlcyk7CisgICAgfQorICAgIGdsRGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KHRleENvb3Jkc1Nsb3QpOworfQorCit2b2lkIE9wZW5HTFJlbmRlcmVyOjpjaG9vc2VCbGVuZGluZyhib29sIGJsZW5kLCBTa1hmZXJtb2RlOjpNb2RlIG1vZGUsIGJvb2wgaXNQcmVtdWx0aXBsaWVkKSB7CisgICAgYmxlbmQgPSBibGVuZCB8fCBtb2RlICE9IFNrWGZlcm1vZGU6OmtTcmNPdmVyX01vZGU7CisgICAgaWYgKGJsZW5kKSB7CisgICAgICAgIGlmICghbUNhY2hlcy5ibGVuZCkgeworICAgICAgICAgICAgZ2xFbmFibGUoR0xfQkxFTkQpOworICAgICAgICB9CisKKyAgICAgICAgR0xlbnVtIHNvdXJjZU1vZGUgPSBnQmxlbmRzW21vZGVdLnNyYzsKKyAgICAgICAgR0xlbnVtIGRlc3RNb2RlID0gZ0JsZW5kc1ttb2RlXS5kc3Q7CisgICAgICAgIGlmICghaXNQcmVtdWx0aXBsaWVkICYmIHNvdXJjZU1vZGUgPT0gR0xfT05FKSB7CisgICAgICAgICAgICBzb3VyY2VNb2RlID0gR0xfU1JDX0FMUEhBOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHNvdXJjZU1vZGUgIT0gbUNhY2hlcy5sYXN0U3JjTW9kZSB8fCBkZXN0TW9kZSAhPSBtQ2FjaGVzLmxhc3REc3RNb2RlKSB7CisgICAgICAgICAgICBnbEJsZW5kRnVuYyhzb3VyY2VNb2RlLCBkZXN0TW9kZSk7CisgICAgICAgICAgICBtQ2FjaGVzLmxhc3RTcmNNb2RlID0gc291cmNlTW9kZTsKKyAgICAgICAgICAgIG1DYWNoZXMubGFzdERzdE1vZGUgPSBkZXN0TW9kZTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAobUNhY2hlcy5ibGVuZCkgeworICAgICAgICBnbERpc2FibGUoR0xfQkxFTkQpOworICAgIH0KKyAgICBtQ2FjaGVzLmJsZW5kID0gYmxlbmQ7Cit9CisKK2Jvb2wgT3BlbkdMUmVuZGVyZXI6OnVzZVByb2dyYW0oUHJvZ3JhbSogcHJvZ3JhbSkgeworICAgIGlmICghcHJvZ3JhbS0+aXNJblVzZSgpKSB7CisgICAgICAgIGlmIChtQ2FjaGVzLmN1cnJlbnRQcm9ncmFtICE9IE5VTEwpIG1DYWNoZXMuY3VycmVudFByb2dyYW0tPnJlbW92ZSgpOworICAgICAgICBwcm9ncmFtLT51c2UoKTsKKyAgICAgICAgbUNhY2hlcy5jdXJyZW50UHJvZ3JhbSA9IHByb2dyYW07CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgT3BlbkdMUmVuZGVyZXI6OnJlc2V0RHJhd1RleHR1cmVUZXhDb29yZHMoZmxvYXQgdTEsIGZsb2F0IHYxLCBmbG9hdCB1MiwgZmxvYXQgdjIpIHsKKyAgICBUZXh0dXJlVmVydGV4KiB2ID0gJm1NZXNoVmVydGljZXNbMF07CisgICAgVGV4dHVyZVZlcnRleDo6c2V0VVYodisrLCB1MSwgdjEpOworICAgIFRleHR1cmVWZXJ0ZXg6OnNldFVWKHYrKywgdTIsIHYxKTsKKyAgICBUZXh0dXJlVmVydGV4OjpzZXRVVih2KyssIHUxLCB2Mik7CisgICAgVGV4dHVyZVZlcnRleDo6c2V0VVYodisrLCB1MiwgdjIpOworfQorCit2b2lkIE9wZW5HTFJlbmRlcmVyOjpnZXRBbHBoYUFuZE1vZGUoY29uc3QgU2tQYWludCogcGFpbnQsIGludCogYWxwaGEsIFNrWGZlcm1vZGU6Ok1vZGUqIG1vZGUpIHsKKyAgICBpZiAocGFpbnQpIHsKKyAgICAgICAgY29uc3QgYm9vbCBpc01vZGUgPSBTa1hmZXJtb2RlOjpJc01vZGUocGFpbnQtPmdldFhmZXJtb2RlKCksIG1vZGUpOworICAgICAgICBpZiAoIWlzTW9kZSkgeworICAgICAgICAgICAgLy8gQXNzdW1lIFNSQ19PVkVSCisgICAgICAgICAgICAqbW9kZSA9IFNrWGZlcm1vZGU6OmtTcmNPdmVyX01vZGU7CisgICAgICAgIH0KKworICAgICAgICAvLyBTa2lhIGRyYXdzIHVzaW5nIHRoZSBjb2xvcidzIGFscGhhIGNoYW5uZWwgaWYgPCAyNTUKKyAgICAgICAgLy8gT3RoZXJ3aXNlLCBpdCB1c2VzIHRoZSBwYWludCdzIGFscGhhCisgICAgICAgIGludCBjb2xvciA9IHBhaW50LT5nZXRDb2xvcigpOworICAgICAgICAqYWxwaGEgPSAoY29sb3IgPj4gMjQpICYgMHhGRjsKKyAgICAgICAgaWYgKCphbHBoYSA9PSAyNTUpIHsKKyAgICAgICAgICAgICphbHBoYSA9IHBhaW50LT5nZXRBbHBoYSgpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgKm1vZGUgPSBTa1hmZXJtb2RlOjprU3JjT3Zlcl9Nb2RlOworICAgICAgICAqYWxwaGEgPSAyNTU7CisgICAgfQorfQorCit2b2lkIE9wZW5HTFJlbmRlcmVyOjpiaW5kVGV4dHVyZShHTHVpbnQgdGV4dHVyZSwgR0xlbnVtIHdyYXBTLCBHTGVudW0gd3JhcFQsIEdMdWludCB0ZXh0dXJlVW5pdCkgeworICAgIGdsQWN0aXZlVGV4dHVyZShnVGV4dHVyZVVuaXRzW3RleHR1cmVVbml0XSk7CisgICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCB0ZXh0dXJlKTsKKyAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9XUkFQX1MsIHdyYXBTKTsKKyAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9XUkFQX1QsIHdyYXBUKTsKK30KKworfTsgLy8gbmFtZXNwYWNlIHVpcmVuZGVyZXIKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJzL2h3dWkvT3BlbkdMUmVuZGVyZXIuaCBiL2xpYnMvaHd1aS9PcGVuR0xSZW5kZXJlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3NDhkNTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2h3dWkvT3BlbkdMUmVuZGVyZXIuaApAQCAtMCwwICsxLDM3NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9VSV9PUEVOR0xfUkVOREVSRVJfSAorI2RlZmluZSBBTkRST0lEX1VJX09QRU5HTF9SRU5ERVJFUl9ICisKKyNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KKyNpbmNsdWRlIDxHTEVTMi9nbDJleHQuaD4KKworI2luY2x1ZGUgPFNrQml0bWFwLmg+CisjaW5jbHVkZSA8U2tNYXRyaXguaD4KKyNpbmNsdWRlIDxTa1BhaW50Lmg+CisjaW5jbHVkZSA8U2tSZWdpb24uaD4KKyNpbmNsdWRlIDxTa1NoYWRlci5oPgorI2luY2x1ZGUgPFNrWGZlcm1vZGUuaD4KKworI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDx1dGlscy9SZXNvdXJjZVR5cGVzLmg+CisKKyNpbmNsdWRlICJFeHRlbnNpb25zLmgiCisjaW5jbHVkZSAiTWF0cml4LmgiCisjaW5jbHVkZSAiUHJvZ3JhbS5oIgorI2luY2x1ZGUgIlJlY3QuaCIKKyNpbmNsdWRlICJTbmFwc2hvdC5oIgorI2luY2x1ZGUgIlZlcnRleC5oIgorI2luY2x1ZGUgIlNraWFTaGFkZXIuaCIKKyNpbmNsdWRlICJTa2lhQ29sb3JGaWx0ZXIuaCIKKyNpbmNsdWRlICJDYWNoZXMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHVpcmVuZGVyZXIgeworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBSZW5kZXJlcgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvKioKKyAqIE9wZW5HTCByZW5kZXJlciB1c2VkIHRvIGRyYXcgYWNjZWxlcmF0ZWQgMkQgZ3JhcGhpY3MuIFRoZSBBUEkgaXMgYQorICogc2ltcGxpZmllZCB2ZXJzaW9uIG9mIFNraWEncyBDYW52YXMgQVBJLgorICovCitjbGFzcyBPcGVuR0xSZW5kZXJlciB7CitwdWJsaWM6CisgICAgT3BlbkdMUmVuZGVyZXIoKTsKKyAgICB+T3BlbkdMUmVuZGVyZXIoKTsKKworICAgIHZvaWQgc2V0Vmlld3BvcnQoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKKyAgICB2b2lkIHByZXBhcmUoKTsKKworICAgIGludCBnZXRTYXZlQ291bnQoKSBjb25zdDsKKyAgICBpbnQgc2F2ZShpbnQgZmxhZ3MpOworICAgIHZvaWQgcmVzdG9yZSgpOworICAgIHZvaWQgcmVzdG9yZVRvQ291bnQoaW50IHNhdmVDb3VudCk7CisKKyAgICBpbnQgc2F2ZUxheWVyKGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwgY29uc3QgU2tQYWludCogcCwgaW50IGZsYWdzKTsKKyAgICBpbnQgc2F2ZUxheWVyQWxwaGEoZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLCBpbnQgYWxwaGEsIGludCBmbGFncyk7CisKKyAgICB2b2lkIHRyYW5zbGF0ZShmbG9hdCBkeCwgZmxvYXQgZHkpOworICAgIHZvaWQgcm90YXRlKGZsb2F0IGRlZ3JlZXMpOworICAgIHZvaWQgc2NhbGUoZmxvYXQgc3gsIGZsb2F0IHN5KTsKKworICAgIHZvaWQgc2V0TWF0cml4KFNrTWF0cml4KiBtYXRyaXgpOworICAgIHZvaWQgZ2V0TWF0cml4KFNrTWF0cml4KiBtYXRyaXgpOworICAgIHZvaWQgY29uY2F0TWF0cml4KFNrTWF0cml4KiBtYXRyaXgpOworCisgICAgY29uc3QgUmVjdCYgZ2V0Q2xpcEJvdW5kcygpOworICAgIGJvb2wgcXVpY2tSZWplY3QoZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tKTsKKyAgICBib29sIGNsaXBSZWN0KGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwgU2tSZWdpb246Ok9wIG9wKTsKKworICAgIHZvaWQgZHJhd0JpdG1hcChTa0JpdG1hcCogYml0bWFwLCBmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGNvbnN0IFNrUGFpbnQqIHBhaW50KTsKKyAgICB2b2lkIGRyYXdCaXRtYXAoU2tCaXRtYXAqIGJpdG1hcCwgY29uc3QgU2tNYXRyaXgqIG1hdHJpeCwgY29uc3QgU2tQYWludCogcGFpbnQpOworICAgIHZvaWQgZHJhd0JpdG1hcChTa0JpdG1hcCogYml0bWFwLCBmbG9hdCBzcmNMZWZ0LCBmbG9hdCBzcmNUb3AsIGZsb2F0IHNyY1JpZ2h0LCBmbG9hdCBzcmNCb3R0b20sCisgICAgICAgICAgICBmbG9hdCBkc3RMZWZ0LCBmbG9hdCBkc3RUb3AsIGZsb2F0IGRzdFJpZ2h0LCBmbG9hdCBkc3RCb3R0b20sIGNvbnN0IFNrUGFpbnQqIHBhaW50KTsKKyAgICB2b2lkIGRyYXdQYXRjaChTa0JpdG1hcCogYml0bWFwLCBSZXNfcG5nXzlwYXRjaCogcGF0Y2gsIGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwKKyAgICAgICAgICAgIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sIGNvbnN0IFNrUGFpbnQqIHBhaW50KTsKKyAgICB2b2lkIGRyYXdDb2xvcihpbnQgY29sb3IsIFNrWGZlcm1vZGU6Ok1vZGUgbW9kZSk7CisgICAgdm9pZCBkcmF3UmVjdChmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sIGNvbnN0IFNrUGFpbnQqIHBhaW50KTsKKyAgICB2b2lkIGRyYXdQYXRoKFNrUGF0aCogcGF0aCwgU2tQYWludCogcGFpbnQpOworCisgICAgdm9pZCByZXNldFNoYWRlcigpOworICAgIHZvaWQgc2V0dXBTaGFkZXIoU2tpYVNoYWRlciogc2hhZGVyKTsKKworICAgIHZvaWQgcmVzZXRDb2xvckZpbHRlcigpOworICAgIHZvaWQgc2V0dXBDb2xvckZpbHRlcihTa2lhQ29sb3JGaWx0ZXIqIGZpbHRlcik7CisKKyAgICB2b2lkIHJlc2V0U2hhZG93KCk7CisgICAgdm9pZCBzZXR1cFNoYWRvdyhmbG9hdCByYWRpdXMsIGZsb2F0IGR4LCBmbG9hdCBkeSwgaW50IGNvbG9yKTsKKworICAgIHZvaWQgZHJhd1RleHQoY29uc3QgY2hhciogdGV4dCwgaW50IGJ5dGVzQ291bnQsIGludCBjb3VudCwgZmxvYXQgeCwgZmxvYXQgeSwgU2tQYWludCogcGFpbnQpOworCitwcml2YXRlOgorICAgIC8qKgorICAgICAqIFNhdmVzIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSByZW5kZXJlciBhcyBhIG5ldyBzbmFwc2hvdC4KKyAgICAgKiBUaGUgbmV3IHNuYXBzaG90IGlzIHNhdmVkIGluIG1TbmFwc2hvdCBhbmQgdGhlIHByZXZpb3VzIHNuYXBzaG90CisgICAgICogaXMgbGlua2VkIGZyb20gbVNuYXBzaG90LT5wcmV2aW91cy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIG5ldyBzYXZlIGNvdW50LiBUaGlzIHZhbHVlIGNhbiBiZSBwYXNzZWQgdG8gI3Jlc3RvcmVUb0NvdW50KCkKKyAgICAgKi8KKyAgICBpbnQgc2F2ZVNuYXBzaG90KCk7CisKKyAgICAvKioKKyAgICAgKiBSZXN0b3JlcyB0aGUgY3VycmVudCBzbmFwc2hvdDsgbVNuYXBzaG90IGJlY29tZXMgbVNuYXBzaG90LT5wcmV2aW91cy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgY2xpcCB3YXMgbW9kaWZpZWQuCisgICAgICovCisgICAgYm9vbCByZXN0b3JlU25hcHNob3QoKTsKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGNsaXBwaW5nIHJlY3RhbmdsZSB1c2luZyBnbFNjaXNzb3IuIFRoZSBjbGlwIGlzIGRlZmluZWQgYnkKKyAgICAgKiB0aGUgY3VycmVudCBzbmFwc2hvdCdzIGNsaXBSZWN0IG1lbWJlci4KKyAgICAgKi8KKyAgICB2b2lkIHNldFNjaXNzb3JGcm9tQ2xpcCgpOworCisgICAgLyoqCisgICAgICogQ29tcG9zZSB0aGUgbGF5ZXIgZGVmaW5lZCBpbiB0aGUgY3VycmVudCBzbmFwc2hvdCB3aXRoIHRoZSBsYXllcgorICAgICAqIGRlZmluZWQgYnkgdGhlIHByZXZpb3VzIHNuYXBzaG90LgorICAgICAqCisgICAgICogVGhlIGN1cnJlbnQgc25hcHNob3QgKm11c3QqIGJlIGEgbGF5ZXIgKGZsYWcga0ZsYWdJc0xheWVyIHNldC4pCisgICAgICoKKyAgICAgKiBAcGFyYW0gY3VyZW50IFRoZSBjdXJyZW50IHNuYXBzaG90IGNvbnRhaW5pbmcgdGhlIGxheWVyIHRvIGNvbXBvc2UKKyAgICAgKiBAcGFyYW0gcHJldmlvdXMgVGhlIHByZXZpb3VzIHNuYXBzaG90IHRvIGNvbXBvc2UgdGhlIGN1cnJlbnQgbGF5ZXIgd2l0aAorICAgICAqLworICAgIHZvaWQgY29tcG9zZUxheWVyKHNwPFNuYXBzaG90PiBjdXJyZW50LCBzcDxTbmFwc2hvdD4gcHJldmlvdXMpOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBsYXllciBzdG9yZWQgaW4gdGhlIHNwZWNpZmllZCBzbmFwc2hvdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzbmFwc2hvdCBUaGUgc25hcHNob3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBuZXcgbGF5ZXIKKyAgICAgKiBAcGFyYW0gbGVmdCBUaGUgbGVmdCBjb29yZGluYXRlIG9mIHRoZSBsYXllcgorICAgICAqIEBwYXJhbSB0b3AgVGhlIHRvcCBjb29yZGluYXRlIG9mIHRoZSBsYXllcgorICAgICAqIEBwYXJhbSByaWdodCBUaGUgcmlnaHQgY29vcmRpbmF0ZSBvZiB0aGUgbGF5ZXIKKyAgICAgKiBAcGFyYW0gYm90dG9tIFRoZSBib3R0b20gY29vcmRpbmF0ZSBvZiB0aGUgbGF5ZXIKKyAgICAgKiBAcGFyYW0gYWxwaGEgVGhlIHRyYW5zbHVjZW5jeSBvZiB0aGUgbGF5ZXIKKyAgICAgKiBAcGFyYW0gbW9kZSBUaGUgYmxlbmRpbmcgbW9kZSBvZiB0aGUgbGF5ZXIKKyAgICAgKiBAcGFyYW0gZmxhZ3MgVGhlIGxheWVyIHNhdmUgZmxhZ3MKKyAgICAgKgorICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgbGF5ZXIgd2FzIHN1Y2Nlc3NmdWxseSBjcmVhdGVkLCBmYWxzZSBvdGhlcndpc2UKKyAgICAgKi8KKyAgICBib29sIGNyZWF0ZUxheWVyKHNwPFNuYXBzaG90PiBzbmFwc2hvdCwgZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLAorICAgICAgICAgICAgaW50IGFscGhhLCBTa1hmZXJtb2RlOjpNb2RlIG1vZGUsIGludCBmbGFncyk7CisKKyAgICAvKioKKyAgICAgKiBEcmF3cyBhIGNvbG9yZWQgcmVjdGFuZ2xlIHdpdGggdGhlIHNwZWNpZmllZCBjb2xvci4gVGhlIHNwZWNpZmllZCBjb29yZGluYXRlcworICAgICAqIGFyZSB0cmFuc2Zvcm1lZCBieSB0aGUgY3VycmVudCBzbmFwc2hvdCdzIHRyYW5zZm9ybSBtYXRyaXguCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGVmdCBUaGUgbGVmdCBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUKKyAgICAgKiBAcGFyYW0gdG9wIFRoZSB0b3AgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlCisgICAgICogQHBhcmFtIHJpZ2h0IFRoZSByaWdodCBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUKKyAgICAgKiBAcGFyYW0gYm90dG9tIFRoZSBib3R0b20gY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlCisgICAgICogQHBhcmFtIGNvbG9yIFRoZSByZWN0YW5nbGUncyBBUkdCIGNvbG9yLCBkZWZpbmVkIGFzIGEgcGFja2VkIDMyIGJpdHMgd29yZAorICAgICAqIEBwYXJhbSBtb2RlIFRoZSBTa2lhIHhmZXJtb2RlIHRvIHVzZQorICAgICAqIEBwYXJhbSBpZ25vcmVUcmFuc2Zvcm0gVHJ1ZSBpZiB0aGUgY3VycmVudCB0cmFuc2Zvcm0gc2hvdWxkIGJlIGlnbm9yZWQKKyAgICAgKi8KKyAgICB2b2lkIGRyYXdDb2xvclJlY3QoZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLAorICAgIAkJaW50IGNvbG9yLCBTa1hmZXJtb2RlOjpNb2RlIG1vZGUsIGJvb2wgaWdub3JlVHJhbnNmb3JtID0gZmFsc2UpOworCisgICAgLyoqCisgICAgICogRHJhd3MgYSB0ZXh0dXJlZCByZWN0YW5nbGUgd2l0aCB0aGUgc3BlY2lmaWVkIHRleHR1cmUuIFRoZSBzcGVjaWZpZWQgY29vcmRpbmF0ZXMKKyAgICAgKiBhcmUgdHJhbnNmb3JtZWQgYnkgdGhlIGN1cnJlbnQgc25hcHNob3QncyB0cmFuc2Zvcm0gbWF0cml4LgorICAgICAqCisgICAgICogQHBhcmFtIGxlZnQgVGhlIGxlZnQgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlCisgICAgICogQHBhcmFtIHRvcCBUaGUgdG9wIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZQorICAgICAqIEBwYXJhbSByaWdodCBUaGUgcmlnaHQgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlCisgICAgICogQHBhcmFtIGJvdHRvbSBUaGUgYm90dG9tIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZQorICAgICAqIEBwYXJhbSB0ZXh0dXJlIFRoZSB0ZXh0dXJlIG5hbWUgdG8gbWFwIG9udG8gdGhlIHJlY3RhbmdsZQorICAgICAqIEBwYXJhbSBhbHBoYSBBbiBhZGRpdGlvbmFsIHRyYW5zbHVjZW5jeSBwYXJhbWV0ZXIsIGJldHdlZW4gMC4wZiBhbmQgMS4wZgorICAgICAqIEBwYXJhbSBtb2RlIFRoZSBibGVuZGluZyBtb2RlCisgICAgICogQHBhcmFtIGJsZW5kIFRydWUgaWYgdGhlIHRleHR1cmUgY29udGFpbnMgYW4gYWxwaGEgY2hhbm5lbAorICAgICAqLworICAgIHZvaWQgZHJhd1RleHR1cmVSZWN0KGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwgR0x1aW50IHRleHR1cmUsCisgICAgICAgICAgICBmbG9hdCBhbHBoYSwgU2tYZmVybW9kZTo6TW9kZSBtb2RlLCBib29sIGJsZW5kKTsKKworICAgIC8qKgorICAgICAqIERyYXdzIGEgdGV4dHVyZWQgcmVjdGFuZ2xlIHdpdGggdGhlIHNwZWNpZmllZCB0ZXh0dXJlLiBUaGUgc3BlY2lmaWVkIGNvb3JkaW5hdGVzCisgICAgICogYXJlIHRyYW5zZm9ybWVkIGJ5IHRoZSBjdXJyZW50IHNuYXBzaG90J3MgdHJhbnNmb3JtIG1hdHJpeC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsZWZ0IFRoZSBsZWZ0IGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZQorICAgICAqIEBwYXJhbSB0b3AgVGhlIHRvcCBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUKKyAgICAgKiBAcGFyYW0gcmlnaHQgVGhlIHJpZ2h0IGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZQorICAgICAqIEBwYXJhbSBib3R0b20gVGhlIGJvdHRvbSBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUKKyAgICAgKiBAcGFyYW0gdGV4dHVyZSBUaGUgdGV4dHVyZSB0byB1c2UKKyAgICAgKiBAcGFyYW0gcGFpbnQgVGhlIHBhaW50IGNvbnRhaW5pbmcgdGhlIGFscGhhLCBibGVuZGluZyBtb2RlLCBldGMuCisgICAgICovCisgICAgdm9pZCBkcmF3VGV4dHVyZVJlY3QoZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLAorICAgICAgICAgICAgY29uc3QgVGV4dHVyZSogdGV4dHVyZSwgY29uc3QgU2tQYWludCogcGFpbnQpOworCisgICAgLyoqCisgICAgICogRHJhd3MgYSB0ZXh0dXJlZCBtZXNoIHdpdGggdGhlIHNwZWNpZmllZCB0ZXh0dXJlLiBJZiB0aGUgaW5kaWNlcyBhcmUgb21pdHRlZCwgdGhlCisgICAgICogbWVzaCBpcyBkcmF3biBhcyBhIHNpbXBsZSBxdWFkLgorICAgICAqCisgICAgICogQHBhcmFtIGxlZnQgVGhlIGxlZnQgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlCisgICAgICogQHBhcmFtIHRvcCBUaGUgdG9wIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZQorICAgICAqIEBwYXJhbSByaWdodCBUaGUgcmlnaHQgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlCisgICAgICogQHBhcmFtIGJvdHRvbSBUaGUgYm90dG9tIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZQorICAgICAqIEBwYXJhbSB0ZXh0dXJlIFRoZSB0ZXh0dXJlIG5hbWUgdG8gbWFwIG9udG8gdGhlIHJlY3RhbmdsZQorICAgICAqIEBwYXJhbSBhbHBoYSBBbiBhZGRpdGlvbmFsIHRyYW5zbHVjZW5jeSBwYXJhbWV0ZXIsIGJldHdlZW4gMC4wZiBhbmQgMS4wZgorICAgICAqIEBwYXJhbSBtb2RlIFRoZSBibGVuZGluZyBtb2RlCisgICAgICogQHBhcmFtIGJsZW5kIFRydWUgaWYgdGhlIHRleHR1cmUgY29udGFpbnMgYW4gYWxwaGEgY2hhbm5lbAorICAgICAqIEBwYXJhbSB2ZXJ0aWNlcyBUaGUgdmVydGljZXMgdGhhdCBkZWZpbmUgdGhlIG1lc2gKKyAgICAgKiBAcGFyYW0gdGV4Q29vcmRzIFRoZSB0ZXh0dXJlIGNvb3JkaW5hdGVzIG9mIGVhY2ggdmVydGV4CisgICAgICogQHBhcmFtIGluZGljZXMgVGhlIGluZGljZXMgb2YgdGhlIHZlcnRpY2VzLCBjYW4gYmUgTlVMTAorICAgICAqIEBwYXJhbSBlbGVtZW50c0NvdW50IFRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIG1lc2gsIHJlcXVpcmVkIGJ5IGluZGljZXMKKyAgICAgKi8KKyAgICB2b2lkIGRyYXdUZXh0dXJlTWVzaChmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sIEdMdWludCB0ZXh0dXJlLAorICAgICAgICAgICAgZmxvYXQgYWxwaGEsIFNrWGZlcm1vZGU6Ok1vZGUgbW9kZSwgYm9vbCBibGVuZCwKKyAgICAgICAgICAgIEdMdm9pZCogdmVydGljZXMsIEdMdm9pZCogdGV4Q29vcmRzLCBHTHZvaWQqIGluZGljZXMsIEdMc2l6ZWkgZWxlbWVudHNDb3VudCA9IDApOworCisgICAgLyoqCisgICAgICogUHJlcGFyZXMgdGhlIHJlbmRlcmVyIHRvIGRyYXcgdGhlIHNwZWNpZmllZCBzaGFkb3cuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGV4dHVyZSBUaGUgc2hhZG93IHRleHR1cmUKKyAgICAgKiBAcGFyYW0geCBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSBzaGFkb3cKKyAgICAgKiBAcGFyYW0geSBUaGUgeSBjb29yZGluYXRlIG9mIHRoZSBzaGFkb3cKKyAgICAgKiBAcGFyYW0gbW9kZSBUaGUgYmxlbmRpbmcgbW9kZQorICAgICAqIEBwYXJhbSBhbHBoYSBUaGUgYWxwaGEgdmFsdWUKKyAgICAgKi8KKyAgICB2b2lkIHNldHVwU2hhZG93KGNvbnN0IFNoYWRvd1RleHR1cmUqIHRleHR1cmUsIGZsb2F0IHgsIGZsb2F0IHksIFNrWGZlcm1vZGU6Ok1vZGUgbW9kZSwKKyAgICAgICAgICAgIGZsb2F0IGFscGhhKTsKKworICAgIC8qKgorICAgICAqIFByZXBhcmVzIHRoZSByZW5kZXJlciB0byBkcmF3IHRoZSBzcGVjaWZpZWQgQWxwaGE4IHRleHR1cmUgYXMgYSByZWN0YW5nbGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGV4dHVyZSBUaGUgdGV4dHVyZSB0byByZW5kZXIgd2l0aAorICAgICAqIEBwYXJhbSB0ZXh0dXJlVW5pdCBUaGUgdGV4dHVyZSB1bml0IHRvIHVzZSwgbWF5IGJlIG1vZGlmaWVkCisgICAgICogQHBhcmFtIHggVGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlIHRvIGRyYXcKKyAgICAgKiBAcGFyYW0geSBUaGUgeSBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUgdG8gZHJhdworICAgICAqIEBwYXJhbSByIFRoZSByZWQgY29tcG9uZW50IG9mIHRoZSBjb2xvcgorICAgICAqIEBwYXJhbSBnIFRoZSBncmVlbiBjb21wb25lbnQgb2YgdGhlIGNvbG9yCisgICAgICogQHBhcmFtIGIgVGhlIGJsdWUgY29tcG9uZW50IG9mIHRoZSBjb2xvcgorICAgICAqIEBwYXJhbSBhIFRoZSBhbHBoYSBjb21wb25lbnQgb2YgdGhlIGNvbG9yCisgICAgICogQHBhcmFtIG1vZGUgVGhlIGJsZW5kaW5nIG1vZGUKKyAgICAgKiBAcGFyYW0gdHJhbnNmb3JtcyBUcnVlIGlmIHRoZSBtYXRyaXggcGFzc2VkIHRvIHRoZSBzaGFkZXIgc2hvdWxkIGJlIG11bHRpcGxpZWQKKyAgICAgKiAgICAgICAgYnkgdGhlIG1vZGVsLXZpZXcgbWF0cml4CisgICAgICogQHBhcmFtIGFwcGx5RmlsdGVycyBXaGV0aGVyIG9yIG5vdCB0byB0YWtlIGNvbG9yIGZpbHRlcnMgYW5kCisgICAgICogICAgICAgIHNoYWRlcnMgaW50byBhY2NvdW50CisgICAgICovCisgICAgdm9pZCBzZXR1cFRleHR1cmVBbHBoYTgoY29uc3QgVGV4dHVyZSogdGV4dHVyZSwgR0x1aW50JiB0ZXh0dXJlVW5pdCwgZmxvYXQgeCwgZmxvYXQgeSwKKyAgICAgICAgICAgIGZsb2F0IHIsIGZsb2F0IGcsIGZsb2F0IGIsIGZsb2F0IGEsIFNrWGZlcm1vZGU6Ok1vZGUgbW9kZSwgYm9vbCB0cmFuc2Zvcm1zLAorICAgICAgICAgICAgYm9vbCBhcHBseUZpbHRlcnMpOworCisgICAgLyoqCisgICAgICogUHJlcGFyZXMgdGhlIHJlbmRlcmVyIHRvIGRyYXcgdGhlIHNwZWNpZmllZCBBbHBoYTggdGV4dHVyZSBhcyBhIHJlY3RhbmdsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0ZXh0dXJlIFRoZSB0ZXh0dXJlIHRvIHJlbmRlciB3aXRoCisgICAgICogQHBhcmFtIHdpZHRoIFRoZSB3aWR0aCBvZiB0aGUgdGV4dHVyZQorICAgICAqIEBwYXJhbSBoZWlnaHQgVGhlIGhlaWdodCBvZiB0aGUgdGV4dHVyZQorICAgICAqIEBwYXJhbSB0ZXh0dXJlVW5pdCBUaGUgdGV4dHVyZSB1bml0IHRvIHVzZSwgbWF5IGJlIG1vZGlmaWVkCisgICAgICogQHBhcmFtIHggVGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlIHRvIGRyYXcKKyAgICAgKiBAcGFyYW0geSBUaGUgeSBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUgdG8gZHJhdworICAgICAqIEBwYXJhbSByIFRoZSByZWQgY29tcG9uZW50IG9mIHRoZSBjb2xvcgorICAgICAqIEBwYXJhbSBnIFRoZSBncmVlbiBjb21wb25lbnQgb2YgdGhlIGNvbG9yCisgICAgICogQHBhcmFtIGIgVGhlIGJsdWUgY29tcG9uZW50IG9mIHRoZSBjb2xvcgorICAgICAqIEBwYXJhbSBhIFRoZSBhbHBoYSBjb21wb25lbnQgb2YgdGhlIGNvbG9yCisgICAgICogQHBhcmFtIG1vZGUgVGhlIGJsZW5kaW5nIG1vZGUKKyAgICAgKiBAcGFyYW0gdHJhbnNmb3JtcyBUcnVlIGlmIHRoZSBtYXRyaXggcGFzc2VkIHRvIHRoZSBzaGFkZXIgc2hvdWxkIGJlIG11bHRpcGxpZWQKKyAgICAgKiAgICAgICAgYnkgdGhlIG1vZGVsLXZpZXcgbWF0cml4CisgICAgICogQHBhcmFtIGFwcGx5RmlsdGVycyBXaGV0aGVyIG9yIG5vdCB0byB0YWtlIGNvbG9yIGZpbHRlcnMgYW5kCisgICAgICogICAgICAgIHNoYWRlcnMgaW50byBhY2NvdW50CisgICAgICovCisgICAgdm9pZCBzZXR1cFRleHR1cmVBbHBoYTgoR0x1aW50IHRleHR1cmUsIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsCisgICAgICAgICAgICBHTHVpbnQmIHRleHR1cmVVbml0LCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCByLCBmbG9hdCBnLCBmbG9hdCBiLCBmbG9hdCBhLAorICAgICAgICAgICAgU2tYZmVybW9kZTo6TW9kZSBtb2RlLCBib29sIHRyYW5zZm9ybXMsIGJvb2wgYXBwbHlGaWx0ZXJzKTsKKworICAgIC8qKgorICAgICAqIERyYXdzIHRleHQgdW5kZXJsaW5lIGFuZCBzdHJpa2UtdGhyb3VnaCBpZiBuZWVkZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGV4dCBUaGUgdGV4dCB0byBkZWNvcgorICAgICAqIEBwYXJhbSBieXRlc0NvdW50IFRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIHRleHQKKyAgICAgKiBAcGFyYW0gbGVuZ3RoIFRoZSBsZW5ndGggaW4gcGl4ZWxzIG9mIHRoZSB0ZXh0LCBjYW4gYmUgPD0gMC4wZiB0byBmb3JjZSBhIG1lYXN1cmVtZW50CisgICAgICogQHBhcmFtIHggVGhlIHggY29vcmRpbmF0ZSB3aGVyZSB0aGUgdGV4dCB3aWxsIGJlIGRyYXduCisgICAgICogQHBhcmFtIHkgVGhlIHkgY29vcmRpbmF0ZSB3aGVyZSB0aGUgdGV4dCB3aWxsIGJlIGRyYXduCisgICAgICogQHBhcmFtIHBhaW50IFRoZSBwYWludCB0byBkcmF3IHRoZSB0ZXh0IHdpdGgKKyAgICAgKi8KKyAgICB2b2lkIGRyYXdUZXh0RGVjb3JhdGlvbnMoY29uc3QgY2hhciogdGV4dCwgaW50IGJ5dGVzQ291bnQsIGZsb2F0IGxlbmd0aCwKKyAgICAgICAgICAgIGZsb2F0IHgsIGZsb2F0IHksIFNrUGFpbnQqIHBhaW50KTsKKworICAgIC8qKgorICAgICAqIFJlc2V0cyB0aGUgdGV4dHVyZSBjb29yZGluYXRlcyBzdG9yZWQgaW4gbU1lc2hWZXJ0aWNlcy4gU2V0dGluZyB0aGUgdmFsdWVzCisgICAgICogYmFjayB0byBkZWZhdWx0IGlzIGFjaGlldmVkIGJ5IGNhbGxpbmc6CisgICAgICoKKyAgICAgKiByZXNldERyYXdUZXh0dXJlVGV4Q29vcmRzKDAuMGYsIDAuMGYsIDEuMGYsIDEuMGYpOworICAgICAqCisgICAgICogQHBhcmFtIHUxIFRoZSBsZWZ0IGNvb3JkaW5hdGUgb2YgdGhlIHRleHR1cmUKKyAgICAgKiBAcGFyYW0gdjEgVGhlIGJvdHRvbSBjb29yZGluYXRlIG9mIHRoZSB0ZXh0dXJlCisgICAgICogQHBhcmFtIHUyIFRoZSByaWdodCBjb29yZGluYXRlIG9mIHRoZSB0ZXh0dXJlCisgICAgICogQHBhcmFtIHYyIFRoZSB0b3AgY29vcmRpbmF0ZSBvZiB0aGUgdGV4dHVyZQorICAgICAqLworICAgIHZvaWQgcmVzZXREcmF3VGV4dHVyZVRleENvb3JkcyhmbG9hdCB1MSwgZmxvYXQgdjEsIGZsb2F0IHUyLCBmbG9hdCB2Mik7CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBhbHBoYSBhbmQgeGZlcm1vZGUgb3V0IG9mIGEgcGFpbnQgb2JqZWN0LiBJZiB0aGUgcGFpbnQgaXMgbnVsbAorICAgICAqIGFscGhhIHdpbGwgYmUgMjU1IGFuZCB0aGUgeGZlcm1vZGUgd2lsbCBiZSBTUkNfT1ZFUi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYWludCBUaGUgcGFpbnQgdG8gZXh0cmFjdCB2YWx1ZXMgZnJvbQorICAgICAqIEBwYXJhbSBhbHBoYSBXaGVyZSB0byBzdG9yZSB0aGUgcmVzdWx0aW5nIGFscGhhCisgICAgICogQHBhcmFtIG1vZGUgV2hlcmUgdG8gc3RvcmUgdGhlIHJlc3VsdGluZyB4ZmVybW9kZQorICAgICAqLworICAgIGlubGluZSB2b2lkIGdldEFscGhhQW5kTW9kZShjb25zdCBTa1BhaW50KiBwYWludCwgaW50KiBhbHBoYSwgU2tYZmVybW9kZTo6TW9kZSogbW9kZSk7CisKKyAgICAvKioKKyAgICAgKiBCaW5kcyB0aGUgc3BlY2lmaWVkIHRleHR1cmUgd2l0aCB0aGUgc3BlY2lmaWVkIHdyYXAgbW9kZXMuCisgICAgICovCisgICAgaW5saW5lIHZvaWQgYmluZFRleHR1cmUoR0x1aW50IHRleHR1cmUsIEdMZW51bSB3cmFwUywgR0xlbnVtIHdyYXBULCBHTHVpbnQgdGV4dHVyZVVuaXQgPSAwKTsKKworICAgIC8qKgorICAgICAqIEVuYWJsZSBvciBkaXNhYmxlIGJsZW5kaW5nIGFzIG5lY2Vzc2FyeS4gVGhpcyBmdW5jdGlvbiBzZXRzIHRoZSBhcHByb3ByaWF0ZQorICAgICAqIGJsZW5kIGZ1bmN0aW9uIGJhc2VkIG9uIHRoZSBzcGVjaWZpZWQgeGZlcm1vZGUuCisgICAgICovCisgICAgaW5saW5lIHZvaWQgY2hvb3NlQmxlbmRpbmcoYm9vbCBibGVuZCwgU2tYZmVybW9kZTo6TW9kZSBtb2RlLCBib29sIGlzUHJlbXVsdGlwbGllZCA9IHRydWUpOworCisgICAgLyoqCisgICAgICogVXNlIHRoZSBzcGVjaWZpZWQgcHJvZ3JhbSB3aXRoIHRoZSBjdXJyZW50IEdMIGNvbnRleHQuIElmIHRoZSBwcm9ncmFtIGlzIGFscmVhZHkKKyAgICAgKiBpbiB1c2UsIGl0IHdpbGwgbm90IGJlIGJvdW5kIGFnYWluLiBJZiBpdCBpcyBub3QgaW4gdXNlLCB0aGUgY3VycmVudCBwcm9ncmFtIGlzCisgICAgICogbWFya2VkIHVudXNlZCBhbmQgdGhlIHNwZWNpZmllZCBwcm9ncmFtIGJlY29tZXMgdXNlZCBhbmQgYmVjb21lcyB0aGUgbmV3CisgICAgICogY3VycmVudCBwcm9ncmFtLgorICAgICAqCisgICAgICogQHBhcmFtIHByb2dyYW0gVGhlIHByb2dyYW0gdG8gdXNlCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRydWUgSWYgdGhlIHNwZWNpZmllZCBwcm9ncmFtIHdhcyBhbHJlYWR5IGluIHVzZSwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqLworICAgIGlubGluZSBib29sIHVzZVByb2dyYW0oUHJvZ3JhbSogcHJvZ3JhbSk7CisKKyAgICAvLyBEaW1lbnNpb25zIG9mIHRoZSBkcmF3aW5nIHN1cmZhY2UKKyAgICBpbnQgbVdpZHRoLCBtSGVpZ2h0OworCisgICAgLy8gTWF0cml4IHVzZWQgZm9yIG9ydGhvIHByb2plY3Rpb24gaW4gc2hhZGVycworICAgIG1hdDQgbU9ydGhvTWF0cml4OworCisgICAgLy8gTW9kZWwtdmlldyBtYXRyaXggdXNlZCB0byBwb3NpdGlvbi9zaXplIG9iamVjdHMKKyAgICBtYXQ0IG1Nb2RlbFZpZXc7CisKKyAgICAvLyBOdW1iZXIgb2Ygc2F2ZWQgc3RhdGVzCisgICAgaW50IG1TYXZlQ291bnQ7CisgICAgLy8gQmFzZSBzdGF0ZQorICAgIHNwPFNuYXBzaG90PiBtRmlyc3RTbmFwc2hvdDsKKyAgICAvLyBDdXJyZW50IHN0YXRlCisgICAgc3A8U25hcHNob3Q+IG1TbmFwc2hvdDsKKworICAgIC8vIFNoYWRlcnMKKyAgICBTa2lhU2hhZGVyKiBtU2hhZGVyOworCisgICAgLy8gQ29sb3IgZmlsdGVycworICAgIFNraWFDb2xvckZpbHRlciogbUNvbG9yRmlsdGVyOworCisgICAgLy8gVXNlZCB0byBkcmF3IHRleHR1cmVkIHF1YWRzCisgICAgVGV4dHVyZVZlcnRleCBtTWVzaFZlcnRpY2VzWzRdOworCisgICAgLy8gR0wgZXh0ZW5zaW9ucworICAgIEV4dGVuc2lvbnMgbUV4dGVuc2lvbnM7CisKKyAgICAvLyBEcm9wIHNoYWRvdworICAgIGJvb2wgbUhhc1NoYWRvdzsKKyAgICBmbG9hdCBtU2hhZG93UmFkaXVzOworICAgIGZsb2F0IG1TaGFkb3dEeDsKKyAgICBmbG9hdCBtU2hhZG93RHk7CisgICAgaW50IG1TaGFkb3dDb2xvcjsKKworICAgIC8vIFZhcmlvdXMgY2FjaGVzCisgICAgQ2FjaGVzJiBtQ2FjaGVzOworfTsgLy8gY2xhc3MgT3BlbkdMUmVuZGVyZXIKKworfTsgLy8gbmFtZXNwYWNlIHVpcmVuZGVyZXIKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX1VJX09QRU5HTF9SRU5ERVJFUl9ICmRpZmYgLS1naXQgYS9saWJzL2h3dWkvUGF0Y2guY3BwIGIvbGlicy9od3VpL1BhdGNoLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjZiYjM3Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL1BhdGNoLmNwcApAQCAtMCwwICsxLDE4OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiT3BlbkdMUmVuZGVyZXIiCisKKyNpbmNsdWRlIDxjc3RyaW5nPgorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJQYXRjaC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgdWlyZW5kZXJlciB7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENvbnN0cnVjdG9ycy9kZXN0cnVjdG9yCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK1BhdGNoOjpQYXRjaChjb25zdCB1aW50MzJfdCB4Q291bnQsIGNvbnN0IHVpbnQzMl90IHlDb3VudCk6CisgICAgICAgIHhDb3VudCh4Q291bnQgKyAyKSwgeUNvdW50KHlDb3VudCArIDIpIHsKKyAgICB2ZXJ0aWNlc0NvdW50ID0gKHhDb3VudCArIDIpICogKHlDb3VudCArIDIpOworICAgIHZlcnRpY2VzID0gbmV3IFRleHR1cmVWZXJ0ZXhbdmVydGljZXNDb3VudF07CisKKyAgICAvLyAyIHRyaWFuZ2xlcyBwZXIgcGF0Y2gsIDMgdmVydGljZXMgcGVyIHRyaWFuZ2xlCisgICAgaW5kaWNlc0NvdW50ID0gKHhDb3VudCArIDEpICogKHlDb3VudCArIDEpICogMiAqIDM7CisgICAgaW5kaWNlcyA9IG5ldyB1aW50MTZfdFtpbmRpY2VzQ291bnRdOworCisgICAgY29uc3QgdWludDMyX3QgeE51bSA9IHhDb3VudCArIDE7CisgICAgY29uc3QgdWludDMyX3QgeU51bSA9IHlDb3VudCArIDE7CisKKyAgICB1aW50MTZfdCogc3RhcnRJbmRpY2VzID0gaW5kaWNlczsKKyAgICB1aW50MzJfdCBuID0gMDsKKyAgICBmb3IgKHVpbnQzMl90IHkgPSAwOyB5IDwgeU51bTsgeSsrKSB7CisgICAgICAgIGZvciAodWludDMyX3QgeCA9IDA7IHggPCB4TnVtOyB4KyspIHsKKyAgICAgICAgICAgICpzdGFydEluZGljZXMrKyA9IG47CisgICAgICAgICAgICAqc3RhcnRJbmRpY2VzKysgPSBuICsgMTsKKyAgICAgICAgICAgICpzdGFydEluZGljZXMrKyA9IG4gKyB4TnVtICsgMjsKKworICAgICAgICAgICAgKnN0YXJ0SW5kaWNlcysrID0gbjsKKyAgICAgICAgICAgICpzdGFydEluZGljZXMrKyA9IG4gKyB4TnVtICsgMjsKKyAgICAgICAgICAgICpzdGFydEluZGljZXMrKyA9IG4gKyB4TnVtICsgMTsKKworICAgICAgICAgICAgbiArPSAxOworICAgICAgICB9CisgICAgICAgIG4gKz0gMTsKKyAgICB9Cit9CisKK1BhdGNoOjp+UGF0Y2goKSB7CisgICAgZGVsZXRlIGluZGljZXM7CisgICAgZGVsZXRlIHZlcnRpY2VzOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBWZXJ0aWNlcyBtYW5hZ2VtZW50CisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3ZvaWQgUGF0Y2g6OnVwZGF0ZVZlcnRpY2VzKGNvbnN0IFNrQml0bWFwKiBiaXRtYXAsIGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsCisgICAgICAgIGZsb2F0IGJvdHRvbSwgY29uc3QgaW50MzJfdCogeERpdnMsICBjb25zdCBpbnQzMl90KiB5RGl2cywgY29uc3QgdWludDMyX3Qgd2lkdGgsCisgICAgICAgIGNvbnN0IHVpbnQzMl90IGhlaWdodCkgeworICAgIGNvbnN0IHVpbnQzMl90IHhTdHJldGNoQ291bnQgPSAod2lkdGggKyAxKSA+PiAxOworICAgIGNvbnN0IHVpbnQzMl90IHlTdHJldGNoQ291bnQgPSAoaGVpZ2h0ICsgMSkgPj4gMTsKKworICAgIGZsb2F0IHhTdHJldGNoID0gMDsKKyAgICBmbG9hdCB5U3RyZXRjaCA9IDA7CisgICAgZmxvYXQgeFN0cmV0Y2hUZXggPSAwOworICAgIGZsb2F0IHlTdHJldGNoVGV4ID0gMDsKKworICAgIGNvbnN0IGZsb2F0IG1lc2hXaWR0aCA9IHJpZ2h0IC0gbGVmdDsKKworICAgIGNvbnN0IGZsb2F0IGJpdG1hcFdpZHRoID0gZmxvYXQoYml0bWFwLT53aWR0aCgpKTsKKyAgICBjb25zdCBmbG9hdCBiaXRtYXBIZWlnaHQgPSBmbG9hdChiaXRtYXAtPmhlaWdodCgpKTsKKworICAgIGlmICh4U3RyZXRjaENvdW50ID4gMCkgeworICAgICAgICB1aW50MzJfdCBzdHJldGNoU2l6ZSA9IDA7CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDE7IGkgPCB3aWR0aDsgaSArPSAyKSB7CisgICAgICAgICAgICBzdHJldGNoU2l6ZSArPSB4RGl2c1tpXSAtIHhEaXZzW2kgLSAxXTsKKyAgICAgICAgfQorICAgICAgICB4U3RyZXRjaFRleCA9IChzdHJldGNoU2l6ZSAvIGJpdG1hcFdpZHRoKSAvIHhTdHJldGNoQ291bnQ7CisgICAgICAgIGNvbnN0IGZsb2F0IGZpeGVkID0gYml0bWFwV2lkdGggLSBzdHJldGNoU2l6ZTsKKyAgICAgICAgeFN0cmV0Y2ggPSAocmlnaHQgLSBsZWZ0IC0gZml4ZWQpIC8geFN0cmV0Y2hDb3VudDsKKyAgICB9CisKKyAgICBpZiAoeVN0cmV0Y2hDb3VudCA+IDApIHsKKyAgICAgICAgdWludDMyX3Qgc3RyZXRjaFNpemUgPSAwOworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAxOyBpIDwgaGVpZ2h0OyBpICs9IDIpIHsKKyAgICAgICAgICAgIHN0cmV0Y2hTaXplICs9IHlEaXZzW2ldIC0geURpdnNbaSAtIDFdOworICAgICAgICB9CisgICAgICAgIHlTdHJldGNoVGV4ID0gKHN0cmV0Y2hTaXplIC8gYml0bWFwSGVpZ2h0KSAvIHlTdHJldGNoQ291bnQ7CisgICAgICAgIGNvbnN0IGZsb2F0IGZpeGVkID0gYml0bWFwSGVpZ2h0IC0gc3RyZXRjaFNpemU7CisgICAgICAgIHlTdHJldGNoID0gKGJvdHRvbSAtIHRvcCAtIGZpeGVkKSAvIHlTdHJldGNoQ291bnQ7CisgICAgfQorCisgICAgZmxvYXQgdnkgPSAwLjBmOworICAgIGZsb2F0IHR5ID0gMC4wZjsKKyAgICBUZXh0dXJlVmVydGV4KiB2ZXJ0ZXggPSB2ZXJ0aWNlczsKKworICAgIGdlbmVyYXRlVmVydGljZXModmVydGV4LCAwLjBmLCAwLjBmLCB4RGl2cywgd2lkdGgsIHhTdHJldGNoLCB4U3RyZXRjaFRleCwKKyAgICAgICAgICAgIG1lc2hXaWR0aCwgYml0bWFwV2lkdGgpOworICAgIHZlcnRleCArPSB3aWR0aCArIDI7CisKKyAgICBmb3IgKHVpbnQzMl90IHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKKyAgICAgICAgaWYgKHkgJiAxKSB7CisgICAgICAgICAgICB2eSArPSB5U3RyZXRjaDsKKyAgICAgICAgICAgIHR5ICs9IHlTdHJldGNoVGV4OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29uc3QgZmxvYXQgc3RlcCA9IGZsb2F0KHlEaXZzW3ldKTsKKyAgICAgICAgICAgIHZ5ICs9IHN0ZXA7CisgICAgICAgICAgICB0eSArPSBzdGVwIC8gYml0bWFwSGVpZ2h0OworICAgICAgICB9CisgICAgICAgIGdlbmVyYXRlVmVydGljZXModmVydGV4LCB2eSwgdHksIHhEaXZzLCB3aWR0aCwgeFN0cmV0Y2gsIHhTdHJldGNoVGV4LAorICAgICAgICAgICAgICAgIG1lc2hXaWR0aCwgYml0bWFwV2lkdGgpOworICAgICAgICB2ZXJ0ZXggKz0gd2lkdGggKyAyOworICAgIH0KKworICAgIGdlbmVyYXRlVmVydGljZXModmVydGV4LCBib3R0b20gLSB0b3AsIDEuMGYsIHhEaXZzLCB3aWR0aCwgeFN0cmV0Y2gsIHhTdHJldGNoVGV4LAorICAgICAgICAgICAgbWVzaFdpZHRoLCBiaXRtYXBXaWR0aCk7Cit9CisKK2lubGluZSB2b2lkIFBhdGNoOjpnZW5lcmF0ZVZlcnRpY2VzKFRleHR1cmVWZXJ0ZXgqIHZlcnRleCwgZmxvYXQgeSwgZmxvYXQgdiwKKyAgICAgICAgY29uc3QgaW50MzJfdCB4RGl2c1tdLCB1aW50MzJfdCB4Q291bnQsIGZsb2F0IHhTdHJldGNoLCBmbG9hdCB4U3RyZXRjaFRleCwKKyAgICAgICAgZmxvYXQgd2lkdGgsIGZsb2F0IHdpZHRoVGV4KSB7CisgICAgZmxvYXQgdnggPSAwLjBmOworICAgIGZsb2F0IHR4ID0gMC4wZjsKKworICAgIFRleHR1cmVWZXJ0ZXg6OnNldCh2ZXJ0ZXgsIHZ4LCB5LCB0eCwgdik7CisgICAgdmVydGV4Kys7CisKKyAgICBmb3IgKHVpbnQzMl90IHggPSAwOyB4IDwgeENvdW50OyB4KyspIHsKKyAgICAgICAgaWYgKHggJiAxKSB7CisgICAgICAgICAgICB2eCArPSB4U3RyZXRjaDsKKyAgICAgICAgICAgIHR4ICs9IHhTdHJldGNoVGV4OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29uc3QgZmxvYXQgc3RlcCA9IGZsb2F0KHhEaXZzW3hdKTsKKyAgICAgICAgICAgIHZ4ICs9IHN0ZXA7CisgICAgICAgICAgICB0eCArPSBzdGVwIC8gd2lkdGhUZXg7CisgICAgICAgIH0KKworICAgICAgICBUZXh0dXJlVmVydGV4OjpzZXQodmVydGV4LCB2eCwgeSwgdHgsIHYpOworICAgICAgICB2ZXJ0ZXgrKzsKKyAgICB9CisKKyAgICBUZXh0dXJlVmVydGV4OjpzZXQodmVydGV4LCB3aWR0aCwgeSwgMS4wZiwgdik7CisgICAgdmVydGV4Kys7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIERlYnVnIHRvb2xzCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3ZvaWQgUGF0Y2g6OmR1bXAoKSB7CisgICAgTE9HRCgiVmVydGljZXMgWyIpOworICAgIGZvciAodWludDMyX3QgeSA9IDA7IHkgPCB5Q291bnQ7IHkrKykgeworICAgICAgICBjaGFyIGJ1ZmZlcls1MTJdOworICAgICAgICBidWZmZXJbMF0gPSAnXDAnOworICAgICAgICB1aW50MzJfdCBvZmZzZXQgPSAwOworICAgICAgICBmb3IgKHVpbnQzMl90IHggPSAwOyB4IDwgeENvdW50OyB4KyspIHsKKyAgICAgICAgICAgIFRleHR1cmVWZXJ0ZXgqIHYgPSAmdmVydGljZXNbeSAqIHhDb3VudCArIHhdOworICAgICAgICAgICAgb2Zmc2V0ICs9IHNwcmludGYoJmJ1ZmZlcltvZmZzZXRdLCAiICglLjRmLCUuNGYpLSglLjRmLCUuNGYpIiwKKyAgICAgICAgICAgICAgICAgICAgdi0+cG9zaXRpb25bMF0sIHYtPnBvc2l0aW9uWzFdLCB2LT50ZXh0dXJlWzBdLCB2LT50ZXh0dXJlWzFdKTsKKyAgICAgICAgfQorICAgICAgICBMT0dEKCIgIFslcyBdIiwgYnVmZmVyKTsKKyAgICB9CisgICAgTE9HRCgiXVxuSW5kaWNlcyBbICIpOworICAgIGNoYXIgYnVmZmVyWzQwOTZdOworICAgIGJ1ZmZlclswXSA9ICdcMCc7CisgICAgdWludDMyX3Qgb2Zmc2V0ID0gMDsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgaW5kaWNlc0NvdW50OyBpKyspIHsKKyAgICAgICAgb2Zmc2V0ICs9IHNwcmludGYoJmJ1ZmZlcltvZmZzZXRdLCAiJWQgIiwgaW5kaWNlc1tpXSk7CisgICAgfQorICAgIExPR0QoIiAgJXNcbl0iLCBidWZmZXIpOworfQorCit9OyAvLyBuYW1lc3BhY2UgdWlyZW5kZXJlcgorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9QYXRjaC5oIGIvbGlicy9od3VpL1BhdGNoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQzYWQwMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvaHd1aS9QYXRjaC5oCkBAIC0wLDAgKzEsODUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfVUlfUEFUQ0hfSAorI2RlZmluZSBBTkRST0lEX1VJX1BBVENIX0gKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8U2tCaXRtYXAuaD4KKworI2luY2x1ZGUgIlZlcnRleC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgdWlyZW5kZXJlciB7CisKKy8qKgorICogRGVzY3JpcHRpb24gb2YgYSBwYXRjaC4KKyAqLworc3RydWN0IFBhdGNoRGVzY3JpcHRpb24geworICAgIFBhdGNoRGVzY3JpcHRpb24oKTogeENvdW50KDApLCB5Q291bnQoMCkgeyB9CisgICAgUGF0Y2hEZXNjcmlwdGlvbihjb25zdCB1aW50MzJfdCB4Q291bnQsIGNvbnN0IHVpbnQzMl90IHlDb3VudCk6CisgICAgICAgICAgICB4Q291bnQoeENvdW50KSwgeUNvdW50KHlDb3VudCkgeyB9CisgICAgUGF0Y2hEZXNjcmlwdGlvbihjb25zdCBQYXRjaERlc2NyaXB0aW9uJiBkZXNjcmlwdGlvbik6CisgICAgICAgICAgICB4Q291bnQoZGVzY3JpcHRpb24ueENvdW50KSwgeUNvdW50KGRlc2NyaXB0aW9uLnlDb3VudCkgeyB9CisKKyAgICB1aW50MzJfdCB4Q291bnQ7CisgICAgdWludDMyX3QgeUNvdW50OworCisgICAgYm9vbCBvcGVyYXRvcjwoY29uc3QgUGF0Y2hEZXNjcmlwdGlvbiYgcmhzKSBjb25zdCB7CisgICAgICAgIGlmICh4Q291bnQgPT0gcmhzLnhDb3VudCkgeworICAgICAgICAgICAgcmV0dXJuIHlDb3VudCA8IHJocy55Q291bnQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHhDb3VudCA8IHJocy54Q291bnQ7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFBhdGNoRGVzY3JpcHRpb24mIHJocykgY29uc3QgeworICAgICAgICByZXR1cm4geENvdW50ID09IHJocy54Q291bnQgJiYgeUNvdW50ID09IHJocy55Q291bnQ7CisgICAgfQorfTsgLy8gc3RydWN0IFBhdGNoRGVzY3JpcHRpb24KKworLyoqCisgKiBBbiBPcGVuR0wgcGF0Y2guIFRoaXMgY29udGFpbnMgYW4gYXJyYXkgb2YgdmVydGljZXMgYW5kIGFuIGFycmF5IG9mCisgKiBpbmRpY2VzIHRvIHJlbmRlciB0aGUgdmVydGljZXMuCisgKi8KK3N0cnVjdCBQYXRjaCB7CisgICAgUGF0Y2goY29uc3QgdWludDMyX3QgeENvdW50LCBjb25zdCB1aW50MzJfdCB5Q291bnQpOworICAgIH5QYXRjaCgpOworCisgICAgdm9pZCB1cGRhdGVWZXJ0aWNlcyhjb25zdCBTa0JpdG1hcCogYml0bWFwLCBmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sCisgICAgICAgICAgICBjb25zdCBpbnQzMl90KiB4RGl2cywgIGNvbnN0IGludDMyX3QqIHlEaXZzLAorICAgICAgICAgICAgY29uc3QgdWludDMyX3Qgd2lkdGgsIGNvbnN0IHVpbnQzMl90IGhlaWdodCk7CisgICAgdm9pZCBkdW1wKCk7CisKKyAgICB1aW50MzJfdCB4Q291bnQ7CisgICAgdWludDMyX3QgeUNvdW50OworCisgICAgdWludDE2X3QqIGluZGljZXM7CisgICAgdWludDMyX3QgaW5kaWNlc0NvdW50OworCisgICAgVGV4dHVyZVZlcnRleCogdmVydGljZXM7CisgICAgdWludDMyX3QgdmVydGljZXNDb3VudDsKKworcHJpdmF0ZToKKyAgICBzdGF0aWMgaW5saW5lIHZvaWQgZ2VuZXJhdGVWZXJ0aWNlcyhUZXh0dXJlVmVydGV4KiB2ZXJ0ZXgsIGZsb2F0IHksIGZsb2F0IHYsCisgICAgICAgICAgICBjb25zdCBpbnQzMl90IHhEaXZzW10sIHVpbnQzMl90IHhDb3VudCwgZmxvYXQgeFN0cmV0Y2gsIGZsb2F0IHhTdHJldGNoVGV4LAorICAgICAgICAgICAgZmxvYXQgd2lkdGgsIGZsb2F0IHdpZHRoVGV4KTsKK307IC8vIHN0cnVjdCBQYXRjaAorCit9OyAvLyBuYW1lc3BhY2UgdWlyZW5kZXJlcgorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfVUlfUEFUQ0hfSApkaWZmIC0tZ2l0IGEvbGlicy9od3VpL1BhdGNoQ2FjaGUuY3BwIGIvbGlicy9od3VpL1BhdGNoQ2FjaGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3YzBjY2UKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2h3dWkvUGF0Y2hDYWNoZS5jcHAKQEAgLTAsMCArMSw3NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiT3BlbkdMUmVuZGVyZXIiCisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9SZXNvdXJjZVR5cGVzLmg+CisKKyNpbmNsdWRlICJQYXRjaENhY2hlLmgiCisjaW5jbHVkZSAiUHJvcGVydGllcy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgdWlyZW5kZXJlciB7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENvbnN0cnVjdG9ycy9kZXN0cnVjdG9yCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK1BhdGNoQ2FjaGU6OlBhdGNoQ2FjaGUoKTogbUNhY2hlKERFRkFVTFRfUEFUQ0hfQ0FDSEVfU0laRSkgeworfQorCitQYXRjaENhY2hlOjpQYXRjaENhY2hlKHVpbnQzMl90IG1heEVudHJpZXMpOiBtQ2FjaGUobWF4RW50cmllcykgeworfQorCitQYXRjaENhY2hlOjp+UGF0Y2hDYWNoZSgpIHsKKyAgICBjbGVhcigpOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDYWxsYmFja3MKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordm9pZCBQYXRjaENhY2hlOjpvcGVyYXRvcigpKFBhdGNoRGVzY3JpcHRpb24mIGRlc2NyaXB0aW9uLCBQYXRjaComIG1lc2gpIHsKKyAgICBpZiAobWVzaCkgZGVsZXRlIG1lc2g7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENhY2hpbmcKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordm9pZCBQYXRjaENhY2hlOjpjbGVhcigpIHsKKyAgICBtQ2FjaGUuc2V0T25FbnRyeVJlbW92ZWRMaXN0ZW5lcih0aGlzKTsKKyAgICBtQ2FjaGUuY2xlYXIoKTsKKyAgICBtQ2FjaGUuc2V0T25FbnRyeVJlbW92ZWRMaXN0ZW5lcihOVUxMKTsKK30KKworUGF0Y2gqIFBhdGNoQ2FjaGU6OmdldChjb25zdCBSZXNfcG5nXzlwYXRjaCogcGF0Y2gpIHsKKyAgICBjb25zdCB1aW50MzJfdCB3aWR0aCA9IHBhdGNoLT5udW1YRGl2czsKKyAgICBjb25zdCB1aW50MzJfdCBoZWlnaHQgPSBwYXRjaC0+bnVtWURpdnM7CisgICAgY29uc3QgUGF0Y2hEZXNjcmlwdGlvbiBkZXNjcmlwdGlvbih3aWR0aCwgaGVpZ2h0KTsKKworICAgIFBhdGNoKiBtZXNoID0gbUNhY2hlLmdldChkZXNjcmlwdGlvbik7CisgICAgaWYgKCFtZXNoKSB7CisgICAgICAgIFBBVENIX0xPR0QoIkNyZWF0aW5nIG5ldyBwYXRjaCBtZXNoLCB3PSVkIGg9JWQiLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgbWVzaCA9IG5ldyBQYXRjaCh3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgbUNhY2hlLnB1dChkZXNjcmlwdGlvbiwgbWVzaCk7CisgICAgfQorCisgICAgcmV0dXJuIG1lc2g7Cit9CisKK307IC8vIG5hbWVzcGFjZSB1aXJlbmRlcmVyCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlicy9od3VpL1BhdGNoQ2FjaGUuaCBiL2xpYnMvaHd1aS9QYXRjaENhY2hlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTg3NGExNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvaHd1aS9QYXRjaENhY2hlLmgKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9VSV9QQVRDSF9DQUNIRV9ICisjZGVmaW5lIEFORFJPSURfVUlfUEFUQ0hfQ0FDSEVfSAorCisjaW5jbHVkZSAiUGF0Y2guaCIKKyNpbmNsdWRlICJHZW5lcmF0aW9uQ2FjaGUuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHVpcmVuZGVyZXIgeworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBEZWZpbmVzCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8vIERlYnVnCisjZGVmaW5lIERFQlVHX1BBVENIRVMgMAorCisvLyBEZWJ1ZworI2lmIERFQlVHX1BBVENIRVMKKyAgICAjZGVmaW5lIFBBVENIX0xPR0QoLi4uKSBMT0dEKF9fVkFfQVJHU19fKQorI2Vsc2UKKyAgICAjZGVmaW5lIFBBVENIX0xPR0QoLi4uKQorI2VuZGlmCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENhY2hlCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2NsYXNzIFBhdGNoQ2FjaGU6IHB1YmxpYyBPbkVudHJ5UmVtb3ZlZDxQYXRjaERlc2NyaXB0aW9uLCBQYXRjaCo+IHsKK3B1YmxpYzoKKyAgICBQYXRjaENhY2hlKCk7CisgICAgUGF0Y2hDYWNoZSh1aW50MzJfdCBtYXhDYXBhY2l0eSk7CisgICAgflBhdGNoQ2FjaGUoKTsKKworICAgIC8qKgorICAgICAqIFVzZWQgYXMgYSBjYWxsYmFjayB3aGVuIGFuIGVudHJ5IGlzIHJlbW92ZWQgZnJvbSB0aGUgY2FjaGUuCisgICAgICogRG8gbm90IGludm9rZSBkaXJlY3RseS4KKyAgICAgKi8KKyAgICB2b2lkIG9wZXJhdG9yKCkoUGF0Y2hEZXNjcmlwdGlvbiYgZGVzY3JpcHRpb24sIFBhdGNoKiYgbWVzaCk7CisKKyAgICBQYXRjaCogZ2V0KGNvbnN0IFJlc19wbmdfOXBhdGNoKiBwYXRjaCk7CisgICAgdm9pZCBjbGVhcigpOworCitwcml2YXRlOgorICAgIEdlbmVyYXRpb25DYWNoZTxQYXRjaERlc2NyaXB0aW9uLCBQYXRjaCo+IG1DYWNoZTsKK307IC8vIGNsYXNzIFBhdGNoQ2FjaGUKKworfTsgLy8gbmFtZXNwYWNlIHVpcmVuZGVyZXIKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX1VJX1BBVENIX0NBQ0hFX0gKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9QYXRoQ2FjaGUuY3BwIGIvbGlicy9od3VpL1BhdGhDYWNoZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU4YzBjYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvaHd1aS9QYXRoQ2FjaGUuY3BwCkBAIC0wLDAgKzEsMTk4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJPcGVuR0xSZW5kZXJlciIKKworI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgorCisjaW5jbHVkZSA8U2tDYW52YXMuaD4KKyNpbmNsdWRlIDxTa1JlY3QuaD4KKworI2luY2x1ZGUgIlBhdGhDYWNoZS5oIgorI2luY2x1ZGUgIlByb3BlcnRpZXMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHVpcmVuZGVyZXIgeworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDb25zdHJ1Y3RvcnMvZGVzdHJ1Y3RvcgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitQYXRoQ2FjaGU6OlBhdGhDYWNoZSgpOgorICAgICAgICBtQ2FjaGUoR2VuZXJhdGlvbkNhY2hlPFBhdGhDYWNoZUVudHJ5LCBQYXRoVGV4dHVyZSo+OjprVW5saW1pdGVkQ2FwYWNpdHkpLAorICAgICAgICBtU2l6ZSgwKSwgbU1heFNpemUoTUIoREVGQVVMVF9QQVRIX0NBQ0hFX1NJWkUpKSB7CisgICAgY2hhciBwcm9wZXJ0eVtQUk9QRVJUWV9WQUxVRV9NQVhdOworICAgIGlmIChwcm9wZXJ0eV9nZXQoUFJPUEVSVFlfUEFUSF9DQUNIRV9TSVpFLCBwcm9wZXJ0eSwgTlVMTCkgPiAwKSB7CisgICAgICAgIExPR0QoIiAgU2V0dGluZyBwYXRoIGNhY2hlIHNpemUgdG8gJXNNQiIsIHByb3BlcnR5KTsKKyAgICAgICAgc2V0TWF4U2l6ZShNQihhdG9mKHByb3BlcnR5KSkpOworICAgIH0gZWxzZSB7CisgICAgICAgIExPR0QoIiAgVXNpbmcgZGVmYXVsdCBwYXRoIGNhY2hlIHNpemUgb2YgJS4yZk1CIiwgREVGQVVMVF9QQVRIX0NBQ0hFX1NJWkUpOworICAgIH0KKyAgICBpbml0KCk7Cit9CisKK1BhdGhDYWNoZTo6UGF0aENhY2hlKHVpbnQzMl90IG1heEJ5dGVTaXplKToKKyAgICAgICAgbUNhY2hlKEdlbmVyYXRpb25DYWNoZTxQYXRoQ2FjaGVFbnRyeSwgUGF0aFRleHR1cmUqPjo6a1VubGltaXRlZENhcGFjaXR5KSwKKyAgICAgICAgbVNpemUoMCksIG1NYXhTaXplKG1heEJ5dGVTaXplKSB7CisgICAgaW5pdCgpOworfQorCitQYXRoQ2FjaGU6On5QYXRoQ2FjaGUoKSB7CisgICAgbUNhY2hlLmNsZWFyKCk7Cit9CisKK3ZvaWQgUGF0aENhY2hlOjppbml0KCkgeworICAgIG1DYWNoZS5zZXRPbkVudHJ5UmVtb3ZlZExpc3RlbmVyKHRoaXMpOworCisgICAgR0xpbnQgbWF4VGV4dHVyZVNpemU7CisgICAgZ2xHZXRJbnRlZ2VydihHTF9NQVhfVEVYVFVSRV9TSVpFLCAmbWF4VGV4dHVyZVNpemUpOworICAgIG1NYXhUZXh0dXJlU2l6ZSA9IG1heFRleHR1cmVTaXplOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBTaXplIG1hbmFnZW1lbnQKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordWludDMyX3QgUGF0aENhY2hlOjpnZXRTaXplKCkgeworICAgIHJldHVybiBtU2l6ZTsKK30KKwordWludDMyX3QgUGF0aENhY2hlOjpnZXRNYXhTaXplKCkgeworICAgIHJldHVybiBtTWF4U2l6ZTsKK30KKwordm9pZCBQYXRoQ2FjaGU6OnNldE1heFNpemUodWludDMyX3QgbWF4U2l6ZSkgeworICAgIG1NYXhTaXplID0gbWF4U2l6ZTsKKyAgICB3aGlsZSAobVNpemUgPiBtTWF4U2l6ZSkgeworICAgICAgICBtQ2FjaGUucmVtb3ZlT2xkZXN0KCk7CisgICAgfQorfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDYWxsYmFja3MKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordm9pZCBQYXRoQ2FjaGU6Om9wZXJhdG9yKCkoUGF0aENhY2hlRW50cnkmIHBhdGgsIFBhdGhUZXh0dXJlKiYgdGV4dHVyZSkgeworICAgIGNvbnN0IHVpbnQzMl90IHNpemUgPSB0ZXh0dXJlLT53aWR0aCAqIHRleHR1cmUtPmhlaWdodDsKKyAgICBtU2l6ZSAtPSBzaXplOworCisgICAgaWYgKHRleHR1cmUpIHsKKyAgICAgICAgZ2xEZWxldGVUZXh0dXJlcygxLCAmdGV4dHVyZS0+aWQpOworICAgICAgICBkZWxldGUgdGV4dHVyZTsKKyAgICB9Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENhY2hpbmcKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworUGF0aFRleHR1cmUqIFBhdGhDYWNoZTo6Z2V0KFNrUGF0aCogcGF0aCwgU2tQYWludCogcGFpbnQpIHsKKyAgICBQYXRoQ2FjaGVFbnRyeSBlbnRyeShwYXRoLCBwYWludCk7CisgICAgUGF0aFRleHR1cmUqIHRleHR1cmUgPSBtQ2FjaGUuZ2V0KGVudHJ5KTsKKworICAgIGlmICghdGV4dHVyZSkgeworICAgICAgICB0ZXh0dXJlID0gYWRkVGV4dHVyZShlbnRyeSwgcGF0aCwgcGFpbnQpOworICAgIH0gZWxzZSBpZiAocGF0aC0+Z2V0R2VuZXJhdGlvbklEKCkgIT0gdGV4dHVyZS0+Z2VuZXJhdGlvbikgeworICAgICAgICBtQ2FjaGUucmVtb3ZlKGVudHJ5KTsKKyAgICAgICAgdGV4dHVyZSA9IGFkZFRleHR1cmUoZW50cnksIHBhdGgsIHBhaW50KTsKKyAgICB9CisKKyAgICByZXR1cm4gdGV4dHVyZTsKK30KKworUGF0aFRleHR1cmUqIFBhdGhDYWNoZTo6YWRkVGV4dHVyZShjb25zdCBQYXRoQ2FjaGVFbnRyeSYgZW50cnksCisgICAgICAgIGNvbnN0IFNrUGF0aCAqcGF0aCwgY29uc3QgU2tQYWludCogcGFpbnQpIHsKKyAgICBjb25zdCBTa1JlY3QmIGJvdW5kcyA9IHBhdGgtPmdldEJvdW5kcygpOworCisgICAgY29uc3QgZmxvYXQgcGF0aFdpZHRoID0gYm91bmRzLndpZHRoKCk7CisgICAgY29uc3QgZmxvYXQgcGF0aEhlaWdodCA9IGJvdW5kcy5oZWlnaHQoKTsKKworICAgIGlmIChwYXRoV2lkdGggPiBtTWF4VGV4dHVyZVNpemUgfHwgcGF0aEhlaWdodCA+IG1NYXhUZXh0dXJlU2l6ZSkgeworICAgICAgICBMT0dXKCJQYXRoIHRvbyBsYXJnZSB0byBiZSByZW5kZXJlZCBpbnRvIGEgdGV4dHVyZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBjb25zdCBmbG9hdCBvZmZzZXQgPSBlbnRyeS5zdHJva2VXaWR0aCAqIDEuNWY7CisgICAgY29uc3QgdWludDMyX3Qgd2lkdGggPSB1aW50MzJfdChwYXRoV2lkdGggKyBvZmZzZXQgKiAyLjAgKyAwLjUpOworICAgIGNvbnN0IHVpbnQzMl90IGhlaWdodCA9IHVpbnQzMl90KHBhdGhIZWlnaHQgKyBvZmZzZXQgKiAyLjAgKyAwLjUpOworCisgICAgY29uc3QgdWludDMyX3Qgc2l6ZSA9IHdpZHRoICogaGVpZ2h0OworICAgIC8vIERvbid0IGV2ZW4gdHJ5IHRvIGNhY2hlIGEgYml0bWFwIHRoYXQncyBiaWdnZXIgdGhhbiB0aGUgY2FjaGUKKyAgICBpZiAoc2l6ZSA8IG1NYXhTaXplKSB7CisgICAgICAgIHdoaWxlIChtU2l6ZSArIHNpemUgPiBtTWF4U2l6ZSkgeworICAgICAgICAgICAgbUNhY2hlLnJlbW92ZU9sZGVzdCgpOworICAgICAgICB9CisgICAgfQorCisgICAgUGF0aFRleHR1cmUqIHRleHR1cmUgPSBuZXcgUGF0aFRleHR1cmU7CisgICAgdGV4dHVyZS0+bGVmdCA9IGJvdW5kcy5mTGVmdDsKKyAgICB0ZXh0dXJlLT50b3AgPSBib3VuZHMuZlRvcDsKKyAgICB0ZXh0dXJlLT5vZmZzZXQgPSBvZmZzZXQ7CisgICAgdGV4dHVyZS0+d2lkdGggPSB3aWR0aDsKKyAgICB0ZXh0dXJlLT5oZWlnaHQgPSBoZWlnaHQ7CisgICAgdGV4dHVyZS0+Z2VuZXJhdGlvbiA9IHBhdGgtPmdldEdlbmVyYXRpb25JRCgpOworCisgICAgU2tCaXRtYXAgYml0bWFwOworICAgIGJpdG1hcC5zZXRDb25maWcoU2tCaXRtYXA6OmtBOF9Db25maWcsIHdpZHRoLCBoZWlnaHQpOworICAgIGJpdG1hcC5hbGxvY1BpeGVscygpOworICAgIGJpdG1hcC5lcmFzZUNvbG9yKDApOworCisgICAgU2tDYW52YXMgY2FudmFzKGJpdG1hcCk7CisgICAgY2FudmFzLnRyYW5zbGF0ZSgtYm91bmRzLmZMZWZ0ICsgb2Zmc2V0LCAtYm91bmRzLmZUb3AgKyBvZmZzZXQpOworICAgIGNhbnZhcy5kcmF3UGF0aCgqcGF0aCwgKnBhaW50KTsKKworICAgIGdlbmVyYXRlVGV4dHVyZShiaXRtYXAsIHRleHR1cmUpOworCisgICAgaWYgKHNpemUgPCBtTWF4U2l6ZSkgeworICAgICAgICBtU2l6ZSArPSBzaXplOworICAgICAgICBtQ2FjaGUucHV0KGVudHJ5LCB0ZXh0dXJlKTsKKyAgICB9IGVsc2UgeworICAgICAgICB0ZXh0dXJlLT5jbGVhbnVwID0gdHJ1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gdGV4dHVyZTsKK30KKwordm9pZCBQYXRoQ2FjaGU6OmNsZWFyKCkgeworICAgIG1DYWNoZS5jbGVhcigpOworfQorCit2b2lkIFBhdGhDYWNoZTo6Z2VuZXJhdGVUZXh0dXJlKFNrQml0bWFwJiBiaXRtYXAsIFRleHR1cmUqIHRleHR1cmUpIHsKKyAgICBTa0F1dG9Mb2NrUGl4ZWxzIGFscChiaXRtYXApOworICAgIGlmICghYml0bWFwLnJlYWR5VG9EcmF3KCkpIHsKKyAgICAgICAgTE9HRSgiQ2Fubm90IGdlbmVyYXRlIHRleHR1cmUgZnJvbSBiaXRtYXAiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGdsR2VuVGV4dHVyZXMoMSwgJnRleHR1cmUtPmlkKTsKKworICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgdGV4dHVyZS0+aWQpOworICAgIC8vIFRleHR1cmVzIGFyZSBBbHBoYTgKKyAgICBnbFBpeGVsU3RvcmVpKEdMX1VOUEFDS19BTElHTk1FTlQsIDEpOworCisgICAgdGV4dHVyZS0+YmxlbmQgPSB0cnVlOworICAgIGdsVGV4SW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCBHTF9BTFBIQSwgdGV4dHVyZS0+d2lkdGgsIHRleHR1cmUtPmhlaWdodCwgMCwKKyAgICAgICAgICAgIEdMX0FMUEhBLCBHTF9VTlNJR05FRF9CWVRFLCBiaXRtYXAuZ2V0UGl4ZWxzKCkpOworCisgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUlOX0ZJTFRFUiwgR0xfTElORUFSKTsKKyAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NQUdfRklMVEVSLCBHTF9MSU5FQVIpOworCisgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9TLCBHTF9DTEFNUF9UT19FREdFKTsKKyAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9XUkFQX1QsIEdMX0NMQU1QX1RPX0VER0UpOworfQorCit9OyAvLyBuYW1lc3BhY2UgdWlyZW5kZXJlcgorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9QYXRoQ2FjaGUuaCBiL2xpYnMvaHd1aS9QYXRoQ2FjaGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjJlNWUwCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL1BhdGhDYWNoZS5oCkBAIC0wLDAgKzEsMTUxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1VJX1BBVEhfQ0FDSEVfSAorI2RlZmluZSBBTkRST0lEX1VJX1BBVEhfQ0FDSEVfSAorCisjaW5jbHVkZSA8U2tCaXRtYXAuaD4KKyNpbmNsdWRlIDxTa1BhaW50Lmg+CisjaW5jbHVkZSA8U2tQYXRoLmg+CisKKyNpbmNsdWRlICJUZXh0dXJlLmgiCisjaW5jbHVkZSAiR2VuZXJhdGlvbkNhY2hlLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSB1aXJlbmRlcmVyIHsKKworLyoqCisgKiBEZXNjcmliZSBhIHBhdGggaW4gdGhlIHBhdGggY2FjaGUuCisgKi8KK3N0cnVjdCBQYXRoQ2FjaGVFbnRyeSB7CisgICAgUGF0aENhY2hlRW50cnkoKSB7CisgICAgICAgIHBhdGggPSBOVUxMOworICAgICAgICBqb2luID0gU2tQYWludDo6a0RlZmF1bHRfSm9pbjsKKyAgICAgICAgY2FwID0gU2tQYWludDo6a0RlZmF1bHRfQ2FwOworICAgICAgICBzdHlsZSA9IFNrUGFpbnQ6OmtGaWxsX1N0eWxlOworICAgICAgICBtaXRlciA9IDQuMGY7CisgICAgICAgIHN0cm9rZVdpZHRoID0gMS4wZjsKKyAgICB9CisKKyAgICBQYXRoQ2FjaGVFbnRyeShjb25zdCBQYXRoQ2FjaGVFbnRyeSYgZW50cnkpOgorICAgICAgICBwYXRoKGVudHJ5LnBhdGgpLCBqb2luKGVudHJ5LmpvaW4pLCBjYXAoZW50cnkuY2FwKSwKKyAgICAgICAgc3R5bGUoZW50cnkuc3R5bGUpLCBtaXRlcihlbnRyeS5taXRlciksCisgICAgICAgIHN0cm9rZVdpZHRoKGVudHJ5LnN0cm9rZVdpZHRoKSB7CisgICAgfQorCisgICAgUGF0aENhY2hlRW50cnkoU2tQYXRoKiBwYXRoLCBTa1BhaW50KiBwYWludCkgeworICAgICAgICB0aGlzLT5wYXRoID0gcGF0aDsKKyAgICAgICAgam9pbiA9IHBhaW50LT5nZXRTdHJva2VKb2luKCk7CisgICAgICAgIGNhcCA9IHBhaW50LT5nZXRTdHJva2VDYXAoKTsKKyAgICAgICAgbWl0ZXIgPSBwYWludC0+Z2V0U3Ryb2tlTWl0ZXIoKTsKKyAgICAgICAgc3Ryb2tlV2lkdGggPSBwYWludC0+Z2V0U3Ryb2tlV2lkdGgoKTsKKyAgICAgICAgc3R5bGUgPSBwYWludC0+Z2V0U3R5bGUoKTsKKyAgICB9CisKKyAgICBTa1BhdGgqIHBhdGg7CisgICAgU2tQYWludDo6Sm9pbiBqb2luOworICAgIFNrUGFpbnQ6OkNhcCBjYXA7CisgICAgU2tQYWludDo6U3R5bGUgc3R5bGU7CisgICAgZmxvYXQgbWl0ZXI7CisgICAgZmxvYXQgc3Ryb2tlV2lkdGg7CisKKyAgICBib29sIG9wZXJhdG9yPChjb25zdCBQYXRoQ2FjaGVFbnRyeSYgcmhzKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtZW1jbXAodGhpcywgJnJocywgc2l6ZW9mKFBhdGhDYWNoZUVudHJ5KSkgPCAwOworICAgIH0KK307IC8vIHN0cnVjdCBQYXRoQ2FjaGVFbnRyeQorCisvKioKKyAqIEFscGhhIHRleHR1cmUgdXNlZCB0byByZXByZXNlbnQgYSBwYXRoLgorICovCitzdHJ1Y3QgUGF0aFRleHR1cmU6IHB1YmxpYyBUZXh0dXJlIHsKKyAgICBQYXRoVGV4dHVyZSgpOiBUZXh0dXJlKCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIExlZnQgY29vcmRpbmF0ZSBvZiB0aGUgcGF0aCBib3VuZHMuCisgICAgICovCisgICAgZmxvYXQgbGVmdDsKKyAgICAvKioKKyAgICAgKiBUb3AgY29vcmRpbmF0ZSBvZiB0aGUgcGF0aCBib3VuZHMuCisgICAgICovCisgICAgZmxvYXQgdG9wOworICAgIC8qKgorICAgICAqIE9mZnNldCB0byBkcmF3IHRoZSBwYXRoIGF0IHRoZSBjb3JyZWN0IG9yaWdpbi4KKyAgICAgKi8KKyAgICBmbG9hdCBvZmZzZXQ7Cit9OyAvLyBzdHJ1Y3QgUGF0aFRleHR1cmUKKworLyoqCisgKiBBIHNpbXBsZSBMUlUgcGF0aCBjYWNoZS4gVGhlIGNhY2hlIGhhcyBhIG1heGltdW0gc2l6ZSBleHByZXNzZWQgaW4gYnl0ZXMuCisgKiBBbnkgdGV4dHVyZSBhZGRlZCB0byB0aGUgY2FjaGUgY2F1c2luZyB0aGUgY2FjaGUgdG8gZ3JvdyBiZXlvbmQgdGhlIG1heGltdW0KKyAqIGFsbG93ZWQgc2l6ZSB3aWxsIGFsc28gY2F1c2UgdGhlIG9sZGVzdCB0ZXh0dXJlIHRvIGJlIGtpY2tlZCBvdXQuCisgKi8KK2NsYXNzIFBhdGhDYWNoZTogcHVibGljIE9uRW50cnlSZW1vdmVkPFBhdGhDYWNoZUVudHJ5LCBQYXRoVGV4dHVyZSo+IHsKK3B1YmxpYzoKKyAgICBQYXRoQ2FjaGUoKTsKKyAgICBQYXRoQ2FjaGUodWludDMyX3QgbWF4Qnl0ZVNpemUpOworICAgIH5QYXRoQ2FjaGUoKTsKKworICAgIC8qKgorICAgICAqIFVzZWQgYXMgYSBjYWxsYmFjayB3aGVuIGFuIGVudHJ5IGlzIHJlbW92ZWQgZnJvbSB0aGUgY2FjaGUuCisgICAgICogRG8gbm90IGludm9rZSBkaXJlY3RseS4KKyAgICAgKi8KKyAgICB2b2lkIG9wZXJhdG9yKCkoUGF0aENhY2hlRW50cnkmIHBhdGgsIFBhdGhUZXh0dXJlKiYgdGV4dHVyZSk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB0ZXh0dXJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIHBhdGguIElmIHRoZSB0ZXh0dXJlCisgICAgICogY2Fubm90IGJlIGZvdW5kIGluIHRoZSBjYWNoZSwgYSBuZXcgdGV4dHVyZSBpcyBnZW5lcmF0ZWQuCisgICAgICovCisgICAgUGF0aFRleHR1cmUqIGdldChTa1BhdGgqIHBhdGgsIFNrUGFpbnQqIHBhaW50KTsKKyAgICAvKioKKyAgICAgKiBDbGVhcnMgdGhlIGNhY2hlLiBUaGlzIGNhdXNlcyBhbGwgdGV4dHVyZXMgdG8gYmUgZGVsZXRlZC4KKyAgICAgKi8KKyAgICB2b2lkIGNsZWFyKCk7CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIGNhY2hlIGluIGJ5dGVzLgorICAgICAqLworICAgIHZvaWQgc2V0TWF4U2l6ZSh1aW50MzJfdCBtYXhTaXplKTsKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIGNhY2hlIGluIGJ5dGVzLgorICAgICAqLworICAgIHVpbnQzMl90IGdldE1heFNpemUoKTsKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHNpemUgb2YgdGhlIGNhY2hlIGluIGJ5dGVzLgorICAgICAqLworICAgIHVpbnQzMl90IGdldFNpemUoKTsKKworcHJpdmF0ZToKKyAgICAvKioKKyAgICAgKiBHZW5lcmF0ZXMgdGhlIHRleHR1cmUgZnJvbSBhIGJpdG1hcCBpbnRvIHRoZSBzcGVjaWZpZWQgdGV4dHVyZSBzdHJ1Y3R1cmUuCisgICAgICovCisgICAgdm9pZCBnZW5lcmF0ZVRleHR1cmUoU2tCaXRtYXAmIGJpdG1hcCwgVGV4dHVyZSogdGV4dHVyZSk7CisKKyAgICBQYXRoVGV4dHVyZSogYWRkVGV4dHVyZShjb25zdCBQYXRoQ2FjaGVFbnRyeSYgZW50cnksIGNvbnN0IFNrUGF0aCAqcGF0aCwgY29uc3QgU2tQYWludCogcGFpbnQpOworCisgICAgdm9pZCBpbml0KCk7CisKKyAgICBHZW5lcmF0aW9uQ2FjaGU8UGF0aENhY2hlRW50cnksIFBhdGhUZXh0dXJlKj4gbUNhY2hlOworCisgICAgdWludDMyX3QgbVNpemU7CisgICAgdWludDMyX3QgbU1heFNpemU7CisgICAgR0x1aW50IG1NYXhUZXh0dXJlU2l6ZTsKK307IC8vIGNsYXNzIFBhdGhDYWNoZQorCit9OyAvLyBuYW1lc3BhY2UgdWlyZW5kZXJlcgorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfVUlfUEFUSF9DQUNIRV9ICmRpZmYgLS1naXQgYS9saWJzL2h3dWkvUHJvZ3JhbS5jcHAgYi9saWJzL2h3dWkvUHJvZ3JhbS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjUyOGQ5MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvaHd1aS9Qcm9ncmFtLmNwcApAQCAtMCwwICsxLDE0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiT3BlbkdMUmVuZGVyZXIiCisKKyNpbmNsdWRlICJQcm9ncmFtLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSB1aXJlbmRlcmVyIHsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gU2hhZGVycworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisjZGVmaW5lIFNIQURFUl9TT1VSQ0UobmFtZSwgc291cmNlKSBjb25zdCBjaGFyKiBuYW1lID0gI3NvdXJjZQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBCYXNlIHByb2dyYW0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworUHJvZ3JhbTo6UHJvZ3JhbShjb25zdCBjaGFyKiB2ZXJ0ZXgsIGNvbnN0IGNoYXIqIGZyYWdtZW50KSB7CisgICAgdmVydGV4U2hhZGVyID0gYnVpbGRTaGFkZXIodmVydGV4LCBHTF9WRVJURVhfU0hBREVSKTsKKyAgICBmcmFnbWVudFNoYWRlciA9IGJ1aWxkU2hhZGVyKGZyYWdtZW50LCBHTF9GUkFHTUVOVF9TSEFERVIpOworCisgICAgaWQgPSBnbENyZWF0ZVByb2dyYW0oKTsKKyAgICBnbEF0dGFjaFNoYWRlcihpZCwgdmVydGV4U2hhZGVyKTsKKyAgICBnbEF0dGFjaFNoYWRlcihpZCwgZnJhZ21lbnRTaGFkZXIpOworICAgIGdsTGlua1Byb2dyYW0oaWQpOworCisgICAgR0xpbnQgc3RhdHVzOworICAgIGdsR2V0UHJvZ3JhbWl2KGlkLCBHTF9MSU5LX1NUQVRVUywgJnN0YXR1cyk7CisgICAgaWYgKHN0YXR1cyAhPSBHTF9UUlVFKSB7CisgICAgICAgIEdMaW50IGluZm9MZW4gPSAwOworICAgICAgICBnbEdldFByb2dyYW1pdihpZCwgR0xfSU5GT19MT0dfTEVOR1RILCAmaW5mb0xlbik7CisgICAgICAgIGlmIChpbmZvTGVuID4gMSkgeworICAgICAgICAgICAgY2hhciogbG9nID0gKGNoYXIqKSBtYWxsb2Moc2l6ZW9mKGNoYXIpICogaW5mb0xlbik7CisgICAgICAgICAgICBnbEdldFByb2dyYW1JbmZvTG9nKGlkLCBpbmZvTGVuLCAwLCBsb2cpOworICAgICAgICAgICAgTE9HRSgiRXJyb3Igd2hpbGUgbGlua2luZyBzaGFkZXJzOiAlcyIsIGxvZyk7CisgICAgICAgICAgICBkZWxldGUgbG9nOworICAgICAgICB9CisgICAgICAgIGdsRGVsZXRlU2hhZGVyKHZlcnRleFNoYWRlcik7CisgICAgICAgIGdsRGVsZXRlU2hhZGVyKGZyYWdtZW50U2hhZGVyKTsKKyAgICAgICAgZ2xEZWxldGVQcm9ncmFtKGlkKTsKKyAgICB9CisKKyAgICBtVXNlID0gZmFsc2U7CisKKyAgICBwb3NpdGlvbiA9IGFkZEF0dHJpYigicG9zaXRpb24iKTsKKyAgICBjb2xvciA9IGFkZFVuaWZvcm0oImNvbG9yIik7CisgICAgdHJhbnNmb3JtID0gYWRkVW5pZm9ybSgidHJhbnNmb3JtIik7Cit9CisKK1Byb2dyYW06On5Qcm9ncmFtKCkgeworICAgIGdsRGVsZXRlU2hhZGVyKHZlcnRleFNoYWRlcik7CisgICAgZ2xEZWxldGVTaGFkZXIoZnJhZ21lbnRTaGFkZXIpOworICAgIGdsRGVsZXRlUHJvZ3JhbShpZCk7Cit9CisKK2ludCBQcm9ncmFtOjphZGRBdHRyaWIoY29uc3QgY2hhciogbmFtZSkgeworICAgIGludCBzbG90ID0gZ2xHZXRBdHRyaWJMb2NhdGlvbihpZCwgbmFtZSk7CisgICAgYXR0cmlidXRlcy5hZGQobmFtZSwgc2xvdCk7CisgICAgcmV0dXJuIHNsb3Q7Cit9CisKK2ludCBQcm9ncmFtOjpnZXRBdHRyaWIoY29uc3QgY2hhciogbmFtZSkgeworICAgIHNzaXplX3QgaW5kZXggPSBhdHRyaWJ1dGVzLmluZGV4T2ZLZXkobmFtZSk7CisgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZXMudmFsdWVBdChpbmRleCk7CisgICAgfQorICAgIHJldHVybiBhZGRBdHRyaWIobmFtZSk7Cit9CisKK2ludCBQcm9ncmFtOjphZGRVbmlmb3JtKGNvbnN0IGNoYXIqIG5hbWUpIHsKKyAgICBpbnQgc2xvdCA9IGdsR2V0VW5pZm9ybUxvY2F0aW9uKGlkLCBuYW1lKTsKKyAgICB1bmlmb3Jtcy5hZGQobmFtZSwgc2xvdCk7CisgICAgcmV0dXJuIHNsb3Q7Cit9CisKK2ludCBQcm9ncmFtOjpnZXRVbmlmb3JtKGNvbnN0IGNoYXIqIG5hbWUpIHsKKyAgICBzc2l6ZV90IGluZGV4ID0gdW5pZm9ybXMuaW5kZXhPZktleShuYW1lKTsKKyAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICByZXR1cm4gdW5pZm9ybXMudmFsdWVBdChpbmRleCk7CisgICAgfQorICAgIHJldHVybiBhZGRVbmlmb3JtKG5hbWUpOworfQorCitHTHVpbnQgUHJvZ3JhbTo6YnVpbGRTaGFkZXIoY29uc3QgY2hhciogc291cmNlLCBHTGVudW0gdHlwZSkgeworICAgIEdMdWludCBzaGFkZXIgPSBnbENyZWF0ZVNoYWRlcih0eXBlKTsKKyAgICBnbFNoYWRlclNvdXJjZShzaGFkZXIsIDEsICZzb3VyY2UsIDApOworICAgIGdsQ29tcGlsZVNoYWRlcihzaGFkZXIpOworCisgICAgR0xpbnQgc3RhdHVzOworICAgIGdsR2V0U2hhZGVyaXYoc2hhZGVyLCBHTF9DT01QSUxFX1NUQVRVUywgJnN0YXR1cyk7CisgICAgaWYgKHN0YXR1cyAhPSBHTF9UUlVFKSB7CisgICAgICAgIC8vIFNvbWUgZHJpdmVycyByZXR1cm4gd3JvbmcgdmFsdWVzIGZvciBHTF9JTkZPX0xPR19MRU5HVEgKKyAgICAgICAgLy8gdXNlIGEgZml4ZWQgc2l6ZSBpbnN0ZWFkCisgICAgICAgIEdMY2hhciBsb2dbNTEyXTsKKyAgICAgICAgZ2xHZXRTaGFkZXJJbmZvTG9nKHNoYWRlciwgc2l6ZW9mKGxvZyksIDAsICZsb2dbMF0pOworICAgICAgICBMT0dFKCJFcnJvciB3aGlsZSBjb21waWxpbmcgc2hhZGVyOiAlcyIsIGxvZyk7CisgICAgICAgIGdsRGVsZXRlU2hhZGVyKHNoYWRlcik7CisgICAgfQorCisgICAgcmV0dXJuIHNoYWRlcjsKK30KKwordm9pZCBQcm9ncmFtOjpzZXQoY29uc3QgbWF0NCYgcHJvamVjdGlvbk1hdHJpeCwgY29uc3QgbWF0NCYgbW9kZWxWaWV3TWF0cml4LAorICAgICAgICBjb25zdCBtYXQ0JiB0cmFuc2Zvcm1NYXRyaXgpIHsKKyAgICBtYXQ0IHQocHJvamVjdGlvbk1hdHJpeCk7CisgICAgdC5tdWx0aXBseSh0cmFuc2Zvcm1NYXRyaXgpOworICAgIHQubXVsdGlwbHkobW9kZWxWaWV3TWF0cml4KTsKKworICAgIGdsVW5pZm9ybU1hdHJpeDRmdih0cmFuc2Zvcm0sIDEsIEdMX0ZBTFNFLCAmdC5kYXRhWzBdKTsKK30KKwordm9pZCBQcm9ncmFtOjp1c2UoKSB7CisgICAgZ2xVc2VQcm9ncmFtKGlkKTsKKyAgICBtVXNlID0gdHJ1ZTsKKworICAgIGdsRW5hYmxlVmVydGV4QXR0cmliQXJyYXkocG9zaXRpb24pOworfQorCit2b2lkIFByb2dyYW06OnJlbW92ZSgpIHsKKyAgICBtVXNlID0gZmFsc2U7CisKKyAgICBnbERpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheShwb3NpdGlvbik7Cit9CisKK307IC8vIG5hbWVzcGFjZSB1aXJlbmRlcmVyCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlicy9od3VpL1Byb2dyYW0uaCBiL2xpYnMvaHd1aS9Qcm9ncmFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjUzMWM3NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvaHd1aS9Qcm9ncmFtLmgKQEAgLTAsMCArMSwxMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfVUlfUFJPR1JBTV9ICisjZGVmaW5lIEFORFJPSURfVUlfUFJPR1JBTV9ICisKKyNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KKyNpbmNsdWRlIDxHTEVTMi9nbDJleHQuaD4KKworI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CisKKyNpbmNsdWRlICJNYXRyaXguaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHVpcmVuZGVyZXIgeworCisvKioKKyAqIEEgcHJvZ3JhbSBob2xkcyBhIHZlcnRleCBhbmQgYSBmcmFnbWVudCBzaGFkZXIuIEl0IG9mZmVycyBzZXZlcmFsIHV0aWxpdHkKKyAqIG1ldGhvZHMgdG8gcXVlcnkgYXR0cmlidXRlcyBhbmQgdW5pZm9ybXMuCisgKi8KK2NsYXNzIFByb2dyYW0geworcHVibGljOgorICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgcHJvZ3JhbSB3aXRoIHRoZSBzcGVjaWZpZWQgdmVydGV4IGFuZCBmcmFnbWVudAorICAgICAqIHNoYWRlcnMgc291cmNlcy4KKyAgICAgKi8KKyAgICBQcm9ncmFtKGNvbnN0IGNoYXIqIHZlcnRleCwgY29uc3QgY2hhciogZnJhZ21lbnQpOworICAgIHZpcnR1YWwgflByb2dyYW0oKTsKKworICAgIC8qKgorICAgICAqIEJpbmRzIHRoaXMgcHJvZ3JhbSB0byB0aGUgR0wgY29udGV4dC4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHZvaWQgdXNlKCk7CisKKyAgICAvKioKKyAgICAgKiBNYXJrcyB0aGlzIHByb2dyYW0gYXMgdW51c2VkLiBUaGlzIHdpbGwgbm90IHVuYmluZAorICAgICAqIHRoZSBwcm9ncmFtIGZyb20gdGhlIEdMIGNvbnRleHQuCisgICAgICovCisgICAgdmlydHVhbCB2b2lkIHJlbW92ZSgpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgT3BlbkdMIG5hbWUgb2YgdGhlIHNwZWNpZmllZCBhdHRyaWJ1dGUuCisgICAgICovCisgICAgaW50IGdldEF0dHJpYihjb25zdCBjaGFyKiBuYW1lKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIE9wZW5HTCBuYW1lIG9mIHRoZSBzcGVjaWZpZWQgdW5pZm9ybS4KKyAgICAgKi8KKyAgICBpbnQgZ2V0VW5pZm9ybShjb25zdCBjaGFyKiBuYW1lKTsKKworICAgIC8qKgorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgcHJvZ3JhbSBpcyBjdXJyZW50bHkgaW4gdXNlIHdpdGgKKyAgICAgKiB0aGUgR0wgY29udGV4dC4KKyAgICAgKi8KKyAgICBpbmxpbmUgYm9vbCBpc0luVXNlKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVVzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCaW5kcyB0aGUgcHJvZ3JhbSB3aXRoIHRoZSBzcGVjaWZpZWQgcHJvamVjdGlvbiwgbW9kZWxWaWV3IGFuZAorICAgICAqIHRyYW5zZm9ybSBtYXRyaWNlcy4KKyAgICAgKi8KKyAgICB2b2lkIHNldChjb25zdCBtYXQ0JiBwcm9qZWN0aW9uTWF0cml4LCBjb25zdCBtYXQ0JiBtb2RlbFZpZXdNYXRyaXgsCisgICAgICAgICAgICAgY29uc3QgbWF0NCYgdHJhbnNmb3JtTWF0cml4KTsKKworICAgIC8qKgorICAgICAqIE5hbWUgb2YgdGhlIHBvc2l0aW9uIGF0dHJpYnV0ZS4KKyAgICAgKi8KKyAgICBpbnQgcG9zaXRpb247CisKKyAgICAvKioKKyAgICAgKiBOYW1lIG9mIHRoZSBjb2xvciB1bmlmb3JtLgorICAgICAqLworICAgIGludCBjb2xvcjsKKworICAgIC8qKgorICAgICAqIE5hbWUgb2YgdGhlIHRyYW5zZm9ybSB1bmlmb3JtLgorICAgICAqLworICAgIGludCB0cmFuc2Zvcm07CisKK3Byb3RlY3RlZDoKKyAgICAvKioKKyAgICAgKiBBZGRzIGFuIGF0dHJpYnV0ZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIE9wZW5HTCBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUuCisgICAgICovCisgICAgaW50IGFkZEF0dHJpYihjb25zdCBjaGFyKiBuYW1lKTsKKworICAgIC8qKgorICAgICAqIEFkZHMgYSB1bmlmb3JtIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgT3BlbkdMIG5hbWUgb2YgdGhlIHVuaWZvcm0uCisgICAgICovCisgICAgaW50IGFkZFVuaWZvcm0oY29uc3QgY2hhciogbmFtZSk7CisKK3ByaXZhdGU6CisgICAgLyoqCisgICAgICogQ29tcGlsZXMgdGhlIHNwZWNpZmllZCBzaGFkZXIgb2YgdGhlIHNwZWNpZmllZCB0eXBlLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgbmFtZSBvZiB0aGUgY29tcGlsZWQgc2hhZGVyLgorICAgICAqLworICAgIEdMdWludCBidWlsZFNoYWRlcihjb25zdCBjaGFyKiBzb3VyY2UsIEdMZW51bSB0eXBlKTsKKworICAgIC8vIE5hbWUgb2YgdGhlIE9wZW5HTCBwcm9ncmFtCisgICAgR0x1aW50IGlkOworCisgICAgLy8gTmFtZSBvZiB0aGUgc2hhZGVycworICAgIEdMdWludCB2ZXJ0ZXhTaGFkZXI7CisgICAgR0x1aW50IGZyYWdtZW50U2hhZGVyOworCisgICAgLy8gS2VlcHMgdHJhY2sgb2YgYXR0cmlidXRlcyBhbmQgdW5pZm9ybXMgc2xvdHMKKyAgICBLZXllZFZlY3Rvcjxjb25zdCBjaGFyKiwgaW50PiBhdHRyaWJ1dGVzOworICAgIEtleWVkVmVjdG9yPGNvbnN0IGNoYXIqLCBpbnQ+IHVuaWZvcm1zOworCisgICAgYm9vbCBtVXNlOworfTsgLy8gY2xhc3MgUHJvZ3JhbQorCit9OyAvLyBuYW1lc3BhY2UgdWlyZW5kZXJlcgorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfVUlfUFJPR1JBTV9ICmRpZmYgLS1naXQgYS9saWJzL2h3dWkvUHJvZ3JhbUNhY2hlLmNwcCBiL2xpYnMvaHd1aS9Qcm9ncmFtQ2FjaGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5ZmU4NWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2h3dWkvUHJvZ3JhbUNhY2hlLmNwcApAQCAtMCwwICsxLDQzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiT3BlbkdMUmVuZGVyZXIiCisKKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisKKyNpbmNsdWRlICJQcm9ncmFtQ2FjaGUuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHVpcmVuZGVyZXIgeworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBWZXJ0ZXggc2hhZGVycyBzbmlwcGV0cworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitjb25zdCBjaGFyKiBnVlNfSGVhZGVyX0F0dHJpYnV0ZXMgPQorICAgICAgICAiYXR0cmlidXRlIHZlYzQgcG9zaXRpb247XG4iOworY29uc3QgY2hhciogZ1ZTX0hlYWRlcl9BdHRyaWJ1dGVzX1RleENvb3JkcyA9CisgICAgICAgICJhdHRyaWJ1dGUgdmVjMiB0ZXhDb29yZHM7XG4iOworY29uc3QgY2hhciogZ1ZTX0hlYWRlcl9Vbmlmb3JtcyA9CisgICAgICAgICJ1bmlmb3JtIG1hdDQgdHJhbnNmb3JtO1xuIjsKK2NvbnN0IGNoYXIqIGdWU19IZWFkZXJfVW5pZm9ybXNfSGFzR3JhZGllbnQgPQorICAgICAgICAidW5pZm9ybSBmbG9hdCBncmFkaWVudExlbmd0aDtcbiIKKyAgICAgICAgInVuaWZvcm0gdmVjMiBncmFkaWVudDtcbiIKKyAgICAgICAgInVuaWZvcm0gdmVjMiBncmFkaWVudFN0YXJ0O1xuIgorICAgICAgICAidW5pZm9ybSBtYXQ0IHNjcmVlblNwYWNlO1xuIjsKK2NvbnN0IGNoYXIqIGdWU19IZWFkZXJfVW5pZm9ybXNfSGFzQml0bWFwID0KKyAgICAgICAgInVuaWZvcm0gbWF0NCB0ZXh0dXJlVHJhbnNmb3JtO1xuIgorICAgICAgICAidW5pZm9ybSB2ZWMyIHRleHR1cmVEaW1lbnNpb247XG4iOworY29uc3QgY2hhciogZ1ZTX0hlYWRlcl9WYXJ5aW5nc19IYXNUZXh0dXJlID0KKyAgICAgICAgInZhcnlpbmcgdmVjMiBvdXRUZXhDb29yZHM7XG4iOworY29uc3QgY2hhciogZ1ZTX0hlYWRlcl9WYXJ5aW5nc19IYXNCaXRtYXAgPQorICAgICAgICAidmFyeWluZyB2ZWMyIG91dEJpdG1hcFRleENvb3JkcztcbiI7Citjb25zdCBjaGFyKiBnVlNfSGVhZGVyX1ZhcnlpbmdzX0hhc0dyYWRpZW50ID0KKyAgICAgICAgInZhcnlpbmcgZmxvYXQgaW5kZXg7XG4iOworY29uc3QgY2hhciogZ1ZTX01haW4gPQorICAgICAgICAiXG52b2lkIG1haW4odm9pZCkge1xuIjsKK2NvbnN0IGNoYXIqIGdWU19NYWluX091dFRleENvb3JkcyA9CisgICAgICAgICIgICAgb3V0VGV4Q29vcmRzID0gdGV4Q29vcmRzO1xuIjsKK2NvbnN0IGNoYXIqIGdWU19NYWluX091dEdyYWRpZW50SW5kZXggPQorICAgICAgICAiICAgIHZlYzQgbG9jYXRpb24gPSBzY3JlZW5TcGFjZSAqIHBvc2l0aW9uO1xuIgorICAgICAgICAiICAgIGluZGV4ID0gZG90KGxvY2F0aW9uLnh5IC0gZ3JhZGllbnRTdGFydCwgZ3JhZGllbnQpICogZ3JhZGllbnRMZW5ndGg7XG4iOworY29uc3QgY2hhciogZ1ZTX01haW5fT3V0Qml0bWFwVGV4Q29vcmRzID0KKyAgICAgICAgIiAgICB2ZWM0IGJpdG1hcENvb3JkcyA9IHRleHR1cmVUcmFuc2Zvcm0gKiBwb3NpdGlvbjtcbiIKKyAgICAgICAgIiAgICBvdXRCaXRtYXBUZXhDb29yZHMgPSBiaXRtYXBDb29yZHMueHkgKiB0ZXh0dXJlRGltZW5zaW9uO1xuIjsKK2NvbnN0IGNoYXIqIGdWU19NYWluX1Bvc2l0aW9uID0KKyAgICAgICAgIiAgICBnbF9Qb3NpdGlvbiA9IHRyYW5zZm9ybSAqIHBvc2l0aW9uO1xuIjsKK2NvbnN0IGNoYXIqIGdWU19Gb290ZXIgPQorICAgICAgICAifVxuXG4iOworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBGcmFnbWVudCBzaGFkZXJzIHNuaXBwZXRzCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2NvbnN0IGNoYXIqIGdGU19IZWFkZXIgPQorICAgICAgICAicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG5cbiI7Citjb25zdCBjaGFyKiBnRlNfVW5pZm9ybXNfQ29sb3IgPQorICAgICAgICAidW5pZm9ybSB2ZWM0IGNvbG9yO1xuIjsKK2NvbnN0IGNoYXIqIGdGU19Vbmlmb3Jtc19UZXh0dXJlU2FtcGxlciA9CisgICAgICAgICJ1bmlmb3JtIHNhbXBsZXIyRCBzYW1wbGVyO1xuIjsKK2NvbnN0IGNoYXIqIGdGU19Vbmlmb3Jtc19HcmFkaWVudFNhbXBsZXIgPQorICAgICAgICAidW5pZm9ybSBzYW1wbGVyMkQgZ3JhZGllbnRTYW1wbGVyO1xuIjsKK2NvbnN0IGNoYXIqIGdGU19Vbmlmb3Jtc19CaXRtYXBTYW1wbGVyID0KKyAgICAgICAgInVuaWZvcm0gc2FtcGxlcjJEIGJpdG1hcFNhbXBsZXI7XG4iOworY29uc3QgY2hhciogZ0ZTX1VuaWZvcm1zX0NvbG9yT3BbNF0gPSB7CisgICAgICAgIC8vIE5vbmUKKyAgICAgICAgIiIsCisgICAgICAgIC8vIE1hdHJpeAorICAgICAgICAidW5pZm9ybSBtYXQ0IGNvbG9yTWF0cml4O1xuIgorICAgICAgICAidW5pZm9ybSB2ZWM0IGNvbG9yTWF0cml4VmVjdG9yO1xuIiwKKyAgICAgICAgLy8gTGlnaHRpbmcKKyAgICAgICAgInVuaWZvcm0gdmVjNCBsaWdodGluZ011bDtcbiIKKyAgICAgICAgInVuaWZvcm0gdmVjNCBsaWdodGluZ0FkZDtcbiIsCisgICAgICAgIC8vIFBvcnRlckR1ZmYKKyAgICAgICAgInVuaWZvcm0gdmVjNCBjb2xvckJsZW5kO1xuIgorfTsKK2NvbnN0IGNoYXIqIGdGU19NYWluID0KKyAgICAgICAgIlxudm9pZCBtYWluKHZvaWQpIHtcbiIKKyAgICAgICAgIiAgICBsb3dwIHZlYzQgZnJhZ0NvbG9yO1xuIjsKK2NvbnN0IGNoYXIqIGdGU19NYWluX0ZldGNoQ29sb3IgPQorICAgICAgICAiICAgIGZyYWdDb2xvciA9IGNvbG9yO1xuIjsKK2NvbnN0IGNoYXIqIGdGU19NYWluX0ZldGNoVGV4dHVyZSA9CisgICAgICAgICIgICAgZnJhZ0NvbG9yID0gY29sb3IgKiB0ZXh0dXJlMkQoc2FtcGxlciwgb3V0VGV4Q29vcmRzKTtcbiI7Citjb25zdCBjaGFyKiBnRlNfTWFpbl9GZXRjaEE4VGV4dHVyZSA9CisgICAgICAgICIgICAgZnJhZ0NvbG9yID0gY29sb3IgKiB0ZXh0dXJlMkQoc2FtcGxlciwgb3V0VGV4Q29vcmRzKS5hO1xuIjsKK2NvbnN0IGNoYXIqIGdGU19NYWluX0ZldGNoR3JhZGllbnQgPQorICAgICAgICAiICAgIHZlYzQgZ3JhZGllbnRDb2xvciA9IHRleHR1cmUyRChncmFkaWVudFNhbXBsZXIsIHZlYzIoaW5kZXgsIDAuNSkpO1xuIjsKK2NvbnN0IGNoYXIqIGdGU19NYWluX0ZldGNoQml0bWFwID0KKyAgICAgICAgIiAgICB2ZWM0IGJpdG1hcENvbG9yID0gdGV4dHVyZTJEKGJpdG1hcFNhbXBsZXIsIG91dEJpdG1hcFRleENvb3Jkcyk7XG4iOworY29uc3QgY2hhciogZ0ZTX01haW5fRmV0Y2hCaXRtYXBOcG90ID0KKyAgICAgICAgIiAgICB2ZWM0IGJpdG1hcENvbG9yID0gdGV4dHVyZTJEKGJpdG1hcFNhbXBsZXIsIHdyYXAob3V0Qml0bWFwVGV4Q29vcmRzKSk7XG4iOworY29uc3QgY2hhciogZ0ZTX01haW5fQmxlbmRTaGFkZXJzQkcgPQorICAgICAgICAiICAgIGZyYWdDb2xvciA9IGJsZW5kU2hhZGVycyhncmFkaWVudENvbG9yLCBiaXRtYXBDb2xvcikiOworY29uc3QgY2hhciogZ0ZTX01haW5fQmxlbmRTaGFkZXJzR0IgPQorICAgICAgICAiICAgIGZyYWdDb2xvciA9IGJsZW5kU2hhZGVycyhiaXRtYXBDb2xvciwgZ3JhZGllbnRDb2xvcikiOworY29uc3QgY2hhciogZ0ZTX01haW5fQmxlbmRTaGFkZXJzX01vZHVsYXRlID0KKyAgICAgICAgIiAqIGZyYWdDb2xvci5hO1xuIjsKK2NvbnN0IGNoYXIqIGdGU19NYWluX0dyYWRpZW50U2hhZGVyX01vZHVsYXRlID0KKyAgICAgICAgIiAgICBmcmFnQ29sb3IgPSBncmFkaWVudENvbG9yICogZnJhZ0NvbG9yLmE7XG4iOworY29uc3QgY2hhciogZ0ZTX01haW5fQml0bWFwU2hhZGVyX01vZHVsYXRlID0KKyAgICAgICAgIiAgICBmcmFnQ29sb3IgPSBiaXRtYXBDb2xvciAqIGZyYWdDb2xvci5hO1xuIjsKK2NvbnN0IGNoYXIqIGdGU19NYWluX0ZyYWdDb2xvciA9CisgICAgICAgICIgICAgZ2xfRnJhZ0NvbG9yID0gZnJhZ0NvbG9yO1xuIjsKK2NvbnN0IGNoYXIqIGdGU19NYWluX0FwcGx5Q29sb3JPcFs0XSA9IHsKKyAgICAgICAgLy8gTm9uZQorICAgICAgICAiIiwKKyAgICAgICAgLy8gTWF0cml4CisgICAgICAgIC8vIFRPRE86IEZpeCBwcmVtdWx0aXBsaWVkIGFscGhhIGNvbXB1dGF0aW9ucyBmb3IgY29sb3IgbWF0cml4CisgICAgICAgICIgICAgZnJhZ0NvbG9yICo9IGNvbG9yTWF0cml4O1xuIgorICAgICAgICAiICAgIGZyYWdDb2xvciArPSBjb2xvck1hdHJpeFZlY3RvcjtcbiIKKyAgICAgICAgIiAgICBmcmFnQ29sb3IucmdiICo9IGZyYWdDb2xvci5hO1xuIiwKKyAgICAgICAgLy8gTGlnaHRpbmcKKyAgICAgICAgIiAgICBmbG9hdCBsaWdodGluZ0FscGhhID0gZnJhZ0NvbG9yLmE7XG4iCisgICAgICAgICIgICAgZnJhZ0NvbG9yID0gbWluKGZyYWdDb2xvciAqIGxpZ2h0aW5nTXVsICsgKGxpZ2h0aW5nQWRkICogbGlnaHRpbmdBbHBoYSksIGxpZ2h0aW5nQWxwaGEpO1xuIgorICAgICAgICAiICAgIGZyYWdDb2xvci5hID0gbGlnaHRpbmdBbHBoYTtcbiIsCisgICAgICAgIC8vIFBvcnRlckR1ZmYKKyAgICAgICAgIiAgICBmcmFnQ29sb3IgPSBibGVuZENvbG9ycyhjb2xvckJsZW5kLCBmcmFnQ29sb3IpO1xuIgorfTsKK2NvbnN0IGNoYXIqIGdGU19Gb290ZXIgPQorICAgICAgICAifVxuXG4iOworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBQb3J0ZXJEdWZmIHNuaXBwZXRzCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2NvbnN0IGNoYXIqIGdCbGVuZE9wc1sxOF0gPSB7CisgICAgICAgIC8vIENsZWFyCisgICAgICAgICJyZXR1cm4gdmVjNCgwLjAsIDAuMCwgMC4wLCAwLjApO1xuIiwKKyAgICAgICAgLy8gU3JjCisgICAgICAgICJyZXR1cm4gc3JjO1xuIiwKKyAgICAgICAgLy8gRHN0CisgICAgICAgICJyZXR1cm4gZHN0O1xuIiwKKyAgICAgICAgLy8gU3JjT3ZlcgorICAgICAgICAicmV0dXJuIHNyYyArIGRzdCAqICgxLjAgLSBzcmMuYSk7XG4iLAorICAgICAgICAvLyBEc3RPdmVyCisgICAgICAgICJyZXR1cm4gZHN0ICsgc3JjICogKDEuMCAtIGRzdC5hKTtcbiIsCisgICAgICAgIC8vIFNyY0luCisgICAgICAgICJyZXR1cm4gc3JjICogZHN0LmE7XG4iLAorICAgICAgICAvLyBEc3RJbgorICAgICAgICAicmV0dXJuIGRzdCAqIHNyYy5hO1xuIiwKKyAgICAgICAgLy8gU3JjT3V0CisgICAgICAgICJyZXR1cm4gc3JjICogKDEuMCAtIGRzdC5hKTtcbiIsCisgICAgICAgIC8vIERzdE91dAorICAgICAgICAicmV0dXJuIGRzdCAqICgxLjAgLSBzcmMuYSk7XG4iLAorICAgICAgICAvLyBTcmNBdG9wCisgICAgICAgICJyZXR1cm4gdmVjNChzcmMucmdiICogZHN0LmEgKyAoMS4wIC0gc3JjLmEpICogZHN0LnJnYiwgZHN0LmEpO1xuIiwKKyAgICAgICAgLy8gRHN0QXRvcAorICAgICAgICAicmV0dXJuIHZlYzQoZHN0LnJnYiAqIHNyYy5hICsgKDEuMCAtIGRzdC5hKSAqIHNyYy5yZ2IsIHNyYy5hKTtcbiIsCisgICAgICAgIC8vIFhvcgorICAgICAgICAicmV0dXJuIHZlYzQoc3JjLnJnYiAqICgxLjAgLSBkc3QuYSkgKyAoMS4wIC0gc3JjLmEpICogZHN0LnJnYiwgIgorICAgICAgICAgICAgICAgICJzcmMuYSArIGRzdC5hIC0gMi4wICogc3JjLmEgKiBkc3QuYSk7XG4iLAorICAgICAgICAvLyBBZGQKKyAgICAgICAgInJldHVybiBtaW4oc3JjICsgZHN0LCAxLjApO1xuIiwKKyAgICAgICAgLy8gTXVsdGlwbHkKKyAgICAgICAgInJldHVybiBzcmMgKiBkc3Q7XG4iLAorICAgICAgICAvLyBTY3JlZW4KKyAgICAgICAgInJldHVybiBzcmMgKyBkc3QgLSBzcmMgKiBkc3Q7XG4iLAorICAgICAgICAvLyBPdmVybGF5CisgICAgICAgICJyZXR1cm4gY2xhbXAodmVjNChtaXgoIgorICAgICAgICAgICAgICAgICIyLjAgKiBzcmMucmdiICogZHN0LnJnYiArIHNyYy5yZ2IgKiAoMS4wIC0gZHN0LmEpICsgZHN0LnJnYiAqICgxLjAgLSBzcmMuYSksICIKKyAgICAgICAgICAgICAgICAic3JjLmEgKiBkc3QuYSAtIDIuMCAqIChkc3QuYSAtIGRzdC5yZ2IpICogKHNyYy5hIC0gc3JjLnJnYikgKyBzcmMucmdiICogKDEuMCAtIGRzdC5hKSArIGRzdC5yZ2IgKiAoMS4wIC0gc3JjLmEpLCAiCisgICAgICAgICAgICAgICAgInN0ZXAoZHN0LmEsIDIuMCAqIGRzdC5yZ2IpKSwgIgorICAgICAgICAgICAgICAgICJzcmMuYSArIGRzdC5hIC0gc3JjLmEgKiBkc3QuYSksIDAuMCwgMS4wKTtcbiIsCisgICAgICAgIC8vIERhcmtlbgorICAgICAgICAicmV0dXJuIHZlYzQoc3JjLnJnYiAqICgxLjAgLSBkc3QuYSkgKyAoMS4wIC0gc3JjLmEpICogZHN0LnJnYiArICIKKyAgICAgICAgICAgICAgICAibWluKHNyYy5yZ2IgKiBkc3QuYSwgZHN0LnJnYiAqIHNyYy5hKSwgc3JjLmEgKyBkc3QuYSAtIHNyYy5hICogZHN0LmEpO1xuIiwKKyAgICAgICAgLy8gTGlnaHRlbgorICAgICAgICAicmV0dXJuIHZlYzQoc3JjLnJnYiAqICgxLjAgLSBkc3QuYSkgKyAoMS4wIC0gc3JjLmEpICogZHN0LnJnYiArICIKKyAgICAgICAgICAgICAgICAibWF4KHNyYy5yZ2IgKiBkc3QuYSwgZHN0LnJnYiAqIHNyYy5hKSwgc3JjLmEgKyBkc3QuYSAtIHNyYy5hICogZHN0LmEpO1xuIiwKK307CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENvbnN0cnVjdG9ycy9kZXN0cnVjdG9ycworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitQcm9ncmFtQ2FjaGU6OlByb2dyYW1DYWNoZSgpIHsKK30KKworUHJvZ3JhbUNhY2hlOjp+UHJvZ3JhbUNhY2hlKCkgeworICAgIGNsZWFyKCk7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENhY2hlIG1hbmFnZW1lbnQKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordm9pZCBQcm9ncmFtQ2FjaGU6OmNsZWFyKCkgeworICAgIHNpemVfdCBjb3VudCA9IG1DYWNoZS5zaXplKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgIGRlbGV0ZSBtQ2FjaGUudmFsdWVBdChpKTsKKyAgICB9CisgICAgbUNhY2hlLmNsZWFyKCk7Cit9CisKK1Byb2dyYW0qIFByb2dyYW1DYWNoZTo6Z2V0KGNvbnN0IFByb2dyYW1EZXNjcmlwdGlvbiYgZGVzY3JpcHRpb24pIHsKKyAgICBwcm9ncmFtaWQga2V5ID0gZGVzY3JpcHRpb24ua2V5KCk7CisgICAgc3NpemVfdCBpbmRleCA9IG1DYWNoZS5pbmRleE9mS2V5KGtleSk7CisgICAgUHJvZ3JhbSogcHJvZ3JhbSA9IE5VTEw7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICBQUk9HUkFNX0xPR0QoIkNvdWxkIG5vdCBmaW5kIHByb2dyYW0gd2l0aCBrZXkgMHgleCIsIGtleSk7CisgICAgICAgIHByb2dyYW0gPSBnZW5lcmF0ZVByb2dyYW0oZGVzY3JpcHRpb24sIGtleSk7CisgICAgICAgIG1DYWNoZS5hZGQoa2V5LCBwcm9ncmFtKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwcm9ncmFtID0gbUNhY2hlLnZhbHVlQXQoaW5kZXgpOworICAgIH0KKyAgICByZXR1cm4gcHJvZ3JhbTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gUHJvZ3JhbSBnZW5lcmF0aW9uCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK1Byb2dyYW0qIFByb2dyYW1DYWNoZTo6Z2VuZXJhdGVQcm9ncmFtKGNvbnN0IFByb2dyYW1EZXNjcmlwdGlvbiYgZGVzY3JpcHRpb24sIHByb2dyYW1pZCBrZXkpIHsKKyAgICBTdHJpbmc4IHZlcnRleFNoYWRlciA9IGdlbmVyYXRlVmVydGV4U2hhZGVyKGRlc2NyaXB0aW9uKTsKKyAgICBTdHJpbmc4IGZyYWdtZW50U2hhZGVyID0gZ2VuZXJhdGVGcmFnbWVudFNoYWRlcihkZXNjcmlwdGlvbik7CisKKyAgICBQcm9ncmFtKiBwcm9ncmFtID0gbmV3IFByb2dyYW0odmVydGV4U2hhZGVyLnN0cmluZygpLCBmcmFnbWVudFNoYWRlci5zdHJpbmcoKSk7CisgICAgcmV0dXJuIHByb2dyYW07Cit9CisKK1N0cmluZzggUHJvZ3JhbUNhY2hlOjpnZW5lcmF0ZVZlcnRleFNoYWRlcihjb25zdCBQcm9ncmFtRGVzY3JpcHRpb24mIGRlc2NyaXB0aW9uKSB7CisgICAgLy8gQWRkIGF0dHJpYnV0ZXMKKyAgICBTdHJpbmc4IHNoYWRlcihnVlNfSGVhZGVyX0F0dHJpYnV0ZXMpOworICAgIGlmIChkZXNjcmlwdGlvbi5oYXNUZXh0dXJlKSB7CisgICAgICAgIHNoYWRlci5hcHBlbmQoZ1ZTX0hlYWRlcl9BdHRyaWJ1dGVzX1RleENvb3Jkcyk7CisgICAgfQorICAgIC8vIFVuaWZvcm1zCisgICAgc2hhZGVyLmFwcGVuZChnVlNfSGVhZGVyX1VuaWZvcm1zKTsKKyAgICBpZiAoZGVzY3JpcHRpb24uaGFzR3JhZGllbnQpIHsKKyAgICAgICAgc2hhZGVyLmFwcGVuZChnVlNfSGVhZGVyX1VuaWZvcm1zX0hhc0dyYWRpZW50KTsKKyAgICB9CisgICAgaWYgKGRlc2NyaXB0aW9uLmhhc0JpdG1hcCkgeworICAgICAgICBzaGFkZXIuYXBwZW5kKGdWU19IZWFkZXJfVW5pZm9ybXNfSGFzQml0bWFwKTsKKyAgICB9CisgICAgLy8gVmFyeWluZ3MKKyAgICBpZiAoZGVzY3JpcHRpb24uaGFzVGV4dHVyZSkgeworICAgICAgICBzaGFkZXIuYXBwZW5kKGdWU19IZWFkZXJfVmFyeWluZ3NfSGFzVGV4dHVyZSk7CisgICAgfQorICAgIGlmIChkZXNjcmlwdGlvbi5oYXNHcmFkaWVudCkgeworICAgICAgICBzaGFkZXIuYXBwZW5kKGdWU19IZWFkZXJfVmFyeWluZ3NfSGFzR3JhZGllbnQpOworICAgIH0KKyAgICBpZiAoZGVzY3JpcHRpb24uaGFzQml0bWFwKSB7CisgICAgICAgIHNoYWRlci5hcHBlbmQoZ1ZTX0hlYWRlcl9WYXJ5aW5nc19IYXNCaXRtYXApOworICAgIH0KKworICAgIC8vIEJlZ2luIHRoZSBzaGFkZXIKKyAgICBzaGFkZXIuYXBwZW5kKGdWU19NYWluKTsgeworICAgICAgICBpZiAoZGVzY3JpcHRpb24uaGFzVGV4dHVyZSkgeworICAgICAgICAgICAgc2hhZGVyLmFwcGVuZChnVlNfTWFpbl9PdXRUZXhDb29yZHMpOworICAgICAgICB9CisgICAgICAgIGlmIChkZXNjcmlwdGlvbi5oYXNHcmFkaWVudCkgeworICAgICAgICAgICAgc2hhZGVyLmFwcGVuZChnVlNfTWFpbl9PdXRHcmFkaWVudEluZGV4KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZGVzY3JpcHRpb24uaGFzQml0bWFwKSB7CisgICAgICAgICAgICBzaGFkZXIuYXBwZW5kKGdWU19NYWluX091dEJpdG1hcFRleENvb3Jkcyk7CisgICAgICAgIH0KKyAgICAgICAgLy8gT3V0cHV0IHRyYW5zZm9ybWVkIHBvc2l0aW9uCisgICAgICAgIHNoYWRlci5hcHBlbmQoZ1ZTX01haW5fUG9zaXRpb24pOworICAgIH0KKyAgICAvLyBFbmQgdGhlIHNoYWRlcgorICAgIHNoYWRlci5hcHBlbmQoZ1ZTX0Zvb3Rlcik7CisKKyAgICBQUk9HUkFNX0xPR0QoIioqKiBHZW5lcmF0ZWQgdmVydGV4IHNoYWRlcjpcblxuJXMiLCBzaGFkZXIuc3RyaW5nKCkpOworCisgICAgcmV0dXJuIHNoYWRlcjsKK30KKworU3RyaW5nOCBQcm9ncmFtQ2FjaGU6OmdlbmVyYXRlRnJhZ21lbnRTaGFkZXIoY29uc3QgUHJvZ3JhbURlc2NyaXB0aW9uJiBkZXNjcmlwdGlvbikgeworICAgIC8vIFNldCB0aGUgZGVmYXVsdCBwcmVjaXNpb24KKyAgICBTdHJpbmc4IHNoYWRlcihnRlNfSGVhZGVyKTsKKworICAgIC8vIFZhcnlpbmdzCisgICAgaWYgKGRlc2NyaXB0aW9uLmhhc1RleHR1cmUpIHsKKyAgICAgICAgc2hhZGVyLmFwcGVuZChnVlNfSGVhZGVyX1ZhcnlpbmdzX0hhc1RleHR1cmUpOworICAgIH0KKyAgICBpZiAoZGVzY3JpcHRpb24uaGFzR3JhZGllbnQpIHsKKyAgICAgICAgc2hhZGVyLmFwcGVuZChnVlNfSGVhZGVyX1ZhcnlpbmdzX0hhc0dyYWRpZW50KTsKKyAgICB9CisgICAgaWYgKGRlc2NyaXB0aW9uLmhhc0JpdG1hcCkgeworICAgICAgICBzaGFkZXIuYXBwZW5kKGdWU19IZWFkZXJfVmFyeWluZ3NfSGFzQml0bWFwKTsKKyAgICB9CisKKworICAgIC8vIFVuaWZvcm1zCisgICAgc2hhZGVyLmFwcGVuZChnRlNfVW5pZm9ybXNfQ29sb3IpOworICAgIGlmIChkZXNjcmlwdGlvbi5oYXNUZXh0dXJlKSB7CisgICAgICAgIHNoYWRlci5hcHBlbmQoZ0ZTX1VuaWZvcm1zX1RleHR1cmVTYW1wbGVyKTsKKyAgICB9CisgICAgaWYgKGRlc2NyaXB0aW9uLmhhc0dyYWRpZW50KSB7CisgICAgICAgIHNoYWRlci5hcHBlbmQoZ0ZTX1VuaWZvcm1zX0dyYWRpZW50U2FtcGxlcik7CisgICAgfQorICAgIGlmIChkZXNjcmlwdGlvbi5oYXNCaXRtYXApIHsKKyAgICAgICAgc2hhZGVyLmFwcGVuZChnRlNfVW5pZm9ybXNfQml0bWFwU2FtcGxlcik7CisgICAgfQorICAgIHNoYWRlci5hcHBlbmQoZ0ZTX1VuaWZvcm1zX0NvbG9yT3BbZGVzY3JpcHRpb24uY29sb3JPcF0pOworCisgICAgLy8gR2VuZXJhdGUgcmVxdWlyZWQgZnVuY3Rpb25zCisgICAgaWYgKGRlc2NyaXB0aW9uLmhhc0dyYWRpZW50ICYmIGRlc2NyaXB0aW9uLmhhc0JpdG1hcCkgeworICAgICAgICBnZW5lcmF0ZUJsZW5kKHNoYWRlciwgImJsZW5kU2hhZGVycyIsIGRlc2NyaXB0aW9uLnNoYWRlcnNNb2RlKTsKKyAgICB9CisgICAgaWYgKGRlc2NyaXB0aW9uLmNvbG9yT3AgPT0gUHJvZ3JhbURlc2NyaXB0aW9uOjprQ29sb3JCbGVuZCkgeworICAgICAgICBnZW5lcmF0ZUJsZW5kKHNoYWRlciwgImJsZW5kQ29sb3JzIiwgZGVzY3JpcHRpb24uY29sb3JNb2RlKTsKKyAgICB9CisgICAgaWYgKGRlc2NyaXB0aW9uLmlzQml0bWFwTnBvdCkgeworICAgICAgICBnZW5lcmF0ZVRleHR1cmVXcmFwKHNoYWRlciwgZGVzY3JpcHRpb24uYml0bWFwV3JhcFMsIGRlc2NyaXB0aW9uLmJpdG1hcFdyYXBUKTsKKyAgICB9CisKKyAgICAvLyBCZWdpbiB0aGUgc2hhZGVyCisgICAgc2hhZGVyLmFwcGVuZChnRlNfTWFpbik7IHsKKyAgICAgICAgLy8gU3RvcmVzIHRoZSByZXN1bHQgaW4gZnJhZ0NvbG9yIGRpcmVjdGx5CisgICAgICAgIGlmIChkZXNjcmlwdGlvbi5oYXNUZXh0dXJlKSB7CisgICAgICAgICAgICBpZiAoZGVzY3JpcHRpb24uaGFzQWxwaGE4VGV4dHVyZSkgeworICAgICAgICAgICAgICAgIHNoYWRlci5hcHBlbmQoZ0ZTX01haW5fRmV0Y2hBOFRleHR1cmUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzaGFkZXIuYXBwZW5kKGdGU19NYWluX0ZldGNoVGV4dHVyZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzaGFkZXIuYXBwZW5kKGdGU19NYWluX0ZldGNoQ29sb3IpOworICAgICAgICB9CisgICAgICAgIGlmIChkZXNjcmlwdGlvbi5oYXNHcmFkaWVudCkgeworICAgICAgICAgICAgc2hhZGVyLmFwcGVuZChnRlNfTWFpbl9GZXRjaEdyYWRpZW50KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZGVzY3JpcHRpb24uaGFzQml0bWFwKSB7CisgICAgICAgICAgICBpZiAoIWRlc2NyaXB0aW9uLmlzQml0bWFwTnBvdCkgeworICAgICAgICAgICAgICAgIHNoYWRlci5hcHBlbmQoZ0ZTX01haW5fRmV0Y2hCaXRtYXApOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzaGFkZXIuYXBwZW5kKGdGU19NYWluX0ZldGNoQml0bWFwTnBvdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gQ2FzZSB3aGVuIHdlIGhhdmUgdHdvIHNoYWRlcnMgc2V0CisgICAgICAgIGlmIChkZXNjcmlwdGlvbi5oYXNHcmFkaWVudCAmJiBkZXNjcmlwdGlvbi5oYXNCaXRtYXApIHsKKyAgICAgICAgICAgIGlmIChkZXNjcmlwdGlvbi5pc0JpdG1hcEZpcnN0KSB7CisgICAgICAgICAgICAgICAgc2hhZGVyLmFwcGVuZChnRlNfTWFpbl9CbGVuZFNoYWRlcnNCRyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNoYWRlci5hcHBlbmQoZ0ZTX01haW5fQmxlbmRTaGFkZXJzR0IpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2hhZGVyLmFwcGVuZChnRlNfTWFpbl9CbGVuZFNoYWRlcnNfTW9kdWxhdGUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGRlc2NyaXB0aW9uLmhhc0dyYWRpZW50KSB7CisgICAgICAgICAgICAgICAgc2hhZGVyLmFwcGVuZChnRlNfTWFpbl9HcmFkaWVudFNoYWRlcl9Nb2R1bGF0ZSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGRlc2NyaXB0aW9uLmhhc0JpdG1hcCkgeworICAgICAgICAgICAgICAgIHNoYWRlci5hcHBlbmQoZ0ZTX01haW5fQml0bWFwU2hhZGVyX01vZHVsYXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBBcHBseSB0aGUgY29sb3Igb3AgaWYgbmVlZGVkCisgICAgICAgIHNoYWRlci5hcHBlbmQoZ0ZTX01haW5fQXBwbHlDb2xvck9wW2Rlc2NyaXB0aW9uLmNvbG9yT3BdKTsKKyAgICAgICAgLy8gT3V0cHV0IHRoZSBmcmFnbWVudAorICAgICAgICBzaGFkZXIuYXBwZW5kKGdGU19NYWluX0ZyYWdDb2xvcik7CisgICAgfQorICAgIC8vIEVuZCB0aGUgc2hhZGVyCisgICAgc2hhZGVyLmFwcGVuZChnRlNfRm9vdGVyKTsKKworICAgIGlmIChERUJVR19QUk9HUkFNX0NBQ0hFKSB7CisgICAgICAgIFBST0dSQU1fTE9HRCgiKioqIEdlbmVyYXRlZCBmcmFnbWVudCBzaGFkZXI6XG5cbiIpOworICAgICAgICBwcmludExvbmdTdHJpbmcoc2hhZGVyKTsKKyAgICB9CisKKyAgICByZXR1cm4gc2hhZGVyOworfQorCit2b2lkIFByb2dyYW1DYWNoZTo6Z2VuZXJhdGVCbGVuZChTdHJpbmc4JiBzaGFkZXIsIGNvbnN0IGNoYXIqIG5hbWUsIFNrWGZlcm1vZGU6Ok1vZGUgbW9kZSkgeworICAgIHNoYWRlci5hcHBlbmQoIlxudmVjNCAiKTsKKyAgICBzaGFkZXIuYXBwZW5kKG5hbWUpOworICAgIHNoYWRlci5hcHBlbmQoIih2ZWM0IHNyYywgdmVjNCBkc3QpIHtcbiIpOworICAgIHNoYWRlci5hcHBlbmQoIiAgICAiKTsKKyAgICBzaGFkZXIuYXBwZW5kKGdCbGVuZE9wc1ttb2RlXSk7CisgICAgc2hhZGVyLmFwcGVuZCgifVxuIik7Cit9CisKK3ZvaWQgUHJvZ3JhbUNhY2hlOjpnZW5lcmF0ZVRleHR1cmVXcmFwKFN0cmluZzgmIHNoYWRlciwgR0xlbnVtIHdyYXBTLCBHTGVudW0gd3JhcFQpIHsKKyAgICBzaGFkZXIuYXBwZW5kKCJcbnZlYzIgd3JhcCh2ZWMyIHRleENvb3Jkcykge1xuIik7CisgICAgaWYgKHdyYXBTID09IEdMX01JUlJPUkVEX1JFUEVBVCkgeworICAgICAgICBzaGFkZXIuYXBwZW5kKCIgICAgZmxvYXQgeE1vZDIgPSBtb2QodGV4Q29vcmRzLngsIDIuMCk7XG4iKTsKKyAgICAgICAgc2hhZGVyLmFwcGVuZCgiICAgIGlmICh4TW9kMiA+IDEuMCkgeE1vZDIgPSAyLjAgLSB4TW9kMjtcbiIpOworICAgIH0KKyAgICBpZiAod3JhcFQgPT0gR0xfTUlSUk9SRURfUkVQRUFUKSB7CisgICAgICAgIHNoYWRlci5hcHBlbmQoIiAgICBmbG9hdCB5TW9kMiA9IG1vZCh0ZXhDb29yZHMueSwgMi4wKTtcbiIpOworICAgICAgICBzaGFkZXIuYXBwZW5kKCIgICAgaWYgKHlNb2QyID4gMS4wKSB5TW9kMiA9IDIuMCAtIHlNb2QyO1xuIik7CisgICAgfQorICAgIHNoYWRlci5hcHBlbmQoIiAgICByZXR1cm4gdmVjMigiKTsKKyAgICBzd2l0Y2ggKHdyYXBTKSB7CisgICAgICAgIGNhc2UgR0xfQ0xBTVBfVE9fRURHRToKKyAgICAgICAgICAgIHNoYWRlci5hcHBlbmQoInRleENvb3Jkcy54Iik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHTF9SRVBFQVQ6CisgICAgICAgICAgICBzaGFkZXIuYXBwZW5kKCJtb2QodGV4Q29vcmRzLngsIDEuMCkiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdMX01JUlJPUkVEX1JFUEVBVDoKKyAgICAgICAgICAgIHNoYWRlci5hcHBlbmQoInhNb2QyIik7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgc2hhZGVyLmFwcGVuZCgiLCAiKTsKKyAgICBzd2l0Y2ggKHdyYXBUKSB7CisgICAgICAgIGNhc2UgR0xfQ0xBTVBfVE9fRURHRToKKyAgICAgICAgICAgIHNoYWRlci5hcHBlbmQoInRleENvb3Jkcy55Iik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHTF9SRVBFQVQ6CisgICAgICAgICAgICBzaGFkZXIuYXBwZW5kKCJtb2QodGV4Q29vcmRzLnksIDEuMCkiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdMX01JUlJPUkVEX1JFUEVBVDoKKyAgICAgICAgICAgIHNoYWRlci5hcHBlbmQoInlNb2QyIik7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgc2hhZGVyLmFwcGVuZCgiKTtcbiIpOworICAgIHNoYWRlci5hcHBlbmQoIn1cbiIpOworfQorCit2b2lkIFByb2dyYW1DYWNoZTo6cHJpbnRMb25nU3RyaW5nKGNvbnN0IFN0cmluZzgmIHNoYWRlcikgY29uc3QgeworICAgIHNzaXplX3QgaW5kZXggPSAwOworICAgIHNzaXplX3QgbGFzdEluZGV4ID0gMDsKKyAgICBjb25zdCBjaGFyKiBzdHIgPSBzaGFkZXIuc3RyaW5nKCk7CisgICAgd2hpbGUgKChpbmRleCA9IHNoYWRlci5maW5kKCJcbiIsIGluZGV4KSkgPiAtMSkgeworICAgICAgICBTdHJpbmc4IGxpbmUoc3RyLCBpbmRleCAtIGxhc3RJbmRleCk7CisgICAgICAgIGlmIChsaW5lLmxlbmd0aCgpID09IDApIGxpbmUuYXBwZW5kKCJcbiIpOworICAgICAgICBQUk9HUkFNX0xPR0QoIiVzIiwgbGluZS5zdHJpbmcoKSk7CisgICAgICAgIGluZGV4Kys7CisgICAgICAgIHN0ciArPSAoaW5kZXggLSBsYXN0SW5kZXgpOworICAgICAgICBsYXN0SW5kZXggPSBpbmRleDsKKyAgICB9Cit9CisKK307IC8vIG5hbWVzcGFjZSB1aXJlbmRlcmVyCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlicy9od3VpL1Byb2dyYW1DYWNoZS5oIGIvbGlicy9od3VpL1Byb2dyYW1DYWNoZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyMTFhYjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2h3dWkvUHJvZ3JhbUNhY2hlLmgKQEAgLTAsMCArMSwxOTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfVUlfUFJPR1JBTV9DQUNIRV9ICisjZGVmaW5lIEFORFJPSURfVUlfUFJPR1JBTV9DQUNIRV9ICisKKyNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKworI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgorCisjaW5jbHVkZSA8U2tYZmVybW9kZS5oPgorCisjaW5jbHVkZSAiUHJvZ3JhbS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgdWlyZW5kZXJlciB7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIERlZmluZXMKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLy8gRGVidWcKKyNkZWZpbmUgREVCVUdfUFJPR1JBTV9DQUNIRSAwCisKKy8vIERlYnVnCisjaWYgREVCVUdfUFJPR1JBTV9DQUNIRQorICAgICNkZWZpbmUgUFJPR1JBTV9MT0dEKC4uLikgTE9HRChfX1ZBX0FSR1NfXykKKyNlbHNlCisgICAgI2RlZmluZSBQUk9HUkFNX0xPR0QoLi4uKQorI2VuZGlmCisKKyNkZWZpbmUgUFJPR1JBTV9LRVlfVEVYVFVSRSAweDEKKyNkZWZpbmUgUFJPR1JBTV9LRVlfQThfVEVYVFVSRSAweDIKKyNkZWZpbmUgUFJPR1JBTV9LRVlfQklUTUFQIDB4NAorI2RlZmluZSBQUk9HUkFNX0tFWV9HUkFESUVOVCAweDgKKyNkZWZpbmUgUFJPR1JBTV9LRVlfQklUTUFQX0ZJUlNUIDB4MTAKKyNkZWZpbmUgUFJPR1JBTV9LRVlfQ09MT1JfTUFUUklYIDB4MjAKKyNkZWZpbmUgUFJPR1JBTV9LRVlfQ09MT1JfTElHSFRJTkcgMHg0MAorI2RlZmluZSBQUk9HUkFNX0tFWV9DT0xPUl9CTEVORCAweDgwCisjZGVmaW5lIFBST0dSQU1fS0VZX0JJVE1BUF9OUE9UIDB4MTAwCisKKyNkZWZpbmUgUFJPR1JBTV9LRVlfQklUTUFQX1dSQVBTX01BU0sgMHg2MDAKKyNkZWZpbmUgUFJPR1JBTV9LRVlfQklUTUFQX1dSQVBUX01BU0sgMHgxODAwCisKKy8vIEVuY29kZSB0aGUgeGZlcm1vZGVzIG9uIDYgYml0cworI2RlZmluZSBQUk9HUkFNX01BWF9YRkVSTU9ERSAweDFmCisjZGVmaW5lIFBST0dSQU1fWEZFUk1PREVfU0hBREVSX1NISUZUIDI2CisjZGVmaW5lIFBST0dSQU1fWEZFUk1PREVfQ09MT1JfT1BfU0hJRlQgMjAKKworI2RlZmluZSBQUk9HUkFNX0JJVE1BUF9XUkFQU19TSElGVCA5CisjZGVmaW5lIFBST0dSQU1fQklUTUFQX1dSQVBUX1NISUZUIDExCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFR5cGVzCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3R5cGVkZWYgdWludDMyX3QgcHJvZ3JhbWlkOworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDYWNoZQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvKioKKyAqIERlc2NyaWJlIHRoZSBmZWF0dXJlcyByZXF1aXJlZCBmb3IgYSBnaXZlbiBwcm9ncmFtLiBUaGUgZmVhdHVyZXMKKyAqIGRldGVybWluZSB0aGUgZ2VuZXJhdGlvbiBvZiBib3RoIHRoZSB2ZXJ0ZXggYW5kIGZyYWdtZW50IHNoYWRlcnMuCisgKiBBIFByb2dyYW1EZXNjcmlwdGlvbiBtdXN0IGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBhIFByb2dyYW1DYWNoZS4KKyAqLworc3RydWN0IFByb2dyYW1EZXNjcmlwdGlvbiB7CisgICAgZW51bSBDb2xvck1vZGlmaWVyIHsKKyAgICAgICAga0NvbG9yTm9uZSwKKyAgICAgICAga0NvbG9yTWF0cml4LAorICAgICAgICBrQ29sb3JMaWdodGluZywKKyAgICAgICAga0NvbG9yQmxlbmQKKyAgICB9OworCisgICAgUHJvZ3JhbURlc2NyaXB0aW9uKCk6CisgICAgICAgIGhhc1RleHR1cmUoZmFsc2UpLCBoYXNBbHBoYThUZXh0dXJlKGZhbHNlKSwKKyAgICAgICAgaGFzQml0bWFwKGZhbHNlKSwgaXNCaXRtYXBOcG90KGZhbHNlKSwgaGFzR3JhZGllbnQoZmFsc2UpLAorICAgICAgICBzaGFkZXJzTW9kZShTa1hmZXJtb2RlOjprQ2xlYXJfTW9kZSksIGlzQml0bWFwRmlyc3QoZmFsc2UpLAorICAgICAgICBiaXRtYXBXcmFwUyhHTF9DTEFNUF9UT19FREdFKSwgYml0bWFwV3JhcFQoR0xfQ0xBTVBfVE9fRURHRSksCisgICAgICAgIGNvbG9yT3Aoa0NvbG9yTm9uZSksIGNvbG9yTW9kZShTa1hmZXJtb2RlOjprQ2xlYXJfTW9kZSkgeworICAgIH0KKworICAgIC8vIFRleHR1cmluZworICAgIGJvb2wgaGFzVGV4dHVyZTsKKyAgICBib29sIGhhc0FscGhhOFRleHR1cmU7CisKKyAgICAvLyBTaGFkZXJzCisgICAgYm9vbCBoYXNCaXRtYXA7CisgICAgYm9vbCBpc0JpdG1hcE5wb3Q7CisgICAgYm9vbCBoYXNHcmFkaWVudDsKKyAgICBTa1hmZXJtb2RlOjpNb2RlIHNoYWRlcnNNb2RlOworICAgIGJvb2wgaXNCaXRtYXBGaXJzdDsKKyAgICBHTGVudW0gYml0bWFwV3JhcFM7CisgICAgR0xlbnVtIGJpdG1hcFdyYXBUOworCisgICAgLy8gQ29sb3Igb3BlcmF0aW9ucworICAgIGludCBjb2xvck9wOworICAgIFNrWGZlcm1vZGU6Ok1vZGUgY29sb3JNb2RlOworCisgICAgaW5saW5lIHVpbnQzMl90IGdldEVudW1Gb3JXcmFwKEdMZW51bSB3cmFwKSBjb25zdCB7CisgICAgICAgIHN3aXRjaCAod3JhcCkgeworICAgICAgICAgICAgY2FzZSBHTF9DTEFNUF9UT19FREdFOgorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgY2FzZSBHTF9SRVBFQVQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICBjYXNlIEdMX01JUlJPUkVEX1JFUEVBVDoKKyAgICAgICAgICAgICAgICByZXR1cm4gMjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwcm9ncmFtaWQga2V5KCkgY29uc3QgeworICAgICAgICBwcm9ncmFtaWQga2V5ID0gMDsKKyAgICAgICAgaWYgKGhhc1RleHR1cmUpIGtleSB8PSBQUk9HUkFNX0tFWV9URVhUVVJFOworICAgICAgICBpZiAoaGFzQWxwaGE4VGV4dHVyZSkga2V5IHw9IFBST0dSQU1fS0VZX0E4X1RFWFRVUkU7CisgICAgICAgIGlmIChoYXNCaXRtYXApIHsKKyAgICAgICAgICAgIGtleSB8PSBQUk9HUkFNX0tFWV9CSVRNQVA7CisgICAgICAgICAgICBpZiAoaXNCaXRtYXBOcG90KSB7CisgICAgICAgICAgICAgICAga2V5IHw9IFBST0dSQU1fS0VZX0JJVE1BUF9OUE9UOworICAgICAgICAgICAgICAgIGtleSB8PSBnZXRFbnVtRm9yV3JhcChiaXRtYXBXcmFwUykgPDwgUFJPR1JBTV9CSVRNQVBfV1JBUFNfU0hJRlQ7CisgICAgICAgICAgICAgICAga2V5IHw9IGdldEVudW1Gb3JXcmFwKGJpdG1hcFdyYXBUKSA8PCBQUk9HUkFNX0JJVE1BUF9XUkFQVF9TSElGVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoaGFzR3JhZGllbnQpIGtleSB8PSBQUk9HUkFNX0tFWV9HUkFESUVOVDsKKyAgICAgICAgaWYgKGlzQml0bWFwRmlyc3QpIGtleSAgfD0gUFJPR1JBTV9LRVlfQklUTUFQX0ZJUlNUOworICAgICAgICBpZiAoaGFzQml0bWFwICYmIGhhc0dyYWRpZW50KSB7CisgICAgICAgICAgICBrZXkgfD0gKHNoYWRlcnNNb2RlICYgUFJPR1JBTV9NQVhfWEZFUk1PREUpIDw8IFBST0dSQU1fWEZFUk1PREVfU0hBREVSX1NISUZUOworICAgICAgICB9CisgICAgICAgIHN3aXRjaCAoY29sb3JPcCkgeworICAgICAgICAgICAgY2FzZSBrQ29sb3JNYXRyaXg6CisgICAgICAgICAgICAgICAga2V5IHw9IFBST0dSQU1fS0VZX0NPTE9SX01BVFJJWDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2Uga0NvbG9yTGlnaHRpbmc6CisgICAgICAgICAgICAgICAga2V5IHw9IFBST0dSQU1fS0VZX0NPTE9SX0xJR0hUSU5HOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBrQ29sb3JCbGVuZDoKKyAgICAgICAgICAgICAgICBrZXkgfD0gUFJPR1JBTV9LRVlfQ09MT1JfQkxFTkQ7CisgICAgICAgICAgICAgICAga2V5IHw9IChjb2xvck1vZGUgJiBQUk9HUkFNX01BWF9YRkVSTU9ERSkgPDwgUFJPR1JBTV9YRkVSTU9ERV9DT0xPUl9PUF9TSElGVDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2Uga0NvbG9yTm9uZToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4ga2V5OworICAgIH0KK307IC8vIHN0cnVjdCBQcm9ncmFtRGVzY3JpcHRpb24KKworLyoqCisgKiBHZW5lcmF0ZXMgYW5kIGNhY2hlcyBwcm9ncmFtLiBQcm9ncmFtcyBhcmUgZ2VuZXJhdGVkIGJhc2VkIG9uCisgKiBQcm9ncmFtRGVzY3JpcHRpb25zLgorICovCitjbGFzcyBQcm9ncmFtQ2FjaGUgeworcHVibGljOgorICAgIFByb2dyYW1DYWNoZSgpOworICAgIH5Qcm9ncmFtQ2FjaGUoKTsKKworICAgIFByb2dyYW0qIGdldChjb25zdCBQcm9ncmFtRGVzY3JpcHRpb24mIGRlc2NyaXB0aW9uKTsKKworICAgIHZvaWQgY2xlYXIoKTsKKworcHJpdmF0ZToKKyAgICBQcm9ncmFtKiBnZW5lcmF0ZVByb2dyYW0oY29uc3QgUHJvZ3JhbURlc2NyaXB0aW9uJiBkZXNjcmlwdGlvbiwgcHJvZ3JhbWlkIGtleSk7CisgICAgU3RyaW5nOCBnZW5lcmF0ZVZlcnRleFNoYWRlcihjb25zdCBQcm9ncmFtRGVzY3JpcHRpb24mIGRlc2NyaXB0aW9uKTsKKyAgICBTdHJpbmc4IGdlbmVyYXRlRnJhZ21lbnRTaGFkZXIoY29uc3QgUHJvZ3JhbURlc2NyaXB0aW9uJiBkZXNjcmlwdGlvbik7CisgICAgdm9pZCBnZW5lcmF0ZUJsZW5kKFN0cmluZzgmIHNoYWRlciwgY29uc3QgY2hhciogbmFtZSwgU2tYZmVybW9kZTo6TW9kZSBtb2RlKTsKKyAgICB2b2lkIGdlbmVyYXRlVGV4dHVyZVdyYXAoU3RyaW5nOCYgc2hhZGVyLCBHTGVudW0gd3JhcFMsIEdMZW51bSB3cmFwVCk7CisKKyAgICB2b2lkIHByaW50TG9uZ1N0cmluZyhjb25zdCBTdHJpbmc4JiBzaGFkZXIpIGNvbnN0OworCisgICAgS2V5ZWRWZWN0b3I8cHJvZ3JhbWlkLCBQcm9ncmFtKj4gbUNhY2hlOworfTsgLy8gY2xhc3MgUHJvZ3JhbUNhY2hlCisKK307IC8vIG5hbWVzcGFjZSB1aXJlbmRlcmVyCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9VSV9QUk9HUkFNX0NBQ0hFX0gKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9Qcm9wZXJ0aWVzLmggYi9saWJzL2h3dWkvUHJvcGVydGllcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmZTAyMmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2h3dWkvUHJvcGVydGllcy5oCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfVUlfUFJPUEVSVElFU19ICisjZGVmaW5lIEFORFJPSURfVUlfUFJPUEVSVElFU19ICisKKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorCisvKioKKyAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgbGlzdCBvZiBzeXN0ZW0gcHJvcGVydGllcyB1c2VkIHRvIGNvbmZpZ3VyZQorICogdGhlIE9wZW5HTFJlbmRlcmVyLgorICovCisKKy8vIFRoZXNlIHByb3BlcnRpZXMgYXJlIGRlZmluZWQgaW4gbWVnYS1ieXRlcworI2RlZmluZSBQUk9QRVJUWV9URVhUVVJFX0NBQ0hFX1NJWkUgInJvLmh3dWkudGV4dHVyZV9jYWNoZV9zaXplIgorI2RlZmluZSBQUk9QRVJUWV9MQVlFUl9DQUNIRV9TSVpFICJyby5od3VpLmxheWVyX2NhY2hlX3NpemUiCisjZGVmaW5lIFBST1BFUlRZX0dSQURJRU5UX0NBQ0hFX1NJWkUgInJvLmh3dWkuZ3JhZGllbnRfY2FjaGVfc2l6ZSIKKyNkZWZpbmUgUFJPUEVSVFlfUEFUSF9DQUNIRV9TSVpFICJyby5od3VpLnBhdGhfY2FjaGVfc2l6ZSIKKyNkZWZpbmUgUFJPUEVSVFlfRFJPUF9TSEFET1dfQ0FDSEVfU0laRSAicm8uaHd1aS5kcm9wX3NoYWRvd19jYWNoZV9zaXplIgorCisvLyBUaGVzZSBwcm9wZXJ0aWVzIGFyZSBkZWZpbmVkIGluIHBpeGVscworI2RlZmluZSBQUk9QRVJUWV9URVhUX0NBQ0hFX1dJRFRIICJyby5od3VpLnRleHRfY2FjaGVfd2lkdGgiCisjZGVmaW5lIFBST1BFUlRZX1RFWFRfQ0FDSEVfSEVJR0hUICJyby5od3VpLnRleHRfY2FjaGVfaGVpZ2h0IgorCisvLyBDb252ZXJ0cyBhIG51bWJlciBvZiBtZWdhLWJ5dGVzIGludG8gYnl0ZXMKKyNkZWZpbmUgTUIocykgcyAqIDEwMjQgKiAxMDI0CisKKyNkZWZpbmUgREVGQVVMVF9URVhUVVJFX0NBQ0hFX1NJWkUgMjAuMGYKKyNkZWZpbmUgREVGQVVMVF9MQVlFUl9DQUNIRV9TSVpFIDYuMGYKKyNkZWZpbmUgREVGQVVMVF9QQVRIX0NBQ0hFX1NJWkUgNi4wZgorI2RlZmluZSBERUZBVUxUX1BBVENIX0NBQ0hFX1NJWkUgMTAwCisjZGVmaW5lIERFRkFVTFRfR1JBRElFTlRfQ0FDSEVfU0laRSAwLjVmCisjZGVmaW5lIERFRkFVTFRfRFJPUF9TSEFET1dfQ0FDSEVfU0laRSAyLjBmCisKKyNlbmRpZiAvLyBBTkRST0lEX1VJX1BST1BFUlRJRVNfSApkaWZmIC0tZ2l0IGEvbGlicy9od3VpL1JlY3QuaCBiL2xpYnMvaHd1aS9SZWN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2JlMGMzNDAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2h3dWkvUmVjdC5oCkBAIC0wLDAgKzEsMTYwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1VJX1JFQ1RfSAorI2RlZmluZSBBTkRST0lEX1VJX1JFQ1RfSAorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSB1aXJlbmRlcmVyIHsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gU3RydWN0cworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitzdHJ1Y3QgUmVjdCB7CisgICAgZmxvYXQgbGVmdDsKKyAgICBmbG9hdCB0b3A7CisgICAgZmxvYXQgcmlnaHQ7CisgICAgZmxvYXQgYm90dG9tOworCisgICAgUmVjdCgpOgorICAgICAgICAgICAgbGVmdCgwKSwKKyAgICAgICAgICAgIHRvcCgwKSwKKyAgICAgICAgICAgIHJpZ2h0KDApLAorICAgICAgICAgICAgYm90dG9tKDApIHsKKyAgICB9CisKKyAgICBSZWN0KGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSk6CisgICAgICAgICAgICBsZWZ0KGxlZnQpLAorICAgICAgICAgICAgdG9wKHRvcCksCisgICAgICAgICAgICByaWdodChyaWdodCksCisgICAgICAgICAgICBib3R0b20oYm90dG9tKSB7CisgICAgfQorCisgICAgUmVjdChjb25zdCBSZWN0JiByKSB7CisgICAgICAgIHNldChyKTsKKyAgICB9CisKKyAgICBSZWN0KFJlY3QmIHIpIHsKKyAgICAgICAgc2V0KHIpOworICAgIH0KKworICAgIFJlY3QmIG9wZXJhdG9yPShjb25zdCBSZWN0JiByKSB7CisgICAgICAgIHNldChyKTsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFJlY3QmIG9wZXJhdG9yPShSZWN0JiByKSB7CisgICAgICAgIHNldChyKTsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIGZyaWVuZCBpbnQgb3BlcmF0b3I9PShjb25zdCBSZWN0JiBhLCBjb25zdCBSZWN0JiBiKSB7CisgICAgICAgIHJldHVybiAhbWVtY21wKCZhLCAmYiwgc2l6ZW9mKGEpKTsKKyAgICB9CisKKyAgICBmcmllbmQgaW50IG9wZXJhdG9yIT0oY29uc3QgUmVjdCYgYSwgY29uc3QgUmVjdCYgYikgeworICAgICAgICByZXR1cm4gbWVtY21wKCZhLCAmYiwgc2l6ZW9mKGEpKTsKKyAgICB9CisKKyAgICBib29sIGlzRW1wdHkoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBsZWZ0ID49IHJpZ2h0IHx8IHRvcCA+PSBib3R0b207CisgICAgfQorCisgICAgdm9pZCBzZXRFbXB0eSgpIHsKKyAgICAgICAgbWVtc2V0KHRoaXMsIDAsIHNpemVvZigqdGhpcykpOworICAgIH0KKworICAgIHZvaWQgc2V0KGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSkgeworICAgICAgICB0aGlzLT5sZWZ0ID0gbGVmdDsKKyAgICAgICAgdGhpcy0+cmlnaHQgPSByaWdodDsKKyAgICAgICAgdGhpcy0+dG9wID0gdG9wOworICAgICAgICB0aGlzLT5ib3R0b20gPSBib3R0b207CisgICAgfQorCisgICAgdm9pZCBzZXQoY29uc3QgUmVjdCYgcikgeworICAgICAgICBzZXQoci5sZWZ0LCByLnRvcCwgci5yaWdodCwgci5ib3R0b20pOworICAgIH0KKworICAgIGZsb2F0IGdldFdpZHRoKCkgY29uc3QgeworICAgICAgICByZXR1cm4gcmlnaHQgLSBsZWZ0OworICAgIH0KKworICAgIGZsb2F0IGdldEhlaWdodCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIGJvdHRvbSAtIHRvcDsKKyAgICB9CisKKyAgICBib29sIGludGVyc2VjdHMoZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tKSBjb25zdCB7CisgICAgICAgIHJldHVybiBsZWZ0IDwgcmlnaHQgJiYgdG9wIDwgYm90dG9tICYmCisgICAgICAgICAgICAgICAgdGhpcy0+bGVmdCA8IHRoaXMtPnJpZ2h0ICYmIHRoaXMtPnRvcCA8IHRoaXMtPmJvdHRvbSAmJgorICAgICAgICAgICAgICAgIHRoaXMtPmxlZnQgPCByaWdodCAmJiBsZWZ0IDwgdGhpcy0+cmlnaHQgJiYKKyAgICAgICAgICAgICAgICB0aGlzLT50b3AgPCBib3R0b20gJiYgdG9wIDwgdGhpcy0+Ym90dG9tOworICAgIH0KKworICAgIGJvb2wgaW50ZXJzZWN0cyhjb25zdCBSZWN0JiByKSBjb25zdCB7CisgICAgICAgIHJldHVybiBpbnRlcnNlY3RzKHIubGVmdCwgci50b3AsIHIucmlnaHQsIHIuYm90dG9tKTsKKyAgICB9CisKKyAgICBib29sIGludGVyc2VjdChmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20pIHsKKyAgICAgICAgaWYgKGxlZnQgPCByaWdodCAmJiB0b3AgPCBib3R0b20gJiYgIXRoaXMtPmlzRW1wdHkoKSAmJgorICAgICAgICAgICAgICAgIHRoaXMtPmxlZnQgPCByaWdodCAmJiBsZWZ0IDwgdGhpcy0+cmlnaHQgJiYKKyAgICAgICAgICAgICAgICB0aGlzLT50b3AgPCBib3R0b20gJiYgdG9wIDwgdGhpcy0+Ym90dG9tKSB7CisKKyAgICAgICAgICAgIGlmICh0aGlzLT5sZWZ0IDwgbGVmdCkgdGhpcy0+bGVmdCA9IGxlZnQ7CisgICAgICAgICAgICBpZiAodGhpcy0+dG9wIDwgdG9wKSB0aGlzLT50b3AgPSB0b3A7CisgICAgICAgICAgICBpZiAodGhpcy0+cmlnaHQgPiByaWdodCkgdGhpcy0+cmlnaHQgPSByaWdodDsKKyAgICAgICAgICAgIGlmICh0aGlzLT5ib3R0b20gPiBib3R0b20pIHRoaXMtPmJvdHRvbSA9IGJvdHRvbTsKKworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGJvb2wgaW50ZXJzZWN0KGNvbnN0IFJlY3QmIHIpIHsKKyAgICAgICAgcmV0dXJuIGludGVyc2VjdChyLmxlZnQsIHIudG9wLCByLnJpZ2h0LCByLmJvdHRvbSk7CisgICAgfQorCisgICAgYm9vbCB1bmlvbldpdGgoY29uc3QgUmVjdCYgcikgeworICAgICAgICBpZiAoci5sZWZ0IDwgci5yaWdodCAmJiByLnRvcCA8IHIuYm90dG9tKSB7CisgICAgICAgICAgICBpZiAobGVmdCA8IHJpZ2h0ICYmIHRvcCA8IGJvdHRvbSkgeworICAgICAgICAgICAgICAgIGlmIChsZWZ0ID4gci5sZWZ0KSBsZWZ0ID0gci5sZWZ0OworICAgICAgICAgICAgICAgIGlmICh0b3AgPiByLnRvcCkgdG9wID0gci50b3A7CisgICAgICAgICAgICAgICAgaWYgKHJpZ2h0IDwgci5yaWdodCkgcmlnaHQgPSByLnJpZ2h0OworICAgICAgICAgICAgICAgIGlmIChib3R0b20gPCByLmJvdHRvbSkgYm90dG9tID0gci5ib3R0b207CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGxlZnQgPSByLmxlZnQ7CisgICAgICAgICAgICAgICAgdG9wID0gci50b3A7CisgICAgICAgICAgICAgICAgcmlnaHQgPSByLnJpZ2h0OworICAgICAgICAgICAgICAgIGJvdHRvbSA9IHIuYm90dG9tOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB2b2lkIGR1bXAoKSBjb25zdCB7CisgICAgICAgIExPR0QoIlJlY3RbbD0lZiB0PSVmIHI9JWYgYj0lZl0iLCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20pOworICAgIH0KKworfTsgLy8gc3RydWN0IFJlY3QKKworfTsgLy8gbmFtZXNwYWNlIHVpcmVuZGVyZXIKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX1JFQ1RfSApkaWZmIC0tZ2l0IGEvbGlicy9od3VpL1NraWFDb2xvckZpbHRlci5jcHAgYi9saWJzL2h3dWkvU2tpYUNvbG9yRmlsdGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTU3YWU3Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL1NraWFDb2xvckZpbHRlci5jcHAKQEAgLTAsMCArMSwxMDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiU2tpYUNvbG9yRmlsdGVyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSB1aXJlbmRlcmVyIHsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQmFzZSBjb2xvciBmaWx0ZXIKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworU2tpYUNvbG9yRmlsdGVyOjpTa2lhQ29sb3JGaWx0ZXIoVHlwZSB0eXBlLCBib29sIGJsZW5kKTogbVR5cGUodHlwZSksIG1CbGVuZChibGVuZCkgeworfQorCitTa2lhQ29sb3JGaWx0ZXI6On5Ta2lhQ29sb3JGaWx0ZXIoKSB7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENvbG9yIG1hdHJpeCBmaWx0ZXIKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworU2tpYUNvbG9yTWF0cml4RmlsdGVyOjpTa2lhQ29sb3JNYXRyaXhGaWx0ZXIoZmxvYXQqIG1hdHJpeCwgZmxvYXQqIHZlY3Rvcik6CisgICAgICAgIFNraWFDb2xvckZpbHRlcihrQ29sb3JNYXRyaXgsIHRydWUpLCBtTWF0cml4KG1hdHJpeCksIG1WZWN0b3IodmVjdG9yKSB7Cit9CisKK1NraWFDb2xvck1hdHJpeEZpbHRlcjo6flNraWFDb2xvck1hdHJpeEZpbHRlcigpIHsKKyAgICBkZWxldGVbXSBtTWF0cml4OworICAgIGRlbGV0ZVtdIG1WZWN0b3I7Cit9CisKK3ZvaWQgU2tpYUNvbG9yTWF0cml4RmlsdGVyOjpkZXNjcmliZShQcm9ncmFtRGVzY3JpcHRpb24mIGRlc2NyaXB0aW9uLAorICAgICAgICBjb25zdCBFeHRlbnNpb25zJiBleHRlbnNpb25zKSB7CisgICAgZGVzY3JpcHRpb24uY29sb3JPcCA9IFByb2dyYW1EZXNjcmlwdGlvbjo6a0NvbG9yTWF0cml4OworfQorCit2b2lkIFNraWFDb2xvck1hdHJpeEZpbHRlcjo6c2V0dXBQcm9ncmFtKFByb2dyYW0qIHByb2dyYW0pIHsKKyAgICBnbFVuaWZvcm1NYXRyaXg0ZnYocHJvZ3JhbS0+Z2V0VW5pZm9ybSgiY29sb3JNYXRyaXgiKSwgMSwgR0xfRkFMU0UsICZtTWF0cml4WzBdKTsKKyAgICBnbFVuaWZvcm00ZnYocHJvZ3JhbS0+Z2V0VW5pZm9ybSgiY29sb3JNYXRyaXhWZWN0b3IiKSwgMSwgbVZlY3Rvcik7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIExpZ2h0aW5nIGNvbG9yIGZpbHRlcgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitTa2lhTGlnaHRpbmdGaWx0ZXI6OlNraWFMaWdodGluZ0ZpbHRlcihpbnQgbXVsdGlwbHksIGludCBhZGQpOgorICAgICAgICBTa2lhQ29sb3JGaWx0ZXIoa0xpZ2h0aW5nLCB0cnVlKSB7CisgICAgbU11bFIgPSAoKG11bHRpcGx5ID4+IDE2KSAmIDB4RkYpIC8gMjU1LjBmOworICAgIG1NdWxHID0gKChtdWx0aXBseSA+PiAgOCkgJiAweEZGKSAvIDI1NS4wZjsKKyAgICBtTXVsQiA9ICgobXVsdGlwbHkgICAgICApICYgMHhGRikgLyAyNTUuMGY7CisKKyAgICBtQWRkUiA9ICgoYWRkID4+IDE2KSAmIDB4RkYpIC8gMjU1LjBmOworICAgIG1BZGRHID0gKChhZGQgPj4gIDgpICYgMHhGRikgLyAyNTUuMGY7CisgICAgbUFkZEIgPSAoKGFkZCAgICAgICkgJiAweEZGKSAvIDI1NS4wZjsKK30KKwordm9pZCBTa2lhTGlnaHRpbmdGaWx0ZXI6OmRlc2NyaWJlKFByb2dyYW1EZXNjcmlwdGlvbiYgZGVzY3JpcHRpb24sIGNvbnN0IEV4dGVuc2lvbnMmIGV4dGVuc2lvbnMpIHsKKyAgICBkZXNjcmlwdGlvbi5jb2xvck9wID0gUHJvZ3JhbURlc2NyaXB0aW9uOjprQ29sb3JMaWdodGluZzsKK30KKwordm9pZCBTa2lhTGlnaHRpbmdGaWx0ZXI6OnNldHVwUHJvZ3JhbShQcm9ncmFtKiBwcm9ncmFtKSB7CisgICAgZ2xVbmlmb3JtNGYocHJvZ3JhbS0+Z2V0VW5pZm9ybSgibGlnaHRpbmdNdWwiKSwgbU11bFIsIG1NdWxHLCBtTXVsQiwgMS4wZik7CisgICAgZ2xVbmlmb3JtNGYocHJvZ3JhbS0+Z2V0VW5pZm9ybSgibGlnaHRpbmdBZGQiKSwgbUFkZFIsIG1BZGRHLCBtQWRkQiwgMC4wZik7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEJsZW5kIGNvbG9yIGZpbHRlcgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitTa2lhQmxlbmRGaWx0ZXI6OlNraWFCbGVuZEZpbHRlcihpbnQgY29sb3IsIFNrWGZlcm1vZGU6Ok1vZGUgbW9kZSk6CisgICAgICAgIFNraWFDb2xvckZpbHRlcihrQmxlbmQsIHRydWUpLCBtTW9kZShtb2RlKSB7CisgICAgY29uc3QgaW50IGFscGhhID0gKGNvbG9yID4+IDI0KSAmIDB4RkY7CisgICAgbUEgPSBhbHBoYSAvIDI1NS4wZjsKKyAgICBtUiA9IG1BICogKChjb2xvciA+PiAxNikgJiAweEZGKSAvIDI1NS4wZjsKKyAgICBtRyA9IG1BICogKChjb2xvciA+PiAgOCkgJiAweEZGKSAvIDI1NS4wZjsKKyAgICBtQiA9IG1BICogKChjb2xvciAgICAgICkgJiAweEZGKSAvIDI1NS4wZjsKK30KKwordm9pZCBTa2lhQmxlbmRGaWx0ZXI6OmRlc2NyaWJlKFByb2dyYW1EZXNjcmlwdGlvbiYgZGVzY3JpcHRpb24sIGNvbnN0IEV4dGVuc2lvbnMmIGV4dGVuc2lvbnMpIHsKKyAgICBkZXNjcmlwdGlvbi5jb2xvck9wID0gUHJvZ3JhbURlc2NyaXB0aW9uOjprQ29sb3JCbGVuZDsKKyAgICBkZXNjcmlwdGlvbi5jb2xvck1vZGUgPSBtTW9kZTsKK30KKwordm9pZCBTa2lhQmxlbmRGaWx0ZXI6OnNldHVwUHJvZ3JhbShQcm9ncmFtKiBwcm9ncmFtKSB7CisgICAgZ2xVbmlmb3JtNGYocHJvZ3JhbS0+Z2V0VW5pZm9ybSgiY29sb3JCbGVuZCIpLCBtUiwgbUcsIG1CLCBtQSk7Cit9CisKK307IC8vIG5hbWVzcGFjZSB1aXJlbmRlcmVyCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlicy9od3VpL1NraWFDb2xvckZpbHRlci5oIGIvbGlicy9od3VpL1NraWFDb2xvckZpbHRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2NWI2ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2h3dWkvU2tpYUNvbG9yRmlsdGVyLmgKQEAgLTAsMCArMSwxMTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfVUlfU0tJQV9DT0xPUl9GSUxURVJfSAorI2RlZmluZSBBTkRST0lEX1VJX1NLSUFfQ09MT1JfRklMVEVSX0gKKworI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgorCisjaW5jbHVkZSAiUHJvZ3JhbUNhY2hlLmgiCisjaW5jbHVkZSAiRXh0ZW5zaW9ucy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgdWlyZW5kZXJlciB7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEJhc2UgY29sb3IgZmlsdGVyCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8qKgorICogUmVwcmVzZW50cyBhIFNraWEgY29sb3IgZmlsdGVyLiBBIGNvbG9yIGZpbHRlciBtb2RpZmllcyBhIFByb2dyYW1EZXNjcmlwdGlvbgorICogYW5kIHNldHMgdW5pZm9ybXMgb24gdGhlIHJlc3VsdGluZyBzaGFkZXJzLgorICovCitzdHJ1Y3QgU2tpYUNvbG9yRmlsdGVyIHsKKyAgICAvKioKKyAgICAgKiBUeXBlIG9mIFNraWEgY29sb3IgZmlsdGVyIGluIHVzZS4KKyAgICAgKi8KKyAgICBlbnVtIFR5cGUgeworICAgICAgICBrTm9uZSwKKyAgICAgICAga0NvbG9yTWF0cml4LAorICAgICAgICBrTGlnaHRpbmcsCisgICAgICAgIGtCbGVuZCwKKyAgICB9OworCisgICAgU2tpYUNvbG9yRmlsdGVyKFR5cGUgdHlwZSwgYm9vbCBibGVuZCk7CisgICAgdmlydHVhbCB+U2tpYUNvbG9yRmlsdGVyKCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgZGVzY3JpYmUoUHJvZ3JhbURlc2NyaXB0aW9uJiBkZXNjcmlwdGlvbiwgY29uc3QgRXh0ZW5zaW9ucyYgZXh0ZW5zaW9ucykgPSAwOworICAgIHZpcnR1YWwgdm9pZCBzZXR1cFByb2dyYW0oUHJvZ3JhbSogcHJvZ3JhbSkgPSAwOworCisgICAgaW5saW5lIGJvb2wgYmxlbmQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtQmxlbmQ7CisgICAgfQorCisgICAgVHlwZSB0eXBlKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVR5cGU7CisgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgVHlwZSBtVHlwZTsKKyAgICBib29sIG1CbGVuZDsKK307IC8vIHN0cnVjdCBTa2lhQ29sb3JGaWx0ZXIKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gSW1wbGVtZW50YXRpb25zCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8qKgorICogQSBjb2xvciBmaWx0ZXIgdGhhdCBtdWx0aXBsaWVzIHRoZSBzb3VyY2UgY29sb3Igd2l0aCBhIG1hdHJpeCBhbmQgYWRkcyBhIHZlY3Rvci4KKyAqLworc3RydWN0IFNraWFDb2xvck1hdHJpeEZpbHRlcjogcHVibGljIFNraWFDb2xvckZpbHRlciB7CisgICAgU2tpYUNvbG9yTWF0cml4RmlsdGVyKGZsb2F0KiBtYXRyaXgsIGZsb2F0KiB2ZWN0b3IpOworICAgIH5Ta2lhQ29sb3JNYXRyaXhGaWx0ZXIoKTsKKworICAgIHZvaWQgZGVzY3JpYmUoUHJvZ3JhbURlc2NyaXB0aW9uJiBkZXNjcmlwdGlvbiwgY29uc3QgRXh0ZW5zaW9ucyYgZXh0ZW5zaW9ucyk7CisgICAgdm9pZCBzZXR1cFByb2dyYW0oUHJvZ3JhbSogcHJvZ3JhbSk7CisKK3ByaXZhdGU6CisgICAgZmxvYXQqIG1NYXRyaXg7CisgICAgZmxvYXQqIG1WZWN0b3I7Cit9OyAvLyBzdHJ1Y3QgU2tpYUNvbG9yTWF0cml4RmlsdGVyCisKKy8qKgorICogQSBjb2xvciBmaWx0ZXJzIHRoYXQgbXVsdGlwbGllcyB0aGUgc291cmNlIGNvbG9yIHdpdGggYSBmaXhlZCB2YWx1ZSBhbmQgYWRkcworICogYW5vdGhlciBmaXhlZCB2YWx1ZS4gSWdub3JlcyB0aGUgYWxwaGEgY2hhbm5lbCBvZiBib3RoIGFyZ3VtZW50cy4KKyAqLworc3RydWN0IFNraWFMaWdodGluZ0ZpbHRlcjogcHVibGljIFNraWFDb2xvckZpbHRlciB7CisgICAgU2tpYUxpZ2h0aW5nRmlsdGVyKGludCBtdWx0aXBseSwgaW50IGFkZCk7CisKKyAgICB2b2lkIGRlc2NyaWJlKFByb2dyYW1EZXNjcmlwdGlvbiYgZGVzY3JpcHRpb24sIGNvbnN0IEV4dGVuc2lvbnMmIGV4dGVuc2lvbnMpOworICAgIHZvaWQgc2V0dXBQcm9ncmFtKFByb2dyYW0qIHByb2dyYW0pOworCitwcml2YXRlOgorICAgIEdMZmxvYXQgbU11bFIsIG1NdWxHLCBtTXVsQjsKKyAgICBHTGZsb2F0IG1BZGRSLCBtQWRkRywgbUFkZEI7Cit9OyAvLyBzdHJ1Y3QgU2tpYUxpZ2h0aW5nRmlsdGVyCisKKy8qKgorICogQSBjb2xvciBmaWx0ZXJzIHRoYXQgYmxlbmRzIHRoZSBzb3VyY2UgY29sb3Igd2l0aCBhIHNwZWNpZmllZCBkZXN0aW5hdGlvbiBjb2xvcgorICogYW5kIFBvcnRlckR1ZmYgYmxlbmRpbmcgbW9kZS4KKyAqLworc3RydWN0IFNraWFCbGVuZEZpbHRlcjogcHVibGljIFNraWFDb2xvckZpbHRlciB7CisgICAgU2tpYUJsZW5kRmlsdGVyKGludCBjb2xvciwgU2tYZmVybW9kZTo6TW9kZSBtb2RlKTsKKworICAgIHZvaWQgZGVzY3JpYmUoUHJvZ3JhbURlc2NyaXB0aW9uJiBkZXNjcmlwdGlvbiwgY29uc3QgRXh0ZW5zaW9ucyYgZXh0ZW5zaW9ucyk7CisgICAgdm9pZCBzZXR1cFByb2dyYW0oUHJvZ3JhbSogcHJvZ3JhbSk7CisKK3ByaXZhdGU6CisgICAgU2tYZmVybW9kZTo6TW9kZSBtTW9kZTsKKyAgICBHTGZsb2F0IG1SLCBtRywgbUIsIG1BOworfTsgLy8gc3RydWN0IFNraWFCbGVuZEZpbHRlcgorCit9OyAvLyBuYW1lc3BhY2UgdWlyZW5kZXJlcgorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfVUlfU0tJQV9DT0xPUl9GSUxURVJfSApkaWZmIC0tZ2l0IGEvbGlicy9od3VpL1NraWFTaGFkZXIuY3BwIGIvbGlicy9od3VpL1NraWFTaGFkZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3YTAxYjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2h3dWkvU2tpYVNoYWRlci5jcHAKQEAgLTAsMCArMSwyMjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIk9wZW5HTFJlbmRlcmVyIgorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxTa01hdHJpeC5oPgorCisjaW5jbHVkZSAiU2tpYVNoYWRlci5oIgorI2luY2x1ZGUgIlRleHR1cmUuaCIKKyNpbmNsdWRlICJNYXRyaXguaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHVpcmVuZGVyZXIgeworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBTdXBwb3J0CisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3N0YXRpYyBjb25zdCBHTGVudW0gZ1RleHR1cmVVbml0c01hcFtdID0geworICAgICAgICBHTF9URVhUVVJFMCwKKyAgICAgICAgR0xfVEVYVFVSRTEsCisgICAgICAgIEdMX1RFWFRVUkUyCit9OworCitzdGF0aWMgY29uc3QgR0xpbnQgZ1RpbGVNb2Rlc1tdID0geworICAgICAgICBHTF9DTEFNUF9UT19FREdFLCAgIC8vID09IFNrU2hhZGVyOjprQ2xhbXBfVGlsZU1vZGUKKyAgICAgICAgR0xfUkVQRUFULCAgICAgICAgICAvLyA9PSBTa1NoYWRlcjo6a1JlcGVhdF9Nb2RlCisgICAgICAgIEdMX01JUlJPUkVEX1JFUEVBVCAgLy8gPT0gU2tTaGFkZXI6OmtNaXJyb3JfVGlsZU1vZGUKK307CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEJhc2Ugc2hhZGVyCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK1NraWFTaGFkZXI6OlNraWFTaGFkZXIoVHlwZSB0eXBlLCBTa1NoYWRlcioga2V5LCBTa1NoYWRlcjo6VGlsZU1vZGUgdGlsZVgsCisgICAgICAgIFNrU2hhZGVyOjpUaWxlTW9kZSB0aWxlWSwgU2tNYXRyaXgqIG1hdHJpeCwgYm9vbCBibGVuZCk6CisgICAgICAgIG1UeXBlKHR5cGUpLCBtS2V5KGtleSksIG1UaWxlWCh0aWxlWCksIG1UaWxlWSh0aWxlWSksIG1NYXRyaXgobWF0cml4KSwgbUJsZW5kKGJsZW5kKSB7Cit9CisKK1NraWFTaGFkZXI6On5Ta2lhU2hhZGVyKCkgeworfQorCit2b2lkIFNraWFTaGFkZXI6OmRlc2NyaWJlKFByb2dyYW1EZXNjcmlwdGlvbiYgZGVzY3JpcHRpb24sIGNvbnN0IEV4dGVuc2lvbnMmIGV4dGVuc2lvbnMpIHsKK30KKwordm9pZCBTa2lhU2hhZGVyOjpzZXR1cFByb2dyYW0oUHJvZ3JhbSogcHJvZ3JhbSwgY29uc3QgbWF0NCYgbW9kZWxWaWV3LCBjb25zdCBTbmFwc2hvdCYgc25hcHNob3QsCisgICAgICAgIEdMdWludCogdGV4dHVyZVVuaXQpIHsKK30KKwordm9pZCBTa2lhU2hhZGVyOjpiaW5kVGV4dHVyZShHTHVpbnQgdGV4dHVyZSwgR0xlbnVtIHdyYXBTLCBHTGVudW0gd3JhcFQsIEdMdWludCB0ZXh0dXJlVW5pdCkgeworICAgIGdsQWN0aXZlVGV4dHVyZShnVGV4dHVyZVVuaXRzTWFwW3RleHR1cmVVbml0XSk7CisgICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCB0ZXh0dXJlKTsKKyAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9XUkFQX1MsIHdyYXBTKTsKKyAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9XUkFQX1QsIHdyYXBUKTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQml0bWFwIHNoYWRlcgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitTa2lhQml0bWFwU2hhZGVyOjpTa2lhQml0bWFwU2hhZGVyKFNrQml0bWFwKiBiaXRtYXAsIFNrU2hhZGVyKiBrZXksIFNrU2hhZGVyOjpUaWxlTW9kZSB0aWxlWCwKKyAgICAgICAgU2tTaGFkZXI6OlRpbGVNb2RlIHRpbGVZLCBTa01hdHJpeCogbWF0cml4LCBib29sIGJsZW5kKToKKyAgICAgICAgU2tpYVNoYWRlcihrQml0bWFwLCBrZXksIHRpbGVYLCB0aWxlWSwgbWF0cml4LCBibGVuZCksIG1CaXRtYXAoYml0bWFwKSwgbVRleHR1cmUoTlVMTCkgeworfQorCit2b2lkIFNraWFCaXRtYXBTaGFkZXI6OmRlc2NyaWJlKFByb2dyYW1EZXNjcmlwdGlvbiYgZGVzY3JpcHRpb24sIGNvbnN0IEV4dGVuc2lvbnMmIGV4dGVuc2lvbnMpIHsKKyAgICBjb25zdCBUZXh0dXJlKiB0ZXh0dXJlID0gbVRleHR1cmVDYWNoZS0+Z2V0KG1CaXRtYXApOworICAgIGlmICghdGV4dHVyZSkgcmV0dXJuOworICAgIG1UZXh0dXJlID0gdGV4dHVyZTsKKworICAgIGNvbnN0IGZsb2F0IHdpZHRoID0gdGV4dHVyZS0+d2lkdGg7CisgICAgY29uc3QgZmxvYXQgaGVpZ2h0ID0gdGV4dHVyZS0+aGVpZ2h0OworCisgICAgZGVzY3JpcHRpb24uaGFzQml0bWFwID0gdHJ1ZTsKKyAgICAvLyBUaGUgZHJpdmVyIGRvZXMgbm90IHN1cHBvcnQgbm9uLXBvd2VyIG9mIHR3byBtaXJyb3JlZC9yZXBlYXRlZAorICAgIC8vIHRleHR1cmVzLCBzbyBkbyBpdCBvdXJzZWx2ZXMKKyAgICBpZiAoIWV4dGVuc2lvbnMuaGFzTlBvdCgpICYmICghaXNQb3dlck9mVHdvKHdpZHRoKSB8fCAhaXNQb3dlck9mVHdvKGhlaWdodCkpICYmCisgICAgICAgICAgICAobVRpbGVYICE9IFNrU2hhZGVyOjprQ2xhbXBfVGlsZU1vZGUgfHwgbVRpbGVZICE9IFNrU2hhZGVyOjprQ2xhbXBfVGlsZU1vZGUpKSB7CisgICAgICAgIGRlc2NyaXB0aW9uLmlzQml0bWFwTnBvdCA9IHRydWU7CisgICAgICAgIGRlc2NyaXB0aW9uLmJpdG1hcFdyYXBTID0gZ1RpbGVNb2Rlc1ttVGlsZVhdOworICAgICAgICBkZXNjcmlwdGlvbi5iaXRtYXBXcmFwVCA9IGdUaWxlTW9kZXNbbVRpbGVZXTsKKyAgICB9Cit9CisKK3ZvaWQgU2tpYUJpdG1hcFNoYWRlcjo6c2V0dXBQcm9ncmFtKFByb2dyYW0qIHByb2dyYW0sIGNvbnN0IG1hdDQmIG1vZGVsVmlldywKKyAgICAgICAgY29uc3QgU25hcHNob3QmIHNuYXBzaG90LCBHTHVpbnQqIHRleHR1cmVVbml0KSB7CisgICAgR0x1aW50IHRleHR1cmVTbG90ID0gKCp0ZXh0dXJlVW5pdCkrKzsKKyAgICBnbEFjdGl2ZVRleHR1cmUoZ1RleHR1cmVVbml0c01hcFt0ZXh0dXJlU2xvdF0pOworCisgICAgY29uc3QgVGV4dHVyZSogdGV4dHVyZSA9IG1UZXh0dXJlOworICAgIG1UZXh0dXJlID0gTlVMTDsKKyAgICBpZiAoIXRleHR1cmUpIHJldHVybjsKKyAgICBjb25zdCBBdXRvVGV4dHVyZSBhdXRvQ2xlYW51cCh0ZXh0dXJlKTsKKworICAgIGNvbnN0IGZsb2F0IHdpZHRoID0gdGV4dHVyZS0+d2lkdGg7CisgICAgY29uc3QgZmxvYXQgaGVpZ2h0ID0gdGV4dHVyZS0+aGVpZ2h0OworCisgICAgbWF0NCB0ZXh0dXJlVHJhbnNmb3JtOworICAgIGlmIChtTWF0cml4KSB7CisgICAgICAgIFNrTWF0cml4IGludmVyc2U7CisgICAgICAgIG1NYXRyaXgtPmludmVydCgmaW52ZXJzZSk7CisgICAgICAgIHRleHR1cmVUcmFuc2Zvcm0ubG9hZChpbnZlcnNlKTsKKyAgICAgICAgdGV4dHVyZVRyYW5zZm9ybS5tdWx0aXBseShtb2RlbFZpZXcpOworICAgIH0gZWxzZSB7CisgICAgICAgIHRleHR1cmVUcmFuc2Zvcm0ubG9hZChtb2RlbFZpZXcpOworICAgIH0KKworICAgIC8vIFVuaWZvcm1zCisgICAgYmluZFRleHR1cmUodGV4dHVyZS0+aWQsIGdUaWxlTW9kZXNbbVRpbGVYXSwgZ1RpbGVNb2Rlc1ttVGlsZVldLCB0ZXh0dXJlU2xvdCk7CisgICAgZ2xVbmlmb3JtMWkocHJvZ3JhbS0+Z2V0VW5pZm9ybSgiYml0bWFwU2FtcGxlciIpLCB0ZXh0dXJlU2xvdCk7CisgICAgZ2xVbmlmb3JtTWF0cml4NGZ2KHByb2dyYW0tPmdldFVuaWZvcm0oInRleHR1cmVUcmFuc2Zvcm0iKSwgMSwKKyAgICAgICAgICAgIEdMX0ZBTFNFLCAmdGV4dHVyZVRyYW5zZm9ybS5kYXRhWzBdKTsKKyAgICBnbFVuaWZvcm0yZihwcm9ncmFtLT5nZXRVbmlmb3JtKCJ0ZXh0dXJlRGltZW5zaW9uIiksIDEuMGYgLyB3aWR0aCwgMS4wZiAvIGhlaWdodCk7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIExpbmVhciBncmFkaWVudCBzaGFkZXIKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworU2tpYUxpbmVhckdyYWRpZW50U2hhZGVyOjpTa2lhTGluZWFyR3JhZGllbnRTaGFkZXIoZmxvYXQqIGJvdW5kcywgdWludDMyX3QqIGNvbG9ycywKKyAgICAgICAgZmxvYXQqIHBvc2l0aW9ucywgaW50IGNvdW50LCBTa1NoYWRlcioga2V5LCBTa1NoYWRlcjo6VGlsZU1vZGUgdGlsZU1vZGUsCisgICAgICAgIFNrTWF0cml4KiBtYXRyaXgsIGJvb2wgYmxlbmQpOgorICAgICAgICBTa2lhU2hhZGVyKGtMaW5lYXJHcmFkaWVudCwga2V5LCB0aWxlTW9kZSwgdGlsZU1vZGUsIG1hdHJpeCwgYmxlbmQpLAorICAgICAgICBtQm91bmRzKGJvdW5kcyksIG1Db2xvcnMoY29sb3JzKSwgbVBvc2l0aW9ucyhwb3NpdGlvbnMpLCBtQ291bnQoY291bnQpIHsKK30KKworU2tpYUxpbmVhckdyYWRpZW50U2hhZGVyOjp+U2tpYUxpbmVhckdyYWRpZW50U2hhZGVyKCkgeworICAgIGRlbGV0ZVtdIG1Cb3VuZHM7CisgICAgZGVsZXRlW10gbUNvbG9yczsKKyAgICBkZWxldGVbXSBtUG9zaXRpb25zOworfQorCit2b2lkIFNraWFMaW5lYXJHcmFkaWVudFNoYWRlcjo6ZGVzY3JpYmUoUHJvZ3JhbURlc2NyaXB0aW9uJiBkZXNjcmlwdGlvbiwKKyAgICAgICAgY29uc3QgRXh0ZW5zaW9ucyYgZXh0ZW5zaW9ucykgeworICAgIGRlc2NyaXB0aW9uLmhhc0dyYWRpZW50ID0gdHJ1ZTsKK30KKwordm9pZCBTa2lhTGluZWFyR3JhZGllbnRTaGFkZXI6OnNldHVwUHJvZ3JhbShQcm9ncmFtKiBwcm9ncmFtLCBjb25zdCBtYXQ0JiBtb2RlbFZpZXcsCisgICAgICAgIGNvbnN0IFNuYXBzaG90JiBzbmFwc2hvdCwgR0x1aW50KiB0ZXh0dXJlVW5pdCkgeworICAgIEdMdWludCB0ZXh0dXJlU2xvdCA9ICgqdGV4dHVyZVVuaXQpKys7CisgICAgZ2xBY3RpdmVUZXh0dXJlKGdUZXh0dXJlVW5pdHNNYXBbdGV4dHVyZVNsb3RdKTsKKworICAgIFRleHR1cmUqIHRleHR1cmUgPSBtR3JhZGllbnRDYWNoZS0+Z2V0KG1LZXkpOworICAgIGlmICghdGV4dHVyZSkgeworICAgICAgICB0ZXh0dXJlID0gbUdyYWRpZW50Q2FjaGUtPmFkZExpbmVhckdyYWRpZW50KG1LZXksIG1Cb3VuZHMsIG1Db2xvcnMsIG1Qb3NpdGlvbnMsCisgICAgICAgICAgICAgICAgbUNvdW50LCBtVGlsZVgpOworICAgIH0KKworICAgIFJlY3Qgc3RhcnQobUJvdW5kc1swXSwgbUJvdW5kc1sxXSwgbUJvdW5kc1syXSwgbUJvdW5kc1szXSk7CisgICAgaWYgKG1NYXRyaXgpIHsKKyAgICAgICAgbWF0NCBzaGFkZXJNYXRyaXgoKm1NYXRyaXgpOworICAgICAgICBzaGFkZXJNYXRyaXgubWFwUG9pbnQoc3RhcnQubGVmdCwgc3RhcnQudG9wKTsKKyAgICAgICAgc2hhZGVyTWF0cml4Lm1hcFBvaW50KHN0YXJ0LnJpZ2h0LCBzdGFydC5ib3R0b20pOworICAgIH0KKyAgICBzbmFwc2hvdC50cmFuc2Zvcm0ubWFwUmVjdChzdGFydCk7CisKKyAgICBjb25zdCBmbG9hdCBncmFkaWVudFggPSBzdGFydC5yaWdodCAtIHN0YXJ0LmxlZnQ7CisgICAgY29uc3QgZmxvYXQgZ3JhZGllbnRZID0gc3RhcnQuYm90dG9tIC0gc3RhcnQudG9wOworCisgICAgbWF0NCBzY3JlZW5TcGFjZShzbmFwc2hvdC50cmFuc2Zvcm0pOworICAgIHNjcmVlblNwYWNlLm11bHRpcGx5KG1vZGVsVmlldyk7CisKKyAgICAvLyBVbmlmb3JtcworICAgIGJpbmRUZXh0dXJlKHRleHR1cmUtPmlkLCBnVGlsZU1vZGVzW21UaWxlWF0sIGdUaWxlTW9kZXNbbVRpbGVZXSwgdGV4dHVyZVNsb3QpOworICAgIGdsVW5pZm9ybTFpKHByb2dyYW0tPmdldFVuaWZvcm0oImdyYWRpZW50U2FtcGxlciIpLCB0ZXh0dXJlU2xvdCk7CisgICAgZ2xVbmlmb3JtMmYocHJvZ3JhbS0+Z2V0VW5pZm9ybSgiZ3JhZGllbnRTdGFydCIpLCBzdGFydC5sZWZ0LCBzdGFydC50b3ApOworICAgIGdsVW5pZm9ybTJmKHByb2dyYW0tPmdldFVuaWZvcm0oImdyYWRpZW50IiksIGdyYWRpZW50WCwgZ3JhZGllbnRZKTsKKyAgICBnbFVuaWZvcm0xZihwcm9ncmFtLT5nZXRVbmlmb3JtKCJncmFkaWVudExlbmd0aCIpLAorICAgICAgICAgICAgMS4wZiAvIChncmFkaWVudFggKiBncmFkaWVudFggKyBncmFkaWVudFkgKiBncmFkaWVudFkpKTsKKyAgICBnbFVuaWZvcm1NYXRyaXg0ZnYocHJvZ3JhbS0+Z2V0VW5pZm9ybSgic2NyZWVuU3BhY2UiKSwgMSwgR0xfRkFMU0UsICZzY3JlZW5TcGFjZS5kYXRhWzBdKTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQ29tcG9zZSBzaGFkZXIKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworU2tpYUNvbXBvc2VTaGFkZXI6OlNraWFDb21wb3NlU2hhZGVyKFNraWFTaGFkZXIqIGZpcnN0LCBTa2lhU2hhZGVyKiBzZWNvbmQsCisgICAgICAgIFNrWGZlcm1vZGU6Ok1vZGUgbW9kZSwgU2tTaGFkZXIqIGtleSk6CisgICAgICAgIFNraWFTaGFkZXIoa0NvbXBvc2UsIGtleSwgU2tTaGFkZXI6OmtDbGFtcF9UaWxlTW9kZSwgU2tTaGFkZXI6OmtDbGFtcF9UaWxlTW9kZSwKKyAgICAgICAgTlVMTCwgZmlyc3QtPmJsZW5kKCkgfHwgc2Vjb25kLT5ibGVuZCgpKSwgbUZpcnN0KGZpcnN0KSwgbVNlY29uZChzZWNvbmQpLCBtTW9kZShtb2RlKSB7Cit9CisKK3ZvaWQgU2tpYUNvbXBvc2VTaGFkZXI6OnNldChUZXh0dXJlQ2FjaGUqIHRleHR1cmVDYWNoZSwgR3JhZGllbnRDYWNoZSogZ3JhZGllbnRDYWNoZSkgeworICAgIFNraWFTaGFkZXI6OnNldCh0ZXh0dXJlQ2FjaGUsIGdyYWRpZW50Q2FjaGUpOworICAgIG1GaXJzdC0+c2V0KHRleHR1cmVDYWNoZSwgZ3JhZGllbnRDYWNoZSk7CisgICAgbVNlY29uZC0+c2V0KHRleHR1cmVDYWNoZSwgZ3JhZGllbnRDYWNoZSk7Cit9CisKK3ZvaWQgU2tpYUNvbXBvc2VTaGFkZXI6OmRlc2NyaWJlKFByb2dyYW1EZXNjcmlwdGlvbiYgZGVzY3JpcHRpb24sIGNvbnN0IEV4dGVuc2lvbnMmIGV4dGVuc2lvbnMpIHsKKyAgICBtRmlyc3QtPmRlc2NyaWJlKGRlc2NyaXB0aW9uLCBleHRlbnNpb25zKTsKKyAgICBtU2Vjb25kLT5kZXNjcmliZShkZXNjcmlwdGlvbiwgZXh0ZW5zaW9ucyk7CisgICAgaWYgKG1GaXJzdC0+dHlwZSgpID09IGtCaXRtYXApIHsKKyAgICAgICAgZGVzY3JpcHRpb24uaXNCaXRtYXBGaXJzdCA9IHRydWU7CisgICAgfQorICAgIGRlc2NyaXB0aW9uLnNoYWRlcnNNb2RlID0gbU1vZGU7Cit9CisKK3ZvaWQgU2tpYUNvbXBvc2VTaGFkZXI6OnNldHVwUHJvZ3JhbShQcm9ncmFtKiBwcm9ncmFtLCBjb25zdCBtYXQ0JiBtb2RlbFZpZXcsCisgICAgICAgIGNvbnN0IFNuYXBzaG90JiBzbmFwc2hvdCwgR0x1aW50KiB0ZXh0dXJlVW5pdCkgeworICAgIG1GaXJzdC0+c2V0dXBQcm9ncmFtKHByb2dyYW0sIG1vZGVsVmlldywgc25hcHNob3QsIHRleHR1cmVVbml0KTsKKyAgICBtU2Vjb25kLT5zZXR1cFByb2dyYW0ocHJvZ3JhbSwgbW9kZWxWaWV3LCBzbmFwc2hvdCwgdGV4dHVyZVVuaXQpOworfQorCit9OyAvLyBuYW1lc3BhY2UgdWlyZW5kZXJlcgorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9Ta2lhU2hhZGVyLmggYi9saWJzL2h3dWkvU2tpYVNoYWRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5NWUzYjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2h3dWkvU2tpYVNoYWRlci5oCkBAIC0wLDAgKzEsMTYyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1VJX1NLSUFfU0hBREVSX0gKKyNkZWZpbmUgQU5EUk9JRF9VSV9TS0lBX1NIQURFUl9ICisKKyNpbmNsdWRlIDxTa1NoYWRlci5oPgorI2luY2x1ZGUgPFNrWGZlcm1vZGUuaD4KKworI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgorCisjaW5jbHVkZSAiRXh0ZW5zaW9ucy5oIgorI2luY2x1ZGUgIlByb2dyYW1DYWNoZS5oIgorI2luY2x1ZGUgIlRleHR1cmVDYWNoZS5oIgorI2luY2x1ZGUgIkdyYWRpZW50Q2FjaGUuaCIKKyNpbmNsdWRlICJTbmFwc2hvdC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgdWlyZW5kZXJlciB7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEJhc2Ugc2hhZGVyCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8qKgorICogUmVwcmVzZW50cyBhIFNraWEgc2hhZGVyLiBBIHNoYWRlciB3aWxsIG1vZGlmeSB0aGUgR0wgY29udGV4dCBhbmQgYWN0aXZlCisgKiBwcm9ncmFtIHRvIHJlY3JlYXRlIHRoZSBvcmlnaW5hbCBlZmZlY3QuCisgKi8KK3N0cnVjdCBTa2lhU2hhZGVyIHsKKyAgICAvKioKKyAgICAgKiBUeXBlIG9mIFNraWEgc2hhZGVyIGluIHVzZS4KKyAgICAgKi8KKyAgICBlbnVtIFR5cGUgeworICAgICAgICBrTm9uZSwKKyAgICAgICAga0JpdG1hcCwKKyAgICAgICAga0xpbmVhckdyYWRpZW50LAorICAgICAgICBrQ2lyY3VsYXJHcmFkaWVudCwKKyAgICAgICAga1N3ZWVwR3JhZGllbnQsCisgICAgICAgIGtDb21wb3NlCisgICAgfTsKKworICAgIFNraWFTaGFkZXIoVHlwZSB0eXBlLCBTa1NoYWRlcioga2V5LCBTa1NoYWRlcjo6VGlsZU1vZGUgdGlsZVgsIFNrU2hhZGVyOjpUaWxlTW9kZSB0aWxlWSwKKyAgICAgICAgICAgIFNrTWF0cml4KiBtYXRyaXgsIGJvb2wgYmxlbmQpOworICAgIHZpcnR1YWwgflNraWFTaGFkZXIoKTsKKworICAgIHZpcnR1YWwgdm9pZCBkZXNjcmliZShQcm9ncmFtRGVzY3JpcHRpb24mIGRlc2NyaXB0aW9uLCBjb25zdCBFeHRlbnNpb25zJiBleHRlbnNpb25zKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0dXBQcm9ncmFtKFByb2dyYW0qIHByb2dyYW0sIGNvbnN0IG1hdDQmIG1vZGVsVmlldywgY29uc3QgU25hcHNob3QmIHNuYXBzaG90LAorICAgICAgICAgICAgR0x1aW50KiB0ZXh0dXJlVW5pdCk7CisKKyAgICBpbmxpbmUgYm9vbCBibGVuZCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1CbGVuZDsKKyAgICB9CisKKyAgICBUeXBlIHR5cGUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtVHlwZTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgc2V0KFRleHR1cmVDYWNoZSogdGV4dHVyZUNhY2hlLCBHcmFkaWVudENhY2hlKiBncmFkaWVudENhY2hlKSB7CisgICAgICAgIG1UZXh0dXJlQ2FjaGUgPSB0ZXh0dXJlQ2FjaGU7CisgICAgICAgIG1HcmFkaWVudENhY2hlID0gZ3JhZGllbnRDYWNoZTsKKyAgICB9CisKKyAgICB2b2lkIHNldE1hdHJpeChTa01hdHJpeCogbWF0cml4KSB7CisgICAgICAgIG1NYXRyaXggPSBtYXRyaXg7CisgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgaW5saW5lIHZvaWQgYmluZFRleHR1cmUoR0x1aW50IHRleHR1cmUsIEdMZW51bSB3cmFwUywgR0xlbnVtIHdyYXBULCBHTHVpbnQgdGV4dHVyZVVuaXQpOworCisgICAgVHlwZSBtVHlwZTsKKyAgICBTa1NoYWRlciogbUtleTsKKyAgICBTa1NoYWRlcjo6VGlsZU1vZGUgbVRpbGVYOworICAgIFNrU2hhZGVyOjpUaWxlTW9kZSBtVGlsZVk7CisgICAgU2tNYXRyaXgqIG1NYXRyaXg7CisgICAgYm9vbCBtQmxlbmQ7CisKKyAgICBUZXh0dXJlQ2FjaGUqIG1UZXh0dXJlQ2FjaGU7CisgICAgR3JhZGllbnRDYWNoZSogbUdyYWRpZW50Q2FjaGU7Cit9OyAvLyBzdHJ1Y3QgU2tpYVNoYWRlcgorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEltcGxlbWVudGF0aW9ucworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvKioKKyAqIEEgc2hhZGVyIHRoYXQgZHJhd3MgYSBiaXRtYXAuCisgKi8KK3N0cnVjdCBTa2lhQml0bWFwU2hhZGVyOiBwdWJsaWMgU2tpYVNoYWRlciB7CisgICAgU2tpYUJpdG1hcFNoYWRlcihTa0JpdG1hcCogYml0bWFwLCBTa1NoYWRlcioga2V5LCBTa1NoYWRlcjo6VGlsZU1vZGUgdGlsZVgsCisgICAgICAgICAgICBTa1NoYWRlcjo6VGlsZU1vZGUgdGlsZVksIFNrTWF0cml4KiBtYXRyaXgsIGJvb2wgYmxlbmQpOworCisgICAgdm9pZCBkZXNjcmliZShQcm9ncmFtRGVzY3JpcHRpb24mIGRlc2NyaXB0aW9uLCBjb25zdCBFeHRlbnNpb25zJiBleHRlbnNpb25zKTsKKyAgICB2b2lkIHNldHVwUHJvZ3JhbShQcm9ncmFtKiBwcm9ncmFtLCBjb25zdCBtYXQ0JiBtb2RlbFZpZXcsIGNvbnN0IFNuYXBzaG90JiBzbmFwc2hvdCwKKyAgICAgICAgICAgIEdMdWludCogdGV4dHVyZVVuaXQpOworCitwcml2YXRlOgorICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIGRvZXMgbm90IHdvcmsgZm9yIG4gPT0gMC4KKyAgICAgKi8KKyAgICBpbmxpbmUgYm9vbCBpc1Bvd2VyT2ZUd28odW5zaWduZWQgaW50IG4pIHsKKyAgICAgICAgcmV0dXJuICEobiAmIChuIC0gMSkpOworICAgIH0KKworICAgIFNrQml0bWFwKiBtQml0bWFwOworICAgIGNvbnN0IFRleHR1cmUqIG1UZXh0dXJlOworfTsgLy8gc3RydWN0IFNraWFCaXRtYXBTaGFkZXIKKworLyoqCisgKiBBIHNoYWRlciB0aGF0IGRyYXdzIGEgbGluZWFyIGdyYWRpZW50LgorICovCitzdHJ1Y3QgU2tpYUxpbmVhckdyYWRpZW50U2hhZGVyOiBwdWJsaWMgU2tpYVNoYWRlciB7CisgICAgU2tpYUxpbmVhckdyYWRpZW50U2hhZGVyKGZsb2F0KiBib3VuZHMsIHVpbnQzMl90KiBjb2xvcnMsIGZsb2F0KiBwb3NpdGlvbnMsIGludCBjb3VudCwKKyAgICAgICAgICAgIFNrU2hhZGVyKiBrZXksIFNrU2hhZGVyOjpUaWxlTW9kZSB0aWxlTW9kZSwgU2tNYXRyaXgqIG1hdHJpeCwgYm9vbCBibGVuZCk7CisgICAgflNraWFMaW5lYXJHcmFkaWVudFNoYWRlcigpOworCisgICAgdm9pZCBkZXNjcmliZShQcm9ncmFtRGVzY3JpcHRpb24mIGRlc2NyaXB0aW9uLCBjb25zdCBFeHRlbnNpb25zJiBleHRlbnNpb25zKTsKKyAgICB2b2lkIHNldHVwUHJvZ3JhbShQcm9ncmFtKiBwcm9ncmFtLCBjb25zdCBtYXQ0JiBtb2RlbFZpZXcsIGNvbnN0IFNuYXBzaG90JiBzbmFwc2hvdCwKKyAgICAgICAgICAgIEdMdWludCogdGV4dHVyZVVuaXQpOworCitwcml2YXRlOgorICAgIGZsb2F0KiBtQm91bmRzOworICAgIHVpbnQzMl90KiBtQ29sb3JzOworICAgIGZsb2F0KiBtUG9zaXRpb25zOworICAgIGludCBtQ291bnQ7Cit9OyAvLyBzdHJ1Y3QgU2tpYUxpbmVhckdyYWRpZW50U2hhZGVyCisKKy8qKgorICogQSBzaGFkZXIgdGhhdCBkcmF3cyB0d28gc2hhZGVycywgY29tcG9zaXRlZCB3aXRoIGFuIHhmZXJtb2RlLgorICovCitzdHJ1Y3QgU2tpYUNvbXBvc2VTaGFkZXI6IHB1YmxpYyBTa2lhU2hhZGVyIHsKKyAgICBTa2lhQ29tcG9zZVNoYWRlcihTa2lhU2hhZGVyKiBmaXJzdCwgU2tpYVNoYWRlciogc2Vjb25kLCBTa1hmZXJtb2RlOjpNb2RlIG1vZGUsIFNrU2hhZGVyKiBrZXkpOworCisgICAgdm9pZCBzZXQoVGV4dHVyZUNhY2hlKiB0ZXh0dXJlQ2FjaGUsIEdyYWRpZW50Q2FjaGUqIGdyYWRpZW50Q2FjaGUpOworCisgICAgdm9pZCBkZXNjcmliZShQcm9ncmFtRGVzY3JpcHRpb24mIGRlc2NyaXB0aW9uLCBjb25zdCBFeHRlbnNpb25zJiBleHRlbnNpb25zKTsKKyAgICB2b2lkIHNldHVwUHJvZ3JhbShQcm9ncmFtKiBwcm9ncmFtLCBjb25zdCBtYXQ0JiBtb2RlbFZpZXcsIGNvbnN0IFNuYXBzaG90JiBzbmFwc2hvdCwKKyAgICAgICAgICAgIEdMdWludCogdGV4dHVyZVVuaXQpOworCitwcml2YXRlOgorICAgIFNraWFTaGFkZXIqIG1GaXJzdDsKKyAgICBTa2lhU2hhZGVyKiBtU2Vjb25kOworICAgIFNrWGZlcm1vZGU6Ok1vZGUgbU1vZGU7Cit9OyAvLyBzdHJ1Y3QgU2tpYUNvbXBvc2VTaGFkZXIKKworfTsgLy8gbmFtZXNwYWNlIHVpcmVuZGVyZXIKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX1VJX1NLSUFfU0hBREVSX0gKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9TbmFwc2hvdC5oIGIvbGlicy9od3VpL1NuYXBzaG90LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTdlN2NhZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvaHd1aS9TbmFwc2hvdC5oCkBAIC0wLDAgKzEsMjA3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1VJX1NOQVBTSE9UX0gKKyNkZWZpbmUgQU5EUk9JRF9VSV9TTkFQU0hPVF9ICisKKyNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KKyNpbmNsdWRlIDxHTEVTMi9nbDJleHQuaD4KKworI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKworI2luY2x1ZGUgPFNrUmVnaW9uLmg+CisKKyNpbmNsdWRlICJMYXllci5oIgorI2luY2x1ZGUgIk1hdHJpeC5oIgorI2luY2x1ZGUgIlJlY3QuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHVpcmVuZGVyZXIgeworCisvKioKKyAqIEEgc25hcHNob3QgaG9sZHMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHJlbmRlcmluZworICogc3VyZmFjZS4gQSBzbmFwc2hvdCBpcyB1c3VhbGx5IGNyZWF0ZWQgd2hlbmV2ZXIgdGhlIHVzZXIgY2FsbHMgc2F2ZSgpCisgKiBhbmQgZGlzY2FyZGVkIHdoZW4gdGhlIHVzZXIgY2FsbHMgcmVzdG9yZSgpLiBPbmNlIGEgc25hcHNob3QgaXMgY3JlYXRlZCwKKyAqIGl0IGNhbiBob2xkIGluZm9ybWF0aW9uIGZvciBkZWZlcnJlZCByZW5kZXJpbmcuCisgKgorICogRWFjaCBzbmFwc2hvdCBoYXMgYSBsaW5rIHRvIGEgcHJldmlvdXMgc25hcHNob3QsIGluZGljYXRpbmcgdGhlIHByZXZpb3VzCisgKiBzdGF0ZSBvZiB0aGUgcmVuZGVyZXIuCisgKi8KK2NsYXNzIFNuYXBzaG90OiBwdWJsaWMgTGlnaHRSZWZCYXNlPFNuYXBzaG90PiB7CitwdWJsaWM6CisgICAgU25hcHNob3QoKTogaW52aXNpYmxlKGZhbHNlKSwgZmxhZ3MoMCksIHByZXZpb3VzKE5VTEwpLCBsYXllcihOVUxMKSwgZmJvKDApIHsgfQorCisgICAgLyoqCisgICAgICogQ29waWVzIHRoZSBzcGVjaWZpZWQgc25hcHNob3QuIE9ubHkgdGhlIHRyYW5zZm9ybSBhbmQgY2xpcCByZWN0YW5nbGUKKyAgICAgKiBhcmUgY29waWVkLiBUaGUgbGF5ZXIgaW5mb3JtYXRpb24gaXMgc2V0IHRvIDAgYW5kIHRoZSB0cmFuc2Zvcm0gaXMKKyAgICAgKiBhc3N1bWVkIHRvIGJlIGRpcnR5LiBUaGUgc3BlY2lmaWVkIHNuYXBzaG90IGlzIHN0b3JlZCBhcyB0aGUgcHJldmlvdXMKKyAgICAgKiBzbmFwc2hvdC4KKyAgICAgKi8KKyAgICBTbmFwc2hvdChjb25zdCBzcDxTbmFwc2hvdD4mIHMpOgorICAgICAgICAgICAgaGVpZ2h0KHMtPmhlaWdodCksCisgICAgICAgICAgICB0cmFuc2Zvcm0ocy0+dHJhbnNmb3JtKSwKKyAgICAgICAgICAgIGNsaXBSZWN0KHMtPmNsaXBSZWN0KSwKKyAgICAgICAgICAgIGludmlzaWJsZShzLT5pbnZpc2libGUpLAorICAgICAgICAgICAgZmxhZ3MoMCksCisgICAgICAgICAgICBwcmV2aW91cyhzKSwKKyAgICAgICAgICAgIGxheWVyKE5VTEwpLAorICAgICAgICAgICAgZmJvKHMtPmZibyksCisgICAgICAgICAgICB2aWV3cG9ydChzLT52aWV3cG9ydCkgeworICAgICAgICBpZiAoKHMtPmZsYWdzICYgU25hcHNob3Q6OmtGbGFnQ2xpcFNldCkgJiYKKyAgICAgICAgICAgICAgICAhKHMtPmZsYWdzICYgU25hcHNob3Q6OmtGbGFnRGlydHlMb2NhbENsaXApKSB7CisgICAgICAgICAgICBsb2NhbENsaXAuc2V0KHMtPmxvY2FsQ2xpcCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmbGFncyB8PSBTbmFwc2hvdDo6a0ZsYWdEaXJ0eUxvY2FsQ2xpcDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFZhcmlvdXMgZmxhZ3Mgc2V0IG9uICNmbGFncy4KKyAgICAgKi8KKyAgICBlbnVtIEZsYWdzIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEluZGljYXRlcyB0aGF0IHRoZSBjbGlwIHJlZ2lvbiB3YXMgbW9kaWZpZWQuIFdoZW4gdGhpcworICAgICAgICAgKiBzbmFwc2hvdCBpcyByZXN0b3JlZCBzbyBtdXN0IHRoZSBjbGlwLgorICAgICAgICAgKi8KKyAgICAgICAga0ZsYWdDbGlwU2V0ID0gMHgxLAorICAgICAgICAvKioKKyAgICAgICAgICogSW5kaWNhdGVzIHRoYXQgdGhpcyBzbmFwc2hvdCB3YXMgY3JlYXRlZCB3aGVuIHNhdmluZworICAgICAgICAgKiBhIG5ldyBsYXllci4KKyAgICAgICAgICovCisgICAgICAgIGtGbGFnSXNMYXllciA9IDB4MiwKKyAgICAgICAgLyoqCisgICAgICAgICAqIEluZGljYXRlcyB0aGF0IHRoaXMgc25hcHNob3QgaGFzIGNoYW5nZWQgdGhlIG9ydGhvIG1hdHJpeC4KKyAgICAgICAgICovCisgICAgICAgIGtGbGFnRGlydHlPcnRobyA9IDB4NCwKKyAgICAgICAgLyoqCisgICAgICAgICAqIEluZGljYXRlcyB0aGF0IHRoZSBsb2NhbCBjbGlwIHNob3VsZCBiZSByZWNvbXB1dGVkLgorICAgICAgICAgKi8KKyAgICAgICAga0ZsYWdEaXJ0eUxvY2FsQ2xpcCA9IDB4OCwKKyAgICB9OworCisgICAgLyoqCisgICAgICogSW50ZXJzZWN0cyB0aGUgY3VycmVudCBjbGlwIHdpdGggdGhlIG5ldyBjbGlwIHJlY3RhbmdsZS4KKyAgICAgKi8KKyAgICBib29sIGNsaXAoZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLCBTa1JlZ2lvbjo6T3Agb3ApIHsKKyAgICAgICAgYm9vbCBjbGlwcGVkID0gZmFsc2U7CisKKyAgICAgICAgUmVjdCByKGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSk7CisgICAgICAgIHRyYW5zZm9ybS5tYXBSZWN0KHIpOworCisgICAgICAgIHN3aXRjaCAob3ApIHsKKyAgICAgICAgICAgIGNhc2UgU2tSZWdpb246OmtEaWZmZXJlbmNlX09wOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTa1JlZ2lvbjo6a0ludGVyc2VjdF9PcDoKKyAgICAgICAgICAgICAgICBjbGlwcGVkID0gY2xpcFJlY3QuaW50ZXJzZWN0KHIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTa1JlZ2lvbjo6a1VuaW9uX09wOgorICAgICAgICAgICAgICAgIGNsaXBwZWQgPSBjbGlwUmVjdC51bmlvbldpdGgocik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFNrUmVnaW9uOjprWE9SX09wOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTa1JlZ2lvbjo6a1JldmVyc2VEaWZmZXJlbmNlX09wOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTa1JlZ2lvbjo6a1JlcGxhY2VfT3A6CisgICAgICAgICAgICAgICAgY2xpcFJlY3Quc2V0KHIpOworICAgICAgICAgICAgICAgIGNsaXBwZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNsaXBwZWQpIHsKKyAgICAgICAgICAgIGZsYWdzIHw9IFNuYXBzaG90OjprRmxhZ0NsaXBTZXQgfCBTbmFwc2hvdDo6a0ZsYWdEaXJ0eUxvY2FsQ2xpcDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBjbGlwcGVkOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGN1cnJlbnQgY2xpcC4KKyAgICAgKi8KKyAgICB2b2lkIHNldENsaXAoZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tKSB7CisgICAgICAgIGNsaXBSZWN0LnNldChsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20pOworICAgICAgICBmbGFncyB8PSBTbmFwc2hvdDo6a0ZsYWdDbGlwU2V0IHwgU25hcHNob3Q6OmtGbGFnRGlydHlMb2NhbENsaXA7CisgICAgfQorCisgICAgY29uc3QgUmVjdCYgZ2V0TG9jYWxDbGlwKCkgeworICAgICAgICBpZiAoZmxhZ3MgJiBTbmFwc2hvdDo6a0ZsYWdEaXJ0eUxvY2FsQ2xpcCkgeworICAgICAgICAgICAgbWF0NCBpbnZlcnNlOworICAgICAgICAgICAgaW52ZXJzZS5sb2FkSW52ZXJzZSh0cmFuc2Zvcm0pOworCisgICAgICAgICAgICBsb2NhbENsaXAuc2V0KGNsaXBSZWN0KTsKKyAgICAgICAgICAgIGludmVyc2UubWFwUmVjdChsb2NhbENsaXApOworCisgICAgICAgICAgICBmbGFncyAmPSB+U25hcHNob3Q6OmtGbGFnRGlydHlMb2NhbENsaXA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGxvY2FsQ2xpcDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBIZWlnaHQgb2YgdGhlIGZyYW1lYnVmZmVyIHRoZSBzbmFwc2hvdCBpcyByZW5kZXJpbmcgaW50by4KKyAgICAgKi8KKyAgICBpbnQgaGVpZ2h0OworCisgICAgLyoqCisgICAgICogTG9jYWwgdHJhbnNmb3JtYXRpb24uIEhvbGRzIHRoZSBjdXJyZW50IHRyYW5zbGF0aW9uLCBzY2FsZSBhbmQKKyAgICAgKiByb3RhdGlvbiB2YWx1ZXMuCisgICAgICovCisgICAgbWF0NCB0cmFuc2Zvcm07CisKKyAgICAvKioKKyAgICAgKiBDdXJyZW50IGNsaXAgcmVnaW9uLiBUaGUgY2xpcCBpcyBzdG9yZWQgaW4gY2FudmFzLXNwYWNlIGNvb3JkaW5hdGVzLAorICAgICAqIChzY3JlZW4tc3BhY2UgY29vcmRpbmF0ZXMgaW4gdGhlIHJlZ3VsYXIgY2FzZS4pCisgICAgICovCisgICAgUmVjdCBjbGlwUmVjdDsKKworICAgIC8qKgorICAgICAqIElmIHRydWUsIHRoZSBsYXllciB3b24ndCBiZSByZW5kZXJlZC4KKyAgICAgKi8KKyAgICBib29sIGludmlzaWJsZTsKKworICAgIC8qKgorICAgICAqIERpcnR5IGZsYWdzLgorICAgICAqLworICAgIGludCBmbGFnczsKKworICAgIC8qKgorICAgICAqIFByZXZpb3VzIHNuYXBzaG90LgorICAgICAqLworICAgIHNwPFNuYXBzaG90PiBwcmV2aW91czsKKworICAgIC8qKgorICAgICAqIE9ubHkgc2V0IHdoZW4gdGhlIGZsYWcga0ZsYWdJc0xheWVyIGlzIHNldC4KKyAgICAgKi8KKyAgICBMYXllciogbGF5ZXI7CisgICAgR0x1aW50IGZibzsKKworICAgIC8qKgorICAgICAqIEN1cnJlbnQgdmlld3BvcnQuCisgICAgICovCisgICAgUmVjdCB2aWV3cG9ydDsKKworICAgIC8qKgorICAgICAqIENvbnRhaW5zIHRoZSBwcmV2aW91cyBvcnRobyBtYXRyaXguCisgICAgICovCisgICAgbWF0NCBvcnRob01hdHJpeDsKKworcHJpdmF0ZToKKyAgICBSZWN0IGxvY2FsQ2xpcDsKKworfTsgLy8gY2xhc3MgU25hcHNob3QKKworfTsgLy8gbmFtZXNwYWNlIHVpcmVuZGVyZXIKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX1VJX1NOQVBTSE9UX0gKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9UZXh0RHJvcFNoYWRvd0NhY2hlLmNwcCBiL2xpYnMvaHd1aS9UZXh0RHJvcFNoYWRvd0NhY2hlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTVkMmJlCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL1RleHREcm9wU2hhZG93Q2FjaGUuY3BwCkBAIC0wLDAgKzEsMTQ4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJPcGVuR0xSZW5kZXJlciIKKworI2luY2x1ZGUgIlRleHREcm9wU2hhZG93Q2FjaGUuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHVpcmVuZGVyZXIgeworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDb25zdHJ1Y3RvcnMvZGVzdHJ1Y3RvcgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitUZXh0RHJvcFNoYWRvd0NhY2hlOjpUZXh0RHJvcFNoYWRvd0NhY2hlKCk6CisgICAgICAgIG1DYWNoZShHZW5lcmF0aW9uQ2FjaGU8U2hhZG93VGV4dCwgU2hhZG93VGV4dHVyZSo+OjprVW5saW1pdGVkQ2FwYWNpdHkpLAorICAgICAgICBtU2l6ZSgwKSwgbU1heFNpemUoTUIoREVGQVVMVF9EUk9QX1NIQURPV19DQUNIRV9TSVpFKSkgeworICAgIGNoYXIgcHJvcGVydHlbUFJPUEVSVFlfVkFMVUVfTUFYXTsKKyAgICBpZiAocHJvcGVydHlfZ2V0KFBST1BFUlRZX0RST1BfU0hBRE9XX0NBQ0hFX1NJWkUsIHByb3BlcnR5LCBOVUxMKSA+IDApIHsKKyAgICAgICAgTE9HRCgiICBTZXR0aW5nIGRyb3Agc2hhZG93IGNhY2hlIHNpemUgdG8gJXNNQiIsIHByb3BlcnR5KTsKKyAgICAgICAgc2V0TWF4U2l6ZShNQihhdG9mKHByb3BlcnR5KSkpOworICAgIH0gZWxzZSB7CisgICAgICAgIExPR0QoIiAgVXNpbmcgZGVmYXVsdCBkcm9wIHNoYWRvdyBjYWNoZSBzaXplIG9mICUuMmZNQiIsIERFRkFVTFRfRFJPUF9TSEFET1dfQ0FDSEVfU0laRSk7CisgICAgfQorCisgICAgbUNhY2hlLnNldE9uRW50cnlSZW1vdmVkTGlzdGVuZXIodGhpcyk7Cit9CisKK1RleHREcm9wU2hhZG93Q2FjaGU6OlRleHREcm9wU2hhZG93Q2FjaGUodWludDMyX3QgbWF4Qnl0ZVNpemUpOgorICAgICAgICBtQ2FjaGUoR2VuZXJhdGlvbkNhY2hlPFNoYWRvd1RleHQsIFNoYWRvd1RleHR1cmUqPjo6a1VubGltaXRlZENhcGFjaXR5KSwKKyAgICAgICAgbVNpemUoMCksIG1NYXhTaXplKG1heEJ5dGVTaXplKSB7CisgICAgbUNhY2hlLnNldE9uRW50cnlSZW1vdmVkTGlzdGVuZXIodGhpcyk7Cit9CisKK1RleHREcm9wU2hhZG93Q2FjaGU6On5UZXh0RHJvcFNoYWRvd0NhY2hlKCkgeworICAgIG1DYWNoZS5jbGVhcigpOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBTaXplIG1hbmFnZW1lbnQKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordWludDMyX3QgVGV4dERyb3BTaGFkb3dDYWNoZTo6Z2V0U2l6ZSgpIHsKKyAgICByZXR1cm4gbVNpemU7Cit9CisKK3VpbnQzMl90IFRleHREcm9wU2hhZG93Q2FjaGU6OmdldE1heFNpemUoKSB7CisgICAgcmV0dXJuIG1NYXhTaXplOworfQorCit2b2lkIFRleHREcm9wU2hhZG93Q2FjaGU6OnNldE1heFNpemUodWludDMyX3QgbWF4U2l6ZSkgeworICAgIG1NYXhTaXplID0gbWF4U2l6ZTsKKyAgICB3aGlsZSAobVNpemUgPiBtTWF4U2l6ZSkgeworICAgICAgICBtQ2FjaGUucmVtb3ZlT2xkZXN0KCk7CisgICAgfQorfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDYWxsYmFja3MKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordm9pZCBUZXh0RHJvcFNoYWRvd0NhY2hlOjpvcGVyYXRvcigpKFNoYWRvd1RleHQmIHRleHQsIFNoYWRvd1RleHR1cmUqJiB0ZXh0dXJlKSB7CisgICAgY29uc3QgdWludDMyX3Qgc2l6ZSA9IHRleHR1cmUtPndpZHRoICogdGV4dHVyZS0+aGVpZ2h0OworICAgIG1TaXplIC09IHNpemU7CisKKyAgICBpZiAodGV4dHVyZSkgeworICAgICAgICBnbERlbGV0ZVRleHR1cmVzKDEsICZ0ZXh0dXJlLT5pZCk7CisgICAgICAgIGRlbGV0ZSB0ZXh0dXJlOworICAgIH0KK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQ2FjaGluZworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit2b2lkIFRleHREcm9wU2hhZG93Q2FjaGU6OmNsZWFyKCkgeworICAgIG1DYWNoZS5jbGVhcigpOworfQorCitTaGFkb3dUZXh0dXJlKiBUZXh0RHJvcFNoYWRvd0NhY2hlOjpnZXQoU2tQYWludCogcGFpbnQsIGNvbnN0IGNoYXIqIHRleHQsIHVpbnQzMl90IGxlbiwKKyAgICAgICAgaW50IG51bUdseXBocywgdWludDMyX3QgcmFkaXVzKSB7CisgICAgU2hhZG93VGV4dCBlbnRyeShwYWludCwgcmFkaXVzLCBsZW4sIHRleHQpOworICAgIFNoYWRvd1RleHR1cmUqIHRleHR1cmUgPSBtQ2FjaGUuZ2V0KGVudHJ5KTsKKworICAgIGlmICghdGV4dHVyZSkgeworICAgICAgICBGb250UmVuZGVyZXI6OkRyb3BTaGFkb3cgc2hhZG93ID0gbVJlbmRlcmVyLT5yZW5kZXJEcm9wU2hhZG93KHBhaW50LCB0ZXh0LCAwLAorICAgICAgICAgICAgICAgIGxlbiwgbnVtR2x5cGhzLCByYWRpdXMpOworCisgICAgICAgIHRleHR1cmUgPSBuZXcgU2hhZG93VGV4dHVyZTsKKyAgICAgICAgdGV4dHVyZS0+bGVmdCA9IHNoYWRvdy5wZW5YOworICAgICAgICB0ZXh0dXJlLT50b3AgPSBzaGFkb3cucGVuWTsKKyAgICAgICAgdGV4dHVyZS0+d2lkdGggPSBzaGFkb3cud2lkdGg7CisgICAgICAgIHRleHR1cmUtPmhlaWdodCA9IHNoYWRvdy5oZWlnaHQ7CisgICAgICAgIHRleHR1cmUtPmdlbmVyYXRpb24gPSAwOworICAgICAgICB0ZXh0dXJlLT5ibGVuZCA9IHRydWU7CisKKyAgICAgICAgY29uc3QgdWludDMyX3Qgc2l6ZSA9IHNoYWRvdy53aWR0aCAqIHNoYWRvdy5oZWlnaHQ7CisgICAgICAgIC8vIERvbid0IGV2ZW4gdHJ5IHRvIGNhY2hlIGEgYml0bWFwIHRoYXQncyBiaWdnZXIgdGhhbiB0aGUgY2FjaGUKKyAgICAgICAgaWYgKHNpemUgPCBtTWF4U2l6ZSkgeworICAgICAgICAgICAgd2hpbGUgKG1TaXplICsgc2l6ZSA+IG1NYXhTaXplKSB7CisgICAgICAgICAgICAgICAgbUNhY2hlLnJlbW92ZU9sZGVzdCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZ2xHZW5UZXh0dXJlcygxLCAmdGV4dHVyZS0+aWQpOworCisgICAgICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgdGV4dHVyZS0+aWQpOworICAgICAgICAvLyBUZXh0dXJlcyBhcmUgQWxwaGE4CisgICAgICAgIGdsUGl4ZWxTdG9yZWkoR0xfVU5QQUNLX0FMSUdOTUVOVCwgMSk7CisKKyAgICAgICAgZ2xUZXhJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIEdMX0FMUEhBLCB0ZXh0dXJlLT53aWR0aCwgdGV4dHVyZS0+aGVpZ2h0LCAwLAorICAgICAgICAgICAgICAgIEdMX0FMUEhBLCBHTF9VTlNJR05FRF9CWVRFLCBzaGFkb3cuaW1hZ2UpOworCisgICAgICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01JTl9GSUxURVIsIEdMX0xJTkVBUik7CisgICAgICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01BR19GSUxURVIsIEdMX0xJTkVBUik7CisKKyAgICAgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9TLCBHTF9DTEFNUF9UT19FREdFKTsKKyAgICAgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9ULCBHTF9DTEFNUF9UT19FREdFKTsKKworICAgICAgICBpZiAoc2l6ZSA8IG1NYXhTaXplKSB7CisgICAgICAgICAgICBtU2l6ZSArPSBzaXplOworICAgICAgICAgICAgbUNhY2hlLnB1dChlbnRyeSwgdGV4dHVyZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0ZXh0dXJlLT5jbGVhbnVwID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENsZWFudXAgc2hhZG93CisgICAgICAgIGRlbGV0ZVtdIHNoYWRvdy5pbWFnZTsKKyAgICB9CisKKyAgICByZXR1cm4gdGV4dHVyZTsKK30KKworfTsgLy8gbmFtZXNwYWNlIHVpcmVuZGVyZXIKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJzL2h3dWkvVGV4dERyb3BTaGFkb3dDYWNoZS5oIGIvbGlicy9od3VpL1RleHREcm9wU2hhZG93Q2FjaGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjVkNjJhCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL1RleHREcm9wU2hhZG93Q2FjaGUuaApAQCAtMCwwICsxLDE1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9VSV9URVhUX0RST1BfU0hBRE9XX0NBQ0hFX0gKKyNkZWZpbmUgQU5EUk9JRF9VSV9URVhUX0RST1BfU0hBRE9XX0NBQ0hFX0gKKworI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgorCisjaW5jbHVkZSA8U2tQYWludC5oPgorCisjaW5jbHVkZSAiR2VuZXJhdGlvbkNhY2hlLmgiCisjaW5jbHVkZSAiRm9udFJlbmRlcmVyLmgiCisjaW5jbHVkZSAiVGV4dHVyZS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgdWlyZW5kZXJlciB7CisKK3N0cnVjdCBTaGFkb3dUZXh0IHsKKyAgICBTaGFkb3dUZXh0KCkgeworICAgICAgICB0ZXh0ID0gTlVMTDsKKyAgICB9CisKKyAgICBTaGFkb3dUZXh0KFNrUGFpbnQqIHBhaW50LCB1aW50MzJfdCByYWRpdXMsIHVpbnQzMl90IGxlbiwgY29uc3QgY2hhciogc3JjVGV4dCk6CisgICAgICAgICAgICByYWRpdXMocmFkaXVzKSwgbGVuKGxlbikgeworICAgICAgICB0ZXh0ID0gbmV3IGNoYXJbbGVuXTsKKyAgICAgICAgbWVtY3B5KHRleHQsIHNyY1RleHQsIGxlbik7CisKKyAgICAgICAgdGV4dFNpemUgPSBwYWludC0+Z2V0VGV4dFNpemUoKTsKKyAgICAgICAgdHlwZWZhY2UgPSBwYWludC0+Z2V0VHlwZWZhY2UoKTsKKworICAgICAgICBoYXNoID0gMDsKKyAgICAgICAgdWludDMyX3QgbXVsdGlwbGllciA9IDE7CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgICAgICAgICAgaGFzaCArPSB0ZXh0W2ldICogbXVsdGlwbGllcjsKKyAgICAgICAgICAgIHVpbnQzMl90IHNoaWZ0ZWQgPSBtdWx0aXBsaWVyIDw8IDU7CisgICAgICAgICAgICBtdWx0aXBsaWVyID0gc2hpZnRlZCAtIG11bHRpcGxpZXI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBTaGFkb3dUZXh0KGNvbnN0IFNoYWRvd1RleHQmIHNoYWRvdyk6CisgICAgICAgICAgICByYWRpdXMoc2hhZG93LnJhZGl1cyksIGxlbihzaGFkb3cubGVuKSwgaGFzaChzaGFkb3cuaGFzaCksCisgICAgICAgICAgICB0ZXh0U2l6ZShzaGFkb3cudGV4dFNpemUpLCB0eXBlZmFjZShzaGFkb3cudHlwZWZhY2UpIHsKKyAgICAgICAgdGV4dCA9IG5ldyBjaGFyW3NoYWRvdy5sZW5dOworICAgICAgICBtZW1jcHkodGV4dCwgc2hhZG93LnRleHQsIHNoYWRvdy5sZW4pOworICAgIH0KKworICAgIH5TaGFkb3dUZXh0KCkgeworICAgICAgICBkZWxldGVbXSB0ZXh0OworICAgIH0KKworICAgIHVpbnQzMl90IHJhZGl1czsKKyAgICB1aW50MzJfdCBsZW47CisgICAgdWludDMyX3QgaGFzaDsKKyAgICBmbG9hdCB0ZXh0U2l6ZTsKKyAgICBTa1R5cGVmYWNlKiB0eXBlZmFjZTsKKyAgICBjaGFyICp0ZXh0OworCisgICAgYm9vbCBvcGVyYXRvcjwoY29uc3QgU2hhZG93VGV4dCYgcmhzKSBjb25zdCB7CisgICAgICAgIGlmIChoYXNoIDwgcmhzLmhhc2gpIHJldHVybiB0cnVlOworICAgICAgICBlbHNlIGlmIChoYXNoID09IHJocy5oYXNoKSB7CisgICAgICAgICAgICBpZiAobGVuIDwgcmhzLmxlbikgcmV0dXJuIHRydWU7CisgICAgICAgICAgICBlbHNlIGlmIChsZW4gPT0gcmhzLmxlbikgeworICAgICAgICAgICAgICAgIGlmIChyYWRpdXMgPCByaHMucmFkaXVzKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChyYWRpdXMgPT0gcmhzLnJhZGl1cykgeworICAgICAgICAgICAgICAgICAgICBpZiAodGV4dFNpemUgPCByaHMudGV4dFNpemUpIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0ZXh0U2l6ZSA9PSByaHMudGV4dFNpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlZmFjZSA8IHJocy50eXBlZmFjZSkgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlZmFjZSA9PSByaHMudHlwZWZhY2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RybmNtcCh0ZXh0LCByaHMudGV4dCwgbGVuKSA8IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK307IC8vIHN0cnVjdCBTaGFkb3dUZXh0CisKKy8qKgorICogQWxwaGEgdGV4dHVyZSB1c2VkIHRvIHJlcHJlc2VudCBhIHNoYWRvdy4KKyAqLworc3RydWN0IFNoYWRvd1RleHR1cmU6IHB1YmxpYyBUZXh0dXJlIHsKKyAgICBTaGFkb3dUZXh0dXJlKCk6IFRleHR1cmUoKSB7CisgICAgfQorCisgICAgZmxvYXQgbGVmdDsKKyAgICBmbG9hdCB0b3A7Cit9OyAvLyBzdHJ1Y3QgU2hhZG93VGV4dHVyZQorCitjbGFzcyBUZXh0RHJvcFNoYWRvd0NhY2hlOiBwdWJsaWMgT25FbnRyeVJlbW92ZWQ8U2hhZG93VGV4dCwgU2hhZG93VGV4dHVyZSo+IHsKK3B1YmxpYzoKKyAgICBUZXh0RHJvcFNoYWRvd0NhY2hlKCk7CisgICAgVGV4dERyb3BTaGFkb3dDYWNoZSh1aW50MzJfdCBtYXhCeXRlU2l6ZSk7CisgICAgflRleHREcm9wU2hhZG93Q2FjaGUoKTsKKworICAgIC8qKgorICAgICAqIFVzZWQgYXMgYSBjYWxsYmFjayB3aGVuIGFuIGVudHJ5IGlzIHJlbW92ZWQgZnJvbSB0aGUgY2FjaGUuCisgICAgICogRG8gbm90IGludm9rZSBkaXJlY3RseS4KKyAgICAgKi8KKyAgICB2b2lkIG9wZXJhdG9yKCkoU2hhZG93VGV4dCYgdGV4dCwgU2hhZG93VGV4dHVyZSomIHRleHR1cmUpOworCisgICAgU2hhZG93VGV4dHVyZSogZ2V0KFNrUGFpbnQqIHBhaW50LCBjb25zdCBjaGFyKiB0ZXh0LCB1aW50MzJfdCBsZW4sCisgICAgICAgICAgICBpbnQgbnVtR2x5cGhzLCB1aW50MzJfdCByYWRpdXMpOworCisgICAgLyoqCisgICAgICogQ2xlYXJzIHRoZSBjYWNoZS4gVGhpcyBjYXVzZXMgYWxsIHRleHR1cmVzIHRvIGJlIGRlbGV0ZWQuCisgICAgICovCisgICAgdm9pZCBjbGVhcigpOworCisgICAgdm9pZCBzZXRGb250UmVuZGVyZXIoRm9udFJlbmRlcmVyJiBmb250UmVuZGVyZXIpIHsKKyAgICAgICAgbVJlbmRlcmVyID0gJmZvbnRSZW5kZXJlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIGNhY2hlIGluIGJ5dGVzLgorICAgICAqLworICAgIHZvaWQgc2V0TWF4U2l6ZSh1aW50MzJfdCBtYXhTaXplKTsKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIGNhY2hlIGluIGJ5dGVzLgorICAgICAqLworICAgIHVpbnQzMl90IGdldE1heFNpemUoKTsKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHNpemUgb2YgdGhlIGNhY2hlIGluIGJ5dGVzLgorICAgICAqLworICAgIHVpbnQzMl90IGdldFNpemUoKTsKKworcHJpdmF0ZToKKyAgICBHZW5lcmF0aW9uQ2FjaGU8U2hhZG93VGV4dCwgU2hhZG93VGV4dHVyZSo+IG1DYWNoZTsKKworICAgIHVpbnQzMl90IG1TaXplOworICAgIHVpbnQzMl90IG1NYXhTaXplOworICAgIEZvbnRSZW5kZXJlciogbVJlbmRlcmVyOworfTsgLy8gY2xhc3MgVGV4dERyb3BTaGFkb3dDYWNoZQorCit9OyAvLyBuYW1lc3BhY2UgdWlyZW5kZXJlcgorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfVUlfVEVYVF9EUk9QX1NIQURPV19DQUNIRV9ICmRpZmYgLS1naXQgYS9saWJzL2h3dWkvVGV4dHVyZS5oIGIvbGlicy9od3VpL1RleHR1cmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGY1NDhiCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL1RleHR1cmUuaApAQCAtMCwwICsxLDc2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1VJX1RFWFRVUkVfSAorI2RlZmluZSBBTkRST0lEX1VJX1RFWFRVUkVfSAorCisjaW5jbHVkZSA8R0xFUzIvZ2wyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSB1aXJlbmRlcmVyIHsKKworLyoqCisgKiBSZXByZXNlbnRzIGFuIE9wZW5HTCB0ZXh0dXJlLgorICovCitzdHJ1Y3QgVGV4dHVyZSB7CisgICAgVGV4dHVyZSgpIHsKKyAgICAgICAgY2xlYW51cCA9IGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIE5hbWUgb2YgdGhlIHRleHR1cmUuCisgICAgICovCisgICAgR0x1aW50IGlkOworICAgIC8qKgorICAgICAqIEdlbmVyYXRpb24gb2YgdGhlIGJhY2tpbmcgYml0bWFwLAorICAgICAqLworICAgIHVpbnQzMl90IGdlbmVyYXRpb247CisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHRleHR1cmUgcmVxdWlyZXMgYmxlbmRpbmcuCisgICAgICovCisgICAgYm9vbCBibGVuZDsKKyAgICAvKioKKyAgICAgKiBXaWR0aCBvZiB0aGUgYmFja2luZyBiaXRtYXAuCisgICAgICovCisgICAgdWludDMyX3Qgd2lkdGg7CisgICAgLyoqCisgICAgICogSGVpZ2h0IG9mIHRoZSBiYWNraW5nIGJpdG1hcC4KKyAgICAgKi8KKyAgICB1aW50MzJfdCBoZWlnaHQ7CisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyB0ZXh0dXJlIHNob3VsZCBiZSBjbGVhbmVkIHVwIGFmdGVyIHVzZS4KKyAgICAgKi8KKyAgICBib29sIGNsZWFudXA7Cit9OyAvLyBzdHJ1Y3QgVGV4dHVyZQorCitjbGFzcyBBdXRvVGV4dHVyZSB7CitwdWJsaWM6CisgICAgQXV0b1RleHR1cmUoY29uc3QgVGV4dHVyZSogdGV4dHVyZSk6IG1UZXh0dXJlKHRleHR1cmUpIHsgfQorICAgIH5BdXRvVGV4dHVyZSgpIHsKKyAgICAgICAgaWYgKG1UZXh0dXJlICYmIG1UZXh0dXJlLT5jbGVhbnVwKSB7CisgICAgICAgICAgICBnbERlbGV0ZVRleHR1cmVzKDEsICZtVGV4dHVyZS0+aWQpOworICAgICAgICAgICAgZGVsZXRlIG1UZXh0dXJlOworICAgICAgICB9CisgICAgfQorCitwcml2YXRlOgorICAgIGNvbnN0IFRleHR1cmUqIG1UZXh0dXJlOworfTsgLy8gY2xhc3MgQXV0b1RleHR1cmUKKworfTsgLy8gbmFtZXNwYWNlIHVpcmVuZGVyZXIKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX1VJX1RFWFRVUkVfSApkaWZmIC0tZ2l0IGEvbGlicy9od3VpL1RleHR1cmVDYWNoZS5jcHAgYi9saWJzL2h3dWkvVGV4dHVyZUNhY2hlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTNjNTQ0Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL1RleHR1cmVDYWNoZS5jcHAKQEAgLTAsMCArMSwxODkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIk9wZW5HTFJlbmRlcmVyIgorCisjaW5jbHVkZSA8R0xFUzIvZ2wyLmg+CisKKyNpbmNsdWRlICJUZXh0dXJlQ2FjaGUuaCIKKyNpbmNsdWRlICJQcm9wZXJ0aWVzLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSB1aXJlbmRlcmVyIHsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQ29uc3RydWN0b3JzL2Rlc3RydWN0b3IKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworVGV4dHVyZUNhY2hlOjpUZXh0dXJlQ2FjaGUoKToKKyAgICAgICAgbUNhY2hlKEdlbmVyYXRpb25DYWNoZTxTa0JpdG1hcCosIFRleHR1cmUqPjo6a1VubGltaXRlZENhcGFjaXR5KSwKKyAgICAgICAgbVNpemUoMCksIG1NYXhTaXplKE1CKERFRkFVTFRfVEVYVFVSRV9DQUNIRV9TSVpFKSkgeworICAgIGNoYXIgcHJvcGVydHlbUFJPUEVSVFlfVkFMVUVfTUFYXTsKKyAgICBpZiAocHJvcGVydHlfZ2V0KFBST1BFUlRZX1RFWFRVUkVfQ0FDSEVfU0laRSwgcHJvcGVydHksIE5VTEwpID4gMCkgeworICAgICAgICBMT0dEKCIgIFNldHRpbmcgdGV4dHVyZSBjYWNoZSBzaXplIHRvICVzTUIiLCBwcm9wZXJ0eSk7CisgICAgICAgIHNldE1heFNpemUoTUIoYXRvZihwcm9wZXJ0eSkpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBMT0dEKCIgIFVzaW5nIGRlZmF1bHQgdGV4dHVyZSBjYWNoZSBzaXplIG9mICUuMmZNQiIsIERFRkFVTFRfVEVYVFVSRV9DQUNIRV9TSVpFKTsKKyAgICB9CisKKyAgICBpbml0KCk7Cit9CisKK1RleHR1cmVDYWNoZTo6VGV4dHVyZUNhY2hlKHVpbnQzMl90IG1heEJ5dGVTaXplKToKKyAgICAgICAgbUNhY2hlKEdlbmVyYXRpb25DYWNoZTxTa0JpdG1hcCosIFRleHR1cmUqPjo6a1VubGltaXRlZENhcGFjaXR5KSwKKyAgICAgICAgbVNpemUoMCksIG1NYXhTaXplKG1heEJ5dGVTaXplKSB7CisgICAgaW5pdCgpOworfQorCitUZXh0dXJlQ2FjaGU6On5UZXh0dXJlQ2FjaGUoKSB7CisgICAgbUNhY2hlLmNsZWFyKCk7Cit9CisKK3ZvaWQgVGV4dHVyZUNhY2hlOjppbml0KCkgeworICAgIG1DYWNoZS5zZXRPbkVudHJ5UmVtb3ZlZExpc3RlbmVyKHRoaXMpOworCisgICAgZ2xHZXRJbnRlZ2VydihHTF9NQVhfVEVYVFVSRV9TSVpFLCAmbU1heFRleHR1cmVTaXplKTsKKyAgICBMT0dEKCIgICAgTWF4aW11bSB0ZXh0dXJlIGRpbWVuc2lvbiBpcyAlZCBwaXhlbHMiLCBtTWF4VGV4dHVyZVNpemUpOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBTaXplIG1hbmFnZW1lbnQKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordWludDMyX3QgVGV4dHVyZUNhY2hlOjpnZXRTaXplKCkgeworICAgIHJldHVybiBtU2l6ZTsKK30KKwordWludDMyX3QgVGV4dHVyZUNhY2hlOjpnZXRNYXhTaXplKCkgeworICAgIHJldHVybiBtTWF4U2l6ZTsKK30KKwordm9pZCBUZXh0dXJlQ2FjaGU6OnNldE1heFNpemUodWludDMyX3QgbWF4U2l6ZSkgeworICAgIG1NYXhTaXplID0gbWF4U2l6ZTsKKyAgICB3aGlsZSAobVNpemUgPiBtTWF4U2l6ZSkgeworICAgICAgICBtQ2FjaGUucmVtb3ZlT2xkZXN0KCk7CisgICAgfQorfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDYWxsYmFja3MKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordm9pZCBUZXh0dXJlQ2FjaGU6Om9wZXJhdG9yKCkoU2tCaXRtYXAqJiBiaXRtYXAsIFRleHR1cmUqJiB0ZXh0dXJlKSB7CisgICAgaWYgKGJpdG1hcCkgeworICAgICAgICBjb25zdCB1aW50MzJfdCBzaXplID0gYml0bWFwLT5yb3dCeXRlcygpICogYml0bWFwLT5oZWlnaHQoKTsKKyAgICAgICAgbVNpemUgLT0gc2l6ZTsKKyAgICB9CisKKyAgICBpZiAodGV4dHVyZSkgeworICAgICAgICBnbERlbGV0ZVRleHR1cmVzKDEsICZ0ZXh0dXJlLT5pZCk7CisgICAgICAgIGRlbGV0ZSB0ZXh0dXJlOworICAgIH0KK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQ2FjaGluZworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitUZXh0dXJlKiBUZXh0dXJlQ2FjaGU6OmdldChTa0JpdG1hcCogYml0bWFwKSB7CisgICAgVGV4dHVyZSogdGV4dHVyZSA9IG1DYWNoZS5nZXQoYml0bWFwKTsKKyAgICBpZiAoIXRleHR1cmUpIHsKKyAgICAgICAgaWYgKGJpdG1hcC0+d2lkdGgoKSA+IG1NYXhUZXh0dXJlU2l6ZSB8fCBiaXRtYXAtPmhlaWdodCgpID4gbU1heFRleHR1cmVTaXplKSB7CisgICAgICAgICAgICBMT0dXKCJCaXRtYXAgdG9vIGxhcmdlIHRvIGJlIHVwbG9hZGVkIGludG8gYSB0ZXh0dXJlIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IHVpbnQzMl90IHNpemUgPSBiaXRtYXAtPnJvd0J5dGVzKCkgKiBiaXRtYXAtPmhlaWdodCgpOworICAgICAgICAvLyBEb24ndCBldmVuIHRyeSB0byBjYWNoZSBhIGJpdG1hcCB0aGF0J3MgYmlnZ2VyIHRoYW4gdGhlIGNhY2hlCisgICAgICAgIGlmIChzaXplIDwgbU1heFNpemUpIHsKKyAgICAgICAgICAgIHdoaWxlIChtU2l6ZSArIHNpemUgPiBtTWF4U2l6ZSkgeworICAgICAgICAgICAgICAgIG1DYWNoZS5yZW1vdmVPbGRlc3QoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHRleHR1cmUgPSBuZXcgVGV4dHVyZTsKKyAgICAgICAgZ2VuZXJhdGVUZXh0dXJlKGJpdG1hcCwgdGV4dHVyZSwgZmFsc2UpOworCisgICAgICAgIGlmIChzaXplIDwgbU1heFNpemUpIHsKKyAgICAgICAgICAgIG1TaXplICs9IHNpemU7CisgICAgICAgICAgICBtQ2FjaGUucHV0KGJpdG1hcCwgdGV4dHVyZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0ZXh0dXJlLT5jbGVhbnVwID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoYml0bWFwLT5nZXRHZW5lcmF0aW9uSUQoKSAhPSB0ZXh0dXJlLT5nZW5lcmF0aW9uKSB7CisgICAgICAgIGdlbmVyYXRlVGV4dHVyZShiaXRtYXAsIHRleHR1cmUsIHRydWUpOworICAgIH0KKworICAgIHJldHVybiB0ZXh0dXJlOworfQorCit2b2lkIFRleHR1cmVDYWNoZTo6cmVtb3ZlKFNrQml0bWFwKiBiaXRtYXApIHsKKyAgICBtQ2FjaGUucmVtb3ZlKGJpdG1hcCk7Cit9CisKK3ZvaWQgVGV4dHVyZUNhY2hlOjpjbGVhcigpIHsKKyAgICBtQ2FjaGUuY2xlYXIoKTsKK30KKwordm9pZCBUZXh0dXJlQ2FjaGU6OmdlbmVyYXRlVGV4dHVyZShTa0JpdG1hcCogYml0bWFwLCBUZXh0dXJlKiB0ZXh0dXJlLCBib29sIHJlZ2VuZXJhdGUpIHsKKyAgICBTa0F1dG9Mb2NrUGl4ZWxzIGFscCgqYml0bWFwKTsKKyAgICBpZiAoIWJpdG1hcC0+cmVhZHlUb0RyYXcoKSkgeworICAgICAgICBMT0dFKCJDYW5ub3QgZ2VuZXJhdGUgdGV4dHVyZSBmcm9tIGJpdG1hcCIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCFyZWdlbmVyYXRlKSB7CisgICAgICAgIHRleHR1cmUtPmdlbmVyYXRpb24gPSBiaXRtYXAtPmdldEdlbmVyYXRpb25JRCgpOworICAgICAgICB0ZXh0dXJlLT53aWR0aCA9IGJpdG1hcC0+d2lkdGgoKTsKKyAgICAgICAgdGV4dHVyZS0+aGVpZ2h0ID0gYml0bWFwLT5oZWlnaHQoKTsKKworICAgICAgICBnbEdlblRleHR1cmVzKDEsICZ0ZXh0dXJlLT5pZCk7CisgICAgfQorCisgICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCB0ZXh0dXJlLT5pZCk7CisgICAgZ2xQaXhlbFN0b3JlaShHTF9VTlBBQ0tfQUxJR05NRU5ULCBiaXRtYXAtPmJ5dGVzUGVyUGl4ZWwoKSk7CisKKyAgICBzd2l0Y2ggKGJpdG1hcC0+Z2V0Q29uZmlnKCkpIHsKKyAgICBjYXNlIFNrQml0bWFwOjprQThfQ29uZmlnOgorICAgICAgICB0ZXh0dXJlLT5ibGVuZCA9IHRydWU7CisgICAgICAgIGdsVGV4SW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCBHTF9BTFBIQSwgYml0bWFwLT5yb3dCeXRlc0FzUGl4ZWxzKCksIHRleHR1cmUtPmhlaWdodCwgMCwKKyAgICAgICAgICAgICAgICBHTF9BTFBIQSwgR0xfVU5TSUdORURfQllURSwgYml0bWFwLT5nZXRQaXhlbHMoKSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgU2tCaXRtYXA6OmtSR0JfNTY1X0NvbmZpZzoKKyAgICAgICAgdGV4dHVyZS0+YmxlbmQgPSBmYWxzZTsKKyAgICAgICAgZ2xUZXhJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIEdMX1JHQiwgYml0bWFwLT5yb3dCeXRlc0FzUGl4ZWxzKCksIHRleHR1cmUtPmhlaWdodCwgMCwKKyAgICAgICAgICAgICAgICBHTF9SR0IsIEdMX1VOU0lHTkVEX1NIT1JUXzVfNl81LCBiaXRtYXAtPmdldFBpeGVscygpKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBTa0JpdG1hcDo6a0FSR0JfODg4OF9Db25maWc6CisgICAgICAgIGdsVGV4SW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCBHTF9SR0JBLCBiaXRtYXAtPnJvd0J5dGVzQXNQaXhlbHMoKSwgdGV4dHVyZS0+aGVpZ2h0LCAwLAorICAgICAgICAgICAgICAgIEdMX1JHQkEsIEdMX1VOU0lHTkVEX0JZVEUsIGJpdG1hcC0+Z2V0UGl4ZWxzKCkpOworICAgICAgICAvLyBEbyB0aGlzIGFmdGVyIGNhbGxpbmcgZ2V0UGl4ZWxzKCkgdG8gbWFrZSBzdXJlIFNraWEncyBkZWZlcnJlZAorICAgICAgICAvLyBkZWNvZGluZyBoYXBwZW5lZAorICAgICAgICB0ZXh0dXJlLT5ibGVuZCA9ICFiaXRtYXAtPmlzT3BhcXVlKCk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01JTl9GSUxURVIsIEdMX0xJTkVBUik7CisgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUFHX0ZJTFRFUiwgR0xfTElORUFSKTsKKworICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX1dSQVBfUywgR0xfQ0xBTVBfVE9fRURHRSk7CisgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9ULCBHTF9DTEFNUF9UT19FREdFKTsKK30KKworfTsgLy8gbmFtZXNwYWNlIHVpcmVuZGVyZXIKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJzL2h3dWkvVGV4dHVyZUNhY2hlLmggYi9saWJzL2h3dWkvVGV4dHVyZUNhY2hlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjVlNGM3YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvaHd1aS9UZXh0dXJlQ2FjaGUuaApAQCAtMCwwICsxLDk0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1VJX1RFWFRVUkVfQ0FDSEVfSAorI2RlZmluZSBBTkRST0lEX1VJX1RFWFRVUkVfQ0FDSEVfSAorCisjaW5jbHVkZSA8U2tCaXRtYXAuaD4KKworI2luY2x1ZGUgIlRleHR1cmUuaCIKKyNpbmNsdWRlICJHZW5lcmF0aW9uQ2FjaGUuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHVpcmVuZGVyZXIgeworCisvKioKKyAqIEEgc2ltcGxlIExSVSB0ZXh0dXJlIGNhY2hlLiBUaGUgY2FjaGUgaGFzIGEgbWF4aW11bSBzaXplIGV4cHJlc3NlZCBpbiBieXRlcy4KKyAqIEFueSB0ZXh0dXJlIGFkZGVkIHRvIHRoZSBjYWNoZSBjYXVzaW5nIHRoZSBjYWNoZSB0byBncm93IGJleW9uZCB0aGUgbWF4aW11bQorICogYWxsb3dlZCBzaXplIHdpbGwgYWxzbyBjYXVzZSB0aGUgb2xkZXN0IHRleHR1cmUgdG8gYmUga2lja2VkIG91dC4KKyAqLworY2xhc3MgVGV4dHVyZUNhY2hlOiBwdWJsaWMgT25FbnRyeVJlbW92ZWQ8U2tCaXRtYXAqLCBUZXh0dXJlKj4geworcHVibGljOgorICAgIFRleHR1cmVDYWNoZSgpOworICAgIFRleHR1cmVDYWNoZSh1aW50MzJfdCBtYXhCeXRlU2l6ZSk7CisgICAgflRleHR1cmVDYWNoZSgpOworCisgICAgLyoqCisgICAgICogVXNlZCBhcyBhIGNhbGxiYWNrIHdoZW4gYW4gZW50cnkgaXMgcmVtb3ZlZCBmcm9tIHRoZSBjYWNoZS4KKyAgICAgKiBEbyBub3QgaW52b2tlIGRpcmVjdGx5LgorICAgICAqLworICAgIHZvaWQgb3BlcmF0b3IoKShTa0JpdG1hcComIGJpdG1hcCwgVGV4dHVyZSomIHRleHR1cmUpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdGV4dHVyZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBiaXRtYXAuIElmIHRoZSB0ZXh0dXJlCisgICAgICogY2Fubm90IGJlIGZvdW5kIGluIHRoZSBjYWNoZSwgYSBuZXcgdGV4dHVyZSBpcyBnZW5lcmF0ZWQuCisgICAgICovCisgICAgVGV4dHVyZSogZ2V0KFNrQml0bWFwKiBiaXRtYXApOworICAgIC8qKgorICAgICAqIFJlbW92ZXMgdGhlIHRleHR1cmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgYml0bWFwLiBSZXR1cm5zIE5VTEwKKyAgICAgKiBpZiB0aGUgdGV4dHVyZSBjYW5ub3QgYmUgZm91bmQuIFVwb24gcmVtb3ZlIHRoZSB0ZXh0dXJlIGlzIGZyZWVkLgorICAgICAqLworICAgIHZvaWQgcmVtb3ZlKFNrQml0bWFwKiBiaXRtYXApOworICAgIC8qKgorICAgICAqIENsZWFycyB0aGUgY2FjaGUuIFRoaXMgY2F1c2VzIGFsbCB0ZXh0dXJlcyB0byBiZSBkZWxldGVkLgorICAgICAqLworICAgIHZvaWQgY2xlYXIoKTsKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgY2FjaGUgaW4gYnl0ZXMuCisgICAgICovCisgICAgdm9pZCBzZXRNYXhTaXplKHVpbnQzMl90IG1heFNpemUpOworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgY2FjaGUgaW4gYnl0ZXMuCisgICAgICovCisgICAgdWludDMyX3QgZ2V0TWF4U2l6ZSgpOworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgc2l6ZSBvZiB0aGUgY2FjaGUgaW4gYnl0ZXMuCisgICAgICovCisgICAgdWludDMyX3QgZ2V0U2l6ZSgpOworCitwcml2YXRlOgorICAgIC8qKgorICAgICAqIEdlbmVyYXRlcyB0aGUgdGV4dHVyZSBmcm9tIGEgYml0bWFwIGludG8gdGhlIHNwZWNpZmllZCB0ZXh0dXJlIHN0cnVjdHVyZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZWdlbmVyYXRlIElmIHRydWUsIHRoZSBiaXRtYXAgZGF0YSBpcyByZXVwbG9hZGVkIGludG8gdGhlIHRleHR1cmUsIGJ1dAorICAgICAqICAgICAgICBubyBuZXcgdGV4dHVyZSBpcyBnZW5lcmF0ZWQuCisgICAgICovCisgICAgdm9pZCBnZW5lcmF0ZVRleHR1cmUoU2tCaXRtYXAqIGJpdG1hcCwgVGV4dHVyZSogdGV4dHVyZSwgYm9vbCByZWdlbmVyYXRlID0gZmFsc2UpOworCisgICAgdm9pZCBpbml0KCk7CisKKyAgICBHZW5lcmF0aW9uQ2FjaGU8U2tCaXRtYXAqLCBUZXh0dXJlKj4gbUNhY2hlOworCisgICAgdWludDMyX3QgbVNpemU7CisgICAgdWludDMyX3QgbU1heFNpemU7CisgICAgR0xpbnQgbU1heFRleHR1cmVTaXplOworfTsgLy8gY2xhc3MgVGV4dHVyZUNhY2hlCisKK307IC8vIG5hbWVzcGFjZSB1aXJlbmRlcmVyCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9VSV9URVhUVVJFX0NBQ0hFX0gKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9WZXJ0ZXguaCBiL2xpYnMvaHd1aS9WZXJ0ZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjU0MDg2Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL1ZlcnRleC5oCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfVUlfVkVSVEVYX0gKKyNkZWZpbmUgQU5EUk9JRF9VSV9WRVJURVhfSAorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgdWlyZW5kZXJlciB7CisKKy8qKgorICogU2ltcGxlIHN0cnVjdHVyZSB0byBkZXNjcmliZSBhIHZlcnRleCB3aXRoIGEgcG9zaXRpb24gYW5kIGEgdGV4dHVyZS4KKyAqLworc3RydWN0IFRleHR1cmVWZXJ0ZXggeworICAgIGZsb2F0IHBvc2l0aW9uWzJdOworICAgIGZsb2F0IHRleHR1cmVbMl07CisKKyAgICBzdGF0aWMgaW5saW5lIHZvaWQgc2V0KFRleHR1cmVWZXJ0ZXgqIHZlcnRleCwgZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgdSwgZmxvYXQgdikgeworICAgICAgICB2ZXJ0ZXhbMF0ucG9zaXRpb25bMF0gPSB4OworICAgICAgICB2ZXJ0ZXhbMF0ucG9zaXRpb25bMV0gPSB5OworICAgICAgICB2ZXJ0ZXhbMF0udGV4dHVyZVswXSA9IHU7CisgICAgICAgIHZlcnRleFswXS50ZXh0dXJlWzFdID0gdjsKKyAgICB9CisKKyAgICBzdGF0aWMgaW5saW5lIHZvaWQgc2V0VVYoVGV4dHVyZVZlcnRleCogdmVydGV4LCBmbG9hdCB1LCBmbG9hdCB2KSB7CisgICAgICAgIHZlcnRleFswXS50ZXh0dXJlWzBdID0gdTsKKyAgICAgICAgdmVydGV4WzBdLnRleHR1cmVbMV0gPSB2OworICAgIH0KK307IC8vIHN0cnVjdCBUZXh0dXJlVmVydGV4CisKK307IC8vIG5hbWVzcGFjZSB1aXJlbmRlcmVyCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9VSV9WRVJURVhfSApkaWZmIC0tZ2l0IGEvbGlicy9ycy9BbmRyb2lkLm1rIGIvbGlicy9ycy9BbmRyb2lkLm1rCmluZGV4IDk4NDY0YTAuLjM3YzQxOGIgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvQW5kcm9pZC5taworKysgYi9saWJzL3JzL0FuZHJvaWQubWsKQEAgLTc2LDM0ICs3Niw0NCBAQAogTE9DQUxfU1JDX0ZJTEVTOj0gXAogCXJzQWRhcHRlci5jcHAgXAogCXJzQWxsb2NhdGlvbi5jcHAgXAorCXJzQW5pbWF0aW9uLmNwcCBcCiAJcnNDb21wb25lbnQuY3BwIFwKIAlyc0NvbnRleHQuY3BwIFwKIAlyc0RldmljZS5jcHAgXAogCXJzRWxlbWVudC5jcHAgXAotICAgICAgICByc0ZpbGVBM0QuY3BwIFwKKwlyc0ZpbGVBM0QuY3BwIFwKKwlyc0ZvbnQuY3BwIFwKIAlyc0xpZ2h0LmNwcCBcCiAJcnNMb2NrbGVzc0ZpZm8uY3BwIFwKIAlyc09iamVjdEJhc2UuY3BwIFwKIAlyc01hdHJpeC5jcHAgXAotICAgICAgICByc01lc2guY3BwIFwKLQlyc05vaXNlLmNwcCBcCisJcnNNZXNoLmNwcCBcCisJcnNNdXRleC5jcHAgXAogCXJzUHJvZ3JhbS5jcHAgXAogCXJzUHJvZ3JhbUZyYWdtZW50LmNwcCBcCi0JcnNQcm9ncmFtRnJhZ21lbnRTdG9yZS5jcHAgXAorCXJzUHJvZ3JhbVN0b3JlLmNwcCBcCiAJcnNQcm9ncmFtUmFzdGVyLmNwcCBcCiAJcnNQcm9ncmFtVmVydGV4LmNwcCBcCiAJcnNTYW1wbGVyLmNwcCBcCiAJcnNTY3JpcHQuY3BwIFwKIAlyc1NjcmlwdEMuY3BwIFwKIAlyc1NjcmlwdENfTGliLmNwcCBcCi0gICAgICAgIHJzU2hhZGVyQ2FjaGUuY3BwIFwKLQlyc1NpbXBsZU1lc2guY3BwIFwKKwlyc1NjcmlwdENfTGliQ0wuY3BwIFwKKwlyc1NjcmlwdENfTGliR0wuY3BwIFwKKwlyc1NoYWRlckNhY2hlLmNwcCBcCisJcnNTaWduYWwuY3BwIFwKKwlyc1N0cmVhbS5jcHAgXAogCXJzVGhyZWFkSU8uY3BwIFwKIAlyc1R5cGUuY3BwIFwKIAlyc1ZlcnRleEFycmF5LmNwcAogCiAKLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gbGliY3V0aWxzIGxpYnV0aWxzIGxpYkVHTCBsaWJHTEVTdjFfQ00gbGliR0xFU3YyIGxpYnVpIGxpYmFjYworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBsaWJjdXRpbHMgbGlidXRpbHMgbGliRUdMIGxpYkdMRVN2MV9DTSBsaWJHTEVTdjIgbGlidWkgbGliYmNjCisKK0xPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gbGliZnQyCisKK0xPQ0FMX0NfSU5DTFVERVMgKz0gZXh0ZXJuYWwvZnJlZXR5cGUvaW5jbHVkZQorCiBMT0NBTF9MRExJQlMgOj0gLWxwdGhyZWFkIC1sZGwKIExPQ0FMX01PRFVMRTo9IGxpYlJTCiBMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbApkaWZmIC0tZ2l0IGEvbGlicy9ycy9SZW5kZXJTY3JpcHQuaCBiL2xpYnMvcnMvUmVuZGVyU2NyaXB0LmgKaW5kZXggZDI4MGY1MC4uMzQwNjI4NyAxMDA2NDQKLS0tIGEvbGlicy9ycy9SZW5kZXJTY3JpcHQuaAorKysgYi9saWJzL3JzL1JlbmRlclNjcmlwdC5oCkBAIC0zMCwyMCArMzAsMjMgQEAKIHR5cGVkZWYgdm9pZCAqIFJzQWRhcHRlcjFEOwogdHlwZWRlZiB2b2lkICogUnNBZGFwdGVyMkQ7CiB0eXBlZGVmIHZvaWQgKiBSc0FsbG9jYXRpb247Cit0eXBlZGVmIHZvaWQgKiBSc0FuaW1hdGlvbjsKIHR5cGVkZWYgdm9pZCAqIFJzQ29udGV4dDsKIHR5cGVkZWYgdm9pZCAqIFJzRGV2aWNlOwogdHlwZWRlZiB2b2lkICogUnNFbGVtZW50OwogdHlwZWRlZiB2b2lkICogUnNGaWxlOwordHlwZWRlZiB2b2lkICogUnNGb250OwogdHlwZWRlZiB2b2lkICogUnNTYW1wbGVyOwogdHlwZWRlZiB2b2lkICogUnNTY3JpcHQ7Ci10eXBlZGVmIHZvaWQgKiBSc1NpbXBsZU1lc2g7Cit0eXBlZGVmIHZvaWQgKiBSc01lc2g7CiB0eXBlZGVmIHZvaWQgKiBSc1R5cGU7CiB0eXBlZGVmIHZvaWQgKiBSc0xpZ2h0OwordHlwZWRlZiB2b2lkICogUnNPYmplY3RCYXNlOwogCiB0eXBlZGVmIHZvaWQgKiBSc1Byb2dyYW07CiB0eXBlZGVmIHZvaWQgKiBSc1Byb2dyYW1WZXJ0ZXg7CiB0eXBlZGVmIHZvaWQgKiBSc1Byb2dyYW1GcmFnbWVudDsKLXR5cGVkZWYgdm9pZCAqIFJzUHJvZ3JhbUZyYWdtZW50U3RvcmU7Cit0eXBlZGVmIHZvaWQgKiBSc1Byb2dyYW1TdG9yZTsKIHR5cGVkZWYgdm9pZCAqIFJzUHJvZ3JhbVJhc3RlcjsKIAogdHlwZWRlZiB2b2lkICgqIFJzQml0bWFwQ2FsbGJhY2tfdCkodm9pZCAqKTsKQEAgLTYwLDcgKzYzLDYgQEAKIFJzQ29udGV4dCByc0NvbnRleHRDcmVhdGUoUnNEZXZpY2UsIHVpbnQzMl90IHZlcnNpb24pOwogUnNDb250ZXh0IHJzQ29udGV4dENyZWF0ZUdMKFJzRGV2aWNlLCB1aW50MzJfdCB2ZXJzaW9uLCBib29sIHVzZURlcHRoKTsKIHZvaWQgcnNDb250ZXh0RGVzdHJveShSc0NvbnRleHQpOwotdm9pZCByc09iakRlc3Ryb3lPT0IoUnNDb250ZXh0LCB2b2lkICopOwogCiB1aW50MzJfdCByc0NvbnRleHRHZXRNZXNzYWdlKFJzQ29udGV4dCwgdm9pZCAqZGF0YSwgc2l6ZV90ICpyZWNlaXZlTGVuLCBzaXplX3QgYnVmZmVyTGVuLCBib29sIHdhaXQpOwogdm9pZCByc0NvbnRleHRJbml0VG9DbGllbnQoUnNDb250ZXh0KTsKQEAgLTgzLDYgKzg1LDggQEAKICAgICBSU19UWVBFX1VOU0lHTkVEXzMyLAogICAgIFJTX1RZUEVfVU5TSUdORURfNjQsCiAKKyAgICBSU19UWVBFX0JPT0xFQU4sCisKICAgICBSU19UWVBFX1VOU0lHTkVEXzVfNl81LAogICAgIFJTX1RZUEVfVU5TSUdORURfNV81XzVfMSwKICAgICBSU19UWVBFX1VOU0lHTkVEXzRfNF80XzQsCkBAIC0xMDEsMTkgKzEwNSwxMiBAQAogCiBlbnVtIFJzRGF0YUtpbmQgewogICAgIFJTX0tJTkRfVVNFUiwKLSAgICBSU19LSU5EX0NPTE9SLAotICAgIFJTX0tJTkRfUE9TSVRJT04sCi0gICAgUlNfS0lORF9URVhUVVJFLAotICAgIFJTX0tJTkRfTk9STUFMLAotICAgIFJTX0tJTkRfSU5ERVgsCi0gICAgUlNfS0lORF9QT0lOVF9TSVpFLAogCi0gICAgUlNfS0lORF9QSVhFTF9MLAorICAgIFJTX0tJTkRfUElYRUxfTCA9IDcsCiAgICAgUlNfS0lORF9QSVhFTF9BLAogICAgIFJTX0tJTkRfUElYRUxfTEEsCiAgICAgUlNfS0lORF9QSVhFTF9SR0IsCiAgICAgUlNfS0lORF9QSVhFTF9SR0JBLAotCiB9OwogCiBlbnVtIFJzU2FtcGxlclBhcmFtIHsKQEAgLTIwNSw5ICsyMDIsNzEgQEAKIGVudW0gUnNFcnJvciB7CiAgICAgUlNfRVJST1JfTk9ORSwKICAgICBSU19FUlJPUl9CQURfU0hBREVSLAotICAgIFJTX0VSUk9SX0JBRF9TQ1JJUFQKKyAgICBSU19FUlJPUl9CQURfU0NSSVBULAorICAgIFJTX0VSUk9SX0JBRF9WQUxVRSwKKyAgICBSU19FUlJPUl9PVVRfT0ZfTUVNT1JZCiB9OwogCitlbnVtIFJzQW5pbWF0aW9uSW50ZXJwb2xhdGlvbiB7CisgICAgUlNfQU5JTUFUSU9OX0lOVEVSUE9MQVRJT05fU1RFUCwKKyAgICBSU19BTklNQVRJT05fSU5URVJQT0xBVElPTl9MSU5FQVIsCisgICAgUlNfQU5JTUFUSU9OX0lOVEVSUE9MQVRJT05fQkVaSUVSLAorICAgIFJTX0FOSU1BVElPTl9JTlRFUlBPTEFUSU9OX0NBUkRJTkFMLAorICAgIFJTX0FOSU1BVElPTl9JTlRFUlBPTEFUSU9OX0hFUk1JVEUsCisgICAgUlNfQU5JTUFUSU9OX0lOVEVSUE9MQVRJT05fQlNQTElORQorfTsKKworZW51bSBSc0FuaW1hdGlvbkVkZ2UgeworICAgIFJTX0FOSU1BVElPTl9FREdFX1VOREVGSU5FRCwKKyAgICBSU19BTklNQVRJT05fRURHRV9DT05TVEFOVCwKKyAgICBSU19BTklNQVRJT05fRURHRV9HUkFESUVOVCwKKyAgICBSU19BTklNQVRJT05fRURHRV9DWUNMRSwKKyAgICBSU19BTklNQVRJT05fRURHRV9PU0NJTExBVEUsCisgICAgUlNfQU5JTUFUSU9OX0VER0VfQ1lMRV9SRUxBVElWRQorfTsKKworZW51bSBSc0EzRENsYXNzSUQgeworICAgIFJTX0EzRF9DTEFTU19JRF9VTktOT1dOLAorICAgIFJTX0EzRF9DTEFTU19JRF9NRVNILAorICAgIFJTX0EzRF9DTEFTU19JRF9UWVBFLAorICAgIFJTX0EzRF9DTEFTU19JRF9FTEVNRU5ULAorICAgIFJTX0EzRF9DTEFTU19JRF9BTExPQ0FUSU9OLAorICAgIFJTX0EzRF9DTEFTU19JRF9QUk9HUkFNX1ZFUlRFWCwKKyAgICBSU19BM0RfQ0xBU1NfSURfUFJPR1JBTV9SQVNURVIsCisgICAgUlNfQTNEX0NMQVNTX0lEX1BST0dSQU1fRlJBR01FTlQsCisgICAgUlNfQTNEX0NMQVNTX0lEX1BST0dSQU1fU1RPUkUsCisgICAgUlNfQTNEX0NMQVNTX0lEX1NBTVBMRVIsCisgICAgUlNfQTNEX0NMQVNTX0lEX0FOSU1BVElPTiwKKyAgICBSU19BM0RfQ0xBU1NfSURfTElHSFQsCisgICAgUlNfQTNEX0NMQVNTX0lEX0FEQVBURVJfMUQsCisgICAgUlNfQTNEX0NMQVNTX0lEX0FEQVBURVJfMkQsCisgICAgUlNfQTNEX0NMQVNTX0lEX1NDUklQVF9DCit9OworCitlbnVtIFJzQ3VsbE1vZGUgeworICAgIFJTX0NVTExfQkFDSywKKyAgICBSU19DVUxMX0ZST05ULAorICAgIFJTX0NVTExfTk9ORQorfTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFJzQTNEQ2xhc3NJRCBjbGFzc0lEOworICAgIGNvbnN0IGNoYXIqIG9iamVjdE5hbWU7Cit9IFJzRmlsZUluZGV4RW50cnk7CisKKy8vIFNjcmlwdCB0byBTY3JpcHQKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1aW50MzJfdCB4U3RhcnQ7CisgICAgdWludDMyX3QgeEVuZDsKKyAgICB1aW50MzJfdCB5U3RhcnQ7CisgICAgdWludDMyX3QgeUVuZDsKKyAgICB1aW50MzJfdCB6U3RhcnQ7CisgICAgdWludDMyX3QgekVuZDsKKyAgICB1aW50MzJfdCBhcnJheVN0YXJ0OworICAgIHVpbnQzMl90IGFycmF5RW5kOworCit9IFJzU2NyaXB0Q2FsbDsKKwogI2lmbmRlZiBOT19SU19GVU5DUwogI2luY2x1ZGUgInJzZ0FwaUZ1bmNEZWNsLmgiCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYnMvcnMvUmVuZGVyU2NyaXB0RW52LmggYi9saWJzL3JzL1JlbmRlclNjcmlwdEVudi5oCmluZGV4IDk5YjhjMDQuLjkyMjU5MDQgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvUmVuZGVyU2NyaXB0RW52LmgKKysrIGIvbGlicy9ycy9SZW5kZXJTY3JpcHRFbnYuaApAQCAtOSwxMCArOSwxMCBAQAogdHlwZWRlZiB2b2lkICogUnNFbGVtZW50OwogdHlwZWRlZiB2b2lkICogUnNTYW1wbGVyOwogdHlwZWRlZiB2b2lkICogUnNTY3JpcHQ7Ci10eXBlZGVmIHZvaWQgKiBSc1NpbXBsZU1lc2g7Cit0eXBlZGVmIHZvaWQgKiBSc01lc2g7CiB0eXBlZGVmIHZvaWQgKiBSc1R5cGU7CiB0eXBlZGVmIHZvaWQgKiBSc1Byb2dyYW1GcmFnbWVudDsKLXR5cGVkZWYgdm9pZCAqIFJzUHJvZ3JhbUZyYWdtZW50U3RvcmU7Cit0eXBlZGVmIHZvaWQgKiBSc1Byb2dyYW1TdG9yZTsKIHR5cGVkZWYgdm9pZCAqIFJzTGlnaHQ7CiAKIApkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ZpbG0vQW5kcm9pZC5tayBiL2xpYnMvcnMvamF2YS9GaWxtL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllNmVkN2UuLjAwMDAwMDAKLS0tIGEvbGlicy9ycy9qYXZhL0ZpbG0vQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLSMKLSMgQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLUxPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAotCi1MT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCi0jTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQucmVuZGVyc2NyaXB0Ci0KLUxPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBGaWxtCi0KLWluY2x1ZGUgJChCVUlMRF9QQUNLQUdFKQpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ZpbG0vQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2xpYnMvcnMvamF2YS9GaWxtL0FuZHJvaWRNYW5pZmVzdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1Y2U4YTEuLjAwMDAwMDAKLS0tIGEvbGlicy9ycy9qYXZhL0ZpbG0vQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHBhY2thZ2U9ImNvbS5hbmRyb2lkLmZpbG0iPgotICAgIDxhcHBsaWNhdGlvbiBhbmRyb2lkOmxhYmVsPSJGaWxtIj4KLSAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iRmlsbSIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2NyZWVuT3JpZW50YXRpb249InBvcnRyYWl0IgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0aGVtZT0iQGFuZHJvaWQ6c3R5bGUvVGhlbWUuQmxhY2suTm9UaXRsZUJhciI+Ci0gICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KLSAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+Ci0gICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+Ci0gICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+Ci0gICAgICAgIDwvYWN0aXZpdHk+Ci0gICAgPC9hcHBsaWNhdGlvbj4KLTwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDAxLnBuZyBiL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9kcmF3YWJsZS9wMDEucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWI5YmRiLi4wMDAwMDAwCi0tLSBhL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9kcmF3YWJsZS9wMDEucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AwMi5wbmcgYi9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDAyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODE2MmM4Mi4uMDAwMDAwMAotLS0gYS9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDAyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9kcmF3YWJsZS9wMDMucG5nIGIvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AwMy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzZTI2YzAuLjAwMDAwMDAKLS0tIGEvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AwMy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDA0LnBuZyBiL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9kcmF3YWJsZS9wMDQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWVlNjAzLi4wMDAwMDAwCi0tLSBhL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9kcmF3YWJsZS9wMDQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AwNS5wbmcgYi9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDA1LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFjNTI0OC4uMDAwMDAwMAotLS0gYS9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDA1LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9kcmF3YWJsZS9wMDYucG5nIGIvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AwNi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiNTEyNjEuLjAwMDAwMDAKLS0tIGEvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AwNi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDA3LnBuZyBiL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9kcmF3YWJsZS9wMDcucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOGJkOTM4Li4wMDAwMDAwCi0tLSBhL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9kcmF3YWJsZS9wMDcucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AwOC5wbmcgYi9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDA4LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWYxNzVlOC4uMDAwMDAwMAotLS0gYS9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDA4LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9kcmF3YWJsZS9wMDkucG5nIGIvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AwOS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiZjM4NzQuLjAwMDAwMDAKLS0tIGEvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AwOS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDEwLnBuZyBiL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9kcmF3YWJsZS9wMTAucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDg4MjdkLi4wMDAwMDAwCi0tLSBhL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9kcmF3YWJsZS9wMTAucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AxMS5wbmcgYi9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDExLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTI4OWY3MS4uMDAwMDAwMAotLS0gYS9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDExLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9kcmF3YWJsZS9wMTIucG5nIGIvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AxMi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxYWYxNmEuLjAwMDAwMDAKLS0tIGEvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AxMi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDEzLnBuZyBiL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9kcmF3YWJsZS9wMTMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDhiY2JlLi4wMDAwMDAwCi0tLSBhL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9kcmF3YWJsZS9wMTMucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL3Jhdy9maWxtaW1hZ2UuYyBiL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9yYXcvZmlsbWltYWdlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxNTRjNjguLjAwMDAwMDAKLS0tIGEvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL3Jhdy9maWxtaW1hZ2UuYworKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vLyBGb3VudGFpbiB0ZXN0IHNjcmlwdAotCi0jcHJhZ21hIHZlcnNpb24oMSkKLSNwcmFnbWEgc3RhdGVWZXJ0ZXgob3J0aG9XaW5kb3cpCi0jcHJhZ21hIHN0YXRlUmFzdGVyKGZsYXQpCi0jcHJhZ21hIHN0YXRlRnJhZ21lbnQoUGdtRnJhZ0JhY2tncm91bmQpCi0jcHJhZ21hIHN0YXRlU3RvcmUoTXlCbGVuZCkKLQotCi1pbnQgbWFpbih2b2lkKiBjb24sIGludCBmdCwgaW50IGxhdW5jaElEKSB7Ci0gICAgaW50IGNvdW50LCB0b3VjaCwgeCwgeSwgcmF0ZSwgbWF4TGlmZSwgbGlmZVNoaWZ0OwotICAgIGludCBsaWZlOwotICAgIGludCBjdCwgY3QyOwotICAgIGludCBuZXdQYXJ0OwotICAgIGludCBkcmF3Q291bnQ7Ci0gICAgaW50IGR4LCBkeSwgaWR4OwotICAgIGludCBwb3N4LHBvc3k7Ci0gICAgaW50IGM7Ci0gICAgaW50IHNyY0lkeDsKLSAgICBpbnQgZHN0SWR4OwotCi0gICAgY291bnQgPSBsb2FkSTMyKGNvbiwgMCwgMSk7Ci0gICAgdG91Y2ggPSBsb2FkSTMyKGNvbiwgMCwgMik7Ci0gICAgeCA9IGxvYWRJMzIoY29uLCAwLCAzKTsKLSAgICB5ID0gbG9hZEkzMihjb24sIDAsIDQpOwotCi0gICAgcmF0ZSA9IDQ7Ci0gICAgbWF4TGlmZSA9IChjb3VudCAvIHJhdGUpIC0gMTsKLSAgICBsaWZlU2hpZnQgPSAwOwotICAgIHsKLSAgICAgICAgbGlmZSA9IG1heExpZmU7Ci0gICAgICAgIHdoaWxlIChsaWZlID4gMjU1KSB7Ci0gICAgICAgICAgICBsaWZlID0gbGlmZSA+PiAxOwotICAgICAgICAgICAgbGlmZVNoaWZ0ICsrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgZHJhd1JlY3QoY29uLCAwLCAyNTYsIDAsIDUxMik7Ci0gICAgY29udGV4dEJpbmRQcm9ncmFtRnJhZ21lbnQoY29uLCBOQU1FRF9QZ21GcmFnUGFydHMpOwotCi0gICAgaWYgKHRvdWNoKSB7Ci0gICAgICAgIG5ld1BhcnQgPSBsb2FkSTMyKGNvbiwgMiwgMCk7Ci0gICAgICAgIGZvciAoY3QyPTA7IGN0MjxyYXRlOyBjdDIrKykgewotICAgICAgICAgICAgZHggPSBzY3JpcHRSYW5kKGNvbiwgMHgxMDAwMCkgLSAweDgwMDA7Ci0gICAgICAgICAgICBkeSA9IHNjcmlwdFJhbmQoY29uLCAweDEwMDAwKSAtIDB4ODAwMDsKLQotICAgICAgICAgICAgaWR4ID0gbmV3UGFydCAqIDUgKyAxOwotICAgICAgICAgICAgc3RvcmVJMzIoY29uLCAyLCBpZHgsIGR4KTsKLSAgICAgICAgICAgIHN0b3JlSTMyKGNvbiwgMiwgaWR4ICsgMSwgZHkpOwotICAgICAgICAgICAgc3RvcmVJMzIoY29uLCAyLCBpZHggKyAyLCBtYXhMaWZlKTsKLSAgICAgICAgICAgIHN0b3JlSTMyKGNvbiwgMiwgaWR4ICsgMywgeCA8PCAxNik7Ci0gICAgICAgICAgICBzdG9yZUkzMihjb24sIDIsIGlkeCArIDQsIHkgPDwgMTYpOwotCi0gICAgICAgICAgICBuZXdQYXJ0Kys7Ci0gICAgICAgICAgICBpZiAobmV3UGFydCA+PSBjb3VudCkgewotICAgICAgICAgICAgICAgIG5ld1BhcnQgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHN0b3JlSTMyKGNvbiwgMiwgMCwgbmV3UGFydCk7Ci0gICAgfQotCi0gICAgZHJhd0NvdW50ID0gMDsKLSAgICBmb3IgKGN0PTA7IGN0IDwgY291bnQ7IGN0KyspIHsKLSAgICAgICAgc3JjSWR4ID0gY3QgKiA1ICsgMTsKLQotICAgICAgICBkeCA9IGxvYWRJMzIoY29uLCAyLCBzcmNJZHgpOwotICAgICAgICBkeSA9IGxvYWRJMzIoY29uLCAyLCBzcmNJZHggKyAxKTsKLSAgICAgICAgbGlmZSA9IGxvYWRJMzIoY29uLCAyLCBzcmNJZHggKyAyKTsKLSAgICAgICAgcG9zeCA9IGxvYWRJMzIoY29uLCAyLCBzcmNJZHggKyAzKTsKLSAgICAgICAgcG9zeSA9IGxvYWRJMzIoY29uLCAyLCBzcmNJZHggKyA0KTsKLQotICAgICAgICBpZiAobGlmZSkgewotICAgICAgICAgICAgaWYgKHBvc3kgPCAoNDgwIDw8IDE2KSkgewotICAgICAgICAgICAgICAgIGRzdElkeCA9IGRyYXdDb3VudCAqIDk7Ci0gICAgICAgICAgICAgICAgYyA9IDB4ZmZhZmNmIHwgKChsaWZlID4+IGxpZmVTaGlmdCkgPDwgMjQpOwotCi0gICAgICAgICAgICAgICAgc3RvcmVVMzIoY29uLCAxLCBkc3RJZHgsIGMpOwotICAgICAgICAgICAgICAgIHN0b3JlSTMyKGNvbiwgMSwgZHN0SWR4ICsgMSwgcG9zeCk7Ci0gICAgICAgICAgICAgICAgc3RvcmVJMzIoY29uLCAxLCBkc3RJZHggKyAyLCBwb3N5KTsKLQotICAgICAgICAgICAgICAgIHN0b3JlVTMyKGNvbiwgMSwgZHN0SWR4ICsgMywgYyk7Ci0gICAgICAgICAgICAgICAgc3RvcmVJMzIoY29uLCAxLCBkc3RJZHggKyA0LCBwb3N4ICsgMHgxMDAwMCk7Ci0gICAgICAgICAgICAgICAgc3RvcmVJMzIoY29uLCAxLCBkc3RJZHggKyA1LCBwb3N5ICsgZHkgKiA0KTsKLQotICAgICAgICAgICAgICAgIHN0b3JlVTMyKGNvbiwgMSwgZHN0SWR4ICsgNiwgYyk7Ci0gICAgICAgICAgICAgICAgc3RvcmVJMzIoY29uLCAxLCBkc3RJZHggKyA3LCBwb3N4IC0gMHgxMDAwMCk7Ci0gICAgICAgICAgICAgICAgc3RvcmVJMzIoY29uLCAxLCBkc3RJZHggKyA4LCBwb3N5ICsgZHkgKiA0KTsKLSAgICAgICAgICAgICAgICBkcmF3Q291bnQgKys7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChkeSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgZHkgPSAoLWR5KSA+PiAxOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcG9zeCA9IHBvc3ggKyBkeDsKLSAgICAgICAgICAgIHBvc3kgPSBwb3N5ICsgZHk7Ci0gICAgICAgICAgICBkeSA9IGR5ICsgMHg0MDA7Ci0gICAgICAgICAgICBsaWZlIC0tOwotCi0gICAgICAgICAgICAvL3N0b3JlSTMyKGNvbiwgMiwgc3JjSWR4LCBkeCk7Ci0gICAgICAgICAgICBzdG9yZUkzMihjb24sIDIsIHNyY0lkeCArIDEsIGR5KTsKLSAgICAgICAgICAgIHN0b3JlSTMyKGNvbiwgMiwgc3JjSWR4ICsgMiwgbGlmZSk7Ci0gICAgICAgICAgICBzdG9yZUkzMihjb24sIDIsIHNyY0lkeCArIDMsIHBvc3gpOwotICAgICAgICAgICAgc3RvcmVJMzIoY29uLCAyLCBzcmNJZHggKyA0LCBwb3N5KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGRyYXdUcmlhbmdsZUFycmF5KGNvbiwgTkFNRURfUGFydEJ1ZmZlciwgZHJhd0NvdW50KTsKLSAgICByZXR1cm4gMTsKLX0KZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9yYXcvZmlsbXN0cmlwLmMgYi9saWJzL3JzL2phdmEvRmlsbS9yZXMvcmF3L2ZpbG1zdHJpcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjc1Njc1Li4wMDAwMDAwCi0tLSBhL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9yYXcvZmlsbXN0cmlwLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vLyBGb3VudGFpbiB0ZXN0IHNjcmlwdAotCi0jcHJhZ21hIHZlcnNpb24oMSkKLSNwcmFnbWEgc3RhdGVWZXJ0ZXgoUFZCYWNrZ3JvdW5kKQotI3ByYWdtYSBzdGF0ZUZyYWdtZW50KFBGQmFja2dyb3VuZCkKLSNwcmFnbWEgc3RhdGVTdG9yZShQU0JhY2tncm91bmQpCi0KLSNkZWZpbmUgU1RBVEVfVFJJQU5HTEVfT0ZGU0VUX0NPVU5UIDAKLSNkZWZpbmUgU1RBVEVfTEFTVF9GT0NVUyAxCi0KLQotLy8gVGhlIHNjcmlwdCBlbnZpcm9tZW50IGhhcyAzIGVudiBhbGxvY2F0aW9ucy4KLS8vIGJhbmswOiAocikgVGhlIGVudmlyb21lbnQgc3RydWN0dXJlCi0vLyBiYW5rMTogKHIpIFRoZSBwb3NpdGlvbiBpbmZvcm1hdGlvbgotLy8gYmFuazI6IChydykgVGhlIHRlbXBvcmFyeSB0ZXh0dXJlIHN0YXRlCi0KLWludCBsYXN0Rm9jdXM7Ci0KLWludCBtYWluKGludCBpbmRleCkKLXsKLSAgICBmbG9hdCBtYXQxWzE2XTsKLQotICAgIGZsb2F0IHRyYW5zID0gUG9zLT50cmFuc2xhdGU7Ci0gICAgZmxvYXQgcm90ID0gUG9zLT5yb3RhdGU7Ci0KLSAgICBtYXRyaXhMb2FkU2NhbGUobWF0MSwgMi5mLCAyLmYsIDIuZik7Ci0gICAgbWF0cml4VHJhbnNsYXRlKG1hdDEsIDAuZiwgMC5mLCB0cmFucyk7Ci0gICAgbWF0cml4Um90YXRlKG1hdDEsIDkwLmYsIDAuZiwgMC5mLCAxLmYpOwotICAgIG1hdHJpeFJvdGF0ZShtYXQxLCByb3QsIDEuZiwgMC5mLCAwLmYpOwotICAgIHZwTG9hZE1vZGVsTWF0cml4KG1hdDEpOwotCi0gICAgLy8gRHJhdyB0aGUgbGlnaHRpbmcgZWZmZWN0IGluIHRoZSBzdHJpcCBhbmQgZmlsbCB0aGUgWiBidWZmZXIuCi0gICAgZHJhd1NpbXBsZU1lc2goTkFNRURfbWVzaCk7Ci0KLSAgICAvLyBTdGFydCBvZiBpbWFnZXMuCi0gICAgYmluZFByb2dyYW1TdG9yZShOQU1FRF9QU0ltYWdlcyk7Ci0gICAgYmluZFByb2dyYW1GcmFnbWVudChOQU1FRF9QRkltYWdlcyk7Ci0gICAgYmluZFByb2dyYW1WZXJ0ZXgoTkFNRURfUFZJbWFnZXMpOwotCi0gICAgZmxvYXQgZm9jdXNQb3MgPSBQb3MtPmZvY3VzOwotICAgIGludCBmb2N1c0lEID0gMDsKLSAgICBpbnQgbGFzdEZvY3VzSUQgPSBsb2FkSTMyKDIsIFNUQVRFX0xBU1RfRk9DVVMpOwotICAgIGludCBpbWdDb3VudCA9IDEzOwotCi0gICAgaWYgKHRyYW5zID4gKC0uM2YpKSB7Ci0gICAgICAgIGZvY3VzSUQgPSAtMS4wZiAtIGZvY3VzUG9zOwotICAgICAgICBpZiAoZm9jdXNJRCA+PSBpbWdDb3VudCkgewotICAgICAgICAgICAgZm9jdXNJRCA9IC0xOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZm9jdXNJRCA9IC0xOwotICAgIH0KLQotICAgIC8qCi0gICAgaWYgKGZvY3VzSUQgIT0gbGFzdEZvY3VzSUQpIHsKLSAgICAgICAgaWYgKGxhc3RGb2N1c0lEID49IDApIHsKLSAgICAgICAgICAgIHVwbG9hZFRvVGV4dHVyZShjb24sIGVudi0+dGV4W2xhc3RGb2N1c0lEXSwgMSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGZvY3VzSUQgPj0gMCkgewotICAgICAgICAgICAgdXBsb2FkVG9UZXh0dXJlKGNvbiwgZW52LT50ZXhbZm9jdXNJRF0sIDApOwotICAgICAgICB9Ci0gICAgfQotICAgICovCi0gICAgbGFzdEZvY3VzID0gZm9jdXNJRDsKLQotICAgIGludCB0cmlhbmdsZU9mZnNldHNDb3VudCA9IFBvcy0+dHJpYW5nbGVPZmZzZXRDb3VudDsKLQotICAgIGludCBpbWdJZCA9IDA7Ci0gICAgZm9yIChpbWdJZD0xOyBpbWdJZCA8PSBpbWdDb3VudDsgaW1nSWQrKykgewotICAgICAgICBmbG9hdCBwb3MgPSBmb2N1c1BvcyArIGltZ0lkICsgMC40ZjsKLSAgICAgICAgaW50IG9mZnNldCA9IChpbnQpZmxvb3JmKHBvcyAqIDIuZik7Ci0gICAgICAgIHBvcyA9IHBvcyAtIDAuNzVmOwotCi0gICAgICAgIG9mZnNldCA9IG9mZnNldCArIHRyaWFuZ2xlT2Zmc2V0c0NvdW50IC8gMjsKLSAgICAgICAgaWYgKCEoKG9mZnNldCA8IDApIHx8IChvZmZzZXQgPj0gdHJpYW5nbGVPZmZzZXRzQ291bnQpKSkgewotICAgICAgICAgICAgaW50IHN0YXJ0ID0gb2Zmc2V0IC0yOwotICAgICAgICAgICAgaW50IGVuZCA9IG9mZnNldCArIDI7Ci0KLSAgICAgICAgICAgIGlmIChzdGFydCA8IDApIHsKLSAgICAgICAgICAgICAgICBzdGFydCA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZW5kID49IHRyaWFuZ2xlT2Zmc2V0c0NvdW50KSB7Ci0gICAgICAgICAgICAgICAgZW5kID0gdHJpYW5nbGVPZmZzZXRzQ291bnQtMTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYmluZFRleHR1cmUoTkFNRURfUEZJbWFnZXMsIDAsIGxvYWRJMzIoMCwgaW1nSWQgLSAxKSk7Ci0gICAgICAgICAgICBtYXRyaXhMb2FkVHJhbnNsYXRlKG1hdDEsIC1wb3MgLSBsb2FkRig1LCB0cmlhbmdsZU9mZnNldHNDb3VudCAvIDIpLCAwLCAwKTsKLSAgICAgICAgICAgIHZwTG9hZFRleHR1cmVNYXRyaXgobWF0MSk7Ci0gICAgICAgICAgICBkcmF3U2ltcGxlTWVzaFJhbmdlKE5BTUVEX21lc2gsIGxvYWRJMzIoNCwgc3RhcnQpLCAobG9hZEkzMig0LCBlbmQpIC0gbG9hZEkzMig0LCBzdGFydCkpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ZpbG0vc3JjL2NvbS9hbmRyb2lkL2ZpbG0vRmlsbS5qYXZhIGIvbGlicy9ycy9qYXZhL0ZpbG0vc3JjL2NvbS9hbmRyb2lkL2ZpbG0vRmlsbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTk5ODE2Li4wMDAwMDAwCi0tLSBhL2xpYnMvcnMvamF2YS9GaWxtL3NyYy9jb20vYW5kcm9pZC9maWxtL0ZpbG0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmZpbG07Ci0KLWltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5SU1N1cmZhY2VWaWV3OwotaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0LlJlbmRlclNjcmlwdDsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbjsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5Mb29wZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3MuU3lzdGVtOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Db25maWc7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuTWVudTsKLWltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUl0ZW07Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvdzsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5CdXR0b247Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuTGlzdFZpZXc7Ci0KLWltcG9ydCBqYXZhLmxhbmcuUnVudGltZTsKLQotcHVibGljIGNsYXNzIEZpbG0gZXh0ZW5kcyBBY3Rpdml0eSB7Ci0gICAgLy9FdmVudExpc3RlbmVyIG1MaXN0ZW5lciA9IG5ldyBFdmVudExpc3RlbmVyKCk7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJsaWJSU19qbmkiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBMT0dfRU5BQkxFRCA9IERFQlVHID8gQ29uZmlnLkxPR0QgOiBDb25maWcuTE9HVjsKLQotICAgIHByaXZhdGUgRmlsbVZpZXcgbVZpZXc7Ci0KLSAgICAvLyBnZXQgdGhlIGN1cnJlbnQgbG9vcGVyIChmcm9tIHlvdXIgQWN0aXZpdHkgVUkgdGhyZWFkIGZvciBpbnN0YW5jZQotCi0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBpY2ljbGUpIHsKLSAgICAgICAgc3VwZXIub25DcmVhdGUoaWNpY2xlKTsKLQotICAgICAgICAvLyBDcmVhdGUgb3VyIFByZXZpZXcgdmlldyBhbmQgc2V0IGl0IGFzIHRoZSBjb250ZW50IG9mIG91cgotICAgICAgICAvLyBBY3Rpdml0eQotICAgICAgICBtVmlldyA9IG5ldyBGaWxtVmlldyh0aGlzKTsKLSAgICAgICAgc2V0Q29udGVudFZpZXcobVZpZXcpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uUmVzdW1lKCkgewotICAgICAgICAvLyBJZGVhbGx5IGEgZ2FtZSBzaG91bGQgaW1wbGVtZW50IG9uUmVzdW1lKCkgYW5kIG9uUGF1c2UoKQotICAgICAgICAvLyB0byB0YWtlIGFwcHJvcHJpYXRlIGFjdGlvbiB3aGVuIHRoZSBhY3Rpdml0eSBsb29zZXMgZm9jdXMKLSAgICAgICAgc3VwZXIub25SZXN1bWUoKTsKLSAgICAgICAgbVZpZXcub25SZXN1bWUoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBvblBhdXNlKCkgewotICAgICAgICAvLyBJZGVhbGx5IGEgZ2FtZSBzaG91bGQgaW1wbGVtZW50IG9uUmVzdW1lKCkgYW5kIG9uUGF1c2UoKQotICAgICAgICAvLyB0byB0YWtlIGFwcHJvcHJpYXRlIGFjdGlvbiB3aGVuIHRoZSBhY3Rpdml0eSBsb29zZXMgZm9jdXMKLSAgICAgICAgc3VwZXIub25QYXVzZSgpOwotICAgICAgICBtVmlldy5vblBhdXNlKCk7Ci0KLSAgICAgICAgUnVudGltZS5nZXRSdW50aW1lKCkuZXhpdCgwKTsKLSAgICB9Ci0KLQotICAgIHN0YXRpYyB2b2lkIGxvZyhTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBpZiAoTE9HX0VOQUJMRUQpIHsKLSAgICAgICAgICAgIExvZy52KExPR19UQUcsIG1lc3NhZ2UpOwotICAgICAgICB9Ci0gICAgfQotCi0KLX0KLQpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ZpbG0vc3JjL2NvbS9hbmRyb2lkL2ZpbG0vRmlsbVJTLmphdmEgYi9saWJzL3JzL2phdmEvRmlsbS9zcmMvY29tL2FuZHJvaWQvZmlsbS9GaWxtUlMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2QwNDUwMi4uMDAwMDAwMAotLS0gYS9saWJzL3JzL2phdmEvRmlsbS9zcmMvY29tL2FuZHJvaWQvZmlsbS9GaWxtUlMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5maWxtOwotCi1pbXBvcnQgamF2YS5pby5Xcml0ZXI7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotCi1pbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuKjsKLQotcHVibGljIGNsYXNzIEZpbG1SUyB7Ci0gICAgY2xhc3MgU3RyaXBQb3NpdGlvbiB7Ci0gICAgICAgIHB1YmxpYyBmbG9hdCB0cmFuc2xhdGU7Ci0gICAgICAgIHB1YmxpYyBmbG9hdCByb3RhdGU7Ci0gICAgICAgIHB1YmxpYyBmbG9hdCBmb2N1czsKLSAgICAgICAgcHVibGljIGludCB0cmlhbmdsZU9mZnNldENvdW50OwotICAgIH0KLSAgICBTdHJpcFBvc2l0aW9uIG1Qb3MgPSBuZXcgU3RyaXBQb3NpdGlvbigpOwotCi0KLSAgICBwcml2YXRlIGZpbmFsIGludCBTVEFURV9MQVNUX0ZPQ1VTID0gMTsKLQotICAgIHB1YmxpYyBGaWxtUlMoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgaW5pdChSZW5kZXJTY3JpcHRHTCBycywgUmVzb3VyY2VzIHJlcywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0gICAgICAgIG1SUyA9IHJzOwotICAgICAgICBtUmVzID0gcmVzOwotICAgICAgICBpbml0UlMoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRGaWxtU3RyaXBQb3NpdGlvbihpbnQgeCwgaW50IHkpCi0gICAgewotICAgICAgICBpZiAoeCA8IDUwKSB7Ci0gICAgICAgICAgICB4ID0gNTA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHggPiAyNzApIHsKLSAgICAgICAgICAgIHggPSAyNzA7Ci0gICAgICAgIH0KLQotICAgICAgICBmbG9hdCBhbmltID0gKChmbG9hdCl4LTUwKSAvIDI3MC5mOwotICAgICAgICBtUG9zLnRyYW5zbGF0ZSA9IDJmICogYW5pbSArIDAuNWY7ICAgLy8gdHJhbnNsYXRpb24KLSAgICAgICAgbVBvcy5yb3RhdGUgPSAoYW5pbSAqIDQwKTsgIC8vIHJvdGF0aW9uCi0gICAgICAgIG1Qb3MuZm9jdXMgPSAoKGZsb2F0KXkpIC8gMTYuZiAtIDEwLmY7ICAvLyBmb2N1c1BvcwotICAgICAgICBtUG9zLnRyaWFuZ2xlT2Zmc2V0Q291bnQgPSBtRlNNLm1UcmlhbmdsZU9mZnNldHNDb3VudDsKLSAgICAgICAgbUFsbG9jUG9zLmRhdGEobVBvcyk7Ci0gICAgfQotCi0KLSAgICBwcml2YXRlIFJlc291cmNlcyBtUmVzOwotICAgIHByaXZhdGUgUmVuZGVyU2NyaXB0R0wgbVJTOwotICAgIHByaXZhdGUgU2NyaXB0IG1TY3JpcHRTdHJpcDsKLSAgICBwcml2YXRlIFNjcmlwdCBtU2NyaXB0SW1hZ2U7Ci0gICAgcHJpdmF0ZSBTYW1wbGVyIG1TYW1wbGVyOwotICAgIHByaXZhdGUgUHJvZ3JhbVN0b3JlIG1QU0JhY2tncm91bmQ7Ci0gICAgcHJpdmF0ZSBQcm9ncmFtU3RvcmUgbVBTSW1hZ2VzOwotICAgIHByaXZhdGUgUHJvZ3JhbUZyYWdtZW50IG1QRkJhY2tncm91bmQ7Ci0gICAgcHJpdmF0ZSBQcm9ncmFtRnJhZ21lbnQgbVBGSW1hZ2VzOwotICAgIHByaXZhdGUgUHJvZ3JhbVZlcnRleCBtUFZCYWNrZ3JvdW5kOwotICAgIHByaXZhdGUgUHJvZ3JhbVZlcnRleCBtUFZJbWFnZXM7Ci0gICAgcHJpdmF0ZSBQcm9ncmFtVmVydGV4Lk1hdHJpeEFsbG9jYXRpb24gbVBWQTsKLSAgICBwcml2YXRlIFR5cGUgbVN0cmlwUG9zaXRpb25UeXBlOwotCi0gICAgcHJpdmF0ZSBBbGxvY2F0aW9uIG1JbWFnZXNbXTsKLSAgICBwcml2YXRlIEFsbG9jYXRpb24gbUFsbG9jSURzOwotICAgIHByaXZhdGUgQWxsb2NhdGlvbiBtQWxsb2NQb3M7Ci0gICAgcHJpdmF0ZSBBbGxvY2F0aW9uIG1BbGxvY1N0YXRlOwotICAgIHByaXZhdGUgQWxsb2NhdGlvbiBtQWxsb2NQVjsKLSAgICBwcml2YXRlIEFsbG9jYXRpb24gbUFsbG9jT2Zmc2V0c1RleDsKLSAgICBwcml2YXRlIEFsbG9jYXRpb24gbUFsbG9jT2Zmc2V0czsKLQotICAgIHByaXZhdGUgU2ltcGxlTWVzaCBtTWVzaDsKLSAgICBwcml2YXRlIExpZ2h0IG1MaWdodDsKLQotICAgIHByaXZhdGUgRmlsbVN0cmlwTWVzaCBtRlNNOwotCi0gICAgcHJpdmF0ZSBpbnRbXSBtQnVmZmVySURzOwotICAgIHByaXZhdGUgZmxvYXRbXSBtQnVmZmVyUG9zID0gbmV3IGZsb2F0WzNdOwotICAgIHByaXZhdGUgaW50W10gbUJ1ZmZlclN0YXRlOwotCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRQRlMoKSB7Ci0gICAgICAgIFByb2dyYW1TdG9yZS5CdWlsZGVyIGIgPSBuZXcgUHJvZ3JhbVN0b3JlLkJ1aWxkZXIobVJTLCBudWxsLCBudWxsKTsKLQotICAgICAgICBiLnNldERlcHRoRnVuYyhQcm9ncmFtU3RvcmUuRGVwdGhGdW5jLkxFU1MpOwotICAgICAgICBiLnNldERpdGhlckVuYWJsZSh0cnVlKTsKLSAgICAgICAgYi5zZXREZXB0aE1hc2sodHJ1ZSk7Ci0gICAgICAgIG1QU0JhY2tncm91bmQgPSBiLmNyZWF0ZSgpOwotICAgICAgICBtUFNCYWNrZ3JvdW5kLnNldE5hbWUoIlBTQmFja2dyb3VuZCIpOwotCi0gICAgICAgIGIuc2V0RGVwdGhGdW5jKFByb2dyYW1TdG9yZS5EZXB0aEZ1bmMuRVFVQUwpOwotICAgICAgICBiLnNldERpdGhlckVuYWJsZShmYWxzZSk7Ci0gICAgICAgIGIuc2V0RGVwdGhNYXNrKGZhbHNlKTsKLSAgICAgICAgYi5zZXRCbGVuZEZ1bmMoUHJvZ3JhbVN0b3JlLkJsZW5kU3JjRnVuYy5PTkUsCi0gICAgICAgICAgICAgICAgICAgICAgIFByb2dyYW1TdG9yZS5CbGVuZERzdEZ1bmMuT05FKTsKLSAgICAgICAgbVBTSW1hZ2VzID0gYi5jcmVhdGUoKTsKLSAgICAgICAgbVBTSW1hZ2VzLnNldE5hbWUoIlBTSW1hZ2VzIik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRQRigpIHsKLSAgICAgICAgU2FtcGxlci5CdWlsZGVyIGJzID0gbmV3IFNhbXBsZXIuQnVpbGRlcihtUlMpOwotICAgICAgICBicy5zZXRNaW4oU2FtcGxlci5WYWx1ZS5MSU5FQVIpOy8vX01JUF9MSU5FQVIpOwotICAgICAgICBicy5zZXRNYWcoU2FtcGxlci5WYWx1ZS5MSU5FQVIpOwotICAgICAgICBicy5zZXRXcmFwUyhTYW1wbGVyLlZhbHVlLkNMQU1QKTsKLSAgICAgICAgYnMuc2V0V3JhcFQoU2FtcGxlci5WYWx1ZS5XUkFQKTsKLSAgICAgICAgbVNhbXBsZXIgPSBicy5jcmVhdGUoKTsKLQotICAgICAgICBQcm9ncmFtRnJhZ21lbnQuQnVpbGRlciBiID0gbmV3IFByb2dyYW1GcmFnbWVudC5CdWlsZGVyKG1SUyk7Ci0gICAgICAgIG1QRkJhY2tncm91bmQgPSBiLmNyZWF0ZSgpOwotICAgICAgICBtUEZCYWNrZ3JvdW5kLnNldE5hbWUoIlBGQmFja2dyb3VuZCIpOwotCi0gICAgICAgIGIgPSBuZXcgUHJvZ3JhbUZyYWdtZW50LkJ1aWxkZXIobVJTKTsKLSAgICAgICAgYi5zZXRUZXh0dXJlKFByb2dyYW1GcmFnbWVudC5CdWlsZGVyLkVudk1vZGUuUkVQTEFDRSwKLSAgICAgICAgICAgICAgICAgICAgIFByb2dyYW1GcmFnbWVudC5CdWlsZGVyLkZvcm1hdC5SR0JBLCAwKTsKLSAgICAgICAgbVBGSW1hZ2VzID0gYi5jcmVhdGUoKTsKLSAgICAgICAgbVBGSW1hZ2VzLmJpbmRTYW1wbGVyKG1TYW1wbGVyLCAwKTsKLSAgICAgICAgbVBGSW1hZ2VzLnNldE5hbWUoIlBGSW1hZ2VzIik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRQVigpIHsKLSAgICAgICAgbUxpZ2h0ID0gKG5ldyBMaWdodC5CdWlsZGVyKG1SUykpLmNyZWF0ZSgpOwotICAgICAgICBtTGlnaHQuc2V0UG9zaXRpb24oMCwgLTAuNWYsIC0xLjBmKTsKLQotICAgICAgICBQcm9ncmFtVmVydGV4LkJ1aWxkZXIgcHZiID0gbmV3IFByb2dyYW1WZXJ0ZXguQnVpbGRlcihtUlMsIG51bGwsIG51bGwpOwotICAgICAgICAvL3B2Yi5hZGRMaWdodChtTGlnaHQpOwotICAgICAgICBtUFZCYWNrZ3JvdW5kID0gcHZiLmNyZWF0ZSgpOwotICAgICAgICBtUFZCYWNrZ3JvdW5kLnNldE5hbWUoIlBWQmFja2dyb3VuZCIpOwotCi0gICAgICAgIHB2YiA9IG5ldyBQcm9ncmFtVmVydGV4LkJ1aWxkZXIobVJTLCBudWxsLCBudWxsKTsKLSAgICAgICAgcHZiLnNldFRleHR1cmVNYXRyaXhFbmFibGUodHJ1ZSk7Ci0gICAgICAgIG1QVkltYWdlcyA9IHB2Yi5jcmVhdGUoKTsKLSAgICAgICAgbVBWSW1hZ2VzLnNldE5hbWUoIlBWSW1hZ2VzIik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGxvYWRJbWFnZXMoKSB7Ci0gICAgICAgIG1CdWZmZXJJRHMgPSBuZXcgaW50WzEzXTsKLSAgICAgICAgbUltYWdlcyA9IG5ldyBBbGxvY2F0aW9uWzEzXTsKLSAgICAgICAgbUFsbG9jSURzID0gQWxsb2NhdGlvbi5jcmVhdGVTaXplZChtUlMsCi0gICAgICAgICAgICBFbGVtZW50LmNyZWF0ZVVzZXIobVJTLCBFbGVtZW50LkRhdGFUeXBlLkZMT0FUXzMyKSwKLSAgICAgICAgICAgIG1CdWZmZXJJRHMubGVuZ3RoKTsKLQotICAgICAgICBFbGVtZW50IGllID0gRWxlbWVudC5jcmVhdGVQaXhlbChtUlMsIEVsZW1lbnQuRGF0YVR5cGUuVU5TSUdORURfNV82XzUsIEVsZW1lbnQuRGF0YUtpbmQuUElYRUxfUkdCKTsKLSAgICAgICAgbUltYWdlc1swXSA9IEFsbG9jYXRpb24uY3JlYXRlRnJvbUJpdG1hcFJlc291cmNlQm94ZWQobVJTLCBtUmVzLCBSLmRyYXdhYmxlLnAwMSwgaWUsIHRydWUpOwotICAgICAgICBtSW1hZ2VzWzFdID0gQWxsb2NhdGlvbi5jcmVhdGVGcm9tQml0bWFwUmVzb3VyY2VCb3hlZChtUlMsIG1SZXMsIFIuZHJhd2FibGUucDAyLCBpZSwgdHJ1ZSk7Ci0gICAgICAgIG1JbWFnZXNbMl0gPSBBbGxvY2F0aW9uLmNyZWF0ZUZyb21CaXRtYXBSZXNvdXJjZUJveGVkKG1SUywgbVJlcywgUi5kcmF3YWJsZS5wMDMsIGllLCB0cnVlKTsKLSAgICAgICAgbUltYWdlc1szXSA9IEFsbG9jYXRpb24uY3JlYXRlRnJvbUJpdG1hcFJlc291cmNlQm94ZWQobVJTLCBtUmVzLCBSLmRyYXdhYmxlLnAwNCwgaWUsIHRydWUpOwotICAgICAgICBtSW1hZ2VzWzRdID0gQWxsb2NhdGlvbi5jcmVhdGVGcm9tQml0bWFwUmVzb3VyY2VCb3hlZChtUlMsIG1SZXMsIFIuZHJhd2FibGUucDA1LCBpZSwgdHJ1ZSk7Ci0gICAgICAgIG1JbWFnZXNbNV0gPSBBbGxvY2F0aW9uLmNyZWF0ZUZyb21CaXRtYXBSZXNvdXJjZUJveGVkKG1SUywgbVJlcywgUi5kcmF3YWJsZS5wMDYsIGllLCB0cnVlKTsKLSAgICAgICAgbUltYWdlc1s2XSA9IEFsbG9jYXRpb24uY3JlYXRlRnJvbUJpdG1hcFJlc291cmNlQm94ZWQobVJTLCBtUmVzLCBSLmRyYXdhYmxlLnAwNywgaWUsIHRydWUpOwotICAgICAgICBtSW1hZ2VzWzddID0gQWxsb2NhdGlvbi5jcmVhdGVGcm9tQml0bWFwUmVzb3VyY2VCb3hlZChtUlMsIG1SZXMsIFIuZHJhd2FibGUucDA4LCBpZSwgdHJ1ZSk7Ci0gICAgICAgIG1JbWFnZXNbOF0gPSBBbGxvY2F0aW9uLmNyZWF0ZUZyb21CaXRtYXBSZXNvdXJjZUJveGVkKG1SUywgbVJlcywgUi5kcmF3YWJsZS5wMDksIGllLCB0cnVlKTsKLSAgICAgICAgbUltYWdlc1s5XSA9IEFsbG9jYXRpb24uY3JlYXRlRnJvbUJpdG1hcFJlc291cmNlQm94ZWQobVJTLCBtUmVzLCBSLmRyYXdhYmxlLnAxMCwgaWUsIHRydWUpOwotICAgICAgICBtSW1hZ2VzWzEwXSA9IEFsbG9jYXRpb24uY3JlYXRlRnJvbUJpdG1hcFJlc291cmNlQm94ZWQobVJTLCBtUmVzLCBSLmRyYXdhYmxlLnAxMSwgaWUsIHRydWUpOwotICAgICAgICBtSW1hZ2VzWzExXSA9IEFsbG9jYXRpb24uY3JlYXRlRnJvbUJpdG1hcFJlc291cmNlQm94ZWQobVJTLCBtUmVzLCBSLmRyYXdhYmxlLnAxMiwgaWUsIHRydWUpOwotICAgICAgICBtSW1hZ2VzWzEyXSA9IEFsbG9jYXRpb24uY3JlYXRlRnJvbUJpdG1hcFJlc291cmNlQm94ZWQobVJTLCBtUmVzLCBSLmRyYXdhYmxlLnAxMywgaWUsIHRydWUpOwotCi0gICAgICAgIGludCBibGFja1tdID0gbmV3IGludFsxMDI0XTsKLSAgICAgICAgZm9yKGludCBjdD0wOyBjdCA8IG1JbWFnZXMubGVuZ3RoOyBjdCsrKSB7Ci0gICAgICAgICAgICBBbGxvY2F0aW9uLkFkYXB0ZXIyRCBhID0gbUltYWdlc1tjdF0uY3JlYXRlQWRhcHRlcjJEKCk7Ci0KLSAgICAgICAgICAgIGludCBzaXplID0gNTEyOwotICAgICAgICAgICAgaW50IG1pcCA9IDA7Ci0gICAgICAgICAgICB3aGlsZShzaXplID49IDIpIHsKLSAgICAgICAgICAgICAgICBhLnN1YkRhdGEoMCwgMCwgMiwgc2l6ZSwgYmxhY2spOwotICAgICAgICAgICAgICAgIGEuc3ViRGF0YShzaXplLTIsIDAsIDIsIHNpemUsIGJsYWNrKTsKLSAgICAgICAgICAgICAgICBhLnN1YkRhdGEoMCwgMCwgc2l6ZSwgMiwgYmxhY2spOwotICAgICAgICAgICAgICAgIGEuc3ViRGF0YSgwLCBzaXplLTIsIHNpemUsIDIsIGJsYWNrKTsKLSAgICAgICAgICAgICAgICBzaXplID4+PSAxOwotICAgICAgICAgICAgICAgIG1pcCsrOwotICAgICAgICAgICAgICAgIGEuc2V0Q29uc3RyYWludChEaW1lbnNpb24uTE9ELCBtaXApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtSW1hZ2VzW2N0XS51cGxvYWRUb1RleHR1cmUoMSk7Ci0gICAgICAgICAgICBtQnVmZmVySURzW2N0XSA9IG1JbWFnZXNbY3RdLmdldElEKCk7Ci0gICAgICAgIH0KLSAgICAgICAgbUFsbG9jSURzLmRhdGEobUJ1ZmZlcklEcyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRTdGF0ZSgpCi0gICAgewotICAgICAgICBtQnVmZmVyU3RhdGUgPSBuZXcgaW50WzEwXTsKLSAgICAgICAgbUFsbG9jU3RhdGUgPSBBbGxvY2F0aW9uLmNyZWF0ZVNpemVkKG1SUywKLSAgICAgICAgICAgIEVsZW1lbnQuY3JlYXRlVXNlcihtUlMsIEVsZW1lbnQuRGF0YVR5cGUuRkxPQVRfMzIpLAotICAgICAgICAgICAgbUJ1ZmZlclN0YXRlLmxlbmd0aCk7Ci0gICAgICAgIG1CdWZmZXJTdGF0ZVtTVEFURV9MQVNUX0ZPQ1VTXSA9IC0xOwotICAgICAgICBtQWxsb2NTdGF0ZS5kYXRhKG1CdWZmZXJTdGF0ZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRSUygpIHsKLSAgICAgICAgbUZTTSA9IG5ldyBGaWxtU3RyaXBNZXNoKCk7Ci0gICAgICAgIG1NZXNoID0gbUZTTS5pbml0KG1SUyk7Ci0gICAgICAgIG1NZXNoLnNldE5hbWUoIm1lc2giKTsKLQotICAgICAgICBpbml0UEZTKCk7Ci0gICAgICAgIGluaXRQRigpOwotICAgICAgICBpbml0UFYoKTsKLQotICAgICAgICBMb2cuZSgicnMiLCAiRG9uZSBsb2FkaW5nIG5hbWVkIik7Ci0KLSAgICAgICAgbVN0cmlwUG9zaXRpb25UeXBlID0gVHlwZS5jcmVhdGVGcm9tQ2xhc3MobVJTLCBTdHJpcFBvc2l0aW9uLmNsYXNzLCAxKTsKLQotICAgICAgICBTY3JpcHRDLkJ1aWxkZXIgc2IgPSBuZXcgU2NyaXB0Qy5CdWlsZGVyKG1SUyk7Ci0gICAgICAgIHNiLnNldFNjcmlwdChtUmVzLCBSLnJhdy5maWxtc3RyaXApOwotICAgICAgICBzYi5zZXRSb290KHRydWUpOwotICAgICAgICBzYi5zZXRUeXBlKG1TdHJpcFBvc2l0aW9uVHlwZSwgIlBvcyIsIDEpOwotICAgICAgICBtU2NyaXB0U3RyaXAgPSBzYi5jcmVhdGUoKTsKLSAgICAgICAgbVNjcmlwdFN0cmlwLnNldENsZWFyQ29sb3IoMC4wZiwgMC4wZiwgMC4wZiwgMS4wZik7Ci0KLSAgICAgICAgbUFsbG9jUG9zID0gQWxsb2NhdGlvbi5jcmVhdGVUeXBlZChtUlMsIG1TdHJpcFBvc2l0aW9uVHlwZSk7Ci0KLSAgICAgICAgbG9hZEltYWdlcygpOwotICAgICAgICBpbml0U3RhdGUoKTsKLQotICAgICAgICBtUFZBID0gbmV3IFByb2dyYW1WZXJ0ZXguTWF0cml4QWxsb2NhdGlvbihtUlMpOwotICAgICAgICBtUFZCYWNrZ3JvdW5kLmJpbmRBbGxvY2F0aW9uKG1QVkEpOwotICAgICAgICBtUFZJbWFnZXMuYmluZEFsbG9jYXRpb24obVBWQSk7Ci0gICAgICAgIG1QVkEuc2V0dXBQcm9qZWN0aW9uTm9ybWFsaXplZCgzMjAsIDQ4MCk7Ci0KLQotICAgICAgICBtU2NyaXB0U3RyaXAuYmluZEFsbG9jYXRpb24obUFsbG9jSURzLCAwKTsKLSAgICAgICAgbVNjcmlwdFN0cmlwLmJpbmRBbGxvY2F0aW9uKG1BbGxvY1BvcywgMSk7Ci0gICAgICAgIG1TY3JpcHRTdHJpcC5iaW5kQWxsb2NhdGlvbihtQWxsb2NTdGF0ZSwgMik7Ci0gICAgICAgIG1TY3JpcHRTdHJpcC5iaW5kQWxsb2NhdGlvbihtUFZBLm1BbGxvYywgMyk7Ci0KLQotICAgICAgICBtQWxsb2NPZmZzZXRzID0gQWxsb2NhdGlvbi5jcmVhdGVTaXplZChtUlMsCi0gICAgICAgICAgICBFbGVtZW50LmNyZWF0ZVVzZXIobVJTLCBFbGVtZW50LkRhdGFUeXBlLlNJR05FRF8zMiksIG1GU00ubVRyaWFuZ2xlT2Zmc2V0cy5sZW5ndGgpOwotICAgICAgICBtQWxsb2NPZmZzZXRzLmRhdGEobUZTTS5tVHJpYW5nbGVPZmZzZXRzKTsKLSAgICAgICAgbVNjcmlwdFN0cmlwLmJpbmRBbGxvY2F0aW9uKG1BbGxvY09mZnNldHMsIDQpOwotCi0gICAgICAgIG1BbGxvY09mZnNldHNUZXggPSBBbGxvY2F0aW9uLmNyZWF0ZVNpemVkKG1SUywKLSAgICAgICAgICAgIEVsZW1lbnQuY3JlYXRlVXNlcihtUlMsIEVsZW1lbnQuRGF0YVR5cGUuRkxPQVRfMzIpLCBtRlNNLm1UcmlhbmdsZU9mZnNldHNUZXgubGVuZ3RoKTsKLSAgICAgICAgbUFsbG9jT2Zmc2V0c1RleC5kYXRhKG1GU00ubVRyaWFuZ2xlT2Zmc2V0c1RleCk7Ci0gICAgICAgIG1TY3JpcHRTdHJpcC5iaW5kQWxsb2NhdGlvbihtQWxsb2NPZmZzZXRzVGV4LCA1KTsKLQotICAgICAgICBzZXRGaWxtU3RyaXBQb3NpdGlvbigwLCAwKTsKLSAgICAgICAgbVJTLmNvbnRleHRCaW5kUm9vdFNjcmlwdChtU2NyaXB0U3RyaXApOwotICAgIH0KLX0KLQotCi0KZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9GaWxtL3NyYy9jb20vYW5kcm9pZC9maWxtL0ZpbG1TdHJpcE1lc2guamF2YSBiL2xpYnMvcnMvamF2YS9GaWxtL3NyYy9jb20vYW5kcm9pZC9maWxtL0ZpbG1TdHJpcE1lc2guamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQ4Y2NlMC4uMDAwMDAwMAotLS0gYS9saWJzL3JzL2phdmEvRmlsbS9zcmMvY29tL2FuZHJvaWQvZmlsbS9GaWxtU3RyaXBNZXNoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotcGFja2FnZSBjb20uYW5kcm9pZC5maWxtOwotCi1pbXBvcnQgamF2YS5pby5Xcml0ZXI7Ci1pbXBvcnQgamF2YS5sYW5nLk1hdGg7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQotaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0LlJlbmRlclNjcmlwdDsKLWltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5TaW1wbGVNZXNoOwotCi0KLWNsYXNzIEZpbG1TdHJpcE1lc2ggewotCi0gICAgY2xhc3MgVmVydGV4IHsKLSAgICAgICAgZmxvYXQgbng7Ci0gICAgICAgIGZsb2F0IG55OwotICAgICAgICBmbG9hdCBuejsKLSAgICAgICAgZmxvYXQgczsKLSAgICAgICAgZmxvYXQgdDsKLSAgICAgICAgZmxvYXQgeDsKLSAgICAgICAgZmxvYXQgeTsKLSAgICAgICAgZmxvYXQgejsKLQotICAgICAgICBWZXJ0ZXgoKSB7Ci0gICAgICAgICAgICBueCA9IDA7Ci0gICAgICAgICAgICBueSA9IDA7Ci0gICAgICAgICAgICBueiA9IDA7Ci0gICAgICAgICAgICBzID0gMDsKLSAgICAgICAgICAgIHQgPSAwOwotICAgICAgICAgICAgeCA9IDA7Ci0gICAgICAgICAgICB5ID0gMDsKLSAgICAgICAgICAgIHogPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCB4eXooZmxvYXQgX3gsIGZsb2F0IF95LCBmbG9hdCBfeikgewotICAgICAgICAgICAgeCA9IF94OwotICAgICAgICAgICAgeSA9IF95OwotICAgICAgICAgICAgeiA9IF96OwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBueHl6KGZsb2F0IF94LCBmbG9hdCBfeSwgZmxvYXQgX3opIHsKLSAgICAgICAgICAgIG54ID0gX3g7Ci0gICAgICAgICAgICBueSA9IF95OwotICAgICAgICAgICAgbnogPSBfejsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgc3QoZmxvYXQgX3MsIGZsb2F0IF90KSB7Ci0gICAgICAgICAgICBzID0gX3M7Ci0gICAgICAgICAgICB0ID0gX3Q7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIGNvbXB1dGVOb3JtKFZlcnRleCB2MSwgVmVydGV4IHYyKSB7Ci0gICAgICAgICAgICBmbG9hdCBkeCA9IHYxLnggLSB2Mi54OwotICAgICAgICAgICAgZmxvYXQgZHkgPSB2MS55IC0gdjIueTsKLSAgICAgICAgICAgIGZsb2F0IGR6ID0gdjEueiAtIHYyLno7Ci0gICAgICAgICAgICBmbG9hdCBsZW4gPSAoZmxvYXQpamF2YS5sYW5nLk1hdGguc3FydChkeCpkeCArIGR5KmR5ICsgZHoqZHopOwotICAgICAgICAgICAgZHggLz0gbGVuOwotICAgICAgICAgICAgZHkgLz0gbGVuOwotICAgICAgICAgICAgZHogLz0gbGVuOwotCi0gICAgICAgICAgICBueCA9IGR4ICogZHo7Ci0gICAgICAgICAgICBueSA9IGR5ICogZHo7Ci0gICAgICAgICAgICBueiA9IChmbG9hdClqYXZhLmxhbmcuTWF0aC5zcXJ0KGR4KmR4ICsgZHkqZHkpOwotCi0gICAgICAgICAgICBsZW4gPSAoZmxvYXQpamF2YS5sYW5nLk1hdGguc3FydChueCpueCArIG55Km55ICsgbnoqbnopOwotICAgICAgICAgICAgbnggLz0gbGVuOwotICAgICAgICAgICAgbnkgLz0gbGVuOwotICAgICAgICAgICAgbnogLz0gbGVuOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaW50W10gbVRyaWFuZ2xlT2Zmc2V0czsKLSAgICBmbG9hdFtdIG1UcmlhbmdsZU9mZnNldHNUZXg7Ci0gICAgaW50IG1UcmlhbmdsZU9mZnNldHNDb3VudDsKLQotICAgIFNpbXBsZU1lc2ggaW5pdChSZW5kZXJTY3JpcHQgcnMpCi0gICAgewotICAgICAgICBmbG9hdCB2dHhbXSA9IG5ldyBmbG9hdFtdIHsKLSAgICAgICAgICAgIDYwLjQzMTAwM2YsIDEyNC40ODIwNTBmLAotICAgICAgICAgICAgNjAuODYyMDc0ZiwgMTIwLjg3MjYwNGYsCi0gICAgICAgICAgICA2MS43MDUzMDNmLCAxMTcuMzM2NjYyZiwKLSAgICAgICAgICAgIDYyLjk0OTUwNWYsIDExMy45MjExMjdmLAotICAgICAgICAgICAgNjQuNTc4MTc3ZiwgMTEwLjY3MTMwNGYsCi0gICAgICAgICAgICA2Ni41Njk3MTZmLCAxMDcuNjMwMzAyZiwKLSAgICAgICAgICAgIDY4Ljg5NzcwM2YsIDEwNC44Mzg0NTdmLAotICAgICAgICAgICAgNzEuNTMxMjU5ZiwgMTAyLjMzMjgwM2YsCi0gICAgICAgICAgICA3NC40MzU0NTJmLCAxMDAuMTQ2NTc3ZiwKLSAgICAgICAgICAgIDc3LjU3MTc1N2YsIDk4LjMwODc3N2YsCi0gICAgICAgICAgICA4MC44OTg1NzRmLCA5Ni44NDM3ODFmLAotICAgICAgICAgICAgODQuMzcxNzczZiwgOTUuNzcxMDIzZiwKLSAgICAgICAgICAgIDg3Ljk0NTI4M2YsIDk1LjEwNDczMWYsCi0gICAgICAgICAgICA5OC45NTg5OTRmLCA5NS4yNjcwOThmLAotICAgICAgICAgICAgMTA5LjQ4OTUyM2YsIDk4LjQ5NzU5NmYsCi0gICAgICAgICAgICAxMTguNjk5NTgyZiwgMTA0LjUzOTM2NmYsCi0gICAgICAgICAgICAxMjUuODU2ODcyZiwgMTEyLjkxMjAyMmYsCi0gICAgICAgICAgICAxMzAuMzkyMzExZiwgMTIyLjk0OTg0OWYsCi0gICAgICAgICAgICAxMzEuOTQ1MjgzZiwgMTMzLjg1NDczMWYsCi0gICAgICAgICAgICAxMzAuMzkyMzExZiwgMTQ0Ljc1OTYxM2YsCi0gICAgICAgICAgICAxMjUuODU2ODcyZiwgMTU0Ljc5NzQzOWYsCi0gICAgICAgICAgICAxMTguNjk5NTgyZiwgMTYzLjE3MDA5NmYsCi0gICAgICAgICAgICAxMDkuNDg5NTIzZiwgMTY5LjIxMTg2NmYsCi0gICAgICAgICAgICA5OC45NTg5OTRmLCAxNzIuNDQyMzY0ZiwKLSAgICAgICAgICAgIDg3Ljk0NTI4M2YsIDE3Mi42MDQ3MzFmLAotICAgICAgICAgICAgNzIuNTA3MzEzZiwgMTcyLjY3MjkyN2YsCi0gICAgICAgICAgICA1Ny42Nzg5MjBmLCAxNjguMzc3MDcxZiwKLSAgICAgICAgICAgIDQ0LjY2ODEzNWYsIDE2MC4wNjcxMzRmLAotICAgICAgICAgICAgMzQuNTM0OTA4ZiwgMTQ4LjQyMDEwNGYsCi0gICAgICAgICAgICAyOC4xMDQ3NjdmLCAxMzQuMzg0ODMxZiwKLSAgICAgICAgICAgIDI1LjkwMTU1N2YsIDExOS4xMDQ3MzFmLAotICAgICAgICAgICAgMjguMTA0NzY3ZiwgMTAzLjgyNDYzMWYsCi0gICAgICAgICAgICAzNC41MzQ5MDhmLCA4OS43ODkzNThmLAotICAgICAgICAgICAgNDQuNjY4MTM1ZiwgNzguMTQyMzI3ZiwKLSAgICAgICAgICAgIDU3LjY3ODkyMGYsIDY5LjgzMjM5MGYsCi0gICAgICAgICAgICA3Mi41MDczMTNmLCA2NS41MzY1MzRmLAotICAgICAgICAgICAgODcuOTQ1MjgzZiwgNjUuNjA0NzMxZiwKLSAgICAgICAgICAgIDEwNi45MTgxMTdmLCA2NS42ODg1NDJmLAotICAgICAgICAgICAgMTI1LjE0MTc5NWYsIDYwLjQwOTA1NmYsCi0gICAgICAgICAgICAxNDEuMTMxNjg2ZiwgNTAuMTk2Mzc2ZiwKLSAgICAgICAgICAgIDE1My41ODUxMzdmLCAzNS44ODI1MDJmLAotICAgICAgICAgICAgMTYxLjQ4NzYwMGYsIDE4LjYzMzU0NWYsCi0gICAgICAgICAgICAxNjQuMTk1MjgzZiwgLTAuMTQ1MjY5ZiwKLSAgICAgICAgICAgIDE2MS40ODc2MDBmLCAtMTguOTI0MDg0ZiwKLSAgICAgICAgICAgIDE1My41ODUxMzdmLCAtMzYuMTczMDQwZiwKLSAgICAgICAgICAgIDE0MS4xMzE2ODZmLCAtNTAuNDg2OTE0ZiwKLSAgICAgICAgICAgIDEyNS4xNDE3OTVmLCAtNjAuNjk5NTk0ZiwKLSAgICAgICAgICAgIDEwNi45MTgxMTdmLCAtNjUuOTc5MDgxZiwKLSAgICAgICAgICAgIDg3Ljk0NTI4M2YsIC02NS44OTUyNjlmLAotICAgICAgICAgICAgODBmLCAtNjUuODk1MjY5ZiwKLSAgICAgICAgICAgIDYwZiwgLTY1Ljg5NTI2OWYsCi0gICAgICAgICAgICA0MGYsIC02NS44OTUyNjlmLAotICAgICAgICAgICAgMjBmLCAtNjUuODk1MjY5ZiwKLSAgICAgICAgICAgIDBmLCAtNjUuODk1MjY5ZiwKLSAgICAgICAgICAgIC0yMGYsIC02NS44OTUyNjlmLAotICAgICAgICAgICAgLTQwZiwgLTY1Ljg5NTI2OWYsCi0gICAgICAgICAgICAtNjBmLCAtNjUuODk1MjY5ZiwKLSAgICAgICAgICAgIC04MGYsIC02NS44OTUyNjlmLAotICAgICAgICAgICAgLTg3Ljk0NTI4M2YsIC02NS44OTUyNjlmLAotICAgICAgICAgICAgLTEwNi45MTgxMTdmLCAtNjUuOTc5MDgxZiwKLSAgICAgICAgICAgIC0xMjUuMTQxNzk1ZiwgLTYwLjY5OTU5NGYsCi0gICAgICAgICAgICAtMTQxLjEzMTY4NmYsIC01MC40ODY5MTRmLAotICAgICAgICAgICAgLTE1My41ODUxMzdmLCAtMzYuMTczMDQwZiwKLSAgICAgICAgICAgIC0xNjEuNDg3NjAwZiwgLTE4LjkyNDA4NGYsCi0gICAgICAgICAgICAtMTY0LjE5NTI4M2YsIC0wLjE0NTI2OWYsCi0gICAgICAgICAgICAtMTYxLjQ4NzYwMGYsIDE4LjYzMzU0NWYsCi0gICAgICAgICAgICAgLTE1My41ODUxMzdmLCAzNS44ODI1MDJmLAotICAgICAgICAgICAgIC0xNDEuMTMxNjg2ZiwgNTAuMTk2Mzc2ZiwKLSAgICAgICAgICAgICAtMTI1LjE0MTc5NWYsIDYwLjQwOTA1NmYsCi0gICAgICAgICAgICAgLTEwNi45MTgxMTdmLCA2NS42ODg1NDJmLAotICAgICAgICAgICAgIC04Ny45NDUyODNmLCA2NS42MDQ3MzFmLAotICAgICAgICAgICAgIC03Mi41MDczMTNmLCA2NS41MzY1MzRmLAotICAgICAgICAgICAgIC01Ny42Nzg5MjBmLCA2OS44MzIzOTBmLAotICAgICAgICAgICAgIC00NC42NjgxMzVmLCA3OC4xNDIzMjdmLAotICAgICAgICAgICAgIC0zNC41MzQ5MDhmLCA4OS43ODkzNThmLAotICAgICAgICAgICAgIC0yOC4xMDQ3NjdmLCAxMDMuODI0NjMxZiwKLSAgICAgICAgICAgICAtMjUuOTAxNTU3ZiwgMTE5LjEwNDczMWYsCi0gICAgICAgICAgICAgLTI4LjEwNDc2N2YsIDEzNC4zODQ4MzFmLAotICAgICAgICAgICAgIC0zNC41MzQ5MDhmLCAxNDguNDIwMTA0ZiwKLSAgICAgICAgICAgICAtNDQuNjY4MTM1ZiwgMTYwLjA2NzEzNGYsCi0gICAgICAgICAgICAgLTU3LjY3ODkyMGYsIDE2OC4zNzcwNzFmLAotICAgICAgICAgICAgIC03Mi41MDczMTNmLCAxNzIuNjcyOTI3ZiwKLSAgICAgICAgICAgICAtODcuOTQ1MjgzZiwgMTcyLjYwNDczMWYsCi0gICAgICAgICAgICAgLTk4Ljk1ODk5NGYsIDE3Mi40NDIzNjRmLAotICAgICAgICAgICAgIC0xMDkuNDg5NTIzZiwgMTY5LjIxMTg2NmYsCi0gICAgICAgICAgICAgLTExOC42OTk1ODJmLCAxNjMuMTcwMDk2ZiwKLSAgICAgICAgICAgICAtMTI1Ljg1Njg3MmYsIDE1NC43OTc0MzlmLAotICAgICAgICAgICAgIC0xMzAuMzkyMzExZiwgMTQ0Ljc1OTYxM2YsCi0gICAgICAgICAgICAgLTEzMS45NDUyODNmLCAxMzMuODU0NzMxZiwKLSAgICAgICAgICAgICAtMTMwLjM5MjMxMWYsIDEyMi45NDk4NDlmLAotICAgICAgICAgICAgIC0xMjUuODU2ODcyZiwgMTEyLjkxMjAyMmYsCi0gICAgICAgICAgICAgLTExOC42OTk1ODJmLCAxMDQuNTM5MzY2ZiwKLSAgICAgICAgICAgICAtMTA5LjQ4OTUyM2YsIDk4LjQ5NzU5NmYsCi0gICAgICAgICAgICAgLTk4Ljk1ODk5NGYsIDk1LjI2NzA5OGYsCi0gICAgICAgICAgICAgLTg3Ljk0NTI4M2YsIDk1LjEwNDczMWYsCi0gICAgICAgICAgICAgLTg0LjM3MTc3M2YsIDk1Ljc3MTAyM2YsCi0gICAgICAgICAgICAgLTgwLjg5ODU3NGYsIDk2Ljg0Mzc4MWYsCi0gICAgICAgICAgICAgLTc3LjU3MTc1N2YsIDk4LjMwODc3N2YsCi0gICAgICAgICAgICAgLTc0LjQzNTQ1MmYsIDEwMC4xNDY1NzdmLAotICAgICAgICAgICAgIC03MS41MzEyNTlmLCAxMDIuMzMyODAzZiwKLSAgICAgICAgICAgICAtNjguODk3NzAzZiwgMTA0LjgzODQ1N2YsCi0gICAgICAgICAgICAgLTY2LjU2OTcxNmYsIDEwNy42MzAzMDJmLAotICAgICAgICAgICAgIC02NC41NzgxNzdmLCAxMTAuNjcxMzA0ZiwKLSAgICAgICAgICAgICAtNjIuOTQ5NTA1ZiwgMTEzLjkyMTEyN2YsCi0gICAgICAgICAgICAgLTYxLjcwNTMwM2YsIDExNy4zMzY2NjJmLAotICAgICAgICAgICAgIC02MC44NjIwNzRmLCAxMjAuODcyNjA0ZiwKLSAgICAgICAgICAgICAtNjAuNDMxMDAzZiwgMTI0LjQ4MjA1MGYKLSAgICAgICAgfTsKLQotCi0gICAgICAgIG1UcmlhbmdsZU9mZnNldHMgPSBuZXcgaW50WzY0XTsKLSAgICAgICAgbVRyaWFuZ2xlT2Zmc2V0c1RleCA9IG5ldyBmbG9hdFs2NF07Ci0KLSAgICAgICAgbVRyaWFuZ2xlT2Zmc2V0c1swXSA9IDA7Ci0gICAgICAgIG1UcmlhbmdsZU9mZnNldHNDb3VudCA9IDE7Ci0KLSAgICAgICAgVmVydGV4IHQgPSBuZXcgVmVydGV4KCk7Ci0gICAgICAgIHQubnh5eigxLCAwLCAwKTsKLSAgICAgICAgaW50IGNvdW50ID0gdnR4Lmxlbmd0aCAvIDI7Ci0KLSAgICAgICAgU2ltcGxlTWVzaC5UcmlhbmdsZU1lc2hCdWlsZGVyIHRtID0gbmV3IFNpbXBsZU1lc2guVHJpYW5nbGVNZXNoQnVpbGRlcigKLSAgICAgICAgICAgIHJzLCAzLAotICAgICAgICAgICAgU2ltcGxlTWVzaC5UcmlhbmdsZU1lc2hCdWlsZGVyLk5PUk1BTCB8IFNpbXBsZU1lc2guVHJpYW5nbGVNZXNoQnVpbGRlci5URVhUVVJFXzApOwotCi0gICAgICAgIGZsb2F0IHJ1bm5pbmdTID0gMDsKLSAgICAgICAgZm9yIChpbnQgY3Q9MDsgY3QgPCAoY291bnQtMSk7IGN0KyspIHsKLSAgICAgICAgICAgIHQueCA9IC12dHhbY3QqMl0gLyAxMDAuZjsKLSAgICAgICAgICAgIHQueiA9IHZ0eFtjdCoyKzFdIC8gMTAwLmY7Ci0gICAgICAgICAgICB0LnMgPSBydW5uaW5nUzsKLSAgICAgICAgICAgIHQubnggPSAgKHZ0eFtjdCoyKzNdIC0gdnR4W2N0KjIgKzFdKTsKLSAgICAgICAgICAgIHQubnkgPSAgKHZ0eFtjdCoyKzJdIC0gdnR4W2N0KjIgICBdKTsKLSAgICAgICAgICAgIGZsb2F0IGxlbiA9IChmbG9hdClqYXZhLmxhbmcuTWF0aC5zcXJ0KHQubnggKiB0Lm54ICsgdC5ueSAqIHQubnkpOwotICAgICAgICAgICAgcnVubmluZ1MgKz0gbGVuIC8gMTAwOwotICAgICAgICAgICAgdC5ueCAvPSBsZW47Ci0gICAgICAgICAgICB0Lm55IC89IGxlbjsKLSAgICAgICAgICAgIHQueSA9IC0wLjVmOwotICAgICAgICAgICAgdC50ID0gMDsKLSAgICAgICAgICAgIHRtLnNldE5vcm1hbCh0Lm54LCB0Lm55LCB0Lm56KTsKLSAgICAgICAgICAgIHRtLnNldFRleHR1cmUodC5zLCB0LnQpOwotICAgICAgICAgICAgdG0uYWRkVmVydGV4KHQueCwgdC55LCB0LnopOwotICAgICAgICAgICAgLy9hbmRyb2lkLnV0aWwuTG9nLmUoInJzIiwgInZ0eCB4PSIrdC54KyIgeT0iK3QueSsiIHo9Iit0LnorIiBzPSIrdC5zKyIgdD0iK3QudCk7Ci0gICAgICAgICAgICB0LnkgPSAuNWY7Ci0gICAgICAgICAgICB0LnQgPSAxOwotICAgICAgICAgICAgdG0uc2V0VGV4dHVyZSh0LnMsIHQudCk7Ci0gICAgICAgICAgICB0bS5hZGRWZXJ0ZXgodC54LCB0LnksIHQueik7Ci0gICAgICAgICAgICAvL2FuZHJvaWQudXRpbC5Mb2cuZSgicnMiLCAidnR4IHg9Iit0LngrIiB5PSIrdC55KyIgej0iK3QueisiIHM9Iit0LnMrIiB0PSIrdC50KTsKLQotICAgICAgICAgICAgaWYoKHJ1bm5pbmdTKjIpID4gbVRyaWFuZ2xlT2Zmc2V0c0NvdW50KSB7Ci0gICAgICAgICAgICAgICAgbVRyaWFuZ2xlT2Zmc2V0c1ttVHJpYW5nbGVPZmZzZXRzQ291bnRdID0gY3QqMiAqIDM7Ci0gICAgICAgICAgICAgICAgbVRyaWFuZ2xlT2Zmc2V0c1RleFttVHJpYW5nbGVPZmZzZXRzQ291bnRdID0gdC5zOwotICAgICAgICAgICAgICAgIG1UcmlhbmdsZU9mZnNldHNDb3VudCArKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGNvdW50ID0gKGNvdW50ICogMiAtIDIpOwotICAgICAgICBmb3IgKGludCBjdD0wOyBjdCA8IChjb3VudC0yKTsgY3QrPSAyKSB7Ci0gICAgICAgICAgICB0bS5hZGRUcmlhbmdsZShjdCwgY3QrMSwgY3QrMik7Ci0gICAgICAgICAgICB0bS5hZGRUcmlhbmdsZShjdCsxLCBjdCszLCBjdCsyKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdG0uY3JlYXRlKCk7Ci0gICAgfQotCi0KLX0KLQpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ZpbG0vc3JjL2NvbS9hbmRyb2lkL2ZpbG0vRmlsbVZpZXcuamF2YSBiL2xpYnMvcnMvamF2YS9GaWxtL3NyYy9jb20vYW5kcm9pZC9maWxtL0ZpbG1WaWV3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViYzI4MTEuLjAwMDAwMDAKLS0tIGEvbGlicy9ycy9qYXZhL0ZpbG0vc3JjL2NvbS9hbmRyb2lkL2ZpbG0vRmlsbVZpZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmZpbG07Ci0KLWltcG9ydCBqYXZhLmlvLldyaXRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlNlbWFwaG9yZTsKLQotaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0LlJTU3VyZmFjZVZpZXc7Ci1pbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUmVuZGVyU2NyaXB0OwotaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0LlJlbmRlclNjcmlwdEdMOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5CaXRtYXBEcmF3YWJsZTsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOwotaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKLWltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlOwotaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlSG9sZGVyOwotaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlVmlldzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7Ci1pbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OwotCi1wdWJsaWMgY2xhc3MgRmlsbVZpZXcgZXh0ZW5kcyBSU1N1cmZhY2VWaWV3IHsKLQotICAgIHB1YmxpYyBGaWxtVmlldyhDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgc3VwZXIoY29udGV4dCk7Ci0gICAgICAgIC8vc2V0Rm9jdXNhYmxlKHRydWUpOwotICAgIH0KLQotICAgIHByaXZhdGUgUmVuZGVyU2NyaXB0R0wgbVJTOwotICAgIHByaXZhdGUgRmlsbVJTIG1SZW5kZXI7Ci0KLQotICAgIHB1YmxpYyB2b2lkIHN1cmZhY2VDaGFuZ2VkKFN1cmZhY2VIb2xkZXIgaG9sZGVyLCBpbnQgZm9ybWF0LCBpbnQgdywgaW50IGgpIHsKLSAgICAgICAgc3VwZXIuc3VyZmFjZUNoYW5nZWQoaG9sZGVyLCBmb3JtYXQsIHcsIGgpOwotICAgICAgICBpZiAobVJTID09IG51bGwpIHsKLSAgICAgICAgICAgIG1SUyA9IGNyZWF0ZVJlbmRlclNjcmlwdCh0cnVlKTsKLSAgICAgICAgICAgIG1SUy5jb250ZXh0U2V0U3VyZmFjZSh3LCBoLCBob2xkZXIuZ2V0U3VyZmFjZSgpKTsKLSAgICAgICAgICAgIG1SZW5kZXIgPSBuZXcgRmlsbVJTKCk7Ci0gICAgICAgICAgICBtUmVuZGVyLmluaXQobVJTLCBnZXRSZXNvdXJjZXMoKSwgdywgaCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBvbkRldGFjaGVkRnJvbVdpbmRvdygpIHsKLSAgICAgICAgaWYobVJTICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1SUyA9IG51bGw7Ci0gICAgICAgICAgICBkZXN0cm95UmVuZGVyU2NyaXB0KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBvbktleURvd24oaW50IGtleUNvZGUsIEtleUV2ZW50IGV2ZW50KQotICAgIHsKLSAgICAgICAgLy8gYnJlYWsgcG9pbnQgYXQgaGVyZQotICAgICAgICAvLyB0aGlzIG1ldGhvZCBkb2Vzbid0IHdvcmsgd2hlbiAnZXh0ZW5kcyBWaWV3JyBpbmNsdWRlICdleHRlbmRzIFNjcm9sbFZpZXcnLgotICAgICAgICByZXR1cm4gc3VwZXIub25LZXlEb3duKGtleUNvZGUsIGV2ZW50KTsKLSAgICB9Ci0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIG9uVG91Y2hFdmVudChNb3Rpb25FdmVudCBldikKLSAgICB7Ci0gICAgICAgIGJvb2xlYW4gcmV0ID0gdHJ1ZTsKLSAgICAgICAgaW50IGFjdCA9IGV2LmdldEFjdGlvbigpOwotICAgICAgICBpZiAoYWN0ID09IGV2LkFDVElPTl9VUCkgewotICAgICAgICAgICAgcmV0ID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgbVJlbmRlci5zZXRGaWxtU3RyaXBQb3NpdGlvbigoaW50KWV2LmdldFgoKSwgKGludClldi5nZXRZKCkgLyA1KTsKLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ZvdW50YWluL0FuZHJvaWQubWsgYi9saWJzL3JzL2phdmEvRm91bnRhaW4vQW5kcm9pZC5tawppbmRleCBmN2U1M2E4Li43MTk0NGIyIDEwMDY0NAotLS0gYS9saWJzL3JzL2phdmEvRm91bnRhaW4vQW5kcm9pZC5taworKysgYi9saWJzL3JzL2phdmEvRm91bnRhaW4vQW5kcm9pZC5tawpAQCAtMTQsMTQgKzE0LDE4IEBACiAjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCitpZm5lcSAoJChUQVJHRVRfU0lNVUxBVE9SKSx0cnVlKQorCiBMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIAogTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKIAotTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQorTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKSAkKGNhbGwgYWxsLXJlbmRlcnNjcmlwdC1maWxlcy11bmRlciwgc3JjKQogI0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLnJlbmRlcnNjcmlwdAogCiBMT0NBTF9QQUNLQUdFX05BTUUgOj0gRm91bnRhaW4KIAogaW5jbHVkZSAkKEJVSUxEX1BBQ0tBR0UpCisKK2VuZGlmCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvRm91bnRhaW4vcmVzL2RyYXdhYmxlL2dhZGdldHNfY2xvY2tfbXAzLnBuZyBiL2xpYnMvcnMvamF2YS9Gb3VudGFpbi9yZXMvZHJhd2FibGUvZ2FkZ2V0c19jbG9ja19tcDMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlOTFiZmI0Li4wMDAwMDAwCi0tLSBhL2xpYnMvcnMvamF2YS9Gb3VudGFpbi9yZXMvZHJhd2FibGUvZ2FkZ2V0c19jbG9ja19tcDMucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ZvdW50YWluL3Jlcy9yYXcvZm91bnRhaW4uYyBiL2xpYnMvcnMvamF2YS9Gb3VudGFpbi9yZXMvcmF3L2ZvdW50YWluLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczYjgxOWIuLjAwMDAwMDAKLS0tIGEvbGlicy9ycy9qYXZhL0ZvdW50YWluL3Jlcy9yYXcvZm91bnRhaW4uYworKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8vIEZvdW50YWluIHRlc3Qgc2NyaXB0Ci0jcHJhZ21hIHZlcnNpb24oMSkKLQotaW50IG5ld1BhcnQgPSAwOwotCi1pbnQgbWFpbihpbnQgbGF1bmNoSUQpIHsKLSAgICBpbnQgY3Q7Ci0gICAgaW50IGNvdW50ID0gQ29udHJvbC0+Y291bnQ7Ci0gICAgaW50IHJhdGUgPSBDb250cm9sLT5yYXRlOwotICAgIGZsb2F0IGhlaWdodCA9IGdldEhlaWdodCgpOwotICAgIHN0cnVjdCBwb2ludF9zICogcCA9IChzdHJ1Y3QgcG9pbnRfcyAqKXBvaW50OwotCi0gICAgaWYgKHJhdGUpIHsKLSAgICAgICAgZmxvYXQgck1heCA9ICgoZmxvYXQpcmF0ZSkgKiAwLjAwNWY7Ci0gICAgICAgIGludCB4ID0gQ29udHJvbC0+eDsKLSAgICAgICAgaW50IHkgPSBDb250cm9sLT55OwotICAgICAgICBpbnQgY29sb3IgPSAoKGludCkoQ29udHJvbC0+ciAqIDI1NS5mKSkgfAotICAgICAgICAgICAgICAgICAgICAoKGludCkoQ29udHJvbC0+ZyAqIDI1NS5mKSkgPDwgOCB8Ci0gICAgICAgICAgICAgICAgICAgICgoaW50KShDb250cm9sLT5iICogMjU1LmYpKSA8PCAxNiB8Ci0gICAgICAgICAgICAgICAgICAgICgweGYwIDw8IDI0KTsKLSAgICAgICAgc3RydWN0IHBvaW50X3MgKiBucCA9ICZwW25ld1BhcnRdOwotCi0gICAgICAgIHdoaWxlIChyYXRlLS0pIHsKLSAgICAgICAgICAgIHZlYzJSYW5kKChmbG9hdCAqKSZucC0+ZGVsdGEueCwgck1heCk7Ci0gICAgICAgICAgICBucC0+cG9zaXRpb24ueCA9IHg7Ci0gICAgICAgICAgICBucC0+cG9zaXRpb24ueSA9IHk7Ci0gICAgICAgICAgICBucC0+Y29sb3IgPSBjb2xvcjsKLSAgICAgICAgICAgIG5ld1BhcnQrKzsKLSAgICAgICAgICAgIG5wKys7Ci0gICAgICAgICAgICBpZiAobmV3UGFydCA+PSBjb3VudCkgewotICAgICAgICAgICAgICAgIG5ld1BhcnQgPSAwOwotICAgICAgICAgICAgICAgIG5wID0gJnBbbmV3UGFydF07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBmb3IgKGN0PTA7IGN0IDwgY291bnQ7IGN0KyspIHsKLSAgICAgICAgZmxvYXQgZHkgPSBwLT5kZWx0YS55ICsgMC4xNWY7Ci0gICAgICAgIGZsb2F0IHBvc3kgPSBwLT5wb3NpdGlvbi55ICsgZHk7Ci0gICAgICAgIGlmICgocG9zeSA+IGhlaWdodCkgJiYgKGR5ID4gMCkpIHsKLSAgICAgICAgICAgIGR5ICo9IC0wLjNmOwotICAgICAgICB9Ci0gICAgICAgIHAtPmRlbHRhLnkgPSBkeTsKLSAgICAgICAgcC0+cG9zaXRpb24ueCArPSBwLT5kZWx0YS54OwotICAgICAgICBwLT5wb3NpdGlvbi55ID0gcG9zeTsKLSAgICAgICAgcCsrOwotICAgIH0KLQotICAgIHVwbG9hZFRvQnVmZmVyT2JqZWN0KE5BTUVEX1BhcnRCdWZmZXIpOwotICAgIGRyYXdTaW1wbGVNZXNoKE5BTUVEX1BhcnRNZXNoKTsKLSAgICByZXR1cm4gMTsKLX0KZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9Gb3VudGFpbi9yZXMvcmF3L2ZvdW50YWluMi5ycyBiL2xpYnMvcnMvamF2YS9Gb3VudGFpbi9yZXMvcmF3L2ZvdW50YWluMi5ycwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzMwMTE0MC4uMDAwMDAwMAotLS0gYS9saWJzL3JzL2phdmEvRm91bnRhaW4vcmVzL3Jhdy9mb3VudGFpbjIucnMKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vLyBGb3VudGFpbiB0ZXN0IHNjcmlwdAotI3ByYWdtYSB2ZXJzaW9uKDEpCi0KLSNpbmNsdWRlICJyc190eXBlcy5yc2giCi0jaW5jbHVkZSAicnNfbWF0aC5yc2giCi0jaW5jbHVkZSAicnNfZ3JhcGhpY3MucnNoIgotCi1zdGF0aWMgaW50IG5ld1BhcnQgPSAwOwotCi10eXBlZGVmIHN0cnVjdCBDb250cm9sX3MgewotICAgIGludCB4LCB5OwotICAgIGludCByYXRlOwotICAgIGludCBjb3VudDsKLSAgICBmbG9hdCByLCBnLCBiOwotICAgIHJzX2FsbG9jYXRpb24gcGFydEJ1ZmZlcjsKLSAgICByc19tZXNoIHBhcnRNZXNoOwotfSBDb250cm9sX3Q7Ci1Db250cm9sX3QgKkNvbnRyb2w7Ci0KLXR5cGVkZWYgc3RydWN0IFBvaW50X3N7Ci0gICAgZmxvYXQyIGRlbHRhOwotICAgIGZsb2F0MiBwb3NpdGlvbjsKLSAgICB1bnNpZ25lZCBpbnQgY29sb3I7Ci19IFBvaW50X3Q7Ci1Qb2ludF90ICpwb2ludDsKLQotaW50IG1haW4oaW50IGxhdW5jaElEKSB7Ci0gICAgaW50IGN0OwotICAgIGludCBjb3VudCA9IENvbnRyb2wtPmNvdW50OwotICAgIGludCByYXRlID0gQ29udHJvbC0+cmF0ZTsKLSAgICBmbG9hdCBoZWlnaHQgPSBnZXRIZWlnaHQoKTsKLSAgICBQb2ludF90ICogcCA9IHBvaW50OwotCi0gICAgaWYgKHJhdGUpIHsKLSAgICAgICAgZmxvYXQgck1heCA9ICgoZmxvYXQpcmF0ZSkgKiAwLjAwNWY7Ci0gICAgICAgIGludCB4ID0gQ29udHJvbC0+eDsKLSAgICAgICAgaW50IHkgPSBDb250cm9sLT55OwotICAgICAgICBpbnQgY29sb3IgPSAoKGludCkoQ29udHJvbC0+ciAqIDI1NS5mKSkgfAotICAgICAgICAgICAgICAgICAgICAoKGludCkoQ29udHJvbC0+ZyAqIDI1NS5mKSkgPDwgOCB8Ci0gICAgICAgICAgICAgICAgICAgICgoaW50KShDb250cm9sLT5iICogMjU1LmYpKSA8PCAxNiB8Ci0gICAgICAgICAgICAgICAgICAgICgweGYwIDw8IDI0KTsKLSAgICAgICAgUG9pbnRfdCAqIG5wID0gJnBbbmV3UGFydF07Ci0KLSAgICAgICAgd2hpbGUgKHJhdGUtLSkgewotICAgICAgICAgICAgbnAtPmRlbHRhID0gdmVjMlJhbmQock1heCk7Ci0gICAgICAgICAgICBucC0+cG9zaXRpb24ueCA9IHg7Ci0gICAgICAgICAgICBucC0+cG9zaXRpb24ueSA9IHk7Ci0gICAgICAgICAgICBucC0+Y29sb3IgPSBjb2xvcjsKLSAgICAgICAgICAgIG5ld1BhcnQrKzsKLSAgICAgICAgICAgIG5wKys7Ci0gICAgICAgICAgICBpZiAobmV3UGFydCA+PSBjb3VudCkgewotICAgICAgICAgICAgICAgIG5ld1BhcnQgPSAwOwotICAgICAgICAgICAgICAgIG5wID0gJnBbbmV3UGFydF07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBmb3IgKGN0PTA7IGN0IDwgY291bnQ7IGN0KyspIHsKLSAgICAgICAgZmxvYXQgZHkgPSBwLT5kZWx0YS55ICsgMC4xNWY7Ci0gICAgICAgIGZsb2F0IHBvc3kgPSBwLT5wb3NpdGlvbi55ICsgZHk7Ci0gICAgICAgIGlmICgocG9zeSA+IGhlaWdodCkgJiYgKGR5ID4gMCkpIHsKLSAgICAgICAgICAgIGR5ICo9IC0wLjNmOwotICAgICAgICB9Ci0gICAgICAgIHAtPmRlbHRhLnkgPSBkeTsKLSAgICAgICAgcC0+cG9zaXRpb24ueCArPSBwLT5kZWx0YS54OwotICAgICAgICBwLT5wb3NpdGlvbi55ID0gcG9zeTsKLSAgICAgICAgcCsrOwotICAgIH0KLQotICAgIHVwbG9hZFRvQnVmZmVyT2JqZWN0KENvbnRyb2wtPnBhcnRCdWZmZXIpOwotICAgIGRyYXdTaW1wbGVNZXNoKENvbnRyb2wtPnBhcnRNZXNoKTsKLSAgICByZXR1cm4gMTsKLX0KZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9Gb3VudGFpbi9zcmMvY29tL2FuZHJvaWQvZm91bnRhaW4vRm91bnRhaW5SUy5qYXZhIGIvbGlicy9ycy9qYXZhL0ZvdW50YWluL3NyYy9jb20vYW5kcm9pZC9mb3VudGFpbi9Gb3VudGFpblJTLmphdmEKaW5kZXggOTM1NjU3OS4uMjk3ZWEwNyAxMDA2NDQKLS0tIGEvbGlicy9ycy9qYXZhL0ZvdW50YWluL3NyYy9jb20vYW5kcm9pZC9mb3VudGFpbi9Gb3VudGFpblJTLmphdmEKKysrIGIvbGlicy9ycy9qYXZhL0ZvdW50YWluL3NyYy9jb20vYW5kcm9pZC9mb3VudGFpbi9Gb3VudGFpblJTLmphdmEKQEAgLTIyLDk0ICsyMiw1MCBAQAogCiAKIHB1YmxpYyBjbGFzcyBGb3VudGFpblJTIHsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQQVJUX0NPVU5UID0gMjAwMDA7Ci0KLSAgICBzdGF0aWMgY2xhc3MgU29tZURhdGEgewotICAgICAgICBwdWJsaWMgaW50IHg7Ci0gICAgICAgIHB1YmxpYyBpbnQgeTsKLSAgICAgICAgcHVibGljIGludCByYXRlOwotICAgICAgICBwdWJsaWMgaW50IGNvdW50OwotICAgICAgICBwdWJsaWMgZmxvYXQgcjsKLSAgICAgICAgcHVibGljIGZsb2F0IGc7Ci0gICAgICAgIHB1YmxpYyBmbG9hdCBiOwotICAgIH0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQQVJUX0NPVU5UID0gNTAwMDA7CiAKICAgICBwdWJsaWMgRm91bnRhaW5SUygpIHsKICAgICB9CiAKKyAgICBwcml2YXRlIFJlc291cmNlcyBtUmVzOworICAgIHByaXZhdGUgUmVuZGVyU2NyaXB0R0wgbVJTOworICAgIHByaXZhdGUgU2NyaXB0Q19Gb3VudGFpbiBtU2NyaXB0OwogICAgIHB1YmxpYyB2b2lkIGluaXQoUmVuZGVyU2NyaXB0R0wgcnMsIFJlc291cmNlcyByZXMsIGludCB3aWR0aCwgaW50IGhlaWdodCkgewogICAgICAgICBtUlMgPSByczsKICAgICAgICAgbVJlcyA9IHJlczsKLSAgICAgICAgaW5pdFJTKCk7CisKKyAgICAgICAgUHJvZ3JhbUZyYWdtZW50LkJ1aWxkZXIgcGZiID0gbmV3IFByb2dyYW1GcmFnbWVudC5CdWlsZGVyKHJzKTsKKyAgICAgICAgcGZiLnNldFZhcnlpbmdDb2xvcih0cnVlKTsKKyAgICAgICAgcnMuY29udGV4dEJpbmRQcm9ncmFtRnJhZ21lbnQocGZiLmNyZWF0ZSgpKTsKKworICAgICAgICBTY3JpcHRGaWVsZF9Qb2ludCBwb2ludHMgPSBuZXcgU2NyaXB0RmllbGRfUG9pbnQobVJTLCBQQVJUX0NPVU5UKTsKKworICAgICAgICBNZXNoLkFsbG9jYXRpb25CdWlsZGVyIHNtYiA9IG5ldyBNZXNoLkFsbG9jYXRpb25CdWlsZGVyKG1SUyk7CisgICAgICAgIHNtYi5hZGRWZXJ0ZXhBbGxvY2F0aW9uKHBvaW50cy5nZXRBbGxvY2F0aW9uKCkpOworICAgICAgICBzbWIuYWRkSW5kZXhUeXBlKFByaW1pdGl2ZS5QT0lOVCk7CisgICAgICAgIE1lc2ggc20gPSBzbWIuY3JlYXRlKCk7CisKKyAgICAgICAgbVNjcmlwdCA9IG5ldyBTY3JpcHRDX0ZvdW50YWluKG1SUywgbVJlcywgUi5yYXcuZm91bnRhaW4sIHRydWUpOworICAgICAgICBtU2NyaXB0LnNldF9wYXJ0TWVzaChzbSk7CisgICAgICAgIG1TY3JpcHQuYmluZF9wb2ludChwb2ludHMpOworICAgICAgICBtUlMuY29udGV4dEJpbmRSb290U2NyaXB0KG1TY3JpcHQpOwogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIG5ld1RvdWNoUG9zaXRpb24oaW50IHgsIGludCB5LCBpbnQgcmF0ZSkgewotICAgICAgICBpZiAobVNELnJhdGUgPT0gMCkgewotICAgICAgICAgICAgbVNELnIgPSAoKHggJiAweDEpICE9IDApID8gMC5mIDogMS5mOwotICAgICAgICAgICAgbVNELmcgPSAoKHggJiAweDIpICE9IDApID8gMC5mIDogMS5mOwotICAgICAgICAgICAgbVNELmIgPSAoKHggJiAweDQpICE9IDApID8gMC5mIDogMS5mOwotICAgICAgICAgICAgaWYgKChtU0QuciArIG1TRC5nICsgbVNELmIpIDwgMC45ZikgewotICAgICAgICAgICAgICAgIG1TRC5yID0gMC44ZjsKLSAgICAgICAgICAgICAgICBtU0QuZyA9IDAuNWY7Ci0gICAgICAgICAgICAgICAgbVNELmIgPSAxLmY7Ci0gICAgICAgICAgICB9CisgICAgYm9vbGVhbiBob2xkaW5nQ29sb3JbXSA9IG5ldyBib29sZWFuWzEwXTsKKyAgICBwdWJsaWMgdm9pZCBuZXdUb3VjaFBvc2l0aW9uKGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHByZXNzdXJlLCBpbnQgaWQpIHsKKyAgICAgICAgaWYgKGlkID4gaG9sZGluZ0NvbG9yLmxlbmd0aCkgeworICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0gICAgICAgIG1TRC5yYXRlID0gcmF0ZTsKLSAgICAgICAgbVNELnggPSB4OwotICAgICAgICBtU0QueSA9IHk7Ci0gICAgICAgIG1JbnRBbGxvYy5kYXRhKG1TRCk7CisgICAgICAgIGludCByYXRlID0gKGludCkocHJlc3N1cmUgKiBwcmVzc3VyZSAqIDUwMC5mKTsKKyAgICAgICAgaWYocmF0ZSA+IDUwMCkgeworICAgICAgICAgICAgcmF0ZSA9IDUwMDsKKyAgICAgICAgfQorICAgICAgICBpZiAocmF0ZSA+IDApIHsKKyAgICAgICAgICAgIG1TY3JpcHQuaW52b2tlX2FkZFBhcnRpY2xlcyhyYXRlLCB4LCB5LCBpZCwgIWhvbGRpbmdDb2xvcltpZF0pOworICAgICAgICAgICAgaG9sZGluZ0NvbG9yW2lkXSA9IHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBob2xkaW5nQ29sb3JbaWRdID0gZmFsc2U7CisgICAgICAgIH0KKwogICAgIH0KLQotCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotICAgIHByaXZhdGUgUmVzb3VyY2VzIG1SZXM7Ci0KLSAgICBwcml2YXRlIFJlbmRlclNjcmlwdEdMIG1SUzsKLSAgICBwcml2YXRlIEFsbG9jYXRpb24gbUludEFsbG9jOwotICAgIHByaXZhdGUgU2ltcGxlTWVzaCBtU007Ci0gICAgcHJpdmF0ZSBTb21lRGF0YSBtU0Q7Ci0gICAgcHJpdmF0ZSBUeXBlIG1TRFR5cGU7Ci0KLSAgICBwcml2YXRlIHZvaWQgaW5pdFJTKCkgewotICAgICAgICBtU0QgPSBuZXcgU29tZURhdGEoKTsKLSAgICAgICAgbVNEVHlwZSA9IFR5cGUuY3JlYXRlRnJvbUNsYXNzKG1SUywgU29tZURhdGEuY2xhc3MsIDEsICJTb21lRGF0YSIpOwotICAgICAgICBtSW50QWxsb2MgPSBBbGxvY2F0aW9uLmNyZWF0ZVR5cGVkKG1SUywgbVNEVHlwZSk7Ci0gICAgICAgIG1TRC5jb3VudCA9IFBBUlRfQ09VTlQ7Ci0gICAgICAgIG1JbnRBbGxvYy5kYXRhKG1TRCk7Ci0KLSAgICAgICAgRWxlbWVudC5CdWlsZGVyIGViID0gbmV3IEVsZW1lbnQuQnVpbGRlcihtUlMpOwotICAgICAgICBlYi5hZGQoRWxlbWVudC5jcmVhdGVWZWN0b3IobVJTLCBFbGVtZW50LkRhdGFUeXBlLkZMT0FUXzMyLCAyKSwgImRlbHRhIik7Ci0gICAgICAgIGViLmFkZChFbGVtZW50LmNyZWF0ZUF0dHJpYihtUlMsIEVsZW1lbnQuRGF0YVR5cGUuRkxPQVRfMzIsIEVsZW1lbnQuRGF0YUtpbmQuUE9TSVRJT04sIDIpLCAicG9zaXRpb24iKTsKLSAgICAgICAgZWIuYWRkKEVsZW1lbnQuY3JlYXRlQXR0cmliKG1SUywgRWxlbWVudC5EYXRhVHlwZS5VTlNJR05FRF84LCBFbGVtZW50LkRhdGFLaW5kLkNPTE9SLCA0KSwgImNvbG9yIik7Ci0gICAgICAgIEVsZW1lbnQgcHJpbUVsZW1lbnQgPSBlYi5jcmVhdGUoKTsKLQotCi0gICAgICAgIFNpbXBsZU1lc2guQnVpbGRlciBzbWIgPSBuZXcgU2ltcGxlTWVzaC5CdWlsZGVyKG1SUyk7Ci0gICAgICAgIGludCB2dHhTbG90ID0gc21iLmFkZFZlcnRleFR5cGUocHJpbUVsZW1lbnQsIFBBUlRfQ09VTlQpOwotICAgICAgICBzbWIuc2V0UHJpbWl0aXZlKFByaW1pdGl2ZS5QT0lOVCk7Ci0gICAgICAgIG1TTSA9IHNtYi5jcmVhdGUoKTsKLSAgICAgICAgbVNNLnNldE5hbWUoIlBhcnRNZXNoIik7Ci0KLSAgICAgICAgQWxsb2NhdGlvbiBwYXJ0QWxsb2MgPSBtU00uY3JlYXRlVmVydGV4QWxsb2NhdGlvbih2dHhTbG90KTsKLSAgICAgICAgcGFydEFsbG9jLnNldE5hbWUoIlBhcnRCdWZmZXIiKTsKLSAgICAgICAgbVNNLmJpbmRWZXJ0ZXhBbGxvY2F0aW9uKHBhcnRBbGxvYywgMCk7Ci0KLSAgICAgICAgLy8gQWxsIHNldHVwIG9mIG5hbWVkIG9iamVjdHMgc2hvdWxkIGJlIGRvbmUgYnkgdGhpcyBwb2ludAotICAgICAgICAvLyBiZWNhdXNlIHdlIGFyZSBhYm91dCB0byBjb21waWxlIHRoZSBzY3JpcHQuCi0gICAgICAgIFNjcmlwdEMuQnVpbGRlciBzYiA9IG5ldyBTY3JpcHRDLkJ1aWxkZXIobVJTKTsKLSAgICAgICAgc2Iuc2V0U2NyaXB0KG1SZXMsIFIucmF3LmZvdW50YWluKTsKLSAgICAgICAgc2Iuc2V0Um9vdCh0cnVlKTsKLSAgICAgICAgc2Iuc2V0VHlwZShtU0RUeXBlLCAiQ29udHJvbCIsIDApOwotICAgICAgICBzYi5zZXRUeXBlKG1TTS5nZXRWZXJ0ZXhUeXBlKDApLCAicG9pbnQiLCAxKTsKLSAgICAgICAgU2NyaXB0IHNjcmlwdCA9IHNiLmNyZWF0ZSgpOwotICAgICAgICBzY3JpcHQuc2V0Q2xlYXJDb2xvcigwLjBmLCAwLjBmLCAwLjBmLCAxLjBmKTsKLQotICAgICAgICBzY3JpcHQuYmluZEFsbG9jYXRpb24obUludEFsbG9jLCAwKTsKLSAgICAgICAgc2NyaXB0LmJpbmRBbGxvY2F0aW9uKHBhcnRBbGxvYywgMSk7Ci0gICAgICAgIG1SUy5jb250ZXh0QmluZFJvb3RTY3JpcHQoc2NyaXB0KTsKLSAgICB9Ci0KIH0KLQotCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvRm91bnRhaW4vc3JjL2NvbS9hbmRyb2lkL2ZvdW50YWluL0ZvdW50YWluVmlldy5qYXZhIGIvbGlicy9ycy9qYXZhL0ZvdW50YWluL3NyYy9jb20vYW5kcm9pZC9mb3VudGFpbi9Gb3VudGFpblZpZXcuamF2YQppbmRleCBkZmQ2YTQ5Li5jMTQxMTY1NmIgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvamF2YS9Gb3VudGFpbi9zcmMvY29tL2FuZHJvaWQvZm91bnRhaW4vRm91bnRhaW5WaWV3LmphdmEKKysrIGIvbGlicy9ycy9qYXZhL0ZvdW50YWluL3NyYy9jb20vYW5kcm9pZC9mb3VudGFpbi9Gb3VudGFpblZpZXcuamF2YQpAQCAtNzEsMTcgKzcxLDMzIEBACiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gb25Ub3VjaEV2ZW50KE1vdGlvbkV2ZW50IGV2KQogICAgIHsKLSAgICAgICAgaW50IGFjdCA9IGV2LmdldEFjdGlvbigpOworICAgICAgICBpbnQgYWN0ID0gZXYuZ2V0QWN0aW9uTWFza2VkKCk7CiAgICAgICAgIGlmIChhY3QgPT0gZXYuQUNUSU9OX1VQKSB7Ci0gICAgICAgICAgICBtUmVuZGVyLm5ld1RvdWNoUG9zaXRpb24oMCwgMCwgMCk7CisgICAgICAgICAgICBtUmVuZGVyLm5ld1RvdWNoUG9zaXRpb24oMCwgMCwgMCwgZXYuZ2V0UG9pbnRlcklkKDApKTsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfSBlbHNlIGlmIChhY3QgPT0gTW90aW9uRXZlbnQuQUNUSU9OX1BPSU5URVJfVVApIHsKKyAgICAgICAgICAgIC8vIG9ubHkgb25lIHBvaW50ZXIgZ29pbmcgdXAsIHdlIGNhbiBnZXQgdGhlIGluZGV4IGxpa2UgdGhpcworICAgICAgICAgICAgaW50IHBvaW50ZXJJbmRleCA9IGV2LmdldEFjdGlvbkluZGV4KCk7CisgICAgICAgICAgICBpbnQgcG9pbnRlcklkID0gZXYuZ2V0UG9pbnRlcklkKHBvaW50ZXJJbmRleCk7CisgICAgICAgICAgICBtUmVuZGVyLm5ld1RvdWNoUG9zaXRpb24oMCwgMCwgMCwgcG9pbnRlcklkKTsKICAgICAgICAgfQotICAgICAgICBmbG9hdCByYXRlID0gKGV2LmdldFByZXNzdXJlKCkgKiA1MC5mKTsKLSAgICAgICAgcmF0ZSAqPSByYXRlOwotICAgICAgICBpZihyYXRlID4gMjAwMC5mKSB7Ci0gICAgICAgICAgICByYXRlID0gMjAwMC5mOworICAgICAgICBpbnQgY291bnQgPSBldi5nZXRIaXN0b3J5U2l6ZSgpOworICAgICAgICBpbnQgcGNvdW50ID0gZXYuZ2V0UG9pbnRlckNvdW50KCk7CisKKyAgICAgICAgZm9yIChpbnQgcD0wOyBwIDwgcGNvdW50OyBwKyspIHsKKyAgICAgICAgICAgIGludCBpZCA9IGV2LmdldFBvaW50ZXJJZChwKTsKKyAgICAgICAgICAgIG1SZW5kZXIubmV3VG91Y2hQb3NpdGlvbihldi5nZXRYKHApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2LmdldFkocCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXYuZ2V0UHJlc3N1cmUocCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQpOworCisgICAgICAgICAgICBmb3IgKGludCBpPTA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgbVJlbmRlci5uZXdUb3VjaFBvc2l0aW9uKGV2LmdldEhpc3RvcmljYWxYKHAsIGkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldi5nZXRIaXN0b3JpY2FsWShwLCBpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXYuZ2V0SGlzdG9yaWNhbFByZXNzdXJlKHAsIGkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgbVJlbmRlci5uZXdUb3VjaFBvc2l0aW9uKChpbnQpZXYuZ2V0WCgpLCAoaW50KWV2LmdldFkoKSwgKGludClyYXRlKTsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ZvdW50YWluL3NyYy9jb20vYW5kcm9pZC9mb3VudGFpbi9mb3VudGFpbi5ycyBiL2xpYnMvcnMvamF2YS9Gb3VudGFpbi9zcmMvY29tL2FuZHJvaWQvZm91bnRhaW4vZm91bnRhaW4ucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODEyY2I3YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvamF2YS9Gb3VudGFpbi9zcmMvY29tL2FuZHJvaWQvZm91bnRhaW4vZm91bnRhaW4ucnMKQEAgLTAsMCArMSw3MiBAQAorLy8gRm91bnRhaW4gdGVzdCBzY3JpcHQKKyNwcmFnbWEgdmVyc2lvbigxKQorCisjcHJhZ21hIHJzIGphdmFfcGFja2FnZV9uYW1lKGNvbS5hbmRyb2lkLmZvdW50YWluKQorCisjcHJhZ21hIHN0YXRlRnJhZ21lbnQocGFyZW50KQorCisjaW5jbHVkZSAicnNfZ3JhcGhpY3MucnNoIgorCitzdGF0aWMgaW50IG5ld1BhcnQgPSAwOworcnNfbWVzaCBwYXJ0TWVzaDsKKwordHlwZWRlZiBzdHJ1Y3QgX19hdHRyaWJ1dGVfXygocGFja2VkLCBhbGlnbmVkKDQpKSkgUG9pbnQgeworICAgIGZsb2F0MiBkZWx0YTsKKyAgICBmbG9hdDIgcG9zaXRpb247CisgICAgdWNoYXI0IGNvbG9yOworfSBQb2ludF90OworUG9pbnRfdCAqcG9pbnQ7CisKKyNwcmFnbWEgcnMgZXhwb3J0X3Zhcihwb2ludCwgcGFydE1lc2gpCisjcHJhZ21hIHJzIGV4cG9ydF9mdW5jKGFkZFBhcnRpY2xlcykKKworaW50IHJvb3QoKSB7CisgICAgZmxvYXQgZHQgPSBtaW4ocnNHZXREdCgpLCAwLjFmKTsKKyAgICByc2dDbGVhckNvbG9yKDAuZiwgMC5mLCAwLmYsIDEuZik7CisgICAgY29uc3QgZmxvYXQgaGVpZ2h0ID0gcnNnR2V0SGVpZ2h0KCk7CisgICAgY29uc3QgaW50IHNpemUgPSByc0FsbG9jYXRpb25HZXREaW1YKHJzR2V0QWxsb2NhdGlvbihwb2ludCkpOworICAgIGZsb2F0IGR5MiA9IGR0ICogKDEwLmYpOworICAgIFBvaW50X3QgKiBwID0gcG9pbnQ7CisgICAgZm9yIChpbnQgY3Q9MDsgY3QgPCBzaXplOyBjdCsrKSB7CisgICAgICAgIHAtPmRlbHRhLnkgKz0gZHkyOworICAgICAgICBwLT5wb3NpdGlvbiArPSBwLT5kZWx0YTsKKyAgICAgICAgaWYgKChwLT5wb3NpdGlvbi55ID4gaGVpZ2h0KSAmJiAocC0+ZGVsdGEueSA+IDApKSB7CisgICAgICAgICAgICBwLT5kZWx0YS55ICo9IC0wLjNmOworICAgICAgICB9CisgICAgICAgIHArKzsKKyAgICB9CisKKyAgICByc2dEcmF3TWVzaChwYXJ0TWVzaCk7CisgICAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBmbG9hdDQgcGFydENvbG9yWzEwXTsKK3ZvaWQgYWRkUGFydGljbGVzKGludCByYXRlLCBmbG9hdCB4LCBmbG9hdCB5LCBpbnQgaW5kZXgsIGJvb2wgbmV3Q29sb3IpCit7CisgICAgaWYgKG5ld0NvbG9yKSB7CisgICAgICAgIHBhcnRDb2xvcltpbmRleF0ueCA9IHJzUmFuZCgwLjVmLCAxLjBmKTsKKyAgICAgICAgcGFydENvbG9yW2luZGV4XS55ID0gcnNSYW5kKDEuMGYpOworICAgICAgICBwYXJ0Q29sb3JbaW5kZXhdLnogPSByc1JhbmQoMS4wZik7CisgICAgfQorICAgIGZsb2F0IHJNYXggPSAoKGZsb2F0KXJhdGUpICogMC4wMmY7CisgICAgaW50IHNpemUgPSByc0FsbG9jYXRpb25HZXREaW1YKHJzR2V0QWxsb2NhdGlvbihwb2ludCkpOworICAgIHVjaGFyNCBjID0gcnNQYWNrQ29sb3JUbzg4ODgocGFydENvbG9yW2luZGV4XSk7CisKKyAgICBQb2ludF90ICogbnAgPSAmcG9pbnRbbmV3UGFydF07CisgICAgZmxvYXQyIHAgPSB7eCwgeX07CisgICAgd2hpbGUgKHJhdGUtLSkgeworICAgICAgICBmbG9hdCBhbmdsZSA9IHJzUmFuZCgzLjE0ZiAqIDIuZik7CisgICAgICAgIGZsb2F0IGxlbiA9IHJzUmFuZChyTWF4KTsKKyAgICAgICAgbnAtPmRlbHRhLnggPSBsZW4gKiBzaW4oYW5nbGUpOworICAgICAgICBucC0+ZGVsdGEueSA9IGxlbiAqIGNvcyhhbmdsZSk7CisgICAgICAgIG5wLT5wb3NpdGlvbiA9IHA7CisgICAgICAgIG5wLT5jb2xvciA9IGM7CisgICAgICAgIG5ld1BhcnQrKzsKKyAgICAgICAgbnArKzsKKyAgICAgICAgaWYgKG5ld1BhcnQgPj0gc2l6ZSkgeworICAgICAgICAgICAgbmV3UGFydCA9IDA7CisgICAgICAgICAgICBucCA9ICZwb2ludFtuZXdQYXJ0XTsKKyAgICAgICAgfQorICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ltYWdlUHJvY2Vzc2luZy9BbmRyb2lkLm1rIGIvbGlicy9ycy9qYXZhL0ltYWdlUHJvY2Vzc2luZy9BbmRyb2lkLm1rCmluZGV4IDgzMzQyN2IuLjdmYTMwZDAgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvamF2YS9JbWFnZVByb2Nlc3NpbmcvQW5kcm9pZC5taworKysgYi9saWJzL3JzL2phdmEvSW1hZ2VQcm9jZXNzaW5nL0FuZHJvaWQubWsKQEAgLTE0LDE0ICsxNCwxOSBAQAogIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAoraWZuZXEgKCQoVEFSR0VUX1NJTVVMQVRPUiksdHJ1ZSkKKwogTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCiAKIExPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCiAKLUxPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykgXAorICAgICAgICAgICAgICAgICAgICQoY2FsbCBhbGwtcmVuZGVyc2NyaXB0LWZpbGVzLXVuZGVyLCBzcmMpCiAjTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQucmVuZGVyc2NyaXB0CiAKIExPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBJbWFnZVByb2Nlc3NpbmcKIAogaW5jbHVkZSAkKEJVSUxEX1BBQ0tBR0UpCisKK2VuZGlmCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvSW1hZ2VQcm9jZXNzaW5nL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9saWJzL3JzL2phdmEvSW1hZ2VQcm9jZXNzaW5nL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggYjQ4ZDIwOC4uZDZhMmRiNCAxMDA2NDQKLS0tIGEvbGlicy9ycy9qYXZhL0ltYWdlUHJvY2Vzc2luZy9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL2xpYnMvcnMvamF2YS9JbWFnZVByb2Nlc3NpbmcvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtNiw3ICs2LDggQEAKICAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLldSSVRFX0VYVEVSTkFMX1NUT1JBR0UiIC8+CiAKICAgICA8YXBwbGljYXRpb24gYW5kcm9pZDpsYWJlbD0iSW1hZ2UgUHJvY2Vzc2luZyI+Ci0gICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9IkltYWdlUHJvY2Vzc2luZ0FjdGl2aXR5Ij4KKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iSW1hZ2VQcm9jZXNzaW5nQWN0aXZpdHkiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOnNjcmVlbk9yaWVudGF0aW9uPSJwb3J0cmFpdCI+CiAgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KICAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CiAgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+CmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvSW1hZ2VQcm9jZXNzaW5nL3Jlcy9kcmF3YWJsZS9kYXRhLmpwZyBiL2xpYnMvcnMvamF2YS9JbWFnZVByb2Nlc3NpbmcvcmVzL2RyYXdhYmxlL2RhdGEuanBnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxYTg3YjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvSW1hZ2VQcm9jZXNzaW5nL3Jlcy9kcmF3YWJsZS9kYXRhLmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvSW1hZ2VQcm9jZXNzaW5nL3Jlcy9sYXlvdXQvbWFpbi54bWwgYi9saWJzL3JzL2phdmEvSW1hZ2VQcm9jZXNzaW5nL3Jlcy9sYXlvdXQvbWFpbi54bWwKaW5kZXggNjc3MGMxOC4uYzZlYzcyOSAxMDA2NDQKLS0tIGEvbGlicy9ycy9qYXZhL0ltYWdlUHJvY2Vzc2luZy9yZXMvbGF5b3V0L21haW4ueG1sCisrKyBiL2xpYnMvcnMvamF2YS9JbWFnZVByb2Nlc3NpbmcvcmVzL2xheW91dC9tYWluLnhtbApAQCAtMjUsOSArMjUsMTQ3IEBACiAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvZGlzcGxheSIKICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjMyMGRpcCIKICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIyNjZkaXAiIC8+Ci0gICAgCisKKyAgICA8QnV0dG9uCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iMTcwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjQwZGlwIgorICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYmVuY2htYXJrIgorICAgICAgICBhbmRyb2lkOm9uQ2xpY2s9ImJlbmNobWFyayIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iYm90dG9tIi8+CisKKyAgICA8VGV4dFZpZXcKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9iZW5jaG1hcmtUZXh0IgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMThzcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iMTAwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Cb3R0b209IjE3NWRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iYm90dG9tIgorICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvc2F0dXJhdGlvbiIvPgorCisgICAgIDxTZWVrQmFyCisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvaW5TYXR1cmF0aW9uIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Cb3R0b209IjE0MGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iMTBkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSIxMGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImJvdHRvbSIgLz4KKworICAgIDxUZXh0VmlldworICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2luU2F0dXJhdGlvblRleHQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIxOHNwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSI1MGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSIxNDJkaXAiCisgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSIjMDAwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJib3R0b20iCisgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9zYXR1cmF0aW9uIi8+CisKICAgICA8U2Vla0JhcgotICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3RocmVzaG9sZCIKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9pbkdhbW1hIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Cb3R0b209IjExMGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iMTBkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSIxMGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImJvdHRvbSIgLz4KKworICAgIDxUZXh0VmlldworICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2luR2FtbWFUZXh0IgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMThzcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iNTBkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iMTEyZGlwIgorICAgICAgICBhbmRyb2lkOnRleHRDb2xvcj0iIzAwMCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iYm90dG9tIgorICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvZ2FtbWEiLz4KKworICAgIDxTZWVrQmFyCisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvb3V0V2hpdGUiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iODBkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjE3MGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjEwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iYm90dG9tIiAvPgorCisgICAgPFRleHRWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvb3V0V2hpdGVUZXh0IgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMThzcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iMjIwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Cb3R0b209IjgyZGlwIgorICAgICAgICBhbmRyb2lkOnRleHRDb2xvcj0iIzAwMCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iYm90dG9tIgorICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvb3V0X3doaXRlIi8+CisKKyAgICA8U2Vla0JhcgorICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2luV2hpdGUiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iODBkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjEwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iMTcwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iYm90dG9tIiAvPgorCisgICAgPFRleHRWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvaW5XaGl0ZVRleHQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIxOHNwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSI1MGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSI4MmRpcCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0Q29sb3I9IiMwMDAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImJvdHRvbSIKKyAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2luX3doaXRlIi8+CisKKyAgICA8U2Vla0JhcgorICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL291dEJsYWNrIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Cb3R0b209IjUwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSIxNzBkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSIxMGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImJvdHRvbSIgLz4KKworICAgIDxUZXh0VmlldworICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL291dEJsYWNrVGV4dCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjE4c3AiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjIyMGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSI1MmRpcCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0Q29sb3I9IiMwMDAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImJvdHRvbSIKKyAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL291dF9ibGFjayIvPgorCisgICAgPFNlZWtCYXIKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9pbkJsYWNrIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Cb3R0b209IjUwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSIxMGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjE3MGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImJvdHRvbSIgLz4KKworICAgIDxUZXh0VmlldworICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2luQmxhY2tUZXh0IgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMThzcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iNTBkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iNTJkaXAiCisgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSIjMDAwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJib3R0b20iCisgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9pbl9ibGFjayIvPgorCisgICAgPFNlZWtCYXIKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9yYWRpdXMiCiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iMTBkaXAiCiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjEwZGlwIgogICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iMTBkaXAiCkBAIC0zNSw0ICsxNzMsMTUgQEAKICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImJvdHRvbSIgLz4KIAorICAgICA8VGV4dFZpZXcKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9ibHVyVGV4dCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjE4c3AiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjUwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Cb3R0b209IjEyZGlwIgorICAgICAgICBhbmRyb2lkOnRleHRDb2xvcj0iIzAwMCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iYm90dG9tIgorICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYmx1cl9kZXNjcmlwdGlvbiIvPgorCiA8L21lcmdlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9JbWFnZVByb2Nlc3NpbmcvcmVzL3Jhdy90aHJlc2hvbGQucnMgYi9saWJzL3JzL2phdmEvSW1hZ2VQcm9jZXNzaW5nL3Jlcy9yYXcvdGhyZXNob2xkLnJzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODhmMGNkLi4wMDAwMDAwCi0tLSBhL2xpYnMvcnMvamF2YS9JbWFnZVByb2Nlc3NpbmcvcmVzL3Jhdy90aHJlc2hvbGQucnMKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKgotLy8gYmxvY2sgb2YgZGVmaW5lcyBtYXRjaGluZyB3aGF0IFJTIHdpbGwgaW5zZXJ0IGF0IHJ1bnRpbWUuCi1zdHJ1Y3QgUGFyYW1zX3N7Ci0gICAgaW50IGluSGVpZ2h0OwotICAgIGludCBpbldpZHRoOwotICAgIGludCBvdXRIZWlnaHQ7Ci0gICAgaW50IG91dFdpZHRoOwotICAgIGZsb2F0IHRocmVzaG9sZDsKLX07Ci1zdHJ1Y3QgUGFyYW1zX3MgKiBQYXJhbXM7Ci1zdHJ1Y3QgSW5QaXhlbF9zewotICAgIGNoYXIgYTsKLSAgICBjaGFyIGI7Ci0gICAgY2hhciBnOwotICAgIGNoYXIgcjsKLX07Ci1zdHJ1Y3QgSW5QaXhlbF9zICogSW5QaXhlbDsKLXN0cnVjdCBPdXRQaXhlbF9zewotICAgIGNoYXIgYTsKLSAgICBjaGFyIGI7Ci0gICAgY2hhciBnOwotICAgIGNoYXIgcjsKLX07Ci1zdHJ1Y3QgT3V0UGl4ZWxfcyAqIE91dFBpeGVsOwotKi8KLQotc3RydWN0IGNvbG9yX3MgewotICAgIGNoYXIgYjsKLSAgICBjaGFyIGc7Ci0gICAgY2hhciByOwotICAgIGNoYXIgYTsKLX07Ci0KLXZvaWQgbWFpbigpIHsKLSAgICBpbnQgdCA9IHVwdGltZU1pbGxpcygpOwotCi0gICAgc3RydWN0IGNvbG9yX3MgKmluID0gKHN0cnVjdCBjb2xvcl9zICopIEluUGl4ZWw7Ci0gICAgc3RydWN0IGNvbG9yX3MgKm91dCA9IChzdHJ1Y3QgY29sb3JfcyAqKSBPdXRQaXhlbDsKLQotICAgIGludCBjb3VudCA9IFBhcmFtcy0+aW5XaWR0aCAqIFBhcmFtcy0+aW5IZWlnaHQ7Ci0gICAgaW50IGk7Ci0gICAgZmxvYXQgdGhyZXNob2xkID0gKFBhcmFtcy0+dGhyZXNob2xkICogMjU1LmYpOwotCi0gICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgZmxvYXQgbHVtaW5hbmNlID0gMC4yMTI1ZiAqIGluLT5yICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgMC43MTU0ZiAqIGluLT5nICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wNzIxZiAqIGluLT5iOwotICAgICAgICBpZiAobHVtaW5hbmNlID4gdGhyZXNob2xkKSB7Ci0gICAgICAgICAgICAqb3V0ID0gKmluOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgKigoaW50ICopb3V0KSA9ICooKGludCAqKWluKSAmIDB4ZmYwMDAwMDA7Ci0gICAgICAgIH0KLQotICAgICAgICBpbisrOwotICAgICAgICBvdXQrKzsKLSAgICB9Ci0KLSAgICB0PSB1cHRpbWVNaWxsaXMoKSAtIHQ7Ci0gICAgZGVidWdJMzIoIkZpbHRlciB0aW1lIiwgdCk7Ci0KLSAgICBzZW5kVG9DbGllbnQoJmNvdW50LCAxLCA0LCAwKTsKLX0KZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9JbWFnZVByb2Nlc3NpbmcvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbCBiL2xpYnMvcnMvamF2YS9JbWFnZVByb2Nlc3NpbmcvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzVjYzRkCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9qYXZhL0ltYWdlUHJvY2Vzc2luZy9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCkBAIC0wLDAgKzEsMzMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisvKgorKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKworPHJlc291cmNlcyB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+CisgICAgPCEtLSBHZW5lcmFsIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLXNsaWRlciBsYWJlbCAtLT4KKyAgICA8c3RyaW5nIG5hbWU9ImJsdXJfZGVzY3JpcHRpb24iPkJsdXIgUmFkaXVzPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJpbl93aGl0ZSI+SW4gV2hpdGU8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im91dF93aGl0ZSI+T3V0IFdoaXRlPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJpbl9ibGFjayI+SW4gQmxhY2s8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im91dF9ibGFjayI+T3V0IEJsYWNrPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJnYW1tYSI+R2FtbWE8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InNhdHVyYXRpb24iPlNhdHVyYXRpb248L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImJlbmNobWFyayI+QmVuY2htYXJrPC9zdHJpbmc+CisKKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ltYWdlUHJvY2Vzc2luZy9zcmMvY29tL2FuZHJvaWQvcnMvaW1hZ2UvSW1hZ2VQcm9jZXNzaW5nQWN0aXZpdHkuamF2YSBiL2xpYnMvcnMvamF2YS9JbWFnZVByb2Nlc3Npbmcvc3JjL2NvbS9hbmRyb2lkL3JzL2ltYWdlL0ltYWdlUHJvY2Vzc2luZ0FjdGl2aXR5LmphdmEKaW5kZXggOWNlNTNkOC4uNGE0ZDgzNyAxMDA2NDQKLS0tIGEvbGlicy9ycy9qYXZhL0ltYWdlUHJvY2Vzc2luZy9zcmMvY29tL2FuZHJvaWQvcnMvaW1hZ2UvSW1hZ2VQcm9jZXNzaW5nQWN0aXZpdHkuamF2YQorKysgYi9saWJzL3JzL2phdmEvSW1hZ2VQcm9jZXNzaW5nL3NyYy9jb20vYW5kcm9pZC9ycy9pbWFnZS9JbWFnZVByb2Nlc3NpbmdBY3Rpdml0eS5qYXZhCkBAIC0zMSw1MyArMzEsNTYgQEAKIGltcG9ydCBhbmRyb2lkLnZpZXcuU3VyZmFjZUhvbGRlcjsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXc7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuU2Vla0JhcjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKIGltcG9ydCBqYXZhLmxhbmcuTWF0aDsKIAotcHVibGljIGNsYXNzIEltYWdlUHJvY2Vzc2luZ0FjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgaW1wbGVtZW50cyBTdXJmYWNlSG9sZGVyLkNhbGxiYWNrIHsKLSAgICBwcml2YXRlIEJpdG1hcCBtQml0bWFwOwotICAgIHByaXZhdGUgUGFyYW1zIG1QYXJhbXM7Ci0gICAgcHJpdmF0ZSBTY3JpcHQuSW52b2thYmxlIG1JbnZva2FibGU7Ci0gICAgcHJpdmF0ZSBpbnRbXSBtSW5EYXRhOwotICAgIHByaXZhdGUgaW50W10gbU91dERhdGE7CitwdWJsaWMgY2xhc3MgSW1hZ2VQcm9jZXNzaW5nQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50cyBTdXJmYWNlSG9sZGVyLkNhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2Vla0Jhci5PblNlZWtCYXJDaGFuZ2VMaXN0ZW5lciB7CisgICAgcHJpdmF0ZSBCaXRtYXAgbUJpdG1hcEluOworICAgIHByaXZhdGUgQml0bWFwIG1CaXRtYXBPdXQ7CisgICAgcHJpdmF0ZSBCaXRtYXAgbUJpdG1hcFNjcmF0Y2g7CisgICAgcHJpdmF0ZSBTY3JpcHRDX1RocmVzaG9sZCBtU2NyaXB0OworICAgIHByaXZhdGUgU2NyaXB0Q19WZXJ0aWNhbF9ibHVyIG1TY3JpcHRWQmx1cjsKKyAgICBwcml2YXRlIFNjcmlwdENfSG9yaXpvbnRhbF9ibHVyIG1TY3JpcHRIQmx1cjsKKyAgICBwcml2YXRlIGludCBtUmFkaXVzID0gMDsKKyAgICBwcml2YXRlIFNlZWtCYXIgbVJhZGl1c1NlZWtCYXI7CisKKyAgICBwcml2YXRlIGZsb2F0IG1JbkJsYWNrID0gMC4wZjsKKyAgICBwcml2YXRlIFNlZWtCYXIgbUluQmxhY2tTZWVrQmFyOworICAgIHByaXZhdGUgZmxvYXQgbU91dEJsYWNrID0gMC4wZjsKKyAgICBwcml2YXRlIFNlZWtCYXIgbU91dEJsYWNrU2Vla0JhcjsKKyAgICBwcml2YXRlIGZsb2F0IG1JbldoaXRlID0gMjU1LjBmOworICAgIHByaXZhdGUgU2Vla0JhciBtSW5XaGl0ZVNlZWtCYXI7CisgICAgcHJpdmF0ZSBmbG9hdCBtT3V0V2hpdGUgPSAyNTUuMGY7CisgICAgcHJpdmF0ZSBTZWVrQmFyIG1PdXRXaGl0ZVNlZWtCYXI7CisgICAgcHJpdmF0ZSBmbG9hdCBtR2FtbWEgPSAxLjBmOworICAgIHByaXZhdGUgU2Vla0JhciBtR2FtbWFTZWVrQmFyOworCisgICAgcHJpdmF0ZSBmbG9hdCBtU2F0dXJhdGlvbiA9IDEuMGY7CisgICAgcHJpdmF0ZSBTZWVrQmFyIG1TYXR1cmF0aW9uU2Vla0JhcjsKKworICAgIHByaXZhdGUgVGV4dFZpZXcgbUJlbmNobWFya1Jlc3VsdDsKIAogICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsiRmllbGRDYW5CZUxvY2FsIn0pCiAgICAgcHJpdmF0ZSBSZW5kZXJTY3JpcHQgbVJTOwogICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsiRmllbGRDYW5CZUxvY2FsIn0pCi0gICAgcHJpdmF0ZSBUeXBlIG1QYXJhbXNUeXBlOwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsiRmllbGRDYW5CZUxvY2FsIn0pCi0gICAgcHJpdmF0ZSBBbGxvY2F0aW9uIG1QYXJhbXNBbGxvY2F0aW9uOwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsiRmllbGRDYW5CZUxvY2FsIn0pCiAgICAgcHJpdmF0ZSBUeXBlIG1QaXhlbFR5cGU7CiAgICAgQFN1cHByZXNzV2FybmluZ3MoeyJGaWVsZENhbkJlTG9jYWwifSkKICAgICBwcml2YXRlIEFsbG9jYXRpb24gbUluUGl4ZWxzQWxsb2NhdGlvbjsKICAgICBAU3VwcHJlc3NXYXJuaW5ncyh7IkZpZWxkQ2FuQmVMb2NhbCJ9KQogICAgIHByaXZhdGUgQWxsb2NhdGlvbiBtT3V0UGl4ZWxzQWxsb2NhdGlvbjsKKyAgICBAU3VwcHJlc3NXYXJuaW5ncyh7IkZpZWxkQ2FuQmVMb2NhbCJ9KQorICAgIHByaXZhdGUgQWxsb2NhdGlvbiBtU2NyYXRjaFBpeGVsc0FsbG9jYXRpb24xOworICAgIHByaXZhdGUgQWxsb2NhdGlvbiBtU2NyYXRjaFBpeGVsc0FsbG9jYXRpb24yOwogCiAgICAgcHJpdmF0ZSBTdXJmYWNlVmlldyBtU3VyZmFjZVZpZXc7CiAgICAgcHJpdmF0ZSBJbWFnZVZpZXcgbURpc3BsYXlWaWV3OwogCi0gICAgc3RhdGljIGNsYXNzIFBhcmFtcyB7Ci0gICAgICAgIHB1YmxpYyBpbnQgaW5XaWR0aDsKLSAgICAgICAgcHVibGljIGludCBvdXRXaWR0aDsKLSAgICAgICAgcHVibGljIGludCBpbkhlaWdodDsKLSAgICAgICAgcHVibGljIGludCBvdXRIZWlnaHQ7Ci0KLSAgICAgICAgcHVibGljIGZsb2F0IHRocmVzaG9sZDsKLSAgICB9Ci0KLSAgICBzdGF0aWMgY2xhc3MgUGl4ZWwgewotICAgICAgICBwdWJsaWMgYnl0ZSBhOwotICAgICAgICBwdWJsaWMgYnl0ZSByOwotICAgICAgICBwdWJsaWMgYnl0ZSBnOwotICAgICAgICBwdWJsaWMgYnl0ZSBiOwotICAgIH0KLQogICAgIGNsYXNzIEZpbHRlckNhbGxiYWNrIGV4dGVuZHMgUmVuZGVyU2NyaXB0LlJTTWVzc2FnZSB7CiAgICAgICAgIHByaXZhdGUgUnVubmFibGUgbUFjdGlvbiA9IG5ldyBSdW5uYWJsZSgpIHsKICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICBtT3V0UGl4ZWxzQWxsb2NhdGlvbi5yZWFkRGF0YShtT3V0RGF0YSk7Ci0gICAgICAgICAgICAgICAgbUJpdG1hcC5zZXRQaXhlbHMobU91dERhdGEsIDAsIG1QYXJhbXMub3V0V2lkdGgsIDAsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICBtUGFyYW1zLm91dFdpZHRoLCBtUGFyYW1zLm91dEhlaWdodCk7CiAgICAgICAgICAgICAgICAgbURpc3BsYXlWaWV3LmludmFsaWRhdGUoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfTsKQEAgLTg5LDI5ICs5MiwyMTggQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHByaXZhdGUgdm9pZCBqYXZhRmlsdGVyKCkgeworICAgIGludCBpbltdOworICAgIGludCBpbnRlcm1bXTsKKyAgICBpbnQgb3V0W107CisgICAgaW50IE1BWF9SQURJVVMgPSAyNTsKKyAgICAvLyBTdG9yZSBvdXIgY29lZmZpY2llbnRzIGhlcmUKKyAgICBmbG9hdCBnYXVzc2lhbltdOworCisgICAgcHJpdmF0ZSBsb25nIGphdmFGaWx0ZXIoKSB7CisgICAgICAgIGZpbmFsIGludCB3aWR0aCA9IG1CaXRtYXBJbi5nZXRXaWR0aCgpOworICAgICAgICBmaW5hbCBpbnQgaGVpZ2h0ID0gbUJpdG1hcEluLmdldEhlaWdodCgpOworICAgICAgICBmaW5hbCBpbnQgY291bnQgPSB3aWR0aCAqIGhlaWdodDsKKworICAgICAgICBpZiAoaW4gPT0gbnVsbCkgeworICAgICAgICAgICAgaW4gPSBuZXcgaW50W2NvdW50XTsKKyAgICAgICAgICAgIGludGVybSA9IG5ldyBpbnRbY291bnRdOworICAgICAgICAgICAgb3V0ID0gbmV3IGludFtjb3VudF07CisgICAgICAgICAgICBnYXVzc2lhbiA9IG5ldyBmbG9hdFtNQVhfUkFESVVTICogMiArIDFdOworICAgICAgICAgICAgbUJpdG1hcEluLmdldFBpeGVscyhpbiwgMCwgd2lkdGgsIDAsIDAsIHdpZHRoLCBoZWlnaHQpOworICAgICAgICB9CisKICAgICAgICAgbG9uZyB0ID0gamF2YS5sYW5nLlN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICBpbnQgY291bnQgPSBtUGFyYW1zLmluV2lkdGggKiBtUGFyYW1zLmluSGVpZ2h0OwotICAgICAgICBmbG9hdCB0aHJlc2hvbGQgPSBtUGFyYW1zLnRocmVzaG9sZCAqIDI1NS5mOwogCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgZmluYWwgZmxvYXQgciA9IChmbG9hdCkoKG1JbkRhdGFbaV0gPj4gMCkgJiAweGZmKTsKLSAgICAgICAgICAgIGZpbmFsIGZsb2F0IGcgPSAoZmxvYXQpKChtSW5EYXRhW2ldID4+IDgpICYgMHhmZik7Ci0gICAgICAgICAgICBmaW5hbCBmbG9hdCBiID0gKGZsb2F0KSgobUluRGF0YVtpXSA+PiAxNikgJiAweGZmKTsKKyAgICAgICAgaW50IHcsIGgsIHI7CiAKLSAgICAgICAgICAgIGZpbmFsIGZsb2F0IGx1bWluYW5jZSA9IDAuMjEyNWYgKiByICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNzE1NGYgKiBnICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDcyMWYgKiBiOwotICAgICAgICAgICAgaWYgKGx1bWluYW5jZSA+IHRocmVzaG9sZCkgewotICAgICAgICAgICAgICAgIG1PdXREYXRhW2ldID0gbUluRGF0YVtpXTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbU91dERhdGFbaV0gPSBtSW5EYXRhW2ldICYgMHhmZjAwMDAwMDsKKyAgICAgICAgZmxvYXQgZlJhZGl1cyA9IChmbG9hdCltUmFkaXVzOworICAgICAgICBpbnQgcmFkaXVzID0gKGludCltUmFkaXVzOworCisgICAgICAgIC8vIENvbXB1dGUgZ2F1c3NpYW4gd2VpZ2h0cyBmb3IgdGhlIGJsdXIKKyAgICAgICAgLy8gZSBpcyB0aGUgZXVsZXIncyBudW1iZXIKKyAgICAgICAgZmxvYXQgZSA9IDIuNzE4MjgxODI4NDU5MDQ1ZjsKKyAgICAgICAgZmxvYXQgcGkgPSAzLjE0MTU5MjY1MzU4OTc5MzJmOworICAgICAgICAvLyBnKHgpID0gKCAxIC8gc3FydCggMiAqIHBpICkgKiBzaWdtYSkgKiBlIF4gKCAteF4yIC8gMiAqIHNpZ21hXjIgKQorICAgICAgICAvLyB4IGlzIG9mIHRoZSBmb3JtIFstcmFkaXVzIC4uIDAgLi4gcmFkaXVzXQorICAgICAgICAvLyBhbmQgc2lnbWEgdmFyaWVzIHdpdGggcmFkaXVzLgorICAgICAgICAvLyBCYXNlZCBvbiBzb21lIGV4cGVyaW1lbnRhbCByYWRpdXMgdmFsdWVzIGFuZCBzaWdtYSdzCisgICAgICAgIC8vIHdlIGFwcHJveGltYXRlbHkgZml0IHNpZ21hID0gZihyYWRpdXMpIGFzCisgICAgICAgIC8vIHNpZ21hID0gcmFkaXVzICogMC40ICArIDAuNgorICAgICAgICAvLyBUaGUgbGFyZ2VyIHRoZSByYWRpdXMgZ2V0cywgdGhlIG1vcmUgb3VyIGdhdXNzaWFuIGJsdXIKKyAgICAgICAgLy8gd2lsbCByZXNlbWJsZSBhIGJveCBibHVyIHNpbmNlIHdpdGggbGFyZ2Ugc2lnbWEKKyAgICAgICAgLy8gdGhlIGdhdXNzaWFuIGN1cnZlIGJlZ2lucyB0byBsb3NlIGl0cyBzaGFwZQorICAgICAgICBmbG9hdCBzaWdtYSA9IDAuNGYgKiBmUmFkaXVzICsgMC42ZjsKKyAgICAgICAgLy8gTm93IGNvbXB1dGUgdGhlIGNvZWZmaWNpbnRzCisgICAgICAgIC8vIFdlIHdpbGwgc3RvcmUgc29tZSByZWR1bmRhbnQgdmFsdWVzIHRvIHNhdmUgc29tZSBtYXRoIGR1cmluZworICAgICAgICAvLyB0aGUgYmx1ciBjYWxjdWxhdGlvbnMKKyAgICAgICAgLy8gcHJlY29tcHV0ZSBzb21lIHZhbHVlcworICAgICAgICBmbG9hdCBjb2VmZjEgPSAxLjBmIC8gKGZsb2F0KShNYXRoLnNxcnQoIDIuMGYgKiBwaSApICogc2lnbWEpOworICAgICAgICBmbG9hdCBjb2VmZjIgPSAtIDEuMGYgLyAoMi4wZiAqIHNpZ21hICogc2lnbWEpOworICAgICAgICBmbG9hdCBub3JtYWxpemVGYWN0b3IgPSAwLjBmOworICAgICAgICBmbG9hdCBmbG9hdFIgPSAwLjBmOworICAgICAgICBmb3IociA9IC1yYWRpdXM7IHIgPD0gcmFkaXVzOyByICsrKSB7CisgICAgICAgICAgICBmbG9hdFIgPSAoZmxvYXQpcjsKKyAgICAgICAgICAgIGdhdXNzaWFuW3IgKyByYWRpdXNdID0gY29lZmYxICogKGZsb2F0KU1hdGgucG93KGUsIGZsb2F0UiAqIGZsb2F0UiAqIGNvZWZmMik7CisgICAgICAgICAgICBub3JtYWxpemVGYWN0b3IgKz0gZ2F1c3NpYW5bciArIHJhZGl1c107CisgICAgICAgIH0KKworICAgICAgICAvL05vdyB3ZSBuZWVkIHRvIG5vcm1hbGl6ZSB0aGUgd2VpZ2h0cyBiZWNhdXNlIGFsbCBvdXIgY29lZmZpY2llbnRzIG5lZWQgdG8gYWRkIHVwIHRvIG9uZQorICAgICAgICBub3JtYWxpemVGYWN0b3IgPSAxLjBmIC8gbm9ybWFsaXplRmFjdG9yOworICAgICAgICBmb3IociA9IC1yYWRpdXM7IHIgPD0gcmFkaXVzOyByICsrKSB7CisgICAgICAgICAgICBmbG9hdFIgPSAoZmxvYXQpcjsKKyAgICAgICAgICAgIGdhdXNzaWFuW3IgKyByYWRpdXNdICo9IG5vcm1hbGl6ZUZhY3RvcjsKKyAgICAgICAgfQorCisgICAgICAgIGZsb2F0IGJsdXJyZWRQaXhlbFIgPSAwLjBmOworICAgICAgICBmbG9hdCBibHVycmVkUGl4ZWxHID0gMC4wZjsKKyAgICAgICAgZmxvYXQgYmx1cnJlZFBpeGVsQiA9IDAuMGY7CisgICAgICAgIGZsb2F0IGJsdXJyZWRQaXhlbEEgPSAwLjBmOworCisgICAgICAgIGZvcihoID0gMDsgaCA8IGhlaWdodDsgaCArKykgeworICAgICAgICAgICAgZm9yKHcgPSAwOyB3IDwgd2lkdGg7IHcgKyspIHsKKworICAgICAgICAgICAgICAgIGJsdXJyZWRQaXhlbFIgPSAwLjBmOworICAgICAgICAgICAgICAgIGJsdXJyZWRQaXhlbEcgPSAwLjBmOworICAgICAgICAgICAgICAgIGJsdXJyZWRQaXhlbEIgPSAwLjBmOworICAgICAgICAgICAgICAgIGJsdXJyZWRQaXhlbEEgPSAwLjBmOworCisgICAgICAgICAgICAgICAgZm9yKHIgPSAtcmFkaXVzOyByIDw9IHJhZGl1czsgciArKykgeworICAgICAgICAgICAgICAgICAgICAvLyBTdGVwcGluZyBsZWZ0IGFuZCByaWdodCBhd2F5IGZyb20gdGhlIHBpeGVsCisgICAgICAgICAgICAgICAgICAgIGludCB2YWxpZFcgPSB3ICsgcjsKKyAgICAgICAgICAgICAgICAgICAgLy8gQ2xhbXAgdG8gemVybyBhbmQgd2lkdGggbWF4KCkgaXNuJ3QgZXhwb3NlZCBmb3IgaW50cyB5ZXQKKyAgICAgICAgICAgICAgICAgICAgaWYodmFsaWRXIDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRXID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZih2YWxpZFcgPiB3aWR0aCAtIDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkVyA9IHdpZHRoIC0gMTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGludCBpbnB1dCA9IGluW2gqd2lkdGggKyB2YWxpZFddOworCisgICAgICAgICAgICAgICAgICAgIGludCBSID0gKChpbnB1dCA+PiAyNCkgJiAweGZmKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IEcgPSAoKGlucHV0ID4+IDE2KSAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgICBpbnQgQiA9ICgoaW5wdXQgPj4gOCkgJiAweGZmKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IEEgPSAoaW5wdXQgJiAweGZmKTsKKworICAgICAgICAgICAgICAgICAgICBmbG9hdCB3ZWlnaHQgPSBnYXVzc2lhbltyICsgcmFkaXVzXTsKKworICAgICAgICAgICAgICAgICAgICBibHVycmVkUGl4ZWxSICs9IChmbG9hdCkoUikqd2VpZ2h0OworICAgICAgICAgICAgICAgICAgICBibHVycmVkUGl4ZWxHICs9IChmbG9hdCkoRykqd2VpZ2h0OworICAgICAgICAgICAgICAgICAgICBibHVycmVkUGl4ZWxCICs9IChmbG9hdCkoQikqd2VpZ2h0OworICAgICAgICAgICAgICAgICAgICBibHVycmVkUGl4ZWxBICs9IChmbG9hdCkoQSkqd2VpZ2h0OworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGludCBSID0gKGludClibHVycmVkUGl4ZWxSOworICAgICAgICAgICAgICAgIGludCBHID0gKGludClibHVycmVkUGl4ZWxHOworICAgICAgICAgICAgICAgIGludCBCID0gKGludClibHVycmVkUGl4ZWxCOworICAgICAgICAgICAgICAgIGludCBBID0gKGludClibHVycmVkUGl4ZWxBOworCisgICAgICAgICAgICAgICAgaW50ZXJtW2gqd2lkdGggKyB3XSA9IChSIDw8IDI0KSB8IChHIDw8IDE2KSB8IChCIDw8IDgpIHwgKEEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yKGggPSAwOyBoIDwgaGVpZ2h0OyBoICsrKSB7CisgICAgICAgICAgICBmb3IodyA9IDA7IHcgPCB3aWR0aDsgdyArKykgeworCisgICAgICAgICAgICAgICAgYmx1cnJlZFBpeGVsUiA9IDAuMGY7CisgICAgICAgICAgICAgICAgYmx1cnJlZFBpeGVsRyA9IDAuMGY7CisgICAgICAgICAgICAgICAgYmx1cnJlZFBpeGVsQiA9IDAuMGY7CisgICAgICAgICAgICAgICAgYmx1cnJlZFBpeGVsQSA9IDAuMGY7CisgICAgICAgICAgICAgICAgZm9yKHIgPSAtcmFkaXVzOyByIDw9IHJhZGl1czsgciArKykgeworICAgICAgICAgICAgICAgICAgICBpbnQgdmFsaWRIID0gaCArIHI7CisgICAgICAgICAgICAgICAgICAgIC8vIENsYW1wIHRvIHplcm8gYW5kIHdpZHRoCisgICAgICAgICAgICAgICAgICAgIGlmKHZhbGlkSCA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkSCA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYodmFsaWRIID4gaGVpZ2h0IC0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRIID0gaGVpZ2h0IC0gMTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGludCBpbnB1dCA9IGludGVybVt2YWxpZEgqd2lkdGggKyB3XTsKKworICAgICAgICAgICAgICAgICAgICBpbnQgUiA9ICgoaW5wdXQgPj4gMjQpICYgMHhmZik7CisgICAgICAgICAgICAgICAgICAgIGludCBHID0gKChpbnB1dCA+PiAxNikgJiAweGZmKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IEIgPSAoKGlucHV0ID4+IDgpICYgMHhmZik7CisgICAgICAgICAgICAgICAgICAgIGludCBBID0gKGlucHV0ICYgMHhmZik7CisKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgd2VpZ2h0ID0gZ2F1c3NpYW5bciArIHJhZGl1c107CisKKyAgICAgICAgICAgICAgICAgICAgYmx1cnJlZFBpeGVsUiArPSAoZmxvYXQpKFIpKndlaWdodDsKKyAgICAgICAgICAgICAgICAgICAgYmx1cnJlZFBpeGVsRyArPSAoZmxvYXQpKEcpKndlaWdodDsKKyAgICAgICAgICAgICAgICAgICAgYmx1cnJlZFBpeGVsQiArPSAoZmxvYXQpKEIpKndlaWdodDsKKyAgICAgICAgICAgICAgICAgICAgYmx1cnJlZFBpeGVsQSArPSAoZmxvYXQpKEEpKndlaWdodDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpbnQgUiA9IChpbnQpYmx1cnJlZFBpeGVsUjsKKyAgICAgICAgICAgICAgICBpbnQgRyA9IChpbnQpYmx1cnJlZFBpeGVsRzsKKyAgICAgICAgICAgICAgICBpbnQgQiA9IChpbnQpYmx1cnJlZFBpeGVsQjsKKyAgICAgICAgICAgICAgICBpbnQgQSA9IChpbnQpYmx1cnJlZFBpeGVsQTsKKworICAgICAgICAgICAgICAgIG91dFtoKndpZHRoICsgd10gPSAoUiA8PCAyNCkgfCAoRyA8PCAxNikgfCAoQiA8PCA4KSB8IChBKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIHQgPSBqYXZhLmxhbmcuU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0OworICAgICAgICBhbmRyb2lkLnV0aWwuTG9nLnYoIkltZyIsICJKYXZhIGZyYW1lIHRpbWUgbXMgIiArIHQpOworICAgICAgICBtQml0bWFwT3V0LnNldFBpeGVscyhvdXQsIDAsIHdpZHRoLCAwLCAwLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgcmV0dXJuIHQ7CisgICAgfQogCi0gICAgICAgIGFuZHJvaWQudXRpbC5Mb2cudigiSW1nIiwgImZyYW1lIHRpbWUgbXMgIiArIHQpOworICAgIHB1YmxpYyB2b2lkIG9uUHJvZ3Jlc3NDaGFuZ2VkKFNlZWtCYXIgc2Vla0JhciwgaW50IHByb2dyZXNzLCBib29sZWFuIGZyb21Vc2VyKSB7CisgICAgICAgIGlmIChmcm9tVXNlcikgeworCisgICAgICAgICAgICBpZihzZWVrQmFyID09IG1SYWRpdXNTZWVrQmFyKSB7CisgICAgICAgICAgICAgICAgZmxvYXQgZlJhZGl1cyA9IHByb2dyZXNzIC8gMTAwLjBmOworICAgICAgICAgICAgICAgIGZSYWRpdXMgKj0gKGZsb2F0KShNQVhfUkFESVVTKTsKKyAgICAgICAgICAgICAgICBtUmFkaXVzID0gKGludClmUmFkaXVzOworCisgICAgICAgICAgICAgICAgbVNjcmlwdC5zZXRfcmFkaXVzKG1SYWRpdXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZihzZWVrQmFyID09IG1JbkJsYWNrU2Vla0JhcikgeworICAgICAgICAgICAgICAgIG1JbkJsYWNrID0gKGZsb2F0KXByb2dyZXNzOworICAgICAgICAgICAgICAgIG1TY3JpcHRWQmx1ci5pbnZva2Vfc2V0TGV2ZWxzKG1JbkJsYWNrLCBtT3V0QmxhY2ssIG1JbldoaXRlLCBtT3V0V2hpdGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZihzZWVrQmFyID09IG1PdXRCbGFja1NlZWtCYXIpIHsKKyAgICAgICAgICAgICAgICBtT3V0QmxhY2sgPSAoZmxvYXQpcHJvZ3Jlc3M7CisgICAgICAgICAgICAgICAgbVNjcmlwdFZCbHVyLmludm9rZV9zZXRMZXZlbHMobUluQmxhY2ssIG1PdXRCbGFjaywgbUluV2hpdGUsIG1PdXRXaGl0ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKHNlZWtCYXIgPT0gbUluV2hpdGVTZWVrQmFyKSB7CisgICAgICAgICAgICAgICAgbUluV2hpdGUgPSAoZmxvYXQpcHJvZ3Jlc3MgKyAxMjcuMGY7CisgICAgICAgICAgICAgICAgbVNjcmlwdFZCbHVyLmludm9rZV9zZXRMZXZlbHMobUluQmxhY2ssIG1PdXRCbGFjaywgbUluV2hpdGUsIG1PdXRXaGl0ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKHNlZWtCYXIgPT0gbU91dFdoaXRlU2Vla0JhcikgeworICAgICAgICAgICAgICAgIG1PdXRXaGl0ZSA9IChmbG9hdClwcm9ncmVzcyArIDEyNy4wZjsKKyAgICAgICAgICAgICAgICBtU2NyaXB0VkJsdXIuaW52b2tlX3NldExldmVscyhtSW5CbGFjaywgbU91dEJsYWNrLCBtSW5XaGl0ZSwgbU91dFdoaXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYoc2Vla0JhciA9PSBtR2FtbWFTZWVrQmFyKSB7CisgICAgICAgICAgICAgICAgbUdhbW1hID0gKGZsb2F0KXByb2dyZXNzLzEwMC4wZjsKKyAgICAgICAgICAgICAgICBtR2FtbWEgPSBNYXRoLm1heChtR2FtbWEsIDAuMWYpOworICAgICAgICAgICAgICAgIG1HYW1tYSA9IDEuMGYgLyBtR2FtbWE7CisgICAgICAgICAgICAgICAgbVNjcmlwdFZCbHVyLmludm9rZV9zZXRHYW1tYShtR2FtbWEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZihzZWVrQmFyID09IG1TYXR1cmF0aW9uU2Vla0JhcikgeworICAgICAgICAgICAgICAgIG1TYXR1cmF0aW9uID0gKGZsb2F0KXByb2dyZXNzIC8gNTAuMGY7CisgICAgICAgICAgICAgICAgbVNjcmlwdFZCbHVyLmludm9rZV9zZXRTYXR1cmF0aW9uKG1TYXR1cmF0aW9uKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbG9uZyB0ID0gamF2YS5sYW5nLlN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICAgICAgaWYgKHRydWUpIHsKKyAgICAgICAgICAgICAgICBtU2NyaXB0Lmludm9rZV9maWx0ZXIoKTsKKyAgICAgICAgICAgICAgICBtUlMuZmluaXNoKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGphdmFGaWx0ZXIoKTsKKyAgICAgICAgICAgICAgICBtRGlzcGxheVZpZXcuaW52YWxpZGF0ZSgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0ID0gamF2YS5sYW5nLlN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gdDsKKyAgICAgICAgICAgIGFuZHJvaWQudXRpbC5Mb2cudigiSW1nIiwgIlJlbmRlcnNjcmlwdCBmcmFtZSB0aW1lIGNvcmUgbXMgIiArIHQpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb25TdGFydFRyYWNraW5nVG91Y2goU2Vla0JhciBzZWVrQmFyKSB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb25TdG9wVHJhY2tpbmdUb3VjaChTZWVrQmFyIHNlZWtCYXIpIHsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTExOSw0NSArMzExLDU0IEBACiAgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CiAgICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0Lm1haW4pOwogCi0gICAgICAgIG1CaXRtYXAgPSBsb2FkQml0bWFwKFIuZHJhd2FibGUuZGF0YSk7CisgICAgICAgIG1CaXRtYXBJbiA9IGxvYWRCaXRtYXAoUi5kcmF3YWJsZS5kYXRhKTsKKyAgICAgICAgbUJpdG1hcE91dCA9IGxvYWRCaXRtYXAoUi5kcmF3YWJsZS5kYXRhKTsKKyAgICAgICAgbUJpdG1hcFNjcmF0Y2ggPSBsb2FkQml0bWFwKFIuZHJhd2FibGUuZGF0YSk7CiAKICAgICAgICAgbVN1cmZhY2VWaWV3ID0gKFN1cmZhY2VWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5zdXJmYWNlKTsKICAgICAgICAgbVN1cmZhY2VWaWV3LmdldEhvbGRlcigpLmFkZENhbGxiYWNrKHRoaXMpOwogCiAgICAgICAgIG1EaXNwbGF5VmlldyA9IChJbWFnZVZpZXcpIGZpbmRWaWV3QnlJZChSLmlkLmRpc3BsYXkpOwotICAgICAgICBtRGlzcGxheVZpZXcuc2V0SW1hZ2VCaXRtYXAobUJpdG1hcCk7CisgICAgICAgIG1EaXNwbGF5Vmlldy5zZXRJbWFnZUJpdG1hcChtQml0bWFwT3V0KTsKIAotICAgICAgICAoKFNlZWtCYXIpIGZpbmRWaWV3QnlJZChSLmlkLnRocmVzaG9sZCkpLnNldE9uU2Vla0JhckNoYW5nZUxpc3RlbmVyKAotICAgICAgICAgICAgICAgIG5ldyBTZWVrQmFyLk9uU2Vla0JhckNoYW5nZUxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgb25Qcm9ncmVzc0NoYW5nZWQoU2Vla0JhciBzZWVrQmFyLCBpbnQgcHJvZ3Jlc3MsIGJvb2xlYW4gZnJvbVVzZXIpIHsKLSAgICAgICAgICAgICAgICBpZiAoZnJvbVVzZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgbVBhcmFtcy50aHJlc2hvbGQgPSBwcm9ncmVzcyAvIDEwMC4wZjsKLSAgICAgICAgICAgICAgICAgICAgbVBhcmFtc0FsbG9jYXRpb24uZGF0YShtUGFyYW1zKTsKKyAgICAgICAgbVJhZGl1c1NlZWtCYXIgPSAoU2Vla0JhcikgZmluZFZpZXdCeUlkKFIuaWQucmFkaXVzKTsKKyAgICAgICAgbVJhZGl1c1NlZWtCYXIuc2V0T25TZWVrQmFyQ2hhbmdlTGlzdGVuZXIodGhpcyk7CiAKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRydWUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1JbnZva2FibGUuZXhlY3V0ZSgpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YUZpbHRlcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgbUJpdG1hcC5zZXRQaXhlbHMobU91dERhdGEsIDAsIG1QYXJhbXMub3V0V2lkdGgsIDAsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QYXJhbXMub3V0V2lkdGgsIG1QYXJhbXMub3V0SGVpZ2h0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1EaXNwbGF5Vmlldy5pbnZhbGlkYXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9CisgICAgICAgIG1JbkJsYWNrU2Vla0JhciA9IChTZWVrQmFyKWZpbmRWaWV3QnlJZChSLmlkLmluQmxhY2spOworICAgICAgICBtSW5CbGFja1NlZWtCYXIuc2V0T25TZWVrQmFyQ2hhbmdlTGlzdGVuZXIodGhpcyk7CisgICAgICAgIG1JbkJsYWNrU2Vla0Jhci5zZXRNYXgoMTI4KTsKKyAgICAgICAgbUluQmxhY2tTZWVrQmFyLnNldFByb2dyZXNzKDApOworICAgICAgICBtT3V0QmxhY2tTZWVrQmFyID0gKFNlZWtCYXIpZmluZFZpZXdCeUlkKFIuaWQub3V0QmxhY2spOworICAgICAgICBtT3V0QmxhY2tTZWVrQmFyLnNldE9uU2Vla0JhckNoYW5nZUxpc3RlbmVyKHRoaXMpOworICAgICAgICBtT3V0QmxhY2tTZWVrQmFyLnNldE1heCgxMjgpOworICAgICAgICBtT3V0QmxhY2tTZWVrQmFyLnNldFByb2dyZXNzKDApOwogCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvblN0YXJ0VHJhY2tpbmdUb3VjaChTZWVrQmFyIHNlZWtCYXIpIHsKLSAgICAgICAgICAgIH0KKyAgICAgICAgbUluV2hpdGVTZWVrQmFyID0gKFNlZWtCYXIpZmluZFZpZXdCeUlkKFIuaWQuaW5XaGl0ZSk7CisgICAgICAgIG1JbldoaXRlU2Vla0Jhci5zZXRPblNlZWtCYXJDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgbUluV2hpdGVTZWVrQmFyLnNldE1heCgxMjgpOworICAgICAgICBtSW5XaGl0ZVNlZWtCYXIuc2V0UHJvZ3Jlc3MoMTI4KTsKKyAgICAgICAgbU91dFdoaXRlU2Vla0JhciA9IChTZWVrQmFyKWZpbmRWaWV3QnlJZChSLmlkLm91dFdoaXRlKTsKKyAgICAgICAgbU91dFdoaXRlU2Vla0Jhci5zZXRPblNlZWtCYXJDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgbU91dFdoaXRlU2Vla0Jhci5zZXRNYXgoMTI4KTsKKyAgICAgICAgbU91dFdoaXRlU2Vla0Jhci5zZXRQcm9ncmVzcygxMjgpOwogCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvblN0b3BUcmFja2luZ1RvdWNoKFNlZWtCYXIgc2Vla0JhcikgewotICAgICAgICAgICAgfQotICAgICAgICB9KTsKKyAgICAgICAgbUdhbW1hU2Vla0JhciA9IChTZWVrQmFyKWZpbmRWaWV3QnlJZChSLmlkLmluR2FtbWEpOworICAgICAgICBtR2FtbWFTZWVrQmFyLnNldE9uU2Vla0JhckNoYW5nZUxpc3RlbmVyKHRoaXMpOworICAgICAgICBtR2FtbWFTZWVrQmFyLnNldE1heCgxNTApOworICAgICAgICBtR2FtbWFTZWVrQmFyLnNldFByb2dyZXNzKDEwMCk7CisKKyAgICAgICAgbVNhdHVyYXRpb25TZWVrQmFyID0gKFNlZWtCYXIpZmluZFZpZXdCeUlkKFIuaWQuaW5TYXR1cmF0aW9uKTsKKyAgICAgICAgbVNhdHVyYXRpb25TZWVrQmFyLnNldE9uU2Vla0JhckNoYW5nZUxpc3RlbmVyKHRoaXMpOworICAgICAgICBtU2F0dXJhdGlvblNlZWtCYXIuc2V0UHJvZ3Jlc3MoNTApOworCisgICAgICAgIG1CZW5jaG1hcmtSZXN1bHQgPSAoVGV4dFZpZXcpIGZpbmRWaWV3QnlJZChSLmlkLmJlbmNobWFya1RleHQpOworICAgICAgICBtQmVuY2htYXJrUmVzdWx0LnNldFRleHQoIkJlbmNobWFyayBubyB5ZXQgcnVuIik7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgc3VyZmFjZUNyZWF0ZWQoU3VyZmFjZUhvbGRlciBob2xkZXIpIHsKLSAgICAgICAgbVBhcmFtcyA9IGNyZWF0ZVBhcmFtcygpOwotICAgICAgICBtSW52b2thYmxlID0gY3JlYXRlU2NyaXB0KCk7Ci0KLSAgICAgICAgbUludm9rYWJsZS5leGVjdXRlKCk7CisgICAgICAgIGNyZWF0ZVNjcmlwdCgpOworICAgICAgICBtU2NyaXB0Lmludm9rZV9maWx0ZXIoKTsKKyAgICAgICAgbVJTLmZpbmlzaCgpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHN1cmZhY2VDaGFuZ2VkKFN1cmZhY2VIb2xkZXIgaG9sZGVyLCBpbnQgZm9ybWF0LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKQEAgLTE2Niw1NCArMzY3LDM4IEBACiAgICAgcHVibGljIHZvaWQgc3VyZmFjZURlc3Ryb3llZChTdXJmYWNlSG9sZGVyIGhvbGRlcikgewogICAgIH0KIAotICAgIHByaXZhdGUgU2NyaXB0Lkludm9rYWJsZSBjcmVhdGVTY3JpcHQoKSB7CisgICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVNjcmlwdCgpIHsKICAgICAgICAgbVJTID0gUmVuZGVyU2NyaXB0LmNyZWF0ZSgpOwogICAgICAgICBtUlMubU1lc3NhZ2VDYWxsYmFjayA9IG5ldyBGaWx0ZXJDYWxsYmFjaygpOwogCi0gICAgICAgIG1QYXJhbXNUeXBlID0gVHlwZS5jcmVhdGVGcm9tQ2xhc3MobVJTLCBQYXJhbXMuY2xhc3MsIDEsICJQYXJhbWV0ZXJzIik7Ci0gICAgICAgIG1QYXJhbXNBbGxvY2F0aW9uID0gQWxsb2NhdGlvbi5jcmVhdGVUeXBlZChtUlMsIG1QYXJhbXNUeXBlKTsKLSAgICAgICAgbVBhcmFtc0FsbG9jYXRpb24uZGF0YShtUGFyYW1zKTsKKyAgICAgICAgbUluUGl4ZWxzQWxsb2NhdGlvbiA9IEFsbG9jYXRpb24uY3JlYXRlQml0bWFwUmVmKG1SUywgbUJpdG1hcEluKTsKKyAgICAgICAgbU91dFBpeGVsc0FsbG9jYXRpb24gPSBBbGxvY2F0aW9uLmNyZWF0ZUJpdG1hcFJlZihtUlMsIG1CaXRtYXBPdXQpOwogCi0gICAgICAgIGZpbmFsIGludCBwaXhlbENvdW50ID0gbVBhcmFtcy5pbldpZHRoICogbVBhcmFtcy5pbkhlaWdodDsKKyAgICAgICAgVHlwZS5CdWlsZGVyIHRiID0gbmV3IFR5cGUuQnVpbGRlcihtUlMsIEVsZW1lbnQuRjMyXzQobVJTKSk7CisgICAgICAgIHRiLmFkZChhbmRyb2lkLnJlbmRlcnNjcmlwdC5EaW1lbnNpb24uWCwgbUJpdG1hcEluLmdldFdpZHRoKCkpOworICAgICAgICB0Yi5hZGQoYW5kcm9pZC5yZW5kZXJzY3JpcHQuRGltZW5zaW9uLlksIG1CaXRtYXBJbi5nZXRIZWlnaHQoKSk7CisgICAgICAgIG1TY3JhdGNoUGl4ZWxzQWxsb2NhdGlvbjEgPSBBbGxvY2F0aW9uLmNyZWF0ZVR5cGVkKG1SUywgdGIuY3JlYXRlKCkpOworICAgICAgICBtU2NyYXRjaFBpeGVsc0FsbG9jYXRpb24yID0gQWxsb2NhdGlvbi5jcmVhdGVUeXBlZChtUlMsIHRiLmNyZWF0ZSgpKTsKIAotICAgICAgICBtUGl4ZWxUeXBlID0gVHlwZS5jcmVhdGVGcm9tQ2xhc3MobVJTLCBQaXhlbC5jbGFzcywgMSwgIlBpeGVsIik7Ci0gICAgICAgIG1JblBpeGVsc0FsbG9jYXRpb24gPSBBbGxvY2F0aW9uLmNyZWF0ZVNpemVkKG1SUywKLSAgICAgICAgICAgICAgICBFbGVtZW50LmNyZWF0ZVVzZXIobVJTLCBFbGVtZW50LkRhdGFUeXBlLlNJR05FRF8zMiksCi0gICAgICAgICAgICAgICAgcGl4ZWxDb3VudCk7Ci0gICAgICAgIG1PdXRQaXhlbHNBbGxvY2F0aW9uID0gQWxsb2NhdGlvbi5jcmVhdGVTaXplZChtUlMsCi0gICAgICAgICAgICAgICAgRWxlbWVudC5jcmVhdGVVc2VyKG1SUywgRWxlbWVudC5EYXRhVHlwZS5TSUdORURfMzIpLAotICAgICAgICAgICAgICAgIHBpeGVsQ291bnQpOworICAgICAgICBtU2NyaXB0VkJsdXIgPSBuZXcgU2NyaXB0Q19WZXJ0aWNhbF9ibHVyKG1SUywgZ2V0UmVzb3VyY2VzKCksIFIucmF3LnZlcnRpY2FsX2JsdXIsIGZhbHNlKTsKKyAgICAgICAgbVNjcmlwdEhCbHVyID0gbmV3IFNjcmlwdENfSG9yaXpvbnRhbF9ibHVyKG1SUywgZ2V0UmVzb3VyY2VzKCksIFIucmF3Lmhvcml6b250YWxfYmx1ciwgZmFsc2UpOwogCi0gICAgICAgIG1JbkRhdGEgPSBuZXcgaW50W3BpeGVsQ291bnRdOwotICAgICAgICBtQml0bWFwLmdldFBpeGVscyhtSW5EYXRhLCAwLCBtUGFyYW1zLmluV2lkdGgsIDAsIDAsIG1QYXJhbXMuaW5XaWR0aCwgbVBhcmFtcy5pbkhlaWdodCk7Ci0gICAgICAgIG1JblBpeGVsc0FsbG9jYXRpb24uZGF0YShtSW5EYXRhKTsKKyAgICAgICAgbVNjcmlwdCA9IG5ldyBTY3JpcHRDX1RocmVzaG9sZChtUlMsIGdldFJlc291cmNlcygpLCBSLnJhdy50aHJlc2hvbGQsIGZhbHNlKTsKKyAgICAgICAgbVNjcmlwdC5zZXRfd2lkdGgobUJpdG1hcEluLmdldFdpZHRoKCkpOworICAgICAgICBtU2NyaXB0LnNldF9oZWlnaHQobUJpdG1hcEluLmdldEhlaWdodCgpKTsKKyAgICAgICAgbVNjcmlwdC5zZXRfcmFkaXVzKG1SYWRpdXMpOwogCi0gICAgICAgIG1PdXREYXRhID0gbmV3IGludFtwaXhlbENvdW50XTsKLSAgICAgICAgbU91dFBpeGVsc0FsbG9jYXRpb24uZGF0YShtT3V0RGF0YSk7CisgICAgICAgIG1TY3JpcHRWQmx1ci5pbnZva2Vfc2V0TGV2ZWxzKG1JbkJsYWNrLCBtT3V0QmxhY2ssIG1JbldoaXRlLCBtT3V0V2hpdGUpOworICAgICAgICBtU2NyaXB0VkJsdXIuaW52b2tlX3NldEdhbW1hKG1HYW1tYSk7CisgICAgICAgIG1TY3JpcHRWQmx1ci5pbnZva2Vfc2V0U2F0dXJhdGlvbihtU2F0dXJhdGlvbik7CiAKLSAgICAgICAgU2NyaXB0Qy5CdWlsZGVyIHNiID0gbmV3IFNjcmlwdEMuQnVpbGRlcihtUlMpOwotICAgICAgICBzYi5zZXRUeXBlKG1QYXJhbXNUeXBlLCAiUGFyYW1zIiwgMCk7Ci0gICAgICAgIHNiLnNldFR5cGUobVBpeGVsVHlwZSwgIkluUGl4ZWwiLCAxKTsKLSAgICAgICAgc2Iuc2V0VHlwZShtUGl4ZWxUeXBlLCAiT3V0UGl4ZWwiLCAyKTsKLSAgICAgICAgc2Iuc2V0VHlwZSh0cnVlLCAyKTsKLSAgICAgICAgU2NyaXB0Lkludm9rYWJsZSBpbnZva2FibGUgPSBzYi5hZGRJbnZva2FibGUoIm1haW4iKTsKLSAgICAgICAgc2Iuc2V0U2NyaXB0KGdldFJlc291cmNlcygpLCBSLnJhdy50aHJlc2hvbGQpOwotICAgICAgICAvL3NiLnNldFJvb3QodHJ1ZSk7CisgICAgICAgIG1TY3JpcHQuYmluZF9JblBpeGVsKG1JblBpeGVsc0FsbG9jYXRpb24pOworICAgICAgICBtU2NyaXB0LmJpbmRfT3V0UGl4ZWwobU91dFBpeGVsc0FsbG9jYXRpb24pOworICAgICAgICBtU2NyaXB0LmJpbmRfU2NyYXRjaFBpeGVsMShtU2NyYXRjaFBpeGVsc0FsbG9jYXRpb24xKTsKKyAgICAgICAgbVNjcmlwdC5iaW5kX1NjcmF0Y2hQaXhlbDIobVNjcmF0Y2hQaXhlbHNBbGxvY2F0aW9uMik7CiAKLSAgICAgICAgU2NyaXB0QyBzY3JpcHQgPSBzYi5jcmVhdGUoKTsKLSAgICAgICAgc2NyaXB0LmJpbmRBbGxvY2F0aW9uKG1QYXJhbXNBbGxvY2F0aW9uLCAwKTsKLSAgICAgICAgc2NyaXB0LmJpbmRBbGxvY2F0aW9uKG1JblBpeGVsc0FsbG9jYXRpb24sIDEpOwotICAgICAgICBzY3JpcHQuYmluZEFsbG9jYXRpb24obU91dFBpeGVsc0FsbG9jYXRpb24sIDIpOwotCi0gICAgICAgIHJldHVybiBpbnZva2FibGU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBQYXJhbXMgY3JlYXRlUGFyYW1zKCkgewotICAgICAgICBmaW5hbCBQYXJhbXMgcGFyYW1zID0gbmV3IFBhcmFtcygpOwotICAgICAgICBwYXJhbXMuaW5XaWR0aCA9IHBhcmFtcy5vdXRXaWR0aCA9IG1CaXRtYXAuZ2V0V2lkdGgoKTsKLSAgICAgICAgcGFyYW1zLmluSGVpZ2h0ID0gcGFyYW1zLm91dEhlaWdodCA9IG1CaXRtYXAuZ2V0SGVpZ2h0KCk7Ci0gICAgICAgIHBhcmFtcy50aHJlc2hvbGQgPSAwLjVmOwotICAgICAgICByZXR1cm4gcGFyYW1zOworICAgICAgICBtU2NyaXB0LnNldF92Qmx1clNjcmlwdChtU2NyaXB0VkJsdXIpOworICAgICAgICBtU2NyaXB0LnNldF9oQmx1clNjcmlwdChtU2NyaXB0SEJsdXIpOwogICAgIH0KIAogICAgIHByaXZhdGUgQml0bWFwIGxvYWRCaXRtYXAoaW50IHJlc291cmNlKSB7CkBAIC0yMjksNCArNDE0LDMwIEBACiAgICAgICAgIHNvdXJjZS5yZWN5Y2xlKCk7CiAgICAgICAgIHJldHVybiBiOwogICAgIH0KKworICAgIC8vIGJ1dHRvbiBob29rCisgICAgcHVibGljIHZvaWQgYmVuY2htYXJrKFZpZXcgdikgeworICAgICAgICBhbmRyb2lkLnV0aWwuTG9nLnYoIkltZyIsICJCZW5jaG1hcmtpbmciKTsKKyAgICAgICAgaW50IG9sZFJhZGl1cyA9IG1SYWRpdXM7CisgICAgICAgIG1SYWRpdXMgPSBNQVhfUkFESVVTOworICAgICAgICBtU2NyaXB0LnNldF9yYWRpdXMobVJhZGl1cyk7CisKKyAgICAgICAgbG9uZyB0ID0gamF2YS5sYW5nLlN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCisgICAgICAgIG1TY3JpcHQuaW52b2tlX2ZpbHRlcigpOworICAgICAgICBtUlMuZmluaXNoKCk7CisKKyAgICAgICAgdCA9IGphdmEubGFuZy5TeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHQ7CisgICAgICAgIGFuZHJvaWQudXRpbC5Mb2cudigiSW1nIiwgIlJlbmRlcnNjcmlwdCBmcmFtZSB0aW1lIGNvcmUgbXMgIiArIHQpOworCisgICAgICAgIC8vbG9uZyBqYXZhVGltZSA9IGphdmFGaWx0ZXIoKTsKKyAgICAgICAgLy9tQmVuY2htYXJrUmVzdWx0LnNldFRleHQoIlJTOiAiICsgdCArICIgbXMgIEphdmE6ICIgKyBqYXZhVGltZSArICIgbXMiKTsKKyAgICAgICAgbUJlbmNobWFya1Jlc3VsdC5zZXRUZXh0KCJSUzogIiArIHQgKyAiIG1zIik7CisKKyAgICAgICAgbVJhZGl1cyA9IG9sZFJhZGl1czsKKyAgICAgICAgbVNjcmlwdC5zZXRfcmFkaXVzKG1SYWRpdXMpOworCisgICAgICAgIG1TY3JpcHQuaW52b2tlX2ZpbHRlcigpOworICAgICAgICBtUlMuZmluaXNoKCk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ltYWdlUHJvY2Vzc2luZy9zcmMvY29tL2FuZHJvaWQvcnMvaW1hZ2UvaG9yaXpvbnRhbF9ibHVyLnJzIGIvbGlicy9ycy9qYXZhL0ltYWdlUHJvY2Vzc2luZy9zcmMvY29tL2FuZHJvaWQvcnMvaW1hZ2UvaG9yaXpvbnRhbF9ibHVyLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmZmZhYzgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvSW1hZ2VQcm9jZXNzaW5nL3NyYy9jb20vYW5kcm9pZC9ycy9pbWFnZS9ob3Jpem9udGFsX2JsdXIucnMKQEAgLTAsMCArMSwzMCBAQAorI3ByYWdtYSB2ZXJzaW9uKDEpCisKKyNpbmNsdWRlICJpcC5yc2giCisKK3ZvaWQgcm9vdChjb25zdCB2b2lkICp2X2luLCB2b2lkICp2X291dCwgY29uc3Qgdm9pZCAqdXNyRGF0YSwgdWludDMyX3QgeCwgdWludDMyX3QgeSkgeworICAgIGZsb2F0NCAqb3V0cHV0ID0gKGZsb2F0NCAqKXZfb3V0OworICAgIGNvbnN0IEZpbHRlclN0cnVjdCAqZnMgPSAoY29uc3QgRmlsdGVyU3RydWN0ICopdXNyRGF0YTsKKyAgICBjb25zdCBmbG9hdDQgKmlucHV0ID0gKGNvbnN0IGZsb2F0NCAqKXJzR2V0RWxlbWVudEF0KGZzLT5haW4sIDAsIHkpOworCisgICAgZmxvYXQzIGJsdXJyZWRQaXhlbCA9IDA7CisgICAgY29uc3QgZmxvYXQgKmdQdHIgPSBmcy0+Z2F1c3NpYW47CisgICAgaWYgKCh4ID4gZnMtPnJhZGl1cykgJiYgKHggPCAoZnMtPndpZHRoIC0gZnMtPnJhZGl1cykpKSB7CisgICAgICAgIGNvbnN0IGZsb2F0NCAqaSA9IGlucHV0ICsgKHggLSBmcy0+cmFkaXVzKTsKKyAgICAgICAgZm9yKGludCByID0gLWZzLT5yYWRpdXM7IHIgPD0gZnMtPnJhZGl1czsgciArKykgeworICAgICAgICAgICAgYmx1cnJlZFBpeGVsICs9IGktPnh5eiAqIGdQdHJbMF07CisgICAgICAgICAgICBnUHRyKys7CisgICAgICAgICAgICBpKys7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBmb3IoaW50IHIgPSAtZnMtPnJhZGl1czsgciA8PSBmcy0+cmFkaXVzOyByICsrKSB7CisgICAgICAgICAgICAvLyBTdGVwcGluZyBsZWZ0IGFuZCByaWdodCBhd2F5IGZyb20gdGhlIHBpeGVsCisgICAgICAgICAgICBpbnQgdmFsaWRXID0gcnNDbGFtcCh4ICsgciwgKHVpbnQpMCwgKHVpbnQpKGZzLT53aWR0aCAtIDEpKTsKKyAgICAgICAgICAgIGJsdXJyZWRQaXhlbCArPSBpbnB1dFt2YWxpZFddLnh5eiAqIGdQdHJbMF07CisgICAgICAgICAgICBnUHRyKys7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBvdXRwdXQtPnh5eiA9IGJsdXJyZWRQaXhlbDsKK30KKwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ltYWdlUHJvY2Vzc2luZy9zcmMvY29tL2FuZHJvaWQvcnMvaW1hZ2UvaXAucnNoIGIvbGlicy9ycy9qYXZhL0ltYWdlUHJvY2Vzc2luZy9zcmMvY29tL2FuZHJvaWQvcnMvaW1hZ2UvaXAucnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkN2E3MTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvSW1hZ2VQcm9jZXNzaW5nL3NyYy9jb20vYW5kcm9pZC9ycy9pbWFnZS9pcC5yc2gKQEAgLTAsMCArMSwxNSBAQAorI3ByYWdtYSBycyBqYXZhX3BhY2thZ2VfbmFtZShjb20uYW5kcm9pZC5ycy5pbWFnZSkKKworI2RlZmluZSBNQVhfUkFESVVTIDI1CisKK3R5cGVkZWYgc3RydWN0IEZpbHRlclN0cnVjdF9zIHsKKyAgICByc19hbGxvY2F0aW9uIGFpbjsKKworICAgIGZsb2F0ICpnYXVzc2lhbjsgLy9bTUFYX1JBRElVUyAqIDIgKyAxXTsKKyAgICBpbnQgaGVpZ2h0OworICAgIGludCB3aWR0aDsKKyAgICBpbnQgcmFkaXVzOworCit9IEZpbHRlclN0cnVjdDsKKworCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvSW1hZ2VQcm9jZXNzaW5nL3NyYy9jb20vYW5kcm9pZC9ycy9pbWFnZS90aHJlc2hvbGQucnMgYi9saWJzL3JzL2phdmEvSW1hZ2VQcm9jZXNzaW5nL3NyYy9jb20vYW5kcm9pZC9ycy9pbWFnZS90aHJlc2hvbGQucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzM5NDVhNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvamF2YS9JbWFnZVByb2Nlc3Npbmcvc3JjL2NvbS9hbmRyb2lkL3JzL2ltYWdlL3RocmVzaG9sZC5ycwpAQCAtMCwwICsxLDk3IEBACisjcHJhZ21hIHZlcnNpb24oMSkKKworI2luY2x1ZGUgImlwLnJzaCIKKworaW50IGhlaWdodDsKK2ludCB3aWR0aDsKK2ludCByYWRpdXM7CisKK3VjaGFyNCAqIEluUGl4ZWw7Cit1Y2hhcjQgKiBPdXRQaXhlbDsKK2Zsb2F0NCAqIFNjcmF0Y2hQaXhlbDE7CitmbG9hdDQgKiBTY3JhdGNoUGl4ZWwyOworCisjcHJhZ21hIHJzIGV4cG9ydF92YXIoaGVpZ2h0LCB3aWR0aCwgcmFkaXVzLCBJblBpeGVsLCBPdXRQaXhlbCwgU2NyYXRjaFBpeGVsMSwgU2NyYXRjaFBpeGVsMiwgdkJsdXJTY3JpcHQsIGhCbHVyU2NyaXB0KQorI3ByYWdtYSBycyBleHBvcnRfZnVuYyhmaWx0ZXIpOworCityc19zY3JpcHQgdkJsdXJTY3JpcHQ7Cityc19zY3JpcHQgaEJsdXJTY3JpcHQ7CisKK2NvbnN0IGludCBDTURfRklOSVNIRUQgPSAxOworCisvLyBTdG9yZSBvdXIgY29lZmZpY2llbnRzIGhlcmUKK3N0YXRpYyBmbG9hdCBnYXVzc2lhbltNQVhfUkFESVVTICogMiArIDFdOworCisKK3N0YXRpYyB2b2lkIGNvbXB1dGVHYXVzc2lhbldlaWdodHMoKSB7CisgICAgLy8gQ29tcHV0ZSBnYXVzc2lhbiB3ZWlnaHRzIGZvciB0aGUgYmx1cgorICAgIC8vIGUgaXMgdGhlIGV1bGVyJ3MgbnVtYmVyCisgICAgZmxvYXQgZSA9IDIuNzE4MjgxODI4NDU5MDQ1ZjsKKyAgICBmbG9hdCBwaSA9IDMuMTQxNTkyNjUzNTg5NzkzMmY7CisgICAgLy8gZyh4KSA9ICggMSAvIHNxcnQoIDIgKiBwaSApICogc2lnbWEpICogZSBeICggLXheMiAvIDIgKiBzaWdtYV4yICkKKyAgICAvLyB4IGlzIG9mIHRoZSBmb3JtIFstcmFkaXVzIC4uIDAgLi4gcmFkaXVzXQorICAgIC8vIGFuZCBzaWdtYSB2YXJpZXMgd2l0aCByYWRpdXMuCisgICAgLy8gQmFzZWQgb24gc29tZSBleHBlcmltZW50YWwgcmFkaXVzIHZhbHVlcyBhbmQgc2lnbWEncworICAgIC8vIHdlIGFwcHJveGltYXRlbHkgZml0IHNpZ21hID0gZihyYWRpdXMpIGFzCisgICAgLy8gc2lnbWEgPSByYWRpdXMgKiAwLjQgICsgMC42CisgICAgLy8gVGhlIGxhcmdlciB0aGUgcmFkaXVzIGdldHMsIHRoZSBtb3JlIG91ciBnYXVzc2lhbiBibHVyCisgICAgLy8gd2lsbCByZXNlbWJsZSBhIGJveCBibHVyIHNpbmNlIHdpdGggbGFyZ2Ugc2lnbWEKKyAgICAvLyB0aGUgZ2F1c3NpYW4gY3VydmUgYmVnaW5zIHRvIGxvc2UgaXRzIHNoYXBlCisgICAgZmxvYXQgc2lnbWEgPSAwLjRmICogKGZsb2F0KXJhZGl1cyArIDAuNmY7CisKKyAgICAvLyBOb3cgY29tcHV0ZSB0aGUgY29lZmZpY2ludHMKKyAgICAvLyBXZSB3aWxsIHN0b3JlIHNvbWUgcmVkdW5kYW50IHZhbHVlcyB0byBzYXZlIHNvbWUgbWF0aCBkdXJpbmcKKyAgICAvLyB0aGUgYmx1ciBjYWxjdWxhdGlvbnMKKyAgICAvLyBwcmVjb21wdXRlIHNvbWUgdmFsdWVzCisgICAgZmxvYXQgY29lZmYxID0gMS4wZiAvIChzcXJ0KCAyLjBmICogcGkgKSAqIHNpZ21hKTsKKyAgICBmbG9hdCBjb2VmZjIgPSAtIDEuMGYgLyAoMi4wZiAqIHNpZ21hICogc2lnbWEpOworCisgICAgZmxvYXQgbm9ybWFsaXplRmFjdG9yID0gMC4wZjsKKyAgICBmbG9hdCBmbG9hdFIgPSAwLjBmOworICAgIGludCByOworICAgIGZvcihyID0gLXJhZGl1czsgciA8PSByYWRpdXM7IHIgKyspIHsKKyAgICAgICAgZmxvYXRSID0gKGZsb2F0KXI7CisgICAgICAgIGdhdXNzaWFuW3IgKyByYWRpdXNdID0gY29lZmYxICogcG93KGUsIGZsb2F0UiAqIGZsb2F0UiAqIGNvZWZmMik7CisgICAgICAgIG5vcm1hbGl6ZUZhY3RvciArPSBnYXVzc2lhbltyICsgcmFkaXVzXTsKKyAgICB9CisKKyAgICAvL05vdyB3ZSBuZWVkIHRvIG5vcm1hbGl6ZSB0aGUgd2VpZ2h0cyBiZWNhdXNlIGFsbCBvdXIgY29lZmZpY2llbnRzIG5lZWQgdG8gYWRkIHVwIHRvIG9uZQorICAgIG5vcm1hbGl6ZUZhY3RvciA9IDEuMGYgLyBub3JtYWxpemVGYWN0b3I7CisgICAgZm9yKHIgPSAtcmFkaXVzOyByIDw9IHJhZGl1czsgciArKykgeworICAgICAgICBmbG9hdFIgPSAoZmxvYXQpcjsKKyAgICAgICAgZ2F1c3NpYW5bciArIHJhZGl1c10gKj0gbm9ybWFsaXplRmFjdG9yOworICAgIH0KK30KKworCitzdGF0aWMgdm9pZCBjb3B5SW5wdXQoKSB7CisgICAgUlNfREVCVUdfTUFSS0VSOworICAgIHJzX2FsbG9jYXRpb24gYWluID0gcnNHZXRBbGxvY2F0aW9uKEluUGl4ZWwpOworICAgIHVpbnQzMl90IGRpbXggPSByc0FsbG9jYXRpb25HZXREaW1YKGFpbik7CisgICAgdWludDMyX3QgZGlteSA9IHJzQWxsb2NhdGlvbkdldERpbVkoYWluKTsKKyAgICBmb3IodWludDMyX3QgeSA9IDA7IHkgPCBkaW15OyB5KyspIHsKKyAgICAgICAgZm9yKHVpbnQzMl90IHggPSAwOyB4IDwgZGlteDsgeCsrKSB7CisgICAgICAgICAgICBTY3JhdGNoUGl4ZWwxW3ggKyB5ICogZGlteF0gPSBjb252ZXJ0X2Zsb2F0NChJblBpeGVsW3ggKyB5ICogZGlteF0pOworICAgICAgICB9CisgICAgfQorICAgIFJTX0RFQlVHX01BUktFUjsKK30KKwordm9pZCBmaWx0ZXIoKSB7CisgICAgY29weUlucHV0KCk7CisgICAgY29tcHV0ZUdhdXNzaWFuV2VpZ2h0cygpOworCisgICAgRmlsdGVyU3RydWN0IGZzOworICAgIGZzLmdhdXNzaWFuID0gZ2F1c3NpYW47CisgICAgZnMud2lkdGggPSB3aWR0aDsKKyAgICBmcy5oZWlnaHQgPSBoZWlnaHQ7CisgICAgZnMucmFkaXVzID0gcmFkaXVzOworCisgICAgZnMuYWluID0gcnNHZXRBbGxvY2F0aW9uKFNjcmF0Y2hQaXhlbDEpOworICAgIHJzRm9yRWFjaChoQmx1clNjcmlwdCwgZnMuYWluLCByc0dldEFsbG9jYXRpb24oU2NyYXRjaFBpeGVsMiksICZmcyk7CisKKyAgICBmcy5haW4gPSByc0dldEFsbG9jYXRpb24oU2NyYXRjaFBpeGVsMik7CisgICAgcnNGb3JFYWNoKHZCbHVyU2NyaXB0LCBmcy5haW4sIHJzR2V0QWxsb2NhdGlvbihPdXRQaXhlbCksICZmcyk7CisgICAgcnNTZW5kVG9DbGllbnRCbG9ja2luZyhDTURfRklOSVNIRUQpOworfQorCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvSW1hZ2VQcm9jZXNzaW5nL3NyYy9jb20vYW5kcm9pZC9ycy9pbWFnZS92ZXJ0aWNhbF9ibHVyLnJzIGIvbGlicy9ycy9qYXZhL0ltYWdlUHJvY2Vzc2luZy9zcmMvY29tL2FuZHJvaWQvcnMvaW1hZ2UvdmVydGljYWxfYmx1ci5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTAxZDJhCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9qYXZhL0ltYWdlUHJvY2Vzc2luZy9zcmMvY29tL2FuZHJvaWQvcnMvaW1hZ2UvdmVydGljYWxfYmx1ci5ycwpAQCAtMCwwICsxLDkyIEBACisjcHJhZ21hIHZlcnNpb24oMSkKKworI2luY2x1ZGUgImlwLnJzaCIKKworc3RhdGljIGZsb2F0IGluQmxhY2s7CitzdGF0aWMgZmxvYXQgb3V0QmxhY2s7CitzdGF0aWMgZmxvYXQgaW5XaGl0ZTsKK3N0YXRpYyBmbG9hdCBvdXRXaGl0ZTsKK3N0YXRpYyBmbG9hdDMgZ2FtbWE7CitzdGF0aWMgZmxvYXQgc2F0dXJhdGlvbjsKKworc3RhdGljIGZsb2F0IGluV01pbkluQjsKK3N0YXRpYyBmbG9hdCBvdXRXTWluT3V0QjsKK3N0YXRpYyBmbG9hdCBvdmVySW5XTWluSW5COworc3RhdGljIHJzX21hdHJpeDN4MyBjb2xvck1hdDsKKworI3ByYWdtYSBycyBleHBvcnRfZnVuYyhzZXRMZXZlbHMsIHNldFNhdHVyYXRpb24sIHNldEdhbW1hKTsKKwordm9pZCBzZXRMZXZlbHMoZmxvYXQgaUJsaywgZmxvYXQgb0JsaywgZmxvYXQgaVdodCwgZmxvYXQgb1dodCkgeworICAgIGluQmxhY2sgPSBpQmxrOworICAgIG91dEJsYWNrID0gb0JsazsKKyAgICBpbldoaXRlID0gaVdodDsKKyAgICBvdXRXaGl0ZSA9IG9XaHQ7CisKKyAgICBpbldNaW5JbkIgPSBpbldoaXRlIC0gaW5CbGFjazsKKyAgICBvdXRXTWluT3V0QiA9IG91dFdoaXRlIC0gb3V0QmxhY2s7CisgICAgb3ZlckluV01pbkluQiA9IDEuZiAvIGluV01pbkluQjsKK30KKwordm9pZCBzZXRTYXR1cmF0aW9uKGZsb2F0IHNhdCkgeworICAgIHNhdHVyYXRpb24gPSBzYXQ7CisKKyAgICAvLyBTYXR1cmF0aW9uCisgICAgLy8gTGluZWFyIHdlaWdodHMKKyAgICAvL2Zsb2F0IHJXZWlnaHQgPSAwLjMwODZmOworICAgIC8vZmxvYXQgZ1dlaWdodCA9IDAuNjA5NGY7CisgICAgLy9mbG9hdCBiV2VpZ2h0ID0gMC4wODIwZjsKKworICAgIC8vIEdhbW1hIDIuMiB3ZWlnaHRzICh3ZSBoYXZlbid0IGNvbnZlcnRlZCBvdXIgaW1hZ2UgdG8gbGluZWFyIHNwYWNlIHlldCBmb3IgcGVyZiByZWFzb25zKQorICAgIGZsb2F0IHJXZWlnaHQgPSAwLjI5OWY7CisgICAgZmxvYXQgZ1dlaWdodCA9IDAuNTg3ZjsKKyAgICBmbG9hdCBiV2VpZ2h0ID0gMC4xMTRmOworCisgICAgZmxvYXQgb25lTWludXNTID0gMS4wZiAtIHNhdHVyYXRpb247CisgICAgcnNNYXRyaXhTZXQoJmNvbG9yTWF0LCAwLCAwLCBvbmVNaW51c1MgKiByV2VpZ2h0ICsgc2F0dXJhdGlvbik7CisgICAgcnNNYXRyaXhTZXQoJmNvbG9yTWF0LCAwLCAxLCBvbmVNaW51c1MgKiByV2VpZ2h0KTsKKyAgICByc01hdHJpeFNldCgmY29sb3JNYXQsIDAsIDIsIG9uZU1pbnVzUyAqIHJXZWlnaHQpOworICAgIHJzTWF0cml4U2V0KCZjb2xvck1hdCwgMSwgMCwgb25lTWludXNTICogZ1dlaWdodCk7CisgICAgcnNNYXRyaXhTZXQoJmNvbG9yTWF0LCAxLCAxLCBvbmVNaW51c1MgKiBnV2VpZ2h0ICsgc2F0dXJhdGlvbik7CisgICAgcnNNYXRyaXhTZXQoJmNvbG9yTWF0LCAxLCAyLCBvbmVNaW51c1MgKiBnV2VpZ2h0KTsKKyAgICByc01hdHJpeFNldCgmY29sb3JNYXQsIDIsIDAsIG9uZU1pbnVzUyAqIGJXZWlnaHQpOworICAgIHJzTWF0cml4U2V0KCZjb2xvck1hdCwgMiwgMSwgb25lTWludXNTICogYldlaWdodCk7CisgICAgcnNNYXRyaXhTZXQoJmNvbG9yTWF0LCAyLCAyLCBvbmVNaW51c1MgKiBiV2VpZ2h0ICsgc2F0dXJhdGlvbik7Cit9CisKK3ZvaWQgc2V0R2FtbWEoZmxvYXQgZykgeworICAgIGdhbW1hID0gKGZsb2F0MylnOworfQorCit2b2lkIHJvb3QoY29uc3Qgdm9pZCAqdl9pbiwgdm9pZCAqdl9vdXQsIGNvbnN0IHZvaWQgKnVzckRhdGEsIHVpbnQzMl90IHgsIHVpbnQzMl90IHkpIHsKKyAgICB1Y2hhcjQgKm91dHB1dCA9ICh1Y2hhcjQgKil2X291dDsKKyAgICBjb25zdCBGaWx0ZXJTdHJ1Y3QgKmZzID0gKGNvbnN0IEZpbHRlclN0cnVjdCAqKXVzckRhdGE7CisgICAgY29uc3QgZmxvYXQ0ICppbnB1dCA9IChjb25zdCBmbG9hdDQgKilyc0dldEVsZW1lbnRBdChmcy0+YWluLCB4LCAwKTsKKworICAgIGZsb2F0MyBibHVycmVkUGl4ZWwgPSAwOworICAgIGNvbnN0IGZsb2F0ICpnUHRyID0gZnMtPmdhdXNzaWFuOworICAgIGlmICgoeSA+IGZzLT5yYWRpdXMpICYmICh5IDwgKGZzLT5oZWlnaHQgLSBmcy0+cmFkaXVzKSkpIHsKKyAgICAgICAgY29uc3QgZmxvYXQ0ICppID0gaW5wdXQgKyAoKHkgLSBmcy0+cmFkaXVzKSAqIGZzLT53aWR0aCk7CisgICAgICAgIGZvcihpbnQgciA9IC1mcy0+cmFkaXVzOyByIDw9IGZzLT5yYWRpdXM7IHIgKyspIHsKKyAgICAgICAgICAgIGJsdXJyZWRQaXhlbCArPSBpLT54eXogKiBnUHRyWzBdOworICAgICAgICAgICAgZ1B0cisrOworICAgICAgICAgICAgaSArPSBmcy0+d2lkdGg7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBmb3IoaW50IHIgPSAtZnMtPnJhZGl1czsgciA8PSBmcy0+cmFkaXVzOyByICsrKSB7CisgICAgICAgICAgICBpbnQgdmFsaWRIID0gcnNDbGFtcCh5ICsgciwgKHVpbnQpMCwgKHVpbnQpKGZzLT5oZWlnaHQgLSAxKSk7CisgICAgICAgICAgICBjb25zdCBmbG9hdDQgKmkgPSBpbnB1dCArIHZhbGlkSCAqIGZzLT53aWR0aDsKKyAgICAgICAgICAgIGJsdXJyZWRQaXhlbCArPSBpLT54eXogKiBnUHRyWzBdOworICAgICAgICAgICAgZ1B0cisrOworICAgICAgICB9CisgICAgfQorCisgICAgZmxvYXQzIHRlbXAgPSByc01hdHJpeE11bHRpcGx5KCZjb2xvck1hdCwgYmx1cnJlZFBpeGVsKTsKKyAgICB0ZW1wID0gKGNsYW1wKHRlbXAsIDAuZiwgMjU1LmYpIC0gaW5CbGFjaykgKiBvdmVySW5XTWluSW5COworICAgIGlmIChnYW1tYS54ICE9IDEuMGYpCisgICAgICAgIHRlbXAgPSBwb3codGVtcCwgKGZsb2F0MylnYW1tYSk7CisgICAgdGVtcCA9IGNsYW1wKHRlbXAgKiBvdXRXTWluT3V0QiArIG91dEJsYWNrLCAwLmYsIDI1NS5mKTsKKworICAgIG91dHB1dC0+eHl6ID0gY29udmVydF91Y2hhcjModGVtcCk7CisgICAgLy9vdXRwdXQtPncgPSBpbnB1dC0+dzsKK30KKwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL01vZGVsVmlld2VyL0FuZHJvaWQubWsgYi9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmU3N2Q3Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9qYXZhL01vZGVsVmlld2VyL0FuZHJvaWQubWsKQEAgLTAsMCArMSwzMSBAQAorIworIyBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworaWZuZXEgKCQoVEFSR0VUX1NJTVVMQVRPUiksdHJ1ZSkKKworTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykgJChjYWxsIGFsbC1yZW5kZXJzY3JpcHQtZmlsZXMtdW5kZXIsIHNyYykKKyNMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC5yZW5kZXJzY3JpcHQKKworTE9DQUxfUEFDS0FHRV9OQU1FIDo9IE1vZGVsVmlld2VyCisKK2luY2x1ZGUgJChCVUlMRF9QQUNLQUdFKQorCitlbmRpZgpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL01vZGVsVmlld2VyL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTlmZTUzCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9qYXZhL01vZGVsVmlld2VyL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTAsMCArMSwyMyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgcGFja2FnZT0iY29tLmFuZHJvaWQubW9kZWx2aWV3ZXIiPgorICAgIDxhcHBsaWNhdGlvbiBhbmRyb2lkOmxhYmVsPSJNb2RlbFZpZXdlciI+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9IlNpbXBsZU1vZGVsIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iU2ltcGxlTW9kZWwiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOnNjcmVlbk9yaWVudGF0aW9uPSJwb3J0cmFpdCIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGhlbWU9IkBhbmRyb2lkOnN0eWxlL1RoZW1lLkJsYWNrLk5vVGl0bGVCYXIiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJTY2VuZUdyYXBoIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iU2NlbmVHcmFwaCIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGhlbWU9IkBhbmRyb2lkOnN0eWxlL1RoZW1lLkJsYWNrLk5vVGl0bGVCYXIiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorICAgIDwvYXBwbGljYXRpb24+Cis8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL01vZGVsVmlld2VyL3Jlcy9kcmF3YWJsZS9yb2JvdC5wbmcgYi9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvcmVzL2RyYXdhYmxlL3JvYm90LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzM1M2ZkCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9qYXZhL01vZGVsVmlld2VyL3Jlcy9kcmF3YWJsZS9yb2JvdC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL01vZGVsVmlld2VyL3Jlcy9yYXcvcm9ib3QuYTNkIGIvbGlicy9ycy9qYXZhL01vZGVsVmlld2VyL3Jlcy9yYXcvcm9ib3QuYTNkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkN2QzMmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvcmVzL3Jhdy9yb2JvdC5hM2QKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL01vZGVsVmlld2VyL3NyYy9jb20vYW5kcm9pZC9tb2RlbHZpZXdlci9TY2VuZUdyYXBoLmphdmEgYi9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvc3JjL2NvbS9hbmRyb2lkL21vZGVsdmlld2VyL1NjZW5lR3JhcGguamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTdlMGNjCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9qYXZhL01vZGVsVmlld2VyL3NyYy9jb20vYW5kcm9pZC9tb2RlbHZpZXdlci9TY2VuZUdyYXBoLmphdmEKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQubW9kZWx2aWV3ZXI7CisKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5SU1N1cmZhY2VWaWV3OworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0LlJlbmRlclNjcmlwdDsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5Mb29wZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOworaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3MuU3lzdGVtOworaW1wb3J0IGFuZHJvaWQudXRpbC5Db25maWc7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUl0ZW07CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvdzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5CdXR0b247CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGlzdFZpZXc7CisKK2ltcG9ydCBqYXZhLmxhbmcuUnVudGltZTsKKworcHVibGljIGNsYXNzIFNjZW5lR3JhcGggZXh0ZW5kcyBBY3Rpdml0eSB7CisKKyAgICBwcml2YXRlIFNjZW5lR3JhcGhWaWV3IG1WaWV3OworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25DcmVhdGUoQnVuZGxlIGljaWNsZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShpY2ljbGUpOworCisgICAgICAgIC8vIENyZWF0ZSBvdXIgUHJldmlldyB2aWV3IGFuZCBzZXQgaXQgYXMgdGhlIGNvbnRlbnQgb2Ygb3VyCisgICAgICAgIC8vIEFjdGl2aXR5CisgICAgICAgIG1WaWV3ID0gbmV3IFNjZW5lR3JhcGhWaWV3KHRoaXMpOworICAgICAgICBzZXRDb250ZW50VmlldyhtVmlldyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25SZXN1bWUoKSB7CisgICAgICAgIC8vIElkZWFsbHkgYSBnYW1lIHNob3VsZCBpbXBsZW1lbnQgb25SZXN1bWUoKSBhbmQgb25QYXVzZSgpCisgICAgICAgIC8vIHRvIHRha2UgYXBwcm9wcmlhdGUgYWN0aW9uIHdoZW4gdGhlIGFjdGl2aXR5IGxvb3NlcyBmb2N1cworICAgICAgICBzdXBlci5vblJlc3VtZSgpOworICAgICAgICBtVmlldy5vblJlc3VtZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uUGF1c2UoKSB7CisgICAgICAgIC8vIElkZWFsbHkgYSBnYW1lIHNob3VsZCBpbXBsZW1lbnQgb25SZXN1bWUoKSBhbmQgb25QYXVzZSgpCisgICAgICAgIC8vIHRvIHRha2UgYXBwcm9wcmlhdGUgYWN0aW9uIHdoZW4gdGhlIGFjdGl2aXR5IGxvb3NlcyBmb2N1cworICAgICAgICBzdXBlci5vblBhdXNlKCk7CisgICAgICAgIG1WaWV3Lm9uUGF1c2UoKTsKKyAgICB9CisKK30KKwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL01vZGVsVmlld2VyL3NyYy9jb20vYW5kcm9pZC9tb2RlbHZpZXdlci9TY2VuZUdyYXBoUlMuamF2YSBiL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9zcmMvY29tL2FuZHJvaWQvbW9kZWx2aWV3ZXIvU2NlbmVHcmFwaFJTLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY3MmE2YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9zcmMvY29tL2FuZHJvaWQvbW9kZWx2aWV3ZXIvU2NlbmVHcmFwaFJTLmphdmEKQEAgLTAsMCArMSwyMjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLm1vZGVsdmlld2VyOworCitpbXBvcnQgamF2YS5pby5Xcml0ZXI7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuKjsKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5FbGVtZW50LkJ1aWxkZXI7CitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUHJvZ3JhbVN0b3JlLkRlcHRoRnVuYzsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCisKK3B1YmxpYyBjbGFzcyBTY2VuZUdyYXBoUlMgeworCisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgU1RBVEVfTEFTVF9GT0NVUyA9IDE7CisKKyAgICBpbnQgbVdpZHRoOworICAgIGludCBtSGVpZ2h0OworICAgIGludCBtUm90YXRpb247CisKKyAgICBwdWJsaWMgU2NlbmVHcmFwaFJTKCkgeworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGluaXQoUmVuZGVyU2NyaXB0R0wgcnMsIFJlc291cmNlcyByZXMsIGludCB3aWR0aCwgaW50IGhlaWdodCkgeworICAgICAgICBtUlMgPSByczsKKyAgICAgICAgbVJlcyA9IHJlczsKKyAgICAgICAgbVdpZHRoID0gd2lkdGg7CisgICAgICAgIG1IZWlnaHQgPSBoZWlnaHQ7CisgICAgICAgIG1Sb3RhdGlvbiA9IDA7CisgICAgICAgIGluaXRSUygpOworICAgIH0KKworICAgIHByaXZhdGUgUmVzb3VyY2VzIG1SZXM7CisgICAgcHJpdmF0ZSBSZW5kZXJTY3JpcHRHTCBtUlM7CisgICAgcHJpdmF0ZSBTYW1wbGVyIG1TYW1wbGVyOworICAgIHByaXZhdGUgUHJvZ3JhbVN0b3JlIG1QU0JhY2tncm91bmQ7CisgICAgcHJpdmF0ZSBQcm9ncmFtRnJhZ21lbnQgbVBGQmFja2dyb3VuZDsKKyAgICBwcml2YXRlIFByb2dyYW1WZXJ0ZXggbVBWQmFja2dyb3VuZDsKKyAgICBwcml2YXRlIFByb2dyYW1WZXJ0ZXguTWF0cml4QWxsb2NhdGlvbiBtUFZBOworCisgICAgcHJpdmF0ZSBBbGxvY2F0aW9uIG1HcmlkSW1hZ2U7CisgICAgcHJpdmF0ZSBBbGxvY2F0aW9uIG1BbGxvY1BWOworCisgICAgcHJpdmF0ZSBNZXNoIG1NZXNoOworCisgICAgcHJpdmF0ZSBGb250IG1JdGFsaWM7CisgICAgcHJpdmF0ZSBBbGxvY2F0aW9uIG1UZXh0QWxsb2M7CisKKyAgICBwcml2YXRlIFNjcmlwdENfU2NlbmVncmFwaCBtU2NyaXB0OworICAgIHByaXZhdGUgU2NyaXB0Q19UcmFuc2Zvcm0gbVRyYW5zZm9ybVNjcmlwdDsKKworICAgIGludCBtTGFzdFg7CisgICAgaW50IG1MYXN0WTsKKworICAgIHB1YmxpYyB2b2lkIHRvdWNoRXZlbnQoaW50IHgsIGludCB5KSB7CisgICAgICAgIGludCBkeCA9IG1MYXN0WCAtIHg7CisgICAgICAgIGlmKE1hdGguYWJzKGR4KSA+IDUwIHx8IE1hdGguYWJzKGR4KSA8IDMpIHsKKyAgICAgICAgICAgIGR4ID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIG1Sb3RhdGlvbiAtPSBkeDsKKyAgICAgICAgaWYobVJvdGF0aW9uID4gMzYwKSB7CisgICAgICAgICAgICBtUm90YXRpb24gLT0gMzYwOworICAgICAgICB9CisgICAgICAgIGlmKG1Sb3RhdGlvbiA8IDApIHsKKyAgICAgICAgICAgIG1Sb3RhdGlvbiArPSAzNjA7CisgICAgICAgIH0KKworICAgICAgICBtU2NyaXB0LnNldF9nUm90YXRlKC0oZmxvYXQpbVJvdGF0aW9uKTsKKworICAgICAgICBtTGFzdFggPSB4OworICAgICAgICBtTGFzdFkgPSB5OworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbml0UEZTKCkgeworICAgICAgICBQcm9ncmFtU3RvcmUuQnVpbGRlciBiID0gbmV3IFByb2dyYW1TdG9yZS5CdWlsZGVyKG1SUyk7CisKKyAgICAgICAgYi5zZXREZXB0aEZ1bmMoUHJvZ3JhbVN0b3JlLkRlcHRoRnVuYy5MRVNTKTsKKyAgICAgICAgYi5zZXREaXRoZXJFbmFibGUoZmFsc2UpOworICAgICAgICBiLnNldERlcHRoTWFzayh0cnVlKTsKKyAgICAgICAgbVBTQmFja2dyb3VuZCA9IGIuY3JlYXRlKCk7CisKKyAgICAgICAgbVNjcmlwdC5zZXRfZ1BGU0JhY2tncm91bmQobVBTQmFja2dyb3VuZCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGluaXRQRigpIHsKKyAgICAgICAgU2FtcGxlci5CdWlsZGVyIGJzID0gbmV3IFNhbXBsZXIuQnVpbGRlcihtUlMpOworICAgICAgICBicy5zZXRNaW4oU2FtcGxlci5WYWx1ZS5MSU5FQVIpOworICAgICAgICBicy5zZXRNYWcoU2FtcGxlci5WYWx1ZS5MSU5FQVIpOworICAgICAgICBicy5zZXRXcmFwUyhTYW1wbGVyLlZhbHVlLkNMQU1QKTsKKyAgICAgICAgYnMuc2V0V3JhcFQoU2FtcGxlci5WYWx1ZS5XUkFQKTsKKyAgICAgICAgbVNhbXBsZXIgPSBicy5jcmVhdGUoKTsKKworICAgICAgICBQcm9ncmFtRnJhZ21lbnQuQnVpbGRlciBiID0gbmV3IFByb2dyYW1GcmFnbWVudC5CdWlsZGVyKG1SUyk7CisgICAgICAgIGIuc2V0VGV4dHVyZShQcm9ncmFtRnJhZ21lbnQuQnVpbGRlci5FbnZNb2RlLlJFUExBQ0UsCisgICAgICAgICAgICAgICAgICAgICBQcm9ncmFtRnJhZ21lbnQuQnVpbGRlci5Gb3JtYXQuUkdCQSwgMCk7CisgICAgICAgIG1QRkJhY2tncm91bmQgPSBiLmNyZWF0ZSgpOworICAgICAgICBtUEZCYWNrZ3JvdW5kLmJpbmRTYW1wbGVyKG1TYW1wbGVyLCAwKTsKKworICAgICAgICBtU2NyaXB0LnNldF9nUEZCYWNrZ3JvdW5kKG1QRkJhY2tncm91bmQpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbml0UFYoKSB7CisgICAgICAgIFByb2dyYW1WZXJ0ZXguQnVpbGRlciBwdmIgPSBuZXcgUHJvZ3JhbVZlcnRleC5CdWlsZGVyKG1SUyk7CisgICAgICAgIG1QVkJhY2tncm91bmQgPSBwdmIuY3JlYXRlKCk7CisKKyAgICAgICAgbVBWQSA9IG5ldyBQcm9ncmFtVmVydGV4Lk1hdHJpeEFsbG9jYXRpb24obVJTKTsKKyAgICAgICAgbVBWQmFja2dyb3VuZC5iaW5kQWxsb2NhdGlvbihtUFZBKTsKKyAgICAgICAgbVBWQS5zZXR1cFByb2plY3Rpb25Ob3JtYWxpemVkKG1XaWR0aCwgbUhlaWdodCk7CisKKyAgICAgICAgbVNjcmlwdC5zZXRfZ1BWQmFja2dyb3VuZChtUFZCYWNrZ3JvdW5kKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgbG9hZEltYWdlKCkgeworICAgICAgICBtR3JpZEltYWdlID0gQWxsb2NhdGlvbi5jcmVhdGVGcm9tQml0bWFwUmVzb3VyY2VCb3hlZChtUlMsIG1SZXMsIFIuZHJhd2FibGUucm9ib3QsIEVsZW1lbnQuUkdCXzU2NShtUlMpLCB0cnVlKTsKKyAgICAgICAgbUdyaWRJbWFnZS51cGxvYWRUb1RleHR1cmUoMCk7CisKKyAgICAgICAgbVNjcmlwdC5zZXRfZ1RHcmlkKG1HcmlkSW1hZ2UpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbml0VGV4dEFsbG9jYXRpb24oKSB7CisgICAgICAgIFN0cmluZyBhbGxvY1N0cmluZyA9ICJEaXNwbGF5aW5nIGZpbGU6IFIucmF3LnJvYm90IjsKKyAgICAgICAgbVRleHRBbGxvYyA9IEFsbG9jYXRpb24uY3JlYXRlRnJvbVN0cmluZyhtUlMsIGFsbG9jU3RyaW5nKTsKKyAgICAgICAgbVNjcmlwdC5zZXRfZ1RleHRBbGxvYyhtVGV4dEFsbG9jKTsKKyAgICB9CisKKyAgICBTZ1RyYW5zZm9ybSBtUm9vdFRyYW5zZm9ybTsKKyAgICBTZ1RyYW5zZm9ybSBtR3JvdXAxOworCisgICAgU2dUcmFuc2Zvcm0gbVJvYm90MTsKKyAgICBTZ1RyYW5zZm9ybSBtUm9ib3QyOworCisgICAgdm9pZCBpbml0VHJhbnNmb3JtSGllcmFyY2h5KCkgeworICAgICAgICBtUm9vdFRyYW5zZm9ybSA9IG5ldyBTZ1RyYW5zZm9ybShtUlMpOworCisgICAgICAgIG1Hcm91cDEgPSBuZXcgU2dUcmFuc2Zvcm0obVJTKTsKKyAgICAgICAgbVJvb3RUcmFuc2Zvcm0uYWRkQ2hpbGQobUdyb3VwMSk7CisKKyAgICAgICAgbVJvYm90MSA9IG5ldyBTZ1RyYW5zZm9ybShtUlMpOworICAgICAgICBtUm9ib3QyID0gbmV3IFNnVHJhbnNmb3JtKG1SUyk7CisKKyAgICAgICAgbUdyb3VwMS5hZGRDaGlsZChtUm9ib3QxKTsKKyAgICAgICAgbUdyb3VwMS5hZGRDaGlsZChtUm9ib3QyKTsKKworICAgICAgICBtR3JvdXAxLnNldFRyYW5zZm9ybSgwLCBuZXcgRmxvYXQ0KDAuMGYsIDAuMGYsIDUuMGYsIDAuMGYpLCBUcmFuc2Zvcm1UeXBlLlRSQU5TTEFURSk7CisgICAgICAgIG1Hcm91cDEuc2V0VHJhbnNmb3JtKDEsIG5ldyBGbG9hdDQoMC4wZiwgMS4wZiwgMC4wZiwgMTUuMGYpLCBUcmFuc2Zvcm1UeXBlLlJPVEFURSk7CisKKyAgICAgICAgbVJvYm90MS5zZXRUcmFuc2Zvcm0oMCwgbmV3IEZsb2F0NCgtMi4wZiwgLTAuNWYsIDAuMGYsIDAuMGYpLCBUcmFuc2Zvcm1UeXBlLlRSQU5TTEFURSk7CisgICAgICAgIG1Sb2JvdDEuc2V0VHJhbnNmb3JtKDEsIG5ldyBGbG9hdDQoMC4wZiwgMS4wZiwgMC4wZiwgMjAuMGYpLCBUcmFuc2Zvcm1UeXBlLlJPVEFURSk7CisgICAgICAgIG1Sb2JvdDEuc2V0VHJhbnNmb3JtKDIsIG5ldyBGbG9hdDQoMC4yZiwgMC4yZiwgMC4yZiwgMC4wZiksIFRyYW5zZm9ybVR5cGUuU0NBTEUpOworCisgICAgICAgIG1Sb2JvdDIuc2V0VHJhbnNmb3JtKDAsIG5ldyBGbG9hdDQoMi4wZiwgMC4wZiwgMC4wZiwgMC4wZiksIFRyYW5zZm9ybVR5cGUuVFJBTlNMQVRFKTsKKyAgICAgICAgbVJvYm90Mi5zZXRUcmFuc2Zvcm0oMSwgbmV3IEZsb2F0NCgwLjBmLCAxLjBmLCAwLjBmLCAtMjAuMGYpLCBUcmFuc2Zvcm1UeXBlLlJPVEFURSk7CisgICAgICAgIG1Sb2JvdDIuc2V0VHJhbnNmb3JtKDIsIG5ldyBGbG9hdDQoMC4zZiwgMC4zZiwgMC4zZiwgMC4wZiksIFRyYW5zZm9ybVR5cGUuU0NBTEUpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbml0UlMoKSB7CisKKyAgICAgICAgbVNjcmlwdCA9IG5ldyBTY3JpcHRDX1NjZW5lZ3JhcGgobVJTLCBtUmVzLCBSLnJhdy5zY2VuZWdyYXBoLCB0cnVlKTsKKyAgICAgICAgbVRyYW5zZm9ybVNjcmlwdCA9IG5ldyBTY3JpcHRDX1RyYW5zZm9ybShtUlMsIG1SZXMsIFIucmF3LnRyYW5zZm9ybSwgZmFsc2UpOworICAgICAgICBtVHJhbnNmb3JtU2NyaXB0LnNldF90cmFuc2Zvcm1TY3JpcHQobVRyYW5zZm9ybVNjcmlwdCk7CisKKyAgICAgICAgbVNjcmlwdC5zZXRfZ1RyYW5zZm9ybVJTKG1UcmFuc2Zvcm1TY3JpcHQpOworCisgICAgICAgIGluaXRQRlMoKTsKKyAgICAgICAgaW5pdFBGKCk7CisgICAgICAgIGluaXRQVigpOworCisgICAgICAgIGxvYWRJbWFnZSgpOworCisgICAgICAgIEZpbGVBM0QgbW9kZWwgPSBGaWxlQTNELmNyZWF0ZUZyb21SZXNvdXJjZShtUlMsIG1SZXMsIFIucmF3LnJvYm90KTsKKyAgICAgICAgRmlsZUEzRC5JbmRleEVudHJ5IGVudHJ5ID0gbW9kZWwuZ2V0SW5kZXhFbnRyeSgwKTsKKyAgICAgICAgaWYoZW50cnkgPT0gbnVsbCB8fCBlbnRyeS5nZXRDbGFzc0lEKCkgIT0gRmlsZUEzRC5DbGFzc0lELk1FU0gpIHsKKyAgICAgICAgICAgIExvZy5lKCJycyIsICJjb3VsZCBub3QgbG9hZCBtb2RlbCIpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgbU1lc2ggPSAoTWVzaCllbnRyeS5nZXRPYmplY3QoKTsKKyAgICAgICAgICAgIG1TY3JpcHQuc2V0X2dUZXN0TWVzaChtTWVzaCk7CisgICAgICAgIH0KKworICAgICAgICBtSXRhbGljID0gRm9udC5jcmVhdGUobVJTLCBtUmVzLCAiRHJvaWRTZXJpZi1JdGFsaWMudHRmIiwgOCk7CisgICAgICAgIG1TY3JpcHQuc2V0X2dJdGFsaWMobUl0YWxpYyk7CisKKyAgICAgICAgaW5pdFRleHRBbGxvY2F0aW9uKCk7CisKKyAgICAgICAgaW5pdFRyYW5zZm9ybUhpZXJhcmNoeSgpOworCisgICAgICAgIExvZy52KCI9PT09PT09PVNjZW5lR3JhcGg9PT09PT09PSIsICJ0cmFuc2Zvcm0gaGllcmFyY2h5IGluaXRpYWxpemVkIik7CisKKyAgICAgICAgbVNjcmlwdC5iaW5kX2dSb290Tm9kZShtUm9vdFRyYW5zZm9ybS5nZXRGaWVsZCgpKTsKKworICAgICAgICBtU2NyaXB0LmJpbmRfZ0dyb3VwKG1Hcm91cDEubVBhcmVudC5tQ2hpbGRGaWVsZCk7CisgICAgICAgIG1TY3JpcHQuYmluZF9nUm9ib3QxKG1Sb2JvdDEubVBhcmVudC5tQ2hpbGRGaWVsZCk7CisgICAgICAgIG1TY3JpcHQuc2V0X2dSb2JvdDFJbmRleChtUm9ib3QxLm1JbmRleEluUGFyZW50R3JvdXApOworICAgICAgICBtU2NyaXB0LmJpbmRfZ1JvYm90MihtUm9ib3QyLm1QYXJlbnQubUNoaWxkRmllbGQpOworICAgICAgICBtU2NyaXB0LnNldF9nUm9ib3QySW5kZXgobVJvYm90Mi5tSW5kZXhJblBhcmVudEdyb3VwKTsKKworICAgICAgICBtUlMuY29udGV4dEJpbmRSb290U2NyaXB0KG1TY3JpcHQpOworICAgIH0KK30KKworCisKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9zcmMvY29tL2FuZHJvaWQvbW9kZWx2aWV3ZXIvU2NlbmVHcmFwaFZpZXcuamF2YSBiL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9zcmMvY29tL2FuZHJvaWQvbW9kZWx2aWV3ZXIvU2NlbmVHcmFwaFZpZXcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGE1OWIyCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9qYXZhL01vZGVsVmlld2VyL3NyYy9jb20vYW5kcm9pZC9tb2RlbHZpZXdlci9TY2VuZUdyYXBoVmlldy5qYXZhCkBAIC0wLDAgKzEsOTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLm1vZGVsdmlld2VyOworCitpbXBvcnQgamF2YS5pby5Xcml0ZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5TZW1hcGhvcmU7CisKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5SU1N1cmZhY2VWaWV3OworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0LlJlbmRlclNjcmlwdDsKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5SZW5kZXJTY3JpcHRHTDsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuQml0bWFwRHJhd2FibGU7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOworaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuU3VyZmFjZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuU3VyZmFjZUhvbGRlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuU3VyZmFjZVZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OworaW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudDsKKworcHVibGljIGNsYXNzIFNjZW5lR3JhcGhWaWV3IGV4dGVuZHMgUlNTdXJmYWNlVmlldyB7CisKKyAgICBwdWJsaWMgU2NlbmVHcmFwaFZpZXcoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQpOworICAgICAgICAvL3NldEZvY3VzYWJsZSh0cnVlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFJlbmRlclNjcmlwdEdMIG1SUzsKKyAgICBwcml2YXRlIFNjZW5lR3JhcGhSUyBtUmVuZGVyOworCisKKyAgICBwdWJsaWMgdm9pZCBzdXJmYWNlQ2hhbmdlZChTdXJmYWNlSG9sZGVyIGhvbGRlciwgaW50IGZvcm1hdCwgaW50IHcsIGludCBoKSB7CisgICAgICAgIHN1cGVyLnN1cmZhY2VDaGFuZ2VkKGhvbGRlciwgZm9ybWF0LCB3LCBoKTsKKyAgICAgICAgaWYgKG1SUyA9PSBudWxsKSB7CisgICAgICAgICAgICBtUlMgPSBjcmVhdGVSZW5kZXJTY3JpcHQodHJ1ZSk7CisgICAgICAgICAgICBtUlMuY29udGV4dFNldFN1cmZhY2UodywgaCwgaG9sZGVyLmdldFN1cmZhY2UoKSk7CisgICAgICAgICAgICBtUmVuZGVyID0gbmV3IFNjZW5lR3JhcGhSUygpOworICAgICAgICAgICAgbVJlbmRlci5pbml0KG1SUywgZ2V0UmVzb3VyY2VzKCksIHcsIGgpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25EZXRhY2hlZEZyb21XaW5kb3coKSB7CisgICAgICAgIGlmKG1SUyAhPSBudWxsKSB7CisgICAgICAgICAgICBtUlMgPSBudWxsOworICAgICAgICAgICAgZGVzdHJveVJlbmRlclNjcmlwdCgpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25LZXlEb3duKGludCBrZXlDb2RlLCBLZXlFdmVudCBldmVudCkKKyAgICB7CisgICAgICAgIC8vIGJyZWFrIHBvaW50IGF0IGhlcmUKKyAgICAgICAgLy8gdGhpcyBtZXRob2QgZG9lc24ndCB3b3JrIHdoZW4gJ2V4dGVuZHMgVmlldycgaW5jbHVkZSAnZXh0ZW5kcyBTY3JvbGxWaWV3Jy4KKyAgICAgICAgcmV0dXJuIHN1cGVyLm9uS2V5RG93bihrZXlDb2RlLCBldmVudCk7CisgICAgfQorCisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBvblRvdWNoRXZlbnQoTW90aW9uRXZlbnQgZXYpCisgICAgeworICAgICAgICBib29sZWFuIHJldCA9IHRydWU7CisgICAgICAgIGludCBhY3QgPSBldi5nZXRBY3Rpb24oKTsKKyAgICAgICAgaWYgKGFjdCA9PSBldi5BQ1RJT05fVVApIHsKKyAgICAgICAgICAgIHJldCA9IGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgbVJlbmRlci50b3VjaEV2ZW50KChpbnQpZXYuZ2V0WCgpLCAoaW50KWV2LmdldFkoKSk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorfQorCisKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9zcmMvY29tL2FuZHJvaWQvbW9kZWx2aWV3ZXIvU2dUcmFuc2Zvcm0uamF2YSBiL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9zcmMvY29tL2FuZHJvaWQvbW9kZWx2aWV3ZXIvU2dUcmFuc2Zvcm0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZmM5YmI3Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9qYXZhL01vZGVsVmlld2VyL3NyYy9jb20vYW5kcm9pZC9tb2RlbHZpZXdlci9TZ1RyYW5zZm9ybS5qYXZhCkBAIC0wLDAgKzEsMTY1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5tb2RlbHZpZXdlcjsKKworaW1wb3J0IGphdmEuaW8uV3JpdGVyOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0Lio7CitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuRWxlbWVudC5CdWlsZGVyOworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0LlByb2dyYW1TdG9yZS5EZXB0aEZ1bmM7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworZW51bSBUcmFuc2Zvcm1UeXBlIHsKKworICAgIE5PTkUoMCksCisgICAgVFJBTlNMQVRFKDEpLAorICAgIFJPVEFURSgyKSwKKyAgICBTQ0FMRSgzKTsKKworICAgIGludCBtSUQ7CisgICAgVHJhbnNmb3JtVHlwZShpbnQgaWQpIHsKKyAgICAgICAgbUlEID0gaWQ7CisgICAgfQorfQorCitwdWJsaWMgY2xhc3MgU2dUcmFuc2Zvcm0geworCisKKyAgICBTY3JpcHRGaWVsZF9TZ1RyYW5zZm9ybSBtVHJhbnNmb3JtRmllbGQ7CisgICAgU2NyaXB0RmllbGRfU2dUcmFuc2Zvcm0gbUNoaWxkRmllbGQ7CisgICAgcHVibGljIFNjcmlwdEZpZWxkX1NnVHJhbnNmb3JtLkl0ZW0gbVRyYW5zZm9ybURhdGE7CisKKyAgICBGbG9hdDRbXSBtVHJhbnNmb3JtczsKKyAgICBUcmFuc2Zvcm1UeXBlW10gbVRyYW5zZm9ybVR5cGVzOworCisgICAgUmVuZGVyU2NyaXB0IG1SUzsKKworICAgIFZlY3RvciBtQ2hpbGRyZW47CisgICAgU2dUcmFuc2Zvcm0gbVBhcmVudDsKKyAgICBpbnQgbUluZGV4SW5QYXJlbnRHcm91cDsKKworICAgIHB1YmxpYyB2b2lkIHNldFBhcmVudChTZ1RyYW5zZm9ybSBwYXJlbnQsIGludCBwYXJlbnRJbmRleCkgeworICAgICAgICBtUGFyZW50ID0gcGFyZW50OworICAgICAgICBtSW5kZXhJblBhcmVudEdyb3VwID0gcGFyZW50SW5kZXg7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkQ2hpbGQoU2dUcmFuc2Zvcm0gY2hpbGQpIHsKKyAgICAgICAgbUNoaWxkcmVuLmFkZChjaGlsZCk7CisgICAgICAgIGNoaWxkLnNldFBhcmVudCh0aGlzLCBtQ2hpbGRyZW4uc2l6ZSgpIC0gMSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VHJhbnNmb3JtKGludCBpbmRleCwgRmxvYXQ0IHZhbHVlLCBUcmFuc2Zvcm1UeXBlIHR5cGUpIHsKKyAgICAgICAgbVRyYW5zZm9ybXNbaW5kZXhdID0gdmFsdWU7CisgICAgICAgIG1UcmFuc2Zvcm1UeXBlc1tpbmRleF0gPSB0eXBlOworICAgIH0KKworICAgIHZvaWQgaW5pdERhdGEoKSB7CisgICAgICAgIGludCBudW1UcmFuc2Zvcm1zID0gMTY7CisgICAgICAgIG1UcmFuc2Zvcm1zID0gbmV3IEZsb2F0NFtudW1UcmFuc2Zvcm1zXTsKKyAgICAgICAgbVRyYW5zZm9ybVR5cGVzID0gbmV3IFRyYW5zZm9ybVR5cGVbbnVtVHJhbnNmb3Jtc107CisgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBudW1UcmFuc2Zvcm1zOyBpICsrKSB7CisgICAgICAgICAgICBtVHJhbnNmb3Jtc1tpXSA9IG5ldyBGbG9hdDQoMCwgMCwgMCwgMCk7CisgICAgICAgICAgICBtVHJhbnNmb3JtVHlwZXNbaV0gPSBUcmFuc2Zvcm1UeXBlLk5PTkU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIHNldERhdGEoKSB7CisKKyAgICAgICAgbVRyYW5zZm9ybURhdGEuZ2xvYmFsTWF0X1JvdzAgPSBuZXcgRmxvYXQ0KDEsIDAsIDAsIDApOworICAgICAgICBtVHJhbnNmb3JtRGF0YS5nbG9iYWxNYXRfUm93MSA9IG5ldyBGbG9hdDQoMCwgMSwgMCwgMCk7CisgICAgICAgIG1UcmFuc2Zvcm1EYXRhLmdsb2JhbE1hdF9Sb3cyID0gbmV3IEZsb2F0NCgwLCAwLCAxLCAwKTsKKyAgICAgICAgbVRyYW5zZm9ybURhdGEuZ2xvYmFsTWF0X1JvdzMgPSBuZXcgRmxvYXQ0KDAsIDAsIDAsIDEpOworCisgICAgICAgIG1UcmFuc2Zvcm1EYXRhLmxvY2FsTWF0X1JvdzAgPSBuZXcgRmxvYXQ0KDEsIDAsIDAsIDApOworICAgICAgICBtVHJhbnNmb3JtRGF0YS5sb2NhbE1hdF9Sb3cxID0gbmV3IEZsb2F0NCgwLCAxLCAwLCAwKTsKKyAgICAgICAgbVRyYW5zZm9ybURhdGEubG9jYWxNYXRfUm93MiA9IG5ldyBGbG9hdDQoMCwgMCwgMSwgMCk7CisgICAgICAgIG1UcmFuc2Zvcm1EYXRhLmxvY2FsTWF0X1JvdzMgPSBuZXcgRmxvYXQ0KDAsIDAsIDAsIDEpOworCisgICAgICAgIG1UcmFuc2Zvcm1EYXRhLnRyYW5zZm9ybXMwID0gbVRyYW5zZm9ybXNbMF07CisgICAgICAgIG1UcmFuc2Zvcm1EYXRhLnRyYW5zZm9ybXMxID0gbVRyYW5zZm9ybXNbMV07CisgICAgICAgIG1UcmFuc2Zvcm1EYXRhLnRyYW5zZm9ybXMyID0gbVRyYW5zZm9ybXNbMl07CisgICAgICAgIG1UcmFuc2Zvcm1EYXRhLnRyYW5zZm9ybXMzID0gbVRyYW5zZm9ybXNbM107CisgICAgICAgIG1UcmFuc2Zvcm1EYXRhLnRyYW5zZm9ybXM0ID0gbVRyYW5zZm9ybXNbNF07CisgICAgICAgIG1UcmFuc2Zvcm1EYXRhLnRyYW5zZm9ybXM1ID0gbVRyYW5zZm9ybXNbNV07CisgICAgICAgIG1UcmFuc2Zvcm1EYXRhLnRyYW5zZm9ybXM2ID0gbVRyYW5zZm9ybXNbNl07CisgICAgICAgIG1UcmFuc2Zvcm1EYXRhLnRyYW5zZm9ybXM3ID0gbVRyYW5zZm9ybXNbN107CisgICAgICAgIG1UcmFuc2Zvcm1EYXRhLnRyYW5zZm9ybXM4ID0gbVRyYW5zZm9ybXNbOF07CisgICAgICAgIG1UcmFuc2Zvcm1EYXRhLnRyYW5zZm9ybXM5ID0gbVRyYW5zZm9ybXNbOV07CisgICAgICAgIG1UcmFuc2Zvcm1EYXRhLnRyYW5zZm9ybXMxMCA9IG1UcmFuc2Zvcm1zWzEwXTsKKyAgICAgICAgbVRyYW5zZm9ybURhdGEudHJhbnNmb3JtczExID0gbVRyYW5zZm9ybXNbMTFdOworICAgICAgICBtVHJhbnNmb3JtRGF0YS50cmFuc2Zvcm1zMTIgPSBtVHJhbnNmb3Jtc1sxMl07CisgICAgICAgIG1UcmFuc2Zvcm1EYXRhLnRyYW5zZm9ybXMxMyA9IG1UcmFuc2Zvcm1zWzEzXTsKKyAgICAgICAgbVRyYW5zZm9ybURhdGEudHJhbnNmb3JtczE0ID0gbVRyYW5zZm9ybXNbMTRdOworICAgICAgICBtVHJhbnNmb3JtRGF0YS50cmFuc2Zvcm1zMTUgPSBtVHJhbnNmb3Jtc1sxNV07CisKKyAgICAgICAgbVRyYW5zZm9ybURhdGEudHJhbnNmb3JtVHlwZTAgPSBtVHJhbnNmb3JtVHlwZXNbMF0ubUlEOworICAgICAgICBtVHJhbnNmb3JtRGF0YS50cmFuc2Zvcm1UeXBlMSA9IG1UcmFuc2Zvcm1UeXBlc1sxXS5tSUQ7CisgICAgICAgIG1UcmFuc2Zvcm1EYXRhLnRyYW5zZm9ybVR5cGUyID0gbVRyYW5zZm9ybVR5cGVzWzJdLm1JRDsKKyAgICAgICAgbVRyYW5zZm9ybURhdGEudHJhbnNmb3JtVHlwZTMgPSBtVHJhbnNmb3JtVHlwZXNbM10ubUlEOworICAgICAgICBtVHJhbnNmb3JtRGF0YS50cmFuc2Zvcm1UeXBlNCA9IG1UcmFuc2Zvcm1UeXBlc1s0XS5tSUQ7CisgICAgICAgIG1UcmFuc2Zvcm1EYXRhLnRyYW5zZm9ybVR5cGU1ID0gbVRyYW5zZm9ybVR5cGVzWzVdLm1JRDsKKyAgICAgICAgbVRyYW5zZm9ybURhdGEudHJhbnNmb3JtVHlwZTYgPSBtVHJhbnNmb3JtVHlwZXNbNl0ubUlEOworICAgICAgICBtVHJhbnNmb3JtRGF0YS50cmFuc2Zvcm1UeXBlNyA9IG1UcmFuc2Zvcm1UeXBlc1s3XS5tSUQ7CisgICAgICAgIG1UcmFuc2Zvcm1EYXRhLnRyYW5zZm9ybVR5cGU4ID0gbVRyYW5zZm9ybVR5cGVzWzhdLm1JRDsKKyAgICAgICAgbVRyYW5zZm9ybURhdGEudHJhbnNmb3JtVHlwZTkgPSBtVHJhbnNmb3JtVHlwZXNbOV0ubUlEOworICAgICAgICBtVHJhbnNmb3JtRGF0YS50cmFuc2Zvcm1UeXBlMTAgPSBtVHJhbnNmb3JtVHlwZXNbMTBdLm1JRDsKKyAgICAgICAgbVRyYW5zZm9ybURhdGEudHJhbnNmb3JtVHlwZTExID0gbVRyYW5zZm9ybVR5cGVzWzExXS5tSUQ7CisgICAgICAgIG1UcmFuc2Zvcm1EYXRhLnRyYW5zZm9ybVR5cGUxMiA9IG1UcmFuc2Zvcm1UeXBlc1sxMl0ubUlEOworICAgICAgICBtVHJhbnNmb3JtRGF0YS50cmFuc2Zvcm1UeXBlMTMgPSBtVHJhbnNmb3JtVHlwZXNbMTNdLm1JRDsKKyAgICAgICAgbVRyYW5zZm9ybURhdGEudHJhbnNmb3JtVHlwZTE0ID0gbVRyYW5zZm9ybVR5cGVzWzE0XS5tSUQ7CisgICAgICAgIG1UcmFuc2Zvcm1EYXRhLnRyYW5zZm9ybVR5cGUxNSA9IG1UcmFuc2Zvcm1UeXBlc1sxNV0ubUlEOworCisgICAgICAgIG1UcmFuc2Zvcm1EYXRhLmlzRGlydHkgPSAxOworICAgICAgICBtVHJhbnNmb3JtRGF0YS5jaGlsZHJlbiA9IG51bGw7CisKKyAgICB9CisKKyAgICBwdWJsaWMgU2dUcmFuc2Zvcm0oUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIG1SUyA9IHJzOworICAgICAgICBtVHJhbnNmb3JtRGF0YSA9IG5ldyBTY3JpcHRGaWVsZF9TZ1RyYW5zZm9ybS5JdGVtKCk7CisgICAgICAgIG1DaGlsZHJlbiA9IG5ldyBWZWN0b3IoKTsKKyAgICAgICAgaW5pdERhdGEoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU2NyaXB0RmllbGRfU2dUcmFuc2Zvcm0uSXRlbSBnZXREYXRhKCkgeworICAgICAgICBzZXREYXRhKCk7CisgICAgICAgIGlmKG1DaGlsZHJlbi5zaXplKCkgIT0gMCkgeworICAgICAgICAgICAgbUNoaWxkRmllbGQgPSBuZXcgU2NyaXB0RmllbGRfU2dUcmFuc2Zvcm0obVJTLCBtQ2hpbGRyZW4uc2l6ZSgpKTsKKyAgICAgICAgICAgIG1UcmFuc2Zvcm1EYXRhLmNoaWxkcmVuID0gbUNoaWxkRmllbGQuZ2V0QWxsb2NhdGlvbigpOworCisgICAgICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgbUNoaWxkcmVuLnNpemUoKTsgaSArKykgeworICAgICAgICAgICAgICAgIFNnVHJhbnNmb3JtIGNoaWxkID0gKFNnVHJhbnNmb3JtKW1DaGlsZHJlbi5nZXQoaSk7CisgICAgICAgICAgICAgICAgbUNoaWxkRmllbGQuc2V0KGNoaWxkLmdldERhdGEoKSwgaSwgZmFsc2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUNoaWxkRmllbGQuY29weUFsbCgpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG1UcmFuc2Zvcm1EYXRhOworICAgIH0KKworICAgIHB1YmxpYyBTY3JpcHRGaWVsZF9TZ1RyYW5zZm9ybSBnZXRGaWVsZCgpIHsKKyAgICAgICAgbVRyYW5zZm9ybUZpZWxkID0gbmV3IFNjcmlwdEZpZWxkX1NnVHJhbnNmb3JtKG1SUywgMSk7CisgICAgICAgIG1UcmFuc2Zvcm1GaWVsZC5zZXQoZ2V0RGF0YSgpLCAwLCB0cnVlKTsKKyAgICAgICAgcmV0dXJuIG1UcmFuc2Zvcm1GaWVsZDsKKyAgICB9Cit9CisKKworCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvc3JjL2NvbS9hbmRyb2lkL21vZGVsdmlld2VyL1NpbXBsZU1vZGVsLmphdmEgYi9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvc3JjL2NvbS9hbmRyb2lkL21vZGVsdmlld2VyL1NpbXBsZU1vZGVsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I3YzM5YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9zcmMvY29tL2FuZHJvaWQvbW9kZWx2aWV3ZXIvU2ltcGxlTW9kZWwuamF2YQpAQCAtMCwwICsxLDcxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5tb2RlbHZpZXdlcjsKKworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0LlJTU3VyZmFjZVZpZXc7CitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUmVuZGVyU2NyaXB0OworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5ncy5TeXN0ZW07CitpbXBvcnQgYW5kcm9pZC51dGlsLkNvbmZpZzsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51OworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SXRlbTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkJ1dHRvbjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaXN0VmlldzsKKworaW1wb3J0IGphdmEubGFuZy5SdW50aW1lOworCitwdWJsaWMgY2xhc3MgU2ltcGxlTW9kZWwgZXh0ZW5kcyBBY3Rpdml0eSB7CisKKyAgICBwcml2YXRlIFNpbXBsZU1vZGVsVmlldyBtVmlldzsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBpY2ljbGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoaWNpY2xlKTsKKworICAgICAgICAvLyBDcmVhdGUgb3VyIFByZXZpZXcgdmlldyBhbmQgc2V0IGl0IGFzIHRoZSBjb250ZW50IG9mIG91cgorICAgICAgICAvLyBBY3Rpdml0eQorICAgICAgICBtVmlldyA9IG5ldyBTaW1wbGVNb2RlbFZpZXcodGhpcyk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KG1WaWV3KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvblJlc3VtZSgpIHsKKyAgICAgICAgLy8gSWRlYWxseSBhIGdhbWUgc2hvdWxkIGltcGxlbWVudCBvblJlc3VtZSgpIGFuZCBvblBhdXNlKCkKKyAgICAgICAgLy8gdG8gdGFrZSBhcHByb3ByaWF0ZSBhY3Rpb24gd2hlbiB0aGUgYWN0aXZpdHkgbG9vc2VzIGZvY3VzCisgICAgICAgIHN1cGVyLm9uUmVzdW1lKCk7CisgICAgICAgIG1WaWV3Lm9uUmVzdW1lKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25QYXVzZSgpIHsKKyAgICAgICAgLy8gSWRlYWxseSBhIGdhbWUgc2hvdWxkIGltcGxlbWVudCBvblJlc3VtZSgpIGFuZCBvblBhdXNlKCkKKyAgICAgICAgLy8gdG8gdGFrZSBhcHByb3ByaWF0ZSBhY3Rpb24gd2hlbiB0aGUgYWN0aXZpdHkgbG9vc2VzIGZvY3VzCisgICAgICAgIHN1cGVyLm9uUGF1c2UoKTsKKyAgICAgICAgbVZpZXcub25QYXVzZSgpOworICAgIH0KKworfQorCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvc3JjL2NvbS9hbmRyb2lkL21vZGVsdmlld2VyL1NpbXBsZU1vZGVsUlMuamF2YSBiL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9zcmMvY29tL2FuZHJvaWQvbW9kZWx2aWV3ZXIvU2ltcGxlTW9kZWxSUy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4YjAxMTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvc3JjL2NvbS9hbmRyb2lkL21vZGVsdmlld2VyL1NpbXBsZU1vZGVsUlMuamF2YQpAQCAtMCwwICsxLDE3MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQubW9kZWx2aWV3ZXI7CisKK2ltcG9ydCBqYXZhLmlvLldyaXRlcjsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0Lio7CitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUHJvZ3JhbVN0b3JlLkRlcHRoRnVuYzsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCisKK3B1YmxpYyBjbGFzcyBTaW1wbGVNb2RlbFJTIHsKKworICAgIHByaXZhdGUgZmluYWwgaW50IFNUQVRFX0xBU1RfRk9DVVMgPSAxOworCisgICAgaW50IG1XaWR0aDsKKyAgICBpbnQgbUhlaWdodDsKKyAgICBpbnQgbVJvdGF0aW9uOworCisgICAgcHVibGljIFNpbXBsZU1vZGVsUlMoKSB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgaW5pdChSZW5kZXJTY3JpcHRHTCBycywgUmVzb3VyY2VzIHJlcywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CisgICAgICAgIG1SUyA9IHJzOworICAgICAgICBtUmVzID0gcmVzOworICAgICAgICBtV2lkdGggPSB3aWR0aDsKKyAgICAgICAgbUhlaWdodCA9IGhlaWdodDsKKyAgICAgICAgbVJvdGF0aW9uID0gMDsKKyAgICAgICAgaW5pdFJTKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBSZXNvdXJjZXMgbVJlczsKKyAgICBwcml2YXRlIFJlbmRlclNjcmlwdEdMIG1SUzsKKyAgICBwcml2YXRlIFNhbXBsZXIgbVNhbXBsZXI7CisgICAgcHJpdmF0ZSBQcm9ncmFtU3RvcmUgbVBTQmFja2dyb3VuZDsKKyAgICBwcml2YXRlIFByb2dyYW1GcmFnbWVudCBtUEZCYWNrZ3JvdW5kOworICAgIHByaXZhdGUgUHJvZ3JhbVZlcnRleCBtUFZCYWNrZ3JvdW5kOworICAgIHByaXZhdGUgUHJvZ3JhbVZlcnRleC5NYXRyaXhBbGxvY2F0aW9uIG1QVkE7CisKKyAgICBwcml2YXRlIEFsbG9jYXRpb24gbUdyaWRJbWFnZTsKKyAgICBwcml2YXRlIEFsbG9jYXRpb24gbUFsbG9jUFY7CisKKyAgICBwcml2YXRlIE1lc2ggbU1lc2g7CisKKyAgICBwcml2YXRlIEZvbnQgbUl0YWxpYzsKKyAgICBwcml2YXRlIEFsbG9jYXRpb24gbVRleHRBbGxvYzsKKworICAgIHByaXZhdGUgU2NyaXB0Q19TaW1wbGVtb2RlbCBtU2NyaXB0OworCisgICAgaW50IG1MYXN0WDsKKyAgICBpbnQgbUxhc3RZOworCisgICAgcHVibGljIHZvaWQgdG91Y2hFdmVudChpbnQgeCwgaW50IHkpIHsKKyAgICAgICAgaW50IGR4ID0gbUxhc3RYIC0geDsKKyAgICAgICAgaWYoTWF0aC5hYnMoZHgpID4gNTAgfHwgTWF0aC5hYnMoZHgpIDwgMykgeworICAgICAgICAgICAgZHggPSAwOworICAgICAgICB9CisKKyAgICAgICAgbVJvdGF0aW9uIC09IGR4OworICAgICAgICBpZihtUm90YXRpb24gPiAzNjApIHsKKyAgICAgICAgICAgIG1Sb3RhdGlvbiAtPSAzNjA7CisgICAgICAgIH0KKyAgICAgICAgaWYobVJvdGF0aW9uIDwgMCkgeworICAgICAgICAgICAgbVJvdGF0aW9uICs9IDM2MDsKKyAgICAgICAgfQorCisgICAgICAgIG1TY3JpcHQuc2V0X2dSb3RhdGUoLShmbG9hdCltUm90YXRpb24pOworCisgICAgICAgIG1MYXN0WCA9IHg7CisgICAgICAgIG1MYXN0WSA9IHk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGluaXRQRlMoKSB7CisgICAgICAgIFByb2dyYW1TdG9yZS5CdWlsZGVyIGIgPSBuZXcgUHJvZ3JhbVN0b3JlLkJ1aWxkZXIobVJTKTsKKworICAgICAgICBiLnNldERlcHRoRnVuYyhQcm9ncmFtU3RvcmUuRGVwdGhGdW5jLkxFU1MpOworICAgICAgICBiLnNldERpdGhlckVuYWJsZShmYWxzZSk7CisgICAgICAgIGIuc2V0RGVwdGhNYXNrKHRydWUpOworICAgICAgICBtUFNCYWNrZ3JvdW5kID0gYi5jcmVhdGUoKTsKKworICAgICAgICBtU2NyaXB0LnNldF9nUEZTQmFja2dyb3VuZChtUFNCYWNrZ3JvdW5kKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5pdFBGKCkgeworICAgICAgICBTYW1wbGVyLkJ1aWxkZXIgYnMgPSBuZXcgU2FtcGxlci5CdWlsZGVyKG1SUyk7CisgICAgICAgIGJzLnNldE1pbihTYW1wbGVyLlZhbHVlLkxJTkVBUik7CisgICAgICAgIGJzLnNldE1hZyhTYW1wbGVyLlZhbHVlLkxJTkVBUik7CisgICAgICAgIGJzLnNldFdyYXBTKFNhbXBsZXIuVmFsdWUuQ0xBTVApOworICAgICAgICBicy5zZXRXcmFwVChTYW1wbGVyLlZhbHVlLldSQVApOworICAgICAgICBtU2FtcGxlciA9IGJzLmNyZWF0ZSgpOworCisgICAgICAgIFByb2dyYW1GcmFnbWVudC5CdWlsZGVyIGIgPSBuZXcgUHJvZ3JhbUZyYWdtZW50LkJ1aWxkZXIobVJTKTsKKyAgICAgICAgYi5zZXRUZXh0dXJlKFByb2dyYW1GcmFnbWVudC5CdWlsZGVyLkVudk1vZGUuUkVQTEFDRSwKKyAgICAgICAgICAgICAgICAgICAgIFByb2dyYW1GcmFnbWVudC5CdWlsZGVyLkZvcm1hdC5SR0JBLCAwKTsKKyAgICAgICAgbVBGQmFja2dyb3VuZCA9IGIuY3JlYXRlKCk7CisgICAgICAgIG1QRkJhY2tncm91bmQuYmluZFNhbXBsZXIobVNhbXBsZXIsIDApOworCisgICAgICAgIG1TY3JpcHQuc2V0X2dQRkJhY2tncm91bmQobVBGQmFja2dyb3VuZCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGluaXRQVigpIHsKKyAgICAgICAgUHJvZ3JhbVZlcnRleC5CdWlsZGVyIHB2YiA9IG5ldyBQcm9ncmFtVmVydGV4LkJ1aWxkZXIobVJTKTsKKyAgICAgICAgbVBWQmFja2dyb3VuZCA9IHB2Yi5jcmVhdGUoKTsKKworICAgICAgICBtUFZBID0gbmV3IFByb2dyYW1WZXJ0ZXguTWF0cml4QWxsb2NhdGlvbihtUlMpOworICAgICAgICBtUFZCYWNrZ3JvdW5kLmJpbmRBbGxvY2F0aW9uKG1QVkEpOworICAgICAgICBtUFZBLnNldHVwUHJvamVjdGlvbk5vcm1hbGl6ZWQobVdpZHRoLCBtSGVpZ2h0KTsKKworICAgICAgICBtU2NyaXB0LnNldF9nUFZCYWNrZ3JvdW5kKG1QVkJhY2tncm91bmQpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBsb2FkSW1hZ2UoKSB7CisgICAgICAgIG1HcmlkSW1hZ2UgPSBBbGxvY2F0aW9uLmNyZWF0ZUZyb21CaXRtYXBSZXNvdXJjZUJveGVkKG1SUywgbVJlcywgUi5kcmF3YWJsZS5yb2JvdCwgRWxlbWVudC5SR0JfNTY1KG1SUyksIHRydWUpOworICAgICAgICBtR3JpZEltYWdlLnVwbG9hZFRvVGV4dHVyZSgwKTsKKworICAgICAgICBtU2NyaXB0LnNldF9nVEdyaWQobUdyaWRJbWFnZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGluaXRUZXh0QWxsb2NhdGlvbigpIHsKKyAgICAgICAgU3RyaW5nIGFsbG9jU3RyaW5nID0gIkRpc3BsYXlpbmcgZmlsZTogUi5yYXcucm9ib3QiOworICAgICAgICBtVGV4dEFsbG9jID0gQWxsb2NhdGlvbi5jcmVhdGVGcm9tU3RyaW5nKG1SUywgYWxsb2NTdHJpbmcpOworICAgICAgICBtU2NyaXB0LnNldF9nVGV4dEFsbG9jKG1UZXh0QWxsb2MpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbml0UlMoKSB7CisKKyAgICAgICAgbVNjcmlwdCA9IG5ldyBTY3JpcHRDX1NpbXBsZW1vZGVsKG1SUywgbVJlcywgUi5yYXcuc2ltcGxlbW9kZWwsIHRydWUpOworCisgICAgICAgIGluaXRQRlMoKTsKKyAgICAgICAgaW5pdFBGKCk7CisgICAgICAgIGluaXRQVigpOworCisgICAgICAgIGxvYWRJbWFnZSgpOworCisgICAgICAgIEZpbGVBM0QgbW9kZWwgPSBGaWxlQTNELmNyZWF0ZUZyb21SZXNvdXJjZShtUlMsIG1SZXMsIFIucmF3LnJvYm90KTsKKyAgICAgICAgRmlsZUEzRC5JbmRleEVudHJ5IGVudHJ5ID0gbW9kZWwuZ2V0SW5kZXhFbnRyeSgwKTsKKyAgICAgICAgaWYoZW50cnkgPT0gbnVsbCB8fCBlbnRyeS5nZXRDbGFzc0lEKCkgIT0gRmlsZUEzRC5DbGFzc0lELk1FU0gpIHsKKyAgICAgICAgICAgIExvZy5lKCJycyIsICJjb3VsZCBub3QgbG9hZCBtb2RlbCIpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgbU1lc2ggPSAoTWVzaCllbnRyeS5nZXRPYmplY3QoKTsKKyAgICAgICAgICAgIG1TY3JpcHQuc2V0X2dUZXN0TWVzaChtTWVzaCk7CisgICAgICAgIH0KKworICAgICAgICBtSXRhbGljID0gRm9udC5jcmVhdGUobVJTLCBtUmVzLCAiRHJvaWRTZXJpZi1JdGFsaWMudHRmIiwgOCk7CisgICAgICAgIG1TY3JpcHQuc2V0X2dJdGFsaWMobUl0YWxpYyk7CisKKyAgICAgICAgaW5pdFRleHRBbGxvY2F0aW9uKCk7CisKKyAgICAgICAgbVJTLmNvbnRleHRCaW5kUm9vdFNjcmlwdChtU2NyaXB0KTsKKyAgICB9Cit9CisKKworCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvc3JjL2NvbS9hbmRyb2lkL21vZGVsdmlld2VyL1NpbXBsZU1vZGVsVmlldy5qYXZhIGIvbGlicy9ycy9qYXZhL01vZGVsVmlld2VyL3NyYy9jb20vYW5kcm9pZC9tb2RlbHZpZXdlci9TaW1wbGVNb2RlbFZpZXcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTc0ZmRkCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9qYXZhL01vZGVsVmlld2VyL3NyYy9jb20vYW5kcm9pZC9tb2RlbHZpZXdlci9TaW1wbGVNb2RlbFZpZXcuamF2YQpAQCAtMCwwICsxLDk0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5tb2RlbHZpZXdlcjsKKworaW1wb3J0IGphdmEuaW8uV3JpdGVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuU2VtYXBob3JlOworCitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUlNTdXJmYWNlVmlldzsKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5SZW5kZXJTY3JpcHQ7CitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUmVuZGVyU2NyaXB0R0w7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkJpdG1hcERyYXdhYmxlOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3LlN1cmZhY2U7CitpbXBvcnQgYW5kcm9pZC52aWV3LlN1cmZhY2VIb2xkZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LlN1cmZhY2VWaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQ7CisKK3B1YmxpYyBjbGFzcyBTaW1wbGVNb2RlbFZpZXcgZXh0ZW5kcyBSU1N1cmZhY2VWaWV3IHsKKworICAgIHB1YmxpYyBTaW1wbGVNb2RlbFZpZXcoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQpOworICAgICAgICAvL3NldEZvY3VzYWJsZSh0cnVlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFJlbmRlclNjcmlwdEdMIG1SUzsKKyAgICBwcml2YXRlIFNpbXBsZU1vZGVsUlMgbVJlbmRlcjsKKworCisgICAgcHVibGljIHZvaWQgc3VyZmFjZUNoYW5nZWQoU3VyZmFjZUhvbGRlciBob2xkZXIsIGludCBmb3JtYXQsIGludCB3LCBpbnQgaCkgeworICAgICAgICBzdXBlci5zdXJmYWNlQ2hhbmdlZChob2xkZXIsIGZvcm1hdCwgdywgaCk7CisgICAgICAgIGlmIChtUlMgPT0gbnVsbCkgeworICAgICAgICAgICAgbVJTID0gY3JlYXRlUmVuZGVyU2NyaXB0KHRydWUpOworICAgICAgICAgICAgbVJTLmNvbnRleHRTZXRTdXJmYWNlKHcsIGgsIGhvbGRlci5nZXRTdXJmYWNlKCkpOworICAgICAgICAgICAgbVJlbmRlciA9IG5ldyBTaW1wbGVNb2RlbFJTKCk7CisgICAgICAgICAgICBtUmVuZGVyLmluaXQobVJTLCBnZXRSZXNvdXJjZXMoKSwgdywgaCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkRldGFjaGVkRnJvbVdpbmRvdygpIHsKKyAgICAgICAgaWYobVJTICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1SUyA9IG51bGw7CisgICAgICAgICAgICBkZXN0cm95UmVuZGVyU2NyaXB0KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBvbktleURvd24oaW50IGtleUNvZGUsIEtleUV2ZW50IGV2ZW50KQorICAgIHsKKyAgICAgICAgLy8gYnJlYWsgcG9pbnQgYXQgaGVyZQorICAgICAgICAvLyB0aGlzIG1ldGhvZCBkb2Vzbid0IHdvcmsgd2hlbiAnZXh0ZW5kcyBWaWV3JyBpbmNsdWRlICdleHRlbmRzIFNjcm9sbFZpZXcnLgorICAgICAgICByZXR1cm4gc3VwZXIub25LZXlEb3duKGtleUNvZGUsIGV2ZW50KTsKKyAgICB9CisKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIG9uVG91Y2hFdmVudChNb3Rpb25FdmVudCBldikKKyAgICB7CisgICAgICAgIGJvb2xlYW4gcmV0ID0gdHJ1ZTsKKyAgICAgICAgaW50IGFjdCA9IGV2LmdldEFjdGlvbigpOworICAgICAgICBpZiAoYWN0ID09IGV2LkFDVElPTl9VUCkgeworICAgICAgICAgICAgcmV0ID0gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBtUmVuZGVyLnRvdWNoRXZlbnQoKGludClldi5nZXRYKCksIChpbnQpZXYuZ2V0WSgpKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9Cit9CisKKwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL01vZGVsVmlld2VyL3NyYy9jb20vYW5kcm9pZC9tb2RlbHZpZXdlci9zY2VuZWdyYXBoLnJzIGIvbGlicy9ycy9qYXZhL01vZGVsVmlld2VyL3NyYy9jb20vYW5kcm9pZC9tb2RlbHZpZXdlci9zY2VuZWdyYXBoLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwNTMzMDYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvc3JjL2NvbS9hbmRyb2lkL21vZGVsdmlld2VyL3NjZW5lZ3JhcGgucnMKQEAgLTAsMCArMSw5MiBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNwcmFnbWEgdmVyc2lvbigxKQorCisjcHJhZ21hIHJzIGphdmFfcGFja2FnZV9uYW1lKGNvbS5hbmRyb2lkLm1vZGVsdmlld2VyKQorCisjaW5jbHVkZSAicnNfZ3JhcGhpY3MucnNoIgorI2luY2x1ZGUgInRyYW5zZm9ybV9kZWYucnNoIgorCityc19wcm9ncmFtX3ZlcnRleCBnUFZCYWNrZ3JvdW5kOworcnNfcHJvZ3JhbV9mcmFnbWVudCBnUEZCYWNrZ3JvdW5kOworCityc19hbGxvY2F0aW9uIGdUR3JpZDsKK3JzX21lc2ggZ1Rlc3RNZXNoOworCityc19wcm9ncmFtX3N0b3JlIGdQRlNCYWNrZ3JvdW5kOworCitmbG9hdCBnUm90YXRlOworCityc19mb250IGdJdGFsaWM7Cityc19hbGxvY2F0aW9uIGdUZXh0QWxsb2M7CisKK3JzX3NjcmlwdCBnVHJhbnNmb3JtUlM7CisKK1NnVHJhbnNmb3JtICpnR3JvdXA7CitTZ1RyYW5zZm9ybSAqZ1JvYm90MTsKK2ludCBnUm9ib3QxSW5kZXg7CitTZ1RyYW5zZm9ybSAqZ1JvYm90MjsKK2ludCBnUm9ib3QySW5kZXg7CisKK1NnVHJhbnNmb3JtICpnUm9vdE5vZGU7CisKKyNwcmFnbWEgcnMgZXhwb3J0X3ZhcihnUFZCYWNrZ3JvdW5kLCBnUEZCYWNrZ3JvdW5kLCBnVEdyaWQsIGdUZXN0TWVzaCwgZ1BGU0JhY2tncm91bmQsIGdSb3RhdGUsIGdJdGFsaWMsIGdUZXh0QWxsb2MsIGdUcmFuc2Zvcm1SUywgZ0dyb3VwLCBnUm9ib3QxLCBnUm9ib3QxSW5kZXgsIGdSb2JvdDIsIGdSb2JvdDJJbmRleCwgZ1Jvb3ROb2RlKQorCitmbG9hdCBnRFQ7CitpbnQ2NF90IGdMYXN0VGltZTsKKwordm9pZCBpbml0KCkgeworICAgIGdSb3RhdGUgPSAwLjBmOworfQorCitpbnQgcm9vdChpbnQgbGF1bmNoSUQpIHsKKworICAgIGdHcm91cC0+dHJhbnNmb3JtczEudyArPSAwLjVmOworICAgIGdHcm91cC0+aXNEaXJ0eSA9IDE7CisKKyAgICBTZ1RyYW5zZm9ybSAqcm9ib3QxUHRyID0gZ1JvYm90MSArIGdSb2JvdDFJbmRleDsKKworICAgIHJvYm90MVB0ci0+dHJhbnNmb3JtczEudyAtPSAxLjVmOworICAgIHJvYm90MVB0ci0+aXNEaXJ0eSA9IDE7CisKKyAgICBTZ1RyYW5zZm9ybSAqcm9ib3QyUHRyID0gZ1JvYm90MiArIGdSb2JvdDJJbmRleDsKKyAgICByb2JvdDJQdHItPnRyYW5zZm9ybXMxLncgKz0gMi41ZjsKKyAgICByb2JvdDJQdHItPmlzRGlydHkgPSAxOworCisgICAgcnNGb3JFYWNoKGdUcmFuc2Zvcm1SUywgZ1Jvb3ROb2RlLT5jaGlsZHJlbiwgZ1Jvb3ROb2RlLT5jaGlsZHJlbiwgMCk7CisKKyAgICByc2dDbGVhckNvbG9yKDEuMGYsIDEuMGYsIDEuMGYsIDEuMGYpOworICAgIHJzZ0NsZWFyRGVwdGgoMS4wZik7CisKKyAgICByc2dCaW5kUHJvZ3JhbVZlcnRleChnUFZCYWNrZ3JvdW5kKTsKKworICAgIHJzZ0JpbmRQcm9ncmFtRnJhZ21lbnQoZ1BGQmFja2dyb3VuZCk7CisgICAgcnNnQmluZFByb2dyYW1TdG9yZShnUEZTQmFja2dyb3VuZCk7CisgICAgcnNnQmluZFRleHR1cmUoZ1BGQmFja2dyb3VuZCwgMCwgZ1RHcmlkKTsKKworICAgIHJzZ1Byb2dyYW1WZXJ0ZXhMb2FkTW9kZWxNYXRyaXgoKHJzX21hdHJpeDR4NCAqKSZyb2JvdDFQdHItPmdsb2JhbE1hdF9Sb3cwKTsKKyAgICByc2dEcmF3TWVzaChnVGVzdE1lc2gpOworCisgICAgcnNnUHJvZ3JhbVZlcnRleExvYWRNb2RlbE1hdHJpeCgocnNfbWF0cml4NHg0ICopJnJvYm90MlB0ci0+Z2xvYmFsTWF0X1JvdzApOworICAgIHJzZ0RyYXdNZXNoKGdUZXN0TWVzaCk7CisKKyAgICBjb2xvcigwLjNmLCAwLjNmLCAwLjNmLCAxLjBmKTsKKyAgICByc2dEcmF3VGV4dCgiUmVuZGVyc2NyaXB0IHRyYW5zZm9ybSB0ZXN0IiwgMzAsIDY5NSk7CisKKyAgICByc2dCaW5kRm9udChnSXRhbGljKTsKKyAgICByc2dEcmF3VGV4dChnVGV4dEFsbG9jLCAzMCwgNzMwKTsKKworICAgIHJldHVybiAxMDsKK30KZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9zcmMvY29tL2FuZHJvaWQvbW9kZWx2aWV3ZXIvc2ltcGxlbW9kZWwucnMgYi9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvc3JjL2NvbS9hbmRyb2lkL21vZGVsdmlld2VyL3NpbXBsZW1vZGVsLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkYjYwOWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvc3JjL2NvbS9hbmRyb2lkL21vZGVsdmlld2VyL3NpbXBsZW1vZGVsLnJzCkBAIC0wLDAgKzEsNzIgQEAKKy8vIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjcHJhZ21hIHZlcnNpb24oMSkKKworI3ByYWdtYSBycyBqYXZhX3BhY2thZ2VfbmFtZShjb20uYW5kcm9pZC5tb2RlbHZpZXdlcikKKworI2luY2x1ZGUgInJzX2dyYXBoaWNzLnJzaCIKKworcnNfcHJvZ3JhbV92ZXJ0ZXggZ1BWQmFja2dyb3VuZDsKK3JzX3Byb2dyYW1fZnJhZ21lbnQgZ1BGQmFja2dyb3VuZDsKKworcnNfYWxsb2NhdGlvbiBnVEdyaWQ7Cityc19tZXNoIGdUZXN0TWVzaDsKKworcnNfcHJvZ3JhbV9zdG9yZSBnUEZTQmFja2dyb3VuZDsKKworZmxvYXQgZ1JvdGF0ZTsKKworcnNfZm9udCBnSXRhbGljOworcnNfYWxsb2NhdGlvbiBnVGV4dEFsbG9jOworCisjcHJhZ21hIHJzIGV4cG9ydF92YXIoZ1BWQmFja2dyb3VuZCwgZ1BGQmFja2dyb3VuZCwgZ1RHcmlkLCBnVGVzdE1lc2gsIGdQRlNCYWNrZ3JvdW5kLCBnUm90YXRlLCBnSXRhbGljLCBnVGV4dEFsbG9jKQorCitmbG9hdCBnRFQ7CitpbnQ2NF90IGdMYXN0VGltZTsKKwordm9pZCBpbml0KCkgeworICAgIGdSb3RhdGUgPSAwLjBmOworfQorCitpbnQgcm9vdChpbnQgbGF1bmNoSUQpIHsKKworICAgIHJzZ0NsZWFyQ29sb3IoMS4wZiwgMS4wZiwgMS4wZiwgMS4wZik7CisgICAgcnNnQ2xlYXJEZXB0aCgxLjBmKTsKKworICAgIHJzZ0JpbmRQcm9ncmFtVmVydGV4KGdQVkJhY2tncm91bmQpOworCisgICAgcnNnQmluZFByb2dyYW1GcmFnbWVudChnUEZCYWNrZ3JvdW5kKTsKKyAgICByc2dCaW5kUHJvZ3JhbVN0b3JlKGdQRlNCYWNrZ3JvdW5kKTsKKyAgICByc2dCaW5kVGV4dHVyZShnUEZCYWNrZ3JvdW5kLCAwLCBnVEdyaWQpOworCisgICAgcnNfbWF0cml4NHg0IG1hdHJpeDsKKyAgICByc01hdHJpeExvYWRJZGVudGl0eSgmbWF0cml4KTsKKyAgICAvLyBQb3NpdGlvbiBvdXIgbW9kZWwgb24gdGhlIHNjcmVlbgorICAgIHJzTWF0cml4VHJhbnNsYXRlKCZtYXRyaXgsIDAuMGYsIC0wLjNmLCAxLjJmKTsKKyAgICByc01hdHJpeFNjYWxlKCZtYXRyaXgsIDAuMmYsIDAuMmYsIDAuMmYpOworICAgIHJzTWF0cml4Um90YXRlKCZtYXRyaXgsIC0yNS4wZiwgMS4wZiwgMC4wZiwgMC4wZik7CisgICAgcnNNYXRyaXhSb3RhdGUoJm1hdHJpeCwgZ1JvdGF0ZSwgMC4wZiwgMS4wZiwgMC4wZik7CisgICAgcnNnUHJvZ3JhbVZlcnRleExvYWRNb2RlbE1hdHJpeCgmbWF0cml4KTsKKworICAgIHJzZ0RyYXdNZXNoKGdUZXN0TWVzaCk7CisKKyAgICByc2dGb250Q29sb3IoMC4zZiwgMC4zZiwgMC4zZiwgMS4wZik7CisgICAgcnNnRHJhd1RleHQoIlJlbmRlcnNjcmlwdCBtb2RlbCB0ZXN0IiwgMzAsIDY5NSk7CisKKyAgICByc2dCaW5kRm9udChnSXRhbGljKTsKKyAgICByc2dEcmF3VGV4dChnVGV4dEFsbG9jLCAzMCwgNzMwKTsKKworICAgIHJldHVybiAxMDsKK30KZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9zcmMvY29tL2FuZHJvaWQvbW9kZWx2aWV3ZXIvdHJhbnNmb3JtLnJzIGIvbGlicy9ycy9qYXZhL01vZGVsVmlld2VyL3NyYy9jb20vYW5kcm9pZC9tb2RlbHZpZXdlci90cmFuc2Zvcm0ucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I5Y2QxYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9zcmMvY29tL2FuZHJvaWQvbW9kZWx2aWV3ZXIvdHJhbnNmb3JtLnJzCkBAIC0wLDAgKzEsMTAyIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI3ByYWdtYSB2ZXJzaW9uKDEpCisKKyNwcmFnbWEgcnMgamF2YV9wYWNrYWdlX25hbWUoY29tLmFuZHJvaWQubW9kZWx2aWV3ZXIpCisKKyNpbmNsdWRlICJ0cmFuc2Zvcm1fZGVmLnJzaCIKKworcnNfc2NyaXB0IHRyYW5zZm9ybVNjcmlwdDsKKworI3ByYWdtYSBycyBleHBvcnRfdmFyKHRyYW5zZm9ybVNjcmlwdCkKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludCBjaGFuZ2VkOworICAgIHJzX21hdHJpeDR4NCAqbWF0OworfSBQYXJlbnREYXRhOworCit2b2lkIGFwcGVuZFRyYW5zZm9ybWF0aW9uKGludCB0eXBlLCBmbG9hdDQgZGF0YSwgcnNfbWF0cml4NHg0ICptYXQpIHsKKyAgICByc19tYXRyaXg0eDQgdGVtcDsKKworICAgIHN3aXRjaCh0eXBlKSB7CisgICAgY2FzZSBUUkFOU0ZPUk1fVFJBTlNMQVRFOgorICAgICAgICByc01hdHJpeExvYWRUcmFuc2xhdGUoJnRlbXAsIGRhdGEueCwgZGF0YS55LCBkYXRhLnopOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFRSQU5TRk9STV9ST1RBVEU6CisgICAgICAgIHJzTWF0cml4TG9hZFJvdGF0ZSgmdGVtcCwgZGF0YS53LCBkYXRhLngsIGRhdGEueSwgZGF0YS56KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBUUkFOU0ZPUk1fU0NBTEU6CisgICAgICAgIHJzTWF0cml4TG9hZFNjYWxlKCZ0ZW1wLCBkYXRhLngsIGRhdGEueSwgZGF0YS56KTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJzTWF0cml4TXVsdGlwbHkobWF0LCAmdGVtcCk7Cit9CisKK3ZvaWQgcm9vdChjb25zdCB2b2lkICp2X2luLCB2b2lkICp2X291dCwgY29uc3Qgdm9pZCAqdXNyRGF0YSwgdWludDMyX3QgeCwgdWludDMyX3QgeSkgeworCisgICAgU2dUcmFuc2Zvcm0gKmRhdGEgPSAoU2dUcmFuc2Zvcm0gKil2X291dDsKKyAgICBjb25zdCBQYXJlbnREYXRhICpwYXJlbnQgPSAoY29uc3QgUGFyZW50RGF0YSAqKXVzckRhdGE7CisKKyAgICAvL3JzRGVidWcoIlRyYW5zZm9ybSBkYXRhIiwgKGludClkYXRhKTsKKyAgICAvL3JzRGVidWcoIkVudGVyaW5nIHBhcmVudCIsIChpbnQpcGFyZW50KTsKKworICAgIHJzX21hdHJpeDR4NCAqbG9jYWxNYXQgPSAocnNfbWF0cml4NHg0KikmZGF0YS0+bG9jYWxNYXRfUm93MDsKKyAgICByc19tYXRyaXg0eDQgKmdsb2JhbE1hdCA9IChyc19tYXRyaXg0eDQqKSZkYXRhLT5nbG9iYWxNYXRfUm93MDsKKworICAgIFBhcmVudERhdGEgdG9DaGlsZDsKKyAgICB0b0NoaWxkLmNoYW5nZWQgPSAwOworICAgIHRvQ2hpbGQubWF0ID0gZ2xvYmFsTWF0OworCisgICAgLy9yc0RlYnVnKCJUcmFuc2Zvcm0gaXMgZGlydHkiLCBkYXRhLT5pc0RpcnR5KTsKKworICAgIC8vIFJlZnJlc2ggbWF0cmljZXMgaWYgZGlydHkKKyAgICBpZihkYXRhLT5pc0RpcnR5KSB7CisgICAgICAgIGRhdGEtPmlzRGlydHkgPSAwOworICAgICAgICB0b0NoaWxkLmNoYW5nZWQgPSAxOworCisgICAgICAgIC8vIFJlc2V0IG91ciBsb2NhbCBtYXRyaXgKKyAgICAgICAgcnNNYXRyaXhMb2FkSWRlbnRpdHkobG9jYWxNYXQpOworCisgICAgICAgIGZsb2F0NCAqdHJhbnNmb3JtU291cmNlID0gJmRhdGEtPnRyYW5zZm9ybXMwOworICAgICAgICBpbnQgKnRyYW5zZm9ybVR5cGVzID0gJmRhdGEtPnRyYW5zZm9ybVR5cGUwOworCisgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCAxNjsgaSArKykgeworICAgICAgICAgICAgaWYodHJhbnNmb3JtVHlwZXNbaV0gPT0gVFJBTlNGT1JNX05PTkUpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vcnNEZWJ1ZygiVHJhbnNmb3JtIGFkZGluZyB0cmFuc2Zvcm1hdGlvbiIsIHRyYW5zZm9ybVR5cGVzW2ldKTsKKyAgICAgICAgICAgIGFwcGVuZFRyYW5zZm9ybWF0aW9uKHRyYW5zZm9ybVR5cGVzW2ldLCB0cmFuc2Zvcm1Tb3VyY2VbaV0sIGxvY2FsTWF0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vcnNEZWJ1ZygiVHJhbnNmb3JtIGNoZWNraW5nIHBhcmVudCIsIChpbnQpMCk7CisKKyAgICBpZihwYXJlbnQpIHsKKyAgICAgICAgaWYocGFyZW50LT5jaGFuZ2VkKSB7CisgICAgICAgICAgICB0b0NoaWxkLmNoYW5nZWQgPSAxOworCisgICAgICAgICAgICByc01hdHJpeExvYWQoZ2xvYmFsTWF0LCBwYXJlbnQtPm1hdCk7CisgICAgICAgICAgICByc01hdHJpeE11bHRpcGx5KGdsb2JhbE1hdCwgbG9jYWxNYXQpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICByc01hdHJpeExvYWQoZ2xvYmFsTWF0LCBsb2NhbE1hdCk7CisgICAgfQorCisgICAgLy9yc0RlYnVnKCJUcmFuc2Zvcm0gY2FsbGluZyBzZWxmIHdpdGggY2hpbGQgIiwgKGludClkYXRhLT5jaGlsZHJlbi5wKTsKKyAgICBpZihkYXRhLT5jaGlsZHJlbi5wKSB7CisgICAgICAgIHJzRm9yRWFjaCh0cmFuc2Zvcm1TY3JpcHQsIGRhdGEtPmNoaWxkcmVuLCBkYXRhLT5jaGlsZHJlbiwgKHZvaWQqKSZ0b0NoaWxkKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvc3JjL2NvbS9hbmRyb2lkL21vZGVsdmlld2VyL3RyYW5zZm9ybV9kZWYucnNoIGIvbGlicy9ycy9qYXZhL01vZGVsVmlld2VyL3NyYy9jb20vYW5kcm9pZC9tb2RlbHZpZXdlci90cmFuc2Zvcm1fZGVmLnJzaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjZlNmM1Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9qYXZhL01vZGVsVmlld2VyL3NyYy9jb20vYW5kcm9pZC9tb2RlbHZpZXdlci90cmFuc2Zvcm1fZGVmLnJzaApAQCAtMCwwICsxLDczIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI3ByYWdtYSB2ZXJzaW9uKDEpCisKKyNwcmFnbWEgcnMgamF2YV9wYWNrYWdlX25hbWUoY29tLmFuZHJvaWQubW9kZWx2aWV3ZXIpCisKKyNkZWZpbmUgVFJBTlNGT1JNX05PTkUgMAorI2RlZmluZSBUUkFOU0ZPUk1fVFJBTlNMQVRFIDEKKyNkZWZpbmUgVFJBTlNGT1JNX1JPVEFURSAyCisjZGVmaW5lIFRSQU5TRk9STV9TQ0FMRSAzCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBmbG9hdDQgZ2xvYmFsTWF0X1JvdzA7CisgICAgZmxvYXQ0IGdsb2JhbE1hdF9Sb3cxOworICAgIGZsb2F0NCBnbG9iYWxNYXRfUm93MjsKKyAgICBmbG9hdDQgZ2xvYmFsTWF0X1JvdzM7CisKKyAgICBmbG9hdDQgbG9jYWxNYXRfUm93MDsKKyAgICBmbG9hdDQgbG9jYWxNYXRfUm93MTsKKyAgICBmbG9hdDQgbG9jYWxNYXRfUm93MjsKKyAgICBmbG9hdDQgbG9jYWxNYXRfUm93MzsKKworICAgIGZsb2F0NCB0cmFuc2Zvcm1zMDsKKyAgICBmbG9hdDQgdHJhbnNmb3JtczE7CisgICAgZmxvYXQ0IHRyYW5zZm9ybXMyOworICAgIGZsb2F0NCB0cmFuc2Zvcm1zMzsKKyAgICBmbG9hdDQgdHJhbnNmb3JtczQ7CisgICAgZmxvYXQ0IHRyYW5zZm9ybXM1OworICAgIGZsb2F0NCB0cmFuc2Zvcm1zNjsKKyAgICBmbG9hdDQgdHJhbnNmb3Jtczc7CisgICAgZmxvYXQ0IHRyYW5zZm9ybXM4OworICAgIGZsb2F0NCB0cmFuc2Zvcm1zOTsKKyAgICBmbG9hdDQgdHJhbnNmb3JtczEwOworICAgIGZsb2F0NCB0cmFuc2Zvcm1zMTE7CisgICAgZmxvYXQ0IHRyYW5zZm9ybXMxMjsKKyAgICBmbG9hdDQgdHJhbnNmb3JtczEzOworICAgIGZsb2F0NCB0cmFuc2Zvcm1zMTQ7CisgICAgZmxvYXQ0IHRyYW5zZm9ybXMxNTsKKworICAgIGludCB0cmFuc2Zvcm1UeXBlMDsKKyAgICBpbnQgdHJhbnNmb3JtVHlwZTE7CisgICAgaW50IHRyYW5zZm9ybVR5cGUyOworICAgIGludCB0cmFuc2Zvcm1UeXBlMzsKKyAgICBpbnQgdHJhbnNmb3JtVHlwZTQ7CisgICAgaW50IHRyYW5zZm9ybVR5cGU1OworICAgIGludCB0cmFuc2Zvcm1UeXBlNjsKKyAgICBpbnQgdHJhbnNmb3JtVHlwZTc7CisgICAgaW50IHRyYW5zZm9ybVR5cGU4OworICAgIGludCB0cmFuc2Zvcm1UeXBlOTsKKyAgICBpbnQgdHJhbnNmb3JtVHlwZTEwOworICAgIGludCB0cmFuc2Zvcm1UeXBlMTE7CisgICAgaW50IHRyYW5zZm9ybVR5cGUxMjsKKyAgICBpbnQgdHJhbnNmb3JtVHlwZTEzOworICAgIGludCB0cmFuc2Zvcm1UeXBlMTQ7CisgICAgaW50IHRyYW5zZm9ybVR5cGUxNTsKKworICAgIGludCBpc0RpcnR5OworCisgICAgcnNfYWxsb2NhdGlvbiBjaGlsZHJlbjsKKworfSBTZ1RyYW5zZm9ybTsKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9TYW1wbGVzL0FuZHJvaWQubWsgYi9saWJzL3JzL2phdmEvU2FtcGxlcy9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1YWU3MzQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvU2FtcGxlcy9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMzEgQEAKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2lmbmVxICgkKFRBUkdFVF9TSU1VTEFUT1IpLHRydWUpCisKK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorCitMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpICQoY2FsbCBhbGwtcmVuZGVyc2NyaXB0LWZpbGVzLXVuZGVyLCBzcmMpCisjTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQucmVuZGVyc2NyaXB0CisKK0xPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBTYW1wbGVzCisKK2luY2x1ZGUgJChCVUlMRF9QQUNLQUdFKQorCitlbmRpZgpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL1NhbXBsZXMvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2xpYnMvcnMvamF2YS9TYW1wbGVzL0FuZHJvaWRNYW5pZmVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmUxOTFmMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvamF2YS9TYW1wbGVzL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTAsMCArMSwyNCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgcGFja2FnZT0iY29tLmFuZHJvaWQuc2FtcGxlcyI+CisgICAgPGFwcGxpY2F0aW9uIGFuZHJvaWQ6bGFiZWw9IlNhbXBsZXMiCisgICAgYW5kcm9pZDppY29uPSJAZHJhd2FibGUvdGVzdF9wYXR0ZXJuIj4KKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iUnNMaXN0IgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iUnNMaXN0IiAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0aGVtZT0iQGFuZHJvaWQ6c3R5bGUvVGhlbWUuQmxhY2suTm9UaXRsZUJhciI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisgICAgICAgIAorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJSc1JlbmRlclN0YXRlcyIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IlJzU3RhdGVzIiAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0aGVtZT0iQGFuZHJvaWQ6c3R5bGUvVGhlbWUuQmxhY2suTm9UaXRsZUJhciI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisgICAgPC9hcHBsaWNhdGlvbj4KKzwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvU2FtcGxlcy9yZXMvZHJhd2FibGUvZGF0YS5wbmcgYi9saWJzL3JzL2phdmEvU2FtcGxlcy9yZXMvZHJhd2FibGUvZGF0YS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGUzNDcxNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvamF2YS9TYW1wbGVzL3Jlcy9kcmF3YWJsZS9kYXRhLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvU2FtcGxlcy9yZXMvZHJhd2FibGUvbGVhZi5wbmcgYi9saWJzL3JzL2phdmEvU2FtcGxlcy9yZXMvZHJhd2FibGUvbGVhZi5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2NkMzc3NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvamF2YS9TYW1wbGVzL3Jlcy9kcmF3YWJsZS9sZWFmLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvU2FtcGxlcy9yZXMvZHJhd2FibGUvdGVzdF9wYXR0ZXJuLnBuZyBiL2xpYnMvcnMvamF2YS9TYW1wbGVzL3Jlcy9kcmF3YWJsZS90ZXN0X3BhdHRlcm4ucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3ZDE0NTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvU2FtcGxlcy9yZXMvZHJhd2FibGUvdGVzdF9wYXR0ZXJuLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvU2FtcGxlcy9yZXMvZHJhd2FibGUvdG9ydXNtYXAucG5nIGIvbGlicy9ycy9qYXZhL1NhbXBsZXMvcmVzL2RyYXdhYmxlL3RvcnVzbWFwLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTA4ZjNiCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9qYXZhL1NhbXBsZXMvcmVzL2RyYXdhYmxlL3RvcnVzbWFwLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvU2FtcGxlcy9yZXMvcmF3L3RvcnVzLmEzZCBiL2xpYnMvcnMvamF2YS9TYW1wbGVzL3Jlcy9yYXcvdG9ydXMuYTNkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxMGYwOTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvU2FtcGxlcy9yZXMvcmF3L3RvcnVzLmEzZApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvU2FtcGxlcy9zcmMvY29tL2FuZHJvaWQvc2FtcGxlcy9Sc0xpc3QuamF2YSBiL2xpYnMvcnMvamF2YS9TYW1wbGVzL3NyYy9jb20vYW5kcm9pZC9zYW1wbGVzL1JzTGlzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4YzczM2QKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvU2FtcGxlcy9zcmMvY29tL2FuZHJvaWQvc2FtcGxlcy9Sc0xpc3QuamF2YQpAQCAtMCwwICsxLDcxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5zYW1wbGVzOworCitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUlNTdXJmYWNlVmlldzsKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5SZW5kZXJTY3JpcHQ7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuTG9vcGVyOworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzLlN5c3RlbTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQ29uZmlnOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnU7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnVJdGVtOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3c7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQnV0dG9uOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3OworCitpbXBvcnQgamF2YS5sYW5nLlJ1bnRpbWU7CisKK3B1YmxpYyBjbGFzcyBSc0xpc3QgZXh0ZW5kcyBBY3Rpdml0eSB7CisKKyAgICBwcml2YXRlIFJzTGlzdFZpZXcgbVZpZXc7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZShCdW5kbGUgaWNpY2xlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKGljaWNsZSk7CisKKyAgICAgICAgLy8gQ3JlYXRlIG91ciBQcmV2aWV3IHZpZXcgYW5kIHNldCBpdCBhcyB0aGUgY29udGVudCBvZiBvdXIKKyAgICAgICAgLy8gQWN0aXZpdHkKKyAgICAgICAgbVZpZXcgPSBuZXcgUnNMaXN0Vmlldyh0aGlzKTsKKyAgICAgICAgc2V0Q29udGVudFZpZXcobVZpZXcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uUmVzdW1lKCkgeworICAgICAgICAvLyBJZGVhbGx5IGEgZ2FtZSBzaG91bGQgaW1wbGVtZW50IG9uUmVzdW1lKCkgYW5kIG9uUGF1c2UoKQorICAgICAgICAvLyB0byB0YWtlIGFwcHJvcHJpYXRlIGFjdGlvbiB3aGVuIHRoZSBhY3Rpdml0eSBsb29zZXMgZm9jdXMKKyAgICAgICAgc3VwZXIub25SZXN1bWUoKTsKKyAgICAgICAgbVZpZXcub25SZXN1bWUoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvblBhdXNlKCkgeworICAgICAgICAvLyBJZGVhbGx5IGEgZ2FtZSBzaG91bGQgaW1wbGVtZW50IG9uUmVzdW1lKCkgYW5kIG9uUGF1c2UoKQorICAgICAgICAvLyB0byB0YWtlIGFwcHJvcHJpYXRlIGFjdGlvbiB3aGVuIHRoZSBhY3Rpdml0eSBsb29zZXMgZm9jdXMKKyAgICAgICAgc3VwZXIub25QYXVzZSgpOworICAgICAgICBtVmlldy5vblBhdXNlKCk7CisgICAgfQorCit9CisKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9TYW1wbGVzL3NyYy9jb20vYW5kcm9pZC9zYW1wbGVzL1JzTGlzdFJTLmphdmEgYi9saWJzL3JzL2phdmEvU2FtcGxlcy9zcmMvY29tL2FuZHJvaWQvc2FtcGxlcy9Sc0xpc3RSUy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3ODJlMGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvU2FtcGxlcy9zcmMvY29tL2FuZHJvaWQvc2FtcGxlcy9Sc0xpc3RSUy5qYXZhCkBAIC0wLDAgKzEsMTQ1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5zYW1wbGVzOworCitpbXBvcnQgamF2YS5pby5Xcml0ZXI7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0Lio7CitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUHJvZ3JhbVN0b3JlLkRlcHRoRnVuYzsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCisKK3B1YmxpYyBjbGFzcyBSc0xpc3RSUyB7CisKKyAgICBwcml2YXRlIGZpbmFsIGludCBTVEFURV9MQVNUX0ZPQ1VTID0gMTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIERBVEFfTElTVCA9IHsKKyAgICAiQWZnaGFuaXN0YW4iLCAiQWxiYW5pYSIsICJBbGdlcmlhIiwgIkFtZXJpY2FuIFNhbW9hIiwgIkFuZG9ycmEiLAorICAgICJBbmdvbGEiLCAiQW5ndWlsbGEiLCAiQW50YXJjdGljYSIsICJBbnRpZ3VhIGFuZCBCYXJidWRhIiwgIkFyZ2VudGluYSIsCisgICAgIkFybWVuaWEiLCAiQXJ1YmEiLCAiQXVzdHJhbGlhIiwgIkF1c3RyaWEiLCAiQXplcmJhaWphbiIsCisgICAgIkJhaHJhaW4iLCAiQmFuZ2xhZGVzaCIsICJCYXJiYWRvcyIsICJCZWxhcnVzIiwgIkJlbGdpdW0iLAorICAgICJCZWxpemUiLCAiQmVuaW4iLCAiQmVybXVkYSIsICJCaHV0YW4iLCAiQm9saXZpYSIsCisgICAgIkJvc25pYSBhbmQgSGVyemVnb3ZpbmEiLCAiQm90c3dhbmEiLCAiQm91dmV0IElzbGFuZCIsICJCcmF6aWwiLAorICAgICJCcml0aXNoIEluZGlhbiBPY2VhbiBUZXJyaXRvcnkiLCAiQnJpdGlzaCBWaXJnaW4gSXNsYW5kcyIsICJCcnVuZWkiLCAiQnVsZ2FyaWEiLAorICAgICJCdXJraW5hIEZhc28iLCAiQnVydW5kaSIsICJDb3RlIGQnSXZvaXJlIiwgIkNhbWJvZGlhIiwgIkNhbWVyb29uIiwgIkNhbmFkYSIsICJDYXBlIFZlcmRlIiwKKyAgICAiQ2F5bWFuIElzbGFuZHMiLCAiQ2VudHJhbCBBZnJpY2FuIFJlcHVibGljIiwgIkNoYWQiLCAiQ2hpbGUiLCAiQ2hpbmEiLAorICAgICJDaHJpc3RtYXMgSXNsYW5kIiwgIkNvY29zIChLZWVsaW5nKSBJc2xhbmRzIiwgIkNvbG9tYmlhIiwgIkNvbW9yb3MiLCAiQ29uZ28iLAorICAgICJDb29rIElzbGFuZHMiLCAiQ29zdGEgUmljYSIsICJDcm9hdGlhIiwgIkN1YmEiLCAiQ3lwcnVzIiwgIkN6ZWNoIFJlcHVibGljIiwKKyAgICAiRGVtb2NyYXRpYyBSZXB1YmxpYyBvZiB0aGUgQ29uZ28iLCAiRGVubWFyayIsICJEamlib3V0aSIsICJEb21pbmljYSIsICJEb21pbmljYW4gUmVwdWJsaWMiLAorICAgICJFYXN0IFRpbW9yIiwgIkVjdWFkb3IiLCAiRWd5cHQiLCAiRWwgU2FsdmFkb3IiLCAiRXF1YXRvcmlhbCBHdWluZWEiLCAiRXJpdHJlYSIsCisgICAgIkVzdG9uaWEiLCAiRXRoaW9waWEiLCAiRmFlcm9lIElzbGFuZHMiLCAiRmFsa2xhbmQgSXNsYW5kcyIsICJGaWppIiwgIkZpbmxhbmQiLAorICAgICJGb3JtZXIgWXVnb3NsYXYgUmVwdWJsaWMgb2YgTWFjZWRvbmlhIiwgIkZyYW5jZSIsICJGcmVuY2ggR3VpYW5hIiwgIkZyZW5jaCBQb2x5bmVzaWEiLAorICAgICJGcmVuY2ggU291dGhlcm4gVGVycml0b3JpZXMiLCAiR2Fib24iLCAiR2VvcmdpYSIsICJHZXJtYW55IiwgIkdoYW5hIiwgIkdpYnJhbHRhciIsCisgICAgIkdyZWVjZSIsICJHcmVlbmxhbmQiLCAiR3JlbmFkYSIsICJHdWFkZWxvdXBlIiwgIkd1YW0iLCAiR3VhdGVtYWxhIiwgIkd1aW5lYSIsICJHdWluZWEtQmlzc2F1IiwKKyAgICAiR3V5YW5hIiwgIkhhaXRpIiwgIkhlYXJkIElzbGFuZCBhbmQgTWNEb25hbGQgSXNsYW5kcyIsICJIb25kdXJhcyIsICJIb25nIEtvbmciLCAiSHVuZ2FyeSIsCisgICAgIkljZWxhbmQiLCAiSW5kaWEiLCAiSW5kb25lc2lhIiwgIklyYW4iLCAiSXJhcSIsICJJcmVsYW5kIiwgIklzcmFlbCIsICJJdGFseSIsICJKYW1haWNhIiwKKyAgICAiSmFwYW4iLCAiSm9yZGFuIiwgIkthemFraHN0YW4iLCAiS2VueWEiLCAiS2lyaWJhdGkiLCAiS3V3YWl0IiwgIkt5cmd5enN0YW4iLCAiTGFvcyIsCisgICAgIkxhdHZpYSIsICJMZWJhbm9uIiwgIkxlc290aG8iLCAiTGliZXJpYSIsICJMaWJ5YSIsICJMaWVjaHRlbnN0ZWluIiwgIkxpdGh1YW5pYSIsICJMdXhlbWJvdXJnIiwKKyAgICAiTWFjYXUiLCAiTWFkYWdhc2NhciIsICJNYWxhd2kiLCAiTWFsYXlzaWEiLCAiTWFsZGl2ZXMiLCAiTWFsaSIsICJNYWx0YSIsICJNYXJzaGFsbCBJc2xhbmRzIiwKKyAgICAiTWFydGluaXF1ZSIsICJNYXVyaXRhbmlhIiwgIk1hdXJpdGl1cyIsICJNYXlvdHRlIiwgIk1leGljbyIsICJNaWNyb25lc2lhIiwgIk1vbGRvdmEiLAorICAgICJNb25hY28iLCAiTW9uZ29saWEiLCAiTW9udHNlcnJhdCIsICJNb3JvY2NvIiwgIk1vemFtYmlxdWUiLCAiTXlhbm1hciIsICJOYW1pYmlhIiwKKyAgICAiTmF1cnUiLCAiTmVwYWwiLCAiTmV0aGVybGFuZHMiLCAiTmV0aGVybGFuZHMgQW50aWxsZXMiLCAiTmV3IENhbGVkb25pYSIsICJOZXcgWmVhbGFuZCIsCisgICAgIk5pY2FyYWd1YSIsICJOaWdlciIsICJOaWdlcmlhIiwgIk5pdWUiLCAiTm9yZm9sayBJc2xhbmQiLCAiTm9ydGggS29yZWEiLCAiTm9ydGhlcm4gTWFyaWFuYXMiLAorICAgICJOb3J3YXkiLCAiT21hbiIsICJQYWtpc3RhbiIsICJQYWxhdSIsICJQYW5hbWEiLCAiUGFwdWEgTmV3IEd1aW5lYSIsICJQYXJhZ3VheSIsICJQZXJ1IiwKKyAgICAiUGhpbGlwcGluZXMiLCAiUGl0Y2Fpcm4gSXNsYW5kcyIsICJQb2xhbmQiLCAiUG9ydHVnYWwiLCAiUHVlcnRvIFJpY28iLCAiUWF0YXIiLAorICAgICJSZXVuaW9uIiwgIlJvbWFuaWEiLCAiUnVzc2lhIiwgIlJ3YW5kYSIsICJTcW8gVG9tZSBhbmQgUHJpbmNpcGUiLCAiU2FpbnQgSGVsZW5hIiwKKyAgICAiU2FpbnQgS2l0dHMgYW5kIE5ldmlzIiwgIlNhaW50IEx1Y2lhIiwgIlNhaW50IFBpZXJyZSBhbmQgTWlxdWVsb24iLAorICAgICJTYWludCBWaW5jZW50IGFuZCB0aGUgR3JlbmFkaW5lcyIsICJTYW1vYSIsICJTYW4gTWFyaW5vIiwgIlNhdWRpIEFyYWJpYSIsICJTZW5lZ2FsIiwKKyAgICAiU2V5Y2hlbGxlcyIsICJTaWVycmEgTGVvbmUiLCAiU2luZ2Fwb3JlIiwgIlNsb3Zha2lhIiwgIlNsb3ZlbmlhIiwgIlNvbG9tb24gSXNsYW5kcyIsCisgICAgIlNvbWFsaWEiLCAiU291dGggQWZyaWNhIiwgIlNvdXRoIEdlb3JnaWEgYW5kIHRoZSBTb3V0aCBTYW5kd2ljaCBJc2xhbmRzIiwgIlNvdXRoIEtvcmVhIiwKKyAgICAiU3BhaW4iLCAiU3JpIExhbmthIiwgIlN1ZGFuIiwgIlN1cmluYW1lIiwgIlN2YWxiYXJkIGFuZCBKYW4gTWF5ZW4iLCAiU3dhemlsYW5kIiwgIlN3ZWRlbiIsCisgICAgIlN3aXR6ZXJsYW5kIiwgIlN5cmlhIiwgIlRhaXdhbiIsICJUYWppa2lzdGFuIiwgIlRhbnphbmlhIiwgIlRoYWlsYW5kIiwgIlRoZSBCYWhhbWFzIiwKKyAgICAiVGhlIEdhbWJpYSIsICJUb2dvIiwgIlRva2VsYXUiLCAiVG9uZ2EiLCAiVHJpbmlkYWQgYW5kIFRvYmFnbyIsICJUdW5pc2lhIiwgIlR1cmtleSIsCisgICAgIlR1cmttZW5pc3RhbiIsICJUdXJrcyBhbmQgQ2FpY29zIElzbGFuZHMiLCAiVHV2YWx1IiwgIlZpcmdpbiBJc2xhbmRzIiwgIlVnYW5kYSIsCisgICAgIlVrcmFpbmUiLCAiVW5pdGVkIEFyYWIgRW1pcmF0ZXMiLCAiVW5pdGVkIEtpbmdkb20iLAorICAgICJVbml0ZWQgU3RhdGVzIiwgIlVuaXRlZCBTdGF0ZXMgTWlub3IgT3V0bHlpbmcgSXNsYW5kcyIsICJVcnVndWF5IiwgIlV6YmVraXN0YW4iLAorICAgICJWYW51YXR1IiwgIlZhdGljYW4gQ2l0eSIsICJWZW5lenVlbGEiLCAiVmlldG5hbSIsICJXYWxsaXMgYW5kIEZ1dHVuYSIsICJXZXN0ZXJuIFNhaGFyYSIsCisgICAgIlllbWVuIiwgIll1Z29zbGF2aWEiLCAiWmFtYmlhIiwgIlppbWJhYndlIgorICAgIH07CisKKyAgICBpbnQgbVdpZHRoOworICAgIGludCBtSGVpZ2h0OworCisgICAgcHVibGljIFJzTGlzdFJTKCkgeworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGluaXQoUmVuZGVyU2NyaXB0R0wgcnMsIFJlc291cmNlcyByZXMsIGludCB3aWR0aCwgaW50IGhlaWdodCkgeworICAgICAgICBtUlMgPSByczsKKyAgICAgICAgbVJlcyA9IHJlczsKKyAgICAgICAgbVdpZHRoID0gd2lkdGg7CisgICAgICAgIG1IZWlnaHQgPSBoZWlnaHQ7CisgICAgICAgIGluaXRSUygpOworICAgIH0KKworICAgIHByaXZhdGUgUmVzb3VyY2VzIG1SZXM7CisgICAgcHJpdmF0ZSBSZW5kZXJTY3JpcHRHTCBtUlM7CisgICAgcHJpdmF0ZSBGb250IG1JdGFsaWM7CisKKyAgICBTY3JpcHRGaWVsZF9MaXN0QWxsb2NzX3MgbUxpc3RBbGxvY3M7CisKKyAgICBwcml2YXRlIFNjcmlwdENfUnNsaXN0IG1TY3JpcHQ7CisKKyAgICBpbnQgbUxhc3RYOworICAgIGludCBtTGFzdFk7CisKKyAgICBwdWJsaWMgdm9pZCBvbkFjdGlvbkRvd24oaW50IHgsIGludCB5KSB7CisgICAgICAgIG1TY3JpcHQuc2V0X2dEWSgwLjBmKTsKKworICAgICAgICBtTGFzdFggPSB4OworICAgICAgICBtTGFzdFkgPSB5OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG9uQWN0aW9uTW92ZShpbnQgeCwgaW50IHkpIHsKKyAgICAgICAgaW50IGR4ID0gbUxhc3RYIC0geDsKKyAgICAgICAgaW50IGR5ID0gbUxhc3RZIC0geTsKKworICAgICAgICBpZihNYXRoLmFicyhkeSkgPD0gMikgeworICAgICAgICAgICAgZHkgPSAwOworICAgICAgICB9CisKKyAgICAgICAgbVNjcmlwdC5zZXRfZ0RZKGR5KTsKKworICAgICAgICBtTGFzdFggPSB4OworICAgICAgICBtTGFzdFkgPSB5OworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbml0UlMoKSB7CisKKyAgICAgICAgbVNjcmlwdCA9IG5ldyBTY3JpcHRDX1JzbGlzdChtUlMsIG1SZXMsIFIucmF3LnJzbGlzdCwgdHJ1ZSk7CisKKyAgICAgICAgbUxpc3RBbGxvY3MgPSBuZXcgU2NyaXB0RmllbGRfTGlzdEFsbG9jc19zKG1SUywgREFUQV9MSVNULmxlbmd0aCk7CisgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBEQVRBX0xJU1QubGVuZ3RoOyBpICsrKSB7CisgICAgICAgICAgICBTY3JpcHRGaWVsZF9MaXN0QWxsb2NzX3MuSXRlbSBsaXN0RWxlbSA9IG5ldyBTY3JpcHRGaWVsZF9MaXN0QWxsb2NzX3MuSXRlbSgpOworICAgICAgICAgICAgbGlzdEVsZW0udGV4dCA9IEFsbG9jYXRpb24uY3JlYXRlRnJvbVN0cmluZyhtUlMsIERBVEFfTElTVFtpXSk7CisgICAgICAgICAgICBtTGlzdEFsbG9jcy5zZXQobGlzdEVsZW0sIGksIGZhbHNlKTsKKyAgICAgICAgfQorCisgICAgICAgIG1MaXN0QWxsb2NzLmNvcHlBbGwoKTsKKworICAgICAgICBtU2NyaXB0LmJpbmRfZ0xpc3QobUxpc3RBbGxvY3MpOworCisgICAgICAgIG1JdGFsaWMgPSBGb250LmNyZWF0ZUZyb21GYW1pbHkobVJTLCBtUmVzLCAic2VyaWYiLCBGb250LlN0eWxlLkJPTERfSVRBTElDLCA4KTsKKyAgICAgICAgbVNjcmlwdC5zZXRfZ0l0YWxpYyhtSXRhbGljKTsKKworICAgICAgICBtUlMuY29udGV4dEJpbmRSb290U2NyaXB0KG1TY3JpcHQpOworICAgIH0KK30KKworCisKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9TYW1wbGVzL3NyYy9jb20vYW5kcm9pZC9zYW1wbGVzL1JzTGlzdFZpZXcuamF2YSBiL2xpYnMvcnMvamF2YS9TYW1wbGVzL3NyYy9jb20vYW5kcm9pZC9zYW1wbGVzL1JzTGlzdFZpZXcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOThlYTA4Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9qYXZhL1NhbXBsZXMvc3JjL2NvbS9hbmRyb2lkL3NhbXBsZXMvUnNMaXN0Vmlldy5qYXZhCkBAIC0wLDAgKzEsOTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnNhbXBsZXM7CisKK2ltcG9ydCBqYXZhLmlvLldyaXRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlNlbWFwaG9yZTsKKworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0LlJTU3VyZmFjZVZpZXc7CitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUmVuZGVyU2NyaXB0OworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0LlJlbmRlclNjcmlwdEdMOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5CaXRtYXBEcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlOworaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlSG9sZGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OworCitwdWJsaWMgY2xhc3MgUnNMaXN0VmlldyBleHRlbmRzIFJTU3VyZmFjZVZpZXcgeworCisgICAgcHVibGljIFJzTGlzdFZpZXcoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQpOworICAgICAgICAvL3NldEZvY3VzYWJsZSh0cnVlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFJlbmRlclNjcmlwdEdMIG1SUzsKKyAgICBwcml2YXRlIFJzTGlzdFJTIG1SZW5kZXI7CisKKworICAgIHB1YmxpYyB2b2lkIHN1cmZhY2VDaGFuZ2VkKFN1cmZhY2VIb2xkZXIgaG9sZGVyLCBpbnQgZm9ybWF0LCBpbnQgdywgaW50IGgpIHsKKyAgICAgICAgc3VwZXIuc3VyZmFjZUNoYW5nZWQoaG9sZGVyLCBmb3JtYXQsIHcsIGgpOworICAgICAgICBpZiAobVJTID09IG51bGwpIHsKKyAgICAgICAgICAgIG1SUyA9IGNyZWF0ZVJlbmRlclNjcmlwdCh0cnVlKTsKKyAgICAgICAgICAgIG1SUy5jb250ZXh0U2V0U3VyZmFjZSh3LCBoLCBob2xkZXIuZ2V0U3VyZmFjZSgpKTsKKyAgICAgICAgICAgIG1SZW5kZXIgPSBuZXcgUnNMaXN0UlMoKTsKKyAgICAgICAgICAgIG1SZW5kZXIuaW5pdChtUlMsIGdldFJlc291cmNlcygpLCB3LCBoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uRGV0YWNoZWRGcm9tV2luZG93KCkgeworICAgICAgICBpZihtUlMgIT0gbnVsbCkgeworICAgICAgICAgICAgbVJTID0gbnVsbDsKKyAgICAgICAgICAgIGRlc3Ryb3lSZW5kZXJTY3JpcHQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIG9uS2V5RG93bihpbnQga2V5Q29kZSwgS2V5RXZlbnQgZXZlbnQpCisgICAgeworICAgICAgICAvLyBicmVhayBwb2ludCBhdCBoZXJlCisgICAgICAgIC8vIHRoaXMgbWV0aG9kIGRvZXNuJ3Qgd29yayB3aGVuICdleHRlbmRzIFZpZXcnIGluY2x1ZGUgJ2V4dGVuZHMgU2Nyb2xsVmlldycuCisgICAgICAgIHJldHVybiBzdXBlci5vbktleURvd24oa2V5Q29kZSwgZXZlbnQpOworICAgIH0KKworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25Ub3VjaEV2ZW50KE1vdGlvbkV2ZW50IGV2KQorICAgIHsKKyAgICAgICAgYm9vbGVhbiByZXQgPSBmYWxzZTsKKyAgICAgICAgaW50IGFjdCA9IGV2LmdldEFjdGlvbigpOworICAgICAgICBpZiAoYWN0ID09IGV2LkFDVElPTl9ET1dOKSB7CisgICAgICAgICAgICBtUmVuZGVyLm9uQWN0aW9uRG93bigoaW50KWV2LmdldFgoKSwgKGludClldi5nZXRZKCkpOworICAgICAgICAgICAgcmV0ID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChhY3QgPT0gZXYuQUNUSU9OX01PVkUpIHsKKyAgICAgICAgICAgIG1SZW5kZXIub25BY3Rpb25Nb3ZlKChpbnQpZXYuZ2V0WCgpLCAoaW50KWV2LmdldFkoKSk7CisgICAgICAgICAgICByZXQgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9Cit9CisKKwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL1NhbXBsZXMvc3JjL2NvbS9hbmRyb2lkL3NhbXBsZXMvUnNSZW5kZXJTdGF0ZXMuamF2YSBiL2xpYnMvcnMvamF2YS9TYW1wbGVzL3NyYy9jb20vYW5kcm9pZC9zYW1wbGVzL1JzUmVuZGVyU3RhdGVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzkxMDA3ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvamF2YS9TYW1wbGVzL3NyYy9jb20vYW5kcm9pZC9zYW1wbGVzL1JzUmVuZGVyU3RhdGVzLmphdmEKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc2FtcGxlczsKKworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0LlJTU3VyZmFjZVZpZXc7CitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUmVuZGVyU2NyaXB0OworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5ncy5TeXN0ZW07CitpbXBvcnQgYW5kcm9pZC51dGlsLkNvbmZpZzsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51OworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SXRlbTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkJ1dHRvbjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaXN0VmlldzsKKworaW1wb3J0IGphdmEubGFuZy5SdW50aW1lOworCitwdWJsaWMgY2xhc3MgUnNSZW5kZXJTdGF0ZXMgZXh0ZW5kcyBBY3Rpdml0eSB7CisKKyAgICBwcml2YXRlIFJzUmVuZGVyU3RhdGVzVmlldyBtVmlldzsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBpY2ljbGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoaWNpY2xlKTsKKworICAgICAgICAvLyBDcmVhdGUgb3VyIFByZXZpZXcgdmlldyBhbmQgc2V0IGl0IGFzIHRoZSBjb250ZW50IG9mIG91cgorICAgICAgICAvLyBBY3Rpdml0eQorICAgICAgICBtVmlldyA9IG5ldyBSc1JlbmRlclN0YXRlc1ZpZXcodGhpcyk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KG1WaWV3KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvblJlc3VtZSgpIHsKKyAgICAgICAgLy8gSWRlYWxseSBhIGdhbWUgc2hvdWxkIGltcGxlbWVudCBvblJlc3VtZSgpIGFuZCBvblBhdXNlKCkKKyAgICAgICAgLy8gdG8gdGFrZSBhcHByb3ByaWF0ZSBhY3Rpb24gd2hlbiB0aGUgYWN0aXZpdHkgbG9vc2VzIGZvY3VzCisgICAgICAgIHN1cGVyLm9uUmVzdW1lKCk7CisgICAgICAgIG1WaWV3Lm9uUmVzdW1lKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25QYXVzZSgpIHsKKyAgICAgICAgLy8gSWRlYWxseSBhIGdhbWUgc2hvdWxkIGltcGxlbWVudCBvblJlc3VtZSgpIGFuZCBvblBhdXNlKCkKKyAgICAgICAgLy8gdG8gdGFrZSBhcHByb3ByaWF0ZSBhY3Rpb24gd2hlbiB0aGUgYWN0aXZpdHkgbG9vc2VzIGZvY3VzCisgICAgICAgIHN1cGVyLm9uUGF1c2UoKTsKKyAgICAgICAgbVZpZXcub25QYXVzZSgpOworICAgIH0KKworfQorCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvU2FtcGxlcy9zcmMvY29tL2FuZHJvaWQvc2FtcGxlcy9Sc1JlbmRlclN0YXRlc1JTLmphdmEgYi9saWJzL3JzL2phdmEvU2FtcGxlcy9zcmMvY29tL2FuZHJvaWQvc2FtcGxlcy9Sc1JlbmRlclN0YXRlc1JTLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGVmZjQ1NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvamF2YS9TYW1wbGVzL3NyYy9jb20vYW5kcm9pZC9zYW1wbGVzL1JzUmVuZGVyU3RhdGVzUlMuamF2YQpAQCAtMCwwICsxLDI4MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc2FtcGxlczsKKworaW1wb3J0IGphdmEuaW8uV3JpdGVyOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuKjsKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5Qcm9ncmFtU3RvcmUuRGVwdGhGdW5jOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXBGYWN0b3J5OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworCisKK3B1YmxpYyBjbGFzcyBSc1JlbmRlclN0YXRlc1JTIHsKKworICAgIGludCBtV2lkdGg7CisgICAgaW50IG1IZWlnaHQ7CisKKyAgICBwdWJsaWMgUnNSZW5kZXJTdGF0ZXNSUygpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBpbml0KFJlbmRlclNjcmlwdEdMIHJzLCBSZXNvdXJjZXMgcmVzLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKKyAgICAgICAgbVJTID0gcnM7CisgICAgICAgIG1SZXMgPSByZXM7CisgICAgICAgIG1XaWR0aCA9IHdpZHRoOworICAgICAgICBtSGVpZ2h0ID0gaGVpZ2h0OworICAgICAgICBtT3B0aW9uc0FSR0IuaW5TY2FsZWQgPSBmYWxzZTsKKyAgICAgICAgbU9wdGlvbnNBUkdCLmluUHJlZmVycmVkQ29uZmlnID0gQml0bWFwLkNvbmZpZy5BUkdCXzg4ODg7CisgICAgICAgIG1Nb2RlID0gMDsKKyAgICAgICAgbU1heE1vZGVzID0gNzsKKyAgICAgICAgaW5pdFJTKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBSZXNvdXJjZXMgbVJlczsKKyAgICBwcml2YXRlIFJlbmRlclNjcmlwdEdMIG1SUzsKKworICAgIHByaXZhdGUgU2FtcGxlciBtTGluZWFyQ2xhbXA7CisgICAgcHJpdmF0ZSBTYW1wbGVyIG1MaW5lYXJXcmFwOworICAgIHByaXZhdGUgU2FtcGxlciBtTWlwTGluZWFyV3JhcDsKKyAgICBwcml2YXRlIFNhbXBsZXIgbU5lYXJlc3RDbGFtcDsKKworICAgIHByaXZhdGUgUHJvZ3JhbVN0b3JlIG1Qcm9nU3RvcmVCbGVuZE5vbmVEZXB0aDsKKyAgICBwcml2YXRlIFByb2dyYW1TdG9yZSBtUHJvZ1N0b3JlQmxlbmROb25lOworICAgIHByaXZhdGUgUHJvZ3JhbVN0b3JlIG1Qcm9nU3RvcmVCbGVuZEFscGhhOworICAgIHByaXZhdGUgUHJvZ3JhbVN0b3JlIG1Qcm9nU3RvcmVCbGVuZEFkZDsKKworICAgIHByaXZhdGUgUHJvZ3JhbUZyYWdtZW50IG1Qcm9nRnJhZ21lbnRUZXh0dXJlOworICAgIHByaXZhdGUgUHJvZ3JhbUZyYWdtZW50IG1Qcm9nRnJhZ21lbnRDb2xvcjsKKworICAgIHByaXZhdGUgUHJvZ3JhbVZlcnRleCBtUHJvZ1ZlcnRleDsKKyAgICBwcml2YXRlIFByb2dyYW1WZXJ0ZXguTWF0cml4QWxsb2NhdGlvbiBtUFZBOworCisgICAgcHJpdmF0ZSBQcm9ncmFtUmFzdGVyIG1DdWxsQmFjazsKKyAgICBwcml2YXRlIFByb2dyYW1SYXN0ZXIgbUN1bGxGcm9udDsKKworICAgIHByaXZhdGUgQWxsb2NhdGlvbiBtVGV4VG9ydXM7CisgICAgcHJpdmF0ZSBBbGxvY2F0aW9uIG1UZXhPcGFxdWU7CisgICAgcHJpdmF0ZSBBbGxvY2F0aW9uIG1UZXhUcmFuc3BhcmVudDsKKworICAgIHByaXZhdGUgQWxsb2NhdGlvbiBtQWxsb2NQVjsKKworICAgIHByaXZhdGUgTWVzaCBtTWJ5Tk1lc2g7CisgICAgcHJpdmF0ZSBNZXNoIG1Ub3J1czsKKworICAgIEZvbnQgbUZvbnRTYW5zOworICAgIEZvbnQgbUZvbnRTZXJpZjsKKyAgICBGb250IG1Gb250U2VyaWZCb2xkOworICAgIEZvbnQgbUZvbnRTZXJpZkl0YWxpYzsKKyAgICBGb250IG1Gb250U2VyaWZCb2xkSXRhbGljOworICAgIEZvbnQgbUZvbnRNb25vOworCisgICAgcHJpdmF0ZSBBbGxvY2F0aW9uIG1UZXh0QWxsb2M7CisKKyAgICBwcml2YXRlIFNjcmlwdENfUnNyZW5kZXJzdGF0ZXMgbVNjcmlwdDsKKworICAgIHByaXZhdGUgZmluYWwgQml0bWFwRmFjdG9yeS5PcHRpb25zIG1PcHRpb25zQVJHQiA9IG5ldyBCaXRtYXBGYWN0b3J5Lk9wdGlvbnMoKTsKKworICAgIGludCBtTW9kZTsKKyAgICBpbnQgbU1heE1vZGVzOworCisgICAgcHVibGljIHZvaWQgb25BY3Rpb25Eb3duKGludCB4LCBpbnQgeSkgeworICAgICAgICBtTW9kZSArKzsKKyAgICAgICAgbU1vZGUgPSBtTW9kZSAlIG1NYXhNb2RlczsKKyAgICAgICAgbVNjcmlwdC5zZXRfZ0Rpc3BsYXlNb2RlKG1Nb2RlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIE1lc2ggZ2V0TWJ5Tk1lc2goZmxvYXQgd2lkdGgsIGZsb2F0IGhlaWdodCwgaW50IHdSZXNvbHV0aW9uLCBpbnQgaFJlc29sdXRpb24pIHsKKworICAgICAgICBNZXNoLlRyaWFuZ2xlTWVzaEJ1aWxkZXIgdG1iID0gbmV3IE1lc2guVHJpYW5nbGVNZXNoQnVpbGRlcihtUlMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiwgTWVzaC5UcmlhbmdsZU1lc2hCdWlsZGVyLlRFWFRVUkVfMCk7CisKKyAgICAgICAgZm9yIChpbnQgeSA9IDA7IHkgPD0gaFJlc29sdXRpb247IHkrKykgeworICAgICAgICAgICAgZmluYWwgZmxvYXQgbm9ybWFsaXplZFkgPSAoZmxvYXQpeSAvIGhSZXNvbHV0aW9uOworICAgICAgICAgICAgZmluYWwgZmxvYXQgeU9mZnNldCA9IChub3JtYWxpemVkWSAtIDAuNWYpICogaGVpZ2h0OworICAgICAgICAgICAgZm9yIChpbnQgeCA9IDA7IHggPD0gd1Jlc29sdXRpb247IHgrKykgeworICAgICAgICAgICAgICAgIGZsb2F0IG5vcm1hbGl6ZWRYID0gKGZsb2F0KXggLyB3UmVzb2x1dGlvbjsKKyAgICAgICAgICAgICAgICBmbG9hdCB4T2Zmc2V0ID0gKG5vcm1hbGl6ZWRYIC0gMC41ZikgKiB3aWR0aDsKKyAgICAgICAgICAgICAgICB0bWIuc2V0VGV4dHVyZShub3JtYWxpemVkWCwgbm9ybWFsaXplZFkpOworICAgICAgICAgICAgICAgIHRtYi5hZGRWZXJ0ZXgoeE9mZnNldCwgeU9mZnNldCk7CisgICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yIChpbnQgeSA9IDA7IHkgPCBoUmVzb2x1dGlvbjsgeSsrKSB7CisgICAgICAgICAgICBmaW5hbCBpbnQgY3VyWSA9IHkgKiAod1Jlc29sdXRpb24gKyAxKTsKKyAgICAgICAgICAgIGZpbmFsIGludCBiZWxvd1kgPSAoeSArIDEpICogKHdSZXNvbHV0aW9uICsgMSk7CisgICAgICAgICAgICBmb3IgKGludCB4ID0gMDsgeCA8IHdSZXNvbHV0aW9uOyB4KyspIHsKKyAgICAgICAgICAgICAgICBpbnQgY3VyViA9IGN1clkgKyB4OworICAgICAgICAgICAgICAgIGludCBiZWxvd1YgPSBiZWxvd1kgKyB4OworICAgICAgICAgICAgICAgIHRtYi5hZGRUcmlhbmdsZShjdXJWLCBiZWxvd1YsIGN1clYgKyAxKTsKKyAgICAgICAgICAgICAgICB0bWIuYWRkVHJpYW5nbGUoYmVsb3dWLCBiZWxvd1YgKyAxLCBjdXJWICsgMSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdG1iLmNyZWF0ZSh0cnVlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5pdFByb2dyYW1TdG9yZSgpIHsKKyAgICAgICAgLy8gVXNlIHN0b2NrIHRoZSBzdG9jayBwcm9ncmFtIHN0b3JlIG9iamVjdAorICAgICAgICBtUHJvZ1N0b3JlQmxlbmROb25lRGVwdGggPSBQcm9ncmFtU3RvcmUuQkxFTkRfTk9ORV9ERVBUSF9URVNUKG1SUyk7CisgICAgICAgIG1Qcm9nU3RvcmVCbGVuZE5vbmUgPSBQcm9ncmFtU3RvcmUuQkxFTkRfTk9ORV9ERVBUSF9OT19ERVBUSChtUlMpOworCisgICAgICAgIC8vIENyZWF0ZSBhIGN1c3RvbSBwcm9ncmFtIHN0b3JlCisgICAgICAgIFByb2dyYW1TdG9yZS5CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgUHJvZ3JhbVN0b3JlLkJ1aWxkZXIobVJTKTsKKyAgICAgICAgYnVpbGRlci5zZXREZXB0aEZ1bmMoUHJvZ3JhbVN0b3JlLkRlcHRoRnVuYy5BTFdBWVMpOworICAgICAgICBidWlsZGVyLnNldEJsZW5kRnVuYyhQcm9ncmFtU3RvcmUuQmxlbmRTcmNGdW5jLlNSQ19BTFBIQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvZ3JhbVN0b3JlLkJsZW5kRHN0RnVuYy5PTkVfTUlOVVNfU1JDX0FMUEhBKTsKKyAgICAgICAgYnVpbGRlci5zZXREaXRoZXJFbmFibGUoZmFsc2UpOworICAgICAgICBidWlsZGVyLnNldERlcHRoTWFzayhmYWxzZSk7CisgICAgICAgIG1Qcm9nU3RvcmVCbGVuZEFscGhhID0gYnVpbGRlci5jcmVhdGUoKTsKKworICAgICAgICBtUHJvZ1N0b3JlQmxlbmRBZGQgPSBQcm9ncmFtU3RvcmUuQkxFTkRfQUREX0RFUFRIX05PX0RFUFRIKG1SUyk7CisKKyAgICAgICAgbVNjcmlwdC5zZXRfZ1Byb2dTdG9yZUJsZW5kTm9uZURlcHRoKG1Qcm9nU3RvcmVCbGVuZE5vbmVEZXB0aCk7CisgICAgICAgIG1TY3JpcHQuc2V0X2dQcm9nU3RvcmVCbGVuZE5vbmUobVByb2dTdG9yZUJsZW5kTm9uZSk7CisgICAgICAgIG1TY3JpcHQuc2V0X2dQcm9nU3RvcmVCbGVuZEFscGhhKG1Qcm9nU3RvcmVCbGVuZEFscGhhKTsKKyAgICAgICAgbVNjcmlwdC5zZXRfZ1Byb2dTdG9yZUJsZW5kQWRkKG1Qcm9nU3RvcmVCbGVuZEFkZCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGluaXRQcm9ncmFtRnJhZ21lbnQoKSB7CisKKyAgICAgICAgUHJvZ3JhbUZyYWdtZW50LkJ1aWxkZXIgdGV4QnVpbGRlciA9IG5ldyBQcm9ncmFtRnJhZ21lbnQuQnVpbGRlcihtUlMpOworICAgICAgICB0ZXhCdWlsZGVyLnNldFRleHR1cmUoUHJvZ3JhbUZyYWdtZW50LkJ1aWxkZXIuRW52TW9kZS5SRVBMQUNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvZ3JhbUZyYWdtZW50LkJ1aWxkZXIuRm9ybWF0LlJHQkEsIDApOworICAgICAgICBtUHJvZ0ZyYWdtZW50VGV4dHVyZSA9IHRleEJ1aWxkZXIuY3JlYXRlKCk7CisgICAgICAgIG1Qcm9nRnJhZ21lbnRUZXh0dXJlLmJpbmRTYW1wbGVyKG1MaW5lYXJDbGFtcCwgMCk7CisKKyAgICAgICAgUHJvZ3JhbUZyYWdtZW50LkJ1aWxkZXIgY29sQnVpbGRlciA9IG5ldyBQcm9ncmFtRnJhZ21lbnQuQnVpbGRlcihtUlMpOworICAgICAgICBjb2xCdWlsZGVyLnNldFZhcnlpbmdDb2xvcihmYWxzZSk7CisgICAgICAgIG1Qcm9nRnJhZ21lbnRDb2xvciA9IGNvbEJ1aWxkZXIuY3JlYXRlKCk7CisKKyAgICAgICAgbVNjcmlwdC5zZXRfZ1Byb2dGcmFnbWVudENvbG9yKG1Qcm9nRnJhZ21lbnRDb2xvcik7CisgICAgICAgIG1TY3JpcHQuc2V0X2dQcm9nRnJhZ21lbnRUZXh0dXJlKG1Qcm9nRnJhZ21lbnRUZXh0dXJlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5pdFByb2dyYW1WZXJ0ZXgoKSB7CisgICAgICAgIFByb2dyYW1WZXJ0ZXguQnVpbGRlciBwdmIgPSBuZXcgUHJvZ3JhbVZlcnRleC5CdWlsZGVyKG1SUyk7CisgICAgICAgIG1Qcm9nVmVydGV4ID0gcHZiLmNyZWF0ZSgpOworCisgICAgICAgIG1QVkEgPSBuZXcgUHJvZ3JhbVZlcnRleC5NYXRyaXhBbGxvY2F0aW9uKG1SUyk7CisgICAgICAgIG1Qcm9nVmVydGV4LmJpbmRBbGxvY2F0aW9uKG1QVkEpOworICAgICAgICBtUFZBLnNldHVwT3J0aG9XaW5kb3cobVdpZHRoLCBtSGVpZ2h0KTsKKworICAgICAgICBtU2NyaXB0LnNldF9nUHJvZ1ZlcnRleChtUHJvZ1ZlcnRleCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBBbGxvY2F0aW9uIGxvYWRUZXh0dXJlUkdCKGludCBpZCkgeworICAgICAgICBmaW5hbCBBbGxvY2F0aW9uIGFsbG9jYXRpb24gPSBBbGxvY2F0aW9uLmNyZWF0ZUZyb21CaXRtYXBSZXNvdXJjZShtUlMsIG1SZXMsCisgICAgICAgICAgICAgICAgaWQsIEVsZW1lbnQuUkdCXzU2NShtUlMpLCB0cnVlKTsKKyAgICAgICAgYWxsb2NhdGlvbi51cGxvYWRUb1RleHR1cmUoMCk7CisgICAgICAgIHJldHVybiBhbGxvY2F0aW9uOworICAgIH0KKworICAgIHByaXZhdGUgQWxsb2NhdGlvbiBsb2FkVGV4dHVyZUFSR0IoaW50IGlkKSB7CisgICAgICAgIEJpdG1hcCBiID0gQml0bWFwRmFjdG9yeS5kZWNvZGVSZXNvdXJjZShtUmVzLCBpZCwgbU9wdGlvbnNBUkdCKTsKKyAgICAgICAgZmluYWwgQWxsb2NhdGlvbiBhbGxvY2F0aW9uID0gQWxsb2NhdGlvbi5jcmVhdGVGcm9tQml0bWFwKG1SUywgYiwgRWxlbWVudC5SR0JBXzg4ODgobVJTKSwgdHJ1ZSk7CisgICAgICAgIGFsbG9jYXRpb24udXBsb2FkVG9UZXh0dXJlKDApOworICAgICAgICByZXR1cm4gYWxsb2NhdGlvbjsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgbG9hZEltYWdlcygpIHsKKyAgICAgICAgbVRleFRvcnVzID0gbG9hZFRleHR1cmVSR0IoUi5kcmF3YWJsZS50b3J1c21hcCk7CisgICAgICAgIG1UZXhPcGFxdWUgPSBsb2FkVGV4dHVyZVJHQihSLmRyYXdhYmxlLmRhdGEpOworICAgICAgICBtVGV4VHJhbnNwYXJlbnQgPSBsb2FkVGV4dHVyZUFSR0IoUi5kcmF3YWJsZS5sZWFmKTsKKworICAgICAgICBtU2NyaXB0LnNldF9nVGV4VG9ydXMobVRleFRvcnVzKTsKKyAgICAgICAgbVNjcmlwdC5zZXRfZ1RleE9wYXF1ZShtVGV4T3BhcXVlKTsKKyAgICAgICAgbVNjcmlwdC5zZXRfZ1RleFRyYW5zcGFyZW50KG1UZXhUcmFuc3BhcmVudCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGluaXRGb250cygpIHsKKyAgICAgICAgLy8gU2FucyBmb250IGJ5IGZhbWlseSBuYW1lCisgICAgICAgIG1Gb250U2FucyA9IEZvbnQuY3JlYXRlRnJvbUZhbWlseShtUlMsIG1SZXMsICJzYW5zLXNlcmlmIiwgRm9udC5TdHlsZS5OT1JNQUwsIDgpOworICAgICAgICAvLyBDcmVhdGUgZm9udCBieSBmaWxlIG5hbWUKKyAgICAgICAgbUZvbnRTZXJpZiA9IEZvbnQuY3JlYXRlKG1SUywgbVJlcywgIkRyb2lkU2VyaWYtUmVndWxhci50dGYiLCA4KTsKKyAgICAgICAgLy8gQ3JlYXRlIGZvbnRzIGJ5IGZhbWlseSBhbmQgc3R5bGUKKyAgICAgICAgbUZvbnRTZXJpZkJvbGQgPSBGb250LmNyZWF0ZUZyb21GYW1pbHkobVJTLCBtUmVzLCAic2VyaWYiLCBGb250LlN0eWxlLkJPTEQsIDgpOworICAgICAgICBtRm9udFNlcmlmSXRhbGljID0gRm9udC5jcmVhdGVGcm9tRmFtaWx5KG1SUywgbVJlcywgInNlcmlmIiwgRm9udC5TdHlsZS5JVEFMSUMsIDgpOworICAgICAgICBtRm9udFNlcmlmQm9sZEl0YWxpYyA9IEZvbnQuY3JlYXRlRnJvbUZhbWlseShtUlMsIG1SZXMsICJzZXJpZiIsIEZvbnQuU3R5bGUuQk9MRF9JVEFMSUMsIDgpOworICAgICAgICBtRm9udE1vbm8gPSBGb250LmNyZWF0ZUZyb21GYW1pbHkobVJTLCBtUmVzLCAibW9ubyIsIEZvbnQuU3R5bGUuTk9STUFMLCA4KTsKKworICAgICAgICBtU2NyaXB0LnNldF9nRm9udFNhbnMobUZvbnRTYW5zKTsKKyAgICAgICAgbVNjcmlwdC5zZXRfZ0ZvbnRTZXJpZihtRm9udFNlcmlmKTsKKyAgICAgICAgbVNjcmlwdC5zZXRfZ0ZvbnRTZXJpZkJvbGQobUZvbnRTZXJpZkJvbGQpOworICAgICAgICBtU2NyaXB0LnNldF9nRm9udFNlcmlmSXRhbGljKG1Gb250U2VyaWZJdGFsaWMpOworICAgICAgICBtU2NyaXB0LnNldF9nRm9udFNlcmlmQm9sZEl0YWxpYyhtRm9udFNlcmlmQm9sZEl0YWxpYyk7CisgICAgICAgIG1TY3JpcHQuc2V0X2dGb250TW9ubyhtRm9udE1vbm8pOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbml0TWVzaCgpIHsKKyAgICAgICAgbU1ieU5NZXNoID0gZ2V0TWJ5Tk1lc2goMjU2LCAyNTYsIDEwLCAxMCk7CisgICAgICAgIG1TY3JpcHQuc2V0X2dNYnlOTWVzaChtTWJ5Tk1lc2gpOworCisgICAgICAgIEZpbGVBM0QgbW9kZWwgPSBGaWxlQTNELmNyZWF0ZUZyb21SZXNvdXJjZShtUlMsIG1SZXMsIFIucmF3LnRvcnVzKTsKKyAgICAgICAgRmlsZUEzRC5JbmRleEVudHJ5IGVudHJ5ID0gbW9kZWwuZ2V0SW5kZXhFbnRyeSgwKTsKKyAgICAgICAgaWYoZW50cnkgPT0gbnVsbCB8fCBlbnRyeS5nZXRDbGFzc0lEKCkgIT0gRmlsZUEzRC5DbGFzc0lELk1FU0gpIHsKKyAgICAgICAgICAgIExvZy5lKCJycyIsICJjb3VsZCBub3QgbG9hZCBtb2RlbCIpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgbVRvcnVzID0gKE1lc2gpZW50cnkuZ2V0T2JqZWN0KCk7CisgICAgICAgICAgICBtU2NyaXB0LnNldF9nVG9ydXNNZXNoKG1Ub3J1cyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5pdFNhbXBsZXJzKCkgeworICAgICAgICBTYW1wbGVyLkJ1aWxkZXIgYnMgPSBuZXcgU2FtcGxlci5CdWlsZGVyKG1SUyk7CisgICAgICAgIGJzLnNldE1pbihTYW1wbGVyLlZhbHVlLkxJTkVBUik7CisgICAgICAgIGJzLnNldE1hZyhTYW1wbGVyLlZhbHVlLkxJTkVBUik7CisgICAgICAgIGJzLnNldFdyYXBTKFNhbXBsZXIuVmFsdWUuV1JBUCk7CisgICAgICAgIGJzLnNldFdyYXBUKFNhbXBsZXIuVmFsdWUuV1JBUCk7CisgICAgICAgIG1MaW5lYXJXcmFwID0gYnMuY3JlYXRlKCk7CisKKyAgICAgICAgbUxpbmVhckNsYW1wID0gU2FtcGxlci5DTEFNUF9MSU5FQVIobVJTKTsKKyAgICAgICAgbU5lYXJlc3RDbGFtcCA9IFNhbXBsZXIuQ0xBTVBfTkVBUkVTVChtUlMpOworICAgICAgICBtTWlwTGluZWFyV3JhcCA9IFNhbXBsZXIuV1JBUF9MSU5FQVJfTUlQX0xJTkVBUihtUlMpOworCisgICAgICAgIG1TY3JpcHQuc2V0X2dMaW5lYXJDbGFtcChtTGluZWFyQ2xhbXApOworICAgICAgICBtU2NyaXB0LnNldF9nTGluZWFyV3JhcChtTGluZWFyV3JhcCk7CisgICAgICAgIG1TY3JpcHQuc2V0X2dNaXBMaW5lYXJXcmFwKG1NaXBMaW5lYXJXcmFwKTsKKyAgICAgICAgbVNjcmlwdC5zZXRfZ05lYXJlc3RDbGFtcChtTmVhcmVzdENsYW1wKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5pdFByb2dyYW1SYXN0ZXIoKSB7CisgICAgICAgIG1DdWxsQmFjayA9IFByb2dyYW1SYXN0ZXIuQ1VMTF9CQUNLKG1SUyk7CisgICAgICAgIG1DdWxsRnJvbnQgPSBQcm9ncmFtUmFzdGVyLkNVTExfRlJPTlQobVJTKTsKKworICAgICAgICBtU2NyaXB0LnNldF9nQ3VsbEJhY2sobUN1bGxCYWNrKTsKKyAgICAgICAgbVNjcmlwdC5zZXRfZ0N1bGxGcm9udChtQ3VsbEZyb250KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5pdFJTKCkgeworCisgICAgICAgIG1TY3JpcHQgPSBuZXcgU2NyaXB0Q19Sc3JlbmRlcnN0YXRlcyhtUlMsIG1SZXMsIFIucmF3LnJzcmVuZGVyc3RhdGVzLCB0cnVlKTsKKworICAgICAgICBpbml0U2FtcGxlcnMoKTsKKyAgICAgICAgaW5pdFByb2dyYW1TdG9yZSgpOworICAgICAgICBpbml0UHJvZ3JhbUZyYWdtZW50KCk7CisgICAgICAgIGluaXRQcm9ncmFtVmVydGV4KCk7CisgICAgICAgIGluaXRGb250cygpOworICAgICAgICBsb2FkSW1hZ2VzKCk7CisgICAgICAgIGluaXRNZXNoKCk7CisgICAgICAgIGluaXRQcm9ncmFtUmFzdGVyKCk7CisKKyAgICAgICAgbVJTLmNvbnRleHRCaW5kUm9vdFNjcmlwdChtU2NyaXB0KTsKKyAgICB9Cit9CisKKworCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvU2FtcGxlcy9zcmMvY29tL2FuZHJvaWQvc2FtcGxlcy9Sc1JlbmRlclN0YXRlc1ZpZXcuamF2YSBiL2xpYnMvcnMvamF2YS9TYW1wbGVzL3NyYy9jb20vYW5kcm9pZC9zYW1wbGVzL1JzUmVuZGVyU3RhdGVzVmlldy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1NDhkZTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvU2FtcGxlcy9zcmMvY29tL2FuZHJvaWQvc2FtcGxlcy9Sc1JlbmRlclN0YXRlc1ZpZXcuamF2YQpAQCAtMCwwICsxLDk0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5zYW1wbGVzOworCitpbXBvcnQgamF2YS5pby5Xcml0ZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5TZW1hcGhvcmU7CisKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5SU1N1cmZhY2VWaWV3OworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0LlJlbmRlclNjcmlwdDsKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5SZW5kZXJTY3JpcHRHTDsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuQml0bWFwRHJhd2FibGU7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOworaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuU3VyZmFjZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuU3VyZmFjZUhvbGRlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuU3VyZmFjZVZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OworaW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudDsKKworcHVibGljIGNsYXNzIFJzUmVuZGVyU3RhdGVzVmlldyBleHRlbmRzIFJTU3VyZmFjZVZpZXcgeworCisgICAgcHVibGljIFJzUmVuZGVyU3RhdGVzVmlldyhDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCk7CisgICAgICAgIC8vc2V0Rm9jdXNhYmxlKHRydWUpOworICAgIH0KKworICAgIHByaXZhdGUgUmVuZGVyU2NyaXB0R0wgbVJTOworICAgIHByaXZhdGUgUnNSZW5kZXJTdGF0ZXNSUyBtUmVuZGVyOworCisKKyAgICBwdWJsaWMgdm9pZCBzdXJmYWNlQ2hhbmdlZChTdXJmYWNlSG9sZGVyIGhvbGRlciwgaW50IGZvcm1hdCwgaW50IHcsIGludCBoKSB7CisgICAgICAgIHN1cGVyLnN1cmZhY2VDaGFuZ2VkKGhvbGRlciwgZm9ybWF0LCB3LCBoKTsKKyAgICAgICAgaWYgKG1SUyA9PSBudWxsKSB7CisgICAgICAgICAgICBtUlMgPSBjcmVhdGVSZW5kZXJTY3JpcHQodHJ1ZSk7CisgICAgICAgICAgICBtUlMuY29udGV4dFNldFN1cmZhY2UodywgaCwgaG9sZGVyLmdldFN1cmZhY2UoKSk7CisgICAgICAgICAgICBtUmVuZGVyID0gbmV3IFJzUmVuZGVyU3RhdGVzUlMoKTsKKyAgICAgICAgICAgIG1SZW5kZXIuaW5pdChtUlMsIGdldFJlc291cmNlcygpLCB3LCBoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uRGV0YWNoZWRGcm9tV2luZG93KCkgeworICAgICAgICBpZihtUlMgIT0gbnVsbCkgeworICAgICAgICAgICAgbVJTID0gbnVsbDsKKyAgICAgICAgICAgIGRlc3Ryb3lSZW5kZXJTY3JpcHQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIG9uS2V5RG93bihpbnQga2V5Q29kZSwgS2V5RXZlbnQgZXZlbnQpCisgICAgeworICAgICAgICAvLyBicmVhayBwb2ludCBhdCBoZXJlCisgICAgICAgIC8vIHRoaXMgbWV0aG9kIGRvZXNuJ3Qgd29yayB3aGVuICdleHRlbmRzIFZpZXcnIGluY2x1ZGUgJ2V4dGVuZHMgU2Nyb2xsVmlldycuCisgICAgICAgIHJldHVybiBzdXBlci5vbktleURvd24oa2V5Q29kZSwgZXZlbnQpOworICAgIH0KKworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25Ub3VjaEV2ZW50KE1vdGlvbkV2ZW50IGV2KQorICAgIHsKKyAgICAgICAgYm9vbGVhbiByZXQgPSBmYWxzZTsKKyAgICAgICAgaW50IGFjdCA9IGV2LmdldEFjdGlvbigpOworICAgICAgICBpZiAoYWN0ID09IGV2LkFDVElPTl9ET1dOKSB7CisgICAgICAgICAgICBtUmVuZGVyLm9uQWN0aW9uRG93bigoaW50KWV2LmdldFgoKSwgKGludClldi5nZXRZKCkpOworICAgICAgICAgICAgcmV0ID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorfQorCisKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9TYW1wbGVzL3NyYy9jb20vYW5kcm9pZC9zYW1wbGVzL3JzbGlzdC5ycyBiL2xpYnMvcnMvamF2YS9TYW1wbGVzL3NyYy9jb20vYW5kcm9pZC9zYW1wbGVzL3JzbGlzdC5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzNmNDYzCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9qYXZhL1NhbXBsZXMvc3JjL2NvbS9hbmRyb2lkL3NhbXBsZXMvcnNsaXN0LnJzCkBAIC0wLDAgKzEsNzMgQEAKKy8vIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjcHJhZ21hIHZlcnNpb24oMSkKKworI3ByYWdtYSBycyBqYXZhX3BhY2thZ2VfbmFtZShjb20uYW5kcm9pZC5zYW1wbGVzKQorCisjaW5jbHVkZSAicnNfZ3JhcGhpY3MucnNoIgorCitmbG9hdCBnRFk7CisKK3JzX2ZvbnQgZ0l0YWxpYzsKKwordHlwZWRlZiBzdHJ1Y3QgTGlzdEFsbG9jc19zIHsKKyAgICByc19hbGxvY2F0aW9uIHRleHQ7Cit9IExpc3RBbGxvY3M7CisKK0xpc3RBbGxvY3MgKmdMaXN0OworCisjcHJhZ21hIHJzIGV4cG9ydF92YXIoZ0RZLCBnSXRhbGljLCBnTGlzdCkKKwordm9pZCBpbml0KCkgeworICAgIGdEWSA9IDAuMGY7Cit9CisKK2ludCB0ZXh0UG9zID0gMDsKKworaW50IHJvb3QoaW50IGxhdW5jaElEKSB7CisKKyAgICByc2dDbGVhckNvbG9yKDAuMGYsIDAuMGYsIDAuMGYsIDAuMGYpOworICAgIHJzZ0NsZWFyRGVwdGgoMS4wZik7CisKKyAgICB0ZXh0UG9zIC09IChpbnQpZ0RZKjI7CisgICAgZ0RZICo9IDAuOTU7CisKKyAgICByc2dGb250Q29sb3IoMC45ZiwgMC45ZiwgMC45ZiwgMS4wZik7CisgICAgcnNnQmluZEZvbnQoZ0l0YWxpYyk7CisgICAgY29sb3IoMC4yLCAwLjIsIDAuMiwgMCk7CisKKyAgICByc19hbGxvY2F0aW9uIGxpc3RBbGxvYyA9IHJzR2V0QWxsb2NhdGlvbihnTGlzdCk7CisgICAgaW50IGFsbG9jU2l6ZSA9IHJzQWxsb2NhdGlvbkdldERpbVgobGlzdEFsbG9jKTsKKworICAgIGludCB3aWR0aCA9IHJzZ0dldFdpZHRoKCk7CisgICAgaW50IGhlaWdodCA9IHJzZ0dldEhlaWdodCgpOworCisgICAgaW50IGl0ZW1IZWlnaHQgPSA4MDsKKyAgICBpbnQgY3VycmVudFlQb3MgPSBpdGVtSGVpZ2h0ICsgdGV4dFBvczsKKworICAgIGZvcihpbnQgaSA9IDA7IGkgPCBhbGxvY1NpemU7IGkgKyspIHsKKyAgICAgICAgaWYoY3VycmVudFlQb3MgLSBpdGVtSGVpZ2h0ID4gaGVpZ2h0KSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmKGN1cnJlbnRZUG9zID4gMCkgeworICAgICAgICAgICAgcnNnRHJhd1JlY3QoMCwgY3VycmVudFlQb3MgLSAxLCB3aWR0aCwgY3VycmVudFlQb3MsIDApOworICAgICAgICAgICAgcnNnRHJhd1RleHQoZ0xpc3RbaV0udGV4dCwgMzAsIGN1cnJlbnRZUG9zIC0gMzIpOworICAgICAgICB9CisgICAgICAgIGN1cnJlbnRZUG9zICs9IGl0ZW1IZWlnaHQ7CisgICAgfQorCisgICAgcmV0dXJuIDEwOworfQpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL1NhbXBsZXMvc3JjL2NvbS9hbmRyb2lkL3NhbXBsZXMvcnNyZW5kZXJzdGF0ZXMucnMgYi9saWJzL3JzL2phdmEvU2FtcGxlcy9zcmMvY29tL2FuZHJvaWQvc2FtcGxlcy9yc3JlbmRlcnN0YXRlcy5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OGQ5ZDNjCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9qYXZhL1NhbXBsZXMvc3JjL2NvbS9hbmRyb2lkL3NhbXBsZXMvcnNyZW5kZXJzdGF0ZXMucnMKQEAgLTAsMCArMSwzNDUgQEAKKy8vIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjcHJhZ21hIHZlcnNpb24oMSkKKworI3ByYWdtYSBycyBqYXZhX3BhY2thZ2VfbmFtZShjb20uYW5kcm9pZC5zYW1wbGVzKQorCisjaW5jbHVkZSAicnNfZ3JhcGhpY3MucnNoIgorCityc19wcm9ncmFtX3ZlcnRleCBnUHJvZ1ZlcnRleDsKK3JzX3Byb2dyYW1fZnJhZ21lbnQgZ1Byb2dGcmFnbWVudENvbG9yOworcnNfcHJvZ3JhbV9mcmFnbWVudCBnUHJvZ0ZyYWdtZW50VGV4dHVyZTsKKworcnNfcHJvZ3JhbV9zdG9yZSBnUHJvZ1N0b3JlQmxlbmROb25lRGVwdGg7Cityc19wcm9ncmFtX3N0b3JlIGdQcm9nU3RvcmVCbGVuZE5vbmU7Cityc19wcm9ncmFtX3N0b3JlIGdQcm9nU3RvcmVCbGVuZEFscGhhOworcnNfcHJvZ3JhbV9zdG9yZSBnUHJvZ1N0b3JlQmxlbmRBZGQ7CisKK3JzX2FsbG9jYXRpb24gZ1RleE9wYXF1ZTsKK3JzX2FsbG9jYXRpb24gZ1RleFRvcnVzOworcnNfYWxsb2NhdGlvbiBnVGV4VHJhbnNwYXJlbnQ7CisKK3JzX21lc2ggZ01ieU5NZXNoOworcnNfbWVzaCBnVG9ydXNNZXNoOworCityc19mb250IGdGb250U2FuczsKK3JzX2ZvbnQgZ0ZvbnRTZXJpZjsKK3JzX2ZvbnQgZ0ZvbnRTZXJpZkJvbGQ7Cityc19mb250IGdGb250U2VyaWZJdGFsaWM7Cityc19mb250IGdGb250U2VyaWZCb2xkSXRhbGljOworcnNfZm9udCBnRm9udE1vbm87CisKK2ludCBnRGlzcGxheU1vZGU7CisKK3JzX3NhbXBsZXIgZ0xpbmVhckNsYW1wOworcnNfc2FtcGxlciBnTGluZWFyV3JhcDsKK3JzX3NhbXBsZXIgZ01pcExpbmVhcldyYXA7Cityc19zYW1wbGVyIGdOZWFyZXN0Q2xhbXA7CisKK3JzX3Byb2dyYW1fcmFzdGVyIGdDdWxsQmFjazsKK3JzX3Byb2dyYW1fcmFzdGVyIGdDdWxsRnJvbnQ7CisKKyNwcmFnbWEgcnMgZXhwb3J0X3ZhcihnUHJvZ1ZlcnRleCwgZ1Byb2dGcmFnbWVudENvbG9yLCBnUHJvZ0ZyYWdtZW50VGV4dHVyZSkKKyNwcmFnbWEgcnMgZXhwb3J0X3ZhcihnUHJvZ1N0b3JlQmxlbmROb25lRGVwdGgsIGdQcm9nU3RvcmVCbGVuZE5vbmUsIGdQcm9nU3RvcmVCbGVuZEFscGhhLCBnUHJvZ1N0b3JlQmxlbmRBZGQpCisjcHJhZ21hIHJzIGV4cG9ydF92YXIoZ1RleE9wYXF1ZSwgZ1RleFRvcnVzLCBnVGV4VHJhbnNwYXJlbnQpCisjcHJhZ21hIHJzIGV4cG9ydF92YXIoZ01ieU5NZXNoLCBnVG9ydXNNZXNoKQorI3ByYWdtYSBycyBleHBvcnRfdmFyKGdGb250U2FucywgZ0ZvbnRTZXJpZiwgZ0ZvbnRTZXJpZkJvbGQsIGdGb250U2VyaWZJdGFsaWMsIGdGb250U2VyaWZCb2xkSXRhbGljLCBnRm9udE1vbm8pCisjcHJhZ21hIHJzIGV4cG9ydF92YXIoZ0xpbmVhckNsYW1wLCBnTGluZWFyV3JhcCwgZ01pcExpbmVhcldyYXAsIGdOZWFyZXN0Q2xhbXApCisjcHJhZ21hIHJzIGV4cG9ydF92YXIoZ0N1bGxCYWNrLCBnQ3VsbEZyb250KQorCisvL1doYXQgd2UgYXJlIHNob3dpbmcKKyNwcmFnbWEgcnMgZXhwb3J0X3ZhcihnRGlzcGxheU1vZGUpCisKK3ZvaWQgaW5pdCgpIHsKK30KKwordm9pZCBkaXNwbGF5Rm9udFNhbXBsZXMoKSB7CisgICAgcnNnRm9udENvbG9yKDEuMGYsIDEuMGYsIDEuMGYsIDEuMGYpOworICAgIGludCB5UG9zID0gMzA7CisgICAgcnNnQmluZEZvbnQoZ0ZvbnRTYW5zKTsKKyAgICByc2dEcmF3VGV4dCgiU2FucyBmb250IHNhbXBsZSIsIDMwLCB5UG9zKTsKKyAgICB5UG9zICs9IDMwOworICAgIHJzZ0ZvbnRDb2xvcigwLjVmLCAwLjlmLCAwLjVmLCAxLjBmKTsKKyAgICByc2dCaW5kRm9udChnRm9udFNlcmlmKTsKKyAgICByc2dEcmF3VGV4dCgiU2VyaWYgZm9udCBzYW1wbGUiLCAzMCwgeVBvcyk7CisgICAgeVBvcyArPSAzMDsKKyAgICByc2dGb250Q29sb3IoMC43ZiwgMC43ZiwgMC43ZiwgMS4wZik7CisgICAgcnNnQmluZEZvbnQoZ0ZvbnRTZXJpZkJvbGQpOworICAgIHJzZ0RyYXdUZXh0KCJTZXJpZiBCb2xkIGZvbnQgc2FtcGxlIiwgMzAsIHlQb3MpOworICAgIHlQb3MgKz0gMzA7CisgICAgcnNnRm9udENvbG9yKDAuNWYsIDAuNWYsIDAuOWYsIDEuMGYpOworICAgIHJzZ0JpbmRGb250KGdGb250U2VyaWZJdGFsaWMpOworICAgIHJzZ0RyYXdUZXh0KCJTZXJpZiBJdGFsaWMgZm9udCBzYW1wbGUiLCAzMCwgeVBvcyk7CisgICAgeVBvcyArPSAzMDsKKyAgICByc2dGb250Q29sb3IoMS4wZiwgMS4wZiwgMS4wZiwgMS4wZik7CisgICAgcnNnQmluZEZvbnQoZ0ZvbnRTZXJpZkJvbGRJdGFsaWMpOworICAgIHJzZ0RyYXdUZXh0KCJTZXJpZiBCb2xkIEl0YWxpYyBmb250IHNhbXBsZSIsIDMwLCB5UG9zKTsKKyAgICB5UG9zICs9IDMwOworICAgIHJzZ0JpbmRGb250KGdGb250TW9ubyk7CisgICAgcnNnRHJhd1RleHQoIk1vbm9zcGFjZSBmb250IHNhbXBsZSIsIDMwLCB5UG9zKTsKK30KKwordm9pZCBiaW5kUHJvZ3JhbVZlcnRleE9ydGhvKCkgeworICAgIC8vIERlZmF1bHQgdmVydGV4IHNhaGRlcgorICAgIHJzZ0JpbmRQcm9ncmFtVmVydGV4KGdQcm9nVmVydGV4KTsKKyAgICAvLyBTZXR1cCB0aGUgcHJvamVjdGlvbmkgbWF0cml4CisgICAgcnNfbWF0cml4NHg0IHByb2o7CisgICAgcnNNYXRyaXhMb2FkT3J0aG8oJnByb2osIDAsIHJzZ0dldFdpZHRoKCksIHJzZ0dldEhlaWdodCgpLCAwLCAtMSwxKTsKKyAgICByc2dQcm9ncmFtVmVydGV4TG9hZFByb2plY3Rpb25NYXRyaXgoJnByb2opOworfQorCit2b2lkIGRpc3BsYXlTaGFkZXJTYW1wbGVzKCkgeworICAgIGJpbmRQcm9ncmFtVmVydGV4T3J0aG8oKTsKKyAgICByc19tYXRyaXg0eDQgbWF0cml4OworICAgIHJzTWF0cml4TG9hZElkZW50aXR5KCZtYXRyaXgpOworICAgIHJzZ1Byb2dyYW1WZXJ0ZXhMb2FkTW9kZWxNYXRyaXgoJm1hdHJpeCk7CisKKyAgICAvLyBGcmFnbWVudCBzaGFkZXIgd2l0aCB0ZXh0dXJlCisgICAgcnNnQmluZFByb2dyYW1TdG9yZShnUHJvZ1N0b3JlQmxlbmROb25lKTsKKyAgICByc2dCaW5kUHJvZ3JhbUZyYWdtZW50KGdQcm9nRnJhZ21lbnRUZXh0dXJlKTsKKyAgICByc2dCaW5kU2FtcGxlcihnUHJvZ0ZyYWdtZW50VGV4dHVyZSwgMCwgZ0xpbmVhckNsYW1wKTsKKyAgICByc2dCaW5kVGV4dHVyZShnUHJvZ0ZyYWdtZW50VGV4dHVyZSwgMCwgZ1RleE9wYXF1ZSk7CisKKyAgICBmbG9hdCBzdGFydFggPSAwLCBzdGFydFkgPSAwOworICAgIGZsb2F0IHdpZHRoID0gMjU2LCBoZWlnaHQgPSAyNTY7CisgICAgcnNnRHJhd1F1YWRUZXhDb29yZHMoc3RhcnRYLCBzdGFydFksIDAsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRYLCBzdGFydFkgKyBoZWlnaHQsIDAsIDAsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRYICsgd2lkdGgsIHN0YXJ0WSArIGhlaWdodCwgMCwgMSwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFggKyB3aWR0aCwgc3RhcnRZLCAwLCAxLCAwKTsKKworICAgIHN0YXJ0WCA9IDIwMDsgc3RhcnRZID0gMDsKKyAgICB3aWR0aCA9IDEyODsgaGVpZ2h0ID0gMTI4OworICAgIHJzZ0RyYXdRdWFkVGV4Q29vcmRzKHN0YXJ0WCwgc3RhcnRZLCAwLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0WCwgc3RhcnRZICsgaGVpZ2h0LCAwLCAwLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0WCArIHdpZHRoLCBzdGFydFkgKyBoZWlnaHQsIDAsIDEsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRYICsgd2lkdGgsIHN0YXJ0WSwgMCwgMSwgMCk7CisKKyAgICByc2dCaW5kUHJvZ3JhbVN0b3JlKGdQcm9nU3RvcmVCbGVuZEFscGhhKTsKKyAgICByc2dCaW5kVGV4dHVyZShnUHJvZ0ZyYWdtZW50VGV4dHVyZSwgMCwgZ1RleFRyYW5zcGFyZW50KTsKKyAgICBzdGFydFggPSAwOyBzdGFydFkgPSAyMDA7CisgICAgd2lkdGggPSAxMjg7IGhlaWdodCA9IDEyODsKKyAgICByc2dEcmF3UXVhZFRleENvb3JkcyhzdGFydFgsIHN0YXJ0WSwgMCwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFgsIHN0YXJ0WSArIGhlaWdodCwgMCwgMCwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFggKyB3aWR0aCwgc3RhcnRZICsgaGVpZ2h0LCAwLCAxLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0WCArIHdpZHRoLCBzdGFydFksIDAsIDEsIDApOworCisgICAgLy8gRnJhZ21lbnQgcHJvZ3JhbSB3aXRoIHNpbXBsZSBjb2xvcgorICAgIHJzZ0JpbmRQcm9ncmFtRnJhZ21lbnQoZ1Byb2dGcmFnbWVudENvbG9yKTsKKyAgICByc2dQcm9ncmFtRnJhZ21lbnRDb25zdGFudENvbG9yKGdQcm9nRnJhZ21lbnRDb2xvciwgMC45LCAwLjMsIDAuMywgMSk7CisgICAgcnNnRHJhd1JlY3QoMjAwLCAzMDAsIDM1MCwgNDUwLCAwKTsKKyAgICByc2dQcm9ncmFtRnJhZ21lbnRDb25zdGFudENvbG9yKGdQcm9nRnJhZ21lbnRDb2xvciwgMC4zLCAwLjksIDAuMywgMSk7CisgICAgcnNnRHJhd1JlY3QoNTAsIDQwMCwgNDAwLCA2MDAsIDApOworCisgICAgcnNnRm9udENvbG9yKDEuMGYsIDEuMGYsIDEuMGYsIDEuMGYpOworICAgIHJzZ0JpbmRGb250KGdGb250TW9ubyk7CisgICAgcnNnRHJhd1RleHQoIlRleHR1cmUgc2hhZGVyIiwgMTAsIDUwKTsKKyAgICByc2dEcmF3VGV4dCgiQWxwaGEtYmxlbmRlZCB0ZXh0dXJlIHNoYWRlciIsIDEwLCAyODApOworICAgIHJzZ0RyYXdUZXh0KCJGbGF0IGNvbG9yIHNoYWRlciIsIDEwMCwgNDUwKTsKK30KKwordm9pZCBkaXNwbGF5QmxlbmRpbmdTYW1wbGVzKCkgeworICAgIGludCBpOworCisgICAgYmluZFByb2dyYW1WZXJ0ZXhPcnRobygpOworICAgIHJzX21hdHJpeDR4NCBtYXRyaXg7CisgICAgcnNNYXRyaXhMb2FkSWRlbnRpdHkoJm1hdHJpeCk7CisgICAgcnNnUHJvZ3JhbVZlcnRleExvYWRNb2RlbE1hdHJpeCgmbWF0cml4KTsKKworICAgIHJzZ0JpbmRQcm9ncmFtRnJhZ21lbnQoZ1Byb2dGcmFnbWVudENvbG9yKTsKKworICAgIHJzZ0JpbmRQcm9ncmFtU3RvcmUoZ1Byb2dTdG9yZUJsZW5kTm9uZSk7CisgICAgZm9yKGkgPSAwOyBpIDwgMzsgaSArKykgeworICAgICAgICBmbG9hdCBpUGx1c09uZSA9IChmbG9hdCkoaSArIDEpOworICAgICAgICByc2dQcm9ncmFtRnJhZ21lbnRDb25zdGFudENvbG9yKGdQcm9nRnJhZ21lbnRDb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjFmKmlQbHVzT25lLCAwLjJmKmlQbHVzT25lLCAwLjNmKmlQbHVzT25lLCAxKTsKKyAgICAgICAgZmxvYXQgeVBvcyA9IDE1MCAqIChmbG9hdClpOworICAgICAgICByc2dEcmF3UmVjdCgwLCB5UG9zLCAyMDAsIHlQb3MgKyAyMDAsIDApOworICAgIH0KKworICAgIHJzZ0JpbmRQcm9ncmFtU3RvcmUoZ1Byb2dTdG9yZUJsZW5kQWxwaGEpOworICAgIGZvcihpID0gMDsgaSA8IDM7IGkgKyspIHsKKyAgICAgICAgZmxvYXQgaVBsdXNPbmUgPSAoZmxvYXQpKGkgKyAxKTsKKyAgICAgICAgcnNnUHJvZ3JhbUZyYWdtZW50Q29uc3RhbnRDb2xvcihnUHJvZ0ZyYWdtZW50Q29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yZippUGx1c09uZSwgMC4zZippUGx1c09uZSwgMC4xZippUGx1c09uZSwgMC41KTsKKyAgICAgICAgZmxvYXQgeVBvcyA9IDE1MCAqIChmbG9hdClpOworICAgICAgICByc2dEcmF3UmVjdCgxNTAsIHlQb3MsIDM1MCwgeVBvcyArIDIwMCwgMCk7CisgICAgfQorCisgICAgcnNnQmluZFByb2dyYW1TdG9yZShnUHJvZ1N0b3JlQmxlbmRBZGQpOworICAgIGZvcihpID0gMDsgaSA8IDM7IGkgKyspIHsKKyAgICAgICAgZmxvYXQgaVBsdXNPbmUgPSAoZmxvYXQpKGkgKyAxKTsKKyAgICAgICAgcnNnUHJvZ3JhbUZyYWdtZW50Q29uc3RhbnRDb2xvcihnUHJvZ0ZyYWdtZW50Q29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zZippUGx1c09uZSwgMC4xZippUGx1c09uZSwgMC4yZippUGx1c09uZSwgMC41KTsKKyAgICAgICAgZmxvYXQgeVBvcyA9IDE1MCAqIChmbG9hdClpOworICAgICAgICByc2dEcmF3UmVjdCgzMDAsIHlQb3MsIDUwMCwgeVBvcyArIDIwMCwgMCk7CisgICAgfQorCisKKyAgICByc2dGb250Q29sb3IoMS4wZiwgMS4wZiwgMS4wZiwgMS4wZik7CisgICAgcnNnQmluZEZvbnQoZ0ZvbnRNb25vKTsKKyAgICByc2dEcmF3VGV4dCgiTm8gQmxlbmRpbmciLCAxMCwgNTApOworICAgIHJzZ0RyYXdUZXh0KCJBbHBoYSBCbGVuZGluZyIsIDE2MCwgMTUwKTsKKyAgICByc2dEcmF3VGV4dCgiQWRkaXRpdmUgQmxlbmRpbmciLCAzMjAsIDI1MCk7CisKK30KKwordm9pZCBkaXNwbGF5TWVzaFNhbXBsZXMoKSB7CisKKyAgICBiaW5kUHJvZ3JhbVZlcnRleE9ydGhvKCk7CisgICAgcnNfbWF0cml4NHg0IG1hdHJpeDsKKyAgICByc01hdHJpeExvYWRUcmFuc2xhdGUoJm1hdHJpeCwgMTI4LCAxMjgsIDApOworICAgIHJzZ1Byb2dyYW1WZXJ0ZXhMb2FkTW9kZWxNYXRyaXgoJm1hdHJpeCk7CisKKyAgICAvLyBGcmFnbWVudCBzaGFkZXIgd2l0aCB0ZXh0dXJlCisgICAgcnNnQmluZFByb2dyYW1TdG9yZShnUHJvZ1N0b3JlQmxlbmROb25lKTsKKyAgICByc2dCaW5kUHJvZ3JhbUZyYWdtZW50KGdQcm9nRnJhZ21lbnRUZXh0dXJlKTsKKyAgICByc2dCaW5kU2FtcGxlcihnUHJvZ0ZyYWdtZW50VGV4dHVyZSwgMCwgZ0xpbmVhckNsYW1wKTsKKyAgICByc2dCaW5kVGV4dHVyZShnUHJvZ0ZyYWdtZW50VGV4dHVyZSwgMCwgZ1RleE9wYXF1ZSk7CisKKyAgICByc2dEcmF3TWVzaChnTWJ5Tk1lc2gpOworCisgICAgcnNnRm9udENvbG9yKDEuMGYsIDEuMGYsIDEuMGYsIDEuMGYpOworICAgIHJzZ0JpbmRGb250KGdGb250TW9ubyk7CisgICAgcnNnRHJhd1RleHQoIlVzZXIgZ2VuIDEwIGJ5IDEwIGdyaWQgbWVzaCIsIDEwLCAyNTApOworfQorCit2b2lkIGRpc3BsYXlUZXh0dXJlU2FtcGxlcnMoKSB7CisKKyAgICBiaW5kUHJvZ3JhbVZlcnRleE9ydGhvKCk7CisgICAgcnNfbWF0cml4NHg0IG1hdHJpeDsKKyAgICByc01hdHJpeExvYWRJZGVudGl0eSgmbWF0cml4KTsKKyAgICByc2dQcm9ncmFtVmVydGV4TG9hZE1vZGVsTWF0cml4KCZtYXRyaXgpOworCisgICAgLy8gRnJhZ21lbnQgc2hhZGVyIHdpdGggdGV4dHVyZQorICAgIHJzZ0JpbmRQcm9ncmFtU3RvcmUoZ1Byb2dTdG9yZUJsZW5kTm9uZSk7CisgICAgcnNnQmluZFByb2dyYW1GcmFnbWVudChnUHJvZ0ZyYWdtZW50VGV4dHVyZSk7CisgICAgcnNnQmluZFRleHR1cmUoZ1Byb2dGcmFnbWVudFRleHR1cmUsIDAsIGdUZXhPcGFxdWUpOworCisgICAgLy8gTGluZWFyIGNsYW1wCisgICAgcnNnQmluZFNhbXBsZXIoZ1Byb2dGcmFnbWVudFRleHR1cmUsIDAsIGdMaW5lYXJDbGFtcCk7CisgICAgZmxvYXQgc3RhcnRYID0gMCwgc3RhcnRZID0gMDsKKyAgICBmbG9hdCB3aWR0aCA9IDMwMCwgaGVpZ2h0ID0gMzAwOworICAgIHJzZ0RyYXdRdWFkVGV4Q29vcmRzKHN0YXJ0WCwgc3RhcnRZLCAwLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0WCwgc3RhcnRZICsgaGVpZ2h0LCAwLCAwLCAxLjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRYICsgd2lkdGgsIHN0YXJ0WSArIGhlaWdodCwgMCwgMS4xLCAxLjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRYICsgd2lkdGgsIHN0YXJ0WSwgMCwgMS4xLCAwKTsKKworICAgIC8vIExpbmVhciBXcmFwCisgICAgcnNnQmluZFNhbXBsZXIoZ1Byb2dGcmFnbWVudFRleHR1cmUsIDAsIGdMaW5lYXJXcmFwKTsKKyAgICBzdGFydFggPSAwOyBzdGFydFkgPSAzMDA7CisgICAgd2lkdGggPSAzMDA7IGhlaWdodCA9IDMwMDsKKyAgICByc2dEcmF3UXVhZFRleENvb3JkcyhzdGFydFgsIHN0YXJ0WSwgMCwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFgsIHN0YXJ0WSArIGhlaWdodCwgMCwgMCwgMS4xLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0WCArIHdpZHRoLCBzdGFydFkgKyBoZWlnaHQsIDAsIDEuMSwgMS4xLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0WCArIHdpZHRoLCBzdGFydFksIDAsIDEuMSwgMCk7CisKKyAgICAvLyBOZWFyZXN0CisgICAgcnNnQmluZFNhbXBsZXIoZ1Byb2dGcmFnbWVudFRleHR1cmUsIDAsIGdOZWFyZXN0Q2xhbXApOworICAgIHN0YXJ0WCA9IDMwMDsgc3RhcnRZID0gMDsKKyAgICB3aWR0aCA9IDMwMDsgaGVpZ2h0ID0gMzAwOworICAgIHJzZ0RyYXdRdWFkVGV4Q29vcmRzKHN0YXJ0WCwgc3RhcnRZLCAwLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0WCwgc3RhcnRZICsgaGVpZ2h0LCAwLCAwLCAxLjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRYICsgd2lkdGgsIHN0YXJ0WSArIGhlaWdodCwgMCwgMS4xLCAxLjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRYICsgd2lkdGgsIHN0YXJ0WSwgMCwgMS4xLCAwKTsKKworICAgIHJzZ0JpbmRTYW1wbGVyKGdQcm9nRnJhZ21lbnRUZXh0dXJlLCAwLCBnTWlwTGluZWFyV3JhcCk7CisgICAgc3RhcnRYID0gMzAwOyBzdGFydFkgPSAzMDA7CisgICAgd2lkdGggPSAzMDA7IGhlaWdodCA9IDMwMDsKKyAgICByc2dEcmF3UXVhZFRleENvb3JkcyhzdGFydFgsIHN0YXJ0WSwgMCwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFgsIHN0YXJ0WSArIGhlaWdodCwgMCwgMCwgMS41LAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0WCArIHdpZHRoLCBzdGFydFkgKyBoZWlnaHQsIDAsIDEuNSwgMS41LAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0WCArIHdpZHRoLCBzdGFydFksIDAsIDEuNSwgMCk7CisKKworICAgIHJzZ0ZvbnRDb2xvcigxLjBmLCAxLjBmLCAxLjBmLCAxLjBmKTsKKyAgICByc2dCaW5kRm9udChnRm9udE1vbm8pOworICAgIHJzZ0RyYXdUZXh0KCJGaWx0ZXJpbmc6IGxpbmVhciBjbGFtcCIsIDEwLCAyOTApOworICAgIHJzZ0RyYXdUZXh0KCJGaWx0ZXJpbmc6IGxpbmVhciB3cmFwIiwgMTAsIDU5MCk7CisgICAgcnNnRHJhd1RleHQoIkZpbHRlcmluZzogbmVhcmVzdCBjbGFtcCIsIDMxMCwgMjkwKTsKKyAgICByc2dEcmF3VGV4dCgiRmlsdGVyaW5nOiBtaXBsaW5lYXIgd3JhcCIsIDMxMCwgNTkwKTsKKworfQorCitmbG9hdCBnVG9ydXNSb3RhdGlvbiA9IDA7CisKK3ZvaWQgZGlzcGxheUN1bGxpbmdTYW1wbGVycygpIHsKKyAgICByc2dCaW5kUHJvZ3JhbVZlcnRleChnUHJvZ1ZlcnRleCk7CisgICAgLy8gU2V0dXAgdGhlIHByb2plY3Rpb25pIG1hdHJpeCB3aXRoIDYwIGRlZ3JlZSBmaWVsZCBvZiB2aWV3CisgICAgcnNfbWF0cml4NHg0IHByb2o7CisgICAgZmxvYXQgYXNwZWN0ID0gKGZsb2F0KXJzZ0dldFdpZHRoKCkgLyAoZmxvYXQpcnNnR2V0SGVpZ2h0KCk7CisgICAgcnNNYXRyaXhMb2FkUGVyc3BlY3RpdmUoJnByb2osIDMwLjBmLCBhc3BlY3QsIDAuMWYsIDEwMC4wZik7CisgICAgcnNnUHJvZ3JhbVZlcnRleExvYWRQcm9qZWN0aW9uTWF0cml4KCZwcm9qKTsKKworICAgIC8vIEZyYWdtZW50IHNoYWRlciB3aXRoIHRleHR1cmUKKyAgICByc2dCaW5kUHJvZ3JhbVN0b3JlKGdQcm9nU3RvcmVCbGVuZE5vbmVEZXB0aCk7CisgICAgcnNnQmluZFByb2dyYW1GcmFnbWVudChnUHJvZ0ZyYWdtZW50VGV4dHVyZSk7CisgICAgcnNnQmluZFNhbXBsZXIoZ1Byb2dGcmFnbWVudFRleHR1cmUsIDAsIGdMaW5lYXJDbGFtcCk7CisgICAgcnNnQmluZFRleHR1cmUoZ1Byb2dGcmFnbWVudFRleHR1cmUsIDAsIGdUZXhUb3J1cyk7CisKKyAgICAvLyBBcGxseSBhIHJvdGF0aW9uIHRvIG91ciBtZXNoCisgICAgZ1RvcnVzUm90YXRpb24gKz0gNTAuMGYgKiByc0dldER0KCk7CisgICAgaWYoZ1RvcnVzUm90YXRpb24gPiAzNjAuMGYpIHsKKyAgICAgICAgZ1RvcnVzUm90YXRpb24gLT0gMzYwLjBmOworICAgIH0KKworICAgIHJzX21hdHJpeDR4NCBtYXRyaXg7CisgICAgLy8gUG9zaXRpb24gb3VyIG1vZGVsIG9uIHRoZSBzY3JlZW4KKyAgICByc01hdHJpeExvYWRUcmFuc2xhdGUoJm1hdHJpeCwgLTIuMGYsIDAuMGYsIC0xMC4wZik7CisgICAgcnNNYXRyaXhSb3RhdGUoJm1hdHJpeCwgZ1RvcnVzUm90YXRpb24sIDEuMGYsIDAuMGYsIDAuMGYpOworICAgIHJzZ1Byb2dyYW1WZXJ0ZXhMb2FkTW9kZWxNYXRyaXgoJm1hdHJpeCk7CisgICAgLy8gVXNlIGZyb250IGZhY2UgY3VsbGluZworICAgIHJzZ0JpbmRQcm9ncmFtUmFzdGVyKGdDdWxsRnJvbnQpOworICAgIHJzZ0RyYXdNZXNoKGdUb3J1c01lc2gpOworCisgICAgcnNNYXRyaXhMb2FkVHJhbnNsYXRlKCZtYXRyaXgsIDIuMGYsIDAuMGYsIC0xMC4wZik7CisgICAgcnNNYXRyaXhSb3RhdGUoJm1hdHJpeCwgZ1RvcnVzUm90YXRpb24sIDEuMGYsIDAuMGYsIDAuMGYpOworICAgIHJzZ1Byb2dyYW1WZXJ0ZXhMb2FkTW9kZWxNYXRyaXgoJm1hdHJpeCk7CisgICAgLy8gVXNlIGJhY2sgZmFjZSBjdWxsaW5nCisgICAgcnNnQmluZFByb2dyYW1SYXN0ZXIoZ0N1bGxCYWNrKTsKKyAgICByc2dEcmF3TWVzaChnVG9ydXNNZXNoKTsKKworICAgIHJzZ0ZvbnRDb2xvcigxLjBmLCAxLjBmLCAxLjBmLCAxLjBmKTsKKyAgICByc2dCaW5kRm9udChnRm9udE1vbm8pOworICAgIHJzZ0RyYXdUZXh0KCJEaXNwbGF5aW5nIG1lc2ggZnJvbnQvYmFjayBmYWNlIGN1bGxpbmciLCAxMCwgcnNnR2V0SGVpZ2h0KCkgLSAxMCk7Cit9CisKK2ludCByb290KGludCBsYXVuY2hJRCkgeworCisgICAgcnNnQ2xlYXJDb2xvcigwLjJmLCAwLjJmLCAwLjJmLCAwLjBmKTsKKyAgICByc2dDbGVhckRlcHRoKDEuMGYpOworCisgICAgc3dpdGNoKGdEaXNwbGF5TW9kZSkgeworICAgIGNhc2UgMDoKKyAgICAgICAgZGlzcGxheUZvbnRTYW1wbGVzKCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMToKKyAgICAgICAgZGlzcGxheVNoYWRlclNhbXBsZXMoKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgICBkaXNwbGF5QmxlbmRpbmdTYW1wbGVzKCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMzoKKyAgICAgICAgZGlzcGxheU1lc2hTYW1wbGVzKCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNDoKKyAgICAgICAgZGlzcGxheVRleHR1cmVTYW1wbGVycygpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDU6CisgICAgICAgIGRpc3BsYXlDdWxsaW5nU2FtcGxlcnMoKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIDEwOworfQpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL3Rlc3RzL0FuZHJvaWQubWsgYi9saWJzL3JzL2phdmEvdGVzdHMvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Yzk5MmQ1Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9qYXZhL3Rlc3RzL0FuZHJvaWQubWsKQEAgLTAsMCArMSwzMCBAQAorIworIyBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworaWZuZXEgKCQoVEFSR0VUX1NJTVVMQVRPUiksdHJ1ZSkKKworTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykgJChjYWxsIGFsbC1yZW5kZXJzY3JpcHQtZmlsZXMtdW5kZXIsIHNyYykKKworTE9DQUxfUEFDS0FHRV9OQU1FIDo9IFJTVGVzdAorCitpbmNsdWRlICQoQlVJTERfUEFDS0FHRSkKKworZW5kaWYKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS90ZXN0cy9BbmRyb2lkTWFuaWZlc3QueG1sIGIvbGlicy9ycy9qYXZhL3Rlc3RzL0FuZHJvaWRNYW5pZmVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmMxNDRhYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvamF2YS90ZXN0cy9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsMTQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHBhY2thZ2U9ImNvbS5hbmRyb2lkLnJzLnRlc3QiPgorICAgIDxhcHBsaWNhdGlvbiAKKyAgICAgICAgYW5kcm9pZDpsYWJlbD0iX1JTX1Rlc3QiCisgICAgICAgIGFuZHJvaWQ6aWNvbj0iQGRyYXdhYmxlL3Rlc3RfcGF0dGVybiI+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9IlJTVGVzdCI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisgICAgPC9hcHBsaWNhdGlvbj4KKzwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvdGVzdHMvcmVzL2RyYXdhYmxlL3Rlc3RfcGF0dGVybi5wbmcgYi9saWJzL3JzL2phdmEvdGVzdHMvcmVzL2RyYXdhYmxlL3Rlc3RfcGF0dGVybi5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTdkMTQ1NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvamF2YS90ZXN0cy9yZXMvZHJhd2FibGUvdGVzdF9wYXR0ZXJuLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvUlNUZXN0LmphdmEgYi9saWJzL3JzL2phdmEvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvUlNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTIxNzkzZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvamF2YS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9SU1Rlc3QuamF2YQpAQCAtMCwwICsxLDg1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5ycy50ZXN0OworCitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUlNTdXJmYWNlVmlldzsKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5SZW5kZXJTY3JpcHQ7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuTG9vcGVyOworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzLlN5c3RlbTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQ29uZmlnOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnU7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnVJdGVtOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3c7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQnV0dG9uOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3OworCitpbXBvcnQgamF2YS5sYW5nLlJ1bnRpbWU7CisKK3B1YmxpYyBjbGFzcyBSU1Rlc3QgZXh0ZW5kcyBBY3Rpdml0eSB7CisgICAgLy9FdmVudExpc3RlbmVyIG1MaXN0ZW5lciA9IG5ldyBFdmVudExpc3RlbmVyKCk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJsaWJSU19qbmkiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgID0gZmFsc2U7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBMT0dfRU5BQkxFRCA9IERFQlVHID8gQ29uZmlnLkxPR0QgOiBDb25maWcuTE9HVjsKKworICAgIHByaXZhdGUgUlNUZXN0VmlldyBtVmlldzsKKworICAgIC8vIGdldCB0aGUgY3VycmVudCBsb29wZXIgKGZyb20geW91ciBBY3Rpdml0eSBVSSB0aHJlYWQgZm9yIGluc3RhbmNlCisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZShCdW5kbGUgaWNpY2xlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKGljaWNsZSk7CisKKyAgICAgICAgLy8gQ3JlYXRlIG91ciBQcmV2aWV3IHZpZXcgYW5kIHNldCBpdCBhcyB0aGUgY29udGVudCBvZiBvdXIKKyAgICAgICAgLy8gQWN0aXZpdHkKKyAgICAgICAgbVZpZXcgPSBuZXcgUlNUZXN0Vmlldyh0aGlzKTsKKyAgICAgICAgc2V0Q29udGVudFZpZXcobVZpZXcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uUmVzdW1lKCkgeworICAgICAgICAvLyBJZGVhbGx5IGEgZ2FtZSBzaG91bGQgaW1wbGVtZW50IG9uUmVzdW1lKCkgYW5kIG9uUGF1c2UoKQorICAgICAgICAvLyB0byB0YWtlIGFwcHJvcHJpYXRlIGFjdGlvbiB3aGVuIHRoZSBhY3Rpdml0eSBsb29zZXMgZm9jdXMKKyAgICAgICAgc3VwZXIub25SZXN1bWUoKTsKKyAgICAgICAgbVZpZXcub25SZXN1bWUoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvblBhdXNlKCkgeworICAgICAgICAvLyBJZGVhbGx5IGEgZ2FtZSBzaG91bGQgaW1wbGVtZW50IG9uUmVzdW1lKCkgYW5kIG9uUGF1c2UoKQorICAgICAgICAvLyB0byB0YWtlIGFwcHJvcHJpYXRlIGFjdGlvbiB3aGVuIHRoZSBhY3Rpdml0eSBsb29zZXMgZm9jdXMKKyAgICAgICAgc3VwZXIub25QYXVzZSgpOworICAgICAgICBtVmlldy5vblBhdXNlKCk7CisgICAgfQorCisgICAgc3RhdGljIHZvaWQgbG9nKFN0cmluZyBtZXNzYWdlKSB7CisgICAgICAgIGlmIChMT0dfRU5BQkxFRCkgeworICAgICAgICAgICAgTG9nLnYoTE9HX1RBRywgbWVzc2FnZSk7CisgICAgICAgIH0KKyAgICB9CisKKworfQorCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvUlNUZXN0Q29yZS5qYXZhIGIvbGlicy9ycy9qYXZhL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L1JTVGVzdENvcmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMWExNmRkCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9qYXZhL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L1JTVGVzdENvcmUuamF2YQpAQCAtMCwwICsxLDcyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5ycy50ZXN0OworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuKjsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCisKK3B1YmxpYyBjbGFzcyBSU1Rlc3RDb3JlIHsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQQVJUX0NPVU5UID0gNTAwMDA7CisKKyAgICBwdWJsaWMgUlNUZXN0Q29yZSgpIHsKKyAgICB9CisKKyAgICBwcml2YXRlIFJlc291cmNlcyBtUmVzOworICAgIHByaXZhdGUgUmVuZGVyU2NyaXB0R0wgbVJTOworCisgICAgcHJpdmF0ZSBTY3JpcHRDX1Rlc3Rfcm9vdCBtUm9vdFNjcmlwdDsKKworICAgIHByaXZhdGUgYm9vbGVhbiBmcF9tYWQoKSB7CisgICAgICAgIFNjcmlwdENfRnBfbWFkIHMgPSBuZXcgU2NyaXB0Q19GcF9tYWQobVJTLCBtUmVzLCBSLnJhdy5mcF9tYWQsIHRydWUpOworICAgICAgICBzLmludm9rZV9kb1Rlc3QoMCwgMCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8vcHJpdmF0ZSBTY3JpcHRDX0ZvdW50YWluIG1TY3JpcHQ7CisgICAgcHVibGljIHZvaWQgaW5pdChSZW5kZXJTY3JpcHRHTCBycywgUmVzb3VyY2VzIHJlcywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CisgICAgICAgIG1SUyA9IHJzOworICAgICAgICBtUmVzID0gcmVzOworCisgICAgICAgIG1Sb290U2NyaXB0ID0gbmV3IFNjcmlwdENfVGVzdF9yb290KG1SUywgbVJlcywgUi5yYXcudGVzdF9yb290LCB0cnVlKTsKKworICAgICAgICBmcF9tYWQoKTsKKworCisgICAgICAgIC8qCisgICAgICAgIFByb2dyYW1GcmFnbWVudC5CdWlsZGVyIHBmYiA9IG5ldyBQcm9ncmFtRnJhZ21lbnQuQnVpbGRlcihycyk7CisgICAgICAgIHBmYi5zZXRWYXJ5aW5nQ29sb3IodHJ1ZSk7CisgICAgICAgIHJzLmNvbnRleHRCaW5kUHJvZ3JhbUZyYWdtZW50KHBmYi5jcmVhdGUoKSk7CisKKyAgICAgICAgU2NyaXB0RmllbGRfUG9pbnQgcG9pbnRzID0gbmV3IFNjcmlwdEZpZWxkX1BvaW50KG1SUywgUEFSVF9DT1VOVCk7CisKKyAgICAgICAgTWVzaC5BbGxvY2F0aW9uQnVpbGRlciBzbWIgPSBuZXcgTWVzaC5BbGxvY2F0aW9uQnVpbGRlcihtUlMpOworICAgICAgICBzbWIuYWRkVmVydGV4QWxsb2NhdGlvbihwb2ludHMuZ2V0QWxsb2NhdGlvbigpKTsKKyAgICAgICAgc21iLmFkZEluZGV4VHlwZShQcmltaXRpdmUuUE9JTlQpOworICAgICAgICBNZXNoIHNtID0gc21iLmNyZWF0ZSgpOworCisgICAgICAgIG1TY3JpcHQgPSBuZXcgU2NyaXB0Q19Gb3VudGFpbihtUlMsIG1SZXMsIFIucmF3LmZvdW50YWluLCB0cnVlKTsKKyAgICAgICAgbVNjcmlwdC5zZXRfcGFydE1lc2goc20pOworICAgICAgICBtU2NyaXB0LmJpbmRfcG9pbnQocG9pbnRzKTsKKyAgICAgICAgbVJTLmNvbnRleHRCaW5kUm9vdFNjcmlwdChtU2NyaXB0KTsKKyAgICAgICAgKi8KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBuZXdUb3VjaFBvc2l0aW9uKGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHByZXNzdXJlLCBpbnQgaWQpIHsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvUlNUZXN0Vmlldy5qYXZhIGIvbGlicy9ycy9qYXZhL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L1JTVGVzdFZpZXcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YWUwYzA4Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9qYXZhL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L1JTVGVzdFZpZXcuamF2YQpAQCAtMCwwICsxLDEwNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQucnMudGVzdDsKKworaW1wb3J0IGphdmEuaW8uV3JpdGVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuU2VtYXBob3JlOworCitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUlNTdXJmYWNlVmlldzsKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5SZW5kZXJTY3JpcHQ7CitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUmVuZGVyU2NyaXB0R0w7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkJpdG1hcERyYXdhYmxlOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3LlN1cmZhY2U7CitpbXBvcnQgYW5kcm9pZC52aWV3LlN1cmZhY2VIb2xkZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LlN1cmZhY2VWaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQ7CisKK3B1YmxpYyBjbGFzcyBSU1Rlc3RWaWV3IGV4dGVuZHMgUlNTdXJmYWNlVmlldyB7CisKKyAgICBwdWJsaWMgUlNUZXN0VmlldyhDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCk7CisgICAgICAgIC8vc2V0Rm9jdXNhYmxlKHRydWUpOworICAgIH0KKworICAgIHByaXZhdGUgUmVuZGVyU2NyaXB0R0wgbVJTOworICAgIHByaXZhdGUgUlNUZXN0Q29yZSBtUmVuZGVyOworCisgICAgcHVibGljIHZvaWQgc3VyZmFjZUNoYW5nZWQoU3VyZmFjZUhvbGRlciBob2xkZXIsIGludCBmb3JtYXQsIGludCB3LCBpbnQgaCkgeworICAgICAgICBzdXBlci5zdXJmYWNlQ2hhbmdlZChob2xkZXIsIGZvcm1hdCwgdywgaCk7CisgICAgICAgIGlmIChtUlMgPT0gbnVsbCkgeworICAgICAgICAgICAgbVJTID0gY3JlYXRlUmVuZGVyU2NyaXB0KGZhbHNlKTsKKyAgICAgICAgICAgIG1SUy5jb250ZXh0U2V0U3VyZmFjZSh3LCBoLCBob2xkZXIuZ2V0U3VyZmFjZSgpKTsKKyAgICAgICAgICAgIG1SZW5kZXIgPSBuZXcgUlNUZXN0Q29yZSgpOworICAgICAgICAgICAgbVJlbmRlci5pbml0KG1SUywgZ2V0UmVzb3VyY2VzKCksIHcsIGgpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25EZXRhY2hlZEZyb21XaW5kb3coKSB7CisgICAgICAgIGlmKG1SUyAhPSBudWxsKSB7CisgICAgICAgICAgICBtUlMgPSBudWxsOworICAgICAgICAgICAgZGVzdHJveVJlbmRlclNjcmlwdCgpOworICAgICAgICB9CisgICAgfQorCisvKgorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIG9uVG91Y2hFdmVudChNb3Rpb25FdmVudCBldikKKyAgICB7CisgICAgICAgIGludCBhY3QgPSBldi5nZXRBY3Rpb25NYXNrZWQoKTsKKyAgICAgICAgaWYgKGFjdCA9PSBldi5BQ1RJT05fVVApIHsKKyAgICAgICAgICAgIG1SZW5kZXIubmV3VG91Y2hQb3NpdGlvbigwLCAwLCAwLCBldi5nZXRQb2ludGVySWQoMCkpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9IGVsc2UgaWYgKGFjdCA9PSBNb3Rpb25FdmVudC5BQ1RJT05fUE9JTlRFUl9VUCkgeworICAgICAgICAgICAgLy8gb25seSBvbmUgcG9pbnRlciBnb2luZyB1cCwgd2UgY2FuIGdldCB0aGUgaW5kZXggbGlrZSB0aGlzCisgICAgICAgICAgICBpbnQgcG9pbnRlckluZGV4ID0gZXYuZ2V0QWN0aW9uSW5kZXgoKTsKKyAgICAgICAgICAgIGludCBwb2ludGVySWQgPSBldi5nZXRQb2ludGVySWQocG9pbnRlckluZGV4KTsKKyAgICAgICAgICAgIG1SZW5kZXIubmV3VG91Y2hQb3NpdGlvbigwLCAwLCAwLCBwb2ludGVySWQpOworICAgICAgICB9CisgICAgICAgIGludCBjb3VudCA9IGV2LmdldEhpc3RvcnlTaXplKCk7CisgICAgICAgIGludCBwY291bnQgPSBldi5nZXRQb2ludGVyQ291bnQoKTsKKworICAgICAgICBmb3IgKGludCBwPTA7IHAgPCBwY291bnQ7IHArKykgeworICAgICAgICAgICAgaW50IGlkID0gZXYuZ2V0UG9pbnRlcklkKHApOworICAgICAgICAgICAgbVJlbmRlci5uZXdUb3VjaFBvc2l0aW9uKGV2LmdldFgocCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXYuZ2V0WShwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldi5nZXRQcmVzc3VyZShwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCk7CisKKyAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBtUmVuZGVyLm5ld1RvdWNoUG9zaXRpb24oZXYuZ2V0SGlzdG9yaWNhbFgocCwgaSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2LmdldEhpc3RvcmljYWxZKHAsIGkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldi5nZXRIaXN0b3JpY2FsUHJlc3N1cmUocCwgaSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgKi8KK30KKworCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvZnBfbWFkLnJzIGIvbGlicy9ycy9qYXZhL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L2ZwX21hZC5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTRmZjM1Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9qYXZhL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L2ZwX21hZC5ycwpAQCAtMCwwICsxLDE3MyBAQAorI2luY2x1ZGUgInNoYXJlZC5yc2giCisKK2NvbnN0IGludCBURVNUX0NPVU5UID0gMTsKKworI3ByYWdtYSBycyBleHBvcnRfdmFyKGdfcmVzdWx0cykKKyNwcmFnbWEgcnMgZXhwb3J0X2Z1bmMoZG9UZXN0KQorCisKK3N0YXRpYyBmbG9hdCBkYXRhX2YxWzEwMjVdOworc3RhdGljIGZsb2F0NCBkYXRhX2Y0WzEwMjVdOworCitzdGF0aWMgdm9pZCB0ZXN0X21hZDQodWludDMyX3QgaW5kZXgpIHsKKyAgICBzdGFydCgpOworCisgICAgZmxvYXQgdG90YWwgPSAwOworICAgIC8vIERvIH4xIGJpbGxpb24gb3BzCisgICAgZm9yIChpbnQgY3Q9MDsgY3QgPCAxMDAwICogKDEwMDAgLyA4MCk7IGN0KyspIHsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgKDEwMDApOyBpKyspIHsKKyAgICAgICAgICAgIGRhdGFfZjRbaV0gPSAoZGF0YV9mNFtpXSAqIDAuMDJmICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9mNFtpKzFdICogMC4wNGYgKworICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX2Y0W2krMl0gKiAwLjA1ZiArCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfZjRbaSszXSAqIDAuMWYgKworICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX2Y0W2krNF0gKiAwLjJmICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9mNFtpKzVdICogMC4yZiArCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfZjRbaSs2XSAqIDAuMWYgKworICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX2Y0W2krN10gKiAwLjA1ZiArCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfZjRbaSs4XSAqIDAuMDRmICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9mNFtpKzldICogMC4wMmYgKyAxLmYpOworICAgICAgICB9CisgICAgfQorCisgICAgZmxvYXQgdGltZSA9IGVuZChpbmRleCk7CisgICAgcnNEZWJ1ZygiZnBfbWFkNCBNIG9wcyIsIDEwMDAuZiAvIHRpbWUpOworfQorCitzdGF0aWMgdm9pZCB0ZXN0X21hZCh1aW50MzJfdCBpbmRleCkgeworICAgIHN0YXJ0KCk7CisKKyAgICBmbG9hdCB0b3RhbCA9IDA7CisgICAgLy8gRG8gfjEgYmlsbGlvbiBvcHMKKyAgICBmb3IgKGludCBjdD0wOyBjdCA8IDEwMDAgKiAoMTAwMCAvIDIwKTsgY3QrKykgeworICAgICAgICBmb3IgKGludCBpPTA7IGkgPCAoMTAwMCk7IGkrKykgeworICAgICAgICAgICAgZGF0YV9mMVtpXSA9IChkYXRhX2YxW2ldICogMC4wMmYgKworICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX2YxW2krMV0gKiAwLjA0ZiArCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfZjFbaSsyXSAqIDAuMDVmICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9mMVtpKzNdICogMC4xZiArCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfZjFbaSs0XSAqIDAuMmYgKworICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX2YxW2krNV0gKiAwLjJmICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9mMVtpKzZdICogMC4xZiArCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfZjFbaSs3XSAqIDAuMDVmICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9mMVtpKzhdICogMC4wNGYgKworICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX2YxW2krOV0gKiAwLjAyZiArIDEuZik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmbG9hdCB0aW1lID0gZW5kKGluZGV4KTsKKyAgICByc0RlYnVnKCJmcF9tYWQgTSBvcHMiLCAxMDAwLmYgLyB0aW1lKTsKK30KKworc3RhdGljIHZvaWQgdGVzdF9ub3JtKHVpbnQzMl90IGluZGV4KSB7CisgICAgc3RhcnQoKTsKKworICAgIGZsb2F0IHRvdGFsID0gMDsKKyAgICAvLyBEbyB+MTAgTSBvcHMKKyAgICBmb3IgKGludCBjdD0wOyBjdCA8IDEwMDAgKiAxMDsgY3QrKykgeworICAgICAgICBmb3IgKGludCBpPTA7IGkgPCAoMTAwMCk7IGkrKykgeworICAgICAgICAgICAgZGF0YV9mNFtpXSA9IG5vcm1hbGl6ZShkYXRhX2Y0W2ldKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZsb2F0IHRpbWUgPSBlbmQoaW5kZXgpOworICAgIHJzRGVidWcoImZwX25vcm0gTSBvcHMiLCAxMC5mIC8gdGltZSk7Cit9CisKK3N0YXRpYyB2b2lkIHRlc3Rfc2luY29zNCh1aW50MzJfdCBpbmRleCkgeworICAgIHN0YXJ0KCk7CisKKyAgICBmbG9hdCB0b3RhbCA9IDA7CisgICAgLy8gRG8gfjEwIE0gb3BzCisgICAgZm9yIChpbnQgY3Q9MDsgY3QgPCAxMDAwICogMTAgLyA0OyBjdCsrKSB7CisgICAgICAgIGZvciAoaW50IGk9MDsgaSA8ICgxMDAwKTsgaSsrKSB7CisgICAgICAgICAgICBkYXRhX2Y0W2ldID0gc2luKGRhdGFfZjRbaV0pICogY29zKGRhdGFfZjRbaV0pOworICAgICAgICB9CisgICAgfQorCisgICAgZmxvYXQgdGltZSA9IGVuZChpbmRleCk7CisgICAgcnNEZWJ1ZygiZnBfc2luY29zNCBNIG9wcyIsIDEwLmYgLyB0aW1lKTsKK30KKworc3RhdGljIHZvaWQgdGVzdF9zaW5jb3ModWludDMyX3QgaW5kZXgpIHsKKyAgICBzdGFydCgpOworCisgICAgZmxvYXQgdG90YWwgPSAwOworICAgIC8vIERvIH4xMCBNIG9wcworICAgIGZvciAoaW50IGN0PTA7IGN0IDwgMTAwMCAqIDEwOyBjdCsrKSB7CisgICAgICAgIGZvciAoaW50IGk9MDsgaSA8ICgxMDAwKTsgaSsrKSB7CisgICAgICAgICAgICBkYXRhX2YxW2ldID0gc2luKGRhdGFfZjFbaV0pICogY29zKGRhdGFfZjFbaV0pOworICAgICAgICB9CisgICAgfQorCisgICAgZmxvYXQgdGltZSA9IGVuZChpbmRleCk7CisgICAgcnNEZWJ1ZygiZnBfc2luY29zIE0gb3BzIiwgMTAuZiAvIHRpbWUpOworfQorCitzdGF0aWMgdm9pZCB0ZXN0X2NsYW1wKHVpbnQzMl90IGluZGV4KSB7CisgICAgc3RhcnQoKTsKKworICAgIC8vIERvIH4xMDAgTSBvcHMKKyAgICBmb3IgKGludCBjdD0wOyBjdCA8IDEwMDAgKiAxMDA7IGN0KyspIHsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgKDEwMDApOyBpKyspIHsKKyAgICAgICAgICAgIGRhdGFfZjFbaV0gPSBjbGFtcChkYXRhX2YxW2ldLCAtMS5mLCAxLmYpOworICAgICAgICB9CisgICAgfQorCisgICAgZmxvYXQgdGltZSA9IGVuZChpbmRleCk7CisgICAgcnNEZWJ1ZygiZnBfY2xhbXAgTSBvcHMiLCAxMDAuZiAvIHRpbWUpOworCisgICAgc3RhcnQoKTsKKyAgICAvLyBEbyB+MTAwIE0gb3BzCisgICAgZm9yIChjdD0wOyBjdCA8IDEwMDAgKiAxMDA7IGN0KyspIHsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgKDEwMDApOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChkYXRhX2YxW2ldIDwgLTEuZikgZGF0YV9mMVtpXSA9IC0xLmY7CisgICAgICAgICAgICBpZiAoZGF0YV9mMVtpXSA+IC0xLmYpIGRhdGFfZjFbaV0gPSAxLmY7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB0aW1lID0gZW5kKGluZGV4KTsKKyAgICByc0RlYnVnKCJmcF9jbGFtcCByZWYgTSBvcHMiLCAxMDAuZiAvIHRpbWUpOworfQorCitzdGF0aWMgdm9pZCB0ZXN0X2NsYW1wNCh1aW50MzJfdCBpbmRleCkgeworICAgIHN0YXJ0KCk7CisKKyAgICBmbG9hdCB0b3RhbCA9IDA7CisgICAgLy8gRG8gfjEwMCBNIG9wcworICAgIGZvciAoaW50IGN0PTA7IGN0IDwgMTAwMCAqIDEwMCAvNDsgY3QrKykgeworICAgICAgICBmb3IgKGludCBpPTA7IGkgPCAoMTAwMCk7IGkrKykgeworICAgICAgICAgICAgZGF0YV9mNFtpXSA9IGNsYW1wKGRhdGFfZjRbaV0sIC0xLmYsIDEuZik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmbG9hdCB0aW1lID0gZW5kKGluZGV4KTsKKyAgICByc0RlYnVnKCJmcF9jbGFtcDQgTSBvcHMiLCAxMDAuZiAvIHRpbWUpOworfQorCit2b2lkIGRvVGVzdCh1aW50MzJfdCBpbmRleCwgaW50IHRlc3RfbnVtKSB7CisgICAgZm9yIChpbnQgeD0wOyB4IDwgMTAyNTsgeCsrKSB7CisgICAgICAgIGRhdGFfZjFbeF0gPSAoeCAmIDB4ZikgKiAwLjFmOworICAgICAgICBkYXRhX2Y0W3hdLnggPSAoeCAmIDB4ZikgKiAwLjFmOworICAgICAgICBkYXRhX2Y0W3hdLnkgPSAoeCAmIDB4ZjApICogMC4xZjsKKyAgICAgICAgZGF0YV9mNFt4XS56ID0gKHggJiAweDMzKSAqIDAuMWY7CisgICAgICAgIGRhdGFfZjRbeF0udyA9ICh4ICYgMHg3NykgKiAwLjFmOworICAgIH0KKworICAgIHRlc3RfbWFkNChpbmRleCk7CisgICAgdGVzdF9tYWQoaW5kZXgpOworCisgICAgZm9yICh4PTA7IHggPCAxMDI1OyB4KyspIHsKKyAgICAgICAgZGF0YV9mMVt4XSA9ICh4ICYgMHhmKSAqIDAuMWYgKyAxLmY7CisgICAgICAgIGRhdGFfZjRbeF0ueCA9ICh4ICYgMHhmKSAqIDAuMWYgKyAxLmY7CisgICAgICAgIGRhdGFfZjRbeF0ueSA9ICh4ICYgMHhmMCkgKiAwLjFmICsgMS5mOworICAgICAgICBkYXRhX2Y0W3hdLnogPSAoeCAmIDB4MzMpICogMC4xZiArIDEuZjsKKyAgICAgICAgZGF0YV9mNFt4XS53ID0gKHggJiAweDc3KSAqIDAuMWYgKyAxLmY7CisgICAgfQorCisgICAgdGVzdF9ub3JtKGluZGV4KTsKKyAgICB0ZXN0X3NpbmNvczQoaW5kZXgpOworICAgIHRlc3Rfc2luY29zKGluZGV4KTsKKyAgICB0ZXN0X2NsYW1wNChpbmRleCk7CisgICAgdGVzdF9jbGFtcChpbmRleCk7Cit9CisKKwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L3NoYXJlZC5yc2ggYi9saWJzL3JzL2phdmEvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3Qvc2hhcmVkLnJzaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzczZTQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9qYXZhL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L3NoYXJlZC5yc2gKQEAgLTAsMCArMSwyNSBAQAorI3ByYWdtYSB2ZXJzaW9uKDEpCisKKyNwcmFnbWEgcnMgamF2YV9wYWNrYWdlX25hbWUoY29tLmFuZHJvaWQucnMudGVzdCkKKwordHlwZWRlZiBzdHJ1Y3QgVGVzdFJlc3VsdF9zIHsKKyAgICByc19hbGxvY2F0aW9uIG5hbWU7CisgICAgYm9vbCBwYXNzOworICAgIGZsb2F0IHNjb3JlOworICAgIGludDY0X3QgdGltZTsKK30gVGVzdFJlc3VsdDsKK1Rlc3RSZXN1bHQgKmdfcmVzdWx0czsKKworc3RhdGljIGludDY0X3QgZ190aW1lOworCitzdGF0aWMgdm9pZCBzdGFydCh2b2lkKSB7CisgICAgZ190aW1lID0gcnNVcHRpbWVNaWxsaXMoKTsKK30KKworc3RhdGljIGZsb2F0IGVuZCh1aW50MzJfdCBpZHgpIHsKKyAgICBpbnQ2NF90IHQgPSByc1VwdGltZU1pbGxpcygpIC0gZ190aW1lOworICAgIC8vZ19yZXN1bHRzW2lkeF0udGltZSA9IHQ7CisgICAgLy9yc0RlYnVnKCJ0ZXN0IHRpbWUiLCAoaW50KXQpOworICAgIHJldHVybiAoKGZsb2F0KXQpIC8gMTAwMC5mOworfQorCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvdGVzdF9yb290LnJzIGIvbGlicy9ycy9qYXZhL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L3Rlc3Rfcm9vdC5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MmIzOTFkZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvamF2YS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC90ZXN0X3Jvb3QucnMKQEAgLTAsMCArMSwyNiBAQAorLy8gRm91bnRhaW4gdGVzdCBzY3JpcHQKKyNwcmFnbWEgdmVyc2lvbigxKQorCisjcHJhZ21hIHJzIGphdmFfcGFja2FnZV9uYW1lKGNvbS5hbmRyb2lkLnJzLnRlc3QpCisKKyNwcmFnbWEgc3RhdGVGcmFnbWVudChwYXJlbnQpCisKKyNpbmNsdWRlICJyc19ncmFwaGljcy5yc2giCisKKwordHlwZWRlZiBzdHJ1Y3QgVGVzdFJlc3VsdCB7CisgICAgcnNfYWxsb2NhdGlvbiBuYW1lOworICAgIGJvb2wgcGFzczsKKyAgICBmbG9hdCBzY29yZTsKK30gVGVzdFJlc3VsdF90OworVGVzdFJlc3VsdF90ICpyZXN1bHRzOworCisjcHJhZ21hIHJzIGV4cG9ydF92YXIocmVzdWx0cykKKy8vI3ByYWdtYSBycyBleHBvcnRfZnVuYyhhZGRQYXJ0aWNsZXMpCisKK2ludCByb290KCkgeworCisgICAgcmV0dXJuIDA7Cit9CisKKwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9ycy5zcGVjIGIvbGlicy9ycy9ycy5zcGVjCmluZGV4IDVhZThkMDEuLjc4MWRiZWEgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnMuc3BlYworKysgYi9saWJzL3JzL3JzLnNwZWMKQEAgLTEsMTEgKzEsMTQgQEAKIAorQ29udGV4dEZpbmlzaCB7CisJaGFuZGNvZGVBcGkKKwl9CiAKIENvbnRleHRCaW5kUm9vdFNjcmlwdCB7CiAJcGFyYW0gUnNTY3JpcHQgc2FtcGxlcgogCX0KIAotQ29udGV4dEJpbmRQcm9ncmFtRnJhZ21lbnRTdG9yZSB7Ci0JcGFyYW0gUnNQcm9ncmFtRnJhZ21lbnRTdG9yZSBwZ20KK0NvbnRleHRCaW5kUHJvZ3JhbVN0b3JlIHsKKwlwYXJhbSBSc1Byb2dyYW1TdG9yZSBwZ20KIAl9CiAKIENvbnRleHRCaW5kUHJvZ3JhbUZyYWdtZW50IHsKQEAgLTIwLDYgKzIzLDEwIEBACiAJcGFyYW0gUnNQcm9ncmFtUmFzdGVyIHBnbQogCX0KIAorQ29udGV4dEJpbmRGb250IHsKKwlwYXJhbSBSc0ZvbnQgcGdtCisJfQorCiBDb250ZXh0UGF1c2UgewogCX0KIApAQCAtNTEsNiArNTgsMTEgQEAKIAlwYXJhbSBzaXplX3QgbGVuCiAJfQogCitHZXROYW1lIHsKKwlwYXJhbSB2b2lkICpvYmoKKwlwYXJhbSBjb25zdCBjaGFyICoqbmFtZQorCX0KKwogT2JqRGVzdHJveSB7CiAJcGFyYW0gdm9pZCAqb2JqCiAJfQpAQCAtNzEsNiArODMsMTkgQEAKIAlyZXQgUnNFbGVtZW50CiAJfQogCitFbGVtZW50R2V0TmF0aXZlRGF0YSB7CisJcGFyYW0gUnNFbGVtZW50IGVsZW0KKwlwYXJhbSB1aW50MzJfdCAqZWxlbURhdGEKKwlwYXJhbSB1aW50MzJfdCBlbGVtRGF0YVNpemUKKwl9CisKK0VsZW1lbnRHZXRTdWJFbGVtZW50cyB7CisJcGFyYW0gUnNFbGVtZW50IGVsZW0KKwlwYXJhbSB1aW50MzJfdCAqaWRzCisJcGFyYW0gY29uc3QgY2hhciAqKm5hbWVzCisJcGFyYW0gdWludDMyX3QgZGF0YVNpemUKKwl9CisKIFR5cGVCZWdpbiB7CiAJcGFyYW0gUnNFbGVtZW50IHR5cGUKIAl9CkBAIC04NCw2ICsxMDksMTIgQEAKIAlyZXQgUnNUeXBlCiAJfQogCitUeXBlR2V0TmF0aXZlRGF0YSB7CisJcGFyYW0gUnNUeXBlIHR5cGUKKwlwYXJhbSB1aW50MzJfdCAqIHR5cGVEYXRhCisJcGFyYW0gdWludDMyX3QgdHlwZURhdGFTaXplCisJfQorCiBBbGxvY2F0aW9uQ3JlYXRlVHlwZWQgewogCXBhcmFtIFJzVHlwZSB0eXBlCiAJcmV0IFJzQWxsb2NhdGlvbgpAQCAtMjI0LDYgKzI1NSwxMSBAQAogCXBhcmFtIGNvbnN0IHZvaWQgKmRhdGEKIAl9CiAKK0FsbG9jYXRpb25HZXRUeXBlIHsKKwlwYXJhbSBSc0FsbG9jYXRpb24gdmEKKwlyZXQgY29uc3Qgdm9pZCoKKwl9CisKIFNhbXBsZXJCZWdpbiB7CiAJfQogCkBAIC0yNDgsMTMgKzI4NCw2IEBACiBTY3JpcHRDQmVnaW4gewogCX0KIAotU2NyaXB0U2V0Q2xlYXJDb2xvciB7Ci0JcGFyYW0gUnNTY3JpcHQgcwotCXBhcmFtIGZsb2F0IHIKLQlwYXJhbSBmbG9hdCBnCi0JcGFyYW0gZmxvYXQgYgotCXBhcmFtIGZsb2F0IGEKLQl9CiAKIFNjcmlwdFNldFRpbWVab25lIHsKIAlwYXJhbSBSc1NjcmlwdCBzCkBAIC0yNjIsMzcgKzI5MSw0MSBAQAogCXBhcmFtIHVpbnQzMl90IGxlbmd0aAogCX0KIAotU2NyaXB0U2V0Q2xlYXJEZXB0aCB7Ci0JcGFyYW0gUnNTY3JpcHQgcwotCXBhcmFtIGZsb2F0IGRlcHRoCi0JfQotCi1TY3JpcHRTZXRDbGVhclN0ZW5jaWwgewotCXBhcmFtIFJzU2NyaXB0IHMKLQlwYXJhbSB1aW50MzJfdCBzdGVuY2lsCi0JfQotCi1TY3JpcHRTZXRUeXBlIHsKLQlwYXJhbSBSc1R5cGUgdHlwZQotCXBhcmFtIHVpbnQzMl90IHNsb3QKLQlwYXJhbSBib29sIGlzV3JpdGFibGUKLQlwYXJhbSBjb25zdCBjaGFyICogbmFtZQotCX0KLQotU2NyaXB0U2V0SW52b2tlIHsKLQlwYXJhbSBjb25zdCBjaGFyICogbmFtZQotCXBhcmFtIHVpbnQzMl90IHNsb3QKLQl9CiAKIFNjcmlwdEludm9rZSB7CiAJcGFyYW0gUnNTY3JpcHQgcwogCXBhcmFtIHVpbnQzMl90IHNsb3QKIAl9CiAKLVNjcmlwdFNldFJvb3QgewotCXBhcmFtIGJvb2wgaXNSb290CitTY3JpcHRJbnZva2VWIHsKKwlwYXJhbSBSc1NjcmlwdCBzCisJcGFyYW0gdWludDMyX3Qgc2xvdAorCXBhcmFtIGNvbnN0IHZvaWQgKiBkYXRhCisJcGFyYW0gdWludDMyX3QgZGF0YUxlbgorCWhhbmRjb2RlQXBpCisJdG9nZ2xlUGxheQogCX0KIAorU2NyaXB0U2V0VmFySSB7CisJcGFyYW0gUnNTY3JpcHQgcworCXBhcmFtIHVpbnQzMl90IHNsb3QKKwlwYXJhbSBpbnQgdmFsdWUKKwl9CisKK1NjcmlwdFNldFZhckYgeworCXBhcmFtIFJzU2NyaXB0IHMKKwlwYXJhbSB1aW50MzJfdCBzbG90CisJcGFyYW0gZmxvYXQgdmFsdWUKKwl9CisKK1NjcmlwdFNldFZhclYgeworCXBhcmFtIFJzU2NyaXB0IHMKKwlwYXJhbSB1aW50MzJfdCBzbG90CisJcGFyYW0gY29uc3Qgdm9pZCAqIGRhdGEKKwlwYXJhbSB1aW50MzJfdCBkYXRhTGVuCisJaGFuZGNvZGVBcGkKKwl0b2dnbGVQbGF5CisJfQogCiAKIFNjcmlwdENTZXRTY3JpcHQgewpAQCAtMzA4LDUyICszNDEsNDEgQEAKIAlyZXQgUnNTY3JpcHQKIAl9CiAKLVNjcmlwdENTZXREZWZpbmVGIHsKLSAgICBwYXJhbSBjb25zdCBjaGFyKiBuYW1lCi0gICAgcGFyYW0gZmxvYXQgdmFsdWUKLSAgICB9CiAKLVNjcmlwdENTZXREZWZpbmVJMzIgewotICAgIHBhcmFtIGNvbnN0IGNoYXIqIG5hbWUKLSAgICBwYXJhbSBpbnQzMl90IHZhbHVlCi0gICAgfQotCi1Qcm9ncmFtRnJhZ21lbnRTdG9yZUJlZ2luIHsKK1Byb2dyYW1TdG9yZUJlZ2luIHsKIAlwYXJhbSBSc0VsZW1lbnQgaW4KIAlwYXJhbSBSc0VsZW1lbnQgb3V0CiAJfQogCi1Qcm9ncmFtRnJhZ21lbnRTdG9yZUNvbG9yTWFzayB7CitQcm9ncmFtU3RvcmVDb2xvck1hc2sgewogCXBhcmFtIGJvb2wgcgogCXBhcmFtIGJvb2wgZwogCXBhcmFtIGJvb2wgYgogCXBhcmFtIGJvb2wgYQogCX0KIAotUHJvZ3JhbUZyYWdtZW50U3RvcmVCbGVuZEZ1bmMgeworUHJvZ3JhbVN0b3JlQmxlbmRGdW5jIHsKIAlwYXJhbSBSc0JsZW5kU3JjRnVuYyBzcmNGdW5jCiAJcGFyYW0gUnNCbGVuZERzdEZ1bmMgZGVzdEZ1bmMKIAl9CiAKLVByb2dyYW1GcmFnbWVudFN0b3JlRGVwdGhNYXNrIHsKK1Byb2dyYW1TdG9yZURlcHRoTWFzayB7CiAJcGFyYW0gYm9vbCBlbmFibGUKIH0KIAotUHJvZ3JhbUZyYWdtZW50U3RvcmVEaXRoZXIgeworUHJvZ3JhbVN0b3JlRGl0aGVyIHsKIAlwYXJhbSBib29sIGVuYWJsZQogfQogCi1Qcm9ncmFtRnJhZ21lbnRTdG9yZURlcHRoRnVuYyB7CitQcm9ncmFtU3RvcmVEZXB0aEZ1bmMgewogCXBhcmFtIFJzRGVwdGhGdW5jIGZ1bmMKIH0KIAotUHJvZ3JhbUZyYWdtZW50U3RvcmVDcmVhdGUgewotCXJldCBSc1Byb2dyYW1GcmFnbWVudFN0b3JlCitQcm9ncmFtU3RvcmVDcmVhdGUgeworCXJldCBSc1Byb2dyYW1TdG9yZQogCX0KIAogUHJvZ3JhbVJhc3RlckNyZWF0ZSB7Ci0JcGFyYW0gUnNFbGVtZW50IGluCi0JcGFyYW0gUnNFbGVtZW50IG91dAogCXBhcmFtIGJvb2wgcG9pbnRTbW9vdGgKIAlwYXJhbSBib29sIGxpbmVTbW9vdGgKIAlwYXJhbSBib29sIHBvaW50U3ByaXRlCkBAIC0zNjUsMTIgKzM4NywxMSBAQAogCXBhcmFtIGZsb2F0IGx3CiB9CiAKLVByb2dyYW1SYXN0ZXJTZXRQb2ludFNpemV7CitQcm9ncmFtUmFzdGVyU2V0Q3VsbE1vZGUgewogCXBhcmFtIFJzUHJvZ3JhbVJhc3RlciBwcgotCXBhcmFtIGZsb2F0IHBzCisJcGFyYW0gUnNDdWxsTW9kZSBtb2RlCiB9CiAKLQogUHJvZ3JhbUJpbmRDb25zdGFudHMgewogCXBhcmFtIFJzUHJvZ3JhbSB2cAogCXBhcmFtIHVpbnQzMl90IHNsb3QKQEAgLTQxNywzNCArNDM4LDEwIEBACiAJcmV0IFJzUHJvZ3JhbVZlcnRleAogCX0KIAotTGlnaHRCZWdpbiB7Ci0JfQotCi1MaWdodFNldExvY2FsIHsKLQlwYXJhbSBib29sIGlzTG9jYWwKLQl9Ci0KLUxpZ2h0U2V0TW9ub2Nocm9tYXRpYyB7Ci0JcGFyYW0gYm9vbCBpc01vbm8KLQl9Ci0KLUxpZ2h0Q3JlYXRlIHsKLQlyZXQgUnNMaWdodCBsaWdodAotCX0KLQotCi1MaWdodFNldFBvc2l0aW9uIHsKLQlwYXJhbSBSc0xpZ2h0IGxpZ2h0Ci0JcGFyYW0gZmxvYXQgeAotCXBhcmFtIGZsb2F0IHkKLQlwYXJhbSBmbG9hdCB6Ci0JfQotCi1MaWdodFNldENvbG9yIHsKLQlwYXJhbSBSc0xpZ2h0IGxpZ2h0Ci0JcGFyYW0gZmxvYXQgcgotCXBhcmFtIGZsb2F0IGcKLQlwYXJhbSBmbG9hdCBiCitGaWxlQTNEQ3JlYXRlRnJvbUFzc2V0U3RyZWFtIHsKKwlwYXJhbSBjb25zdCB2b2lkICogZGF0YQorCXBhcmFtIHNpemVfdCBsZW4KKwlyZXQgUnNGaWxlCiAJfQogCiBGaWxlT3BlbiB7CkBAIC00NTMsMzAgKzQ1MCw3OSBAQAogCXBhcmFtIHNpemVfdCBsZW4KIAl9CiAKK0ZpbGVBM0RHZXROdW1JbmRleEVudHJpZXMgeworCXBhcmFtIGludDMyX3QgKiBudW1FbnRyaWVzCisJcGFyYW0gUnNGaWxlIGZpbGUKKwl9CiAKLVNpbXBsZU1lc2hDcmVhdGUgewotCXJldCBSc1NpbXBsZU1lc2gKLQlwYXJhbSBSc0FsbG9jYXRpb24gcHJpbQotCXBhcmFtIFJzQWxsb2NhdGlvbiBpbmRleAotCXBhcmFtIFJzQWxsb2NhdGlvbiAqdnR4CitGaWxlQTNER2V0SW5kZXhFbnRyaWVzIHsKKwlwYXJhbSBSc0ZpbGVJbmRleEVudHJ5ICogZmlsZUVudHJpZXMKKwlwYXJhbSB1aW50MzJfdCBudW1FbnRyaWVzCisJcGFyYW0gUnNGaWxlIGZpbGVBM0QKKwl9CisKK0ZpbGVBM0RHZXRFbnRyeUJ5SW5kZXggeworCXBhcmFtIHVpbnQzMl90IGluZGV4CisJcGFyYW0gUnNGaWxlIGZpbGUKKwlyZXQgUnNPYmplY3RCYXNlCisJfQorCitGb250Q3JlYXRlRnJvbUZpbGUgeworCXBhcmFtIGNvbnN0IGNoYXIgKm5hbWUKKwlwYXJhbSB1aW50MzJfdCBmb250U2l6ZQorCXBhcmFtIHVpbnQzMl90IGRwaQorCXJldCBSc0ZvbnQKKwl9CisKK01lc2hDcmVhdGUgeworCXJldCBSc01lc2gKIAlwYXJhbSB1aW50MzJfdCB2dHhDb3VudAotCXBhcmFtIHVpbnQzMl90IHByaW1UeXBlCisJcGFyYW0gdWludDMyX3QgaWR4Q291bnQKIAl9CiAKLQotU2ltcGxlTWVzaEJpbmRJbmRleCB7Ci0JcGFyYW0gUnNTaW1wbGVNZXNoIG1lc2gKK01lc2hCaW5kSW5kZXggeworCXBhcmFtIFJzTWVzaCBtZXNoCiAJcGFyYW0gUnNBbGxvY2F0aW9uIGlkeAorCXBhcmFtIHVpbnQzMl90IHByaW1UeXBlCisJcGFyYW0gdWludDMyX3Qgc2xvdAogCX0KIAotU2ltcGxlTWVzaEJpbmRQcmltaXRpdmUgewotCXBhcmFtIFJzU2ltcGxlTWVzaCBtZXNoCi0JcGFyYW0gUnNBbGxvY2F0aW9uIHByaW0KLQl9Ci0KLVNpbXBsZU1lc2hCaW5kVmVydGV4IHsKLQlwYXJhbSBSc1NpbXBsZU1lc2ggbWVzaAorTWVzaEJpbmRWZXJ0ZXggeworCXBhcmFtIFJzTWVzaCBtZXNoCiAJcGFyYW0gUnNBbGxvY2F0aW9uIHZ0eAogCXBhcmFtIHVpbnQzMl90IHNsb3QKIAl9CiAKK01lc2hHZXRWZXJ0ZXhCdWZmZXJDb3VudCB7CisJcGFyYW0gUnNNZXNoIG1lc2gKKwlwYXJhbSBpbnQzMl90ICpudW1WdHgKKwl9CisKK01lc2hHZXRJbmRleENvdW50IHsKKwlwYXJhbSBSc01lc2ggbWVzaAorCXBhcmFtIGludDMyX3QgKm51bUlkeAorCX0KKworTWVzaEdldFZlcnRpY2VzIHsKKwlwYXJhbSBSc01lc2ggbXYKKwlwYXJhbSBSc0FsbG9jYXRpb24gKnZ0eERhdGEKKwlwYXJhbSB1aW50MzJfdCB2dHhEYXRhQ291bnQKKwl9CisKK01lc2hHZXRJbmRpY2VzIHsKKwlwYXJhbSBSc01lc2ggbXYKKwlwYXJhbSBSc0FsbG9jYXRpb24gKnZhCisJcGFyYW0gdWludDMyX3QgKnByaW1UeXBlCisJcGFyYW0gdWludDMyX3QgaWR4RGF0YUNvdW50CisJfQorCitBbmltYXRpb25DcmVhdGUgeworCXBhcmFtIGNvbnN0IGZsb2F0ICppblZhbHVlcworCXBhcmFtIGNvbnN0IGZsb2F0ICpvdXRWYWx1ZXMKKwlwYXJhbSB1aW50MzJfdCB2YWx1ZUNvdW50CisJcGFyYW0gUnNBbmltYXRpb25JbnRlcnBvbGF0aW9uIGludGVycAorCXBhcmFtIFJzQW5pbWF0aW9uRWRnZSBwcmUKKwlwYXJhbSBSc0FuaW1hdGlvbkVkZ2UgcG9zdAorCXJldCBSc0FuaW1hdGlvbgorCX0KKwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc0FkYXB0ZXIuY3BwIGIvbGlicy9ycy9yc0FkYXB0ZXIuY3BwCmluZGV4IDBkMzFmYWMuLmI0ZWMyNTAgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNBZGFwdGVyLmNwcAorKysgYi9saWJzL3JzL3JzQWRhcHRlci5jcHAKQEAgLTE1LDcgKzE1LDExIEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisjaWZuZGVmIEFORFJPSURfUlNfQlVJTERfRk9SX0hPU1QKICNpbmNsdWRlICJyc0NvbnRleHQuaCIKKyNlbHNlCisjaW5jbHVkZSAicnNDb250ZXh0SG9zdFN0dWIuaCIKKyNlbmRpZgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpyZW5kZXJzY3JpcHQ7CkBAIC03MCw2ICs3NCwxNiBAQAogICAgICAgICAgICBtQWxsb2NhdGlvbi5nZXQoKS0+Z2V0VHlwZSgpLT5nZXRTaXplQnl0ZXMoKSk7CiB9CiAKK3ZvaWQgQWRhcHRlcjFEOjpzZXJpYWxpemUoT1N0cmVhbSAqc3RyZWFtKSBjb25zdAoreworICAgIAorfQorCitBZGFwdGVyMUQgKkFkYXB0ZXIxRDo6Y3JlYXRlRnJvbVN0cmVhbShDb250ZXh0ICpyc2MsIElTdHJlYW0gKnN0cmVhbSkKK3sKKyAgICByZXR1cm4gTlVMTDsKK30KKwogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIHJlbmRlcnNjcmlwdCB7CiAKQEAgLTE4NSw2ICsxOTksMTUgQEAKICAgICAgICAgICAgbUFsbG9jYXRpb24uZ2V0KCktPmdldFR5cGUoKS0+Z2V0U2l6ZUJ5dGVzKCkpOwogfQogCit2b2lkIEFkYXB0ZXIyRDo6c2VyaWFsaXplKE9TdHJlYW0gKnN0cmVhbSkgY29uc3QKK3sKKyAgICAKK30KKworQWRhcHRlcjJEICpBZGFwdGVyMkQ6OmNyZWF0ZUZyb21TdHJlYW0oQ29udGV4dCAqcnNjLCBJU3RyZWFtICpzdHJlYW0pCit7CisgICAgcmV0dXJuIE5VTEw7Cit9CiAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc0FkYXB0ZXIuaCBiL2xpYnMvcnMvcnNBZGFwdGVyLmgKaW5kZXggY2IyODcyZS4uNDQ5ZTdhZCAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc0FkYXB0ZXIuaAorKysgYi9saWJzL3JzL3JzQWRhcHRlci5oCkBAIC01MCw2ICs1MCwxMCBAQAogICAgIHZvaWQgc3ViRGF0YSh1aW50MzJfdCB4b2ZmLCB1aW50MzJfdCBjb3VudCwgY29uc3Qgdm9pZCAqZGF0YSk7CiAgICAgdm9pZCBkYXRhKGNvbnN0IHZvaWQgKmRhdGEpOwogCisgICAgdmlydHVhbCB2b2lkIHNlcmlhbGl6ZShPU3RyZWFtICpzdHJlYW0pIGNvbnN0OworICAgIHZpcnR1YWwgUnNBM0RDbGFzc0lEIGdldENsYXNzSWQoKSBjb25zdCB7IHJldHVybiBSU19BM0RfQ0xBU1NfSURfQURBUFRFUl8xRDsgfQorICAgIHN0YXRpYyBBZGFwdGVyMUQgKmNyZWF0ZUZyb21TdHJlYW0oQ29udGV4dCAqcnNjLCBJU3RyZWFtICpzdHJlYW0pOworCiBwcm90ZWN0ZWQ6CiAgICAgT2JqZWN0QmFzZVJlZjxBbGxvY2F0aW9uPiBtQWxsb2NhdGlvbjsKICAgICB1aW50MzJfdCBtWTsKQEAgLTgyLDYgKzg2LDEwIEBACiAgICAgdm9pZCBkYXRhKGNvbnN0IHZvaWQgKmRhdGEpOwogICAgIHZvaWQgc3ViRGF0YSh1aW50MzJfdCB4b2ZmLCB1aW50MzJfdCB5b2ZmLCB1aW50MzJfdCB3LCB1aW50MzJfdCBoLCBjb25zdCB2b2lkICpkYXRhKTsKIAorICAgIHZpcnR1YWwgdm9pZCBzZXJpYWxpemUoT1N0cmVhbSAqc3RyZWFtKSBjb25zdDsKKyAgICB2aXJ0dWFsIFJzQTNEQ2xhc3NJRCBnZXRDbGFzc0lkKCkgY29uc3QgeyByZXR1cm4gUlNfQTNEX0NMQVNTX0lEX0FEQVBURVJfMkQ7IH0KKyAgICBzdGF0aWMgQWRhcHRlcjJEICpjcmVhdGVGcm9tU3RyZWFtKENvbnRleHQgKnJzYywgSVN0cmVhbSAqc3RyZWFtKTsKKwogcHJvdGVjdGVkOgogICAgIE9iamVjdEJhc2VSZWY8QWxsb2NhdGlvbj4gbUFsbG9jYXRpb247CiAgICAgdWludDMyX3QgbVo7CmRpZmYgLS1naXQgYS9saWJzL3JzL3JzQWxsb2NhdGlvbi5jcHAgYi9saWJzL3JzL3JzQWxsb2NhdGlvbi5jcHAKaW5kZXggNGU4Mjc4ZC4uN2U0NGZlYSAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc0FsbG9jYXRpb24uY3BwCisrKyBiL2xpYnMvcnMvcnNBbGxvY2F0aW9uLmNwcApAQCAtMTMsMTIgKzEzLDE4IEBACiAgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwotCisjaWZuZGVmIEFORFJPSURfUlNfQlVJTERfRk9SX0hPU1QKICNpbmNsdWRlICJyc0NvbnRleHQuaCIKIAogI2luY2x1ZGUgPEdMRVMvZ2wuaD4KICNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KICNpbmNsdWRlIDxHTEVTL2dsZXh0Lmg+CisjZWxzZQorI2luY2x1ZGUgInJzQ29udGV4dEhvc3RTdHViLmgiCisKKyNpbmNsdWRlIDxPcGVuR0wvZ2wuaD4KKyNpbmNsdWRlIDxPcGVuR2wvZ2xleHQuaD4KKyNlbmRpZgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpyZW5kZXJzY3JpcHQ7CkBAIC0yOCw2ICszNCw5IEBACiAgICAgaW5pdChyc2MsIHR5cGUpOwogCiAgICAgbVB0ciA9IG1hbGxvYyhtVHlwZS0+Z2V0U2l6ZUJ5dGVzKCkpOworICAgIGlmIChtVHlwZS0+Z2V0RWxlbWVudCgpLT5nZXRIYXNSZWZlcmVuY2VzKCkpIHsKKyAgICAgICAgbWVtc2V0KG1QdHIsIDAsIG1UeXBlLT5nZXRTaXplQnl0ZXMoKSk7CisgICAgfQogICAgIGlmICghbVB0cikgewogICAgICAgICBMT0dFKCJBbGxvY2F0aW9uOjpBbGxvY2F0aW9uLCBhbGxvYyBmYWlsdXJlIik7CiAgICAgfQpAQCAtMTY3LDkgKzE3NiwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgMCwgZm9ybWF0LCB0eXBlLCBwdHIpOwogICAgIH0KICAgICBpZiAobVRleHR1cmVHZW5NaXBtYXApIHsKKyNpZm5kZWYgQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAogICAgICAgICBnbEdlbmVyYXRlTWlwbWFwKEdMX1RFWFRVUkVfMkQpOworI2VuZGlmIC8vQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAogICAgIH0KIAorICAgIHJzYy0+Y2hlY2tFcnJvcigiQWxsb2NhdGlvbjo6dXBsb2FkVG9UZXh0dXJlIik7CiB9CiAKIHZvaWQgQWxsb2NhdGlvbjo6ZGVmZXJlZFVwbG9hZFRvQnVmZmVyT2JqZWN0KGNvbnN0IENvbnRleHQgKnJzYykKQEAgLTIwMSw2ICsyMTMsNyBAQAogICAgIGdsQmluZEJ1ZmZlcihHTF9BUlJBWV9CVUZGRVIsIG1CdWZmZXJJRCk7CiAgICAgZ2xCdWZmZXJEYXRhKEdMX0FSUkFZX0JVRkZFUiwgbVR5cGUtPmdldFNpemVCeXRlcygpLCBnZXRQdHIoKSwgR0xfRFlOQU1JQ19EUkFXKTsKICAgICBnbEJpbmRCdWZmZXIoR0xfQVJSQVlfQlVGRkVSLCAwKTsKKyAgICByc2MtPmNoZWNrRXJyb3IoIkFsbG9jYXRpb246OnVwbG9hZFRvQnVmZmVyT2JqZWN0Iik7CiB9CiAKIHZvaWQgQWxsb2NhdGlvbjo6dXBsb2FkQ2hlY2soY29uc3QgQ29udGV4dCAqcnNjKQpAQCAtMjI0LDYgKzIzNywxMiBAQAogICAgICAgICBMT0dFKCJBbGxvY2F0aW9uOjpkYXRhIGNhbGxlZCB3aXRoIG1pc21hdGNoZWQgc2l6ZSBleHBlY3RlZCAlaSwgZ290ICVpIiwgc2l6ZSwgc2l6ZUJ5dGVzKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KKworICAgIGlmIChtVHlwZS0+Z2V0RWxlbWVudCgpLT5nZXRIYXNSZWZlcmVuY2VzKCkpIHsKKyAgICAgICAgaW5jUmVmcyhkYXRhLCBzaXplQnl0ZXMgLyBtVHlwZS0+Z2V0RWxlbWVudCgpLT5nZXRTaXplQnl0ZXMoKSk7CisgICAgICAgIGRlY1JlZnMobVB0ciwgc2l6ZUJ5dGVzIC8gbVR5cGUtPmdldEVsZW1lbnQoKS0+Z2V0U2l6ZUJ5dGVzKCkpOworICAgIH0KKwogICAgIG1lbWNweShtUHRyLCBkYXRhLCBzaXplKTsKICAgICBzZW5kRGlydHkoKTsKICAgICBtVXBsb2FkRGVmZXJlZCA9IHRydWU7CkBAIC0yNDYsNiArMjY1LDEyIEBACiAgICAgICAgIG1UeXBlLT5kdW1wTE9HVigidHlwZSBpbmZvIik7CiAgICAgICAgIHJldHVybjsKICAgICB9CisKKyAgICBpZiAobVR5cGUtPmdldEVsZW1lbnQoKS0+Z2V0SGFzUmVmZXJlbmNlcygpKSB7CisgICAgICAgIGluY1JlZnMoZGF0YSwgY291bnQpOworICAgICAgICBkZWNSZWZzKHB0ciwgY291bnQpOworICAgIH0KKwogICAgIG1lbWNweShwdHIsIGRhdGEsIHNpemUpOwogICAgIHNlbmREaXJ0eSgpOwogICAgIG1VcGxvYWREZWZlcmVkID0gdHJ1ZTsKQEAgLTI2OSw2ICsyOTQsMTAgQEAKIAogICAgIGZvciAodWludDMyX3QgbGluZT15b2ZmOyBsaW5lIDwgKHlvZmYraCk7IGxpbmUrKykgewogICAgICAgICB1aW50OF90ICogcHRyID0gc3RhdGljX2Nhc3Q8dWludDhfdCAqPihtUHRyKTsKKyAgICAgICAgaWYgKG1UeXBlLT5nZXRFbGVtZW50KCktPmdldEhhc1JlZmVyZW5jZXMoKSkgeworICAgICAgICAgICAgaW5jUmVmcyhzcmMsIHcpOworICAgICAgICAgICAgZGVjUmVmcyhkc3QsIHcpOworICAgICAgICB9CiAgICAgICAgIG1lbWNweShkc3QsIHNyYywgbGluZVNpemUpOwogICAgICAgICBzcmMgKz0gbGluZVNpemU7CiAgICAgICAgIGRzdCArPSBkZXN0VyAqIGVTaXplOwpAQCAtMjg0LDcgKzMxMyw3IEBACiAKIHZvaWQgQWxsb2NhdGlvbjo6YWRkUHJvZ3JhbVRvRGlydHkoY29uc3QgUHJvZ3JhbSAqcCkKIHsKLSAgICBtVG9EaXJ0eUxpc3QuYWRkKHApOworICAgIG1Ub0RpcnR5TGlzdC5wdXNoKHApOwogfQogCiB2b2lkIEFsbG9jYXRpb246OnJlbW92ZVByb2dyYW1Ub0RpcnR5KGNvbnN0IFByb2dyYW0gKnApCkBAIC0zMTYsNiArMzQ1LDYxIEBACiAKIH0KIAordm9pZCBBbGxvY2F0aW9uOjpzZXJpYWxpemUoT1N0cmVhbSAqc3RyZWFtKSBjb25zdAoreworICAgIC8vIE5lZWQgdG8gaWRlbnRpZnkgb3Vyc2VsdmVzCisgICAgc3RyZWFtLT5hZGRVMzIoKHVpbnQzMl90KWdldENsYXNzSWQoKSk7CisKKyAgICBTdHJpbmc4IG5hbWUoZ2V0TmFtZSgpKTsKKyAgICBzdHJlYW0tPmFkZFN0cmluZygmbmFtZSk7CisKKyAgICAvLyBGaXJzdCB0aGluZyB3ZSBuZWVkIHRvIHNlcmlhbGl6ZSBpcyB0aGUgdHlwZSBvYmplY3Qgc2luY2UgaXQgd2lsbCBiZSBuZWVkZWQKKyAgICAvLyB0byBpbml0aWFsaXplIHRoZSBjbGFzcworICAgIG1UeXBlLT5zZXJpYWxpemUoc3RyZWFtKTsKKworICAgIHVpbnQzMl90IGRhdGFTaXplID0gbVR5cGUtPmdldFNpemVCeXRlcygpOworICAgIC8vIFdyaXRlIGhvdyBtdWNoIGRhdGEgd2UgYXJlIHN0b3JpbmcKKyAgICBzdHJlYW0tPmFkZFUzMihkYXRhU2l6ZSk7CisgICAgLy8gTm93IHdyaXRlIHRoZSBkYXRhCisgICAgc3RyZWFtLT5hZGRCeXRlQXJyYXkobVB0ciwgZGF0YVNpemUpOworfQorCitBbGxvY2F0aW9uICpBbGxvY2F0aW9uOjpjcmVhdGVGcm9tU3RyZWFtKENvbnRleHQgKnJzYywgSVN0cmVhbSAqc3RyZWFtKQoreworICAgIC8vIEZpcnN0IG1ha2Ugc3VyZSB3ZSBhcmUgcmVhZGluZyB0aGUgY29ycmVjdCBvYmplY3QKKyAgICBSc0EzRENsYXNzSUQgY2xhc3NJRCA9IChSc0EzRENsYXNzSUQpc3RyZWFtLT5sb2FkVTMyKCk7CisgICAgaWYoY2xhc3NJRCAhPSBSU19BM0RfQ0xBU1NfSURfQUxMT0NBVElPTikgeworICAgICAgICBMT0dFKCJhbGxvY2F0aW9uIGxvYWRpbmcgc2tpcHBlZCBkdWUgdG8gaW52YWxpZCBjbGFzcyBpZFxuIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIFN0cmluZzggbmFtZTsKKyAgICBzdHJlYW0tPmxvYWRTdHJpbmcoJm5hbWUpOworCisgICAgVHlwZSAqdHlwZSA9IFR5cGU6OmNyZWF0ZUZyb21TdHJlYW0ocnNjLCBzdHJlYW0pOworICAgIGlmKCF0eXBlKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICB0eXBlLT5jb21wdXRlKCk7CisKKyAgICAvLyBOdW1iZXIgb2YgYnl0ZXMgd2Ugd3JvdGUgb3V0IGZvciB0aGlzIGFsbG9jYXRpb24KKyAgICB1aW50MzJfdCBkYXRhU2l6ZSA9IHN0cmVhbS0+bG9hZFUzMigpOworICAgIGlmKGRhdGFTaXplICE9IHR5cGUtPmdldFNpemVCeXRlcygpKSB7CisgICAgICAgIExPR0UoImZhaWxlZCB0byByZWFkIGFsbG9jYXRpb24gYmVjYXVzZSBudW1ieXRlcyB3cml0dGVuIGlzIG5vdCB0aGUgc2FtZSBsb2FkZWQgdHlwZSB3YW50c1xuIik7CisgICAgICAgIGRlbGV0ZSB0eXBlOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBBbGxvY2F0aW9uICphbGxvYyA9IG5ldyBBbGxvY2F0aW9uKHJzYywgdHlwZSk7CisgICAgYWxsb2MtPnNldE5hbWUobmFtZS5zdHJpbmcoKSwgbmFtZS5zaXplKCkpOworCisgICAgLy8gUmVhZCBpbiBhbGwgb2Ygb3VyIGFsbG9jYXRpb24gZGF0YQorICAgIGFsbG9jLT5kYXRhKHN0cmVhbS0+Z2V0UHRyKCkgKyBzdHJlYW0tPmdldFBvcygpLCBkYXRhU2l6ZSk7CisgICAgc3RyZWFtLT5yZXNldChzdHJlYW0tPmdldFBvcygpICsgZGF0YVNpemUpOworCisgICAgcmV0dXJuIGFsbG9jOworfQorCiB2b2lkIEFsbG9jYXRpb246OnNlbmREaXJ0eSgpIGNvbnN0CiB7CiAgICAgZm9yIChzaXplX3QgY3Q9MDsgY3QgPCBtVG9EaXJ0eUxpc3Quc2l6ZSgpOyBjdCsrKSB7CkBAIC0zMjMsNiArNDA3LDMyIEBACiAgICAgfQogfQogCit2b2lkIEFsbG9jYXRpb246OmluY1JlZnMoY29uc3Qgdm9pZCAqcHRyLCBzaXplX3QgY3QpIGNvbnN0Cit7CisgICAgY29uc3QgdWludDhfdCAqcCA9IHN0YXRpY19jYXN0PGNvbnN0IHVpbnQ4X3QgKj4ocHRyKTsKKyAgICBjb25zdCBFbGVtZW50ICplID0gbVR5cGUtPmdldEVsZW1lbnQoKTsKKyAgICB1aW50MzJfdCBzdHJpZGUgPSBlLT5nZXRTaXplQnl0ZXMoKTsKKworICAgIHdoaWxlIChjdCA+IDApIHsKKyAgICAgICAgZS0+aW5jUmVmcyhwKTsKKyAgICAgICAgY3QgLS07CisgICAgICAgIHAgKz0gc3RyaWRlOworICAgIH0KK30KKwordm9pZCBBbGxvY2F0aW9uOjpkZWNSZWZzKGNvbnN0IHZvaWQgKnB0ciwgc2l6ZV90IGN0KSBjb25zdAoreworICAgIGNvbnN0IHVpbnQ4X3QgKnAgPSBzdGF0aWNfY2FzdDxjb25zdCB1aW50OF90ICo+KHB0cik7CisgICAgY29uc3QgRWxlbWVudCAqZSA9IG1UeXBlLT5nZXRFbGVtZW50KCk7CisgICAgdWludDMyX3Qgc3RyaWRlID0gZS0+Z2V0U2l6ZUJ5dGVzKCk7CisKKyAgICB3aGlsZSAoY3QgPiAwKSB7CisgICAgICAgIGUtPmRlY1JlZnMocCk7CisgICAgICAgIGN0IC0tOworICAgICAgICBwICs9IHN0cmlkZTsKKyAgICB9Cit9CisKIC8vLy8vLy8vLy8vLy8vLy8vCiAvLwogCkBAIC00OTUsNyArNjA1LDcgQEAKICAgICBpZiAoc3JjR0xUeXBlID09IEdMX1VOU0lHTkVEX0JZVEUgJiYKICAgICAgICAgc3JjR0xGbXQgPT0gR0xfUkdCICYmCiAgICAgICAgIGRzdEdMVHlwZSA9PSBHTF9VTlNJR05FRF9TSE9SVF81XzZfNSAmJgotICAgICAgICBkc3RHTFR5cGUgPT0gR0xfUkdCKSB7CisgICAgICAgIGRzdEdMRm10ID09IEdMX1JHQikgewogCiAgICAgICAgIHJldHVybiBlbGVtZW50Q29udmVydGVyXzg4OF90b181NjU7CiAgICAgfQpAQCAtNTAzLDE1ICs2MTMsMjEgQEAKICAgICBpZiAoc3JjR0xUeXBlID09IEdMX1VOU0lHTkVEX0JZVEUgJiYKICAgICAgICAgc3JjR0xGbXQgPT0gR0xfUkdCQSAmJgogICAgICAgICBkc3RHTFR5cGUgPT0gR0xfVU5TSUdORURfU0hPUlRfNV82XzUgJiYKLSAgICAgICAgZHN0R0xUeXBlID09IEdMX1JHQikgeworICAgICAgICBkc3RHTEZtdCA9PSBHTF9SR0IpIHsKIAogICAgICAgICByZXR1cm4gZWxlbWVudENvbnZlcnRlcl84ODg4X3RvXzU2NTsKICAgICB9CiAKICAgICBMT0dFKCJwaWNrQ29udmVydGVyLCB1bnN1cG9ydGVkIGNvbWJvLCBzcmMgJXAsICBkc3QgJXAiLCBzcmMsIGRzdCk7CisgICAgTE9HRSgicGlja0NvbnZlcnRlciwgc3JjR0xUeXBlID0gJXgsICBzcmNHTEZtdCA9ICV4Iiwgc3JjR0xUeXBlLCBzcmNHTEZtdCk7CisgICAgTE9HRSgicGlja0NvbnZlcnRlciwgZHN0R0xUeXBlID0gJXgsICBkc3RHTEZtdCA9ICV4IiwgZHN0R0xUeXBlLCBkc3RHTEZtdCk7CisgICAgc3JjLT5kdW1wTE9HVigiU1JDICIpOworICAgIGRzdC0+ZHVtcExPR1YoIkRTVCAiKTsKICAgICByZXR1cm4gMDsKIH0KIAorI2lmbmRlZiBBTkRST0lEX1JTX0JVSUxEX0ZPUl9IT1NUCisKIFJzQWxsb2NhdGlvbiByc2lfQWxsb2NhdGlvbkNyZWF0ZUJpdG1hcFJlZihDb250ZXh0ICpyc2MsIFJzVHlwZSB2dHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpibXAsIHZvaWQgKmNhbGxiYWNrRGF0YSwgUnNCaXRtYXBDYWxsYmFja190IGNhbGxiYWNrKQogewpAQCAtNjEzLDYgKzcyOSwxNSBAQAogICAgIGEtPnJlYWQoZGF0YSk7CiB9CiAKK2NvbnN0IHZvaWQqIHJzaV9BbGxvY2F0aW9uR2V0VHlwZShDb250ZXh0ICpyc2MsIFJzQWxsb2NhdGlvbiB2YSkKK3sKKyAgICBBbGxvY2F0aW9uICphID0gc3RhdGljX2Nhc3Q8QWxsb2NhdGlvbiAqPih2YSk7CisgICAgYS0+Z2V0VHlwZSgpLT5pbmNVc2VyUmVmKCk7CisKKyAgICByZXR1cm4gYS0+Z2V0VHlwZSgpOworfQorCisjZW5kaWYgLy9BTkRST0lEX1JTX0JVSUxEX0ZPUl9IT1NUCiAKIH0KIH0KZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNBbGxvY2F0aW9uLmggYi9saWJzL3JzL3JzQWxsb2NhdGlvbi5oCmluZGV4IDUxNmY4YjcuLjE3N2Q1YTQgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNBbGxvY2F0aW9uLmgKKysrIGIvbGlicy9ycy9yc0FsbG9jYXRpb24uaApAQCAtNzIsOSArNzIsMTggQEAKICAgICB2b2lkIHJlbW92ZVByb2dyYW1Ub0RpcnR5KGNvbnN0IFByb2dyYW0gKik7CiAKICAgICB2aXJ0dWFsIHZvaWQgZHVtcExPR1YoY29uc3QgY2hhciAqcHJlZml4KSBjb25zdDsKKyAgICB2aXJ0dWFsIHZvaWQgc2VyaWFsaXplKE9TdHJlYW0gKnN0cmVhbSkgY29uc3Q7CisgICAgdmlydHVhbCBSc0EzRENsYXNzSUQgZ2V0Q2xhc3NJZCgpIGNvbnN0IHsgcmV0dXJuIFJTX0EzRF9DTEFTU19JRF9BTExPQ0FUSU9OOyB9CisgICAgc3RhdGljIEFsbG9jYXRpb24gKmNyZWF0ZUZyb21TdHJlYW0oQ29udGV4dCAqcnNjLCBJU3RyZWFtICpzdHJlYW0pOwogCiAgICAgdmlydHVhbCB2b2lkIHVwbG9hZENoZWNrKGNvbnN0IENvbnRleHQgKnJzYyk7CiAKKyAgICBib29sIGdldElzVGV4dHVyZSgpIGNvbnN0IHtyZXR1cm4gbUlzVGV4dHVyZTt9CisgICAgYm9vbCBnZXRJc0J1ZmZlck9iamVjdCgpIGNvbnN0IHtyZXR1cm4gbUlzVmVydGV4QnVmZmVyO30KKworICAgIHZvaWQgaW5jUmVmcyhjb25zdCB2b2lkICpwdHIsIHNpemVfdCBjdCkgY29uc3Q7CisgICAgdm9pZCBkZWNSZWZzKGNvbnN0IHZvaWQgKnB0ciwgc2l6ZV90IGN0KSBjb25zdDsKKwogcHJvdGVjdGVkOgogICAgIHZvaWQgc2VuZERpcnR5KCkgY29uc3Q7CiAKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNBbmltYXRpb24uY3BwIGIvbGlicy9ycy9yc0FuaW1hdGlvbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjIwMDcxNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvcnNBbmltYXRpb24uY3BwCkBAIC0wLDAgKzEsMTQ5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1JTX0JVSUxEX0ZPUl9IT1NUCisjaW5jbHVkZSAicnNDb250ZXh0LmgiCisjZWxzZQorI2luY2x1ZGUgInJzQ29udGV4dEhvc3RTdHViLmgiCisjZW5kaWYgLy9BTkRST0lEX1JTX0JVSUxEX0ZPUl9IT1NUCisKKyNpbmNsdWRlICJyc0FuaW1hdGlvbi5oIgorCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OnJlbmRlcnNjcmlwdDsKKwordm9pZCBBbmltYXRpb246OnNlcmlhbGl6ZShPU3RyZWFtICpzdHJlYW0pIGNvbnN0Cit7CisgICAgCit9CisKK0FuaW1hdGlvbiAqQW5pbWF0aW9uOjpjcmVhdGVGcm9tU3RyZWFtKENvbnRleHQgKnJzYywgSVN0cmVhbSAqc3RyZWFtKQoreworICAgIHJldHVybiBOVUxMOworfQorCisvKgorQW5pbWF0aW9uOjpBbmltYXRpb24oQ29udGV4dCAqcnNjKSA6IE9iamVjdEJhc2UocnNjKQoreworICAgIG1BbGxvY0ZpbGUgPSBfX0ZJTEVfXzsKKyAgICBtQWxsb2NMaW5lID0gX19MSU5FX187CisKKyAgICBtVmFsdWVzSW5wdXQgPSBOVUxMOworICAgIG1WYWx1ZXNPdXRwdXQgPSBOVUxMOworICAgIG1WYWx1ZUNvdW50ID0gMDsKKyAgICBtSW50ZXJwb2xhdGlvbiA9IFJTX0FOSU1BVElPTl9JTlRFUlBPTEFUSU9OX1NURVA7CisgICAgbUVkZ2VQcmUgPSBSU19BTklNQVRJT05fRURHRV9VTkRFRklORUQ7CisgICAgbUVkZ2VQb3N0ID0gUlNfQU5JTUFUSU9OX0VER0VfVU5ERUZJTkVEOworICAgIG1JbnB1dE1pbiA9IDA7CisgICAgbUlucHV0TWF4ID0gMDsKK30KKworQW5pbWF0aW9uICogQW5pbWF0aW9uOjpjcmVhdGUoQ29udGV4dCAqcnNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKmluVmFsdWVzLCBjb25zdCBmbG9hdCAqb3V0VmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdmFsdWVDb3VudCwgUnNBbmltYXRpb25JbnRlcnBvbGF0aW9uIGludGVycCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJzQW5pbWF0aW9uRWRnZSBwcmUsIFJzQW5pbWF0aW9uRWRnZSBwb3N0KQoreworICAgIGlmICh2YWx1ZUNvdW50IDwgMikgeworICAgICAgICByc2MtPnNldEVycm9yKFJTX0VSUk9SX0JBRF9WQUxVRSwgIkFuaW1hdGlvbnMgcmVxdWlyZSBtb3JlIHRoYW4gMiB2YWx1ZXMuIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBBbmltYXRpb24gKmEgPSBuZXcgQW5pbWF0aW9uKHJzYyk7CisgICAgaWYgKCFhKSB7CisgICAgICAgIHJzYy0+c2V0RXJyb3IoUlNfRVJST1JfT1VUX09GX01FTU9SWSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGZsb2F0ICp2aW4gPSAoZmxvYXQgKiltYWxsb2ModmFsdWVDb3VudCAqIHNpemVvZihmbG9hdCkpOworICAgIGZsb2F0ICp2b3V0ID0gKGZsb2F0ICopbWFsbG9jKHZhbHVlQ291bnQgKiBzaXplb2YoZmxvYXQpKTsKKyAgICBhLT5tVmFsdWVzSW5wdXQgPSB2aW47CisgICAgYS0+bVZhbHVlc091dHB1dCA9IHZvdXQ7CisgICAgaWYgKGEtPm1WYWx1ZXNJbnB1dCA9PSBOVUxMIHx8IGEtPm1WYWx1ZXNPdXRwdXQgPT0gTlVMTCkgeworICAgICAgICBkZWxldGUgYTsKKyAgICAgICAgcnNjLT5zZXRFcnJvcihSU19FUlJPUl9PVVRfT0ZfTUVNT1JZKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgYS0+bUVkZ2VQcmUgPSBwcmU7CisgICAgYS0+bUVkZ2VQb3N0ID0gcG9zdDsKKyAgICBhLT5tSW50ZXJwb2xhdGlvbiA9IGludGVycDsKKyAgICBhLT5tVmFsdWVDb3VudCA9IHZhbHVlQ291bnQ7CisKKyAgICBtZW1jcHkodmluLCBpblZhbHVlcywgdmFsdWVDb3VudCAqIHNpemVvZihmbG9hdCkpOworICAgIG1lbWNweSh2b3V0LCBvdXRWYWx1ZXMsIHZhbHVlQ291bnQgKiBzaXplb2YoZmxvYXQpKTsKKyAgICBhLT5tSW5wdXRNaW4gPSBpblZhbHVlc1swXTsKKyAgICBhLT5tSW5wdXRNYXggPSBpblZhbHVlc1swXTsKKworICAgIGJvb2wgbmVlZFNvcnQgPSBmYWxzZTsKKyAgICBmb3IgKHVpbnQzMl90IGN0PTE7IGN0IDwgdmFsdWVDb3VudDsgY3QrKykgeworICAgICAgICBpZiAoYS0+bUlucHV0TWluID4gdmluW2N0XSkgeworICAgICAgICAgICAgbmVlZFNvcnQgPSB0cnVlOworICAgICAgICAgICAgYS0+bUlucHV0TWluID0gdmluW2N0XTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYS0+bUlucHV0TWF4IDwgdmluW2N0XSkgeworICAgICAgICAgICAgYS0+bUlucHV0TWF4ID0gdmluW2N0XTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG5lZWRTb3J0ID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHdoaWxlICgxKSB7CisgICAgICAgIGJvb2wgY2hhbmdlZCA9IGZhbHNlOworICAgICAgICBmb3IgKHVpbnQzMl90IGN0PTE7IGN0IDwgdmFsdWVDb3VudDsgY3QrKykgeworICAgICAgICAgICAgaWYgKHZpbltjdC0xXSA+IHZpbltjdF0pIHsKKyAgICAgICAgICAgICAgICBmbG9hdCB0ID0gdmluW2N0LTFdOworICAgICAgICAgICAgICAgIHZpbltjdC0xXSA9IHZpbltjdF07CisgICAgICAgICAgICAgICAgdmluW2N0XSA9IHQ7CisgICAgICAgICAgICAgICAgdCA9IHZvdXRbY3QtMV07CisgICAgICAgICAgICAgICAgdm91dFtjdC0xXSA9IHZvdXRbY3RdOworICAgICAgICAgICAgICAgIHZvdXRbY3RdID0gdDsKKyAgICAgICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIWNoYW5nZWQpIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBhOworfQorKi8KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHJlbmRlcnNjcmlwdCB7CisKK1JzQW5pbWF0aW9uIHJzaV9BbmltYXRpb25DcmVhdGUoQ29udGV4dCAqcnNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqaW5WYWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICpvdXRWYWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHZhbHVlQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJzQW5pbWF0aW9uSW50ZXJwb2xhdGlvbiBpbnRlcnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJzQW5pbWF0aW9uRWRnZSBwcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJzQW5pbWF0aW9uRWRnZSBwb3N0KQoreworICAgIC8vTE9HRSgicnNpX0VsZW1lbnRDcmVhdGUgJWkgJWkgJWkgJWkiLCBkdCwgZGssIG5vcm0sIHZlY1NpemUpOworICAgIEFuaW1hdGlvbiAqYSA9IE5VTEw7Ly9BbmltYXRpb246OmNyZWF0ZShyc2MsIGluVmFsdWVzLCBvdXRWYWx1ZXMsIHZhbHVlQ291bnQsIGludGVycCwgcHJlLCBwb3N0KTsKKyAgICBpZiAoYSAhPSBOVUxMKSB7CisgICAgICAgIGEtPmluY1VzZXJSZWYoKTsKKyAgICB9CisgICAgcmV0dXJuIChSc0FuaW1hdGlvbilhOworfQorCisKK30KK30KKwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc0FuaW1hdGlvbi5oIGIvbGlicy9ycy9yc0FuaW1hdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0MDMxNGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL3JzQW5pbWF0aW9uLmgKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9SU19BTklNQVRJT05fSAorI2RlZmluZSBBTkRST0lEX1JTX0FOSU1BVElPTl9ICisKKyNpbmNsdWRlICJyc1V0aWxzLmgiCisjaW5jbHVkZSAicnNPYmplY3RCYXNlLmgiCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHJlbmRlcnNjcmlwdCB7CisKKworY2xhc3MgQW5pbWF0aW9uIDogcHVibGljIE9iamVjdEJhc2UKK3sKK3B1YmxpYzoKKyAgICB+QW5pbWF0aW9uKCk7CisKKyAgICBzdGF0aWMgQW5pbWF0aW9uICogY3JlYXRlKENvbnRleHQgKnJzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICppblZhbHVlcywgY29uc3QgZmxvYXQgKm91dFZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHZhbHVlQ291bnQsIFJzQW5pbWF0aW9uSW50ZXJwb2xhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJzQW5pbWF0aW9uRWRnZSBwcmUsIFJzQW5pbWF0aW9uRWRnZSBwb3N0KTsKKworICAgIGZsb2F0IGV2YWwoZmxvYXQpIGNvbnN0OworCisgICAgdmlydHVhbCB2b2lkIHNlcmlhbGl6ZShPU3RyZWFtICpzdHJlYW0pIGNvbnN0OworICAgIHZpcnR1YWwgUnNBM0RDbGFzc0lEIGdldENsYXNzSWQoKSBjb25zdCB7IHJldHVybiBSU19BM0RfQ0xBU1NfSURfQU5JTUFUSU9OOyB9CisgICAgc3RhdGljIEFuaW1hdGlvbiAqY3JlYXRlRnJvbVN0cmVhbShDb250ZXh0ICpyc2MsIElTdHJlYW0gKnN0cmVhbSk7CisKK3Byb3RlY3RlZDoKKyAgICBBbmltYXRpb24oQ29udGV4dCAqcnNjKTsKKworCisKKyAgICBmbG9hdCBldmFsSW5SYW5nZShmbG9hdCkgY29uc3Q7CisKKworCisgICAgY29uc3QgZmxvYXQgKm1WYWx1ZXNJbnB1dDsKKyAgICBjb25zdCBmbG9hdCAqbVZhbHVlc091dHB1dDsKKyAgICB1aW50MzJfdCBtVmFsdWVDb3VudDsKKyAgICBSc0FuaW1hdGlvbkludGVycG9sYXRpb24gbUludGVycG9sYXRpb247CisgICAgUnNBbmltYXRpb25FZGdlIG1FZGdlUHJlOworICAgIFJzQW5pbWF0aW9uRWRnZSBtRWRnZVBvc3Q7CisKKyAgICAvLyBkZXJpdmVkCisgICAgZmxvYXQgbUlucHV0TWluOworICAgIGZsb2F0IG1JbnB1dE1heDsKK307CisKKworCisKK30KK30KKyNlbmRpZiAvL0FORFJPSURfU1RSVUNUVVJFRF9FTEVNRU5UX0gKKwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc0NvbXBvbmVudC5jcHAgYi9saWJzL3JzL3JzQ29tcG9uZW50LmNwcAppbmRleCAxNWE1NmY3Li5mYmFhNzVmIDEwMDY0NAotLS0gYS9saWJzL3JzL3JzQ29tcG9uZW50LmNwcAorKysgYi9saWJzL3JzL3JzQ29tcG9uZW50LmNwcApAQCAtMTYsNyArMTYsMTEgQEAKIAogI2luY2x1ZGUgInJzQ29tcG9uZW50LmgiCiAKKyNpZm5kZWYgQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAogI2luY2x1ZGUgPEdMRVMvZ2wuaD4KKyNlbHNlCisjaW5jbHVkZSA8T3BlbkdML2dsLmg+CisjZW5kaWYKIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6cmVuZGVyc2NyaXB0OwpAQCAtMTQ4LDExICsxNTIsMTkgQEAKICAgICBjYXNlIFJTX1RZUEVfVU5TSUdORURfNjQ6CiAgICAgICAgIG1UeXBlQml0cyA9IDY0OwogICAgICAgICBicmVhazsKKworICAgIGNhc2UgUlNfVFlQRV9CT09MRUFOOgorICAgICAgICBtVHlwZUJpdHMgPSA4OworICAgICAgICBicmVhazsKICAgICB9CiAKICAgICBtQml0cyA9IG1UeXBlQml0cyAqIG1WZWN0b3JTaXplOwogfQogCitib29sIENvbXBvbmVudDo6aXNSZWZlcmVuY2UoKSBjb25zdAoreworICAgIHJldHVybiAobVR5cGUgPj0gUlNfVFlQRV9FTEVNRU5UKTsKK30KIAogCiAKQEAgLTE4OCw4MiArMjAwLDYgQEAKICAgICByZXR1cm4gMDsKIH0KIAotc3RhdGljIGNvbnN0IGNoYXIgKiBnQ1R5cGVTdHJpbmdzW10gPSB7Ci0gICAgMCwKLSAgICAwLC8vIkYxNiIsCi0gICAgImZsb2F0IiwKLSAgICAiZG91YmxlIiwKLSAgICAiY2hhciIsCi0gICAgInNob3J0IiwKLSAgICAiaW50IiwKLSAgICAwLC8vIlM2NCIsCi0gICAgImNoYXIiLC8vVTgiLAotICAgICJzaG9ydCIsLy9VMTYiLAotICAgICJpbnQiLC8vVTMyIiwKLSAgICAwLC8vIlU2NCIsCi0gICAgMCwvLyJVUF81NjUiLAotICAgIDAsLy8iVVBfNTU1MSIsCi0gICAgMCwvLyJVUF80NDQ0IiwKLSAgICAwLC8vIkVMRU1FTlQiLAotICAgIDAsLy8iVFlQRSIsCi0gICAgMCwvLyJBTExPQ0FUSU9OIiwKLSAgICAwLC8vIlNBTVBMRVIiLAotICAgIDAsLy8iU0NSSVBUIiwKLSAgICAwLC8vIk1FU0giLAotICAgIDAsLy8iUFJPR1JBTV9GUkFHTUVOVCIsCi0gICAgMCwvLyJQUk9HUkFNX1ZFUlRFWCIsCi0gICAgMCwvLyJQUk9HUkFNX1JBU1RFUiIsCi0gICAgMCwvLyJQUk9HUkFNX1NUT1JFIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogZ0NWZWNUeXBlU3RyaW5nc1tdID0gewotICAgIDAsCi0gICAgMCwvLyJGMTYiLAotICAgICJ2ZWNGMzIiLAotICAgICJ2ZWNGNjQiLAotICAgICJ2ZWNJOCIsCi0gICAgInZlY0kxNiIsCi0gICAgInZlY0kzMiIsCi0gICAgMCwvLyJTNjQiLAotICAgICJ2ZWNVOCIsLy9VOCIsCi0gICAgInZlY1UxNiIsLy9VMTYiLAotICAgICJ2ZWNVMzIiLC8vVTMyIiwKLSAgICAwLC8vIlU2NCIsCi0gICAgMCwvLyJVUF81NjUiLAotICAgIDAsLy8iVVBfNTU1MSIsCi0gICAgMCwvLyJVUF80NDQ0IiwKLSAgICAwLC8vIkVMRU1FTlQiLAotICAgIDAsLy8iVFlQRSIsCi0gICAgMCwvLyJBTExPQ0FUSU9OIiwKLSAgICAwLC8vIlNBTVBMRVIiLAotICAgIDAsLy8iU0NSSVBUIiwKLSAgICAwLC8vIk1FU0giLAotICAgIDAsLy8iUFJPR1JBTV9GUkFHTUVOVCIsCi0gICAgMCwvLyJQUk9HUkFNX1ZFUlRFWCIsCi0gICAgMCwvLyJQUk9HUkFNX1JBU1RFUiIsCi0gICAgMCwvLyJQUk9HUkFNX1NUT1JFIiwKLX07Ci0KLVN0cmluZzggQ29tcG9uZW50OjpnZXRDVHlwZSgpIGNvbnN0Ci17Ci0gICAgY2hhciBidWZbNjRdOwotICAgIGlmIChtVmVjdG9yU2l6ZSA9PSAxKSB7Ci0gICAgICAgIHJldHVybiBTdHJpbmc4KGdDVHlwZVN0cmluZ3NbbVR5cGVdKTsKLSAgICB9Ci0KLSAgICAvLyBZdWNrLCBhY2MgV0FSCi0gICAgLy8gQXBwZWFycyB0byBoYXZlIHByb2JsZW1zIHBhY2tpbmcgY2hhcnMKLSAgICBpZiAobVZlY3RvclNpemUgPT0gNCAmJiBtVHlwZSA9PSBSU19UWVBFX1VOU0lHTkVEXzgpIHsKLSAgICAgICAgcmV0dXJuIFN0cmluZzgoImludCIpOwotICAgIH0KLQotCi0gICAgU3RyaW5nOCBzKGdDVmVjVHlwZVN0cmluZ3NbbVR5cGVdKTsKLSAgICBzcHJpbnRmKGJ1ZiwgIl8laV90IiwgbVZlY3RvclNpemUpOwotICAgIHMuYXBwZW5kKGJ1Zik7Ci0gICAgcmV0dXJuIHM7Ci19Ci0KIFN0cmluZzggQ29tcG9uZW50OjpnZXRHTFNMVHlwZSgpIGNvbnN0CiB7CiAgICAgaWYgKG1UeXBlID09IFJTX1RZUEVfU0lHTkVEXzMyKSB7CkBAIC0yOTgsNiArMjM0LDcgQEAKICAgICAiVTE2IiwKICAgICAiVTMyIiwKICAgICAiVTY0IiwKKyAgICAiQk9PTEVBTiIsCiAgICAgIlVQXzU2NSIsCiAgICAgIlVQXzU1NTEiLAogICAgICJVUF80NDQ0IiwKQEAgLTMzNCw0ICsyNzEsMjUgQEAKICAgICAgICAgIHByZWZpeCwgZ1R5cGVTdHJpbmdzW21UeXBlXSwgZ0tpbmRTdHJpbmdzW21LaW5kXSwgbVZlY3RvclNpemUsIG1CaXRzKTsKIH0KIAordm9pZCBDb21wb25lbnQ6OnNlcmlhbGl6ZShPU3RyZWFtICpzdHJlYW0pIGNvbnN0Cit7CisgICAgc3RyZWFtLT5hZGRVOCgodWludDhfdCltVHlwZSk7CisgICAgc3RyZWFtLT5hZGRVOCgodWludDhfdCltS2luZCk7CisgICAgc3RyZWFtLT5hZGRVOCgodWludDhfdCkobU5vcm1hbGl6ZWQgPyAxIDogMCkpOworICAgIHN0cmVhbS0+YWRkVTMyKG1WZWN0b3JTaXplKTsKK30KKwordm9pZCBDb21wb25lbnQ6OmxvYWRGcm9tU3RyZWFtKElTdHJlYW0gKnN0cmVhbSkKK3sKKyAgICBtVHlwZSA9IChSc0RhdGFUeXBlKXN0cmVhbS0+bG9hZFU4KCk7CisgICAgbUtpbmQgPSAoUnNEYXRhS2luZClzdHJlYW0tPmxvYWRVOCgpOworICAgIHVpbnQ4X3QgdGVtcCA9IHN0cmVhbS0+bG9hZFU4KCk7CisgICAgbU5vcm1hbGl6ZWQgPSB0ZW1wICE9IDA7CisgICAgbVZlY3RvclNpemUgPSBzdHJlYW0tPmxvYWRVMzIoKTsKKworICAgIHNldChtVHlwZSwgbUtpbmQsIG1Ob3JtYWxpemVkLCBtVmVjdG9yU2l6ZSk7Cit9CisKKworCiAKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNDb21wb25lbnQuaCBiL2xpYnMvcnMvcnNDb21wb25lbnQuaAppbmRleCA3MWRlMzI0Li5hNzc1MDUxIDEwMDY0NAotLS0gYS9saWJzL3JzL3JzQ29tcG9uZW50LmgKKysrIGIvbGlicy9ycy9yc0NvbXBvbmVudC5oCkBAIC0zNSw3ICszNSw2IEBACiAKICAgICB1aW50MzJfdCBnZXRHTFR5cGUoKSBjb25zdDsKICAgICB1aW50MzJfdCBnZXRHTEZvcm1hdCgpIGNvbnN0OwotICAgIFN0cmluZzggZ2V0Q1R5cGUoKSBjb25zdDsKICAgICBTdHJpbmc4IGdldEdMU0xUeXBlKCkgY29uc3Q7CiAgICAgdm9pZCBkdW1wTE9HVihjb25zdCBjaGFyICpwcmVmaXgpIGNvbnN0OwogCkBAIC00OCw2ICs0NywxMiBAQAogICAgIGJvb2wgZ2V0SXNTaWduZWQoKSBjb25zdCB7cmV0dXJuIG1Jc1NpZ25lZDt9CiAgICAgdWludDMyX3QgZ2V0Qml0cygpIGNvbnN0IHtyZXR1cm4gbUJpdHM7fQogCisgICAgLy8gSGVscGVycyBmb3IgcmVhZGluZyAvIHdyaXRpbmcgdGhpcyBjbGFzcyBvdXQKKyAgICB2b2lkIHNlcmlhbGl6ZShPU3RyZWFtICpzdHJlYW0pIGNvbnN0OworICAgIHZvaWQgbG9hZEZyb21TdHJlYW0oSVN0cmVhbSAqc3RyZWFtKTsKKworICAgIGJvb2wgaXNSZWZlcmVuY2UoKSBjb25zdDsKKwogcHJvdGVjdGVkOgogICAgIFJzRGF0YVR5cGUgbVR5cGU7CiAgICAgUnNEYXRhS2luZCBtS2luZDsKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNDb250ZXh0LmNwcCBiL2xpYnMvcnMvcnNDb250ZXh0LmNwcAppbmRleCA1OTZmNTMzLi4wOGRkNTdiIDEwMDY0NAotLS0gYS9saWJzL3JzL3JzQ29udGV4dC5jcHAKKysrIGIvbGlicy9ycy9yc0NvbnRleHQuY3BwCkBAIC0yMyw2ICsyMyw3IEBACiAKICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KKyNpbmNsdWRlIDxzY2hlZC5oPgogCiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KIApAQCAtMTI3LDE5ICsxMjgsMjEgQEAKIH0KIAogCi11aW50MzJfdCBDb250ZXh0OjpydW5TY3JpcHQoU2NyaXB0ICpzLCB1aW50MzJfdCBsYXVuY2hJRCkKK3VpbnQzMl90IENvbnRleHQ6OnJ1blNjcmlwdChTY3JpcHQgKnMpCiB7CiAgICAgT2JqZWN0QmFzZVJlZjxQcm9ncmFtRnJhZ21lbnQ+IGZyYWcobUZyYWdtZW50KTsKICAgICBPYmplY3RCYXNlUmVmPFByb2dyYW1WZXJ0ZXg+IHZ0eChtVmVydGV4KTsKLSAgICBPYmplY3RCYXNlUmVmPFByb2dyYW1GcmFnbWVudFN0b3JlPiBzdG9yZShtRnJhZ21lbnRTdG9yZSk7CisgICAgT2JqZWN0QmFzZVJlZjxQcm9ncmFtU3RvcmU+IHN0b3JlKG1GcmFnbWVudFN0b3JlKTsKICAgICBPYmplY3RCYXNlUmVmPFByb2dyYW1SYXN0ZXI+IHJhc3RlcihtUmFzdGVyKTsKKyAgICBPYmplY3RCYXNlUmVmPEZvbnQ+IGZvbnQobUZvbnQpOwogCi0gICAgdWludDMyX3QgcmV0ID0gcy0+cnVuKHRoaXMsIGxhdW5jaElEKTsKKyAgICB1aW50MzJfdCByZXQgPSBzLT5ydW4odGhpcyk7CiAKICAgICBtRnJhZ21lbnQuc2V0KGZyYWcpOwogICAgIG1WZXJ0ZXguc2V0KHZ0eCk7CiAgICAgbUZyYWdtZW50U3RvcmUuc2V0KHN0b3JlKTsKICAgICBtUmFzdGVyLnNldChyYXN0ZXIpOworICAgIG1Gb250LnNldChmb250KTsKICAgICByZXR1cm4gcmV0OwogfQogCkBAIC0xNTMsMjkgKzE1NiwxMSBAQAogCiB1aW50MzJfdCBDb250ZXh0OjpydW5Sb290U2NyaXB0KCkKIHsKLSAgICB0aW1lclNldChSU19USU1FUl9DTEVBUl9TV0FQKTsKLSAgICByc0Fzc2VydChtUm9vdFNjcmlwdC0+bUVudmlyb21lbnQubUlzUm9vdCk7Ci0KLSAgICBlZ2xRdWVyeVN1cmZhY2UobUVHTC5tRGlzcGxheSwgbUVHTC5tU3VyZmFjZSwgRUdMX1dJRFRILCAmbUVHTC5tV2lkdGgpOwotICAgIGVnbFF1ZXJ5U3VyZmFjZShtRUdMLm1EaXNwbGF5LCBtRUdMLm1TdXJmYWNlLCBFR0xfSEVJR0hULCAmbUVHTC5tSGVpZ2h0KTsKLSAgICBnbFZpZXdwb3J0KDAsIDAsIG1FR0wubVdpZHRoLCBtRUdMLm1IZWlnaHQpOwotICAgIGdsQ29sb3JNYXNrKEdMX1RSVUUsIEdMX1RSVUUsIEdMX1RSVUUsIEdMX1RSVUUpOwotCi0gICAgZ2xDbGVhckNvbG9yKG1Sb290U2NyaXB0LT5tRW52aXJvbWVudC5tQ2xlYXJDb2xvclswXSwKLSAgICAgICAgICAgICAgICAgbVJvb3RTY3JpcHQtPm1FbnZpcm9tZW50Lm1DbGVhckNvbG9yWzFdLAotICAgICAgICAgICAgICAgICBtUm9vdFNjcmlwdC0+bUVudmlyb21lbnQubUNsZWFyQ29sb3JbMl0sCi0gICAgICAgICAgICAgICAgIG1Sb290U2NyaXB0LT5tRW52aXJvbWVudC5tQ2xlYXJDb2xvclszXSk7Ci0gICAgaWYgKG1Vc2VEZXB0aCkgewotICAgICAgICBnbERlcHRoTWFzayhHTF9UUlVFKTsKLSAgICAgICAgZ2xDbGVhckRlcHRoZihtUm9vdFNjcmlwdC0+bUVudmlyb21lbnQubUNsZWFyRGVwdGgpOwotICAgICAgICBnbENsZWFyKEdMX0NPTE9SX0JVRkZFUl9CSVQgfCBHTF9ERVBUSF9CVUZGRVJfQklUKTsKLSAgICB9IGVsc2UgewotICAgICAgICBnbENsZWFyKEdMX0NPTE9SX0JVRkZFUl9CSVQpOwotICAgIH0KKyAgICBnbFZpZXdwb3J0KDAsIDAsIG1XaWR0aCwgbUhlaWdodCk7CiAKICAgICB0aW1lclNldChSU19USU1FUl9TQ1JJUFQpOwogICAgIG1TdGF0ZUZyYWdtZW50U3RvcmUubUxhc3QuY2xlYXIoKTsKLSAgICB1aW50MzJfdCByZXQgPSBydW5TY3JpcHQobVJvb3RTY3JpcHQuZ2V0KCksIDApOworICAgIHVpbnQzMl90IHJldCA9IHJ1blNjcmlwdChtUm9vdFNjcmlwdC5nZXQoKSk7CiAKICAgICBjaGVja0Vycm9yKCJydW5Sb290U2NyaXB0Iik7CiAgICAgaWYgKG1FcnJvciAhPSBSU19FUlJPUl9OT05FKSB7CkBAIC0yNzQsNiArMjU5LDI0IEBACiAgICAgcmV0dXJuIDAgIT0gc3RyY21wKGJ1ZiwgIjAiKTsKIH0KIAordm9pZCBDb250ZXh0OjpkaXNwbGF5RGVidWdTdGF0cygpCit7CisgICAgY2hhciBidWZmZXJbMTI4XTsKKyAgICBzcHJpbnRmKGJ1ZmZlciwgIkZyYW1lICVpIG1zLCBTY3JpcHQgJWkgbXMiLCBtVGltZU1TTGFzdEZyYW1lLCBtVGltZU1TTGFzdFNjcmlwdCk7CisgICAgZmxvYXQgb2xkUiwgb2xkRywgb2xkQiwgb2xkQTsKKyAgICBtU3RhdGVGb250LmdldEZvbnRDb2xvcigmb2xkUiwgJm9sZEcsICZvbGRCLCAmb2xkQSk7CisKKyAgICBmbG9hdCBzaGFkb3dDb2wgPSAwLjJmOworICAgIG1TdGF0ZUZvbnQuc2V0Rm9udENvbG9yKHNoYWRvd0NvbCwgc2hhZG93Q29sLCBzaGFkb3dDb2wsIDEuMGYpOworICAgIG1TdGF0ZUZvbnQucmVuZGVyVGV4dChidWZmZXIsIDUsIGdldEhlaWdodCgpIC0gNSk7CisKKyAgICBmbG9hdCB0ZXh0Q29sID0gMC45ZjsKKyAgICBtU3RhdGVGb250LnNldEZvbnRDb2xvcih0ZXh0Q29sLCB0ZXh0Q29sLCB0ZXh0Q29sLCAxLjBmKTsKKyAgICBtU3RhdGVGb250LnJlbmRlclRleHQoYnVmZmVyLCA0LCBnZXRIZWlnaHQoKSAtIDYpOworCisgICAgbVN0YXRlRm9udC5zZXRGb250Q29sb3Iob2xkUiwgb2xkRywgb2xkQiwgb2xkQSk7Cit9CisKIHZvaWQgKiBDb250ZXh0Ojp0aHJlYWRQcm9jKHZvaWQgKnZyc2MpCiB7CiAgICAgIENvbnRleHQgKnJzYyA9IHN0YXRpY19jYXN0PENvbnRleHQgKj4odnJzYyk7CkBAIC0yODYsNiArMjg5LDcgQEAKICAgICAgcnNjLT5wcm9wcy5tTG9nU2NyaXB0cyA9IGdldFByb3AoImRlYnVnLnJzLnNjcmlwdCIpOwogICAgICByc2MtPnByb3BzLm1Mb2dPYmplY3RzID0gZ2V0UHJvcCgiZGVidWcucnMub2JqZWN0Iik7CiAgICAgIHJzYy0+cHJvcHMubUxvZ1NoYWRlcnMgPSBnZXRQcm9wKCJkZWJ1Zy5ycy5zaGFkZXIiKTsKKyAgICAgcnNjLT5wcm9wcy5tTG9nVmlzdWFsID0gZ2V0UHJvcCgiZGVidWcucnMudmlzdWFsIik7CiAKICAgICAgU2NyaXB0VExTU3RydWN0ICp0bHNTdHJ1Y3QgPSBuZXcgU2NyaXB0VExTU3RydWN0OwogICAgICBpZiAoIXRsc1N0cnVjdCkgewpAQCAtMzAwLDE0ICszMDQsMTYgQEAKICAgICAgfQogCiAgICAgIGlmIChyc2MtPm1Jc0dyYXBoaWNzQ29udGV4dCkgewotICAgICAgICAgcnNjLT5tU3RhdGVSYXN0ZXIuaW5pdChyc2MsIHJzYy0+bUVHTC5tV2lkdGgsIHJzYy0+bUVHTC5tSGVpZ2h0KTsKKyAgICAgICAgIHJzYy0+bVN0YXRlUmFzdGVyLmluaXQocnNjKTsKICAgICAgICAgIHJzYy0+c2V0UmFzdGVyKE5VTEwpOwotICAgICAgICAgcnNjLT5tU3RhdGVWZXJ0ZXguaW5pdChyc2MsIHJzYy0+bUVHTC5tV2lkdGgsIHJzYy0+bUVHTC5tSGVpZ2h0KTsKKyAgICAgICAgIHJzYy0+bVN0YXRlVmVydGV4LmluaXQocnNjKTsKICAgICAgICAgIHJzYy0+c2V0VmVydGV4KE5VTEwpOwotICAgICAgICAgcnNjLT5tU3RhdGVGcmFnbWVudC5pbml0KHJzYywgcnNjLT5tRUdMLm1XaWR0aCwgcnNjLT5tRUdMLm1IZWlnaHQpOworICAgICAgICAgcnNjLT5tU3RhdGVGcmFnbWVudC5pbml0KHJzYyk7CiAgICAgICAgICByc2MtPnNldEZyYWdtZW50KE5VTEwpOwotICAgICAgICAgcnNjLT5tU3RhdGVGcmFnbWVudFN0b3JlLmluaXQocnNjLCByc2MtPm1FR0wubVdpZHRoLCByc2MtPm1FR0wubUhlaWdodCk7CisgICAgICAgICByc2MtPm1TdGF0ZUZyYWdtZW50U3RvcmUuaW5pdChyc2MpOwogICAgICAgICAgcnNjLT5zZXRGcmFnbWVudFN0b3JlKE5VTEwpOworICAgICAgICAgcnNjLT5tU3RhdGVGb250LmluaXQocnNjKTsKKyAgICAgICAgIHJzYy0+c2V0Rm9udChOVUxMKTsKICAgICAgICAgIHJzYy0+bVN0YXRlVmVydGV4QXJyYXkuaW5pdChyc2MpOwogICAgICB9CiAKQEAgLTMyMSw2ICszMjcsMTEgQEAKICAgICAgICAgIHVpbnQzMl90IHRhcmdldFRpbWUgPSAwOwogICAgICAgICAgaWYgKG1EcmF3ICYmIHJzYy0+bUlzR3JhcGhpY3NDb250ZXh0KSB7CiAgICAgICAgICAgICAgdGFyZ2V0VGltZSA9IHJzYy0+cnVuUm9vdFNjcmlwdCgpOworCisgICAgICAgICAgICAgaWYocnNjLT5wcm9wcy5tTG9nVmlzdWFsKSB7CisgICAgICAgICAgICAgICAgIHJzYy0+ZGlzcGxheURlYnVnU3RhdHMoKTsKKyAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICBtRHJhdyA9IHRhcmdldFRpbWUgJiYgIXJzYy0+bVBhdXNlZDsKICAgICAgICAgICAgICByc2MtPnRpbWVyU2V0KFJTX1RJTUVSX0NMRUFSX1NXQVApOwogICAgICAgICAgICAgIGVnbFN3YXBCdWZmZXJzKHJzYy0+bUVHTC5tRGlzcGxheSwgcnNjLT5tRUdMLm1TdXJmYWNlKTsKQEAgLTMyOSw5ICszNDAsNiBAQAogICAgICAgICAgICAgIHJzYy0+dGltZXJQcmludCgpOwogICAgICAgICAgICAgIHJzYy0+dGltZXJSZXNldCgpOwogICAgICAgICAgfQotICAgICAgICAgaWYgKHJzYy0+bU9iakRlc3Ryb3kubU5lZWRUb0VtcHR5KSB7Ci0gICAgICAgICAgICAgcnNjLT5vYmpEZXN0cm95T09CUnVuKCk7Ci0gICAgICAgICB9CiAgICAgICAgICBpZiAocnNjLT5tVGhyZWFkUHJpb3JpdHkgPiAwICYmIHRhcmdldFRpbWUpIHsKICAgICAgICAgICAgICBpbnQzMl90IHQgPSAodGFyZ2V0VGltZSAtIChpbnQzMl90KShyc2MtPm1UaW1lTVNMYXN0U2NyaXB0ICsgcnNjLT5tVGltZU1TTGFzdFN3YXApKSAqIDEwMDA7CiAgICAgICAgICAgICAgaWYgKHQgPiAwKSB7CkBAIC0zNDYsMTcgKzM1NCwxNiBAQAogICAgICAgICAgcnNjLT5tRnJhZ21lbnQuY2xlYXIoKTsKICAgICAgICAgIHJzYy0+bVZlcnRleC5jbGVhcigpOwogICAgICAgICAgcnNjLT5tRnJhZ21lbnRTdG9yZS5jbGVhcigpOworICAgICAgICAgcnNjLT5tRm9udC5jbGVhcigpOwogICAgICAgICAgcnNjLT5tUm9vdFNjcmlwdC5jbGVhcigpOwogICAgICAgICAgcnNjLT5tU3RhdGVSYXN0ZXIuZGVpbml0KHJzYyk7CiAgICAgICAgICByc2MtPm1TdGF0ZVZlcnRleC5kZWluaXQocnNjKTsKICAgICAgICAgIHJzYy0+bVN0YXRlRnJhZ21lbnQuZGVpbml0KHJzYyk7CiAgICAgICAgICByc2MtPm1TdGF0ZUZyYWdtZW50U3RvcmUuZGVpbml0KHJzYyk7CisgICAgICAgICByc2MtPm1TdGF0ZUZvbnQuZGVpbml0KHJzYyk7CiAgICAgIH0KICAgICAgT2JqZWN0QmFzZTo6emVyb0FsbFVzZXJSZWYocnNjKTsKIAotICAgICByc2MtPm1PYmpEZXN0cm95Lm1OZWVkVG9FbXB0eSA9IHRydWU7Ci0gICAgIHJzYy0+b2JqRGVzdHJveU9PQlJ1bigpOwotCiAgICAgIGlmIChyc2MtPm1Jc0dyYXBoaWNzQ29udGV4dCkgewogICAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZnSW5pdE11dGV4KTsKICAgICAgICAgIHJzYy0+ZGVpbml0RUdMKCk7CkBAIC0zNjcsNiArMzc0LDQ5IEBACiAgICAgIHJldHVybiBOVUxMOwogfQogCit2b2lkICogQ29udGV4dDo6aGVscGVyVGhyZWFkUHJvYyh2b2lkICp2cnNjKQoreworICAgICBDb250ZXh0ICpyc2MgPSBzdGF0aWNfY2FzdDxDb250ZXh0ICo+KHZyc2MpOworICAgICB1aW50MzJfdCBpZHggPSAodWludDMyX3QpYW5kcm9pZF9hdG9taWNfaW5jKCZyc2MtPm1Xb3JrZXJzLm1MYXVuY2hDb3VudCk7CisKKyAgICAgTE9HVigiUlMgaGVscGVyVGhyZWFkIHN0YXJ0aW5nICVwIGlkeD0laSIsIHJzYywgaWR4KTsKKworICAgICByc2MtPm1Xb3JrZXJzLm1MYXVuY2hTaWduYWxzW2lkeF0uaW5pdCgpOworICAgICByc2MtPm1Xb3JrZXJzLm1OYXRpdmVUaHJlYWRJZFtpZHhdID0gZ2V0dGlkKCk7CisKKyAgICAgLy9jcHVfc2V0X3QgY3BzZXRbMTZdOworICAgICAvL2ludCByZXQgPSBzY2hlZF9nZXRhZmZpbml0eShyc2MtPm1Xb3JrZXJzLm1OYXRpdmVUaHJlYWRJZFtpZHhdLCBzaXplb2YoY3BzZXQpLCAmY3BzZXQpOworICAgICAvL0xPR0UoInJldCA9ICVpIiwgcmV0KTsKKworLy9zY2hlZF9zZXRhZmZpbml0eQorCisgICAgIHNldHByaW9yaXR5KFBSSU9fUFJPQ0VTUywgcnNjLT5tV29ya2Vycy5tTmF0aXZlVGhyZWFkSWRbaWR4XSwgcnNjLT5tVGhyZWFkUHJpb3JpdHkpOworICAgICB3aGlsZShyc2MtPm1SdW5uaW5nKSB7CisgICAgICAgICByc2MtPm1Xb3JrZXJzLm1MYXVuY2hTaWduYWxzW2lkeF0ud2FpdCgpOworICAgICAgICAgaWYgKHJzYy0+bVdvcmtlcnMubUxhdW5jaENhbGxiYWNrKSB7CisgICAgICAgICAgICByc2MtPm1Xb3JrZXJzLm1MYXVuY2hDYWxsYmFjayhyc2MtPm1Xb3JrZXJzLm1MYXVuY2hEYXRhLCBpZHgpOworICAgICAgICAgfQorICAgICAgICAgYW5kcm9pZF9hdG9taWNfZGVjKCZyc2MtPm1Xb3JrZXJzLm1SdW5uaW5nQ291bnQpOworICAgICAgICAgcnNjLT5tV29ya2Vycy5tQ29tcGxldGVTaWduYWwuc2V0KCk7CisgICAgIH0KKworICAgICBMT0dWKCJSUyBoZWxwZXJUaHJlYWQgZXhpdGluZyAlcCBpZHg9JWkiLCByc2MsIGlkeCk7CisgICAgIHJldHVybiBOVUxMOworfQorCit2b2lkIENvbnRleHQ6OmxhdW5jaFRocmVhZHMoV29ya2VyQ2FsbGJhY2tfdCBjYmssIHZvaWQgKmRhdGEpCit7CisgICAgbVdvcmtlcnMubUxhdW5jaERhdGEgPSBkYXRhOworICAgIG1Xb3JrZXJzLm1MYXVuY2hDYWxsYmFjayA9IGNiazsKKyAgICBtV29ya2Vycy5tUnVubmluZ0NvdW50ID0gKGludCltV29ya2Vycy5tQ291bnQ7CisgICAgZm9yICh1aW50MzJfdCBjdCA9IDA7IGN0IDwgbVdvcmtlcnMubUNvdW50OyBjdCsrKSB7CisgICAgICAgIG1Xb3JrZXJzLm1MYXVuY2hTaWduYWxzW2N0XS5zZXQoKTsKKyAgICB9CisgICAgd2hpbGUobVdvcmtlcnMubVJ1bm5pbmdDb3VudCkgeworICAgICAgICBtV29ya2Vycy5tQ29tcGxldGVTaWduYWwud2FpdCgpOworICAgIH0KK30KKwogdm9pZCBDb250ZXh0OjpzZXRQcmlvcml0eShpbnQzMl90IHApCiB7CiAgICAgLy8gTm90ZTogSWYgd2UgcHV0IHRoaXMgaW4gdGhlIHByb3BlciAiYmFja2dyb3VuZCIgcG9saWN5CkBAIC0zODMsNyArNDMzLDEwIEBACiAgICAgICAgIC8vIHN1Y2Nlc3M7IHJlc2V0IHRoZSBwcmlvcml0eSBhcyB3ZWxsCiAgICAgfQogI2Vsc2UKLSAgICAgICAgc2V0cHJpb3JpdHkoUFJJT19QUk9DRVNTLCBtTmF0aXZlVGhyZWFkSWQsIHApOworICAgIHNldHByaW9yaXR5KFBSSU9fUFJPQ0VTUywgbU5hdGl2ZVRocmVhZElkLCBwKTsKKyAgICBmb3IgKHVpbnQzMl90IGN0PTA7IGN0IDwgbVdvcmtlcnMubUNvdW50OyBjdCsrKSB7CisgICAgICAgIHNldHByaW9yaXR5KFBSSU9fUFJPQ0VTUywgbVdvcmtlcnMubU5hdGl2ZVRocmVhZElkW2N0XSwgcCk7CisgICAgfQogI2VuZGlmCiB9CiAKQEAgLTQyOSwyMCArNDgyLDM5IEBACiAKICAgICBtV25kU3VyZmFjZSA9IE5VTEw7CiAKLSAgICBvYmpEZXN0cm95T09CSW5pdCgpOwogICAgIHRpbWVySW5pdCgpOwogICAgIHRpbWVyU2V0KFJTX1RJTUVSX0lOVEVSTkFMKTsKIAotICAgIExPR1YoIlJTIExhdW5jaGluZyB0aHJlYWQiKTsKKyAgICBpbnQgY3B1ID0gc3lzY29uZihfU0NfTlBST0NFU1NPUlNfT05MTik7CisgICAgTE9HVigiUlMgTGF1bmNoaW5nIHRocmVhZChzKSwgcmVwb3J0ZWQgQ1BVIGNvdW50ICVpIiwgY3B1KTsKKyAgICBpZiAoY3B1IDwgMikgY3B1ID0gMDsKKworICAgIG1Xb3JrZXJzLm1Db3VudCA9ICh1aW50MzJfdCljcHU7CisgICAgbVdvcmtlcnMubVRocmVhZElkID0gKHB0aHJlYWRfdCAqKSBjYWxsb2MobVdvcmtlcnMubUNvdW50LCBzaXplb2YocHRocmVhZF90KSk7CisgICAgbVdvcmtlcnMubU5hdGl2ZVRocmVhZElkID0gKHBpZF90ICopIGNhbGxvYyhtV29ya2Vycy5tQ291bnQsIHNpemVvZihwaWRfdCkpOworICAgIG1Xb3JrZXJzLm1MYXVuY2hTaWduYWxzID0gbmV3IFNpZ25hbFttV29ya2Vycy5tQ291bnRdOworICAgIG1Xb3JrZXJzLm1MYXVuY2hDYWxsYmFjayA9IE5VTEw7CiAgICAgc3RhdHVzID0gcHRocmVhZF9jcmVhdGUoJm1UaHJlYWRJZCwgJnRocmVhZEF0dHIsIHRocmVhZFByb2MsIHRoaXMpOwogICAgIGlmIChzdGF0dXMpIHsKICAgICAgICAgTE9HRSgiRmFpbGVkIHRvIHN0YXJ0IHJzIGNvbnRleHQgdGhyZWFkLiIpOworICAgICAgICByZXR1cm47CiAgICAgfQotCiAgICAgd2hpbGUoIW1SdW5uaW5nKSB7CiAgICAgICAgIHVzbGVlcCgxMDApOwogICAgIH0KIAorICAgIG1Xb3JrZXJzLm1SdW5uaW5nQ291bnQgPSAwOworICAgIG1Xb3JrZXJzLm1MYXVuY2hDb3VudCA9IDA7CisgICAgZm9yICh1aW50MzJfdCBjdD0wOyBjdCA8IG1Xb3JrZXJzLm1Db3VudDsgY3QrKykgeworICAgICAgICBzdGF0dXMgPSBwdGhyZWFkX2NyZWF0ZSgmbVdvcmtlcnMubVRocmVhZElkW2N0XSwgJnRocmVhZEF0dHIsIGhlbHBlclRocmVhZFByb2MsIHRoaXMpOworICAgICAgICBpZiAoc3RhdHVzKSB7CisgICAgICAgICAgICBtV29ya2Vycy5tQ291bnQgPSBjdDsKKyAgICAgICAgICAgIExPR0UoIkNyZWF0ZWQgZmV3ZXIgdGhhbiBleHBlY3RlZCBudW1iZXIgb2YgUlMgdGhyZWFkcy4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisKICAgICBwdGhyZWFkX2F0dHJfZGVzdHJveSgmdGhyZWFkQXR0cik7CiB9CiAKQEAgLTQ1NSw4ICs1MjcsNiBAQAogCiAgICAgbUlPLnNodXRkb3duKCk7CiAgICAgaW50IHN0YXR1cyA9IHB0aHJlYWRfam9pbihtVGhyZWFkSWQsICZyZXMpOwotICAgIG1PYmpEZXN0cm95Lm1OZWVkVG9FbXB0eSA9IHRydWU7Ci0gICAgb2JqRGVzdHJveU9PQlJ1bigpOwogCiAgICAgLy8gR2xvYmFsIHN0cnVjdHVyZSBjbGVhbnVwLgogICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmZ0luaXRNdXRleCk7CkBAIC00NjksOCArNTM5LDYgQEAKICAgICAgICAgbURldiA9IE5VTEw7CiAgICAgfQogICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnSW5pdE11dGV4KTsKLQotICAgIG9iakRlc3Ryb3lPT0JEZXN0cm95KCk7CiB9CiAKIHZvaWQgQ29udGV4dDo6c2V0U3VyZmFjZSh1aW50MzJfdCB3LCB1aW50MzJfdCBoLCBBTmF0aXZlV2luZG93ICpzdXIpCkBAIC00ODYsMTQgKzU1NCwxNCBAQAogICAgICAgICBjaGVja0VnbEVycm9yKCJlZ2xEZXN0cm95U3VyZmFjZSIsIHJldCk7CiAKICAgICAgICAgbUVHTC5tU3VyZmFjZSA9IE5VTEw7Ci0gICAgICAgIG1FR0wubVdpZHRoID0gMDsKLSAgICAgICAgbUVHTC5tSGVpZ2h0ID0gMDsKICAgICAgICAgbVdpZHRoID0gMDsKICAgICAgICAgbUhlaWdodCA9IDA7CiAgICAgfQogCiAgICAgbVduZFN1cmZhY2UgPSBzdXI7CiAgICAgaWYgKG1XbmRTdXJmYWNlICE9IE5VTEwpIHsKKyAgICAgICAgbVdpZHRoID0gdzsKKyAgICAgICAgbUhlaWdodCA9IGg7CiAgICAgICAgIGJvb2wgZmlyc3QgPSBmYWxzZTsKICAgICAgICAgaWYgKCFtRUdMLm1Db250ZXh0KSB7CiAgICAgICAgICAgICBmaXJzdCA9IHRydWU7CkBAIC01MTEsMTUgKzU3OSw3IEBACiAgICAgICAgIHJldCA9IGVnbE1ha2VDdXJyZW50KG1FR0wubURpc3BsYXksIG1FR0wubVN1cmZhY2UsIG1FR0wubVN1cmZhY2UsIG1FR0wubUNvbnRleHQpOwogICAgICAgICBjaGVja0VnbEVycm9yKCJlZ2xNYWtlQ3VycmVudCIsIHJldCk7CiAKLSAgICAgICAgZWdsUXVlcnlTdXJmYWNlKG1FR0wubURpc3BsYXksIG1FR0wubVN1cmZhY2UsIEVHTF9XSURUSCwgJm1FR0wubVdpZHRoKTsKLSAgICAgICAgZWdsUXVlcnlTdXJmYWNlKG1FR0wubURpc3BsYXksIG1FR0wubVN1cmZhY2UsIEVHTF9IRUlHSFQsICZtRUdMLm1IZWlnaHQpOwotICAgICAgICBtV2lkdGggPSB3OwotICAgICAgICBtSGVpZ2h0ID0gaDsKLSAgICAgICAgbVN0YXRlVmVydGV4LnVwZGF0ZVNpemUodGhpcywgdywgaCk7Ci0KLSAgICAgICAgaWYgKChpbnQpbVdpZHRoICE9IG1FR0wubVdpZHRoIHx8IChpbnQpbUhlaWdodCAhPSBtRUdMLm1IZWlnaHQpIHsKLSAgICAgICAgICAgIExPR0UoIkVHTC9TdXJmYWNlIG1pc21hdGNoICBFR0wgKCVpIHggJWkpICBTRiAoJWkgeCAlaSkiLCBtRUdMLm1XaWR0aCwgbUVHTC5tSGVpZ2h0LCBtV2lkdGgsIG1IZWlnaHQpOwotICAgICAgICB9CisgICAgICAgIG1TdGF0ZVZlcnRleC51cGRhdGVTaXplKHRoaXMpOwogCiAgICAgICAgIGlmIChmaXJzdCkgewogICAgICAgICAgICAgbUdMLm1WZXJzaW9uID0gZ2xHZXRTdHJpbmcoR0xfVkVSU0lPTik7CkBAIC01ODMsNyArNjQzLDcgQEAKICAgICBtUm9vdFNjcmlwdC5zZXQocyk7CiB9CiAKLXZvaWQgQ29udGV4dDo6c2V0RnJhZ21lbnRTdG9yZShQcm9ncmFtRnJhZ21lbnRTdG9yZSAqcGZzKQordm9pZCBDb250ZXh0OjpzZXRGcmFnbWVudFN0b3JlKFByb2dyYW1TdG9yZSAqcGZzKQogewogICAgIHJzQXNzZXJ0KG1Jc0dyYXBoaWNzQ29udGV4dCk7CiAgICAgaWYgKHBmcyA9PSBOVUxMKSB7CkBAIC02MjMsNiArNjgzLDE2IEBACiAgICAgfQogfQogCit2b2lkIENvbnRleHQ6OnNldEZvbnQoRm9udCAqZikKK3sKKyAgICByc0Fzc2VydChtSXNHcmFwaGljc0NvbnRleHQpOworICAgIGlmIChmID09IE5VTEwpIHsKKyAgICAgICAgbUZvbnQuc2V0KG1TdGF0ZUZvbnQubURlZmF1bHQpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1Gb250LnNldChmKTsKKyAgICB9Cit9CisKIHZvaWQgQ29udGV4dDo6YXNzaWduTmFtZShPYmplY3RCYXNlICpvYmosIGNvbnN0IGNoYXIgKm5hbWUsIHVpbnQzMl90IGxlbikKIHsKICAgICByc0Fzc2VydCghb2JqLT5nZXROYW1lKCkpOwpAQCAtNjQwLDgzICs3MTAsNiBAQAogICAgIH0KIH0KIAotT2JqZWN0QmFzZSAqIENvbnRleHQ6Omxvb2t1cE5hbWUoY29uc3QgY2hhciAqbmFtZSkgY29uc3QKLXsKLSAgICBmb3Ioc2l6ZV90IGN0PTA7IGN0IDwgbU5hbWVzLnNpemUoKTsgY3QrKykgewotICAgICAgICBpZiAoIXN0cmNtcChuYW1lLCBtTmFtZXNbY3RdLT5nZXROYW1lKCkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbU5hbWVzW2N0XTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotdm9pZCBDb250ZXh0OjphcHBlbmROYW1lRGVmaW5lcyhTdHJpbmc4ICpzdHIpIGNvbnN0Ci17Ci0gICAgY2hhciBidWZbMjU2XTsKLSAgICBmb3IgKHNpemVfdCBjdD0wOyBjdCA8IG1OYW1lcy5zaXplKCk7IGN0KyspIHsKLSAgICAgICAgc3RyLT5hcHBlbmQoIiNkZWZpbmUgTkFNRURfIik7Ci0gICAgICAgIHN0ci0+YXBwZW5kKG1OYW1lc1tjdF0tPmdldE5hbWUoKSk7Ci0gICAgICAgIHN0ci0+YXBwZW5kKCIgIik7Ci0gICAgICAgIHNwcmludGYoYnVmLCAiJWlcbiIsIChpbnQpbU5hbWVzW2N0XSk7Ci0gICAgICAgIHN0ci0+YXBwZW5kKGJ1Zik7Ci0gICAgfQotfQotCi1ib29sIENvbnRleHQ6Om9iakRlc3Ryb3lPT0JJbml0KCkKLXsKLSAgICBpbnQgc3RhdHVzID0gcHRocmVhZF9tdXRleF9pbml0KCZtT2JqRGVzdHJveS5tTXV0ZXgsIE5VTEwpOwotICAgIGlmIChzdGF0dXMpIHsKLSAgICAgICAgTE9HRSgiQ29udGV4dDo6T2JqRGVzdHJveU9PQkluaXQgbXV0ZXggaW5pdCBmYWlsdXJlIik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgQ29udGV4dDo6b2JqRGVzdHJveU9PQlJ1bigpCi17Ci0gICAgaWYgKG1PYmpEZXN0cm95Lm1OZWVkVG9FbXB0eSkgewotICAgICAgICBpbnQgc3RhdHVzID0gcHRocmVhZF9tdXRleF9sb2NrKCZtT2JqRGVzdHJveS5tTXV0ZXgpOwotICAgICAgICBpZiAoc3RhdHVzKSB7Ci0gICAgICAgICAgICBMT0dFKCJDb250ZXh0OjpPYmpEZXN0cm95T09CUnVuOiBlcnJvciAlaSBsb2NraW5nIGZvciBPT0JSdW4uIiwgc3RhdHVzKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoc2l6ZV90IGN0ID0gMDsgY3QgPCBtT2JqRGVzdHJveS5tRGVzdHJveUxpc3Quc2l6ZSgpOyBjdCsrKSB7Ci0gICAgICAgICAgICBtT2JqRGVzdHJveS5tRGVzdHJveUxpc3RbY3RdLT5kZWNVc2VyUmVmKCk7Ci0gICAgICAgIH0KLSAgICAgICAgbU9iakRlc3Ryb3kubURlc3Ryb3lMaXN0LmNsZWFyKCk7Ci0gICAgICAgIG1PYmpEZXN0cm95Lm1OZWVkVG9FbXB0eSA9IGZhbHNlOwotCi0gICAgICAgIHN0YXR1cyA9IHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtT2JqRGVzdHJveS5tTXV0ZXgpOwotICAgICAgICBpZiAoc3RhdHVzKSB7Ci0gICAgICAgICAgICBMT0dFKCJDb250ZXh0OjpPYmpEZXN0cm95T09CUnVuOiBlcnJvciAlaSB1bmxvY2tpbmcgZm9yIHNldCBjb25kaXRpb24uIiwgc3RhdHVzKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotdm9pZCBDb250ZXh0OjpvYmpEZXN0cm95T09CRGVzdHJveSgpCi17Ci0gICAgcnNBc3NlcnQoIW1PYmpEZXN0cm95Lm1OZWVkVG9FbXB0eSk7Ci0gICAgcHRocmVhZF9tdXRleF9kZXN0cm95KCZtT2JqRGVzdHJveS5tTXV0ZXgpOwotfQotCi12b2lkIENvbnRleHQ6Om9iakRlc3Ryb3lBZGQoT2JqZWN0QmFzZSAqb2JqKQotewotICAgIGludCBzdGF0dXMgPSBwdGhyZWFkX211dGV4X2xvY2soJm1PYmpEZXN0cm95Lm1NdXRleCk7Ci0gICAgaWYgKHN0YXR1cykgewotICAgICAgICBMT0dFKCJDb250ZXh0OjpPYmpEZXN0cm95T09CUnVuOiBlcnJvciAlaSBsb2NraW5nIGZvciBPT0JSdW4uIiwgc3RhdHVzKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIG1PYmpEZXN0cm95Lm1OZWVkVG9FbXB0eSA9IHRydWU7Ci0gICAgbU9iakRlc3Ryb3kubURlc3Ryb3lMaXN0LmFkZChvYmopOwotCi0gICAgc3RhdHVzID0gcHRocmVhZF9tdXRleF91bmxvY2soJm1PYmpEZXN0cm95Lm1NdXRleCk7Ci0gICAgaWYgKHN0YXR1cykgewotICAgICAgICBMT0dFKCJDb250ZXh0OjpPYmpEZXN0cm95T09CUnVuOiBlcnJvciAlaSB1bmxvY2tpbmcgZm9yIHNldCBjb25kaXRpb24uIiwgc3RhdHVzKTsKLSAgICB9Ci19Ci0KIHVpbnQzMl90IENvbnRleHQ6OmdldE1lc3NhZ2VUb0NsaWVudCh2b2lkICpkYXRhLCBzaXplX3QgKnJlY2VpdmVMZW4sIHNpemVfdCBidWZmZXJMZW4sIGJvb2wgd2FpdCkKIHsKICAgICAvL0xPR0UoImdldE1lc3NhZ2VUb0NsaWVudCAlaSAlaSIsIGJ1ZmZlckxlbiwgd2FpdCk7CkBAIC03NTEsMTUgKzc0NCwxOSBAQAogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmICghd2FpdEZvclNwYWNlKSB7Ci0gICAgICAgIGlmIChtSU8ubVRvQ2xpZW50LmdldEZyZWVTcGFjZSgpIDwgbGVuKSB7CisgICAgICAgIGlmICghbUlPLm1Ub0NsaWVudC5tYWtlU3BhY2VOb25CbG9ja2luZyhsZW4gKyA4KSkgewogICAgICAgICAgICAgLy8gTm90IGVub3VnaCByb29tLCBhbmQgbm90IHdhaXRpbmcuCiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICB9CiAgICAgLy9MT0dFKCJzZW5kTWVzc2FnZVRvQ2xpZW50IDIiKTsKLSAgICB2b2lkICpwID0gbUlPLm1Ub0NsaWVudC5yZXNlcnZlKGxlbik7Ci0gICAgbWVtY3B5KHAsIGRhdGEsIGxlbik7Ci0gICAgbUlPLm1Ub0NsaWVudC5jb21taXQoY21kSUQsIGxlbik7CisgICAgaWYgKGxlbiA+IDApIHsKKyAgICAgICAgdm9pZCAqcCA9IG1JTy5tVG9DbGllbnQucmVzZXJ2ZShsZW4pOworICAgICAgICBtZW1jcHkocCwgZGF0YSwgbGVuKTsKKyAgICAgICAgbUlPLm1Ub0NsaWVudC5jb21taXQoY21kSUQsIGxlbik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUlPLm1Ub0NsaWVudC5jb21taXQoY21kSUQsIDApOworICAgIH0KICAgICAvL0xPR0UoInNlbmRNZXNzYWdlVG9DbGllbnQgMyIpOwogICAgIHJldHVybiB0cnVlOwogfQpAQCAtNzk5LDggKzc5Niw3IEBACiAgICAgTE9HRSgiUlMgQ29udGV4dCBkZWJ1ZyIpOwogCiAgICAgTE9HRSgiIEVHTCB2ZXIgJWkgJWkiLCBtRUdMLm1NYWpvclZlcnNpb24sIG1FR0wubU1pbm9yVmVyc2lvbik7Ci0gICAgTE9HRSgiIEVHTCBjb250ZXh0ICVwICBzdXJmYWNlICVwLCAgdz0laSBoPSVpICBEaXNwbGF5PSVwIiwgbUVHTC5tQ29udGV4dCwKLSAgICAgICAgIG1FR0wubVN1cmZhY2UsIG1FR0wubVdpZHRoLCBtRUdMLm1IZWlnaHQsIG1FR0wubURpc3BsYXkpOworICAgIExPR0UoIiBFR0wgY29udGV4dCAlcCAgc3VyZmFjZSAlcCwgIERpc3BsYXk9JXAiLCBtRUdMLm1Db250ZXh0LCBtRUdMLm1TdXJmYWNlLCBtRUdMLm1EaXNwbGF5KTsKICAgICBMT0dFKCIgR0wgdmVuZG9yOiAlcyIsIG1HTC5tVmVuZG9yKTsKICAgICBMT0dFKCIgR0wgcmVuZGVyZXI6ICVzIiwgbUdMLm1SZW5kZXJlcik7CiAgICAgTE9HRSgiIEdMIFZlcnNpb246ICVzIiwgbUdMLm1WZXJzaW9uKTsKQEAgLTgyMiw2ICs4MTgsOSBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIHJlbmRlcnNjcmlwdCB7CiAKK3ZvaWQgcnNpX0NvbnRleHRGaW5pc2goQ29udGV4dCAqcnNjKQoreworfQogCiB2b2lkIHJzaV9Db250ZXh0QmluZFJvb3RTY3JpcHQoQ29udGV4dCAqcnNjLCBSc1NjcmlwdCB2cykKIHsKQEAgLTg0MSw5ICs4NDAsOSBAQAogICAgIHMtPmJpbmRUb0NvbnRleHQoJnJzYy0+bVN0YXRlU2FtcGxlciwgc2xvdCk7CiB9CiAKLXZvaWQgcnNpX0NvbnRleHRCaW5kUHJvZ3JhbUZyYWdtZW50U3RvcmUoQ29udGV4dCAqcnNjLCBSc1Byb2dyYW1GcmFnbWVudFN0b3JlIHZwZnMpCit2b2lkIHJzaV9Db250ZXh0QmluZFByb2dyYW1TdG9yZShDb250ZXh0ICpyc2MsIFJzUHJvZ3JhbVN0b3JlIHZwZnMpCiB7Ci0gICAgUHJvZ3JhbUZyYWdtZW50U3RvcmUgKnBmcyA9IHN0YXRpY19jYXN0PFByb2dyYW1GcmFnbWVudFN0b3JlICo+KHZwZnMpOworICAgIFByb2dyYW1TdG9yZSAqcGZzID0gc3RhdGljX2Nhc3Q8UHJvZ3JhbVN0b3JlICo+KHZwZnMpOwogICAgIHJzYy0+c2V0RnJhZ21lbnRTdG9yZShwZnMpOwogfQogCkBAIC04NjUsMTIgKzg2NCwyNCBAQAogICAgIHJzYy0+c2V0VmVydGV4KHB2KTsKIH0KIAordm9pZCByc2lfQ29udGV4dEJpbmRGb250KENvbnRleHQgKnJzYywgUnNGb250IHZmb250KQoreworICAgIEZvbnQgKmZvbnQgPSBzdGF0aWNfY2FzdDxGb250ICo+KHZmb250KTsKKyAgICByc2MtPnNldEZvbnQoZm9udCk7Cit9CisKIHZvaWQgcnNpX0Fzc2lnbk5hbWUoQ29udGV4dCAqcnNjLCB2b2lkICogb2JqLCBjb25zdCBjaGFyICpuYW1lLCB1aW50MzJfdCBsZW4pCiB7CiAgICAgT2JqZWN0QmFzZSAqb2IgPSBzdGF0aWNfY2FzdDxPYmplY3RCYXNlICo+KG9iaik7CiAgICAgcnNjLT5hc3NpZ25OYW1lKG9iLCBuYW1lLCBsZW4pOwogfQogCit2b2lkIHJzaV9HZXROYW1lKENvbnRleHQgKnJzYywgdm9pZCAqIG9iaiwgY29uc3QgY2hhciAqKm5hbWUpCit7CisgICAgT2JqZWN0QmFzZSAqb2IgPSBzdGF0aWNfY2FzdDxPYmplY3RCYXNlICo+KG9iaik7CisgICAgKCpuYW1lKSA9IG9iLT5nZXROYW1lKCk7Cit9CisKIHZvaWQgcnNpX09iakRlc3Ryb3koQ29udGV4dCAqcnNjLCB2b2lkICpvYmopCiB7CiAgICAgT2JqZWN0QmFzZSAqb2IgPSBzdGF0aWNfY2FzdDxPYmplY3RCYXNlICo+KG9iaik7CkBAIC05MzgsMTIgKzk0OSw2IEBACiAgICAgZGVsZXRlIHJzYzsKIH0KIAotdm9pZCByc09iakRlc3Ryb3lPT0IoUnNDb250ZXh0IHZyc2MsIHZvaWQgKm9iaikKLXsKLSAgICBDb250ZXh0ICogcnNjID0gc3RhdGljX2Nhc3Q8Q29udGV4dCAqPih2cnNjKTsKLSAgICByc2MtPm9iakRlc3Ryb3lBZGQoc3RhdGljX2Nhc3Q8T2JqZWN0QmFzZSAqPihvYmopKTsKLX0KLQogdWludDMyX3QgcnNDb250ZXh0R2V0TWVzc2FnZShSc0NvbnRleHQgdnJzYywgdm9pZCAqZGF0YSwgc2l6ZV90ICpyZWNlaXZlTGVuLCBzaXplX3QgYnVmZmVyTGVuLCBib29sIHdhaXQpCiB7CiAgICAgQ29udGV4dCAqIHJzYyA9IHN0YXRpY19jYXN0PENvbnRleHQgKj4odnJzYyk7CmRpZmYgLS1naXQgYS9saWJzL3JzL3JzQ29udGV4dC5oIGIvbGlicy9ycy9yc0NvbnRleHQuaAppbmRleCA3MDk3MzBlLi42ZDFhNDFkIDEwMDY0NAotLS0gYS9saWJzL3JzL3JzQ29udGV4dC5oCisrKyBiL2xpYnMvcnMvcnNDb250ZXh0LmgKQEAgLTE4LDEyICsxOCwxMiBAQAogI2RlZmluZSBBTkRST0lEX1JTX0NPTlRFWFRfSAogCiAjaW5jbHVkZSAicnNVdGlscy5oIgorI2luY2x1ZGUgInJzTXV0ZXguaCIKIAogI2luY2x1ZGUgInJzVGhyZWFkSU8uaCIKICNpbmNsdWRlICJyc1R5cGUuaCIKICNpbmNsdWRlICJyc01hdHJpeC5oIgogI2luY2x1ZGUgInJzQWxsb2NhdGlvbi5oIgotI2luY2x1ZGUgInJzU2ltcGxlTWVzaC5oIgogI2luY2x1ZGUgInJzTWVzaC5oIgogI2luY2x1ZGUgInJzRGV2aWNlLmgiCiAjaW5jbHVkZSAicnNTY3JpcHRDLmgiCkBAIC0zMSw4ICszMSw5IEBACiAjaW5jbHVkZSAicnNBZGFwdGVyLmgiCiAjaW5jbHVkZSAicnNTYW1wbGVyLmgiCiAjaW5jbHVkZSAicnNMaWdodC5oIgorI2luY2x1ZGUgInJzRm9udC5oIgogI2luY2x1ZGUgInJzUHJvZ3JhbUZyYWdtZW50LmgiCi0jaW5jbHVkZSAicnNQcm9ncmFtRnJhZ21lbnRTdG9yZS5oIgorI2luY2x1ZGUgInJzUHJvZ3JhbVN0b3JlLmgiCiAjaW5jbHVkZSAicnNQcm9ncmFtUmFzdGVyLmgiCiAjaW5jbHVkZSAicnNQcm9ncmFtVmVydGV4LmgiCiAjaW5jbHVkZSAicnNTaGFkZXJDYWNoZS5oIgpAQCAtNjQsMTcgKzY1LDE5IEBACiAgICAgICAgIFNjcmlwdCAqIG1TY3JpcHQ7CiAgICAgfTsKIAorICAgIHR5cGVkZWYgdm9pZCAoKldvcmtlckNhbGxiYWNrX3QpKHZvaWQgKnVzciwgdWludDMyX3QgaWR4KTsKIAogICAgIC8vU3RydWN0dXJlZEFsbG9jYXRpb25Db250ZXh0IG1TdGF0ZUFsbG9jYXRpb247CiAgICAgRWxlbWVudFN0YXRlIG1TdGF0ZUVsZW1lbnQ7CiAgICAgVHlwZVN0YXRlIG1TdGF0ZVR5cGU7CiAgICAgU2FtcGxlclN0YXRlIG1TdGF0ZVNhbXBsZXI7CiAgICAgUHJvZ3JhbUZyYWdtZW50U3RhdGUgbVN0YXRlRnJhZ21lbnQ7Ci0gICAgUHJvZ3JhbUZyYWdtZW50U3RvcmVTdGF0ZSBtU3RhdGVGcmFnbWVudFN0b3JlOworICAgIFByb2dyYW1TdG9yZVN0YXRlIG1TdGF0ZUZyYWdtZW50U3RvcmU7CiAgICAgUHJvZ3JhbVJhc3RlclN0YXRlIG1TdGF0ZVJhc3RlcjsKICAgICBQcm9ncmFtVmVydGV4U3RhdGUgbVN0YXRlVmVydGV4OwogICAgIExpZ2h0U3RhdGUgbVN0YXRlTGlnaHQ7CiAgICAgVmVydGV4QXJyYXlTdGF0ZSBtU3RhdGVWZXJ0ZXhBcnJheTsKKyAgICBGb250U3RhdGUgbVN0YXRlRm9udDsKIAogICAgIFNjcmlwdENTdGF0ZSBtU2NyaXB0QzsKICAgICBTaGFkZXJDYWNoZSBtU2hhZGVyQ2FjaGU7CkBAIC04NCwxNCArODcsMTYgQEAKICAgICB2b2lkIHNldFJhc3RlcihQcm9ncmFtUmFzdGVyICopOwogICAgIHZvaWQgc2V0VmVydGV4KFByb2dyYW1WZXJ0ZXggKik7CiAgICAgdm9pZCBzZXRGcmFnbWVudChQcm9ncmFtRnJhZ21lbnQgKik7Ci0gICAgdm9pZCBzZXRGcmFnbWVudFN0b3JlKFByb2dyYW1GcmFnbWVudFN0b3JlICopOworICAgIHZvaWQgc2V0RnJhZ21lbnRTdG9yZShQcm9ncmFtU3RvcmUgKik7CisgICAgdm9pZCBzZXRGb250KEZvbnQgKik7CiAKICAgICB2b2lkIHVwZGF0ZVN1cmZhY2Uodm9pZCAqc3VyKTsKIAogICAgIGNvbnN0IFByb2dyYW1GcmFnbWVudCAqIGdldEZyYWdtZW50KCkge3JldHVybiBtRnJhZ21lbnQuZ2V0KCk7fQotICAgIGNvbnN0IFByb2dyYW1GcmFnbWVudFN0b3JlICogZ2V0RnJhZ21lbnRTdG9yZSgpIHtyZXR1cm4gbUZyYWdtZW50U3RvcmUuZ2V0KCk7fQorICAgIGNvbnN0IFByb2dyYW1TdG9yZSAqIGdldEZyYWdtZW50U3RvcmUoKSB7cmV0dXJuIG1GcmFnbWVudFN0b3JlLmdldCgpO30KICAgICBjb25zdCBQcm9ncmFtUmFzdGVyICogZ2V0UmFzdGVyKCkge3JldHVybiBtUmFzdGVyLmdldCgpO30KICAgICBjb25zdCBQcm9ncmFtVmVydGV4ICogZ2V0VmVydGV4KCkge3JldHVybiBtVmVydGV4LmdldCgpO30KKyAgICBGb250ICogZ2V0Rm9udCgpIHtyZXR1cm4gbUZvbnQuZ2V0KCk7fQogCiAgICAgYm9vbCBzZXR1cENoZWNrKCk7CiAgICAgYm9vbCBjaGVja0RyaXZlcigpIGNvbnN0IHtyZXR1cm4gbUVHTC5tU3VyZmFjZSAhPSAwO30KQEAgLTEwMywxMiArMTA4LDEwIEBACiAKICAgICB2b2lkIGFzc2lnbk5hbWUoT2JqZWN0QmFzZSAqb2JqLCBjb25zdCBjaGFyICpuYW1lLCB1aW50MzJfdCBsZW4pOwogICAgIHZvaWQgcmVtb3ZlTmFtZShPYmplY3RCYXNlICpvYmopOwotICAgIE9iamVjdEJhc2UgKiBsb29rdXBOYW1lKGNvbnN0IGNoYXIgKm5hbWUpIGNvbnN0OwotICAgIHZvaWQgYXBwZW5kTmFtZURlZmluZXMoU3RyaW5nOCAqc3RyKSBjb25zdDsKIAogICAgIHVpbnQzMl90IGdldE1lc3NhZ2VUb0NsaWVudCh2b2lkICpkYXRhLCBzaXplX3QgKnJlY2VpdmVMZW4sIHNpemVfdCBidWZmZXJMZW4sIGJvb2wgd2FpdCk7CiAgICAgYm9vbCBzZW5kTWVzc2FnZVRvQ2xpZW50KHZvaWQgKmRhdGEsIHVpbnQzMl90IGNtZElELCBzaXplX3QgbGVuLCBib29sIHdhaXRGb3JTcGFjZSk7Ci0gICAgdWludDMyX3QgcnVuU2NyaXB0KFNjcmlwdCAqcywgdWludDMyX3QgbGF1bmNoSUQpOworICAgIHVpbnQzMl90IHJ1blNjcmlwdChTY3JpcHQgKnMpOwogCiAgICAgdm9pZCBpbml0VG9DbGllbnQoKTsKICAgICB2b2lkIGRlaW5pdFRvQ2xpZW50KCk7CkBAIC0xMTksMTkgKzEyMiwyMSBAQAogICAgIFByb2dyYW1WZXJ0ZXggKiBnZXREZWZhdWx0UHJvZ3JhbVZlcnRleCgpIGNvbnN0IHsKICAgICAgICAgcmV0dXJuIG1TdGF0ZVZlcnRleC5tRGVmYXVsdC5nZXQoKTsKICAgICB9Ci0gICAgUHJvZ3JhbUZyYWdtZW50U3RvcmUgKiBnZXREZWZhdWx0UHJvZ3JhbUZyYWdtZW50U3RvcmUoKSBjb25zdCB7CisgICAgUHJvZ3JhbVN0b3JlICogZ2V0RGVmYXVsdFByb2dyYW1TdG9yZSgpIGNvbnN0IHsKICAgICAgICAgcmV0dXJuIG1TdGF0ZUZyYWdtZW50U3RvcmUubURlZmF1bHQuZ2V0KCk7CiAgICAgfQogICAgIFByb2dyYW1SYXN0ZXIgKiBnZXREZWZhdWx0UHJvZ3JhbVJhc3RlcigpIGNvbnN0IHsKICAgICAgICAgcmV0dXJuIG1TdGF0ZVJhc3Rlci5tRGVmYXVsdC5nZXQoKTsKICAgICB9CisgICAgRm9udCogZ2V0RGVmYXVsdEZvbnQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtU3RhdGVGb250Lm1EZWZhdWx0LmdldCgpOworICAgIH0KIAotICAgIHVpbnQzMl90IGdldFdpZHRoKCkgY29uc3Qge3JldHVybiBtRUdMLm1XaWR0aDt9Ci0gICAgdWludDMyX3QgZ2V0SGVpZ2h0KCkgY29uc3Qge3JldHVybiBtRUdMLm1IZWlnaHQ7fQorICAgIHVpbnQzMl90IGdldFdpZHRoKCkgY29uc3Qge3JldHVybiBtV2lkdGg7fQorICAgIHVpbnQzMl90IGdldEhlaWdodCgpIGNvbnN0IHtyZXR1cm4gbUhlaWdodDt9CiAKIAogICAgIFRocmVhZElPIG1JTzsKLSAgICB2b2lkIG9iakRlc3Ryb3lBZGQoT2JqZWN0QmFzZSAqKTsKIAogICAgIC8vIFRpbWVycwogICAgIGVudW0gVGltZXJzIHsKQEAgLTE1NiwxNyArMTYxLDIxIEBACiAgICAgICAgIGJvb2wgbUxvZ1NjcmlwdHM7CiAgICAgICAgIGJvb2wgbUxvZ09iamVjdHM7CiAgICAgICAgIGJvb2wgbUxvZ1NoYWRlcnM7CisgICAgICAgIGJvb2wgbUxvZ1Zpc3VhbDsKICAgICB9IHByb3BzOwogCiAgICAgdm9pZCBkdW1wRGVidWcoKSBjb25zdDsKICAgICB2b2lkIGNoZWNrRXJyb3IoY29uc3QgY2hhciAqKSBjb25zdDsKICAgICBjb25zdCBjaGFyICogZ2V0RXJyb3IoUnNFcnJvciAqKTsKLSAgICB2b2lkIHNldEVycm9yKFJzRXJyb3IgZSwgY29uc3QgY2hhciAqbXNnKTsKKyAgICB2b2lkIHNldEVycm9yKFJzRXJyb3IgZSwgY29uc3QgY2hhciAqbXNnID0gTlVMTCk7CiAKICAgICBtdXRhYmxlIGNvbnN0IE9iamVjdEJhc2UgKiBtT2JqSGVhZDsKIAogICAgIGJvb2wgZXh0X09FU190ZXh0dXJlX25wb3QoKSBjb25zdCB7cmV0dXJuIG1HTC5PRVNfdGV4dHVyZV9ucG90O30KIAorICAgIHZvaWQgbGF1bmNoVGhyZWFkcyhXb3JrZXJDYWxsYmFja190IGNiaywgdm9pZCAqZGF0YSk7CisgICAgdWludDMyX3QgZ2V0V29ya2VyUG9vbFNpemUoKSBjb25zdCB7cmV0dXJuICh1aW50MzJfdCltV29ya2Vycy5tUnVubmluZ0NvdW50O30KKwogcHJvdGVjdGVkOgogICAgIERldmljZSAqbURldjsKIApAQCAtMTc3LDggKzE4Niw2IEBACiAgICAgICAgIEVHTENvbmZpZyBtQ29uZmlnOwogICAgICAgICBFR0xDb250ZXh0IG1Db250ZXh0OwogICAgICAgICBFR0xTdXJmYWNlIG1TdXJmYWNlOwotICAgICAgICBFR0xpbnQgbVdpZHRoOwotICAgICAgICBFR0xpbnQgbUhlaWdodDsKICAgICAgICAgRUdMRGlzcGxheSBtRGlzcGxheTsKICAgICB9IG1FR0w7CiAKQEAgLTIxOSwyMiArMjI2LDI4IEBACiAgICAgcHRocmVhZF90IG1UaHJlYWRJZDsKICAgICBwaWRfdCBtTmF0aXZlVGhyZWFkSWQ7CiAKKyAgICBzdHJ1Y3QgV29ya2VycyB7CisgICAgICAgIHZvbGF0aWxlIGludCBtUnVubmluZ0NvdW50OworICAgICAgICB2b2xhdGlsZSBpbnQgbUxhdW5jaENvdW50OworICAgICAgICB1aW50MzJfdCBtQ291bnQ7CisgICAgICAgIHB0aHJlYWRfdCAqbVRocmVhZElkOworICAgICAgICBwaWRfdCAqbU5hdGl2ZVRocmVhZElkOworICAgICAgICBTaWduYWwgbUNvbXBsZXRlU2lnbmFsOworCisgICAgICAgIFNpZ25hbCAqbUxhdW5jaFNpZ25hbHM7CisgICAgICAgIFdvcmtlckNhbGxiYWNrX3QgbUxhdW5jaENhbGxiYWNrOworICAgICAgICB2b2lkICptTGF1bmNoRGF0YTsKKyAgICB9OworICAgIFdvcmtlcnMgbVdvcmtlcnM7CisKICAgICBPYmplY3RCYXNlUmVmPFNjcmlwdD4gbVJvb3RTY3JpcHQ7CiAgICAgT2JqZWN0QmFzZVJlZjxQcm9ncmFtRnJhZ21lbnQ+IG1GcmFnbWVudDsKICAgICBPYmplY3RCYXNlUmVmPFByb2dyYW1WZXJ0ZXg+IG1WZXJ0ZXg7Ci0gICAgT2JqZWN0QmFzZVJlZjxQcm9ncmFtRnJhZ21lbnRTdG9yZT4gbUZyYWdtZW50U3RvcmU7CisgICAgT2JqZWN0QmFzZVJlZjxQcm9ncmFtU3RvcmU+IG1GcmFnbWVudFN0b3JlOwogICAgIE9iamVjdEJhc2VSZWY8UHJvZ3JhbVJhc3Rlcj4gbVJhc3RlcjsKKyAgICBPYmplY3RCYXNlUmVmPEZvbnQ+IG1Gb250OwogCi0KLSAgICBzdHJ1Y3QgT2JqRGVzdHJveU9PQiB7Ci0gICAgICAgIHB0aHJlYWRfbXV0ZXhfdCBtTXV0ZXg7Ci0gICAgICAgIFZlY3RvcjxPYmplY3RCYXNlICo+IG1EZXN0cm95TGlzdDsKLSAgICAgICAgYm9vbCBtTmVlZFRvRW1wdHk7Ci0gICAgfTsKLSAgICBPYmpEZXN0cm95T09CIG1PYmpEZXN0cm95OwotICAgIGJvb2wgb2JqRGVzdHJveU9PQkluaXQoKTsKLSAgICB2b2lkIG9iakRlc3Ryb3lPT0JSdW4oKTsKLSAgICB2b2lkIG9iakRlc3Ryb3lPT0JEZXN0cm95KCk7CisgICAgdm9pZCBkaXNwbGF5RGVidWdTdGF0cygpOwogCiBwcml2YXRlOgogICAgIENvbnRleHQoKTsKQEAgLTI0NSw2ICsyNTgsNyBAQAogICAgIHVpbnQzMl90IHJ1blJvb3RTY3JpcHQoKTsKIAogICAgIHN0YXRpYyB2b2lkICogdGhyZWFkUHJvYyh2b2lkICopOworICAgIHN0YXRpYyB2b2lkICogaGVscGVyVGhyZWFkUHJvYyh2b2lkICopOwogCiAgICAgQU5hdGl2ZVdpbmRvdyAqbVduZFN1cmZhY2U7CiAKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNDb250ZXh0SG9zdFN0dWIuaCBiL2xpYnMvcnMvcnNDb250ZXh0SG9zdFN0dWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDM3NjA2Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9yc0NvbnRleHRIb3N0U3R1Yi5oCkBAIC0wLDAgKzEsMTUyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1JTX0NPTlRFWFRfSE9TVF9TVFVCX0gKKyNkZWZpbmUgQU5EUk9JRF9SU19DT05URVhUX0hPU1RfU1RVQl9ICisKKyNpbmNsdWRlICJyc1V0aWxzLmgiCisvLyNpbmNsdWRlICJyc011dGV4LmgiCisKKy8vI2luY2x1ZGUgInJzVGhyZWFkSU8uaCIKKyNpbmNsdWRlICJyc1R5cGUuaCIKKyNpbmNsdWRlICJyc01hdHJpeC5oIgorI2luY2x1ZGUgInJzQWxsb2NhdGlvbi5oIgorI2luY2x1ZGUgInJzTWVzaC5oIgorLy8jaW5jbHVkZSAicnNEZXZpY2UuaCIKKyNpbmNsdWRlICJyc1NjcmlwdEMuaCIKKyNpbmNsdWRlICJyc0FsbG9jYXRpb24uaCIKKyNpbmNsdWRlICJyc0FkYXB0ZXIuaCIKKyNpbmNsdWRlICJyc1NhbXBsZXIuaCIKKyNpbmNsdWRlICJyc0xpZ2h0LmgiCisjaW5jbHVkZSAicnNQcm9ncmFtRnJhZ21lbnQuaCIKKyNpbmNsdWRlICJyc1Byb2dyYW1TdG9yZS5oIgorI2luY2x1ZGUgInJzUHJvZ3JhbVJhc3Rlci5oIgorI2luY2x1ZGUgInJzUHJvZ3JhbVZlcnRleC5oIgorI2luY2x1ZGUgInJzU2hhZGVyQ2FjaGUuaCIKKyNpbmNsdWRlICJyc1ZlcnRleEFycmF5LmgiCisKKy8vI2luY2x1ZGUgInJzZ0FwaVN0cnVjdHMuaCIKKy8vI2luY2x1ZGUgInJzTG9ja2xlc3NGaWZvLmgiCisKKy8vI2luY2x1ZGUgPHVpL2VnbC9hbmRyb2lkX25hdGl2ZXMuaD4KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK25hbWVzcGFjZSByZW5kZXJzY3JpcHQgeworCitjbGFzcyBEZXZpY2U7CisKK2NsYXNzIENvbnRleHQKK3sKK3B1YmxpYzoKKyAgICBDb250ZXh0KERldmljZSAqLCBib29sIGlzR3JhcGhpY3MsIGJvb2wgdXNlRGVwdGgpIHsKKyAgICAgICAgbU9iakhlYWQgPSBOVUxMOworICAgIH0KKyAgICB+Q29udGV4dCgpIHsKKyAgICB9CisKKworICAgIC8vU3RydWN0dXJlZEFsbG9jYXRpb25Db250ZXh0IG1TdGF0ZUFsbG9jYXRpb247CisgICAgRWxlbWVudFN0YXRlIG1TdGF0ZUVsZW1lbnQ7CisgICAgVHlwZVN0YXRlIG1TdGF0ZVR5cGU7CisgICAgU2FtcGxlclN0YXRlIG1TdGF0ZVNhbXBsZXI7CisgICAgLy9Qcm9ncmFtRnJhZ21lbnRTdGF0ZSBtU3RhdGVGcmFnbWVudDsKKyAgICBQcm9ncmFtU3RvcmVTdGF0ZSBtU3RhdGVGcmFnbWVudFN0b3JlOworICAgIC8vUHJvZ3JhbVJhc3RlclN0YXRlIG1TdGF0ZVJhc3RlcjsKKyAgICAvL1Byb2dyYW1WZXJ0ZXhTdGF0ZSBtU3RhdGVWZXJ0ZXg7CisgICAgTGlnaHRTdGF0ZSBtU3RhdGVMaWdodDsKKyAgICBWZXJ0ZXhBcnJheVN0YXRlIG1TdGF0ZVZlcnRleEFycmF5OworCisgICAgLy9TY3JpcHRDU3RhdGUgbVNjcmlwdEM7CisgICAgU2hhZGVyQ2FjaGUgbVNoYWRlckNhY2hlOworCisKKyAgICAvL2Jvb2wgc2V0dXBDaGVjaygpOworICAgIGJvb2wgY2hlY2tEcml2ZXIoKSBjb25zdCB7cmV0dXJuIGZhbHNlO30KKworICAgIFByb2dyYW1GcmFnbWVudCAqIGdldERlZmF1bHRQcm9ncmFtRnJhZ21lbnQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQcm9ncmFtVmVydGV4ICogZ2V0RGVmYXVsdFByb2dyYW1WZXJ0ZXgoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQcm9ncmFtU3RvcmUgKiBnZXREZWZhdWx0UHJvZ3JhbVN0b3JlKCkgY29uc3QgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgUHJvZ3JhbVJhc3RlciAqIGdldERlZmF1bHRQcm9ncmFtUmFzdGVyKCkgY29uc3QgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICB1aW50MzJfdCBnZXRXaWR0aCgpIGNvbnN0IHtyZXR1cm4gMDt9CisgICAgdWludDMyX3QgZ2V0SGVpZ2h0KCkgY29uc3Qge3JldHVybiAwO30KKworICAgIC8vIFRpbWVycworICAgIGVudW0gVGltZXJzIHsKKyAgICAgICAgUlNfVElNRVJfSURMRSwKKyAgICAgICAgUlNfVElNRVJfSU5URVJOQUwsCisgICAgICAgIFJTX1RJTUVSX1NDUklQVCwKKyAgICAgICAgUlNfVElNRVJfQ0xFQVJfU1dBUCwKKyAgICAgICAgX1JTX1RJTUVSX1RPVEFMCisgICAgfTsKKworICAgIGJvb2wgY2hlY2tWZXJzaW9uMV8xKCkgY29uc3Qge3JldHVybiBmYWxzZTsgfQorICAgIGJvb2wgY2hlY2tWZXJzaW9uMl8wKCkgY29uc3Qge3JldHVybiBmYWxzZTsgfQorCisgICAgc3RydWN0IHsKKyAgICAgICAgYm9vbCBtTG9nVGltZXM7CisgICAgICAgIGJvb2wgbUxvZ1NjcmlwdHM7CisgICAgICAgIGJvb2wgbUxvZ09iamVjdHM7CisgICAgICAgIGJvb2wgbUxvZ1NoYWRlcnM7CisgICAgfSBwcm9wczsKKworICAgIHZvaWQgZHVtcERlYnVnKCkgY29uc3QgeyAgICB9CisgICAgdm9pZCBjaGVja0Vycm9yKGNvbnN0IGNoYXIgKikgY29uc3QgeyAgfTsKKyAgICB2b2lkIHNldEVycm9yKFJzRXJyb3IgZSwgY29uc3QgY2hhciAqbXNnID0gTlVMTCkgeyAgfQorCisgICAgbXV0YWJsZSBjb25zdCBPYmplY3RCYXNlICogbU9iakhlYWQ7CisKKyAgICBib29sIGV4dF9PRVNfdGV4dHVyZV9ucG90KCkgY29uc3Qge3JldHVybiBtR0wuT0VTX3RleHR1cmVfbnBvdDt9CisKK3Byb3RlY3RlZDoKKworICAgIHN0cnVjdCB7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKiBtVmVuZG9yOworICAgICAgICBjb25zdCB1aW50OF90ICogbVJlbmRlcmVyOworICAgICAgICBjb25zdCB1aW50OF90ICogbVZlcnNpb247CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKiBtRXh0ZW5zaW9uczsKKworICAgICAgICB1aW50MzJfdCBtTWFqb3JWZXJzaW9uOworICAgICAgICB1aW50MzJfdCBtTWlub3JWZXJzaW9uOworCisgICAgICAgIGludDMyX3QgbU1heFZhcnlpbmdWZWN0b3JzOworICAgICAgICBpbnQzMl90IG1NYXhUZXh0dXJlSW1hZ2VVbml0czsKKworICAgICAgICBpbnQzMl90IG1NYXhGcmFnbWVudFRleHR1cmVJbWFnZVVuaXRzOworICAgICAgICBpbnQzMl90IG1NYXhGcmFnbWVudFVuaWZvcm1WZWN0b3JzOworCisgICAgICAgIGludDMyX3QgbU1heFZlcnRleEF0dHJpYnM7CisgICAgICAgIGludDMyX3QgbU1heFZlcnRleFVuaWZvcm1WZWN0b3JzOworICAgICAgICBpbnQzMl90IG1NYXhWZXJ0ZXhUZXh0dXJlVW5pdHM7CisKKyAgICAgICAgYm9vbCBPRVNfdGV4dHVyZV9ucG90OworICAgIH0gbUdMOworCit9OworCit9Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNEZXZpY2UuY3BwIGIvbGlicy9ycy9yc0RldmljZS5jcHAKaW5kZXggYjY3MGFkNC4uYTk2YjExNCAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc0RldmljZS5jcHAKKysrIGIvbGlicy9ycy9yc0RldmljZS5jcHAKQEAgLTE1LDcgKzE1LDExIEBACiAgKi8KIAogI2luY2x1ZGUgInJzRGV2aWNlLmgiCisjaWZuZGVmIEFORFJPSURfUlNfQlVJTERfRk9SX0hPU1QKICNpbmNsdWRlICJyc0NvbnRleHQuaCIKKyNlbHNlCisjaW5jbHVkZSAicnNDb250ZXh0SG9zdFN0dWIuaCIKKyNlbmRpZgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpyZW5kZXJzY3JpcHQ7CkBAIC0zMyw3ICszNyw3IEBACiAKIHZvaWQgRGV2aWNlOjphZGRDb250ZXh0KENvbnRleHQgKnJzYykKIHsKLSAgICBtQ29udGV4dHMuYWRkKHJzYyk7CisgICAgbUNvbnRleHRzLnB1c2gocnNjKTsKIH0KIAogdm9pZCBEZXZpY2U6OnJlbW92ZUNvbnRleHQoQ29udGV4dCAqcnNjKQpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc0VsZW1lbnQuY3BwIGIvbGlicy9ycy9yc0VsZW1lbnQuY3BwCmluZGV4IDYyODhiYzQuLjI2MDJkZDQgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNFbGVtZW50LmNwcAorKysgYi9saWJzL3JzL3JzRWxlbWVudC5jcHAKQEAgLTE0LDkgKzE0LDE0IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jaW5jbHVkZSAicnNDb250ZXh0LmgiCiAKKyNpZm5kZWYgQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAorI2luY2x1ZGUgInJzQ29udGV4dC5oIgogI2luY2x1ZGUgPEdMRVMvZ2wuaD4KKyNlbHNlCisjaW5jbHVkZSAicnNDb250ZXh0SG9zdFN0dWIuaCIKKyNpbmNsdWRlIDxPcGVuR0wvZ2wuaD4KKyNlbmRpZgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpyZW5kZXJzY3JpcHQ7CkBAIC0yOSw2ICszNCw3IEBACiAgICAgbUFsbG9jTGluZSA9IF9fTElORV9fOwogICAgIG1GaWVsZHMgPSBOVUxMOwogICAgIG1GaWVsZENvdW50ID0gMDsKKyAgICBtSGFzUmVmZXJlbmNlID0gZmFsc2U7CiB9CiAKIApAQCAtNDgsNiArNTQsNyBAQAogICAgIGRlbGV0ZSBbXSBtRmllbGRzOwogICAgIG1GaWVsZHMgPSBOVUxMOwogICAgIG1GaWVsZENvdW50ID0gMDsKKyAgICBtSGFzUmVmZXJlbmNlID0gZmFsc2U7CiB9CiAKIHNpemVfdCBFbGVtZW50OjpnZXRTaXplQml0cygpIGNvbnN0CkBAIC02MywxNSArNzAsNiBAQAogICAgIHJldHVybiB0b3RhbDsKIH0KIAotc2l6ZV90IEVsZW1lbnQ6OmdldEZpZWxkT2Zmc2V0Qml0cyh1aW50MzJfdCBjb21wb25lbnROdW1iZXIpIGNvbnN0Ci17Ci0gICAgc2l6ZV90IG9mZnNldCA9IDA7Ci0gICAgZm9yICh1aW50MzJfdCBjdCA9IDA7IGN0IDwgY29tcG9uZW50TnVtYmVyOyBjdCsrKSB7Ci0gICAgICAgIG9mZnNldCArPSBtRmllbGRzW2N0XS5lLT5tQml0czsKLSAgICB9Ci0gICAgcmV0dXJuIG9mZnNldDsKLX0KLQogdm9pZCBFbGVtZW50OjpkdW1wTE9HVihjb25zdCBjaGFyICpwcmVmaXgpIGNvbnN0CiB7CiAgICAgT2JqZWN0QmFzZTo6ZHVtcExPR1YocHJlZml4KTsKQEAgLTgzLDYgKzgxLDk4IEBACiAgICAgfQogfQogCit2b2lkIEVsZW1lbnQ6OnNlcmlhbGl6ZShPU3RyZWFtICpzdHJlYW0pIGNvbnN0Cit7CisgICAgLy8gTmVlZCB0byBpZGVudGlmeSBvdXJzZWx2ZXMKKyAgICBzdHJlYW0tPmFkZFUzMigodWludDMyX3QpZ2V0Q2xhc3NJZCgpKTsKKworICAgIFN0cmluZzggbmFtZShnZXROYW1lKCkpOworICAgIHN0cmVhbS0+YWRkU3RyaW5nKCZuYW1lKTsKKworICAgIG1Db21wb25lbnQuc2VyaWFsaXplKHN0cmVhbSk7CisKKyAgICAvLyBOb3cgc2VyaWFsaXplIGFsbCB0aGUgZmllbGRzCisgICAgc3RyZWFtLT5hZGRVMzIobUZpZWxkQ291bnQpOworICAgIGZvcih1aW50MzJfdCBjdCA9IDA7IGN0IDwgbUZpZWxkQ291bnQ7IGN0KyspIHsKKyAgICAgICAgc3RyZWFtLT5hZGRTdHJpbmcoJm1GaWVsZHNbY3RdLm5hbWUpOworICAgICAgICBtRmllbGRzW2N0XS5lLT5zZXJpYWxpemUoc3RyZWFtKTsKKyAgICB9Cit9CisKK0VsZW1lbnQgKkVsZW1lbnQ6OmNyZWF0ZUZyb21TdHJlYW0oQ29udGV4dCAqcnNjLCBJU3RyZWFtICpzdHJlYW0pCit7CisgICAgLy8gRmlyc3QgbWFrZSBzdXJlIHdlIGFyZSByZWFkaW5nIHRoZSBjb3JyZWN0IG9iamVjdAorICAgIFJzQTNEQ2xhc3NJRCBjbGFzc0lEID0gKFJzQTNEQ2xhc3NJRClzdHJlYW0tPmxvYWRVMzIoKTsKKyAgICBpZihjbGFzc0lEICE9IFJTX0EzRF9DTEFTU19JRF9FTEVNRU5UKSB7CisgICAgICAgIExPR0UoImVsZW1lbnQgbG9hZGluZyBza2lwcGVkIGR1ZSB0byBpbnZhbGlkIGNsYXNzIGlkXG4iKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgU3RyaW5nOCBuYW1lOworICAgIHN0cmVhbS0+bG9hZFN0cmluZygmbmFtZSk7CisKKyAgICBFbGVtZW50ICplbGVtID0gbmV3IEVsZW1lbnQocnNjKTsKKyAgICBlbGVtLT5tQ29tcG9uZW50LmxvYWRGcm9tU3RyZWFtKHN0cmVhbSk7CisgICAgZWxlbS0+bUJpdHMgPSBlbGVtLT5tQ29tcG9uZW50LmdldEJpdHMoKTsKKyAgICBlbGVtLT5tSGFzUmVmZXJlbmNlID0gZWxlbS0+bUNvbXBvbmVudC5pc1JlZmVyZW5jZSgpOworCisgICAgZWxlbS0+bUZpZWxkQ291bnQgPSBzdHJlYW0tPmxvYWRVMzIoKTsKKyAgICBpZihlbGVtLT5tRmllbGRDb3VudCkgeworICAgICAgICB1aW50MzJfdCBvZmZzZXQgPSAwOworICAgICAgICBlbGVtLT5tRmllbGRzID0gbmV3IEVsZW1lbnRGaWVsZF90IFtlbGVtLT5tRmllbGRDb3VudF07CisgICAgICAgIGZvcih1aW50MzJfdCBjdCA9IDA7IGN0IDwgZWxlbS0+bUZpZWxkQ291bnQ7IGN0ICsrKSB7CisgICAgICAgICAgICBzdHJlYW0tPmxvYWRTdHJpbmcoJmVsZW0tPm1GaWVsZHNbY3RdLm5hbWUpOworICAgICAgICAgICAgRWxlbWVudCAqZmllbGRFbGVtID0gRWxlbWVudDo6Y3JlYXRlRnJvbVN0cmVhbShyc2MsIHN0cmVhbSk7CisgICAgICAgICAgICBlbGVtLT5tRmllbGRzW2N0XS5lLnNldChmaWVsZEVsZW0pOworICAgICAgICAgICAgZWxlbS0+bUZpZWxkc1tjdF0ub2Zmc2V0Qml0cyA9IG9mZnNldDsKKyAgICAgICAgICAgIG9mZnNldCArPSBmaWVsZEVsZW0tPmdldFNpemVCaXRzKCk7CisgICAgICAgICAgICAvLyBDaGVjayBpZiBvdXIgc3ViLWVsZW1lbnRzIGhhdmUgcmVmZXJlbmNlcworICAgICAgICAgICAgaWYoZmllbGRFbGVtLT5tSGFzUmVmZXJlbmNlKSB7CisgICAgICAgICAgICAgICAgZWxlbS0+bUhhc1JlZmVyZW5jZSA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBXZSBuZWVkIHRvIGNoZWNrIGlmIHRoaXMgYWxyZWFkeSBleGlzdHMKKyAgICBmb3IgKHVpbnQzMl90IGN0PTA7IGN0IDwgcnNjLT5tU3RhdGVFbGVtZW50Lm1FbGVtZW50cy5zaXplKCk7IGN0KyspIHsKKyAgICAgICAgRWxlbWVudCAqZWUgPSByc2MtPm1TdGF0ZUVsZW1lbnQubUVsZW1lbnRzW2N0XTsKKworICAgICAgICBpZiAoIWVlLT5nZXRGaWVsZENvdW50KCkgKSB7CisKKyAgICAgICAgICAgIGlmKChlZS0+Z2V0Q29tcG9uZW50KCkuZ2V0VHlwZSgpID09IGVsZW0tPmdldENvbXBvbmVudCgpLmdldFR5cGUoKSkgJiYKKyAgICAgICAgICAgICAgIChlZS0+Z2V0Q29tcG9uZW50KCkuZ2V0S2luZCgpID09IGVsZW0tPmdldENvbXBvbmVudCgpLmdldEtpbmQoKSkgJiYKKyAgICAgICAgICAgICAgIChlZS0+Z2V0Q29tcG9uZW50KCkuZ2V0SXNOb3JtYWxpemVkKCkgPT0gZWxlbS0+Z2V0Q29tcG9uZW50KCkuZ2V0SXNOb3JtYWxpemVkKCkpICYmCisgICAgICAgICAgICAgICAoZWUtPmdldENvbXBvbmVudCgpLmdldFZlY3RvclNpemUoKSA9PSBlbGVtLT5nZXRDb21wb25lbnQoKS5nZXRWZWN0b3JTaXplKCkpKSB7CisgICAgICAgICAgICAgICAgLy8gTWF0Y2gKKyAgICAgICAgICAgICAgICBkZWxldGUgZWxlbTsKKyAgICAgICAgICAgICAgICBlZS0+aW5jVXNlclJlZigpOworICAgICAgICAgICAgICAgIHJldHVybiBlZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9IGVsc2UgaWYgKGVlLT5nZXRGaWVsZENvdW50KCkgPT0gZWxlbS0+bUZpZWxkQ291bnQpIHsKKworICAgICAgICAgICAgYm9vbCBtYXRjaCA9IHRydWU7CisgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGk9MDsgaSA8IGVsZW0tPm1GaWVsZENvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoKGVlLT5tRmllbGRzW2ldLmUuZ2V0KCkgIT0gZWxlbS0+bUZpZWxkc1tpXS5lLmdldCgpKSB8fAorICAgICAgICAgICAgICAgICAgICAoZWUtPm1GaWVsZHNbaV0ubmFtZS5sZW5ndGgoKSAhPSBlbGVtLT5tRmllbGRzW2ldLm5hbWUubGVuZ3RoKCkpIHx8CisgICAgICAgICAgICAgICAgICAgIChlZS0+bUZpZWxkc1tpXS5uYW1lICE9IGVsZW0tPm1GaWVsZHNbaV0ubmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgbWF0Y2ggPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1hdGNoKSB7CisgICAgICAgICAgICAgICAgZGVsZXRlIGVsZW07CisgICAgICAgICAgICAgICAgZWUtPmluY1VzZXJSZWYoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgIH0KKworICAgIHJzYy0+bVN0YXRlRWxlbWVudC5tRWxlbWVudHMucHVzaChlbGVtKTsKKyAgICByZXR1cm4gZWxlbTsKK30KKwogCiBjb25zdCBFbGVtZW50ICogRWxlbWVudDo6Y3JlYXRlKENvbnRleHQgKnJzYywgUnNEYXRhVHlwZSBkdCwgUnNEYXRhS2luZCBkaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzTm9ybSwgdWludDMyX3QgdmVjU2l6ZSkKQEAgLTEwNCw2ICsxOTQsNyBAQAogICAgIEVsZW1lbnQgKmUgPSBuZXcgRWxlbWVudChyc2MpOwogICAgIGUtPm1Db21wb25lbnQuc2V0KGR0LCBkaywgaXNOb3JtLCB2ZWNTaXplKTsKICAgICBlLT5tQml0cyA9IGUtPm1Db21wb25lbnQuZ2V0Qml0cygpOworICAgIGUtPm1IYXNSZWZlcmVuY2UgPSBlLT5tQ29tcG9uZW50LmlzUmVmZXJlbmNlKCk7CiAgICAgcnNjLT5tU3RhdGVFbGVtZW50Lm1FbGVtZW50cy5wdXNoKGUpOwogICAgIHJldHVybiBlOwogfQpAQCAtMTM0LDU0ICsyMjUsMjIgQEAKICAgICBFbGVtZW50ICplID0gbmV3IEVsZW1lbnQocnNjKTsKICAgICBlLT5tRmllbGRzID0gbmV3IEVsZW1lbnRGaWVsZF90IFtjb3VudF07CiAgICAgZS0+bUZpZWxkQ291bnQgPSBjb3VudDsKKyAgICBzaXplX3QgYml0cyA9IDA7CiAgICAgZm9yIChzaXplX3QgY3Q9MDsgY3QgPCBjb3VudDsgY3QrKykgewogICAgICAgICBlLT5tRmllbGRzW2N0XS5lLnNldChlaW5bY3RdKTsKICAgICAgICAgZS0+bUZpZWxkc1tjdF0ubmFtZS5zZXRUbyhuaW5bY3RdLCBsZW5ndGhzW2N0XSk7CisgICAgICAgIGUtPm1GaWVsZHNbY3RdLm9mZnNldEJpdHMgPSBiaXRzOworICAgICAgICBiaXRzICs9IGVpbltjdF0tPmdldFNpemVCaXRzKCk7CisKKyAgICAgICAgaWYgKGVpbltjdF0tPm1IYXNSZWZlcmVuY2UpIHsKKyAgICAgICAgICAgIGUtPm1IYXNSZWZlcmVuY2UgPSB0cnVlOworICAgICAgICB9CiAgICAgfQogCiAgICAgcnNjLT5tU3RhdGVFbGVtZW50Lm1FbGVtZW50cy5wdXNoKGUpOwogICAgIHJldHVybiBlOwogfQogCi1TdHJpbmc4IEVsZW1lbnQ6OmdldENTdHJ1Y3RCb2R5KHVpbnQzMl90IGluZGVudCkgY29uc3QKLXsKLSAgICBTdHJpbmc4IHNpOwotICAgIGZvciAodWludDMyX3QgY3Q9MDsgY3QgPCBpbmRlbnQ7IGN0KyspIHsKLSAgICAgICAgc2kuYXBwZW5kKCIgIik7Ci0gICAgfQotCi0gICAgU3RyaW5nOCBzKHNpKTsKLSAgICBzLmFwcGVuZCgie1xuIik7Ci0gICAgZm9yICh1aW50MzJfdCBjdCA9IDA7IGN0IDwgbUZpZWxkQ291bnQ7IGN0KyspIHsKLSAgICAgICAgcy5hcHBlbmQoc2kpOwotICAgICAgICBzLmFwcGVuZChtRmllbGRzW2N0XS5lLT5nZXRDVHlwZShpbmRlbnQrNCkpOwotICAgICAgICBzLmFwcGVuZCgiICIpOwotICAgICAgICBzLmFwcGVuZChtRmllbGRzW2N0XS5uYW1lKTsKLSAgICAgICAgcy5hcHBlbmQoIjtcbiIpOwotICAgIH0KLSAgICBzLmFwcGVuZChzaSk7Ci0gICAgcy5hcHBlbmQoIn0iKTsKLSAgICByZXR1cm4gczsKLX0KLQotU3RyaW5nOCBFbGVtZW50OjpnZXRDVHlwZSh1aW50MzJfdCBpbmRlbnQpIGNvbnN0Ci17Ci0gICAgU3RyaW5nOCBzOwotICAgIGZvciAodWludDMyX3QgY3Q9MDsgY3QgPCBpbmRlbnQ7IGN0KyspIHsKLSAgICAgICAgcy5hcHBlbmQoIiAiKTsKLSAgICB9Ci0KLSAgICBpZiAoIW1GaWVsZENvdW50KSB7Ci0gICAgICAgIC8vIEJhc2ljIGNvbXBvbmVudC4KLSAgICAgICAgcy5hcHBlbmQobUNvbXBvbmVudC5nZXRDVHlwZSgpKTsKLSAgICB9IGVsc2UgewotICAgICAgICBzLmFwcGVuZCgic3RydWN0ICIpOwotICAgICAgICBzLmFwcGVuZChnZXRDU3RydWN0Qm9keShpbmRlbnQpKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gczsKLX0KLQogU3RyaW5nOCBFbGVtZW50OjpnZXRHTFNMVHlwZSh1aW50MzJfdCBpbmRlbnQpIGNvbnN0CiB7CiAgICAgU3RyaW5nOCBzOwpAQCAtMjAxLDYgKzI2MCw0MyBAQAogICAgIHJldHVybiBzOwogfQogCit2b2lkIEVsZW1lbnQ6OmluY1JlZnMoY29uc3Qgdm9pZCAqcHRyKSBjb25zdAoreworICAgIGlmICghbUZpZWxkQ291bnQpIHsKKyAgICAgICAgaWYgKG1Db21wb25lbnQuaXNSZWZlcmVuY2UoKSkgeworICAgICAgICAgICAgT2JqZWN0QmFzZSAqY29uc3Qqb2JwID0gc3RhdGljX2Nhc3Q8T2JqZWN0QmFzZSAqY29uc3QqPihwdHIpOworICAgICAgICAgICAgT2JqZWN0QmFzZSAqb2IgPSBvYnBbMF07CisgICAgICAgICAgICBpZiAob2IpIG9iLT5pbmNTeXNSZWYoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgY29uc3QgdWludDhfdCAqcCA9IHN0YXRpY19jYXN0PGNvbnN0IHVpbnQ4X3QgKj4ocHRyKTsKKyAgICBmb3IgKHVpbnQzMl90IGk9MDsgaSA8IG1GaWVsZENvdW50OyBpKyspIHsKKyAgICAgICAgaWYgKG1GaWVsZHNbaV0uZS0+bUhhc1JlZmVyZW5jZSkgeworICAgICAgICAgICAgbUZpZWxkc1tpXS5lLT5pbmNSZWZzKCZwW21GaWVsZHNbaV0ub2Zmc2V0Qml0cyA+PiAzXSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgRWxlbWVudDo6ZGVjUmVmcyhjb25zdCB2b2lkICpwdHIpIGNvbnN0Cit7CisgICAgaWYgKCFtRmllbGRDb3VudCkgeworICAgICAgICBpZiAobUNvbXBvbmVudC5pc1JlZmVyZW5jZSgpKSB7CisgICAgICAgICAgICBPYmplY3RCYXNlICpjb25zdCpvYnAgPSBzdGF0aWNfY2FzdDxPYmplY3RCYXNlICpjb25zdCo+KHB0cik7CisgICAgICAgICAgICBPYmplY3RCYXNlICpvYiA9IG9icFswXTsKKyAgICAgICAgICAgIGlmIChvYikgb2ItPmRlY1N5c1JlZigpOworICAgICAgICB9CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjb25zdCB1aW50OF90ICpwID0gc3RhdGljX2Nhc3Q8Y29uc3QgdWludDhfdCAqPihwdHIpOworICAgIGZvciAodWludDMyX3QgaT0wOyBpIDwgbUZpZWxkQ291bnQ7IGkrKykgeworICAgICAgICBpZiAobUZpZWxkc1tpXS5lLT5tSGFzUmVmZXJlbmNlKSB7CisgICAgICAgICAgICBtRmllbGRzW2ldLmUtPmRlY1JlZnMoJnBbbUZpZWxkc1tpXS5vZmZzZXRCaXRzID4+IDNdKTsKKyAgICAgICAgfQorICAgIH0KK30KIAogCiBFbGVtZW50U3RhdGU6OkVsZW1lbnRTdGF0ZSgpCkBAIC0yNDMsNiArMzM5LDMyIEBACiAgICAgcmV0dXJuIChSc0VsZW1lbnQpZTsKIH0KIAordm9pZCByc2lfRWxlbWVudEdldE5hdGl2ZURhdGEoQ29udGV4dCAqcnNjLCBSc0VsZW1lbnQgZWxlbSwgdWludDMyX3QgKmVsZW1EYXRhLCB1aW50MzJfdCBlbGVtRGF0YVNpemUpCit7CisgICAgcnNBc3NlcnQoZWxlbURhdGFTaXplID09IDUpOworICAgIC8vIHdlIHdpbGwgcGFjayBtVHlwZTsgbUtpbmQ7IG1Ob3JtYWxpemVkOyBtVmVjdG9yU2l6ZTsgTnVtU3ViRWxlbWVudHMKKyAgICBFbGVtZW50ICplID0gc3RhdGljX2Nhc3Q8RWxlbWVudCAqPihlbGVtKTsKKworICAgICgqZWxlbURhdGErKykgPSAodWludDMyX3QpZS0+Z2V0VHlwZSgpOworICAgICgqZWxlbURhdGErKykgPSAodWludDMyX3QpZS0+Z2V0S2luZCgpOworICAgICgqZWxlbURhdGErKykgPSBlLT5nZXRDb21wb25lbnQoKS5nZXRJc05vcm1hbGl6ZWQoKSA/IDEgOiAwOworICAgICgqZWxlbURhdGErKykgPSBlLT5nZXRDb21wb25lbnQoKS5nZXRWZWN0b3JTaXplKCk7CisgICAgKCplbGVtRGF0YSsrKSA9IGUtPmdldEZpZWxkQ291bnQoKTsKKworfQorCit2b2lkIHJzaV9FbGVtZW50R2V0U3ViRWxlbWVudHMoQ29udGV4dCAqcnNjLCBSc0VsZW1lbnQgZWxlbSwgdWludDMyX3QgKmlkcywgY29uc3QgY2hhciAqKm5hbWVzLCB1aW50MzJfdCBkYXRhU2l6ZSkKK3sKKyAgICBFbGVtZW50ICplID0gc3RhdGljX2Nhc3Q8RWxlbWVudCAqPihlbGVtKTsKKyAgICByc0Fzc2VydChlLT5nZXRGaWVsZENvdW50KCkgPT0gZGF0YVNpemUpOworCisgICAgZm9yKHVpbnQzMl90IGkgPSAwOyBpIDwgZGF0YVNpemU7IGkgKyspIHsKKyAgICAgICAgaWRzW2ldID0gKHVpbnQzMl90KWUtPmdldEZpZWxkKGkpOworICAgICAgICBuYW1lc1tpXSA9IGUtPmdldEZpZWxkTmFtZShpKTsKKyAgICB9CisKK30KKwogCiB9CiB9CmRpZmYgLS1naXQgYS9saWJzL3JzL3JzRWxlbWVudC5oIGIvbGlicy9ycy9yc0VsZW1lbnQuaAppbmRleCAwMmExY2EyLi5iNWRhZDdhMiAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc0VsZW1lbnQuaAorKysgYi9saWJzL3JzL3JzRWxlbWVudC5oCkBAIC00MCw5ICs0MCwxMSBAQAogICAgICAgICByZXR1cm4gKGdldFNpemVCaXRzKCkgKyA3KSA+PiAzOwogICAgIH0KIAotICAgIHNpemVfdCBnZXRGaWVsZE9mZnNldEJpdHModWludDMyX3QgY29tcG9uZW50TnVtYmVyKSBjb25zdDsKKyAgICBzaXplX3QgZ2V0RmllbGRPZmZzZXRCaXRzKHVpbnQzMl90IGNvbXBvbmVudE51bWJlcikgY29uc3QgeworICAgICAgICByZXR1cm4gbUZpZWxkc1tjb21wb25lbnROdW1iZXJdLm9mZnNldEJpdHM7CisgICAgfQogICAgIHNpemVfdCBnZXRGaWVsZE9mZnNldEJ5dGVzKHVpbnQzMl90IGNvbXBvbmVudE51bWJlcikgY29uc3QgewotICAgICAgICByZXR1cm4gKGdldEZpZWxkT2Zmc2V0Qml0cyhjb21wb25lbnROdW1iZXIpICsgNykgPj4gMzsKKyAgICAgICAgcmV0dXJuIG1GaWVsZHNbY29tcG9uZW50TnVtYmVyXS5vZmZzZXRCaXRzID4+IDM7CiAgICAgfQogCiAgICAgdWludDMyX3QgZ2V0RmllbGRDb3VudCgpIGNvbnN0IHtyZXR1cm4gbUZpZWxkQ291bnQ7fQpAQCAtNTQsMTcgKzU2LDIyIEBACiAgICAgUnNEYXRhS2luZCBnZXRLaW5kKCkgY29uc3Qge3JldHVybiBtQ29tcG9uZW50LmdldEtpbmQoKTt9CiAgICAgdWludDMyX3QgZ2V0Qml0cygpIGNvbnN0IHtyZXR1cm4gbUJpdHM7fQogCi0gICAgU3RyaW5nOCBnZXRDVHlwZSh1aW50MzJfdCBpbmRlbnQ9MCkgY29uc3Q7Ci0gICAgU3RyaW5nOCBnZXRDU3RydWN0Qm9keSh1aW50MzJfdCBpbmRlbnQ9MCkgY29uc3Q7CiAgICAgU3RyaW5nOCBnZXRHTFNMVHlwZSh1aW50MzJfdCBpbmRlbnQ9MCkgY29uc3Q7CiAKICAgICB2b2lkIGR1bXBMT0dWKGNvbnN0IGNoYXIgKnByZWZpeCkgY29uc3Q7CisgICAgdmlydHVhbCB2b2lkIHNlcmlhbGl6ZShPU3RyZWFtICpzdHJlYW0pIGNvbnN0OworICAgIHZpcnR1YWwgUnNBM0RDbGFzc0lEIGdldENsYXNzSWQoKSBjb25zdCB7IHJldHVybiBSU19BM0RfQ0xBU1NfSURfRUxFTUVOVDsgfQorICAgIHN0YXRpYyBFbGVtZW50ICpjcmVhdGVGcm9tU3RyZWFtKENvbnRleHQgKnJzYywgSVN0cmVhbSAqc3RyZWFtKTsKIAogICAgIHN0YXRpYyBjb25zdCBFbGVtZW50ICogY3JlYXRlKENvbnRleHQgKnJzYywgUnNEYXRhVHlwZSBkdCwgUnNEYXRhS2luZCBkaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzTm9ybSwgdWludDMyX3QgdmVjU2l6ZSk7CiAgICAgc3RhdGljIGNvbnN0IEVsZW1lbnQgKiBjcmVhdGUoQ29udGV4dCAqcnNjLCBzaXplX3QgY291bnQsIGNvbnN0IEVsZW1lbnQgKiosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqKiwgY29uc3Qgc2l6ZV90ICogbGVuZ3Rocyk7CiAKKyAgICB2b2lkIGluY1JlZnMoY29uc3Qgdm9pZCAqKSBjb25zdDsKKyAgICB2b2lkIGRlY1JlZnMoY29uc3Qgdm9pZCAqKSBjb25zdDsKKyAgICBib29sIGdldEhhc1JlZmVyZW5jZXMoKSBjb25zdCB7cmV0dXJuIG1IYXNSZWZlcmVuY2U7fQorCiBwcm90ZWN0ZWQ6CiAgICAgLy8gZGVhbGxvY2F0ZSBhbnkgY29tcG9uZW50cyB0aGF0IGFyZSBwYXJ0IG9mIHRoaXMgZWxlbWVudC4KICAgICB2b2lkIGNsZWFyKCk7CkBAIC03Miw5ICs3OSwxMSBAQAogICAgIHR5cGVkZWYgc3RydWN0IHsKICAgICAgICAgU3RyaW5nOCBuYW1lOwogICAgICAgICBPYmplY3RCYXNlUmVmPGNvbnN0IEVsZW1lbnQ+IGU7CisgICAgICAgIHVpbnQzMl90IG9mZnNldEJpdHM7CiAgICAgfSBFbGVtZW50RmllbGRfdDsKICAgICBFbGVtZW50RmllbGRfdCAqbUZpZWxkczsKICAgICBzaXplX3QgbUZpZWxkQ291bnQ7CisgICAgYm9vbCBtSGFzUmVmZXJlbmNlOwogCiAKICAgICBFbGVtZW50KENvbnRleHQgKik7CkBAIC05MCw3ICs5OSw3IEBACiAgICAgfkVsZW1lbnRTdGF0ZSgpOwogCiAgICAgLy8gQ2FjaGUgb2YgYWxsIGV4aXN0aW5nIGVsZW1lbnRzLgotICAgIFZlY3Rvcjxjb25zdCBFbGVtZW50ICo+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+IG1Xcml0ZUluZGV4OwogCisgICAgSVN0cmVhbSAqbVJlYWRTdHJlYW07CisgICAgVmVjdG9yPEEzREluZGV4RW50cnkqPiBtSW5kZXg7CiB9OwogCiAKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNGaWxlQTNERGVjbHMuaCBiL2xpYnMvcnMvcnNGaWxlQTNERGVjbHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmEwOGJkMy4uMDAwMDAwMAotLS0gYS9saWJzL3JzL3JzRmlsZUEzRERlY2xzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX1JTX0ZJTEVfQTNEX0RFQ0xTX0gKLSNkZWZpbmUgQU5EUk9JRF9SU19GSUxFX0EzRF9ERUNMU19ICi0KLQotI2RlZmluZSBBM0RfTUFHSUNfS0VZICJBbmRyb2lkM0RfZmYiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSByZW5kZXJzY3JpcHQgewotCi0gICAgZW51bSBBM0RDaHVua1R5cGUgewotICAgICAgICBDSFVOS19FTVBUWSwKLQotICAgICAgICBDSFVOS19FTEVNRU5ULAotICAgICAgICBDSFVOS19FTEVNRU5UX1NPVVJDRSwKLSAgICAgICAgQ0hVTktfVkVSVElDSUVTLAotICAgICAgICBDSFVOS19NRVNILAotICAgICAgICBDSFVOS19QUklNSVRJVkUsCi0KLSAgICAgICAgQ0hVTktfTEFTVAotICAgIH07Ci0KLQotfQotfQotI2VuZGlmIC8vQU5EUk9JRF9SU19GSUxFX0EzRF9ICi0KLQotCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzRm9udC5jcHAgYi9saWJzL3JzL3JzRm9udC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzY2MWQ0OTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL3JzRm9udC5jcHAKQEAgLTAsMCArMSw3NjQgQEAKKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAorI2luY2x1ZGUgInJzQ29udGV4dC5oIgorI2Vsc2UKKyNpbmNsdWRlICJyc0NvbnRleHRIb3N0U3R1Yi5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJyc0ZvbnQuaCIKKyNpbmNsdWRlICJyc1Byb2dyYW1GcmFnbWVudC5oIgorI2luY2x1ZGUgRlRfQklUTUFQX0gKKworI2luY2x1ZGUgPEdMRVMvZ2wuaD4KKyNpbmNsdWRlIDxHTEVTL2dsZXh0Lmg+CisjaW5jbHVkZSA8R0xFUzIvZ2wyLmg+CisjaW5jbHVkZSA8R0xFUzIvZ2wyZXh0Lmg+CisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OnJlbmRlcnNjcmlwdDsKKworRm9udDo6Rm9udChDb250ZXh0ICpyc2MpIDogT2JqZWN0QmFzZShyc2MpLCBtQ2FjaGVkR2x5cGhzKE5VTEwpCit7CisgICAgbUFsbG9jRmlsZSA9IF9fRklMRV9fOworICAgIG1BbGxvY0xpbmUgPSBfX0xJTkVfXzsKKyAgICBtSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKyAgICBtSGFzS2VybmluZyA9IGZhbHNlOworICAgIG1GYWNlID0gTlVMTDsKK30KKworYm9vbCBGb250Ojppbml0KGNvbnN0IGNoYXIgKm5hbWUsIHVpbnQzMl90IGZvbnRTaXplLCB1aW50MzJfdCBkcGkpCit7CisgICAgaWYobUluaXRpYWxpemVkKSB7CisgICAgICAgIExPR0UoIlJlaW5pdGlhbGl6YXRpb24gb2YgZm9udHMgbm90IHN1cHBvcnRlZCIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgU3RyaW5nOCBmb250c0RpcigiL2ZvbnRzLyIpOworICAgIFN0cmluZzggZnVsbFBhdGgoZ2V0ZW52KCJBTkRST0lEX1JPT1QiKSk7CisgICAgZnVsbFBhdGggKz0gZm9udHNEaXI7CisgICAgZnVsbFBhdGggKz0gbmFtZTsKKworICAgIEZUX0Vycm9yIGVycm9yID0gRlRfTmV3X0ZhY2UobVJTQy0+bVN0YXRlRm9udC5nZXRMaWIoKSwgZnVsbFBhdGguc3RyaW5nKCksIDAsICZtRmFjZSk7CisgICAgaWYoZXJyb3IpIHsKKyAgICAgICAgTE9HRSgiVW5hYmxlIHRvIGluaXRpYWxpemUgZm9udCAlcyIsIGZ1bGxQYXRoLnN0cmluZygpKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIG1Gb250TmFtZSA9IG5hbWU7CisgICAgbUZvbnRTaXplID0gZm9udFNpemU7CisgICAgbURwaSA9IGRwaTsKKworICAgIGVycm9yID0gRlRfU2V0X0NoYXJfU2l6ZShtRmFjZSwgZm9udFNpemUgKiA2NCwgMCwgZHBpLCAwKTsKKyAgICBpZihlcnJvcikgeworICAgICAgICBMT0dFKCJVbmFibGUgdG8gc2V0IGZvbnQgc2l6ZSBvbiAlcyIsIGZ1bGxQYXRoLnN0cmluZygpKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIG1IYXNLZXJuaW5nID0gRlRfSEFTX0tFUk5JTkcobUZhY2UpOworCisgICAgbUluaXRpYWxpemVkID0gdHJ1ZTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBGb250OjppbnZhbGlkYXRlVGV4dHVyZUNhY2hlKCkKK3sKKyAgICBmb3IodWludDMyX3QgaSA9IDA7IGkgPCBtQ2FjaGVkR2x5cGhzLnNpemUoKTsgaSArKykgeworICAgICAgICBtQ2FjaGVkR2x5cGhzLnZhbHVlQXQoaSktPm1Jc1ZhbGlkID0gZmFsc2U7CisgICAgfQorfQorCit2b2lkIEZvbnQ6OmRyYXdDYWNoZWRHbHlwaChDYWNoZWRHbHlwaEluZm8gKmdseXBoLCBpbnQgeCwgaW50IHkpCit7CisgICAgRm9udFN0YXRlICpzdGF0ZSA9ICZtUlNDLT5tU3RhdGVGb250OworCisgICAgaW50IG5QZW5YID0geCArIGdseXBoLT5tQml0bWFwTGVmdDsKKyAgICBpbnQgblBlblkgPSB5IC0gZ2x5cGgtPm1CaXRtYXBUb3AgKyBnbHlwaC0+bUJpdG1hcEhlaWdodDsKKworICAgIHN0YXRlLT5hcHBlbmRNZXNoUXVhZChuUGVuWCwgblBlblksIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGgtPm1CaXRtYXBNaW5VLCBnbHlwaC0+bUJpdG1hcE1heFYsCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuUGVuWCArIChpbnQpZ2x5cGgtPm1CaXRtYXBXaWR0aCwgblBlblksIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGgtPm1CaXRtYXBNYXhVLCBnbHlwaC0+bUJpdG1hcE1heFYsCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuUGVuWCArIChpbnQpZ2x5cGgtPm1CaXRtYXBXaWR0aCwgblBlblkgLSAoaW50KWdseXBoLT5tQml0bWFwSGVpZ2h0LCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBoLT5tQml0bWFwTWF4VSwgZ2x5cGgtPm1CaXRtYXBNaW5WLAorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgblBlblgsIG5QZW5ZIC0gKGludClnbHlwaC0+bUJpdG1hcEhlaWdodCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaC0+bUJpdG1hcE1pblUsIGdseXBoLT5tQml0bWFwTWluVik7Cit9CisKK3ZvaWQgRm9udDo6cmVuZGVyVVRGKGNvbnN0IGNoYXIgKnRleHQsIHVpbnQzMl90IGxlbiwgdWludDMyX3Qgc3RhcnQsIGludCBudW1HbHlwaHMsIGludCB4LCBpbnQgeSkKK3sKKyAgICBpZighbUluaXRpYWxpemVkIHx8IG51bUdseXBocyA9PSAwIHx8IHRleHQgPT0gTlVMTCB8fCBsZW4gPT0gMCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaW50IHBlblggPSB4LCBwZW5ZID0geTsKKyAgICBpbnQgZ2x5cGhzTGVmdCA9IDE7CisgICAgaWYobnVtR2x5cGhzID4gMCkgeworICAgICAgICBnbHlwaHNMZWZ0ID0gbnVtR2x5cGhzOworICAgIH0KKworICAgIHNpemVfdCBpbmRleCA9IHN0YXJ0OworICAgIHNpemVfdCBuZXh0SW5kZXggPSAwOworCisgICAgd2hpbGUgKGdseXBoc0xlZnQgPiAwKSB7CisKKyAgICAgICAgaW50MzJfdCB1dGZDaGFyID0gdXRmMzJfYXQodGV4dCwgbGVuLCBpbmRleCwgJm5leHRJbmRleCk7CisKKyAgICAgICAgLy8gUmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcgb3IgZW5jb3VudGVyZWQKKyAgICAgICAgaWYodXRmQ2hhciA8IDApIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLy8gTW92ZSB0byB0aGUgbmV4dCBjaGFyYWN0ZXIgaW4gdGhlIGFycmF5CisgICAgICAgIGluZGV4ID0gbmV4dEluZGV4OworCisgICAgICAgIENhY2hlZEdseXBoSW5mbyAqY2FjaGVkR2x5cGggPSBnZXRDYWNoZWRVVEZDaGFyKHV0ZkNoYXIpOworCisgICAgICAgIC8vIElmIGl0J3Mgc3RpbGwgbm90IHZhbGlkLCB3ZSBjb3VsZG4ndCBjYWNoZSBpdCwgc28gd2Ugc2hvdWxkbid0IGRyYXcgZ2FyYmFnZQorICAgICAgICBpZihjYWNoZWRHbHlwaC0+bUlzVmFsaWQpIHsKKyAgICAgICAgICAgIGRyYXdDYWNoZWRHbHlwaChjYWNoZWRHbHlwaCwgcGVuWCwgcGVuWSk7CisgICAgICAgIH0KKworICAgICAgICBwZW5YICs9IChjYWNoZWRHbHlwaC0+bUFkdmFuY2UueCA+PiA2KTsKKworICAgICAgICAvLyBJZiB3ZSB3ZXJlIGdpdmVuIGEgc3BlY2lmaWMgbnVtYmVyIG9mIGdseXBocywgZGVjcmVtZW50CisgICAgICAgIGlmKG51bUdseXBocyA+IDApIHsKKyAgICAgICAgICAgIGdseXBoc0xlZnQgLS07CisgICAgICAgIH0KKyAgICB9Cit9CisKK0ZvbnQ6OkNhY2hlZEdseXBoSW5mbyogRm9udDo6Z2V0Q2FjaGVkVVRGQ2hhcihpbnQzMl90IHV0ZkNoYXIpIHsKKworICAgIENhY2hlZEdseXBoSW5mbyAqY2FjaGVkR2x5cGggPSBtQ2FjaGVkR2x5cGhzLnZhbHVlRm9yKCh1aW50MzJfdCl1dGZDaGFyKTsKKyAgICBpZihjYWNoZWRHbHlwaCA9PSBOVUxMKSB7CisgICAgICAgIGNhY2hlZEdseXBoID0gY2FjaGVHbHlwaCgodWludDMyX3QpdXRmQ2hhcik7CisgICAgfQorICAgIC8vIElzIHRoZSBnbHlwaCBzdGlsbCBpbiB0ZXh0dXJlIGNhY2hlPworICAgIGlmKCFjYWNoZWRHbHlwaC0+bUlzVmFsaWQpIHsKKyAgICAgICAgdXBkYXRlR2x5cGhDYWNoZShjYWNoZWRHbHlwaCk7CisgICAgfQorCisgICAgcmV0dXJuIGNhY2hlZEdseXBoOworfQorCit2b2lkIEZvbnQ6OnVwZGF0ZUdseXBoQ2FjaGUoQ2FjaGVkR2x5cGhJbmZvICpnbHlwaCkKK3sKKyAgICBGVF9FcnJvciBlcnJvciA9IEZUX0xvYWRfR2x5cGgoIG1GYWNlLCBnbHlwaC0+bUdseXBoSW5kZXgsIEZUX0xPQURfUkVOREVSICk7CisgICAgaWYoZXJyb3IpIHsKKyAgICAgICAgTE9HRSgiQ291bGRuJ3QgbG9hZCBnbHlwaC4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGdseXBoLT5tQWR2YW5jZSA9IG1GYWNlLT5nbHlwaC0+YWR2YW5jZTsKKyAgICBnbHlwaC0+bUJpdG1hcExlZnQgPSBtRmFjZS0+Z2x5cGgtPmJpdG1hcF9sZWZ0OworICAgIGdseXBoLT5tQml0bWFwVG9wID0gbUZhY2UtPmdseXBoLT5iaXRtYXBfdG9wOworCisgICAgRlRfQml0bWFwICpiaXRtYXAgPSAmbUZhY2UtPmdseXBoLT5iaXRtYXA7CisKKyAgICAvLyBOb3cgY29weSB0aGUgYml0bWFwIGludG8gdGhlIGNhY2hlIHRleHR1cmUKKyAgICB1aW50MzJfdCBzdGFydFggPSAwOworICAgIHVpbnQzMl90IHN0YXJ0WSA9IDA7CisKKyAgICAvLyBMZXQgdGhlIGZvbnQgc3RhdGUgZmlndXJlIG91dCB3aGVyZSB0byBwdXQgdGhlIGJpdG1hcAorICAgIEZvbnRTdGF0ZSAqc3RhdGUgPSAmbVJTQy0+bVN0YXRlRm9udDsKKyAgICBnbHlwaC0+bUlzVmFsaWQgPSBzdGF0ZS0+Y2FjaGVCaXRtYXAoYml0bWFwLCAmc3RhcnRYLCAmc3RhcnRZKTsKKworICAgIGlmKCFnbHlwaC0+bUlzVmFsaWQpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHVpbnQzMl90IGVuZFggPSBzdGFydFggKyBiaXRtYXAtPndpZHRoOworICAgIHVpbnQzMl90IGVuZFkgPSBzdGFydFkgKyBiaXRtYXAtPnJvd3M7CisKKyAgICBnbHlwaC0+bUJpdG1hcE1pblggPSBzdGFydFg7CisgICAgZ2x5cGgtPm1CaXRtYXBNaW5ZID0gc3RhcnRZOworICAgIGdseXBoLT5tQml0bWFwV2lkdGggPSBiaXRtYXAtPndpZHRoOworICAgIGdseXBoLT5tQml0bWFwSGVpZ2h0ID0gYml0bWFwLT5yb3dzOworCisgICAgdWludDMyX3QgY2FjaGVXaWR0aCA9IHN0YXRlLT5nZXRDYWNoZVRleHR1cmVUeXBlKCktPmdldERpbVgoKTsKKyAgICB1aW50MzJfdCBjYWNoZUhlaWdodCA9IHN0YXRlLT5nZXRDYWNoZVRleHR1cmVUeXBlKCktPmdldERpbVkoKTsKKworICAgIGdseXBoLT5tQml0bWFwTWluVSA9IChmbG9hdClzdGFydFggLyAoZmxvYXQpY2FjaGVXaWR0aDsKKyAgICBnbHlwaC0+bUJpdG1hcE1pblYgPSAoZmxvYXQpc3RhcnRZIC8gKGZsb2F0KWNhY2hlSGVpZ2h0OworICAgIGdseXBoLT5tQml0bWFwTWF4VSA9IChmbG9hdCllbmRYIC8gKGZsb2F0KWNhY2hlV2lkdGg7CisgICAgZ2x5cGgtPm1CaXRtYXBNYXhWID0gKGZsb2F0KWVuZFkgLyAoZmxvYXQpY2FjaGVIZWlnaHQ7Cit9CisKK0ZvbnQ6OkNhY2hlZEdseXBoSW5mbyAqRm9udDo6Y2FjaGVHbHlwaCh1aW50MzJfdCBnbHlwaCkKK3sKKyAgICBDYWNoZWRHbHlwaEluZm8gKm5ld0dseXBoID0gbmV3IENhY2hlZEdseXBoSW5mbygpOworICAgIG1DYWNoZWRHbHlwaHMuYWRkKGdseXBoLCBuZXdHbHlwaCk7CisKKyAgICBuZXdHbHlwaC0+bUdseXBoSW5kZXggPSBGVF9HZXRfQ2hhcl9JbmRleChtRmFjZSwgZ2x5cGgpOworICAgIG5ld0dseXBoLT5tSXNWYWxpZCA9IGZhbHNlOworCisgICAgdXBkYXRlR2x5cGhDYWNoZShuZXdHbHlwaCk7CisKKyAgICByZXR1cm4gbmV3R2x5cGg7Cit9CisKK0ZvbnQgKiBGb250OjpjcmVhdGUoQ29udGV4dCAqcnNjLCBjb25zdCBjaGFyICpuYW1lLCB1aW50MzJfdCBmb250U2l6ZSwgdWludDMyX3QgZHBpKQoreworICAgIHJzYy0+bVN0YXRlRm9udC5jaGVja0luaXQoKTsKKyAgICBWZWN0b3I8Rm9udCo+ICZhY3RpdmVGb250cyA9IHJzYy0+bVN0YXRlRm9udC5tQWN0aXZlRm9udHM7CisKKyAgICBmb3IodWludDMyX3QgaSA9IDA7IGkgPCBhY3RpdmVGb250cy5zaXplKCk7IGkgKyspIHsKKyAgICAgICAgRm9udCAqaXRoRm9udCA9IGFjdGl2ZUZvbnRzW2ldOworICAgICAgICBpZihpdGhGb250LT5tRm9udE5hbWUgPT0gbmFtZSAmJiBpdGhGb250LT5tRm9udFNpemUgPT0gZm9udFNpemUgJiYgaXRoRm9udC0+bURwaSA9PSBkcGkpIHsKKyAgICAgICAgICAgIHJldHVybiBpdGhGb250OworICAgICAgICB9CisgICAgfQorCisgICAgRm9udCAqbmV3Rm9udCA9IG5ldyBGb250KHJzYyk7CisgICAgYm9vbCBpc0luaXRpYWxpemVkID0gbmV3Rm9udC0+aW5pdChuYW1lLCBmb250U2l6ZSwgZHBpKTsKKyAgICBpZihpc0luaXRpYWxpemVkKSB7CisgICAgICAgIGFjdGl2ZUZvbnRzLnB1c2gobmV3Rm9udCk7CisgICAgICAgIHJzYy0+bVN0YXRlRm9udC5wcmVjYWNoZUxhdGluKG5ld0ZvbnQpOworICAgICAgICByZXR1cm4gbmV3Rm9udDsKKyAgICB9CisKKyAgICBkZWxldGUgbmV3Rm9udDsKKyAgICByZXR1cm4gTlVMTDsKKworfQorCitGb250Ojp+Rm9udCgpCit7CisgICAgaWYobUZhY2UpIHsKKyAgICAgICAgRlRfRG9uZV9GYWNlKG1GYWNlKTsKKyAgICB9CisKKyAgICBmb3IgKHVpbnQzMl90IGN0ID0gMDsgY3QgPCBtUlNDLT5tU3RhdGVGb250Lm1BY3RpdmVGb250cy5zaXplKCk7IGN0KyspIHsKKyAgICAgICAgaWYgKG1SU0MtPm1TdGF0ZUZvbnQubUFjdGl2ZUZvbnRzW2N0XSA9PSB0aGlzKSB7CisgICAgICAgICAgICBtUlNDLT5tU3RhdGVGb250Lm1BY3RpdmVGb250cy5yZW1vdmVBdChjdCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvcih1aW50MzJfdCBpID0gMDsgaSA8IG1DYWNoZWRHbHlwaHMuc2l6ZSgpOyBpICsrKSB7CisgICAgICAgIENhY2hlZEdseXBoSW5mbyAqZ2x5cGggPSBtQ2FjaGVkR2x5cGhzLnZhbHVlQXQoaSk7CisgICAgICAgIGRlbGV0ZSBnbHlwaDsKKyAgICB9Cit9CisKK0ZvbnRTdGF0ZTo6Rm9udFN0YXRlKCkKK3sKKyAgICBtSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKyAgICBtTWF4TnVtYmVyT2ZRdWFkcyA9IDEwMjQ7CisgICAgbUN1cnJlbnRRdWFkSW5kZXggPSAwOworICAgIG1SU0MgPSBOVUxMOworICAgIG1MaWJyYXJ5ID0gTlVMTDsKKyAgICBzZXRGb250Q29sb3IoMC4xZiwgMC4xZiwgMC4xZiwgMS4wZik7Cit9CisKK0ZvbnRTdGF0ZTo6fkZvbnRTdGF0ZSgpCit7CisgICAgZm9yKHVpbnQzMl90IGkgPSAwOyBpIDwgbUNhY2hlTGluZXMuc2l6ZSgpOyBpICsrKSB7CisgICAgICAgIGRlbGV0ZSBtQ2FjaGVMaW5lc1tpXTsKKyAgICB9CisKKyAgICByc0Fzc2VydCghbUFjdGl2ZUZvbnRzLnNpemUoKSk7Cit9CisKK0ZUX0xpYnJhcnkgRm9udFN0YXRlOjpnZXRMaWIoKQoreworICAgIGlmKCFtTGlicmFyeSkgeworICAgICAgICBGVF9FcnJvciBlcnJvciA9IEZUX0luaXRfRnJlZVR5cGUoJm1MaWJyYXJ5KTsKKyAgICAgICAgaWYoZXJyb3IpIHsKKyAgICAgICAgICAgIExPR0UoIlVuYWJsZSB0byBpbml0aWFsaXplIGZyZWV0eXBlIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBtTGlicmFyeTsKK30KKwordm9pZCBGb250U3RhdGU6OmluaXQoQ29udGV4dCAqcnNjKQoreworICAgIG1SU0MgPSByc2M7Cit9CisKK3ZvaWQgRm9udFN0YXRlOjpmbHVzaEFsbEFuZEludmFsaWRhdGUoKQoreworICAgIGlmKG1DdXJyZW50UXVhZEluZGV4ICE9IDApIHsKKyAgICAgICAgaXNzdWVEcmF3Q29tbWFuZCgpOworICAgICAgICBtQ3VycmVudFF1YWRJbmRleCA9IDA7CisgICAgfQorICAgIGZvcih1aW50MzJfdCBpID0gMDsgaSA8IG1BY3RpdmVGb250cy5zaXplKCk7IGkgKyspIHsKKyAgICAgICAgbUFjdGl2ZUZvbnRzW2ldLT5pbnZhbGlkYXRlVGV4dHVyZUNhY2hlKCk7CisgICAgfQorICAgIGZvcih1aW50MzJfdCBpID0gMDsgaSA8IG1DYWNoZUxpbmVzLnNpemUoKTsgaSArKykgeworICAgICAgICBtQ2FjaGVMaW5lc1tpXS0+bUN1cnJlbnRDb2wgPSAwOworICAgIH0KK30KKworYm9vbCBGb250U3RhdGU6OmNhY2hlQml0bWFwKEZUX0JpdG1hcCAqYml0bWFwLCB1aW50MzJfdCAqcmV0T3JpZ2luWCwgdWludDMyX3QgKnJldE9yaWdpblkpCit7CisgICAgLy8gSWYgdGhlIGdseXBoIGlzIHRvbyB0YWxsLCBkb24ndCBjYWNoZSBpdAorICAgIGlmKCh1aW50MzJfdCliaXRtYXAtPnJvd3MgPiBtQ2FjaGVMaW5lc1ttQ2FjaGVMaW5lcy5zaXplKCktMV0tPm1NYXhIZWlnaHQpIHsKKyAgICAgICAgTE9HRSgiRm9udCBzaXplIHRvIGxhcmdlIHRvIGZpdCBpbiBjYWNoZS4gd2lkdGgsIGhlaWdodCA9ICVpLCAlaSIsIChpbnQpYml0bWFwLT53aWR0aCwgKGludCliaXRtYXAtPnJvd3MpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gTm93IGNvcHkgdGhlIGJpdG1hcCBpbnRvIHRoZSBjYWNoZSB0ZXh0dXJlCisgICAgdWludDMyX3Qgc3RhcnRYID0gMDsKKyAgICB1aW50MzJfdCBzdGFydFkgPSAwOworCisgICAgYm9vbCBiaXRtYXBGaXQgPSBmYWxzZTsKKyAgICBmb3IodWludDMyX3QgaSA9IDA7IGkgPCBtQ2FjaGVMaW5lcy5zaXplKCk7IGkgKyspIHsKKyAgICAgICAgYml0bWFwRml0ID0gbUNhY2hlTGluZXNbaV0tPmZpdEJpdG1hcChiaXRtYXAsICZzdGFydFgsICZzdGFydFkpOworICAgICAgICBpZihiaXRtYXBGaXQpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gSWYgdGhlIG5ldyBnbHlwaCBkaWRuJ3QgZml0LCBmbHVzaCB0aGUgc3RhdGUgc28gZmFyIGFuZCBpbnZhbGlkYXRlIGV2ZXJ5dGhpbmcKKyAgICBpZighYml0bWFwRml0KSB7CisgICAgICAgIGZsdXNoQWxsQW5kSW52YWxpZGF0ZSgpOworCisgICAgICAgIC8vIFRyeSB0byBmaXQgaXQgYWdhaW4KKyAgICAgICAgZm9yKHVpbnQzMl90IGkgPSAwOyBpIDwgbUNhY2hlTGluZXMuc2l6ZSgpOyBpICsrKSB7CisgICAgICAgICAgICBiaXRtYXBGaXQgPSBtQ2FjaGVMaW5lc1tpXS0+Zml0Qml0bWFwKGJpdG1hcCwgJnN0YXJ0WCwgJnN0YXJ0WSk7CisgICAgICAgICAgICBpZihiaXRtYXBGaXQpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIGlmIHdlIHN0aWxsIGRvbid0IGZpdCwgc29tZXRoaW5nIGlzIHdyb25nIGFuZCB3ZSBzaG91bGRuJ3QgZHJhdworICAgICAgICBpZighYml0bWFwRml0KSB7CisgICAgICAgICAgICBMT0dFKCJCaXRtYXAgZG9lc24ndCBmaXQgaW4gY2FjaGUuIHdpZHRoLCBoZWlnaHQgPSAlaSwgJWkiLCAoaW50KWJpdG1hcC0+d2lkdGgsIChpbnQpYml0bWFwLT5yb3dzKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgICpyZXRPcmlnaW5YID0gc3RhcnRYOworICAgICpyZXRPcmlnaW5ZID0gc3RhcnRZOworCisgICAgdWludDMyX3QgZW5kWCA9IHN0YXJ0WCArIGJpdG1hcC0+d2lkdGg7CisgICAgdWludDMyX3QgZW5kWSA9IHN0YXJ0WSArIGJpdG1hcC0+cm93czsKKworICAgIHVpbnQzMl90IGNhY2hlV2lkdGggPSBnZXRDYWNoZVRleHR1cmVUeXBlKCktPmdldERpbVgoKTsKKworICAgIHVuc2lnbmVkIGNoYXIgKmNhY2hlQnVmZmVyID0gKHVuc2lnbmVkIGNoYXIqKW1UZXh0VGV4dHVyZS0+Z2V0UHRyKCk7CisgICAgdW5zaWduZWQgY2hhciAqYml0bWFwQnVmZmVyID0gYml0bWFwLT5idWZmZXI7CisKKyAgICB1aW50MzJfdCBjYWNoZVggPSAwLCBiWCA9IDAsIGNhY2hlWSA9IDAsIGJZID0gMDsKKyAgICBmb3IoY2FjaGVYID0gc3RhcnRYLCBiWCA9IDA7IGNhY2hlWCA8IGVuZFg7IGNhY2hlWCArKywgYlggKyspIHsKKyAgICAgICAgZm9yKGNhY2hlWSA9IHN0YXJ0WSwgYlkgPSAwOyBjYWNoZVkgPCBlbmRZOyBjYWNoZVkgKyssIGJZICsrKSB7CisgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIHRlbXBDb2wgPSBiaXRtYXBCdWZmZXJbYlkgKiBiaXRtYXAtPndpZHRoICsgYlhdOworICAgICAgICAgICAgY2FjaGVCdWZmZXJbY2FjaGVZKmNhY2hlV2lkdGggKyBjYWNoZVhdID0gdGVtcENvbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFRoaXMgd2lsbCBkaXJ0eSB0aGUgdGV4dHVyZSBhbmQgdGhlIHNoYWRlciBzbyBuZXh0IHRpbWUKKyAgICAvLyB3ZSBkcmF3IGl0IHdpbGwgdXBsb2FkIHRoZSBkYXRhCisgICAgbVRleHRUZXh0dXJlLT5kZWZlcmVkVXBsb2FkVG9UZXh0dXJlKG1SU0MsIGZhbHNlLCAwKTsKKyAgICBtRm9udFNoYWRlckYtPmJpbmRUZXh0dXJlKDAsIG1UZXh0VGV4dHVyZS5nZXQoKSk7CisKKyAgICAvLyBTb21lIGRlYnVnIGNvZGUKKyAgICAvKmZvcih1aW50MzJfdCBpID0gMDsgaSA8IG1DYWNoZUxpbmVzLnNpemUoKTsgaSArKykgeworICAgICAgICBMT0dFKCJDYWNoZSBMaW5lOiBIOiAldSBFbXB0eSBTcGFjZTogJWYiLAorICAgICAgICAgICAgIG1DYWNoZUxpbmVzW2ldLT5tTWF4SGVpZ2h0LAorICAgICAgICAgICAgICAoMS4wZiAtIChmbG9hdCltQ2FjaGVMaW5lc1tpXS0+bUN1cnJlbnRDb2wvKGZsb2F0KW1DYWNoZUxpbmVzW2ldLT5tTWF4V2lkdGgpKjEwMC4wZik7CisKKyAgICB9Ki8KKworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIEZvbnRTdGF0ZTo6aW5pdFJlbmRlclN0YXRlKCkKK3sKKyAgICB1aW50MzJfdCB0bXBbXSA9IHsKKyAgICAgICAgUlNfVEVYX0VOVl9NT0RFX1JFUExBQ0UsIDEsCisgICAgICAgIFJTX1RFWF9FTlZfTU9ERV9OT05FLCAwLAorICAgICAgICAwLCAwCisgICAgfTsKKyAgICBQcm9ncmFtRnJhZ21lbnQgKnBmID0gbmV3IFByb2dyYW1GcmFnbWVudChtUlNDLCB0bXAsIDYpOworICAgIG1Gb250U2hhZGVyRi5zZXQocGYpOworICAgIG1Gb250U2hhZGVyRi0+aW5pdChtUlNDKTsKKworICAgIFNhbXBsZXIgKnNhbXBsZXIgPSBuZXcgU2FtcGxlcihtUlNDLCBSU19TQU1QTEVSX05FQVJFU1QsIFJTX1NBTVBMRVJfTkVBUkVTVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlNfU0FNUExFUl9DTEFNUCwgUlNfU0FNUExFUl9DTEFNUCwgUlNfU0FNUExFUl9DTEFNUCk7CisgICAgbUZvbnRTYW1wbGVyLnNldChzYW1wbGVyKTsKKyAgICBtRm9udFNoYWRlckYtPmJpbmRTYW1wbGVyKDAsIHNhbXBsZXIpOworCisgICAgUHJvZ3JhbVN0b3JlICpmb250U3RvcmUgPSBuZXcgUHJvZ3JhbVN0b3JlKG1SU0MpOworICAgIG1Gb250UHJvZ3JhbVN0b3JlLnNldChmb250U3RvcmUpOworICAgIG1Gb250UHJvZ3JhbVN0b3JlLT5zZXREZXB0aEZ1bmMoUlNfREVQVEhfRlVOQ19BTFdBWVMpOworICAgIG1Gb250UHJvZ3JhbVN0b3JlLT5zZXRCbGVuZEZ1bmMoUlNfQkxFTkRfU1JDX1NSQ19BTFBIQSwgUlNfQkxFTkRfRFNUX09ORV9NSU5VU19TUkNfQUxQSEEpOworICAgIG1Gb250UHJvZ3JhbVN0b3JlLT5zZXREaXRoZXJFbmFibGUoZmFsc2UpOworICAgIG1Gb250UHJvZ3JhbVN0b3JlLT5zZXREZXB0aE1hc2soZmFsc2UpOworfQorCit2b2lkIEZvbnRTdGF0ZTo6aW5pdFRleHRUZXh0dXJlKCkKK3sKKyAgICBjb25zdCBFbGVtZW50ICphbHBoYUVsZW0gPSBFbGVtZW50OjpjcmVhdGUobVJTQywgUlNfVFlQRV9VTlNJR05FRF84LCBSU19LSU5EX1BJWEVMX0EsIHRydWUsIDEpOworCisgICAgLy8gV2Ugd2lsbCBhbGxvY2F0ZSBhIHRleHR1cmUgdG8gaW5pdGlhbGx5IGhvbGQgMzIgY2hhcmFjdGVyIGJpdG1hcHMKKyAgICBUeXBlICp0ZXhUeXBlID0gbmV3IFR5cGUobVJTQyk7CisgICAgdGV4VHlwZS0+c2V0RWxlbWVudChhbHBoYUVsZW0pOworICAgIHRleFR5cGUtPnNldERpbVgoMTAyNCk7CisgICAgdGV4VHlwZS0+c2V0RGltWSgyNTYpOworICAgIHRleFR5cGUtPmNvbXB1dGUoKTsKKworICAgIEFsbG9jYXRpb24gKmNhY2hlQWxsb2MgPSBuZXcgQWxsb2NhdGlvbihtUlNDLCB0ZXhUeXBlKTsKKyAgICBtVGV4dFRleHR1cmUuc2V0KGNhY2hlQWxsb2MpOworICAgIG1UZXh0VGV4dHVyZS0+ZGVmZXJlZFVwbG9hZFRvVGV4dHVyZShtUlNDLCBmYWxzZSwgMCk7CisKKyAgICAvLyBTcGxpdCB1cCBvdXIgY2FjaGUgdGV4dHVyZSBpbnRvIGxpbmVzIG9mIGNlcnRhaW4gd2lkdGhzCisgICAgaW50IG5leHRMaW5lID0gMDsKKyAgICBtQ2FjaGVMaW5lcy5wdXNoKG5ldyBDYWNoZVRleHR1cmVMaW5lKDE2LCB0ZXhUeXBlLT5nZXREaW1YKCksIG5leHRMaW5lLCAwKSk7CisgICAgbmV4dExpbmUgKz0gbUNhY2hlTGluZXMudG9wKCktPm1NYXhIZWlnaHQ7CisgICAgbUNhY2hlTGluZXMucHVzaChuZXcgQ2FjaGVUZXh0dXJlTGluZSgyNCwgdGV4VHlwZS0+Z2V0RGltWCgpLCBuZXh0TGluZSwgMCkpOworICAgIG5leHRMaW5lICs9IG1DYWNoZUxpbmVzLnRvcCgpLT5tTWF4SGVpZ2h0OworICAgIG1DYWNoZUxpbmVzLnB1c2gobmV3IENhY2hlVGV4dHVyZUxpbmUoMjQsIHRleFR5cGUtPmdldERpbVgoKSwgbmV4dExpbmUsIDApKTsKKyAgICBuZXh0TGluZSArPSBtQ2FjaGVMaW5lcy50b3AoKS0+bU1heEhlaWdodDsKKyAgICBtQ2FjaGVMaW5lcy5wdXNoKG5ldyBDYWNoZVRleHR1cmVMaW5lKDMyLCB0ZXhUeXBlLT5nZXREaW1YKCksIG5leHRMaW5lLCAwKSk7CisgICAgbmV4dExpbmUgKz0gbUNhY2hlTGluZXMudG9wKCktPm1NYXhIZWlnaHQ7CisgICAgbUNhY2hlTGluZXMucHVzaChuZXcgQ2FjaGVUZXh0dXJlTGluZSgzMiwgdGV4VHlwZS0+Z2V0RGltWCgpLCBuZXh0TGluZSwgMCkpOworICAgIG5leHRMaW5lICs9IG1DYWNoZUxpbmVzLnRvcCgpLT5tTWF4SGVpZ2h0OworICAgIG1DYWNoZUxpbmVzLnB1c2gobmV3IENhY2hlVGV4dHVyZUxpbmUoNDAsIHRleFR5cGUtPmdldERpbVgoKSwgbmV4dExpbmUsIDApKTsKKyAgICBuZXh0TGluZSArPSBtQ2FjaGVMaW5lcy50b3AoKS0+bU1heEhlaWdodDsKKyAgICBtQ2FjaGVMaW5lcy5wdXNoKG5ldyBDYWNoZVRleHR1cmVMaW5lKHRleFR5cGUtPmdldERpbVkoKSAtIG5leHRMaW5lLCB0ZXhUeXBlLT5nZXREaW1YKCksIG5leHRMaW5lLCAwKSk7Cit9CisKKy8vIEF2b2lkIGhhdmluZyB0byByZWFsbG9jYXRlIG1lbW9yeSBhbmQgcmVuZGVyIHF1YWQgYnkgcXVhZAordm9pZCBGb250U3RhdGU6OmluaXRWZXJ0ZXhBcnJheUJ1ZmZlcnMoKQoreworICAgIC8vIE5vdyBsZXRzIHdyaXRlIGluZGV4IGRhdGEKKyAgICBjb25zdCBFbGVtZW50ICppbmRleEVsZW0gPSBFbGVtZW50OjpjcmVhdGUobVJTQywgUlNfVFlQRV9VTlNJR05FRF8xNiwgUlNfS0lORF9VU0VSLCBmYWxzZSwgMSk7CisgICAgVHlwZSAqaW5kZXhUeXBlID0gbmV3IFR5cGUobVJTQyk7CisgICAgdWludDMyX3QgbnVtSW5kaWNpZXMgPSBtTWF4TnVtYmVyT2ZRdWFkcyAqIDY7CisgICAgaW5kZXhUeXBlLT5zZXREaW1YKG51bUluZGljaWVzKTsKKyAgICBpbmRleFR5cGUtPnNldEVsZW1lbnQoaW5kZXhFbGVtKTsKKyAgICBpbmRleFR5cGUtPmNvbXB1dGUoKTsKKworICAgIEFsbG9jYXRpb24gKmluZGV4QWxsb2MgPSBuZXcgQWxsb2NhdGlvbihtUlNDLCBpbmRleFR5cGUpOworICAgIHVpbnQxNl90ICppbmRleFB0ciA9ICh1aW50MTZfdCopaW5kZXhBbGxvYy0+Z2V0UHRyKCk7CisKKyAgICAvLyBGb3VyIHZlcnRzLCB0d28gdHJpYW5nbGVzICwgc2l4IGluZGljZXMgcGVyIHF1YWQKKyAgICBmb3IodWludDMyX3QgaSA9IDA7IGkgPCBtTWF4TnVtYmVyT2ZRdWFkczsgaSArKykgeworICAgICAgICBpbnQgaTYgPSBpICogNjsKKyAgICAgICAgaW50IGk0ID0gaSAqIDQ7CisKKyAgICAgICAgaW5kZXhQdHJbaTYgKyAwXSA9IGk0ICsgMDsKKyAgICAgICAgaW5kZXhQdHJbaTYgKyAxXSA9IGk0ICsgMTsKKyAgICAgICAgaW5kZXhQdHJbaTYgKyAyXSA9IGk0ICsgMjsKKworICAgICAgICBpbmRleFB0cltpNiArIDNdID0gaTQgKyAwOworICAgICAgICBpbmRleFB0cltpNiArIDRdID0gaTQgKyAyOworICAgICAgICBpbmRleFB0cltpNiArIDVdID0gaTQgKyAzOworICAgIH0KKworICAgIGluZGV4QWxsb2MtPmRlZmVyZWRVcGxvYWRUb0J1ZmZlck9iamVjdChtUlNDKTsKKyAgICBtSW5kZXhCdWZmZXIuc2V0KGluZGV4QWxsb2MpOworCisgICAgY29uc3QgRWxlbWVudCAqcG9zRWxlbSA9IEVsZW1lbnQ6OmNyZWF0ZShtUlNDLCBSU19UWVBFX0ZMT0FUXzMyLCBSU19LSU5EX1VTRVIsIGZhbHNlLCAzKTsKKyAgICBjb25zdCBFbGVtZW50ICp0ZXhFbGVtID0gRWxlbWVudDo6Y3JlYXRlKG1SU0MsIFJTX1RZUEVfRkxPQVRfMzIsIFJTX0tJTkRfVVNFUiwgZmFsc2UsIDIpOworCisgICAgY29uc3QgRWxlbWVudCAqZWxlbUFycmF5WzJdOworICAgIGVsZW1BcnJheVswXSA9IHBvc0VsZW07CisgICAgZWxlbUFycmF5WzFdID0gdGV4RWxlbTsKKworICAgIFN0cmluZzggcG9zTmFtZSgicG9zaXRpb24iKTsKKyAgICBTdHJpbmc4IHRleE5hbWUoInRleHR1cmUwIik7CisKKyAgICBjb25zdCBjaGFyICpuYW1lQXJyYXlbMl07CisgICAgbmFtZUFycmF5WzBdID0gcG9zTmFtZS5zdHJpbmcoKTsKKyAgICBuYW1lQXJyYXlbMV0gPSB0ZXhOYW1lLnN0cmluZygpOworICAgIHNpemVfdCBsZW5ndGhzWzJdOworICAgIGxlbmd0aHNbMF0gPSBwb3NOYW1lLnNpemUoKTsKKyAgICBsZW5ndGhzWzFdID0gdGV4TmFtZS5zaXplKCk7CisKKyAgICBjb25zdCBFbGVtZW50ICp2ZXJ0ZXhEYXRhRWxlbSA9IEVsZW1lbnQ6OmNyZWF0ZShtUlNDLCAyLCBlbGVtQXJyYXksIG5hbWVBcnJheSwgbGVuZ3Rocyk7CisKKyAgICBUeXBlICp2ZXJ0ZXhEYXRhVHlwZSA9IG5ldyBUeXBlKG1SU0MpOworICAgIHZlcnRleERhdGFUeXBlLT5zZXREaW1YKG1NYXhOdW1iZXJPZlF1YWRzICogNCk7CisgICAgdmVydGV4RGF0YVR5cGUtPnNldEVsZW1lbnQodmVydGV4RGF0YUVsZW0pOworICAgIHZlcnRleERhdGFUeXBlLT5jb21wdXRlKCk7CisKKyAgICBBbGxvY2F0aW9uICp2ZXJ0ZXhBbGxvYyA9IG5ldyBBbGxvY2F0aW9uKG1SU0MsIHZlcnRleERhdGFUeXBlKTsKKyAgICBtVGV4dE1lc2hQdHIgPSAoZmxvYXQqKXZlcnRleEFsbG9jLT5nZXRQdHIoKTsKKworICAgIG1WZXJ0ZXhBcnJheS5zZXQodmVydGV4QWxsb2MpOworfQorCisvLyBXZSBkb24ndCB3YW50IHRvIGFsbG9jYXRlIGFueXRoaW5nIHVubGVzcyB3ZSBhY3R1YWxseSBkcmF3IHRleHQKK3ZvaWQgRm9udFN0YXRlOjpjaGVja0luaXQoKQoreworICAgIGlmKG1Jbml0aWFsaXplZCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaW5pdFRleHRUZXh0dXJlKCk7CisgICAgaW5pdFJlbmRlclN0YXRlKCk7CisKKyAgICBpbml0VmVydGV4QXJyYXlCdWZmZXJzKCk7CisKKyAgICAvLyBXZSBzdG9yZSBhIHN0cmluZyB3aXRoIGxldHRlcnMgaW4gYSByb3VnaCBmcmVxdWVuY3kgb2Ygb2NjdXJyZW5jZQorICAgIG1MYXRpblByZWNhY2hlID0gU3RyaW5nOCgiIGVpc2FybnRvbGNkdWdwbWhieWZ2a3d6eGpxIik7CisgICAgbUxhdGluUHJlY2FjaGUgKz0gU3RyaW5nOCgiRUlTQVJOVE9MQ0RVR1BNSEJZRlZLV1pYSlEiKTsKKyAgICBtTGF0aW5QcmVjYWNoZSArPSBTdHJpbmc4KCIsLj8hKCktK0A7OmAnIik7CisgICAgbUxhdGluUHJlY2FjaGUgKz0gU3RyaW5nOCgiMDEyMzQ1Njc4OSIpOworCisgICAgbUluaXRpYWxpemVkID0gdHJ1ZTsKK30KKwordm9pZCBGb250U3RhdGU6Omlzc3VlRHJhd0NvbW1hbmQoKSB7CisKKyAgICBPYmplY3RCYXNlUmVmPGNvbnN0IFByb2dyYW1WZXJ0ZXg+IHRtcFYobVJTQy0+Z2V0VmVydGV4KCkpOworICAgIG1SU0MtPnNldFZlcnRleChtUlNDLT5nZXREZWZhdWx0UHJvZ3JhbVZlcnRleCgpKTsKKworICAgIE9iamVjdEJhc2VSZWY8Y29uc3QgUHJvZ3JhbVJhc3Rlcj4gdG1wUihtUlNDLT5nZXRSYXN0ZXIoKSk7CisgICAgbVJTQy0+c2V0UmFzdGVyKG1SU0MtPmdldERlZmF1bHRQcm9ncmFtUmFzdGVyKCkpOworCisgICAgT2JqZWN0QmFzZVJlZjxjb25zdCBQcm9ncmFtRnJhZ21lbnQ+IHRtcEYobVJTQy0+Z2V0RnJhZ21lbnQoKSk7CisgICAgbVJTQy0+c2V0RnJhZ21lbnQobUZvbnRTaGFkZXJGLmdldCgpKTsKKworICAgIE9iamVjdEJhc2VSZWY8Y29uc3QgUHJvZ3JhbVN0b3JlPiB0bXBQUyhtUlNDLT5nZXRGcmFnbWVudFN0b3JlKCkpOworICAgIG1SU0MtPnNldEZyYWdtZW50U3RvcmUobUZvbnRQcm9ncmFtU3RvcmUuZ2V0KCkpOworCisgICAgaWYobUZvbnRDb2xvckRpcnR5KSB7CisgICAgICAgIG1Gb250U2hhZGVyRi0+c2V0Q29uc3RhbnRDb2xvcihtRm9udENvbG9yWzBdLCBtRm9udENvbG9yWzFdLCBtRm9udENvbG9yWzJdLCBtRm9udENvbG9yWzNdKTsKKyAgICAgICAgbUZvbnRDb2xvckRpcnR5ID0gZmFsc2U7CisgICAgfQorCisgICAgaWYgKCFtUlNDLT5zZXR1cENoZWNrKCkpIHsKKyAgICAgICAgbVJTQy0+c2V0VmVydGV4KChQcm9ncmFtVmVydGV4ICopdG1wVi5nZXQoKSk7CisgICAgICAgIG1SU0MtPnNldFJhc3RlcigoUHJvZ3JhbVJhc3RlciAqKXRtcFIuZ2V0KCkpOworICAgICAgICBtUlNDLT5zZXRGcmFnbWVudCgoUHJvZ3JhbUZyYWdtZW50ICopdG1wRi5nZXQoKSk7CisgICAgICAgIG1SU0MtPnNldEZyYWdtZW50U3RvcmUoKFByb2dyYW1TdG9yZSAqKXRtcFBTLmdldCgpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGZsb2F0ICp2dHggPSAoZmxvYXQqKW1WZXJ0ZXhBcnJheS0+Z2V0UHRyKCk7CisgICAgZmxvYXQgKnRleCA9IHZ0eCArIDM7CisKKyAgICBWZXJ0ZXhBcnJheSB2YTsKKyAgICB2YS5hZGQoR0xfRkxPQVQsIDMsIDIwLCBmYWxzZSwgKHVpbnQzMl90KXZ0eCwgInBvc2l0aW9uIik7CisgICAgdmEuYWRkKEdMX0ZMT0FULCAyLCAyMCwgZmFsc2UsICh1aW50MzJfdCl0ZXgsICJ0ZXh0dXJlMCIpOworICAgIHZhLnNldHVwR0wyKG1SU0MsICZtUlNDLT5tU3RhdGVWZXJ0ZXhBcnJheSwgJm1SU0MtPm1TaGFkZXJDYWNoZSk7CisKKyAgICBtSW5kZXhCdWZmZXItPnVwbG9hZENoZWNrKG1SU0MpOworICAgIGdsQmluZEJ1ZmZlcihHTF9FTEVNRU5UX0FSUkFZX0JVRkZFUiwgbUluZGV4QnVmZmVyLT5nZXRCdWZmZXJPYmplY3RJRCgpKTsKKyAgICBnbERyYXdFbGVtZW50cyhHTF9UUklBTkdMRVMsIG1DdXJyZW50UXVhZEluZGV4ICogNiwgR0xfVU5TSUdORURfU0hPUlQsICh1aW50MTZfdCAqKSgwKSk7CisKKyAgICAvLyBSZXNldCB0aGUgc3RhdGUKKyAgICBtUlNDLT5zZXRWZXJ0ZXgoKFByb2dyYW1WZXJ0ZXggKil0bXBWLmdldCgpKTsKKyAgICBtUlNDLT5zZXRSYXN0ZXIoKFByb2dyYW1SYXN0ZXIgKil0bXBSLmdldCgpKTsKKyAgICBtUlNDLT5zZXRGcmFnbWVudCgoUHJvZ3JhbUZyYWdtZW50ICopdG1wRi5nZXQoKSk7CisgICAgbVJTQy0+c2V0RnJhZ21lbnRTdG9yZSgoUHJvZ3JhbVN0b3JlICopdG1wUFMuZ2V0KCkpOworfQorCit2b2lkIEZvbnRTdGF0ZTo6YXBwZW5kTWVzaFF1YWQoZmxvYXQgeDEsIGZsb2F0IHkxLCBmbG9hdCB6MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB1MSwgZmxvYXQgdjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeDIsIGZsb2F0IHkyLCBmbG9hdCB6MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB1MiwgZmxvYXQgdjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeDMsIGZsb2F0IHkzLCBmbG9hdCB6MywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB1MywgZmxvYXQgdjMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeDQsIGZsb2F0IHk0LCBmbG9hdCB6NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB1NCwgZmxvYXQgdjQpCit7CisgICAgY29uc3QgdWludDMyX3QgdmVydHNQZXJRdWFkID0gNDsKKyAgICBjb25zdCB1aW50MzJfdCBmbG9hdHNQZXJWZXJ0ID0gNTsKKyAgICBmbG9hdCAqY3VycmVudFBvcyA9IG1UZXh0TWVzaFB0ciArIG1DdXJyZW50UXVhZEluZGV4ICogdmVydHNQZXJRdWFkICogZmxvYXRzUGVyVmVydDsKKworICAgIC8vIEN1bGwgdGhpbmdzIHRoYXQgYXJlIG9mZiB0aGUgc2NyZWVuCisgICAgZmxvYXQgd2lkdGggPSAoZmxvYXQpbVJTQy0+Z2V0V2lkdGgoKTsKKyAgICBmbG9hdCBoZWlnaHQgPSAoZmxvYXQpbVJTQy0+Z2V0SGVpZ2h0KCk7CisKKyAgICBpZih4MSA+IHdpZHRoIHx8IHkxIDwgMC4wZiB8fCB4MiA8IDAgfHwgeTQgPiBoZWlnaHQpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qTE9HRSgiVjAgeDogJWYgeTogJWYgejogJWYiLCB4MSwgeTEsIHoxKTsKKyAgICBMT0dFKCJWMSB4OiAlZiB5OiAlZiB6OiAlZiIsIHgyLCB5MiwgejIpOworICAgIExPR0UoIlYyIHg6ICVmIHk6ICVmIHo6ICVmIiwgeDMsIHkzLCB6Myk7CisgICAgTE9HRSgiVjMgeDogJWYgeTogJWYgejogJWYiLCB4NCwgeTQsIHo0KTsqLworCisgICAgKCpjdXJyZW50UG9zKyspID0geDE7CisgICAgKCpjdXJyZW50UG9zKyspID0geTE7CisgICAgKCpjdXJyZW50UG9zKyspID0gejE7CisgICAgKCpjdXJyZW50UG9zKyspID0gdTE7CisgICAgKCpjdXJyZW50UG9zKyspID0gdjE7CisKKyAgICAoKmN1cnJlbnRQb3MrKykgPSB4MjsKKyAgICAoKmN1cnJlbnRQb3MrKykgPSB5MjsKKyAgICAoKmN1cnJlbnRQb3MrKykgPSB6MjsKKyAgICAoKmN1cnJlbnRQb3MrKykgPSB1MjsKKyAgICAoKmN1cnJlbnRQb3MrKykgPSB2MjsKKworICAgICgqY3VycmVudFBvcysrKSA9IHgzOworICAgICgqY3VycmVudFBvcysrKSA9IHkzOworICAgICgqY3VycmVudFBvcysrKSA9IHozOworICAgICgqY3VycmVudFBvcysrKSA9IHUzOworICAgICgqY3VycmVudFBvcysrKSA9IHYzOworCisgICAgKCpjdXJyZW50UG9zKyspID0geDQ7CisgICAgKCpjdXJyZW50UG9zKyspID0geTQ7CisgICAgKCpjdXJyZW50UG9zKyspID0gejQ7CisgICAgKCpjdXJyZW50UG9zKyspID0gdTQ7CisgICAgKCpjdXJyZW50UG9zKyspID0gdjQ7CisKKyAgICBtQ3VycmVudFF1YWRJbmRleCArKzsKKworICAgIGlmKG1DdXJyZW50UXVhZEluZGV4ID09IG1NYXhOdW1iZXJPZlF1YWRzKSB7CisgICAgICAgIGlzc3VlRHJhd0NvbW1hbmQoKTsKKyAgICAgICAgbUN1cnJlbnRRdWFkSW5kZXggPSAwOworICAgIH0KK30KKwordWludDMyX3QgRm9udFN0YXRlOjpnZXRSZW1haW5pbmdDYWNoZUNhcGFjaXR5KCkgeworICAgIHVpbnQzMl90IHJlbWFpbmluZ0NhcGFjaXR5ID0gMDsKKyAgICB1aW50MzJfdCB0b3RhbFBpeGVscyA9IDA7CisgICAgZm9yKHVpbnQzMl90IGkgPSAwOyBpIDwgbUNhY2hlTGluZXMuc2l6ZSgpOyBpICsrKSB7CisgICAgICAgICByZW1haW5pbmdDYXBhY2l0eSArPSAobUNhY2hlTGluZXNbaV0tPm1NYXhXaWR0aCAtIG1DYWNoZUxpbmVzW2ldLT5tQ3VycmVudENvbCk7CisgICAgICAgICB0b3RhbFBpeGVscyArPSBtQ2FjaGVMaW5lc1tpXS0+bU1heFdpZHRoOworICAgIH0KKyAgICByZW1haW5pbmdDYXBhY2l0eSA9IChyZW1haW5pbmdDYXBhY2l0eSAqIDEwMCkgLyB0b3RhbFBpeGVsczsKKyAgICByZXR1cm4gcmVtYWluaW5nQ2FwYWNpdHk7Cit9CisKK3ZvaWQgRm9udFN0YXRlOjpwcmVjYWNoZUxhdGluKEZvbnQgKmZvbnQpIHsKKyAgICAvLyBSZW1haW5pbmcgY2FwYWNpdHkgaXMgbWVhc3VyZWQgaW4gJQorICAgIHVpbnQzMl90IHJlbWFpbmluZ0NhcGFjaXR5ID0gZ2V0UmVtYWluaW5nQ2FjaGVDYXBhY2l0eSgpOworICAgIHVpbnQzMl90IHByZWNhY2hlSWR4ID0gMDsKKyAgICB3aGlsZShyZW1haW5pbmdDYXBhY2l0eSA+IDI1ICYmIHByZWNhY2hlSWR4IDwgbUxhdGluUHJlY2FjaGUuc2l6ZSgpKSB7CisgICAgICAgIGZvbnQtPmdldENhY2hlZFVURkNoYXIoKGludDMyX3QpbUxhdGluUHJlY2FjaGVbcHJlY2FjaGVJZHhdKTsKKyAgICAgICAgcmVtYWluaW5nQ2FwYWNpdHkgPSBnZXRSZW1haW5pbmdDYWNoZUNhcGFjaXR5KCk7CisgICAgICAgIHByZWNhY2hlSWR4ICsrOworICAgIH0KK30KKworCit2b2lkIEZvbnRTdGF0ZTo6cmVuZGVyVGV4dChjb25zdCBjaGFyICp0ZXh0LCB1aW50MzJfdCBsZW4sIHVpbnQzMl90IHN0YXJ0SW5kZXgsIGludCBudW1HbHlwaHMsIGludCB4LCBpbnQgeSkKK3sKKyAgICBjaGVja0luaXQoKTsKKworICAgIC8vIFJlbmRlciBjb2RlIGhlcmUKKyAgICBGb250ICpjdXJyZW50Rm9udCA9IG1SU0MtPmdldEZvbnQoKTsKKyAgICBpZighY3VycmVudEZvbnQpIHsKKyAgICAgICAgaWYoIW1EZWZhdWx0LmdldCgpKSB7CisgICAgICAgICAgICBtRGVmYXVsdC5zZXQoRm9udDo6Y3JlYXRlKG1SU0MsICJEcm9pZFNhbnMudHRmIiwgMTYsIDk2KSk7CisgICAgICAgIH0KKyAgICAgICAgY3VycmVudEZvbnQgPSBtRGVmYXVsdC5nZXQoKTsKKyAgICB9CisgICAgaWYoIWN1cnJlbnRGb250KSB7CisgICAgICAgIExPR0UoIlVuYWJsZSB0byBpbml0aWFsaXplIGFueSBmb250cyIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgY3VycmVudEZvbnQtPnJlbmRlclVURih0ZXh0LCBsZW4sIHN0YXJ0SW5kZXgsIG51bUdseXBocywgeCwgeSk7CisKKyAgICBpZihtQ3VycmVudFF1YWRJbmRleCAhPSAwKSB7CisgICAgICAgIGlzc3VlRHJhd0NvbW1hbmQoKTsKKyAgICAgICAgbUN1cnJlbnRRdWFkSW5kZXggPSAwOworICAgIH0KK30KKwordm9pZCBGb250U3RhdGU6OnJlbmRlclRleHQoY29uc3QgY2hhciAqdGV4dCwgaW50IHgsIGludCB5KQoreworICAgIHNpemVfdCB0ZXh0TGVuID0gc3RybGVuKHRleHQpOworICAgIHJlbmRlclRleHQodGV4dCwgdGV4dExlbiwgMCwgLTEsIHgsIHkpOworfQorCit2b2lkIEZvbnRTdGF0ZTo6cmVuZGVyVGV4dChBbGxvY2F0aW9uICphbGxvYywgaW50IHgsIGludCB5KQoreworICAgIGlmKCFhbGxvYykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgY29uc3QgY2hhciAqdGV4dCA9IChjb25zdCBjaGFyICopYWxsb2MtPmdldFB0cigpOworICAgIHNpemVfdCBhbGxvY1NpemUgPSBhbGxvYy0+Z2V0VHlwZSgpLT5nZXRTaXplQnl0ZXMoKTsKKyAgICByZW5kZXJUZXh0KHRleHQsIGFsbG9jU2l6ZSwgMCwgLTEsIHgsIHkpOworfQorCit2b2lkIEZvbnRTdGF0ZTo6cmVuZGVyVGV4dChBbGxvY2F0aW9uICphbGxvYywgdWludDMyX3Qgc3RhcnQsIGludCBsZW4sIGludCB4LCBpbnQgeSkKK3sKKyAgICBpZighYWxsb2MpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNvbnN0IGNoYXIgKnRleHQgPSAoY29uc3QgY2hhciAqKWFsbG9jLT5nZXRQdHIoKTsKKyAgICBzaXplX3QgYWxsb2NTaXplID0gYWxsb2MtPmdldFR5cGUoKS0+Z2V0U2l6ZUJ5dGVzKCk7CisgICAgcmVuZGVyVGV4dCh0ZXh0LCBhbGxvY1NpemUsIHN0YXJ0LCBsZW4sIHgsIHkpOworfQorCit2b2lkIEZvbnRTdGF0ZTo6c2V0Rm9udENvbG9yKGZsb2F0IHIsIGZsb2F0IGcsIGZsb2F0IGIsIGZsb2F0IGEpIHsKKyAgICBtRm9udENvbG9yWzBdID0gcjsKKyAgICBtRm9udENvbG9yWzFdID0gZzsKKyAgICBtRm9udENvbG9yWzJdID0gYjsKKyAgICBtRm9udENvbG9yWzNdID0gYTsKKyAgICBtRm9udENvbG9yRGlydHkgPSB0cnVlOworfQorCit2b2lkIEZvbnRTdGF0ZTo6Z2V0Rm9udENvbG9yKGZsb2F0ICpyLCBmbG9hdCAqZywgZmxvYXQgKmIsIGZsb2F0ICphKSBjb25zdCB7CisgICAgKnIgPSBtRm9udENvbG9yWzBdOworICAgICpnID0gbUZvbnRDb2xvclsxXTsKKyAgICAqYiA9IG1Gb250Q29sb3JbMl07CisgICAgKmEgPSBtRm9udENvbG9yWzNdOworfQorCit2b2lkIEZvbnRTdGF0ZTo6ZGVpbml0KENvbnRleHQgKnJzYykKK3sKKyAgICBtSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKworICAgIG1JbmRleEJ1ZmZlci5jbGVhcigpOworICAgIG1WZXJ0ZXhBcnJheS5jbGVhcigpOworCisgICAgbUZvbnRTaGFkZXJGLmNsZWFyKCk7CisgICAgbUZvbnRTYW1wbGVyLmNsZWFyKCk7CisgICAgbUZvbnRQcm9ncmFtU3RvcmUuY2xlYXIoKTsKKworICAgIG1UZXh0VGV4dHVyZS5jbGVhcigpOworICAgIGZvcih1aW50MzJfdCBpID0gMDsgaSA8IG1DYWNoZUxpbmVzLnNpemUoKTsgaSArKykgeworICAgICAgICBkZWxldGUgbUNhY2hlTGluZXNbaV07CisgICAgfQorICAgIG1DYWNoZUxpbmVzLmNsZWFyKCk7CisKKyAgICBtRGVmYXVsdC5jbGVhcigpOworCisgICAgVmVjdG9yPEZvbnQqPiBmb250c1RvRGVyZWZlcmVuY2UgPSBtQWN0aXZlRm9udHM7CisgICAgZm9yKHVpbnQzMl90IGkgPSAwOyBpIDwgZm9udHNUb0RlcmVmZXJlbmNlLnNpemUoKTsgaSArKykgeworICAgICAgICBmb250c1RvRGVyZWZlcmVuY2VbaV0tPnplcm9Vc2VyUmVmKCk7CisgICAgfQorCisgICAgaWYobUxpYnJhcnkpIHsKKyAgICAgICAgRlRfRG9uZV9GcmVlVHlwZSggbUxpYnJhcnkgKTsKKyAgICAgICAgbUxpYnJhcnkgPSBOVUxMOworICAgIH0KK30KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHJlbmRlcnNjcmlwdCB7CisKK1JzRm9udCByc2lfRm9udENyZWF0ZUZyb21GaWxlKENvbnRleHQgKnJzYywgY2hhciBjb25zdCAqbmFtZSwgdWludDMyX3QgZm9udFNpemUsIHVpbnQzMl90IGRwaSkKK3sKKyAgICBGb250ICpuZXdGb250ID0gRm9udDo6Y3JlYXRlKHJzYywgbmFtZSwgZm9udFNpemUsIGRwaSk7CisgICAgaWYobmV3Rm9udCkgeworICAgICAgICBuZXdGb250LT5pbmNVc2VyUmVmKCk7CisgICAgfQorICAgIHJldHVybiBuZXdGb250OworfQorCit9IC8vIHJlbmRlcnNjcmlwdAorfSAvLyBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzRm9udC5oIGIvbGlicy9ycy9yc0ZvbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWZlMzhiCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9yc0ZvbnQuaApAQCAtMCwwICsxLDIyMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9SU19GT05UX0gKKyNkZWZpbmUgQU5EUk9JRF9SU19GT05UX0gKKworI2luY2x1ZGUgIlJlbmRlclNjcmlwdC5oIgorI2luY2x1ZGUgInJzU3RyZWFtLmgiCisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CisKKyNpbmNsdWRlIDxmdDJidWlsZC5oPgorI2luY2x1ZGUgRlRfRlJFRVRZUEVfSAorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK25hbWVzcGFjZSBhbmRyb2lkIHsKKworbmFtZXNwYWNlIHJlbmRlcnNjcmlwdCB7CisKK2NsYXNzIEZvbnRTdGF0ZTsKKworY2xhc3MgRm9udCA6IHB1YmxpYyBPYmplY3RCYXNlCit7CitwdWJsaWM6CisgICAgfkZvbnQoKTsKKworICAgIC8vIFBvaW50ZXIgdG8gdGhlIHV0ZiBkYXRhLCBsZW5ndGggb2YgZGF0YSwgd2hlcmUgdG8gc3RhcnQsIG51bWJlciBvZiBnbHlwaHMgb3QgcmVhZAorICAgIC8vIChlYWNoIGdseXBoIG1heSBiZSBsb25nZXIgdGhhbiBhIGNoYXIgYmVjYXVzZSB3ZSBhcmUgZGVhbGluZyB3aXRoIHV0ZiBkYXRhKQorICAgIC8vIExhc3QgdHdvIHZhcmlhYmxlcyBhcmUgdGhlIGluaXRpYWwgcGVuIHBvc2l0aW9uCisgICAgdm9pZCByZW5kZXJVVEYoY29uc3QgY2hhciAqdGV4dCwgdWludDMyX3QgbGVuLCB1aW50MzJfdCBzdGFydCwgaW50IG51bUdseXBocywgaW50IHgsIGludCB5KTsKKworICAgIC8vIEN1cnJlbnRseSBmaWxlcyBkbyBub3QgZ2V0IHNlcmlhbGl6ZWQsCisgICAgLy8gYnV0IHdlIG5lZWQgdG8gaW5oZXJpdCBmcm9tIE9iamVjdEJhc2UgZm9yIHJlZiB0cmFja2luZworICAgIHZpcnR1YWwgdm9pZCBzZXJpYWxpemUoT1N0cmVhbSAqc3RyZWFtKSBjb25zdCB7CisgICAgfQorICAgIHZpcnR1YWwgUnNBM0RDbGFzc0lEIGdldENsYXNzSWQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBSU19BM0RfQ0xBU1NfSURfVU5LTk9XTjsKKyAgICB9CisKKyAgICBzdGF0aWMgRm9udCAqIGNyZWF0ZShDb250ZXh0ICpyc2MsIGNvbnN0IGNoYXIgKm5hbWUsIHVpbnQzMl90IGZvbnRTaXplLCB1aW50MzJfdCBkcGkpOworCitwcm90ZWN0ZWQ6CisKKyAgICBmcmllbmQgY2xhc3MgRm9udFN0YXRlOworCisgICAgdm9pZCBpbnZhbGlkYXRlVGV4dHVyZUNhY2hlKCk7CisgICAgc3RydWN0IENhY2hlZEdseXBoSW5mbworICAgIHsKKyAgICAgICAgLy8gSGFzIHRoZSBjYWNoZSBiZWVuIGludmFsaWRhdGVkPworICAgICAgICBib29sIG1Jc1ZhbGlkOworICAgICAgICAvLyBMb2NhdGlvbiBvZiB0aGUgY2FjaGVkIGdseXBoIGluIHRoZSBiaXRtYXAKKyAgICAgICAgLy8gaW4gY2FzZSB3ZSBuZWVkIHRvIHJlc2l6ZSB0aGUgdGV4dHVyZQorICAgICAgICB1aW50MzJfdCBtQml0bWFwTWluWDsKKyAgICAgICAgdWludDMyX3QgbUJpdG1hcE1pblk7CisgICAgICAgIHVpbnQzMl90IG1CaXRtYXBXaWR0aDsKKyAgICAgICAgdWludDMyX3QgbUJpdG1hcEhlaWdodDsKKyAgICAgICAgLy8gQWxzbyBjYWNoZSB0ZXh0dXJlIGNvb3JkcyBmb3IgdGhlIHF1YWQKKyAgICAgICAgZmxvYXQgbUJpdG1hcE1pblU7CisgICAgICAgIGZsb2F0IG1CaXRtYXBNaW5WOworICAgICAgICBmbG9hdCBtQml0bWFwTWF4VTsKKyAgICAgICAgZmxvYXQgbUJpdG1hcE1heFY7CisgICAgICAgIC8vIE1pbmltaXplIGhvdyBtdWNoIHdlIGNhbGwgZnJlZXR5cGUKKyAgICAgICAgRlRfVUludCBtR2x5cGhJbmRleDsKKyAgICAgICAgRlRfVmVjdG9yIG1BZHZhbmNlOworICAgICAgICAvLyBWYWx1ZXMgYmVsb3cgY29udGFpbiBhIGdseXBoJ3Mgb3JpZ2luIGluIHRoZSBiaXRtYXAKKyAgICAgICAgRlRfSW50IG1CaXRtYXBMZWZ0OworICAgICAgICBGVF9JbnQgbUJpdG1hcFRvcDsKKyAgICB9OworCisgICAgU3RyaW5nOCBtRm9udE5hbWU7CisgICAgdWludDMyX3QgbUZvbnRTaXplOworICAgIHVpbnQzMl90IG1EcGk7CisKKyAgICBGb250KENvbnRleHQgKnJzYyk7CisgICAgYm9vbCBpbml0KGNvbnN0IGNoYXIgKm5hbWUsIHVpbnQzMl90IGZvbnRTaXplLCB1aW50MzJfdCBkcGkpOworCisgICAgRlRfRmFjZSBtRmFjZTsKKyAgICBib29sIG1Jbml0aWFsaXplZDsKKyAgICBib29sIG1IYXNLZXJuaW5nOworCisgICAgRGVmYXVsdEtleWVkVmVjdG9yPHVpbnQzMl90LCBDYWNoZWRHbHlwaEluZm8qID4gbUNhY2hlZEdseXBoczsKKyAgICBDYWNoZWRHbHlwaEluZm8qIGdldENhY2hlZFVURkNoYXIoaW50MzJfdCB1dGZDaGFyKTsKKworICAgIENhY2hlZEdseXBoSW5mbyAqY2FjaGVHbHlwaCh1aW50MzJfdCBnbHlwaCk7CisgICAgdm9pZCB1cGRhdGVHbHlwaENhY2hlKENhY2hlZEdseXBoSW5mbyAqZ2x5cGgpOworICAgIHZvaWQgZHJhd0NhY2hlZEdseXBoKENhY2hlZEdseXBoSW5mbyAqZ2x5cGgsIGludCB4LCBpbnQgeSk7Cit9OworCitjbGFzcyBGb250U3RhdGUKK3sKK3B1YmxpYzoKKyAgICBGb250U3RhdGUoKTsKKyAgICB+Rm9udFN0YXRlKCk7CisKKyAgICB2b2lkIGluaXQoQ29udGV4dCAqcnNjKTsKKyAgICB2b2lkIGRlaW5pdChDb250ZXh0ICpyc2MpOworCisgICAgT2JqZWN0QmFzZVJlZjxGb250PiBtRGVmYXVsdDsKKyAgICBPYmplY3RCYXNlUmVmPEZvbnQ+IG1MYXN0OworCisgICAgdm9pZCByZW5kZXJUZXh0KGNvbnN0IGNoYXIgKnRleHQsIHVpbnQzMl90IGxlbiwgdWludDMyX3Qgc3RhcnRJbmRleCwgaW50IG51bUdseXBocywgaW50IHgsIGludCB5KTsKKyAgICB2b2lkIHJlbmRlclRleHQoY29uc3QgY2hhciAqdGV4dCwgaW50IHgsIGludCB5KTsKKyAgICB2b2lkIHJlbmRlclRleHQoQWxsb2NhdGlvbiAqYWxsb2MsIGludCB4LCBpbnQgeSk7CisgICAgdm9pZCByZW5kZXJUZXh0KEFsbG9jYXRpb24gKmFsbG9jLCB1aW50MzJfdCBzdGFydCwgaW50IGxlbiwgaW50IHgsIGludCB5KTsKKworICAgIHZvaWQgc2V0Rm9udENvbG9yKGZsb2F0IHIsIGZsb2F0IGcsIGZsb2F0IGIsIGZsb2F0IGEpOworICAgIHZvaWQgZ2V0Rm9udENvbG9yKGZsb2F0ICpyLCBmbG9hdCAqZywgZmxvYXQgKmIsIGZsb2F0ICphKSBjb25zdDsKKworcHJvdGVjdGVkOgorCisgICAgZnJpZW5kIGNsYXNzIEZvbnQ7CisKKyAgICBzdHJ1Y3QgQ2FjaGVUZXh0dXJlTGluZQorICAgIHsKKyAgICAgICAgdWludDMyX3QgbU1heEhlaWdodDsKKyAgICAgICAgdWludDMyX3QgbU1heFdpZHRoOworICAgICAgICB1aW50MzJfdCBtQ3VycmVudFJvdzsKKyAgICAgICAgdWludDMyX3QgbUN1cnJlbnRDb2w7CisgICAgICAgIGJvb2wgbURpcnR5OworCisgICAgICAgIENhY2hlVGV4dHVyZUxpbmUodWludDMyX3QgbWF4SGVpZ2h0LCB1aW50MzJfdCBtYXhXaWR0aCwgdWludDMyX3QgY3VycmVudFJvdywgdWludDMyX3QgY3VycmVudENvbCkgOgorICAgICAgICAgICAgbU1heEhlaWdodChtYXhIZWlnaHQpLCBtTWF4V2lkdGgobWF4V2lkdGgpLCBtQ3VycmVudFJvdyhjdXJyZW50Um93KSwgbUN1cnJlbnRDb2woY3VycmVudENvbCksCisgICAgICAgICAgICBtRGlydHkoZmFsc2UpICB7CisgICAgICAgIH0KKworICAgICAgICBib29sIGZpdEJpdG1hcChGVF9CaXRtYXAgKmJpdG1hcCwgdWludDMyX3QgKnJldE9yaWdpblgsIHVpbnQzMl90ICpyZXRPcmlnaW5ZKSB7CisgICAgICAgICAgICBpZigodWludDMyX3QpYml0bWFwLT5yb3dzID4gbU1heEhlaWdodCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYobUN1cnJlbnRDb2wgKyAodWludDMyX3QpYml0bWFwLT53aWR0aCA8IG1NYXhXaWR0aCkgeworICAgICAgICAgICAgICAgKnJldE9yaWdpblggPSBtQ3VycmVudENvbDsKKyAgICAgICAgICAgICAgICpyZXRPcmlnaW5ZID0gbUN1cnJlbnRSb3c7CisgICAgICAgICAgICAgICBtQ3VycmVudENvbCArPSBiaXRtYXAtPndpZHRoOworICAgICAgICAgICAgICAgbURpcnR5ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9OworCisgICAgVmVjdG9yPENhY2hlVGV4dHVyZUxpbmUqPiBtQ2FjaGVMaW5lczsKKyAgICB1aW50MzJfdCBnZXRSZW1haW5pbmdDYWNoZUNhcGFjaXR5KCk7CisKKyAgICB2b2lkIHByZWNhY2hlTGF0aW4oRm9udCAqZm9udCk7CisgICAgU3RyaW5nOCBtTGF0aW5QcmVjYWNoZTsKKworICAgIENvbnRleHQgKm1SU0M7CisKKyAgICBmbG9hdCBtRm9udENvbG9yWzRdOworICAgIGJvb2wgbUZvbnRDb2xvckRpcnR5OworCisgICAgLy8gRnJlZSB0eXBlIGxpYnJhcnksIHdlIG9ubHkgbmVlZCBvbmUgY29weQorICAgIEZUX0xpYnJhcnkgbUxpYnJhcnk7CisgICAgRlRfTGlicmFyeSBnZXRMaWIoKTsKKyAgICBWZWN0b3I8Rm9udCo+IG1BY3RpdmVGb250czsKKworICAgIC8vIFJlbmRlciBzdGF0ZSBmb3IgdGhlIGZvbnQKKyAgICBPYmplY3RCYXNlUmVmPFByb2dyYW1GcmFnbWVudD4gbUZvbnRTaGFkZXJGOworICAgIE9iamVjdEJhc2VSZWY8U2FtcGxlcj4gbUZvbnRTYW1wbGVyOworICAgIE9iamVjdEJhc2VSZWY8UHJvZ3JhbVN0b3JlPiBtRm9udFByb2dyYW1TdG9yZTsKKyAgICB2b2lkIGluaXRSZW5kZXJTdGF0ZSgpOworCisgICAgLy8gVGV4dHVyZSB0byBjYWNoZSBnbHlwaCBiaXRtYXBzCisgICAgT2JqZWN0QmFzZVJlZjxBbGxvY2F0aW9uPiBtVGV4dFRleHR1cmU7CisgICAgdm9pZCBpbml0VGV4dFRleHR1cmUoKTsKKworICAgIGJvb2wgY2FjaGVCaXRtYXAoRlRfQml0bWFwICpiaXRtYXAsIHVpbnQzMl90ICpyZXRPcmlnaW5YLCB1aW50MzJfdCAqcmV0T3JpZ2luWSk7CisgICAgY29uc3QgVHlwZSogZ2V0Q2FjaGVUZXh0dXJlVHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIG1UZXh0VGV4dHVyZS0+Z2V0VHlwZSgpOworICAgIH0KKworICAgIHZvaWQgZmx1c2hBbGxBbmRJbnZhbGlkYXRlKCk7CisKKyAgICAvLyBQb2ludGVyIHRvIHZlcnRleCBkYXRhIHRvIHNwZWVkIHVwIGZyYW1lIHRvIGZyYW1lIHdvcmsKKyAgICBmbG9hdCAqbVRleHRNZXNoUHRyOworICAgIHVpbnQzMl90IG1DdXJyZW50UXVhZEluZGV4OworICAgIHVpbnQzMl90IG1NYXhOdW1iZXJPZlF1YWRzOworCisgICAgdm9pZCBpbml0VmVydGV4QXJyYXlCdWZmZXJzKCk7CisgICAgT2JqZWN0QmFzZVJlZjxBbGxvY2F0aW9uPiBtSW5kZXhCdWZmZXI7CisgICAgT2JqZWN0QmFzZVJlZjxBbGxvY2F0aW9uPiBtVmVydGV4QXJyYXk7CisKKworICAgIGJvb2wgbUluaXRpYWxpemVkOworCisgICAgdm9pZCBjaGVja0luaXQoKTsKKworICAgIHZvaWQgaXNzdWVEcmF3Q29tbWFuZCgpOworCisgICAgdm9pZCBhcHBlbmRNZXNoUXVhZChmbG9hdCB4MSwgZmxvYXQgeTEsIGZsb2F0IHoxLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB1MSwgZmxvYXQgdjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHgyLCBmbG9hdCB5MiwgZmxvYXQgejIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHUyLCBmbG9hdCB2MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeDMsIGZsb2F0IHkzLCBmbG9hdCB6MywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdTMsIGZsb2F0IHYzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4NCwgZmxvYXQgeTQsIGZsb2F0IHo0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB1NCwgZmxvYXQgdjQpOworCit9OworCisKK30KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzSGFuZGNvZGUuaCBiL2xpYnMvcnMvcnNIYW5kY29kZS5oCmluZGV4IDgwMGVkZGQuLjM1M2I3M2EgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNIYW5kY29kZS5oCisrKyBiL2xpYnMvcnMvcnNIYW5kY29kZS5oCkBAIC0xLDYgKzEsNTcgQEAKIAogI2RlZmluZSBEQVRBX1NZTkNfU0laRSAxMDI0CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCByc0hDQVBJX0NvbnRleHRGaW5pc2ggKFJzQ29udGV4dCByc2MpCit7CisgICAgVGhyZWFkSU8gKmlvID0gJigoQ29udGV4dCAqKXJzYyktPm1JTzsKKyAgICB1aW50MzJfdCBzaXplID0gc2l6ZW9mKFJTX0NNRF9Db250ZXh0RmluaXNoKTsKKyAgICBSU19DTURfQ29udGV4dEZpbmlzaCAqY21kID0gc3RhdGljX2Nhc3Q8UlNfQ01EX0NvbnRleHRGaW5pc2ggKj4oaW8tPm1Ub0NvcmUucmVzZXJ2ZShzaXplKSk7CisgICAgaW8tPm1Ub0NvcmUuY29tbWl0U3luYyhSU19DTURfSURfQ29udGV4dEZpbmlzaCwgc2l6ZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByc0hDQVBJX1NjcmlwdEludm9rZVYgKFJzQ29udGV4dCByc2MsIFJzU2NyaXB0IHZhLCB1aW50MzJfdCBzbG90LCBjb25zdCB2b2lkICogZGF0YSwgdWludDMyX3Qgc2l6ZUJ5dGVzKQoreworICAgIFRocmVhZElPICppbyA9ICYoKENvbnRleHQgKilyc2MpLT5tSU87CisgICAgdWludDMyX3Qgc2l6ZSA9IHNpemVvZihSU19DTURfU2NyaXB0SW52b2tlVik7CisgICAgaWYgKHNpemVCeXRlcyA8IERBVEFfU1lOQ19TSVpFKSB7CisgICAgICAgIHNpemUgKz0gKHNpemVCeXRlcyArIDMpICYgfjM7CisgICAgfQorICAgIFJTX0NNRF9TY3JpcHRJbnZva2VWICpjbWQgPSBzdGF0aWNfY2FzdDxSU19DTURfU2NyaXB0SW52b2tlViAqPihpby0+bVRvQ29yZS5yZXNlcnZlKHNpemUpKTsKKyAgICBjbWQtPnMgPSB2YTsKKyAgICBjbWQtPnNsb3QgPSBzbG90OworICAgIGNtZC0+ZGF0YUxlbiA9IHNpemVCeXRlczsKKyAgICBjbWQtPmRhdGEgPSBkYXRhOworICAgIGlmIChzaXplQnl0ZXMgPCBEQVRBX1NZTkNfU0laRSkgeworICAgICAgICBjbWQtPmRhdGEgPSAodm9pZCAqKShjbWQrMSk7CisgICAgICAgIG1lbWNweShjbWQrMSwgZGF0YSwgc2l6ZUJ5dGVzKTsKKyAgICAgICAgaW8tPm1Ub0NvcmUuY29tbWl0KFJTX0NNRF9JRF9TY3JpcHRJbnZva2VWLCBzaXplKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpby0+bVRvQ29yZS5jb21taXRTeW5jKFJTX0NNRF9JRF9TY3JpcHRJbnZva2VWLCBzaXplKTsKKyAgICB9Cit9CisKKworc3RhdGljIGlubGluZSB2b2lkIHJzSENBUElfU2NyaXB0U2V0VmFyViAoUnNDb250ZXh0IHJzYywgUnNTY3JpcHQgdmEsIHVpbnQzMl90IHNsb3QsIGNvbnN0IHZvaWQgKiBkYXRhLCB1aW50MzJfdCBzaXplQnl0ZXMpCit7CisgICAgVGhyZWFkSU8gKmlvID0gJigoQ29udGV4dCAqKXJzYyktPm1JTzsKKyAgICB1aW50MzJfdCBzaXplID0gc2l6ZW9mKFJTX0NNRF9TY3JpcHRTZXRWYXJWKTsKKyAgICBpZiAoc2l6ZUJ5dGVzIDwgREFUQV9TWU5DX1NJWkUpIHsKKyAgICAgICAgc2l6ZSArPSAoc2l6ZUJ5dGVzICsgMykgJiB+MzsKKyAgICB9CisgICAgUlNfQ01EX1NjcmlwdFNldFZhclYgKmNtZCA9IHN0YXRpY19jYXN0PFJTX0NNRF9TY3JpcHRTZXRWYXJWICo+KGlvLT5tVG9Db3JlLnJlc2VydmUoc2l6ZSkpOworICAgIGNtZC0+cyA9IHZhOworICAgIGNtZC0+c2xvdCA9IHNsb3Q7CisgICAgY21kLT5kYXRhTGVuID0gc2l6ZUJ5dGVzOworICAgIGNtZC0+ZGF0YSA9IGRhdGE7CisgICAgaWYgKHNpemVCeXRlcyA8IERBVEFfU1lOQ19TSVpFKSB7CisgICAgICAgIGNtZC0+ZGF0YSA9ICh2b2lkICopKGNtZCsxKTsKKyAgICAgICAgbWVtY3B5KGNtZCsxLCBkYXRhLCBzaXplQnl0ZXMpOworICAgICAgICBpby0+bVRvQ29yZS5jb21taXQoUlNfQ01EX0lEX1NjcmlwdFNldFZhclYsIHNpemUpOworICAgIH0gZWxzZSB7CisgICAgICAgIGlvLT5tVG9Db3JlLmNvbW1pdFN5bmMoUlNfQ01EX0lEX1NjcmlwdFNldFZhclYsIHNpemUpOworICAgIH0KK30KKwogc3RhdGljIGlubGluZSB2b2lkIHJzSENBUElfQWxsb2NhdGlvbkRhdGEgKFJzQ29udGV4dCByc2MsIFJzQWxsb2NhdGlvbiB2YSwgY29uc3Qgdm9pZCAqIGRhdGEsIHVpbnQzMl90IHNpemVCeXRlcykKIHsKICAgICBUaHJlYWRJTyAqaW8gPSAmKChDb250ZXh0ICopcnNjKS0+bUlPOwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc0xpZ2h0LmNwcCBiL2xpYnMvcnMvcnNMaWdodC5jcHAKaW5kZXggNmYyY2YzZS4uZWFiOWEwNyAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc0xpZ2h0LmNwcAorKysgYi9saWJzL3JzL3JzTGlnaHQuY3BwCkBAIC0xNCw5ICsxNCwxMyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorI2lmbmRlZiBBTkRST0lEX1JTX0JVSUxEX0ZPUl9IT1NUCiAjaW5jbHVkZSAicnNDb250ZXh0LmgiCi0KICNpbmNsdWRlIDxHTEVTL2dsLmg+CisjZWxzZQorI2luY2x1ZGUgInJzQ29udGV4dEhvc3RTdHViLmgiCisjaW5jbHVkZSA8T3BlbkdML2dsLmg+CisjZW5kaWYgLy9BTkRST0lEX1JTX0JVSUxEX0ZPUl9IT1NUCiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OnJlbmRlcnNjcmlwdDsKQEAgLTY1LDYgKzY5LDE2IEBACiAgICAgZ2xMaWdodGZ2KEdMX0xJR0hUMCArIG51bSwgR0xfUE9TSVRJT04sIG1Qb3NpdGlvbik7CiB9CiAKK3ZvaWQgTGlnaHQ6OnNlcmlhbGl6ZShPU3RyZWFtICpzdHJlYW0pIGNvbnN0Cit7CisgICAgCit9CisKK0xpZ2h0ICpMaWdodDo6Y3JlYXRlRnJvbVN0cmVhbShDb250ZXh0ICpyc2MsIElTdHJlYW0gKnN0cmVhbSkKK3sKKyAgICByZXR1cm4gTlVMTDsKK30KKwogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAogTGlnaHRTdGF0ZTo6TGlnaHRTdGF0ZSgpCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzTGlnaHQuaCBiL2xpYnMvcnMvcnNMaWdodC5oCmluZGV4IGQ4Nzk2ZTYuLmJkNTg5NzkgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNMaWdodC5oCisrKyBiL2xpYnMvcnMvcnNMaWdodC5oCkBAIC0zNyw2ICszNyw5IEBACiAgICAgdm9pZCBzZXRDb2xvcihmbG9hdCByLCBmbG9hdCBnLCBmbG9hdCBiKTsKIAogICAgIHZvaWQgc2V0dXBHTCh1aW50MzJfdCBudW0pIGNvbnN0OworICAgIHZpcnR1YWwgdm9pZCBzZXJpYWxpemUoT1N0cmVhbSAqc3RyZWFtKSBjb25zdDsKKyAgICB2aXJ0dWFsIFJzQTNEQ2xhc3NJRCBnZXRDbGFzc0lkKCkgY29uc3QgeyByZXR1cm4gUlNfQTNEX0NMQVNTX0lEX0xJR0hUOyB9CisgICAgc3RhdGljIExpZ2h0ICpjcmVhdGVGcm9tU3RyZWFtKENvbnRleHQgKnJzYywgSVN0cmVhbSAqc3RyZWFtKTsKIAogcHJvdGVjdGVkOgogICAgIGZsb2F0IG1Db2xvcls0XTsKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNMb2NrbGVzc0ZpZm8uY3BwIGIvbGlicy9ycy9yc0xvY2tsZXNzRmlmby5jcHAKaW5kZXggYzc5NjUyMC4uMDE5ZWE3MiAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc0xvY2tsZXNzRmlmby5jcHAKKysrIGIvbGlicy9ycy9yc0xvY2tsZXNzRmlmby5jcHAKQEAgLTE3LDcgKzE3LDcgQEAKICNpbmNsdWRlICJyc0xvY2tsZXNzRmlmby5oIgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKLQordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OnJlbmRlcnNjcmlwdDsKIAogTG9ja2xlc3NDb21tYW5kRmlmbzo6TG9ja2xlc3NDb21tYW5kRmlmbygpCiB7CkBAIC0xMjgsMTUgKzEyOCwxOSBAQAogICAgIC8vZHVtcFN0YXRlKCJmbHVzaCAyIik7CiB9CiAKK3ZvaWQgTG9ja2xlc3NDb21tYW5kRmlmbzo6d2FpdCgpCit7CisgICAgd2hpbGUoaXNFbXB0eSgpICYmICFtSW5TaHV0ZG93bikgeworICAgICAgICBtU2lnbmFsVG9Db250cm9sLnNldCgpOworICAgICAgICBtU2lnbmFsVG9Xb3JrZXIud2FpdCgpOworICAgIH0KK30KKwogY29uc3Qgdm9pZCAqIExvY2tsZXNzQ29tbWFuZEZpZm86OmdldCh1aW50MzJfdCAqY29tbWFuZCwgdWludDMyX3QgKmJ5dGVzRGF0YSkKIHsKICAgICB3aGlsZSgxKSB7CiAgICAgICAgIC8vZHVtcFN0YXRlKCJnZXQiKTsKLSAgICAgICAgd2hpbGUoaXNFbXB0eSgpICYmICFtSW5TaHV0ZG93bikgewotICAgICAgICAgICAgbVNpZ25hbFRvQ29udHJvbC5zZXQoKTsKLSAgICAgICAgICAgIG1TaWduYWxUb1dvcmtlci53YWl0KCk7Ci0gICAgICAgIH0KLQorICAgICAgICB3YWl0KCk7CiAgICAgICAgIGlmIChtSW5TaHV0ZG93bikgewogICAgICAgICAgICAgKmNvbW1hbmQgPSAwOwogICAgICAgICAgICAgKmJ5dGVzRGF0YSA9IDA7CkBAIC0xNjUsNiArMTY5LDMwIEBACiAgICAgLy9kdW1wU3RhdGUoIm5leHQiKTsKIH0KIAorYm9vbCBMb2NrbGVzc0NvbW1hbmRGaWZvOjptYWtlU3BhY2VOb25CbG9ja2luZyh1aW50MzJfdCBieXRlcykKK3sKKyAgICAvL2R1bXBTdGF0ZSgibWFrZSBzcGFjZSBub24tYmxvY2tpbmciKTsKKyAgICBpZiAoKG1QdXQrYnl0ZXMpID4gbUVuZCkgeworICAgICAgICAvLyBOZWVkIHRvIGxvb3AgcmVnYXJkbGVzcyBvZiB3aGVyZSBnZXQgaXMuCisgICAgICAgIGlmKChtR2V0ID4gbVB1dCkgJiYgKG1CdWZmZXIrNCA+PSBtR2V0KSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgLy8gVG9zcyBpbiBhIHJlc2V0IHRoZW4gdGhlIG5vcm1hbCB3YWl0IGZvciBzcGFjZSB3aWxsIGRvIHRoZSByZXN0LgorICAgICAgICByZWludGVycHJldF9jYXN0PHVpbnQxNl90ICo+KG1QdXQpWzBdID0gMDsKKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50MTZfdCAqPihtUHV0KVsxXSA9IDA7CisgICAgICAgIG1QdXQgPSBtQnVmZmVyOworICAgICAgICBtU2lnbmFsVG9Xb3JrZXIuc2V0KCk7CisgICAgfQorCisgICAgLy8gaXQgd2lsbCBmaXQgaGVyZSBzbyB3ZSBqdXN0IG5lZWQgdG8gd2FpdCBmb3Igc3BhY2UuCisgICAgaWYoZ2V0RnJlZVNwYWNlKCkgPCBieXRlcykgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKIHZvaWQgTG9ja2xlc3NDb21tYW5kRmlmbzo6bWFrZVNwYWNlKHVpbnQzMl90IGJ5dGVzKQogewogICAgIC8vZHVtcFN0YXRlKCJtYWtlIHNwYWNlIik7CkBAIC0xNzgsNiArMjA2LDcgQEAKICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50MTZfdCAqPihtUHV0KVswXSA9IDA7CiAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dWludDE2X3QgKj4obVB1dClbMV0gPSAwOwogICAgICAgICBtUHV0ID0gbUJ1ZmZlcjsKKyAgICAgICAgbVNpZ25hbFRvV29ya2VyLnNldCgpOwogICAgIH0KIAogICAgIC8vIGl0IHdpbGwgZml0IGhlcmUgc28gd2UganVzdCBuZWVkIHRvIHdhaXQgZm9yIHNwYWNlLgpAQCAtMTg5LDgyICsyMTgsNiBAQAogCiB2b2lkIExvY2tsZXNzQ29tbWFuZEZpZm86OmR1bXBTdGF0ZShjb25zdCBjaGFyICpzKSBjb25zdAogewotICAgIExPR1YoIiVzICBwdXQgJXAsIGdldCAlcCwgIGJ1ZiAlcCwgIGVuZCAlcCIsIHMsIG1QdXQsIG1HZXQsIG1CdWZmZXIsIG1FbmQpOwotfQotCi1Mb2NrbGVzc0NvbW1hbmRGaWZvOjpTaWduYWw6OlNpZ25hbCgpCi17Ci0gICAgbVNldCA9IHRydWU7Ci19Ci0KLUxvY2tsZXNzQ29tbWFuZEZpZm86OlNpZ25hbDo6flNpZ25hbCgpCi17Ci0gICAgcHRocmVhZF9tdXRleF9kZXN0cm95KCZtTXV0ZXgpOwotICAgIHB0aHJlYWRfY29uZF9kZXN0cm95KCZtQ29uZGl0aW9uKTsKLX0KLQotYm9vbCBMb2NrbGVzc0NvbW1hbmRGaWZvOjpTaWduYWw6OmluaXQoKQotewotICAgIGludCBzdGF0dXMgPSBwdGhyZWFkX211dGV4X2luaXQoJm1NdXRleCwgTlVMTCk7Ci0gICAgaWYgKHN0YXR1cykgewotICAgICAgICBMT0dFKCJMb2NrbGVzc0ZpZm8gbXV0ZXggaW5pdCBmYWlsdXJlIik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBzdGF0dXMgPSBwdGhyZWFkX2NvbmRfaW5pdCgmbUNvbmRpdGlvbiwgTlVMTCk7Ci0gICAgaWYgKHN0YXR1cykgewotICAgICAgICBMT0dFKCJMb2NrbGVzc0ZpZm8gY29uZGl0aW9uIGluaXQgZmFpbHVyZSIpOwotICAgICAgICBwdGhyZWFkX211dGV4X2Rlc3Ryb3koJm1NdXRleCk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBMb2NrbGVzc0NvbW1hbmRGaWZvOjpTaWduYWw6OnNldCgpCi17Ci0gICAgaW50IHN0YXR1czsKLQotICAgIHN0YXR1cyA9IHB0aHJlYWRfbXV0ZXhfbG9jaygmbU11dGV4KTsKLSAgICBpZiAoc3RhdHVzKSB7Ci0gICAgICAgIExPR0UoIkxvY2tsZXNzQ29tbWFuZEZpZm86IGVycm9yICVpIGxvY2tpbmcgZm9yIHNldCBjb25kaXRpb24uIiwgc3RhdHVzKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIG1TZXQgPSB0cnVlOwotCi0gICAgc3RhdHVzID0gcHRocmVhZF9jb25kX3NpZ25hbCgmbUNvbmRpdGlvbik7Ci0gICAgaWYgKHN0YXR1cykgewotICAgICAgICBMT0dFKCJMb2NrbGVzc0NvbW1hbmRGaWZvOiBlcnJvciAlaSBvbiBzZXQgY29uZGl0aW9uLiIsIHN0YXR1cyk7Ci0gICAgfQotCi0gICAgc3RhdHVzID0gcHRocmVhZF9tdXRleF91bmxvY2soJm1NdXRleCk7Ci0gICAgaWYgKHN0YXR1cykgewotICAgICAgICBMT0dFKCJMb2NrbGVzc0NvbW1hbmRGaWZvOiBlcnJvciAlaSB1bmxvY2tpbmcgZm9yIHNldCBjb25kaXRpb24uIiwgc3RhdHVzKTsKLSAgICB9Ci19Ci0KLXZvaWQgTG9ja2xlc3NDb21tYW5kRmlmbzo6U2lnbmFsOjp3YWl0KCkKLXsKLSAgICBpbnQgc3RhdHVzOwotCi0gICAgc3RhdHVzID0gcHRocmVhZF9tdXRleF9sb2NrKCZtTXV0ZXgpOwotICAgIGlmIChzdGF0dXMpIHsKLSAgICAgICAgTE9HRSgiTG9ja2xlc3NDb21tYW5kRmlmbzogZXJyb3IgJWkgbG9ja2luZyBmb3IgY29uZGl0aW9uLiIsIHN0YXR1cyk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoIW1TZXQpIHsKLSAgICAgICAgc3RhdHVzID0gcHRocmVhZF9jb25kX3dhaXQoJm1Db25kaXRpb24sICZtTXV0ZXgpOwotICAgICAgICBpZiAoc3RhdHVzKSB7Ci0gICAgICAgICAgICBMT0dFKCJMb2NrbGVzc0NvbW1hbmRGaWZvOiBlcnJvciAlaSB3YWl0aW5nIG9uIGNvbmRpdGlvbi4iLCBzdGF0dXMpOwotICAgICAgICB9Ci0gICAgfQotICAgIG1TZXQgPSBmYWxzZTsKLQotICAgIHN0YXR1cyA9IHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtTXV0ZXgpOwotICAgIGlmIChzdGF0dXMpIHsKLSAgICAgICAgTE9HRSgiTG9ja2xlc3NDb21tYW5kRmlmbzogZXJyb3IgJWkgdW5sb2NraW5nIGZvciBjb25kaXRpb24uIiwgc3RhdHVzKTsKLSAgICB9CisgICAgTE9HVigiJXMgJXAgIHB1dCAlcCwgZ2V0ICVwLCAgYnVmICVwLCAgZW5kICVwIiwgcywgdGhpcywgbVB1dCwgbUdldCwgbUJ1ZmZlciwgbUVuZCk7CiB9CiAKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNMb2NrbGVzc0ZpZm8uaCBiL2xpYnMvcnMvcnNMb2NrbGVzc0ZpZm8uaAppbmRleCBkMGE0MzU2Li5iOGNlZWVkIDEwMDY0NAotLS0gYS9saWJzL3JzL3JzTG9ja2xlc3NGaWZvLmgKKysrIGIvbGlicy9ycy9yc0xvY2tsZXNzRmlmby5oCkBAIC0xOSw4ICsxOSwxMCBAQAogCiAKICNpbmNsdWRlICJyc1V0aWxzLmgiCisjaW5jbHVkZSAicnNTaWduYWwuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHJlbmRlcnNjcmlwdCB7CiAKIAogLy8gQSBzaW1wbGUgRklGTyB0byBiZSB1c2VkIGFzIGEgcHJvZHVjZXIgLyBjb25zdW1lciBiZXR3ZWVuIHR3bwpAQCAtMzcsMjQgKzM5LDcgQEAKICAgICBMb2NrbGVzc0NvbW1hbmRGaWZvKCk7CiAgICAgfkxvY2tsZXNzQ29tbWFuZEZpZm8oKTsKIAotCiBwcm90ZWN0ZWQ6Ci0gICAgY2xhc3MgU2lnbmFsIHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIFNpZ25hbCgpOwotICAgICAgICB+U2lnbmFsKCk7Ci0KLSAgICAgICAgYm9vbCBpbml0KCk7Ci0KLSAgICAgICAgdm9pZCBzZXQoKTsKLSAgICAgICAgdm9pZCB3YWl0KCk7Ci0KLSAgICBwcm90ZWN0ZWQ6Ci0gICAgICAgIGJvb2wgbVNldDsKLSAgICAgICAgcHRocmVhZF9tdXRleF90IG1NdXRleDsKLSAgICAgICAgcHRocmVhZF9jb25kX3QgbUNvbmRpdGlvbjsKLSAgICB9OwotCiAgICAgdWludDhfdCAqIHZvbGF0aWxlIG1QdXQ7CiAgICAgdWludDhfdCAqIHZvbGF0aWxlIG1HZXQ7CiAgICAgdWludDhfdCAqIG1CdWZmZXI7CkBAIC02NSwxOCArNTAsMTkgQEAKICAgICBTaWduYWwgbVNpZ25hbFRvV29ya2VyOwogICAgIFNpZ25hbCBtU2lnbmFsVG9Db250cm9sOwogCi0KLQogcHVibGljOgogICAgIHZvaWQgKiByZXNlcnZlKHVpbnQzMl90IGJ5dGVzKTsKICAgICB2b2lkIGNvbW1pdCh1aW50MzJfdCBjb21tYW5kLCB1aW50MzJfdCBieXRlcyk7CiAgICAgdm9pZCBjb21taXRTeW5jKHVpbnQzMl90IGNvbW1hbmQsIHVpbnQzMl90IGJ5dGVzKTsKIAogICAgIHZvaWQgZmx1c2goKTsKKyAgICB2b2lkIHdhaXQoKTsKKwogICAgIGNvbnN0IHZvaWQgKiBnZXQodWludDMyX3QgKmNvbW1hbmQsIHVpbnQzMl90ICpieXRlc0RhdGEpOwogICAgIHZvaWQgbmV4dCgpOwogCiAgICAgdm9pZCBtYWtlU3BhY2UodWludDMyX3QgYnl0ZXMpOworICAgIGJvb2wgbWFrZVNwYWNlTm9uQmxvY2tpbmcodWludDMyX3QgYnl0ZXMpOwogCiAgICAgYm9vbCBpc0VtcHR5KCkgY29uc3Q7CiAgICAgdWludDMyX3QgZ2V0RnJlZVNwYWNlKCkgY29uc3Q7CkBAIC04OCw0ICs3NCw1IEBACiAKIAogfQorfQogI2VuZGlmCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzTWF0cml4LmNwcCBiL2xpYnMvcnMvcnNNYXRyaXguY3BwCmluZGV4IDJmMjE0MDUuLjk0ZWVmMTMgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNNYXRyaXguY3BwCisrKyBiL2xpYnMvcnMvcnNNYXRyaXguY3BwCkBAIC03Myw3ICs3Myw3IEBACiAgICAgcyA9IHNpbmYocm90KTsKIAogICAgIGNvbnN0IGZsb2F0IGxlbiA9IHNxcnRmKHgqeCArIHkqeSArIHoqeik7Ci0gICAgaWYgKCEobGVuICE9IDEpKSB7CisgICAgaWYgKGxlbiAhPSAxKSB7CiAgICAgICAgIGNvbnN0IGZsb2F0IHJlY2lwTGVuID0gMS5mIC8gbGVuOwogICAgICAgICB4ICo9IHJlY2lwTGVuOwogICAgICAgICB5ICo9IHJlY2lwTGVuOwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc01lc2guY3BwIGIvbGlicy9ycy9yc01lc2guY3BwCmluZGV4IGQ1OTViNGUuLjgxMGU0ZmYgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNNZXNoLmNwcAorKysgYi9saWJzL3JzL3JzTWVzaC5jcHAKQEAgLTE0LDI4ICsxNCwyNTggQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKyNpZm5kZWYgQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAogI2luY2x1ZGUgInJzQ29udGV4dC5oIgogCisjaW5jbHVkZSA8R0xFUy9nbC5oPgorI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgorI2luY2x1ZGUgPEdMRVMvZ2xleHQuaD4KKyNlbHNlCisjaW5jbHVkZSAicnNDb250ZXh0SG9zdFN0dWIuaCIKKworI2luY2x1ZGUgPE9wZW5HTC9nbC5oPgorI2luY2x1ZGUgPE9wZW5HbC9nbGV4dC5oPgorI2VuZGlmCisKKwogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6cmVuZGVyc2NyaXB0OwogCi0jaW5jbHVkZSA8R0xFUy9nbC5oPgotI2luY2x1ZGUgPEdMRVMvZ2xleHQuaD4KLQogTWVzaDo6TWVzaChDb250ZXh0ICpyc2MpIDogT2JqZWN0QmFzZShyc2MpCiB7CiAgICAgbUFsbG9jRmlsZSA9IF9fRklMRV9fOwogICAgIG1BbGxvY0xpbmUgPSBfX0xJTkVfXzsKLSAgICBtVmVydGljaWVzID0gTlVMTDsKLSAgICBtVmVydGljaWVzQ291bnQgPSAwOwogICAgIG1QcmltaXRpdmVzID0gTlVMTDsKICAgICBtUHJpbWl0aXZlc0NvdW50ID0gMDsKKyAgICBtVmVydGV4QnVmZmVycyA9IE5VTEw7CisgICAgbVZlcnRleEJ1ZmZlckNvdW50ID0gMDsKIH0KIAogTWVzaDo6fk1lc2goKQogeworICAgIGlmKG1WZXJ0ZXhCdWZmZXJzKSB7CisgICAgICAgIGRlbGV0ZVtdIG1WZXJ0ZXhCdWZmZXJzOworICAgIH0KKworICAgIGlmKG1QcmltaXRpdmVzKSB7CisgICAgICAgIGZvcih1aW50MzJfdCBpID0gMDsgaSA8IG1QcmltaXRpdmVzQ291bnQ7IGkgKyspIHsKKyAgICAgICAgICAgIGRlbGV0ZSBtUHJpbWl0aXZlc1tpXTsKKyAgICAgICAgfQorICAgICAgICBkZWxldGVbXSBtUHJpbWl0aXZlczsKKyAgICB9CiB9CiAKK3ZvaWQgTWVzaDo6cmVuZGVyKENvbnRleHQgKnJzYykgY29uc3QKK3sKKyAgICBmb3IodWludDMyX3QgY3QgPSAwOyBjdCA8IG1QcmltaXRpdmVzQ291bnQ7IGN0ICsrKSB7CisgICAgICAgIHJlbmRlclByaW1pdGl2ZShyc2MsIGN0KTsKKyAgICB9Cit9CisKK3ZvaWQgTWVzaDo6cmVuZGVyUHJpbWl0aXZlKENvbnRleHQgKnJzYywgdWludDMyX3QgcHJpbUluZGV4KSBjb25zdCB7CisgICAgaWYgKHByaW1JbmRleCA+PSBtUHJpbWl0aXZlc0NvdW50KSB7CisgICAgICAgIExPR0UoIkludmFsaWQgcHJpbWl0aXZlIGluZGV4Iik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBQcmltaXRpdmVfdCAqcHJpbSA9IG1QcmltaXRpdmVzW3ByaW1JbmRleF07CisKKyAgICBpZiAocHJpbS0+bUluZGV4QnVmZmVyLmdldCgpKSB7CisgICAgICAgIHJlbmRlclByaW1pdGl2ZVJhbmdlKHJzYywgcHJpbUluZGV4LCAwLCBwcmltLT5tSW5kZXhCdWZmZXItPmdldFR5cGUoKS0+Z2V0RGltWCgpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHJlbmRlclByaW1pdGl2ZVJhbmdlKHJzYywgcHJpbUluZGV4LCAwLCBtVmVydGV4QnVmZmVyc1swXS0+Z2V0VHlwZSgpLT5nZXREaW1YKCkpOworfQorCit2b2lkIE1lc2g6OnJlbmRlclByaW1pdGl2ZVJhbmdlKENvbnRleHQgKnJzYywgdWludDMyX3QgcHJpbUluZGV4LCB1aW50MzJfdCBzdGFydCwgdWludDMyX3QgbGVuKSBjb25zdAoreworICAgIGlmIChsZW4gPCAxIHx8IHByaW1JbmRleCA+PSBtUHJpbWl0aXZlc0NvdW50KSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICByc2MtPmNoZWNrRXJyb3IoIk1lc2g6OnJlbmRlclByaW1pdGl2ZVJhbmdlIDEiKTsKKyAgICBWZXJ0ZXhBcnJheSB2YTsKKyAgICBmb3IgKHVpbnQzMl90IGN0PTA7IGN0IDwgbVZlcnRleEJ1ZmZlckNvdW50OyBjdCsrKSB7CisgICAgICAgIG1WZXJ0ZXhCdWZmZXJzW2N0XS0+dXBsb2FkQ2hlY2socnNjKTsKKyAgICAgICAgaWYgKG1WZXJ0ZXhCdWZmZXJzW2N0XS0+Z2V0SXNCdWZmZXJPYmplY3QoKSkgeworICAgICAgICAgICAgdmEuc2V0QWN0aXZlQnVmZmVyKG1WZXJ0ZXhCdWZmZXJzW2N0XS0+Z2V0QnVmZmVyT2JqZWN0SUQoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB2YS5zZXRBY3RpdmVCdWZmZXIobVZlcnRleEJ1ZmZlcnNbY3RdLT5nZXRQdHIoKSk7CisgICAgICAgIH0KKyAgICAgICAgbVZlcnRleEJ1ZmZlcnNbY3RdLT5nZXRUeXBlKCktPmVuYWJsZUdMVmVydGV4QnVmZmVyKCZ2YSk7CisgICAgfQorICAgIHZhLnNldHVwR0wyKHJzYywgJnJzYy0+bVN0YXRlVmVydGV4QXJyYXksICZyc2MtPm1TaGFkZXJDYWNoZSk7CisKKyAgICByc2MtPmNoZWNrRXJyb3IoIk1lc2g6OnJlbmRlclByaW1pdGl2ZVJhbmdlIDIiKTsKKyAgICBQcmltaXRpdmVfdCAqcHJpbSA9IG1QcmltaXRpdmVzW3ByaW1JbmRleF07CisgICAgaWYgKHByaW0tPm1JbmRleEJ1ZmZlci5nZXQoKSkgeworICAgICAgICBwcmltLT5tSW5kZXhCdWZmZXItPnVwbG9hZENoZWNrKHJzYyk7CisgICAgICAgIGdsQmluZEJ1ZmZlcihHTF9FTEVNRU5UX0FSUkFZX0JVRkZFUiwgcHJpbS0+bUluZGV4QnVmZmVyLT5nZXRCdWZmZXJPYmplY3RJRCgpKTsKKyAgICAgICAgZ2xEcmF3RWxlbWVudHMocHJpbS0+bUdMUHJpbWl0aXZlLCBsZW4sIEdMX1VOU0lHTkVEX1NIT1JULCAodWludDE2X3QgKikoc3RhcnQgKiAyKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZ2xEcmF3QXJyYXlzKHByaW0tPm1HTFByaW1pdGl2ZSwgc3RhcnQsIGxlbik7CisgICAgfQorCisgICAgcnNjLT5jaGVja0Vycm9yKCJNZXNoOjpyZW5kZXJQcmltaXRpdmVSYW5nZSIpOworfQorCisKK3ZvaWQgTWVzaDo6dXBsb2FkQWxsKENvbnRleHQgKnJzYykKK3sKKyAgICBmb3IgKHVpbnQzMl90IGN0ID0gMDsgY3QgPCBtVmVydGV4QnVmZmVyQ291bnQ7IGN0ICsrKSB7CisgICAgICAgIGlmIChtVmVydGV4QnVmZmVyc1tjdF0uZ2V0KCkpIHsKKyAgICAgICAgICAgIG1WZXJ0ZXhCdWZmZXJzW2N0XS0+ZGVmZXJlZFVwbG9hZFRvQnVmZmVyT2JqZWN0KHJzYyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKHVpbnQzMl90IGN0ID0gMDsgY3QgPCBtUHJpbWl0aXZlc0NvdW50OyBjdCArKykgeworICAgICAgICBpZiAobVByaW1pdGl2ZXNbY3RdLT5tSW5kZXhCdWZmZXIuZ2V0KCkpIHsKKyAgICAgICAgICAgIG1QcmltaXRpdmVzW2N0XS0+bUluZGV4QnVmZmVyLT5kZWZlcmVkVXBsb2FkVG9CdWZmZXJPYmplY3QocnNjKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJzYy0+Y2hlY2tFcnJvcigiTWVzaDo6dXBsb2FkQWxsIik7Cit9CisKK3ZvaWQgTWVzaDo6dXBkYXRlR0xQcmltaXRpdmVzKCkKK3sKKyAgICBmb3IodWludDMyX3QgaSA9IDA7IGkgPCBtUHJpbWl0aXZlc0NvdW50OyBpICsrKSB7CisgICAgICAgIHN3aXRjaChtUHJpbWl0aXZlc1tpXS0+bVByaW1pdGl2ZSkgeworICAgICAgICAgICAgY2FzZSBSU19QUklNSVRJVkVfUE9JTlQ6ICAgICAgICAgIG1QcmltaXRpdmVzW2ldLT5tR0xQcmltaXRpdmUgPSBHTF9QT0lOVFM7IGJyZWFrOworICAgICAgICAgICAgY2FzZSBSU19QUklNSVRJVkVfTElORTogICAgICAgICAgIG1QcmltaXRpdmVzW2ldLT5tR0xQcmltaXRpdmUgPSBHTF9MSU5FUzsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFJTX1BSSU1JVElWRV9MSU5FX1NUUklQOiAgICAgbVByaW1pdGl2ZXNbaV0tPm1HTFByaW1pdGl2ZSA9IEdMX0xJTkVfU1RSSVA7IGJyZWFrOworICAgICAgICAgICAgY2FzZSBSU19QUklNSVRJVkVfVFJJQU5HTEU6ICAgICAgIG1QcmltaXRpdmVzW2ldLT5tR0xQcmltaXRpdmUgPSBHTF9UUklBTkdMRVM7IGJyZWFrOworICAgICAgICAgICAgY2FzZSBSU19QUklNSVRJVkVfVFJJQU5HTEVfU1RSSVA6IG1QcmltaXRpdmVzW2ldLT5tR0xQcmltaXRpdmUgPSBHTF9UUklBTkdMRV9TVFJJUDsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFJTX1BSSU1JVElWRV9UUklBTkdMRV9GQU46ICAgbVByaW1pdGl2ZXNbaV0tPm1HTFByaW1pdGl2ZSA9IEdMX1RSSUFOR0xFX0ZBTjsgYnJlYWs7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgTWVzaDo6c2VyaWFsaXplKE9TdHJlYW0gKnN0cmVhbSkgY29uc3QKK3sKKyAgICAvLyBOZWVkIHRvIGlkZW50aWZ5IG91cnNlbHZlcworICAgIHN0cmVhbS0+YWRkVTMyKCh1aW50MzJfdClnZXRDbGFzc0lkKCkpOworCisgICAgU3RyaW5nOCBuYW1lKGdldE5hbWUoKSk7CisgICAgc3RyZWFtLT5hZGRTdHJpbmcoJm5hbWUpOworCisgICAgLy8gU3RvcmUgbnVtYmVyIG9mIHZlcnRleCBzdHJlYW1zCisgICAgc3RyZWFtLT5hZGRVMzIobVZlcnRleEJ1ZmZlckNvdW50KTsKKyAgICBmb3IodWludDMyX3QgdkNvdW50ID0gMDsgdkNvdW50IDwgbVZlcnRleEJ1ZmZlckNvdW50OyB2Q291bnQgKyspIHsKKyAgICAgICAgbVZlcnRleEJ1ZmZlcnNbdkNvdW50XS0+c2VyaWFsaXplKHN0cmVhbSk7CisgICAgfQorCisgICAgc3RyZWFtLT5hZGRVMzIobVByaW1pdGl2ZXNDb3VudCk7CisgICAgLy8gU3RvcmUgdGhlIHByaW1pdGl2ZXMKKyAgICBmb3IgKHVpbnQzMl90IHBDb3VudCA9IDA7IHBDb3VudCA8IG1QcmltaXRpdmVzQ291bnQ7IHBDb3VudCArKykgeworICAgICAgICBQcmltaXRpdmVfdCAqIHByaW0gPSBtUHJpbWl0aXZlc1twQ291bnRdOworCisgICAgICAgIHN0cmVhbS0+YWRkVTgoKHVpbnQ4X3QpcHJpbS0+bVByaW1pdGl2ZSk7CisKKyAgICAgICAgaWYocHJpbS0+bUluZGV4QnVmZmVyLmdldCgpKSB7CisgICAgICAgICAgICBzdHJlYW0tPmFkZFUzMigxKTsKKyAgICAgICAgICAgIHByaW0tPm1JbmRleEJ1ZmZlci0+c2VyaWFsaXplKHN0cmVhbSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBzdHJlYW0tPmFkZFUzMigwKTsKKyAgICAgICAgfQorICAgIH0KK30KKworTWVzaCAqTWVzaDo6Y3JlYXRlRnJvbVN0cmVhbShDb250ZXh0ICpyc2MsIElTdHJlYW0gKnN0cmVhbSkKK3sKKyAgICAvLyBGaXJzdCBtYWtlIHN1cmUgd2UgYXJlIHJlYWRpbmcgdGhlIGNvcnJlY3Qgb2JqZWN0CisgICAgUnNBM0RDbGFzc0lEIGNsYXNzSUQgPSAoUnNBM0RDbGFzc0lEKXN0cmVhbS0+bG9hZFUzMigpOworICAgIGlmKGNsYXNzSUQgIT0gUlNfQTNEX0NMQVNTX0lEX01FU0gpIHsKKyAgICAgICAgTE9HRSgibWVzaCBsb2FkaW5nIHNraXBwZWQgZHVlIHRvIGludmFsaWQgY2xhc3MgaWQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgTWVzaCAqIG1lc2ggPSBuZXcgTWVzaChyc2MpOworCisgICAgU3RyaW5nOCBuYW1lOworICAgIHN0cmVhbS0+bG9hZFN0cmluZygmbmFtZSk7CisgICAgbWVzaC0+c2V0TmFtZShuYW1lLnN0cmluZygpLCBuYW1lLnNpemUoKSk7CisKKyAgICBtZXNoLT5tVmVydGV4QnVmZmVyQ291bnQgPSBzdHJlYW0tPmxvYWRVMzIoKTsKKyAgICBpZihtZXNoLT5tVmVydGV4QnVmZmVyQ291bnQpIHsKKyAgICAgICAgbWVzaC0+bVZlcnRleEJ1ZmZlcnMgPSBuZXcgT2JqZWN0QmFzZVJlZjxBbGxvY2F0aW9uPlttZXNoLT5tVmVydGV4QnVmZmVyQ291bnRdOworCisgICAgICAgIGZvcih1aW50MzJfdCB2Q291bnQgPSAwOyB2Q291bnQgPCBtZXNoLT5tVmVydGV4QnVmZmVyQ291bnQ7IHZDb3VudCArKykgeworICAgICAgICAgICAgQWxsb2NhdGlvbiAqdmVydGV4QWxsb2MgPSBBbGxvY2F0aW9uOjpjcmVhdGVGcm9tU3RyZWFtKHJzYywgc3RyZWFtKTsKKyAgICAgICAgICAgIG1lc2gtPm1WZXJ0ZXhCdWZmZXJzW3ZDb3VudF0uc2V0KHZlcnRleEFsbG9jKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIG1lc2gtPm1QcmltaXRpdmVzQ291bnQgPSBzdHJlYW0tPmxvYWRVMzIoKTsKKyAgICBpZihtZXNoLT5tUHJpbWl0aXZlc0NvdW50KSB7CisgICAgICAgIG1lc2gtPm1QcmltaXRpdmVzID0gbmV3IFByaW1pdGl2ZV90ICpbbWVzaC0+bVByaW1pdGl2ZXNDb3VudF07CisKKyAgICAgICAgLy8gbG9hZCBhbGwgcHJpbWl0aXZlcworICAgICAgICBmb3IgKHVpbnQzMl90IHBDb3VudCA9IDA7IHBDb3VudCA8IG1lc2gtPm1QcmltaXRpdmVzQ291bnQ7IHBDb3VudCArKykgeworICAgICAgICAgICAgUHJpbWl0aXZlX3QgKiBwcmltID0gbmV3IFByaW1pdGl2ZV90OworICAgICAgICAgICAgbWVzaC0+bVByaW1pdGl2ZXNbcENvdW50XSA9IHByaW07CisKKyAgICAgICAgICAgIHByaW0tPm1QcmltaXRpdmUgPSAoUnNQcmltaXRpdmUpc3RyZWFtLT5sb2FkVTgoKTsKKworICAgICAgICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSBpbmRleCBidWZmZXIgd2FzIHN0b3JlZAorICAgICAgICAgICAgdWludDMyX3QgaXNJbmRleFByZXNlbnQgPSBzdHJlYW0tPmxvYWRVMzIoKTsKKyAgICAgICAgICAgIGlmKGlzSW5kZXhQcmVzZW50KSB7CisgICAgICAgICAgICAgICAgQWxsb2NhdGlvbiAqaW5kZXhBbGxvYyA9IEFsbG9jYXRpb246OmNyZWF0ZUZyb21TdHJlYW0ocnNjLCBzdHJlYW0pOworICAgICAgICAgICAgICAgIHByaW0tPm1JbmRleEJ1ZmZlci5zZXQoaW5kZXhBbGxvYyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtZXNoLT51cGRhdGVHTFByaW1pdGl2ZXMoKTsKKyAgICBtZXNoLT51cGxvYWRBbGwocnNjKTsKKworICAgIHJldHVybiBtZXNoOworfQorCit2b2lkIE1lc2g6OmNvbXB1dGVCQm94KCkgeworICAgIGZsb2F0ICpwb3NQdHIgPSBOVUxMOworICAgIHVpbnQzMl90IHZlY3RvclNpemUgPSAwOworICAgIHVpbnQzMl90IHN0cmlkZSA9IDA7CisgICAgdWludDMyX3QgbnVtVmVydHMgPSAwOworICAgIC8vIEZpcnN0IHdlIG5lZWQgdG8gZmluZCB0aGUgcG9zaXRpb24gcHRyIGFuZCBzdHJpZGUKKyAgICBmb3IgKHVpbnQzMl90IGN0PTA7IGN0IDwgbVZlcnRleEJ1ZmZlckNvdW50OyBjdCsrKSB7CisgICAgICAgIGNvbnN0IFR5cGUgKmJ1ZmZlclR5cGUgPSBtVmVydGV4QnVmZmVyc1tjdF0tPmdldFR5cGUoKTsKKyAgICAgICAgY29uc3QgRWxlbWVudCAqYnVmZmVyRWxlbSA9IGJ1ZmZlclR5cGUtPmdldEVsZW1lbnQoKTsKKworICAgICAgICBmb3IgKHVpbnQzMl90IGN0PTA7IGN0IDwgYnVmZmVyRWxlbS0+Z2V0RmllbGRDb3VudCgpOyBjdCsrKSB7CisgICAgICAgICAgICBpZihzdHJjbXAoYnVmZmVyRWxlbS0+Z2V0RmllbGROYW1lKGN0KSwgInBvc2l0aW9uIikgPT0gMCkgeworICAgICAgICAgICAgICAgIHZlY3RvclNpemUgPSBidWZmZXJFbGVtLT5nZXRGaWVsZChjdCktPmdldENvbXBvbmVudCgpLmdldFZlY3RvclNpemUoKTsKKyAgICAgICAgICAgICAgICBzdHJpZGUgPSBidWZmZXJFbGVtLT5nZXRTaXplQnl0ZXMoKSAvIHNpemVvZihmbG9hdCk7CisgICAgICAgICAgICAgICAgdWludDMyX3Qgb2Zmc2V0ID0gYnVmZmVyRWxlbS0+Z2V0RmllbGRPZmZzZXRCeXRlcyhjdCk7CisgICAgICAgICAgICAgICAgcG9zUHRyID0gKGZsb2F0KikoKHVpbnQ4X3QqKW1WZXJ0ZXhCdWZmZXJzW2N0XS0+Z2V0UHRyKCkgKyBvZmZzZXQpOworICAgICAgICAgICAgICAgIG51bVZlcnRzID0gYnVmZmVyVHlwZS0+Z2V0RGltWCgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmKHBvc1B0cikgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtQkJveE1pblswXSA9IG1CQm94TWluWzFdID0gbUJCb3hNaW5bMl0gPSAxZTY7CisgICAgbUJCb3hNYXhbMF0gPSBtQkJveE1heFsxXSA9IG1CQm94TWF4WzJdID0gLTFlNjsKKyAgICBpZighcG9zUHRyKSB7CisgICAgICAgIExPR0UoIlVuYWJsZSB0byBjb21wdXRlIGJvdW5kaW5nIGJveCIpOworICAgICAgICBtQkJveE1pblswXSA9IG1CQm94TWluWzFdID0gbUJCb3hNaW5bMl0gPSAwLjBmOworICAgICAgICBtQkJveE1heFswXSA9IG1CQm94TWF4WzFdID0gbUJCb3hNYXhbMl0gPSAwLjBmOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZm9yKHVpbnQzMl90IGkgPSAwOyBpIDwgbnVtVmVydHM7IGkgKyspIHsKKyAgICAgICAgZm9yKHVpbnQzMl90IHYgPSAwOyB2IDwgdmVjdG9yU2l6ZTsgdiArKykgeworICAgICAgICAgICAgbUJCb3hNaW5bdl0gPSByc01pbihtQkJveE1pblt2XSwgcG9zUHRyW3ZdKTsKKyAgICAgICAgICAgIG1CQm94TWF4W3ZdID0gcnNNYXgobUJCb3hNYXhbdl0sIHBvc1B0clt2XSk7CisgICAgICAgIH0KKyAgICAgICAgcG9zUHRyICs9IHN0cmlkZTsKKyAgICB9Cit9CiAKIAogTWVzaENvbnRleHQ6Ok1lc2hDb250ZXh0KCkKQEAgLTQ2LDMgKzI3Niw4MyBAQAogewogfQogCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgcmVuZGVyc2NyaXB0IHsKKworUnNNZXNoIHJzaV9NZXNoQ3JlYXRlKENvbnRleHQgKnJzYywgdWludDMyX3QgdnR4Q291bnQsIHVpbnQzMl90IGlkeENvdW50KQoreworICAgIE1lc2ggKnNtID0gbmV3IE1lc2gocnNjKTsKKyAgICBzbS0+aW5jVXNlclJlZigpOworCisgICAgc20tPm1QcmltaXRpdmVzQ291bnQgPSBpZHhDb3VudDsKKyAgICBzbS0+bVByaW1pdGl2ZXMgPSBuZXcgTWVzaDo6UHJpbWl0aXZlX3QgKltzbS0+bVByaW1pdGl2ZXNDb3VudF07CisgICAgZm9yKHVpbnQzMl90IGN0ID0gMDsgY3QgPCBpZHhDb3VudDsgY3QgKyspIHsKKyAgICAgICAgc20tPm1QcmltaXRpdmVzW2N0XSA9IG5ldyBNZXNoOjpQcmltaXRpdmVfdDsKKyAgICB9CisKKyAgICBzbS0+bVZlcnRleEJ1ZmZlckNvdW50ID0gdnR4Q291bnQ7CisgICAgc20tPm1WZXJ0ZXhCdWZmZXJzID0gbmV3IE9iamVjdEJhc2VSZWY8QWxsb2NhdGlvbj5bdnR4Q291bnRdOworCisgICAgcmV0dXJuIHNtOworfQorCit2b2lkIHJzaV9NZXNoQmluZFZlcnRleChDb250ZXh0ICpyc2MsIFJzTWVzaCBtdiwgUnNBbGxvY2F0aW9uIHZhLCB1aW50MzJfdCBzbG90KQoreworICAgIE1lc2ggKnNtID0gc3RhdGljX2Nhc3Q8TWVzaCAqPihtdik7CisgICAgcnNBc3NlcnQoc2xvdCA8IHNtLT5tVmVydGV4QnVmZmVyQ291bnQpOworCisgICAgc20tPm1WZXJ0ZXhCdWZmZXJzW3Nsb3RdLnNldCgoQWxsb2NhdGlvbiAqKXZhKTsKK30KKwordm9pZCByc2lfTWVzaEJpbmRJbmRleChDb250ZXh0ICpyc2MsIFJzTWVzaCBtdiwgUnNBbGxvY2F0aW9uIHZhLCB1aW50MzJfdCBwcmltVHlwZSwgdWludDMyX3Qgc2xvdCkKK3sKKyAgICBNZXNoICpzbSA9IHN0YXRpY19jYXN0PE1lc2ggKj4obXYpOworICAgIHJzQXNzZXJ0KHNsb3QgPCBzbS0+bVByaW1pdGl2ZXNDb3VudCk7CisKKyAgICBzbS0+bVByaW1pdGl2ZXNbc2xvdF0tPm1JbmRleEJ1ZmZlci5zZXQoKEFsbG9jYXRpb24gKil2YSk7CisgICAgc20tPm1QcmltaXRpdmVzW3Nsb3RdLT5tUHJpbWl0aXZlID0gKFJzUHJpbWl0aXZlKXByaW1UeXBlOworICAgIHNtLT51cGRhdGVHTFByaW1pdGl2ZXMoKTsKK30KKwordm9pZCByc2lfTWVzaEdldFZlcnRleEJ1ZmZlckNvdW50KENvbnRleHQgKnJzYywgUnNNZXNoIG12LCBpbnQzMl90ICpudW1WdHgpCit7CisgICAgTWVzaCAqc20gPSBzdGF0aWNfY2FzdDxNZXNoICo+KG12KTsKKyAgICAqbnVtVnR4ID0gc20tPm1WZXJ0ZXhCdWZmZXJDb3VudDsKK30KKwordm9pZCByc2lfTWVzaEdldEluZGV4Q291bnQoQ29udGV4dCAqcnNjLCBSc01lc2ggbXYsIGludDMyX3QgKm51bUlkeCkKK3sKKyAgICBNZXNoICpzbSA9IHN0YXRpY19jYXN0PE1lc2ggKj4obXYpOworICAgICpudW1JZHggPSBzbS0+bVByaW1pdGl2ZXNDb3VudDsKK30KKwordm9pZCByc2lfTWVzaEdldFZlcnRpY2VzKENvbnRleHQgKnJzYywgUnNNZXNoIG12LCBSc0FsbG9jYXRpb24gKnZ0eERhdGEsIHVpbnQzMl90IHZ0eERhdGFDb3VudCkKK3sKKyAgICBNZXNoICpzbSA9IHN0YXRpY19jYXN0PE1lc2ggKj4obXYpOworICAgIHJzQXNzZXJ0KHZ0eERhdGFDb3VudCA9PSBzbS0+bVZlcnRleEJ1ZmZlckNvdW50KTsKKworICAgIGZvcih1aW50MzJfdCBjdCA9IDA7IGN0IDwgdnR4RGF0YUNvdW50OyBjdCArKykgeworICAgICAgICB2dHhEYXRhW2N0XSA9IHNtLT5tVmVydGV4QnVmZmVyc1tjdF0uZ2V0KCk7CisgICAgICAgIHNtLT5tVmVydGV4QnVmZmVyc1tjdF0tPmluY1VzZXJSZWYoKTsKKyAgICB9Cit9CisKK3ZvaWQgcnNpX01lc2hHZXRJbmRpY2VzKENvbnRleHQgKnJzYywgUnNNZXNoIG12LCBSc0FsbG9jYXRpb24gKnZhLCB1aW50MzJfdCAqcHJpbVR5cGUsIHVpbnQzMl90IGlkeERhdGFDb3VudCkKK3sKKyAgICBNZXNoICpzbSA9IHN0YXRpY19jYXN0PE1lc2ggKj4obXYpOworICAgIHJzQXNzZXJ0KGlkeERhdGFDb3VudCA9PSBzbS0+bVByaW1pdGl2ZXNDb3VudCk7CisKKyAgICBmb3IodWludDMyX3QgY3QgPSAwOyBjdCA8IGlkeERhdGFDb3VudDsgY3QgKyspIHsKKyAgICAgICAgdmFbY3RdID0gc20tPm1QcmltaXRpdmVzW2N0XS0+bUluZGV4QnVmZmVyLmdldCgpOworICAgICAgICBwcmltVHlwZVtjdF0gPSBzbS0+bVByaW1pdGl2ZXNbY3RdLT5tUHJpbWl0aXZlOworICAgICAgICBpZihzbS0+bVByaW1pdGl2ZXNbY3RdLT5tSW5kZXhCdWZmZXIuZ2V0KCkpIHsKKyAgICAgICAgICAgIHNtLT5tUHJpbWl0aXZlc1tjdF0tPm1JbmRleEJ1ZmZlci0+aW5jVXNlclJlZigpOworICAgICAgICB9CisgICAgfQorCit9CisKKworCisKK319CmRpZmYgLS1naXQgYS9saWJzL3JzL3JzTWVzaC5oIGIvbGlicy9ycy9yc01lc2guaAppbmRleCA1MjAxYWJkLi5lZDAxYzM4IDEwMDY0NAotLS0gYS9saWJzL3JzL3JzTWVzaC5oCisrKyBiL2xpYnMvcnMvcnNNZXNoLmgKQEAgLTMyLDQ1ICszMiw0MCBAQAogICAgIE1lc2goQ29udGV4dCAqKTsKICAgICB+TWVzaCgpOwogCi0gICAgc3RydWN0IFZlcnRpY2llc190Ci0gICAgewotICAgICAgICBBbGxvY2F0aW9uICoqIG1BbGxvY2F0aW9uczsKLSAgICAgICAgdWludDMyX3QgbUFsbG9jYXRpb25Db3VudDsKKyAgICAvLyBDb250YWlucyB2ZXJ0ZXggZGF0YQorICAgIC8vIFBvc2l0aW9uLCBub3JtYWwsIHRleGNvb3JkLCBldGMgY291bGQgZWl0aGVyIGJlIHN0cmlkZWQgaW4gb25lIGFsbG9jYXRpb24KKyAgICAvLyBvZiBwcm92aWRlZCBzZXBhcmV0ZWx5IGluIG11bHRpcGxlIG9uZXMKKyAgICBPYmplY3RCYXNlUmVmPEFsbG9jYXRpb24+ICptVmVydGV4QnVmZmVyczsKKyAgICB1aW50MzJfdCBtVmVydGV4QnVmZmVyQ291bnQ7CiAKLSAgICAgICAgc2l6ZV90IG1WZXJ0ZXhEYXRhU2l6ZTsKLQotICAgICAgICBzaXplX3QgbU9mZnNldENvb3JkOwotICAgICAgICBzaXplX3QgbU9mZnNldFRleDsKLSAgICAgICAgc2l6ZV90IG1PZmZzZXROb3JtOwotCi0gICAgICAgIHNpemVfdCBtU2l6ZUNvb3JkOwotICAgICAgICBzaXplX3QgbVNpemVUZXg7Ci0gICAgICAgIHNpemVfdCBtU2l6ZU5vcm07Ci0KLSAgICAgICAgdWludDMyX3QgbUJ1ZmZlck9iamVjdDsKLSAgICB9OwotCisgICAgLy8gRWl0aGVyIG1JbmRleEJ1ZmZlciwgbVByaW1pdGl2ZUJ1ZmZlciBvciBib3RoIGNvdWxkIGhhdmUgYSBOVUxMIHJlZmVyZW5jZQorICAgIC8vIElmIGJvdGggYXJlIG51bGwsIG1QcmltaXRpdmUgb25seSB3b3VsZCBiZSB1c2VkIHRvIHJlbmRlciB0aGUgbWVzaAogICAgIHN0cnVjdCBQcmltaXRpdmVfdAogICAgIHsKLSAgICAgICAgUnNQcmltaXRpdmUgbVR5cGU7Ci0gICAgICAgIFZlcnRpY2llc190ICptVmVydGljaWVzOworICAgICAgICBPYmplY3RCYXNlUmVmPEFsbG9jYXRpb24+IG1JbmRleEJ1ZmZlcjsKIAotICAgICAgICB1aW50MzJfdCBtSW5kZXhDb3VudDsKLSAgICAgICAgdWludDE2X3QgKm1JbmRpY2llczsKLQotICAgICAgICB1aW50MzJfdCBtUmVzdGFydENvdW50czsKLSAgICAgICAgdWludDE2X3QgKm1SZXN0YXJ0czsKKyAgICAgICAgUnNQcmltaXRpdmUgbVByaW1pdGl2ZTsKKyAgICAgICAgdWludDMyX3QgbUdMUHJpbWl0aXZlOwogICAgIH07CiAKLSAgICBWZXJ0aWNpZXNfdCAqIG1WZXJ0aWNpZXM7Ci0gICAgdWludDMyX3QgbVZlcnRpY2llc0NvdW50OwotCiAgICAgUHJpbWl0aXZlX3QgKiogbVByaW1pdGl2ZXM7CiAgICAgdWludDMyX3QgbVByaW1pdGl2ZXNDb3VudDsKIAorICAgIHZvaWQgcmVuZGVyKENvbnRleHQgKikgY29uc3Q7CisgICAgdm9pZCByZW5kZXJQcmltaXRpdmUoQ29udGV4dCAqLCB1aW50MzJfdCBwcmltSW5kZXgpIGNvbnN0OworICAgIHZvaWQgcmVuZGVyUHJpbWl0aXZlUmFuZ2UoQ29udGV4dCAqLCB1aW50MzJfdCBwcmltSW5kZXgsIHVpbnQzMl90IHN0YXJ0LCB1aW50MzJfdCBsZW4pIGNvbnN0OworICAgIHZvaWQgdXBsb2FkQWxsKENvbnRleHQgKik7CisgICAgdm9pZCB1cGRhdGVHTFByaW1pdGl2ZXMoKTsKIAorICAgIHZpcnR1YWwgdm9pZCBzZXJpYWxpemUoT1N0cmVhbSAqc3RyZWFtKSBjb25zdDsKKyAgICB2aXJ0dWFsIFJzQTNEQ2xhc3NJRCBnZXRDbGFzc0lkKCkgY29uc3QgeyByZXR1cm4gUlNfQTNEX0NMQVNTX0lEX01FU0g7IH0KKyAgICBzdGF0aWMgTWVzaCAqY3JlYXRlRnJvbVN0cmVhbShDb250ZXh0ICpyc2MsIElTdHJlYW0gKnN0cmVhbSk7CiAKLSAgICB2b2lkIGFuYWx5emVFbGVtZW50KCk7CisgICAgLy8gQm91bmRpbmcgdm9sdW1lcworICAgIGZsb2F0IG1CQm94TWluWzNdOworICAgIGZsb2F0IG1CQm94TWF4WzNdOworICAgIHZvaWQgY29tcHV0ZUJCb3goKTsKKwogcHJvdGVjdGVkOgogfTsKIApAQCAtODgsMyArODMsNCBAQAogI2VuZGlmIC8vQU5EUk9JRF9SU19UUklBTkdMRV9NRVNIX0gKIAogCisKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNNdXRleC5jcHAgYi9saWJzL3JzL3JzTXV0ZXguY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3NzUyZjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL3JzTXV0ZXguY3BwCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAicnNNdXRleC5oIgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpyZW5kZXJzY3JpcHQ7CisKKworTXV0ZXg6Ok11dGV4KCkKK3sKK30KKworTXV0ZXg6On5NdXRleCgpCit7CisgICAgcHRocmVhZF9tdXRleF9kZXN0cm95KCZtTXV0ZXgpOworfQorCitib29sIE11dGV4Ojppbml0KCkKK3sKKyAgICBpbnQgc3RhdHVzID0gcHRocmVhZF9tdXRleF9pbml0KCZtTXV0ZXgsIE5VTEwpOworICAgIGlmIChzdGF0dXMpIHsKKyAgICAgICAgTE9HRSgiTXV0ZXg6Ok11dGV4IGluaXQgZmFpbHVyZSIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIE11dGV4Ojpsb2NrKCkKK3sKKyAgICBpbnQgc3RhdHVzOworICAgIHN0YXR1cyA9IHB0aHJlYWRfbXV0ZXhfbG9jaygmbU11dGV4KTsKKyAgICBpZiAoc3RhdHVzKSB7CisgICAgICAgIExPR0UoIk11dGV4OiBlcnJvciAlaSBsb2NraW5nLiIsIHN0YXR1cyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgTXV0ZXg6OnVubG9jaygpCit7CisgICAgaW50IHN0YXR1czsKKyAgICBzdGF0dXMgPSBwdGhyZWFkX211dGV4X3VubG9jaygmbU11dGV4KTsKKyAgICBpZiAoc3RhdHVzKSB7CisgICAgICAgIExPR0UoIk11dGV4IGVycm9yICVpIHVubG9ja2luZy4iLCBzdGF0dXMpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCisKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNNdXRleC5oIGIvbGlicy9ycy9yc011dGV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDc3MjVkNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvcnNNdXRleC5oCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfUlNfTVVURVhfSAorI2RlZmluZSBBTkRST0lEX1JTX01VVEVYX0gKKworCisjaW5jbHVkZSAicnNVdGlscy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgcmVuZGVyc2NyaXB0IHsKKworY2xhc3MgTXV0ZXggeworcHVibGljOgorICAgIE11dGV4KCk7CisgICAgfk11dGV4KCk7CisKKyAgICBib29sIGluaXQoKTsKKyAgICBib29sIGxvY2soKTsKKyAgICBib29sIHVubG9jaygpOworCitwcm90ZWN0ZWQ6CisgICAgcHRocmVhZF9tdXRleF90IG1NdXRleDsKK307CisKK30KK30KKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNOb2lzZS5jcHAgYi9saWJzL3JzL3JzTm9pc2UuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjY3NTg2Li4wMDAwMDAwCi0tLSBhL2xpYnMvcnMvcnNOb2lzZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyNTYgKzAsMCBAQAotLyoKLSAqIFRoaXMgaW1wbGVtZW50YXRpb24gb2YgdGhlIG5vaXNlIGZ1bmN0aW9ucyB3YXMgcG9ydGVkIGZyb20gdGhlIEphdmEKLSAqIGltcGxlbWVudGF0aW9uIGJ5IEplcnJ5IEh1eHRhYmxlIChodHRwOi8vd3d3LmpobGFicy5jb20pIHVuZGVyCi0gKiBBcGFjaGUgTGljZW5zZSAyLjAgKHNlZSBodHRwOi8vamhsYWJzLmNvbS9pcC9maWx0ZXJzL2Rvd25sb2FkLmh0bWwpCi0gKgotICogT3JpZ2luYWwgaGVhZGVyOgotICoKLSAqIENvcHlyaWdodCAyMDA2IEplcnJ5IEh1eHRhYmxlCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJyc05vaXNlLmgiCi0KLSNpbmNsdWRlIDxtYXRoLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8dGltZS5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgcmVuZGVyc2NyaXB0IHsKLQotI2RlZmluZSBCIDB4MTAwCi0jZGVmaW5lIEJNIDB4ZmYKLSNkZWZpbmUgTiAweDEwMDAKLQotc3RhdGljIGludCBwW0IgKyBCICsgMl07Ci1zdGF0aWMgZmxvYXQgZzNbQiArIEIgKyAyXVszXTsKLXN0YXRpYyBmbG9hdCBnMltCICsgQiArIDJdWzJdOwotc3RhdGljIGZsb2F0IGcxW0IgKyBCICsgMl07Ci1zdGF0aWMgYm9vbCBub2lzZV9zdGFydCA9IHRydWU7Ci0KLSNkZWZpbmUgbGVycGYoc3RhcnQsIHN0b3AsIGFtb3VudCkgc3RhcnQgKyAoc3RvcCAtIHN0YXJ0KSAqIGFtb3VudAotCi1zdGF0aWMgaW5saW5lIGZsb2F0IG5vaXNlX3NDdXJ2ZShmbG9hdCB0KQotewotICAgIHJldHVybiB0ICogdCAqICgzLjBmIC0gMi4wZiAqIHQpOwotfQotCi1pbmxpbmUgdm9pZCBTQ19ub3JtYWxpemVmMihmbG9hdCB2W10pCi17Ci0gICAgZmxvYXQgcyA9IChmbG9hdClzcXJ0Zih2WzBdICogdlswXSArIHZbMV0gKiB2WzFdKTsKLSAgICB2WzBdID0gdlswXSAvIHM7Ci0gICAgdlsxXSA9IHZbMV0gLyBzOwotfQotCi1pbmxpbmUgdm9pZCBTQ19ub3JtYWxpemVmMyhmbG9hdCB2W10pCi17Ci0gICAgZmxvYXQgcyA9IChmbG9hdClzcXJ0Zih2WzBdICogdlswXSArIHZbMV0gKiB2WzFdICsgdlsyXSAqIHZbMl0pOwotICAgIHZbMF0gPSB2WzBdIC8gczsKLSAgICB2WzFdID0gdlsxXSAvIHM7Ci0gICAgdlsyXSA9IHZbMl0gLyBzOwotfQotCi1zdGF0aWMgdm9pZCBub2lzZV9pbml0KCkKLXsKLSAgICBpbnQgaSwgaiwgazsKLSAgICAKLSAgICBmb3IgKGkgPSAwOyBpIDwgQjsgaSsrKSB7Ci0gICAgICAgIHBbaV0gPSBpOwotICAgICAgICAKLSAgICAgICAgZzFbaV0gPSAoZmxvYXQpKChyYW5kKCkgJSAoQiArIEIpKSAtIEIpIC8gQjsKLSAgICAgICAgCi0gICAgICAgIGZvciAoaiA9IDA7IGogPCAyOyBqKyspCi0gICAgICAgICAgICBnMltpXVtqXSA9IChmbG9hdCkoKHJhbmQoKSAlIChCICsgQikpIC0gQikgLyBCOwotICAgICAgICBTQ19ub3JtYWxpemVmMihnMltpXSk7Ci0gICAgICAgIAotICAgICAgICBmb3IgKGogPSAwOyBqIDwgMzsgaisrKQotICAgICAgICAgICAgZzNbaV1bal0gPSAoZmxvYXQpKChyYW5kKCkgJSAoQiArIEIpKSAtIEIpIC8gQjsKLSAgICAgICAgU0Nfbm9ybWFsaXplZjMoZzNbaV0pOwotICAgIH0KLSAgICAKLSAgICBmb3IgKGkgPSBCLTE7IGkgPj0gMDsgaS0tKSB7Ci0gICAgICAgIGsgPSBwW2ldOwotICAgICAgICBwW2ldID0gcFtqID0gcmFuZCgpICUgQl07Ci0gICAgICAgIHBbal0gPSBrOwotICAgIH0KLSAgICAKLSAgICBmb3IgKGkgPSAwOyBpIDwgQiArIDI7IGkrKykgewotICAgICAgICBwW0IgKyBpXSA9IHBbaV07Ci0gICAgICAgIGcxW0IgKyBpXSA9IGcxW2ldOwotICAgICAgICBmb3IgKGogPSAwOyBqIDwgMjsgaisrKQotICAgICAgICAgICAgZzJbQiArIGldW2pdID0gZzJbaV1bal07Ci0gICAgICAgIGZvciAoaiA9IDA7IGogPCAzOyBqKyspCi0gICAgICAgICAgICBnM1tCICsgaV1bal0gPSBnM1tpXVtqXTsKLSAgICB9Ci19Ci0KLWZsb2F0IFNDX25vaXNlZihmbG9hdCB4KQotewotICAgIHNyYW5kKHRpbWUoTlVMTCkpOwotICAgIGludCBieDAsIGJ4MTsKLSAgICBmbG9hdCByeDAsIHJ4MSwgc3gsIHQsIHUsIHY7Ci0gICAgCi0gICAgaWYgKG5vaXNlX3N0YXJ0KSB7Ci0gICAgICAgIG5vaXNlX3N0YXJ0ID0gZmFsc2U7Ci0gICAgICAgIG5vaXNlX2luaXQoKTsKLSAgICB9Ci0gICAgCi0gICAgdCA9IHggKyBOOwotICAgIGJ4MCA9ICgoaW50KXQpICYgQk07Ci0gICAgYngxID0gKGJ4MCsxKSAmIEJNOwotICAgIHJ4MCA9IHQgLSAoaW50KXQ7Ci0gICAgcngxID0gcngwIC0gMS4wZjsKLSAgICAKLSAgICBzeCA9IG5vaXNlX3NDdXJ2ZShyeDApOwotICAgIAotICAgIHUgPSByeDAgKiBnMVtwW2J4MF1dOwotICAgIHYgPSByeDEgKiBnMVtwW2J4MV1dOwotICAgIHJldHVybiAyLjNmICogbGVycGYodSwgdiwgc3gpOwotfQotCi1mbG9hdCBTQ19ub2lzZWYyKGZsb2F0IHgsIGZsb2F0IHkpCi17Ci0gICAgc3JhbmQodGltZShOVUxMKSk7Ci0gICAgaW50IGJ4MCwgYngxLCBieTAsIGJ5MSwgYjAwLCBiMTAsIGIwMSwgYjExOwotICAgIGZsb2F0IHJ4MCwgcngxLCByeTAsIHJ5MSwgc3gsIHN5LCBhLCBiLCB0LCB1LCB2OwotICAgIGZsb2F0ICpxOwotICAgIGludCBpLCBqOwotICAgIAotICAgIGlmIChub2lzZV9zdGFydCkgewotICAgICAgICBub2lzZV9zdGFydCA9IGZhbHNlOwotICAgICAgICBub2lzZV9pbml0KCk7Ci0gICAgfQotICAgIAotICAgIHQgPSB4ICsgTjsKLSAgICBieDAgPSAoKGludCl0KSAmIEJNOwotICAgIGJ4MSA9IChieDArMSkgJiBCTTsKLSAgICByeDAgPSB0IC0gKGludCl0OwotICAgIHJ4MSA9IHJ4MCAtIDEuMGY7Ci0JCi0gICAgdCA9IHkgKyBOOwotICAgIGJ5MCA9ICgoaW50KXQpICYgQk07Ci0gICAgYnkxID0gKGJ5MCsxKSAmIEJNOwotICAgIHJ5MCA9IHQgLSAoaW50KXQ7Ci0gICAgcnkxID0gcnkwIC0gMS4wZjsKLQkKLSAgICBpID0gcFtieDBdOwotICAgIGogPSBwW2J4MV07Ci0gICAgCi0gICAgYjAwID0gcFtpICsgYnkwXTsKLSAgICBiMTAgPSBwW2ogKyBieTBdOwotICAgIGIwMSA9IHBbaSArIGJ5MV07Ci0gICAgYjExID0gcFtqICsgYnkxXTsKLSAgICAKLSAgICBzeCA9IG5vaXNlX3NDdXJ2ZShyeDApOwotICAgIHN5ID0gbm9pc2Vfc0N1cnZlKHJ5MCk7Ci0gICAgCi0gICAgcSA9IGcyW2IwMF07IHUgPSByeDAgKiBxWzBdICsgcnkwICogcVsxXTsKLSAgICBxID0gZzJbYjEwXTsgdiA9IHJ4MSAqIHFbMF0gKyByeTAgKiBxWzFdOwotICAgIGEgPSBsZXJwZih1LCB2LCBzeCk7Ci0gICAgCi0gICAgcSA9IGcyW2IwMV07IHUgPSByeDAgKiBxWzBdICsgcnkxICogcVsxXTsKLSAgICBxID0gZzJbYjExXTsgdiA9IHJ4MSAqIHFbMF0gKyByeTEgKiBxWzFdOwotICAgIGIgPSBsZXJwZih1LCB2LCBzeCk7Ci0gICAgCi0gICAgcmV0dXJuIDEuNWYqbGVycGYoYSwgYiwgc3kpOwotfQotCi1mbG9hdCBTQ19ub2lzZWYzKGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopCi17Ci0gICAgc3JhbmQodGltZShOVUxMKSk7Ci0gICAgaW50IGJ4MCwgYngxLCBieTAsIGJ5MSwgYnowLCBiejEsIGIwMCwgYjEwLCBiMDEsIGIxMTsKLSAgICBmbG9hdCByeDAsIHJ4MSwgcnkwLCByeTEsIHJ6MCwgcnoxLCBzeSwgc3osIGEsIGIsIGMsIGQsIHQsIHUsIHY7Ci0gICAgZmxvYXQgKnE7Ci0gICAgaW50IGksIGo7Ci0gICAgCi0gICAgaWYgKG5vaXNlX3N0YXJ0KSB7Ci0gICAgICAgIG5vaXNlX3N0YXJ0ID0gZmFsc2U7Ci0gICAgICAgIG5vaXNlX2luaXQoKTsKLSAgICB9Ci0gICAgCi0gICAgdCA9IHggKyBOOwotICAgIGJ4MCA9ICgoaW50KXQpICYgQk07Ci0gICAgYngxID0gKGJ4MCsxKSAmIEJNOwotICAgIHJ4MCA9IHQgLSAoaW50KXQ7Ci0gICAgcngxID0gcngwIC0gMS4wZjsKLSAgICAKLSAgICB0ID0geSArIE47Ci0gICAgYnkwID0gKChpbnQpdCkgJiBCTTsKLSAgICBieTEgPSAoYnkwKzEpICYgQk07Ci0gICAgcnkwID0gdCAtIChpbnQpdDsKLSAgICByeTEgPSByeTAgLSAxLjBmOwotCQotICAgIHQgPSB6ICsgTjsKLSAgICBiejAgPSAoKGludCl0KSAmIEJNOwotICAgIGJ6MSA9IChiejArMSkgJiBCTTsKLSAgICByejAgPSB0IC0gKGludCl0OwotICAgIHJ6MSA9IHJ6MCAtIDEuMGY7Ci0JCi0gICAgaSA9IHBbYngwXTsKLSAgICBqID0gcFtieDFdOwotICAgIAotICAgIGIwMCA9IHBbaSArIGJ5MF07Ci0gICAgYjEwID0gcFtqICsgYnkwXTsKLSAgICBiMDEgPSBwW2kgKyBieTFdOwotICAgIGIxMSA9IHBbaiArIGJ5MV07Ci0gICAgCi0gICAgdCAgPSBub2lzZV9zQ3VydmUocngwKTsKLSAgICBzeSA9IG5vaXNlX3NDdXJ2ZShyeTApOwotICAgIHN6ID0gbm9pc2Vfc0N1cnZlKHJ6MCk7Ci0gICAgCi0gICAgcSA9IGczW2IwMCArIGJ6MF07IHUgPSByeDAgKiBxWzBdICsgcnkwICogcVsxXSArIHJ6MCAqIHFbMl07Ci0gICAgcSA9IGczW2IxMCArIGJ6MF07IHYgPSByeDEgKiBxWzBdICsgcnkwICogcVsxXSArIHJ6MCAqIHFbMl07Ci0gICAgYSA9IGxlcnBmKHUsIHYsIHQpOwotICAgIAotICAgIHEgPSBnM1tiMDEgKyBiejBdOyB1ID0gcngwICogcVswXSArIHJ5MSAqIHFbMV0gKyByejAgKiBxWzJdOwotICAgIHEgPSBnM1tiMTEgKyBiejBdOyB2ID0gcngxICogcVswXSArIHJ5MSAqIHFbMV0gKyByejAgKiBxWzJdOwotICAgIGIgPSBsZXJwZih1LCB2LCB0KTsKLSAgICAKLSAgICBjID0gbGVycGYoYSwgYiwgc3kpOwotICAgIAotICAgIHEgPSBnM1tiMDAgKyBiejFdOyB1ID0gcngwICogcVswXSArIHJ5MCAqIHFbMV0gKyByejEgKiBxWzJdOwotICAgIHEgPSBnM1tiMTAgKyBiejFdOyB2ID0gcngxICogcVswXSArIHJ5MCAqIHFbMV0gKyByejEgKiBxWzJdOwotICAgIGEgPSBsZXJwZih1LCB2LCB0KTsKLSAgICAKLSAgICBxID0gZzNbYjAxICsgYnoxXTsgdSA9IHJ4MCAqIHFbMF0gKyByeTEgKiBxWzFdICsgcnoxICogcVsyXTsKLSAgICBxID0gZzNbYjExICsgYnoxXTsgdiA9IHJ4MSAqIHFbMF0gKyByeTEgKiBxWzFdICsgcnoxICogcVsyXTsKLSAgICBiID0gbGVycGYodSwgdiwgdCk7Ci0gICAgCi0gICAgZCA9IGxlcnBmKGEsIGIsIHN5KTsKLSAgICAKLSAgICByZXR1cm4gMS41ZipsZXJwZihjLCBkLCBzeik7Ci19Ci0KLWZsb2F0IFNDX3R1cmJ1bGVuY2VmMihmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCBvY3RhdmVzKQotewotICAgIHNyYW5kKHRpbWUoTlVMTCkpOwotICAgIGZsb2F0IHQgPSAwLjBmOwotICAgIAotICAgIGZvciAoZmxvYXQgZiA9IDEuMGY7IGYgPD0gb2N0YXZlczsgZiAqPSAyKQotICAgICAgICB0ICs9IGZhYnMoU0Nfbm9pc2VmMihmICogeCwgZiAqIHkpKSAvIGY7Ci0gICAgcmV0dXJuIHQ7Ci19Ci0KLWZsb2F0IFNDX3R1cmJ1bGVuY2VmMyhmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6LCBmbG9hdCBvY3RhdmVzKQotewotICAgIHNyYW5kKHRpbWUoTlVMTCkpOwotICAgIGZsb2F0IHQgPSAwLjBmOwotICAgIAotICAgIGZvciAoZmxvYXQgZiA9IDEuMGY7IGYgPD0gb2N0YXZlczsgZiAqPSAyKQotICAgICAgICB0ICs9IGZhYnMoU0Nfbm9pc2VmMyhmICogeCwgZiAqIHksIGYgKiB6KSkgLyBmOwotICAgIHJldHVybiB0OwotfQotCi19Ci19CmRpZmYgLS1naXQgYS9saWJzL3JzL3JzTm9pc2UuaCBiL2xpYnMvcnMvcnNOb2lzZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDQwNzUxLi4wMDAwMDAwCi0tLSBhL2xpYnMvcnMvcnNOb2lzZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9SU19OT0lTRV9ICi0jZGVmaW5lIEFORFJPSURfUlNfTk9JU0VfSAotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSByZW5kZXJzY3JpcHQgewotCi12b2lkIFNDX25vcm1hbGl6ZWYyKGZsb2F0IHZbXSk7Ci12b2lkIFNDX25vcm1hbGl6ZWYzKGZsb2F0IHZbXSk7Ci1mbG9hdCBTQ19ub2lzZWYoZmxvYXQgeCk7Ci1mbG9hdCBTQ19ub2lzZWYyKGZsb2F0IHgsIGZsb2F0IHkpOwotZmxvYXQgU0Nfbm9pc2VmMyhmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KTsKLWZsb2F0IFNDX3R1cmJ1bGVuY2VmMihmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCBvY3RhdmVzKTsKLWZsb2F0IFNDX3R1cmJ1bGVuY2VmMyhmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6LCBmbG9hdCBvY3RhdmVzKTsKLQotfQotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNPYmplY3RCYXNlLmNwcCBiL2xpYnMvcnMvcnNPYmplY3RCYXNlLmNwcAppbmRleCA2Nzc0MTNlLi40OGYxZmVlIDEwMDY0NAotLS0gYS9saWJzL3JzL3JzT2JqZWN0QmFzZS5jcHAKKysrIGIvbGlicy9ycy9yc09iamVjdEJhc2UuY3BwCkBAIC0xNSw3ICsxNSwxMiBAQAogICovCiAKICNpbmNsdWRlICJyc09iamVjdEJhc2UuaCIKKworI2lmbmRlZiBBTkRST0lEX1JTX0JVSUxEX0ZPUl9IT1NUCiAjaW5jbHVkZSAicnNDb250ZXh0LmgiCisjZWxzZQorI2luY2x1ZGUgInJzQ29udGV4dEhvc3RTdHViLmgiCisjZW5kaWYKIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6cmVuZGVyc2NyaXB0OwpAQCAtMjQsNyArMjksNiBAQAogewogICAgIG1Vc2VyUmVmQ291bnQgPSAwOwogICAgIG1TeXNSZWZDb3VudCA9IDA7Ci0gICAgbU5hbWUgPSBOVUxMOwogICAgIG1SU0MgPSBOVUxMOwogICAgIG1OZXh0ID0gTlVMTDsKICAgICBtUHJldiA9IE5VTEw7CkBAIC0zOSwxNCArNDMsMTMgQEAKICAgICByc0Fzc2VydCghbVVzZXJSZWZDb3VudCk7CiAgICAgcnNBc3NlcnQoIW1TeXNSZWZDb3VudCk7CiAgICAgcmVtb3ZlKCk7Ci0gICAgZGVsZXRlW10gbU5hbWU7CiB9CiAKIHZvaWQgT2JqZWN0QmFzZTo6ZHVtcExPR1YoY29uc3QgY2hhciAqb3ApIGNvbnN0CiB7Ci0gICAgaWYgKG1OYW1lKSB7CisgICAgaWYgKG1OYW1lLnNpemUoKSkgewogICAgICAgICBMT0dWKCIlcyBSU29iaiAlcCwgbmFtZSAlcywgcmVmcyAlaSwlaSAgZnJvbSAlcywlaSBsaW5rcyAlcCwlcCwlcCIsCi0gICAgICAgICAgICAgb3AsIHRoaXMsIG1OYW1lLCBtVXNlclJlZkNvdW50LCBtU3lzUmVmQ291bnQsIG1BbGxvY0ZpbGUsIG1BbGxvY0xpbmUsIG1OZXh0LCBtUHJldiwgbVJTQyk7CisgICAgICAgICAgICAgb3AsIHRoaXMsIG1OYW1lLnN0cmluZygpLCBtVXNlclJlZkNvdW50LCBtU3lzUmVmQ291bnQsIG1BbGxvY0ZpbGUsIG1BbGxvY0xpbmUsIG1OZXh0LCBtUHJldiwgbVJTQyk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgTE9HVigiJXMgUlNvYmogJXAsIG5vLW5hbWUsIHJlZnMgJWksJWkgIGZyb20gJXMsJWkgbGlua3MgJXAsJXAsJXAiLAogICAgICAgICAgICAgIG9wLCB0aGlzLCBtVXNlclJlZkNvdW50LCBtU3lzUmVmQ291bnQsIG1BbGxvY0ZpbGUsIG1BbGxvY0xpbmUsIG1OZXh0LCBtUHJldiwgbVJTQyk7CkBAIC0xMTMsMTggKzExNiwxMiBAQAogCiB2b2lkIE9iamVjdEJhc2U6OnNldE5hbWUoY29uc3QgY2hhciAqbmFtZSkKIHsKLSAgICBzZXROYW1lKG5hbWUsIHN0cmxlbihuYW1lKSk7CisgICAgbU5hbWUuc2V0VG8obmFtZSk7CiB9CiAKIHZvaWQgT2JqZWN0QmFzZTo6c2V0TmFtZShjb25zdCBjaGFyICpuYW1lLCB1aW50MzJfdCBsZW4pCiB7Ci0gICAgZGVsZXRlIG1OYW1lOwotICAgIG1OYW1lID0gTlVMTDsKLSAgICBpZiAobmFtZSkgewotICAgICAgICBtTmFtZSA9IG5ldyBjaGFyW2xlbiArIDFdOwotICAgICAgICBtZW1jcHkobU5hbWUsIG5hbWUsIGxlbik7Ci0gICAgICAgIG1OYW1lW2xlbl0gPSAwOwotICAgIH0KKyAgICBtTmFtZS5zZXRUbyhuYW1lLCBsZW4pOwogfQogCiB2b2lkIE9iamVjdEJhc2U6OmFkZCgpIGNvbnN0CmRpZmYgLS1naXQgYS9saWJzL3JzL3JzT2JqZWN0QmFzZS5oIGIvbGlicy9ycy9yc09iamVjdEJhc2UuaAppbmRleCBiYjAzYjg3Li5hZDk1YjgxIDEwMDY0NAotLS0gYS9saWJzL3JzL3JzT2JqZWN0QmFzZS5oCisrKyBiL2xpYnMvcnMvcnNPYmplY3RCYXNlLmgKQEAgLTI0LDYgKzI0LDcgQEAKIG5hbWVzcGFjZSByZW5kZXJzY3JpcHQgewogCiBjbGFzcyBDb250ZXh0OworY2xhc3MgT1N0cmVhbTsKIAogLy8gQW4gZWxlbWVudCBpcyBhIGdyb3VwIG9mIENvbXBvbmVudHMgdGhhdCBvY2N1cGllcyBvbmUgY2VsbCBpbiBhIHN0cnVjdHVyZS4KIGNsYXNzIE9iamVjdEJhc2UKQEAgLTQwLDcgKzQxLDcgQEAKICAgICBib29sIHplcm9Vc2VyUmVmKCkgY29uc3Q7CiAKICAgICBjb25zdCBjaGFyICogZ2V0TmFtZSgpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIG1OYW1lOworICAgICAgICByZXR1cm4gbU5hbWUuc3RyaW5nKCk7CiAgICAgfQogICAgIHZvaWQgc2V0TmFtZShjb25zdCBjaGFyICopOwogICAgIHZvaWQgc2V0TmFtZShjb25zdCBjaGFyICosIHVpbnQzMl90IGxlbik7CkBAIC01Miw2ICs1Myw4IEBACiAgICAgc3RhdGljIHZvaWQgZHVtcEFsbChDb250ZXh0ICpyc2MpOwogCiAgICAgdmlydHVhbCB2b2lkIGR1bXBMT0dWKGNvbnN0IGNoYXIgKnByZWZpeCkgY29uc3Q7CisgICAgdmlydHVhbCB2b2lkIHNlcmlhbGl6ZShPU3RyZWFtICpzdHJlYW0pIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIFJzQTNEQ2xhc3NJRCBnZXRDbGFzc0lkKCkgY29uc3QgPSAwOwogCiBwcm90ZWN0ZWQ6CiAgICAgY29uc3QgY2hhciAqbUFsbG9jRmlsZTsKQEAgLTY0LDcgKzY3LDcgQEAKIAogICAgIGJvb2wgY2hlY2tEZWxldGUoKSBjb25zdDsKIAotICAgIGNoYXIgKiBtTmFtZTsKKyAgICBTdHJpbmc4IG1OYW1lOwogICAgIG11dGFibGUgaW50MzJfdCBtU3lzUmVmQ291bnQ7CiAgICAgbXV0YWJsZSBpbnQzMl90IG1Vc2VyUmVmQ291bnQ7CiAKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNQcm9ncmFtLmNwcCBiL2xpYnMvcnMvcnNQcm9ncmFtLmNwcAppbmRleCA3MGUyODY4Li5jNGY4YjJlIDEwMDY0NAotLS0gYS9saWJzL3JzL3JzUHJvZ3JhbS5jcHAKKysrIGIvbGlicy9ycy9yc1Byb2dyYW0uY3BwCkBAIC0xNCwxMSArMTQsMTcgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKyNpZm5kZWYgQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAogI2luY2x1ZGUgInJzQ29udGV4dC5oIgotI2luY2x1ZGUgInJzUHJvZ3JhbS5oIgotCiAjaW5jbHVkZSA8R0xFUzIvZ2wyLmg+CiAjaW5jbHVkZSA8R0xFUzIvZ2wyZXh0Lmg+CisjZWxzZQorI2luY2x1ZGUgInJzQ29udGV4dEhvc3RTdHViLmgiCisjaW5jbHVkZSA8T3BlbkdML2dsLmg+CisjaW5jbHVkZSA8T3BlbkdML2dsZXh0Lmg+CisjZW5kaWYgLy9BTkRST0lEX1JTX0JVSUxEX0ZPUl9IT1NUCisKKyNpbmNsdWRlICJyc1Byb2dyYW0uaCIKIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6cmVuZGVyc2NyaXB0OwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc1Byb2dyYW1GcmFnbWVudC5jcHAgYi9saWJzL3JzL3JzUHJvZ3JhbUZyYWdtZW50LmNwcAppbmRleCBjMTdiOTRjLi5hMDQ1MDQzIDEwMDY0NAotLS0gYS9saWJzL3JzL3JzUHJvZ3JhbUZyYWdtZW50LmNwcAorKysgYi9saWJzL3JzL3JzUHJvZ3JhbUZyYWdtZW50LmNwcApAQCAtMTQsMTMgKzE0LDE5IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisjaWZuZGVmIEFORFJPSURfUlNfQlVJTERfRk9SX0hPU1QKICNpbmNsdWRlICJyc0NvbnRleHQuaCIKLSNpbmNsdWRlICJyc1Byb2dyYW1GcmFnbWVudC5oIgotCiAjaW5jbHVkZSA8R0xFUy9nbC5oPgogI2luY2x1ZGUgPEdMRVMvZ2xleHQuaD4KICNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KICNpbmNsdWRlIDxHTEVTMi9nbDJleHQuaD4KKyNlbHNlCisjaW5jbHVkZSAicnNDb250ZXh0SG9zdFN0dWIuaCIKKyNpbmNsdWRlIDxPcGVuR0wvZ2wuaD4KKyNpbmNsdWRlIDxPcGVuR0wvZ2xleHQuaD4KKyNlbmRpZiAvL0FORFJPSURfUlNfQlVJTERfRk9SX0hPU1QKKworI2luY2x1ZGUgInJzUHJvZ3JhbUZyYWdtZW50LmgiCiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OnJlbmRlcnNjcmlwdDsKQEAgLTMyLDEzICszOCwyMSBAQAogewogICAgIG1BbGxvY0ZpbGUgPSBfX0ZJTEVfXzsKICAgICBtQWxsb2NMaW5lID0gX19MSU5FX187Ci0gICAgcnNBc3NlcnQocGFyYW1MZW5ndGggPSA1KTsKKyAgICByc0Fzc2VydChwYXJhbUxlbmd0aCA9PSA2KTsKKworICAgIG1Db25zdGFudENvbG9yWzBdID0gMS5mOworICAgIG1Db25zdGFudENvbG9yWzFdID0gMS5mOworICAgIG1Db25zdGFudENvbG9yWzJdID0gMS5mOworICAgIG1Db25zdGFudENvbG9yWzNdID0gMS5mOwogCiAgICAgbUVudk1vZGVzWzBdID0gKFJzVGV4RW52TW9kZSlwYXJhbXNbMF07CiAgICAgbVRleHR1cmVGb3JtYXRzWzBdID0gcGFyYW1zWzFdOwogICAgIG1FbnZNb2Rlc1sxXSA9IChSc1RleEVudk1vZGUpcGFyYW1zWzJdOwogICAgIG1UZXh0dXJlRm9ybWF0c1sxXSA9IHBhcmFtc1szXTsKICAgICBtUG9pbnRTcHJpdGVFbmFibGUgPSBwYXJhbXNbNF0gIT0gMDsKKyAgICBtVmFyeWluZ0NvbG9yID0gZmFsc2U7CisgICAgaWYgKHBhcmFtTGVuZ3RoID4gNSkKKyAgICAgICAgbVZhcnlpbmdDb2xvciA9IHBhcmFtc1s1XSAhPSAwOwogCiAgICAgbVRleHR1cmVFbmFibGVNYXNrID0gMDsKICAgICBpZiAobUVudk1vZGVzWzBdKSB7CkBAIC00Nyw3ICs2MSwxNyBAQAogICAgIGlmIChtRW52TW9kZXNbMV0pIHsKICAgICAgICAgbVRleHR1cmVFbmFibGVNYXNrIHw9IDI7CiAgICAgfQotICAgIGluaXQocnNjKTsKKworICAgIG1Vbmlmb3JtQ291bnQgPSAwOworICAgIG1Vbmlmb3JtTmFtZXNbbVVuaWZvcm1Db3VudCsrXS5zZXRUbygidW5pX1RleDAiKTsKKyAgICBtVW5pZm9ybU5hbWVzW21Vbmlmb3JtQ291bnQrK10uc2V0VG8oInVuaV9UZXgxIik7CisKKyAgICBtQ29uc3RhbnRDb2xvclVuaWZvcm1JbmRleCA9IC0xOworICAgIC8vaWYgKCFtVmFyeWluZ0NvbG9yKSB7CisgICAgICAgIG1Db25zdGFudENvbG9yVW5pZm9ybUluZGV4ID0gbVVuaWZvcm1Db3VudDsKKyAgICAgICAgbVVuaWZvcm1OYW1lc1ttVW5pZm9ybUNvdW50KytdLnNldFRvKCJ1bmlfQ29sb3IiKTsKKyAgICAvL30KKyAgICBjcmVhdGVTaGFkZXIoKTsKIH0KIAogUHJvZ3JhbUZyYWdtZW50OjpQcm9ncmFtRnJhZ21lbnQoQ29udGV4dCAqcnNjLCBjb25zdCBjaGFyICogc2hhZGVyVGV4dCwKQEAgLTU4LDcgKzgyLDE5IEBACiAgICAgbUFsbG9jRmlsZSA9IF9fRklMRV9fOwogICAgIG1BbGxvY0xpbmUgPSBfX0xJTkVfXzsKIAotICAgIGluaXQocnNjKTsKKyAgICBtQ29uc3RhbnRDb2xvclswXSA9IDEuZjsKKyAgICBtQ29uc3RhbnRDb2xvclsxXSA9IDEuZjsKKyAgICBtQ29uc3RhbnRDb2xvclsyXSA9IDEuZjsKKyAgICBtQ29uc3RhbnRDb2xvclszXSA9IDEuZjsKKworICAgIExPR0UoIkN1c3RvbSBGUCIpOworCisgICAgbVVuaWZvcm1Db3VudCA9IDI7CisgICAgbVVuaWZvcm1OYW1lc1swXS5zZXRUbygidW5pX1RleDAiKTsKKyAgICBtVW5pZm9ybU5hbWVzWzFdLnNldFRvKCJ1bmlfVGV4MSIpOworCisgICAgY3JlYXRlU2hhZGVyKCk7CisKICAgICBtVGV4dHVyZUVuYWJsZU1hc2sgPSAoMSA8PCBtVGV4dHVyZUNvdW50KSAtMTsKIH0KIApAQCAtNjcsNzYgKzEwMywxNyBAQAogewogfQogCit2b2lkIFByb2dyYW1GcmFnbWVudDo6c2V0Q29uc3RhbnRDb2xvcihmbG9hdCByLCBmbG9hdCBnLCBmbG9hdCBiLCBmbG9hdCBhKQoreworICAgIG1Db25zdGFudENvbG9yWzBdID0gcjsKKyAgICBtQ29uc3RhbnRDb2xvclsxXSA9IGc7CisgICAgbUNvbnN0YW50Q29sb3JbMl0gPSBiOworICAgIG1Db25zdGFudENvbG9yWzNdID0gYTsKKyAgICBtRGlydHkgPSB0cnVlOworfQorCiB2b2lkIFByb2dyYW1GcmFnbWVudDo6c2V0dXBHTChjb25zdCBDb250ZXh0ICpyc2MsIFByb2dyYW1GcmFnbWVudFN0YXRlICpzdGF0ZSkKIHsKLSAgICBpZiAoKHN0YXRlLT5tTGFzdC5nZXQoKSA9PSB0aGlzKSAmJiAhbURpcnR5KSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgc3RhdGUtPm1MYXN0LnNldCh0aGlzKTsKLQotICAgIGZvciAodWludDMyX3QgY3Q9MDsgY3QgPCBNQVhfVEVYVFVSRTsgY3QrKykgewotICAgICAgICBnbEFjdGl2ZVRleHR1cmUoR0xfVEVYVFVSRTAgKyBjdCk7Ci0gICAgICAgIGlmICghKG1UZXh0dXJlRW5hYmxlTWFzayAmICgxIDw8IGN0KSkgfHwgIW1UZXh0dXJlc1tjdF0uZ2V0KCkpIHsKLSAgICAgICAgICAgIGdsRGlzYWJsZShHTF9URVhUVVJFXzJEKTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgZ2xFbmFibGUoR0xfVEVYVFVSRV8yRCk7Ci0gICAgICAgIGlmIChyc2MtPmNoZWNrVmVyc2lvbjFfMSgpKSB7Ci0gICAgICAgICAgICBpZiAobVBvaW50U3ByaXRlRW5hYmxlKSB7Ci0gICAgICAgICAgICAgICAgZ2xFbmFibGUoR0xfUE9JTlRfU1BSSVRFX09FUyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGdsRGlzYWJsZShHTF9QT0lOVF9TUFJJVEVfT0VTKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGdsVGV4RW52aShHTF9QT0lOVF9TUFJJVEVfT0VTLCBHTF9DT09SRF9SRVBMQUNFX09FUywgbVBvaW50U3ByaXRlRW5hYmxlKTsKLSAgICAgICAgfQotICAgICAgICBtVGV4dHVyZXNbY3RdLT51cGxvYWRDaGVjayhyc2MpOwotICAgICAgICBnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIG1UZXh0dXJlc1tjdF0tPmdldFRleHR1cmVJRCgpKTsKLQotICAgICAgICBzd2l0Y2gobUVudk1vZGVzW2N0XSkgewotICAgICAgICBjYXNlIFJTX1RFWF9FTlZfTU9ERV9OT05FOgotICAgICAgICAgICAgcnNBc3NlcnQoMCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBSU19URVhfRU5WX01PREVfUkVQTEFDRToKLSAgICAgICAgICAgIGdsVGV4RW52ZihHTF9URVhUVVJFX0VOViwgR0xfVEVYVFVSRV9FTlZfTU9ERSwgR0xfUkVQTEFDRSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBSU19URVhfRU5WX01PREVfTU9EVUxBVEU6Ci0gICAgICAgICAgICBnbFRleEVudmYoR0xfVEVYVFVSRV9FTlYsIEdMX1RFWFRVUkVfRU5WX01PREUsIEdMX01PRFVMQVRFKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFJTX1RFWF9FTlZfTU9ERV9ERUNBTDoKLSAgICAgICAgICAgIGdsVGV4RW52ZihHTF9URVhUVVJFX0VOViwgR0xfVEVYVFVSRV9FTlZfTU9ERSwgR0xfREVDQUwpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobVNhbXBsZXJzW2N0XS5nZXQoKSkgewotICAgICAgICAgICAgbVNhbXBsZXJzW2N0XS0+c2V0dXBHTChyc2MsIG1UZXh0dXJlc1tjdF0tPmdldFR5cGUoKS0+Z2V0SXNOcDIoKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NSU5fRklMVEVSLCBHTF9ORUFSRVNUKTsKLSAgICAgICAgICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01BR19GSUxURVIsIEdMX05FQVJFU1QpOwotICAgICAgICAgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9TLCBHTF9SRVBFQVQpOwotICAgICAgICAgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9ULCBHTF9SRVBFQVQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gR3Jvc3MgaGFjay4KLSAgICAgICAgaWYgKGN0ID09IDIpIHsKLSAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgR0xfVEVYVFVSRV9FTlZfTU9ERSwgR0xfQ09NQklORSk7Ci0KLSAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgR0xfQ09NQklORV9SR0IsIEdMX0FERCk7Ci0gICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIEdMX1NSQzBfUkdCLCBHTF9QUkVWSU9VUyk7Ci0gICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIEdMX1NSQzFfUkdCLCBHTF9URVhUVVJFKTsKLSAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgR0xfT1BFUkFORDBfUkdCLCBHTF9TUkNfQ09MT1IpOwotICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBHTF9PUEVSQU5EMV9SR0IsIEdMX1NSQ19DT0xPUik7Ci0KLSAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgR0xfQ09NQklORV9BTFBIQSwgR0xfQUREKTsKLSAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgR0xfU1JDMF9BTFBIQSwgR0xfUFJFVklPVVMpOwotICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBHTF9TUkMxX0FMUEhBLCBHTF9URVhUVVJFKTsKLSAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgR0xfT1BFUkFORDBfQUxQSEEsIEdMX1NSQ19BTFBIQSk7Ci0gICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIEdMX09QRVJBTkQxX0FMUEhBLCBHTF9TUkNfQUxQSEEpOwotICAgICAgICB9Ci0gICAgfQotICAgIGdsQWN0aXZlVGV4dHVyZShHTF9URVhUVVJFMCk7Ci0gICAgbURpcnR5ID0gZmFsc2U7Ci0gICAgcnNjLT5jaGVja0Vycm9yKCJQcm9ncmFtRnJhZ21lbnQ6OnNldHVwR0wiKTsKIH0KIAogdm9pZCBQcm9ncmFtRnJhZ21lbnQ6OnNldHVwR0wyKGNvbnN0IENvbnRleHQgKnJzYywgUHJvZ3JhbUZyYWdtZW50U3RhdGUgKnN0YXRlLCBTaGFkZXJDYWNoZSAqc2MpCkBAIC0xNDQsMTEgKzEyMSwxOSBAQAogCiAgICAgLy9MT0dFKCJzZ2wyIGZyYWcxICV4IiwgZ2xHZXRFcnJvcigpKTsKICAgICBpZiAoKHN0YXRlLT5tTGFzdC5nZXQoKSA9PSB0aGlzKSAmJiAhbURpcnR5KSB7Ci0gICAgICAgIC8vcmV0dXJuOworICAgICAgICByZXR1cm47CiAgICAgfQogICAgIHN0YXRlLT5tTGFzdC5zZXQodGhpcyk7CiAKICAgICByc2MtPmNoZWNrRXJyb3IoIlByb2dyYW1GcmFnbWVudDo6c2V0dXBHTDIgc3RhcnQiKTsKKworICAgIGlmICghbVZhcnlpbmdDb2xvciAmJgorICAgICAgICAoc2MtPmZyYWdVbmlmb3JtU2xvdChtQ29uc3RhbnRDb2xvclVuaWZvcm1JbmRleCkgPj0gMCkpIHsKKyAgICAgICAgLy9MT0dFKCJtQ29uc3RhbnRDb2xvclVuaWZvcm1JbmRleCAlaSAlaSIsIG1Db25zdGFudENvbG9yVW5pZm9ybUluZGV4LCBzYy0+ZnJhZ1VuaWZvcm1TbG90KG1Db25zdGFudENvbG9yVW5pZm9ybUluZGV4KSk7CisgICAgICAgIGdsVW5pZm9ybTRmdihzYy0+ZnJhZ1VuaWZvcm1TbG90KG1Db25zdGFudENvbG9yVW5pZm9ybUluZGV4KSwgMSwgbUNvbnN0YW50Q29sb3IpOworICAgICAgICByc2MtPmNoZWNrRXJyb3IoIlByb2dyYW1GcmFnbWVudDo6Y29sb3Igc2V0dXAiKTsKKyAgICB9CisKICAgICBmb3IgKHVpbnQzMl90IGN0PTA7IGN0IDwgTUFYX1RFWFRVUkU7IGN0KyspIHsKICAgICAgICAgZ2xBY3RpdmVUZXh0dXJlKEdMX1RFWFRVUkUwICsgY3QpOwogICAgICAgICBpZiAoIShtVGV4dHVyZUVuYWJsZU1hc2sgJiAoMSA8PCBjdCkpIHx8ICFtVGV4dHVyZXNbY3RdLmdldCgpKSB7CkBAIC0xODQsOCArMTY5LDkgQEAKIHZvaWQgUHJvZ3JhbUZyYWdtZW50OjpjcmVhdGVTaGFkZXIoKQogewogICAgIG1TaGFkZXIuc2V0VG8oInByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuIik7Ci0gICAgbVNoYWRlci5hcHBlbmQoInZhcnlpbmcgdmVjNCB2YXJDb2xvcjtcbiIpOworICAgIG1TaGFkZXIuYXBwZW5kKCJ2YXJ5aW5nIGxvd3AgdmVjNCB2YXJDb2xvcjtcbiIpOwogICAgIG1TaGFkZXIuYXBwZW5kKCJ2YXJ5aW5nIHZlYzQgdmFyVGV4MDtcbiIpOworICAgIG1TaGFkZXIuYXBwZW5kKCJ1bmlmb3JtIHZlYzQgdW5pX0NvbG9yO1xuIik7CiAKICAgICBpZiAobVVzZXJTaGFkZXIubGVuZ3RoKCkgPiAxKSB7CiAgICAgICAgIGZvciAodWludDMyX3QgY3Q9MDsgY3QgPCBtVGV4dHVyZUNvdW50OyBjdCsrKSB7CkBAIC0yMTIsNyArMTk4LDExIEBACiAKIAogICAgICAgICBtU2hhZGVyLmFwcGVuZCgidm9pZCBtYWluKCkge1xuIik7Ci0gICAgICAgIG1TaGFkZXIuYXBwZW5kKCIgIHZlYzQgY29sID0gdmFyQ29sb3I7XG4iKTsKKyAgICAgICAgaWYgKG1WYXJ5aW5nQ29sb3IpIHsKKyAgICAgICAgICAgIG1TaGFkZXIuYXBwZW5kKCIgIGxvd3AgdmVjNCBjb2wgPSB2YXJDb2xvcjtcbiIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVNoYWRlci5hcHBlbmQoIiAgbG93cCB2ZWM0IGNvbCA9IHVuaV9Db2xvcjtcbiIpOworICAgICAgICB9CiAKICAgICAgICAgaWYgKG1UZXh0dXJlRW5hYmxlTWFzaykgewogICAgICAgICAgICAgaWYgKG1Qb2ludFNwcml0ZUVuYWJsZSkgewpAQCAtMjgyLDExICsyNzIsMTYgQEAKIAogdm9pZCBQcm9ncmFtRnJhZ21lbnQ6OmluaXQoQ29udGV4dCAqcnNjKQogewotICAgIG1Vbmlmb3JtQ291bnQgPSAyOwotICAgIG1Vbmlmb3JtTmFtZXNbMF0uc2V0VG8oInVuaV9UZXgwIik7Ci0gICAgbVVuaWZvcm1OYW1lc1sxXS5zZXRUbygidW5pX1RleDEiKTsKK30KIAotICAgIGNyZWF0ZVNoYWRlcigpOwordm9pZCBQcm9ncmFtRnJhZ21lbnQ6OnNlcmlhbGl6ZShPU3RyZWFtICpzdHJlYW0pIGNvbnN0Cit7CisKK30KKworUHJvZ3JhbUZyYWdtZW50ICpQcm9ncmFtRnJhZ21lbnQ6OmNyZWF0ZUZyb21TdHJlYW0oQ29udGV4dCAqcnNjLCBJU3RyZWFtICpzdHJlYW0pCit7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIFByb2dyYW1GcmFnbWVudFN0YXRlOjpQcm9ncmFtRnJhZ21lbnRTdGF0ZSgpCkBAIC0zMDAsMTQgKzI5NSwxNCBAQAogCiB9CiAKLXZvaWQgUHJvZ3JhbUZyYWdtZW50U3RhdGU6OmluaXQoQ29udGV4dCAqcnNjLCBpbnQzMl90IHcsIGludDMyX3QgaCkKK3ZvaWQgUHJvZ3JhbUZyYWdtZW50U3RhdGU6OmluaXQoQ29udGV4dCAqcnNjKQogewotICAgIHVpbnQzMl90IHRtcFs1XSA9IHsKKyAgICB1aW50MzJfdCB0bXBbXSA9IHsKICAgICAgICAgUlNfVEVYX0VOVl9NT0RFX05PTkUsIDAsCiAgICAgICAgIFJTX1RFWF9FTlZfTU9ERV9OT05FLCAwLAotICAgICAgICAwCisgICAgICAgIDAsIDAKICAgICB9OwotICAgIFByb2dyYW1GcmFnbWVudCAqcGYgPSBuZXcgUHJvZ3JhbUZyYWdtZW50KHJzYywgdG1wLCA1KTsKKyAgICBQcm9ncmFtRnJhZ21lbnQgKnBmID0gbmV3IFByb2dyYW1GcmFnbWVudChyc2MsIHRtcCwgNik7CiAgICAgbURlZmF1bHQuc2V0KHBmKTsKICAgICBwZi0+aW5pdChyc2MpOwogfQpAQCAtMzI4LDYgKzMyMyw3IEBACiB7CiAgICAgUHJvZ3JhbUZyYWdtZW50ICpwZiA9IG5ldyBQcm9ncmFtRnJhZ21lbnQocnNjLCBwYXJhbXMsIHBhcmFtTGVuZ3RoKTsKICAgICBwZi0+aW5jVXNlclJlZigpOworICAgIC8vTE9HRSgicnNpX1Byb2dyYW1GcmFnbWVudENyZWF0ZSAlcCIsIHBmKTsKICAgICByZXR1cm4gcGY7CiB9CiAKQEAgLTMzNyw2ICszMzMsNyBAQAogewogICAgIFByb2dyYW1GcmFnbWVudCAqcGYgPSBuZXcgUHJvZ3JhbUZyYWdtZW50KHJzYywgc2hhZGVyVGV4dCwgc2hhZGVyTGVuZ3RoLCBwYXJhbXMsIHBhcmFtTGVuZ3RoKTsKICAgICBwZi0+aW5jVXNlclJlZigpOworICAgIC8vTE9HRSgicnNpX1Byb2dyYW1GcmFnbWVudENyZWF0ZTIgJXAiLCBwZik7CiAgICAgcmV0dXJuIHBmOwogfQogCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzUHJvZ3JhbUZyYWdtZW50LmggYi9saWJzL3JzL3JzUHJvZ3JhbUZyYWdtZW50LmgKaW5kZXggOWZhNTY1ZC4uN2MxNTk4ZSAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc1Byb2dyYW1GcmFnbWVudC5oCisrKyBiL2xpYnMvcnMvcnNQcm9ncmFtRnJhZ21lbnQuaApAQCAtNDAsNiArNDAsMTEgQEAKICAgICB2aXJ0dWFsIHZvaWQgY3JlYXRlU2hhZGVyKCk7CiAgICAgdmlydHVhbCB2b2lkIGxvYWRTaGFkZXIoQ29udGV4dCAqcnNjKTsKICAgICB2aXJ0dWFsIHZvaWQgaW5pdChDb250ZXh0ICpyc2MpOworICAgIHZpcnR1YWwgdm9pZCBzZXJpYWxpemUoT1N0cmVhbSAqc3RyZWFtKSBjb25zdDsKKyAgICB2aXJ0dWFsIFJzQTNEQ2xhc3NJRCBnZXRDbGFzc0lkKCkgY29uc3QgeyByZXR1cm4gUlNfQTNEX0NMQVNTX0lEX1BST0dSQU1fRlJBR01FTlQ7IH0KKyAgICBzdGF0aWMgUHJvZ3JhbUZyYWdtZW50ICpjcmVhdGVGcm9tU3RyZWFtKENvbnRleHQgKnJzYywgSVN0cmVhbSAqc3RyZWFtKTsKKworICAgIHZvaWQgc2V0Q29uc3RhbnRDb2xvcihmbG9hdCwgZmxvYXQsIGZsb2F0LCBmbG9hdCk7CiAKIHByb3RlY3RlZDoKICAgICAvLyBIYWNrcyB0byBjcmVhdGUgYSBwcm9ncmFtIGZvciBub3cKQEAgLTQ4LDYgKzUzLDEwIEBACiAgICAgUnNUZXhFbnZNb2RlIG1FbnZNb2Rlc1tNQVhfVEVYVFVSRV07CiAgICAgdWludDMyX3QgbVRleHR1cmVFbmFibGVNYXNrOwogICAgIGJvb2wgbVBvaW50U3ByaXRlRW5hYmxlOworICAgIGJvb2wgbVZhcnlpbmdDb2xvcjsKKworICAgIGZsb2F0IG1Db25zdGFudENvbG9yWzRdOworICAgIGludDMyX3QgbUNvbnN0YW50Q29sb3JVbmlmb3JtSW5kZXg7CiB9OwogCiBjbGFzcyBQcm9ncmFtRnJhZ21lbnRTdGF0ZQpAQCAtNTcsNyArNjYsNyBAQAogICAgIH5Qcm9ncmFtRnJhZ21lbnRTdGF0ZSgpOwogCiAgICAgUHJvZ3JhbUZyYWdtZW50ICptUEY7Ci0gICAgdm9pZCBpbml0KENvbnRleHQgKnJzYywgaW50MzJfdCB3LCBpbnQzMl90IGgpOworICAgIHZvaWQgaW5pdChDb250ZXh0ICpyc2MpOwogICAgIHZvaWQgZGVpbml0KENvbnRleHQgKnJzYyk7CiAKICAgICBPYmplY3RCYXNlUmVmPFR5cGU+IG1UZXh0dXJlVHlwZXNbUHJvZ3JhbUZyYWdtZW50OjpNQVhfVEVYVFVSRV07CmRpZmYgLS1naXQgYS9saWJzL3JzL3JzUHJvZ3JhbUZyYWdtZW50U3RvcmUuY3BwIGIvbGlicy9ycy9yc1Byb2dyYW1GcmFnbWVudFN0b3JlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGEyMTU3Zi4uMDAwMDAwMAotLS0gYS9saWJzL3JzL3JzUHJvZ3JhbUZyYWdtZW50U3RvcmUuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzA4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAicnNDb250ZXh0LmgiCi0jaW5jbHVkZSAicnNQcm9ncmFtRnJhZ21lbnRTdG9yZS5oIgotCi0jaW5jbHVkZSA8R0xFUy9nbC5oPgotI2luY2x1ZGUgPEdMRVMvZ2xleHQuaD4KLQotdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7Ci11c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6cmVuZGVyc2NyaXB0OwotCi0KLVByb2dyYW1GcmFnbWVudFN0b3JlOjpQcm9ncmFtRnJhZ21lbnRTdG9yZShDb250ZXh0ICpyc2MpIDoKLSAgICBQcm9ncmFtKHJzYykKLXsKLSAgICBtQWxsb2NGaWxlID0gX19GSUxFX187Ci0gICAgbUFsbG9jTGluZSA9IF9fTElORV9fOwotICAgIG1EaXRoZXJFbmFibGUgPSB0cnVlOwotICAgIG1CbGVuZEVuYWJsZSA9IGZhbHNlOwotICAgIG1Db2xvclJXcml0ZUVuYWJsZSA9IHRydWU7Ci0gICAgbUNvbG9yR1dyaXRlRW5hYmxlID0gdHJ1ZTsKLSAgICBtQ29sb3JCV3JpdGVFbmFibGUgPSB0cnVlOwotICAgIG1Db2xvckFXcml0ZUVuYWJsZSA9IHRydWU7Ci0gICAgbUJsZW5kU3JjID0gR0xfT05FOwotICAgIG1CbGVuZERzdCA9IEdMX1pFUk87Ci0KLQotICAgIG1EZXB0aFRlc3RFbmFibGUgPSBmYWxzZTsKLSAgICBtRGVwdGhXcml0ZUVuYWJsZSA9IHRydWU7Ci0gICAgbURlcHRoRnVuYyA9IEdMX0xFU1M7Ci0KLQotfQotCi1Qcm9ncmFtRnJhZ21lbnRTdG9yZTo6flByb2dyYW1GcmFnbWVudFN0b3JlKCkKLXsKLX0KLQotdm9pZCBQcm9ncmFtRnJhZ21lbnRTdG9yZTo6c2V0dXBHTChjb25zdCBDb250ZXh0ICpyc2MsIFByb2dyYW1GcmFnbWVudFN0b3JlU3RhdGUgKnN0YXRlKQotewotICAgIGlmIChzdGF0ZS0+bUxhc3QuZ2V0KCkgPT0gdGhpcykgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIHN0YXRlLT5tTGFzdC5zZXQodGhpcyk7Ci0KLSAgICBnbENvbG9yTWFzayhtQ29sb3JSV3JpdGVFbmFibGUsCi0gICAgICAgICAgICAgICAgbUNvbG9yR1dyaXRlRW5hYmxlLAotICAgICAgICAgICAgICAgIG1Db2xvckJXcml0ZUVuYWJsZSwKLSAgICAgICAgICAgICAgICBtQ29sb3JBV3JpdGVFbmFibGUpOwotICAgIGlmIChtQmxlbmRFbmFibGUpIHsKLSAgICAgICAgZ2xFbmFibGUoR0xfQkxFTkQpOwotICAgICAgICBnbEJsZW5kRnVuYyhtQmxlbmRTcmMsIG1CbGVuZERzdCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZ2xEaXNhYmxlKEdMX0JMRU5EKTsKLSAgICB9Ci0KLSAgICAvL0xPR0UoInBmcyAgJWksICVpLCAleCIsIG1EZXB0aFdyaXRlRW5hYmxlLCBtRGVwdGhUZXN0RW5hYmxlLCBtRGVwdGhGdW5jKTsKLQotICAgIGdsRGVwdGhNYXNrKG1EZXB0aFdyaXRlRW5hYmxlKTsKLSAgICBpZihtRGVwdGhUZXN0RW5hYmxlIHx8IG1EZXB0aFdyaXRlRW5hYmxlKSB7Ci0gICAgICAgIGdsRW5hYmxlKEdMX0RFUFRIX1RFU1QpOwotICAgICAgICBnbERlcHRoRnVuYyhtRGVwdGhGdW5jKTsKLSAgICB9IGVsc2UgewotICAgICAgICBnbERpc2FibGUoR0xfREVQVEhfVEVTVCk7Ci0gICAgfQotCi0gICAgaWYgKG1EaXRoZXJFbmFibGUpIHsKLSAgICAgICAgZ2xFbmFibGUoR0xfRElUSEVSKTsKLSAgICB9IGVsc2UgewotICAgICAgICBnbERpc2FibGUoR0xfRElUSEVSKTsKLSAgICB9Ci19Ci0KLXZvaWQgUHJvZ3JhbUZyYWdtZW50U3RvcmU6OnNldHVwR0wyKGNvbnN0IENvbnRleHQgKnJzYywgUHJvZ3JhbUZyYWdtZW50U3RvcmVTdGF0ZSAqc3RhdGUpCi17Ci0gICAgaWYgKHN0YXRlLT5tTGFzdC5nZXQoKSA9PSB0aGlzKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgc3RhdGUtPm1MYXN0LnNldCh0aGlzKTsKLQotICAgIGdsQ29sb3JNYXNrKG1Db2xvclJXcml0ZUVuYWJsZSwKLSAgICAgICAgICAgICAgICBtQ29sb3JHV3JpdGVFbmFibGUsCi0gICAgICAgICAgICAgICAgbUNvbG9yQldyaXRlRW5hYmxlLAotICAgICAgICAgICAgICAgIG1Db2xvckFXcml0ZUVuYWJsZSk7Ci0gICAgaWYgKG1CbGVuZEVuYWJsZSkgewotICAgICAgICBnbEVuYWJsZShHTF9CTEVORCk7Ci0gICAgICAgIGdsQmxlbmRGdW5jKG1CbGVuZFNyYywgbUJsZW5kRHN0KTsKLSAgICB9IGVsc2UgewotICAgICAgICBnbERpc2FibGUoR0xfQkxFTkQpOwotICAgIH0KLQotICAgIC8vTE9HRSgicGZzICAlaSwgJWksICV4IiwgbURlcHRoV3JpdGVFbmFibGUsIG1EZXB0aFRlc3RFbmFibGUsIG1EZXB0aEZ1bmMpOwotCi0gICAgZ2xEZXB0aE1hc2sobURlcHRoV3JpdGVFbmFibGUpOwotICAgIGlmKG1EZXB0aFRlc3RFbmFibGUgfHwgbURlcHRoV3JpdGVFbmFibGUpIHsKLSAgICAgICAgZ2xFbmFibGUoR0xfREVQVEhfVEVTVCk7Ci0gICAgICAgIGdsRGVwdGhGdW5jKG1EZXB0aEZ1bmMpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGdsRGlzYWJsZShHTF9ERVBUSF9URVNUKTsKLSAgICB9Ci0KLSAgICBpZiAobURpdGhlckVuYWJsZSkgewotICAgICAgICBnbEVuYWJsZShHTF9ESVRIRVIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGdsRGlzYWJsZShHTF9ESVRIRVIpOwotICAgIH0KLX0KLQotCi12b2lkIFByb2dyYW1GcmFnbWVudFN0b3JlOjpzZXREaXRoZXJFbmFibGUoYm9vbCBlbmFibGUpCi17Ci0gICAgbURpdGhlckVuYWJsZSA9IGVuYWJsZTsKLX0KLQotdm9pZCBQcm9ncmFtRnJhZ21lbnRTdG9yZTo6c2V0RGVwdGhGdW5jKFJzRGVwdGhGdW5jIGZ1bmMpCi17Ci0gICAgbURlcHRoVGVzdEVuYWJsZSA9IHRydWU7Ci0KLSAgICBzd2l0Y2goZnVuYykgewotICAgIGNhc2UgUlNfREVQVEhfRlVOQ19BTFdBWVM6Ci0gICAgICAgIG1EZXB0aFRlc3RFbmFibGUgPSBmYWxzZTsKLSAgICAgICAgbURlcHRoRnVuYyA9IEdMX0FMV0FZUzsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSU19ERVBUSF9GVU5DX0xFU1M6Ci0gICAgICAgIG1EZXB0aEZ1bmMgPSBHTF9MRVNTOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFJTX0RFUFRIX0ZVTkNfTEVRVUFMOgotICAgICAgICBtRGVwdGhGdW5jID0gR0xfTEVRVUFMOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFJTX0RFUFRIX0ZVTkNfR1JFQVRFUjoKLSAgICAgICAgbURlcHRoRnVuYyA9IEdMX0dSRUFURVI7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUlNfREVQVEhfRlVOQ19HRVFVQUw6Ci0gICAgICAgIG1EZXB0aEZ1bmMgPSBHTF9HRVFVQUw7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUlNfREVQVEhfRlVOQ19FUVVBTDoKLSAgICAgICAgbURlcHRoRnVuYyA9IEdMX0VRVUFMOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFJTX0RFUFRIX0ZVTkNfTk9URVFVQUw6Ci0gICAgICAgIG1EZXB0aEZ1bmMgPSBHTF9OT1RFUVVBTDsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi12b2lkIFByb2dyYW1GcmFnbWVudFN0b3JlOjpzZXREZXB0aE1hc2soYm9vbCBtYXNrKQotewotICAgIG1EZXB0aFdyaXRlRW5hYmxlID0gbWFzazsKLX0KLQotdm9pZCBQcm9ncmFtRnJhZ21lbnRTdG9yZTo6c2V0QmxlbmRGdW5jKFJzQmxlbmRTcmNGdW5jIHNyYywgUnNCbGVuZERzdEZ1bmMgZHN0KQotewotICAgIG1CbGVuZEVuYWJsZSA9IHRydWU7Ci0gICAgaWYgKChzcmMgPT0gUlNfQkxFTkRfU1JDX09ORSkgJiYKLSAgICAgICAgKGRzdCA9PSBSU19CTEVORF9EU1RfWkVSTykpIHsKLSAgICAgICAgbUJsZW5kRW5hYmxlID0gZmFsc2U7Ci0gICAgfQotCi0gICAgc3dpdGNoKHNyYykgewotICAgIGNhc2UgUlNfQkxFTkRfU1JDX1pFUk86Ci0gICAgICAgIG1CbGVuZFNyYyA9IEdMX1pFUk87Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUlNfQkxFTkRfU1JDX09ORToKLSAgICAgICAgbUJsZW5kU3JjID0gR0xfT05FOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFJTX0JMRU5EX1NSQ19EU1RfQ09MT1I6Ci0gICAgICAgIG1CbGVuZFNyYyA9IEdMX0RTVF9DT0xPUjsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSU19CTEVORF9TUkNfT05FX01JTlVTX0RTVF9DT0xPUjoKLSAgICAgICAgbUJsZW5kU3JjID0gR0xfT05FX01JTlVTX0RTVF9DT0xPUjsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSU19CTEVORF9TUkNfU1JDX0FMUEhBOgotICAgICAgICBtQmxlbmRTcmMgPSBHTF9TUkNfQUxQSEE7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUlNfQkxFTkRfU1JDX09ORV9NSU5VU19TUkNfQUxQSEE6Ci0gICAgICAgIG1CbGVuZFNyYyA9IEdMX09ORV9NSU5VU19TUkNfQUxQSEE7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUlNfQkxFTkRfU1JDX0RTVF9BTFBIQToKLSAgICAgICAgbUJsZW5kU3JjID0gR0xfRFNUX0FMUEhBOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFJTX0JMRU5EX1NSQ19PTkVfTUlOVVNfRFNUX0FMUEhBOgotICAgICAgICBtQmxlbmRTcmMgPSBHTF9PTkVfTUlOVVNfRFNUX0FMUEhBOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFJTX0JMRU5EX1NSQ19TUkNfQUxQSEFfU0FUVVJBVEU6Ci0gICAgICAgIG1CbGVuZFNyYyA9IEdMX1NSQ19BTFBIQV9TQVRVUkFURTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgc3dpdGNoKGRzdCkgewotICAgIGNhc2UgUlNfQkxFTkRfRFNUX1pFUk86Ci0gICAgICAgIG1CbGVuZERzdCA9IEdMX1pFUk87Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUlNfQkxFTkRfRFNUX09ORToKLSAgICAgICAgbUJsZW5kRHN0ID0gR0xfT05FOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFJTX0JMRU5EX0RTVF9TUkNfQ09MT1I6Ci0gICAgICAgIG1CbGVuZERzdCA9IEdMX1NSQ19DT0xPUjsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSU19CTEVORF9EU1RfT05FX01JTlVTX1NSQ19DT0xPUjoKLSAgICAgICAgbUJsZW5kRHN0ID0gR0xfT05FX01JTlVTX1NSQ19DT0xPUjsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSU19CTEVORF9EU1RfU1JDX0FMUEhBOgotICAgICAgICBtQmxlbmREc3QgPSBHTF9TUkNfQUxQSEE7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUlNfQkxFTkRfRFNUX09ORV9NSU5VU19TUkNfQUxQSEE6Ci0gICAgICAgIG1CbGVuZERzdCA9IEdMX09ORV9NSU5VU19TUkNfQUxQSEE7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUlNfQkxFTkRfRFNUX0RTVF9BTFBIQToKLSAgICAgICAgbUJsZW5kRHN0ID0gR0xfRFNUX0FMUEhBOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFJTX0JMRU5EX0RTVF9PTkVfTUlOVVNfRFNUX0FMUEhBOgotICAgICAgICBtQmxlbmREc3QgPSBHTF9PTkVfTUlOVVNfRFNUX0FMUEhBOwotICAgICAgICBicmVhazsKLSAgICB9Ci19Ci0KLXZvaWQgUHJvZ3JhbUZyYWdtZW50U3RvcmU6OnNldENvbG9yTWFzayhib29sIHIsIGJvb2wgZywgYm9vbCBiLCBib29sIGEpCi17Ci0gICAgbUNvbG9yUldyaXRlRW5hYmxlID0gcjsKLSAgICBtQ29sb3JHV3JpdGVFbmFibGUgPSBnOwotICAgIG1Db2xvckJXcml0ZUVuYWJsZSA9IGI7Ci0gICAgbUNvbG9yQVdyaXRlRW5hYmxlID0gYTsKLX0KLQotCi1Qcm9ncmFtRnJhZ21lbnRTdG9yZVN0YXRlOjpQcm9ncmFtRnJhZ21lbnRTdG9yZVN0YXRlKCkKLXsKLSAgICBtUEZTID0gTlVMTDsKLX0KLQotUHJvZ3JhbUZyYWdtZW50U3RvcmVTdGF0ZTo6flByb2dyYW1GcmFnbWVudFN0b3JlU3RhdGUoKQotewotICAgIGRlbGV0ZSBtUEZTOwotCi19Ci0KLXZvaWQgUHJvZ3JhbUZyYWdtZW50U3RvcmVTdGF0ZTo6aW5pdChDb250ZXh0ICpyc2MsIGludDMyX3QgdywgaW50MzJfdCBoKQotewotICAgIFByb2dyYW1GcmFnbWVudFN0b3JlICpwZnMgPSBuZXcgUHJvZ3JhbUZyYWdtZW50U3RvcmUocnNjKTsKLSAgICBtRGVmYXVsdC5zZXQocGZzKTsKLX0KLQotdm9pZCBQcm9ncmFtRnJhZ21lbnRTdG9yZVN0YXRlOjpkZWluaXQoQ29udGV4dCAqcnNjKQotewotICAgIG1EZWZhdWx0LmNsZWFyKCk7Ci0gICAgbUxhc3QuY2xlYXIoKTsKLX0KLQotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgcmVuZGVyc2NyaXB0IHsKLQotdm9pZCByc2lfUHJvZ3JhbUZyYWdtZW50U3RvcmVCZWdpbihDb250ZXh0ICogcnNjLCBSc0VsZW1lbnQgaW4sIFJzRWxlbWVudCBvdXQpCi17Ci0gICAgZGVsZXRlIHJzYy0+bVN0YXRlRnJhZ21lbnRTdG9yZS5tUEZTOwotICAgIHJzYy0+bVN0YXRlRnJhZ21lbnRTdG9yZS5tUEZTID0gbmV3IFByb2dyYW1GcmFnbWVudFN0b3JlKHJzYyk7Ci0KLX0KLQotdm9pZCByc2lfUHJvZ3JhbUZyYWdtZW50U3RvcmVEZXB0aEZ1bmMoQ29udGV4dCAqcnNjLCBSc0RlcHRoRnVuYyBmdW5jKQotewotICAgIHJzYy0+bVN0YXRlRnJhZ21lbnRTdG9yZS5tUEZTLT5zZXREZXB0aEZ1bmMoZnVuYyk7Ci19Ci0KLXZvaWQgcnNpX1Byb2dyYW1GcmFnbWVudFN0b3JlRGVwdGhNYXNrKENvbnRleHQgKnJzYywgYm9vbCBtYXNrKQotewotICAgIHJzYy0+bVN0YXRlRnJhZ21lbnRTdG9yZS5tUEZTLT5zZXREZXB0aE1hc2sobWFzayk7Ci19Ci0KLXZvaWQgcnNpX1Byb2dyYW1GcmFnbWVudFN0b3JlQ29sb3JNYXNrKENvbnRleHQgKnJzYywgYm9vbCByLCBib29sIGcsIGJvb2wgYiwgYm9vbCBhKQotewotICAgIHJzYy0+bVN0YXRlRnJhZ21lbnRTdG9yZS5tUEZTLT5zZXRDb2xvck1hc2sociwgZywgYiwgYSk7Ci19Ci0KLXZvaWQgcnNpX1Byb2dyYW1GcmFnbWVudFN0b3JlQmxlbmRGdW5jKENvbnRleHQgKnJzYywgUnNCbGVuZFNyY0Z1bmMgc3JjLCBSc0JsZW5kRHN0RnVuYyBkc3QpCi17Ci0gICAgcnNjLT5tU3RhdGVGcmFnbWVudFN0b3JlLm1QRlMtPnNldEJsZW5kRnVuYyhzcmMsIGRzdCk7Ci19Ci0KLVJzUHJvZ3JhbUZyYWdtZW50U3RvcmUgcnNpX1Byb2dyYW1GcmFnbWVudFN0b3JlQ3JlYXRlKENvbnRleHQgKnJzYykKLXsKLSAgICBQcm9ncmFtRnJhZ21lbnRTdG9yZSAqcGZzID0gcnNjLT5tU3RhdGVGcmFnbWVudFN0b3JlLm1QRlM7Ci0gICAgcGZzLT5pbmNVc2VyUmVmKCk7Ci0gICAgcnNjLT5tU3RhdGVGcmFnbWVudFN0b3JlLm1QRlMgPSAwOwotICAgIHJldHVybiBwZnM7Ci19Ci0KLXZvaWQgcnNpX1Byb2dyYW1GcmFnbWVudFN0b3JlRGl0aGVyKENvbnRleHQgKnJzYywgYm9vbCBlbmFibGUpCi17Ci0gICAgcnNjLT5tU3RhdGVGcmFnbWVudFN0b3JlLm1QRlMtPnNldERpdGhlckVuYWJsZShlbmFibGUpOwotfQotCi0KLX0KLX0KZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNQcm9ncmFtRnJhZ21lbnRTdG9yZS5oIGIvbGlicy9ycy9yc1Byb2dyYW1GcmFnbWVudFN0b3JlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0MTJjOTkuLjAwMDAwMDAKLS0tIGEvbGlicy9ycy9yc1Byb2dyYW1GcmFnbWVudFN0b3JlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX1JTX1BST0dSQU1fRlJBR01FTlRfU1RPUkVfSAotI2RlZmluZSBBTkRST0lEX1JTX1BST0dSQU1fRlJBR01FTlRfU1RPUkVfSAotCi0jaW5jbHVkZSAicnNQcm9ncmFtLmgiCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIHJlbmRlcnNjcmlwdCB7Ci0KLWNsYXNzIFByb2dyYW1GcmFnbWVudFN0b3JlU3RhdGU7Ci0KLWNsYXNzIFByb2dyYW1GcmFnbWVudFN0b3JlIDogcHVibGljIFByb2dyYW0KLXsKLXB1YmxpYzoKLSAgICBQcm9ncmFtRnJhZ21lbnRTdG9yZShDb250ZXh0ICopOwotICAgIHZpcnR1YWwgflByb2dyYW1GcmFnbWVudFN0b3JlKCk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgc2V0dXBHTChjb25zdCBDb250ZXh0ICosIFByb2dyYW1GcmFnbWVudFN0b3JlU3RhdGUgKik7Ci0gICAgdmlydHVhbCB2b2lkIHNldHVwR0wyKGNvbnN0IENvbnRleHQgKiwgUHJvZ3JhbUZyYWdtZW50U3RvcmVTdGF0ZSAqKTsKLQotICAgIHZvaWQgc2V0RGVwdGhGdW5jKFJzRGVwdGhGdW5jKTsKLSAgICB2b2lkIHNldERlcHRoTWFzayhib29sKTsKLQotICAgIHZvaWQgc2V0QmxlbmRGdW5jKFJzQmxlbmRTcmNGdW5jIHNyYywgUnNCbGVuZERzdEZ1bmMgZHN0KTsKLSAgICB2b2lkIHNldENvbG9yTWFzayhib29sLCBib29sLCBib29sLCBib29sKTsKLQotICAgIHZvaWQgc2V0RGl0aGVyRW5hYmxlKGJvb2wpOwotCi1wcm90ZWN0ZWQ6Ci0gICAgYm9vbCBtRGl0aGVyRW5hYmxlOwotCi0gICAgYm9vbCBtQmxlbmRFbmFibGU7Ci0gICAgYm9vbCBtQ29sb3JSV3JpdGVFbmFibGU7Ci0gICAgYm9vbCBtQ29sb3JHV3JpdGVFbmFibGU7Ci0gICAgYm9vbCBtQ29sb3JCV3JpdGVFbmFibGU7Ci0gICAgYm9vbCBtQ29sb3JBV3JpdGVFbmFibGU7Ci0gICAgaW50MzJfdCBtQmxlbmRTcmM7Ci0gICAgaW50MzJfdCBtQmxlbmREc3Q7Ci0KLSAgICBib29sIG1EZXB0aFRlc3RFbmFibGU7Ci0gICAgYm9vbCBtRGVwdGhXcml0ZUVuYWJsZTsKLSAgICBpbnQzMl90IG1EZXB0aEZ1bmM7Ci0KLSAgICBib29sIG1TdGVuY2lsVGVzdEVuYWJsZTsKLX07Ci0KLWNsYXNzIFByb2dyYW1GcmFnbWVudFN0b3JlU3RhdGUKLXsKLXB1YmxpYzoKLSAgICBQcm9ncmFtRnJhZ21lbnRTdG9yZVN0YXRlKCk7Ci0gICAgflByb2dyYW1GcmFnbWVudFN0b3JlU3RhdGUoKTsKLSAgICB2b2lkIGluaXQoQ29udGV4dCAqcnNjLCBpbnQzMl90IHcsIGludDMyX3QgaCk7Ci0gICAgdm9pZCBkZWluaXQoQ29udGV4dCAqcnNjKTsKLQotICAgIE9iamVjdEJhc2VSZWY8UHJvZ3JhbUZyYWdtZW50U3RvcmU+IG1EZWZhdWx0OwotICAgIE9iamVjdEJhc2VSZWY8UHJvZ3JhbUZyYWdtZW50U3RvcmU+IG1MYXN0OwotCi0KLSAgICBQcm9ncmFtRnJhZ21lbnRTdG9yZSAqbVBGUzsKLX07Ci0KLQotfQotfQotI2VuZGlmCi0KLQotCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzUHJvZ3JhbVJhc3Rlci5jcHAgYi9saWJzL3JzL3JzUHJvZ3JhbVJhc3Rlci5jcHAKaW5kZXggMTM4ODdkMS4uNWI2OTM3MCAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc1Byb2dyYW1SYXN0ZXIuY3BwCisrKyBiL2xpYnMvcnMvcnNQcm9ncmFtUmFzdGVyLmNwcApAQCAtMTQsMTEgKzE0LDE3IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisjaWZuZGVmIEFORFJPSURfUlNfQlVJTERfRk9SX0hPU1QKICNpbmNsdWRlICJyc0NvbnRleHQuaCIKLSNpbmNsdWRlICJyc1Byb2dyYW1SYXN0ZXIuaCIKLQogI2luY2x1ZGUgPEdMRVMvZ2wuaD4KICNpbmNsdWRlIDxHTEVTL2dsZXh0Lmg+CisjZWxzZQorI2luY2x1ZGUgInJzQ29udGV4dEhvc3RTdHViLmgiCisjaW5jbHVkZSA8T3BlbkdML2dsLmg+CisjaW5jbHVkZSA8T3BlbkdsL2dsZXh0Lmg+CisjZW5kaWYgLy9BTkRST0lEX1JTX0JVSUxEX0ZPUl9IT1NUCisKKyNpbmNsdWRlICJyc1Byb2dyYW1SYXN0ZXIuaCIKIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6cmVuZGVyc2NyaXB0OwpAQCAtMzUsOSArNDEsOCBAQAogICAgIG1Qb2ludFNtb290aCA9IHBvaW50U21vb3RoOwogICAgIG1MaW5lU21vb3RoID0gbGluZVNtb290aDsKICAgICBtUG9pbnRTcHJpdGUgPSBwb2ludFNwcml0ZTsKLQotICAgIG1Qb2ludFNpemUgPSAxLjBmOwogICAgIG1MaW5lV2lkdGggPSAxLjBmOworICAgIG1DdWxsID0gUlNfQ1VMTF9CQUNLOwogfQogCiBQcm9ncmFtUmFzdGVyOjp+UHJvZ3JhbVJhc3RlcigpCkBAIC00NywyMSArNTIsMjMgQEAKIHZvaWQgUHJvZ3JhbVJhc3Rlcjo6c2V0TGluZVdpZHRoKGZsb2F0IHMpCiB7CiAgICAgbUxpbmVXaWR0aCA9IHM7CisgICAgbURpcnR5ID0gdHJ1ZTsKIH0KIAotdm9pZCBQcm9ncmFtUmFzdGVyOjpzZXRQb2ludFNpemUoZmxvYXQgcykKK3ZvaWQgUHJvZ3JhbVJhc3Rlcjo6c2V0Q3VsbE1vZGUoUnNDdWxsTW9kZSBtb2RlKQogewotICAgIG1Qb2ludFNpemUgPSBzOworICAgIG1DdWxsID0gbW9kZTsKKyAgICBtRGlydHkgPSB0cnVlOwogfQogCiB2b2lkIFByb2dyYW1SYXN0ZXI6OnNldHVwR0woY29uc3QgQ29udGV4dCAqcnNjLCBQcm9ncmFtUmFzdGVyU3RhdGUgKnN0YXRlKQogewotICAgIGlmIChzdGF0ZS0+bUxhc3QuZ2V0KCkgPT0gdGhpcykgeworICAgIGlmIChzdGF0ZS0+bUxhc3QuZ2V0KCkgPT0gdGhpcyAmJiAhbURpcnR5KSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAgICAgc3RhdGUtPm1MYXN0LnNldCh0aGlzKTsKKyAgICBtRGlydHkgPSBmYWxzZTsKIAotICAgIGdsUG9pbnRTaXplKG1Qb2ludFNpemUpOwogICAgIGlmIChtUG9pbnRTbW9vdGgpIHsKICAgICAgICAgZ2xFbmFibGUoR0xfUE9JTlRfU01PT1RIKTsKICAgICB9IGVsc2UgewpAQCAtNzYsMjMgKzgzLDYyIEBACiAgICAgfQogCiAgICAgaWYgKHJzYy0+Y2hlY2tWZXJzaW9uMV8xKCkpIHsKKyNpZm5kZWYgQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAogICAgICAgICBpZiAobVBvaW50U3ByaXRlKSB7CiAgICAgICAgICAgICBnbEVuYWJsZShHTF9QT0lOVF9TUFJJVEVfT0VTKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGdsRGlzYWJsZShHTF9QT0lOVF9TUFJJVEVfT0VTKTsKICAgICAgICAgfQorI2VuZGlmIC8vQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAorICAgIH0KKworICAgIHN3aXRjaChtQ3VsbCkgeworICAgICAgICBjYXNlIFJTX0NVTExfQkFDSzoKKyAgICAgICAgICAgIGdsRW5hYmxlKEdMX0NVTExfRkFDRSk7CisgICAgICAgICAgICBnbEN1bGxGYWNlKEdMX0JBQ0spOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlNfQ1VMTF9GUk9OVDoKKyAgICAgICAgICAgIGdsRW5hYmxlKEdMX0NVTExfRkFDRSk7CisgICAgICAgICAgICBnbEN1bGxGYWNlKEdMX0ZST05UKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJTX0NVTExfTk9ORToKKyAgICAgICAgICAgIGdsRGlzYWJsZShHTF9DVUxMX0ZBQ0UpOworICAgICAgICAgICAgYnJlYWs7CiAgICAgfQogfQogCiB2b2lkIFByb2dyYW1SYXN0ZXI6OnNldHVwR0wyKGNvbnN0IENvbnRleHQgKnJzYywgUHJvZ3JhbVJhc3RlclN0YXRlICpzdGF0ZSkKIHsKLSAgICBpZiAoc3RhdGUtPm1MYXN0LmdldCgpID09IHRoaXMpIHsKKyAgICBpZiAoc3RhdGUtPm1MYXN0LmdldCgpID09IHRoaXMgJiYgIW1EaXJ0eSkgewogICAgICAgICByZXR1cm47CiAgICAgfQogICAgIHN0YXRlLT5tTGFzdC5zZXQodGhpcyk7CisgICAgbURpcnR5ID0gZmFsc2U7CisKKyAgICBzd2l0Y2gobUN1bGwpIHsKKyAgICAgICAgY2FzZSBSU19DVUxMX0JBQ0s6CisgICAgICAgICAgICBnbEVuYWJsZShHTF9DVUxMX0ZBQ0UpOworICAgICAgICAgICAgZ2xDdWxsRmFjZShHTF9CQUNLKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJTX0NVTExfRlJPTlQ6CisgICAgICAgICAgICBnbEVuYWJsZShHTF9DVUxMX0ZBQ0UpOworICAgICAgICAgICAgZ2xDdWxsRmFjZShHTF9GUk9OVCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSU19DVUxMX05PTkU6CisgICAgICAgICAgICBnbERpc2FibGUoR0xfQ1VMTF9GQUNFKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KIH0KIAordm9pZCBQcm9ncmFtUmFzdGVyOjpzZXJpYWxpemUoT1N0cmVhbSAqc3RyZWFtKSBjb25zdAorewogCit9CisKK1Byb2dyYW1SYXN0ZXIgKlByb2dyYW1SYXN0ZXI6OmNyZWF0ZUZyb21TdHJlYW0oQ29udGV4dCAqcnNjLCBJU3RyZWFtICpzdHJlYW0pCit7CisgICAgcmV0dXJuIE5VTEw7Cit9CiAKIFByb2dyYW1SYXN0ZXJTdGF0ZTo6UHJvZ3JhbVJhc3RlclN0YXRlKCkKIHsKQEAgLTEwMiw3ICsxNDgsNyBAQAogewogfQogCi12b2lkIFByb2dyYW1SYXN0ZXJTdGF0ZTo6aW5pdChDb250ZXh0ICpyc2MsIGludDMyX3QgdywgaW50MzJfdCBoKQordm9pZCBQcm9ncmFtUmFzdGVyU3RhdGU6OmluaXQoQ29udGV4dCAqcnNjKQogewogICAgIFByb2dyYW1SYXN0ZXIgKnByID0gbmV3IFByb2dyYW1SYXN0ZXIocnNjLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKICAgICBtRGVmYXVsdC5zZXQocHIpOwpAQCAtMTE4LDcgKzE2NCw3IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgcmVuZGVyc2NyaXB0IHsKIAotUnNQcm9ncmFtUmFzdGVyIHJzaV9Qcm9ncmFtUmFzdGVyQ3JlYXRlKENvbnRleHQgKiByc2MsIFJzRWxlbWVudCBpbiwgUnNFbGVtZW50IG91dCwKK1JzUHJvZ3JhbVJhc3RlciByc2lfUHJvZ3JhbVJhc3RlckNyZWF0ZShDb250ZXh0ICogcnNjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHBvaW50U21vb3RoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGxpbmVTbW9vdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcG9pbnRTcHJpdGUpCkBAIC0xMzEsMTggKzE3NywxOCBAQAogICAgIHJldHVybiBwcjsKIH0KIAotdm9pZCByc2lfUHJvZ3JhbVJhc3RlclNldFBvaW50U2l6ZShDb250ZXh0ICogcnNjLCBSc1Byb2dyYW1SYXN0ZXIgdnByLCBmbG9hdCBzKQotewotICAgIFByb2dyYW1SYXN0ZXIgKnByID0gc3RhdGljX2Nhc3Q8UHJvZ3JhbVJhc3RlciAqPih2cHIpOwotICAgIHByLT5zZXRQb2ludFNpemUocyk7Ci19Ci0KIHZvaWQgcnNpX1Byb2dyYW1SYXN0ZXJTZXRMaW5lV2lkdGgoQ29udGV4dCAqIHJzYywgUnNQcm9ncmFtUmFzdGVyIHZwciwgZmxvYXQgcykKIHsKICAgICBQcm9ncmFtUmFzdGVyICpwciA9IHN0YXRpY19jYXN0PFByb2dyYW1SYXN0ZXIgKj4odnByKTsKICAgICBwci0+c2V0TGluZVdpZHRoKHMpOwogfQogCit2b2lkIHJzaV9Qcm9ncmFtUmFzdGVyU2V0Q3VsbE1vZGUoQ29udGV4dCAqIHJzYywgUnNQcm9ncmFtUmFzdGVyIHZwciwgUnNDdWxsTW9kZSBtb2RlKQoreworICAgIFByb2dyYW1SYXN0ZXIgKnByID0gc3RhdGljX2Nhc3Q8UHJvZ3JhbVJhc3RlciAqPih2cHIpOworICAgIHByLT5zZXRDdWxsTW9kZShtb2RlKTsKK30KKwogCiB9CiB9CmRpZmYgLS1naXQgYS9saWJzL3JzL3JzUHJvZ3JhbVJhc3Rlci5oIGIvbGlicy9ycy9yc1Byb2dyYW1SYXN0ZXIuaAppbmRleCBjM2E5YzkwLi44MDFhYjJhIDEwMDY0NAotLS0gYS9saWJzL3JzL3JzUHJvZ3JhbVJhc3Rlci5oCisrKyBiL2xpYnMvcnMvcnNQcm9ncmFtUmFzdGVyLmgKQEAgLTM2LDE5ICszNiwxOSBAQAogCiAgICAgdmlydHVhbCB2b2lkIHNldHVwR0woY29uc3QgQ29udGV4dCAqLCBQcm9ncmFtUmFzdGVyU3RhdGUgKik7CiAgICAgdmlydHVhbCB2b2lkIHNldHVwR0wyKGNvbnN0IENvbnRleHQgKiwgUHJvZ3JhbVJhc3RlclN0YXRlICopOworICAgIHZpcnR1YWwgdm9pZCBzZXJpYWxpemUoT1N0cmVhbSAqc3RyZWFtKSBjb25zdDsKKyAgICB2aXJ0dWFsIFJzQTNEQ2xhc3NJRCBnZXRDbGFzc0lkKCkgY29uc3QgeyByZXR1cm4gUlNfQTNEX0NMQVNTX0lEX1BST0dSQU1fUkFTVEVSOyB9CisgICAgc3RhdGljIFByb2dyYW1SYXN0ZXIgKmNyZWF0ZUZyb21TdHJlYW0oQ29udGV4dCAqcnNjLCBJU3RyZWFtICpzdHJlYW0pOwogCiAgICAgdm9pZCBzZXRMaW5lV2lkdGgoZmxvYXQgdyk7Ci0gICAgdm9pZCBzZXRQb2ludFNpemUoZmxvYXQgcyk7CisgICAgdm9pZCBzZXRDdWxsTW9kZShSc0N1bGxNb2RlIG1vZGUpOwogCiBwcm90ZWN0ZWQ6CiAgICAgYm9vbCBtUG9pbnRTbW9vdGg7CiAgICAgYm9vbCBtTGluZVNtb290aDsKICAgICBib29sIG1Qb2ludFNwcml0ZTsKLQotICAgIGZsb2F0IG1Qb2ludFNpemU7CiAgICAgZmxvYXQgbUxpbmVXaWR0aDsKLQotCisgICAgUnNDdWxsTW9kZSBtQ3VsbDsKIH07CiAKIGNsYXNzIFByb2dyYW1SYXN0ZXJTdGF0ZQpAQCAtNTYsNyArNTYsNyBAQAogcHVibGljOgogICAgIFByb2dyYW1SYXN0ZXJTdGF0ZSgpOwogICAgIH5Qcm9ncmFtUmFzdGVyU3RhdGUoKTsKLSAgICB2b2lkIGluaXQoQ29udGV4dCAqcnNjLCBpbnQzMl90IHcsIGludDMyX3QgaCk7CisgICAgdm9pZCBpbml0KENvbnRleHQgKnJzYyk7CiAgICAgdm9pZCBkZWluaXQoQ29udGV4dCAqcnNjKTsKIAogICAgIE9iamVjdEJhc2VSZWY8UHJvZ3JhbVJhc3Rlcj4gbURlZmF1bHQ7CmRpZmYgLS1naXQgYS9saWJzL3JzL3JzUHJvZ3JhbVN0b3JlLmNwcCBiL2xpYnMvcnMvcnNQcm9ncmFtU3RvcmUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3NDFjMGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL3JzUHJvZ3JhbVN0b3JlLmNwcApAQCAtMCwwICsxLDMyNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAorI2luY2x1ZGUgInJzQ29udGV4dC5oIgorI2luY2x1ZGUgPEdMRVMvZ2wuaD4KKyNpbmNsdWRlIDxHTEVTL2dsZXh0Lmg+CisjZWxzZQorI2luY2x1ZGUgInJzQ29udGV4dEhvc3RTdHViLmgiCisjaW5jbHVkZSA8T3BlbkdML2dsLmg+CisjaW5jbHVkZSA8T3BlbkdsL2dsZXh0Lmg+CisjZW5kaWYgLy9BTkRST0lEX1JTX0JVSUxEX0ZPUl9IT1NUCisKKyNpbmNsdWRlICJyc1Byb2dyYW1TdG9yZS5oIgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpyZW5kZXJzY3JpcHQ7CisKKworUHJvZ3JhbVN0b3JlOjpQcm9ncmFtU3RvcmUoQ29udGV4dCAqcnNjKSA6CisgICAgUHJvZ3JhbShyc2MpCit7CisgICAgbUFsbG9jRmlsZSA9IF9fRklMRV9fOworICAgIG1BbGxvY0xpbmUgPSBfX0xJTkVfXzsKKyAgICBtRGl0aGVyRW5hYmxlID0gdHJ1ZTsKKyAgICBtQmxlbmRFbmFibGUgPSBmYWxzZTsKKyAgICBtQ29sb3JSV3JpdGVFbmFibGUgPSB0cnVlOworICAgIG1Db2xvckdXcml0ZUVuYWJsZSA9IHRydWU7CisgICAgbUNvbG9yQldyaXRlRW5hYmxlID0gdHJ1ZTsKKyAgICBtQ29sb3JBV3JpdGVFbmFibGUgPSB0cnVlOworICAgIG1CbGVuZFNyYyA9IEdMX09ORTsKKyAgICBtQmxlbmREc3QgPSBHTF9aRVJPOworCisKKyAgICBtRGVwdGhUZXN0RW5hYmxlID0gZmFsc2U7CisgICAgbURlcHRoV3JpdGVFbmFibGUgPSB0cnVlOworICAgIG1EZXB0aEZ1bmMgPSBHTF9MRVNTOworCisKK30KKworUHJvZ3JhbVN0b3JlOjp+UHJvZ3JhbVN0b3JlKCkKK3sKK30KKwordm9pZCBQcm9ncmFtU3RvcmU6OnNldHVwR0woY29uc3QgQ29udGV4dCAqcnNjLCBQcm9ncmFtU3RvcmVTdGF0ZSAqc3RhdGUpCit7CisgICAgaWYgKHN0YXRlLT5tTGFzdC5nZXQoKSA9PSB0aGlzKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc3RhdGUtPm1MYXN0LnNldCh0aGlzKTsKKworICAgIGdsQ29sb3JNYXNrKG1Db2xvclJXcml0ZUVuYWJsZSwKKyAgICAgICAgICAgICAgICBtQ29sb3JHV3JpdGVFbmFibGUsCisgICAgICAgICAgICAgICAgbUNvbG9yQldyaXRlRW5hYmxlLAorICAgICAgICAgICAgICAgIG1Db2xvckFXcml0ZUVuYWJsZSk7CisgICAgaWYgKG1CbGVuZEVuYWJsZSkgeworICAgICAgICBnbEVuYWJsZShHTF9CTEVORCk7CisgICAgICAgIGdsQmxlbmRGdW5jKG1CbGVuZFNyYywgbUJsZW5kRHN0KTsKKyAgICB9IGVsc2UgeworICAgICAgICBnbERpc2FibGUoR0xfQkxFTkQpOworICAgIH0KKworICAgIC8vTE9HRSgicGZzICAlaSwgJWksICV4IiwgbURlcHRoV3JpdGVFbmFibGUsIG1EZXB0aFRlc3RFbmFibGUsIG1EZXB0aEZ1bmMpOworCisgICAgZ2xEZXB0aE1hc2sobURlcHRoV3JpdGVFbmFibGUpOworICAgIGlmKG1EZXB0aFRlc3RFbmFibGUgfHwgbURlcHRoV3JpdGVFbmFibGUpIHsKKyAgICAgICAgZ2xFbmFibGUoR0xfREVQVEhfVEVTVCk7CisgICAgICAgIGdsRGVwdGhGdW5jKG1EZXB0aEZ1bmMpOworICAgIH0gZWxzZSB7CisgICAgICAgIGdsRGlzYWJsZShHTF9ERVBUSF9URVNUKTsKKyAgICB9CisKKyAgICBpZiAobURpdGhlckVuYWJsZSkgeworICAgICAgICBnbEVuYWJsZShHTF9ESVRIRVIpOworICAgIH0gZWxzZSB7CisgICAgICAgIGdsRGlzYWJsZShHTF9ESVRIRVIpOworICAgIH0KK30KKwordm9pZCBQcm9ncmFtU3RvcmU6OnNldHVwR0wyKGNvbnN0IENvbnRleHQgKnJzYywgUHJvZ3JhbVN0b3JlU3RhdGUgKnN0YXRlKQoreworICAgIGlmIChzdGF0ZS0+bUxhc3QuZ2V0KCkgPT0gdGhpcykgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHN0YXRlLT5tTGFzdC5zZXQodGhpcyk7CisKKyAgICBnbENvbG9yTWFzayhtQ29sb3JSV3JpdGVFbmFibGUsCisgICAgICAgICAgICAgICAgbUNvbG9yR1dyaXRlRW5hYmxlLAorICAgICAgICAgICAgICAgIG1Db2xvckJXcml0ZUVuYWJsZSwKKyAgICAgICAgICAgICAgICBtQ29sb3JBV3JpdGVFbmFibGUpOworICAgIGlmIChtQmxlbmRFbmFibGUpIHsKKyAgICAgICAgZ2xFbmFibGUoR0xfQkxFTkQpOworICAgICAgICBnbEJsZW5kRnVuYyhtQmxlbmRTcmMsIG1CbGVuZERzdCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZ2xEaXNhYmxlKEdMX0JMRU5EKTsKKyAgICB9CisKKyAgICAvL0xPR0UoInBmcyAgJWksICVpLCAleCIsIG1EZXB0aFdyaXRlRW5hYmxlLCBtRGVwdGhUZXN0RW5hYmxlLCBtRGVwdGhGdW5jKTsKKworICAgIGdsRGVwdGhNYXNrKG1EZXB0aFdyaXRlRW5hYmxlKTsKKyAgICBpZihtRGVwdGhUZXN0RW5hYmxlIHx8IG1EZXB0aFdyaXRlRW5hYmxlKSB7CisgICAgICAgIGdsRW5hYmxlKEdMX0RFUFRIX1RFU1QpOworICAgICAgICBnbERlcHRoRnVuYyhtRGVwdGhGdW5jKTsKKyAgICB9IGVsc2UgeworICAgICAgICBnbERpc2FibGUoR0xfREVQVEhfVEVTVCk7CisgICAgfQorCisgICAgaWYgKG1EaXRoZXJFbmFibGUpIHsKKyAgICAgICAgZ2xFbmFibGUoR0xfRElUSEVSKTsKKyAgICB9IGVsc2UgeworICAgICAgICBnbERpc2FibGUoR0xfRElUSEVSKTsKKyAgICB9Cit9CisKKwordm9pZCBQcm9ncmFtU3RvcmU6OnNldERpdGhlckVuYWJsZShib29sIGVuYWJsZSkKK3sKKyAgICBtRGl0aGVyRW5hYmxlID0gZW5hYmxlOworfQorCit2b2lkIFByb2dyYW1TdG9yZTo6c2VyaWFsaXplKE9TdHJlYW0gKnN0cmVhbSkgY29uc3QKK3sKKworfQorCitQcm9ncmFtU3RvcmUgKlByb2dyYW1TdG9yZTo6Y3JlYXRlRnJvbVN0cmVhbShDb250ZXh0ICpyc2MsIElTdHJlYW0gKnN0cmVhbSkKK3sKKyAgICByZXR1cm4gTlVMTDsKK30KKworCit2b2lkIFByb2dyYW1TdG9yZTo6c2V0RGVwdGhGdW5jKFJzRGVwdGhGdW5jIGZ1bmMpCit7CisgICAgbURlcHRoVGVzdEVuYWJsZSA9IHRydWU7CisKKyAgICBzd2l0Y2goZnVuYykgeworICAgIGNhc2UgUlNfREVQVEhfRlVOQ19BTFdBWVM6CisgICAgICAgIG1EZXB0aFRlc3RFbmFibGUgPSBmYWxzZTsKKyAgICAgICAgbURlcHRoRnVuYyA9IEdMX0FMV0FZUzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBSU19ERVBUSF9GVU5DX0xFU1M6CisgICAgICAgIG1EZXB0aEZ1bmMgPSBHTF9MRVNTOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFJTX0RFUFRIX0ZVTkNfTEVRVUFMOgorICAgICAgICBtRGVwdGhGdW5jID0gR0xfTEVRVUFMOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFJTX0RFUFRIX0ZVTkNfR1JFQVRFUjoKKyAgICAgICAgbURlcHRoRnVuYyA9IEdMX0dSRUFURVI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUlNfREVQVEhfRlVOQ19HRVFVQUw6CisgICAgICAgIG1EZXB0aEZ1bmMgPSBHTF9HRVFVQUw7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUlNfREVQVEhfRlVOQ19FUVVBTDoKKyAgICAgICAgbURlcHRoRnVuYyA9IEdMX0VRVUFMOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFJTX0RFUFRIX0ZVTkNfTk9URVFVQUw6CisgICAgICAgIG1EZXB0aEZ1bmMgPSBHTF9OT1RFUVVBTDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCit2b2lkIFByb2dyYW1TdG9yZTo6c2V0RGVwdGhNYXNrKGJvb2wgbWFzaykKK3sKKyAgICBtRGVwdGhXcml0ZUVuYWJsZSA9IG1hc2s7Cit9CisKK3ZvaWQgUHJvZ3JhbVN0b3JlOjpzZXRCbGVuZEZ1bmMoUnNCbGVuZFNyY0Z1bmMgc3JjLCBSc0JsZW5kRHN0RnVuYyBkc3QpCit7CisgICAgbUJsZW5kRW5hYmxlID0gdHJ1ZTsKKyAgICBpZiAoKHNyYyA9PSBSU19CTEVORF9TUkNfT05FKSAmJgorICAgICAgICAoZHN0ID09IFJTX0JMRU5EX0RTVF9aRVJPKSkgeworICAgICAgICBtQmxlbmRFbmFibGUgPSBmYWxzZTsKKyAgICB9CisKKyAgICBzd2l0Y2goc3JjKSB7CisgICAgY2FzZSBSU19CTEVORF9TUkNfWkVSTzoKKyAgICAgICAgbUJsZW5kU3JjID0gR0xfWkVSTzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBSU19CTEVORF9TUkNfT05FOgorICAgICAgICBtQmxlbmRTcmMgPSBHTF9PTkU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUlNfQkxFTkRfU1JDX0RTVF9DT0xPUjoKKyAgICAgICAgbUJsZW5kU3JjID0gR0xfRFNUX0NPTE9SOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFJTX0JMRU5EX1NSQ19PTkVfTUlOVVNfRFNUX0NPTE9SOgorICAgICAgICBtQmxlbmRTcmMgPSBHTF9PTkVfTUlOVVNfRFNUX0NPTE9SOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFJTX0JMRU5EX1NSQ19TUkNfQUxQSEE6CisgICAgICAgIG1CbGVuZFNyYyA9IEdMX1NSQ19BTFBIQTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBSU19CTEVORF9TUkNfT05FX01JTlVTX1NSQ19BTFBIQToKKyAgICAgICAgbUJsZW5kU3JjID0gR0xfT05FX01JTlVTX1NSQ19BTFBIQTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBSU19CTEVORF9TUkNfRFNUX0FMUEhBOgorICAgICAgICBtQmxlbmRTcmMgPSBHTF9EU1RfQUxQSEE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUlNfQkxFTkRfU1JDX09ORV9NSU5VU19EU1RfQUxQSEE6CisgICAgICAgIG1CbGVuZFNyYyA9IEdMX09ORV9NSU5VU19EU1RfQUxQSEE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUlNfQkxFTkRfU1JDX1NSQ19BTFBIQV9TQVRVUkFURToKKyAgICAgICAgbUJsZW5kU3JjID0gR0xfU1JDX0FMUEhBX1NBVFVSQVRFOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBzd2l0Y2goZHN0KSB7CisgICAgY2FzZSBSU19CTEVORF9EU1RfWkVSTzoKKyAgICAgICAgbUJsZW5kRHN0ID0gR0xfWkVSTzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBSU19CTEVORF9EU1RfT05FOgorICAgICAgICBtQmxlbmREc3QgPSBHTF9PTkU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUlNfQkxFTkRfRFNUX1NSQ19DT0xPUjoKKyAgICAgICAgbUJsZW5kRHN0ID0gR0xfU1JDX0NPTE9SOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFJTX0JMRU5EX0RTVF9PTkVfTUlOVVNfU1JDX0NPTE9SOgorICAgICAgICBtQmxlbmREc3QgPSBHTF9PTkVfTUlOVVNfU1JDX0NPTE9SOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFJTX0JMRU5EX0RTVF9TUkNfQUxQSEE6CisgICAgICAgIG1CbGVuZERzdCA9IEdMX1NSQ19BTFBIQTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBSU19CTEVORF9EU1RfT05FX01JTlVTX1NSQ19BTFBIQToKKyAgICAgICAgbUJsZW5kRHN0ID0gR0xfT05FX01JTlVTX1NSQ19BTFBIQTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBSU19CTEVORF9EU1RfRFNUX0FMUEhBOgorICAgICAgICBtQmxlbmREc3QgPSBHTF9EU1RfQUxQSEE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUlNfQkxFTkRfRFNUX09ORV9NSU5VU19EU1RfQUxQSEE6CisgICAgICAgIG1CbGVuZERzdCA9IEdMX09ORV9NSU5VU19EU1RfQUxQSEE7CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKwordm9pZCBQcm9ncmFtU3RvcmU6OnNldENvbG9yTWFzayhib29sIHIsIGJvb2wgZywgYm9vbCBiLCBib29sIGEpCit7CisgICAgbUNvbG9yUldyaXRlRW5hYmxlID0gcjsKKyAgICBtQ29sb3JHV3JpdGVFbmFibGUgPSBnOworICAgIG1Db2xvckJXcml0ZUVuYWJsZSA9IGI7CisgICAgbUNvbG9yQVdyaXRlRW5hYmxlID0gYTsKK30KKworCitQcm9ncmFtU3RvcmVTdGF0ZTo6UHJvZ3JhbVN0b3JlU3RhdGUoKQoreworICAgIG1QRlMgPSBOVUxMOworfQorCitQcm9ncmFtU3RvcmVTdGF0ZTo6flByb2dyYW1TdG9yZVN0YXRlKCkKK3sKKyAgICBkZWxldGUgbVBGUzsKKworfQorCit2b2lkIFByb2dyYW1TdG9yZVN0YXRlOjppbml0KENvbnRleHQgKnJzYykKK3sKKyAgICBQcm9ncmFtU3RvcmUgKnBmcyA9IG5ldyBQcm9ncmFtU3RvcmUocnNjKTsKKyAgICBtRGVmYXVsdC5zZXQocGZzKTsKK30KKwordm9pZCBQcm9ncmFtU3RvcmVTdGF0ZTo6ZGVpbml0KENvbnRleHQgKnJzYykKK3sKKyAgICBtRGVmYXVsdC5jbGVhcigpOworICAgIG1MYXN0LmNsZWFyKCk7Cit9CisKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHJlbmRlcnNjcmlwdCB7CisKK3ZvaWQgcnNpX1Byb2dyYW1TdG9yZUJlZ2luKENvbnRleHQgKiByc2MsIFJzRWxlbWVudCBpbiwgUnNFbGVtZW50IG91dCkKK3sKKyAgICBkZWxldGUgcnNjLT5tU3RhdGVGcmFnbWVudFN0b3JlLm1QRlM7CisgICAgcnNjLT5tU3RhdGVGcmFnbWVudFN0b3JlLm1QRlMgPSBuZXcgUHJvZ3JhbVN0b3JlKHJzYyk7CisKK30KKwordm9pZCByc2lfUHJvZ3JhbVN0b3JlRGVwdGhGdW5jKENvbnRleHQgKnJzYywgUnNEZXB0aEZ1bmMgZnVuYykKK3sKKyAgICByc2MtPm1TdGF0ZUZyYWdtZW50U3RvcmUubVBGUy0+c2V0RGVwdGhGdW5jKGZ1bmMpOworfQorCit2b2lkIHJzaV9Qcm9ncmFtU3RvcmVEZXB0aE1hc2soQ29udGV4dCAqcnNjLCBib29sIG1hc2spCit7CisgICAgcnNjLT5tU3RhdGVGcmFnbWVudFN0b3JlLm1QRlMtPnNldERlcHRoTWFzayhtYXNrKTsKK30KKwordm9pZCByc2lfUHJvZ3JhbVN0b3JlQ29sb3JNYXNrKENvbnRleHQgKnJzYywgYm9vbCByLCBib29sIGcsIGJvb2wgYiwgYm9vbCBhKQoreworICAgIHJzYy0+bVN0YXRlRnJhZ21lbnRTdG9yZS5tUEZTLT5zZXRDb2xvck1hc2sociwgZywgYiwgYSk7Cit9CisKK3ZvaWQgcnNpX1Byb2dyYW1TdG9yZUJsZW5kRnVuYyhDb250ZXh0ICpyc2MsIFJzQmxlbmRTcmNGdW5jIHNyYywgUnNCbGVuZERzdEZ1bmMgZHN0KQoreworICAgIHJzYy0+bVN0YXRlRnJhZ21lbnRTdG9yZS5tUEZTLT5zZXRCbGVuZEZ1bmMoc3JjLCBkc3QpOworfQorCitSc1Byb2dyYW1TdG9yZSByc2lfUHJvZ3JhbVN0b3JlQ3JlYXRlKENvbnRleHQgKnJzYykKK3sKKyAgICBQcm9ncmFtU3RvcmUgKnBmcyA9IHJzYy0+bVN0YXRlRnJhZ21lbnRTdG9yZS5tUEZTOworICAgIHBmcy0+aW5jVXNlclJlZigpOworICAgIHJzYy0+bVN0YXRlRnJhZ21lbnRTdG9yZS5tUEZTID0gMDsKKyAgICByZXR1cm4gcGZzOworfQorCit2b2lkIHJzaV9Qcm9ncmFtU3RvcmVEaXRoZXIoQ29udGV4dCAqcnNjLCBib29sIGVuYWJsZSkKK3sKKyAgICByc2MtPm1TdGF0ZUZyYWdtZW50U3RvcmUubVBGUy0+c2V0RGl0aGVyRW5hYmxlKGVuYWJsZSk7Cit9CisKKworfQorfQpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc1Byb2dyYW1TdG9yZS5oIGIvbGlicy9ycy9yc1Byb2dyYW1TdG9yZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlOGQ3OGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL3JzUHJvZ3JhbVN0b3JlLmgKQEAgLTAsMCArMSw4OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9SU19QUk9HUkFNX0ZSQUdNRU5UX1NUT1JFX0gKKyNkZWZpbmUgQU5EUk9JRF9SU19QUk9HUkFNX0ZSQUdNRU5UX1NUT1JFX0gKKworI2luY2x1ZGUgInJzUHJvZ3JhbS5oIgorI2luY2x1ZGUgInJzU3RyZWFtLmgiCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHJlbmRlcnNjcmlwdCB7CisKK2NsYXNzIFByb2dyYW1TdG9yZVN0YXRlOworCitjbGFzcyBQcm9ncmFtU3RvcmUgOiBwdWJsaWMgUHJvZ3JhbQoreworcHVibGljOgorICAgIFByb2dyYW1TdG9yZShDb250ZXh0ICopOworICAgIHZpcnR1YWwgflByb2dyYW1TdG9yZSgpOworCisgICAgdmlydHVhbCB2b2lkIHNldHVwR0woY29uc3QgQ29udGV4dCAqLCBQcm9ncmFtU3RvcmVTdGF0ZSAqKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0dXBHTDIoY29uc3QgQ29udGV4dCAqLCBQcm9ncmFtU3RvcmVTdGF0ZSAqKTsKKworICAgIHZvaWQgc2V0RGVwdGhGdW5jKFJzRGVwdGhGdW5jKTsKKyAgICB2b2lkIHNldERlcHRoTWFzayhib29sKTsKKworICAgIHZvaWQgc2V0QmxlbmRGdW5jKFJzQmxlbmRTcmNGdW5jIHNyYywgUnNCbGVuZERzdEZ1bmMgZHN0KTsKKyAgICB2b2lkIHNldENvbG9yTWFzayhib29sLCBib29sLCBib29sLCBib29sKTsKKworICAgIHZvaWQgc2V0RGl0aGVyRW5hYmxlKGJvb2wpOworCisgICAgdmlydHVhbCB2b2lkIHNlcmlhbGl6ZShPU3RyZWFtICpzdHJlYW0pIGNvbnN0OworICAgIHZpcnR1YWwgUnNBM0RDbGFzc0lEIGdldENsYXNzSWQoKSBjb25zdCB7IHJldHVybiBSU19BM0RfQ0xBU1NfSURfUFJPR1JBTV9TVE9SRTsgfQorICAgIHN0YXRpYyBQcm9ncmFtU3RvcmUgKmNyZWF0ZUZyb21TdHJlYW0oQ29udGV4dCAqcnNjLCBJU3RyZWFtICpzdHJlYW0pOworCitwcm90ZWN0ZWQ6CisgICAgYm9vbCBtRGl0aGVyRW5hYmxlOworCisgICAgYm9vbCBtQmxlbmRFbmFibGU7CisgICAgYm9vbCBtQ29sb3JSV3JpdGVFbmFibGU7CisgICAgYm9vbCBtQ29sb3JHV3JpdGVFbmFibGU7CisgICAgYm9vbCBtQ29sb3JCV3JpdGVFbmFibGU7CisgICAgYm9vbCBtQ29sb3JBV3JpdGVFbmFibGU7CisgICAgaW50MzJfdCBtQmxlbmRTcmM7CisgICAgaW50MzJfdCBtQmxlbmREc3Q7CisKKyAgICBib29sIG1EZXB0aFRlc3RFbmFibGU7CisgICAgYm9vbCBtRGVwdGhXcml0ZUVuYWJsZTsKKyAgICBpbnQzMl90IG1EZXB0aEZ1bmM7CisKKyAgICBib29sIG1TdGVuY2lsVGVzdEVuYWJsZTsKK307CisKK2NsYXNzIFByb2dyYW1TdG9yZVN0YXRlCit7CitwdWJsaWM6CisgICAgUHJvZ3JhbVN0b3JlU3RhdGUoKTsKKyAgICB+UHJvZ3JhbVN0b3JlU3RhdGUoKTsKKyAgICB2b2lkIGluaXQoQ29udGV4dCAqcnNjKTsKKyAgICB2b2lkIGRlaW5pdChDb250ZXh0ICpyc2MpOworCisgICAgT2JqZWN0QmFzZVJlZjxQcm9ncmFtU3RvcmU+IG1EZWZhdWx0OworICAgIE9iamVjdEJhc2VSZWY8UHJvZ3JhbVN0b3JlPiBtTGFzdDsKKworCisgICAgUHJvZ3JhbVN0b3JlICptUEZTOworfTsKKworCit9Cit9CisjZW5kaWYKKworCisKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNQcm9ncmFtVmVydGV4LmNwcCBiL2xpYnMvcnMvcnNQcm9ncmFtVmVydGV4LmNwcAppbmRleCBhMmIyZGY0Li5hZWU0MTMzIDEwMDY0NAotLS0gYS9saWJzL3JzL3JzUHJvZ3JhbVZlcnRleC5jcHAKKysrIGIvbGlicy9ycy9yc1Byb2dyYW1WZXJ0ZXguY3BwCkBAIC0xNCwxMyArMTQsMTkgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKyNpZm5kZWYgQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAogI2luY2x1ZGUgInJzQ29udGV4dC5oIgotI2luY2x1ZGUgInJzUHJvZ3JhbVZlcnRleC5oIgotCiAjaW5jbHVkZSA8R0xFUy9nbC5oPgogI2luY2x1ZGUgPEdMRVMvZ2xleHQuaD4KICNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KICNpbmNsdWRlIDxHTEVTMi9nbDJleHQuaD4KKyNlbHNlCisjaW5jbHVkZSAicnNDb250ZXh0SG9zdFN0dWIuaCIKKyNpbmNsdWRlIDxPcGVuR0wvZ2wuaD4KKyNpbmNsdWRlIDxPcGVuR0wvZ2xleHQuaD4KKyNlbmRpZiAvL0FORFJPSURfUlNfQlVJTERfRk9SX0hPU1QKKworI2luY2x1ZGUgInJzUHJvZ3JhbVZlcnRleC5oIgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpyZW5kZXJzY3JpcHQ7CkBAIC04MSw5ICs4NywxMiBAQAogICAgIGdsTWF0cml4TW9kZShHTF9NT0RFTFZJRVcpOwogICAgIGdsTG9hZElkZW50aXR5KCk7CiAgICAgaWYgKG1MaWdodENvdW50KSB7CisjaWZuZGVmIEFORFJPSURfUlNfQlVJTERfRk9SX0hPU1QgLy8gR0xFUyBPbmx5CiAgICAgICAgIGludCB2ID0gMDsKICAgICAgICAgZ2xFbmFibGUoR0xfTElHSFRJTkcpOworCiAgICAgICAgIGdsTGlnaHRNb2RlbHh2KEdMX0xJR0hUX01PREVMX1RXT19TSURFLCAmdik7CisKICAgICAgICAgZm9yICh1aW50MzJfdCBjdCA9IDA7IGN0IDwgbUxpZ2h0Q291bnQ7IGN0KyspIHsKICAgICAgICAgICAgIGNvbnN0IExpZ2h0ICpsID0gbUxpZ2h0c1tjdF0uZ2V0KCk7CiAgICAgICAgICAgICBnbEVuYWJsZShHTF9MSUdIVDAgKyBjdCk7CkBAIC05Miw2ICsxMDEsNyBAQAogICAgICAgICBmb3IgKHVpbnQzMl90IGN0ID0gbUxpZ2h0Q291bnQ7IGN0IDwgTUFYX0xJR0hUUzsgY3QrKykgewogICAgICAgICAgICAgZ2xEaXNhYmxlKEdMX0xJR0hUMCArIGN0KTsKICAgICAgICAgfQorI2VuZGlmIC8vQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAogICAgIH0gZWxzZSB7CiAgICAgICAgIGdsRGlzYWJsZShHTF9MSUdIVElORyk7CiAgICAgfQpAQCAtMTI4LDYgKzEzOCwxMSBAQAogICAgICAgICAgICAgY29uc3QgRWxlbWVudCAqZSA9IG1Db25zdGFudFR5cGVzW2N0XS0+Z2V0RWxlbWVudCgpOwogICAgICAgICAgICAgZm9yICh1aW50MzJfdCBmaWVsZD0wOyBmaWVsZCA8IGUtPmdldEZpZWxkQ291bnQoKTsgZmllbGQrKykgewogICAgICAgICAgICAgICAgIGNvbnN0IEVsZW1lbnQgKmYgPSBlLT5nZXRGaWVsZChmaWVsZCk7CisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZm4gPSBlLT5nZXRGaWVsZE5hbWUoZmllbGQpOworCisgICAgICAgICAgICAgICAgaWYgKGZuWzBdID09ICcjJykgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAvLyBDYW5ub3QgYmUgY29tcGxleAogICAgICAgICAgICAgICAgIHJzQXNzZXJ0KCFmLT5nZXRGaWVsZENvdW50KCkpOwpAQCAtMTQwLDcgKzE1NSw3IEBACiAgICAgICAgICAgICAgICAgICAgIHJzQXNzZXJ0KDApOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIG1TaGFkZXIuYXBwZW5kKGUtPmdldEZpZWxkTmFtZShmaWVsZCkpOworICAgICAgICAgICAgICAgIG1TaGFkZXIuYXBwZW5kKGZuKTsKICAgICAgICAgICAgICAgICBtU2hhZGVyLmFwcGVuZCgiO1xuIik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTE1MCw2ICsxNjUsMTEgQEAKICAgICAgICAgICAgIGNvbnN0IEVsZW1lbnQgKmUgPSBtSW5wdXRFbGVtZW50c1tjdF0uZ2V0KCk7CiAgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGZpZWxkPTA7IGZpZWxkIDwgZS0+Z2V0RmllbGRDb3VudCgpOyBmaWVsZCsrKSB7CiAgICAgICAgICAgICAgICAgY29uc3QgRWxlbWVudCAqZiA9IGUtPmdldEZpZWxkKGZpZWxkKTsKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmbiA9IGUtPmdldEZpZWxkTmFtZShmaWVsZCk7CisKKyAgICAgICAgICAgICAgICBpZiAoZm5bMF0gPT0gJyMnKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIC8vIENhbm5vdCBiZSBjb21wbGV4CiAgICAgICAgICAgICAgICAgcnNBc3NlcnQoIWYtPmdldEZpZWxkQ291bnQoKSk7CkBAIC0xNjIsMTcgKzE4MiwxNiBAQAogICAgICAgICAgICAgICAgICAgICByc0Fzc2VydCgwKTsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBtU2hhZGVyLmFwcGVuZChlLT5nZXRGaWVsZE5hbWUoZmllbGQpKTsKKyAgICAgICAgICAgICAgICBtU2hhZGVyLmFwcGVuZChmbik7CiAgICAgICAgICAgICAgICAgbVNoYWRlci5hcHBlbmQoIjtcbiIpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIG1TaGFkZXIuYXBwZW5kKG1Vc2VyU2hhZGVyKTsKICAgICB9IGVsc2UgewotICAgICAgICBtU2hhZGVyLmFwcGVuZCgiYXR0cmlidXRlIHZlYzQgQVRUUklCX0xlZ2FjeVBvc2l0aW9uO1xuIik7Ci0gICAgICAgIG1TaGFkZXIuYXBwZW5kKCJhdHRyaWJ1dGUgdmVjNCBBVFRSSUJfTGVnYWN5Q29sb3I7XG4iKTsKLSAgICAgICAgbVNoYWRlci5hcHBlbmQoImF0dHJpYnV0ZSB2ZWMzIEFUVFJJQl9MZWdhY3lOb3JtYWw7XG4iKTsKLSAgICAgICAgbVNoYWRlci5hcHBlbmQoImF0dHJpYnV0ZSBmbG9hdCBBVFRSSUJfTGVnYWN5UG9pbnRTaXplO1xuIik7Ci0gICAgICAgIG1TaGFkZXIuYXBwZW5kKCJhdHRyaWJ1dGUgdmVjNCBBVFRSSUJfTGVnYWN5VGV4dHVyZTtcbiIpOworICAgICAgICBtU2hhZGVyLmFwcGVuZCgiYXR0cmlidXRlIHZlYzQgQVRUUklCX3Bvc2l0aW9uO1xuIik7CisgICAgICAgIG1TaGFkZXIuYXBwZW5kKCJhdHRyaWJ1dGUgdmVjNCBBVFRSSUJfY29sb3I7XG4iKTsKKyAgICAgICAgbVNoYWRlci5hcHBlbmQoImF0dHJpYnV0ZSB2ZWMzIEFUVFJJQl9ub3JtYWw7XG4iKTsKKyAgICAgICAgbVNoYWRlci5hcHBlbmQoImF0dHJpYnV0ZSB2ZWM0IEFUVFJJQl90ZXh0dXJlMDtcbiIpOwogCiAgICAgICAgIGZvciAodWludDMyX3QgY3Q9MDsgY3QgPCBtVW5pZm9ybUNvdW50OyBjdCsrKSB7CiAgICAgICAgICAgICBtU2hhZGVyLmFwcGVuZCgidW5pZm9ybSBtYXQ0ICIpOwpAQCAtMTgxLDE4ICsyMDAsMTUgQEAKICAgICAgICAgfQogCiAgICAgICAgIG1TaGFkZXIuYXBwZW5kKCJ2b2lkIG1haW4oKSB7XG4iKTsKLSAgICAgICAgbVNoYWRlci5hcHBlbmQoIiAgZ2xfUG9zaXRpb24gPSBVTklfTVZQICogQVRUUklCX0xlZ2FjeVBvc2l0aW9uO1xuIik7Ci0gICAgICAgIG1TaGFkZXIuYXBwZW5kKCIgIGdsX1BvaW50U2l6ZSA9IEFUVFJJQl9MZWdhY3lQb2ludFNpemU7XG4iKTsKKyAgICAgICAgbVNoYWRlci5hcHBlbmQoIiAgZ2xfUG9zaXRpb24gPSBVTklfTVZQICogQVRUUklCX3Bvc2l0aW9uO1xuIik7CisgICAgICAgIG1TaGFkZXIuYXBwZW5kKCIgIGdsX1BvaW50U2l6ZSA9IDEuMDtcbiIpOwogCi0gICAgICAgIG1TaGFkZXIuYXBwZW5kKCIgIHZhckNvbG9yID0gQVRUUklCX0xlZ2FjeUNvbG9yO1xuIik7CisgICAgICAgIG1TaGFkZXIuYXBwZW5kKCIgIHZhckNvbG9yID0gQVRUUklCX2NvbG9yO1xuIik7CiAgICAgICAgIGlmIChtVGV4dHVyZU1hdHJpeEVuYWJsZSkgewotICAgICAgICAgICAgbVNoYWRlci5hcHBlbmQoIiAgdmFyVGV4MCA9IFVOSV9UZXhNYXRyaXggKiBBVFRSSUJfTGVnYWN5VGV4dHVyZTtcbiIpOworICAgICAgICAgICAgbVNoYWRlci5hcHBlbmQoIiAgdmFyVGV4MCA9IFVOSV9UZXhNYXRyaXggKiBBVFRSSUJfdGV4dHVyZTA7XG4iKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1TaGFkZXIuYXBwZW5kKCIgIHZhclRleDAgPSBBVFRSSUJfTGVnYWN5VGV4dHVyZTtcbiIpOworICAgICAgICAgICAgbVNoYWRlci5hcHBlbmQoIiAgdmFyVGV4MCA9IEFUVFJJQl90ZXh0dXJlMDtcbiIpOwogICAgICAgICB9Ci0gICAgICAgIC8vbVNoYWRlci5hcHBlbmQoIiAgcG9zLnggPSBwb3MueCAvIDQ4MC4wO1xuIik7Ci0gICAgICAgIC8vbVNoYWRlci5hcHBlbmQoIiAgcG9zLnkgPSBwb3MueSAvIDgwMC4wO1xuIik7Ci0gICAgICAgIC8vbVNoYWRlci5hcHBlbmQoIiAgZ2xfUG9zaXRpb24gPSBwb3M7XG4iKTsKICAgICAgICAgbVNoYWRlci5hcHBlbmQoIn1cbiIpOwogICAgIH0KIH0KQEAgLTIwMSwxMSArMjE3LDEwIEBACiB7CiAgICAgLy9MT0dFKCJzZ2wyIHZ0eDEgJXgiLCBnbEdldEVycm9yKCkpOwogICAgIGlmICgoc3RhdGUtPm1MYXN0LmdldCgpID09IHRoaXMpICYmICFtRGlydHkpIHsKLSAgICAgICAgLy9yZXR1cm47CisgICAgICAgIHJldHVybjsKICAgICB9CiAKICAgICByc2MtPmNoZWNrRXJyb3IoIlByb2dyYW1WZXJ0ZXg6OnNldHVwR0wyIHN0YXJ0Iik7Ci0gICAgZ2xWZXJ0ZXhBdHRyaWI0ZigxLCBzdGF0ZS0+Y29sb3JbMF0sIHN0YXRlLT5jb2xvclsxXSwgc3RhdGUtPmNvbG9yWzJdLCBzdGF0ZS0+Y29sb3JbM10pOwogCiAgICAgY29uc3QgZmxvYXQgKmYgPSBzdGF0aWNfY2FzdDxjb25zdCBmbG9hdCAqPihtQ29uc3RhbnRzWzBdLT5nZXRQdHIoKSk7CiAKQEAgLTMwMyw2ICszMTgsMTIgQEAKICAgICBtRGlydHkgPSB0cnVlOwogfQogCit2b2lkIFByb2dyYW1WZXJ0ZXg6OmdldFByb2plY3Rpb25NYXRyaXgocnNjX01hdHJpeCAqbSkgY29uc3QKK3sKKyAgICBmbG9hdCAqZiA9IHN0YXRpY19jYXN0PGZsb2F0ICo+KG1Db25zdGFudHNbMF0tPmdldFB0cigpKTsKKyAgICBtZW1jcHkobSwgJmZbUlNfUFJPR1JBTV9WRVJURVhfUFJPSkVDVElPTl9PRkZTRVRdLCBzaXplb2YocnNjX01hdHJpeCkpOworfQorCiB2b2lkIFByb2dyYW1WZXJ0ZXg6OnRyYW5zZm9ybVRvU2NyZWVuKGNvbnN0IENvbnRleHQgKnJzYywgZmxvYXQgKnY0b3V0LCBjb25zdCBmbG9hdCAqdjNpbikgY29uc3QKIHsKICAgICBmbG9hdCAqZiA9IHN0YXRpY19jYXN0PGZsb2F0ICo+KG1Db25zdGFudHNbMF0tPmdldFB0cigpKTsKQEAgLTM1MSw2ICszNzIsMTYgQEAKICAgICBjcmVhdGVTaGFkZXIoKTsKIH0KIAordm9pZCBQcm9ncmFtVmVydGV4OjpzZXJpYWxpemUoT1N0cmVhbSAqc3RyZWFtKSBjb25zdAoreworCit9CisKK1Byb2dyYW1WZXJ0ZXggKlByb2dyYW1WZXJ0ZXg6OmNyZWF0ZUZyb21TdHJlYW0oQ29udGV4dCAqcnNjLCBJU3RyZWFtICpzdHJlYW0pCit7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIApAQCAtMzYyLDggKzM5Myw5IEBACiB7CiB9CiAKLXZvaWQgUHJvZ3JhbVZlcnRleFN0YXRlOjppbml0KENvbnRleHQgKnJzYywgaW50MzJfdCB3LCBpbnQzMl90IGgpCit2b2lkIFByb2dyYW1WZXJ0ZXhTdGF0ZTo6aW5pdChDb250ZXh0ICpyc2MpCiB7CisjaWZuZGVmIEFORFJPSURfUlNfQlVJTERfRk9SX0hPU1QKICAgICBSc0VsZW1lbnQgZSA9IChSc0VsZW1lbnQpIEVsZW1lbnQ6OmNyZWF0ZShyc2MsIFJTX1RZUEVfRkxPQVRfMzIsIFJTX0tJTkRfVVNFUiwgZmFsc2UsIDEpOwogCiAgICAgcnNpX1R5cGVCZWdpbihyc2MsIGUpOwpAQCAtMzcyLDIzICs0MDQsMjEgQEAKIAogICAgIFByb2dyYW1WZXJ0ZXggKnB2ID0gbmV3IFByb2dyYW1WZXJ0ZXgocnNjLCBmYWxzZSk7CiAgICAgQWxsb2NhdGlvbiAqYWxsb2MgPSAoQWxsb2NhdGlvbiAqKXJzaV9BbGxvY2F0aW9uQ3JlYXRlVHlwZWQocnNjLCBtQWxsb2NUeXBlLmdldCgpKTsKKwogICAgIG1EZWZhdWx0QWxsb2Muc2V0KGFsbG9jKTsKICAgICBtRGVmYXVsdC5zZXQocHYpOwogICAgIHB2LT5pbml0KHJzYyk7CiAgICAgcHYtPmJpbmRBbGxvY2F0aW9uKGFsbG9jLCAwKTsKIAotICAgIGNvbG9yWzBdID0gMS5mOwotICAgIGNvbG9yWzFdID0gMS5mOwotICAgIGNvbG9yWzJdID0gMS5mOwotICAgIGNvbG9yWzNdID0gMS5mOworICAgIHVwZGF0ZVNpemUocnNjKTsKKyNlbmRpZiAvL0FORFJPSURfUlNfQlVJTERfRk9SX0hPU1QKIAotICAgIHVwZGF0ZVNpemUocnNjLCB3LCBoKTsKIH0KIAotdm9pZCBQcm9ncmFtVmVydGV4U3RhdGU6OnVwZGF0ZVNpemUoQ29udGV4dCAqcnNjLCBpbnQzMl90IHcsIGludDMyX3QgaCkKK3ZvaWQgUHJvZ3JhbVZlcnRleFN0YXRlOjp1cGRhdGVTaXplKENvbnRleHQgKnJzYykKIHsKICAgICBNYXRyaXggbTsKLSAgICBtLmxvYWRPcnRobygwLHcsIGgsMCwgLTEsMSk7CisgICAgbS5sb2FkT3J0aG8oMCxyc2MtPmdldFdpZHRoKCksIHJzYy0+Z2V0SGVpZ2h0KCksMCwgLTEsMSk7CiAgICAgbURlZmF1bHRBbGxvYy0+c3ViRGF0YShSU19QUk9HUkFNX1ZFUlRFWF9QUk9KRUNUSU9OX09GRlNFVCwgMTYsICZtLm1bMF0sIDE2KjQpOwogCiAgICAgbS5sb2FkSWRlbnRpdHkoKTsKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNQcm9ncmFtVmVydGV4LmggYi9saWJzL3JzL3JzUHJvZ3JhbVZlcnRleC5oCmluZGV4IDI4NTU0Y2MuLmExN2M5ZWEgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNQcm9ncmFtVmVydGV4LmgKKysrIGIvbGlicy9ycy9yc1Byb2dyYW1WZXJ0ZXguaApAQCAtNDMsNiArNDMsNyBAQAogICAgIHZvaWQgYWRkTGlnaHQoY29uc3QgTGlnaHQgKik7CiAKICAgICB2b2lkIHNldFByb2plY3Rpb25NYXRyaXgoY29uc3QgcnNjX01hdHJpeCAqKSBjb25zdDsKKyAgICB2b2lkIGdldFByb2plY3Rpb25NYXRyaXgocnNjX01hdHJpeCAqKSBjb25zdDsKICAgICB2b2lkIHNldE1vZGVsdmlld01hdHJpeChjb25zdCByc2NfTWF0cml4ICopIGNvbnN0OwogICAgIHZvaWQgc2V0VGV4dHVyZU1hdHJpeChjb25zdCByc2NfTWF0cml4ICopIGNvbnN0OwogCkBAIC01Miw2ICs1Myw5IEBACiAgICAgdmlydHVhbCB2b2lkIGxvYWRTaGFkZXIoQ29udGV4dCAqKTsKICAgICB2aXJ0dWFsIHZvaWQgaW5pdChDb250ZXh0ICopOwogCisgICAgdmlydHVhbCB2b2lkIHNlcmlhbGl6ZShPU3RyZWFtICpzdHJlYW0pIGNvbnN0OworICAgIHZpcnR1YWwgUnNBM0RDbGFzc0lEIGdldENsYXNzSWQoKSBjb25zdCB7IHJldHVybiBSU19BM0RfQ0xBU1NfSURfUFJPR1JBTV9WRVJURVg7IH0KKyAgICBzdGF0aWMgUHJvZ3JhbVZlcnRleCAqY3JlYXRlRnJvbVN0cmVhbShDb250ZXh0ICpyc2MsIElTdHJlYW0gKnN0cmVhbSk7CiAKIHByb3RlY3RlZDoKICAgICB1aW50MzJfdCBtTGlnaHRDb3VudDsKQEAgLTcxLDE4ICs3NSwxNSBAQAogICAgIFByb2dyYW1WZXJ0ZXhTdGF0ZSgpOwogICAgIH5Qcm9ncmFtVmVydGV4U3RhdGUoKTsKIAotICAgIHZvaWQgaW5pdChDb250ZXh0ICpyc2MsIGludDMyX3QgdywgaW50MzJfdCBoKTsKKyAgICB2b2lkIGluaXQoQ29udGV4dCAqcnNjKTsKICAgICB2b2lkIGRlaW5pdChDb250ZXh0ICpyc2MpOwotICAgIHZvaWQgdXBkYXRlU2l6ZShDb250ZXh0ICpyc2MsIGludDMyX3QgdywgaW50MzJfdCBoKTsKKyAgICB2b2lkIHVwZGF0ZVNpemUoQ29udGV4dCAqcnNjKTsKIAogICAgIE9iamVjdEJhc2VSZWY8UHJvZ3JhbVZlcnRleD4gbURlZmF1bHQ7CiAgICAgT2JqZWN0QmFzZVJlZjxQcm9ncmFtVmVydGV4PiBtTGFzdDsKICAgICBPYmplY3RCYXNlUmVmPEFsbG9jYXRpb24+IG1EZWZhdWx0QWxsb2M7CiAKICAgICBPYmplY3RCYXNlUmVmPFR5cGU+IG1BbGxvY1R5cGU7Ci0KLQotICAgIGZsb2F0IGNvbG9yWzRdOwogfTsKIAogCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzU2FtcGxlci5jcHAgYi9saWJzL3JzL3JzU2FtcGxlci5jcHAKaW5kZXggNzFmNTA4Zi4uZjQxZjI5NSAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc1NhbXBsZXIuY3BwCisrKyBiL2xpYnMvcnMvcnNTYW1wbGVyLmNwcApAQCAtMTQsMTAgKzE0LDE2IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisjaWZuZGVmIEFORFJPSURfUlNfQlVJTERfRk9SX0hPU1QKICNpbmNsdWRlIDxHTEVTL2dsLmg+CiAjaW5jbHVkZSA8R0xFUy9nbGV4dC5oPgotCiAjaW5jbHVkZSAicnNDb250ZXh0LmgiCisjZWxzZQorI2luY2x1ZGUgInJzQ29udGV4dEhvc3RTdHViLmgiCisjaW5jbHVkZSA8T3BlbkdML2dsLmg+CisjaW5jbHVkZSA8T3BlbkdML2dsZXh0Lmg+CisjZW5kaWYgLy9BTkRST0lEX1JTX0JVSUxEX0ZPUl9IT1NUCisKICNpbmNsdWRlICJyc1NhbXBsZXIuaCIKIAogCkBAIC05NCw2ICsxMDAsMTcgQEAKICAgICBtQm91bmRTbG90ID0gLTE7CiAgICAgc3MtPm1TYW1wbGVyc1tzbG90XS5jbGVhcigpOwogfQorCit2b2lkIFNhbXBsZXI6OnNlcmlhbGl6ZShPU3RyZWFtICpzdHJlYW0pIGNvbnN0Cit7CisgICAgCit9CisKK1NhbXBsZXIgKlNhbXBsZXI6OmNyZWF0ZUZyb21TdHJlYW0oQ29udGV4dCAqcnNjLCBJU3RyZWFtICpzdHJlYW0pCit7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKIC8qCiB2b2lkIFNhbXBsZXJTdGF0ZTo6c2V0dXBHTCgpCiB7CmRpZmYgLS1naXQgYS9saWJzL3JzL3JzU2FtcGxlci5oIGIvbGlicy9ycy9yc1NhbXBsZXIuaAppbmRleCAwNTA2MDgxLi4zNzg2NDM5IDEwMDY0NAotLS0gYS9saWJzL3JzL3JzU2FtcGxlci5oCisrKyBiL2xpYnMvcnMvcnNTYW1wbGVyLmgKQEAgLTQ2LDYgKzQ2LDEwIEBACiAgICAgdm9pZCBiaW5kVG9Db250ZXh0KFNhbXBsZXJTdGF0ZSAqLCB1aW50MzJfdCBzbG90KTsKICAgICB2b2lkIHVuYmluZEZyb21Db250ZXh0KFNhbXBsZXJTdGF0ZSAqKTsKIAorICAgIHZpcnR1YWwgdm9pZCBzZXJpYWxpemUoT1N0cmVhbSAqc3RyZWFtKSBjb25zdDsKKyAgICB2aXJ0dWFsIFJzQTNEQ2xhc3NJRCBnZXRDbGFzc0lkKCkgY29uc3QgeyByZXR1cm4gUlNfQTNEX0NMQVNTX0lEX1NBTVBMRVI7IH0KKyAgICBzdGF0aWMgU2FtcGxlciAqY3JlYXRlRnJvbVN0cmVhbShDb250ZXh0ICpyc2MsIElTdHJlYW0gKnN0cmVhbSk7CisKIHByb3RlY3RlZDoKICAgICBSc1NhbXBsZXJWYWx1ZSBtTWFnRmlsdGVyOwogICAgIFJzU2FtcGxlclZhbHVlIG1NaW5GaWx0ZXI7CmRpZmYgLS1naXQgYS9saWJzL3JzL3JzU2NyaXB0LmNwcCBiL2xpYnMvcnMvcnNTY3JpcHQuY3BwCmluZGV4IGEzMzkzM2IuLmZjMjJmYzMgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNTY3JpcHQuY3BwCisrKyBiL2xpYnMvcnMvcnNTY3JpcHQuY3BwCkBAIC0yNCwxOSArMjQsMjUgQEAKICAgICBtQWxsb2NGaWxlID0gX19GSUxFX187CiAgICAgbUFsbG9jTGluZSA9IF9fTElORV9fOwogICAgIG1lbXNldCgmbUVudmlyb21lbnQsIDAsIHNpemVvZihtRW52aXJvbWVudCkpOwotICAgIG1FbnZpcm9tZW50Lm1DbGVhckNvbG9yWzBdID0gMDsKLSAgICBtRW52aXJvbWVudC5tQ2xlYXJDb2xvclsxXSA9IDA7Ci0gICAgbUVudmlyb21lbnQubUNsZWFyQ29sb3JbMl0gPSAwOwotICAgIG1FbnZpcm9tZW50Lm1DbGVhckNvbG9yWzNdID0gMTsKLSAgICBtRW52aXJvbWVudC5tQ2xlYXJEZXB0aCA9IDE7Ci0gICAgbUVudmlyb21lbnQubUNsZWFyU3RlbmNpbCA9IDA7Ci0gICAgbUVudmlyb21lbnQubUlzUm9vdCA9IGZhbHNlOwogfQogCiBTY3JpcHQ6On5TY3JpcHQoKQogewogfQogCit2b2lkIFNjcmlwdDo6c2V0VmFyKHVpbnQzMl90IHNsb3QsIGNvbnN0IHZvaWQgKnZhbCwgdWludDMyX3QgbGVuKQoreworICAgIGludDMyX3QgKmRlc3RQdHIgPSAoKGludDMyX3QgKiopbUVudmlyb21lbnQubUZpZWxkQWRkcmVzcylbc2xvdF07CisgICAgaWYgKGRlc3RQdHIpIHsKKyAgICAgICAgLy9MT0dFKCJzZXRWYXIgZjEgICVmIiwgKChjb25zdCBmbG9hdCAqKWRlc3RQdHIpWzBdKTsKKyAgICAgICAgLy9MT0dFKCJzZXRWYXIgJXAgJWkiLCBkZXN0UHRyLCBsZW4pOworICAgICAgICBtZW1jcHkoZGVzdFB0ciwgdmFsLCBsZW4pOworICAgICAgICAvL0xPR0UoInNldFZhciBmMiAgJWYiLCAoKGNvbnN0IGZsb2F0ICopZGVzdFB0cilbMF0pOworICAgIH0gZWxzZSB7CisgICAgICAgIExPR0UoIkNhbGxpbmcgc2V0VmFyIG9uIHNsb3QgPSAlaSB3aGljaCBpcyBudWxsIiwgc2xvdCk7CisgICAgfQorfQorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgcmVuZGVyc2NyaXB0IHsKIApAQCAtNDQsMTYgKzUwLDkgQEAKIHZvaWQgcnNpX1NjcmlwdEJpbmRBbGxvY2F0aW9uKENvbnRleHQgKiByc2MsIFJzU2NyaXB0IHZzLCBSc0FsbG9jYXRpb24gdmEsIHVpbnQzMl90IHNsb3QpCiB7CiAgICAgU2NyaXB0ICpzID0gc3RhdGljX2Nhc3Q8U2NyaXB0ICo+KHZzKTsKLSAgICBzLT5tU2xvdHNbc2xvdF0uc2V0KHN0YXRpY19jYXN0PEFsbG9jYXRpb24gKj4odmEpKTsKLX0KLQotdm9pZCByc2lfU2NyaXB0U2V0Q2xlYXJDb2xvcihDb250ZXh0ICogcnNjLCBSc1NjcmlwdCB2cywgZmxvYXQgciwgZmxvYXQgZywgZmxvYXQgYiwgZmxvYXQgYSkKLXsKLSAgICBTY3JpcHQgKnMgPSBzdGF0aWNfY2FzdDxTY3JpcHQgKj4odnMpOwotICAgIHMtPm1FbnZpcm9tZW50Lm1DbGVhckNvbG9yWzBdID0gcjsKLSAgICBzLT5tRW52aXJvbWVudC5tQ2xlYXJDb2xvclsxXSA9IGc7Ci0gICAgcy0+bUVudmlyb21lbnQubUNsZWFyQ29sb3JbMl0gPSBiOwotICAgIHMtPm1FbnZpcm9tZW50Lm1DbGVhckNvbG9yWzNdID0gYTsKKyAgICBBbGxvY2F0aW9uICphID0gc3RhdGljX2Nhc3Q8QWxsb2NhdGlvbiAqPih2YSk7CisgICAgcy0+bVNsb3RzW3Nsb3RdLnNldChhKTsKKyAgICAvL0xPR0UoInJzaV9TY3JpcHRCaW5kQWxsb2NhdGlvbiAlaSAgJXAgICVwIiwgc2xvdCwgYSwgYS0+Z2V0UHRyKCkpOwogfQogCiB2b2lkIHJzaV9TY3JpcHRTZXRUaW1lWm9uZShDb250ZXh0ICogcnNjLCBSc1NjcmlwdCB2cywgY29uc3QgY2hhciAqIHRpbWVab25lLCB1aW50MzJfdCBsZW5ndGgpCkBAIC02Miw1MyArNjEsNTEgQEAKICAgICBzLT5tRW52aXJvbWVudC5tVGltZVpvbmUgPSB0aW1lWm9uZTsKIH0KIAotdm9pZCByc2lfU2NyaXB0U2V0Q2xlYXJEZXB0aChDb250ZXh0ICogcnNjLCBSc1NjcmlwdCB2cywgZmxvYXQgdikKLXsKLSAgICBTY3JpcHQgKnMgPSBzdGF0aWNfY2FzdDxTY3JpcHQgKj4odnMpOwotICAgIHMtPm1FbnZpcm9tZW50Lm1DbGVhckRlcHRoID0gdjsKLX0KLQotdm9pZCByc2lfU2NyaXB0U2V0Q2xlYXJTdGVuY2lsKENvbnRleHQgKiByc2MsIFJzU2NyaXB0IHZzLCB1aW50MzJfdCB2KQotewotICAgIFNjcmlwdCAqcyA9IHN0YXRpY19jYXN0PFNjcmlwdCAqPih2cyk7Ci0gICAgcy0+bUVudmlyb21lbnQubUNsZWFyU3RlbmNpbCA9IHY7Ci19Ci0KIHZvaWQgcnNpX1NjcmlwdFNldFR5cGUoQ29udGV4dCAqIHJzYywgUnNUeXBlIHZ0LCB1aW50MzJfdCBzbG90LCBib29sIHdyaXRhYmxlLCBjb25zdCBjaGFyICpuYW1lKQogewogICAgIFNjcmlwdENTdGF0ZSAqc3MgPSAmcnNjLT5tU2NyaXB0QzsKICAgICBjb25zdCBUeXBlICp0ID0gc3RhdGljX2Nhc3Q8Y29uc3QgVHlwZSAqPih2dCk7CiAgICAgc3MtPm1Db25zdGFudEJ1ZmZlclR5cGVzW3Nsb3RdLnNldCh0KTsKICAgICBzcy0+bVNsb3RXcml0YWJsZVtzbG90XSA9IHdyaXRhYmxlOwotICAgIGlmIChuYW1lKSB7Ci0gICAgICAgIHNzLT5tU2xvdE5hbWVzW3Nsb3RdLnNldFRvKG5hbWUpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHNzLT5tU2xvdE5hbWVzW3Nsb3RdLnNldFRvKCIiKTsKLSAgICB9Ci19Ci0KLXZvaWQgcnNpX1NjcmlwdFNldEludm9rZShDb250ZXh0ICpyc2MsIGNvbnN0IGNoYXIgKm5hbWUsIHVpbnQzMl90IHNsb3QpCi17Ci0gICAgU2NyaXB0Q1N0YXRlICpzcyA9ICZyc2MtPm1TY3JpcHRDOwotICAgIHNzLT5tSW52b2thYmxlTmFtZXNbc2xvdF0gPSBuYW1lOworICAgIExPR0UoInJzaV9TY3JpcHRTZXRUeXBlIik7CiB9CiAKIHZvaWQgcnNpX1NjcmlwdEludm9rZShDb250ZXh0ICpyc2MsIFJzU2NyaXB0IHZzLCB1aW50MzJfdCBzbG90KQogewogICAgIFNjcmlwdCAqcyA9IHN0YXRpY19jYXN0PFNjcmlwdCAqPih2cyk7Ci0gICAgaWYgKHMtPm1FbnZpcm9tZW50Lm1JbnZva2FibGVzW3Nsb3RdID09IE5VTEwpIHsKLSAgICAgICAgcnNjLT5zZXRFcnJvcihSU19FUlJPUl9CQURfU0NSSVBULCAiQ2FsbGluZyBpbnZva2Ugb24gYmFkIHNjcmlwdCIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIHMtPnNldHVwU2NyaXB0KCk7Ci0gICAgcy0+bUVudmlyb21lbnQubUludm9rYWJsZXNbc2xvdF0oKTsKKyAgICBzLT5JbnZva2UocnNjLCBzbG90LCBOVUxMLCAwKTsKIH0KIAogCi12b2lkIHJzaV9TY3JpcHRTZXRSb290KENvbnRleHQgKiByc2MsIGJvb2wgaXNSb290KQordm9pZCByc2lfU2NyaXB0SW52b2tlRGF0YShDb250ZXh0ICpyc2MsIFJzU2NyaXB0IHZzLCB1aW50MzJfdCBzbG90LCB2b2lkICpkYXRhKQogewotICAgIFNjcmlwdENTdGF0ZSAqc3MgPSAmcnNjLT5tU2NyaXB0QzsKLSAgICBzcy0+bVNjcmlwdC0+bUVudmlyb21lbnQubUlzUm9vdCA9IGlzUm9vdDsKKyAgICBTY3JpcHQgKnMgPSBzdGF0aWNfY2FzdDxTY3JpcHQgKj4odnMpOworICAgIHMtPkludm9rZShyc2MsIHNsb3QsIE5VTEwsIDApOworfQorCit2b2lkIHJzaV9TY3JpcHRJbnZva2VWKENvbnRleHQgKnJzYywgUnNTY3JpcHQgdnMsIHVpbnQzMl90IHNsb3QsIGNvbnN0IHZvaWQgKmRhdGEsIHVpbnQzMl90IGxlbikKK3sKKyAgICBTY3JpcHQgKnMgPSBzdGF0aWNfY2FzdDxTY3JpcHQgKj4odnMpOworICAgIHMtPkludm9rZShyc2MsIHNsb3QsIGRhdGEsIGxlbik7Cit9CisKK3ZvaWQgcnNpX1NjcmlwdFNldFZhckkoQ29udGV4dCAqcnNjLCBSc1NjcmlwdCB2cywgdWludDMyX3Qgc2xvdCwgaW50IHZhbHVlKQoreworICAgIFNjcmlwdCAqcyA9IHN0YXRpY19jYXN0PFNjcmlwdCAqPih2cyk7CisgICAgcy0+c2V0VmFyKHNsb3QsICZ2YWx1ZSwgc2l6ZW9mKHZhbHVlKSk7Cit9CisKK3ZvaWQgcnNpX1NjcmlwdFNldFZhckYoQ29udGV4dCAqcnNjLCBSc1NjcmlwdCB2cywgdWludDMyX3Qgc2xvdCwgZmxvYXQgdmFsdWUpCit7CisgICAgU2NyaXB0ICpzID0gc3RhdGljX2Nhc3Q8U2NyaXB0ICo+KHZzKTsKKyAgICBzLT5zZXRWYXIoc2xvdCwgJnZhbHVlLCBzaXplb2YodmFsdWUpKTsKK30KKwordm9pZCByc2lfU2NyaXB0U2V0VmFyVihDb250ZXh0ICpyc2MsIFJzU2NyaXB0IHZzLCB1aW50MzJfdCBzbG90LCBjb25zdCB2b2lkICpkYXRhLCB1aW50MzJfdCBsZW4pCit7CisgICAgY29uc3QgZmxvYXQgKmZwID0gKGNvbnN0IGZsb2F0ICopZGF0YTsKKyAgICBTY3JpcHQgKnMgPSBzdGF0aWNfY2FzdDxTY3JpcHQgKj4odnMpOworICAgIHMtPnNldFZhcihzbG90LCBkYXRhLCBsZW4pOwogfQogCiAKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNTY3JpcHQuaCBiL2xpYnMvcnMvcnNTY3JpcHQuaAppbmRleCA1ZjRhNTM2Li4wYTIwMzQ0IDEwMDY0NAotLS0gYS9saWJzL3JzL3JzU2NyaXB0LmgKKysrIGIvbGlicy9ycy9yc1NjcmlwdC5oCkBAIC0yNyw5ICsyNyw5IEBACiBjbGFzcyBQcm9ncmFtVmVydGV4OwogY2xhc3MgUHJvZ3JhbUZyYWdtZW50OwogY2xhc3MgUHJvZ3JhbVJhc3RlcjsKLWNsYXNzIFByb2dyYW1GcmFnbWVudFN0b3JlOworY2xhc3MgUHJvZ3JhbVN0b3JlOwogCi0jZGVmaW5lIE1BWF9TQ1JJUFRfQkFOS1MgMTYKKyNkZWZpbmUgTUFYX1NDUklQVF9CQU5LUyAzMgogCiBjbGFzcyBTY3JpcHQgOiBwdWJsaWMgT2JqZWN0QmFzZQogewpAQCAtMzksMzggKzM5LDQzIEBACiAgICAgU2NyaXB0KENvbnRleHQgKik7CiAgICAgdmlydHVhbCB+U2NyaXB0KCk7CiAKLQogICAgIHN0cnVjdCBFbnZpcm9tZW50X3QgewotICAgICAgICBib29sIG1Jc1Jvb3Q7Ci0gICAgICAgIGZsb2F0IG1DbGVhckNvbG9yWzRdOwotICAgICAgICBmbG9hdCBtQ2xlYXJEZXB0aDsKLSAgICAgICAgdWludDMyX3QgbUNsZWFyU3RlbmNpbDsKLQotICAgICAgICB1aW50MzJfdCBtU3RhcnRUaW1lTWlsbGlzOworICAgICAgICBpbnQ2NF90IG1TdGFydFRpbWVNaWxsaXM7CisgICAgICAgIGludDY0X3QgbUxhc3REdFRpbWU7CiAgICAgICAgIGNvbnN0IGNoYXIqIG1UaW1lWm9uZTsKIAogICAgICAgICBPYmplY3RCYXNlUmVmPFByb2dyYW1WZXJ0ZXg+IG1WZXJ0ZXg7CiAgICAgICAgIE9iamVjdEJhc2VSZWY8UHJvZ3JhbUZyYWdtZW50PiBtRnJhZ21lbnQ7CiAgICAgICAgIE9iamVjdEJhc2VSZWY8UHJvZ3JhbVJhc3Rlcj4gbVJhc3RlcjsKLSAgICAgICAgT2JqZWN0QmFzZVJlZjxQcm9ncmFtRnJhZ21lbnRTdG9yZT4gbUZyYWdtZW50U3RvcmU7Ci0gICAgICAgIEludm9rZUZ1bmNfdCBtSW52b2thYmxlc1tNQVhfU0NSSVBUX0JBTktTXTsKKyAgICAgICAgT2JqZWN0QmFzZVJlZjxQcm9ncmFtU3RvcmU+IG1GcmFnbWVudFN0b3JlOworCisgICAgICAgIHVpbnQzMl90IG1JbnZva2VGdW5jdGlvbkNvdW50OworICAgICAgICBJbnZva2VGdW5jX3QgKm1JbnZva2VGdW5jdGlvbnM7CisgICAgICAgIHVpbnQzMl90IG1GaWVsZENvdW50OworICAgICAgICB2b2lkICoqIG1GaWVsZEFkZHJlc3M7CisKICAgICAgICAgY2hhciAqIG1TY3JpcHRUZXh0OwogICAgICAgICB1aW50MzJfdCBtU2NyaXB0VGV4dExlbmd0aDsKKworICAgICAgICBib29sIG1Jc1RocmVhZGFibGU7CiAgICAgfTsKICAgICBFbnZpcm9tZW50X3QgbUVudmlyb21lbnQ7CiAKLSAgICB1aW50MzJfdCBtQ291bnN0YW50QnVmZmVyQ291bnQ7Ci0KLQogICAgIE9iamVjdEJhc2VSZWY8QWxsb2NhdGlvbj4gbVNsb3RzW01BWF9TQ1JJUFRfQkFOS1NdOwogICAgIE9iamVjdEJhc2VSZWY8Y29uc3QgVHlwZT4gbVR5cGVzW01BWF9TQ1JJUFRfQkFOS1NdOwotICAgIFN0cmluZzggbVNsb3ROYW1lc1tNQVhfU0NSSVBUX0JBTktTXTsKICAgICBib29sIG1TbG90V3JpdGFibGVbTUFYX1NDUklQVF9CQU5LU107CiAKKyAgICB2b2lkIHNldFZhcih1aW50MzJfdCBzbG90LCBjb25zdCB2b2lkICp2YWwsIHVpbnQzMl90IGxlbik7CiAKKyAgICB2aXJ0dWFsIHZvaWQgcnVuRm9yRWFjaChDb250ZXh0ICpyc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWxsb2NhdGlvbiAqIGFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGxvY2F0aW9uICogYW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICogdXNyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJzU2NyaXB0Q2FsbCAqc2MgPSBOVUxMKSA9IDA7CiAKLSAgICB2aXJ0dWFsIHZvaWQgc2V0dXBTY3JpcHQoKSA9IDA7Ci0gICAgdmlydHVhbCB1aW50MzJfdCBydW4oQ29udGV4dCAqLCB1aW50MzJfdCBsYXVuY2hJRCkgPSAwOworICAgIHZpcnR1YWwgdm9pZCBJbnZva2UoQ29udGV4dCAqcnNjLCB1aW50MzJfdCBzbG90LCBjb25zdCB2b2lkICpkYXRhLCB1aW50MzJfdCBsZW4pID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0dXBTY3JpcHQoQ29udGV4dCAqcnNjKSA9IDA7CisgICAgdmlydHVhbCB1aW50MzJfdCBydW4oQ29udGV4dCAqKSA9IDA7CiB9OwogCiAKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNTY3JpcHRDLmNwcCBiL2xpYnMvcnMvcnNTY3JpcHRDLmNwcAppbmRleCBmNGQyNDUxLi5hMTQwZTIyIDEwMDY0NAotLS0gYS9saWJzL3JzL3JzU2NyaXB0Qy5jcHAKKysrIGIvbGlicy9ycy9yc1NjcmlwdEMuY3BwCkBAIC0xNyw4ICsxNyw3IEBACiAjaW5jbHVkZSAicnNDb250ZXh0LmgiCiAjaW5jbHVkZSAicnNTY3JpcHRDLmgiCiAjaW5jbHVkZSAicnNNYXRyaXguaCIKLQotI2luY2x1ZGUgImFjYy9hY2MuaCIKKyNpbmNsdWRlICIuLi8uLi8uLi9leHRlcm5hbC9sbHZtL2xpYmJjYy9pbmNsdWRlL2JjYy9iY2MuaCIKICNpbmNsdWRlICJ1dGlscy9UaW1lcnMuaCIKIAogI2luY2x1ZGUgPEdMRVMvZ2wuaD4KQEAgLTM3LDQwICszNiw3NCBAQAogewogICAgIG1BbGxvY0ZpbGUgPSBfX0ZJTEVfXzsKICAgICBtQWxsb2NMaW5lID0gX19MSU5FX187Ci0gICAgbUFjY1NjcmlwdCA9IE5VTEw7CisgICAgbUJjY1NjcmlwdCA9IE5VTEw7CiAgICAgbWVtc2V0KCZtUHJvZ3JhbSwgMCwgc2l6ZW9mKG1Qcm9ncmFtKSk7CiB9CiAKIFNjcmlwdEM6On5TY3JpcHRDKCkKIHsKLSAgICBpZiAobUFjY1NjcmlwdCkgewotICAgICAgICBhY2NEZWxldGVTY3JpcHQobUFjY1NjcmlwdCk7CisgICAgaWYgKG1CY2NTY3JpcHQpIHsKKyAgICAgICAgYmNjRGVsZXRlU2NyaXB0KG1CY2NTY3JpcHQpOwogICAgIH0KICAgICBmcmVlKG1FbnZpcm9tZW50Lm1TY3JpcHRUZXh0KTsKICAgICBtRW52aXJvbWVudC5tU2NyaXB0VGV4dCA9IE5VTEw7CiB9CiAKLXZvaWQgU2NyaXB0Qzo6c2V0dXBTY3JpcHQoKQordm9pZCBTY3JpcHRDOjpzZXR1cFNjcmlwdChDb250ZXh0ICpyc2MpCiB7Ci0gICAgZm9yIChpbnQgY3Q9MDsgY3QgPCBNQVhfU0NSSVBUX0JBTktTOyBjdCsrKSB7Ci0gICAgICAgIGlmIChtUHJvZ3JhbS5tU2xvdFBvaW50ZXJzW2N0XSkgewotICAgICAgICAgICAgKm1Qcm9ncmFtLm1TbG90UG9pbnRlcnNbY3RdID0gbVNsb3RzW2N0XS0+Z2V0UHRyKCk7CisgICAgc2V0dXBHTFN0YXRlKHJzYyk7CisgICAgbUVudmlyb21lbnQubVN0YXJ0VGltZU1pbGxpcworICAgICAgICAgICAgICAgID0gbmFub3NlY29uZHNfdG9fbWlsbGlzZWNvbmRzKHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKSk7CisKKyAgICBmb3IgKHVpbnQzMl90IGN0PTA7IGN0IDwgbUVudmlyb21lbnQubUZpZWxkQ291bnQ7IGN0KyspIHsKKyAgICAgICAgaWYgKCFtU2xvdHNbY3RdLmdldCgpKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIHZvaWQgKnB0ciA9IG1TbG90c1tjdF0tPmdldFB0cigpOworICAgICAgICB2b2lkICoqZGVzdCA9ICgodm9pZCAqKiopbUVudmlyb21lbnQubUZpZWxkQWRkcmVzcylbY3RdOworICAgICAgICAvL0xPR0UoInNldHVwU2NyaXB0ICVpICVwID0gJXAgICAgJXAgJWkiLCBjdCwgZGVzdCwgcHRyLCBtU2xvdHNbY3RdLT5nZXRUeXBlKCksIG1TbG90c1tjdF0tPmdldFR5cGUoKS0+Z2V0RGltWCgpKTsKKworICAgICAgICAvL2NvbnN0IHVpbnQzMl90ICpwMzIgPSAoY29uc3QgdWludDMyX3QgKilwdHI7CisgICAgICAgIC8vZm9yICh1aW50MzJfdCBjdDI9MDsgY3QyIDwgbVNsb3RzW2N0XS0+Z2V0VHlwZSgpLT5nZXREaW1YKCk7IGN0MisrKSB7CisgICAgICAgICAgICAvL0xPR0UoIiAgJWkgPSAweCUwOHggIiwgY3QyLCBwMzJbY3QyXSk7CisgICAgICAgIC8vfQorCisgICAgICAgIGlmIChkZXN0KSB7CisgICAgICAgICAgICAqZGVzdCA9IHB0cjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExPR0UoIlNjcmlwdEM6OnNldHVwU2NyaXB0LCBOVUxMIHZhciBiaW5kaW5nIGFkZHJlc3MuIik7CiAgICAgICAgIH0KICAgICB9CiB9CiAKLQotdWludDMyX3QgU2NyaXB0Qzo6cnVuKENvbnRleHQgKnJzYywgdWludDMyX3QgbGF1bmNoSW5kZXgpCitjb25zdCBBbGxvY2F0aW9uICpTY3JpcHRDOjpwdHJUb0FsbG9jYXRpb24oY29uc3Qgdm9pZCAqcHRyKSBjb25zdAogewotICAgIGlmIChtUHJvZ3JhbS5tU2NyaXB0ID09IE5VTEwpIHsKLSAgICAgICAgcnNjLT5zZXRFcnJvcihSU19FUlJPUl9CQURfU0NSSVBULCAiQXR0ZW1wdGVkIHRvIHJ1biBiYWQgc2NyaXB0Iik7Ci0gICAgICAgIHJldHVybiAwOworICAgIGlmICghcHRyKSB7CisgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KKyAgICBmb3IgKHVpbnQzMl90IGN0PTA7IGN0IDwgbUVudmlyb21lbnQubUZpZWxkQ291bnQ7IGN0KyspIHsKKyAgICAgICAgaWYgKCFtU2xvdHNbY3RdLmdldCgpKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGlmIChtU2xvdHNbY3RdLT5nZXRQdHIoKSA9PSBwdHIpIHsKKyAgICAgICAgICAgIHJldHVybiBtU2xvdHNbY3RdLmdldCgpOworICAgICAgICB9CisgICAgfQorICAgIExPR0UoIlNjcmlwdEM6OnB0clRvQWxsb2NhdGlvbiwgZmFpbGVkIHRvIGZpbmQgJXAiLCBwdHIpOworICAgIHJldHVybiBOVUxMOworfQogCi0gICAgQ29udGV4dDo6U2NyaXB0VExTU3RydWN0ICogdGxzID0KLSAgICAoQ29udGV4dDo6U2NyaXB0VExTU3RydWN0ICopcHRocmVhZF9nZXRzcGVjaWZpYyhDb250ZXh0OjpnVGhyZWFkVExTS2V5KTsKK1NjcmlwdCAqIFNjcmlwdEM6OnNldFRMUyhTY3JpcHQgKnNjKQoreworICAgIENvbnRleHQ6OlNjcmlwdFRMU1N0cnVjdCAqIHRscyA9IChDb250ZXh0OjpTY3JpcHRUTFNTdHJ1Y3QgKikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdGhyZWFkX2dldHNwZWNpZmljKENvbnRleHQ6OmdUaHJlYWRUTFNLZXkpOwogICAgIHJzQXNzZXJ0KHRscyk7CisgICAgU2NyaXB0ICpvbGQgPSB0bHMtPm1TY3JpcHQ7CisgICAgdGxzLT5tU2NyaXB0ID0gc2M7CisgICAgcmV0dXJuIG9sZDsKK30KIAorCit2b2lkIFNjcmlwdEM6OnNldHVwR0xTdGF0ZShDb250ZXh0ICpyc2MpCit7CiAgICAgaWYgKG1FbnZpcm9tZW50Lm1GcmFnbWVudFN0b3JlLmdldCgpKSB7CiAgICAgICAgIHJzYy0+c2V0RnJhZ21lbnRTdG9yZShtRW52aXJvbWVudC5tRnJhZ21lbnRTdG9yZS5nZXQoKSk7CiAgICAgfQpAQCAtODMsMjAgKzExNiwyMTQgQEAKICAgICBpZiAobUVudmlyb21lbnQubVJhc3Rlci5nZXQoKSkgewogICAgICAgICByc2MtPnNldFJhc3RlcihtRW52aXJvbWVudC5tUmFzdGVyLmdldCgpKTsKICAgICB9Cit9CiAKLSAgICBpZiAobGF1bmNoSW5kZXggPT0gMCkgewotICAgICAgICBtRW52aXJvbWVudC5tU3RhcnRUaW1lTWlsbGlzCi0gICAgICAgICAgICAgICAgPSBuYW5vc2Vjb25kc190b19taWxsaXNlY29uZHMoc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpKTsKK3VpbnQzMl90IFNjcmlwdEM6OnJ1bihDb250ZXh0ICpyc2MpCit7CisgICAgaWYgKG1Qcm9ncmFtLm1Sb290ID09IE5VTEwpIHsKKyAgICAgICAgcnNjLT5zZXRFcnJvcihSU19FUlJPUl9CQURfU0NSSVBULCAiQXR0ZW1wdGVkIHRvIHJ1biBiYWQgc2NyaXB0Iik7CisgICAgICAgIHJldHVybiAwOwogICAgIH0KLSAgICBzZXR1cFNjcmlwdCgpOworCisgICAgc2V0dXBTY3JpcHQocnNjKTsKIAogICAgIHVpbnQzMl90IHJldCA9IDA7Ci0gICAgdGxzLT5tU2NyaXB0ID0gdGhpczsKLSAgICByZXQgPSBtUHJvZ3JhbS5tU2NyaXB0KGxhdW5jaEluZGV4KTsKLSAgICB0bHMtPm1TY3JpcHQgPSBOVUxMOworICAgIFNjcmlwdCAqIG9sZFRMUyA9IHNldFRMUyh0aGlzKTsKKyAgICAvL0xPR0UoIlNjcmlwdEM6OnJ1biAlcCIsIG1Qcm9ncmFtLm1Sb290KTsKKyAgICByZXQgPSBtUHJvZ3JhbS5tUm9vdCgpOworICAgIHNldFRMUyhvbGRUTFMpOworICAgIC8vTE9HRSgiU2NyaXB0Qzo6cnVuIHJldCAlaSIsIHJldCk7CiAgICAgcmV0dXJuIHJldDsKIH0KIAorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ29udGV4dCAqcnNjOworICAgIFNjcmlwdEMgKnNjcmlwdDsKKyAgICBjb25zdCBBbGxvY2F0aW9uICogYWluOworICAgIEFsbG9jYXRpb24gKiBhb3V0OworICAgIGNvbnN0IHZvaWQgKiB1c3I7CisKKyAgICB1aW50MzJfdCBtU2xpY2VTaXplOworICAgIHZvbGF0aWxlIGludCBtU2xpY2VOdW07CisKKyAgICBjb25zdCB1aW50OF90ICpwdHJJbjsKKyAgICB1aW50MzJfdCBlU3RyaWRlSW47CisgICAgdWludDhfdCAqcHRyT3V0OworICAgIHVpbnQzMl90IGVTdHJpZGVPdXQ7CisKKyAgICB1aW50MzJfdCB4U3RhcnQ7CisgICAgdWludDMyX3QgeEVuZDsKKyAgICB1aW50MzJfdCB5U3RhcnQ7CisgICAgdWludDMyX3QgeUVuZDsKKyAgICB1aW50MzJfdCB6U3RhcnQ7CisgICAgdWludDMyX3QgekVuZDsKKyAgICB1aW50MzJfdCBhcnJheVN0YXJ0OworICAgIHVpbnQzMl90IGFycmF5RW5kOworCisgICAgdWludDMyX3QgZGltWDsKKyAgICB1aW50MzJfdCBkaW1ZOworICAgIHVpbnQzMl90IGRpbVo7CisgICAgdWludDMyX3QgZGltQXJyYXk7Cit9IE1UTGF1bmNoU3RydWN0OwordHlwZWRlZiBpbnQgKCpyc190KShjb25zdCB2b2lkICosIHZvaWQgKiwgY29uc3Qgdm9pZCAqLCB1aW50MzJfdCwgdWludDMyX3QsIHVpbnQzMl90LCB1aW50MzJfdCk7CisKK3N0YXRpYyB2b2lkIHdjX3h5KHZvaWQgKnVzciwgdWludDMyX3QgaWR4KQoreworICAgIE1UTGF1bmNoU3RydWN0ICptdGxzID0gKE1UTGF1bmNoU3RydWN0ICopdXNyOworCisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgdWludDMyX3Qgc2xpY2UgPSAodWludDMyX3QpYW5kcm9pZF9hdG9taWNfaW5jKCZtdGxzLT5tU2xpY2VOdW0pOworICAgICAgICB1aW50MzJfdCB5U3RhcnQgPSBtdGxzLT55U3RhcnQgKyBzbGljZSAqIG10bHMtPm1TbGljZVNpemU7CisgICAgICAgIHVpbnQzMl90IHlFbmQgPSB5U3RhcnQgKyBtdGxzLT5tU2xpY2VTaXplOworICAgICAgICB5RW5kID0gcnNNaW4oeUVuZCwgbXRscy0+eUVuZCk7CisgICAgICAgIGlmICh5RW5kIDw9IHlTdGFydCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy9MT0dFKCJ1c3IgaWR4ICVpLCB4ICVpLCVpICB5ICVpLCVpIiwgaWR4LCBtdGxzLT54U3RhcnQsIG10bHMtPnhFbmQsIHlTdGFydCwgeUVuZCk7CisKKyAgICAgICAgZm9yICh1aW50MzJfdCB5ID0geVN0YXJ0OyB5IDwgeUVuZDsgeSsrKSB7CisgICAgICAgICAgICB1aW50MzJfdCBvZmZzZXQgPSBtdGxzLT5kaW1YICogeTsKKyAgICAgICAgICAgIHVpbnQ4X3QgKnhQdHJPdXQgPSBtdGxzLT5wdHJPdXQgKyAobXRscy0+ZVN0cmlkZU91dCAqIG9mZnNldCk7CisgICAgICAgICAgICBjb25zdCB1aW50OF90ICp4UHRySW4gPSBtdGxzLT5wdHJJbiArIChtdGxzLT5lU3RyaWRlSW4gKiBvZmZzZXQpOworCisgICAgICAgICAgICBmb3IgKHVpbnQzMl90IHggPSBtdGxzLT54U3RhcnQ7IHggPCBtdGxzLT54RW5kOyB4KyspIHsKKyAgICAgICAgICAgICAgICAoKHJzX3QpbXRscy0+c2NyaXB0LT5tUHJvZ3JhbS5tUm9vdCkgKHhQdHJJbiwgeFB0ck91dCwgbXRscy0+dXNyLCB4LCB5LCAwLCAwKTsKKyAgICAgICAgICAgICAgICB4UHRySW4gKz0gbXRscy0+ZVN0cmlkZUluOworICAgICAgICAgICAgICAgIHhQdHJPdXQgKz0gbXRscy0+ZVN0cmlkZU91dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworfQorCit2b2lkIFNjcmlwdEM6OnJ1bkZvckVhY2goQ29udGV4dCAqcnNjLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFsbG9jYXRpb24gKiBhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgQWxsb2NhdGlvbiAqIGFvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqIHVzciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSc1NjcmlwdENhbGwgKnNjKQoreworICAgIE1UTGF1bmNoU3RydWN0IG10bHM7CisgICAgbWVtc2V0KCZtdGxzLCAwLCBzaXplb2YobXRscykpOworCisgICAgaWYgKGFpbikgeworICAgICAgICBtdGxzLmRpbVggPSBhaW4tPmdldFR5cGUoKS0+Z2V0RGltWCgpOworICAgICAgICBtdGxzLmRpbVkgPSBhaW4tPmdldFR5cGUoKS0+Z2V0RGltWSgpOworICAgICAgICBtdGxzLmRpbVogPSBhaW4tPmdldFR5cGUoKS0+Z2V0RGltWigpOworICAgICAgICAvL210bHMuZGltQXJyYXkgPSBhaW4tPmdldFR5cGUoKS0+Z2V0RGltQXJyYXkoKTsKKyAgICB9IGVsc2UgaWYgKGFvdXQpIHsKKyAgICAgICAgbXRscy5kaW1YID0gYW91dC0+Z2V0VHlwZSgpLT5nZXREaW1YKCk7CisgICAgICAgIG10bHMuZGltWSA9IGFvdXQtPmdldFR5cGUoKS0+Z2V0RGltWSgpOworICAgICAgICBtdGxzLmRpbVogPSBhb3V0LT5nZXRUeXBlKCktPmdldERpbVooKTsKKyAgICAgICAgLy9tdGxzLmRpbUFycmF5ID0gYW91dC0+Z2V0VHlwZSgpLT5nZXREaW1BcnJheSgpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJzYy0+c2V0RXJyb3IoUlNfRVJST1JfQkFEX1NDUklQVCwgInJzRm9yRWFjaCBjYWxsZWQgd2l0aCBudWxsIGFsbG9jYXRpb25zIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoIXNjIHx8IChzYy0+eEVuZCA9PSAwKSkgeworICAgICAgICBtdGxzLnhFbmQgPSBtdGxzLmRpbVg7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcnNBc3NlcnQoc2MtPnhTdGFydCA8IG10bHMuZGltWCk7CisgICAgICAgIHJzQXNzZXJ0KHNjLT54RW5kIDw9IG10bHMuZGltWCk7CisgICAgICAgIHJzQXNzZXJ0KHNjLT54U3RhcnQgPCBzYy0+eEVuZCk7CisgICAgICAgIG10bHMueFN0YXJ0ID0gcnNNaW4obXRscy5kaW1YLCBzYy0+eFN0YXJ0KTsKKyAgICAgICAgbXRscy54RW5kID0gcnNNaW4obXRscy5kaW1YLCBzYy0+eEVuZCk7CisgICAgICAgIGlmIChtdGxzLnhTdGFydCA+PSBtdGxzLnhFbmQpIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoIXNjIHx8IChzYy0+eUVuZCA9PSAwKSkgeworICAgICAgICBtdGxzLnlFbmQgPSBtdGxzLmRpbVk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcnNBc3NlcnQoc2MtPnlTdGFydCA8IG10bHMuZGltWSk7CisgICAgICAgIHJzQXNzZXJ0KHNjLT55RW5kIDw9IG10bHMuZGltWSk7CisgICAgICAgIHJzQXNzZXJ0KHNjLT55U3RhcnQgPCBzYy0+eUVuZCk7CisgICAgICAgIG10bHMueVN0YXJ0ID0gcnNNaW4obXRscy5kaW1ZLCBzYy0+eVN0YXJ0KTsKKyAgICAgICAgbXRscy55RW5kID0gcnNNaW4obXRscy5kaW1ZLCBzYy0+eUVuZCk7CisgICAgICAgIGlmIChtdGxzLnlTdGFydCA+PSBtdGxzLnlFbmQpIHJldHVybjsKKyAgICB9CisKKyAgICBtdGxzLnhFbmQgPSByc01heCgodWludDMyX3QpMSwgbXRscy54RW5kKTsKKyAgICBtdGxzLnlFbmQgPSByc01heCgodWludDMyX3QpMSwgbXRscy55RW5kKTsKKyAgICBtdGxzLnpFbmQgPSByc01heCgodWludDMyX3QpMSwgbXRscy56RW5kKTsKKyAgICBtdGxzLmFycmF5RW5kID0gcnNNYXgoKHVpbnQzMl90KTEsIG10bHMuYXJyYXlFbmQpOworCisgICAgcnNBc3NlcnQoYWluLT5nZXRUeXBlKCktPmdldERpbVooKSA9PSAwKTsKKworICAgIHNldHVwU2NyaXB0KHJzYyk7CisgICAgU2NyaXB0ICogb2xkVExTID0gc2V0VExTKHRoaXMpOworCisKKyAgICBtdGxzLnJzYyA9IHJzYzsKKyAgICBtdGxzLmFpbiA9IGFpbjsKKyAgICBtdGxzLmFvdXQgPSBhb3V0OworICAgIG10bHMuc2NyaXB0ID0gdGhpczsKKyAgICBtdGxzLnVzciA9IHVzcjsKKyAgICBtdGxzLm1TbGljZVNpemUgPSAxMDsKKyAgICBtdGxzLm1TbGljZU51bSA9IDA7CisKKyAgICBtdGxzLnB0ckluID0gTlVMTDsKKyAgICBtdGxzLmVTdHJpZGVJbiA9IDA7CisgICAgaWYgKGFpbikgeworICAgICAgICBtdGxzLnB0ckluID0gKGNvbnN0IHVpbnQ4X3QgKilhaW4tPmdldFB0cigpOworICAgICAgICBtdGxzLmVTdHJpZGVJbiA9IGFpbi0+Z2V0VHlwZSgpLT5nZXRFbGVtZW50U2l6ZUJ5dGVzKCk7CisgICAgfQorCisgICAgbXRscy5wdHJPdXQgPSBOVUxMOworICAgIG10bHMuZVN0cmlkZU91dCA9IDA7CisgICAgaWYgKGFvdXQpIHsKKyAgICAgICAgbXRscy5wdHJPdXQgPSAodWludDhfdCAqKWFvdXQtPmdldFB0cigpOworICAgICAgICBtdGxzLmVTdHJpZGVPdXQgPSBhb3V0LT5nZXRUeXBlKCktPmdldEVsZW1lbnRTaXplQnl0ZXMoKTsKKyAgICB9CisKKworICAgIGlmICgocnNjLT5nZXRXb3JrZXJQb29sU2l6ZSgpID4gMSkgJiYgbUVudmlyb21lbnQubUlzVGhyZWFkYWJsZSAmJgorICAgICAgICAoKG10bHMuZGltWSAqIG10bHMuZGltWiAqIG10bHMuZGltQXJyYXkpID4gMSkpIHsKKworICAgICAgICAvL0xPR0UoImxhdW5jaCAxIik7CisgICAgICAgIHJzYy0+bGF1bmNoVGhyZWFkcyh3Y194eSwgJm10bHMpOworICAgICAgICAvL0xPR0UoImxhdW5jaCAyIik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yICh1aW50MzJfdCBhciA9IG10bHMuYXJyYXlTdGFydDsgYXIgPCBtdGxzLmFycmF5RW5kOyBhcisrKSB7CisgICAgICAgICAgICBmb3IgKHVpbnQzMl90IHogPSBtdGxzLnpTdGFydDsgeiA8IG10bHMuekVuZDsgeisrKSB7CisgICAgICAgICAgICAgICAgZm9yICh1aW50MzJfdCB5ID0gbXRscy55U3RhcnQ7IHkgPCBtdGxzLnlFbmQ7IHkrKykgeworICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBvZmZzZXQgPSBtdGxzLmRpbVggKiBtdGxzLmRpbVkgKiBtdGxzLmRpbVogKiBhciArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG10bHMuZGltWCAqIG10bHMuZGltWSAqIHogKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdGxzLmRpbVggKiB5OworICAgICAgICAgICAgICAgICAgICB1aW50OF90ICp4UHRyT3V0ID0gbXRscy5wdHJPdXQgKyAobXRscy5lU3RyaWRlT3V0ICogb2Zmc2V0KTsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqeFB0ckluID0gbXRscy5wdHJJbiArIChtdGxzLmVTdHJpZGVJbiAqIG9mZnNldCk7CisKKyAgICAgICAgICAgICAgICAgICAgZm9yICh1aW50MzJfdCB4ID0gbXRscy54U3RhcnQ7IHggPCBtdGxzLnhFbmQ7IHgrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgKChyc190KW1Qcm9ncmFtLm1Sb290KSAoeFB0ckluLCB4UHRyT3V0LCB1c3IsIHgsIHksIHosIGFyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHhQdHJJbiArPSBtdGxzLmVTdHJpZGVJbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHhQdHJPdXQgKz0gbXRscy5lU3RyaWRlT3V0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgc2V0VExTKG9sZFRMUyk7Cit9CisKK3ZvaWQgU2NyaXB0Qzo6SW52b2tlKENvbnRleHQgKnJzYywgdWludDMyX3Qgc2xvdCwgY29uc3Qgdm9pZCAqZGF0YSwgdWludDMyX3QgbGVuKQoreworICAgIC8vTE9HRSgicnNpX1NjcmlwdEludm9rZSAlaSIsIHNsb3QpOworICAgIGlmICgoc2xvdCA+PSBtRW52aXJvbWVudC5tSW52b2tlRnVuY3Rpb25Db3VudCkgfHwKKyAgICAgICAgKG1FbnZpcm9tZW50Lm1JbnZva2VGdW5jdGlvbnNbc2xvdF0gPT0gTlVMTCkpIHsKKyAgICAgICAgcnNjLT5zZXRFcnJvcihSU19FUlJPUl9CQURfU0NSSVBULCAiQ2FsbGluZyBpbnZva2Ugb24gYmFkIHNjcmlwdCIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHNldHVwU2NyaXB0KHJzYyk7CisgICAgU2NyaXB0ICogb2xkVExTID0gc2V0VExTKHRoaXMpOworCisgICAgKCh2b2lkICgqKShjb25zdCB2b2lkICosIHVpbnQzMl90KSkKKyAgICAgICAgbUVudmlyb21lbnQubUludm9rZUZ1bmN0aW9uc1tzbG90XSkoZGF0YSwgbGVuKTsKKworICAgIHNldFRMUyhvbGRUTFMpOworfQorCiBTY3JpcHRDU3RhdGU6OlNjcmlwdENTdGF0ZSgpCiB7CiAgICAgbVNjcmlwdCA9IE5VTEw7CkBAIC0xMTMsMjEgKzM0MCwyNyBAQAogewogICAgIGZvciAodWludDMyX3QgY3Q9MDsgY3QgPCBNQVhfU0NSSVBUX0JBTktTOyBjdCsrKSB7CiAgICAgICAgIG1Db25zdGFudEJ1ZmZlclR5cGVzW2N0XS5jbGVhcigpOwotICAgICAgICBtU2xvdE5hbWVzW2N0XS5zZXRUbygiIik7Ci0gICAgICAgIG1JbnZva2FibGVOYW1lc1tjdF0uc2V0VG8oIiIpOwogICAgICAgICBtU2xvdFdyaXRhYmxlW2N0XSA9IGZhbHNlOwogICAgIH0KIAogICAgIGRlbGV0ZSBtU2NyaXB0OwogICAgIG1TY3JpcHQgPSBuZXcgU2NyaXB0QyhOVUxMKTsKLQotICAgIG1JbnQzMkRlZmluZXMuY2xlYXIoKTsKLSAgICBtRmxvYXREZWZpbmVzLmNsZWFyKCk7CiB9CiAKLXN0YXRpYyBBQ0N2b2lkKiBzeW1ib2xMb29rdXAoQUNDdm9pZCogcENvbnRleHQsIGNvbnN0IEFDQ2NoYXIqIG5hbWUpCitzdGF0aWMgQkNDdm9pZCogc3ltYm9sTG9va3VwKEJDQ3ZvaWQqIHBDb250ZXh0LCBjb25zdCBCQ0NjaGFyKiBuYW1lKQogewotICAgIGNvbnN0IFNjcmlwdENTdGF0ZTo6U3ltYm9sVGFibGVfdCAqc3ltID0gU2NyaXB0Q1N0YXRlOjpsb29rdXBTeW1ib2wobmFtZSk7CisgICAgY29uc3QgU2NyaXB0Q1N0YXRlOjpTeW1ib2xUYWJsZV90ICpzeW07CisgICAgU2NyaXB0QyAqcyA9IChTY3JpcHRDICopcENvbnRleHQ7CisgICAgc3ltID0gU2NyaXB0Q1N0YXRlOjpsb29rdXBTeW1ib2wobmFtZSk7CisgICAgaWYgKHN5bSkgeworICAgICAgICByZXR1cm4gc3ltLT5tUHRyOworICAgIH0KKyAgICBzLT5tRW52aXJvbWVudC5tSXNUaHJlYWRhYmxlID0gZmFsc2U7CisgICAgc3ltID0gU2NyaXB0Q1N0YXRlOjpsb29rdXBTeW1ib2xDTChuYW1lKTsKKyAgICBpZiAoc3ltKSB7CisgICAgICAgIHJldHVybiBzeW0tPm1QdHI7CisgICAgfQorICAgIHN5bSA9IFNjcmlwdENTdGF0ZTo6bG9va3VwU3ltYm9sR0wobmFtZSk7CiAgICAgaWYgKHN5bSkgewogICAgICAgICByZXR1cm4gc3ltLT5tUHRyOwogICAgIH0KQEAgLTEzNyw2NSArMzcwLDUzIEBACiAKIHZvaWQgU2NyaXB0Q1N0YXRlOjpydW5Db21waWxlcihDb250ZXh0ICpyc2MsIFNjcmlwdEMgKnMpCiB7Ci0gICAgcy0+bUFjY1NjcmlwdCA9IGFjY0NyZWF0ZVNjcmlwdCgpOwotICAgIFN0cmluZzggdG1wOworICAgIExPR1YoIlNjcmlwdENTdGF0ZTo6cnVuQ29tcGlsZXIgIik7CiAKLSAgICByc2MtPmFwcGVuZE5hbWVEZWZpbmVzKCZ0bXApOwotICAgIGFwcGVuZERlY2xzKCZ0bXApOwotICAgIGFwcGVuZFZhckRlZmluZXMocnNjLCAmdG1wKTsKLSAgICBhcHBlbmRUeXBlcyhyc2MsICZ0bXApOwotICAgIHRtcC5hcHBlbmQoIiNsaW5lIDFcbiIpOwotCi0gICAgY29uc3QgY2hhciogc2NyaXB0U291cmNlW10gPSB7dG1wLnN0cmluZygpLCBzLT5tRW52aXJvbWVudC5tU2NyaXB0VGV4dH07Ci0gICAgaW50IHNjcmlwdExlbmd0aFtdID0ge3RtcC5sZW5ndGgoKSwgcy0+bUVudmlyb21lbnQubVNjcmlwdFRleHRMZW5ndGh9IDsKLSAgICBhY2NTY3JpcHRTb3VyY2Uocy0+bUFjY1NjcmlwdCwgc2l6ZW9mKHNjcmlwdExlbmd0aCkgLyBzaXplb2YoaW50KSwgc2NyaXB0U291cmNlLCBzY3JpcHRMZW5ndGgpOwotICAgIGFjY1JlZ2lzdGVyU3ltYm9sQ2FsbGJhY2socy0+bUFjY1NjcmlwdCwgc3ltYm9sTG9va3VwLCBOVUxMKTsKLSAgICBhY2NDb21waWxlU2NyaXB0KHMtPm1BY2NTY3JpcHQpOwotICAgIGFjY0dldFNjcmlwdExhYmVsKHMtPm1BY2NTY3JpcHQsICJtYWluIiwgKEFDQ3ZvaWQqKikgJnMtPm1Qcm9ncmFtLm1TY3JpcHQpOwotICAgIGFjY0dldFNjcmlwdExhYmVsKHMtPm1BY2NTY3JpcHQsICJpbml0IiwgKEFDQ3ZvaWQqKikgJnMtPm1Qcm9ncmFtLm1Jbml0KTsKLSAgICByc0Fzc2VydChzLT5tUHJvZ3JhbS5tU2NyaXB0KTsKLQotICAgIGlmICghcy0+bVByb2dyYW0ubVNjcmlwdCkgewotICAgICAgICBBQ0NjaGFyIGJ1Zls0MDk2XTsKLSAgICAgICAgQUNDc2l6ZWkgbGVuOwotICAgICAgICBhY2NHZXRTY3JpcHRJbmZvTG9nKHMtPm1BY2NTY3JpcHQsIHNpemVvZihidWYpLCAmbGVuLCBidWYpOwotICAgICAgICBMT0dFKCIlcyIsIGJ1Zik7Ci0gICAgICAgIHJzYy0+c2V0RXJyb3IoUlNfRVJST1JfQkFEX1NDUklQVCwgIkVycm9yIGNvbXBpbGluZyB1c2VyIHNjcmlwdC4iKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KKyAgICBzLT5tQmNjU2NyaXB0ID0gYmNjQ3JlYXRlU2NyaXB0KCk7CisgICAgcy0+bUVudmlyb21lbnQubUlzVGhyZWFkYWJsZSA9IHRydWU7CisgICAgYmNjU2NyaXB0Qml0Y29kZShzLT5tQmNjU2NyaXB0LCBzLT5tRW52aXJvbWVudC5tU2NyaXB0VGV4dCwgcy0+bUVudmlyb21lbnQubVNjcmlwdFRleHRMZW5ndGgpOworICAgIGJjY1JlZ2lzdGVyU3ltYm9sQ2FsbGJhY2socy0+bUJjY1NjcmlwdCwgc3ltYm9sTG9va3VwLCBzKTsKKyAgICBiY2NDb21waWxlU2NyaXB0KHMtPm1CY2NTY3JpcHQpOworICAgIGJjY0dldFNjcmlwdExhYmVsKHMtPm1CY2NTY3JpcHQsICJyb290IiwgKEJDQ3ZvaWQqKikgJnMtPm1Qcm9ncmFtLm1Sb290KTsKKyAgICBiY2NHZXRTY3JpcHRMYWJlbChzLT5tQmNjU2NyaXB0LCAiaW5pdCIsIChCQ0N2b2lkKiopICZzLT5tUHJvZ3JhbS5tSW5pdCk7CisgICAgTE9HVigicm9vdCAlcCwgIGluaXQgJXAiLCBzLT5tUHJvZ3JhbS5tUm9vdCwgcy0+bVByb2dyYW0ubUluaXQpOwogCiAgICAgaWYgKHMtPm1Qcm9ncmFtLm1Jbml0KSB7CiAgICAgICAgIHMtPm1Qcm9ncmFtLm1Jbml0KCk7CiAgICAgfQogCi0gICAgZm9yIChpbnQgY3Q9MDsgY3QgPCBNQVhfU0NSSVBUX0JBTktTOyBjdCsrKSB7Ci0gICAgICAgIGlmIChtU2xvdE5hbWVzW2N0XS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgIGFjY0dldFNjcmlwdExhYmVsKHMtPm1BY2NTY3JpcHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2xvdE5hbWVzW2N0XS5zdHJpbmcoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBQ0N2b2lkKiopICZzLT5tUHJvZ3JhbS5tU2xvdFBvaW50ZXJzW2N0XSk7Ci0gICAgICAgIH0KKyAgICBiY2NHZXRFeHBvcnRGdW5jcyhzLT5tQmNjU2NyaXB0LCAoQkNDc2l6ZWkqKSAmcy0+bUVudmlyb21lbnQubUludm9rZUZ1bmN0aW9uQ291bnQsIDAsIE5VTEwpOworICAgIGlmKHMtPm1FbnZpcm9tZW50Lm1JbnZva2VGdW5jdGlvbkNvdW50IDw9IDApCisgICAgICAgIHMtPm1FbnZpcm9tZW50Lm1JbnZva2VGdW5jdGlvbnMgPSBOVUxMOworICAgIGVsc2UgeworICAgICAgICBzLT5tRW52aXJvbWVudC5tSW52b2tlRnVuY3Rpb25zID0gKFNjcmlwdDo6SW52b2tlRnVuY190KikgY2FsbG9jKHMtPm1FbnZpcm9tZW50Lm1JbnZva2VGdW5jdGlvbkNvdW50LCBzaXplb2YoU2NyaXB0OjpJbnZva2VGdW5jX3QpKTsKKyAgICAgICAgYmNjR2V0RXhwb3J0RnVuY3Mocy0+bUJjY1NjcmlwdCwgTlVMTCwgcy0+bUVudmlyb21lbnQubUludm9rZUZ1bmN0aW9uQ291bnQsIChCQ0N2b2lkICoqKSBzLT5tRW52aXJvbWVudC5tSW52b2tlRnVuY3Rpb25zKTsKICAgICB9CiAKLSAgICBmb3IgKGludCBjdD0wOyBjdCA8IE1BWF9TQ1JJUFRfQkFOS1M7IGN0KyspIHsKLSAgICAgICAgaWYgKG1JbnZva2FibGVOYW1lc1tjdF0ubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICBhY2NHZXRTY3JpcHRMYWJlbChzLT5tQWNjU2NyaXB0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUludm9rYWJsZU5hbWVzW2N0XS5zdHJpbmcoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBQ0N2b2lkKiopICZzLT5tRW52aXJvbWVudC5tSW52b2thYmxlc1tjdF0pOwotICAgICAgICB9CisgICAgYmNjR2V0RXhwb3J0VmFycyhzLT5tQmNjU2NyaXB0LCAoQkNDc2l6ZWkqKSAmcy0+bUVudmlyb21lbnQubUZpZWxkQ291bnQsIDAsIE5VTEwpOworICAgIGlmKHMtPm1FbnZpcm9tZW50Lm1GaWVsZENvdW50IDw9IDApCisgICAgICAgIHMtPm1FbnZpcm9tZW50Lm1GaWVsZEFkZHJlc3MgPSBOVUxMOworICAgIGVsc2UgeworICAgICAgICBzLT5tRW52aXJvbWVudC5tRmllbGRBZGRyZXNzID0gKHZvaWQgKiopIGNhbGxvYyhzLT5tRW52aXJvbWVudC5tRmllbGRDb3VudCwgc2l6ZW9mKHZvaWQgKikpOworICAgICAgICBiY2NHZXRFeHBvcnRWYXJzKHMtPm1CY2NTY3JpcHQsIE5VTEwsIHMtPm1FbnZpcm9tZW50Lm1GaWVsZENvdW50LCAoQkNDdm9pZCAqKikgcy0+bUVudmlyb21lbnQubUZpZWxkQWRkcmVzcyk7CiAgICAgfQorICAgIC8vZm9yIChpbnQgY3QyPTA7IGN0MiA8IHMtPm1FbnZpcm9tZW50Lm1GaWVsZENvdW50OyBjdDIrKyApIHsKKyAgICAgICAgLy9MT0dFKCJTY3JpcHQgZmllbGQgJWkgPSAlcCIsIGN0Miwgcy0+bUVudmlyb21lbnQubUZpZWxkQWRkcmVzc1tjdDJdKTsKKyAgICAvL30KIAogICAgIHMtPm1FbnZpcm9tZW50Lm1GcmFnbWVudC5zZXQocnNjLT5nZXREZWZhdWx0UHJvZ3JhbUZyYWdtZW50KCkpOwogICAgIHMtPm1FbnZpcm9tZW50Lm1WZXJ0ZXguc2V0KHJzYy0+Z2V0RGVmYXVsdFByb2dyYW1WZXJ0ZXgoKSk7Ci0gICAgcy0+bUVudmlyb21lbnQubUZyYWdtZW50U3RvcmUuc2V0KHJzYy0+Z2V0RGVmYXVsdFByb2dyYW1GcmFnbWVudFN0b3JlKCkpOworICAgIHMtPm1FbnZpcm9tZW50Lm1GcmFnbWVudFN0b3JlLnNldChyc2MtPmdldERlZmF1bHRQcm9ncmFtU3RvcmUoKSk7CiAgICAgcy0+bUVudmlyb21lbnQubVJhc3Rlci5zZXQocnNjLT5nZXREZWZhdWx0UHJvZ3JhbVJhc3RlcigpKTsKIAotICAgIGlmIChzLT5tUHJvZ3JhbS5tU2NyaXB0KSB7CisgICAgaWYgKHMtPm1Qcm9ncmFtLm1Sb290KSB7CiAgICAgICAgIGNvbnN0IHN0YXRpYyBpbnQgcHJhZ21hTWF4ID0gMTY7Ci0gICAgICAgIEFDQ3NpemVpIHByYWdtYUNvdW50OwotICAgICAgICBBQ0NjaGFyICogc3RyW3ByYWdtYU1heF07Ci0gICAgICAgIGFjY0dldFByYWdtYXMocy0+bUFjY1NjcmlwdCwgJnByYWdtYUNvdW50LCBwcmFnbWFNYXgsICZzdHJbMF0pOworICAgICAgICBCQ0NzaXplaSBwcmFnbWFDb3VudDsKKyAgICAgICAgQkNDY2hhciAqIHN0cltwcmFnbWFNYXhdOworICAgICAgICBiY2NHZXRQcmFnbWFzKHMtPm1CY2NTY3JpcHQsICZwcmFnbWFDb3VudCwgcHJhZ21hTWF4LCAmc3RyWzBdKTsKIAogICAgICAgICBmb3IgKGludCBjdD0wOyBjdCA8IHByYWdtYUNvdW50OyBjdCs9MikgeworICAgICAgICAgICAgLy9MT0dFKCJwcmFnbWUgJXMgJXMiLCBzdHJbY3RdLCBzdHJbY3QrMV0pOwogICAgICAgICAgICAgaWYgKCFzdHJjbXAoc3RyW2N0XSwgInZlcnNpb24iKSkgewogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQpAQCAtMjA4LDExICs0MjksNiBAQAogICAgICAgICAgICAgICAgICAgICBzLT5tRW52aXJvbWVudC5tVmVydGV4LmNsZWFyKCk7CiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBQcm9ncmFtVmVydGV4ICogcHYgPSAoUHJvZ3JhbVZlcnRleCAqKXJzYy0+bG9va3VwTmFtZShzdHJbY3QrMV0pOwotICAgICAgICAgICAgICAgIGlmIChwdiAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIHMtPm1FbnZpcm9tZW50Lm1WZXJ0ZXguc2V0KHB2KTsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIExPR0UoIlVucmVjb25pemVkIHZhbHVlICVzIHBhc3NlZCB0byBzdGF0ZVZlcnRleCIsIHN0cltjdCsxXSk7CiAgICAgICAgICAgICB9CiAKQEAgLTIyNCwxMSArNDQwLDYgQEAKICAgICAgICAgICAgICAgICAgICAgcy0+bUVudmlyb21lbnQubVJhc3Rlci5jbGVhcigpOwogICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgUHJvZ3JhbVJhc3RlciAqIHByID0gKFByb2dyYW1SYXN0ZXIgKilyc2MtPmxvb2t1cE5hbWUoc3RyW2N0KzFdKTsKLSAgICAgICAgICAgICAgICBpZiAocHIgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBzLT5tRW52aXJvbWVudC5tUmFzdGVyLnNldChwcik7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBMT0dFKCJVbnJlY29uaXplZCB2YWx1ZSAlcyBwYXNzZWQgdG8gc3RhdGVSYXN0ZXIiLCBzdHJbY3QrMV0pOwogICAgICAgICAgICAgfQogCkBAIC0yNDAsMTEgKzQ1MSw2IEBACiAgICAgICAgICAgICAgICAgICAgIHMtPm1FbnZpcm9tZW50Lm1GcmFnbWVudC5jbGVhcigpOwogICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgUHJvZ3JhbUZyYWdtZW50ICogcGYgPSAoUHJvZ3JhbUZyYWdtZW50ICopcnNjLT5sb29rdXBOYW1lKHN0cltjdCsxXSk7Ci0gICAgICAgICAgICAgICAgaWYgKHBmICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgcy0+bUVudmlyb21lbnQubUZyYWdtZW50LnNldChwZik7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBMT0dFKCJVbnJlY29uaXplZCB2YWx1ZSAlcyBwYXNzZWQgdG8gc3RhdGVGcmFnbWVudCIsIHN0cltjdCsxXSk7CiAgICAgICAgICAgICB9CiAKQEAgLTI1NiwxMiArNDYyLDYgQEAKICAgICAgICAgICAgICAgICAgICAgcy0+bUVudmlyb21lbnQubUZyYWdtZW50U3RvcmUuY2xlYXIoKTsKICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFByb2dyYW1GcmFnbWVudFN0b3JlICogcGZzID0KLSAgICAgICAgICAgICAgICAgICAgKFByb2dyYW1GcmFnbWVudFN0b3JlICopcnNjLT5sb29rdXBOYW1lKHN0cltjdCsxXSk7Ci0gICAgICAgICAgICAgICAgaWYgKHBmcyAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIHMtPm1FbnZpcm9tZW50Lm1GcmFnbWVudFN0b3JlLnNldChwZnMpOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgTE9HRSgiVW5yZWNvbml6ZWQgdmFsdWUgJXMgcGFzc2VkIHRvIHN0YXRlU3RvcmUiLCBzdHJbY3QrMV0pOwogICAgICAgICAgICAgfQogCkBAIC0yNzMsMTExICs0NzMsNiBAQAogICAgIH0KIH0KIAotc3RhdGljIHZvaWQgYXBwZW5kRWxlbWVudEJvZHkoU3RyaW5nOCAqcywgY29uc3QgRWxlbWVudCAqZSkKLXsKLSAgICBzLT5hcHBlbmQoIiB7XG4iKTsKLSAgICBmb3IgKHNpemVfdCBjdDI9MDsgY3QyIDwgZS0+Z2V0RmllbGRDb3VudCgpOyBjdDIrKykgewotICAgICAgICBjb25zdCBFbGVtZW50ICpjID0gZS0+Z2V0RmllbGQoY3QyKTsKLSAgICAgICAgcy0+YXBwZW5kKCIgICAgIik7Ci0gICAgICAgIHMtPmFwcGVuZChjLT5nZXRDVHlwZSgpKTsKLSAgICAgICAgcy0+YXBwZW5kKCIgIik7Ci0gICAgICAgIHMtPmFwcGVuZChlLT5nZXRGaWVsZE5hbWUoY3QyKSk7Ci0gICAgICAgIHMtPmFwcGVuZCgiO1xuIik7Ci0gICAgfQotICAgIHMtPmFwcGVuZCgifSIpOwotfQotCi12b2lkIFNjcmlwdENTdGF0ZTo6YXBwZW5kVmFyRGVmaW5lcyhjb25zdCBDb250ZXh0ICpyc2MsIFN0cmluZzggKnN0cikKLXsKLSAgICBjaGFyIGJ1ZlsyNTZdOwotICAgIGlmIChyc2MtPnByb3BzLm1Mb2dTY3JpcHRzKSB7Ci0gICAgICAgIExPR0QoImFwcGVuZFZhckRlZmluZXMgbUludDMyRGVmaW5lcy5zaXplKCk9JWQgbUZsb2F0RGVmaW5lcy5zaXplKCk9JWRcbiIsCi0gICAgICAgICAgICAgICAgbUludDMyRGVmaW5lcy5zaXplKCksIG1GbG9hdERlZmluZXMuc2l6ZSgpKTsKLSAgICB9Ci0gICAgZm9yIChzaXplX3QgY3Q9MDsgY3QgPCBtSW50MzJEZWZpbmVzLnNpemUoKTsgY3QrKykgewotICAgICAgICBzdHItPmFwcGVuZCgiI2RlZmluZSAiKTsKLSAgICAgICAgc3RyLT5hcHBlbmQobUludDMyRGVmaW5lcy5rZXlBdChjdCkpOwotICAgICAgICBzdHItPmFwcGVuZCgiICIpOwotICAgICAgICBzcHJpbnRmKGJ1ZiwgIiVpXG4iLCAoaW50KW1JbnQzMkRlZmluZXMudmFsdWVBdChjdCkpOwotICAgICAgICBzdHItPmFwcGVuZChidWYpOwotICAgIH0KLSAgICBmb3IgKHNpemVfdCBjdD0wOyBjdCA8IG1GbG9hdERlZmluZXMuc2l6ZSgpOyBjdCsrKSB7Ci0gICAgICAgIHN0ci0+YXBwZW5kKCIjZGVmaW5lICIpOwotICAgICAgICBzdHItPmFwcGVuZChtRmxvYXREZWZpbmVzLmtleUF0KGN0KSk7Ci0gICAgICAgIHN0ci0+YXBwZW5kKCIgIik7Ci0gICAgICAgIHNwcmludGYoYnVmLCAiJWZmXG4iLCBtRmxvYXREZWZpbmVzLnZhbHVlQXQoY3QpKTsKLSAgICAgICAgc3RyLT5hcHBlbmQoYnVmKTsKLSAgICB9Ci19Ci0KLQotCi12b2lkIFNjcmlwdENTdGF0ZTo6YXBwZW5kVHlwZXMoY29uc3QgQ29udGV4dCAqcnNjLCBTdHJpbmc4ICpzdHIpCi17Ci0gICAgY2hhciBidWZbMjU2XTsKLSAgICBTdHJpbmc4IHRtcDsKLQotICAgIHN0ci0+YXBwZW5kKCJzdHJ1Y3QgdmVjRjMyXzJfcyB7ZmxvYXQgeDsgZmxvYXQgeTt9O1xuIik7Ci0gICAgc3RyLT5hcHBlbmQoInN0cnVjdCB2ZWNGMzJfM19zIHtmbG9hdCB4OyBmbG9hdCB5OyBmbG9hdCB6O307XG4iKTsKLSAgICBzdHItPmFwcGVuZCgic3RydWN0IHZlY0YzMl80X3Mge2Zsb2F0IHg7IGZsb2F0IHk7IGZsb2F0IHo7IGZsb2F0IHc7fTtcbiIpOwotICAgIHN0ci0+YXBwZW5kKCJzdHJ1Y3QgdmVjVThfNF9zIHtjaGFyIHI7IGNoYXIgZzsgY2hhciBiOyBjaGFyIGE7fTtcbiIpOwotICAgIHN0ci0+YXBwZW5kKCIjZGVmaW5lIHZlY0YzMl8yX3Qgc3RydWN0IHZlY0YzMl8yX3NcbiIpOwotICAgIHN0ci0+YXBwZW5kKCIjZGVmaW5lIHZlY0YzMl8zX3Qgc3RydWN0IHZlY0YzMl8zX3NcbiIpOwotICAgIHN0ci0+YXBwZW5kKCIjZGVmaW5lIHZlY0YzMl80X3Qgc3RydWN0IHZlY0YzMl80X3NcbiIpOwotICAgIHN0ci0+YXBwZW5kKCIjZGVmaW5lIHZlY1U4XzRfdCBzdHJ1Y3QgdmVjVThfNF9zXG4iKTsKLSAgICBzdHItPmFwcGVuZCgiI2RlZmluZSB2ZWNJOF80X3Qgc3RydWN0IHZlY1U4XzRfc1xuIik7Ci0KLSAgICBmb3IgKHNpemVfdCBjdD0wOyBjdCA8IE1BWF9TQ1JJUFRfQkFOS1M7IGN0KyspIHsKLSAgICAgICAgY29uc3QgVHlwZSAqdCA9IG1Db25zdGFudEJ1ZmZlclR5cGVzW2N0XS5nZXQoKTsKLSAgICAgICAgaWYgKCF0KSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBjb25zdCBFbGVtZW50ICplID0gdC0+Z2V0RWxlbWVudCgpOwotICAgICAgICBpZiAoZS0+Z2V0TmFtZSgpICYmIChlLT5nZXRGaWVsZENvdW50KCkgPiAxKSkgewotICAgICAgICAgICAgU3RyaW5nOCBzKCJzdHJ1Y3Qgc3RydWN0XyIpOwotICAgICAgICAgICAgcy5hcHBlbmQoZS0+Z2V0TmFtZSgpKTsKLSAgICAgICAgICAgIHMuYXBwZW5kKGUtPmdldENTdHJ1Y3RCb2R5KCkpOwotICAgICAgICAgICAgcy5hcHBlbmQoIjtcbiIpOwotCi0gICAgICAgICAgICBzLmFwcGVuZCgiI2RlZmluZSAiKTsKLSAgICAgICAgICAgIHMuYXBwZW5kKGUtPmdldE5hbWUoKSk7Ci0gICAgICAgICAgICBzLmFwcGVuZCgiX3Qgc3RydWN0IHN0cnVjdF8iKTsKLSAgICAgICAgICAgIHMuYXBwZW5kKGUtPmdldE5hbWUoKSk7Ci0gICAgICAgICAgICBzLmFwcGVuZCgiXG5cbiIpOwotICAgICAgICAgICAgaWYgKHJzYy0+cHJvcHMubUxvZ1NjcmlwdHMpIHsKLSAgICAgICAgICAgICAgICBMT0dWKCIlcyIsIHN0YXRpY19jYXN0PGNvbnN0IGNoYXIqPihzKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdHItPmFwcGVuZChzKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtU2xvdE5hbWVzW2N0XS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgIFN0cmluZzggczsKLSAgICAgICAgICAgIGlmIChlLT5nZXROYW1lKCkpIHsKLSAgICAgICAgICAgICAgICAvLyBVc2UgdGhlIG5hbWVkIHN0cnVjdAotICAgICAgICAgICAgICAgIHMuc2V0VG8oZS0+Z2V0TmFtZSgpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gY3JlYXRlIGFuIHN0cnVjdCBuYW1lZCBmcm9tIHRoZSBzbG90LgotICAgICAgICAgICAgICAgIHMuc2V0VG8oInN0cnVjdCAiKTsKLSAgICAgICAgICAgICAgICBzLmFwcGVuZChtU2xvdE5hbWVzW2N0XSk7Ci0gICAgICAgICAgICAgICAgcy5hcHBlbmQoIl9zIik7Ci0gICAgICAgICAgICAgICAgcy5hcHBlbmQoZS0+Z2V0Q1N0cnVjdEJvZHkoKSk7Ci0gICAgICAgICAgICAgICAgLy9hcHBlbmRFbGVtZW50Qm9keSgmcywgZSk7Ci0gICAgICAgICAgICAgICAgcy5hcHBlbmQoIjtcbiIpOwotICAgICAgICAgICAgICAgIHMuYXBwZW5kKCJzdHJ1Y3QgIik7Ci0gICAgICAgICAgICAgICAgcy5hcHBlbmQobVNsb3ROYW1lc1tjdF0pOwotICAgICAgICAgICAgICAgIHMuYXBwZW5kKCJfcyIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzLmFwcGVuZCgiICogIik7Ci0gICAgICAgICAgICBzLmFwcGVuZChtU2xvdE5hbWVzW2N0XSk7Ci0gICAgICAgICAgICBzLmFwcGVuZCgiO1xuIik7Ci0gICAgICAgICAgICBpZiAocnNjLT5wcm9wcy5tTG9nU2NyaXB0cykgewotICAgICAgICAgICAgICAgIExPR1YoIiVzIiwgc3RhdGljX2Nhc3Q8Y29uc3QgY2hhcio+KHMpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN0ci0+YXBwZW5kKHMpOwotICAgICAgICB9Ci0gICAgfQotfQogCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKQEAgLTQyMCw3ICs1MTUsNiBAQAogICAgIHMtPnNldENvbnRleHQocnNjKTsKICAgICBmb3IgKGludCBjdD0wOyBjdCA8IE1BWF9TQ1JJUFRfQkFOS1M7IGN0KyspIHsKICAgICAgICAgcy0+bVR5cGVzW2N0XS5zZXQoc3MtPm1Db25zdGFudEJ1ZmZlclR5cGVzW2N0XS5nZXQoKSk7Ci0gICAgICAgIHMtPm1TbG90TmFtZXNbY3RdID0gc3MtPm1TbG90TmFtZXNbY3RdOwogICAgICAgICBzLT5tU2xvdFdyaXRhYmxlW2N0XSA9IHNzLT5tU2xvdFdyaXRhYmxlW2N0XTsKICAgICB9CiAKQEAgLTQyOCwxOCArNTIyLDYgQEAKICAgICByZXR1cm4gczsKIH0KIAotdm9pZCByc2lfU2NyaXB0Q1NldERlZmluZUYoQ29udGV4dCAqcnNjLCBjb25zdCBjaGFyKiBuYW1lLCBmbG9hdCB2YWx1ZSkKLXsKLSAgICBTY3JpcHRDU3RhdGUgKnNzID0gJnJzYy0+bVNjcmlwdEM7Ci0gICAgc3MtPm1GbG9hdERlZmluZXMuYWRkKFN0cmluZzgobmFtZSksIHZhbHVlKTsKLX0KLQotdm9pZCByc2lfU2NyaXB0Q1NldERlZmluZUkzMihDb250ZXh0ICpyc2MsIGNvbnN0IGNoYXIqIG5hbWUsIGludDMyX3QgdmFsdWUpCi17Ci0gICAgU2NyaXB0Q1N0YXRlICpzcyA9ICZyc2MtPm1TY3JpcHRDOwotICAgIHNzLT5tSW50MzJEZWZpbmVzLmFkZChTdHJpbmc4KG5hbWUpLCB2YWx1ZSk7Ci19Ci0KIH0KIH0KIApkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc1NjcmlwdEMuaCBiL2xpYnMvcnMvcnNTY3JpcHRDLmgKaW5kZXggMzVhYmFkZi4uOWQwOWIwYiAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc1NjcmlwdEMuaAorKysgYi9saWJzL3JzL3JzU2NyaXB0Qy5oCkBAIC0yMSw5ICsyMSw3IEBACiAKICNpbmNsdWRlICJSZW5kZXJTY3JpcHRFbnYuaCIKIAotI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+Ci0KLXN0cnVjdCBBQ0NzY3JpcHQ7CitzdHJ1Y3QgQkNDc2NyaXB0OwogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIG5hbWVzcGFjZSBhbmRyb2lkIHsKQEAgLTM0LDcgKzMyLDcgQEAKIGNsYXNzIFNjcmlwdEMgOiBwdWJsaWMgU2NyaXB0CiB7CiBwdWJsaWM6Ci0gICAgdHlwZWRlZiBpbnQgKCpSdW5TY3JpcHRfdCkodWludDMyX3QgbGF1bmNoSW5kZXgpOworICAgIHR5cGVkZWYgaW50ICgqUnVuU2NyaXB0X3QpKCk7CiAgICAgdHlwZWRlZiB2b2lkICgqVm9pZEZ1bmNfdCkoKTsKIAogICAgIFNjcmlwdEMoQ29udGV4dCAqKTsKQEAgLTQ0LDE4ICs0MiwzNSBAQAogICAgICAgICBpbnQgbVZlcnNpb25NYWpvcjsKICAgICAgICAgaW50IG1WZXJzaW9uTWlub3I7CiAKLSAgICAgICAgUnVuU2NyaXB0X3QgbVNjcmlwdDsKKyAgICAgICAgUnVuU2NyaXB0X3QgbVJvb3Q7CiAgICAgICAgIFZvaWRGdW5jX3QgbUluaXQ7Ci0KLSAgICAgICAgdm9pZCAqKiBtU2xvdFBvaW50ZXJzW01BWF9TQ1JJUFRfQkFOS1NdOwogICAgIH07CiAKICAgICBQcm9ncmFtX3QgbVByb2dyYW07CiAKLSAgICBBQ0NzY3JpcHQqICAgIG1BY2NTY3JpcHQ7CisgICAgQkNDc2NyaXB0KiAgICBtQmNjU2NyaXB0OwogCi0gICAgdmlydHVhbCB2b2lkIHNldHVwU2NyaXB0KCk7Ci0gICAgdmlydHVhbCB1aW50MzJfdCBydW4oQ29udGV4dCAqLCB1aW50MzJfdCBsYXVuY2hJRCk7CisgICAgY29uc3QgQWxsb2NhdGlvbiAqcHRyVG9BbGxvY2F0aW9uKGNvbnN0IHZvaWQgKikgY29uc3Q7CisKKworICAgIHZpcnR1YWwgdm9pZCBJbnZva2UoQ29udGV4dCAqcnNjLCB1aW50MzJfdCBzbG90LCBjb25zdCB2b2lkICpkYXRhLCB1aW50MzJfdCBsZW4pOworCisgICAgdmlydHVhbCB1aW50MzJfdCBydW4oQ29udGV4dCAqKTsKKworICAgIHZpcnR1YWwgdm9pZCBydW5Gb3JFYWNoKENvbnRleHQgKnJzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBbGxvY2F0aW9uICogYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbG9jYXRpb24gKiBhb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKiB1c3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUnNTY3JpcHRDYWxsICpzYyA9IE5VTEwpOworCisgICAgdmlydHVhbCB2b2lkIHNlcmlhbGl6ZShPU3RyZWFtICpzdHJlYW0pIGNvbnN0IHsgICAgfQorICAgIHZpcnR1YWwgUnNBM0RDbGFzc0lEIGdldENsYXNzSWQoKSBjb25zdCB7IHJldHVybiBSU19BM0RfQ0xBU1NfSURfU0NSSVBUX0M7IH0KKyAgICBzdGF0aWMgVHlwZSAqY3JlYXRlRnJvbVN0cmVhbShDb250ZXh0ICpyc2MsIElTdHJlYW0gKnN0cmVhbSkgeyByZXR1cm4gTlVMTDsgfQorCitwcm90ZWN0ZWQ6CisgICAgdm9pZCBzZXR1cFNjcmlwdChDb250ZXh0ICopOworICAgIHZvaWQgc2V0dXBHTFN0YXRlKENvbnRleHQgKik7CisgICAgU2NyaXB0ICogc2V0VExTKFNjcmlwdCAqKTsKIH07CiAKIGNsYXNzIFNjcmlwdENTdGF0ZQpAQCAtNjcsMjcgKzgyLDIxIEBACiAgICAgU2NyaXB0QyAqbVNjcmlwdDsKIAogICAgIE9iamVjdEJhc2VSZWY8Y29uc3QgVHlwZT4gbUNvbnN0YW50QnVmZmVyVHlwZXNbTUFYX1NDUklQVF9CQU5LU107Ci0gICAgU3RyaW5nOCBtU2xvdE5hbWVzW01BWF9TQ1JJUFRfQkFOS1NdOworICAgIC8vU3RyaW5nOCBtU2xvdE5hbWVzW01BWF9TQ1JJUFRfQkFOS1NdOwogICAgIGJvb2wgbVNsb3RXcml0YWJsZVtNQVhfU0NSSVBUX0JBTktTXTsKLSAgICBTdHJpbmc4IG1JbnZva2FibGVOYW1lc1tNQVhfU0NSSVBUX0JBTktTXTsKKyAgICAvL1N0cmluZzggbUludm9rYWJsZU5hbWVzW01BWF9TQ1JJUFRfQkFOS1NdOwogCiAgICAgdm9pZCBjbGVhcigpOwogICAgIHZvaWQgcnVuQ29tcGlsZXIoQ29udGV4dCAqcnNjLCBTY3JpcHRDICpzKTsKLSAgICB2b2lkIGFwcGVuZFZhckRlZmluZXMoY29uc3QgQ29udGV4dCAqcnNjLCBTdHJpbmc4ICpzdHIpOwotICAgIHZvaWQgYXBwZW5kVHlwZXMoY29uc3QgQ29udGV4dCAqcnNjLCBTdHJpbmc4ICpzdHIpOwogCiAgICAgc3RydWN0IFN5bWJvbFRhYmxlX3QgewogICAgICAgICBjb25zdCBjaGFyICogbU5hbWU7CiAgICAgICAgIHZvaWQgKiBtUHRyOwotICAgICAgICBjb25zdCBjaGFyICogbVJldDsKLSAgICAgICAgY29uc3QgY2hhciAqIG1QYXJhbTsKICAgICB9OwotICAgIHN0YXRpYyBTeW1ib2xUYWJsZV90IGdTeW1zW107CisgICAgLy9zdGF0aWMgU3ltYm9sVGFibGVfdCBnU3ltc1tdOwogICAgIHN0YXRpYyBjb25zdCBTeW1ib2xUYWJsZV90ICogbG9va3VwU3ltYm9sKGNvbnN0IGNoYXIgKik7Ci0gICAgc3RhdGljIHZvaWQgYXBwZW5kRGVjbHMoU3RyaW5nOCAqc3RyKTsKLQotICAgIEtleWVkVmVjdG9yPFN0cmluZzgsaW50PiBtSW50MzJEZWZpbmVzOwotICAgIEtleWVkVmVjdG9yPFN0cmluZzgsZmxvYXQ+IG1GbG9hdERlZmluZXM7CisgICAgc3RhdGljIGNvbnN0IFN5bWJvbFRhYmxlX3QgKiBsb29rdXBTeW1ib2xDTChjb25zdCBjaGFyICopOworICAgIHN0YXRpYyBjb25zdCBTeW1ib2xUYWJsZV90ICogbG9va3VwU3ltYm9sR0woY29uc3QgY2hhciAqKTsKIH07CiAKIApkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc1NjcmlwdENfTGliLmNwcCBiL2xpYnMvcnMvcnNTY3JpcHRDX0xpYi5jcHAKaW5kZXggMjAyY2EzZC4uNWEyYjZiYSAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc1NjcmlwdENfTGliLmNwcAorKysgYi9saWJzL3JzL3JzU2NyaXB0Q19MaWIuY3BwCkBAIC0xNywxOCArMTcsMTAgQEAKICNpbmNsdWRlICJyc0NvbnRleHQuaCIKICNpbmNsdWRlICJyc1NjcmlwdEMuaCIKICNpbmNsdWRlICJyc01hdHJpeC5oIgotI2luY2x1ZGUgInJzTm9pc2UuaCIKIAogI2luY2x1ZGUgImFjYy9hY2MuaCIKICNpbmNsdWRlICJ1dGlscy9UaW1lcnMuaCIKIAotI2RlZmluZSBHTF9HTEVYVF9QUk9UT1RZUEVTCi0KLSNpbmNsdWRlIDxHTEVTL2dsLmg+Ci0jaW5jbHVkZSA8R0xFUy9nbGV4dC5oPgotI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgotI2luY2x1ZGUgPEdMRVMyL2dsMmV4dC5oPgotCiAjaW5jbHVkZSA8dGltZS5oPgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKQEAgLTM5LDI1MiArMzEsMTEgQEAKICAgICBDb250ZXh0ICogcnNjID0gdGxzLT5tQ29udGV4dDsgXAogICAgIFNjcmlwdEMgKiBzYyA9IChTY3JpcHRDICopIHRscy0+bVNjcmlwdAogCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgZmxvYXQgeDsKLSAgICBmbG9hdCB5OwotICAgIGZsb2F0IHo7Ci19IHZlYzNfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIGZsb2F0IHg7Ci0gICAgZmxvYXQgeTsKLSAgICBmbG9hdCB6OwotICAgIGZsb2F0IHc7Ci19IHZlYzRfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIGZsb2F0IHg7Ci0gICAgZmxvYXQgeTsKLX0gdmVjMl90OwotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIElPIHJvdXRpbmVzCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotc3RhdGljIGZsb2F0IFNDX2xvYWRGKHVpbnQzMl90IGJhbmssIHVpbnQzMl90IG9mZnNldCkKLXsKLSAgICBHRVRfVExTKCk7Ci0gICAgY29uc3Qgdm9pZCAqdnAgPSBzYy0+bVNsb3RzW2JhbmtdLT5nZXRQdHIoKTsKLSAgICBjb25zdCBmbG9hdCAqZiA9IHN0YXRpY19jYXN0PGNvbnN0IGZsb2F0ICo+KHZwKTsKLSAgICAvL0xPR0UoImxvYWRGICVpICVpID0gJWYgJXgiLCBiYW5rLCBvZmZzZXQsIGYsICgoaW50ICopJmYpWzBdKTsKLSAgICByZXR1cm4gZltvZmZzZXRdOwotfQotCi1zdGF0aWMgaW50MzJfdCBTQ19sb2FkSTMyKHVpbnQzMl90IGJhbmssIHVpbnQzMl90IG9mZnNldCkKLXsKLSAgICBHRVRfVExTKCk7Ci0gICAgY29uc3Qgdm9pZCAqdnAgPSBzYy0+bVNsb3RzW2JhbmtdLT5nZXRQdHIoKTsKLSAgICBjb25zdCBpbnQzMl90ICppID0gc3RhdGljX2Nhc3Q8Y29uc3QgaW50MzJfdCAqPih2cCk7Ci0gICAgLy9MT0dFKCJsb2FkSTMyICVpICVpID0gJWkiLCBiYW5rLCBvZmZzZXQsIHQpOwotICAgIHJldHVybiBpW29mZnNldF07Ci19Ci0KLXN0YXRpYyBmbG9hdCogU0NfbG9hZEFycmF5Rih1aW50MzJfdCBiYW5rLCB1aW50MzJfdCBvZmZzZXQpCi17Ci0gICAgR0VUX1RMUygpOwotICAgIHZvaWQgKnZwID0gc2MtPm1TbG90c1tiYW5rXS0+Z2V0UHRyKCk7Ci0gICAgZmxvYXQgKmYgPSBzdGF0aWNfY2FzdDxmbG9hdCAqPih2cCk7Ci0gICAgcmV0dXJuIGYgKyBvZmZzZXQ7Ci19Ci0KLXN0YXRpYyBpbnQzMl90KiBTQ19sb2FkQXJyYXlJMzIodWludDMyX3QgYmFuaywgdWludDMyX3Qgb2Zmc2V0KQotewotICAgIEdFVF9UTFMoKTsKLSAgICB2b2lkICp2cCA9IHNjLT5tU2xvdHNbYmFua10tPmdldFB0cigpOwotICAgIGludDMyX3QgKmkgPSBzdGF0aWNfY2FzdDxpbnQzMl90ICo+KHZwKTsKLSAgICByZXR1cm4gaSArIG9mZnNldDsKLX0KLQotc3RhdGljIGZsb2F0KiBTQ19sb2FkU2ltcGxlTWVzaFZlcnRpY2VzRihSc1NpbXBsZU1lc2ggbWVzaCwgdWludDMyX3QgaWR4KQotewotICAgIFNpbXBsZU1lc2ggKnRtID0gc3RhdGljX2Nhc3Q8U2ltcGxlTWVzaCAqPihtZXNoKTsKLSAgICB2b2lkICp2cCA9IHRtLT5tVmVydGV4QnVmZmVyc1tpZHhdLT5nZXRQdHIoKTs7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PGZsb2F0ICo+KHZwKTsKLX0KLQotc3RhdGljIHZvaWQgU0NfdXBkYXRlU2ltcGxlTWVzaChSc1NpbXBsZU1lc2ggbWVzaCkKLXsKLSAgICBHRVRfVExTKCk7Ci0gICAgU2ltcGxlTWVzaCAqc20gPSBzdGF0aWNfY2FzdDxTaW1wbGVNZXNoICo+KG1lc2gpOwotICAgIHNtLT51cGxvYWRBbGwocnNjKTsKLX0KLQotc3RhdGljIHVpbnQzMl90IFNDX2xvYWRVMzIodWludDMyX3QgYmFuaywgdWludDMyX3Qgb2Zmc2V0KQotewotICAgIEdFVF9UTFMoKTsKLSAgICBjb25zdCB2b2lkICp2cCA9IHNjLT5tU2xvdHNbYmFua10tPmdldFB0cigpOwotICAgIGNvbnN0IHVpbnQzMl90ICppID0gc3RhdGljX2Nhc3Q8Y29uc3QgdWludDMyX3QgKj4odnApOwotICAgIHJldHVybiBpW29mZnNldF07Ci19Ci0KLXN0YXRpYyB2b2lkIFNDX2xvYWRWZWM0KHVpbnQzMl90IGJhbmssIHVpbnQzMl90IG9mZnNldCwgcnNjX1ZlY3RvcjQgKnYpCi17Ci0gICAgR0VUX1RMUygpOwotICAgIGNvbnN0IHZvaWQgKnZwID0gc2MtPm1TbG90c1tiYW5rXS0+Z2V0UHRyKCk7Ci0gICAgY29uc3QgZmxvYXQgKmYgPSBzdGF0aWNfY2FzdDxjb25zdCBmbG9hdCAqPih2cCk7Ci0gICAgbWVtY3B5KHYsICZmW29mZnNldF0sIHNpemVvZihyc2NfVmVjdG9yNCkpOwotfQotCi1zdGF0aWMgdm9pZCBTQ19sb2FkTWF0cml4KHVpbnQzMl90IGJhbmssIHVpbnQzMl90IG9mZnNldCwgcnNjX01hdHJpeCAqbSkKLXsKLSAgICBHRVRfVExTKCk7Ci0gICAgY29uc3Qgdm9pZCAqdnAgPSBzYy0+bVNsb3RzW2JhbmtdLT5nZXRQdHIoKTsKLSAgICBjb25zdCBmbG9hdCAqZiA9IHN0YXRpY19jYXN0PGNvbnN0IGZsb2F0ICo+KHZwKTsKLSAgICBtZW1jcHkobSwgJmZbb2Zmc2V0XSwgc2l6ZW9mKHJzY19NYXRyaXgpKTsKLX0KLQotCi1zdGF0aWMgdm9pZCBTQ19zdG9yZUYodWludDMyX3QgYmFuaywgdWludDMyX3Qgb2Zmc2V0LCBmbG9hdCB2KQotewotICAgIC8vTE9HRSgic3RvcmVGICVpICVpICVmIiwgYmFuaywgb2Zmc2V0LCB2KTsKLSAgICBHRVRfVExTKCk7Ci0gICAgdm9pZCAqdnAgPSBzYy0+bVNsb3RzW2JhbmtdLT5nZXRQdHIoKTsKLSAgICBmbG9hdCAqZiA9IHN0YXRpY19jYXN0PGZsb2F0ICo+KHZwKTsKLSAgICBmW29mZnNldF0gPSB2OwotfQotCi1zdGF0aWMgdm9pZCBTQ19zdG9yZUkzMih1aW50MzJfdCBiYW5rLCB1aW50MzJfdCBvZmZzZXQsIGludDMyX3QgdikKLXsKLSAgICBHRVRfVExTKCk7Ci0gICAgdm9pZCAqdnAgPSBzYy0+bVNsb3RzW2JhbmtdLT5nZXRQdHIoKTsKLSAgICBpbnQzMl90ICpmID0gc3RhdGljX2Nhc3Q8aW50MzJfdCAqPih2cCk7Ci0gICAgc3RhdGljX2Nhc3Q8aW50MzJfdCAqPihzYy0+bVNsb3RzW2JhbmtdLT5nZXRQdHIoKSlbb2Zmc2V0XSA9IHY7Ci19Ci0KLXN0YXRpYyB2b2lkIFNDX3N0b3JlVTMyKHVpbnQzMl90IGJhbmssIHVpbnQzMl90IG9mZnNldCwgdWludDMyX3QgdikKLXsKLSAgICBHRVRfVExTKCk7Ci0gICAgdm9pZCAqdnAgPSBzYy0+bVNsb3RzW2JhbmtdLT5nZXRQdHIoKTsKLSAgICB1aW50MzJfdCAqZiA9IHN0YXRpY19jYXN0PHVpbnQzMl90ICo+KHZwKTsKLSAgICBzdGF0aWNfY2FzdDx1aW50MzJfdCAqPihzYy0+bVNsb3RzW2JhbmtdLT5nZXRQdHIoKSlbb2Zmc2V0XSA9IHY7Ci19Ci0KLXN0YXRpYyB2b2lkIFNDX3N0b3JlVmVjNCh1aW50MzJfdCBiYW5rLCB1aW50MzJfdCBvZmZzZXQsIGNvbnN0IHJzY19WZWN0b3I0ICp2KQotewotICAgIEdFVF9UTFMoKTsKLSAgICB2b2lkICp2cCA9IHNjLT5tU2xvdHNbYmFua10tPmdldFB0cigpOwotICAgIGZsb2F0ICpmID0gc3RhdGljX2Nhc3Q8ZmxvYXQgKj4odnApOwotICAgIG1lbWNweSgmZltvZmZzZXRdLCB2LCBzaXplb2YocnNjX1ZlY3RvcjQpKTsKLX0KLQotc3RhdGljIHZvaWQgU0Nfc3RvcmVNYXRyaXgodWludDMyX3QgYmFuaywgdWludDMyX3Qgb2Zmc2V0LCBjb25zdCByc2NfTWF0cml4ICptKQotewotICAgIEdFVF9UTFMoKTsKLSAgICB2b2lkICp2cCA9IHNjLT5tU2xvdHNbYmFua10tPmdldFB0cigpOwotICAgIGZsb2F0ICpmID0gc3RhdGljX2Nhc3Q8ZmxvYXQgKj4odnApOwotICAgIG1lbWNweSgmZltvZmZzZXRdLCBtLCBzaXplb2YocnNjX01hdHJpeCkpOwotfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIFZlYzMgcm91dGluZXMKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi1zdGF0aWMgdm9pZCBTQ192ZWMzTm9ybSh2ZWMzX3QgKnYpCi17Ci0gICAgZmxvYXQgbGVuID0gc3FydGYodi0+eCAqIHYtPnggKyB2LT55ICogdi0+eSArIHYtPnogKiB2LT56KTsKLSAgICBsZW4gPSAxIC8gbGVuOwotICAgIHYtPnggKj0gbGVuOwotICAgIHYtPnkgKj0gbGVuOwotICAgIHYtPnogKj0gbGVuOwotfQotCi1zdGF0aWMgZmxvYXQgU0NfdmVjM0xlbmd0aChjb25zdCB2ZWMzX3QgKnYpCi17Ci0gICAgcmV0dXJuIHNxcnRmKHYtPnggKiB2LT54ICsgdi0+eSAqIHYtPnkgKyB2LT56ICogdi0+eik7Ci19Ci0KLXN0YXRpYyB2b2lkIFNDX3ZlYzNBZGQodmVjM190ICpkZXN0LCBjb25zdCB2ZWMzX3QgKmxocywgY29uc3QgdmVjM190ICpyaHMpCi17Ci0gICAgZGVzdC0+eCA9IGxocy0+eCArIHJocy0+eDsKLSAgICBkZXN0LT55ID0gbGhzLT55ICsgcmhzLT55OwotICAgIGRlc3QtPnogPSBsaHMtPnogKyByaHMtPno7Ci19Ci0KLXN0YXRpYyB2b2lkIFNDX3ZlYzNTdWIodmVjM190ICpkZXN0LCBjb25zdCB2ZWMzX3QgKmxocywgY29uc3QgdmVjM190ICpyaHMpCi17Ci0gICAgZGVzdC0+eCA9IGxocy0+eCAtIHJocy0+eDsKLSAgICBkZXN0LT55ID0gbGhzLT55IC0gcmhzLT55OwotICAgIGRlc3QtPnogPSBsaHMtPnogLSByaHMtPno7Ci19Ci0KLXN0YXRpYyB2b2lkIFNDX3ZlYzNDcm9zcyh2ZWMzX3QgKmRlc3QsIGNvbnN0IHZlYzNfdCAqbGhzLCBjb25zdCB2ZWMzX3QgKnJocykKLXsKLSAgICBmbG9hdCB4ID0gbGhzLT55ICogcmhzLT56ICAtIGxocy0+eiAqIHJocy0+eTsKLSAgICBmbG9hdCB5ID0gbGhzLT56ICogcmhzLT54ICAtIGxocy0+eCAqIHJocy0+ejsKLSAgICBmbG9hdCB6ID0gbGhzLT54ICogcmhzLT55ICAtIGxocy0+eSAqIHJocy0+eDsKLSAgICBkZXN0LT54ID0geDsKLSAgICBkZXN0LT55ID0geTsKLSAgICBkZXN0LT56ID0gejsKLX0KLQotc3RhdGljIGZsb2F0IFNDX3ZlYzNEb3QoY29uc3QgdmVjM190ICpsaHMsIGNvbnN0IHZlYzNfdCAqcmhzKQotewotICAgIHJldHVybiBsaHMtPnggKiByaHMtPnggKyBsaHMtPnkgKiByaHMtPnkgKyBsaHMtPnogKiByaHMtPno7Ci19Ci0KLXN0YXRpYyB2b2lkIFNDX3ZlYzNTY2FsZSh2ZWMzX3QgKmxocywgZmxvYXQgc2NhbGUpCi17Ci0gICAgbGhzLT54ICo9IHNjYWxlOwotICAgIGxocy0+eSAqPSBzY2FsZTsKLSAgICBsaHMtPnogKj0gc2NhbGU7Ci19Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gVmVjNCByb3V0aW5lcwotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLXN0YXRpYyB2b2lkIFNDX3ZlYzROb3JtKHZlYzRfdCAqdikKLXsKLSAgICBmbG9hdCBsZW4gPSBzcXJ0Zih2LT54ICogdi0+eCArIHYtPnkgKiB2LT55ICsgdi0+eiAqIHYtPnogKyB2LT53ICogdi0+dyk7Ci0gICAgbGVuID0gMSAvIGxlbjsKLSAgICB2LT54ICo9IGxlbjsKLSAgICB2LT55ICo9IGxlbjsKLSAgICB2LT56ICo9IGxlbjsKLSAgICB2LT53ICo9IGxlbjsKLX0KLQotc3RhdGljIGZsb2F0IFNDX3ZlYzRMZW5ndGgoY29uc3QgdmVjNF90ICp2KQotewotICAgIHJldHVybiBzcXJ0Zih2LT54ICogdi0+eCArIHYtPnkgKiB2LT55ICsgdi0+eiAqIHYtPnogKyB2LT53ICogdi0+dyk7Ci19Ci0KLXN0YXRpYyB2b2lkIFNDX3ZlYzRBZGQodmVjNF90ICpkZXN0LCBjb25zdCB2ZWM0X3QgKmxocywgY29uc3QgdmVjNF90ICpyaHMpCi17Ci0gICAgZGVzdC0+eCA9IGxocy0+eCArIHJocy0+eDsKLSAgICBkZXN0LT55ID0gbGhzLT55ICsgcmhzLT55OwotICAgIGRlc3QtPnogPSBsaHMtPnogKyByaHMtPno7Ci0gICAgZGVzdC0+dyA9IGxocy0+dyArIHJocy0+dzsKLX0KLQotc3RhdGljIHZvaWQgU0NfdmVjNFN1Yih2ZWM0X3QgKmRlc3QsIGNvbnN0IHZlYzRfdCAqbGhzLCBjb25zdCB2ZWM0X3QgKnJocykKLXsKLSAgICBkZXN0LT54ID0gbGhzLT54IC0gcmhzLT54OwotICAgIGRlc3QtPnkgPSBsaHMtPnkgLSByaHMtPnk7Ci0gICAgZGVzdC0+eiA9IGxocy0+eiAtIHJocy0+ejsKLSAgICBkZXN0LT53ID0gbGhzLT53IC0gcmhzLT53OwotfQotCi1zdGF0aWMgZmxvYXQgU0NfdmVjNERvdChjb25zdCB2ZWM0X3QgKmxocywgY29uc3QgdmVjNF90ICpyaHMpCi17Ci0gICAgcmV0dXJuIGxocy0+eCAqIHJocy0+eCArIGxocy0+eSAqIHJocy0+eSArIGxocy0+eiAqIHJocy0+eiArIGxocy0+dyAqIHJocy0+dzsKLX0KLQotc3RhdGljIHZvaWQgU0NfdmVjNFNjYWxlKHZlYzRfdCAqbGhzLCBmbG9hdCBzY2FsZSkKLXsKLSAgICBsaHMtPnggKj0gc2NhbGU7Ci0gICAgbGhzLT55ICo9IHNjYWxlOwotICAgIGxocy0+eiAqPSBzY2FsZTsKLSAgICBsaHMtPncgKj0gc2NhbGU7Ci19CiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogLy8gTWF0aCByb3V0aW5lcwogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKLSNkZWZpbmUgUEkgMy4xNDE1OTI2ZgotI2RlZmluZSBERUdfVE9fUkFEIFBJIC8gMTgwLjBmCi0jZGVmaW5lIFJBRF9UT19ERUcgMTgwLjBmIC8gUEkKLQogc3RhdGljIGZsb2F0IFNDX3NpbmZfZmFzdChmbG9hdCB4KQogewogICAgIGNvbnN0IGZsb2F0IEEgPSAgIDEuMGYgLyAoMi4wZiAqIE1fUEkpOwpAQCAtMzIzLDYgKzc0LDcgQEAKICAgICByZXR1cm4gMC4yMjE1ZiAqICh5ICogZmFic2YoeSkgLSB5KSArIHk7CiB9CiAKKwogc3RhdGljIGZsb2F0IFNDX3JhbmRmKGZsb2F0IG1heCkKIHsKICAgICBmbG9hdCByID0gKGZsb2F0KXJhbmQoKTsKQEAgLTMzNSwxMDQgKzg3LDIwIEBACiAgICAgcmV0dXJuIHIgLyBSQU5EX01BWCAqIChtYXggLSBtaW4pICsgbWluOwogfQogCi1zdGF0aWMgaW50IFNDX3NpZ24oaW50IHZhbHVlKQorc3RhdGljIGludCBTQ19yYW5kaShpbnQgbWF4KQogewotICAgIHJldHVybiAodmFsdWUgPiAwKSAtICh2YWx1ZSA8IDApOworICAgIHJldHVybiAoaW50KVNDX3JhbmRmKG1heCk7CiB9CiAKLXN0YXRpYyBmbG9hdCBTQ19zaWduZihmbG9hdCB2YWx1ZSkKK3N0YXRpYyBpbnQgU0NfcmFuZGkyKGludCBtaW4sIGludCBtYXgpCiB7Ci0gICAgcmV0dXJuICh2YWx1ZSA+IDApIC0gKHZhbHVlIDwgMCk7CisgICAgcmV0dXJuIChpbnQpU0NfcmFuZGYyKG1pbiwgbWF4KTsKIH0KIAotc3RhdGljIGZsb2F0IFNDX2NsYW1wZihmbG9hdCBhbW91bnQsIGZsb2F0IGxvdywgZmxvYXQgaGlnaCkKK3N0YXRpYyBmbG9hdCBTQ19mcmFjKGZsb2F0IHYpCiB7Ci0gICAgcmV0dXJuIGFtb3VudCA8IGxvdyA/IGxvdyA6IChhbW91bnQgPiBoaWdoID8gaGlnaCA6IGFtb3VudCk7Ci19Ci0KLXN0YXRpYyBpbnQgU0NfY2xhbXAoaW50IGFtb3VudCwgaW50IGxvdywgaW50IGhpZ2gpCi17Ci0gICAgcmV0dXJuIGFtb3VudCA8IGxvdyA/IGxvdyA6IChhbW91bnQgPiBoaWdoID8gaGlnaCA6IGFtb3VudCk7Ci19Ci0KLXN0YXRpYyBmbG9hdCBTQ19tYXhmKGZsb2F0IGEsIGZsb2F0IGIpCi17Ci0gICAgcmV0dXJuIGEgPiBiID8gYSA6IGI7Ci19Ci0KLXN0YXRpYyBmbG9hdCBTQ19taW5mKGZsb2F0IGEsIGZsb2F0IGIpCi17Ci0gICAgcmV0dXJuIGEgPCBiID8gYSA6IGI7Ci19Ci0KLXN0YXRpYyBmbG9hdCBTQ19zcXJmKGZsb2F0IHYpCi17Ci0gICAgcmV0dXJuIHYgKiB2OwotfQotCi1zdGF0aWMgaW50IFNDX3NxcihpbnQgdikKLXsKLSAgICByZXR1cm4gdiAqIHY7Ci19Ci0KLXN0YXRpYyBmbG9hdCBTQ19mcmFjZihmbG9hdCB2KQotewotICAgIHJldHVybiB2IC0gZmxvb3JmKHYpOwotfQotCi1zdGF0aWMgZmxvYXQgU0Nfcm91bmRmKGZsb2F0IHYpCi17Ci0gICAgcmV0dXJuIGZsb29yZih2ICsgMC40OTk5OTk5OTk5KTsKLX0KLQotc3RhdGljIGZsb2F0IFNDX2Rpc3RmMihmbG9hdCB4MSwgZmxvYXQgeTEsIGZsb2F0IHgyLCBmbG9hdCB5MikKLXsKLSAgICBmbG9hdCB4ID0geDIgLSB4MTsKLSAgICBmbG9hdCB5ID0geTIgLSB5MTsKLSAgICByZXR1cm4gc3FydGYoeCAqIHggKyB5ICogeSk7Ci19Ci0KLXN0YXRpYyBmbG9hdCBTQ19kaXN0ZjMoZmxvYXQgeDEsIGZsb2F0IHkxLCBmbG9hdCB6MSwgZmxvYXQgeDIsIGZsb2F0IHkyLCBmbG9hdCB6MikKLXsKLSAgICBmbG9hdCB4ID0geDIgLSB4MTsKLSAgICBmbG9hdCB5ID0geTIgLSB5MTsKLSAgICBmbG9hdCB6ID0gejIgLSB6MTsKLSAgICByZXR1cm4gc3FydGYoeCAqIHggKyB5ICogeSArIHogKiB6KTsKLX0KLQotc3RhdGljIGZsb2F0IFNDX21hZ2YyKGZsb2F0IGEsIGZsb2F0IGIpCi17Ci0gICAgcmV0dXJuIHNxcnRmKGEgKiBhICsgYiAqIGIpOwotfQotCi1zdGF0aWMgZmxvYXQgU0NfbWFnZjMoZmxvYXQgYSwgZmxvYXQgYiwgZmxvYXQgYykKLXsKLSAgICByZXR1cm4gc3FydGYoYSAqIGEgKyBiICogYiArIGMgKiBjKTsKLX0KLQotc3RhdGljIGZsb2F0IFNDX3JhZGYoZmxvYXQgZGVncmVlcykKLXsKLSAgICByZXR1cm4gZGVncmVlcyAqIERFR19UT19SQUQ7Ci19Ci0KLXN0YXRpYyBmbG9hdCBTQ19kZWdmKGZsb2F0IHJhZGlhbnMpCi17Ci0gICAgcmV0dXJuIHJhZGlhbnMgKiBSQURfVE9fREVHOwotfQotCi1zdGF0aWMgZmxvYXQgU0NfbGVycGYoZmxvYXQgc3RhcnQsIGZsb2F0IHN0b3AsIGZsb2F0IGFtb3VudCkKLXsKLSAgICByZXR1cm4gc3RhcnQgKyAoc3RvcCAtIHN0YXJ0KSAqIGFtb3VudDsKLX0KLQotc3RhdGljIGZsb2F0IFNDX25vcm1mKGZsb2F0IHN0YXJ0LCBmbG9hdCBzdG9wLCBmbG9hdCB2YWx1ZSkKLXsKLSAgICByZXR1cm4gKHZhbHVlIC0gc3RhcnQpIC8gKHN0b3AgLSBzdGFydCk7Ci19Ci0KLXN0YXRpYyBmbG9hdCBTQ19tYXBmKGZsb2F0IG1pblN0YXJ0LCBmbG9hdCBtaW5TdG9wLCBmbG9hdCBtYXhTdGFydCwgZmxvYXQgbWF4U3RvcCwgZmxvYXQgdmFsdWUpCi17Ci0gICAgcmV0dXJuIG1heFN0YXJ0ICsgKG1heFN0YXJ0IC0gbWF4U3RvcCkgKiAoKHZhbHVlIC0gbWluU3RhcnQpIC8gKG1pblN0b3AgLSBtaW5TdGFydCkpOworICAgIGludCBpID0gKGludClmbG9vcih2KTsKKyAgICByZXR1cm4gZm1pbih2IC0gaSwgMHgxLmZmZmZmZXAtMWYpOwogfQogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KQEAgLTUxMSwzNDggKzE3OSwyMiBAQAogICAgIHJldHVybiB0aW1laW5mby0+dG1feWVhcjsKIH0KIAotc3RhdGljIGludDMyX3QgU0NfdXB0aW1lTWlsbGlzKCkKK3N0YXRpYyBpbnQ2NF90IFNDX3VwdGltZU1pbGxpcygpCiB7CiAgICAgcmV0dXJuIG5hbm9zZWNvbmRzX3RvX21pbGxpc2Vjb25kcyhzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQykpOwogfQogCi1zdGF0aWMgaW50MzJfdCBTQ19zdGFydFRpbWVNaWxsaXMoKQorc3RhdGljIGludDY0X3QgU0NfdXB0aW1lTmFub3MoKQoreworICAgIHJldHVybiBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Cit9CisKK3N0YXRpYyBmbG9hdCBTQ19nZXREdCgpCiB7CiAgICAgR0VUX1RMUygpOwotICAgIHJldHVybiBzYy0+bUVudmlyb21lbnQubVN0YXJ0VGltZU1pbGxpczsKLX0KLQotc3RhdGljIGludDMyX3QgU0NfZWxhcHNlZFRpbWVNaWxsaXMoKQotewotICAgIEdFVF9UTFMoKTsKLSAgICByZXR1cm4gbmFub3NlY29uZHNfdG9fbWlsbGlzZWNvbmRzKHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKSkKLSAgICAgICAgICAgIC0gc2MtPm1FbnZpcm9tZW50Lm1TdGFydFRpbWVNaWxsaXM7Ci19Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gTWF0cml4IHJvdXRpbmVzCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotCi1zdGF0aWMgdm9pZCBTQ19tYXRyaXhMb2FkSWRlbnRpdHkocnNjX01hdHJpeCAqbWF0KQotewotICAgIE1hdHJpeCAqbSA9IHJlaW50ZXJwcmV0X2Nhc3Q8TWF0cml4ICo+KG1hdCk7Ci0gICAgbS0+bG9hZElkZW50aXR5KCk7Ci19Ci0KLXN0YXRpYyB2b2lkIFNDX21hdHJpeExvYWRGbG9hdChyc2NfTWF0cml4ICptYXQsIGNvbnN0IGZsb2F0ICpmKQotewotICAgIE1hdHJpeCAqbSA9IHJlaW50ZXJwcmV0X2Nhc3Q8TWF0cml4ICo+KG1hdCk7Ci0gICAgbS0+bG9hZChmKTsKLX0KLQotc3RhdGljIHZvaWQgU0NfbWF0cml4TG9hZE1hdChyc2NfTWF0cml4ICptYXQsIGNvbnN0IHJzY19NYXRyaXggKm5ld21hdCkKLXsKLSAgICBNYXRyaXggKm0gPSByZWludGVycHJldF9jYXN0PE1hdHJpeCAqPihtYXQpOwotICAgIG0tPmxvYWQocmVpbnRlcnByZXRfY2FzdDxjb25zdCBNYXRyaXggKj4obmV3bWF0KSk7Ci19Ci0KLXN0YXRpYyB2b2lkIFNDX21hdHJpeExvYWRSb3RhdGUocnNjX01hdHJpeCAqbWF0LCBmbG9hdCByb3QsIGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopCi17Ci0gICAgTWF0cml4ICptID0gcmVpbnRlcnByZXRfY2FzdDxNYXRyaXggKj4obWF0KTsKLSAgICBtLT5sb2FkUm90YXRlKHJvdCwgeCwgeSwgeik7Ci19Ci0KLXN0YXRpYyB2b2lkIFNDX21hdHJpeExvYWRTY2FsZShyc2NfTWF0cml4ICptYXQsIGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopCi17Ci0gICAgTWF0cml4ICptID0gcmVpbnRlcnByZXRfY2FzdDxNYXRyaXggKj4obWF0KTsKLSAgICBtLT5sb2FkU2NhbGUoeCwgeSwgeik7Ci19Ci0KLXN0YXRpYyB2b2lkIFNDX21hdHJpeExvYWRUcmFuc2xhdGUocnNjX01hdHJpeCAqbWF0LCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KQotewotICAgIE1hdHJpeCAqbSA9IHJlaW50ZXJwcmV0X2Nhc3Q8TWF0cml4ICo+KG1hdCk7Ci0gICAgbS0+bG9hZFRyYW5zbGF0ZSh4LCB5LCB6KTsKLX0KLQotc3RhdGljIHZvaWQgU0NfbWF0cml4TG9hZE11bHRpcGx5KHJzY19NYXRyaXggKm1hdCwgY29uc3QgcnNjX01hdHJpeCAqbGhzLCBjb25zdCByc2NfTWF0cml4ICpyaHMpCi17Ci0gICAgTWF0cml4ICptID0gcmVpbnRlcnByZXRfY2FzdDxNYXRyaXggKj4obWF0KTsKLSAgICBtLT5sb2FkTXVsdGlwbHkocmVpbnRlcnByZXRfY2FzdDxjb25zdCBNYXRyaXggKj4obGhzKSwKLSAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBNYXRyaXggKj4ocmhzKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIFNDX21hdHJpeE11bHRpcGx5KHJzY19NYXRyaXggKm1hdCwgY29uc3QgcnNjX01hdHJpeCAqcmhzKQotewotICAgIE1hdHJpeCAqbSA9IHJlaW50ZXJwcmV0X2Nhc3Q8TWF0cml4ICo+KG1hdCk7Ci0gICAgbS0+bXVsdGlwbHkocmVpbnRlcnByZXRfY2FzdDxjb25zdCBNYXRyaXggKj4ocmhzKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIFNDX21hdHJpeFJvdGF0ZShyc2NfTWF0cml4ICptYXQsIGZsb2F0IHJvdCwgZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeikKLXsKLSAgICBNYXRyaXggKm0gPSByZWludGVycHJldF9jYXN0PE1hdHJpeCAqPihtYXQpOwotICAgIG0tPnJvdGF0ZShyb3QsIHgsIHksIHopOwotfQotCi1zdGF0aWMgdm9pZCBTQ19tYXRyaXhTY2FsZShyc2NfTWF0cml4ICptYXQsIGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopCi17Ci0gICAgTWF0cml4ICptID0gcmVpbnRlcnByZXRfY2FzdDxNYXRyaXggKj4obWF0KTsKLSAgICBtLT5zY2FsZSh4LCB5LCB6KTsKLX0KLQotc3RhdGljIHZvaWQgU0NfbWF0cml4VHJhbnNsYXRlKHJzY19NYXRyaXggKm1hdCwgZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeikKLXsKLSAgICBNYXRyaXggKm0gPSByZWludGVycHJldF9jYXN0PE1hdHJpeCAqPihtYXQpOwotICAgIG0tPnRyYW5zbGF0ZSh4LCB5LCB6KTsKLX0KLQotCi1zdGF0aWMgdm9pZCBTQ192ZWMyUmFuZChmbG9hdCAqdmVjLCBmbG9hdCBtYXhMZW4pCi17Ci0gICAgZmxvYXQgYW5nbGUgPSBTQ19yYW5kZihQSSAqIDIpOwotICAgIGZsb2F0IGxlbiA9IFNDX3JhbmRmKG1heExlbik7Ci0gICAgdmVjWzBdID0gbGVuICogc2luZihhbmdsZSk7Ci0gICAgdmVjWzFdID0gbGVuICogY29zZihhbmdsZSk7Ci19Ci0KLQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIENvbnRleHQKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi1zdGF0aWMgdm9pZCBTQ19iaW5kVGV4dHVyZShSc1Byb2dyYW1GcmFnbWVudCB2cGYsIHVpbnQzMl90IHNsb3QsIFJzQWxsb2NhdGlvbiB2YSkKLXsKLSAgICBHRVRfVExTKCk7Ci0gICAgcnNpX1Byb2dyYW1CaW5kVGV4dHVyZShyc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxQcm9ncmFtRnJhZ21lbnQgKj4odnBmKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsb3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxBbGxvY2F0aW9uICo+KHZhKSk7Ci0KLX0KLQotc3RhdGljIHZvaWQgU0NfYmluZFNhbXBsZXIoUnNQcm9ncmFtRnJhZ21lbnQgdnBmLCB1aW50MzJfdCBzbG90LCBSc1NhbXBsZXIgdnMpCi17Ci0gICAgR0VUX1RMUygpOwotICAgIHJzaV9Qcm9ncmFtQmluZFNhbXBsZXIocnNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8UHJvZ3JhbUZyYWdtZW50ICo+KHZwZiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzbG90LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8U2FtcGxlciAqPih2cykpOwotCi19Ci0KLXN0YXRpYyB2b2lkIFNDX2JpbmRQcm9ncmFtRnJhZ21lbnRTdG9yZShSc1Byb2dyYW1GcmFnbWVudFN0b3JlIHBmcykKLXsKLSAgICBHRVRfVExTKCk7Ci0gICAgcnNpX0NvbnRleHRCaW5kUHJvZ3JhbUZyYWdtZW50U3RvcmUocnNjLCBwZnMpOwotCi19Ci0KLXN0YXRpYyB2b2lkIFNDX2JpbmRQcm9ncmFtRnJhZ21lbnQoUnNQcm9ncmFtRnJhZ21lbnQgcGYpCi17Ci0gICAgR0VUX1RMUygpOwotICAgIHJzaV9Db250ZXh0QmluZFByb2dyYW1GcmFnbWVudChyc2MsIHBmKTsKLQotfQotCi1zdGF0aWMgdm9pZCBTQ19iaW5kUHJvZ3JhbVZlcnRleChSc1Byb2dyYW1WZXJ0ZXggcHYpCi17Ci0gICAgR0VUX1RMUygpOwotICAgIHJzaV9Db250ZXh0QmluZFByb2dyYW1WZXJ0ZXgocnNjLCBwdik7Ci0KLX0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBWUAotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLXN0YXRpYyB2b2lkIFNDX3ZwTG9hZE1vZGVsTWF0cml4KGNvbnN0IHJzY19NYXRyaXggKm0pCi17Ci0gICAgR0VUX1RMUygpOwotICAgIHJzYy0+Z2V0VmVydGV4KCktPnNldE1vZGVsdmlld01hdHJpeChtKTsKLX0KLQotc3RhdGljIHZvaWQgU0NfdnBMb2FkVGV4dHVyZU1hdHJpeChjb25zdCByc2NfTWF0cml4ICptKQotewotICAgIEdFVF9UTFMoKTsKLSAgICByc2MtPmdldFZlcnRleCgpLT5zZXRUZXh0dXJlTWF0cml4KG0pOwotfQotCi0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBEcmF3aW5nCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotc3RhdGljIHZvaWQgU0NfZHJhd0xpbmUoZmxvYXQgeDEsIGZsb2F0IHkxLCBmbG9hdCB6MSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHgyLCBmbG9hdCB5MiwgZmxvYXQgejIpCi17Ci0gICAgR0VUX1RMUygpOwotICAgIGlmICghcnNjLT5zZXR1cENoZWNrKCkpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGZsb2F0IHZ0eFtdID0geyB4MSwgeTEsIHoxLCB4MiwgeTIsIHoyIH07Ci0gICAgVmVydGV4QXJyYXkgdmE7Ci0gICAgdmEuYWRkTGVnYWN5KEdMX0ZMT0FULCAzLCAxMiwgUlNfS0lORF9QT1NJVElPTiwgZmFsc2UsICh1aW50MzJfdCl2dHgpOwotICAgIGlmIChyc2MtPmNoZWNrVmVyc2lvbjJfMCgpKSB7Ci0gICAgICAgIHZhLnNldHVwR0wyKHJzYywgJnJzYy0+bVN0YXRlVmVydGV4QXJyYXksICZyc2MtPm1TaGFkZXJDYWNoZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgdmEuc2V0dXBHTChyc2MsICZyc2MtPm1TdGF0ZVZlcnRleEFycmF5KTsKLSAgICB9Ci0KLSAgICBnbERyYXdBcnJheXMoR0xfTElORVMsIDAsIDIpOwotfQotCi1zdGF0aWMgdm9pZCBTQ19kcmF3UG9pbnQoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeikKLXsKLSAgICBHRVRfVExTKCk7Ci0gICAgaWYgKCFyc2MtPnNldHVwQ2hlY2soKSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgZmxvYXQgdnR4W10gPSB7IHgsIHksIHogfTsKLQotICAgIFZlcnRleEFycmF5IHZhOwotICAgIHZhLmFkZExlZ2FjeShHTF9GTE9BVCwgMywgMTIsIFJTX0tJTkRfUE9TSVRJT04sIGZhbHNlLCAodWludDMyX3QpdnR4KTsKLSAgICBpZiAocnNjLT5jaGVja1ZlcnNpb24yXzAoKSkgewotICAgICAgICB2YS5zZXR1cEdMMihyc2MsICZyc2MtPm1TdGF0ZVZlcnRleEFycmF5LCAmcnNjLT5tU2hhZGVyQ2FjaGUpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHZhLnNldHVwR0wocnNjLCAmcnNjLT5tU3RhdGVWZXJ0ZXhBcnJheSk7Ci0gICAgfQotCi0gICAgZ2xEcmF3QXJyYXlzKEdMX1BPSU5UUywgMCwgMSk7Ci19Ci0KLXN0YXRpYyB2b2lkIFNDX2RyYXdRdWFkVGV4Q29vcmRzKGZsb2F0IHgxLCBmbG9hdCB5MSwgZmxvYXQgejEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB1MSwgZmxvYXQgdjEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4MiwgZmxvYXQgeTIsIGZsb2F0IHoyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdTIsIGZsb2F0IHYyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeDMsIGZsb2F0IHkzLCBmbG9hdCB6MywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHUzLCBmbG9hdCB2MywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHg0LCBmbG9hdCB5NCwgZmxvYXQgejQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB1NCwgZmxvYXQgdjQpCi17Ci0gICAgR0VUX1RMUygpOwotICAgIGlmICghcnNjLT5zZXR1cENoZWNrKCkpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8vTE9HRSgiUXVhZCIpOwotICAgIC8vTE9HRSgiJTQuMmYsICU0LjJmLCAlNC4yZiIsIHgxLCB5MSwgejEpOwotICAgIC8vTE9HRSgiJTQuMmYsICU0LjJmLCAlNC4yZiIsIHgyLCB5MiwgejIpOwotICAgIC8vTE9HRSgiJTQuMmYsICU0LjJmLCAlNC4yZiIsIHgzLCB5MywgejMpOwotICAgIC8vTE9HRSgiJTQuMmYsICU0LjJmLCAlNC4yZiIsIHg0LCB5NCwgejQpOwotCi0gICAgZmxvYXQgdnR4W10gPSB7eDEseTEsejEsIHgyLHkyLHoyLCB4Myx5Myx6MywgeDQseTQsejR9OwotICAgIGNvbnN0IGZsb2F0IHRleFtdID0ge3UxLHYxLCB1Mix2MiwgdTMsdjMsIHU0LHY0fTsKLQotICAgIFZlcnRleEFycmF5IHZhOwotICAgIHZhLmFkZExlZ2FjeShHTF9GTE9BVCwgMywgMTIsIFJTX0tJTkRfUE9TSVRJT04sIGZhbHNlLCAodWludDMyX3QpdnR4KTsKLSAgICB2YS5hZGRMZWdhY3koR0xfRkxPQVQsIDIsIDgsIFJTX0tJTkRfVEVYVFVSRSwgZmFsc2UsICh1aW50MzJfdCl0ZXgpOwotICAgIGlmIChyc2MtPmNoZWNrVmVyc2lvbjJfMCgpKSB7Ci0gICAgICAgIHZhLnNldHVwR0wyKHJzYywgJnJzYy0+bVN0YXRlVmVydGV4QXJyYXksICZyc2MtPm1TaGFkZXJDYWNoZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgdmEuc2V0dXBHTChyc2MsICZyc2MtPm1TdGF0ZVZlcnRleEFycmF5KTsKLSAgICB9Ci0KLQotICAgIGdsRHJhd0FycmF5cyhHTF9UUklBTkdMRV9GQU4sIDAsIDQpOwotfQotCi1zdGF0aWMgdm9pZCBTQ19kcmF3UXVhZChmbG9hdCB4MSwgZmxvYXQgeTEsIGZsb2F0IHoxLAotICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeDIsIGZsb2F0IHkyLCBmbG9hdCB6MiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHgzLCBmbG9hdCB5MywgZmxvYXQgejMsCi0gICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4NCwgZmxvYXQgeTQsIGZsb2F0IHo0KQotewotICAgIFNDX2RyYXdRdWFkVGV4Q29vcmRzKHgxLCB5MSwgejEsIDAsIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgeDIsIHkyLCB6MiwgMSwgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICB4MywgeTMsIHozLCAxLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgIHg0LCB5NCwgejQsIDAsIDApOwotfQotCi1zdGF0aWMgdm9pZCBTQ19kcmF3U3ByaXRlU2NyZWVuc3BhY2UoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeiwgZmxvYXQgdywgZmxvYXQgaCkKLXsKLSAgICBHRVRfVExTKCk7Ci0gICAgT2JqZWN0QmFzZVJlZjxjb25zdCBQcm9ncmFtVmVydGV4PiB0bXAocnNjLT5nZXRWZXJ0ZXgoKSk7Ci0gICAgcnNjLT5zZXRWZXJ0ZXgocnNjLT5nZXREZWZhdWx0UHJvZ3JhbVZlcnRleCgpKTsKLSAgICAvL3JzYy0+c2V0dXBDaGVjaygpOwotCi0gICAgLy9HTGludCBjcm9wWzRdID0gezAsIGgsIHcsIC1ofTsKLQotICAgIGZsb2F0IHNoID0gcnNjLT5nZXRIZWlnaHQoKTsKLQotICAgIFNDX2RyYXdRdWFkKHgsICAgc2ggLSB5LCAgICAgeiwKLSAgICAgICAgICAgICAgICB4K3csIHNoIC0geSwgICAgIHosCi0gICAgICAgICAgICAgICAgeCt3LCBzaCAtICh5K2gpLCB6LAotICAgICAgICAgICAgICAgIHgsICAgc2ggLSAoeStoKSwgeik7Ci0gICAgcnNjLT5zZXRWZXJ0ZXgoKFByb2dyYW1WZXJ0ZXggKil0bXAuZ2V0KCkpOwotfQotCi1zdGF0aWMgdm9pZCBTQ19kcmF3U3ByaXRlU2NyZWVuc3BhY2VDcm9wcGVkKGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHosIGZsb2F0IHcsIGZsb2F0IGgsCi0gICAgICAgIGZsb2F0IGN4MCwgZmxvYXQgY3kwLCBmbG9hdCBjeDEsIGZsb2F0IGN5MSkKLXsKLSAgICBHRVRfVExTKCk7Ci0gICAgaWYgKCFyc2MtPnNldHVwQ2hlY2soKSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgR0xpbnQgY3JvcFs0XSA9IHtjeDAsIGN5MCwgY3gxLCBjeTF9OwotICAgIGdsVGV4UGFyYW1ldGVyaXYoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9DUk9QX1JFQ1RfT0VTLCBjcm9wKTsKLSAgICBnbERyYXdUZXhmT0VTKHgsIHksIHosIHcsIGgpOwotfQotCi1zdGF0aWMgdm9pZCBTQ19kcmF3U3ByaXRlKGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHosIGZsb2F0IHcsIGZsb2F0IGgpCi17Ci0gICAgR0VUX1RMUygpOwotICAgIGZsb2F0IHZpblszXSA9IHt4LCB5LCB6fTsKLSAgICBmbG9hdCB2b3V0WzRdOwotCi0gICAgLy9MT0dFKCJkcyAgaW4gJWYgJWYgJWYiLCB4LCB5LCB6KTsKLSAgICByc2MtPmdldFZlcnRleCgpLT50cmFuc2Zvcm1Ub1NjcmVlbihyc2MsIHZvdXQsIHZpbik7Ci0gICAgLy9MT0dFKCJkcyAgb3V0ICVmICVmICVmICVmIiwgdm91dFswXSwgdm91dFsxXSwgdm91dFsyXSwgdm91dFszXSk7Ci0gICAgdm91dFswXSAvPSB2b3V0WzNdOwotICAgIHZvdXRbMV0gLz0gdm91dFszXTsKLSAgICB2b3V0WzJdIC89IHZvdXRbM107Ci0KLSAgICB2b3V0WzBdICo9IHJzYy0+Z2V0V2lkdGgoKSAvIDI7Ci0gICAgdm91dFsxXSAqPSByc2MtPmdldEhlaWdodCgpIC8gMjsKLSAgICB2b3V0WzBdICs9IHJzYy0+Z2V0V2lkdGgoKSAvIDI7Ci0gICAgdm91dFsxXSArPSByc2MtPmdldEhlaWdodCgpIC8gMjsKLQotICAgIHZvdXRbMF0gLT0gdy8yOwotICAgIHZvdXRbMV0gLT0gaC8yOwotCi0gICAgLy9MT0dFKCJkcyAgb3V0MiAlZiAlZiAlZiIsIHZvdXRbMF0sIHZvdXRbMV0sIHZvdXRbMl0pOwotCi0gICAgLy8gVSwgViwgVywgSAotICAgIFNDX2RyYXdTcHJpdGVTY3JlZW5zcGFjZSh2b3V0WzBdLCB2b3V0WzFdLCB6LCBoLCB3KTsKLSAgICAvL3JzYy0+c2V0dXBDaGVjaygpOwotfQotCi0KLXN0YXRpYyB2b2lkIFNDX2RyYXdSZWN0KGZsb2F0IHgxLCBmbG9hdCB5MSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHgyLCBmbG9hdCB5MiwgZmxvYXQgeikKLXsKLSAgICBTQ19kcmF3UXVhZCh4MSwgeTIsIHosCi0gICAgICAgICAgICAgICAgeDIsIHkyLCB6LAotICAgICAgICAgICAgICAgIHgyLCB5MSwgeiwKLSAgICAgICAgICAgICAgICB4MSwgeTEsIHopOwotfQotCi1zdGF0aWMgdm9pZCBTQ19kcmF3U2ltcGxlTWVzaChSc1NpbXBsZU1lc2ggdnNtKQotewotICAgIEdFVF9UTFMoKTsKLSAgICBTaW1wbGVNZXNoICpzbSA9IHN0YXRpY19jYXN0PFNpbXBsZU1lc2ggKj4odnNtKTsKLSAgICBpZiAoIXJzYy0+c2V0dXBDaGVjaygpKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgc20tPnJlbmRlcihyc2MpOwotfQotCi1zdGF0aWMgdm9pZCBTQ19kcmF3U2ltcGxlTWVzaFJhbmdlKFJzU2ltcGxlTWVzaCB2c20sIHVpbnQzMl90IHN0YXJ0LCB1aW50MzJfdCBsZW4pCi17Ci0gICAgR0VUX1RMUygpOwotICAgIFNpbXBsZU1lc2ggKnNtID0gc3RhdGljX2Nhc3Q8U2ltcGxlTWVzaCAqPih2c20pOwotICAgIGlmICghcnNjLT5zZXR1cENoZWNrKCkpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBzbS0+cmVuZGVyUmFuZ2UocnNjLCBzdGFydCwgbGVuKTsKKyAgICBpbnQ2NF90IGwgPSBzYy0+bUVudmlyb21lbnQubUxhc3REdFRpbWU7CisgICAgc2MtPm1FbnZpcm9tZW50Lm1MYXN0RHRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOworICAgIHJldHVybiAoKGZsb2F0KShzYy0+bUVudmlyb21lbnQubUxhc3REdFRpbWUgLSBsKSkgLyAxLjBlOTsKIH0KIAogCkBAIC04NjAsNTMxICsyMDIsMjcyIEBACiAvLwogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKLXN0YXRpYyB2b2lkIFNDX2NvbG9yKGZsb2F0IHIsIGZsb2F0IGcsIGZsb2F0IGIsIGZsb2F0IGEpCitzdGF0aWMgdWludDMyX3QgU0NfYWxsb2NHZXREaW1YKFJzQWxsb2NhdGlvbiB2YSkKIHsKICAgICBHRVRfVExTKCk7Ci0gICAgcnNjLT5tU3RhdGVWZXJ0ZXguY29sb3JbMF0gPSByOwotICAgIHJzYy0+bVN0YXRlVmVydGV4LmNvbG9yWzFdID0gZzsKLSAgICByc2MtPm1TdGF0ZVZlcnRleC5jb2xvclsyXSA9IGI7Ci0gICAgcnNjLT5tU3RhdGVWZXJ0ZXguY29sb3JbM10gPSBhOwotICAgIGlmICghcnNjLT5jaGVja1ZlcnNpb24yXzAoKSkgewotICAgICAgICBnbENvbG9yNGYociwgZywgYiwgYSk7Ci0gICAgfQorICAgIGNvbnN0IEFsbG9jYXRpb24gKmEgPSBzdGF0aWNfY2FzdDxjb25zdCBBbGxvY2F0aW9uICo+KHZhKTsKKyAgICAvL0xPR0UoIlNDX2FsbG9jR2V0RGltWCBhPSVwIiwgYSk7CisgICAgLy9MT0dFKCIgdHlwZT0lcCIsIGEtPmdldFR5cGUoKSk7CisgICAgcmV0dXJuIGEtPmdldFR5cGUoKS0+Z2V0RGltWCgpOwogfQogCi1zdGF0aWMgdm9pZCBTQ19hbWJpZW50KGZsb2F0IHIsIGZsb2F0IGcsIGZsb2F0IGIsIGZsb2F0IGEpCi17Ci0gICAgR0xmbG9hdCBwYXJhbXNbXSA9IHsgciwgZywgYiwgYSB9OwotICAgIGdsTWF0ZXJpYWxmdihHTF9GUk9OVF9BTkRfQkFDSywgR0xfQU1CSUVOVCwgcGFyYW1zKTsKLX0KLQotc3RhdGljIHZvaWQgU0NfZGlmZnVzZShmbG9hdCByLCBmbG9hdCBnLCBmbG9hdCBiLCBmbG9hdCBhKQotewotICAgIEdMZmxvYXQgcGFyYW1zW10gPSB7IHIsIGcsIGIsIGEgfTsKLSAgICBnbE1hdGVyaWFsZnYoR0xfRlJPTlRfQU5EX0JBQ0ssIEdMX0RJRkZVU0UsIHBhcmFtcyk7Ci19Ci0KLXN0YXRpYyB2b2lkIFNDX3NwZWN1bGFyKGZsb2F0IHIsIGZsb2F0IGcsIGZsb2F0IGIsIGZsb2F0IGEpCi17Ci0gICAgR0xmbG9hdCBwYXJhbXNbXSA9IHsgciwgZywgYiwgYSB9OwotICAgIGdsTWF0ZXJpYWxmdihHTF9GUk9OVF9BTkRfQkFDSywgR0xfU1BFQ1VMQVIsIHBhcmFtcyk7Ci19Ci0KLXN0YXRpYyB2b2lkIFNDX2VtaXNzaW9uKGZsb2F0IHIsIGZsb2F0IGcsIGZsb2F0IGIsIGZsb2F0IGEpCi17Ci0gICAgR0xmbG9hdCBwYXJhbXNbXSA9IHsgciwgZywgYiwgYSB9OwotICAgIGdsTWF0ZXJpYWxmdihHTF9GUk9OVF9BTkRfQkFDSywgR0xfRU1JU1NJT04sIHBhcmFtcyk7Ci19Ci0KLXN0YXRpYyB2b2lkIFNDX3NoaW5pbmVzcyhmbG9hdCBzKQotewotICAgIGdsTWF0ZXJpYWxmKEdMX0ZST05UX0FORF9CQUNLLCBHTF9TSElOSU5FU1MsIHMpOwotfQotCi1zdGF0aWMgdm9pZCBTQ19wb2ludEF0dGVudWF0aW9uKGZsb2F0IGEsIGZsb2F0IGIsIGZsb2F0IGMpCi17Ci0gICAgR0xmbG9hdCBwYXJhbXNbXSA9IHsgYSwgYiwgYyB9OwotICAgIGdsUG9pbnRQYXJhbWV0ZXJmdihHTF9QT0lOVF9ESVNUQU5DRV9BVFRFTlVBVElPTiwgcGFyYW1zKTsKLX0KLQotc3RhdGljIHZvaWQgU0NfaHNiVG9SZ2IoZmxvYXQgaCwgZmxvYXQgcywgZmxvYXQgYiwgZmxvYXQqIHJnYikKLXsKLSAgICBmbG9hdCByZWQgPSAwLjBmOwotICAgIGZsb2F0IGdyZWVuID0gMC4wZjsKLSAgICBmbG9hdCBibHVlID0gMC4wZjsKLQotICAgIGZsb2F0IHggPSBoOwotICAgIGZsb2F0IHkgPSBzOwotICAgIGZsb2F0IHogPSBiOwotCi0gICAgZmxvYXQgaGYgPSAoeCAtIChpbnQpIHgpICogNi4wZjsKLSAgICBpbnQgaWhmID0gKGludCkgaGY7Ci0gICAgZmxvYXQgZiA9IGhmIC0gaWhmOwotICAgIGZsb2F0IHB2ID0geiAqICgxLjBmIC0geSk7Ci0gICAgZmxvYXQgcXYgPSB6ICogKDEuMGYgLSB5ICogZik7Ci0gICAgZmxvYXQgdHYgPSB6ICogKDEuMGYgLSB5ICogKDEuMGYgLSBmKSk7Ci0KLSAgICBzd2l0Y2ggKGloZikgewotICAgICAgICBjYXNlIDA6ICAgICAgICAgLy8gUmVkIGlzIHRoZSBkb21pbmFudCBjb2xvcgotICAgICAgICAgICAgcmVkID0gejsKLSAgICAgICAgICAgIGdyZWVuID0gdHY7Ci0gICAgICAgICAgICBibHVlID0gcHY7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxOiAgICAgICAgIC8vIEdyZWVuIGlzIHRoZSBkb21pbmFudCBjb2xvcgotICAgICAgICAgICAgcmVkID0gcXY7Ci0gICAgICAgICAgICBncmVlbiA9IHo7Ci0gICAgICAgICAgICBibHVlID0gcHY7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgcmVkID0gcHY7Ci0gICAgICAgICAgICBncmVlbiA9IHo7Ci0gICAgICAgICAgICBibHVlID0gdHY7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAzOiAgICAgICAgIC8vIEJsdWUgaXMgdGhlIGRvbWluYW50IGNvbG9yCi0gICAgICAgICAgICByZWQgPSBwdjsKLSAgICAgICAgICAgIGdyZWVuID0gcXY7Ci0gICAgICAgICAgICBibHVlID0gejsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICByZWQgPSB0djsKLSAgICAgICAgICAgIGdyZWVuID0gcHY7Ci0gICAgICAgICAgICBibHVlID0gejsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDU6ICAgICAgICAgLy8gUmVkIGlzIHRoZSBkb21pbmFudCBjb2xvcgotICAgICAgICAgICAgcmVkID0gejsKLSAgICAgICAgICAgIGdyZWVuID0gcHY7Ci0gICAgICAgICAgICBibHVlID0gcXY7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICByZ2JbMF0gPSByZWQ7Ci0gICAgcmdiWzFdID0gZ3JlZW47Ci0gICAgcmdiWzJdID0gYmx1ZTsKLX0KLQotc3RhdGljIGludCBTQ19oc2JUb0FiZ3IoZmxvYXQgaCwgZmxvYXQgcywgZmxvYXQgYiwgZmxvYXQgYSkKLXsKLSAgICBmbG9hdCByZ2JbM107Ci0gICAgU0NfaHNiVG9SZ2IoaCwgcywgYiwgcmdiKTsKLSAgICByZXR1cm4gaW50KGEgICAgICAqIDI1NS4wZikgPDwgMjQgfAotICAgICAgICAgICBpbnQocmdiWzJdICogMjU1LjBmKSA8PCAxNiB8Ci0gICAgICAgICAgIGludChyZ2JbMV0gKiAyNTUuMGYpIDw8ICA4IHwKLSAgICAgICAgICAgaW50KHJnYlswXSAqIDI1NS4wZik7Ci19Ci0KLXN0YXRpYyB2b2lkIFNDX2hzYihmbG9hdCBoLCBmbG9hdCBzLCBmbG9hdCBiLCBmbG9hdCBhKQorc3RhdGljIHVpbnQzMl90IFNDX2FsbG9jR2V0RGltWShSc0FsbG9jYXRpb24gdmEpCiB7CiAgICAgR0VUX1RMUygpOwotICAgIGZsb2F0IHJnYlszXTsKLSAgICBTQ19oc2JUb1JnYihoLCBzLCBiLCByZ2IpOwotICAgIGlmIChyc2MtPmNoZWNrVmVyc2lvbjJfMCgpKSB7Ci0gICAgICAgIGdsVmVydGV4QXR0cmliNGYoMSwgcmdiWzBdLCByZ2JbMV0sIHJnYlsyXSwgYSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZ2xDb2xvcjRmKHJnYlswXSwgcmdiWzFdLCByZ2JbMl0sIGEpOwotICAgIH0KKyAgICBjb25zdCBBbGxvY2F0aW9uICphID0gc3RhdGljX2Nhc3Q8Y29uc3QgQWxsb2NhdGlvbiAqPih2YSk7CisgICAgcmV0dXJuIGEtPmdldFR5cGUoKS0+Z2V0RGltWSgpOwogfQogCi1zdGF0aWMgdm9pZCBTQ191cGxvYWRUb1RleHR1cmUoUnNBbGxvY2F0aW9uIHZhLCB1aW50MzJfdCBiYXNlTWlwTGV2ZWwpCitzdGF0aWMgdWludDMyX3QgU0NfYWxsb2NHZXREaW1aKFJzQWxsb2NhdGlvbiB2YSkKIHsKICAgICBHRVRfVExTKCk7Ci0gICAgcnNpX0FsbG9jYXRpb25VcGxvYWRUb1RleHR1cmUocnNjLCB2YSwgZmFsc2UsIGJhc2VNaXBMZXZlbCk7CisgICAgY29uc3QgQWxsb2NhdGlvbiAqYSA9IHN0YXRpY19jYXN0PGNvbnN0IEFsbG9jYXRpb24gKj4odmEpOworICAgIHJldHVybiBhLT5nZXRUeXBlKCktPmdldERpbVooKTsKIH0KIAotc3RhdGljIHZvaWQgU0NfdXBsb2FkVG9CdWZmZXJPYmplY3QoUnNBbGxvY2F0aW9uIHZhKQorc3RhdGljIHVpbnQzMl90IFNDX2FsbG9jR2V0RGltTE9EKFJzQWxsb2NhdGlvbiB2YSkKIHsKICAgICBHRVRfVExTKCk7Ci0gICAgcnNpX0FsbG9jYXRpb25VcGxvYWRUb0J1ZmZlck9iamVjdChyc2MsIHZhKTsKKyAgICBjb25zdCBBbGxvY2F0aW9uICphID0gc3RhdGljX2Nhc3Q8Y29uc3QgQWxsb2NhdGlvbiAqPih2YSk7CisgICAgcmV0dXJuIGEtPmdldFR5cGUoKS0+Z2V0RGltTE9EKCk7CiB9CiAKLXN0YXRpYyB2b2lkIFNDX3N5bmNUb0dMKFJzQWxsb2NhdGlvbiB2YSkKK3N0YXRpYyB1aW50MzJfdCBTQ19hbGxvY0dldERpbUZhY2VzKFJzQWxsb2NhdGlvbiB2YSkKIHsKICAgICBHRVRfVExTKCk7Ci0gICAgQWxsb2NhdGlvbiAqYSA9IHN0YXRpY19jYXN0PEFsbG9jYXRpb24gKj4odmEpOwotCisgICAgY29uc3QgQWxsb2NhdGlvbiAqYSA9IHN0YXRpY19jYXN0PGNvbnN0IEFsbG9jYXRpb24gKj4odmEpOworICAgIHJldHVybiBhLT5nZXRUeXBlKCktPmdldERpbUZhY2VzKCk7CiB9CiAKLXN0YXRpYyB2b2lkIFNDX0NsZWFyQ29sb3IoZmxvYXQgciwgZmxvYXQgZywgZmxvYXQgYiwgZmxvYXQgYSkKK3N0YXRpYyBjb25zdCB2b2lkICogU0NfZ2V0RWxlbWVudEF0WChSc0FsbG9jYXRpb24gdmEsIHVpbnQzMl90IHgpCiB7Ci0gICAgLy9MT0dFKCJjICVmICVmICVmICVmIiwgciwgZywgYiwgYSk7Ci0gICAgR0VUX1RMUygpOwotICAgIHNjLT5tRW52aXJvbWVudC5tQ2xlYXJDb2xvclswXSA9IHI7Ci0gICAgc2MtPm1FbnZpcm9tZW50Lm1DbGVhckNvbG9yWzFdID0gZzsKLSAgICBzYy0+bUVudmlyb21lbnQubUNsZWFyQ29sb3JbMl0gPSBiOwotICAgIHNjLT5tRW52aXJvbWVudC5tQ2xlYXJDb2xvclszXSA9IGE7CisgICAgY29uc3QgQWxsb2NhdGlvbiAqYSA9IHN0YXRpY19jYXN0PGNvbnN0IEFsbG9jYXRpb24gKj4odmEpOworICAgIGNvbnN0IFR5cGUgKnQgPSBhLT5nZXRUeXBlKCk7CisgICAgY29uc3QgdWludDhfdCAqcCA9IChjb25zdCB1aW50OF90ICopYS0+Z2V0UHRyKCk7CisgICAgcmV0dXJuICZwW3QtPmdldEVsZW1lbnRTaXplQnl0ZXMoKSAqIHhdOwogfQogCi1zdGF0aWMgdm9pZCBTQ19kZWJ1Z0YoY29uc3QgY2hhciAqcywgZmxvYXQgZikKK3N0YXRpYyBjb25zdCB2b2lkICogU0NfZ2V0RWxlbWVudEF0WFkoUnNBbGxvY2F0aW9uIHZhLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5KQogewotICAgIExPR0UoIiVzICVmIiwgcywgZik7CisgICAgY29uc3QgQWxsb2NhdGlvbiAqYSA9IHN0YXRpY19jYXN0PGNvbnN0IEFsbG9jYXRpb24gKj4odmEpOworICAgIGNvbnN0IFR5cGUgKnQgPSBhLT5nZXRUeXBlKCk7CisgICAgY29uc3QgdWludDhfdCAqcCA9IChjb25zdCB1aW50OF90ICopYS0+Z2V0UHRyKCk7CisgICAgcmV0dXJuICZwW3QtPmdldEVsZW1lbnRTaXplQnl0ZXMoKSAqICh4ICsgeSp0LT5nZXREaW1YKCkpXTsKIH0KIAotc3RhdGljIHZvaWQgU0NfZGVidWdIZXhGKGNvbnN0IGNoYXIgKnMsIGZsb2F0IGYpCitzdGF0aWMgY29uc3Qgdm9pZCAqIFNDX2dldEVsZW1lbnRBdFhZWihSc0FsbG9jYXRpb24gdmEsIHVpbnQzMl90IHgsIHVpbnQzMl90IHksIHVpbnQzMl90IHopCiB7Ci0gICAgTE9HRSgiJXMgMHgleCIsIHMsICooKGludCAqKSAoJmYpKSk7CisgICAgY29uc3QgQWxsb2NhdGlvbiAqYSA9IHN0YXRpY19jYXN0PGNvbnN0IEFsbG9jYXRpb24gKj4odmEpOworICAgIGNvbnN0IFR5cGUgKnQgPSBhLT5nZXRUeXBlKCk7CisgICAgY29uc3QgdWludDhfdCAqcCA9IChjb25zdCB1aW50OF90ICopYS0+Z2V0UHRyKCk7CisgICAgcmV0dXJuICZwW3QtPmdldEVsZW1lbnRTaXplQnl0ZXMoKSAqICh4ICsgeSp0LT5nZXREaW1YKCkpXTsKIH0KIAotc3RhdGljIHZvaWQgU0NfZGVidWdJMzIoY29uc3QgY2hhciAqcywgaW50MzJfdCBpKQotewotICAgIExPR0UoIiVzICVpIiwgcywgaSk7CitzdGF0aWMgdm9pZCBTQ19zZXRPYmplY3Qodm9pZCAqKnZkc3QsIHZvaWQgKiB2c3JjKSB7CisgICAgc3RhdGljX2Nhc3Q8T2JqZWN0QmFzZSAqPih2c3JjKS0+aW5jU3lzUmVmKCk7CisgICAgc3RhdGljX2Nhc3Q8T2JqZWN0QmFzZSAqPih2ZHN0WzBdKS0+ZGVjU3lzUmVmKCk7CisgICAgKnZkc3QgPSB2c3JjOworfQorc3RhdGljIHZvaWQgU0NfY2xlYXJPYmplY3Qodm9pZCAqKnZkc3QpIHsKKyAgICBzdGF0aWNfY2FzdDxPYmplY3RCYXNlICo+KHZkc3RbMF0pLT5kZWNTeXNSZWYoKTsKKyAgICAqdmRzdCA9IE5VTEw7Cit9CitzdGF0aWMgYm9vbCBTQ19pc09iamVjdChSc0FsbG9jYXRpb24gdnNyYykgeworICAgIHJldHVybiB2c3JjICE9IE5VTEw7CiB9CiAKLXN0YXRpYyB2b2lkIFNDX2RlYnVnSGV4STMyKGNvbnN0IGNoYXIgKnMsIGludDMyX3QgaSkKLXsKLSAgICBMT0dFKCIlcyAweCV4IiwgcywgaSk7CisKKworc3RhdGljIHZvaWQgU0NfZGVidWdGKGNvbnN0IGNoYXIgKnMsIGZsb2F0IGYpIHsKKyAgICBMT0dFKCIlcyAlZiwgMHglMDh4IiwgcywgZiwgKigoaW50ICopICgmZikpKTsKK30KK3N0YXRpYyB2b2lkIFNDX2RlYnVnRnYyKGNvbnN0IGNoYXIgKnMsIGZsb2F0IGYxLCBmbG9hdCBmMikgeworICAgIExPR0UoIiVzIHslZiwgJWZ9IiwgcywgZjEsIGYyKTsKK30KK3N0YXRpYyB2b2lkIFNDX2RlYnVnRnYzKGNvbnN0IGNoYXIgKnMsIGZsb2F0IGYxLCBmbG9hdCBmMiwgZmxvYXQgZjMpIHsKKyAgICBMT0dFKCIlcyB7JWYsICVmLCAlZn0iLCBzLCBmMSwgZjIsIGYzKTsKK30KK3N0YXRpYyB2b2lkIFNDX2RlYnVnRnY0KGNvbnN0IGNoYXIgKnMsIGZsb2F0IGYxLCBmbG9hdCBmMiwgZmxvYXQgZjMsIGZsb2F0IGY0KSB7CisgICAgTE9HRSgiJXMgeyVmLCAlZiwgJWYsICVmfSIsIHMsIGYxLCBmMiwgZjMsIGY0KTsKK30KK3N0YXRpYyB2b2lkIFNDX2RlYnVnRk00djQoY29uc3QgY2hhciAqcywgY29uc3QgZmxvYXQgKmYpIHsKKyAgICBMT0dFKCIlcyB7JWYsICVmLCAlZiwgJWYiLCBzLCBmWzBdLCBmWzRdLCBmWzhdLCBmWzEyXSk7CisgICAgTE9HRSgiJXMgICVmLCAlZiwgJWYsICVmIiwgcywgZlsxXSwgZls1XSwgZls5XSwgZlsxM10pOworICAgIExPR0UoIiVzICAlZiwgJWYsICVmLCAlZiIsIHMsIGZbMl0sIGZbNl0sIGZbMTBdLCBmWzE0XSk7CisgICAgTE9HRSgiJXMgICVmLCAlZiwgJWYsICVmfSIsIHMsIGZbM10sIGZbN10sIGZbMTFdLCBmWzE1XSk7Cit9CitzdGF0aWMgdm9pZCBTQ19kZWJ1Z0ZNM3YzKGNvbnN0IGNoYXIgKnMsIGNvbnN0IGZsb2F0ICpmKSB7CisgICAgTE9HRSgiJXMgeyVmLCAlZiwgJWYiLCBzLCBmWzBdLCBmWzNdLCBmWzZdKTsKKyAgICBMT0dFKCIlcyAgJWYsICVmLCAlZiIsIHMsIGZbMV0sIGZbNF0sIGZbN10pOworICAgIExPR0UoIiVzICAlZiwgJWYsICVmfSIscywgZlsyXSwgZls1XSwgZls4XSk7Cit9CitzdGF0aWMgdm9pZCBTQ19kZWJ1Z0ZNMnYyKGNvbnN0IGNoYXIgKnMsIGNvbnN0IGZsb2F0ICpmKSB7CisgICAgTE9HRSgiJXMgeyVmLCAlZiIsIHMsIGZbMF0sIGZbMl0pOworICAgIExPR0UoIiVzICAlZiwgJWZ9IixzLCBmWzFdLCBmWzNdKTsKIH0KIAotc3RhdGljIHVpbnQzMl90IFNDX2dldFdpZHRoKCkKK3N0YXRpYyB2b2lkIFNDX2RlYnVnSTMyKGNvbnN0IGNoYXIgKnMsIGludDMyX3QgaSkgeworICAgIExPR0UoIiVzICVpICAweCV4IiwgcywgaSwgaSk7Cit9CitzdGF0aWMgdm9pZCBTQ19kZWJ1Z1UzMihjb25zdCBjaGFyICpzLCB1aW50MzJfdCBpKSB7CisgICAgTE9HRSgiJXMgJWkgIDB4JXgiLCBzLCBpLCBpKTsKK30KKworc3RhdGljIHZvaWQgU0NfZGVidWdQKGNvbnN0IGNoYXIgKnMsIGNvbnN0IHZvaWQgKnApIHsKKyAgICBMT0dFKCIlcyAlcCIsIHMsIHApOworfQorCitzdGF0aWMgdWludDMyX3QgU0NfdG9DbGllbnQyKGludCBjbWRJRCwgdm9pZCAqZGF0YSwgaW50IGxlbikKIHsKICAgICBHRVRfVExTKCk7Ci0gICAgcmV0dXJuIHJzYy0+Z2V0V2lkdGgoKTsKKyAgICAvL0xPR0UoIlNDX3RvQ2xpZW50ICVpICVpICVpIiwgY21kSUQsIGxlbik7CisgICAgcmV0dXJuIHJzYy0+c2VuZE1lc3NhZ2VUb0NsaWVudChkYXRhLCBjbWRJRCwgbGVuLCBmYWxzZSk7CiB9CiAKLXN0YXRpYyB1aW50MzJfdCBTQ19nZXRIZWlnaHQoKQorc3RhdGljIHVpbnQzMl90IFNDX3RvQ2xpZW50KGludCBjbWRJRCkKIHsKICAgICBHRVRfVExTKCk7Ci0gICAgcmV0dXJuIHJzYy0+Z2V0SGVpZ2h0KCk7CisgICAgLy9MT0dFKCJTQ190b0NsaWVudCAlaSIsIGNtZElEKTsKKyAgICByZXR1cm4gcnNjLT5zZW5kTWVzc2FnZVRvQ2xpZW50KE5VTEwsIGNtZElELCAwLCBmYWxzZSk7CiB9CiAKLXN0YXRpYyB1aW50MzJfdCBTQ19jb2xvckZsb2F0UkdCQXRvVU5vcm04KGZsb2F0IHIsIGZsb2F0IGcsIGZsb2F0IGIsIGZsb2F0IGEpCi17Ci0gICAgdWludDMyX3QgYyA9IDA7Ci0gICAgYyB8PSAodWludDMyX3QpKHIgKiAyNTUuZiArIDAuNWYpOwotICAgIGMgfD0gKCh1aW50MzJfdCkoZyAqIDI1NS5mICsgMC41ZikpIDw8IDg7Ci0gICAgYyB8PSAoKHVpbnQzMl90KShiICogMjU1LmYgKyAwLjVmKSkgPDwgMTY7Ci0gICAgYyB8PSAoKHVpbnQzMl90KShhICogMjU1LmYgKyAwLjVmKSkgPDwgMjQ7Ci0gICAgcmV0dXJuIGM7Ci19Ci0KLXN0YXRpYyB1aW50MzJfdCBTQ19jb2xvckZsb2F0UkdCQXRvNTY1KGZsb2F0IHIsIGZsb2F0IGcsIGZsb2F0IGIpCi17Ci0gICAgdWludDMyX3QgaXIgPSAodWludDMyX3QpKHIgKiAyNTUuZiArIDAuNWYpOwotICAgIHVpbnQzMl90IGlnID0gKHVpbnQzMl90KShnICogMjU1LmYgKyAwLjVmKTsKLSAgICB1aW50MzJfdCBpYiA9ICh1aW50MzJfdCkoYiAqIDI1NS5mICsgMC41Zik7Ci0gICAgcmV0dXJuIHJzODg4dG81NjUoaXIsIGlnLCBpYik7Ci19Ci0KLXN0YXRpYyB1aW50MzJfdCBTQ190b0NsaWVudCh2b2lkICpkYXRhLCBpbnQgY21kSUQsIGludCBsZW4sIGludCB3YWl0Rm9yU3BhY2UpCitzdGF0aWMgdWludDMyX3QgU0NfdG9DbGllbnRCbG9ja2luZzIoaW50IGNtZElELCB2b2lkICpkYXRhLCBpbnQgbGVuKQogewogICAgIEdFVF9UTFMoKTsKLSAgICByZXR1cm4gcnNjLT5zZW5kTWVzc2FnZVRvQ2xpZW50KGRhdGEsIGNtZElELCBsZW4sIHdhaXRGb3JTcGFjZSAhPSAwKTsKKyAgICAvL0xPR0UoIlNDX3RvQ2xpZW50QmxvY2tpbmcgJWkgJWkiLCBjbWRJRCwgbGVuKTsKKyAgICByZXR1cm4gcnNjLT5zZW5kTWVzc2FnZVRvQ2xpZW50KGRhdGEsIGNtZElELCBsZW4sIHRydWUpOwogfQogCi1zdGF0aWMgdm9pZCBTQ19zY3JpcHRDYWxsKGludCBzY3JpcHRJRCkKK3N0YXRpYyB1aW50MzJfdCBTQ190b0NsaWVudEJsb2NraW5nKGludCBjbWRJRCkKIHsKICAgICBHRVRfVExTKCk7Ci0gICAgcnNjLT5ydW5TY3JpcHQoKFNjcmlwdCAqKXNjcmlwdElELCAwKTsKKyAgICAvL0xPR0UoIlNDX3RvQ2xpZW50QmxvY2tpbmcgJWkiLCBjbWRJRCk7CisgICAgcmV0dXJuIHJzYy0+c2VuZE1lc3NhZ2VUb0NsaWVudChOVUxMLCBjbWRJRCwgMCwgdHJ1ZSk7CiB9CiAKK2ludCBTQ19kaXZzaTMoaW50IGEsIGludCBiKQoreworICAgIHJldHVybiBhIC8gYjsKK30KKworaW50IFNDX2dldEFsbG9jYXRpb24oY29uc3Qgdm9pZCAqcHRyKQoreworICAgIEdFVF9UTFMoKTsKKyAgICBjb25zdCBBbGxvY2F0aW9uICphbGxvYyA9IHNjLT5wdHJUb0FsbG9jYXRpb24ocHRyKTsKKyAgICByZXR1cm4gKGludClhbGxvYzsKK30KKworCit2b2lkIFNDX0ZvckVhY2goUnNTY3JpcHQgdnMsCisgICAgICAgICAgICAgICAgUnNBbGxvY2F0aW9uIHZpbiwKKyAgICAgICAgICAgICAgICBSc0FsbG9jYXRpb24gdm91dCwKKyAgICAgICAgICAgICAgICBjb25zdCB2b2lkICp1c3IpCit7CisgICAgR0VUX1RMUygpOworICAgIGNvbnN0IEFsbG9jYXRpb24gKmFpbiA9IHN0YXRpY19jYXN0PGNvbnN0IEFsbG9jYXRpb24gKj4odmluKTsKKyAgICBBbGxvY2F0aW9uICphb3V0ID0gc3RhdGljX2Nhc3Q8QWxsb2NhdGlvbiAqPih2b3V0KTsKKyAgICBTY3JpcHQgKnMgPSBzdGF0aWNfY2FzdDxTY3JpcHQgKj4odnMpOworICAgIHMtPnJ1bkZvckVhY2gocnNjLCBhaW4sIGFvdXQsIHVzcik7Cit9CisKK3ZvaWQgU0NfRm9yRWFjaDIoUnNTY3JpcHQgdnMsCisgICAgICAgICAgICAgICAgUnNBbGxvY2F0aW9uIHZpbiwKKyAgICAgICAgICAgICAgICBSc0FsbG9jYXRpb24gdm91dCwKKyAgICAgICAgICAgICAgICBjb25zdCB2b2lkICp1c3IsCisgICAgICAgICAgICAgICAgY29uc3QgUnNTY3JpcHRDYWxsICpjYWxsKQoreworICAgIEdFVF9UTFMoKTsKKyAgICBjb25zdCBBbGxvY2F0aW9uICphaW4gPSBzdGF0aWNfY2FzdDxjb25zdCBBbGxvY2F0aW9uICo+KHZpbik7CisgICAgQWxsb2NhdGlvbiAqYW91dCA9IHN0YXRpY19jYXN0PEFsbG9jYXRpb24gKj4odm91dCk7CisgICAgU2NyaXB0ICpzID0gc3RhdGljX2Nhc3Q8U2NyaXB0ICo+KHZzKTsKKyAgICBzLT5ydW5Gb3JFYWNoKHJzYywgYWluLCBhb3V0LCB1c3IsIGNhbGwpOworfQogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIC8vIENsYXNzIGltcGxlbWVudGF0aW9uCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAotU2NyaXB0Q1N0YXRlOjpTeW1ib2xUYWJsZV90IFNjcmlwdENTdGF0ZTo6Z1N5bXNbXSA9IHsKLSAgICAvLyBJTwotICAgIHsgImxvYWRJMzIiLCAodm9pZCAqKSZTQ19sb2FkSTMyLAotICAgICAgICAiaW50IiwgIihpbnQsIGludCkiIH0sCi0gICAgLy97ICJsb2FkVTMyIiwgKHZvaWQgKikmU0NfbG9hZFUzMiwgInVuc2lnbmVkIGludCIsICIoaW50LCBpbnQpIiB9LAotICAgIHsgImxvYWRGIiwgKHZvaWQgKikmU0NfbG9hZEYsCi0gICAgICAgICJmbG9hdCIsICIoaW50LCBpbnQpIiB9LAotICAgIHsgImxvYWRBcnJheUYiLCAodm9pZCAqKSZTQ19sb2FkQXJyYXlGLAotICAgICAgICAiZmxvYXQqIiwgIihpbnQsIGludCkiIH0sCi0gICAgeyAibG9hZEFycmF5STMyIiwgKHZvaWQgKikmU0NfbG9hZEFycmF5STMyLAotICAgICAgICAiaW50KiIsICIoaW50LCBpbnQpIiB9LAotICAgIHsgImxvYWRWZWM0IiwgKHZvaWQgKikmU0NfbG9hZFZlYzQsCi0gICAgICAgICJ2b2lkIiwgIihpbnQsIGludCwgZmxvYXQgKikiIH0sCi0gICAgeyAibG9hZE1hdHJpeCIsICh2b2lkICopJlNDX2xvYWRNYXRyaXgsCi0gICAgICAgICJ2b2lkIiwgIihpbnQsIGludCwgZmxvYXQgKikiIH0sCi0gICAgeyAic3RvcmVJMzIiLCAodm9pZCAqKSZTQ19zdG9yZUkzMiwKLSAgICAgICAgInZvaWQiLCAiKGludCwgaW50LCBpbnQpIiB9LAotICAgIC8veyAic3RvcmVVMzIiLCAodm9pZCAqKSZTQ19zdG9yZVUzMiwgInZvaWQiLCAiKGludCwgaW50LCB1bnNpZ25lZCBpbnQpIiB9LAotICAgIHsgInN0b3JlRiIsICh2b2lkICopJlNDX3N0b3JlRiwKLSAgICAgICAgInZvaWQiLCAiKGludCwgaW50LCBmbG9hdCkiIH0sCi0gICAgeyAic3RvcmVWZWM0IiwgKHZvaWQgKikmU0Nfc3RvcmVWZWM0LAotICAgICAgICAidm9pZCIsICIoaW50LCBpbnQsIGZsb2F0ICopIiB9LAotICAgIHsgInN0b3JlTWF0cml4IiwgKHZvaWQgKikmU0Nfc3RvcmVNYXRyaXgsCi0gICAgICAgICJ2b2lkIiwgIihpbnQsIGludCwgZmxvYXQgKikiIH0sCi0gICAgeyAibG9hZFNpbXBsZU1lc2hWZXJ0aWNlc0YiLCAodm9pZCAqKSZTQ19sb2FkU2ltcGxlTWVzaFZlcnRpY2VzRiwKLSAgICAgICAgImZsb2F0KiIsICIoaW50LCBpbnQpIiB9LAotICAgIHsgInVwZGF0ZVNpbXBsZU1lc2giLCAodm9pZCAqKSZTQ191cGRhdGVTaW1wbGVNZXNoLAotICAgICAgICAidm9pZCIsICIoaW50KSIgfSwKKy8vIGxsdm0gbmFtZSBtYW5nbGluZyByZWYKKy8vICA8YnVpbHRpbi10eXBlPiA6Oj0gdiAgIyB2b2lkCisvLyAgICAgICAgICAgICAgICAgOjo9IGIgICMgYm9vbAorLy8gICAgICAgICAgICAgICAgIDo6PSBjICAjIGNoYXIKKy8vICAgICAgICAgICAgICAgICA6Oj0gYSAgIyBzaWduZWQgY2hhcgorLy8gICAgICAgICAgICAgICAgIDo6PSBoICAjIHVuc2lnbmVkIGNoYXIKKy8vICAgICAgICAgICAgICAgICA6Oj0gcyAgIyBzaG9ydAorLy8gICAgICAgICAgICAgICAgIDo6PSB0ICAjIHVuc2lnbmVkIHNob3J0CisvLyAgICAgICAgICAgICAgICAgOjo9IGkgICMgaW50CisvLyAgICAgICAgICAgICAgICAgOjo9IGogICMgdW5zaWduZWQgaW50CisvLyAgICAgICAgICAgICAgICAgOjo9IGwgICMgbG9uZworLy8gICAgICAgICAgICAgICAgIDo6PSBtICAjIHVuc2lnbmVkIGxvbmcKKy8vICAgICAgICAgICAgICAgICA6Oj0geCAgIyBsb25nIGxvbmcsIF9faW50NjQKKy8vICAgICAgICAgICAgICAgICA6Oj0geSAgIyB1bnNpZ25lZCBsb25nIGxvbmcsIF9faW50NjQKKy8vICAgICAgICAgICAgICAgICA6Oj0gZiAgIyBmbG9hdAorLy8gICAgICAgICAgICAgICAgIDo6PSBkICAjIGRvdWJsZQogCi0gICAgLy8gbWF0aAotICAgIHsgIm1vZGYiLCAodm9pZCAqKSZmbW9kLAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0LCBmbG9hdCkiIH0sCi0gICAgeyAiYWJzIiwgKHZvaWQgKikmYWJzLAotICAgICAgICAiaW50IiwgIihpbnQpIiB9LAotICAgIHsgImFic2YiLCAodm9pZCAqKSZmYWJzZiwKLSAgICAgICAgImZsb2F0IiwgIihmbG9hdCkiIH0sCi0gICAgeyAic2luZl9mYXN0IiwgKHZvaWQgKikmU0Nfc2luZl9mYXN0LAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0KSIgfSwKLSAgICB7ICJjb3NmX2Zhc3QiLCAodm9pZCAqKSZTQ19jb3NmX2Zhc3QsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQpIiB9LAotICAgIHsgInNpbmYiLCAodm9pZCAqKSZzaW5mLAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0KSIgfSwKLSAgICB7ICJjb3NmIiwgKHZvaWQgKikmY29zZiwKLSAgICAgICAgImZsb2F0IiwgIihmbG9hdCkiIH0sCi0gICAgeyAiYXNpbmYiLCAodm9pZCAqKSZhc2luZiwKLSAgICAgICAgImZsb2F0IiwgIihmbG9hdCkiIH0sCi0gICAgeyAiYWNvc2YiLCAodm9pZCAqKSZhY29zZiwKLSAgICAgICAgImZsb2F0IiwgIihmbG9hdCkiIH0sCi0gICAgeyAiYXRhbmYiLCAodm9pZCAqKSZhdGFuZiwKLSAgICAgICAgImZsb2F0IiwgIihmbG9hdCkiIH0sCi0gICAgeyAiYXRhbjJmIiwgKHZvaWQgKikmYXRhbjJmLAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0LCBmbG9hdCkiIH0sCi0gICAgeyAiZmFic2YiLCAodm9pZCAqKSZmYWJzZiwKLSAgICAgICAgImZsb2F0IiwgIihmbG9hdCkiIH0sCi0gICAgeyAicmFuZGYiLCAodm9pZCAqKSZTQ19yYW5kZiwKLSAgICAgICAgImZsb2F0IiwgIihmbG9hdCkiIH0sCi0gICAgeyAicmFuZGYyIiwgKHZvaWQgKikmU0NfcmFuZGYyLAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0LCBmbG9hdCkiIH0sCi0gICAgeyAiZmxvb3JmIiwgKHZvaWQgKikmZmxvb3JmLAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0KSIgfSwKLSAgICB7ICJmcmFjZiIsICh2b2lkICopJlNDX2ZyYWNmLAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0KSIgfSwKLSAgICB7ICJjZWlsZiIsICh2b2lkICopJmNlaWxmLAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0KSIgfSwKLSAgICB7ICJyb3VuZGYiLCAodm9pZCAqKSZTQ19yb3VuZGYsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQpIiB9LAotICAgIHsgImV4cGYiLCAodm9pZCAqKSZleHBmLAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0KSIgfSwKLSAgICB7ICJsb2dmIiwgKHZvaWQgKikmbG9nZiwKLSAgICAgICAgImZsb2F0IiwgIihmbG9hdCkiIH0sCi0gICAgeyAicG93ZiIsICh2b2lkICopJnBvd2YsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQsIGZsb2F0KSIgfSwKLSAgICB7ICJtYXhmIiwgKHZvaWQgKikmU0NfbWF4ZiwKLSAgICAgICAgImZsb2F0IiwgIihmbG9hdCwgZmxvYXQpIiB9LAotICAgIHsgIm1pbmYiLCAodm9pZCAqKSZTQ19taW5mLAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0LCBmbG9hdCkiIH0sCi0gICAgeyAic3FydCIsICh2b2lkICopJnNxcnQsCi0gICAgICAgICJpbnQiLCAiKGludCkiIH0sCi0gICAgeyAic3FydGYiLCAodm9pZCAqKSZzcXJ0ZiwKLSAgICAgICAgImZsb2F0IiwgIihmbG9hdCkiIH0sCi0gICAgeyAic3FyIiwgKHZvaWQgKikmU0Nfc3FyLAotICAgICAgICAiaW50IiwgIihpbnQpIiB9LAotICAgIHsgInNxcmYiLCAodm9pZCAqKSZTQ19zcXJmLAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0KSIgfSwKLSAgICB7ICJzaWduIiwgKHZvaWQgKikmU0Nfc2lnbiwKLSAgICAgICAgImludCIsICIoaW50KSIgfSwKLSAgICB7ICJzaWduZiIsICh2b2lkICopJlNDX3NpZ25mLAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0KSIgfSwKLSAgICB7ICJjbGFtcCIsICh2b2lkICopJlNDX2NsYW1wLAotICAgICAgICAiaW50IiwgIihpbnQsIGludCwgaW50KSIgfSwKLSAgICB7ICJjbGFtcGYiLCAodm9pZCAqKSZTQ19jbGFtcGYsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQsIGZsb2F0LCBmbG9hdCkiIH0sCi0gICAgeyAiZGlzdGYyIiwgKHZvaWQgKikmU0NfZGlzdGYyLAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0LCBmbG9hdCwgZmxvYXQsIGZsb2F0KSIgfSwKLSAgICB7ICJkaXN0ZjMiLCAodm9pZCAqKSZTQ19kaXN0ZjMsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQsIGZsb2F0LCBmbG9hdCwgZmxvYXQsIGZsb2F0LCBmbG9hdCkiIH0sCi0gICAgeyAibWFnZjIiLCAodm9pZCAqKSZTQ19tYWdmMiwKLSAgICAgICAgImZsb2F0IiwgIihmbG9hdCwgZmxvYXQpIiB9LAotICAgIHsgIm1hZ2YzIiwgKHZvaWQgKikmU0NfbWFnZjMsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQsIGZsb2F0LCBmbG9hdCkiIH0sCi0gICAgeyAicmFkZiIsICh2b2lkICopJlNDX3JhZGYsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQpIiB9LAotICAgIHsgImRlZ2YiLCAodm9pZCAqKSZTQ19kZWdmLAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0KSIgfSwKLSAgICB7ICJsZXJwZiIsICh2b2lkICopJlNDX2xlcnBmLAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0LCBmbG9hdCwgZmxvYXQpIiB9LAotICAgIHsgIm5vcm1mIiwgKHZvaWQgKikmU0Nfbm9ybWYsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQsIGZsb2F0LCBmbG9hdCkiIH0sCi0gICAgeyAibWFwZiIsICh2b2lkICopJlNDX21hcGYsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQsIGZsb2F0LCBmbG9hdCwgZmxvYXQsIGZsb2F0KSIgfSwKLSAgICB7ICJub2lzZWYiLCAodm9pZCAqKSZTQ19ub2lzZWYsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQpIiB9LAotICAgIHsgIm5vaXNlZjIiLCAodm9pZCAqKSZTQ19ub2lzZWYyLAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0LCBmbG9hdCkiIH0sCi0gICAgeyAibm9pc2VmMyIsICh2b2lkICopJlNDX25vaXNlZjMsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQsIGZsb2F0LCBmbG9hdCkiIH0sCi0gICAgeyAidHVyYnVsZW5jZWYyIiwgKHZvaWQgKikmU0NfdHVyYnVsZW5jZWYyLAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0LCBmbG9hdCwgZmxvYXQpIiB9LAotICAgIHsgInR1cmJ1bGVuY2VmMyIsICh2b2lkICopJlNDX3R1cmJ1bGVuY2VmMywKLSAgICAgICAgImZsb2F0IiwgIihmbG9hdCwgZmxvYXQsIGZsb2F0LCBmbG9hdCkiIH0sCitzdGF0aWMgU2NyaXB0Q1N0YXRlOjpTeW1ib2xUYWJsZV90IGdTeW1zW10gPSB7CisgICAgeyAiX19kaXZzaTMiLCAodm9pZCAqKSZTQ19kaXZzaTMgfSwKKworICAgIC8vIGFsbG9jYXRpb24KKyAgICB7ICJfWjE5cnNBbGxvY2F0aW9uR2V0RGltWDEzcnNfYWxsb2NhdGlvbiIsICh2b2lkICopJlNDX2FsbG9jR2V0RGltWCB9LAorICAgIHsgIl9aMTlyc0FsbG9jYXRpb25HZXREaW1ZMTNyc19hbGxvY2F0aW9uIiwgKHZvaWQgKikmU0NfYWxsb2NHZXREaW1ZIH0sCisgICAgeyAiX1oxOXJzQWxsb2NhdGlvbkdldERpbVoxM3JzX2FsbG9jYXRpb24iLCAodm9pZCAqKSZTQ19hbGxvY0dldERpbVogfSwKKyAgICB7ICJfWjIxcnNBbGxvY2F0aW9uR2V0RGltTE9EMTNyc19hbGxvY2F0aW9uIiwgKHZvaWQgKikmU0NfYWxsb2NHZXREaW1MT0QgfSwKKyAgICB7ICJfWjIzcnNBbGxvY2F0aW9uR2V0RGltRmFjZXMxM3JzX2FsbG9jYXRpb24iLCAodm9pZCAqKSZTQ19hbGxvY0dldERpbUZhY2VzIH0sCisgICAgeyAiX1oxNXJzR2V0QWxsb2NhdGlvblBLdiIsICh2b2lkICopJlNDX2dldEFsbG9jYXRpb24gfSwKKworICAgIHsgIl9aMTRyc0dldEVsZW1lbnRBdDEzcnNfYWxsb2NhdGlvbmoiLCAodm9pZCAqKSZTQ19nZXRFbGVtZW50QXRYIH0sCisgICAgeyAiX1oxNHJzR2V0RWxlbWVudEF0MTNyc19hbGxvY2F0aW9uamoiLCAodm9pZCAqKSZTQ19nZXRFbGVtZW50QXRYWSB9LAorICAgIHsgIl9aMTRyc0dldEVsZW1lbnRBdDEzcnNfYWxsb2NhdGlvbmpqaiIsICh2b2lkICopJlNDX2dldEVsZW1lbnRBdFhZWiB9LAorCisgICAgeyAiX1oxMXJzU2V0T2JqZWN0UDEzcnNfYWxsb2NhdGlvbjEzcnNfYWxsb2NhdGlvbiIsICh2b2lkICopJlNDX3NldE9iamVjdCB9LAorICAgIHsgIl9aMTNyc0NsZWFyT2JqZWN0UDEzcnNfYWxsb2NhdGlvbiIsICh2b2lkICopJlNDX2NsZWFyT2JqZWN0IH0sCisgICAgeyAiX1oxMHJzSXNPYmplY3QxM3JzX2FsbG9jYXRpb24iLCAodm9pZCAqKSZTQ19pc09iamVjdCB9LAorCisKKyAgICAvLyBEZWJ1ZworICAgIHsgIl9aN3JzRGVidWdQS2NmIiwgKHZvaWQgKikmU0NfZGVidWdGIH0sCisgICAgeyAiX1o3cnNEZWJ1Z1BLY2ZmIiwgKHZvaWQgKikmU0NfZGVidWdGdjIgfSwKKyAgICB7ICJfWjdyc0RlYnVnUEtjZmZmIiwgKHZvaWQgKikmU0NfZGVidWdGdjMgfSwKKyAgICB7ICJfWjdyc0RlYnVnUEtjZmZmZiIsICh2b2lkICopJlNDX2RlYnVnRnY0IH0sCisgICAgeyAiX1o3cnNEZWJ1Z1BLY1BLMTJyc19tYXRyaXg0eDQiLCAodm9pZCAqKSZTQ19kZWJ1Z0ZNNHY0IH0sCisgICAgeyAiX1o3cnNEZWJ1Z1BLY1BLMTJyc19tYXRyaXgzeDMiLCAodm9pZCAqKSZTQ19kZWJ1Z0ZNM3YzIH0sCisgICAgeyAiX1o3cnNEZWJ1Z1BLY1BLMTJyc19tYXRyaXgyeDIiLCAodm9pZCAqKSZTQ19kZWJ1Z0ZNMnYyIH0sCisgICAgeyAiX1o3cnNEZWJ1Z1BLY2kiLCAodm9pZCAqKSZTQ19kZWJ1Z0kzMiB9LAorICAgIHsgIl9aN3JzRGVidWdQS2NqIiwgKHZvaWQgKikmU0NfZGVidWdVMzIgfSwKKyAgICB7ICJfWjdyc0RlYnVnUEtjUEt2IiwgKHZvaWQgKikmU0NfZGVidWdQIH0sCisKKyAgICAvLyBSUyBNYXRoCisgICAgeyAiX1o2cnNSYW5kaSIsICh2b2lkICopJlNDX3JhbmRpIH0sCisgICAgeyAiX1o2cnNSYW5kaWkiLCAodm9pZCAqKSZTQ19yYW5kaTIgfSwKKyAgICB7ICJfWjZyc1JhbmRmIiwgKHZvaWQgKikmU0NfcmFuZGYgfSwKKyAgICB7ICJfWjZyc1JhbmRmZiIsICh2b2lkICopJlNDX3JhbmRmMiB9LAorICAgIHsgIl9aNnJzRnJhY2YiLCAodm9pZCAqKSZTQ19mcmFjIH0sCiAKICAgICAvLyB0aW1lCi0gICAgeyAic2Vjb25kIiwgKHZvaWQgKikmU0Nfc2Vjb25kLAotICAgICAgICAiaW50IiwgIigpIiB9LAotICAgIHsgIm1pbnV0ZSIsICh2b2lkICopJlNDX21pbnV0ZSwKLSAgICAgICAgImludCIsICIoKSIgfSwKLSAgICB7ICJob3VyIiwgKHZvaWQgKikmU0NfaG91ciwKLSAgICAgICAgImludCIsICIoKSIgfSwKLSAgICB7ICJkYXkiLCAodm9pZCAqKSZTQ19kYXksCi0gICAgICAgICJpbnQiLCAiKCkiIH0sCi0gICAgeyAibW9udGgiLCAodm9pZCAqKSZTQ19tb250aCwKLSAgICAgICAgImludCIsICIoKSIgfSwKLSAgICB7ICJ5ZWFyIiwgKHZvaWQgKikmU0NfeWVhciwKLSAgICAgICAgImludCIsICIoKSIgfSwKLSAgICB7ICJ1cHRpbWVNaWxsaXMiLCAodm9pZCopJlNDX3VwdGltZU1pbGxpcywKLSAgICAgICAgImludCIsICIoKSIgfSwgICAgICAvLyBUT0RPOiB1c2UgbG9uZyBpbnN0ZWFkCi0gICAgeyAic3RhcnRUaW1lTWlsbGlzIiwgKHZvaWQqKSZTQ19zdGFydFRpbWVNaWxsaXMsCi0gICAgICAgICJpbnQiLCAiKCkiIH0sICAgICAgLy8gVE9ETzogdXNlIGxvbmcgaW5zdGVhZAotICAgIHsgImVsYXBzZWRUaW1lTWlsbGlzIiwgKHZvaWQqKSZTQ19lbGFwc2VkVGltZU1pbGxpcywKLSAgICAgICAgImludCIsICIoKSIgfSwgICAgICAvLyBUT0RPOiB1c2UgbG9uZyBpbnN0ZWFkCisgICAgeyAiX1o4cnNTZWNvbmR2IiwgKHZvaWQgKikmU0Nfc2Vjb25kIH0sCisgICAgeyAiX1o4cnNNaW51dGV2IiwgKHZvaWQgKikmU0NfbWludXRlIH0sCisgICAgeyAiX1o2cnNIb3VydiIsICh2b2lkICopJlNDX2hvdXIgfSwKKyAgICB7ICJfWjVyc0RheXYiLCAodm9pZCAqKSZTQ19kYXkgfSwKKyAgICB7ICJfWjdyc01vbnRodiIsICh2b2lkICopJlNDX21vbnRoIH0sCisgICAgeyAiX1o2cnNZZWFydiIsICh2b2lkICopJlNDX3llYXIgfSwKKyAgICB7ICJfWjE0cnNVcHRpbWVNaWxsaXN2IiwgKHZvaWQqKSZTQ191cHRpbWVNaWxsaXMgfSwKKyAgICB7ICJfWjEzcnNVcHRpbWVOYW5vc3YiLCAodm9pZCopJlNDX3VwdGltZU5hbm9zIH0sCisgICAgeyAiX1o3cnNHZXREdHYiLCAodm9pZCopJlNDX2dldER0IH0sCiAKLSAgICAvLyBtYXRyaXgKLSAgICB7ICJtYXRyaXhMb2FkSWRlbnRpdHkiLCAodm9pZCAqKSZTQ19tYXRyaXhMb2FkSWRlbnRpdHksCi0gICAgICAgICJ2b2lkIiwgIihmbG9hdCAqbWF0KSIgfSwKLSAgICB7ICJtYXRyaXhMb2FkRmxvYXQiLCAodm9pZCAqKSZTQ19tYXRyaXhMb2FkRmxvYXQsCi0gICAgICAgICJ2b2lkIiwgIihmbG9hdCAqbWF0LCBmbG9hdCAqZikiIH0sCi0gICAgeyAibWF0cml4TG9hZE1hdCIsICh2b2lkICopJlNDX21hdHJpeExvYWRNYXQsCi0gICAgICAgICJ2b2lkIiwgIihmbG9hdCAqbWF0LCBmbG9hdCAqbmV3bWF0KSIgfSwKLSAgICB7ICJtYXRyaXhMb2FkUm90YXRlIiwgKHZvaWQgKikmU0NfbWF0cml4TG9hZFJvdGF0ZSwKLSAgICAgICAgInZvaWQiLCAiKGZsb2F0ICptYXQsIGZsb2F0IHJvdCwgZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeikiIH0sCi0gICAgeyAibWF0cml4TG9hZFNjYWxlIiwgKHZvaWQgKikmU0NfbWF0cml4TG9hZFNjYWxlLAotICAgICAgICAidm9pZCIsICIoZmxvYXQgKm1hdCwgZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeikiIH0sCi0gICAgeyAibWF0cml4TG9hZFRyYW5zbGF0ZSIsICh2b2lkICopJlNDX21hdHJpeExvYWRUcmFuc2xhdGUsCi0gICAgICAgICJ2b2lkIiwgIihmbG9hdCAqbWF0LCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KSIgfSwKLSAgICB7ICJtYXRyaXhMb2FkTXVsdGlwbHkiLCAodm9pZCAqKSZTQ19tYXRyaXhMb2FkTXVsdGlwbHksCi0gICAgICAgICJ2b2lkIiwgIihmbG9hdCAqbWF0LCBmbG9hdCAqbGhzLCBmbG9hdCAqcmhzKSIgfSwKLSAgICB7ICJtYXRyaXhNdWx0aXBseSIsICh2b2lkICopJlNDX21hdHJpeE11bHRpcGx5LAotICAgICAgICAidm9pZCIsICIoZmxvYXQgKm1hdCwgZmxvYXQgKnJocykiIH0sCi0gICAgeyAibWF0cml4Um90YXRlIiwgKHZvaWQgKikmU0NfbWF0cml4Um90YXRlLAotICAgICAgICAidm9pZCIsICIoZmxvYXQgKm1hdCwgZmxvYXQgcm90LCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KSIgfSwKLSAgICB7ICJtYXRyaXhTY2FsZSIsICh2b2lkICopJlNDX21hdHJpeFNjYWxlLAotICAgICAgICAidm9pZCIsICIoZmxvYXQgKm1hdCwgZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeikiIH0sCi0gICAgeyAibWF0cml4VHJhbnNsYXRlIiwgKHZvaWQgKikmU0NfbWF0cml4VHJhbnNsYXRlLAotICAgICAgICAidm9pZCIsICIoZmxvYXQgKm1hdCwgZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeikiIH0sCisgICAgeyAiX1oxNHJzU2VuZFRvQ2xpZW50aSIsICh2b2lkICopJlNDX3RvQ2xpZW50IH0sCisgICAgeyAiX1oxNHJzU2VuZFRvQ2xpZW50aVBLdmoiLCAodm9pZCAqKSZTQ190b0NsaWVudDIgfSwKKyAgICB7ICJfWjIycnNTZW5kVG9DbGllbnRCbG9ja2luZ2kiLCAodm9pZCAqKSZTQ190b0NsaWVudEJsb2NraW5nIH0sCisgICAgeyAiX1oyMnJzU2VuZFRvQ2xpZW50QmxvY2tpbmdpUEt2aiIsICh2b2lkICopJlNDX3RvQ2xpZW50QmxvY2tpbmcyIH0sCiAKLSAgICAvLyB2ZWN0b3IKLSAgICB7ICJ2ZWMyUmFuZCIsICh2b2lkICopJlNDX3ZlYzJSYW5kLAotICAgICAgICAidm9pZCIsICIoZmxvYXQgKnZlYywgZmxvYXQgbWF4TGVuKSIgfSwKKyAgICB7ICJfWjlyc0ZvckVhY2g5cnNfc2NyaXB0MTNyc19hbGxvY2F0aW9uUzBfUEt2IiwgKHZvaWQgKikmU0NfRm9yRWFjaCB9LAorICAgIC8veyAiX1o5cnNGb3JFYWNoOXJzX3NjcmlwdDEzcnNfYWxsb2NhdGlvblMwX1BLdiIsICh2b2lkICopJlNDX0ZvckVhY2gyIH0sCiAKLSAgICAvLyB2ZWMzCi0gICAgeyAidmVjM05vcm0iLCAodm9pZCAqKSZTQ192ZWMzTm9ybSwKLSAgICAgICAgInZvaWQiLCAiKHN0cnVjdCB2ZWNGMzJfM19zICopIiB9LAotICAgIHsgInZlYzNMZW5ndGgiLCAodm9pZCAqKSZTQ192ZWMzTGVuZ3RoLAotICAgICAgICAiZmxvYXQiLCAiKHN0cnVjdCB2ZWNGMzJfM19zICopIiB9LAotICAgIHsgInZlYzNBZGQiLCAodm9pZCAqKSZTQ192ZWMzQWRkLAotICAgICAgICAidm9pZCIsICIoc3RydWN0IHZlY0YzMl8zX3MgKmRlc3QsIHN0cnVjdCB2ZWNGMzJfM19zICpsaHMsIHN0cnVjdCB2ZWNGMzJfM19zICpyaHMpIiB9LAotICAgIHsgInZlYzNTdWIiLCAodm9pZCAqKSZTQ192ZWMzU3ViLAotICAgICAgICAidm9pZCIsICIoc3RydWN0IHZlY0YzMl8zX3MgKmRlc3QsIHN0cnVjdCB2ZWNGMzJfM19zICpsaHMsIHN0cnVjdCB2ZWNGMzJfM19zICpyaHMpIiB9LAotICAgIHsgInZlYzNDcm9zcyIsICh2b2lkICopJlNDX3ZlYzNDcm9zcywKLSAgICAgICAgInZvaWQiLCAiKHN0cnVjdCB2ZWNGMzJfM19zICpkZXN0LCBzdHJ1Y3QgdmVjRjMyXzNfcyAqbGhzLCBzdHJ1Y3QgdmVjRjMyXzNfcyAqcmhzKSIgfSwKLSAgICB7ICJ2ZWMzRG90IiwgKHZvaWQgKikmU0NfdmVjM0RvdCwKLSAgICAgICAgImZsb2F0IiwgIihzdHJ1Y3QgdmVjRjMyXzNfcyAqbGhzLCBzdHJ1Y3QgdmVjRjMyXzNfcyAqcmhzKSIgfSwKLSAgICB7ICJ2ZWMzU2NhbGUiLCAodm9pZCAqKSZTQ192ZWMzU2NhbGUsCi0gICAgICAgICJ2b2lkIiwgIihzdHJ1Y3QgdmVjRjMyXzNfcyAqbGhzLCBmbG9hdCBzY2FsZSkiIH0sCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCi0gICAgLy8gdmVjNAotICAgIHsgInZlYzROb3JtIiwgKHZvaWQgKikmU0NfdmVjNE5vcm0sCi0gICAgICAgICJ2b2lkIiwgIihzdHJ1Y3QgdmVjRjMyXzRfcyAqKSIgfSwKLSAgICB7ICJ2ZWM0TGVuZ3RoIiwgKHZvaWQgKikmU0NfdmVjNExlbmd0aCwKLSAgICAgICAgImZsb2F0IiwgIihzdHJ1Y3QgdmVjRjMyXzRfcyAqKSIgfSwKLSAgICB7ICJ2ZWM0QWRkIiwgKHZvaWQgKikmU0NfdmVjNEFkZCwKLSAgICAgICAgInZvaWQiLCAiKHN0cnVjdCB2ZWNGMzJfNF9zICpkZXN0LCBzdHJ1Y3QgdmVjRjMyXzRfcyAqbGhzLCBzdHJ1Y3QgdmVjRjMyXzRfcyAqcmhzKSIgfSwKLSAgICB7ICJ2ZWM0U3ViIiwgKHZvaWQgKikmU0NfdmVjNFN1YiwKLSAgICAgICAgInZvaWQiLCAiKHN0cnVjdCB2ZWNGMzJfNF9zICpkZXN0LCBzdHJ1Y3QgdmVjRjMyXzRfcyAqbGhzLCBzdHJ1Y3QgdmVjRjMyXzRfcyAqcmhzKSIgfSwKLSAgICB7ICJ2ZWM0RG90IiwgKHZvaWQgKikmU0NfdmVjNERvdCwKLSAgICAgICAgImZsb2F0IiwgIihzdHJ1Y3QgdmVjRjMyXzRfcyAqbGhzLCBzdHJ1Y3QgdmVjRjMyXzRfcyAqcmhzKSIgfSwKLSAgICB7ICJ2ZWM0U2NhbGUiLCAodm9pZCAqKSZTQ192ZWM0U2NhbGUsCi0gICAgICAgICJ2b2lkIiwgIihzdHJ1Y3QgdmVjRjMyXzRfcyAqbGhzLCBmbG9hdCBzY2FsZSkiIH0sCisgICAgLy97ICJzaW5mX2Zhc3QiLCAodm9pZCAqKSZTQ19zaW5mX2Zhc3QgfSwKKyAgICAvL3sgImNvc2ZfZmFzdCIsICh2b2lkICopJlNDX2Nvc2ZfZmFzdCB9LAogCi0gICAgLy8gY29udGV4dAotICAgIHsgImJpbmRQcm9ncmFtRnJhZ21lbnQiLCAodm9pZCAqKSZTQ19iaW5kUHJvZ3JhbUZyYWdtZW50LAotICAgICAgICAidm9pZCIsICIoaW50KSIgfSwKLSAgICB7ICJiaW5kUHJvZ3JhbUZyYWdtZW50U3RvcmUiLCAodm9pZCAqKSZTQ19iaW5kUHJvZ3JhbUZyYWdtZW50U3RvcmUsCi0gICAgICAgICJ2b2lkIiwgIihpbnQpIiB9LAotICAgIHsgImJpbmRQcm9ncmFtU3RvcmUiLCAodm9pZCAqKSZTQ19iaW5kUHJvZ3JhbUZyYWdtZW50U3RvcmUsCi0gICAgICAgICJ2b2lkIiwgIihpbnQpIiB9LAotICAgIHsgImJpbmRQcm9ncmFtVmVydGV4IiwgKHZvaWQgKikmU0NfYmluZFByb2dyYW1WZXJ0ZXgsCi0gICAgICAgICJ2b2lkIiwgIihpbnQpIiB9LAotICAgIHsgImJpbmRTYW1wbGVyIiwgKHZvaWQgKikmU0NfYmluZFNhbXBsZXIsCi0gICAgICAgICJ2b2lkIiwgIihpbnQsIGludCwgaW50KSIgfSwKLSAgICB7ICJiaW5kVGV4dHVyZSIsICh2b2lkICopJlNDX2JpbmRUZXh0dXJlLAotICAgICAgICAidm9pZCIsICIoaW50LCBpbnQsIGludCkiIH0sCi0KLSAgICAvLyB2cAotICAgIHsgInZwTG9hZE1vZGVsTWF0cml4IiwgKHZvaWQgKikmU0NfdnBMb2FkTW9kZWxNYXRyaXgsCi0gICAgICAgICJ2b2lkIiwgIih2b2lkICopIiB9LAotICAgIHsgInZwTG9hZFRleHR1cmVNYXRyaXgiLCAodm9pZCAqKSZTQ192cExvYWRUZXh0dXJlTWF0cml4LAotICAgICAgICAidm9pZCIsICIodm9pZCAqKSIgfSwKLQotCi0KLSAgICAvLyBkcmF3aW5nCi0gICAgeyAiZHJhd1JlY3QiLCAodm9pZCAqKSZTQ19kcmF3UmVjdCwKLSAgICAgICAgInZvaWQiLCAiKGZsb2F0IHgxLCBmbG9hdCB5MSwgZmxvYXQgeDIsIGZsb2F0IHkyLCBmbG9hdCB6KSIgfSwKLSAgICB7ICJkcmF3UXVhZCIsICh2b2lkICopJlNDX2RyYXdRdWFkLAotICAgICAgICAidm9pZCIsICIoZmxvYXQgeDEsIGZsb2F0IHkxLCBmbG9hdCB6MSwgZmxvYXQgeDIsIGZsb2F0IHkyLCBmbG9hdCB6MiwgZmxvYXQgeDMsIGZsb2F0IHkzLCBmbG9hdCB6MywgZmxvYXQgeDQsIGZsb2F0IHk0LCBmbG9hdCB6NCkiIH0sCi0gICAgeyAiZHJhd1F1YWRUZXhDb29yZHMiLCAodm9pZCAqKSZTQ19kcmF3UXVhZFRleENvb3JkcywKLSAgICAgICAgInZvaWQiLCAiKGZsb2F0IHgxLCBmbG9hdCB5MSwgZmxvYXQgejEsIGZsb2F0IHUxLCBmbG9hdCB2MSwgZmxvYXQgeDIsIGZsb2F0IHkyLCBmbG9hdCB6MiwgZmxvYXQgdTIsIGZsb2F0IHYyLCBmbG9hdCB4MywgZmxvYXQgeTMsIGZsb2F0IHozLCBmbG9hdCB1MywgZmxvYXQgdjMsIGZsb2F0IHg0LCBmbG9hdCB5NCwgZmxvYXQgejQsIGZsb2F0IHU0LCBmbG9hdCB2NCkiIH0sCi0gICAgeyAiZHJhd1Nwcml0ZSIsICh2b2lkICopJlNDX2RyYXdTcHJpdGUsCi0gICAgICAgICJ2b2lkIiwgIihmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6LCBmbG9hdCB3LCBmbG9hdCBoKSIgfSwKLSAgICB7ICJkcmF3U3ByaXRlU2NyZWVuc3BhY2UiLCAodm9pZCAqKSZTQ19kcmF3U3ByaXRlU2NyZWVuc3BhY2UsCi0gICAgICAgICJ2b2lkIiwgIihmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6LCBmbG9hdCB3LCBmbG9hdCBoKSIgfSwKLSAgICB7ICJkcmF3U3ByaXRlU2NyZWVuc3BhY2VDcm9wcGVkIiwgKHZvaWQgKikmU0NfZHJhd1Nwcml0ZVNjcmVlbnNwYWNlQ3JvcHBlZCwKLSAgICAgICAgInZvaWQiLCAiKGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHosIGZsb2F0IHcsIGZsb2F0IGgsIGZsb2F0IGN4MCwgZmxvYXQgY3kwLCBmbG9hdCBjeDEsIGZsb2F0IGN5MSkiIH0sCi0gICAgeyAiZHJhd0xpbmUiLCAodm9pZCAqKSZTQ19kcmF3TGluZSwKLSAgICAgICAgInZvaWQiLCAiKGZsb2F0IHgxLCBmbG9hdCB5MSwgZmxvYXQgejEsIGZsb2F0IHgyLCBmbG9hdCB5MiwgZmxvYXQgejIpIiB9LAotICAgIHsgImRyYXdQb2ludCIsICh2b2lkICopJlNDX2RyYXdQb2ludCwKLSAgICAgICAgInZvaWQiLCAiKGZsb2F0IHgxLCBmbG9hdCB5MSwgZmxvYXQgejEpIiB9LAotICAgIHsgImRyYXdTaW1wbGVNZXNoIiwgKHZvaWQgKikmU0NfZHJhd1NpbXBsZU1lc2gsCi0gICAgICAgICJ2b2lkIiwgIihpbnQgaXNtKSIgfSwKLSAgICB7ICJkcmF3U2ltcGxlTWVzaFJhbmdlIiwgKHZvaWQgKikmU0NfZHJhd1NpbXBsZU1lc2hSYW5nZSwKLSAgICAgICAgInZvaWQiLCAiKGludCBpc20sIGludCBzdGFydCwgaW50IGxlbikiIH0sCi0KLQotICAgIC8vIG1pc2MKLSAgICB7ICJwZkNsZWFyQ29sb3IiLCAodm9pZCAqKSZTQ19DbGVhckNvbG9yLAotICAgICAgICAidm9pZCIsICIoZmxvYXQsIGZsb2F0LCBmbG9hdCwgZmxvYXQpIiB9LAotICAgIHsgImNvbG9yIiwgKHZvaWQgKikmU0NfY29sb3IsCi0gICAgICAgICJ2b2lkIiwgIihmbG9hdCwgZmxvYXQsIGZsb2F0LCBmbG9hdCkiIH0sCi0gICAgeyAiaHNiIiwgKHZvaWQgKikmU0NfaHNiLAotICAgICAgICAidm9pZCIsICIoZmxvYXQsIGZsb2F0LCBmbG9hdCwgZmxvYXQpIiB9LAotICAgIHsgImhzYlRvUmdiIiwgKHZvaWQgKikmU0NfaHNiVG9SZ2IsCi0gICAgICAgICJ2b2lkIiwgIihmbG9hdCwgZmxvYXQsIGZsb2F0LCBmbG9hdCopIiB9LAotICAgIHsgImhzYlRvQWJnciIsICh2b2lkICopJlNDX2hzYlRvQWJnciwKLSAgICAgICAgImludCIsICIoZmxvYXQsIGZsb2F0LCBmbG9hdCwgZmxvYXQpIiB9LAotICAgIHsgImFtYmllbnQiLCAodm9pZCAqKSZTQ19hbWJpZW50LAotICAgICAgICAidm9pZCIsICIoZmxvYXQsIGZsb2F0LCBmbG9hdCwgZmxvYXQpIiB9LAotICAgIHsgImRpZmZ1c2UiLCAodm9pZCAqKSZTQ19kaWZmdXNlLAotICAgICAgICAidm9pZCIsICIoZmxvYXQsIGZsb2F0LCBmbG9hdCwgZmxvYXQpIiB9LAotICAgIHsgInNwZWN1bGFyIiwgKHZvaWQgKikmU0Nfc3BlY3VsYXIsCi0gICAgICAgICJ2b2lkIiwgIihmbG9hdCwgZmxvYXQsIGZsb2F0LCBmbG9hdCkiIH0sCi0gICAgeyAiZW1pc3Npb24iLCAodm9pZCAqKSZTQ19lbWlzc2lvbiwKLSAgICAgICAgInZvaWQiLCAiKGZsb2F0LCBmbG9hdCwgZmxvYXQsIGZsb2F0KSIgfSwKLSAgICB7ICJzaGluaW5lc3MiLCAodm9pZCAqKSZTQ19zaGluaW5lc3MsCi0gICAgICAgICJ2b2lkIiwgIihmbG9hdCkiIH0sCi0gICAgeyAicG9pbnRBdHRlbnVhdGlvbiIsICh2b2lkICopJlNDX3BvaW50QXR0ZW51YXRpb24sCi0gICAgICAgICJ2b2lkIiwgIihmbG9hdCwgZmxvYXQsIGZsb2F0KSIgfSwKLQotICAgIHsgInVwbG9hZFRvVGV4dHVyZSIsICh2b2lkICopJlNDX3VwbG9hZFRvVGV4dHVyZSwKLSAgICAgICAgInZvaWQiLCAiKGludCwgaW50KSIgfSwKLSAgICB7ICJ1cGxvYWRUb0J1ZmZlck9iamVjdCIsICh2b2lkICopJlNDX3VwbG9hZFRvQnVmZmVyT2JqZWN0LAotICAgICAgICAidm9pZCIsICIoaW50KSIgfSwKLQotICAgIHsgInN5bmNUb0dMIiwgKHZvaWQgKikmU0Nfc3luY1RvR0wsCi0gICAgICAgICJ2b2lkIiwgIihpbnQpIiB9LAotCi0gICAgeyAiY29sb3JGbG9hdFJHQkF0b1VOb3JtOCIsICh2b2lkICopJlNDX2NvbG9yRmxvYXRSR0JBdG9VTm9ybTgsCi0gICAgICAgICJpbnQiLCAiKGZsb2F0LCBmbG9hdCwgZmxvYXQsIGZsb2F0KSIgfSwKLSAgICB7ICJjb2xvckZsb2F0UkdCdG81NjUiLCAodm9pZCAqKSZTQ19jb2xvckZsb2F0UkdCQXRvNTY1LAotICAgICAgICAiaW50IiwgIihmbG9hdCwgZmxvYXQsIGZsb2F0KSIgfSwKLQotCi0gICAgeyAiZ2V0V2lkdGgiLCAodm9pZCAqKSZTQ19nZXRXaWR0aCwKLSAgICAgICAgImludCIsICIoKSIgfSwKLSAgICB7ICJnZXRIZWlnaHQiLCAodm9pZCAqKSZTQ19nZXRIZWlnaHQsCi0gICAgICAgICJpbnQiLCAiKCkiIH0sCi0KLSAgICB7ICJzZW5kVG9DbGllbnQiLCAodm9pZCAqKSZTQ190b0NsaWVudCwKLSAgICAgICAgImludCIsICIodm9pZCAqZGF0YSwgaW50IGNtZElELCBpbnQgbGVuLCBpbnQgd2FpdEZvclNwYWNlKSIgfSwKLQotCi0gICAgeyAiZGVidWdGIiwgKHZvaWQgKikmU0NfZGVidWdGLAotICAgICAgICAidm9pZCIsICIodm9pZCAqLCBmbG9hdCkiIH0sCi0gICAgeyAiZGVidWdJMzIiLCAodm9pZCAqKSZTQ19kZWJ1Z0kzMiwKLSAgICAgICAgInZvaWQiLCAiKHZvaWQgKiwgaW50KSIgfSwKLSAgICB7ICJkZWJ1Z0hleEYiLCAodm9pZCAqKSZTQ19kZWJ1Z0hleEYsCi0gICAgICAgICJ2b2lkIiwgIih2b2lkICosIGZsb2F0KSIgfSwKLSAgICB7ICJkZWJ1Z0hleEkzMiIsICh2b2lkICopJlNDX2RlYnVnSGV4STMyLAotICAgICAgICAidm9pZCIsICIodm9pZCAqLCBpbnQpIiB9LAotCi0gICAgeyAic2NyaXB0Q2FsbCIsICh2b2lkICopJlNDX3NjcmlwdENhbGwsCi0gICAgICAgICJ2b2lkIiwgIihpbnQpIiB9LAotCi0KLSAgICB7IE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwgfQorICAgIHsgTlVMTCwgTlVMTCB9CiB9OwogCiBjb25zdCBTY3JpcHRDU3RhdGU6OlN5bWJvbFRhYmxlX3QgKiBTY3JpcHRDU3RhdGU6Omxvb2t1cFN5bWJvbChjb25zdCBjaGFyICpzeW0pCkBAIC0xNDAwLDE3ICs0ODMsMyBAQAogICAgIHJldHVybiBOVUxMOwogfQogCi12b2lkIFNjcmlwdENTdGF0ZTo6YXBwZW5kRGVjbHMoU3RyaW5nOCAqc3RyKQotewotICAgIFNjcmlwdENTdGF0ZTo6U3ltYm9sVGFibGVfdCAqc3ltcyA9IGdTeW1zOwotICAgIHdoaWxlIChzeW1zLT5tUHRyKSB7Ci0gICAgICAgIHN0ci0+YXBwZW5kKHN5bXMtPm1SZXQpOwotICAgICAgICBzdHItPmFwcGVuZCgiICIpOwotICAgICAgICBzdHItPmFwcGVuZChzeW1zLT5tTmFtZSk7Ci0gICAgICAgIHN0ci0+YXBwZW5kKHN5bXMtPm1QYXJhbSk7Ci0gICAgICAgIHN0ci0+YXBwZW5kKCI7XG4iKTsKLSAgICAgICAgc3ltcysrOwotICAgIH0KLX0KLQotCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzU2NyaXB0Q19MaWJDTC5jcHAgYi9saWJzL3JzL3JzU2NyaXB0Q19MaWJDTC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U4ZTdiMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvcnNTY3JpcHRDX0xpYkNMLmNwcApAQCAtMCwwICsxLDMxNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJyc0NvbnRleHQuaCIKKyNpbmNsdWRlICJyc1NjcmlwdEMuaCIKKworLy8gSW1wbGVtZW50cyByc19jbC5yc2gKKworCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpyZW5kZXJzY3JpcHQ7CisKKworc3RhdGljIGZsb2F0IFNDX2Fjb3NwaShmbG9hdCB2KSB7CisgICAgcmV0dXJuIGFjb3NmKHYpLyBNX1BJOworfQorCitzdGF0aWMgZmxvYXQgU0NfYXNpbnBpKGZsb2F0IHYpIHsKKyAgICByZXR1cm4gYXNpbmYodikgLyBNX1BJOworfQorCitzdGF0aWMgZmxvYXQgU0NfYXRhbnBpKGZsb2F0IHYpIHsKKyAgICByZXR1cm4gYXRhbmYodikgLyBNX1BJOworfQorCitzdGF0aWMgZmxvYXQgU0NfYXRhbjJwaShmbG9hdCB5LCBmbG9hdCB4KSB7CisgICAgcmV0dXJuIGF0YW4yZih5LCB4KSAvIE1fUEk7Cit9CisKK3N0YXRpYyBmbG9hdCBTQ19jb3NwaShmbG9hdCB2KSB7CisgICAgcmV0dXJuIGNvc2YodiAqIE1fUEkpOworfQorCitzdGF0aWMgZmxvYXQgU0NfZXhwMTAoZmxvYXQgdikgeworICAgIHJldHVybiBwb3coMTAuZiwgdik7CisKK30KKworc3RhdGljIGZsb2F0IFNDX2ZyYWN0KGZsb2F0IHYsIGludCAqaXB0cikgeworICAgIGludCBpID0gKGludClmbG9vcih2KTsKKyAgICBpcHRyWzBdID0gaTsKKyAgICByZXR1cm4gZm1pbih2IC0gaSwgMHgxLmZmZmZmZXAtMWYpOworfQorCitzdGF0aWMgZmxvYXQgU0NfbG9nMihmbG9hdCB2KSB7CisgICAgcmV0dXJuIGxvZzEwKHYpIC8gbG9nMTAoMi5mKTsKK30KKworc3RhdGljIGZsb2F0IFNDX3Bvd24oZmxvYXQgdiwgaW50IHApIHsKKyAgICByZXR1cm4gcG93Zih2LCAoZmxvYXQpcCk7Cit9CisKK3N0YXRpYyBmbG9hdCBTQ19wb3dyKGZsb2F0IHYsIGZsb2F0IHApIHsKKyAgICByZXR1cm4gcG93Zih2LCBwKTsKK30KKworZmxvYXQgU0Nfcm9vdG4oZmxvYXQgdiwgaW50IHIpIHsKKyAgICByZXR1cm4gcG93KHYsIDEuZiAvIHIpOworfQorCitmbG9hdCBTQ19yc3FydChmbG9hdCB2KSB7CisgICAgcmV0dXJuIDEuZiAvIHNxcnRmKHYpOworfQorCitmbG9hdCBTQ19zaW5jb3MoZmxvYXQgdiwgZmxvYXQgKmNvc3B0cikgeworICAgICpjb3NwdHIgPSBjb3NmKHYpOworICAgIHJldHVybiBzaW5mKHYpOworfQorCitzdGF0aWMgZmxvYXQgU0Nfc2lucGkoZmxvYXQgdikgeworICAgIHJldHVybiBzaW5mKHYgKiBNX1BJKTsKK30KKworc3RhdGljIGZsb2F0IFNDX3RhbnBpKGZsb2F0IHYpIHsKKyAgICByZXR1cm4gdGFuZih2ICogTV9QSSk7Cit9CisKKyAgICAvL3sgImxvZ2IiLCAodm9pZCAqKSYgfSwKKyAgICAvL3sgIm1hZCIsICh2b2lkICopJiB9LAorICAgIC8veyAibmFuIiwgKHZvaWQgKikmIH0sCisgICAgLy97ICJ0Z2FtbWEiLCAodm9pZCAqKSYgfSwKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBJbnRlZ2VyCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCitzdGF0aWMgdWludDMyX3QgU0NfYWJzX2kzMihpbnQzMl90IHYpIHtyZXR1cm4gYWJzKHYpO30KK3N0YXRpYyB1aW50MTZfdCBTQ19hYnNfaTE2KGludDE2X3Qgdikge3JldHVybiAodWludDE2X3QpYWJzKHYpO30KK3N0YXRpYyB1aW50OF90IFNDX2Fic19pOChpbnQ4X3Qgdikge3JldHVybiAodWludDhfdClhYnModik7fQorCitzdGF0aWMgdWludDMyX3QgU0NfY2x6X3UzMih1aW50MzJfdCB2KSB7cmV0dXJuIF9fYnVpbHRpbl9jbHoodik7fQorc3RhdGljIHVpbnQxNl90IFNDX2Nsel91MTYodWludDE2X3Qgdikge3JldHVybiAodWludDE2X3QpX19idWlsdGluX2Nseih2KTt9CitzdGF0aWMgdWludDhfdCBTQ19jbHpfdTgodWludDhfdCB2KSB7cmV0dXJuICh1aW50OF90KV9fYnVpbHRpbl9jbHoodik7fQorc3RhdGljIGludDMyX3QgU0NfY2x6X2kzMihpbnQzMl90IHYpIHtyZXR1cm4gKGludDMyX3QpX19idWlsdGluX2NseigodWludDMyX3Qpdik7fQorc3RhdGljIGludDE2X3QgU0NfY2x6X2kxNihpbnQxNl90IHYpIHtyZXR1cm4gKGludDE2X3QpX19idWlsdGluX2Nseih2KTt9CitzdGF0aWMgaW50OF90IFNDX2Nsel9pOChpbnQ4X3Qgdikge3JldHVybiAoaW50OF90KV9fYnVpbHRpbl9jbHoodik7fQorCitzdGF0aWMgdWludDMyX3QgU0NfbWF4X3UzMih1aW50MzJfdCB2LCB1aW50MzJfdCB2Mikge3JldHVybiByc01heCh2LCB2Mik7fQorc3RhdGljIHVpbnQxNl90IFNDX21heF91MTYodWludDE2X3QgdiwgdWludDE2X3QgdjIpIHtyZXR1cm4gcnNNYXgodiwgdjIpO30KK3N0YXRpYyB1aW50OF90IFNDX21heF91OCh1aW50OF90IHYsIHVpbnQ4X3QgdjIpIHtyZXR1cm4gcnNNYXgodiwgdjIpO30KK3N0YXRpYyBpbnQzMl90IFNDX21heF9pMzIoaW50MzJfdCB2LCBpbnQzMl90IHYyKSB7cmV0dXJuIHJzTWF4KHYsIHYyKTt9CitzdGF0aWMgaW50MTZfdCBTQ19tYXhfaTE2KGludDE2X3QgdiwgaW50MTZfdCB2Mikge3JldHVybiByc01heCh2LCB2Mik7fQorc3RhdGljIGludDhfdCBTQ19tYXhfaTgoaW50OF90IHYsIGludDhfdCB2Mikge3JldHVybiByc01heCh2LCB2Mik7fQorCitzdGF0aWMgdWludDMyX3QgU0NfbWluX3UzMih1aW50MzJfdCB2LCB1aW50MzJfdCB2Mikge3JldHVybiByc01pbih2LCB2Mik7fQorc3RhdGljIHVpbnQxNl90IFNDX21pbl91MTYodWludDE2X3QgdiwgdWludDE2X3QgdjIpIHtyZXR1cm4gcnNNaW4odiwgdjIpO30KK3N0YXRpYyB1aW50OF90IFNDX21pbl91OCh1aW50OF90IHYsIHVpbnQ4X3QgdjIpIHtyZXR1cm4gcnNNaW4odiwgdjIpO30KK3N0YXRpYyBpbnQzMl90IFNDX21pbl9pMzIoaW50MzJfdCB2LCBpbnQzMl90IHYyKSB7cmV0dXJuIHJzTWluKHYsIHYyKTt9CitzdGF0aWMgaW50MTZfdCBTQ19taW5faTE2KGludDE2X3QgdiwgaW50MTZfdCB2Mikge3JldHVybiByc01pbih2LCB2Mik7fQorc3RhdGljIGludDhfdCBTQ19taW5faTgoaW50OF90IHYsIGludDhfdCB2Mikge3JldHVybiByc01pbih2LCB2Mik7fQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEZsb2F0IHV0aWwKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitzdGF0aWMgZmxvYXQgU0NfY2xhbXBfZjMyKGZsb2F0IGFtb3VudCwgZmxvYXQgbG93LCBmbG9hdCBoaWdoKQoreworICAgIHJldHVybiBhbW91bnQgPCBsb3cgPyBsb3cgOiAoYW1vdW50ID4gaGlnaCA/IGhpZ2ggOiBhbW91bnQpOworfQorCitzdGF0aWMgZmxvYXQgU0NfZGVncmVlcyhmbG9hdCByYWRpYW5zKQoreworICAgIHJldHVybiByYWRpYW5zICogKDE4MC5mIC8gTV9QSSk7Cit9CisKK3N0YXRpYyBmbG9hdCBTQ19tYXhfZjMyKGZsb2F0IHYsIGZsb2F0IHYyKQoreworICAgIHJldHVybiByc01heCh2LCB2Mik7Cit9CisKK3N0YXRpYyBmbG9hdCBTQ19taW5fZjMyKGZsb2F0IHYsIGZsb2F0IHYyKQoreworICAgIHJldHVybiByc01pbih2LCB2Mik7Cit9CisKK3N0YXRpYyBmbG9hdCBTQ19taXhfZjMyKGZsb2F0IHN0YXJ0LCBmbG9hdCBzdG9wLCBmbG9hdCBhbW91bnQpCit7CisgICAgLy9MT0dFKCJsZXJwZiAlZiAgJWYgICVmIiwgc3RhcnQsIHN0b3AsIGFtb3VudCk7CisgICAgcmV0dXJuIHN0YXJ0ICsgKHN0b3AgLSBzdGFydCkgKiBhbW91bnQ7Cit9CisKK3N0YXRpYyBmbG9hdCBTQ19yYWRpYW5zKGZsb2F0IGRlZ3JlZXMpCit7CisgICAgcmV0dXJuIGRlZ3JlZXMgKiAoTV9QSSAvIDE4MC5mKTsKK30KKworc3RhdGljIGZsb2F0IFNDX3N0ZXBfZjMyKGZsb2F0IGVkZ2UsIGZsb2F0IHYpCit7CisgICAgaWYgKHYgPCBlZGdlKSByZXR1cm4gMC5mOworICAgIHJldHVybiAxLmY7Cit9CisKK3N0YXRpYyBmbG9hdCBTQ19zaWduX2YzMihmbG9hdCB2YWx1ZSkKK3sKKyAgICBpZiAodmFsdWUgPiAwKSByZXR1cm4gMS5mOworICAgIGlmICh2YWx1ZSA8IDApIHJldHVybiAtMS5mOworICAgIHJldHVybiB2YWx1ZTsKK30KKworCisKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENsYXNzIGltcGxlbWVudGF0aW9uCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLy8gbGx2bSBuYW1lIG1hbmdsaW5nIHJlZgorLy8gIDxidWlsdGluLXR5cGU+IDo6PSB2ICAjIHZvaWQKKy8vICAgICAgICAgICAgICAgICA6Oj0gYiAgIyBib29sCisvLyAgICAgICAgICAgICAgICAgOjo9IGMgICMgY2hhcgorLy8gICAgICAgICAgICAgICAgIDo6PSBhICAjIHNpZ25lZCBjaGFyCisvLyAgICAgICAgICAgICAgICAgOjo9IGggICMgdW5zaWduZWQgY2hhcgorLy8gICAgICAgICAgICAgICAgIDo6PSBzICAjIHNob3J0CisvLyAgICAgICAgICAgICAgICAgOjo9IHQgICMgdW5zaWduZWQgc2hvcnQKKy8vICAgICAgICAgICAgICAgICA6Oj0gaSAgIyBpbnQKKy8vICAgICAgICAgICAgICAgICA6Oj0gaiAgIyB1bnNpZ25lZCBpbnQKKy8vICAgICAgICAgICAgICAgICA6Oj0gbCAgIyBsb25nCisvLyAgICAgICAgICAgICAgICAgOjo9IG0gICMgdW5zaWduZWQgbG9uZworLy8gICAgICAgICAgICAgICAgIDo6PSB4ICAjIGxvbmcgbG9uZywgX19pbnQ2NAorLy8gICAgICAgICAgICAgICAgIDo6PSB5ICAjIHVuc2lnbmVkIGxvbmcgbG9uZywgX19pbnQ2NAorLy8gICAgICAgICAgICAgICAgIDo6PSBmICAjIGZsb2F0CisvLyAgICAgICAgICAgICAgICAgOjo9IGQgICMgZG91YmxlCisKK3N0YXRpYyBTY3JpcHRDU3RhdGU6OlN5bWJvbFRhYmxlX3QgZ1N5bXNbXSA9IHsKKyAgICAvLyBPcGVuQ0wgbWF0aAorICAgIHsgIl9aNGFjb3NmIiwgKHZvaWQgKikmYWNvc2YgfSwKKyAgICB7ICJfWjVhY29zaGYiLCAodm9pZCAqKSZhY29zaGYgfSwKKyAgICB7ICJfWjZhY29zcGlmIiwgKHZvaWQgKikmU0NfYWNvc3BpIH0sCisgICAgeyAiX1o0YXNpbmYiLCAodm9pZCAqKSZhc2luZiB9LAorICAgIHsgIl9aNWFzaW5oZiIsICh2b2lkICopJmFzaW5oZiB9LAorICAgIHsgIl9aNmFzaW5waWYiLCAodm9pZCAqKSZTQ19hc2lucGkgfSwKKyAgICB7ICJfWjRhdGFuZiIsICh2b2lkICopJmF0YW5mIH0sCisgICAgeyAiX1o1YXRhbjJmIiwgKHZvaWQgKikmYXRhbjJmIH0sCisgICAgeyAiX1o2YXRhbnBpZiIsICh2b2lkICopJlNDX2F0YW5waSB9LAorICAgIHsgIl9aN2F0YW4ycGlmIiwgKHZvaWQgKikmU0NfYXRhbjJwaSB9LAorICAgIHsgIl9aNGNicnRmIiwgKHZvaWQgKikmY2JydGYgfSwKKyAgICB7ICJfWjRjZWlsZiIsICh2b2lkICopJmNlaWxmIH0sCisgICAgeyAiX1o4Y29weXNpZ25mZiIsICh2b2lkICopJmNvcHlzaWduZiB9LAorICAgIHsgIl9aM2Nvc2YiLCAodm9pZCAqKSZjb3NmIH0sCisgICAgeyAiX1o0Y29zaGYiLCAodm9pZCAqKSZjb3NoZiB9LAorICAgIHsgIl9aNWNvc3BpZiIsICh2b2lkICopJlNDX2Nvc3BpIH0sCisgICAgeyAiX1o0ZXJmY2YiLCAodm9pZCAqKSZlcmZjZiB9LAorICAgIHsgIl9aM2VyZmYiLCAodm9pZCAqKSZlcmZmIH0sCisgICAgeyAiX1ozZXhwZiIsICh2b2lkICopJmV4cGYgfSwKKyAgICB7ICJfWjRleHAyZiIsICh2b2lkICopJmV4cDJmIH0sCisgICAgeyAiX1o1ZXhwMTBmIiwgKHZvaWQgKikmU0NfZXhwMTAgfSwKKyAgICB7ICJfWjVleHBtMWYiLCAodm9pZCAqKSZleHBtMWYgfSwKKyAgICB7ICJfWjRmYWJzZiIsICh2b2lkICopJmZhYnNmIH0sCisgICAgeyAiX1o0ZmRpbWZmIiwgKHZvaWQgKikmZmRpbWYgfSwKKyAgICB7ICJfWjVmbG9vcmYiLCAodm9pZCAqKSZmbG9vcmYgfSwKKyAgICB7ICJfWjNmbWFmZmYiLCAodm9pZCAqKSZmbWFmIH0sCisgICAgeyAiX1o0Zm1heGZmIiwgKHZvaWQgKikmZm1heGYgfSwKKyAgICB7ICJfWjRmbWluZmYiLCAodm9pZCAqKSZmbWluZiB9LCAgLy8gZmxvYXQgZm1pbihmbG9hdCwgZmxvYXQpCisgICAgeyAiX1o0Zm1vZGZmIiwgKHZvaWQgKikmZm1vZGYgfSwKKyAgICB7ICJfWjVmcmFjdGZQZiIsICh2b2lkICopJlNDX2ZyYWN0IH0sCisgICAgeyAiX1o1ZnJleHBmUGkiLCAodm9pZCAqKSZmcmV4cGYgfSwKKyAgICB7ICJfWjVoeXBvdGZmIiwgKHZvaWQgKikmaHlwb3RmIH0sCisgICAgeyAiX1o1aWxvZ2JmIiwgKHZvaWQgKikmaWxvZ2JmIH0sCisgICAgeyAiX1o1bGRleHBmaSIsICh2b2lkICopJmxkZXhwZiB9LAorICAgIHsgIl9aNmxnYW1tYWYiLCAodm9pZCAqKSZsZ2FtbWFmIH0sCisgICAgeyAiX1ozbG9nZiIsICh2b2lkICopJmxvZ2YgfSwKKyAgICB7ICJfWjRsb2cyZiIsICh2b2lkICopJlNDX2xvZzIgfSwKKyAgICB7ICJfWjVsb2cxMGYiLCAodm9pZCAqKSZsb2cxMGYgfSwKKyAgICB7ICJfWjVsb2cxcGYiLCAodm9pZCAqKSZsb2cxcGYgfSwKKyAgICAvL3sgImxvZ2IiLCAodm9pZCAqKSYgfSwKKyAgICAvL3sgIm1hZCIsICh2b2lkICopJiB9LAorICAgIHsgIm1vZGYiLCAodm9pZCAqKSZtb2RmZiB9LAorICAgIC8veyAibmFuIiwgKHZvaWQgKikmIH0sCisgICAgeyAiX1o5bmV4dGFmdGVyZmYiLCAodm9pZCAqKSZuZXh0YWZ0ZXJmIH0sCisgICAgeyAiX1ozcG93ZmYiLCAodm9pZCAqKSZwb3dmIH0sCisgICAgeyAiX1o0cG93bmZpIiwgKHZvaWQgKikmU0NfcG93biB9LAorICAgIHsgIl9aNHBvd3JmZiIsICh2b2lkICopJlNDX3Bvd3IgfSwKKyAgICB7ICJfWjlyZW1haW5kZXJmZiIsICh2b2lkICopJnJlbWFpbmRlcmYgfSwKKyAgICB7ICJyZW1xdW8iLCAodm9pZCAqKSZyZW1xdW9mIH0sCisgICAgeyAiX1o0cmludGYiLCAodm9pZCAqKSZyaW50ZiB9LAorICAgIHsgIl9aNXJvb3RuZmkiLCAodm9pZCAqKSZTQ19yb290biB9LAorICAgIHsgIl9aNXJvdW5kZiIsICh2b2lkICopJnJvdW5kZiB9LAorICAgIHsgIl9aNXJzcXJ0ZiIsICh2b2lkICopJlNDX3JzcXJ0IH0sCisgICAgeyAiX1ozc2luZiIsICh2b2lkICopJnNpbmYgfSwKKyAgICB7ICJzaW5jb3MiLCAodm9pZCAqKSZTQ19zaW5jb3MgfSwKKyAgICB7ICJfWjRzaW5oZiIsICh2b2lkICopJnNpbmhmIH0sCisgICAgeyAiX1o1c2lucGlmIiwgKHZvaWQgKikmU0Nfc2lucGkgfSwKKyAgICB7ICJfWjRzcXJ0ZiIsICh2b2lkICopJnNxcnRmIH0sCisgICAgeyAiX1ozdGFuZiIsICh2b2lkICopJnRhbmYgfSwKKyAgICB7ICJfWjR0YW5oZiIsICh2b2lkICopJnRhbmhmIH0sCisgICAgeyAiX1o1dGFucGlmIiwgKHZvaWQgKikmU0NfdGFucGkgfSwKKyAgICAvL3sgInRnYW1tYSIsICh2b2lkICopJiB9LAorICAgIHsgIl9aNXRydW5jZiIsICh2b2lkICopJnRydW5jZiB9LAorCisgICAgLy8gT3BlbkNMIEludAorICAgIHsgIl9aM2Fic2kiLCAodm9pZCAqKSZTQ19hYnNfaTMyIH0sCisgICAgeyAiX1ozYWJzcyIsICh2b2lkICopJlNDX2Fic19pMTYgfSwKKyAgICB7ICJfWjNhYnNjIiwgKHZvaWQgKikmU0NfYWJzX2k4IH0sCisgICAgeyAiX1ozY2x6aiIsICh2b2lkICopJlNDX2Nsel91MzIgfSwKKyAgICB7ICJfWjNjbHp0IiwgKHZvaWQgKikmU0NfY2x6X3UxNiB9LAorICAgIHsgIl9aM2NsemgiLCAodm9pZCAqKSZTQ19jbHpfdTggfSwKKyAgICB7ICJfWjNjbHppIiwgKHZvaWQgKikmU0NfY2x6X2kzMiB9LAorICAgIHsgIl9aM2NsenMiLCAodm9pZCAqKSZTQ19jbHpfaTE2IH0sCisgICAgeyAiX1ozY2x6YyIsICh2b2lkICopJlNDX2Nsel9pOCB9LAorICAgIHsgIl9aM21heGpqIiwgKHZvaWQgKikmU0NfbWF4X3UzMiB9LAorICAgIHsgIl9aM21heHR0IiwgKHZvaWQgKikmU0NfbWF4X3UxNiB9LAorICAgIHsgIl9aM21heGhoIiwgKHZvaWQgKikmU0NfbWF4X3U4IH0sCisgICAgeyAiX1ozbWF4aWkiLCAodm9pZCAqKSZTQ19tYXhfaTMyIH0sCisgICAgeyAiX1ozbWF4c3MiLCAodm9pZCAqKSZTQ19tYXhfaTE2IH0sCisgICAgeyAiX1ozbWF4Y2MiLCAodm9pZCAqKSZTQ19tYXhfaTggfSwKKyAgICB7ICJfWjNtaW5qaiIsICh2b2lkICopJlNDX21pbl91MzIgfSwKKyAgICB7ICJfWjNtaW50dCIsICh2b2lkICopJlNDX21pbl91MTYgfSwKKyAgICB7ICJfWjNtaW5oaCIsICh2b2lkICopJlNDX21pbl91OCB9LAorICAgIHsgIl9aM21pbmlpIiwgKHZvaWQgKikmU0NfbWluX2kzMiB9LAorICAgIHsgIl9aM21pbnNzIiwgKHZvaWQgKikmU0NfbWluX2kxNiB9LAorICAgIHsgIl9aM21pbmNjIiwgKHZvaWQgKikmU0NfbWluX2k4IH0sCisKKyAgICAvLyBPcGVuQ0wgNi4xMS40CisgICAgeyAiX1o1Y2xhbXBmZmYiLCAodm9pZCAqKSZTQ19jbGFtcF9mMzIgfSwKKyAgICB7ICJfWjdkZWdyZWVzZiIsICh2b2lkICopJlNDX2RlZ3JlZXMgfSwKKyAgICB7ICJfWjNtYXhmZiIsICh2b2lkICopJlNDX21heF9mMzIgfSwKKyAgICB7ICJfWjNtaW5mZiIsICh2b2lkICopJlNDX21pbl9mMzIgfSwKKyAgICB7ICJfWjNtaXhmZmYiLCAodm9pZCAqKSZTQ19taXhfZjMyIH0sCisgICAgeyAiX1o3cmFkaWFuc2YiLCAodm9pZCAqKSZTQ19yYWRpYW5zIH0sCisgICAgeyAiX1o0c3RlcGZmIiwgKHZvaWQgKikmU0Nfc3RlcF9mMzIgfSwKKyAgICAvL3sgInNtb290aHN0ZXAiLCAodm9pZCAqKSYgfSwKKyAgICB7ICJfWjRzaWduZiIsICh2b2lkICopJlNDX3NpZ25fZjMyIH0sCisKKyAgICB7IE5VTEwsIE5VTEwgfQorfTsKKworY29uc3QgU2NyaXB0Q1N0YXRlOjpTeW1ib2xUYWJsZV90ICogU2NyaXB0Q1N0YXRlOjpsb29rdXBTeW1ib2xDTChjb25zdCBjaGFyICpzeW0pCit7CisgICAgU2NyaXB0Q1N0YXRlOjpTeW1ib2xUYWJsZV90ICpzeW1zID0gZ1N5bXM7CisKKyAgICB3aGlsZSAoc3ltcy0+bVB0cikgeworICAgICAgICBpZiAoIXN0cmNtcChzeW1zLT5tTmFtZSwgc3ltKSkgeworICAgICAgICAgICAgcmV0dXJuIHN5bXM7CisgICAgICAgIH0KKyAgICAgICAgc3ltcysrOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc1NjcmlwdENfTGliR0wuY3BwIGIvbGlicy9ycy9yc1NjcmlwdENfTGliR0wuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3ODc3Y2RiCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9yc1NjcmlwdENfTGliR0wuY3BwCkBAIC0wLDAgKzEsNDQ0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgInJzQ29udGV4dC5oIgorI2luY2x1ZGUgInJzU2NyaXB0Qy5oIgorI2luY2x1ZGUgInJzTWF0cml4LmgiCisKKyNpbmNsdWRlICJhY2MvYWNjLmgiCisjaW5jbHVkZSAidXRpbHMvVGltZXJzLmgiCisKKyNkZWZpbmUgR0xfR0xFWFRfUFJPVE9UWVBFUworCisjaW5jbHVkZSA8R0xFUy9nbC5oPgorI2luY2x1ZGUgPEdMRVMvZ2xleHQuaD4KKyNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KKyNpbmNsdWRlIDxHTEVTMi9nbDJleHQuaD4KKworI2luY2x1ZGUgPHRpbWUuaD4KKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7Cit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6cmVuZGVyc2NyaXB0OworCisjZGVmaW5lIEdFVF9UTFMoKSAgQ29udGV4dDo6U2NyaXB0VExTU3RydWN0ICogdGxzID0gXAorICAgIChDb250ZXh0OjpTY3JpcHRUTFNTdHJ1Y3QgKilwdGhyZWFkX2dldHNwZWNpZmljKENvbnRleHQ6OmdUaHJlYWRUTFNLZXkpOyBcCisgICAgQ29udGV4dCAqIHJzYyA9IHRscy0+bUNvbnRleHQ7IFwKKyAgICBTY3JpcHRDICogc2MgPSAoU2NyaXB0QyAqKSB0bHMtPm1TY3JpcHQKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENvbnRleHQKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitzdGF0aWMgdm9pZCBTQ19iaW5kVGV4dHVyZShSc1Byb2dyYW1GcmFnbWVudCB2cGYsIHVpbnQzMl90IHNsb3QsIFJzQWxsb2NhdGlvbiB2YSkKK3sKKyAgICBHRVRfVExTKCk7CisgICAgcnNpX1Byb2dyYW1CaW5kVGV4dHVyZShyc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxQcm9ncmFtRnJhZ21lbnQgKj4odnBmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxBbGxvY2F0aW9uICo+KHZhKSk7CisKK30KKworc3RhdGljIHZvaWQgU0NfYmluZFNhbXBsZXIoUnNQcm9ncmFtRnJhZ21lbnQgdnBmLCB1aW50MzJfdCBzbG90LCBSc1NhbXBsZXIgdnMpCit7CisgICAgR0VUX1RMUygpOworICAgIHJzaV9Qcm9ncmFtQmluZFNhbXBsZXIocnNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8UHJvZ3JhbUZyYWdtZW50ICo+KHZwZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzbG90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8U2FtcGxlciAqPih2cykpOworCit9CisKK3N0YXRpYyB2b2lkIFNDX2JpbmRQcm9ncmFtU3RvcmUoUnNQcm9ncmFtU3RvcmUgcGZzKQoreworICAgIEdFVF9UTFMoKTsKKyAgICByc2lfQ29udGV4dEJpbmRQcm9ncmFtU3RvcmUocnNjLCBwZnMpOworfQorCitzdGF0aWMgdm9pZCBTQ19iaW5kUHJvZ3JhbUZyYWdtZW50KFJzUHJvZ3JhbUZyYWdtZW50IHBmKQoreworICAgIEdFVF9UTFMoKTsKKyAgICByc2lfQ29udGV4dEJpbmRQcm9ncmFtRnJhZ21lbnQocnNjLCBwZik7Cit9CisKK3N0YXRpYyB2b2lkIFNDX2JpbmRQcm9ncmFtVmVydGV4KFJzUHJvZ3JhbVZlcnRleCBwdikKK3sKKyAgICBHRVRfVExTKCk7CisgICAgcnNpX0NvbnRleHRCaW5kUHJvZ3JhbVZlcnRleChyc2MsIHB2KTsKK30KKworc3RhdGljIHZvaWQgU0NfYmluZFByb2dyYW1SYXN0ZXIoUnNQcm9ncmFtUmFzdGVyIHB2KQoreworICAgIEdFVF9UTFMoKTsKKyAgICByc2lfQ29udGV4dEJpbmRQcm9ncmFtUmFzdGVyKHJzYywgcHYpOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFZQCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworc3RhdGljIHZvaWQgU0NfdnBMb2FkUHJvamVjdGlvbk1hdHJpeChjb25zdCByc2NfTWF0cml4ICptKQoreworICAgIEdFVF9UTFMoKTsKKyAgICByc2MtPmdldFZlcnRleCgpLT5zZXRQcm9qZWN0aW9uTWF0cml4KG0pOworfQorCitzdGF0aWMgdm9pZCBTQ192cExvYWRNb2RlbE1hdHJpeChjb25zdCByc2NfTWF0cml4ICptKQoreworICAgIEdFVF9UTFMoKTsKKyAgICByc2MtPmdldFZlcnRleCgpLT5zZXRNb2RlbHZpZXdNYXRyaXgobSk7Cit9CisKK3N0YXRpYyB2b2lkIFNDX3ZwTG9hZFRleHR1cmVNYXRyaXgoY29uc3QgcnNjX01hdHJpeCAqbSkKK3sKKyAgICBHRVRfVExTKCk7CisgICAgcnNjLT5nZXRWZXJ0ZXgoKS0+c2V0VGV4dHVyZU1hdHJpeChtKTsKK30KKworCitzdGF0aWMgdm9pZCBTQ19wZkNvbnN0YW50Q29sb3IoUnNQcm9ncmFtRnJhZ21lbnQgdnBmLCBmbG9hdCByLCBmbG9hdCBnLCBmbG9hdCBiLCBmbG9hdCBhKQoreworICAgIC8vR0VUX1RMUygpOworICAgIFByb2dyYW1GcmFnbWVudCAqcGYgPSBzdGF0aWNfY2FzdDxQcm9ncmFtRnJhZ21lbnQgKj4odnBmKTsKKyAgICBwZi0+c2V0Q29uc3RhbnRDb2xvcihyLCBnLCBiLCBhKTsKK30KKworc3RhdGljIHZvaWQgU0NfdnBHZXRQcm9qZWN0aW9uTWF0cml4KHJzY19NYXRyaXggKm0pCit7CisgICAgR0VUX1RMUygpOworICAgIHJzYy0+Z2V0VmVydGV4KCktPmdldFByb2plY3Rpb25NYXRyaXgobSk7Cit9CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBEcmF3aW5nCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworc3RhdGljIHZvaWQgU0NfZHJhd1F1YWRUZXhDb29yZHMoZmxvYXQgeDEsIGZsb2F0IHkxLCBmbG9hdCB6MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHUxLCBmbG9hdCB2MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHgyLCBmbG9hdCB5MiwgZmxvYXQgejIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB1MiwgZmxvYXQgdjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4MywgZmxvYXQgeTMsIGZsb2F0IHozLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdTMsIGZsb2F0IHYzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeDQsIGZsb2F0IHk0LCBmbG9hdCB6NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHU0LCBmbG9hdCB2NCkKK3sKKyAgICBHRVRfVExTKCk7CisgICAgaWYgKCFyc2MtPnNldHVwQ2hlY2soKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy9MT0dFKCJRdWFkIik7CisgICAgLy9MT0dFKCIlNC4yZiwgJTQuMmYsICU0LjJmIiwgeDEsIHkxLCB6MSk7CisgICAgLy9MT0dFKCIlNC4yZiwgJTQuMmYsICU0LjJmIiwgeDIsIHkyLCB6Mik7CisgICAgLy9MT0dFKCIlNC4yZiwgJTQuMmYsICU0LjJmIiwgeDMsIHkzLCB6Myk7CisgICAgLy9MT0dFKCIlNC4yZiwgJTQuMmYsICU0LjJmIiwgeDQsIHk0LCB6NCk7CisKKyAgICBmbG9hdCB2dHhbXSA9IHt4MSx5MSx6MSwgeDIseTIsejIsIHgzLHkzLHozLCB4NCx5NCx6NH07CisgICAgY29uc3QgZmxvYXQgdGV4W10gPSB7dTEsdjEsIHUyLHYyLCB1Myx2MywgdTQsdjR9OworCisgICAgVmVydGV4QXJyYXkgdmE7CisgICAgdmEuYWRkKEdMX0ZMT0FULCAzLCAxMiwgZmFsc2UsICh1aW50MzJfdCl2dHgsICJwb3NpdGlvbiIpOworICAgIHZhLmFkZChHTF9GTE9BVCwgMiwgOCwgZmFsc2UsICh1aW50MzJfdCl0ZXgsICJ0ZXh0dXJlMCIpOworICAgIHZhLnNldHVwR0wyKHJzYywgJnJzYy0+bVN0YXRlVmVydGV4QXJyYXksICZyc2MtPm1TaGFkZXJDYWNoZSk7CisKKyAgICBnbERyYXdBcnJheXMoR0xfVFJJQU5HTEVfRkFOLCAwLCA0KTsKK30KKworc3RhdGljIHZvaWQgU0NfZHJhd1F1YWQoZmxvYXQgeDEsIGZsb2F0IHkxLCBmbG9hdCB6MSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHgyLCBmbG9hdCB5MiwgZmxvYXQgejIsCisgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4MywgZmxvYXQgeTMsIGZsb2F0IHozLAorICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeDQsIGZsb2F0IHk0LCBmbG9hdCB6NCkKK3sKKyAgICBTQ19kcmF3UXVhZFRleENvb3Jkcyh4MSwgeTEsIHoxLCAwLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgIHgyLCB5MiwgejIsIDEsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgeDMsIHkzLCB6MywgMSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB4NCwgeTQsIHo0LCAwLCAwKTsKK30KKworc3RhdGljIHZvaWQgU0NfZHJhd1Nwcml0ZVNjcmVlbnNwYWNlKGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHosIGZsb2F0IHcsIGZsb2F0IGgpCit7CisgICAgR0VUX1RMUygpOworICAgIE9iamVjdEJhc2VSZWY8Y29uc3QgUHJvZ3JhbVZlcnRleD4gdG1wKHJzYy0+Z2V0VmVydGV4KCkpOworICAgIHJzYy0+c2V0VmVydGV4KHJzYy0+Z2V0RGVmYXVsdFByb2dyYW1WZXJ0ZXgoKSk7CisgICAgLy9yc2MtPnNldHVwQ2hlY2soKTsKKworICAgIC8vR0xpbnQgY3JvcFs0XSA9IHswLCBoLCB3LCAtaH07CisKKyAgICBmbG9hdCBzaCA9IHJzYy0+Z2V0SGVpZ2h0KCk7CisKKyAgICBTQ19kcmF3UXVhZCh4LCAgIHNoIC0geSwgICAgIHosCisgICAgICAgICAgICAgICAgeCt3LCBzaCAtIHksICAgICB6LAorICAgICAgICAgICAgICAgIHgrdywgc2ggLSAoeStoKSwgeiwKKyAgICAgICAgICAgICAgICB4LCAgIHNoIC0gKHkraCksIHopOworICAgIHJzYy0+c2V0VmVydGV4KChQcm9ncmFtVmVydGV4ICopdG1wLmdldCgpKTsKK30KKy8qCitzdGF0aWMgdm9pZCBTQ19kcmF3U3ByaXRlKGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHosIGZsb2F0IHcsIGZsb2F0IGgpCit7CisgICAgR0VUX1RMUygpOworICAgIGZsb2F0IHZpblszXSA9IHt4LCB5LCB6fTsKKyAgICBmbG9hdCB2b3V0WzRdOworCisgICAgLy9MT0dFKCJkcyAgaW4gJWYgJWYgJWYiLCB4LCB5LCB6KTsKKyAgICByc2MtPmdldFZlcnRleCgpLT50cmFuc2Zvcm1Ub1NjcmVlbihyc2MsIHZvdXQsIHZpbik7CisgICAgLy9MT0dFKCJkcyAgb3V0ICVmICVmICVmICVmIiwgdm91dFswXSwgdm91dFsxXSwgdm91dFsyXSwgdm91dFszXSk7CisgICAgdm91dFswXSAvPSB2b3V0WzNdOworICAgIHZvdXRbMV0gLz0gdm91dFszXTsKKyAgICB2b3V0WzJdIC89IHZvdXRbM107CisKKyAgICB2b3V0WzBdICo9IHJzYy0+Z2V0V2lkdGgoKSAvIDI7CisgICAgdm91dFsxXSAqPSByc2MtPmdldEhlaWdodCgpIC8gMjsKKyAgICB2b3V0WzBdICs9IHJzYy0+Z2V0V2lkdGgoKSAvIDI7CisgICAgdm91dFsxXSArPSByc2MtPmdldEhlaWdodCgpIC8gMjsKKworICAgIHZvdXRbMF0gLT0gdy8yOworICAgIHZvdXRbMV0gLT0gaC8yOworCisgICAgLy9MT0dFKCJkcyAgb3V0MiAlZiAlZiAlZiIsIHZvdXRbMF0sIHZvdXRbMV0sIHZvdXRbMl0pOworCisgICAgLy8gVSwgViwgVywgSAorICAgIFNDX2RyYXdTcHJpdGVTY3JlZW5zcGFjZSh2b3V0WzBdLCB2b3V0WzFdLCB6LCBoLCB3KTsKKyAgICAvL3JzYy0+c2V0dXBDaGVjaygpOworfQorKi8KKworc3RhdGljIHZvaWQgU0NfZHJhd1JlY3QoZmxvYXQgeDEsIGZsb2F0IHkxLAorICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeDIsIGZsb2F0IHkyLCBmbG9hdCB6KQoreworICAgIC8vTE9HRSgiU0NfZHJhd1JlY3QgJWYsJWYgICVmLCVmICAlZiIsIHgxLCB5MSwgeDIsIHkyLCB6KTsKKyAgICBTQ19kcmF3UXVhZCh4MSwgeTIsIHosCisgICAgICAgICAgICAgICAgeDIsIHkyLCB6LAorICAgICAgICAgICAgICAgIHgyLCB5MSwgeiwKKyAgICAgICAgICAgICAgICB4MSwgeTEsIHopOworfQorCitzdGF0aWMgdm9pZCBTQ19kcmF3TWVzaChSc01lc2ggdnNtKQoreworICAgIEdFVF9UTFMoKTsKKyAgICBNZXNoICpzbSA9IHN0YXRpY19jYXN0PE1lc2ggKj4odnNtKTsKKyAgICBpZiAoIXJzYy0+c2V0dXBDaGVjaygpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc20tPnJlbmRlcihyc2MpOworfQorCitzdGF0aWMgdm9pZCBTQ19kcmF3TWVzaFByaW1pdGl2ZShSc01lc2ggdnNtLCB1aW50MzJfdCBwcmltSW5kZXgpCit7CisgICAgR0VUX1RMUygpOworICAgIE1lc2ggKnNtID0gc3RhdGljX2Nhc3Q8TWVzaCAqPih2c20pOworICAgIGlmICghcnNjLT5zZXR1cENoZWNrKCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzbS0+cmVuZGVyUHJpbWl0aXZlKHJzYywgcHJpbUluZGV4KTsKK30KKworc3RhdGljIHZvaWQgU0NfZHJhd01lc2hQcmltaXRpdmVSYW5nZShSc01lc2ggdnNtLCB1aW50MzJfdCBwcmltSW5kZXgsIHVpbnQzMl90IHN0YXJ0LCB1aW50MzJfdCBsZW4pCit7CisgICAgR0VUX1RMUygpOworICAgIE1lc2ggKnNtID0gc3RhdGljX2Nhc3Q8TWVzaCAqPih2c20pOworICAgIGlmICghcnNjLT5zZXR1cENoZWNrKCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzbS0+cmVuZGVyUHJpbWl0aXZlUmFuZ2UocnNjLCBwcmltSW5kZXgsIHN0YXJ0LCBsZW4pOworfQorCitzdGF0aWMgdm9pZCBTQ19tZXNoQ29tcHV0ZUJvdW5kaW5nQm94KFJzTWVzaCB2c20sIGZsb2F0ICptaW5YLCBmbG9hdCAqbWluWSwgZmxvYXQgKm1pblosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICptYXhYLCBmbG9hdCAqbWF4WSwgZmxvYXQgKm1heFopCit7CisgICAgR0VUX1RMUygpOworICAgIE1lc2ggKnNtID0gc3RhdGljX2Nhc3Q8TWVzaCAqPih2c20pOworICAgIHNtLT5jb21wdXRlQkJveCgpOworICAgICptaW5YID0gc20tPm1CQm94TWluWzBdOworICAgICptaW5ZID0gc20tPm1CQm94TWluWzFdOworICAgICptaW5aID0gc20tPm1CQm94TWluWzJdOworICAgICptYXhYID0gc20tPm1CQm94TWF4WzBdOworICAgICptYXhZID0gc20tPm1CQm94TWF4WzFdOworICAgICptYXhaID0gc20tPm1CQm94TWF4WzJdOworfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisKK3N0YXRpYyB2b2lkIFNDX2NvbG9yKGZsb2F0IHIsIGZsb2F0IGcsIGZsb2F0IGIsIGZsb2F0IGEpCit7CisgICAgR0VUX1RMUygpOworICAgIFByb2dyYW1GcmFnbWVudCAqcGYgPSAoUHJvZ3JhbUZyYWdtZW50ICopcnNjLT5nZXRGcmFnbWVudCgpOworICAgIHBmLT5zZXRDb25zdGFudENvbG9yKHIsIGcsIGIsIGEpOworfQorCitzdGF0aWMgdm9pZCBTQ191cGxvYWRUb1RleHR1cmUyKFJzQWxsb2NhdGlvbiB2YSwgdWludDMyX3QgYmFzZU1pcExldmVsKQoreworICAgIEdFVF9UTFMoKTsKKyAgICByc2lfQWxsb2NhdGlvblVwbG9hZFRvVGV4dHVyZShyc2MsIHZhLCBmYWxzZSwgYmFzZU1pcExldmVsKTsKK30KK3N0YXRpYyB2b2lkIFNDX3VwbG9hZFRvVGV4dHVyZShSc0FsbG9jYXRpb24gdmEpCit7CisgICAgR0VUX1RMUygpOworICAgIHJzaV9BbGxvY2F0aW9uVXBsb2FkVG9UZXh0dXJlKHJzYywgdmEsIGZhbHNlLCAwKTsKK30KKworc3RhdGljIHZvaWQgU0NfdXBsb2FkVG9CdWZmZXJPYmplY3QoUnNBbGxvY2F0aW9uIHZhKQoreworICAgIEdFVF9UTFMoKTsKKyAgICByc2lfQWxsb2NhdGlvblVwbG9hZFRvQnVmZmVyT2JqZWN0KHJzYywgdmEpOworfQorCitzdGF0aWMgdm9pZCBTQ19DbGVhckNvbG9yKGZsb2F0IHIsIGZsb2F0IGcsIGZsb2F0IGIsIGZsb2F0IGEpCit7CisgICAgR0VUX1RMUygpOworICAgIGlmICghcnNjLT5zZXR1cENoZWNrKCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGdsQ2xlYXJDb2xvcihyLCBnLCBiLCBhKTsKKyAgICBnbENsZWFyKEdMX0NPTE9SX0JVRkZFUl9CSVQpOworfQorCitzdGF0aWMgdm9pZCBTQ19DbGVhckRlcHRoKGZsb2F0IHYpCit7CisgICAgR0VUX1RMUygpOworICAgIGlmICghcnNjLT5zZXR1cENoZWNrKCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGdsQ2xlYXJEZXB0aGYodik7CisgICAgZ2xDbGVhcihHTF9ERVBUSF9CVUZGRVJfQklUKTsKK30KKworc3RhdGljIHVpbnQzMl90IFNDX2dldFdpZHRoKCkKK3sKKyAgICBHRVRfVExTKCk7CisgICAgcmV0dXJuIHJzYy0+Z2V0V2lkdGgoKTsKK30KKworc3RhdGljIHVpbnQzMl90IFNDX2dldEhlaWdodCgpCit7CisgICAgR0VUX1RMUygpOworICAgIHJldHVybiByc2MtPmdldEhlaWdodCgpOworfQorCitzdGF0aWMgdm9pZCBTQ19EcmF3VGV4dEFsbG9jKFJzQWxsb2NhdGlvbiB2YSwgaW50IHgsIGludCB5KQoreworICAgIEdFVF9UTFMoKTsKKyAgICBBbGxvY2F0aW9uICphbGxvYyA9IHN0YXRpY19jYXN0PEFsbG9jYXRpb24gKj4odmEpOworICAgIHJzYy0+bVN0YXRlRm9udC5yZW5kZXJUZXh0KGFsbG9jLCB4LCB5KTsKK30KKworc3RhdGljIHZvaWQgU0NfRHJhd1RleHQoY29uc3QgY2hhciAqdGV4dCwgaW50IHgsIGludCB5KQoreworICAgIEdFVF9UTFMoKTsKKyAgICByc2MtPm1TdGF0ZUZvbnQucmVuZGVyVGV4dCh0ZXh0LCB4LCB5KTsKK30KKworc3RhdGljIHZvaWQgU0NfQmluZEZvbnQoUnNGb250IGZvbnQpCit7CisgICAgR0VUX1RMUygpOworICAgIHJzaV9Db250ZXh0QmluZEZvbnQocnNjLCBmb250KTsKK30KKworc3RhdGljIHZvaWQgU0NfRm9udENvbG9yKGZsb2F0IHIsIGZsb2F0IGcsIGZsb2F0IGIsIGZsb2F0IGEpCit7CisgICAgR0VUX1RMUygpOworICAgIHJzYy0+bVN0YXRlRm9udC5zZXRGb250Q29sb3IociwgZywgYiwgYSk7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQ2xhc3MgaW1wbGVtZW50YXRpb24KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvLyBsbHZtIG5hbWUgbWFuZ2xpbmcgcmVmCisvLyAgPGJ1aWx0aW4tdHlwZT4gOjo9IHYgICMgdm9pZAorLy8gICAgICAgICAgICAgICAgIDo6PSBiICAjIGJvb2wKKy8vICAgICAgICAgICAgICAgICA6Oj0gYyAgIyBjaGFyCisvLyAgICAgICAgICAgICAgICAgOjo9IGEgICMgc2lnbmVkIGNoYXIKKy8vICAgICAgICAgICAgICAgICA6Oj0gaCAgIyB1bnNpZ25lZCBjaGFyCisvLyAgICAgICAgICAgICAgICAgOjo9IHMgICMgc2hvcnQKKy8vICAgICAgICAgICAgICAgICA6Oj0gdCAgIyB1bnNpZ25lZCBzaG9ydAorLy8gICAgICAgICAgICAgICAgIDo6PSBpICAjIGludAorLy8gICAgICAgICAgICAgICAgIDo6PSBqICAjIHVuc2lnbmVkIGludAorLy8gICAgICAgICAgICAgICAgIDo6PSBsICAjIGxvbmcKKy8vICAgICAgICAgICAgICAgICA6Oj0gbSAgIyB1bnNpZ25lZCBsb25nCisvLyAgICAgICAgICAgICAgICAgOjo9IHggICMgbG9uZyBsb25nLCBfX2ludDY0CisvLyAgICAgICAgICAgICAgICAgOjo9IHkgICMgdW5zaWduZWQgbG9uZyBsb25nLCBfX2ludDY0CisvLyAgICAgICAgICAgICAgICAgOjo9IGYgICMgZmxvYXQKKy8vICAgICAgICAgICAgICAgICA6Oj0gZCAgIyBkb3VibGUKKworc3RhdGljIFNjcmlwdENTdGF0ZTo6U3ltYm9sVGFibGVfdCBnU3ltc1tdID0geworICAgIHsgIl9aMjJyc2dCaW5kUHJvZ3JhbUZyYWdtZW50MTlyc19wcm9ncmFtX2ZyYWdtZW50IiwgKHZvaWQgKikmU0NfYmluZFByb2dyYW1GcmFnbWVudCB9LAorICAgIHsgIl9aMTlyc2dCaW5kUHJvZ3JhbVN0b3JlMTZyc19wcm9ncmFtX3N0b3JlIiwgKHZvaWQgKikmU0NfYmluZFByb2dyYW1TdG9yZSB9LAorICAgIHsgIl9aMjByc2dCaW5kUHJvZ3JhbVZlcnRleDE3cnNfcHJvZ3JhbV92ZXJ0ZXgiLCAodm9pZCAqKSZTQ19iaW5kUHJvZ3JhbVZlcnRleCB9LAorICAgIHsgIl9aMjByc2dCaW5kUHJvZ3JhbVJhc3RlcjE3cnNfcHJvZ3JhbV9yYXN0ZXIiLCAodm9pZCAqKSZTQ19iaW5kUHJvZ3JhbVJhc3RlciB9LAorICAgIHsgIl9aMTRyc2dCaW5kU2FtcGxlcjE5cnNfcHJvZ3JhbV9mcmFnbWVudGoxMHJzX3NhbXBsZXIiLCAodm9pZCAqKSZTQ19iaW5kU2FtcGxlciB9LAorICAgIHsgIl9aMTRyc2dCaW5kVGV4dHVyZTE5cnNfcHJvZ3JhbV9mcmFnbWVudGoxM3JzX2FsbG9jYXRpb24iLCAodm9pZCAqKSZTQ19iaW5kVGV4dHVyZSB9LAorCisgICAgeyAiX1ozNnJzZ1Byb2dyYW1WZXJ0ZXhMb2FkUHJvamVjdGlvbk1hdHJpeFBLMTJyc19tYXRyaXg0eDQiLCAodm9pZCAqKSZTQ192cExvYWRQcm9qZWN0aW9uTWF0cml4IH0sCisgICAgeyAiX1ozMXJzZ1Byb2dyYW1WZXJ0ZXhMb2FkTW9kZWxNYXRyaXhQSzEycnNfbWF0cml4NHg0IiwgKHZvaWQgKikmU0NfdnBMb2FkTW9kZWxNYXRyaXggfSwKKyAgICB7ICJfWjMzcnNnUHJvZ3JhbVZlcnRleExvYWRUZXh0dXJlTWF0cml4UEsxMnJzX21hdHJpeDR4NCIsICh2b2lkICopJlNDX3ZwTG9hZFRleHR1cmVNYXRyaXggfSwKKworICAgIHsgIl9aMzVyc2dQcm9ncmFtVmVydGV4R2V0UHJvamVjdGlvbk1hdHJpeFAxMnJzX21hdHJpeDR4NCIsICh2b2lkICopJlNDX3ZwR2V0UHJvamVjdGlvbk1hdHJpeCB9LAorCisgICAgeyAiX1ozMXJzZ1Byb2dyYW1GcmFnbWVudENvbnN0YW50Q29sb3IxOXJzX3Byb2dyYW1fZnJhZ21lbnRmZmZmIiwgKHZvaWQgKikmU0NfcGZDb25zdGFudENvbG9yIH0sCisKKyAgICB7ICJfWjExcnNnR2V0V2lkdGh2IiwgKHZvaWQgKikmU0NfZ2V0V2lkdGggfSwKKyAgICB7ICJfWjEycnNnR2V0SGVpZ2h0diIsICh2b2lkICopJlNDX2dldEhlaWdodCB9LAorCisgICAgeyAiX1oxOHJzZ1VwbG9hZFRvVGV4dHVyZTEzcnNfYWxsb2NhdGlvbmoiLCAodm9pZCAqKSZTQ191cGxvYWRUb1RleHR1cmUyIH0sCisgICAgeyAiX1oxOHJzZ1VwbG9hZFRvVGV4dHVyZTEzcnNfYWxsb2NhdGlvbiIsICh2b2lkICopJlNDX3VwbG9hZFRvVGV4dHVyZSB9LAorICAgIHsgIl9aMjNyc2dVcGxvYWRUb0J1ZmZlck9iamVjdDEzcnNfYWxsb2NhdGlvbiIsICh2b2lkICopJlNDX3VwbG9hZFRvQnVmZmVyT2JqZWN0IH0sCisKKyAgICB7ICJfWjExcnNnRHJhd1JlY3RmZmZmZiIsICh2b2lkICopJlNDX2RyYXdSZWN0IH0sCisgICAgeyAiX1oxMXJzZ0RyYXdRdWFkZmZmZmZmZmZmZmZmIiwgKHZvaWQgKikmU0NfZHJhd1F1YWQgfSwKKyAgICB7ICJfWjIwcnNnRHJhd1F1YWRUZXhDb29yZHNmZmZmZmZmZmZmZmZmZmZmZmZmZiIsICh2b2lkICopJlNDX2RyYXdRdWFkVGV4Q29vcmRzIH0sCisgICAgeyAiX1oyNHJzZ0RyYXdTcHJpdGVTY3JlZW5zcGFjZWZmZmZmIiwgKHZvaWQgKikmU0NfZHJhd1Nwcml0ZVNjcmVlbnNwYWNlIH0sCisKKyAgICB7ICJfWjExcnNnRHJhd01lc2g3cnNfbWVzaCIsICh2b2lkICopJlNDX2RyYXdNZXNoIH0sCisgICAgeyAiX1oxMXJzZ0RyYXdNZXNoN3JzX21lc2hqIiwgKHZvaWQgKikmU0NfZHJhd01lc2hQcmltaXRpdmUgfSwKKyAgICB7ICJfWjExcnNnRHJhd01lc2g3cnNfbWVzaGpqaiIsICh2b2lkICopJlNDX2RyYXdNZXNoUHJpbWl0aXZlUmFuZ2UgfSwKKyAgICB7ICJfWjI1cnNnTWVzaENvbXB1dGVCb3VuZGluZ0JveDdyc19tZXNoUGZTMF9TMF9TMF9TMF9TMF8iLCAodm9pZCAqKSZTQ19tZXNoQ29tcHV0ZUJvdW5kaW5nQm94IH0sCisKKyAgICB7ICJfWjEzcnNnQ2xlYXJDb2xvcmZmZmYiLCAodm9pZCAqKSZTQ19DbGVhckNvbG9yIH0sCisgICAgeyAiX1oxM3JzZ0NsZWFyRGVwdGhmIiwgKHZvaWQgKikmU0NfQ2xlYXJEZXB0aCB9LAorCisgICAgeyAiX1oxMXJzZ0RyYXdUZXh0UEtjaWkiLCAodm9pZCAqKSZTQ19EcmF3VGV4dCB9LAorICAgIHsgIl9aMTFyc2dEcmF3VGV4dDEzcnNfYWxsb2NhdGlvbmlpIiwgKHZvaWQgKikmU0NfRHJhd1RleHRBbGxvYyB9LAorCisgICAgeyAiX1oxMXJzZ0JpbmRGb250N3JzX2ZvbnQiLCAodm9pZCAqKSZTQ19CaW5kRm9udCB9LAorICAgIHsgIl9aMTJyc2dGb250Q29sb3JmZmZmIiwgKHZvaWQgKikmU0NfRm9udENvbG9yIH0sCisKKyAgICAvLyBtaXNjCisgICAgeyAiX1o1Y29sb3JmZmZmIiwgKHZvaWQgKikmU0NfY29sb3IgfSwKKworICAgIHsgTlVMTCwgTlVMTCB9Cit9OworCitjb25zdCBTY3JpcHRDU3RhdGU6OlN5bWJvbFRhYmxlX3QgKiBTY3JpcHRDU3RhdGU6Omxvb2t1cFN5bWJvbEdMKGNvbnN0IGNoYXIgKnN5bSkKK3sKKyAgICBTY3JpcHRDU3RhdGU6OlN5bWJvbFRhYmxlX3QgKnN5bXMgPSBnU3ltczsKKworICAgIHdoaWxlIChzeW1zLT5tUHRyKSB7CisgICAgICAgIGlmICghc3RyY21wKHN5bXMtPm1OYW1lLCBzeW0pKSB7CisgICAgICAgICAgICByZXR1cm4gc3ltczsKKyAgICAgICAgfQorICAgICAgICBzeW1zKys7CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzU2hhZGVyQ2FjaGUuY3BwIGIvbGlicy9ycy9yc1NoYWRlckNhY2hlLmNwcAppbmRleCA0NzExZDFiLi41YzA3M2IzIDEwMDY0NAotLS0gYS9saWJzL3JzL3JzU2hhZGVyQ2FjaGUuY3BwCisrKyBiL2xpYnMvcnMvcnNTaGFkZXJDYWNoZS5jcHAKQEAgLTE0LDEwICsxNCwxNCBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorI2lmbmRlZiBBTkRST0lEX1JTX0JVSUxEX0ZPUl9IT1NUCiAjaW5jbHVkZSAicnNDb250ZXh0LmgiCi0KICNpbmNsdWRlIDxHTEVTL2dsLmg+CiAjaW5jbHVkZSA8R0xFUzIvZ2wyLmg+CisjZWxzZQorI2luY2x1ZGUgInJzQ29udGV4dEhvc3RTdHViLmgiCisjaW5jbHVkZSA8T3BlbkdML2dsLmg+CisjZW5kaWYgLy9BTkRST0lEX1JTX0JVSUxEX0ZPUl9IT1NUCiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OnJlbmRlcnNjcmlwdDsKQEAgLTk0LDE2ICs5OCwxMCBAQAogICAgICAgICBnbEF0dGFjaFNoYWRlcihwZ20sIGZyYWctPmdldFNoYWRlcklEKCkpOwogCiAgICAgICAgIGlmICghdnR4LT5pc1VzZXJQcm9ncmFtKCkpIHsKLSAgICAgICAgICAgIGdsQmluZEF0dHJpYkxvY2F0aW9uKHBnbSwgMCwgIkFUVFJJQl9MZWdhY3lQb3NpdGlvbiIpOwotICAgICAgICAgICAgZ2xCaW5kQXR0cmliTG9jYXRpb24ocGdtLCAxLCAiQVRUUklCX0xlZ2FjeUNvbG9yIik7Ci0gICAgICAgICAgICBnbEJpbmRBdHRyaWJMb2NhdGlvbihwZ20sIDIsICJBVFRSSUJfTGVnYWN5Tm9ybWFsIik7Ci0gICAgICAgICAgICBnbEJpbmRBdHRyaWJMb2NhdGlvbihwZ20sIDMsICJBVFRSSUJfTGVnYWN5UG9pbnRTaXplIik7Ci0gICAgICAgICAgICBnbEJpbmRBdHRyaWJMb2NhdGlvbihwZ20sIDQsICJBVFRSSUJfTGVnYWN5VGV4dHVyZSIpOwotICAgICAgICAgICAgZS0+bVZ0eEF0dHJpYlNsb3RzW1JTX0tJTkRfUE9TSVRJT05dID0gMDsKLSAgICAgICAgICAgIGUtPm1WdHhBdHRyaWJTbG90c1tSU19LSU5EX0NPTE9SXSA9IDE7Ci0gICAgICAgICAgICBlLT5tVnR4QXR0cmliU2xvdHNbUlNfS0lORF9OT1JNQUxdID0gMjsKLSAgICAgICAgICAgIGUtPm1WdHhBdHRyaWJTbG90c1tSU19LSU5EX1BPSU5UX1NJWkVdID0gMzsKLSAgICAgICAgICAgIGUtPm1WdHhBdHRyaWJTbG90c1tSU19LSU5EX1RFWFRVUkVdID0gNDsKKyAgICAgICAgICAgIGdsQmluZEF0dHJpYkxvY2F0aW9uKHBnbSwgMCwgIkFUVFJJQl9wb3NpdGlvbiIpOworICAgICAgICAgICAgZ2xCaW5kQXR0cmliTG9jYXRpb24ocGdtLCAxLCAiQVRUUklCX2NvbG9yIik7CisgICAgICAgICAgICBnbEJpbmRBdHRyaWJMb2NhdGlvbihwZ20sIDIsICJBVFRSSUJfbm9ybWFsIik7CisgICAgICAgICAgICBnbEJpbmRBdHRyaWJMb2NhdGlvbihwZ20sIDMsICJBVFRSSUJfdGV4dHVyZTAiKTsKICAgICAgICAgfQogCiAgICAgICAgIC8vTE9HRSgiZTIgJXgiLCBnbEdldEVycm9yKCkpOwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc1NpZ25hbC5jcHAgYi9saWJzL3JzL3JzU2lnbmFsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjM5YmZkCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9yc1NpZ25hbC5jcHAKQEAgLTAsMCArMSw5OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJyc1NpZ25hbC5oIgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpyZW5kZXJzY3JpcHQ7CisKKworU2lnbmFsOjpTaWduYWwoKQoreworICAgIG1TZXQgPSB0cnVlOworfQorCitTaWduYWw6On5TaWduYWwoKQoreworICAgIHB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmbU11dGV4KTsKKyAgICBwdGhyZWFkX2NvbmRfZGVzdHJveSgmbUNvbmRpdGlvbik7Cit9CisKK2Jvb2wgU2lnbmFsOjppbml0KCkKK3sKKyAgICBpbnQgc3RhdHVzID0gcHRocmVhZF9tdXRleF9pbml0KCZtTXV0ZXgsIE5VTEwpOworICAgIGlmIChzdGF0dXMpIHsKKyAgICAgICAgTE9HRSgiTG9ja2xlc3NGaWZvIG11dGV4IGluaXQgZmFpbHVyZSIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgc3RhdHVzID0gcHRocmVhZF9jb25kX2luaXQoJm1Db25kaXRpb24sIE5VTEwpOworICAgIGlmIChzdGF0dXMpIHsKKyAgICAgICAgTE9HRSgiTG9ja2xlc3NGaWZvIGNvbmRpdGlvbiBpbml0IGZhaWx1cmUiKTsKKyAgICAgICAgcHRocmVhZF9tdXRleF9kZXN0cm95KCZtTXV0ZXgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgU2lnbmFsOjpzZXQoKQoreworICAgIGludCBzdGF0dXM7CisKKyAgICBzdGF0dXMgPSBwdGhyZWFkX211dGV4X2xvY2soJm1NdXRleCk7CisgICAgaWYgKHN0YXR1cykgeworICAgICAgICBMT0dFKCJMb2NrbGVzc0NvbW1hbmRGaWZvOiBlcnJvciAlaSBsb2NraW5nIGZvciBzZXQgY29uZGl0aW9uLiIsIHN0YXR1cyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtU2V0ID0gdHJ1ZTsKKworICAgIHN0YXR1cyA9IHB0aHJlYWRfY29uZF9zaWduYWwoJm1Db25kaXRpb24pOworICAgIGlmIChzdGF0dXMpIHsKKyAgICAgICAgTE9HRSgiTG9ja2xlc3NDb21tYW5kRmlmbzogZXJyb3IgJWkgb24gc2V0IGNvbmRpdGlvbi4iLCBzdGF0dXMpOworICAgIH0KKworICAgIHN0YXR1cyA9IHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtTXV0ZXgpOworICAgIGlmIChzdGF0dXMpIHsKKyAgICAgICAgTE9HRSgiTG9ja2xlc3NDb21tYW5kRmlmbzogZXJyb3IgJWkgdW5sb2NraW5nIGZvciBzZXQgY29uZGl0aW9uLiIsIHN0YXR1cyk7CisgICAgfQorfQorCit2b2lkIFNpZ25hbDo6d2FpdCgpCit7CisgICAgaW50IHN0YXR1czsKKworICAgIHN0YXR1cyA9IHB0aHJlYWRfbXV0ZXhfbG9jaygmbU11dGV4KTsKKyAgICBpZiAoc3RhdHVzKSB7CisgICAgICAgIExPR0UoIkxvY2tsZXNzQ29tbWFuZEZpZm86IGVycm9yICVpIGxvY2tpbmcgZm9yIGNvbmRpdGlvbi4iLCBzdGF0dXMpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCFtU2V0KSB7CisgICAgICAgIHN0YXR1cyA9IHB0aHJlYWRfY29uZF93YWl0KCZtQ29uZGl0aW9uLCAmbU11dGV4KTsKKyAgICAgICAgaWYgKHN0YXR1cykgeworICAgICAgICAgICAgTE9HRSgiTG9ja2xlc3NDb21tYW5kRmlmbzogZXJyb3IgJWkgd2FpdGluZyBvbiBjb25kaXRpb24uIiwgc3RhdHVzKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBtU2V0ID0gZmFsc2U7CisKKyAgICBzdGF0dXMgPSBwdGhyZWFkX211dGV4X3VubG9jaygmbU11dGV4KTsKKyAgICBpZiAoc3RhdHVzKSB7CisgICAgICAgIExPR0UoIkxvY2tsZXNzQ29tbWFuZEZpZm86IGVycm9yICVpIHVubG9ja2luZyBmb3IgY29uZGl0aW9uLiIsIHN0YXR1cyk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzU2lnbmFsLmggYi9saWJzL3JzL3JzU2lnbmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU3NjBmMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvcnNTaWduYWwuaApAQCAtMCwwICsxLDQ2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1JTX1NJR05BTF9ICisjZGVmaW5lIEFORFJPSURfUlNfU0lHTkFMX0gKKworCisjaW5jbHVkZSAicnNVdGlscy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgcmVuZGVyc2NyaXB0IHsKKworY2xhc3MgU2lnbmFsIHsKK3B1YmxpYzoKKyAgICBTaWduYWwoKTsKKyAgICB+U2lnbmFsKCk7CisKKyAgICBib29sIGluaXQoKTsKKworICAgIHZvaWQgc2V0KCk7CisgICAgdm9pZCB3YWl0KCk7CisKK3Byb3RlY3RlZDoKKyAgICBib29sIG1TZXQ7CisgICAgcHRocmVhZF9tdXRleF90IG1NdXRleDsKKyAgICBwdGhyZWFkX2NvbmRfdCBtQ29uZGl0aW9uOworfTsKKworfQorfQorCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc1NpbXBsZU1lc2guY3BwIGIvbGlicy9ycy9yc1NpbXBsZU1lc2guY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1M2NlNWNkLi4wMDAwMDAwCi0tLSBhL2xpYnMvcnMvcnNTaW1wbGVNZXNoLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE2OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgInJzQ29udGV4dC5oIgotCi11c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKLXVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpyZW5kZXJzY3JpcHQ7Ci0KLSNpbmNsdWRlIDxHTEVTL2dsLmg+Ci0jaW5jbHVkZSA8R0xFUy9nbGV4dC5oPgotCi1TaW1wbGVNZXNoOjpTaW1wbGVNZXNoKENvbnRleHQgKnJzYykgOiBPYmplY3RCYXNlKHJzYykKLXsKLSAgICBtQWxsb2NGaWxlID0gX19GSUxFX187Ci0gICAgbUFsbG9jTGluZSA9IF9fTElORV9fOwotfQotCi1TaW1wbGVNZXNoOjp+U2ltcGxlTWVzaCgpCi17Ci0gICAgZGVsZXRlW10gbVZlcnRleFR5cGVzOwotICAgIGRlbGV0ZVtdIG1WZXJ0ZXhCdWZmZXJzOwotfQotCi12b2lkIFNpbXBsZU1lc2g6OnJlbmRlcihDb250ZXh0ICpyc2MpIGNvbnN0Ci17Ci0gICAgaWYgKG1QcmltaXRpdmVUeXBlLmdldCgpKSB7Ci0gICAgICAgIHJlbmRlclJhbmdlKHJzYywgMCwgbVByaW1pdGl2ZVR5cGUtPmdldERpbVgoKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAobUluZGV4VHlwZS5nZXQoKSkgewotICAgICAgICByZW5kZXJSYW5nZShyc2MsIDAsIG1JbmRleFR5cGUtPmdldERpbVgoKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICByZW5kZXJSYW5nZShyc2MsIDAsIG1WZXJ0ZXhUeXBlc1swXS0+Z2V0RGltWCgpKTsKLX0KLQotdm9pZCBTaW1wbGVNZXNoOjpyZW5kZXJSYW5nZShDb250ZXh0ICpyc2MsIHVpbnQzMl90IHN0YXJ0LCB1aW50MzJfdCBsZW4pIGNvbnN0Ci17Ci0gICAgaWYgKGxlbiA8IDEpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHJzYy0+Y2hlY2tFcnJvcigiU2ltcGxlTWVzaDo6cmVuZGVyUmFuZ2UgMSIpOwotICAgIFZlcnRleEFycmF5IHZhOwotICAgIGlmIChyc2MtPmNoZWNrVmVyc2lvbjJfMCgpKSB7Ci0gICAgICAgIGZvciAodWludDMyX3QgY3Q9MDsgY3QgPCBtVmVydGV4VHlwZUNvdW50OyBjdCsrKSB7Ci0gICAgICAgICAgICBtVmVydGV4QnVmZmVyc1tjdF0tPnVwbG9hZENoZWNrKHJzYyk7Ci0gICAgICAgICAgICB2YS5zZXRBY3RpdmVCdWZmZXIobVZlcnRleEJ1ZmZlcnNbY3RdLT5nZXRCdWZmZXJPYmplY3RJRCgpKTsKLSAgICAgICAgICAgIG1WZXJ0ZXhUeXBlc1tjdF0tPmVuYWJsZUdMVmVydGV4QnVmZmVyMigmdmEpOwotICAgICAgICB9Ci0gICAgICAgIHZhLnNldHVwR0wyKHJzYywgJnJzYy0+bVN0YXRlVmVydGV4QXJyYXksICZyc2MtPm1TaGFkZXJDYWNoZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZm9yICh1aW50MzJfdCBjdD0wOyBjdCA8IG1WZXJ0ZXhUeXBlQ291bnQ7IGN0KyspIHsKLSAgICAgICAgICAgIG1WZXJ0ZXhCdWZmZXJzW2N0XS0+dXBsb2FkQ2hlY2socnNjKTsKLSAgICAgICAgICAgIHZhLnNldEFjdGl2ZUJ1ZmZlcihtVmVydGV4QnVmZmVyc1tjdF0tPmdldEJ1ZmZlck9iamVjdElEKCkpOwotICAgICAgICAgICAgbVZlcnRleFR5cGVzW2N0XS0+ZW5hYmxlR0xWZXJ0ZXhCdWZmZXIoJnZhKTsKLSAgICAgICAgfQotICAgICAgICB2YS5zZXR1cEdMKHJzYywgMCk7Ci0gICAgfQotCi0gICAgcnNjLT5jaGVja0Vycm9yKCJTaW1wbGVNZXNoOjpyZW5kZXJSYW5nZSAyIik7Ci0gICAgaWYgKG1JbmRleFR5cGUuZ2V0KCkpIHsKLSAgICAgICAgbUluZGV4QnVmZmVyLT51cGxvYWRDaGVjayhyc2MpOwotICAgICAgICBnbEJpbmRCdWZmZXIoR0xfRUxFTUVOVF9BUlJBWV9CVUZGRVIsIG1JbmRleEJ1ZmZlci0+Z2V0QnVmZmVyT2JqZWN0SUQoKSk7Ci0gICAgICAgIGdsRHJhd0VsZW1lbnRzKG1HTFByaW1pdGl2ZSwgbGVuLCBHTF9VTlNJR05FRF9TSE9SVCwgKHVpbnQxNl90ICopKHN0YXJ0ICogMikpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGdsRHJhd0FycmF5cyhtR0xQcmltaXRpdmUsIHN0YXJ0LCBsZW4pOwotICAgIH0KLQotICAgIHJzYy0+Y2hlY2tFcnJvcigiU2ltcGxlTWVzaDo6cmVuZGVyUmFuZ2UiKTsKLX0KLQotdm9pZCBTaW1wbGVNZXNoOjp1cGxvYWRBbGwoQ29udGV4dCAqcnNjKQotewotICAgIGZvciAodWludDMyX3QgY3Q9MDsgY3QgPCBtVmVydGV4VHlwZUNvdW50OyBjdCsrKSB7Ci0gICAgICAgIGlmIChtVmVydGV4QnVmZmVyc1tjdF0uZ2V0KCkpIHsKLSAgICAgICAgICAgIG1WZXJ0ZXhCdWZmZXJzW2N0XS0+ZGVmZXJlZFVwbG9hZFRvQnVmZmVyT2JqZWN0KHJzYyk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKG1JbmRleEJ1ZmZlci5nZXQoKSkgewotICAgICAgICBtSW5kZXhCdWZmZXItPmRlZmVyZWRVcGxvYWRUb0J1ZmZlck9iamVjdChyc2MpOwotICAgIH0KLSAgICBpZiAobVByaW1pdGl2ZUJ1ZmZlci5nZXQoKSkgewotICAgICAgICBtUHJpbWl0aXZlQnVmZmVyLT5kZWZlcmVkVXBsb2FkVG9CdWZmZXJPYmplY3QocnNjKTsKLSAgICB9Ci0gICAgcnNjLT5jaGVja0Vycm9yKCJTaW1wbGVNZXNoOjp1cGxvYWRBbGwiKTsKLX0KLQotCi1TaW1wbGVNZXNoQ29udGV4dDo6U2ltcGxlTWVzaENvbnRleHQoKQotewotfQotCi1TaW1wbGVNZXNoQ29udGV4dDo6flNpbXBsZU1lc2hDb250ZXh0KCkKLXsKLX0KLQotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgcmVuZGVyc2NyaXB0IHsKLQotCi1Sc1NpbXBsZU1lc2ggcnNpX1NpbXBsZU1lc2hDcmVhdGUoQ29udGV4dCAqcnNjLCBSc1R5cGUgcHJpbSwgUnNUeXBlIGlkeCwgUnNUeXBlICp2dHgsIHVpbnQzMl90IHZ0eENvdW50LCB1aW50MzJfdCBwcmltVHlwZSkKLXsKLSAgICBTaW1wbGVNZXNoICpzbSA9IG5ldyBTaW1wbGVNZXNoKHJzYyk7Ci0gICAgc20tPmluY1VzZXJSZWYoKTsKLQotICAgIHNtLT5tSW5kZXhUeXBlLnNldCgoY29uc3QgVHlwZSAqKWlkeCk7Ci0gICAgc20tPm1QcmltaXRpdmVUeXBlLnNldCgoY29uc3QgVHlwZSAqKXByaW0pOwotCi0gICAgc20tPm1WZXJ0ZXhUeXBlQ291bnQgPSB2dHhDb3VudDsKLSAgICBzbS0+bVZlcnRleFR5cGVzID0gbmV3IE9iamVjdEJhc2VSZWY8Y29uc3QgVHlwZT5bdnR4Q291bnRdOwotICAgIHNtLT5tVmVydGV4QnVmZmVycyA9IG5ldyBPYmplY3RCYXNlUmVmPEFsbG9jYXRpb24+W3Z0eENvdW50XTsKLSAgICBmb3IgKHVpbnQzMl90IGN0PTA7IGN0IDwgdnR4Q291bnQ7IGN0KyspIHsKLSAgICAgICAgc20tPm1WZXJ0ZXhUeXBlc1tjdF0uc2V0KChjb25zdCBUeXBlICopdnR4W2N0XSk7Ci0gICAgfQotCi0gICAgc20tPm1QcmltaXRpdmUgPSAoUnNQcmltaXRpdmUpcHJpbVR5cGU7Ci0gICAgc3dpdGNoKHNtLT5tUHJpbWl0aXZlKSB7Ci0gICAgY2FzZSBSU19QUklNSVRJVkVfUE9JTlQ6ICAgICAgICAgIHNtLT5tR0xQcmltaXRpdmUgPSBHTF9QT0lOVFM7IGJyZWFrOwotICAgIGNhc2UgUlNfUFJJTUlUSVZFX0xJTkU6ICAgICAgICAgICBzbS0+bUdMUHJpbWl0aXZlID0gR0xfTElORVM7IGJyZWFrOwotICAgIGNhc2UgUlNfUFJJTUlUSVZFX0xJTkVfU1RSSVA6ICAgICBzbS0+bUdMUHJpbWl0aXZlID0gR0xfTElORV9TVFJJUDsgYnJlYWs7Ci0gICAgY2FzZSBSU19QUklNSVRJVkVfVFJJQU5HTEU6ICAgICAgIHNtLT5tR0xQcmltaXRpdmUgPSBHTF9UUklBTkdMRVM7IGJyZWFrOwotICAgIGNhc2UgUlNfUFJJTUlUSVZFX1RSSUFOR0xFX1NUUklQOiBzbS0+bUdMUHJpbWl0aXZlID0gR0xfVFJJQU5HTEVfU1RSSVA7IGJyZWFrOwotICAgIGNhc2UgUlNfUFJJTUlUSVZFX1RSSUFOR0xFX0ZBTjogICBzbS0+bUdMUHJpbWl0aXZlID0gR0xfVFJJQU5HTEVfRkFOOyBicmVhazsKLSAgICB9Ci0gICAgcmV0dXJuIHNtOwotfQotCi12b2lkIHJzaV9TaW1wbGVNZXNoQmluZFZlcnRleChDb250ZXh0ICpyc2MsIFJzU2ltcGxlTWVzaCBtdiwgUnNBbGxvY2F0aW9uIHZhLCB1aW50MzJfdCBzbG90KQotewotICAgIFNpbXBsZU1lc2ggKnNtID0gc3RhdGljX2Nhc3Q8U2ltcGxlTWVzaCAqPihtdik7Ci0gICAgcnNBc3NlcnQoc2xvdCA8IHNtLT5tVmVydGV4VHlwZUNvdW50KTsKLQotICAgIHNtLT5tVmVydGV4QnVmZmVyc1tzbG90XS5zZXQoKEFsbG9jYXRpb24gKil2YSk7Ci19Ci0KLXZvaWQgcnNpX1NpbXBsZU1lc2hCaW5kSW5kZXgoQ29udGV4dCAqcnNjLCBSc1NpbXBsZU1lc2ggbXYsIFJzQWxsb2NhdGlvbiB2YSkKLXsKLSAgICBTaW1wbGVNZXNoICpzbSA9IHN0YXRpY19jYXN0PFNpbXBsZU1lc2ggKj4obXYpOwotICAgIHNtLT5tSW5kZXhCdWZmZXIuc2V0KChBbGxvY2F0aW9uICopdmEpOwotfQotCi12b2lkIHJzaV9TaW1wbGVNZXNoQmluZFByaW1pdGl2ZShDb250ZXh0ICpyc2MsIFJzU2ltcGxlTWVzaCBtdiwgUnNBbGxvY2F0aW9uIHZhKQotewotICAgIFNpbXBsZU1lc2ggKnNtID0gc3RhdGljX2Nhc3Q8U2ltcGxlTWVzaCAqPihtdik7Ci0gICAgc20tPm1QcmltaXRpdmVCdWZmZXIuc2V0KChBbGxvY2F0aW9uICopdmEpOwotfQotCi0KLQotCi19fQotCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzU2ltcGxlTWVzaC5oIGIvbGlicy9ycy9yc1NpbXBsZU1lc2guaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRlZmJkYS4uMDAwMDAwMAotLS0gYS9saWJzL3JzL3JzU2ltcGxlTWVzaC5oCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9SU19TSU1QTEVfTUVTSF9ICi0jZGVmaW5lIEFORFJPSURfUlNfU0lNUExFX01FU0hfSAotCi0KLSNpbmNsdWRlICJSZW5kZXJTY3JpcHQuaCIKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgcmVuZGVyc2NyaXB0IHsKLQotCi0vLyBBbiBlbGVtZW50IGlzIGEgZ3JvdXAgb2YgQ29tcG9uZW50cyB0aGF0IG9jY3VwaWVzIG9uZSBjZWxsIGluIGEgc3RydWN0dXJlLgotY2xhc3MgU2ltcGxlTWVzaCA6IHB1YmxpYyBPYmplY3RCYXNlCi17Ci1wdWJsaWM6Ci0gICAgU2ltcGxlTWVzaChDb250ZXh0ICopOwotICAgIH5TaW1wbGVNZXNoKCk7Ci0KLSAgICBPYmplY3RCYXNlUmVmPGNvbnN0IFR5cGU+IG1JbmRleFR5cGU7Ci0gICAgT2JqZWN0QmFzZVJlZjxjb25zdCBUeXBlPiBtUHJpbWl0aXZlVHlwZTsKLSAgICBPYmplY3RCYXNlUmVmPGNvbnN0IFR5cGU+ICptVmVydGV4VHlwZXM7Ci0gICAgdWludDMyX3QgbVZlcnRleFR5cGVDb3VudDsKLQotICAgIE9iamVjdEJhc2VSZWY8QWxsb2NhdGlvbj4gbUluZGV4QnVmZmVyOwotICAgIE9iamVjdEJhc2VSZWY8QWxsb2NhdGlvbj4gbVByaW1pdGl2ZUJ1ZmZlcjsKLSAgICBPYmplY3RCYXNlUmVmPEFsbG9jYXRpb24+ICptVmVydGV4QnVmZmVyczsKLQotICAgIFJzUHJpbWl0aXZlIG1QcmltaXRpdmU7Ci0gICAgdWludDMyX3QgbUdMUHJpbWl0aXZlOwotCi0KLSAgICB2b2lkIHJlbmRlcihDb250ZXh0ICopIGNvbnN0OwotICAgIHZvaWQgcmVuZGVyUmFuZ2UoQ29udGV4dCAqLCB1aW50MzJfdCBzdGFydCwgdWludDMyX3QgbGVuKSBjb25zdDsKLSAgICB2b2lkIHVwbG9hZEFsbChDb250ZXh0ICopOwotCi0KLXByb3RlY3RlZDoKLX07Ci0KLWNsYXNzIFNpbXBsZU1lc2hDb250ZXh0Ci17Ci1wdWJsaWM6Ci0gICAgU2ltcGxlTWVzaENvbnRleHQoKTsKLSAgICB+U2ltcGxlTWVzaENvbnRleHQoKTsKLQotCi19OwotCi0KLX0KLX0KLSNlbmRpZiAvL0FORFJPSURfUlNfU0lNUExFX01FU0hfSAotCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzU3RyZWFtLmNwcCBiL2xpYnMvcnMvcnNTdHJlYW0uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4MjQxZmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL3JzU3RyZWFtLmNwcApAQCAtMCwwICsxLDEzMSBAQAorCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1JTX0JVSUxEX0ZPUl9IT1NUCisjaW5jbHVkZSAicnNDb250ZXh0LmgiCisjZWxzZQorI2luY2x1ZGUgInJzQ29udGV4dEhvc3RTdHViLmgiCisjZW5kaWYKKworI2luY2x1ZGUgInJzU3RyZWFtLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OnJlbmRlcnNjcmlwdDsKKworSVN0cmVhbTo6SVN0cmVhbShjb25zdCB1aW50OF90ICpidWYsIGJvb2wgdXNlNjQpCit7CisgICAgbURhdGEgPSBidWY7CisgICAgbVBvcyA9IDA7CisgICAgbVVzZTY0ID0gdXNlNjQ7Cit9CisKK3ZvaWQgSVN0cmVhbTo6bG9hZEJ5dGVBcnJheSh2b2lkICpkZXN0LCBzaXplX3QgbnVtQnl0ZXMpCit7CisgICAgbWVtY3B5KGRlc3QsIG1EYXRhICsgbVBvcywgbnVtQnl0ZXMpOworICAgIG1Qb3MgKz0gbnVtQnl0ZXM7Cit9CisKK3VpbnQ2NF90IElTdHJlYW06OmxvYWRPZmZzZXQoKQoreworICAgIHVpbnQ2NF90IHRtcDsKKyAgICBpZiAobVVzZTY0KSB7CisgICAgICAgIG1Qb3MgPSAobVBvcyArIDcpICYgKH43KTsKKyAgICAgICAgdG1wID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50NjRfdCAqPigmbURhdGFbbVBvc10pWzBdOworICAgICAgICBtUG9zICs9IHNpemVvZih1aW50NjRfdCk7CisgICAgICAgIHJldHVybiB0bXA7CisgICAgfQorICAgIHJldHVybiBsb2FkVTMyKCk7Cit9CisKK3ZvaWQgSVN0cmVhbTo6bG9hZFN0cmluZyhTdHJpbmc4ICpzKQoreworICAgIHVpbnQzMl90IGxlbiA9IGxvYWRVMzIoKTsKKyAgICBzLT5zZXRUbygoY29uc3QgY2hhciAqKSZtRGF0YVttUG9zXSwgbGVuKTsKKyAgICBtUG9zICs9IGxlbjsKK30KKworCisvLyBPdXRwdXQgc3RyZWFtIGltcGxlbWVudGF0aW9uCisKK09TdHJlYW06Ok9TdHJlYW0odWludDY0X3QgbGVuLCBib29sIHVzZTY0KQoreworICAgIG1EYXRhID0gKHVpbnQ4X3QqKW1hbGxvYyhsZW4pOworICAgIG1MZW5ndGggPSBsZW47CisgICAgbVBvcyA9IDA7CisgICAgbVVzZTY0ID0gdXNlNjQ7Cit9CisKK09TdHJlYW06On5PU3RyZWFtKCkKK3sKKyAgICBmcmVlKG1EYXRhKTsKK30KKwordm9pZCBPU3RyZWFtOjphZGRCeXRlQXJyYXkoY29uc3Qgdm9pZCAqc3JjLCBzaXplX3QgbnVtQnl0ZXMpCit7CisgICAgLy8gV2UgbmVlZCB0byBwb3RlbnRpYWxseSBncm93IG1vcmUgdGhhbiBvbmNlIGlmIHRoZSBudW1iZXIgb2YgYnllcyB3ZSB3cml0ZSBpcyBzdWJzdGFudGlhbAorICAgIHdoaWxlKG1Qb3MgKyBudW1CeXRlcyA+PSBtTGVuZ3RoKSB7CisgICAgICAgIGdyb3dTaXplKCk7CisgICAgfQorICAgIG1lbWNweShtRGF0YSArIG1Qb3MsIHNyYywgbnVtQnl0ZXMpOworICAgIG1Qb3MgKz0gbnVtQnl0ZXM7Cit9CisKK3ZvaWQgT1N0cmVhbTo6YWRkT2Zmc2V0KHVpbnQ2NF90IHYpCit7CisgICAgaWYgKG1Vc2U2NCkgeworICAgICAgICBtUG9zID0gKG1Qb3MgKyA3KSAmICh+Nyk7CisgICAgICAgIGlmKG1Qb3MgKyBzaXplb2YodikgPj0gbUxlbmd0aCkgeworICAgICAgICAgICAgZ3Jvd1NpemUoKTsKKyAgICAgICAgfQorICAgICAgICBtRGF0YVttUG9zKytdID0gKHVpbnQ4X3QpKHYgJiAweGZmKTsKKyAgICAgICAgbURhdGFbbVBvcysrXSA9ICh1aW50OF90KSgodiA+PiA4KSAmIDB4ZmYpOworICAgICAgICBtRGF0YVttUG9zKytdID0gKHVpbnQ4X3QpKCh2ID4+IDE2KSAmIDB4ZmYpOworICAgICAgICBtRGF0YVttUG9zKytdID0gKHVpbnQ4X3QpKCh2ID4+IDI0KSAmIDB4ZmYpOworICAgICAgICBtRGF0YVttUG9zKytdID0gKHVpbnQ4X3QpKCh2ID4+IDMyKSAmIDB4ZmYpOworICAgICAgICBtRGF0YVttUG9zKytdID0gKHVpbnQ4X3QpKCh2ID4+IDQwKSAmIDB4ZmYpOworICAgICAgICBtRGF0YVttUG9zKytdID0gKHVpbnQ4X3QpKCh2ID4+IDQ4KSAmIDB4ZmYpOworICAgICAgICBtRGF0YVttUG9zKytdID0gKHVpbnQ4X3QpKCh2ID4+IDU2KSAmIDB4ZmYpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgYWRkVTMyKHYpOworICAgIH0KK30KKwordm9pZCBPU3RyZWFtOjphZGRTdHJpbmcoU3RyaW5nOCAqcykKK3sKKyAgICB1aW50MzJfdCBsZW4gPSBzLT5zaXplKCk7CisgICAgYWRkVTMyKGxlbik7CisgICAgaWYobVBvcyArIGxlbipzaXplb2YoY2hhcikgPj0gbUxlbmd0aCkgeworICAgICAgICBncm93U2l6ZSgpOworICAgIH0KKyAgICBjaGFyICpzdHJpbmdEYXRhID0gcmVpbnRlcnByZXRfY2FzdDxjaGFyICo+KCZtRGF0YVttUG9zXSk7CisgICAgZm9yKHVpbnQzMl90IGkgPSAwOyBpIDwgbGVuOyBpICsrKSB7CisgICAgICAgIHN0cmluZ0RhdGFbaV0gPSBzLT5zdHJpbmcoKVtpXTsKKyAgICB9CisgICAgbVBvcyArPSBsZW4qc2l6ZW9mKGNoYXIpOworfQorCit2b2lkIE9TdHJlYW06Omdyb3dTaXplKCkKK3sKKyAgICB1aW50OF90ICpuZXdEYXRhID0gKHVpbnQ4X3QqKW1hbGxvYyhtTGVuZ3RoKjIpOworICAgIG1lbWNweShuZXdEYXRhLCBtRGF0YSwgbUxlbmd0aCpzaXplb2YodWludDhfdCkpOworICAgIG1MZW5ndGggPSBtTGVuZ3RoICogMjsKKyAgICBmcmVlKG1EYXRhKTsKKyAgICBtRGF0YSA9IG5ld0RhdGE7Cit9CisKKwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc1N0cmVhbS5oIGIvbGlicy9ycy9yc1N0cmVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0MDFjZDEyCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9yc1N0cmVhbS5oCkBAIC0wLDAgKzEsMTYzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1JTX1NUUkVBTV9ICisjZGVmaW5lIEFORFJPSURfUlNfU1RSRUFNX0gKKworI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSByZW5kZXJzY3JpcHQgeworCitjbGFzcyBJU3RyZWFtCit7CitwdWJsaWM6CisgICAgSVN0cmVhbShjb25zdCB1aW50OF90ICosIGJvb2wgdXNlNjQpOworCisgICAgZmxvYXQgbG9hZEYoKSB7CisgICAgICAgIG1Qb3MgPSAobVBvcyArIDMpICYgKH4zKTsKKyAgICAgICAgZmxvYXQgdG1wID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBmbG9hdCAqPigmbURhdGFbbVBvc10pWzBdOworICAgICAgICBtUG9zICs9IHNpemVvZihmbG9hdCk7CisgICAgICAgIHJldHVybiB0bXA7CisgICAgfQorICAgIGludDMyX3QgbG9hZEkzMigpIHsKKyAgICAgICAgbVBvcyA9IChtUG9zICsgMykgJiAofjMpOworICAgICAgICBpbnQzMl90IHRtcCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgaW50MzJfdCAqPigmbURhdGFbbVBvc10pWzBdOworICAgICAgICBtUG9zICs9IHNpemVvZihpbnQzMl90KTsKKyAgICAgICAgcmV0dXJuIHRtcDsKKyAgICB9CisgICAgdWludDMyX3QgbG9hZFUzMigpIHsKKyAgICAgICAgbVBvcyA9IChtUG9zICsgMykgJiAofjMpOworICAgICAgICB1aW50MzJfdCB0bXAgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQzMl90ICo+KCZtRGF0YVttUG9zXSlbMF07CisgICAgICAgIG1Qb3MgKz0gc2l6ZW9mKHVpbnQzMl90KTsKKyAgICAgICAgcmV0dXJuIHRtcDsKKyAgICB9CisgICAgdWludDE2X3QgbG9hZFUxNigpIHsKKyAgICAgICAgbVBvcyA9IChtUG9zICsgMSkgJiAofjEpOworICAgICAgICB1aW50MTZfdCB0bXAgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQxNl90ICo+KCZtRGF0YVttUG9zXSlbMF07CisgICAgICAgIG1Qb3MgKz0gc2l6ZW9mKHVpbnQxNl90KTsKKyAgICAgICAgcmV0dXJuIHRtcDsKKyAgICB9CisgICAgaW5saW5lIHVpbnQ4X3QgbG9hZFU4KCkgeworICAgICAgICB1aW50OF90IHRtcCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCAqPigmbURhdGFbbVBvc10pWzBdOworICAgICAgICBtUG9zICs9IHNpemVvZih1aW50OF90KTsKKyAgICAgICAgcmV0dXJuIHRtcDsKKyAgICB9CisgICAgdm9pZCBsb2FkQnl0ZUFycmF5KHZvaWQgKmRlc3QsIHNpemVfdCBudW1CeXRlcyk7CisgICAgdWludDY0X3QgbG9hZE9mZnNldCgpOworICAgIHZvaWQgbG9hZFN0cmluZyhTdHJpbmc4ICpzKTsKKyAgICB1aW50NjRfdCBnZXRQb3MoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtUG9zOworICAgIH0KKyAgICB2b2lkIHJlc2V0KHVpbnQ2NF90IHBvcykgeworICAgICAgICBtUG9zID0gcG9zOworICAgIH0KKyAgICB2b2lkIHJlc2V0KCkgeworICAgICAgICBtUG9zID0gMDsKKyAgICB9CisgICAgCisgICAgY29uc3QgdWludDhfdCAqIGdldFB0cigpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1EYXRhOworICAgIH0KK3Byb3RlY3RlZDoKKyAgICBjb25zdCB1aW50OF90ICogbURhdGE7CisgICAgdWludDY0X3QgbVBvczsKKyAgICBib29sIG1Vc2U2NDsKK307CisKK2NsYXNzIE9TdHJlYW0KK3sKK3B1YmxpYzoKKyAgICBPU3RyZWFtKHVpbnQ2NF90IGxlbmd0aCwgYm9vbCB1c2U2NCk7CisgICAgfk9TdHJlYW0oKTsKKyAgICAKKyAgICB2b2lkIGFsaWduKHVpbnQzMl90IGJ5dGVzKSB7CisgICAgICAgIG1Qb3MgPSAobVBvcyArIChieXRlcyAtIDEpKSAmICh+KGJ5dGVzIC0gMSkpOworICAgICAgICBpZihtUG9zID49IG1MZW5ndGgpIHsKKyAgICAgICAgICAgIGdyb3dTaXplKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgdm9pZCBhZGRGKGZsb2F0IHYpIHsKKyAgICAgICAgdWludDMyX3QgdWludFYgPSAqcmVpbnRlcnByZXRfY2FzdDx1aW50MzJfdCo+ICgmdik7CisgICAgICAgIGFkZFUzMih1aW50Vik7CisgICAgfQorICAgIHZvaWQgYWRkSTMyKGludDMyX3QgdikgeworICAgICAgICBtUG9zID0gKG1Qb3MgKyAzKSAmICh+Myk7CisgICAgICAgIGlmKG1Qb3MgKyBzaXplb2YodikgPj0gbUxlbmd0aCkgeworICAgICAgICAgICAgZ3Jvd1NpemUoKTsKKyAgICAgICAgfQorICAgICAgICBtRGF0YVttUG9zKytdID0gKHVpbnQ4X3QpKHYgJiAweGZmKTsKKyAgICAgICAgbURhdGFbbVBvcysrXSA9ICh1aW50OF90KSgodiA+PiA4KSAmIDB4ZmYpOworICAgICAgICBtRGF0YVttUG9zKytdID0gKHVpbnQ4X3QpKCh2ID4+IDE2KSAmIDB4ZmYpOworICAgICAgICBtRGF0YVttUG9zKytdID0gKHVpbnQ4X3QpKCh2ID4+IDI0KSAmIDB4ZmYpOworICAgIH0KKyAgICB2b2lkIGFkZFUzMih1aW50MzJfdCB2KSB7CisgICAgICAgIG1Qb3MgPSAobVBvcyArIDMpICYgKH4zKTsKKyAgICAgICAgaWYobVBvcyArIHNpemVvZih2KSA+PSBtTGVuZ3RoKSB7CisgICAgICAgICAgICBncm93U2l6ZSgpOworICAgICAgICB9CisgICAgICAgIG1EYXRhW21Qb3MrK10gPSAodWludDhfdCkodiAmIDB4ZmYpOworICAgICAgICBtRGF0YVttUG9zKytdID0gKHVpbnQ4X3QpKCh2ID4+IDgpICYgMHhmZik7CisgICAgICAgIG1EYXRhW21Qb3MrK10gPSAodWludDhfdCkoKHYgPj4gMTYpICYgMHhmZik7CisgICAgICAgIG1EYXRhW21Qb3MrK10gPSAodWludDhfdCkoKHYgPj4gMjQpICYgMHhmZik7CisgICAgfQorICAgIHZvaWQgYWRkVTE2KHVpbnQxNl90IHYpIHsKKyAgICAgICAgbVBvcyA9IChtUG9zICsgMSkgJiAofjEpOworICAgICAgICBpZihtUG9zICsgc2l6ZW9mKHYpID49IG1MZW5ndGgpIHsKKyAgICAgICAgICAgIGdyb3dTaXplKCk7CisgICAgICAgIH0KKyAgICAgICAgbURhdGFbbVBvcysrXSA9ICh1aW50OF90KSh2ICYgMHhmZik7CisgICAgICAgIG1EYXRhW21Qb3MrK10gPSAodWludDhfdCkodiA+PiA4KTsKKyAgICB9CisgICAgaW5saW5lIHZvaWQgYWRkVTgodWludDhfdCB2KSB7CisgICAgICAgIGlmKG1Qb3MgKyAxID49IG1MZW5ndGgpIHsKKyAgICAgICAgICAgIGdyb3dTaXplKCk7CisgICAgICAgIH0KKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50OF90ICo+KCZtRGF0YVttUG9zXSlbMF0gPSB2OworICAgICAgICBtUG9zICsrOworICAgIH0KKyAgICB2b2lkIGFkZEJ5dGVBcnJheShjb25zdCB2b2lkICpzcmMsIHNpemVfdCBudW1CeXRlcyk7CisgICAgdm9pZCBhZGRPZmZzZXQodWludDY0X3Qgdik7CisgICAgdm9pZCBhZGRTdHJpbmcoU3RyaW5nOCAqcyk7CisgICAgdWludDY0X3QgZ2V0UG9zKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVBvczsKKyAgICB9CisgICAgdm9pZCByZXNldCh1aW50NjRfdCBwb3MpIHsKKyAgICAgICAgbVBvcyA9IHBvczsKKyAgICB9CisgICAgdm9pZCByZXNldCgpIHsKKyAgICAgICAgbVBvcyA9IDA7CisgICAgfQorICAgIGNvbnN0IHVpbnQ4X3QgKiBnZXRQdHIoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtRGF0YTsKKyAgICB9Citwcm90ZWN0ZWQ6CisgICAgdm9pZCBncm93U2l6ZSgpOworICAgIHVpbnQ4X3QgKiBtRGF0YTsKKyAgICB1aW50NjRfdCBtTGVuZ3RoOworICAgIHVpbnQ2NF90IG1Qb3M7CisgICAgYm9vbCBtVXNlNjQ7Cit9OworICAgIAorCit9IC8vIHJlbmRlcnNjcmlwdAorfSAvLyBhbmRyb2lkCisjZW5kaWYgLy9BTkRST0lEX1JTX1NUUkVBTV9ICisKKwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc1R5cGUuY3BwIGIvbGlicy9ycy9yc1R5cGUuY3BwCmluZGV4IGMwOWU5NzkuLjc5Y2ZkNDEgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNUeXBlLmNwcAorKysgYi9saWJzL3JzL3JzVHlwZS5jcHAKQEAgLTE0LDggKzE0LDEzIEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisjaWZuZGVmIEFORFJPSURfUlNfQlVJTERfRk9SX0hPU1QKICNpbmNsdWRlICJyc0NvbnRleHQuaCIKICNpbmNsdWRlIDxHTEVTL2dsLmg+CisjZWxzZQorI2luY2x1ZGUgInJzQ29udGV4dEhvc3RTdHViLmgiCisjaW5jbHVkZSA8T3BlbkdML2dsLmg+CisjZW5kaWYKIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6cmVuZGVyc2NyaXB0OwpAQCAtODQsNyArODksOSBAQAogICAgICAgICBtTE9EQ291bnQgPSAxOwogICAgIH0KICAgICBpZiAobUxPRENvdW50ICE9IG9sZExPRENvdW50KSB7Ci0gICAgICAgIGRlbGV0ZSBbXSBtTE9EczsKKyAgICAgICAgaWYobUxPRHMpeworICAgICAgICAgICAgZGVsZXRlIFtdIG1MT0RzOworICAgICAgICB9CiAgICAgICAgIG1MT0RzID0gbmV3IExPRFttTE9EQ291bnRdOwogICAgIH0KIApAQCAtMTM4LDEzNiArMTQ1LDMxIEBACiAKIHZvaWQgVHlwZTo6bWFrZUdMQ29tcG9uZW50cygpCiB7CisgICAgaWYoZ2V0RWxlbWVudCgpLT5nZXRGaWVsZENvdW50KCkgPj0gUlNfTUFYX0FUVFJJQlMpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKwogICAgIHVpbnQzMl90IHVzZXJOdW0gPSAwOwogCiAgICAgZm9yICh1aW50MzJfdCBjdD0wOyBjdCA8IGdldEVsZW1lbnQoKS0+Z2V0RmllbGRDb3VudCgpOyBjdCsrKSB7CiAgICAgICAgIGNvbnN0IENvbXBvbmVudCAmYyA9IGdldEVsZW1lbnQoKS0+Z2V0RmllbGQoY3QpLT5nZXRDb21wb25lbnQoKTsKIAotICAgICAgICBzd2l0Y2goYy5nZXRLaW5kKCkpIHsKLSAgICAgICAgY2FzZSBSU19LSU5EX1VTRVI6Ci0gICAgICAgICAgICBtR0wubVVzZXJbdXNlck51bV0uc2l6ZSA9IGMuZ2V0VmVjdG9yU2l6ZSgpOwotICAgICAgICAgICAgbUdMLm1Vc2VyW3VzZXJOdW1dLm9mZnNldCA9IG1FbGVtZW50LT5nZXRGaWVsZE9mZnNldEJ5dGVzKGN0KTsKLSAgICAgICAgICAgIG1HTC5tVXNlclt1c2VyTnVtXS50eXBlID0gYy5nZXRHTFR5cGUoKTsKLSAgICAgICAgICAgIG1HTC5tVXNlclt1c2VyTnVtXS5ub3JtYWxpemVkID0gYy5nZXRUeXBlKCkgIT0gUlNfVFlQRV9GTE9BVF8zMjsvL2MuZ2V0SXNOb3JtYWxpemVkKCk7Ci0gICAgICAgICAgICBtR0wubVVzZXJbdXNlck51bV0ubmFtZS5zZXRUbyhnZXRFbGVtZW50KCktPmdldEZpZWxkTmFtZShjdCkpOwotICAgICAgICAgICAgdXNlck51bSArKzsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgUlNfS0lORF9QT1NJVElPTjoKLSAgICAgICAgICAgIHJzQXNzZXJ0KG1HTC5tVnR4LnNpemUgPT0gMCk7Ci0gICAgICAgICAgICBtR0wubVZ0eC5zaXplID0gYy5nZXRWZWN0b3JTaXplKCk7Ci0gICAgICAgICAgICBtR0wubVZ0eC5vZmZzZXQgPSBtRWxlbWVudC0+Z2V0RmllbGRPZmZzZXRCeXRlcyhjdCk7Ci0gICAgICAgICAgICBtR0wubVZ0eC50eXBlID0gYy5nZXRHTFR5cGUoKTsKLSAgICAgICAgICAgIG1HTC5tVnR4Lm5vcm1hbGl6ZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIG1HTC5tVnR4Lm5hbWUuc2V0VG8oIlBvc2l0aW9uIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIFJTX0tJTkRfQ09MT1I6Ci0gICAgICAgICAgICByc0Fzc2VydChtR0wubUNvbG9yLnNpemUgPT0gMCk7Ci0gICAgICAgICAgICBtR0wubUNvbG9yLnNpemUgPSBjLmdldFZlY3RvclNpemUoKTsKLSAgICAgICAgICAgIG1HTC5tQ29sb3Iub2Zmc2V0ID0gbUVsZW1lbnQtPmdldEZpZWxkT2Zmc2V0Qnl0ZXMoY3QpOwotICAgICAgICAgICAgbUdMLm1Db2xvci50eXBlID0gYy5nZXRHTFR5cGUoKTsKLSAgICAgICAgICAgIG1HTC5tQ29sb3Iubm9ybWFsaXplZCA9IGMuZ2V0VHlwZSgpICE9IFJTX1RZUEVfRkxPQVRfMzI7Ci0gICAgICAgICAgICBtR0wubUNvbG9yLm5hbWUuc2V0VG8oIkNvbG9yIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIFJTX0tJTkRfTk9STUFMOgotICAgICAgICAgICAgcnNBc3NlcnQobUdMLm1Ob3JtLnNpemUgPT0gMCk7Ci0gICAgICAgICAgICBtR0wubU5vcm0uc2l6ZSA9IGMuZ2V0VmVjdG9yU2l6ZSgpOwotICAgICAgICAgICAgbUdMLm1Ob3JtLm9mZnNldCA9IG1FbGVtZW50LT5nZXRGaWVsZE9mZnNldEJ5dGVzKGN0KTsKLSAgICAgICAgICAgIG1HTC5tTm9ybS50eXBlID0gYy5nZXRHTFR5cGUoKTsKLSAgICAgICAgICAgIG1HTC5tTm9ybS5ub3JtYWxpemVkID0gZmFsc2U7Ci0gICAgICAgICAgICBtR0wubU5vcm0ubmFtZS5zZXRUbygiTm9ybWFsIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIFJTX0tJTkRfVEVYVFVSRToKLSAgICAgICAgICAgIHJzQXNzZXJ0KG1HTC5tVGV4LnNpemUgPT0gMCk7Ci0gICAgICAgICAgICBtR0wubVRleC5zaXplID0gYy5nZXRWZWN0b3JTaXplKCk7Ci0gICAgICAgICAgICBtR0wubVRleC5vZmZzZXQgPSBtRWxlbWVudC0+Z2V0RmllbGRPZmZzZXRCeXRlcyhjdCk7Ci0gICAgICAgICAgICBtR0wubVRleC50eXBlID0gYy5nZXRHTFR5cGUoKTsKLSAgICAgICAgICAgIG1HTC5tVGV4Lm5vcm1hbGl6ZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIG1HTC5tVGV4Lm5hbWUuc2V0VG8oIlRleHR1cmUiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgUlNfS0lORF9QT0lOVF9TSVpFOgotICAgICAgICAgICAgcnNBc3NlcnQoIW1HTC5tUG9pbnRTaXplLnNpemUpOwotICAgICAgICAgICAgbUdMLm1Qb2ludFNpemUuc2l6ZSA9IGMuZ2V0VmVjdG9yU2l6ZSgpOwotICAgICAgICAgICAgbUdMLm1Qb2ludFNpemUub2Zmc2V0ID0gbUVsZW1lbnQtPmdldEZpZWxkT2Zmc2V0Qnl0ZXMoY3QpOwotICAgICAgICAgICAgbUdMLm1Qb2ludFNpemUudHlwZSA9IGMuZ2V0R0xUeXBlKCk7Ci0gICAgICAgICAgICBtR0wubVBvaW50U2l6ZS5ub3JtYWxpemVkID0gZmFsc2U7Ci0gICAgICAgICAgICBtR0wubVBvaW50U2l6ZS5uYW1lLnNldFRvKCJQb2ludFNpemUiKTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9CisgICAgICAgIG1BdHRyaWJzW3VzZXJOdW1dLnNpemUgPSBjLmdldFZlY3RvclNpemUoKTsKKyAgICAgICAgbUF0dHJpYnNbdXNlck51bV0ub2Zmc2V0ID0gbUVsZW1lbnQtPmdldEZpZWxkT2Zmc2V0Qnl0ZXMoY3QpOworICAgICAgICBtQXR0cmlic1t1c2VyTnVtXS50eXBlID0gYy5nZXRHTFR5cGUoKTsKKyAgICAgICAgbUF0dHJpYnNbdXNlck51bV0ubm9ybWFsaXplZCA9IGMuZ2V0VHlwZSgpICE9IFJTX1RZUEVfRkxPQVRfMzI7Ly9jLmdldElzTm9ybWFsaXplZCgpOworICAgICAgICBtQXR0cmlic1t1c2VyTnVtXS5uYW1lLnNldFRvKGdldEVsZW1lbnQoKS0+Z2V0RmllbGROYW1lKGN0KSk7CisgICAgICAgIHVzZXJOdW0gKys7CiAgICAgfQogfQogCisKIHZvaWQgVHlwZTo6ZW5hYmxlR0xWZXJ0ZXhCdWZmZXIoVmVydGV4QXJyYXkgKnZhKSBjb25zdAogewotICAgIC8vIE5vdGU6IFdlIGFyZSBvbmx5IGdvaW5nIHRvIGVuYWJsZSBidWZmZXJzIGFuZCBuZXZlciBkaXNhYmxlIHRoZW0KLSAgICAvLyBoZXJlLiAgVGhlIHJlYXNvbiBpcyBtb3JlIHRoYW4gb25lIEFsbG9jYXRpb24gbWF5IGJlIHVzZWQgYXMgYSB2ZXJ0ZXgKLSAgICAvLyBzb3VyY2UuICBTbyB3ZSBjYW5ub3QgZGlzYWJsZSBhcnJheXMgdGhhdCBtYXkgaGF2ZSBiZWVuIGluIHVzZSBieQotICAgIC8vIGFub3RoZXIgYWxsb2NhdGlvbi4KLQotICAgIHVpbnQzMl90IHN0cmlkZSA9IG1FbGVtZW50LT5nZXRTaXplQnl0ZXMoKTsKLSAgICBpZiAobUdMLm1WdHguc2l6ZSkgewotICAgICAgICB2YS0+YWRkTGVnYWN5KG1HTC5tVnR4LnR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgbUdMLm1WdHguc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgUlNfS0lORF9QT1NJVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICBtR0wubVZ0eC5vZmZzZXQpOwotICAgIH0KLQotICAgIGlmIChtR0wubU5vcm0uc2l6ZSkgewotICAgICAgICB2YS0+YWRkTGVnYWN5KG1HTC5tTm9ybS50eXBlLAotICAgICAgICAgICAgICAgICAgICAgMywKLSAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgIFJTX0tJTkRfTk9STUFMLAotICAgICAgICAgICAgICAgICAgICAgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICBtR0wubU5vcm0ub2Zmc2V0KTsKLSAgICB9Ci0KLSAgICBpZiAobUdMLm1Db2xvci5zaXplKSB7Ci0gICAgICAgIHZhLT5hZGRMZWdhY3kobUdMLm1Db2xvci50eXBlLAotICAgICAgICAgICAgICAgICAgICAgbUdMLm1Db2xvci5zaXplLAotICAgICAgICAgICAgICAgICAgICAgc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgUlNfS0lORF9DT0xPUiwKLSAgICAgICAgICAgICAgICAgICAgIHRydWUsCi0gICAgICAgICAgICAgICAgICAgICBtR0wubUNvbG9yLm9mZnNldCk7Ci0gICAgfQotCi0gICAgaWYgKG1HTC5tVGV4LnNpemUpIHsKLSAgICAgICAgdmEtPmFkZExlZ2FjeShtR0wubVRleC50eXBlLAotICAgICAgICAgICAgICAgICAgICAgbUdMLm1UZXguc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgIFJTX0tJTkRfVEVYVFVSRSwKLSAgICAgICAgICAgICAgICAgICAgIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgbUdMLm1UZXgub2Zmc2V0KTsKLSAgICB9Ci0KLSAgICBpZiAobUdMLm1Qb2ludFNpemUuc2l6ZSkgewotICAgICAgICB2YS0+YWRkTGVnYWN5KG1HTC5tUG9pbnRTaXplLnR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAxLAotICAgICAgICAgICAgICAgICAgICAgc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgUlNfS0lORF9QT0lOVF9TSVpFLAotICAgICAgICAgICAgICAgICAgICAgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICBtR0wubVBvaW50U2l6ZS5vZmZzZXQpOwotICAgIH0KLQotfQotCi12b2lkIFR5cGU6OmVuYWJsZUdMVmVydGV4QnVmZmVyMihWZXJ0ZXhBcnJheSAqdmEpIGNvbnN0Ci17Ci0gICAgLy8gRG8gbGVnYWN5IGJ1ZmZlcnMKLSAgICBlbmFibGVHTFZlcnRleEJ1ZmZlcih2YSk7Ci0KICAgICB1aW50MzJfdCBzdHJpZGUgPSBtRWxlbWVudC0+Z2V0U2l6ZUJ5dGVzKCk7CiAgICAgZm9yICh1aW50MzJfdCBjdD0wOyBjdCA8IFJTX01BWF9BVFRSSUJTOyBjdCsrKSB7Ci0gICAgICAgIGlmIChtR0wubVVzZXJbY3RdLnNpemUpIHsKLSAgICAgICAgICAgIHZhLT5hZGRVc2VyKG1HTC5tVXNlcltjdF0sIHN0cmlkZSk7CisgICAgICAgIGlmIChtQXR0cmlic1tjdF0uc2l6ZSkgeworICAgICAgICAgICAgdmEtPmFkZChtQXR0cmlic1tjdF0sIHN0cmlkZSk7CiAgICAgICAgIH0KICAgICB9CiB9CkBAIC0yODMsNiArMTg1LDU3IEBACiAgICAgbUVsZW1lbnQtPmR1bXBMT0dWKGJ1Zik7CiB9CiAKK3ZvaWQgVHlwZTo6c2VyaWFsaXplKE9TdHJlYW0gKnN0cmVhbSkgY29uc3QKK3sKKyAgICAvLyBOZWVkIHRvIGlkZW50aWZ5IG91cnNlbHZlcworICAgIHN0cmVhbS0+YWRkVTMyKCh1aW50MzJfdClnZXRDbGFzc0lkKCkpOworCisgICAgU3RyaW5nOCBuYW1lKGdldE5hbWUoKSk7CisgICAgc3RyZWFtLT5hZGRTdHJpbmcoJm5hbWUpOworCisgICAgbUVsZW1lbnQtPnNlcmlhbGl6ZShzdHJlYW0pOworCisgICAgc3RyZWFtLT5hZGRVMzIobURpbVgpOworICAgIHN0cmVhbS0+YWRkVTMyKG1EaW1ZKTsKKyAgICBzdHJlYW0tPmFkZFUzMihtRGltWik7CisKKyAgICBzdHJlYW0tPmFkZFU4KCh1aW50OF90KShtRGltTE9EID8gMSA6IDApKTsKKyAgICBzdHJlYW0tPmFkZFU4KCh1aW50OF90KShtRmFjZXMgPyAxIDogMCkpOworfQorCitUeXBlICpUeXBlOjpjcmVhdGVGcm9tU3RyZWFtKENvbnRleHQgKnJzYywgSVN0cmVhbSAqc3RyZWFtKQoreworICAgIC8vIEZpcnN0IG1ha2Ugc3VyZSB3ZSBhcmUgcmVhZGluZyB0aGUgY29ycmVjdCBvYmplY3QKKyAgICBSc0EzRENsYXNzSUQgY2xhc3NJRCA9IChSc0EzRENsYXNzSUQpc3RyZWFtLT5sb2FkVTMyKCk7CisgICAgaWYoY2xhc3NJRCAhPSBSU19BM0RfQ0xBU1NfSURfVFlQRSkgeworICAgICAgICBMT0dFKCJ0eXBlIGxvYWRpbmcgc2tpcHBlZCBkdWUgdG8gaW52YWxpZCBjbGFzcyBpZFxuIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIFN0cmluZzggbmFtZTsKKyAgICBzdHJlYW0tPmxvYWRTdHJpbmcoJm5hbWUpOworCisgICAgRWxlbWVudCAqZWxlbSA9IEVsZW1lbnQ6OmNyZWF0ZUZyb21TdHJlYW0ocnNjLCBzdHJlYW0pOworICAgIGlmKCFlbGVtKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIFR5cGUgKnR5cGUgPSBuZXcgVHlwZShyc2MpOworICAgIHR5cGUtPm1EaW1YID0gc3RyZWFtLT5sb2FkVTMyKCk7CisgICAgdHlwZS0+bURpbVkgPSBzdHJlYW0tPmxvYWRVMzIoKTsKKyAgICB0eXBlLT5tRGltWiA9IHN0cmVhbS0+bG9hZFUzMigpOworCisgICAgdWludDhfdCB0ZW1wID0gc3RyZWFtLT5sb2FkVTgoKTsKKyAgICB0eXBlLT5tRGltTE9EID0gdGVtcCAhPSAwOworCisgICAgdGVtcCA9IHN0cmVhbS0+bG9hZFU4KCk7CisgICAgdHlwZS0+bUZhY2VzID0gdGVtcCAhPSAwOworCisgICAgdHlwZS0+c2V0RWxlbWVudChlbGVtKTsKKworICAgIHJldHVybiB0eXBlOworfQorCiBib29sIFR5cGU6OmdldElzTnAyKCkgY29uc3QKIHsKICAgICB1aW50MzJfdCB4ID0gZ2V0RGltWCgpOwpAQCAtMzkxLDYgKzM0NCwyMiBAQAogICAgIHJldHVybiBzdDsKIH0KIAordm9pZCByc2lfVHlwZUdldE5hdGl2ZURhdGEoQ29udGV4dCAqcnNjLCBSc1R5cGUgdHlwZSwgdWludDMyX3QgKnR5cGVEYXRhLCB1aW50MzJfdCB0eXBlRGF0YVNpemUpCit7CisgICAgcnNBc3NlcnQodHlwZURhdGFTaXplID09IDYpOworICAgIC8vIFBhY2sgdGhlIGRhdGEgaW4gdGhlIGZvbGxvZmluZyB3YXkgbURpbVg7IG1EaW1ZOyBtRGltWjsKKyAgICAvLyBtRGltTE9EOyBtRGltRmFjZXM7IG1FbGVtZW50OyBpbnRvIHR5cGVEYXRhCisgICAgVHlwZSAqdCA9IHN0YXRpY19jYXN0PFR5cGUgKj4odHlwZSk7CisKKyAgICAoKnR5cGVEYXRhKyspID0gdC0+Z2V0RGltWCgpOworICAgICgqdHlwZURhdGErKykgPSB0LT5nZXREaW1ZKCk7CisgICAgKCp0eXBlRGF0YSsrKSA9IHQtPmdldERpbVooKTsKKyAgICAoKnR5cGVEYXRhKyspID0gdC0+Z2V0RGltTE9EKCk7CisgICAgKCp0eXBlRGF0YSsrKSA9IHQtPmdldERpbUZhY2VzKCkgPyAxIDogMDsKKyAgICAoKnR5cGVEYXRhKyspID0gKHVpbnQzMl90KXQtPmdldEVsZW1lbnQoKTsKKworfQorCiAKIH0KIH0KZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNUeXBlLmggYi9saWJzL3JzL3JzVHlwZS5oCmluZGV4IGMyNTU3N2MuLjViNTFlMjAgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNUeXBlLmgKKysrIGIvbGlicy9ycy9yc1R5cGUuaApAQCAtNzEsOSArNzEsMTEgQEAKICAgICB2b2lkIGNvbXB1dGUoKTsKIAogICAgIHZvaWQgZW5hYmxlR0xWZXJ0ZXhCdWZmZXIoY2xhc3MgVmVydGV4QXJyYXkgKikgY29uc3Q7Ci0gICAgdm9pZCBlbmFibGVHTFZlcnRleEJ1ZmZlcjIoY2xhc3MgVmVydGV4QXJyYXkgKikgY29uc3Q7CiAKICAgICB2b2lkIGR1bXBMT0dWKGNvbnN0IGNoYXIgKnByZWZpeCkgY29uc3Q7CisgICAgdmlydHVhbCB2b2lkIHNlcmlhbGl6ZShPU3RyZWFtICpzdHJlYW0pIGNvbnN0OworICAgIHZpcnR1YWwgUnNBM0RDbGFzc0lEIGdldENsYXNzSWQoKSBjb25zdCB7IHJldHVybiBSU19BM0RfQ0xBU1NfSURfVFlQRTsgfQorICAgIHN0YXRpYyBUeXBlICpjcmVhdGVGcm9tU3RyZWFtKENvbnRleHQgKnJzYywgSVN0cmVhbSAqc3RyZWFtKTsKIAogcHJvdGVjdGVkOgogICAgIHN0cnVjdCBMT0QgewpAQCAtMTEyLDE1ICsxMTQsNyBAQAogICAgIExPRCAqbUxPRHM7CiAgICAgdWludDMyX3QgbUxPRENvdW50OwogCi0gICAgc3RydWN0IEdMU3RhdGVfdCB7Ci0gICAgICAgIFZlcnRleEFycmF5OjpBdHRyaWIgbVVzZXJbUlNfTUFYX0FUVFJJQlNdOwotICAgICAgICBWZXJ0ZXhBcnJheTo6QXR0cmliIG1WdHg7Ci0gICAgICAgIFZlcnRleEFycmF5OjpBdHRyaWIgbU5vcm07Ci0gICAgICAgIFZlcnRleEFycmF5OjpBdHRyaWIgbUNvbG9yOwotICAgICAgICBWZXJ0ZXhBcnJheTo6QXR0cmliIG1UZXg7Ci0gICAgICAgIFZlcnRleEFycmF5OjpBdHRyaWIgbVBvaW50U2l6ZTsKLSAgICB9OwotICAgIEdMU3RhdGVfdCBtR0w7CisgICAgVmVydGV4QXJyYXk6OkF0dHJpYiBtQXR0cmlic1tSU19NQVhfQVRUUklCU107CiAgICAgdm9pZCBtYWtlR0xDb21wb25lbnRzKCk7CiAKIHByaXZhdGU6CmRpZmYgLS1naXQgYS9saWJzL3JzL3JzVXRpbHMuaCBiL2xpYnMvcnMvcnNVdGlscy5oCmluZGV4IDA3Zjg5MzMuLjE3ZmViMjIgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNVdGlscy5oCisrKyBiL2xpYnMvcnMvcnNVdGlscy5oCkBAIC0xOSwxNSArMTksMjMgQEAKIAogI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAiUmVuZGVyU2NyaXB0IgorCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+Ci0jaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KKworI2luY2x1ZGUgInJzU3RyZWFtLmgiCisKICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisKICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxwdGhyZWFkLmg+CiAjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPGN1dGlscy9hdG9taWMuaD4KIAorI2lmbmRlZiBBTkRST0lEX1JTX0JVSUxEX0ZPUl9IT1NUCiAjaW5jbHVkZSA8RUdML2VnbC5oPgorI2VuZGlmCisKICNpbmNsdWRlIDxtYXRoLmg+CiAKICNpbmNsdWRlICJSZW5kZXJTY3JpcHQuaCIKQEAgLTQxLDYgKzQ5LDI2IEBACiAjZGVmaW5lIHJzQXNzZXJ0KHYpIHdoaWxlKDApCiAjZW5kaWYKIAordHlwZWRlZiBmbG9hdCByc3ZGXzIgX19hdHRyaWJ1dGVfXyAoKHZlY3Rvcl9zaXplICg4KSkpOwordHlwZWRlZiBmbG9hdCByc3ZGXzQgX19hdHRyaWJ1dGVfXyAoKHZlY3Rvcl9zaXplICgxNikpKTsKK3R5cGVkZWYgdWludDhfdCByc3ZVOF80IF9fYXR0cmlidXRlX18gKCh2ZWN0b3Jfc2l6ZSAoNCkpKTsKKwordW5pb24gZmxvYXQyIHsKKyAgICByc3ZGXzIgdjsKKyAgICBmbG9hdCBmWzJdOworfTsKKwordW5pb24gZmxvYXQ0IHsKKyAgICByc3ZGXzQgdjsKKyAgICBmbG9hdCBmWzRdOworfTsKKwordW5pb24gdWNoYXI0IHsKKyAgICByc3ZVOF80IHY7CisgICAgdWludDhfdCBmWzRdOworICAgIHVpbnQzMl90IHBhY2tlZDsKK307CisKIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CiBUIHJzTWluKFQgaW4xLCBUIGluMikKIHsKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNWZXJ0ZXhBcnJheS5jcHAgYi9saWJzL3JzL3JzVmVydGV4QXJyYXkuY3BwCmluZGV4IDZjMjAwMmQuLjAwMTkyN2MgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNWZXJ0ZXhBcnJheS5jcHAKKysrIGIvbGlicy9ycy9yc1ZlcnRleEFycmF5LmNwcApAQCAtMTQsMTAgKzE0LDE1IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisjaWZuZGVmIEFORFJPSURfUlNfQlVJTERfRk9SX0hPU1QKICNpbmNsdWRlICJyc0NvbnRleHQuaCIKLQogI2luY2x1ZGUgPEdMRVMvZ2wuaD4KICNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KKyNlbHNlCisjaW5jbHVkZSAicnNDb250ZXh0SG9zdFN0dWIuaCIKKyNpbmNsdWRlIDxPcGVuR0wvZ2wuaD4KKyNlbmRpZgorCiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OnJlbmRlcnNjcmlwdDsKQEAgLTM5LDYgKzQ0LDcgQEAKICAgICAgICAgbUF0dHJpYnNbY3RdLmNsZWFyKCk7CiAgICAgfQogICAgIG1BY3RpdmVCdWZmZXIgPSAwOworICAgIG1BY3RpdmVQb2ludGVyID0gTlVMTDsKICAgICBtQ291bnQgPSAwOwogfQogCkBAIC01MCwxMiArNTYsMTIgQEAKIHZvaWQgVmVydGV4QXJyYXk6OkF0dHJpYjo6c2V0KGNvbnN0IEF0dHJpYiAmYSkKIHsKICAgICBidWZmZXIgPSBhLmJ1ZmZlcjsKKyAgICBwdHIgPSBhLnB0cjsKICAgICBvZmZzZXQgPSBhLm9mZnNldDsKICAgICB0eXBlID0gYS50eXBlOwogICAgIHNpemUgPSBhLnNpemU7CiAgICAgc3RyaWRlID0gYS5zdHJpZGU7CiAgICAgbm9ybWFsaXplZCA9IGEubm9ybWFsaXplZDsKLSAgICBraW5kID0gUlNfS0lORF9VU0VSOwogICAgIG5hbWUuc2V0VG8oYS5uYW1lKTsKIH0KIApAQCAtNjYsNiArNzIsNyBAQAogICAgIHR5cGUgPSAwOwogICAgIHNpemUgPSAwOwogICAgIHN0cmlkZSA9IDA7CisgICAgcHRyID0gTlVMTDsKICAgICBub3JtYWxpemVkID0gZmFsc2U7CiAgICAgbmFtZS5zZXRUbygiIik7CiB9CkBAIC03NSwxMzggKzgyLDg0IEBACiAgICAgbUF0dHJpYnNbbl0uY2xlYXIoKTsKIH0KIAotdm9pZCBWZXJ0ZXhBcnJheTo6YWRkVXNlcihjb25zdCBBdHRyaWIgJmEsIHVpbnQzMl90IHN0cmlkZSkKK3ZvaWQgVmVydGV4QXJyYXk6OmFkZChjb25zdCBBdHRyaWIgJmEsIHVpbnQzMl90IHN0cmlkZSkKIHsKLSAgICBhc3NlcnQobUNvdW50IDwgUlNfTUFYX0FUVFJJQlMpOworICAgIHJzQXNzZXJ0KG1Db3VudCA8IFJTX01BWF9BVFRSSUJTKTsKICAgICBtQXR0cmlic1ttQ291bnRdLnNldChhKTsKICAgICBtQXR0cmlic1ttQ291bnRdLmJ1ZmZlciA9IG1BY3RpdmVCdWZmZXI7CisgICAgbUF0dHJpYnNbbUNvdW50XS5wdHIgPSBtQWN0aXZlUG9pbnRlcjsKICAgICBtQXR0cmlic1ttQ291bnRdLnN0cmlkZSA9IHN0cmlkZTsKLSAgICBtQXR0cmlic1ttQ291bnRdLmtpbmQgPSBSU19LSU5EX1VTRVI7CiAgICAgbUNvdW50ICsrOwogfQogCi12b2lkIFZlcnRleEFycmF5OjphZGRMZWdhY3kodWludDMyX3QgdHlwZSwgdWludDMyX3Qgc2l6ZSwgdWludDMyX3Qgc3RyaWRlLCBSc0RhdGFLaW5kIGtpbmQsIGJvb2wgbm9ybWFsaXplZCwgdWludDMyX3Qgb2Zmc2V0KQordm9pZCBWZXJ0ZXhBcnJheTo6YWRkKHVpbnQzMl90IHR5cGUsIHVpbnQzMl90IHNpemUsIHVpbnQzMl90IHN0cmlkZSwgYm9vbCBub3JtYWxpemVkLCB1aW50MzJfdCBvZmZzZXQsIGNvbnN0IGNoYXIgKm5hbWUpCiB7Ci0gICAgYXNzZXJ0KG1Db3VudCA8IFJTX01BWF9BVFRSSUJTKTsKKyAgICByc0Fzc2VydChtQ291bnQgPCBSU19NQVhfQVRUUklCUyk7CiAgICAgbUF0dHJpYnNbbUNvdW50XS5jbGVhcigpOwogICAgIG1BdHRyaWJzW21Db3VudF0udHlwZSA9IHR5cGU7CiAgICAgbUF0dHJpYnNbbUNvdW50XS5zaXplID0gc2l6ZTsKICAgICBtQXR0cmlic1ttQ291bnRdLm9mZnNldCA9IG9mZnNldDsKICAgICBtQXR0cmlic1ttQ291bnRdLm5vcm1hbGl6ZWQgPSBub3JtYWxpemVkOwotICAgIG1BdHRyaWJzW21Db3VudF0uYnVmZmVyID0gbUFjdGl2ZUJ1ZmZlcjsKICAgICBtQXR0cmlic1ttQ291bnRdLnN0cmlkZSA9IHN0cmlkZTsKLSAgICBtQXR0cmlic1ttQ291bnRdLmtpbmQgPSBraW5kOworICAgIG1BdHRyaWJzW21Db3VudF0ubmFtZS5zZXRUbyhuYW1lKTsKKworICAgIG1BdHRyaWJzW21Db3VudF0uYnVmZmVyID0gbUFjdGl2ZUJ1ZmZlcjsKKyAgICBtQXR0cmlic1ttQ291bnRdLnB0ciA9IG1BY3RpdmVQb2ludGVyOwogICAgIG1Db3VudCArKzsKIH0KIAogdm9pZCBWZXJ0ZXhBcnJheTo6bG9nQXR0cmliKHVpbnQzMl90IGlkeCwgdWludDMyX3Qgc2xvdCkgY29uc3QgewotICAgIExPR0UoInZhICVpOiBzbG90PSVpIG5hbWU9JXMgYnVmPSVpICBzaXplPSVpICB0eXBlPTB4JXggIGtpbmQ9JWkgIHN0cmlkZT0weCV4ICBub3JtPSVpICBvZmZzZXQ9MHgleCIsIGlkeCwgc2xvdCwKKyAgICBMT0dFKCJ2YSAlaTogc2xvdD0laSBuYW1lPSVzIGJ1Zj0laSBwdHI9JXAgc2l6ZT0laSAgdHlwZT0weCV4ICBzdHJpZGU9MHgleCAgbm9ybT0laSAgb2Zmc2V0PTB4JXgiLCBpZHgsIHNsb3QsCiAgICAgICAgICBtQXR0cmlic1tpZHhdLm5hbWUuc3RyaW5nKCksCiAgICAgICAgICBtQXR0cmlic1tpZHhdLmJ1ZmZlciwKKyAgICAgICAgIG1BdHRyaWJzW2lkeF0ucHRyLAogICAgICAgICAgbUF0dHJpYnNbaWR4XS5zaXplLAogICAgICAgICAgbUF0dHJpYnNbaWR4XS50eXBlLAotICAgICAgICAgbUF0dHJpYnNbaWR4XS5raW5kLAogICAgICAgICAgbUF0dHJpYnNbaWR4XS5zdHJpZGUsCiAgICAgICAgICBtQXR0cmlic1tpZHhdLm5vcm1hbGl6ZWQsCiAgICAgICAgICBtQXR0cmlic1tpZHhdLm9mZnNldCk7CiB9CiAKLXZvaWQgVmVydGV4QXJyYXk6OnNldHVwR0woY29uc3QgQ29udGV4dCAqcnNjLCBjbGFzcyBWZXJ0ZXhBcnJheVN0YXRlICpzdGF0ZSkgY29uc3QKLXsKLSAgICBnbENsaWVudEFjdGl2ZVRleHR1cmUoR0xfVEVYVFVSRTApOwotICAgIGdsRGlzYWJsZUNsaWVudFN0YXRlKEdMX05PUk1BTF9BUlJBWSk7Ci0gICAgZ2xEaXNhYmxlQ2xpZW50U3RhdGUoR0xfQ09MT1JfQVJSQVkpOwotICAgIGdsRGlzYWJsZUNsaWVudFN0YXRlKEdMX1RFWFRVUkVfQ09PUkRfQVJSQVkpOwotICAgIGdsRGlzYWJsZUNsaWVudFN0YXRlKEdMX1BPSU5UX1NJWkVfQVJSQVlfT0VTKTsKLQotICAgIGZvciAodWludDMyX3QgY3Q9MDsgY3QgPCBtQ291bnQ7IGN0KyspIHsKLSAgICAgICAgc3dpdGNoKG1BdHRyaWJzW2N0XS5raW5kKSB7Ci0gICAgICAgIGNhc2UgUlNfS0lORF9QT1NJVElPTjoKLSAgICAgICAgICAgIC8vbG9nQXR0cmliKFBPU0lUSU9OKTsKLSAgICAgICAgICAgIGdsRW5hYmxlQ2xpZW50U3RhdGUoR0xfVkVSVEVYX0FSUkFZKTsKLSAgICAgICAgICAgIGdsQmluZEJ1ZmZlcihHTF9BUlJBWV9CVUZGRVIsIG1BdHRyaWJzW2N0XS5idWZmZXIpOwotICAgICAgICAgICAgZ2xWZXJ0ZXhQb2ludGVyKG1BdHRyaWJzW2N0XS5zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BdHRyaWJzW2N0XS50eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BdHRyaWJzW2N0XS5zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiltQXR0cmlic1tjdF0ub2Zmc2V0KTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgUlNfS0lORF9OT1JNQUw6Ci0gICAgICAgICAgICAvL2xvZ0F0dHJpYihOT1JNQUwpOwotICAgICAgICAgICAgZ2xFbmFibGVDbGllbnRTdGF0ZShHTF9OT1JNQUxfQVJSQVkpOwotICAgICAgICAgICAgcnNBc3NlcnQobUF0dHJpYnNbY3RdLnNpemUgPT0gMyk7Ci0gICAgICAgICAgICBnbEJpbmRCdWZmZXIoR0xfQVJSQVlfQlVGRkVSLCBtQXR0cmlic1tjdF0uYnVmZmVyKTsKLSAgICAgICAgICAgIGdsTm9ybWFsUG9pbnRlcihtQXR0cmlic1tjdF0udHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQXR0cmlic1tjdF0uc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopbUF0dHJpYnNbY3RdLm9mZnNldCk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIFJTX0tJTkRfQ09MT1I6Ci0gICAgICAgICAgICAvL2xvZ0F0dHJpYihDT0xPUik7Ci0gICAgICAgICAgICBnbEVuYWJsZUNsaWVudFN0YXRlKEdMX0NPTE9SX0FSUkFZKTsKLSAgICAgICAgICAgIGdsQmluZEJ1ZmZlcihHTF9BUlJBWV9CVUZGRVIsIG1BdHRyaWJzW2N0XS5idWZmZXIpOwotICAgICAgICAgICAgZ2xDb2xvclBvaW50ZXIobUF0dHJpYnNbY3RdLnNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBtQXR0cmlic1tjdF0udHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BdHRyaWJzW2N0XS5zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKW1BdHRyaWJzW2N0XS5vZmZzZXQpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBSU19LSU5EX1RFWFRVUkU6Ci0gICAgICAgICAgICAvL2xvZ0F0dHJpYihURVhUVVJFKTsKLSAgICAgICAgICAgIGdsRW5hYmxlQ2xpZW50U3RhdGUoR0xfVEVYVFVSRV9DT09SRF9BUlJBWSk7Ci0gICAgICAgICAgICBnbEJpbmRCdWZmZXIoR0xfQVJSQVlfQlVGRkVSLCBtQXR0cmlic1tjdF0uYnVmZmVyKTsKLSAgICAgICAgICAgIGdsVGV4Q29vcmRQb2ludGVyKG1BdHRyaWJzW2N0XS5zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUF0dHJpYnNbY3RdLnR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQXR0cmlic1tjdF0uc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiltQXR0cmlic1tjdF0ub2Zmc2V0KTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgUlNfS0lORF9QT0lOVF9TSVpFOgotICAgICAgICAgICAgLy9sb2dBdHRyaWIoUE9JTlRfU0laRSk7Ci0gICAgICAgICAgICBnbEVuYWJsZUNsaWVudFN0YXRlKEdMX1BPSU5UX1NJWkVfQVJSQVlfT0VTKTsKLSAgICAgICAgICAgIGdsQmluZEJ1ZmZlcihHTF9BUlJBWV9CVUZGRVIsIG1BdHRyaWJzW2N0XS5idWZmZXIpOwotICAgICAgICAgICAgZ2xQb2ludFNpemVQb2ludGVyT0VTKG1BdHRyaWJzW2N0XS50eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BdHRyaWJzW2N0XS5zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiltQXR0cmlic1tjdF0ub2Zmc2V0KTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByc0Fzc2VydCgwKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJzYy0+Y2hlY2tFcnJvcigiVmVydGV4QXJyYXk6OnNldHVwR0wiKTsKLX0KLQogdm9pZCBWZXJ0ZXhBcnJheTo6c2V0dXBHTDIoY29uc3QgQ29udGV4dCAqcnNjLCBjbGFzcyBWZXJ0ZXhBcnJheVN0YXRlICpzdGF0ZSwgU2hhZGVyQ2FjaGUgKnNjKSBjb25zdAogewogICAgIHJzYy0+Y2hlY2tFcnJvcigiVmVydGV4QXJyYXk6OnNldHVwR0wyIHN0YXJ0Iik7Ci0gICAgZm9yICh1aW50MzJfdCBjdD0xOyBjdCA8PSBzdGF0ZS0+bUxhc3RFbmFibGVDb3VudDsgY3QrKykgeworICAgIGZvciAodWludDMyX3QgY3Q9MTsgY3QgPD0gMHhmLypzdGF0ZS0+bUxhc3RFbmFibGVDb3VudCovOyBjdCsrKSB7CiAgICAgICAgIGdsRGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KGN0KTsKICAgICB9CiAKICAgICByc2MtPmNoZWNrRXJyb3IoIlZlcnRleEFycmF5OjpzZXR1cEdMMiBkaXNhYmxlZCIpOwogICAgIGZvciAodWludDMyX3QgY3Q9MDsgY3QgPCBtQ291bnQ7IGN0KyspIHsKICAgICAgICAgdWludDMyX3Qgc2xvdCA9IDA7CisKKyAgICAgICAgaWYgKG1BdHRyaWJzW2N0XS5uYW1lWzBdID09ICcjJykgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKwogICAgICAgICBpZiAoc2MtPmlzVXNlclZlcnRleFByb2dyYW0oKSkgewogICAgICAgICAgICAgc2xvdCA9IHNjLT52dHhBdHRyaWJTbG90KGN0KTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChtQXR0cmlic1tjdF0ua2luZCA9PSBSU19LSU5EX1VTRVIpIHsKKyAgICAgICAgICAgIGlmIChtQXR0cmlic1tjdF0ubmFtZSA9PSAicG9zaXRpb24iKSB7CisgICAgICAgICAgICAgICAgc2xvdCA9IDA7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1BdHRyaWJzW2N0XS5uYW1lID09ICJjb2xvciIpIHsKKyAgICAgICAgICAgICAgICBzbG90ID0gMTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobUF0dHJpYnNbY3RdLm5hbWUgPT0gIm5vcm1hbCIpIHsKKyAgICAgICAgICAgICAgICBzbG90ID0gMjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobUF0dHJpYnNbY3RdLm5hbWUgPT0gInRleHR1cmUwIikgeworICAgICAgICAgICAgICAgIHNsb3QgPSAzOworICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNsb3QgPSBzYy0+dnR4QXR0cmliU2xvdChtQXR0cmlic1tjdF0ua2luZCk7CiAgICAgICAgIH0KIAogICAgICAgICAvL2xvZ0F0dHJpYihjdCwgc2xvdCk7CiAgICAgICAgIGdsRW5hYmxlVmVydGV4QXR0cmliQXJyYXkoc2xvdCk7CiAgICAgICAgIGdsQmluZEJ1ZmZlcihHTF9BUlJBWV9CVUZGRVIsIG1BdHRyaWJzW2N0XS5idWZmZXIpOwotCiAgICAgICAgIGdsVmVydGV4QXR0cmliUG9pbnRlcihzbG90LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUF0dHJpYnNbY3RdLnNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQXR0cmlic1tjdF0udHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BdHRyaWJzW2N0XS5ub3JtYWxpemVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUF0dHJpYnNbY3RdLnN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopbUF0dHJpYnNbY3RdLm9mZnNldCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQXR0cmlic1tjdF0ucHRyICsgbUF0dHJpYnNbY3RdLm9mZnNldCk7CiAgICAgfQogICAgIHN0YXRlLT5tTGFzdEVuYWJsZUNvdW50ID0gbUNvdW50OwogICAgIHJzYy0+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+eCA9IHgyOworICAgIGJCb3hNYXgtPnkgPSB5MjsKKyAgICBiQm94TWF4LT56ID0gejI7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIC8vIG1pc2MKLWV4dGVybiB2b2lkIHBmQ2xlYXJDb2xvcihmbG9hdCwgZmxvYXQsIGZsb2F0LCBmbG9hdCk7Ci1leHRlcm4gdm9pZCBjb2xvcihmbG9hdCwgZmxvYXQsIGZsb2F0LCBmbG9hdCk7Ci1leHRlcm4gdm9pZCBoc2IoZmxvYXQsIGZsb2F0LCBmbG9hdCwgZmxvYXQpOwotZXh0ZXJuIHZvaWQgaHNiVG9SZ2IoZmxvYXQsIGZsb2F0LCBmbG9hdCwgZmxvYXQqKTsKLWV4dGVybiBpbnQgaHNiVG9BYmdyKGZsb2F0LCBmbG9hdCwgZmxvYXQsIGZsb2F0KTsKIAotZXh0ZXJuIHZvaWQgdXBsb2FkVG9UZXh0dXJlKGludCwgaW50KTsKLWV4dGVybiB2b2lkIHVwbG9hZFRvQnVmZmVyT2JqZWN0KGludCk7CisvLyBEZXByaWNhdGVkCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIGNvbG9yKGZsb2F0LCBmbG9hdCwgZmxvYXQsIGZsb2F0KTsKIAotZXh0ZXJuIGludCBjb2xvckZsb2F0UkdCQXRvVU5vcm04KGZsb2F0LCBmbG9hdCwgZmxvYXQsIGZsb2F0KTsKLWV4dGVybiBpbnQgY29sb3JGbG9hdFJHQnRvNTY1KGZsb2F0LCBmbG9hdCwgZmxvYXQpOwotCi1leHRlcm4gaW50IGdldFdpZHRoKCk7Ci1leHRlcm4gaW50IGdldEhlaWdodCgpOwotCi1leHRlcm4gaW50IHNlbmRUb0NsaWVudCh2b2lkICpkYXRhLCBpbnQgY21kSUQsIGludCBsZW4sIGludCB3YWl0Rm9yU3BhY2UpOwotCi1leHRlcm4gdm9pZCBkZWJ1Z0YoY29uc3QgY2hhciAqLCBmbG9hdCk7Ci1leHRlcm4gdm9pZCBkZWJ1Z0kzMihjb25zdCBjaGFyICosIGludCk7Ci1leHRlcm4gdm9pZCBkZWJ1Z0hleEkzMihjb25zdCBjaGFyICosIGludCk7Ci0KLQorI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2xpYnMvcnMvc2NyaXB0Yy9yc19tYXRoLnJzaCBiL2xpYnMvcnMvc2NyaXB0Yy9yc19tYXRoLnJzaAppbmRleCA2MTNjN2NhLi5jODQyZWYxIDEwMDY0NAotLS0gYS9saWJzL3JzL3NjcmlwdGMvcnNfbWF0aC5yc2gKKysrIGIvbGlicy9ycy9zY3JpcHRjL3JzX21hdGgucnNoCkBAIC0xLDI4NyArMSwyMTggQEAKLS8vIEZsb2F0IG9wcworI2lmbmRlZiBfX1JTX01BVEhfUlNIX18KKyNkZWZpbmUgX19SU19NQVRIX1JTSF9fCiAKLWV4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhYnMoZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhYnMoZmxvYXQyKTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYWJzKGZsb2F0Myk7Ci1leHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGFicyhmbG9hdDQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhYnMoZmxvYXQ4KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGFicyhmbG9hdDE2KTsKKy8vIERlYnVnZ2luZywgcHJpbnQgdG8gdGhlIExPRyBhIGRlc2NyaXB0aW9uIHN0cmluZyBhbmQgYSB2YWx1ZS4KK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNEZWJ1Zyhjb25zdCBjaGFyICosIGZsb2F0KTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNEZWJ1Zyhjb25zdCBjaGFyICosIGZsb2F0LCBmbG9hdCk7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzRGVidWcoY29uc3QgY2hhciAqLCBmbG9hdCwgZmxvYXQsIGZsb2F0KTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNEZWJ1Zyhjb25zdCBjaGFyICosIGZsb2F0LCBmbG9hdCwgZmxvYXQsIGZsb2F0KTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNEZWJ1Zyhjb25zdCBjaGFyICosIGNvbnN0IHJzX21hdHJpeDR4NCAqKTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNEZWJ1Zyhjb25zdCBjaGFyICosIGNvbnN0IHJzX21hdHJpeDN4MyAqKTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNEZWJ1Zyhjb25zdCBjaGFyICosIGNvbnN0IHJzX21hdHJpeDJ4MiAqKTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNEZWJ1Zyhjb25zdCBjaGFyICosIGludCk7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzRGVidWcoY29uc3QgY2hhciAqLCB1aW50KTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNEZWJ1Zyhjb25zdCBjaGFyICosIGNvbnN0IHZvaWQgKik7CisjZGVmaW5lIFJTX0RFQlVHKGEpIHJzRGVidWcoI2EsIGEpCisjZGVmaW5lIFJTX0RFQlVHX01BUktFUiByc0RlYnVnKF9fRklMRV9fLCBfX0xJTkVfXykKIAotZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGFjb3MoZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhY29zKGZsb2F0Mik7Ci1leHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGFjb3MoZmxvYXQzKTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYWNvcyhmbG9hdDQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhY29zKGZsb2F0OCk7Ci1leHRlcm4gZmxvYXQxNiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhY29zKGZsb2F0MTYpOwogCi1leHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYXNpbihmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGFzaW4oZmxvYXQyKTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYXNpbihmbG9hdDMpOwotZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhc2luKGZsb2F0NCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGFzaW4oZmxvYXQ4KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGFzaW4oZmxvYXQxNik7CisjaW5jbHVkZSAicnNfY2wucnNoIgorI2luY2x1ZGUgInJzX2NvcmUucnNoIgogCi1leHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYXRhbihmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGF0YW4oZmxvYXQyKTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYXRhbihmbG9hdDMpOwotZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhdGFuKGZsb2F0NCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGF0YW4oZmxvYXQ4KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGF0YW4oZmxvYXQxNik7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzU2V0T2JqZWN0KHJzX2VsZW1lbnQgKmRzdCwgcnNfZWxlbWVudCBzcmMpOworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc1NldE9iamVjdChyc190eXBlICpkc3QsIHJzX3R5cGUgc3JjKTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNTZXRPYmplY3QocnNfYWxsb2NhdGlvbiAqZHN0LCByc19hbGxvY2F0aW9uIHNyYyk7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzU2V0T2JqZWN0KHJzX3NhbXBsZXIgKmRzdCwgcnNfc2FtcGxlciBzcmMpOworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc1NldE9iamVjdChyc19zY3JpcHQgKmRzdCwgcnNfc2NyaXB0IHNyYyk7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzU2V0T2JqZWN0KHJzX21lc2ggKmRzdCwgcnNfbWVzaCBzcmMpOworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc1NldE9iamVjdChyc19wcm9ncmFtX2ZyYWdtZW50ICpkc3QsIHJzX3Byb2dyYW1fZnJhZ21lbnQgc3JjKTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNTZXRPYmplY3QocnNfcHJvZ3JhbV92ZXJ0ZXggKmRzdCwgcnNfcHJvZ3JhbV92ZXJ0ZXggc3JjKTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNTZXRPYmplY3QocnNfcHJvZ3JhbV9yYXN0ZXIgKmRzdCwgcnNfcHJvZ3JhbV9yYXN0ZXIgc3JjKTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNTZXRPYmplY3QocnNfcHJvZ3JhbV9zdG9yZSAqZHN0LCByc19wcm9ncmFtX3N0b3JlIHNyYyk7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzU2V0T2JqZWN0KHJzX2ZvbnQgKmRzdCwgcnNfZm9udCBzcmMpOwogCi1leHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYXRhbjIoZmxvYXQsIGZsb2F0KTsKLWV4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYXRhbjIoZmxvYXQyLCBmbG9hdDIpOwotZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhdGFuMihmbG9hdDMsIGZsb2F0Myk7Ci1leHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGF0YW4yKGZsb2F0NCwgZmxvYXQ0KTsKLWV4dGVybiBmbG9hdDggX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYXRhbjIoZmxvYXQ4LCBmbG9hdDgpOwotZXh0ZXJuIGZsb2F0MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYXRhbjIoZmxvYXQxNiwgZmxvYXQxNik7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQ2xlYXJPYmplY3QocnNfZWxlbWVudCAqZHN0KTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNDbGVhck9iamVjdChyc190eXBlICpkc3QpOworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0NsZWFyT2JqZWN0KHJzX2FsbG9jYXRpb24gKmRzdCk7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQ2xlYXJPYmplY3QocnNfc2FtcGxlciAqZHN0KTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNDbGVhck9iamVjdChyc19zY3JpcHQgKmRzdCk7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQ2xlYXJPYmplY3QocnNfbWVzaCAqZHN0KTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNDbGVhck9iamVjdChyc19wcm9ncmFtX2ZyYWdtZW50ICpkc3QpOworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0NsZWFyT2JqZWN0KHJzX3Byb2dyYW1fdmVydGV4ICpkc3QpOworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0NsZWFyT2JqZWN0KHJzX3Byb2dyYW1fcmFzdGVyICpkc3QpOworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0NsZWFyT2JqZWN0KHJzX3Byb2dyYW1fc3RvcmUgKmRzdCk7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQ2xlYXJPYmplY3QocnNfZm9udCAqZHN0KTsKIAotZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNlaWwoZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjZWlsKGZsb2F0Mik7Ci1leHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNlaWwoZmxvYXQzKTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY2VpbChmbG9hdDQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjZWlsKGZsb2F0OCk7Ci1leHRlcm4gZmxvYXQxNiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjZWlsKGZsb2F0MTYpOwotCi1leHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY2xhbXAoZmxvYXQsIGZsb2F0LCBmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNsYW1wKGZsb2F0MiwgZmxvYXQyLCBmbG9hdDIpOwotZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjbGFtcChmbG9hdDMsIGZsb2F0MywgZmxvYXQzKTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY2xhbXAoZmxvYXQ0LCBmbG9hdDQsIGZsb2F0NCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNsYW1wKGZsb2F0OCwgZmxvYXQ4LCBmbG9hdDgpOwotZXh0ZXJuIGZsb2F0MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY2xhbXAoZmxvYXQxNiwgZmxvYXQxNiwgZmxvYXQxNik7Ci1leHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY2xhbXAoZmxvYXQsIGZsb2F0LCBmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNsYW1wKGZsb2F0MiwgZmxvYXQsIGZsb2F0KTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY2xhbXAoZmxvYXQzLCBmbG9hdCwgZmxvYXQpOwotZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjbGFtcChmbG9hdDQsIGZsb2F0LCBmbG9hdCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNsYW1wKGZsb2F0OCwgZmxvYXQsIGZsb2F0KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNsYW1wKGZsb2F0MTYsIGZsb2F0LCBmbG9hdCk7Ci0KLWV4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjb3B5c2lnbihmbG9hdCwgZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjb3B5c2lnbihmbG9hdDIsIGZsb2F0Mik7Ci1leHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNvcHlzaWduKGZsb2F0MywgZmxvYXQzKTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY29weXNpZ24oZmxvYXQ0LCBmbG9hdDQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjb3B5c2lnbihmbG9hdDgsIGZsb2F0OCk7Ci1leHRlcm4gZmxvYXQxNiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjb3B5c2lnbihmbG9hdDE2LCBmbG9hdDE2KTsKLQotZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNvcyhmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNvcyhmbG9hdDIpOwotZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjb3MoZmxvYXQzKTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY29zKGZsb2F0NCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNvcyhmbG9hdDgpOwotZXh0ZXJuIGZsb2F0MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY29zKGZsb2F0MTYpOwotCi1leHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZGVncmVlcyhmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGRlZ3JlZXMoZmxvYXQyKTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZGVncmVlcyhmbG9hdDMpOwotZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBkZWdyZWVzKGZsb2F0NCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGRlZ3JlZXMoZmxvYXQ4KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGRlZ3JlZXMoZmxvYXQxNik7Ci0KLWV4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBleHAoZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBleHAoZmxvYXQyKTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZXhwKGZsb2F0Myk7Ci1leHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGV4cChmbG9hdDQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBleHAoZmxvYXQ4KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGV4cChmbG9hdDE2KTsKLQotZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGV4cDIoZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBleHAyKGZsb2F0Mik7Ci1leHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGV4cDIoZmxvYXQzKTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZXhwMihmbG9hdDQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBleHAyKGZsb2F0OCk7Ci1leHRlcm4gZmxvYXQxNiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBleHAyKGZsb2F0MTYpOwotCi1leHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZXhwMTAoZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBleHAxMChmbG9hdDIpOwotZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBleHAxMChmbG9hdDMpOwotZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBleHAxMChmbG9hdDQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBleHAxMChmbG9hdDgpOwotZXh0ZXJuIGZsb2F0MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZXhwMTAoZmxvYXQxNik7Ci0KLWV4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmYWJzKGZsb2F0KTsKLWV4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZmFicyhmbG9hdDIpOwotZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmYWJzKGZsb2F0Myk7Ci1leHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZhYnMoZmxvYXQ0KTsKLWV4dGVybiBmbG9hdDggX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZmFicyhmbG9hdDgpOwotZXh0ZXJuIGZsb2F0MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZmFicyhmbG9hdDE2KTsKLQotZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZsb29yKGZsb2F0KTsKLWV4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZmxvb3IoZmxvYXQyKTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZmxvb3IoZmxvYXQzKTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZmxvb3IoZmxvYXQ0KTsKLWV4dGVybiBmbG9hdDggX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZmxvb3IoZmxvYXQ4KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZsb29yKGZsb2F0MTYpOwotCi1leHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm1heChmbG9hdCwgZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbWF4KGZsb2F0MiwgZmxvYXQyKTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm1heChmbG9hdDMsIGZsb2F0Myk7Ci1leHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZtYXgoZmxvYXQ0LCBmbG9hdDQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbWF4KGZsb2F0OCwgZmxvYXQ4KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZtYXgoZmxvYXQxNiwgZmxvYXQxNik7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZtYXgoZmxvYXQyLCBmbG9hdCk7Ci1leHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZtYXgoZmxvYXQzLCBmbG9hdCk7Ci1leHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZtYXgoZmxvYXQ0LCBmbG9hdCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZtYXgoZmxvYXQ4LCBmbG9hdCk7Ci1leHRlcm4gZmxvYXQxNiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbWF4KGZsb2F0MTYsIGZsb2F0KTsKLQotZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZtaW4oZmxvYXQsIGZsb2F0KTsKLWV4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm1pbihmbG9hdDIsIGZsb2F0Mik7Ci1leHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZtaW4oZmxvYXQzLCBmbG9hdDMpOwotZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbWluKGZsb2F0NCwgZmxvYXQ0KTsKLWV4dGVybiBmbG9hdDggX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm1pbihmbG9hdDgsIGZsb2F0OCk7Ci1leHRlcm4gZmxvYXQxNiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbWluKGZsb2F0MTYsIGZsb2F0MTYpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbWluKGZsb2F0MiwgZmxvYXQpOwotZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbWluKGZsb2F0MywgZmxvYXQpOwotZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbWluKGZsb2F0NCwgZmxvYXQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbWluKGZsb2F0OCwgZmxvYXQpOwotZXh0ZXJuIGZsb2F0MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm1pbihmbG9hdDE2LCBmbG9hdCk7Ci0KLWV4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbW9kKGZsb2F0LCBmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZtb2QoZmxvYXQyLCBmbG9hdDIpOwotZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbW9kKGZsb2F0MywgZmxvYXQzKTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm1vZChmbG9hdDQsIGZsb2F0NCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZtb2QoZmxvYXQ4LCBmbG9hdDgpOwotZXh0ZXJuIGZsb2F0MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm1vZChmbG9hdDE2LCBmbG9hdDE2KTsKLQotZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxvZyhmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxvZyhmbG9hdDIpOwotZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBsb2coZmxvYXQzKTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbG9nKGZsb2F0NCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxvZyhmbG9hdDgpOwotZXh0ZXJuIGZsb2F0MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbG9nKGZsb2F0MTYpOwotCi1leHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbG9nMihmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxvZzIoZmxvYXQyKTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbG9nMihmbG9hdDMpOwotZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBsb2cyKGZsb2F0NCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxvZzIoZmxvYXQ4KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxvZzIoZmxvYXQxNik7Ci0KLWV4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBsb2cxMChmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxvZzEwKGZsb2F0Mik7Ci1leHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxvZzEwKGZsb2F0Myk7Ci1leHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxvZzEwKGZsb2F0NCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxvZzEwKGZsb2F0OCk7Ci1leHRlcm4gZmxvYXQxNiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBsb2cxMChmbG9hdDE2KTsKLQotZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1heChmbG9hdCwgZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtYXgoZmxvYXQyLCBmbG9hdDIpOwotZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtYXgoZmxvYXQzLCBmbG9hdDMpOwotZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtYXgoZmxvYXQ0LCBmbG9hdDQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtYXgoZmxvYXQ4LCBmbG9hdDgpOwotZXh0ZXJuIGZsb2F0MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWF4KGZsb2F0MTYsIGZsb2F0MTYpOwotCi1leHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWluKGZsb2F0LCBmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1pbihmbG9hdDIsIGZsb2F0Mik7Ci1leHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1pbihmbG9hdDMsIGZsb2F0Myk7Ci1leHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1pbihmbG9hdDQsIGZsb2F0NCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1pbihmbG9hdDgsIGZsb2F0OCk7Ci1leHRlcm4gZmxvYXQxNiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtaW4oZmxvYXQxNiwgZmxvYXQxNik7Ci0KLWV4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtaXgoZmxvYXQsIGZsb2F0LCBmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1peChmbG9hdDIsIGZsb2F0MiwgZmxvYXQyKTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWl4KGZsb2F0MywgZmxvYXQzLCBmbG9hdDMpOwotZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtaXgoZmxvYXQ0LCBmbG9hdDQsIGZsb2F0NCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1peChmbG9hdDgsIGZsb2F0OCwgZmxvYXQ4KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1peChmbG9hdDE2LCBmbG9hdDE2LCBmbG9hdDE2KTsKLWV4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtaXgoZmxvYXQsIGZsb2F0LCBmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1peChmbG9hdDIsIGZsb2F0MiwgZmxvYXQpOwotZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtaXgoZmxvYXQzLCBmbG9hdDMsIGZsb2F0KTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWl4KGZsb2F0NCwgZmxvYXQ0LCBmbG9hdCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1peChmbG9hdDgsIGZsb2F0OCwgZmxvYXQpOwotZXh0ZXJuIGZsb2F0MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWl4KGZsb2F0MTYsIGZsb2F0MTYsIGZsb2F0KTsKLQotZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHBvdyhmbG9hdCwgZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBwb3coZmxvYXQyLCBmbG9hdDIpOwotZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBwb3coZmxvYXQzLCBmbG9hdDMpOwotZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBwb3coZmxvYXQ0LCBmbG9hdDQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBwb3coZmxvYXQ4LCBmbG9hdDgpOwotZXh0ZXJuIGZsb2F0MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcG93KGZsb2F0MTYsIGZsb2F0MTYpOwotCi1leHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcmFkaWFucyhmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJhZGlhbnMoZmxvYXQyKTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcmFkaWFucyhmbG9hdDMpOwotZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByYWRpYW5zKGZsb2F0NCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJhZGlhbnMoZmxvYXQ4KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJhZGlhbnMoZmxvYXQxNik7Ci0KLWV4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByaW50KGZsb2F0KTsKLWV4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcmludChmbG9hdDIpOwotZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByaW50KGZsb2F0Myk7Ci1leHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJpbnQoZmxvYXQ0KTsKLWV4dGVybiBmbG9hdDggX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcmludChmbG9hdDgpOwotZXh0ZXJuIGZsb2F0MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcmludChmbG9hdDE2KTsKLQotZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJvdW5kKGZsb2F0KTsKLWV4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcm91bmQoZmxvYXQyKTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcm91bmQoZmxvYXQzKTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcm91bmQoZmxvYXQ0KTsKLWV4dGVybiBmbG9hdDggX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcm91bmQoZmxvYXQ4KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJvdW5kKGZsb2F0MTYpOwotCi1leHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcnNxcnQoZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByc3FydChmbG9hdDIpOwotZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByc3FydChmbG9hdDMpOwotZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByc3FydChmbG9hdDQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByc3FydChmbG9hdDgpOwotZXh0ZXJuIGZsb2F0MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcnNxcnQoZmxvYXQxNik7Ci0KLWV4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBzaWduKGZsb2F0KTsKLWV4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgc2lnbihmbG9hdDIpOwotZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBzaWduKGZsb2F0Myk7Ci1leHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHNpZ24oZmxvYXQ0KTsKLWV4dGVybiBmbG9hdDggX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgc2lnbihmbG9hdDgpOwotZXh0ZXJuIGZsb2F0MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgc2lnbihmbG9hdDE2KTsKLQotZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHNpbihmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHNpbihmbG9hdDIpOwotZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBzaW4oZmxvYXQzKTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgc2luKGZsb2F0NCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHNpbihmbG9hdDgpOwotZXh0ZXJuIGZsb2F0MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgc2luKGZsb2F0MTYpOwotCi1leHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgc3FydChmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHNxcnQoZmxvYXQyKTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgc3FydChmbG9hdDMpOwotZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBzcXJ0KGZsb2F0NCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHNxcnQoZmxvYXQ4KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHNxcnQoZmxvYXQxNik7Ci0KLWV4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSB0YW4oZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSB0YW4oZmxvYXQyKTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgdGFuKGZsb2F0Myk7Ci1leHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHRhbihmbG9hdDQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSB0YW4oZmxvYXQ4KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHRhbihmbG9hdDE2KTsKLQotZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHRydW5jKGZsb2F0KTsKLWV4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgdHJ1bmMoZmxvYXQyKTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgdHJ1bmMoZmxvYXQzKTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgdHJ1bmMoZmxvYXQ0KTsKLWV4dGVybiBmbG9hdDggX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgdHJ1bmMoZmxvYXQ4KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHRydW5jKGZsb2F0MTYpOworZXh0ZXJuIGJvb2wgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0lzT2JqZWN0KHJzX2VsZW1lbnQpOworZXh0ZXJuIGJvb2wgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0lzT2JqZWN0KHJzX3R5cGUpOworZXh0ZXJuIGJvb2wgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0lzT2JqZWN0KHJzX2FsbG9jYXRpb24pOworZXh0ZXJuIGJvb2wgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0lzT2JqZWN0KHJzX3NhbXBsZXIpOworZXh0ZXJuIGJvb2wgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0lzT2JqZWN0KHJzX3NjcmlwdCk7CitleHRlcm4gYm9vbCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzSXNPYmplY3QocnNfbWVzaCk7CitleHRlcm4gYm9vbCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzSXNPYmplY3QocnNfcHJvZ3JhbV9mcmFnbWVudCk7CitleHRlcm4gYm9vbCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzSXNPYmplY3QocnNfcHJvZ3JhbV92ZXJ0ZXgpOworZXh0ZXJuIGJvb2wgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0lzT2JqZWN0KHJzX3Byb2dyYW1fcmFzdGVyKTsKK2V4dGVybiBib29sIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNJc09iamVjdChyc19wcm9ncmFtX3N0b3JlKTsKK2V4dGVybiBib29sIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNJc09iamVjdChyc19mb250KTsKIAogCiAKKy8vIEFsbG9jYXRpb25zCisKKy8vIFJldHVybiB0aGUgcnNfYWxsb2NhdGlvbiBhc3NvY2lhdGVkIHdpdGggYSBib3VuZCBkYXRhCisvLyBwb2ludGVyLgorZXh0ZXJuIHJzX2FsbG9jYXRpb24gX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0dldEFsbG9jYXRpb24oY29uc3Qgdm9pZCAqKTsKKworLy8gUmV0dXJuIHRoZSBkaW1lbnNpb25zIGFzc29jaWF0ZWQgd2l0aCBhbiBhbGxvY2F0aW9uLgorZXh0ZXJuIHVpbnQzMl90IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNBbGxvY2F0aW9uR2V0RGltWChyc19hbGxvY2F0aW9uKTsKK2V4dGVybiB1aW50MzJfdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvbkdldERpbVkocnNfYWxsb2NhdGlvbik7CitleHRlcm4gdWludDMyX3QgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0FsbG9jYXRpb25HZXREaW1aKHJzX2FsbG9jYXRpb24pOworZXh0ZXJuIHVpbnQzMl90IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNBbGxvY2F0aW9uR2V0RGltTE9EKHJzX2FsbG9jYXRpb24pOworZXh0ZXJuIHVpbnQzMl90IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNBbGxvY2F0aW9uR2V0RGltRmFjZXMocnNfYWxsb2NhdGlvbik7CisKKy8vIEV4dHJhY3QgYSBzaW5nbGUgZWxlbWVudCBmcm9tIGFuIGFsbG9jYXRpb24uCitleHRlcm4gY29uc3Qgdm9pZCAqIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNHZXRFbGVtZW50QXQocnNfYWxsb2NhdGlvbiwgdWludDMyX3QgeCk7CitleHRlcm4gY29uc3Qgdm9pZCAqIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNHZXRFbGVtZW50QXQocnNfYWxsb2NhdGlvbiwgdWludDMyX3QgeCwgdWludDMyX3QgeSk7CitleHRlcm4gY29uc3Qgdm9pZCAqIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNHZXRFbGVtZW50QXQocnNfYWxsb2NhdGlvbiwgdWludDMyX3QgeCwgdWludDMyX3QgeSwgdWludDMyX3Qgeik7CisKKy8vIFJldHVybiBhIHJhbmRvbSB2YWx1ZSBiZXR3ZWVuIDAgKG9yIG1pbl92YWx1ZSkgYW5kIG1heF9tYWx1ZS4KK2V4dGVybiBpbnQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc1JhbmQoaW50IG1heF92YWx1ZSk7CitleHRlcm4gaW50IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNSYW5kKGludCBtaW5fdmFsdWUsIGludCBtYXhfdmFsdWUpOworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNSYW5kKGZsb2F0IG1heF92YWx1ZSk7CitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc1JhbmQoZmxvYXQgbWluX3ZhbHVlLCBmbG9hdCBtYXhfdmFsdWUpOworCisvLyByZXR1cm4gdGhlIGZyYWN0aW9uYWwgcGFydCBvZiBhIGZsb2F0CisvLyBtaW4odiAtICgoaW50KWZsb29yKHYpKSwgMHgxLmZmZmZmZXAtMWYpOworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNGcmFjKGZsb2F0KTsKKworLy8gdGltZQorZXh0ZXJuIGludDMyX3QgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc1NlY29uZCh2b2lkKTsKK2V4dGVybiBpbnQzMl90IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNNaW51dGUodm9pZCk7CitleHRlcm4gaW50MzJfdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzSG91cih2b2lkKTsKK2V4dGVybiBpbnQzMl90IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNEYXkodm9pZCk7CitleHRlcm4gaW50MzJfdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzTW9udGgodm9pZCk7CitleHRlcm4gaW50MzJfdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzWWVhcih2b2lkKTsKKworLy8gUmV0dXJuIHRoZSBjdXJyZW50IHN5c3RlbSBjbG9jayBpbiBtaWxsaXNlY29uZHMKK2V4dGVybiBpbnQ2NF90IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNVcHRpbWVNaWxsaXModm9pZCk7CisKKy8vIFJldHVybiB0aGUgY3VycmVudCBzeXN0ZW0gY2xvY2sgaW4gbmFub3NlY29uZHMKK2V4dGVybiBpbnQ2NF90IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNVcHRpbWVOYW5vcyh2b2lkKTsKKworLy8gUmV0dXJuIHRoZSB0aW1lIGluIHNlY29uZHMgc2luY2UgZnVuY3Rpb24gd2FzIGxhc3QgY2FsbGVkIGluIHRoaXMgc2NyaXB0LgorZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNHZXREdCh2b2lkKTsKKworLy8gU2VuZCBhIG1lc3NhZ2UgYmFjayB0byB0aGUgY2xpZW50LiAgV2lsbCBub3QgYmxvY2sgYW5kIHJldHVybnMgdHJ1ZQorLy8gaWYgdGhlIG1lc3NhZ2Ugd2FzIHNlbmRhYmxlIGFuZCBmYWxzZSBpZiB0aGUgZmlmbyB3YXMgZnVsbC4KKy8vIEEgbWVzc2FnZSBJRCBpcyByZXF1aXJlZC4gIERhdGEgcGF5bG9hZCBpcyBvcHRpb25hbC4KK2V4dGVybiBib29sIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNTZW5kVG9DbGllbnQoaW50IGNtZElEKTsKK2V4dGVybiBib29sIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNTZW5kVG9DbGllbnQoaW50IGNtZElELCBjb25zdCB2b2lkICpkYXRhLCB1aW50IGxlbik7CisKKy8vIFNlbmQgYSBtZXNzYWdlIGJhY2sgdG8gdGhlIGNsaWVudCwgYmxvY2tpbmcgdW50aWwgdGhlIG1lc3NhZ2UgaXMgcXVldWVkLgorLy8gQSBtZXNzYWdlIElEIGlzIHJlcXVpcmVkLiAgRGF0YSBwYXlsb2FkIGlzIG9wdGlvbmFsLgorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc1NlbmRUb0NsaWVudEJsb2NraW5nKGludCBjbWRJRCk7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzU2VuZFRvQ2xpZW50QmxvY2tpbmcoaW50IGNtZElELCBjb25zdCB2b2lkICpkYXRhLCB1aW50IGxlbik7CiAKIAorLy8gU2NyaXB0IHRvIFNjcmlwdAorZW51bSByc19mb3JfZWFjaF9zdHJhdGVneSB7CisgICAgUlNfRk9SX0VBQ0hfU1RSQVRFR1lfU0VSSUFMLAorICAgIFJTX0ZPUl9FQUNIX1NUUkFURUdZX0RPTlRfQ0FSRSwKKyAgICBSU19GT1JfRUFDSF9TVFJBVEVHWV9EU1RfTElORUFSLAorICAgIFJTX0ZPUl9FQUNIX1NUUkFURUdZX1RJTEVfU01BTEwsCisgICAgUlNfRk9SX0VBQ0hfU1RSQVRFR1lfVElMRV9NRURJVU0sCisgICAgUlNfRk9SX0VBQ0hfU1RSQVRFR1lfVElMRV9MQVJHRQorfTsKIAotLy8gSW50IG9wcwordHlwZWRlZiBzdHJ1Y3QgcnNfc2NyaXB0X2NhbGwgeworICAgIGVudW0gcnNfZm9yX2VhY2hfc3RyYXRlZ3kgc3RyYXRlZ3k7CisgICAgdWludDMyX3QgeFN0YXJ0OworICAgIHVpbnQzMl90IHhFbmQ7CisgICAgdWludDMyX3QgeVN0YXJ0OworICAgIHVpbnQzMl90IHlFbmQ7CisgICAgdWludDMyX3QgelN0YXJ0OworICAgIHVpbnQzMl90IHpFbmQ7CisgICAgdWludDMyX3QgYXJyYXlTdGFydDsKKyAgICB1aW50MzJfdCBhcnJheUVuZDsKK30gcnNfc2NyaXB0X2NhbGxfdDsKIAotZXh0ZXJuIGludCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhYnMoaW50KTsKLWV4dGVybiBpbnQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGFicyhpbnQyKTsKLWV4dGVybiBpbnQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGFicyhpbnQzKTsKLWV4dGVybiBpbnQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGFicyhpbnQ0KTsKLWV4dGVybiBpbnQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGFicyhpbnQ4KTsKLWV4dGVybiBpbnQxNiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhYnMoaW50MTYpOworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0ZvckVhY2gocnNfc2NyaXB0IHNjcmlwdCwgcnNfYWxsb2NhdGlvbiBpbnB1dCwKKyAgICAgICAgICAgICAgcnNfYWxsb2NhdGlvbiBvdXRwdXQsIGNvbnN0IHZvaWQgKiB1c3JEYXRhKTsKIAorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0ZvckVhY2gocnNfc2NyaXB0IHNjcmlwdCwgcnNfYWxsb2NhdGlvbiBpbnB1dCwKKyAgICAgICAgICAgICAgcnNfYWxsb2NhdGlvbiBvdXRwdXQsIGNvbnN0IHZvaWQgKiB1c3JEYXRhLAorICAgICAgICAgICAgICBjb25zdCByc19zY3JpcHRfY2FsbF90ICopOwogCi0KLS8qCi1leHRlcm4gZmxvYXQgbW9kZihmbG9hdCwgZmxvYXQpOwotZXh0ZXJuIGZsb2F0IHJhbmRmKGZsb2F0KTsKLWV4dGVybiBmbG9hdCByYW5kZjIoZmxvYXQsIGZsb2F0KTsKLWV4dGVybiBmbG9hdCBmcmFjZihmbG9hdCk7Ci1leHRlcm4gZmxvYXQgbGVycGYoZmxvYXQsIGZsb2F0LCBmbG9hdCk7Ci1leHRlcm4gZmxvYXQgbWFwZihmbG9hdCwgZmxvYXQsIGZsb2F0LCBmbG9hdCwgZmxvYXQpOwotKi8KLQorI2VuZGlmCmRpZmYgLS1naXQgYS9saWJzL3JzL3NjcmlwdGMvcnNfdHlwZXMucnNoIGIvbGlicy9ycy9zY3JpcHRjL3JzX3R5cGVzLnJzaAppbmRleCA0MTk4YTc0Li5kZDQyOTcyIDEwMDY0NAotLS0gYS9saWJzL3JzL3NjcmlwdGMvcnNfdHlwZXMucnNoCisrKyBiL2xpYnMvcnMvc2NyaXB0Yy9yc190eXBlcy5yc2gKQEAgLTIsNzAgKzIsNzMgQEAKIHR5cGVkZWYgY2hhciBpbnQ4X3Q7CiB0eXBlZGVmIHNob3J0IGludDE2X3Q7CiB0eXBlZGVmIGludCBpbnQzMl90OwotLy90eXBlZGVmIGxvbmcgaW50NjRfdDsKK3R5cGVkZWYgbG9uZyBsb25nIGludDY0X3Q7CiAKIHR5cGVkZWYgdW5zaWduZWQgY2hhciB1aW50OF90OwogdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCB1aW50MTZfdDsKIHR5cGVkZWYgdW5zaWduZWQgaW50IHVpbnQzMl90OwotLy90eXBlZGVmIGxvbmcgdWludDY0X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyB1aW50NjRfdDsKIAogdHlwZWRlZiB1aW50OF90IHVjaGFyOwogdHlwZWRlZiB1aW50MTZfdCB1c2hvcnQ7CiB0eXBlZGVmIHVpbnQzMl90IHVpbnQ7Ci0vL3R5cGVkZWYgdWludDY0X3QgdWxvbmc7Cit0eXBlZGVmIHVpbnQ2NF90IHVsb25nOwogCi10eXBlZGVmIGludCByc19lbGVtZW50OwotdHlwZWRlZiBpbnQgcnNfdHlwZTsKLXR5cGVkZWYgaW50IHJzX2FsbG9jYXRpb247Ci10eXBlZGVmIGludCByc19zYW1wbGVyOwotdHlwZWRlZiBpbnQgcnNfc2NyaXB0OwotdHlwZWRlZiBpbnQgcnNfbWVzaDsKLXR5cGVkZWYgaW50IHJzX3Byb2dyYW1fZnJhZ21lbnQ7Ci10eXBlZGVmIGludCByc19wcm9ncmFtX3ZlcnRleDsKLXR5cGVkZWYgaW50IHJzX3Byb2dyYW1fcmFzdGVyOwotdHlwZWRlZiBpbnQgcnNfcHJvZ3JhbV9zdG9yZTsKK3R5cGVkZWYgc3RydWN0IHsgY29uc3QgaW50KiBjb25zdCBwOyB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCwgYWxpZ25lZCg0KSkpIHJzX2VsZW1lbnQ7Cit0eXBlZGVmIHN0cnVjdCB7IGNvbnN0IGludCogY29uc3QgcDsgfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQsIGFsaWduZWQoNCkpKSByc190eXBlOwordHlwZWRlZiBzdHJ1Y3QgeyBjb25zdCBpbnQqIGNvbnN0IHA7IH0gX19hdHRyaWJ1dGVfXygocGFja2VkLCBhbGlnbmVkKDQpKSkgcnNfYWxsb2NhdGlvbjsKK3R5cGVkZWYgc3RydWN0IHsgY29uc3QgaW50KiBjb25zdCBwOyB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCwgYWxpZ25lZCg0KSkpIHJzX3NhbXBsZXI7Cit0eXBlZGVmIHN0cnVjdCB7IGNvbnN0IGludCogY29uc3QgcDsgfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQsIGFsaWduZWQoNCkpKSByc19zY3JpcHQ7Cit0eXBlZGVmIHN0cnVjdCB7IGNvbnN0IGludCogY29uc3QgcDsgfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQsIGFsaWduZWQoNCkpKSByc19tZXNoOwordHlwZWRlZiBzdHJ1Y3QgeyBjb25zdCBpbnQqIGNvbnN0IHA7IH0gX19hdHRyaWJ1dGVfXygocGFja2VkLCBhbGlnbmVkKDQpKSkgcnNfcHJvZ3JhbV9mcmFnbWVudDsKK3R5cGVkZWYgc3RydWN0IHsgY29uc3QgaW50KiBjb25zdCBwOyB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCwgYWxpZ25lZCg0KSkpIHJzX3Byb2dyYW1fdmVydGV4OwordHlwZWRlZiBzdHJ1Y3QgeyBjb25zdCBpbnQqIGNvbnN0IHA7IH0gX19hdHRyaWJ1dGVfXygocGFja2VkLCBhbGlnbmVkKDQpKSkgcnNfcHJvZ3JhbV9yYXN0ZXI7Cit0eXBlZGVmIHN0cnVjdCB7IGNvbnN0IGludCogY29uc3QgcDsgfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQsIGFsaWduZWQoNCkpKSByc19wcm9ncmFtX3N0b3JlOwordHlwZWRlZiBzdHJ1Y3QgeyBjb25zdCBpbnQqIGNvbnN0IHA7IH0gX19hdHRyaWJ1dGVfXygocGFja2VkLCBhbGlnbmVkKDQpKSkgcnNfZm9udDsKKwogCiB0eXBlZGVmIGZsb2F0IGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoMikpKTsKIHR5cGVkZWYgZmxvYXQgZmxvYXQzIF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSgzKSkpOwogdHlwZWRlZiBmbG9hdCBmbG9hdDQgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDQpKSk7Ci10eXBlZGVmIGZsb2F0IGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoOCkpKTsKLXR5cGVkZWYgZmxvYXQgZmxvYXQxNiBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoMTYpKSk7CiAKIHR5cGVkZWYgdWNoYXIgdWNoYXIyIF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSgyKSkpOwogdHlwZWRlZiB1Y2hhciB1Y2hhcjMgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDMpKSk7CiB0eXBlZGVmIHVjaGFyIHVjaGFyNCBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoNCkpKTsKLXR5cGVkZWYgdWNoYXIgdWNoYXI4IF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSg4KSkpOwotdHlwZWRlZiB1Y2hhciB1Y2hhcjE2IF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSgxNikpKTsKIAogdHlwZWRlZiB1c2hvcnQgdXNob3J0MiBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoMikpKTsKIHR5cGVkZWYgdXNob3J0IHVzaG9ydDMgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDMpKSk7CiB0eXBlZGVmIHVzaG9ydCB1c2hvcnQ0IF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSg0KSkpOwotdHlwZWRlZiB1c2hvcnQgdXNob3J0OCBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoOCkpKTsKLXR5cGVkZWYgdXNob3J0IHVzaG9ydDE2IF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSgxNikpKTsKIAogdHlwZWRlZiB1aW50IHVpbnQyIF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSgyKSkpOwogdHlwZWRlZiB1aW50IHVpbnQzIF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSgzKSkpOwogdHlwZWRlZiB1aW50IHVpbnQ0IF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSg0KSkpOwotdHlwZWRlZiB1aW50IHVpbnQ4IF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSg4KSkpOwotdHlwZWRlZiB1aW50IHVpbnQxNiBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoMTYpKSk7CiAKIHR5cGVkZWYgY2hhciBjaGFyMiBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoMikpKTsKIHR5cGVkZWYgY2hhciBjaGFyMyBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoMykpKTsKIHR5cGVkZWYgY2hhciBjaGFyNCBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoNCkpKTsKLXR5cGVkZWYgY2hhciBjaGFyOCBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoOCkpKTsKLXR5cGVkZWYgY2hhciBjaGFyMTYgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDE2KSkpOwogCiB0eXBlZGVmIHNob3J0IHNob3J0MiBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoMikpKTsKIHR5cGVkZWYgc2hvcnQgc2hvcnQzIF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSgzKSkpOwogdHlwZWRlZiBzaG9ydCBzaG9ydDQgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDQpKSk7Ci10eXBlZGVmIHNob3J0IHNob3J0OCBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoOCkpKTsKLXR5cGVkZWYgc2hvcnQgc2hvcnQxNiBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoMTYpKSk7CiAKIHR5cGVkZWYgaW50IGludDIgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDIpKSk7CiB0eXBlZGVmIGludCBpbnQzIF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSgzKSkpOwogdHlwZWRlZiBpbnQgaW50NCBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoNCkpKTsKLXR5cGVkZWYgaW50IGludDggX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDgpKSk7Ci10eXBlZGVmIGludCBpbnQxNiBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoMTYpKSk7CiAKIAordHlwZWRlZiBzdHJ1Y3QgeworICAgIGZsb2F0IG1bMTZdOworfSByc19tYXRyaXg0eDQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBmbG9hdCBtWzldOworfSByc19tYXRyaXgzeDM7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBmbG9hdCBtWzRdOworfSByc19tYXRyaXgyeDI7CisKK3R5cGVkZWYgZmxvYXQ0IHJzX3F1YXRlcm5pb247CisKKyNkZWZpbmUgUlNfUEFDS0VEIF9fYXR0cmlidXRlX18oKHBhY2tlZCwgYWxpZ25lZCg0KSkpCiAKZGlmZiAtLWdpdCBhL2xpYnMvc3VyZmFjZWZsaW5nZXJfY2xpZW50L1NoYXJlZEJ1ZmZlclN0YWNrLmNwcCBiL2xpYnMvc3VyZmFjZWZsaW5nZXJfY2xpZW50L1NoYXJlZEJ1ZmZlclN0YWNrLmNwcAppbmRleCA0YWQ5Zjg2Li40YzAxY2QyIDEwMDY0NAotLS0gYS9saWJzL3N1cmZhY2VmbGluZ2VyX2NsaWVudC9TaGFyZWRCdWZmZXJTdGFjay5jcHAKKysrIGIvbGlicy9zdXJmYWNlZmxpbmdlcl9jbGllbnQvU2hhcmVkQnVmZmVyU3RhY2suY3BwCkBAIC0zNzIsMTEgKzM3Miw2IEBACiB7CiAgICAgU2hhcmVkQnVmZmVyU3RhY2smIHN0YWNrKCAqbVNoYXJlZFN0YWNrICk7CiAKLSAgICBpZiAoc3RhY2suaGVhZCA9PSB0YWlsICYmIHN0YWNrLmF2YWlsYWJsZSA9PSBtTnVtQnVmZmVycykgewotICAgICAgICBMT0dXKCJkZXF1ZXVlOiB0YWlsPSVkLCBoZWFkPSVkLCBhdmFpbD0lZCwgcXVldWVkPSVkIiwKLSAgICAgICAgICAgICAgICB0YWlsLCBzdGFjay5oZWFkLCBzdGFjay5hdmFpbGFibGUsIHN0YWNrLnF1ZXVlZCk7Ci0gICAgfQotCiAgICAgUldMb2NrOjpBdXRvUkxvY2sgX3JkKG1Mb2NrKTsKIAogICAgIGNvbnN0IG5zZWNzX3QgZGVxdWV1ZVRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7CmRpZmYgLS1naXQgYS9saWJzL3N1cmZhY2VmbGluZ2VyX2NsaWVudC9TdXJmYWNlLmNwcCBiL2xpYnMvc3VyZmFjZWZsaW5nZXJfY2xpZW50L1N1cmZhY2UuY3BwCmluZGV4IGNiNzYwOTEuLjJiYzVmYWQgMTAwNjQ0Ci0tLSBhL2xpYnMvc3VyZmFjZWZsaW5nZXJfY2xpZW50L1N1cmZhY2UuY3BwCisrKyBiL2xpYnMvc3VyZmFjZWZsaW5nZXJfY2xpZW50L1N1cmZhY2UuY3BwCkBAIC0zNjMsNiArMzYzLDEzIEBACiAgICAgICAgIGhlaWdodCAgID0gc3VyZmFjZS0+bUhlaWdodDsKICAgICAgICAgZm9ybWF0ICAgPSBzdXJmYWNlLT5tRm9ybWF0OwogICAgICAgICBmbGFncyAgICA9IHN1cmZhY2UtPm1GbGFnczsKKyAgICB9IGVsc2UgaWYgKHN1cmZhY2UgIT0gMCAmJiBzdXJmYWNlLT5tU3VyZmFjZSAhPSAwKSB7CisgICAgICAgIExPR1coIlBhcmNlbGluZyBpbnZhbGlkIHN1cmZhY2Ugd2l0aCBub24tTlVMTCBJU3VyZmFjZSBhcyBOVUxMOiAiCisgICAgICAgICAgICAgIm1TdXJmYWNlID0gJXAsIG1JZGVudGl0eSA9ICVkLCBtV2lkdGggPSAlZCwgbUhlaWdodCA9ICVkLCAiCisgICAgICAgICAgICAgIm1Gb3JtYXQgPSAlZCwgbUZsYWdzID0gMHglMDh4LCBtSW5pdENoZWNrID0gJWQiLAorICAgICAgICAgICAgIHN1cmZhY2UtPm1TdXJmYWNlLmdldCgpLCBzdXJmYWNlLT5tSWRlbnRpdHksIHN1cmZhY2UtPm1XaWR0aCwKKyAgICAgICAgICAgICBzdXJmYWNlLT5tSGVpZ2h0LCBzdXJmYWNlLT5tRm9ybWF0LCBzdXJmYWNlLT5tRmxhZ3MsCisgICAgICAgICAgICAgc3VyZmFjZS0+bUluaXRDaGVjayk7CiAgICAgfQogICAgIHBhcmNlbC0+d3JpdGVTdHJvbmdCaW5kZXIoc3VyIT0wID8gc3VyLT5hc0JpbmRlcigpIDogTlVMTCk7CiAgICAgcGFyY2VsLT53cml0ZUludDMyKGlkZW50aXR5KTsKQEAgLTQzNiw2ICs0NDMsOSBAQAogICAgICAgICAgICAgbVNoYXJlZEJ1ZmZlckNsaWVudCA9IG5ldyBTaGFyZWRCdWZmZXJDbGllbnQoCiAgICAgICAgICAgICAgICAgICAgIG1DbGllbnQuZ2V0U2hhcmVkQ2xpZW50KCksIHRva2VuLCAyLCBtSWRlbnRpdHkpOwogICAgICAgICAgICAgbUluaXRDaGVjayA9IG1DbGllbnQuZ2V0U2hhcmVkQ2xpZW50KCktPnZhbGlkYXRlKHRva2VuKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExPR1coIk5vdCBpbml0aWFsaXppbmcgdGhlIHNoYXJlZCBidWZmZXIgY2xpZW50IGJlY2F1c2UgdG9rZW4gPSAlZCIsCisgICAgICAgICAgICAgICAgICAgIHRva2VuKTsKICAgICAgICAgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYnMvdXRpbHMvUmVzb3VyY2VUeXBlcy5jcHAgYi9saWJzL3V0aWxzL1Jlc291cmNlVHlwZXMuY3BwCmluZGV4IGExNDAxYWQuLjQzNjJkMTQgMTAwNjQ0Ci0tLSBhL2xpYnMvdXRpbHMvUmVzb3VyY2VUeXBlcy5jcHAKKysrIGIvbGlicy91dGlscy9SZXNvdXJjZVR5cGVzLmNwcApAQCAtMzE3LDYgKzMxNywxMiBAQAogICAgICAgICAgICAgbVN0cmluZ1Bvb2xTaXplID0KICAgICAgICAgICAgICAgICAobUhlYWRlci0+aGVhZGVyLnNpemUtbUhlYWRlci0+c3RyaW5nc1N0YXJ0KS9jaGFyU2l6ZTsKICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIGNoZWNrIGludmFyaWFudDogc3R5bGVzIHN0YXJ0cyBiZWZvcmUgZW5kIG9mIGRhdGEKKyAgICAgICAgICAgIGlmIChtSGVhZGVyLT5zdHlsZXNTdGFydCA+PSAobUhlYWRlci0+aGVhZGVyLnNpemUtc2l6ZW9mKHVpbnQxNl90KSkpIHsKKyAgICAgICAgICAgICAgICBMT0dXKCJCYWQgc3R5bGUgYmxvY2s6IHN0eWxlIGJsb2NrIHN0YXJ0cyBhdCAlZCBwYXN0IGRhdGEgc2l6ZSBvZiAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgKGludCltSGVhZGVyLT5zdHlsZXNTdGFydCwgKGludCltSGVhZGVyLT5oZWFkZXIuc2l6ZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIChtRXJyb3I9QkFEX1RZUEUpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gY2hlY2sgaW52YXJpYW50OiBzdHlsZXMgZm9sbG93IHRoZSBzdHJpbmdzCiAgICAgICAgICAgICBpZiAobUhlYWRlci0+c3R5bGVzU3RhcnQgPD0gbUhlYWRlci0+c3RyaW5nc1N0YXJ0KSB7CiAgICAgICAgICAgICAgICAgTE9HVygiQmFkIHN0eWxlIGJsb2NrOiBzdHlsZSBibG9jayBzdGFydHMgYXQgJWQsIGJlZm9yZSBzdHJpbmdzIGF0ICVkXG4iLApAQCAtMTg3OCw2ICsxODg0LDEyIEBACiAgICAgICAgIG91dE5hbWUtPnR5cGUgPSBncnAtPmJhc2VQYWNrYWdlLT50eXBlU3RyaW5ncy5zdHJpbmdBdCh0LCAmb3V0TmFtZS0+dHlwZUxlbik7CiAgICAgICAgIG91dE5hbWUtPm5hbWUgPSBncnAtPmJhc2VQYWNrYWdlLT5rZXlTdHJpbmdzLnN0cmluZ0F0KAogICAgICAgICAgICAgZHRvaGwoZW50cnktPmtleS5pbmRleCksICZvdXROYW1lLT5uYW1lTGVuKTsKKworICAgICAgICAvLyBJZiB3ZSBoYXZlIGEgYmFkIGluZGV4IGZvciBzb21lIHJlYXNvbiwgd2Ugc2hvdWxkIGFib3J0LgorICAgICAgICBpZiAob3V0TmFtZS0+dHlwZSA9PSBOVUxMIHx8IG91dE5hbWUtPm5hbWUgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCkBAIC0yNjA5LDYgKzI2MjEsMjQgQEAKICAgICAgICAgKm91dFR5cGUgPSAqZGVmVHlwZTsKICAgICB9CiAgICAgKm91dE5hbWUgPSBTdHJpbmcxNihwLCBlbmQtcCk7CisgICAgaWYoKipvdXRQYWNrYWdlID09IDApIHsKKyAgICAgICAgaWYob3V0RXJyb3JNc2cpIHsKKyAgICAgICAgICAgICpvdXRFcnJvck1zZyA9ICJSZXNvdXJjZSBwYWNrYWdlIGNhbm5vdCBiZSBhbiBlbXB0eSBzdHJpbmciOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYoKipvdXRUeXBlID09IDApIHsKKyAgICAgICAgaWYob3V0RXJyb3JNc2cpIHsKKyAgICAgICAgICAgICpvdXRFcnJvck1zZyA9ICJSZXNvdXJjZSB0eXBlIGNhbm5vdCBiZSBhbiBlbXB0eSBzdHJpbmciOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYoKipvdXROYW1lID09IDApIHsKKyAgICAgICAgaWYob3V0RXJyb3JNc2cpIHsKKyAgICAgICAgICAgICpvdXRFcnJvck1zZyA9ICJSZXNvdXJjZSBpZCBjYW5ub3QgYmUgYW4gZW1wdHkgc3RyaW5nIjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQogICAgIHJldHVybiB0cnVlOwogfQogCkBAIC00MTI3LDEzICs0MTU3LDE2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICgweDAwZmYwMDAwICYgKCh0eXBlSW5kZXgrMSk8PDE2KSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKDB4MDAwMGZmZmYgJiAoZW50cnlJbmRleCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VfbmFtZSByZXNOYW1lOwotICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+Z2V0UmVzb3VyY2VOYW1lKHJlc0lELCAmcmVzTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIiAgICAgIHNwZWMgcmVzb3VyY2UgMHglMDh4ICVzOiVzLyVzOiBmbGFncz0weCUwOHhcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBUjE2X1RPX0NTVFIocmVzTmFtZS5wYWNrYWdlLCByZXNOYW1lLnBhY2thZ2VMZW4pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIQVIxNl9UT19DU1RSKHJlc05hbWUudHlwZSwgcmVzTmFtZS50eXBlTGVuKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEFSMTZfVE9fQ1NUUihyZXNOYW1lLm5hbWUsIHJlc05hbWUubmFtZUxlbiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHRvaGwodHlwZUNvbmZpZ3MtPnR5cGVTcGVjRmxhZ3NbZW50cnlJbmRleF0pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLT5nZXRSZXNvdXJjZU5hbWUocmVzSUQsICZyZXNOYW1lKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiICAgICAgc3BlYyByZXNvdXJjZSAweCUwOHggJXM6JXMvJXM6IGZsYWdzPTB4JTA4eFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIQVIxNl9UT19DU1RSKHJlc05hbWUucGFja2FnZSwgcmVzTmFtZS5wYWNrYWdlTGVuKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBUjE2X1RPX0NTVFIocmVzTmFtZS50eXBlLCByZXNOYW1lLnR5cGVMZW4pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEFSMTZfVE9fQ1NUUihyZXNOYW1lLm5hbWUsIHJlc05hbWUubmFtZUxlbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR0b2hsKHR5cGVDb25maWdzLT50eXBlU3BlY0ZsYWdzW2VudHJ5SW5kZXhdKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiICAgICAgSU5WQUxJRCBUWVBFIENPTkZJRyBGT1IgUkVTT1VSQ0UgMHglMDh4XG4iLCByZXNJRCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgY29uZmlnSW5kZXg9MDsgY29uZmlnSW5kZXg8TlRDOyBjb25maWdJbmRleCsrKSB7CkBAIC00MzQwLDExICs0MzczLDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICgweDAwZmYwMDAwICYgKCh0eXBlSW5kZXgrMSk8PDE2KSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKDB4MDAwMGZmZmYgJiAoZW50cnlJbmRleCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VfbmFtZSByZXNOYW1lOwotICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+Z2V0UmVzb3VyY2VOYW1lKHJlc0lELCAmcmVzTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIiAgICAgICAgcmVzb3VyY2UgMHglMDh4ICVzOiVzLyVzOiAiLCByZXNJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBUjE2X1RPX0NTVFIocmVzTmFtZS5wYWNrYWdlLCByZXNOYW1lLnBhY2thZ2VMZW4pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEFSMTZfVE9fQ1NUUihyZXNOYW1lLnR5cGUsIHJlc05hbWUudHlwZUxlbiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIQVIxNl9UT19DU1RSKHJlc05hbWUubmFtZSwgcmVzTmFtZS5uYW1lTGVuKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy0+Z2V0UmVzb3VyY2VOYW1lKHJlc0lELCAmcmVzTmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIiAgICAgICAgcmVzb3VyY2UgMHglMDh4ICVzOiVzLyVzOiAiLCByZXNJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIQVIxNl9UT19DU1RSKHJlc05hbWUucGFja2FnZSwgcmVzTmFtZS5wYWNrYWdlTGVuKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIQVIxNl9UT19DU1RSKHJlc05hbWUudHlwZSwgcmVzTmFtZS50eXBlTGVuKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIQVIxNl9UT19DU1RSKHJlc05hbWUubmFtZSwgcmVzTmFtZS5uYW1lTGVuKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiICAgICAgICBJTlZBTElEIFJFU09VUkNFIDB4JTA4eDogIiwgcmVzSUQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh0aGlzT2Zmc2V0JjB4MykgIT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiTk9OLUlOVEVHRVIgT0ZGU0VUOiAlcFxuIiwgKHZvaWQqKXRoaXNPZmZzZXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwpAQCAtNDQwMiwxOCArNDQzOCwxOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludF92YWx1ZShwa2csIHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGJhZ1B0ciAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBOID0gZHRvaGwoYmFnUHRyLT5jb3VudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJlc1RhYmxlX21hcCogbWFwUHRyID0gKGNvbnN0IFJlc1RhYmxlX21hcCopCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoY29uc3QgdWludDhfdCopZW50KSArIGVzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogYmFzZU1hcFB0ciA9IChjb25zdCB1aW50OF90KillbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBtYXBPZmZzZXQgPSBlc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmVzVGFibGVfbWFwKiBtYXBQdHIgPSAoUmVzVGFibGVfbWFwKikoYmFzZU1hcFB0cittYXBPZmZzZXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIiAgICAgICAgICBQYXJlbnQ9MHglMDh4LCBDb3VudD0lZFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR0b2hsKGJhZ1B0ci0+cGFyZW50LmlkZW50KSwgTik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxOOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPE4gJiYgbWFwT2Zmc2V0IDwgKHR5cGVTaXplLXNpemVvZihSZXNUYWJsZV9tYXApKTsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIiAgICAgICAgICAjJWkgKEtleT0weCUwOHgpOiAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIGR0b2hsKG1hcFB0ci0+bmFtZS5pZGVudCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUuY29weUZyb21fZHRvaChtYXBQdHItPnZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50X3ZhbHVlKHBrZywgdmFsdWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90IHNpemUgPSBkdG9ocyhtYXBQdHItPnZhbHVlLnNpemUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwUHRyID0gKFJlc1RhYmxlX21hcCopKCgoY29uc3QgdWludDhfdCopbWFwUHRyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHNpemUgKyBzaXplb2YoKm1hcFB0ciktc2l6ZW9mKG1hcFB0ci0+dmFsdWUpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcE9mZnNldCArPSBzaXplICsgc2l6ZW9mKCptYXBQdHIpLXNpemVvZihtYXBQdHItPnZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcFB0ciA9IChSZXNUYWJsZV9tYXAqKShiYXNlTWFwUHRyK21hcE9mZnNldCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9sb2NhdGlvbi9qYXZhL2FuZHJvaWQvbG9jYXRpb24vQ291bnRyeS5haWRsIGIvbG9jYXRpb24vamF2YS9hbmRyb2lkL2xvY2F0aW9uL0NvdW50cnkuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODNkNjQ1Ci0tLSAvZGV2L251bGwKKysrIGIvbG9jYXRpb24vamF2YS9hbmRyb2lkL2xvY2F0aW9uL0NvdW50cnkuYWlkbApAQCAtMCwwICsxLDE5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmxvY2F0aW9uOworCitwYXJjZWxhYmxlIENvdW50cnk7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbG9jYXRpb24vamF2YS9hbmRyb2lkL2xvY2F0aW9uL0NvdW50cnkuamF2YSBiL2xvY2F0aW9uL2phdmEvYW5kcm9pZC9sb2NhdGlvbi9Db3VudHJ5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uM2MwNTQwMwotLS0gL2Rldi9udWxsCisrKyBiL2xvY2F0aW9uL2phdmEvYW5kcm9pZC9sb2NhdGlvbi9Db3VudHJ5LmphdmEKQEAgLTAsMCArMSwxNjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQorICovCisKK3BhY2thZ2UgYW5kcm9pZC5sb2NhdGlvbjsKKworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsOworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsYWJsZTsKKworLyoqCisgKiBUaGlzIGNsYXNzIHdyYXBzIHRoZSBjb3VudHJ5IGluZm9ybWF0aW9uLgorICoKKyAqIEBoaWRlCisgKi8KK3B1YmxpYyBjbGFzcyBDb3VudHJ5IGltcGxlbWVudHMgUGFyY2VsYWJsZSB7CisgICAgLyoqCisgICAgICogVGhlIGNvdW50cnkgY29kZSBjYW1lIGZyb20gdGhlIG1vYmlsZSBuZXR3b3JrCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09VTlRSWV9TT1VSQ0VfTkVUV09SSyA9IDA7CisKKyAgICAvKioKKyAgICAgKiBUaGUgY291bnRyeSBjb2RlIGNhbWUgZnJvbSB0aGUgbG9jYXRpb24gc2VydmljZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPVU5UUllfU09VUkNFX0xPQ0FUSU9OID0gMTsKKworICAgIC8qKgorICAgICAqIFRoZSBjb3VudHJ5IGNvZGUgd2FzIHJlYWQgZnJvbSB0aGUgU0lNIGNhcmQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT1VOVFJZX1NPVVJDRV9TSU0gPSAyOworCisgICAgLyoqCisgICAgICogVGhlIGNvdW50cnkgY29kZSBjYW1lIGZyb20gdGhlIHN5c3RlbSBsb2NhbGUgc2V0dGluZworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPVU5UUllfU09VUkNFX0xPQ0FMRSA9IDM7CisKKyAgICAvKioKKyAgICAgKiBUaGUgSVNPIDMxNjYtMSB0d28gbGV0dGVycyBjb3VudHJ5IGNvZGUuCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbUNvdW50cnlJc287CisKKyAgICAvKioKKyAgICAgKiBXaGVyZSB0aGUgY291bnRyeSBjb2RlIGNhbWUgZnJvbS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIGludCBtU291cmNlOworCisgICAgcHJpdmF0ZSBpbnQgbUhhc2hDb2RlOworICAgIC8qKgorICAgICAqCisgICAgICogQHBhcmFtIGNvdW50cnlJc28gdGhlIElTTyAzMTY2LTEgdHdvIGxldHRlcnMgY291bnRyeSBjb2RlLgorICAgICAqIEBwYXJhbSBzb3VyY2Ugd2hlcmUgdGhlIGNvdW50cnlJc28gY2FtZSBmcm9tLCBjb3VsZCBiZSBvbmUgb2YgYmVsb3cKKyAgICAgKiAgICAgICAgdmFsdWVzCisgICAgICogICAgICAgIDxwPgorICAgICAqICAgICAgICA8dWw+CisgICAgICogICAgICAgIDxsaT57QGxpbmsgI0NPVU5UUllfU09VUkNFX05FVFdPUkt9PC9saT4KKyAgICAgKiAgICAgICAgPGxpPntAbGluayAjQ09VTlRSWV9TT1VSQ0VfTE9DQVRJT059PC9saT4KKyAgICAgKiAgICAgICAgPGxpPntAbGluayAjQ09VTlRSWV9TT1VSQ0VfU0lNfTwvbGk+CisgICAgICogICAgICAgIDxsaT57QGxpbmsgI0NPVU5UUllfU09VUkNFX0xPQ0FMRX08L2xpPgorICAgICAqICAgICAgICA8L3VsPgorICAgICAqLworICAgIHB1YmxpYyBDb3VudHJ5KGZpbmFsIFN0cmluZyBjb3VudHJ5SXNvLCBmaW5hbCBpbnQgc291cmNlKSB7CisgICAgICAgIGlmIChjb3VudHJ5SXNvID09IG51bGwgfHwgc291cmNlIDwgQ09VTlRSWV9TT1VSQ0VfTkVUV09SSworICAgICAgICAgICAgICAgIHx8IHNvdXJjZSA+IENPVU5UUllfU09VUkNFX0xPQ0FMRSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIG1Db3VudHJ5SXNvID0gY291bnRyeUlzby50b0xvd2VyQ2FzZSgpOworICAgICAgICBtU291cmNlID0gc291cmNlOworICAgIH0KKworICAgIHB1YmxpYyBDb3VudHJ5KENvdW50cnkgY291bnRyeSkgeworICAgICAgICBtQ291bnRyeUlzbyA9IGNvdW50cnkubUNvdW50cnlJc287CisgICAgICAgIG1Tb3VyY2UgPSBjb3VudHJ5Lm1Tb3VyY2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgSVNPIDMxNjYtMSB0d28gbGV0dGVycyBjb3VudHJ5IGNvZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldENvdW50cnlJc28oKSB7CisgICAgICAgIHJldHVybiBtQ291bnRyeUlzbzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHdoZXJlIHRoZSBjb3VudHJ5IGNvZGUgY2FtZSBmcm9tLCBjb3VsZCBiZSBvbmUgb2YgYmVsb3cgdmFsdWVzCisgICAgICogICAgICAgICA8cD4KKyAgICAgKiAgICAgICAgIDx1bD4KKyAgICAgKiAgICAgICAgIDxsaT57QGxpbmsgI0NPVU5UUllfU09VUkNFX05FVFdPUkt9PC9saT4KKyAgICAgKiAgICAgICAgIDxsaT57QGxpbmsgI0NPVU5UUllfU09VUkNFX0xPQ0FUSU9OfTwvbGk+CisgICAgICogICAgICAgICA8bGk+e0BsaW5rICNDT1VOVFJZX1NPVVJDRV9TSU19PC9saT4KKyAgICAgKiAgICAgICAgIDxsaT57QGxpbmsgI0NPVU5UUllfU09VUkNFX0xPQ0FMRX08L2xpPgorICAgICAqICAgICAgICAgPC91bD4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgaW50IGdldFNvdXJjZSgpIHsKKyAgICAgICAgcmV0dXJuIG1Tb3VyY2U7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBQYXJjZWxhYmxlLkNyZWF0b3I8Q291bnRyeT4gQ1JFQVRPUiA9IG5ldyBQYXJjZWxhYmxlLkNyZWF0b3I8Q291bnRyeT4oKSB7CisgICAgICAgIHB1YmxpYyBDb3VudHJ5IGNyZWF0ZUZyb21QYXJjZWwoUGFyY2VsIGluKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IENvdW50cnkoaW4ucmVhZFN0cmluZygpLCBpbi5yZWFkSW50KCkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIENvdW50cnlbXSBuZXdBcnJheShpbnQgc2l6ZSkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBDb3VudHJ5W3NpemVdOworICAgICAgICB9CisgICAgfTsKKworICAgIHB1YmxpYyBpbnQgZGVzY3JpYmVDb250ZW50cygpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGVUb1BhcmNlbChQYXJjZWwgcGFyY2VsLCBpbnQgZmxhZ3MpIHsKKyAgICAgICAgcGFyY2VsLndyaXRlU3RyaW5nKG1Db3VudHJ5SXNvKTsKKyAgICAgICAgcGFyY2VsLndyaXRlSW50KG1Tb3VyY2UpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqZWN0KSB7CisgICAgICAgIGlmIChvYmplY3QgPT0gdGhpcykgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIENvdW50cnkpIHsKKyAgICAgICAgICAgIENvdW50cnkgYyA9IChDb3VudHJ5KSBvYmplY3Q7CisgICAgICAgICAgICByZXR1cm4gbUNvdW50cnlJc28uZXF1YWxzKGMuZ2V0Q291bnRyeUlzbygpKSAmJiBtU291cmNlID09IGMuZ2V0U291cmNlKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgIGludCBoYXNoID0gbUhhc2hDb2RlOworICAgICAgICBpZiAoaGFzaCA9PSAwKSB7CisgICAgICAgICAgICBoYXNoID0gMTc7CisgICAgICAgICAgICBoYXNoID0gaGFzaCAqIDEzICsgbUNvdW50cnlJc28uaGFzaENvZGUoKTsKKyAgICAgICAgICAgIGhhc2ggPSBoYXNoICogMTMgKyBtU291cmNlOworICAgICAgICAgICAgbUhhc2hDb2RlID0gaGFzaDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbUhhc2hDb2RlOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbXBhcmUgdGhlIHNwZWNpZmllZCBjb3VudHJ5IHRvIHRoaXMgY291bnRyeSBvYmplY3QgaWdub3JpbmcgdGhlIG1Tb3VyY2UKKyAgICAgKiBmaWVsZCwgcmV0dXJuIHRydWUgaWYgdGhlIGNvdW50cnlJc28gZmllbGRzIGFyZSBlcXVhbAorICAgICAqCisgICAgICogQHBhcmFtIGNvdW50cnkgdGhlIGNvdW50cnkgdG8gY29tcGFyZQorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIGNvdW50cnkncyBjb3VudHJ5SXNvIGZpZWxkIGlzIGVxdWFsIHRvIHRoaXMKKyAgICAgKiAgICAgICAgIGNvdW50cnkncywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGVxdWFsc0lnbm9yZVNvdXJjZShDb3VudHJ5IGNvdW50cnkpIHsKKyAgICAgICAgcmV0dXJuIGNvdW50cnkgIT0gbnVsbCAmJiBtQ291bnRyeUlzby5lcXVhbHMoY291bnRyeS5nZXRDb3VudHJ5SXNvKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xvY2F0aW9uL2phdmEvYW5kcm9pZC9sb2NhdGlvbi9Db3VudHJ5RGV0ZWN0b3IuamF2YSBiL2xvY2F0aW9uL2phdmEvYW5kcm9pZC9sb2NhdGlvbi9Db3VudHJ5RGV0ZWN0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjc4MGNlCi0tLSAvZGV2L251bGwKKysrIGIvbG9jYXRpb24vamF2YS9hbmRyb2lkL2xvY2F0aW9uL0NvdW50cnlEZXRlY3Rvci5qYXZhCkBAIC0wLDAgKzEsMTUyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKKyAqIHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisgKiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyAqIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQorICogTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKKyAqIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5sb2NhdGlvbjsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworCitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuTG9vcGVyOworaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKKy8qKgorICogVGhpcyBjbGFzcyBwcm92aWRlcyBhY2Nlc3MgdG8gdGhlIHN5c3RlbSBjb3VudHJ5IGRldGVjdG9yIHNlcnZpY2UuIFRoaXMKKyAqIHNlcnZpY2UgYWxsb3dzIGFwcGxpY2F0aW9ucyB0byBvYnRhaW4gdGhlIGNvdW50cnkgdGhhdCB0aGUgdXNlciBpcyBpbi4KKyAqIDxwPgorICogVGhlIGNvdW50cnkgd2lsbCBiZSBkZXRlY3RlZCBpbiBvcmRlciBvZiByZWxpYWJpbGl0eSwgbGlrZQorICogPHVsPgorICogPGxpPk1vYmlsZSBuZXR3b3JrPC9saT4KKyAqIDxsaT5Mb2NhdGlvbjwvbGk+CisgKiA8bGk+U0lNJ3MgY291bnRyeTwvbGk+CisgKiA8bGk+UGhvbmUncyBsb2NhbGU8L2xpPgorICogPC91bD4KKyAqIDxwPgorICogQ2FsbCB0aGUge0BsaW5rICNkZXRlY3RDb3VudHJ5KCl9IHRvIGdldCB0aGUgYXZhaWxhYmxlIGNvdW50cnkgaW1tZWRpYXRlbHkuCisgKiA8cD4KKyAqIFRvIGJlIG5vdGlmaWVkIG9mIHRoZSBmdXR1cmUgY291bnRyeSBjaGFuZ2UsIHVzZSB0aGUKKyAqIHtAbGluayAjYWRkQ291bnRyeUxpc3RlbmVyfQorICogPHA+CisgKiA8cD4KKyAqIFlvdSBkbyBub3QgaW5zdGFudGlhdGUgdGhpcyBjbGFzcyBkaXJlY3RseTsgaW5zdGVhZCwgcmV0cmlldmUgaXQgdGhyb3VnaAorICoge0BsaW5rIGFuZHJvaWQuY29udGVudC5Db250ZXh0I2dldFN5c3RlbVNlcnZpY2UKKyAqIENvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkNPVU5UUllfREVURUNUT1IpfS4KKyAqIDxwPgorICogQm90aCBBQ0NFU1NfRklORV9MT0NBVElPTiBhbmQgQUNDRVNTX0NPQVJTRV9MT0NBVElPTiBwZXJtaXNzaW9ucyBhcmUgbmVlZGVkLgorICoKKyAqIEBoaWRlCisgKi8KK3B1YmxpYyBjbGFzcyBDb3VudHJ5RGV0ZWN0b3IgeworCisgICAgLyoqCisgICAgICogVGhlIGNsYXNzIHRvIHdyYXAgdGhlIElDb3VudHJ5TGlzdGVuZXIuU3R1YiBhbmQgQ291bnRyeUxpc3RlbmVyIG9iamVjdHMKKyAgICAgKiB0b2dldGhlci4gVGhlIENvdW50cnlMaXN0ZW5lciB3aWxsIGJlIG5vdGlmaWVkIHRocm91Z2ggdGhlIHNwZWNpZmljCisgICAgICogbG9vcGVyIG9uY2UgdGhlIGNvdW50cnkgY2hhbmdlZCBhbmQgZGV0ZWN0ZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgY2xhc3MgTGlzdGVuZXJUcmFuc3BvcnQgZXh0ZW5kcyBJQ291bnRyeUxpc3RlbmVyLlN0dWIgeworCisgICAgICAgIHByaXZhdGUgZmluYWwgQ291bnRyeUxpc3RlbmVyIG1MaXN0ZW5lcjsKKworICAgICAgICBwcml2YXRlIGZpbmFsIEhhbmRsZXIgbUhhbmRsZXI7CisKKyAgICAgICAgcHVibGljIExpc3RlbmVyVHJhbnNwb3J0KENvdW50cnlMaXN0ZW5lciBsaXN0ZW5lciwgTG9vcGVyIGxvb3BlcikgeworICAgICAgICAgICAgbUxpc3RlbmVyID0gbGlzdGVuZXI7CisgICAgICAgICAgICBpZiAobG9vcGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtSGFuZGxlciA9IG5ldyBIYW5kbGVyKGxvb3Blcik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1IYW5kbGVyID0gbmV3IEhhbmRsZXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ291bnRyeURldGVjdGVkKGZpbmFsIENvdW50cnkgY291bnRyeSkgeworICAgICAgICAgICAgbUhhbmRsZXIucG9zdChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICBtTGlzdGVuZXIub25Db3VudHJ5RGV0ZWN0ZWQoY291bnRyeSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgVEFHID0gIkNvdW50cnlEZXRlY3RvciI7CisgICAgcHJpdmF0ZSBmaW5hbCBJQ291bnRyeURldGVjdG9yIG1TZXJ2aWNlOworICAgIHByaXZhdGUgZmluYWwgSGFzaE1hcDxDb3VudHJ5TGlzdGVuZXIsIExpc3RlbmVyVHJhbnNwb3J0PiBtTGlzdGVuZXJzOworCisgICAgLyoqCisgICAgICogQGhpZGUgLSBoaWRlIHRoaXMgY29uc3RydWN0b3IgYmVjYXVzZSBpdCBoYXMgYSBwYXJhbWV0ZXIgb2YgdHlwZQorICAgICAqICAgICAgIElDb3VudHJ5RGV0ZWN0b3IsIHdoaWNoIGlzIGEgc3lzdGVtIHByaXZhdGUgY2xhc3MuIFRoZSByaWdodCB3YXkgdG8KKyAgICAgKiAgICAgICBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBpcyB1c2luZyB0aGUgZmFjdG9yeQorICAgICAqICAgICAgIENvbnRleHQuZ2V0U3lzdGVtU2VydmljZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ291bnRyeURldGVjdG9yKElDb3VudHJ5RGV0ZWN0b3Igc2VydmljZSkgeworICAgICAgICBtU2VydmljZSA9IHNlcnZpY2U7CisgICAgICAgIG1MaXN0ZW5lcnMgPSBuZXcgSGFzaE1hcDxDb3VudHJ5TGlzdGVuZXIsIExpc3RlbmVyVHJhbnNwb3J0PigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN0YXJ0IGRldGVjdGluZyB0aGUgY291bnRyeSB0aGF0IHRoZSB1c2VyIGlzIGluLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgY291bnRyeSBpZiBpdCBpcyBhdmFpbGFibGUgaW1tZWRpYXRlbHksIG90aGVyd2lzZSBudWxsIHdpbGwKKyAgICAgKiAgICAgICAgIGJlIHJldHVybmVkLgorICAgICAqLworICAgIHB1YmxpYyBDb3VudHJ5IGRldGVjdENvdW50cnkoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gbVNlcnZpY2UuZGV0ZWN0Q291bnRyeSgpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiZGV0ZWN0Q291bnRyeTogUmVtb3RlRXhjZXB0aW9uIiwgZSk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhIGxpc3RlbmVyIHRvIHJlY2VpdmUgdGhlIG5vdGlmaWNhdGlvbiB3aGVuIHRoZSBjb3VudHJ5IGlzIGRldGVjdGVkCisgICAgICogb3IgY2hhbmdlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaXN0ZW5lciB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSBjb3VudHJ5IGlzIGRldGVjdGVkIG9yIGNoYW5nZWQuCisgICAgICogQHBhcmFtIGxvb3BlciBhIExvb3BlciBvYmplY3Qgd2hvc2UgbWVzc2FnZSBxdWV1ZSB3aWxsIGJlIHVzZWQgdG8KKyAgICAgKiAgICAgICAgaW1wbGVtZW50IHRoZSBjYWxsYmFjayBtZWNoYW5pc20uIElmIGxvb3BlciBpcyBudWxsIHRoZW4gdGhlCisgICAgICogICAgICAgIGNhbGxiYWNrcyB3aWxsIGJlIGNhbGxlZCBvbiB0aGUgbWFpbiB0aHJlYWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkQ291bnRyeUxpc3RlbmVyKENvdW50cnlMaXN0ZW5lciBsaXN0ZW5lciwgTG9vcGVyIGxvb3BlcikgeworICAgICAgICBzeW5jaHJvbml6ZWQgKG1MaXN0ZW5lcnMpIHsKKyAgICAgICAgICAgIGlmICghbUxpc3RlbmVycy5jb250YWluc0tleShsaXN0ZW5lcikpIHsKKyAgICAgICAgICAgICAgICBMaXN0ZW5lclRyYW5zcG9ydCB0cmFuc3BvcnQgPSBuZXcgTGlzdGVuZXJUcmFuc3BvcnQobGlzdGVuZXIsIGxvb3Blcik7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgbVNlcnZpY2UuYWRkQ291bnRyeUxpc3RlbmVyKHRyYW5zcG9ydCk7CisgICAgICAgICAgICAgICAgICAgIG1MaXN0ZW5lcnMucHV0KGxpc3RlbmVyLCB0cmFuc3BvcnQpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgImFkZENvdW50cnlMaXN0ZW5lcjogUmVtb3RlRXhjZXB0aW9uIiwgZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVtb3ZlIHRoZSBsaXN0ZW5lcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZUNvdW50cnlMaXN0ZW5lcihDb3VudHJ5TGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChtTGlzdGVuZXJzKSB7CisgICAgICAgICAgICBMaXN0ZW5lclRyYW5zcG9ydCB0cmFuc3BvcnQgPSBtTGlzdGVuZXJzLmdldChsaXN0ZW5lcik7CisgICAgICAgICAgICBpZiAodHJhbnNwb3J0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBtTGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7CisgICAgICAgICAgICAgICAgICAgIG1TZXJ2aWNlLnJlbW92ZUNvdW50cnlMaXN0ZW5lcih0cmFuc3BvcnQpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgInJlbW92ZUNvdW50cnlMaXN0ZW5lcjogUmVtb3RlRXhjZXB0aW9uIiwgZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbG9jYXRpb24vamF2YS9hbmRyb2lkL2xvY2F0aW9uL0NvdW50cnlMaXN0ZW5lci5qYXZhIGIvbG9jYXRpb24vamF2YS9hbmRyb2lkL2xvY2F0aW9uL0NvdW50cnlMaXN0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzNmRiNDEKLS0tIC9kZXYvbnVsbAorKysgYi9sb2NhdGlvbi9qYXZhL2FuZHJvaWQvbG9jYXRpb24vQ291bnRyeUxpc3RlbmVyLmphdmEKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmxvY2F0aW9uOworCisvKioKKyAqIFRoZSBsaXN0ZW5lciBmb3IgcmVjZWl2aW5nIHRoZSBub3RpZmljYXRpb24gd2hlbiB0aGUgY291bnRyeSBpcyBkZXRlY3RlZCBvcgorICogY2hhbmdlZAorICoKKyAqIEBoaWRlCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgQ291bnRyeUxpc3RlbmVyIHsKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gY291bnRyeSB0aGUgY2hhbmdlZCBvciBkZXRlY3RlZCBjb3VudHJ5LgorICAgICAqLworICAgIHZvaWQgb25Db3VudHJ5RGV0ZWN0ZWQoQ291bnRyeSBjb3VudHJ5KTsKK30KZGlmZiAtLWdpdCBhL2xvY2F0aW9uL2phdmEvYW5kcm9pZC9sb2NhdGlvbi9JQ291bnRyeURldGVjdG9yLmFpZGwgYi9sb2NhdGlvbi9qYXZhL2FuZHJvaWQvbG9jYXRpb24vSUNvdW50cnlEZXRlY3Rvci5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlYWYwN2MKLS0tIC9kZXYvbnVsbAorKysgYi9sb2NhdGlvbi9qYXZhL2FuZHJvaWQvbG9jYXRpb24vSUNvdW50cnlEZXRlY3Rvci5haWRsCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubG9jYXRpb247CisKK2ltcG9ydCBhbmRyb2lkLmxvY2F0aW9uLkNvdW50cnk7CitpbXBvcnQgYW5kcm9pZC5sb2NhdGlvbi5JQ291bnRyeUxpc3RlbmVyOworCisvKioKKyAqIFRoZSBBUEkgZm9yIGRldGVjdGluZyB0aGUgY291bnRyeSB3aGVyZSB0aGUgdXNlciBpcy4KKyAqCisgKiB7QGhpZGV9CisgKi8KK2ludGVyZmFjZSBJQ291bnRyeURldGVjdG9yCit7CisgICAgLyoqCisgICAgICogU3RhcnQgZGV0ZWN0aW5nIHRoZSBjb3VudHJ5IHRoYXQgdGhlIHVzZXIgaXMgaW4uCisgICAgICogQHJldHVybiB0aGUgY291bnRyeSBpZiBpdCBpcyBhdmFpbGFibGUgaW1tZWRpYXRlbHksIG90aGVyd2lzZSBudWxsIHdpbGwgYmUgcmV0dXJuZWQuCisgICAgICovCisgICAgQ291bnRyeSBkZXRlY3RDb3VudHJ5KCk7CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBsaXN0ZW5lciB0byByZWNlaXZlIHRoZSBub3RpZmljYXRpb24gd2hlbiB0aGUgY291bnRyeSBpcyBkZXRlY3RlZCBvciBjaGFuZ2VkLgorICAgICAqLworICAgIHZvaWQgYWRkQ291bnRyeUxpc3RlbmVyKGluIElDb3VudHJ5TGlzdGVuZXIgbGlzdGVuZXIpOworCisgICAgLyoqCisgICAgICogUmVtb3ZlIHRoZSBsaXN0ZW5lcgorICAgICAqLworICAgIHZvaWQgcmVtb3ZlQ291bnRyeUxpc3RlbmVyKGluIElDb3VudHJ5TGlzdGVuZXIgbGlzdGVuZXIpOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xvY2F0aW9uL2phdmEvYW5kcm9pZC9sb2NhdGlvbi9JQ291bnRyeUxpc3RlbmVyLmFpZGwgYi9sb2NhdGlvbi9qYXZhL2FuZHJvaWQvbG9jYXRpb24vSUNvdW50cnlMaXN0ZW5lci5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2ZWNiMTMKLS0tIC9kZXYvbnVsbAorKysgYi9sb2NhdGlvbi9qYXZhL2FuZHJvaWQvbG9jYXRpb24vSUNvdW50cnlMaXN0ZW5lci5haWRsCkBAIC0wLDAgKzEsMjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubG9jYXRpb247CisKK2ltcG9ydCBhbmRyb2lkLmxvY2F0aW9uLkNvdW50cnk7CisvKioKKyAqIHtAaGlkZX0KKyAqLworb25ld2F5IGludGVyZmFjZSBJQ291bnRyeUxpc3RlbmVyCit7CisgICAgdm9pZCBvbkNvdW50cnlEZXRlY3RlZChpbiBDb3VudHJ5IGNvdW50cnkpOworfQpkaWZmIC0tZ2l0IGEvbG9jYXRpb24vdGVzdHMvbG9jYXRpb250ZXN0cy9zcmMvYW5kcm9pZC9sb2NhdGlvbi9Db3VudHJ5VGVzdGVyLmphdmEgYi9sb2NhdGlvbi90ZXN0cy9sb2NhdGlvbnRlc3RzL3NyYy9hbmRyb2lkL2xvY2F0aW9uL0NvdW50cnlUZXN0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODAyZDVhCi0tLSAvZGV2L251bGwKKysrIGIvbG9jYXRpb24vdGVzdHMvbG9jYXRpb250ZXN0cy9zcmMvYW5kcm9pZC9sb2NhdGlvbi9Db3VudHJ5VGVzdGVyLmphdmEKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5sb2NhdGlvbjsKKworaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7CisKK3B1YmxpYyBjbGFzcyBDb3VudHJ5VGVzdGVyIGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q291bnRyeUVxdWFscygpIHsKKyAgICAgICAgQ291bnRyeSBjb3VudHJ5QSA9IG5ldyBDb3VudHJ5KCJVUyIsIENvdW50cnkuQ09VTlRSWV9TT1VSQ0VfTkVUV09SSyk7CisgICAgICAgIENvdW50cnkgY291bnRyeUIgPSBuZXcgQ291bnRyeSgiVVMiLCBDb3VudHJ5LkNPVU5UUllfU09VUkNFX0xPQ0FMRSk7CisgICAgICAgIENvdW50cnkgY291bnRyeUMgPSBuZXcgQ291bnRyeSgiQ04iLCBDb3VudHJ5LkNPVU5UUllfU09VUkNFX0xPQ0FMRSk7CisgICAgICAgIENvdW50cnkgY291bnRyeUQgPSBuZXcgQ291bnRyeSgidXMiLCBDb3VudHJ5LkNPVU5UUllfU09VUkNFX05FVFdPUkspOworICAgICAgICBhc3NlcnRUcnVlKGNvdW50cnlBLmVxdWFsc0lnbm9yZVNvdXJjZShjb3VudHJ5QikpOworICAgICAgICBhc3NlcnRGYWxzZShjb3VudHJ5QS5lcXVhbHNJZ25vcmVTb3VyY2UoY291bnRyeUMpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoY291bnRyeUEuZXF1YWxzKGNvdW50cnlDKSk7CisgICAgICAgIGFzc2VydFRydWUoY291bnRyeUEuZXF1YWxzKGNvdW50cnlEKSk7CisgICAgICAgIGFzc2VydFRydWUoY291bnRyeUEuaGFzaENvZGUoKSA9PSBjb3VudHJ5RC5oYXNoQ29kZSgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvQXVkaW9Gb3JtYXQuamF2YSBiL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9BdWRpb0Zvcm1hdC5qYXZhCmluZGV4IGYxZmExZTguLjMxZTQ2MzEgMTAwNjQ0Ci0tLSBhL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9BdWRpb0Zvcm1hdC5qYXZhCisrKyBiL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9BdWRpb0Zvcm1hdC5qYXZhCkBAIC0zMSw5ICszMSw5IEBACiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5DT0RJTkdfSU5WQUxJRCA9IDA7CiAgICAgLyoqIERlZmF1bHQgYXVkaW8gZGF0YSBmb3JtYXQgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTkNPRElOR19ERUZBVUxUID0gMTsKLSAgICAvKiogQXVkaW8gZGF0YSBmb3JtYXQ6IFBDTSAxNiBiaXQgcGVyIHNhbXBsZSAqLworICAgIC8qKiBBdWRpbyBkYXRhIGZvcm1hdDogUENNIDE2IGJpdCBwZXIgc2FtcGxlLiBHdWFyYW50ZWVkIHRvIGJlIHN1cHBvcnRlZCBieSBkZXZpY2VzLiAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVOQ09ESU5HX1BDTV8xNkJJVCA9IDI7IC8vIGFjY2Vzc2VkIGJ5IG5hdGl2ZSBjb2RlCi0gICAgLyoqIEF1ZGlvIGRhdGEgZm9ybWF0OiBQQ00gOCBiaXQgcGVyIHNhbXBsZSAqLworICAgIC8qKiBBdWRpbyBkYXRhIGZvcm1hdDogUENNIDggYml0IHBlciBzYW1wbGUuIE5vdCBndWFyYW50ZWVkIHRvIGJlIHN1cHBvcnRlZCBieSBkZXZpY2VzLiAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVOQ09ESU5HX1BDTV84QklUID0gMzsgIC8vIGFjY2Vzc2VkIGJ5IG5hdGl2ZSBjb2RlCiAKICAgICAvKiogSW52YWxpZCBhdWRpbyBjaGFubmVsIGNvbmZpZ3VyYXRpb24gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9BdWRpb01hbmFnZXIuamF2YSBiL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9BdWRpb01hbmFnZXIuamF2YQppbmRleCBiYmJiYTc0Li5iMjNkY2RlIDEwMDY0NAotLS0gYS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvQXVkaW9NYW5hZ2VyLmphdmEKKysrIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL0F1ZGlvTWFuYWdlci5qYXZhCkBAIC0xNTI1LDQgKzE1MjUsMjIgQEAKICAgICAgICoge0BoaWRlfQogICAgICAgKi8KICAgICAgcHJpdmF0ZSBJQmluZGVyIG1JQ2FsbEJhY2sgPSBuZXcgQmluZGVyKCk7CisKKyAgICAvKioKKyAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgcGhvbmUgaXMgaW4gc2lsZW50IG1vZGUsIHdpdGggb3Igd2l0aG91dCB2aWJyYXRlLgorICAgICAqCisgICAgICogQHJldHVybiB0cnVlIGlmIHBob25lIGlzIGluIHNpbGVudCBtb2RlLCB3aXRoIG9yIHdpdGhvdXQgdmlicmF0ZS4KKyAgICAgKgorICAgICAqIEBzZWUgI2dldFJpbmdlck1vZGUoKQorICAgICAqCisgICAgICogQGhpZGUgcGVuZGluZyBBUEkgQ291bmNpbCBhcHByb3ZhbAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzU2lsZW50TW9kZSgpIHsKKyAgICAgICAgaW50IHJpbmdlck1vZGUgPSBnZXRSaW5nZXJNb2RlKCk7CisgICAgICAgIGJvb2xlYW4gc2lsZW50TW9kZSA9CisgICAgICAgICAgICAocmluZ2VyTW9kZSA9PSBSSU5HRVJfTU9ERV9TSUxFTlQpIHx8CisgICAgICAgICAgICAocmluZ2VyTW9kZSA9PSBSSU5HRVJfTU9ERV9WSUJSQVRFKTsKKyAgICAgICAgcmV0dXJuIHNpbGVudE1vZGU7CisgICAgfQorCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvQXVkaW9SZWNvcmQuamF2YSBiL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9BdWRpb1JlY29yZC5qYXZhCmluZGV4IGM0OGVhYWQuLmM1NjdhNmUgMTAwNjQ0Ci0tLSBhL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9BdWRpb1JlY29yZC5qYXZhCisrKyBiL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9BdWRpb1JlY29yZC5qYXZhCkBAIC0xOTQsMTEgKzE5NCwxMyBAQAogICAgICAqIENsYXNzIGNvbnN0cnVjdG9yLgogICAgICAqIEBwYXJhbSBhdWRpb1NvdXJjZSB0aGUgcmVjb3JkaW5nIHNvdXJjZS4gU2VlIHtAbGluayBNZWRpYVJlY29yZGVyLkF1ZGlvU291cmNlfSBmb3IKICAgICAgKiAgICByZWNvcmRpbmcgc291cmNlIGRlZmluaXRpb25zLgotICAgICAqIEBwYXJhbSBzYW1wbGVSYXRlSW5IeiB0aGUgc2FtcGxlIHJhdGUgZXhwcmVzc2VkIGluIEhlcnR6LiBFeGFtcGxlcyBvZiByYXRlcyBhcmUgKGJ1dAotICAgICAqICAgbm90IGxpbWl0ZWQgdG8pIDQ0MTAwLCAyMjA1MCBhbmQgMTEwMjUuCisgICAgICogQHBhcmFtIHNhbXBsZVJhdGVJbkh6IHRoZSBzYW1wbGUgcmF0ZSBleHByZXNzZWQgaW4gSGVydHouIDQ0MTAwSHogaXMgY3VycmVudGx5IHRoZSBvbmx5CisgICAgICogICByYXRlIHRoYXQgaXMgZ3VhcmFudGVlZCB0byB3b3JrIG9uIGFsbCBkZXZpY2VzLCBidXQgb3RoZXIgcmF0ZXMgc3VjaCBhcyAyMjA1MCwKKyAgICAgKiAgIDE2MDAwLCBhbmQgMTEwMjUgbWF5IHdvcmsgb24gc29tZSBkZXZpY2VzLgogICAgICAqIEBwYXJhbSBjaGFubmVsQ29uZmlnIGRlc2NyaWJlcyB0aGUgY29uZmlndXJhdGlvbiBvZiB0aGUgYXVkaW8gY2hhbm5lbHMuIAogICAgICAqICAgU2VlIHtAbGluayBBdWRpb0Zvcm1hdCNDSEFOTkVMX0lOX01PTk99IGFuZAotICAgICAqICAge0BsaW5rIEF1ZGlvRm9ybWF0I0NIQU5ORUxfSU5fU1RFUkVPfQorICAgICAqICAge0BsaW5rIEF1ZGlvRm9ybWF0I0NIQU5ORUxfSU5fU1RFUkVPfS4gIHtAbGluayBBdWRpb0Zvcm1hdCNDSEFOTkVMX0lOX01PTk99IGlzIGd1YXJhbnRlZWQKKyAgICAgKiAgIHRvIHdvcmsgb24gYWxsIGRldmljZXMuCiAgICAgICogQHBhcmFtIGF1ZGlvRm9ybWF0IHRoZSBmb3JtYXQgaW4gd2hpY2ggdGhlIGF1ZGlvIGRhdGEgaXMgcmVwcmVzZW50ZWQuIAogICAgICAqICAgU2VlIHtAbGluayBBdWRpb0Zvcm1hdCNFTkNPRElOR19QQ01fMTZCSVR9IGFuZCAKICAgICAgKiAgIHtAbGluayBBdWRpb0Zvcm1hdCNFTkNPRElOR19QQ01fOEJJVH0KQEAgLTQ0NCw2ICs0NDYsOCBAQAogICAgICAqICBvciB7QGxpbmsgI0VSUk9SfSBpZiB0aGUgaW1wbGVtZW50YXRpb24gd2FzIHVuYWJsZSB0byBxdWVyeSB0aGUgaGFyZHdhcmUgZm9yIGl0cyAKICAgICAgKiAgb3V0cHV0IHByb3BlcnRpZXMsIAogICAgICAqICAgb3IgdGhlIG1pbmltdW0gYnVmZmVyIHNpemUgZXhwcmVzc2VkIGluIGJ5dGVzLgorICAgICAqIEBzZWUgI0F1ZGlvUmVjb3JkKGludCwgaW50LCBpbnQsIGludCwgaW50KSBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB2YWxpZAorICAgICAqICAgY29uZmlndXJhdGlvbiB2YWx1ZXMuCiAgICAgICovCiAgICAgc3RhdGljIHB1YmxpYyBpbnQgZ2V0TWluQnVmZmVyU2l6ZShpbnQgc2FtcGxlUmF0ZUluSHosIGludCBjaGFubmVsQ29uZmlnLCBpbnQgYXVkaW9Gb3JtYXQpIHsKICAgICAgICAgaW50IGNoYW5uZWxDb3VudCA9IDA7CmRpZmYgLS1naXQgYS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvTWVkaWFGaWxlLmphdmEgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvTWVkaWFGaWxlLmphdmEKaW5kZXggNmU1MjdkOS4uYTM0NmFlNCAxMDA2NDQKLS0tIGEvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL01lZGlhRmlsZS5qYXZhCisrKyBiL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9NZWRpYUZpbGUuamF2YQpAQCAtMjAsNiArMjAsNyBAQAogaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuTWVkaWFTdG9yZS5BdWRpbzsKIGltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLk1lZGlhU3RvcmUuSW1hZ2VzOwogaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuTWVkaWFTdG9yZS5WaWRlbzsKK2ltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLk10cDsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLkRlY29kZXJDYXBhYmlsaXRpZXM7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5EZWNvZGVyQ2FwYWJpbGl0aWVzLlZpZGVvRGVjb2RlcjsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLkRlY29kZXJDYXBhYmlsaXRpZXMuQXVkaW9EZWNvZGVyOwpAQCAtOTYsMTUgKzk3LDMyIEBACiAgICAgICAgIH0KICAgICB9CiAgICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgSGFzaE1hcDxTdHJpbmcsIE1lZGlhRmlsZVR5cGU+IHNGaWxlVHlwZU1hcCAKKyAgICBwcml2YXRlIHN0YXRpYyBIYXNoTWFwPFN0cmluZywgTWVkaWFGaWxlVHlwZT4gc0ZpbGVUeXBlTWFwCiAgICAgICAgICAgICA9IG5ldyBIYXNoTWFwPFN0cmluZywgTWVkaWFGaWxlVHlwZT4oKTsKLSAgICBwcml2YXRlIHN0YXRpYyBIYXNoTWFwPFN0cmluZywgSW50ZWdlcj4gc01pbWVUeXBlTWFwIAotICAgICAgICAgICAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEludGVnZXI+KCk7ICAgICAgICAgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgSGFzaE1hcDxTdHJpbmcsIEludGVnZXI+IHNNaW1lVHlwZU1hcAorICAgICAgICAgICAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEludGVnZXI+KCk7CisgICAgLy8gbWFwcyBmaWxlIGV4dGVuc2lvbiB0byBNVFAgZm9ybWF0IGNvZGUKKyAgICBwcml2YXRlIHN0YXRpYyBIYXNoTWFwPFN0cmluZywgSW50ZWdlcj4gc0ZpbGVUeXBlVG9Gb3JtYXRNYXAKKyAgICAgICAgICAgID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJbnRlZ2VyPigpOworICAgIC8vIG1hcHMgbWltZSB0eXBlIHRvIE1UUCBmb3JtYXQgY29kZQorICAgIHByaXZhdGUgc3RhdGljIEhhc2hNYXA8U3RyaW5nLCBJbnRlZ2VyPiBzTWltZVR5cGVUb0Zvcm1hdE1hcAorICAgICAgICAgICAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEludGVnZXI+KCk7CisgICAgLy8gbWFwcyBNVFAgZm9ybWF0IGNvZGUgdG8gbWltZSB0eXBlCisgICAgcHJpdmF0ZSBzdGF0aWMgSGFzaE1hcDxJbnRlZ2VyLCBTdHJpbmc+IHNGb3JtYXRUb01pbWVUeXBlTWFwCisgICAgICAgICAgICA9IG5ldyBIYXNoTWFwPEludGVnZXIsIFN0cmluZz4oKTsKKwogICAgIHN0YXRpYyB2b2lkIGFkZEZpbGVUeXBlKFN0cmluZyBleHRlbnNpb24sIGludCBmaWxlVHlwZSwgU3RyaW5nIG1pbWVUeXBlKSB7CiAgICAgICAgIHNGaWxlVHlwZU1hcC5wdXQoZXh0ZW5zaW9uLCBuZXcgTWVkaWFGaWxlVHlwZShmaWxlVHlwZSwgbWltZVR5cGUpKTsKICAgICAgICAgc01pbWVUeXBlTWFwLnB1dChtaW1lVHlwZSwgSW50ZWdlci52YWx1ZU9mKGZpbGVUeXBlKSk7CiAgICAgfQogCisgICAgc3RhdGljIHZvaWQgYWRkRmlsZVR5cGUoU3RyaW5nIGV4dGVuc2lvbiwgaW50IGZpbGVUeXBlLCBTdHJpbmcgbWltZVR5cGUsIGludCBtdHBGb3JtYXRDb2RlKSB7CisgICAgICAgIGFkZEZpbGVUeXBlKGV4dGVuc2lvbiwgZmlsZVR5cGUsIG1pbWVUeXBlKTsKKyAgICAgICAgc0ZpbGVUeXBlVG9Gb3JtYXRNYXAucHV0KGV4dGVuc2lvbiwgSW50ZWdlci52YWx1ZU9mKG10cEZvcm1hdENvZGUpKTsKKyAgICAgICAgc01pbWVUeXBlVG9Gb3JtYXRNYXAucHV0KG1pbWVUeXBlLCBJbnRlZ2VyLnZhbHVlT2YobXRwRm9ybWF0Q29kZSkpOworICAgICAgICBzRm9ybWF0VG9NaW1lVHlwZU1hcC5wdXQobXRwRm9ybWF0Q29kZSwgbWltZVR5cGUpOworICAgIH0KKwogICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNXTUFFbmFibGVkKCkgewogICAgICAgICBMaXN0PEF1ZGlvRGVjb2Rlcj4gZGVjb2RlcnMgPSBEZWNvZGVyQ2FwYWJpbGl0aWVzLmdldEF1ZGlvRGVjb2RlcnMoKTsKICAgICAgICAgZm9yIChBdWRpb0RlY29kZXIgZGVjb2RlcjogZGVjb2RlcnMpIHsKQEAgLTEyNiwxNyArMTQ0LDE3IEBACiAgICAgfQogCiAgICAgc3RhdGljIHsKLSAgICAgICAgYWRkRmlsZVR5cGUoIk1QMyIsIEZJTEVfVFlQRV9NUDMsICJhdWRpby9tcGVnIik7Ci0gICAgICAgIGFkZEZpbGVUeXBlKCJNNEEiLCBGSUxFX1RZUEVfTTRBLCAiYXVkaW8vbXA0Iik7Ci0gICAgICAgIGFkZEZpbGVUeXBlKCJXQVYiLCBGSUxFX1RZUEVfV0FWLCAiYXVkaW8veC13YXYiKTsKKyAgICAgICAgYWRkRmlsZVR5cGUoIk1QMyIsIEZJTEVfVFlQRV9NUDMsICJhdWRpby9tcGVnIiwgTXRwLk9iamVjdC5GT1JNQVRfTVAzKTsKKyAgICAgICAgYWRkRmlsZVR5cGUoIk00QSIsIEZJTEVfVFlQRV9NNEEsICJhdWRpby9tcDQiLCBNdHAuT2JqZWN0LkZPUk1BVF9NUEVHKTsKKyAgICAgICAgYWRkRmlsZVR5cGUoIldBViIsIEZJTEVfVFlQRV9XQVYsICJhdWRpby94LXdhdiIsIE10cC5PYmplY3QuRk9STUFUX1dBVik7CiAgICAgICAgIGFkZEZpbGVUeXBlKCJBTVIiLCBGSUxFX1RZUEVfQU1SLCAiYXVkaW8vYW1yIik7CiAgICAgICAgIGFkZEZpbGVUeXBlKCJBV0IiLCBGSUxFX1RZUEVfQVdCLCAiYXVkaW8vYW1yLXdiIik7CiAgICAgICAgIGlmIChpc1dNQUVuYWJsZWQoKSkgewotICAgICAgICAgICAgYWRkRmlsZVR5cGUoIldNQSIsIEZJTEVfVFlQRV9XTUEsICJhdWRpby94LW1zLXdtYSIpOworICAgICAgICAgICAgYWRkRmlsZVR5cGUoIldNQSIsIEZJTEVfVFlQRV9XTUEsICJhdWRpby94LW1zLXdtYSIsIE10cC5PYmplY3QuRk9STUFUX1dNQSk7CiAgICAgICAgIH0KLSAgICAgICAgYWRkRmlsZVR5cGUoIk9HRyIsIEZJTEVfVFlQRV9PR0csICJhcHBsaWNhdGlvbi9vZ2ciKTsKLSAgICAgICAgYWRkRmlsZVR5cGUoIk9HQSIsIEZJTEVfVFlQRV9PR0csICJhcHBsaWNhdGlvbi9vZ2ciKTsKLSAgICAgICAgYWRkRmlsZVR5cGUoIkFBQyIsIEZJTEVfVFlQRV9BQUMsICJhdWRpby9hYWMiKTsKKyAgICAgICAgYWRkRmlsZVR5cGUoIk9HRyIsIEZJTEVfVFlQRV9PR0csICJhcHBsaWNhdGlvbi9vZ2ciLCBNdHAuT2JqZWN0LkZPUk1BVF9PR0cpOworICAgICAgICBhZGRGaWxlVHlwZSgiT0dBIiwgRklMRV9UWVBFX09HRywgImFwcGxpY2F0aW9uL29nZyIsIE10cC5PYmplY3QuRk9STUFUX09HRyk7CisgICAgICAgIGFkZEZpbGVUeXBlKCJBQUMiLCBGSUxFX1RZUEVfQUFDLCAiYXVkaW8vYWFjIiwgTXRwLk9iamVjdC5GT1JNQVRfQUFDKTsKICAgICAgICAgYWRkRmlsZVR5cGUoIk1LQSIsIEZJTEVfVFlQRV9NS0EsICJhdWRpby94LW1hdHJvc2thIik7CiAgCiAgICAgICAgIGFkZEZpbGVUeXBlKCJNSUQiLCBGSUxFX1RZUEVfTUlELCAiYXVkaW8vbWlkaSIpOwpAQCAtMTQ4LDMyICsxNjYsMzIgQEAKICAgICAgICAgYWRkRmlsZVR5cGUoIlJUWCIsIEZJTEVfVFlQRV9NSUQsICJhdWRpby9taWRpIik7CiAgICAgICAgIGFkZEZpbGVUeXBlKCJPVEEiLCBGSUxFX1RZUEVfTUlELCAiYXVkaW8vbWlkaSIpOwogICAgICAgICAKLSAgICAgICAgYWRkRmlsZVR5cGUoIk1QRUciLCBGSUxFX1RZUEVfTVA0LCAidmlkZW8vbXBlZyIpOwotICAgICAgICBhZGRGaWxlVHlwZSgiTVA0IiwgRklMRV9UWVBFX01QNCwgInZpZGVvL21wNCIpOwotICAgICAgICBhZGRGaWxlVHlwZSgiTTRWIiwgRklMRV9UWVBFX000ViwgInZpZGVvL21wNCIpOwotICAgICAgICBhZGRGaWxlVHlwZSgiM0dQIiwgRklMRV9UWVBFXzNHUFAsICJ2aWRlby8zZ3BwIik7Ci0gICAgICAgIGFkZEZpbGVUeXBlKCIzR1BQIiwgRklMRV9UWVBFXzNHUFAsICJ2aWRlby8zZ3BwIik7Ci0gICAgICAgIGFkZEZpbGVUeXBlKCIzRzIiLCBGSUxFX1RZUEVfM0dQUDIsICJ2aWRlby8zZ3BwMiIpOwotICAgICAgICBhZGRGaWxlVHlwZSgiM0dQUDIiLCBGSUxFX1RZUEVfM0dQUDIsICJ2aWRlby8zZ3BwMiIpOworICAgICAgICBhZGRGaWxlVHlwZSgiTVBFRyIsIEZJTEVfVFlQRV9NUDQsICJ2aWRlby9tcGVnIiwgTXRwLk9iamVjdC5GT1JNQVRfTVBFRyk7CisgICAgICAgIGFkZEZpbGVUeXBlKCJNUDQiLCBGSUxFX1RZUEVfTVA0LCAidmlkZW8vbXA0IiwgTXRwLk9iamVjdC5GT1JNQVRfTVBFRyk7CisgICAgICAgIGFkZEZpbGVUeXBlKCJNNFYiLCBGSUxFX1RZUEVfTTRWLCAidmlkZW8vbXA0IiwgTXRwLk9iamVjdC5GT1JNQVRfTVBFRyk7CisgICAgICAgIGFkZEZpbGVUeXBlKCIzR1AiLCBGSUxFX1RZUEVfM0dQUCwgInZpZGVvLzNncHAiLCAgTXRwLk9iamVjdC5GT1JNQVRfM0dQX0NPTlRBSU5FUik7CisgICAgICAgIGFkZEZpbGVUeXBlKCIzR1BQIiwgRklMRV9UWVBFXzNHUFAsICJ2aWRlby8zZ3BwIiwgTXRwLk9iamVjdC5GT1JNQVRfM0dQX0NPTlRBSU5FUik7CisgICAgICAgIGFkZEZpbGVUeXBlKCIzRzIiLCBGSUxFX1RZUEVfM0dQUDIsICJ2aWRlby8zZ3BwMiIsIE10cC5PYmplY3QuRk9STUFUXzNHUF9DT05UQUlORVIpOworICAgICAgICBhZGRGaWxlVHlwZSgiM0dQUDIiLCBGSUxFX1RZUEVfM0dQUDIsICJ2aWRlby8zZ3BwMiIsIE10cC5PYmplY3QuRk9STUFUXzNHUF9DT05UQUlORVIpOwogICAgICAgICBhZGRGaWxlVHlwZSgiTUtWIiwgRklMRV9UWVBFX01LViwgInZpZGVvL3gtbWF0cm9za2EiKTsKICAgICAgICAgYWRkRmlsZVR5cGUoIldFQk0iLCBGSUxFX1RZUEVfTUtWLCAidmlkZW8veC1tYXRyb3NrYSIpOwogICAgICAgICBhZGRGaWxlVHlwZSgiVFMiLCBGSUxFX1RZUEVfTVAyVFMsICJ2aWRlby9tcDJ0cyIpOwogCiAgICAgICAgIGlmIChpc1dNVkVuYWJsZWQoKSkgewotICAgICAgICAgICAgYWRkRmlsZVR5cGUoIldNViIsIEZJTEVfVFlQRV9XTVYsICJ2aWRlby94LW1zLXdtdiIpOworICAgICAgICAgICAgYWRkRmlsZVR5cGUoIldNViIsIEZJTEVfVFlQRV9XTVYsICJ2aWRlby94LW1zLXdtdiIsIE10cC5PYmplY3QuRk9STUFUX1dNVik7CiAgICAgICAgICAgICBhZGRGaWxlVHlwZSgiQVNGIiwgRklMRV9UWVBFX0FTRiwgInZpZGVvL3gtbXMtYXNmIik7CiAgICAgICAgIH0KIAotICAgICAgICBhZGRGaWxlVHlwZSgiSlBHIiwgRklMRV9UWVBFX0pQRUcsICJpbWFnZS9qcGVnIik7Ci0gICAgICAgIGFkZEZpbGVUeXBlKCJKUEVHIiwgRklMRV9UWVBFX0pQRUcsICJpbWFnZS9qcGVnIik7Ci0gICAgICAgIGFkZEZpbGVUeXBlKCJHSUYiLCBGSUxFX1RZUEVfR0lGLCAiaW1hZ2UvZ2lmIik7Ci0gICAgICAgIGFkZEZpbGVUeXBlKCJQTkciLCBGSUxFX1RZUEVfUE5HLCAiaW1hZ2UvcG5nIik7Ci0gICAgICAgIGFkZEZpbGVUeXBlKCJCTVAiLCBGSUxFX1RZUEVfQk1QLCAiaW1hZ2UveC1tcy1ibXAiKTsKKyAgICAgICAgYWRkRmlsZVR5cGUoIkpQRyIsIEZJTEVfVFlQRV9KUEVHLCAiaW1hZ2UvanBlZyIsIE10cC5PYmplY3QuRk9STUFUX0VYSUZfSlBFRyk7CisgICAgICAgIGFkZEZpbGVUeXBlKCJKUEVHIiwgRklMRV9UWVBFX0pQRUcsICJpbWFnZS9qcGVnIiwgTXRwLk9iamVjdC5GT1JNQVRfRVhJRl9KUEVHKTsKKyAgICAgICAgYWRkRmlsZVR5cGUoIkdJRiIsIEZJTEVfVFlQRV9HSUYsICJpbWFnZS9naWYiLCBNdHAuT2JqZWN0LkZPUk1BVF9HSUYpOworICAgICAgICBhZGRGaWxlVHlwZSgiUE5HIiwgRklMRV9UWVBFX1BORywgImltYWdlL3BuZyIsIE10cC5PYmplY3QuRk9STUFUX1BORyk7CisgICAgICAgIGFkZEZpbGVUeXBlKCJCTVAiLCBGSUxFX1RZUEVfQk1QLCAiaW1hZ2UveC1tcy1ibXAiLCBNdHAuT2JqZWN0LkZPUk1BVF9CTVApOwogICAgICAgICBhZGRGaWxlVHlwZSgiV0JNUCIsIEZJTEVfVFlQRV9XQk1QLCAiaW1hZ2Uvdm5kLndhcC53Ym1wIik7CiAgCi0gICAgICAgIGFkZEZpbGVUeXBlKCJNM1UiLCBGSUxFX1RZUEVfTTNVLCAiYXVkaW8veC1tcGVndXJsIik7Ci0gICAgICAgIGFkZEZpbGVUeXBlKCJQTFMiLCBGSUxFX1RZUEVfUExTLCAiYXVkaW8veC1zY3BscyIpOwotICAgICAgICBhZGRGaWxlVHlwZSgiV1BMIiwgRklMRV9UWVBFX1dQTCwgImFwcGxpY2F0aW9uL3ZuZC5tcy13cGwiKTsKKyAgICAgICAgYWRkRmlsZVR5cGUoIk0zVSIsIEZJTEVfVFlQRV9NM1UsICJhdWRpby94LW1wZWd1cmwiLCBNdHAuT2JqZWN0LkZPUk1BVF9NM1VfUExBWUxJU1QpOworICAgICAgICBhZGRGaWxlVHlwZSgiUExTIiwgRklMRV9UWVBFX1BMUywgImF1ZGlvL3gtc2NwbHMiLCBNdHAuT2JqZWN0LkZPUk1BVF9QTFNfUExBWUxJU1QpOworICAgICAgICBhZGRGaWxlVHlwZSgiV1BMIiwgRklMRV9UWVBFX1dQTCwgImFwcGxpY2F0aW9uL3ZuZC5tcy13cGwiLCBNdHAuT2JqZWN0LkZPUk1BVF9XUExfUExBWUxJU1QpOwogCiAgICAgICAgIC8vIGNvbXB1dGUgZmlsZSBleHRlbnNpb25zIGxpc3QgZm9yIG5hdGl2ZSBNZWRpYSBTY2FubmVyCiAgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CkBAIC0yMjIsNCArMjQwLDI1IEBACiAgICAgICAgIHJldHVybiAodmFsdWUgPT0gbnVsbCA/IDAgOiB2YWx1ZS5pbnRWYWx1ZSgpKTsKICAgICB9CiAKKyAgICBwdWJsaWMgc3RhdGljIGludCBnZXRGb3JtYXRDb2RlKFN0cmluZyBmaWxlTmFtZSwgU3RyaW5nIG1pbWVUeXBlKSB7CisgICAgICAgIGlmIChtaW1lVHlwZSAhPSBudWxsKSB7CisgICAgICAgICAgICBJbnRlZ2VyIHZhbHVlID0gc01pbWVUeXBlVG9Gb3JtYXRNYXAuZ2V0KG1pbWVUeXBlKTsKKyAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLmludFZhbHVlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaW50IGxhc3REb3QgPSBmaWxlTmFtZS5sYXN0SW5kZXhPZignLicpOworICAgICAgICBpZiAobGFzdERvdCA+IDApIHsKKyAgICAgICAgICAgIFN0cmluZyBleHRlbnNpb24gPSBmaWxlTmFtZS5zdWJzdHJpbmcobGFzdERvdCArIDEpOworICAgICAgICAgICAgSW50ZWdlciB2YWx1ZSA9IHNGaWxlVHlwZVRvRm9ybWF0TWFwLmdldChleHRlbnNpb24pOworICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUuaW50VmFsdWUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gTXRwLk9iamVjdC5GT1JNQVRfVU5ERUZJTkVEOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1pbWVUeXBlRm9yRm9ybWF0Q29kZShpbnQgZm9ybWF0Q29kZSkgeworICAgICAgICByZXR1cm4gc0Zvcm1hdFRvTWltZVR5cGVNYXAuZ2V0KGZvcm1hdENvZGUpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9NZWRpYVJlY29yZGVyLmphdmEgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvTWVkaWFSZWNvcmRlci5qYXZhCmluZGV4IDM0YTg2ZWMuLjk0ZjVjN2EgMTAwNjQ0Ci0tLSBhL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9NZWRpYVJlY29yZGVyLmphdmEKKysrIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL01lZGlhUmVjb3JkZXIuamF2YQpAQCAtMjgyLDYgKzI4MiwyOCBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIEVuYWJsZXMvRGlzYWJsZXMgdGltZSBsYXBzZSBjYXB0dXJlIGFuZCBzZXRzIGl0cyBwYXJhbWV0ZXJzLiBUaGlzIG1ldGhvZCBzaG91bGQKKyAgICAgKiBiZSBjYWxsZWQgYWZ0ZXIgc2V0UHJvZmlsZSgpLgorICAgICAqCisgICAgICogQHBhcmFtIGVuYWJsZVRpbWVMYXBzZSBQYXNzIHRydWUgdG8gZW5hYmxlIHRpbWUgbGFwc2UgY2FwdHVyZSwgZmFsc2UgdG8gZGlzYWJsZSBpdC4KKyAgICAgKiBAcGFyYW0gdXNlU3RpbGxDYW1lcmFGb3JUaW1lTGFwc2UgUGFzcyB0cnVlIHRvIHVzZSBzdGlsbCBjYW1lcmEgZm9yIGNhcHR1cmluZyB0aW1lIGxhcHNlCisgICAgICogZnJhbWVzLCBmYWxzZSB0byB1c2UgdGhlIHZpZGVvIGNhbWVyYS4KKyAgICAgKiBAcGFyYW0gdGltZUJldHdlZW5UaW1lTGFwc2VGcmFtZUNhcHR1cmVNcyB0aW1lIGJldHdlZW4gdHdvIGNhcHR1cmVzIG9mIHRpbWUgbGFwc2UgZnJhbWVzLgorICAgICAqIEBwYXJhbSBlbmNvZGVyTGV2ZWwgdGhlIHZpZGVvIGVuY29kZXIgbGV2ZWwuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VGltZUxhcHNlUGFyYW1ldGVycyhib29sZWFuIGVuYWJsZVRpbWVMYXBzZSwKKyAgICAgICAgICAgIGJvb2xlYW4gdXNlU3RpbGxDYW1lcmFGb3JUaW1lTGFwc2UsCisgICAgICAgICAgICBpbnQgdGltZUJldHdlZW5UaW1lTGFwc2VGcmFtZUNhcHR1cmVNcywgaW50IGVuY29kZXJMZXZlbCkgeworICAgICAgICBzZXRQYXJhbWV0ZXIoU3RyaW5nLmZvcm1hdCgidGltZS1sYXBzZS1lbmFibGU9JWQiLAorICAgICAgICAgICAgICAgICAgICAoZW5hYmxlVGltZUxhcHNlKSA/IDEgOiAwKSk7CisgICAgICAgIHNldFBhcmFtZXRlcihTdHJpbmcuZm9ybWF0KCJ1c2Utc3RpbGwtY2FtZXJhLWZvci10aW1lLWxhcHNlPSVkIiwKKyAgICAgICAgICAgICAgICAgICAgKHVzZVN0aWxsQ2FtZXJhRm9yVGltZUxhcHNlKSA/IDEgOiAwKSk7CisgICAgICAgIHNldFBhcmFtZXRlcihTdHJpbmcuZm9ybWF0KCJ0aW1lLWJldHdlZW4tdGltZS1sYXBzZS1mcmFtZS1jYXB0dXJlPSVkIiwKKyAgICAgICAgICAgICAgICAgICAgdGltZUJldHdlZW5UaW1lTGFwc2VGcmFtZUNhcHR1cmVNcykpOworICAgICAgICBzZXRWaWRlb0VuY29kZXJMZXZlbChlbmNvZGVyTGV2ZWwpOworICAgIH0KKworICAgIC8qKgogICAgICAqIFNldHMgdGhlIGZvcm1hdCBvZiB0aGUgb3V0cHV0IGZpbGUgcHJvZHVjZWQgZHVyaW5nIHJlY29yZGluZy4gQ2FsbCB0aGlzCiAgICAgICogYWZ0ZXIgc2V0QXVkaW9Tb3VyY2UoKS9zZXRWaWRlb1NvdXJjZSgpIGJ1dCBiZWZvcmUgcHJlcGFyZSgpLgogICAgICAqCkBAIC00NDgsNiArNDcwLDE2IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogU2V0cyB0aGUgbGV2ZWwgb2YgdGhlIGVuY29kZXIuIENhbGwgdGhpcyBiZWZvcmUgcHJlcGFyZSgpLgorICAgICAqCisgICAgICogQHBhcmFtIGVuY29kZXJMZXZlbCB0aGUgdmlkZW8gZW5jb2RlciBsZXZlbC4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFZpZGVvRW5jb2RlckxldmVsKGludCBlbmNvZGVyTGV2ZWwpIHsKKyAgICAgICAgc2V0UGFyYW1ldGVyKFN0cmluZy5mb3JtYXQoInZpZGVvLXBhcmFtLWVuY29kZXItbGV2ZWw9JWQiLCBlbmNvZGVyTGV2ZWwpKTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBQYXNzIGluIHRoZSBmaWxlIGRlc2NyaXB0b3Igb2YgdGhlIGZpbGUgdG8gYmUgd3JpdHRlbi4gQ2FsbCB0aGlzIGFmdGVyCiAgICAgICogc2V0T3V0cHV0Rm9ybWF0KCkgYnV0IGJlZm9yZSBwcmVwYXJlKCkuCiAgICAgICoKZGlmZiAtLWdpdCBhL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9NZWRpYVNjYW5uZXIuamF2YSBiL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9NZWRpYVNjYW5uZXIuamF2YQppbmRleCAzMzMzMjY4Li43ZDhlZjU4IDEwMDY0NAotLS0gYS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvTWVkaWFTY2FubmVyLmphdmEKKysrIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL01lZGlhU2Nhbm5lci5qYXZhCkBAIC0zMDUsNiArMzA1LDcgQEAKICAgICBwcml2YXRlIFVyaSBtR2VucmVzVXJpOwogICAgIHByaXZhdGUgVXJpIG1QbGF5bGlzdHNVcmk7CiAgICAgcHJpdmF0ZSBib29sZWFuIG1Qcm9jZXNzUGxheWxpc3RzLCBtUHJvY2Vzc0dlbnJlczsKKyAgICBwcml2YXRlIGludCBtTXRwT2JqZWN0SGFuZGxlOwogCiAgICAgLy8gdXNlZCB3aGVuIHNjYW5uaW5nIHRoZSBpbWFnZSBkYXRhYmFzZSBzbyB3ZSBrbm93IHdoZXRoZXIgd2UgaGF2ZSB0byBwcnVuZQogICAgIC8vIG9sZCB0aHVtYm5haWwgZmlsZXMKQEAgLTU1NSw3ICs1NTYsOCBAQAogICAgICAgICAgICAgICAgIG1UaXRsZSA9IHZhbHVlOwogICAgICAgICAgICAgfSBlbHNlIGlmIChuYW1lLmVxdWFsc0lnbm9yZUNhc2UoImFydGlzdCIpIHx8IG5hbWUuc3RhcnRzV2l0aCgiYXJ0aXN0OyIpKSB7CiAgICAgICAgICAgICAgICAgbUFydGlzdCA9IHZhbHVlLnRyaW0oKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJhbGJ1bWFydGlzdCIpIHx8IG5hbWUuc3RhcnRzV2l0aCgiYWxidW1hcnRpc3Q7IikpIHsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJhbGJ1bWFydGlzdCIpIHx8IG5hbWUuc3RhcnRzV2l0aCgiYWxidW1hcnRpc3Q7IikKKyAgICAgICAgICAgICAgICAgICAgfHwgbmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJiYW5kIikgfHwgbmFtZS5zdGFydHNXaXRoKCJiYW5kOyIpKSB7CiAgICAgICAgICAgICAgICAgbUFsYnVtQXJ0aXN0ID0gdmFsdWUudHJpbSgpOwogICAgICAgICAgICAgfSBlbHNlIGlmIChuYW1lLmVxdWFsc0lnbm9yZUNhc2UoImFsYnVtIikgfHwgbmFtZS5zdGFydHNXaXRoKCJhbGJ1bTsiKSkgewogICAgICAgICAgICAgICAgIG1BbGJ1bSA9IHZhbHVlLnRyaW0oKTsKQEAgLTYyNSw2ICs2MjcsOSBAQAogICAgICAgICAgICAgbWFwLnB1dChNZWRpYVN0b3JlLk1lZGlhQ29sdW1ucy5EQVRFX01PRElGSUVELCBtTGFzdE1vZGlmaWVkKTsKICAgICAgICAgICAgIG1hcC5wdXQoTWVkaWFTdG9yZS5NZWRpYUNvbHVtbnMuU0laRSwgbUZpbGVTaXplKTsKICAgICAgICAgICAgIG1hcC5wdXQoTWVkaWFTdG9yZS5NZWRpYUNvbHVtbnMuTUlNRV9UWVBFLCBtTWltZVR5cGUpOworICAgICAgICAgICAgaWYgKG1NdHBPYmplY3RIYW5kbGUgIT0gMCkgeworICAgICAgICAgICAgICAgIG1hcC5wdXQoTWVkaWFTdG9yZS5NZWRpYUNvbHVtbnMuTUVESUFfU0NBTk5FUl9ORVdfT0JKRUNUX0lELCBtTXRwT2JqZWN0SGFuZGxlKTsKKyAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKE1lZGlhRmlsZS5pc1ZpZGVvRmlsZVR5cGUobUZpbGVUeXBlKSkgewogICAgICAgICAgICAgICAgIG1hcC5wdXQoVmlkZW8uTWVkaWEuQVJUSVNULCAobUFydGlzdCAhPSBudWxsICYmIG1BcnRpc3QubGVuZ3RoKCkgPiAwID8gbUFydGlzdCA6IE1lZGlhU3RvcmUuVU5LTk9XTl9TVFJJTkcpKTsKQEAgLTEyMjcsNiArMTIzMiwxNCBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcHVibGljIFVyaSBzY2FuTXRwRmlsZShTdHJpbmcgcGF0aCwgU3RyaW5nIHZvbHVtZU5hbWUsIGludCBvYmplY3RIYW5kbGUsIGludCBmb3JtYXQpIHsKKyAgICAgICAgU3RyaW5nIG1pbWVUeXBlID0gTWVkaWFGaWxlLmdldE1pbWVUeXBlRm9yRm9ybWF0Q29kZShmb3JtYXQpOworICAgICAgICBtTXRwT2JqZWN0SGFuZGxlID0gb2JqZWN0SGFuZGxlOworICAgICAgICBVcmkgcmVzdWx0ID0gc2NhblNpbmdsZUZpbGUocGF0aCwgdm9sdW1lTmFtZSwgbWltZVR5cGUpOworICAgICAgICBtTXRwT2JqZWN0SGFuZGxlID0gMDsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKICAgICAvLyByZXR1cm5zIHRoZSBudW1iZXIgb2YgbWF0Y2hpbmcgZmlsZS9kaXJlY3RvcnkgbmFtZXMsIHN0YXJ0aW5nIGZyb20gdGhlIHJpZ2h0CiAgICAgcHJpdmF0ZSBpbnQgbWF0Y2hQYXRocyhTdHJpbmcgcGF0aDEsIFN0cmluZyBwYXRoMikgewogICAgICAgICBpbnQgcmVzdWx0ID0gMDsKZGlmZiAtLWdpdCBhL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9NdHBDbGllbnQuamF2YSBiL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9NdHBDbGllbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYWViY2I4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL010cENsaWVudC5qYXZhCkBAIC0wLDAgKzEsMTA0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhOworCitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvcjsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCisvKioKKyAqIHtAaGlkZX0KKyAqLworcHVibGljIGNsYXNzIE10cENsaWVudCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk10cENsaWVudCI7CisKKyAgICBwcml2YXRlIGZpbmFsIExpc3RlbmVyIG1MaXN0ZW5lcjsKKworICAgIHN0YXRpYyB7CisgICAgICAgIFN5c3RlbS5sb2FkTGlicmFyeSgibWVkaWFfam5pIik7CisgICAgfQorCisgICAgcHVibGljIE10cENsaWVudChMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICBuYXRpdmVfc2V0dXAoKTsKKyAgICAgICAgaWYgKGxpc3RlbmVyID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiTXRwQ2xpZW50OiBsaXN0ZW5lciBpcyBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgbUxpc3RlbmVyID0gbGlzdGVuZXI7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKSB7CisgICAgICAgIG5hdGl2ZV9maW5hbGl6ZSgpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHN0YXJ0KCkgeworICAgICAgICByZXR1cm4gbmF0aXZlX3N0YXJ0KCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc3RvcCgpIHsKKyAgICAgICAgbmF0aXZlX3N0b3AoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBkZWxldGVPYmplY3QoaW50IGRldmljZUlELCBpbnQgb2JqZWN0SUQpIHsKKyAgICAgICAgcmV0dXJuIG5hdGl2ZV9kZWxldGVfb2JqZWN0KGRldmljZUlELCBvYmplY3RJRCk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRQYXJlbnQoaW50IGRldmljZUlELCBpbnQgb2JqZWN0SUQpIHsKKyAgICAgICAgcmV0dXJuIG5hdGl2ZV9nZXRfcGFyZW50KGRldmljZUlELCBvYmplY3RJRCk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRTdG9yYWdlSUQoaW50IGRldmljZUlELCBpbnQgb2JqZWN0SUQpIHsKKyAgICAgICAgcmV0dXJuIG5hdGl2ZV9nZXRfc3RvcmFnZV9pZChkZXZpY2VJRCwgb2JqZWN0SUQpOworICAgIH0KKworICAgIC8vIGNyZWF0ZSBhIGZpbGUgZGVzY3JpcHRvciBmb3IgcmVhZGluZyB0aGUgY29udGVudHMgb2YgYW4gb2JqZWN0IG92ZXIgTVRQCisgICAgcHVibGljIFBhcmNlbEZpbGVEZXNjcmlwdG9yIG9wZW5GaWxlKGludCBkZXZpY2VJRCwgaW50IG9iamVjdElEKSB7CisgICAgICAgIHJldHVybiBuYXRpdmVfb3Blbl9maWxlKGRldmljZUlELCBvYmplY3RJRCk7CisgICAgfQorCisgICAgcHVibGljIGludGVyZmFjZSBMaXN0ZW5lciB7CisgICAgICAgIC8vIGNhbGxlZCB3aGVuIGEgbmV3IE1UUCBkZXZpY2UgaGFzIGJlZW4gZGlzY292ZXJlZAorICAgICAgICB2b2lkIGRldmljZUFkZGVkKGludCBpZCk7CisKKyAgICAgICAgLy8gY2FsbGVkIHdoZW4gYW4gTVRQIGRldmljZSBoYXMgYmVlbiByZW1vdmVkCisgICAgICAgIHZvaWQgZGV2aWNlUmVtb3ZlZChpbnQgaWQpOworICAgIH0KKworICAgIC8vIGNhbGxlZCBmcm9tIG5hdGl2ZSBjb2RlCisgICAgcHJpdmF0ZSB2b2lkIGRldmljZUFkZGVkKGludCBpZCkgeworICAgICAgICBMb2cuZChUQUcsICJkZXZpY2VBZGRlZCAiICsgaWQpOworICAgICAgICBtTGlzdGVuZXIuZGV2aWNlQWRkZWQoaWQpOworICAgIH0KKworICAgIC8vIGNhbGxlZCBmcm9tIG5hdGl2ZSBjb2RlCisgICAgcHJpdmF0ZSB2b2lkIGRldmljZVJlbW92ZWQoaW50IGlkKSB7CisgICAgICAgIExvZy5kKFRBRywgImRldmljZVJlbW92ZWQgIiArIGlkKTsKKyAgICAgICAgbUxpc3RlbmVyLmRldmljZVJlbW92ZWQoaWQpOworICAgIH0KKworICAgIC8vIHVzZWQgYnkgdGhlIEpOSSBjb2RlCisgICAgcHJpdmF0ZSBpbnQgbU5hdGl2ZUNvbnRleHQ7CisKKyAgICBwcml2YXRlIG5hdGl2ZSBmaW5hbCB2b2lkIG5hdGl2ZV9zZXR1cCgpOworICAgIHByaXZhdGUgbmF0aXZlIGZpbmFsIHZvaWQgbmF0aXZlX2ZpbmFsaXplKCk7CisgICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiBuYXRpdmVfc3RhcnQoKTsKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5hdGl2ZV9zdG9wKCk7CisgICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiBuYXRpdmVfZGVsZXRlX29iamVjdChpbnQgZGV2aWNlSUQsIGludCBvYmplY3RJRCk7CisgICAgcHJpdmF0ZSBuYXRpdmUgaW50IG5hdGl2ZV9nZXRfcGFyZW50KGludCBkZXZpY2VJRCwgaW50IG9iamVjdElEKTsKKyAgICBwcml2YXRlIG5hdGl2ZSBpbnQgbmF0aXZlX2dldF9zdG9yYWdlX2lkKGludCBkZXZpY2VJRCwgaW50IG9iamVjdElEKTsKKyAgICBwcml2YXRlIG5hdGl2ZSBQYXJjZWxGaWxlRGVzY3JpcHRvciBuYXRpdmVfb3Blbl9maWxlKGludCBkZXZpY2VJRCwgaW50IG9iamVjdElEKTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9NdHBDdXJzb3IuamF2YSBiL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9NdHBDdXJzb3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWNmZDBkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL010cEN1cnNvci5qYXZhCkBAIC0wLDAgKzEsMjIzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhOworCitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5BYnN0cmFjdFdpbmRvd2VkQ3Vyc29yOworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yV2luZG93OworaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuTXRwOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKKworLyoqCisgICogQ3Vyc29yIGNsYXNzIGZvciBNVFAgY29udGVudCBwcm92aWRlcgorICAqIEBoaWRlCisgICovCitwdWJsaWMgZmluYWwgY2xhc3MgTXRwQ3Vyc29yIGV4dGVuZHMgQWJzdHJhY3RXaW5kb3dlZEN1cnNvciB7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTXRwQ3Vyc29yIjsKKyAgICBzdGF0aWMgZmluYWwgaW50IE5PX0NPVU5UID0gLTE7CisKKyAgICAvKiBjb25zdGFudHMgZm9yIG1RdWVyeVR5cGUgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVZJQ0UgICAgICAgICAgICAgID0gMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVZJQ0VfSUQgICAgICAgICAgID0gMjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVE9SQUdFICAgICAgICAgICAgID0gMzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVE9SQUdFX0lEICAgICAgICAgID0gNDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPQkpFQ1QgICAgICAgICAgICAgID0gNTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPQkpFQ1RfSUQgICAgICAgICAgID0gNjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVE9SQUdFX0NISUxEUkVOICAgID0gNzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPQkpFQ1RfQ0hJTERSRU4gICAgID0gODsKKworICAgIHByaXZhdGUgaW50IG1RdWVyeVR5cGU7CisgICAgcHJpdmF0ZSBpbnQgbURldmljZUlEOworICAgIHByaXZhdGUgaW50IG1TdG9yYWdlSUQ7CisgICAgcHJpdmF0ZSBpbnQgbVFiamVjdElEOworCisgICAgLyoqIFRoZSBuYW1lcyBvZiB0aGUgY29sdW1ucyBpbiB0aGUgcHJvamVjdGlvbiAqLworICAgIHByaXZhdGUgU3RyaW5nW10gbUNvbHVtbnM7CisKKyAgICAvKiogVGhlIG51bWJlciBvZiByb3dzIGluIHRoZSBjdXJzb3IgKi8KKyAgICBwcml2YXRlIGludCBtQ291bnQgPSBOT19DT1VOVDsKKworICAgIHByaXZhdGUgZmluYWwgTXRwQ2xpZW50IG1DbGllbnQ7CisKKyAgICBwdWJsaWMgTXRwQ3Vyc29yKE10cENsaWVudCBjbGllbnQsIGludCBxdWVyeVR5cGUsIGludCBkZXZpY2VJRCwgaW50IHN0b3JhZ2VJRCwgaW50IG9iamVjdElELAorICAgICAgICAgICAgU3RyaW5nW10gcHJvamVjdGlvbikgeworCisgICAgICAgIG1DbGllbnQgPSBjbGllbnQ7CisgICAgICAgIG1RdWVyeVR5cGUgPSBxdWVyeVR5cGU7CisgICAgICAgIG1EZXZpY2VJRCA9IGRldmljZUlEOworICAgICAgICBtU3RvcmFnZUlEID0gc3RvcmFnZUlEOworICAgICAgICBtUWJqZWN0SUQgPSBvYmplY3RJRDsKKyAgICAgICAgbUNvbHVtbnMgPSBwcm9qZWN0aW9uOworCisgICAgICAgIEhhc2hNYXA8U3RyaW5nLCBJbnRlZ2VyPiBtYXA7CisgICAgICAgIHN3aXRjaCAocXVlcnlUeXBlKSB7CisgICAgICAgICAgICBjYXNlIERFVklDRToKKyAgICAgICAgICAgIGNhc2UgREVWSUNFX0lEOgorICAgICAgICAgICAgICAgIG1hcCA9IHNEZXZpY2VQcm9qZWN0aW9uTWFwOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTVE9SQUdFOgorICAgICAgICAgICAgY2FzZSBTVE9SQUdFX0lEOgorICAgICAgICAgICAgICAgIG1hcCA9IHNTdG9yYWdlUHJvamVjdGlvbk1hcDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT0JKRUNUOgorICAgICAgICAgICAgY2FzZSBPQkpFQ1RfSUQ6CisgICAgICAgICAgICBjYXNlIFNUT1JBR0VfQ0hJTERSRU46CisgICAgICAgICAgICBjYXNlIE9CSkVDVF9DSElMRFJFTjoKKyAgICAgICAgICAgICAgICBtYXAgPSBzT2JqZWN0UHJvamVjdGlvbk1hcDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidW5rbm93biBxdWVyeSB0eXBlICIgICsgcXVlcnlUeXBlKTsKKyAgICAgICAgfQorCisgICAgICAgIGludFtdIGNvbHVtbnMgPSBuZXcgaW50W3Byb2plY3Rpb24ubGVuZ3RoXTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9qZWN0aW9uLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBJbnRlZ2VyIGlkID0gbWFwLmdldChwcm9qZWN0aW9uW2ldKTsKKyAgICAgICAgICAgIGlmIChpZCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidW5rbm93biBjb2x1bW4gIiAgKyBwcm9qZWN0aW9uW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbHVtbnNbaV0gPSBpZC5pbnRWYWx1ZSgpOworICAgICAgICB9CisgICAgICAgIG5hdGl2ZV9zZXR1cChjbGllbnQsIHF1ZXJ5VHlwZSwgZGV2aWNlSUQsIHN0b3JhZ2VJRCwgb2JqZWN0SUQsIGNvbHVtbnMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkgeworICAgICAgICBuYXRpdmVfZmluYWxpemUoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGdldENvdW50KCkgeworICAgICAgICBpZiAobUNvdW50ID09IE5PX0NPVU5UKSB7CisgICAgICAgICAgICBmaWxsV2luZG93KDApOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtQ291bnQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gcmVxdWVyeSgpIHsKKyAgICAgICAgTG9nLmQoVEFHLCAicmVxdWVyeSIpOworICAgICAgICBtQ291bnQgPSBOT19DT1VOVDsKKyAgICAgICAgaWYgKG1XaW5kb3cgIT0gbnVsbCkgeworICAgICAgICAgICAgbVdpbmRvdy5jbGVhcigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdXBlci5yZXF1ZXJ5KCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGZpbGxXaW5kb3coaW50IHN0YXJ0UG9zKSB7CisgICAgICAgIGlmIChtV2luZG93ID09IG51bGwpIHsKKyAgICAgICAgICAgIC8vIElmIHRoZXJlIGlzbid0IGEgd2luZG93IHNldCBhbHJlYWR5IGl0IHdpbGwgb25seSBiZSBhY2Nlc3NlZCBsb2NhbGx5CisgICAgICAgICAgICBtV2luZG93ID0gbmV3IEN1cnNvcldpbmRvdyh0cnVlIC8qIHRoZSB3aW5kb3cgaXMgbG9jYWwgb25seSAqLyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbVdpbmRvdy5jbGVhcigpOworICAgICAgICB9CisgICAgICAgIG1XaW5kb3cuc2V0U3RhcnRQb3NpdGlvbihzdGFydFBvcyk7CisgICAgICAgIG1Db3VudCA9IG5hdGl2ZV9maWxsX3dpbmRvdyhtV2luZG93LCBzdGFydFBvcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZ1tdIGdldENvbHVtbk5hbWVzKCkgeworICAgICAgICBMb2cuZChUQUcsICJnZXRDb2x1bW5OYW1lcyByZXR1cm5pbmcgIiArIG1Db2x1bW5zKTsKKyAgICAgICAgcmV0dXJuIG1Db2x1bW5zOworICAgIH0KKworICAgIC8qIERldmljZSBDb2x1bW4gSURzICovCisgICAgIC8qIFRoZXNlIG11c3QgbWF0Y2ggdGhlIHZhbHVlcyBpbiBNdHBDdXJzb3IuY3BwICovCisgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVWSUNFX1JPV19JRCAgICAgICAgICA9IDE7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFVklDRV9NQU5VRkFDVFVSRVIgICAgPSAyOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERVZJQ0VfTU9ERUwgICAgICAgICAgID0gMzsKKworICAgIC8qIFN0b3JhZ2UgQ29sdW1uIElEcyAqLworICAgIC8qIFRoZXNlIG11c3QgbWF0Y2ggdGhlIHZhbHVlcyBpbiBNdHBDdXJzb3IuY3BwICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUT1JBR0VfUk9XX0lEICAgICAgICAgPSAxMDE7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUT1JBR0VfSURFTlRJRklFUiAgICAgPSAxMDI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUT1JBR0VfREVTQ1JJUFRJT04gICAgPSAxMDM7CisKKyAgICAvKiBPYmplY3QgQ29sdW1uIElEcyAqLworICAgIC8qIFRoZXNlIG11c3QgbWF0Y2ggdGhlIHZhbHVlcyBpbiBNdHBDdXJzb3IuY3BwICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE9CSkVDVF9ST1dfSUQgICAgICAgICAgICAgID0gMjAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBPQkpFQ1RfU1RPUkFHRV9JRCAgICAgICAgICA9IDIwMjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgT0JKRUNUX0ZPUk1BVCAgICAgICAgICAgICAgPSAyMDM7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE9CSkVDVF9QUk9URUNUSU9OX1NUQVRVUyAgID0gMjA0OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBPQkpFQ1RfU0laRSAgICAgICAgICAgICAgICA9IDIwNTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgT0JKRUNUX1RIVU1CX0ZPUk1BVCAgICAgICAgPSAyMDY7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE9CSkVDVF9USFVNQl9TSVpFICAgICAgICAgID0gMjA3OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBPQkpFQ1RfVEhVTUJfV0lEVEggICAgICAgICA9IDIwODsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgT0JKRUNUX1RIVU1CX0hFSUdIVCAgICAgICAgPSAyMDk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE9CSkVDVF9JTUFHRV9XSURUSCAgICAgICAgID0gMjEwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBPQkpFQ1RfSU1BR0VfSEVJR0hUICAgICAgICA9IDIxMTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgT0JKRUNUX0lNQUdFX0RFUFRIICAgICAgICAgPSAyMTI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE9CSkVDVF9QQVJFTlQgICAgICAgICAgICAgID0gMjEzOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBPQkpFQ1RfQVNTT0NJQVRJT05fVFlQRSAgICA9IDIxNDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgT0JKRUNUX0FTU09DSUFUSU9OX0RFU0MgICAgPSAyMTU7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE9CSkVDVF9TRVFVRU5DRV9OVU1CRVIgICAgID0gMjE2OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBPQkpFQ1RfTkFNRSAgICAgICAgICAgICAgICA9IDIxNzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgT0JKRUNUX0RBVEVfQ1JFQVRFRCAgICAgICAgPSAyMTg7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE9CSkVDVF9EQVRFX01PRElGSUVEICAgICAgID0gMjE5OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBPQkpFQ1RfS0VZV09SRFMgICAgICAgICAgICA9IDIyMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgT0JKRUNUX1RIVU1CICAgICAgICAgICAgICAgPSAyMjE7CisKKyAgICBwcml2YXRlIHN0YXRpYyBIYXNoTWFwPFN0cmluZywgSW50ZWdlcj4gc0RldmljZVByb2plY3Rpb25NYXA7CisgICAgcHJpdmF0ZSBzdGF0aWMgSGFzaE1hcDxTdHJpbmcsIEludGVnZXI+IHNTdG9yYWdlUHJvamVjdGlvbk1hcDsKKyAgICBwcml2YXRlIHN0YXRpYyBIYXNoTWFwPFN0cmluZywgSW50ZWdlcj4gc09iamVjdFByb2plY3Rpb25NYXA7CisKKyAgICBzdGF0aWMgeworICAgICAgICBzRGV2aWNlUHJvamVjdGlvbk1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgSW50ZWdlcj4oKTsKKyAgICAgICAgc0RldmljZVByb2plY3Rpb25NYXAucHV0KE10cC5EZXZpY2UuX0lELCBuZXcgSW50ZWdlcihERVZJQ0VfUk9XX0lEKSk7CisgICAgICAgIHNEZXZpY2VQcm9qZWN0aW9uTWFwLnB1dChNdHAuRGV2aWNlLk1BTlVGQUNUVVJFUiwgbmV3IEludGVnZXIoREVWSUNFX01BTlVGQUNUVVJFUikpOworICAgICAgICBzRGV2aWNlUHJvamVjdGlvbk1hcC5wdXQoTXRwLkRldmljZS5NT0RFTCwgbmV3IEludGVnZXIoREVWSUNFX01PREVMKSk7CisKKyAgICAgICAgc1N0b3JhZ2VQcm9qZWN0aW9uTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJbnRlZ2VyPigpOworICAgICAgICBzU3RvcmFnZVByb2plY3Rpb25NYXAucHV0KE10cC5TdG9yYWdlLl9JRCwgbmV3IEludGVnZXIoU1RPUkFHRV9ST1dfSUQpKTsKKyAgICAgICAgc1N0b3JhZ2VQcm9qZWN0aW9uTWFwLnB1dChNdHAuU3RvcmFnZS5JREVOVElGSUVSLCBuZXcgSW50ZWdlcihTVE9SQUdFX0lERU5USUZJRVIpKTsKKyAgICAgICAgc1N0b3JhZ2VQcm9qZWN0aW9uTWFwLnB1dChNdHAuU3RvcmFnZS5ERVNDUklQVElPTiwgbmV3IEludGVnZXIoU1RPUkFHRV9ERVNDUklQVElPTikpOworCisgICAgICAgIHNPYmplY3RQcm9qZWN0aW9uTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJbnRlZ2VyPigpOworICAgICAgICBzT2JqZWN0UHJvamVjdGlvbk1hcC5wdXQoTXRwLk9iamVjdC5fSUQsIG5ldyBJbnRlZ2VyKE9CSkVDVF9ST1dfSUQpKTsKKyAgICAgICAgc09iamVjdFByb2plY3Rpb25NYXAucHV0KE10cC5PYmplY3QuU1RPUkFHRV9JRCwgbmV3IEludGVnZXIoT0JKRUNUX1NUT1JBR0VfSUQpKTsKKyAgICAgICAgc09iamVjdFByb2plY3Rpb25NYXAucHV0KE10cC5PYmplY3QuRk9STUFULCBuZXcgSW50ZWdlcihPQkpFQ1RfRk9STUFUKSk7CisgICAgICAgIHNPYmplY3RQcm9qZWN0aW9uTWFwLnB1dChNdHAuT2JqZWN0LlBST1RFQ1RJT05fU1RBVFVTLCBuZXcgSW50ZWdlcihPQkpFQ1RfUFJPVEVDVElPTl9TVEFUVVMpKTsKKyAgICAgICAgc09iamVjdFByb2plY3Rpb25NYXAucHV0KE10cC5PYmplY3QuU0laRSwgbmV3IEludGVnZXIoT0JKRUNUX1NJWkUpKTsKKyAgICAgICAgc09iamVjdFByb2plY3Rpb25NYXAucHV0KE10cC5PYmplY3QuVEhVTUJfRk9STUFULCBuZXcgSW50ZWdlcihPQkpFQ1RfVEhVTUJfRk9STUFUKSk7CisgICAgICAgIHNPYmplY3RQcm9qZWN0aW9uTWFwLnB1dChNdHAuT2JqZWN0LlRIVU1CX1NJWkUsIG5ldyBJbnRlZ2VyKE9CSkVDVF9USFVNQl9TSVpFKSk7CisgICAgICAgIHNPYmplY3RQcm9qZWN0aW9uTWFwLnB1dChNdHAuT2JqZWN0LlRIVU1CX1dJRFRILCBuZXcgSW50ZWdlcihPQkpFQ1RfVEhVTUJfV0lEVEgpKTsKKyAgICAgICAgc09iamVjdFByb2plY3Rpb25NYXAucHV0KE10cC5PYmplY3QuVEhVTUJfSEVJR0hULCBuZXcgSW50ZWdlcihPQkpFQ1RfVEhVTUJfSEVJR0hUKSk7CisgICAgICAgIHNPYmplY3RQcm9qZWN0aW9uTWFwLnB1dChNdHAuT2JqZWN0LklNQUdFX1dJRFRILCBuZXcgSW50ZWdlcihPQkpFQ1RfSU1BR0VfV0lEVEgpKTsKKyAgICAgICAgc09iamVjdFByb2plY3Rpb25NYXAucHV0KE10cC5PYmplY3QuSU1BR0VfSEVJR0hULCBuZXcgSW50ZWdlcihPQkpFQ1RfSU1BR0VfSEVJR0hUKSk7CisgICAgICAgIHNPYmplY3RQcm9qZWN0aW9uTWFwLnB1dChNdHAuT2JqZWN0LklNQUdFX0RFUFRILCBuZXcgSW50ZWdlcihPQkpFQ1RfSU1BR0VfREVQVEgpKTsKKyAgICAgICAgc09iamVjdFByb2plY3Rpb25NYXAucHV0KE10cC5PYmplY3QuUEFSRU5ULCBuZXcgSW50ZWdlcihPQkpFQ1RfUEFSRU5UKSk7CisgICAgICAgIHNPYmplY3RQcm9qZWN0aW9uTWFwLnB1dChNdHAuT2JqZWN0LkFTU09DSUFUSU9OX1RZUEUsIG5ldyBJbnRlZ2VyKE9CSkVDVF9BU1NPQ0lBVElPTl9UWVBFKSk7CisgICAgICAgIHNPYmplY3RQcm9qZWN0aW9uTWFwLnB1dChNdHAuT2JqZWN0LkFTU09DSUFUSU9OX0RFU0MsIG5ldyBJbnRlZ2VyKE9CSkVDVF9BU1NPQ0lBVElPTl9ERVNDKSk7CisgICAgICAgIHNPYmplY3RQcm9qZWN0aW9uTWFwLnB1dChNdHAuT2JqZWN0LlNFUVVFTkNFX05VTUJFUiwgbmV3IEludGVnZXIoT0JKRUNUX1NFUVVFTkNFX05VTUJFUikpOworICAgICAgICBzT2JqZWN0UHJvamVjdGlvbk1hcC5wdXQoTXRwLk9iamVjdC5OQU1FLCBuZXcgSW50ZWdlcihPQkpFQ1RfTkFNRSkpOworICAgICAgICBzT2JqZWN0UHJvamVjdGlvbk1hcC5wdXQoTXRwLk9iamVjdC5EQVRFX0NSRUFURUQsIG5ldyBJbnRlZ2VyKE9CSkVDVF9EQVRFX0NSRUFURUQpKTsKKyAgICAgICAgc09iamVjdFByb2plY3Rpb25NYXAucHV0KE10cC5PYmplY3QuREFURV9NT0RJRklFRCwgbmV3IEludGVnZXIoT0JKRUNUX0RBVEVfTU9ESUZJRUQpKTsKKyAgICAgICAgc09iamVjdFByb2plY3Rpb25NYXAucHV0KE10cC5PYmplY3QuS0VZV09SRFMsIG5ldyBJbnRlZ2VyKE9CSkVDVF9LRVlXT1JEUykpOworICAgICAgICBzT2JqZWN0UHJvamVjdGlvbk1hcC5wdXQoTXRwLk9iamVjdC5USFVNQiwgbmV3IEludGVnZXIoT0JKRUNUX1RIVU1CKSk7CisKKyAgICAgICAgc09iamVjdFByb2plY3Rpb25NYXAucHV0KE10cC5PYmplY3QuTkFNRSwgbmV3IEludGVnZXIoT0JKRUNUX05BTUUpKTsKKyAgICB9CisKKyAgICAvLyB1c2VkIGJ5IHRoZSBKTkkgY29kZQorICAgIHByaXZhdGUgaW50IG1OYXRpdmVDb250ZXh0OworCisgICAgcHJpdmF0ZSBuYXRpdmUgZmluYWwgdm9pZCBuYXRpdmVfc2V0dXAoTXRwQ2xpZW50IGNsaWVudCwgaW50IHF1ZXJ5VHlwZSwKKyAgICAgICAgICAgIGludCBkZXZpY2VJRCwgaW50IHN0b3JhZ2VJRCwgaW50IG9iamVjdElELCBpbnRbXSBjb2x1bW5zKTsKKyAgICBwcml2YXRlIG5hdGl2ZSBmaW5hbCB2b2lkIG5hdGl2ZV9maW5hbGl6ZSgpOworICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbmF0aXZlX3dhaXRfZm9yX2V2ZW50KCk7CisgICAgcHJpdmF0ZSBuYXRpdmUgaW50IG5hdGl2ZV9maWxsX3dpbmRvdyhDdXJzb3JXaW5kb3cgd2luZG93LCBpbnQgc3RhcnRQb3MpOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL010cERhdGFiYXNlLmphdmEgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvTXRwRGF0YWJhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OGNjZTQ2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL010cERhdGFiYXNlLmphdmEKQEAgLTAsMCArMSw0NjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWE7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlczsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcjsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CitpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5NZWRpYVN0b3JlLkF1ZGlvOworaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuTWVkaWFTdG9yZS5NZWRpYUNvbHVtbnM7CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5NZWRpYVN0b3JlLk10cE9iamVjdHM7CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5NdHA7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworLyoqCisgKiB7QGhpZGV9CisgKi8KK3B1YmxpYyBjbGFzcyBNdHBEYXRhYmFzZSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk10cERhdGFiYXNlIjsKKworICAgIHByaXZhdGUgZmluYWwgSUNvbnRlbnRQcm92aWRlciBtTWVkaWFQcm92aWRlcjsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtVm9sdW1lTmFtZTsKKyAgICBwcml2YXRlIGZpbmFsIFVyaSBtT2JqZWN0c1VyaTsKKworICAgIC8vIEZJWE1FIC0gdGhpcyBzaG91bGQgYmUgcGFzc2VkIGluIHZpYSB0aGUgY29uc3RydWN0b3IKKyAgICBwcml2YXRlIGZpbmFsIGludCBtU3RvcmFnZUlEID0gMHgwMDAxMDAwMTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIElEX1BST0pFQ1RJT04gPSBuZXcgU3RyaW5nW10geworICAgICAgICAgICAgTXRwT2JqZWN0cy5PYmplY3RDb2x1bW5zLl9JRCwgLy8gMAorICAgIH07CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gUEFUSF9TSVpFX1BST0pFQ1RJT04gPSBuZXcgU3RyaW5nW10geworICAgICAgICAgICAgTXRwT2JqZWN0cy5PYmplY3RDb2x1bW5zLl9JRCwgLy8gMAorICAgICAgICAgICAgTXRwT2JqZWN0cy5PYmplY3RDb2x1bW5zLkRBVEEsIC8vIDEKKyAgICAgICAgICAgIE10cE9iamVjdHMuT2JqZWN0Q29sdW1ucy5TSVpFLCAvLyAyCisgICAgfTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBPQkpFQ1RfSU5GT19QUk9KRUNUSU9OID0gbmV3IFN0cmluZ1tdIHsKKyAgICAgICAgICAgIE10cE9iamVjdHMuT2JqZWN0Q29sdW1ucy5fSUQsIC8vIDAKKyAgICAgICAgICAgIE10cE9iamVjdHMuT2JqZWN0Q29sdW1ucy5EQVRBLCAvLyAxCisgICAgICAgICAgICBNdHBPYmplY3RzLk9iamVjdENvbHVtbnMuRk9STUFULCAvLyAyCisgICAgICAgICAgICBNdHBPYmplY3RzLk9iamVjdENvbHVtbnMuUEFSRU5ULCAvLyAzCisgICAgICAgICAgICBNdHBPYmplY3RzLk9iamVjdENvbHVtbnMuU0laRSwgLy8gNAorICAgICAgICAgICAgTXRwT2JqZWN0cy5PYmplY3RDb2x1bW5zLkRBVEVfTU9ESUZJRUQsIC8vIDUKKyAgICB9OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9XSEVSRSA9IE10cE9iamVjdHMuT2JqZWN0Q29sdW1ucy5fSUQgKyAiPT8iOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQVRIX1dIRVJFID0gTXRwT2JqZWN0cy5PYmplY3RDb2x1bW5zLkRBVEEgKyAiPT8iOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJFTlRfV0hFUkUgPSBNdHBPYmplY3RzLk9iamVjdENvbHVtbnMuUEFSRU5UICsgIj0/IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSRU5UX0ZPUk1BVF9XSEVSRSA9IFBBUkVOVF9XSEVSRSArICIgQU5EICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBNdHBPYmplY3RzLk9iamVjdENvbHVtbnMuRk9STUFUICsgIj0/IjsKKworICAgIHByaXZhdGUgZmluYWwgTWVkaWFTY2FubmVyIG1NZWRpYVNjYW5uZXI7CisKKyAgICAvLyBNVFAgcHJvcGVydHkgY29kZXMKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVRQX1BST1BFUlRZX1NUT1JBR0VfSUQgPSAweERDMDE7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1UUF9QUk9QRVJUWV9PQkpFQ1RfRk9STUFUID0gMHhEQzAyOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNVFBfUFJPUEVSVFlfT0JKRUNUX1NJWkUgPSAweERDMDQ7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1UUF9QUk9QRVJUWV9PQkpFQ1RfRklMRV9OQU1FID0gMHhEQzA3OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNVFBfUFJPUEVSVFlfREFURV9NT0RJRklFRCA9IDB4REMwOTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVRQX1BST1BFUlRZX1BBUkVOVF9PQkpFQ1QgPSAweERDMEI7CisKKyAgICAvLyBNVFAgcmVzcG9uc2UgY29kZXMKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVRQX1JFU1BPTlNFX09LID0gMHgyMDAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNVFBfUkVTUE9OU0VfR0VORVJBTF9FUlJPUiA9IDB4MjAwMjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVRQX1JFU1BPTlNFX0lOVkFMSURfT0JKRUNUX0hBTkRMRSA9IDB4MjAwOTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVRQX1JFU1BPTlNFX09CSkVDVF9QUk9QX05PVF9TVVBQT1JURUQgPSAweEE4MEE7CisKKyAgICBzdGF0aWMgeworICAgICAgICBTeXN0ZW0ubG9hZExpYnJhcnkoIm1lZGlhX2puaSIpOworICAgIH0KKworICAgIHB1YmxpYyBNdHBEYXRhYmFzZShDb250ZXh0IGNvbnRleHQsIFN0cmluZyB2b2x1bWVOYW1lKSB7CisgICAgICAgIG5hdGl2ZV9zZXR1cCgpOworCisgICAgICAgIG1NZWRpYVByb3ZpZGVyID0gY29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKS5hY3F1aXJlUHJvdmlkZXIoIm1lZGlhIik7CisgICAgICAgIG1Wb2x1bWVOYW1lID0gdm9sdW1lTmFtZTsKKyAgICAgICAgbU9iamVjdHNVcmkgPSBNdHBPYmplY3RzLmdldENvbnRlbnRVcmkodm9sdW1lTmFtZSk7CisgICAgICAgIG1NZWRpYVNjYW5uZXIgPSBuZXcgTWVkaWFTY2FubmVyKGNvbnRleHQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkgeworICAgICAgICBuYXRpdmVfZmluYWxpemUoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGludCBiZWdpblNlbmRPYmplY3QoU3RyaW5nIHBhdGgsIGludCBmb3JtYXQsIGludCBwYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0b3JhZ2UsIGxvbmcgc2l6ZSwgbG9uZyBtb2RpZmllZCkgeworICAgICAgICBDb250ZW50VmFsdWVzIHZhbHVlcyA9IG5ldyBDb250ZW50VmFsdWVzKCk7CisgICAgICAgIHZhbHVlcy5wdXQoTXRwT2JqZWN0cy5PYmplY3RDb2x1bW5zLkRBVEEsIHBhdGgpOworICAgICAgICB2YWx1ZXMucHV0KE10cE9iamVjdHMuT2JqZWN0Q29sdW1ucy5GT1JNQVQsIGZvcm1hdCk7CisgICAgICAgIHZhbHVlcy5wdXQoTXRwT2JqZWN0cy5PYmplY3RDb2x1bW5zLlBBUkVOVCwgcGFyZW50KTsKKyAgICAgICAgLy8gc3RvcmFnZSBpcyBpZ25vcmVkIGZvciBub3cKKyAgICAgICAgdmFsdWVzLnB1dChNdHBPYmplY3RzLk9iamVjdENvbHVtbnMuU0laRSwgc2l6ZSk7CisgICAgICAgIHZhbHVlcy5wdXQoTXRwT2JqZWN0cy5PYmplY3RDb2x1bW5zLkRBVEVfTU9ESUZJRUQsIG1vZGlmaWVkKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgVXJpIHVyaSA9IG1NZWRpYVByb3ZpZGVyLmluc2VydChtT2JqZWN0c1VyaSwgdmFsdWVzKTsKKyAgICAgICAgICAgIGlmICh1cmkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBJbnRlZ2VyLnBhcnNlSW50KHVyaS5nZXRQYXRoU2VnbWVudHMoKS5nZXQoMikpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJSZW1vdGVFeGNlcHRpb24gaW4gYmVnaW5TZW5kT2JqZWN0IiwgZSk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZW5kU2VuZE9iamVjdChTdHJpbmcgcGF0aCwgaW50IGhhbmRsZSwgaW50IGZvcm1hdCwgYm9vbGVhbiBzdWNjZWVkZWQpIHsKKyAgICAgICAgaWYgKHN1Y2NlZWRlZCkgeworICAgICAgICAgICAgLy8gaGFuZGxlIGFic3RyYWN0IHBsYXlsaXN0cyBzZXBhcmF0ZWx5CisgICAgICAgICAgICAvLyB0aGV5IGRvIG5vdCBleGlzdCBpbiB0aGUgZmlsZSBzeXN0ZW0gc28gZG9uJ3QgdXNlIHRoZSBtZWRpYSBzY2FubmVyIGhlcmUKKyAgICAgICAgICAgIGlmIChmb3JtYXQgPT0gTXRwLk9iamVjdC5GT1JNQVRfQUJTVFJBQ1RfQVZfUExBWUxJU1QpIHsKKyAgICAgICAgICAgICAgICAvLyBTdHJpcCBXaW5kb3dzIE1lZGlhIFBsYXllciBmaWxlIGV4dGVuc2lvbgorICAgICAgICAgICAgICAgIGlmIChwYXRoLmVuZHNXaXRoKCIucGxhIikpIHsKKyAgICAgICAgICAgICAgICAgICAgcGF0aCA9IHBhdGguc3Vic3RyaW5nKDAsIHBhdGgubGVuZ3RoKCkgLSA0KTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBleHRyYWN0IG5hbWUgZnJvbSBwYXRoCisgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBwYXRoOworICAgICAgICAgICAgICAgIGludCBsYXN0U2xhc2ggPSBuYW1lLmxhc3RJbmRleE9mKCcvJyk7CisgICAgICAgICAgICAgICAgaWYgKGxhc3RTbGFzaCA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cmluZyhsYXN0U2xhc2ggKyAxKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBDb250ZW50VmFsdWVzIHZhbHVlcyA9IG5ldyBDb250ZW50VmFsdWVzKDEpOworICAgICAgICAgICAgICAgIHZhbHVlcy5wdXQoQXVkaW8uUGxheWxpc3RzLkRBVEEsIHBhdGgpOworICAgICAgICAgICAgICAgIHZhbHVlcy5wdXQoQXVkaW8uUGxheWxpc3RzLk5BTUUsIG5hbWUpOworICAgICAgICAgICAgICAgIHZhbHVlcy5wdXQoTWVkaWFDb2x1bW5zLk1FRElBX1NDQU5ORVJfTkVXX09CSkVDVF9JRCwgaGFuZGxlKTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBVcmkgdXJpID0gbU1lZGlhUHJvdmlkZXIuaW5zZXJ0KEF1ZGlvLlBsYXlsaXN0cy5FWFRFUk5BTF9DT05URU5UX1VSSSwgdmFsdWVzKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJSZW1vdGVFeGNlcHRpb24gaW4gZW5kU2VuZE9iamVjdCIsIGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgVXJpIHVyaSA9IG1NZWRpYVNjYW5uZXIuc2Nhbk10cEZpbGUocGF0aCwgbVZvbHVtZU5hbWUsIGhhbmRsZSwgZm9ybWF0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRlbGV0ZUZpbGUoaGFuZGxlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgaW50W10gZ2V0T2JqZWN0TGlzdChpbnQgc3RvcmFnZUlELCBpbnQgZm9ybWF0LCBpbnQgcGFyZW50KSB7CisgICAgICAgIC8vIHdlIGNhbiBpZ25vcmUgc3RvcmFnZUlEIHVudGlsIHdlIHN1cHBvcnQgbXVsdGlwbGUgc3RvcmFnZXMKKyAgICAgICAgTG9nLmQoVEFHLCAiZ2V0T2JqZWN0TGlzdCBwYXJlbnQ6ICIgKyBwYXJlbnQpOworICAgICAgICBDdXJzb3IgYyA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoZm9ybWF0ICE9IDApIHsKKyAgICAgICAgICAgICAgICBjID0gbU1lZGlhUHJvdmlkZXIucXVlcnkobU9iamVjdHNVcmksIElEX1BST0pFQ1RJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFSRU5UX0ZPUk1BVF9XSEVSRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyBJbnRlZ2VyLnRvU3RyaW5nKHBhcmVudCksIEludGVnZXIudG9TdHJpbmcoZm9ybWF0KSB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYyA9IG1NZWRpYVByb3ZpZGVyLnF1ZXJ5KG1PYmplY3RzVXJpLCBJRF9QUk9KRUNUSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBUkVOVF9XSEVSRSwgbmV3IFN0cmluZ1tdIHsgSW50ZWdlci50b1N0cmluZyhwYXJlbnQpIH0sIG51bGwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIm51bGwgY3Vyc29yIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgY291bnQgPSBjLmdldENvdW50KCk7CisgICAgICAgICAgICBpZiAoY291bnQgPiAwKSB7CisgICAgICAgICAgICAgICAgaW50W10gcmVzdWx0ID0gbmV3IGludFtjb3VudF07CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGMubW92ZVRvTmV4dCgpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbaV0gPSBjLmdldEludCgwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAicmV0dXJuaW5nICIgKyByZXN1bHQpOworICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJSZW1vdGVFeGNlcHRpb24gaW4gZ2V0T2JqZWN0TGlzdCIsIGUpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKGMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGMuY2xvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwcml2YXRlIGludCBnZXROdW1PYmplY3RzKGludCBzdG9yYWdlSUQsIGludCBmb3JtYXQsIGludCBwYXJlbnQpIHsKKyAgICAgICAgLy8gd2UgY2FuIGlnbm9yZSBzdG9yYWdlSUQgdW50aWwgd2Ugc3VwcG9ydCBtdWx0aXBsZSBzdG9yYWdlcworICAgICAgICBMb2cuZChUQUcsICJnZXRPYmplY3RMaXN0IHBhcmVudDogIiArIHBhcmVudCk7CisgICAgICAgIEN1cnNvciBjID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChmb3JtYXQgIT0gMCkgeworICAgICAgICAgICAgICAgIGMgPSBtTWVkaWFQcm92aWRlci5xdWVyeShtT2JqZWN0c1VyaSwgSURfUFJPSkVDVElPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQVJFTlRfRk9STUFUX1dIRVJFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7IEludGVnZXIudG9TdHJpbmcocGFyZW50KSwgSW50ZWdlci50b1N0cmluZyhmb3JtYXQpIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjID0gbU1lZGlhUHJvdmlkZXIucXVlcnkobU9iamVjdHNVcmksIElEX1BST0pFQ1RJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFSRU5UX1dIRVJFLCBuZXcgU3RyaW5nW10geyBJbnRlZ2VyLnRvU3RyaW5nKHBhcmVudCkgfSwgbnVsbCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGMuZ2V0Q291bnQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIlJlbW90ZUV4Y2VwdGlvbiBpbiBnZXROdW1PYmplY3RzIiwgZSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoYyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgYy5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBwcml2YXRlIGludFtdIGdldFN1cHBvcnRlZFBsYXliYWNrRm9ybWF0cygpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBpbnRbXSB7CisgICAgICAgICAgICBNdHAuT2JqZWN0LkZPUk1BVF9BU1NPQ0lBVElPTiwKKyAgICAgICAgICAgIE10cC5PYmplY3QuRk9STUFUX01QMywKKyAgICAgICAgICAgIE10cC5PYmplY3QuRk9STUFUX01QRUcsCisgICAgICAgICAgICBNdHAuT2JqZWN0LkZPUk1BVF9FWElGX0pQRUcsCisgICAgICAgICAgICBNdHAuT2JqZWN0LkZPUk1BVF9USUZGX0VQLAorICAgICAgICAgICAgTXRwLk9iamVjdC5GT1JNQVRfR0lGLAorICAgICAgICAgICAgTXRwLk9iamVjdC5GT1JNQVRfSkZJRiwKKyAgICAgICAgICAgIE10cC5PYmplY3QuRk9STUFUX1BORywKKyAgICAgICAgICAgIE10cC5PYmplY3QuRk9STUFUX1RJRkYsCisgICAgICAgICAgICBNdHAuT2JqZWN0LkZPUk1BVF9XTUEsCisgICAgICAgICAgICBNdHAuT2JqZWN0LkZPUk1BVF9PR0csCisgICAgICAgICAgICBNdHAuT2JqZWN0LkZPUk1BVF9BQUMsCisgICAgICAgICAgICBNdHAuT2JqZWN0LkZPUk1BVF9NUDRfQ09OVEFJTkVSLAorICAgICAgICAgICAgTXRwLk9iamVjdC5GT1JNQVRfTVAyLAorICAgICAgICAgICAgTXRwLk9iamVjdC5GT1JNQVRfM0dQX0NPTlRBSU5FUiwKKyAgICAgICAgICAgIE10cC5PYmplY3QuRk9STUFUX0FCU1RSQUNUX0FWX1BMQVlMSVNULAorICAgICAgICAgICAgTXRwLk9iamVjdC5GT1JNQVRfV1BMX1BMQVlMSVNULAorICAgICAgICAgICAgTXRwLk9iamVjdC5GT1JNQVRfTTNVX1BMQVlMSVNULAorICAgICAgICAgICAgTXRwLk9iamVjdC5GT1JNQVRfUExTX1BMQVlMSVNULAorICAgICAgICB9OworICAgIH0KKworICAgIHByaXZhdGUgaW50W10gZ2V0U3VwcG9ydGVkQ2FwdHVyZUZvcm1hdHMoKSB7CisgICAgICAgIC8vIG5vIGNhcHR1cmUgZm9ybWF0cyB5ZXQKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnRbXSBnZXRTdXBwb3J0ZWRPYmplY3RQcm9wZXJ0aWVzKGludCBoYW5kbGUpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBpbnRbXSB7CisgICAgICAgICAgICBNdHAuT2JqZWN0LlBST1BFUlRZX1NUT1JBR0VfSUQsCisgICAgICAgICAgICBNdHAuT2JqZWN0LlBST1BFUlRZX09CSkVDVF9GT1JNQVQsCisgICAgICAgICAgICBNdHAuT2JqZWN0LlBST1BFUlRZX09CSkVDVF9TSVpFLAorICAgICAgICAgICAgTXRwLk9iamVjdC5QUk9QRVJUWV9PQkpFQ1RfRklMRV9OQU1FLAorICAgICAgICAgICAgTXRwLk9iamVjdC5QUk9QRVJUWV9QQVJFTlRfT0JKRUNULAorICAgICAgICB9OworICAgIH0KKworICAgIHByaXZhdGUgaW50W10gZ2V0U3VwcG9ydGVkRGV2aWNlUHJvcGVydGllcygpIHsKKyAgICAgICAgLy8gbm8gZGV2aWNlIHByb3BlcnRpZXMgeWV0CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHByaXZhdGUgaW50IGdldE9iamVjdFByb3BlcnR5KGludCBoYW5kbGUsIGludCBwcm9wZXJ0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nW10gb3V0SW50VmFsdWUsIGNoYXJbXSBvdXRTdHJpbmdWYWx1ZSkgeworICAgICAgICBMb2cuZChUQUcsICJnZXRPYmplY3RQcm9wZXJ0eTogIiArIHByb3BlcnR5KTsKKyAgICAgICAgU3RyaW5nIGNvbHVtbiA9IG51bGw7CisgICAgICAgIGJvb2xlYW4gaXNTdHJpbmcgPSBmYWxzZTsKKworICAgICAgICBzd2l0Y2ggKHByb3BlcnR5KSB7CisgICAgICAgICAgICBjYXNlIE1UUF9QUk9QRVJUWV9TVE9SQUdFX0lEOgorICAgICAgICAgICAgICAgIG91dEludFZhbHVlWzBdID0gbVN0b3JhZ2VJRDsKKyAgICAgICAgICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX09LOworICAgICAgICAgICAgY2FzZSBNVFBfUFJPUEVSVFlfT0JKRUNUX0ZPUk1BVDoKKyAgICAgICAgICAgICAgICBjb2x1bW4gPSBNdHBPYmplY3RzLk9iamVjdENvbHVtbnMuRk9STUFUOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBNVFBfUFJPUEVSVFlfT0JKRUNUX1NJWkU6CisgICAgICAgICAgICAgICAgY29sdW1uID0gTXRwT2JqZWN0cy5PYmplY3RDb2x1bW5zLlNJWkU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE1UUF9QUk9QRVJUWV9PQkpFQ1RfRklMRV9OQU1FOgorICAgICAgICAgICAgICAgIGNvbHVtbiA9IE10cE9iamVjdHMuT2JqZWN0Q29sdW1ucy5EQVRBOworICAgICAgICAgICAgICAgIGlzU3RyaW5nID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTVRQX1BST1BFUlRZX0RBVEVfTU9ESUZJRUQ6CisgICAgICAgICAgICAgICAgY29sdW1uID0gTXRwT2JqZWN0cy5PYmplY3RDb2x1bW5zLkRBVEVfTU9ESUZJRUQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE1UUF9QUk9QRVJUWV9QQVJFTlRfT0JKRUNUOgorICAgICAgICAgICAgICAgIGNvbHVtbiA9IE10cE9iamVjdHMuT2JqZWN0Q29sdW1ucy5QQVJFTlQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfT0JKRUNUX1BST1BfTk9UX1NVUFBPUlRFRDsKKyAgICAgICAgfQorCisgICAgICAgIEN1cnNvciBjID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIGZvciBub3cgd2UgYXJlIG9ubHkgcmVhZGluZyBwcm9wZXJ0aWVzIGZyb20gdGhlICJvYmplY3RzIiB0YWJsZQorICAgICAgICAgICAgYyA9IG1NZWRpYVByb3ZpZGVyLnF1ZXJ5KG1PYmplY3RzVXJpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmcgW10geyBNdHBPYmplY3RzLk9iamVjdENvbHVtbnMuX0lELCBjb2x1bW4gfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRF9XSEVSRSwgbmV3IFN0cmluZ1tdIHsgSW50ZWdlci50b1N0cmluZyhoYW5kbGUpIH0sIG51bGwpOworICAgICAgICAgICAgaWYgKGMgIT0gbnVsbCAmJiBjLm1vdmVUb05leHQoKSkgeworICAgICAgICAgICAgICAgIGlmIChpc1N0cmluZykgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBjLmdldFN0cmluZygxKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0ID0gMDsKKworICAgICAgICAgICAgICAgICAgICBpZiAocHJvcGVydHkgPT0gTVRQX1BST1BFUlRZX09CSkVDVF9GSUxFX05BTUUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4dHJhY3QgbmFtZSBmcm9tIGZ1bGwgcGF0aAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxhc3RTbGFzaCA9IHZhbHVlLmxhc3RJbmRleE9mKCcvJyk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGFzdFNsYXNoID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCA9IGxhc3RTbGFzaCArIDE7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaW50IGVuZCA9IHZhbHVlLmxlbmd0aCgpOworICAgICAgICAgICAgICAgICAgICBpZiAoZW5kIC0gc3RhcnQgPiAyNTUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVuZCA9IHN0YXJ0ICsgMjU1OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHZhbHVlLmdldENoYXJzKHN0YXJ0LCBlbmQsIG91dFN0cmluZ1ZhbHVlLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0U3RyaW5nVmFsdWVbZW5kIC0gc3RhcnRdID0gMDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBvdXRJbnRWYWx1ZVswXSA9IGMuZ2V0TG9uZygxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9PSzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfR0VORVJBTF9FUlJPUjsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChjICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjLmNsb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gcXVlcnkgZmFpbGVkIGlmIHdlIGdldCBoZXJlCisgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfSU5WQUxJRF9PQkpFQ1RfSEFORExFOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBnZXRPYmplY3RJbmZvKGludCBoYW5kbGUsIGludFtdIG91dFN0b3JhZ2VGb3JtYXRQYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyW10gb3V0TmFtZSwgbG9uZ1tdIG91dFNpemVNb2RpZmllZCkgeworICAgICAgICBMb2cuZChUQUcsICJnZXRPYmplY3RJbmZvOiAiICsgaGFuZGxlKTsKKyAgICAgICAgQ3Vyc29yIGMgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYyA9IG1NZWRpYVByb3ZpZGVyLnF1ZXJ5KG1PYmplY3RzVXJpLCBPQkpFQ1RfSU5GT19QUk9KRUNUSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEX1dIRVJFLCBuZXcgU3RyaW5nW10geyAgSW50ZWdlci50b1N0cmluZyhoYW5kbGUpIH0sIG51bGwpOworICAgICAgICAgICAgaWYgKGMgIT0gbnVsbCAmJiBjLm1vdmVUb05leHQoKSkgeworICAgICAgICAgICAgICAgIG91dFN0b3JhZ2VGb3JtYXRQYXJlbnRbMF0gPSBtU3RvcmFnZUlEOworICAgICAgICAgICAgICAgIG91dFN0b3JhZ2VGb3JtYXRQYXJlbnRbMV0gPSBjLmdldEludCgyKTsKKyAgICAgICAgICAgICAgICBvdXRTdG9yYWdlRm9ybWF0UGFyZW50WzJdID0gYy5nZXRJbnQoMyk7CisKKyAgICAgICAgICAgICAgICAvLyBleHRyYWN0IG5hbWUgZnJvbSBwYXRoCisgICAgICAgICAgICAgICAgU3RyaW5nIHBhdGggPSBjLmdldFN0cmluZygxKTsKKyAgICAgICAgICAgICAgICBpbnQgbGFzdFNsYXNoID0gcGF0aC5sYXN0SW5kZXhPZignLycpOworICAgICAgICAgICAgICAgIGludCBzdGFydCA9IChsYXN0U2xhc2ggPj0gMCA/IGxhc3RTbGFzaCArIDEgOiAwKTsKKyAgICAgICAgICAgICAgICBpbnQgZW5kID0gcGF0aC5sZW5ndGgoKTsKKyAgICAgICAgICAgICAgICBpZiAoZW5kIC0gc3RhcnQgPiAyNTUpIHsKKyAgICAgICAgICAgICAgICAgICAgZW5kID0gc3RhcnQgKyAyNTU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBhdGguZ2V0Q2hhcnMoc3RhcnQsIGVuZCwgb3V0TmFtZSwgMCk7CisgICAgICAgICAgICAgICAgb3V0TmFtZVtlbmQgLSBzdGFydF0gPSAwOworCisgICAgICAgICAgICAgICAgb3V0U2l6ZU1vZGlmaWVkWzBdID0gYy5nZXRMb25nKDQpOworICAgICAgICAgICAgICAgIG91dFNpemVNb2RpZmllZFsxXSA9IGMuZ2V0TG9uZyg1KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIlJlbW90ZUV4Y2VwdGlvbiBpbiBnZXRPYmplY3RQcm9wZXJ0eSIsIGUpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKGMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGMuY2xvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnQgZ2V0T2JqZWN0RmlsZVBhdGgoaW50IGhhbmRsZSwgY2hhcltdIG91dEZpbGVQYXRoLCBsb25nW10gb3V0RmlsZUxlbmd0aCkgeworICAgICAgICBMb2cuZChUQUcsICJnZXRPYmplY3RGaWxlUGF0aDogIiArIGhhbmRsZSk7CisgICAgICAgIEN1cnNvciBjID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGMgPSBtTWVkaWFQcm92aWRlci5xdWVyeShtT2JqZWN0c1VyaSwgUEFUSF9TSVpFX1BST0pFQ1RJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURfV0hFUkUsIG5ldyBTdHJpbmdbXSB7ICBJbnRlZ2VyLnRvU3RyaW5nKGhhbmRsZSkgfSwgbnVsbCk7CisgICAgICAgICAgICBpZiAoYyAhPSBudWxsICYmIGMubW92ZVRvTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHBhdGggPSBjLmdldFN0cmluZygxKTsKKyAgICAgICAgICAgICAgICBwYXRoLmdldENoYXJzKDAsIHBhdGgubGVuZ3RoKCksIG91dEZpbGVQYXRoLCAwKTsKKyAgICAgICAgICAgICAgICBvdXRGaWxlUGF0aFtwYXRoLmxlbmd0aCgpXSA9IDA7CisgICAgICAgICAgICAgICAgb3V0RmlsZUxlbmd0aFswXSA9IGMuZ2V0TG9uZygyKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX09LOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX0lOVkFMSURfT0JKRUNUX0hBTkRMRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIlJlbW90ZUV4Y2VwdGlvbiBpbiBnZXRPYmplY3RGaWxlUGF0aCIsIGUpOworICAgICAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9HRU5FUkFMX0VSUk9SOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKGMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGMuY2xvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgaW50IGRlbGV0ZUZpbGUoaW50IGhhbmRsZSkgeworICAgICAgICBMb2cuZChUQUcsICJkZWxldGVGaWxlOiAiICsgaGFuZGxlKTsKKyAgICAgICAgVXJpIHVyaSA9IE10cE9iamVjdHMuZ2V0Q29udGVudFVyaShtVm9sdW1lTmFtZSwgaGFuZGxlKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChtTWVkaWFQcm92aWRlci5kZWxldGUodXJpLCBudWxsLCBudWxsKSA9PSAxKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9PSzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9JTlZBTElEX09CSkVDVF9IQU5ETEU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJSZW1vdGVFeGNlcHRpb24gaW4gZGVsZXRlRmlsZSIsIGUpOworICAgICAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9HRU5FUkFMX0VSUk9SOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnRbXSBnZXRPYmplY3RSZWZlcmVuY2VzKGludCBoYW5kbGUpIHsKKyAgICAgICAgTG9nLmQoVEFHLCAiZ2V0T2JqZWN0UmVmZXJlbmNlcyBmb3I6ICIgKyBoYW5kbGUpOworICAgICAgICBVcmkgdXJpID0gTXRwT2JqZWN0cy5nZXRSZWZlcmVuY2VzVXJpKG1Wb2x1bWVOYW1lLCBoYW5kbGUpOworICAgICAgICBDdXJzb3IgYyA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjID0gbU1lZGlhUHJvdmlkZXIucXVlcnkodXJpLCBJRF9QUk9KRUNUSU9OLCBudWxsLCBudWxsLCBudWxsKTsKKyAgICAgICAgICAgIGlmIChjID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludCBjb3VudCA9IGMuZ2V0Q291bnQoKTsKKyAgICAgICAgICAgIGlmIChjb3VudCA+IDApIHsKKyAgICAgICAgICAgICAgICBpbnRbXSByZXN1bHQgPSBuZXcgaW50W2NvdW50XTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgYy5tb3ZlVG9OZXh0KCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtpXSA9IGMuZ2V0SW50KDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiUmVtb3RlRXhjZXB0aW9uIGluIGdldE9iamVjdExpc3QiLCBlKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChjICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjLmNsb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnQgc2V0T2JqZWN0UmVmZXJlbmNlcyhpbnQgaGFuZGxlLCBpbnRbXSByZWZlcmVuY2VzKSB7CisgICAgICAgIFVyaSB1cmkgPSBNdHBPYmplY3RzLmdldFJlZmVyZW5jZXNVcmkobVZvbHVtZU5hbWUsIGhhbmRsZSk7CisgICAgICAgIGludCBjb3VudCA9IHJlZmVyZW5jZXMubGVuZ3RoOworICAgICAgICBDb250ZW50VmFsdWVzW10gdmFsdWVzTGlzdCA9IG5ldyBDb250ZW50VmFsdWVzW2NvdW50XTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICBDb250ZW50VmFsdWVzIHZhbHVlcyA9IG5ldyBDb250ZW50VmFsdWVzKCk7CisgICAgICAgICAgICB2YWx1ZXMucHV0KE10cE9iamVjdHMuT2JqZWN0Q29sdW1ucy5fSUQsIHJlZmVyZW5jZXNbaV0pOworICAgICAgICAgICAgdmFsdWVzTGlzdFtpXSA9IHZhbHVlczsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKGNvdW50ID09IG1NZWRpYVByb3ZpZGVyLmJ1bGtJbnNlcnQodXJpLCB2YWx1ZXNMaXN0KSkgeworICAgICAgICAgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfT0s7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJSZW1vdGVFeGNlcHRpb24gaW4gc2V0T2JqZWN0UmVmZXJlbmNlcyIsIGUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfR0VORVJBTF9FUlJPUjsKKyAgICB9CisKKyAgICAvLyB1c2VkIGJ5IHRoZSBKTkkgY29kZQorICAgIHByaXZhdGUgaW50IG1OYXRpdmVDb250ZXh0OworCisgICAgcHJpdmF0ZSBuYXRpdmUgZmluYWwgdm9pZCBuYXRpdmVfc2V0dXAoKTsKKyAgICBwcml2YXRlIG5hdGl2ZSBmaW5hbCB2b2lkIG5hdGl2ZV9maW5hbGl6ZSgpOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL010cFNlcnZlci5qYXZhIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL010cFNlcnZlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwOTQ1YTUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvTXRwU2VydmVyLmphdmEKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYTsKKworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKKy8qKgorICogSmF2YSB3cmFwcGVyIGZvciBNVFAvUFRQIHN1cHBvcnQgYXMgVVNCIHJlc3BvbmRlci4KKyAqIHtAaGlkZX0KKyAqLworcHVibGljIGNsYXNzIE10cFNlcnZlciB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk10cFNlcnZlciI7CisKKyAgICBzdGF0aWMgeworICAgICAgICBTeXN0ZW0ubG9hZExpYnJhcnkoIm1lZGlhX2puaSIpOworICAgIH0KKworICAgIHB1YmxpYyBNdHBTZXJ2ZXIoTXRwRGF0YWJhc2UgZGF0YWJhc2UsIFN0cmluZyBzdG9yYWdlUGF0aCkgeworICAgICAgICBuYXRpdmVfc2V0dXAoZGF0YWJhc2UsIHN0b3JhZ2VQYXRoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpIHsKKyAgICAgICAgbmF0aXZlX2ZpbmFsaXplKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc3RhcnQoKSB7CisgICAgICAgIG5hdGl2ZV9zdGFydCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHN0b3AoKSB7CisgICAgICAgIG5hdGl2ZV9zdG9wKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2VuZE9iamVjdEFkZGVkKGludCBoYW5kbGUpIHsKKyAgICAgICAgbmF0aXZlX3NlbmRfb2JqZWN0X2FkZGVkKGhhbmRsZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2VuZE9iamVjdFJlbW92ZWQoaW50IGhhbmRsZSkgeworICAgICAgICBuYXRpdmVfc2VuZF9vYmplY3RfcmVtb3ZlZChoYW5kbGUpOworICAgIH0KKworICAgIC8vIHVzZWQgYnkgdGhlIEpOSSBjb2RlCisgICAgcHJpdmF0ZSBpbnQgbU5hdGl2ZUNvbnRleHQ7CisKKyAgICBwcml2YXRlIG5hdGl2ZSBmaW5hbCB2b2lkIG5hdGl2ZV9zZXR1cChNdHBEYXRhYmFzZSBkYXRhYmFzZSwgU3RyaW5nIHN0b3JhZ2VQYXRoKTsKKyAgICBwcml2YXRlIG5hdGl2ZSBmaW5hbCB2b2lkIG5hdGl2ZV9maW5hbGl6ZSgpOworICAgIHByaXZhdGUgbmF0aXZlIGZpbmFsIHZvaWQgbmF0aXZlX3N0YXJ0KCk7CisgICAgcHJpdmF0ZSBuYXRpdmUgZmluYWwgdm9pZCBuYXRpdmVfc3RvcCgpOworICAgIHByaXZhdGUgbmF0aXZlIGZpbmFsIHZvaWQgbmF0aXZlX3NlbmRfb2JqZWN0X2FkZGVkKGludCBoYW5kbGUpOworICAgIHByaXZhdGUgbmF0aXZlIGZpbmFsIHZvaWQgbmF0aXZlX3NlbmRfb2JqZWN0X3JlbW92ZWQoaW50IGhhbmRsZSk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9qbmkvQW5kcm9pZC5tayBiL21lZGlhL2puaS9BbmRyb2lkLm1rCmluZGV4IDZlZWMyMTUuLjY1MzUzMmMgMTAwNjQ0Ci0tLSBhL21lZGlhL2puaS9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2puaS9BbmRyb2lkLm1rCkBAIC0xMiw3ICsxMiwxMSBAQAogICAgIGFuZHJvaWRfbWVkaWFfTWVkaWFNZXRhZGF0YVJldHJpZXZlci5jcHAgXAogICAgIGFuZHJvaWRfbWVkaWFfUmVzYW1wbGVJbnB1dFN0cmVhbS5jcHAgXAogICAgIGFuZHJvaWRfbWVkaWFfTWVkaWFQcm9maWxlcy5jcHAgXAotICAgIGFuZHJvaWRfbWVkaWFfQW1ySW5wdXRTdHJlYW0uY3BwCisgICAgYW5kcm9pZF9tZWRpYV9BbXJJbnB1dFN0cmVhbS5jcHAgXAorCWFuZHJvaWRfbWVkaWFfTXRwQ2xpZW50LmNwcCBcCisJYW5kcm9pZF9tZWRpYV9NdHBDdXJzb3IuY3BwIFwKKwlhbmRyb2lkX21lZGlhX010cERhdGFiYXNlLmNwcCBcCisJYW5kcm9pZF9tZWRpYV9NdHBTZXJ2ZXIuY3BwIFwKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCiAgICAgbGliYW5kcm9pZF9ydW50aW1lIFwKQEAgLTI1LDcgKzI5LDggQEAKICAgICBsaWJjdXRpbHMgXAogICAgIGxpYnN1cmZhY2VmbGluZ2VyX2NsaWVudCBcCiAgICAgbGlic3RhZ2VmcmlnaHQgXAotICAgIGxpYmNhbWVyYV9jbGllbnQKKyAgICBsaWJjYW1lcmFfY2xpZW50IFwKKwlsaWJzcWxpdGUKIAogaWZuZXEgKCQoQlVJTERfV0lUSE9VVF9QViksdHJ1ZSkKIApAQCAtMzUsNyArNDAsOSBAQAogICAgIExPQ0FMX0NGTEFHUyArPSAtRE5PX09QRU5DT1JFCiBlbmRpZgogCi1MT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9CitpZm5lcSAoJChUQVJHRVRfU0lNVUxBVE9SKSx0cnVlKQorTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBsaWJtdHAgbGlidXNiaG9zdAorZW5kaWYKIAogTE9DQUxfQ19JTkNMVURFUyArPSBcCiAgICAgZXh0ZXJuYWwvdHJlbW9yL1RyZW1vciBcCkBAIC00NCw2ICs1MSw3IEBACiAgICAgZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjIFwKICAgICBmcmFtZXdvcmtzL2Jhc2UvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbiBcCiAgICAgZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZSBcCisgICAgZnJhbWV3b3Jrcy9iYXNlL21lZGlhL210cCBcCiAgICAgJChQVl9JTkNMVURFUykgXAogICAgICQoSk5JX0hfSU5DTFVERSkgXAogICAgICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBjb3JlY2cgZ3JhcGhpY3MpCmRpZmYgLS1naXQgYS9tZWRpYS9qbmkvYW5kcm9pZF9tZWRpYV9NZWRpYVBsYXllci5jcHAgYi9tZWRpYS9qbmkvYW5kcm9pZF9tZWRpYV9NZWRpYVBsYXllci5jcHAKaW5kZXggNDc0YTE3NC4uNjcxMGRiMCAxMDA2NDQKLS0tIGEvbWVkaWEvam5pL2FuZHJvaWRfbWVkaWFfTWVkaWFQbGF5ZXIuY3BwCisrKyBiL21lZGlhL2puaS9hbmRyb2lkX21lZGlhX01lZGlhUGxheWVyLmNwcApAQCAtNzg4LDYgKzc4OCwxMCBAQAogZXh0ZXJuIGludCByZWdpc3Rlcl9hbmRyb2lkX21lZGlhX01lZGlhU2Nhbm5lcihKTklFbnYgKmVudik7CiBleHRlcm4gaW50IHJlZ2lzdGVyX2FuZHJvaWRfbWVkaWFfUmVzYW1wbGVJbnB1dFN0cmVhbShKTklFbnYgKmVudik7CiBleHRlcm4gaW50IHJlZ2lzdGVyX2FuZHJvaWRfbWVkaWFfTWVkaWFQcm9maWxlcyhKTklFbnYgKmVudik7CitleHRlcm4gaW50IHJlZ2lzdGVyX2FuZHJvaWRfbWVkaWFfTXRwQ2xpZW50KEpOSUVudiAqZW52KTsKK2V4dGVybiBpbnQgcmVnaXN0ZXJfYW5kcm9pZF9tZWRpYV9NdHBDdXJzb3IoSk5JRW52ICplbnYpOworZXh0ZXJuIGludCByZWdpc3Rlcl9hbmRyb2lkX21lZGlhX010cERhdGFiYXNlKEpOSUVudiAqZW52KTsKK2V4dGVybiBpbnQgcmVnaXN0ZXJfYW5kcm9pZF9tZWRpYV9NdHBTZXJ2ZXIoSk5JRW52ICplbnYpOwogCiAjaWZuZGVmIE5PX09QRU5DT1JFCiBleHRlcm4gaW50IHJlZ2lzdGVyX2FuZHJvaWRfbWVkaWFfQW1ySW5wdXRTdHJlYW0oSk5JRW52ICplbnYpOwpAQCAtODQxLDYgKzg0NSwyNiBAQAogICAgICAgICBnb3RvIGJhaWw7CiAgICAgfQogCisgICAgaWYgKHJlZ2lzdGVyX2FuZHJvaWRfbWVkaWFfTXRwQ2xpZW50KGVudikgPCAwKSB7CisgICAgICAgIExPR0UoIkVSUk9SOiBNdHBDbGllbnQgbmF0aXZlIHJlZ2lzdHJhdGlvbiBmYWlsZWQiKTsKKyAgICAgICAgZ290byBiYWlsOworICAgIH0KKworICAgIGlmIChyZWdpc3Rlcl9hbmRyb2lkX21lZGlhX010cEN1cnNvcihlbnYpIDwgMCkgeworICAgICAgICBMT0dFKCJFUlJPUjogTXRwQ3Vyc29yIG5hdGl2ZSByZWdpc3RyYXRpb24gZmFpbGVkIik7CisgICAgICAgIGdvdG8gYmFpbDsKKyAgICB9CisKKyAgICBpZiAocmVnaXN0ZXJfYW5kcm9pZF9tZWRpYV9NdHBEYXRhYmFzZShlbnYpIDwgMCkgeworICAgICAgICBMT0dFKCJFUlJPUjogTXRwRGF0YWJhc2UgbmF0aXZlIHJlZ2lzdHJhdGlvbiBmYWlsZWQiKTsKKyAgICAgICAgZ290byBiYWlsOworICAgIH0KKworICAgIGlmIChyZWdpc3Rlcl9hbmRyb2lkX21lZGlhX010cFNlcnZlcihlbnYpIDwgMCkgeworICAgICAgICBMT0dFKCJFUlJPUjogTXRwU2VydmVyIG5hdGl2ZSByZWdpc3RyYXRpb24gZmFpbGVkIik7CisgICAgICAgIGdvdG8gYmFpbDsKKyAgICB9CisKICAgICAvKiBzdWNjZXNzIC0tIHJldHVybiB2YWxpZCB2ZXJzaW9uIG51bWJlciAqLwogICAgIHJlc3VsdCA9IEpOSV9WRVJTSU9OXzFfNDsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvam5pL2FuZHJvaWRfbWVkaWFfTXRwQ2xpZW50LmNwcCBiL21lZGlhL2puaS9hbmRyb2lkX21lZGlhX010cENsaWVudC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjc3NDBiYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2puaS9hbmRyb2lkX21lZGlhX010cENsaWVudC5jcHAKQEAgLTAsMCArMSwyOTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIk10cENsaWVudEpOSSIKKyNpbmNsdWRlICJ1dGlscy9Mb2cuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKworI2luY2x1ZGUgImpuaS5oIgorI2luY2x1ZGUgIkpOSUhlbHAuaCIKKyNpbmNsdWRlICJhbmRyb2lkX3J1bnRpbWUvQW5kcm9pZFJ1bnRpbWUuaCIKKworI2luY2x1ZGUgIk10cENsaWVudC5oIgorI2luY2x1ZGUgIk10cERldmljZS5oIgorI2luY2x1ZGUgIk10cE9iamVjdEluZm8uaCIKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIGptZXRob2RJRCBtZXRob2RfZGV2aWNlQWRkZWQ7CitzdGF0aWMgam1ldGhvZElEIG1ldGhvZF9kZXZpY2VSZW1vdmVkOworc3RhdGljIGpmaWVsZElEIGZpZWxkX2NvbnRleHQ7CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9kZXNjcmlwdG9yX29mZnNldHNfdAoreworICAgIGpjbGFzcyBtQ2xhc3M7CisgICAgam1ldGhvZElEIG1Db25zdHJ1Y3RvcjsKKyAgICBqZmllbGRJRCBtRGVzY3JpcHRvcjsKK30gZ0ZpbGVEZXNjcmlwdG9yT2Zmc2V0czsKKworc3RhdGljIHN0cnVjdCBwYXJjZWxfZmlsZV9kZXNjcmlwdG9yX29mZnNldHNfdAoreworICAgIGpjbGFzcyBtQ2xhc3M7CisgICAgam1ldGhvZElEIG1Db25zdHJ1Y3RvcjsKK30gZ1BhcmNlbEZpbGVEZXNjcmlwdG9yT2Zmc2V0czsKKworI2lmZGVmIEhBVkVfQU5EUk9JRF9PUworCitzdGF0aWMgdm9pZCBjaGVja0FuZENsZWFyRXhjZXB0aW9uRnJvbUNhbGxiYWNrKEpOSUVudiogZW52LCBjb25zdCBjaGFyKiBtZXRob2ROYW1lKSB7CisgICAgaWYgKGVudi0+RXhjZXB0aW9uQ2hlY2soKSkgeworICAgICAgICBMT0dFKCJBbiBleGNlcHRpb24gd2FzIHRocm93biBieSBjYWxsYmFjayAnJXMnLiIsIG1ldGhvZE5hbWUpOworICAgICAgICBMT0dFX0VYKGVudik7CisgICAgICAgIGVudi0+RXhjZXB0aW9uQ2xlYXIoKTsKKyAgICB9Cit9CisKK2NsYXNzIE15Q2xpZW50IDogcHVibGljIE10cENsaWVudCB7Citwcml2YXRlOgorICAgIHZpcnR1YWwgdm9pZCAgICBkZXZpY2VBZGRlZChNdHBEZXZpY2UgKmRldmljZSk7CisgICAgdmlydHVhbCB2b2lkICAgIGRldmljZVJlbW92ZWQoTXRwRGV2aWNlICpkZXZpY2UpOworCisgICAgam9iamVjdCAgICAgICAgIG1DbGllbnQ7CisgICAgTXRwRGV2aWNlKiAgICAgIG1FdmVudERldmljZTsKKworcHVibGljOgorICAgICAgICAgICAgICAgICAgICBNeUNsaWVudChKTklFbnYgKmVudiwgam9iamVjdCBjbGllbnQpOworICAgIHZvaWQgICAgICAgICAgICBjbGVhbnVwKEpOSUVudiAqZW52KTsKK307CisKK010cENsaWVudCogZ2V0X2NsaWVudF9mcm9tX29iamVjdChKTklFbnYqIGVudiwgam9iamVjdCBqYXZhQ2xpZW50KQoreworICAgIHJldHVybiAoTXRwQ2xpZW50KillbnYtPkdldEludEZpZWxkKGphdmFDbGllbnQsIGZpZWxkX2NvbnRleHQpOworfQorCisKK015Q2xpZW50OjpNeUNsaWVudChKTklFbnYgKmVudiwgam9iamVjdCBjbGllbnQpCisgICAgOiAgIG1DbGllbnQoZW52LT5OZXdHbG9iYWxSZWYoY2xpZW50KSkKK3sKK30KKwordm9pZCBNeUNsaWVudDo6Y2xlYW51cChKTklFbnYgKmVudikgeworICAgIGVudi0+RGVsZXRlR2xvYmFsUmVmKG1DbGllbnQpOworfQorCit2b2lkIE15Q2xpZW50OjpkZXZpY2VBZGRlZChNdHBEZXZpY2UgKmRldmljZSkgeworICAgIEpOSUVudiogZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIGNvbnN0IGNoYXIqIG5hbWUgPSBkZXZpY2UtPmdldERldmljZU5hbWUoKTsKKyAgICBMT0dEKCJNeUNsaWVudDo6ZGV2aWNlQWRkZWQgJXNcbiIsIG5hbWUpOworCisgICAgZW52LT5DYWxsVm9pZE1ldGhvZChtQ2xpZW50LCBtZXRob2RfZGV2aWNlQWRkZWQsIGRldmljZS0+Z2V0SUQoKSk7CisKKyAgICBjaGVja0FuZENsZWFyRXhjZXB0aW9uRnJvbUNhbGxiYWNrKGVudiwgX19GVU5DVElPTl9fKTsKK30KKwordm9pZCBNeUNsaWVudDo6ZGV2aWNlUmVtb3ZlZChNdHBEZXZpY2UgKmRldmljZSkgeworICAgIEpOSUVudiogZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIGNvbnN0IGNoYXIqIG5hbWUgPSBkZXZpY2UtPmdldERldmljZU5hbWUoKTsKKyAgICBMT0dEKCJNeUNsaWVudDo6ZGV2aWNlUmVtb3ZlZCAlc1xuIiwgbmFtZSk7CisKKyAgICBlbnYtPkNhbGxWb2lkTWV0aG9kKG1DbGllbnQsIG1ldGhvZF9kZXZpY2VSZW1vdmVkLCBkZXZpY2UtPmdldElEKCkpOworCisgICAgY2hlY2tBbmRDbGVhckV4Y2VwdGlvbkZyb21DYWxsYmFjayhlbnYsIF9fRlVOQ1RJT05fXyk7Cit9CisKKyNlbmRpZiAvLyBIQVZFX0FORFJPSURfT1MKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZAorYW5kcm9pZF9tZWRpYV9NdHBDbGllbnRfc2V0dXAoSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeikKK3sKKyNpZmRlZiBIQVZFX0FORFJPSURfT1MKKyAgICBMT0dEKCJzZXR1cFxuIik7CisgICAgTXlDbGllbnQqIGNsaWVudCA9IG5ldyBNeUNsaWVudChlbnYsIHRoaXopOworICAgIGNsaWVudC0+c3RhcnQoKTsKKyAgICBlbnYtPlNldEludEZpZWxkKHRoaXosIGZpZWxkX2NvbnRleHQsIChpbnQpY2xpZW50KTsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZAorYW5kcm9pZF9tZWRpYV9NdHBDbGllbnRfZmluYWxpemUoSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeikKK3sKKyNpZmRlZiBIQVZFX0FORFJPSURfT1MKKyAgICBMT0dEKCJmaW5hbGl6ZVxuIik7CisgICAgTXlDbGllbnQgKmNsaWVudCA9IChNeUNsaWVudCAqKWVudi0+R2V0SW50RmllbGQodGhpeiwgZmllbGRfY29udGV4dCk7CisgICAgY2xpZW50LT5jbGVhbnVwKGVudik7CisgICAgZGVsZXRlIGNsaWVudDsKKyAgICBlbnYtPlNldEludEZpZWxkKHRoaXosIGZpZWxkX2NvbnRleHQsIDApOworI2VuZGlmCit9CisKK3N0YXRpYyBqYm9vbGVhbgorYW5kcm9pZF9tZWRpYV9NdHBDbGllbnRfc3RhcnQoSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeikKK3sKKyNpZmRlZiBIQVZFX0FORFJPSURfT1MKKyAgICBMT0dEKCJzdGFydFxuIik7CisgICAgTXlDbGllbnQgKmNsaWVudCA9IChNeUNsaWVudCAqKWVudi0+R2V0SW50RmllbGQodGhpeiwgZmllbGRfY29udGV4dCk7CisgICAgcmV0dXJuIGNsaWVudC0+c3RhcnQoKTsKKyNlbHNlCisgICAgcmV0dXJuIGZhbHNlOworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkCithbmRyb2lkX21lZGlhX010cENsaWVudF9zdG9wKEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXopCit7CisjaWZkZWYgSEFWRV9BTkRST0lEX09TCisgICAgTE9HRCgic3RvcFxuIik7CisgICAgTXlDbGllbnQgKmNsaWVudCA9IChNeUNsaWVudCAqKWVudi0+R2V0SW50RmllbGQodGhpeiwgZmllbGRfY29udGV4dCk7CisgICAgY2xpZW50LT5zdG9wKCk7CisjZW5kaWYKK30KKworc3RhdGljIGpib29sZWFuCithbmRyb2lkX21lZGlhX010cENsaWVudF9kZWxldGVfb2JqZWN0KEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXosCisgICAgICAgIGppbnQgZGV2aWNlX2lkLCBqaW50IG9iamVjdF9pZCkKK3sKKyNpZmRlZiBIQVZFX0FORFJPSURfT1MKKyAgICBNeUNsaWVudCAqY2xpZW50ID0gKE15Q2xpZW50ICopZW52LT5HZXRJbnRGaWVsZCh0aGl6LCBmaWVsZF9jb250ZXh0KTsKKyAgICBNdHBEZXZpY2UqIGRldmljZSA9IGNsaWVudC0+Z2V0RGV2aWNlKGRldmljZV9pZCk7CisgICAgaWYgKGRldmljZSkKKyAgICAgICAgcmV0dXJuIGRldmljZS0+ZGVsZXRlT2JqZWN0KG9iamVjdF9pZCk7CisgICAgZWxzZQorICNlbmRpZgorICAgICAgICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGppbnQKK2FuZHJvaWRfbWVkaWFfTXRwQ2xpZW50X2dldF9wYXJlbnQoSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeiwKKyAgICAgICAgamludCBkZXZpY2VfaWQsIGppbnQgb2JqZWN0X2lkKQoreworI2lmZGVmIEhBVkVfQU5EUk9JRF9PUworICAgIE15Q2xpZW50ICpjbGllbnQgPSAoTXlDbGllbnQgKillbnYtPkdldEludEZpZWxkKHRoaXosIGZpZWxkX2NvbnRleHQpOworICAgIE10cERldmljZSogZGV2aWNlID0gY2xpZW50LT5nZXREZXZpY2UoZGV2aWNlX2lkKTsKKyAgICBpZiAoZGV2aWNlKQorICAgICAgICByZXR1cm4gZGV2aWNlLT5nZXRQYXJlbnQob2JqZWN0X2lkKTsKKyAgICBlbHNlCisjZW5kaWYKKyAgICAgICAgcmV0dXJuIC0xOworfQorCitzdGF0aWMgamludAorYW5kcm9pZF9tZWRpYV9NdHBDbGllbnRfZ2V0X3N0b3JhZ2VfaWQoSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeiwKKyAgICAgICAgamludCBkZXZpY2VfaWQsIGppbnQgb2JqZWN0X2lkKQoreworICNpZmRlZiBIQVZFX0FORFJPSURfT1MKKyAgICBNeUNsaWVudCAqY2xpZW50ID0gKE15Q2xpZW50ICopZW52LT5HZXRJbnRGaWVsZCh0aGl6LCBmaWVsZF9jb250ZXh0KTsKKyAgICBNdHBEZXZpY2UqIGRldmljZSA9IGNsaWVudC0+Z2V0RGV2aWNlKGRldmljZV9pZCk7CisgICAgaWYgKGRldmljZSkKKyAgICAgICAgcmV0dXJuIGRldmljZS0+Z2V0U3RvcmFnZUlEKG9iamVjdF9pZCk7CisgICAgZWxzZQorI2VuZGlmCisgICAgICAgIHJldHVybiAtMTsKK30KKworc3RhdGljIGpvYmplY3QKK2FuZHJvaWRfbWVkaWFfTXRwQ2xpZW50X29wZW5fZmlsZShKTklFbnYgKmVudiwgam9iamVjdCB0aGl6LAorICAgICAgICBqaW50IGRldmljZV9pZCwgamludCBvYmplY3RfaWQpCit7CisjaWZkZWYgSEFWRV9BTkRST0lEX09TCisgICAgTXlDbGllbnQgKmNsaWVudCA9IChNeUNsaWVudCAqKWVudi0+R2V0SW50RmllbGQodGhpeiwgZmllbGRfY29udGV4dCk7CisgICAgTXRwRGV2aWNlKiBkZXZpY2UgPSBjbGllbnQtPmdldERldmljZShkZXZpY2VfaWQpOworICAgIGlmICghZGV2aWNlKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIE10cE9iamVjdEluZm8qIGluZm8gPSBkZXZpY2UtPmdldE9iamVjdEluZm8ob2JqZWN0X2lkKTsKKyAgICBpZiAoIWluZm8pCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGludCBvYmplY3Rfc2l6ZSA9IGluZm8tPm1Db21wcmVzc2VkU2l6ZTsKKyAgICBkZWxldGUgaW5mbzsKKyAgICBpbnQgZmQgPSBkZXZpY2UtPnJlYWRPYmplY3Qob2JqZWN0X2lkLCBvYmplY3Rfc2l6ZSk7CisgICAgaWYgKGZkIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBqb2JqZWN0IGZpbGVEZXNjcmlwdG9yID0gZW52LT5OZXdPYmplY3QoZ0ZpbGVEZXNjcmlwdG9yT2Zmc2V0cy5tQ2xhc3MsCisgICAgICAgIGdGaWxlRGVzY3JpcHRvck9mZnNldHMubUNvbnN0cnVjdG9yKTsKKyAgICBpZiAoZmlsZURlc2NyaXB0b3IgIT0gTlVMTCkgeworICAgICAgICBlbnYtPlNldEludEZpZWxkKGZpbGVEZXNjcmlwdG9yLCBnRmlsZURlc2NyaXB0b3JPZmZzZXRzLm1EZXNjcmlwdG9yLCBmZCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBlbnYtPk5ld09iamVjdChnUGFyY2VsRmlsZURlc2NyaXB0b3JPZmZzZXRzLm1DbGFzcywKKyAgICAgICAgZ1BhcmNlbEZpbGVEZXNjcmlwdG9yT2Zmc2V0cy5tQ29uc3RydWN0b3IsIGZpbGVEZXNjcmlwdG9yKTsKKyNlbmRpZgorICAgIHJldHVybiBOVUxMOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBKTklOYXRpdmVNZXRob2QgZ01ldGhvZHNbXSA9IHsKKyAgICB7Im5hdGl2ZV9zZXR1cCIsICAgICAgICAgICAgIigpViIsICAodm9pZCAqKWFuZHJvaWRfbWVkaWFfTXRwQ2xpZW50X3NldHVwfSwKKyAgICB7Im5hdGl2ZV9maW5hbGl6ZSIsICAgICAgICAgIigpViIsICAodm9pZCAqKWFuZHJvaWRfbWVkaWFfTXRwQ2xpZW50X2ZpbmFsaXplfSwKKyAgICB7Im5hdGl2ZV9zdGFydCIsICAgICAgICAgICAgIigpWiIsICAodm9pZCAqKWFuZHJvaWRfbWVkaWFfTXRwQ2xpZW50X3N0YXJ0fSwKKyAgICB7Im5hdGl2ZV9zdG9wIiwgICAgICAgICAgICAgIigpViIsICAodm9pZCAqKWFuZHJvaWRfbWVkaWFfTXRwQ2xpZW50X3N0b3B9LAorICAgIHsibmF0aXZlX2RlbGV0ZV9vYmplY3QiLCAgICIoSUkpWiIsICh2b2lkICopYW5kcm9pZF9tZWRpYV9NdHBDbGllbnRfZGVsZXRlX29iamVjdH0sCisgICAgeyJuYXRpdmVfZ2V0X3BhcmVudCIsICAgICAgIihJSSlJIiwgKHZvaWQgKilhbmRyb2lkX21lZGlhX010cENsaWVudF9nZXRfcGFyZW50fSwKKyAgICB7Im5hdGl2ZV9nZXRfc3RvcmFnZV9pZCIsICAiKElJKUkiLCAodm9pZCAqKWFuZHJvaWRfbWVkaWFfTXRwQ2xpZW50X2dldF9zdG9yYWdlX2lkfSwKKyAgICB7Im5hdGl2ZV9vcGVuX2ZpbGUiLCAgICAgICAiKElJKUxhbmRyb2lkL29zL1BhcmNlbEZpbGVEZXNjcmlwdG9yOyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilhbmRyb2lkX21lZGlhX010cENsaWVudF9vcGVuX2ZpbGV9LAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIqIGNvbnN0IGtDbGFzc1BhdGhOYW1lID0gImFuZHJvaWQvbWVkaWEvTXRwQ2xpZW50IjsKKworaW50IHJlZ2lzdGVyX2FuZHJvaWRfbWVkaWFfTXRwQ2xpZW50KEpOSUVudiAqZW52KQoreworICAgIGpjbGFzcyBjbGF6ejsKKworICAgIExPR0QoInJlZ2lzdGVyX2FuZHJvaWRfbWVkaWFfTXRwQ2xpZW50XG4iKTsKKworICAgIGNsYXp6ID0gZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvbWVkaWEvTXRwQ2xpZW50Iik7CisgICAgaWYgKGNsYXp6ID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiQ2FuJ3QgZmluZCBhbmRyb2lkL21lZGlhL010cENsaWVudCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIG1ldGhvZF9kZXZpY2VBZGRlZCA9IGVudi0+R2V0TWV0aG9kSUQoY2xhenosICJkZXZpY2VBZGRlZCIsICIoSSlWIik7CisgICAgaWYgKG1ldGhvZF9kZXZpY2VBZGRlZCA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIkNhbid0IGZpbmQgZGV2aWNlQWRkZWQiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBtZXRob2RfZGV2aWNlUmVtb3ZlZCA9IGVudi0+R2V0TWV0aG9kSUQoY2xhenosICJkZXZpY2VSZW1vdmVkIiwgIihJKVYiKTsKKyAgICBpZiAobWV0aG9kX2RldmljZVJlbW92ZWQgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJDYW4ndCBmaW5kIGRldmljZVJlbW92ZWQiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBmaWVsZF9jb250ZXh0ID0gZW52LT5HZXRGaWVsZElEKGNsYXp6LCAibU5hdGl2ZUNvbnRleHQiLCAiSSIpOworICAgIGlmIChmaWVsZF9jb250ZXh0ID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiQ2FuJ3QgZmluZCBNdHBDbGllbnQubU5hdGl2ZUNvbnRleHQiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgY2xhenogPSBlbnYtPkZpbmRDbGFzcygiamF2YS9pby9GaWxlRGVzY3JpcHRvciIpOworICAgIExPR19GQVRBTF9JRihjbGF6eiA9PSBOVUxMLCAiVW5hYmxlIHRvIGZpbmQgY2xhc3MgamF2YS5pby5GaWxlRGVzY3JpcHRvciIpOworICAgIGdGaWxlRGVzY3JpcHRvck9mZnNldHMubUNsYXNzID0gKGpjbGFzcykgZW52LT5OZXdHbG9iYWxSZWYoY2xhenopOworICAgIGdGaWxlRGVzY3JpcHRvck9mZnNldHMubUNvbnN0cnVjdG9yID0gZW52LT5HZXRNZXRob2RJRChjbGF6eiwgIjxpbml0PiIsICIoKVYiKTsKKyAgICBnRmlsZURlc2NyaXB0b3JPZmZzZXRzLm1EZXNjcmlwdG9yID0gZW52LT5HZXRGaWVsZElEKGNsYXp6LCAiZGVzY3JpcHRvciIsICJJIik7CisgICAgTE9HX0ZBVEFMX0lGKGdGaWxlRGVzY3JpcHRvck9mZnNldHMubURlc2NyaXB0b3IgPT0gTlVMTCwKKyAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byBmaW5kIGRlc2NyaXB0b3IgZmllbGQgaW4gamF2YS5pby5GaWxlRGVzY3JpcHRvciIpOworCisgICBjbGF6eiA9IGVudi0+RmluZENsYXNzKCJhbmRyb2lkL29zL1BhcmNlbEZpbGVEZXNjcmlwdG9yIik7CisgICAgTE9HX0ZBVEFMX0lGKGNsYXp6ID09IE5VTEwsICJVbmFibGUgdG8gZmluZCBjbGFzcyBhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yIik7CisgICAgZ1BhcmNlbEZpbGVEZXNjcmlwdG9yT2Zmc2V0cy5tQ2xhc3MgPSAoamNsYXNzKSBlbnYtPk5ld0dsb2JhbFJlZihjbGF6eik7CisgICAgZ1BhcmNlbEZpbGVEZXNjcmlwdG9yT2Zmc2V0cy5tQ29uc3RydWN0b3IgPSBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCAiPGluaXQ+IiwgIihMamF2YS9pby9GaWxlRGVzY3JpcHRvcjspViIpOworICAgIExPR19GQVRBTF9JRihnUGFyY2VsRmlsZURlc2NyaXB0b3JPZmZzZXRzLm1Db25zdHJ1Y3RvciA9PSBOVUxMLAorICAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIGZpbmQgY29uc3RydWN0b3IgZm9yIGFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3IiKTsKKworICAgIHJldHVybiBBbmRyb2lkUnVudGltZTo6cmVnaXN0ZXJOYXRpdmVNZXRob2RzKGVudiwKKyAgICAgICAgICAgICAgICAiYW5kcm9pZC9tZWRpYS9NdHBDbGllbnQiLCBnTWV0aG9kcywgTkVMRU0oZ01ldGhvZHMpKTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2puaS9hbmRyb2lkX21lZGlhX010cEN1cnNvci5jcHAgYi9tZWRpYS9qbmkvYW5kcm9pZF9tZWRpYV9NdHBDdXJzb3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyMjhiNWQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9qbmkvYW5kcm9pZF9tZWRpYV9NdHBDdXJzb3IuY3BwCkBAIC0wLDAgKzEsMTM2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJNdHBDdXJzb3JKTkkiCisjaW5jbHVkZSAidXRpbHMvTG9nLmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisKKyNpbmNsdWRlICJqbmkuaCIKKyNpbmNsdWRlICJKTklIZWxwLmgiCisjaW5jbHVkZSAiYW5kcm9pZF9ydW50aW1lL0FuZHJvaWRSdW50aW1lLmgiCisjaW5jbHVkZSAiYmluZGVyL0N1cnNvcldpbmRvdy5oIgorCisjaW5jbHVkZSAiTXRwQ2xpZW50LmgiCisjaW5jbHVkZSAiTXRwQ3Vyc29yLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBqZmllbGRJRCBmaWVsZF9jb250ZXh0OworCisvLyBGcm9tIGFuZHJvaWRfbWVkaWFfTXRwQ2xpZW50LmNwcAorTXRwQ2xpZW50ICogZ2V0X2NsaWVudF9mcm9tX29iamVjdChKTklFbnYgKiBlbnYsIGpvYmplY3QgamF2YUNsaWVudCk7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIGJvb2wgRXhjZXB0aW9uQ2hlY2sodm9pZCogZW52KQoreworICAgIHJldHVybiAoKEpOSUVudiAqKWVudiktPkV4Y2VwdGlvbkNoZWNrKCk7Cit9CisKK3N0YXRpYyB2b2lkCithbmRyb2lkX21lZGlhX010cEN1cnNvcl9zZXR1cChKTklFbnYgKmVudiwgam9iamVjdCB0aGl6LCBqb2JqZWN0IGphdmFDbGllbnQsCisgICAgICAgIGppbnQgcXVlcnlUeXBlLCBqaW50IGRldmljZUlELCBqaW50IHN0b3JhZ2VJRCwgamludCBvYmplY3RJRCwgamludEFycmF5IGphdmFDb2x1bW5zKQoreworI2lmZGVmIEhBVkVfQU5EUk9JRF9PUworICAgIExPR0QoImFuZHJvaWRfbWVkaWFfTXRwQ3Vyc29yX3NldHVwIHF1ZXJ5VHlwZTogJWQgZGV2aWNlSUQ6ICVkIHN0b3JhZ2VJRDogJWQgb2JqZWN0SUQ6ICVkXG4iLAorICAgICAgICAgICAgICAgIHF1ZXJ5VHlwZSwgZGV2aWNlSUQsIHN0b3JhZ2VJRCwgb2JqZWN0SUQpOworCisgICAgaW50KiBjb2x1bW5zID0gTlVMTDsKKyAgICBpbnQgY29sdW1uQ291bnQgPSAwOworICAgIGlmIChqYXZhQ29sdW1ucykgeworICAgICAgICBjb2x1bW5zID0gZW52LT5HZXRJbnRBcnJheUVsZW1lbnRzKGphdmFDb2x1bW5zLCAwKTsKKyAgICAgICAgY29sdW1uQ291bnQgPSBlbnYtPkdldEFycmF5TGVuZ3RoKGphdmFDb2x1bW5zKTsKKyAgICB9CisKKyAgICBNdHBDbGllbnQqIGNsaWVudCA9IGdldF9jbGllbnRfZnJvbV9vYmplY3QoZW52LCBqYXZhQ2xpZW50KTsKKyAgICBNdHBDdXJzb3IqIGN1cnNvciA9IG5ldyBNdHBDdXJzb3IoY2xpZW50LCBxdWVyeVR5cGUsCisgICAgICAgICAgICBkZXZpY2VJRCwgc3RvcmFnZUlELCBvYmplY3RJRCwgY29sdW1uQ291bnQsIGNvbHVtbnMpOworCisgICAgaWYgKGNvbHVtbnMpCisgICAgICAgIGVudi0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoamF2YUNvbHVtbnMsIGNvbHVtbnMsIDApOworICAgIGVudi0+U2V0SW50RmllbGQodGhpeiwgZmllbGRfY29udGV4dCwgKGludCljdXJzb3IpOworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkCithbmRyb2lkX21lZGlhX010cEN1cnNvcl9maW5hbGl6ZShKTklFbnYgKmVudiwgam9iamVjdCB0aGl6KQoreworI2lmZGVmIEhBVkVfQU5EUk9JRF9PUworICAgIExPR0QoImZpbmFsaXplXG4iKTsKKyAgICBNdHBDdXJzb3IgKmN1cnNvciA9IChNdHBDdXJzb3IgKillbnYtPkdldEludEZpZWxkKHRoaXosIGZpZWxkX2NvbnRleHQpOworICAgIGRlbGV0ZSBjdXJzb3I7CisjZW5kaWYKK30KKworc3RhdGljIGppbnQKK2FuZHJvaWRfbWVkaWFfTXRwQ3Vyc29yX2ZpbGxfd2luZG93KEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXosIGpvYmplY3QgamF2YVdpbmRvdywgamludCBzdGFydFBvcykKK3sKKyNpZmRlZiBIQVZFX0FORFJPSURfT1MKKyAgICBDdXJzb3JXaW5kb3cqIHdpbmRvdyA9IGdldF93aW5kb3dfZnJvbV9vYmplY3QoZW52LCBqYXZhV2luZG93KTsKKyAgICBpZiAoIXdpbmRvdykgeworICAgICAgICBMT0dFKCJJbnZhbGlkIEN1cnNvcldpbmRvdyIpOworICAgICAgICBqbmlUaHJvd0V4Y2VwdGlvbihlbnYsICJqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkJhZCBDdXJzb3JXaW5kb3ciKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIE10cEN1cnNvciAqY3Vyc29yID0gKE10cEN1cnNvciAqKWVudi0+R2V0SW50RmllbGQodGhpeiwgZmllbGRfY29udGV4dCk7CisKKyAgICByZXR1cm4gY3Vyc29yLT5maWxsV2luZG93KHdpbmRvdywgc3RhcnRQb3MpOworI2Vsc2UKKyAgICByZXR1cm4gMDsKKyNlbmRpZgorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBKTklOYXRpdmVNZXRob2QgZ01ldGhvZHNbXSA9IHsKKyAgICB7Im5hdGl2ZV9zZXR1cCIsICAgICAgICAgICAgIihMYW5kcm9pZC9tZWRpYS9NdHBDbGllbnQ7SUlJSVtJKVYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopYW5kcm9pZF9tZWRpYV9NdHBDdXJzb3Jfc2V0dXB9LAorICAgIHsibmF0aXZlX2ZpbmFsaXplIiwgICAgICAgICAiKClWIiwgICh2b2lkICopYW5kcm9pZF9tZWRpYV9NdHBDdXJzb3JfZmluYWxpemV9LAorICAgIHsibmF0aXZlX2ZpbGxfd2luZG93IiwgICAgICAiKExhbmRyb2lkL2RhdGFiYXNlL0N1cnNvcldpbmRvdztJKUkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopYW5kcm9pZF9tZWRpYV9NdHBDdXJzb3JfZmlsbF93aW5kb3d9LAorCit9OworCitzdGF0aWMgY29uc3QgY2hhciogY29uc3Qga0NsYXNzUGF0aE5hbWUgPSAiYW5kcm9pZC9tZWRpYS9NdHBDdXJzb3IiOworCitpbnQgcmVnaXN0ZXJfYW5kcm9pZF9tZWRpYV9NdHBDdXJzb3IoSk5JRW52ICplbnYpCit7CisgICAgamNsYXNzIGNsYXp6OworCisgICAgTE9HRCgicmVnaXN0ZXJfYW5kcm9pZF9tZWRpYV9NdHBDdXJzb3JcbiIpOworCisgICAgY2xhenogPSBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9tZWRpYS9NdHBDdXJzb3IiKTsKKyAgICBpZiAoY2xhenogPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJDYW4ndCBmaW5kIGFuZHJvaWQvbWVkaWEvTXRwQ3Vyc29yIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgZmllbGRfY29udGV4dCA9IGVudi0+R2V0RmllbGRJRChjbGF6eiwgIm1OYXRpdmVDb250ZXh0IiwgIkkiKTsKKyAgICBpZiAoZmllbGRfY29udGV4dCA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIkNhbid0IGZpbmQgTXRwQ3Vyc29yLm1OYXRpdmVDb250ZXh0Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICByZXR1cm4gQW5kcm9pZFJ1bnRpbWU6OnJlZ2lzdGVyTmF0aXZlTWV0aG9kcyhlbnYsCisgICAgICAgICAgICAgICAgImFuZHJvaWQvbWVkaWEvTXRwQ3Vyc29yIiwgZ01ldGhvZHMsIE5FTEVNKGdNZXRob2RzKSk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9qbmkvYW5kcm9pZF9tZWRpYV9NdHBEYXRhYmFzZS5jcHAgYi9tZWRpYS9qbmkvYW5kcm9pZF9tZWRpYV9NdHBEYXRhYmFzZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmY4MzE3MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2puaS9hbmRyb2lkX21lZGlhX010cERhdGFiYXNlLmNwcApAQCAtMCwwICsxLDYyNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiTXRwRGF0YWJhc2VKTkkiCisjaW5jbHVkZSAidXRpbHMvTG9nLmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisKKyNpbmNsdWRlICJqbmkuaCIKKyNpbmNsdWRlICJKTklIZWxwLmgiCisjaW5jbHVkZSAiYW5kcm9pZF9ydW50aW1lL0FuZHJvaWRSdW50aW1lLmgiCisKKyNpbmNsdWRlICJNdHBEYXRhYmFzZS5oIgorI2luY2x1ZGUgIk10cERhdGFQYWNrZXQuaCIKKyNpbmNsdWRlICJNdHBVdGlscy5oIgorI2luY2x1ZGUgIm10cC5oIgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgam1ldGhvZElEIG1ldGhvZF9iZWdpblNlbmRPYmplY3Q7CitzdGF0aWMgam1ldGhvZElEIG1ldGhvZF9lbmRTZW5kT2JqZWN0Oworc3RhdGljIGptZXRob2RJRCBtZXRob2RfZ2V0T2JqZWN0TGlzdDsKK3N0YXRpYyBqbWV0aG9kSUQgbWV0aG9kX2dldE51bU9iamVjdHM7CitzdGF0aWMgam1ldGhvZElEIG1ldGhvZF9nZXRTdXBwb3J0ZWRQbGF5YmFja0Zvcm1hdHM7CitzdGF0aWMgam1ldGhvZElEIG1ldGhvZF9nZXRTdXBwb3J0ZWRDYXB0dXJlRm9ybWF0czsKK3N0YXRpYyBqbWV0aG9kSUQgbWV0aG9kX2dldFN1cHBvcnRlZE9iamVjdFByb3BlcnRpZXM7CitzdGF0aWMgam1ldGhvZElEIG1ldGhvZF9nZXRTdXBwb3J0ZWREZXZpY2VQcm9wZXJ0aWVzOworc3RhdGljIGptZXRob2RJRCBtZXRob2RfZ2V0T2JqZWN0UHJvcGVydHk7CitzdGF0aWMgam1ldGhvZElEIG1ldGhvZF9nZXRPYmplY3RJbmZvOworc3RhdGljIGptZXRob2RJRCBtZXRob2RfZ2V0T2JqZWN0RmlsZVBhdGg7CitzdGF0aWMgam1ldGhvZElEIG1ldGhvZF9kZWxldGVGaWxlOworc3RhdGljIGptZXRob2RJRCBtZXRob2RfZ2V0T2JqZWN0UmVmZXJlbmNlczsKK3N0YXRpYyBqbWV0aG9kSUQgbWV0aG9kX3NldE9iamVjdFJlZmVyZW5jZXM7CitzdGF0aWMgamZpZWxkSUQgZmllbGRfY29udGV4dDsKKworTXRwRGF0YWJhc2UqIGdldE10cERhdGFiYXNlKEpOSUVudiAqZW52LCBqb2JqZWN0IGRhdGFiYXNlKSB7CisgICAgcmV0dXJuIChNdHBEYXRhYmFzZSAqKWVudi0+R2V0SW50RmllbGQoZGF0YWJhc2UsIGZpZWxkX2NvbnRleHQpOworfQorCisjaWZkZWYgSEFWRV9BTkRST0lEX09TCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIE15TXRwRGF0YWJhc2UgOiBwdWJsaWMgTXRwRGF0YWJhc2UgeworcHJpdmF0ZToKKyAgICBqb2JqZWN0ICAgICAgICAgbURhdGFiYXNlOworICAgIGppbnRBcnJheSAgICAgICBtSW50QnVmZmVyOworICAgIGpsb25nQXJyYXkgICAgICBtTG9uZ0J1ZmZlcjsKKyAgICBqY2hhckFycmF5ICAgICAgbVN0cmluZ0J1ZmZlcjsKKworcHVibGljOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXlNdHBEYXRhYmFzZShKTklFbnYgKmVudiwgam9iamVjdCBjbGllbnQpOworICAgIHZpcnR1YWwgICAgICAgICAgICAgICAgICAgICAgICAgfk15TXRwRGF0YWJhc2UoKTsKKyAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFudXAoSk5JRW52ICplbnYpOworCisgICAgdmlydHVhbCBNdHBPYmplY3RIYW5kbGUgICAgICAgICBiZWdpblNlbmRPYmplY3QoY29uc3QgY2hhciogcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0Rm9ybWF0IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0SGFuZGxlIHBhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwU3RvcmFnZUlEIHN0b3JhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVfdCBtb2RpZmllZCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICAgICAgICAgIGVuZFNlbmRPYmplY3QoY29uc3QgY2hhciogcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0Rm9ybWF0IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdWNjZWVkZWQpOworCisgICAgdmlydHVhbCBNdHBPYmplY3RIYW5kbGVMaXN0KiAgICBnZXRPYmplY3RMaXN0KE10cFN0b3JhZ2VJRCBzdG9yYWdlSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RGb3JtYXQgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0SGFuZGxlIHBhcmVudCk7CisKKyAgICB2aXJ0dWFsIGludCAgICAgICAgICAgICAgICAgICAgIGdldE51bU9iamVjdHMoTXRwU3RvcmFnZUlEIHN0b3JhZ2VJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0Rm9ybWF0IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0SGFuZGxlIHBhcmVudCk7CisKKyAgICAvLyBjYWxsZWUgc2hvdWxkIGRlbGV0ZVtdIHRoZSByZXN1bHRzIGZyb20gdGhlc2UKKyAgICAvLyByZXN1bHRzIGNhbiBiZSBOVUxMCisgICAgdmlydHVhbCBNdHBPYmplY3RGb3JtYXRMaXN0KiAgICBnZXRTdXBwb3J0ZWRQbGF5YmFja0Zvcm1hdHMoKTsKKyAgICB2aXJ0dWFsIE10cE9iamVjdEZvcm1hdExpc3QqICAgIGdldFN1cHBvcnRlZENhcHR1cmVGb3JtYXRzKCk7CisgICAgdmlydHVhbCBNdHBPYmplY3RQcm9wZXJ0eUxpc3QqICBnZXRTdXBwb3J0ZWRPYmplY3RQcm9wZXJ0aWVzKE10cE9iamVjdEZvcm1hdCBmb3JtYXQpOworICAgIHZpcnR1YWwgTXRwRGV2aWNlUHJvcGVydHlMaXN0KiAgZ2V0U3VwcG9ydGVkRGV2aWNlUHJvcGVydGllcygpOworCisgICAgdmlydHVhbCBNdHBSZXNwb25zZUNvZGUgICAgICAgICBnZXRPYmplY3RQcm9wZXJ0eShNdHBPYmplY3RIYW5kbGUgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RQcm9wZXJ0eSBwcm9wZXJ0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwRGF0YVBhY2tldCYgcGFja2V0KTsKKworICAgIHZpcnR1YWwgTXRwUmVzcG9uc2VDb2RlICAgICAgICAgZ2V0T2JqZWN0SW5mbyhNdHBPYmplY3RIYW5kbGUgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBEYXRhUGFja2V0JiBwYWNrZXQpOworCisgICAgdmlydHVhbCBNdHBSZXNwb25zZUNvZGUgICAgICAgICBnZXRPYmplY3RGaWxlUGF0aChNdHBPYmplY3RIYW5kbGUgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBTdHJpbmcmIGZpbGVQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90JiBmaWxlTGVuZ3RoKTsKKyAgICB2aXJ0dWFsIE10cFJlc3BvbnNlQ29kZSAgICAgICAgIGRlbGV0ZUZpbGUoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSk7CisKKyAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFByb3BlcnR5SW5mbyhNdHBPYmplY3RQcm9wZXJ0eSBwcm9wZXJ0eSwgaW50JiB0eXBlKTsKKworICAgIHZpcnR1YWwgTXRwT2JqZWN0SGFuZGxlTGlzdCogICAgZ2V0T2JqZWN0UmVmZXJlbmNlcyhNdHBPYmplY3RIYW5kbGUgaGFuZGxlKTsKKworICAgIHZpcnR1YWwgTXRwUmVzcG9uc2VDb2RlICAgICAgICAgc2V0T2JqZWN0UmVmZXJlbmNlcyhNdHBPYmplY3RIYW5kbGUgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RIYW5kbGVMaXN0KiByZWZlcmVuY2VzKTsKK307CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQgY2hlY2tBbmRDbGVhckV4Y2VwdGlvbkZyb21DYWxsYmFjayhKTklFbnYqIGVudiwgY29uc3QgY2hhciogbWV0aG9kTmFtZSkgeworICAgIGlmIChlbnYtPkV4Y2VwdGlvbkNoZWNrKCkpIHsKKyAgICAgICAgTE9HRSgiQW4gZXhjZXB0aW9uIHdhcyB0aHJvd24gYnkgY2FsbGJhY2sgJyVzJy4iLCBtZXRob2ROYW1lKTsKKyAgICAgICAgTE9HRV9FWChlbnYpOworICAgICAgICBlbnYtPkV4Y2VwdGlvbkNsZWFyKCk7CisgICAgfQorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK015TXRwRGF0YWJhc2U6Ok15TXRwRGF0YWJhc2UoSk5JRW52ICplbnYsIGpvYmplY3QgY2xpZW50KQorICAgIDogICBtRGF0YWJhc2UoZW52LT5OZXdHbG9iYWxSZWYoY2xpZW50KSksCisgICAgICAgIG1JbnRCdWZmZXIoTlVMTCksCisgICAgICAgIG1Mb25nQnVmZmVyKE5VTEwpLAorICAgICAgICBtU3RyaW5nQnVmZmVyKE5VTEwpCit7CisgICAgamludEFycmF5IGludEFycmF5OworICAgIGpsb25nQXJyYXkgbG9uZ0FycmF5OworICAgIGpjaGFyQXJyYXkgY2hhckFycmF5OworCisgICAgLy8gY3JlYXRlIGJ1ZmZlcnMgZm9yIG91dCBhcmd1bWVudHMKKyAgICAvLyB3ZSBkb24ndCBuZWVkIHRvIGJlIHRocmVhZC1zYWZlIHNvIHRoaXMgaXMgT0sKKyAgICBpbnRBcnJheSA9IGVudi0+TmV3SW50QXJyYXkoMyk7CisgICAgaWYgKCFpbnRBcnJheSkKKyAgICAgICAgZ290byBvdXRfb2ZfbWVtb3J5OworICAgIG1JbnRCdWZmZXIgPSAoamludEFycmF5KWVudi0+TmV3R2xvYmFsUmVmKGludEFycmF5KTsKKyAgICBsb25nQXJyYXkgPSBlbnYtPk5ld0xvbmdBcnJheSgyKTsKKyAgICBpZiAoIWxvbmdBcnJheSkKKyAgICAgICAgZ290byBvdXRfb2ZfbWVtb3J5OworICAgIG1Mb25nQnVmZmVyID0gKGpsb25nQXJyYXkpZW52LT5OZXdHbG9iYWxSZWYobG9uZ0FycmF5KTsKKyAgICBjaGFyQXJyYXkgPSBlbnYtPk5ld0NoYXJBcnJheSgyNTYpOworICAgIGlmICghY2hhckFycmF5KQorICAgICAgICBnb3RvIG91dF9vZl9tZW1vcnk7CisgICAgbVN0cmluZ0J1ZmZlciA9IChqY2hhckFycmF5KWVudi0+TmV3R2xvYmFsUmVmKGNoYXJBcnJheSk7CisgICAgcmV0dXJuOworCitvdXRfb2ZfbWVtb3J5OgorICAgIGVudi0+VGhyb3dOZXcoZW52LT5GaW5kQ2xhc3MoImphdmEvbGFuZy9PdXRPZk1lbW9yeUVycm9yIiksIE5VTEwpOworfQorCit2b2lkIE15TXRwRGF0YWJhc2U6OmNsZWFudXAoSk5JRW52ICplbnYpIHsKKyAgICBlbnYtPkRlbGV0ZUdsb2JhbFJlZihtRGF0YWJhc2UpOworICAgIGVudi0+RGVsZXRlR2xvYmFsUmVmKG1JbnRCdWZmZXIpOworICAgIGVudi0+RGVsZXRlR2xvYmFsUmVmKG1Mb25nQnVmZmVyKTsKKyAgICBlbnYtPkRlbGV0ZUdsb2JhbFJlZihtU3RyaW5nQnVmZmVyKTsKK30KKworTXlNdHBEYXRhYmFzZTo6fk15TXRwRGF0YWJhc2UoKSB7Cit9CisKK010cE9iamVjdEhhbmRsZSBNeU10cERhdGFiYXNlOjpiZWdpblNlbmRPYmplY3QoY29uc3QgY2hhciogcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0Rm9ybWF0IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0SGFuZGxlIHBhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwU3RvcmFnZUlEIHN0b3JhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVfdCBtb2RpZmllZCkgeworICAgIEpOSUVudiogZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIE10cE9iamVjdEhhbmRsZSByZXN1bHQgPSBlbnYtPkNhbGxJbnRNZXRob2QobURhdGFiYXNlLCBtZXRob2RfYmVnaW5TZW5kT2JqZWN0LAorICAgICAgICAgICAgZW52LT5OZXdTdHJpbmdVVEYocGF0aCksIChqaW50KWZvcm1hdCwgKGppbnQpcGFyZW50LCAoamludClzdG9yYWdlLAorICAgICAgICAgICAgKGpsb25nKXNpemUsIChqbG9uZyltb2RpZmllZCk7CisKKyAgICBjaGVja0FuZENsZWFyRXhjZXB0aW9uRnJvbUNhbGxiYWNrKGVudiwgX19GVU5DVElPTl9fKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCit2b2lkIE15TXRwRGF0YWJhc2U6OmVuZFNlbmRPYmplY3QoY29uc3QgY2hhciogcGF0aCwgTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0Rm9ybWF0IGZvcm1hdCwgYm9vbCBzdWNjZWVkZWQpIHsKKyAgICBKTklFbnYqIGVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBlbnYtPkNhbGxWb2lkTWV0aG9kKG1EYXRhYmFzZSwgbWV0aG9kX2VuZFNlbmRPYmplY3QsIGVudi0+TmV3U3RyaW5nVVRGKHBhdGgpLAorICAgICAgICAgICAgICAgICAgICAgICAgKGppbnQpaGFuZGxlLCAoamludClmb3JtYXQsIChqYm9vbGVhbilzdWNjZWVkZWQpOworCisgICAgY2hlY2tBbmRDbGVhckV4Y2VwdGlvbkZyb21DYWxsYmFjayhlbnYsIF9fRlVOQ1RJT05fXyk7Cit9CisKK010cE9iamVjdEhhbmRsZUxpc3QqIE15TXRwRGF0YWJhc2U6OmdldE9iamVjdExpc3QoTXRwU3RvcmFnZUlEIHN0b3JhZ2VJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdEZvcm1hdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RIYW5kbGUgcGFyZW50KSB7CisgICAgSk5JRW52KiBlbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgamludEFycmF5IGFycmF5ID0gKGppbnRBcnJheSllbnYtPkNhbGxPYmplY3RNZXRob2QobURhdGFiYXNlLCBtZXRob2RfZ2V0T2JqZWN0TGlzdCwKKyAgICAgICAgICAgICAgICAoamludClzdG9yYWdlSUQsIChqaW50KWZvcm1hdCwgKGppbnQpcGFyZW50KTsKKyAgICBpZiAoIWFycmF5KQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBNdHBPYmplY3RIYW5kbGVMaXN0KiBsaXN0ID0gbmV3IE10cE9iamVjdEhhbmRsZUxpc3QoKTsKKyAgICBqaW50KiBoYW5kbGVzID0gZW52LT5HZXRJbnRBcnJheUVsZW1lbnRzKGFycmF5LCAwKTsKKyAgICBqc2l6ZSBsZW5ndGggPSBlbnYtPkdldEFycmF5TGVuZ3RoKGFycmF5KTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQorICAgICAgICBsaXN0LT5wdXNoKGhhbmRsZXNbaV0pOworICAgIGVudi0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoYXJyYXksIGhhbmRsZXMsIDApOworCisgICAgY2hlY2tBbmRDbGVhckV4Y2VwdGlvbkZyb21DYWxsYmFjayhlbnYsIF9fRlVOQ1RJT05fXyk7CisgICAgcmV0dXJuIGxpc3Q7Cit9CisKK2ludCBNeU10cERhdGFiYXNlOjpnZXROdW1PYmplY3RzKE10cFN0b3JhZ2VJRCBzdG9yYWdlSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdEZvcm1hdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdEhhbmRsZSBwYXJlbnQpIHsKKyAgICBKTklFbnYqIGVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBpbnQgcmVzdWx0ID0gZW52LT5DYWxsSW50TWV0aG9kKG1EYXRhYmFzZSwgbWV0aG9kX2dldE51bU9iamVjdHMsCisgICAgICAgICAgICAgICAgKGppbnQpc3RvcmFnZUlELCAoamludClmb3JtYXQsIChqaW50KXBhcmVudCk7CisKKyAgICBjaGVja0FuZENsZWFyRXhjZXB0aW9uRnJvbUNhbGxiYWNrKGVudiwgX19GVU5DVElPTl9fKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitNdHBPYmplY3RGb3JtYXRMaXN0KiBNeU10cERhdGFiYXNlOjpnZXRTdXBwb3J0ZWRQbGF5YmFja0Zvcm1hdHMoKSB7CisgICAgSk5JRW52KiBlbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgamludEFycmF5IGFycmF5ID0gKGppbnRBcnJheSllbnYtPkNhbGxPYmplY3RNZXRob2QobURhdGFiYXNlLAorICAgICAgICAgICAgbWV0aG9kX2dldFN1cHBvcnRlZFBsYXliYWNrRm9ybWF0cyk7CisgICAgaWYgKCFhcnJheSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTXRwT2JqZWN0Rm9ybWF0TGlzdCogbGlzdCA9IG5ldyBNdHBPYmplY3RGb3JtYXRMaXN0KCk7CisgICAgamludCogZm9ybWF0cyA9IGVudi0+R2V0SW50QXJyYXlFbGVtZW50cyhhcnJheSwgMCk7CisgICAganNpemUgbGVuZ3RoID0gZW52LT5HZXRBcnJheUxlbmd0aChhcnJheSk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKKyAgICAgICAgbGlzdC0+cHVzaChmb3JtYXRzW2ldKTsKKyAgICBlbnYtPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGFycmF5LCBmb3JtYXRzLCAwKTsKKworICAgIGNoZWNrQW5kQ2xlYXJFeGNlcHRpb25Gcm9tQ2FsbGJhY2soZW52LCBfX0ZVTkNUSU9OX18pOworICAgIHJldHVybiBsaXN0OworfQorCitNdHBPYmplY3RGb3JtYXRMaXN0KiBNeU10cERhdGFiYXNlOjpnZXRTdXBwb3J0ZWRDYXB0dXJlRm9ybWF0cygpIHsKKyAgICBKTklFbnYqIGVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBqaW50QXJyYXkgYXJyYXkgPSAoamludEFycmF5KWVudi0+Q2FsbE9iamVjdE1ldGhvZChtRGF0YWJhc2UsCisgICAgICAgICAgICBtZXRob2RfZ2V0U3VwcG9ydGVkQ2FwdHVyZUZvcm1hdHMpOworICAgIGlmICghYXJyYXkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIE10cE9iamVjdEZvcm1hdExpc3QqIGxpc3QgPSBuZXcgTXRwT2JqZWN0Rm9ybWF0TGlzdCgpOworICAgIGppbnQqIGZvcm1hdHMgPSBlbnYtPkdldEludEFycmF5RWxlbWVudHMoYXJyYXksIDApOworICAgIGpzaXplIGxlbmd0aCA9IGVudi0+R2V0QXJyYXlMZW5ndGgoYXJyYXkpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCisgICAgICAgIGxpc3QtPnB1c2goZm9ybWF0c1tpXSk7CisgICAgZW52LT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhhcnJheSwgZm9ybWF0cywgMCk7CisKKyAgICBjaGVja0FuZENsZWFyRXhjZXB0aW9uRnJvbUNhbGxiYWNrKGVudiwgX19GVU5DVElPTl9fKTsKKyAgICByZXR1cm4gbGlzdDsKK30KKworTXRwT2JqZWN0UHJvcGVydHlMaXN0KiBNeU10cERhdGFiYXNlOjpnZXRTdXBwb3J0ZWRPYmplY3RQcm9wZXJ0aWVzKE10cE9iamVjdEZvcm1hdCBmb3JtYXQpIHsKKyAgICBKTklFbnYqIGVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBqaW50QXJyYXkgYXJyYXkgPSAoamludEFycmF5KWVudi0+Q2FsbE9iamVjdE1ldGhvZChtRGF0YWJhc2UsCisgICAgICAgICAgICBtZXRob2RfZ2V0U3VwcG9ydGVkT2JqZWN0UHJvcGVydGllcywgKGppbnQpZm9ybWF0KTsKKyAgICBpZiAoIWFycmF5KQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBNdHBPYmplY3RQcm9wZXJ0eUxpc3QqIGxpc3QgPSBuZXcgTXRwT2JqZWN0UHJvcGVydHlMaXN0KCk7CisgICAgamludCogcHJvcGVydGllcyA9IGVudi0+R2V0SW50QXJyYXlFbGVtZW50cyhhcnJheSwgMCk7CisgICAganNpemUgbGVuZ3RoID0gZW52LT5HZXRBcnJheUxlbmd0aChhcnJheSk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKKyAgICAgICAgbGlzdC0+cHVzaChwcm9wZXJ0aWVzW2ldKTsKKyAgICBlbnYtPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGFycmF5LCBwcm9wZXJ0aWVzLCAwKTsKKworICAgIGNoZWNrQW5kQ2xlYXJFeGNlcHRpb25Gcm9tQ2FsbGJhY2soZW52LCBfX0ZVTkNUSU9OX18pOworICAgIHJldHVybiBsaXN0OworfQorCitNdHBEZXZpY2VQcm9wZXJ0eUxpc3QqIE15TXRwRGF0YWJhc2U6OmdldFN1cHBvcnRlZERldmljZVByb3BlcnRpZXMoKSB7CisgICAgSk5JRW52KiBlbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgamludEFycmF5IGFycmF5ID0gKGppbnRBcnJheSllbnYtPkNhbGxPYmplY3RNZXRob2QobURhdGFiYXNlLAorICAgICAgICAgICAgbWV0aG9kX2dldFN1cHBvcnRlZERldmljZVByb3BlcnRpZXMpOworICAgIGlmICghYXJyYXkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIE10cERldmljZVByb3BlcnR5TGlzdCogbGlzdCA9IG5ldyBNdHBEZXZpY2VQcm9wZXJ0eUxpc3QoKTsKKyAgICBqaW50KiBwcm9wZXJ0aWVzID0gZW52LT5HZXRJbnRBcnJheUVsZW1lbnRzKGFycmF5LCAwKTsKKyAgICBqc2l6ZSBsZW5ndGggPSBlbnYtPkdldEFycmF5TGVuZ3RoKGFycmF5KTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQorICAgICAgICBsaXN0LT5wdXNoKHByb3BlcnRpZXNbaV0pOworICAgIGVudi0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoYXJyYXksIHByb3BlcnRpZXMsIDApOworCisgICAgY2hlY2tBbmRDbGVhckV4Y2VwdGlvbkZyb21DYWxsYmFjayhlbnYsIF9fRlVOQ1RJT05fXyk7CisgICAgcmV0dXJuIGxpc3Q7Cit9CisKK010cFJlc3BvbnNlQ29kZSBNeU10cERhdGFiYXNlOjpnZXRPYmplY3RQcm9wZXJ0eShNdHBPYmplY3RIYW5kbGUgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RQcm9wZXJ0eSBwcm9wZXJ0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwRGF0YVBhY2tldCYgcGFja2V0KSB7CisgICAgaW50ICAgICAgICAgdHlwZTsKKworICAgIGlmICghZ2V0UHJvcGVydHlJbmZvKHByb3BlcnR5LCB0eXBlKSkKKyAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9JTlZBTElEX09CSkVDVF9QUk9QX0NPREU7CisKKyAgICBKTklFbnYqIGVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBqaW50IHJlc3VsdCA9IGVudi0+Q2FsbEludE1ldGhvZChtRGF0YWJhc2UsIG1ldGhvZF9nZXRPYmplY3RQcm9wZXJ0eSwKKyAgICAgICAgICAgICAgICAoamludCloYW5kbGUsIChqaW50KXByb3BlcnR5LCBtTG9uZ0J1ZmZlciwgbVN0cmluZ0J1ZmZlcik7CisgICAgaWYgKHJlc3VsdCAhPSBNVFBfUkVTUE9OU0VfT0spCisgICAgICAgIHJldHVybiByZXN1bHQ7CisKKyAgICBqbG9uZyogbG9uZ1ZhbHVlcyA9IGVudi0+R2V0TG9uZ0FycmF5RWxlbWVudHMobUxvbmdCdWZmZXIsIDApOworICAgIGpsb25nIGxvbmdWYWx1ZSA9IGxvbmdWYWx1ZXNbMF07CisgICAgZW52LT5SZWxlYXNlTG9uZ0FycmF5RWxlbWVudHMobUxvbmdCdWZmZXIsIGxvbmdWYWx1ZXMsIDApOworCisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfSU5UODoKKyAgICAgICAgICAgIHBhY2tldC5wdXRJbnQ4KGxvbmdWYWx1ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9VSU5UODoKKyAgICAgICAgICAgIHBhY2tldC5wdXRVSW50OChsb25nVmFsdWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfSU5UMTY6CisgICAgICAgICAgICBwYWNrZXQucHV0SW50MTYobG9uZ1ZhbHVlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX1VJTlQxNjoKKyAgICAgICAgICAgIHBhY2tldC5wdXRVSW50MTYobG9uZ1ZhbHVlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX0lOVDMyOgorICAgICAgICAgICAgcGFja2V0LnB1dEludDMyKGxvbmdWYWx1ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9VSU5UMzI6CisgICAgICAgICAgICBwYWNrZXQucHV0VUludDMyKGxvbmdWYWx1ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9JTlQ2NDoKKyAgICAgICAgICAgIHBhY2tldC5wdXRJbnQ2NChsb25nVmFsdWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfVUlOVDY0OgorICAgICAgICAgICAgcGFja2V0LnB1dFVJbnQ2NChsb25nVmFsdWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfU1RSOgorICAgICAgICB7CisgICAgICAgICAgICBqY2hhciogc3RyID0gZW52LT5HZXRDaGFyQXJyYXlFbGVtZW50cyhtU3RyaW5nQnVmZmVyLCAwKTsKKyAgICAgICAgICAgIHBhY2tldC5wdXRTdHJpbmcoc3RyKTsKKyAgICAgICAgICAgIGVudi0+UmVsZWFzZUNoYXJBcnJheUVsZW1lbnRzKG1TdHJpbmdCdWZmZXIsIHN0ciwgMCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIExPR0UoInVuc3VwcG9ydGVkIG9iamVjdCB0eXBlXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfSU5WQUxJRF9PQkpFQ1RfSEFORExFOworICAgIH0KKworICAgIGNoZWNrQW5kQ2xlYXJFeGNlcHRpb25Gcm9tQ2FsbGJhY2soZW52LCBfX0ZVTkNUSU9OX18pOworICAgIHJldHVybiBNVFBfUkVTUE9OU0VfT0s7Cit9CisKK010cFJlc3BvbnNlQ29kZSBNeU10cERhdGFiYXNlOjpnZXRPYmplY3RJbmZvKE10cE9iamVjdEhhbmRsZSBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cERhdGFQYWNrZXQmIHBhY2tldCkgeworICAgIGNoYXIgICAgZGF0ZVsyMF07CisKKyAgICBKTklFbnYqIGVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBqYm9vbGVhbiByZXN1bHQgPSBlbnYtPkNhbGxCb29sZWFuTWV0aG9kKG1EYXRhYmFzZSwgbWV0aG9kX2dldE9iamVjdEluZm8sCisgICAgICAgICAgICAgICAgKGppbnQpaGFuZGxlLCBtSW50QnVmZmVyLCBtU3RyaW5nQnVmZmVyLCBtTG9uZ0J1ZmZlcik7CisgICAgaWYgKCFyZXN1bHQpCisgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfSU5WQUxJRF9PQkpFQ1RfSEFORExFOworCisgICAgamludCogaW50VmFsdWVzID0gZW52LT5HZXRJbnRBcnJheUVsZW1lbnRzKG1JbnRCdWZmZXIsIDApOworICAgIE10cFN0b3JhZ2VJRCBzdG9yYWdlSUQgPSBpbnRWYWx1ZXNbMF07CisgICAgTXRwT2JqZWN0Rm9ybWF0IGZvcm1hdCA9IGludFZhbHVlc1sxXTsKKyAgICBNdHBPYmplY3RIYW5kbGUgcGFyZW50ID0gaW50VmFsdWVzWzJdOworICAgIGVudi0+UmVsZWFzZUludEFycmF5RWxlbWVudHMobUludEJ1ZmZlciwgaW50VmFsdWVzLCAwKTsKKworICAgIGpsb25nKiBsb25nVmFsdWVzID0gZW52LT5HZXRMb25nQXJyYXlFbGVtZW50cyhtTG9uZ0J1ZmZlciwgMCk7CisgICAgdWludDY0X3Qgc2l6ZSA9IGxvbmdWYWx1ZXNbMF07CisgICAgdWludDY0X3QgbW9kaWZpZWQgPSBsb25nVmFsdWVzWzFdOworICAgIGVudi0+UmVsZWFzZUxvbmdBcnJheUVsZW1lbnRzKG1Mb25nQnVmZmVyLCBsb25nVmFsdWVzLCAwKTsKKworICAgIGludCBhc3NvY2lhdGlvblR5cGUgPSAoZm9ybWF0ID09IE1UUF9GT1JNQVRfQVNTT0NJQVRJT04gPworICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1UUF9BU1NPQ0lBVElPTl9UWVBFX0dFTkVSSUNfRk9MREVSIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVFBfQVNTT0NJQVRJT05fVFlQRV9VTkRFRklORUQpOworCisgICAgcGFja2V0LnB1dFVJbnQzMihzdG9yYWdlSUQpOworICAgIHBhY2tldC5wdXRVSW50MTYoZm9ybWF0KTsKKyAgICBwYWNrZXQucHV0VUludDE2KDApOyAgIC8vIHByb3RlY3Rpb24gc3RhdHVzCisgICAgcGFja2V0LnB1dFVJbnQzMigoc2l6ZSA+IDB4RkZGRkZGRkZMTCA/IDB4RkZGRkZGRkYgOiBzaXplKSk7CisgICAgcGFja2V0LnB1dFVJbnQxNigwKTsgICAvLyB0aHVtYiBmb3JtYXQKKyAgICBwYWNrZXQucHV0VUludDMyKDApOyAgIC8vIHRodW1iIGNvbXByZXNzZWQgc2l6ZQorICAgIHBhY2tldC5wdXRVSW50MzIoMCk7ICAgLy8gdGh1bWIgcGl4IHdpZHRoCisgICAgcGFja2V0LnB1dFVJbnQzMigwKTsgICAvLyB0aHVtYiBwaXggaGVpZ2h0CisgICAgcGFja2V0LnB1dFVJbnQzMigwKTsgICAvLyBpbWFnZSBwaXggd2lkdGgKKyAgICBwYWNrZXQucHV0VUludDMyKDApOyAgIC8vIGltYWdlIHBpeCBoZWlnaHQKKyAgICBwYWNrZXQucHV0VUludDMyKDApOyAgIC8vIGltYWdlIGJpdCBkZXB0aAorICAgIHBhY2tldC5wdXRVSW50MzIocGFyZW50KTsKKyAgICBwYWNrZXQucHV0VUludDE2KGFzc29jaWF0aW9uVHlwZSk7CisgICAgcGFja2V0LnB1dFVJbnQzMigwKTsgICAvLyBhc3NvY2lhdGlvbiBkZXNjCisgICAgcGFja2V0LnB1dFVJbnQzMigwKTsgICAvLyBzZXF1ZW5jZSBudW1iZXIKKworICAgIGpjaGFyKiBzdHIgPSBlbnYtPkdldENoYXJBcnJheUVsZW1lbnRzKG1TdHJpbmdCdWZmZXIsIDApOworICAgIHBhY2tldC5wdXRTdHJpbmcoc3RyKTsgICAvLyBmaWxlIG5hbWUKKyAgICBlbnYtPlJlbGVhc2VDaGFyQXJyYXlFbGVtZW50cyhtU3RyaW5nQnVmZmVyLCBzdHIsIDApOworCisgICAgcGFja2V0LnB1dEVtcHR5U3RyaW5nKCk7CisgICAgZm9ybWF0RGF0ZVRpbWUobW9kaWZpZWQsIGRhdGUsIHNpemVvZihkYXRlKSk7CisgICAgcGFja2V0LnB1dFN0cmluZyhkYXRlKTsgICAvLyBkYXRlIG1vZGlmaWVkCisgICAgcGFja2V0LnB1dEVtcHR5U3RyaW5nKCk7ICAgLy8ga2V5d29yZHMKKworICAgIGNoZWNrQW5kQ2xlYXJFeGNlcHRpb25Gcm9tQ2FsbGJhY2soZW52LCBfX0ZVTkNUSU9OX18pOworICAgIHJldHVybiBNVFBfUkVTUE9OU0VfT0s7Cit9CisKK010cFJlc3BvbnNlQ29kZSBNeU10cERhdGFiYXNlOjpnZXRPYmplY3RGaWxlUGF0aChNdHBPYmplY3RIYW5kbGUgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBTdHJpbmcmIGZpbGVQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90JiBmaWxlTGVuZ3RoKSB7CisgICAgSk5JRW52KiBlbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgamludCByZXN1bHQgPSBlbnYtPkNhbGxJbnRNZXRob2QobURhdGFiYXNlLCBtZXRob2RfZ2V0T2JqZWN0RmlsZVBhdGgsCisgICAgICAgICAgICAgICAgKGppbnQpaGFuZGxlLCBtU3RyaW5nQnVmZmVyLCBtTG9uZ0J1ZmZlcik7CisgICAgaWYgKHJlc3VsdCAhPSBNVFBfUkVTUE9OU0VfT0spCisgICAgICAgIHJldHVybiByZXN1bHQ7CisKKyAgICBqY2hhciogc3RyID0gZW52LT5HZXRDaGFyQXJyYXlFbGVtZW50cyhtU3RyaW5nQnVmZmVyLCAwKTsKKyAgICBmaWxlUGF0aC5zZXRUbyhzdHIsIHN0cmxlbjE2KHN0cikpOworICAgIGVudi0+UmVsZWFzZUNoYXJBcnJheUVsZW1lbnRzKG1TdHJpbmdCdWZmZXIsIHN0ciwgMCk7CisKKyAgICBqbG9uZyogbG9uZ1ZhbHVlcyA9IGVudi0+R2V0TG9uZ0FycmF5RWxlbWVudHMobUxvbmdCdWZmZXIsIDApOworICAgIGZpbGVMZW5ndGggPSBsb25nVmFsdWVzWzBdOworICAgIGVudi0+UmVsZWFzZUxvbmdBcnJheUVsZW1lbnRzKG1Mb25nQnVmZmVyLCBsb25nVmFsdWVzLCAwKTsKKyAgICAKKyAgICBjaGVja0FuZENsZWFyRXhjZXB0aW9uRnJvbUNhbGxiYWNrKGVudiwgX19GVU5DVElPTl9fKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitNdHBSZXNwb25zZUNvZGUgTXlNdHBEYXRhYmFzZTo6ZGVsZXRlRmlsZShNdHBPYmplY3RIYW5kbGUgaGFuZGxlKSB7CisgICAgSk5JRW52KiBlbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgTXRwUmVzcG9uc2VDb2RlIHJlc3VsdCA9IGVudi0+Q2FsbEludE1ldGhvZChtRGF0YWJhc2UsIG1ldGhvZF9kZWxldGVGaWxlLCAoamludCloYW5kbGUpOworCisgICAgY2hlY2tBbmRDbGVhckV4Y2VwdGlvbkZyb21DYWxsYmFjayhlbnYsIF9fRlVOQ1RJT05fXyk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RydWN0IFByb3BlcnR5VGFibGVFbnRyeSB7CisgICAgTXRwT2JqZWN0UHJvcGVydHkgICBwcm9wZXJ0eTsKKyAgICBpbnQgICAgICAgICAgICAgICAgIHR5cGU7Cit9OworCitzdGF0aWMgY29uc3QgUHJvcGVydHlUYWJsZUVudHJ5ICAga1Byb3BlcnR5VGFibGVbXSA9IHsKKyAgICB7ICAgTVRQX1BST1BFUlRZX1BBUkVOVF9PQkpFQ1QsICAgICBNVFBfVFlQRV9VSU5UMzIgfSwKKyAgICB7ICAgTVRQX1BST1BFUlRZX1NUT1JBR0VfSUQsICAgICAgICBNVFBfVFlQRV9VSU5UMzIgfSwKKyAgICB7ICAgTVRQX1BST1BFUlRZX09CSkVDVF9GT1JNQVQsICAgICBNVFBfVFlQRV9VSU5UMTYgfSwKKyAgICB7ICAgTVRQX1BST1BFUlRZX09CSkVDVF9GSUxFX05BTUUsICBNVFBfVFlQRV9TVFIgICAgfSwKKyAgICB7ICAgTVRQX1BST1BFUlRZX09CSkVDVF9TSVpFLCAgICAgICBNVFBfVFlQRV9VSU5UNjQgfSwKKyAgICB7ICAgTVRQX1BST1BFUlRZX0RBVEVfTU9ESUZJRUQsICAgICBNVFBfVFlQRV9TVFIgICAgfSwKK307CisKK2Jvb2wgTXlNdHBEYXRhYmFzZTo6Z2V0UHJvcGVydHlJbmZvKE10cE9iamVjdFByb3BlcnR5IHByb3BlcnR5LCBpbnQmIHR5cGUpIHsKKyAgICBpbnQgY291bnQgPSBzaXplb2Yoa1Byb3BlcnR5VGFibGUpIC8gc2l6ZW9mKGtQcm9wZXJ0eVRhYmxlWzBdKTsKKyAgICBjb25zdCBQcm9wZXJ0eVRhYmxlRW50cnkqIGVudHJ5ID0ga1Byb3BlcnR5VGFibGU7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrLCBlbnRyeSsrKSB7CisgICAgICAgIGlmIChlbnRyeS0+cHJvcGVydHkgPT0gcHJvcGVydHkpIHsKKyAgICAgICAgICAgIHR5cGUgPSBlbnRyeS0+dHlwZTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworTXRwT2JqZWN0SGFuZGxlTGlzdCogTXlNdHBEYXRhYmFzZTo6Z2V0T2JqZWN0UmVmZXJlbmNlcyhNdHBPYmplY3RIYW5kbGUgaGFuZGxlKSB7CisgICAgSk5JRW52KiBlbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgamludEFycmF5IGFycmF5ID0gKGppbnRBcnJheSllbnYtPkNhbGxPYmplY3RNZXRob2QobURhdGFiYXNlLCBtZXRob2RfZ2V0T2JqZWN0UmVmZXJlbmNlcywKKyAgICAgICAgICAgICAgICAoamludCloYW5kbGUpOworICAgIGlmICghYXJyYXkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIE10cE9iamVjdEhhbmRsZUxpc3QqIGxpc3QgPSBuZXcgTXRwT2JqZWN0SGFuZGxlTGlzdCgpOworICAgIGppbnQqIGhhbmRsZXMgPSBlbnYtPkdldEludEFycmF5RWxlbWVudHMoYXJyYXksIDApOworICAgIGpzaXplIGxlbmd0aCA9IGVudi0+R2V0QXJyYXlMZW5ndGgoYXJyYXkpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCisgICAgICAgIGxpc3QtPnB1c2goaGFuZGxlc1tpXSk7CisgICAgZW52LT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhhcnJheSwgaGFuZGxlcywgMCk7CisKKyAgICBjaGVja0FuZENsZWFyRXhjZXB0aW9uRnJvbUNhbGxiYWNrKGVudiwgX19GVU5DVElPTl9fKTsKKyAgICByZXR1cm4gbGlzdDsKK30KKworTXRwUmVzcG9uc2VDb2RlIE15TXRwRGF0YWJhc2U6OnNldE9iamVjdFJlZmVyZW5jZXMoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RIYW5kbGVMaXN0KiByZWZlcmVuY2VzKSB7CisgICAgSk5JRW52KiBlbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgaW50IGNvdW50ID0gcmVmZXJlbmNlcy0+c2l6ZSgpOworICAgIGppbnRBcnJheSBhcnJheSA9IGVudi0+TmV3SW50QXJyYXkoY291bnQpOworICAgIGlmICghYXJyYXkpIHsKKyAgICAgICAgTE9HRSgib3V0IG9mIG1lbW9yeSBpbiBzZXRPYmplY3RSZWZlcmVuY2VzIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgamludCogaGFuZGxlcyA9IGVudi0+R2V0SW50QXJyYXlFbGVtZW50cyhhcnJheSwgMCk7CisgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKyAgICAgICAgaGFuZGxlc1tpXSA9ICgqcmVmZXJlbmNlcylbaV07CisgICAgZW52LT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhhcnJheSwgaGFuZGxlcywgMCk7CisgICAgTXRwUmVzcG9uc2VDb2RlIHJlc3VsdCA9IGVudi0+Q2FsbEludE1ldGhvZChtRGF0YWJhc2UsIG1ldGhvZF9zZXRPYmplY3RSZWZlcmVuY2VzLAorICAgICAgICAgICAgICAgIChqaW50KWhhbmRsZSwgYXJyYXkpOworCisgICAgY2hlY2tBbmRDbGVhckV4Y2VwdGlvbkZyb21DYWxsYmFjayhlbnYsIF9fRlVOQ1RJT05fXyk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworI2VuZGlmIC8vIEhBVkVfQU5EUk9JRF9PUworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkCithbmRyb2lkX21lZGlhX010cERhdGFiYXNlX3NldHVwKEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXopCit7CisjaWZkZWYgSEFWRV9BTkRST0lEX09TCisgICAgTE9HRCgic2V0dXBcbiIpOworICAgIE15TXRwRGF0YWJhc2UqIGRhdGFiYXNlID0gbmV3IE15TXRwRGF0YWJhc2UoZW52LCB0aGl6KTsKKyAgICBlbnYtPlNldEludEZpZWxkKHRoaXosIGZpZWxkX2NvbnRleHQsIChpbnQpZGF0YWJhc2UpOworICAgIGNoZWNrQW5kQ2xlYXJFeGNlcHRpb25Gcm9tQ2FsbGJhY2soZW52LCBfX0ZVTkNUSU9OX18pOworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkCithbmRyb2lkX21lZGlhX010cERhdGFiYXNlX2ZpbmFsaXplKEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXopCit7CisjaWZkZWYgSEFWRV9BTkRST0lEX09TCisgICAgTE9HRCgiZmluYWxpemVcbiIpOworICAgIE15TXRwRGF0YWJhc2UqIGRhdGFiYXNlID0gKE15TXRwRGF0YWJhc2UgKillbnYtPkdldEludEZpZWxkKHRoaXosIGZpZWxkX2NvbnRleHQpOworICAgIGRhdGFiYXNlLT5jbGVhbnVwKGVudik7CisgICAgZGVsZXRlIGRhdGFiYXNlOworICAgIGVudi0+U2V0SW50RmllbGQodGhpeiwgZmllbGRfY29udGV4dCwgMCk7CisgICAgY2hlY2tBbmRDbGVhckV4Y2VwdGlvbkZyb21DYWxsYmFjayhlbnYsIF9fRlVOQ1RJT05fXyk7CisjZW5kaWYKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgSk5JTmF0aXZlTWV0aG9kIGdNZXRob2RzW10gPSB7CisgICAgeyJuYXRpdmVfc2V0dXAiLCAgICAgICAgICAgICIoKVYiLCAgKHZvaWQgKilhbmRyb2lkX21lZGlhX010cERhdGFiYXNlX3NldHVwfSwKKyAgICB7Im5hdGl2ZV9maW5hbGl6ZSIsICAgICAgICAgIigpViIsICAodm9pZCAqKWFuZHJvaWRfbWVkaWFfTXRwRGF0YWJhc2VfZmluYWxpemV9LAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIqIGNvbnN0IGtDbGFzc1BhdGhOYW1lID0gImFuZHJvaWQvbWVkaWEvTXRwRGF0YWJhc2UiOworCitpbnQgcmVnaXN0ZXJfYW5kcm9pZF9tZWRpYV9NdHBEYXRhYmFzZShKTklFbnYgKmVudikKK3sKKyAgICBqY2xhc3MgY2xheno7CisKKyAgICBMT0dEKCJyZWdpc3Rlcl9hbmRyb2lkX21lZGlhX010cERhdGFiYXNlXG4iKTsKKworICAgIGNsYXp6ID0gZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvbWVkaWEvTXRwRGF0YWJhc2UiKTsKKyAgICBpZiAoY2xhenogPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJDYW4ndCBmaW5kIGFuZHJvaWQvbWVkaWEvTXRwRGF0YWJhc2UiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBtZXRob2RfYmVnaW5TZW5kT2JqZWN0ID0gZW52LT5HZXRNZXRob2RJRChjbGF6eiwgImJlZ2luU2VuZE9iamVjdCIsICIoTGphdmEvbGFuZy9TdHJpbmc7SUlJSkopSSIpOworICAgIGlmIChtZXRob2RfYmVnaW5TZW5kT2JqZWN0ID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiQ2FuJ3QgZmluZCBiZWdpblNlbmRPYmplY3QiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBtZXRob2RfZW5kU2VuZE9iamVjdCA9IGVudi0+R2V0TWV0aG9kSUQoY2xhenosICJlbmRTZW5kT2JqZWN0IiwgIihMamF2YS9sYW5nL1N0cmluZztJSVopViIpOworICAgIGlmIChtZXRob2RfZW5kU2VuZE9iamVjdCA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIkNhbid0IGZpbmQgZW5kU2VuZE9iamVjdCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIG1ldGhvZF9nZXRPYmplY3RMaXN0ID0gZW52LT5HZXRNZXRob2RJRChjbGF6eiwgImdldE9iamVjdExpc3QiLCAiKElJSSlbSSIpOworICAgIGlmIChtZXRob2RfZ2V0T2JqZWN0TGlzdCA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIkNhbid0IGZpbmQgZ2V0T2JqZWN0TGlzdCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIG1ldGhvZF9nZXROdW1PYmplY3RzID0gZW52LT5HZXRNZXRob2RJRChjbGF6eiwgImdldE51bU9iamVjdHMiLCAiKElJSSlJIik7CisgICAgaWYgKG1ldGhvZF9nZXROdW1PYmplY3RzID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiQ2FuJ3QgZmluZCBnZXROdW1PYmplY3RzIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgbWV0aG9kX2dldFN1cHBvcnRlZFBsYXliYWNrRm9ybWF0cyA9IGVudi0+R2V0TWV0aG9kSUQoY2xhenosICJnZXRTdXBwb3J0ZWRQbGF5YmFja0Zvcm1hdHMiLCAiKClbSSIpOworICAgIGlmIChtZXRob2RfZ2V0U3VwcG9ydGVkUGxheWJhY2tGb3JtYXRzID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiQ2FuJ3QgZmluZCBnZXRTdXBwb3J0ZWRQbGF5YmFja0Zvcm1hdHMiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBtZXRob2RfZ2V0U3VwcG9ydGVkQ2FwdHVyZUZvcm1hdHMgPSBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCAiZ2V0U3VwcG9ydGVkQ2FwdHVyZUZvcm1hdHMiLCAiKClbSSIpOworICAgIGlmIChtZXRob2RfZ2V0U3VwcG9ydGVkQ2FwdHVyZUZvcm1hdHMgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJDYW4ndCBmaW5kIGdldFN1cHBvcnRlZENhcHR1cmVGb3JtYXRzIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgbWV0aG9kX2dldFN1cHBvcnRlZE9iamVjdFByb3BlcnRpZXMgPSBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCAiZ2V0U3VwcG9ydGVkT2JqZWN0UHJvcGVydGllcyIsICIoSSlbSSIpOworICAgIGlmIChtZXRob2RfZ2V0U3VwcG9ydGVkT2JqZWN0UHJvcGVydGllcyA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIkNhbid0IGZpbmQgZ2V0U3VwcG9ydGVkT2JqZWN0UHJvcGVydGllcyIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIG1ldGhvZF9nZXRTdXBwb3J0ZWREZXZpY2VQcm9wZXJ0aWVzID0gZW52LT5HZXRNZXRob2RJRChjbGF6eiwgImdldFN1cHBvcnRlZERldmljZVByb3BlcnRpZXMiLCAiKClbSSIpOworICAgIGlmIChtZXRob2RfZ2V0U3VwcG9ydGVkRGV2aWNlUHJvcGVydGllcyA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIkNhbid0IGZpbmQgZ2V0U3VwcG9ydGVkRGV2aWNlUHJvcGVydGllcyIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIG1ldGhvZF9nZXRPYmplY3RQcm9wZXJ0eSA9IGVudi0+R2V0TWV0aG9kSUQoY2xhenosICJnZXRPYmplY3RQcm9wZXJ0eSIsICIoSUlbSltDKUkiKTsKKyAgICBpZiAobWV0aG9kX2dldE9iamVjdFByb3BlcnR5ID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiQ2FuJ3QgZmluZCBnZXRPYmplY3RQcm9wZXJ0eSIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIG1ldGhvZF9nZXRPYmplY3RJbmZvID0gZW52LT5HZXRNZXRob2RJRChjbGF6eiwgImdldE9iamVjdEluZm8iLCAiKElbSVtDW0opWiIpOworICAgIGlmIChtZXRob2RfZ2V0T2JqZWN0SW5mbyA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIkNhbid0IGZpbmQgZ2V0T2JqZWN0SW5mbyIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIG1ldGhvZF9nZXRPYmplY3RGaWxlUGF0aCA9IGVudi0+R2V0TWV0aG9kSUQoY2xhenosICJnZXRPYmplY3RGaWxlUGF0aCIsICIoSVtDW0opSSIpOworICAgIGlmIChtZXRob2RfZ2V0T2JqZWN0RmlsZVBhdGggPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJDYW4ndCBmaW5kIGdldE9iamVjdEZpbGVQYXRoIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgbWV0aG9kX2RlbGV0ZUZpbGUgPSBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCAiZGVsZXRlRmlsZSIsICIoSSlJIik7CisgICAgaWYgKG1ldGhvZF9kZWxldGVGaWxlID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiQ2FuJ3QgZmluZCBkZWxldGVGaWxlIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgbWV0aG9kX2dldE9iamVjdFJlZmVyZW5jZXMgPSBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCAiZ2V0T2JqZWN0UmVmZXJlbmNlcyIsICIoSSlbSSIpOworICAgIGlmIChtZXRob2RfZ2V0T2JqZWN0UmVmZXJlbmNlcyA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIkNhbid0IGZpbmQgZ2V0T2JqZWN0UmVmZXJlbmNlcyIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIG1ldGhvZF9zZXRPYmplY3RSZWZlcmVuY2VzID0gZW52LT5HZXRNZXRob2RJRChjbGF6eiwgInNldE9iamVjdFJlZmVyZW5jZXMiLCAiKElbSSlJIik7CisgICAgaWYgKG1ldGhvZF9zZXRPYmplY3RSZWZlcmVuY2VzID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiQ2FuJ3QgZmluZCBzZXRPYmplY3RSZWZlcmVuY2VzIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgZmllbGRfY29udGV4dCA9IGVudi0+R2V0RmllbGRJRChjbGF6eiwgIm1OYXRpdmVDb250ZXh0IiwgIkkiKTsKKyAgICBpZiAoZmllbGRfY29udGV4dCA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIkNhbid0IGZpbmQgTXRwRGF0YWJhc2UubU5hdGl2ZUNvbnRleHQiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHJldHVybiBBbmRyb2lkUnVudGltZTo6cmVnaXN0ZXJOYXRpdmVNZXRob2RzKGVudiwKKyAgICAgICAgICAgICAgICAiYW5kcm9pZC9tZWRpYS9NdHBEYXRhYmFzZSIsIGdNZXRob2RzLCBORUxFTShnTWV0aG9kcykpOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvam5pL2FuZHJvaWRfbWVkaWFfTXRwU2VydmVyLmNwcCBiL21lZGlhL2puaS9hbmRyb2lkX21lZGlhX010cFNlcnZlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzMwNTEzNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2puaS9hbmRyb2lkX21lZGlhX010cFNlcnZlci5jcHAKQEAgLTAsMCArMSwyMjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIk10cFNlcnZlckpOSSIKKyNpbmNsdWRlICJ1dGlscy9Mb2cuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CisKKyNpbmNsdWRlICJqbmkuaCIKKyNpbmNsdWRlICJKTklIZWxwLmgiCisjaW5jbHVkZSAiYW5kcm9pZF9ydW50aW1lL0FuZHJvaWRSdW50aW1lLmgiCisjaW5jbHVkZSAicHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmgiCisKKyNpbmNsdWRlICJNdHBTZXJ2ZXIuaCIKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIGpmaWVsZElEIGZpZWxkX2NvbnRleHQ7CitzdGF0aWMgTXV0ZXggICAgc011dGV4OworCisvLyBpbiBhbmRyb2lkX21lZGlhX010cERhdGFiYXNlLmNwcAorZXh0ZXJuIE10cERhdGFiYXNlKiBnZXRNdHBEYXRhYmFzZShKTklFbnYgKmVudiwgam9iamVjdCBkYXRhYmFzZSk7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmZGVmIEhBVkVfQU5EUk9JRF9PUworCitzdGF0aWMgYm9vbCBFeGNlcHRpb25DaGVjayh2b2lkKiBlbnYpCit7CisgICAgcmV0dXJuICgoSk5JRW52ICopZW52KS0+RXhjZXB0aW9uQ2hlY2soKTsKK30KKworY2xhc3MgTXRwVGhyZWFkIDogcHVibGljIFRocmVhZCB7Citwcml2YXRlOgorICAgIE10cERhdGFiYXNlKiAgICBtRGF0YWJhc2U7CisgICAgTXRwU2VydmVyKiAgICAgIG1TZXJ2ZXI7CisgICAgU3RyaW5nOCAgICAgICAgIG1TdG9yYWdlUGF0aDsKKyAgICBqb2JqZWN0ICAgICAgICAgbUphdmFTZXJ2ZXI7CisKK3B1YmxpYzoKKyAgICBNdHBUaHJlYWQoTXRwRGF0YWJhc2UqIGRhdGFiYXNlLCBjb25zdCBjaGFyKiBzdG9yYWdlUGF0aCwgam9iamVjdCBqYXZhU2VydmVyKQorICAgICAgICA6IG1EYXRhYmFzZShkYXRhYmFzZSksCisgICAgICAgICAgICBtU2VydmVyKE5VTEwpLAorICAgICAgICAgICAgbVN0b3JhZ2VQYXRoKHN0b3JhZ2VQYXRoKSwKKyAgICAgICAgICAgIG1KYXZhU2VydmVyKGphdmFTZXJ2ZXIpCisgICAgeworICAgIH0KKworICAgIHZpcnR1YWwgYm9vbCB0aHJlYWRMb29wKCkgeworICAgICAgICBpbnQgZmQgPSBvcGVuKCIvZGV2L210cF91c2IiLCBPX1JEV1IpOworICAgICAgICBwcmludGYoIm9wZW4gcmV0dXJuZWQgJWRcbiIsIGZkKTsKKyAgICAgICAgaWYgKGZkIDwgMCkgeworICAgICAgICAgICAgTE9HRSgiY291bGQgbm90IG9wZW4gTVRQIGRyaXZlclxuIik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBzTXV0ZXgubG9jaygpOworICAgICAgICBtU2VydmVyID0gbmV3IE10cFNlcnZlcihmZCwgbURhdGFiYXNlLCBBSURfU0RDQVJEX1JXLCAwNjY0LCAwNzc1KTsKKyAgICAgICAgbVNlcnZlci0+YWRkU3RvcmFnZShtU3RvcmFnZVBhdGgpOworICAgICAgICBzTXV0ZXgudW5sb2NrKCk7CisKKyAgICAgICAgTE9HRCgiTXRwVGhyZWFkIG1TZXJ2ZXItPnJ1biIpOworICAgICAgICBtU2VydmVyLT5ydW4oKTsKKyAgICAgICAgY2xvc2UoZmQpOworCisgICAgICAgIHNNdXRleC5sb2NrKCk7CisgICAgICAgIGRlbGV0ZSBtU2VydmVyOworICAgICAgICBtU2VydmVyID0gTlVMTDsKKworICAgICAgICBKTklFbnYqIGVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICAgICAgZW52LT5TZXRJbnRGaWVsZChtSmF2YVNlcnZlciwgZmllbGRfY29udGV4dCwgMCk7CisgICAgICAgIGVudi0+RGVsZXRlR2xvYmFsUmVmKG1KYXZhU2VydmVyKTsKKyAgICAgICAgc011dGV4LnVubG9jaygpOworCisgICAgICAgIExPR0QoInRocmVhZExvb3AgcmV0dXJuaW5nIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB2b2lkIHNlbmRPYmplY3RBZGRlZChNdHBPYmplY3RIYW5kbGUgaGFuZGxlKSB7CisgICAgICAgIHNNdXRleC5sb2NrKCk7CisgICAgICAgIGlmIChtU2VydmVyKQorICAgICAgICAgICAgbVNlcnZlci0+c2VuZE9iamVjdEFkZGVkKGhhbmRsZSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIExPR0UoInNlbmRPYmplY3RBZGRlZCBjYWxsZWQgd2hpbGUgZGlzY29ubmVjdGVkXG4iKTsKKyAgICAgICAgc011dGV4LnVubG9jaygpOworICAgIH0KKworICAgIHZvaWQgc2VuZE9iamVjdFJlbW92ZWQoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSkgeworICAgICAgICBzTXV0ZXgubG9jaygpOworICAgICAgICBpZiAobVNlcnZlcikKKyAgICAgICAgICAgIG1TZXJ2ZXItPnNlbmRPYmplY3RSZW1vdmVkKGhhbmRsZSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIExPR0UoInNlbmRPYmplY3RSZW1vdmVkIGNhbGxlZCB3aGlsZSBkaXNjb25uZWN0ZWRcbiIpOworICAgICAgICBzTXV0ZXgudW5sb2NrKCk7CisgICAgfQorfTsKKworI2VuZGlmIC8vIEhBVkVfQU5EUk9JRF9PUworCitzdGF0aWMgdm9pZAorYW5kcm9pZF9tZWRpYV9NdHBTZXJ2ZXJfc2V0dXAoSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeiwgam9iamVjdCBqYXZhRGF0YWJhc2UsIGpzdHJpbmcgc3RvcmFnZVBhdGgpCit7CisjaWZkZWYgSEFWRV9BTkRST0lEX09TCisgICAgTE9HRCgic2V0dXBcbiIpOworCisgICAgTXRwRGF0YWJhc2UqIGRhdGFiYXNlID0gZ2V0TXRwRGF0YWJhc2UoZW52LCBqYXZhRGF0YWJhc2UpOworICAgIGNvbnN0IGNoYXIgKnN0b3JhZ2VQYXRoU3RyID0gZW52LT5HZXRTdHJpbmdVVEZDaGFycyhzdG9yYWdlUGF0aCwgTlVMTCk7CisKKyAgICBNdHBUaHJlYWQqIHRocmVhZCA9IG5ldyBNdHBUaHJlYWQoZGF0YWJhc2UsIHN0b3JhZ2VQYXRoU3RyLCBlbnYtPk5ld0dsb2JhbFJlZih0aGl6KSk7CisgICAgZW52LT5TZXRJbnRGaWVsZCh0aGl6LCBmaWVsZF9jb250ZXh0LCAoaW50KXRocmVhZCk7CisKKyAgICBlbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhzdG9yYWdlUGF0aCwgc3RvcmFnZVBhdGhTdHIpOworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkCithbmRyb2lkX21lZGlhX010cFNlcnZlcl9maW5hbGl6ZShKTklFbnYgKmVudiwgam9iamVjdCB0aGl6KQoreworICAgIExPR0QoImZpbmFsaXplXG4iKTsKK30KKworCitzdGF0aWMgdm9pZAorYW5kcm9pZF9tZWRpYV9NdHBTZXJ2ZXJfc3RhcnQoSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeikKK3sKKyNpZmRlZiBIQVZFX0FORFJPSURfT1MKKyAgICBMT0dEKCJzdGFydFxuIik7CisgICAgTXRwVGhyZWFkICp0aHJlYWQgPSAoTXRwVGhyZWFkICopZW52LT5HZXRJbnRGaWVsZCh0aGl6LCBmaWVsZF9jb250ZXh0KTsKKyAgICB0aHJlYWQtPnJ1bigiTXRwVGhyZWFkIik7CisjZW5kaWYgLy8gSEFWRV9BTkRST0lEX09TCit9CisKK3N0YXRpYyB2b2lkCithbmRyb2lkX21lZGlhX010cFNlcnZlcl9zdG9wKEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXopCit7CisjaWZkZWYgSEFWRV9BTkRST0lEX09TCisgICAgTE9HRCgic3RvcFxuIik7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQKK2FuZHJvaWRfbWVkaWFfTXRwU2VydmVyX3NlbmRfb2JqZWN0X2FkZGVkKEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXosIGppbnQgaGFuZGxlKQoreworI2lmZGVmIEhBVkVfQU5EUk9JRF9PUworICAgIExPR0QoInNlbmRfb2JqZWN0X2FkZGVkICVkXG4iLCBoYW5kbGUpOworICAgIE10cFRocmVhZCAqdGhyZWFkID0gKE10cFRocmVhZCAqKWVudi0+R2V0SW50RmllbGQodGhpeiwgZmllbGRfY29udGV4dCk7CisgICAgaWYgKHRocmVhZCkKKyAgICAgICAgdGhyZWFkLT5zZW5kT2JqZWN0QWRkZWQoaGFuZGxlKTsKKyAgICBlbHNlCisgICAgICAgIExPR0UoInNlbmRPYmplY3RBZGRlZCBjYWxsZWQgd2hpbGUgZGlzY29ubmVjdGVkXG4iKTsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZAorYW5kcm9pZF9tZWRpYV9NdHBTZXJ2ZXJfc2VuZF9vYmplY3RfcmVtb3ZlZChKTklFbnYgKmVudiwgam9iamVjdCB0aGl6LCBqaW50IGhhbmRsZSkKK3sKKyNpZmRlZiBIQVZFX0FORFJPSURfT1MKKyAgICBMT0dEKCJzZW5kX29iamVjdF9yZW1vdmVkICVkXG4iLCBoYW5kbGUpOworICAgIE10cFRocmVhZCAqdGhyZWFkID0gKE10cFRocmVhZCAqKWVudi0+R2V0SW50RmllbGQodGhpeiwgZmllbGRfY29udGV4dCk7CisgICAgaWYgKHRocmVhZCkKKyAgICAgICAgdGhyZWFkLT5zZW5kT2JqZWN0UmVtb3ZlZChoYW5kbGUpOworICAgIGVsc2UKKyAgICAgICAgTE9HRSgic2VuZE9iamVjdFJlbW92ZWQgY2FsbGVkIHdoaWxlIGRpc2Nvbm5lY3RlZFxuIik7CisjZW5kaWYKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgSk5JTmF0aXZlTWV0aG9kIGdNZXRob2RzW10gPSB7CisgICAgeyJuYXRpdmVfc2V0dXAiLCAgICAgICAgICAgICAgICAiKExhbmRyb2lkL21lZGlhL010cERhdGFiYXNlO0xqYXZhL2xhbmcvU3RyaW5nOylWIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilhbmRyb2lkX21lZGlhX010cFNlcnZlcl9zZXR1cH0sCisgICAgeyJuYXRpdmVfZmluYWxpemUiLCAgICAgICAgICAgICAiKClWIiwgICh2b2lkICopYW5kcm9pZF9tZWRpYV9NdHBTZXJ2ZXJfZmluYWxpemV9LAorICAgIHsibmF0aXZlX3N0YXJ0IiwgICAgICAgICAgICAgICAgIigpViIsICAodm9pZCAqKWFuZHJvaWRfbWVkaWFfTXRwU2VydmVyX3N0YXJ0fSwKKyAgICB7Im5hdGl2ZV9zdG9wIiwgICAgICAgICAgICAgICAgICIoKVYiLCAgKHZvaWQgKilhbmRyb2lkX21lZGlhX010cFNlcnZlcl9zdG9wfSwKKyAgICB7Im5hdGl2ZV9zZW5kX29iamVjdF9hZGRlZCIsICAgICIoSSlWIiwgKHZvaWQgKilhbmRyb2lkX21lZGlhX010cFNlcnZlcl9zZW5kX29iamVjdF9hZGRlZH0sCisgICAgeyJuYXRpdmVfc2VuZF9vYmplY3RfcmVtb3ZlZCIsICAiKEkpViIsICh2b2lkICopYW5kcm9pZF9tZWRpYV9NdHBTZXJ2ZXJfc2VuZF9vYmplY3RfcmVtb3ZlZH0sCit9OworCitzdGF0aWMgY29uc3QgY2hhciogY29uc3Qga0NsYXNzUGF0aE5hbWUgPSAiYW5kcm9pZC9tZWRpYS9NdHBTZXJ2ZXIiOworCitpbnQgcmVnaXN0ZXJfYW5kcm9pZF9tZWRpYV9NdHBTZXJ2ZXIoSk5JRW52ICplbnYpCit7CisgICAgamNsYXNzIGNsYXp6OworCisgICAgTE9HRCgicmVnaXN0ZXJfYW5kcm9pZF9tZWRpYV9NdHBTZXJ2ZXJcbiIpOworCisgICAgY2xhenogPSBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9tZWRpYS9NdHBTZXJ2ZXIiKTsKKyAgICBpZiAoY2xhenogPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJDYW4ndCBmaW5kIGFuZHJvaWQvbWVkaWEvTXRwU2VydmVyIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgZmllbGRfY29udGV4dCA9IGVudi0+R2V0RmllbGRJRChjbGF6eiwgIm1OYXRpdmVDb250ZXh0IiwgIkkiKTsKKyAgICBpZiAoZmllbGRfY29udGV4dCA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIkNhbid0IGZpbmQgTXRwU2VydmVyLm1OYXRpdmVDb250ZXh0Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICByZXR1cm4gQW5kcm9pZFJ1bnRpbWU6OnJlZ2lzdGVyTmF0aXZlTWV0aG9kcyhlbnYsCisgICAgICAgICAgICAgICAgImFuZHJvaWQvbWVkaWEvTXRwU2VydmVyIiwgZ01ldGhvZHMsIE5FTEVNKGdNZXRob2RzKSk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL3Zpc3VhbGl6ZXIvQW5kcm9pZC5tayBiL21lZGlhL2xpYmVmZmVjdHMvdmlzdWFsaXplci9BbmRyb2lkLm1rCmluZGV4IDQ4YjQ1ZmYuLmU2ZmY2NTQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvdmlzdWFsaXplci9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvdmlzdWFsaXplci9BbmRyb2lkLm1rCkBAIC0yNyw0ICsyNyw0IEBACiAKIExPQ0FMX1BSRUxJTktfTU9EVUxFIDo9IGZhbHNlCiAKLWluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9BdWRpb1N5c3RlbS5jcHAgYi9tZWRpYS9saWJtZWRpYS9BdWRpb1N5c3RlbS5jcHAKaW5kZXggN2UzYjc0My4uOWMyYThiYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvQXVkaW9TeXN0ZW0uY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0F1ZGlvU3lzdGVtLmNwcApAQCAtNzYzLDcgKzc2Myw4IEBACiAgICAgaWYgKChwb3BDb3VudChkZXZpY2UpID09IDEgKSAmJgogICAgICAgICAoZGV2aWNlICYgKEF1ZGlvU3lzdGVtOjpERVZJQ0VfT1VUX0JMVUVUT09USF9TQ08gfAogICAgICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpERVZJQ0VfT1VUX0JMVUVUT09USF9TQ09fSEVBRFNFVCB8Ci0gICAgICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OkRFVklDRV9PVVRfQkxVRVRPT1RIX1NDT19DQVJLSVQpKSkgeworICAgICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpERVZJQ0VfT1VUX0JMVUVUT09USF9TQ09fQ0FSS0lUIHwKKyAgICAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6REVWSUNFX0lOX0JMVUVUT09USF9TQ09fSEVBRFNFVCkpKSB7CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0gZWxzZSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYVBsYXllci5jcHAgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFQbGF5ZXIuY3BwCmluZGV4IDBmNTViMTlkLi45ZGZkY2IwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFQbGF5ZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYVBsYXllci5jcHAKQEAgLTIyLDEyICsyMiwxNCBAQAogCiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhUGxheWVyLmg+CiAjaW5jbHVkZSA8c3VyZmFjZWZsaW5nZXIvSVN1cmZhY2UuaD4KKyNpbmNsdWRlIDxzdXJmYWNlZmxpbmdlci9TdXJmYWNlLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogZW51bSB7CiAgICAgRElTQ09OTkVDVCA9IElCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04sCiAgICAgU0VUX1ZJREVPX1NVUkZBQ0UsCisgICAgU0VUX1ZJREVPX0lTVVJGQUNFLAogICAgIFBSRVBBUkVfQVNZTkMsCiAgICAgU1RBUlQsCiAgICAgU1RPUCwKQEAgLTY1LDExICs2NywyMCBAQAogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoRElTQ09OTkVDVCwgZGF0YSwgJnJlcGx5KTsKICAgICB9CiAKLSAgICBzdGF0dXNfdCBzZXRWaWRlb1N1cmZhY2UoY29uc3Qgc3A8SVN1cmZhY2U+JiBzdXJmYWNlKQorICAgIHN0YXR1c190IHNldFZpZGVvSVN1cmZhY2UoY29uc3Qgc3A8SVN1cmZhY2U+JiBzdXJmYWNlKQogICAgIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU1lZGlhUGxheWVyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwogICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKHN1cmZhY2UtPmFzQmluZGVyKCkpOworICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX1ZJREVPX0lTVVJGQUNFLCBkYXRhLCAmcmVwbHkpOworICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CisgICAgfQorCisgICAgc3RhdHVzX3Qgc2V0VmlkZW9TdXJmYWNlKGNvbnN0IHNwPFN1cmZhY2U+JiBzdXJmYWNlKQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU1lZGlhUGxheWVyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBTdXJmYWNlOjp3cml0ZVRvUGFyY2VsKHN1cmZhY2UsICZkYXRhKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFNFVF9WSURFT19TVVJGQUNFLCBkYXRhLCAmcmVwbHkpOwogICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CiAgICAgfQpAQCAtMjU2LDkgKzI2NywxNSBAQAogICAgICAgICAgICAgZGlzY29ubmVjdCgpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwotICAgICAgICBjYXNlIFNFVF9WSURFT19TVVJGQUNFOiB7CisgICAgICAgIGNhc2UgU0VUX1ZJREVPX0lTVVJGQUNFOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSU1lZGlhUGxheWVyLCBkYXRhLCByZXBseSk7CiAgICAgICAgICAgICBzcDxJU3VyZmFjZT4gc3VyZmFjZSA9IGludGVyZmFjZV9jYXN0PElTdXJmYWNlPihkYXRhLnJlYWRTdHJvbmdCaW5kZXIoKSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzZXRWaWRlb0lTdXJmYWNlKHN1cmZhY2UpKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBTRVRfVklERU9fU1VSRkFDRTogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElNZWRpYVBsYXllciwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgc3A8U3VyZmFjZT4gc3VyZmFjZSA9IFN1cmZhY2U6OnJlYWRGcm9tUGFyY2VsKGRhdGEpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc2V0VmlkZW9TdXJmYWNlKHN1cmZhY2UpKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYVJlY29yZGVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYVJlY29yZGVyLmNwcAppbmRleCA5NDdmZjM0Li5mNTVhMDFlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFSZWNvcmRlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhUmVjb3JkZXIuY3BwCkBAIC0xOSw3ICsxOSw3IEBACiAjZGVmaW5lIExPR19UQUcgIklNZWRpYVJlY29yZGVyIgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KLSNpbmNsdWRlIDxzdXJmYWNlZmxpbmdlci9JU3VyZmFjZS5oPgorI2luY2x1ZGUgPHN1cmZhY2VmbGluZ2VyL1N1cmZhY2UuaD4KICNpbmNsdWRlIDxjYW1lcmEvSUNhbWVyYS5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYVJlY29yZGVyQ2xpZW50Lmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhUmVjb3JkZXIuaD4KQEAgLTY5LDEyICs2OSwxMiBAQAogICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CiAgICAgfQogCi0gICAgc3RhdHVzX3Qgc2V0UHJldmlld1N1cmZhY2UoY29uc3Qgc3A8SVN1cmZhY2U+JiBzdXJmYWNlKQorICAgIHN0YXR1c190IHNldFByZXZpZXdTdXJmYWNlKGNvbnN0IHNwPFN1cmZhY2U+JiBzdXJmYWNlKQogICAgIHsKICAgICAgICAgTE9HVigic2V0UHJldmlld1N1cmZhY2UoJXApIiwgc3VyZmFjZS5nZXQoKSk7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElNZWRpYVJlY29yZGVyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKHN1cmZhY2UtPmFzQmluZGVyKCkpOworICAgICAgICBTdXJmYWNlOjp3cml0ZVRvUGFyY2VsKHN1cmZhY2UsICZkYXRhKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFNFVF9QUkVWSUVXX1NVUkZBQ0UsIGRhdGEsICZyZXBseSk7CiAgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKICAgICB9CkBAIC00MDksNyArNDA5LDcgQEAKICAgICAgICAgY2FzZSBTRVRfUFJFVklFV19TVVJGQUNFOiB7CiAgICAgICAgICAgICBMT0dWKCJTRVRfUFJFVklFV19TVVJGQUNFIik7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSU1lZGlhUmVjb3JkZXIsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIHNwPElTdXJmYWNlPiBzdXJmYWNlID0gaW50ZXJmYWNlX2Nhc3Q8SVN1cmZhY2U+KGRhdGEucmVhZFN0cm9uZ0JpbmRlcigpKTsKKyAgICAgICAgICAgIHNwPFN1cmZhY2U+IHN1cmZhY2UgPSBTdXJmYWNlOjpyZWFkRnJvbVBhcmNlbChkYXRhKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNldFByZXZpZXdTdXJmYWNlKHN1cmZhY2UpKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL01lZGlhU2Nhbm5lci5jcHAgYi9tZWRpYS9saWJtZWRpYS9NZWRpYVNjYW5uZXIuY3BwCmluZGV4IGM1MTEyYTUuLmJhOThmMDQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL01lZGlhU2Nhbm5lci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvTWVkaWFTY2FubmVyLmNwcApAQCAtMTMzLDYgKzEzMywxMyBAQAogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KIAorICAgICAgICBpbnQgbmFtZUxlbmd0aCA9IHN0cmxlbihuYW1lKTsKKyAgICAgICAgaWYgKG5hbWVMZW5ndGggKyAxID4gcGF0aFJlbWFpbmluZykgeworICAgICAgICAgICAgLy8gcGF0aCB0b28gbG9uZyEKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHN0cmNweShmaWxlU3BvdCwgbmFtZSk7CisKICAgICAgICAgaW50IHR5cGUgPSBlbnRyeS0+ZF90eXBlOwogICAgICAgICBpZiAodHlwZSA9PSBEVF9VTktOT1dOKSB7CiAgICAgICAgICAgICAvLyBJZiB0aGUgdHlwZSBpcyB1bmtub3duLCBzdGF0KCkgdGhlIGZpbGUgaW5zdGVhZC4KQEAgLTE1MCwxNiArMTU3LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBpZiAodHlwZSA9PSBEVF9SRUcgfHwgdHlwZSA9PSBEVF9ESVIpIHsKLSAgICAgICAgICAgIGludCBuYW1lTGVuZ3RoID0gc3RybGVuKG5hbWUpOwotICAgICAgICAgICAgYm9vbCBpc0RpcmVjdG9yeSA9ICh0eXBlID09IERUX0RJUik7Ci0KLSAgICAgICAgICAgIGlmIChuYW1lTGVuZ3RoID4gcGF0aFJlbWFpbmluZyB8fCAoaXNEaXJlY3RvcnkgJiYgbmFtZUxlbmd0aCArIDEgPiBwYXRoUmVtYWluaW5nKSkgewotICAgICAgICAgICAgICAgIC8vIHBhdGggdG9vIGxvbmchCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHN0cmNweShmaWxlU3BvdCwgbmFtZSk7Ci0gICAgICAgICAgICBpZiAoaXNEaXJlY3RvcnkpIHsKKyAgICAgICAgICAgIGlmICh0eXBlID09IERUX0RJUikgewogICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBkaXJlY3RvcmllcyB3aXRoIGEgbmFtZSB0aGF0IHN0YXJ0cyB3aXRoICcuJwogICAgICAgICAgICAgICAgIC8vIGZvciBleGFtcGxlLCB0aGUgTWFjICIuVHJhc2hlcyIgZGlyZWN0b3J5CiAgICAgICAgICAgICAgICAgaWYgKG5hbWVbMF0gPT0gJy4nKSBjb250aW51ZTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL21lZGlhcGxheWVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL21lZGlhcGxheWVyLmNwcAppbmRleCBmMzIyOWMwLi4zMmIyMGM3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9tZWRpYXBsYXllci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvbWVkaWFwbGF5ZXIuY3BwCkBAIC0yMDYsMTAgKzIwNiwxNSBAQAogICAgIExPR1YoInNldFZpZGVvU3VyZmFjZSIpOwogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgaWYgKG1QbGF5ZXIgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgaWYgKHN1cmZhY2UgIT0gTlVMTCkKLSAgICAgICAgcmV0dXJuICBtUGxheWVyLT5zZXRWaWRlb1N1cmZhY2Uoc3VyZmFjZS0+Z2V0SVN1cmZhY2UoKSk7Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4gIG1QbGF5ZXItPnNldFZpZGVvU3VyZmFjZShOVUxMKTsKKworICAgIHN0YXR1c190IGVyciA9IG1QbGF5ZXItPnNldFZpZGVvSVN1cmZhY2UoCisgICAgICAgICAgICBzdXJmYWNlID09IE5VTEwgPyBOVUxMIDogc3VyZmFjZS0+Z2V0SVN1cmZhY2UoKSk7CisKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgcmV0dXJuIG1QbGF5ZXItPnNldFZpZGVvU3VyZmFjZShzdXJmYWNlKTsKIH0KIAogLy8gbXVzdCBjYWxsIHdpdGggbG9jayBoZWxkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9tZWRpYXJlY29yZGVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL21lZGlhcmVjb3JkZXIuY3BwCmluZGV4IDlkNTNjMjUuLjdmMjUzNTkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL21lZGlhcmVjb3JkZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL21lZGlhcmVjb3JkZXIuY3BwCkBAIC02NSw3ICs2NSw3IEBACiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAKLSAgICBzdGF0dXNfdCByZXQgPSBtTWVkaWFSZWNvcmRlci0+c2V0UHJldmlld1N1cmZhY2Uoc3VyZmFjZS0+Z2V0SVN1cmZhY2UoKSk7CisgICAgc3RhdHVzX3QgcmV0ID0gbU1lZGlhUmVjb3JkZXItPnNldFByZXZpZXdTdXJmYWNlKHN1cmZhY2UpOwogICAgIGlmIChPSyAhPSByZXQpIHsKICAgICAgICAgTE9HVigic2V0UHJldmlld1N1cmZhY2UgZmFpbGVkOiAlZCIsIHJldCk7CiAgICAgICAgIG1DdXJyZW50U3RhdGUgPSBNRURJQV9SRUNPUkRFUl9FUlJPUjsKQEAgLTY0Myw0ICs2NDMsMyBAQAogfQogCiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJTZXJ2aWNlLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllclNlcnZpY2UuY3BwCmluZGV4IGI1OTcyZTcuLmQ5YjBjNjkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllclNlcnZpY2UuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllclNlcnZpY2UuY3BwCkBAIC04ODksNyArODg5LDE1IEBACiAgICAgcmV0dXJuIG1TdGF0dXM7CiB9CiAKLXN0YXR1c190IE1lZGlhUGxheWVyU2VydmljZTo6Q2xpZW50OjpzZXRWaWRlb1N1cmZhY2UoY29uc3Qgc3A8SVN1cmZhY2U+JiBzdXJmYWNlKQorc3RhdHVzX3QgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpDbGllbnQ6OnNldFZpZGVvSVN1cmZhY2UoY29uc3Qgc3A8SVN1cmZhY2U+JiBzdXJmYWNlKQoreworICAgIExPR1YoIlslZF0gc2V0VmlkZW9JU3VyZmFjZSglcCkiLCBtQ29ubklkLCBzdXJmYWNlLmdldCgpKTsKKyAgICBzcDxNZWRpYVBsYXllckJhc2U+IHAgPSBnZXRQbGF5ZXIoKTsKKyAgICBpZiAocCA9PSAwKSByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICByZXR1cm4gcC0+c2V0VmlkZW9JU3VyZmFjZShzdXJmYWNlKTsKK30KKworc3RhdHVzX3QgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpDbGllbnQ6OnNldFZpZGVvU3VyZmFjZShjb25zdCBzcDxTdXJmYWNlPiYgc3VyZmFjZSkKIHsKICAgICBMT0dWKCJbJWRdIHNldFZpZGVvU3VyZmFjZSglcCkiLCBtQ29ubklkLCBzdXJmYWNlLmdldCgpKTsKICAgICBzcDxNZWRpYVBsYXllckJhc2U+IHAgPSBnZXRQbGF5ZXIoKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllclNlcnZpY2UuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllclNlcnZpY2UuaAppbmRleCBhOTY3ZWUyLi5kZWI0NThjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJTZXJ2aWNlLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyU2VydmljZS5oCkBAIC0yMDQsNyArMjA0LDggQEAKIAogICAgICAgICAvLyBJTWVkaWFQbGF5ZXIgaW50ZXJmYWNlCiAgICAgICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgIGRpc2Nvbm5lY3QoKTsKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc2V0VmlkZW9TdXJmYWNlKGNvbnN0IHNwPElTdXJmYWNlPiYgc3VyZmFjZSk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHNldFZpZGVvSVN1cmZhY2UoY29uc3Qgc3A8SVN1cmZhY2U+JiBzdXJmYWNlKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc2V0VmlkZW9TdXJmYWNlKGNvbnN0IHNwPFN1cmZhY2U+JiBzdXJmYWNlKTsKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgcHJlcGFyZUFzeW5jKCk7CiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHN0YXJ0KCk7CiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHN0b3AoKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVJlY29yZGVyQ2xpZW50LmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVJlY29yZGVyQ2xpZW50LmNwcAppbmRleCA3Mzg2MmMzLi43ZTA1MDQzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFSZWNvcmRlckNsaWVudC5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUmVjb3JkZXJDbGllbnQuY3BwCkBAIC03MCw3ICs3MCw3IEBACiAgICAgcmV0dXJuIG1SZWNvcmRlci0+c2V0Q2FtZXJhKGNhbWVyYSk7CiB9CiAKLXN0YXR1c190IE1lZGlhUmVjb3JkZXJDbGllbnQ6OnNldFByZXZpZXdTdXJmYWNlKGNvbnN0IHNwPElTdXJmYWNlPiYgc3VyZmFjZSkKK3N0YXR1c190IE1lZGlhUmVjb3JkZXJDbGllbnQ6OnNldFByZXZpZXdTdXJmYWNlKGNvbnN0IHNwPFN1cmZhY2U+JiBzdXJmYWNlKQogewogICAgIExPR1YoInNldFByZXZpZXdTdXJmYWNlIik7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwpAQCAtMzM3LDQgKzMzNywzIEBACiB9CiAKIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVJlY29yZGVyQ2xpZW50LmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFSZWNvcmRlckNsaWVudC5oCmluZGV4IDFkMTkxM2QuLjZjMTcyMTcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVJlY29yZGVyQ2xpZW50LmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUmVjb3JkZXJDbGllbnQuaApAQCAtMjksNyArMjksNyBAQAogewogcHVibGljOgogICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgICAgICBzZXRDYW1lcmEoY29uc3Qgc3A8SUNhbWVyYT4mIGNhbWVyYSk7Ci0gICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgICAgIHNldFByZXZpZXdTdXJmYWNlKGNvbnN0IHNwPElTdXJmYWNlPiYgc3VyZmFjZSk7CisgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgICAgIHNldFByZXZpZXdTdXJmYWNlKGNvbnN0IHNwPFN1cmZhY2U+JiBzdXJmYWNlKTsKICAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICAgICAgc2V0VmlkZW9Tb3VyY2UoaW50IHZzKTsKICAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICAgICAgc2V0QXVkaW9Tb3VyY2UoaW50IGFzKTsKICAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICAgICAgc2V0T3V0cHV0Rm9ybWF0KGludCBvZik7CkBAIC02Niw0ICs2NiwzIEBACiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCiAjZW5kaWYgLy8gQU5EUk9JRF9NRURJQVJFQ09SREVSQ0xJRU5UX0gKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01pZGlGaWxlLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWlkaUZpbGUuaAppbmRleCA0YTYwZWNlLi4wNmU0YjcwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWlkaUZpbGUuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWlkaUZpbGUuaApAQCAtMzUsNyArMzUsOCBAQAogICAgICAgICAgICAgY29uc3QgY2hhciogcGF0aCwgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXREYXRhU291cmNlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldFZpZGVvU3VyZmFjZShjb25zdCBzcDxJU3VyZmFjZT4mIHN1cmZhY2UpIHsgcmV0dXJuIFVOS05PV05fRVJST1I7IH0KKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldFZpZGVvSVN1cmZhY2UoY29uc3Qgc3A8SVN1cmZhY2U+JiBzdXJmYWNlKSB7IHJldHVybiBVTktOT1dOX0VSUk9SOyB9CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRWaWRlb1N1cmZhY2UoY29uc3Qgc3A8U3VyZmFjZT4mIHN1cmZhY2UpIHsgcmV0dXJuIFVOS05PV05fRVJST1I7IH0KICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHByZXBhcmUoKTsKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHByZXBhcmVBc3luYygpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc3RhcnQoKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFBsYXllci5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRQbGF5ZXIuY3BwCmluZGV4IDJjOTZkNmQuLjZiOWJmODUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFBsYXllci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UGxheWVyLmNwcApAQCAtNDQsMTMgKzQ0LDIwIEBACiAgICAgcmV0dXJuIG1QbGF5ZXItPnNldERhdGFTb3VyY2UoZHVwKGZkKSwgb2Zmc2V0LCBsZW5ndGgpOwogfQogCi1zdGF0dXNfdCBTdGFnZWZyaWdodFBsYXllcjo6c2V0VmlkZW9TdXJmYWNlKGNvbnN0IHNwPElTdXJmYWNlPiAmc3VyZmFjZSkgewotICAgIExPR1YoInNldFZpZGVvU3VyZmFjZSIpOworc3RhdHVzX3QgU3RhZ2VmcmlnaHRQbGF5ZXI6OnNldFZpZGVvSVN1cmZhY2UoY29uc3Qgc3A8SVN1cmZhY2U+ICZzdXJmYWNlKSB7CisgICAgTE9HVigic2V0VmlkZW9JU3VyZmFjZSIpOwogCiAgICAgbVBsYXllci0+c2V0SVN1cmZhY2Uoc3VyZmFjZSk7CiAgICAgcmV0dXJuIE9LOwogfQogCitzdGF0dXNfdCBTdGFnZWZyaWdodFBsYXllcjo6c2V0VmlkZW9TdXJmYWNlKGNvbnN0IHNwPFN1cmZhY2U+ICZzdXJmYWNlKSB7CisgICAgTE9HVigic2V0VmlkZW9TdXJmYWNlIik7CisKKyAgICBtUGxheWVyLT5zZXRTdXJmYWNlKHN1cmZhY2UpOworICAgIHJldHVybiBPSzsKK30KKwogc3RhdHVzX3QgU3RhZ2VmcmlnaHRQbGF5ZXI6OnByZXBhcmUoKSB7CiAgICAgcmV0dXJuIG1QbGF5ZXItPnByZXBhcmUoKTsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFBsYXllci5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UGxheWVyLmgKaW5kZXggNzgxZWI0NC4uZGQzNzEwMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UGxheWVyLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UGxheWVyLmgKQEAgLTM1LDcgKzM1LDggQEAKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVybCwgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXREYXRhU291cmNlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZpZGVvU3VyZmFjZShjb25zdCBzcDxJU3VyZmFjZT4gJnN1cmZhY2UpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0VmlkZW9JU3VyZmFjZShjb25zdCBzcDxJU3VyZmFjZT4gJnN1cmZhY2UpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0VmlkZW9TdXJmYWNlKGNvbnN0IHNwPFN1cmZhY2U+ICZzdXJmYWNlKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHByZXBhcmUoKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHByZXBhcmVBc3luYygpOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFJlY29yZGVyLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFJlY29yZGVyLmNwcAppbmRleCBjZjAxZmY2Li5hMjRlNTZjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRSZWNvcmRlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UmVjb3JkZXIuY3BwCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQXVkaW9Tb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9BTVJXcml0ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9DYW1lcmFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9DYW1lcmFTb3VyY2VUaW1lTGFwc2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NUEVHNFdyaXRlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KQEAgLTM0LDExICszNSwxMSBAQAogI2luY2x1ZGUgPGNhbWVyYS9JQ2FtZXJhLmg+CiAjaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYS5oPgogI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmFQYXJhbWV0ZXJzLmg+Ci0jaW5jbHVkZSA8c3VyZmFjZWZsaW5nZXIvSVN1cmZhY2UuaD4KKyNpbmNsdWRlIDxzdXJmYWNlZmxpbmdlci9TdXJmYWNlLmg+CiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+CiAjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KIAogI2luY2x1ZGUgIkFSVFBXcml0ZXIuaCIKIApAQCAtMjAwLDcgKzIwMSw3IEBACiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXRQcmV2aWV3U3VyZmFjZShjb25zdCBzcDxJU3VyZmFjZT4gJnN1cmZhY2UpIHsKK3N0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldFByZXZpZXdTdXJmYWNlKGNvbnN0IHNwPFN1cmZhY2U+ICZzdXJmYWNlKSB7CiAgICAgTE9HVigic2V0UHJldmlld1N1cmZhY2U6ICVwIiwgc3VyZmFjZS5nZXQoKSk7CiAgICAgbVByZXZpZXdTdXJmYWNlID0gc3VyZmFjZTsKIApAQCAtNDczLDYgKzQ3NCw0NSBAQAogICAgIHJldHVybiBPSzsKIH0KIAorc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0UGFyYW1UaW1lTGFwc2VFbmFibGUoaW50MzJfdCB0aW1lTGFwc2VFbmFibGUpIHsKKyAgICBMT0dWKCJzZXRQYXJhbVRpbWVMYXBzZUVuYWJsZTogJWQiLCB0aW1lTGFwc2VFbmFibGUpOworCisgICAgaWYodGltZUxhcHNlRW5hYmxlID09IDApIHsKKyAgICAgICAgbUNhcHR1cmVUaW1lTGFwc2UgPSBmYWxzZTsKKyAgICB9IGVsc2UgaWYgKHRpbWVMYXBzZUVuYWJsZSA9PSAxKSB7CisgICAgICAgIG1DYXB0dXJlVGltZUxhcHNlID0gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldFBhcmFtVXNlU3RpbGxDYW1lcmFGb3JUaW1lTGFwc2UoaW50MzJfdCB1c2VTdGlsbENhbWVyYSkgeworICAgIExPR1YoInNldFBhcmFtVXNlU3RpbGxDYW1lcmFGb3JUaW1lTGFwc2U6ICVkIiwgdXNlU3RpbGxDYW1lcmEpOworCisgICAgaWYodXNlU3RpbGxDYW1lcmEgPT0gMCkgeworICAgICAgICBtVXNlU3RpbGxDYW1lcmFGb3JUaW1lTGFwc2U9IGZhbHNlOworICAgIH0gZWxzZSBpZiAodXNlU3RpbGxDYW1lcmEgPT0gMSkgeworICAgICAgICBtVXNlU3RpbGxDYW1lcmFGb3JUaW1lTGFwc2U9IHRydWU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXRQYXJhbVRpbWVCZXR3ZWVuVGltZUxhcHNlRnJhbWVDYXB0dXJlKGludDY0X3QgdGltZVVzKSB7CisgICAgTE9HVigic2V0UGFyYW1UaW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZTogJWxsZCB1cyIsIHRpbWVVcyk7CisKKyAgICAvLyBOb3QgYWxsb3dpbmcgdGltZSBtb3JlIHRoYW4gYSBkYXkKKyAgICBpZiAodGltZVVzIDw9IDAgfHwgdGltZVVzID4gODY0MDAqMUU2KSB7CisgICAgICAgIExPR0UoIlRpbWUgYmV0d2VlbiB0aW1lIGxhcHNlIGZyYW1lIGNhcHR1cmUgKCVsbGQpIGlzIG91dCBvZiByYW5nZSBbMCwgMSBEYXldIiwgdGltZVVzKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBtVGltZUJldHdlZW5UaW1lTGFwc2VGcmFtZUNhcHR1cmVVcyA9IHRpbWVVczsKKyAgICByZXR1cm4gT0s7Cit9CisKIHN0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldFBhcmFtZXRlcigKICAgICAgICAgY29uc3QgU3RyaW5nOCAma2V5LCBjb25zdCBTdHJpbmc4ICZ2YWx1ZSkgewogICAgIExPR1YoInNldFBhcmFtZXRlcjoga2V5ICglcykgPT4gdmFsdWUgKCVzKSIsIGtleS5zdHJpbmcoKSwgdmFsdWUuc3RyaW5nKCkpOwpAQCAtNTU2LDYgKzU5NiwyMiBAQAogICAgICAgICBpZiAoc2FmZV9zdHJ0b2kzMih2YWx1ZS5zdHJpbmcoKSwgJnRpbWVTY2FsZSkpIHsKICAgICAgICAgICAgIHJldHVybiBzZXRQYXJhbVZpZGVvVGltZVNjYWxlKHRpbWVTY2FsZSk7CiAgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGtleSA9PSAidGltZS1sYXBzZS1lbmFibGUiKSB7CisgICAgICAgIGludDMyX3QgdGltZUxhcHNlRW5hYmxlOworICAgICAgICBpZiAoc2FmZV9zdHJ0b2kzMih2YWx1ZS5zdHJpbmcoKSwgJnRpbWVMYXBzZUVuYWJsZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBzZXRQYXJhbVRpbWVMYXBzZUVuYWJsZSh0aW1lTGFwc2VFbmFibGUpOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChrZXkgPT0gInVzZS1zdGlsbC1jYW1lcmEtZm9yLXRpbWUtbGFwc2UiKSB7CisgICAgICAgIGludDMyX3QgdXNlU3RpbGxDYW1lcmE7CisgICAgICAgIGlmIChzYWZlX3N0cnRvaTMyKHZhbHVlLnN0cmluZygpLCAmdXNlU3RpbGxDYW1lcmEpKSB7CisgICAgICAgICAgICByZXR1cm4gc2V0UGFyYW1Vc2VTdGlsbENhbWVyYUZvclRpbWVMYXBzZSh1c2VTdGlsbENhbWVyYSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGtleSA9PSAidGltZS1iZXR3ZWVuLXRpbWUtbGFwc2UtZnJhbWUtY2FwdHVyZSIpIHsKKyAgICAgICAgaW50NjRfdCB0aW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZU1zOworICAgICAgICBpZiAoc2FmZV9zdHJ0b2k2NCh2YWx1ZS5zdHJpbmcoKSwgJnRpbWVCZXR3ZWVuVGltZUxhcHNlRnJhbWVDYXB0dXJlTXMpKSB7CisgICAgICAgICAgICByZXR1cm4gc2V0UGFyYW1UaW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZSgKKyAgICAgICAgICAgICAgICAgICAgMTAwMExMICogdGltZUJldHdlZW5UaW1lTGFwc2VGcmFtZUNhcHR1cmVNcyk7CisgICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICBMT0dFKCJzZXRQYXJhbWV0ZXI6IGZhaWxlZCB0byBmaW5kIGtleSAlcyIsIGtleS5zdHJpbmcoKSk7CiAgICAgfQpAQCAtODUxLDEwICs5MDcsMTQgQEAKIH0KIAogc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0dXBDYW1lcmFTb3VyY2UoKSB7Ci0gICAgY2xpcFZpZGVvQml0UmF0ZSgpOwotICAgIGNsaXBWaWRlb0ZyYW1lUmF0ZSgpOwotICAgIGNsaXBWaWRlb0ZyYW1lV2lkdGgoKTsKLSAgICBjbGlwVmlkZW9GcmFtZUhlaWdodCgpOworICAgIGlmICghbUNhcHR1cmVUaW1lTGFwc2UpIHsKKyAgICAgICAgLy8gRG9udCBjbGlwIGZvciB0aW1lIGxhcHNlIGNhcHR1cmUgYXMgZW5jb2RlciB3aWxsIGhhdmUgZW5vdWdoCisgICAgICAgIC8vIHRpbWUgdG8gZW5jb2RlIGJlY2F1c2Ugb2Ygc2xvdyBjYXB0dXJlIHJhdGUgb2YgdGltZSBsYXBzZS4KKyAgICAgICAgY2xpcFZpZGVvQml0UmF0ZSgpOworICAgICAgICBjbGlwVmlkZW9GcmFtZVJhdGUoKTsKKyAgICAgICAgY2xpcFZpZGVvRnJhbWVXaWR0aCgpOworICAgICAgICBjbGlwVmlkZW9GcmFtZUhlaWdodCgpOworICAgIH0KIAogICAgIGludDY0X3QgdG9rZW4gPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5jbGVhckNhbGxpbmdJZGVudGl0eSgpOwogICAgIGlmIChtQ2FtZXJhID09IDApIHsKQEAgLTg2OSw3ICs5MjksMTQgQEAKIAogICAgIC8vIFNldCB0aGUgYWN0dWFsIHZpZGVvIHJlY29yZGluZyBmcmFtZSBzaXplCiAgICAgQ2FtZXJhUGFyYW1ldGVycyBwYXJhbXMobUNhbWVyYS0+Z2V0UGFyYW1ldGVycygpKTsKLSAgICBwYXJhbXMuc2V0UHJldmlld1NpemUobVZpZGVvV2lkdGgsIG1WaWRlb0hlaWdodCk7CisKKyAgICAvLyBkb250IGNoYW5nZSB0aGUgcHJldmlldyBzaXplIHdoZW4gdXNpbmcgc3RpbGwgY2FtZXJhIGZvciB0aW1lIGxhcHNlCisgICAgLy8gYXMgbVZpZGVvV2lkdGgsIG1WaWRlb0hlaWdodCBtYXkgY29ycmVzcG9uZCB0byBIRCByZXNvbHV0aW9uIG5vdAorICAgIC8vIHN1cHBvcnRlZCBieSB0aGUgdmlkZW8gY2FtZXJhLgorICAgIGlmICghKG1DYXB0dXJlVGltZUxhcHNlICYmIG1Vc2VTdGlsbENhbWVyYUZvclRpbWVMYXBzZSkpIHsKKyAgICAgICAgcGFyYW1zLnNldFByZXZpZXdTaXplKG1WaWRlb1dpZHRoLCBtVmlkZW9IZWlnaHQpOworICAgIH0KKwogICAgIHBhcmFtcy5zZXRQcmV2aWV3RnJhbWVSYXRlKG1GcmFtZVJhdGUpOwogICAgIFN0cmluZzggcyA9IHBhcmFtcy5mbGF0dGVuKCk7CiAgICAgaWYgKE9LICE9IG1DYW1lcmEtPnNldFBhcmFtZXRlcnMocykpIHsKQEAgLTg4Miw4ICs5NDksOSBAQAogICAgIC8vIENoZWNrIG9uIHZpZGVvIGZyYW1lIHNpemUKICAgICBpbnQgZnJhbWVXaWR0aCA9IDAsIGZyYW1lSGVpZ2h0ID0gMDsKICAgICBuZXdDYW1lcmFQYXJhbXMuZ2V0UHJldmlld1NpemUoJmZyYW1lV2lkdGgsICZmcmFtZUhlaWdodCk7Ci0gICAgaWYgKGZyYW1lV2lkdGggIDwgMCB8fCBmcmFtZVdpZHRoICAhPSBtVmlkZW9XaWR0aCB8fAotICAgICAgICBmcmFtZUhlaWdodCA8IDAgfHwgZnJhbWVIZWlnaHQgIT0gbVZpZGVvSGVpZ2h0KSB7CisgICAgaWYgKCEobUNhcHR1cmVUaW1lTGFwc2UgJiYgbVVzZVN0aWxsQ2FtZXJhRm9yVGltZUxhcHNlKSAmJgorICAgICAgICAoZnJhbWVXaWR0aCAgPCAwIHx8IGZyYW1lV2lkdGggICE9IG1WaWRlb1dpZHRoIHx8CisgICAgICAgIGZyYW1lSGVpZ2h0IDwgMCB8fCBmcmFtZUhlaWdodCAhPSBtVmlkZW9IZWlnaHQpKSB7CiAgICAgICAgIExPR0UoIkZhaWxlZCB0byBzZXQgdGhlIHZpZGVvIGZyYW1lIHNpemUgdG8gJWR4JWQiLAogICAgICAgICAgICAgICAgIG1WaWRlb1dpZHRoLCBtVmlkZW9IZWlnaHQpOwogICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KHRva2VuKTsKQEAgLTkyNyw3ICs5OTUsMTAgQEAKICAgICBzdGF0dXNfdCBlcnIgPSBzZXR1cENhbWVyYVNvdXJjZSgpOwogICAgIGlmIChlcnIgIT0gT0spIHJldHVybiBlcnI7CiAKLSAgICBzcDxDYW1lcmFTb3VyY2U+IGNhbWVyYVNvdXJjZSA9IENhbWVyYVNvdXJjZTo6Q3JlYXRlRnJvbUNhbWVyYShtQ2FtZXJhKTsKKyAgICBzcDxDYW1lcmFTb3VyY2U+IGNhbWVyYVNvdXJjZSA9IChtQ2FwdHVyZVRpbWVMYXBzZSkgPworICAgICAgICBDYW1lcmFTb3VyY2VUaW1lTGFwc2U6OkNyZWF0ZUZyb21DYW1lcmEobUNhbWVyYSwgbVVzZVN0aWxsQ2FtZXJhRm9yVGltZUxhcHNlLAorICAgICAgICAgICAgICAgIG1UaW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZVVzLCBtVmlkZW9XaWR0aCwgbVZpZGVvSGVpZ2h0LCBtRnJhbWVSYXRlKToKKyAgICAgICAgQ2FtZXJhU291cmNlOjpDcmVhdGVGcm9tQ2FtZXJhKG1DYW1lcmEpOwogICAgIENIRUNLKGNhbWVyYVNvdXJjZSAhPSBOVUxMKTsKIAogICAgIHNwPE1ldGFEYXRhPiBlbmNfbWV0YSA9IG5ldyBNZXRhRGF0YTsKQEAgLTk4MCw5ICsxMDUxLDEyIEBACiAgICAgT01YQ2xpZW50IGNsaWVudDsKICAgICBDSEVDS19FUShjbGllbnQuY29ubmVjdCgpLCBPSyk7CiAKKyAgICAvLyBVc2Ugc29mdHdhcmUgY29kZWMgZm9yIHRpbWUgbGFwc2UKKyAgICB1aW50MzJfdCBlbmNvZGVyX2ZsYWdzID0gKG1DYXB0dXJlVGltZUxhcHNlKSA/IE9NWENvZGVjOjprUHJlZmVyU29mdHdhcmVDb2RlY3MgOiAwOwogICAgIHNwPE1lZGlhU291cmNlPiBlbmNvZGVyID0gT01YQ29kZWM6OkNyZWF0ZSgKICAgICAgICAgICAgIGNsaWVudC5pbnRlcmZhY2UoKSwgZW5jX21ldGEsCi0gICAgICAgICAgICB0cnVlIC8qIGNyZWF0ZUVuY29kZXIgKi8sIGNhbWVyYVNvdXJjZSk7CisgICAgICAgICAgICB0cnVlIC8qIGNyZWF0ZUVuY29kZXIgKi8sIGNhbWVyYVNvdXJjZSwKKyAgICAgICAgICAgIE5VTEwsIGVuY29kZXJfZmxhZ3MpOwogICAgIGlmIChlbmNvZGVyID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CiAgICAgfQpAQCAtMTAxOSw3ICsxMDkzLDcgQEAKICAgICBzcDxNZWRpYVdyaXRlcj4gd3JpdGVyID0gbmV3IE1QRUc0V3JpdGVyKGR1cChtT3V0cHV0RmQpKTsKIAogICAgIC8vIEFkZCBhdWRpbyBzb3VyY2UgZmlyc3QgaWYgaXQgZXhpc3RzCi0gICAgaWYgKG1BdWRpb1NvdXJjZSAhPSBBVURJT19TT1VSQ0VfTElTVF9FTkQpIHsKKyAgICBpZiAoIW1DYXB0dXJlVGltZUxhcHNlICYmIChtQXVkaW9Tb3VyY2UgIT0gQVVESU9fU09VUkNFX0xJU1RfRU5EKSkgewogICAgICAgICBlcnIgPSBzZXR1cEF1ZGlvRW5jb2Rlcih3cml0ZXIpOwogICAgICAgICBpZiAoZXJyICE9IE9LKSByZXR1cm4gZXJyOwogICAgICAgICB0b3RhbEJpdFJhdGUgKz0gbUF1ZGlvQml0UmF0ZTsKQEAgLTExMzcsNiArMTIxMSw5IEBACiAgICAgbU1heEZpbGVEdXJhdGlvblVzID0gMDsKICAgICBtTWF4RmlsZVNpemVCeXRlcyA9IDA7CiAgICAgbVRyYWNrRXZlcnlUaW1lRHVyYXRpb25VcyA9IDA7CisgICAgbUNhcHR1cmVUaW1lTGFwc2UgPSBmYWxzZTsKKyAgICBtVXNlU3RpbGxDYW1lcmFGb3JUaW1lTGFwc2UgPSB0cnVlOworICAgIG1UaW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZVVzID0gLTE7CiAgICAgbUVuY29kZXJQcm9maWxlcyA9IE1lZGlhUHJvZmlsZXM6OmdldEluc3RhbmNlKCk7CiAKICAgICBtT3V0cHV0RmQgPSAtMTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFJlY29yZGVyLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRSZWNvcmRlci5oCmluZGV4IDIxNmY2YmMuLjYyOGUxOWIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFJlY29yZGVyLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UmVjb3JkZXIuaApAQCAtNDIsNyArNDIsNyBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0VmlkZW9TaXplKGludCB3aWR0aCwgaW50IGhlaWdodCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWaWRlb0ZyYW1lUmF0ZShpbnQgZnJhbWVzX3Blcl9zZWNvbmQpOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Q2FtZXJhKGNvbnN0IHNwPElDYW1lcmE+JiBjYW1lcmEpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UHJldmlld1N1cmZhY2UoY29uc3Qgc3A8SVN1cmZhY2U+JiBzdXJmYWNlKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFByZXZpZXdTdXJmYWNlKGNvbnN0IHNwPFN1cmZhY2U+JiBzdXJmYWNlKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldE91dHB1dEZpbGUoY29uc3QgY2hhciAqcGF0aCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRPdXRwdXRGaWxlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYgcGFyYW1zKTsKQEAgLTYzLDcgKzYzLDcgQEAKICAgICB9OwogCiAgICAgc3A8Q2FtZXJhPiBtQ2FtZXJhOwotICAgIHNwPElTdXJmYWNlPiBtUHJldmlld1N1cmZhY2U7CisgICAgc3A8U3VyZmFjZT4gbVByZXZpZXdTdXJmYWNlOwogICAgIHNwPElNZWRpYVJlY29yZGVyQ2xpZW50PiBtTGlzdGVuZXI7CiAgICAgc3A8TWVkaWFXcml0ZXI+IG1Xcml0ZXI7CiAgICAgc3A8QXVkaW9Tb3VyY2U+IG1BdWRpb1NvdXJjZU5vZGU7CkBAIC05Miw2ICs5MiwxMCBAQAogICAgIGludDY0X3QgbU1heEZpbGVEdXJhdGlvblVzOwogICAgIGludDY0X3QgbVRyYWNrRXZlcnlUaW1lRHVyYXRpb25VczsKIAorICAgIGJvb2wgbUNhcHR1cmVUaW1lTGFwc2U7CisgICAgYm9vbCBtVXNlU3RpbGxDYW1lcmFGb3JUaW1lTGFwc2U7CisgICAgaW50NjRfdCBtVGltZUJldHdlZW5UaW1lTGFwc2VGcmFtZUNhcHR1cmVVczsKKwogICAgIFN0cmluZzggbVBhcmFtczsKICAgICBpbnQgbU91dHB1dEZkOwogICAgIGludDMyX3QgbUZsYWdzOwpAQCAtMTEzLDYgKzExNyw5IEBACiAgICAgc3RhdHVzX3Qgc2V0UGFyYW1BdWRpb051bWJlck9mQ2hhbm5lbHMoaW50MzJfdCBjaGFubmxlcyk7CiAgICAgc3RhdHVzX3Qgc2V0UGFyYW1BdWRpb1NhbXBsaW5nUmF0ZShpbnQzMl90IHNhbXBsZVJhdGUpOwogICAgIHN0YXR1c190IHNldFBhcmFtQXVkaW9UaW1lU2NhbGUoaW50MzJfdCB0aW1lU2NhbGUpOworICAgIHN0YXR1c190IHNldFBhcmFtVGltZUxhcHNlRW5hYmxlKGludDMyX3QgdGltZUxhcHNlRW5hYmxlKTsKKyAgICBzdGF0dXNfdCBzZXRQYXJhbVVzZVN0aWxsQ2FtZXJhRm9yVGltZUxhcHNlKGludDMyX3QgdXNlU3RpbGxDYW1lcmEpOworICAgIHN0YXR1c190IHNldFBhcmFtVGltZUJldHdlZW5UaW1lTGFwc2VGcmFtZUNhcHR1cmUoaW50NjRfdCB0aW1lVXMpOwogICAgIHN0YXR1c190IHNldFBhcmFtVmlkZW9FbmNvZGluZ0JpdFJhdGUoaW50MzJfdCBiaXRSYXRlKTsKICAgICBzdGF0dXNfdCBzZXRQYXJhbVZpZGVvSUZyYW1lc0ludGVydmFsKGludDMyX3Qgc2Vjb25kcyk7CiAgICAgc3RhdHVzX3Qgc2V0UGFyYW1WaWRlb0VuY29kZXJQcm9maWxlKGludDMyX3QgcHJvZmlsZSk7CkBAIC0xMzcsNCArMTQ0LDMgQEAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKICNlbmRpZiAgLy8gU1RBR0VGUklHSFRfUkVDT1JERVJfSF8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1Rlc3RQbGF5ZXJTdHViLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvVGVzdFBsYXllclN0dWIuaAppbmRleCA2ZTZjM2NkLi41ZWFmNTkyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvVGVzdFBsYXllclN0dWIuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvVGVzdFBsYXllclN0dWIuaApAQCAtNzUsNyArNzUsMTAgQEAKIAogCiAgICAgLy8gQWxsIHRoZSBtZXRob2RzIGJlbG93IHdyYXAgdGhlIG1QbGF5ZXIgaW5zdGFuY2UuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWaWRlb1N1cmZhY2UoY29uc3QgYW5kcm9pZDo6c3A8YW5kcm9pZDo6SVN1cmZhY2U+JiBzKSAgeworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0VmlkZW9JU3VyZmFjZShjb25zdCBhbmRyb2lkOjpzcDxhbmRyb2lkOjpJU3VyZmFjZT4mIHMpICB7CisgICAgICAgIHJldHVybiBtUGxheWVyLT5zZXRWaWRlb0lTdXJmYWNlKHMpOworICAgIH0KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZpZGVvU3VyZmFjZShjb25zdCBhbmRyb2lkOjpzcDxhbmRyb2lkOjpTdXJmYWNlPiYgcykgIHsKICAgICAgICAgcmV0dXJuIG1QbGF5ZXItPnNldFZpZGVvU3VyZmFjZShzKTsKICAgICB9CiAgICAgdmlydHVhbCBzdGF0dXNfdCBwcmVwYXJlKCkge3JldHVybiBtUGxheWVyLT5wcmVwYXJlKCk7fQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FuZHJvaWQubWsKaW5kZXggODZmYTY2OC4uYjVhNjMyNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BbmRyb2lkLm1rCkBAIC0xMCw2ICsxMCw3IEBACiAgICAgICAgIEF1ZGlvU291cmNlLmNwcCAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIEF3ZXNvbWVQbGF5ZXIuY3BwICAgICAgICAgICAgICAgICBcCiAgICAgICAgIENhbWVyYVNvdXJjZS5jcHAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIENhbWVyYVNvdXJjZVRpbWVMYXBzZS5jcHAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIERhdGFTb3VyY2UuY3BwICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIEVTRFMuY3BwICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIEZpbGVTb3VyY2UuY3BwICAgICAgICAgICAgICAgICAgICBcCkBAIC01OCw2ICs1OSw3IEBACiAgICAgICAgIGxpYnNvbml2b3ggICAgICAgIFwKICAgICAgICAgbGlidm9yYmlzaWRlYyAgICAgXAogICAgICAgICBsaWJzdXJmYWNlZmxpbmdlcl9jbGllbnQgXAorICAgICAgICBsaWJzdGFnZWZyaWdodF95dXYgXAogICAgICAgICBsaWJjYW1lcmFfY2xpZW50CiAKIExPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gXApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXdlc29tZVBsYXllci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9Bd2Vzb21lUGxheWVyLmNwcAppbmRleCAxMWZkZjU2Li5lMTY3YWZhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9Bd2Vzb21lUGxheWVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9Bd2Vzb21lUGxheWVyLmNwcApAQCAtNDQsNyArNDQsNyBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvT01YQ29kZWMuaD4KIAotI2luY2x1ZGUgPHN1cmZhY2VmbGluZ2VyL0lTdXJmYWNlLmg+CisjaW5jbHVkZSA8c3VyZmFjZWZsaW5nZXIvU3VyZmFjZS5oPgogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmg+CiAKQEAgLTk3LDEzICs5NywxNCBAQAogICAgICAgICAgICAgYm9vbCBwcmV2aWV3T25seSwKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmNvbXBvbmVudE5hbWUsCiAgICAgICAgICAgICBPTVhfQ09MT1JfRk9STUFUVFlQRSBjb2xvckZvcm1hdCwKLSAgICAgICAgICAgIGNvbnN0IHNwPElTdXJmYWNlPiAmc3VyZmFjZSwKKyAgICAgICAgICAgIGNvbnN0IHNwPElTdXJmYWNlPiAmaXN1cmZhY2UsCisgICAgICAgICAgICBjb25zdCBzcDxTdXJmYWNlPiAmc3VyZmFjZSwKICAgICAgICAgICAgIHNpemVfdCBkaXNwbGF5V2lkdGgsIHNpemVfdCBkaXNwbGF5SGVpZ2h0LAogICAgICAgICAgICAgc2l6ZV90IGRlY29kZWRXaWR0aCwgc2l6ZV90IGRlY29kZWRIZWlnaHQpCiAgICAgICAgIDogbVRhcmdldChOVUxMKSwKICAgICAgICAgICBtTGliSGFuZGxlKE5VTEwpIHsKICAgICAgICAgICAgIGluaXQocHJldmlld09ubHksIGNvbXBvbmVudE5hbWUsCi0gICAgICAgICAgICAgICAgIGNvbG9yRm9ybWF0LCBzdXJmYWNlLCBkaXNwbGF5V2lkdGgsCisgICAgICAgICAgICAgICAgIGNvbG9yRm9ybWF0LCBpc3VyZmFjZSwgc3VyZmFjZSwgZGlzcGxheVdpZHRoLAogICAgICAgICAgICAgICAgICBkaXNwbGF5SGVpZ2h0LCBkZWNvZGVkV2lkdGgsIGRlY29kZWRIZWlnaHQpOwogICAgIH0KIApAQCAtMTM1LDcgKzEzNiw4IEBACiAgICAgICAgICAgICBib29sIHByZXZpZXdPbmx5LAogICAgICAgICAgICAgY29uc3QgY2hhciAqY29tcG9uZW50TmFtZSwKICAgICAgICAgICAgIE9NWF9DT0xPUl9GT1JNQVRUWVBFIGNvbG9yRm9ybWF0LAotICAgICAgICAgICAgY29uc3Qgc3A8SVN1cmZhY2U+ICZzdXJmYWNlLAorICAgICAgICAgICAgY29uc3Qgc3A8SVN1cmZhY2U+ICZpc3VyZmFjZSwKKyAgICAgICAgICAgIGNvbnN0IHNwPFN1cmZhY2U+ICZzdXJmYWNlLAogICAgICAgICAgICAgc2l6ZV90IGRpc3BsYXlXaWR0aCwgc2l6ZV90IGRpc3BsYXlIZWlnaHQsCiAgICAgICAgICAgICBzaXplX3QgZGVjb2RlZFdpZHRoLCBzaXplX3QgZGVjb2RlZEhlaWdodCk7CiAKQEAgLTE0Nyw3ICsxNDksOCBAQAogICAgICAgICBib29sIHByZXZpZXdPbmx5LAogICAgICAgICBjb25zdCBjaGFyICpjb21wb25lbnROYW1lLAogICAgICAgICBPTVhfQ09MT1JfRk9STUFUVFlQRSBjb2xvckZvcm1hdCwKLSAgICAgICAgY29uc3Qgc3A8SVN1cmZhY2U+ICZzdXJmYWNlLAorICAgICAgICBjb25zdCBzcDxJU3VyZmFjZT4gJmlzdXJmYWNlLAorICAgICAgICBjb25zdCBzcDxTdXJmYWNlPiAmc3VyZmFjZSwKICAgICAgICAgc2l6ZV90IGRpc3BsYXlXaWR0aCwgc2l6ZV90IGRpc3BsYXlIZWlnaHQsCiAgICAgICAgIHNpemVfdCBkZWNvZGVkV2lkdGgsIHNpemVfdCBkZWNvZGVkSGVpZ2h0KSB7CiAgICAgaWYgKCFwcmV2aWV3T25seSkgewpAQCAtMTczLDcgKzE3Niw3IEBACiAKICAgICAgICAgICAgIGlmIChmdW5jKSB7CiAgICAgICAgICAgICAgICAgbVRhcmdldCA9Ci0gICAgICAgICAgICAgICAgICAgICgqZnVuYykoc3VyZmFjZSwgY29tcG9uZW50TmFtZSwgY29sb3JGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICgqZnVuYykoaXN1cmZhY2UsIGNvbXBvbmVudE5hbWUsIGNvbG9yRm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheVdpZHRoLCBkaXNwbGF5SGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlZFdpZHRoLCBkZWNvZGVkSGVpZ2h0KTsKICAgICAgICAgICAgIH0KQEAgLTYyNCw4ICs2MjcsMTggQEAKICAgICByZXR1cm4gT0s7CiB9CiAKK3ZvaWQgQXdlc29tZVBsYXllcjo6bm90aWZ5VmlkZW9TaXplX2woKSB7CisgICAgc3A8TWV0YURhdGE+IG1ldGEgPSBtVmlkZW9Tb3VyY2UtPmdldEZvcm1hdCgpOworCisgICAgaW50MzJfdCBkZWNvZGVkV2lkdGgsIGRlY29kZWRIZWlnaHQ7CisgICAgQ0hFQ0sobWV0YS0+ZmluZEludDMyKGtLZXlXaWR0aCwgJmRlY29kZWRXaWR0aCkpOworICAgIENIRUNLKG1ldGEtPmZpbmRJbnQzMihrS2V5SGVpZ2h0LCAmZGVjb2RlZEhlaWdodCkpOworCisgICAgbm90aWZ5TGlzdGVuZXJfbChNRURJQV9TRVRfVklERU9fU0laRSwgZGVjb2RlZFdpZHRoLCBkZWNvZGVkSGVpZ2h0KTsKK30KKwogdm9pZCBBd2Vzb21lUGxheWVyOjppbml0UmVuZGVyZXJfbCgpIHsKLSAgICBpZiAobUlTdXJmYWNlICE9IE5VTEwpIHsKKyAgICBpZiAobVN1cmZhY2UgIT0gTlVMTCB8fCBtSVN1cmZhY2UgIT0gTlVMTCkgewogICAgICAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG1WaWRlb1NvdXJjZS0+Z2V0Rm9ybWF0KCk7CiAKICAgICAgICAgaW50MzJfdCBmb3JtYXQ7CkBAIC02NDIsNyArNjU1LDE4IEBACiAgICAgICAgIC8vIGJlZm9yZSBjcmVhdGluZyBhIG5ldyBvbmUuCiAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmZsdXNoQ29tbWFuZHMoKTsKIAotICAgICAgICBpZiAoIXN0cm5jbXAoIk9NWC4iLCBjb21wb25lbnQsIDQpKSB7CisgICAgICAgIGlmIChtU3VyZmFjZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAvLyBPdGhlciBkZWNvZGVycyBhcmUgaW5zdGFudGlhdGVkIGxvY2FsbHkgYW5kIGFzIGEgY29uc2VxdWVuY2UKKyAgICAgICAgICAgIC8vIGFsbG9jYXRlIHRoZWlyIGJ1ZmZlcnMgaW4gbG9jYWwgYWRkcmVzcyBzcGFjZS4KKyAgICAgICAgICAgIG1WaWRlb1JlbmRlcmVyID0gbmV3IEF3ZXNvbWVMb2NhbFJlbmRlcmVyKAorICAgICAgICAgICAgICAgIGZhbHNlLCAgLy8gcHJldmlld09ubHkKKyAgICAgICAgICAgICAgICBjb21wb25lbnQsCisgICAgICAgICAgICAgICAgKE9NWF9DT0xPUl9GT1JNQVRUWVBFKWZvcm1hdCwKKyAgICAgICAgICAgICAgICBtSVN1cmZhY2UsCisgICAgICAgICAgICAgICAgbVN1cmZhY2UsCisgICAgICAgICAgICAgICAgbVZpZGVvV2lkdGgsIG1WaWRlb0hlaWdodCwKKyAgICAgICAgICAgICAgICBkZWNvZGVkV2lkdGgsIGRlY29kZWRIZWlnaHQpOworICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLy8gT3VyIE9NWCBjb2RlY3MgYWxsb2NhdGUgYnVmZmVycyBvbiB0aGUgbWVkaWFfc2VydmVyIHNpZGUKICAgICAgICAgICAgIC8vIHRoZXJlZm9yZSB0aGV5IHJlcXVpcmUgYSByZW1vdGUgSU9NWFJlbmRlcmVyIHRoYXQga25vd3MgaG93CiAgICAgICAgICAgICAvLyB0byBkaXNwbGF5IHRoZW0uCkBAIC02NTIsMTYgKzY3Niw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAoT01YX0NPTE9SX0ZPUk1BVFRZUEUpZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlZFdpZHRoLCBkZWNvZGVkSGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgbVZpZGVvV2lkdGgsIG1WaWRlb0hlaWdodCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gT3RoZXIgZGVjb2RlcnMgYXJlIGluc3RhbnRpYXRlZCBsb2NhbGx5IGFuZCBhcyBhIGNvbnNlcXVlbmNlCi0gICAgICAgICAgICAvLyBhbGxvY2F0ZSB0aGVpciBidWZmZXJzIGluIGxvY2FsIGFkZHJlc3Mgc3BhY2UuCi0gICAgICAgICAgICBtVmlkZW9SZW5kZXJlciA9IG5ldyBBd2Vzb21lTG9jYWxSZW5kZXJlcigKLSAgICAgICAgICAgICAgICBmYWxzZSwgIC8vIHByZXZpZXdPbmx5Ci0gICAgICAgICAgICAgICAgY29tcG9uZW50LAotICAgICAgICAgICAgICAgIChPTVhfQ09MT1JfRk9STUFUVFlQRSlmb3JtYXQsCi0gICAgICAgICAgICAgICAgbUlTdXJmYWNlLAotICAgICAgICAgICAgICAgIG1WaWRlb1dpZHRoLCBtVmlkZW9IZWlnaHQsCi0gICAgICAgICAgICAgICAgZGVjb2RlZFdpZHRoLCBkZWNvZGVkSGVpZ2h0KTsKICAgICAgICAgfQogICAgIH0KIH0KQEAgLTcwMCw2ICs3MTQsMTIgQEAKICAgICBtSVN1cmZhY2UgPSBpc3VyZmFjZTsKIH0KIAordm9pZCBBd2Vzb21lUGxheWVyOjpzZXRTdXJmYWNlKGNvbnN0IHNwPFN1cmZhY2U+ICZzdXJmYWNlKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIG1TdXJmYWNlID0gc3VyZmFjZTsKK30KKwogdm9pZCBBd2Vzb21lUGxheWVyOjpzZXRBdWRpb1NpbmsoCiAgICAgICAgIGNvbnN0IHNwPE1lZGlhUGxheWVyQmFzZTo6QXVkaW9TaW5rPiAmYXVkaW9TaW5rKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKQEAgLTk1Nyw2ICs5NzcsOCBAQAogICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gSU5GT19GT1JNQVRfQ0hBTkdFRCkgewogICAgICAgICAgICAgICAgICAgICBMT0dWKCJWaWRlb1NvdXJjZSBzaWduYWxsZWQgZm9ybWF0IGNoYW5nZS4iKTsKIAorICAgICAgICAgICAgICAgICAgICBub3RpZnlWaWRlb1NpemVfbCgpOworCiAgICAgICAgICAgICAgICAgICAgIGlmIChtVmlkZW9SZW5kZXJlciAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBtVmlkZW9SZW5kZXJlcklzUHJldmlldyA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgaW5pdFJlbmRlcmVyX2woKTsKQEAgLTE0NDIsMTAgKzE0NjQsMTAgQEAKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCiAgICAgaWYgKG1Jc0FzeW5jUHJlcGFyZSkgewotICAgICAgICBpZiAobVZpZGVvV2lkdGggPCAwIHx8IG1WaWRlb0hlaWdodCA8IDApIHsKKyAgICAgICAgaWYgKG1WaWRlb1NvdXJjZSA9PSBOVUxMKSB7CiAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcl9sKE1FRElBX1NFVF9WSURFT19TSVpFLCAwLCAwKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyX2woTUVESUFfU0VUX1ZJREVPX1NJWkUsIG1WaWRlb1dpZHRoLCBtVmlkZW9IZWlnaHQpOworICAgICAgICAgICAgbm90aWZ5VmlkZW9TaXplX2woKTsKICAgICAgICAgfQogCiAgICAgICAgIG5vdGlmeUxpc3RlbmVyX2woTUVESUFfUFJFUEFSRUQpOwpAQCAtMTU2MCwxMyArMTU4MiwxNCBAQAogCiAgICAgbUZsYWdzID0gc3RhdGUtPm1GbGFncyAmIChMT09QSU5HIHwgQVRfRU9TKTsKIAotICAgIGlmIChzdGF0ZS0+bUxhc3RWaWRlb0ZyYW1lICYmIG1JU3VyZmFjZSAhPSBOVUxMKSB7CisgICAgaWYgKHN0YXRlLT5tTGFzdFZpZGVvRnJhbWUgJiYgKG1TdXJmYWNlICE9IE5VTEwgfHwgbUlTdXJmYWNlICE9IE5VTEwpKSB7CiAgICAgICAgIG1WaWRlb1JlbmRlcmVyID0KICAgICAgICAgICAgIG5ldyBBd2Vzb21lTG9jYWxSZW5kZXJlcigKICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgIC8vIHByZXZpZXdPbmx5CiAgICAgICAgICAgICAgICAgICAgICIiLAogICAgICAgICAgICAgICAgICAgICAoT01YX0NPTE9SX0ZPUk1BVFRZUEUpc3RhdGUtPm1Db2xvckZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgbUlTdXJmYWNlLAorICAgICAgICAgICAgICAgICAgICBtU3VyZmFjZSwKICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPm1WaWRlb1dpZHRoLAogICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+bVZpZGVvSGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+bURlY29kZWRXaWR0aCwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9DYW1lcmFTb3VyY2UuY3BwCmluZGV4IDNlMzFkNjEuLjljY2QxNDAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlLmNwcApAQCAtNjUsNiArNjUsMTEgQEAKIHZvaWQgQ2FtZXJhU291cmNlTGlzdGVuZXI6OnBvc3REYXRhKGludDMyX3QgbXNnVHlwZSwgY29uc3Qgc3A8SU1lbW9yeT4gJmRhdGFQdHIpIHsKICAgICBMT0dWKCJwb3N0RGF0YSglZCwgcHRyOiVwLCBzaXplOiVkKSIsCiAgICAgICAgICBtc2dUeXBlLCBkYXRhUHRyLT5wb2ludGVyKCksIGRhdGFQdHItPnNpemUoKSk7CisKKyAgICBzcDxDYW1lcmFTb3VyY2U+IHNvdXJjZSA9IG1Tb3VyY2UucHJvbW90ZSgpOworICAgIGlmIChzb3VyY2UuZ2V0KCkgIT0gTlVMTCkgeworICAgICAgICBzb3VyY2UtPmRhdGFDYWxsYmFjayhtc2dUeXBlLCBkYXRhUHRyKTsKKyAgICB9CiB9CiAKIHZvaWQgQ2FtZXJhU291cmNlTGlzdGVuZXI6OnBvc3REYXRhVGltZXN0YW1wKApAQCAtMTE4LDE1ICsxMjMsMTUgQEAKIAogQ2FtZXJhU291cmNlOjpDYW1lcmFTb3VyY2UoY29uc3Qgc3A8Q2FtZXJhPiAmY2FtZXJhKQogICAgIDogbUNhbWVyYShjYW1lcmEpLAotICAgICAgbUZpcnN0RnJhbWVUaW1lVXMoMCksCi0gICAgICBtTGFzdEZyYW1lVGltZXN0YW1wVXMoMCksCiAgICAgICBtTnVtRnJhbWVzUmVjZWl2ZWQoMCksCisgICAgICBtTGFzdEZyYW1lVGltZXN0YW1wVXMoMCksCisgICAgICBtU3RhcnRlZChmYWxzZSksCisgICAgICBtRmlyc3RGcmFtZVRpbWVVcygwKSwKICAgICAgIG1OdW1GcmFtZXNFbmNvZGVkKDApLAogICAgICAgbU51bUZyYW1lc0Ryb3BwZWQoMCksCiAgICAgICBtTnVtR2xpdGNoZXMoMCksCiAgICAgICBtR2xpdGNoRHVyYXRpb25UaHJlc2hvbGRVcygyMDAwMDApLAotICAgICAgbUNvbGxlY3RTdGF0cyhmYWxzZSksCi0gICAgICBtU3RhcnRlZChmYWxzZSkgeworICAgICAgbUNvbGxlY3RTdGF0cyhmYWxzZSkgewogCiAgICAgaW50NjRfdCB0b2tlbiA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CiAgICAgU3RyaW5nOCBzID0gbUNhbWVyYS0+Z2V0UGFyYW1ldGVycygpOwpAQCAtMTYxLDcgKzE2Niw2IEBACiAgICAgbU1ldGEtPnNldEludDMyKGtLZXlIZWlnaHQsIGhlaWdodCk7CiAgICAgbU1ldGEtPnNldEludDMyKGtLZXlTdHJpZGUsIHN0cmlkZSk7CiAgICAgbU1ldGEtPnNldEludDMyKGtLZXlTbGljZUhlaWdodCwgc2xpY2VIZWlnaHQpOwotCiB9CiAKIENhbWVyYVNvdXJjZTo6fkNhbWVyYVNvdXJjZSgpIHsKQEAgLTE3MCw2ICsxNzQsMTAgQEAKICAgICB9CiB9CiAKK3ZvaWQgQ2FtZXJhU291cmNlOjpzdGFydENhbWVyYVJlY29yZGluZygpIHsKKyAgICBDSEVDS19FUShPSywgbUNhbWVyYS0+c3RhcnRSZWNvcmRpbmcoKSk7Cit9CisKIHN0YXR1c190IENhbWVyYVNvdXJjZTo6c3RhcnQoTWV0YURhdGEgKm1ldGEpIHsKICAgICBDSEVDSyghbVN0YXJ0ZWQpOwogCkBAIC0xODcsMTMgKzE5NSwxNyBAQAogCiAgICAgaW50NjRfdCB0b2tlbiA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CiAgICAgbUNhbWVyYS0+c2V0TGlzdGVuZXIobmV3IENhbWVyYVNvdXJjZUxpc3RlbmVyKHRoaXMpKTsKLSAgICBDSEVDS19FUShPSywgbUNhbWVyYS0+c3RhcnRSZWNvcmRpbmcoKSk7CisgICAgc3RhcnRDYW1lcmFSZWNvcmRpbmcoKTsKICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KHRva2VuKTsKIAogICAgIG1TdGFydGVkID0gdHJ1ZTsKICAgICByZXR1cm4gT0s7CiB9CiAKK3ZvaWQgQ2FtZXJhU291cmNlOjpzdG9wQ2FtZXJhUmVjb3JkaW5nKCkgeworICAgIG1DYW1lcmEtPnN0b3BSZWNvcmRpbmcoKTsKK30KKwogc3RhdHVzX3QgQ2FtZXJhU291cmNlOjpzdG9wKCkgewogICAgIExPR1YoInN0b3AiKTsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwpAQCAtMjAyLDcgKzIxNCw3IEBACiAKICAgICBpbnQ2NF90IHRva2VuID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Y2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKICAgICBtQ2FtZXJhLT5zZXRMaXN0ZW5lcihOVUxMKTsKLSAgICBtQ2FtZXJhLT5zdG9wUmVjb3JkaW5nKCk7CisgICAgc3RvcENhbWVyYVJlY29yZGluZygpOwogICAgIHJlbGVhc2VRdWV1ZWRGcmFtZXMoKTsKICAgICB3aGlsZSAoIW1GcmFtZXNCZWluZ0VuY29kZWQuZW1wdHkoKSkgewogICAgICAgICBMT0dJKCJXYWl0aW5nIGZvciBvdXRzdGFuZGluZyBmcmFtZXMgYmVpbmcgZW5jb2RlZDogJWQiLApAQCAtMjIyLDExICsyMzQsMTUgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKK3ZvaWQgQ2FtZXJhU291cmNlOjpyZWxlYXNlUmVjb3JkaW5nRnJhbWUoY29uc3Qgc3A8SU1lbW9yeT4mIGZyYW1lKSB7CisgICAgbUNhbWVyYS0+cmVsZWFzZVJlY29yZGluZ0ZyYW1lKGZyYW1lKTsKK30KKwogdm9pZCBDYW1lcmFTb3VyY2U6OnJlbGVhc2VRdWV1ZWRGcmFtZXMoKSB7CiAgICAgTGlzdDxzcDxJTWVtb3J5PiA+OjppdGVyYXRvciBpdDsKICAgICB3aGlsZSAoIW1GcmFtZXNSZWNlaXZlZC5lbXB0eSgpKSB7CiAgICAgICAgIGl0ID0gbUZyYW1lc1JlY2VpdmVkLmJlZ2luKCk7Ci0gICAgICAgIG1DYW1lcmEtPnJlbGVhc2VSZWNvcmRpbmdGcmFtZSgqaXQpOworICAgICAgICByZWxlYXNlUmVjb3JkaW5nRnJhbWUoKml0KTsKICAgICAgICAgbUZyYW1lc1JlY2VpdmVkLmVyYXNlKGl0KTsKICAgICAgICAgKyttTnVtRnJhbWVzRHJvcHBlZDsKICAgICB9CkBAIC0yMzgsNyArMjU0LDcgQEAKIAogdm9pZCBDYW1lcmFTb3VyY2U6OnJlbGVhc2VPbmVSZWNvcmRpbmdGcmFtZShjb25zdCBzcDxJTWVtb3J5PiYgZnJhbWUpIHsKICAgICBpbnQ2NF90IHRva2VuID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Y2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKLSAgICBtQ2FtZXJhLT5yZWxlYXNlUmVjb3JkaW5nRnJhbWUoZnJhbWUpOworICAgIHJlbGVhc2VSZWNvcmRpbmdGcmFtZShmcmFtZSk7CiAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+cmVzdG9yZUNhbGxpbmdJZGVudGl0eSh0b2tlbik7CiB9CiAKQEAgLTI0OCw3ICsyNjQsNiBAQAogICAgIGZvciAoTGlzdDxzcDxJTWVtb3J5PiA+OjppdGVyYXRvciBpdCA9IG1GcmFtZXNCZWluZ0VuY29kZWQuYmVnaW4oKTsKICAgICAgICAgIGl0ICE9IG1GcmFtZXNCZWluZ0VuY29kZWQuZW5kKCk7ICsraXQpIHsKICAgICAgICAgaWYgKCgqaXQpLT5wb2ludGVyKCkgPT0gIGJ1ZmZlci0+ZGF0YSgpKSB7Ci0KICAgICAgICAgICAgIHJlbGVhc2VPbmVSZWNvcmRpbmdGcmFtZSgoKml0KSk7CiAgICAgICAgICAgICBtRnJhbWVzQmVpbmdFbmNvZGVkLmVyYXNlKGl0KTsKICAgICAgICAgICAgICsrbU51bUZyYW1lc0VuY29kZWQ7CkBAIC0zNDAsNiArMzU1LDEzIEBACiAgICAgICAgICsrbU51bUdsaXRjaGVzOwogICAgIH0KIAorICAgIC8vIE1heSBuZWVkIHRvIHNraXAgZnJhbWUgb3IgbW9kaWZ5IHRpbWVzdGFtcC4gQ3VycmVudGx5IGltcGxlbWVudGVkCisgICAgLy8gYnkgdGhlIHN1YmNsYXNzIENhbWVyYVNvdXJjZVRpbWVMYXBzZS4KKyAgICBpZihza2lwQ3VycmVudEZyYW1lKHRpbWVzdGFtcFVzKSkgeworICAgICAgICByZWxlYXNlT25lUmVjb3JkaW5nRnJhbWUoZGF0YSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKICAgICBtTGFzdEZyYW1lVGltZXN0YW1wVXMgPSB0aW1lc3RhbXBVczsKICAgICBpZiAobU51bUZyYW1lc1JlY2VpdmVkID09IDApIHsKICAgICAgICAgbUZpcnN0RnJhbWVUaW1lVXMgPSB0aW1lc3RhbXBVczsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZVRpbWVMYXBzZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9DYW1lcmFTb3VyY2VUaW1lTGFwc2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhOTk1MDEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9DYW1lcmFTb3VyY2VUaW1lTGFwc2UuY3BwCkBAIC0wLDAgKzEsMzUwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDYW1lcmFTb3VyY2VUaW1lTGFwc2UiCisKKyNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KKyNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5QmFzZS5oPgorI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlIZWFwQmFzZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZVRpbWVMYXBzZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1lVVkltYWdlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvWVVWQ2FudmFzLmg+CisjaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYS5oPgorI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmFQYXJhbWV0ZXJzLmg+CisjaW5jbHVkZSA8dWkvUmVjdC5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKyNpbmNsdWRlICJPTVhfVmlkZW8uaCIKKyNpbmNsdWRlIDxsaW1pdHMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBzdGF0aWMKK0NhbWVyYVNvdXJjZVRpbWVMYXBzZSAqQ2FtZXJhU291cmNlVGltZUxhcHNlOjpDcmVhdGUoYm9vbCB1c2VTdGlsbENhbWVyYUZvclRpbWVMYXBzZSwKKyAgICAgICAgaW50NjRfdCB0aW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZVVzLAorICAgICAgICBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCwKKyAgICAgICAgaW50MzJfdCB2aWRlb0ZyYW1lUmF0ZSkgeworICAgIHNwPENhbWVyYT4gY2FtZXJhID0gQ2FtZXJhOjpjb25uZWN0KDApOworCisgICAgaWYgKGNhbWVyYS5nZXQoKSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHJldHVybiBuZXcgQ2FtZXJhU291cmNlVGltZUxhcHNlKGNhbWVyYSwgdXNlU3RpbGxDYW1lcmFGb3JUaW1lTGFwc2UsCisgICAgICAgICAgICB0aW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZVVzLCB3aWR0aCwgaGVpZ2h0LCB2aWRlb0ZyYW1lUmF0ZSk7Cit9CisKKy8vIHN0YXRpYworQ2FtZXJhU291cmNlVGltZUxhcHNlICpDYW1lcmFTb3VyY2VUaW1lTGFwc2U6OkNyZWF0ZUZyb21DYW1lcmEoY29uc3Qgc3A8Q2FtZXJhPiAmY2FtZXJhLAorICAgICAgICBib29sIHVzZVN0aWxsQ2FtZXJhRm9yVGltZUxhcHNlLAorICAgICAgICBpbnQ2NF90IHRpbWVCZXR3ZWVuVGltZUxhcHNlRnJhbWVDYXB0dXJlVXMsCisgICAgICAgIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0LAorICAgICAgICBpbnQzMl90IHZpZGVvRnJhbWVSYXRlKSB7CisgICAgaWYgKGNhbWVyYS5nZXQoKSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHJldHVybiBuZXcgQ2FtZXJhU291cmNlVGltZUxhcHNlKGNhbWVyYSwgdXNlU3RpbGxDYW1lcmFGb3JUaW1lTGFwc2UsCisgICAgICAgICAgICB0aW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZVVzLCB3aWR0aCwgaGVpZ2h0LCB2aWRlb0ZyYW1lUmF0ZSk7Cit9CisKK0NhbWVyYVNvdXJjZVRpbWVMYXBzZTo6Q2FtZXJhU291cmNlVGltZUxhcHNlKGNvbnN0IHNwPENhbWVyYT4gJmNhbWVyYSwKKyAgICAgICAgYm9vbCB1c2VTdGlsbENhbWVyYUZvclRpbWVMYXBzZSwKKyAgICAgICAgaW50NjRfdCB0aW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZVVzLAorICAgICAgICBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCwKKyAgICAgICAgaW50MzJfdCB2aWRlb0ZyYW1lUmF0ZSkKKyAgICA6IENhbWVyYVNvdXJjZShjYW1lcmEpLAorICAgICAgbVVzZVN0aWxsQ2FtZXJhRm9yVGltZUxhcHNlKHVzZVN0aWxsQ2FtZXJhRm9yVGltZUxhcHNlKSwKKyAgICAgIG1UaW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZVVzKHRpbWVCZXR3ZWVuVGltZUxhcHNlRnJhbWVDYXB0dXJlVXMpLAorICAgICAgbVRpbWVCZXR3ZWVuVGltZUxhcHNlVmlkZW9GcmFtZXNVcygxRTYvdmlkZW9GcmFtZVJhdGUpLAorICAgICAgbUxhc3RUaW1lTGFwc2VGcmFtZVJlYWxUaW1lc3RhbXBVcygwKSwKKyAgICAgIG1Ta2lwQ3VycmVudEZyYW1lKGZhbHNlKSB7CisKKyAgICBMT0dWKCJzdGFydGluZyB0aW1lIGxhcHNlIG1vZGUiKTsKKyAgICBtVmlkZW9XaWR0aCA9IHdpZHRoOworICAgIG1WaWRlb0hlaWdodCA9IGhlaWdodDsKKyAgICBpZiAobVVzZVN0aWxsQ2FtZXJhRm9yVGltZUxhcHNlKSB7CisgICAgICAgIENIRUNLKHNldFBpY3R1cmVTaXplVG9DbG9zZXN0U3VwcG9ydGVkKHdpZHRoLCBoZWlnaHQpKTsKKyAgICAgICAgbU5lZWRDcm9wcGluZyA9IGNvbXB1dGVDcm9wUmVjdGFuZ2xlT2Zmc2V0KCk7CisgICAgICAgIG1NZXRhLT5zZXRJbnQzMihrS2V5V2lkdGgsIHdpZHRoKTsKKyAgICAgICAgbU1ldGEtPnNldEludDMyKGtLZXlIZWlnaHQsIGhlaWdodCk7CisgICAgfQorfQorCitDYW1lcmFTb3VyY2VUaW1lTGFwc2U6On5DYW1lcmFTb3VyY2VUaW1lTGFwc2UoKSB7Cit9CisKK2Jvb2wgQ2FtZXJhU291cmNlVGltZUxhcHNlOjpzZXRQaWN0dXJlU2l6ZVRvQ2xvc2VzdFN1cHBvcnRlZChpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCkgeworICAgIGludDY0X3QgdG9rZW4gPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5jbGVhckNhbGxpbmdJZGVudGl0eSgpOworICAgIFN0cmluZzggcyA9IG1DYW1lcmEtPmdldFBhcmFtZXRlcnMoKTsKKyAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KHRva2VuKTsKKworICAgIENhbWVyYVBhcmFtZXRlcnMgcGFyYW1zKHMpOworICAgIFZlY3RvcjxTaXplPiBzdXBwb3J0ZWRTaXplczsKKyAgICBwYXJhbXMuZ2V0U3VwcG9ydGVkUGljdHVyZVNpemVzKHN1cHBvcnRlZFNpemVzKTsKKworICAgIGludDMyX3QgbWluUGljdHVyZVNpemUgPSBJTlRfTUFYOworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBzdXBwb3J0ZWRTaXplcy5zaXplKCk7ICsraSkgeworICAgICAgICBpbnQzMl90IHBpY3R1cmVXaWR0aCA9IHN1cHBvcnRlZFNpemVzW2ldLndpZHRoOworICAgICAgICBpbnQzMl90IHBpY3R1cmVIZWlnaHQgPSBzdXBwb3J0ZWRTaXplc1tpXS5oZWlnaHQ7CisKKyAgICAgICAgaWYgKChwaWN0dXJlV2lkdGggPj0gd2lkdGgpICYmIChwaWN0dXJlSGVpZ2h0ID49IGhlaWdodCkpIHsKKyAgICAgICAgICAgIGludDMyX3QgcGljdHVyZVNpemUgPSBwaWN0dXJlV2lkdGgqcGljdHVyZUhlaWdodDsKKyAgICAgICAgICAgIGlmIChwaWN0dXJlU2l6ZSA8IG1pblBpY3R1cmVTaXplKSB7CisgICAgICAgICAgICAgICAgbWluUGljdHVyZVNpemUgPSBwaWN0dXJlU2l6ZTsKKyAgICAgICAgICAgICAgICBtUGljdHVyZVdpZHRoID0gcGljdHVyZVdpZHRoOworICAgICAgICAgICAgICAgIG1QaWN0dXJlSGVpZ2h0ID0gcGljdHVyZUhlaWdodDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBMT0dWKCJQaWN0dXJlIHNpemUgPSAoJWQsICVkKSIsIG1QaWN0dXJlV2lkdGgsIG1QaWN0dXJlSGVpZ2h0KTsKKyAgICByZXR1cm4gKG1pblBpY3R1cmVTaXplICE9IElOVF9NQVgpOworfQorCitib29sIENhbWVyYVNvdXJjZVRpbWVMYXBzZTo6Y29tcHV0ZUNyb3BSZWN0YW5nbGVPZmZzZXQoKSB7CisgICAgaWYgKChtUGljdHVyZVdpZHRoID09IG1WaWRlb1dpZHRoKSAmJiAobVBpY3R1cmVIZWlnaHQgPT0gbVZpZGVvSGVpZ2h0KSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQ0hFQ0soKG1QaWN0dXJlV2lkdGggPiBtVmlkZW9XaWR0aCkgJiYgKG1QaWN0dXJlSGVpZ2h0ID4gbVZpZGVvSGVpZ2h0KSk7CisKKyAgICBpbnQzMl90IHdpZHRoRGlmZmVyZW5jZSA9IG1QaWN0dXJlV2lkdGggLSBtVmlkZW9XaWR0aDsKKyAgICBpbnQzMl90IGhlaWdodERpZmZlcmVuY2UgPSBtUGljdHVyZUhlaWdodCAtIG1WaWRlb0hlaWdodDsKKworICAgIG1Dcm9wUmVjdFN0YXJ0WCA9IHdpZHRoRGlmZmVyZW5jZS8yOworICAgIG1Dcm9wUmVjdFN0YXJ0WSA9IGhlaWdodERpZmZlcmVuY2UvMjsKKworICAgIExPR1YoInNldHRpbmcgY3JvcCByZWN0YW5nbGUgb2Zmc2V0IHRvICglZCwgJWQpIiwgbUNyb3BSZWN0U3RhcnRYLCBtQ3JvcFJlY3RTdGFydFkpOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8vIHN0YXRpYwordm9pZCAqQ2FtZXJhU291cmNlVGltZUxhcHNlOjpUaHJlYWRUaW1lTGFwc2VXcmFwcGVyKHZvaWQgKm1lKSB7CisgICAgQ2FtZXJhU291cmNlVGltZUxhcHNlICpzb3VyY2UgPSBzdGF0aWNfY2FzdDxDYW1lcmFTb3VyY2VUaW1lTGFwc2UgKj4obWUpOworICAgIHNvdXJjZS0+dGhyZWFkVGltZUxhcHNlRW50cnkoKTsKKyAgICByZXR1cm4gTlVMTDsKK30KKwordm9pZCBDYW1lcmFTb3VyY2VUaW1lTGFwc2U6OnRocmVhZFRpbWVMYXBzZUVudHJ5KCkgeworICAgIHdoaWxlKG1TdGFydGVkKSB7CisgICAgICAgIGlmIChtQ2FtZXJhSWRsZSkgeworICAgICAgICAgICAgTE9HVigidGhyZWFkVGltZUxhcHNlRW50cnk6IHRha2luZyBwaWN0dXJlIik7CisgICAgICAgICAgICBDSEVDS19FUShPSywgbUNhbWVyYS0+dGFrZVBpY3R1cmUoKSk7CisgICAgICAgICAgICBtQ2FtZXJhSWRsZSA9IGZhbHNlOworICAgICAgICAgICAgdXNsZWVwKG1UaW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZVVzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExPR1YoInRocmVhZFRpbWVMYXBzZUVudHJ5OiBjYW1lcmEgYnVzeSB3aXRoIG9sZCB0YWtlUGljdHVyZS4gU2xlZXBpbmcgYSBsaXR0bGUuIik7CisgICAgICAgICAgICB1c2xlZXAoMUU0KTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBDYW1lcmFTb3VyY2VUaW1lTGFwc2U6OnN0YXJ0Q2FtZXJhUmVjb3JkaW5nKCkgeworICAgIGlmIChtVXNlU3RpbGxDYW1lcmFGb3JUaW1lTGFwc2UpIHsKKyAgICAgICAgTE9HVigic3RhcnQgdGltZSBsYXBzZSByZWNvcmRpbmcgdXNpbmcgc3RpbGwgY2FtZXJhIik7CisKKyAgICAgICAgaW50NjRfdCB0b2tlbiA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CisgICAgICAgIFN0cmluZzggcyA9IG1DYW1lcmEtPmdldFBhcmFtZXRlcnMoKTsKKyAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+cmVzdG9yZUNhbGxpbmdJZGVudGl0eSh0b2tlbik7CisKKyAgICAgICAgQ2FtZXJhUGFyYW1ldGVycyBwYXJhbXMocyk7CisgICAgICAgIHBhcmFtcy5zZXRQaWN0dXJlU2l6ZShtUGljdHVyZVdpZHRoLCBtUGljdHVyZUhlaWdodCk7CisgICAgICAgIG1DYW1lcmEtPnNldFBhcmFtZXRlcnMocGFyYW1zLmZsYXR0ZW4oKSk7CisgICAgICAgIG1DYW1lcmFJZGxlID0gdHJ1ZTsKKworICAgICAgICAvLyBjcmVhdGUgYSB0aHJlYWQgd2hpY2ggdGFrZXMgcGljdHVyZXMgaW4gYSBsb29wCisgICAgICAgIHB0aHJlYWRfYXR0cl90IGF0dHI7CisgICAgICAgIHB0aHJlYWRfYXR0cl9pbml0KCZhdHRyKTsKKyAgICAgICAgcHRocmVhZF9hdHRyX3NldGRldGFjaHN0YXRlKCZhdHRyLCBQVEhSRUFEX0NSRUFURV9KT0lOQUJMRSk7CisKKyAgICAgICAgcHRocmVhZF9jcmVhdGUoJm1UaHJlYWRUaW1lTGFwc2UsICZhdHRyLCBUaHJlYWRUaW1lTGFwc2VXcmFwcGVyLCB0aGlzKTsKKyAgICAgICAgcHRocmVhZF9hdHRyX2Rlc3Ryb3koJmF0dHIpOworICAgIH0gZWxzZSB7CisgICAgICAgIExPR1YoInN0YXJ0IHRpbWUgbGFwc2UgcmVjb3JkaW5nIHVzaW5nIHZpZGVvIGNhbWVyYSIpOworICAgICAgICBDSEVDS19FUShPSywgbUNhbWVyYS0+c3RhcnRSZWNvcmRpbmcoKSk7CisgICAgfQorfQorCit2b2lkIENhbWVyYVNvdXJjZVRpbWVMYXBzZTo6c3RvcENhbWVyYVJlY29yZGluZygpIHsKKyAgICBpZiAobVVzZVN0aWxsQ2FtZXJhRm9yVGltZUxhcHNlKSB7CisgICAgICAgIHZvaWQgKmR1bW15OworICAgICAgICBwdGhyZWFkX2pvaW4obVRocmVhZFRpbWVMYXBzZSwgJmR1bW15KTsKKyAgICAgICAgQ0hFQ0tfRVEoT0ssIG1DYW1lcmEtPnN0YXJ0UHJldmlldygpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtQ2FtZXJhLT5zdG9wUmVjb3JkaW5nKCk7CisgICAgfQorfQorCit2b2lkIENhbWVyYVNvdXJjZVRpbWVMYXBzZTo6cmVsZWFzZVJlY29yZGluZ0ZyYW1lKGNvbnN0IHNwPElNZW1vcnk+JiBmcmFtZSkgeworICAgIGlmICghbVVzZVN0aWxsQ2FtZXJhRm9yVGltZUxhcHNlKSB7CisgICAgICAgIG1DYW1lcmEtPnJlbGVhc2VSZWNvcmRpbmdGcmFtZShmcmFtZSk7CisgICAgfQorfQorCitzcDxJTWVtb3J5PiBDYW1lcmFTb3VyY2VUaW1lTGFwc2U6OmNyZWF0ZUlNZW1vcnlDb3B5KGNvbnN0IHNwPElNZW1vcnk+ICZzb3VyY2VfZGF0YSkgeworICAgIHNpemVfdCBzb3VyY2Vfc2l6ZSA9IHNvdXJjZV9kYXRhLT5zaXplKCk7CisgICAgdm9pZCogc291cmNlX3BvaW50ZXIgPSBzb3VyY2VfZGF0YS0+cG9pbnRlcigpOworCisgICAgc3A8TWVtb3J5SGVhcEJhc2U+IG5ld01lbW9yeUhlYXAgPSBuZXcgTWVtb3J5SGVhcEJhc2Uoc291cmNlX3NpemUpOworICAgIHNwPE1lbW9yeUJhc2U+IG5ld01lbW9yeSA9IG5ldyBNZW1vcnlCYXNlKG5ld01lbW9yeUhlYXAsIDAsIHNvdXJjZV9zaXplKTsKKyAgICBtZW1jcHkobmV3TWVtb3J5LT5wb2ludGVyKCksIHNvdXJjZV9wb2ludGVyLCBzb3VyY2Vfc2l6ZSk7CisgICAgcmV0dXJuIG5ld01lbW9yeTsKK30KKworLy8gQWxsb2NhdGVzIElNZW1vcnkgb2YgZmluYWwgdHlwZSBNZW1vcnlCYXNlIHdpdGggdGhlIGdpdmVuIHNpemUuCitzcDxJTWVtb3J5PiBhbGxvY2F0ZUlNZW1vcnkoc2l6ZV90IHNpemUpIHsKKyAgICBzcDxNZW1vcnlIZWFwQmFzZT4gbmV3TWVtb3J5SGVhcCA9IG5ldyBNZW1vcnlIZWFwQmFzZShzaXplKTsKKyAgICBzcDxNZW1vcnlCYXNlPiBuZXdNZW1vcnkgPSBuZXcgTWVtb3J5QmFzZShuZXdNZW1vcnlIZWFwLCAwLCBzaXplKTsKKyAgICByZXR1cm4gbmV3TWVtb3J5OworfQorCisvLyBzdGF0aWMKK3ZvaWQgKkNhbWVyYVNvdXJjZVRpbWVMYXBzZTo6VGhyZWFkU3RhcnRQcmV2aWV3V3JhcHBlcih2b2lkICptZSkgeworICAgIENhbWVyYVNvdXJjZVRpbWVMYXBzZSAqc291cmNlID0gc3RhdGljX2Nhc3Q8Q2FtZXJhU291cmNlVGltZUxhcHNlICo+KG1lKTsKKyAgICBzb3VyY2UtPnRocmVhZFN0YXJ0UHJldmlldygpOworICAgIHJldHVybiBOVUxMOworfQorCit2b2lkIENhbWVyYVNvdXJjZVRpbWVMYXBzZTo6dGhyZWFkU3RhcnRQcmV2aWV3KCkgeworICAgIENIRUNLX0VRKE9LLCBtQ2FtZXJhLT5zdGFydFByZXZpZXcoKSk7CisgICAgbUNhbWVyYUlkbGUgPSB0cnVlOworfQorCit2b2lkIENhbWVyYVNvdXJjZVRpbWVMYXBzZTo6cmVzdGFydFByZXZpZXcoKSB7CisgICAgLy8gU3RhcnQgdGhpcyBpbiBhIGRpZmZlcmVudCB0aHJlYWQsIHNvIHRoYXQgdGhlIGRhdGFDYWxsYmFjayBjYW4gcmV0dXJuCisgICAgTE9HVigicmVzdGFydFByZXZpZXciKTsKKyAgICBwdGhyZWFkX2F0dHJfdCBhdHRyOworICAgIHB0aHJlYWRfYXR0cl9pbml0KCZhdHRyKTsKKyAgICBwdGhyZWFkX2F0dHJfc2V0ZGV0YWNoc3RhdGUoJmF0dHIsIFBUSFJFQURfQ1JFQVRFX0RFVEFDSEVEKTsKKworICAgIHB0aHJlYWRfdCB0aHJlYWRQcmV2aWV3OworICAgIHB0aHJlYWRfY3JlYXRlKCZ0aHJlYWRQcmV2aWV3LCAmYXR0ciwgVGhyZWFkU3RhcnRQcmV2aWV3V3JhcHBlciwgdGhpcyk7CisgICAgcHRocmVhZF9hdHRyX2Rlc3Ryb3koJmF0dHIpOworfQorCitzcDxJTWVtb3J5PiBDYW1lcmFTb3VyY2VUaW1lTGFwc2U6OmNyb3BZVVZJbWFnZShjb25zdCBzcDxJTWVtb3J5PiAmc291cmNlX2RhdGEpIHsKKyAgICAvLyBmaW5kIHRoZSBZVVYgZm9ybWF0CisgICAgaW50MzJfdCBzcmNGb3JtYXQ7CisgICAgQ0hFQ0sobU1ldGEtPmZpbmRJbnQzMihrS2V5Q29sb3JGb3JtYXQsICZzcmNGb3JtYXQpKTsKKyAgICBZVVZJbWFnZTo6WVVWRm9ybWF0IHl1dkZvcm1hdDsKKyAgICBpZiAoc3JjRm9ybWF0ID09IE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyKSB7CisgICAgICAgIHl1dkZvcm1hdCA9IFlVVkltYWdlOjpZVVY0MjBTZW1pUGxhbmFyOworICAgIH0gZWxzZSBpZiAoc3JjRm9ybWF0ID09IE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIpIHsKKyAgICAgICAgeXV2Rm9ybWF0ID0gWVVWSW1hZ2U6OllVVjQyMFBsYW5hcjsKKyAgICB9CisKKyAgICAvLyBhbGxvY2F0ZSBtZW1vcnkgZm9yIGNyb3BwZWQgaW1hZ2UgYW5kIHNldHVwIGEgY2FudmFzIHVzaW5nIGl0LgorICAgIHNwPElNZW1vcnk+IGNyb3BwZWRJbWFnZU1lbW9yeSA9IGFsbG9jYXRlSU1lbW9yeSgKKyAgICAgICAgICAgIFlVVkltYWdlOjpidWZmZXJTaXplKHl1dkZvcm1hdCwgbVZpZGVvV2lkdGgsIG1WaWRlb0hlaWdodCkpOworICAgIFlVVkltYWdlIHl1dkltYWdlQ3JvcHBlZCh5dXZGb3JtYXQsCisgICAgICAgICAgICBtVmlkZW9XaWR0aCwgbVZpZGVvSGVpZ2h0LAorICAgICAgICAgICAgKHVpbnQ4X3QgKiljcm9wcGVkSW1hZ2VNZW1vcnktPnBvaW50ZXIoKSk7CisgICAgWVVWQ2FudmFzIHl1dkNhbnZhc0Nyb3AoeXV2SW1hZ2VDcm9wcGVkKTsKKworICAgIFlVVkltYWdlIHl1dkltYWdlU291cmNlKHl1dkZvcm1hdCwKKyAgICAgICAgICAgIG1QaWN0dXJlV2lkdGgsIG1QaWN0dXJlSGVpZ2h0LAorICAgICAgICAgICAgKHVpbnQ4X3QgKilzb3VyY2VfZGF0YS0+cG9pbnRlcigpKTsKKyAgICB5dXZDYW52YXNDcm9wLkNvcHlJbWFnZVJlY3QoCisgICAgICAgICAgICBSZWN0KG1Dcm9wUmVjdFN0YXJ0WCwgbUNyb3BSZWN0U3RhcnRZLAorICAgICAgICAgICAgICAgIG1Dcm9wUmVjdFN0YXJ0WCArIG1WaWRlb1dpZHRoLAorICAgICAgICAgICAgICAgIG1Dcm9wUmVjdFN0YXJ0WSArIG1WaWRlb0hlaWdodCksCisgICAgICAgICAgICAwLCAwLAorICAgICAgICAgICAgeXV2SW1hZ2VTb3VyY2UpOworCisgICAgcmV0dXJuIGNyb3BwZWRJbWFnZU1lbW9yeTsKK30KKwordm9pZCBDYW1lcmFTb3VyY2VUaW1lTGFwc2U6OmRhdGFDYWxsYmFjayhpbnQzMl90IG1zZ1R5cGUsIGNvbnN0IHNwPElNZW1vcnk+ICZkYXRhKSB7CisgICAgaWYgKG1zZ1R5cGUgPT0gQ0FNRVJBX01TR19DT01QUkVTU0VEX0lNQUdFKSB7CisgICAgICAgIC8vIHRha2VQaWN0dXJlIHdpbGwgY29tcGxldGUgYWZ0ZXIgdGhpcyBjYWxsYmFjaywgc28gcmVzdGFydCBwcmV2aWV3LgorICAgICAgICByZXN0YXJ0UHJldmlldygpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChtc2dUeXBlICE9IENBTUVSQV9NU0dfUkFXX0lNQUdFKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBMT0dWKCJkYXRhQ2FsbGJhY2sgZm9yIHRpbWVsYXBzZSBzdGlsbCBmcmFtZSIpOworICAgIENIRUNLX0VRKHRydWUsIG1Vc2VTdGlsbENhbWVyYUZvclRpbWVMYXBzZSk7CisKKyAgICBpbnQ2NF90IHRpbWVzdGFtcFVzOworICAgIGlmIChtTnVtRnJhbWVzUmVjZWl2ZWQgPT0gMCkgeworICAgICAgICB0aW1lc3RhbXBVcyA9IG1TdGFydFRpbWVVczsKKyAgICB9IGVsc2UgeworICAgICAgICB0aW1lc3RhbXBVcyA9IG1MYXN0RnJhbWVUaW1lc3RhbXBVcyArIG1UaW1lQmV0d2VlblRpbWVMYXBzZVZpZGVvRnJhbWVzVXM7CisgICAgfQorCisgICAgaWYgKG1OZWVkQ3JvcHBpbmcpIHsKKyAgICAgICAgc3A8SU1lbW9yeT4gY3JvcHBlZEltYWdlRGF0YSA9IGNyb3BZVVZJbWFnZShkYXRhKTsKKyAgICAgICAgZGF0YUNhbGxiYWNrVGltZXN0YW1wKHRpbWVzdGFtcFVzLCBtc2dUeXBlLCBjcm9wcGVkSW1hZ2VEYXRhKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzcDxJTWVtb3J5PiBkYXRhQ29weSA9IGNyZWF0ZUlNZW1vcnlDb3B5KGRhdGEpOworICAgICAgICBkYXRhQ2FsbGJhY2tUaW1lc3RhbXAodGltZXN0YW1wVXMsIG1zZ1R5cGUsIGRhdGFDb3B5KTsKKyAgICB9Cit9CisKK2Jvb2wgQ2FtZXJhU291cmNlVGltZUxhcHNlOjpza2lwQ3VycmVudEZyYW1lKGludDY0X3QgdGltZXN0YW1wVXMpIHsKKyAgICBpZiAobVNraXBDdXJyZW50RnJhbWUpIHsKKyAgICAgICAgbVNraXBDdXJyZW50RnJhbWUgPSBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK30KKworYm9vbCBDYW1lcmFTb3VyY2VUaW1lTGFwc2U6OnNraXBGcmFtZUFuZE1vZGlmeVRpbWVTdGFtcChpbnQ2NF90ICp0aW1lc3RhbXBVcykgeworICAgIGlmICghbVVzZVN0aWxsQ2FtZXJhRm9yVGltZUxhcHNlKSB7CisgICAgICAgIGlmIChtTGFzdFRpbWVMYXBzZUZyYW1lUmVhbFRpbWVzdGFtcFVzID09IDApIHsKKyAgICAgICAgICAgIC8vIEZpcnN0IHRpbWUgbGFwc2UgZnJhbWUuIEluaXRpYWxpemUgbUxhc3RUaW1lTGFwc2VGcmFtZVJlYWxUaW1lc3RhbXBVcworICAgICAgICAgICAgLy8gdG8gY3VycmVudCB0aW1lICh0aW1lc3RhbXBVcykgYW5kIHNhdmUgZnJhbWUgZGF0YS4KKyAgICAgICAgICAgIExPR1YoImRhdGFDYWxsYmFja1RpbWVzdGFtcCB0aW1lbGFwc2U6IGluaXRpYWwgZnJhbWUiKTsKKworICAgICAgICAgICAgbUxhc3RUaW1lTGFwc2VGcmFtZVJlYWxUaW1lc3RhbXBVcyA9ICp0aW1lc3RhbXBVczsKKyAgICAgICAgfSBlbHNlIGlmICgqdGltZXN0YW1wVXMgPAorICAgICAgICAgICAgICAgIChtTGFzdFRpbWVMYXBzZUZyYW1lUmVhbFRpbWVzdGFtcFVzICsgbVRpbWVCZXR3ZWVuVGltZUxhcHNlRnJhbWVDYXB0dXJlVXMpKSB7CisgICAgICAgICAgICAvLyBTa2lwIGFsbCBmcmFtZXMgZnJvbSBsYXN0IGVuY29kZWQgZnJhbWUgdW50aWwKKyAgICAgICAgICAgIC8vIHN1ZmZpY2llbnQgdGltZSAobVRpbWVCZXR3ZWVuVGltZUxhcHNlRnJhbWVDYXB0dXJlVXMpIGhhcyBwYXNzZWQuCisgICAgICAgICAgICAvLyBUZWxsIHRoZSBjYW1lcmEgdG8gcmVsZWFzZSBpdHMgcmVjb3JkaW5nIGZyYW1lIGFuZCByZXR1cm4uCisgICAgICAgICAgICBMT0dWKCJkYXRhQ2FsbGJhY2tUaW1lc3RhbXAgdGltZWxhcHNlOiBza2lwcGluZyBpbnRlcm1lZGlhdGUgZnJhbWUiKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gRGVzaXJlZCBmcmFtZSBoYXMgYXJyaXZlZCBhZnRlciBtVGltZUJldHdlZW5UaW1lTGFwc2VGcmFtZUNhcHR1cmVVcyB0aW1lOgorICAgICAgICAgICAgLy8gLSBSZXNldCBtTGFzdFRpbWVMYXBzZUZyYW1lUmVhbFRpbWVzdGFtcFVzIHRvIGN1cnJlbnQgdGltZS4KKyAgICAgICAgICAgIC8vIC0gQXJ0aWZpY2lhbGx5IG1vZGlmeSB0aW1lc3RhbXBVcyB0byBiZSBvbmUgZnJhbWUgdGltZSAoMS9mcmFtZXJhdGUpIGFoZWFkCisgICAgICAgICAgICAvLyBvZiB0aGUgbGFzdCBlbmNvZGVkIGZyYW1lJ3MgdGltZSBzdGFtcC4KKyAgICAgICAgICAgIExPR1YoImRhdGFDYWxsYmFja1RpbWVzdGFtcCB0aW1lbGFwc2U6IGdvdCB0aW1lbGFwc2UgZnJhbWUiKTsKKworICAgICAgICAgICAgbUxhc3RUaW1lTGFwc2VGcmFtZVJlYWxUaW1lc3RhbXBVcyA9ICp0aW1lc3RhbXBVczsKKyAgICAgICAgICAgICp0aW1lc3RhbXBVcyA9IG1MYXN0RnJhbWVUaW1lc3RhbXBVcyArIG1UaW1lQmV0d2VlblRpbWVMYXBzZVZpZGVvRnJhbWVzVXM7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIENhbWVyYVNvdXJjZVRpbWVMYXBzZTo6ZGF0YUNhbGxiYWNrVGltZXN0YW1wKGludDY0X3QgdGltZXN0YW1wVXMsIGludDMyX3QgbXNnVHlwZSwKKyAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+ICZkYXRhKSB7CisgICAgaWYgKCFtVXNlU3RpbGxDYW1lcmFGb3JUaW1lTGFwc2UpIHsKKyAgICAgICAgbVNraXBDdXJyZW50RnJhbWUgPSBza2lwRnJhbWVBbmRNb2RpZnlUaW1lU3RhbXAoJnRpbWVzdGFtcFVzKTsKKyAgICB9CisgICAgQ2FtZXJhU291cmNlOjpkYXRhQ2FsbGJhY2tUaW1lc3RhbXAodGltZXN0YW1wVXMsIG1zZ1R5cGUsIGRhdGEpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTnVIVFRQRGF0YVNvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9OdUhUVFBEYXRhU291cmNlLmNwcAppbmRleCBhYjkyODVkLi4zMzJiYWIzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9OdUhUVFBEYXRhU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9OdUhUVFBEYXRhU291cmNlLmNwcApAQCAtNDIsNyArNDIsNyBAQAogICAgICAgICBwYXRoLT5zZXRUbyhzbGFzaFBvcyk7CiAgICAgfQogCi0gICAgY2hhciAqY29sb25Qb3MgPSBzdHJjaHIoaG9zdC0+c3RyaW5nKCksICc6Jyk7CisgICAgY29uc3QgY2hhciAqY29sb25Qb3MgPSBzdHJjaHIoaG9zdC0+c3RyaW5nKCksICc6Jyk7CiAKICAgICBpZiAoY29sb25Qb3MgIT0gTlVMTCkgewogICAgICAgICB1bnNpZ25lZCBsb25nIHg7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9PTVhDb2RlYy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9PTVhDb2RlYy5jcHAKaW5kZXggNDc0MWIxZC4uYjM5MTU3ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT01YQ29kZWMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L09NWENvZGVjLmNwcApAQCAtMTQ2LDI5ICsxNDYsMzYgQEAKIAogc3RhdGljIGNvbnN0IENvZGVjSW5mbyBrRGVjb2RlckluZm9bXSA9IHsKICAgICB7IE1FRElBX01JTUVUWVBFX0lNQUdFX0pQRUcsICJPTVguVEkuSlBFRy5kZWNvZGUiIH0sCisgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHLCAiT01YLk52aWRpYS5tcDMuZGVjb2RlciIgfSwKIC8vICAgIHsgTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFRywgIk9NWC5USS5NUDMuZGVjb2RlIiB9LAogICAgIHsgTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFRywgIk1QM0RlY29kZXIiIH0sCiAvLyAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX01QRUcsICJPTVguUFYubXAzZGVjIiB9LAogLy8gICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfTkIsICJPTVguVEkuQU1SLmRlY29kZSIgfSwKKyAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9OQiwgIk9NWC5OdmlkaWEuYW1yLmRlY29kZXIiIH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfTkIsICJBTVJOQkRlY29kZXIiIH0sCiAvLyAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9OQiwgIk9NWC5QVi5hbXJkZWMiIH0sCisgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfTkIsICJPTVguTnZpZGlhLmFtcndiLmRlY29kZXIiIH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfV0IsICJPTVguVEkuV0JBTVIuZGVjb2RlIiB9LAogICAgIHsgTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX1dCLCAiQU1SV0JEZWNvZGVyIiB9LAogLy8gICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfV0IsICJPTVguUFYuYW1yZGVjIiB9LAorICAgIHsgTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDLCAiT01YLk52aWRpYS5hYWMuZGVjb2RlciIgfSwKICAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX0FBQywgIk9NWC5USS5BQUMuZGVjb2RlIiB9LAogICAgIHsgTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDLCAiQUFDRGVjb2RlciIgfSwKIC8vICAgIHsgTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDLCAiT01YLlBWLmFhY2RlYyIgfSwKICAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX0c3MTFfQUxBVywgIkc3MTFEZWNvZGVyIiB9LAogICAgIHsgTUVESUFfTUlNRVRZUEVfQVVESU9fRzcxMV9NTEFXLCAiRzcxMURlY29kZXIiIH0sCisgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCwgIk9NWC5OdmlkaWEubXA0LmRlY29kZSIgfSwKICAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0LCAiT01YLnFjb20uN3gzMC52aWRlby5kZWNvZGVyLm1wZWc0IiB9LAogICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQsICJPTVgucWNvbS52aWRlby5kZWNvZGVyLm1wZWc0IiB9LAogICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQsICJPTVguVEkuVmlkZW8uRGVjb2RlciIgfSwKICAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0LCAiTTR2SDI2M0RlY29kZXIiIH0sCiAvLyAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0LCAiT01YLlBWLm1wZWc0ZGVjIiB9LAorICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fSDI2MywgIk9NWC5OdmlkaWEuaDI2My5kZWNvZGUiIH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19IMjYzLCAiT01YLnFjb20uN3gzMC52aWRlby5kZWNvZGVyLmgyNjMiIH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19IMjYzLCAiT01YLnFjb20udmlkZW8uZGVjb2Rlci5oMjYzIiB9LAogICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fSDI2MywgIk00dkgyNjNEZWNvZGVyIiB9LAogLy8gICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19IMjYzLCAiT01YLlBWLmgyNjNkZWMiIH0sCisgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMsICJPTVguTnZpZGlhLmgyNjQuZGVjb2RlIiB9LAogICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDLCAiT01YLnFjb20uN3gzMC52aWRlby5kZWNvZGVyLmF2YyIgfSwKICAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQywgIk9NWC5xY29tLnZpZGVvLmRlY29kZXIuYXZjIiB9LAogICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDLCAiT01YLlRJLlZpZGVvLkRlY29kZXIiIH0sCkBAIC0xOTksNiArMjA2LDcgQEAKICAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQywgIk9NWC5xY29tLjd4MzAudmlkZW8uZW5jb2Rlci5hdmMiIH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMsICJPTVgucWNvbS52aWRlby5lbmNvZGVyLmF2YyIgfSwKICAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQywgIk9NWC5USS5WaWRlby5lbmNvZGVyIiB9LAorICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDLCAiT01YLk52aWRpYS5oMjY0LmVuY29kZXIiIH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMsICJBVkNFbmNvZGVyIiB9LAogLy8gICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMsICJPTVguUFYuYXZjZW5jIiB9LAogfTsKQEAgLTMzNyw2ICszNDUsMTMgQEAKIHVpbnQzMl90IE9NWENvZGVjOjpnZXRDb21wb25lbnRRdWlya3MoY29uc3QgY2hhciAqY29tcG9uZW50TmFtZSkgewogICAgIHVpbnQzMl90IHF1aXJrcyA9IDA7CiAKKyAgICBpZiAoIXN0cmNtcChjb21wb25lbnROYW1lLCAiT01YLk52aWRpYS5hbXIuZGVjb2RlciIpIHx8CisgICAgICAgICAhc3RyY21wKGNvbXBvbmVudE5hbWUsICJPTVguTnZpZGlhLmFtcndiLmRlY29kZXIiKSB8fAorICAgICAgICAgIXN0cmNtcChjb21wb25lbnROYW1lLCAiT01YLk52aWRpYS5hYWMuZGVjb2RlciIpIHx8CisgICAgICAgICAhc3RyY21wKGNvbXBvbmVudE5hbWUsICJPTVguTnZpZGlhLm1wMy5kZWNvZGVyIikpIHsKKyAgICAgICAgcXVpcmtzIHw9IGtEZWNvZGVyTGllc0Fib3V0TnVtYmVyT2ZDaGFubmVsczsKKyAgICB9CisKICAgICBpZiAoIXN0cmNtcChjb21wb25lbnROYW1lLCAiT01YLlBWLmF2Y2RlYyIpKSB7CiAgICAgICAgIHF1aXJrcyB8PSBrV2FudHNOQUxGcmFnbWVudHM7CiAgICAgfQpAQCAtODU0LDYgKzg2OSwxMCBAQAogICAgIE9NWF9DT0xPUl9GT1JNQVRUWVBFIGNvbG9yRm9ybWF0OwogICAgIENIRUNLX0VRKE9LLCBmaW5kVGFyZ2V0Q29sb3JGb3JtYXQobWV0YSwgJmNvbG9yRm9ybWF0KSk7CiAKKyAgICBpZiAoIXN0cmNhc2VjbXAoIk9NWC5OdmlkaWEuaDI2NC5lbmNvZGVyIiwgbUNvbXBvbmVudE5hbWUpKSB7CisgICAgICAgIGNvbG9yRm9ybWF0ID0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcjsKKyAgICB9CisKICAgICBzdGF0dXNfdCBlcnI7CiAgICAgT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSBkZWY7CiAgICAgT01YX1ZJREVPX1BPUlRERUZJTklUSU9OVFlQRSAqdmlkZW9fZGVmID0gJmRlZi5mb3JtYXQudmlkZW87CkBAIC0xMTkzLDYgKzEyMTIsMTAgQEAKICAgICBoMjY0dHlwZS5iTUJBRkYgPSBPTVhfRkFMU0U7CiAgICAgaDI2NHR5cGUuZUxvb3BGaWx0ZXJNb2RlID0gT01YX1ZJREVPX0FWQ0xvb3BGaWx0ZXJFbmFibGU7CiAKKyAgICBpZiAoIXN0cmNhc2VjbXAoIk9NWC5OdmlkaWEuaDI2NC5lbmNvZGVyIiwgbUNvbXBvbmVudE5hbWUpKSB7CisgICAgICAgIGgyNjR0eXBlLmVMZXZlbCA9IE9NWF9WSURFT19BVkNMZXZlbE1heDsKKyAgICB9CisKICAgICBlcnIgPSBtT01YLT5zZXRQYXJhbWV0ZXIoCiAgICAgICAgICAgICBtTm9kZSwgT01YX0luZGV4UGFyYW1WaWRlb0F2YywgJmgyNjR0eXBlLCBzaXplb2YoaDI2NHR5cGUpKTsKICAgICBDSEVDS19FUShlcnIsIE9LKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvbG9yY29udmVyc2lvbi9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29sb3Jjb252ZXJzaW9uL0FuZHJvaWQubWsKaW5kZXggYjliYTFiZS4uMmI2MzIzNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29sb3Jjb252ZXJzaW9uL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29sb3Jjb252ZXJzaW9uL0FuZHJvaWQubWsKQEAgLTYsNyArNiw4IEBACiAgICAgICAgIFNvZnR3YXJlUmVuZGVyZXIuY3BwCiAKIExPQ0FMX0NfSU5DTFVERVMgOj0gXAotICAgICAgICAkKFRPUCkvZXh0ZXJuYWwvb3BlbmNvcmUvZXh0ZXJuX2xpYnNfdjIva2hyb25vcy9vcGVubWF4L2luY2x1ZGUKKyAgICAgICAgJChUT1ApL2V4dGVybmFsL29wZW5jb3JlL2V4dGVybl9saWJzX3YyL2tocm9ub3Mvb3Blbm1heC9pbmNsdWRlIFwKKyAgICAgICAgJChUT1ApL2hhcmR3YXJlL21zbTdrCiAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gICAgICAgXAogICAgICAgICBsaWJiaW5kZXIgICAgICAgICAgICAgICBcCkBAIC0xNyw2ICsxOCwxMSBAQAogICAgICAgICBsaWJzdXJmYWNlZmxpbmdlcl9jbGllbnRcCiAgICAgICAgIGxpYmNhbWVyYV9jbGllbnQKIAorIyBpZmVxICgkKFRBUkdFVF9CT0FSRF9QTEFURk9STSksbXNtN2spCitpZmVxICgkKFRBUkdFVF9QUk9EVUNUKSxwYXNzaW9uKQorCUxPQ0FMX0NGTEFHUyArPSAtREhBU19ZQ0JDUjQyMF9TUF9BRFJFTk8KK2VuZGlmCisKIExPQ0FMX01PRFVMRTo9IGxpYnN0YWdlZnJpZ2h0X2NvbG9yX2NvbnZlcnNpb24KIAogaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29sb3Jjb252ZXJzaW9uL1NvZnR3YXJlUmVuZGVyZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29sb3Jjb252ZXJzaW9uL1NvZnR3YXJlUmVuZGVyZXIuY3BwCmluZGV4IGE2ZGJmNjkuLjUwN2ZhNWEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvbG9yY29udmVyc2lvbi9Tb2Z0d2FyZVJlbmRlcmVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2xvcmNvbnZlcnNpb24vU29mdHdhcmVSZW5kZXJlci5jcHAKQEAgLTIyLDY1ICsyMiwxNzIgQEAKICNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5SGVhcEJhc2UuaD4KICNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5SGVhcFBtZW0uaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlYnVnLmg+Ci0jaW5jbHVkZSA8c3VyZmFjZWZsaW5nZXIvSVN1cmZhY2UuaD4KKyNpbmNsdWRlIDxzdXJmYWNlZmxpbmdlci9TdXJmYWNlLmg+CisjaW5jbHVkZSA8dWkvYW5kcm9pZF9uYXRpdmVfYnVmZmVyLmg+CisjaW5jbHVkZSA8dWkvR3JhcGhpY0J1ZmZlck1hcHBlci5oPgorCisvLyBYWFg6IFRlbXBvcmFyeSBoYWNrIHRvIGFsbG93IHJlZmVyZW5jaW5nIHRoZSBfQURSRU5PIHBpeGVsIGZvcm1hdCBoZXJlLgorI2luY2x1ZGUgPGxpYmdyYWxsb2MtcXNkOGsvZ3JhbGxvY19wcml2Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogU29mdHdhcmVSZW5kZXJlcjo6U29mdHdhcmVSZW5kZXJlcigKICAgICAgICAgT01YX0NPTE9SX0ZPUk1BVFRZUEUgY29sb3JGb3JtYXQsCi0gICAgICAgIGNvbnN0IHNwPElTdXJmYWNlPiAmc3VyZmFjZSwKKyAgICAgICAgY29uc3Qgc3A8U3VyZmFjZT4gJnN1cmZhY2UsCiAgICAgICAgIHNpemVfdCBkaXNwbGF5V2lkdGgsIHNpemVfdCBkaXNwbGF5SGVpZ2h0LAogICAgICAgICBzaXplX3QgZGVjb2RlZFdpZHRoLCBzaXplX3QgZGVjb2RlZEhlaWdodCkKICAgICA6IG1Db2xvckZvcm1hdChjb2xvckZvcm1hdCksCi0gICAgICBtQ29udmVydGVyKGNvbG9yRm9ybWF0LCBPTVhfQ09MT1JfRm9ybWF0MTZiaXRSR0I1NjUpLAotICAgICAgbUlTdXJmYWNlKHN1cmZhY2UpLAorICAgICAgbUNvbnZlcnRlcihOVUxMKSwKKyAgICAgIG1ZVVZNb2RlKE5vbmUpLAorICAgICAgbVN1cmZhY2Uoc3VyZmFjZSksCiAgICAgICBtRGlzcGxheVdpZHRoKGRpc3BsYXlXaWR0aCksCiAgICAgICBtRGlzcGxheUhlaWdodChkaXNwbGF5SGVpZ2h0KSwKICAgICAgIG1EZWNvZGVkV2lkdGgoZGVjb2RlZFdpZHRoKSwKLSAgICAgIG1EZWNvZGVkSGVpZ2h0KGRlY29kZWRIZWlnaHQpLAotICAgICAgbUZyYW1lU2l6ZShtRGVjb2RlZFdpZHRoICogbURlY29kZWRIZWlnaHQgKiAyKSwgIC8vIFJHQjU2NQotICAgICAgbUluZGV4KDApIHsKLSAgICBtTWVtb3J5SGVhcCA9IG5ldyBNZW1vcnlIZWFwQmFzZSgiL2Rldi9wbWVtX2Fkc3AiLCAyICogbUZyYW1lU2l6ZSk7Ci0gICAgaWYgKG1NZW1vcnlIZWFwLT5oZWFwSUQoKSA8IDApIHsKLSAgICAgICAgTE9HSSgiQ3JlYXRpbmcgcGh5c2ljYWwgbWVtb3J5IGhlYXAgZmFpbGVkLCByZXZlcnRpbmcgdG8gcmVndWxhciBoZWFwLiIpOwotICAgICAgICBtTWVtb3J5SGVhcCA9IG5ldyBNZW1vcnlIZWFwQmFzZSgyICogbUZyYW1lU2l6ZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc3A8TWVtb3J5SGVhcFBtZW0+IHBtZW1IZWFwID0gbmV3IE1lbW9yeUhlYXBQbWVtKG1NZW1vcnlIZWFwKTsKLSAgICAgICAgcG1lbUhlYXAtPnNsYXAoKTsKLSAgICAgICAgbU1lbW9yeUhlYXAgPSBwbWVtSGVhcDsKKyAgICAgIG1EZWNvZGVkSGVpZ2h0KGRlY29kZWRIZWlnaHQpIHsKKyAgICBMT0dJKCJpbnB1dCBmb3JtYXQgPSAlZCIsIG1Db2xvckZvcm1hdCk7CisgICAgTE9HSSgiZGlzcGxheSA9ICVkIHggJWQsIGRlY29kZWQgPSAlZCB4ICVkIiwKKyAgICAgICAgICAgIG1EaXNwbGF5V2lkdGgsIG1EaXNwbGF5SGVpZ2h0LCBtRGVjb2RlZFdpZHRoLCBtRGVjb2RlZEhlaWdodCk7CisKKyAgICBpbnQgaGFsRm9ybWF0OworICAgIHN3aXRjaCAobUNvbG9yRm9ybWF0KSB7CisjaWYgSEFTX1lDQkNSNDIwX1NQX0FEUkVOTworICAgICAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXI6CisgICAgICAgIHsKKyAgICAgICAgICAgIGhhbEZvcm1hdCA9IEhBTF9QSVhFTF9GT1JNQVRfWUNyQ2JfNDIwX1NQX0FEUkVOTzsKKyAgICAgICAgICAgIG1ZVVZNb2RlID0gWVVWNDIwVG9ZVVY0MjBzcDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSAweDdmYTMwYzAwOgorICAgICAgICB7CisgICAgICAgICAgICBoYWxGb3JtYXQgPSBIQUxfUElYRUxfRk9STUFUX1lDckNiXzQyMF9TUF9BRFJFTk87CisgICAgICAgICAgICBtWVVWTW9kZSA9IFlVVjQyMHNwVG9ZVVY0MjBzcDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisjZW5kaWYKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgaGFsRm9ybWF0ID0gSEFMX1BJWEVMX0ZPUk1BVF9SR0JfNTY1OworCisgICAgICAgICAgICBtQ29udmVydGVyID0gbmV3IENvbG9yQ29udmVydGVyKAorICAgICAgICAgICAgICAgICAgICBtQ29sb3JGb3JtYXQsIE9NWF9DT0xPUl9Gb3JtYXQxNmJpdFJHQjU2NSk7CisgICAgICAgICAgICBDSEVDSyhtQ29udmVydGVyLT5pc1ZhbGlkKCkpOworICAgICAgICAgICAgYnJlYWs7CiAgICAgfQogCi0gICAgQ0hFQ0sobUlTdXJmYWNlLmdldCgpICE9IE5VTEwpOworICAgIENIRUNLKG1TdXJmYWNlLmdldCgpICE9IE5VTEwpOwogICAgIENIRUNLKG1EZWNvZGVkV2lkdGggPiAwKTsKICAgICBDSEVDSyhtRGVjb2RlZEhlaWdodCA+IDApOwotICAgIENIRUNLKG1NZW1vcnlIZWFwLT5oZWFwSUQoKSA+PSAwKTsKLSAgICBDSEVDSyhtQ29udmVydGVyLmlzVmFsaWQoKSk7CisgICAgQ0hFQ0sobUNvbnZlcnRlciA9PSBOVUxMIHx8IG1Db252ZXJ0ZXItPmlzVmFsaWQoKSk7CiAKLSAgICBJU3VyZmFjZTo6QnVmZmVySGVhcCBidWZmZXJIZWFwKAotICAgICAgICAgICAgbURpc3BsYXlXaWR0aCwgbURpc3BsYXlIZWlnaHQsCi0gICAgICAgICAgICBtRGVjb2RlZFdpZHRoLCBtRGVjb2RlZEhlaWdodCwKLSAgICAgICAgICAgIFBJWEVMX0ZPUk1BVF9SR0JfNTY1LAotICAgICAgICAgICAgbU1lbW9yeUhlYXApOworICAgIENIRUNLX0VRKDAsCisgICAgICAgICAgICBuYXRpdmVfd2luZG93X3NldF91c2FnZSgKKyAgICAgICAgICAgIG1TdXJmYWNlLmdldCgpLAorICAgICAgICAgICAgR1JBTExPQ19VU0FHRV9TV19SRUFEX05FVkVSIHwgR1JBTExPQ19VU0FHRV9TV19XUklURV9PRlRFTgorICAgICAgICAgICAgfCBHUkFMTE9DX1VTQUdFX0hXX1RFWFRVUkUpKTsKIAotICAgIHN0YXR1c190IGVyciA9IG1JU3VyZmFjZS0+cmVnaXN0ZXJCdWZmZXJzKGJ1ZmZlckhlYXApOwotICAgIENIRUNLX0VRKGVyciwgT0spOworICAgIENIRUNLX0VRKDAsIG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcl9jb3VudChtU3VyZmFjZS5nZXQoKSwgMikpOworCisgICAgLy8gV2lkdGggbXVzdCBiZSBtdWx0aXBsZSBvZiAzMj8/PworICAgIENIRUNLX0VRKDAsIG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfZ2VvbWV0cnkoCisgICAgICAgICAgICAgICAgbVN1cmZhY2UuZ2V0KCksIG1EZWNvZGVkV2lkdGgsIG1EZWNvZGVkSGVpZ2h0LAorICAgICAgICAgICAgICAgIGhhbEZvcm1hdCkpOwogfQogCiBTb2Z0d2FyZVJlbmRlcmVyOjp+U29mdHdhcmVSZW5kZXJlcigpIHsKLSAgICBtSVN1cmZhY2UtPnVucmVnaXN0ZXJCdWZmZXJzKCk7CisgICAgZGVsZXRlIG1Db252ZXJ0ZXI7CisgICAgbUNvbnZlcnRlciA9IE5VTEw7Cit9CisKK3N0YXRpYyBpbmxpbmUgc2l6ZV90IEFMSUdOKHNpemVfdCB4LCBzaXplX3QgYWxpZ25tZW50KSB7CisgICAgcmV0dXJuICh4ICsgYWxpZ25tZW50IC0gMSkgJiB+KGFsaWdubWVudCAtIDEpOwogfQogCiB2b2lkIFNvZnR3YXJlUmVuZGVyZXI6OnJlbmRlcigKICAgICAgICAgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUsIHZvaWQgKnBsYXRmb3JtUHJpdmF0ZSkgewotICAgIHNpemVfdCBvZmZzZXQgPSBtSW5kZXggKiBtRnJhbWVTaXplOwotICAgIHZvaWQgKmRzdCA9ICh1aW50OF90ICopbU1lbW9yeUhlYXAtPmdldEJhc2UoKSArIG9mZnNldDsKKyAgICBhbmRyb2lkX25hdGl2ZV9idWZmZXJfdCAqYnVmOworICAgIENIRUNLX0VRKDAsIG1TdXJmYWNlLT5kZXF1ZXVlQnVmZmVyKG1TdXJmYWNlLmdldCgpLCAmYnVmKSk7CisgICAgQ0hFQ0tfRVEoMCwgbVN1cmZhY2UtPmxvY2tCdWZmZXIobVN1cmZhY2UuZ2V0KCksIGJ1ZikpOwogCi0gICAgbUNvbnZlcnRlci5jb252ZXJ0KAotICAgICAgICAgICAgbURlY29kZWRXaWR0aCwgbURlY29kZWRIZWlnaHQsCi0gICAgICAgICAgICBkYXRhLCAwLCBkc3QsIDIgKiBtRGVjb2RlZFdpZHRoKTsKKyAgICBHcmFwaGljQnVmZmVyTWFwcGVyICZtYXBwZXIgPSBHcmFwaGljQnVmZmVyTWFwcGVyOjpnZXQoKTsKIAotICAgIG1JU3VyZmFjZS0+cG9zdEJ1ZmZlcihvZmZzZXQpOwotICAgIG1JbmRleCA9IDEgLSBtSW5kZXg7CisgICAgUmVjdCBib3VuZHMobURlY29kZWRXaWR0aCwgbURlY29kZWRIZWlnaHQpOworCisgICAgdm9pZCAqZHN0OworICAgIENIRUNLX0VRKDAsIG1hcHBlci5sb2NrKAorICAgICAgICAgICAgICAgIGJ1Zi0+aGFuZGxlLCBHUkFMTE9DX1VTQUdFX1NXX1dSSVRFX09GVEVOLCBib3VuZHMsICZkc3QpKTsKKworICAgIGlmIChtQ29udmVydGVyKSB7CisgICAgICAgIG1Db252ZXJ0ZXItPmNvbnZlcnQoCisgICAgICAgICAgICAgICAgbURlY29kZWRXaWR0aCwgbURlY29kZWRIZWlnaHQsCisgICAgICAgICAgICAgICAgZGF0YSwgMCwgZHN0LCBidWYtPnN0cmlkZSAqIDIpOworICAgIH0gZWxzZSBpZiAobVlVVk1vZGUgPT0gWVVWNDIwc3BUb1lVVjQyMHNwKSB7CisgICAgICAgIC8vIElucHV0IGFuZCBvdXRwdXQgYXJlIGJvdGggWVVWNDIwc3AsIGJ1dCB0aGUgYWxpZ25tZW50IHJlcXVpcmVtZW50cworICAgICAgICAvLyBhcmUgZGlmZmVyZW50LgorICAgICAgICBzaXplX3Qgc3JjWVN0cmlkZSA9IG1EZWNvZGVkV2lkdGg7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY1kgPSAoY29uc3QgdWludDhfdCAqKWRhdGE7CisgICAgICAgIHVpbnQ4X3QgKmRzdFkgPSAodWludDhfdCAqKWRzdDsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRGVjb2RlZEhlaWdodDsgKytpKSB7CisgICAgICAgICAgICBtZW1jcHkoZHN0WSwgc3JjWSwgbURlY29kZWRXaWR0aCk7CisgICAgICAgICAgICBzcmNZICs9IHNyY1lTdHJpZGU7CisgICAgICAgICAgICBkc3RZICs9IGJ1Zi0+c3RyaWRlOworICAgICAgICB9CisKKyAgICAgICAgc2l6ZV90IHNyY1VWU3RyaWRlID0gKG1EZWNvZGVkV2lkdGggKyAxKSAmIH4xOworICAgICAgICBzaXplX3QgZHN0VVZTdHJpZGUgPSBBTElHTihtRGVjb2RlZFdpZHRoIC8gMiwgMzIpICogMjsKKworICAgICAgICBjb25zdCB1aW50OF90ICpzcmNVViA9IChjb25zdCB1aW50OF90ICopZGF0YQorICAgICAgICAgICAgKyBtRGVjb2RlZEhlaWdodCAqIG1EZWNvZGVkV2lkdGg7CisKKyAgICAgICAgc2l6ZV90IGRzdFVWT2Zmc2V0ID0gQUxJR04oQUxJR04obURlY29kZWRIZWlnaHQsIDMyKSAqIGJ1Zi0+c3RyaWRlLCA0MDk2KTsKKyAgICAgICAgdWludDhfdCAqZHN0VVYgPSAodWludDhfdCAqKWRzdCArIGRzdFVWT2Zmc2V0OworCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgKG1EZWNvZGVkSGVpZ2h0ICsgMSkgLyAyOyArK2kpIHsKKyAgICAgICAgICAgIG1lbWNweShkc3RVViwgc3JjVVYsIChtRGVjb2RlZFdpZHRoICsgMSkgJiB+MSk7CisgICAgICAgICAgICBzcmNVViArPSBzcmNVVlN0cmlkZTsKKyAgICAgICAgICAgIGRzdFVWICs9IGRzdFVWU3RyaWRlOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChtWVVWTW9kZSA9PSBZVVY0MjBUb1lVVjQyMHNwKSB7CisgICAgICAgIC8vIElucHV0IGlzIFlVVjQyMCBwbGFuYXIsIG91dHB1dCBpcyBZVVY0MjBzcCwgYWRoZXJlIHRvIHByb3BlcgorICAgICAgICAvLyBhbGlnbm1lbnQgcmVxdWlyZW1lbnRzLgorICAgICAgICBzaXplX3Qgc3JjWVN0cmlkZSA9IG1EZWNvZGVkV2lkdGg7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY1kgPSAoY29uc3QgdWludDhfdCAqKWRhdGE7CisgICAgICAgIHVpbnQ4X3QgKmRzdFkgPSAodWludDhfdCAqKWRzdDsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRGVjb2RlZEhlaWdodDsgKytpKSB7CisgICAgICAgICAgICBtZW1jcHkoZHN0WSwgc3JjWSwgbURlY29kZWRXaWR0aCk7CisgICAgICAgICAgICBzcmNZICs9IHNyY1lTdHJpZGU7CisgICAgICAgICAgICBkc3RZICs9IGJ1Zi0+c3RyaWRlOworICAgICAgICB9CisKKyAgICAgICAgc2l6ZV90IHNyY1VWU3RyaWRlID0gKG1EZWNvZGVkV2lkdGggKyAxKSAvIDI7CisgICAgICAgIHNpemVfdCBkc3RVVlN0cmlkZSA9IEFMSUdOKG1EZWNvZGVkV2lkdGggLyAyLCAzMikgKiAyOworCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY1UgPSAoY29uc3QgdWludDhfdCAqKWRhdGEKKyAgICAgICAgICAgICsgbURlY29kZWRIZWlnaHQgKiBtRGVjb2RlZFdpZHRoOworCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY1YgPQorICAgICAgICAgICAgc3JjVSArICgobURlY29kZWRXaWR0aCArIDEpIC8gMikgKiAoKG1EZWNvZGVkSGVpZ2h0ICsgMSkgLyAyKTsKKworICAgICAgICBzaXplX3QgZHN0VVZPZmZzZXQgPSBBTElHTihBTElHTihtRGVjb2RlZEhlaWdodCwgMzIpICogYnVmLT5zdHJpZGUsIDQwOTYpOworICAgICAgICB1aW50OF90ICpkc3RVViA9ICh1aW50OF90ICopZHN0ICsgZHN0VVZPZmZzZXQ7CisKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCAobURlY29kZWRIZWlnaHQgKyAxKSAvIDI7ICsraSkgeworICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCAobURlY29kZWRXaWR0aCArIDEpIC8gMjsgKytqKSB7CisgICAgICAgICAgICAgICAgZHN0VVZbMiAqIGogKyAxXSA9IHNyY1Vbal07CisgICAgICAgICAgICAgICAgZHN0VVZbMiAqIGpdID0gc3JjVltqXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNyY1UgKz0gc3JjVVZTdHJpZGU7CisgICAgICAgICAgICBzcmNWICs9IHNyY1VWU3RyaWRlOworICAgICAgICAgICAgZHN0VVYgKz0gZHN0VVZTdHJpZGU7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBtZW1jcHkoZHN0LCBkYXRhLCBzaXplKTsKKyAgICB9CisKKyAgICBDSEVDS19FUSgwLCBtYXBwZXIudW5sb2NrKGJ1Zi0+aGFuZGxlKSk7CisKKyAgICBDSEVDS19FUSgwLCBtU3VyZmFjZS0+cXVldWVCdWZmZXIobVN1cmZhY2UuZ2V0KCksIGJ1ZikpOworICAgIGJ1ZiA9IE5VTEw7CiB9CiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9NM1VQYXJzZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvTTNVUGFyc2VyLmNwcAppbmRleCBlZGQ4NjQ4Li4xNzc3MWM0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9NM1VQYXJzZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL00zVVBhcnNlci5jcHAKQEAgLTkwLDcgKzkwLDcgQEAKICAgICAgICAgb3V0LT5zZXRUbyhiYXNlVVJMKTsKICAgICAgICAgb3V0LT5hcHBlbmQodXJsKTsKICAgICB9IGVsc2UgewotICAgICAgICBjaGFyICpzbGFzaFBvcyA9IHN0cnJjaHIoYmFzZVVSTCwgJy8nKTsKKyAgICAgICAgY29uc3QgY2hhciAqc2xhc2hQb3MgPSBzdHJyY2hyKGJhc2VVUkwsICcvJyk7CiAKICAgICAgICAgaWYgKHNsYXNoUG9zID4gJmJhc2VVUkxbNl0pIHsKICAgICAgICAgICAgIG91dC0+c2V0VG8oYmFzZVVSTCwgc2xhc2hQb3MgLSBiYXNlVVJMKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvQXdlc29tZVBsYXllci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9Bd2Vzb21lUGxheWVyLmgKaW5kZXggNDliNWM3OC4uZjVkZjFiNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9Bd2Vzb21lUGxheWVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9Bd2Vzb21lUGxheWVyLmgKQEAgLTc2LDYgKzc2LDcgQEAKICAgICBib29sIGlzUGxheWluZygpIGNvbnN0OwogCiAgICAgdm9pZCBzZXRJU3VyZmFjZShjb25zdCBzcDxJU3VyZmFjZT4gJmlzdXJmYWNlKTsKKyAgICB2b2lkIHNldFN1cmZhY2UoY29uc3Qgc3A8U3VyZmFjZT4gJnN1cmZhY2UpOwogICAgIHZvaWQgc2V0QXVkaW9TaW5rKGNvbnN0IHNwPE1lZGlhUGxheWVyQmFzZTo6QXVkaW9TaW5rPiAmYXVkaW9TaW5rKTsKICAgICBzdGF0dXNfdCBzZXRMb29waW5nKGJvb2wgc2hvdWxkTG9vcCk7CiAKQEAgLTExNyw2ICsxMTgsNyBAQAogICAgIHdwPE1lZGlhUGxheWVyQmFzZT4gbUxpc3RlbmVyOwogCiAgICAgc3A8SVN1cmZhY2U+IG1JU3VyZmFjZTsKKyAgICBzcDxTdXJmYWNlPiBtU3VyZmFjZTsKICAgICBzcDxNZWRpYVBsYXllckJhc2U6OkF1ZGlvU2luaz4gbUF1ZGlvU2luazsKIAogICAgIFN5c3RlbVRpbWVTb3VyY2UgbVN5c3RlbVRpbWVTb3VyY2U7CkBAIC0yMjAsNiArMjIyLDcgQEAKICAgICBzdGF0dXNfdCBzZWVrVG9fbChpbnQ2NF90IHRpbWVVcyk7CiAgICAgc3RhdHVzX3QgcGF1c2VfbCgpOwogICAgIHZvaWQgaW5pdFJlbmRlcmVyX2woKTsKKyAgICB2b2lkIG5vdGlmeVZpZGVvU2l6ZV9sKCk7CiAgICAgdm9pZCBzZWVrQXVkaW9JZk5lY2Vzc2FyeV9sKCk7CiAKICAgICB2b2lkIGNhbmNlbFBsYXllckV2ZW50cyhib29sIGtlZXBCdWZmZXJpbmdHb2luZyA9IGZhbHNlKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU29mdHdhcmVSZW5kZXJlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9Tb2Z0d2FyZVJlbmRlcmVyLmgKaW5kZXggOWVlZDA4OS4uOGQ1ODA1NiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9Tb2Z0d2FyZVJlbmRlcmVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9Tb2Z0d2FyZVJlbmRlcmVyLmgKQEAgLTI0LDE0ICsyNCwxNCBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLWNsYXNzIElTdXJmYWNlOworY2xhc3MgU3VyZmFjZTsKIGNsYXNzIE1lbW9yeUhlYXBCYXNlOwogCiBjbGFzcyBTb2Z0d2FyZVJlbmRlcmVyIDogcHVibGljIFZpZGVvUmVuZGVyZXIgewogcHVibGljOgogICAgIFNvZnR3YXJlUmVuZGVyZXIoCiAgICAgICAgICAgICBPTVhfQ09MT1JfRk9STUFUVFlQRSBjb2xvckZvcm1hdCwKLSAgICAgICAgICAgIGNvbnN0IHNwPElTdXJmYWNlPiAmc3VyZmFjZSwKKyAgICAgICAgICAgIGNvbnN0IHNwPFN1cmZhY2U+ICZzdXJmYWNlLAogICAgICAgICAgICAgc2l6ZV90IGRpc3BsYXlXaWR0aCwgc2l6ZV90IGRpc3BsYXlIZWlnaHQsCiAgICAgICAgICAgICBzaXplX3QgZGVjb2RlZFdpZHRoLCBzaXplX3QgZGVjb2RlZEhlaWdodCk7CiAKQEAgLTQxLDE0ICs0MSwxOCBAQAogICAgICAgICAgICAgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUsIHZvaWQgKnBsYXRmb3JtUHJpdmF0ZSk7CiAKIHByaXZhdGU6CisgICAgZW51bSBZVVZNb2RlIHsKKyAgICAgICAgTm9uZSwKKyAgICAgICAgWVVWNDIwVG9ZVVY0MjBzcCwKKyAgICAgICAgWVVWNDIwc3BUb1lVVjQyMHNwLAorICAgIH07CisKICAgICBPTVhfQ09MT1JfRk9STUFUVFlQRSBtQ29sb3JGb3JtYXQ7Ci0gICAgQ29sb3JDb252ZXJ0ZXIgbUNvbnZlcnRlcjsKLSAgICBzcDxJU3VyZmFjZT4gbUlTdXJmYWNlOworICAgIENvbG9yQ29udmVydGVyICptQ29udmVydGVyOworICAgIFlVVk1vZGUgbVlVVk1vZGU7CisgICAgc3A8U3VyZmFjZT4gbVN1cmZhY2U7CiAgICAgc2l6ZV90IG1EaXNwbGF5V2lkdGgsIG1EaXNwbGF5SGVpZ2h0OwogICAgIHNpemVfdCBtRGVjb2RlZFdpZHRoLCBtRGVjb2RlZEhlaWdodDsKLSAgICBzaXplX3QgbUZyYW1lU2l6ZTsKLSAgICBzcDxNZW1vcnlIZWFwQmFzZT4gbU1lbW9yeUhlYXA7Ci0gICAgaW50IG1JbmRleDsKIAogICAgIFNvZnR3YXJlUmVuZGVyZXIoY29uc3QgU29mdHdhcmVSZW5kZXJlciAmKTsKICAgICBTb2Z0d2FyZVJlbmRlcmVyICZvcGVyYXRvcj0oY29uc3QgU29mdHdhcmVSZW5kZXJlciAmKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVguY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWC5jcHAKaW5kZXggNmRlNzYxZi4uODhiOTYwNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWC5jcHAKQEAgLTQ5NSwxMiArNDk1LDE3IEBACiAgICAgfQogCiAgICAgaWYgKCFpbXBsKSB7CisjaWYgMAogICAgICAgICBMT0dXKCJVc2luZyBzb2Z0d2FyZSByZW5kZXJlci4iKTsKICAgICAgICAgaW1wbCA9IG5ldyBTb2Z0d2FyZVJlbmRlcmVyKAogICAgICAgICAgICAgICAgIGNvbG9yRm9ybWF0LAogICAgICAgICAgICAgICAgIHN1cmZhY2UsCiAgICAgICAgICAgICAgICAgZGlzcGxheVdpZHRoLCBkaXNwbGF5SGVpZ2h0LAogICAgICAgICAgICAgICAgIGVuY29kZWRXaWR0aCwgZW5jb2RlZEhlaWdodCk7CisjZWxzZQorICAgICAgICBDSEVDSyghIlNob3VsZCBub3QgYmUgaGVyZS4iKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisjZW5kaWYKICAgICB9CiAKICAgICByZXR1cm4gbmV3IE9NWFJlbmRlcmVyKGltcGwpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRTUENvbm5lY3Rpb24uY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRTUENvbm5lY3Rpb24uY3BwCmluZGV4IDVmOGY1ZmQuLjUzNDUyMTggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUU1BDb25uZWN0aW9uLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFNQQ29ubmVjdGlvbi5jcHAKQEAgLTExNiw3ICsxMTYsNyBAQAogICAgICAgICBwYXRoLT5zZXRUbyhzbGFzaFBvcyk7CiAgICAgfQogCi0gICAgY2hhciAqY29sb25Qb3MgPSBzdHJjaHIoaG9zdC0+Y19zdHIoKSwgJzonKTsKKyAgICBjb25zdCBjaGFyICpjb2xvblBvcyA9IHN0cmNocihob3N0LT5jX3N0cigpLCAnOicpOwogCiAgICAgaWYgKGNvbG9uUG9zICE9IE5VTEwpIHsKICAgICAgICAgdW5zaWduZWQgbG9uZyB4OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BU2Vzc2lvbkRlc2NyaXB0aW9uLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVNlc3Npb25EZXNjcmlwdGlvbi5jcHAKaW5kZXggNGVhN2ZkYS4uNGE4Y2NlOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BU2Vzc2lvbkRlc2NyaXB0aW9uLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FTZXNzaW9uRGVzY3JpcHRpb24uY3BwCkBAIC0xODIsNyArMTgyLDcgQEAKICAgICBBU3RyaW5nIGZvcm1hdDsKICAgICBnZXRGb3JtYXQoaW5kZXgsICZmb3JtYXQpOwogCi0gICAgY2hhciAqbGFzdFNwYWNlUG9zID0gc3RycmNocihmb3JtYXQuY19zdHIoKSwgJyAnKTsKKyAgICBjb25zdCBjaGFyICpsYXN0U3BhY2VQb3MgPSBzdHJyY2hyKGZvcm1hdC5jX3N0cigpLCAnICcpOwogICAgIENIRUNLKGxhc3RTcGFjZVBvcyAhPSBOVUxMKTsKIAogICAgIGNoYXIgKmVuZDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvTXlIYW5kbGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL015SGFuZGxlci5oCmluZGV4IGUyNDg0NjMuLmNhZmY0MzUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvTXlIYW5kbGVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9NeUhhbmRsZXIuaApAQCAtNTYzLDcgKzU2Myw3IEBACiAgICAgICAgICAgICBvdXQtPnNldFRvKGJhc2VVUkwpOwogICAgICAgICAgICAgb3V0LT5hcHBlbmQodXJsKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNoYXIgKnNsYXNoUG9zID0gc3RycmNocihiYXNlVVJMLCAnLycpOworICAgICAgICAgICAgY29uc3QgY2hhciAqc2xhc2hQb3MgPSBzdHJyY2hyKGJhc2VVUkwsICcvJyk7CiAKICAgICAgICAgICAgIGlmIChzbGFzaFBvcyA+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+Z2V0RmllbGRTbG90KHJvdywgY29sdW1uKTsKKyAgICBmaWVsZFNsb3QtPnR5cGUgPSBGSUVMRF9UWVBFX0JMT0I7CisgICAgZmllbGRTbG90LT5kYXRhLmJ1ZmZlci5vZmZzZXQgPSBvZmZzZXQ7CisgICAgZmllbGRTbG90LT5kYXRhLmJ1ZmZlci5zaXplID0gc2l6ZTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cEN1cnNvci5oIGIvbWVkaWEvbXRwL010cEN1cnNvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmODQ3NTMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvTXRwQ3Vyc29yLmgKQEAgLTAsMCArMSw3NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX01UUF9DVVJTT1JfSAorI2RlZmluZSBfTVRQX0NVUlNPUl9ICisKKyNpbmNsdWRlICJNdHBUeXBlcy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIEN1cnNvcldpbmRvdzsKKworY2xhc3MgTXRwQ3Vyc29yIHsKK3ByaXZhdGU6CisgICAgZW51bSB7CisgICAgICAgIERFVklDRSAgICAgICAgICAgICAgPSAxLAorICAgICAgICBERVZJQ0VfSUQgICAgICAgICAgID0gMiwKKyAgICAgICAgU1RPUkFHRSAgICAgICAgICAgICA9IDMsCisgICAgICAgIFNUT1JBR0VfSUQgICAgICAgICAgPSA0LAorICAgICAgICBPQkpFQ1QgICAgICAgICAgICAgID0gNSwKKyAgICAgICAgT0JKRUNUX0lEICAgICAgICAgICA9IDYsCisgICAgICAgIFNUT1JBR0VfQ0hJTERSRU4gICAgPSA3LAorICAgICAgICBPQkpFQ1RfQ0hJTERSRU4gICAgID0gOCwKKyAgICB9OworCisgICAgTXRwQ2xpZW50KiAgbUNsaWVudDsKKyAgICBpbnQgICAgICAgICBtUXVlcnlUeXBlOworICAgIGludCAgICAgICAgIG1EZXZpY2VJRDsKKyAgICBpbnQgICAgICAgICBtU3RvcmFnZUlEOworICAgIGludCAgICAgICAgIG1RYmplY3RJRDsKKyAgICBpbnQgICAgICAgICBtQ29sdW1uQ291bnQ7CisgICAgaW50KiAgICAgICAgbUNvbHVtbnM7CisKK3B1YmxpYzoKKyAgICAgICAgICAgICAgICBNdHBDdXJzb3IoTXRwQ2xpZW50KiBjbGllbnQsIGludCBxdWVyeVR5cGUsIGludCBkZXZpY2VJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdG9yYWdlSUQsIGludCBvYmplY3RJRCwgaW50IGNvbHVtbkNvdW50LCBpbnQqIGNvbHVtbnMpOworICAgIHZpcnR1YWwgICAgIH5NdHBDdXJzb3IoKTsKKworICAgIGludCAgICAgICAgIGZpbGxXaW5kb3coQ3Vyc29yV2luZG93KiB3aW5kb3csIGludCBzdGFydFBvcyk7CisKK3ByaXZhdGU6CisgICAgaW50ICAgICAgICAgZmlsbERldmljZXMoQ3Vyc29yV2luZG93KiB3aW5kb3csIGludCBzdGFydFBvcyk7CisgICAgaW50ICAgICAgICAgZmlsbERldmljZShDdXJzb3JXaW5kb3cqIHdpbmRvdywgaW50IHN0YXJ0UG9zKTsKKyAgICBpbnQgICAgICAgICBmaWxsU3RvcmFnZXMoQ3Vyc29yV2luZG93KiB3aW5kb3csIGludCBzdGFydFBvcyk7CisgICAgaW50ICAgICAgICAgZmlsbFN0b3JhZ2UoQ3Vyc29yV2luZG93KiB3aW5kb3csIGludCBzdGFydFBvcyk7CisgICAgaW50ICAgICAgICAgZmlsbE9iamVjdHMoQ3Vyc29yV2luZG93KiB3aW5kb3csIGludCBwYXJlbnQsIGludCBzdGFydFBvcyk7CisgICAgaW50ICAgICAgICAgZmlsbE9iamVjdChDdXJzb3JXaW5kb3cqIHdpbmRvdywgaW50IHN0YXJ0UG9zKTsKKworICAgIGJvb2wgICAgICAgIGZpbGxEZXZpY2UoQ3Vyc29yV2luZG93KiB3aW5kb3csIE10cERldmljZSogZGV2aWNlLCBpbnQgc3RhcnRQb3MpOworICAgIGJvb2wgICAgICAgIGZpbGxTdG9yYWdlKEN1cnNvcldpbmRvdyogd2luZG93LCBNdHBEZXZpY2UqIGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE10cFN0b3JhZ2VJRCBzdG9yYWdlSUQsIGludCByb3cpOworICAgIGJvb2wgICAgICAgIGZpbGxPYmplY3QoQ3Vyc29yV2luZG93KiB3aW5kb3csIE10cERldmljZSogZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0SGFuZGxlIG9iamVjdElELCBpbnQgcm93KTsKKworICAgIGJvb2wgICAgICAgIHByZXBhcmVSb3coQ3Vyc29yV2luZG93KiB3aW5kb3cpOworICAgIGJvb2wgICAgICAgIHB1dExvbmcoQ3Vyc29yV2luZG93KiB3aW5kb3csIGludCB2YWx1ZSwgaW50IHJvdywgaW50IGNvbHVtbik7CisgICAgYm9vbCAgICAgICAgcHV0U3RyaW5nKEN1cnNvcldpbmRvdyogd2luZG93LCBjb25zdCBjaGFyKiB0ZXh0LCBpbnQgcm93LCBpbnQgY29sdW1uKTsKKyAgICBib29sICAgICAgICBwdXRUaHVtYm5haWwoQ3Vyc29yV2luZG93KiB3aW5kb3csIGludCBvYmplY3RJRCwgaW50IGZvcm1hdCwgaW50IHJvdywgaW50IGNvbHVtbik7Cit9OworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gX01UUF9DVVJTT1JfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cERhdGFQYWNrZXQuY3BwIGIvbWVkaWEvbXRwL010cERhdGFQYWNrZXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3ZGM3OTYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvTXRwRGF0YVBhY2tldC5jcHAKQEAgLTAsMCArMSw0NzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIk10cERhdGFQYWNrZXQiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisKKyNpbmNsdWRlIDx1c2Job3N0L3VzYmhvc3QuaD4KKworI2luY2x1ZGUgIk10cERhdGFQYWNrZXQuaCIKKyNpbmNsdWRlICJNdHBTdHJpbmdCdWZmZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitNdHBEYXRhUGFja2V0OjpNdHBEYXRhUGFja2V0KCkKKyAgICA6ICAgTXRwUGFja2V0KDUxMiksCisgICAgICAgIG1PZmZzZXQoTVRQX0NPTlRBSU5FUl9IRUFERVJfU0laRSkKK3sKK30KKworTXRwRGF0YVBhY2tldDo6fk10cERhdGFQYWNrZXQoKSB7Cit9CisKK3ZvaWQgTXRwRGF0YVBhY2tldDo6cmVzZXQoKSB7CisgICAgTXRwUGFja2V0OjpyZXNldCgpOworICAgIG1PZmZzZXQgPSBNVFBfQ09OVEFJTkVSX0hFQURFUl9TSVpFOworfQorCit2b2lkIE10cERhdGFQYWNrZXQ6OnNldE9wZXJhdGlvbkNvZGUoTXRwT3BlcmF0aW9uQ29kZSBjb2RlKSB7CisgICAgTXRwUGFja2V0OjpwdXRVSW50MTYoTVRQX0NPTlRBSU5FUl9DT0RFX09GRlNFVCwgY29kZSk7Cit9CisKK3ZvaWQgTXRwRGF0YVBhY2tldDo6c2V0VHJhbnNhY3Rpb25JRChNdHBUcmFuc2FjdGlvbklEIGlkKSB7CisgICAgTXRwUGFja2V0OjpwdXRVSW50MzIoTVRQX0NPTlRBSU5FUl9UUkFOU0FDVElPTl9JRF9PRkZTRVQsIGlkKTsKK30KKwordWludDE2X3QgTXRwRGF0YVBhY2tldDo6Z2V0VUludDE2KCkgeworICAgIGludCBvZmZzZXQgPSBtT2Zmc2V0OworICAgIHVpbnQxNl90IHJlc3VsdCA9ICh1aW50MTZfdCltQnVmZmVyW29mZnNldF0gfCAoKHVpbnQxNl90KW1CdWZmZXJbb2Zmc2V0ICsgMV0gPDwgOCk7CisgICAgbU9mZnNldCArPSAyOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3VpbnQzMl90IE10cERhdGFQYWNrZXQ6OmdldFVJbnQzMigpIHsKKyAgICBpbnQgb2Zmc2V0ID0gbU9mZnNldDsKKyAgICB1aW50MzJfdCByZXN1bHQgPSAodWludDMyX3QpbUJ1ZmZlcltvZmZzZXRdIHwgKCh1aW50MzJfdCltQnVmZmVyW29mZnNldCArIDFdIDw8IDgpIHwKKyAgICAgICAgICAgKCh1aW50MzJfdCltQnVmZmVyW29mZnNldCArIDJdIDw8IDE2KSAgfCAoKHVpbnQzMl90KW1CdWZmZXJbb2Zmc2V0ICsgM10gPDwgMjQpOworICAgIG1PZmZzZXQgKz0gNDsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCit1aW50NjRfdCBNdHBEYXRhUGFja2V0OjpnZXRVSW50NjQoKSB7CisgICAgaW50IG9mZnNldCA9IG1PZmZzZXQ7CisgICAgdWludDY0X3QgcmVzdWx0ID0gKHVpbnQ2NF90KW1CdWZmZXJbb2Zmc2V0XSB8ICgodWludDY0X3QpbUJ1ZmZlcltvZmZzZXQgKyAxXSA8PCA4KSB8CisgICAgICAgICAgICgodWludDY0X3QpbUJ1ZmZlcltvZmZzZXQgKyAyXSA8PCAxNikgfCAoKHVpbnQ2NF90KW1CdWZmZXJbb2Zmc2V0ICsgM10gPDwgMjQpIHwKKyAgICAgICAgICAgKCh1aW50NjRfdCltQnVmZmVyW29mZnNldCArIDRdIDw8IDMyKSB8ICgodWludDY0X3QpbUJ1ZmZlcltvZmZzZXQgKyA1XSA8PCA0MCkgfAorICAgICAgICAgICAoKHVpbnQ2NF90KW1CdWZmZXJbb2Zmc2V0ICsgNl0gPDwgNDgpICB8ICgodWludDY0X3QpbUJ1ZmZlcltvZmZzZXQgKyA3XSA8PCA1Nik7CisgICAgbU9mZnNldCArPSA4OworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgTXRwRGF0YVBhY2tldDo6Z2V0VUludDEyOCh1aW50MTI4X3QmIHZhbHVlKSB7CisgICAgdmFsdWVbMF0gPSBnZXRVSW50MzIoKTsKKyAgICB2YWx1ZVsxXSA9IGdldFVJbnQzMigpOworICAgIHZhbHVlWzJdID0gZ2V0VUludDMyKCk7CisgICAgdmFsdWVbM10gPSBnZXRVSW50MzIoKTsKK30KKwordm9pZCBNdHBEYXRhUGFja2V0OjpnZXRTdHJpbmcoTXRwU3RyaW5nQnVmZmVyJiBzdHJpbmcpCit7CisgICAgc3RyaW5nLnJlYWRGcm9tUGFja2V0KHRoaXMpOworfQorCitJbnQ4TGlzdCogTXRwRGF0YVBhY2tldDo6Z2V0QUludDgoKSB7CisgICAgSW50OExpc3QqIHJlc3VsdCA9IG5ldyBJbnQ4TGlzdDsKKyAgICBpbnQgY291bnQgPSBnZXRVSW50MzIoKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCisgICAgICAgIHJlc3VsdC0+cHVzaChnZXRJbnQ4KCkpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1VJbnQ4TGlzdCogTXRwRGF0YVBhY2tldDo6Z2V0QVVJbnQ4KCkgeworICAgIFVJbnQ4TGlzdCogcmVzdWx0ID0gbmV3IFVJbnQ4TGlzdDsKKyAgICBpbnQgY291bnQgPSBnZXRVSW50MzIoKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCisgICAgICAgIHJlc3VsdC0+cHVzaChnZXRVSW50OCgpKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitJbnQxNkxpc3QqIE10cERhdGFQYWNrZXQ6OmdldEFJbnQxNigpIHsKKyAgICBJbnQxNkxpc3QqIHJlc3VsdCA9IG5ldyBJbnQxNkxpc3Q7CisgICAgaW50IGNvdW50ID0gZ2V0VUludDMyKCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorICAgICAgICByZXN1bHQtPnB1c2goZ2V0SW50MTYoKSk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVUludDE2TGlzdCogTXRwRGF0YVBhY2tldDo6Z2V0QVVJbnQxNigpIHsKKyAgICBVSW50MTZMaXN0KiByZXN1bHQgPSBuZXcgVUludDE2TGlzdDsKKyAgICBpbnQgY291bnQgPSBnZXRVSW50MzIoKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCisgICAgICAgIHJlc3VsdC0+cHVzaChnZXRVSW50MTYoKSk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworSW50MzJMaXN0KiBNdHBEYXRhUGFja2V0OjpnZXRBSW50MzIoKSB7CisgICAgSW50MzJMaXN0KiByZXN1bHQgPSBuZXcgSW50MzJMaXN0OworICAgIGludCBjb3VudCA9IGdldFVJbnQzMigpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKyAgICAgICAgcmVzdWx0LT5wdXNoKGdldEludDMyKCkpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1VJbnQzMkxpc3QqIE10cERhdGFQYWNrZXQ6OmdldEFVSW50MzIoKSB7CisgICAgVUludDMyTGlzdCogcmVzdWx0ID0gbmV3IFVJbnQzMkxpc3Q7CisgICAgaW50IGNvdW50ID0gZ2V0VUludDMyKCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorICAgICAgICByZXN1bHQtPnB1c2goZ2V0VUludDMyKCkpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK0ludDY0TGlzdCogTXRwRGF0YVBhY2tldDo6Z2V0QUludDY0KCkgeworICAgIEludDY0TGlzdCogcmVzdWx0ID0gbmV3IEludDY0TGlzdDsKKyAgICBpbnQgY291bnQgPSBnZXRVSW50MzIoKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCisgICAgICAgIHJlc3VsdC0+cHVzaChnZXRJbnQ2NCgpKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitVSW50NjRMaXN0KiBNdHBEYXRhUGFja2V0OjpnZXRBVUludDY0KCkgeworICAgIFVJbnQ2NExpc3QqIHJlc3VsdCA9IG5ldyBVSW50NjRMaXN0OworICAgIGludCBjb3VudCA9IGdldFVJbnQzMigpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKyAgICAgICAgcmVzdWx0LT5wdXNoKGdldFVJbnQ2NCgpKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCit2b2lkIE10cERhdGFQYWNrZXQ6OnB1dEludDgoaW50OF90IHZhbHVlKSB7CisgICAgYWxsb2NhdGUobU9mZnNldCArIDEpOworICAgIG1CdWZmZXJbbU9mZnNldCsrXSA9ICh1aW50OF90KXZhbHVlOworICAgIGlmIChtUGFja2V0U2l6ZSA8IG1PZmZzZXQpCisgICAgICAgIG1QYWNrZXRTaXplID0gbU9mZnNldDsKK30KKwordm9pZCBNdHBEYXRhUGFja2V0OjpwdXRVSW50OCh1aW50OF90IHZhbHVlKSB7CisgICAgYWxsb2NhdGUobU9mZnNldCArIDEpOworICAgIG1CdWZmZXJbbU9mZnNldCsrXSA9ICh1aW50OF90KXZhbHVlOworICAgIGlmIChtUGFja2V0U2l6ZSA8IG1PZmZzZXQpCisgICAgICAgIG1QYWNrZXRTaXplID0gbU9mZnNldDsKK30KKwordm9pZCBNdHBEYXRhUGFja2V0OjpwdXRJbnQxNihpbnQxNl90IHZhbHVlKSB7CisgICAgYWxsb2NhdGUobU9mZnNldCArIDIpOworICAgIG1CdWZmZXJbbU9mZnNldCsrXSA9ICh1aW50OF90KSh2YWx1ZSAmIDB4RkYpOworICAgIG1CdWZmZXJbbU9mZnNldCsrXSA9ICh1aW50OF90KSgodmFsdWUgPj4gOCkgJiAweEZGKTsKKyAgICBpZiAobVBhY2tldFNpemUgPCBtT2Zmc2V0KQorICAgICAgICBtUGFja2V0U2l6ZSA9IG1PZmZzZXQ7Cit9CisKK3ZvaWQgTXRwRGF0YVBhY2tldDo6cHV0VUludDE2KHVpbnQxNl90IHZhbHVlKSB7CisgICAgYWxsb2NhdGUobU9mZnNldCArIDIpOworICAgIG1CdWZmZXJbbU9mZnNldCsrXSA9ICh1aW50OF90KSh2YWx1ZSAmIDB4RkYpOworICAgIG1CdWZmZXJbbU9mZnNldCsrXSA9ICh1aW50OF90KSgodmFsdWUgPj4gOCkgJiAweEZGKTsKKyAgICBpZiAobVBhY2tldFNpemUgPCBtT2Zmc2V0KQorICAgICAgICBtUGFja2V0U2l6ZSA9IG1PZmZzZXQ7Cit9CisKK3ZvaWQgTXRwRGF0YVBhY2tldDo6cHV0SW50MzIoaW50MzJfdCB2YWx1ZSkgeworICAgIGFsbG9jYXRlKG1PZmZzZXQgKyA0KTsKKyAgICBtQnVmZmVyW21PZmZzZXQrK10gPSAodWludDhfdCkodmFsdWUgJiAweEZGKTsKKyAgICBtQnVmZmVyW21PZmZzZXQrK10gPSAodWludDhfdCkoKHZhbHVlID4+IDgpICYgMHhGRik7CisgICAgbUJ1ZmZlclttT2Zmc2V0KytdID0gKHVpbnQ4X3QpKCh2YWx1ZSA+PiAxNikgJiAweEZGKTsKKyAgICBtQnVmZmVyW21PZmZzZXQrK10gPSAodWludDhfdCkoKHZhbHVlID4+IDI0KSAmIDB4RkYpOworICAgIGlmIChtUGFja2V0U2l6ZSA8IG1PZmZzZXQpCisgICAgICAgIG1QYWNrZXRTaXplID0gbU9mZnNldDsKK30KKwordm9pZCBNdHBEYXRhUGFja2V0OjpwdXRVSW50MzIodWludDMyX3QgdmFsdWUpIHsKKyAgICBhbGxvY2F0ZShtT2Zmc2V0ICsgNCk7CisgICAgbUJ1ZmZlclttT2Zmc2V0KytdID0gKHVpbnQ4X3QpKHZhbHVlICYgMHhGRik7CisgICAgbUJ1ZmZlclttT2Zmc2V0KytdID0gKHVpbnQ4X3QpKCh2YWx1ZSA+PiA4KSAmIDB4RkYpOworICAgIG1CdWZmZXJbbU9mZnNldCsrXSA9ICh1aW50OF90KSgodmFsdWUgPj4gMTYpICYgMHhGRik7CisgICAgbUJ1ZmZlclttT2Zmc2V0KytdID0gKHVpbnQ4X3QpKCh2YWx1ZSA+PiAyNCkgJiAweEZGKTsKKyAgICBpZiAobVBhY2tldFNpemUgPCBtT2Zmc2V0KQorICAgICAgICBtUGFja2V0U2l6ZSA9IG1PZmZzZXQ7Cit9CisKK3ZvaWQgTXRwRGF0YVBhY2tldDo6cHV0SW50NjQoaW50NjRfdCB2YWx1ZSkgeworICAgIGFsbG9jYXRlKG1PZmZzZXQgKyA4KTsKKyAgICBtQnVmZmVyW21PZmZzZXQrK10gPSAodWludDhfdCkodmFsdWUgJiAweEZGKTsKKyAgICBtQnVmZmVyW21PZmZzZXQrK10gPSAodWludDhfdCkoKHZhbHVlID4+IDgpICYgMHhGRik7CisgICAgbUJ1ZmZlclttT2Zmc2V0KytdID0gKHVpbnQ4X3QpKCh2YWx1ZSA+PiAxNikgJiAweEZGKTsKKyAgICBtQnVmZmVyW21PZmZzZXQrK10gPSAodWludDhfdCkoKHZhbHVlID4+IDI0KSAmIDB4RkYpOworICAgIG1CdWZmZXJbbU9mZnNldCsrXSA9ICh1aW50OF90KSgodmFsdWUgPj4gMzIpICYgMHhGRik7CisgICAgbUJ1ZmZlclttT2Zmc2V0KytdID0gKHVpbnQ4X3QpKCh2YWx1ZSA+PiA0MCkgJiAweEZGKTsKKyAgICBtQnVmZmVyW21PZmZzZXQrK10gPSAodWludDhfdCkoKHZhbHVlID4+IDQ4KSAmIDB4RkYpOworICAgIG1CdWZmZXJbbU9mZnNldCsrXSA9ICh1aW50OF90KSgodmFsdWUgPj4gNTYpICYgMHhGRik7CisgICAgaWYgKG1QYWNrZXRTaXplIDwgbU9mZnNldCkKKyAgICAgICAgbVBhY2tldFNpemUgPSBtT2Zmc2V0OworfQorCit2b2lkIE10cERhdGFQYWNrZXQ6OnB1dFVJbnQ2NCh1aW50NjRfdCB2YWx1ZSkgeworICAgIGFsbG9jYXRlKG1PZmZzZXQgKyA4KTsKKyAgICBtQnVmZmVyW21PZmZzZXQrK10gPSAodWludDhfdCkodmFsdWUgJiAweEZGKTsKKyAgICBtQnVmZmVyW21PZmZzZXQrK10gPSAodWludDhfdCkoKHZhbHVlID4+IDgpICYgMHhGRik7CisgICAgbUJ1ZmZlclttT2Zmc2V0KytdID0gKHVpbnQ4X3QpKCh2YWx1ZSA+PiAxNikgJiAweEZGKTsKKyAgICBtQnVmZmVyW21PZmZzZXQrK10gPSAodWludDhfdCkoKHZhbHVlID4+IDI0KSAmIDB4RkYpOworICAgIG1CdWZmZXJbbU9mZnNldCsrXSA9ICh1aW50OF90KSgodmFsdWUgPj4gMzIpICYgMHhGRik7CisgICAgbUJ1ZmZlclttT2Zmc2V0KytdID0gKHVpbnQ4X3QpKCh2YWx1ZSA+PiA0MCkgJiAweEZGKTsKKyAgICBtQnVmZmVyW21PZmZzZXQrK10gPSAodWludDhfdCkoKHZhbHVlID4+IDQ4KSAmIDB4RkYpOworICAgIG1CdWZmZXJbbU9mZnNldCsrXSA9ICh1aW50OF90KSgodmFsdWUgPj4gNTYpICYgMHhGRik7CisgICAgaWYgKG1QYWNrZXRTaXplIDwgbU9mZnNldCkKKyAgICAgICAgbVBhY2tldFNpemUgPSBtT2Zmc2V0OworfQorCit2b2lkIE10cERhdGFQYWNrZXQ6OnB1dEludDEyOChjb25zdCBpbnQxMjhfdCYgdmFsdWUpIHsKKyAgICBwdXRJbnQzMih2YWx1ZVswXSk7CisgICAgcHV0SW50MzIodmFsdWVbMV0pOworICAgIHB1dEludDMyKHZhbHVlWzJdKTsKKyAgICBwdXRJbnQzMih2YWx1ZVszXSk7Cit9CisKK3ZvaWQgTXRwRGF0YVBhY2tldDo6cHV0VUludDEyOChjb25zdCB1aW50MTI4X3QmIHZhbHVlKSB7CisgICAgcHV0VUludDMyKHZhbHVlWzBdKTsKKyAgICBwdXRVSW50MzIodmFsdWVbMV0pOworICAgIHB1dFVJbnQzMih2YWx1ZVsyXSk7CisgICAgcHV0VUludDMyKHZhbHVlWzNdKTsKK30KKwordm9pZCBNdHBEYXRhUGFja2V0OjpwdXRBSW50OChjb25zdCBpbnQ4X3QqIHZhbHVlcywgaW50IGNvdW50KSB7CisgICAgcHV0VUludDMyKGNvdW50KTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCisgICAgICAgIHB1dEludDgoKnZhbHVlcysrKTsKK30KKwordm9pZCBNdHBEYXRhUGFja2V0OjpwdXRBVUludDgoY29uc3QgdWludDhfdCogdmFsdWVzLCBpbnQgY291bnQpIHsKKyAgICBwdXRVSW50MzIoY291bnQpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKyAgICAgICAgcHV0VUludDgoKnZhbHVlcysrKTsKK30KKwordm9pZCBNdHBEYXRhUGFja2V0OjpwdXRBSW50MTYoY29uc3QgaW50MTZfdCogdmFsdWVzLCBpbnQgY291bnQpIHsKKyAgICBwdXRVSW50MzIoY291bnQpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKyAgICAgICAgcHV0SW50MTYoKnZhbHVlcysrKTsKK30KKwordm9pZCBNdHBEYXRhUGFja2V0OjpwdXRBVUludDE2KGNvbnN0IHVpbnQxNl90KiB2YWx1ZXMsIGludCBjb3VudCkgeworICAgIHB1dFVJbnQzMihjb3VudCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorICAgICAgICBwdXRVSW50MTYoKnZhbHVlcysrKTsKK30KKwordm9pZCBNdHBEYXRhUGFja2V0OjpwdXRBVUludDE2KGNvbnN0IFVJbnQxNkxpc3QqIHZhbHVlcykgeworICAgIHNpemVfdCBjb3VudCA9ICh2YWx1ZXMgPyB2YWx1ZXMtPnNpemUoKSA6IDApOworICAgIHB1dFVJbnQzMihjb3VudCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorICAgICAgICBwdXRVSW50MTYoKCp2YWx1ZXMpW2ldKTsKK30KKwordm9pZCBNdHBEYXRhUGFja2V0OjpwdXRBSW50MzIoY29uc3QgaW50MzJfdCogdmFsdWVzLCBpbnQgY291bnQpIHsKKyAgICBwdXRVSW50MzIoY291bnQpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKyAgICAgICAgcHV0SW50MzIoKnZhbHVlcysrKTsKK30KKwordm9pZCBNdHBEYXRhUGFja2V0OjpwdXRBVUludDMyKGNvbnN0IHVpbnQzMl90KiB2YWx1ZXMsIGludCBjb3VudCkgeworICAgIHB1dFVJbnQzMihjb3VudCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorICAgICAgICBwdXRVSW50MzIoKnZhbHVlcysrKTsKK30KKwordm9pZCBNdHBEYXRhUGFja2V0OjpwdXRBVUludDMyKGNvbnN0IFVJbnQzMkxpc3QqIGxpc3QpIHsKKyAgICBpZiAoIWxpc3QpIHsKKyAgICAgICAgcHV0RW1wdHlBcnJheSgpOworICAgIH0gZWxzZSB7CisgICAgICAgIHNpemVfdCBzaXplID0gbGlzdC0+c2l6ZSgpOworICAgICAgICBwdXRVSW50MzIoc2l6ZSk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQorICAgICAgICAgICAgcHV0VUludDMyKCgqbGlzdClbaV0pOworICAgIH0KK30KKwordm9pZCBNdHBEYXRhUGFja2V0OjpwdXRBSW50NjQoY29uc3QgaW50NjRfdCogdmFsdWVzLCBpbnQgY291bnQpIHsKKyAgICBwdXRVSW50MzIoY291bnQpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKyAgICAgICAgcHV0SW50NjQoKnZhbHVlcysrKTsKK30KKwordm9pZCBNdHBEYXRhUGFja2V0OjpwdXRBVUludDY0KGNvbnN0IHVpbnQ2NF90KiB2YWx1ZXMsIGludCBjb3VudCkgeworICAgIHB1dFVJbnQzMihjb3VudCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorICAgICAgICBwdXRVSW50NjQoKnZhbHVlcysrKTsKK30KKwordm9pZCBNdHBEYXRhUGFja2V0OjpwdXRTdHJpbmcoY29uc3QgTXRwU3RyaW5nQnVmZmVyJiBzdHJpbmcpIHsKKyAgICBzdHJpbmcud3JpdGVUb1BhY2tldCh0aGlzKTsKK30KKwordm9pZCBNdHBEYXRhUGFja2V0OjpwdXRTdHJpbmcoY29uc3QgY2hhciogcykgeworICAgIE10cFN0cmluZ0J1ZmZlciBzdHJpbmcocyk7CisgICAgc3RyaW5nLndyaXRlVG9QYWNrZXQodGhpcyk7Cit9CisKK3ZvaWQgTXRwRGF0YVBhY2tldDo6cHV0U3RyaW5nKGNvbnN0IHVpbnQxNl90KiBzdHJpbmcpIHsKKyAgICBpbnQgY291bnQgPSAwOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKyAgICAgICAgaWYgKHN0cmluZ1tpXSkKKyAgICAgICAgICAgIGNvdW50Kys7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBwdXRVSW50OChjb3VudCA+IDAgPyBjb3VudCArIDEgOiAwKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCisgICAgICAgIHB1dFVJbnQxNihzdHJpbmdbaV0pOworICAgIC8vIG9ubHkgdGVybWluYXRlIHdpdGggemVybyBpZiBzdHJpbmcgaXMgbm90IGVtcHR5CisgICAgaWYgKGNvdW50ID4gMCkKKyAgICAgICAgcHV0VUludDE2KDApOworfQorCisjaWZkZWYgTVRQX0RFVklDRSAKK2ludCBNdHBEYXRhUGFja2V0OjpyZWFkKGludCBmZCkgeworICAgIC8vIGZpcnN0IHJlYWQgdGhlIGhlYWRlcgorICAgIGludCByZXQgPSA6OnJlYWQoZmQsIG1CdWZmZXIsIE1UUF9DT05UQUlORVJfSEVBREVSX1NJWkUpOworICAgIGlmIChyZXQgIT0gTVRQX0NPTlRBSU5FUl9IRUFERVJfU0laRSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIC8vIHRoZW4gdGhlIGZvbGxvd2luZyBkYXRhCisgICAgaW50IHRvdGFsID0gTXRwUGFja2V0OjpnZXRVSW50MzIoTVRQX0NPTlRBSU5FUl9MRU5HVEhfT0ZGU0VUKTsKKyAgICBpbnQgcmVtYWluaW5nID0gdG90YWwgLSBNVFBfQ09OVEFJTkVSX0hFQURFUl9TSVpFOworICAgIHJldCA9IDo6cmVhZChmZCwgJm1CdWZmZXJbMF0gKyBNVFBfQ09OVEFJTkVSX0hFQURFUl9TSVpFLCByZW1haW5pbmcpOworICAgIGlmIChyZXQgIT0gcmVtYWluaW5nKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBtUGFja2V0U2l6ZSA9IHRvdGFsOworICAgIG1PZmZzZXQgPSBNVFBfQ09OVEFJTkVSX0hFQURFUl9TSVpFOworICAgIHJldHVybiB0b3RhbDsKK30KKworaW50IE10cERhdGFQYWNrZXQ6OnJlYWREYXRhSGVhZGVyKGludCBmZCkgeworICAgIGludCByZXQgPSA6OnJlYWQoZmQsIG1CdWZmZXIsIE1UUF9DT05UQUlORVJfSEVBREVSX1NJWkUpOworICAgIGlmIChyZXQgPiAwKQorICAgICAgICBtUGFja2V0U2l6ZSA9IHJldDsKKyAgICBlbHNlCisgICAgICAgIG1QYWNrZXRTaXplID0gMDsKKyAgICByZXR1cm4gcmV0OworfQorCitpbnQgTXRwRGF0YVBhY2tldDo6d3JpdGUoaW50IGZkKSB7CisgICAgTXRwUGFja2V0OjpwdXRVSW50MzIoTVRQX0NPTlRBSU5FUl9MRU5HVEhfT0ZGU0VULCBtUGFja2V0U2l6ZSk7CisgICAgTXRwUGFja2V0OjpwdXRVSW50MTYoTVRQX0NPTlRBSU5FUl9UWVBFX09GRlNFVCwgTVRQX0NPTlRBSU5FUl9UWVBFX0RBVEEpOworCisgICAgLy8gc2VuZCBoZWFkZXIgc2VwYXJhdGVseSBmcm9tIGRhdGEKKyAgICBpbnQgcmV0ID0gOjp3cml0ZShmZCwgbUJ1ZmZlciwgTVRQX0NPTlRBSU5FUl9IRUFERVJfU0laRSk7CisgICAgaWYgKHJldCA9PSBNVFBfQ09OVEFJTkVSX0hFQURFUl9TSVpFKQorICAgICAgICByZXQgPSA6OndyaXRlKGZkLCBtQnVmZmVyICsgTVRQX0NPTlRBSU5FUl9IRUFERVJfU0laRSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1QYWNrZXRTaXplIC0gTVRQX0NPTlRBSU5FUl9IRUFERVJfU0laRSk7CisgICAgcmV0dXJuIChyZXQgPCAwID8gcmV0IDogMCk7Cit9CisKK2ludCBNdHBEYXRhUGFja2V0Ojp3cml0ZURhdGFIZWFkZXIoaW50IGZkLCB1aW50MzJfdCBsZW5ndGgpIHsKKyAgICBNdHBQYWNrZXQ6OnB1dFVJbnQzMihNVFBfQ09OVEFJTkVSX0xFTkdUSF9PRkZTRVQsIGxlbmd0aCk7CisgICAgTXRwUGFja2V0OjpwdXRVSW50MTYoTVRQX0NPTlRBSU5FUl9UWVBFX09GRlNFVCwgTVRQX0NPTlRBSU5FUl9UWVBFX0RBVEEpOworICAgIGludCByZXQgPSA6OndyaXRlKGZkLCBtQnVmZmVyLCBNVFBfQ09OVEFJTkVSX0hFQURFUl9TSVpFKTsKKyAgICByZXR1cm4gKHJldCA8IDAgPyByZXQgOiAwKTsKK30KKyNlbmRpZiAvLyBNVFBfREVWSUNFCisKKyNpZmRlZiBNVFBfSE9TVAoraW50IE10cERhdGFQYWNrZXQ6OnJlYWQoc3RydWN0IHVzYl9lbmRwb2ludCAqZXApIHsKKyAgICAvLyBmaXJzdCByZWFkIHRoZSBoZWFkZXIKKyAgICBpbnQgbGVuZ3RoID0gdHJhbnNmZXIoZXAsIG1CdWZmZXIsIG1CdWZmZXJTaXplKTsKKyAgICBpZiAobGVuZ3RoID49IE1UUF9DT05UQUlORVJfSEVBREVSX1NJWkUpIHsKKyAgICAgICAgLy8gbG9vayBhdCB0aGUgbGVuZ3RoIGZpZWxkIHRvIHNlZSBpZiB0aGUgZGF0YSBzcGFucyBtdWx0aXBsZSBwYWNrZXRzCisgICAgICAgIHVpbnQzMl90IHRvdGFsTGVuZ3RoID0gTXRwUGFja2V0OjpnZXRVSW50MzIoTVRQX0NPTlRBSU5FUl9MRU5HVEhfT0ZGU0VUKTsKKyAgICAgICAgd2hpbGUgKHRvdGFsTGVuZ3RoID4gbGVuZ3RoKSB7CisgICAgICAgICAgICBhbGxvY2F0ZShsZW5ndGggKyBtQWxsb2NhdGlvbkluY3JlbWVudCk7CisgICAgICAgICAgICBpbnQgcmV0ID0gdHJhbnNmZXIoZXAsIG1CdWZmZXIgKyBsZW5ndGgsIG1BbGxvY2F0aW9uSW5jcmVtZW50KTsKKyAgICAgICAgICAgIGlmIChyZXQgPj0gMCkKKyAgICAgICAgICAgICAgICBsZW5ndGggKz0gcmV0OworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgbGVuZ3RoID0gcmV0OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGlmIChsZW5ndGggPj0gMCkKKyAgICAgICAgbVBhY2tldFNpemUgPSBsZW5ndGg7CisgICAgcmV0dXJuIGxlbmd0aDsKK30KKworaW50IE10cERhdGFQYWNrZXQ6OnJlYWREYXRhKHN0cnVjdCB1c2JfZW5kcG9pbnQgKmVwLCB2b2lkKiBidWZmZXIsIGludCBsZW5ndGgpIHsKKyAgICBpbnQgcGFja2V0U2l6ZSA9IHVzYl9lbmRwb2ludF9tYXhfcGFja2V0KGVwKTsKKyAgICBpbnQgcmVhZCA9IDA7CisgICAgd2hpbGUgKHJlYWQgPCBsZW5ndGgpIHsKKyAgICAgICAgaW50IHJldCA9IHRyYW5zZmVyKGVwLCAoY2hhciAqKWJ1ZmZlciArIHJlYWQsIHBhY2tldFNpemUpOworICAgICAgICBpZiAocmV0IDwgMCkgeworcHJpbnRmKCJNdHBEYXRhUGFja2V0OjpyZWFkRGF0YSByZXR1cm5pbmcgJWRcbiIsIHJldCk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgICAgIHJlYWQgKz0gcmV0OworICAgIH0KK3ByaW50ZigiTXRwRGF0YVBhY2tldDo6cmVhZERhdGEgcmV0dXJuaW5nICVkXG4iLCByZWFkKTsKKyAgICByZXR1cm4gcmVhZDsKK30KKworaW50IE10cERhdGFQYWNrZXQ6OnJlYWREYXRhSGVhZGVyKHN0cnVjdCB1c2JfZW5kcG9pbnQgKmVwKSB7CisgICAgaW50IGxlbmd0aCA9IHRyYW5zZmVyKGVwLCBtQnVmZmVyLCB1c2JfZW5kcG9pbnRfbWF4X3BhY2tldChlcCkpOworICAgIGlmIChsZW5ndGggPj0gMCkKKyAgICAgICAgbVBhY2tldFNpemUgPSBsZW5ndGg7CisgICAgcmV0dXJuIGxlbmd0aDsKK30KKworaW50IE10cERhdGFQYWNrZXQ6OndyaXRlRGF0YUhlYWRlcihzdHJ1Y3QgdXNiX2VuZHBvaW50ICplcCwgdWludDMyX3QgbGVuZ3RoKSB7CisgICAgTXRwUGFja2V0OjpwdXRVSW50MzIoTVRQX0NPTlRBSU5FUl9MRU5HVEhfT0ZGU0VULCBsZW5ndGgpOworICAgIE10cFBhY2tldDo6cHV0VUludDE2KE1UUF9DT05UQUlORVJfVFlQRV9PRkZTRVQsIE1UUF9DT05UQUlORVJfVFlQRV9EQVRBKTsKKyAgICBpbnQgcmV0ID0gdHJhbnNmZXIoZXAsIG1CdWZmZXIsIE1UUF9DT05UQUlORVJfSEVBREVSX1NJWkUpOworICAgIHJldHVybiAocmV0IDwgMCA/IHJldCA6IDApOworfQorCitpbnQgTXRwRGF0YVBhY2tldDo6d3JpdGUoc3RydWN0IHVzYl9lbmRwb2ludCAqZXApIHsKKyAgICBNdHBQYWNrZXQ6OnB1dFVJbnQzMihNVFBfQ09OVEFJTkVSX0xFTkdUSF9PRkZTRVQsIG1QYWNrZXRTaXplKTsKKyAgICBNdHBQYWNrZXQ6OnB1dFVJbnQxNihNVFBfQ09OVEFJTkVSX1RZUEVfT0ZGU0VULCBNVFBfQ09OVEFJTkVSX1RZUEVfREFUQSk7CisKKyAgICAvLyBzZW5kIGhlYWRlciBzZXBhcmF0ZWx5IGZyb20gZGF0YQorICAgIGludCByZXQgPSB0cmFuc2ZlcihlcCwgbUJ1ZmZlciwgTVRQX0NPTlRBSU5FUl9IRUFERVJfU0laRSk7CisgICAgaWYgKHJldCA9PSBNVFBfQ09OVEFJTkVSX0hFQURFUl9TSVpFKQorICAgICAgICByZXQgPSB0cmFuc2ZlcihlcCwgbUJ1ZmZlciArIE1UUF9DT05UQUlORVJfSEVBREVSX1NJWkUsCisgICAgICAgICAgICAgICAgICAgICAgICBtUGFja2V0U2l6ZSAtIE1UUF9DT05UQUlORVJfSEVBREVSX1NJWkUpOworICAgIHJldHVybiAocmV0IDwgMCA/IHJldCA6IDApOworfQorCitpbnQgTXRwRGF0YVBhY2tldDo6d3JpdGUoc3RydWN0IHVzYl9lbmRwb2ludCAqZXAsIHZvaWQqIGJ1ZmZlciwgdWludDMyX3QgbGVuZ3RoKSB7CisgICAgaW50IHJldCA9IDA7CisgICAgaW50IHBhY2tldFNpemUgPSB1c2JfZW5kcG9pbnRfbWF4X3BhY2tldChlcCk7CisgICAgd2hpbGUgKGxlbmd0aCA+IDApIHsKKyAgICAgICAgaW50IHdyaXRlID0gKGxlbmd0aCA+IHBhY2tldFNpemUgPyBwYWNrZXRTaXplIDogbGVuZ3RoKTsKKyAgICAgICAgaW50IHJldCA9IHRyYW5zZmVyKGVwLCBidWZmZXIsIHdyaXRlKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgbGVuZ3RoIC09IHJldDsKKyAgICB9CisgICAgcmV0dXJuIChyZXQgPCAwID8gcmV0IDogMCk7Cit9CisKKyNlbmRpZiAvLyBNVFBfSE9TVAorCit2b2lkKiBNdHBEYXRhUGFja2V0OjpnZXREYXRhKGludCYgb3V0TGVuZ3RoKSBjb25zdCB7CisgICAgaW50IGxlbmd0aCA9IG1QYWNrZXRTaXplIC0gTVRQX0NPTlRBSU5FUl9IRUFERVJfU0laRTsKKyAgICBpZiAobGVuZ3RoID4gMCkgeworICAgICAgICB2b2lkKiByZXN1bHQgPSBtYWxsb2MobGVuZ3RoKTsKKyAgICAgICAgaWYgKHJlc3VsdCkgeworICAgICAgICAgICAgbWVtY3B5KHJlc3VsdCwgbUJ1ZmZlciArIE1UUF9DT05UQUlORVJfSEVBREVSX1NJWkUsIGxlbmd0aCk7CisgICAgICAgICAgICBvdXRMZW5ndGggPSBsZW5ndGg7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgfQorICAgIG91dExlbmd0aCA9IDA7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwRGF0YVBhY2tldC5oIGIvbWVkaWEvbXRwL010cERhdGFQYWNrZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDY3YWFiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL010cERhdGFQYWNrZXQuaApAQCAtMCwwICsxLDExNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX01UUF9EQVRBX1BBQ0tFVF9ICisjZGVmaW5lIF9NVFBfREFUQV9QQUNLRVRfSAorCisjaW5jbHVkZSAiTXRwUGFja2V0LmgiCisjaW5jbHVkZSAibXRwLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgTXRwU3RyaW5nQnVmZmVyOworCitjbGFzcyBNdHBEYXRhUGFja2V0IDogcHVibGljIE10cFBhY2tldCB7Citwcml2YXRlOgorICAgIC8vIGN1cnJlbnQgb2Zmc2V0IGZvciBnZXQvcHV0IG1ldGhvZHMKKyAgICBpbnQgICAgICAgICAgICAgICAgIG1PZmZzZXQ7CisKK3B1YmxpYzoKKyAgICAgICAgICAgICAgICAgICAgICAgIE10cERhdGFQYWNrZXQoKTsKKyAgICB2aXJ0dWFsICAgICAgICAgICAgIH5NdHBEYXRhUGFja2V0KCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgICAgICAgIHJlc2V0KCk7CisKKyAgICB2b2lkICAgICAgICAgICAgICAgIHNldE9wZXJhdGlvbkNvZGUoTXRwT3BlcmF0aW9uQ29kZSBjb2RlKTsKKyAgICB2b2lkICAgICAgICAgICAgICAgIHNldFRyYW5zYWN0aW9uSUQoTXRwVHJhbnNhY3Rpb25JRCBpZCk7CisKKyAgICBpbmxpbmUgdWludDhfdCAgICAgIGdldFVJbnQ4KCkgeyByZXR1cm4gKHVpbnQ4X3QpbUJ1ZmZlclttT2Zmc2V0KytdOyB9CisgICAgaW5saW5lIGludDhfdCAgICAgICBnZXRJbnQ4KCkgeyByZXR1cm4gKGludDhfdCltQnVmZmVyW21PZmZzZXQrK107IH0KKyAgICB1aW50MTZfdCAgICAgICAgICAgIGdldFVJbnQxNigpOworICAgIGlubGluZSBpbnQxNl90ICAgICAgZ2V0SW50MTYoKSB7IHJldHVybiAoaW50MTZfdClnZXRVSW50MTYoKTsgfQorICAgIHVpbnQzMl90ICAgICAgICAgICAgZ2V0VUludDMyKCk7CisgICAgaW5saW5lIGludDMyX3QgICAgICBnZXRJbnQzMigpIHsgcmV0dXJuIChpbnQzMl90KWdldFVJbnQzMigpOyB9CisgICAgdWludDY0X3QgICAgICAgICAgICBnZXRVSW50NjQoKTsKKyAgICBpbmxpbmUgaW50NjRfdCAgICAgIGdldEludDY0KCkgeyByZXR1cm4gKGludDY0X3QpZ2V0VUludDY0KCk7IH0KKyAgICB2b2lkICAgICAgICAgICAgICAgIGdldFVJbnQxMjgodWludDEyOF90JiB2YWx1ZSk7CisgICAgaW5saW5lIHZvaWQgICAgICAgICBnZXRJbnQxMjgoaW50MTI4X3QmIHZhbHVlKSB7IGdldFVJbnQxMjgoKHVpbnQxMjhfdCYpdmFsdWUpOyB9CisgICAgdm9pZCAgICAgICAgICAgICAgICBnZXRTdHJpbmcoTXRwU3RyaW5nQnVmZmVyJiBzdHJpbmcpOworCisgICAgSW50OExpc3QqICAgICAgICAgICBnZXRBSW50OCgpOworICAgIFVJbnQ4TGlzdCogICAgICAgICAgZ2V0QVVJbnQ4KCk7CisgICAgSW50MTZMaXN0KiAgICAgICAgICBnZXRBSW50MTYoKTsKKyAgICBVSW50MTZMaXN0KiAgICAgICAgIGdldEFVSW50MTYoKTsKKyAgICBJbnQzMkxpc3QqICAgICAgICAgIGdldEFJbnQzMigpOworICAgIFVJbnQzMkxpc3QqICAgICAgICAgZ2V0QVVJbnQzMigpOworICAgIEludDY0TGlzdCogICAgICAgICAgZ2V0QUludDY0KCk7CisgICAgVUludDY0TGlzdCogICAgICAgICBnZXRBVUludDY0KCk7CisKKyAgICB2b2lkICAgICAgICAgICAgICAgIHB1dEludDgoaW50OF90IHZhbHVlKTsKKyAgICB2b2lkICAgICAgICAgICAgICAgIHB1dFVJbnQ4KHVpbnQ4X3QgdmFsdWUpOworICAgIHZvaWQgICAgICAgICAgICAgICAgcHV0SW50MTYoaW50MTZfdCB2YWx1ZSk7CisgICAgdm9pZCAgICAgICAgICAgICAgICBwdXRVSW50MTYodWludDE2X3QgdmFsdWUpOworICAgIHZvaWQgICAgICAgICAgICAgICAgcHV0SW50MzIoaW50MzJfdCB2YWx1ZSk7CisgICAgdm9pZCAgICAgICAgICAgICAgICBwdXRVSW50MzIodWludDMyX3QgdmFsdWUpOworICAgIHZvaWQgICAgICAgICAgICAgICAgcHV0SW50NjQoaW50NjRfdCB2YWx1ZSk7CisgICAgdm9pZCAgICAgICAgICAgICAgICBwdXRVSW50NjQodWludDY0X3QgdmFsdWUpOworICAgIHZvaWQgICAgICAgICAgICAgICAgcHV0SW50MTI4KGNvbnN0IGludDEyOF90JiB2YWx1ZSk7CisgICAgdm9pZCAgICAgICAgICAgICAgICBwdXRVSW50MTI4KGNvbnN0IHVpbnQxMjhfdCYgdmFsdWUpOworCisgICAgdm9pZCAgICAgICAgICAgICAgICBwdXRBSW50OChjb25zdCBpbnQ4X3QqIHZhbHVlcywgaW50IGNvdW50KTsKKyAgICB2b2lkICAgICAgICAgICAgICAgIHB1dEFVSW50OChjb25zdCB1aW50OF90KiB2YWx1ZXMsIGludCBjb3VudCk7CisgICAgdm9pZCAgICAgICAgICAgICAgICBwdXRBSW50MTYoY29uc3QgaW50MTZfdCogdmFsdWVzLCBpbnQgY291bnQpOworICAgIHZvaWQgICAgICAgICAgICAgICAgcHV0QVVJbnQxNihjb25zdCB1aW50MTZfdCogdmFsdWVzLCBpbnQgY291bnQpOworICAgIHZvaWQgICAgICAgICAgICAgICAgcHV0QVVJbnQxNihjb25zdCBVSW50MTZMaXN0KiB2YWx1ZXMpOworICAgIHZvaWQgICAgICAgICAgICAgICAgcHV0QUludDMyKGNvbnN0IGludDMyX3QqIHZhbHVlcywgaW50IGNvdW50KTsKKyAgICB2b2lkICAgICAgICAgICAgICAgIHB1dEFVSW50MzIoY29uc3QgdWludDMyX3QqIHZhbHVlcywgaW50IGNvdW50KTsKKyAgICB2b2lkICAgICAgICAgICAgICAgIHB1dEFVSW50MzIoY29uc3QgVUludDMyTGlzdCogbGlzdCk7CisgICAgdm9pZCAgICAgICAgICAgICAgICBwdXRBSW50NjQoY29uc3QgaW50NjRfdCogdmFsdWVzLCBpbnQgY291bnQpOworICAgIHZvaWQgICAgICAgICAgICAgICAgcHV0QVVJbnQ2NChjb25zdCB1aW50NjRfdCogdmFsdWVzLCBpbnQgY291bnQpOworICAgIHZvaWQgICAgICAgICAgICAgICAgcHV0U3RyaW5nKGNvbnN0IE10cFN0cmluZ0J1ZmZlciYgc3RyaW5nKTsKKyAgICB2b2lkICAgICAgICAgICAgICAgIHB1dFN0cmluZyhjb25zdCBjaGFyKiBzdHJpbmcpOworICAgIHZvaWQgICAgICAgICAgICAgICAgcHV0U3RyaW5nKGNvbnN0IHVpbnQxNl90KiBzdHJpbmcpOworICAgIGlubGluZSB2b2lkICAgICAgICAgcHV0RW1wdHlTdHJpbmcoKSB7IHB1dFVJbnQ4KDApOyB9CisgICAgaW5saW5lIHZvaWQgICAgICAgICBwdXRFbXB0eUFycmF5KCkgeyBwdXRVSW50MzIoMCk7IH0KKworCisjaWZkZWYgTVRQX0RFVklDRQorICAgIC8vIGZpbGwgb3VyIGJ1ZmZlciB3aXRoIGRhdGEgZnJvbSB0aGUgZ2l2ZW4gZmlsZSBkZXNjcmlwdG9yCisgICAgaW50ICAgICAgICAgICAgICAgICByZWFkKGludCBmZCk7CisgICAgaW50ICAgICAgICAgICAgICAgICByZWFkRGF0YUhlYWRlcihpbnQgZmQpOworCisgICAgLy8gd3JpdGUgb3VyIGRhdGEgdG8gdGhlIGdpdmVuIGZpbGUgZGVzY3JpcHRvcgorICAgIGludCAgICAgICAgICAgICAgICAgd3JpdGUoaW50IGZkKTsKKyAgICBpbnQgICAgICAgICAgICAgICAgIHdyaXRlRGF0YUhlYWRlcihpbnQgZmQsIHVpbnQzMl90IGxlbmd0aCk7CisjZW5kaWYKKworI2lmZGVmIE1UUF9IT1NUCisgICAgaW50ICAgICAgICAgICAgICAgICByZWFkKHN0cnVjdCB1c2JfZW5kcG9pbnQgKmVwKTsKKyAgICBpbnQgICAgICAgICAgICAgICAgIHJlYWREYXRhKHN0cnVjdCB1c2JfZW5kcG9pbnQgKmVwLCB2b2lkKiBidWZmZXIsIGludCBsZW5ndGgpOworICAgIGludCAgICAgICAgICAgICAgICAgcmVhZERhdGFIZWFkZXIoc3RydWN0IHVzYl9lbmRwb2ludCAqZXApOworCisgICAgaW50ICAgICAgICAgICAgICAgICB3cml0ZURhdGFIZWFkZXIoc3RydWN0IHVzYl9lbmRwb2ludCAqZXAsIHVpbnQzMl90IGxlbmd0aCk7CisgICAgaW50ICAgICAgICAgICAgICAgICB3cml0ZShzdHJ1Y3QgdXNiX2VuZHBvaW50ICplcCk7CisgICAgaW50ICAgICAgICAgICAgICAgICB3cml0ZShzdHJ1Y3QgdXNiX2VuZHBvaW50ICplcCwgdm9pZCogYnVmZmVyLCB1aW50MzJfdCBsZW5ndGgpOworI2VuZGlmCisKKyAgICBpbmxpbmUgYm9vbCAgICAgICAgIGhhc0RhdGEoKSBjb25zdCB7IHJldHVybiBtUGFja2V0U2l6ZSA+IE1UUF9DT05UQUlORVJfSEVBREVSX1NJWkU7IH0KKyAgICB2b2lkKiAgICAgICAgICAgICAgIGdldERhdGEoaW50JiBvdXRMZW5ndGgpIGNvbnN0OworfTsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIF9NVFBfREFUQV9QQUNLRVRfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cERhdGFiYXNlLmggYi9tZWRpYS9tdHAvTXRwRGF0YWJhc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzgyM2RmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL010cERhdGFiYXNlLmgKQEAgLTAsMCArMSw4MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX01UUF9EQVRBQkFTRV9ICisjZGVmaW5lIF9NVFBfREFUQUJBU0VfSAorCisjaW5jbHVkZSAiTXRwVHlwZXMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBNdHBEYXRhUGFja2V0OworCitjbGFzcyBNdHBEYXRhYmFzZSB7CitwdWJsaWM6CisgICAgdmlydHVhbCB+TXRwRGF0YWJhc2UoKSB7fQorCisgICAgLy8gY2FsbGVkIGZyb20gU2VuZE9iamVjdEluZm8gdG8gcmVzZXJ2ZSBhIGRhdGFiYXNlIGVudHJ5IGZvciB0aGUgaW5jb21pbmcgZmlsZQorICAgIHZpcnR1YWwgTXRwT2JqZWN0SGFuZGxlICAgICAgICAgYmVnaW5TZW5kT2JqZWN0KGNvbnN0IGNoYXIqIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdEZvcm1hdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdEhhbmRsZSBwYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cFN0b3JhZ2VJRCBzdG9yYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lX3QgbW9kaWZpZWQpID0gMDsKKworICAgIC8vIGNhbGxlZCB0byByZXBvcnQgc3VjY2VzcyBvciBmYWlsdXJlIG9mIHRoZSBTZW5kT2JqZWN0IGZpbGUgdHJhbnNmZXIKKyAgICAvLyBzdWNjZXNzIHNob3VsZCBzaWduYWwgYSBub3RpZmljYXRpb24gb2YgdGhlIG5ldyBvYmplY3QncyBjcmVhdGlvbiwKKyAgICAvLyBmYWlsdXJlIHNob3VsZCByZW1vdmUgdGhlIGRhdGFiYXNlIGVudHJ5IGNyZWF0ZWQgaW4gYmVnaW5TZW5kT2JqZWN0CisgICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgICAgICAgICBlbmRTZW5kT2JqZWN0KGNvbnN0IGNoYXIqIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdEhhbmRsZSBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdEZvcm1hdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3VjY2VlZGVkKSA9IDA7CisKKyAgICB2aXJ0dWFsIE10cE9iamVjdEhhbmRsZUxpc3QqICAgIGdldE9iamVjdExpc3QoTXRwU3RvcmFnZUlEIHN0b3JhZ2VJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0Rm9ybWF0IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0SGFuZGxlIHBhcmVudCkgPSAwOworCisgICAgdmlydHVhbCBpbnQgICAgICAgICAgICAgICAgICAgICBnZXROdW1PYmplY3RzKE10cFN0b3JhZ2VJRCBzdG9yYWdlSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdEZvcm1hdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdEhhbmRsZSBwYXJlbnQpID0gMDsKKworICAgIC8vIGNhbGxlZSBzaG91bGQgZGVsZXRlW10gdGhlIHJlc3VsdHMgZnJvbSB0aGVzZQorICAgIC8vIHJlc3VsdHMgY2FuIGJlIE5VTEwKKyAgICB2aXJ0dWFsIE10cE9iamVjdEZvcm1hdExpc3QqICAgIGdldFN1cHBvcnRlZFBsYXliYWNrRm9ybWF0cygpID0gMDsKKyAgICB2aXJ0dWFsIE10cE9iamVjdEZvcm1hdExpc3QqICAgIGdldFN1cHBvcnRlZENhcHR1cmVGb3JtYXRzKCkgPSAwOworICAgIHZpcnR1YWwgTXRwT2JqZWN0UHJvcGVydHlMaXN0KiAgZ2V0U3VwcG9ydGVkT2JqZWN0UHJvcGVydGllcyhNdHBPYmplY3RGb3JtYXQgZm9ybWF0KSA9IDA7CisgICAgdmlydHVhbCBNdHBEZXZpY2VQcm9wZXJ0eUxpc3QqICBnZXRTdXBwb3J0ZWREZXZpY2VQcm9wZXJ0aWVzKCkgPSAwOworCisgICAgdmlydHVhbCBNdHBSZXNwb25zZUNvZGUgICAgICAgICBnZXRPYmplY3RQcm9wZXJ0eShNdHBPYmplY3RIYW5kbGUgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RQcm9wZXJ0eSBwcm9wZXJ0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwRGF0YVBhY2tldCYgcGFja2V0KSA9IDA7CisKKyAgICB2aXJ0dWFsIE10cFJlc3BvbnNlQ29kZSAgICAgICAgIGdldE9iamVjdEluZm8oTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwRGF0YVBhY2tldCYgcGFja2V0KSA9IDA7CisKKyAgICB2aXJ0dWFsIE10cFJlc3BvbnNlQ29kZSAgICAgICAgIGdldE9iamVjdEZpbGVQYXRoKE10cE9iamVjdEhhbmRsZSBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cFN0cmluZyYgZmlsZVBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QmIGZpbGVMZW5ndGgpID0gMDsKKworICAgIHZpcnR1YWwgTXRwUmVzcG9uc2VDb2RlICAgICAgICAgZGVsZXRlRmlsZShNdHBPYmplY3RIYW5kbGUgaGFuZGxlKSA9IDA7CisKKyAgICB2aXJ0dWFsIE10cE9iamVjdEhhbmRsZUxpc3QqICAgIGdldE9iamVjdFJlZmVyZW5jZXMoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSkgPSAwOworCisgICAgdmlydHVhbCBNdHBSZXNwb25zZUNvZGUgICAgICAgICBzZXRPYmplY3RSZWZlcmVuY2VzKE10cE9iamVjdEhhbmRsZSBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdEhhbmRsZUxpc3QqIHJlZmVyZW5jZXMpID0gMDsKKworfTsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIF9NVFBfREFUQUJBU0VfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cERlYnVnLmNwcCBiL21lZGlhL210cC9NdHBEZWJ1Zy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDZiMTA3ZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBEZWJ1Zy5jcHAKQEAgLTAsMCArMSwzODcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiTXRwRGVidWcuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgQ29kZUVudHJ5IHsKKyAgICBjb25zdCBjaGFyKiBuYW1lOworICAgIHVpbnQxNl90IGNvZGU7Cit9OworCitzdGF0aWMgY29uc3QgQ29kZUVudHJ5IHNPcGVyYXRpb25Db2Rlc1tdID0geworICAgIHsgIk1UUF9PUEVSQVRJT05fR0VUX0RFVklDRV9JTkZPIiwgICAgICAgICAgICAgIDB4MTAwMSB9LAorICAgIHsgIk1UUF9PUEVSQVRJT05fT1BFTl9TRVNTSU9OIiwgICAgICAgICAgICAgICAgIDB4MTAwMiB9LAorICAgIHsgIk1UUF9PUEVSQVRJT05fQ0xPU0VfU0VTU0lPTiIsICAgICAgICAgICAgICAgIDB4MTAwMyB9LAorICAgIHsgIk1UUF9PUEVSQVRJT05fR0VUX1NUT1JBR0VfSURTIiwgICAgICAgICAgICAgIDB4MTAwNCB9LAorICAgIHsgIk1UUF9PUEVSQVRJT05fR0VUX1NUT1JBR0VfSU5GTyIsICAgICAgICAgICAgIDB4MTAwNSB9LAorICAgIHsgIk1UUF9PUEVSQVRJT05fR0VUX05VTV9PQkpFQ1RTIiwgICAgICAgICAgICAgIDB4MTAwNiB9LAorICAgIHsgIk1UUF9PUEVSQVRJT05fR0VUX09CSkVDVF9IQU5ETEVTIiwgICAgICAgICAgIDB4MTAwNyB9LAorICAgIHsgIk1UUF9PUEVSQVRJT05fR0VUX09CSkVDVF9JTkZPIiwgICAgICAgICAgICAgIDB4MTAwOCB9LAorICAgIHsgIk1UUF9PUEVSQVRJT05fR0VUX09CSkVDVCIsICAgICAgICAgICAgICAgICAgIDB4MTAwOSB9LAorICAgIHsgIk1UUF9PUEVSQVRJT05fR0VUX1RIVU1CIiwgICAgICAgICAgICAgICAgICAgIDB4MTAwQSB9LAorICAgIHsgIk1UUF9PUEVSQVRJT05fREVMRVRFX09CSkVDVCIsICAgICAgICAgICAgICAgIDB4MTAwQiB9LAorICAgIHsgIk1UUF9PUEVSQVRJT05fU0VORF9PQkpFQ1RfSU5GTyIsICAgICAgICAgICAgIDB4MTAwQyB9LAorICAgIHsgIk1UUF9PUEVSQVRJT05fU0VORF9PQkpFQ1QiLCAgICAgICAgICAgICAgICAgIDB4MTAwRCB9LAorICAgIHsgIk1UUF9PUEVSQVRJT05fSU5JVElBVEVfQ0FQVFVSRSIsICAgICAgICAgICAgIDB4MTAwRSB9LAorICAgIHsgIk1UUF9PUEVSQVRJT05fRk9STUFUX1NUT1JFIiwgICAgICAgICAgICAgICAgIDB4MTAwRiB9LAorICAgIHsgIk1UUF9PUEVSQVRJT05fUkVTRVRfREVWSUNFIiwgICAgICAgICAgICAgICAgIDB4MTAxMCB9LAorICAgIHsgIk1UUF9PUEVSQVRJT05fU0VMRl9URVNUIiwgICAgICAgICAgICAgICAgICAgIDB4MTAxMSB9LAorICAgIHsgIk1UUF9PUEVSQVRJT05fU0VUX09CSkVDVF9QUk9URUNUSU9OIiwgICAgICAgIDB4MTAxMiB9LAorICAgIHsgIk1UUF9PUEVSQVRJT05fUE9XRVJfRE9XTiIsICAgICAgICAgICAgICAgICAgIDB4MTAxMyB9LAorICAgIHsgIk1UUF9PUEVSQVRJT05fR0VUX0RFVklDRV9QUk9QX0RFU0MiLCAgICAgICAgIDB4MTAxNCB9LAorICAgIHsgIk1UUF9PUEVSQVRJT05fR0VUX0RFVklDRV9QUk9QX1ZBTFVFIiwgICAgICAgIDB4MTAxNSB9LAorICAgIHsgIk1UUF9PUEVSQVRJT05fU0VUX0RFVklDRV9QUk9QX1ZBTFVFIiwgICAgICAgIDB4MTAxNiB9LAorICAgIHsgIk1UUF9PUEVSQVRJT05fUkVTRVRfREVWSUNFX1BST1BfVkFMVUUiLCAgICAgIDB4MTAxNyB9LAorICAgIHsgIk1UUF9PUEVSQVRJT05fVEVSTUlOQVRFX09QRU5fQ0FQVFVSRSIsICAgICAgIDB4MTAxOCB9LAorICAgIHsgIk1UUF9PUEVSQVRJT05fTU9WRV9PQkpFQ1QiLCAgICAgICAgICAgICAgICAgIDB4MTAxOSB9LAorICAgIHsgIk1UUF9PUEVSQVRJT05fQ09QWV9PQkpFQ1QiLCAgICAgICAgICAgICAgICAgIDB4MTAxQSB9LAorICAgIHsgIk1UUF9PUEVSQVRJT05fR0VUX1BBUlRJQUxfT0JKRUNUIiwgICAgICAgICAgIDB4MTAxQiB9LAorICAgIHsgIk1UUF9PUEVSQVRJT05fSU5JVElBVEVfT1BFTl9DQVBUVVJFIiwgICAgICAgIDB4MTAxQyB9LAorICAgIHsgIk1UUF9PUEVSQVRJT05fR0VUX09CSkVDVF9QUk9QU19TVVBQT1JURUQiLCAgIDB4OTgwMSB9LAorICAgIHsgIk1UUF9PUEVSQVRJT05fR0VUX09CSkVDVF9QUk9QX0RFU0MiLCAgICAgICAgIDB4OTgwMiB9LAorICAgIHsgIk1UUF9PUEVSQVRJT05fR0VUX09CSkVDVF9QUk9QX1ZBTFVFIiwgICAgICAgIDB4OTgwMyB9LAorICAgIHsgIk1UUF9PUEVSQVRJT05fU0VUX09CSkVDVF9QUk9QX1ZBTFVFIiwgICAgICAgIDB4OTgwNCB9LAorICAgIHsgIk1UUF9PUEVSQVRJT05fR0VUX09CSkVDVF9SRUZFUkVOQ0VTIiwgICAgICAgIDB4OTgxMCB9LAorICAgIHsgIk1UUF9PUEVSQVRJT05fU0VUX09CSkVDVF9SRUZFUkVOQ0VTIiwgICAgICAgIDB4OTgxMSB9LAorICAgIHsgIk1UUF9PUEVSQVRJT05fU0tJUCIsICAgICAgICAgICAgICAgICAgICAgICAgIDB4OTgyMCB9LAorICAgIHsgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICB9LAorfTsKKworc3RhdGljIGNvbnN0IENvZGVFbnRyeSBzRm9ybWF0Q29kZXNbXSA9IHsKKyAgICB7ICJNVFBfT1BFUkFUSU9OX0dFVF9ERVZJQ0VfSU5GTyIsICAgICAgICAgICAgICAweDEwMDEgfSwKKyAgICB7ICJNVFBfRk9STUFUX1VOREVGSU5FRCIsICAgICAgICAgICAgICAgICAgICAgICAweDMwMDAgfSwKKyAgICB7ICJNVFBfRk9STUFUX0FTU09DSUFUSU9OIiwgICAgICAgICAgICAgICAgICAgICAweDMwMDEgfSwKKyAgICB7ICJNVFBfRk9STUFUX1NDUklQVCIsICAgICAgICAgICAgICAgICAgICAgICAgICAweDMwMDIgfSwKKyAgICB7ICJNVFBfRk9STUFUX0VYRUNVVEFCTEUiLCAgICAgICAgICAgICAgICAgICAgICAweDMwMDMgfSwKKyAgICB7ICJNVFBfRk9STUFUX1RFWFQiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMwMDQgfSwKKyAgICB7ICJNVFBfRk9STUFUX0hUTUwiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMwMDUgfSwKKyAgICB7ICJNVFBfRk9STUFUX0RQT0YiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMwMDYgfSwKKyAgICB7ICJNVFBfRk9STUFUX0FJRkYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMwMDcgfSwKKyAgICB7ICJNVFBfRk9STUFUX1dBViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMwMDggfSwKKyAgICB7ICJNVFBfRk9STUFUX01QMyIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMwMDkgfSwKKyAgICB7ICJNVFBfRk9STUFUX0FWSSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMwMEEgfSwKKyAgICB7ICJNVFBfRk9STUFUX01QRUciLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMwMEIgfSwKKyAgICB7ICJNVFBfRk9STUFUX0FTRiIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMwMEMgfSwKKyAgICB7ICJNVFBfRk9STUFUX0RFRklORUQiLCAgICAgICAgICAgICAgICAgICAgICAgICAweDM4MDAgfSwKKyAgICB7ICJNVFBfRk9STUFUX0VYSUZfSlBFRyIsICAgICAgICAgICAgICAgICAgICAgICAweDM4MDEgfSwKKyAgICB7ICJNVFBfRk9STUFUX1RJRkZfRVAiLCAgICAgICAgICAgICAgICAgICAgICAgICAweDM4MDIgfSwKKyAgICB7ICJNVFBfRk9STUFUX0ZMQVNIUElYIiwgICAgICAgICAgICAgICAgICAgICAgICAweDM4MDMgfSwKKyAgICB7ICJNVFBfRk9STUFUX0JNUCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDM4MDQgfSwKKyAgICB7ICJNVFBfRk9STUFUX0NJRkYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDM4MDUgfSwKKyAgICB7ICJNVFBfRk9STUFUX0dJRiIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDM4MDcgfSwKKyAgICB7ICJNVFBfRk9STUFUX0pGSUYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDM4MDggfSwKKyAgICB7ICJNVFBfRk9STUFUX0NEIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDM4MDkgfSwKKyAgICB7ICJNVFBfRk9STUFUX1BJQ1QiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDM4MEEgfSwKKyAgICB7ICJNVFBfRk9STUFUX1BORyIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDM4MEIgfSwKKyAgICB7ICJNVFBfRk9STUFUX1RJRkYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDM4MEQgfSwKKyAgICB7ICJNVFBfRk9STUFUX1RJRkZfSVQiLCAgICAgICAgICAgICAgICAgICAgICAgICAweDM4MEUgfSwKKyAgICB7ICJNVFBfRk9STUFUX0pQMiIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDM4MEYgfSwKKyAgICB7ICJNVFBfRk9STUFUX0pQWCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDM4MTAgfSwKKyAgICB7ICJNVFBfRk9STUFUX1VOREVGSU5FRF9GSVJNV0FSRSIsICAgICAgICAgICAgICAweEI4MDIgfSwKKyAgICB7ICJNVFBfRk9STUFUX1dJTkRPV1NfSU1BR0VfRk9STUFUIiwgICAgICAgICAgICAweEI4ODEgfSwKKyAgICB7ICJNVFBfRk9STUFUX1VOREVGSU5FRF9BVURJTyIsICAgICAgICAgICAgICAgICAweEI5MDAgfSwKKyAgICB7ICJNVFBfRk9STUFUX1dNQSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEI5MDEgfSwKKyAgICB7ICJNVFBfRk9STUFUX09HRyIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEI5MDIgfSwKKyAgICB7ICJNVFBfRk9STUFUX0FBQyIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEI5MDMgfSwKKyAgICB7ICJNVFBfRk9STUFUX0FVRElCTEUiLCAgICAgICAgICAgICAgICAgICAgICAgICAweEI5MDQgfSwKKyAgICB7ICJNVFBfRk9STUFUX0ZMQUMiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEI5MDYgfSwKKyAgICB7ICJNVFBfRk9STUFUX1VOREVGSU5FRF9WSURFTyIsICAgICAgICAgICAgICAgICAweEI5ODAgfSwKKyAgICB7ICJNVFBfRk9STUFUX1dNViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEI5ODEgfSwKKyAgICB7ICJNVFBfRk9STUFUX01QNF9DT05UQUlORVIiLCAgICAgICAgICAgICAgICAgICAweEI5ODIgfSwKKyAgICB7ICJNVFBfRk9STUFUX01QMiIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEI5ODMgfSwKKyAgICB7ICJNVFBfRk9STUFUXzNHUF9DT05UQUlORVIiLCAgICAgICAgICAgICAgICAgICAweEI5ODQgfSwKKyAgICB7ICJNVFBfRk9STUFUX1VOREVGSU5FRF9DT0xMRUNUSU9OIiwgICAgICAgICAgICAweEJBMDAgfSwKKyAgICB7ICJNVFBfRk9STUFUX0FCU1RSQUNUX01VTFRJTUVESUFfQUxCVU0iLCAgICAgICAweEJBMDEgfSwKKyAgICB7ICJNVFBfRk9STUFUX0FCU1RSQUNUX0lNQUdFX0FMQlVNIiwgICAgICAgICAgICAweEJBMDIgfSwKKyAgICB7ICJNVFBfRk9STUFUX0FCU1RSQUNUX0FVRElPX0FMQlVNIiwgICAgICAgICAgICAweEJBMDMgfSwKKyAgICB7ICJNVFBfRk9STUFUX0FCU1RSQUNUX1ZJREVPX0FMQlVNIiwgICAgICAgICAgICAweEJBMDQgfSwKKyAgICB7ICJNVFBfRk9STUFUX0FCU1RSQUNUX0FWX1BMQVlMSVNUIiwgICAgICAgICAgICAweEJBMDUgfSwKKyAgICB7ICJNVFBfRk9STUFUX0FCU1RSQUNUX0NPTlRBQ1RfR1JPVVAiLCAgICAgICAgICAweEJBMDYgfSwKKyAgICB7ICJNVFBfRk9STUFUX0FCU1RSQUNUX01FU1NBR0VfRk9MREVSIiwgICAgICAgICAweEJBMDcgfSwKKyAgICB7ICJNVFBfRk9STUFUX0FCU1RSQUNUX0NIQVBURVJFRF9QUk9EVUNUSU9OIiwgICAweEJBMDggfSwKKyAgICB7ICJNVFBfRk9STUFUX0FCU1RSQUNUX0FVRElPX1BMQVlMSVNUIiwgICAgICAgICAweEJBMDkgfSwKKyAgICB7ICJNVFBfRk9STUFUX0FCU1RSQUNUX1ZJREVPX1BMQVlMSVNUIiwgICAgICAgICAweEJBMEEgfSwKKyAgICB7ICJNVFBfRk9STUFUX0FCU1RSQUNUX01FRElBQ0FTVCIsICAgICAgICAgICAgICAweEJBMEIgfSwKKyAgICB7ICJNVFBfRk9STUFUX1dQTF9QTEFZTElTVCIsICAgICAgICAgICAgICAgICAgICAweEJBMTAgfSwKKyAgICB7ICJNVFBfRk9STUFUX00zVV9QTEFZTElTVCIsICAgICAgICAgICAgICAgICAgICAweEJBMTEgfSwKKyAgICB7ICJNVFBfRk9STUFUX01QTF9QTEFZTElTVCIsICAgICAgICAgICAgICAgICAgICAweEJBMTIgfSwKKyAgICB7ICJNVFBfRk9STUFUX0FTWF9QTEFZTElTVCIsICAgICAgICAgICAgICAgICAgICAweEJBMTMgfSwKKyAgICB7ICJNVFBfRk9STUFUX1BMU19QTEFZTElTVCIsICAgICAgICAgICAgICAgICAgICAweEJBMTQgfSwKKyAgICB7ICJNVFBfRk9STUFUX1VOREVGSU5FRF9ET0NVTUVOVCIsICAgICAgICAgICAgICAweEJBODAgfSwKKyAgICB7ICJNVFBfRk9STUFUX0FCU1RSQUNUX0RPQ1VNRU5UIiwgICAgICAgICAgICAgICAweEJBODEgfSwKKyAgICB7ICJNVFBfRk9STUFUX1hNTF9ET0NVTUVOVCIsICAgICAgICAgICAgICAgICAgICAweEJBODIgfSwKKyAgICB7ICJNVFBfRk9STUFUX01TX1dPUkRfRE9DVU1FTlQiLCAgICAgICAgICAgICAgICAweEJBODMgfSwKKyAgICB7ICJNVFBfRk9STUFUX01IVF9DT01QSUxFRF9IVE1MX0RPQ1VNRU5UIiwgICAgICAweEJBODQgfSwKKyAgICB7ICJNVFBfRk9STUFUX01TX0VYQ0VMX1NQUkVBRFNIRUVUIiwgICAgICAgICAgICAweEJBODUgfSwKKyAgICB7ICJNVFBfRk9STUFUX01TX1BPV0VSUE9JTlRfUFJFU0VOVEFUSU9OIiwgICAgICAweEJBODYgfSwKKyAgICB7ICJNVFBfRk9STUFUX1VOREVGSU5FRF9NRVNTQUdFIiwgICAgICAgICAgICAgICAweEJCMDAgfSwKKyAgICB7ICJNVFBfRk9STUFUX0FCU1RSQUNUX01FU1NTQUdFIiwgICAgICAgICAgICAgICAweEJCMDEgfSwKKyAgICB7ICJNVFBfRk9STUFUX1VOREVGSU5FRF9DT05UQUNUIiwgICAgICAgICAgICAgICAweEJCODAgfSwKKyAgICB7ICJNVFBfRk9STUFUX0FCU1RSQUNUX0NPTlRBQ1QiLCAgICAgICAgICAgICAgICAweEJCODEgfSwKKyAgICB7ICJNVFBfRk9STUFUX1ZDQVJEXzIiLCAgICAgICAgICAgICAgICAgICAgICAgICAweEJCODIgfSwKKyAgICB7IDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgfSwKK307CisKK3N0YXRpYyBjb25zdCBDb2RlRW50cnkgc09iamVjdFByb3BDb2Rlc1tdID0geworICAgIHsgIk1UUF9QUk9QRVJUWV9TVE9SQUdFX0lEIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REMwMSB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9PQkpFQ1RfRk9STUFUIiwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REMwMiB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9QUk9URUNUSU9OX1NUQVRVUyIsICAgICAgICAgICAgICAgICAgICAgIDB4REMwMyB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9PQkpFQ1RfU0laRSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REMwNCB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9BU1NPQ0lBVElPTl9UWVBFIiwgICAgICAgICAgICAgICAgICAgICAgIDB4REMwNSB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9BU1NPQ0lBVElPTl9ERVNDIiwgICAgICAgICAgICAgICAgICAgICAgIDB4REMwNiB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9PQkpFQ1RfRklMRV9OQU1FIiwgICAgICAgICAgICAgICAgICAgICAgIDB4REMwNyB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9EQVRFX0NSRUFURUQiLCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REMwOCB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9EQVRFX01PRElGSUVEIiwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REMwOSB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9LRVlXT1JEUyIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REMwQSB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9QQVJFTlRfT0JKRUNUIiwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REMwQiB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9BTExPV0VEX0ZPTERFUl9DT05URU5UUyIsICAgICAgICAgICAgICAgIDB4REMwQyB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9ISURERU4iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REMwRCB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9TWVNURU1fT0JKRUNUIiwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REMwRSB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9QRVJTSVNURU5UX1VJRCIsICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM0MSB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9TWU5DX0lEIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM0MiB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9QUk9QRVJUWV9CQUciLCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM0MyB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9OQU1FIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM0NCB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9DUkVBVEVEX0JZIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM0NSB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9BUlRJU1QiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM0NiB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9EQVRFX0FVVEhPUkVEIiwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM0NyB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9ERVNDUklQVElPTiIsICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM0OCB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9VUkxfUkVGRVJFTkNFIiwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM0OSB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9MQU5HVUFHRV9MT0NBTEUiLCAgICAgICAgICAgICAgICAgICAgICAgIDB4REM0QSB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9DT1BZUklHSFRfSU5GT1JNQVRJT04iLCAgICAgICAgICAgICAgICAgIDB4REM0QiB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9TT1VSQ0UiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM0QyB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9PUklHSU5fTE9DQVRJT04iLCAgICAgICAgICAgICAgICAgICAgICAgIDB4REM0RCB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9EQVRFX0FEREVEIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM0RSB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9OT05fQ09OU1VNQUJMRSIsICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM0RiB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9DT1JSVVBUX1VOUExBWUFCTEUiLCAgICAgICAgICAgICAgICAgICAgIDB4REM1MCB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9QUk9EVUNFUl9TRVJJQUxfTlVNQkVSIiwgICAgICAgICAgICAgICAgIDB4REM1MSB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9SRVBSRVNFTlRBVElWRV9TQU1QTEVfRk9STUFUIiwgICAgICAgICAgIDB4REM4MSB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9SRVBSRVNFTlRBVElWRV9TQU1QTEVfU0laRSIsICAgICAgICAgICAgIDB4REM4MiB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9SRVBSRVNFTlRBVElWRV9TQU1QTEVfSEVJR0hUIiwgICAgICAgICAgIDB4REM4MyB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9SRVBSRVNFTlRBVElWRV9TQU1QTEVfV0lEVEgiLCAgICAgICAgICAgIDB4REM4NCB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9SRVBSRVNFTlRBVElWRV9TQU1QTEVfRFVSQVRJT04iLCAgICAgICAgIDB4REM4NSB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9SRVBSRVNFTlRBVElWRV9TQU1QTEVfREFUQSIsICAgICAgICAgICAgIDB4REM4NiB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9XSURUSCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM4NyB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9IRUlHSFQiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM4OCB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9EVVJBVElPTiIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM4OSB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9SQVRJTkciLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM4QSB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9UUkFDSyIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM4QiB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9HRU5SRSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM4QyB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9DUkVESVRTIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM4RCB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9MWVJJQ1MiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM4RSB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9TVUJTQ1JJUFRJT05fQ09OVEVOVF9JRCIsICAgICAgICAgICAgICAgIDB4REM4RiB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9QUk9EVUNFRF9CWSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM5MCB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9VU0VfQ09VTlQiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM5MSB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9TS0lQX0NPVU5UIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM5MiB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9MQVNUX0FDQ0VTU0VEIiwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM5MyB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9QQVJFTlRBTF9SQVRJTkciLCAgICAgICAgICAgICAgICAgICAgICAgIDB4REM5NCB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9NRVRBX0dFTlJFIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM5NSB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9DT01QT1NFUiIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM5NiB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9FRkZFQ1RJVkVfUkFUSU5HIiwgICAgICAgICAgICAgICAgICAgICAgIDB4REM5NyB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9TVUJUSVRMRSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM5OCB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9PUklHSU5BTF9SRUxFQVNFX0RBVEUiLCAgICAgICAgICAgICAgICAgIDB4REM5OSB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9BTEJVTV9OQU1FIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM5QSB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9BTEJVTV9BUlRJU1QiLCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM5QiB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9NT09EIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM5QyB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9EUk1fU1RBVFVTIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM5RCB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9TVUJfREVTQ1JJUFRJT04iLCAgICAgICAgICAgICAgICAgICAgICAgIDB4REM5RSB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9JU19DUk9QUEVEIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RENEMSB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9JU19DT0xPVVJfQ09SUkVDVEVEIiwgICAgICAgICAgICAgICAgICAgIDB4RENEMiB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9JTUFHRV9CSVRfREVQVEgiLCAgICAgICAgICAgICAgICAgICAgICAgIDB4RENEMyB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9GX05VTUJFUiIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RENENCB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9FWFBPU1VSRV9USU1FIiwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RENENSB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9FWFBPU1VSRV9JTkRFWCIsICAgICAgICAgICAgICAgICAgICAgICAgIDB4RENENiB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9UT1RBTF9CSVRSQVRFIiwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REU5MSB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9CSVRSQVRFX1RZUEUiLCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REU5MiB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9TQU1QTEVfUkFURSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REU5MyB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9OVU1CRVJfT0ZfQ0hBTk5FTFMiLCAgICAgICAgICAgICAgICAgICAgIDB4REU5NCB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9BVURJT19CSVRfREVQVEgiLCAgICAgICAgICAgICAgICAgICAgICAgIDB4REU5NSB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9TQ0FOX1RZUEUiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REU5NyB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9BVURJT19XQVZFX0NPREVDIiwgICAgICAgICAgICAgICAgICAgICAgIDB4REU5OSB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9BVURJT19CSVRSQVRFIiwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REU5QSB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9WSURFT19GT1VSQ0NfQ09ERUMiLCAgICAgICAgICAgICAgICAgICAgIDB4REU5QiB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9WSURFT19CSVRSQVRFIiwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REU5QyB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9GUkFNRVNfUEVSX1RIT1VTQU5EX1NFQ09ORFMiLCAgICAgICAgICAgIDB4REU5RCB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9LRVlGUkFNRV9ESVNUQU5DRSIsICAgICAgICAgICAgICAgICAgICAgIDB4REU5RSB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9CVUZGRVJfU0laRSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REU5RiB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9FTkNPRElOR19RVUFMSVRZIiwgICAgICAgICAgICAgICAgICAgICAgIDB4REVBMCB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9FTkNPRElOR19QUk9GSUxFIiwgICAgICAgICAgICAgICAgICAgICAgIDB4REVBMSB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9ESVNQTEFZX05BTUUiLCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RENFMCB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9CT0RZX1RFWFQiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RENFMSB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9TVUJKRUNUIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RENFMiB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9QUklPUklUWSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RENFMyB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9HSVZFTl9OQU1FIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REQwMCB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9NSURETEVfTkFNRVMiLCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REQwMSB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9GQU1JTFlfTkFNRSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REQwMiB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9QUkVGSVgiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REQwMyB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9TVUZGSVgiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REQwNCB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9QSE9ORVRJQ19HSVZFTl9OQU1FIiwgICAgICAgICAgICAgICAgICAgIDB4REQwNSB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9QSE9ORVRJQ19GQU1JTFlfTkFNRSIsICAgICAgICAgICAgICAgICAgIDB4REQwNiB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9FTUFJTF9QUklNQVJZIiwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REQwNyB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9FTUFJTF9QRVJTT05BTF8xIiwgICAgICAgICAgICAgICAgICAgICAgIDB4REQwOCB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9FTUFJTF9QRVJTT05BTF8yIiwgICAgICAgICAgICAgICAgICAgICAgIDB4REQwOSB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9FTUFJTF9CVVNJTkVTU18xIiwgICAgICAgICAgICAgICAgICAgICAgIDB4REQwQSB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9FTUFJTF9CVVNJTkVTU18yIiwgICAgICAgICAgICAgICAgICAgICAgIDB4REQwQiB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9FTUFJTF9PVEhFUlMiLCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REQwQyB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9QSE9ORV9OVU1CRVJfUFJJTUFSWSIsICAgICAgICAgICAgICAgICAgIDB4REQwRCB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9QSE9ORV9OVU1CRVJfUEVSU09OQUwiLCAgICAgICAgICAgICAgICAgIDB4REQwRSB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9QSE9ORV9OVU1CRVJfUEVSU09OQUxfMiIsICAgICAgICAgICAgICAgIDB4REQwRiB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9QSE9ORV9OVU1CRVJfQlVTSU5FU1MiLCAgICAgICAgICAgICAgICAgIDB4REQxMCB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9QSE9ORV9OVU1CRVJfQlVTSU5FU1NfMiIsICAgICAgICAgICAgICAgIDB4REQxMSB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9QSE9ORV9OVU1CRVJfTU9CSUxFIiwgICAgICAgICAgICAgICAgICAgIDB4REQxMiB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9QSE9ORV9OVU1CRVJfTU9CSUxFXzIiLCAgICAgICAgICAgICAgICAgIDB4REQxMyB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9GQVhfTlVNQkVSX1BSSU1BUlkiLCAgICAgICAgICAgICAgICAgICAgIDB4REQxNCB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9GQVhfTlVNQkVSX1BFUlNPTkFMIiwgICAgICAgICAgICAgICAgICAgIDB4REQxNSB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9GQVhfTlVNQkVSX0JVU0lORVNTIiwgICAgICAgICAgICAgICAgICAgIDB4REQxNiB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9QQUdFUl9OVU1CRVIiLCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REQxNyB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9QSE9ORV9OVU1CRVJfT1RIRVJTIiwgICAgICAgICAgICAgICAgICAgIDB4REQxOCB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9QUklNQVJZX1dFQl9BRERSRVNTIiwgICAgICAgICAgICAgICAgICAgIDB4REQxOSB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9QRVJTT05BTF9XRUJfQUREUkVTUyIsICAgICAgICAgICAgICAgICAgIDB4REQxQSB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9CVVNJTkVTU19XRUJfQUREUkVTUyIsICAgICAgICAgICAgICAgICAgIDB4REQxQiB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9JTlNUQU5UX01FU1NBTkdFUl9BRERSRVNTIiwgICAgICAgICAgICAgIDB4REQxQyB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9JTlNUQU5UX01FU1NBTkdFUl9BRERSRVNTXzIiLCAgICAgICAgICAgIDB4REQxRCB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9JTlNUQU5UX01FU1NBTkdFUl9BRERSRVNTXzMiLCAgICAgICAgICAgIDB4REQxRSB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9QT1NUQUxfQUREUkVTU19QRVJTT05BTF9GVUxMIiwgICAgICAgICAgIDB4REQxRiB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9QT1NUQUxfQUREUkVTU19QRVJTT05BTF9MSU5FXzEiLCAgICAgICAgIDB4REQyMCB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9QT1NUQUxfQUREUkVTU19QRVJTT05BTF9MSU5FXzIiLCAgICAgICAgIDB4REQyMSB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9QT1NUQUxfQUREUkVTU19QRVJTT05BTF9DSVRZIiwgICAgICAgICAgIDB4REQyMiB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9QT1NUQUxfQUREUkVTU19QRVJTT05BTF9SRUdJT04iLCAgICAgICAgIDB4REQyMyB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9QT1NUQUxfQUREUkVTU19QRVJTT05BTF9QT1NUQUxfQ09ERSIsICAgIDB4REQyNCB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9QT1NUQUxfQUREUkVTU19QRVJTT05BTF9DT1VOVFJZIiwgICAgICAgIDB4REQyNSB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9QT1NUQUxfQUREUkVTU19CVVNJTkVTU19GVUxMIiwgICAgICAgICAgIDB4REQyNiB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9QT1NUQUxfQUREUkVTU19CVVNJTkVTU19MSU5FXzEiLCAgICAgICAgIDB4REQyNyB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9QT1NUQUxfQUREUkVTU19CVVNJTkVTU19MSU5FXzIiLCAgICAgICAgIDB4REQyOCB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9QT1NUQUxfQUREUkVTU19CVVNJTkVTU19DSVRZIiwgICAgICAgICAgIDB4REQyOSB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9QT1NUQUxfQUREUkVTU19CVVNJTkVTU19SRUdJT04iLCAgICAgICAgIDB4REQyQSB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9QT1NUQUxfQUREUkVTU19CVVNJTkVTU19QT1NUQUxfQ09ERSIsICAgIDB4REQyQiB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9QT1NUQUxfQUREUkVTU19CVVNJTkVTU19DT1VOVFJZIiwgICAgICAgIDB4REQyQyB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9QT1NUQUxfQUREUkVTU19PVEhFUl9GVUxMIiwgICAgICAgICAgICAgIDB4REQyRCB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9QT1NUQUxfQUREUkVTU19PVEhFUl9MSU5FXzEiLCAgICAgICAgICAgIDB4REQyRSB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9QT1NUQUxfQUREUkVTU19PVEhFUl9MSU5FXzIiLCAgICAgICAgICAgIDB4REQyRiB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9QT1NUQUxfQUREUkVTU19PVEhFUl9DSVRZIiwgICAgICAgICAgICAgIDB4REQzMCB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9QT1NUQUxfQUREUkVTU19PVEhFUl9SRUdJT04iLCAgICAgICAgICAgIDB4REQzMSB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9QT1NUQUxfQUREUkVTU19PVEhFUl9QT1NUQUxfQ09ERSIsICAgICAgIDB4REQzMiB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9QT1NUQUxfQUREUkVTU19PVEhFUl9DT1VOVFJZIiwgICAgICAgICAgIDB4REQzMyB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9PUkdBTklaQVRJT05fTkFNRSIsICAgICAgICAgICAgICAgICAgICAgIDB4REQzNCB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9QSE9ORVRJQ19PUkdBTklaQVRJT05fTkFNRSIsICAgICAgICAgICAgIDB4REQzNSB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9ST0xFIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REQzNiB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9CSVJUSERBVEUiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REQzNyB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9NRVNTQUdFX1RPIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REQ0MCB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9NRVNTQUdFX0NDIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REQ0MSB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9NRVNTQUdFX0JDQyIsICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REQ0MiB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9NRVNTQUdFX1JFQUQiLCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REQ0MyB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9NRVNTQUdFX1JFQ0VJVkVEX1RJTUUiLCAgICAgICAgICAgICAgICAgIDB4REQ0NCB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9NRVNTQUdFX1NFTkRFUiIsICAgICAgICAgICAgICAgICAgICAgICAgIDB4REQ0NSB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9BQ1RJVklUWV9CRUdJTl9USU1FIiwgICAgICAgICAgICAgICAgICAgIDB4REQ1MCB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9BQ1RJVklUWV9FTkRfVElNRSIsICAgICAgICAgICAgICAgICAgICAgIDB4REQ1MSB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9BQ1RJVklUWV9MT0NBVElPTiIsICAgICAgICAgICAgICAgICAgICAgIDB4REQ1MiB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9BQ1RJVklUWV9SRVFVSVJFRF9BVFRFTkRFRVMiLCAgICAgICAgICAgIDB4REQ1NCB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9BQ1RJVklUWV9PUFRJT05BTF9BVFRFTkRFRVMiLCAgICAgICAgICAgIDB4REQ1NSB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9BQ1RJVklUWV9SRVNPVVJDRVMiLCAgICAgICAgICAgICAgICAgICAgIDB4REQ1NiB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9BQ1RJVklUWV9BQ0NFUFRFRCIsICAgICAgICAgICAgICAgICAgICAgIDB4REQ1NyB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9BQ1RJVklUWV9URU5UQVRJVkUiLCAgICAgICAgICAgICAgICAgICAgIDB4REQ1OCB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9BQ1RJVklUWV9ERUNMSU5FRCIsICAgICAgICAgICAgICAgICAgICAgIDB4REQ1OSB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9BQ1RJVklUWV9SRU1BSU5ERVJfVElNRSIsICAgICAgICAgICAgICAgIDB4REQ1QSB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9BQ1RJVklUWV9PV05FUiIsICAgICAgICAgICAgICAgICAgICAgICAgIDB4REQ1QiB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9BQ1RJVklUWV9TVEFUVVMiLCAgICAgICAgICAgICAgICAgICAgICAgIDB4REQ1QyB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9PV05FUiIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REQ1RCB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9FRElUT1IiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REQ1RSB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9XRUJNQVNURVIiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REQ1RiB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9VUkxfU09VUkNFIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REQ2MCB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9VUkxfREVTVElOQVRJT04iLCAgICAgICAgICAgICAgICAgICAgICAgIDB4REQ2MSB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9USU1FX0JPT0tNQVJLIiwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REQ2MiB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9PQkpFQ1RfQk9PS01BUksiLCAgICAgICAgICAgICAgICAgICAgICAgIDB4REQ2MyB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9CWVRFX0JPT0tNQVJLIiwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REQ2NCB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9MQVNUX0JVSUxEX0RBVEUiLCAgICAgICAgICAgICAgICAgICAgICAgIDB4REQ3MCB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9USU1FX1RPX0xJVkUiLCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REQ3MSB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9NRURJQV9HVUlEIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REQ3MiB9LAorICAgIHsgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICB9LAorfTsKKworc3RhdGljIGNvbnN0IENvZGVFbnRyeSBzRGV2aWNlUHJvcENvZGVzW10gPSB7CisgICAgeyAiTVRQX0RFVklDRV9QUk9QRVJUWV9VTkRFRklORUQiLCAgICAgICAgICAgICAgICAgICAgICAgMHg1MDAwIH0sCisgICAgeyAiTVRQX0RFVklDRV9QUk9QRVJUWV9CQVRURVJZX0xFVkVMIiwgICAgICAgICAgICAgICAgICAgMHg1MDAxIH0sCisgICAgeyAiTVRQX0RFVklDRV9QUk9QRVJUWV9GVU5DVElPTkFMX01PREUiLCAgICAgICAgICAgICAgICAgMHg1MDAyIH0sCisgICAgeyAiTVRQX0RFVklDRV9QUk9QRVJUWV9JTUFHRV9TSVpFIiwgICAgICAgICAgICAgICAgICAgICAgMHg1MDAzIH0sCisgICAgeyAiTVRQX0RFVklDRV9QUk9QRVJUWV9DT01QUkVTU0lPTl9TRVRUSU5HIiwgICAgICAgICAgICAgMHg1MDA0IH0sCisgICAgeyAiTVRQX0RFVklDRV9QUk9QRVJUWV9XSElURV9CQUxBTkNFIiwgICAgICAgICAgICAgICAgICAgMHg1MDA1IH0sCisgICAgeyAiTVRQX0RFVklDRV9QUk9QRVJUWV9SR0JfR0FJTiIsICAgICAgICAgICAgICAgICAgICAgICAgMHg1MDA2IH0sCisgICAgeyAiTVRQX0RFVklDRV9QUk9QRVJUWV9GX05VTUJFUiIsICAgICAgICAgICAgICAgICAgICAgICAgMHg1MDA3IH0sCisgICAgeyAiTVRQX0RFVklDRV9QUk9QRVJUWV9GT0NBTF9MRU5HVEgiLCAgICAgICAgICAgICAgICAgICAgMHg1MDA4IH0sCisgICAgeyAiTVRQX0RFVklDRV9QUk9QRVJUWV9GT0NVU19ESVNUQU5DRSIsICAgICAgICAgICAgICAgICAgMHg1MDA5IH0sCisgICAgeyAiTVRQX0RFVklDRV9QUk9QRVJUWV9GT0NVU19NT0RFIiwgICAgICAgICAgICAgICAgICAgICAgMHg1MDBBIH0sCisgICAgeyAiTVRQX0RFVklDRV9QUk9QRVJUWV9FWFBPU1VSRV9NRVRFUklOR19NT0RFIiwgICAgICAgICAgMHg1MDBCIH0sCisgICAgeyAiTVRQX0RFVklDRV9QUk9QRVJUWV9GTEFTSF9NT0RFIiwgICAgICAgICAgICAgICAgICAgICAgMHg1MDBDIH0sCisgICAgeyAiTVRQX0RFVklDRV9QUk9QRVJUWV9FWFBPU1VSRV9USU1FIiwgICAgICAgICAgICAgICAgICAgMHg1MDBEIH0sCisgICAgeyAiTVRQX0RFVklDRV9QUk9QRVJUWV9FWFBPU1VSRV9QUk9HUkFNX01PREUiLCAgICAgICAgICAgMHg1MDBFIH0sCisgICAgeyAiTVRQX0RFVklDRV9QUk9QRVJUWV9FWFBPU1VSRV9JTkRFWCIsICAgICAgICAgICAgICAgICAgMHg1MDBGIH0sCisgICAgeyAiTVRQX0RFVklDRV9QUk9QRVJUWV9FWFBPU1VSRV9CSUFTX0NPTVBFTlNBVElPTiIsICAgICAgMHg1MDEwIH0sCisgICAgeyAiTVRQX0RFVklDRV9QUk9QRVJUWV9EQVRFVElNRSIsICAgICAgICAgICAgICAgICAgICAgICAgMHg1MDExIH0sCisgICAgeyAiTVRQX0RFVklDRV9QUk9QRVJUWV9DQVBUVVJFX0RFTEFZIiwgICAgICAgICAgICAgICAgICAgMHg1MDEyIH0sCisgICAgeyAiTVRQX0RFVklDRV9QUk9QRVJUWV9TVElMTF9DQVBUVVJFX01PREUiLCAgICAgICAgICAgICAgMHg1MDEzIH0sCisgICAgeyAiTVRQX0RFVklDRV9QUk9QRVJUWV9DT05UUkFTVCIsICAgICAgICAgICAgICAgICAgICAgICAgMHg1MDE0IH0sCisgICAgeyAiTVRQX0RFVklDRV9QUk9QRVJUWV9TSEFSUE5FU1MiLCAgICAgICAgICAgICAgICAgICAgICAgMHg1MDE1IH0sCisgICAgeyAiTVRQX0RFVklDRV9QUk9QRVJUWV9ESUdJVEFMX1pPT00iLCAgICAgICAgICAgICAgICAgICAgMHg1MDE2IH0sCisgICAgeyAiTVRQX0RFVklDRV9QUk9QRVJUWV9FRkZFQ1RfTU9ERSIsICAgICAgICAgICAgICAgICAgICAgMHg1MDE3IH0sCisgICAgeyAiTVRQX0RFVklDRV9QUk9QRVJUWV9CVVJTVF9OVU1CRVIiLCAgICAgICAgICAgICAgICAgICAgMHg1MDE4IH0sCisgICAgeyAiTVRQX0RFVklDRV9QUk9QRVJUWV9CVVJTVF9JTlRFUlZBTCIsICAgICAgICAgICAgICAgICAgMHg1MDE5IH0sCisgICAgeyAiTVRQX0RFVklDRV9QUk9QRVJUWV9USU1FTEFQU0VfTlVNQkVSIiwgICAgICAgICAgICAgICAgMHg1MDFBIH0sCisgICAgeyAiTVRQX0RFVklDRV9QUk9QRVJUWV9USU1FTEFQU0VfSU5URVJWQUwiLCAgICAgICAgICAgICAgMHg1MDFCIH0sCisgICAgeyAiTVRQX0RFVklDRV9QUk9QRVJUWV9GT0NVU19NRVRFUklOR19NT0RFIiwgICAgICAgICAgICAgMHg1MDFDIH0sCisgICAgeyAiTVRQX0RFVklDRV9QUk9QRVJUWV9VUExPQURfVVJMIiwgICAgICAgICAgICAgICAgICAgICAgMHg1MDFEIH0sCisgICAgeyAiTVRQX0RFVklDRV9QUk9QRVJUWV9BUlRJU1QiLCAgICAgICAgICAgICAgICAgICAgICAgICAgMHg1MDFFIH0sCisgICAgeyAiTVRQX0RFVklDRV9QUk9QRVJUWV9DT1BZUklHSFRfSU5GTyIsICAgICAgICAgICAgICAgICAgMHg1MDFGIH0sCisgICAgeyAiTVRQX0RFVklDRV9QUk9QRVJUWV9TWU5DSFJPTklaQVRJT05fUEFSVE5FUiIsICAgICAgICAgMHhENDAxIH0sCisgICAgeyAiTVRQX0RFVklDRV9QUk9QRVJUWV9ERVZJQ0VfRlJJRU5ETFlfTkFNRSIsICAgICAgICAgICAgMHhENDAyIH0sCisgICAgeyAiTVRQX0RFVklDRV9QUk9QRVJUWV9WT0xVTUUiLCAgICAgICAgICAgICAgICAgICAgICAgICAgMHhENDAzIH0sCisgICAgeyAiTVRQX0RFVklDRV9QUk9QRVJUWV9TVVBQT1JURURfRk9STUFUU19PUkRFUkVEIiwgICAgICAgMHhENDA0IH0sCisgICAgeyAiTVRQX0RFVklDRV9QUk9QRVJUWV9ERVZJQ0VfSUNPTiIsICAgICAgICAgICAgICAgICAgICAgMHhENDA1IH0sCisgICAgeyAiTVRQX0RFVklDRV9QUk9QRVJUWV9QTEFZQkFDS19SQVRFIiwgICAgICAgICAgICAgICAgICAgMHhENDEwIH0sCisgICAgeyAiTVRQX0RFVklDRV9QUk9QRVJUWV9QTEFZQkFDS19PQkpFQ1QiLCAgICAgICAgICAgICAgICAgMHhENDExIH0sCisgICAgeyAiTVRQX0RFVklDRV9QUk9QRVJUWV9QTEFZQkFDS19DT05UQUlORVJfSU5ERVgiLCAgICAgICAgMHhENDEyIH0sCisgICAgeyAiTVRQX0RFVklDRV9QUk9QRVJUWV9TRVNTSU9OX0lOSVRJQVRPUl9WRVJTSU9OX0lORk8iLCAgMHhENDA2IH0sCisgICAgeyAiTVRQX0RFVklDRV9QUk9QRVJUWV9QRVJDRUlWRURfREVWSUNFX1RZUEUiLCAgICAgICAgICAgMHhENDA3IH0sCisgICAgeyAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgIH0sCit9OworCitzdGF0aWMgY29uc3QgY2hhciogZ2V0Q29kZU5hbWUodWludDE2X3QgY29kZSwgY29uc3QgQ29kZUVudHJ5KiB0YWJsZSkgeworICAgIGNvbnN0IENvZGVFbnRyeSogZW50cnkgPSB0YWJsZTsKKyAgICB3aGlsZSAoZW50cnktPm5hbWUpIHsKKyAgICAgICAgaWYgKGVudHJ5LT5jb2RlID09IGNvZGUpCisgICAgICAgICAgICByZXR1cm4gZW50cnktPm5hbWU7CisgICAgICAgIGVudHJ5Kys7CisgICAgfQorICAgIHJldHVybiAiVU5LTk9XTiI7Cit9CisKK2NvbnN0IGNoYXIqIE10cERlYnVnOjpnZXRPcGVyYXRpb25Db2RlTmFtZShNdHBPcGVyYXRpb25Db2RlIGNvZGUpIHsKKyAgICByZXR1cm4gZ2V0Q29kZU5hbWUoY29kZSwgc09wZXJhdGlvbkNvZGVzKTsKK30KKworY29uc3QgY2hhciogTXRwRGVidWc6OmdldEZvcm1hdENvZGVOYW1lKE10cE9wZXJhdGlvbkNvZGUgY29kZSkgeworICAgIHJldHVybiBnZXRDb2RlTmFtZShjb2RlLCBzRm9ybWF0Q29kZXMpOworfQorCitjb25zdCBjaGFyKiBNdHBEZWJ1Zzo6Z2V0T2JqZWN0UHJvcENvZGVOYW1lKE10cFByb3BlcnR5Q29kZSBjb2RlKSB7CisgICAgcmV0dXJuIGdldENvZGVOYW1lKGNvZGUsIHNPYmplY3RQcm9wQ29kZXMpOworfQorCitjb25zdCBjaGFyKiBNdHBEZWJ1Zzo6Z2V0RGV2aWNlUHJvcENvZGVOYW1lKE10cFByb3BlcnR5Q29kZSBjb2RlKSB7CisgICAgcmV0dXJuIGdldENvZGVOYW1lKGNvZGUsIHNEZXZpY2VQcm9wQ29kZXMpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cERlYnVnLmggYi9tZWRpYS9tdHAvTXRwRGVidWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjUzZTMxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL010cERlYnVnLmgKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX01UUF9ERUJVR19ICisjZGVmaW5lIF9NVFBfREVCVUdfSAorCisvLyAjZGVmaW5lIExPR19OREVCVUcgMAorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiTXRwVHlwZXMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBNdHBEZWJ1ZyB7CitwdWJsaWM6CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGdldE9wZXJhdGlvbkNvZGVOYW1lKE10cE9wZXJhdGlvbkNvZGUgY29kZSk7CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGdldEZvcm1hdENvZGVOYW1lKE10cE9iamVjdEZvcm1hdCBjb2RlKTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciogZ2V0T2JqZWN0UHJvcENvZGVOYW1lKE10cFByb3BlcnR5Q29kZSBjb2RlKTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciogZ2V0RGV2aWNlUHJvcENvZGVOYW1lKE10cFByb3BlcnR5Q29kZSBjb2RlKTsKK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBfTVRQX0RFQlVHX0gKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBEZXZpY2UuY3BwIGIvbWVkaWEvbXRwL010cERldmljZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQ2OGY3NQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBEZXZpY2UuY3BwCkBAIC0wLDAgKzEsNDk2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJNdHBEZXZpY2UiCisKKyNpbmNsdWRlICJNdHBEZWJ1Zy5oIgorI2luY2x1ZGUgIk10cERldmljZS5oIgorI2luY2x1ZGUgIk10cERldmljZUluZm8uaCIKKyNpbmNsdWRlICJNdHBPYmplY3RJbmZvLmgiCisjaW5jbHVkZSAiTXRwUHJvcGVydHkuaCIKKyNpbmNsdWRlICJNdHBTdG9yYWdlSW5mby5oIgorI2luY2x1ZGUgIk10cFN0cmluZ0J1ZmZlci5oIgorI2luY2x1ZGUgIk10cFV0aWxzLmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGVuZGlhbi5oPgorCisjaW5jbHVkZSA8dXNiaG9zdC91c2Job3N0Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworTXRwRGV2aWNlOjpNdHBEZXZpY2Uoc3RydWN0IHVzYl9kZXZpY2UqIGRldmljZSwgaW50IGludGVyZmFjZSwKKyAgICAgICAgICAgIHN0cnVjdCB1c2JfZW5kcG9pbnQgKmVwX2luLCBzdHJ1Y3QgdXNiX2VuZHBvaW50ICplcF9vdXQsCisgICAgICAgICAgICBzdHJ1Y3QgdXNiX2VuZHBvaW50ICplcF9pbnRyKQorICAgIDogICBtRGV2aWNlKGRldmljZSksCisgICAgICAgIG1JbnRlcmZhY2UoaW50ZXJmYWNlKSwKKyAgICAgICAgbUVuZHBvaW50SW4oZXBfaW4pLAorICAgICAgICBtRW5kcG9pbnRPdXQoZXBfb3V0KSwKKyAgICAgICAgbUVuZHBvaW50SW50cihlcF9pbnRyKSwKKyAgICAgICAgbURldmljZUluZm8oTlVMTCksCisgICAgICAgIG1JRCh1c2JfZGV2aWNlX2dldF91bmlxdWVfaWQoZGV2aWNlKSksCisgICAgICAgIG1TZXNzaW9uSUQoMCksCisgICAgICAgIG1UcmFuc2FjdGlvbklEKDApCit7Cit9CisKK010cERldmljZTo6fk10cERldmljZSgpIHsKKyAgICBjbG9zZSgpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbURldmljZVByb3BlcnRpZXMuc2l6ZSgpOyBpKyspCisgICAgICAgIGRlbGV0ZSBtRGV2aWNlUHJvcGVydGllc1tpXTsKK30KKwordm9pZCBNdHBEZXZpY2U6OmluaXRpYWxpemUoKSB7CisgICAgb3BlblNlc3Npb24oKTsKKyAgICBtRGV2aWNlSW5mbyA9IGdldERldmljZUluZm8oKTsKKyAgICBpZiAobURldmljZUluZm8pIHsKKyAgICAgICAgbURldmljZUluZm8tPnByaW50KCk7CisKKyAgICAgICAgaWYgKG1EZXZpY2VJbmZvLT5tRGV2aWNlUHJvcGVydGllcykgeworICAgICAgICAgICAgaW50IGNvdW50ID0gbURldmljZUluZm8tPm1EZXZpY2VQcm9wZXJ0aWVzLT5zaXplKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBNdHBEZXZpY2VQcm9wZXJ0eSBwcm9wQ29kZSA9ICgqbURldmljZUluZm8tPm1EZXZpY2VQcm9wZXJ0aWVzKVtpXTsKKyAgICAgICAgICAgICAgICBNdHBQcm9wZXJ0eSogcHJvcGVydHkgPSBnZXREZXZpY2VQcm9wRGVzYyhwcm9wQ29kZSk7CisgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5KSB7CisgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5LT5wcmludCgpOworICAgICAgICAgICAgICAgICAgICBtRGV2aWNlUHJvcGVydGllcy5wdXNoKHByb3BlcnR5KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgTXRwRGV2aWNlOjpjbG9zZSgpIHsKKyAgICBpZiAobURldmljZSkgeworICAgICAgICB1c2JfZGV2aWNlX3JlbGVhc2VfaW50ZXJmYWNlKG1EZXZpY2UsIG1JbnRlcmZhY2UpOworICAgICAgICB1c2JfZGV2aWNlX2Nsb3NlKG1EZXZpY2UpOworICAgICAgICBtRGV2aWNlID0gTlVMTDsKKyAgICB9Cit9CisKK2NvbnN0IGNoYXIqIE10cERldmljZTo6Z2V0RGV2aWNlTmFtZSgpIHsKKyAgICBpZiAobURldmljZSkKKyAgICAgICAgcmV0dXJuIHVzYl9kZXZpY2VfZ2V0X25hbWUobURldmljZSk7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gIj8/PyI7Cit9CisKK2Jvb2wgTXRwRGV2aWNlOjpvcGVuU2Vzc2lvbigpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU11dGV4KTsKKworICAgIG1TZXNzaW9uSUQgPSAwOworICAgIG1UcmFuc2FjdGlvbklEID0gMDsKKyAgICBNdHBTZXNzaW9uSUQgbmV3U2Vzc2lvbiA9IDE7CisgICAgbVJlcXVlc3QucmVzZXQoKTsKKyAgICBtUmVxdWVzdC5zZXRQYXJhbWV0ZXIoMSwgbmV3U2Vzc2lvbik7CisgICAgaWYgKCFzZW5kUmVxdWVzdChNVFBfT1BFUkFUSU9OX09QRU5fU0VTU0lPTikpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBNdHBSZXNwb25zZUNvZGUgcmV0ID0gcmVhZFJlc3BvbnNlKCk7CisgICAgaWYgKHJldCA9PSBNVFBfUkVTUE9OU0VfU0VTU0lPTl9BTFJFQURZX09QRU4pCisgICAgICAgIG5ld1Nlc3Npb24gPSBtUmVzcG9uc2UuZ2V0UGFyYW1ldGVyKDEpOworICAgIGVsc2UgaWYgKHJldCAhPSBNVFBfUkVTUE9OU0VfT0spCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIG1TZXNzaW9uSUQgPSBuZXdTZXNzaW9uOworICAgIG1UcmFuc2FjdGlvbklEID0gMTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBNdHBEZXZpY2U6OmNsb3NlU2Vzc2lvbigpIHsKKyAgICAvLyBGSVhNRQorICAgIHJldHVybiB0cnVlOworfQorCitNdHBEZXZpY2VJbmZvKiBNdHBEZXZpY2U6OmdldERldmljZUluZm8oKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1NdXRleCk7CisKKyAgICBtUmVxdWVzdC5yZXNldCgpOworICAgIGlmICghc2VuZFJlcXVlc3QoTVRQX09QRVJBVElPTl9HRVRfREVWSUNFX0lORk8pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIXJlYWREYXRhKCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIE10cFJlc3BvbnNlQ29kZSByZXQgPSByZWFkUmVzcG9uc2UoKTsKKyAgICBpZiAocmV0ID09IE1UUF9SRVNQT05TRV9PSykgeworICAgICAgICBNdHBEZXZpY2VJbmZvKiBpbmZvID0gbmV3IE10cERldmljZUluZm87CisgICAgICAgIGluZm8tPnJlYWQobURhdGEpOworICAgICAgICByZXR1cm4gaW5mbzsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK010cFN0b3JhZ2VJRExpc3QqIE10cERldmljZTo6Z2V0U3RvcmFnZUlEcygpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU11dGV4KTsKKworICAgIG1SZXF1ZXN0LnJlc2V0KCk7CisgICAgaWYgKCFzZW5kUmVxdWVzdChNVFBfT1BFUkFUSU9OX0dFVF9TVE9SQUdFX0lEUykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghcmVhZERhdGEoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTXRwUmVzcG9uc2VDb2RlIHJldCA9IHJlYWRSZXNwb25zZSgpOworICAgIGlmIChyZXQgPT0gTVRQX1JFU1BPTlNFX09LKSB7CisgICAgICAgIHJldHVybiBtRGF0YS5nZXRBVUludDMyKCk7CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCitNdHBTdG9yYWdlSW5mbyogTXRwRGV2aWNlOjpnZXRTdG9yYWdlSW5mbyhNdHBTdG9yYWdlSUQgc3RvcmFnZUlEKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1NdXRleCk7CisKKyAgICBtUmVxdWVzdC5yZXNldCgpOworICAgIG1SZXF1ZXN0LnNldFBhcmFtZXRlcigxLCBzdG9yYWdlSUQpOworICAgIGlmICghc2VuZFJlcXVlc3QoTVRQX09QRVJBVElPTl9HRVRfU1RPUkFHRV9JTkZPKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFyZWFkRGF0YSgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBNdHBSZXNwb25zZUNvZGUgcmV0ID0gcmVhZFJlc3BvbnNlKCk7CisgICAgaWYgKHJldCA9PSBNVFBfUkVTUE9OU0VfT0spIHsKKyAgICAgICAgTXRwU3RvcmFnZUluZm8qIGluZm8gPSBuZXcgTXRwU3RvcmFnZUluZm8oc3RvcmFnZUlEKTsKKyAgICAgICAgaW5mby0+cmVhZChtRGF0YSk7CisgICAgICAgIHJldHVybiBpbmZvOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKworTXRwT2JqZWN0SGFuZGxlTGlzdCogTXRwRGV2aWNlOjpnZXRPYmplY3RIYW5kbGVzKE10cFN0b3JhZ2VJRCBzdG9yYWdlSUQsCisgICAgICAgICAgICBNdHBPYmplY3RGb3JtYXQgZm9ybWF0LCBNdHBPYmplY3RIYW5kbGUgcGFyZW50KSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1NdXRleCk7CisKKyAgICBtUmVxdWVzdC5yZXNldCgpOworICAgIG1SZXF1ZXN0LnNldFBhcmFtZXRlcigxLCBzdG9yYWdlSUQpOworICAgIG1SZXF1ZXN0LnNldFBhcmFtZXRlcigyLCBmb3JtYXQpOworICAgIG1SZXF1ZXN0LnNldFBhcmFtZXRlcigzLCBwYXJlbnQpOworICAgIGlmICghc2VuZFJlcXVlc3QoTVRQX09QRVJBVElPTl9HRVRfT0JKRUNUX0hBTkRMRVMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIXJlYWREYXRhKCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIE10cFJlc3BvbnNlQ29kZSByZXQgPSByZWFkUmVzcG9uc2UoKTsKKyAgICBpZiAocmV0ID09IE1UUF9SRVNQT05TRV9PSykgeworICAgICAgICByZXR1cm4gbURhdGEuZ2V0QVVJbnQzMigpOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKworTXRwT2JqZWN0SW5mbyogTXRwRGV2aWNlOjpnZXRPYmplY3RJbmZvKE10cE9iamVjdEhhbmRsZSBoYW5kbGUpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU11dGV4KTsKKworICAgIC8vIEZJWE1FIC0gd2UgbWlnaHQgd2FudCB0byBhZGQgc29tZSBjYWNoaW5nIGhlcmUKKworICAgIG1SZXF1ZXN0LnJlc2V0KCk7CisgICAgbVJlcXVlc3Quc2V0UGFyYW1ldGVyKDEsIGhhbmRsZSk7CisgICAgaWYgKCFzZW5kUmVxdWVzdChNVFBfT1BFUkFUSU9OX0dFVF9PQkpFQ1RfSU5GTykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghcmVhZERhdGEoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTXRwUmVzcG9uc2VDb2RlIHJldCA9IHJlYWRSZXNwb25zZSgpOworICAgIGlmIChyZXQgPT0gTVRQX1JFU1BPTlNFX09LKSB7CisgICAgICAgIE10cE9iamVjdEluZm8qIGluZm8gPSBuZXcgTXRwT2JqZWN0SW5mbyhoYW5kbGUpOworICAgICAgICBpbmZvLT5yZWFkKG1EYXRhKTsKKyAgICAgICAgcmV0dXJuIGluZm87CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCit2b2lkKiBNdHBEZXZpY2U6OmdldFRodW1ibmFpbChNdHBPYmplY3RIYW5kbGUgaGFuZGxlLCBpbnQmIG91dExlbmd0aCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTXV0ZXgpOworCisgICAgbVJlcXVlc3QucmVzZXQoKTsKKyAgICBtUmVxdWVzdC5zZXRQYXJhbWV0ZXIoMSwgaGFuZGxlKTsKKyAgICBpZiAoc2VuZFJlcXVlc3QoTVRQX09QRVJBVElPTl9HRVRfVEhVTUIpICYmIHJlYWREYXRhKCkpIHsKKyAgICAgICAgTXRwUmVzcG9uc2VDb2RlIHJldCA9IHJlYWRSZXNwb25zZSgpOworICAgICAgICBpZiAocmV0ID09IE1UUF9SRVNQT05TRV9PSykgeworICAgICAgICAgICAgcmV0dXJuIG1EYXRhLmdldERhdGEob3V0TGVuZ3RoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBvdXRMZW5ndGggPSAwOworICAgIHJldHVybiBOVUxMOworfQorCitNdHBPYmplY3RIYW5kbGUgTXRwRGV2aWNlOjpzZW5kT2JqZWN0SW5mbyhNdHBPYmplY3RJbmZvKiBpbmZvKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1NdXRleCk7CisKKyAgICBtUmVxdWVzdC5yZXNldCgpOworICAgIE10cE9iamVjdEhhbmRsZSBwYXJlbnQgPSBpbmZvLT5tUGFyZW50OworICAgIGlmIChwYXJlbnQgPT0gMCkKKyAgICAgICAgcGFyZW50ID0gTVRQX1BBUkVOVF9ST09UOworCisgICAgbVJlcXVlc3Quc2V0UGFyYW1ldGVyKDEsIGluZm8tPm1TdG9yYWdlSUQpOworICAgIG1SZXF1ZXN0LnNldFBhcmFtZXRlcigyLCBpbmZvLT5tUGFyZW50KTsKKworICAgIG1EYXRhLnB1dFVJbnQzMihpbmZvLT5tU3RvcmFnZUlEKTsKKyAgICBtRGF0YS5wdXRVSW50MTYoaW5mby0+bUZvcm1hdCk7CisgICAgbURhdGEucHV0VUludDE2KGluZm8tPm1Qcm90ZWN0aW9uU3RhdHVzKTsKKyAgICBtRGF0YS5wdXRVSW50MzIoaW5mby0+bUNvbXByZXNzZWRTaXplKTsKKyAgICBtRGF0YS5wdXRVSW50MTYoaW5mby0+bVRodW1iRm9ybWF0KTsKKyAgICBtRGF0YS5wdXRVSW50MzIoaW5mby0+bVRodW1iQ29tcHJlc3NlZFNpemUpOworICAgIG1EYXRhLnB1dFVJbnQzMihpbmZvLT5tVGh1bWJQaXhXaWR0aCk7CisgICAgbURhdGEucHV0VUludDMyKGluZm8tPm1UaHVtYlBpeEhlaWdodCk7CisgICAgbURhdGEucHV0VUludDMyKGluZm8tPm1JbWFnZVBpeFdpZHRoKTsKKyAgICBtRGF0YS5wdXRVSW50MzIoaW5mby0+bUltYWdlUGl4SGVpZ2h0KTsKKyAgICBtRGF0YS5wdXRVSW50MzIoaW5mby0+bUltYWdlUGl4RGVwdGgpOworICAgIG1EYXRhLnB1dFVJbnQzMihpbmZvLT5tUGFyZW50KTsKKyAgICBtRGF0YS5wdXRVSW50MTYoaW5mby0+bUFzc29jaWF0aW9uVHlwZSk7CisgICAgbURhdGEucHV0VUludDMyKGluZm8tPm1Bc3NvY2lhdGlvbkRlc2MpOworICAgIG1EYXRhLnB1dFVJbnQzMihpbmZvLT5tU2VxdWVuY2VOdW1iZXIpOworICAgIG1EYXRhLnB1dFN0cmluZyhpbmZvLT5tTmFtZSk7CisKKyAgICBjaGFyIGNyZWF0ZWRbMTAwXSwgbW9kaWZpZWRbMTAwXTsKKyAgICBmb3JtYXREYXRlVGltZShpbmZvLT5tRGF0ZUNyZWF0ZWQsIGNyZWF0ZWQsIHNpemVvZihjcmVhdGVkKSk7CisgICAgZm9ybWF0RGF0ZVRpbWUoaW5mby0+bURhdGVNb2RpZmllZCwgbW9kaWZpZWQsIHNpemVvZihtb2RpZmllZCkpOworCisgICAgbURhdGEucHV0U3RyaW5nKGNyZWF0ZWQpOworICAgIG1EYXRhLnB1dFN0cmluZyhtb2RpZmllZCk7CisgICAgaWYgKGluZm8tPm1LZXl3b3JkcykKKyAgICAgICAgbURhdGEucHV0U3RyaW5nKGluZm8tPm1LZXl3b3Jkcyk7CisgICAgZWxzZQorICAgICAgICBtRGF0YS5wdXRFbXB0eVN0cmluZygpOworCisgICBpZiAoc2VuZFJlcXVlc3QoTVRQX09QRVJBVElPTl9TRU5EX09CSkVDVF9JTkZPKSAmJiBzZW5kRGF0YSgpKSB7CisgICAgICAgIE10cFJlc3BvbnNlQ29kZSByZXQgPSByZWFkUmVzcG9uc2UoKTsKKyAgICAgICAgaWYgKHJldCA9PSBNVFBfUkVTUE9OU0VfT0spIHsKKyAgICAgICAgICAgIGluZm8tPm1TdG9yYWdlSUQgPSBtUmVzcG9uc2UuZ2V0UGFyYW1ldGVyKDEpOworICAgICAgICAgICAgaW5mby0+bVBhcmVudCA9IG1SZXNwb25zZS5nZXRQYXJhbWV0ZXIoMik7CisgICAgICAgICAgICBpbmZvLT5tSGFuZGxlID0gbVJlc3BvbnNlLmdldFBhcmFtZXRlcigzKTsKKyAgICAgICAgICAgIHJldHVybiBpbmZvLT5tSGFuZGxlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAoTXRwT2JqZWN0SGFuZGxlKS0xOworfQorCitib29sIE10cERldmljZTo6c2VuZE9iamVjdChNdHBPYmplY3RJbmZvKiBpbmZvLCBpbnQgc3JjRkQpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU11dGV4KTsKKworICAgIGludCByZW1haW5pbmcgPSBpbmZvLT5tQ29tcHJlc3NlZFNpemU7CisgICAgbVJlcXVlc3QucmVzZXQoKTsKKyAgICBtUmVxdWVzdC5zZXRQYXJhbWV0ZXIoMSwgaW5mby0+bUhhbmRsZSk7CisgICAgaWYgKHNlbmRSZXF1ZXN0KE1UUF9PUEVSQVRJT05fU0VORF9PQkpFQ1QpKSB7CisgICAgICAgIC8vIHNlbmQgZGF0YSBoZWFkZXIKKyAgICAgICAgd3JpdGVEYXRhSGVhZGVyKE1UUF9PUEVSQVRJT05fU0VORF9PQkpFQ1QsIHJlbWFpbmluZyk7CisKKyAgICAgICAgY2hhciBidWZmZXJbNjU1MzZdOworICAgICAgICB3aGlsZSAocmVtYWluaW5nID4gMCkgeworICAgICAgICAgICAgaW50IGNvdW50ID0gcmVhZChzcmNGRCwgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSk7CisgICAgICAgICAgICBpZiAoY291bnQgPiAwKSB7CisgICAgICAgICAgICAgICAgaW50IHdyaXR0ZW4gPSBtRGF0YS53cml0ZShtRW5kcG9pbnRPdXQsIGJ1ZmZlciwgY291bnQpOworICAgICAgICAgICAgICAgIC8vIEZJWE1FIGNoZWNrIGVycm9yCisgICAgICAgICAgICAgICAgcmVtYWluaW5nIC09IGNvdW50OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBNdHBSZXNwb25zZUNvZGUgcmV0ID0gcmVhZFJlc3BvbnNlKCk7CisgICAgcmV0dXJuIChyZW1haW5pbmcgPT0gMCAmJiByZXQgPT0gTVRQX1JFU1BPTlNFX09LKTsKK30KKworYm9vbCBNdHBEZXZpY2U6OmRlbGV0ZU9iamVjdChNdHBPYmplY3RIYW5kbGUgaGFuZGxlKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1NdXRleCk7CisKKyAgICBtUmVxdWVzdC5yZXNldCgpOworICAgIG1SZXF1ZXN0LnNldFBhcmFtZXRlcigxLCBoYW5kbGUpOworICAgIGlmIChzZW5kUmVxdWVzdChNVFBfT1BFUkFUSU9OX0RFTEVURV9PQkpFQ1QpKSB7CisgICAgICAgIE10cFJlc3BvbnNlQ29kZSByZXQgPSByZWFkUmVzcG9uc2UoKTsKKyAgICAgICAgaWYgKHJldCA9PSBNVFBfUkVTUE9OU0VfT0spCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitNdHBPYmplY3RIYW5kbGUgTXRwRGV2aWNlOjpnZXRQYXJlbnQoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSkgeworICAgIE10cE9iamVjdEluZm8qIGluZm8gPSBnZXRPYmplY3RJbmZvKGhhbmRsZSk7CisgICAgaWYgKGluZm8pCisgICAgICAgIHJldHVybiBpbmZvLT5tUGFyZW50OworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIC0xOworfQorCitNdHBPYmplY3RIYW5kbGUgTXRwRGV2aWNlOjpnZXRTdG9yYWdlSUQoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSkgeworICAgIE10cE9iamVjdEluZm8qIGluZm8gPSBnZXRPYmplY3RJbmZvKGhhbmRsZSk7CisgICAgaWYgKGluZm8pCisgICAgICAgIHJldHVybiBpbmZvLT5tU3RvcmFnZUlEOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIC0xOworfQorCitNdHBQcm9wZXJ0eSogTXRwRGV2aWNlOjpnZXREZXZpY2VQcm9wRGVzYyhNdHBEZXZpY2VQcm9wZXJ0eSBjb2RlKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1NdXRleCk7CisKKyAgICBtUmVxdWVzdC5yZXNldCgpOworICAgIG1SZXF1ZXN0LnNldFBhcmFtZXRlcigxLCBjb2RlKTsKKyAgICBpZiAoIXNlbmRSZXF1ZXN0KE1UUF9PUEVSQVRJT05fR0VUX0RFVklDRV9QUk9QX0RFU0MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIXJlYWREYXRhKCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIE10cFJlc3BvbnNlQ29kZSByZXQgPSByZWFkUmVzcG9uc2UoKTsKKyAgICBpZiAocmV0ID09IE1UUF9SRVNQT05TRV9PSykgeworICAgICAgICBNdHBQcm9wZXJ0eSogcHJvcGVydHkgPSBuZXcgTXRwUHJvcGVydHk7CisgICAgICAgIHByb3BlcnR5LT5yZWFkKG1EYXRhLCB0cnVlKTsKKyAgICAgICAgcmV0dXJuIHByb3BlcnR5OworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKworY2xhc3MgUmVhZE9iamVjdFRocmVhZCA6IHB1YmxpYyBUaHJlYWQgeworcHJpdmF0ZToKKyAgICBNdHBEZXZpY2UqICAgICAgICAgIG1EZXZpY2U7CisgICAgTXRwT2JqZWN0SGFuZGxlICAgICBtSGFuZGxlOworICAgIGludCAgICAgICAgICAgICAgICAgbU9iamVjdFNpemU7CisgICAgdm9pZCogICAgICAgICAgICAgICBtSW5pdGlhbERhdGE7CisgICAgaW50ICAgICAgICAgICAgICAgICBtSW5pdGlhbERhdGFMZW5ndGg7CisgICAgaW50ICAgICAgICAgICAgICAgICBtRkQ7CisKK3B1YmxpYzoKKyAgICBSZWFkT2JqZWN0VGhyZWFkKE10cERldmljZSogZGV2aWNlLCBNdHBPYmplY3RIYW5kbGUgaGFuZGxlLCBpbnQgb2JqZWN0U2l6ZSkKKyAgICAgICAgOiBtRGV2aWNlKGRldmljZSksCisgICAgICAgICAgbUhhbmRsZShoYW5kbGUpLAorICAgICAgICAgIG1PYmplY3RTaXplKG9iamVjdFNpemUpLAorICAgICAgICAgIG1Jbml0aWFsRGF0YShOVUxMKSwKKyAgICAgICAgICBtSW5pdGlhbERhdGFMZW5ndGgoMCkKKyAgICB7CisgICAgfQorCisgICAgdmlydHVhbCB+UmVhZE9iamVjdFRocmVhZCgpIHsKKyAgICAgICAgaWYgKG1GRCA+PSAwKQorICAgICAgICAgICAgY2xvc2UobUZEKTsKKyAgICAgICAgZnJlZShtSW5pdGlhbERhdGEpOworICAgIH0KKworICAgIC8vIHJldHVybnMgZmlsZSBkZXNjcmlwdG9yCisgICAgaW50IGluaXQoKSB7CisgICAgICAgIG1EZXZpY2UtPm1SZXF1ZXN0LnJlc2V0KCk7CisgICAgICAgIG1EZXZpY2UtPm1SZXF1ZXN0LnNldFBhcmFtZXRlcigxLCBtSGFuZGxlKTsKKyAgICAgICAgaWYgKG1EZXZpY2UtPnNlbmRSZXF1ZXN0KE1UUF9PUEVSQVRJT05fR0VUX09CSkVDVCkKKyAgICAgICAgICAgICAgICAmJiBtRGV2aWNlLT5tRGF0YS5yZWFkRGF0YUhlYWRlcihtRGV2aWNlLT5tRW5kcG9pbnRJbikpIHsKKworICAgICAgICAgICAgLy8gbURhdGEgd2lsbCBjb250YWluIGhlYWRlciBhbmQgcG9zc2libHkgdGhlIGJlZ2lubmluZyBvZiB0aGUgb2JqZWN0IGRhdGEKKyAgICAgICAgICAgIG1Jbml0aWFsRGF0YSA9IG1EZXZpY2UtPm1EYXRhLmdldERhdGEobUluaXRpYWxEYXRhTGVuZ3RoKTsKKworICAgICAgICAgICAgLy8gY3JlYXRlIGEgcGlwZSBmb3IgdGhlIGNsaWVudCB0byByZWFkIGZyb20KKyAgICAgICAgICAgIGludCBwaXBlZmRbMl07CisgICAgICAgICAgICBpZiAocGlwZShwaXBlZmQpIDwgMCkgeworICAgICAgICAgICAgICAgIExPR0UoInBpcGUgZmFpbGVkICglcykiLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbUZEID0gcGlwZWZkWzFdOworICAgICAgICAgICAgcmV0dXJuIHBpcGVmZFswXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQorCisgICAgdmlydHVhbCBib29sIHRocmVhZExvb3AoKSB7CisgICAgICAgIGludCByZW1haW5pbmcgPSBtT2JqZWN0U2l6ZTsKKyAgICAgICAgaWYgKG1Jbml0aWFsRGF0YSkgeworICAgICAgICAgICAgd3JpdGUobUZELCBtSW5pdGlhbERhdGEsIG1Jbml0aWFsRGF0YUxlbmd0aCk7CisgICAgICAgICAgICByZW1haW5pbmcgLT0gbUluaXRpYWxEYXRhTGVuZ3RoOworICAgICAgICAgICAgZnJlZShtSW5pdGlhbERhdGEpOworICAgICAgICAgICAgbUluaXRpYWxEYXRhID0gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIGNoYXIgYnVmZmVyWzE2Mzg0XTsKKyAgICAgICAgd2hpbGUgKHJlbWFpbmluZyA+IDApIHsKKyAgICAgICAgICAgIGludCByZWFkU2l6ZSA9IChyZW1haW5pbmcgPiBzaXplb2YoYnVmZmVyKSA/IHNpemVvZihidWZmZXIpIDogcmVtYWluaW5nKTsKKyAgICAgICAgICAgIGludCBjb3VudCA9IG1EZXZpY2UtPm1EYXRhLnJlYWREYXRhKG1EZXZpY2UtPm1FbmRwb2ludEluLCBidWZmZXIsIHJlYWRTaXplKTsKKyAgICAgICAgICAgIGludCB3cml0dGVuOworICAgICAgICAgICAgaWYgKGNvdW50ID49IDApIHsKKyAgICAgICAgICAgICAgICBpbnQgd3JpdHRlbiA9IHdyaXRlKG1GRCwgYnVmZmVyLCBjb3VudCk7CisgICAgICAgICAgICAgICAgLy8gRklYTUUgY2hlY2sgZXJyb3IKKyAgICAgICAgICAgICAgICByZW1haW5pbmcgLT0gY291bnQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgTXRwUmVzcG9uc2VDb2RlIHJldCA9IG1EZXZpY2UtPnJlYWRSZXNwb25zZSgpOworICAgICAgICBtRGV2aWNlLT5tTXV0ZXgudW5sb2NrKCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9OworCisgICAgLy8gcmV0dXJucyB0aGUgZmlsZSBkZXNjcmlwdG9yIGZvciBhIHBpcGUgdG8gcmVhZCB0aGUgb2JqZWN0J3MgZGF0YQoraW50IE10cERldmljZTo6cmVhZE9iamVjdChNdHBPYmplY3RIYW5kbGUgaGFuZGxlLCBpbnQgb2JqZWN0U2l6ZSkgeworICAgIG1NdXRleC5sb2NrKCk7CisKKyAgICBSZWFkT2JqZWN0VGhyZWFkKiB0aHJlYWQgPSBuZXcgUmVhZE9iamVjdFRocmVhZCh0aGlzLCBoYW5kbGUsIG9iamVjdFNpemUpOworICAgIGludCBmZCA9IHRocmVhZC0+aW5pdCgpOworICAgIGlmIChmZCA8IDApIHsKKyAgICAgICAgZGVsZXRlIHRocmVhZDsKKyAgICAgICAgbU11dGV4LnVubG9jaygpOworICAgIH0gZWxzZSB7CisgICAgICAgIHRocmVhZC0+cnVuKCJSZWFkT2JqZWN0VGhyZWFkIik7CisgICAgfQorICAgIHJldHVybiBmZDsKK30KKworYm9vbCBNdHBEZXZpY2U6OnNlbmRSZXF1ZXN0KE10cE9wZXJhdGlvbkNvZGUgb3BlcmF0aW9uKSB7CisgICAgTE9HVigic2VuZFJlcXVlc3Q6ICVzXG4iLCBNdHBEZWJ1Zzo6Z2V0T3BlcmF0aW9uQ29kZU5hbWUob3BlcmF0aW9uKSk7CisgICAgbVJlcXVlc3Quc2V0T3BlcmF0aW9uQ29kZShvcGVyYXRpb24pOworICAgIGlmIChtVHJhbnNhY3Rpb25JRCA+IDApCisgICAgICAgIG1SZXF1ZXN0LnNldFRyYW5zYWN0aW9uSUQobVRyYW5zYWN0aW9uSUQrKyk7CisgICAgaW50IHJldCA9IG1SZXF1ZXN0LndyaXRlKG1FbmRwb2ludE91dCk7CisgICAgbVJlcXVlc3QuZHVtcCgpOworICAgIHJldHVybiAocmV0ID4gMCk7Cit9CisKK2Jvb2wgTXRwRGV2aWNlOjpzZW5kRGF0YSgpIHsKKyAgICBMT0dWKCJzZW5kRGF0YVxuIik7CisgICAgbURhdGEuc2V0T3BlcmF0aW9uQ29kZShtUmVxdWVzdC5nZXRPcGVyYXRpb25Db2RlKCkpOworICAgIG1EYXRhLnNldFRyYW5zYWN0aW9uSUQobVJlcXVlc3QuZ2V0VHJhbnNhY3Rpb25JRCgpKTsKKyAgICBpbnQgcmV0ID0gbURhdGEud3JpdGUobUVuZHBvaW50T3V0KTsKKyAgICBtRGF0YS5kdW1wKCk7CisgICAgcmV0dXJuIChyZXQgPiAwKTsKK30KKworYm9vbCBNdHBEZXZpY2U6OnJlYWREYXRhKCkgeworICAgIG1EYXRhLnJlc2V0KCk7CisgICAgaW50IHJldCA9IG1EYXRhLnJlYWQobUVuZHBvaW50SW4pOworICAgIExPR1YoInJlYWREYXRhIHJldHVybmVkICVkXG4iLCByZXQpOworICAgIGlmIChyZXQgPj0gTVRQX0NPTlRBSU5FUl9IRUFERVJfU0laRSkgeworICAgICAgICBtRGF0YS5kdW1wKCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgTE9HVigicmVhZFJlc3BvbnNlIGZhaWxlZFxuIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9CisKK2Jvb2wgTXRwRGV2aWNlOjp3cml0ZURhdGFIZWFkZXIoTXRwT3BlcmF0aW9uQ29kZSBvcGVyYXRpb24sIGludCBkYXRhTGVuZ3RoKSB7CisgICAgbURhdGEuc2V0T3BlcmF0aW9uQ29kZShvcGVyYXRpb24pOworICAgIG1EYXRhLnNldFRyYW5zYWN0aW9uSUQobVJlcXVlc3QuZ2V0VHJhbnNhY3Rpb25JRCgpKTsKKyAgICByZXR1cm4gKCFtRGF0YS53cml0ZURhdGFIZWFkZXIobUVuZHBvaW50T3V0LCBkYXRhTGVuZ3RoKSk7Cit9CisKK010cFJlc3BvbnNlQ29kZSBNdHBEZXZpY2U6OnJlYWRSZXNwb25zZSgpIHsKKyAgICBMT0dWKCJyZWFkUmVzcG9uc2VcbiIpOworICAgIGludCByZXQgPSBtUmVzcG9uc2UucmVhZChtRW5kcG9pbnRJbik7CisgICAgaWYgKHJldCA+PSBNVFBfQ09OVEFJTkVSX0hFQURFUl9TSVpFKSB7CisgICAgICAgIG1SZXNwb25zZS5kdW1wKCk7CisgICAgICAgIHJldHVybiBtUmVzcG9uc2UuZ2V0UmVzcG9uc2VDb2RlKCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBMT0dEKCJyZWFkUmVzcG9uc2UgZmFpbGVkXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBEZXZpY2UuaCBiL21lZGlhL210cC9NdHBEZXZpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41N2Y0OTJmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL010cERldmljZS5oCkBAIC0wLDAgKzEsMTA1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfTVRQX0RFVklDRV9ICisjZGVmaW5lIF9NVFBfREVWSUNFX0gKKworI2luY2x1ZGUgIk10cFJlcXVlc3RQYWNrZXQuaCIKKyNpbmNsdWRlICJNdHBEYXRhUGFja2V0LmgiCisjaW5jbHVkZSAiTXRwUmVzcG9uc2VQYWNrZXQuaCIKKyNpbmNsdWRlICJNdHBUeXBlcy5oIgorCisjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgorCitzdHJ1Y3QgdXNiX2RldmljZTsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBNdHBEZXZpY2VJbmZvOworY2xhc3MgTXRwT2JqZWN0SW5mbzsKK2NsYXNzIE10cFN0b3JhZ2VJbmZvOworCitjbGFzcyBNdHBEZXZpY2UgeworcHJpdmF0ZToKKyAgICBzdHJ1Y3QgdXNiX2RldmljZSogICAgICBtRGV2aWNlOworICAgIGludCAgICAgICAgICAgICAgICAgICAgIG1JbnRlcmZhY2U7CisgICAgc3RydWN0IHVzYl9lbmRwb2ludCogICAgbUVuZHBvaW50SW47CisgICAgc3RydWN0IHVzYl9lbmRwb2ludCogICAgbUVuZHBvaW50T3V0OworICAgIHN0cnVjdCB1c2JfZW5kcG9pbnQqICAgIG1FbmRwb2ludEludHI7CisgICAgTXRwRGV2aWNlSW5mbyogICAgICAgICAgbURldmljZUluZm87CisgICAgTXRwUHJvcGVydHlMaXN0ICAgICAgICAgbURldmljZVByb3BlcnRpZXM7CisKKyAgICAvLyBhIHVuaXF1ZSBJRCBmb3IgdGhlIGRldmljZQorICAgIGludCAgICAgICAgICAgICAgICAgICAgIG1JRDsKKworICAgIC8vIGN1cnJlbnQgc2Vzc2lvbiBJRAorICAgIE10cFNlc3Npb25JRCAgICAgICAgICAgIG1TZXNzaW9uSUQ7CisgICAgLy8gY3VycmVudCB0cmFuc2FjdGlvbiBJRAorICAgIE10cFRyYW5zYWN0aW9uSUQgICAgICAgIG1UcmFuc2FjdGlvbklEOworCisgICAgTXRwUmVxdWVzdFBhY2tldCAgICAgICAgbVJlcXVlc3Q7CisgICAgTXRwRGF0YVBhY2tldCAgICAgICAgICAgbURhdGE7CisgICAgTXRwUmVzcG9uc2VQYWNrZXQgICAgICAgbVJlc3BvbnNlOworCisgICAgLy8gdG8gZW5zdXJlIG9ubHkgb25lIE1UUCB0cmFuc2FjdGlvbiBhdCBhIHRpbWUKKyAgICBNdXRleCAgICAgICAgICAgICAgICAgICBtTXV0ZXg7CisKK3B1YmxpYzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBEZXZpY2Uoc3RydWN0IHVzYl9kZXZpY2UqIGRldmljZSwgaW50IGludGVyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB1c2JfZW5kcG9pbnQgKmVwX2luLCBzdHJ1Y3QgdXNiX2VuZHBvaW50ICplcF9vdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdXNiX2VuZHBvaW50ICplcF9pbnRyKTsKKyAgICB2aXJ0dWFsICAgICAgICAgICAgICAgICB+TXRwRGV2aWNlKCk7CisKKyAgICBpbmxpbmUgaW50ICAgICAgICAgICAgICBnZXRJRCgpIGNvbnN0IHsgcmV0dXJuIG1JRDsgfQorCisgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgaW5pdGlhbGl6ZSgpOworICAgIHZvaWQgICAgICAgICAgICAgICAgICAgIGNsb3NlKCk7CisgICAgY29uc3QgY2hhciogICAgICAgICAgICAgZ2V0RGV2aWNlTmFtZSgpOworCisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgb3BlblNlc3Npb24oKTsKKyAgICBib29sICAgICAgICAgICAgICAgICAgICBjbG9zZVNlc3Npb24oKTsKKworICAgIE10cERldmljZUluZm8qICAgICAgICAgIGdldERldmljZUluZm8oKTsKKyAgICBNdHBTdG9yYWdlSURMaXN0KiAgICAgICBnZXRTdG9yYWdlSURzKCk7CisgICAgTXRwU3RvcmFnZUluZm8qICAgICAgICAgZ2V0U3RvcmFnZUluZm8oTXRwU3RvcmFnZUlEIHN0b3JhZ2VJRCk7CisgICAgTXRwT2JqZWN0SGFuZGxlTGlzdCogICAgZ2V0T2JqZWN0SGFuZGxlcyhNdHBTdG9yYWdlSUQgc3RvcmFnZUlELCBNdHBPYmplY3RGb3JtYXQgZm9ybWF0LCBNdHBPYmplY3RIYW5kbGUgcGFyZW50KTsKKyAgICBNdHBPYmplY3RJbmZvKiAgICAgICAgICBnZXRPYmplY3RJbmZvKE10cE9iamVjdEhhbmRsZSBoYW5kbGUpOworICAgIHZvaWQqICAgICAgICAgICAgICAgICAgIGdldFRodW1ibmFpbChNdHBPYmplY3RIYW5kbGUgaGFuZGxlLCBpbnQmIG91dExlbmd0aCk7CisgICAgTXRwT2JqZWN0SGFuZGxlICAgICAgICAgc2VuZE9iamVjdEluZm8oTXRwT2JqZWN0SW5mbyogaW5mbyk7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgc2VuZE9iamVjdChNdHBPYmplY3RJbmZvKiBpbmZvLCBpbnQgc3JjRkQpOworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIGRlbGV0ZU9iamVjdChNdHBPYmplY3RIYW5kbGUgaGFuZGxlKTsKKyAgICBNdHBPYmplY3RIYW5kbGUgICAgICAgICBnZXRQYXJlbnQoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSk7CisgICAgTXRwT2JqZWN0SGFuZGxlICAgICAgICAgZ2V0U3RvcmFnZUlEKE10cE9iamVjdEhhbmRsZSBoYW5kbGUpOworCisgICAgTXRwUHJvcGVydHkqICAgICAgICAgICAgZ2V0RGV2aWNlUHJvcERlc2MoTXRwRGV2aWNlUHJvcGVydHkgY29kZSk7CisKKyAgICAvLyByZXR1cm5zIHRoZSBmaWxlIGRlc2NyaXB0b3IgZm9yIGEgcGlwZSB0byByZWFkIHRoZSBvYmplY3QncyBkYXRhCisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgcmVhZE9iamVjdChNdHBPYmplY3RIYW5kbGUgaGFuZGxlLCBpbnQgb2JqZWN0U2l6ZSk7CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIFJlYWRPYmplY3RUaHJlYWQ7CisKKyAgICBib29sICAgICAgICAgICAgICAgICAgICBzZW5kUmVxdWVzdChNdHBPcGVyYXRpb25Db2RlIG9wZXJhdGlvbik7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgc2VuZERhdGEoKTsKKyAgICBib29sICAgICAgICAgICAgICAgICAgICByZWFkRGF0YSgpOworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIHdyaXRlRGF0YUhlYWRlcihNdHBPcGVyYXRpb25Db2RlIG9wZXJhdGlvbiwgaW50IGRhdGFMZW5ndGgpOworICAgIE10cFJlc3BvbnNlQ29kZSAgICAgICAgIHJlYWRSZXNwb25zZSgpOworCit9OworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gX01UUF9ERVZJQ0VfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cERldmljZUluZm8uY3BwIGIvbWVkaWEvbXRwL010cERldmljZUluZm8uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhOTMyMmUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvTXRwRGV2aWNlSW5mby5jcHAKQEAgLTAsMCArMSw5NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiTXRwRGV2aWNlSW5mbyIKKworI2luY2x1ZGUgIk10cERlYnVnLmgiCisjaW5jbHVkZSAiTXRwRGF0YVBhY2tldC5oIgorI2luY2x1ZGUgIk10cERldmljZUluZm8uaCIKKyNpbmNsdWRlICJNdHBTdHJpbmdCdWZmZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitNdHBEZXZpY2VJbmZvOjpNdHBEZXZpY2VJbmZvKCkKKyAgICA6ICAgbVN0YW5kYXJkVmVyc2lvbigwKSwKKyAgICAgICAgbVZlbmRvckV4dGVuc2lvbklEKDApLAorICAgICAgICBtVmVuZG9yRXh0ZW5zaW9uVmVyc2lvbigwKSwKKyAgICAgICAgbVZlbmRvckV4dGVuc2lvbkRlc2MoTlVMTCksCisgICAgICAgIG1GdW5jdGlvbmFsQ29kZSgwKSwKKyAgICAgICAgbU9wZXJhdGlvbnMoTlVMTCksCisgICAgICAgIG1FdmVudHMoTlVMTCksCisgICAgICAgIG1EZXZpY2VQcm9wZXJ0aWVzKE5VTEwpLAorICAgICAgICBtQ2FwdHVyZUZvcm1hdHMoTlVMTCksCisgICAgICAgIG1QbGF5YmFja0Zvcm1hdHMoTlVMTCksCisgICAgICAgIG1NYW51ZmFjdHVyZXIoTlVMTCksCisgICAgICAgIG1Nb2RlbChOVUxMKSwKKyAgICAgICAgbVZlcnNpb24oTlVMTCksCisgICAgICAgIG1TZXJpYWwoTlVMTCkKK3sKK30KKworTXRwRGV2aWNlSW5mbzo6fk10cERldmljZUluZm8oKSB7CisgICAgaWYgKG1WZW5kb3JFeHRlbnNpb25EZXNjKQorICAgICAgICBmcmVlKG1WZW5kb3JFeHRlbnNpb25EZXNjKTsKKyAgICBkZWxldGUgbU9wZXJhdGlvbnM7CisgICAgZGVsZXRlIG1FdmVudHM7CisgICAgZGVsZXRlIG1EZXZpY2VQcm9wZXJ0aWVzOworICAgIGRlbGV0ZSBtQ2FwdHVyZUZvcm1hdHM7CisgICAgZGVsZXRlIG1QbGF5YmFja0Zvcm1hdHM7CisgICAgaWYgKG1NYW51ZmFjdHVyZXIpCisgICAgICAgIGZyZWUobU1hbnVmYWN0dXJlcik7CisgICAgaWYgKG1Nb2RlbCkKKyAgICAgICAgZnJlZShtTW9kZWwpOworICAgIGlmIChtVmVyc2lvbikKKyAgICAgICAgZnJlZShtVmVyc2lvbik7CisgICAgaWYgKG1TZXJpYWwpCisgICAgICAgIGZyZWUobVNlcmlhbCk7Cit9CisKK3ZvaWQgTXRwRGV2aWNlSW5mbzo6cmVhZChNdHBEYXRhUGFja2V0JiBwYWNrZXQpIHsKKyAgICBNdHBTdHJpbmdCdWZmZXIgc3RyaW5nOworCisgICAgLy8gcmVhZCB0aGUgZGV2aWNlIGluZm8KKyAgICBtU3RhbmRhcmRWZXJzaW9uID0gcGFja2V0LmdldFVJbnQxNigpOworICAgIG1WZW5kb3JFeHRlbnNpb25JRCA9IHBhY2tldC5nZXRVSW50MzIoKTsKKyAgICBtVmVuZG9yRXh0ZW5zaW9uVmVyc2lvbiA9IHBhY2tldC5nZXRVSW50MTYoKTsKKworICAgIHBhY2tldC5nZXRTdHJpbmcoc3RyaW5nKTsKKyAgICBtVmVuZG9yRXh0ZW5zaW9uRGVzYyA9IHN0cmR1cCgoY29uc3QgY2hhciAqKXN0cmluZyk7CisKKyAgICBtRnVuY3Rpb25hbENvZGUgPSBwYWNrZXQuZ2V0VUludDE2KCk7CisgICAgbU9wZXJhdGlvbnMgPSBwYWNrZXQuZ2V0QVVJbnQxNigpOworICAgIG1FdmVudHMgPSBwYWNrZXQuZ2V0QVVJbnQxNigpOworICAgIG1EZXZpY2VQcm9wZXJ0aWVzID0gcGFja2V0LmdldEFVSW50MTYoKTsKKyAgICBtQ2FwdHVyZUZvcm1hdHMgPSBwYWNrZXQuZ2V0QVVJbnQxNigpOworICAgIG1QbGF5YmFja0Zvcm1hdHMgPSBwYWNrZXQuZ2V0QVVJbnQxNigpOworCisgICAgcGFja2V0LmdldFN0cmluZyhzdHJpbmcpOworICAgIG1NYW51ZmFjdHVyZXIgPSBzdHJkdXAoKGNvbnN0IGNoYXIgKilzdHJpbmcpOworICAgIHBhY2tldC5nZXRTdHJpbmcoc3RyaW5nKTsKKyAgICBtTW9kZWwgPSBzdHJkdXAoKGNvbnN0IGNoYXIgKilzdHJpbmcpOworICAgIHBhY2tldC5nZXRTdHJpbmcoc3RyaW5nKTsKKyAgICBtVmVyc2lvbiA9IHN0cmR1cCgoY29uc3QgY2hhciAqKXN0cmluZyk7CisgICAgcGFja2V0LmdldFN0cmluZyhzdHJpbmcpOworICAgIG1TZXJpYWwgPSBzdHJkdXAoKGNvbnN0IGNoYXIgKilzdHJpbmcpOworfQorCit2b2lkIE10cERldmljZUluZm86OnByaW50KCkgeworICAgIExPR1YoIkRldmljZSBJbmZvOlxuXHRtU3RhbmRhcmRWZXJzaW9uOiAlZFxuXHRtVmVuZG9yRXh0ZW5zaW9uSUQ6ICVkXG5cdG1WZW5kb3JFeHRlbnNpb25WZXJzaW9ueTogJWRcbiIsCisgICAgICAgICAgICBtU3RhbmRhcmRWZXJzaW9uLCBtVmVuZG9yRXh0ZW5zaW9uSUQsIG1WZW5kb3JFeHRlbnNpb25WZXJzaW9uKTsKKyAgICBMT0dWKCJcdG1WZW5kb3JFeHRlbnNpb25EZXNjOiAlc1xuXHRtRnVuY3Rpb25hbENvZGU6ICVkXG5cdG1NYW51ZmFjdHVyZXI6ICVzXG5cdG1Nb2RlbDogJXNcblx0bVZlcnNpb246ICVzXG5cdG1TZXJpYWw6ICVzXG4iLAorICAgICAgICAgICAgbVZlbmRvckV4dGVuc2lvbkRlc2MsIG1GdW5jdGlvbmFsQ29kZSwgbU1hbnVmYWN0dXJlciwgbU1vZGVsLCBtVmVyc2lvbiwgbVNlcmlhbCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwRGV2aWNlSW5mby5oIGIvbWVkaWEvbXRwL010cERldmljZUluZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYWJhYTEwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL010cERldmljZUluZm8uaApAQCAtMCwwICsxLDU0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfTVRQX0RFVklDRV9JTkZPX0gKKyNkZWZpbmUgX01UUF9ERVZJQ0VfSU5GT19ICisKK3N0cnVjdCBzdGF0OworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIE10cERhdGFQYWNrZXQ7CisKK2NsYXNzIE10cERldmljZUluZm8geworcHVibGljOgorICAgIHVpbnQxNl90ICAgICAgICAgICAgICAgIG1TdGFuZGFyZFZlcnNpb247CisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgbVZlbmRvckV4dGVuc2lvbklEOworICAgIHVpbnQxNl90ICAgICAgICAgICAgICAgIG1WZW5kb3JFeHRlbnNpb25WZXJzaW9uOworICAgIGNoYXIqICAgICAgICAgICAgICAgICAgIG1WZW5kb3JFeHRlbnNpb25EZXNjOworICAgIHVpbnQxNl90ICAgICAgICAgICAgICAgIG1GdW5jdGlvbmFsQ29kZTsKKyAgICBVSW50MTZMaXN0KiAgICAgICAgICAgICBtT3BlcmF0aW9uczsKKyAgICBVSW50MTZMaXN0KiAgICAgICAgICAgICBtRXZlbnRzOworICAgIE10cERldmljZVByb3BlcnR5TGlzdCogIG1EZXZpY2VQcm9wZXJ0aWVzOworICAgIE10cE9iamVjdEZvcm1hdExpc3QqICAgIG1DYXB0dXJlRm9ybWF0czsKKyAgICBNdHBPYmplY3RGb3JtYXRMaXN0KiAgICBtUGxheWJhY2tGb3JtYXRzOworICAgIGNoYXIqICAgICAgICAgICAgICAgICAgIG1NYW51ZmFjdHVyZXI7CisgICAgY2hhciogICAgICAgICAgICAgICAgICAgbU1vZGVsOworICAgIGNoYXIqICAgICAgICAgICAgICAgICAgIG1WZXJzaW9uOworICAgIGNoYXIqICAgICAgICAgICAgICAgICAgIG1TZXJpYWw7CisKK3B1YmxpYzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBEZXZpY2VJbmZvKCk7CisgICAgdmlydHVhbCAgICAgICAgICAgICAgICAgfk10cERldmljZUluZm8oKTsKKworICAgIHZvaWQgICAgICAgICAgICAgICAgICAgIHJlYWQoTXRwRGF0YVBhY2tldCYgcGFja2V0KTsKKworICAgIHZvaWQgICAgICAgICAgICAgICAgICAgIHByaW50KCk7Cit9OworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gX01UUF9ERVZJQ0VfSU5GT19ICmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwRXZlbnRQYWNrZXQuY3BwIGIvbWVkaWEvbXRwL010cEV2ZW50UGFja2V0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzc0NTQyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL010cEV2ZW50UGFja2V0LmNwcApAQCAtMCwwICsxLDY3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJNdHBFdmVudFBhY2tldCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKworI2lmZGVmIE1UUF9ERVZJQ0UKKyNpbmNsdWRlIDxsaW51eC91c2IvZl9tdHAuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiTXRwRXZlbnRQYWNrZXQuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitNdHBFdmVudFBhY2tldDo6TXRwRXZlbnRQYWNrZXQoKQorICAgIDogICBNdHBQYWNrZXQoNTEyKQoreworfQorCitNdHBFdmVudFBhY2tldDo6fk10cEV2ZW50UGFja2V0KCkgeworfQorCisjaWZkZWYgTVRQX0RFVklDRQoraW50IE10cEV2ZW50UGFja2V0Ojp3cml0ZShpbnQgZmQpIHsKKyAgICBzdHJ1Y3QgbXRwX2V2ZW50ICAgIGV2ZW50OworCisgICAgcHV0VUludDMyKE1UUF9DT05UQUlORVJfTEVOR1RIX09GRlNFVCwgbVBhY2tldFNpemUpOworICAgIHB1dFVJbnQxNihNVFBfQ09OVEFJTkVSX1RZUEVfT0ZGU0VULCBNVFBfQ09OVEFJTkVSX1RZUEVfRVZFTlQpOworCisgICAgZXZlbnQuZGF0YSA9IG1CdWZmZXI7CisgICAgZXZlbnQubGVuZ3RoID0gbVBhY2tldFNpemU7CisgICAgaW50IHJldCA9IDo6aW9jdGwoZmQsIE1UUF9TRU5EX0VWRU5ULCAodW5zaWduZWQgbG9uZykmZXZlbnQpOworICAgIHJldHVybiAocmV0IDwgMCA/IHJldCA6IDApOworfQorI2VuZGlmCisKKyNpZmRlZiBNVFBfSE9TVAorICAgIC8vIHJlYWQgb3VyIGJ1ZmZlciBmcm9tIHRoZSBnaXZlbiBlbmRwb2ludAoraW50IE10cEV2ZW50UGFja2V0OjpyZWFkKHN0cnVjdCB1c2JfZW5kcG9pbnQgKmVwKSB7CisgICAgaW50IHJldCA9IHRyYW5zZmVyKGVwLCBtQnVmZmVyLCBtQnVmZmVyU2l6ZSk7CisgICAgIGlmIChyZXQgPj0gMCkKKyAgICAgICAgbVBhY2tldFNpemUgPSByZXQ7CisgICAgZWxzZQorICAgICAgICBtUGFja2V0U2l6ZSA9IDA7CisgICAgcmV0dXJuIHJldDsKK30KKyNlbmRpZgorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwRXZlbnRQYWNrZXQuaCBiL21lZGlhL210cC9NdHBFdmVudFBhY2tldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwYWU4NjkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvTXRwRXZlbnRQYWNrZXQuaApAQCAtMCwwICsxLDQ4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfTVRQX0VWRU5UX1BBQ0tFVF9ICisjZGVmaW5lIF9NVFBfRVZFTlRfUEFDS0VUX0gKKworI2luY2x1ZGUgIk10cFBhY2tldC5oIgorI2luY2x1ZGUgIm10cC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIE10cEV2ZW50UGFja2V0IDogcHVibGljIE10cFBhY2tldCB7CisKK3B1YmxpYzoKKyAgICAgICAgICAgICAgICAgICAgICAgIE10cEV2ZW50UGFja2V0KCk7CisgICAgdmlydHVhbCAgICAgICAgICAgICB+TXRwRXZlbnRQYWNrZXQoKTsKKworI2lmZGVmIE1UUF9ERVZJQ0UKKyAgICAvLyB3cml0ZSBvdXIgZGF0YSB0byB0aGUgZ2l2ZW4gZmlsZSBkZXNjcmlwdG9yCisgICAgaW50ICAgICAgICAgICAgICAgICB3cml0ZShpbnQgZmQpOworI2VuZGlmCisKKyNpZmRlZiBNVFBfSE9TVAorICAgIC8vIHJlYWQgb3VyIGJ1ZmZlciBmcm9tIHRoZSBnaXZlbiBlbmRwb2ludAorICAgIGludCAgICAgICAgICAgICAgICAgcmVhZChzdHJ1Y3QgdXNiX2VuZHBvaW50ICplcCk7CisjZW5kaWYKKworICAgIGlubGluZSBNdHBFdmVudENvZGUgICAgIGdldEV2ZW50Q29kZSgpIGNvbnN0IHsgcmV0dXJuIGdldENvbnRhaW5lckNvZGUoKTsgfQorICAgIGlubGluZSB2b2lkICAgICAgICAgICAgIHNldEV2ZW50Q29kZShNdHBFdmVudENvZGUgY29kZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gc2V0Q29udGFpbmVyQ29kZShjb2RlKTsgfQorfTsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIF9NVFBfRVZFTlRfUEFDS0VUX0gKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBPYmplY3RJbmZvLmNwcCBiL21lZGlhL210cC9NdHBPYmplY3RJbmZvLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDQzMDRlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL010cE9iamVjdEluZm8uY3BwCkBAIC0wLDAgKzEsMTA4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJNdHBPYmplY3RJbmZvIgorCisjaW5jbHVkZSAiTXRwRGVidWcuaCIKKyNpbmNsdWRlICJNdHBEYXRhUGFja2V0LmgiCisjaW5jbHVkZSAiTXRwT2JqZWN0SW5mby5oIgorI2luY2x1ZGUgIk10cFN0cmluZ0J1ZmZlci5oIgorI2luY2x1ZGUgIk10cFV0aWxzLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworTXRwT2JqZWN0SW5mbzo6TXRwT2JqZWN0SW5mbyhNdHBPYmplY3RIYW5kbGUgaGFuZGxlKQorICAgIDogICBtSGFuZGxlKGhhbmRsZSksCisgICAgICAgIG1TdG9yYWdlSUQoMCksCisgICAgICAgIG1Gb3JtYXQoMCksCisgICAgICAgIG1Qcm90ZWN0aW9uU3RhdHVzKDApLAorICAgICAgICBtQ29tcHJlc3NlZFNpemUoMCksCisgICAgICAgIG1UaHVtYkZvcm1hdCgwKSwKKyAgICAgICAgbVRodW1iQ29tcHJlc3NlZFNpemUoMCksCisgICAgICAgIG1UaHVtYlBpeFdpZHRoKDApLAorICAgICAgICBtVGh1bWJQaXhIZWlnaHQoMCksCisgICAgICAgIG1JbWFnZVBpeFdpZHRoKDApLAorICAgICAgICBtSW1hZ2VQaXhIZWlnaHQoMCksCisgICAgICAgIG1JbWFnZVBpeERlcHRoKDApLAorICAgICAgICBtUGFyZW50KDApLAorICAgICAgICBtQXNzb2NpYXRpb25UeXBlKDApLAorICAgICAgICBtQXNzb2NpYXRpb25EZXNjKDApLAorICAgICAgICBtU2VxdWVuY2VOdW1iZXIoMCksCisgICAgICAgIG1OYW1lKE5VTEwpLAorICAgICAgICBtRGF0ZUNyZWF0ZWQoMCksCisgICAgICAgIG1EYXRlTW9kaWZpZWQoMCksCisgICAgICAgIG1LZXl3b3JkcyhOVUxMKQoreworfQorCitNdHBPYmplY3RJbmZvOjp+TXRwT2JqZWN0SW5mbygpIHsKKyAgICBpZiAobU5hbWUpCisgICAgICAgIGZyZWUobU5hbWUpOworICAgIGlmIChtS2V5d29yZHMpCisgICAgICAgIGZyZWUobUtleXdvcmRzKTsKK30KKwordm9pZCBNdHBPYmplY3RJbmZvOjpyZWFkKE10cERhdGFQYWNrZXQmIHBhY2tldCkgeworICAgIE10cFN0cmluZ0J1ZmZlciBzdHJpbmc7CisgICAgdGltZV90IHRpbWU7CisKKyAgICBtU3RvcmFnZUlEID0gcGFja2V0LmdldFVJbnQzMigpOworICAgIG1Gb3JtYXQgPSBwYWNrZXQuZ2V0VUludDE2KCk7CisgICAgbVByb3RlY3Rpb25TdGF0dXMgPSBwYWNrZXQuZ2V0VUludDE2KCk7CisgICAgbUNvbXByZXNzZWRTaXplID0gcGFja2V0LmdldFVJbnQzMigpOworICAgIG1UaHVtYkZvcm1hdCA9IHBhY2tldC5nZXRVSW50MTYoKTsKKyAgICBtVGh1bWJDb21wcmVzc2VkU2l6ZSA9IHBhY2tldC5nZXRVSW50MzIoKTsKKyAgICBtVGh1bWJQaXhXaWR0aCA9IHBhY2tldC5nZXRVSW50MzIoKTsKKyAgICBtVGh1bWJQaXhIZWlnaHQgPSBwYWNrZXQuZ2V0VUludDMyKCk7CisgICAgbUltYWdlUGl4V2lkdGggPSBwYWNrZXQuZ2V0VUludDMyKCk7CisgICAgbUltYWdlUGl4SGVpZ2h0ID0gcGFja2V0LmdldFVJbnQzMigpOworICAgIG1JbWFnZVBpeERlcHRoID0gcGFja2V0LmdldFVJbnQzMigpOworICAgIG1QYXJlbnQgPSBwYWNrZXQuZ2V0VUludDMyKCk7CisgICAgbUFzc29jaWF0aW9uVHlwZSA9IHBhY2tldC5nZXRVSW50MTYoKTsKKyAgICBtQXNzb2NpYXRpb25EZXNjID0gcGFja2V0LmdldFVJbnQzMigpOworICAgIG1TZXF1ZW5jZU51bWJlciA9IHBhY2tldC5nZXRVSW50MzIoKTsKKworICAgIHBhY2tldC5nZXRTdHJpbmcoc3RyaW5nKTsKKyAgICBtTmFtZSA9IHN0cmR1cCgoY29uc3QgY2hhciAqKXN0cmluZyk7CisKKyAgICBwYWNrZXQuZ2V0U3RyaW5nKHN0cmluZyk7CisgICAgaWYgKHBhcnNlRGF0ZVRpbWUoKGNvbnN0IGNoYXIqKXN0cmluZywgdGltZSkpCisgICAgICAgIG1EYXRlQ3JlYXRlZCA9IHRpbWU7CisKKyAgICBwYWNrZXQuZ2V0U3RyaW5nKHN0cmluZyk7CisgICAgaWYgKHBhcnNlRGF0ZVRpbWUoKGNvbnN0IGNoYXIqKXN0cmluZywgdGltZSkpCisgICAgICAgIG1EYXRlTW9kaWZpZWQgPSB0aW1lOworCisgICAgcGFja2V0LmdldFN0cmluZyhzdHJpbmcpOworICAgIG1LZXl3b3JkcyA9IHN0cmR1cCgoY29uc3QgY2hhciAqKXN0cmluZyk7Cit9CisKK3ZvaWQgTXRwT2JqZWN0SW5mbzo6cHJpbnQoKSB7CisgICAgTE9HRCgiTXRwT2JqZWN0IEluZm8gJTA4WDogJXNcbiIsIG1IYW5kbGUsIG1OYW1lKTsKKyAgICBMT0dEKCIgIG1TdG9yYWdlSUQ6ICUwOFggbUZvcm1hdDogJTA0WCBtUHJvdGVjdGlvblN0YXR1czogJWRcbiIsCisgICAgICAgICAgICBtU3RvcmFnZUlELCBtRm9ybWF0LCBtUHJvdGVjdGlvblN0YXR1cyk7CisgICAgTE9HRCgiICBtQ29tcHJlc3NlZFNpemU6ICVkIG1UaHVtYkZvcm1hdDogJTA0WCBtVGh1bWJDb21wcmVzc2VkU2l6ZTogJWRcbiIsCisgICAgICAgICAgICBtQ29tcHJlc3NlZFNpemUsIG1Gb3JtYXQsIG1UaHVtYkNvbXByZXNzZWRTaXplKTsKKyAgICBMT0dEKCIgIG1UaHVtYlBpeFdpZHRoOiAlZCBtVGh1bWJQaXhIZWlnaHQ6ICVkXG4iLCBtVGh1bWJQaXhXaWR0aCwgbVRodW1iUGl4SGVpZ2h0KTsKKyAgICBMT0dEKCIgIG1JbWFnZVBpeFdpZHRoOiAlZCBtSW1hZ2VQaXhIZWlnaHQ6ICVkIG1JbWFnZVBpeERlcHRoOiAlZFxuIiwKKyAgICAgICAgICAgIG1JbWFnZVBpeFdpZHRoLCBtSW1hZ2VQaXhIZWlnaHQsIG1JbWFnZVBpeERlcHRoKTsKKyAgICBMT0dEKCIgIG1QYXJlbnQ6ICUwOFggbUFzc29jaWF0aW9uVHlwZTogJTA0WCBtQXNzb2NpYXRpb25EZXNjOiAlMDRYXG4iLAorICAgICAgICAgICAgbVBhcmVudCwgbUFzc29jaWF0aW9uVHlwZSwgbUFzc29jaWF0aW9uRGVzYyk7CisgICAgTE9HRCgiICBtU2VxdWVuY2VOdW1iZXI6ICVkIG1EYXRlQ3JlYXRlZDogJWQgbURhdGVNb2RpZmllZDogJWQgbUtleXdvcmRzOiAlc1xuIiwKKyAgICAgICAgICAgIG1TZXF1ZW5jZU51bWJlciwgbURhdGVDcmVhdGVkLCBtRGF0ZU1vZGlmaWVkLCBtS2V5d29yZHMpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cE9iamVjdEluZm8uaCBiL21lZGlhL210cC9NdHBPYmplY3RJbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdhNDQ5Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvTXRwT2JqZWN0SW5mby5oCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9NVFBfT0JKRUNUX0lORk9fSAorI2RlZmluZSBfTVRQX09CSkVDVF9JTkZPX0gKKworI2luY2x1ZGUgIk10cFR5cGVzLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgTXRwRGF0YVBhY2tldDsKKworY2xhc3MgTXRwT2JqZWN0SW5mbyB7CitwdWJsaWM6CisgICAgTXRwT2JqZWN0SGFuZGxlICAgICBtSGFuZGxlOworICAgIE10cFN0b3JhZ2VJRCAgICAgICAgbVN0b3JhZ2VJRDsKKyAgICBNdHBPYmplY3RGb3JtYXQgICAgIG1Gb3JtYXQ7CisgICAgdWludDE2X3QgICAgICAgICAgICBtUHJvdGVjdGlvblN0YXR1czsKKyAgICB1aW50MzJfdCAgICAgICAgICAgIG1Db21wcmVzc2VkU2l6ZTsKKyAgICBNdHBPYmplY3RGb3JtYXQgICAgIG1UaHVtYkZvcm1hdDsKKyAgICB1aW50MzJfdCAgICAgICAgICAgIG1UaHVtYkNvbXByZXNzZWRTaXplOworICAgIHVpbnQzMl90ICAgICAgICAgICAgbVRodW1iUGl4V2lkdGg7CisgICAgdWludDMyX3QgICAgICAgICAgICBtVGh1bWJQaXhIZWlnaHQ7CisgICAgdWludDMyX3QgICAgICAgICAgICBtSW1hZ2VQaXhXaWR0aDsKKyAgICB1aW50MzJfdCAgICAgICAgICAgIG1JbWFnZVBpeEhlaWdodDsKKyAgICB1aW50MzJfdCAgICAgICAgICAgIG1JbWFnZVBpeERlcHRoOworICAgIE10cE9iamVjdEhhbmRsZSAgICAgbVBhcmVudDsKKyAgICB1aW50MTZfdCAgICAgICAgICAgIG1Bc3NvY2lhdGlvblR5cGU7CisgICAgdWludDMyX3QgICAgICAgICAgICBtQXNzb2NpYXRpb25EZXNjOworICAgIHVpbnQzMl90ICAgICAgICAgICAgbVNlcXVlbmNlTnVtYmVyOworICAgIGNoYXIqICAgICAgICAgICAgICAgbU5hbWU7CisgICAgdGltZV90ICAgICAgICAgICAgICBtRGF0ZUNyZWF0ZWQ7CisgICAgdGltZV90ICAgICAgICAgICAgICBtRGF0ZU1vZGlmaWVkOworICAgIGNoYXIqICAgICAgICAgICAgICAgbUtleXdvcmRzOworCitwdWJsaWM6CisgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RJbmZvKE10cE9iamVjdEhhbmRsZSBoYW5kbGUpOworICAgIHZpcnR1YWwgICAgICAgICAgICAgfk10cE9iamVjdEluZm8oKTsKKworICAgIHZvaWQgICAgICAgICAgICAgICAgcmVhZChNdHBEYXRhUGFja2V0JiBwYWNrZXQpOworCisgICAgdm9pZCAgICAgICAgICAgICAgICBwcmludCgpOworfTsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIF9NVFBfT0JKRUNUX0lORk9fSApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cFBhY2tldC5jcHAgYi9tZWRpYS9tdHAvTXRwUGFja2V0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmJmOGJhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL010cFBhY2tldC5jcHAKQEAgLTAsMCArMSwxNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIk10cFBhY2tldCIKKworI2luY2x1ZGUgIk10cERlYnVnLmgiCisjaW5jbHVkZSAiTXRwUGFja2V0LmgiCisjaW5jbHVkZSAibXRwLmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlIDx1c2Job3N0L3VzYmhvc3QuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitNdHBQYWNrZXQ6Ok10cFBhY2tldChpbnQgYnVmZmVyU2l6ZSkKKyAgICA6ICAgbUJ1ZmZlcihOVUxMKSwKKyAgICAgICAgbUJ1ZmZlclNpemUoYnVmZmVyU2l6ZSksCisgICAgICAgIG1BbGxvY2F0aW9uSW5jcmVtZW50KGJ1ZmZlclNpemUpLAorICAgICAgICBtUGFja2V0U2l6ZSgwKQoreworICAgIG1CdWZmZXIgPSAodWludDhfdCAqKW1hbGxvYyhidWZmZXJTaXplKTsKKyAgICBpZiAoIW1CdWZmZXIpIHsKKyAgICAgICAgTE9HRSgib3V0IG9mIG1lbW9yeSEiKTsKKyAgICAgICAgYWJvcnQoKTsKKyAgICB9Cit9CisKK010cFBhY2tldDo6fk10cFBhY2tldCgpIHsKKyAgICBpZiAobUJ1ZmZlcikKKyAgICAgICAgZnJlZShtQnVmZmVyKTsKK30KKwordm9pZCBNdHBQYWNrZXQ6OnJlc2V0KCkgeworICAgIGFsbG9jYXRlKE1UUF9DT05UQUlORVJfSEVBREVSX1NJWkUpOworICAgIG1QYWNrZXRTaXplID0gTVRQX0NPTlRBSU5FUl9IRUFERVJfU0laRTsKKyAgICBtZW1zZXQobUJ1ZmZlciwgMCwgbUJ1ZmZlclNpemUpOworfQorCit2b2lkIE10cFBhY2tldDo6YWxsb2NhdGUoaW50IGxlbmd0aCkgeworICAgIGlmIChsZW5ndGggPiBtQnVmZmVyU2l6ZSkgeworICAgICAgICBpbnQgbmV3TGVuZ3RoID0gbGVuZ3RoICsgbUFsbG9jYXRpb25JbmNyZW1lbnQ7CisgICAgICAgIG1CdWZmZXIgPSAodWludDhfdCAqKXJlYWxsb2MobUJ1ZmZlciwgbmV3TGVuZ3RoKTsKKyAgICAgICAgaWYgKCFtQnVmZmVyKSB7CisgICAgICAgICAgICBMT0dFKCJvdXQgb2YgbWVtb3J5ISIpOworICAgICAgICAgICAgYWJvcnQoKTsKKyAgICAgICAgfQorICAgICAgICBtQnVmZmVyU2l6ZSA9IG5ld0xlbmd0aDsKKyAgICB9Cit9CisKK3ZvaWQgTXRwUGFja2V0OjpkdW1wKCkgeworI2RlZmluZSBEVU1QX0JZVEVTX1BFUl9ST1cgIDE2CisgICAgY2hhciBidWZmZXJbNTAwXTsKKyAgICBjaGFyKiBidWZwdHIgPSBidWZmZXI7CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG1QYWNrZXRTaXplOyBpKyspIHsKKyAgICAgICAgc3ByaW50ZihidWZwdHIsICIlMDJYICIsIG1CdWZmZXJbaV0pOworICAgICAgICBidWZwdHIgKz0gc3RybGVuKGJ1ZnB0cik7CisgICAgICAgIGlmIChpICUgRFVNUF9CWVRFU19QRVJfUk9XID09IChEVU1QX0JZVEVTX1BFUl9ST1cgLSAxKSkgeworICAgICAgICAgICAgTE9HVigiJXMiLCBidWZmZXIpOworICAgICAgICAgICAgYnVmcHRyID0gYnVmZmVyOworICAgICAgICB9CisgICAgfQorICAgIGlmIChidWZwdHIgIT0gYnVmZmVyKSB7CisgICAgICAgIC8vIHByaW50IGxhc3QgbGluZQorICAgICAgICBMT0dWKCIlcyIsIGJ1ZmZlcik7CisgICAgfQorICAgIExPR1YoIlxuIik7Cit9CisKK3VpbnQxNl90IE10cFBhY2tldDo6Z2V0VUludDE2KGludCBvZmZzZXQpIGNvbnN0IHsKKyAgICByZXR1cm4gKCh1aW50MTZfdCltQnVmZmVyW29mZnNldCArIDFdIDw8IDgpIHwgKHVpbnQxNl90KW1CdWZmZXJbb2Zmc2V0XTsKK30KKwordWludDMyX3QgTXRwUGFja2V0OjpnZXRVSW50MzIoaW50IG9mZnNldCkgY29uc3QgeworICAgIHJldHVybiAoKHVpbnQzMl90KW1CdWZmZXJbb2Zmc2V0ICsgM10gPDwgMjQpIHwgKCh1aW50MzJfdCltQnVmZmVyW29mZnNldCArIDJdIDw8IDE2KSB8CisgICAgICAgICAgICgodWludDMyX3QpbUJ1ZmZlcltvZmZzZXQgKyAxXSA8PCA4KSAgfCAodWludDMyX3QpbUJ1ZmZlcltvZmZzZXRdOworfQorCit2b2lkIE10cFBhY2tldDo6cHV0VUludDE2KGludCBvZmZzZXQsIHVpbnQxNl90IHZhbHVlKSB7CisgICAgbUJ1ZmZlcltvZmZzZXQrK10gPSAodWludDhfdCkodmFsdWUgJiAweEZGKTsKKyAgICBtQnVmZmVyW29mZnNldCsrXSA9ICh1aW50OF90KSgodmFsdWUgPj4gOCkgJiAweEZGKTsKK30KKwordm9pZCBNdHBQYWNrZXQ6OnB1dFVJbnQzMihpbnQgb2Zmc2V0LCB1aW50MzJfdCB2YWx1ZSkgeworICAgIG1CdWZmZXJbb2Zmc2V0KytdID0gKHVpbnQ4X3QpKHZhbHVlICYgMHhGRik7CisgICAgbUJ1ZmZlcltvZmZzZXQrK10gPSAodWludDhfdCkoKHZhbHVlID4+IDgpICYgMHhGRik7CisgICAgbUJ1ZmZlcltvZmZzZXQrK10gPSAodWludDhfdCkoKHZhbHVlID4+IDE2KSAmIDB4RkYpOworICAgIG1CdWZmZXJbb2Zmc2V0KytdID0gKHVpbnQ4X3QpKCh2YWx1ZSA+PiAyNCkgJiAweEZGKTsKK30KKwordWludDE2X3QgTXRwUGFja2V0OjpnZXRDb250YWluZXJDb2RlKCkgY29uc3QgeworICAgIHJldHVybiBnZXRVSW50MTYoTVRQX0NPTlRBSU5FUl9DT0RFX09GRlNFVCk7Cit9CisKK3ZvaWQgTXRwUGFja2V0OjpzZXRDb250YWluZXJDb2RlKHVpbnQxNl90IGNvZGUpIHsKKyAgICBwdXRVSW50MTYoTVRQX0NPTlRBSU5FUl9DT0RFX09GRlNFVCwgY29kZSk7Cit9CisKK010cFRyYW5zYWN0aW9uSUQgTXRwUGFja2V0OjpnZXRUcmFuc2FjdGlvbklEKCkgY29uc3QgeworICAgIHJldHVybiBnZXRVSW50MzIoTVRQX0NPTlRBSU5FUl9UUkFOU0FDVElPTl9JRF9PRkZTRVQpOworfQorCit2b2lkIE10cFBhY2tldDo6c2V0VHJhbnNhY3Rpb25JRChNdHBUcmFuc2FjdGlvbklEIGlkKSB7CisgICAgcHV0VUludDMyKE1UUF9DT05UQUlORVJfVFJBTlNBQ1RJT05fSURfT0ZGU0VULCBpZCk7Cit9CisKK3VpbnQzMl90IE10cFBhY2tldDo6Z2V0UGFyYW1ldGVyKGludCBpbmRleCkgY29uc3QgeworICAgIGlmIChpbmRleCA8IDEgfHwgaW5kZXggPiA1KSB7CisgICAgICAgIExPR0UoImluZGV4ICVkIG91dCBvZiByYW5nZSBpbiBNdHBSZXF1ZXN0UGFja2V0OjpnZXRQYXJhbWV0ZXIiLCBpbmRleCk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gZ2V0VUludDMyKE1UUF9DT05UQUlORVJfUEFSQU1FVEVSX09GRlNFVCArIChpbmRleCAtIDEpICogc2l6ZW9mKHVpbnQzMl90KSk7Cit9CisKK3ZvaWQgTXRwUGFja2V0OjpzZXRQYXJhbWV0ZXIoaW50IGluZGV4LCB1aW50MzJfdCB2YWx1ZSkgeworICAgIGlmIChpbmRleCA8IDEgfHwgaW5kZXggPiA1KSB7CisgICAgICAgIExPR0UoImluZGV4ICVkIG91dCBvZiByYW5nZSBpbiBNdHBSZXNwb25zZVBhY2tldDo6c2V0UGFyYW1ldGVyIiwgaW5kZXgpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGludCBvZmZzZXQgPSBNVFBfQ09OVEFJTkVSX1BBUkFNRVRFUl9PRkZTRVQgKyAoaW5kZXggLSAxKSAqIHNpemVvZih1aW50MzJfdCk7CisgICAgaWYgKG1QYWNrZXRTaXplIDwgb2Zmc2V0ICsgc2l6ZW9mKHVpbnQzMl90KSkKKyAgICAgICAgbVBhY2tldFNpemUgPSBvZmZzZXQgKyBzaXplb2YodWludDMyX3QpOworICAgIHB1dFVJbnQzMihvZmZzZXQsIHZhbHVlKTsKK30KKworI2lmZGVmIE1UUF9IT1NUCitpbnQgTXRwUGFja2V0Ojp0cmFuc2ZlcihzdHJ1Y3QgdXNiX2VuZHBvaW50ICplcCwgdm9pZCogYnVmZmVyLCBpbnQgbGVuZ3RoKSB7CisgICAgaWYgKHVzYl9lbmRwb2ludF9xdWV1ZShlcCwgYnVmZmVyLCBsZW5ndGgpKSB7CisgICAgICAgIExPR0UoInVzYl9lbmRwb2ludF9xdWV1ZSBmYWlsZWQsIGVycm5vOiAlZCIsIGVycm5vKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpbnQgZXBfbnVtOworICAgIHJldHVybiB1c2JfZW5kcG9pbnRfd2FpdCh1c2JfZW5kcG9pbnRfZ2V0X2RldmljZShlcCksICZlcF9udW0pOworfQorI2VuZGlmCisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwUGFja2V0LmggYi9tZWRpYS9tdHAvTXRwUGFja2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWM4ZDZkYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBQYWNrZXQuaApAQCAtMCwwICsxLDY5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfTVRQX1BBQ0tFVF9ICisjZGVmaW5lIF9NVFBfUEFDS0VUX0gKKworI2luY2x1ZGUgIk10cFR5cGVzLmgiCisKK3N0cnVjdCB1c2JfZW5kcG9pbnQ7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgTXRwUGFja2V0IHsKKworcHJvdGVjdGVkOgorICAgIHVpbnQ4X3QqICAgICAgICAgICAgbUJ1ZmZlcjsKKyAgICAvLyBjdXJyZW50IHNpemUgb2YgdGhlIGJ1ZmZlcgorICAgIGludCAgICAgICAgICAgICAgICAgbUJ1ZmZlclNpemU7CisgICAgLy8gbnVtYmVyIG9mIGJ5dGVzIHRvIGFkZCB3aGVuIHJlc2l6aW5nIHRoZSBidWZmZXIKKyAgICBpbnQgICAgICAgICAgICAgICAgIG1BbGxvY2F0aW9uSW5jcmVtZW50OworICAgIC8vIHNpemUgb2YgdGhlIGRhdGEgaW4gdGhlIHBhY2tldAorICAgIGludCAgICAgICAgICAgICAgICAgbVBhY2tldFNpemU7CisKK3B1YmxpYzoKKyAgICAgICAgICAgICAgICAgICAgICAgIE10cFBhY2tldChpbnQgYnVmZmVyU2l6ZSk7CisgICAgdmlydHVhbCAgICAgICAgICAgICB+TXRwUGFja2V0KCk7CisKKyAgICAvLyBzZXRzIHBhY2tldCBzaXplIHRvIHRoZSBkZWZhdWx0IGNvbnRhaW5lciBzaXplIGFuZCBzZXRzIGJ1ZmZlciB0byB6ZXJvCisgICAgdmlydHVhbCB2b2lkICAgICAgICByZXNldCgpOworCisgICAgdm9pZCAgICAgICAgICAgICAgICBhbGxvY2F0ZShpbnQgbGVuZ3RoKTsKKyAgICB2b2lkICAgICAgICAgICAgICAgIGR1bXAoKTsKKworICAgIHVpbnQxNl90ICAgICAgICAgICAgZ2V0Q29udGFpbmVyQ29kZSgpIGNvbnN0OworICAgIHZvaWQgICAgICAgICAgICAgICAgc2V0Q29udGFpbmVyQ29kZSh1aW50MTZfdCBjb2RlKTsKKworICAgIE10cFRyYW5zYWN0aW9uSUQgICAgZ2V0VHJhbnNhY3Rpb25JRCgpIGNvbnN0OworICAgIHZvaWQgICAgICAgICAgICAgICAgc2V0VHJhbnNhY3Rpb25JRChNdHBUcmFuc2FjdGlvbklEIGlkKTsKKworICAgIHVpbnQzMl90ICAgICAgICAgICAgZ2V0UGFyYW1ldGVyKGludCBpbmRleCkgY29uc3Q7CisgICAgdm9pZCAgICAgICAgICAgICAgICBzZXRQYXJhbWV0ZXIoaW50IGluZGV4LCB1aW50MzJfdCB2YWx1ZSk7CisKKyNpZmRlZiBNVFBfSE9TVAorICAgIGludCAgICAgICAgICAgICAgICAgdHJhbnNmZXIoc3RydWN0IHVzYl9lbmRwb2ludCAqZXAsIHZvaWQqIGJ1ZmZlciwgaW50IGxlbmd0aCk7CisjZW5kaWYKKworcHJvdGVjdGVkOgorICAgIHVpbnQxNl90ICAgICAgICAgICAgZ2V0VUludDE2KGludCBvZmZzZXQpIGNvbnN0OworICAgIHVpbnQzMl90ICAgICAgICAgICAgZ2V0VUludDMyKGludCBvZmZzZXQpIGNvbnN0OworICAgIHZvaWQgICAgICAgICAgICAgICAgcHV0VUludDE2KGludCBvZmZzZXQsIHVpbnQxNl90IHZhbHVlKTsKKyAgICB2b2lkICAgICAgICAgICAgICAgIHB1dFVJbnQzMihpbnQgb2Zmc2V0LCB1aW50MzJfdCB2YWx1ZSk7Cit9OworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gX01UUF9QQUNLRVRfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cFByb3BlcnR5LmNwcCBiL21lZGlhL210cC9NdHBQcm9wZXJ0eS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTMyYWQ2YQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBQcm9wZXJ0eS5jcHAKQEAgLTAsMCArMSwzMjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIk10cFByb3BlcnR5IgorCisjaW5jbHVkZSAiTXRwRGF0YVBhY2tldC5oIgorI2luY2x1ZGUgIk10cFByb3BlcnR5LmgiCisjaW5jbHVkZSAiTXRwU3RyaW5nQnVmZmVyLmgiCisjaW5jbHVkZSAiTXRwVXRpbHMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitNdHBQcm9wZXJ0eTo6TXRwUHJvcGVydHkoKQorICAgIDogICBtQ29kZSgwKSwKKyAgICAgICAgbVR5cGUoMCksCisgICAgICAgIG1Xcml0ZWFibGUoZmFsc2UpLAorICAgICAgICBtRGVmYXVsdEFycmF5TGVuZ3RoKDApLAorICAgICAgICBtRGVmYXVsdEFycmF5VmFsdWVzKE5VTEwpLAorICAgICAgICBtQ3VycmVudEFycmF5TGVuZ3RoKDApLAorICAgICAgICBtQ3VycmVudEFycmF5VmFsdWVzKE5VTEwpLAorICAgICAgICBtR3JvdXBDb2RlKDApLAorICAgICAgICBtRm9ybUZsYWcoa0Zvcm1Ob25lKSwKKyAgICAgICAgbUVudW1MZW5ndGgoMCksCisgICAgICAgIG1FbnVtVmFsdWVzKE5VTEwpCit7CisgICAgbURlZmF1bHRWYWx1ZS5zdHIgPSBOVUxMOworICAgIG1DdXJyZW50VmFsdWUuc3RyID0gTlVMTDsKKyAgICBtTWluaW11bVZhbHVlLnN0ciA9IE5VTEw7CisgICAgbU1heGltdW1WYWx1ZS5zdHIgPSBOVUxMOworfQorCitNdHBQcm9wZXJ0eTo6TXRwUHJvcGVydHkoTXRwUHJvcGVydHlDb2RlIHByb3BDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgIE10cERhdGFUeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB3cml0ZWFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlZmF1bHRWYWx1ZSkKKyAgICA6ICAgbUNvZGUocHJvcENvZGUpLAorICAgICAgICBtVHlwZSh0eXBlKSwKKyAgICAgICAgbVdyaXRlYWJsZSh3cml0ZWFibGUpLAorICAgICAgICBtRGVmYXVsdEFycmF5TGVuZ3RoKDApLAorICAgICAgICBtRGVmYXVsdEFycmF5VmFsdWVzKE5VTEwpLAorICAgICAgICBtQ3VycmVudEFycmF5TGVuZ3RoKDApLAorICAgICAgICBtQ3VycmVudEFycmF5VmFsdWVzKE5VTEwpLAorICAgICAgICBtR3JvdXBDb2RlKDApLAorICAgICAgICBtRm9ybUZsYWcoa0Zvcm1Ob25lKSwKKyAgICAgICAgbUVudW1MZW5ndGgoMCksCisgICAgICAgIG1FbnVtVmFsdWVzKE5VTEwpCit7CisgICAgbWVtc2V0KCZtRGVmYXVsdFZhbHVlLCAwLCBzaXplb2YobURlZmF1bHRWYWx1ZSkpOworICAgIG1lbXNldCgmbUN1cnJlbnRWYWx1ZSwgMCwgc2l6ZW9mKG1DdXJyZW50VmFsdWUpKTsKKyAgICBtZW1zZXQoJm1NaW5pbXVtVmFsdWUsIDAsIHNpemVvZihtTWluaW11bVZhbHVlKSk7CisgICAgbWVtc2V0KCZtTWF4aW11bVZhbHVlLCAwLCBzaXplb2YobU1heGltdW1WYWx1ZSkpOworCisgICAgaWYgKGRlZmF1bHRWYWx1ZSkgeworICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgTVRQX1RZUEVfSU5UODoKKyAgICAgICAgICAgICAgICBtRGVmYXVsdFZhbHVlLmk4ID0gZGVmYXVsdFZhbHVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBNVFBfVFlQRV9VSU5UODoKKyAgICAgICAgICAgICAgICBtRGVmYXVsdFZhbHVlLnU4ID0gZGVmYXVsdFZhbHVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBNVFBfVFlQRV9JTlQxNjoKKyAgICAgICAgICAgICAgICBtRGVmYXVsdFZhbHVlLmkxNiA9IGRlZmF1bHRWYWx1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTVRQX1RZUEVfVUlOVDE2OgorICAgICAgICAgICAgICAgIG1EZWZhdWx0VmFsdWUudTE2ID0gZGVmYXVsdFZhbHVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBNVFBfVFlQRV9JTlQzMjoKKyAgICAgICAgICAgICAgICBtRGVmYXVsdFZhbHVlLmkzMiA9IGRlZmF1bHRWYWx1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTVRQX1RZUEVfVUlOVDMyOgorICAgICAgICAgICAgICAgIG1EZWZhdWx0VmFsdWUudTMyID0gZGVmYXVsdFZhbHVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBNVFBfVFlQRV9JTlQ2NDoKKyAgICAgICAgICAgICAgICBtRGVmYXVsdFZhbHVlLmk2NCA9IGRlZmF1bHRWYWx1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTVRQX1RZUEVfVUlOVDY0OgorICAgICAgICAgICAgICAgIG1EZWZhdWx0VmFsdWUudTY0ID0gZGVmYXVsdFZhbHVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBMT0dFKCJ1bmtub3duIHR5cGUgJTA0WCBpbiBNdHBQcm9wZXJ0eTo6TXRwUHJvcGVydHkiLCB0eXBlKTsKKyAgICAgICAgfQorICAgIH0KK30KKworTXRwUHJvcGVydHk6On5NdHBQcm9wZXJ0eSgpIHsKKyAgICBpZiAobVR5cGUgPT0gTVRQX1RZUEVfU1RSKSB7CisgICAgICAgIC8vIGZyZWUgYWxsIHN0cmluZ3MKKyAgICAgICAgZnJlZShtRGVmYXVsdFZhbHVlLnN0cik7CisgICAgICAgIGZyZWUobUN1cnJlbnRWYWx1ZS5zdHIpOworICAgICAgICBmcmVlKG1NaW5pbXVtVmFsdWUuc3RyKTsKKyAgICAgICAgZnJlZShtTWF4aW11bVZhbHVlLnN0cik7CisgICAgICAgIGlmIChtRGVmYXVsdEFycmF5VmFsdWVzKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1EZWZhdWx0QXJyYXlMZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgICBmcmVlKG1EZWZhdWx0QXJyYXlWYWx1ZXNbaV0uc3RyKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobUN1cnJlbnRBcnJheVZhbHVlcykgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtQ3VycmVudEFycmF5TGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgZnJlZShtQ3VycmVudEFycmF5VmFsdWVzW2ldLnN0cik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1FbnVtVmFsdWVzKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1FbnVtTGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgZnJlZShtRW51bVZhbHVlc1tpXS5zdHIpOworICAgICAgICB9CisgICAgfQorICAgIGRlbGV0ZVtdIG1EZWZhdWx0QXJyYXlWYWx1ZXM7CisgICAgZGVsZXRlW10gbUN1cnJlbnRBcnJheVZhbHVlczsKKyAgICBkZWxldGVbXSBtRW51bVZhbHVlczsKK30KKwordm9pZCBNdHBQcm9wZXJ0eTo6cmVhZChNdHBEYXRhUGFja2V0JiBwYWNrZXQsIGJvb2wgZGV2aWNlUHJvcCkgeworCisgICAgbUNvZGUgPSBwYWNrZXQuZ2V0VUludDE2KCk7CisgICAgbVR5cGUgPSBwYWNrZXQuZ2V0VUludDE2KCk7CisgICAgbVdyaXRlYWJsZSA9IChwYWNrZXQuZ2V0VUludDgoKSA9PSAxKTsKKyAgICBzd2l0Y2ggKG1UeXBlKSB7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfQUlOVDg6CisgICAgICAgIGNhc2UgTVRQX1RZUEVfQVVJTlQ4OgorICAgICAgICBjYXNlIE1UUF9UWVBFX0FJTlQxNjoKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9BVUlOVDE2OgorICAgICAgICBjYXNlIE1UUF9UWVBFX0FJTlQzMjoKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9BVUlOVDMyOgorICAgICAgICBjYXNlIE1UUF9UWVBFX0FJTlQ2NDoKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9BVUlOVDY0OgorICAgICAgICBjYXNlIE1UUF9UWVBFX0FJTlQxMjg6CisgICAgICAgIGNhc2UgTVRQX1RZUEVfQVVJTlQxMjg6CisgICAgICAgICAgICBtRGVmYXVsdEFycmF5VmFsdWVzID0gcmVhZEFycmF5VmFsdWVzKHBhY2tldCwgbURlZmF1bHRBcnJheUxlbmd0aCk7CisgICAgICAgICAgICBtQ3VycmVudEFycmF5VmFsdWVzID0gcmVhZEFycmF5VmFsdWVzKHBhY2tldCwgbUN1cnJlbnRBcnJheUxlbmd0aCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJlYWRWYWx1ZShwYWNrZXQsIG1EZWZhdWx0VmFsdWUpOworICAgICAgICAgICAgaWYgKGRldmljZVByb3ApCisgICAgICAgICAgICAgICAgcmVhZFZhbHVlKHBhY2tldCwgbUN1cnJlbnRWYWx1ZSk7CisgICAgfQorICAgIG1Hcm91cENvZGUgPSBwYWNrZXQuZ2V0VUludDMyKCk7CisgICAgbUZvcm1GbGFnID0gcGFja2V0LmdldFVJbnQ4KCk7CisKKyAgICBpZiAobUZvcm1GbGFnID09IGtGb3JtUmFuZ2UpIHsKKyAgICAgICAgICAgIHJlYWRWYWx1ZShwYWNrZXQsIG1NaW5pbXVtVmFsdWUpOworICAgICAgICAgICAgcmVhZFZhbHVlKHBhY2tldCwgbU1heGltdW1WYWx1ZSk7CisgICAgICAgICAgICByZWFkVmFsdWUocGFja2V0LCBtU3RlcFNpemUpOworICAgIH0gZWxzZSBpZiAobUZvcm1GbGFnID09IGtGb3JtRW51bSkgeworICAgICAgICBtRW51bUxlbmd0aCA9IHBhY2tldC5nZXRVSW50MTYoKTsKKyAgICAgICAgbUVudW1WYWx1ZXMgPSBuZXcgTXRwUHJvcGVydHlWYWx1ZVttRW51bUxlbmd0aF07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbUVudW1MZW5ndGg7IGkrKykKKyAgICAgICAgICAgIHJlYWRWYWx1ZShwYWNrZXQsIG1FbnVtVmFsdWVzW2ldKTsKKyAgICB9Cit9CisKKy8vIEZJWE1FIC0gb25seSB3b3JrcyBmb3Igb2JqZWN0IHByb3BlcnRpZXMKK3ZvaWQgTXRwUHJvcGVydHk6OndyaXRlKE10cERhdGFQYWNrZXQmIHBhY2tldCkgeworICAgIHBhY2tldC5wdXRVSW50MTYobUNvZGUpOworICAgIHBhY2tldC5wdXRVSW50MTYobVR5cGUpOworICAgIHBhY2tldC5wdXRVSW50OChtV3JpdGVhYmxlID8gMSA6IDApOworCisgICAgc3dpdGNoIChtVHlwZSkgeworICAgICAgICBjYXNlIE1UUF9UWVBFX0FJTlQ4OgorICAgICAgICBjYXNlIE1UUF9UWVBFX0FVSU5UODoKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9BSU5UMTY6CisgICAgICAgIGNhc2UgTVRQX1RZUEVfQVVJTlQxNjoKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9BSU5UMzI6CisgICAgICAgIGNhc2UgTVRQX1RZUEVfQVVJTlQzMjoKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9BSU5UNjQ6CisgICAgICAgIGNhc2UgTVRQX1RZUEVfQVVJTlQ2NDoKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9BSU5UMTI4OgorICAgICAgICBjYXNlIE1UUF9UWVBFX0FVSU5UMTI4OgorICAgICAgICAgICAgd3JpdGVBcnJheVZhbHVlcyhwYWNrZXQsIG1EZWZhdWx0QXJyYXlWYWx1ZXMsIG1EZWZhdWx0QXJyYXlMZW5ndGgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB3cml0ZVZhbHVlKHBhY2tldCwgbURlZmF1bHRWYWx1ZSk7CisgICAgfQorICAgIHBhY2tldC5wdXRVSW50MzIobUdyb3VwQ29kZSk7CisgICAgcGFja2V0LnB1dFVJbnQ4KG1Gb3JtRmxhZyk7CisgICAgaWYgKG1Gb3JtRmxhZyA9PSBrRm9ybVJhbmdlKSB7CisgICAgICAgICAgICB3cml0ZVZhbHVlKHBhY2tldCwgbU1pbmltdW1WYWx1ZSk7CisgICAgICAgICAgICB3cml0ZVZhbHVlKHBhY2tldCwgbU1heGltdW1WYWx1ZSk7CisgICAgICAgICAgICB3cml0ZVZhbHVlKHBhY2tldCwgbVN0ZXBTaXplKTsKKyAgICB9IGVsc2UgaWYgKG1Gb3JtRmxhZyA9PSBrRm9ybUVudW0pIHsKKyAgICAgICAgcGFja2V0LnB1dFVJbnQxNihtRW51bUxlbmd0aCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbUVudW1MZW5ndGg7IGkrKykKKyAgICAgICAgICAgIHdyaXRlVmFsdWUocGFja2V0LCBtRW51bVZhbHVlc1tpXSk7CisgICAgfQorfQorCit2b2lkIE10cFByb3BlcnR5OjpwcmludCgpIHsKKyAgICBMT0dWKCJNdHBQcm9wZXJ0eSAlMDRYXG4iLCBtQ29kZSk7CisgICAgTE9HVigiICAgIHR5cGUgJTA0WFxuIiwgbVR5cGUpOworICAgIExPR1YoIiAgICB3cml0ZWFibGUgJXNcbiIsIChtV3JpdGVhYmxlID8gInRydWUiIDogImZhbHNlIikpOworfQorCit2b2lkIE10cFByb3BlcnR5OjpyZWFkVmFsdWUoTXRwRGF0YVBhY2tldCYgcGFja2V0LCBNdHBQcm9wZXJ0eVZhbHVlJiB2YWx1ZSkgeworICAgIE10cFN0cmluZ0J1ZmZlciBzdHJpbmdCdWZmZXI7CisKKyAgICBzd2l0Y2ggKG1UeXBlKSB7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfSU5UODoKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9BSU5UODoKKyAgICAgICAgICAgIHZhbHVlLmk4ID0gcGFja2V0LmdldEludDgoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX1VJTlQ4OgorICAgICAgICBjYXNlIE1UUF9UWVBFX0FVSU5UODoKKyAgICAgICAgICAgIHZhbHVlLnU4ID0gcGFja2V0LmdldFVJbnQ4KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9JTlQxNjoKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9BSU5UMTY6CisgICAgICAgICAgICB2YWx1ZS5pMTYgPSBwYWNrZXQuZ2V0SW50MTYoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX1VJTlQxNjoKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9BVUlOVDE2OgorICAgICAgICAgICAgdmFsdWUudTE2ID0gcGFja2V0LmdldFVJbnQxNigpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfSU5UMzI6CisgICAgICAgIGNhc2UgTVRQX1RZUEVfQUlOVDMyOgorICAgICAgICAgICAgdmFsdWUuaTMyID0gcGFja2V0LmdldEludDMyKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9VSU5UMzI6CisgICAgICAgIGNhc2UgTVRQX1RZUEVfQVVJTlQzMjoKKyAgICAgICAgICAgIHZhbHVlLnUzMiA9IHBhY2tldC5nZXRVSW50MzIoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX0lOVDY0OgorICAgICAgICBjYXNlIE1UUF9UWVBFX0FJTlQ2NDoKKyAgICAgICAgICAgIHZhbHVlLmk2NCA9IHBhY2tldC5nZXRJbnQ2NCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfVUlOVDY0OgorICAgICAgICBjYXNlIE1UUF9UWVBFX0FVSU5UNjQ6CisgICAgICAgICAgICB2YWx1ZS51NjQgPSBwYWNrZXQuZ2V0VUludDY0KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9JTlQxMjg6CisgICAgICAgIGNhc2UgTVRQX1RZUEVfQUlOVDEyODoKKyAgICAgICAgICAgIHBhY2tldC5nZXRJbnQxMjgodmFsdWUuaTEyOCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9VSU5UMTI4OgorICAgICAgICBjYXNlIE1UUF9UWVBFX0FVSU5UMTI4OgorICAgICAgICAgICAgcGFja2V0LmdldFVJbnQxMjgodmFsdWUudTEyOCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9TVFI6CisgICAgICAgICAgICBwYWNrZXQuZ2V0U3RyaW5nKHN0cmluZ0J1ZmZlcik7CisgICAgICAgICAgICB2YWx1ZS5zdHIgPSBzdHJkdXAoc3RyaW5nQnVmZmVyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgTE9HRSgidW5rbm93biB0eXBlICUwNFggaW4gTXRwUHJvcGVydHk6OnJlYWRWYWx1ZSIsIG1UeXBlKTsKKyAgICB9Cit9CisKK3ZvaWQgTXRwUHJvcGVydHk6OndyaXRlVmFsdWUoTXRwRGF0YVBhY2tldCYgcGFja2V0LCBNdHBQcm9wZXJ0eVZhbHVlJiB2YWx1ZSkgeworICAgIE10cFN0cmluZ0J1ZmZlciBzdHJpbmdCdWZmZXI7CisKKyAgICBzd2l0Y2ggKG1UeXBlKSB7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfSU5UODoKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9BSU5UODoKKyAgICAgICAgICAgIHBhY2tldC5wdXRJbnQ4KHZhbHVlLmk4KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX1VJTlQ4OgorICAgICAgICBjYXNlIE1UUF9UWVBFX0FVSU5UODoKKyAgICAgICAgICAgIHBhY2tldC5wdXRVSW50OCh2YWx1ZS51OCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9JTlQxNjoKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9BSU5UMTY6CisgICAgICAgICAgICBwYWNrZXQucHV0SW50MTYodmFsdWUuaTE2KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX1VJTlQxNjoKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9BVUlOVDE2OgorICAgICAgICAgICAgcGFja2V0LnB1dFVJbnQxNih2YWx1ZS51MTYpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfSU5UMzI6CisgICAgICAgIGNhc2UgTVRQX1RZUEVfQUlOVDMyOgorICAgICAgICAgICAgcGFja2V0LnB1dEludDMyKHZhbHVlLmkzMik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9VSU5UMzI6CisgICAgICAgIGNhc2UgTVRQX1RZUEVfQVVJTlQzMjoKKyAgICAgICAgICAgIHBhY2tldC5wdXRVSW50MzIodmFsdWUudTMyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX0lOVDY0OgorICAgICAgICBjYXNlIE1UUF9UWVBFX0FJTlQ2NDoKKyAgICAgICAgICAgIHBhY2tldC5wdXRJbnQ2NCh2YWx1ZS5pNjQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfVUlOVDY0OgorICAgICAgICBjYXNlIE1UUF9UWVBFX0FVSU5UNjQ6CisgICAgICAgICAgICBwYWNrZXQucHV0VUludDY0KHZhbHVlLnU2NCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9JTlQxMjg6CisgICAgICAgIGNhc2UgTVRQX1RZUEVfQUlOVDEyODoKKyAgICAgICAgICAgIHBhY2tldC5wdXRJbnQxMjgodmFsdWUuaTEyOCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9VSU5UMTI4OgorICAgICAgICBjYXNlIE1UUF9UWVBFX0FVSU5UMTI4OgorICAgICAgICAgICAgcGFja2V0LnB1dFVJbnQxMjgodmFsdWUudTEyOCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9TVFI6CisgICAgICAgICAgICBpZiAodmFsdWUuc3RyKQorICAgICAgICAgICAgICAgIHBhY2tldC5wdXRTdHJpbmcodmFsdWUuc3RyKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBwYWNrZXQucHV0RW1wdHlTdHJpbmcoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgTE9HRSgidW5rbm93biB0eXBlICUwNFggaW4gTXRwUHJvcGVydHk6OndyaXRlVmFsdWUiLCBtVHlwZSk7CisgICAgfQorfQorCitNdHBQcm9wZXJ0eVZhbHVlKiBNdHBQcm9wZXJ0eTo6cmVhZEFycmF5VmFsdWVzKE10cERhdGFQYWNrZXQmIHBhY2tldCwgaW50JiBsZW5ndGgpIHsKKyAgICBsZW5ndGggPSBwYWNrZXQuZ2V0VUludDMyKCk7CisgICAgaWYgKGxlbmd0aCA9PSAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBNdHBQcm9wZXJ0eVZhbHVlKiByZXN1bHQgPSBuZXcgTXRwUHJvcGVydHlWYWx1ZVtsZW5ndGhdOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCisgICAgICAgIHJlYWRWYWx1ZShwYWNrZXQsIHJlc3VsdFtpXSk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZCBNdHBQcm9wZXJ0eTo6d3JpdGVBcnJheVZhbHVlcyhNdHBEYXRhUGFja2V0JiBwYWNrZXQsIE10cFByb3BlcnR5VmFsdWUqIHZhbHVlcywgaW50IGxlbmd0aCkgeworICAgIHBhY2tldC5wdXRVSW50MzIobGVuZ3RoKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQorICAgICAgICB3cml0ZVZhbHVlKHBhY2tldCwgdmFsdWVzW2ldKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBQcm9wZXJ0eS5oIGIvbWVkaWEvbXRwL010cFByb3BlcnR5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzViNGUyOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBQcm9wZXJ0eS5oCkBAIC0wLDAgKzEsODIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9NVFBfUFJPUEVSVFlfSAorI2RlZmluZSBfTVRQX1BST1BFUlRZX0gKKworI2luY2x1ZGUgIk10cFR5cGVzLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgTXRwRGF0YVBhY2tldDsKKworY2xhc3MgTXRwUHJvcGVydHkgeworcHVibGljOgorICAgIE10cFByb3BlcnR5Q29kZSAgICAgbUNvZGU7CisgICAgTXRwRGF0YVR5cGUgICAgICAgICBtVHlwZTsKKyAgICBib29sICAgICAgICAgICAgICAgIG1Xcml0ZWFibGU7CisgICAgTXRwUHJvcGVydHlWYWx1ZSAgICBtRGVmYXVsdFZhbHVlOworICAgIE10cFByb3BlcnR5VmFsdWUgICAgbUN1cnJlbnRWYWx1ZTsKKworICAgIC8vIGZvciBhcnJheSB0eXBlcworICAgIGludCAgICAgICAgICAgICAgICAgbURlZmF1bHRBcnJheUxlbmd0aDsKKyAgICBNdHBQcm9wZXJ0eVZhbHVlKiAgIG1EZWZhdWx0QXJyYXlWYWx1ZXM7CisgICAgaW50ICAgICAgICAgICAgICAgICBtQ3VycmVudEFycmF5TGVuZ3RoOworICAgIE10cFByb3BlcnR5VmFsdWUqICAgbUN1cnJlbnRBcnJheVZhbHVlczsKKworICAgIGVudW0geworICAgICAgICBrRm9ybU5vbmUgPSAwLAorICAgICAgICBrRm9ybVJhbmdlID0gMSwKKyAgICAgICAga0Zvcm1FbnVtID0gMiwKKyAgICB9OworCisgICAgdWludDMyX3QgICAgICAgICAgICBtR3JvdXBDb2RlOworICAgIHVpbnQ4X3QgICAgICAgICAgICAgbUZvcm1GbGFnOworCisgICAgLy8gZm9yIHJhbmdlIGZvcm0KKyAgICBNdHBQcm9wZXJ0eVZhbHVlICAgIG1NaW5pbXVtVmFsdWU7CisgICAgTXRwUHJvcGVydHlWYWx1ZSAgICBtTWF4aW11bVZhbHVlOworICAgIE10cFByb3BlcnR5VmFsdWUgICAgbVN0ZXBTaXplOworCisgICAgLy8gZm9yIGVudW0gZm9ybQorICAgIGludCAgICAgICAgICAgICAgICAgbUVudW1MZW5ndGg7CisgICAgTXRwUHJvcGVydHlWYWx1ZSogICBtRW51bVZhbHVlczsKKworcHVibGljOgorICAgICAgICAgICAgICAgICAgICAgICAgTXRwUHJvcGVydHkoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIE10cFByb3BlcnR5KE10cFByb3BlcnR5Q29kZSBwcm9wQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBEYXRhVHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgd3JpdGVhYmxlID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlZmF1bHRWYWx1ZSA9IDApOworICAgIHZpcnR1YWwgICAgICAgICAgICAgfk10cFByb3BlcnR5KCk7CisKKyAgICBpbmxpbmUgTXRwUHJvcGVydHlDb2RlIGdldFByb3BlcnR5Q29kZSgpIGNvbnN0IHsgcmV0dXJuIG1Db2RlOyB9CisKKyAgICB2b2lkICAgICAgICAgICAgICAgIHJlYWQoTXRwRGF0YVBhY2tldCYgcGFja2V0LCBib29sIGRldmljZVByb3ApOworICAgIHZvaWQgICAgICAgICAgICAgICAgd3JpdGUoTXRwRGF0YVBhY2tldCYgcGFja2V0KTsKKworICAgIHZvaWQgICAgICAgICAgICAgICAgcHJpbnQoKTsKKworcHJpdmF0ZToKKyAgICB2b2lkICAgICAgICAgICAgICAgIHJlYWRWYWx1ZShNdHBEYXRhUGFja2V0JiBwYWNrZXQsIE10cFByb3BlcnR5VmFsdWUmIHZhbHVlKTsKKyAgICB2b2lkICAgICAgICAgICAgICAgIHdyaXRlVmFsdWUoTXRwRGF0YVBhY2tldCYgcGFja2V0LCBNdHBQcm9wZXJ0eVZhbHVlJiB2YWx1ZSk7CisgICAgTXRwUHJvcGVydHlWYWx1ZSogICByZWFkQXJyYXlWYWx1ZXMoTXRwRGF0YVBhY2tldCYgcGFja2V0LCBpbnQmIGxlbmd0aCk7CisgICAgdm9pZCAgICAgICAgICAgICAgICB3cml0ZUFycmF5VmFsdWVzKE10cERhdGFQYWNrZXQmIHBhY2tldCwgTXRwUHJvcGVydHlWYWx1ZSogdmFsdWVzLCBpbnQgbGVuZ3RoKTsKK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBfTVRQX1BST1BFUlRZX0gKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBSZXF1ZXN0UGFja2V0LmNwcCBiL21lZGlhL210cC9NdHBSZXF1ZXN0UGFja2V0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZWNlNTgwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL010cFJlcXVlc3RQYWNrZXQuY3BwCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIk10cFJlcXVlc3RQYWNrZXQiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisKKyNpbmNsdWRlICJNdHBSZXF1ZXN0UGFja2V0LmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworTXRwUmVxdWVzdFBhY2tldDo6TXRwUmVxdWVzdFBhY2tldCgpCisgICAgOiAgIE10cFBhY2tldCg1MTIpCit7Cit9CisKK010cFJlcXVlc3RQYWNrZXQ6On5NdHBSZXF1ZXN0UGFja2V0KCkgeworfQorCisjaWZkZWYgTVRQX0RFVklDRQoraW50IE10cFJlcXVlc3RQYWNrZXQ6OnJlYWQoaW50IGZkKSB7CisgICAgaW50IHJldCA9IDo6cmVhZChmZCwgbUJ1ZmZlciwgbUJ1ZmZlclNpemUpOworICAgIGlmIChyZXQgPj0gMCkKKyAgICAgICAgbVBhY2tldFNpemUgPSByZXQ7CisgICAgZWxzZQorICAgICAgICBtUGFja2V0U2l6ZSA9IDA7CisgICAgcmV0dXJuIHJldDsKK30KKyNlbmRpZgorCisjaWZkZWYgTVRQX0hPU1QKKyAgICAvLyB3cml0ZSBvdXIgYnVmZmVyIHRvIHRoZSBnaXZlbiBlbmRwb2ludCAoaG9zdCBtb2RlKQoraW50IE10cFJlcXVlc3RQYWNrZXQ6OndyaXRlKHN0cnVjdCB1c2JfZW5kcG9pbnQgKmVwKQoreworICAgIHB1dFVJbnQzMihNVFBfQ09OVEFJTkVSX0xFTkdUSF9PRkZTRVQsIG1QYWNrZXRTaXplKTsKKyAgICBwdXRVSW50MTYoTVRQX0NPTlRBSU5FUl9UWVBFX09GRlNFVCwgTVRQX0NPTlRBSU5FUl9UWVBFX0NPTU1BTkQpOworICAgIHJldHVybiB0cmFuc2ZlcihlcCwgbUJ1ZmZlciwgbVBhY2tldFNpemUpOworfQorI2VuZGlmCisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwUmVxdWVzdFBhY2tldC5oIGIvbWVkaWEvbXRwL010cFJlcXVlc3RQYWNrZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjUxOGYyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL010cFJlcXVlc3RQYWNrZXQuaApAQCAtMCwwICsxLDQ4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfTVRQX1JFUVVFU1RfUEFDS0VUX0gKKyNkZWZpbmUgX01UUF9SRVFVRVNUX1BBQ0tFVF9ICisKKyNpbmNsdWRlICJNdHBQYWNrZXQuaCIKKyNpbmNsdWRlICJtdHAuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBNdHBSZXF1ZXN0UGFja2V0IDogcHVibGljIE10cFBhY2tldCB7CisKK3B1YmxpYzoKKyAgICAgICAgICAgICAgICAgICAgICAgIE10cFJlcXVlc3RQYWNrZXQoKTsKKyAgICB2aXJ0dWFsICAgICAgICAgICAgIH5NdHBSZXF1ZXN0UGFja2V0KCk7CisKKyNpZmRlZiBNVFBfREVWSUNFCisgICAgLy8gZmlsbCBvdXIgYnVmZmVyIHdpdGggZGF0YSBmcm9tIHRoZSBnaXZlbiBmaWxlIGRlc2NyaXB0b3IKKyAgICBpbnQgICAgICAgICAgICAgICAgIHJlYWQoaW50IGZkKTsKKyNlbmRpZgorCisjaWZkZWYgTVRQX0hPU1QKKyAgICAvLyB3cml0ZSBvdXIgYnVmZmVyIHRvIHRoZSBnaXZlbiBlbmRwb2ludAorICAgIGludCAgICAgICAgICAgICAgICAgd3JpdGUoc3RydWN0IHVzYl9lbmRwb2ludCAqZXApOworI2VuZGlmCisKKyAgICBpbmxpbmUgTXRwT3BlcmF0aW9uQ29kZSAgICBnZXRPcGVyYXRpb25Db2RlKCkgY29uc3QgeyByZXR1cm4gZ2V0Q29udGFpbmVyQ29kZSgpOyB9CisgICAgaW5saW5lIHZvaWQgICAgICAgICAgICAgICAgc2V0T3BlcmF0aW9uQ29kZShNdHBPcGVyYXRpb25Db2RlIGNvZGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gc2V0Q29udGFpbmVyQ29kZShjb2RlKTsgfQorfTsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIF9NVFBfUkVRVUVTVF9QQUNLRVRfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cFJlc3BvbnNlUGFja2V0LmNwcCBiL21lZGlhL210cC9NdHBSZXNwb25zZVBhY2tldC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2VmNzE0ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBSZXNwb25zZVBhY2tldC5jcHAKQEAgLTAsMCArMSw1NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiTXRwUmVzcG9uc2VQYWNrZXQiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisKKyNpbmNsdWRlICJNdHBSZXNwb25zZVBhY2tldC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK010cFJlc3BvbnNlUGFja2V0OjpNdHBSZXNwb25zZVBhY2tldCgpCisgICAgOiAgIE10cFBhY2tldCg1MTIpCit7Cit9CisKK010cFJlc3BvbnNlUGFja2V0Ojp+TXRwUmVzcG9uc2VQYWNrZXQoKSB7Cit9CisKKyNpZmRlZiBNVFBfREVWSUNFCitpbnQgTXRwUmVzcG9uc2VQYWNrZXQ6OndyaXRlKGludCBmZCkgeworICAgIHB1dFVJbnQzMihNVFBfQ09OVEFJTkVSX0xFTkdUSF9PRkZTRVQsIG1QYWNrZXRTaXplKTsKKyAgICBwdXRVSW50MTYoTVRQX0NPTlRBSU5FUl9UWVBFX09GRlNFVCwgTVRQX0NPTlRBSU5FUl9UWVBFX1JFU1BPTlNFKTsKKyAgICBpbnQgcmV0ID0gOjp3cml0ZShmZCwgbUJ1ZmZlciwgbVBhY2tldFNpemUpOworICAgIHJldHVybiAocmV0IDwgMCA/IHJldCA6IDApOworfQorI2VuZGlmCisKKyNpZmRlZiBNVFBfSE9TVAorICAgIC8vIHJlYWQgb3VyIGJ1ZmZlciBmcm9tIHRoZSBnaXZlbiBlbmRwb2ludAoraW50IE10cFJlc3BvbnNlUGFja2V0OjpyZWFkKHN0cnVjdCB1c2JfZW5kcG9pbnQgKmVwKSB7CisgICAgaW50IHJldCA9IHRyYW5zZmVyKGVwLCBtQnVmZmVyLCBtQnVmZmVyU2l6ZSk7CisgICAgIGlmIChyZXQgPj0gMCkKKyAgICAgICAgbVBhY2tldFNpemUgPSByZXQ7CisgICAgZWxzZQorICAgICAgICBtUGFja2V0U2l6ZSA9IDA7CisgICAgcmV0dXJuIHJldDsKK30KKyNlbmRpZgorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwUmVzcG9uc2VQYWNrZXQuaCBiL21lZGlhL210cC9NdHBSZXNwb25zZVBhY2tldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3M2Y4ZjkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvTXRwUmVzcG9uc2VQYWNrZXQuaApAQCAtMCwwICsxLDQ4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfTVRQX1JFU1BPTlNFX1BBQ0tFVF9ICisjZGVmaW5lIF9NVFBfUkVTUE9OU0VfUEFDS0VUX0gKKworI2luY2x1ZGUgIk10cFBhY2tldC5oIgorI2luY2x1ZGUgIm10cC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIE10cFJlc3BvbnNlUGFja2V0IDogcHVibGljIE10cFBhY2tldCB7CisKK3B1YmxpYzoKKyAgICAgICAgICAgICAgICAgICAgICAgIE10cFJlc3BvbnNlUGFja2V0KCk7CisgICAgdmlydHVhbCAgICAgICAgICAgICB+TXRwUmVzcG9uc2VQYWNrZXQoKTsKKworI2lmZGVmIE1UUF9ERVZJQ0UKKyAgICAvLyB3cml0ZSBvdXIgZGF0YSB0byB0aGUgZ2l2ZW4gZmlsZSBkZXNjcmlwdG9yCisgICAgaW50ICAgICAgICAgICAgICAgICB3cml0ZShpbnQgZmQpOworI2VuZGlmCisKKyNpZmRlZiBNVFBfSE9TVAorICAgIC8vIHJlYWQgb3VyIGJ1ZmZlciBmcm9tIHRoZSBnaXZlbiBlbmRwb2ludAorICAgIGludCAgICAgICAgICAgICAgICAgcmVhZChzdHJ1Y3QgdXNiX2VuZHBvaW50ICplcCk7CisjZW5kaWYKKworICAgIGlubGluZSBNdHBSZXNwb25zZUNvZGUgICAgICBnZXRSZXNwb25zZUNvZGUoKSBjb25zdCB7IHJldHVybiBnZXRDb250YWluZXJDb2RlKCk7IH0KKyAgICBpbmxpbmUgdm9pZCAgICAgICAgICAgICAgICAgc2V0UmVzcG9uc2VDb2RlKE10cFJlc3BvbnNlQ29kZSBjb2RlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiBzZXRDb250YWluZXJDb2RlKGNvZGUpOyB9Cit9OworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gX01UUF9SRVNQT05TRV9QQUNLRVRfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cFNlcnZlci5jcHAgYi9tZWRpYS9tdHAvTXRwU2VydmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGFiZmI4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL010cFNlcnZlci5jcHAKQEAgLTAsMCArMSw2ODggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CisKKyNpbmNsdWRlICJNdHBEZWJ1Zy5oIgorI2luY2x1ZGUgIk10cERhdGFiYXNlLmgiCisjaW5jbHVkZSAiTXRwUHJvcGVydHkuaCIKKyNpbmNsdWRlICJNdHBTZXJ2ZXIuaCIKKyNpbmNsdWRlICJNdHBTdG9yYWdlLmgiCisjaW5jbHVkZSAiTXRwU3RyaW5nQnVmZmVyLmgiCisKKyNpbmNsdWRlIDxsaW51eC91c2IvZl9tdHAuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdGF0aWMgY29uc3QgTXRwT3BlcmF0aW9uQ29kZSBrU3VwcG9ydGVkT3BlcmF0aW9uQ29kZXNbXSA9IHsKKyAgICBNVFBfT1BFUkFUSU9OX0dFVF9ERVZJQ0VfSU5GTywKKyAgICBNVFBfT1BFUkFUSU9OX09QRU5fU0VTU0lPTiwKKyAgICBNVFBfT1BFUkFUSU9OX0NMT1NFX1NFU1NJT04sCisgICAgTVRQX09QRVJBVElPTl9HRVRfU1RPUkFHRV9JRFMsCisgICAgTVRQX09QRVJBVElPTl9HRVRfU1RPUkFHRV9JTkZPLAorICAgIE1UUF9PUEVSQVRJT05fR0VUX05VTV9PQkpFQ1RTLAorICAgIE1UUF9PUEVSQVRJT05fR0VUX09CSkVDVF9IQU5ETEVTLAorICAgIE1UUF9PUEVSQVRJT05fR0VUX09CSkVDVF9JTkZPLAorICAgIE1UUF9PUEVSQVRJT05fR0VUX09CSkVDVCwKKy8vICAgIE1UUF9PUEVSQVRJT05fR0VUX1RIVU1CLAorICAgIE1UUF9PUEVSQVRJT05fREVMRVRFX09CSkVDVCwKKyAgICBNVFBfT1BFUkFUSU9OX1NFTkRfT0JKRUNUX0lORk8sCisgICAgTVRQX09QRVJBVElPTl9TRU5EX09CSkVDVCwKKy8vICAgIE1UUF9PUEVSQVRJT05fSU5JVElBVEVfQ0FQVFVSRSwKKy8vICAgIE1UUF9PUEVSQVRJT05fRk9STUFUX1NUT1JFLAorLy8gICAgTVRQX09QRVJBVElPTl9SRVNFVF9ERVZJQ0UsCisvLyAgICBNVFBfT1BFUkFUSU9OX1NFTEZfVEVTVCwKKy8vICAgIE1UUF9PUEVSQVRJT05fU0VUX09CSkVDVF9QUk9URUNUSU9OLAorLy8gICAgTVRQX09QRVJBVElPTl9QT1dFUl9ET1dOLAorLy8gICAgTVRQX09QRVJBVElPTl9HRVRfREVWSUNFX1BST1BfREVTQywKKy8vICAgIE1UUF9PUEVSQVRJT05fR0VUX0RFVklDRV9QUk9QX1ZBTFVFLAorLy8gICAgTVRQX09QRVJBVElPTl9TRVRfREVWSUNFX1BST1BfVkFMVUUsCisvLyAgICBNVFBfT1BFUkFUSU9OX1JFU0VUX0RFVklDRV9QUk9QX1ZBTFVFLAorLy8gICAgTVRQX09QRVJBVElPTl9URVJNSU5BVEVfT1BFTl9DQVBUVVJFLAorLy8gICAgTVRQX09QRVJBVElPTl9NT1ZFX09CSkVDVCwKKy8vICAgIE1UUF9PUEVSQVRJT05fQ09QWV9PQkpFQ1QsCisvLyAgICBNVFBfT1BFUkFUSU9OX0dFVF9QQVJUSUFMX09CSkVDVCwKKy8vICAgIE1UUF9PUEVSQVRJT05fSU5JVElBVEVfT1BFTl9DQVBUVVJFLAorICAgIE1UUF9PUEVSQVRJT05fR0VUX09CSkVDVF9QUk9QU19TVVBQT1JURUQsCisvLyAgICBNVFBfT1BFUkFUSU9OX0dFVF9PQkpFQ1RfUFJPUF9ERVNDLAorICAgIE1UUF9PUEVSQVRJT05fR0VUX09CSkVDVF9QUk9QX1ZBTFVFLAorLy8gICAgTVRQX09QRVJBVElPTl9TRVRfT0JKRUNUX1BST1BfVkFMVUUsCisgICAgTVRQX09QRVJBVElPTl9HRVRfT0JKRUNUX1JFRkVSRU5DRVMsCisgICAgTVRQX09QRVJBVElPTl9TRVRfT0JKRUNUX1JFRkVSRU5DRVMsCisvLyAgICBNVFBfT1BFUkFUSU9OX1NLSVAsCit9OworCitzdGF0aWMgY29uc3QgTXRwRXZlbnRDb2RlIGtTdXBwb3J0ZWRFdmVudENvZGVzW10gPSB7CisgICAgTVRQX0VWRU5UX09CSkVDVF9BRERFRCwKKyAgICBNVFBfRVZFTlRfT0JKRUNUX1JFTU9WRUQsCit9OworCitNdHBTZXJ2ZXI6Ok10cFNlcnZlcihpbnQgZmQsIE10cERhdGFiYXNlKiBkYXRhYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgaW50IGZpbGVHcm91cCwgaW50IGZpbGVQZXJtLCBpbnQgZGlyZWN0b3J5UGVybSkKKyAgICA6ICAgbUZEKGZkKSwKKyAgICAgICAgbURhdGFiYXNlKGRhdGFiYXNlKSwKKyAgICAgICAgbUZpbGVHcm91cChmaWxlR3JvdXApLAorICAgICAgICBtRmlsZVBlcm1pc3Npb24oZmlsZVBlcm0pLAorICAgICAgICBtRGlyZWN0b3J5UGVybWlzc2lvbihkaXJlY3RvcnlQZXJtKSwKKyAgICAgICAgbVNlc3Npb25JRCgwKSwKKyAgICAgICAgbVNlc3Npb25PcGVuKGZhbHNlKSwKKyAgICAgICAgbVNlbmRPYmplY3RIYW5kbGUoa0ludmFsaWRPYmplY3RIYW5kbGUpLAorICAgICAgICBtU2VuZE9iamVjdEZvcm1hdCgwKSwKKyAgICAgICAgbVNlbmRPYmplY3RGaWxlU2l6ZSgwKQoreworICAgIGluaXRPYmplY3RQcm9wZXJ0aWVzKCk7Cit9CisKK010cFNlcnZlcjo6fk10cFNlcnZlcigpIHsKK30KKwordm9pZCBNdHBTZXJ2ZXI6OmFkZFN0b3JhZ2UoY29uc3QgY2hhciogZmlsZVBhdGgpIHsKKyAgICBpbnQgaW5kZXggPSBtU3RvcmFnZXMuc2l6ZSgpICsgMTsKKyAgICBpbmRleCB8PSBpbmRleCA8PCAxNjsgICAvLyBzZXQgaGlnaCBhbmQgbG93IHBhcnQgdG8gb3VyIGluZGV4CisgICAgTXRwU3RvcmFnZSogc3RvcmFnZSA9IG5ldyBNdHBTdG9yYWdlKGluZGV4LCBmaWxlUGF0aCwgbURhdGFiYXNlKTsKKyAgICBhZGRTdG9yYWdlKHN0b3JhZ2UpOworfQorCitNdHBTdG9yYWdlKiBNdHBTZXJ2ZXI6OmdldFN0b3JhZ2UoTXRwU3RvcmFnZUlEIGlkKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtU3RvcmFnZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgTXRwU3RvcmFnZSogc3RvcmFnZSA9ICBtU3RvcmFnZXNbaV07CisgICAgICAgIGlmIChzdG9yYWdlLT5nZXRTdG9yYWdlSUQoKSA9PSBpZCkKKyAgICAgICAgICAgIHJldHVybiBzdG9yYWdlOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKwordm9pZCBNdHBTZXJ2ZXI6OnJ1bigpIHsKKyAgICBpbnQgZmQgPSBtRkQ7CisKKyAgICBMT0dWKCJNdHBTZXJ2ZXI6OnJ1biBmZDogJWRcbiIsIGZkKTsKKworICAgIHdoaWxlICgxKSB7CisgICAgICAgIGludCByZXQgPSBtUmVxdWVzdC5yZWFkKGZkKTsKKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIExPR0UoInJlcXVlc3QgcmVhZCByZXR1cm5lZCAlZCwgZXJybm86ICVkIiwgcmV0LCBlcnJubyk7CisgICAgICAgICAgICBpZiAoZXJybm8gPT0gRUNBTkNFTEVEKSB7CisgICAgICAgICAgICAgICAgLy8gcmV0dXJuIHRvIHRvcCBvZiBsb29wIGFuZCB3YWl0IGZvciBuZXh0IGNvbW1hbmQKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIE10cE9wZXJhdGlvbkNvZGUgb3BlcmF0aW9uID0gbVJlcXVlc3QuZ2V0T3BlcmF0aW9uQ29kZSgpOworICAgICAgICBNdHBUcmFuc2FjdGlvbklEIHRyYW5zYWN0aW9uID0gbVJlcXVlc3QuZ2V0VHJhbnNhY3Rpb25JRCgpOworCisgICAgICAgIExPR1YoIm9wZXJhdGlvbjogJXMiLCBNdHBEZWJ1Zzo6Z2V0T3BlcmF0aW9uQ29kZU5hbWUob3BlcmF0aW9uKSk7CisgICAgICAgIG1SZXF1ZXN0LmR1bXAoKTsKKworICAgICAgICAvLyBGSVhNRSBuZWVkIHRvIGdlbmVyYWxpemUgdGhpcworICAgICAgICBib29sIGRhdGFJbiA9IChvcGVyYXRpb24gPT0gTVRQX09QRVJBVElPTl9TRU5EX09CSkVDVF9JTkZPCisgICAgICAgICAgICAgICAgICAgIHx8IG9wZXJhdGlvbiA9PSBNVFBfT1BFUkFUSU9OX1NFVF9PQkpFQ1RfUkVGRVJFTkNFUyk7CisgICAgICAgIGlmIChkYXRhSW4pIHsKKyAgICAgICAgICAgIGludCByZXQgPSBtRGF0YS5yZWFkKGZkKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICAgICAgTE9HRSgiZGF0YSByZWFkIHJldHVybmVkICVkLCBlcnJubzogJWQiLCByZXQsIGVycm5vKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJybm8gPT0gRUNBTkNFTEVEKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHJldHVybiB0byB0b3Agb2YgbG9vcCBhbmQgd2FpdCBmb3IgbmV4dCBjb21tYW5kCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIExPR1YoInJlY2VpdmVkIGRhdGE6Iik7CisgICAgICAgICAgICBtRGF0YS5kdW1wKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtRGF0YS5yZXNldCgpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGhhbmRsZVJlcXVlc3QoKSkgeworICAgICAgICAgICAgaWYgKCFkYXRhSW4gJiYgbURhdGEuaGFzRGF0YSgpKSB7CisgICAgICAgICAgICAgICAgbURhdGEuc2V0T3BlcmF0aW9uQ29kZShvcGVyYXRpb24pOworICAgICAgICAgICAgICAgIG1EYXRhLnNldFRyYW5zYWN0aW9uSUQodHJhbnNhY3Rpb24pOworICAgICAgICAgICAgICAgIExPR1YoInNlbmRpbmcgZGF0YToiKTsKKyAgICAgICAgICAgICAgICBtRGF0YS5kdW1wKCk7CisgICAgICAgICAgICAgICAgcmV0ID0gbURhdGEud3JpdGUoZmQpOworICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIExPR0UoInJlcXVlc3Qgd3JpdGUgcmV0dXJuZWQgJWQsIGVycm5vOiAlZCIsIHJldCwgZXJybm8pOworICAgICAgICAgICAgICAgICAgICBpZiAoZXJybm8gPT0gRUNBTkNFTEVEKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXR1cm4gdG8gdG9wIG9mIGxvb3AgYW5kIHdhaXQgZm9yIG5leHQgY29tbWFuZAorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtUmVzcG9uc2Uuc2V0VHJhbnNhY3Rpb25JRCh0cmFuc2FjdGlvbik7CisgICAgICAgICAgICBMT0dWKCJzZW5kaW5nIHJlc3BvbnNlICUwNFgiLCBtUmVzcG9uc2UuZ2V0UmVzcG9uc2VDb2RlKCkpOworICAgICAgICAgICAgcmV0ID0gbVJlc3BvbnNlLndyaXRlKGZkKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICAgICAgTE9HRSgicmVxdWVzdCB3cml0ZSByZXR1cm5lZCAlZCwgZXJybm86ICVkIiwgcmV0LCBlcnJubyk7CisgICAgICAgICAgICAgICAgaWYgKGVycm5vID09IEVDQU5DRUxFRCkgeworICAgICAgICAgICAgICAgICAgICAvLyByZXR1cm4gdG8gdG9wIG9mIGxvb3AgYW5kIHdhaXQgZm9yIG5leHQgY29tbWFuZAorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMT0dWKCJza2lwcGluZyByZXNwb25zZVxuIik7CisgICAgICAgIH0KKyAgICB9Cit9CisKK010cFByb3BlcnR5KiBNdHBTZXJ2ZXI6OmdldE9iamVjdFByb3BlcnR5KE10cFByb3BlcnR5Q29kZSBwcm9wQ29kZSkgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbU9iamVjdFByb3BlcnRpZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgTXRwUHJvcGVydHkqIHByb3BlcnR5ID0gbU9iamVjdFByb3BlcnRpZXNbaV07CisgICAgICAgIGlmIChwcm9wZXJ0eS0+Z2V0UHJvcGVydHlDb2RlKCkgPT0gcHJvcENvZGUpCisgICAgICAgICAgICByZXR1cm4gcHJvcGVydHk7CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCitNdHBQcm9wZXJ0eSogTXRwU2VydmVyOjpnZXREZXZpY2VQcm9wZXJ0eShNdHBQcm9wZXJ0eUNvZGUgcHJvcENvZGUpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG1EZXZpY2VQcm9wZXJ0aWVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIE10cFByb3BlcnR5KiBwcm9wZXJ0eSA9IG1EZXZpY2VQcm9wZXJ0aWVzW2ldOworICAgICAgICBpZiAocHJvcGVydHktPmdldFByb3BlcnR5Q29kZSgpID09IHByb3BDb2RlKQorICAgICAgICAgICAgcmV0dXJuIHByb3BlcnR5OworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKwordm9pZCBNdHBTZXJ2ZXI6OnNlbmRPYmplY3RBZGRlZChNdHBPYmplY3RIYW5kbGUgaGFuZGxlKSB7CisgICAgaWYgKG1TZXNzaW9uT3BlbikgeworICAgICAgICBMT0dEKCJzZW5kT2JqZWN0QWRkZWQgJWRcbiIsIGhhbmRsZSk7CisgICAgICAgIG1FdmVudC5zZXRFdmVudENvZGUoTVRQX0VWRU5UX09CSkVDVF9BRERFRCk7CisgICAgICAgIG1FdmVudC5zZXRUcmFuc2FjdGlvbklEKG1SZXF1ZXN0LmdldFRyYW5zYWN0aW9uSUQoKSk7CisgICAgICAgIG1FdmVudC5zZXRQYXJhbWV0ZXIoMSwgaGFuZGxlKTsKKyAgICAgICAgaW50IHJldCA9IG1FdmVudC53cml0ZShtRkQpOworICAgICAgICBMT0dEKCJtRXZlbnQud3JpdGUgcmV0dXJuZWQgJWRcbiIsIHJldCk7CisgICAgfQorfQorCit2b2lkIE10cFNlcnZlcjo6c2VuZE9iamVjdFJlbW92ZWQoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSkgeworICAgIGlmIChtU2Vzc2lvbk9wZW4pIHsKKyAgICAgICAgTE9HRCgic2VuZE9iamVjdFJlbW92ZWQgJWRcbiIsIGhhbmRsZSk7CisgICAgICAgIG1FdmVudC5zZXRFdmVudENvZGUoTVRQX0VWRU5UX09CSkVDVF9SRU1PVkVEKTsKKyAgICAgICAgbUV2ZW50LnNldFRyYW5zYWN0aW9uSUQobVJlcXVlc3QuZ2V0VHJhbnNhY3Rpb25JRCgpKTsKKyAgICAgICAgbUV2ZW50LnNldFBhcmFtZXRlcigxLCBoYW5kbGUpOworICAgICAgICBpbnQgcmV0ID0gbUV2ZW50LndyaXRlKG1GRCk7CisgICAgICAgIExPR0QoIm1FdmVudC53cml0ZSByZXR1cm5lZCAlZFxuIiwgcmV0KTsKKyAgICB9Cit9CisKK3ZvaWQgTXRwU2VydmVyOjppbml0T2JqZWN0UHJvcGVydGllcygpIHsKKyAgICBtT2JqZWN0UHJvcGVydGllcy5wdXNoKG5ldyBNdHBQcm9wZXJ0eShNVFBfUFJPUEVSVFlfU1RPUkFHRV9JRCwgTVRQX1RZUEVfVUlOVDMyKSk7CisgICAgbU9iamVjdFByb3BlcnRpZXMucHVzaChuZXcgTXRwUHJvcGVydHkoTVRQX1BST1BFUlRZX09CSkVDVF9GT1JNQVQsIE1UUF9UWVBFX1VJTlQxNikpOworICAgIG1PYmplY3RQcm9wZXJ0aWVzLnB1c2gobmV3IE10cFByb3BlcnR5KE1UUF9QUk9QRVJUWV9PQkpFQ1RfU0laRSwgTVRQX1RZUEVfVUlOVDY0KSk7CisgICAgbU9iamVjdFByb3BlcnRpZXMucHVzaChuZXcgTXRwUHJvcGVydHkoTVRQX1BST1BFUlRZX09CSkVDVF9GSUxFX05BTUUsIE1UUF9UWVBFX1NUUikpOworICAgIG1PYmplY3RQcm9wZXJ0aWVzLnB1c2gobmV3IE10cFByb3BlcnR5KE1UUF9QUk9QRVJUWV9QQVJFTlRfT0JKRUNULCBNVFBfVFlQRV9VSU5UMzIpKTsKK30KKworYm9vbCBNdHBTZXJ2ZXI6OmhhbmRsZVJlcXVlc3QoKSB7CisgICAgTXRwT3BlcmF0aW9uQ29kZSBvcGVyYXRpb24gPSBtUmVxdWVzdC5nZXRPcGVyYXRpb25Db2RlKCk7CisgICAgTXRwUmVzcG9uc2VDb2RlIHJlc3BvbnNlOworCisgICAgbVJlc3BvbnNlLnJlc2V0KCk7CisKKyAgICBpZiAobVNlbmRPYmplY3RIYW5kbGUgIT0ga0ludmFsaWRPYmplY3RIYW5kbGUgJiYgb3BlcmF0aW9uICE9IE1UUF9PUEVSQVRJT05fU0VORF9PQkpFQ1QpIHsKKyAgICAgICAgLy8gRklYTUUgLSBuZWVkIHRvIGRlbGV0ZSBtU2VuZE9iamVjdEhhbmRsZSBmcm9tIHRoZSBkYXRhYmFzZQorICAgICAgICBMT0dFKCJleHBlY3RlZCBTZW5kT2JqZWN0IGFmdGVyIFNlbmRPYmplY3RJbmZvIik7CisgICAgICAgIG1TZW5kT2JqZWN0SGFuZGxlID0ga0ludmFsaWRPYmplY3RIYW5kbGU7CisgICAgfQorCisgICAgc3dpdGNoIChvcGVyYXRpb24pIHsKKyAgICAgICAgY2FzZSBNVFBfT1BFUkFUSU9OX0dFVF9ERVZJQ0VfSU5GTzoKKyAgICAgICAgICAgIHJlc3BvbnNlID0gZG9HZXREZXZpY2VJbmZvKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfT1BFUkFUSU9OX09QRU5fU0VTU0lPTjoKKyAgICAgICAgICAgIHJlc3BvbnNlID0gZG9PcGVuU2Vzc2lvbigpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX09QRVJBVElPTl9DTE9TRV9TRVNTSU9OOgorICAgICAgICAgICAgcmVzcG9uc2UgPSBkb0Nsb3NlU2Vzc2lvbigpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX09QRVJBVElPTl9HRVRfU1RPUkFHRV9JRFM6CisgICAgICAgICAgICByZXNwb25zZSA9IGRvR2V0U3RvcmFnZUlEcygpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICBjYXNlIE1UUF9PUEVSQVRJT05fR0VUX1NUT1JBR0VfSU5GTzoKKyAgICAgICAgICAgIHJlc3BvbnNlID0gZG9HZXRTdG9yYWdlSW5mbygpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX09QRVJBVElPTl9HRVRfT0JKRUNUX1BST1BTX1NVUFBPUlRFRDoKKyAgICAgICAgICAgIHJlc3BvbnNlID0gZG9HZXRPYmplY3RQcm9wc1N1cHBvcnRlZCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX09QRVJBVElPTl9HRVRfT0JKRUNUX0hBTkRMRVM6CisgICAgICAgICAgICByZXNwb25zZSA9IGRvR2V0T2JqZWN0SGFuZGxlcygpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX09QRVJBVElPTl9HRVRfTlVNX09CSkVDVFM6CisgICAgICAgICAgICByZXNwb25zZSA9IGRvR2V0TnVtT2JqZWN0cygpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX09QRVJBVElPTl9HRVRfT0JKRUNUX1JFRkVSRU5DRVM6CisgICAgICAgICAgICByZXNwb25zZSA9IGRvR2V0T2JqZWN0UmVmZXJlbmNlcygpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX09QRVJBVElPTl9TRVRfT0JKRUNUX1JFRkVSRU5DRVM6CisgICAgICAgICAgICByZXNwb25zZSA9IGRvU2V0T2JqZWN0UmVmZXJlbmNlcygpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX09QRVJBVElPTl9HRVRfT0JKRUNUX1BST1BfVkFMVUU6CisgICAgICAgICAgICByZXNwb25zZSA9IGRvR2V0T2JqZWN0UHJvcFZhbHVlKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfT1BFUkFUSU9OX0dFVF9PQkpFQ1RfSU5GTzoKKyAgICAgICAgICAgIHJlc3BvbnNlID0gZG9HZXRPYmplY3RJbmZvKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfT1BFUkFUSU9OX0dFVF9PQkpFQ1Q6CisgICAgICAgICAgICByZXNwb25zZSA9IGRvR2V0T2JqZWN0KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfT1BFUkFUSU9OX1NFTkRfT0JKRUNUX0lORk86CisgICAgICAgICAgICByZXNwb25zZSA9IGRvU2VuZE9iamVjdEluZm8oKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9PUEVSQVRJT05fU0VORF9PQkpFQ1Q6CisgICAgICAgICAgICByZXNwb25zZSA9IGRvU2VuZE9iamVjdCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX09QRVJBVElPTl9ERUxFVEVfT0JKRUNUOgorICAgICAgICAgICAgcmVzcG9uc2UgPSBkb0RlbGV0ZU9iamVjdCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX09QRVJBVElPTl9HRVRfT0JKRUNUX1BST1BfREVTQzoKKyAgICAgICAgICAgIHJlc3BvbnNlID0gZG9HZXRPYmplY3RQcm9wRGVzYygpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXNwb25zZSA9IE1UUF9SRVNQT05TRV9PUEVSQVRJT05fTk9UX1NVUFBPUlRFRDsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChyZXNwb25zZSA9PSBNVFBfUkVTUE9OU0VfVFJBTlNBQ1RJT05fQ0FOQ0VMTEVEKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgbVJlc3BvbnNlLnNldFJlc3BvbnNlQ29kZShyZXNwb25zZSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK010cFJlc3BvbnNlQ29kZSBNdHBTZXJ2ZXI6OmRvR2V0RGV2aWNlSW5mbygpIHsKKyAgICBNdHBTdHJpbmdCdWZmZXIgICBzdHJpbmc7CisgICAgY2hhciBwcm9wX3ZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF07CisKKyAgICBNdHBPYmplY3RGb3JtYXRMaXN0KiBwbGF5YmFja0Zvcm1hdHMgPSBtRGF0YWJhc2UtPmdldFN1cHBvcnRlZFBsYXliYWNrRm9ybWF0cygpOworICAgIE10cE9iamVjdEZvcm1hdExpc3QqIGNhcHR1cmVGb3JtYXRzID0gbURhdGFiYXNlLT5nZXRTdXBwb3J0ZWRDYXB0dXJlRm9ybWF0cygpOworICAgIE10cERldmljZVByb3BlcnR5TGlzdCogZGV2aWNlUHJvcGVydGllcyA9IG1EYXRhYmFzZS0+Z2V0U3VwcG9ydGVkRGV2aWNlUHJvcGVydGllcygpOworCisgICAgLy8gZmlsbCBpbiBkZXZpY2UgaW5mbworICAgIG1EYXRhLnB1dFVJbnQxNihNVFBfU1RBTkRBUkRfVkVSU0lPTik7CisgICAgbURhdGEucHV0VUludDMyKDYpOyAvLyBNVFAgVmVuZG9yIEV4dGVuc2lvbiBJRAorICAgIG1EYXRhLnB1dFVJbnQxNihNVFBfU1RBTkRBUkRfVkVSU0lPTik7CisgICAgc3RyaW5nLnNldCgibWljcm9zb2Z0LmNvbTogMS4wOyIpOworICAgIG1EYXRhLnB1dFN0cmluZyhzdHJpbmcpOyAvLyBNVFAgRXh0ZW5zaW9ucworICAgIG1EYXRhLnB1dFVJbnQxNigwKTsgLy9GdW5jdGlvbmFsIE1vZGUKKyAgICBtRGF0YS5wdXRBVUludDE2KGtTdXBwb3J0ZWRPcGVyYXRpb25Db2RlcywKKyAgICAgICAgICAgIHNpemVvZihrU3VwcG9ydGVkT3BlcmF0aW9uQ29kZXMpIC8gc2l6ZW9mKHVpbnQxNl90KSk7IC8vIE9wZXJhdGlvbnMgU3VwcG9ydGVkCisgICAgbURhdGEucHV0QVVJbnQxNihrU3VwcG9ydGVkRXZlbnRDb2RlcywKKyAgICAgICAgICAgIHNpemVvZihrU3VwcG9ydGVkRXZlbnRDb2RlcykgLyBzaXplb2YodWludDE2X3QpKTsgLy8gRXZlbnRzIFN1cHBvcnRlZAorICAgIG1EYXRhLnB1dEFVSW50MTYoZGV2aWNlUHJvcGVydGllcyk7IC8vIERldmljZSBQcm9wZXJ0aWVzIFN1cHBvcnRlZAorICAgIG1EYXRhLnB1dEFVSW50MTYoY2FwdHVyZUZvcm1hdHMpOyAvLyBDYXB0dXJlIEZvcm1hdHMKKyAgICBtRGF0YS5wdXRBVUludDE2KHBsYXliYWNrRm9ybWF0cyk7ICAvLyBQbGF5YmFjayBGb3JtYXRzCisgICAgLy8gRklYTUUKKyAgICBzdHJpbmcuc2V0KCJHb29nbGUsIEluYy4iKTsKKyAgICBtRGF0YS5wdXRTdHJpbmcoc3RyaW5nKTsgICAvLyBNYW51ZmFjdHVyZXIKKworICAgIHByb3BlcnR5X2dldCgicm8ucHJvZHVjdC5tb2RlbCIsIHByb3BfdmFsdWUsICJNVFAgRGV2aWNlIik7CisgICAgc3RyaW5nLnNldChwcm9wX3ZhbHVlKTsKKyAgICBtRGF0YS5wdXRTdHJpbmcoc3RyaW5nKTsgICAvLyBNb2RlbAorICAgIHN0cmluZy5zZXQoIjEuMCIpOworICAgIG1EYXRhLnB1dFN0cmluZyhzdHJpbmcpOyAgIC8vIERldmljZSBWZXJzaW9uCisKKyAgICBwcm9wZXJ0eV9nZXQoInJvLnNlcmlhbG5vIiwgcHJvcF92YWx1ZSwgIj8/Pz8/Pz8/Iik7CisgICAgc3RyaW5nLnNldChwcm9wX3ZhbHVlKTsKKyAgICBtRGF0YS5wdXRTdHJpbmcoc3RyaW5nKTsgICAvLyBTZXJpYWwgTnVtYmVyCisKKyAgICBkZWxldGUgcGxheWJhY2tGb3JtYXRzOworICAgIGRlbGV0ZSBjYXB0dXJlRm9ybWF0czsKKyAgICBkZWxldGUgZGV2aWNlUHJvcGVydGllczsKKworICAgIHJldHVybiBNVFBfUkVTUE9OU0VfT0s7Cit9CisKK010cFJlc3BvbnNlQ29kZSBNdHBTZXJ2ZXI6OmRvT3BlblNlc3Npb24oKSB7CisgICAgaWYgKG1TZXNzaW9uT3BlbikgeworICAgICAgICBtUmVzcG9uc2Uuc2V0UGFyYW1ldGVyKDEsIG1TZXNzaW9uSUQpOworICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX1NFU1NJT05fQUxSRUFEWV9PUEVOOworICAgIH0KKyAgICBtU2Vzc2lvbklEID0gbVJlcXVlc3QuZ2V0UGFyYW1ldGVyKDEpOworICAgIG1TZXNzaW9uT3BlbiA9IHRydWU7CisgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9PSzsKK30KKworTXRwUmVzcG9uc2VDb2RlIE10cFNlcnZlcjo6ZG9DbG9zZVNlc3Npb24oKSB7CisgICAgaWYgKCFtU2Vzc2lvbk9wZW4pCisgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfU0VTU0lPTl9OT1RfT1BFTjsKKyAgICBtU2Vzc2lvbklEID0gMDsKKyAgICBtU2Vzc2lvbk9wZW4gPSBmYWxzZTsKKyAgICByZXR1cm4gTVRQX1JFU1BPTlNFX09LOworfQorCitNdHBSZXNwb25zZUNvZGUgTXRwU2VydmVyOjpkb0dldFN0b3JhZ2VJRHMoKSB7CisgICAgaWYgKCFtU2Vzc2lvbk9wZW4pCisgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfU0VTU0lPTl9OT1RfT1BFTjsKKworICAgIGludCBjb3VudCA9IG1TdG9yYWdlcy5zaXplKCk7CisgICAgbURhdGEucHV0VUludDMyKGNvdW50KTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCisgICAgICAgIG1EYXRhLnB1dFVJbnQzMihtU3RvcmFnZXNbaV0tPmdldFN0b3JhZ2VJRCgpKTsKKworICAgIHJldHVybiBNVFBfUkVTUE9OU0VfT0s7Cit9CisKK010cFJlc3BvbnNlQ29kZSBNdHBTZXJ2ZXI6OmRvR2V0U3RvcmFnZUluZm8oKSB7CisgICAgTXRwU3RyaW5nQnVmZmVyICAgc3RyaW5nOworCisgICAgaWYgKCFtU2Vzc2lvbk9wZW4pCisgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfU0VTU0lPTl9OT1RfT1BFTjsKKyAgICBNdHBTdG9yYWdlSUQgaWQgPSBtUmVxdWVzdC5nZXRQYXJhbWV0ZXIoMSk7CisgICAgTXRwU3RvcmFnZSogc3RvcmFnZSA9IGdldFN0b3JhZ2UoaWQpOworICAgIGlmICghc3RvcmFnZSkKKyAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9JTlZBTElEX1NUT1JBR0VfSUQ7CisKKyAgICBtRGF0YS5wdXRVSW50MTYoc3RvcmFnZS0+Z2V0VHlwZSgpKTsKKyAgICBtRGF0YS5wdXRVSW50MTYoc3RvcmFnZS0+Z2V0RmlsZVN5c3RlbVR5cGUoKSk7CisgICAgbURhdGEucHV0VUludDE2KHN0b3JhZ2UtPmdldEFjY2Vzc0NhcGFiaWxpdHkoKSk7CisgICAgbURhdGEucHV0VUludDY0KHN0b3JhZ2UtPmdldE1heENhcGFjaXR5KCkpOworICAgIG1EYXRhLnB1dFVJbnQ2NChzdG9yYWdlLT5nZXRGcmVlU3BhY2UoKSk7CisgICAgbURhdGEucHV0VUludDMyKDEwMjQqMTAyNCoxMDI0KTsgLy8gRnJlZSBTcGFjZSBpbiBPYmplY3RzCisgICAgc3RyaW5nLnNldChzdG9yYWdlLT5nZXREZXNjcmlwdGlvbigpKTsKKyAgICBtRGF0YS5wdXRTdHJpbmcoc3RyaW5nKTsKKyAgICBtRGF0YS5wdXRFbXB0eVN0cmluZygpOyAgIC8vIFZvbHVtZSBJZGVudGlmaWVyCisKKyAgICByZXR1cm4gTVRQX1JFU1BPTlNFX09LOworfQorCitNdHBSZXNwb25zZUNvZGUgTXRwU2VydmVyOjpkb0dldE9iamVjdFByb3BzU3VwcG9ydGVkKCkgeworICAgIGlmICghbVNlc3Npb25PcGVuKQorICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX1NFU1NJT05fTk9UX09QRU47CisgICAgTXRwT2JqZWN0Rm9ybWF0IGZvcm1hdCA9IG1SZXF1ZXN0LmdldFBhcmFtZXRlcigxKTsKKyAgICBNdHBEZXZpY2VQcm9wZXJ0eUxpc3QqIHByb3BlcnRpZXMgPSBtRGF0YWJhc2UtPmdldFN1cHBvcnRlZE9iamVjdFByb3BlcnRpZXMoZm9ybWF0KTsKKyAgICBtRGF0YS5wdXRBVUludDE2KHByb3BlcnRpZXMpOworICAgIGRlbGV0ZSBwcm9wZXJ0aWVzOworICAgIHJldHVybiBNVFBfUkVTUE9OU0VfT0s7Cit9CisKK010cFJlc3BvbnNlQ29kZSBNdHBTZXJ2ZXI6OmRvR2V0T2JqZWN0SGFuZGxlcygpIHsKKyAgICBpZiAoIW1TZXNzaW9uT3BlbikKKyAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9TRVNTSU9OX05PVF9PUEVOOworICAgIE10cFN0b3JhZ2VJRCBzdG9yYWdlSUQgPSBtUmVxdWVzdC5nZXRQYXJhbWV0ZXIoMSk7ICAgICAgLy8gMHhGRkZGRkZGRiBmb3IgYWxsIHN0b3JhZ2UKKyAgICBNdHBPYmplY3RGb3JtYXQgZm9ybWF0ID0gbVJlcXVlc3QuZ2V0UGFyYW1ldGVyKDIpOyAgICAgIC8vIDAgZm9yIGFsbCBmb3JtYXRzCisgICAgTXRwT2JqZWN0SGFuZGxlIHBhcmVudCA9IG1SZXF1ZXN0LmdldFBhcmFtZXRlcigzKTsgICAgICAvLyAweEZGRkZGRkZGIGZvciBvYmplY3RzIHdpdGggbm8gcGFyZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAweDAwMDAwMDAwIGZvciBhbGwgb2JqZWN0cz8KKyAgICBpZiAocGFyZW50ID09IDB4RkZGRkZGRkYpCisgICAgICAgIHBhcmVudCA9IDA7CisKKyAgICBNdHBPYmplY3RIYW5kbGVMaXN0KiBoYW5kbGVzID0gbURhdGFiYXNlLT5nZXRPYmplY3RMaXN0KHN0b3JhZ2VJRCwgZm9ybWF0LCBwYXJlbnQpOworICAgIG1EYXRhLnB1dEFVSW50MzIoaGFuZGxlcyk7CisgICAgZGVsZXRlIGhhbmRsZXM7CisgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9PSzsKK30KKworTXRwUmVzcG9uc2VDb2RlIE10cFNlcnZlcjo6ZG9HZXROdW1PYmplY3RzKCkgeworICAgIGlmICghbVNlc3Npb25PcGVuKQorICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX1NFU1NJT05fTk9UX09QRU47CisgICAgTXRwU3RvcmFnZUlEIHN0b3JhZ2VJRCA9IG1SZXF1ZXN0LmdldFBhcmFtZXRlcigxKTsgICAgICAvLyAweEZGRkZGRkZGIGZvciBhbGwgc3RvcmFnZQorICAgIE10cE9iamVjdEZvcm1hdCBmb3JtYXQgPSBtUmVxdWVzdC5nZXRQYXJhbWV0ZXIoMik7ICAgICAgLy8gMCBmb3IgYWxsIGZvcm1hdHMKKyAgICBNdHBPYmplY3RIYW5kbGUgcGFyZW50ID0gbVJlcXVlc3QuZ2V0UGFyYW1ldGVyKDMpOyAgICAgIC8vIDB4RkZGRkZGRkYgZm9yIG9iamVjdHMgd2l0aCBubyBwYXJlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDB4MDAwMDAwMDAgZm9yIGFsbCBvYmplY3RzPworICAgIGlmIChwYXJlbnQgPT0gMHhGRkZGRkZGRikKKyAgICAgICAgcGFyZW50ID0gMDsKKworICAgIGludCBjb3VudCA9IG1EYXRhYmFzZS0+Z2V0TnVtT2JqZWN0cyhzdG9yYWdlSUQsIGZvcm1hdCwgcGFyZW50KTsKKyAgICBpZiAoY291bnQgPj0gMCkgeworICAgICAgICBtUmVzcG9uc2Uuc2V0UGFyYW1ldGVyKDEsIGNvdW50KTsKKyAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9PSzsKKyAgICB9IGVsc2UgeworICAgICAgICBtUmVzcG9uc2Uuc2V0UGFyYW1ldGVyKDEsIDApOworICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX0lOVkFMSURfT0JKRUNUX0hBTkRMRTsKKyAgICB9Cit9CisKK010cFJlc3BvbnNlQ29kZSBNdHBTZXJ2ZXI6OmRvR2V0T2JqZWN0UmVmZXJlbmNlcygpIHsKKyAgICBpZiAoIW1TZXNzaW9uT3BlbikKKyAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9TRVNTSU9OX05PVF9PUEVOOworICAgIE10cFN0b3JhZ2VJRCBoYW5kbGUgPSBtUmVxdWVzdC5nZXRQYXJhbWV0ZXIoMSk7CisgICAgTXRwT2JqZWN0SGFuZGxlTGlzdCogaGFuZGxlcyA9IG1EYXRhYmFzZS0+Z2V0T2JqZWN0UmVmZXJlbmNlcyhoYW5kbGUpOworICAgIGlmICghaGFuZGxlcykgeworICAgICAgICBtRGF0YS5wdXRFbXB0eUFycmF5KCk7CisgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfSU5WQUxJRF9PQkpFQ1RfSEFORExFOworICAgIH0KKyAgICBtRGF0YS5wdXRBVUludDMyKGhhbmRsZXMpOworICAgIGRlbGV0ZSBoYW5kbGVzOworICAgIHJldHVybiBNVFBfUkVTUE9OU0VfT0s7Cit9CisKK010cFJlc3BvbnNlQ29kZSBNdHBTZXJ2ZXI6OmRvU2V0T2JqZWN0UmVmZXJlbmNlcygpIHsKKyAgICBpZiAoIW1TZXNzaW9uT3BlbikKKyAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9TRVNTSU9OX05PVF9PUEVOOworICAgIE10cFN0b3JhZ2VJRCBoYW5kbGUgPSBtUmVxdWVzdC5nZXRQYXJhbWV0ZXIoMSk7CisgICAgTXRwT2JqZWN0SGFuZGxlTGlzdCogcmVmZXJlbmNlcyA9IG1EYXRhLmdldEFVSW50MzIoKTsKKyAgICBNdHBSZXNwb25zZUNvZGUgcmVzdWx0ID0gbURhdGFiYXNlLT5zZXRPYmplY3RSZWZlcmVuY2VzKGhhbmRsZSwgcmVmZXJlbmNlcyk7CisgICAgZGVsZXRlIHJlZmVyZW5jZXM7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworTXRwUmVzcG9uc2VDb2RlIE10cFNlcnZlcjo6ZG9HZXRPYmplY3RQcm9wVmFsdWUoKSB7CisgICAgTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSA9IG1SZXF1ZXN0LmdldFBhcmFtZXRlcigxKTsKKyAgICBNdHBPYmplY3RQcm9wZXJ0eSBwcm9wZXJ0eSA9IG1SZXF1ZXN0LmdldFBhcmFtZXRlcigyKTsKKworICAgIHJldHVybiBtRGF0YWJhc2UtPmdldE9iamVjdFByb3BlcnR5KGhhbmRsZSwgcHJvcGVydHksIG1EYXRhKTsKK30KKworTXRwUmVzcG9uc2VDb2RlIE10cFNlcnZlcjo6ZG9HZXRPYmplY3RJbmZvKCkgeworICAgIE10cE9iamVjdEhhbmRsZSBoYW5kbGUgPSBtUmVxdWVzdC5nZXRQYXJhbWV0ZXIoMSk7CisgICAgcmV0dXJuIG1EYXRhYmFzZS0+Z2V0T2JqZWN0SW5mbyhoYW5kbGUsIG1EYXRhKTsKK30KKworTXRwUmVzcG9uc2VDb2RlIE10cFNlcnZlcjo6ZG9HZXRPYmplY3QoKSB7CisgICAgTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSA9IG1SZXF1ZXN0LmdldFBhcmFtZXRlcigxKTsKKyAgICBNdHBTdHJpbmcgcGF0aEJ1ZjsKKyAgICBpbnQ2NF90IGZpbGVMZW5ndGg7CisgICAgaW50IHJlc3VsdCA9IG1EYXRhYmFzZS0+Z2V0T2JqZWN0RmlsZVBhdGgoaGFuZGxlLCBwYXRoQnVmLCBmaWxlTGVuZ3RoKTsKKyAgICBpZiAocmVzdWx0ICE9IE1UUF9SRVNQT05TRV9PSykKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKworICAgIGNvbnN0IGNoYXIqIGZpbGVQYXRoID0gKGNvbnN0IGNoYXIgKilwYXRoQnVmOworICAgIG10cF9maWxlX3JhbmdlICBtZnI7CisgICAgbWZyLmZkID0gb3BlbihmaWxlUGF0aCwgT19SRE9OTFkpOworICAgIGlmIChtZnIuZmQgPCAwKSB7CisgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfR0VORVJBTF9FUlJPUjsKKyAgICB9CisgICAgbWZyLm9mZnNldCA9IDA7CisgICAgbWZyLmxlbmd0aCA9IGZpbGVMZW5ndGg7CisKKyAgICAvLyBzZW5kIGRhdGEgaGVhZGVyCisgICAgbURhdGEuc2V0T3BlcmF0aW9uQ29kZShtUmVxdWVzdC5nZXRPcGVyYXRpb25Db2RlKCkpOworICAgIG1EYXRhLnNldFRyYW5zYWN0aW9uSUQobVJlcXVlc3QuZ2V0VHJhbnNhY3Rpb25JRCgpKTsKKyAgICBtRGF0YS53cml0ZURhdGFIZWFkZXIobUZELCBmaWxlTGVuZ3RoKTsKKworICAgIC8vIHRoZW4gdHJhbnNmZXIgdGhlIGZpbGUKKyAgICBpbnQgcmV0ID0gaW9jdGwobUZELCBNVFBfU0VORF9GSUxFLCAodW5zaWduZWQgbG9uZykmbWZyKTsKKyAgICBjbG9zZShtZnIuZmQpOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIGlmIChlcnJubyA9PSBFQ0FOQ0VMRUQpCisgICAgICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX1RSQU5TQUNUSU9OX0NBTkNFTExFRDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9HRU5FUkFMX0VSUk9SOworICAgIH0KKyAgICByZXR1cm4gTVRQX1JFU1BPTlNFX09LOworfQorCitNdHBSZXNwb25zZUNvZGUgTXRwU2VydmVyOjpkb1NlbmRPYmplY3RJbmZvKCkgeworICAgIE10cFN0cmluZyBwYXRoOworICAgIE10cFN0b3JhZ2VJRCBzdG9yYWdlSUQgPSBtUmVxdWVzdC5nZXRQYXJhbWV0ZXIoMSk7CisgICAgTXRwU3RvcmFnZSogc3RvcmFnZSA9IGdldFN0b3JhZ2Uoc3RvcmFnZUlEKTsKKyAgICBNdHBPYmplY3RIYW5kbGUgcGFyZW50ID0gbVJlcXVlc3QuZ2V0UGFyYW1ldGVyKDIpOworICAgIGlmICghc3RvcmFnZSkKKyAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9JTlZBTElEX1NUT1JBR0VfSUQ7CisKKyAgICAvLyBzcGVjaWFsIGNhc2UgdGhlIHJvb3QKKyAgICBpZiAocGFyZW50ID09IE1UUF9QQVJFTlRfUk9PVCkgeworICAgICAgICBwYXRoID0gc3RvcmFnZS0+Z2V0UGF0aCgpOworICAgICAgICBwYXJlbnQgPSAwOworICAgIH0gZWxzZSB7CisgICAgICAgIGludDY0X3QgZHVtbXk7CisgICAgICAgIGludCByZXN1bHQgPSBtRGF0YWJhc2UtPmdldE9iamVjdEZpbGVQYXRoKHBhcmVudCwgcGF0aCwgZHVtbXkpOworICAgICAgICBpZiAocmVzdWx0ICE9IE1UUF9SRVNQT05TRV9PSykKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLy8gcmVhZCBvbmx5IHRoZSBmaWVsZHMgd2UgbmVlZAorICAgIG1EYXRhLmdldFVJbnQzMigpOyAgLy8gc3RvcmFnZSBJRAorICAgIE10cE9iamVjdEZvcm1hdCBmb3JtYXQgPSBtRGF0YS5nZXRVSW50MTYoKTsKKyAgICBtRGF0YS5nZXRVSW50MTYoKTsgIC8vIHByb3RlY3Rpb24gc3RhdHVzCisgICAgbVNlbmRPYmplY3RGaWxlU2l6ZSA9IG1EYXRhLmdldFVJbnQzMigpOworICAgIG1EYXRhLmdldFVJbnQxNigpOyAgLy8gdGh1bWIgZm9ybWF0CisgICAgbURhdGEuZ2V0VUludDMyKCk7ICAvLyB0aHVtYiBjb21wcmVzc2VkIHNpemUKKyAgICBtRGF0YS5nZXRVSW50MzIoKTsgIC8vIHRodW1iIHBpeCB3aWR0aAorICAgIG1EYXRhLmdldFVJbnQzMigpOyAgLy8gdGh1bWIgcGl4IGhlaWdodAorICAgIG1EYXRhLmdldFVJbnQzMigpOyAgLy8gaW1hZ2UgcGl4IHdpZHRoCisgICAgbURhdGEuZ2V0VUludDMyKCk7ICAvLyBpbWFnZSBwaXggaGVpZ2h0CisgICAgbURhdGEuZ2V0VUludDMyKCk7ICAvLyBpbWFnZSBiaXQgZGVwdGgKKyAgICBtRGF0YS5nZXRVSW50MzIoKTsgIC8vIHBhcmVudAorICAgIHVpbnQxNl90IGFzc29jaWF0aW9uVHlwZSA9IG1EYXRhLmdldFVJbnQxNigpOworICAgIHVpbnQzMl90IGFzc29jaWF0aW9uRGVzYyA9IG1EYXRhLmdldFVJbnQzMigpOyAgIC8vIGFzc29jaWF0aW9uIGRlc2MKKyAgICBtRGF0YS5nZXRVSW50MzIoKTsgIC8vIHNlcXVlbmNlIG51bWJlcgorICAgIE10cFN0cmluZ0J1ZmZlciBuYW1lLCBjcmVhdGVkLCBtb2RpZmllZDsKKyAgICBtRGF0YS5nZXRTdHJpbmcobmFtZSk7ICAgIC8vIGZpbGUgbmFtZQorICAgIG1EYXRhLmdldFN0cmluZyhjcmVhdGVkKTsgICAgICAvLyBkYXRlIGNyZWF0ZWQKKyAgICBtRGF0YS5nZXRTdHJpbmcobW9kaWZpZWQpOyAgICAgLy8gZGF0ZSBtb2RpZmllZAorICAgIC8vIGtleXdvcmRzIGZvbGxvdworCisgICAgdGltZV90IG1vZGlmaWVkVGltZTsKKyAgICBpZiAoIXBhcnNlRGF0ZVRpbWUobW9kaWZpZWQsIG1vZGlmaWVkVGltZSkpCisgICAgICAgIG1vZGlmaWVkVGltZSA9IDA7CisKKyAgICBpZiAocGF0aFtwYXRoLnNpemUoKSAtIDFdICE9ICcvJykKKyAgICAgICAgcGF0aCArPSAiLyI7CisgICAgcGF0aCArPSAoY29uc3QgY2hhciAqKW5hbWU7CisKKyAgICBNdHBPYmplY3RIYW5kbGUgaGFuZGxlID0gbURhdGFiYXNlLT5iZWdpblNlbmRPYmplY3QoKGNvbnN0IGNoYXIqKXBhdGgsCisgICAgICAgICAgICBmb3JtYXQsIHBhcmVudCwgc3RvcmFnZUlELCBtU2VuZE9iamVjdEZpbGVTaXplLCBtb2RpZmllZFRpbWUpOworICAgIGlmIChoYW5kbGUgPT0ga0ludmFsaWRPYmplY3RIYW5kbGUpIHsKKyAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9HRU5FUkFMX0VSUk9SOworICAgIH0KKworICBpZiAoZm9ybWF0ID09IE1UUF9GT1JNQVRfQVNTT0NJQVRJT04pIHsKKyAgICAgICAgbW9kZV90IG1hc2sgPSB1bWFzaygwKTsKKyAgICAgICAgaW50IHJldCA9IG1rZGlyKChjb25zdCBjaGFyICopcGF0aCwgbURpcmVjdG9yeVBlcm1pc3Npb24pOworICAgICAgICB1bWFzayhtYXNrKTsKKyAgICAgICAgaWYgKHJldCAmJiByZXQgIT0gLUVFWElTVCkKKyAgICAgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfR0VORVJBTF9FUlJPUjsKKyAgICAgICAgY2hvd24oKGNvbnN0IGNoYXIgKilwYXRoLCBnZXR1aWQoKSwgbUZpbGVHcm91cCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbVNlbmRPYmplY3RGaWxlUGF0aCA9IHBhdGg7CisgICAgICAgIC8vIHNhdmUgdGhlIGhhbmRsZSBmb3IgdGhlIFNlbmRPYmplY3QgY2FsbCwgd2hpY2ggc2hvdWxkIGZvbGxvdworICAgICAgICBtU2VuZE9iamVjdEhhbmRsZSA9IGhhbmRsZTsKKyAgICAgICAgbVNlbmRPYmplY3RGb3JtYXQgPSBmb3JtYXQ7CisgICAgfQorCisgICAgbVJlc3BvbnNlLnNldFBhcmFtZXRlcigxLCBzdG9yYWdlSUQpOworICAgIG1SZXNwb25zZS5zZXRQYXJhbWV0ZXIoMiwgKHBhcmVudCA9PSAwID8gMHhGRkZGRkZGRjogcGFyZW50KSk7CisgICAgbVJlc3BvbnNlLnNldFBhcmFtZXRlcigzLCBoYW5kbGUpOworCisgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9PSzsKK30KKworTXRwUmVzcG9uc2VDb2RlIE10cFNlcnZlcjo6ZG9TZW5kT2JqZWN0KCkgeworICAgIE10cFJlc3BvbnNlQ29kZSByZXN1bHQgPSBNVFBfUkVTUE9OU0VfT0s7CisgICAgbW9kZV90IG1hc2s7CisgICAgaW50IHJldDsKKworICAgIGlmIChtU2VuZE9iamVjdEhhbmRsZSA9PSBrSW52YWxpZE9iamVjdEhhbmRsZSkgeworICAgICAgICBMT0dFKCJFeHBlY3RlZCBTZW5kT2JqZWN0SW5mbyBiZWZvcmUgU2VuZE9iamVjdCIpOworICAgICAgICByZXN1bHQgPSBNVFBfUkVTUE9OU0VfTk9fVkFMSURfT0JKRUNUX0lORk87CisgICAgICAgIGdvdG8gZG9uZTsKKyAgICB9CisKKyAgICAvLyByZWFkIHRoZSBoZWFkZXIKKyAgICByZXQgPSBtRGF0YS5yZWFkRGF0YUhlYWRlcihtRkQpOworICAgIC8vIEZJWE1FIC0gY2hlY2sgZm9yIGVycm9ycyBoZXJlLgorCisgICAgLy8gcmVzZXQgc28gd2UgZG9uJ3QgYXR0ZW1wdCB0byBzZW5kIHRoaXMgYmFjaworICAgIG1EYXRhLnJlc2V0KCk7CisKKyAgICBtdHBfZmlsZV9yYW5nZSAgbWZyOworICAgIG1mci5mZCA9IG9wZW4obVNlbmRPYmplY3RGaWxlUGF0aCwgT19SRFdSIHwgT19DUkVBVCB8IE9fVFJVTkMpOworICAgIGlmIChtZnIuZmQgPCAwKSB7CisgICAgICAgIHJlc3VsdCA9IE1UUF9SRVNQT05TRV9HRU5FUkFMX0VSUk9SOworICAgICAgICBnb3RvIGRvbmU7CisgICAgfQorICAgIGZjaG93bihtZnIuZmQsIGdldHVpZCgpLCBtRmlsZUdyb3VwKTsKKyAgICAvLyBzZXQgcGVybWlzc2lvbnMKKyAgICBtYXNrID0gdW1hc2soMCk7CisgICAgZmNobW9kKG1mci5mZCwgbUZpbGVQZXJtaXNzaW9uKTsKKyAgICB1bWFzayhtYXNrKTsKKworICAgIG1mci5vZmZzZXQgPSAwOworICAgIG1mci5sZW5ndGggPSBtU2VuZE9iamVjdEZpbGVTaXplOworCisgICAgLy8gdHJhbnNmZXIgdGhlIGZpbGUKKyAgICByZXQgPSBpb2N0bChtRkQsIE1UUF9SRUNFSVZFX0ZJTEUsICh1bnNpZ25lZCBsb25nKSZtZnIpOworICAgIGNsb3NlKG1mci5mZCk7CisKKyAgICBMT0dWKCJNVFBfUkVDRUlWRV9GSUxFIHJldHVybmVkICVkIiwgcmV0KTsKKworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIHVubGluayhtU2VuZE9iamVjdEZpbGVQYXRoKTsKKyAgICAgICAgaWYgKGVycm5vID09IEVDQU5DRUxFRCkKKyAgICAgICAgICAgIHJlc3VsdCA9IE1UUF9SRVNQT05TRV9UUkFOU0FDVElPTl9DQU5DRUxMRUQ7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJlc3VsdCA9IE1UUF9SRVNQT05TRV9HRU5FUkFMX0VSUk9SOworICAgIH0KKworZG9uZToKKyAgICBtRGF0YWJhc2UtPmVuZFNlbmRPYmplY3QobVNlbmRPYmplY3RGaWxlUGF0aCwgbVNlbmRPYmplY3RIYW5kbGUsIG1TZW5kT2JqZWN0Rm9ybWF0LAorICAgICAgICAgICAgcmVzdWx0ID09IE1UUF9SRVNQT05TRV9PSyk7CisgICAgbVNlbmRPYmplY3RIYW5kbGUgPSBrSW52YWxpZE9iamVjdEhhbmRsZTsKKyAgICBtU2VuZE9iamVjdEZvcm1hdCA9IDA7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworTXRwUmVzcG9uc2VDb2RlIE10cFNlcnZlcjo6ZG9EZWxldGVPYmplY3QoKSB7CisgICAgTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSA9IG1SZXF1ZXN0LmdldFBhcmFtZXRlcigxKTsKKyAgICBNdHBPYmplY3RGb3JtYXQgZm9ybWF0ID0gbVJlcXVlc3QuZ2V0UGFyYW1ldGVyKDEpOworICAgIC8vIEZJWE1FIC0gc3VwcG9ydCBkZWxldGluZyBhbGwgb2JqZWN0cyBpZiBoYW5kbGUgaXMgMHhGRkZGRkZGRgorICAgIC8vIEZJWE1FIC0gaW1wbGVtZW50IGRlbGV0aW5nIG9iamVjdHMgYnkgZm9ybWF0CisgICAgLy8gRklYTUUgLSBoYW5kbGUgbm9uLWVtcHR5IGRpcmVjdG9yaWVzCisKKyAgICBNdHBTdHJpbmcgZmlsZVBhdGg7CisgICAgaW50NjRfdCBmaWxlTGVuZ3RoOworICAgIGludCByZXN1bHQgPSBtRGF0YWJhc2UtPmdldE9iamVjdEZpbGVQYXRoKGhhbmRsZSwgZmlsZVBhdGgsIGZpbGVMZW5ndGgpOworICAgIGlmIChyZXN1bHQgPT0gTVRQX1JFU1BPTlNFX09LKSB7CisgICAgICAgIExPR1YoImRlbGV0aW5nICVzIiwgKGNvbnN0IGNoYXIgKilmaWxlUGF0aCk7CisgICAgICAgIC8vIG9uZSBvZiB0aGVzZSBzaG91bGQgd29yaworICAgICAgICBybWRpcigoY29uc3QgY2hhciAqKWZpbGVQYXRoKTsKKyAgICAgICAgdW5saW5rKChjb25zdCBjaGFyICopZmlsZVBhdGgpOworICAgICAgICByZXR1cm4gbURhdGFiYXNlLT5kZWxldGVGaWxlKGhhbmRsZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9Cit9CisKK010cFJlc3BvbnNlQ29kZSBNdHBTZXJ2ZXI6OmRvR2V0T2JqZWN0UHJvcERlc2MoKSB7CisgICAgTXRwT2JqZWN0UHJvcGVydHkgcHJvcENvZGUgPSBtUmVxdWVzdC5nZXRQYXJhbWV0ZXIoMSk7CisgICAgTXRwT2JqZWN0Rm9ybWF0IGZvcm1hdCA9IG1SZXF1ZXN0LmdldFBhcmFtZXRlcigyKTsKKyAgICBNdHBQcm9wZXJ0eSogcHJvcGVydHkgPSBnZXRPYmplY3RQcm9wZXJ0eShwcm9wQ29kZSk7CisgICAgaWYgKCFwcm9wZXJ0eSkKKyAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9PQkpFQ1RfUFJPUF9OT1RfU1VQUE9SVEVEOworCisgICAgcHJvcGVydHktPndyaXRlKG1EYXRhKTsKKyAgICByZXR1cm4gTVRQX1JFU1BPTlNFX09LOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cFNlcnZlci5oIGIvbWVkaWEvbXRwL010cFNlcnZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5Y2NmMjQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvTXRwU2VydmVyLmgKQEAgLTAsMCArMSwxMTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9NVFBfU0VSVkVSX0gKKyNkZWZpbmUgX01UUF9TRVJWRVJfSAorCisjaW5jbHVkZSAiTXRwUmVxdWVzdFBhY2tldC5oIgorI2luY2x1ZGUgIk10cERhdGFQYWNrZXQuaCIKKyNpbmNsdWRlICJNdHBSZXNwb25zZVBhY2tldC5oIgorI2luY2x1ZGUgIk10cEV2ZW50UGFja2V0LmgiCisjaW5jbHVkZSAibXRwLmgiCisKKyNpbmNsdWRlICJNdHBVdGlscy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIE10cERhdGFiYXNlOworY2xhc3MgTXRwUHJvcGVydHk7CitjbGFzcyBNdHBTdG9yYWdlOworCitjbGFzcyBNdHBTZXJ2ZXIgeworCitwcml2YXRlOgorICAgIC8vIGZpbGUgZGVzY3JpcHRvciBmb3IgTVRQIGtlcm5lbCBkcml2ZXIKKyAgICBpbnQgICAgICAgICAgICAgICAgIG1GRDsKKworICAgIE10cERhdGFiYXNlKiAgICAgICAgbURhdGFiYXNlOworCisgICAgLy8gZ3JvdXAgdG8gb3duIG5ldyBmaWxlcyBhbmQgZm9sZGVycworICAgIGludCAgICAgICAgICAgICAgICAgbUZpbGVHcm91cDsKKyAgICAvLyBwZXJtaXNzaW9ucyBmb3IgbmV3IGZpbGVzIGFuZCBkaXJlY3RvcmllcworICAgIGludCAgICAgICAgICAgICAgICAgbUZpbGVQZXJtaXNzaW9uOworICAgIGludCAgICAgICAgICAgICAgICAgbURpcmVjdG9yeVBlcm1pc3Npb247CisKKyAgICAvLyBjdXJyZW50IHNlc3Npb24gSUQKKyAgICBNdHBTZXNzaW9uSUQgICAgICAgIG1TZXNzaW9uSUQ7CisgICAgLy8gdHJ1ZSBpZiB3ZSBoYXZlIGFuIG9wZW4gc2Vzc2lvbiBhbmQgbVNlc3Npb25JRCBpcyB2YWxpZAorICAgIGJvb2wgICAgICAgICAgICAgICAgbVNlc3Npb25PcGVuOworCisgICAgTXRwUmVxdWVzdFBhY2tldCAgICBtUmVxdWVzdDsKKyAgICBNdHBEYXRhUGFja2V0ICAgICAgIG1EYXRhOworICAgIE10cFJlc3BvbnNlUGFja2V0ICAgbVJlc3BvbnNlOworICAgIE10cEV2ZW50UGFja2V0ICAgICAgbUV2ZW50OworCisgICAgTXRwU3RvcmFnZUxpc3QgICAgICBtU3RvcmFnZXM7CisKKyAgICBNdHBQcm9wZXJ0eUxpc3QgICAgIG1PYmplY3RQcm9wZXJ0aWVzOworICAgIE10cFByb3BlcnR5TGlzdCAgICAgbURldmljZVByb3BlcnRpZXM7CisKKyAgICAvLyBoYW5kbGUgZm9yIG5ldyBvYmplY3QsIHNldCBieSBTZW5kT2JqZWN0SW5mbyBhbmQgdXNlZCBieSBTZW5kT2JqZWN0CisgICAgTXRwT2JqZWN0SGFuZGxlICAgICBtU2VuZE9iamVjdEhhbmRsZTsKKyAgICBNdHBPYmplY3RGb3JtYXQgICAgIG1TZW5kT2JqZWN0Rm9ybWF0OworICAgIE10cFN0cmluZyAgICAgICAgICAgbVNlbmRPYmplY3RGaWxlUGF0aDsKKyAgICBzaXplX3QgICAgICAgICAgICAgIG1TZW5kT2JqZWN0RmlsZVNpemU7CisKK3B1YmxpYzoKKyAgICAgICAgICAgICAgICAgICAgICAgIE10cFNlcnZlcihpbnQgZmQsIE10cERhdGFiYXNlKiBkYXRhYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWxlR3JvdXAsIGludCBmaWxlUGVybSwgaW50IGRpcmVjdG9yeVBlcm0pOworICAgIHZpcnR1YWwgICAgICAgICAgICAgfk10cFNlcnZlcigpOworCisgICAgdm9pZCAgICAgICAgICAgICAgICBhZGRTdG9yYWdlKGNvbnN0IGNoYXIqIGZpbGVQYXRoKTsKKyAgICBpbmxpbmUgdm9pZCAgICAgICAgIGFkZFN0b3JhZ2UoTXRwU3RvcmFnZSogc3RvcmFnZSkgeyBtU3RvcmFnZXMucHVzaChzdG9yYWdlKTsgfQorICAgIE10cFN0b3JhZ2UqICAgICAgICAgZ2V0U3RvcmFnZShNdHBTdG9yYWdlSUQgaWQpOworICAgIHZvaWQgICAgICAgICAgICAgICAgcnVuKCk7CisKKyAgICBNdHBQcm9wZXJ0eSogICAgICAgIGdldE9iamVjdFByb3BlcnR5KE10cFByb3BlcnR5Q29kZSBwcm9wQ29kZSk7CisgICAgTXRwUHJvcGVydHkqICAgICAgICBnZXREZXZpY2VQcm9wZXJ0eShNdHBQcm9wZXJ0eUNvZGUgcHJvcENvZGUpOworCisgICAgdm9pZCAgICAgICAgICAgICAgICBzZW5kT2JqZWN0QWRkZWQoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSk7CisgICAgdm9pZCAgICAgICAgICAgICAgICBzZW5kT2JqZWN0UmVtb3ZlZChNdHBPYmplY3RIYW5kbGUgaGFuZGxlKTsKKworcHJpdmF0ZToKKyAgICB2b2lkICAgICAgICAgICAgICAgIGluaXRPYmplY3RQcm9wZXJ0aWVzKCk7CisKKyAgICBib29sICAgICAgICAgICAgICAgIGhhbmRsZVJlcXVlc3QoKTsKKworICAgIE10cFJlc3BvbnNlQ29kZSAgICAgZG9HZXREZXZpY2VJbmZvKCk7CisgICAgTXRwUmVzcG9uc2VDb2RlICAgICBkb09wZW5TZXNzaW9uKCk7CisgICAgTXRwUmVzcG9uc2VDb2RlICAgICBkb0Nsb3NlU2Vzc2lvbigpOworICAgIE10cFJlc3BvbnNlQ29kZSAgICAgZG9HZXRTdG9yYWdlSURzKCk7CisgICAgTXRwUmVzcG9uc2VDb2RlICAgICBkb0dldFN0b3JhZ2VJbmZvKCk7CisgICAgTXRwUmVzcG9uc2VDb2RlICAgICBkb0dldE9iamVjdFByb3BzU3VwcG9ydGVkKCk7CisgICAgTXRwUmVzcG9uc2VDb2RlICAgICBkb0dldE9iamVjdEhhbmRsZXMoKTsKKyAgICBNdHBSZXNwb25zZUNvZGUgICAgIGRvR2V0TnVtT2JqZWN0cygpOworICAgIE10cFJlc3BvbnNlQ29kZSAgICAgZG9HZXRPYmplY3RSZWZlcmVuY2VzKCk7CisgICAgTXRwUmVzcG9uc2VDb2RlICAgICBkb1NldE9iamVjdFJlZmVyZW5jZXMoKTsKKyAgICBNdHBSZXNwb25zZUNvZGUgICAgIGRvR2V0T2JqZWN0UHJvcFZhbHVlKCk7CisgICAgTXRwUmVzcG9uc2VDb2RlICAgICBkb0dldE9iamVjdEluZm8oKTsKKyAgICBNdHBSZXNwb25zZUNvZGUgICAgIGRvR2V0T2JqZWN0KCk7CisgICAgTXRwUmVzcG9uc2VDb2RlICAgICBkb1NlbmRPYmplY3RJbmZvKCk7CisgICAgTXRwUmVzcG9uc2VDb2RlICAgICBkb1NlbmRPYmplY3QoKTsKKyAgICBNdHBSZXNwb25zZUNvZGUgICAgIGRvRGVsZXRlT2JqZWN0KCk7CisgICAgTXRwUmVzcG9uc2VDb2RlICAgICBkb0dldE9iamVjdFByb3BEZXNjKCk7Cit9OworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gX01UUF9TRVJWRVJfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cFN0b3JhZ2UuY3BwIGIvbWVkaWEvbXRwL010cFN0b3JhZ2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjY2YxODYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvTXRwU3RvcmFnZS5jcHAKQEAgLTAsMCArMSw4MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiTXRwU3RvcmFnZSIKKworI2luY2x1ZGUgIk10cERlYnVnLmgiCisjaW5jbHVkZSAiTXRwRGF0YWJhc2UuaCIKKyNpbmNsdWRlICJNdHBTdG9yYWdlLmgiCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy9zdGF0ZnMuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxkaXJlbnQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworTXRwU3RvcmFnZTo6TXRwU3RvcmFnZShNdHBTdG9yYWdlSUQgaWQsIGNvbnN0IGNoYXIqIGZpbGVQYXRoLCBNdHBEYXRhYmFzZSogZGIpCisgICAgOiAgIG1TdG9yYWdlSUQoaWQpLAorICAgICAgICBtRmlsZVBhdGgoZmlsZVBhdGgpLAorICAgICAgICBtRGF0YWJhc2UoZGIpLAorICAgICAgICBtTWF4Q2FwYWNpdHkoMCkKK3sKKyAgICBMT0dEKCJNdHBTdG9yYWdlIGlkOiAlZCBwYXRoOiAlc1xuIiwgaWQsIGZpbGVQYXRoKTsKK30KKworTXRwU3RvcmFnZTo6fk10cFN0b3JhZ2UoKSB7Cit9CisKK2ludCBNdHBTdG9yYWdlOjpnZXRUeXBlKCkgY29uc3QgeworICAgIHJldHVybiBNVFBfU1RPUkFHRV9GSVhFRF9SQU07Cit9CisKK2ludCBNdHBTdG9yYWdlOjpnZXRGaWxlU3lzdGVtVHlwZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gTVRQX1NUT1JBR0VfRklMRVNZU1RFTV9ISUVSQVJDSElDQUw7Cit9CisKK2ludCBNdHBTdG9yYWdlOjpnZXRBY2Nlc3NDYXBhYmlsaXR5KCkgY29uc3QgeworICAgIHJldHVybiBNVFBfU1RPUkFHRV9SRUFEX1dSSVRFOworfQorCit1aW50NjRfdCBNdHBTdG9yYWdlOjpnZXRNYXhDYXBhY2l0eSgpIHsKKyAgICBpZiAobU1heENhcGFjaXR5ID09IDApIHsKKyAgICAgICAgc3RydWN0IHN0YXRmcyAgIHN0YXQ7CisgICAgICAgIGlmIChzdGF0ZnMobUZpbGVQYXRoLCAmc3RhdCkpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIG1NYXhDYXBhY2l0eSA9ICh1aW50NjRfdClzdGF0LmZfYmxvY2tzICogKHVpbnQ2NF90KXN0YXQuZl9ic2l6ZTsKKyAgICB9CisgICAgcmV0dXJuIG1NYXhDYXBhY2l0eTsKK30KKwordWludDY0X3QgTXRwU3RvcmFnZTo6Z2V0RnJlZVNwYWNlKCkgeworICAgIHN0cnVjdCBzdGF0ZnMgICBzdGF0OworICAgIGlmIChzdGF0ZnMobUZpbGVQYXRoLCAmc3RhdCkpCisgICAgICAgIHJldHVybiAtMTsKKyAgICByZXR1cm4gKHVpbnQ2NF90KXN0YXQuZl9iYXZhaWwgKiAodWludDY0X3Qpc3RhdC5mX2JzaXplOworfQorCitjb25zdCBjaGFyKiBNdHBTdG9yYWdlOjpnZXREZXNjcmlwdGlvbigpIGNvbnN0IHsKKyAgICByZXR1cm4gIkRldmljZSBTdG9yYWdlIjsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBTdG9yYWdlLmggYi9tZWRpYS9tdHAvTXRwU3RvcmFnZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxM2I5MjYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvTXRwU3RvcmFnZS5oCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9NVFBfU1RPUkFHRV9ICisjZGVmaW5lIF9NVFBfU1RPUkFHRV9ICisKKyNpbmNsdWRlICJtdHAuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBNdHBEYXRhYmFzZTsKKworY2xhc3MgTXRwU3RvcmFnZSB7CisKK3ByaXZhdGU6CisgICAgTXRwU3RvcmFnZUlEICAgICAgICAgICAgbVN0b3JhZ2VJRDsKKyAgICBjb25zdCBjaGFyKiAgICAgICAgICAgICBtRmlsZVBhdGg7CisgICAgTXRwRGF0YWJhc2UqICAgICAgICAgICAgbURhdGFiYXNlOworICAgIHVpbnQ2NF90ICAgICAgICAgICAgICAgIG1NYXhDYXBhY2l0eTsKKworcHVibGljOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cFN0b3JhZ2UoTXRwU3RvcmFnZUlEIGlkLCBjb25zdCBjaGFyKiBmaWxlUGF0aCwgTXRwRGF0YWJhc2UqIGRiKTsKKyAgICB2aXJ0dWFsICAgICAgICAgICAgICAgICB+TXRwU3RvcmFnZSgpOworCisgICAgaW5saW5lIE10cFN0b3JhZ2VJRCAgICAgZ2V0U3RvcmFnZUlEKCkgY29uc3QgeyByZXR1cm4gbVN0b3JhZ2VJRDsgfQorICAgIGludCAgICAgICAgICAgICAgICAgICAgIGdldFR5cGUoKSBjb25zdDsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICBnZXRGaWxlU3lzdGVtVHlwZSgpIGNvbnN0OworICAgIGludCAgICAgICAgICAgICAgICAgICAgIGdldEFjY2Vzc0NhcGFiaWxpdHkoKSBjb25zdDsKKyAgICB1aW50NjRfdCAgICAgICAgICAgICAgICBnZXRNYXhDYXBhY2l0eSgpOworICAgIHVpbnQ2NF90ICAgICAgICAgICAgICAgIGdldEZyZWVTcGFjZSgpOworICAgIGNvbnN0IGNoYXIqICAgICAgICAgICAgIGdldERlc2NyaXB0aW9uKCkgY29uc3Q7CisgICAgaW5saW5lIGNvbnN0IGNoYXIqICAgICAgZ2V0UGF0aCgpIGNvbnN0IHsgcmV0dXJuIG1GaWxlUGF0aDsgfQorfTsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIF9NVFBfU1RPUkFHRV9ICmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwU3RvcmFnZUluZm8uY3BwIGIvbWVkaWEvbXRwL010cFN0b3JhZ2VJbmZvLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTY0YWMwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL010cFN0b3JhZ2VJbmZvLmNwcApAQCAtMCwwICsxLDcyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJNdHBTdG9yYWdlSW5mbyIKKworI2luY2x1ZGUgIk10cERlYnVnLmgiCisjaW5jbHVkZSAiTXRwRGF0YVBhY2tldC5oIgorI2luY2x1ZGUgIk10cFN0b3JhZ2VJbmZvLmgiCisjaW5jbHVkZSAiTXRwU3RyaW5nQnVmZmVyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworTXRwU3RvcmFnZUluZm86Ok10cFN0b3JhZ2VJbmZvKE10cFN0b3JhZ2VJRCBpZCkKKyAgICA6ICAgbVN0b3JhZ2VJRChpZCksCisgICAgICAgIG1TdG9yYWdlVHlwZSgwKSwKKyAgICAgICAgbUZpbGVTeXN0ZW1UeXBlKDApLAorICAgICAgICBtQWNjZXNzQ2FwYWJpbGl0eSgwKSwKKyAgICAgICAgbU1heENhcGFjaXR5KDApLAorICAgICAgICBtRnJlZVNwYWNlQnl0ZXMoMCksCisgICAgICAgIG1GcmVlU3BhY2VPYmplY3RzKDApLAorICAgICAgICBtU3RvcmFnZURlc2NyaXB0aW9uKE5VTEwpLAorICAgICAgICBtVm9sdW1lSWRlbnRpZmllcihOVUxMKQoreworfQorCitNdHBTdG9yYWdlSW5mbzo6fk10cFN0b3JhZ2VJbmZvKCkgeworICAgIGlmIChtU3RvcmFnZURlc2NyaXB0aW9uKQorICAgICAgICBmcmVlKG1TdG9yYWdlRGVzY3JpcHRpb24pOworICAgIGlmIChtVm9sdW1lSWRlbnRpZmllcikKKyAgICAgICAgZnJlZShtVm9sdW1lSWRlbnRpZmllcik7Cit9CisKK3ZvaWQgTXRwU3RvcmFnZUluZm86OnJlYWQoTXRwRGF0YVBhY2tldCYgcGFja2V0KSB7CisgICAgTXRwU3RyaW5nQnVmZmVyIHN0cmluZzsKKworICAgIC8vIHJlYWQgdGhlIGRldmljZSBpbmZvCisgICAgbVN0b3JhZ2VUeXBlID0gcGFja2V0LmdldFVJbnQxNigpOworICAgIG1GaWxlU3lzdGVtVHlwZSA9IHBhY2tldC5nZXRVSW50MTYoKTsKKyAgICBtQWNjZXNzQ2FwYWJpbGl0eSA9IHBhY2tldC5nZXRVSW50MTYoKTsKKyAgICBtTWF4Q2FwYWNpdHkgPSBwYWNrZXQuZ2V0VUludDY0KCk7CisgICAgbUZyZWVTcGFjZUJ5dGVzID0gcGFja2V0LmdldFVJbnQ2NCgpOworICAgIG1GcmVlU3BhY2VPYmplY3RzID0gcGFja2V0LmdldFVJbnQzMigpOworCisgICAgcGFja2V0LmdldFN0cmluZyhzdHJpbmcpOworICAgIG1TdG9yYWdlRGVzY3JpcHRpb24gPSBzdHJkdXAoKGNvbnN0IGNoYXIgKilzdHJpbmcpOworICAgIHBhY2tldC5nZXRTdHJpbmcoc3RyaW5nKTsKKyAgICBtVm9sdW1lSWRlbnRpZmllciA9IHN0cmR1cCgoY29uc3QgY2hhciAqKXN0cmluZyk7Cit9CisKK3ZvaWQgTXRwU3RvcmFnZUluZm86OnByaW50KCkgeworICAgIExPR0QoIlN0b3JhZ2UgSW5mbyAlMDhYOlxuXHRtU3RvcmFnZVR5cGU6ICVkXG5cdG1GaWxlU3lzdGVtVHlwZTogJWRcblx0bUFjY2Vzc0NhcGFiaWxpdHk6ICVkXG4iLAorICAgICAgICAgICAgbVN0b3JhZ2VJRCwgbVN0b3JhZ2VUeXBlLCBtRmlsZVN5c3RlbVR5cGUsIG1BY2Nlc3NDYXBhYmlsaXR5KTsKKyAgICBMT0dEKCJcdG1NYXhDYXBhY2l0eTogJWxsZFxuXHRtRnJlZVNwYWNlQnl0ZXM6ICVsbGRcblx0bUZyZWVTcGFjZU9iamVjdHM6ICVkXG4iLAorICAgICAgICAgICAgbU1heENhcGFjaXR5LCBtRnJlZVNwYWNlQnl0ZXMsIG1GcmVlU3BhY2VPYmplY3RzKTsKKyAgICBMT0dEKCJcdG1TdG9yYWdlRGVzY3JpcHRpb246ICVzXG5cdG1Wb2x1bWVJZGVudGlmaWVyOiAlc1xuIiwKKyAgICAgICAgICAgIG1TdG9yYWdlRGVzY3JpcHRpb24sIG1Wb2x1bWVJZGVudGlmaWVyKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBTdG9yYWdlSW5mby5oIGIvbWVkaWEvbXRwL010cFN0b3JhZ2VJbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmNiNjI2ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBTdG9yYWdlSW5mby5oCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9NVFBfU1RPUkFHRV9JTkZPX0gKKyNkZWZpbmUgX01UUF9TVE9SQUdFX0lORk9fSAorCisjaW5jbHVkZSAiTXRwVHlwZXMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBNdHBEYXRhUGFja2V0OworCitjbGFzcyBNdHBTdG9yYWdlSW5mbyB7CitwdWJsaWM6CisgICAgTXRwU3RvcmFnZUlEICAgICAgICBtU3RvcmFnZUlEOworICAgIHVpbnQxNl90ICAgICAgICAgICAgbVN0b3JhZ2VUeXBlOworICAgIHVpbnQxNl90ICAgICAgICAgICAgbUZpbGVTeXN0ZW1UeXBlOworICAgIHVpbnQxNl90ICAgICAgICAgICAgbUFjY2Vzc0NhcGFiaWxpdHk7CisgICAgdWludDY0X3QgICAgICAgICAgICBtTWF4Q2FwYWNpdHk7CisgICAgdWludDY0X3QgICAgICAgICAgICBtRnJlZVNwYWNlQnl0ZXM7CisgICAgdWludDMyX3QgICAgICAgICAgICBtRnJlZVNwYWNlT2JqZWN0czsKKyAgICBjaGFyKiAgICAgICAgICAgICAgIG1TdG9yYWdlRGVzY3JpcHRpb247CisgICAgY2hhciogICAgICAgICAgICAgICBtVm9sdW1lSWRlbnRpZmllcjsKKworcHVibGljOgorICAgICAgICAgICAgICAgICAgICAgICAgTXRwU3RvcmFnZUluZm8oTXRwU3RvcmFnZUlEIGlkKTsKKyAgICB2aXJ0dWFsICAgICAgICAgICAgIH5NdHBTdG9yYWdlSW5mbygpOworCisgICAgdm9pZCAgICAgICAgICAgICAgICByZWFkKE10cERhdGFQYWNrZXQmIHBhY2tldCk7CisKKyAgICB2b2lkICAgICAgICAgICAgICAgIHByaW50KCk7Cit9OworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gX01UUF9TVE9SQUdFX0lORk9fSApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cFN0cmluZ0J1ZmZlci5jcHAgYi9tZWRpYS9tdHAvTXRwU3RyaW5nQnVmZmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmY2NzMxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL010cFN0cmluZ0J1ZmZlci5jcHAKQEAgLTAsMCArMSwxNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIk10cFN0cmluZ0J1ZmZlciIKKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiTXRwRGF0YVBhY2tldC5oIgorI2luY2x1ZGUgIk10cFN0cmluZ0J1ZmZlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK010cFN0cmluZ0J1ZmZlcjo6TXRwU3RyaW5nQnVmZmVyKCkKKyAgICA6ICAgbUNoYXJDb3VudCgwKSwKKyAgICAgICAgbUJ5dGVDb3VudCgxKQoreworICAgIG1CdWZmZXJbMF0gPSAwOworfQorCitNdHBTdHJpbmdCdWZmZXI6Ok10cFN0cmluZ0J1ZmZlcihjb25zdCBjaGFyKiBzcmMpCisgICAgOiAgIG1DaGFyQ291bnQoMCksCisgICAgICAgIG1CeXRlQ291bnQoMSkKK3sKKyAgICBzZXQoc3JjKTsKK30KKworTXRwU3RyaW5nQnVmZmVyOjpNdHBTdHJpbmdCdWZmZXIoY29uc3QgTXRwU3RyaW5nQnVmZmVyJiBzcmMpCisgICAgOiAgIG1DaGFyQ291bnQoc3JjLm1DaGFyQ291bnQpLAorICAgICAgICBtQnl0ZUNvdW50KHNyYy5tQnl0ZUNvdW50KQoreworICAgIG1lbWNweShtQnVmZmVyLCBzcmMubUJ1ZmZlciwgbUJ5dGVDb3VudCk7Cit9CisKKworTXRwU3RyaW5nQnVmZmVyOjp+TXRwU3RyaW5nQnVmZmVyKCkgeworfQorCit2b2lkIE10cFN0cmluZ0J1ZmZlcjo6c2V0KGNvbnN0IGNoYXIqIHNyYykgeworICAgIGludCBsZW5ndGggPSBzdHJsZW4oc3JjKTsKKyAgICBpZiAobGVuZ3RoID49IHNpemVvZihtQnVmZmVyKSkKKyAgICAgICAgbGVuZ3RoID0gc2l6ZW9mKG1CdWZmZXIpIC0gMTsKKyAgICBtZW1jcHkobUJ1ZmZlciwgc3JjLCBsZW5ndGgpOworCisgICAgLy8gY291bnQgdGhlIGNoYXJhY3RlcnMKKyAgICBpbnQgY291bnQgPSAwOworICAgIGNoYXIgY2g7CisgICAgd2hpbGUgKChjaCA9ICpzcmMrKykgIT0gMCkgeworICAgICAgICBpZiAoKGNoICYgMHg4MCkgPT0gMCkgeworICAgICAgICAgICAgLy8gc2luZ2xlIGJ5dGUgY2hhcmFjdGVyCisgICAgICAgIH0gZWxzZSBpZiAoKGNoICYgMHhFMCkgPT0gMHhDMCkgeworICAgICAgICAgICAgLy8gdHdvIGJ5dGUgY2hhcmFjdGVyCisgICAgICAgICAgICBpZiAoISAqc3JjKyspIHsKKyAgICAgICAgICAgICAgICAvLyBsYXN0IGNoYXJhY3RlciB3YXMgdHJ1bmNhdGVkLCBzbyBpZ25vcmUgbGFzdCBieXRlCisgICAgICAgICAgICAgICAgbGVuZ3RoLS07CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoKGNoICYgMHhGMCkgPT0gMHhFMCkgeworICAgICAgICAgICAgLy8gMyBieXRlIGNoYXIKKyAgICAgICAgICAgIGlmICghICpzcmMrKykgeworICAgICAgICAgICAgICAgIC8vIGxhc3QgY2hhcmFjdGVyIHdhcyB0cnVuY2F0ZWQsIHNvIGlnbm9yZSBsYXN0IGJ5dGUKKyAgICAgICAgICAgICAgICBsZW5ndGgtLTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghICpzcmMrKykgeworICAgICAgICAgICAgICAgIC8vIGxhc3QgY2hhcmFjdGVyIHdhcyB0cnVuY2F0ZWQsIHNvIGlnbm9yZSBsYXN0IHR3byBieXRlcworICAgICAgICAgICAgICAgIGxlbmd0aCAtPSAyOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNvdW50Kys7CisgICAgfQorCisgICAgbUJ5dGVDb3VudCA9IGxlbmd0aCArIDE7CisgICAgbUJ1ZmZlcltsZW5ndGhdID0gMDsKKyAgICBtQ2hhckNvdW50ID0gY291bnQ7Cit9CisKK3ZvaWQgTXRwU3RyaW5nQnVmZmVyOjpyZWFkRnJvbVBhY2tldChNdHBEYXRhUGFja2V0KiBwYWNrZXQpIHsKKyAgICBpbnQgY291bnQgPSBwYWNrZXQtPmdldFVJbnQ4KCk7CisgICAgdWludDhfdCogZGVzdCA9IG1CdWZmZXI7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgIHVpbnQxNl90IGNoID0gcGFja2V0LT5nZXRVSW50MTYoKTsKKyAgICAgICAgaWYgKGNoID49IDB4MDgwMCkgeworICAgICAgICAgICAgKmRlc3QrKyA9ICh1aW50OF90KSgweEUwIHwgKGNoID4+IDEyKSk7CisgICAgICAgICAgICAqZGVzdCsrID0gKHVpbnQ4X3QpKDB4ODAgfCAoKGNoID4+IDYpICYgMHgzRikpOworICAgICAgICAgICAgKmRlc3QrKyA9ICh1aW50OF90KSgweDgwIHwgKGNoICYgMHgzRikpOworICAgICAgICB9IGVsc2UgaWYgKGNoID49IDB4ODApIHsKKyAgICAgICAgICAgICpkZXN0KysgPSAodWludDhfdCkoMHhDMCB8IChjaCA+PiA2KSk7CisgICAgICAgICAgICAqZGVzdCsrID0gKHVpbnQ4X3QpKDB4ODAgfCAoY2ggJiAweDNGKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAqZGVzdCsrID0gY2g7CisgICAgICAgIH0KKyAgICB9CisgICAgKmRlc3QrKyA9IDA7CisgICAgbUNoYXJDb3VudCA9IGNvdW50OworICAgIG1CeXRlQ291bnQgPSBkZXN0IC0gbUJ1ZmZlcjsKK30KKwordm9pZCBNdHBTdHJpbmdCdWZmZXI6OndyaXRlVG9QYWNrZXQoTXRwRGF0YVBhY2tldCogcGFja2V0KSBjb25zdCB7CisgICAgaW50IGNvdW50ID0gbUNoYXJDb3VudDsKKyAgICBjb25zdCB1aW50OF90KiBzcmMgPSBtQnVmZmVyOworICAgIHBhY2tldC0+cHV0VUludDgoY291bnQgPiAwID8gY291bnQgKyAxIDogMCk7CisKKyAgICAvLyBleHBhbmQgdXRmOCB0byAxNiBiaXQgY2hhcnMKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgdWludDE2X3QgY2g7CisgICAgICAgIHVpbnQxNl90IGNoMSA9ICpzcmMrKzsKKyAgICAgICAgaWYgKChjaDEgJiAweDgwKSA9PSAwKSB7CisgICAgICAgICAgICAvLyBzaW5nbGUgYnl0ZSBjaGFyYWN0ZXIKKyAgICAgICAgICAgIGNoID0gY2gxOworICAgICAgICB9IGVsc2UgaWYgKChjaDEgJiAweEUwKSA9PSAweEMwKSB7CisgICAgICAgICAgICAvLyB0d28gYnl0ZSBjaGFyYWN0ZXIKKyAgICAgICAgICAgIHVpbnQxNl90IGNoMiA9ICpzcmMrKzsKKyAgICAgICAgICAgIGNoID0gKChjaDEgJiAweDFGKSA8PCA2KSB8IChjaDIgJiAweDNGKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIHRocmVlIGJ5dGUgY2hhcmFjdGVyCisgICAgICAgICAgICB1aW50MTZfdCBjaDIgPSAqc3JjKys7CisgICAgICAgICAgICB1aW50MTZfdCBjaDMgPSAqc3JjKys7CisgICAgICAgICAgICBjaCA9ICgoY2gxICYgMHgwRikgPDwgMTIpIHwgKChjaDIgJiAweDNGKSA8PCA2KSB8IChjaDMgJiAweDNGKTsKKyAgICAgICAgfQorICAgICAgICBwYWNrZXQtPnB1dFVJbnQxNihjaCk7CisgICAgfQorICAgIC8vIG9ubHkgdGVybWluYXRlIHdpdGggemVybyBpZiBzdHJpbmcgaXMgbm90IGVtcHR5CisgICAgaWYgKGNvdW50ID4gMCkKKyAgICAgICAgcGFja2V0LT5wdXRVSW50MTYoMCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwU3RyaW5nQnVmZmVyLmggYi9tZWRpYS9tdHAvTXRwU3RyaW5nQnVmZmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY0MWMzZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBTdHJpbmdCdWZmZXIuaApAQCAtMCwwICsxLDU0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfTVRQX1NUUklOR19CVUZGRVJfSAorI2RlZmluZSBfTVRQX1NUUklOR19CVUZGRVJfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgTXRwRGF0YVBhY2tldDsKKworLy8gUmVwcmVzZW50cyBhIHV0Zjggc3RyaW5nLCB3aXRoIGEgbWF4aW11bSBvZiAyNTUgY2hhcmFjdGVycworY2xhc3MgTXRwU3RyaW5nQnVmZmVyIHsKKworcHJpdmF0ZToKKyAgICAvLyBtYXhpbXVtIDMgYnl0ZXMvY2hhcmFjdGVyLCB3aXRoIDEgZXh0cmEgZm9yIHplcm8gdGVybWluYXRpb24KKyAgICB1aW50OF90ICAgICAgICAgbUJ1ZmZlclsyNTUgKiAzICsgMV07CisgICAgaW50ICAgICAgICAgICAgIG1DaGFyQ291bnQ7CisgICAgaW50ICAgICAgICAgICAgIG1CeXRlQ291bnQ7CisKK3B1YmxpYzoKKyAgICAgICAgICAgICAgICAgICAgTXRwU3RyaW5nQnVmZmVyKCk7CisgICAgICAgICAgICAgICAgICAgIE10cFN0cmluZ0J1ZmZlcihjb25zdCBjaGFyKiBzcmMpOworICAgICAgICAgICAgICAgICAgICBNdHBTdHJpbmdCdWZmZXIoY29uc3QgTXRwU3RyaW5nQnVmZmVyJiBzcmMpOworICAgIHZpcnR1YWwgICAgICAgICB+TXRwU3RyaW5nQnVmZmVyKCk7CisKKyAgICB2b2lkICAgICAgICAgICAgc2V0KGNvbnN0IGNoYXIqIHNyYyk7CisKKyAgICB2b2lkICAgICAgICAgICAgcmVhZEZyb21QYWNrZXQoTXRwRGF0YVBhY2tldCogcGFja2V0KTsKKyAgICB2b2lkICAgICAgICAgICAgd3JpdGVUb1BhY2tldChNdHBEYXRhUGFja2V0KiBwYWNrZXQpIGNvbnN0OworCisgICAgaW5saW5lIGludCAgICAgIGdldENoYXJDb3VudCgpIGNvbnN0IHsgcmV0dXJuIG1DaGFyQ291bnQ7IH0KKyAgICBpbmxpbmUgaW50ICAgICAgZ2V0Qnl0ZUNvdW50KCkgY29uc3QgeyByZXR1cm4gbUJ5dGVDb3VudDsgfQorCisJaW5saW5lIG9wZXJhdG9yIGNvbnN0IGNoYXIqKCkgY29uc3QgeyByZXR1cm4gKGNvbnN0IGNoYXIgKiltQnVmZmVyOyB9Cit9OworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gX01UUF9TVFJJTkdfQlVGRkVSX0gKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBUeXBlcy5oIGIvbWVkaWEvbXRwL010cFR5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2UzYzAwOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBUeXBlcy5oCkBAIC0wLDAgKzEsOTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9NVFBfVFlQRVNfSAorI2RlZmluZSBfTVRQX1RZUEVTX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgInV0aWxzL1N0cmluZzguaCIKKyNpbmNsdWRlICJ1dGlscy9WZWN0b3IuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCit0eXBlZGVmIGludDMyX3QgaW50MTI4X3RbNF07Cit0eXBlZGVmIHVpbnQzMl90IHVpbnQxMjhfdFs0XTsKKwordHlwZWRlZiB1aW50MTZfdCBNdHBPcGVyYXRpb25Db2RlOwordHlwZWRlZiB1aW50MTZfdCBNdHBSZXNwb25zZUNvZGU7Cit0eXBlZGVmIHVpbnQxNl90IE10cEV2ZW50Q29kZTsKK3R5cGVkZWYgdWludDMyX3QgTXRwU2Vzc2lvbklEOwordHlwZWRlZiB1aW50MzJfdCBNdHBTdG9yYWdlSUQ7Cit0eXBlZGVmIHVpbnQzMl90IE10cFRyYW5zYWN0aW9uSUQ7Cit0eXBlZGVmIHVpbnQxNl90IE10cFByb3BlcnR5Q29kZTsKK3R5cGVkZWYgdWludDE2X3QgTXRwRGF0YVR5cGU7Cit0eXBlZGVmIHVpbnQxNl90IE10cE9iamVjdEZvcm1hdDsKK3R5cGVkZWYgTXRwUHJvcGVydHlDb2RlIE10cERldmljZVByb3BlcnR5OwordHlwZWRlZiBNdHBQcm9wZXJ0eUNvZGUgTXRwT2JqZWN0UHJvcGVydHk7CisKKy8vIG9iamVjdCBoYW5kbGVzIGFyZSB1bmlxdWUgYWNyb3NzIGFsbCBzdG9yYWdlIGJ1dCBvbmx5IHdpdGhpbiBhIHNpbmdsZSBzZXNzaW9uLgorLy8gb2JqZWN0IGhhbmRsZXMgY2Fubm90IGJlIHJldXNlZCBhZnRlciBhbiBvYmplY3QgaXMgZGVsZXRlZC4KKy8vIHZhbHVlcyAweDAwMDAwMDAwIGFuZCAweEZGRkZGRkZGIGFyZSByZXNlcnZlZCBmb3Igc3BlY2lhbCBwdXJwb3Nlcy4KK3R5cGVkZWYgdWludDMyX3QgTXRwT2JqZWN0SGFuZGxlOworCit1bmlvbiBNdHBQcm9wZXJ0eVZhbHVlIHsKKyAgICBpbnQ4X3QgICAgICAgICAgaTg7CisgICAgdWludDhfdCAgICAgICAgIHU4OworICAgIGludDE2X3QgICAgICAgICBpMTY7CisgICAgdWludDE2X3QgICAgICAgIHUxNjsKKyAgICBpbnQzMl90ICAgICAgICAgaTMyOworICAgIHVpbnQzMl90ICAgICAgICB1MzI7CisgICAgaW50NjRfdCAgICAgICAgIGk2NDsKKyAgICB1aW50NjRfdCAgICAgICAgdTY0OworICAgIGludDEyOF90ICAgICAgICBpMTI4OworICAgIHVpbnQxMjhfdCAgICAgICB1MTI4OworICAgIGNoYXIqICAgICAgICAgICBzdHI7Cit9OworCisvLyBTcGVjaWFsIHZhbHVlcworI2RlZmluZSBNVFBfUEFSRU5UX1JPT1QgICAgICAgICAweEZGRkZGRkZGICAgICAgIC8vIHBhcmVudCBpcyByb290IG9mIHRoZSBzdG9yYWdlCisjZGVmaW5lIGtJbnZhbGlkT2JqZWN0SGFuZGxlICAgIDB4RkZGRkZGRkYKKworY2xhc3MgTXRwU3RvcmFnZTsKK2NsYXNzIE10cERldmljZTsKK2NsYXNzIE10cFByb3BlcnR5OworCit0eXBlZGVmIFZlY3RvcjxNdHBTdG9yYWdlICo+IE10cFN0b3JhZ2VMaXN0OwordHlwZWRlZiBWZWN0b3I8TXRwRGV2aWNlKj4gTXRwRGV2aWNlTGlzdDsKK3R5cGVkZWYgVmVjdG9yPE10cFByb3BlcnR5Kj4gTXRwUHJvcGVydHlMaXN0OworCit0eXBlZGVmIFZlY3Rvcjx1aW50OF90PiBVSW50OExpc3Q7Cit0eXBlZGVmIFZlY3Rvcjx1aW50MTZfdD4gVUludDE2TGlzdDsKK3R5cGVkZWYgVmVjdG9yPHVpbnQzMl90PiBVSW50MzJMaXN0OwordHlwZWRlZiBWZWN0b3I8dWludDY0X3Q+IFVJbnQ2NExpc3Q7Cit0eXBlZGVmIFZlY3RvcjxpbnQ4X3Q+IEludDhMaXN0OwordHlwZWRlZiBWZWN0b3I8aW50MTZfdD4gSW50MTZMaXN0OwordHlwZWRlZiBWZWN0b3I8aW50MzJfdD4gSW50MzJMaXN0OwordHlwZWRlZiBWZWN0b3I8aW50NjRfdD4gSW50NjRMaXN0OworCit0eXBlZGVmIFVJbnQxNkxpc3QgTXRwT2JqZWN0UHJvcGVydHlMaXN0OwordHlwZWRlZiBVSW50MTZMaXN0IE10cERldmljZVByb3BlcnR5TGlzdDsKK3R5cGVkZWYgVUludDE2TGlzdCBNdHBPYmplY3RGb3JtYXRMaXN0OwordHlwZWRlZiBVSW50MzJMaXN0IE10cE9iamVjdEhhbmRsZUxpc3Q7Cit0eXBlZGVmIFVJbnQxNkxpc3QgTXRwT2JqZWN0UHJvcGVydHlMaXN0OwordHlwZWRlZiBVSW50MzJMaXN0IE10cFN0b3JhZ2VJRExpc3Q7CisKK3R5cGVkZWYgU3RyaW5nOCAgICBNdHBTdHJpbmc7CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBfTVRQX1RZUEVTX0gKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBVdGlscy5jcHAgYi9tZWRpYS9tdHAvTXRwVXRpbHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiMDFlZjUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvTXRwVXRpbHMuY3BwCkBAIC0wLDAgKzEsNzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIk10cFV0aWxzIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisKKyNpbmNsdWRlIDxjdXRpbHMvdHp0aW1lLmg+CisjaW5jbHVkZSAiTXRwVXRpbHMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKgorRGF0ZVRpbWUgc3RyaW5ncyBmb2xsb3cgYSBjb21wYXRpYmxlIHN1YnNldCBvZiB0aGUgZGVmaW5pdGlvbiBmb3VuZCBpbiBJU08gODYwMSwgYW5kCit0YWtlIHRoZSBmb3JtIG9mIGEgVW5pY29kZSBzdHJpbmcgZm9ybWF0dGVkIGFzOiAiWVlZWU1NRERUaGhtbXNzLnMiLiBJbiB0aGlzCityZXByZXNlbnRhdGlvbiwgWVlZWSBzaGFsbCBiZSByZXBsYWNlZCBieSB0aGUgeWVhciwgTU0gcmVwbGFjZWQgYnkgdGhlIG1vbnRoICgwMS0xMiksCitERCByZXBsYWNlZCBieSB0aGUgZGF5ICgwMS0zMSksIFQgaXMgYSBjb25zdGFudCBjaGFyYWN0ZXIgJ1QnIGRlbGltaXRpbmcgdGltZSBmcm9tIGRhdGUsCitoaCBpcyByZXBsYWNlZCBieSB0aGUgaG91ciAoMDAtMjMpLCBtbSBpcyByZXBsYWNlZCBieSB0aGUgbWludXRlICgwMC01OSksIGFuZCBzcyBieSB0aGUKK3NlY29uZCAoMDAtNTkpLiBUaGUgIi5zIiBpcyBvcHRpb25hbCwgYW5kIHJlcHJlc2VudHMgdGVudGhzIG9mIGEgc2Vjb25kLgorKi8KKworYm9vbCBwYXJzZURhdGVUaW1lKGNvbnN0IGNoYXIqIGRhdGVUaW1lLCB0aW1lX3QmIG91dFNlY29uZHMpIHsKKyAgICBpbnQgeWVhciwgbW9udGgsIGRheSwgaG91ciwgbWludXRlLCBzZWNvbmQ7CisgICAgc3RydWN0IHRtIHRtOworCisgICAgaWYgKHNzY2FuZihkYXRlVGltZSwgIiUwNGQlMDJkJTAyZFQlMDJkJTAyZCUwMmQiLAorICAgICAgICAgICAgJnllYXIsICZtb250aCwgJmRheSwgJmhvdXIsICZtaW51dGUsICZzZWNvbmQpICE9IDYpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBjb25zdCBjaGFyKiB0YWlsID0gZGF0ZVRpbWUgKyAxNTsKKyAgICAvLyBza2lwIG9wdGlvbmFsIHRlbnRoIG9mIHNlY29uZAorICAgIGlmICh0YWlsWzBdID09ICcuJyAmJiB0YWlsWzFdKQorICAgICAgICB0YWlsICs9IDI7CisgICAgLy9GSVhNRSAtIHN1cHBvcnQgKy8taGhtbQorICAgIGJvb2wgdXNlVVRDID0gKHRhaWxbMF0gPT0gJ1onKTsKKworICAgIC8vIGhhY2sgdG8gY29tcHV0ZSB0aW1lem9uZQorICAgIHRpbWVfdCBkdW1teTsKKyAgICBsb2NhbHRpbWVfcigmZHVtbXksICZ0bSk7CisKKyAgICB0bS50bV9zZWMgPSBzZWNvbmQ7CisgICAgdG0udG1fbWluID0gbWludXRlOworICAgIHRtLnRtX2hvdXIgPSBob3VyOworICAgIHRtLnRtX21kYXkgPSBkYXk7CisgICAgdG0udG1fbW9uID0gbW9udGg7CisgICAgdG0udG1feWVhciA9IHllYXIgLSAxOTAwOworICAgIHRtLnRtX3dkYXkgPSAwOworICAgIHRtLnRtX2lzZHN0ID0gLTE7CisgICAgaWYgKHVzZVVUQykKKyAgICAgICAgb3V0U2Vjb25kcyA9IG1rdGltZSgmdG0pOworICAgIGVsc2UKKyAgICAgICAgb3V0U2Vjb25kcyA9IG1rdGltZV90eigmdG0sIHRtLnRtX3pvbmUpOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgZm9ybWF0RGF0ZVRpbWUodGltZV90IHNlY29uZHMsIGNoYXIqIGJ1ZmZlciwgaW50IGJ1ZmZlckxlbmd0aCkgeworICAgIHN0cnVjdCB0bSB0bTsKKworICAgIGxvY2FsdGltZV9yKCZzZWNvbmRzLCAmdG0pOworICAgIHNucHJpbnRmKGJ1ZmZlciwgYnVmZmVyTGVuZ3RoLCAiJTA0ZCUwMmQlMDJkVCUwMmQlMDJkJTAyZCIsCisgICAgICAgIHRtLnRtX3llYXIgKyAxOTAwLCB0bS50bV9tb24sIHRtLnRtX21kYXksIHRtLnRtX2hvdXIsIHRtLnRtX21pbiwgdG0udG1fc2VjKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBVdGlscy5oIGIvbWVkaWEvbXRwL010cFV0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjFmOTA1NQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBVdGlscy5oCkBAIC0wLDAgKzEsMjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9NVFBfVVRJTFNfSAorI2RlZmluZSBfTVRQX1VUSUxTX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2Jvb2wgcGFyc2VEYXRlVGltZShjb25zdCBjaGFyKiBkYXRlVGltZSwgdGltZV90JiBvdXRTZWNvbmRzKTsKK3ZvaWQgZm9ybWF0RGF0ZVRpbWUodGltZV90IHNlY29uZHMsIGNoYXIqIGJ1ZmZlciwgaW50IGJ1ZmZlckxlbmd0aCk7CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBfTVRQX1VUSUxTX0gKZGlmZiAtLWdpdCBhL21lZGlhL210cC9tdHAuaCBiL21lZGlhL210cC9tdHAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2FmYTY2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL210cC5oCkBAIC0wLDAgKzEsNDc1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfTVRQX0gKKyNkZWZpbmUgX01UUF9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2RlZmluZSBNVFBfU1RBTkRBUkRfVkVSU0lPTiAgICAgICAgICAgIDEwMAorCisvLyBDb250YWluZXIgVHlwZXMKKyNkZWZpbmUgTVRQX0NPTlRBSU5FUl9UWVBFX1VOREVGSU5FRCAgICAwCisjZGVmaW5lIE1UUF9DT05UQUlORVJfVFlQRV9DT01NQU5EICAgICAgMQorI2RlZmluZSBNVFBfQ09OVEFJTkVSX1RZUEVfREFUQSAgICAgICAgIDIKKyNkZWZpbmUgTVRQX0NPTlRBSU5FUl9UWVBFX1JFU1BPTlNFICAgICAzCisjZGVmaW5lIE1UUF9DT05UQUlORVJfVFlQRV9FVkVOVCAgICAgICAgNAorCisvLyBDb250YWluZXIgT2Zmc2V0cworI2RlZmluZSBNVFBfQ09OVEFJTkVSX0xFTkdUSF9PRkZTRVQgICAgICAgICAgICAgMAorI2RlZmluZSBNVFBfQ09OVEFJTkVSX1RZUEVfT0ZGU0VUICAgICAgICAgICAgICAgNAorI2RlZmluZSBNVFBfQ09OVEFJTkVSX0NPREVfT0ZGU0VUICAgICAgICAgICAgICAgNgorI2RlZmluZSBNVFBfQ09OVEFJTkVSX1RSQU5TQUNUSU9OX0lEX09GRlNFVCAgICAgOAorI2RlZmluZSBNVFBfQ09OVEFJTkVSX1BBUkFNRVRFUl9PRkZTRVQgICAgICAgICAgMTIKKyNkZWZpbmUgTVRQX0NPTlRBSU5FUl9IRUFERVJfU0laRSAgICAgICAgICAgICAgIDEyCisKKy8vIE1UUCBUeXBlcworI2RlZmluZSBNVFBfVFlQRV9VTkRFRklORUQgICAgICAweDAwMDAgICAgICAgICAgLy8gVW5kZWZpbmVkCisjZGVmaW5lIE1UUF9UWVBFX0lOVDggICAgICAgICAgIDB4MDAwMSAgICAgICAgICAvLyBTaWduZWQgOC1iaXQgaW50ZWdlcgorI2RlZmluZSBNVFBfVFlQRV9VSU5UOCAgICAgICAgICAweDAwMDIgICAgICAgICAgLy8gVW5zaWduZWQgOC1iaXQgaW50ZWdlcgorI2RlZmluZSBNVFBfVFlQRV9JTlQxNiAgICAgICAgICAweDAwMDMgICAgICAgICAgLy8gU2lnbmVkIDE2LWJpdCBpbnRlZ2VyCisjZGVmaW5lIE1UUF9UWVBFX1VJTlQxNiAgICAgICAgIDB4MDAwNCAgICAgICAgICAvLyBVbnNpZ25lZCAxNi1iaXQgaW50ZWdlcgorI2RlZmluZSBNVFBfVFlQRV9JTlQzMiAgICAgICAgICAweDAwMDUgICAgICAgICAgLy8gU2lnbmVkIDMyLWJpdCBpbnRlZ2VyCisjZGVmaW5lIE1UUF9UWVBFX1VJTlQzMiAgICAgICAgIDB4MDAwNiAgICAgICAgICAvLyBVbnNpZ25lZCAzMi1iaXQgaW50ZWdlcgorI2RlZmluZSBNVFBfVFlQRV9JTlQ2NCAgICAgICAgICAweDAwMDcgICAgICAgICAgLy8gU2lnbmVkIDY0LWJpdCBpbnRlZ2VyCisjZGVmaW5lIE1UUF9UWVBFX1VJTlQ2NCAgICAgICAgIDB4MDAwOCAgICAgICAgICAvLyBVbnNpZ25lZCA2NC1iaXQgaW50ZWdlcgorI2RlZmluZSBNVFBfVFlQRV9JTlQxMjggICAgICAgICAweDAwMDkgICAgICAgICAgLy8gU2lnbmVkIDEyOC1iaXQgaW50ZWdlcgorI2RlZmluZSBNVFBfVFlQRV9VSU5UMTI4ICAgICAgICAweDAwMEEgICAgICAgICAgLy8gVW5zaWduZWQgMTI4LWJpdCBpbnRlZ2VyCisjZGVmaW5lIE1UUF9UWVBFX0FJTlQ4ICAgICAgICAgIDB4NDAwMSAgICAgICAgICAvLyBBcnJheSBvZiBzaWduZWQgOC1iaXQgaW50ZWdlcnMKKyNkZWZpbmUgTVRQX1RZUEVfQVVJTlQ4ICAgICAgICAgMHg0MDAyICAgICAgICAgIC8vIEFycmF5IG9mIHVuc2lnbmVkIDgtYml0IGludGVnZXJzCisjZGVmaW5lIE1UUF9UWVBFX0FJTlQxNiAgICAgICAgIDB4NDAwMyAgICAgICAgICAvLyBBcnJheSBvZiBzaWduZWQgMTYtYml0IGludGVnZXJzCisjZGVmaW5lIE1UUF9UWVBFX0FVSU5UMTYgICAgICAgIDB4NDAwNCAgICAgICAgICAvLyBBcnJheSBvZiB1bnNpZ25lZCAxNi1iaXQgaW50ZWdlcnMKKyNkZWZpbmUgTVRQX1RZUEVfQUlOVDMyICAgICAgICAgMHg0MDA1ICAgICAgICAgIC8vIEFycmF5IG9mIHNpZ25lZCAzMi1iaXQgaW50ZWdlcnMKKyNkZWZpbmUgTVRQX1RZUEVfQVVJTlQzMiAgICAgICAgMHg0MDA2ICAgICAgICAgIC8vIEFycmF5IG9mIHVuc2lnbmVkIDMyLWJpdCBpbnRlZ2VycworI2RlZmluZSBNVFBfVFlQRV9BSU5UNjQgICAgICAgICAweDQwMDcgICAgICAgICAgLy8gQXJyYXkgb2Ygc2lnbmVkIDY0LWJpdCBpbnRlZ2VycworI2RlZmluZSBNVFBfVFlQRV9BVUlOVDY0ICAgICAgICAweDQwMDggICAgICAgICAgLy8gQXJyYXkgb2YgdW5zaWduZWQgNjQtYml0IGludGVnZXJzCisjZGVmaW5lIE1UUF9UWVBFX0FJTlQxMjggICAgICAgIDB4NDAwOSAgICAgICAgICAvLyBBcnJheSBvZiBzaWduZWQgMTI4LWJpdCBpbnRlZ2VycworI2RlZmluZSBNVFBfVFlQRV9BVUlOVDEyOCAgICAgICAweDQwMEEgICAgICAgICAgLy8gQXJyYXkgb2YgdW5zaWduZWQgMTI4LWJpdCBpbnRlZ2VycworI2RlZmluZSBNVFBfVFlQRV9TVFIgICAgICAgICAgICAweEZGRkYgICAgICAgICAgLy8gVmFyaWFibGUtbGVuZ3RoIFVuaWNvZGUgc3RyaW5nCisKKy8vIE1UUCBGb3JtYXQgQ29kZXMKKyNkZWZpbmUgTVRQX0ZPUk1BVF9VTkRFRklORUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMDAwICAgLy8gVW5kZWZpbmVkIG9iamVjdAorI2RlZmluZSBNVFBfRk9STUFUX0FTU09DSUFUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAweDMwMDEgICAvLyBBc3NvY2lhdGlvbiAoZm9yIGV4YW1wbGUsIGEgZm9sZGVyKQorI2RlZmluZSBNVFBfRk9STUFUX1NDUklQVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMwMDIgICAvLyBEZXZpY2UgbW9kZWwtc3BlY2lmaWMgc2NyaXB0CisjZGVmaW5lIE1UUF9GT1JNQVRfRVhFQ1VUQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzAwMyAgIC8vIERldmljZSBtb2RlbC1zcGVjaWZpYyBiaW5hcnkgZXhlY3V0YWJsZQorI2RlZmluZSBNVFBfRk9STUFUX1RFWFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMwMDQgICAvLyBUZXh0IGZpbGUKKyNkZWZpbmUgTVRQX0ZPUk1BVF9IVE1MICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMDA1ICAgLy8gSHlwZXJ0ZXh0IE1hcmt1cCBMYW5ndWFnZSBmaWxlICh0ZXh0KQorI2RlZmluZSBNVFBfRk9STUFUX0RQT0YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMwMDYgICAvLyBEaWdpdGFsIFByaW50IE9yZGVyIEZvcm1hdCBmaWxlICh0ZXh0KQorI2RlZmluZSBNVFBfRk9STUFUX0FJRkYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMwMDcgICAvLyBBdWRpbyBjbGlwCisjZGVmaW5lIE1UUF9GT1JNQVRfV0FWICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzAwOCAgIC8vIEF1ZGlvIGNsaXAKKyNkZWZpbmUgTVRQX0ZPUk1BVF9NUDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMDA5ICAgLy8gQXVkaW8gY2xpcAorI2RlZmluZSBNVFBfRk9STUFUX0FWSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMwMEEgICAvLyBWaWRlbyBjbGlwCisjZGVmaW5lIE1UUF9GT1JNQVRfTVBFRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzAwQiAgIC8vIFZpZGVvIGNsaXAKKyNkZWZpbmUgTVRQX0ZPUk1BVF9BU0YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMDBDICAgLy8gTWljcm9zb2Z0IEFkdmFuY2VkIFN0cmVhbWluZyBGb3JtYXQgKHZpZGVvKQorI2RlZmluZSBNVFBfRk9STUFUX0RFRklORUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDM4MDAgICAvLyBVbmtub3duIGltYWdlIG9iamVjdAorI2RlZmluZSBNVFBfRk9STUFUX0VYSUZfSlBFRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDM4MDEgICAvLyBFeGNoYW5nZWFibGUgRmlsZSBGb3JtYXQsIEpFSURBIHN0YW5kYXJkCisjZGVmaW5lIE1UUF9GT1JNQVRfVElGRl9FUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzgwMiAgIC8vIFRhZyBJbWFnZSBGaWxlIEZvcm1hdCBmb3IgRWxlY3Ryb25pYyBQaG90b2dyYXBoeQorI2RlZmluZSBNVFBfRk9STUFUX0ZMQVNIUElYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDM4MDMgICAvLyBTdHJ1Y3R1cmVkIFN0b3JhZ2UgSW1hZ2UgRm9ybWF0CisjZGVmaW5lIE1UUF9GT1JNQVRfQk1QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzgwNCAgIC8vIE1pY3Jvc29mdCBXaW5kb3dzIEJpdG1hcCBmaWxlCisjZGVmaW5lIE1UUF9GT1JNQVRfQ0lGRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzgwNSAgIC8vIENhbm9uIENhbWVyYSBJbWFnZSBGaWxlIEZvcm1hdAorI2RlZmluZSBNVFBfRk9STUFUX0dJRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDM4MDcgICAvLyBHcmFwaGljcyBJbnRlcmNoYW5nZSBGb3JtYXQKKyNkZWZpbmUgTVRQX0ZPUk1BVF9KRklGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzODA4ICAgLy8gSlBFRyBGaWxlIEludGVyY2hhbmdlIEZvcm1hdAorI2RlZmluZSBNVFBfRk9STUFUX0NEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDM4MDkgICAvLyBQaG90b0NEIEltYWdlIFBhYworI2RlZmluZSBNVFBfRk9STUFUX1BJQ1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDM4MEEgICAvLyBRdWlja2RyYXcgSW1hZ2UgRm9ybWF0CisjZGVmaW5lIE1UUF9GT1JNQVRfUE5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzgwQiAgIC8vIFBvcnRhYmxlIE5ldHdvcmsgR3JhcGhpY3MKKyNkZWZpbmUgTVRQX0ZPUk1BVF9USUZGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzODBEICAgLy8gVGFnIEltYWdlIEZpbGUgRm9ybWF0CisjZGVmaW5lIE1UUF9GT1JNQVRfVElGRl9JVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzgwRSAgIC8vIFRhZyBJbWFnZSBGaWxlIEZvcm1hdCBmb3IgSW5mb3JtYXRpb24gVGVjaG5vbG9neSAoZ3JhcGhpYyBhcnRzKQorI2RlZmluZSBNVFBfRk9STUFUX0pQMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDM4MEYgICAvLyBKUEVHMjAwMCBCYXNlbGluZSBGaWxlIEZvcm1hdAorI2RlZmluZSBNVFBfRk9STUFUX0pQWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDM4MTAgICAvLyBKUEVHMjAwMCBFeHRlbmRlZCBGaWxlIEZvcm1hdAorI2RlZmluZSBNVFBfRk9STUFUX1VOREVGSU5FRF9GSVJNV0FSRSAgICAgICAgICAgICAgICAgICAweEI4MDIKKyNkZWZpbmUgTVRQX0ZPUk1BVF9XSU5ET1dTX0lNQUdFX0ZPUk1BVCAgICAgICAgICAgICAgICAgMHhCODgxCisjZGVmaW5lIE1UUF9GT1JNQVRfVU5ERUZJTkVEX0FVRElPICAgICAgICAgICAgICAgICAgICAgIDB4QjkwMAorI2RlZmluZSBNVFBfRk9STUFUX1dNQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEI5MDEKKyNkZWZpbmUgTVRQX0ZPUk1BVF9PR0cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhCOTAyCisjZGVmaW5lIE1UUF9GT1JNQVRfQUFDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4QjkwMworI2RlZmluZSBNVFBfRk9STUFUX0FVRElCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEI5MDQKKyNkZWZpbmUgTVRQX0ZPUk1BVF9GTEFDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhCOTA2CisjZGVmaW5lIE1UUF9GT1JNQVRfVU5ERUZJTkVEX1ZJREVPICAgICAgICAgICAgICAgICAgICAgIDB4Qjk4MAorI2RlZmluZSBNVFBfRk9STUFUX1dNViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEI5ODEKKyNkZWZpbmUgTVRQX0ZPUk1BVF9NUDRfQ09OVEFJTkVSICAgICAgICAgICAgICAgICAgICAgICAgMHhCOTgyICAvLyBJU08gMTQ0OTYtMQorI2RlZmluZSBNVFBfRk9STUFUX01QMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEI5ODMKKyNkZWZpbmUgTVRQX0ZPUk1BVF8zR1BfQ09OVEFJTkVSICAgICAgICAgICAgICAgICAgICAgICAgMHhCOTg0ICAvLyAzR1BQIGZpbGUgZm9ybWF0LiBEZXRhaWxzOiBodHRwOi8vd3d3LjNncHAub3JnL2Z0cC9TcGVjcy9odG1sLWluZm8vMjYyNDQuaHRtIChwYWdlIHRpdGxlIC0gXHUyMDFjVHJhbnNwYXJlbnQgZW5kLXRvLWVuZCBwYWNrZXQgc3dpdGNoZWQgc3RyZWFtaW5nIHNlcnZpY2UsIDNHUFAgZmlsZSBmb3JtYXRcdTIwMWQpLgorI2RlZmluZSBNVFBfRk9STUFUX1VOREVGSU5FRF9DT0xMRUNUSU9OICAgICAgICAgICAgICAgICAweEJBMDAKKyNkZWZpbmUgTVRQX0ZPUk1BVF9BQlNUUkFDVF9NVUxUSU1FRElBX0FMQlVNICAgICAgICAgICAgMHhCQTAxCisjZGVmaW5lIE1UUF9GT1JNQVRfQUJTVFJBQ1RfSU1BR0VfQUxCVU0gICAgICAgICAgICAgICAgIDB4QkEwMgorI2RlZmluZSBNVFBfRk9STUFUX0FCU1RSQUNUX0FVRElPX0FMQlVNICAgICAgICAgICAgICAgICAweEJBMDMKKyNkZWZpbmUgTVRQX0ZPUk1BVF9BQlNUUkFDVF9WSURFT19BTEJVTSAgICAgICAgICAgICAgICAgMHhCQTA0CisjZGVmaW5lIE1UUF9GT1JNQVRfQUJTVFJBQ1RfQVZfUExBWUxJU1QgICAgICAgICAgICAgICAgIDB4QkEwNQorI2RlZmluZSBNVFBfRk9STUFUX0FCU1RSQUNUX0NPTlRBQ1RfR1JPVVAgICAgICAgICAgICAgICAweEJBMDYKKyNkZWZpbmUgTVRQX0ZPUk1BVF9BQlNUUkFDVF9NRVNTQUdFX0ZPTERFUiAgICAgICAgICAgICAgMHhCQTA3CisjZGVmaW5lIE1UUF9GT1JNQVRfQUJTVFJBQ1RfQ0hBUFRFUkVEX1BST0RVQ1RJT04gICAgICAgIDB4QkEwOAorI2RlZmluZSBNVFBfRk9STUFUX0FCU1RSQUNUX0FVRElPX1BMQVlMSVNUICAgICAgICAgICAgICAweEJBMDkKKyNkZWZpbmUgTVRQX0ZPUk1BVF9BQlNUUkFDVF9WSURFT19QTEFZTElTVCAgICAgICAgICAgICAgMHhCQTBBCisjZGVmaW5lIE1UUF9GT1JNQVRfQUJTVFJBQ1RfTUVESUFDQVNUICAgICAgICAgICAgICAgICAgIDB4QkEwQiAvLyBGb3IgdXNlIHdpdGggbWVkaWFjYXN0czsgcmVmZXJlbmNlcyBtdWx0aW1lZGlhIGVuY2xvc3VyZXMgb2YgUlNTIGZlZWRzIG9yIGVwaXNvZGljIGNvbnRlbnQKKyNkZWZpbmUgTVRQX0ZPUk1BVF9XUExfUExBWUxJU1QgICAgICAgICAgICAgICAgICAgICAgICAgMHhCQTEwCisjZGVmaW5lIE1UUF9GT1JNQVRfTTNVX1BMQVlMSVNUICAgICAgICAgICAgICAgICAgICAgICAgIDB4QkExMQorI2RlZmluZSBNVFBfRk9STUFUX01QTF9QTEFZTElTVCAgICAgICAgICAgICAgICAgICAgICAgICAweEJBMTIKKyNkZWZpbmUgTVRQX0ZPUk1BVF9BU1hfUExBWUxJU1QgICAgICAgICAgICAgICAgICAgICAgICAgMHhCQTEzCisjZGVmaW5lIE1UUF9GT1JNQVRfUExTX1BMQVlMSVNUICAgICAgICAgICAgICAgICAgICAgICAgIDB4QkExNAorI2RlZmluZSBNVFBfRk9STUFUX1VOREVGSU5FRF9ET0NVTUVOVCAgICAgICAgICAgICAgICAgICAweEJBODAKKyNkZWZpbmUgTVRQX0ZPUk1BVF9BQlNUUkFDVF9ET0NVTUVOVCAgICAgICAgICAgICAgICAgICAgMHhCQTgxCisjZGVmaW5lIE1UUF9GT1JNQVRfWE1MX0RPQ1VNRU5UICAgICAgICAgICAgICAgICAgICAgICAgIDB4QkE4MgorI2RlZmluZSBNVFBfRk9STUFUX01TX1dPUkRfRE9DVU1FTlQgICAgICAgICAgICAgICAgICAgICAweEJBODMKKyNkZWZpbmUgTVRQX0ZPUk1BVF9NSFRfQ09NUElMRURfSFRNTF9ET0NVTUVOVCAgICAgICAgICAgMHhCQTg0CisjZGVmaW5lIE1UUF9GT1JNQVRfTVNfRVhDRUxfU1BSRUFEU0hFRVQgICAgICAgICAgICAgICAgIDB4QkE4NQorI2RlZmluZSBNVFBfRk9STUFUX01TX1BPV0VSUE9JTlRfUFJFU0VOVEFUSU9OICAgICAgICAgICAweEJBODYKKyNkZWZpbmUgTVRQX0ZPUk1BVF9VTkRFRklORURfTUVTU0FHRSAgICAgICAgICAgICAgICAgICAgMHhCQjAwCisjZGVmaW5lIE1UUF9GT1JNQVRfQUJTVFJBQ1RfTUVTU1NBR0UgICAgICAgICAgICAgICAgICAgIDB4QkIwMQorI2RlZmluZSBNVFBfRk9STUFUX1VOREVGSU5FRF9DT05UQUNUICAgICAgICAgICAgICAgICAgICAweEJCODAKKyNkZWZpbmUgTVRQX0ZPUk1BVF9BQlNUUkFDVF9DT05UQUNUICAgICAgICAgICAgICAgICAgICAgMHhCQjgxCisjZGVmaW5lIE1UUF9GT1JNQVRfVkNBUkRfMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4QkI4MgorCisvLyBNVFAgT2JqZWN0IFByb3BlcnR5IENvZGVzCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9TVE9SQUdFX0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDMDEKKyNkZWZpbmUgTVRQX1BST1BFUlRZX09CSkVDVF9GT1JNQVQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REMwMgorI2RlZmluZSBNVFBfUFJPUEVSVFlfUFJPVEVDVElPTl9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgMHhEQzAzCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9PQkpFQ1RfU0laRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDMDQKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0FTU09DSUFUSU9OX1RZUEUgICAgICAgICAgICAgICAgICAgICAgIDB4REMwNQorI2RlZmluZSBNVFBfUFJPUEVSVFlfQVNTT0NJQVRJT05fREVTQyAgICAgICAgICAgICAgICAgICAgICAgMHhEQzA2CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9PQkpFQ1RfRklMRV9OQU1FICAgICAgICAgICAgICAgICAgICAgICAweERDMDcKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0RBVEVfQ1JFQVRFRCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REMwOAorI2RlZmluZSBNVFBfUFJPUEVSVFlfREFURV9NT0RJRklFRCAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzA5CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9LRVlXT1JEUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDMEEKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BBUkVOVF9PQkpFQ1QgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REMwQgorI2RlZmluZSBNVFBfUFJPUEVSVFlfQUxMT1dFRF9GT0xERVJfQ09OVEVOVFMgICAgICAgICAgICAgICAgMHhEQzBDCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9ISURERU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDMEQKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1NZU1RFTV9PQkpFQ1QgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REMwRQorI2RlZmluZSBNVFBfUFJPUEVSVFlfUEVSU0lTVEVOVF9VSUQgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzQxCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9TWU5DX0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDNDIKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BST1BFUlRZX0JBRyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM0MworI2RlZmluZSBNVFBfUFJPUEVSVFlfTkFNRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzQ0CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9DUkVBVEVEX0JZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDNDUKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0FSVElTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM0NgorI2RlZmluZSBNVFBfUFJPUEVSVFlfREFURV9BVVRIT1JFRCAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzQ3CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9ERVNDUklQVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDNDgKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1VSTF9SRUZFUkVOQ0UgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM0OQorI2RlZmluZSBNVFBfUFJPUEVSVFlfTEFOR1VBR0VfTE9DQUxFICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzRBCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9DT1BZUklHSFRfSU5GT1JNQVRJT04gICAgICAgICAgICAgICAgICAweERDNEIKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1NPVVJDRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM0QworI2RlZmluZSBNVFBfUFJPUEVSVFlfT1JJR0lOX0xPQ0FUSU9OICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzRECisjZGVmaW5lIE1UUF9QUk9QRVJUWV9EQVRFX0FEREVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDNEUKKyNkZWZpbmUgTVRQX1BST1BFUlRZX05PTl9DT05TVU1BQkxFICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM0RgorI2RlZmluZSBNVFBfUFJPUEVSVFlfQ09SUlVQVF9VTlBMQVlBQkxFICAgICAgICAgICAgICAgICAgICAgMHhEQzUwCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9QUk9EVUNFUl9TRVJJQUxfTlVNQkVSICAgICAgICAgICAgICAgICAweERDNTEKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1JFUFJFU0VOVEFUSVZFX1NBTVBMRV9GT1JNQVQgICAgICAgICAgIDB4REM4MQorI2RlZmluZSBNVFBfUFJPUEVSVFlfUkVQUkVTRU5UQVRJVkVfU0FNUExFX1NJWkUgICAgICAgICAgICAgMHhEQzgyCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9SRVBSRVNFTlRBVElWRV9TQU1QTEVfSEVJR0hUICAgICAgICAgICAweERDODMKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1JFUFJFU0VOVEFUSVZFX1NBTVBMRV9XSURUSCAgICAgICAgICAgIDB4REM4NAorI2RlZmluZSBNVFBfUFJPUEVSVFlfUkVQUkVTRU5UQVRJVkVfU0FNUExFX0RVUkFUSU9OICAgICAgICAgMHhEQzg1CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9SRVBSRVNFTlRBVElWRV9TQU1QTEVfREFUQSAgICAgICAgICAgICAweERDODYKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM4NworI2RlZmluZSBNVFBfUFJPUEVSVFlfSEVJR0hUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzg4CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9EVVJBVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDODkKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1JBVElORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM4QQorI2RlZmluZSBNVFBfUFJPUEVSVFlfVFJBQ0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzhCCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9HRU5SRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDOEMKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0NSRURJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM4RAorI2RlZmluZSBNVFBfUFJPUEVSVFlfTFlSSUNTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzhFCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9TVUJTQ1JJUFRJT05fQ09OVEVOVF9JRCAgICAgICAgICAgICAgICAweERDOEYKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BST0RVQ0VEX0JZICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM5MAorI2RlZmluZSBNVFBfUFJPUEVSVFlfVVNFX0NPVU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzkxCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9TS0lQX0NPVU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDOTIKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0xBU1RfQUNDRVNTRUQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM5MworI2RlZmluZSBNVFBfUFJPUEVSVFlfUEFSRU5UQUxfUkFUSU5HICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzk0CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9NRVRBX0dFTlJFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDOTUKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0NPTVBPU0VSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM5NgorI2RlZmluZSBNVFBfUFJPUEVSVFlfRUZGRUNUSVZFX1JBVElORyAgICAgICAgICAgICAgICAgICAgICAgMHhEQzk3CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9TVUJUSVRMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDOTgKKyNkZWZpbmUgTVRQX1BST1BFUlRZX09SSUdJTkFMX1JFTEVBU0VfREFURSAgICAgICAgICAgICAgICAgIDB4REM5OQorI2RlZmluZSBNVFBfUFJPUEVSVFlfQUxCVU1fTkFNRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzlBCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9BTEJVTV9BUlRJU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDOUIKKyNkZWZpbmUgTVRQX1BST1BFUlRZX01PT0QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM5QworI2RlZmluZSBNVFBfUFJPUEVSVFlfRFJNX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzlECisjZGVmaW5lIE1UUF9QUk9QRVJUWV9TVUJfREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICAgICAgICAweERDOUUKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0lTX0NST1BQRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RENEMQorI2RlZmluZSBNVFBfUFJPUEVSVFlfSVNfQ09MT1VSX0NPUlJFQ1RFRCAgICAgICAgICAgICAgICAgICAgMHhEQ0QyCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9JTUFHRV9CSVRfREVQVEggICAgICAgICAgICAgICAgICAgICAgICAweERDRDMKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0ZfTlVNQkVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RENENAorI2RlZmluZSBNVFBfUFJPUEVSVFlfRVhQT1NVUkVfVElNRSAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQ0Q1CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9FWFBPU1VSRV9JTkRFWCAgICAgICAgICAgICAgICAgICAgICAgICAweERDRDYKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1RPVEFMX0JJVFJBVEUgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REU5MQorI2RlZmluZSBNVFBfUFJPUEVSVFlfQklUUkFURV9UWVBFICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERTkyCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9TQU1QTEVfUkFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERFOTMKKyNkZWZpbmUgTVRQX1BST1BFUlRZX05VTUJFUl9PRl9DSEFOTkVMUyAgICAgICAgICAgICAgICAgICAgIDB4REU5NAorI2RlZmluZSBNVFBfUFJPUEVSVFlfQVVESU9fQklUX0RFUFRIICAgICAgICAgICAgICAgICAgICAgICAgMHhERTk1CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9TQ0FOX1RZUEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERFOTcKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0FVRElPX1dBVkVfQ09ERUMgICAgICAgICAgICAgICAgICAgICAgIDB4REU5OQorI2RlZmluZSBNVFBfUFJPUEVSVFlfQVVESU9fQklUUkFURSAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERTlBCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9WSURFT19GT1VSQ0NfQ09ERUMgICAgICAgICAgICAgICAgICAgICAweERFOUIKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1ZJREVPX0JJVFJBVEUgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REU5QworI2RlZmluZSBNVFBfUFJPUEVSVFlfRlJBTUVTX1BFUl9USE9VU0FORF9TRUNPTkRTICAgICAgICAgICAgMHhERTlECisjZGVmaW5lIE1UUF9QUk9QRVJUWV9LRVlGUkFNRV9ESVNUQU5DRSAgICAgICAgICAgICAgICAgICAgICAweERFOUUKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0JVRkZFUl9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REU5RgorI2RlZmluZSBNVFBfUFJPUEVSVFlfRU5DT0RJTkdfUVVBTElUWSAgICAgICAgICAgICAgICAgICAgICAgMHhERUEwCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9FTkNPRElOR19QUk9GSUxFICAgICAgICAgICAgICAgICAgICAgICAweERFQTEKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0RJU1BMQVlfTkFNRSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RENFMAorI2RlZmluZSBNVFBfUFJPUEVSVFlfQk9EWV9URVhUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQ0UxCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9TVUJKRUNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDRTIKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BSSU9SSVRZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RENFMworI2RlZmluZSBNVFBfUFJPUEVSVFlfR0lWRU5fTkFNRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERDAwCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9NSURETEVfTkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAweEREMDEKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0ZBTUlMWV9OQU1FICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REQwMgorI2RlZmluZSBNVFBfUFJPUEVSVFlfUFJFRklYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERDAzCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9TVUZGSVggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEREMDQKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BIT05FVElDX0dJVkVOX05BTUUgICAgICAgICAgICAgICAgICAgIDB4REQwNQorI2RlZmluZSBNVFBfUFJPUEVSVFlfUEhPTkVUSUNfRkFNSUxZX05BTUUgICAgICAgICAgICAgICAgICAgMHhERDA2CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9FTUFJTF9QUklNQVJZICAgICAgICAgICAgICAgICAgICAgICAgICAweEREMDcKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0VNQUlMX1BFUlNPTkFMXzEgICAgICAgICAgICAgICAgICAgICAgIDB4REQwOAorI2RlZmluZSBNVFBfUFJPUEVSVFlfRU1BSUxfUEVSU09OQUxfMiAgICAgICAgICAgICAgICAgICAgICAgMHhERDA5CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9FTUFJTF9CVVNJTkVTU18xICAgICAgICAgICAgICAgICAgICAgICAweEREMEEKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0VNQUlMX0JVU0lORVNTXzIgICAgICAgICAgICAgICAgICAgICAgIDB4REQwQgorI2RlZmluZSBNVFBfUFJPUEVSVFlfRU1BSUxfT1RIRVJTICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERDBDCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9QSE9ORV9OVU1CRVJfUFJJTUFSWSAgICAgICAgICAgICAgICAgICAweEREMEQKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BIT05FX05VTUJFUl9QRVJTT05BTCAgICAgICAgICAgICAgICAgIDB4REQwRQorI2RlZmluZSBNVFBfUFJPUEVSVFlfUEhPTkVfTlVNQkVSX1BFUlNPTkFMXzIgICAgICAgICAgICAgICAgMHhERDBGCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9QSE9ORV9OVU1CRVJfQlVTSU5FU1MgICAgICAgICAgICAgICAgICAweEREMTAKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BIT05FX05VTUJFUl9CVVNJTkVTU18yICAgICAgICAgICAgICAgIDB4REQxMQorI2RlZmluZSBNVFBfUFJPUEVSVFlfUEhPTkVfTlVNQkVSX01PQklMRSAgICAgICAgICAgICAgICAgICAgMHhERDEyCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9QSE9ORV9OVU1CRVJfTU9CSUxFXzIgICAgICAgICAgICAgICAgICAweEREMTMKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0ZBWF9OVU1CRVJfUFJJTUFSWSAgICAgICAgICAgICAgICAgICAgIDB4REQxNAorI2RlZmluZSBNVFBfUFJPUEVSVFlfRkFYX05VTUJFUl9QRVJTT05BTCAgICAgICAgICAgICAgICAgICAgMHhERDE1CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9GQVhfTlVNQkVSX0JVU0lORVNTICAgICAgICAgICAgICAgICAgICAweEREMTYKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BBR0VSX05VTUJFUiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REQxNworI2RlZmluZSBNVFBfUFJPUEVSVFlfUEhPTkVfTlVNQkVSX09USEVSUyAgICAgICAgICAgICAgICAgICAgMHhERDE4CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9QUklNQVJZX1dFQl9BRERSRVNTICAgICAgICAgICAgICAgICAgICAweEREMTkKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BFUlNPTkFMX1dFQl9BRERSRVNTICAgICAgICAgICAgICAgICAgIDB4REQxQQorI2RlZmluZSBNVFBfUFJPUEVSVFlfQlVTSU5FU1NfV0VCX0FERFJFU1MgICAgICAgICAgICAgICAgICAgMHhERDFCCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9JTlNUQU5UX01FU1NBTkdFUl9BRERSRVNTICAgICAgICAgICAgICAweEREMUMKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0lOU1RBTlRfTUVTU0FOR0VSX0FERFJFU1NfMiAgICAgICAgICAgIDB4REQxRAorI2RlZmluZSBNVFBfUFJPUEVSVFlfSU5TVEFOVF9NRVNTQU5HRVJfQUREUkVTU18zICAgICAgICAgICAgMHhERDFFCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9QT1NUQUxfQUREUkVTU19QRVJTT05BTF9GVUxMICAgICAgICAgICAweEREMUYKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BPU1RBTF9BRERSRVNTX1BFUlNPTkFMX0xJTkVfMSAgICAgICAgIDB4REQyMAorI2RlZmluZSBNVFBfUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfUEVSU09OQUxfTElORV8yICAgICAgICAgMHhERDIxCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9QT1NUQUxfQUREUkVTU19QRVJTT05BTF9DSVRZICAgICAgICAgICAweEREMjIKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BPU1RBTF9BRERSRVNTX1BFUlNPTkFMX1JFR0lPTiAgICAgICAgIDB4REQyMworI2RlZmluZSBNVFBfUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfUEVSU09OQUxfUE9TVEFMX0NPREUgICAgMHhERDI0CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9QT1NUQUxfQUREUkVTU19QRVJTT05BTF9DT1VOVFJZICAgICAgICAweEREMjUKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BPU1RBTF9BRERSRVNTX0JVU0lORVNTX0ZVTEwgICAgICAgICAgIDB4REQyNgorI2RlZmluZSBNVFBfUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfQlVTSU5FU1NfTElORV8xICAgICAgICAgMHhERDI3CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9QT1NUQUxfQUREUkVTU19CVVNJTkVTU19MSU5FXzIgICAgICAgICAweEREMjgKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BPU1RBTF9BRERSRVNTX0JVU0lORVNTX0NJVFkgICAgICAgICAgIDB4REQyOQorI2RlZmluZSBNVFBfUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfQlVTSU5FU1NfUkVHSU9OICAgICAgICAgMHhERDJBCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9QT1NUQUxfQUREUkVTU19CVVNJTkVTU19QT1NUQUxfQ09ERSAgICAweEREMkIKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BPU1RBTF9BRERSRVNTX0JVU0lORVNTX0NPVU5UUlkgICAgICAgIDB4REQyQworI2RlZmluZSBNVFBfUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfT1RIRVJfRlVMTCAgICAgICAgICAgICAgMHhERDJECisjZGVmaW5lIE1UUF9QUk9QRVJUWV9QT1NUQUxfQUREUkVTU19PVEhFUl9MSU5FXzEgICAgICAgICAgICAweEREMkUKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BPU1RBTF9BRERSRVNTX09USEVSX0xJTkVfMiAgICAgICAgICAgIDB4REQyRgorI2RlZmluZSBNVFBfUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfT1RIRVJfQ0lUWSAgICAgICAgICAgICAgMHhERDMwCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9QT1NUQUxfQUREUkVTU19PVEhFUl9SRUdJT04gICAgICAgICAgICAweEREMzEKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BPU1RBTF9BRERSRVNTX09USEVSX1BPU1RBTF9DT0RFICAgICAgIDB4REQzMgorI2RlZmluZSBNVFBfUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfT1RIRVJfQ09VTlRSWSAgICAgICAgICAgMHhERDMzCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9PUkdBTklaQVRJT05fTkFNRSAgICAgICAgICAgICAgICAgICAgICAweEREMzQKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BIT05FVElDX09SR0FOSVpBVElPTl9OQU1FICAgICAgICAgICAgIDB4REQzNQorI2RlZmluZSBNVFBfUFJPUEVSVFlfUk9MRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERDM2CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9CSVJUSERBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEREMzcKKyNkZWZpbmUgTVRQX1BST1BFUlRZX01FU1NBR0VfVE8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REQ0MAorI2RlZmluZSBNVFBfUFJPUEVSVFlfTUVTU0FHRV9DQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERDQxCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9NRVNTQUdFX0JDQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERENDIKKyNkZWZpbmUgTVRQX1BST1BFUlRZX01FU1NBR0VfUkVBRCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REQ0MworI2RlZmluZSBNVFBfUFJPUEVSVFlfTUVTU0FHRV9SRUNFSVZFRF9USU1FICAgICAgICAgICAgICAgICAgMHhERDQ0CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9NRVNTQUdFX1NFTkRFUiAgICAgICAgICAgICAgICAgICAgICAgICAweERENDUKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0FDVElWSVRZX0JFR0lOX1RJTUUgICAgICAgICAgICAgICAgICAgIDB4REQ1MAorI2RlZmluZSBNVFBfUFJPUEVSVFlfQUNUSVZJVFlfRU5EX1RJTUUgICAgICAgICAgICAgICAgICAgICAgMHhERDUxCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9BQ1RJVklUWV9MT0NBVElPTiAgICAgICAgICAgICAgICAgICAgICAweERENTIKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0FDVElWSVRZX1JFUVVJUkVEX0FUVEVOREVFUyAgICAgICAgICAgIDB4REQ1NAorI2RlZmluZSBNVFBfUFJPUEVSVFlfQUNUSVZJVFlfT1BUSU9OQUxfQVRURU5ERUVTICAgICAgICAgICAgMHhERDU1CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9BQ1RJVklUWV9SRVNPVVJDRVMgICAgICAgICAgICAgICAgICAgICAweERENTYKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0FDVElWSVRZX0FDQ0VQVEVEICAgICAgICAgICAgICAgICAgICAgIDB4REQ1NworI2RlZmluZSBNVFBfUFJPUEVSVFlfQUNUSVZJVFlfVEVOVEFUSVZFICAgICAgICAgICAgICAgICAgICAgMHhERDU4CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9BQ1RJVklUWV9ERUNMSU5FRCAgICAgICAgICAgICAgICAgICAgICAweERENTkKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0FDVElWSVRZX1JFTUFJTkRFUl9USU1FICAgICAgICAgICAgICAgIDB4REQ1QQorI2RlZmluZSBNVFBfUFJPUEVSVFlfQUNUSVZJVFlfT1dORVIgICAgICAgICAgICAgICAgICAgICAgICAgMHhERDVCCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9BQ1RJVklUWV9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAweERENUMKKyNkZWZpbmUgTVRQX1BST1BFUlRZX09XTkVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REQ1RAorI2RlZmluZSBNVFBfUFJPUEVSVFlfRURJVE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERDVFCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9XRUJNQVNURVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERENUYKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1VSTF9TT1VSQ0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REQ2MAorI2RlZmluZSBNVFBfUFJPUEVSVFlfVVJMX0RFU1RJTkFUSU9OICAgICAgICAgICAgICAgICAgICAgICAgMHhERDYxCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9USU1FX0JPT0tNQVJLICAgICAgICAgICAgICAgICAgICAgICAgICAweERENjIKKyNkZWZpbmUgTVRQX1BST1BFUlRZX09CSkVDVF9CT09LTUFSSyAgICAgICAgICAgICAgICAgICAgICAgIDB4REQ2MworI2RlZmluZSBNVFBfUFJPUEVSVFlfQllURV9CT09LTUFSSyAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERDY0CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9MQVNUX0JVSUxEX0RBVEUgICAgICAgICAgICAgICAgICAgICAgICAweERENzAKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1RJTUVfVE9fTElWRSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REQ3MQorI2RlZmluZSBNVFBfUFJPUEVSVFlfTUVESUFfR1VJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERDcyCisKKy8vIE1UUCBEZXZpY2UgUHJvcGVydHkgQ29kZXMKKyNkZWZpbmUgTVRQX0RFVklDRV9QUk9QRVJUWV9VTkRFRklORUQgICAgICAgICAgICAgICAgICAgICAgIDB4NTAwMAorI2RlZmluZSBNVFBfREVWSUNFX1BST1BFUlRZX0JBVFRFUllfTEVWRUwgICAgICAgICAgICAgICAgICAgMHg1MDAxCisjZGVmaW5lIE1UUF9ERVZJQ0VfUFJPUEVSVFlfRlVOQ1RJT05BTF9NT0RFICAgICAgICAgICAgICAgICAweDUwMDIKKyNkZWZpbmUgTVRQX0RFVklDRV9QUk9QRVJUWV9JTUFHRV9TSVpFICAgICAgICAgICAgICAgICAgICAgIDB4NTAwMworI2RlZmluZSBNVFBfREVWSUNFX1BST1BFUlRZX0NPTVBSRVNTSU9OX1NFVFRJTkcgICAgICAgICAgICAgMHg1MDA0CisjZGVmaW5lIE1UUF9ERVZJQ0VfUFJPUEVSVFlfV0hJVEVfQkFMQU5DRSAgICAgICAgICAgICAgICAgICAweDUwMDUKKyNkZWZpbmUgTVRQX0RFVklDRV9QUk9QRVJUWV9SR0JfR0FJTiAgICAgICAgICAgICAgICAgICAgICAgIDB4NTAwNgorI2RlZmluZSBNVFBfREVWSUNFX1BST1BFUlRZX0ZfTlVNQkVSICAgICAgICAgICAgICAgICAgICAgICAgMHg1MDA3CisjZGVmaW5lIE1UUF9ERVZJQ0VfUFJPUEVSVFlfRk9DQUxfTEVOR1RIICAgICAgICAgICAgICAgICAgICAweDUwMDgKKyNkZWZpbmUgTVRQX0RFVklDRV9QUk9QRVJUWV9GT0NVU19ESVNUQU5DRSAgICAgICAgICAgICAgICAgIDB4NTAwOQorI2RlZmluZSBNVFBfREVWSUNFX1BST1BFUlRZX0ZPQ1VTX01PREUgICAgICAgICAgICAgICAgICAgICAgMHg1MDBBCisjZGVmaW5lIE1UUF9ERVZJQ0VfUFJPUEVSVFlfRVhQT1NVUkVfTUVURVJJTkdfTU9ERSAgICAgICAgICAweDUwMEIKKyNkZWZpbmUgTVRQX0RFVklDRV9QUk9QRVJUWV9GTEFTSF9NT0RFICAgICAgICAgICAgICAgICAgICAgIDB4NTAwQworI2RlZmluZSBNVFBfREVWSUNFX1BST1BFUlRZX0VYUE9TVVJFX1RJTUUgICAgICAgICAgICAgICAgICAgMHg1MDBECisjZGVmaW5lIE1UUF9ERVZJQ0VfUFJPUEVSVFlfRVhQT1NVUkVfUFJPR1JBTV9NT0RFICAgICAgICAgICAweDUwMEUKKyNkZWZpbmUgTVRQX0RFVklDRV9QUk9QRVJUWV9FWFBPU1VSRV9JTkRFWCAgICAgICAgICAgICAgICAgIDB4NTAwRgorI2RlZmluZSBNVFBfREVWSUNFX1BST1BFUlRZX0VYUE9TVVJFX0JJQVNfQ09NUEVOU0FUSU9OICAgICAgMHg1MDEwCisjZGVmaW5lIE1UUF9ERVZJQ0VfUFJPUEVSVFlfREFURVRJTUUgICAgICAgICAgICAgICAgICAgICAgICAweDUwMTEKKyNkZWZpbmUgTVRQX0RFVklDRV9QUk9QRVJUWV9DQVBUVVJFX0RFTEFZICAgICAgICAgICAgICAgICAgIDB4NTAxMgorI2RlZmluZSBNVFBfREVWSUNFX1BST1BFUlRZX1NUSUxMX0NBUFRVUkVfTU9ERSAgICAgICAgICAgICAgMHg1MDEzCisjZGVmaW5lIE1UUF9ERVZJQ0VfUFJPUEVSVFlfQ09OVFJBU1QgICAgICAgICAgICAgICAgICAgICAgICAweDUwMTQKKyNkZWZpbmUgTVRQX0RFVklDRV9QUk9QRVJUWV9TSEFSUE5FU1MgICAgICAgICAgICAgICAgICAgICAgIDB4NTAxNQorI2RlZmluZSBNVFBfREVWSUNFX1BST1BFUlRZX0RJR0lUQUxfWk9PTSAgICAgICAgICAgICAgICAgICAgMHg1MDE2CisjZGVmaW5lIE1UUF9ERVZJQ0VfUFJPUEVSVFlfRUZGRUNUX01PREUgICAgICAgICAgICAgICAgICAgICAweDUwMTcKKyNkZWZpbmUgTVRQX0RFVklDRV9QUk9QRVJUWV9CVVJTVF9OVU1CRVIgICAgICAgICAgICAgICAgICAgIDB4NTAxOAorI2RlZmluZSBNVFBfREVWSUNFX1BST1BFUlRZX0JVUlNUX0lOVEVSVkFMICAgICAgICAgICAgICAgICAgMHg1MDE5CisjZGVmaW5lIE1UUF9ERVZJQ0VfUFJPUEVSVFlfVElNRUxBUFNFX05VTUJFUiAgICAgICAgICAgICAgICAweDUwMUEKKyNkZWZpbmUgTVRQX0RFVklDRV9QUk9QRVJUWV9USU1FTEFQU0VfSU5URVJWQUwgICAgICAgICAgICAgIDB4NTAxQgorI2RlZmluZSBNVFBfREVWSUNFX1BST1BFUlRZX0ZPQ1VTX01FVEVSSU5HX01PREUgICAgICAgICAgICAgMHg1MDFDCisjZGVmaW5lIE1UUF9ERVZJQ0VfUFJPUEVSVFlfVVBMT0FEX1VSTCAgICAgICAgICAgICAgICAgICAgICAweDUwMUQKKyNkZWZpbmUgTVRQX0RFVklDRV9QUk9QRVJUWV9BUlRJU1QgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NTAxRQorI2RlZmluZSBNVFBfREVWSUNFX1BST1BFUlRZX0NPUFlSSUdIVF9JTkZPICAgICAgICAgICAgICAgICAgMHg1MDFGCisjZGVmaW5lIE1UUF9ERVZJQ0VfUFJPUEVSVFlfU1lOQ0hST05JWkFUSU9OX1BBUlRORVIgICAgICAgICAweEQ0MDEKKyNkZWZpbmUgTVRQX0RFVklDRV9QUk9QRVJUWV9ERVZJQ0VfRlJJRU5ETFlfTkFNRSAgICAgICAgICAgIDB4RDQwMgorI2RlZmluZSBNVFBfREVWSUNFX1BST1BFUlRZX1ZPTFVNRSAgICAgICAgICAgICAgICAgICAgICAgICAgMHhENDAzCisjZGVmaW5lIE1UUF9ERVZJQ0VfUFJPUEVSVFlfU1VQUE9SVEVEX0ZPUk1BVFNfT1JERVJFRCAgICAgICAweEQ0MDQKKyNkZWZpbmUgTVRQX0RFVklDRV9QUk9QRVJUWV9ERVZJQ0VfSUNPTiAgICAgICAgICAgICAgICAgICAgIDB4RDQwNQorI2RlZmluZSBNVFBfREVWSUNFX1BST1BFUlRZX1BMQVlCQUNLX1JBVEUgICAgICAgICAgICAgICAgICAgMHhENDEwCisjZGVmaW5lIE1UUF9ERVZJQ0VfUFJPUEVSVFlfUExBWUJBQ0tfT0JKRUNUICAgICAgICAgICAgICAgICAweEQ0MTEKKyNkZWZpbmUgTVRQX0RFVklDRV9QUk9QRVJUWV9QTEFZQkFDS19DT05UQUlORVJfSU5ERVggICAgICAgIDB4RDQxMgorI2RlZmluZSBNVFBfREVWSUNFX1BST1BFUlRZX1NFU1NJT05fSU5JVElBVE9SX1ZFUlNJT05fSU5GTyAgMHhENDA2CisjZGVmaW5lIE1UUF9ERVZJQ0VfUFJPUEVSVFlfUEVSQ0VJVkVEX0RFVklDRV9UWVBFICAgICAgICAgICAweEQ0MDcKKworLy8gTVRQIE9wZXJhdGlvbiBDb2RlcworI2RlZmluZSBNVFBfT1BFUkFUSU9OX0dFVF9ERVZJQ0VfSU5GTyAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAxCisjZGVmaW5lIE1UUF9PUEVSQVRJT05fT1BFTl9TRVNTSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMDIKKyNkZWZpbmUgTVRQX09QRVJBVElPTl9DTE9TRV9TRVNTSU9OICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMworI2RlZmluZSBNVFBfT1BFUkFUSU9OX0dFVF9TVE9SQUdFX0lEUyAgICAgICAgICAgICAgICAgICAgICAgMHgxMDA0CisjZGVmaW5lIE1UUF9PUEVSQVRJT05fR0VUX1NUT1JBR0VfSU5GTyAgICAgICAgICAgICAgICAgICAgICAweDEwMDUKKyNkZWZpbmUgTVRQX09QRVJBVElPTl9HRVRfTlVNX09CSkVDVFMgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwNgorI2RlZmluZSBNVFBfT1BFUkFUSU9OX0dFVF9PQkpFQ1RfSEFORExFUyAgICAgICAgICAgICAgICAgICAgMHgxMDA3CisjZGVmaW5lIE1UUF9PUEVSQVRJT05fR0VUX09CSkVDVF9JTkZPICAgICAgICAgICAgICAgICAgICAgICAweDEwMDgKKyNkZWZpbmUgTVRQX09QRVJBVElPTl9HRVRfT0JKRUNUICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwOQorI2RlZmluZSBNVFBfT1BFUkFUSU9OX0dFVF9USFVNQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDBBCisjZGVmaW5lIE1UUF9PUEVSQVRJT05fREVMRVRFX09CSkVDVCAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMEIKKyNkZWZpbmUgTVRQX09QRVJBVElPTl9TRU5EX09CSkVDVF9JTkZPICAgICAgICAgICAgICAgICAgICAgIDB4MTAwQworI2RlZmluZSBNVFBfT1BFUkFUSU9OX1NFTkRfT0JKRUNUICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDBECisjZGVmaW5lIE1UUF9PUEVSQVRJT05fSU5JVElBVEVfQ0FQVFVSRSAgICAgICAgICAgICAgICAgICAgICAweDEwMEUKKyNkZWZpbmUgTVRQX09QRVJBVElPTl9GT1JNQVRfU1RPUkUgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwRgorI2RlZmluZSBNVFBfT1BFUkFUSU9OX1JFU0VUX0RFVklDRSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDEwCisjZGVmaW5lIE1UUF9PUEVSQVRJT05fU0VMRl9URVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMTEKKyNkZWZpbmUgTVRQX09QRVJBVElPTl9TRVRfT0JKRUNUX1BST1RFQ1RJT04gICAgICAgICAgICAgICAgIDB4MTAxMgorI2RlZmluZSBNVFBfT1BFUkFUSU9OX1BPV0VSX0RPV04gICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDEzCisjZGVmaW5lIE1UUF9PUEVSQVRJT05fR0VUX0RFVklDRV9QUk9QX0RFU0MgICAgICAgICAgICAgICAgICAweDEwMTQKKyNkZWZpbmUgTVRQX09QRVJBVElPTl9HRVRfREVWSUNFX1BST1BfVkFMVUUgICAgICAgICAgICAgICAgIDB4MTAxNQorI2RlZmluZSBNVFBfT1BFUkFUSU9OX1NFVF9ERVZJQ0VfUFJPUF9WQUxVRSAgICAgICAgICAgICAgICAgMHgxMDE2CisjZGVmaW5lIE1UUF9PUEVSQVRJT05fUkVTRVRfREVWSUNFX1BST1BfVkFMVUUgICAgICAgICAgICAgICAweDEwMTcKKyNkZWZpbmUgTVRQX09QRVJBVElPTl9URVJNSU5BVEVfT1BFTl9DQVBUVVJFICAgICAgICAgICAgICAgIDB4MTAxOAorI2RlZmluZSBNVFBfT1BFUkFUSU9OX01PVkVfT0JKRUNUICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDE5CisjZGVmaW5lIE1UUF9PUEVSQVRJT05fQ09QWV9PQkpFQ1QgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMUEKKyNkZWZpbmUgTVRQX09QRVJBVElPTl9HRVRfUEFSVElBTF9PQkpFQ1QgICAgICAgICAgICAgICAgICAgIDB4MTAxQgorI2RlZmluZSBNVFBfT1BFUkFUSU9OX0lOSVRJQVRFX09QRU5fQ0FQVFVSRSAgICAgICAgICAgICAgICAgMHgxMDFDCisjZGVmaW5lIE1UUF9PUEVSQVRJT05fR0VUX09CSkVDVF9QUk9QU19TVVBQT1JURUQgICAgICAgICAgICAweDk4MDEKKyNkZWZpbmUgTVRQX09QRVJBVElPTl9HRVRfT0JKRUNUX1BST1BfREVTQyAgICAgICAgICAgICAgICAgIDB4OTgwMgorI2RlZmluZSBNVFBfT1BFUkFUSU9OX0dFVF9PQkpFQ1RfUFJPUF9WQUxVRSAgICAgICAgICAgICAgICAgMHg5ODAzCisjZGVmaW5lIE1UUF9PUEVSQVRJT05fU0VUX09CSkVDVF9QUk9QX1ZBTFVFICAgICAgICAgICAgICAgICAweDk4MDQKKyNkZWZpbmUgTVRQX09QRVJBVElPTl9HRVRfT0JKRUNUX1JFRkVSRU5DRVMgICAgICAgICAgICAgICAgIDB4OTgxMAorI2RlZmluZSBNVFBfT1BFUkFUSU9OX1NFVF9PQkpFQ1RfUkVGRVJFTkNFUyAgICAgICAgICAgICAgICAgMHg5ODExCisjZGVmaW5lIE1UUF9PUEVSQVRJT05fU0tJUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDk4MjAKKworLy8gTVRQIFJlc3BvbnNlIENvZGVzCisjZGVmaW5lIE1UUF9SRVNQT05TRV9VTkRFRklORUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDAwCisjZGVmaW5lIE1UUF9SRVNQT05TRV9PSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDAxCisjZGVmaW5lIE1UUF9SRVNQT05TRV9HRU5FUkFMX0VSUk9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDAyCisjZGVmaW5lIE1UUF9SRVNQT05TRV9TRVNTSU9OX05PVF9PUEVOICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDAzCisjZGVmaW5lIE1UUF9SRVNQT05TRV9JTlZBTElEX1RSQU5TQUNUSU9OX0lEICAgICAgICAgICAgICAgICAgICAgMHgyMDA0CisjZGVmaW5lIE1UUF9SRVNQT05TRV9PUEVSQVRJT05fTk9UX1NVUFBPUlRFRCAgICAgICAgICAgICAgICAgICAgMHgyMDA1CisjZGVmaW5lIE1UUF9SRVNQT05TRV9QQVJBTUVURVJfTk9UX1NVUFBPUlRFRCAgICAgICAgICAgICAgICAgICAgMHgyMDA2CisjZGVmaW5lIE1UUF9SRVNQT05TRV9JTkNPTVBMRVRFX1RSQU5TRkVSICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDA3CisjZGVmaW5lIE1UUF9SRVNQT05TRV9JTlZBTElEX1NUT1JBR0VfSUQgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDA4CisjZGVmaW5lIE1UUF9SRVNQT05TRV9JTlZBTElEX09CSkVDVF9IQU5ETEUgICAgICAgICAgICAgICAgICAgICAgMHgyMDA5CisjZGVmaW5lIE1UUF9SRVNQT05TRV9ERVZJQ0VfUFJPUF9OT1RfU1VQUE9SVEVEICAgICAgICAgICAgICAgICAgMHgyMDBBCisjZGVmaW5lIE1UUF9SRVNQT05TRV9JTlZBTElEX09CSkVDVF9GT1JNQVRfQ09ERSAgICAgICAgICAgICAgICAgMHgyMDBCCisjZGVmaW5lIE1UUF9SRVNQT05TRV9TVE9SQUdFX0ZVTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDBDCisjZGVmaW5lIE1UUF9SRVNQT05TRV9PQkpFQ1RfV1JJVEVfUFJPVEVDVEVEICAgICAgICAgICAgICAgICAgICAgMHgyMDBECisjZGVmaW5lIE1UUF9SRVNQT05TRV9TVE9SRV9SRUFEX09OTFkgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDBFCisjZGVmaW5lIE1UUF9SRVNQT05TRV9BQ0NFU1NfREVOSUVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDBGCisjZGVmaW5lIE1UUF9SRVNQT05TRV9OT19USFVNQk5BSUxfUFJFU0VOVCAgICAgICAgICAgICAgICAgICAgICAgMHgyMDEwCisjZGVmaW5lIE1UUF9SRVNQT05TRV9TRUxGX1RFU1RfRkFJTEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDExCisjZGVmaW5lIE1UUF9SRVNQT05TRV9QQVJUSUFMX0RFTEVUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDEyCisjZGVmaW5lIE1UUF9SRVNQT05TRV9TVE9SRV9OT1RfQVZBSUxBQkxFICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDEzCisjZGVmaW5lIE1UUF9SRVNQT05TRV9TUEVDSUZJQ0FUSU9OX0JZX0ZPUk1BVF9VTlNVUFBPUlRFRCAgICAgICAgMHgyMDE0CisjZGVmaW5lIE1UUF9SRVNQT05TRV9OT19WQUxJRF9PQkpFQ1RfSU5GTyAgICAgICAgICAgICAgICAgICAgICAgMHgyMDE1CisjZGVmaW5lIE1UUF9SRVNQT05TRV9JTlZBTElEX0NPREVfRk9STUFUICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDE2CisjZGVmaW5lIE1UUF9SRVNQT05TRV9VTktOT1dOX1ZFTkRPUl9DT0RFICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDE3CisjZGVmaW5lIE1UUF9SRVNQT05TRV9DQVBUVVJFX0FMUkVBRFlfVEVSTUlOQVRFRCAgICAgICAgICAgICAgICAgMHgyMDE4CisjZGVmaW5lIE1UUF9SRVNQT05TRV9ERVZJQ0VfQlVTWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDE5CisjZGVmaW5lIE1UUF9SRVNQT05TRV9JTlZBTElEX1BBUkVOVF9PQkpFQ1QgICAgICAgICAgICAgICAgICAgICAgMHgyMDFBCisjZGVmaW5lIE1UUF9SRVNQT05TRV9JTlZBTElEX0RFVklDRV9QUk9QX0ZPUk1BVCAgICAgICAgICAgICAgICAgMHgyMDFCCisjZGVmaW5lIE1UUF9SRVNQT05TRV9JTlZBTElEX0RFVklDRV9QUk9QX1ZBTFVFICAgICAgICAgICAgICAgICAgMHgyMDFDCisjZGVmaW5lIE1UUF9SRVNQT05TRV9JTlZBTElEX1BBUkFNRVRFUiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDFECisjZGVmaW5lIE1UUF9SRVNQT05TRV9TRVNTSU9OX0FMUkVBRFlfT1BFTiAgICAgICAgICAgICAgICAgICAgICAgMHgyMDFFCisjZGVmaW5lIE1UUF9SRVNQT05TRV9UUkFOU0FDVElPTl9DQU5DRUxMRUQgICAgICAgICAgICAgICAgICAgICAgMHgyMDFGCisjZGVmaW5lIE1UUF9SRVNQT05TRV9TUEVDSUZJQ0FUSU9OX09GX0RFU1RJTkFUSU9OX1VOU1VQUE9SVEVEICAgMHgyMDIwCisjZGVmaW5lIE1UUF9SRVNQT05TRV9JTlZBTElEX09CSkVDVF9QUk9QX0NPREUgICAgICAgICAgICAgICAgICAgMHhBODAxCisjZGVmaW5lIE1UUF9SRVNQT05TRV9JTlZBTElEX09CSkVDVF9QUk9QX0ZPUk1BVCAgICAgICAgICAgICAgICAgMHhBODAyCisjZGVmaW5lIE1UUF9SRVNQT05TRV9JTlZBTElEX09CSkVDVF9QUk9QX1ZBTFVFICAgICAgICAgICAgICAgICAgMHhBODAzCisjZGVmaW5lIE1UUF9SRVNQT05TRV9JTlZBTElEX09CSkVDVF9SRUZFUkVOQ0UgICAgICAgICAgICAgICAgICAgMHhBODA0CisjZGVmaW5lIE1UUF9SRVNQT05TRV9HUk9VUF9OT1RfU1VQUE9SVEVEICAgICAgICAgICAgICAgICAgICAgICAgMHhBODA1CisjZGVmaW5lIE1UUF9SRVNQT05TRV9JTlZBTElEX0RBVEFTRVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhBODA2CisjZGVmaW5lIE1UUF9SRVNQT05TRV9TUEVDSUZJQ0FUSU9OX0JZX0dST1VQX1VOU1VQUE9SVEVEICAgICAgICAgMHhBODA3CisjZGVmaW5lIE1UUF9SRVNQT05TRV9TUEVDSUZJQ0FUSU9OX0JZX0RFUFRIX1VOU1VQUE9SVEVEICAgICAgICAgMHhBODA4CisjZGVmaW5lIE1UUF9SRVNQT05TRV9PQkpFQ1RfVE9PX0xBUkdFICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhBODA5CisjZGVmaW5lIE1UUF9SRVNQT05TRV9PQkpFQ1RfUFJPUF9OT1RfU1VQUE9SVEVEICAgICAgICAgICAgICAgICAgMHhBODBBCisKKy8vIE1UUCBFdmVudCBDb2RlcworI2RlZmluZSBNVFBfRVZFTlRfVU5ERUZJTkVEICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMAorI2RlZmluZSBNVFBfRVZFTlRfQ0FOQ0VMX1RSQU5TQUNUSU9OICAgICAgICAgICAgICAgIDB4NDAwMQorI2RlZmluZSBNVFBfRVZFTlRfT0JKRUNUX0FEREVEICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMgorI2RlZmluZSBNVFBfRVZFTlRfT0JKRUNUX1JFTU9WRUQgICAgICAgICAgICAgICAgICAgIDB4NDAwMworI2RlZmluZSBNVFBfRVZFTlRfU1RPUkVfQURERUQgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwNAorI2RlZmluZSBNVFBfRVZFTlRfU1RPUkVfUkVNT1ZFRCAgICAgICAgICAgICAgICAgICAgIDB4NDAwNQorI2RlZmluZSBNVFBfRVZFTlRfREVWSUNFX1BST1BfQ0hBTkdFRCAgICAgICAgICAgICAgIDB4NDAwNgorI2RlZmluZSBNVFBfRVZFTlRfT0JKRUNUX0lORk9fQ0hBTkdFRCAgICAgICAgICAgICAgIDB4NDAwNworI2RlZmluZSBNVFBfRVZFTlRfREVWSUNFX0lORk9fQ0hBTkdFRCAgICAgICAgICAgICAgIDB4NDAwOAorI2RlZmluZSBNVFBfRVZFTlRfUkVRVUVTVF9PQkpFQ1RfVFJBTlNGRVIgICAgICAgICAgIDB4NDAwOQorI2RlZmluZSBNVFBfRVZFTlRfU1RPUkVfRlVMTCAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwQQorI2RlZmluZSBNVFBfRVZFTlRfREVWSUNFX1JFU0VUICAgICAgICAgICAgICAgICAgICAgIDB4NDAwQgorI2RlZmluZSBNVFBfRVZFTlRfU1RPUkFHRV9JTkZPX0NIQU5HRUQgICAgICAgICAgICAgIDB4NDAwQworI2RlZmluZSBNVFBfRVZFTlRfQ0FQVFVSRV9DT01QTEVURSAgICAgICAgICAgICAgICAgIDB4NDAwRAorI2RlZmluZSBNVFBfRVZFTlRfVU5SRVBPUlRFRF9TVEFUVVMgICAgICAgICAgICAgICAgIDB4NDAwRQorI2RlZmluZSBNVFBfRVZFTlRfT0JKRUNUX1BST1BfQ0hBTkdFRCAgICAgICAgICAgICAgIDB4QzgwMQorI2RlZmluZSBNVFBfRVZFTlRfT0JKRUNUX1BST1BfREVTQ19DSEFOR0VEICAgICAgICAgIDB4QzgwMgorI2RlZmluZSBNVFBfRVZFTlRfT0JKRUNUX1JFRkVSRU5DRVNfQ0hBTkdFRCAgICAgICAgIDB4QzgwMworCisvLyBTdG9yYWdlIFR5cGUKKyNkZWZpbmUgTVRQX1NUT1JBR0VfRklYRURfUk9NICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEKKyNkZWZpbmUgTVRQX1NUT1JBR0VfUkVNT1ZBQkxFX1JPTSAgICAgICAgICAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgTVRQX1NUT1JBR0VfRklYRURfUkFNICAgICAgICAgICAgICAgICAgICAgICAweDAwMDMKKyNkZWZpbmUgTVRQX1NUT1JBR0VfUkVNT1ZBQkxFX1JBTSAgICAgICAgICAgICAgICAgICAweDAwMDQKKworLy8gU3RvcmFnZSBGaWxlIFN5c3RlbQorI2RlZmluZSBNVFBfU1RPUkFHRV9GSUxFU1lTVEVNX0ZMQVQgICAgICAgICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBNVFBfU1RPUkFHRV9GSUxFU1lTVEVNX0hJRVJBUkNISUNBTCAgICAgICAgIDB4MDAwMgorI2RlZmluZSBNVFBfU1RPUkFHRV9GSUxFU1lTVEVNX0RDRiAgICAgICAgICAgICAgICAgIDB4MDAwMworCisvLyBTdG9yYWdlIEFjY2VzcyBDYXBhYmlsaXR5CisjZGVmaW5lIE1UUF9TVE9SQUdFX1JFQURfV1JJVEUgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwCisjZGVmaW5lIE1UUF9TVE9SQUdFX1JFQURfT05MWV9XSVRIT1VUX0RFTEVURSAgICAgICAgMHgwMDAxCisjZGVmaW5lIE1UUF9TVE9SQUdFX1JFQURfT05MWV9XSVRIX0RFTEVURSAgICAgICAgICAgMHgwMDAyCisKKy8vIEFzc29jaWF0aW9uIFR5cGUKKyNkZWZpbmUgTVRQX0FTU09DSUFUSU9OX1RZUEVfVU5ERUZJTkVEICAgICAgICAgICAgICAweDAwMDAKKyNkZWZpbmUgTVRQX0FTU09DSUFUSU9OX1RZUEVfR0VORVJJQ19GT0xERVIgICAgICAgICAweDAwMDEKKworI2VuZGlmIC8vIF9NVFBfSApkaWZmIC0tZ2l0IGEvbWVkaWEvdGVzdHMvQ2FtZXJhQnJvd3Nlci9BbmRyb2lkLm1rIGIvbWVkaWEvdGVzdHMvQ2FtZXJhQnJvd3Nlci9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzZDI5NzYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS90ZXN0cy9DYW1lcmFCcm93c2VyL0FuZHJvaWQubWsKQEAgLTAsMCArMSw4IEBACitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1zdWJkaXItamF2YS1maWxlcykKKworTE9DQUxfUEFDS0FHRV9OQU1FIDo9IENhbWVyYUJyb3dzZXIKKworaW5jbHVkZSAkKEJVSUxEX1BBQ0tBR0UpCmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9DYW1lcmFCcm93c2VyL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9tZWRpYS90ZXN0cy9DYW1lcmFCcm93c2VyL0FuZHJvaWRNYW5pZmVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFlMGIwMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3Rlc3RzL0NhbWVyYUJyb3dzZXIvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMCwwICsxLDI4IEBACis8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHBhY2thZ2U9ImNvbS5hbmRyb2lkLmNhbWVyYWJyb3dzZXIiPgorCisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5XUklURV9FWFRFUk5BTF9TVE9SQUdFIiAvPgorCisgICAgPGFwcGxpY2F0aW9uIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvYXBwX2xhYmVsIj4KKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iQ2FtZXJhQnJvd3NlciIgYW5kcm9pZDpsYWJlbD0iQ2FtZXJhIEJyb3dzZXIiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9IlN0b3JhZ2VCcm93c2VyIiAvPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJPYmplY3RCcm93c2VyIiAvPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJPYmplY3RWaWV3ZXIiIC8+CisKKyAgICAgICAgPHJlY2VpdmVyIGFuZHJvaWQ6bmFtZT0iVXNiUmVjZWl2ZXIiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaGFyZHdhcmUuYWN0aW9uLlVTQl9DQU1FUkFfQVRUQUNIRUQiIC8+CisgICAgICAgICAgICAgICAgPGRhdGEgYW5kcm9pZDpzY2hlbWU9ImNvbnRlbnQiLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9yZWNlaXZlcj4KKworICAgIDwvYXBwbGljYXRpb24+CisKKworPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL0NhbWVyYUJyb3dzZXIvcmVzL2xheW91dC9vYmplY3RfaW5mby54bWwgYi9tZWRpYS90ZXN0cy9DYW1lcmFCcm93c2VyL3Jlcy9sYXlvdXQvb2JqZWN0X2luZm8ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3ZmQ4MzAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS90ZXN0cy9DYW1lcmFCcm93c2VyL3Jlcy9sYXlvdXQvb2JqZWN0X2luZm8ueG1sCkBAIC0wLDAgKzEsMTQ3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorLyoKKyoqIENvcHlyaWdodCAyMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLS0+Cis8VGFibGVMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6aWQ9IkAraWQvb2JqZWN0X2luZm8iCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCI+CisgICAgPFRhYmxlUm93PgorICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9uYW1lX2xhYmVsIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL25hbWVfbGFiZWwiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJyaWdodCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSI4ZGlwIgorICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9pbmZvX2xhYmVsIiAvPgorCisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL25hbWUiCisgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL2luZm9fdmFsdWUiIC8+CisgICAgPC9UYWJsZVJvdz4KKyAgICA8VGFibGVSb3c+CisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL3NpemVfbGFiZWwiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvc2l6ZV9sYWJlbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9InJpZ2h0IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjhkaXAiCisgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL2luZm9fbGFiZWwiIC8+CisKKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvc2l6ZSIKKyAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvaW5mb192YWx1ZSIgLz4KKyAgICA8L1RhYmxlUm93PgorICAgIDxUYWJsZVJvdz4KKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvdGh1bWJfd2lkdGhfbGFiZWwiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvdGh1bWJfd2lkdGhfbGFiZWwiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJyaWdodCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSI4ZGlwIgorICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9pbmZvX2xhYmVsIiAvPgorCisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL3RodW1iX3dpZHRoIgorICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9pbmZvX3ZhbHVlIiAvPgorICAgIDwvVGFibGVSb3c+CisgICAgPFRhYmxlUm93PgorICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC90aHVtYl9oZWlnaHRfbGFiZWwiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvdGh1bWJfaGVpZ2h0X2xhYmVsIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0icmlnaHQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iOGRpcCIKKyAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvaW5mb19sYWJlbCIgLz4KKworICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC90aHVtYl9oZWlnaHQiCisgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL2luZm9fdmFsdWUiIC8+CisgICAgPC9UYWJsZVJvdz4KKyAgICA8VGFibGVSb3c+CisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL3RodW1iX3NpemVfbGFiZWwiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvdGh1bWJfc2l6ZV9sYWJlbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9InJpZ2h0IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjhkaXAiCisgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL2luZm9fbGFiZWwiIC8+CisKKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvdGh1bWJfc2l6ZSIKKyAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvaW5mb192YWx1ZSIgLz4KKyAgICA8L1RhYmxlUm93PgorICAgIDxUYWJsZVJvdz4KKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvd2lkdGhfbGFiZWwiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvd2lkdGhfbGFiZWwiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJyaWdodCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSI4ZGlwIgorICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9pbmZvX2xhYmVsIiAvPgorCisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL3dpZHRoIgorICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9pbmZvX3ZhbHVlIiAvPgorICAgIDwvVGFibGVSb3c+CisgICAgPFRhYmxlUm93PgorICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9oZWlnaHRfbGFiZWwiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvaGVpZ2h0X2xhYmVsIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0icmlnaHQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iOGRpcCIKKyAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvaW5mb19sYWJlbCIgLz4KKworICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9oZWlnaHQiCisgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL2luZm9fdmFsdWUiIC8+CisgICAgPC9UYWJsZVJvdz4KKyAgICA8VGFibGVSb3c+CisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL2RlcHRoX2xhYmVsIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2RlcHRoX2xhYmVsIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0icmlnaHQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iOGRpcCIKKyAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvaW5mb19sYWJlbCIgLz4KKworICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9kZXB0aCIKKyAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvaW5mb192YWx1ZSIgLz4KKyAgICA8L1RhYmxlUm93PgorICAgIDxUYWJsZVJvdz4KKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvc2VxdWVuY2VfbGFiZWwiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvc2VxdWVuY2VfbGFiZWwiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJyaWdodCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSI4ZGlwIgorICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9pbmZvX2xhYmVsIiAvPgorCisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL3NlcXVlbmNlIgorICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9pbmZvX3ZhbHVlIiAvPgorICAgIDwvVGFibGVSb3c+CisgICAgPFRhYmxlUm93PgorICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9jcmVhdGVkX2xhYmVsIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2NyZWF0ZWRfbGFiZWwiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJyaWdodCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSI4ZGlwIgorICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9pbmZvX2xhYmVsIiAvPgorCisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL2NyZWF0ZWQiCisgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL2luZm9fdmFsdWUiIC8+CisgICAgPC9UYWJsZVJvdz4KKyAgICA8VGFibGVSb3c+CisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL21vZGlmaWVkX2xhYmVsIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL21vZGlmaWVkX2xhYmVsIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0icmlnaHQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iOGRpcCIKKyAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvaW5mb19sYWJlbCIgLz4KKworICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9tb2RpZmllZCIKKyAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvaW5mb192YWx1ZSIgLz4KKyAgICA8L1RhYmxlUm93PgorICAgIDxUYWJsZVJvdz4KKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQva2V5d29yZHNfbGFiZWwiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcva2V5d29yZHNfbGFiZWwiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJyaWdodCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSI4ZGlwIgorICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9pbmZvX2xhYmVsIiAvPgorCisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL2tleXdvcmRzIgorICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9pbmZvX3ZhbHVlIiAvPgorICAgIDwvVGFibGVSb3c+CisgICAgPFRhYmxlUm93PgorICAgICAgICA8SW1hZ2VWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvdGh1bWJuYWlsIiAvPgorICAgIDwvVGFibGVSb3c+Cis8L1RhYmxlTGF5b3V0PgorCmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9DYW1lcmFCcm93c2VyL3Jlcy9sYXlvdXQvb2JqZWN0X2xpc3QueG1sIGIvbWVkaWEvdGVzdHMvQ2FtZXJhQnJvd3Nlci9yZXMvbGF5b3V0L29iamVjdF9saXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGMxOGJiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdGVzdHMvQ2FtZXJhQnJvd3Nlci9yZXMvbGF5b3V0L29iamVjdF9saXN0LnhtbApAQCAtMCwwICsxLDMzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICAKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiIAorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iZmlsbF9wYXJlbnQiPgorICAgIAorICAgIDxJbWFnZVZpZXcgYW5kcm9pZDppZD0iQCtpZC90aHVtYm5haWwiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IiAvPgorCisgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvbmFtZSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VMYXJnZSIKKyAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfdmVydGljYWwiCisgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjZkaXAiCisgICAgICAgIGFuZHJvaWQ6bWluSGVpZ2h0PSI/YW5kcm9pZDphdHRyL2xpc3RQcmVmZXJyZWRJdGVtSGVpZ2h0IiAvPgorPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9DYW1lcmFCcm93c2VyL3Jlcy9tZW51L29iamVjdF9tZW51LnhtbCBiL21lZGlhL3Rlc3RzL0NhbWVyYUJyb3dzZXIvcmVzL21lbnUvb2JqZWN0X21lbnUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwODY1ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS90ZXN0cy9DYW1lcmFCcm93c2VyL3Jlcy9tZW51L29iamVjdF9tZW51LnhtbApAQCAtMCwwICsxLDIzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8bWVudSB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorCisgICAgPGl0ZW0gYW5kcm9pZDppZD0iQCtpZC9zYXZlIgorICAgICAgICBhbmRyb2lkOnRpdGxlPSJAc3RyaW5nL3NhdmVfaXRlbSIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmlkPSJAK2lkL2RlbGV0ZSIKKyAgICAgICAgYW5kcm9pZDp0aXRsZT0iQHN0cmluZy9kZWxldGVfaXRlbSIgLz4KKzwvbWVudT4KZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL0NhbWVyYUJyb3dzZXIvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbCBiL21lZGlhL3Rlc3RzL0NhbWVyYUJyb3dzZXIvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmM1MTExCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdGVzdHMvQ2FtZXJhQnJvd3Nlci9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCkBAIC0wLDAgKzEsNDQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxyZXNvdXJjZXM+CisgICAgPHN0cmluZyBuYW1lPSJhcHBfbGFiZWwiPkNhbWVyYSBCcm93c2VyPC9zdHJpbmc+CisKKyAgICA8IS0tIGZvciBvYmplY3QgaW5mbyAtLT4KKyAgICA8c3RyaW5nIG5hbWU9Im5hbWVfbGFiZWwiPk5hbWU6IDwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2l6ZV9sYWJlbCI+U2l6ZTogPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ0aHVtYl93aWR0aF9sYWJlbCI+VGh1bWIgV2lkdGg6IDwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idGh1bWJfaGVpZ2h0X2xhYmVsIj5UaHVtYiBIZWlnaHQ6IDwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idGh1bWJfc2l6ZV9sYWJlbCI+VGh1bWIgU2l6ZTogPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ3aWR0aF9sYWJlbCI+V2lkdGg6IDwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iaGVpZ2h0X2xhYmVsIj5IZWlnaHQ6IDwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGVwdGhfbGFiZWwiPkRlcHRoOiA8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InNlcXVlbmNlX2xhYmVsIj5TZXF1ZW5jZTogPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjcmVhdGVkX2xhYmVsIj5DcmVhdGVkOiA8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1vZGlmaWVkX2xhYmVsIj5Nb2RpZmllZDogPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJrZXl3b3Jkc19sYWJlbCI+S2V5d29yZHM6IDwvc3RyaW5nPgorCisgICAgPCEtLSBtZW51IGl0ZW1zIC0tPgorICAgIDxzdHJpbmcgbmFtZT0ic2F2ZV9pdGVtIj5TYXZlPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkZWxldGVfaXRlbSI+RGVsZXRlPC9zdHJpbmc+CisKKyAgICA8IS0tIHRvYXN0cyAtLT4KKyAgICA8c3RyaW5nIG5hbWU9Im9iamVjdF9zYXZlZF9tZXNzYWdlIj5PYmplY3Qgc2F2ZWQ8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InNhdmVfZmFpbGVkX21lc3NhZ2UiPkNvdWxkIG5vdCBzYXZlIG9iamVjdDwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ib2JqZWN0X2RlbGV0ZWRfbWVzc2FnZSI+T2JqZWN0IGRlbGV0ZWQ8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRlbGV0ZV9mYWlsZWRfbWVzc2FnZSI+Q291bGQgbm90IGRlbGV0ZSBvYmplY3Q8L3N0cmluZz4KKworPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9DYW1lcmFCcm93c2VyL3Jlcy92YWx1ZXMvc3R5bGVzLnhtbCBiL21lZGlhL3Rlc3RzL0NhbWVyYUJyb3dzZXIvcmVzL3ZhbHVlcy9zdHlsZXMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4Njk5ODUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS90ZXN0cy9DYW1lcmFCcm93c2VyL3Jlcy92YWx1ZXMvc3R5bGVzLnhtbApAQCAtMCwwICsxLDM0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8cmVzb3VyY2VzPgorICAgIDxzdHlsZSBuYW1lPSJpbmZvX2xhYmVsIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfaGVpZ2h0Ij53cmFwX2NvbnRlbnQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X3dpZHRoIj53cmFwX2NvbnRlbnQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dFNpemUiPjE0c3A8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dFN0eWxlIj5ib2xkPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnBhZGRpbmdSaWdodCI+NGRpcDwvaXRlbT4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9ImluZm9fdmFsdWUiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9oZWlnaHQiPndyYXBfY29udGVudDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfd2lkdGgiPndyYXBfY29udGVudDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0U2l6ZSI+MTRzcDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0U3R5bGUiPm5vcm1hbDwvaXRlbT4KKyAgICA8L3N0eWxlPgorCis8L3Jlc291cmNlcz4KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvdGVzdHMvQ2FtZXJhQnJvd3Nlci9zcmMvY29tL2FuZHJvaWQvY2FtZXJhYnJvd3Nlci9DYW1lcmFCcm93c2VyLmphdmEgYi9tZWRpYS90ZXN0cy9DYW1lcmFCcm93c2VyL3NyYy9jb20vYW5kcm9pZC9jYW1lcmFicm93c2VyL0NhbWVyYUJyb3dzZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDQ4NzNhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdGVzdHMvQ2FtZXJhQnJvd3Nlci9zcmMvY29tL2FuZHJvaWQvY2FtZXJhYnJvd3Nlci9DYW1lcmFCcm93c2VyLmphdmEKQEAgLTAsMCArMSwxMDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmNhbWVyYWJyb3dzZXI7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5MaXN0QWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ29udGVudE9ic2VydmVyOworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yOworaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5NdHA7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaXN0QWRhcHRlcjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaXN0VmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5TaW1wbGVDdXJzb3JBZGFwdGVyOworCisgLyoqCisgKiBBIGxpc3QgdmlldyBkaXNwbGF5aW5nIGFsbCBjb25uZWN0ZWQgY2FtZXJhcy4KKyAqLworcHVibGljIGNsYXNzIENhbWVyYUJyb3dzZXIgZXh0ZW5kcyBMaXN0QWN0aXZpdHkgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJDYW1lcmFCcm93c2VyIjsKKworICAgIHByaXZhdGUgTGlzdEFkYXB0ZXIgbUFkYXB0ZXI7CisgICAgcHJpdmF0ZSBDb250ZW50UmVzb2x2ZXIgbVJlc29sdmVyOworICAgIHByaXZhdGUgRGV2aWNlT2JzZXJ2ZXIgbURldmljZU9ic2VydmVyOworICAgIHByaXZhdGUgQ3Vyc29yIG1DdXJzb3I7CisKKyAgICBwcml2YXRlIGNsYXNzIERldmljZU9ic2VydmVyIGV4dGVuZHMgQ29udGVudE9ic2VydmVyIHsKKyAgICAgICAgRGV2aWNlT2JzZXJ2ZXIoSGFuZGxlciBoYW5kbGVyKSB7CisgICAgICAgICAgICBzdXBlcihoYW5kbGVyKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkNoYW5nZShib29sZWFuIHNlbGZDaGFuZ2UpIHsKKyAgICAgICAgICAgIExvZy5kKFRBRywgIkRldmljZU9ic2VydmVyLm9uQ2hhbmdlIik7CisgICAgICAgICAgICBpZiAobUN1cnNvciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUN1cnNvci5yZXF1ZXJ5KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBERVZJQ0VfQ09MVU1OUyA9CisgICAgICAgICBuZXcgU3RyaW5nW10geyBNdHAuRGV2aWNlLl9JRCwgTXRwLkRldmljZS5NQU5VRkFDVFVSRVIsIE10cC5EZXZpY2UuTU9ERUwgfTsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICAgICAgbVJlc29sdmVyID0gZ2V0Q29udGVudFJlc29sdmVyKCk7CisgICAgICAgIG1EZXZpY2VPYnNlcnZlciA9IG5ldyBEZXZpY2VPYnNlcnZlcihuZXcgSGFuZGxlcigpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvblJlc3VtZSgpIHsKKyAgICAgICAgc3VwZXIub25SZXN1bWUoKTsKKworICAgICAgICBDdXJzb3IgYyA9IGdldENvbnRlbnRSZXNvbHZlcigpLnF1ZXJ5KE10cC5EZXZpY2UuQ09OVEVOVF9VUkksCisgICAgICAgICAgICAgICAgREVWSUNFX0NPTFVNTlMsIG51bGwsIG51bGwsIG51bGwpOworICAgICAgICBMb2cuZChUQUcsICJxdWVyeSByZXR1cm5lZCAiICsgYyk7CisgICAgICAgIHN0YXJ0TWFuYWdpbmdDdXJzb3IoYyk7CisgICAgICAgIG1DdXJzb3IgPSBjOworCisgICAgICAgIC8vIE1hcCBDdXJzb3IgY29sdW1ucyB0byB2aWV3cyBkZWZpbmVkIGluIHNpbXBsZV9saXN0X2l0ZW1fMi54bWwKKyAgICAgICAgbUFkYXB0ZXIgPSBuZXcgU2ltcGxlQ3Vyc29yQWRhcHRlcih0aGlzLAorICAgICAgICAgICAgICAgIGFuZHJvaWQuUi5sYXlvdXQuc2ltcGxlX2xpc3RfaXRlbV8yLCBjLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgTXRwLkRldmljZS5NQU5VRkFDVFVSRVIsIE10cC5EZXZpY2UuTU9ERUwgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBpbnRbXSB7IGFuZHJvaWQuUi5pZC50ZXh0MSwgYW5kcm9pZC5SLmlkLnRleHQyIH0pOworICAgICAgICBzZXRMaXN0QWRhcHRlcihtQWRhcHRlcik7CisKKyAgICAgICAgLy8gcmVnaXN0ZXIgZm9yIGNoYW5nZXMgdG8gdGhlIGRldmljZSBsaXN0CisgICAgICAgIG1SZXNvbHZlci5yZWdpc3RlckNvbnRlbnRPYnNlcnZlcihNdHAuRGV2aWNlLkNPTlRFTlRfVVJJLCB0cnVlLCBtRGV2aWNlT2JzZXJ2ZXIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uUGF1c2UoKSB7CisgICAgICAgIHN1cGVyLm9uUGF1c2UoKTsKKyAgICAgICAgbVJlc29sdmVyLnVucmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIobURldmljZU9ic2VydmVyKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkxpc3RJdGVtQ2xpY2soTGlzdFZpZXcgbCwgVmlldyB2LCBpbnQgcG9zaXRpb24sIGxvbmcgaWQpIHsKKyAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQodGhpcywgU3RvcmFnZUJyb3dzZXIuY2xhc3MpOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoImRldmljZSIsIChpbnQpbUFkYXB0ZXIuZ2V0SXRlbUlkKHBvc2l0aW9uKSk7CisgICAgICAgIHN0YXJ0QWN0aXZpdHkoaW50ZW50KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9DYW1lcmFCcm93c2VyL3NyYy9jb20vYW5kcm9pZC9jYW1lcmFicm93c2VyL09iamVjdEJyb3dzZXIuamF2YSBiL21lZGlhL3Rlc3RzL0NhbWVyYUJyb3dzZXIvc3JjL2NvbS9hbmRyb2lkL2NhbWVyYWJyb3dzZXIvT2JqZWN0QnJvd3Nlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwMDIwMjgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS90ZXN0cy9DYW1lcmFCcm93c2VyL3NyYy9jb20vYW5kcm9pZC9jYW1lcmFicm93c2VyL09iamVjdEJyb3dzZXIuamF2YQpAQCAtMCwwICsxLDE0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuY2FtZXJhYnJvd3NlcjsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkxpc3RBY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwRmFjdG9yeTsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5NdHA7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5BZGFwdGVyVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGlzdFZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuUmVzb3VyY2VDdXJzb3JBZGFwdGVyOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OworCisgLyoqCisgKiBBIGxpc3QgdmlldyBkaXNwbGF5aW5nIGFsbCBvYmplY3RzIHdpdGhpbiBhIGNvbnRhaW5lciAoZm9sZGVyIG9yIHN0b3JhZ2UgdW5pdCkuCisgKi8KK3B1YmxpYyBjbGFzcyBPYmplY3RCcm93c2VyIGV4dGVuZHMgTGlzdEFjdGl2aXR5IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiT2JqZWN0QnJvd3NlciI7CisKKyAgICBwcml2YXRlIEN1cnNvciBtQ3Vyc29yOworICAgIHByaXZhdGUgT2JqZWN0Q3Vyc29yQWRhcHRlciBtQWRhcHRlcjsKKyAgICBwcml2YXRlIGludCBtRGV2aWNlSUQ7CisgICAgcHJpdmF0ZSBpbnQgbVN0b3JhZ2VJRDsKKyAgICBwcml2YXRlIGludCBtT2JqZWN0SUQ7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBPQkpFQ1RfQ09MVU1OUyA9CisgICAgICAgIG5ldyBTdHJpbmdbXSB7IE10cC5PYmplY3QuX0lELCBNdHAuT2JqZWN0Lk5BTUUsIE10cC5PYmplY3QuRk9STUFULCBNdHAuT2JqZWN0LlRIVU1CIH07CisKKyAgICBzdGF0aWMgZmluYWwgaW50IElEX0NPTFVNTiA9IDA7CisgICAgc3RhdGljIGZpbmFsIGludCBOQU1FX0NPTFVNTiA9IDE7CisgICAgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfQ09MVU1OID0gMjsKKyAgICBzdGF0aWMgZmluYWwgaW50IFRIVU1CX0NPTFVNTiA9IDM7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25SZXN1bWUoKSB7CisgICAgICAgIHN1cGVyLm9uUmVzdW1lKCk7CisKKyAgICAgICAgbURldmljZUlEID0gZ2V0SW50ZW50KCkuZ2V0SW50RXh0cmEoImRldmljZSIsIDApOworICAgICAgICBtU3RvcmFnZUlEID0gZ2V0SW50ZW50KCkuZ2V0SW50RXh0cmEoInN0b3JhZ2UiLCAwKTsKKyAgICAgICAgbU9iamVjdElEID0gZ2V0SW50ZW50KCkuZ2V0SW50RXh0cmEoIm9iamVjdCIsIDApOworICAgICAgICBpZiAobURldmljZUlEICE9IDAgJiYgbVN0b3JhZ2VJRCAhPSAwKSB7CisgICAgICAgICAgICBDdXJzb3IgYzsKKyAgICAgICAgICAgIFVyaSB1cmk7CisgICAgICAgICAgICBpZiAobU9iamVjdElEID09IDApIHsKKyAgICAgICAgICAgICAgICB1cmkgPSBNdHAuT2JqZWN0LmdldENvbnRlbnRVcmlGb3JTdG9yYWdlQ2hpbGRyZW4obURldmljZUlELCBtU3RvcmFnZUlEKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdXJpID0gTXRwLk9iamVjdC5nZXRDb250ZW50VXJpRm9yT2JqZWN0Q2hpbGRyZW4obURldmljZUlELCBtT2JqZWN0SUQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgTG9nLmQoVEFHLCAicXVlcnkgIiArIHVyaSk7CisgICAgICAgICAgICBjID0gZ2V0Q29udGVudFJlc29sdmVyKCkucXVlcnkodXJpLCBPQkpFQ1RfQ09MVU1OUywgbnVsbCwgbnVsbCwgbnVsbCk7CisgICAgICAgICAgICBzdGFydE1hbmFnaW5nQ3Vyc29yKGMpOworICAgICAgICAgICAgbUN1cnNvciA9IGM7CisKKyAgICAgICAgICAgIC8vIE1hcCBDdXJzb3IgY29sdW1ucyB0byB2aWV3cyBkZWZpbmVkIGluIHNpbXBsZV9saXN0X2l0ZW1fMS54bWwKKyAgICAgICAgICAgIG1BZGFwdGVyID0gbmV3IE9iamVjdEN1cnNvckFkYXB0ZXIodGhpcywgYyk7CisgICAgICAgICAgICBzZXRMaXN0QWRhcHRlcihtQWRhcHRlcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkxpc3RJdGVtQ2xpY2soTGlzdFZpZXcgbCwgVmlldyB2LCBpbnQgcG9zaXRpb24sIGxvbmcgaWQpIHsKKyAgICAgICAgaW50IHJvd0lEID0gKGludCltQWRhcHRlci5nZXRJdGVtSWQocG9zaXRpb24pOworICAgICAgICBDdXJzb3IgYyA9IGdldENvbnRlbnRSZXNvbHZlcigpLnF1ZXJ5KAorICAgICAgICAgICAgICAgICAgICAgICAgTXRwLk9iamVjdC5nZXRDb250ZW50VXJpKG1EZXZpY2VJRCwgcm93SUQpLAorICAgICAgICAgICAgICAgICAgICAgICAgT0JKRUNUX0NPTFVNTlMsIG51bGwsIG51bGwsIG51bGwpOworICAgICAgICBMb2cuZChUQUcsICJxdWVyeSByZXR1cm5lZCAiICsgYyArICIgY291bnQ6ICIgKyBjLmdldENvdW50KCkpOworICAgICAgICBsb25nIGZvcm1hdCA9IDA7CisgICAgICAgIGlmIChjICE9IG51bGwgJiYgYy5nZXRDb3VudCgpID09IDEpIHsKKyAgICAgICAgICAgIGMubW92ZVRvRmlyc3QoKTsKKyAgICAgICAgICAgIGxvbmcgcm93SWQgPSBjLmdldExvbmcoSURfQ09MVU1OKTsKKyAgICAgICAgICAgIFN0cmluZyBuYW1lID0gYy5nZXRTdHJpbmcoTkFNRV9DT0xVTU4pOworICAgICAgICAgICAgZm9ybWF0ID0gYy5nZXRMb25nKEZPUk1BVF9DT0xVTU4pOworICAgICAgICAgICAgTG9nLmQoVEFHLCAicm93SWQ6ICIgKyByb3dJZCArICIgbmFtZTogIiArIG5hbWUgKyAiIGZvcm1hdDogIiArIGZvcm1hdCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZvcm1hdCA9PSBNdHAuT2JqZWN0LkZPUk1BVF9KRklGKSB7CisgICAgICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudCh0aGlzLCBPYmplY3RWaWV3ZXIuY2xhc3MpOworICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKCJkZXZpY2UiLCBtRGV2aWNlSUQpOworICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKCJzdG9yYWdlIiwgbVN0b3JhZ2VJRCk7CisgICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoIm9iamVjdCIscm93SUQpOworICAgICAgICAgICAgc3RhcnRBY3Rpdml0eShpbnRlbnQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQodGhpcywgT2JqZWN0QnJvd3Nlci5jbGFzcyk7CisgICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoImRldmljZSIsIG1EZXZpY2VJRCk7CisgICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoInN0b3JhZ2UiLCBtU3RvcmFnZUlEKTsKKyAgICAgICAgICAgIGludGVudC5wdXRFeHRyYSgib2JqZWN0Iiwgcm93SUQpOworICAgICAgICAgICAgc3RhcnRBY3Rpdml0eShpbnRlbnQpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBPYmplY3RDdXJzb3JBZGFwdGVyIGV4dGVuZHMgUmVzb3VyY2VDdXJzb3JBZGFwdGVyIHsKKworICAgICAgICBwdWJsaWMgT2JqZWN0Q3Vyc29yQWRhcHRlcihDb250ZXh0IGNvbnRleHQsIEN1cnNvciBjKSB7CisgICAgICAgICAgICBzdXBlcihjb250ZXh0LCBSLmxheW91dC5vYmplY3RfbGlzdCwgYyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgYmluZFZpZXcoVmlldyB2aWV3LCBDb250ZXh0IGNvbnRleHQsIEN1cnNvciBjdXJzb3IpIHsKKyAgICAgICAgICAgIEltYWdlVmlldyB0aHVtYlZpZXcgPSAoSW1hZ2VWaWV3KXZpZXcuZmluZFZpZXdCeUlkKFIuaWQudGh1bWJuYWlsKTsKKyAgICAgICAgICAgIFRleHRWaWV3IG5hbWVWaWV3ID0gKFRleHRWaWV3KXZpZXcuZmluZFZpZXdCeUlkKFIuaWQubmFtZSk7CisKKyAgICAgICAgICAgIC8vIGdldCB0aGUgdGh1bWJuYWlsCisgICAgICAgICAgICBieXRlW10gdGh1bWJuYWlsID0gY3Vyc29yLmdldEJsb2IoVEhVTUJfQ09MVU1OKTsKKyAgICAgICAgICAgIGlmICh0aHVtYm5haWwgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIEJpdG1hcCBiaXRtYXAgPSBCaXRtYXBGYWN0b3J5LmRlY29kZUJ5dGVBcnJheSh0aHVtYm5haWwsIDAsIHRodW1ibmFpbC5sZW5ndGgpOworICAgICAgICAgICAgICAgIGlmIChiaXRtYXAgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0aHVtYlZpZXcuc2V0SW1hZ2VCaXRtYXAoYml0bWFwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGdldCB0aGUgbmFtZQorICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBjdXJzb3IuZ2V0U3RyaW5nKE5BTUVfQ09MVU1OKTsKKyAgICAgICAgICAgIGlmIChuYW1lID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBuYW1lID0gIiI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBuYW1lVmlldy5zZXRUZXh0KG5hbWUpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvdGVzdHMvQ2FtZXJhQnJvd3Nlci9zcmMvY29tL2FuZHJvaWQvY2FtZXJhYnJvd3Nlci9PYmplY3RWaWV3ZXIuamF2YSBiL21lZGlhL3Rlc3RzL0NhbWVyYUJyb3dzZXIvc3JjL2NvbS9hbmRyb2lkL2NhbWVyYWJyb3dzZXIvT2JqZWN0Vmlld2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE0OWNkOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3Rlc3RzL0NhbWVyYUJyb3dzZXIvc3JjL2NvbS9hbmRyb2lkL2NhbWVyYWJyb3dzZXIvT2JqZWN0Vmlld2VyLmphdmEKQEAgLTAsMCArMSwyNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5jYW1lcmFicm93c2VyOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcEZhY3Rvcnk7CitpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuRW52aXJvbm1lbnQ7CitpbXBvcnQgYW5kcm9pZC5vcy5GaWxlVXRpbHM7CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlByb2Nlc3M7CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5NdHA7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUluZmxhdGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SXRlbTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVG9hc3Q7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlRGVzY3JpcHRvcjsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOworaW1wb3J0IGphdmEudXRpbC5EYXRlOworCisvKioKKyAqIEEgdmlldyB0byBkaXNwbGF5IHRoZSBwcm9wZXJ0aWVzIG9mIGFuIG9iamVjdC4KKyAqLworcHVibGljIGNsYXNzIE9iamVjdFZpZXdlciBleHRlbmRzIEFjdGl2aXR5IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiT2JqZWN0Vmlld2VyIjsKKworICAgIHByaXZhdGUgaW50IG1EZXZpY2VJRDsKKyAgICBwcml2YXRlIGludCBtU3RvcmFnZUlEOworICAgIHByaXZhdGUgaW50IG1PYmplY3RJRDsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIE9CSkVDVF9DT0xVTU5TID0KKyAgICAgICAgbmV3IFN0cmluZ1tdIHsgIE10cC5PYmplY3QuX0lELAorICAgICAgICAgICAgICAgICAgICAgICAgTXRwLk9iamVjdC5OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgTXRwLk9iamVjdC5TSVpFLAorICAgICAgICAgICAgICAgICAgICAgICAgTXRwLk9iamVjdC5USFVNQl9XSURUSCwKKyAgICAgICAgICAgICAgICAgICAgICAgIE10cC5PYmplY3QuVEhVTUJfSEVJR0hULAorICAgICAgICAgICAgICAgICAgICAgICAgTXRwLk9iamVjdC5USFVNQl9TSVpFLAorICAgICAgICAgICAgICAgICAgICAgICAgTXRwLk9iamVjdC5JTUFHRV9XSURUSCwKKyAgICAgICAgICAgICAgICAgICAgICAgIE10cC5PYmplY3QuSU1BR0VfSEVJR0hULAorICAgICAgICAgICAgICAgICAgICAgICAgTXRwLk9iamVjdC5JTUFHRV9ERVBUSCwKKyAgICAgICAgICAgICAgICAgICAgICAgIE10cC5PYmplY3QuU0VRVUVOQ0VfTlVNQkVSLAorICAgICAgICAgICAgICAgICAgICAgICAgTXRwLk9iamVjdC5EQVRFX0NSRUFURUQsCisgICAgICAgICAgICAgICAgICAgICAgICBNdHAuT2JqZWN0LkRBVEVfTU9ESUZJRUQsCisgICAgICAgICAgICAgICAgICAgICAgICBNdHAuT2JqZWN0LktFWVdPUkRTLAorICAgICAgICAgICAgICAgICAgICAgICAgTXRwLk9iamVjdC5USFVNQiwKKyAgICAgICAgICAgICAgICAgICAgICAgIH07CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisKKyAgICAgICAgc2V0Q29udGVudFZpZXcoUi5sYXlvdXQub2JqZWN0X2luZm8pOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uUmVzdW1lKCkgeworICAgICAgICBzdXBlci5vblJlc3VtZSgpOworCisgICAgICAgIG1EZXZpY2VJRCA9IGdldEludGVudCgpLmdldEludEV4dHJhKCJkZXZpY2UiLCAwKTsKKyAgICAgICAgbVN0b3JhZ2VJRCA9IGdldEludGVudCgpLmdldEludEV4dHJhKCJzdG9yYWdlIiwgMCk7CisgICAgICAgIG1PYmplY3RJRCA9IGdldEludGVudCgpLmdldEludEV4dHJhKCJvYmplY3QiLCAwKTsKKworICAgICAgICBpZiAobURldmljZUlEICE9IDAgJiYgbU9iamVjdElEICE9IDApIHsKKyAgICAgICAgQ3Vyc29yIGMgPSBnZXRDb250ZW50UmVzb2x2ZXIoKS5xdWVyeSgKKyAgICAgICAgICAgICAgICAgICAgICAgIE10cC5PYmplY3QuZ2V0Q29udGVudFVyaShtRGV2aWNlSUQsIG1PYmplY3RJRCksCisgICAgICAgICAgICAgICAgICAgICAgICBPQkpFQ1RfQ09MVU1OUywgbnVsbCwgbnVsbCwgbnVsbCk7CisgICAgICAgICAgICBjLm1vdmVUb0ZpcnN0KCk7CisgICAgICAgICAgICBUZXh0VmlldyB2aWV3ID0gKFRleHRWaWV3KWZpbmRWaWV3QnlJZChSLmlkLm5hbWUpOworICAgICAgICAgICAgdmlldy5zZXRUZXh0KGMuZ2V0U3RyaW5nKDEpKTsKKyAgICAgICAgICAgIHZpZXcgPSAoVGV4dFZpZXcpZmluZFZpZXdCeUlkKFIuaWQuc2l6ZSk7CisgICAgICAgICAgICB2aWV3LnNldFRleHQoTG9uZy50b1N0cmluZyhjLmdldExvbmcoMikpKTsKKyAgICAgICAgICAgIHZpZXcgPSAoVGV4dFZpZXcpZmluZFZpZXdCeUlkKFIuaWQudGh1bWJfd2lkdGgpOworICAgICAgICAgICAgdmlldy5zZXRUZXh0KExvbmcudG9TdHJpbmcoYy5nZXRMb25nKDMpKSk7CisgICAgICAgICAgICB2aWV3ID0gKFRleHRWaWV3KWZpbmRWaWV3QnlJZChSLmlkLnRodW1iX2hlaWdodCk7CisgICAgICAgICAgICB2aWV3LnNldFRleHQoTG9uZy50b1N0cmluZyhjLmdldExvbmcoNCkpKTsKKyAgICAgICAgICAgIHZpZXcgPSAoVGV4dFZpZXcpZmluZFZpZXdCeUlkKFIuaWQudGh1bWJfc2l6ZSk7CisgICAgICAgICAgICB2aWV3LnNldFRleHQoTG9uZy50b1N0cmluZyhjLmdldExvbmcoNSkpKTsKKyAgICAgICAgICAgIHZpZXcgPSAoVGV4dFZpZXcpZmluZFZpZXdCeUlkKFIuaWQud2lkdGgpOworICAgICAgICAgICAgdmlldy5zZXRUZXh0KExvbmcudG9TdHJpbmcoYy5nZXRMb25nKDYpKSk7CisgICAgICAgICAgICB2aWV3ID0gKFRleHRWaWV3KWZpbmRWaWV3QnlJZChSLmlkLmhlaWdodCk7CisgICAgICAgICAgICB2aWV3LnNldFRleHQoTG9uZy50b1N0cmluZyhjLmdldExvbmcoNykpKTsKKyAgICAgICAgICAgIHZpZXcgPSAoVGV4dFZpZXcpZmluZFZpZXdCeUlkKFIuaWQuZGVwdGgpOworICAgICAgICAgICAgdmlldy5zZXRUZXh0KExvbmcudG9TdHJpbmcoYy5nZXRMb25nKDgpKSk7CisgICAgICAgICAgICB2aWV3ID0gKFRleHRWaWV3KWZpbmRWaWV3QnlJZChSLmlkLnNlcXVlbmNlKTsKKyAgICAgICAgICAgIHZpZXcuc2V0VGV4dChMb25nLnRvU3RyaW5nKGMuZ2V0TG9uZyg5KSkpOworICAgICAgICAgICAgdmlldyA9IChUZXh0VmlldylmaW5kVmlld0J5SWQoUi5pZC5jcmVhdGVkKTsKKyAgICAgICAgICAgIERhdGUgZGF0ZSA9IG5ldyBEYXRlKGMuZ2V0TG9uZygxMCkgKiAxMDAwKTsKKyAgICAgICAgICAgIHZpZXcuc2V0VGV4dChkYXRlLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgdmlldyA9IChUZXh0VmlldylmaW5kVmlld0J5SWQoUi5pZC5tb2RpZmllZCk7CisgICAgICAgICAgICBkYXRlID0gbmV3IERhdGUoYy5nZXRMb25nKDExKSAqIDEwMDApOworICAgICAgICAgICAgdmlldy5zZXRUZXh0KGRhdGUudG9TdHJpbmcoKSk7CisgICAgICAgICAgICB2aWV3ID0gKFRleHRWaWV3KWZpbmRWaWV3QnlJZChSLmlkLmtleXdvcmRzKTsKKyAgICAgICAgICAgIHZpZXcuc2V0VGV4dChjLmdldFN0cmluZygxMikpOworICAgICAgICAgICAgYnl0ZVtdIHRodW1ibmFpbCA9IGMuZ2V0QmxvYigxMyk7CisgICAgICAgICAgICBpZiAodGh1bWJuYWlsICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBJbWFnZVZpZXcgdGh1bWJWaWV3ID0gKEltYWdlVmlldylmaW5kVmlld0J5SWQoUi5pZC50aHVtYm5haWwpOworICAgICAgICAgICAgICAgIEJpdG1hcCBiaXRtYXAgPSBCaXRtYXBGYWN0b3J5LmRlY29kZUJ5dGVBcnJheSh0aHVtYm5haWwsIDAsIHRodW1ibmFpbC5sZW5ndGgpOworICAgICAgICAgICAgICAgIGlmIChiaXRtYXAgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0aHVtYlZpZXcuc2V0SW1hZ2VCaXRtYXAoYml0bWFwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBvbkNyZWF0ZU9wdGlvbnNNZW51KE1lbnUgbWVudSkgeworICAgICAgICBNZW51SW5mbGF0ZXIgaW5mbGF0ZXIgPSBnZXRNZW51SW5mbGF0ZXIoKTsKKyAgICAgICAgaW5mbGF0ZXIuaW5mbGF0ZShSLm1lbnUub2JqZWN0X21lbnUsIG1lbnUpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBvblByZXBhcmVPcHRpb25zTWVudShNZW51IG1lbnUpIHsKKyAgICAgICAgTWVudUl0ZW0gaXRlbSA9IG1lbnUuZmluZEl0ZW0oUi5pZC5zYXZlKTsKKyAgICAgICAgaXRlbS5zZXRFbmFibGVkKHRydWUpOworICAgICAgICBpdGVtID0gbWVudS5maW5kSXRlbShSLmlkLmRlbGV0ZSk7CisgICAgICAgIGl0ZW0uc2V0RW5hYmxlZCh0cnVlKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25PcHRpb25zSXRlbVNlbGVjdGVkKE1lbnVJdGVtIGl0ZW0pIHsKKyAgICAgICAgc3dpdGNoIChpdGVtLmdldEl0ZW1JZCgpKSB7CisgICAgICAgICAgICBjYXNlIFIuaWQuc2F2ZToKKyAgICAgICAgICAgICAgICBzYXZlKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICBjYXNlIFIuaWQuZGVsZXRlOgorICAgICAgICAgICAgICAgIGRlbGV0ZSgpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0VGltZXN0YW1wKCkgeworICAgICAgICBDYWxlbmRhciBjID0gQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKTsKKyAgICAgICAgYy5zZXRUaW1lSW5NaWxsaXMoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOworICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiJXRZLSV0bS0ldGQtJXRILSV0TS0ldFMiLCBjLCBjLCBjLCBjLCBjLCBjKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2F2ZSgpIHsKKyAgICAgICAgYm9vbGVhbiBzdWNjZXNzID0gZmFsc2U7CisgICAgICAgIFVyaSB1cmkgPSBNdHAuT2JqZWN0LmdldENvbnRlbnRVcmkobURldmljZUlELCBtT2JqZWN0SUQpOworICAgICAgICBGaWxlIGRlc3RGaWxlID0gbnVsbDsKKyAgICAgICAgUGFyY2VsRmlsZURlc2NyaXB0b3IgcGZkID0gbnVsbDsKKyAgICAgICAgRmlsZUlucHV0U3RyZWFtIGZpcyA9IG51bGw7CisgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbnVsbDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgcGZkID0gZ2V0Q29udGVudFJlc29sdmVyKCkub3BlbkZpbGVEZXNjcmlwdG9yKHVyaSwgInIiKTsKKyAgICAgICAgICAgIExvZy5kKFRBRywgInNhdmUgZ290IHBmZCAiICsgcGZkKTsKKyAgICAgICAgICAgIGlmIChwZmQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0ocGZkLmdldEZpbGVEZXNjcmlwdG9yKCkpOworICAgICAgICAgICAgICAgIExvZy5kKFRBRywgInNhdmUgZ290IGZpcyAiICsgZmlzKTsKKyAgICAgICAgICAgICAgICBGaWxlIGRlc3REaXIgPSBFbnZpcm9ubWVudC5nZXRFeHRlcm5hbFN0b3JhZ2VQdWJsaWNEaXJlY3RvcnkoCisgICAgICAgICAgICAgICAgICAgICAgICBFbnZpcm9ubWVudC5ESVJFQ1RPUllfRENJTSk7CisgICAgICAgICAgICAgICAgZGVzdERpci5ta2RpcnMoKTsKKyAgICAgICAgICAgICAgICBkZXN0RmlsZSA9IG5ldyBGaWxlKGRlc3REaXIsICJDYW1lcmFCcm93c2VyLSIgKyBnZXRUaW1lc3RhbXAoKSArICIuanBlZyIpOworCisKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJzYXZlIGdvdCBkZXN0RmlsZSAiICsgZGVzdEZpbGUpOworCisgICAgICAgICAgICAgICAgaWYgKGRlc3RGaWxlLmV4aXN0cygpKSB7CisgICAgICAgICAgICAgICAgICAgIGRlc3RGaWxlLmRlbGV0ZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShkZXN0RmlsZSk7CisKKyAgICAgICAgICAgICAgICBieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbNjU1MzZdOworICAgICAgICAgICAgICAgIGludCBieXRlc1JlYWQ7CisgICAgICAgICAgICAgICAgd2hpbGUgKChieXRlc1JlYWQgPSBmaXMucmVhZChidWZmZXIpKSA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGZvcy53cml0ZShidWZmZXIsIDAsIGJ5dGVzUmVhZCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gdGVtcG9yYXJ5IHdvcmthcm91bmQgdW50aWwgd2Ugc3RyYWlnaHRlbiBvdXQgcGVybWlzc2lvbnMgaW4gL2RhdGEvbWVkaWEKKyAgICAgICAgICAgICAgICAvLyAxMDE1IGlzIEFJRF9TRENBUkRfUlcKKyAgICAgICAgICAgICAgICBGaWxlVXRpbHMuc2V0UGVybWlzc2lvbnMoZGVzdERpci5nZXRQYXRoKCksIDA3NzUsIFByb2Nlc3MubXlVaWQoKSwgMTAxNSk7CisgICAgICAgICAgICAgICAgRmlsZVV0aWxzLnNldFBlcm1pc3Npb25zKGRlc3RGaWxlLmdldFBhdGgoKSwgMDY2NCwgUHJvY2Vzcy5teVVpZCgpLCAxMDE1KTsKKworICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiRXhjZXB0aW9uIGluIE9iamVjdFZpZXcuc2F2ZSIsIGUpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKGZpcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgZmlzLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZm9zICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBmb3MuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwZmQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHBmZC5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHN1Y2Nlc3MpIHsKKyAgICAgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KEludGVudC5BQ1RJT05fTUVESUFfU0NBTk5FUl9TQ0FOX0ZJTEUpOworICAgICAgICAgICAgaW50ZW50LnNldERhdGEoVXJpLmZyb21GaWxlKGRlc3RGaWxlKSk7CisgICAgICAgICAgICBzZW5kQnJvYWRjYXN0KGludGVudCk7CisgICAgICAgICAgICBUb2FzdC5tYWtlVGV4dCh0aGlzLCBSLnN0cmluZy5vYmplY3Rfc2F2ZWRfbWVzc2FnZSwgVG9hc3QuTEVOR1RIX1NIT1JUKS5zaG93KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBUb2FzdC5tYWtlVGV4dCh0aGlzLCBSLnN0cmluZy5zYXZlX2ZhaWxlZF9tZXNzYWdlLCBUb2FzdC5MRU5HVEhfU0hPUlQpLnNob3coKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkZWxldGUoKSB7CisgICAgICAgIFVyaSB1cmkgPSBNdHAuT2JqZWN0LmdldENvbnRlbnRVcmkobURldmljZUlELCBtT2JqZWN0SUQpOworCisgICAgICAgIExvZy5kKFRBRywgImRlbGV0aW5nICIgKyB1cmkpOworCisgICAgICAgIGludCByZXN1bHQgPSBnZXRDb250ZW50UmVzb2x2ZXIoKS5kZWxldGUodXJpLCBudWxsLCBudWxsKTsKKyAgICAgICAgaWYgKHJlc3VsdCA+IDApIHsKKyAgICAgICAgICAgIFRvYXN0Lm1ha2VUZXh0KHRoaXMsIFIuc3RyaW5nLm9iamVjdF9kZWxldGVkX21lc3NhZ2UsIFRvYXN0LkxFTkdUSF9TSE9SVCkuc2hvdygpOworICAgICAgICAgICAgZmluaXNoKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBUb2FzdC5tYWtlVGV4dCh0aGlzLCBSLnN0cmluZy5kZWxldGVfZmFpbGVkX21lc3NhZ2UsIFRvYXN0LkxFTkdUSF9TSE9SVCkuc2hvdygpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvdGVzdHMvQ2FtZXJhQnJvd3Nlci9zcmMvY29tL2FuZHJvaWQvY2FtZXJhYnJvd3Nlci9TdG9yYWdlQnJvd3Nlci5qYXZhIGIvbWVkaWEvdGVzdHMvQ2FtZXJhQnJvd3Nlci9zcmMvY29tL2FuZHJvaWQvY2FtZXJhYnJvd3Nlci9TdG9yYWdlQnJvd3Nlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkZGY0ZTcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS90ZXN0cy9DYW1lcmFCcm93c2VyL3NyYy9jb20vYW5kcm9pZC9jYW1lcmFicm93c2VyL1N0b3JhZ2VCcm93c2VyLmphdmEKQEAgLTAsMCArMSw3NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuY2FtZXJhYnJvd3NlcjsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkxpc3RBY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yOworaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLk10cDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0Lkxpc3RBZGFwdGVyOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlNpbXBsZUN1cnNvckFkYXB0ZXI7CisKKy8qKgorICogQSBsaXN0IHZpZXcgZGlzcGxheWluZyBhbGwgc3RvcmFnZSB1bml0cyBvbiBhIGRldmljZS4KKyAqLworcHVibGljIGNsYXNzIFN0b3JhZ2VCcm93c2VyIGV4dGVuZHMgTGlzdEFjdGl2aXR5IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiU3RvcmFnZUJyb3dzZXIiOworCisgICAgcHJpdmF0ZSBMaXN0QWRhcHRlciBtQWRhcHRlcjsKKyAgICBwcml2YXRlIGludCBtRGV2aWNlSUQ7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBTVE9SQUdFX0NPTFVNTlMgPQorICAgICAgICBuZXcgU3RyaW5nW10geyBNdHAuU3RvcmFnZS5fSUQsIE10cC5TdG9yYWdlLkRFU0NSSVBUSU9OIH07CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25SZXN1bWUoKSB7CisgICAgICAgIHN1cGVyLm9uUmVzdW1lKCk7CisKKyAgICAgICAgbURldmljZUlEID0gZ2V0SW50ZW50KCkuZ2V0SW50RXh0cmEoImRldmljZSIsIDApOworICAgICAgICBpZiAobURldmljZUlEICE9IDApIHsKKyAgICAgICAgICAgIEN1cnNvciBjID0gZ2V0Q29udGVudFJlc29sdmVyKCkucXVlcnkoTXRwLlN0b3JhZ2UuZ2V0Q29udGVudFVyaShtRGV2aWNlSUQpLAorICAgICAgICAgICAgICAgICAgICBTVE9SQUdFX0NPTFVNTlMsIG51bGwsIG51bGwsIG51bGwpOworICAgICAgICAgICAgTG9nLmQoVEFHLCAicXVlcnkgcmV0dXJuZWQgIiArIGMpOworICAgICAgICAgICAgc3RhcnRNYW5hZ2luZ0N1cnNvcihjKTsKKworICAgICAgICAgICAgLy8gTWFwIEN1cnNvciBjb2x1bW5zIHRvIHZpZXdzIGRlZmluZWQgaW4gc2ltcGxlX2xpc3RfaXRlbV8xLnhtbAorICAgICAgICAgICAgbUFkYXB0ZXIgPSBuZXcgU2ltcGxlQ3Vyc29yQWRhcHRlcih0aGlzLAorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkLlIubGF5b3V0LnNpbXBsZV9saXN0X2l0ZW1fMSwgYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyBNdHAuU3RvcmFnZS5ERVNDUklQVElPTiB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBpbnRbXSB7IGFuZHJvaWQuUi5pZC50ZXh0MSwgYW5kcm9pZC5SLmlkLnRleHQyIH0pOworICAgICAgICAgICAgc2V0TGlzdEFkYXB0ZXIobUFkYXB0ZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25MaXN0SXRlbUNsaWNrKExpc3RWaWV3IGwsIFZpZXcgdiwgaW50IHBvc2l0aW9uLCBsb25nIGlkKSB7CisgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KHRoaXMsIE9iamVjdEJyb3dzZXIuY2xhc3MpOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoImRldmljZSIsIG1EZXZpY2VJRCk7CisgICAgICAgIGludGVudC5wdXRFeHRyYSgic3RvcmFnZSIsIChpbnQpbUFkYXB0ZXIuZ2V0SXRlbUlkKHBvc2l0aW9uKSk7CisgICAgICAgIHN0YXJ0QWN0aXZpdHkoaW50ZW50KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9DYW1lcmFCcm93c2VyL3NyYy9jb20vYW5kcm9pZC9jYW1lcmFicm93c2VyL1VzYlJlY2VpdmVyLmphdmEgYi9tZWRpYS90ZXN0cy9DYW1lcmFCcm93c2VyL3NyYy9jb20vYW5kcm9pZC9jYW1lcmFicm93c2VyL1VzYlJlY2VpdmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA1YjIzOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3Rlc3RzL0NhbWVyYUJyb3dzZXIvc3JjL2NvbS9hbmRyb2lkL2NhbWVyYWJyb3dzZXIvVXNiUmVjZWl2ZXIuamF2YQpAQCAtMCwwICsxLDQ3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5jYW1lcmFicm93c2VyOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXI7CitpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5Vc2I7CitpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK3B1YmxpYyBjbGFzcyBVc2JSZWNlaXZlciBleHRlbmRzIEJyb2FkY2FzdFJlY2VpdmVyCit7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJVc2JSZWNlaXZlciI7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblJlY2VpdmUoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50KSB7CisgICAgICAgIExvZy5kKFRBRywgIm9uUmVjZWl2ZSAiICsgaW50ZW50KTsKKyAgICAgICAgaWYgKFVzYi5BQ1RJT05fVVNCX0NBTUVSQV9BVFRBQ0hFRC5lcXVhbHMoaW50ZW50LmdldEFjdGlvbigpKSkgeworICAgICAgICAgICAgVXJpIHVyaSA9IGludGVudC5nZXREYXRhKCk7CisgICAgICAgICAgICBpbnRlbnQgPSBuZXcgSW50ZW50KGNvbnRleHQsIFN0b3JhZ2VCcm93c2VyLmNsYXNzKTsKKyAgICAgICAgICAgIGludGVudC5zZXRGbGFncyhJbnRlbnQuRkxBR19BQ1RJVklUWV9ORVdfVEFTSyk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIC8vIFRPRE8gLSBhZGQgYSB3cmFwcGVyIHRvIE10cC5EZXZpY2UgZm9yIHRoaXMKKyAgICAgICAgICAgICAgICBpbnQgaWQgPSBJbnRlZ2VyLnBhcnNlSW50KHVyaS5nZXRQYXRoU2VnbWVudHMoKS5nZXQoMSkpOworICAgICAgICAgICAgICAgIGludGVudC5wdXRFeHRyYSgiZGV2aWNlIiwgaWQpOworICAgICAgICAgICAgICAgIGNvbnRleHQuc3RhcnRBY3Rpdml0eShpbnRlbnQpOworICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJiYWQgZGV2aWNlIFVyaSAiICsgdXJpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL210cC9BbmRyb2lkLm1rIGIvbWVkaWEvdGVzdHMvbXRwL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTkwNzRlZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3Rlc3RzL210cC9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsNjEgQEAKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQorCitpZm5lcSAoJChUQVJHRVRfU0lNVUxBVE9SKSx0cnVlKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTIDo9IFwKKwltdHAuY3BwIFwKKwlNdHBGaWxlLmNwcCBcCisKK0xPQ0FMX0NfSU5DTFVERVMgKz0gXAorICAgIGZyYW1ld29ya3MvYmFzZS9tZWRpYS9tdHAgXAorCitMT0NBTF9DRkxBR1MgOj0gLURNVFBfSE9TVAorCitMT0NBTF9NT0RVTEUgOj0gbXRwCisKK0xPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gbGlibXRwIGxpYnVzYmhvc3QgbGlidXRpbHMgbGliY3V0aWxzCisKK2luY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQorCitlbmRpZgorCitpZmVxICgkKEhPU1RfT1MpLGxpbnV4KQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTIDo9IFwKKwltdHAuY3BwIFwKKwlNdHBGaWxlLmNwcCBcCisJLi4vLi4vLi4vbGlicy91dGlscy9SZWZCYXNlLmNwcCBcCisJLi4vLi4vLi4vbGlicy91dGlscy9TaGFyZWRCdWZmZXIuY3BwIFwKKwkuLi8uLi8uLi9saWJzL3V0aWxzL1RocmVhZHMuY3BwIFwKKwkuLi8uLi8uLi9saWJzL3V0aWxzL1ZlY3RvckltcGwuY3BwIFwKKworTE9DQUxfQ19JTkNMVURFUyArPSBcCisgICAgZnJhbWV3b3Jrcy9iYXNlL21lZGlhL210cCBcCisKK0xPQ0FMX0NGTEFHUyA6PSAtRE1UUF9IT1NUIC1nIC1PMAorCitoYXZlX3JlYWRsaW5lIDo9ICQod2lsZGNhcmQgL3Vzci9pbmNsdWRlL3JlYWRsaW5lL3JlYWRsaW5lLmgpCitoYXZlX2hpc3RvcnkgOj0gJCh3aWxkY2FyZCAvdXNyL2xpYi9saWJoaXN0b3J5KikKK2lmbmVxICgkKHN0cmlwICQoaGF2ZV9yZWFkbGluZSkpLCkKK0xPQ0FMX0NGTEFHUyArPSAtREhBVkVfUkVBRExJTkU9MQorZW5kaWYKKworTE9DQUxfTERMSUJTICs9IC1scHRocmVhZAoraWZuZXEgKCQoc3RyaXAgJChoYXZlX3JlYWRsaW5lKSksKQorTE9DQUxfTERMSUJTICs9IC1scmVhZGxpbmUgLWxuY3Vyc2VzCitlbmRpZgoraWZuZXEgKCQoc3RyaXAgJChoYXZlX2hpc3RvcnkpKSwpCitMT0NBTF9MRExJQlMgKz0gLWxoaXN0b3J5CitlbmRpZgorCitMT0NBTF9NT0RVTEUgOj0gbXRwCisKK0xPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gbGlibXRwIGxpYnVzYmhvc3QgbGliY3V0aWxzCisKK2luY2x1ZGUgJChCVUlMRF9IT1NUX0VYRUNVVEFCTEUpCisKK2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9tdHAvTXRwRmlsZS5jcHAgYi9tZWRpYS90ZXN0cy9tdHAvTXRwRmlsZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDBkMzI4ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3Rlc3RzL210cC9NdHBGaWxlLmNwcApAQCAtMCwwICsxLDE4NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJNdHBDbGllbnQuaCIKKyNpbmNsdWRlICJNdHBEZXZpY2UuaCIKKyNpbmNsdWRlICJNdHBEZXZpY2VJbmZvLmgiCisjaW5jbHVkZSAiTXRwT2JqZWN0SW5mby5oIgorI2luY2x1ZGUgIk10cFN0b3JhZ2UuaCIKKyNpbmNsdWRlICJNdHBVdGlscy5oIgorCisjaW5jbHVkZSAiTXRwRmlsZS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK010cENsaWVudCogTXRwRmlsZTo6c0NsaWVudCA9IE5VTEw7CisKK010cEZpbGU6Ok10cEZpbGUoTXRwRGV2aWNlKiBkZXZpY2UpCisgICAgOiAgIG1EZXZpY2UoZGV2aWNlKSwKKyAgICAgICAgbVN0b3JhZ2UoMCksCisgICAgICAgIG1IYW5kbGUoMCkKK3sKK30KKworTXRwRmlsZTo6TXRwRmlsZShNdHBEZXZpY2UqIGRldmljZSwgTXRwU3RvcmFnZUlEIHN0b3JhZ2UpCisgICAgOiAgIG1EZXZpY2UoZGV2aWNlKSwKKyAgICAgICAgbVN0b3JhZ2Uoc3RvcmFnZSksCisgICAgICAgIG1IYW5kbGUoMCkKK3sKK30KKworTXRwRmlsZTo6TXRwRmlsZShNdHBEZXZpY2UqIGRldmljZSwgTXRwU3RvcmFnZUlEIHN0b3JhZ2UsIE10cE9iamVjdEhhbmRsZSBoYW5kbGUpCisgICAgOiAgIG1EZXZpY2UoZGV2aWNlKSwKKyAgICAgICAgbVN0b3JhZ2Uoc3RvcmFnZSksCisgICAgICAgIG1IYW5kbGUoaGFuZGxlKQoreworfQorCitNdHBGaWxlOjpNdHBGaWxlKE10cEZpbGUqIGZpbGUpCisgICAgOiAgIG1EZXZpY2UoZmlsZS0+bURldmljZSksCisgICAgICAgIG1TdG9yYWdlKGZpbGUtPm1TdG9yYWdlKSwKKyAgICAgICAgbUhhbmRsZShmaWxlLT5tSGFuZGxlKQoreworfQorCitNdHBGaWxlOjp+TXRwRmlsZSgpIHsKK30KKwordm9pZCBNdHBGaWxlOjpwcmludCgpIHsKKyAgICBpZiAobUhhbmRsZSkgeworCisgICAgfSBlbHNlIGlmIChtU3RvcmFnZSkgeworICAgICAgICBwcmludGYoIiV4XG4iLCBtU3RvcmFnZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IGlkID0gbURldmljZS0+Z2V0SUQoKTsKKyAgICAgICAgTXRwRGV2aWNlSW5mbyogaW5mbyA9IG1EZXZpY2UtPmdldERldmljZUluZm8oKTsKKyAgICAgICAgaWYgKGluZm8pCisgICAgICAgICAgICBwcmludGYoIiVkXHQlcyAlcyAlc1xuIiwgaWQsIGluZm8tPm1NYW51ZmFjdHVyZXIsIGluZm8tPm1Nb2RlbCwgaW5mby0+bVNlcmlhbCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHByaW50ZigiJWRcdChubyBkZXZpY2UgaW5mbyBhdmFpbGFibGUpXG4iLCBpZCk7CisgICAgICAgIGRlbGV0ZSBpbmZvOworICAgIH0KK30KKworTXRwT2JqZWN0SW5mbyogTXRwRmlsZTo6Z2V0T2JqZWN0SW5mbygpIHsKKyAgICByZXR1cm4gbURldmljZS0+Z2V0T2JqZWN0SW5mbyhtSGFuZGxlKTsKK30KKwordm9pZCBNdHBGaWxlOjpsaXN0KCkgeworICAgIGlmIChtU3RvcmFnZSkgeworICAgICAgICBNdHBPYmplY3RIYW5kbGVMaXN0KiBoYW5kbGVzID0gbURldmljZS0+Z2V0T2JqZWN0SGFuZGxlcyhtU3RvcmFnZSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtSGFuZGxlID8gbUhhbmRsZSA6IC0xKSk7CisgICAgICAgIGlmIChoYW5kbGVzKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGhhbmRsZXMtPnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSA9ICgqaGFuZGxlcylbaV07CisgICAgICAgICAgICAgICAgTXRwT2JqZWN0SW5mbyogaW5mbyA9IG1EZXZpY2UtPmdldE9iamVjdEluZm8oaGFuZGxlKTsKKyAgICAgICAgICAgICAgICBpZiAoaW5mbykgeworICAgICAgICAgICAgICAgICAgICBjaGFyIG1vZGlmaWVkWzEwMF07CisgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB0bSB0bTsKKworICAgICAgICAgICAgICAgICAgICBnbXRpbWVfcigmaW5mby0+bURhdGVNb2RpZmllZCwgJnRtKTsKKyAgICAgICAgICAgICAgICAgICAgc3RyZnRpbWUobW9kaWZpZWQsIHNpemVvZihtb2RpZmllZCksICIlYSAlYiAlZSAlSDolTTolUyBHTVQgJVkiLCAmdG0pOworICAgICAgICAgICAgICAgICAgICBwcmludGYoIiVzIEhhbmRsZTogJWQgRm9ybWF0OiAlMDRYIFNpemU6ICVkIE1vZGlmaWVkOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5tTmFtZSwgaGFuZGxlLCBpbmZvLT5tRm9ybWF0LCBpbmZvLT5tQ29tcHJlc3NlZFNpemUsIG1vZGlmaWVkKTsKKyAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGluZm87CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVsZXRlIGhhbmRsZXM7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAvLyBsaXN0IHN0b3JhZ2UgdW5pdHMgZm9yIGRldmljZQorICAgICAgICBNdHBTdG9yYWdlSURMaXN0KiBzdG9yYWdlTGlzdCA9IG1EZXZpY2UtPmdldFN0b3JhZ2VJRHMoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdG9yYWdlTGlzdC0+c2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIE10cFN0b3JhZ2VJRCBzdG9yYWdlSUQgPSAoKnN0b3JhZ2VMaXN0KVtpXTsKKyAgICAgICAgICAgIHByaW50ZigiJXhcbiIsIHN0b3JhZ2VJRCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgTXRwRmlsZTo6aW5pdChNdHBDbGllbnQqIGNsaWVudCkgeworICAgIHNDbGllbnQgPSBjbGllbnQ7Cit9CisKK010cEZpbGUqIE10cEZpbGU6OnBhcnNlUGF0aChNdHBGaWxlKiBiYXNlLCBjaGFyKiBwYXRoKSB7CisgICAgTXRwRGV2aWNlKiBkZXZpY2UgPSBOVUxMOworICAgIE10cFN0b3JhZ2VJRCBzdG9yYWdlID0gMDsKKyAgICBNdHBPYmplY3RIYW5kbGUgaGFuZGxlID0gMDsKKworICAgIGlmIChwYXRoWzBdICE9ICcvJyAmJiBiYXNlKSB7CisgICAgICAgIGRldmljZSA9IGJhc2UtPm1EZXZpY2U7CisgICAgICAgIHN0b3JhZ2UgPSBiYXNlLT5tU3RvcmFnZTsKKyAgICAgICAgaGFuZGxlID0gYmFzZS0+bUhhbmRsZTsKKyAgICB9CisKKyAgICAvLyBwYXJzZSBhbiBhYnNvbHV0ZSBwYXRoCisgICAgaWYgKHBhdGhbMF0gPT0gJy8nKQorICAgICAgICBwYXRoKys7CisgICAgY2hhciogdG9rID0gc3RydG9rKHBhdGgsICIvIik7CisgICAgd2hpbGUgKHRvaykgeworICAgICAgICBpZiAoc3RvcmFnZSkgeworICAgICAgICAgICAgLy8gZmluZCBjaGlsZCBvZiBjdXJyZW50IGhhbmRsZQorICAgICAgICAgICAgTXRwT2JqZWN0SGFuZGxlTGlzdCogaGFuZGxlcyA9IGRldmljZS0+Z2V0T2JqZWN0SGFuZGxlcyhzdG9yYWdlLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChoYW5kbGUgPyBoYW5kbGUgOiAtMSkpOworICAgICAgICAgICAgTXRwT2JqZWN0SGFuZGxlIGNoaWxkSGFuZGxlID0gMDsKKworICAgICAgICAgICAgaWYgKGhhbmRsZXMpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGhhbmRsZXMtPnNpemUoKSAmJiAhY2hpbGRIYW5kbGU7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RIYW5kbGUgaGFuZGxlID0gKCpoYW5kbGVzKVtpXTsKKyAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0SW5mbyogaW5mbyA9IGRldmljZS0+Z2V0T2JqZWN0SW5mbyhoYW5kbGUpOworICAgICAgICAgICAgICAgICAgICBpZiAoaW5mbyAmJiAhc3RyY21wKHRvaywgaW5mby0+bU5hbWUpKQorICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRIYW5kbGUgPSBoYW5kbGU7CisgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBpbmZvOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkZWxldGUgaGFuZGxlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjaGlsZEhhbmRsZSkKKyAgICAgICAgICAgICAgICBoYW5kbGUgPSBjaGlsZEhhbmRsZTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfSBlbHNlIGlmIChkZXZpY2UpIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBpZDsKKyAgICAgICAgICAgIC8vIGZpbmQgc3RvcmFnZSBmb3IgdGhlIGRldmljZQorICAgICAgICAgICAgaWYgKHNzY2FuZih0b2ssICIleCIsICZpZCkgPT0gMSkgeworICAgICAgICAgICAgICAgIE10cFN0b3JhZ2VJRExpc3QqIHN0b3JhZ2VMaXN0ID0gZGV2aWNlLT5nZXRTdG9yYWdlSURzKCk7CisgICAgICAgICAgICAgICAgYm9vbCBmb3VuZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RvcmFnZUxpc3QtPnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICgoKnN0b3JhZ2VMaXN0KVtpXSA9PSBpZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGZvdW5kKQorICAgICAgICAgICAgICAgICAgICBzdG9yYWdlID0gaWQ7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIGZpbmQgZGV2aWNlCisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgaWQ7CisgICAgICAgICAgICBpZiAoc3NjYW5mKHRvaywgIiVkIiwgJmlkKSA9PSAxKQorICAgICAgICAgICAgICAgIGRldmljZSA9IHNDbGllbnQtPmdldERldmljZShpZCk7CisgICAgICAgICAgICBpZiAoIWRldmljZSkKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIHRvayA9IHN0cnRvayhOVUxMLCAiLyIpOworICAgIH0KKworICAgIGlmIChkZXZpY2UpCisgICAgICAgIHJldHVybiBuZXcgTXRwRmlsZShkZXZpY2UsIHN0b3JhZ2UsIGhhbmRsZSk7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gTlVMTDsKK30KKworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvdGVzdHMvbXRwL010cEZpbGUuaCBiL21lZGlhL3Rlc3RzL210cC9NdHBGaWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWI4NzYyYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3Rlc3RzL210cC9NdHBGaWxlLmgKQEAgLTAsMCArMSw1NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX01UUF9GSUxFX0gKKyNkZWZpbmUgX01UUF9GSUxFX0gKKworI2luY2x1ZGUgIk10cFR5cGVzLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgTXRwQ2xpZW50OworY2xhc3MgTXRwRGV2aWNlOworY2xhc3MgTXRwT2JqZWN0SW5mbzsKKworLy8gRmlsZS1saWtlIGFic3RyYWN0aW9uIGZvciB0aGUgaW50ZXJhY3RpdmUgc2hlbGwuCisvLyBUaGlzIGNhbiBiZSB1c2VkIHRvIHJlcHJlc2VudCBhbiBNVFAgZGV2aWNlLCBzdG9yYWdlIHVuaXQgb3Igb2JqZWN0CisvLyAoZWl0aGVyIGZpbGUgb3IgYXNzb2NpYXRpb24pLgorY2xhc3MgTXRwRmlsZSB7Citwcml2YXRlOgorICAgIE10cERldmljZSogICAgICAgICAgbURldmljZTsKKyAgICBNdHBTdG9yYWdlSUQgICAgICAgIG1TdG9yYWdlOworICAgIE10cE9iamVjdEhhbmRsZSAgICAgbUhhbmRsZTsKKyAgICBzdGF0aWMgTXRwQ2xpZW50KiAgIHNDbGllbnQ7CisKK3B1YmxpYzoKKyAgICBNdHBGaWxlKE10cERldmljZSogZGV2aWNlKTsKKyAgICBNdHBGaWxlKE10cERldmljZSogZGV2aWNlLCBNdHBTdG9yYWdlSUQgc3RvcmFnZSk7CisgICAgTXRwRmlsZShNdHBEZXZpY2UqIGRldmljZSwgTXRwU3RvcmFnZUlEIHN0b3JhZ2UsIE10cE9iamVjdEhhbmRsZSBoYW5kbGUpOworICAgIE10cEZpbGUoTXRwRmlsZSogZmlsZSk7CisgICAgdmlydHVhbCB+TXRwRmlsZSgpOworCisgICAgTXRwT2JqZWN0SW5mbyogZ2V0T2JqZWN0SW5mbygpOworICAgIHZvaWQgcHJpbnQoKTsKKyAgICB2b2lkIGxpc3QoKTsKKworICAgIGlubGluZSBNdHBEZXZpY2UqIGdldERldmljZSgpIGNvbnN0IHsgcmV0dXJuIG1EZXZpY2U7IH0KKworICAgIHN0YXRpYyB2b2lkIGluaXQoTXRwQ2xpZW50KiBjbGllbnQpOworICAgIHN0YXRpYyBNdHBGaWxlKiBwYXJzZVBhdGgoTXRwRmlsZSogYmFzZSwgY2hhciogcGF0aCk7Cit9OworCit9CisKKyNlbmRpZiAvLyBfTVRQX0RJUkVDVE9SWV9ICmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9tdHAvbXRwLmNwcCBiL21lZGlhL3Rlc3RzL210cC9tdHAuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjNWUyM2IKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS90ZXN0cy9tdHAvbXRwLmNwcApAQCAtMCwwICsxLDM3MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorCisjaWYgSEFWRV9SRUFETElORQorI2luY2x1ZGUgPHJlYWRsaW5lL3JlYWRsaW5lLmg+CisjaW5jbHVkZSA8cmVhZGxpbmUvaGlzdG9yeS5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJNdHBDbGllbnQuaCIKKyNpbmNsdWRlICJNdHBEZXZpY2UuaCIKKyNpbmNsdWRlICJNdHBPYmplY3RJbmZvLmgiCisKKyNpbmNsdWRlICJNdHBGaWxlLmgiCisKKyNkZWZpbmUgUFJPTVBUICAibXRwPiAiCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCitzdGF0aWMgTXRwQ2xpZW50KiBzQ2xpZW50ID0gTlVMTDsKKworLy8gY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSBpbmZvcm1hdGlvbiBmb3IgaW50ZXJhY3RpdmUgc2hlbGwKK3N0YXRpYyBNdHBGaWxlKiBzQ3VycmVudERpcmVjdG9yeSA9IE5VTEw7CisKK3N0YXRpYyBNdHBGaWxlKiBwYXJzZV9wYXRoKGNoYXIqIHBhdGgpIHsKKyAgICByZXR1cm4gTXRwRmlsZTo6cGFyc2VQYXRoKHNDdXJyZW50RGlyZWN0b3J5LCBwYXRoKTsKK30KKworY2xhc3MgTXlDbGllbnQgOiBwdWJsaWMgTXRwQ2xpZW50IHsKK3ByaXZhdGU6CisgICAgdmlydHVhbCB2b2lkIGRldmljZUFkZGVkKE10cERldmljZSAqZGV2aWNlKSB7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIGRldmljZVJlbW92ZWQoTXRwRGV2aWNlICpkZXZpY2UpIHsKKyAgICB9CisKK3B1YmxpYzoKK307CisKK3N0YXRpYyB2b2lkIGluaXQoKSB7CisgICAgc0NsaWVudCA9IG5ldyBNeUNsaWVudDsKKyAgICBzQ2xpZW50LT5zdGFydCgpOworICAgIE10cEZpbGU6OmluaXQoc0NsaWVudCk7Cit9CisKK3N0YXRpYyBpbnQgc2V0X2N3ZChpbnQgYXJnYywgY2hhciogYXJndltdKSB7CisgICAgaWYgKGFyZ2MgIT0gMSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImNkIHNob3VsZCBoYXZlIG9uZSBhcmd1bWVudFxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKCFzdHJjbXAoYXJndlswXSwgIi8iKSkgeworICAgICAgICBkZWxldGUgc0N1cnJlbnREaXJlY3Rvcnk7CisgICAgICAgIHNDdXJyZW50RGlyZWN0b3J5ID0gTlVMTDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIE10cEZpbGUqIGZpbGUgPSBwYXJzZV9wYXRoKGFyZ3ZbMF0pOworICAgICAgICBpZiAoZmlsZSkgeworICAgICAgICAgICAgZGVsZXRlIHNDdXJyZW50RGlyZWN0b3J5OworICAgICAgICAgICAgc0N1cnJlbnREaXJlY3RvcnkgPSBmaWxlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJjb3VsZCBub3QgZmluZCAlc1xuIiwgYXJndlswXSk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGxpc3RfZGV2aWNlcygpIHsKKyAgICAvLyBUT0RPIC0gbmVlZCB0byBtYWtlIHN1cmUgdGhlIGxpc3Qgd2lsbCBub3QgY2hhbmdlIHdoaWxlIGl0ZXJhdGluZworICAgIE10cERldmljZUxpc3QmIGRldmljZXMgPSBzQ2xpZW50LT5nZXREZXZpY2VMaXN0KCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXZpY2VzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIE10cERldmljZSogZGV2aWNlID0gZGV2aWNlc1tpXTsKKyAgICAgICAgTXRwRmlsZSogZmlsZSA9IG5ldyBNdHBGaWxlKGRldmljZSk7CisgICAgICAgIGZpbGUtPnByaW50KCk7CisgICAgICAgIGRlbGV0ZSBmaWxlOworICAgIH0KK30KKworc3RhdGljIGludCBsaXN0KGludCBhcmdjLCBjaGFyKiBhcmd2W10pIHsKKyAgICBpZiAoYXJnYyA9PSAwKSB7CisgICAgICAgIC8vIGxpc3QgY3dkCisgICAgICAgIGlmIChzQ3VycmVudERpcmVjdG9yeSkgeworICAgICAgICAgICAgc0N1cnJlbnREaXJlY3RvcnktPmxpc3QoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGxpc3RfZGV2aWNlcygpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdjOyBpKyspIHsKKyAgICAgICAgY2hhciogcGF0aCA9IGFyZ3ZbaV07CisgICAgICAgIGlmICghc3RyY21wKHBhdGgsICIvIikpIHsKKyAgICAgICAgICAgIGxpc3RfZGV2aWNlcygpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTXRwRmlsZSogZmlsZSA9IHBhcnNlX3BhdGgocGF0aCk7CisgICAgICAgICAgICBpZiAoIWZpbGUpIHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImNvdWxkIG5vdCBmaW5kICVzXG4iLCBwYXRoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaWxlLT5saXN0KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnZXRfZmlsZShpbnQgYXJnYywgY2hhciogYXJndltdKSB7CisgICAgaW50IHJldCA9IC0xOworICAgIGludCBzcmNGRCA9IC0xOworICAgIGludCBkZXN0RkQgPSAtMTsKKyAgICBNdHBGaWxlKiBzcmNGaWxlID0gTlVMTDsKKyAgICBNdHBPYmplY3RJbmZvKiBpbmZvID0gTlVMTDsKKyAgICBjaGFyKiBkZXN0OworCisgICAgaWYgKGFyZ2MgPCAxKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAibm90IGVub3VnaCBhcmd1bWVudHNcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfSBlbHNlIGlmIChhcmdjID4gMikgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInRvbyBtYW55IGFyZ3VtZW50c1xuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAvLyBmaW5kIHNvdXJjZSBvYmplY3QKKyAgICBjaGFyKiBzcmMgPSBhcmd2WzBdOworICAgIHNyY0ZpbGUgPSBwYXJzZV9wYXRoKHNyYyk7CisgICAgaWYgKCFzcmNGaWxlKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiY291bGQgbm90IGZpbmQgJXNcbiIsIHNyYyk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaW5mbyA9IHNyY0ZpbGUtPmdldE9iamVjdEluZm8oKTsKKyAgICBpZiAoIWluZm8pIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJjb3VsZCBub3QgZmluZCBvYmplY3QgaW5mbyBmb3IgJXNcbiIsIHNyYyk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisgICAgaWYgKGluZm8tPm1Gb3JtYXQgPT0gTVRQX0ZPUk1BVF9BU1NPQ0lBVElPTikgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImNvcHlpbmcgZGlyZWN0b3JpZXMgbm90IGltcGxlbWVudGVkIHlldFxuIik7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBkZXN0ID0gKGFyZ2MgPiAxID8gYXJndlsxXSA6IGluZm8tPm1OYW1lKTsKKyAgICBkZXN0RkQgPSBvcGVuKGRlc3QsIE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fVFJVTkMsIFNfSVJVU1IgfCBTX0lXVVNSIHwgU19JUkdSUCB8IFNfSVJPVEgpOworICAgIGlmIChkZXN0RkQgPCAwKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiY291bGQgbm90IGNyZWF0ZSAlc1xuIiwgZGVzdCk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisgICAgc3JjRkQgPSBzcmNGaWxlLT5nZXREZXZpY2UoKS0+cmVhZE9iamVjdChpbmZvLT5tSGFuZGxlLCBpbmZvLT5tQ29tcHJlc3NlZFNpemUpOworICAgIGlmIChzcmNGRCA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIGNoYXIgYnVmZmVyWzY1NTM2XTsKKyAgICB3aGlsZSAoMSkgeworICAgICAgICBpbnQgY291bnQgPSByZWFkKHNyY0ZELCBidWZmZXIsIHNpemVvZihidWZmZXIpKTsKKyAgICAgICAgaWYgKGNvdW50IDw9IDApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgd3JpdGUoZGVzdEZELCBidWZmZXIsIGNvdW50KTsKKyAgICB9CisgICAgLy8gRklYTUUgLSBlcnJvciBjaGVja2luZyBhbmQgcmVwb3J0aW5nCisgICAgcmV0ID0gMDsKKworZmFpbDoKKyAgICBkZWxldGUgc3JjRmlsZTsKKyAgICBkZWxldGUgaW5mbzsKKyAgICBpZiAoc3JjRkQgPj0gMCkKKyAgICAgICAgY2xvc2Uoc3JjRkQpOworICAgIGlmIChkZXN0RkQgPj0gMCkKKyAgICAgICAgY2xvc2UoZGVzdEZEKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHB1dF9maWxlKGludCBhcmdjLCBjaGFyKiBhcmd2W10pIHsKKyAgICBpbnQgcmV0ID0gLTE7CisgICAgaW50IHNyY0ZEID0gLTE7CisgICAgTXRwRmlsZSogZGVzdEZpbGUgPSBOVUxMOworICAgIE10cE9iamVjdEluZm8qIHNyY0luZm8gPSBOVUxMOworICAgIE10cE9iamVjdEluZm8qIGRlc3RJbmZvID0gTlVMTDsKKyAgICBNdHBPYmplY3RIYW5kbGUgaGFuZGxlOworICAgIHN0cnVjdCBzdGF0IHN0YXRidWY7CisgICAgY29uc3QgY2hhciogbGFzdFNsYXNoOworCisgICAgaWYgKGFyZ2MgPCAxKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAibm90IGVub3VnaCBhcmd1bWVudHNcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfSBlbHNlIGlmIChhcmdjID4gMikgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInRvbyBtYW55IGFyZ3VtZW50c1xuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgY29uc3QgY2hhciogc3JjID0gYXJndlswXTsKKyAgICBzcmNGRCA9IG9wZW4oc3JjLCBPX1JET05MWSk7CisgICAgaWYgKHNyY0ZEIDwgMCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImNvdWxkIG5vdCBvcGVuICVzXG4iLCBzcmMpOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorICAgIGlmIChhcmdjID09IDIpIHsKKyAgICAgICAgIGNoYXIqIGRlc3QgPSBhcmd2WzFdOworICAgICAgICBkZXN0RmlsZSA9IHBhcnNlX3BhdGgoZGVzdCk7CisgICAgICAgIGlmICghZGVzdEZpbGUpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiY291bGQgbm90IGZpbmQgJXNcbiIsIGRlc3QpOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCFzQ3VycmVudERpcmVjdG9yeSkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IG5vdCBzZXRcbiIpOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisgICAgICAgIGRlc3RGaWxlID0gbmV3IE10cEZpbGUoc0N1cnJlbnREaXJlY3RvcnkpOworICAgIH0KKworICAgIGRlc3RJbmZvID0gZGVzdEZpbGUtPmdldE9iamVjdEluZm8oKTsKKyAgICBpZiAoIWRlc3RJbmZvKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiY291bGQgbm90IGZpbmQgb2JqZWN0IGluZm8gZGVzdGluYXRpb24gZGlyZWN0b3J5XG4iKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKyAgICBpZiAoZGVzdEluZm8tPm1Gb3JtYXQgIT0gTVRQX0ZPUk1BVF9BU1NPQ0lBVElPTikgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImRlc3RpbmF0aW9uIG5vdCBhIGRpcmVjdG9yeVxuIik7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBpZiAoZnN0YXQoc3JjRkQsICZzdGF0YnVmKSkKKyAgICAgICAgZ290byBmYWlsOworCisgICAgc3JjSW5mbyA9IG5ldyBNdHBPYmplY3RJbmZvKDApOworICAgIHNyY0luZm8tPm1TdG9yYWdlSUQgPSBkZXN0SW5mby0+bVN0b3JhZ2VJRDsKKyAgICBzcmNJbmZvLT5tRm9ybWF0ID0gTVRQX0ZPUk1BVF9FWElGX0pQRUc7ICAvLyBGSVhNRQorICAgIHNyY0luZm8tPm1Db21wcmVzc2VkU2l6ZSA9IHN0YXRidWYuc3Rfc2l6ZTsKKyAgICBzcmNJbmZvLT5tUGFyZW50ID0gZGVzdEluZm8tPm1IYW5kbGU7CisgICAgbGFzdFNsYXNoID0gc3RycmNocihzcmMsICcvJyk7CisgICAgc3JjSW5mby0+bU5hbWUgPSBzdHJkdXAobGFzdFNsYXNoID8gbGFzdFNsYXNoICsgMSA6IHNyYyk7CisgICAgc3JjSW5mby0+bURhdGVNb2RpZmllZCA9IHN0YXRidWYuc3RfbXRpbWU7CisgICAgaGFuZGxlID0gZGVzdEZpbGUtPmdldERldmljZSgpLT5zZW5kT2JqZWN0SW5mbyhzcmNJbmZvKTsKKyAgICBpZiAoaGFuZGxlIDw9IDApIHsKKyAgICAgICAgcHJpbnRmKCJzZW5kT2JqZWN0SW5mbyByZXR1cm5lZCAlMDRYXG4iLCBoYW5kbGUpOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorICAgIGlmIChkZXN0RmlsZS0+Z2V0RGV2aWNlKCktPnNlbmRPYmplY3Qoc3JjSW5mbywgc3JjRkQpKQorICAgICAgICByZXQgPSAwOworCitmYWlsOgorICAgIGRlbGV0ZSBkZXN0RmlsZTsKKyAgICBkZWxldGUgc3JjSW5mbzsKKyAgICBkZWxldGUgZGVzdEluZm87CisgICAgaWYgKHNyY0ZEID49IDApCisgICAgICAgIGNsb3NlKHNyY0ZEKTsKKyAgICBwcmludGYoInJldHVybmluZyAlZFxuIiwgcmV0KTsKKyAgICByZXR1cm4gcmV0OworfQorCit0eXBlZGVmIGludCAoKiBjb21tYW5kX2Z1bmMpKGludCBhcmdjLCBjaGFyKiBhcmd2W10pOworCitzdHJ1Y3QgY29tbWFuZF90YWJsZV9lbnRyeSB7CisgICAgY29uc3QgY2hhciogbmFtZTsKKyAgICBjb21tYW5kX2Z1bmMgZnVuYzsKK307CisKK2NvbnN0IGNvbW1hbmRfdGFibGVfZW50cnkgY29tbWFuZF9saXN0W10gPSB7CisgICAgeyAgICJjZCIsICAgICAgIHNldF9jd2QgICAgICAgICB9LAorICAgIHsgICAibHMiLCAgICAgICBsaXN0ICAgICAgICAgICAgfSwKKyAgICB7ICAgImdldCIsICAgICAgZ2V0X2ZpbGUgICAgICAgIH0sCisgICAgeyAgICJwdXQiLCAgICAgIHB1dF9maWxlICAgICAgICB9LAorICAgIHsgICBOVUxMLCAgICAgICBOVUxMICAgICAgICAgICAgfSwKK307CisKKworc3RhdGljIGludCBkb19jb21tYW5kKGludCBhcmdjLCBjaGFyKiBhcmd2W10pIHsKKyAgICBjb25zdCBjb21tYW5kX3RhYmxlX2VudHJ5KiBjb21tYW5kID0gY29tbWFuZF9saXN0OworICAgIGNvbnN0IGNoYXIqIG5hbWUgPSAqYXJndisrOworICAgIGFyZ2MtLTsKKworICAgIHdoaWxlIChjb21tYW5kLT5uYW1lKSB7CisgICAgICAgIGlmICghc3RyY21wKGNvbW1hbmQtPm5hbWUsIG5hbWUpKQorICAgICAgICAgICAgcmV0dXJuIGNvbW1hbmQtPmZ1bmMoYXJnYywgYXJndik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGNvbW1hbmQrKzsKKyAgICB9CisgICAgZnByaW50ZihzdGRlcnIsICJ1bmtub3duIGNvbW1hbmQgJXNcbiIsIG5hbWUpOworICAgIHJldHVybiAtMTsKK30KKworc3RhdGljIGludCBzaGVsbCgpIHsKKyAgICBpbnQgYXJnYzsKKyAgICBpbnQgcmVzdWx0ID0gMDsKKyNkZWZpbmUgTUFYX0FSR1MgICAgMTAwCisgICAgY2hhciogYXJndltNQVhfQVJHU107CisKKyNpZiBIQVZFX1JFQURMSU5FCisgICAgdXNpbmdfaGlzdG9yeSgpOworI2VuZGlmCisKKyAgICB3aGlsZSAoMSkgeworI2lmIEhBVkVfUkVBRExJTkUKKyAgICAgICAgY2hhciogbGluZSA9IHJlYWRsaW5lKFBST01QVCk7CisgICAgICAgIGlmICghbGluZSkgeworICAgICAgICAgICAgcHJpbnRmKCJcbiIpOworICAgICAgICAgICAgZXhpdCgwKTsKKyAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgY2hhciAgICBidWZmZXJbMTAwMF07CisgICAgICAgIHByaW50ZigiJXMiLCBQUk9NUFQpOworICAgICAgICBjaGFyKiBsaW5lID0gTlVMTDsKKyAgICAgICAgc2l6ZV90IGxlbmd0aCA9IDA7CisKKyAgICAgICAgYnVmZmVyWzBdID0gMDsKKyAgICAgICAgZmdldHMoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgc3RkaW4pOworICAgICAgICBpbnQgY291bnQgPSBzdHJsZW4oYnVmZmVyKTsKKyAgICAgICAgaWYgKGNvdW50ID4gMCAmJiBidWZmZXJbMF0gPT0gRU9GKSB7CisgICAgICAgICAgICBwcmludGYoIlxuIik7CisgICAgICAgICAgICBleGl0KDApOworICAgICAgICB9CisgICAgICAgIGlmIChjb3VudCA+IDAgJiYgbGluZVtjb3VudCAtIDFdID09ICdcbicpCisgICAgICAgICAgICBsaW5lW2NvdW50IC0gMV0gPT0gMDsKKyNlbmRpZgorICAgICAgICBjaGFyKiB0b2sgPSBzdHJ0b2sobGluZSwgIiBcdFxuXHIiKTsKKyAgICAgICAgaWYgKCF0b2spCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgaWYgKCFzdHJjbXAodG9rLCAicXVpdCIpIHx8ICFzdHJjbXAodG9rLCAiZXhpdCIpKSB7CisgICAgICAgICAgICBleGl0KDApOworICAgICAgICB9CisjaWYgSEFWRV9SRUFETElORQorICAgICAgICBhZGRfaGlzdG9yeShsaW5lKTsKKyNlbmRpZgorICAgICAgICBhcmdjID0gMDsKKyAgICAgICAgd2hpbGUgKHRvaykgeworICAgICAgICAgICAgaWYgKGFyZ2MgKyAxID09IE1BWF9BUkdTKSB7CisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJ0b28gbWFueSBhcmd1bWVudHNcbiIpOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IC0xOworICAgICAgICAgICAgICAgIGdvdG8gYm90dG9tX29mX2xvb3A7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGFyZ3ZbYXJnYysrXSA9IHN0cmR1cCh0b2spOworICAgICAgICAgICAgdG9rID0gc3RydG9rKE5VTEwsICIgXHRcblxyIik7CisgICAgICAgIH0KKworICAgICAgICByZXN1bHQgPSBkb19jb21tYW5kKGFyZ2MsIGFyZ3YpOworCitib3R0b21fb2ZfbG9vcDoKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdjOyBpKyspCisgICAgICAgICAgICBmcmVlKGFyZ3ZbaV0pOworICAgICAgICBmcmVlKGxpbmUpOworICAgIH0KKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiBhcmd2W10pIHsKKyAgICBpbml0KCk7CisKKyAgICBpZiAoYXJnYyA9PSAxKQorICAgICAgICByZXR1cm4gc2hlbGwoKTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBkb19jb21tYW5kKGFyZ2MgLSAxLCBhcmd2ICsgMSk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9wbGF5ZXJzL2ludm9rZV9tb2NrX21lZGlhX3BsYXllci5jcHAgYi9tZWRpYS90ZXN0cy9wbGF5ZXJzL2ludm9rZV9tb2NrX21lZGlhX3BsYXllci5jcHAKaW5kZXggYjNjYzhiNi4uNTMzMDhiZSAxMDA2NDQKLS0tIGEvbWVkaWEvdGVzdHMvcGxheWVycy9pbnZva2VfbW9ja19tZWRpYV9wbGF5ZXIuY3BwCisrKyBiL21lZGlhL3Rlc3RzL3BsYXllcnMvaW52b2tlX21vY2tfbWVkaWFfcGxheWVyLmNwcApAQCAtMjYsNiArMjYsNyBAQAogCiB1c2luZyBhbmRyb2lkOjpJTlZBTElEX09QRVJBVElPTjsKIHVzaW5nIGFuZHJvaWQ6OklTdXJmYWNlOwordXNpbmcgYW5kcm9pZDo6U3VyZmFjZTsKIHVzaW5nIGFuZHJvaWQ6Ok1lZGlhUGxheWVyQmFzZTsKIHVzaW5nIGFuZHJvaWQ6Ok9LOwogdXNpbmcgYW5kcm9pZDo6UGFyY2VsOwpAQCAtNjcsNyArNjgsOCBAQAogICAgIH0KIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0RGF0YVNvdXJjZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCkge3JldHVybiBPSzt9Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRWaWRlb1N1cmZhY2UoY29uc3Qgc3A8SVN1cmZhY2U+JiBzdXJmYWNlKSB7cmV0dXJuIE9LO30KKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldFZpZGVvSVN1cmZhY2UoY29uc3Qgc3A8SVN1cmZhY2U+JiBzdXJmYWNlKSB7cmV0dXJuIE9LO30KKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldFZpZGVvU3VyZmFjZShjb25zdCBzcDxTdXJmYWNlPiYgc3VyZmFjZSkge3JldHVybiBPSzt9CiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBwcmVwYXJlKCkge3JldHVybiBPSzt9CiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBwcmVwYXJlQXN5bmMoKSB7cmV0dXJuIE9LO30KICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHN0YXJ0KCkge3JldHVybiBPSzt9CmRpZmYgLS1naXQgYS9uYXRpdmUvaW5jbHVkZS9hbmRyb2lkL3R0cy5oIGIvbmF0aXZlL2luY2x1ZGUvYW5kcm9pZC90dHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjE1MTA4Ci0tLSAvZGV2L251bGwKKysrIGIvbmF0aXZlL2luY2x1ZGUvYW5kcm9pZC90dHMuaApAQCAtMCwwICsxLDMxMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBHb29nbGUgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2lmbmRlZiBBTkRST0lEX1RUU19ICisjZGVmaW5lIEFORFJPSURfVFRTX0ggCisKKy8vIFRoaXMgaGVhZGVyIGRlZmluZXMgdGhlIGludGVyZmFjZSB1c2VkIGJ5IHRoZSBBbmRyb2lkIHBsYXRmb3JtCisvLyB0byBhY2Nlc3MgVGV4dC1Uby1TcGVlY2ggZnVuY3Rpb25hbGl0eSBpbiBzaGFyZWQgbGlicmFyaWVzIHRoYXQgaW1wbGVtZW50CisvLyBzcGVlY2ggc3ludGhlc2lzIGFuZCB0aGUgbWFuYWdlbWVudCBvZiByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIHRoZQorLy8gc3ludGhlc2lzLgorCisvLyBUaGUgc2hhcmVkIGxpYnJhcnkgbXVzdCBjb250YWluIGEgZnVuY3Rpb24gbmFtZWQgImFuZHJvaWRfZ2V0VHRzRW5naW5lIgorLy8gdGhhdCByZXR1cm5zIGFuICdhbmRyb2lkX3R0c19lbmdpbmVfdCcgaW5zdGFuY2UuCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2RlZmluZSBBTkRST0lEX1RUU19FTkdJTkVfUFJPUEVSVFlfQ09ORklHICJlbmdpbmVDb25maWciCisjZGVmaW5lIEFORFJPSURfVFRTX0VOR0lORV9QUk9QRVJUWV9QSVRDSCAgInBpdGNoIgorI2RlZmluZSBBTkRST0lEX1RUU19FTkdJTkVfUFJPUEVSVFlfUkFURSAgICJyYXRlIgorI2RlZmluZSBBTkRST0lEX1RUU19FTkdJTkVfUFJPUEVSVFlfVk9MVU1FICJ2b2x1bWUiCisKK3R5cGVkZWYgZW51bSB7CisgICAgQU5EUk9JRF9UVFNfU1VDQ0VTUyAgICAgICAgICAgICAgICAgPSAwLAorICAgIEFORFJPSURfVFRTX0ZBSUxVUkUgICAgICAgICAgICAgICAgID0gLTEsCisgICAgQU5EUk9JRF9UVFNfRkVBVFVSRV9VTlNVUFBPUlRFRCAgICAgPSAtMiwKKyAgICBBTkRST0lEX1RUU19WQUxVRV9JTlZBTElEICAgICAgICAgICA9IC0zLAorICAgIEFORFJPSURfVFRTX1BST1BFUlRZX1VOU1VQUE9SVEVEICAgID0gLTQsCisgICAgQU5EUk9JRF9UVFNfUFJPUEVSVFlfU0laRV9UT09fU01BTEwgPSAtNSwKKyAgICBBTkRST0lEX1RUU19NSVNTSU5HX1JFU09VUkNFUyAgICAgICA9IC02Cit9IGFuZHJvaWRfdHRzX3Jlc3VsdF90OworCit0eXBlZGVmIGVudW0geworICAgIEFORFJPSURfVFRTX0xBTkdfQ09VTlRSWV9WQVJfQVZBSUxBQkxFID0gMiwKKyAgICBBTkRST0lEX1RUU19MQU5HX0NPVU5UUllfQVZBSUxBQkxFICAgID0gMSwKKyAgICBBTkRST0lEX1RUU19MQU5HX0FWQUlMQUJMRSAgICAgICAgICAgID0gMCwKKyAgICBBTkRST0lEX1RUU19MQU5HX01JU1NJTkdfREFUQSAgICAgICAgID0gLTEsCisgICAgQU5EUk9JRF9UVFNfTEFOR19OT1RfU1VQUE9SVEVEICAgICAgICA9IC0yCit9IGFuZHJvaWRfdHRzX3N1cHBvcnRfcmVzdWx0X3Q7CisKK3R5cGVkZWYgZW51bSB7CisgICAgQU5EUk9JRF9UVFNfU1lOVEhfRE9ORSAgICAgICAgICAgICAgPSAwLAorICAgIEFORFJPSURfVFRTX1NZTlRIX1BFTkRJTkcgICAgICAgICAgID0gMQorfSBhbmRyb2lkX3R0c19zeW50aF9zdGF0dXNfdDsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBBTkRST0lEX1RUU19DQUxMQkFDS19IQUxUICAgICAgICAgICA9IDAsCisgICAgQU5EUk9JRF9UVFNfQ0FMTEJBQ0tfQ09OVElOVUUgICAgICAgPSAxCit9IGFuZHJvaWRfdHRzX2NhbGxiYWNrX3N0YXR1c190OworCisvLyBTdXBwb3J0ZWQgYXVkaW8gZm9ybWF0cwordHlwZWRlZiBlbnVtIHsKKyAgICBBTkRST0lEX1RUU19BVURJT19GT1JNQVRfSU5WQUxJRCAgICA9IC0xLAorICAgIEFORFJPSURfVFRTX0FVRElPX0ZPUk1BVF9ERUZBVUxUICAgID0gMCwKKyAgICBBTkRST0lEX1RUU19BVURJT19GT1JNQVRfUENNXzE2X0JJVCA9IDEsCisgICAgQU5EUk9JRF9UVFNfQVVESU9fRk9STUFUX1BDTV84X0JJVCAgPSAyLAorfSBhbmRyb2lkX3R0c19hdWRpb19mb3JtYXRfdDsKKworCisvKiBBbiBhbmRyb2lkX3R0c19lbmdpbmVfdCBvYmplY3QgY2FuIGJlIGFueXRoaW5nLCBidXQgbXVzdCBoYXZlLAorICogYXMgaXRzIGZpcnN0IGZpZWxkLCBhIHBvaW50ZXIgdG8gYSB0YWJsZSBvZiBmdW5jdGlvbnMuCisgKgorICogU2VlIHRoZSBmdWxsIGRlZmluaXRpb24gb2Ygc3RydWN0IGFuZHJvaWRfdHRzX2VuZ2luZV90X2Z1bmNzX3QKKyAqIGJlbG93IGZvciBkZXRhaWxzLgorICovCit0eXBlZGVmIHN0cnVjdCBhbmRyb2lkX3R0c19lbmdpbmVfZnVuY3NfdCAgYW5kcm9pZF90dHNfZW5naW5lX2Z1bmNzX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBhbmRyb2lkX3R0c19lbmdpbmVfZnVuY3NfdCAqZnVuY3M7Cit9IGFuZHJvaWRfdHRzX2VuZ2luZV90OworCisvKiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgbG9jYXRlZCBpbiB0aGUgVFRTIEVuZ2luZSBzaGFyZWQgbGlicmFyeQorICogYW5kIG11c3QgcmV0dXJuIHRoZSBhZGRyZXNzIG9mIGFuIGFuZHJvaWRfdHRzX2VuZ2luZV90IGxpYnJhcnkuCisgKi8KK2V4dGVybiBhbmRyb2lkX3R0c19lbmdpbmVfdCAqYW5kcm9pZF9nZXRUdHNFbmdpbmUoKTsKKworLyogSW5jbHVkaW5nIHRoZSBvbGQgdmVyc2lvbiBmb3IgbGVnYWN5IHN1cHBvcnQgKEZyb3lvIGNvbXBhdGliaWxpdHkpLgorICogVGhpcyBzaG91bGQgcmV0dXJuIHRoZSBzYW1lIHRoaW5nIGFzIGFuZHJvaWRfZ2V0VHRzRW5naW5lLgorICovCitleHRlcm4gIkMiIGFuZHJvaWRfdHRzX2VuZ2luZV90ICpnZXRUdHNFbmdpbmUoKTsKKworLy8gQSBjYWxsYmFjayB0eXBlIHVzZWQgdG8gbm90aWZ5IHRoZSBmcmFtZXdvcmsgb2YgbmV3IHN5bnRoZXRpemVkCisvLyBhdWRpbyBzYW1wbGVzLCBzdGF0dXMgd2lsbCBiZSBTWU5USF9ET05FIGZvciB0aGUgbGFzdCBzYW1wbGUgb2YKKy8vIHRoZSBsYXN0IHJlcXVlc3QsIG9mIFNZTlRIX1BFTkRJTkcgb3RoZXJ3aXNlLgorLy8KKy8vIFRoaXMgaXMgcGFzc2VkIGJ5IHRoZSBmcmFtZXdvcmsgdG8gdGhlIGVuZ2luZSB0aHJvdWdoIHRoZQorLy8gJ2VuZ2luZV9pbml0JyBmdW5jdGlvbiAoc2VlIGJlbG93KS4KKy8vCisvLyBUaGUgY2FsbGJhY2sgZm9yIHN5bnRoZXNpcyBjb21wbGV0ZWQgdGFrZXM6CisvLyBAcGFyYW0gW2lub3V0XSB2b2lkIComICAgICAgIC0gVGhlIHVzZXJkYXRhIHBvaW50ZXIgc2V0IGluIHRoZSBvcmlnaW5hbAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW50aCBjYWxsCisvLyBAcGFyYW0gW2luXSAgICB1aW50MzJfdCAgICAgIC0gVHJhY2sgc2FtcGxpbmcgcmF0ZSBpbiBIegorLy8gQHBhcmFtIFtpbl0gICAgdWludDMyX3QgICAgICAtIFRoZSBhdWRpbyBmb3JtYXQKKy8vIEBwYXJhbSBbaW5dICAgIGludCAgICAgICAgICAgLSBUaGUgbnVtYmVyIG9mIGNoYW5uZWxzCisvLyBAcGFyYW0gW2lub3V0XSBpbnQ4X3QgKiYgICAgIC0gQSBidWZmZXIgb2YgYXVkaW8gZGF0YSBvbmx5IHZhbGlkIGR1cmluZyB0aGUKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRpb24gb2YgdGhlIGNhbGxiYWNrCisvLyBAcGFyYW0gW2lub3V0XSBzaXplX3QgICYgICAgIC0gVGhlIHNpemUgb2YgdGhlIGJ1ZmZlcgorLy8gQHBhcmFtIFtpbl0gdHRzX3N5bnRoX3N0YXR1cyAtIGluZGljYXRlIHdoZXRoZXIgdGhlIHN5bnRoZXNpcyBpcyBkb25lLCBvcgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBtb3JlIGRhdGEgaXMgdG8gYmUgc3ludGhlc2l6ZWQuCisvLyBAcmV0dXJuIFRUU19DQUxMQkFDS19IQUxUIHRvIGluZGljYXRlIHRoZSBzeW50aGVzaXMgbXVzdCBzdG9wLAorLy8gICAgICAgICBUVFNfQ0FMTEJBQ0tfQ09OVElOVUUgdG8gaW5kaWNhdGUgdGhlIHN5bnRoZXNpcyBtdXN0IGNvbnRpbnVlIGlmCisvLyAgICAgICAgICAgIHRoZXJlIGlzIG1vcmUgZGF0YSB0byBwcm9kdWNlLgordHlwZWRlZiBhbmRyb2lkX3R0c19jYWxsYmFja19zdGF0dXNfdCAoKmFuZHJvaWRfdHRzX3N5bnRoX2NiX3QpCisgICAgICAgICAgICAodm9pZCAqKnBVc2VyRGF0YSwKKyAgICAgICAgICAgICB1aW50MzJfdCB0cmFja1NhbXBsaW5nSHosCisgICAgICAgICAgICAgYW5kcm9pZF90dHNfYXVkaW9fZm9ybWF0X3QgYXVkaW9Gb3JtYXQsCisgICAgICAgICAgICAgaW50IGNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICBpbnQ4X3QgKipwQXVkaW9CdWZmZXIsCisgICAgICAgICAgICAgc2l6ZV90ICpwQnVmZmVyU2l6ZSwKKyAgICAgICAgICAgICBhbmRyb2lkX3R0c19zeW50aF9zdGF0dXNfdCBzdGF0dXMpOworCisKKy8vIFRoZSB0YWJsZSBvZiBmdW5jdGlvbiBwb2ludGVycyB0aGF0IHRoZSBhbmRyb2lkX3R0c19lbmdpbmVfdCBtdXN0IHBvaW50IHRvLgorLy8gTm90ZSB0aGF0IGVhY2ggb2YgdGhlc2UgZnVuY3Rpb25zIHdpbGwgdGFrZSBhIGhhbmRsZSB0byB0aGUgZW5naW5lIGl0c2VsZgorLy8gYXMgdGhlaXIgZmlyc3QgcGFyYW1ldGVyLgorLy8KKworc3RydWN0IGFuZHJvaWRfdHRzX2VuZ2luZV9mdW5jc190IHsKKyAgICAvLyByZXNlcnZlZCBmaWVsZHMsIGlnbm9yZWQgYnkgdGhlIGZyYW1ld29yaworICAgIC8vIHRoZXkgbXVzdCBiZSBwbGFjZWQgaGVyZSB0byBlbnN1cmUgYmluYXJ5IGNvbXBhdGliaWxpdHkKKyAgICAvLyBvZiBsZWdhY3kgYmluYXJ5IHBsdWdpbnMuCisgICAgdm9pZCAqcmVzZXJ2ZWRbMl07CisKKyAgICAvLyBJbml0aWFsaXplIHRoZSBUVFMgZW5naW5lIGFuZCByZXR1cm5zIHdoZXRoZXIgaW5pdGlhbGl6YXRpb24gc3VjY2VlZGVkLgorICAgIC8vIEBwYXJhbSBzeW50aERvbmVDQlB0ciBzeW50aGVzaXMgY2FsbGJhY2sgZnVuY3Rpb24gcG9pbnRlcgorICAgIC8vIEByZXR1cm4gVFRTX1NVQ0NFU1MsIG9yIFRUU19GQUlMVVJFCisgICAgYW5kcm9pZF90dHNfcmVzdWx0X3QgKCppbml0KQorICAgICAgICAgICAgKHZvaWQgKmVuZ2luZSwKKyAgICAgICAgICAgICBhbmRyb2lkX3R0c19zeW50aF9jYl90IHN5bnRoRG9uZVB0ciwKKyAgICAgICAgICAgICBjb25zdCBjaGFyICplbmdpbmVDb25maWcpOworCisgICAgLy8gU2h1dCBkb3duIHRoZSBUVFMgZW5naW5lIGFuZCByZWxlYXNlcyBhbGwgYXNzb2NpYXRlZCByZXNvdXJjZXMuCisgICAgLy8gQHJldHVybiBUVFNfU1VDQ0VTUywgb3IgVFRTX0ZBSUxVUkUKKyAgICBhbmRyb2lkX3R0c19yZXN1bHRfdCAoKnNodXRkb3duKQorICAgICAgICAgICAgKHZvaWQgKmVuZ2luZSk7CisKKyAgICAvLyBJbnRlcnJ1cHQgc3ludGhlc2lzIGFuZCBmbHVzaGVzIGFueSBzeW50aGVzaXplZCBkYXRhIHRoYXQgaGFzbid0IGJlZW4KKyAgICAvLyBvdXRwdXQgeWV0LiBUaGlzIHdpbGwgYmxvY2sgdW50aWwgY2FsbGJhY2tzIHVuZGVyd2F5IGFyZSBjb21wbGV0ZWQuCisgICAgLy8gQHJldHVybiBUVFNfU1VDQ0VTUywgb3IgVFRTX0ZBSUxVUkUKKyAgICBhbmRyb2lkX3R0c19yZXN1bHRfdCAoKnN0b3ApCisgICAgICAgICAgICAodm9pZCAqZW5naW5lKTsKKworICAgIC8vIFJldHVybnMgdGhlIGxldmVsIG9mIHN1cHBvcnQgZm9yIHRoZSBsYW5ndWFnZSwgY291bnRyeSBhbmQgdmFyaWFudC4KKyAgICAvLyBAcmV0dXJuIFRUU19MQU5HX0NPVU5UUllfVkFSX0FWQUlMQUJMRSBpZiB0aGUgbGFuZ3VhZ2UsIGNvdW50cnkgYW5kIHZhcmlhbnQgYXJlIHN1cHBvcnRlZCwKKyAgICAvLyAgICAgICAgICAgIGFuZCB0aGUgY29ycmVzcG9uZGluZyByZXNvdXJjZXMgYXJlIGNvcnJlY3RseSBpbnN0YWxsZWQKKyAgICAvLyAgICAgICAgIFRUU19MQU5HX0NPVU5UUllfQVZBSUxBQkxFIGlmIHRoZSBsYW5ndWFnZSBhbmQgY291bnRyeSBhcmUgc3VwcG9ydGVkIGFuZCB0aGUKKyAgICAvLyAgICAgICAgICAgICBjb3JyZXNwb25kaW5nIHJlc291cmNlcyBhcmUgY29ycmVjdGx5IGluc3RhbGxlZCwgYnV0IHRoZXJlIGlzIG5vIG1hdGNoIGZvcgorICAgIC8vICAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgdmFyaWFudAorICAgIC8vICAgICAgICAgVFRTX0xBTkdfQVZBSUxBQkxFIGlmIHRoZSBsYW5ndWFnZSBpcyBzdXBwb3J0ZWQgYW5kIHRoZQorICAgIC8vICAgICAgICAgICAgIGNvcnJlc3BvbmRpbmcgcmVzb3VyY2VzIGFyZSBjb3JyZWN0bHkgaW5zdGFsbGVkLCBidXQgdGhlcmUgaXMgbm8gbWF0Y2ggZm9yCisgICAgLy8gICAgICAgICAgICAgdGhlIHNwZWNpZmllZCBjb3VudHJ5IGFuZCB2YXJpYW50CisgICAgLy8gICAgICAgICBUVFNfTEFOR19NSVNTSU5HX0RBVEEgaWYgdGhlIHJlcXVpcmVkIHJlc291cmNlcyB0byBwcm92aWRlIGFueSBsZXZlbCBvZiBzdXBwb3J0CisgICAgLy8gICAgICAgICAgICAgZm9yIHRoZSBsYW5ndWFnZSBhcmUgbm90IGNvcnJlY3RseSBpbnN0YWxsZWQKKyAgICAvLyAgICAgICAgIFRUU19MQU5HX05PVF9TVVBQT1JURUQgaWYgdGhlIGxhbmd1YWdlIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIFRUUyBlbmdpbmUuCisgICAgYW5kcm9pZF90dHNfc3VwcG9ydF9yZXN1bHRfdCAoKmlzTGFuZ3VhZ2VBdmFpbGFibGUpCisgICAgICAgICAgICAodm9pZCAqZW5naW5lLAorICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmxhbmcsCisgICAgICAgICAgICAgY29uc3QgY2hhciAqY291bnRyeSwKKyAgICAgICAgICAgICBjb25zdCBjaGFyICp2YXJpYW50KTsKKworICAgIC8vIExvYWQgdGhlIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBsYW5ndWFnZS4gVGhlIGxvYWRlZAorICAgIC8vIGxhbmd1YWdlIHdpbGwgb25seSBiZSB1c2VkIG9uY2UgYSBjYWxsIHRvIHNldExhbmd1YWdlKCkgd2l0aCB0aGUgc2FtZQorICAgIC8vIGxhbmd1YWdlIHZhbHVlIGlzIGlzc3VlZC4gTGFuZ3VhZ2UgYW5kIGNvdW50cnkgdmFsdWVzIGFyZSBjb2RlZCBhY2NvcmRpbmcgdG8gdGhlIElTTyB0aHJlZQorICAgIC8vIGxldHRlciBjb2RlcyBmb3IgbGFuZ3VhZ2VzIGFuZCBjb3VudHJpZXMsIGFzIGNhbiBiZSByZXRyaWV2ZWQgZnJvbSBhIGphdmEudXRpbC5Mb2NhbGUKKyAgICAvLyBpbnN0YW5jZS4gVGhlIHZhcmlhbnQgdmFsdWUgaXMgZW5jb2RlZCBhcyB0aGUgdmFyaWFudCBzdHJpbmcgcmV0cmlldmVkIGZyb20gYQorICAgIC8vIGphdmEudXRpbC5Mb2NhbGUgaW5zdGFuY2UgYnVpbHQgd2l0aCB0aGF0IHZhcmlhbnQgZGF0YS4KKyAgICAvLyBAcGFyYW0gbGFuZyBwb2ludGVyIHRvIHRoZSBJU08gdGhyZWUgbGV0dGVyIGNvZGUgZm9yIHRoZSBsYW5ndWFnZQorICAgIC8vIEBwYXJhbSBjb3VudHJ5IHBvaW50ZXIgdG8gdGhlIElTTyB0aHJlZSBsZXR0ZXIgY29kZSBmb3IgdGhlIGNvdW50cnkKKyAgICAvLyBAcGFyYW0gdmFyaWFudCBwb2ludGVyIHRvIHRoZSB2YXJpYW50IGNvZGUKKyAgICAvLyBAcmV0dXJuIFRUU19TVUNDRVNTLCBvciBUVFNfRkFJTFVSRQorICAgIGFuZHJvaWRfdHRzX3Jlc3VsdF90ICgqbG9hZExhbmd1YWdlKQorICAgICAgICAgICAgKHZvaWQgKmVuZ2luZSwKKyAgICAgICAgICAgICBjb25zdCBjaGFyICpsYW5nLAorICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmNvdW50cnksCisgICAgICAgICAgICAgY29uc3QgY2hhciAqdmFyaWFudCk7CisKKyAgICAvLyBMb2FkIHRoZSByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgbGFuZ3VhZ2UsIGNvdW50cnkgYW5kIExvY2FsZSB2YXJpYW50LgorICAgIC8vIFRoZSBsb2FkZWQgbGFuZ3VhZ2Ugd2lsbCBvbmx5IGJlIHVzZWQgb25jZSBhIGNhbGwgdG8gc2V0TGFuZ3VhZ2VGcm9tTG9jYWxlKCkgd2l0aCB0aGUgc2FtZQorICAgIC8vIGxhbmd1YWdlIHZhbHVlIGlzIGlzc3VlZC4gTGFuZ3VhZ2UgYW5kIGNvdW50cnkgdmFsdWVzIGFyZSBjb2RlZCBhY2NvcmRpbmcgdG8gdGhlIElTTyB0aHJlZQorICAgIC8vIGxldHRlciBjb2RlcyBmb3IgbGFuZ3VhZ2VzIGFuZCBjb3VudHJpZXMsIGFzIGNhbiBiZSByZXRyaWV2ZWQgZnJvbSBhIGphdmEudXRpbC5Mb2NhbGUKKyAgICAvLyBpbnN0YW5jZS4gVGhlIHZhcmlhbnQgdmFsdWUgaXMgZW5jb2RlZCBhcyB0aGUgdmFyaWFudCBzdHJpbmcgcmV0cmlldmVkIGZyb20gYQorICAgIC8vIGphdmEudXRpbC5Mb2NhbGUgaW5zdGFuY2UgYnVpbHQgd2l0aCB0aGF0IHZhcmlhbnQgZGF0YS4KKyAgICAvLyBAcGFyYW0gbGFuZyBwb2ludGVyIHRvIHRoZSBJU08gdGhyZWUgbGV0dGVyIGNvZGUgZm9yIHRoZSBsYW5ndWFnZQorICAgIC8vIEBwYXJhbSBjb3VudHJ5IHBvaW50ZXIgdG8gdGhlIElTTyB0aHJlZSBsZXR0ZXIgY29kZSBmb3IgdGhlIGNvdW50cnkKKyAgICAvLyBAcGFyYW0gdmFyaWFudCBwb2ludGVyIHRvIHRoZSB2YXJpYW50IGNvZGUKKyAgICAvLyBAcmV0dXJuIFRUU19TVUNDRVNTLCBvciBUVFNfRkFJTFVSRQorICAgIGFuZHJvaWRfdHRzX3Jlc3VsdF90ICgqc2V0TGFuZ3VhZ2UpCisgICAgICAgICAgICAodm9pZCAqZW5naW5lLAorICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmxhbmcsCisgICAgICAgICAgICAgY29uc3QgY2hhciAqY291bnRyeSwKKyAgICAgICAgICAgICBjb25zdCBjaGFyICp2YXJpYW50KTsKKworICAgIC8vIFJldHJpZXZlIHRoZSBjdXJyZW50bHkgc2V0IGxhbmd1YWdlLCBjb3VudHJ5IGFuZCB2YXJpYW50LCBvciBlbXB0eSBzdHJpbmdzIGlmIG5vbmUgb2YKKyAgICAvLyBwYXJhbWV0ZXJzIGhhdmUgYmVlbiBzZXQuIExhbmd1YWdlIGFuZCBjb3VudHJ5IGFyZSByZXByZXNlbnRlZCBieSB0aGVpciAzLWxldHRlciBJU08gY29kZQorICAgIC8vIEBwYXJhbVtvdXRdICAgcG9pbnRlciB0byB0aGUgcmV0cmlldmVkIDMtbGV0dGVyIGNvZGUgbGFuZ3VhZ2UgdmFsdWUKKyAgICAvLyBAcGFyYW1bb3V0XSAgIHBvaW50ZXIgdG8gdGhlIHJldHJpZXZlZCAzLWxldHRlciBjb2RlIGNvdW50cnkgdmFsdWUKKyAgICAvLyBAcGFyYW1bb3V0XSAgIHBvaW50ZXIgdG8gdGhlIHJldHJpZXZlZCB2YXJpYW50IHZhbHVlCisgICAgLy8gQHJldHVybiBUVFNfU1VDQ0VTUywgb3IgVFRTX0ZBSUxVUkUKKyAgICBhbmRyb2lkX3R0c19yZXN1bHRfdCAoKmdldExhbmd1YWdlKQorICAgICAgICAgICAgKHZvaWQgKmVuZ2luZSwKKyAgICAgICAgICAgICBjaGFyICpsYW5ndWFnZSwKKyAgICAgICAgICAgICBjaGFyICpjb3VudHJ5LAorICAgICAgICAgICAgIGNoYXIgKnZhcmlhbnQpOworCisgICAgLy8gTm90aWZpZXMgdGhlIGVuZ2luZSB3aGF0IGF1ZGlvIHBhcmFtZXRlcnMgc2hvdWxkIGJlIHVzZWQgZm9yIHRoZSBzeW50aGVzaXMuCisgICAgLy8gVGhpcyBpcyBtZWFudCB0byBiZSB1c2VkIGFzIGEgaGludCwgdGhlIGVuZ2luZSBpbXBsZW1lbnRhdGlvbiB3aWxsIHNldCB0aGUgb3V0cHV0IHZhbHVlcworICAgIC8vIHRvIHRob3NlIG9mIHRoZSBzeW50aGVzaXMgZm9ybWF0LCBiYXNlZCBvbiBhIGdpdmVuIGhpbnQuCisgICAgLy8gQHBhcmFtW2lub3V0XSBlbmNvZGluZyBpbjogdGhlIGRlc2lyZWQgYXVkaW8gc2FtcGxlIGZvcm1hdAorICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgIG91dDogdGhlIGZvcm1hdCB1c2VkIGJ5IHRoZSBUVFMgZW5naW5lCisgICAgLy8gQHBhcmFtW2lub3V0XSByYXRlIGluOiB0aGUgZGVzaXJlZCBhdWRpbyBzYW1wbGUgcmF0ZQorICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgIG91dDogdGhlIHNhbXBsZSByYXRlIHVzZWQgYnkgdGhlIFRUUyBlbmdpbmUKKyAgICAvLyBAcGFyYW1baW5vdXRdIGNoYW5uZWxzIGluOiB0aGUgZGVzaXJlZCBudW1iZXIgb2YgYXVkaW8gY2hhbm5lbHMKKyAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICBvdXQ6IHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgdXNlZCBieSB0aGUgVFRTIGVuZ2luZQorICAgIC8vIEByZXR1cm4gVFRTX1NVQ0NFU1MsIG9yIFRUU19GQUlMVVJFCisgICAgYW5kcm9pZF90dHNfcmVzdWx0X3QgKCpzZXRBdWRpb0Zvcm1hdCkKKyAgICAgICAgICAgICh2b2lkICplbmdpbmUsCisgICAgICAgICAgICAgYW5kcm9pZF90dHNfYXVkaW9fZm9ybWF0X3QqIHBFbmNvZGluZywKKyAgICAgICAgICAgICB1aW50MzJfdCogcFJhdGUsCisgICAgICAgICAgICAgaW50KiBwQ2hhbm5lbHMpOworCisgICAgLy8gU2V0IGEgcHJvcGVydHkgZm9yIHRoZSB0aGUgVFRTIGVuZ2luZQorICAgIC8vICJzaXplIiBpcyB0aGUgbWF4aW11bSBzaXplIG9mICJ2YWx1ZSIgZm9yIHByb3BlcnRpZXMgInByb3BlcnR5IgorICAgIC8vIEBwYXJhbSBwcm9wZXJ0eSBwb2ludGVyIHRvIHRoZSBwcm9wZXJ0eSBuYW1lCisgICAgLy8gQHBhcmFtIHZhbHVlICAgIHBvaW50ZXIgdG8gdGhlIHByb3BlcnR5IHZhbHVlCisgICAgLy8gQHBhcmFtIHNpemUgICAgIG1heGltdW0gc2l6ZSByZXF1aXJlZCB0byBzdG9yZSB0aGlzIHR5cGUgb2YgcHJvcGVydHkKKyAgICAvLyBAcmV0dXJuICAgICAgICAgVFRTX1BST1BFUlRZX1VOU1VQUE9SVEVELCBvciBUVFNfU1VDQ0VTUywgb3IgVFRTX0ZBSUxVUkUsCisgICAgLy8gICAgICAgICAgICAgICAgICBvciBUVFNfVkFMVUVfSU5WQUxJRAorICAgIGFuZHJvaWRfdHRzX3Jlc3VsdF90ICgqc2V0UHJvcGVydHkpCisgICAgICAgICAgICAodm9pZCAqZW5naW5lLAorICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnByb3BlcnR5LAorICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnZhbHVlLAorICAgICAgICAgICAgIGNvbnN0IHNpemVfdCBzaXplKTsKKworICAgIC8vIFJldHJpZXZlIGEgcHJvcGVydHkgZnJvbSB0aGUgVFRTIGVuZ2luZQorICAgIC8vIEBwYXJhbSAgICAgICAgcHJvcGVydHkgcG9pbnRlciB0byB0aGUgcHJvcGVydHkgbmFtZQorICAgIC8vIEBwYXJhbVtvdXRdICAgdmFsdWUgICAgcG9pbnRlciB0byB0aGUgcmV0cmlldmVkIGxhbmd1YWdlIHZhbHVlCisgICAgLy8gQHBhcmFtW2lub3V0XSBpb3NpemUgICBpbjogc3RvcmVzIHRoZSBzaXplIGF2YWlsYWJsZSB0byBzdG9yZSB0aGUKKyAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHkgdmFsdWUuCisgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICBvdXQ6IHN0b3JlcyB0aGUgc2l6ZSByZXF1aXJlZCB0byBob2xkIHRoZSBsYW5ndWFnZQorICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBpZiBnZXRMYW5ndWFnZSgpIHJldHVybmVkCisgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgIFRUU19QUk9QRVJUWV9TSVpFX1RPT19TTUFMTCwgdW5jaGFuZ2VkIG90aGVyd2lzZQorICAgIC8vIEByZXR1cm4gVFRTX1BST1BFUlRZX1VOU1VQUE9SVEVELCBvciBUVFNfU1VDQ0VTUywKKyAgICAvLyAgICAgICAgIG9yIFRUU19QUk9QRVJUWV9TSVpFX1RPT19TTUFMTAorICAgIGFuZHJvaWRfdHRzX3Jlc3VsdF90ICgqZ2V0UHJvcGVydHkpCisgICAgICAgICAgICAodm9pZCAqZW5naW5lLAorICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnByb3BlcnR5LAorICAgICAgICAgICAgIGNoYXIgKnZhbHVlLAorICAgICAgICAgICAgIHNpemVfdCAqaW9zaXplKTsKKworICAgIC8vIFN5bnRoZXNpemUgdGhlIHRleHQuCisgICAgLy8gQXMgdGhlIHN5bnRoZXNpcyBpcyBwZXJmb3JtZWQsIHRoZSBlbmdpbmUgaW52b2tlcyB0aGUgY2FsbGJhY2sgdG8gbm90aWZ5CisgICAgLy8gdGhlIFRUUyBmcmFtZXdvcmsgdGhhdCBpdCBoYXMgZmlsbGVkIHRoZSBnaXZlbiBidWZmZXIsIGFuZCBpbmRpY2F0ZXMgaG93CisgICAgLy8gbWFueSBieXRlcyBpdCB3cm90ZS4gVGhlIGNhbGxiYWNrIGlzIGNhbGxlZCByZXBlYXRlZGx5IHVudGlsIHRoZSBlbmdpbmUKKyAgICAvLyBoYXMgZ2VuZXJhdGVkIGFsbCB0aGUgYXVkaW8gZGF0YSBjb3JyZXNwb25kaW5nIHRvIHRoZSB0ZXh0LgorICAgIC8vIE5vdGUgYWJvdXQgdGhlIGZvcm1hdCBvZiB0aGUgaW5wdXQ6IHRoZSB0ZXh0IHBhcmFtZXRlciBtYXkgdXNlIHRoZQorICAgIC8vIGZvbGxvd2luZyBlbGVtZW50cworICAgIC8vIGFuZCB0aGVpciByZXNwZWN0aXZlIGF0dHJpYnV0ZXMgYXMgZGVmaW5lZCBpbiB0aGUgU1NNTCAxLjAgc3BlY2lmaWNhdGlvbjoKKyAgICAvLyAgICAqIGxhbmcKKyAgICAvLyAgICAqIHNheS1hczoKKyAgICAvLyAgICAgICAgICBvIGludGVycHJldC1hcworICAgIC8vICAgICogcGhvbmVtZQorICAgIC8vICAgICogdm9pY2U6CisgICAgLy8gICAgICAgICAgbyBnZW5kZXIsCisgICAgLy8gICAgICAgICAgbyBhZ2UsCisgICAgLy8gICAgICAgICAgbyB2YXJpYW50LAorICAgIC8vICAgICAgICAgIG8gbmFtZQorICAgIC8vICAgICogZW1waGFzaXMKKyAgICAvLyAgICAqIGJyZWFrOgorICAgIC8vICAgICAgICAgIG8gc3RyZW5ndGgsCisgICAgLy8gICAgICAgICAgbyB0aW1lCisgICAgLy8gICAgKiBwcm9zb2R5OgorICAgIC8vICAgICAgICAgIG8gcGl0Y2gsCisgICAgLy8gICAgICAgICAgbyBjb250b3VyLAorICAgIC8vICAgICAgICAgIG8gcmFuZ2UsCisgICAgLy8gICAgICAgICAgbyByYXRlLAorICAgIC8vICAgICAgICAgIG8gZHVyYXRpb24sCisgICAgLy8gICAgICAgICAgbyB2b2x1bWUKKyAgICAvLyAgICAqIG1hcmsKKyAgICAvLyBEaWZmZXJlbmNlcyBiZXR3ZWVuIHRoaXMgdGV4dCBmb3JtYXQgYW5kIFNTTUwgYXJlOgorICAgIC8vICAgICogZnVsbCBTU01MIGRvY3VtZW50cyBhcmUgbm90IHN1cHBvcnRlZAorICAgIC8vICAgICogbmFtZXNwYWNlcyBhcmUgbm90IHN1cHBvcnRlZAorICAgIC8vIFRleHQgaXMgY29kZWQgaW4gVVRGLTguCisgICAgLy8gQHBhcmFtIHRleHQgICAgICB0aGUgVVRGLTggdGV4dCB0byBzeW50aGVzaXplCisgICAgLy8gQHBhcmFtIHVzZXJkYXRhICBwb2ludGVyIHRvIGJlIHJldHVybmVkIHdoZW4gdGhlIGNhbGwgaXMgaW52b2tlZAorICAgIC8vIEBwYXJhbSBidWZmZXIgICAgdGhlIGxvY2F0aW9uIHdoZXJlIHRoZSBzeW50aGVzaXplZCBkYXRhIG11c3QgYmUgd3JpdHRlbgorICAgIC8vIEBwYXJhbSBidWZmZXJTaXplIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBjYW4gYmUgd3JpdHRlbiBpbiBidWZmZXIKKyAgICAvLyBAcmV0dXJuICAgICAgICAgIFRUU19TVUNDRVNTIG9yIFRUU19GQUlMVVJFCisgICAgYW5kcm9pZF90dHNfcmVzdWx0X3QgKCpzeW50aGVzaXplVGV4dCkKKyAgICAgICAgICAgICh2b2lkICplbmdpbmUsCisgICAgICAgICAgICAgY29uc3QgY2hhciAqdGV4dCwKKyAgICAgICAgICAgICBpbnQ4X3QgKmJ1ZmZlciwKKyAgICAgICAgICAgICBzaXplX3QgYnVmZmVyU2l6ZSwKKyAgICAgICAgICAgICB2b2lkICp1c2VyZGF0YSk7Cit9OworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogQU5EUk9JRF9UVFNfSCAqLwpkaWZmIC0tZ2l0IGEvb3BlbmdsL2xpYnMvR0xFUzIvZ2wyLmNwcCBiL29wZW5nbC9saWJzL0dMRVMyL2dsMi5jcHAKaW5kZXggOTI0NzM3ZS4uYTEyZWRmMiAxMDA2NDQKLS0tIGEvb3BlbmdsL2xpYnMvR0xFUzIvZ2wyLmNwcAorKysgYi9vcGVuZ2wvbGlicy9HTEVTMi9nbDIuY3BwCkBAIC0zOSw2ICszOSw4IEBACiAjdW5kZWYgQ0FMTF9HTF9BUEkKICN1bmRlZiBDQUxMX0dMX0FQSV9SRVRVUk4KIAorI2RlZmluZSBERUJVR19DQUxMX0dMX0FQSSAwCisKICNpZiBVU0VfRkFTVF9UTFNfS0VZCiAKICAgICAjaWZkZWYgSEFWRV9BUk1fVExTX1JFR0lTVEVSCkBAIC03MywxMCArNzUsMjQgQEAKIAogICAgICNkZWZpbmUgQVBJX0VOVFJZKF9hcGkpIF9hcGkKIAorI2lmIERFQlVHX0NBTExfR0xfQVBJCisKICAgICAjZGVmaW5lIENBTExfR0xfQVBJKF9hcGksIC4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIGdsX2hvb2tzX3Q6OmdsX3QgY29uc3QgKiBjb25zdCBfYyA9ICZnZXRHbFRocmVhZFNwZWNpZmljKCktPmdsOyAgXAotICAgICAgICBfYy0+X2FwaShfX1ZBX0FSR1NfXykKLSAgICAKKyAgICAgICAgX2MtPl9hcGkoX19WQV9BUkdTX18pOyBcCisgICAgICAgIEdMZW51bSBzdGF0dXMgPSBHTF9OT19FUlJPUjsgXAorICAgICAgICB3aGlsZSAoKHN0YXR1cyA9IGdsR2V0RXJyb3IoKSkgIT0gR0xfTk9fRVJST1IpIHsgXAorICAgICAgICAgICAgTE9HRCgiWyIgI19hcGkgIl0gMHgleCIsIHN0YXR1cyk7IFwKKyAgICAgICAgfQorCisjZWxzZQorCisgICAgI2RlZmluZSBDQUxMX0dMX0FQSShfYXBpLCAuLi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBnbF9ob29rc190OjpnbF90IGNvbnN0ICogY29uc3QgX2MgPSAmZ2V0R2xUaHJlYWRTcGVjaWZpYygpLT5nbDsgIFwKKyAgICAgICAgX2MtPl9hcGkoX19WQV9BUkdTX18pOworCisjZW5kaWYKKwogICAgICNkZWZpbmUgQ0FMTF9HTF9BUElfUkVUVVJOKF9hcGksIC4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgZ2xfaG9va3NfdDo6Z2xfdCBjb25zdCAqIGNvbnN0IF9jID0gJmdldEdsVGhyZWFkU3BlY2lmaWMoKS0+Z2w7ICBcCiAgICAgICAgIHJldHVybiBfYy0+X2FwaShfX1ZBX0FSR1NfXykKZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9nbF9wZXJmL0FuZHJvaWQubWsgYi9vcGVuZ2wvdGVzdHMvZ2xfcGVyZi9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3NjQ3Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvZ2xfcGVyZi9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMjAgQEAKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUzo9IFwKKwlnbDJfcGVyZi5jcHAgXAorCWZpbGx0ZXN0LmNwcAorCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKKwlsaWJjdXRpbHMgXAorICAgIGxpYkVHTCBcCisgICAgbGliR0xFU3YyIFwKKyAgICBsaWJ1aQorCitMT0NBTF9NT0RVTEU6PSB0ZXN0LW9wZW5nbC1nbDJfcGVyZgorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorCitMT0NBTF9DRkxBR1MgOj0gLURHTF9HTEVYVF9QUk9UT1RZUEVTCisKK2luY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2dsX3BlcmYvZmlsbF9jb21tb24uY3BwIGIvb3BlbmdsL3Rlc3RzL2dsX3BlcmYvZmlsbF9jb21tb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2ZGIxYjAKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvZ2xfcGVyZi9maWxsX2NvbW1vbi5jcHAKQEAgLTAsMCArMSwzMTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitGSUxFICogZk91dCA9IE5VTEw7Cit2b2lkIHB0U3dhcCgpOworCitzdGF0aWMgdm9pZCBjaGVja0dsRXJyb3IoY29uc3QgY2hhciogb3ApIHsKKyAgICBmb3IgKEdMaW50IGVycm9yID0gZ2xHZXRFcnJvcigpOyBlcnJvcjsgZXJyb3IKKyAgICAgICAgICAgID0gZ2xHZXRFcnJvcigpKSB7CisgICAgICAgIExPR0UoImFmdGVyICVzKCkgZ2xFcnJvciAoMHgleClcbiIsIG9wLCBlcnJvcik7CisgICAgfQorfQorCitHTHVpbnQgbG9hZFNoYWRlcihHTGVudW0gc2hhZGVyVHlwZSwgY29uc3QgY2hhciogcFNvdXJjZSkgeworICAgIEdMdWludCBzaGFkZXIgPSBnbENyZWF0ZVNoYWRlcihzaGFkZXJUeXBlKTsKKyAgICBpZiAoc2hhZGVyKSB7CisgICAgICAgIGdsU2hhZGVyU291cmNlKHNoYWRlciwgMSwgJnBTb3VyY2UsIE5VTEwpOworICAgICAgICBnbENvbXBpbGVTaGFkZXIoc2hhZGVyKTsKKyAgICAgICAgR0xpbnQgY29tcGlsZWQgPSAwOworICAgICAgICBnbEdldFNoYWRlcml2KHNoYWRlciwgR0xfQ09NUElMRV9TVEFUVVMsICZjb21waWxlZCk7CisgICAgICAgIGlmICghY29tcGlsZWQpIHsKKyAgICAgICAgICAgIEdMaW50IGluZm9MZW4gPSAwOworICAgICAgICAgICAgZ2xHZXRTaGFkZXJpdihzaGFkZXIsIEdMX0lORk9fTE9HX0xFTkdUSCwgJmluZm9MZW4pOworICAgICAgICAgICAgaWYgKGluZm9MZW4pIHsKKyAgICAgICAgICAgICAgICBjaGFyKiBidWYgPSAoY2hhciopIG1hbGxvYyhpbmZvTGVuKTsKKyAgICAgICAgICAgICAgICBpZiAoYnVmKSB7CisgICAgICAgICAgICAgICAgICAgIGdsR2V0U2hhZGVySW5mb0xvZyhzaGFkZXIsIGluZm9MZW4sIE5VTEwsIGJ1Zik7CisgICAgICAgICAgICAgICAgICAgIExPR0UoIkNvdWxkIG5vdCBjb21waWxlIHNoYWRlciAlZDpcbiVzXG4iLCBzaGFkZXJUeXBlLCBidWYpOworICAgICAgICAgICAgICAgICAgICBmcmVlKGJ1Zik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGdsRGVsZXRlU2hhZGVyKHNoYWRlcik7CisgICAgICAgICAgICAgICAgc2hhZGVyID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc2hhZGVyOworfQorCitlbnVtIHsKKyAgICBBX1BPUywKKyAgICBBX0NPTE9SLAorICAgIEFfVEVYMCwKKyAgICBBX1RFWDEKK307CisKK0dMdWludCBjcmVhdGVQcm9ncmFtKGNvbnN0IGNoYXIqIHBWZXJ0ZXhTb3VyY2UsIGNvbnN0IGNoYXIqIHBGcmFnbWVudFNvdXJjZSkgeworICAgIEdMdWludCB2ZXJ0ZXhTaGFkZXIgPSBsb2FkU2hhZGVyKEdMX1ZFUlRFWF9TSEFERVIsIHBWZXJ0ZXhTb3VyY2UpOworICAgIGlmICghdmVydGV4U2hhZGVyKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIEdMdWludCBwaXhlbFNoYWRlciA9IGxvYWRTaGFkZXIoR0xfRlJBR01FTlRfU0hBREVSLCBwRnJhZ21lbnRTb3VyY2UpOworICAgIGlmICghcGl4ZWxTaGFkZXIpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgR0x1aW50IHByb2dyYW0gPSBnbENyZWF0ZVByb2dyYW0oKTsKKyAgICBpZiAocHJvZ3JhbSkgeworICAgICAgICBnbEF0dGFjaFNoYWRlcihwcm9ncmFtLCB2ZXJ0ZXhTaGFkZXIpOworICAgICAgICBjaGVja0dsRXJyb3IoImdsQXR0YWNoU2hhZGVyIHYiKTsKKyAgICAgICAgZ2xBdHRhY2hTaGFkZXIocHJvZ3JhbSwgcGl4ZWxTaGFkZXIpOworICAgICAgICBjaGVja0dsRXJyb3IoImdsQXR0YWNoU2hhZGVyIHAiKTsKKworICAgICAgICBnbEJpbmRBdHRyaWJMb2NhdGlvbihwcm9ncmFtLCBBX1BPUywgImFfcG9zIik7CisgICAgICAgIGdsQmluZEF0dHJpYkxvY2F0aW9uKHByb2dyYW0sIEFfQ09MT1IsICJhX2NvbG9yIik7CisgICAgICAgIGdsQmluZEF0dHJpYkxvY2F0aW9uKHByb2dyYW0sIEFfVEVYMCwgImFfdGV4MCIpOworICAgICAgICBnbEJpbmRBdHRyaWJMb2NhdGlvbihwcm9ncmFtLCBBX1RFWDEsICJhX3RleDEiKTsKKyAgICAgICAgZ2xMaW5rUHJvZ3JhbShwcm9ncmFtKTsKKyAgICAgICAgR0xpbnQgbGlua1N0YXR1cyA9IEdMX0ZBTFNFOworICAgICAgICBnbEdldFByb2dyYW1pdihwcm9ncmFtLCBHTF9MSU5LX1NUQVRVUywgJmxpbmtTdGF0dXMpOworICAgICAgICBpZiAobGlua1N0YXR1cyAhPSBHTF9UUlVFKSB7CisgICAgICAgICAgICBHTGludCBidWZMZW5ndGggPSAwOworICAgICAgICAgICAgZ2xHZXRQcm9ncmFtaXYocHJvZ3JhbSwgR0xfSU5GT19MT0dfTEVOR1RILCAmYnVmTGVuZ3RoKTsKKyAgICAgICAgICAgIGlmIChidWZMZW5ndGgpIHsKKyAgICAgICAgICAgICAgICBjaGFyKiBidWYgPSAoY2hhciopIG1hbGxvYyhidWZMZW5ndGgpOworICAgICAgICAgICAgICAgIGlmIChidWYpIHsKKyAgICAgICAgICAgICAgICAgICAgZ2xHZXRQcm9ncmFtSW5mb0xvZyhwcm9ncmFtLCBidWZMZW5ndGgsIE5VTEwsIGJ1Zik7CisgICAgICAgICAgICAgICAgICAgIExPR0UoIkNvdWxkIG5vdCBsaW5rIHByb2dyYW06XG4lc1xuIiwgYnVmKTsKKyAgICAgICAgICAgICAgICAgICAgZnJlZShidWYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGdsRGVsZXRlUHJvZ3JhbShwcm9ncmFtKTsKKyAgICAgICAgICAgIHByb2dyYW0gPSAwOworICAgICAgICB9CisgICAgfQorICAgIGNoZWNrR2xFcnJvcigiY3JlYXRlUHJvZ3JhbSIpOworICAgIGdsVXNlUHJvZ3JhbShwcm9ncmFtKTsKKyAgICByZXR1cm4gcHJvZ3JhbTsKK30KKwordWludDY0X3QgZ2V0VGltZSgpIHsKKyAgICBzdHJ1Y3QgdGltZXNwZWMgdDsKKyAgICBjbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgJnQpOworICAgIHJldHVybiB0LnR2X25zZWMgKyAoKHVpbnQ2NF90KXQudHZfc2VjICogMTAwMCAqIDEwMDAgKiAxMDAwKTsKK30KKwordWludDY0X3QgZ1RpbWU7Cit2b2lkIHN0YXJ0VGltZXIoKSB7CisgICAgZ1RpbWUgPSBnZXRUaW1lKCk7Cit9CisKK3ZvaWQgZW5kVGltZXIoY29uc3QgY2hhciAqc3RyLCBpbnQgdywgaW50IGgsIGRvdWJsZSBkYywgaW50IGNvdW50KSB7CisgICAgdWludDY0X3QgdDIgPSBnZXRUaW1lKCk7CisgICAgZG91YmxlIGRlbHRhID0gKChkb3VibGUpKHQyIC0gZ1RpbWUpKSAvIDEwMDAwMDAwMDA7CisgICAgZG91YmxlIHBpeGVscyA9IGRjICogKHcgKiBoKSAqIGNvdW50OworICAgIGRvdWJsZSBtcHBzID0gcGl4ZWxzIC8gZGVsdGEgLyAxMDAwMDAwOworICAgIGRvdWJsZSBkYzYwID0gcGl4ZWxzIC8gZGVsdGEgLyAodyAqIGgpIC8gNjA7CisKKyAgICBpZiAoZk91dCkgeworICAgICAgICBmcHJpbnRmKGZPdXQsICIlcywgJWYsICVmXHJcbiIsIHN0ciwgbXBwcywgZGM2MCk7CisgICAgICAgIGZmbHVzaChmT3V0KTsKKyAgICB9IGVsc2UgeworICAgICAgICBwcmludGYoIiVzLCAlZiwgJWZcbiIsIHN0ciwgbXBwcywgZGM2MCk7CisgICAgfQorICAgIExPR0koIiVzLCAlZiwgJWZcclxuIiwgc3RyLCBtcHBzLCBkYzYwKTsKK30KKworCitzdGF0aWMgY29uc3QgY2hhciBnVmVydGV4U2hhZGVyW10gPQorICAgICJhdHRyaWJ1dGUgdmVjNCBhX3BvcztcbiIKKyAgICAiYXR0cmlidXRlIHZlYzQgYV9jb2xvcjtcbiIKKyAgICAiYXR0cmlidXRlIHZlYzIgYV90ZXgwO1xuIgorICAgICJhdHRyaWJ1dGUgdmVjMiBhX3RleDE7XG4iCisgICAgInZhcnlpbmcgdmVjNCB2X2NvbG9yO1xuIgorICAgICJ2YXJ5aW5nIHZlYzIgdl90ZXgwO1xuIgorICAgICJ2YXJ5aW5nIHZlYzIgdl90ZXgxO1xuIgorCisgICAgInZvaWQgbWFpbigpIHtcbiIKKyAgICAiICAgIHZfY29sb3IgPSBhX2NvbG9yO1xuIgorICAgICIgICAgdl90ZXgwID0gYV90ZXgwO1xuIgorICAgICIgICAgdl90ZXgxID0gYV90ZXgxO1xuIgorICAgICIgICAgZ2xfUG9zaXRpb24gPSBhX3BvcztcbiIKKyAgICAifVxuIjsKKworc3RhdGljIGNvbnN0IGNoYXIgZ1NoYWRlclByZWZpeFtdID0KKyAgICAicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG4iCisgICAgInVuaWZvcm0gdmVjNCB1X2NvbG9yO1xuIgorICAgICJ1bmlmb3JtIHZlYzQgdV8wO1xuIgorICAgICJ1bmlmb3JtIHZlYzQgdV8xO1xuIgorICAgICJ1bmlmb3JtIHZlYzQgdV8yO1xuIgorICAgICJ1bmlmb3JtIHZlYzQgdV8zO1xuIgorICAgICJ2YXJ5aW5nIHZlYzQgdl9jb2xvcjtcbiIKKyAgICAidmFyeWluZyB2ZWMyIHZfdGV4MDtcbiIKKyAgICAidmFyeWluZyB2ZWMyIHZfdGV4MTtcbiIKKyAgICAidW5pZm9ybSBzYW1wbGVyMkQgdV90ZXgwO1xuIgorICAgICJ1bmlmb3JtIHNhbXBsZXIyRCB1X3RleDE7XG4iCisgICAgInZvaWQgbWFpbigpIHtcbiI7CisKK3N0YXRpYyBjb25zdCBjaGFyIGdTaGFkZXJQb3N0Zml4W10gPQorICAgICIgIGdsX0ZyYWdDb2xvciA9IGM7XG4iCisgICAgIn1cbiI7CisKKworc3RhdGljIGNoYXIgKiBhcHBlbmQoY2hhciAqZCwgY29uc3QgY2hhciAqcykgeworICAgIHNpemVfdCBsZW4gPSBzdHJsZW4ocyk7CisgICAgbWVtY3B5KGQsIHMsIGxlbik7CisgICAgcmV0dXJuIGQgKyBsZW47Cit9CisKK3N0YXRpYyBjaGFyICogZ2VuU2hhZGVyKAorICAgIGJvb2wgdXNlVmFyQ29sb3IsCisgICAgaW50IHRleENvdW50LAorICAgIGJvb2wgbW9kdWxhdGVGaXJzdFRleCwKKyAgICBpbnQgZXh0cmFNYXRoKQoreworICAgIGNoYXIgKnN0ciA9IChjaGFyICopY2FsbG9jKDE2ICogMTAyNCwgMSk7CisgICAgY2hhciAqdG1wID0gYXBwZW5kKHN0ciwgZ1NoYWRlclByZWZpeCk7CisKKyAgICBpZiAobW9kdWxhdGVGaXJzdFRleCB8fCAhdGV4Q291bnQpIHsKKyAgICAgICAgaWYgKHVzZVZhckNvbG9yKSB7CisgICAgICAgICAgICB0bXAgPSBhcHBlbmQodG1wLCAiICB2ZWM0IGMgPSB2X2NvbG9yO1xuIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0bXAgPSBhcHBlbmQodG1wLCAiICB2ZWM0IGMgPSB1X2NvbG9yO1xuIik7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICB0bXAgPSBhcHBlbmQodG1wLCAiICB2ZWM0IGMgPSB0ZXh0dXJlMkQodV90ZXgwLCB2X3RleDApO1xuIik7CisgICAgfQorCisgICAgaWYgKG1vZHVsYXRlRmlyc3RUZXggJiYgdGV4Q291bnQpIHsKKyAgICAgICAgdG1wID0gYXBwZW5kKHRtcCwgIiAgYyAqPSB0ZXh0dXJlMkQodV90ZXgwLCB2X3RleDApO1xuIik7CisgICAgfQorICAgIGlmICh0ZXhDb3VudCA+IDEpIHsKKyAgICAgICAgdG1wID0gYXBwZW5kKHRtcCwgIiAgYyAqPSB0ZXh0dXJlMkQodV90ZXgxLCB2X3RleDEpO1xuIik7CisgICAgfQorCisgICAgaWYgKGV4dHJhTWF0aCA+IDApIHsKKyAgICAgICAgdG1wID0gYXBwZW5kKHRtcCwgIiAgYyAqPSB1XzA7XG4iKTsKKyAgICB9CisgICAgaWYgKGV4dHJhTWF0aCA+IDEpIHsKKyAgICAgICAgdG1wID0gYXBwZW5kKHRtcCwgIiAgYyArPSB1XzE7XG4iKTsKKyAgICB9CisgICAgaWYgKGV4dHJhTWF0aCA+IDIpIHsKKyAgICAgICAgdG1wID0gYXBwZW5kKHRtcCwgIiAgYyAqPSB1XzI7XG4iKTsKKyAgICB9CisgICAgaWYgKGV4dHJhTWF0aCA+IDMpIHsKKyAgICAgICAgdG1wID0gYXBwZW5kKHRtcCwgIiAgYyArPSB1XzM7XG4iKTsKKyAgICB9CisKKworICAgIHRtcCA9IGFwcGVuZCh0bXAsIGdTaGFkZXJQb3N0Zml4KTsKKyAgICB0bXBbMF0gPSAwOworCisgICAgLy9wcmludGYoIiVzIiwgc3RyKTsKKyAgICByZXR1cm4gc3RyOworfQorCitzdGF0aWMgdm9pZCBzZXR1cFZBKCkgeworICAgIHN0YXRpYyBjb25zdCBmbG9hdCB2dHhbXSA9IHsKKyAgICAgICAgLTEuMGYsLTEuMGYsCisgICAgICAgICAxLjBmLC0xLjBmLAorICAgICAgICAtMS4wZiwgMS4wZiwKKyAgICAgICAgIDEuMGYsIDEuMGYgfTsKKyAgICBzdGF0aWMgY29uc3QgZmxvYXQgY29sb3JbXSA9IHsKKyAgICAgICAgMS4wZiwwLjBmLDEuMGYsMS4wZiwKKyAgICAgICAgMC4wZiwwLjBmLDEuMGYsMS4wZiwKKyAgICAgICAgMS4wZiwxLjBmLDAuMGYsMS4wZiwKKyAgICAgICAgMS4wZiwxLjBmLDEuMGYsMS4wZiB9OworICAgIHN0YXRpYyBjb25zdCBmbG9hdCB0ZXgwW10gPSB7CisgICAgICAgIDAuMGYsMC4wZiwKKyAgICAgICAgMS4wZiwwLjBmLAorICAgICAgICAxLjBmLDEuMGYsCisgICAgICAgIDAuMGYsMS4wZiB9OworICAgIHN0YXRpYyBjb25zdCBmbG9hdCB0ZXgxW10gPSB7CisgICAgICAgIDEuMGYsMC4wZiwKKyAgICAgICAgMS4wZiwxLjBmLAorICAgICAgICAwLjBmLDEuMGYsCisgICAgICAgIDAuMGYsMC4wZiB9OworCisgICAgZ2xFbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShBX1BPUyk7CisgICAgZ2xFbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShBX0NPTE9SKTsKKyAgICBnbEVuYWJsZVZlcnRleEF0dHJpYkFycmF5KEFfVEVYMCk7CisgICAgZ2xFbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShBX1RFWDEpOworCisgICAgZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyKEFfUE9TLCAyLCBHTF9GTE9BVCwgZmFsc2UsIDgsIHZ0eCk7CisgICAgZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyKEFfQ09MT1IsIDQsIEdMX0ZMT0FULCBmYWxzZSwgMTYsIGNvbG9yKTsKKyAgICBnbFZlcnRleEF0dHJpYlBvaW50ZXIoQV9URVgwLCAyLCBHTF9GTE9BVCwgZmFsc2UsIDgsIHRleDApOworICAgIGdsVmVydGV4QXR0cmliUG9pbnRlcihBX1RFWDEsIDIsIEdMX0ZMT0FULCBmYWxzZSwgOCwgdGV4MSk7Cit9CisKK3N0YXRpYyB2b2lkIHJhbmRVbmlmb3JtKGludCBwZ20sIGNvbnN0IGNoYXIgKnZhcikgeworICAgIGludCBsb2MgPSBnbEdldFVuaWZvcm1Mb2NhdGlvbihwZ20sIHZhcik7CisgICAgaWYgKGxvYyA+PSAwKSB7CisgICAgICAgIGZsb2F0IHggPSAoKGZsb2F0KXJhbmQoKSkgLyBSQU5EX01BWDsKKyAgICAgICAgZmxvYXQgeSA9ICgoZmxvYXQpcmFuZCgpKSAvIFJBTkRfTUFYOworICAgICAgICBmbG9hdCB6ID0gKChmbG9hdClyYW5kKCkpIC8gUkFORF9NQVg7CisgICAgICAgIGZsb2F0IHcgPSAoKGZsb2F0KXJhbmQoKSkgLyBSQU5EX01BWDsKKyAgICAgICAgZ2xVbmlmb3JtNGYobG9jLCB4LCB5LCB6LCB3KTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGRvTG9vcChib29sIGNsZWFyLCBpbnQgcGdtLCB1aW50MzJfdCB3LCB1aW50MzJfdCBoLCBjb25zdCBjaGFyICpzdHIpIHsKKyAgICBpZiAoY2xlYXIpIHsKKyAgICAgICAgZ2xDbGVhcihHTF9ERVBUSF9CVUZGRVJfQklUIHwgR0xfQ09MT1JfQlVGRkVSX0JJVCk7CisgICAgICAgIGdsRHJhd0FycmF5cyhHTF9UUklBTkdMRV9TVFJJUCwgMCwgNCk7CisgICAgICAgIHB0U3dhcCgpOworICAgICAgICBnbEZpbmlzaCgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3RhcnRUaW1lcigpOworICAgIGdsQ2xlYXIoR0xfREVQVEhfQlVGRkVSX0JJVCB8IEdMX0NPTE9SX0JVRkZFUl9CSVQpOworICAgIGZvciAoaW50IGN0PTA7IGN0IDwgMTAwOyBjdCsrKSB7CisgICAgICAgIHJhbmRVbmlmb3JtKHBnbSwgInVfY29sb3IiKTsKKyAgICAgICAgcmFuZFVuaWZvcm0ocGdtLCAidV8wIik7CisgICAgICAgIHJhbmRVbmlmb3JtKHBnbSwgInVfMSIpOworICAgICAgICByYW5kVW5pZm9ybShwZ20sICJ1XzIiKTsKKyAgICAgICAgcmFuZFVuaWZvcm0ocGdtLCAidV8zIik7CisgICAgICAgIGdsRHJhd0FycmF5cyhHTF9UUklBTkdMRV9TVFJJUCwgMCwgNCk7CisgICAgfQorICAgIHB0U3dhcCgpOworICAgIGdsRmluaXNoKCk7CisgICAgZW5kVGltZXIoc3RyLCB3LCBoLCAxLCAxMDApOworfQorCit2b2lkIGdlblRleHR1cmVzKCkgeworICAgIHVpbnQzMl90ICptID0gKHVpbnQzMl90ICopbWFsbG9jKDEwMjQqMTAyNCo0KTsKKyAgICBmb3IgKGludCB5PTA7IHkgPCAxMDI0OyB5KyspeworICAgICAgICBmb3IgKGludCB4PTA7IHggPCAxMDI0OyB4KyspeworICAgICAgICAgICAgbVt5KjEwMjQgKyB4XSA9IDB4ZmYwMDAwZmYgfCAoKHggJiAweGZmKSA8PCA4KSB8ICh5IDw8IDE2KTsKKyAgICAgICAgfQorICAgIH0KKyAgICBnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIDEpOworICAgIGdsVGV4SW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCBHTF9SR0JBLCAxMDI0LCAxMDI0LCAwLCBHTF9SR0JBLCBHTF9VTlNJR05FRF9CWVRFLCBtKTsKKyAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NQUdfRklMVEVSLCBHTF9MSU5FQVIpOworICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01JTl9GSUxURVIsIEdMX0xJTkVBUik7CisgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9TLCBHTF9SRVBFQVQpOworICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX1dSQVBfVCwgR0xfUkVQRUFUKTsKKworICAgIGZvciAoaW50IHk9MDsgeSA8IDE2OyB5KyspeworICAgICAgICBmb3IgKGludCB4PTA7IHggPCAxNjsgeCsrKXsKKyAgICAgICAgICAgIG1beSoxNiArIHhdID0gMHhmZjAwMDBmZiB8ICh4PDwxMikgfCAoeTw8MjApOworICAgICAgICB9CisgICAgfQorICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgMik7CisgICAgZ2xUZXhJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIEdMX1JHQkEsIDE2LCAxNiwgMCwgR0xfUkdCQSwgR0xfVU5TSUdORURfQllURSwgbSk7CisgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUFHX0ZJTFRFUiwgR0xfTElORUFSKTsKKyAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NSU5fRklMVEVSLCBHTF9MSU5FQVIpOworICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX1dSQVBfUywgR0xfUkVQRUFUKTsKKyAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9XUkFQX1QsIEdMX1JFUEVBVCk7CisKK30KKworCmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvZ2xfcGVyZi9maWxsdGVzdC5jcHAgYi9vcGVuZ2wvdGVzdHMvZ2xfcGVyZi9maWxsdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGRkNGUyMgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90ZXN0cy9nbF9wZXJmL2ZpbGx0ZXN0LmNwcApAQCAtMCwwICsxLDEwMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxzY2hlZC5oPgorI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8R0xFUzIvZ2wyLmg+CisjaW5jbHVkZSA8R0xFUzIvZ2wyZXh0Lmg+CisjaW5jbHVkZSA8dXRpbHMvVGltZXJzLmg+CisjaW5jbHVkZSA8RUdML2VnbC5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCisKKyNpbmNsdWRlICJmaWxsX2NvbW1vbi5jcHAiCisKK3N0YXRpYyB2b2lkIGRvU2luZ2xlVGVzdCh1aW50MzJfdCB3LCB1aW50MzJfdCBoLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdXNlVmFyQ29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRleENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbW9kdWxhdGVGaXJzdFRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXh0cmFNYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0ZXgwLCBpbnQgdGV4MSkgeworICAgIGNoYXIgKnBnbVR4dCA9IGdlblNoYWRlcih1c2VWYXJDb2xvciwgdGV4Q291bnQsIG1vZHVsYXRlRmlyc3RUZXgsIGV4dHJhTWF0aCk7CisgICAgaW50IHBnbSA9IGNyZWF0ZVByb2dyYW0oZ1ZlcnRleFNoYWRlciwgcGdtVHh0KTsKKyAgICBpZiAoIXBnbSkgeworICAgICAgICBwcmludGYoImVycm9yIHJ1bm5pbmcgdGVzdFxuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaW50IGxvYyA9IGdsR2V0VW5pZm9ybUxvY2F0aW9uKHBnbSwgInVfdGV4MCIpOworICAgIGlmIChsb2MgPj0gMCkgZ2xVbmlmb3JtMWkobG9jLCAwKTsKKyAgICBsb2MgPSBnbEdldFVuaWZvcm1Mb2NhdGlvbihwZ20sICJ1X3RleDEiKTsKKyAgICBpZiAobG9jID49IDApIGdsVW5pZm9ybTFpKGxvYywgMSk7CisKKyAgICBnbEFjdGl2ZVRleHR1cmUoR0xfVEVYVFVSRTApOworICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgdGV4MCk7CisgICAgZ2xBY3RpdmVUZXh0dXJlKEdMX1RFWFRVUkUxKTsKKyAgICBnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIHRleDEpOworICAgIGdsQWN0aXZlVGV4dHVyZShHTF9URVhUVVJFMCk7CisKKyAgICBjaGFyIHN0cjJbMTAyNF07CisKKyAgICBnbEJsZW5kRnVuYyhHTF9PTkUsIEdMX09ORSk7CisgICAgZ2xEaXNhYmxlKEdMX0JMRU5EKTsKKyAgICAvL3NwcmludGYoc3RyMiwgIiVpLCAlaSwgJWksICVpLCAlaSwgMCIsCisgICAgICAgICAgICAvL3VzZVZhckNvbG9yLCB0ZXhDb3VudCwgbW9kdWxhdGVGaXJzdFRleCwgZXh0cmFNYXRoLCB0ZXgwKTsKKyAgICAvL2RvTG9vcCh0cnVlLCBwZ20sIHcsIGgsIHN0cjIpOworICAgIC8vZG9Mb29wKGZhbHNlLCBwZ20sIHcsIGgsIHN0cjIpOworCisgICAgZ2xFbmFibGUoR0xfQkxFTkQpOworICAgIHNwcmludGYoc3RyMiwgIiVpLCAlaSwgJWksICVpLCAlaSwgMSIsCisgICAgICAgICAgICB1c2VWYXJDb2xvciwgdGV4Q291bnQsIG1vZHVsYXRlRmlyc3RUZXgsIGV4dHJhTWF0aCwgdGV4MCk7CisgICAgZG9Mb29wKHRydWUsIHBnbSwgdywgaCwgc3RyMik7CisgICAgZG9Mb29wKGZhbHNlLCBwZ20sIHcsIGgsIHN0cjIpOworfQorCitib29sIGRvVGVzdCh1aW50MzJfdCB3LCB1aW50MzJfdCBoKSB7CisgICAgc2V0dXBWQSgpOworICAgIGdlblRleHR1cmVzKCk7CisKKyAgICBwcmludGYoIlxudmFyQ29sb3IsIHRleENvdW50LCBtb2R1bGF0ZSwgZXh0cmFNYXRoLCB0ZXhTaXplLCBibGVuZCwgTXBwcywgREM2MFxuIik7CisKKyAgICBmb3IgKGludCB0ZXhDb3VudCA9IDA7IHRleENvdW50IDwgMjsgdGV4Q291bnQrKykgeworICAgICAgICBmb3IgKGludCBleHRyYU1hdGggPSAwOyBleHRyYU1hdGggPCA1OyBleHRyYU1hdGgrKykgeworCisgICAgICAgICAgICBkb1NpbmdsZVRlc3QodywgaCwgZmFsc2UsIHRleENvdW50LCBmYWxzZSwgZXh0cmFNYXRoLCAxLCAxKTsKKyAgICAgICAgICAgIGRvU2luZ2xlVGVzdCh3LCBoLCB0cnVlLCB0ZXhDb3VudCwgZmFsc2UsIGV4dHJhTWF0aCwgMSwgMSk7CisgICAgICAgICAgICBpZiAodGV4Q291bnQpIHsKKyAgICAgICAgICAgICAgICBkb1NpbmdsZVRlc3QodywgaCwgZmFsc2UsIHRleENvdW50LCB0cnVlLCBleHRyYU1hdGgsIDEsIDEpOworICAgICAgICAgICAgICAgIGRvU2luZ2xlVGVzdCh3LCBoLCB0cnVlLCB0ZXhDb3VudCwgdHJ1ZSwgZXh0cmFNYXRoLCAxLCAxKTsKKworICAgICAgICAgICAgICAgIGRvU2luZ2xlVGVzdCh3LCBoLCBmYWxzZSwgdGV4Q291bnQsIGZhbHNlLCBleHRyYU1hdGgsIDIsIDIpOworICAgICAgICAgICAgICAgIGRvU2luZ2xlVGVzdCh3LCBoLCB0cnVlLCB0ZXhDb3VudCwgZmFsc2UsIGV4dHJhTWF0aCwgMiwgMik7CisgICAgICAgICAgICAgICAgZG9TaW5nbGVUZXN0KHcsIGgsIGZhbHNlLCB0ZXhDb3VudCwgdHJ1ZSwgZXh0cmFNYXRoLCAyLCAyKTsKKyAgICAgICAgICAgICAgICBkb1NpbmdsZVRlc3QodywgaCwgdHJ1ZSwgdGV4Q291bnQsIHRydWUsIGV4dHJhTWF0aCwgMiwgMik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBleGl0KDApOworICAgIHJldHVybiB0cnVlOworfQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2dsX3BlcmYvZ2wyX3BlcmYuY3BwIGIvb3BlbmdsL3Rlc3RzL2dsX3BlcmYvZ2wyX3BlcmYuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkZmNmMWMKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvZ2xfcGVyZi9nbDJfcGVyZi5jcHAKQEAgLTAsMCArMSwxMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8c2NoZWQuaD4KKyNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KKworI2luY2x1ZGUgPEVHTC9lZ2wuaD4KKyNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KKyNpbmNsdWRlIDxHTEVTMi9nbDJleHQuaD4KKworI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgorCisjaW5jbHVkZSA8dWkvRnJhbWVidWZmZXJOYXRpdmVXaW5kb3cuaD4KKyNpbmNsdWRlIDx1aS9FR0xVdGlscy5oPgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworCitzdGF0aWMgdm9pZCBjaGVja0VnbEVycm9yKGNvbnN0IGNoYXIqIG9wLCBFR0xCb29sZWFuIHJldHVyblZhbCA9IEVHTF9UUlVFKSB7CisgICAgaWYgKHJldHVyblZhbCAhPSBFR0xfVFJVRSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzKCkgcmV0dXJuZWQgJWRcbiIsIG9wLCByZXR1cm5WYWwpOworICAgIH0KKworICAgIGZvciAoRUdMaW50IGVycm9yID0gZWdsR2V0RXJyb3IoKTsgZXJyb3IgIT0gRUdMX1NVQ0NFU1M7IGVycm9yCisgICAgICAgICAgICA9IGVnbEdldEVycm9yKCkpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJhZnRlciAlcygpIGVnbEVycm9yICVzICgweCV4KVxuIiwgb3AsIEVHTFV0aWxzOjpzdHJlcnJvcihlcnJvciksCisgICAgICAgICAgICAgICAgZXJyb3IpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgY2hlY2tHbEVycm9yKGNvbnN0IGNoYXIqIG9wKSB7CisgICAgZm9yIChHTGludCBlcnJvciA9IGdsR2V0RXJyb3IoKTsgZXJyb3I7IGVycm9yCisgICAgICAgICAgICA9IGdsR2V0RXJyb3IoKSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImFmdGVyICVzKCkgZ2xFcnJvciAoMHgleClcbiIsIG9wLCBlcnJvcik7CisgICAgfQorfQorCitib29sIGRvVGVzdCh1aW50MzJfdCB3LCB1aW50MzJfdCBoKTsKKworc3RhdGljIEVHTERpc3BsYXkgZHB5Oworc3RhdGljIEVHTFN1cmZhY2Ugc3VyZmFjZTsKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisgICAgRUdMQm9vbGVhbiByZXR1cm5WYWx1ZTsKKyAgICBFR0xDb25maWcgbXlDb25maWcgPSB7MH07CisKKyAgICBFR0xpbnQgY29udGV4dF9hdHRyaWJzW10gPSB7IEVHTF9DT05URVhUX0NMSUVOVF9WRVJTSU9OLCAyLCBFR0xfTk9ORSB9OworICAgIEVHTGludCBzX2NvbmZpZ0F0dHJpYnNbXSA9IHsKKyAgICAgICAgICAgIEVHTF9TVVJGQUNFX1RZUEUsIEVHTF9XSU5ET1dfQklULAorICAgICAgICAgICAgRUdMX1JFTkRFUkFCTEVfVFlQRSwgRUdMX09QRU5HTF9FUzJfQklULAorICAgICAgICAgICAgRUdMX05PTkUgfTsKKyAgICBFR0xpbnQgbWFqb3JWZXJzaW9uOworICAgIEVHTGludCBtaW5vclZlcnNpb247CisgICAgRUdMQ29udGV4dCBjb250ZXh0OworICAgIEVHTGludCB3LCBoOworCisKKyAgICBjaGVja0VnbEVycm9yKCI8aW5pdD4iKTsKKyAgICBkcHkgPSBlZ2xHZXREaXNwbGF5KEVHTF9ERUZBVUxUX0RJU1BMQVkpOworICAgIGNoZWNrRWdsRXJyb3IoImVnbEdldERpc3BsYXkiKTsKKyAgICBpZiAoZHB5ID09IEVHTF9OT19ESVNQTEFZKSB7CisgICAgICAgIHByaW50ZigiZWdsR2V0RGlzcGxheSByZXR1cm5lZCBFR0xfTk9fRElTUExBWS5cbiIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICByZXR1cm5WYWx1ZSA9IGVnbEluaXRpYWxpemUoZHB5LCAmbWFqb3JWZXJzaW9uLCAmbWlub3JWZXJzaW9uKTsKKyAgICBjaGVja0VnbEVycm9yKCJlZ2xJbml0aWFsaXplIiwgcmV0dXJuVmFsdWUpOworICAgIGlmIChyZXR1cm5WYWx1ZSAhPSBFR0xfVFJVRSkgeworICAgICAgICBwcmludGYoImVnbEluaXRpYWxpemUgZmFpbGVkXG4iKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgRUdMTmF0aXZlV2luZG93VHlwZSB3aW5kb3cgPSBhbmRyb2lkX2NyZWF0ZURpc3BsYXlTdXJmYWNlKCk7DQorICAgIHJldHVyblZhbHVlID0gRUdMVXRpbHM6OnNlbGVjdENvbmZpZ0Zvck5hdGl2ZVdpbmRvdyhkcHksIHNfY29uZmlnQXR0cmlicywgd2luZG93LCAmbXlDb25maWcpOworICAgIGlmIChyZXR1cm5WYWx1ZSkgeworICAgICAgICBwcmludGYoIkVHTFV0aWxzOjpzZWxlY3RDb25maWdGb3JOYXRpdmVXaW5kb3coKSByZXR1cm5lZCAlZCIsIHJldHVyblZhbHVlKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgY2hlY2tFZ2xFcnJvcigiRUdMVXRpbHM6OnNlbGVjdENvbmZpZ0Zvck5hdGl2ZVdpbmRvdyIpOworCisgICAgc3VyZmFjZSA9IGVnbENyZWF0ZVdpbmRvd1N1cmZhY2UoZHB5LCBteUNvbmZpZywgd2luZG93LCBOVUxMKTsKKyAgICBjaGVja0VnbEVycm9yKCJlZ2xDcmVhdGVXaW5kb3dTdXJmYWNlIik7CisgICAgaWYgKHN1cmZhY2UgPT0gRUdMX05PX1NVUkZBQ0UpIHsKKyAgICAgICAgcHJpbnRmKCJnZWxDcmVhdGVXaW5kb3dTdXJmYWNlIGZhaWxlZC5cbiIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBjb250ZXh0ID0gZWdsQ3JlYXRlQ29udGV4dChkcHksIG15Q29uZmlnLCBFR0xfTk9fQ09OVEVYVCwgY29udGV4dF9hdHRyaWJzKTsKKyAgICBjaGVja0VnbEVycm9yKCJlZ2xDcmVhdGVDb250ZXh0Iik7CisgICAgaWYgKGNvbnRleHQgPT0gRUdMX05PX0NPTlRFWFQpIHsKKyAgICAgICAgcHJpbnRmKCJlZ2xDcmVhdGVDb250ZXh0IGZhaWxlZFxuIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm5WYWx1ZSA9IGVnbE1ha2VDdXJyZW50KGRweSwgc3VyZmFjZSwgc3VyZmFjZSwgY29udGV4dCk7CisgICAgY2hlY2tFZ2xFcnJvcigiZWdsTWFrZUN1cnJlbnQiLCByZXR1cm5WYWx1ZSk7CisgICAgaWYgKHJldHVyblZhbHVlICE9IEVHTF9UUlVFKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBlZ2xRdWVyeVN1cmZhY2UoZHB5LCBzdXJmYWNlLCBFR0xfV0lEVEgsICZ3KTsKKyAgICBjaGVja0VnbEVycm9yKCJlZ2xRdWVyeVN1cmZhY2UiKTsKKyAgICBlZ2xRdWVyeVN1cmZhY2UoZHB5LCBzdXJmYWNlLCBFR0xfSEVJR0hULCAmaCk7CisgICAgY2hlY2tFZ2xFcnJvcigiZWdsUXVlcnlTdXJmYWNlIik7CisgICAgR0xpbnQgZGltID0gdyA8IGggPyB3IDogaDsKKworICAgIGdsVmlld3BvcnQoMCwgMCwgdywgaCk7CisKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGRvVGVzdCh3LCBoKTsKKyAgICAgICAgZWdsU3dhcEJ1ZmZlcnMoZHB5LCBzdXJmYWNlKTsKKyAgICAgICAgY2hlY2tFZ2xFcnJvcigiZWdsU3dhcEJ1ZmZlcnMiKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBwdFN3YXAoKSB7CisgICAgZWdsU3dhcEJ1ZmZlcnMoZHB5LCBzdXJmYWNlKTsKK30KKwpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2dsX3BlcmZhcHAvQW5kcm9pZC5tayBiL29wZW5nbC90ZXN0cy9nbF9wZXJmYXBwL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ3NWE3NAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90ZXN0cy9nbF9wZXJmYXBwL0FuZHJvaWQubWsKQEAgLTAsMCArMSw1NCBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBPcGVuR0wgRVMgUGVyZiBBcHAKKyMgVGhpcyBtYWtlZmlsZSBidWlsZHMgYm90aCBhbiBhY3Rpdml0eSBhbmQgYSBzaGFyZWQgbGlicmFyeS4KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2lmbmVxICgkKFRBUkdFVF9TSU1VTEFUT1IpLHRydWUpICMgbm90IDY0IGJpdCBjbGVhbgorCitUT1BfTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisKKyMgQnVpbGQgYWN0aXZpdHkKKworTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKKworTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtc3ViZGlyLWphdmEtZmlsZXMpCisKK0xPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBHTFBlcmYKKworTE9DQUxfSk5JX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliZ2xwZXJmCisKKyMgUnVuIG9uIEVjbGFpcgorTE9DQUxfU0RLX1ZFUlNJT04gOj0gNworCitpbmNsdWRlICQoQlVJTERfUEFDS0FHRSkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBCdWlsZCBKTkkgU2hhcmVkIExpYnJhcnkKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworTE9DQUxfUEFUSDo9ICQoTE9DQUxfUEFUSCkvam5pCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCisjIE9wdGlvbmFsIHRhZyB3b3VsZCBtZWFuIGl0IGRvZXNuJ3QgZ2V0IGluc3RhbGxlZCBieSBkZWZhdWx0CitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorCitMT0NBTF9DRkxBR1MgOj0gLVdlcnJvcgorCitMT0NBTF9TUkNfRklMRVM6PSBcCisgIGdsX2NvZGUuY3BwCisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAorCWxpYnV0aWxzIFwKKwlsaWJFR0wgXAorCWxpYkdMRVN2MgorCitMT0NBTF9NT0RVTEUgOj0gbGliZ2xwZXJmCisKK0xPQ0FMX1BSRUxJTktfTU9EVUxFIDo9IGZhbHNlCisKK2luY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKKworZW5kaWYgIyBUQVJHRVRfU0lNVUxBVE9SCmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvZ2xfcGVyZmFwcC9BbmRyb2lkTWFuaWZlc3QueG1sIGIvb3BlbmdsL3Rlc3RzL2dsX3BlcmZhcHAvQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDVkOTVmCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL2dsX3BlcmZhcHAvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMCwwICsxLDM4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorLyoKKyoqCisqKiBDb3B5cmlnaHQgMjAwOSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLS0+CisKKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgcGFja2FnZT0iY29tLmFuZHJvaWQuZ2xwZXJmIgorICAgIGFuZHJvaWQ6dmVyc2lvbk5hbWU9IjEuMC4wIiBhbmRyb2lkOnZlcnNpb25Db2RlPSIxMDAwMCIgPgorICAgIDx1c2VzLXNkayBhbmRyb2lkOnRhcmdldFNka1ZlcnNpb249IjciIGFuZHJvaWQ6bWluU2RrVmVyc2lvbj0iNyIgLz4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLldSSVRFX0VYVEVSTkFMX1NUT1JBR0UiIC8+CisgICAgPGFwcGxpY2F0aW9uCisgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL2dscGVyZl9hY3Rpdml0eSI+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9IkdMUGVyZkFjdGl2aXR5IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGhlbWU9IkBhbmRyb2lkOnN0eWxlL1RoZW1lLk5vVGl0bGVCYXIuRnVsbHNjcmVlbiIKKyAgICAgICAgICAgIAlhbmRyb2lkOmxhdW5jaE1vZGU9InNpbmdsZVRhc2siCisgICAgICAgICAgICAJYW5kcm9pZDpjb25maWdDaGFuZ2VzPSJvcmllbnRhdGlvbnxrZXlib2FyZEhpZGRlbiI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisgICAgPC9hcHBsaWNhdGlvbj4KKzwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvZ2xfcGVyZmFwcC9qbmkvZ2xfY29kZS5jcHAgYi9vcGVuZ2wvdGVzdHMvZ2xfcGVyZmFwcC9qbmkvZ2xfY29kZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY0MzI5MgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90ZXN0cy9nbF9wZXJmYXBwL2puaS9nbF9jb2RlLmNwcApAQCAtMCwwICsxLDE5NCBAQAorLy8gT3BlbkdMIEVTIDIuMCBjb2RlCisKKyNpbmNsdWRlIDxuYXRpdmVoZWxwZXIvam5pLmg+CisjZGVmaW5lIExPR19UQUcgIkdMUGVyZiBnbF9jb2RlLmNwcCIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPEVHTC9lZ2wuaD4KKyNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KKyNpbmNsdWRlIDxHTEVTMi9nbDJleHQuaD4KKyNpbmNsdWRlIDx1dGlscy9UaW1lcnMuaD4KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorCisjaW5jbHVkZSAiLi4vLi4vZ2xfcGVyZi9maWxsX2NvbW1vbi5jcHAiCisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLy8gV2lkdGggYW5kIGhlaWdodCBvZiB0aGUgc2NyZWVuCisKK3VpbnQzMl90IHc7Cit1aW50MzJfdCBoOworCisvLyBUaGUgc3RhdGVDbG9jayBzdGFydHMgYXQgemVybyBhbmQgaW5jcmVtZW50cyBieSAxIGV2ZXJ5IHRpbWUgd2UgZHJhdyBhIGZyYW1lLiBJdCBpcyB1c2VkIHRvIGNvbnRyb2wgd2hpY2ggcGhhc2Ugb2YgdGhlIHRlc3Qgd2UgYXJlIGluLgorCitpbnQgc3RhdGVDbG9jazsKK2NvbnN0IGludCBkb0xvb3BTdGF0ZXMgPSAyOworY29uc3QgaW50IGRvU2luZ2xlVGVzdFN0YXRlcyA9IDI7Citib29sIGRvbmU7CisKKy8vIFNhdmVzIHRoZSBwYXJhbWV0ZXJzIG9mIHRoZSB0ZXN0IChzbyB3ZSBjYW4gcHJpbnQgdGhlbSBvdXQgd2hlbiB3ZSBmaW5pc2ggdGhlIHRpbWluZy4pCisKK2NoYXIgc2F2ZUJ1ZlsxMDI0XTsKKworCitpbnQgcGdtOworCit2b2lkIHB0U3dhcCgpIHsKK30KKworc3RhdGljIHZvaWQgZG9TaW5nbGVUZXN0KHVpbnQzMl90IHcsIHVpbnQzMl90IGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB1c2VWYXJDb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGV4Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBtb2R1bGF0ZUZpcnN0VGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBleHRyYU1hdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRleDAsIGludCB0ZXgxKSB7CisgICAgaW50IGRvU2luZ2xlVGVzdFN0YXRlID0gKHN0YXRlQ2xvY2sgLyBkb0xvb3BTdGF0ZXMpICUgZG9TaW5nbGVUZXN0U3RhdGVzOworICAgIC8vIExPR0koImRvU2luZ2xlVGVzdCAlZFxuIiwgZG9TaW5nbGVUZXN0U3RhdGUpOworICAgIHN3aXRjaCAoZG9TaW5nbGVUZXN0U3RhdGUpIHsKKwljYXNlIDA6IHsKKwkgICAgY2hhciAqcGdtVHh0ID0gZ2VuU2hhZGVyKHVzZVZhckNvbG9yLCB0ZXhDb3VudCwgbW9kdWxhdGVGaXJzdFRleCwgZXh0cmFNYXRoKTsKKwkgICAgcGdtID0gY3JlYXRlUHJvZ3JhbShnVmVydGV4U2hhZGVyLCBwZ21UeHQpOworCSAgICBpZiAoIXBnbSkgeworCQlMT0dFKCJlcnJvciBydW5uaW5nIHRlc3RcbiIpOworCQlyZXR1cm47CisJICAgIH0KKwkgICAgaW50IGxvYyA9IGdsR2V0VW5pZm9ybUxvY2F0aW9uKHBnbSwgInVfdGV4MCIpOworCSAgICBpZiAobG9jID49IDApIGdsVW5pZm9ybTFpKGxvYywgMCk7CisJICAgIGxvYyA9IGdsR2V0VW5pZm9ybUxvY2F0aW9uKHBnbSwgInVfdGV4MSIpOworCSAgICBpZiAobG9jID49IDApIGdsVW5pZm9ybTFpKGxvYywgMSk7CisKKwkgICAgZ2xBY3RpdmVUZXh0dXJlKEdMX1RFWFRVUkUwKTsKKwkgICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCB0ZXgwKTsKKwkgICAgZ2xBY3RpdmVUZXh0dXJlKEdMX1RFWFRVUkUxKTsKKwkgICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCB0ZXgxKTsKKwkgICAgZ2xBY3RpdmVUZXh0dXJlKEdMX1RFWFRVUkUwKTsKKworCisJICAgIGdsQmxlbmRGdW5jKEdMX09ORSwgR0xfT05FKTsKKwkgICAgZ2xEaXNhYmxlKEdMX0JMRU5EKTsKKyAgICAgICAgICAgIGNoYXIgc3RyMlsxMDI0XTsKKwkgICAgc3ByaW50ZihzdHIyLCAiJWksICVpLCAlaSwgJWksICVpLCAwIiwKKwkJICAgIHVzZVZhckNvbG9yLCB0ZXhDb3VudCwgbW9kdWxhdGVGaXJzdFRleCwgZXh0cmFNYXRoLCB0ZXgwKTsKKworICAgIAkgICAgZG9Mb29wKChzdGF0ZUNsb2NrICUgZG9Mb29wU3RhdGVzKSAhPSAwLCBwZ20sIHcsIGgsIHN0cjIpOworCSB9CisgICAgICAgICBicmVhazsKKyAgICAgICAgIGNhc2UgMTogeworICAgICAgICAgICAgY2hhciBzdHIyWzEwMjRdOworCSAgICBnbEVuYWJsZShHTF9CTEVORCk7CisJICAgIHNwcmludGYoc3RyMiwgIiVpLCAlaSwgJWksICVpLCAlaSwgMSIsCisJCSAgICB1c2VWYXJDb2xvciwgdGV4Q291bnQsIG1vZHVsYXRlRmlyc3RUZXgsIGV4dHJhTWF0aCwgdGV4MCk7CisJICAgIGRvTG9vcCgoc3RhdGVDbG9jayAlIGRvTG9vcFN0YXRlcykgIT0gMCwgcGdtLCB3LCBoLCBzdHIyKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9Cit9CisKKwordm9pZCBkb1Rlc3QodWludDMyX3QgdywgdWludDMyX3QgaCkgeworICAgIGludCB0ZXN0U3RhdGUgPSBzdGF0ZUNsb2NrIC8gKGRvTG9vcFN0YXRlcyAqIGRvU2luZ2xlVGVzdFN0YXRlcyk7CisgICAgaW50IHRleENvdW50OworICAgIGludCBleHRyYU1hdGg7CisgICAgaW50IHRlc3RTdWJTdGF0ZTsKKyAgICBjb25zdCBpbnQgZXh0cmFNYXRoQ291bnQgPSA1OworICAgIGNvbnN0IGludCB0ZXhDb3VudDBTdWJUZXN0Q291bnQgPSAyOworICAgIGNvbnN0IGludCB0ZXhDb3VudE5TdWJUZXN0Q291bnQgPSA4OworCisgICAgaWYgKCB0ZXN0U3RhdGUgPCBleHRyYU1hdGhDb3VudCAqIHRleENvdW50MFN1YlRlc3RDb3VudCkgeworICAgICAgIHRleENvdW50ID0gMDsgLy8gT25seSAxMCB0ZXN0cyBmb3IgdGV4Q291bnQgMAorICAgICAgIGV4dHJhTWF0aCA9ICh0ZXN0U3RhdGUgLyB0ZXhDb3VudDBTdWJUZXN0Q291bnQpICUgZXh0cmFNYXRoQ291bnQ7CisgICAgICAgdGVzdFN1YlN0YXRlID0gdGVzdFN0YXRlICUgdGV4Q291bnQwU3ViVGVzdENvdW50OworICAgIH0gZWxzZSB7CisgICAgICAgdGV4Q291bnQgPSAxICsgKHRlc3RTdGF0ZSAtIGV4dHJhTWF0aENvdW50ICogdGV4Q291bnQwU3ViVGVzdENvdW50KSAvIChleHRyYU1hdGhDb3VudCAqIHRleENvdW50TlN1YlRlc3RDb3VudCk7CisgICAgICAgZXh0cmFNYXRoID0gKHRlc3RTdGF0ZSAvIHRleENvdW50TlN1YlRlc3RDb3VudCkgJSBleHRyYU1hdGhDb3VudDsKKyAgICAgICB0ZXN0U3ViU3RhdGUgPSB0ZXN0U3RhdGUgJSB0ZXhDb3VudE5TdWJUZXN0Q291bnQ7CisgICAgfQorICAgIGlmICh0ZXhDb3VudCA+PSAzKSB7CisgICAgICAgTE9HSSgiZG9uZVxuIik7CisgICAgICAgaWYgKGZPdXQpIHsKKyAgICAgICAgICAgZmNsb3NlKGZPdXQpOworICAgICAgICAgICBmT3V0ID0gTlVMTDsKKyAgICAgICB9CisgICAgICAgZG9uZSA9IHRydWU7CisgICAgICAgcmV0dXJuOworICAgIH0KKworCisgICAgLy8gTE9HSSgiZG9UZXN0ICVkICVkICVkXG4iLCB0ZXhDb3VudCwgZXh0cmFNYXRoLCB0ZXN0U3ViU3RhdGUpOworCisgICAgc3dpdGNoKHRlc3RTdWJTdGF0ZSkgeworCWNhc2UgMDoKKyAgICAgICAgICAgIGRvU2luZ2xlVGVzdCh3LCBoLCBmYWxzZSwgdGV4Q291bnQsIGZhbHNlLCBleHRyYU1hdGgsIDEsIDEpOworCWJyZWFrOworCWNhc2UgMToKKyAgICAgICAgICAgIGRvU2luZ2xlVGVzdCh3LCBoLCB0cnVlLCB0ZXhDb3VudCwgZmFsc2UsIGV4dHJhTWF0aCwgMSwgMSk7CisJYnJlYWs7CisJY2FzZSAyOgorICAgICAgICAgICAgICAgIGRvU2luZ2xlVGVzdCh3LCBoLCBmYWxzZSwgdGV4Q291bnQsIHRydWUsIGV4dHJhTWF0aCwgMSwgMSk7CisJYnJlYWs7CisJY2FzZSAzOgorICAgICAgICAgICAgICAgIGRvU2luZ2xlVGVzdCh3LCBoLCB0cnVlLCB0ZXhDb3VudCwgdHJ1ZSwgZXh0cmFNYXRoLCAxLCAxKTsKKwlicmVhazsKKworCWNhc2UgNDoKKyAgICAgICAgICAgICAgICBkb1NpbmdsZVRlc3QodywgaCwgZmFsc2UsIHRleENvdW50LCBmYWxzZSwgZXh0cmFNYXRoLCAyLCAyKTsKKwlicmVhazsKKwljYXNlIDU6CisgICAgICAgICAgICAgICAgZG9TaW5nbGVUZXN0KHcsIGgsIHRydWUsIHRleENvdW50LCBmYWxzZSwgZXh0cmFNYXRoLCAyLCAyKTsKKwlicmVhazsKKwljYXNlIDY6CisgICAgICAgICAgICAgICAgZG9TaW5nbGVUZXN0KHcsIGgsIGZhbHNlLCB0ZXhDb3VudCwgdHJ1ZSwgZXh0cmFNYXRoLCAyLCAyKTsKKwlicmVhazsKKwljYXNlIDc6CisgICAgICAgICAgICAgICAgZG9TaW5nbGVUZXN0KHcsIGgsIHRydWUsIHRleENvdW50LCB0cnVlLCBleHRyYU1hdGgsIDIsIDIpOworCWJyZWFrOworICAgIH0KK30KKworZXh0ZXJuICJDIiB7CisgICAgSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBKYXZhX2NvbV9hbmRyb2lkX2dscGVyZl9HTFBlcmZMaWJfaW5pdChKTklFbnYgKiBlbnYsIGpvYmplY3Qgb2JqLCAgamludCB3aWR0aCwgamludCBoZWlnaHQpOworICAgIEpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgSmF2YV9jb21fYW5kcm9pZF9nbHBlcmZfR0xQZXJmTGliX3N0ZXAoSk5JRW52ICogZW52LCBqb2JqZWN0IG9iaik7Cit9OworCitKTklFWFBPUlQgdm9pZCBKTklDQUxMIEphdmFfY29tX2FuZHJvaWRfZ2xwZXJmX0dMUGVyZkxpYl9pbml0KEpOSUVudiAqIGVudiwgam9iamVjdCBvYmosICBqaW50IHdpZHRoLCBqaW50IGhlaWdodCkKK3sKKyAgICBpZiAoIWRvbmUpIHsKKwkgICAgdyA9IHdpZHRoOworCSAgICBoID0gaGVpZ2h0OworCSAgICBzdGF0ZUNsb2NrID0gMDsKKwkgICAgZG9uZSA9IGZhbHNlOworCSAgICBzZXR1cFZBKCk7CisJICAgIGdlblRleHR1cmVzKCk7CisJICAgIGNvbnN0IGNoYXIqIGZpbGVOYW1lID0gIi9zZGNhcmQvZ2xwZXJmLmNzdiI7CisgICAgICAgICAgICBpZiAoZk91dCAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgIExPR0koIkNsb3NpbmcgcGFydGlhbGx5IHdyaXR0ZW4gb3V0cHV0Lm4iKTsKKyAgICAgICAgICAgICAgICAgZmNsb3NlKGZPdXQpOworICAgICAgICAgICAgICAgICBmT3V0ID0gTlVMTDsKKyAgICAgICAgICAgIH0KKwkgICAgTE9HSSgiV3JpdGluZyB0bzogJXNcbiIsZmlsZU5hbWUpOworCSAgICBmT3V0ID0gZm9wZW4oZmlsZU5hbWUsICJ3Iik7CisJICAgIGlmIChmT3V0ID09IE5VTEwpIHsKKwkJTE9HRSgiQ291bGQgbm90IG9wZW46ICVzXG4iLCBmaWxlTmFtZSk7CisJICAgIH0KKworCSAgICBMT0dJKCJcbnZhckNvbG9yLCB0ZXhDb3VudCwgbW9kdWxhdGUsIGV4dHJhTWF0aCwgdGV4U2l6ZSwgYmxlbmQsIE1wcHMsIERDNjBcbiIpOworCSAgICBpZiAoZk91dCkgZnByaW50ZihmT3V0LCJ2YXJDb2xvciwgdGV4Q291bnQsIG1vZHVsYXRlLCBleHRyYU1hdGgsIHRleFNpemUsIGJsZW5kLCBNcHBzLCBEQzYwXHJcbiIpOworICAgIH0KK30KKworSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBKYXZhX2NvbV9hbmRyb2lkX2dscGVyZl9HTFBlcmZMaWJfc3RlcChKTklFbnYgKiBlbnYsIGpvYmplY3Qgb2JqKQoreworICAgIGlmICghIGRvbmUpIHsKKyAgICAgICAgaWYgKHN0YXRlQ2xvY2sgPiAwICYmICgoc3RhdGVDbG9jayAmIDEpID09IDApKSB7CisJICAgIGVuZFRpbWVyKHNhdmVCdWYsIHcsIGgsIDEsIDEwMCk7CisgICAgICAgIH0KKyAgICAgICAgZG9UZXN0KHcsIGgpOworICAgICAgICBzdGF0ZUNsb2NrKys7CisgICAgfSBlbHNlIHsKKwkgICAgZ2xDbGVhcihHTF9ERVBUSF9CVUZGRVJfQklUIHwgR0xfQ09MT1JfQlVGRkVSX0JJVCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2dsX3BlcmZhcHAvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbCBiL29wZW5nbC90ZXN0cy9nbF9wZXJmYXBwL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGMyMTA3NQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90ZXN0cy9nbF9wZXJmYXBwL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKQEAgLTAsMCArMSwyOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKy8qCisqKgorKiogQ29weXJpZ2h0IDIwMDYsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorCis8IS0tIFRoaXMgZmlsZSBjb250YWlucyByZXNvdXJjZSBkZWZpbml0aW9ucyBmb3IgZGlzcGxheWVkIHN0cmluZ3MsIGFsbG93aW5nCisgICAgIHRoZW0gdG8gYmUgY2hhbmdlZCBiYXNlZCBvbiB0aGUgbG9jYWxlIGFuZCBvcHRpb25zLiAtLT4KKworPHJlc291cmNlcz4KKyAgICA8IS0tIFNpbXBsZSBzdHJpbmdzLiAtLT4KKyAgICA8c3RyaW5nIG5hbWU9ImdscGVyZl9hY3Rpdml0eSI+R0xQZXJmPC9zdHJpbmc+CisKKzwvcmVzb3VyY2VzPgorCmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvZ2xfcGVyZmFwcC9zcmMvY29tL2FuZHJvaWQvZ2xwZXJmL0dMUGVyZkFjdGl2aXR5LmphdmEgYi9vcGVuZ2wvdGVzdHMvZ2xfcGVyZmFwcC9zcmMvY29tL2FuZHJvaWQvZ2xwZXJmL0dMUGVyZkFjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTNmM2FiZgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90ZXN0cy9nbF9wZXJmYXBwL3NyYy9jb20vYW5kcm9pZC9nbHBlcmYvR0xQZXJmQWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDQ3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5nbHBlcmY7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyOworCitpbXBvcnQgamF2YS5pby5GaWxlOworCisKK3B1YmxpYyBjbGFzcyBHTFBlcmZBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKKworICAgIEdMUGVyZlZpZXcgbVZpZXc7CisKKyAgICBAT3ZlcnJpZGUgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIGljaWNsZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShpY2ljbGUpOworCWdldFdpbmRvdygpLnNldEZsYWdzKFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfS0VFUF9TQ1JFRU5fT04sIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfS0VFUF9TQ1JFRU5fT04pOworICAgICAgICBtVmlldyA9IG5ldyBHTFBlcmZWaWV3KGdldEFwcGxpY2F0aW9uKCkpOworCXNldENvbnRlbnRWaWV3KG1WaWV3KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUgcHJvdGVjdGVkIHZvaWQgb25QYXVzZSgpIHsKKyAgICAgICAgc3VwZXIub25QYXVzZSgpOworICAgICAgICBtVmlldy5vblBhdXNlKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlIHByb3RlY3RlZCB2b2lkIG9uUmVzdW1lKCkgeworICAgICAgICBzdXBlci5vblJlc3VtZSgpOworICAgICAgICBtVmlldy5vblJlc3VtZSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9nbF9wZXJmYXBwL3NyYy9jb20vYW5kcm9pZC9nbHBlcmYvR0xQZXJmTGliLmphdmEgYi9vcGVuZ2wvdGVzdHMvZ2xfcGVyZmFwcC9zcmMvY29tL2FuZHJvaWQvZ2xwZXJmL0dMUGVyZkxpYi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5YTBlNTQKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvZ2xfcGVyZmFwcC9zcmMvY29tL2FuZHJvaWQvZ2xwZXJmL0dMUGVyZkxpYi5qYXZhCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmdscGVyZjsKKworLy8gV3JhcHBlciBmb3IgbmF0aXZlIGxpYnJhcnkKKworcHVibGljIGNsYXNzIEdMUGVyZkxpYiB7CisKKyAgICAgc3RhdGljIHsKKyAgICAgICAgIFN5c3RlbS5sb2FkTGlicmFyeSgiZ2xwZXJmIik7CisgICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSB3aWR0aCB0aGUgY3VycmVudCB2aWV3IHdpZHRoCisgICAgICogQHBhcmFtIGhlaWdodCB0aGUgY3VycmVudCB2aWV3IGhlaWdodAorICAgICAqLworICAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIGluaXQoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKKyAgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBzdGVwKCk7Cit9CmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvZ2xfcGVyZmFwcC9zcmMvY29tL2FuZHJvaWQvZ2xwZXJmL0dMUGVyZlZpZXcuamF2YSBiL29wZW5nbC90ZXN0cy9nbF9wZXJmYXBwL3NyYy9jb20vYW5kcm9pZC9nbHBlcmYvR0xQZXJmVmlldy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjZTRhNGQKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvZ2xfcGVyZmFwcC9zcmMvY29tL2FuZHJvaWQvZ2xwZXJmL0dMUGVyZlZpZXcuamF2YQpAQCAtMCwwICsxLDI5NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuZ2xwZXJmOworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQub3BlbmdsLkdMU3VyZmFjZVZpZXc7CitpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQ7CisKK2ltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMMTA7CitpbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTENvbmZpZzsKK2ltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMQ29udGV4dDsKK2ltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMRGlzcGxheTsKK2ltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5vcGVuZ2xlcy5HTDEwOworCisvKioKKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIFN1cmZhY2VWaWV3IHRoYXQgdXNlcyB0aGUgZGVkaWNhdGVkIHN1cmZhY2UgZm9yCisgKiBkaXNwbGF5aW5nIGFuIE9wZW5HTCBhbmltYXRpb24uICBUaGlzIGFsbG93cyB0aGUgYW5pbWF0aW9uIHRvIHJ1biBpbiBhCisgKiBzZXBhcmF0ZSB0aHJlYWQsIHdpdGhvdXQgcmVxdWlyaW5nIHRoYXQgaXQgYmUgZHJpdmVuIGJ5IHRoZSB1cGRhdGUgbWVjaGFuaXNtCisgKiBvZiB0aGUgdmlldyBoaWVyYXJjaHkuCisgKgorICogVGhlIGFwcGxpY2F0aW9uLXNwZWNpZmljIHJlbmRlcmluZyBjb2RlIGlzIGRlbGVnYXRlZCB0byBhIEdMVmlldy5SZW5kZXJlcgorICogaW5zdGFuY2UuCisgKi8KK2NsYXNzIEdMUGVyZlZpZXcgZXh0ZW5kcyBHTFN1cmZhY2VWaWV3IHsKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgVEFHID0gIkdMUGVyZlZpZXciOworCisgICAgcHVibGljIEdMUGVyZlZpZXcoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQpOworICAgICAgICBpbml0KGZhbHNlLCAwLCAwKTsKKyAgICB9CisKKyAgICBwdWJsaWMgR0xQZXJmVmlldyhDb250ZXh0IGNvbnRleHQsIGJvb2xlYW4gdHJhbnNsdWNlbnQsIGludCBkZXB0aCwgaW50IHN0ZW5jaWwpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCk7CisgICAgICAgIGluaXQodHJhbnNsdWNlbnQsIGRlcHRoLCBzdGVuY2lsKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5pdChib29sZWFuIHRyYW5zbHVjZW50LCBpbnQgZGVwdGgsIGludCBzdGVuY2lsKSB7CisgICAgICAgIHNldEVHTENvbnRleHRGYWN0b3J5KG5ldyBDb250ZXh0RmFjdG9yeSgpKTsKKyAgICAgICAgc2V0RUdMQ29uZmlnQ2hvb3NlciggdHJhbnNsdWNlbnQgPworICAgICAgICAgICAgICBuZXcgQ29uZmlnQ2hvb3Nlcig4LDgsOCw4LCBkZXB0aCwgc3RlbmNpbCkgOgorICAgICAgICAgICAgICBuZXcgQ29uZmlnQ2hvb3Nlcig1LDYsNSwwLCBkZXB0aCwgc3RlbmNpbCkpOworICAgICAgICBzZXRSZW5kZXJlcihuZXcgUmVuZGVyZXIoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ29udGV4dEZhY3RvcnkgaW1wbGVtZW50cyBHTFN1cmZhY2VWaWV3LkVHTENvbnRleHRGYWN0b3J5IHsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgaW50IEVHTF9DT05URVhUX0NMSUVOVF9WRVJTSU9OID0gMHgzMDk4OworICAgICAgICBwdWJsaWMgRUdMQ29udGV4dCBjcmVhdGVDb250ZXh0KEVHTDEwIGVnbCwgRUdMRGlzcGxheSBkaXNwbGF5LCBFR0xDb25maWcgZWdsQ29uZmlnKSB7CisgICAgICAgICAgICBMb2cudyhUQUcsICJjcmVhdGluZyBPcGVuR0wgRVMgMi4wIGNvbnRleHQiKTsKKyAgICAgICAgICAgIGNoZWNrRWdsRXJyb3IoIkJlZm9yZSBlZ2xDcmVhdGVDb250ZXh0IiwgZWdsKTsKKyAgICAgICAgICAgIGludFtdIGF0dHJpYl9saXN0ID0ge0VHTF9DT05URVhUX0NMSUVOVF9WRVJTSU9OLCAyLCBFR0wxMC5FR0xfTk9ORSB9OworICAgICAgICAgICAgRUdMQ29udGV4dCBjb250ZXh0ID0gZWdsLmVnbENyZWF0ZUNvbnRleHQoZGlzcGxheSwgZWdsQ29uZmlnLCBFR0wxMC5FR0xfTk9fQ09OVEVYVCwgYXR0cmliX2xpc3QpOworICAgICAgICAgICAgY2hlY2tFZ2xFcnJvcigiQWZ0ZXIgZWdsQ3JlYXRlQ29udGV4dCIsIGVnbCk7CisgICAgICAgICAgICByZXR1cm4gY29udGV4dDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGRlc3Ryb3lDb250ZXh0KEVHTDEwIGVnbCwgRUdMRGlzcGxheSBkaXNwbGF5LCBFR0xDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgICAgIGVnbC5lZ2xEZXN0cm95Q29udGV4dChkaXNwbGF5LCBjb250ZXh0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgY2hlY2tFZ2xFcnJvcihTdHJpbmcgcHJvbXB0LCBFR0wxMCBlZ2wpIHsKKyAgICAgICAgaW50IGVycm9yOworICAgICAgICB3aGlsZSAoKGVycm9yID0gZWdsLmVnbEdldEVycm9yKCkpICE9IEVHTDEwLkVHTF9TVUNDRVNTKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsIFN0cmluZy5mb3JtYXQoIiVzOiBFR0wgZXJyb3I6IDB4JXgiLCBwcm9tcHQsIGVycm9yKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBDb25maWdDaG9vc2VyIGltcGxlbWVudHMgR0xTdXJmYWNlVmlldy5FR0xDb25maWdDaG9vc2VyIHsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgaW50IEVHTF9PUEVOR0xfRVMyX0JJVCA9IDQ7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGludFtdIHNfY29uZmlnQXR0cmliczIgPQorICAgICAgICB7CisgICAgICAgICAgICBFR0wxMC5FR0xfUkVEX1NJWkUsIDQsCisgICAgICAgICAgICBFR0wxMC5FR0xfR1JFRU5fU0laRSwgNCwKKyAgICAgICAgICAgIEVHTDEwLkVHTF9CTFVFX1NJWkUsIDQsCisgICAgICAgICAgICBFR0wxMC5FR0xfUkVOREVSQUJMRV9UWVBFLCBFR0xfT1BFTkdMX0VTMl9CSVQsCisgICAgICAgICAgICBFR0wxMC5FR0xfTk9ORQorICAgICAgICB9OworCisgICAgICAgIHB1YmxpYyBDb25maWdDaG9vc2VyKGludCByLCBpbnQgZywgaW50IGIsIGludCBhLCBpbnQgZGVwdGgsIGludCBzdGVuY2lsKSB7CisgICAgICAgICAgICBtUmVkU2l6ZSA9IHI7CisgICAgICAgICAgICBtR3JlZW5TaXplID0gZzsKKyAgICAgICAgICAgIG1CbHVlU2l6ZSA9IGI7CisgICAgICAgICAgICBtQWxwaGFTaXplID0gYTsKKyAgICAgICAgICAgIG1EZXB0aFNpemUgPSBkZXB0aDsKKyAgICAgICAgICAgIG1TdGVuY2lsU2l6ZSA9IHN0ZW5jaWw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgRUdMQ29uZmlnIGNob29zZUNvbmZpZyhFR0wxMCBlZ2wsIEVHTERpc3BsYXkgZGlzcGxheSkgeworCisgICAgICAgICAgICBpbnRbXSBudW1fY29uZmlnID0gbmV3IGludFsxXTsKKyAgICAgICAgICAgIGVnbC5lZ2xDaG9vc2VDb25maWcoZGlzcGxheSwgc19jb25maWdBdHRyaWJzMiwgbnVsbCwgMCwgbnVtX2NvbmZpZyk7CisKKyAgICAgICAgICAgIGludCBudW1Db25maWdzID0gbnVtX2NvbmZpZ1swXTsKKworICAgICAgICAgICAgaWYgKG51bUNvbmZpZ3MgPD0gMCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk5vIGNvbmZpZ3MgbWF0Y2ggY29uZmlnU3BlYyIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRUdMQ29uZmlnW10gY29uZmlncyA9IG5ldyBFR0xDb25maWdbbnVtQ29uZmlnc107CisgICAgICAgICAgICBlZ2wuZWdsQ2hvb3NlQ29uZmlnKGRpc3BsYXksIHNfY29uZmlnQXR0cmliczIsIGNvbmZpZ3MsIG51bUNvbmZpZ3MsIG51bV9jb25maWcpOworICAgICAgICAgICAgLy8gcHJpbnRDb25maWdzKGVnbCwgZGlzcGxheSwgY29uZmlncyk7CisgICAgICAgICAgICByZXR1cm4gY2hvb3NlQ29uZmlnKGVnbCwgZGlzcGxheSwgY29uZmlncyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgRUdMQ29uZmlnIGNob29zZUNvbmZpZyhFR0wxMCBlZ2wsIEVHTERpc3BsYXkgZGlzcGxheSwKKyAgICAgICAgICAgICAgICBFR0xDb25maWdbXSBjb25maWdzKSB7CisgICAgICAgICAgICBFR0xDb25maWcgY2xvc2VzdENvbmZpZyA9IG51bGw7CisgICAgICAgICAgICBpbnQgY2xvc2VzdERpc3RhbmNlID0gMTAwMDsKKyAgICAgICAgICAgIGZvcihFR0xDb25maWcgY29uZmlnIDogY29uZmlncykgeworICAgICAgICAgICAgICAgIGludCBkID0gZmluZENvbmZpZ0F0dHJpYihlZ2wsIGRpc3BsYXksIGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9ERVBUSF9TSVpFLCAwKTsKKyAgICAgICAgICAgICAgICBpbnQgcyA9IGZpbmRDb25maWdBdHRyaWIoZWdsLCBkaXNwbGF5LCBjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfU1RFTkNJTF9TSVpFLCAwKTsKKyAgICAgICAgICAgICAgICBpZiAoZCA+PSBtRGVwdGhTaXplICYmIHM+PSBtU3RlbmNpbFNpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IHIgPSBmaW5kQ29uZmlnQXR0cmliKGVnbCwgZGlzcGxheSwgY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9SRURfU0laRSwgMCk7CisgICAgICAgICAgICAgICAgICAgIGludCBnID0gZmluZENvbmZpZ0F0dHJpYihlZ2wsIGRpc3BsYXksIGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX0dSRUVOX1NJWkUsIDApOworICAgICAgICAgICAgICAgICAgICBpbnQgYiA9IGZpbmRDb25maWdBdHRyaWIoZWdsLCBkaXNwbGF5LCBjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfQkxVRV9TSVpFLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGEgPSBmaW5kQ29uZmlnQXR0cmliKGVnbCwgZGlzcGxheSwgY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9BTFBIQV9TSVpFLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGRpc3RhbmNlID0gTWF0aC5hYnMociAtIG1SZWRTaXplKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIE1hdGguYWJzKGcgLSBtR3JlZW5TaXplKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIE1hdGguYWJzKGIgLSBtQmx1ZVNpemUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgTWF0aC5hYnMoYSAtIG1BbHBoYVNpemUpOworICAgICAgICAgICAgICAgICAgICBpZiAoZGlzdGFuY2UgPCBjbG9zZXN0RGlzdGFuY2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsb3Nlc3REaXN0YW5jZSA9IGRpc3RhbmNlOworICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2VzdENvbmZpZyA9IGNvbmZpZzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBjbG9zZXN0Q29uZmlnOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBpbnQgZmluZENvbmZpZ0F0dHJpYihFR0wxMCBlZ2wsIEVHTERpc3BsYXkgZGlzcGxheSwKKyAgICAgICAgICAgICAgICBFR0xDb25maWcgY29uZmlnLCBpbnQgYXR0cmlidXRlLCBpbnQgZGVmYXVsdFZhbHVlKSB7CisKKyAgICAgICAgICAgIGlmIChlZ2wuZWdsR2V0Q29uZmlnQXR0cmliKGRpc3BsYXksIGNvbmZpZywgYXR0cmlidXRlLCBtVmFsdWUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1WYWx1ZVswXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgcHJpbnRDb25maWdzKEVHTDEwIGVnbCwgRUdMRGlzcGxheSBkaXNwbGF5LAorICAgICAgICAgICAgRUdMQ29uZmlnW10gY29uZmlncykgeworICAgICAgICAgICAgaW50IG51bUNvbmZpZ3MgPSBjb25maWdzLmxlbmd0aDsKKyAgICAgICAgICAgIExvZy53KFRBRywgU3RyaW5nLmZvcm1hdCgiJWQgY29uZmlndXJhdGlvbnMiLCBudW1Db25maWdzKSk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUNvbmZpZ3M7IGkrKykgeworICAgICAgICAgICAgICAgIExvZy53KFRBRywgU3RyaW5nLmZvcm1hdCgiQ29uZmlndXJhdGlvbiAlZDpcbiIsIGkpKTsKKyAgICAgICAgICAgICAgICBwcmludENvbmZpZyhlZ2wsIGRpc3BsYXksIGNvbmZpZ3NbaV0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIHByaW50Q29uZmlnKEVHTDEwIGVnbCwgRUdMRGlzcGxheSBkaXNwbGF5LAorICAgICAgICAgICAgICAgIEVHTENvbmZpZyBjb25maWcpIHsKKyAgICAgICAgICAgIGludFtdIGF0dHJpYnV0ZXMgPSB7CisgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9CVUZGRVJfU0laRSwKKyAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX0FMUEhBX1NJWkUsCisgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9CTFVFX1NJWkUsCisgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9HUkVFTl9TSVpFLAorICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfUkVEX1NJWkUsCisgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9ERVBUSF9TSVpFLAorICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfU1RFTkNJTF9TSVpFLAorICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfQ09ORklHX0NBVkVBVCwKKyAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX0NPTkZJR19JRCwKKyAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX0xFVkVMLAorICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfTUFYX1BCVUZGRVJfSEVJR0hULAorICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfTUFYX1BCVUZGRVJfUElYRUxTLAorICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfTUFYX1BCVUZGRVJfV0lEVEgsCisgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9OQVRJVkVfUkVOREVSQUJMRSwKKyAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX05BVElWRV9WSVNVQUxfSUQsCisgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9OQVRJVkVfVklTVUFMX1RZUEUsCisgICAgICAgICAgICAgICAgICAgIDB4MzAzMCwgLy8gRUdMMTAuRUdMX1BSRVNFUlZFRF9SRVNPVVJDRVMsCisgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9TQU1QTEVTLAorICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfU0FNUExFX0JVRkZFUlMsCisgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9TVVJGQUNFX1RZUEUsCisgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9UUkFOU1BBUkVOVF9UWVBFLAorICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfVFJBTlNQQVJFTlRfUkVEX1ZBTFVFLAorICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfVFJBTlNQQVJFTlRfR1JFRU5fVkFMVUUsCisgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9UUkFOU1BBUkVOVF9CTFVFX1ZBTFVFLAorICAgICAgICAgICAgICAgICAgICAweDMwMzksIC8vIEVHTDEwLkVHTF9CSU5EX1RPX1RFWFRVUkVfUkdCLAorICAgICAgICAgICAgICAgICAgICAweDMwM0EsIC8vIEVHTDEwLkVHTF9CSU5EX1RPX1RFWFRVUkVfUkdCQSwKKyAgICAgICAgICAgICAgICAgICAgMHgzMDNCLCAvLyBFR0wxMC5FR0xfTUlOX1NXQVBfSU5URVJWQUwsCisgICAgICAgICAgICAgICAgICAgIDB4MzAzQywgLy8gRUdMMTAuRUdMX01BWF9TV0FQX0lOVEVSVkFMLAorICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfTFVNSU5BTkNFX1NJWkUsCisgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9BTFBIQV9NQVNLX1NJWkUsCisgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9DT0xPUl9CVUZGRVJfVFlQRSwKKyAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX1JFTkRFUkFCTEVfVFlQRSwKKyAgICAgICAgICAgICAgICAgICAgMHgzMDQyIC8vIEVHTDEwLkVHTF9DT05GT1JNQU5UCisgICAgICAgICAgICB9OworICAgICAgICAgICAgU3RyaW5nW10gbmFtZXMgPSB7CisgICAgICAgICAgICAgICAgICAgICJFR0xfQlVGRkVSX1NJWkUiLAorICAgICAgICAgICAgICAgICAgICAiRUdMX0FMUEhBX1NJWkUiLAorICAgICAgICAgICAgICAgICAgICAiRUdMX0JMVUVfU0laRSIsCisgICAgICAgICAgICAgICAgICAgICJFR0xfR1JFRU5fU0laRSIsCisgICAgICAgICAgICAgICAgICAgICJFR0xfUkVEX1NJWkUiLAorICAgICAgICAgICAgICAgICAgICAiRUdMX0RFUFRIX1NJWkUiLAorICAgICAgICAgICAgICAgICAgICAiRUdMX1NURU5DSUxfU0laRSIsCisgICAgICAgICAgICAgICAgICAgICJFR0xfQ09ORklHX0NBVkVBVCIsCisgICAgICAgICAgICAgICAgICAgICJFR0xfQ09ORklHX0lEIiwKKyAgICAgICAgICAgICAgICAgICAgIkVHTF9MRVZFTCIsCisgICAgICAgICAgICAgICAgICAgICJFR0xfTUFYX1BCVUZGRVJfSEVJR0hUIiwKKyAgICAgICAgICAgICAgICAgICAgIkVHTF9NQVhfUEJVRkZFUl9QSVhFTFMiLAorICAgICAgICAgICAgICAgICAgICAiRUdMX01BWF9QQlVGRkVSX1dJRFRIIiwKKyAgICAgICAgICAgICAgICAgICAgIkVHTF9OQVRJVkVfUkVOREVSQUJMRSIsCisgICAgICAgICAgICAgICAgICAgICJFR0xfTkFUSVZFX1ZJU1VBTF9JRCIsCisgICAgICAgICAgICAgICAgICAgICJFR0xfTkFUSVZFX1ZJU1VBTF9UWVBFIiwKKyAgICAgICAgICAgICAgICAgICAgIkVHTF9QUkVTRVJWRURfUkVTT1VSQ0VTIiwKKyAgICAgICAgICAgICAgICAgICAgIkVHTF9TQU1QTEVTIiwKKyAgICAgICAgICAgICAgICAgICAgIkVHTF9TQU1QTEVfQlVGRkVSUyIsCisgICAgICAgICAgICAgICAgICAgICJFR0xfU1VSRkFDRV9UWVBFIiwKKyAgICAgICAgICAgICAgICAgICAgIkVHTF9UUkFOU1BBUkVOVF9UWVBFIiwKKyAgICAgICAgICAgICAgICAgICAgIkVHTF9UUkFOU1BBUkVOVF9SRURfVkFMVUUiLAorICAgICAgICAgICAgICAgICAgICAiRUdMX1RSQU5TUEFSRU5UX0dSRUVOX1ZBTFVFIiwKKyAgICAgICAgICAgICAgICAgICAgIkVHTF9UUkFOU1BBUkVOVF9CTFVFX1ZBTFVFIiwKKyAgICAgICAgICAgICAgICAgICAgIkVHTF9CSU5EX1RPX1RFWFRVUkVfUkdCIiwKKyAgICAgICAgICAgICAgICAgICAgIkVHTF9CSU5EX1RPX1RFWFRVUkVfUkdCQSIsCisgICAgICAgICAgICAgICAgICAgICJFR0xfTUlOX1NXQVBfSU5URVJWQUwiLAorICAgICAgICAgICAgICAgICAgICAiRUdMX01BWF9TV0FQX0lOVEVSVkFMIiwKKyAgICAgICAgICAgICAgICAgICAgIkVHTF9MVU1JTkFOQ0VfU0laRSIsCisgICAgICAgICAgICAgICAgICAgICJFR0xfQUxQSEFfTUFTS19TSVpFIiwKKyAgICAgICAgICAgICAgICAgICAgIkVHTF9DT0xPUl9CVUZGRVJfVFlQRSIsCisgICAgICAgICAgICAgICAgICAgICJFR0xfUkVOREVSQUJMRV9UWVBFIiwKKyAgICAgICAgICAgICAgICAgICAgIkVHTF9DT05GT1JNQU5UIgorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIGludFtdIHZhbHVlID0gbmV3IGludFsxXTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXR0cmlidXRlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGludCBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzW2ldOworICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gbmFtZXNbaV07CisgICAgICAgICAgICAgICAgaWYgKCBlZ2wuZWdsR2V0Q29uZmlnQXR0cmliKGRpc3BsYXksIGNvbmZpZywgYXR0cmlidXRlLCB2YWx1ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCBTdHJpbmcuZm9ybWF0KCIgICVzOiAlZFxuIiwgbmFtZSwgdmFsdWVbMF0pKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBMb2cudyhUQUcsIFN0cmluZy5mb3JtYXQoIiAgJXM6IGZhaWxlZFxuIiwgbmFtZSkpOworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoZWdsLmVnbEdldEVycm9yKCkgIT0gRUdMMTAuRUdMX1NVQ0NFU1MpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFN1YmNsYXNzZXMgY2FuIGFkanVzdCB0aGVzZSB2YWx1ZXM6CisgICAgICAgIHByb3RlY3RlZCBpbnQgbVJlZFNpemU7CisgICAgICAgIHByb3RlY3RlZCBpbnQgbUdyZWVuU2l6ZTsKKyAgICAgICAgcHJvdGVjdGVkIGludCBtQmx1ZVNpemU7CisgICAgICAgIHByb3RlY3RlZCBpbnQgbUFscGhhU2l6ZTsKKyAgICAgICAgcHJvdGVjdGVkIGludCBtRGVwdGhTaXplOworICAgICAgICBwcm90ZWN0ZWQgaW50IG1TdGVuY2lsU2l6ZTsKKyAgICAgICAgcHJpdmF0ZSBpbnRbXSBtVmFsdWUgPSBuZXcgaW50WzFdOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFJlbmRlcmVyIGltcGxlbWVudHMgR0xTdXJmYWNlVmlldy5SZW5kZXJlciB7CisgICAgICAgIHB1YmxpYyB2b2lkIG9uRHJhd0ZyYW1lKEdMMTAgZ2wpIHsKKyAgICAgICAgICAgIEdMUGVyZkxpYi5zdGVwKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBvblN1cmZhY2VDaGFuZ2VkKEdMMTAgZ2wsIGludCB3aWR0aCwgaW50IGhlaWdodCkgeworICAgICAgICAgICAgR0xQZXJmTGliLmluaXQod2lkdGgsIGhlaWdodCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBvblN1cmZhY2VDcmVhdGVkKEdMMTAgZ2wsIEVHTENvbmZpZyBjb25maWcpIHsKKyAgICAgICAgICAgIC8vIERvIG5vdGhpbmcuCisgICAgICAgIH0KKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy90ZXN0Vmlld3BvcnQvQW5kcm9pZC5tayBiL29wZW5nbC90ZXN0cy90ZXN0Vmlld3BvcnQvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjM3ODA5Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL3Rlc3RWaWV3cG9ydC9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMjYgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgT3BlbkdMIEVTIEpOSSBzYW1wbGUKKyMgVGhpcyBtYWtlZmlsZSBidWlsZHMgYm90aCBhbiBhY3Rpdml0eSBhbmQgYSBzaGFyZWQgbGlicmFyeS4KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2lmbmVxICgkKFRBUkdFVF9TSU1VTEFUT1IpLHRydWUpICMgbm90IDY0IGJpdCBjbGVhbgorCitUT1BfTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisKKyMgQnVpbGQgYWN0aXZpdHkKKworTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKKworTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtc3ViZGlyLWphdmEtZmlsZXMpCisKK0xPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBUZXN0Vmlld3BvcnQKKworIyBTZXQgYSBzcGVjaWZpYyBTREsgdmVyc2lvbiBzbyB3ZSBjYW4gcnVuIG9uIEZyb3lvLgorCitMT0NBTF9TREtfVkVSU0lPTiA6PSA4CisKK2luY2x1ZGUgJChCVUlMRF9QQUNLQUdFKQorCitlbmRpZiAjIFRBUkdFVF9TSU1VTEFUT1IKZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy90ZXN0Vmlld3BvcnQvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL29wZW5nbC90ZXN0cy90ZXN0Vmlld3BvcnQvQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGE5ZDJkCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL3Rlc3RWaWV3cG9ydC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsMzcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisvKgorKioKKyoqIENvcHlyaWdodCAyMDA5LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAorKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKworPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBwYWNrYWdlPSJjb20uYW5kcm9pZC50ZXN0Ij4KKyAgICA8dXNlcy1zZGsgYW5kcm9pZDp0YXJnZXRTZGtWZXJzaW9uPSI4IiBhbmRyb2lkOm1pblNka1ZlcnNpb249IjgiIC8+CisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5JTlRFUk5FVCIgLz4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLldSSVRFX0VYVEVSTkFMX1NUT1JBR0UiIC8+CisgICAgPGFwcGxpY2F0aW9uCisgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL3Rlc3RfYWN0aXZpdHkiPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJUZXN0QWN0aXZpdHkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0aGVtZT0iQGFuZHJvaWQ6c3R5bGUvVGhlbWUuTm9UaXRsZUJhci5GdWxsc2NyZWVuIgorICAgICAgICAgICAgCWFuZHJvaWQ6Y29uZmlnQ2hhbmdlcz0ib3JpZW50YXRpb258a2V5Ym9hcmRIaWRkZW4iPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorICAgIDwvYXBwbGljYXRpb24+Cis8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL3Rlc3RWaWV3cG9ydC9SRUFETUUgYi9vcGVuZ2wvdGVzdHMvdGVzdFZpZXdwb3J0L1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDZhYmM5Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL3Rlc3RWaWV3cG9ydC9SRUFETUUKQEAgLTAsMCArMSwyOCBAQAorUmVwcm8gc3RlcHM6CisKK2J1aWxkLCBpbnN0YWxsIGFuZCBydW4gdGhlIGF0dGFjaGVkIHRlc3QgcHJvZ3JhbSBUZXN0Vmlld3BvcnQuYXBrCisKK1J1biBvbiBTYXBwaGlyZSB3aXRoIEZyb3lvLgorCitUaGUgcHJvZ3JhbSBjbGVhcnMgdGhlIHNjcmVlbiB0byBibHVlLCB0aGVuIGRyYXdzIGEgZnVsbCBzY3JlZW4gd2hpdGUgcXVhZCB0aGF0CitpcyBhbGxpZ25lZCB0byB0aGUgc2NyZWVuLgorKFRoZXJlZm9yZSB0aGUgd2hvbGUgc2NyZWVuIHNob3VsZCBhcHBlYXIgdG8gYmUgd2hpdGUuKQorCisKK05vdGUgdGhhdCBzY3JlZW4gaXMgYWxsIHdoaXRlLgorCitSb3RhdGUgc2NyZWVuIDkwIGRlZ3JlZXMuCisKK0V4cGVjdGVkOiBzY3JlZW4gaXMgc3RpbGwgYWxsIHdoaXRlLgorCitBY3R1YWw6IHNjcmVlbiBpcyBibHVlIHdpdGggb2Zmc2V0IHdoaXRlIHJlY3RhbmdsZS4KKworVGhpcyBidWcgb25seSBoYXBwZW5zIG9uIFNhcHBoaXJlLCBpdCB3b3JrcyBjb3JyZWN0bHkgb24gUGFzc2lvbi4KKworV2hhdCBoYXBwZW5zOgorCitJIHRoaW5rIHRoZSBidWcgaXMgdGhhdCB0aGUgZ2wuZ2xWaWV3cG9ydCgpIGNhbGwgaW4gb25TdXJmYWNlQ2hhbmdlZCgpIGlzCitiZWluZyBpZ25vcmVkIGJ5IHRoZSBPcGVuR0wgZHJpdmVyLgorCitOT1RFOiBJZiBhIGdsLmdsVmlld3BvcnQgY2FsbCBpcyBhZGRlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBvbkRyYXdGcmFtZSgpCitjYWxsICh3aGljaCBtZWFucyBpdCBpcyBjYWxsZWQgYmVmb3JlIGV2ZXJ5IGRyYXcpLCB0aGUgcHJvZ3JhbSBydW5zIGNvcnJlY3RseS4KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy90ZXN0Vmlld3BvcnQvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbCBiL29wZW5nbC90ZXN0cy90ZXN0Vmlld3BvcnQvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGI4YmJiCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL3Rlc3RWaWV3cG9ydC9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCkBAIC0wLDAgKzEsMjkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisvKgorKioKKyoqIENvcHlyaWdodCAyMDA2LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAorKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKworPCEtLSBUaGlzIGZpbGUgY29udGFpbnMgcmVzb3VyY2UgZGVmaW5pdGlvbnMgZm9yIGRpc3BsYXllZCBzdHJpbmdzLCBhbGxvd2luZworICAgICB0aGVtIHRvIGJlIGNoYW5nZWQgYmFzZWQgb24gdGhlIGxvY2FsZSBhbmQgb3B0aW9ucy4gLS0+CisKKzxyZXNvdXJjZXM+CisgICAgPCEtLSBTaW1wbGUgc3RyaW5ncy4gLS0+CisgICAgPHN0cmluZyBuYW1lPSJ0ZXN0X2FjdGl2aXR5Ij5UZXN0IFZpZXdwb3J0PC9zdHJpbmc+CisKKzwvcmVzb3VyY2VzPgorCmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvdGVzdFZpZXdwb3J0L3NyYy9jb20vYW5kcm9pZC90ZXN0L1Rlc3RBY3Rpdml0eS5qYXZhIGIvb3BlbmdsL3Rlc3RzL3Rlc3RWaWV3cG9ydC9zcmMvY29tL2FuZHJvaWQvdGVzdC9UZXN0QWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzdlNDUwCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL3Rlc3RWaWV3cG9ydC9zcmMvY29tL2FuZHJvaWQvdGVzdC9UZXN0QWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDQ2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC50ZXN0OworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworcHVibGljIGNsYXNzIFRlc3RBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgVEFHID0gIlRlc3RBY3Rpdml0eSI7CisgICAgVGVzdFZpZXcgbVZpZXc7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgaWNpY2xlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKGljaWNsZSk7CisgICAgICAgIG1WaWV3ID0gbmV3IFRlc3RWaWV3KGdldEFwcGxpY2F0aW9uKCkpOworCSAgICBtVmlldy5zZXRGb2N1c2FibGVJblRvdWNoTW9kZSh0cnVlKTsKKwkgICAgc2V0Q29udGVudFZpZXcobVZpZXcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uUGF1c2UoKSB7CisgICAgICAgIHN1cGVyLm9uUGF1c2UoKTsKKyAgICAgICAgbVZpZXcub25QYXVzZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uUmVzdW1lKCkgeworICAgICAgICBzdXBlci5vblJlc3VtZSgpOworICAgICAgICBtVmlldy5vblJlc3VtZSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy90ZXN0Vmlld3BvcnQvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvVGVzdFZpZXcuamF2YSBiL29wZW5nbC90ZXN0cy90ZXN0Vmlld3BvcnQvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvVGVzdFZpZXcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2NjMzdkCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL3Rlc3RWaWV3cG9ydC9zcmMvY29tL2FuZHJvaWQvdGVzdC9UZXN0Vmlldy5qYXZhCkBAIC0wLDAgKzEsMjYyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC50ZXN0OworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEubmlvLkJ5dGVPcmRlcjsKK2ltcG9ydCBqYXZhLm5pby5DaGFyQnVmZmVyOworaW1wb3J0IGphdmEubmlvLkZsb2F0QnVmZmVyOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5vcGVuZ2wuR0xTdXJmYWNlVmlldzsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OworaW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudDsKKworaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0wxMDsKK2ltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMQ29uZmlnOworaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLm9wZW5nbGVzLkdMOworaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLm9wZW5nbGVzLkdMMTA7CitpbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXMuR0wxMTsKKy8qKgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgU3VyZmFjZVZpZXcgdGhhdCB1c2VzIHRoZSBkZWRpY2F0ZWQgc3VyZmFjZSBmb3IKKyAqIGRpc3BsYXlpbmcgYW4gT3BlbkdMIGFuaW1hdGlvbi4gIFRoaXMgYWxsb3dzIHRoZSBhbmltYXRpb24gdG8gcnVuIGluIGEKKyAqIHNlcGFyYXRlIHRocmVhZCwgd2l0aG91dCByZXF1aXJpbmcgdGhhdCBpdCBiZSBkcml2ZW4gYnkgdGhlIHVwZGF0ZSBtZWNoYW5pc20KKyAqIG9mIHRoZSB2aWV3IGhpZXJhcmNoeS4KKyAqCisgKiBUaGUgYXBwbGljYXRpb24tc3BlY2lmaWMgcmVuZGVyaW5nIGNvZGUgaXMgZGVsZWdhdGVkIHRvIGEgR0xWaWV3LlJlbmRlcmVyCisgKiBpbnN0YW5jZS4KKyAqLworY2xhc3MgVGVzdFZpZXcgZXh0ZW5kcyBHTFN1cmZhY2VWaWV3IHsKKyAgICBUZXN0VmlldyhDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCk7CisgICAgICAgIGluaXQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVGVzdFZpZXcoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMpOworICAgICAgICBpbml0KCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGluaXQoKSB7CisgICAgICAgIHNldFJlbmRlcmVyKG5ldyBSZW5kZXJlcigpKTsKKyAgICAgICAgc2V0UmVuZGVyTW9kZShSRU5ERVJNT0RFX1dIRU5fRElSVFkpOworICAgIH0KKyAgICAKKyAgICAgICAgLyoqIEEgZ3JpZCBpcyBhIHRvcG9sb2dpY2FsbHkgcmVjdGFuZ3VsYXIgYXJyYXkgb2YgdmVydGljZXMuCisgICAgKgorICAgICogVGhlIHZlcnRleCBhbmQgaW5kZXggZGF0YSBhcmUgaGVsZCBpbiBWQk8gb2JqZWN0cyBiZWNhdXNlIG9uIG1vc3QKKyAgICAqIEdQVXMgVkJPIG9iamVjdHMgYXJlIHRoZSBmYXN0ZXN0IHdheSBvZiByZW5kZXJpbmcgc3RhdGljIHZlcnRleAorICAgICogYW5kIGluZGV4IGRhdGEuCisgICAgKgorICAgICovCisKKyAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEdyaWQgeworICAgICAgIC8vIFNpemUgb2YgdmVydGV4IGRhdGEgZWxlbWVudHMgaW4gYnl0ZXM6CisgICAgICAgZmluYWwgc3RhdGljIGludCBGTE9BVF9TSVpFID0gNDsKKyAgICAgICBmaW5hbCBzdGF0aWMgaW50IENIQVJfU0laRSA9IDI7CisKKyAgICAgICAvLyBWZXJ0ZXggc3RydWN0dXJlOgorICAgICAgIC8vIGZsb2F0IHgsIHksIHo7CisKKyAgICAgICBmaW5hbCBzdGF0aWMgaW50IFZFUlRFWF9TSVpFID0gMyAqIEZMT0FUX1NJWkU7CisKKyAgICAgICBwcml2YXRlIGludCBtVmVydGV4QnVmZmVyT2JqZWN0SWQ7CisgICAgICAgcHJpdmF0ZSBpbnQgbUVsZW1lbnRCdWZmZXJPYmplY3RJZDsKKworICAgICAgIC8vIFRoZXNlIGJ1ZmZlcnMgYXJlIHVzZWQgdG8gaG9sZCB0aGUgdmVydGV4IGFuZCBpbmRleCBkYXRhIHdoaWxlCisgICAgICAgLy8gY29uc3RydWN0aW5nIHRoZSBncmlkLiBPbmNlIGNyZWF0ZUJ1ZmZlck9iamVjdHMoKSBpcyBjYWxsZWQKKyAgICAgICAvLyB0aGUgYnVmZmVycyBhcmUgbnVsbGVkIG91dCB0byBzYXZlIG1lbW9yeS4KKworICAgICAgIHByaXZhdGUgQnl0ZUJ1ZmZlciBtVmVydGV4Qnl0ZUJ1ZmZlcjsKKyAgICAgICBwcml2YXRlIEZsb2F0QnVmZmVyIG1WZXJ0ZXhCdWZmZXI7CisgICAgICAgcHJpdmF0ZSBDaGFyQnVmZmVyIG1JbmRleEJ1ZmZlcjsKKworICAgICAgIHByaXZhdGUgaW50IG1XOworICAgICAgIHByaXZhdGUgaW50IG1IOworICAgICAgIHByaXZhdGUgaW50IG1JbmRleENvdW50OworCisgICAgICAgcHVibGljIEdyaWQoaW50IHcsIGludCBoKSB7CisgICAgICAgICAgIGlmICh3IDwgMCB8fCB3ID49IDY1NTM2KSB7CisgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ3Iik7CisgICAgICAgICAgIH0KKyAgICAgICAgICAgaWYgKGggPCAwIHx8IGggPj0gNjU1MzYpIHsKKyAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImgiKTsKKyAgICAgICAgICAgfQorICAgICAgICAgICBpZiAodyAqIGggPj0gNjU1MzYpIHsKKyAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIncgKiBoID49IDY1NTM2Iik7CisgICAgICAgICAgIH0KKworICAgICAgICAgICBtVyA9IHc7CisgICAgICAgICAgIG1IID0gaDsKKyAgICAgICAgICAgaW50IHNpemUgPSB3ICogaDsKKworICAgICAgICAgICBtVmVydGV4Qnl0ZUJ1ZmZlciA9IEJ5dGVCdWZmZXIuYWxsb2NhdGVEaXJlY3QoVkVSVEVYX1NJWkUgKiBzaXplKQorICAgICAgICAgICAgICAgLm9yZGVyKEJ5dGVPcmRlci5uYXRpdmVPcmRlcigpKTsKKyAgICAgICAgICAgbVZlcnRleEJ1ZmZlciA9IG1WZXJ0ZXhCeXRlQnVmZmVyLmFzRmxvYXRCdWZmZXIoKTsKKworICAgICAgICAgICBpbnQgcXVhZFcgPSBtVyAtIDE7CisgICAgICAgICAgIGludCBxdWFkSCA9IG1IIC0gMTsKKyAgICAgICAgICAgaW50IHF1YWRDb3VudCA9IHF1YWRXICogcXVhZEg7CisgICAgICAgICAgIGludCBpbmRleENvdW50ID0gcXVhZENvdW50ICogNjsKKyAgICAgICAgICAgbUluZGV4Q291bnQgPSBpbmRleENvdW50OworICAgICAgICAgICBtSW5kZXhCdWZmZXIgPSBCeXRlQnVmZmVyLmFsbG9jYXRlRGlyZWN0KENIQVJfU0laRSAqIGluZGV4Q291bnQpCisgICAgICAgICAgICAgICAub3JkZXIoQnl0ZU9yZGVyLm5hdGl2ZU9yZGVyKCkpLmFzQ2hhckJ1ZmZlcigpOworCisgICAgICAgICAgIC8qCisgICAgICAgICAgICAqIEluaXRpYWxpemUgdHJpYW5nbGUgbGlzdCBtZXNoLgorICAgICAgICAgICAgKgorICAgICAgICAgICAgKiAgICAgWzBdLS0tLS1bICAxXSAuLi4KKyAgICAgICAgICAgICogICAgICB8ICAgIC8gICB8CisgICAgICAgICAgICAqICAgICAgfCAgIC8gICAgfAorICAgICAgICAgICAgKiAgICAgIHwgIC8gICAgIHwKKyAgICAgICAgICAgICogICAgIFt3XS0tLS0tW3crMV0gLi4uCisgICAgICAgICAgICAqICAgICAgfCAgICAgICB8CisgICAgICAgICAgICAqCisgICAgICAgICAgICAqLworCisgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgICAgICAgIGZvciAoaW50IHkgPSAwOyB5IDwgcXVhZEg7IHkrKykgeworICAgICAgICAgICAgICAgICAgIGZvciAoaW50IHggPSAwOyB4IDwgcXVhZFc7IHgrKykgeworICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGEgPSAoY2hhcikgKHkgKiBtVyArIHgpOworICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGIgPSAoY2hhcikgKHkgKiBtVyArIHggKyAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgY2hhciBjID0gKGNoYXIpICgoeSArIDEpICogbVcgKyB4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgY2hhciBkID0gKGNoYXIpICgoeSArIDEpICogbVcgKyB4ICsgMSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgbUluZGV4QnVmZmVyLnB1dChpKyssIGEpOworICAgICAgICAgICAgICAgICAgICAgICBtSW5kZXhCdWZmZXIucHV0KGkrKywgYyk7CisgICAgICAgICAgICAgICAgICAgICAgIG1JbmRleEJ1ZmZlci5wdXQoaSsrLCBiKTsKKworICAgICAgICAgICAgICAgICAgICAgICBtSW5kZXhCdWZmZXIucHV0KGkrKywgYik7CisgICAgICAgICAgICAgICAgICAgICAgIG1JbmRleEJ1ZmZlci5wdXQoaSsrLCBjKTsKKyAgICAgICAgICAgICAgICAgICAgICAgbUluZGV4QnVmZmVyLnB1dChpKyssIGQpOworICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgfQorCisgICAgICAgfQorCisgICAgICAgcHVibGljIHZvaWQgc2V0KGludCBpLCBpbnQgaiwgZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeikgeworICAgICAgICAgICBpZiAoaSA8IDAgfHwgaSA+PSBtVykgeworICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaSIpOworICAgICAgICAgICB9CisgICAgICAgICAgIGlmIChqIDwgMCB8fCBqID49IG1IKSB7CisgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJqIik7CisgICAgICAgICAgIH0KKworICAgICAgICAgICBpbnQgaW5kZXggPSBtVyAqIGogKyBpOworCisgICAgICAgICAgIG1WZXJ0ZXhCdWZmZXIucG9zaXRpb24oaW5kZXggKiBWRVJURVhfU0laRSAvIEZMT0FUX1NJWkUpOworICAgICAgICAgICBtVmVydGV4QnVmZmVyLnB1dCh4KTsKKyAgICAgICAgICAgbVZlcnRleEJ1ZmZlci5wdXQoeSk7CisgICAgICAgICAgIG1WZXJ0ZXhCdWZmZXIucHV0KHopOworICAgICAgIH0KKworICAgICAgIHB1YmxpYyB2b2lkIGNyZWF0ZUJ1ZmZlck9iamVjdHMoR0wgZ2wpIHsKKyAgICAgICAgICAgLy8gR2VuZXJhdGUgYSB0aGUgdmVydGV4IGFuZCBlbGVtZW50IGJ1ZmZlciBJRHMKKyAgICAgICAgICAgaW50W10gdmJvSWRzID0gbmV3IGludFsyXTsKKyAgICAgICAgICAgR0wxMSBnbDExID0gKEdMMTEpIGdsOworICAgICAgICAgICBnbDExLmdsR2VuQnVmZmVycygyLCB2Ym9JZHMsIDApOworICAgICAgICAgICBtVmVydGV4QnVmZmVyT2JqZWN0SWQgPSB2Ym9JZHNbMF07CisgICAgICAgICAgIG1FbGVtZW50QnVmZmVyT2JqZWN0SWQgPSB2Ym9JZHNbMV07CisKKyAgICAgICAgICAgLy8gVXBsb2FkIHRoZSB2ZXJ0ZXggZGF0YQorICAgICAgICAgICBnbDExLmdsQmluZEJ1ZmZlcihHTDExLkdMX0FSUkFZX0JVRkZFUiwgbVZlcnRleEJ1ZmZlck9iamVjdElkKTsKKyAgICAgICAgICAgbVZlcnRleEJ5dGVCdWZmZXIucG9zaXRpb24oMCk7CisgICAgICAgICAgIGdsMTEuZ2xCdWZmZXJEYXRhKEdMMTEuR0xfQVJSQVlfQlVGRkVSLCBtVmVydGV4Qnl0ZUJ1ZmZlci5jYXBhY2l0eSgpLCBtVmVydGV4Qnl0ZUJ1ZmZlciwgR0wxMS5HTF9TVEFUSUNfRFJBVyk7CisKKyAgICAgICAgICAgZ2wxMS5nbEJpbmRCdWZmZXIoR0wxMS5HTF9FTEVNRU5UX0FSUkFZX0JVRkZFUiwgbUVsZW1lbnRCdWZmZXJPYmplY3RJZCk7CisgICAgICAgICAgIG1JbmRleEJ1ZmZlci5wb3NpdGlvbigwKTsKKyAgICAgICAgICAgZ2wxMS5nbEJ1ZmZlckRhdGEoR0wxMS5HTF9FTEVNRU5UX0FSUkFZX0JVRkZFUiwgbUluZGV4QnVmZmVyLmNhcGFjaXR5KCkgKiBDSEFSX1NJWkUsIG1JbmRleEJ1ZmZlciwgR0wxMS5HTF9TVEFUSUNfRFJBVyk7CisKKyAgICAgICAgICAgLy8gV2UgZG9uJ3QgbmVlZCB0aGUgaW4tbWVtb3J5IGRhdGEgYW55IG1vcmUKKyAgICAgICAgICAgbVZlcnRleEJ1ZmZlciA9IG51bGw7CisgICAgICAgICAgIG1WZXJ0ZXhCeXRlQnVmZmVyID0gbnVsbDsKKyAgICAgICAgICAgbUluZGV4QnVmZmVyID0gbnVsbDsKKyAgICAgICB9CisKKyAgICAgICBwdWJsaWMgdm9pZCBkcmF3KEdMMTAgZ2wpIHsKKyAgICAgICAgICAgR0wxMSBnbDExID0gKEdMMTEpIGdsOworCisgICAgICAgICAgIGdsLmdsRW5hYmxlQ2xpZW50U3RhdGUoR0wxMC5HTF9WRVJURVhfQVJSQVkpOworCisgICAgICAgICAgIGdsMTEuZ2xCaW5kQnVmZmVyKEdMMTEuR0xfQVJSQVlfQlVGRkVSLCBtVmVydGV4QnVmZmVyT2JqZWN0SWQpOworICAgICAgICAgICBnbDExLmdsVmVydGV4UG9pbnRlcigzLCBHTDEwLkdMX0ZMT0FULCBWRVJURVhfU0laRSwgMCk7CisgICAgICAgICAgIAorICAgICAgICAgICBnbDExLmdsQmluZEJ1ZmZlcihHTDExLkdMX0VMRU1FTlRfQVJSQVlfQlVGRkVSLCBtRWxlbWVudEJ1ZmZlck9iamVjdElkKTsKKyAgICAgICAgICAgZ2wxMS5nbERyYXdFbGVtZW50cyhHTDEwLkdMX1RSSUFOR0xFUywgbUluZGV4Q291bnQsIEdMMTAuR0xfVU5TSUdORURfU0hPUlQsIDApOworICAgICAgICAgICBnbC5nbERpc2FibGVDbGllbnRTdGF0ZShHTDEwLkdMX1ZFUlRFWF9BUlJBWSk7CisgICAgICAgICAgIGdsMTEuZ2xCaW5kQnVmZmVyKEdMMTEuR0xfQVJSQVlfQlVGRkVSLCAwKTsKKyAgICAgICAgICAgZ2wxMS5nbEJpbmRCdWZmZXIoR0wxMS5HTF9FTEVNRU5UX0FSUkFZX0JVRkZFUiwgMCk7CisgICAgICAgfQorICAgfQorCisKKyAgICBwcml2YXRlIGNsYXNzIFJlbmRlcmVyIGltcGxlbWVudHMgR0xTdXJmYWNlVmlldy5SZW5kZXJlciB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiUmVuZGVyZXIiOworICAgICAgICBwcml2YXRlIEdyaWQgbUdyaWQ7CisgICAgICAgIAorICAgICAgICBwdWJsaWMgdm9pZCBvbkRyYXdGcmFtZShHTDEwIGdsKSB7CisJCQlnbC5nbENsZWFyQ29sb3IoMCwwLDEsMSk7CisJCQlnbC5nbENsZWFyKEdMMTAuR0xfQ09MT1JfQlVGRkVSX0JJVCk7CisgICAgICAgICAgICBtR3JpZC5kcmF3KGdsKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG9uU3VyZmFjZUNoYW5nZWQoR0wxMCBnbCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CisgICAgICAgICAgICBnbC5nbFZpZXdwb3J0KDAsIDAsIHdpZHRoLCBoZWlnaHQpOworCQkJZ2wuZ2xNYXRyaXhNb2RlKEdMMTEuR0xfUFJPSkVDVElPTik7CisJCQlnbC5nbExvYWRJZGVudGl0eSgpOworCQkJZ2wuZ2xPcnRob2YoMCwgd2lkdGgsIGhlaWdodCwgMCwgLTEsIDEpOworCQkJZ2wuZ2xNYXRyaXhNb2RlKEdMMTEuR0xfTU9ERUxWSUVXKTsKKyAgICAgICAgICAgIGNyZWF0ZUdyaWQoZ2wsIHdpZHRoLCBoZWlnaHQpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgb25TdXJmYWNlQ3JlYXRlZChHTDEwIGdsLCBFR0xDb25maWcgY29uZmlnKSB7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHByaXZhdGUgdm9pZCBjcmVhdGVHcmlkKEdMMTAgZ2wsIGZsb2F0IHcsIGZsb2F0IGgpIHsKKyAgICAgICAgbUdyaWQgPSBuZXcgR3JpZCgyLCAyKTsKKwkJCWZvciAoaW50IGogPSAwOyBqIDwgMjsgaisrKSB7CisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCAyOyBpKyspIHsKKwkJCQkJZmxvYXQgeCA9IHcgKiBpOworCQkJCQlmbG9hdCB5ID0gaCAqIGo7CisJCQkJCWZsb2F0IHogPSAwLjBmOworCQkJCQltR3JpZC5zZXQoaSxqLCB4LCB5LCB6KTsKKwkJCQl9CisJCQl9CisJCQltR3JpZC5jcmVhdGVCdWZmZXJPYmplY3RzKGdsKTsKKwkJfQorICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvRGVmYXVsdENvbnRhaW5lclNlcnZpY2UvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL0RlZmF1bHRDb250YWluZXJTZXJ2aWNlL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKaW5kZXggMzdmNWI2MS4uZmZkNmI1OSAxMDA2NDQKLS0tIGEvcGFja2FnZXMvRGVmYXVsdENvbnRhaW5lclNlcnZpY2UvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbAorKysgYi9wYWNrYWdlcy9EZWZhdWx0Q29udGFpbmVyU2VydmljZS9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCkBAIC0xOCw2ICsxOCw2IEBACiAqLwogLS0+CiA8cmVzb3VyY2VzIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8IS0tIHNlcnZpY2UgbmFtZSAgLS0+CisgICAgPCEtLSBzZXJ2aWNlIG5hbWUgW0NIQVIgTElNSVQ9MjVdICAtLT4KICAgICA8c3RyaW5nIG5hbWU9InNlcnZpY2VfbmFtZSI+UGFja2FnZSBBY2Nlc3MgSGVscGVyPC9zdHJpbmc+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1NldHRpbmdzUHJvdmlkZXIvcmVzL3ZhbHVlcy1ybS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL1NldHRpbmdzUHJvdmlkZXIvcmVzL3ZhbHVlcy1ybS9zdHJpbmdzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjFlNjI1Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU2V0dGluZ3NQcm92aWRlci9yZXMvdmFsdWVzLXJtL3N0cmluZ3MueG1sCkBAIC0wLDAgKzEsMjMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tIAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisgLS0+CisKKzxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KKyAgICA8c3RyaW5nIG5hbWU9ImFwcF9sYWJlbCIgbXNnaWQ9IjQ1Njc1NjYwOTg1Mjg1ODg4NjMiPiJNZW1vcmlhIGRhbHMgcGFyYW1ldGVycyI8L3N0cmluZz4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvQW5kcm9pZC5tayBiL3BhY2thZ2VzL1N5c3RlbVVJL0FuZHJvaWQubWsKaW5kZXggNGM4Mzc2OC4uOTEwZTg0ZSAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvQW5kcm9pZC5taworKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9BbmRyb2lkLm1rCkBAIC0xMCw0ICsxMCw2IEBACiBMT0NBTF9QQUNLQUdFX05BTUUgOj0gU3lzdGVtVUkKIExPQ0FMX0NFUlRJRklDQVRFIDo9IHBsYXRmb3JtCiAKK0xPQ0FMX1BST0dVQVJEX0ZMQUdTIDo9IC1pbmNsdWRlICQoTE9DQUxfUEFUSCkvcHJvZ3VhcmQuZmxhZ3MKKwogaW5jbHVkZSAkKEJVSUxEX1BBQ0tBR0UpCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9BbmRyb2lkTWFuaWZlc3QueG1sIGIvcGFja2FnZXMvU3lzdGVtVUkvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCAwZmNjYmU3Li43YmMyZTdkIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTEzLDcgKzEzLDEyIEBACiAgICAgICAgIGFuZHJvaWQ6aWNvbj0iQGRyYXdhYmxlL2ljX2xhdW5jaGVyX3NldHRpbmdzIj4KICAgICAgICAgICAgICAgICAgCiAgICAgICAgIDxzZXJ2aWNlCi0gICAgICAgICAgICBhbmRyb2lkOm5hbWU9Ii5zdGF0dXNiYXIuU3RhdHVzQmFyU2VydmljZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iLnN0YXR1c2Jhci5QaG9uZVN0YXR1c0JhclNlcnZpY2UiCisgICAgICAgICAgICBhbmRyb2lkOmV4cG9ydGVkPSJmYWxzZSIKKyAgICAgICAgICAgIC8+CisKKyAgICAgICAgPHNlcnZpY2UKKyAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iLnN0YXR1c2Jhci50YWJsZXQuVGFibGV0U3RhdHVzQmFyU2VydmljZSIKICAgICAgICAgICAgIGFuZHJvaWQ6ZXhwb3J0ZWQ9ImZhbHNlIgogICAgICAgICAgICAgLz4KIApkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcHJvZ3VhcmQuZmxhZ3MgYi9wYWNrYWdlcy9TeXN0ZW1VSS9wcm9ndWFyZC5mbGFncwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Y2NjNWE5Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcHJvZ3VhcmQuZmxhZ3MKQEAgLTAsMCArMSw0IEBACista2VlcCBjbGFzcyBjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIudGFibGV0LlRhYmxldFN0YXR1c0JhclNlcnZpY2UgeworICBwdWJsaWMgdm9pZCBub3RpZmljYXRpb25JY29uc0NsaWNrZWQoYW5kcm9pZC52aWV3LlZpZXcpOworICBwdWJsaWMgdm9pZCBzeXN0ZW1JbmZvQ2xpY2tlZChhbmRyb2lkLnZpZXcuVmlldyk7Cit9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9iYXR0ZXJ5XzAucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvYmF0dGVyeV8wLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDEwM2E4Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvYmF0dGVyeV8wLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9iYXR0ZXJ5XzEwMC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9iYXR0ZXJ5XzEwMC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDYxY2JlNQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL2JhdHRlcnlfMTAwLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9iYXR0ZXJ5XzIwLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL2JhdHRlcnlfMjAucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwNjQwMjcKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9iYXR0ZXJ5XzIwLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9iYXR0ZXJ5XzQwLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL2JhdHRlcnlfNDAucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwZGUwZTcKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9iYXR0ZXJ5XzQwLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9iYXR0ZXJ5XzYwLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL2JhdHRlcnlfNjAucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhMmI4ZWYKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9iYXR0ZXJ5XzYwLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9iYXR0ZXJ5XzgwLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL2JhdHRlcnlfODAucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlMjMxZjAKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9iYXR0ZXJ5XzgwLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9idXR0b25fZnJhbWVfZGVmYXVsdC45LnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL2J1dHRvbl9mcmFtZV9kZWZhdWx0LjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4MDliODQKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9idXR0b25fZnJhbWVfZGVmYXVsdC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9idXR0b25fZnJhbWVfcHJlc3NlZC45LnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL2J1dHRvbl9mcmFtZV9wcmVzc2VkLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjYzAwN2MKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9idXR0b25fZnJhbWVfcHJlc3NlZC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9kb3RzX2VtcHR5LnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL2RvdHNfZW1wdHkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxZTc2NTQKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9kb3RzX2VtcHR5LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9kb3RzX2Z1bGwucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvZG90c19mdWxsLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzVjNjA0Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvZG90c19mdWxsLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9ub3RpZmljYXRpb25fZHJhZ2dlci5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9ub3RpZmljYXRpb25fZHJhZ2dlci5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFiNTUwNwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL25vdGlmaWNhdGlvbl9kcmFnZ2VyLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zaWduYWxfMC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zaWduYWxfMC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDBlMzZjNAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3NpZ25hbF8wLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zaWduYWxfMTAwLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3NpZ25hbF8xMDAucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2ZTUyZmYKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zaWduYWxfMTAwLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zaWduYWxfMjAucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc2lnbmFsXzIwLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMGY2NTJhCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc2lnbmFsXzIwLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zaWduYWxfNDAucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc2lnbmFsXzQwLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTVkZDhlCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc2lnbmFsXzQwLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zaWduYWxfNjAucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc2lnbmFsXzYwLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWUzMWJhCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc2lnbmFsXzYwLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zaWduYWxfODAucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc2lnbmFsXzgwLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmE2NTZlCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc2lnbmFsXzgwLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX2JhY2tfZGVmYXVsdC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX2JhY2tfZGVmYXVsdC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTlmOTU0MAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c19iYXJfYmFja19kZWZhdWx0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX2JhY2tfcHJlc3NlZC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX2JhY2tfcHJlc3NlZC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjhhYTE5MAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c19iYXJfYmFja19wcmVzc2VkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX2V4cGFuZF9kZWZhdWx0LnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c19iYXJfZXhwYW5kX2RlZmF1bHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyZmM3ZjgKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX2V4cGFuZF9kZWZhdWx0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX2V4cGFuZF9wcmVzc2VkLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c19iYXJfZXhwYW5kX3ByZXNzZWQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3ZjA5YWMKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX2V4cGFuZF9wcmVzc2VkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX2hvbWVfZGVmYXVsdC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX2hvbWVfZGVmYXVsdC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I5NTFkZAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c19iYXJfaG9tZV9kZWZhdWx0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX2hvbWVfcHJlc3NlZC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX2hvbWVfcHJlc3NlZC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTgzNWFkNQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c19iYXJfaG9tZV9wcmVzc2VkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX2ljb25fdHJheS45LnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c19iYXJfaWNvbl90cmF5LjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxZjA0MWMKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX2ljb25fdHJheS45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX21lbnVfZGVmYXVsdC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX21lbnVfZGVmYXVsdC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ3NzljZgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c19iYXJfbWVudV9kZWZhdWx0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX21lbnVfcHJlc3NlZC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX21lbnVfcHJlc3NlZC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmMzZDRjOQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c19iYXJfbWVudV9wcmVzc2VkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX3ZldG9fbm9ybWFsLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c19iYXJfdmV0b19ub3JtYWwucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmNTMyYjgKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX3ZldG9fbm9ybWFsLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX3ZldG9fcHJlc3NlZC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX3ZldG9fcHJlc3NlZC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE4YzAxYgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c19iYXJfdmV0b19wcmVzc2VkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zeXN0ZW1fcGFuZWxfYWlycGxhbmVfZGVmYXVsdC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zeXN0ZW1fcGFuZWxfYWlycGxhbmVfZGVmYXVsdC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTM3NWVlOQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N5c3RlbV9wYW5lbF9haXJwbGFuZV9kZWZhdWx0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zeXN0ZW1fcGFuZWxfYnJpZ2h0bmVzc19kZWZhdWx0LnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N5c3RlbV9wYW5lbF9icmlnaHRuZXNzX2RlZmF1bHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2MjUwMmIKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zeXN0ZW1fcGFuZWxfYnJpZ2h0bmVzc19kZWZhdWx0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zeXN0ZW1fcGFuZWxfb3JpZW50YXRpb25fZGVmYXVsdC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zeXN0ZW1fcGFuZWxfb3JpZW50YXRpb25fZGVmYXVsdC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTg4N2ZiOAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N5c3RlbV9wYW5lbF9vcmllbnRhdGlvbl9kZWZhdWx0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zeXN0ZW1fcGFuZWxfb3JpZW50YXRpb25fbG9ja2VkLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N5c3RlbV9wYW5lbF9vcmllbnRhdGlvbl9sb2NrZWQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4MTU5ZDUKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zeXN0ZW1fcGFuZWxfb3JpZW50YXRpb25fbG9ja2VkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zeXN0ZW1fcGFuZWxfc291bmRfZGVmYXVsdC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zeXN0ZW1fcGFuZWxfc291bmRfZGVmYXVsdC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmU4NTdiNQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N5c3RlbV9wYW5lbF9zb3VuZF9kZWZhdWx0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9iYXR0ZXJ5XzAucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvYmF0dGVyeV8wLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzE2MmM4Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvYmF0dGVyeV8wLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9iYXR0ZXJ5XzEwMC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9iYXR0ZXJ5XzEwMC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg4YTc0YgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2JhdHRlcnlfMTAwLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9iYXR0ZXJ5XzI1LnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2JhdHRlcnlfMjUucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxMTU3MGIKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9iYXR0ZXJ5XzI1LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9iYXR0ZXJ5XzUwLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2JhdHRlcnlfNTAucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0ZDdlY2EKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9iYXR0ZXJ5XzUwLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9iYXR0ZXJ5Xzc1LnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2JhdHRlcnlfNzUucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjYjM1OTEKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9iYXR0ZXJ5Xzc1LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9idXR0b25fZnJhbWVfZGVmYXVsdC45LnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2J1dHRvbl9mcmFtZV9kZWZhdWx0LjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhYjFmMjYKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9idXR0b25fZnJhbWVfZGVmYXVsdC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9idXR0b25fZnJhbWVfcHJlc3NlZC45LnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2J1dHRvbl9mcmFtZV9wcmVzc2VkLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4ZjdhNGQKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9idXR0b25fZnJhbWVfcHJlc3NlZC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9kb3RzX2VtcHR5LnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2RvdHNfZW1wdHkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyYWRhNDEKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9kb3RzX2VtcHR5LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9kb3RzX2Z1bGwucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvZG90c19mdWxsLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTM0NmQ2Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvZG90c19mdWxsLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9ub3RpZmljYXRpb25fZHJhZ2dlci5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9ub3RpZmljYXRpb25fZHJhZ2dlci5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFkMWYzMgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL25vdGlmaWNhdGlvbl9kcmFnZ2VyLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zaWduYWxfMC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zaWduYWxfMC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Y0MzZhZAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3NpZ25hbF8wLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zaWduYWxfMTAwLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3NpZ25hbF8xMDAucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwMTFhMWIKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zaWduYWxfMTAwLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zaWduYWxfMjUucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc2lnbmFsXzI1LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWM2NDNmCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc2lnbmFsXzI1LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zaWduYWxfNTAucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc2lnbmFsXzUwLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGFjZDcyCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc2lnbmFsXzUwLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zaWduYWxfNzUucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc2lnbmFsXzc1LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjUwZGZhCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc2lnbmFsXzc1LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX2JhY2tfZGVmYXVsdC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX2JhY2tfZGVmYXVsdC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM1NzgwMgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N0YXR1c19iYXJfYmFja19kZWZhdWx0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX2JhY2tfcHJlc3NlZC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX2JhY2tfcHJlc3NlZC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM1NzgwMgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N0YXR1c19iYXJfYmFja19wcmVzc2VkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX2V4cGFuZF9kZWZhdWx0LnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N0YXR1c19iYXJfZXhwYW5kX2RlZmF1bHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyYTk0YjYKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX2V4cGFuZF9kZWZhdWx0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX2V4cGFuZF9wcmVzc2VkLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N0YXR1c19iYXJfZXhwYW5kX3ByZXNzZWQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyYTk0YjYKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX2V4cGFuZF9wcmVzc2VkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX2hvbWVfZGVmYXVsdC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX2hvbWVfZGVmYXVsdC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjIxOWRlZAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N0YXR1c19iYXJfaG9tZV9kZWZhdWx0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX2hvbWVfcHJlc3NlZC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX2hvbWVfcHJlc3NlZC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjIxOWRlZAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N0YXR1c19iYXJfaG9tZV9wcmVzc2VkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX2ljb25fdHJheS45LnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N0YXR1c19iYXJfaWNvbl90cmF5LjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwMmFjY2UKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX2ljb25fdHJheS45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX21lbnVfZGVmYXVsdC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX21lbnVfZGVmYXVsdC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmYzYTc1NQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N0YXR1c19iYXJfbWVudV9kZWZhdWx0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX21lbnVfcHJlc3NlZC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX21lbnVfcHJlc3NlZC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTVlMjFkNzMKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX21lbnVfcHJlc3NlZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3RhdHVzX2Jhcl9yZWNlbnRfZGVmYXVsdC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX3JlY2VudF9kZWZhdWx0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGQ4ZGM3Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3RhdHVzX2Jhcl9yZWNlbnRfZGVmYXVsdC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3RhdHVzX2Jhcl9yZWNlbnRfcHJlc3NlZC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX3JlY2VudF9wcmVzc2VkLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGQ4ZGM3Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3RhdHVzX2Jhcl9yZWNlbnRfcHJlc3NlZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3RhdHVzX2Jhcl92ZXRvX25vcm1hbC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX3ZldG9fbm9ybWFsLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWE3Y2MyCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3RhdHVzX2Jhcl92ZXRvX25vcm1hbC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3RhdHVzX2Jhcl92ZXRvX3ByZXNzZWQucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3RhdHVzX2Jhcl92ZXRvX3ByZXNzZWQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0NjFhYzgKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX3ZldG9fcHJlc3NlZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzdGVtX3BhbmVsX2FpcnBsYW5lX2RlZmF1bHQucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzdGVtX3BhbmVsX2FpcnBsYW5lX2RlZmF1bHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViODc1MzIKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zeXN0ZW1fcGFuZWxfYWlycGxhbmVfZGVmYXVsdC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzdGVtX3BhbmVsX2JyaWdodG5lc3NfZGVmYXVsdC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zeXN0ZW1fcGFuZWxfYnJpZ2h0bmVzc19kZWZhdWx0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmZjODNlCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzdGVtX3BhbmVsX2JyaWdodG5lc3NfZGVmYXVsdC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzdGVtX3BhbmVsX29yaWVudGF0aW9uX2RlZmF1bHQucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzdGVtX3BhbmVsX29yaWVudGF0aW9uX2RlZmF1bHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkODQ3OWMKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zeXN0ZW1fcGFuZWxfb3JpZW50YXRpb25fZGVmYXVsdC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzdGVtX3BhbmVsX29yaWVudGF0aW9uX2xvY2tlZC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zeXN0ZW1fcGFuZWxfb3JpZW50YXRpb25fbG9ja2VkLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjFkMjZjCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzdGVtX3BhbmVsX29yaWVudGF0aW9uX2xvY2tlZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzdGVtX3BhbmVsX3NvdW5kX2RlZmF1bHQucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzdGVtX3BhbmVsX3NvdW5kX2RlZmF1bHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyNjM2ZDYKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zeXN0ZW1fcGFuZWxfc291bmRfZGVmYXVsdC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlL2JhdHRlcnkueG1sIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlL2JhdHRlcnkueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0YTcyMGQKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvYmF0dGVyeS54bWwKQEAgLTAsMCArMSwzNCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKy8qIC8vZGV2aWNlL2FwcHMvY29tbW9uL3Jlcy9kcmF3YWJsZS9zdGF0X3N5c19iYXR0ZXJ5LnhtbAorKioKKyoqIENvcHlyaWdodCAyMDA3LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAorKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKworPGxldmVsLWxpc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8aXRlbSBhbmRyb2lkOm1heExldmVsPSIxIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYmF0dGVyeV8wIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6bWF4TGV2ZWw9IjUiPgorICAgICAgICA8YW5pbWF0aW9uLWxpc3QgYW5kcm9pZDpvbmVzaG90PSJmYWxzZSI+CisgICAgICAgICAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYmF0dGVyeV8wIiBhbmRyb2lkOmR1cmF0aW9uPSIyNTAiIC8+CisgICAgICAgICAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYmF0dGVyeV8yNSIgYW5kcm9pZDpkdXJhdGlvbj0iMjUwIiAvPgorICAgICAgICA8L2FuaW1hdGlvbi1saXN0PgorICAgIDwvaXRlbT4KKyAgICA8aXRlbSBhbmRyb2lkOm1heExldmVsPSIyNSIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2JhdHRlcnlfMjUiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDptYXhMZXZlbD0iNTAiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9iYXR0ZXJ5XzUwIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6bWF4TGV2ZWw9Ijc1IiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYmF0dGVyeV83NSIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOm1heExldmVsPSIxMDEiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9iYXR0ZXJ5XzEwMCIgLz4KKzwvbGV2ZWwtbGlzdD4KKwpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlL2JhdHRlcnlfY2hhcmdpbmcueG1sIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlL2JhdHRlcnlfY2hhcmdpbmcueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5Yjc3ZGQKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvYmF0dGVyeV9jaGFyZ2luZy54bWwKQEAgLTAsMCArMSw0OCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKy8qIC8vZGV2aWNlL2FwcHMvY29tbW9uL3Jlcy9kcmF3YWJsZS9zdGF0X3N5c19iYXR0ZXJ5LnhtbAorKioKKyoqIENvcHlyaWdodCAyMDA3LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAorKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKworPGxldmVsLWxpc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8aXRlbSBhbmRyb2lkOm1heExldmVsPSIyNSI+CisgICAgICAgIDxhbmltYXRpb24tbGlzdCBhbmRyb2lkOm9uZXNob3Q9ImZhbHNlIj4KKyAgICAgICAgICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9iYXR0ZXJ5XzAiIGFuZHJvaWQ6ZHVyYXRpb249IjEwMDAiIC8+CisgICAgICAgICAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYmF0dGVyeV8yNSIgYW5kcm9pZDpkdXJhdGlvbj0iMTAwMCIgLz4KKyAgICAgICAgPC9hbmltYXRpb24tbGlzdD4KKyAgICA8L2l0ZW0+CisgICAgPGl0ZW0gYW5kcm9pZDptYXhMZXZlbD0iNTAiPgorICAgICAgICA8YW5pbWF0aW9uLWxpc3QgYW5kcm9pZDpvbmVzaG90PSJmYWxzZSI+CisgICAgICAgICAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYmF0dGVyeV8yNSIgYW5kcm9pZDpkdXJhdGlvbj0iMTAwMCIgLz4KKyAgICAgICAgICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9iYXR0ZXJ5XzUwIiBhbmRyb2lkOmR1cmF0aW9uPSIxMDAwIiAvPgorICAgICAgICA8L2FuaW1hdGlvbi1saXN0PgorICAgIDwvaXRlbT4KKyAgICA8aXRlbSBhbmRyb2lkOm1heExldmVsPSI3NSI+CisgICAgICAgIDxhbmltYXRpb24tbGlzdCBhbmRyb2lkOm9uZXNob3Q9ImZhbHNlIj4KKyAgICAgICAgICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9iYXR0ZXJ5XzUwIiBhbmRyb2lkOmR1cmF0aW9uPSIxMDAwIiAvPgorICAgICAgICAgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2JhdHRlcnlfNzUiIGFuZHJvaWQ6ZHVyYXRpb249IjEwMDAiIC8+CisgICAgICAgIDwvYW5pbWF0aW9uLWxpc3Q+CisgICAgPC9pdGVtPgorICAgIDxpdGVtIGFuZHJvaWQ6bWF4TGV2ZWw9IjkyIj4KKyAgICAgICAgPGFuaW1hdGlvbi1saXN0IGFuZHJvaWQ6b25lc2hvdD0iZmFsc2UiPgorICAgICAgICAgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2JhdHRlcnlfNzUiIGFuZHJvaWQ6ZHVyYXRpb249IjEwMDAiIC8+CisgICAgICAgICAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYmF0dGVyeV8xMDAiIGFuZHJvaWQ6ZHVyYXRpb249IjEwMDAiIC8+CisgICAgICAgIDwvYW5pbWF0aW9uLWxpc3Q+CisgICAgPC9pdGVtPgorICAgIDxpdGVtIGFuZHJvaWQ6bWF4TGV2ZWw9IjEwMSIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2JhdHRlcnlfMTAwIiAvPgorPC9sZXZlbC1saXN0PgorCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvYnV0dG9uX2ZyYW1lLnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS9idXR0b25fZnJhbWUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkYjM5YTUKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvYnV0dG9uX2ZyYW1lLnhtbApAQCAtMCwwICsxLDIxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX3ByZXNzZWQ9InRydWUiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9idXR0b25fZnJhbWVfcHJlc3NlZCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnV0dG9uX2ZyYW1lX2RlZmF1bHQiIC8+Cis8L3NlbGVjdG9yPgorCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvc2lnbmFsLnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS9zaWduYWwueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhYTIxMWEKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvc2lnbmFsLnhtbApAQCAtMCwwICsxLDI5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorLyogLy9kZXZpY2UvYXBwcy9jb21tb24vcmVzL2RyYXdhYmxlL3N0YXRfc3lzX2JhdHRlcnkueG1sCisqKgorKiogQ29weXJpZ2h0IDIwMDcsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorCis8bGV2ZWwtbGlzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorICAgIDxpdGVtIGFuZHJvaWQ6bWF4TGV2ZWw9IjAxIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvc2lnbmFsXzAiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDptYXhMZXZlbD0iMjUiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9zaWduYWxfMjUiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDptYXhMZXZlbD0iNTAiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9zaWduYWxfNTAiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDptYXhMZXZlbD0iNzUiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9zaWduYWxfNzUiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDptYXhMZXZlbD0iMTAxIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvc2lnbmFsXzEwMCIgLz4KKworPC9sZXZlbC1saXN0PgorCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvc3RhdHVzX2Jhcl9iYWNrLnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS9zdGF0dXNfYmFyX2JhY2sueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyYmYxNDcKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvc3RhdHVzX2Jhcl9iYWNrLnhtbApAQCAtMCwwICsxLDIxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX3ByZXNzZWQ9InRydWUiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9zdGF0dXNfYmFyX2JhY2tfcHJlc3NlZCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvc3RhdHVzX2Jhcl9iYWNrX2RlZmF1bHQiIC8+Cis8L3NlbGVjdG9yPgorCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvc3RhdHVzX2Jhcl9leHBhbmQueG1sIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlL3N0YXR1c19iYXJfZXhwYW5kLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTY2OTIwCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlL3N0YXR1c19iYXJfZXhwYW5kLnhtbApAQCAtMCwwICsxLDIxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX3ByZXNzZWQ9InRydWUiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9zdGF0dXNfYmFyX2V4cGFuZF9wcmVzc2VkIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9zdGF0dXNfYmFyX2V4cGFuZF9kZWZhdWx0IiAvPgorPC9zZWxlY3Rvcj4KKwpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlL3N0YXR1c19iYXJfaG9tZS54bWwgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvc3RhdHVzX2Jhcl9ob21lLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDExNzExCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlL3N0YXR1c19iYXJfaG9tZS54bWwKQEAgLTAsMCArMSwyMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9wcmVzc2VkPSJ0cnVlIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvc3RhdHVzX2Jhcl9ob21lX3ByZXNzZWQiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3N0YXR1c19iYXJfaG9tZV9kZWZhdWx0IiAvPgorPC9zZWxlY3Rvcj4KKwpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlL3N0YXR1c19iYXJfbWVudS54bWwgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvc3RhdHVzX2Jhcl9tZW51LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTcyODZlCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlL3N0YXR1c19iYXJfbWVudS54bWwKQEAgLTAsMCArMSwyMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9wcmVzc2VkPSJ0cnVlIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvc3RhdHVzX2Jhcl9tZW51X3ByZXNzZWQiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3N0YXR1c19iYXJfbWVudV9kZWZhdWx0IiAvPgorPC9zZWxlY3Rvcj4KKwpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlL3N0YXR1c19iYXJfdmV0by54bWwgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvc3RhdHVzX2Jhcl92ZXRvLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTFiNjgxCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlL3N0YXR1c19iYXJfdmV0by54bWwKQEAgLTAsMCArMSwyMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9wcmVzc2VkPSJ0cnVlIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvc3RhdHVzX2Jhcl92ZXRvX3ByZXNzZWQiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3N0YXR1c19iYXJfdmV0b19ub3JtYWwiIC8+Cis8L3NlbGVjdG9yPgorCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvbGF5b3V0LXhsYXJnZS9zdGF0dXNfYmFyLnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9sYXlvdXQteGxhcmdlL3N0YXR1c19iYXIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmYjE1NzEKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvbGF5b3V0LXhsYXJnZS9zdGF0dXNfYmFyLnhtbApAQCAtMCwwICsxLDEzNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKy8qIGFwcHMvY29tbW9uL2Fzc2V0cy9kZWZhdWx0L2RlZmF1bHQvc2tpbnMvU3RhdHVzQmFyLnhtbAorKioKKyoqIENvcHlyaWdodCAyMDA2LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAorKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKworPCEtLSAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBkcmF3YWJsZS9zdGF0dXNfYmFyX2Nsb3NlZF9kZWZhdWx0X2JhY2tncm91bmQiIC0tPgorPFJlbGF0aXZlTGF5b3V0CisgICAgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHhtbG5zOnN5c3RlbXVpPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2NvbS5hbmRyb2lkLnN5c3RlbXVpIgorICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGRyYXdhYmxlL3N0YXR1c19iYXJfYmFja2dyb3VuZCIKKyAgICBhbmRyb2lkOmZvY3VzYWJsZT0idHJ1ZSIKKyAgICBhbmRyb2lkOmRlc2NlbmRhbnRGb2N1c2FiaWxpdHk9ImFmdGVyRGVzY2VuZGFudHMiCisgICAgPgorCisgICAgICAgIDxjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIudGFibGV0Lk5vdGlmaWNhdGlvbkljb25BcmVhCisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL25vdGlmaWNhdGlvbkljb25zIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRMZWZ0PSJ0cnVlIgorICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iNmRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX3ZlcnRpY2FsIgorICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6Y2xpY2thYmxlPSJ0cnVlIgorICAgICAgICAgICAgYW5kcm9pZDpvbkNsaWNrPSJub3RpZmljYXRpb25JY29uc0NsaWNrZWQiCisgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBkcmF3YWJsZS9zdGF0dXNfYmFyX2ljb25fdHJheSIKKyAgICAgICAgICAgID4KKyAgICAgICAgICAgIDxJbWFnZVZpZXcKKyAgICAgICAgICAgICAgICBjbGFzcz0iY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLnRhYmxldC5Ob3RpZmljYXRpb25JY29uQXJlYSRNb3JlVmlldyIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2V4cGFuZCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6c3JjPSJAZHJhd2FibGUvc3RhdHVzX2Jhcl9leHBhbmQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpvbkNsaWNrPSJub3RpZmljYXRpb25JY29uc0NsaWNrZWQiCisgICAgICAgICAgICAgICAgLz4KKyAgICAgICAgICAgIDx2aWV3CisgICAgICAgICAgICAgICAgY2xhc3M9ImNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci50YWJsZXQuTm90aWZpY2F0aW9uSWNvbkFyZWEkSWNvbkxheW91dCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2ljb25zIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAKmFuZHJvaWQ6ZGltZW4vc3RhdHVzX2Jhcl9pY29uX3NpemUiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iOGRpcCIKKyAgICAgICAgICAgICAgICAvPgorICAgICAgICAgICAgPHZpZXcKKyAgICAgICAgICAgICAgICBjbGFzcz0iY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLnRhYmxldC5Ob3RpZmljYXRpb25JY29uQXJlYSREcmFnZ2VyVmlldyIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2hhbmRsZSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMjRkaXAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iOGRpcCIKKyAgICAgICAgICAgICAgICAvPgorCisgICAgICAgIDwvY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLnRhYmxldC5Ob3RpZmljYXRpb25JY29uQXJlYT4KKworICAgICAgICA8TGluZWFyTGF5b3V0IGFuZHJvaWQ6aWQ9IkAraWQvdGlja2VyIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjMwMGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iNmRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6YW5pbWF0aW9uQ2FjaGU9ImZhbHNlIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25MZWZ0PSJAaWQvbm90aWZpY2F0aW9uSWNvbnMiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblRvcD0iQGlkL25vdGlmaWNhdGlvbkljb25zIgorICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIKKyAgICAgICAgICAgID4KKyAgICAgICAgICAgIDxJbWFnZVZpZXcgYW5kcm9pZDppZD0iQCtpZC90aWNrZXJJY29uIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjhkaXAiCisgICAgICAgICAgICAgICAgLz4KKyAgICAgICAgICAgIDxjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIuVGlja2VyVmlldyBhbmRyb2lkOmlkPSJAK2lkL3RpY2tlclRleHQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjBkaXAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1RvcD0iMmRpcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iMTBkaXAiPgorICAgICAgICAgICAgICAgIDxUZXh0VmlldworICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSJAKmFuZHJvaWQ6c3R5bGUvVGV4dEFwcGVhcmFuY2UuU3RhdHVzQmFyLlRpY2tlciIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIKKyAgICAgICAgICAgICAgICAgICAgLz4KKyAgICAgICAgICAgICAgICA8VGV4dFZpZXcKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iQCphbmRyb2lkOnN0eWxlL1RleHRBcHBlYXJhbmNlLlN0YXR1c0Jhci5UaWNrZXIiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCisgICAgICAgICAgICAgICAgICAgIC8+CisgICAgICAgICAgICA8L2NvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci5UaWNrZXJWaWV3PgorICAgICAgICA8L0xpbmVhckxheW91dD4KKworICAgICAgICA8aW5jbHVkZSBsYXlvdXQ9IkBsYXlvdXQvc3RhdHVzX2Jhcl9jZW50ZXIiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMTAwZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9jZW50ZXJJblBhcmVudD0idHJ1ZSIKKyAgICAgICAgICAgIC8+CisKKyAgICAgICAgPGNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci5LZXlCdXR0b25WaWV3IGFuZHJvaWQ6aWQ9IkAraWQvYmFjayIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3RvTGVmdE9mPSJAK2lkL21lbnUiCisgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSI0ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjRkaXAiCisgICAgICAgICAgICBhbmRyb2lkOnNyYz0iQGRyYXdhYmxlL3N0YXR1c19iYXJfYmFjayIKKyAgICAgICAgICAgIHN5c3RlbXVpOmtleUNvZGU9IjQiCisgICAgICAgICAgICAvPgorICAgICAgICA8Y29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLktleUJ1dHRvblZpZXcgYW5kcm9pZDppZD0iQCtpZC9tZW51IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfdG9MZWZ0T2Y9IkAraWQvaG9tZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6c3JjPSJAZHJhd2FibGUvc3RhdHVzX2Jhcl9tZW51IgorICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iNGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSI0ZGlwIgorICAgICAgICAgICAgc3lzdGVtdWk6a2V5Q29kZT0iODIiCisgICAgICAgICAgICAvPgorICAgICAgICA8Y29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLktleUJ1dHRvblZpZXcgYW5kcm9pZDppZD0iQCtpZC9ob21lIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRSaWdodD0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjRkaXAiCisgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iNGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6c3JjPSJAZHJhd2FibGUvc3RhdHVzX2Jhcl9ob21lIgorICAgICAgICAgICAgc3lzdGVtdWk6a2V5Q29kZT0iMyIKKyAgICAgICAgICAgIC8+Cis8L1JlbGF0aXZlTGF5b3V0PgorCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvbGF5b3V0LXhsYXJnZS9zdGF0dXNfYmFyX2NlbnRlci54bWwgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvbGF5b3V0LXhsYXJnZS9zdGF0dXNfYmFyX2NlbnRlci54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc1ZmVhMAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9sYXlvdXQteGxhcmdlL3N0YXR1c19iYXJfY2VudGVyLnhtbApAQCAtMCwwICsxLDU2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8IS0tIENlbnRlciBvZiBzdGF0dXMgYmFyOiBTeXN0ZW0gaW5mbyBkaXNwbGF5LCBzeXN0ZW0gaW5mbyBwYW5lbCB0cmlnZ2VyIC0tPgorPFJlbGF0aXZlTGF5b3V0IGFuZHJvaWQ6aWQ9IkAraWQvc3lzdGVtSW5mbyIKKyAgICB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6c3lzdGVtdWk9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvY29tLmFuZHJvaWQuc3lzdGVtdWkiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjEwMGRpcCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICBhbmRyb2lkOmxheW91dF9jZW50ZXJJblBhcmVudD0idHJ1ZSIKKyAgICBhbmRyb2lkOmNsaWNrYWJsZT0idHJ1ZSIKKyAgICBhbmRyb2lkOm9uQ2xpY2s9InN5c3RlbUluZm9DbGlja2VkIgorICAgID4KKyAgICA8Y29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLkNsb2NrCisgICAgICAgIHN0eWxlPSJAKmFuZHJvaWQ6c3R5bGUvVGV4dEFwcGVhcmFuY2UuU3RhdHVzQmFyLkljb24iCisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvY2xvY2siCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCisgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgorICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIxNnNwIgorICAgICAgICBhbmRyb2lkOnRleHRTdHlsZT0iYm9sZCIKKyAgICAgICAgYW5kcm9pZDpwYWRkaW5nPSIyZGlwIgorICAgICAgICAvPgorICAgIDxJbWFnZVZpZXcKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9iYXR0ZXJ5IgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iNTBkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudExlZnQ9InRydWUiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2JlbG93PSJAaWQvY2xvY2siCisgICAgICAgIGFuZHJvaWQ6c3JjPSJAZHJhd2FibGUvYmF0dGVyeSIKKyAgICAgICAgLz4KKyAgICA8SW1hZ2VWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvc2lnbmFsIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iNTBkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudFJpZ2h0PSJ0cnVlIgorICAgICAgICBhbmRyb2lkOmxheW91dF9iZWxvdz0iQGlkL2Nsb2NrIgorICAgICAgICBhbmRyb2lkOnNyYz0iQGRyYXdhYmxlL3NpZ25hbCIKKyAgICAgICAgLz4KKzwvUmVsYXRpdmVMYXlvdXQ+CisKKwpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2xheW91dC14bGFyZ2Uvc3RhdHVzX2Jhcl9sYXRlc3RfZXZlbnQueG1sIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2xheW91dC14bGFyZ2Uvc3RhdHVzX2Jhcl9sYXRlc3RfZXZlbnQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhNDkyZDAKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvbGF5b3V0LXhsYXJnZS9zdGF0dXNfYmFyX2xhdGVzdF9ldmVudC54bWwKQEAgLTAsMCArMSwzNiBAQAorPFJlbGF0aXZlTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iNjVzcCIKKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBhbmRyb2lkOmRyYXdhYmxlL3N0YXR1c19iYXJfaXRlbV9iYWNrZ3JvdW5kIgorICAgID4KKworICAgIDxJbWFnZUJ1dHRvbgorICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3ZldG8iCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9jZW50ZXJWZXJ0aWNhbD0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRSaWdodD0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDpzcmM9IkBkcmF3YWJsZS9zdGF0dXNfYmFyX3ZldG8iCisgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQG51bGwiCisgICAgICAgIGFuZHJvaWQ6cGFkZGluZz0iMmRpcCIKKyAgICAgICAgLz4KKworICAgIDxjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIuTGF0ZXN0SXRlbVZpZXcgYW5kcm9pZDppZD0iQCtpZC9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudFRvcD0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfdG9MZWZ0T2Y9IkBpZC92ZXRvIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjY0c3AiCisgICAgICAgIGFuZHJvaWQ6Zm9jdXNhYmxlPSJ0cnVlIgorICAgICAgICBhbmRyb2lkOmNsaWNrYWJsZT0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjZzcCIKKyAgICAgICAgLz4KKworICAgIDxWaWV3CisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMXNwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudEJvdHRvbT0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAYW5kcm9pZDpkcmF3YWJsZS9kaXZpZGVyX2hvcml6b250YWxfZGFyayIKKyAgICAgICAgLz4KKworPC9SZWxhdGl2ZUxheW91dD4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9sYXlvdXQteGxhcmdlL3N5c2Jhcl9wYW5lbF9ub3RpZmljYXRpb25zLnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9sYXlvdXQteGxhcmdlL3N5c2Jhcl9wYW5lbF9ub3RpZmljYXRpb25zLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDg5ZWVjCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2xheW91dC14bGFyZ2Uvc3lzYmFyX3BhbmVsX25vdGlmaWNhdGlvbnMueG1sCkBAIC0wLDAgKzEsNjggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisvKiBhcHBzL2NvbW1vbi9hc3NldHMvZGVmYXVsdC9kZWZhdWx0L3NraW5zL1N0YXR1c0Jhci54bWwKKyoqCisqKiBDb3B5cmlnaHQgMjAwNiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLS0+CisKKzwhLS0gICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAZHJhd2FibGUvc3RhdHVzX2Jhcl9jbG9zZWRfZGVmYXVsdF9iYWNrZ3JvdW5kIiAtLT4KKzxMaW5lYXJMYXlvdXQKKyAgICB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOmJhY2tncm91bmQ9IiNGRjAwMDAwMCIKKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICA+CisKKyAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9jbGVhcl9hbGxfYnV0dG9uIgorICAgICAgICBzdHlsZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9InJpZ2h0fGNlbnRlcl92ZXJ0aWNhbCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSIyZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Cb3R0b209IjFkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSIxMGRpcCIKKyAgICAgICAgYW5kcm9pZDpwYWRkaW5nPSI2ZGlwIgorICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIxNHNwIgorICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvc3RhdHVzX2Jhcl9jbGVhcl9hbGxfYnV0dG9uIgorICAgICAgICAvPgorCisgICAgPFZpZXcKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIxc3AiCisgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGFuZHJvaWQ6ZHJhd2FibGUvZGl2aWRlcl9ob3Jpem9udGFsX2RhcmsiCisgICAgICAgIC8+CisKKyAgICA8U2Nyb2xsVmlldworICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL25vdGlmaWNhdGlvblNjcm9sbGVyIgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgPgorICAgICAgICA8TGluZWFyTGF5b3V0IAorICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfaG9yaXpvbnRhbHxib3R0b20iCisgICAgICAgICAgICBhbmRyb2lkOmFuaW1hdGlvbkNhY2hlPSJmYWxzZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAZHJhd2FibGUvc3RhdHVzX2Jhcl9iYWNrZ3JvdW5kIgorICAgICAgICAgICAgYW5kcm9pZDpjbGlja2FibGU9InRydWUiCisgICAgICAgICAgICBhbmRyb2lkOmZvY3VzYWJsZT0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZGVzY2VuZGFudEZvY3VzYWJpbGl0eT0iYWZ0ZXJEZXNjZW5kYW50cyIKKyAgICAgICAgICAgID4KKyAgICAgICAgPC9MaW5lYXJMYXlvdXQ+CisgICAgPC9TY3JvbGxWaWV3PgorPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvbGF5b3V0LXhsYXJnZS9zeXNiYXJfcGFuZWxfc3lzdGVtLnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9sYXlvdXQteGxhcmdlL3N5c2Jhcl9wYW5lbF9zeXN0ZW0ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3MzY3NGYKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvbGF5b3V0LXhsYXJnZS9zeXNiYXJfcGFuZWxfc3lzdGVtLnhtbApAQCAtMCwwICsxLDE0NyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKy8qIGFwcHMvY29tbW9uL2Fzc2V0cy9kZWZhdWx0L2RlZmF1bHQvc2tpbnMvU3RhdHVzQmFyLnhtbAorKioKKyoqIENvcHlyaWdodCAyMDEwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAorKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKworPGNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci50YWJsZXQuU3lzdGVtUGFuZWwKKyAgICB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOmJhY2tncm91bmQ9IiNGRjAwMDAwMCIKKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICA+CisKKyAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9zZXR0aW5nc19idXR0b24iCisgICAgICAgIHN0eWxlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0ibGVmdHxjZW50ZXJfdmVydGljYWwiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iMmRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSIxZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iMTBkaXAiCisgICAgICAgIGFuZHJvaWQ6cGFkZGluZz0iOGRpcCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMjBzcCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL3N5c3RlbV9wYW5lbF9zZXR0aW5nc19idXR0b24iCisgICAgICAgIC8+CisKKyAgICA8VmlldworICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjFzcCIKKyAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAYW5kcm9pZDpkcmF3YWJsZS9kaXZpZGVyX2hvcml6b250YWxfZGFyayIKKyAgICAgICAgLz4KKworICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgICAgYW5kcm9pZDpwYWRkaW5nPSI4ZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCisgICAgICAgID4KKyAgICAgICAgPEltYWdlQnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvYnJpZ2h0bmVzcyIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6c3JjPSJAZHJhd2FibGUvc3lzdGVtX3BhbmVsX2JyaWdodG5lc3NfZGVmYXVsdCIKKyAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGRyYXdhYmxlL2J1dHRvbl9mcmFtZSIKKyAgICAgICAgICAgIC8+CisgICAgICAgIDxJbWFnZUJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL3NvdW5kIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iOGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6c3JjPSJAZHJhd2FibGUvc3lzdGVtX3BhbmVsX3NvdW5kX2RlZmF1bHQiCisgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBkcmF3YWJsZS9idXR0b25fZnJhbWUiCisgICAgICAgICAgICAvPgorICAgICAgICA8SW1hZ2VCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9vcmllbnRhdGlvbiIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjhkaXAiCisgICAgICAgICAgICBhbmRyb2lkOnNyYz0iQGRyYXdhYmxlL3N5c3RlbV9wYW5lbF9vcmllbnRhdGlvbl9kZWZhdWx0IgorICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAZHJhd2FibGUvYnV0dG9uX2ZyYW1lIgorICAgICAgICAgICAgLz4KKyAgICAgICAgPEltYWdlQnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvYWlycGxhbmUiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSI4ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpzcmM9IkBkcmF3YWJsZS9zeXN0ZW1fcGFuZWxfYWlycGxhbmVfZGVmYXVsdCIKKyAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGRyYXdhYmxlL2J1dHRvbl9mcmFtZSIKKyAgICAgICAgICAgIC8+CisgICAgPC9MaW5lYXJMYXlvdXQ+CisKKyAgICA8UmVsYXRpdmVMYXlvdXQKKyAgICAgICAgYW5kcm9pZDpwYWRkaW5nPSI4ZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgPgorICAgICAgICA8UmVsYXRpdmVMYXlvdXQKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIxMjBkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50TGVmdD0idHJ1ZSIKKyAgICAgICAgICAgID4KKyAgICAgICAgICAgIDxJbWFnZVZpZXcgYW5kcm9pZDppZD0iQCtpZC9iYXR0ZXJ5X21ldGVyIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpzcmM9IkBkcmF3YWJsZS9iYXR0ZXJ5IgorICAgICAgICAgICAgICAgIC8+CisKKyAgICAgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL2JhdHRlcnlfaW5mbyIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2JlbG93PSJAaWQvYmF0dGVyeV9tZXRlciIKKyAgICAgICAgICAgICAgICAvPgorICAgICAgICA8L1JlbGF0aXZlTGF5b3V0PgorCisgICAgICAgIDxjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIuQ2xvY2sKKyAgICAgICAgICAgIHN0eWxlPSJAKmFuZHJvaWQ6c3R5bGUvVGV4dEFwcGVhcmFuY2UuU3RhdHVzQmFyLkljb24iCisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2Nsb2NrIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpzaW5nbGVMaW5lPSJ0cnVlIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMjBzcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFN0eWxlPSJib2xkIgorICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nPSIyZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfY2VudGVySG9yaXpvbnRhbD0idHJ1ZSIKKyAgICAgICAgICAgIC8+CisKKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvZGF0ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2JlbG93PSJAaWQvY2xvY2siCisgICAgICAgICAgICAvPgorCisgICAgICAgIDxSZWxhdGl2ZUxheW91dAorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjEyMGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRSaWdodD0idHJ1ZSIKKyAgICAgICAgICAgID4KKyAgICAgICAgICAgIDxJbWFnZVZpZXcgYW5kcm9pZDppZD0iQCtpZC9zaWduYWxfbWV0ZXIiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnNyYz0iQGRyYXdhYmxlL3NpZ25hbCIKKyAgICAgICAgICAgICAgICAvPgorCisgICAgICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9zaWduYWxfaW5mbyIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2JlbG93PSJAaWQvc2lnbmFsX21ldGVyIgorICAgICAgICAgICAgICAgIC8+CisgICAgICAgIDwvUmVsYXRpdmVMYXlvdXQ+CisKKyAgICA8L1JlbGF0aXZlTGF5b3V0PgorCis8L2NvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci50YWJsZXQuU3lzdGVtUGFuZWw+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvbGF5b3V0L3N0YXR1c19iYXIueG1sIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2xheW91dC9zdGF0dXNfYmFyLnhtbAppbmRleCA1ZmU4ZTc5Li4yZjFiMzZlOCAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2xheW91dC9zdGF0dXNfYmFyLnhtbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvbGF5b3V0L3N0YXR1c19iYXIueG1sCkBAIC0yMSw2ICsyMSw3IEBACiA8IS0tICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGRyYXdhYmxlL3N0YXR1c19iYXJfY2xvc2VkX2RlZmF1bHRfYmFja2dyb3VuZCIgLS0+CiA8Y29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLlN0YXR1c0JhclZpZXcKICAgICB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6c3lzdGVtdWk9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvY29tLmFuZHJvaWQuc3lzdGVtdWkiCiAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAZHJhd2FibGUvc3RhdHVzX2Jhcl9iYWNrZ3JvdW5kIgogICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgogICAgIGFuZHJvaWQ6Zm9jdXNhYmxlPSJ0cnVlIgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL3ZhbHVlcy14bGFyZ2UvY29sb3JzLnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy92YWx1ZXMteGxhcmdlL2NvbG9ycy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQxNjFjMwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy92YWx1ZXMteGxhcmdlL2NvbG9ycy54bWwKQEAgLTAsMCArMSw1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPHJlc291cmNlcz4KKyAgICA8ZHJhd2FibGUgbmFtZT0ic3RhdHVzX2Jhcl9iYWNrZ3JvdW5kIj4jMDAwMDAwPC9kcmF3YWJsZT4KKzwvcmVzb3VyY2VzPgorCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzLXhsYXJnZS9jb25maWcueG1sIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL3ZhbHVlcy14bGFyZ2UvY29uZmlnLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Y2Y1ZDE4ZDExCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL3ZhbHVlcy14bGFyZ2UvY29uZmlnLnhtbApAQCAtMCwwICsxLDI1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorLyoKKyoqIENvcHlyaWdodCAyMDEwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAorKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKworPCEtLSBUaGVzZSByZXNvdXJjZXMgYXJlIGFyb3VuZCBqdXN0IHRvIGFsbG93IHRoZWlyIHZhbHVlcyB0byBiZSBjdXN0b21pemVkCisgICAgIGZvciBkaWZmZXJlbnQgaGFyZHdhcmUgYW5kIHByb2R1Y3QgYnVpbGRzLiAtLT4KKzxyZXNvdXJjZXM+CisgICAgPGludGVnZXIgbmFtZT0iY29uZmlnX3N0YXR1c19iYXJfcG9zaXRpb24iPjE8L2ludGVnZXI+Cis8L3Jlc291cmNlcz4KKwpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL3ZhbHVlcy14bGFyZ2Uvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzLXhsYXJnZS9zdHJpbmdzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YWE0YjQ3Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL3ZhbHVlcy14bGFyZ2Uvc3RyaW5ncy54bWwKQEAgLTAsMCArMSwyMyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAorICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworLS0+Cis8cmVzb3VyY2VzIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KKyAgICA8IS0tIFRoZSB0ZXh0IGZvciB0aGUgYnV0dG9uIGluIHRoZSBub3RpZmljYXRpb24gd2luZG93LXNoYWRlIHRoYXQgY2xlYXJzCisgICAgICAgICBhbGwgb2YgdGhlIGN1cnJlbnRseSB2aXNpYmxlIG5vdGlmaWNhdGlvbnMuIC0tPgorICAgIDxzdHJpbmcgbmFtZT0ic3RhdHVzX2Jhcl9jbGVhcl9hbGxfYnV0dG9uIj5DbGVhciBhbGw8L3N0cmluZz4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL3ZhbHVlcy9hdHRycy54bWwgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzL2F0dHJzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2JjZjIwCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL3ZhbHVlcy9hdHRycy54bWwKQEAgLTAsMCArMSwyMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHJlc291cmNlcz4KKyAgICA8ZGVjbGFyZS1zdHlsZWFibGUgbmFtZT0iS2V5QnV0dG9uVmlldyI+CisgICAgICAgIDxhdHRyIG5hbWU9ImtleUNvZGUiIGZvcm1hdD0iaW50ZWdlciIgLz4KKyAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgorPC9yZXNvdXJjZXM+CisKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy92YWx1ZXMvY29uZmlnLnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy92YWx1ZXMvY29uZmlnLnhtbAppbmRleCA4ZWE0NmU1Li5hYzAwYzY5IDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzL2NvbmZpZy54bWwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL3ZhbHVlcy9jb25maWcueG1sCkBAIC0yMCw3ICsyMCwxNiBAQAogPCEtLSBUaGVzZSByZXNvdXJjZXMgYXJlIGFyb3VuZCBqdXN0IHRvIGFsbG93IHRoZWlyIHZhbHVlcyB0byBiZSBjdXN0b21pemVkCiAgICAgIGZvciBkaWZmZXJlbnQgaGFyZHdhcmUgYW5kIHByb2R1Y3QgYnVpbGRzLiAtLT4KIDxyZXNvdXJjZXM+Ci0gICAgPCEtLSBDb250cm9sIHdoZXRoZXIgc3RhdHVzIGJhciBzaG91bGQgZGlzdGluZ3Vpc2ggSFNQQSBkYXRhIGljb24gZm9ybSBVTVRTIGRhdGEgaWNvbiBvbiBkZXZpY2VzIC0tPgorCisgICAgPCEtLSBDb250cm9sIHdoZXRoZXIgc3RhdHVzIGJhciBzaG91bGQgZGlzdGluZ3Vpc2ggSFNQQSBkYXRhIGljb24gZm9ybSBVTVRTCisgICAgZGF0YSBpY29uIG9uIGRldmljZXMgLS0+CiAgICAgPGJvb2wgbmFtZT0iY29uZmlnX2hzcGFfZGF0YV9kaXN0aW5ndWlzaGFibGUiPmZhbHNlPC9ib29sPgorCisgICAgPCEtLSBUaGUgbG9jYXRpb24gb2YgdGhlIHN0YXR1cyBiYXIuCisgICAgICAgIDAgLSB0b3AKKyAgICAgICAgMSAtIGJvdHRvbQorICAgIC0tPgorICAgIDxpbnRlZ2VyIG5hbWU9ImNvbmZpZ19zdGF0dXNfYmFyX3Bvc2l0aW9uIj4wPC9pbnRlZ2VyPgorCiA8L3Jlc291cmNlcz4KIApkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKaW5kZXggYmEzYTNkMS4uMmRmM2I2ZCAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCkBAIC01MSw0ICs1MSw3IEBACiAgICAgICAgICBwb3dlciB1c2FnZSBhY3Rpdml0eSB0byBmaW5kIG91dCB3aGF0IGRyYWluZWQgdGhlIGJhdHRlcnkuIC0tPgogICAgIDxzdHJpbmcgbmFtZT0iYmF0dGVyeV9sb3dfd2h5Ij5CYXR0ZXJ5IHVzZTwvc3RyaW5nPgogCisgICAgPCEtLSBOYW1lIG9mIHRoZSBidXR0b24gdGhhdCBsaW5rcyB0byB0aGUgU2V0dGluZ3MgYXBwLiBbTUFYQ0hBUlM9Tk9ORV0gLS0+CisgICAgPHN0cmluZyBuYW1lPSJzeXN0ZW1fcGFuZWxfc2V0dGluZ3NfYnV0dG9uIj5TZXR0aW5nczwvc3RyaW5nPgorCiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvQ2xvc2VEcmFnSGFuZGxlLmphdmEgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL0Nsb3NlRHJhZ0hhbmRsZS5qYXZhCmluZGV4IGY0NWNhZjUxLi4wZjY3MjNlIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL0Nsb3NlRHJhZ0hhbmRsZS5qYXZhCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvQ2xvc2VEcmFnSGFuZGxlLmphdmEKQEAgLTIzLDcgKzIzLDcgQEAKIAogCiBwdWJsaWMgY2xhc3MgQ2xvc2VEcmFnSGFuZGxlIGV4dGVuZHMgTGluZWFyTGF5b3V0IHsKLSAgICBTdGF0dXNCYXJTZXJ2aWNlIG1TZXJ2aWNlOworICAgIFBob25lU3RhdHVzQmFyU2VydmljZSBtU2VydmljZTsKIAogICAgIHB1YmxpYyBDbG9zZURyYWdIYW5kbGUoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKICAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMpOwpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9Db21tYW5kUXVldWUuamF2YSBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvQ29tbWFuZFF1ZXVlLmphdmEKaW5kZXggZjkzNDdiMS4uMmMwYWY2NSAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9Db21tYW5kUXVldWUuamF2YQorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL0NvbW1hbmRRdWV1ZS5qYXZhCkBAIC0zMiw3ICszMiw3IEBACiAgKiBjb2FsZXNjaW5nIHRoZXNlIGNhbGxzIHNvIHRoZXkgZG9uJ3Qgc3RhY2sgdXAuICBGb3IgdGhlIGNhbGxzCiAgKiBhcmUgY29hbGVzY2VkLCBub3RlIHRoYXQgdGhleSBhcmUgYWxsIGlkZW1wb3RlbnQuCiAgKi8KLWNsYXNzIENvbW1hbmRRdWV1ZSBleHRlbmRzIElTdGF0dXNCYXIuU3R1YiB7CitwdWJsaWMgY2xhc3MgQ29tbWFuZFF1ZXVlIGV4dGVuZHMgSVN0YXR1c0Jhci5TdHViIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlN0YXR1c0Jhci5Db21tYW5kUXVldWUiOwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19NQVNLID0gMHhmZmZmMDAwMDsKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvRXhwYW5kZWRWaWV3LmphdmEgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL0V4cGFuZGVkVmlldy5qYXZhCmluZGV4IDNkODVmMjcuLmEyZDRiOTUgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvRXhwYW5kZWRWaWV3LmphdmEKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9FeHBhbmRlZFZpZXcuamF2YQpAQCAtMjcsNyArMjcsNyBAQAogCiAKIHB1YmxpYyBjbGFzcyBFeHBhbmRlZFZpZXcgZXh0ZW5kcyBMaW5lYXJMYXlvdXQgewotICAgIFN0YXR1c0JhclNlcnZpY2UgbVNlcnZpY2U7CisgICAgUGhvbmVTdGF0dXNCYXJTZXJ2aWNlIG1TZXJ2aWNlOwogICAgIGludCBtUHJldkhlaWdodCA9IC0xOwogCiAgICAgcHVibGljIEV4cGFuZGVkVmlldyhDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgewpAQCAtNTMsNyArNTMsNyBAQAogICAgICAgICAgICAgIC8vU2xvZy5kKFN0YXR1c0JhclNlcnZpY2UuVEFHLCAiaGVpZ2h0IGNoYW5nZWQgb2xkPSIgKyBtUHJldkhlaWdodAogICAgICAgICAgICAgIC8vICAgICArICIgbmV3PSIgKyBoZWlnaHQpOwogICAgICAgICAgICAgIG1QcmV2SGVpZ2h0ID0gaGVpZ2h0OwotICAgICAgICAgICAgIG1TZXJ2aWNlLnVwZGF0ZUV4cGFuZGVkVmlld1BvcyhTdGF0dXNCYXJTZXJ2aWNlLkVYUEFOREVEX0xFQVZFX0FMT05FKTsKKyAgICAgICAgICAgICBtU2VydmljZS51cGRhdGVFeHBhbmRlZFZpZXdQb3MoUGhvbmVTdGF0dXNCYXJTZXJ2aWNlLkVYUEFOREVEX0xFQVZFX0FMT05FKTsKICAgICAgICAgIH0KICAgICAgfQogfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9LZXlCdXR0b25WaWV3LmphdmEgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL0tleUJ1dHRvblZpZXcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDUwOGI4Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9LZXlCdXR0b25WaWV3LmphdmEKQEAgLTAsMCArMSwxMjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2JhcjsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkFuaW1hdGlvbkRyYXdhYmxlOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7CitpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKK2ltcG9ydCBhbmRyb2lkLm9zLlNlcnZpY2VNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CitpbXBvcnQgYW5kcm9pZC51dGlsLlNsb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3LklXaW5kb3dNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQudmlldy5JbnB1dERldmljZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkltYWdlVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5SZW1vdGVWaWV3cy5SZW1vdGVWaWV3OworCitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuUjsKKworcHVibGljIGNsYXNzIEtleUJ1dHRvblZpZXcgZXh0ZW5kcyBJbWFnZVZpZXcgeworICAgIElXaW5kb3dNYW5hZ2VyIG1XaW5kb3dNYW5hZ2VyOworICAgIGxvbmcgbURvd25UaW1lOworICAgIGJvb2xlYW4gbVNlbmRpbmc7CisgICAgaW50IG1Db2RlOworICAgIGludCBtUmVwZWF0OworCisgICAgcHVibGljIEtleUJ1dHRvblZpZXcoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKKyAgICAgICAgdGhpcyhjb250ZXh0LCBhdHRycywgMCk7CisgICAgfQorCisgICAgcHVibGljIEtleUJ1dHRvblZpZXcoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBkZWZTdHlsZSkgeworICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycyk7CisKKyAgICAgICAgVHlwZWRBcnJheSBhID0gY29udGV4dC5vYnRhaW5TdHlsZWRBdHRyaWJ1dGVzKGF0dHJzLCBSLnN0eWxlYWJsZS5LZXlCdXR0b25WaWV3LAorICAgICAgICAgICAgICAgIGRlZlN0eWxlLCAwKTsKKworICAgICAgICBtQ29kZSA9IGEuZ2V0SW50ZWdlcihSLnN0eWxlYWJsZS5LZXlCdXR0b25WaWV3X2tleUNvZGUsIDApOworICAgICAgICBpZiAobUNvZGUgPT0gMCkgeworICAgICAgICAgICAgU2xvZy53KFN0YXR1c0JhclNlcnZpY2UuVEFHLCAiS2V5QnV0dG9uVmlldyB3aXRob3V0IGtleSBjb2RlIGlkPTB4IgorICAgICAgICAgICAgICAgICAgICArIEludGVnZXIudG9IZXhTdHJpbmcoZ2V0SWQoKSkpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBhLnJlY3ljbGUoKTsKKworICAgICAgICBtV2luZG93TWFuYWdlciA9IElXaW5kb3dNYW5hZ2VyLlN0dWIuYXNJbnRlcmZhY2UoCisgICAgICAgICAgICAgICAgU2VydmljZU1hbmFnZXIuZ2V0U2VydmljZShDb250ZXh0LldJTkRPV19TRVJWSUNFKSk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gb25Ub3VjaEV2ZW50KE1vdGlvbkV2ZW50IGV2KSB7CisgICAgICAgIGZpbmFsIGludCBhY3Rpb24gPSBldi5nZXRBY3Rpb24oKTsKKyAgICAgICAgaW50IHgsIHk7CisKKyAgICAgICAgc3dpdGNoIChhY3Rpb24pIHsKKyAgICAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX0RPV046CisgICAgICAgICAgICAgICAgbURvd25UaW1lID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCk7CisgICAgICAgICAgICAgICAgbVJlcGVhdCA9IDA7CisgICAgICAgICAgICAgICAgbVNlbmRpbmcgPSB0cnVlOworICAgICAgICAgICAgICAgIHNlbmRFdmVudChLZXlFdmVudC5BQ1RJT05fRE9XTiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEtleUV2ZW50LkZMQUdfRlJPTV9TWVNURU0gfCBLZXlFdmVudC5GTEFHX1NPRlRfS0VZQk9BUkQsIG1Eb3duVGltZSk7CisgICAgICAgICAgICAgICAgc2V0UHJlc3NlZCh0cnVlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX01PVkU6CisgICAgICAgICAgICAgICAgaWYgKG1TZW5kaW5nKSB7CisgICAgICAgICAgICAgICAgICAgIHggPSAoaW50KWV2LmdldFgoKTsKKyAgICAgICAgICAgICAgICAgICAgeSA9IChpbnQpZXYuZ2V0WSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoeCA8IDAgfHwgeCA+PSBnZXRXaWR0aCgpIHx8IHkgPCAwIHx8IHkgPj0gZ2V0SGVpZ2h0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TZW5kaW5nID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICBzZW5kRXZlbnQoS2V5RXZlbnQuQUNUSU9OX1VQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXlFdmVudC5GTEFHX0ZST01fU1lTVEVNIHwgS2V5RXZlbnQuRkxBR19TT0ZUX0tFWUJPQVJECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBLZXlFdmVudC5GTEFHX0NBTkNFTEVEKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldFByZXNzZWQoZmFsc2UpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBNb3Rpb25FdmVudC5BQ1RJT05fVVA6CisgICAgICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9DQU5DRUw6CisgICAgICAgICAgICAgICAgaWYgKG1TZW5kaW5nKSB7CisgICAgICAgICAgICAgICAgICAgIG1TZW5kaW5nID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIHNlbmRFdmVudChLZXlFdmVudC5BQ1RJT05fVVAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5RXZlbnQuRkxBR19GUk9NX1NZU1RFTSB8IEtleUV2ZW50LkZMQUdfU09GVF9LRVlCT0FSRCk7CisgICAgICAgICAgICAgICAgICAgIHNldFByZXNzZWQoZmFsc2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHZvaWQgc2VuZEV2ZW50KGludCBhY3Rpb24sIGludCBmbGFncykgeworICAgICAgICBzZW5kRXZlbnQoYWN0aW9uLCBmbGFncywgU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCkpOworICAgIH0KKworICAgIHZvaWQgc2VuZEV2ZW50KGludCBhY3Rpb24sIGludCBmbGFncywgbG9uZyB3aGVuKSB7CisgICAgICAgIGZpbmFsIEtleUV2ZW50IGV2ID0gbmV3IEtleUV2ZW50KG1Eb3duVGltZSwgd2hlbiwgYWN0aW9uLCBtQ29kZSwgbVJlcGVhdCwKKyAgICAgICAgICAgICAgICAwLCAwLCAwLCBmbGFncywgSW5wdXREZXZpY2UuU09VUkNFX0tFWUJPQVJEKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFNsb2cuZChTdGF0dXNCYXJTZXJ2aWNlLlRBRywgImluamVjdGluZyBldmVudCAiICsgZXYpOworICAgICAgICAgICAgbVdpbmRvd01hbmFnZXIuaW5qZWN0SW5wdXRFdmVudE5vV2FpdChldik7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgLy8gU3lzdGVtIHByb2Nlc3MgaXMgZGVhZAorICAgICAgICB9CisgICAgfQorfQorCisKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvTm90aWZpY2F0aW9uRGF0YS5qYXZhIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9Ob3RpZmljYXRpb25EYXRhLmphdmEKaW5kZXggN2E4MjI2Ny4uNDVhYmU5MyAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9Ob3RpZmljYXRpb25EYXRhLmphdmEKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9Ob3RpZmljYXRpb25EYXRhLmphdmEKQEAgLTIyLDYgKzIyLDcgQEAKIAogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnN0YXR1c2Jhci5TdGF0dXNCYXJOb3RpZmljYXRpb247CiAKK2ltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogCiAvKioKQEAgLTM1LDI2ICszNiw0NyBAQAogICAgICAgICBwdWJsaWMgVmlldyByb3c7IC8vIHRoZSBvdXRlciBleHBhbmRlZCB2aWV3CiAgICAgICAgIHB1YmxpYyBWaWV3IGNvbnRlbnQ7IC8vIHRha2VzIHRoZSBjbGljayBldmVudHMgYW5kIHNlbmRzIHRoZSBQZW5kaW5nSW50ZW50CiAgICAgICAgIHB1YmxpYyBWaWV3IGV4cGFuZGVkOyAvLyB0aGUgaW5mbGF0ZWQgUmVtb3RlVmlld3MKKyAgICAgICAgcHVibGljIEVudHJ5KCkge30KKyAgICAgICAgcHVibGljIEVudHJ5KElCaW5kZXIga2V5LCBTdGF0dXNCYXJOb3RpZmljYXRpb24gbiwgU3RhdHVzQmFySWNvblZpZXcgaWMpIHsKKyAgICAgICAgICAgIHRoaXMua2V5ID0ga2V5OworICAgICAgICAgICAgdGhpcy5ub3RpZmljYXRpb24gPSBuOworICAgICAgICAgICAgdGhpcy5pY29uID0gaWM7CisgICAgICAgIH0KICAgICB9CiAgICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8RW50cnk+IG1FbnRyaWVzID0gbmV3IEFycmF5TGlzdDxFbnRyeT4oKTsKKyAgICBwcml2YXRlIGZpbmFsIENvbXBhcmF0b3I8RW50cnk+IG1FbnRyeUNtcCA9IG5ldyBDb21wYXJhdG9yPEVudHJ5PigpIHsKKyAgICAgICAgcHVibGljIGludCBjb21wYXJlKEVudHJ5IGEsIEVudHJ5IGIpIHsKKyAgICAgICAgICAgIHJldHVybiAoaW50KShhLm5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24ud2hlbiAtIGIubm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi53aGVuKTsKKyAgICAgICAgfQorICAgIH07CiAKICAgICBwdWJsaWMgaW50IHNpemUoKSB7CiAgICAgICAgIHJldHVybiBtRW50cmllcy5zaXplKCk7CiAgICAgfQogCi0gICAgcHVibGljIEVudHJ5IGdldEVudHJ5QXQoaW50IGluZGV4KSB7Ci0gICAgICAgIHJldHVybiBtRW50cmllcy5nZXQoaW5kZXgpOworICAgIHB1YmxpYyBFbnRyeSBnZXQoaW50IGkpIHsKKyAgICAgICAgcmV0dXJuIG1FbnRyaWVzLmdldChpKTsKICAgICB9CiAKLSAgICBwdWJsaWMgaW50IGZpbmRFbnRyeShJQmluZGVyIGtleSkgewotICAgICAgICBmaW5hbCBpbnQgTiA9IG1FbnRyaWVzLnNpemUoKTsKLSAgICAgICAgZm9yIChpbnQgaT0wOyBpPE47IGkrKykgewotICAgICAgICAgICAgRW50cnkgZW50cnkgPSBtRW50cmllcy5nZXQoaSk7Ci0gICAgICAgICAgICBpZiAoZW50cnkua2V5ID09IGtleSkgewotICAgICAgICAgICAgICAgIHJldHVybiBpOworICAgIHB1YmxpYyBFbnRyeSBmaW5kQnlLZXkoSUJpbmRlciBrZXkpIHsKKyAgICAgICAgZm9yIChFbnRyeSBlIDogbUVudHJpZXMpIHsKKyAgICAgICAgICAgIGlmIChlLmtleSA9PSBrZXkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgYWRkKEVudHJ5IGVudHJ5KSB7CisgICAgICAgIGludCBpOworICAgICAgICBpbnQgTiA9IG1FbnRyaWVzLnNpemUoKTsKKyAgICAgICAgZm9yIChpPTA7IGk8TjsgaSsrKSB7CisgICAgICAgICAgICBpZiAobUVudHJ5Q21wLmNvbXBhcmUobUVudHJpZXMuZ2V0KGkpLCBlbnRyeSkgPiAwKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbUVudHJpZXMuYWRkKGksIGVudHJ5KTsKKyAgICAgICAgcmV0dXJuIGk7CiAgICAgfQogCiAgICAgcHVibGljIGludCBhZGQoSUJpbmRlciBrZXksIFN0YXR1c0Jhck5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24sIFZpZXcgcm93LCBWaWV3IGNvbnRlbnQsCkBAIC02Niw0MiArODgsMjMgQEAKICAgICAgICAgZW50cnkuY29udGVudCA9IGNvbnRlbnQ7CiAgICAgICAgIGVudHJ5LmV4cGFuZGVkID0gZXhwYW5kZWQ7CiAgICAgICAgIGVudHJ5Lmljb24gPSBpY29uOwotICAgICAgICBmaW5hbCBpbnQgaW5kZXggPSBjaG9vc2VJbmRleChub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLndoZW4pOwotICAgICAgICBtRW50cmllcy5hZGQoaW5kZXgsIGVudHJ5KTsKLSAgICAgICAgcmV0dXJuIGluZGV4OworICAgICAgICByZXR1cm4gYWRkKGVudHJ5KTsKICAgICB9CiAKICAgICBwdWJsaWMgRW50cnkgcmVtb3ZlKElCaW5kZXIga2V5KSB7Ci0gICAgICAgIGZpbmFsIGludCBOID0gbUVudHJpZXMuc2l6ZSgpOwotICAgICAgICBmb3IgKGludCBpPTA7IGk8TjsgaSsrKSB7Ci0gICAgICAgICAgICBFbnRyeSBlbnRyeSA9IG1FbnRyaWVzLmdldChpKTsKLSAgICAgICAgICAgIGlmIChlbnRyeS5rZXkgPT0ga2V5KSB7Ci0gICAgICAgICAgICAgICAgbUVudHJpZXMucmVtb3ZlKGkpOwotICAgICAgICAgICAgICAgIHJldHVybiBlbnRyeTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgRW50cnkgZSA9IGZpbmRCeUtleShrZXkpOworICAgICAgICBpZiAoZSAhPSBudWxsKSB7CisgICAgICAgICAgICBtRW50cmllcy5yZW1vdmUoZSk7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgY2hvb3NlSW5kZXgoZmluYWwgbG9uZyB3aGVuKSB7Ci0gICAgICAgIGZpbmFsIGludCBOID0gbUVudHJpZXMuc2l6ZSgpOwotICAgICAgICBmb3IgKGludCBpPTA7IGk8TjsgaSsrKSB7Ci0gICAgICAgICAgICBFbnRyeSBlbnRyeSA9IG1FbnRyaWVzLmdldChpKTsKLSAgICAgICAgICAgIGlmIChlbnRyeS5ub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLndoZW4gPiB3aGVuKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIE47CisgICAgICAgIHJldHVybiBlOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIFJldHVybiB3aGV0aGVyIHRoZXJlIGFyZSBhbnkgdmlzaWJsZSBpdGVtcyAoaS5lLiBpdGVtcyB3aXRob3V0IGFuIGVycm9yKS4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBoYXNWaXNpYmxlSXRlbXMoKSB7Ci0gICAgICAgIGZpbmFsIGludCBOID0gbUVudHJpZXMuc2l6ZSgpOwotICAgICAgICBmb3IgKGludCBpPTA7IGk8TjsgaSsrKSB7Ci0gICAgICAgICAgICBFbnRyeSBlbnRyeSA9IG1FbnRyaWVzLmdldChpKTsKLSAgICAgICAgICAgIGlmIChlbnRyeS5leHBhbmRlZCAhPSBudWxsKSB7IC8vIHRoZSB2aWV3IHN1Y2Nlc3NmdWxseSBpbmZsYXRlZAorICAgICAgICBmb3IgKEVudHJ5IGUgOiBtRW50cmllcykgeworICAgICAgICAgICAgaWYgKGUuZXhwYW5kZWQgIT0gbnVsbCkgeyAvLyB0aGUgdmlldyBzdWNjZXNzZnVsbHkgaW5mbGF0ZWQKICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMTEyLDExICsxMTUsOSBAQAogICAgICAqIFJldHVybiB3aGV0aGVyIHRoZXJlIGFyZSBhbnkgY2xlYXJhYmxlIGl0ZW1zICh0aGF0IGFyZW4ndCBlcnJvcnMpLgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGhhc0NsZWFyYWJsZUl0ZW1zKCkgewotICAgICAgICBmaW5hbCBpbnQgTiA9IG1FbnRyaWVzLnNpemUoKTsKLSAgICAgICAgZm9yIChpbnQgaT0wOyBpPE47IGkrKykgewotICAgICAgICAgICAgRW50cnkgZW50cnkgPSBtRW50cmllcy5nZXQoaSk7Ci0gICAgICAgICAgICBpZiAoZW50cnkuZXhwYW5kZWQgIT0gbnVsbCkgeyAvLyB0aGUgdmlldyBzdWNjZXNzZnVsbHkgaW5mbGF0ZWQKLSAgICAgICAgICAgICAgICBpZiAoKGVudHJ5Lm5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24uZmxhZ3MgJiBOb3RpZmljYXRpb24uRkxBR19OT19DTEVBUikgPT0gMCkgeworICAgICAgICBmb3IgKEVudHJ5IGUgOiBtRW50cmllcykgeworICAgICAgICAgICAgaWYgKGUuZXhwYW5kZWQgIT0gbnVsbCkgeyAvLyB0aGUgdmlldyBzdWNjZXNzZnVsbHkgaW5mbGF0ZWQKKyAgICAgICAgICAgICAgICBpZiAoKGUubm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi5mbGFncyAmIE5vdGlmaWNhdGlvbi5GTEFHX05PX0NMRUFSKSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvUGhvbmVTdGF0dXNCYXJTZXJ2aWNlLmphdmEgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL1Bob25lU3RhdHVzQmFyU2VydmljZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxYjU4M2IKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL1Bob25lU3RhdHVzQmFyU2VydmljZS5qYXZhCkBAIC0wLDAgKzEsMTU1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyOworCitpbXBvcnQgYW5kcm9pZC5hcHAuU2VydmljZTsKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eU1hbmFnZXJOYXRpdmU7CitpbXBvcnQgYW5kcm9pZC5hcHAuRGlhbG9nOworaW1wb3J0IGFuZHJvaWQuYXBwLk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50OworaW1wb3J0IGFuZHJvaWQuYXBwLlNlcnZpY2U7CitpbXBvcnQgYW5kcm9pZC5hcHAuU3RhdHVzQmFyTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBpeGVsRm9ybWF0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOworaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKK2ltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC5vcy5CaW5kZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOworaW1wb3J0IGFuZHJvaWQudXRpbC5TbG9nOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3LkRpc3BsYXk7CitpbXBvcnQgYW5kcm9pZC52aWV3LkdyYXZpdHk7CitpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OworaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQ7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZlbG9jaXR5VHJhY2tlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3c7CitpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXJJbXBsOworaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uOworaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uVXRpbHM7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuSW1hZ2VWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkxpbmVhckxheW91dDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5SZW1vdGVWaWV3czsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5TY3JvbGxWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkZyYW1lTGF5b3V0OworCitpbXBvcnQgamF2YS5pby5GaWxlRGVzY3JpcHRvcjsKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnN0YXR1c2Jhci5JU3RhdHVzQmFyOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnN0YXR1c2Jhci5JU3RhdHVzQmFyU2VydmljZTsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5zdGF0dXNiYXIuU3RhdHVzQmFySWNvbjsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5zdGF0dXNiYXIuU3RhdHVzQmFySWNvbkxpc3Q7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuc3RhdHVzYmFyLlN0YXR1c0Jhck5vdGlmaWNhdGlvbjsKKworaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLlI7CitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLnBvbGljeS5TdGF0dXNCYXJQb2xpY3k7CisKKworCitwdWJsaWMgY2xhc3MgUGhvbmVTdGF0dXNCYXJTZXJ2aWNlIGV4dGVuZHMgU3RhdHVzQmFyU2VydmljZSB7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiUGhvbmVTdGF0dXNCYXJTZXJ2aWNlIjsKKyAgICBzdGF0aWMgZmluYWwgYm9vbGVhbiBTUEVXID0gZmFsc2U7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fU1RBVFVTQkFSX1NUQVJUCisgICAgICAgICAgICA9ICJjb20uYW5kcm9pZC5pbnRlcm5hbC5wb2xpY3kuc3RhdHVzYmFyLlNUQVJUIjsKKworICAgIHN0YXRpYyBmaW5hbCBpbnQgRVhQQU5ERURfTEVBVkVfQUxPTkUgPSAtMTAwMDA7CisgICAgc3RhdGljIGZpbmFsIGludCBFWFBBTkRFRF9GVUxMX09QRU4gPSAtMTAwMDE7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0FOSU1BVEUgPSAxMDAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfQU5JTUFURV9SRVZFQUwgPSAxMDAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfU0hPV19JTlRSVURFUiA9IDEwMDI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19ISURFX0lOVFJVREVSID0gMTAwMzsKKworICAgIC8vIHdpbGwgbGlrZWx5IG1vdmUgdG8gYSByZXNvdXJjZSBvciBvdGhlciB0dW5hYmxlIHBhcmFtIGF0IHNvbWUgcG9pbnQKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU5UUlVERVJfQUxFUlRfREVDQVlfTVMgPSAxMDAwMDsKKworICAgIFN0YXR1c0JhclBvbGljeSBtSWNvblBvbGljeTsKKworICAgIGludCBtSWNvblNpemU7CisgICAgRGlzcGxheSBtRGlzcGxheTsKKworICAgIFN0YXR1c0JhclZpZXcgbVN0YXR1c0JhclZpZXc7CisgICAgaW50IG1QaXhlbEZvcm1hdDsKKyAgICBIIG1IYW5kbGVyID0gbmV3IEgoKTsKKyAgICBPYmplY3QgbVF1ZXVlTG9jayA9IG5ldyBPYmplY3QoKTsKKworICAgIC8vIGljb25zCisgICAgTGluZWFyTGF5b3V0IG1JY29uczsKKyAgICBJY29uTWVyZ2VyIG1Ob3RpZmljYXRpb25JY29uczsKKyAgICBMaW5lYXJMYXlvdXQgbVN0YXR1c0ljb25zOworCisgICAgLy8gZXhwYW5kZWQgbm90aWZpY2F0aW9ucworICAgIERpYWxvZyBtRXhwYW5kZWREaWFsb2c7CisgICAgRXhwYW5kZWRWaWV3IG1FeHBhbmRlZFZpZXc7CisgICAgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMgbUV4cGFuZGVkUGFyYW1zOworICAgIFNjcm9sbFZpZXcgbVNjcm9sbFZpZXc7CisgICAgVmlldyBtTm90aWZpY2F0aW9uTGluZWFyTGF5b3V0OworICAgIFZpZXcgbUV4cGFuZGVkQ29udGVudHM7CisgICAgLy8gdG9wIGJhcgorICAgIFRleHRWaWV3IG1Ob05vdGlmaWNhdGlvbnNUaXRsZTsKKyAgICBUZXh0VmlldyBtQ2xlYXJCdXR0b247CisgICAgLy8gZHJhZyBiYXIKKyAgICBDbG9zZURyYWdIYW5kbGUgbUNsb3NlVmlldzsKKyAgICAvLyBvbmdvaW5nCisgICAgTm90aWZpY2F0aW9uRGF0YSBtT25nb2luZyA9IG5ldyBOb3RpZmljYXRpb25EYXRhKCk7CisgICAgVGV4dFZpZXcgbU9uZ29pbmdUaXRsZTsKKyAgICBMaW5lYXJMYXlvdXQgbU9uZ29pbmdJdGVtczsKKyAgICAvLyBsYXRlc3QKKyAgICBOb3RpZmljYXRpb25EYXRhIG1MYXRlc3QgPSBuZXcgTm90aWZpY2F0aW9uRGF0YSgpOworICAgIFRleHRWaWV3IG1MYXRlc3RUaXRsZTsKKyAgICBMaW5lYXJMYXlvdXQgbUxhdGVzdEl0ZW1zOworICAgIC8vIHBvc2l0aW9uCisgICAgaW50W10gbVBvc2l0aW9uVG1wID0gbmV3IGludFsyXTsKKyAgICBib29sZWFuIG1FeHBhbmRlZDsKKyAgICBib29sZWFuIG1FeHBhbmRlZFZpc2libGU7CisKKyAgICAvLyB0aGUgZGF0ZSB2aWV3CisgICAgRGF0ZVZpZXcgbURhdGVWaWV3OworCisgICAgLy8gZm9yIGltbWVyc2l2ZSBhY3Rpdml0aWVzCisgICAgcHJpdmF0ZSBWaWV3IG1JbnRydWRlckFsZXJ0VmlldzsKKworICAgIC8vIHRoZSB0cmFja2VyIHZpZXcKKyAgICBUcmFja2luZ1ZpZXcgbVRyYWNraW5nVmlldzsKKyAgICBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcyBtVHJhY2tpbmdQYXJhbXM7CisgICAgaW50IG1UcmFja2luZ1Bvc2l0aW9uOyAvLyB0aGUgcG9zaXRpb24gb2YgdGhlIHRvcCBvZiB0aGUgdHJhY2tpbmcgdmlldy4KKyAgICBwcml2YXRlIGJvb2xlYW4gbVBhbmVsU2xpZ2h0bHlWaXNpYmxlOworCisgICAgLy8gdGlja2VyCisgICAgcHJpdmF0ZSBUaWNrZXIgbVRpY2tlcjsKKyAgICBwcml2YXRlIFZpZXcgbVRpY2tlclZpZXc7CisgICAgcHJpdmF0ZSBib29sZWFuIG1UaWNraW5nOworCisgICAgLy8gVHJhY2tpbmcgZmluZ2VyIGZvciBvcGVuaW5nL2Nsb3NpbmcuCisgICAgaW50IG1FZGdlQm9yZGVyOyAvLyBjb3JyZXNwb25kcyB0byBSLmRpbWVuLnN0YXR1c19iYXJfZWRnZV9pZ25vcmUKKyAgICBib29sZWFuIG1UcmFja2luZzsKKyAgICBWZWxvY2l0eVRyYWNrZXIgbVZlbG9jaXR5VHJhY2tlcjsKKworICAgIHN0YXRpYyBmaW5hbCBpbnQgQU5JTV9GUkFNRV9EVVJBVElPTiA9ICgxMDAwLzYwKTsKKworICAgIGJvb2xlYW4gbUFuaW1hdGluZzsKKyAgICBsb25nIG1DdXJBbmltYXRpb25UaW1lOworICAgIGZsb2F0IG1EaXNwbGF5SGVpZ2h0OworICAgIGZsb2F0IG1BbmltWTsKKyAgICBmbG9hdCBtQW5pbVZlbDsKKyAgICBmbG9hdCBtQW5pbUFjY2VsOworICAgIGxvbmcgbUFuaW1MYXN0VGltZTsKKyAgICBib29sZWFuIG1BbmltYXRpbmdSZXZlYWwgPSBmYWxzZTsKKyAgICBpbnQgbVZpZXdEZWx0YTsKKyAgICBpbnRbXSBtQWJzUG9zID0gbmV3IGludFsyXTsKKworICAgIC8vIGZvciBkaXNhYmxpbmcgdGhlIHN0YXR1cyBiYXIKKyAgICBpbnQgbURpc2FibGVkID0gMDsKKworICAgIHByaXZhdGUgY2xhc3MgRXhwYW5kZWREaWFsb2cgZXh0ZW5kcyBEaWFsb2cgeworICAgICAgICBFeHBhbmRlZERpYWxvZyhDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGUuVGhlbWVfTGlnaHRfTm9UaXRsZUJhcik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gZGlzcGF0Y2hLZXlFdmVudChLZXlFdmVudCBldmVudCkgeworICAgICAgICAgICAgYm9vbGVhbiBkb3duID0gZXZlbnQuZ2V0QWN0aW9uKCkgPT0gS2V5RXZlbnQuQUNUSU9OX0RPV047CisgICAgICAgICAgICBzd2l0Y2ggKGV2ZW50LmdldEtleUNvZGUoKSkgeworICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5LRVlDT0RFX0JBQ0s6CisgICAgICAgICAgICAgICAgaWYgKCFkb3duKSB7CisgICAgICAgICAgICAgICAgICAgIGFuaW1hdGVDb2xsYXBzZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBzdXBlci5kaXNwYXRjaEtleUV2ZW50KGV2ZW50KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKCkgeworICAgICAgICBtRGlzcGxheSA9ICgoV2luZG93TWFuYWdlcilnZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuV0lORE9XX1NFUlZJQ0UpKS5nZXREZWZhdWx0RGlzcGxheSgpOworCisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKCk7CisKKyAgICAgICAgYWRkSW50cnVkZXJWaWV3KCk7CisKKyAgICAgICAgLy8gTGFzdGx5LCBjYWxsIHRvIHRoZSBpY29uIHBvbGljeSB0byBpbnN0YWxsL3VwZGF0ZSBhbGwgdGhlIGljb25zLgorICAgICAgICBtSWNvblBvbGljeSA9IG5ldyBTdGF0dXNCYXJQb2xpY3kodGhpcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25EZXN0cm95KCkgeworICAgICAgICAvLyB3ZSdyZSBuZXZlciBkZXN0cm95ZWQKKyAgICB9CisKKyAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIC8vIENvbnN0cnVjdGluZyB0aGUgdmlldworICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgcHJvdGVjdGVkIFZpZXcgbWFrZVN0YXR1c0JhclZpZXcoKSB7CisgICAgICAgIGZpbmFsIENvbnRleHQgY29udGV4dCA9IHRoaXM7CisKKyAgICAgICAgUmVzb3VyY2VzIHJlcyA9IGNvbnRleHQuZ2V0UmVzb3VyY2VzKCk7CisKKyAgICAgICAgbUljb25TaXplID0gcmVzLmdldERpbWVuc2lvblBpeGVsU2l6ZShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmRpbWVuLnN0YXR1c19iYXJfaWNvbl9zaXplKTsKKworICAgICAgICBFeHBhbmRlZFZpZXcgZXhwYW5kZWQgPSAoRXhwYW5kZWRWaWV3KVZpZXcuaW5mbGF0ZShjb250ZXh0LAorICAgICAgICAgICAgICAgIFIubGF5b3V0LnN0YXR1c19iYXJfZXhwYW5kZWQsIG51bGwpOworICAgICAgICBleHBhbmRlZC5tU2VydmljZSA9IHRoaXM7CisKKyAgICAgICAgbUludHJ1ZGVyQWxlcnRWaWV3ID0gVmlldy5pbmZsYXRlKGNvbnRleHQsIFIubGF5b3V0LmludHJ1ZGVyX2FsZXJ0LCBudWxsKTsKKyAgICAgICAgbUludHJ1ZGVyQWxlcnRWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICAgICAgbUludHJ1ZGVyQWxlcnRWaWV3LnNldENsaWNrYWJsZSh0cnVlKTsKKworICAgICAgICBTdGF0dXNCYXJWaWV3IHNiID0gKFN0YXR1c0JhclZpZXcpVmlldy5pbmZsYXRlKGNvbnRleHQsIFIubGF5b3V0LnN0YXR1c19iYXIsIG51bGwpOworICAgICAgICBzYi5tU2VydmljZSA9IHRoaXM7CisKKyAgICAgICAgLy8gZmlndXJlIG91dCB3aGljaCBwaXhlbC1mb3JtYXQgdG8gdXNlIGZvciB0aGUgc3RhdHVzIGJhci4KKyAgICAgICAgbVBpeGVsRm9ybWF0ID0gUGl4ZWxGb3JtYXQuVFJBTlNMVUNFTlQ7CisgICAgICAgIERyYXdhYmxlIGJnID0gc2IuZ2V0QmFja2dyb3VuZCgpOworICAgICAgICBpZiAoYmcgIT0gbnVsbCkgeworICAgICAgICAgICAgbVBpeGVsRm9ybWF0ID0gYmcuZ2V0T3BhY2l0eSgpOworICAgICAgICB9CisKKyAgICAgICAgbVN0YXR1c0JhclZpZXcgPSBzYjsKKyAgICAgICAgbVN0YXR1c0ljb25zID0gKExpbmVhckxheW91dClzYi5maW5kVmlld0J5SWQoUi5pZC5zdGF0dXNJY29ucyk7CisgICAgICAgIG1Ob3RpZmljYXRpb25JY29ucyA9IChJY29uTWVyZ2VyKXNiLmZpbmRWaWV3QnlJZChSLmlkLm5vdGlmaWNhdGlvbkljb25zKTsKKyAgICAgICAgbUljb25zID0gKExpbmVhckxheW91dClzYi5maW5kVmlld0J5SWQoUi5pZC5pY29ucyk7CisgICAgICAgIG1UaWNrZXJWaWV3ID0gc2IuZmluZFZpZXdCeUlkKFIuaWQudGlja2VyKTsKKyAgICAgICAgbURhdGVWaWV3ID0gKERhdGVWaWV3KXNiLmZpbmRWaWV3QnlJZChSLmlkLmRhdGUpOworCisgICAgICAgIG1FeHBhbmRlZERpYWxvZyA9IG5ldyBFeHBhbmRlZERpYWxvZyhjb250ZXh0KTsKKyAgICAgICAgbUV4cGFuZGVkVmlldyA9IGV4cGFuZGVkOworICAgICAgICBtRXhwYW5kZWRDb250ZW50cyA9IGV4cGFuZGVkLmZpbmRWaWV3QnlJZChSLmlkLm5vdGlmaWNhdGlvbkxpbmVhckxheW91dCk7CisgICAgICAgIG1PbmdvaW5nVGl0bGUgPSAoVGV4dFZpZXcpZXhwYW5kZWQuZmluZFZpZXdCeUlkKFIuaWQub25nb2luZ1RpdGxlKTsKKyAgICAgICAgbU9uZ29pbmdJdGVtcyA9IChMaW5lYXJMYXlvdXQpZXhwYW5kZWQuZmluZFZpZXdCeUlkKFIuaWQub25nb2luZ0l0ZW1zKTsKKyAgICAgICAgbUxhdGVzdFRpdGxlID0gKFRleHRWaWV3KWV4cGFuZGVkLmZpbmRWaWV3QnlJZChSLmlkLmxhdGVzdFRpdGxlKTsKKyAgICAgICAgbUxhdGVzdEl0ZW1zID0gKExpbmVhckxheW91dClleHBhbmRlZC5maW5kVmlld0J5SWQoUi5pZC5sYXRlc3RJdGVtcyk7CisgICAgICAgIG1Ob05vdGlmaWNhdGlvbnNUaXRsZSA9IChUZXh0VmlldylleHBhbmRlZC5maW5kVmlld0J5SWQoUi5pZC5ub05vdGlmaWNhdGlvbnNUaXRsZSk7CisgICAgICAgIG1DbGVhckJ1dHRvbiA9IChUZXh0VmlldylleHBhbmRlZC5maW5kVmlld0J5SWQoUi5pZC5jbGVhcl9hbGxfYnV0dG9uKTsKKyAgICAgICAgbUNsZWFyQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihtQ2xlYXJCdXR0b25MaXN0ZW5lcik7CisgICAgICAgIG1TY3JvbGxWaWV3ID0gKFNjcm9sbFZpZXcpZXhwYW5kZWQuZmluZFZpZXdCeUlkKFIuaWQuc2Nyb2xsKTsKKyAgICAgICAgbU5vdGlmaWNhdGlvbkxpbmVhckxheW91dCA9IGV4cGFuZGVkLmZpbmRWaWV3QnlJZChSLmlkLm5vdGlmaWNhdGlvbkxpbmVhckxheW91dCk7CisKKyAgICAgICAgbU9uZ29pbmdUaXRsZS5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgICAgIG1MYXRlc3RUaXRsZS5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisKKyAgICAgICAgbVRpY2tlciA9IG5ldyBNeVRpY2tlcihjb250ZXh0LCBzYik7CisKKyAgICAgICAgVGlja2VyVmlldyB0aWNrZXJWaWV3ID0gKFRpY2tlclZpZXcpc2IuZmluZFZpZXdCeUlkKFIuaWQudGlja2VyVGV4dCk7CisgICAgICAgIHRpY2tlclZpZXcubVRpY2tlciA9IG1UaWNrZXI7CisKKyAgICAgICAgbVRyYWNraW5nVmlldyA9IChUcmFja2luZ1ZpZXcpVmlldy5pbmZsYXRlKGNvbnRleHQsIFIubGF5b3V0LnN0YXR1c19iYXJfdHJhY2tpbmcsIG51bGwpOworICAgICAgICBtVHJhY2tpbmdWaWV3Lm1TZXJ2aWNlID0gdGhpczsKKyAgICAgICAgbUNsb3NlVmlldyA9IChDbG9zZURyYWdIYW5kbGUpbVRyYWNraW5nVmlldy5maW5kVmlld0J5SWQoUi5pZC5jbG9zZSk7CisgICAgICAgIG1DbG9zZVZpZXcubVNlcnZpY2UgPSB0aGlzOworCisgICAgICAgIG1FZGdlQm9yZGVyID0gcmVzLmdldERpbWVuc2lvblBpeGVsU2l6ZShSLmRpbWVuLnN0YXR1c19iYXJfZWRnZV9pZ25vcmUpOworCisgICAgICAgIC8vIHRoZSBtb3JlIG5vdGlmaWNhdGlvbnMgaWNvbgorICAgICAgICBTdGF0dXNCYXJJY29uVmlldyBtb3JlVmlldyA9IG5ldyBTdGF0dXNCYXJJY29uVmlldyh0aGlzLCAibW9yZSIpOworICAgICAgICBtb3JlVmlldy5zZXQobmV3IFN0YXR1c0Jhckljb24obnVsbCwgUi5kcmF3YWJsZS5zdGF0X25vdGlmeV9tb3JlLCAwKSk7CisgICAgICAgIG1Ob3RpZmljYXRpb25JY29ucy5hZGRNb3JlVmlldyhtb3JlVmlldywKKyAgICAgICAgICAgICAgICBuZXcgTGluZWFyTGF5b3V0LkxheW91dFBhcmFtcyhtSWNvblNpemUsIG1JY29uU2l6ZSkpOworCisgICAgICAgIC8vIHNldCB0aGUgaW5pdGFsIHZpZXcgdmlzaWJpbGl0eQorICAgICAgICBzZXRBcmVUaGVyZU5vdGlmaWNhdGlvbnMoKTsKKyAgICAgICAgbURhdGVWaWV3LnNldFZpc2liaWxpdHkoVmlldy5JTlZJU0lCTEUpOworCisgICAgICAgIC8vIHJlY2VpdmUgYnJvYWRjYXN0cworICAgICAgICBJbnRlbnRGaWx0ZXIgZmlsdGVyID0gbmV3IEludGVudEZpbHRlcigpOworICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKEludGVudC5BQ1RJT05fQ09ORklHVVJBVElPTl9DSEFOR0VEKTsKKyAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihJbnRlbnQuQUNUSU9OX0NMT1NFX1NZU1RFTV9ESUFMT0dTKTsKKyAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihJbnRlbnQuQUNUSU9OX1NDUkVFTl9PRkYpOworICAgICAgICBjb250ZXh0LnJlZ2lzdGVyUmVjZWl2ZXIobUJyb2FkY2FzdFJlY2VpdmVyLCBmaWx0ZXIpOworCisgICAgICAgIHJldHVybiBzYjsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgaW50IGdldFN0YXR1c0JhckdyYXZpdHkoKSB7CisgICAgICAgIHJldHVybiBHcmF2aXR5LlRPUCB8IEdyYXZpdHkuRklMTF9IT1JJWk9OVEFMOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhZGRJbnRydWRlclZpZXcoKSB7CisgICAgICAgIGZpbmFsIFJlc291cmNlcyByZXMgPSBnZXRSZXNvdXJjZXMoKTsKKyAgICAgICAgZmluYWwgaW50IGhlaWdodD0gcmVzLmdldERpbWVuc2lvblBpeGVsU2l6ZShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmRpbWVuLnN0YXR1c19iYXJfaGVpZ2h0KTsKKworICAgICAgICBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcyBscCA9IG5ldyBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcygKKyAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCwKKyAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCwKKyAgICAgICAgICAgICAgICBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5UWVBFX1NUQVRVU19CQVJfUEFORUwsCisgICAgICAgICAgICAgICAgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19MQVlPVVRfSU5fU0NSRUVOCisgICAgICAgICAgICAgICAgICAgIHwgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19MQVlPVVRfTk9fTElNSVRTCisgICAgICAgICAgICAgICAgICAgIHwgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19OT1RfVE9VQ0hfTU9EQUwKKyAgICAgICAgICAgICAgICAgICAgfCBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX05PVF9GT0NVU0FCTEUKKyAgICAgICAgICAgICAgICAgICAgfCBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX0FMVF9GT0NVU0FCTEVfSU0sCisgICAgICAgICAgICAgICAgUGl4ZWxGb3JtYXQuVFJBTlNMVUNFTlQpOworICAgICAgICBscC5ncmF2aXR5ID0gR3Jhdml0eS5UT1AgfCBHcmF2aXR5LkZJTExfSE9SSVpPTlRBTDsKKyAgICAgICAgbHAueSArPSBoZWlnaHQgKiAxLjU7IC8vIEZJWE1FCisgICAgICAgIGxwLnNldFRpdGxlKCJJbnRydWRlckFsZXJ0Iik7CisgICAgICAgIGxwLndpbmRvd0FuaW1hdGlvbnMgPSBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlLkFuaW1hdGlvbl9TdGF0dXNCYXJfSW50cnVkZXJBbGVydDsKKworICAgICAgICBXaW5kb3dNYW5hZ2VySW1wbC5nZXREZWZhdWx0KCkuYWRkVmlldyhtSW50cnVkZXJBbGVydFZpZXcsIGxwKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRJY29uKFN0cmluZyBzbG90LCBpbnQgaW5kZXgsIGludCB2aWV3SW5kZXgsIFN0YXR1c0Jhckljb24gaWNvbikgeworICAgICAgICBpZiAoU1BFVykgU2xvZy5kKFRBRywgImFkZEljb24gc2xvdD0iICsgc2xvdCArICIgaW5kZXg9IiArIGluZGV4ICsgIiB2aWV3SW5kZXg9IiArIHZpZXdJbmRleAorICAgICAgICAgICAgICAgICsgIiBpY29uPSIgKyBpY29uKTsKKyAgICAgICAgU3RhdHVzQmFySWNvblZpZXcgdmlldyA9IG5ldyBTdGF0dXNCYXJJY29uVmlldyh0aGlzLCBzbG90KTsKKyAgICAgICAgdmlldy5zZXQoaWNvbik7CisgICAgICAgIG1TdGF0dXNJY29ucy5hZGRWaWV3KHZpZXcsIHZpZXdJbmRleCwgbmV3IExpbmVhckxheW91dC5MYXlvdXRQYXJhbXMobUljb25TaXplLCBtSWNvblNpemUpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB1cGRhdGVJY29uKFN0cmluZyBzbG90LCBpbnQgaW5kZXgsIGludCB2aWV3SW5kZXgsCisgICAgICAgICAgICBTdGF0dXNCYXJJY29uIG9sZCwgU3RhdHVzQmFySWNvbiBpY29uKSB7CisgICAgICAgIGlmIChTUEVXKSBTbG9nLmQoVEFHLCAidXBkYXRlSWNvbiBzbG90PSIgKyBzbG90ICsgIiBpbmRleD0iICsgaW5kZXggKyAiIHZpZXdJbmRleD0iICsgdmlld0luZGV4CisgICAgICAgICAgICAgICAgKyAiIG9sZD0iICsgb2xkICsgIiBpY29uPSIgKyBpY29uKTsKKyAgICAgICAgU3RhdHVzQmFySWNvblZpZXcgdmlldyA9IChTdGF0dXNCYXJJY29uVmlldyltU3RhdHVzSWNvbnMuZ2V0Q2hpbGRBdCh2aWV3SW5kZXgpOworICAgICAgICB2aWV3LnNldChpY29uKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZW1vdmVJY29uKFN0cmluZyBzbG90LCBpbnQgaW5kZXgsIGludCB2aWV3SW5kZXgpIHsKKyAgICAgICAgaWYgKFNQRVcpIFNsb2cuZChUQUcsICJyZW1vdmVJY29uIHNsb3Q9IiArIHNsb3QgKyAiIGluZGV4PSIgKyBpbmRleCArICIgdmlld0luZGV4PSIgKyB2aWV3SW5kZXgpOworICAgICAgICBtU3RhdHVzSWNvbnMucmVtb3ZlVmlld0F0KHZpZXdJbmRleCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkTm90aWZpY2F0aW9uKElCaW5kZXIga2V5LCBTdGF0dXNCYXJOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CisgICAgICAgIFN0YXR1c0Jhckljb25WaWV3IGljb25WaWV3ID0gYWRkTm90aWZpY2F0aW9uVmlld3Moa2V5LCBub3RpZmljYXRpb24pOworICAgICAgICBpZiAoaWNvblZpZXcgPT0gbnVsbCkgcmV0dXJuOworCisgICAgICAgIGJvb2xlYW4gaW1tZXJzaXZlID0gZmFsc2U7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbW1lcnNpdmUgPSBBY3Rpdml0eU1hbmFnZXJOYXRpdmUuZ2V0RGVmYXVsdCgpLmlzVG9wQWN0aXZpdHlJbW1lcnNpdmUoKTsKKyAgICAgICAgICAgIFNsb2cuZChUQUcsICJUb3AgYWN0aXZpdHkgaXMgIiArIChpbW1lcnNpdmU/ImltbWVyc2l2ZSI6Im5vdCBpbW1lcnNpdmUiKSk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgeworICAgICAgICB9CisgICAgICAgIGlmIChpbW1lcnNpdmUpIHsKKyAgICAgICAgICAgIGlmICgobm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi5mbGFncyAmIE5vdGlmaWNhdGlvbi5GTEFHX0hJR0hfUFJJT1JJVFkpICE9IDApIHsKKyAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAiUHJlc2VudGluZyBoaWdoLXByaW9yaXR5IG5vdGlmaWNhdGlvbiBpbiBpbW1lcnNpdmUgYWN0aXZpdHkiKTsKKyAgICAgICAgICAgICAgICAvLyBzcGVjaWFsIG5ldyB0cmFuc2llbnQgdGlja2VyIG1vZGUKKyAgICAgICAgICAgICAgICAvLyAxLiBQb3B1bGF0ZSBtSW50cnVkZXJBbGVydFZpZXcKKworICAgICAgICAgICAgICAgIEltYWdlVmlldyBhbGVydEljb24gPSAoSW1hZ2VWaWV3KSBtSW50cnVkZXJBbGVydFZpZXcuZmluZFZpZXdCeUlkKFIuaWQuYWxlcnRJY29uKTsKKyAgICAgICAgICAgICAgICBUZXh0VmlldyBhbGVydFRleHQgPSAoVGV4dFZpZXcpIG1JbnRydWRlckFsZXJ0Vmlldy5maW5kVmlld0J5SWQoUi5pZC5hbGVydFRleHQpOworICAgICAgICAgICAgICAgIGFsZXJ0SWNvbi5zZXRJbWFnZURyYXdhYmxlKFN0YXR1c0Jhckljb25WaWV3LmdldEljb24oCisgICAgICAgICAgICAgICAgICAgIGFsZXJ0SWNvbi5nZXRDb250ZXh0KCksCisgICAgICAgICAgICAgICAgICAgIGljb25WaWV3LmdldFN0YXR1c0Jhckljb24oKSkpOworICAgICAgICAgICAgICAgIGFsZXJ0VGV4dC5zZXRUZXh0KG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24udGlja2VyVGV4dCk7CisKKyAgICAgICAgICAgICAgICBWaWV3IGJ1dHRvbiA9IG1JbnRydWRlckFsZXJ0Vmlldy5maW5kVmlld0J5SWQoUi5pZC5pbnRydWRlcl9hbGVydF9jb250ZW50KTsKKyAgICAgICAgICAgICAgICBidXR0b24uc2V0T25DbGlja0xpc3RlbmVyKAorICAgICAgICAgICAgICAgICAgICBuZXcgTGF1bmNoZXIobm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi5jb250ZW50SW50ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uLnBrZywgbm90aWZpY2F0aW9uLnRhZywgbm90aWZpY2F0aW9uLmlkKSk7CisKKyAgICAgICAgICAgICAgICAvLyAyLiBBbmltYXRlIG1JbnRydWRlckFsZXJ0VmlldyBpbgorICAgICAgICAgICAgICAgIG1IYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2UoTVNHX1NIT1dfSU5UUlVERVIpOworCisgICAgICAgICAgICAgICAgLy8gMy4gU2V0IGFsYXJtIHRvIGFnZSB0aGUgbm90aWZpY2F0aW9uIG9mZiAoVE9ETykKKyAgICAgICAgICAgICAgICBtSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhNU0dfSElERV9JTlRSVURFUik7CisgICAgICAgICAgICAgICAgbUhhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZURlbGF5ZWQoTVNHX0hJREVfSU5UUlVERVIsIElOVFJVREVSX0FMRVJUX0RFQ0FZX01TKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLmZ1bGxTY3JlZW5JbnRlbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gbm90IGltbWVyc2l2ZSAmIGEgZnVsbC1zY3JlZW4gYWxlcnQgc2hvdWxkIGJlIHNob3duCisgICAgICAgICAgICBTbG9nLmQoVEFHLCAiTm90aWZpY2F0aW9uIGhhcyBmdWxsU2NyZWVuSW50ZW50IGFuZCBhY3Rpdml0eSBpcyBub3QgaW1tZXJzaXZlOyIKKyAgICAgICAgICAgICAgICAgICAgKyAiIHNlbmRpbmcgZnVsbFNjcmVlbkludGVudCIpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLmZ1bGxTY3JlZW5JbnRlbnQuc2VuZCgpOworICAgICAgICAgICAgfSBjYXRjaCAoUGVuZGluZ0ludGVudC5DYW5jZWxlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyB1c3VhbCBjYXNlOiBzdGF0dXMgYmFyIHZpc2libGUgJiBub3QgaW1tZXJzaXZlCisKKyAgICAgICAgICAgIC8vIHNob3cgdGhlIHRpY2tlcgorICAgICAgICAgICAgdGljayhub3RpZmljYXRpb24pOworICAgICAgICB9CisKKyAgICAgICAgLy8gUmVjYWxjdWxhdGUgdGhlIHBvc2l0aW9uIG9mIHRoZSBzbGlkaW5nIHdpbmRvd3MgYW5kIHRoZSB0aXRsZXMuCisgICAgICAgIHNldEFyZVRoZXJlTm90aWZpY2F0aW9ucygpOworICAgICAgICB1cGRhdGVFeHBhbmRlZFZpZXdQb3MoRVhQQU5ERURfTEVBVkVfQUxPTkUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHVwZGF0ZU5vdGlmaWNhdGlvbihJQmluZGVyIGtleSwgU3RhdHVzQmFyTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgeworICAgICAgICBTbG9nLmQoVEFHLCAidXBkYXRlTm90aWZpY2F0aW9uIGtleT0iICsga2V5ICsgIiBub3RpZmljYXRpb249IiArIG5vdGlmaWNhdGlvbik7CisKKyAgICAgICAgTm90aWZpY2F0aW9uRGF0YSBvbGRMaXN0OworICAgICAgICBOb3RpZmljYXRpb25EYXRhLkVudHJ5IG9sZEVudHJ5ID0gbU9uZ29pbmcuZmluZEJ5S2V5KGtleSk7CisgICAgICAgIGlmIChvbGRFbnRyeSAhPSBudWxsKSB7CisgICAgICAgICAgICBvbGRMaXN0ID0gbU9uZ29pbmc7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBvbGRFbnRyeSA9IG1MYXRlc3QuZmluZEJ5S2V5KGtleSk7CisgICAgICAgICAgICBpZiAob2xkRW50cnkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIFNsb2cudyhUQUcsICJ1cGRhdGVOb3RpZmljYXRpb24gZm9yIHVua25vd24ga2V5OiAiICsga2V5KTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvbGRMaXN0ID0gbUxhdGVzdDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBTdGF0dXNCYXJOb3RpZmljYXRpb24gb2xkTm90aWZpY2F0aW9uID0gb2xkRW50cnkubm90aWZpY2F0aW9uOworICAgICAgICBmaW5hbCBSZW1vdGVWaWV3cyBvbGRDb250ZW50VmlldyA9IG9sZE5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24uY29udGVudFZpZXc7CisKKyAgICAgICAgZmluYWwgUmVtb3RlVmlld3MgY29udGVudFZpZXcgPSBub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLmNvbnRlbnRWaWV3OworCisgICAgICAgIGlmIChmYWxzZSkgeworICAgICAgICAgICAgU2xvZy5kKFRBRywgIm9sZCBub3RpZmljYXRpb246IHdoZW49IiArIG9sZE5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24ud2hlbgorICAgICAgICAgICAgICAgICAgICArICIgb25nb2luZz0iICsgb2xkTm90aWZpY2F0aW9uLmlzT25nb2luZygpCisgICAgICAgICAgICAgICAgICAgICsgIiBleHBhbmRlZD0iICsgb2xkRW50cnkuZXhwYW5kZWQKKyAgICAgICAgICAgICAgICAgICAgKyAiIGNvbnRlbnRWaWV3PSIgKyBvbGRDb250ZW50Vmlldyk7CisgICAgICAgICAgICBTbG9nLmQoVEFHLCAibmV3IG5vdGlmaWNhdGlvbjogd2hlbj0iICsgbm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi53aGVuCisgICAgICAgICAgICAgICAgICAgICsgIiBvbmdvaW5nPSIgKyBvbGROb3RpZmljYXRpb24uaXNPbmdvaW5nKCkKKyAgICAgICAgICAgICAgICAgICAgKyAiIGNvbnRlbnRWaWV3PSIgKyBjb250ZW50Vmlldyk7CisgICAgICAgIH0KKworICAgICAgICAvLyBDYW4gd2UganVzdCByZWFwcGx5IHRoZSBSZW1vdGVWaWV3cyBpbiBwbGFjZT8gIElmIHdoZW4gZGlkbid0IGNoYW5nZSwgdGhlIG9yZGVyCisgICAgICAgIC8vIGRpZG4ndCBjaGFuZ2UuCisgICAgICAgIGlmIChub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLndoZW4gPT0gb2xkTm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi53aGVuCisgICAgICAgICAgICAgICAgJiYgbm90aWZpY2F0aW9uLmlzT25nb2luZygpID09IG9sZE5vdGlmaWNhdGlvbi5pc09uZ29pbmcoKQorICAgICAgICAgICAgICAgICYmIG9sZEVudHJ5LmV4cGFuZGVkICE9IG51bGwKKyAgICAgICAgICAgICAgICAmJiBjb250ZW50VmlldyAhPSBudWxsICYmIG9sZENvbnRlbnRWaWV3ICE9IG51bGwKKyAgICAgICAgICAgICAgICAmJiBjb250ZW50Vmlldy5nZXRQYWNrYWdlKCkgIT0gbnVsbAorICAgICAgICAgICAgICAgICYmIG9sZENvbnRlbnRWaWV3LmdldFBhY2thZ2UoKSAhPSBudWxsCisgICAgICAgICAgICAgICAgJiYgb2xkQ29udGVudFZpZXcuZ2V0UGFja2FnZSgpLmVxdWFscyhjb250ZW50Vmlldy5nZXRQYWNrYWdlKCkpCisgICAgICAgICAgICAgICAgJiYgb2xkQ29udGVudFZpZXcuZ2V0TGF5b3V0SWQoKSA9PSBjb250ZW50Vmlldy5nZXRMYXlvdXRJZCgpKSB7CisgICAgICAgICAgICBpZiAoU1BFVykgU2xvZy5kKFRBRywgInJldXNpbmcgbm90aWZpY2F0aW9uIik7CisgICAgICAgICAgICBvbGRFbnRyeS5ub3RpZmljYXRpb24gPSBub3RpZmljYXRpb247CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIC8vIFJlYXBwbHkgdGhlIFJlbW90ZVZpZXdzCisgICAgICAgICAgICAgICAgY29udGVudFZpZXcucmVhcHBseSh0aGlzLCBvbGRFbnRyeS5jb250ZW50KTsKKyAgICAgICAgICAgICAgICAvLyB1cGRhdGUgdGhlIGNvbnRlbnRJbnRlbnQKKyAgICAgICAgICAgICAgICBmaW5hbCBQZW5kaW5nSW50ZW50IGNvbnRlbnRJbnRlbnQgPSBub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLmNvbnRlbnRJbnRlbnQ7CisgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnRJbnRlbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBvbGRFbnRyeS5jb250ZW50LnNldE9uQ2xpY2tMaXN0ZW5lcihuZXcgTGF1bmNoZXIoY29udGVudEludGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uLnBrZywgbm90aWZpY2F0aW9uLnRhZywgbm90aWZpY2F0aW9uLmlkKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgaWNvbi4KKyAgICAgICAgICAgICAgICBmaW5hbCBTdGF0dXNCYXJJY29uIGljID0gbmV3IFN0YXR1c0Jhckljb24obm90aWZpY2F0aW9uLnBrZywKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24uaWNvbiwgbm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi5pY29uTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLm51bWJlcik7CisgICAgICAgICAgICAgICAgaWYgKCFvbGRFbnRyeS5pY29uLnNldChpYykpIHsKKyAgICAgICAgICAgICAgICAgICAgaGFuZGxlTm90aWZpY2F0aW9uRXJyb3Ioa2V5LCBub3RpZmljYXRpb24sICJDb3VsZG4ndCB1cGRhdGUgaWNvbjogIiArIGljKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvLyBJdCBmYWlsZWQgdG8gYWRkIGNsZWFubHkuICBMb2csIGFuZCByZW1vdmUgdGhlIHZpZXcgZnJvbSB0aGUgcGFuZWwuCisgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgIkNvdWxkbid0IHJlYXBwbHkgdmlld3MgZm9yIHBhY2thZ2UgIiArIGNvbnRlbnRWaWV3LmdldFBhY2thZ2UoKSwgZSk7CisgICAgICAgICAgICAgICAgcmVtb3ZlTm90aWZpY2F0aW9uVmlld3Moa2V5KTsKKyAgICAgICAgICAgICAgICBhZGROb3RpZmljYXRpb25WaWV3cyhrZXksIG5vdGlmaWNhdGlvbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoU1BFVykgU2xvZy5kKFRBRywgIm5vdCByZXVzaW5nIG5vdGlmaWNhdGlvbiIpOworICAgICAgICAgICAgcmVtb3ZlTm90aWZpY2F0aW9uVmlld3Moa2V5KTsKKyAgICAgICAgICAgIGFkZE5vdGlmaWNhdGlvblZpZXdzKGtleSwgbm90aWZpY2F0aW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlc3RhcnQgdGhlIHRpY2tlciBpZiBpdCdzIHN0aWxsIHJ1bm5pbmcKKyAgICAgICAgdGljayhub3RpZmljYXRpb24pOworCisgICAgICAgIC8vIFJlY2FsY3VsYXRlIHRoZSBwb3NpdGlvbiBvZiB0aGUgc2xpZGluZyB3aW5kb3dzIGFuZCB0aGUgdGl0bGVzLgorICAgICAgICBzZXRBcmVUaGVyZU5vdGlmaWNhdGlvbnMoKTsKKyAgICAgICAgdXBkYXRlRXhwYW5kZWRWaWV3UG9zKEVYUEFOREVEX0xFQVZFX0FMT05FKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZW1vdmVOb3RpZmljYXRpb24oSUJpbmRlciBrZXkpIHsKKyAgICAgICAgaWYgKFNQRVcpIFNsb2cuZChUQUcsICJyZW1vdmVOb3RpZmljYXRpb24ga2V5PSIgKyBrZXkpOworICAgICAgICBTdGF0dXNCYXJOb3RpZmljYXRpb24gb2xkID0gcmVtb3ZlTm90aWZpY2F0aW9uVmlld3Moa2V5KTsKKworICAgICAgICBpZiAob2xkICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIENhbmNlbCB0aGUgdGlja2VyIGlmIGl0J3Mgc3RpbGwgcnVubmluZworICAgICAgICAgICAgbVRpY2tlci5yZW1vdmVFbnRyeShvbGQpOworCisgICAgICAgICAgICAvLyBSZWNhbGN1bGF0ZSB0aGUgcG9zaXRpb24gb2YgdGhlIHNsaWRpbmcgd2luZG93cyBhbmQgdGhlIHRpdGxlcy4KKyAgICAgICAgICAgIHNldEFyZVRoZXJlTm90aWZpY2F0aW9ucygpOworICAgICAgICAgICAgdXBkYXRlRXhwYW5kZWRWaWV3UG9zKEVYUEFOREVEX0xFQVZFX0FMT05FKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgaW50IGNob29zZUljb25JbmRleChib29sZWFuIGlzT25nb2luZywgaW50IHZpZXdJbmRleCkgeworICAgICAgICBmaW5hbCBpbnQgbGF0ZXN0U2l6ZSA9IG1MYXRlc3Quc2l6ZSgpOworICAgICAgICBpZiAoaXNPbmdvaW5nKSB7CisgICAgICAgICAgICByZXR1cm4gbGF0ZXN0U2l6ZSArIChtT25nb2luZy5zaXplKCkgLSB2aWV3SW5kZXgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGxhdGVzdFNpemUgLSB2aWV3SW5kZXg7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBWaWV3W10gbWFrZU5vdGlmaWNhdGlvblZpZXcoU3RhdHVzQmFyTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbiwgVmlld0dyb3VwIHBhcmVudCkgeworICAgICAgICBOb3RpZmljYXRpb24gbiA9IG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb247CisgICAgICAgIFJlbW90ZVZpZXdzIHJlbW90ZVZpZXdzID0gbi5jb250ZW50VmlldzsKKyAgICAgICAgaWYgKHJlbW90ZVZpZXdzID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgLy8gY3JlYXRlIHRoZSByb3cgdmlldworICAgICAgICBMYXlvdXRJbmZsYXRlciBpbmZsYXRlciA9IChMYXlvdXRJbmZsYXRlcilnZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuTEFZT1VUX0lORkxBVEVSX1NFUlZJQ0UpOworICAgICAgICBWaWV3IHJvdyA9IGluZmxhdGVyLmluZmxhdGUoUi5sYXlvdXQuc3RhdHVzX2Jhcl9sYXRlc3RfZXZlbnQsIHBhcmVudCwgZmFsc2UpOworCisgICAgICAgIC8vIGJpbmQgdGhlIGNsaWNrIGV2ZW50IHRvIHRoZSBjb250ZW50IGFyZWEKKyAgICAgICAgVmlld0dyb3VwIGNvbnRlbnQgPSAoVmlld0dyb3VwKXJvdy5maW5kVmlld0J5SWQoUi5pZC5jb250ZW50KTsKKyAgICAgICAgY29udGVudC5zZXREZXNjZW5kYW50Rm9jdXNhYmlsaXR5KFZpZXdHcm91cC5GT0NVU19CTE9DS19ERVNDRU5EQU5UUyk7CisgICAgICAgIGNvbnRlbnQuc2V0T25Gb2N1c0NoYW5nZUxpc3RlbmVyKG1Gb2N1c0NoYW5nZUxpc3RlbmVyKTsKKyAgICAgICAgUGVuZGluZ0ludGVudCBjb250ZW50SW50ZW50ID0gbi5jb250ZW50SW50ZW50OworICAgICAgICBpZiAoY29udGVudEludGVudCAhPSBudWxsKSB7CisgICAgICAgICAgICBjb250ZW50LnNldE9uQ2xpY2tMaXN0ZW5lcihuZXcgTGF1bmNoZXIoY29udGVudEludGVudCwgbm90aWZpY2F0aW9uLnBrZywKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbi50YWcsIG5vdGlmaWNhdGlvbi5pZCkpOworICAgICAgICB9CisKKyAgICAgICAgVmlldyBleHBhbmRlZCA9IG51bGw7CisgICAgICAgIEV4Y2VwdGlvbiBleGNlcHRpb24gPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZXhwYW5kZWQgPSByZW1vdGVWaWV3cy5hcHBseSh0aGlzLCBjb250ZW50KTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBleGNlcHRpb24gPSBlOworICAgICAgICB9CisgICAgICAgIGlmIChleHBhbmRlZCA9PSBudWxsKSB7CisgICAgICAgICAgICBTdHJpbmcgaWRlbnQgPSBub3RpZmljYXRpb24ucGtnICsgIi8weCIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKG5vdGlmaWNhdGlvbi5pZCk7CisgICAgICAgICAgICBTbG9nLmUoVEFHLCAiY291bGRuJ3QgaW5mbGF0ZSB2aWV3IGZvciBub3RpZmljYXRpb24gIiArIGlkZW50LCBleGNlcHRpb24pOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb250ZW50LmFkZFZpZXcoZXhwYW5kZWQpOworICAgICAgICAgICAgcm93LnNldERyYXdpbmdDYWNoZUVuYWJsZWQodHJ1ZSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbmV3IFZpZXdbXSB7IHJvdywgY29udGVudCwgZXhwYW5kZWQgfTsKKyAgICB9CisKKyAgICBTdGF0dXNCYXJJY29uVmlldyBhZGROb3RpZmljYXRpb25WaWV3cyhJQmluZGVyIGtleSwgU3RhdHVzQmFyTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgeworICAgICAgICBOb3RpZmljYXRpb25EYXRhIGxpc3Q7CisgICAgICAgIFZpZXdHcm91cCBwYXJlbnQ7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNPbmdvaW5nID0gbm90aWZpY2F0aW9uLmlzT25nb2luZygpOworICAgICAgICBpZiAoaXNPbmdvaW5nKSB7CisgICAgICAgICAgICBsaXN0ID0gbU9uZ29pbmc7CisgICAgICAgICAgICBwYXJlbnQgPSBtT25nb2luZ0l0ZW1zOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbGlzdCA9IG1MYXRlc3Q7CisgICAgICAgICAgICBwYXJlbnQgPSBtTGF0ZXN0SXRlbXM7CisgICAgICAgIH0KKyAgICAgICAgLy8gQ29uc3RydWN0IHRoZSBleHBhbmRlZCB2aWV3LgorICAgICAgICBmaW5hbCBWaWV3W10gdmlld3MgPSBtYWtlTm90aWZpY2F0aW9uVmlldyhub3RpZmljYXRpb24sIHBhcmVudCk7CisgICAgICAgIGlmICh2aWV3cyA9PSBudWxsKSB7CisgICAgICAgICAgICBoYW5kbGVOb3RpZmljYXRpb25FcnJvcihrZXksIG5vdGlmaWNhdGlvbiwgIkNvdWxkbid0IGV4cGFuZCBSZW1vdGVWaWV3cyBmb3I6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBub3RpZmljYXRpb24pOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgVmlldyByb3cgPSB2aWV3c1swXTsKKyAgICAgICAgZmluYWwgVmlldyBjb250ZW50ID0gdmlld3NbMV07CisgICAgICAgIGZpbmFsIFZpZXcgZXhwYW5kZWQgPSB2aWV3c1syXTsKKyAgICAgICAgLy8gQ29uc3RydWN0IHRoZSBpY29uLgorICAgICAgICBmaW5hbCBTdGF0dXNCYXJJY29uVmlldyBpY29uVmlldyA9IG5ldyBTdGF0dXNCYXJJY29uVmlldyh0aGlzLAorICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbi5wa2cgKyAiLzB4IiArIEludGVnZXIudG9IZXhTdHJpbmcobm90aWZpY2F0aW9uLmlkKSk7CisgICAgICAgIGZpbmFsIFN0YXR1c0Jhckljb24gaWMgPSBuZXcgU3RhdHVzQmFySWNvbihub3RpZmljYXRpb24ucGtnLCBub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLmljb24sCisgICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24uaWNvbkxldmVsLCBub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLm51bWJlcik7CisgICAgICAgIGlmICghaWNvblZpZXcuc2V0KGljKSkgeworICAgICAgICAgICAgaGFuZGxlTm90aWZpY2F0aW9uRXJyb3Ioa2V5LCBub3RpZmljYXRpb24sICJDb3VsZGluZyBjcmVhdGUgaWNvbjogIiArIGljKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIC8vIEFkZCB0aGUgZXhwYW5kZWQgdmlldy4KKyAgICAgICAgZmluYWwgaW50IHZpZXdJbmRleCA9IGxpc3QuYWRkKGtleSwgbm90aWZpY2F0aW9uLCByb3csIGNvbnRlbnQsIGV4cGFuZGVkLCBpY29uVmlldyk7CisgICAgICAgIHBhcmVudC5hZGRWaWV3KHJvdywgdmlld0luZGV4KTsKKyAgICAgICAgLy8gQWRkIHRoZSBpY29uLgorICAgICAgICBmaW5hbCBpbnQgaWNvbkluZGV4ID0gY2hvb3NlSWNvbkluZGV4KGlzT25nb2luZywgdmlld0luZGV4KTsKKyAgICAgICAgbU5vdGlmaWNhdGlvbkljb25zLmFkZFZpZXcoaWNvblZpZXcsIGljb25JbmRleCwKKyAgICAgICAgICAgICAgICBuZXcgTGluZWFyTGF5b3V0LkxheW91dFBhcmFtcyhtSWNvblNpemUsIG1JY29uU2l6ZSkpOworICAgICAgICByZXR1cm4gaWNvblZpZXc7CisgICAgfQorCisgICAgU3RhdHVzQmFyTm90aWZpY2F0aW9uIHJlbW92ZU5vdGlmaWNhdGlvblZpZXdzKElCaW5kZXIga2V5KSB7CisgICAgICAgIE5vdGlmaWNhdGlvbkRhdGEuRW50cnkgZW50cnkgPSBtT25nb2luZy5yZW1vdmUoa2V5KTsKKyAgICAgICAgaWYgKGVudHJ5ID09IG51bGwpIHsKKyAgICAgICAgICAgIGVudHJ5ID0gbUxhdGVzdC5yZW1vdmUoa2V5KTsKKyAgICAgICAgICAgIGlmIChlbnRyeSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgInJlbW92ZU5vdGlmaWNhdGlvbiBmb3IgdW5rbm93biBrZXk6ICIgKyBrZXkpOworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIFJlbW92ZSB0aGUgZXhwYW5kZWQgdmlldy4KKyAgICAgICAgKChWaWV3R3JvdXApZW50cnkucm93LmdldFBhcmVudCgpKS5yZW1vdmVWaWV3KGVudHJ5LnJvdyk7CisgICAgICAgIC8vIFJlbW92ZSB0aGUgaWNvbi4KKyAgICAgICAgKChWaWV3R3JvdXApZW50cnkuaWNvbi5nZXRQYXJlbnQoKSkucmVtb3ZlVmlldyhlbnRyeS5pY29uKTsKKworICAgICAgICByZXR1cm4gZW50cnkubm90aWZpY2F0aW9uOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZXRBcmVUaGVyZU5vdGlmaWNhdGlvbnMoKSB7CisgICAgICAgIGJvb2xlYW4gb25nb2luZyA9IG1PbmdvaW5nLmhhc1Zpc2libGVJdGVtcygpOworICAgICAgICBib29sZWFuIGxhdGVzdCA9IG1MYXRlc3QuaGFzVmlzaWJsZUl0ZW1zKCk7CisKKyAgICAgICAgLy8gKG5vIG9uZ29pbmcgbm90aWZpY2F0aW9ucyBhcmUgY2xlYXJhYmxlKQorICAgICAgICBpZiAobUxhdGVzdC5oYXNDbGVhcmFibGVJdGVtcygpKSB7CisgICAgICAgICAgICBtQ2xlYXJCdXR0b24uc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUNsZWFyQnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5JTlZJU0lCTEUpOworICAgICAgICB9CisKKyAgICAgICAgbU9uZ29pbmdUaXRsZS5zZXRWaXNpYmlsaXR5KG9uZ29pbmcgPyBWaWV3LlZJU0lCTEUgOiBWaWV3LkdPTkUpOworICAgICAgICBtTGF0ZXN0VGl0bGUuc2V0VmlzaWJpbGl0eShsYXRlc3QgPyBWaWV3LlZJU0lCTEUgOiBWaWV3LkdPTkUpOworCisgICAgICAgIGlmIChvbmdvaW5nIHx8IGxhdGVzdCkgeworICAgICAgICAgICAgbU5vTm90aWZpY2F0aW9uc1RpdGxlLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1Ob05vdGlmaWNhdGlvbnNUaXRsZS5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFN0YXRlIGlzIG9uZSBvciBtb3JlIG9mIHRoZSBESVNBQkxFIGNvbnN0YW50cyBmcm9tIFN0YXR1c0Jhck1hbmFnZXIuCisgICAgICovCisgICAgcHVibGljIHZvaWQgZGlzYWJsZShpbnQgc3RhdGUpIHsKKyAgICAgICAgZmluYWwgaW50IG9sZCA9IG1EaXNhYmxlZDsKKyAgICAgICAgZmluYWwgaW50IGRpZmYgPSBzdGF0ZSBeIG9sZDsKKyAgICAgICAgbURpc2FibGVkID0gc3RhdGU7CisKKyAgICAgICAgaWYgKChkaWZmICYgU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX0VYUEFORCkgIT0gMCkgeworICAgICAgICAgICAgaWYgKChzdGF0ZSAmIFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9FWFBBTkQpICE9IDApIHsKKyAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAiRElTQUJMRV9FWFBBTkQ6IHllcyIpOworICAgICAgICAgICAgICAgIGFuaW1hdGVDb2xsYXBzZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICgoZGlmZiAmIFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9OT1RJRklDQVRJT05fSUNPTlMpICE9IDApIHsKKyAgICAgICAgICAgIGlmICgoc3RhdGUgJiBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfTk9USUZJQ0FUSU9OX0lDT05TKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgIkRJU0FCTEVfTk9USUZJQ0FUSU9OX0lDT05TOiB5ZXMiKTsKKyAgICAgICAgICAgICAgICBpZiAobVRpY2tpbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgbVRpY2tlci5oYWx0KCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0Tm90aWZpY2F0aW9uSWNvblZpc2liaWxpdHkoZmFsc2UsIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYW5pbS5mYWRlX291dCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAiRElTQUJMRV9OT1RJRklDQVRJT05fSUNPTlM6IG5vIik7CisgICAgICAgICAgICAgICAgaWYgKCFtRXhwYW5kZWRWaXNpYmxlKSB7CisgICAgICAgICAgICAgICAgICAgIHNldE5vdGlmaWNhdGlvbkljb25WaXNpYmlsaXR5KHRydWUsIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYW5pbS5mYWRlX2luKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoKGRpZmYgJiBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfTk9USUZJQ0FUSU9OX1RJQ0tFUikgIT0gMCkgeworICAgICAgICAgICAgaWYgKG1UaWNraW5nICYmIChzdGF0ZSAmIFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9OT1RJRklDQVRJT05fVElDS0VSKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgIkRJU0FCTEVfTk9USUZJQ0FUSU9OX1RJQ0tFUjogeWVzIik7CisgICAgICAgICAgICAgICAgbVRpY2tlci5oYWx0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBbGwgY2hhbmdlcyB0byB0aGUgc3RhdHVzIGJhciBhbmQgbm90aWZpY2F0aW9ucyBmdW5uZWwgdGhyb3VnaCBoZXJlIGFuZCBhcmUgYmF0Y2hlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGNsYXNzIEggZXh0ZW5kcyBIYW5kbGVyIHsKKyAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG0pIHsKKyAgICAgICAgICAgIHN3aXRjaCAobS53aGF0KSB7CisgICAgICAgICAgICAgICAgY2FzZSBNU0dfQU5JTUFURToKKyAgICAgICAgICAgICAgICAgICAgZG9BbmltYXRpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBNU0dfQU5JTUFURV9SRVZFQUw6CisgICAgICAgICAgICAgICAgICAgIGRvUmV2ZWFsQW5pbWF0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgTVNHX1NIT1dfSU5UUlVERVI6CisgICAgICAgICAgICAgICAgICAgIHNldEludHJ1ZGVyQWxlcnRWaXNpYmlsaXR5KHRydWUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19ISURFX0lOVFJVREVSOgorICAgICAgICAgICAgICAgICAgICBzZXRJbnRydWRlckFsZXJ0VmlzaWJpbGl0eShmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgVmlldy5PbkZvY3VzQ2hhbmdlTGlzdGVuZXIgbUZvY3VzQ2hhbmdlTGlzdGVuZXIgPSBuZXcgVmlldy5PbkZvY3VzQ2hhbmdlTGlzdGVuZXIoKSB7CisgICAgICAgIHB1YmxpYyB2b2lkIG9uRm9jdXNDaGFuZ2UoVmlldyB2LCBib29sZWFuIGhhc0ZvY3VzKSB7CisgICAgICAgICAgICAvLyBCZWNhdXNlICd2JyBpcyBhIFZpZXdHcm91cCwgYWxsIGl0cyBjaGlsZHJlbiB3aWxsIGJlICh1bilzZWxlY3RlZAorICAgICAgICAgICAgLy8gdG9vLCB3aGljaCBhbGxvd3MgbWFycXVlZWluZyB0byB3b3JrLgorICAgICAgICAgICAgdi5zZXRTZWxlY3RlZChoYXNGb2N1cyk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgcHJpdmF0ZSB2b2lkIG1ha2VFeHBhbmRlZFZpc2libGUoKSB7CisgICAgICAgIGlmIChTUEVXKSBTbG9nLmQoVEFHLCAiTWFrZSBleHBhbmRlZCB2aXNpYmxlOiBleHBhbmRlZCB2aXNpYmxlPSIgKyBtRXhwYW5kZWRWaXNpYmxlKTsKKyAgICAgICAgaWYgKG1FeHBhbmRlZFZpc2libGUpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBtRXhwYW5kZWRWaXNpYmxlID0gdHJ1ZTsKKyAgICAgICAgdmlzaWJpbGl0eUNoYW5nZWQodHJ1ZSk7CisKKyAgICAgICAgdXBkYXRlRXhwYW5kZWRWaWV3UG9zKEVYUEFOREVEX0xFQVZFX0FMT05FKTsKKyAgICAgICAgbUV4cGFuZGVkUGFyYW1zLmZsYWdzICY9IH5XaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX05PVF9GT0NVU0FCTEU7CisgICAgICAgIG1FeHBhbmRlZFBhcmFtcy5mbGFncyB8PSBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX0FMVF9GT0NVU0FCTEVfSU07CisgICAgICAgIG1FeHBhbmRlZERpYWxvZy5nZXRXaW5kb3coKS5zZXRBdHRyaWJ1dGVzKG1FeHBhbmRlZFBhcmFtcyk7CisgICAgICAgIG1FeHBhbmRlZFZpZXcucmVxdWVzdEZvY3VzKFZpZXcuRk9DVVNfRk9SV0FSRCk7CisgICAgICAgIG1UcmFja2luZ1ZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworCisgICAgICAgIGlmICghbVRpY2tpbmcpIHsKKyAgICAgICAgICAgIHNldERhdGVWaWV3VmlzaWJpbGl0eSh0cnVlLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmFuaW0uZmFkZV9pbik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhbmltYXRlRXhwYW5kKCkgeworICAgICAgICBpZiAoU1BFVykgU2xvZy5kKFRBRywgIkFuaW1hdGUgZXhwYW5kOiBleHBhbmRlZD0iICsgbUV4cGFuZGVkKTsKKyAgICAgICAgaWYgKChtRGlzYWJsZWQgJiBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfRVhQQU5EKSAhPSAwKSB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisgICAgICAgIGlmIChtRXhwYW5kZWQpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHByZXBhcmVUcmFja2luZygwLCB0cnVlKTsKKyAgICAgICAgcGVyZm9ybUZsaW5nKDAsIDIwMDAuMGYsIHRydWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFuaW1hdGVDb2xsYXBzZSgpIHsKKyAgICAgICAgaWYgKFNQRVcpIHsKKyAgICAgICAgICAgIFNsb2cuZChUQUcsICJhbmltYXRlQ29sbGFwc2UoKTogbUV4cGFuZGVkPSIgKyBtRXhwYW5kZWQKKyAgICAgICAgICAgICAgICAgICAgKyAiIG1FeHBhbmRlZFZpc2libGU9IiArIG1FeHBhbmRlZFZpc2libGUKKyAgICAgICAgICAgICAgICAgICAgKyAiIG1FeHBhbmRlZD0iICsgbUV4cGFuZGVkCisgICAgICAgICAgICAgICAgICAgICsgIiBtQW5pbWF0aW5nPSIgKyBtQW5pbWF0aW5nCisgICAgICAgICAgICAgICAgICAgICsgIiBtQW5pbVk9IiArIG1BbmltWQorICAgICAgICAgICAgICAgICAgICArICIgbUFuaW1WZWw9IiArIG1BbmltVmVsKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghbUV4cGFuZGVkVmlzaWJsZSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaW50IHk7CisgICAgICAgIGlmIChtQW5pbWF0aW5nKSB7CisgICAgICAgICAgICB5ID0gKGludCltQW5pbVk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB5ID0gbURpc3BsYXkuZ2V0SGVpZ2h0KCktMTsKKyAgICAgICAgfQorICAgICAgICAvLyBMZXQgdGhlIGZsaW5nIHRoaW5rIHRoYXQgd2UncmUgb3BlbiBzbyBpdCBnb2VzIGluIHRoZSByaWdodCBkaXJlY3Rpb24KKyAgICAgICAgLy8gYW5kIGRvZXNuJ3QgdHJ5IHRvIHJlLW9wZW4gdGhlIHdpbmRvd3NoYWRlLgorICAgICAgICBtRXhwYW5kZWQgPSB0cnVlOworICAgICAgICBwcmVwYXJlVHJhY2tpbmcoeSwgZmFsc2UpOworICAgICAgICBwZXJmb3JtRmxpbmcoeSwgLTIwMDAuMGYsIHRydWUpOworICAgIH0KKworICAgIHZvaWQgcGVyZm9ybUV4cGFuZCgpIHsKKyAgICAgICAgaWYgKFNQRVcpIFNsb2cuZChUQUcsICJwZXJmb3JtRXhwYW5kOiBtRXhwYW5kZWQ9IiArIG1FeHBhbmRlZCk7CisgICAgICAgIGlmICgobURpc2FibGVkICYgU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX0VYUEFORCkgIT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorICAgICAgICBpZiAobUV4cGFuZGVkKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBtRXhwYW5kZWQgPSB0cnVlOworICAgICAgICBtYWtlRXhwYW5kZWRWaXNpYmxlKCk7CisgICAgICAgIHVwZGF0ZUV4cGFuZGVkVmlld1BvcyhFWFBBTkRFRF9GVUxMX09QRU4pOworCisgICAgICAgIGlmIChmYWxzZSkgcG9zdFN0YXJ0VHJhY2luZygpOworICAgIH0KKworICAgIHZvaWQgcGVyZm9ybUNvbGxhcHNlKCkgeworICAgICAgICBpZiAoU1BFVykgU2xvZy5kKFRBRywgInBlcmZvcm1Db2xsYXBzZTogbUV4cGFuZGVkPSIgKyBtRXhwYW5kZWQKKyAgICAgICAgICAgICAgICArICIgbUV4cGFuZGVkVmlzaWJsZT0iICsgbUV4cGFuZGVkVmlzaWJsZSk7CisKKyAgICAgICAgaWYgKCFtRXhwYW5kZWRWaXNpYmxlKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgbUV4cGFuZGVkVmlzaWJsZSA9IGZhbHNlOworICAgICAgICB2aXNpYmlsaXR5Q2hhbmdlZChmYWxzZSk7CisgICAgICAgIG1FeHBhbmRlZFBhcmFtcy5mbGFncyB8PSBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX05PVF9GT0NVU0FCTEU7CisgICAgICAgIG1FeHBhbmRlZFBhcmFtcy5mbGFncyAmPSB+V2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19BTFRfRk9DVVNBQkxFX0lNOworICAgICAgICBtRXhwYW5kZWREaWFsb2cuZ2V0V2luZG93KCkuc2V0QXR0cmlidXRlcyhtRXhwYW5kZWRQYXJhbXMpOworICAgICAgICBtVHJhY2tpbmdWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKworICAgICAgICBpZiAoKG1EaXNhYmxlZCAmIFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9OT1RJRklDQVRJT05fSUNPTlMpID09IDApIHsKKyAgICAgICAgICAgIHNldE5vdGlmaWNhdGlvbkljb25WaXNpYmlsaXR5KHRydWUsIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYW5pbS5mYWRlX2luKTsKKyAgICAgICAgfQorICAgICAgICBzZXREYXRlVmlld1Zpc2liaWxpdHkoZmFsc2UsIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYW5pbS5mYWRlX291dCk7CisKKyAgICAgICAgaWYgKCFtRXhwYW5kZWQpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBtRXhwYW5kZWQgPSBmYWxzZTsKKyAgICB9CisKKyAgICB2b2lkIGRvQW5pbWF0aW9uKCkgeworICAgICAgICBpZiAobUFuaW1hdGluZykgeworICAgICAgICAgICAgaWYgKFNQRVcpIFNsb2cuZChUQUcsICJkb0FuaW1hdGlvbiIpOworICAgICAgICAgICAgaWYgKFNQRVcpIFNsb2cuZChUQUcsICJkb0FuaW1hdGlvbiBiZWZvcmUgbUFuaW1ZPSIgKyBtQW5pbVkpOworICAgICAgICAgICAgaW5jcmVtZW50QW5pbSgpOworICAgICAgICAgICAgaWYgKFNQRVcpIFNsb2cuZChUQUcsICJkb0FuaW1hdGlvbiBhZnRlciAgbUFuaW1ZPSIgKyBtQW5pbVkpOworICAgICAgICAgICAgaWYgKG1BbmltWSA+PSBtRGlzcGxheS5nZXRIZWlnaHQoKS0xKSB7CisgICAgICAgICAgICAgICAgaWYgKFNQRVcpIFNsb2cuZChUQUcsICJBbmltYXRpb24gY29tcGxldGVkIHRvIGV4cGFuZGVkIHN0YXRlLiIpOworICAgICAgICAgICAgICAgIG1BbmltYXRpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB1cGRhdGVFeHBhbmRlZFZpZXdQb3MoRVhQQU5ERURfRlVMTF9PUEVOKTsKKyAgICAgICAgICAgICAgICBwZXJmb3JtRXhwYW5kKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChtQW5pbVkgPCBtU3RhdHVzQmFyVmlldy5nZXRIZWlnaHQoKSkgeworICAgICAgICAgICAgICAgIGlmIChTUEVXKSBTbG9nLmQoVEFHLCAiQW5pbWF0aW9uIGNvbXBsZXRlZCB0byBjb2xsYXBzZWQgc3RhdGUuIik7CisgICAgICAgICAgICAgICAgbUFuaW1hdGluZyA9IGZhbHNlOworICAgICAgICAgICAgICAgIHVwZGF0ZUV4cGFuZGVkVmlld1BvcygwKTsKKyAgICAgICAgICAgICAgICBwZXJmb3JtQ29sbGFwc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIHVwZGF0ZUV4cGFuZGVkVmlld1BvcygoaW50KW1BbmltWSk7CisgICAgICAgICAgICAgICAgbUN1ckFuaW1hdGlvblRpbWUgKz0gQU5JTV9GUkFNRV9EVVJBVElPTjsKKyAgICAgICAgICAgICAgICBtSGFuZGxlci5zZW5kTWVzc2FnZUF0VGltZShtSGFuZGxlci5vYnRhaW5NZXNzYWdlKE1TR19BTklNQVRFKSwgbUN1ckFuaW1hdGlvblRpbWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBzdG9wVHJhY2tpbmcoKSB7CisgICAgICAgIG1UcmFja2luZyA9IGZhbHNlOworICAgICAgICBtVmVsb2NpdHlUcmFja2VyLnJlY3ljbGUoKTsKKyAgICAgICAgbVZlbG9jaXR5VHJhY2tlciA9IG51bGw7CisgICAgfQorCisgICAgdm9pZCBpbmNyZW1lbnRBbmltKCkgeworICAgICAgICBsb25nIG5vdyA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOworICAgICAgICBmbG9hdCB0ID0gKChmbG9hdCkobm93IC0gbUFuaW1MYXN0VGltZSkpIC8gMTAwMDsgICAgICAgICAgICAvLyBtcyAtPiBzCisgICAgICAgIGZpbmFsIGZsb2F0IHkgPSBtQW5pbVk7CisgICAgICAgIGZpbmFsIGZsb2F0IHYgPSBtQW5pbVZlbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHB4L3MKKyAgICAgICAgZmluYWwgZmxvYXQgYSA9IG1BbmltQWNjZWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHgvcy9zCisgICAgICAgIG1BbmltWSA9IHkgKyAodip0KSArICgwLjVmKmEqdCp0KTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHB4CisgICAgICAgIG1BbmltVmVsID0gdiArIChhKnQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHB4L3MKKyAgICAgICAgbUFuaW1MYXN0VGltZSA9IG5vdzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbXMKKyAgICAgICAgLy9TbG9nLmQoVEFHLCAieT0iICsgeSArICIgdj0iICsgdiArICIgYT0iICsgYSArICIgdD0iICsgdCArICIgbUFuaW1ZPSIgKyBtQW5pbVkKKyAgICAgICAgLy8gICAgICAgICsgIiBtQW5pbUFjY2VsPSIgKyBtQW5pbUFjY2VsKTsKKyAgICB9CisKKyAgICB2b2lkIGRvUmV2ZWFsQW5pbWF0aW9uKCkgeworICAgICAgICBmaW5hbCBpbnQgaCA9IG1DbG9zZVZpZXcuZ2V0SGVpZ2h0KCkgKyBtU3RhdHVzQmFyVmlldy5nZXRIZWlnaHQoKTsKKyAgICAgICAgaWYgKG1BbmltYXRpbmdSZXZlYWwgJiYgbUFuaW1hdGluZyAmJiBtQW5pbVkgPCBoKSB7CisgICAgICAgICAgICBpbmNyZW1lbnRBbmltKCk7CisgICAgICAgICAgICBpZiAobUFuaW1ZID49IGgpIHsKKyAgICAgICAgICAgICAgICBtQW5pbVkgPSBoOworICAgICAgICAgICAgICAgIHVwZGF0ZUV4cGFuZGVkVmlld1BvcygoaW50KW1BbmltWSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHVwZGF0ZUV4cGFuZGVkVmlld1BvcygoaW50KW1BbmltWSk7CisgICAgICAgICAgICAgICAgbUN1ckFuaW1hdGlvblRpbWUgKz0gQU5JTV9GUkFNRV9EVVJBVElPTjsKKyAgICAgICAgICAgICAgICBtSGFuZGxlci5zZW5kTWVzc2FnZUF0VGltZShtSGFuZGxlci5vYnRhaW5NZXNzYWdlKE1TR19BTklNQVRFX1JFVkVBTCksCisgICAgICAgICAgICAgICAgICAgICAgICBtQ3VyQW5pbWF0aW9uVGltZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIHByZXBhcmVUcmFja2luZyhpbnQgeSwgYm9vbGVhbiBvcGVuaW5nKSB7CisgICAgICAgIG1UcmFja2luZyA9IHRydWU7CisgICAgICAgIG1WZWxvY2l0eVRyYWNrZXIgPSBWZWxvY2l0eVRyYWNrZXIub2J0YWluKCk7CisgICAgICAgIGlmIChvcGVuaW5nKSB7CisgICAgICAgICAgICBtQW5pbUFjY2VsID0gMjAwMC4wZjsKKyAgICAgICAgICAgIG1BbmltVmVsID0gMjAwOworICAgICAgICAgICAgbUFuaW1ZID0gbVN0YXR1c0JhclZpZXcuZ2V0SGVpZ2h0KCk7CisgICAgICAgICAgICB1cGRhdGVFeHBhbmRlZFZpZXdQb3MoKGludCltQW5pbVkpOworICAgICAgICAgICAgbUFuaW1hdGluZyA9IHRydWU7CisgICAgICAgICAgICBtQW5pbWF0aW5nUmV2ZWFsID0gdHJ1ZTsKKyAgICAgICAgICAgIG1IYW5kbGVyLnJlbW92ZU1lc3NhZ2VzKE1TR19BTklNQVRFKTsKKyAgICAgICAgICAgIG1IYW5kbGVyLnJlbW92ZU1lc3NhZ2VzKE1TR19BTklNQVRFX1JFVkVBTCk7CisgICAgICAgICAgICBsb25nIG5vdyA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOworICAgICAgICAgICAgbUFuaW1MYXN0VGltZSA9IG5vdzsKKyAgICAgICAgICAgIG1DdXJBbmltYXRpb25UaW1lID0gbm93ICsgQU5JTV9GUkFNRV9EVVJBVElPTjsKKyAgICAgICAgICAgIG1BbmltYXRpbmcgPSB0cnVlOworICAgICAgICAgICAgbUhhbmRsZXIuc2VuZE1lc3NhZ2VBdFRpbWUobUhhbmRsZXIub2J0YWluTWVzc2FnZShNU0dfQU5JTUFURV9SRVZFQUwpLAorICAgICAgICAgICAgICAgICAgICBtQ3VyQW5pbWF0aW9uVGltZSk7CisgICAgICAgICAgICBtYWtlRXhwYW5kZWRWaXNpYmxlKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBpdCdzIG9wZW4sIGNsb3NlIGl0PworICAgICAgICAgICAgaWYgKG1BbmltYXRpbmcpIHsKKyAgICAgICAgICAgICAgICBtQW5pbWF0aW5nID0gZmFsc2U7CisgICAgICAgICAgICAgICAgbUhhbmRsZXIucmVtb3ZlTWVzc2FnZXMoTVNHX0FOSU1BVEUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdXBkYXRlRXhwYW5kZWRWaWV3UG9zKHkgKyBtVmlld0RlbHRhKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgcGVyZm9ybUZsaW5nKGludCB5LCBmbG9hdCB2ZWwsIGJvb2xlYW4gYWx3YXlzKSB7CisgICAgICAgIG1BbmltYXRpbmdSZXZlYWwgPSBmYWxzZTsKKyAgICAgICAgbURpc3BsYXlIZWlnaHQgPSBtRGlzcGxheS5nZXRIZWlnaHQoKTsKKworICAgICAgICBtQW5pbVkgPSB5OworICAgICAgICBtQW5pbVZlbCA9IHZlbDsKKworICAgICAgICAvL1Nsb2cuZChUQUcsICJzdGFydGluZyB3aXRoIG1BbmltWT0iICsgbUFuaW1ZICsgIiBtQW5pbVZlbD0iICsgbUFuaW1WZWwpOworCisgICAgICAgIGlmIChtRXhwYW5kZWQpIHsKKyAgICAgICAgICAgIGlmICghYWx3YXlzICYmICgKKyAgICAgICAgICAgICAgICAgICAgdmVsID4gMjAwLjBmCisgICAgICAgICAgICAgICAgICAgIHx8ICh5ID4gKG1EaXNwbGF5SGVpZ2h0LTI1KSAmJiB2ZWwgPiAtMjAwLjBmKSkpIHsKKyAgICAgICAgICAgICAgICAvLyBXZSBhcmUgZXhwYW5kZWQsIGJ1dCB0aGV5IGRpZG4ndCBtb3ZlIHN1ZmZpY2llbnRseSB0byBjYXVzZQorICAgICAgICAgICAgICAgIC8vIHVzIHRvIHJldHJhY3QuICBBbmltYXRlIGJhY2sgdG8gdGhlIGV4cGFuZGVkIHBvc2l0aW9uLgorICAgICAgICAgICAgICAgIG1BbmltQWNjZWwgPSAyMDAwLjBmOworICAgICAgICAgICAgICAgIGlmICh2ZWwgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIG1BbmltVmVsID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBXZSBhcmUgZXhwYW5kZWQgYW5kIGFyZSBub3cgZ29pbmcgdG8gYW5pbWF0ZSBhd2F5LgorICAgICAgICAgICAgICAgIG1BbmltQWNjZWwgPSAtMjAwMC4wZjsKKyAgICAgICAgICAgICAgICBpZiAodmVsID4gMCkgeworICAgICAgICAgICAgICAgICAgICBtQW5pbVZlbCA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGFsd2F5cyB8fCAoCisgICAgICAgICAgICAgICAgICAgIHZlbCA+IDIwMC4wZgorICAgICAgICAgICAgICAgICAgICB8fCAoeSA+IChtRGlzcGxheUhlaWdodC8yKSAmJiB2ZWwgPiAtMjAwLjBmKSkpIHsKKyAgICAgICAgICAgICAgICAvLyBXZSBhcmUgY29sbGFwc2VkLCBhbmQgdGhleSBtb3ZlZCBlbm91Z2ggdG8gYWxsb3cgdXMgdG8KKyAgICAgICAgICAgICAgICAvLyBleHBhbmQuICBBbmltYXRlIGluIHRoZSBub3RpZmljYXRpb25zLgorICAgICAgICAgICAgICAgIG1BbmltQWNjZWwgPSAyMDAwLjBmOworICAgICAgICAgICAgICAgIGlmICh2ZWwgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIG1BbmltVmVsID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBXZSBhcmUgY29sbGFwc2VkLCBidXQgdGhleSBkaWRuJ3QgbW92ZSBzdWZmaWNpZW50bHkgdG8gY2F1c2UKKyAgICAgICAgICAgICAgICAvLyB1cyB0byByZXRyYWN0LiAgQW5pbWF0ZSBiYWNrIHRvIHRoZSBjb2xsYXBzZWQgcG9zaXRpb24uCisgICAgICAgICAgICAgICAgbUFuaW1BY2NlbCA9IC0yMDAwLjBmOworICAgICAgICAgICAgICAgIGlmICh2ZWwgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIG1BbmltVmVsID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy9TbG9nLmQoVEFHLCAibUFuaW1ZPSIgKyBtQW5pbVkgKyAiIG1BbmltVmVsPSIgKyBtQW5pbVZlbAorICAgICAgICAvLyAgICAgICAgKyAiIG1BbmltQWNjZWw9IiArIG1BbmltQWNjZWwpOworCisgICAgICAgIGxvbmcgbm93ID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCk7CisgICAgICAgIG1BbmltTGFzdFRpbWUgPSBub3c7CisgICAgICAgIG1DdXJBbmltYXRpb25UaW1lID0gbm93ICsgQU5JTV9GUkFNRV9EVVJBVElPTjsKKyAgICAgICAgbUFuaW1hdGluZyA9IHRydWU7CisgICAgICAgIG1IYW5kbGVyLnJlbW92ZU1lc3NhZ2VzKE1TR19BTklNQVRFKTsKKyAgICAgICAgbUhhbmRsZXIucmVtb3ZlTWVzc2FnZXMoTVNHX0FOSU1BVEVfUkVWRUFMKTsKKyAgICAgICAgbUhhbmRsZXIuc2VuZE1lc3NhZ2VBdFRpbWUobUhhbmRsZXIub2J0YWluTWVzc2FnZShNU0dfQU5JTUFURSksIG1DdXJBbmltYXRpb25UaW1lKTsKKyAgICAgICAgc3RvcFRyYWNraW5nKCk7CisgICAgfQorCisgICAgYm9vbGVhbiBpbnRlcmNlcHRUb3VjaEV2ZW50KE1vdGlvbkV2ZW50IGV2ZW50KSB7CisgICAgICAgIGlmIChTUEVXKSB7CisgICAgICAgICAgICBTbG9nLmQoVEFHLCAiVG91Y2g6IHJhd1k9IiArIGV2ZW50LmdldFJhd1koKSArICIgZXZlbnQ9IiArIGV2ZW50ICsgIiBtRGlzYWJsZWQ9IgorICAgICAgICAgICAgICAgICsgbURpc2FibGVkKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgobURpc2FibGVkICYgU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX0VYUEFORCkgIT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgaW50IHN0YXR1c0JhclNpemUgPSBtU3RhdHVzQmFyVmlldy5nZXRIZWlnaHQoKTsKKyAgICAgICAgZmluYWwgaW50IGhpdFNpemUgPSBzdGF0dXNCYXJTaXplKjI7CisgICAgICAgIGlmIChldmVudC5nZXRBY3Rpb24oKSA9PSBNb3Rpb25FdmVudC5BQ1RJT05fRE9XTikgeworICAgICAgICAgICAgZmluYWwgaW50IHkgPSAoaW50KWV2ZW50LmdldFJhd1koKTsKKworICAgICAgICAgICAgaWYgKCFtRXhwYW5kZWQpIHsKKyAgICAgICAgICAgICAgICBtVmlld0RlbHRhID0gc3RhdHVzQmFyU2l6ZSAtIHk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1UcmFja2luZ1ZpZXcuZ2V0TG9jYXRpb25PblNjcmVlbihtQWJzUG9zKTsKKyAgICAgICAgICAgICAgICBtVmlld0RlbHRhID0gbUFic1Bvc1sxXSArIG1UcmFja2luZ1ZpZXcuZ2V0SGVpZ2h0KCkgLSB5OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCghbUV4cGFuZGVkICYmIHkgPCBoaXRTaXplKSB8fAorICAgICAgICAgICAgICAgICAgICAobUV4cGFuZGVkICYmIHkgPiAobURpc3BsYXkuZ2V0SGVpZ2h0KCktaGl0U2l6ZSkpKSB7CisKKyAgICAgICAgICAgICAgICAvLyBXZSBkcm9wIGV2ZW50cyBhdCB0aGUgZWRnZSBvZiB0aGUgc2NyZWVuIHRvIG1ha2UgdGhlIHdpbmRvd3NoYWRlIGNvbWUKKyAgICAgICAgICAgICAgICAvLyBkb3duIGJ5IGFjY2lkZW50IGxlc3MsIGVzcGVjaWFsbHkgd2hlbiBwdXNoaW5nIG9wZW4gYSBkZXZpY2Ugd2l0aCBhIGtleWJvYXJkCisgICAgICAgICAgICAgICAgLy8gdGhhdCByb3RhdGVzIChsaWtlIGcxIGFuZCBkcm9pZCkKKyAgICAgICAgICAgICAgICBpbnQgeCA9IChpbnQpZXZlbnQuZ2V0UmF3WCgpOworICAgICAgICAgICAgICAgIGZpbmFsIGludCBlZGdlQm9yZGVyID0gbUVkZ2VCb3JkZXI7CisgICAgICAgICAgICAgICAgaWYgKHggPj0gZWRnZUJvcmRlciAmJiB4IDwgbURpc3BsYXkuZ2V0V2lkdGgoKSAtIGVkZ2VCb3JkZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJlcGFyZVRyYWNraW5nKHksICFtRXhwYW5kZWQpOy8vIG9wZW5pbmcgaWYgd2UncmUgbm90IGFscmVhZHkgZnVsbHkgdmlzaWJsZQorICAgICAgICAgICAgICAgICAgICBtVmVsb2NpdHlUcmFja2VyLmFkZE1vdmVtZW50KGV2ZW50KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAobVRyYWNraW5nKSB7CisgICAgICAgICAgICBtVmVsb2NpdHlUcmFja2VyLmFkZE1vdmVtZW50KGV2ZW50KTsKKyAgICAgICAgICAgIGZpbmFsIGludCBtaW5ZID0gc3RhdHVzQmFyU2l6ZSArIG1DbG9zZVZpZXcuZ2V0SGVpZ2h0KCk7CisgICAgICAgICAgICBpZiAoZXZlbnQuZ2V0QWN0aW9uKCkgPT0gTW90aW9uRXZlbnQuQUNUSU9OX01PVkUpIHsKKyAgICAgICAgICAgICAgICBpbnQgeSA9IChpbnQpZXZlbnQuZ2V0UmF3WSgpOworICAgICAgICAgICAgICAgIGlmIChtQW5pbWF0aW5nUmV2ZWFsICYmIHkgPCBtaW5ZKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIG5vdGhpbmcKKyAgICAgICAgICAgICAgICB9IGVsc2UgIHsKKyAgICAgICAgICAgICAgICAgICAgbUFuaW1hdGluZ1JldmVhbCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICB1cGRhdGVFeHBhbmRlZFZpZXdQb3MoeSArIG1WaWV3RGVsdGEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQuZ2V0QWN0aW9uKCkgPT0gTW90aW9uRXZlbnQuQUNUSU9OX1VQKSB7CisgICAgICAgICAgICAgICAgbVZlbG9jaXR5VHJhY2tlci5jb21wdXRlQ3VycmVudFZlbG9jaXR5KDEwMDApOworCisgICAgICAgICAgICAgICAgZmxvYXQgeVZlbCA9IG1WZWxvY2l0eVRyYWNrZXIuZ2V0WVZlbG9jaXR5KCk7CisgICAgICAgICAgICAgICAgYm9vbGVhbiBuZWdhdGl2ZSA9IHlWZWwgPCAwOworCisgICAgICAgICAgICAgICAgZmxvYXQgeFZlbCA9IG1WZWxvY2l0eVRyYWNrZXIuZ2V0WFZlbG9jaXR5KCk7CisgICAgICAgICAgICAgICAgaWYgKHhWZWwgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIHhWZWwgPSAteFZlbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHhWZWwgPiAxNTAuMGYpIHsKKyAgICAgICAgICAgICAgICAgICAgeFZlbCA9IDE1MC4wZjsgLy8gbGltaXQgaG93IG11Y2ggd2UgY2FyZSBhYm91dCB0aGUgeCBheGlzCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZmxvYXQgdmVsID0gKGZsb2F0KU1hdGguaHlwb3QoeVZlbCwgeFZlbCk7CisgICAgICAgICAgICAgICAgaWYgKG5lZ2F0aXZlKSB7CisgICAgICAgICAgICAgICAgICAgIHZlbCA9IC12ZWw7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcGVyZm9ybUZsaW5nKChpbnQpZXZlbnQuZ2V0UmF3WSgpLCB2ZWwsIGZhbHNlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIExhdW5jaGVyIGltcGxlbWVudHMgVmlldy5PbkNsaWNrTGlzdGVuZXIgeworICAgICAgICBwcml2YXRlIFBlbmRpbmdJbnRlbnQgbUludGVudDsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbVBrZzsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbVRhZzsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbUlkOworCisgICAgICAgIExhdW5jaGVyKFBlbmRpbmdJbnRlbnQgaW50ZW50LCBTdHJpbmcgcGtnLCBTdHJpbmcgdGFnLCBpbnQgaWQpIHsKKyAgICAgICAgICAgIG1JbnRlbnQgPSBpbnRlbnQ7CisgICAgICAgICAgICBtUGtnID0gcGtnOworICAgICAgICAgICAgbVRhZyA9IHRhZzsKKyAgICAgICAgICAgIG1JZCA9IGlkOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgLy8gVGhlIGludGVudCB3ZSBhcmUgc2VuZGluZyBpcyBmb3IgdGhlIGFwcGxpY2F0aW9uLCB3aGljaAorICAgICAgICAgICAgICAgIC8vIHdvbid0IGhhdmUgcGVybWlzc2lvbiB0byBpbW1lZGlhdGVseSBzdGFydCBhbiBhY3Rpdml0eSBhZnRlcgorICAgICAgICAgICAgICAgIC8vIHRoZSB1c2VyIHN3aXRjaGVzIHRvIGhvbWUuICBXZSBrbm93IGl0IGlzIHNhZmUgdG8gZG8gYXQgdGhpcworICAgICAgICAgICAgICAgIC8vIHBvaW50LCBzbyBtYWtlIHN1cmUgbmV3IGFjdGl2aXR5IHN3aXRjaGVzIGFyZSBub3cgYWxsb3dlZC4KKyAgICAgICAgICAgICAgICBBY3Rpdml0eU1hbmFnZXJOYXRpdmUuZ2V0RGVmYXVsdCgpLnJlc3VtZUFwcFN3aXRjaGVzKCk7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobUludGVudCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaW50W10gcG9zID0gbmV3IGludFsyXTsKKyAgICAgICAgICAgICAgICB2LmdldExvY2F0aW9uT25TY3JlZW4ocG9zKTsKKyAgICAgICAgICAgICAgICBJbnRlbnQgb3ZlcmxheSA9IG5ldyBJbnRlbnQoKTsKKyAgICAgICAgICAgICAgICBvdmVybGF5LnNldFNvdXJjZUJvdW5kcygKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBSZWN0KHBvc1swXSwgcG9zWzFdLCBwb3NbMF0rdi5nZXRXaWR0aCgpLCBwb3NbMV0rdi5nZXRIZWlnaHQoKSkpOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIG1JbnRlbnQuc2VuZChQaG9uZVN0YXR1c0JhclNlcnZpY2UudGhpcywgMCwgb3ZlcmxheSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoUGVuZGluZ0ludGVudC5DYW5jZWxlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzdGFjayB0cmFjZSBpc24ndCB2ZXJ5IGhlbHBmdWwgaGVyZS4gIEp1c3QgbG9nIHRoZSBleGNlcHRpb24gbWVzc2FnZS4KKyAgICAgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgIlNlbmRpbmcgY29udGVudEludGVudCBmYWlsZWQ6ICIgKyBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbUJhclNlcnZpY2Uub25Ob3RpZmljYXRpb25DbGljayhtUGtnLCBtVGFnLCBtSWQpOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgLy8gc3lzdGVtIHByb2Nlc3MgaXMgZGVhZCBpZiB3ZSdyZSBoZXJlLgorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBjbG9zZSB0aGUgc2hhZGUgaWYgaXQgd2FzIG9wZW4KKyAgICAgICAgICAgIGFuaW1hdGVDb2xsYXBzZSgpOworCisgICAgICAgICAgICAvLyBJZiB0aGlzIGNsaWNrIHdhcyBvbiB0aGUgaW50cnVkZXIgYWxlcnQsIGhpZGUgdGhhdCBpbnN0ZWFkCisgICAgICAgICAgICBtSGFuZGxlci5zZW5kRW1wdHlNZXNzYWdlKE1TR19ISURFX0lOVFJVREVSKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0aWNrKFN0YXR1c0Jhck5vdGlmaWNhdGlvbiBuKSB7CisgICAgICAgIC8vIFNob3cgdGhlIHRpY2tlciBpZiBvbmUgaXMgcmVxdWVzdGVkLiBBbHNvIGRvbid0IGRvIHRoaXMKKyAgICAgICAgLy8gdW50aWwgc3RhdHVzIGJhciB3aW5kb3cgaXMgYXR0YWNoZWQgdG8gdGhlIHdpbmRvdyBtYW5hZ2VyLAorICAgICAgICAvLyBiZWNhdXNlLi4uICB3ZWxsLCB3aGF0J3MgdGhlIHBvaW50IG90aGVyd2lzZT8gIEFuZCB0cnlpbmcgdG8KKyAgICAgICAgLy8gcnVuIGEgdGlja2VyIHdpdGhvdXQgYmVpbmcgYXR0YWNoZWQgd2lsbCBjcmFzaCEKKyAgICAgICAgaWYgKG4ubm90aWZpY2F0aW9uLnRpY2tlclRleHQgIT0gbnVsbCAmJiBtU3RhdHVzQmFyVmlldy5nZXRXaW5kb3dUb2tlbigpICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmICgwID09IChtRGlzYWJsZWQgJiAoU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX05PVElGSUNBVElPTl9JQ09OUworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX05PVElGSUNBVElPTl9USUNLRVIpKSkgeworICAgICAgICAgICAgICAgIG1UaWNrZXIuYWRkRW50cnkobik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYW5jZWwgdGhpcyBub3RpZmljYXRpb24gYW5kIHRlbGwgdGhlIFN0YXR1c0Jhck1hbmFnZXJTZXJ2aWNlIC8gTm90aWZpY2F0aW9uTWFuYWdlclNlcnZpY2UKKyAgICAgKiBhYm91dCB0aGUgZmFpbHVyZS4KKyAgICAgKgorICAgICAqIFdBUk5JTkc6IHRoaXMgd2lsbCBjYWxsIGJhY2sgaW50byB1cy4gIERvbid0IGhvbGQgYW55IGxvY2tzLgorICAgICAqLworICAgIHZvaWQgaGFuZGxlTm90aWZpY2F0aW9uRXJyb3IoSUJpbmRlciBrZXksIFN0YXR1c0Jhck5vdGlmaWNhdGlvbiBuLCBTdHJpbmcgbWVzc2FnZSkgeworICAgICAgICByZW1vdmVOb3RpZmljYXRpb24oa2V5KTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1CYXJTZXJ2aWNlLm9uTm90aWZpY2F0aW9uRXJyb3Iobi5wa2csIG4udGFnLCBuLmlkLCBuLnVpZCwgbi5pbml0aWFsUGlkLCBtZXNzYWdlKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAvLyBUaGUgZW5kIGlzIG5pZ2guCisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIE15VGlja2VyIGV4dGVuZHMgVGlja2VyIHsKKyAgICAgICAgTXlUaWNrZXIoQ29udGV4dCBjb250ZXh0LCBWaWV3IHNiKSB7CisgICAgICAgICAgICBzdXBlcihjb250ZXh0LCBzYik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgdGlja2VyU3RhcnRpbmcoKSB7CisgICAgICAgICAgICBtVGlja2luZyA9IHRydWU7CisgICAgICAgICAgICBtSWNvbnMuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworICAgICAgICAgICAgbVRpY2tlclZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICAgICAgbVRpY2tlclZpZXcuc3RhcnRBbmltYXRpb24obG9hZEFuaW0oY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hbmltLnB1c2hfdXBfaW4sIG51bGwpKTsKKyAgICAgICAgICAgIG1JY29ucy5zdGFydEFuaW1hdGlvbihsb2FkQW5pbShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmFuaW0ucHVzaF91cF9vdXQsIG51bGwpKTsKKyAgICAgICAgICAgIGlmIChtRXhwYW5kZWRWaXNpYmxlKSB7CisgICAgICAgICAgICAgICAgc2V0RGF0ZVZpZXdWaXNpYmlsaXR5KGZhbHNlLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmFuaW0ucHVzaF91cF9vdXQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHRpY2tlckRvbmUoKSB7CisgICAgICAgICAgICBtSWNvbnMuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICAgICAgbVRpY2tlclZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworICAgICAgICAgICAgbUljb25zLnN0YXJ0QW5pbWF0aW9uKGxvYWRBbmltKGNvbS5hbmRyb2lkLmludGVybmFsLlIuYW5pbS5wdXNoX2Rvd25faW4sIG51bGwpKTsKKyAgICAgICAgICAgIG1UaWNrZXJWaWV3LnN0YXJ0QW5pbWF0aW9uKGxvYWRBbmltKGNvbS5hbmRyb2lkLmludGVybmFsLlIuYW5pbS5wdXNoX2Rvd25fb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgbVRpY2tpbmdEb25lTGlzdGVuZXIpKTsKKyAgICAgICAgICAgIGlmIChtRXhwYW5kZWRWaXNpYmxlKSB7CisgICAgICAgICAgICAgICAgc2V0RGF0ZVZpZXdWaXNpYmlsaXR5KHRydWUsIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYW5pbS5wdXNoX2Rvd25faW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdGlja2VySGFsdGluZygpIHsKKyAgICAgICAgICAgIG1JY29ucy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgICAgICBtVGlja2VyVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgICAgICAgICBtSWNvbnMuc3RhcnRBbmltYXRpb24obG9hZEFuaW0oY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hbmltLmZhZGVfaW4sIG51bGwpKTsKKyAgICAgICAgICAgIG1UaWNrZXJWaWV3LnN0YXJ0QW5pbWF0aW9uKGxvYWRBbmltKGNvbS5hbmRyb2lkLmludGVybmFsLlIuYW5pbS5mYWRlX291dCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1UaWNraW5nRG9uZUxpc3RlbmVyKSk7CisgICAgICAgICAgICBpZiAobUV4cGFuZGVkVmlzaWJsZSkgeworICAgICAgICAgICAgICAgIHNldERhdGVWaWV3VmlzaWJpbGl0eSh0cnVlLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmFuaW0uZmFkZV9pbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBBbmltYXRpb24uQW5pbWF0aW9uTGlzdGVuZXIgbVRpY2tpbmdEb25lTGlzdGVuZXIgPSBuZXcgQW5pbWF0aW9uLkFuaW1hdGlvbkxpc3RlbmVyKCkgezsKKyAgICAgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25FbmQoQW5pbWF0aW9uIGFuaW1hdGlvbikgeworICAgICAgICAgICAgbVRpY2tpbmcgPSBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvblJlcGVhdChBbmltYXRpb24gYW5pbWF0aW9uKSB7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25TdGFydChBbmltYXRpb24gYW5pbWF0aW9uKSB7CisgICAgICAgIH0KKyAgICB9OworCisgICAgcHJpdmF0ZSBBbmltYXRpb24gbG9hZEFuaW0oaW50IGlkLCBBbmltYXRpb24uQW5pbWF0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgQW5pbWF0aW9uIGFuaW0gPSBBbmltYXRpb25VdGlscy5sb2FkQW5pbWF0aW9uKFBob25lU3RhdHVzQmFyU2VydmljZS50aGlzLCBpZCk7CisgICAgICAgIGlmIChsaXN0ZW5lciAhPSBudWxsKSB7CisgICAgICAgICAgICBhbmltLnNldEFuaW1hdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYW5pbTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHZpZXdJbmZvKFZpZXcgdikgeworICAgICAgICByZXR1cm4gIigiICsgdi5nZXRMZWZ0KCkgKyAiLCIgKyB2LmdldFRvcCgpICsgIikoIiArIHYuZ2V0UmlnaHQoKSArICIsIiArIHYuZ2V0Qm90dG9tKCkKKyAgICAgICAgICAgICAgICArICIgIiArIHYuZ2V0V2lkdGgoKSArICJ4IiArIHYuZ2V0SGVpZ2h0KCkgKyAiKSI7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgZHVtcChGaWxlRGVzY3JpcHRvciBmZCwgUHJpbnRXcml0ZXIgcHcsIFN0cmluZ1tdIGFyZ3MpIHsKKyAgICAgICAgaWYgKGNoZWNrQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkRVTVApCisgICAgICAgICAgICAgICAgIT0gUGFja2FnZU1hbmFnZXIuUEVSTUlTU0lPTl9HUkFOVEVEKSB7CisgICAgICAgICAgICBwdy5wcmludGxuKCJQZXJtaXNzaW9uIERlbmlhbDogY2FuJ3QgZHVtcCBTdGF0dXNCYXIgZnJvbSBmcm9tIHBpZD0iCisgICAgICAgICAgICAgICAgICAgICsgQmluZGVyLmdldENhbGxpbmdQaWQoKQorICAgICAgICAgICAgICAgICAgICArICIsIHVpZD0iICsgQmluZGVyLmdldENhbGxpbmdVaWQoKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBzeW5jaHJvbml6ZWQgKG1RdWV1ZUxvY2spIHsKKyAgICAgICAgICAgIHB3LnByaW50bG4oIkN1cnJlbnQgU3RhdHVzIEJhciBzdGF0ZToiKTsKKyAgICAgICAgICAgIHB3LnByaW50bG4oIiAgbUV4cGFuZGVkPSIgKyBtRXhwYW5kZWQKKyAgICAgICAgICAgICAgICAgICAgKyAiLCBtRXhwYW5kZWRWaXNpYmxlPSIgKyBtRXhwYW5kZWRWaXNpYmxlKTsKKyAgICAgICAgICAgIHB3LnByaW50bG4oIiAgbVRpY2tpbmc9IiArIG1UaWNraW5nKTsKKyAgICAgICAgICAgIHB3LnByaW50bG4oIiAgbVRyYWNraW5nPSIgKyBtVHJhY2tpbmcpOworICAgICAgICAgICAgcHcucHJpbnRsbigiICBtQW5pbWF0aW5nPSIgKyBtQW5pbWF0aW5nCisgICAgICAgICAgICAgICAgICAgICsgIiwgbUFuaW1ZPSIgKyBtQW5pbVkgKyAiLCBtQW5pbVZlbD0iICsgbUFuaW1WZWwKKyAgICAgICAgICAgICAgICAgICAgKyAiLCBtQW5pbUFjY2VsPSIgKyBtQW5pbUFjY2VsKTsKKyAgICAgICAgICAgIHB3LnByaW50bG4oIiAgbUN1ckFuaW1hdGlvblRpbWU9IiArIG1DdXJBbmltYXRpb25UaW1lCisgICAgICAgICAgICAgICAgICAgICsgIiBtQW5pbUxhc3RUaW1lPSIgKyBtQW5pbUxhc3RUaW1lKTsKKyAgICAgICAgICAgIHB3LnByaW50bG4oIiAgbURpc3BsYXlIZWlnaHQ9IiArIG1EaXNwbGF5SGVpZ2h0CisgICAgICAgICAgICAgICAgICAgICsgIiBtQW5pbWF0aW5nUmV2ZWFsPSIgKyBtQW5pbWF0aW5nUmV2ZWFsCisgICAgICAgICAgICAgICAgICAgICsgIiBtVmlld0RlbHRhPSIgKyBtVmlld0RlbHRhKTsKKyAgICAgICAgICAgIHB3LnByaW50bG4oIiAgbURpc3BsYXlIZWlnaHQ9IiArIG1EaXNwbGF5SGVpZ2h0KTsKKyAgICAgICAgICAgIHB3LnByaW50bG4oIiAgbUV4cGFuZGVkUGFyYW1zOiAiICsgbUV4cGFuZGVkUGFyYW1zKTsKKyAgICAgICAgICAgIHB3LnByaW50bG4oIiAgbUV4cGFuZGVkVmlldzogIiArIHZpZXdJbmZvKG1FeHBhbmRlZFZpZXcpKTsKKyAgICAgICAgICAgIHB3LnByaW50bG4oIiAgbUV4cGFuZGVkRGlhbG9nOiAiICsgbUV4cGFuZGVkRGlhbG9nKTsKKyAgICAgICAgICAgIHB3LnByaW50bG4oIiAgbVRyYWNraW5nUGFyYW1zOiAiICsgbVRyYWNraW5nUGFyYW1zKTsKKyAgICAgICAgICAgIHB3LnByaW50bG4oIiAgbVRyYWNraW5nVmlldzogIiArIHZpZXdJbmZvKG1UcmFja2luZ1ZpZXcpKTsKKyAgICAgICAgICAgIHB3LnByaW50bG4oIiAgbU9uZ29pbmdUaXRsZTogIiArIHZpZXdJbmZvKG1PbmdvaW5nVGl0bGUpKTsKKyAgICAgICAgICAgIHB3LnByaW50bG4oIiAgbU9uZ29pbmdJdGVtczogIiArIHZpZXdJbmZvKG1PbmdvaW5nSXRlbXMpKTsKKyAgICAgICAgICAgIHB3LnByaW50bG4oIiAgbUxhdGVzdFRpdGxlOiAiICsgdmlld0luZm8obUxhdGVzdFRpdGxlKSk7CisgICAgICAgICAgICBwdy5wcmludGxuKCIgIG1MYXRlc3RJdGVtczogIiArIHZpZXdJbmZvKG1MYXRlc3RJdGVtcykpOworICAgICAgICAgICAgcHcucHJpbnRsbigiICBtTm9Ob3RpZmljYXRpb25zVGl0bGU6ICIgKyB2aWV3SW5mbyhtTm9Ob3RpZmljYXRpb25zVGl0bGUpKTsKKyAgICAgICAgICAgIHB3LnByaW50bG4oIiAgbUNsb3NlVmlldzogIiArIHZpZXdJbmZvKG1DbG9zZVZpZXcpKTsKKyAgICAgICAgICAgIHB3LnByaW50bG4oIiAgbVRpY2tlclZpZXc6ICIgKyB2aWV3SW5mbyhtVGlja2VyVmlldykpOworICAgICAgICAgICAgcHcucHJpbnRsbigiICBtU2Nyb2xsVmlldzogIiArIHZpZXdJbmZvKG1TY3JvbGxWaWV3KQorICAgICAgICAgICAgICAgICAgICArICIgc2Nyb2xsICIgKyBtU2Nyb2xsVmlldy5nZXRTY3JvbGxYKCkgKyAiLCIgKyBtU2Nyb2xsVmlldy5nZXRTY3JvbGxZKCkpOworICAgICAgICAgICAgcHcucHJpbnRsbigibU5vdGlmaWNhdGlvbkxpbmVhckxheW91dDogIiArIHZpZXdJbmZvKG1Ob3RpZmljYXRpb25MaW5lYXJMYXlvdXQpKTsKKyAgICAgICAgfQorICAgICAgICAvKgorICAgICAgICBzeW5jaHJvbml6ZWQgKG1Ob3RpZmljYXRpb25EYXRhKSB7CisgICAgICAgICAgICBpbnQgTiA9IG1Ob3RpZmljYXRpb25EYXRhLm9uZ29pbmdDb3VudCgpOworICAgICAgICAgICAgcHcucHJpbnRsbigiICBvbmdvaW5nQ291bnQuc2l6ZT0iICsgTik7CisgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8TjsgaSsrKSB7CisgICAgICAgICAgICAgICAgU3RhdHVzQmFyTm90aWZpY2F0aW9uIG4gPSBtTm90aWZpY2F0aW9uRGF0YS5nZXRPbmdvaW5nKGkpOworICAgICAgICAgICAgICAgIHB3LnByaW50bG4oIiAgICBbIiArIGkgKyAiXSBrZXk9IiArIG4ua2V5ICsgIiB2aWV3PSIgKyBuLnZpZXcpOworICAgICAgICAgICAgICAgIHB3LnByaW50bG4oIiAgICAgICAgICAgZGF0YT0iICsgbi5kYXRhKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIE4gPSBtTm90aWZpY2F0aW9uRGF0YS5sYXRlc3RDb3VudCgpOworICAgICAgICAgICAgcHcucHJpbnRsbigiICBvbmdvaW5nQ291bnQuc2l6ZT0iICsgTik7CisgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8TjsgaSsrKSB7CisgICAgICAgICAgICAgICAgU3RhdHVzQmFyTm90aWZpY2F0aW9uIG4gPSBtTm90aWZpY2F0aW9uRGF0YS5nZXRMYXRlc3QoaSk7CisgICAgICAgICAgICAgICAgcHcucHJpbnRsbigiICAgIFsiICsgaSArICJdIGtleT0iICsgbi5rZXkgKyAiIHZpZXc9IiArIG4udmlldyk7CisgICAgICAgICAgICAgICAgcHcucHJpbnRsbigiICAgICAgICAgICBkYXRhPSIgKyBuLmRhdGEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICovCisKKyAgICAgICAgaWYgKGZhbHNlKSB7CisgICAgICAgICAgICBwdy5wcmludGxuKCJzZWUgdGhlIGxvZ2NhdCBmb3IgYSBkdW1wIG9mIHRoZSB2aWV3cyB3ZSBoYXZlIGNyZWF0ZWQuIik7CisgICAgICAgICAgICAvLyBtdXN0IGhhcHBlbiBvbiB1aSB0aHJlYWQKKyAgICAgICAgICAgIG1IYW5kbGVyLnBvc3QobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtU3RhdHVzQmFyVmlldy5nZXRMb2NhdGlvbk9uU2NyZWVuKG1BYnNQb3MpOworICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgIm1TdGF0dXNCYXJWaWV3OiAtLS0tLSAoIiArIG1BYnNQb3NbMF0gKyAiLCIgKyBtQWJzUG9zWzFdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIikgIiArIG1TdGF0dXNCYXJWaWV3LmdldFdpZHRoKCkgKyAieCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtU3RhdHVzQmFyVmlldy5nZXRIZWlnaHQoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtU3RhdHVzQmFyVmlldy5kZWJ1ZygpOworCisgICAgICAgICAgICAgICAgICAgICAgICBtRXhwYW5kZWRWaWV3LmdldExvY2F0aW9uT25TY3JlZW4obUFic1Bvcyk7CisgICAgICAgICAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAibUV4cGFuZGVkVmlldzogLS0tLS0gKCIgKyBtQWJzUG9zWzBdICsgIiwiICsgbUFic1Bvc1sxXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIpICIgKyBtRXhwYW5kZWRWaWV3LmdldFdpZHRoKCkgKyAieCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtRXhwYW5kZWRWaWV3LmdldEhlaWdodCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1FeHBhbmRlZFZpZXcuZGVidWcoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgbVRyYWNraW5nVmlldy5nZXRMb2NhdGlvbk9uU2NyZWVuKG1BYnNQb3MpOworICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgIm1UcmFja2luZ1ZpZXc6IC0tLS0tICgiICsgbUFic1Bvc1swXSArICIsIiArIG1BYnNQb3NbMV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiKSAiICsgbVRyYWNraW5nVmlldy5nZXRXaWR0aCgpICsgIngiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbVRyYWNraW5nVmlldy5nZXRIZWlnaHQoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtVHJhY2tpbmdWaWV3LmRlYnVnKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgb25CYXJWaWV3QXR0YWNoZWQoKSB7CisgICAgICAgIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zIGxwOworICAgICAgICBpbnQgcGl4ZWxGb3JtYXQ7CisgICAgICAgIERyYXdhYmxlIGJnOworCisgICAgICAgIC8vLyAtLS0tLS0tLS0tIFRyYWNraW5nIFZpZXcgLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgcGl4ZWxGb3JtYXQgPSBQaXhlbEZvcm1hdC5SR0JYXzg4ODg7CisgICAgICAgIGJnID0gbVRyYWNraW5nVmlldy5nZXRCYWNrZ3JvdW5kKCk7CisgICAgICAgIGlmIChiZyAhPSBudWxsKSB7CisgICAgICAgICAgICBwaXhlbEZvcm1hdCA9IGJnLmdldE9wYWNpdHkoKTsKKyAgICAgICAgfQorCisgICAgICAgIGxwID0gbmV3IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zKAorICAgICAgICAgICAgICAgIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5ULAorICAgICAgICAgICAgICAgIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5ULAorICAgICAgICAgICAgICAgIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLlRZUEVfU1RBVFVTX0JBUl9QQU5FTCwKKyAgICAgICAgICAgICAgICBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX0xBWU9VVF9JTl9TQ1JFRU4KKyAgICAgICAgICAgICAgICB8IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfTEFZT1VUX05PX0xJTUlUUworICAgICAgICAgICAgICAgIHwgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19BTFRfRk9DVVNBQkxFX0lNLAorICAgICAgICAgICAgICAgIHBpeGVsRm9ybWF0KTsKKy8vICAgICAgICBscC50b2tlbiA9IG1TdGF0dXNCYXJWaWV3LmdldFdpbmRvd1Rva2VuKCk7CisgICAgICAgIGxwLmdyYXZpdHkgPSBHcmF2aXR5LlRPUCB8IEdyYXZpdHkuRklMTF9IT1JJWk9OVEFMOworICAgICAgICBscC5zZXRUaXRsZSgiVHJhY2tpbmdWaWV3Iik7CisgICAgICAgIGxwLnkgPSBtVHJhY2tpbmdQb3NpdGlvbjsKKyAgICAgICAgbVRyYWNraW5nUGFyYW1zID0gbHA7CisKKyAgICAgICAgV2luZG93TWFuYWdlckltcGwuZ2V0RGVmYXVsdCgpLmFkZFZpZXcobVRyYWNraW5nVmlldywgbHApOworICAgIH0KKworICAgIHZvaWQgb25UcmFja2luZ1ZpZXdBdHRhY2hlZCgpIHsKKyAgICAgICAgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMgbHA7CisgICAgICAgIGludCBwaXhlbEZvcm1hdDsKKyAgICAgICAgRHJhd2FibGUgYmc7CisKKyAgICAgICAgLy8vIC0tLS0tLS0tLS0gRXhwYW5kZWQgVmlldyAtLS0tLS0tLS0tLS0tLQorICAgICAgICBwaXhlbEZvcm1hdCA9IFBpeGVsRm9ybWF0LlRSQU5TTFVDRU5UOworCisgICAgICAgIGZpbmFsIGludCBkaXNwaCA9IG1EaXNwbGF5LmdldEhlaWdodCgpOworICAgICAgICBscCA9IG1FeHBhbmRlZERpYWxvZy5nZXRXaW5kb3coKS5nZXRBdHRyaWJ1dGVzKCk7CisgICAgICAgIGxwLndpZHRoID0gVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQ7CisgICAgICAgIGxwLmhlaWdodCA9IGdldEV4cGFuZGVkSGVpZ2h0KCk7CisgICAgICAgIGxwLnggPSAwOworICAgICAgICBtVHJhY2tpbmdQb3NpdGlvbiA9IGxwLnkgPSAtZGlzcGg7IC8vIHN1ZmZpY2llbnRseSBsYXJnZSBuZWdhdGl2ZQorICAgICAgICBscC50eXBlID0gV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuVFlQRV9TVEFUVVNfQkFSX1BBTkVMOworICAgICAgICBscC5mbGFncyA9IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfTEFZT1VUX0lOX1NDUkVFTgorICAgICAgICAgICAgICAgIHwgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19MQVlPVVRfTk9fTElNSVRTCisgICAgICAgICAgICAgICAgfCBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX05PVF9UT1VDSF9NT0RBTAorICAgICAgICAgICAgICAgIHwgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19ESVRIRVIKKyAgICAgICAgICAgICAgICB8IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfTk9UX0ZPQ1VTQUJMRTsKKyAgICAgICAgbHAuZm9ybWF0ID0gcGl4ZWxGb3JtYXQ7CisgICAgICAgIGxwLmdyYXZpdHkgPSBHcmF2aXR5LlRPUCB8IEdyYXZpdHkuRklMTF9IT1JJWk9OVEFMOworICAgICAgICBscC5zZXRUaXRsZSgiU3RhdHVzQmFyRXhwYW5kZWQiKTsKKyAgICAgICAgbUV4cGFuZGVkRGlhbG9nLmdldFdpbmRvdygpLnNldEF0dHJpYnV0ZXMobHApOworICAgICAgICBtRXhwYW5kZWREaWFsb2cuZ2V0V2luZG93KCkuc2V0Rm9ybWF0KHBpeGVsRm9ybWF0KTsKKyAgICAgICAgbUV4cGFuZGVkUGFyYW1zID0gbHA7CisKKyAgICAgICAgbUV4cGFuZGVkRGlhbG9nLmdldFdpbmRvdygpLnJlcXVlc3RGZWF0dXJlKFdpbmRvdy5GRUFUVVJFX05PX1RJVExFKTsKKyAgICAgICAgbUV4cGFuZGVkRGlhbG9nLnNldENvbnRlbnRWaWV3KG1FeHBhbmRlZFZpZXcsCisgICAgICAgICAgICAgICAgbmV3IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMoVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQpKTsKKyAgICAgICAgbUV4cGFuZGVkRGlhbG9nLmdldFdpbmRvdygpLnNldEJhY2tncm91bmREcmF3YWJsZShudWxsKTsKKyAgICAgICAgbUV4cGFuZGVkRGlhbG9nLnNob3coKTsKKyAgICAgICAgRnJhbWVMYXlvdXQgaGFjayA9IChGcmFtZUxheW91dCltRXhwYW5kZWRWaWV3LmdldFBhcmVudCgpOworICAgIH0KKworICAgIHZvaWQgc2V0RGF0ZVZpZXdWaXNpYmlsaXR5KGJvb2xlYW4gdmlzaWJsZSwgaW50IGFuaW0pIHsKKyAgICAgICAgbURhdGVWaWV3LnNldFVwZGF0ZXModmlzaWJsZSk7CisgICAgICAgIG1EYXRlVmlldy5zZXRWaXNpYmlsaXR5KHZpc2libGUgPyBWaWV3LlZJU0lCTEUgOiBWaWV3LklOVklTSUJMRSk7CisgICAgICAgIG1EYXRlVmlldy5zdGFydEFuaW1hdGlvbihsb2FkQW5pbShhbmltLCBudWxsKSk7CisgICAgfQorCisgICAgdm9pZCBzZXROb3RpZmljYXRpb25JY29uVmlzaWJpbGl0eShib29sZWFuIHZpc2libGUsIGludCBhbmltKSB7CisgICAgICAgIGludCBvbGQgPSBtTm90aWZpY2F0aW9uSWNvbnMuZ2V0VmlzaWJpbGl0eSgpOworICAgICAgICBpbnQgdiA9IHZpc2libGUgPyBWaWV3LlZJU0lCTEUgOiBWaWV3LklOVklTSUJMRTsKKyAgICAgICAgaWYgKG9sZCAhPSB2KSB7CisgICAgICAgICAgICBtTm90aWZpY2F0aW9uSWNvbnMuc2V0VmlzaWJpbGl0eSh2KTsKKyAgICAgICAgICAgIG1Ob3RpZmljYXRpb25JY29ucy5zdGFydEFuaW1hdGlvbihsb2FkQW5pbShhbmltLCBudWxsKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIHVwZGF0ZUV4cGFuZGVkVmlld1BvcyhpbnQgZXhwYW5kZWRQb3NpdGlvbikgeworICAgICAgICBpZiAoU1BFVykgeworICAgICAgICAgICAgU2xvZy5kKFRBRywgInVwZGF0ZUV4cGFuZGVkVmlld1BvcyBiZWZvcmUgZXhwYW5kZWRQb3NpdGlvbj0iICsgZXhwYW5kZWRQb3NpdGlvbgorICAgICAgICAgICAgICAgICAgICArICIgbVRyYWNraW5nUGFyYW1zLnk9IiArIG1UcmFja2luZ1BhcmFtcy55CisgICAgICAgICAgICAgICAgICAgICsgIiBtVHJhY2tpbmdQb3NpdGlvbj0iICsgbVRyYWNraW5nUG9zaXRpb24pOworICAgICAgICB9CisKKyAgICAgICAgaW50IGggPSBtU3RhdHVzQmFyVmlldy5nZXRIZWlnaHQoKTsKKyAgICAgICAgaW50IGRpc3BoID0gbURpc3BsYXkuZ2V0SGVpZ2h0KCk7CisKKyAgICAgICAgLy8gSWYgdGhlIGV4cGFuZGVkIHZpZXcgaXMgbm90IHZpc2libGUsIG1ha2Ugc3VyZSB0aGV5J3JlIHN0aWxsIG9mZiBzY3JlZW4uCisgICAgICAgIC8vIE1heWJlIHRoZSB2aWV3IHdhcyByZXNpemVkLgorICAgICAgICBpZiAoIW1FeHBhbmRlZFZpc2libGUpIHsKKyAgICAgICAgICAgIGlmIChtVHJhY2tpbmdWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtVHJhY2tpbmdQb3NpdGlvbiA9IC1kaXNwaDsKKyAgICAgICAgICAgICAgICBpZiAobVRyYWNraW5nUGFyYW1zICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbVRyYWNraW5nUGFyYW1zLnkgPSBtVHJhY2tpbmdQb3NpdGlvbjsKKyAgICAgICAgICAgICAgICAgICAgV2luZG93TWFuYWdlckltcGwuZ2V0RGVmYXVsdCgpLnVwZGF0ZVZpZXdMYXlvdXQobVRyYWNraW5nVmlldywgbVRyYWNraW5nUGFyYW1zKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobUV4cGFuZGVkUGFyYW1zICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtRXhwYW5kZWRQYXJhbXMueSA9IC1kaXNwaDsKKyAgICAgICAgICAgICAgICBtRXhwYW5kZWREaWFsb2cuZ2V0V2luZG93KCkuc2V0QXR0cmlidXRlcyhtRXhwYW5kZWRQYXJhbXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gdHJhY2tpbmcgdmlldy4uLgorICAgICAgICBpbnQgcG9zOworICAgICAgICBpZiAoZXhwYW5kZWRQb3NpdGlvbiA9PSBFWFBBTkRFRF9GVUxMX09QRU4pIHsKKyAgICAgICAgICAgIHBvcyA9IGg7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoZXhwYW5kZWRQb3NpdGlvbiA9PSBFWFBBTkRFRF9MRUFWRV9BTE9ORSkgeworICAgICAgICAgICAgcG9zID0gbVRyYWNraW5nUG9zaXRpb247CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpZiAoZXhwYW5kZWRQb3NpdGlvbiA8PSBkaXNwaCkgeworICAgICAgICAgICAgICAgIHBvcyA9IGV4cGFuZGVkUG9zaXRpb247CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHBvcyA9IGRpc3BoOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcG9zIC09IGRpc3BoLWg7CisgICAgICAgIH0KKyAgICAgICAgbVRyYWNraW5nUG9zaXRpb24gPSBtVHJhY2tpbmdQYXJhbXMueSA9IHBvczsKKyAgICAgICAgbVRyYWNraW5nUGFyYW1zLmhlaWdodCA9IGRpc3BoLWg7CisgICAgICAgIFdpbmRvd01hbmFnZXJJbXBsLmdldERlZmF1bHQoKS51cGRhdGVWaWV3TGF5b3V0KG1UcmFja2luZ1ZpZXcsIG1UcmFja2luZ1BhcmFtcyk7CisKKyAgICAgICAgaWYgKG1FeHBhbmRlZFBhcmFtcyAhPSBudWxsKSB7CisgICAgICAgICAgICBtQ2xvc2VWaWV3LmdldExvY2F0aW9uSW5XaW5kb3cobVBvc2l0aW9uVG1wKTsKKyAgICAgICAgICAgIGZpbmFsIGludCBjbG9zZVBvcyA9IG1Qb3NpdGlvblRtcFsxXTsKKworICAgICAgICAgICAgbUV4cGFuZGVkQ29udGVudHMuZ2V0TG9jYXRpb25JbldpbmRvdyhtUG9zaXRpb25UbXApOworICAgICAgICAgICAgZmluYWwgaW50IGNvbnRlbnRzQm90dG9tID0gbVBvc2l0aW9uVG1wWzFdICsgbUV4cGFuZGVkQ29udGVudHMuZ2V0SGVpZ2h0KCk7CisKKyAgICAgICAgICAgIG1FeHBhbmRlZFBhcmFtcy55ID0gcG9zICsgbVRyYWNraW5nVmlldy5nZXRIZWlnaHQoKQorICAgICAgICAgICAgICAgICAgICAtIChtVHJhY2tpbmdQYXJhbXMuaGVpZ2h0LWNsb3NlUG9zKSAtIGNvbnRlbnRzQm90dG9tOworICAgICAgICAgICAgaW50IG1heCA9IGg7CisgICAgICAgICAgICBpZiAobUV4cGFuZGVkUGFyYW1zLnkgPiBtYXgpIHsKKyAgICAgICAgICAgICAgICBtRXhwYW5kZWRQYXJhbXMueSA9IG1heDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludCBtaW4gPSBtVHJhY2tpbmdQb3NpdGlvbjsKKyAgICAgICAgICAgIGlmIChtRXhwYW5kZWRQYXJhbXMueSA8IG1pbikgeworICAgICAgICAgICAgICAgIG1FeHBhbmRlZFBhcmFtcy55ID0gbWluOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBib29sZWFuIHZpc2libGUgPSAobVRyYWNraW5nUG9zaXRpb24gKyBtVHJhY2tpbmdWaWV3LmdldEhlaWdodCgpKSA+IGg7CisgICAgICAgICAgICBpZiAoIXZpc2libGUpIHsKKyAgICAgICAgICAgICAgICAvLyBpZiB0aGUgY29udGVudHMgYXJlbid0IHZpc2libGUsIG1vdmUgdGhlIGV4cGFuZGVkIHZpZXcgd2F5IG9mZiBzY3JlZW4KKyAgICAgICAgICAgICAgICAvLyBiZWNhdXNlIHRoZSB3aW5kb3cgaXRzZWxmIGV4dGVuZHMgYmVsb3cgdGhlIGNvbnRlbnQgdmlldy4KKyAgICAgICAgICAgICAgICBtRXhwYW5kZWRQYXJhbXMueSA9IC1kaXNwaDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1FeHBhbmRlZERpYWxvZy5nZXRXaW5kb3coKS5zZXRBdHRyaWJ1dGVzKG1FeHBhbmRlZFBhcmFtcyk7CisKKyAgICAgICAgICAgIC8vIEFzIGxvbmcgYXMgdGhpcyBpc24ndCBqdXN0IGEgcmVwb3NpdGlvbmluZyB0aGF0J3Mgbm90IHN1cHBvc2VkIHRvIGFmZmVjdAorICAgICAgICAgICAgLy8gdGhlIHVzZXIncyBwZXJjZXB0aW9uIG9mIHdoYXQncyBzaG93aW5nLCBjYWxsIHRvIHNheSB0aGF0IHRoZSB2aXNpYmlsaXR5CisgICAgICAgICAgICAvLyBoYXMgY2hhbmdlZC4gKE90aGVyd2lzZSwgc29tZW9uZSBlbHNlIHdpbGwgY2FsbCB0byBkbyB0aGF0KS4KKyAgICAgICAgICAgIGlmIChleHBhbmRlZFBvc2l0aW9uICE9IEVYUEFOREVEX0xFQVZFX0FMT05FKSB7CisgICAgICAgICAgICAgICAgaWYgKFNQRVcpIFNsb2cuZChUQUcsICJ1cGRhdGVFeHBhbmRlZFZpZXdQb3MgdmlzaWJpbGl0eUNoYW5nZWQoIiArIHZpc2libGUgKyAiKSIpOworICAgICAgICAgICAgICAgIHZpc2liaWxpdHlDaGFuZ2VkKHZpc2libGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKFNQRVcpIHsKKyAgICAgICAgICAgIFNsb2cuZChUQUcsICJ1cGRhdGVFeHBhbmRlZFZpZXdQb3MgYWZ0ZXIgIGV4cGFuZGVkUG9zaXRpb249IiArIGV4cGFuZGVkUG9zaXRpb24KKyAgICAgICAgICAgICAgICAgICAgKyAiIG1UcmFja2luZ1BhcmFtcy55PSIgKyBtVHJhY2tpbmdQYXJhbXMueQorICAgICAgICAgICAgICAgICAgICArICIgbVRyYWNraW5nUG9zaXRpb249IiArIG1UcmFja2luZ1Bvc2l0aW9uCisgICAgICAgICAgICAgICAgICAgICsgIiBtRXhwYW5kZWRQYXJhbXMueT0iICsgbUV4cGFuZGVkUGFyYW1zLnkKKyAgICAgICAgICAgICAgICAgICAgKyAiIG1FeHBhbmRlZFBhcmFtcy5oZWlnaHQ9IiArIG1FeHBhbmRlZFBhcmFtcy5oZWlnaHQpOworICAgICAgICB9CisgICAgfQorCisgICAgaW50IGdldEV4cGFuZGVkSGVpZ2h0KCkgeworICAgICAgICByZXR1cm4gbURpc3BsYXkuZ2V0SGVpZ2h0KCkgLSBtU3RhdHVzQmFyVmlldy5nZXRIZWlnaHQoKSAtIG1DbG9zZVZpZXcuZ2V0SGVpZ2h0KCk7CisgICAgfQorCisgICAgdm9pZCB1cGRhdGVFeHBhbmRlZEhlaWdodCgpIHsKKyAgICAgICAgaWYgKG1FeHBhbmRlZFZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgbUV4cGFuZGVkUGFyYW1zLmhlaWdodCA9IGdldEV4cGFuZGVkSGVpZ2h0KCk7CisgICAgICAgICAgICBtRXhwYW5kZWREaWFsb2cuZ2V0V2luZG93KCkuc2V0QXR0cmlidXRlcyhtRXhwYW5kZWRQYXJhbXMpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIExFRHMgYXJlIHR1cm5lZCBvKWZmIHdoZW4gdGhlIG5vdGlmaWNhdGlvbiBwYW5lbCBpcyBzaG93biwgZXZlbiBqdXN0IGEgbGl0dGxlIGJpdC4KKyAgICAgKiBUaGlzIHdhcyBhZGRlZCBsYXN0LW1pbnV0ZSBhbmQgaXMgaW5jb25zaXN0ZW50IHdpdGggdGhlIHdheSB0aGUgcmVzdCBvZiB0aGUgbm90aWZpY2F0aW9ucworICAgICAqIGFyZSBoYW5kbGVkLCBiZWNhdXNlIHRoZSBub3RpZmljYXRpb24gaXNuJ3QgcmVhbGx5IGNhbmNlbGxlZC4gIFRoZSBsaWdodHMgYXJlIGp1c3QKKyAgICAgKiB0dXJuZWQgb2ZmLiAgSWYgYW55IG90aGVyIG5vdGlmaWNhdGlvbnMgaGFwcGVuLCB0aGUgbGlnaHRzIHdpbGwgdHVybiBiYWNrIG9uLiAgU3RldmUgc2F5cworICAgICAqIHRoaXMgaXMgd2hhdCBoZSB3YW50cy4gKHNlZSBidWcgMTEzMTQ2MSkKKyAgICAgKi8KKyAgICB2b2lkIHZpc2liaWxpdHlDaGFuZ2VkKGJvb2xlYW4gdmlzaWJsZSkgeworICAgICAgICBpZiAobVBhbmVsU2xpZ2h0bHlWaXNpYmxlICE9IHZpc2libGUpIHsKKyAgICAgICAgICAgIG1QYW5lbFNsaWdodGx5VmlzaWJsZSA9IHZpc2libGU7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1CYXJTZXJ2aWNlLm9uUGFuZWxSZXZlYWxlZCgpOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgLy8gV29uJ3QgZmFpbCB1bmxlc3MgdGhlIHdvcmxkIGhhcyBlbmRlZC4KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgcGVyZm9ybURpc2FibGVBY3Rpb25zKGludCBuZXQpIHsKKyAgICAgICAgaW50IG9sZCA9IG1EaXNhYmxlZDsKKyAgICAgICAgaW50IGRpZmYgPSBuZXQgXiBvbGQ7CisgICAgICAgIG1EaXNhYmxlZCA9IG5ldDsKKworICAgICAgICAvLyBhY3QgYWNjb3JkaW5nbHkKKyAgICAgICAgaWYgKChkaWZmICYgU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX0VYUEFORCkgIT0gMCkgeworICAgICAgICAgICAgaWYgKChuZXQgJiBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfRVhQQU5EKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgIkRJU0FCTEVfRVhQQU5EOiB5ZXMiKTsKKyAgICAgICAgICAgICAgICBhbmltYXRlQ29sbGFwc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoKGRpZmYgJiBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfTk9USUZJQ0FUSU9OX0lDT05TKSAhPSAwKSB7CisgICAgICAgICAgICBpZiAoKG5ldCAmIFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9OT1RJRklDQVRJT05fSUNPTlMpICE9IDApIHsKKyAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAiRElTQUJMRV9OT1RJRklDQVRJT05fSUNPTlM6IHllcyIpOworICAgICAgICAgICAgICAgIGlmIChtVGlja2luZykgeworICAgICAgICAgICAgICAgICAgICBtTm90aWZpY2F0aW9uSWNvbnMuc2V0VmlzaWJpbGl0eShWaWV3LklOVklTSUJMRSk7CisgICAgICAgICAgICAgICAgICAgIG1UaWNrZXIuaGFsdCgpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHNldE5vdGlmaWNhdGlvbkljb25WaXNpYmlsaXR5KGZhbHNlLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmFuaW0uZmFkZV9vdXQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgIkRJU0FCTEVfTk9USUZJQ0FUSU9OX0lDT05TOiBubyIpOworICAgICAgICAgICAgICAgIGlmICghbUV4cGFuZGVkVmlzaWJsZSkgeworICAgICAgICAgICAgICAgICAgICBzZXROb3RpZmljYXRpb25JY29uVmlzaWJpbGl0eSh0cnVlLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmFuaW0uZmFkZV9pbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKChkaWZmICYgU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX05PVElGSUNBVElPTl9USUNLRVIpICE9IDApIHsKKyAgICAgICAgICAgIGlmIChtVGlja2luZyAmJiAobmV0ICYgU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX05PVElGSUNBVElPTl9USUNLRVIpICE9IDApIHsKKyAgICAgICAgICAgICAgICBtVGlja2VyLmhhbHQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgVmlldy5PbkNsaWNrTGlzdGVuZXIgbUNsZWFyQnV0dG9uTGlzdGVuZXIgPSBuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1CYXJTZXJ2aWNlLm9uQ2xlYXJBbGxOb3RpZmljYXRpb25zKCk7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAvLyBzeXN0ZW0gcHJvY2VzcyBpcyBkZWFkIGlmIHdlJ3JlIGhlcmUuCisgICAgICAgICAgICB9CisgICAgICAgICAgICBhbmltYXRlQ29sbGFwc2UoKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBwcml2YXRlIEJyb2FkY2FzdFJlY2VpdmVyIG1Ccm9hZGNhc3RSZWNlaXZlciA9IG5ldyBCcm9hZGNhc3RSZWNlaXZlcigpIHsKKyAgICAgICAgcHVibGljIHZvaWQgb25SZWNlaXZlKENvbnRleHQgY29udGV4dCwgSW50ZW50IGludGVudCkgeworICAgICAgICAgICAgU3RyaW5nIGFjdGlvbiA9IGludGVudC5nZXRBY3Rpb24oKTsKKyAgICAgICAgICAgIGlmIChJbnRlbnQuQUNUSU9OX0NMT1NFX1NZU1RFTV9ESUFMT0dTLmVxdWFscyhhY3Rpb24pCisgICAgICAgICAgICAgICAgICAgIHx8IEludGVudC5BQ1RJT05fU0NSRUVOX09GRi5lcXVhbHMoYWN0aW9uKSkgeworICAgICAgICAgICAgICAgIC8vY29sbGFwc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKEludGVudC5BQ1RJT05fQ09ORklHVVJBVElPTl9DSEFOR0VELmVxdWFscyhhY3Rpb24pKSB7CisgICAgICAgICAgICAgICAgdXBkYXRlUmVzb3VyY2VzKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9OworCisgICAgcHJpdmF0ZSB2b2lkIHNldEludHJ1ZGVyQWxlcnRWaXNpYmlsaXR5KGJvb2xlYW4gdmlzKSB7CisgICAgICAgIG1JbnRydWRlckFsZXJ0Vmlldy5zZXRWaXNpYmlsaXR5KHZpcyA/IFZpZXcuVklTSUJMRSA6IFZpZXcuR09ORSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVsb2FkIHNvbWUgb2Ygb3VyIHJlc291cmNlcyB3aGVuIHRoZSBjb25maWd1cmF0aW9uIGNoYW5nZXMuCisgICAgICoKKyAgICAgKiBXZSBkb24ndCByZWxvYWQgZXZlcnl0aGluZyB3aGVuIHRoZSBjb25maWd1cmF0aW9uIGNoYW5nZXMgLS0gd2UgcHJvYmFibHkKKyAgICAgKiBzaG91bGQsIGJ1dCBnZXR0aW5nIHRoYXQgc21vb3RoIGlzIHRvdWdoLiAgU29tZWRheSB3ZSdsbCBmaXggdGhhdC4gIEluIHRoZQorICAgICAqIG1lYW50aW1lLCBqdXN0IHVwZGF0ZSB0aGUgdGhpbmdzIHRoYXQgd2Uga25vdyBjaGFuZ2UuCisgICAgICovCisgICAgdm9pZCB1cGRhdGVSZXNvdXJjZXMoKSB7CisgICAgICAgIFJlc291cmNlcyByZXMgPSBnZXRSZXNvdXJjZXMoKTsKKworICAgICAgICBtQ2xlYXJCdXR0b24uc2V0VGV4dChnZXRUZXh0KFIuc3RyaW5nLnN0YXR1c19iYXJfY2xlYXJfYWxsX2J1dHRvbikpOworICAgICAgICBtT25nb2luZ1RpdGxlLnNldFRleHQoZ2V0VGV4dChSLnN0cmluZy5zdGF0dXNfYmFyX29uZ29pbmdfZXZlbnRzX3RpdGxlKSk7CisgICAgICAgIG1MYXRlc3RUaXRsZS5zZXRUZXh0KGdldFRleHQoUi5zdHJpbmcuc3RhdHVzX2Jhcl9sYXRlc3RfZXZlbnRzX3RpdGxlKSk7CisgICAgICAgIG1Ob05vdGlmaWNhdGlvbnNUaXRsZS5zZXRUZXh0KGdldFRleHQoUi5zdHJpbmcuc3RhdHVzX2Jhcl9ub19ub3RpZmljYXRpb25zX3RpdGxlKSk7CisKKyAgICAgICAgbUVkZ2VCb3JkZXIgPSByZXMuZ2V0RGltZW5zaW9uUGl4ZWxTaXplKFIuZGltZW4uc3RhdHVzX2Jhcl9lZGdlX2lnbm9yZSk7CisKKyAgICAgICAgaWYgKGZhbHNlKSBTbG9nLnYoVEFHLCAidXBkYXRlUmVzb3VyY2VzIik7CisgICAgfQorCisgICAgLy8KKyAgICAvLyB0cmFjaW5nCisgICAgLy8KKworICAgIHZvaWQgcG9zdFN0YXJ0VHJhY2luZygpIHsKKyAgICAgICAgbUhhbmRsZXIucG9zdERlbGF5ZWQobVN0YXJ0VHJhY2luZywgMzAwMCk7CisgICAgfQorCisgICAgdm9pZCB2aWJyYXRlKCkgeworICAgICAgICBhbmRyb2lkLm9zLlZpYnJhdG9yIHZpYiA9IChhbmRyb2lkLm9zLlZpYnJhdG9yKWdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5WSUJSQVRPUl9TRVJWSUNFKTsKKyAgICAgICAgdmliLnZpYnJhdGUoMjUwKTsKKyAgICB9CisKKyAgICBSdW5uYWJsZSBtU3RhcnRUcmFjaW5nID0gbmV3IFJ1bm5hYmxlKCkgeworICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICB2aWJyYXRlKCk7CisgICAgICAgICAgICBTeXN0ZW1DbG9jay5zbGVlcCgyNTApOworICAgICAgICAgICAgU2xvZy5kKFRBRywgInN0YXJ0VHJhY2luZyIpOworICAgICAgICAgICAgYW5kcm9pZC5vcy5EZWJ1Zy5zdGFydE1ldGhvZFRyYWNpbmcoIi9kYXRhL3N0YXR1c2Jhci10cmFjZXMvdHJhY2UiKTsKKyAgICAgICAgICAgIG1IYW5kbGVyLnBvc3REZWxheWVkKG1TdG9wVHJhY2luZywgMTAwMDApOworICAgICAgICB9CisgICAgfTsKKworICAgIFJ1bm5hYmxlIG1TdG9wVHJhY2luZyA9IG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgYW5kcm9pZC5vcy5EZWJ1Zy5zdG9wTWV0aG9kVHJhY2luZygpOworICAgICAgICAgICAgU2xvZy5kKFRBRywgInN0b3BUcmFjaW5nIik7CisgICAgICAgICAgICB2aWJyYXRlKCk7CisgICAgICAgIH0KKyAgICB9OworfQorCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL1N0YXR1c0JhclNlcnZpY2UuamF2YSBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvU3RhdHVzQmFyU2VydmljZS5qYXZhCmluZGV4IGQyMzQ2ZTQuLmE2NGMzZTcgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvU3RhdHVzQmFyU2VydmljZS5qYXZhCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvU3RhdHVzQmFyU2VydmljZS5qYXZhCkBAIC0xNywxODggKzE3LDUzIEBACiBwYWNrYWdlIGNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2JhcjsKIAogaW1wb3J0IGFuZHJvaWQuYXBwLlNlcnZpY2U7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBpeGVsRm9ybWF0OworaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm9zLlNlcnZpY2VNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQudXRpbC5TbG9nOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3LkdyYXZpdHk7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlckltcGw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuc3RhdHVzYmFyLklTdGF0dXNCYXI7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuc3RhdHVzYmFyLklTdGF0dXNCYXJTZXJ2aWNlOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnN0YXR1c2Jhci5TdGF0dXNCYXJJY29uOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnN0YXR1c2Jhci5TdGF0dXNCYXJJY29uTGlzdDsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5zdGF0dXNiYXIuU3RhdHVzQmFyTm90aWZpY2F0aW9uOwogCi1pbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHlNYW5hZ2VyTmF0aXZlOwotaW1wb3J0IGFuZHJvaWQuYXBwLkRpYWxvZzsKLWltcG9ydCBhbmRyb2lkLmFwcC5Ob3RpZmljYXRpb247Ci1pbXBvcnQgYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudDsKLWltcG9ydCBhbmRyb2lkLmFwcC5TZXJ2aWNlOwotaW1wb3J0IGFuZHJvaWQuYXBwLlN0YXR1c0Jhck1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudEZpbHRlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QaXhlbEZvcm1hdDsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKLWltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7Ci1pbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOwotaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQub3MuQmluZGVyOwotaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKLWltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7Ci1pbXBvcnQgYW5kcm9pZC5vcy5TZXJ2aWNlTWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOwotaW1wb3J0IGFuZHJvaWQudXRpbC5TbG9nOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LkRpc3BsYXk7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LkdyYXZpdHk7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OwotaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQ7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZlbG9jaXR5VHJhY2tlcjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOwotaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3c7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXJJbXBsOwotaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uOwotaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uVXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuSW1hZ2VWaWV3OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkxpbmVhckxheW91dDsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5SZW1vdGVWaWV3czsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5TY3JvbGxWaWV3OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkZyYW1lTGF5b3V0OwotCi1pbXBvcnQgamF2YS5pby5GaWxlRGVzY3JpcHRvcjsKLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLlI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLnBvbGljeS5TdGF0dXNCYXJQb2xpY3k7CiAKLQotCi1wdWJsaWMgY2xhc3MgU3RhdHVzQmFyU2VydmljZSBleHRlbmRzIFNlcnZpY2UgaW1wbGVtZW50cyBDb21tYW5kUXVldWUuQ2FsbGJhY2tzIHsKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBTdGF0dXNCYXJTZXJ2aWNlIGV4dGVuZHMgU2VydmljZSBpbXBsZW1lbnRzIENvbW1hbmRRdWV1ZS5DYWxsYmFja3MgewogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlN0YXR1c0JhclNlcnZpY2UiOwotICAgIHN0YXRpYyBmaW5hbCBib29sZWFuIFNQRVcgPSBmYWxzZTsKIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9TVEFUVVNCQVJfU1RBUlQKLSAgICAgICAgICAgID0gImNvbS5hbmRyb2lkLmludGVybmFsLnBvbGljeS5zdGF0dXNiYXIuU1RBUlQiOworICAgIHByb3RlY3RlZCBDb21tYW5kUXVldWUgbUNvbW1hbmRRdWV1ZTsKKyAgICBwcm90ZWN0ZWQgSVN0YXR1c0JhclNlcnZpY2UgbUJhclNlcnZpY2U7CiAKLSAgICBzdGF0aWMgZmluYWwgaW50IEVYUEFOREVEX0xFQVZFX0FMT05FID0gLTEwMDAwOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgRVhQQU5ERURfRlVMTF9PUEVOID0gLTEwMDAxOworICAgIC8vIFVwLWNhbGwgbWV0aG9kcworICAgIHByb3RlY3RlZCBhYnN0cmFjdCBWaWV3IG1ha2VTdGF0dXNCYXJWaWV3KCk7CisgICAgcHJvdGVjdGVkIGFic3RyYWN0IGludCBnZXRTdGF0dXNCYXJHcmF2aXR5KCk7CiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0FOSU1BVEUgPSAxMDAwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfQU5JTUFURV9SRVZFQUwgPSAxMDAxOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfU0hPV19JTlRSVURFUiA9IDEwMDI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19ISURFX0lOVFJVREVSID0gMTAwMzsKLQotICAgIC8vIHdpbGwgbGlrZWx5IG1vdmUgdG8gYSByZXNvdXJjZSBvciBvdGhlciB0dW5hYmxlIHBhcmFtIGF0IHNvbWUgcG9pbnQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU5UUlVERVJfQUxFUlRfREVDQVlfTVMgPSAxMDAwMDsKLQotICAgIFN0YXR1c0JhclBvbGljeSBtSWNvblBvbGljeTsKLQotICAgIENvbW1hbmRRdWV1ZSBtQ29tbWFuZFF1ZXVlOwotICAgIElTdGF0dXNCYXJTZXJ2aWNlIG1CYXJTZXJ2aWNlOwotCi0gICAgaW50IG1JY29uU2l6ZTsKLSAgICBEaXNwbGF5IG1EaXNwbGF5OwotICAgIFN0YXR1c0JhclZpZXcgbVN0YXR1c0JhclZpZXc7Ci0gICAgaW50IG1QaXhlbEZvcm1hdDsKLSAgICBIIG1IYW5kbGVyID0gbmV3IEgoKTsKLSAgICBPYmplY3QgbVF1ZXVlTG9jayA9IG5ldyBPYmplY3QoKTsKLQotICAgIC8vIGljb25zCi0gICAgTGluZWFyTGF5b3V0IG1JY29uczsKLSAgICBJY29uTWVyZ2VyIG1Ob3RpZmljYXRpb25JY29uczsKLSAgICBMaW5lYXJMYXlvdXQgbVN0YXR1c0ljb25zOwotCi0gICAgLy8gZXhwYW5kZWQgbm90aWZpY2F0aW9ucwotICAgIERpYWxvZyBtRXhwYW5kZWREaWFsb2c7Ci0gICAgRXhwYW5kZWRWaWV3IG1FeHBhbmRlZFZpZXc7Ci0gICAgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMgbUV4cGFuZGVkUGFyYW1zOwotICAgIFNjcm9sbFZpZXcgbVNjcm9sbFZpZXc7Ci0gICAgVmlldyBtTm90aWZpY2F0aW9uTGluZWFyTGF5b3V0OwotICAgIFZpZXcgbUV4cGFuZGVkQ29udGVudHM7Ci0gICAgLy8gdG9wIGJhcgotICAgIFRleHRWaWV3IG1Ob05vdGlmaWNhdGlvbnNUaXRsZTsKLSAgICBUZXh0VmlldyBtQ2xlYXJCdXR0b247Ci0gICAgLy8gZHJhZyBiYXIKLSAgICBDbG9zZURyYWdIYW5kbGUgbUNsb3NlVmlldzsKLSAgICAvLyBvbmdvaW5nCi0gICAgTm90aWZpY2F0aW9uRGF0YSBtT25nb2luZyA9IG5ldyBOb3RpZmljYXRpb25EYXRhKCk7Ci0gICAgVGV4dFZpZXcgbU9uZ29pbmdUaXRsZTsKLSAgICBMaW5lYXJMYXlvdXQgbU9uZ29pbmdJdGVtczsKLSAgICAvLyBsYXRlc3QKLSAgICBOb3RpZmljYXRpb25EYXRhIG1MYXRlc3QgPSBuZXcgTm90aWZpY2F0aW9uRGF0YSgpOwotICAgIFRleHRWaWV3IG1MYXRlc3RUaXRsZTsKLSAgICBMaW5lYXJMYXlvdXQgbUxhdGVzdEl0ZW1zOwotICAgIC8vIHBvc2l0aW9uCi0gICAgaW50W10gbVBvc2l0aW9uVG1wID0gbmV3IGludFsyXTsKLSAgICBib29sZWFuIG1FeHBhbmRlZDsKLSAgICBib29sZWFuIG1FeHBhbmRlZFZpc2libGU7Ci0KLSAgICAvLyB0aGUgZGF0ZSB2aWV3Ci0gICAgRGF0ZVZpZXcgbURhdGVWaWV3OwotCi0gICAgLy8gdGhlIHRyYWNrZXIgdmlldwotICAgIFRyYWNraW5nVmlldyBtVHJhY2tpbmdWaWV3OwotICAgIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zIG1UcmFja2luZ1BhcmFtczsKLSAgICBpbnQgbVRyYWNraW5nUG9zaXRpb247IC8vIHRoZSBwb3NpdGlvbiBvZiB0aGUgdG9wIG9mIHRoZSB0cmFja2luZyB2aWV3LgotICAgIHByaXZhdGUgYm9vbGVhbiBtUGFuZWxTbGlnaHRseVZpc2libGU7Ci0KLSAgICAvLyB0aWNrZXIKLSAgICBwcml2YXRlIFRpY2tlciBtVGlja2VyOwotICAgIHByaXZhdGUgVmlldyBtVGlja2VyVmlldzsKLSAgICBwcml2YXRlIGJvb2xlYW4gbVRpY2tpbmc7Ci0KLSAgICAvLyBUcmFja2luZyBmaW5nZXIgZm9yIG9wZW5pbmcvY2xvc2luZy4KLSAgICBpbnQgbUVkZ2VCb3JkZXI7IC8vIGNvcnJlc3BvbmRzIHRvIFIuZGltZW4uc3RhdHVzX2Jhcl9lZGdlX2lnbm9yZQotICAgIGJvb2xlYW4gbVRyYWNraW5nOwotICAgIFZlbG9jaXR5VHJhY2tlciBtVmVsb2NpdHlUcmFja2VyOwotCi0gICAgc3RhdGljIGZpbmFsIGludCBBTklNX0ZSQU1FX0RVUkFUSU9OID0gKDEwMDAvNjApOwotCi0gICAgYm9vbGVhbiBtQW5pbWF0aW5nOwotICAgIGxvbmcgbUN1ckFuaW1hdGlvblRpbWU7Ci0gICAgZmxvYXQgbURpc3BsYXlIZWlnaHQ7Ci0gICAgZmxvYXQgbUFuaW1ZOwotICAgIGZsb2F0IG1BbmltVmVsOwotICAgIGZsb2F0IG1BbmltQWNjZWw7Ci0gICAgbG9uZyBtQW5pbUxhc3RUaW1lOwotICAgIGJvb2xlYW4gbUFuaW1hdGluZ1JldmVhbCA9IGZhbHNlOwotICAgIGludCBtVmlld0RlbHRhOwotICAgIGludFtdIG1BYnNQb3MgPSBuZXcgaW50WzJdOwotCi0gICAgLy8gZm9yIGRpc2FibGluZyB0aGUgc3RhdHVzIGJhcgotICAgIGludCBtRGlzYWJsZWQgPSAwOwotCi0gICAgcHJpdmF0ZSBjbGFzcyBFeHBhbmRlZERpYWxvZyBleHRlbmRzIERpYWxvZyB7Ci0gICAgICAgIEV4cGFuZGVkRGlhbG9nKENvbnRleHQgY29udGV4dCkgewotICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZS5UaGVtZV9MaWdodF9Ob1RpdGxlQmFyKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBkaXNwYXRjaEtleUV2ZW50KEtleUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICBib29sZWFuIGRvd24gPSBldmVudC5nZXRBY3Rpb24oKSA9PSBLZXlFdmVudC5BQ1RJT05fRE9XTjsKLSAgICAgICAgICAgIHN3aXRjaCAoZXZlbnQuZ2V0S2V5Q29kZSgpKSB7Ci0gICAgICAgICAgICBjYXNlIEtleUV2ZW50LktFWUNPREVfQkFDSzoKLSAgICAgICAgICAgICAgICBpZiAoIWRvd24pIHsKLSAgICAgICAgICAgICAgICAgICAgYW5pbWF0ZUNvbGxhcHNlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmRpc3BhdGNoS2V5RXZlbnQoZXZlbnQpOwotICAgICAgICB9CisgICAgLyoqCisgICAgICogTm9ib2R5IGJpbmRzIHRvIHVzLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBJQmluZGVyIG9uQmluZChJbnRlbnQgaW50ZW50KSB7CisgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KIAotCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgb25DcmVhdGUoKSB7CiAgICAgICAgIC8vIEZpcnN0IHNldCB1cCBvdXIgdmlld3MgYW5kIHN0dWZmLgotICAgICAgICBtRGlzcGxheSA9ICgoV2luZG93TWFuYWdlcilnZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuV0lORE9XX1NFUlZJQ0UpKS5nZXREZWZhdWx0RGlzcGxheSgpOwotICAgICAgICBtYWtlU3RhdHVzQmFyVmlldyh0aGlzKTsKKyAgICAgICAgVmlldyBzYiA9IG1ha2VTdGF0dXNCYXJWaWV3KCk7CiAKICAgICAgICAgLy8gQ29ubmVjdCBpbiB0byB0aGUgc3RhdHVzIGJhciBtYW5hZ2VyIHNlcnZpY2UKICAgICAgICAgU3RhdHVzQmFySWNvbkxpc3QgaWNvbkxpc3QgPSBuZXcgU3RhdHVzQmFySWNvbkxpc3QoKTsKQEAgLTIzNiwxMzcxICsxMDEsMjIgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8vIFB1dCB1cCB0aGUgdmlldwotICAgICAgICBhZGRTdGF0dXNCYXJWaWV3KCk7Ci0KLSAgICAgICAgLy8gTGFzdGx5LCBjYWxsIHRvIHRoZSBpY29uIHBvbGljeSB0byBpbnN0YWxsL3VwZGF0ZSBhbGwgdGhlIGljb25zLgotICAgICAgICBtSWNvblBvbGljeSA9IG5ldyBTdGF0dXNCYXJQb2xpY3kodGhpcyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25EZXN0cm95KCkgewotICAgICAgICAvLyB3ZSdyZSBuZXZlciBkZXN0cm95ZWQKLSAgICB9Ci0KLSAgICAvLyBmb3IgaW1tZXJzaXZlIGFjdGl2aXRpZXMKLSAgICBwcml2YXRlIFZpZXcgbUludHJ1ZGVyQWxlcnRWaWV3OwotCi0gICAgLyoqCi0gICAgICogTm9ib2R5IGJpbmRzIHRvIHVzLgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJQmluZGVyIG9uQmluZChJbnRlbnQgaW50ZW50KSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgLy8gQ29uc3RydWN0aW5nIHRoZSB2aWV3Ci0gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBwcml2YXRlIHZvaWQgbWFrZVN0YXR1c0JhclZpZXcoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIFJlc291cmNlcyByZXMgPSBjb250ZXh0LmdldFJlc291cmNlcygpOwotCi0gICAgICAgIG1JY29uU2l6ZSA9IHJlcy5nZXREaW1lbnNpb25QaXhlbFNpemUoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5kaW1lbi5zdGF0dXNfYmFyX2ljb25fc2l6ZSk7Ci0KLSAgICAgICAgRXhwYW5kZWRWaWV3IGV4cGFuZGVkID0gKEV4cGFuZGVkVmlldylWaWV3LmluZmxhdGUoY29udGV4dCwKLSAgICAgICAgICAgICAgICBSLmxheW91dC5zdGF0dXNfYmFyX2V4cGFuZGVkLCBudWxsKTsKLSAgICAgICAgZXhwYW5kZWQubVNlcnZpY2UgPSB0aGlzOwotCi0gICAgICAgIG1JbnRydWRlckFsZXJ0VmlldyA9IFZpZXcuaW5mbGF0ZShjb250ZXh0LCBSLmxheW91dC5pbnRydWRlcl9hbGVydCwgbnVsbCk7Ci0gICAgICAgIG1JbnRydWRlckFsZXJ0Vmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgIG1JbnRydWRlckFsZXJ0Vmlldy5zZXRDbGlja2FibGUodHJ1ZSk7Ci0KLSAgICAgICAgU3RhdHVzQmFyVmlldyBzYiA9IChTdGF0dXNCYXJWaWV3KVZpZXcuaW5mbGF0ZShjb250ZXh0LCBSLmxheW91dC5zdGF0dXNfYmFyLCBudWxsKTsKLSAgICAgICAgc2IubVNlcnZpY2UgPSB0aGlzOwotCi0gICAgICAgIC8vIGZpZ3VyZSBvdXQgd2hpY2ggcGl4ZWwtZm9ybWF0IHRvIHVzZSBmb3IgdGhlIHN0YXR1cyBiYXIuCi0gICAgICAgIG1QaXhlbEZvcm1hdCA9IFBpeGVsRm9ybWF0LlRSQU5TTFVDRU5UOwotICAgICAgICBEcmF3YWJsZSBiZyA9IHNiLmdldEJhY2tncm91bmQoKTsKLSAgICAgICAgaWYgKGJnICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1QaXhlbEZvcm1hdCA9IGJnLmdldE9wYWNpdHkoKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1TdGF0dXNCYXJWaWV3ID0gc2I7Ci0gICAgICAgIG1TdGF0dXNJY29ucyA9IChMaW5lYXJMYXlvdXQpc2IuZmluZFZpZXdCeUlkKFIuaWQuc3RhdHVzSWNvbnMpOwotICAgICAgICBtTm90aWZpY2F0aW9uSWNvbnMgPSAoSWNvbk1lcmdlcilzYi5maW5kVmlld0J5SWQoUi5pZC5ub3RpZmljYXRpb25JY29ucyk7Ci0gICAgICAgIG1JY29ucyA9IChMaW5lYXJMYXlvdXQpc2IuZmluZFZpZXdCeUlkKFIuaWQuaWNvbnMpOwotICAgICAgICBtVGlja2VyVmlldyA9IHNiLmZpbmRWaWV3QnlJZChSLmlkLnRpY2tlcik7Ci0gICAgICAgIG1EYXRlVmlldyA9IChEYXRlVmlldylzYi5maW5kVmlld0J5SWQoUi5pZC5kYXRlKTsKLQotICAgICAgICBtRXhwYW5kZWREaWFsb2cgPSBuZXcgRXhwYW5kZWREaWFsb2coY29udGV4dCk7Ci0gICAgICAgIG1FeHBhbmRlZFZpZXcgPSBleHBhbmRlZDsKLSAgICAgICAgbUV4cGFuZGVkQ29udGVudHMgPSBleHBhbmRlZC5maW5kVmlld0J5SWQoUi5pZC5ub3RpZmljYXRpb25MaW5lYXJMYXlvdXQpOwotICAgICAgICBtT25nb2luZ1RpdGxlID0gKFRleHRWaWV3KWV4cGFuZGVkLmZpbmRWaWV3QnlJZChSLmlkLm9uZ29pbmdUaXRsZSk7Ci0gICAgICAgIG1PbmdvaW5nSXRlbXMgPSAoTGluZWFyTGF5b3V0KWV4cGFuZGVkLmZpbmRWaWV3QnlJZChSLmlkLm9uZ29pbmdJdGVtcyk7Ci0gICAgICAgIG1MYXRlc3RUaXRsZSA9IChUZXh0VmlldylleHBhbmRlZC5maW5kVmlld0J5SWQoUi5pZC5sYXRlc3RUaXRsZSk7Ci0gICAgICAgIG1MYXRlc3RJdGVtcyA9IChMaW5lYXJMYXlvdXQpZXhwYW5kZWQuZmluZFZpZXdCeUlkKFIuaWQubGF0ZXN0SXRlbXMpOwotICAgICAgICBtTm9Ob3RpZmljYXRpb25zVGl0bGUgPSAoVGV4dFZpZXcpZXhwYW5kZWQuZmluZFZpZXdCeUlkKFIuaWQubm9Ob3RpZmljYXRpb25zVGl0bGUpOwotICAgICAgICBtQ2xlYXJCdXR0b24gPSAoVGV4dFZpZXcpZXhwYW5kZWQuZmluZFZpZXdCeUlkKFIuaWQuY2xlYXJfYWxsX2J1dHRvbik7Ci0gICAgICAgIG1DbGVhckJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobUNsZWFyQnV0dG9uTGlzdGVuZXIpOwotICAgICAgICBtU2Nyb2xsVmlldyA9IChTY3JvbGxWaWV3KWV4cGFuZGVkLmZpbmRWaWV3QnlJZChSLmlkLnNjcm9sbCk7Ci0gICAgICAgIG1Ob3RpZmljYXRpb25MaW5lYXJMYXlvdXQgPSBleHBhbmRlZC5maW5kVmlld0J5SWQoUi5pZC5ub3RpZmljYXRpb25MaW5lYXJMYXlvdXQpOwotCi0gICAgICAgIG1PbmdvaW5nVGl0bGUuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICBtTGF0ZXN0VGl0bGUuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotCi0gICAgICAgIG1UaWNrZXIgPSBuZXcgTXlUaWNrZXIoY29udGV4dCwgc2IpOwotCi0gICAgICAgIFRpY2tlclZpZXcgdGlja2VyVmlldyA9IChUaWNrZXJWaWV3KXNiLmZpbmRWaWV3QnlJZChSLmlkLnRpY2tlclRleHQpOwotICAgICAgICB0aWNrZXJWaWV3Lm1UaWNrZXIgPSBtVGlja2VyOwotCi0gICAgICAgIG1UcmFja2luZ1ZpZXcgPSAoVHJhY2tpbmdWaWV3KVZpZXcuaW5mbGF0ZShjb250ZXh0LCBSLmxheW91dC5zdGF0dXNfYmFyX3RyYWNraW5nLCBudWxsKTsKLSAgICAgICAgbVRyYWNraW5nVmlldy5tU2VydmljZSA9IHRoaXM7Ci0gICAgICAgIG1DbG9zZVZpZXcgPSAoQ2xvc2VEcmFnSGFuZGxlKW1UcmFja2luZ1ZpZXcuZmluZFZpZXdCeUlkKFIuaWQuY2xvc2UpOwotICAgICAgICBtQ2xvc2VWaWV3Lm1TZXJ2aWNlID0gdGhpczsKLQotICAgICAgICBtRWRnZUJvcmRlciA9IHJlcy5nZXREaW1lbnNpb25QaXhlbFNpemUoUi5kaW1lbi5zdGF0dXNfYmFyX2VkZ2VfaWdub3JlKTsKLQotICAgICAgICAvLyB0aGUgbW9yZSBub3RpZmljYXRpb25zIGljb24KLSAgICAgICAgU3RhdHVzQmFySWNvblZpZXcgbW9yZVZpZXcgPSBuZXcgU3RhdHVzQmFySWNvblZpZXcodGhpcywgIm1vcmUiKTsKLSAgICAgICAgbW9yZVZpZXcuc2V0KG5ldyBTdGF0dXNCYXJJY29uKG51bGwsIFIuZHJhd2FibGUuc3RhdF9ub3RpZnlfbW9yZSwgMCkpOwotICAgICAgICBtTm90aWZpY2F0aW9uSWNvbnMuYWRkTW9yZVZpZXcobW9yZVZpZXcsCi0gICAgICAgICAgICAgICAgbmV3IExpbmVhckxheW91dC5MYXlvdXRQYXJhbXMobUljb25TaXplLCBtSWNvblNpemUpKTsKLQotICAgICAgICAvLyBzZXQgdGhlIGluaXRhbCB2aWV3IHZpc2liaWxpdHkKLSAgICAgICAgc2V0QXJlVGhlcmVOb3RpZmljYXRpb25zKCk7Ci0gICAgICAgIG1EYXRlVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuSU5WSVNJQkxFKTsKLQotICAgICAgICAvLyByZWNlaXZlIGJyb2FkY2FzdHMKLSAgICAgICAgSW50ZW50RmlsdGVyIGZpbHRlciA9IG5ldyBJbnRlbnRGaWx0ZXIoKTsKLSAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihJbnRlbnQuQUNUSU9OX0NPTkZJR1VSQVRJT05fQ0hBTkdFRCk7Ci0gICAgICAgIGZpbHRlci5hZGRBY3Rpb24oSW50ZW50LkFDVElPTl9DTE9TRV9TWVNURU1fRElBTE9HUyk7Ci0gICAgICAgIGZpbHRlci5hZGRBY3Rpb24oSW50ZW50LkFDVElPTl9TQ1JFRU5fT0ZGKTsKLSAgICAgICAgY29udGV4dC5yZWdpc3RlclJlY2VpdmVyKG1Ccm9hZGNhc3RSZWNlaXZlciwgZmlsdGVyKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBhZGRTdGF0dXNCYXJWaWV3KCkgewotICAgICAgICBSZXNvdXJjZXMgcmVzID0gZ2V0UmVzb3VyY2VzKCk7CisgICAgICAgIGZpbmFsIFJlc291cmNlcyByZXMgPSBnZXRSZXNvdXJjZXMoKTsKICAgICAgICAgZmluYWwgaW50IGhlaWdodD0gcmVzLmdldERpbWVuc2lvblBpeGVsU2l6ZShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmRpbWVuLnN0YXR1c19iYXJfaGVpZ2h0KTsKIAotICAgICAgICBmaW5hbCBTdGF0dXNCYXJWaWV3IHZpZXcgPSBtU3RhdHVzQmFyVmlldzsKLSAgICAgICAgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMgbHAgPSBuZXcgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMoCisgICAgICAgIGZpbmFsIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zIGxwID0gbmV3IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zKAogICAgICAgICAgICAgICAgIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5ULAogICAgICAgICAgICAgICAgIGhlaWdodCwKICAgICAgICAgICAgICAgICBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5UWVBFX1NUQVRVU19CQVIsCiAgICAgICAgICAgICAgICAgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19OT1RfRk9DVVNBQkxFCiAgICAgICAgICAgICAgICAgICAgIHwgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19UT1VDSEFCTEVfV0hFTl9XQUtJTkcsCiAgICAgICAgICAgICAgICAgUGl4ZWxGb3JtYXQuUkdCWF84ODg4KTsKLSAgICAgICAgbHAuZ3Jhdml0eSA9IEdyYXZpdHkuVE9QIHwgR3Jhdml0eS5GSUxMX0hPUklaT05UQUw7CisgICAgICAgIGxwLmdyYXZpdHkgPSBnZXRTdGF0dXNCYXJHcmF2aXR5KCk7CiAgICAgICAgIGxwLnNldFRpdGxlKCJTdGF0dXNCYXIiKTsKICAgICAgICAgLy8gVE9ETyBscC53aW5kb3dBbmltYXRpb25zID0gUi5zdHlsZS5BbmltYXRpb25fU3RhdHVzQmFyOworICAgICAgICBXaW5kb3dNYW5hZ2VySW1wbC5nZXREZWZhdWx0KCkuYWRkVmlldyhzYiwgbHApOwogCi0gICAgICAgIFdpbmRvd01hbmFnZXJJbXBsLmdldERlZmF1bHQoKS5hZGRWaWV3KHZpZXcsIGxwKTsKLQotICAgICAgICBscCA9IG5ldyBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcygKLSAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCwKLSAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCwKLSAgICAgICAgICAgICAgICBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5UWVBFX1NUQVRVU19CQVJfUEFORUwsCi0gICAgICAgICAgICAgICAgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19MQVlPVVRfSU5fU0NSRUVOCi0gICAgICAgICAgICAgICAgICAgIHwgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19MQVlPVVRfTk9fTElNSVRTCi0gICAgICAgICAgICAgICAgICAgIHwgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19OT1RfVE9VQ0hfTU9EQUwKLSAgICAgICAgICAgICAgICAgICAgfCBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX05PVF9GT0NVU0FCTEUKLSAgICAgICAgICAgICAgICAgICAgfCBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX0FMVF9GT0NVU0FCTEVfSU0sCi0gICAgICAgICAgICAgICAgUGl4ZWxGb3JtYXQuVFJBTlNMVUNFTlQpOwotICAgICAgICBscC5ncmF2aXR5ID0gR3Jhdml0eS5UT1AgfCBHcmF2aXR5LkZJTExfSE9SSVpPTlRBTDsKLSAgICAgICAgbHAueSArPSBoZWlnaHQgKiAxLjU7IC8vIEZJWE1FCi0gICAgICAgIGxwLnNldFRpdGxlKCJJbnRydWRlckFsZXJ0Iik7Ci0gICAgICAgIGxwLndpbmRvd0FuaW1hdGlvbnMgPSBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlLkFuaW1hdGlvbl9TdGF0dXNCYXJfSW50cnVkZXJBbGVydDsKLQotICAgICAgICBXaW5kb3dNYW5hZ2VySW1wbC5nZXREZWZhdWx0KCkuYWRkVmlldyhtSW50cnVkZXJBbGVydFZpZXcsIGxwKTsKKyAgICAgICAgU2xvZy5kKFRBRywgIkFkZGVkIHN0YXR1cyBiYXIgdmlldyB3LyBncmF2aXR5IDB4IiArIEludGVnZXIudG9IZXhTdHJpbmcobHAuZ3Jhdml0eSkpOwogICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZEljb24oU3RyaW5nIHNsb3QsIGludCBpbmRleCwgaW50IHZpZXdJbmRleCwgU3RhdHVzQmFySWNvbiBpY29uKSB7Ci0gICAgICAgIGlmIChTUEVXKSBTbG9nLmQoVEFHLCAiYWRkSWNvbiBzbG90PSIgKyBzbG90ICsgIiBpbmRleD0iICsgaW5kZXggKyAiIHZpZXdJbmRleD0iICsgdmlld0luZGV4Ci0gICAgICAgICAgICAgICAgKyAiIGljb249IiArIGljb24pOwotICAgICAgICBTdGF0dXNCYXJJY29uVmlldyB2aWV3ID0gbmV3IFN0YXR1c0Jhckljb25WaWV3KHRoaXMsIHNsb3QpOwotICAgICAgICB2aWV3LnNldChpY29uKTsKLSAgICAgICAgbVN0YXR1c0ljb25zLmFkZFZpZXcodmlldywgdmlld0luZGV4LCBuZXcgTGluZWFyTGF5b3V0LkxheW91dFBhcmFtcyhtSWNvblNpemUsIG1JY29uU2l6ZSkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHVwZGF0ZUljb24oU3RyaW5nIHNsb3QsIGludCBpbmRleCwgaW50IHZpZXdJbmRleCwKLSAgICAgICAgICAgIFN0YXR1c0Jhckljb24gb2xkLCBTdGF0dXNCYXJJY29uIGljb24pIHsKLSAgICAgICAgaWYgKFNQRVcpIFNsb2cuZChUQUcsICJ1cGRhdGVJY29uIHNsb3Q9IiArIHNsb3QgKyAiIGluZGV4PSIgKyBpbmRleCArICIgdmlld0luZGV4PSIgKyB2aWV3SW5kZXgKLSAgICAgICAgICAgICAgICArICIgb2xkPSIgKyBvbGQgKyAiIGljb249IiArIGljb24pOwotICAgICAgICBTdGF0dXNCYXJJY29uVmlldyB2aWV3ID0gKFN0YXR1c0Jhckljb25WaWV3KW1TdGF0dXNJY29ucy5nZXRDaGlsZEF0KHZpZXdJbmRleCk7Ci0gICAgICAgIHZpZXcuc2V0KGljb24pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZUljb24oU3RyaW5nIHNsb3QsIGludCBpbmRleCwgaW50IHZpZXdJbmRleCkgewotICAgICAgICBpZiAoU1BFVykgU2xvZy5kKFRBRywgInJlbW92ZUljb24gc2xvdD0iICsgc2xvdCArICIgaW5kZXg9IiArIGluZGV4ICsgIiB2aWV3SW5kZXg9IiArIHZpZXdJbmRleCk7Ci0gICAgICAgIG1TdGF0dXNJY29ucy5yZW1vdmVWaWV3QXQodmlld0luZGV4KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGROb3RpZmljYXRpb24oSUJpbmRlciBrZXksIFN0YXR1c0Jhck5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLSAgICAgICAgU3RhdHVzQmFySWNvblZpZXcgaWNvblZpZXcgPSBhZGROb3RpZmljYXRpb25WaWV3cyhrZXksIG5vdGlmaWNhdGlvbik7Ci0gICAgICAgIGlmIChpY29uVmlldyA9PSBudWxsKSByZXR1cm47Ci0KLSAgICAgICAgYm9vbGVhbiBpbW1lcnNpdmUgPSBmYWxzZTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGltbWVyc2l2ZSA9IEFjdGl2aXR5TWFuYWdlck5hdGl2ZS5nZXREZWZhdWx0KCkuaXNUb3BBY3Rpdml0eUltbWVyc2l2ZSgpOwotICAgICAgICAgICAgU2xvZy5kKFRBRywgIlRvcCBhY3Rpdml0eSBpcyAiICsgKGltbWVyc2l2ZT8iaW1tZXJzaXZlIjoibm90IGltbWVyc2l2ZSIpKTsKLSAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGltbWVyc2l2ZSkgewotICAgICAgICAgICAgaWYgKChub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLmZsYWdzICYgTm90aWZpY2F0aW9uLkZMQUdfSElHSF9QUklPUklUWSkgIT0gMCkgewotICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJQcmVzZW50aW5nIGhpZ2gtcHJpb3JpdHkgbm90aWZpY2F0aW9uIGluIGltbWVyc2l2ZSBhY3Rpdml0eSIpOwotICAgICAgICAgICAgICAgIC8vIEBAQCBzcGVjaWFsIG5ldyB0cmFuc2llbnQgdGlja2VyIG1vZGUKLSAgICAgICAgICAgICAgICAvLyAxLiBQb3B1bGF0ZSBtSW50cnVkZXJBbGVydFZpZXcKLQotICAgICAgICAgICAgICAgIEltYWdlVmlldyBhbGVydEljb24gPSAoSW1hZ2VWaWV3KSBtSW50cnVkZXJBbGVydFZpZXcuZmluZFZpZXdCeUlkKFIuaWQuYWxlcnRJY29uKTsKLSAgICAgICAgICAgICAgICBUZXh0VmlldyBhbGVydFRleHQgPSAoVGV4dFZpZXcpIG1JbnRydWRlckFsZXJ0Vmlldy5maW5kVmlld0J5SWQoUi5pZC5hbGVydFRleHQpOwotICAgICAgICAgICAgICAgIGFsZXJ0SWNvbi5zZXRJbWFnZURyYXdhYmxlKFN0YXR1c0Jhckljb25WaWV3LmdldEljb24oCi0gICAgICAgICAgICAgICAgICAgIGFsZXJ0SWNvbi5nZXRDb250ZXh0KCksCi0gICAgICAgICAgICAgICAgICAgIGljb25WaWV3LmdldFN0YXR1c0Jhckljb24oKSkpOwotICAgICAgICAgICAgICAgIGFsZXJ0VGV4dC5zZXRUZXh0KG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24udGlja2VyVGV4dCk7Ci0KLSAgICAgICAgICAgICAgICBWaWV3IGJ1dHRvbiA9IG1JbnRydWRlckFsZXJ0Vmlldy5maW5kVmlld0J5SWQoUi5pZC5pbnRydWRlcl9hbGVydF9jb250ZW50KTsKLSAgICAgICAgICAgICAgICBidXR0b24uc2V0T25DbGlja0xpc3RlbmVyKAotICAgICAgICAgICAgICAgICAgICBuZXcgTGF1bmNoZXIobm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi5jb250ZW50SW50ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uLnBrZywgbm90aWZpY2F0aW9uLnRhZywgbm90aWZpY2F0aW9uLmlkKSk7Ci0KLSAgICAgICAgICAgICAgICAvLyAyLiBBbmltYXRlIG1JbnRydWRlckFsZXJ0VmlldyBpbgotICAgICAgICAgICAgICAgIG1IYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2UoTVNHX1NIT1dfSU5UUlVERVIpOwotCi0gICAgICAgICAgICAgICAgLy8gMy4gU2V0IGFsYXJtIHRvIGFnZSB0aGUgbm90aWZpY2F0aW9uIG9mZiAoVE9ETykKLSAgICAgICAgICAgICAgICBtSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhNU0dfSElERV9JTlRSVURFUik7Ci0gICAgICAgICAgICAgICAgbUhhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZURlbGF5ZWQoTVNHX0hJREVfSU5UUlVERVIsIElOVFJVREVSX0FMRVJUX0RFQ0FZX01TKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLmZ1bGxTY3JlZW5JbnRlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gbm90IGltbWVyc2l2ZSAmIGEgZnVsbC1zY3JlZW4gYWxlcnQgc2hvdWxkIGJlIHNob3duCi0gICAgICAgICAgICBTbG9nLmQoVEFHLCAiTm90aWZpY2F0aW9uIGhhcyBmdWxsU2NyZWVuSW50ZW50IGFuZCBhY3Rpdml0eSBpcyBub3QgaW1tZXJzaXZlOyIKLSAgICAgICAgICAgICAgICAgICAgKyAiIHNlbmRpbmcgZnVsbFNjcmVlbkludGVudCIpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLmZ1bGxTY3JlZW5JbnRlbnQuc2VuZCgpOwotICAgICAgICAgICAgfSBjYXRjaCAoUGVuZGluZ0ludGVudC5DYW5jZWxlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyB1c3VhbCBjYXNlOiBzdGF0dXMgYmFyIHZpc2libGUgJiBub3QgaW1tZXJzaXZlCi0KLSAgICAgICAgICAgIC8vIHNob3cgdGhlIHRpY2tlcgotICAgICAgICAgICAgdGljayhub3RpZmljYXRpb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gUmVjYWxjdWxhdGUgdGhlIHBvc2l0aW9uIG9mIHRoZSBzbGlkaW5nIHdpbmRvd3MgYW5kIHRoZSB0aXRsZXMuCi0gICAgICAgIHNldEFyZVRoZXJlTm90aWZpY2F0aW9ucygpOwotICAgICAgICB1cGRhdGVFeHBhbmRlZFZpZXdQb3MoRVhQQU5ERURfTEVBVkVfQUxPTkUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHVwZGF0ZU5vdGlmaWNhdGlvbihJQmluZGVyIGtleSwgU3RhdHVzQmFyTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotICAgICAgICBTbG9nLmQoVEFHLCAidXBkYXRlTm90aWZpY2F0aW9uIGtleT0iICsga2V5ICsgIiBub3RpZmljYXRpb249IiArIG5vdGlmaWNhdGlvbik7Ci0KLSAgICAgICAgTm90aWZpY2F0aW9uRGF0YSBvbGRMaXN0OwotICAgICAgICBpbnQgb2xkSW5kZXggPSBtT25nb2luZy5maW5kRW50cnkoa2V5KTsKLSAgICAgICAgaWYgKG9sZEluZGV4ID49IDApIHsKLSAgICAgICAgICAgIG9sZExpc3QgPSBtT25nb2luZzsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG9sZEluZGV4ID0gbUxhdGVzdC5maW5kRW50cnkoa2V5KTsKLSAgICAgICAgICAgIGlmIChvbGRJbmRleCA8IDApIHsKLSAgICAgICAgICAgICAgICBTbG9nLncoVEFHLCAidXBkYXRlTm90aWZpY2F0aW9uIGZvciB1bmtub3duIGtleTogIiArIGtleSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgb2xkTGlzdCA9IG1MYXRlc3Q7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgTm90aWZpY2F0aW9uRGF0YS5FbnRyeSBvbGRFbnRyeSA9IG9sZExpc3QuZ2V0RW50cnlBdChvbGRJbmRleCk7Ci0gICAgICAgIGZpbmFsIFN0YXR1c0Jhck5vdGlmaWNhdGlvbiBvbGROb3RpZmljYXRpb24gPSBvbGRFbnRyeS5ub3RpZmljYXRpb247Ci0gICAgICAgIGZpbmFsIFJlbW90ZVZpZXdzIG9sZENvbnRlbnRWaWV3ID0gb2xkTm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi5jb250ZW50VmlldzsKLQotICAgICAgICBmaW5hbCBSZW1vdGVWaWV3cyBjb250ZW50VmlldyA9IG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24uY29udGVudFZpZXc7Ci0KLSAgICAgICAgaWYgKGZhbHNlKSB7Ci0gICAgICAgICAgICBTbG9nLmQoVEFHLCAib2xkIG5vdGlmaWNhdGlvbjogd2hlbj0iICsgb2xkTm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi53aGVuCi0gICAgICAgICAgICAgICAgICAgICsgIiBvbmdvaW5nPSIgKyBvbGROb3RpZmljYXRpb24uaXNPbmdvaW5nKCkKLSAgICAgICAgICAgICAgICAgICAgKyAiIGV4cGFuZGVkPSIgKyBvbGRFbnRyeS5leHBhbmRlZAotICAgICAgICAgICAgICAgICAgICArICIgY29udGVudFZpZXc9IiArIG9sZENvbnRlbnRWaWV3KTsKLSAgICAgICAgICAgIFNsb2cuZChUQUcsICJuZXcgbm90aWZpY2F0aW9uOiB3aGVuPSIgKyBub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLndoZW4KLSAgICAgICAgICAgICAgICAgICAgKyAiIG9uZ29pbmc9IiArIG9sZE5vdGlmaWNhdGlvbi5pc09uZ29pbmcoKQotICAgICAgICAgICAgICAgICAgICArICIgY29udGVudFZpZXc9IiArIGNvbnRlbnRWaWV3KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIENhbiB3ZSBqdXN0IHJlYXBwbHkgdGhlIFJlbW90ZVZpZXdzIGluIHBsYWNlPyAgSWYgd2hlbiBkaWRuJ3QgY2hhbmdlLCB0aGUgb3JkZXIKLSAgICAgICAgLy8gZGlkbid0IGNoYW5nZS4KLSAgICAgICAgaWYgKG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24ud2hlbiA9PSBvbGROb3RpZmljYXRpb24ubm90aWZpY2F0aW9uLndoZW4KLSAgICAgICAgICAgICAgICAmJiBub3RpZmljYXRpb24uaXNPbmdvaW5nKCkgPT0gb2xkTm90aWZpY2F0aW9uLmlzT25nb2luZygpCi0gICAgICAgICAgICAgICAgJiYgb2xkRW50cnkuZXhwYW5kZWQgIT0gbnVsbAotICAgICAgICAgICAgICAgICYmIGNvbnRlbnRWaWV3ICE9IG51bGwgJiYgb2xkQ29udGVudFZpZXcgIT0gbnVsbAotICAgICAgICAgICAgICAgICYmIGNvbnRlbnRWaWV3LmdldFBhY2thZ2UoKSAhPSBudWxsCi0gICAgICAgICAgICAgICAgJiYgb2xkQ29udGVudFZpZXcuZ2V0UGFja2FnZSgpICE9IG51bGwKLSAgICAgICAgICAgICAgICAmJiBvbGRDb250ZW50Vmlldy5nZXRQYWNrYWdlKCkuZXF1YWxzKGNvbnRlbnRWaWV3LmdldFBhY2thZ2UoKSkKLSAgICAgICAgICAgICAgICAmJiBvbGRDb250ZW50Vmlldy5nZXRMYXlvdXRJZCgpID09IGNvbnRlbnRWaWV3LmdldExheW91dElkKCkpIHsKLSAgICAgICAgICAgIGlmIChTUEVXKSBTbG9nLmQoVEFHLCAicmV1c2luZyBub3RpZmljYXRpb24iKTsKLSAgICAgICAgICAgIG9sZEVudHJ5Lm5vdGlmaWNhdGlvbiA9IG5vdGlmaWNhdGlvbjsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgLy8gUmVhcHBseSB0aGUgUmVtb3RlVmlld3MKLSAgICAgICAgICAgICAgICBjb250ZW50Vmlldy5yZWFwcGx5KHRoaXMsIG9sZEVudHJ5LmNvbnRlbnQpOwotICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgY29udGVudEludGVudAotICAgICAgICAgICAgICAgIGZpbmFsIFBlbmRpbmdJbnRlbnQgY29udGVudEludGVudCA9IG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24uY29udGVudEludGVudDsKLSAgICAgICAgICAgICAgICBpZiAoY29udGVudEludGVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG9sZEVudHJ5LmNvbnRlbnQuc2V0T25DbGlja0xpc3RlbmVyKG5ldyBMYXVuY2hlcihjb250ZW50SW50ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb24ucGtnLCBub3RpZmljYXRpb24udGFnLCBub3RpZmljYXRpb24uaWQpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBpY29uLgotICAgICAgICAgICAgICAgIGZpbmFsIFN0YXR1c0Jhckljb24gaWMgPSBuZXcgU3RhdHVzQmFySWNvbihub3RpZmljYXRpb24ucGtnLAotICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi5pY29uLCBub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLmljb25MZXZlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24ubnVtYmVyKTsKLSAgICAgICAgICAgICAgICBpZiAoIW9sZEVudHJ5Lmljb24uc2V0KGljKSkgewotICAgICAgICAgICAgICAgICAgICBoYW5kbGVOb3RpZmljYXRpb25FcnJvcihrZXksIG5vdGlmaWNhdGlvbiwgIkNvdWxkbid0IHVwZGF0ZSBpY29uOiAiICsgaWMpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIEl0IGZhaWxlZCB0byBhZGQgY2xlYW5seS4gIExvZywgYW5kIHJlbW92ZSB0aGUgdmlldyBmcm9tIHRoZSBwYW5lbC4KLSAgICAgICAgICAgICAgICBTbG9nLncoVEFHLCAiQ291bGRuJ3QgcmVhcHBseSB2aWV3cyBmb3IgcGFja2FnZSAiICsgY29udGVudFZpZXcuZ2V0UGFja2FnZSgpLCBlKTsKLSAgICAgICAgICAgICAgICByZW1vdmVOb3RpZmljYXRpb25WaWV3cyhrZXkpOwotICAgICAgICAgICAgICAgIGFkZE5vdGlmaWNhdGlvblZpZXdzKGtleSwgbm90aWZpY2F0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChTUEVXKSBTbG9nLmQoVEFHLCAibm90IHJldXNpbmcgbm90aWZpY2F0aW9uIik7Ci0gICAgICAgICAgICByZW1vdmVOb3RpZmljYXRpb25WaWV3cyhrZXkpOwotICAgICAgICAgICAgYWRkTm90aWZpY2F0aW9uVmlld3Moa2V5LCBub3RpZmljYXRpb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gUmVzdGFydCB0aGUgdGlja2VyIGlmIGl0J3Mgc3RpbGwgcnVubmluZwotICAgICAgICB0aWNrKG5vdGlmaWNhdGlvbik7Ci0KLSAgICAgICAgLy8gUmVjYWxjdWxhdGUgdGhlIHBvc2l0aW9uIG9mIHRoZSBzbGlkaW5nIHdpbmRvd3MgYW5kIHRoZSB0aXRsZXMuCi0gICAgICAgIHNldEFyZVRoZXJlTm90aWZpY2F0aW9ucygpOwotICAgICAgICB1cGRhdGVFeHBhbmRlZFZpZXdQb3MoRVhQQU5ERURfTEVBVkVfQUxPTkUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZU5vdGlmaWNhdGlvbihJQmluZGVyIGtleSkgewotICAgICAgICBpZiAoU1BFVykgU2xvZy5kKFRBRywgInJlbW92ZU5vdGlmaWNhdGlvbiBrZXk9IiArIGtleSk7Ci0gICAgICAgIFN0YXR1c0Jhck5vdGlmaWNhdGlvbiBvbGQgPSByZW1vdmVOb3RpZmljYXRpb25WaWV3cyhrZXkpOwotCi0gICAgICAgIGlmIChvbGQgIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gQ2FuY2VsIHRoZSB0aWNrZXIgaWYgaXQncyBzdGlsbCBydW5uaW5nCi0gICAgICAgICAgICBtVGlja2VyLnJlbW92ZUVudHJ5KG9sZCk7Ci0KLSAgICAgICAgICAgIC8vIFJlY2FsY3VsYXRlIHRoZSBwb3NpdGlvbiBvZiB0aGUgc2xpZGluZyB3aW5kb3dzIGFuZCB0aGUgdGl0bGVzLgotICAgICAgICAgICAgc2V0QXJlVGhlcmVOb3RpZmljYXRpb25zKCk7Ci0gICAgICAgICAgICB1cGRhdGVFeHBhbmRlZFZpZXdQb3MoRVhQQU5ERURfTEVBVkVfQUxPTkUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgY2hvb3NlSWNvbkluZGV4KGJvb2xlYW4gaXNPbmdvaW5nLCBpbnQgdmlld0luZGV4KSB7Ci0gICAgICAgIGZpbmFsIGludCBsYXRlc3RTaXplID0gbUxhdGVzdC5zaXplKCk7Ci0gICAgICAgIGlmIChpc09uZ29pbmcpIHsKLSAgICAgICAgICAgIHJldHVybiBsYXRlc3RTaXplICsgKG1PbmdvaW5nLnNpemUoKSAtIHZpZXdJbmRleCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbGF0ZXN0U2l6ZSAtIHZpZXdJbmRleDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIFZpZXdbXSBtYWtlTm90aWZpY2F0aW9uVmlldyhTdGF0dXNCYXJOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uLCBWaWV3R3JvdXAgcGFyZW50KSB7Ci0gICAgICAgIE5vdGlmaWNhdGlvbiBuID0gbm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbjsKLSAgICAgICAgUmVtb3RlVmlld3MgcmVtb3RlVmlld3MgPSBuLmNvbnRlbnRWaWV3OwotICAgICAgICBpZiAocmVtb3RlVmlld3MgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBjcmVhdGUgdGhlIHJvdyB2aWV3Ci0gICAgICAgIExheW91dEluZmxhdGVyIGluZmxhdGVyID0gKExheW91dEluZmxhdGVyKWdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5MQVlPVVRfSU5GTEFURVJfU0VSVklDRSk7Ci0gICAgICAgIFZpZXcgcm93ID0gaW5mbGF0ZXIuaW5mbGF0ZShSLmxheW91dC5zdGF0dXNfYmFyX2xhdGVzdF9ldmVudCwgcGFyZW50LCBmYWxzZSk7Ci0KLSAgICAgICAgLy8gYmluZCB0aGUgY2xpY2sgZXZlbnQgdG8gdGhlIGNvbnRlbnQgYXJlYQotICAgICAgICBWaWV3R3JvdXAgY29udGVudCA9IChWaWV3R3JvdXApcm93LmZpbmRWaWV3QnlJZChSLmlkLmNvbnRlbnQpOwotICAgICAgICBjb250ZW50LnNldERlc2NlbmRhbnRGb2N1c2FiaWxpdHkoVmlld0dyb3VwLkZPQ1VTX0JMT0NLX0RFU0NFTkRBTlRTKTsKLSAgICAgICAgY29udGVudC5zZXRPbkZvY3VzQ2hhbmdlTGlzdGVuZXIobUZvY3VzQ2hhbmdlTGlzdGVuZXIpOwotICAgICAgICBQZW5kaW5nSW50ZW50IGNvbnRlbnRJbnRlbnQgPSBuLmNvbnRlbnRJbnRlbnQ7Ci0gICAgICAgIGlmIChjb250ZW50SW50ZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGNvbnRlbnQuc2V0T25DbGlja0xpc3RlbmVyKG5ldyBMYXVuY2hlcihjb250ZW50SW50ZW50LCBub3RpZmljYXRpb24ucGtnLAotICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uLnRhZywgbm90aWZpY2F0aW9uLmlkKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBWaWV3IGV4cGFuZGVkID0gbnVsbDsKLSAgICAgICAgRXhjZXB0aW9uIGV4Y2VwdGlvbiA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBleHBhbmRlZCA9IHJlbW90ZVZpZXdzLmFwcGx5KHRoaXMsIGNvbnRlbnQpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGV4Y2VwdGlvbiA9IGU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGV4cGFuZGVkID09IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZyBpZGVudCA9IG5vdGlmaWNhdGlvbi5wa2cgKyAiLzB4IiArIEludGVnZXIudG9IZXhTdHJpbmcobm90aWZpY2F0aW9uLmlkKTsKLSAgICAgICAgICAgIFNsb2cuZShUQUcsICJjb3VsZG4ndCBpbmZsYXRlIHZpZXcgZm9yIG5vdGlmaWNhdGlvbiAiICsgaWRlbnQsIGV4Y2VwdGlvbik7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNvbnRlbnQuYWRkVmlldyhleHBhbmRlZCk7Ci0gICAgICAgICAgICByb3cuc2V0RHJhd2luZ0NhY2hlRW5hYmxlZCh0cnVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBuZXcgVmlld1tdIHsgcm93LCBjb250ZW50LCBleHBhbmRlZCB9OwotICAgIH0KLQotICAgIFN0YXR1c0Jhckljb25WaWV3IGFkZE5vdGlmaWNhdGlvblZpZXdzKElCaW5kZXIga2V5LCBTdGF0dXNCYXJOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0gICAgICAgIE5vdGlmaWNhdGlvbkRhdGEgbGlzdDsKLSAgICAgICAgVmlld0dyb3VwIHBhcmVudDsKLSAgICAgICAgZmluYWwgYm9vbGVhbiBpc09uZ29pbmcgPSBub3RpZmljYXRpb24uaXNPbmdvaW5nKCk7Ci0gICAgICAgIGlmIChpc09uZ29pbmcpIHsKLSAgICAgICAgICAgIGxpc3QgPSBtT25nb2luZzsKLSAgICAgICAgICAgIHBhcmVudCA9IG1PbmdvaW5nSXRlbXM7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBsaXN0ID0gbUxhdGVzdDsKLSAgICAgICAgICAgIHBhcmVudCA9IG1MYXRlc3RJdGVtczsKLSAgICAgICAgfQotICAgICAgICAvLyBDb25zdHJ1Y3QgdGhlIGV4cGFuZGVkIHZpZXcuCi0gICAgICAgIGZpbmFsIFZpZXdbXSB2aWV3cyA9IG1ha2VOb3RpZmljYXRpb25WaWV3KG5vdGlmaWNhdGlvbiwgcGFyZW50KTsKLSAgICAgICAgaWYgKHZpZXdzID09IG51bGwpIHsKLSAgICAgICAgICAgIGhhbmRsZU5vdGlmaWNhdGlvbkVycm9yKGtleSwgbm90aWZpY2F0aW9uLCAiQ291bGRuJ3QgZXhwYW5kIFJlbW90ZVZpZXdzIGZvcjogIgotICAgICAgICAgICAgICAgICAgICArIG5vdGlmaWNhdGlvbik7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBWaWV3IHJvdyA9IHZpZXdzWzBdOwotICAgICAgICBmaW5hbCBWaWV3IGNvbnRlbnQgPSB2aWV3c1sxXTsKLSAgICAgICAgZmluYWwgVmlldyBleHBhbmRlZCA9IHZpZXdzWzJdOwotICAgICAgICAvLyBDb25zdHJ1Y3QgdGhlIGljb24uCi0gICAgICAgIGZpbmFsIFN0YXR1c0Jhckljb25WaWV3IGljb25WaWV3ID0gbmV3IFN0YXR1c0Jhckljb25WaWV3KHRoaXMsCi0gICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uLnBrZyArICIvMHgiICsgSW50ZWdlci50b0hleFN0cmluZyhub3RpZmljYXRpb24uaWQpKTsKLSAgICAgICAgZmluYWwgU3RhdHVzQmFySWNvbiBpYyA9IG5ldyBTdGF0dXNCYXJJY29uKG5vdGlmaWNhdGlvbi5wa2csIG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24uaWNvbiwKLSAgICAgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi5pY29uTGV2ZWwsIG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24ubnVtYmVyKTsKLSAgICAgICAgaWYgKCFpY29uVmlldy5zZXQoaWMpKSB7Ci0gICAgICAgICAgICBoYW5kbGVOb3RpZmljYXRpb25FcnJvcihrZXksIG5vdGlmaWNhdGlvbiwgIkNvdWxkaW5nIGNyZWF0ZSBpY29uOiAiICsgaWMpOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gQWRkIHRoZSBleHBhbmRlZCB2aWV3LgotICAgICAgICBmaW5hbCBpbnQgdmlld0luZGV4ID0gbGlzdC5hZGQoa2V5LCBub3RpZmljYXRpb24sIHJvdywgY29udGVudCwgZXhwYW5kZWQsIGljb25WaWV3KTsKLSAgICAgICAgcGFyZW50LmFkZFZpZXcocm93LCB2aWV3SW5kZXgpOwotICAgICAgICAvLyBBZGQgdGhlIGljb24uCi0gICAgICAgIGZpbmFsIGludCBpY29uSW5kZXggPSBjaG9vc2VJY29uSW5kZXgoaXNPbmdvaW5nLCB2aWV3SW5kZXgpOwotICAgICAgICBtTm90aWZpY2F0aW9uSWNvbnMuYWRkVmlldyhpY29uVmlldywgaWNvbkluZGV4LAotICAgICAgICAgICAgICAgIG5ldyBMaW5lYXJMYXlvdXQuTGF5b3V0UGFyYW1zKG1JY29uU2l6ZSwgbUljb25TaXplKSk7Ci0gICAgICAgIHJldHVybiBpY29uVmlldzsKLSAgICB9Ci0KLSAgICBTdGF0dXNCYXJOb3RpZmljYXRpb24gcmVtb3ZlTm90aWZpY2F0aW9uVmlld3MoSUJpbmRlciBrZXkpIHsKLSAgICAgICAgTm90aWZpY2F0aW9uRGF0YS5FbnRyeSBlbnRyeSA9IG1PbmdvaW5nLnJlbW92ZShrZXkpOwotICAgICAgICBpZiAoZW50cnkgPT0gbnVsbCkgewotICAgICAgICAgICAgZW50cnkgPSBtTGF0ZXN0LnJlbW92ZShrZXkpOwotICAgICAgICAgICAgaWYgKGVudHJ5ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBTbG9nLncoVEFHLCAicmVtb3ZlTm90aWZpY2F0aW9uIGZvciB1bmtub3duIGtleTogIiArIGtleSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8gUmVtb3ZlIHRoZSBleHBhbmRlZCB2aWV3LgotICAgICAgICAoKFZpZXdHcm91cCllbnRyeS5yb3cuZ2V0UGFyZW50KCkpLnJlbW92ZVZpZXcoZW50cnkucm93KTsKLSAgICAgICAgLy8gUmVtb3ZlIHRoZSBpY29uLgotICAgICAgICAoKFZpZXdHcm91cCllbnRyeS5pY29uLmdldFBhcmVudCgpKS5yZW1vdmVWaWV3KGVudHJ5Lmljb24pOwotCi0gICAgICAgIHJldHVybiBlbnRyeS5ub3RpZmljYXRpb247Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNldEFyZVRoZXJlTm90aWZpY2F0aW9ucygpIHsKLSAgICAgICAgYm9vbGVhbiBvbmdvaW5nID0gbU9uZ29pbmcuaGFzVmlzaWJsZUl0ZW1zKCk7Ci0gICAgICAgIGJvb2xlYW4gbGF0ZXN0ID0gbUxhdGVzdC5oYXNWaXNpYmxlSXRlbXMoKTsKLQotICAgICAgICAvLyAobm8gb25nb2luZyBub3RpZmljYXRpb25zIGFyZSBjbGVhcmFibGUpCi0gICAgICAgIGlmIChtTGF0ZXN0Lmhhc0NsZWFyYWJsZUl0ZW1zKCkpIHsKLSAgICAgICAgICAgIG1DbGVhckJ1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtQ2xlYXJCdXR0b24uc2V0VmlzaWJpbGl0eShWaWV3LklOVklTSUJMRSk7Ci0gICAgICAgIH0KLQotICAgICAgICBtT25nb2luZ1RpdGxlLnNldFZpc2liaWxpdHkob25nb2luZyA/IFZpZXcuVklTSUJMRSA6IFZpZXcuR09ORSk7Ci0gICAgICAgIG1MYXRlc3RUaXRsZS5zZXRWaXNpYmlsaXR5KGxhdGVzdCA/IFZpZXcuVklTSUJMRSA6IFZpZXcuR09ORSk7Ci0KLSAgICAgICAgaWYgKG9uZ29pbmcgfHwgbGF0ZXN0KSB7Ci0gICAgICAgICAgICBtTm9Ob3RpZmljYXRpb25zVGl0bGUuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbU5vTm90aWZpY2F0aW9uc1RpdGxlLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogU3RhdGUgaXMgb25lIG9yIG1vcmUgb2YgdGhlIERJU0FCTEUgY29uc3RhbnRzIGZyb20gU3RhdHVzQmFyTWFuYWdlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkaXNhYmxlKGludCBzdGF0ZSkgewotICAgICAgICBmaW5hbCBpbnQgb2xkID0gbURpc2FibGVkOwotICAgICAgICBmaW5hbCBpbnQgZGlmZiA9IHN0YXRlIF4gb2xkOwotICAgICAgICBtRGlzYWJsZWQgPSBzdGF0ZTsKLQotICAgICAgICBpZiAoKGRpZmYgJiBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfRVhQQU5EKSAhPSAwKSB7Ci0gICAgICAgICAgICBpZiAoKHN0YXRlICYgU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX0VYUEFORCkgIT0gMCkgewotICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJESVNBQkxFX0VYUEFORDogeWVzIik7Ci0gICAgICAgICAgICAgICAgYW5pbWF0ZUNvbGxhcHNlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKChkaWZmICYgU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX05PVElGSUNBVElPTl9JQ09OUykgIT0gMCkgewotICAgICAgICAgICAgaWYgKChzdGF0ZSAmIFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9OT1RJRklDQVRJT05fSUNPTlMpICE9IDApIHsKLSAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAiRElTQUJMRV9OT1RJRklDQVRJT05fSUNPTlM6IHllcyIpOwotICAgICAgICAgICAgICAgIGlmIChtVGlja2luZykgewotICAgICAgICAgICAgICAgICAgICBtVGlja2VyLmhhbHQoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBzZXROb3RpZmljYXRpb25JY29uVmlzaWJpbGl0eShmYWxzZSwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hbmltLmZhZGVfb3V0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJESVNBQkxFX05PVElGSUNBVElPTl9JQ09OUzogbm8iKTsKLSAgICAgICAgICAgICAgICBpZiAoIW1FeHBhbmRlZFZpc2libGUpIHsKLSAgICAgICAgICAgICAgICAgICAgc2V0Tm90aWZpY2F0aW9uSWNvblZpc2liaWxpdHkodHJ1ZSwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hbmltLmZhZGVfaW4pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmICgoZGlmZiAmIFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9OT1RJRklDQVRJT05fVElDS0VSKSAhPSAwKSB7Ci0gICAgICAgICAgICBpZiAobVRpY2tpbmcgJiYgKHN0YXRlICYgU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX05PVElGSUNBVElPTl9USUNLRVIpICE9IDApIHsKLSAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAiRElTQUJMRV9OT1RJRklDQVRJT05fVElDS0VSOiB5ZXMiKTsKLSAgICAgICAgICAgICAgICBtVGlja2VyLmhhbHQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFsbCBjaGFuZ2VzIHRvIHRoZSBzdGF0dXMgYmFyIGFuZCBub3RpZmljYXRpb25zIGZ1bm5lbCB0aHJvdWdoIGhlcmUgYW5kIGFyZSBiYXRjaGVkLgotICAgICAqLwotICAgIHByaXZhdGUgY2xhc3MgSCBleHRlbmRzIEhhbmRsZXIgewotICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbSkgewotICAgICAgICAgICAgc3dpdGNoIChtLndoYXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIE1TR19BTklNQVRFOgotICAgICAgICAgICAgICAgICAgICBkb0FuaW1hdGlvbigpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIE1TR19BTklNQVRFX1JFVkVBTDoKLSAgICAgICAgICAgICAgICAgICAgZG9SZXZlYWxBbmltYXRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBNU0dfU0hPV19JTlRSVURFUjoKLSAgICAgICAgICAgICAgICAgICAgc2V0SW50cnVkZXJBbGVydFZpc2liaWxpdHkodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgTVNHX0hJREVfSU5UUlVERVI6Ci0gICAgICAgICAgICAgICAgICAgIHNldEludHJ1ZGVyQWxlcnRWaXNpYmlsaXR5KGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBWaWV3Lk9uRm9jdXNDaGFuZ2VMaXN0ZW5lciBtRm9jdXNDaGFuZ2VMaXN0ZW5lciA9IG5ldyBWaWV3Lk9uRm9jdXNDaGFuZ2VMaXN0ZW5lcigpIHsKLSAgICAgICAgcHVibGljIHZvaWQgb25Gb2N1c0NoYW5nZShWaWV3IHYsIGJvb2xlYW4gaGFzRm9jdXMpIHsKLSAgICAgICAgICAgIC8vIEJlY2F1c2UgJ3YnIGlzIGEgVmlld0dyb3VwLCBhbGwgaXRzIGNoaWxkcmVuIHdpbGwgYmUgKHVuKXNlbGVjdGVkCi0gICAgICAgICAgICAvLyB0b28sIHdoaWNoIGFsbG93cyBtYXJxdWVlaW5nIHRvIHdvcmsuCi0gICAgICAgICAgICB2LnNldFNlbGVjdGVkKGhhc0ZvY3VzKTsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBwcml2YXRlIHZvaWQgbWFrZUV4cGFuZGVkVmlzaWJsZSgpIHsKLSAgICAgICAgaWYgKFNQRVcpIFNsb2cuZChUQUcsICJNYWtlIGV4cGFuZGVkIHZpc2libGU6IGV4cGFuZGVkIHZpc2libGU9IiArIG1FeHBhbmRlZFZpc2libGUpOwotICAgICAgICBpZiAobUV4cGFuZGVkVmlzaWJsZSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIG1FeHBhbmRlZFZpc2libGUgPSB0cnVlOwotICAgICAgICB2aXNpYmlsaXR5Q2hhbmdlZCh0cnVlKTsKLQotICAgICAgICB1cGRhdGVFeHBhbmRlZFZpZXdQb3MoRVhQQU5ERURfTEVBVkVfQUxPTkUpOwotICAgICAgICBtRXhwYW5kZWRQYXJhbXMuZmxhZ3MgJj0gfldpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfTk9UX0ZPQ1VTQUJMRTsKLSAgICAgICAgbUV4cGFuZGVkUGFyYW1zLmZsYWdzIHw9IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfQUxUX0ZPQ1VTQUJMRV9JTTsKLSAgICAgICAgbUV4cGFuZGVkRGlhbG9nLmdldFdpbmRvdygpLnNldEF0dHJpYnV0ZXMobUV4cGFuZGVkUGFyYW1zKTsKLSAgICAgICAgbUV4cGFuZGVkVmlldy5yZXF1ZXN0Rm9jdXMoVmlldy5GT0NVU19GT1JXQVJEKTsKLSAgICAgICAgbVRyYWNraW5nVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0KLSAgICAgICAgaWYgKCFtVGlja2luZykgewotICAgICAgICAgICAgc2V0RGF0ZVZpZXdWaXNpYmlsaXR5KHRydWUsIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYW5pbS5mYWRlX2luKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFuaW1hdGVFeHBhbmQoKSB7Ci0gICAgICAgIGlmIChTUEVXKSBTbG9nLmQoVEFHLCAiQW5pbWF0ZSBleHBhbmQ6IGV4cGFuZGVkPSIgKyBtRXhwYW5kZWQpOwotICAgICAgICBpZiAoKG1EaXNhYmxlZCAmIFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9FWFBBTkQpICE9IDApIHsKLSAgICAgICAgICAgIHJldHVybiA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1FeHBhbmRlZCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJlcGFyZVRyYWNraW5nKDAsIHRydWUpOwotICAgICAgICBwZXJmb3JtRmxpbmcoMCwgMjAwMC4wZiwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYW5pbWF0ZUNvbGxhcHNlKCkgewotICAgICAgICBpZiAoU1BFVykgewotICAgICAgICAgICAgU2xvZy5kKFRBRywgImFuaW1hdGVDb2xsYXBzZSgpOiBtRXhwYW5kZWQ9IiArIG1FeHBhbmRlZAotICAgICAgICAgICAgICAgICAgICArICIgbUV4cGFuZGVkVmlzaWJsZT0iICsgbUV4cGFuZGVkVmlzaWJsZQotICAgICAgICAgICAgICAgICAgICArICIgbUV4cGFuZGVkPSIgKyBtRXhwYW5kZWQKLSAgICAgICAgICAgICAgICAgICAgKyAiIG1BbmltYXRpbmc9IiArIG1BbmltYXRpbmcKLSAgICAgICAgICAgICAgICAgICAgKyAiIG1BbmltWT0iICsgbUFuaW1ZCi0gICAgICAgICAgICAgICAgICAgICsgIiBtQW5pbVZlbD0iICsgbUFuaW1WZWwpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFtRXhwYW5kZWRWaXNpYmxlKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgeTsKLSAgICAgICAgaWYgKG1BbmltYXRpbmcpIHsKLSAgICAgICAgICAgIHkgPSAoaW50KW1BbmltWTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHkgPSBtRGlzcGxheS5nZXRIZWlnaHQoKS0xOwotICAgICAgICB9Ci0gICAgICAgIC8vIExldCB0aGUgZmxpbmcgdGhpbmsgdGhhdCB3ZSdyZSBvcGVuIHNvIGl0IGdvZXMgaW4gdGhlIHJpZ2h0IGRpcmVjdGlvbgotICAgICAgICAvLyBhbmQgZG9lc24ndCB0cnkgdG8gcmUtb3BlbiB0aGUgd2luZG93c2hhZGUuCi0gICAgICAgIG1FeHBhbmRlZCA9IHRydWU7Ci0gICAgICAgIHByZXBhcmVUcmFja2luZyh5LCBmYWxzZSk7Ci0gICAgICAgIHBlcmZvcm1GbGluZyh5LCAtMjAwMC4wZiwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgdm9pZCBwZXJmb3JtRXhwYW5kKCkgewotICAgICAgICBpZiAoU1BFVykgU2xvZy5kKFRBRywgInBlcmZvcm1FeHBhbmQ6IG1FeHBhbmRlZD0iICsgbUV4cGFuZGVkKTsKLSAgICAgICAgaWYgKChtRGlzYWJsZWQgJiBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfRVhQQU5EKSAhPSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtRXhwYW5kZWQpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIG1FeHBhbmRlZCA9IHRydWU7Ci0gICAgICAgIG1ha2VFeHBhbmRlZFZpc2libGUoKTsKLSAgICAgICAgdXBkYXRlRXhwYW5kZWRWaWV3UG9zKEVYUEFOREVEX0ZVTExfT1BFTik7Ci0KLSAgICAgICAgaWYgKGZhbHNlKSBwb3N0U3RhcnRUcmFjaW5nKCk7Ci0gICAgfQotCi0gICAgdm9pZCBwZXJmb3JtQ29sbGFwc2UoKSB7Ci0gICAgICAgIGlmIChTUEVXKSBTbG9nLmQoVEFHLCAicGVyZm9ybUNvbGxhcHNlOiBtRXhwYW5kZWQ9IiArIG1FeHBhbmRlZAotICAgICAgICAgICAgICAgICsgIiBtRXhwYW5kZWRWaXNpYmxlPSIgKyBtRXhwYW5kZWRWaXNpYmxlCi0gICAgICAgICAgICAgICAgKyAiIG1UaWNraW5nPSIgKyBtVGlja2luZyk7Ci0KLSAgICAgICAgaWYgKCFtRXhwYW5kZWRWaXNpYmxlKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgbUV4cGFuZGVkVmlzaWJsZSA9IGZhbHNlOwotICAgICAgICB2aXNpYmlsaXR5Q2hhbmdlZChmYWxzZSk7Ci0gICAgICAgIG1FeHBhbmRlZFBhcmFtcy5mbGFncyB8PSBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX05PVF9GT0NVU0FCTEU7Ci0gICAgICAgIG1FeHBhbmRlZFBhcmFtcy5mbGFncyAmPSB+V2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19BTFRfRk9DVVNBQkxFX0lNOwotICAgICAgICBtRXhwYW5kZWREaWFsb2cuZ2V0V2luZG93KCkuc2V0QXR0cmlidXRlcyhtRXhwYW5kZWRQYXJhbXMpOwotICAgICAgICBtVHJhY2tpbmdWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLQotICAgICAgICBpZiAoKG1EaXNhYmxlZCAmIFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9OT1RJRklDQVRJT05fSUNPTlMpID09IDApIHsKLSAgICAgICAgICAgIHNldE5vdGlmaWNhdGlvbkljb25WaXNpYmlsaXR5KHRydWUsIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYW5pbS5mYWRlX2luKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobURhdGVWaWV3LmdldFZpc2liaWxpdHkoKSA9PSBWaWV3LlZJU0lCTEUpIHsKLSAgICAgICAgICAgIHNldERhdGVWaWV3VmlzaWJpbGl0eShmYWxzZSwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hbmltLmZhZGVfb3V0KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghbUV4cGFuZGVkKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgbUV4cGFuZGVkID0gZmFsc2U7Ci0gICAgfQotCi0gICAgdm9pZCBkb0FuaW1hdGlvbigpIHsKLSAgICAgICAgaWYgKG1BbmltYXRpbmcpIHsKLSAgICAgICAgICAgIGlmIChTUEVXKSBTbG9nLmQoVEFHLCAiZG9BbmltYXRpb24iKTsKLSAgICAgICAgICAgIGlmIChTUEVXKSBTbG9nLmQoVEFHLCAiZG9BbmltYXRpb24gYmVmb3JlIG1BbmltWT0iICsgbUFuaW1ZKTsKLSAgICAgICAgICAgIGluY3JlbWVudEFuaW0oKTsKLSAgICAgICAgICAgIGlmIChTUEVXKSBTbG9nLmQoVEFHLCAiZG9BbmltYXRpb24gYWZ0ZXIgIG1BbmltWT0iICsgbUFuaW1ZKTsKLSAgICAgICAgICAgIGlmIChtQW5pbVkgPj0gbURpc3BsYXkuZ2V0SGVpZ2h0KCktMSkgewotICAgICAgICAgICAgICAgIGlmIChTUEVXKSBTbG9nLmQoVEFHLCAiQW5pbWF0aW9uIGNvbXBsZXRlZCB0byBleHBhbmRlZCBzdGF0ZS4iKTsKLSAgICAgICAgICAgICAgICBtQW5pbWF0aW5nID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgdXBkYXRlRXhwYW5kZWRWaWV3UG9zKEVYUEFOREVEX0ZVTExfT1BFTik7Ci0gICAgICAgICAgICAgICAgcGVyZm9ybUV4cGFuZCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAobUFuaW1ZIDwgbVN0YXR1c0JhclZpZXcuZ2V0SGVpZ2h0KCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoU1BFVykgU2xvZy5kKFRBRywgIkFuaW1hdGlvbiBjb21wbGV0ZWQgdG8gY29sbGFwc2VkIHN0YXRlLiIpOwotICAgICAgICAgICAgICAgIG1BbmltYXRpbmcgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB1cGRhdGVFeHBhbmRlZFZpZXdQb3MoMCk7Ci0gICAgICAgICAgICAgICAgcGVyZm9ybUNvbGxhcHNlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICB1cGRhdGVFeHBhbmRlZFZpZXdQb3MoKGludCltQW5pbVkpOwotICAgICAgICAgICAgICAgIG1DdXJBbmltYXRpb25UaW1lICs9IEFOSU1fRlJBTUVfRFVSQVRJT047Ci0gICAgICAgICAgICAgICAgbUhhbmRsZXIuc2VuZE1lc3NhZ2VBdFRpbWUobUhhbmRsZXIub2J0YWluTWVzc2FnZShNU0dfQU5JTUFURSksIG1DdXJBbmltYXRpb25UaW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgc3RvcFRyYWNraW5nKCkgewotICAgICAgICBtVHJhY2tpbmcgPSBmYWxzZTsKLSAgICAgICAgbVZlbG9jaXR5VHJhY2tlci5yZWN5Y2xlKCk7Ci0gICAgICAgIG1WZWxvY2l0eVRyYWNrZXIgPSBudWxsOwotICAgIH0KLQotICAgIHZvaWQgaW5jcmVtZW50QW5pbSgpIHsKLSAgICAgICAgbG9uZyBub3cgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKLSAgICAgICAgZmxvYXQgdCA9ICgoZmxvYXQpKG5vdyAtIG1BbmltTGFzdFRpbWUpKSAvIDEwMDA7ICAgICAgICAgICAgLy8gbXMgLT4gcwotICAgICAgICBmaW5hbCBmbG9hdCB5ID0gbUFuaW1ZOwotICAgICAgICBmaW5hbCBmbG9hdCB2ID0gbUFuaW1WZWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBweC9zCi0gICAgICAgIGZpbmFsIGZsb2F0IGEgPSBtQW5pbUFjY2VsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHB4L3MvcwotICAgICAgICBtQW5pbVkgPSB5ICsgKHYqdCkgKyAoMC41ZiphKnQqdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBweAotICAgICAgICBtQW5pbVZlbCA9IHYgKyAoYSp0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBweC9zCi0gICAgICAgIG1BbmltTGFzdFRpbWUgPSBub3c7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1zCi0gICAgICAgIC8vU2xvZy5kKFRBRywgInk9IiArIHkgKyAiIHY9IiArIHYgKyAiIGE9IiArIGEgKyAiIHQ9IiArIHQgKyAiIG1BbmltWT0iICsgbUFuaW1ZCi0gICAgICAgIC8vICAgICAgICArICIgbUFuaW1BY2NlbD0iICsgbUFuaW1BY2NlbCk7Ci0gICAgfQotCi0gICAgdm9pZCBkb1JldmVhbEFuaW1hdGlvbigpIHsKLSAgICAgICAgZmluYWwgaW50IGggPSBtQ2xvc2VWaWV3LmdldEhlaWdodCgpICsgbVN0YXR1c0JhclZpZXcuZ2V0SGVpZ2h0KCk7Ci0gICAgICAgIGlmIChtQW5pbWF0aW5nUmV2ZWFsICYmIG1BbmltYXRpbmcgJiYgbUFuaW1ZIDwgaCkgewotICAgICAgICAgICAgaW5jcmVtZW50QW5pbSgpOwotICAgICAgICAgICAgaWYgKG1BbmltWSA+PSBoKSB7Ci0gICAgICAgICAgICAgICAgbUFuaW1ZID0gaDsKLSAgICAgICAgICAgICAgICB1cGRhdGVFeHBhbmRlZFZpZXdQb3MoKGludCltQW5pbVkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB1cGRhdGVFeHBhbmRlZFZpZXdQb3MoKGludCltQW5pbVkpOwotICAgICAgICAgICAgICAgIG1DdXJBbmltYXRpb25UaW1lICs9IEFOSU1fRlJBTUVfRFVSQVRJT047Ci0gICAgICAgICAgICAgICAgbUhhbmRsZXIuc2VuZE1lc3NhZ2VBdFRpbWUobUhhbmRsZXIub2J0YWluTWVzc2FnZShNU0dfQU5JTUFURV9SRVZFQUwpLAotICAgICAgICAgICAgICAgICAgICAgICAgbUN1ckFuaW1hdGlvblRpbWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBwcmVwYXJlVHJhY2tpbmcoaW50IHksIGJvb2xlYW4gb3BlbmluZykgewotICAgICAgICBtVHJhY2tpbmcgPSB0cnVlOwotICAgICAgICBtVmVsb2NpdHlUcmFja2VyID0gVmVsb2NpdHlUcmFja2VyLm9idGFpbigpOwotICAgICAgICBpZiAob3BlbmluZykgewotICAgICAgICAgICAgbUFuaW1BY2NlbCA9IDIwMDAuMGY7Ci0gICAgICAgICAgICBtQW5pbVZlbCA9IDIwMDsKLSAgICAgICAgICAgIG1BbmltWSA9IG1TdGF0dXNCYXJWaWV3LmdldEhlaWdodCgpOwotICAgICAgICAgICAgdXBkYXRlRXhwYW5kZWRWaWV3UG9zKChpbnQpbUFuaW1ZKTsKLSAgICAgICAgICAgIG1BbmltYXRpbmcgPSB0cnVlOwotICAgICAgICAgICAgbUFuaW1hdGluZ1JldmVhbCA9IHRydWU7Ci0gICAgICAgICAgICBtSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhNU0dfQU5JTUFURSk7Ci0gICAgICAgICAgICBtSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhNU0dfQU5JTUFURV9SRVZFQUwpOwotICAgICAgICAgICAgbG9uZyBub3cgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgIG1BbmltTGFzdFRpbWUgPSBub3c7Ci0gICAgICAgICAgICBtQ3VyQW5pbWF0aW9uVGltZSA9IG5vdyArIEFOSU1fRlJBTUVfRFVSQVRJT047Ci0gICAgICAgICAgICBtQW5pbWF0aW5nID0gdHJ1ZTsKLSAgICAgICAgICAgIG1IYW5kbGVyLnNlbmRNZXNzYWdlQXRUaW1lKG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoTVNHX0FOSU1BVEVfUkVWRUFMKSwKLSAgICAgICAgICAgICAgICAgICAgbUN1ckFuaW1hdGlvblRpbWUpOwotICAgICAgICAgICAgbWFrZUV4cGFuZGVkVmlzaWJsZSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gaXQncyBvcGVuLCBjbG9zZSBpdD8KLSAgICAgICAgICAgIGlmIChtQW5pbWF0aW5nKSB7Ci0gICAgICAgICAgICAgICAgbUFuaW1hdGluZyA9IGZhbHNlOwotICAgICAgICAgICAgICAgIG1IYW5kbGVyLnJlbW92ZU1lc3NhZ2VzKE1TR19BTklNQVRFKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHVwZGF0ZUV4cGFuZGVkVmlld1Bvcyh5ICsgbVZpZXdEZWx0YSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIHBlcmZvcm1GbGluZyhpbnQgeSwgZmxvYXQgdmVsLCBib29sZWFuIGFsd2F5cykgewotICAgICAgICBtQW5pbWF0aW5nUmV2ZWFsID0gZmFsc2U7Ci0gICAgICAgIG1EaXNwbGF5SGVpZ2h0ID0gbURpc3BsYXkuZ2V0SGVpZ2h0KCk7Ci0KLSAgICAgICAgbUFuaW1ZID0geTsKLSAgICAgICAgbUFuaW1WZWwgPSB2ZWw7Ci0KLSAgICAgICAgLy9TbG9nLmQoVEFHLCAic3RhcnRpbmcgd2l0aCBtQW5pbVk9IiArIG1BbmltWSArICIgbUFuaW1WZWw9IiArIG1BbmltVmVsKTsKLQotICAgICAgICBpZiAobUV4cGFuZGVkKSB7Ci0gICAgICAgICAgICBpZiAoIWFsd2F5cyAmJiAoCi0gICAgICAgICAgICAgICAgICAgIHZlbCA+IDIwMC4wZgotICAgICAgICAgICAgICAgICAgICB8fCAoeSA+IChtRGlzcGxheUhlaWdodC0yNSkgJiYgdmVsID4gLTIwMC4wZikpKSB7Ci0gICAgICAgICAgICAgICAgLy8gV2UgYXJlIGV4cGFuZGVkLCBidXQgdGhleSBkaWRuJ3QgbW92ZSBzdWZmaWNpZW50bHkgdG8gY2F1c2UKLSAgICAgICAgICAgICAgICAvLyB1cyB0byByZXRyYWN0LiAgQW5pbWF0ZSBiYWNrIHRvIHRoZSBleHBhbmRlZCBwb3NpdGlvbi4KLSAgICAgICAgICAgICAgICBtQW5pbUFjY2VsID0gMjAwMC4wZjsKLSAgICAgICAgICAgICAgICBpZiAodmVsIDwgMCkgewotICAgICAgICAgICAgICAgICAgICBtQW5pbVZlbCA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gV2UgYXJlIGV4cGFuZGVkIGFuZCBhcmUgbm93IGdvaW5nIHRvIGFuaW1hdGUgYXdheS4KLSAgICAgICAgICAgICAgICBtQW5pbUFjY2VsID0gLTIwMDAuMGY7Ci0gICAgICAgICAgICAgICAgaWYgKHZlbCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbUFuaW1WZWwgPSAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChhbHdheXMgfHwgKAotICAgICAgICAgICAgICAgICAgICB2ZWwgPiAyMDAuMGYKLSAgICAgICAgICAgICAgICAgICAgfHwgKHkgPiAobURpc3BsYXlIZWlnaHQvMikgJiYgdmVsID4gLTIwMC4wZikpKSB7Ci0gICAgICAgICAgICAgICAgLy8gV2UgYXJlIGNvbGxhcHNlZCwgYW5kIHRoZXkgbW92ZWQgZW5vdWdoIHRvIGFsbG93IHVzIHRvCi0gICAgICAgICAgICAgICAgLy8gZXhwYW5kLiAgQW5pbWF0ZSBpbiB0aGUgbm90aWZpY2F0aW9ucy4KLSAgICAgICAgICAgICAgICBtQW5pbUFjY2VsID0gMjAwMC4wZjsKLSAgICAgICAgICAgICAgICBpZiAodmVsIDwgMCkgewotICAgICAgICAgICAgICAgICAgICBtQW5pbVZlbCA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gV2UgYXJlIGNvbGxhcHNlZCwgYnV0IHRoZXkgZGlkbid0IG1vdmUgc3VmZmljaWVudGx5IHRvIGNhdXNlCi0gICAgICAgICAgICAgICAgLy8gdXMgdG8gcmV0cmFjdC4gIEFuaW1hdGUgYmFjayB0byB0aGUgY29sbGFwc2VkIHBvc2l0aW9uLgotICAgICAgICAgICAgICAgIG1BbmltQWNjZWwgPSAtMjAwMC4wZjsKLSAgICAgICAgICAgICAgICBpZiAodmVsID4gMCkgewotICAgICAgICAgICAgICAgICAgICBtQW5pbVZlbCA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vU2xvZy5kKFRBRywgIm1BbmltWT0iICsgbUFuaW1ZICsgIiBtQW5pbVZlbD0iICsgbUFuaW1WZWwKLSAgICAgICAgLy8gICAgICAgICsgIiBtQW5pbUFjY2VsPSIgKyBtQW5pbUFjY2VsKTsKLQotICAgICAgICBsb25nIG5vdyA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOwotICAgICAgICBtQW5pbUxhc3RUaW1lID0gbm93OwotICAgICAgICBtQ3VyQW5pbWF0aW9uVGltZSA9IG5vdyArIEFOSU1fRlJBTUVfRFVSQVRJT047Ci0gICAgICAgIG1BbmltYXRpbmcgPSB0cnVlOwotICAgICAgICBtSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhNU0dfQU5JTUFURSk7Ci0gICAgICAgIG1IYW5kbGVyLnJlbW92ZU1lc3NhZ2VzKE1TR19BTklNQVRFX1JFVkVBTCk7Ci0gICAgICAgIG1IYW5kbGVyLnNlbmRNZXNzYWdlQXRUaW1lKG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoTVNHX0FOSU1BVEUpLCBtQ3VyQW5pbWF0aW9uVGltZSk7Ci0gICAgICAgIHN0b3BUcmFja2luZygpOwotICAgIH0KLQotICAgIGJvb2xlYW4gaW50ZXJjZXB0VG91Y2hFdmVudChNb3Rpb25FdmVudCBldmVudCkgewotICAgICAgICBpZiAoU1BFVykgewotICAgICAgICAgICAgU2xvZy5kKFRBRywgIlRvdWNoOiByYXdZPSIgKyBldmVudC5nZXRSYXdZKCkgKyAiIGV2ZW50PSIgKyBldmVudCArICIgbURpc2FibGVkPSIKLSAgICAgICAgICAgICAgICArIG1EaXNhYmxlZCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoKG1EaXNhYmxlZCAmIFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9FWFBBTkQpICE9IDApIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIGludCBzdGF0dXNCYXJTaXplID0gbVN0YXR1c0JhclZpZXcuZ2V0SGVpZ2h0KCk7Ci0gICAgICAgIGZpbmFsIGludCBoaXRTaXplID0gc3RhdHVzQmFyU2l6ZSoyOwotICAgICAgICBpZiAoZXZlbnQuZ2V0QWN0aW9uKCkgPT0gTW90aW9uRXZlbnQuQUNUSU9OX0RPV04pIHsKLSAgICAgICAgICAgIGZpbmFsIGludCB5ID0gKGludClldmVudC5nZXRSYXdZKCk7Ci0KLSAgICAgICAgICAgIGlmICghbUV4cGFuZGVkKSB7Ci0gICAgICAgICAgICAgICAgbVZpZXdEZWx0YSA9IHN0YXR1c0JhclNpemUgLSB5OwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtVHJhY2tpbmdWaWV3LmdldExvY2F0aW9uT25TY3JlZW4obUFic1Bvcyk7Ci0gICAgICAgICAgICAgICAgbVZpZXdEZWx0YSA9IG1BYnNQb3NbMV0gKyBtVHJhY2tpbmdWaWV3LmdldEhlaWdodCgpIC0geTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICgoIW1FeHBhbmRlZCAmJiB5IDwgaGl0U2l6ZSkgfHwKLSAgICAgICAgICAgICAgICAgICAgKG1FeHBhbmRlZCAmJiB5ID4gKG1EaXNwbGF5LmdldEhlaWdodCgpLWhpdFNpemUpKSkgewotCi0gICAgICAgICAgICAgICAgLy8gV2UgZHJvcCBldmVudHMgYXQgdGhlIGVkZ2Ugb2YgdGhlIHNjcmVlbiB0byBtYWtlIHRoZSB3aW5kb3dzaGFkZSBjb21lCi0gICAgICAgICAgICAgICAgLy8gZG93biBieSBhY2NpZGVudCBsZXNzLCBlc3BlY2lhbGx5IHdoZW4gcHVzaGluZyBvcGVuIGEgZGV2aWNlIHdpdGggYSBrZXlib2FyZAotICAgICAgICAgICAgICAgIC8vIHRoYXQgcm90YXRlcyAobGlrZSBnMSBhbmQgZHJvaWQpCi0gICAgICAgICAgICAgICAgaW50IHggPSAoaW50KWV2ZW50LmdldFJhd1goKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgZWRnZUJvcmRlciA9IG1FZGdlQm9yZGVyOwotICAgICAgICAgICAgICAgIGlmICh4ID49IGVkZ2VCb3JkZXIgJiYgeCA8IG1EaXNwbGF5LmdldFdpZHRoKCkgLSBlZGdlQm9yZGVyKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZXBhcmVUcmFja2luZyh5LCAhbUV4cGFuZGVkKTsvLyBvcGVuaW5nIGlmIHdlJ3JlIG5vdCBhbHJlYWR5IGZ1bGx5IHZpc2libGUKLSAgICAgICAgICAgICAgICAgICAgbVZlbG9jaXR5VHJhY2tlci5hZGRNb3ZlbWVudChldmVudCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKG1UcmFja2luZykgewotICAgICAgICAgICAgbVZlbG9jaXR5VHJhY2tlci5hZGRNb3ZlbWVudChldmVudCk7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgbWluWSA9IHN0YXR1c0JhclNpemUgKyBtQ2xvc2VWaWV3LmdldEhlaWdodCgpOwotICAgICAgICAgICAgaWYgKGV2ZW50LmdldEFjdGlvbigpID09IE1vdGlvbkV2ZW50LkFDVElPTl9NT1ZFKSB7Ci0gICAgICAgICAgICAgICAgaW50IHkgPSAoaW50KWV2ZW50LmdldFJhd1koKTsKLSAgICAgICAgICAgICAgICBpZiAobUFuaW1hdGluZ1JldmVhbCAmJiB5IDwgbWluWSkgewotICAgICAgICAgICAgICAgICAgICAvLyBub3RoaW5nCi0gICAgICAgICAgICAgICAgfSBlbHNlICB7Ci0gICAgICAgICAgICAgICAgICAgIG1BbmltYXRpbmdSZXZlYWwgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgdXBkYXRlRXhwYW5kZWRWaWV3UG9zKHkgKyBtVmlld0RlbHRhKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmdldEFjdGlvbigpID09IE1vdGlvbkV2ZW50LkFDVElPTl9VUCkgewotICAgICAgICAgICAgICAgIG1WZWxvY2l0eVRyYWNrZXIuY29tcHV0ZUN1cnJlbnRWZWxvY2l0eSgxMDAwKTsKLQotICAgICAgICAgICAgICAgIGZsb2F0IHlWZWwgPSBtVmVsb2NpdHlUcmFja2VyLmdldFlWZWxvY2l0eSgpOwotICAgICAgICAgICAgICAgIGJvb2xlYW4gbmVnYXRpdmUgPSB5VmVsIDwgMDsKLQotICAgICAgICAgICAgICAgIGZsb2F0IHhWZWwgPSBtVmVsb2NpdHlUcmFja2VyLmdldFhWZWxvY2l0eSgpOwotICAgICAgICAgICAgICAgIGlmICh4VmVsIDwgMCkgewotICAgICAgICAgICAgICAgICAgICB4VmVsID0gLXhWZWw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICh4VmVsID4gMTUwLjBmKSB7Ci0gICAgICAgICAgICAgICAgICAgIHhWZWwgPSAxNTAuMGY7IC8vIGxpbWl0IGhvdyBtdWNoIHdlIGNhcmUgYWJvdXQgdGhlIHggYXhpcwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGZsb2F0IHZlbCA9IChmbG9hdClNYXRoLmh5cG90KHlWZWwsIHhWZWwpOwotICAgICAgICAgICAgICAgIGlmIChuZWdhdGl2ZSkgewotICAgICAgICAgICAgICAgICAgICB2ZWwgPSAtdmVsOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHBlcmZvcm1GbGluZygoaW50KWV2ZW50LmdldFJhd1koKSwgdmVsLCBmYWxzZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBjbGFzcyBMYXVuY2hlciBpbXBsZW1lbnRzIFZpZXcuT25DbGlja0xpc3RlbmVyIHsKLSAgICAgICAgcHJpdmF0ZSBQZW5kaW5nSW50ZW50IG1JbnRlbnQ7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nIG1Qa2c7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nIG1UYWc7Ci0gICAgICAgIHByaXZhdGUgaW50IG1JZDsKLQotICAgICAgICBMYXVuY2hlcihQZW5kaW5nSW50ZW50IGludGVudCwgU3RyaW5nIHBrZywgU3RyaW5nIHRhZywgaW50IGlkKSB7Ci0gICAgICAgICAgICBtSW50ZW50ID0gaW50ZW50OwotICAgICAgICAgICAgbVBrZyA9IHBrZzsKLSAgICAgICAgICAgIG1UYWcgPSB0YWc7Ci0gICAgICAgICAgICBtSWQgPSBpZDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIC8vIFRoZSBpbnRlbnQgd2UgYXJlIHNlbmRpbmcgaXMgZm9yIHRoZSBhcHBsaWNhdGlvbiwgd2hpY2gKLSAgICAgICAgICAgICAgICAvLyB3b24ndCBoYXZlIHBlcm1pc3Npb24gdG8gaW1tZWRpYXRlbHkgc3RhcnQgYW4gYWN0aXZpdHkgYWZ0ZXIKLSAgICAgICAgICAgICAgICAvLyB0aGUgdXNlciBzd2l0Y2hlcyB0byBob21lLiAgV2Uga25vdyBpdCBpcyBzYWZlIHRvIGRvIGF0IHRoaXMKLSAgICAgICAgICAgICAgICAvLyBwb2ludCwgc28gbWFrZSBzdXJlIG5ldyBhY3Rpdml0eSBzd2l0Y2hlcyBhcmUgbm93IGFsbG93ZWQuCi0gICAgICAgICAgICAgICAgQWN0aXZpdHlNYW5hZ2VyTmF0aXZlLmdldERlZmF1bHQoKS5yZXN1bWVBcHBTd2l0Y2hlcygpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1JbnRlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGludFtdIHBvcyA9IG5ldyBpbnRbMl07Ci0gICAgICAgICAgICAgICAgdi5nZXRMb2NhdGlvbk9uU2NyZWVuKHBvcyk7Ci0gICAgICAgICAgICAgICAgSW50ZW50IG92ZXJsYXkgPSBuZXcgSW50ZW50KCk7Ci0gICAgICAgICAgICAgICAgb3ZlcmxheS5zZXRTb3VyY2VCb3VuZHMoCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgUmVjdChwb3NbMF0sIHBvc1sxXSwgcG9zWzBdK3YuZ2V0V2lkdGgoKSwgcG9zWzFdK3YuZ2V0SGVpZ2h0KCkpKTsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBtSW50ZW50LnNlbmQoU3RhdHVzQmFyU2VydmljZS50aGlzLCAwLCBvdmVybGF5KTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChQZW5kaW5nSW50ZW50LkNhbmNlbGVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHN0YWNrIHRyYWNlIGlzbid0IHZlcnkgaGVscGZ1bCBoZXJlLiAgSnVzdCBsb2cgdGhlIGV4Y2VwdGlvbiBtZXNzYWdlLgotICAgICAgICAgICAgICAgICAgICBTbG9nLncoVEFHLCAiU2VuZGluZyBjb250ZW50SW50ZW50IGZhaWxlZDogIiArIGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBtQmFyU2VydmljZS5vbk5vdGlmaWNhdGlvbkNsaWNrKG1Qa2csIG1UYWcsIG1JZCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICAvLyBzeXN0ZW0gcHJvY2VzcyBpcyBkZWFkIGlmIHdlJ3JlIGhlcmUuCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGNsb3NlIHRoZSBzaGFkZSBpZiBpdCB3YXMgb3BlbgotICAgICAgICAgICAgYW5pbWF0ZUNvbGxhcHNlKCk7Ci0KLSAgICAgICAgICAgIC8vIElmIHRoaXMgY2xpY2sgd2FzIG9uIHRoZSBpbnRydWRlciBhbGVydCwgaGlkZSB0aGF0IGluc3RlYWQKLSAgICAgICAgICAgIG1IYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2UoTVNHX0hJREVfSU5UUlVERVIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRpY2soU3RhdHVzQmFyTm90aWZpY2F0aW9uIG4pIHsKLSAgICAgICAgLy8gU2hvdyB0aGUgdGlja2VyIGlmIG9uZSBpcyByZXF1ZXN0ZWQuIEFsc28gZG9uJ3QgZG8gdGhpcwotICAgICAgICAvLyB1bnRpbCBzdGF0dXMgYmFyIHdpbmRvdyBpcyBhdHRhY2hlZCB0byB0aGUgd2luZG93IG1hbmFnZXIsCi0gICAgICAgIC8vIGJlY2F1c2UuLi4gIHdlbGwsIHdoYXQncyB0aGUgcG9pbnQgb3RoZXJ3aXNlPyAgQW5kIHRyeWluZyB0bwotICAgICAgICAvLyBydW4gYSB0aWNrZXIgd2l0aG91dCBiZWluZyBhdHRhY2hlZCB3aWxsIGNyYXNoIQotICAgICAgICBpZiAobi5ub3RpZmljYXRpb24udGlja2VyVGV4dCAhPSBudWxsICYmIG1TdGF0dXNCYXJWaWV3LmdldFdpbmRvd1Rva2VuKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKDAgPT0gKG1EaXNhYmxlZCAmIChTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfTk9USUZJQ0FUSU9OX0lDT05TCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfTk9USUZJQ0FUSU9OX1RJQ0tFUikpKSB7Ci0gICAgICAgICAgICAgICAgbVRpY2tlci5hZGRFbnRyeShuKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbmNlbCB0aGlzIG5vdGlmaWNhdGlvbiBhbmQgdGVsbCB0aGUgU3RhdHVzQmFyTWFuYWdlclNlcnZpY2UgLyBOb3RpZmljYXRpb25NYW5hZ2VyU2VydmljZQotICAgICAqIGFib3V0IHRoZSBmYWlsdXJlLgotICAgICAqCi0gICAgICogV0FSTklORzogdGhpcyB3aWxsIGNhbGwgYmFjayBpbnRvIHVzLiAgRG9uJ3QgaG9sZCBhbnkgbG9ja3MuCi0gICAgICovCi0gICAgdm9pZCBoYW5kbGVOb3RpZmljYXRpb25FcnJvcihJQmluZGVyIGtleSwgU3RhdHVzQmFyTm90aWZpY2F0aW9uIG4sIFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIHJlbW92ZU5vdGlmaWNhdGlvbihrZXkpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgbUJhclNlcnZpY2Uub25Ob3RpZmljYXRpb25FcnJvcihuLnBrZywgbi50YWcsIG4uaWQsIG4udWlkLCBuLmluaXRpYWxQaWQsIG1lc3NhZ2UpOwotICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIC8vIFRoZSBlbmQgaXMgbmlnaC4KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgTXlUaWNrZXIgZXh0ZW5kcyBUaWNrZXIgewotICAgICAgICBNeVRpY2tlcihDb250ZXh0IGNvbnRleHQsIFN0YXR1c0JhclZpZXcgc2IpIHsKLSAgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIHNiKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICB2b2lkIHRpY2tlclN0YXJ0aW5nKCkgewotICAgICAgICAgICAgaWYgKFNQRVcpIFNsb2cuZChUQUcsICJ0aWNrZXJTdGFydGluZyIpOwotICAgICAgICAgICAgbVRpY2tpbmcgPSB0cnVlOwotICAgICAgICAgICAgbUljb25zLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgIG1UaWNrZXJWaWV3LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgIG1UaWNrZXJWaWV3LnN0YXJ0QW5pbWF0aW9uKGxvYWRBbmltKGNvbS5hbmRyb2lkLmludGVybmFsLlIuYW5pbS5wdXNoX3VwX2luLCBudWxsKSk7Ci0gICAgICAgICAgICBtSWNvbnMuc3RhcnRBbmltYXRpb24obG9hZEFuaW0oY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hbmltLnB1c2hfdXBfb3V0LCBudWxsKSk7Ci0gICAgICAgICAgICBpZiAobUV4cGFuZGVkVmlzaWJsZSkgewotICAgICAgICAgICAgICAgIHNldERhdGVWaWV3VmlzaWJpbGl0eShmYWxzZSwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hbmltLnB1c2hfdXBfb3V0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICB2b2lkIHRpY2tlckRvbmUoKSB7Ci0gICAgICAgICAgICBpZiAoU1BFVykgU2xvZy5kKFRBRywgInRpY2tlckRvbmUiKTsKLSAgICAgICAgICAgIG1UaWNraW5nID0gZmFsc2U7Ci0gICAgICAgICAgICBtSWNvbnMuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgbVRpY2tlclZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgbUljb25zLnN0YXJ0QW5pbWF0aW9uKGxvYWRBbmltKGNvbS5hbmRyb2lkLmludGVybmFsLlIuYW5pbS5wdXNoX2Rvd25faW4sIG51bGwpKTsKLSAgICAgICAgICAgIG1UaWNrZXJWaWV3LnN0YXJ0QW5pbWF0aW9uKGxvYWRBbmltKGNvbS5hbmRyb2lkLmludGVybmFsLlIuYW5pbS5wdXNoX2Rvd25fb3V0LCBudWxsKSk7Ci0gICAgICAgICAgICBpZiAobUV4cGFuZGVkVmlzaWJsZSkgewotICAgICAgICAgICAgICAgIHNldERhdGVWaWV3VmlzaWJpbGl0eSh0cnVlLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmFuaW0ucHVzaF9kb3duX2luKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgdGlja2VySGFsdGluZygpIHsKLSAgICAgICAgICAgIGlmIChTUEVXKSBTbG9nLmQoVEFHLCAidGlja2VySGFsdGluZyIpOwotICAgICAgICAgICAgbVRpY2tpbmcgPSBmYWxzZTsKLSAgICAgICAgICAgIG1JY29ucy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICBtVGlja2VyVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICBtSWNvbnMuc3RhcnRBbmltYXRpb24obG9hZEFuaW0oY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hbmltLmZhZGVfaW4sIG51bGwpKTsKLSAgICAgICAgICAgIG1UaWNrZXJWaWV3LnN0YXJ0QW5pbWF0aW9uKGxvYWRBbmltKGNvbS5hbmRyb2lkLmludGVybmFsLlIuYW5pbS5mYWRlX291dCwgbnVsbCkpOwotICAgICAgICAgICAgaWYgKG1FeHBhbmRlZFZpc2libGUpIHsKLSAgICAgICAgICAgICAgICBzZXREYXRlVmlld1Zpc2liaWxpdHkodHJ1ZSwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hbmltLmZhZGVfaW4pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBBbmltYXRpb24gbG9hZEFuaW0oaW50IGlkLCBBbmltYXRpb24uQW5pbWF0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgQW5pbWF0aW9uIGFuaW0gPSBBbmltYXRpb25VdGlscy5sb2FkQW5pbWF0aW9uKFN0YXR1c0JhclNlcnZpY2UudGhpcywgaWQpOwotICAgICAgICBpZiAobGlzdGVuZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgYW5pbS5zZXRBbmltYXRpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGFuaW07Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB2aWV3SW5mbyhWaWV3IHYpIHsKLSAgICAgICAgcmV0dXJuICIoIiArIHYuZ2V0TGVmdCgpICsgIiwiICsgdi5nZXRUb3AoKSArICIpKCIgKyB2LmdldFJpZ2h0KCkgKyAiLCIgKyB2LmdldEJvdHRvbSgpCi0gICAgICAgICAgICAgICAgKyAiICIgKyB2LmdldFdpZHRoKCkgKyAieCIgKyB2LmdldEhlaWdodCgpICsgIikiOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGR1bXAoRmlsZURlc2NyaXB0b3IgZmQsIFByaW50V3JpdGVyIHB3LCBTdHJpbmdbXSBhcmdzKSB7Ci0gICAgICAgIGlmIChjaGVja0NhbGxpbmdPclNlbGZQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5EVU1QKQotICAgICAgICAgICAgICAgICE9IFBhY2thZ2VNYW5hZ2VyLlBFUk1JU1NJT05fR1JBTlRFRCkgewotICAgICAgICAgICAgcHcucHJpbnRsbigiUGVybWlzc2lvbiBEZW5pYWw6IGNhbid0IGR1bXAgU3RhdHVzQmFyIGZyb20gZnJvbSBwaWQ9IgotICAgICAgICAgICAgICAgICAgICArIEJpbmRlci5nZXRDYWxsaW5nUGlkKCkKLSAgICAgICAgICAgICAgICAgICAgKyAiLCB1aWQ9IiArIEJpbmRlci5nZXRDYWxsaW5nVWlkKCkpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgc3luY2hyb25pemVkIChtUXVldWVMb2NrKSB7Ci0gICAgICAgICAgICBwdy5wcmludGxuKCJDdXJyZW50IFN0YXR1cyBCYXIgc3RhdGU6Iik7Ci0gICAgICAgICAgICBwdy5wcmludGxuKCIgIG1FeHBhbmRlZD0iICsgbUV4cGFuZGVkCi0gICAgICAgICAgICAgICAgICAgICsgIiwgbUV4cGFuZGVkVmlzaWJsZT0iICsgbUV4cGFuZGVkVmlzaWJsZSk7Ci0gICAgICAgICAgICBwdy5wcmludGxuKCIgIG1UaWNraW5nPSIgKyBtVGlja2luZyk7Ci0gICAgICAgICAgICBwdy5wcmludGxuKCIgIG1UcmFja2luZz0iICsgbVRyYWNraW5nKTsKLSAgICAgICAgICAgIHB3LnByaW50bG4oIiAgbUFuaW1hdGluZz0iICsgbUFuaW1hdGluZwotICAgICAgICAgICAgICAgICAgICArICIsIG1BbmltWT0iICsgbUFuaW1ZICsgIiwgbUFuaW1WZWw9IiArIG1BbmltVmVsCi0gICAgICAgICAgICAgICAgICAgICsgIiwgbUFuaW1BY2NlbD0iICsgbUFuaW1BY2NlbCk7Ci0gICAgICAgICAgICBwdy5wcmludGxuKCIgIG1DdXJBbmltYXRpb25UaW1lPSIgKyBtQ3VyQW5pbWF0aW9uVGltZQotICAgICAgICAgICAgICAgICAgICArICIgbUFuaW1MYXN0VGltZT0iICsgbUFuaW1MYXN0VGltZSk7Ci0gICAgICAgICAgICBwdy5wcmludGxuKCIgIG1EaXNwbGF5SGVpZ2h0PSIgKyBtRGlzcGxheUhlaWdodAotICAgICAgICAgICAgICAgICAgICArICIgbUFuaW1hdGluZ1JldmVhbD0iICsgbUFuaW1hdGluZ1JldmVhbAotICAgICAgICAgICAgICAgICAgICArICIgbVZpZXdEZWx0YT0iICsgbVZpZXdEZWx0YSk7Ci0gICAgICAgICAgICBwdy5wcmludGxuKCIgIG1EaXNwbGF5SGVpZ2h0PSIgKyBtRGlzcGxheUhlaWdodCk7Ci0gICAgICAgICAgICBwdy5wcmludGxuKCIgIG1FeHBhbmRlZFBhcmFtczogIiArIG1FeHBhbmRlZFBhcmFtcyk7Ci0gICAgICAgICAgICBwdy5wcmludGxuKCIgIG1FeHBhbmRlZFZpZXc6ICIgKyB2aWV3SW5mbyhtRXhwYW5kZWRWaWV3KSk7Ci0gICAgICAgICAgICBwdy5wcmludGxuKCIgIG1FeHBhbmRlZERpYWxvZzogIiArIG1FeHBhbmRlZERpYWxvZyk7Ci0gICAgICAgICAgICBwdy5wcmludGxuKCIgIG1UcmFja2luZ1BhcmFtczogIiArIG1UcmFja2luZ1BhcmFtcyk7Ci0gICAgICAgICAgICBwdy5wcmludGxuKCIgIG1UcmFja2luZ1ZpZXc6ICIgKyB2aWV3SW5mbyhtVHJhY2tpbmdWaWV3KSk7Ci0gICAgICAgICAgICBwdy5wcmludGxuKCIgIG1PbmdvaW5nVGl0bGU6ICIgKyB2aWV3SW5mbyhtT25nb2luZ1RpdGxlKSk7Ci0gICAgICAgICAgICBwdy5wcmludGxuKCIgIG1PbmdvaW5nSXRlbXM6ICIgKyB2aWV3SW5mbyhtT25nb2luZ0l0ZW1zKSk7Ci0gICAgICAgICAgICBwdy5wcmludGxuKCIgIG1MYXRlc3RUaXRsZTogIiArIHZpZXdJbmZvKG1MYXRlc3RUaXRsZSkpOwotICAgICAgICAgICAgcHcucHJpbnRsbigiICBtTGF0ZXN0SXRlbXM6ICIgKyB2aWV3SW5mbyhtTGF0ZXN0SXRlbXMpKTsKLSAgICAgICAgICAgIHB3LnByaW50bG4oIiAgbU5vTm90aWZpY2F0aW9uc1RpdGxlOiAiICsgdmlld0luZm8obU5vTm90aWZpY2F0aW9uc1RpdGxlKSk7Ci0gICAgICAgICAgICBwdy5wcmludGxuKCIgIG1DbG9zZVZpZXc6ICIgKyB2aWV3SW5mbyhtQ2xvc2VWaWV3KSk7Ci0gICAgICAgICAgICBwdy5wcmludGxuKCIgIG1UaWNrZXJWaWV3OiAiICsgdmlld0luZm8obVRpY2tlclZpZXcpKTsKLSAgICAgICAgICAgIHB3LnByaW50bG4oIiAgbVNjcm9sbFZpZXc6ICIgKyB2aWV3SW5mbyhtU2Nyb2xsVmlldykKLSAgICAgICAgICAgICAgICAgICAgKyAiIHNjcm9sbCAiICsgbVNjcm9sbFZpZXcuZ2V0U2Nyb2xsWCgpICsgIiwiICsgbVNjcm9sbFZpZXcuZ2V0U2Nyb2xsWSgpKTsKLSAgICAgICAgICAgIHB3LnByaW50bG4oIm1Ob3RpZmljYXRpb25MaW5lYXJMYXlvdXQ6ICIgKyB2aWV3SW5mbyhtTm90aWZpY2F0aW9uTGluZWFyTGF5b3V0KSk7Ci0gICAgICAgIH0KLSAgICAgICAgLyoKLSAgICAgICAgc3luY2hyb25pemVkIChtTm90aWZpY2F0aW9uRGF0YSkgewotICAgICAgICAgICAgaW50IE4gPSBtTm90aWZpY2F0aW9uRGF0YS5vbmdvaW5nQ291bnQoKTsKLSAgICAgICAgICAgIHB3LnByaW50bG4oIiAgb25nb2luZ0NvdW50LnNpemU9IiArIE4pOwotICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPE47IGkrKykgewotICAgICAgICAgICAgICAgIFN0YXR1c0Jhck5vdGlmaWNhdGlvbiBuID0gbU5vdGlmaWNhdGlvbkRhdGEuZ2V0T25nb2luZyhpKTsKLSAgICAgICAgICAgICAgICBwdy5wcmludGxuKCIgICAgWyIgKyBpICsgIl0ga2V5PSIgKyBuLmtleSArICIgdmlldz0iICsgbi52aWV3KTsKLSAgICAgICAgICAgICAgICBwdy5wcmludGxuKCIgICAgICAgICAgIGRhdGE9IiArIG4uZGF0YSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBOID0gbU5vdGlmaWNhdGlvbkRhdGEubGF0ZXN0Q291bnQoKTsKLSAgICAgICAgICAgIHB3LnByaW50bG4oIiAgb25nb2luZ0NvdW50LnNpemU9IiArIE4pOwotICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPE47IGkrKykgewotICAgICAgICAgICAgICAgIFN0YXR1c0Jhck5vdGlmaWNhdGlvbiBuID0gbU5vdGlmaWNhdGlvbkRhdGEuZ2V0TGF0ZXN0KGkpOwotICAgICAgICAgICAgICAgIHB3LnByaW50bG4oIiAgICBbIiArIGkgKyAiXSBrZXk9IiArIG4ua2V5ICsgIiB2aWV3PSIgKyBuLnZpZXcpOwotICAgICAgICAgICAgICAgIHB3LnByaW50bG4oIiAgICAgICAgICAgZGF0YT0iICsgbi5kYXRhKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAqLwotCi0gICAgICAgIGlmIChmYWxzZSkgewotICAgICAgICAgICAgcHcucHJpbnRsbigic2VlIHRoZSBsb2djYXQgZm9yIGEgZHVtcCBvZiB0aGUgdmlld3Mgd2UgaGF2ZSBjcmVhdGVkLiIpOwotICAgICAgICAgICAgLy8gbXVzdCBoYXBwZW4gb24gdWkgdGhyZWFkCi0gICAgICAgICAgICBtSGFuZGxlci5wb3N0KG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXR1c0JhclZpZXcuZ2V0TG9jYXRpb25PblNjcmVlbihtQWJzUG9zKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJtU3RhdHVzQmFyVmlldzogLS0tLS0gKCIgKyBtQWJzUG9zWzBdICsgIiwiICsgbUFic1Bvc1sxXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIpICIgKyBtU3RhdHVzQmFyVmlldy5nZXRXaWR0aCgpICsgIngiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbVN0YXR1c0JhclZpZXcuZ2V0SGVpZ2h0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXR1c0JhclZpZXcuZGVidWcoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgbUV4cGFuZGVkVmlldy5nZXRMb2NhdGlvbk9uU2NyZWVuKG1BYnNQb3MpOwotICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgIm1FeHBhbmRlZFZpZXc6IC0tLS0tICgiICsgbUFic1Bvc1swXSArICIsIiArIG1BYnNQb3NbMV0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiKSAiICsgbUV4cGFuZGVkVmlldy5nZXRXaWR0aCgpICsgIngiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbUV4cGFuZGVkVmlldy5nZXRIZWlnaHQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRXhwYW5kZWRWaWV3LmRlYnVnKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1UcmFja2luZ1ZpZXcuZ2V0TG9jYXRpb25PblNjcmVlbihtQWJzUG9zKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJtVHJhY2tpbmdWaWV3OiAtLS0tLSAoIiArIG1BYnNQb3NbMF0gKyAiLCIgKyBtQWJzUG9zWzFdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIikgIiArIG1UcmFja2luZ1ZpZXcuZ2V0V2lkdGgoKSArICJ4IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1UcmFja2luZ1ZpZXcuZ2V0SGVpZ2h0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgbVRyYWNraW5nVmlldy5kZWJ1ZygpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIG9uQmFyVmlld0F0dGFjaGVkKCkgewotICAgICAgICBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcyBscDsKLSAgICAgICAgaW50IHBpeGVsRm9ybWF0OwotICAgICAgICBEcmF3YWJsZSBiZzsKLQotICAgICAgICAvLy8gLS0tLS0tLS0tLSBUcmFja2luZyBWaWV3IC0tLS0tLS0tLS0tLS0tCi0gICAgICAgIHBpeGVsRm9ybWF0ID0gUGl4ZWxGb3JtYXQuUkdCWF84ODg4OwotICAgICAgICBiZyA9IG1UcmFja2luZ1ZpZXcuZ2V0QmFja2dyb3VuZCgpOwotICAgICAgICBpZiAoYmcgIT0gbnVsbCkgewotICAgICAgICAgICAgcGl4ZWxGb3JtYXQgPSBiZy5nZXRPcGFjaXR5KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBscCA9IG5ldyBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcygKLSAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCwKLSAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCwKLSAgICAgICAgICAgICAgICBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5UWVBFX1NUQVRVU19CQVJfUEFORUwsCi0gICAgICAgICAgICAgICAgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19MQVlPVVRfSU5fU0NSRUVOCi0gICAgICAgICAgICAgICAgfCBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX0xBWU9VVF9OT19MSU1JVFMKLSAgICAgICAgICAgICAgICB8IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfQUxUX0ZPQ1VTQUJMRV9JTSwKLSAgICAgICAgICAgICAgICBwaXhlbEZvcm1hdCk7Ci0vLyAgICAgICAgbHAudG9rZW4gPSBtU3RhdHVzQmFyVmlldy5nZXRXaW5kb3dUb2tlbigpOwotICAgICAgICBscC5ncmF2aXR5ID0gR3Jhdml0eS5UT1AgfCBHcmF2aXR5LkZJTExfSE9SSVpPTlRBTDsKLSAgICAgICAgbHAuc2V0VGl0bGUoIlRyYWNraW5nVmlldyIpOwotICAgICAgICBscC55ID0gbVRyYWNraW5nUG9zaXRpb247Ci0gICAgICAgIG1UcmFja2luZ1BhcmFtcyA9IGxwOwotCi0gICAgICAgIFdpbmRvd01hbmFnZXJJbXBsLmdldERlZmF1bHQoKS5hZGRWaWV3KG1UcmFja2luZ1ZpZXcsIGxwKTsKLSAgICB9Ci0KLSAgICB2b2lkIG9uVHJhY2tpbmdWaWV3QXR0YWNoZWQoKSB7Ci0gICAgICAgIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zIGxwOwotICAgICAgICBpbnQgcGl4ZWxGb3JtYXQ7Ci0gICAgICAgIERyYXdhYmxlIGJnOwotCi0gICAgICAgIC8vLyAtLS0tLS0tLS0tIEV4cGFuZGVkIFZpZXcgLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgcGl4ZWxGb3JtYXQgPSBQaXhlbEZvcm1hdC5UUkFOU0xVQ0VOVDsKLQotICAgICAgICBmaW5hbCBpbnQgZGlzcGggPSBtRGlzcGxheS5nZXRIZWlnaHQoKTsKLSAgICAgICAgbHAgPSBtRXhwYW5kZWREaWFsb2cuZ2V0V2luZG93KCkuZ2V0QXR0cmlidXRlcygpOwotICAgICAgICBscC53aWR0aCA9IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UOwotICAgICAgICBscC5oZWlnaHQgPSBnZXRFeHBhbmRlZEhlaWdodCgpOwotICAgICAgICBscC54ID0gMDsKLSAgICAgICAgbVRyYWNraW5nUG9zaXRpb24gPSBscC55ID0gLWRpc3BoOyAvLyBzdWZmaWNpZW50bHkgbGFyZ2UgbmVnYXRpdmUKLSAgICAgICAgbHAudHlwZSA9IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLlRZUEVfU1RBVFVTX0JBUl9QQU5FTDsKLSAgICAgICAgbHAuZmxhZ3MgPSBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX0xBWU9VVF9JTl9TQ1JFRU4KLSAgICAgICAgICAgICAgICB8IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfTEFZT1VUX05PX0xJTUlUUwotICAgICAgICAgICAgICAgIHwgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19OT1RfVE9VQ0hfTU9EQUwKLSAgICAgICAgICAgICAgICB8IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfRElUSEVSCi0gICAgICAgICAgICAgICAgfCBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX05PVF9GT0NVU0FCTEU7Ci0gICAgICAgIGxwLmZvcm1hdCA9IHBpeGVsRm9ybWF0OwotICAgICAgICBscC5ncmF2aXR5ID0gR3Jhdml0eS5UT1AgfCBHcmF2aXR5LkZJTExfSE9SSVpPTlRBTDsKLSAgICAgICAgbHAuc2V0VGl0bGUoIlN0YXR1c0JhckV4cGFuZGVkIik7Ci0gICAgICAgIG1FeHBhbmRlZERpYWxvZy5nZXRXaW5kb3coKS5zZXRBdHRyaWJ1dGVzKGxwKTsKLSAgICAgICAgbUV4cGFuZGVkRGlhbG9nLmdldFdpbmRvdygpLnNldEZvcm1hdChwaXhlbEZvcm1hdCk7Ci0gICAgICAgIG1FeHBhbmRlZFBhcmFtcyA9IGxwOwotCi0gICAgICAgIG1FeHBhbmRlZERpYWxvZy5nZXRXaW5kb3coKS5yZXF1ZXN0RmVhdHVyZShXaW5kb3cuRkVBVFVSRV9OT19USVRMRSk7Ci0gICAgICAgIG1FeHBhbmRlZERpYWxvZy5zZXRDb250ZW50VmlldyhtRXhwYW5kZWRWaWV3LAotICAgICAgICAgICAgICAgIG5ldyBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zKFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5ULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UKSk7Ci0gICAgICAgIG1FeHBhbmRlZERpYWxvZy5nZXRXaW5kb3coKS5zZXRCYWNrZ3JvdW5kRHJhd2FibGUobnVsbCk7Ci0gICAgICAgIG1FeHBhbmRlZERpYWxvZy5zaG93KCk7Ci0gICAgICAgIEZyYW1lTGF5b3V0IGhhY2sgPSAoRnJhbWVMYXlvdXQpbUV4cGFuZGVkVmlldy5nZXRQYXJlbnQoKTsKLSAgICB9Ci0KLSAgICB2b2lkIHNldERhdGVWaWV3VmlzaWJpbGl0eShib29sZWFuIHZpc2libGUsIGludCBhbmltKSB7Ci0gICAgICAgIG1EYXRlVmlldy5zZXRVcGRhdGVzKHZpc2libGUpOwotICAgICAgICBtRGF0ZVZpZXcuc2V0VmlzaWJpbGl0eSh2aXNpYmxlID8gVmlldy5WSVNJQkxFIDogVmlldy5JTlZJU0lCTEUpOwotICAgICAgICBtRGF0ZVZpZXcuc3RhcnRBbmltYXRpb24obG9hZEFuaW0oYW5pbSwgbnVsbCkpOwotICAgIH0KLQotICAgIHZvaWQgc2V0Tm90aWZpY2F0aW9uSWNvblZpc2liaWxpdHkoYm9vbGVhbiB2aXNpYmxlLCBpbnQgYW5pbSkgewotICAgICAgICBpbnQgb2xkID0gbU5vdGlmaWNhdGlvbkljb25zLmdldFZpc2liaWxpdHkoKTsKLSAgICAgICAgaW50IHYgPSB2aXNpYmxlID8gVmlldy5WSVNJQkxFIDogVmlldy5JTlZJU0lCTEU7Ci0gICAgICAgIGlmIChvbGQgIT0gdikgewotICAgICAgICAgICAgbU5vdGlmaWNhdGlvbkljb25zLnNldFZpc2liaWxpdHkodik7Ci0gICAgICAgICAgICBtTm90aWZpY2F0aW9uSWNvbnMuc3RhcnRBbmltYXRpb24obG9hZEFuaW0oYW5pbSwgbnVsbCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCB1cGRhdGVFeHBhbmRlZFZpZXdQb3MoaW50IGV4cGFuZGVkUG9zaXRpb24pIHsKLSAgICAgICAgaWYgKFNQRVcpIHsKLSAgICAgICAgICAgIFNsb2cuZChUQUcsICJ1cGRhdGVFeHBhbmRlZFZpZXdQb3MgYmVmb3JlIGV4cGFuZGVkUG9zaXRpb249IiArIGV4cGFuZGVkUG9zaXRpb24KLSAgICAgICAgICAgICAgICAgICAgKyAiIG1UcmFja2luZ1BhcmFtcy55PSIgCi0gICAgICAgICAgICAgICAgICAgICsgKChtVHJhY2tpbmdQYXJhbXMgPT0gbnVsbCkgPyAiPz8/IiA6IG1UcmFja2luZ1BhcmFtcy55KQotICAgICAgICAgICAgICAgICAgICArICIgbVRyYWNraW5nUG9zaXRpb249IiArIG1UcmFja2luZ1Bvc2l0aW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBoID0gbVN0YXR1c0JhclZpZXcuZ2V0SGVpZ2h0KCk7Ci0gICAgICAgIGludCBkaXNwaCA9IG1EaXNwbGF5LmdldEhlaWdodCgpOwotCi0gICAgICAgIC8vIElmIHRoZSBleHBhbmRlZCB2aWV3IGlzIG5vdCB2aXNpYmxlLCBtYWtlIHN1cmUgdGhleSdyZSBzdGlsbCBvZmYgc2NyZWVuLgotICAgICAgICAvLyBNYXliZSB0aGUgdmlldyB3YXMgcmVzaXplZC4KLSAgICAgICAgaWYgKCFtRXhwYW5kZWRWaXNpYmxlKSB7Ci0gICAgICAgICAgICBpZiAobVRyYWNraW5nVmlldyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVRyYWNraW5nUG9zaXRpb24gPSAtZGlzcGg7Ci0gICAgICAgICAgICAgICAgaWYgKG1UcmFja2luZ1BhcmFtcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1UcmFja2luZ1BhcmFtcy55ID0gbVRyYWNraW5nUG9zaXRpb247Ci0gICAgICAgICAgICAgICAgICAgIFdpbmRvd01hbmFnZXJJbXBsLmdldERlZmF1bHQoKS51cGRhdGVWaWV3TGF5b3V0KG1UcmFja2luZ1ZpZXcsIG1UcmFja2luZ1BhcmFtcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1FeHBhbmRlZFBhcmFtcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUV4cGFuZGVkUGFyYW1zLnkgPSAtZGlzcGg7Ci0gICAgICAgICAgICAgICAgbUV4cGFuZGVkRGlhbG9nLmdldFdpbmRvdygpLnNldEF0dHJpYnV0ZXMobUV4cGFuZGVkUGFyYW1zKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHRyYWNraW5nIHZpZXcuLi4KLSAgICAgICAgaW50IHBvczsKLSAgICAgICAgaWYgKGV4cGFuZGVkUG9zaXRpb24gPT0gRVhQQU5ERURfRlVMTF9PUEVOKSB7Ci0gICAgICAgICAgICBwb3MgPSBoOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGV4cGFuZGVkUG9zaXRpb24gPT0gRVhQQU5ERURfTEVBVkVfQUxPTkUpIHsKLSAgICAgICAgICAgIHBvcyA9IG1UcmFja2luZ1Bvc2l0aW9uOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgaWYgKGV4cGFuZGVkUG9zaXRpb24gPD0gZGlzcGgpIHsKLSAgICAgICAgICAgICAgICBwb3MgPSBleHBhbmRlZFBvc2l0aW9uOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwb3MgPSBkaXNwaDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBvcyAtPSBkaXNwaC1oOwotICAgICAgICB9Ci0gICAgICAgIG1UcmFja2luZ1Bvc2l0aW9uID0gbVRyYWNraW5nUGFyYW1zLnkgPSBwb3M7Ci0gICAgICAgIG1UcmFja2luZ1BhcmFtcy5oZWlnaHQgPSBkaXNwaC1oOwotICAgICAgICBXaW5kb3dNYW5hZ2VySW1wbC5nZXREZWZhdWx0KCkudXBkYXRlVmlld0xheW91dChtVHJhY2tpbmdWaWV3LCBtVHJhY2tpbmdQYXJhbXMpOwotCi0gICAgICAgIGlmIChtRXhwYW5kZWRQYXJhbXMgIT0gbnVsbCkgewotICAgICAgICAgICAgbUNsb3NlVmlldy5nZXRMb2NhdGlvbkluV2luZG93KG1Qb3NpdGlvblRtcCk7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgY2xvc2VQb3MgPSBtUG9zaXRpb25UbXBbMV07Ci0KLSAgICAgICAgICAgIG1FeHBhbmRlZENvbnRlbnRzLmdldExvY2F0aW9uSW5XaW5kb3cobVBvc2l0aW9uVG1wKTsKLSAgICAgICAgICAgIGZpbmFsIGludCBjb250ZW50c0JvdHRvbSA9IG1Qb3NpdGlvblRtcFsxXSArIG1FeHBhbmRlZENvbnRlbnRzLmdldEhlaWdodCgpOwotCi0gICAgICAgICAgICBtRXhwYW5kZWRQYXJhbXMueSA9IHBvcyArIG1UcmFja2luZ1ZpZXcuZ2V0SGVpZ2h0KCkKLSAgICAgICAgICAgICAgICAgICAgLSAobVRyYWNraW5nUGFyYW1zLmhlaWdodC1jbG9zZVBvcykgLSBjb250ZW50c0JvdHRvbTsKLSAgICAgICAgICAgIGludCBtYXggPSBoOwotICAgICAgICAgICAgaWYgKG1FeHBhbmRlZFBhcmFtcy55ID4gbWF4KSB7Ci0gICAgICAgICAgICAgICAgbUV4cGFuZGVkUGFyYW1zLnkgPSBtYXg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnQgbWluID0gbVRyYWNraW5nUG9zaXRpb247Ci0gICAgICAgICAgICBpZiAobUV4cGFuZGVkUGFyYW1zLnkgPCBtaW4pIHsKLSAgICAgICAgICAgICAgICBtRXhwYW5kZWRQYXJhbXMueSA9IG1pbjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYm9vbGVhbiB2aXNpYmxlID0gKG1UcmFja2luZ1Bvc2l0aW9uICsgbVRyYWNraW5nVmlldy5nZXRIZWlnaHQoKSkgPiBoOwotICAgICAgICAgICAgaWYgKCF2aXNpYmxlKSB7Ci0gICAgICAgICAgICAgICAgLy8gaWYgdGhlIGNvbnRlbnRzIGFyZW4ndCB2aXNpYmxlLCBtb3ZlIHRoZSBleHBhbmRlZCB2aWV3IHdheSBvZmYgc2NyZWVuCi0gICAgICAgICAgICAgICAgLy8gYmVjYXVzZSB0aGUgd2luZG93IGl0c2VsZiBleHRlbmRzIGJlbG93IHRoZSBjb250ZW50IHZpZXcuCi0gICAgICAgICAgICAgICAgbUV4cGFuZGVkUGFyYW1zLnkgPSAtZGlzcGg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtRXhwYW5kZWREaWFsb2cuZ2V0V2luZG93KCkuc2V0QXR0cmlidXRlcyhtRXhwYW5kZWRQYXJhbXMpOwotCi0gICAgICAgICAgICAvLyBBcyBsb25nIGFzIHRoaXMgaXNuJ3QganVzdCBhIHJlcG9zaXRpb25pbmcgdGhhdCdzIG5vdCBzdXBwb3NlZCB0byBhZmZlY3QKLSAgICAgICAgICAgIC8vIHRoZSB1c2VyJ3MgcGVyY2VwdGlvbiBvZiB3aGF0J3Mgc2hvd2luZywgY2FsbCB0byBzYXkgdGhhdCB0aGUgdmlzaWJpbGl0eQotICAgICAgICAgICAgLy8gaGFzIGNoYW5nZWQuIChPdGhlcndpc2UsIHNvbWVvbmUgZWxzZSB3aWxsIGNhbGwgdG8gZG8gdGhhdCkuCi0gICAgICAgICAgICBpZiAoZXhwYW5kZWRQb3NpdGlvbiAhPSBFWFBBTkRFRF9MRUFWRV9BTE9ORSkgewotICAgICAgICAgICAgICAgIGlmIChTUEVXKSBTbG9nLmQoVEFHLCAidXBkYXRlRXhwYW5kZWRWaWV3UG9zIHZpc2liaWxpdHlDaGFuZ2VkKCIgKyB2aXNpYmxlICsgIikiKTsKLSAgICAgICAgICAgICAgICB2aXNpYmlsaXR5Q2hhbmdlZCh2aXNpYmxlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChTUEVXKSB7Ci0gICAgICAgICAgICBTbG9nLmQoVEFHLCAidXBkYXRlRXhwYW5kZWRWaWV3UG9zIGFmdGVyICBleHBhbmRlZFBvc2l0aW9uPSIgKyBleHBhbmRlZFBvc2l0aW9uCi0gICAgICAgICAgICAgICAgICAgICsgIiBtVHJhY2tpbmdQYXJhbXMueT0iICsgbVRyYWNraW5nUGFyYW1zLnkKLSAgICAgICAgICAgICAgICAgICAgKyAiIG1UcmFja2luZ1Bvc2l0aW9uPSIgKyBtVHJhY2tpbmdQb3NpdGlvbgotICAgICAgICAgICAgICAgICAgICArICIgbUV4cGFuZGVkUGFyYW1zLnk9IiArIG1FeHBhbmRlZFBhcmFtcy55Ci0gICAgICAgICAgICAgICAgICAgICsgIiBtRXhwYW5kZWRQYXJhbXMuaGVpZ2h0PSIgKyBtRXhwYW5kZWRQYXJhbXMuaGVpZ2h0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGludCBnZXRFeHBhbmRlZEhlaWdodCgpIHsKLSAgICAgICAgcmV0dXJuIG1EaXNwbGF5LmdldEhlaWdodCgpIC0gbVN0YXR1c0JhclZpZXcuZ2V0SGVpZ2h0KCkgLSBtQ2xvc2VWaWV3LmdldEhlaWdodCgpOwotICAgIH0KLQotICAgIHZvaWQgdXBkYXRlRXhwYW5kZWRIZWlnaHQoKSB7Ci0gICAgICAgIGlmIChtRXhwYW5kZWRWaWV3ICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1FeHBhbmRlZFBhcmFtcy5oZWlnaHQgPSBnZXRFeHBhbmRlZEhlaWdodCgpOwotICAgICAgICAgICAgbUV4cGFuZGVkRGlhbG9nLmdldFdpbmRvdygpLnNldEF0dHJpYnV0ZXMobUV4cGFuZGVkUGFyYW1zKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSBMRURzIGFyZSB0dXJuZWQgbylmZiB3aGVuIHRoZSBub3RpZmljYXRpb24gcGFuZWwgaXMgc2hvd24sIGV2ZW4ganVzdCBhIGxpdHRsZSBiaXQuCi0gICAgICogVGhpcyB3YXMgYWRkZWQgbGFzdC1taW51dGUgYW5kIGlzIGluY29uc2lzdGVudCB3aXRoIHRoZSB3YXkgdGhlIHJlc3Qgb2YgdGhlIG5vdGlmaWNhdGlvbnMKLSAgICAgKiBhcmUgaGFuZGxlZCwgYmVjYXVzZSB0aGUgbm90aWZpY2F0aW9uIGlzbid0IHJlYWxseSBjYW5jZWxsZWQuICBUaGUgbGlnaHRzIGFyZSBqdXN0Ci0gICAgICogdHVybmVkIG9mZi4gIElmIGFueSBvdGhlciBub3RpZmljYXRpb25zIGhhcHBlbiwgdGhlIGxpZ2h0cyB3aWxsIHR1cm4gYmFjayBvbi4gIFN0ZXZlIHNheXMKLSAgICAgKiB0aGlzIGlzIHdoYXQgaGUgd2FudHMuIChzZWUgYnVnIDExMzE0NjEpCi0gICAgICovCi0gICAgdm9pZCB2aXNpYmlsaXR5Q2hhbmdlZChib29sZWFuIHZpc2libGUpIHsKLSAgICAgICAgaWYgKG1QYW5lbFNsaWdodGx5VmlzaWJsZSAhPSB2aXNpYmxlKSB7Ci0gICAgICAgICAgICBtUGFuZWxTbGlnaHRseVZpc2libGUgPSB2aXNpYmxlOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBtQmFyU2VydmljZS5vblBhbmVsUmV2ZWFsZWQoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgIC8vIFdvbid0IGZhaWwgdW5sZXNzIHRoZSB3b3JsZCBoYXMgZW5kZWQuCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIHBlcmZvcm1EaXNhYmxlQWN0aW9ucyhpbnQgbmV0KSB7Ci0gICAgICAgIGludCBvbGQgPSBtRGlzYWJsZWQ7Ci0gICAgICAgIGludCBkaWZmID0gbmV0IF4gb2xkOwotICAgICAgICBtRGlzYWJsZWQgPSBuZXQ7Ci0KLSAgICAgICAgLy8gYWN0IGFjY29yZGluZ2x5Ci0gICAgICAgIGlmICgoZGlmZiAmIFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9FWFBBTkQpICE9IDApIHsKLSAgICAgICAgICAgIGlmICgobmV0ICYgU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX0VYUEFORCkgIT0gMCkgewotICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJESVNBQkxFX0VYUEFORDogeWVzIik7Ci0gICAgICAgICAgICAgICAgYW5pbWF0ZUNvbGxhcHNlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKChkaWZmICYgU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX05PVElGSUNBVElPTl9JQ09OUykgIT0gMCkgewotICAgICAgICAgICAgaWYgKChuZXQgJiBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfTk9USUZJQ0FUSU9OX0lDT05TKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgIkRJU0FCTEVfTk9USUZJQ0FUSU9OX0lDT05TOiB5ZXMiKTsKLSAgICAgICAgICAgICAgICBpZiAobVRpY2tpbmcpIHsKLSAgICAgICAgICAgICAgICAgICAgbU5vdGlmaWNhdGlvbkljb25zLnNldFZpc2liaWxpdHkoVmlldy5JTlZJU0lCTEUpOwotICAgICAgICAgICAgICAgICAgICBtVGlja2VyLmhhbHQoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBzZXROb3RpZmljYXRpb25JY29uVmlzaWJpbGl0eShmYWxzZSwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hbmltLmZhZGVfb3V0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJESVNBQkxFX05PVElGSUNBVElPTl9JQ09OUzogbm8iKTsKLSAgICAgICAgICAgICAgICBpZiAoIW1FeHBhbmRlZFZpc2libGUpIHsKLSAgICAgICAgICAgICAgICAgICAgc2V0Tm90aWZpY2F0aW9uSWNvblZpc2liaWxpdHkodHJ1ZSwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hbmltLmZhZGVfaW4pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmICgoZGlmZiAmIFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9OT1RJRklDQVRJT05fVElDS0VSKSAhPSAwKSB7Ci0gICAgICAgICAgICBTbG9nLmQoVEFHLCAiRElTQUJMRV9OT1RJRklDQVRJT05fVElDS0VSOiAiCi0gICAgICAgICAgICAgICAgKyAoKChuZXQgJiBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfTk9USUZJQ0FUSU9OX1RJQ0tFUikgIT0gMCkKLSAgICAgICAgICAgICAgICAgICAgPyAieWVzIiA6ICJubyIpKTsKLSAgICAgICAgICAgIGlmIChtVGlja2luZyAmJiAobmV0ICYgU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX05PVElGSUNBVElPTl9USUNLRVIpICE9IDApIHsKLSAgICAgICAgICAgICAgICBtVGlja2VyLmhhbHQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgVmlldy5PbkNsaWNrTGlzdGVuZXIgbUNsZWFyQnV0dG9uTGlzdGVuZXIgPSBuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG1CYXJTZXJ2aWNlLm9uQ2xlYXJBbGxOb3RpZmljYXRpb25zKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICAvLyBzeXN0ZW0gcHJvY2VzcyBpcyBkZWFkIGlmIHdlJ3JlIGhlcmUuCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhbmltYXRlQ29sbGFwc2UoKTsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBwcml2YXRlIEJyb2FkY2FzdFJlY2VpdmVyIG1Ccm9hZGNhc3RSZWNlaXZlciA9IG5ldyBCcm9hZGNhc3RSZWNlaXZlcigpIHsKLSAgICAgICAgcHVibGljIHZvaWQgb25SZWNlaXZlKENvbnRleHQgY29udGV4dCwgSW50ZW50IGludGVudCkgewotICAgICAgICAgICAgU3RyaW5nIGFjdGlvbiA9IGludGVudC5nZXRBY3Rpb24oKTsKLSAgICAgICAgICAgIGlmIChJbnRlbnQuQUNUSU9OX0NMT1NFX1NZU1RFTV9ESUFMT0dTLmVxdWFscyhhY3Rpb24pCi0gICAgICAgICAgICAgICAgICAgIHx8IEludGVudC5BQ1RJT05fU0NSRUVOX09GRi5lcXVhbHMoYWN0aW9uKSkgewotICAgICAgICAgICAgICAgIC8vY29sbGFwc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKEludGVudC5BQ1RJT05fQ09ORklHVVJBVElPTl9DSEFOR0VELmVxdWFscyhhY3Rpb24pKSB7Ci0gICAgICAgICAgICAgICAgdXBkYXRlUmVzb3VyY2VzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcHJpdmF0ZSB2b2lkIHNldEludHJ1ZGVyQWxlcnRWaXNpYmlsaXR5KGJvb2xlYW4gdmlzKSB7Ci0gICAgICAgIG1JbnRydWRlckFsZXJ0Vmlldy5zZXRWaXNpYmlsaXR5KHZpcyA/IFZpZXcuVklTSUJMRSA6IFZpZXcuR09ORSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVsb2FkIHNvbWUgb2Ygb3VyIHJlc291cmNlcyB3aGVuIHRoZSBjb25maWd1cmF0aW9uIGNoYW5nZXMuCi0gICAgICoKLSAgICAgKiBXZSBkb24ndCByZWxvYWQgZXZlcnl0aGluZyB3aGVuIHRoZSBjb25maWd1cmF0aW9uIGNoYW5nZXMgLS0gd2UgcHJvYmFibHkKLSAgICAgKiBzaG91bGQsIGJ1dCBnZXR0aW5nIHRoYXQgc21vb3RoIGlzIHRvdWdoLiAgU29tZWRheSB3ZSdsbCBmaXggdGhhdC4gIEluIHRoZQotICAgICAqIG1lYW50aW1lLCBqdXN0IHVwZGF0ZSB0aGUgdGhpbmdzIHRoYXQgd2Uga25vdyBjaGFuZ2UuCi0gICAgICovCi0gICAgdm9pZCB1cGRhdGVSZXNvdXJjZXMoKSB7Ci0gICAgICAgIFJlc291cmNlcyByZXMgPSBnZXRSZXNvdXJjZXMoKTsKLQotICAgICAgICBtQ2xlYXJCdXR0b24uc2V0VGV4dChnZXRUZXh0KFIuc3RyaW5nLnN0YXR1c19iYXJfY2xlYXJfYWxsX2J1dHRvbikpOwotICAgICAgICBtT25nb2luZ1RpdGxlLnNldFRleHQoZ2V0VGV4dChSLnN0cmluZy5zdGF0dXNfYmFyX29uZ29pbmdfZXZlbnRzX3RpdGxlKSk7Ci0gICAgICAgIG1MYXRlc3RUaXRsZS5zZXRUZXh0KGdldFRleHQoUi5zdHJpbmcuc3RhdHVzX2Jhcl9sYXRlc3RfZXZlbnRzX3RpdGxlKSk7Ci0gICAgICAgIG1Ob05vdGlmaWNhdGlvbnNUaXRsZS5zZXRUZXh0KGdldFRleHQoUi5zdHJpbmcuc3RhdHVzX2Jhcl9ub19ub3RpZmljYXRpb25zX3RpdGxlKSk7Ci0KLSAgICAgICAgbUVkZ2VCb3JkZXIgPSByZXMuZ2V0RGltZW5zaW9uUGl4ZWxTaXplKFIuZGltZW4uc3RhdHVzX2Jhcl9lZGdlX2lnbm9yZSk7Ci0KLSAgICAgICAgaWYgKGZhbHNlKSBTbG9nLnYoVEFHLCAidXBkYXRlUmVzb3VyY2VzIik7Ci0gICAgfQotCi0gICAgLy8KLSAgICAvLyB0cmFjaW5nCi0gICAgLy8KLQotICAgIHZvaWQgcG9zdFN0YXJ0VHJhY2luZygpIHsKLSAgICAgICAgbUhhbmRsZXIucG9zdERlbGF5ZWQobVN0YXJ0VHJhY2luZywgMzAwMCk7Ci0gICAgfQotCi0gICAgdm9pZCB2aWJyYXRlKCkgewotICAgICAgICBhbmRyb2lkLm9zLlZpYnJhdG9yIHZpYiA9IChhbmRyb2lkLm9zLlZpYnJhdG9yKWdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5WSUJSQVRPUl9TRVJWSUNFKTsKLSAgICAgICAgdmliLnZpYnJhdGUoMjUwKTsKLSAgICB9Ci0KLSAgICBSdW5uYWJsZSBtU3RhcnRUcmFjaW5nID0gbmV3IFJ1bm5hYmxlKCkgewotICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICB2aWJyYXRlKCk7Ci0gICAgICAgICAgICBTeXN0ZW1DbG9jay5zbGVlcCgyNTApOwotICAgICAgICAgICAgU2xvZy5kKFRBRywgInN0YXJ0VHJhY2luZyIpOwotICAgICAgICAgICAgYW5kcm9pZC5vcy5EZWJ1Zy5zdGFydE1ldGhvZFRyYWNpbmcoIi9kYXRhL3N0YXR1c2Jhci10cmFjZXMvdHJhY2UiKTsKLSAgICAgICAgICAgIG1IYW5kbGVyLnBvc3REZWxheWVkKG1TdG9wVHJhY2luZywgMTAwMDApOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIFJ1bm5hYmxlIG1TdG9wVHJhY2luZyA9IG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgYW5kcm9pZC5vcy5EZWJ1Zy5zdG9wTWV0aG9kVHJhY2luZygpOwotICAgICAgICAgICAgU2xvZy5kKFRBRywgInN0b3BUcmFjaW5nIik7Ci0gICAgICAgICAgICB2aWJyYXRlKCk7Ci0gICAgICAgIH0KLSAgICB9OwogfQogCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL1N0YXR1c0JhclZpZXcuamF2YSBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvU3RhdHVzQmFyVmlldy5qYXZhCmluZGV4IDFlMTQwYjkuLjIwZmM0MWYgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvU3RhdHVzQmFyVmlldy5qYXZhCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvU3RhdHVzQmFyVmlldy5qYXZhCkBAIC0xOSw2ICsxOSw3IEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKIGltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOwogaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OwpAQCAtMzQsNyArMzUsNyBAQAogCiAgICAgc3RhdGljIGZpbmFsIGludCBESU1fQU5JTV9USU1FID0gNDAwOwogICAgIAotICAgIFN0YXR1c0JhclNlcnZpY2UgbVNlcnZpY2U7CisgICAgUGhvbmVTdGF0dXNCYXJTZXJ2aWNlIG1TZXJ2aWNlOwogICAgIGJvb2xlYW4gbVRyYWNraW5nOwogICAgIGludCBtU3RhcnRYLCBtU3RhcnRZOwogICAgIFZpZXdHcm91cCBtTm90aWZpY2F0aW9uSWNvbnM7CkBAIC00Niw2ICs0Nyw5IEBACiAgICAgaW50IG1TdGFydEFscGhhID0gMCwgbUVuZEFscGhhID0gMDsKICAgICBsb25nIG1FbmRUaW1lID0gMDsKIAorICAgIFJlY3QgbUJ1dHRvbkJvdW5kcyA9IG5ldyBSZWN0KCk7CisgICAgYm9vbGVhbiBtQ2FwdHVyaW5nRXZlbnRzID0gdHJ1ZTsKKwogICAgIHB1YmxpYyBTdGF0dXNCYXJWaWV3KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7CiAgICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzKTsKICAgICB9CkBAIC05NCw3ICs5OCw3IEBACiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgb25TaXplQ2hhbmdlZChpbnQgdywgaW50IGgsIGludCBvbGR3LCBpbnQgb2xkaCkgewogICAgICAgICBzdXBlci5vblNpemVDaGFuZ2VkKHcsIGgsIG9sZHcsIG9sZGgpOwotICAgICAgICBtU2VydmljZS51cGRhdGVFeHBhbmRlZFZpZXdQb3MoU3RhdHVzQmFyU2VydmljZS5FWFBBTkRFRF9MRUFWRV9BTE9ORSk7CisgICAgICAgIG1TZXJ2aWNlLnVwZGF0ZUV4cGFuZGVkVmlld1BvcyhQaG9uZVN0YXR1c0JhclNlcnZpY2UuRVhQQU5ERURfTEVBVkVfQUxPTkUpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtMTc3LDYgKzE4MSw5IEBACiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gb25Ub3VjaEV2ZW50KE1vdGlvbkV2ZW50IGV2ZW50KSB7CisgICAgICAgIGlmICghbUNhcHR1cmluZ0V2ZW50cykgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CiAgICAgICAgIGlmIChldmVudC5nZXRBY3Rpb24oKSAhPSBNb3Rpb25FdmVudC5BQ1RJT05fRE9XTikgewogICAgICAgICAgICAgbVNlcnZpY2UuaW50ZXJjZXB0VG91Y2hFdmVudChldmVudCk7CiAgICAgICAgIH0KQEAgLTE4NSw2ICsxOTIsMTMgQEAKIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIG9uSW50ZXJjZXB0VG91Y2hFdmVudChNb3Rpb25FdmVudCBldmVudCkgeworICAgICAgICBpZiAoZXZlbnQuZ2V0QWN0aW9uKCkgPT0gTW90aW9uRXZlbnQuQUNUSU9OX0RPV04pIHsKKyAgICAgICAgICAgIGlmIChtQnV0dG9uQm91bmRzLmNvbnRhaW5zKChpbnQpZXZlbnQuZ2V0WCgpLCAoaW50KWV2ZW50LmdldFkoKSkpIHsKKyAgICAgICAgICAgICAgICBtQ2FwdHVyaW5nRXZlbnRzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1DYXB0dXJpbmdFdmVudHMgPSB0cnVlOwogICAgICAgICByZXR1cm4gbVNlcnZpY2UuaW50ZXJjZXB0VG91Y2hFdmVudChldmVudCkKICAgICAgICAgICAgICAgICA/IHRydWUgOiBzdXBlci5vbkludGVyY2VwdFRvdWNoRXZlbnQoZXZlbnQpOwogICAgIH0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvVGlja2VyLmphdmEgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL1RpY2tlci5qYXZhCmluZGV4IDNhNjk3YTYuLmU3YjA1MDkgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvVGlja2VyLmphdmEKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9UaWNrZXIuamF2YQpAQCAtMTQxLDcgKzE0MSw3IEBACiAgICAgICAgIH0KICAgICB9OwogCi0gICAgVGlja2VyKENvbnRleHQgY29udGV4dCwgU3RhdHVzQmFyVmlldyBzYikgeworICAgIHB1YmxpYyBUaWNrZXIoQ29udGV4dCBjb250ZXh0LCBWaWV3IHNiKSB7CiAgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKICAgICAgICAgbVRpY2tlclZpZXcgPSBzYi5maW5kVmlld0J5SWQoUi5pZC50aWNrZXIpOwogCkBAIC0xNjMsNyArMTYzLDcgQEAKICAgICB9CiAKIAotICAgIHZvaWQgYWRkRW50cnkoU3RhdHVzQmFyTm90aWZpY2F0aW9uIG4pIHsKKyAgICBwdWJsaWMgdm9pZCBhZGRFbnRyeShTdGF0dXNCYXJOb3RpZmljYXRpb24gbikgewogICAgICAgICBpbnQgaW5pdGlhbENvdW50ID0gbVNlZ21lbnRzLnNpemUoKTsKIAogICAgICAgICAvLyBJZiB3aGF0J3MgYmVpbmcgZGlzcGxheWVkIGhhcyB0aGUgc2FtZSB0ZXh0IGFuZCBpY29uLCBqdXN0IGRyb3AgaXQKQEAgLTIxMiw3ICsyMTIsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgdm9pZCByZW1vdmVFbnRyeShTdGF0dXNCYXJOb3RpZmljYXRpb24gbikgeworICAgIHB1YmxpYyB2b2lkIHJlbW92ZUVudHJ5KFN0YXR1c0Jhck5vdGlmaWNhdGlvbiBuKSB7CiAgICAgICAgIGZvciAoaW50IGk9bVNlZ21lbnRzLnNpemUoKS0xOyBpPj0wOyBpLS0pIHsKICAgICAgICAgICAgIFNlZ21lbnQgc2VnID0gbVNlZ21lbnRzLmdldChpKTsKICAgICAgICAgICAgIGlmIChuLmlkID09IHNlZy5ub3RpZmljYXRpb24uaWQgJiYgbi5wa2cuZXF1YWxzKHNlZy5ub3RpZmljYXRpb24ucGtnKSkgewpAQCAtMjIxLDEzICsyMjEsMTMgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHZvaWQgaGFsdCgpIHsKKyAgICBwdWJsaWMgdm9pZCBoYWx0KCkgewogICAgICAgICBtSGFuZGxlci5yZW1vdmVDYWxsYmFja3MobUFkdmFuY2VUaWNrZXIpOwogICAgICAgICBtU2VnbWVudHMuY2xlYXIoKTsKICAgICAgICAgdGlja2VySGFsdGluZygpOwogICAgIH0KIAotICAgIHZvaWQgcmVmbG93VGV4dCgpIHsKKyAgICBwdWJsaWMgdm9pZCByZWZsb3dUZXh0KCkgewogICAgICAgICBpZiAobVNlZ21lbnRzLnNpemUoKSA+IDApIHsKICAgICAgICAgICAgIFNlZ21lbnQgc2VnID0gbVNlZ21lbnRzLmdldCgwKTsKICAgICAgICAgICAgIENoYXJTZXF1ZW5jZSB0ZXh0ID0gc2VnLmdldFRleHQoKTsKQEAgLTI2Niw4ICsyNjYsOCBAQAogICAgICAgICBtSGFuZGxlci5wb3N0RGVsYXllZChtQWR2YW5jZVRpY2tlciwgVElDS0VSX1NFR01FTlRfREVMQVkpOwogICAgIH0KIAotICAgIGFic3RyYWN0IHZvaWQgdGlja2VyU3RhcnRpbmcoKTsKLSAgICBhYnN0cmFjdCB2b2lkIHRpY2tlckRvbmUoKTsKLSAgICBhYnN0cmFjdCB2b2lkIHRpY2tlckhhbHRpbmcoKTsKKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCB0aWNrZXJTdGFydGluZygpOworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHRpY2tlckRvbmUoKTsKKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCB0aWNrZXJIYWx0aW5nKCk7CiB9CiAKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvVGlja2VyVmlldy5qYXZhIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9UaWNrZXJWaWV3LmphdmEKaW5kZXggOTc0OWFlNC4uODE0MDgxMSAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9UaWNrZXJWaWV3LmphdmEKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9UaWNrZXJWaWV3LmphdmEKQEAgLTM0LDUgKzM0LDkgQEAKICAgICAgICAgc3VwZXIub25TaXplQ2hhbmdlZCh3LCBoLCBvbGR3LCBvbGRoKTsKICAgICAgICAgbVRpY2tlci5yZWZsb3dUZXh0KCk7CiAgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VGlja2VyKFRpY2tlciB0KSB7CisgICAgICAgIG1UaWNrZXIgPSB0OworICAgIH0KIH0KIApkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9UcmFja2luZ1ZpZXcuamF2YSBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvVHJhY2tpbmdWaWV3LmphdmEKaW5kZXggOTEwOGVlZS4uYzU5ZWI2YSAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9UcmFja2luZ1ZpZXcuamF2YQorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL1RyYWNraW5nVmlldy5qYXZhCkBAIC0yNiw3ICsyNiw3IEBACiAKIHB1YmxpYyBjbGFzcyBUcmFja2luZ1ZpZXcgZXh0ZW5kcyBMaW5lYXJMYXlvdXQgewogICAgIGZpbmFsIERpc3BsYXkgbURpc3BsYXk7Ci0gICAgU3RhdHVzQmFyU2VydmljZSBtU2VydmljZTsKKyAgICBQaG9uZVN0YXR1c0JhclNlcnZpY2UgbVNlcnZpY2U7CiAgICAgYm9vbGVhbiBtVHJhY2tpbmc7CiAgICAgaW50IG1TdGFydFgsIG1TdGFydFk7CiAKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvdGFibGV0L05vdGlmaWNhdGlvbkljb25BcmVhLmphdmEgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL3RhYmxldC9Ob3RpZmljYXRpb25JY29uQXJlYS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjN2Q3NGMzCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci90YWJsZXQvTm90aWZpY2F0aW9uSWNvbkFyZWEuamF2YQpAQCAtMCwwICsxLDU2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIudGFibGV0OworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CitpbXBvcnQgYW5kcm9pZC51dGlsLlNsb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGluZWFyTGF5b3V0OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkltYWdlVmlldzsKKworaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLlI7CisKKworcHVibGljIGNsYXNzIE5vdGlmaWNhdGlvbkljb25BcmVhIGV4dGVuZHMgTGluZWFyTGF5b3V0IHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk5vdGlmaWNhdGlvbkljb25BcmVhIjsKKworICAgIEljb25MYXlvdXQgbUljb25MYXlvdXQ7CisgICAgRHJhZ2dlclZpZXcgbURyYWdnZXJWaWV3OworCisgICAgcHVibGljIE5vdGlmaWNhdGlvbkljb25BcmVhKENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzKTsKKworICAgICAgICBtSWNvbkxheW91dCA9IChJY29uTGF5b3V0KWZpbmRWaWV3QnlJZChSLmlkLmljb25zKTsKKyAgICAgICAgbURyYWdnZXJWaWV3ID0gKERyYWdnZXJWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5oYW5kbGUpOworICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBJY29uTGF5b3V0IGV4dGVuZHMgTGluZWFyTGF5b3V0IHsKKyAgICAgICAgcHVibGljIEljb25MYXlvdXQoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKKyAgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBEcmFnZ2VyVmlldyBleHRlbmRzIFZpZXcgeworICAgICAgICBwdWJsaWMgRHJhZ2dlclZpZXcoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKKyAgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzKTsKKyAgICAgICAgfQorICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci90YWJsZXQvU3lzdGVtUGFuZWwuamF2YSBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvdGFibGV0L1N5c3RlbVBhbmVsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTAzMzkzYgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvdGFibGV0L1N5c3RlbVBhbmVsLmphdmEKQEAgLTAsMCArMSw0MDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci50YWJsZXQ7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5Ob3RpZmljYXRpb247CitpbXBvcnQgYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudDsKK2ltcG9ydCBhbmRyb2lkLmFwcC5TZXJ2aWNlOworaW1wb3J0IGFuZHJvaWQuYXBwLlN0YXR1c0Jhck1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGl4ZWxGb3JtYXQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OworaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9NYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtJbmZvOworaW1wb3J0IGFuZHJvaWQubmV0LndpZmkuU3VwcGxpY2FudFN0YXRlOworaW1wb3J0IGFuZHJvaWQubmV0LndpZmkuV2lmaUNvbmZpZ3VyYXRpb247CitpbXBvcnQgYW5kcm9pZC5uZXQud2lmaS5XaWZpSW5mbzsKK2ltcG9ydCBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQub3MuQXN5bmNUYXNrOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5JUG93ZXJNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm9zLlNlcnZpY2VNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3M7CitpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuUGhvbmVTdGF0ZUxpc3RlbmVyOworaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlNlcnZpY2VTdGF0ZTsKK2ltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5UZWxlcGhvbnlNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CitpbXBvcnQgYW5kcm9pZC51dGlsLlNsb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3LkdyYXZpdHk7CitpbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CitpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXJJbXBsOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkJ1dHRvbjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5JbWFnZUJ1dHRvbjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGluZWFyTGF5b3V0OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlJlbW90ZVZpZXdzOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlNjcm9sbFZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFN3aXRjaGVyOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRvYXN0OworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIuKjsKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5SOworCitwdWJsaWMgY2xhc3MgU3lzdGVtUGFuZWwgZXh0ZW5kcyBMaW5lYXJMYXlvdXQgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiU3lzdGVtUGFuZWwiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1JTklNVU1fQkFDS0xJR0hUID0gYW5kcm9pZC5vcy5Qb3dlci5CUklHSFRORVNTX0RJTSArIDU7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWElNVU1fQkFDS0xJR0hUID0gYW5kcm9pZC5vcy5Qb3dlci5CUklHSFRORVNTX09OOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0JBQ0tMSUdIVCA9IChpbnQpIChhbmRyb2lkLm9zLlBvd2VyLkJSSUdIVE5FU1NfT04gKiAwLjRmKTsKKworCisgICAgcHJpdmF0ZSBUYWJsZXRTdGF0dXNCYXJTZXJ2aWNlIG1CYXI7CisgICAgcHJpdmF0ZSBib29sZWFuIG1BaXJwbGFuZU1vZGU7CisKKyAgICBwcml2YXRlIEltYWdlQnV0dG9uIG1CcmlnaHRuZXNzQnV0dG9uOworICAgIHByaXZhdGUgSW1hZ2VCdXR0b24gbVNvdW5kQnV0dG9uOworICAgIHByaXZhdGUgSW1hZ2VCdXR0b24gbU9yaWVudGF0aW9uQnV0dG9uOworICAgIHByaXZhdGUgSW1hZ2VCdXR0b24gbUFpcnBsYW5lQnV0dG9uOworCisgICAgcHJpdmF0ZSBJbWFnZVZpZXcgbUJhdHRlcnlNZXRlcjsKKyAgICBwcml2YXRlIEltYWdlVmlldyBtU2lnbmFsTWV0ZXI7CisKKyAgICBwcml2YXRlIFRleHRWaWV3IG1CYXR0ZXJ5VGV4dDsKKyAgICBwcml2YXRlIFRleHRWaWV3IG1TaWduYWxUZXh0OworCisgICAgcHJpdmF0ZSBmaW5hbCBBdWRpb01hbmFnZXIgbUF1ZGlvTWFuYWdlcjsKKyAgICBwcml2YXRlIGZpbmFsIFdpZmlNYW5hZ2VyIG1XaWZpTWFuYWdlcjsKKworCisgICAgcHJpdmF0ZSBCcm9hZGNhc3RSZWNlaXZlciBtUmVjZWl2ZXIgPSBuZXcgQnJvYWRjYXN0UmVjZWl2ZXIoKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblJlY2VpdmUoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50KSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgYWN0aW9uID0gaW50ZW50LmdldEFjdGlvbigpOworICAgICAgICAgICAgaWYgKGFjdGlvbi5lcXVhbHMoQXVkaW9NYW5hZ2VyLlJJTkdFUl9NT0RFX0NIQU5HRURfQUNUSU9OKSkgeworICAgICAgICAgICAgICAgIG1Tb3VuZEJ1dHRvbi5zZXRBbHBoYShnZXRTaWxlbnRNb2RlKCkgPyAweDdGIDogMHhGRik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbi5lcXVhbHMoSW50ZW50LkFDVElPTl9CQVRURVJZX0NIQU5HRUQpKSB7CisgICAgICAgICAgICAgICAgdXBkYXRlQmF0dGVyeShpbnRlbnQpOworICAgICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24uZXF1YWxzKFdpZmlNYW5hZ2VyLlJTU0lfQ0hBTkdFRF9BQ1RJT04pCisgICAgICAgICAgICAgICAgICAgIHx8IGFjdGlvbi5lcXVhbHMoV2lmaU1hbmFnZXIuV0lGSV9TVEFURV9DSEFOR0VEX0FDVElPTikKKyAgICAgICAgICAgICAgICAgICAgfHwgYWN0aW9uLmVxdWFscyhXaWZpTWFuYWdlci5TVVBQTElDQU5UX1NUQVRFX0NIQU5HRURfQUNUSU9OKQorICAgICAgICAgICAgICAgICAgICB8fCBhY3Rpb24uZXF1YWxzKFdpZmlNYW5hZ2VyLk5FVFdPUktfU1RBVEVfQ0hBTkdFRF9BQ1RJT04pKSB7CisgICAgICAgICAgICAgICAgdXBkYXRlV2lmaShpbnRlbnQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsKKworICAgIGJvb2xlYW4gbVdpZmlFbmFibGVkLCBtV2lmaUNvbm5lY3RlZDsKKyAgICBpbnQgbVdpZmlMZXZlbDsKKyAgICBTdHJpbmcgbVdpZmlTc2lkOworCisgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVdpZmkoSW50ZW50IGludGVudCkgeworICAgICAgICBpZiAoVGFibGV0U3RhdHVzQmFyU2VydmljZS5ERUJVRykKKyAgICAgICAgICAgIFNsb2cuZChUYWJsZXRTdGF0dXNCYXJTZXJ2aWNlLlRBRywgInVwZGF0ZVdpZmk6ICIgKyBpbnRlbnQpOworCisgICAgICAgIGZpbmFsIFN0cmluZyBhY3Rpb24gPSBpbnRlbnQuZ2V0QWN0aW9uKCk7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gd2FzQ29ubmVjdGVkID0gbVdpZmlDb25uZWN0ZWQ7CisKKyAgICAgICAgaWYgKGFjdGlvbi5lcXVhbHMoV2lmaU1hbmFnZXIuV0lGSV9TVEFURV9DSEFOR0VEX0FDVElPTikpIHsKKyAgICAgICAgICAgIG1XaWZpRW5hYmxlZCA9IGludGVudC5nZXRJbnRFeHRyYShXaWZpTWFuYWdlci5FWFRSQV9XSUZJX1NUQVRFLAorICAgICAgICAgICAgICAgICAgICBXaWZpTWFuYWdlci5XSUZJX1NUQVRFX1VOS05PV04pID09IFdpZmlNYW5hZ2VyLldJRklfU1RBVEVfRU5BQkxFRDsKKyAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24uZXF1YWxzKFdpZmlNYW5hZ2VyLk5FVFdPUktfU1RBVEVfQ0hBTkdFRF9BQ1RJT04pKSB7CisgICAgICAgICAgICBmaW5hbCBOZXR3b3JrSW5mbyBuZXR3b3JrSW5mbyA9IChOZXR3b3JrSW5mbykKKyAgICAgICAgICAgICAgICAgICAgaW50ZW50LmdldFBhcmNlbGFibGVFeHRyYShXaWZpTWFuYWdlci5FWFRSQV9ORVRXT1JLX0lORk8pOworICAgICAgICAgICAgbVdpZmlDb25uZWN0ZWQgPSBuZXR3b3JrSW5mbyAhPSBudWxsICYmIG5ldHdvcmtJbmZvLmlzQ29ubmVjdGVkKCk7CisgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uLmVxdWFscyhXaWZpTWFuYWdlci5TVVBQTElDQU5UX1NUQVRFX0NIQU5HRURfQUNUSU9OKSkgeworICAgICAgICAgICAgZmluYWwgTmV0d29ya0luZm8uRGV0YWlsZWRTdGF0ZSBkZXRhaWxlZFN0YXRlID0gV2lmaUluZm8uZ2V0RGV0YWlsZWRTdGF0ZU9mKAorICAgICAgICAgICAgICAgICAgICAoU3VwcGxpY2FudFN0YXRlKWludGVudC5nZXRQYXJjZWxhYmxlRXh0cmEoV2lmaU1hbmFnZXIuRVhUUkFfTkVXX1NUQVRFKSk7CisgICAgICAgICAgICBtV2lmaUNvbm5lY3RlZCA9IGRldGFpbGVkU3RhdGUgPT0gTmV0d29ya0luZm8uRGV0YWlsZWRTdGF0ZS5DT05ORUNURUQ7CisgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uLmVxdWFscyhXaWZpTWFuYWdlci5SU1NJX0NIQU5HRURfQUNUSU9OKSkgeworICAgICAgICAgICAgZmluYWwgaW50IG5ld1Jzc2kgPSBpbnRlbnQuZ2V0SW50RXh0cmEoV2lmaU1hbmFnZXIuRVhUUkFfTkVXX1JTU0ksIC0yMDApOworICAgICAgICAgICAgaW50IG5ld1NpZ25hbExldmVsID0gV2lmaU1hbmFnZXIuY2FsY3VsYXRlU2lnbmFsTGV2ZWwobmV3UnNzaSwgNikgKiAyMDsKKyAgICAgICAgICAgIG1XaWZpTGV2ZWwgPSBtV2lmaUNvbm5lY3RlZCA/IG5ld1NpZ25hbExldmVsIDogMDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtV2lmaUNvbm5lY3RlZCAmJiAhd2FzQ29ubmVjdGVkKSB7CisgICAgICAgICAgICBXaWZpSW5mbyBpbmZvID0gbVdpZmlNYW5hZ2VyLmdldENvbm5lY3Rpb25JbmZvKCk7CisgICAgICAgICAgICBpZiAoVGFibGV0U3RhdHVzQmFyU2VydmljZS5ERUJVRykKKyAgICAgICAgICAgICAgICBTbG9nLmQoVGFibGV0U3RhdHVzQmFyU2VydmljZS5UQUcsICJ1cGRhdGVXaWZpOiBqdXN0IGNvbm5lY3RlZDogaW5mbz0iICsgaW5mbyk7CisKKyAgICAgICAgICAgIGlmIChpbmZvICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAvLyBncmFiIHRoZSBpbml0aWFsIHNpZ25hbCBzdHJlbmd0aAorICAgICAgICAgICAgICAgIG1XaWZpTGV2ZWwgPSBXaWZpTWFuYWdlci5jYWxjdWxhdGVTaWduYWxMZXZlbChpbmZvLmdldFJzc2koKSwgMTAxKTsKKworICAgICAgICAgICAgICAgIC8vIGZpbmQgdGhlIFNTSUQKKyAgICAgICAgICAgICAgICBtV2lmaVNzaWQgPSBpbmZvLmdldFNTSUQoKTsKKyAgICAgICAgICAgICAgICBpZiAobVdpZmlTc2lkID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gT0ssIGl0J3Mgbm90IGluIHRoZSBjb25uZWN0aW9uSW5mbzsgd2UgaGF2ZSB0byBnbyBodW50aW5nIGZvciBpdAorICAgICAgICAgICAgICAgICAgICBMaXN0PFdpZmlDb25maWd1cmF0aW9uPiBuZXR3b3JrcyA9IG1XaWZpTWFuYWdlci5nZXRDb25maWd1cmVkTmV0d29ya3MoKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChXaWZpQ29uZmlndXJhdGlvbiBuZXQgOiBuZXR3b3JrcykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ldC5uZXR3b3JrSWQgPT0gaW5mby5nZXROZXR3b3JrSWQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1XaWZpU3NpZCA9IG5ldC5TU0lEOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCFtV2lmaUVuYWJsZWQpIHsKKyAgICAgICAgICAgIG1XaWZpU3NpZCA9ICJkaXNhYmxlZCI7CisgICAgICAgICAgICBtV2lmaUxldmVsID0gMDsKKyAgICAgICAgfSBlbHNlIGlmICghbVdpZmlDb25uZWN0ZWQpIHsKKyAgICAgICAgICAgIG1XaWZpU3NpZCA9ICJkaXNjb25uZWN0ZWQiOworICAgICAgICAgICAgbVdpZmlMZXZlbCA9IDA7CisgICAgICAgIH0gZWxzZSBpZiAobVdpZmlTc2lkID09IG51bGwpIHsKKyAgICAgICAgICAgIG1XaWZpU3NpZCA9ICJ1bmtub3duIjsKKyAgICAgICAgfQorCisgICAgICAgIG1TaWduYWxNZXRlci5zZXRJbWFnZVJlc291cmNlKFIuZHJhd2FibGUuc2lnbmFsKTsKKyAgICAgICAgbVNpZ25hbE1ldGVyLnNldEltYWdlTGV2ZWwobVdpZmlMZXZlbCk7CisgICAgICAgIG1TaWduYWxUZXh0LnNldFRleHQoU3RyaW5nLmZvcm1hdCgiV2ktRmk6ICVzIiwgbVdpZmlTc2lkKSk7IC8vIFhYWDogbG9jYWxpemUKKworICAgICAgICAvLyBoYWNrIGZvciBub3cKKyAgICAgICAgbUJhci5zZXRXaWZpTWV0ZXIobVdpZmlMZXZlbCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0QmFyKFRhYmxldFN0YXR1c0JhclNlcnZpY2UgYmFyKSB7CisgICAgICAgIG1CYXIgPSBiYXI7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdXBkYXRlQmF0dGVyeShJbnRlbnQgaW50ZW50KSB7CisgICAgICAgIGZpbmFsIGludCBsZXZlbCA9IGludGVudC5nZXRJbnRFeHRyYSgibGV2ZWwiLCAwKTsKKyAgICAgICAgZmluYWwgYm9vbGVhbiBwbHVnZ2VkID0gaW50ZW50LmdldEludEV4dHJhKCJwbHVnZ2VkIiwgMCkgIT0gMDsKKworICAgICAgICBtQmF0dGVyeU1ldGVyLnNldEltYWdlUmVzb3VyY2UocGx1Z2dlZCA/IFIuZHJhd2FibGUuYmF0dGVyeV9jaGFyZ2luZyA6IFIuZHJhd2FibGUuYmF0dGVyeSk7CisgICAgICAgIG1CYXR0ZXJ5TWV0ZXIuc2V0SW1hZ2VMZXZlbChsZXZlbCk7CisgICAgICAgIG1CYXR0ZXJ5VGV4dC5zZXRUZXh0KFN0cmluZy5mb3JtYXQoIkJhdHRlcnk6ICVkJSUiLCBsZXZlbCkpOworCisgICAgICAgIC8vIGhhY2sgZm9yIG5vdworICAgICAgICBtQmFyLnNldEJhdHRlcnlNZXRlcihsZXZlbCwgcGx1Z2dlZCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBTeXN0ZW1QYW5lbChDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgeworICAgICAgICB0aGlzKGNvbnRleHQsIGF0dHJzLCAwKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3lzdGVtUGFuZWwoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBkZWZTdHlsZSkgeworICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycywgZGVmU3R5bGUpOworCisgICAgICAgIC8vIGdldCBub3RpZmllZCBvZiBwaG9uZSBzdGF0ZSBjaGFuZ2VzCisgICAgICAgIFRlbGVwaG9ueU1hbmFnZXIgdGVsZXBob255TWFuYWdlciA9CisgICAgICAgICAgICAgICAgKFRlbGVwaG9ueU1hbmFnZXIpIGNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LlRFTEVQSE9OWV9TRVJWSUNFKTsKKyAgICAgICAgdGVsZXBob255TWFuYWdlci5saXN0ZW4obVBob25lU3RhdGVMaXN0ZW5lciwgUGhvbmVTdGF0ZUxpc3RlbmVyLkxJU1RFTl9TRVJWSUNFX1NUQVRFKTsKKworICAgICAgICAvLyB3aWZpIHN0YXR1cyBpbmZvCisgICAgICAgIG1XaWZpTWFuYWdlciA9IChXaWZpTWFuYWdlcikgY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuV0lGSV9TRVJWSUNFKTsKKyAgICAgICAgCisgICAgICAgIC8vIGF1ZGlvIHN0YXR1cyBub3RpZmljYXRpb25zCisgICAgICAgIG1BdWRpb01hbmFnZXIgPSAoQXVkaW9NYW5hZ2VyKSBtQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuQVVESU9fU0VSVklDRSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb25BdHRhY2hlZFRvV2luZG93KCkgeworICAgICAgICBUZXh0VmlldyBzZXR0aW5nc0J1dHRvbiA9IChUZXh0VmlldylmaW5kVmlld0J5SWQoUi5pZC5zZXR0aW5nc19idXR0b24pOworICAgICAgICBzZXR0aW5nc0J1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgICAgICBnZXRDb250ZXh0KCkuc3RhcnRBY3Rpdml0eShuZXcgSW50ZW50KGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3MuQUNUSU9OX1NFVFRJTkdTKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZsYWdzKEludGVudC5GTEFHX0FDVElWSVRZX05FV19UQVNLKSk7CisgICAgICAgICAgICAgICAgbUJhci5hbmltYXRlQ29sbGFwc2UoKTsKKyAgICAgICAgICAgIH19KTsKKworICAgICAgICBtQnJpZ2h0bmVzc0J1dHRvbiA9IChJbWFnZUJ1dHRvbilmaW5kVmlld0J5SWQoUi5pZC5icmlnaHRuZXNzKTsKKyAgICAgICAgbUJyaWdodG5lc3NCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7CisgICAgICAgICAgICAgICAgcm90YXRlQnJpZ2h0bmVzcygpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICBtU291bmRCdXR0b24gPSAoSW1hZ2VCdXR0b24pZmluZFZpZXdCeUlkKFIuaWQuc291bmQpOworICAgICAgICBtU291bmRCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7CisgICAgICAgICAgICAgICAgc2V0U2lsZW50TW9kZSghZ2V0U2lsZW50TW9kZSgpKTsKKyAgICAgICAgICAgICAgICBtU291bmRCdXR0b24uc2V0QWxwaGEoZ2V0U2lsZW50TW9kZSgpID8gMHg3RiA6IDB4RkYpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgICAgbU9yaWVudGF0aW9uQnV0dG9uID0gKEltYWdlQnV0dG9uKWZpbmRWaWV3QnlJZChSLmlkLm9yaWVudGF0aW9uKTsKKyAgICAgICAgbU9yaWVudGF0aW9uQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICAgICAgICAgIFRvYXN0Lm1ha2VUZXh0KGdldENvbnRleHQoKSwgIk9yaWVudGF0aW9uIGNvbnRyb2wgbm90IGltcGxlbWVudGVkOyBwbGVhc2UgYWRqdXN0IG5lY2sgYW5nbGUuIiwgVG9hc3QuTEVOR1RIX1NIT1JUKS5zaG93KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgICAgIG1BaXJwbGFuZUJ1dHRvbiA9IChJbWFnZUJ1dHRvbilmaW5kVmlld0J5SWQoUi5pZC5haXJwbGFuZSk7CisgICAgICAgIG1BaXJwbGFuZUJ1dHRvbi5zZXRBbHBoYShtQWlycGxhbmVNb2RlID8gMHhGRiA6IDB4N0YpOworICAgICAgICBtQWlycGxhbmVCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7CisgICAgICAgICAgICAgICAgYm9vbGVhbiBuZXdNb2RlID0gIWdldEFpcnBsYW5lTW9kZSgpOworICAgICAgICAgICAgICAgIFRvYXN0Lm1ha2VUZXh0KGdldENvbnRleHQoKSwgIkF0dGVtcHRpbmcgdG8gdHVybiAiCisgICAgICAgICAgICAgICAgICAgICsgKG5ld01vZGUgPyAib24iIDogIm9mZiIpICsgIiBhaXJwbGFuZSBtb2RlIChmbGFreSkuIiwKKyAgICAgICAgICAgICAgICAgICAgVG9hc3QuTEVOR1RIX1NIT1JUKS5zaG93KCk7CisgICAgICAgICAgICAgICAgc2V0QWlycGxhbmVNb2RlKG5ld01vZGUpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICBJbnRlbnRGaWx0ZXIgZmlsdGVyID0gbmV3IEludGVudEZpbHRlcigpOworICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKEF1ZGlvTWFuYWdlci5SSU5HRVJfTU9ERV9DSEFOR0VEX0FDVElPTik7CisgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oSW50ZW50LkFDVElPTl9CQVRURVJZX0NIQU5HRUQpOworICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKFdpZmlNYW5hZ2VyLldJRklfU1RBVEVfQ0hBTkdFRF9BQ1RJT04pOworICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKFdpZmlNYW5hZ2VyLlNVUFBMSUNBTlRfU1RBVEVfQ0hBTkdFRF9BQ1RJT04pOworICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKFdpZmlNYW5hZ2VyLk5FVFdPUktfU1RBVEVfQ0hBTkdFRF9BQ1RJT04pOworICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKFdpZmlNYW5hZ2VyLlJTU0lfQ0hBTkdFRF9BQ1RJT04pOworICAgICAgICBnZXRDb250ZXh0KCkucmVnaXN0ZXJSZWNlaXZlcihtUmVjZWl2ZXIsIGZpbHRlcik7CisKKyAgICAgICAgbUJhdHRlcnlNZXRlciA9IChJbWFnZVZpZXcpZmluZFZpZXdCeUlkKFIuaWQuYmF0dGVyeV9tZXRlcik7CisgICAgICAgIG1CYXR0ZXJ5TWV0ZXIuc2V0SW1hZ2VSZXNvdXJjZShSLmRyYXdhYmxlLmJhdHRlcnkpOworICAgICAgICBtQmF0dGVyeU1ldGVyLnNldEltYWdlTGV2ZWwoMCk7CisgICAgICAgIG1TaWduYWxNZXRlciA9IChJbWFnZVZpZXcpZmluZFZpZXdCeUlkKFIuaWQuc2lnbmFsX21ldGVyKTsKKyAgICAgICAgbUJhdHRlcnlNZXRlci5zZXRJbWFnZVJlc291cmNlKFIuZHJhd2FibGUuc2lnbmFsKTsKKyAgICAgICAgbUJhdHRlcnlNZXRlci5zZXRJbWFnZUxldmVsKDApOworCisgICAgICAgIG1CYXR0ZXJ5VGV4dCA9IChUZXh0VmlldylmaW5kVmlld0J5SWQoUi5pZC5iYXR0ZXJ5X2luZm8pOworICAgICAgICBtU2lnbmFsVGV4dCA9IChUZXh0VmlldylmaW5kVmlld0J5SWQoUi5pZC5zaWduYWxfaW5mbyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb25EZXRhY2hlZEZyb21XaW5kb3coKSB7CisgICAgICAgIGdldENvbnRleHQoKS51bnJlZ2lzdGVyUmVjZWl2ZXIobVJlY2VpdmVyKTsKKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vICAgIHByaXZhdGUgYm9vbGVhbiBpc0F1dG9CcmlnaHRuZXNzKCkgeworLy8gICAgICAgIENvbnRleHQgY29udGV4dCA9IGdldENvbnRleHQoKTsKKy8vICAgICAgICB0cnkgeworLy8gICAgICAgICAgICBJUG93ZXJNYW5hZ2VyIHBvd2VyID0gSVBvd2VyTWFuYWdlci5TdHViLmFzSW50ZXJmYWNlKAorLy8gICAgICAgICAgICAgICAgICAgIFNlcnZpY2VNYW5hZ2VyLmdldFNlcnZpY2UoInBvd2VyIikpOworLy8gICAgICAgICAgICBpZiAocG93ZXIgIT0gbnVsbCkgeworLy8gICAgICAgICAgICAgICAgaW50IGJyaWdodG5lc3NNb2RlID0gU2V0dGluZ3MuU3lzdGVtLmdldEludChjb250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLAorLy8gICAgICAgICAgICAgICAgICAgICAgICBTZXR0aW5ncy5TeXN0ZW0uU0NSRUVOX0JSSUdIVE5FU1NfTU9ERSk7CisvLyAgICAgICAgICAgICAgICByZXR1cm4gYnJpZ2h0bmVzc01vZGUgPT0gU2V0dGluZ3MuU3lzdGVtLlNDUkVFTl9CUklHSFRORVNTX01PREVfQVVUT01BVElDOworLy8gICAgICAgICAgICB9CisvLyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKy8vICAgICAgICB9IGNhdGNoIChTZXR0aW5ncy5TZXR0aW5nTm90Rm91bmRFeGNlcHRpb24gZSkgeworLy8gICAgICAgIH0KKy8vICAgICAgICByZXR1cm4gZmFsc2U7CisvLyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcm90YXRlQnJpZ2h0bmVzcygpIHsKKyAgICAgICAgaW50IGFscGhhID0gMHhGRjsKKyAgICAgICAgQ29udGV4dCBjb250ZXh0ID0gZ2V0Q29udGV4dCgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgSVBvd2VyTWFuYWdlciBwb3dlciA9IElQb3dlck1hbmFnZXIuU3R1Yi5hc0ludGVyZmFjZSgKKyAgICAgICAgICAgICAgICAgICAgU2VydmljZU1hbmFnZXIuZ2V0U2VydmljZSgicG93ZXIiKSk7CisgICAgICAgICAgICBpZiAocG93ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIENvbnRlbnRSZXNvbHZlciBjciA9IGNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCk7CisgICAgICAgICAgICAgICAgaW50IGJyaWdodG5lc3MgPSBTZXR0aW5ncy5TeXN0ZW0uZ2V0SW50KGNyLAorICAgICAgICAgICAgICAgICAgICAgICAgU2V0dGluZ3MuU3lzdGVtLlNDUkVFTl9CUklHSFRORVNTKTsKKyAgICAgICAgICAgICAgICBpbnQgYnJpZ2h0bmVzc01vZGUgPSBTZXR0aW5ncy5TeXN0ZW0uU0NSRUVOX0JSSUdIVE5FU1NfTU9ERV9NQU5VQUw7CisgICAgICAgICAgICAgICAgLy9Pbmx5IGdldCBicmlnaHRuZXNzIHNldHRpbmcgaWYgYXZhaWxhYmxlCisgICAgICAgICAgICAgICAgaWYgKGNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0Qm9vbGVhbigKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYm9vbC5jb25maWdfYXV0b21hdGljX2JyaWdodG5lc3NfYXZhaWxhYmxlKSkgeworICAgICAgICAgICAgICAgICAgICBicmlnaHRuZXNzTW9kZSA9IFNldHRpbmdzLlN5c3RlbS5nZXRJbnQoY3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0dGluZ3MuU3lzdGVtLlNDUkVFTl9CUklHSFRORVNTX01PREUpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIFJvdGF0ZSBBVVRPIC0+IE1JTklNVU0gLT4gREVGQVVMVCAtPiBNQVhJTVVNCisgICAgICAgICAgICAgICAgLy8gVGVjaG5pY2FsbHksIG5vdCBhIHRvZ2dsZS4uLgorICAgICAgICAgICAgICAgIGlmIChicmlnaHRuZXNzTW9kZSA9PSBTZXR0aW5ncy5TeXN0ZW0uU0NSRUVOX0JSSUdIVE5FU1NfTU9ERV9BVVRPTUFUSUMpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJpZ2h0bmVzcyA9IE1JTklNVU1fQkFDS0xJR0hUOworICAgICAgICAgICAgICAgICAgICBicmlnaHRuZXNzTW9kZSA9IFNldHRpbmdzLlN5c3RlbS5TQ1JFRU5fQlJJR0hUTkVTU19NT0RFX01BTlVBTDsKKyAgICAgICAgICAgICAgICAgICAgYWxwaGEgPSAweDQwOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYnJpZ2h0bmVzcyA8IERFRkFVTFRfQkFDS0xJR0hUKSB7CisgICAgICAgICAgICAgICAgICAgIGJyaWdodG5lc3MgPSBERUZBVUxUX0JBQ0tMSUdIVDsKKyAgICAgICAgICAgICAgICAgICAgYWxwaGEgPSAweEMwOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYnJpZ2h0bmVzcyA8IE1BWElNVU1fQkFDS0xJR0hUKSB7CisgICAgICAgICAgICAgICAgICAgIGJyaWdodG5lc3MgPSBNQVhJTVVNX0JBQ0tMSUdIVDsKKyAgICAgICAgICAgICAgICAgICAgYWxwaGEgPSAweEZGOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGJyaWdodG5lc3NNb2RlID0gU2V0dGluZ3MuU3lzdGVtLlNDUkVFTl9CUklHSFRORVNTX01PREVfQVVUT01BVElDOworICAgICAgICAgICAgICAgICAgICBicmlnaHRuZXNzID0gTUlOSU1VTV9CQUNLTElHSFQ7CisgICAgICAgICAgICAgICAgICAgIGFscGhhID0gMHg2MDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoY29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRCb29sZWFuKAorICAgICAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5ib29sLmNvbmZpZ19hdXRvbWF0aWNfYnJpZ2h0bmVzc19hdmFpbGFibGUpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFNldCBzY3JlZW4gYnJpZ2h0bmVzcyBtb2RlIChhdXRvbWF0aWMgb3IgbWFudWFsKQorICAgICAgICAgICAgICAgICAgICBTZXR0aW5ncy5TeXN0ZW0ucHV0SW50KGNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0dGluZ3MuU3lzdGVtLlNDUkVFTl9CUklHSFRORVNTX01PREUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJpZ2h0bmVzc01vZGUpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBzZXQgdGhlIGJyaWdodG5lc3MgaWYgYXV0b21hdGljIG1vZGUgaXNuJ3QgYXZhaWxhYmxlCisgICAgICAgICAgICAgICAgICAgIGJyaWdodG5lc3NNb2RlID0gU2V0dGluZ3MuU3lzdGVtLlNDUkVFTl9CUklHSFRORVNTX01PREVfTUFOVUFMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoYnJpZ2h0bmVzc01vZGUgPT0gU2V0dGluZ3MuU3lzdGVtLlNDUkVFTl9CUklHSFRORVNTX01PREVfTUFOVUFMKSB7CisgICAgICAgICAgICAgICAgICAgIHBvd2VyLnNldEJhY2tsaWdodEJyaWdodG5lc3MoYnJpZ2h0bmVzcyk7CisgICAgICAgICAgICAgICAgICAgIFNldHRpbmdzLlN5c3RlbS5wdXRJbnQoY3IsIFNldHRpbmdzLlN5c3RlbS5TQ1JFRU5fQlJJR0hUTkVTUywgYnJpZ2h0bmVzcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICB9IGNhdGNoIChTZXR0aW5ncy5TZXR0aW5nTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICB9CisKKyAgICAgICAgbUJyaWdodG5lc3NCdXR0b24uc2V0QWxwaGEoYWxwaGEpOworICAgIH0KKworICAgIFBob25lU3RhdGVMaXN0ZW5lciBtUGhvbmVTdGF0ZUxpc3RlbmVyID0gbmV3IFBob25lU3RhdGVMaXN0ZW5lcigpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uU2VydmljZVN0YXRlQ2hhbmdlZChTZXJ2aWNlU3RhdGUgc2VydmljZVN0YXRlKSB7CisgICAgICAgICAgICBTbG9nLmQoVEFHLCAicGhvbmUgc2VydmljZSBzdGF0ZSBjaGFuZ2VkOiAiICsgc2VydmljZVN0YXRlLmdldFN0YXRlKCkpOworICAgICAgICAgICAgbUFpcnBsYW5lTW9kZSA9IHNlcnZpY2VTdGF0ZS5nZXRTdGF0ZSgpID09IFNlcnZpY2VTdGF0ZS5TVEFURV9QT1dFUl9PRkY7CisgICAgICAgICAgICBpZiAobUFpcnBsYW5lQnV0dG9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtQWlycGxhbmVCdXR0b24uc2V0QWxwaGEobUFpcnBsYW5lTW9kZSA/IDB4RkYgOiAweDdGKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH07CisKKyAgICBwcml2YXRlIGJvb2xlYW4gZ2V0QWlycGxhbmVNb2RlKCkgeworICAgICAgICByZXR1cm4gbUFpcnBsYW5lTW9kZTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2V0QWlycGxhbmVNb2RlKGJvb2xlYW4gb24pIHsKKyAgICAgICAgU2V0dGluZ3MuU3lzdGVtLnB1dEludCgKKyAgICAgICAgICAgICAgICBtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwKKyAgICAgICAgICAgICAgICBTZXR0aW5ncy5TeXN0ZW0uQUlSUExBTkVfTU9ERV9PTiwKKyAgICAgICAgICAgICAgICBvbiA/IDEgOiAwKTsKKyAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoSW50ZW50LkFDVElPTl9BSVJQTEFORV9NT0RFX0NIQU5HRUQpOworICAgICAgICBpbnRlbnQuYWRkRmxhZ3MoSW50ZW50LkZMQUdfUkVDRUlWRVJfUkVQTEFDRV9QRU5ESU5HKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKCJzdGF0ZSIsIG9uKTsKKyAgICAgICAgZ2V0Q29udGV4dCgpLnNlbmRCcm9hZGNhc3QoaW50ZW50KTsKKyAgICB9CisKKyAgICBib29sZWFuIGdldFNpbGVudE1vZGUoKSB7CisgICAgICAgIHJldHVybiBtQXVkaW9NYW5hZ2VyLmdldFJpbmdlck1vZGUoKSAhPSBBdWRpb01hbmFnZXIuUklOR0VSX01PREVfTk9STUFMOworICAgIH0KKworICAgIHZvaWQgc2V0U2lsZW50TW9kZShib29sZWFuIG9uKSB7CisgICAgICAgIGlmIChvbikgeworICAgICAgICAgICAgbUF1ZGlvTWFuYWdlci5zZXRSaW5nZXJNb2RlKChTZXR0aW5ncy5TeXN0ZW0uZ2V0SW50KG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLAorICAgICAgICAgICAgICAgIFNldHRpbmdzLlN5c3RlbS5WSUJSQVRFX0lOX1NJTEVOVCwgMSkgPT0gMSkKKyAgICAgICAgICAgICAgICA/IEF1ZGlvTWFuYWdlci5SSU5HRVJfTU9ERV9WSUJSQVRFCisgICAgICAgICAgICAgICAgOiBBdWRpb01hbmFnZXIuUklOR0VSX01PREVfU0lMRU5UKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1BdWRpb01hbmFnZXIuc2V0UmluZ2VyTW9kZShBdWRpb01hbmFnZXIuUklOR0VSX01PREVfTk9STUFMKTsKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci90YWJsZXQvVGFibGV0U3RhdHVzQmFyU2VydmljZS5qYXZhIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci90YWJsZXQvVGFibGV0U3RhdHVzQmFyU2VydmljZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4YjliNDEKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL3RhYmxldC9UYWJsZXRTdGF0dXNCYXJTZXJ2aWNlLmphdmEKQEAgLTAsMCArMSw2OTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci50YWJsZXQ7CisKK2ltcG9ydCBhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRvcjsKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eU1hbmFnZXJOYXRpdmU7CitpbXBvcnQgYW5kcm9pZC5hcHAuTm90aWZpY2F0aW9uOworaW1wb3J0IGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5hcHAuU2VydmljZTsKK2ltcG9ydCBhbmRyb2lkLmFwcC5TdGF0dXNCYXJNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QaXhlbEZvcm1hdDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC51dGlsLlNsb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3LkdyYXZpdHk7CitpbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CitpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXJJbXBsOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkJ1dHRvbjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGluZWFyTGF5b3V0OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlJlbW90ZVZpZXdzOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlNjcm9sbFZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFN3aXRjaGVyOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OworCitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuc3RhdHVzYmFyLlN0YXR1c0Jhckljb247CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuc3RhdHVzYmFyLlN0YXR1c0Jhckljb25MaXN0OworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnN0YXR1c2Jhci5TdGF0dXNCYXJOb3RpZmljYXRpb247CisKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIuKjsKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5SOworCitwdWJsaWMgY2xhc3MgVGFibGV0U3RhdHVzQmFyU2VydmljZSBleHRlbmRzIFN0YXR1c0JhclNlcnZpY2UgeworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IGZhbHNlOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJUYWJsZXRTdGF0dXNCYXIiOworCisKKworICAgIGludCBtSWNvblNpemU7CisKKyAgICBIIG1IYW5kbGVyID0gbmV3IEgoKTsKKworICAgIC8vIHRyYWNraW5nIGFsbCBjdXJyZW50IG5vdGlmaWNhdGlvbnMKKyAgICBwcml2YXRlIE5vdGlmaWNhdGlvbkRhdGEgbU5vdG5zID0gbmV3IE5vdGlmaWNhdGlvbkRhdGEoKTsKKyAgICAKKyAgICBWaWV3IG1TdGF0dXNCYXJWaWV3OworICAgIE5vdGlmaWNhdGlvbkljb25BcmVhIG1Ob3RpZmljYXRpb25JY29uQXJlYTsKKworICAgIFZpZXcgbU5vdGlmaWNhdGlvblBhbmVsOworICAgIFN5c3RlbVBhbmVsIG1TeXN0ZW1QYW5lbDsKKworICAgIFZpZXdHcm91cCBtUGlsZTsKKyAgICBUZXh0VmlldyBtQ2xlYXJCdXR0b247CisKKyAgICBJbWFnZVZpZXcgbUJhdHRlcnlNZXRlcjsKKyAgICBJbWFnZVZpZXcgbVNpZ25hbE1ldGVyOworCisgICAgTm90aWZpY2F0aW9uSWNvbkFyZWEuSWNvbkxheW91dCBtSWNvbkxheW91dDsKKworICAgIEtpY2tlckNvbnRyb2xsZXIgbUtpY2tlcjsKKyAgICBWaWV3IG1LaWNrZXJWaWV3OworICAgIGJvb2xlYW4gbVRpY2tpbmc7CisgICAgYm9vbGVhbiBtRXhwYW5kZWRWaXNpYmxlOworCisgICAgLy8gZm9yIGRpc2FibGluZyB0aGUgc3RhdHVzIGJhcgorICAgIGludCBtRGlzYWJsZWQgPSAwOworCisgICAgcHJvdGVjdGVkIHZvaWQgYWRkUGFuZWxXaW5kb3dzKCkgeworICAgICAgICBtTm90aWZpY2F0aW9uUGFuZWwgPSBWaWV3LmluZmxhdGUodGhpcywgUi5sYXlvdXQuc3lzYmFyX3BhbmVsX25vdGlmaWNhdGlvbnMsIG51bGwpOworICAgICAgICBtU3lzdGVtUGFuZWwgPSAoU3lzdGVtUGFuZWwpIFZpZXcuaW5mbGF0ZSh0aGlzLCBSLmxheW91dC5zeXNiYXJfcGFuZWxfc3lzdGVtLCBudWxsKTsKKworICAgICAgICBtTm90aWZpY2F0aW9uUGFuZWwuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworICAgICAgICBtU3lzdGVtUGFuZWwuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworCisgICAgICAgIGZpbmFsIFJlc291cmNlcyByZXMgPSBnZXRSZXNvdXJjZXMoKTsKKyAgICAgICAgZmluYWwgaW50IGJhckhlaWdodD0gcmVzLmdldERpbWVuc2lvblBpeGVsU2l6ZSgKKyAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuZGltZW4uc3RhdHVzX2Jhcl9oZWlnaHQpOworCisgICAgICAgIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zIGxwID0gbmV3IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zKAorICAgICAgICAgICAgICAgIDQwMCwgLy8gVmlld0dyb3VwLkxheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQsCisgICAgICAgICAgICAgICAgVmlld0dyb3VwLkxheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQsCisgICAgICAgICAgICAgICAgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuVFlQRV9TVEFUVVNfQkFSX1BBTkVMLAorICAgICAgICAgICAgICAgIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfTEFZT1VUX0lOX1NDUkVFTgorICAgICAgICAgICAgICAgICAgICB8IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfTk9UX1RPVUNIX01PREFMCisgICAgICAgICAgICAgICAgICAgIHwgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19XQVRDSF9PVVRTSURFX1RPVUNICisgICAgICAgICAgICAgICAgICAgIHwgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19OT1RfRk9DVVNBQkxFCisgICAgICAgICAgICAgICAgICAgIHwgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19BTFRfRk9DVVNBQkxFX0lNLAorICAgICAgICAgICAgICAgIFBpeGVsRm9ybWF0LlRSQU5TTFVDRU5UKTsKKyAgICAgICAgbHAuZ3Jhdml0eSA9IEdyYXZpdHkuQk9UVE9NIHwgR3Jhdml0eS5MRUZUOworICAgICAgICBscC5zZXRUaXRsZSgiTm90aWZpY2F0aW9uUGFuZWwiKTsKKyAgICAgICAgbHAud2luZG93QW5pbWF0aW9ucyA9IGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGUuQW5pbWF0aW9uX1NsaWRpbmdDYXJkOworCisgICAgICAgIFdpbmRvd01hbmFnZXJJbXBsLmdldERlZmF1bHQoKS5hZGRWaWV3KG1Ob3RpZmljYXRpb25QYW5lbCwgbHApOworCisgICAgICAgIGxwID0gbmV3IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zKAorICAgICAgICAgICAgICAgIDUwMCwgLy8gVmlld0dyb3VwLkxheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQsCisgICAgICAgICAgICAgICAgVmlld0dyb3VwLkxheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQsCisgICAgICAgICAgICAgICAgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuVFlQRV9TVEFUVVNfQkFSX1BBTkVMLAorICAgICAgICAgICAgICAgIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfTEFZT1VUX0lOX1NDUkVFTgorICAgICAgICAgICAgICAgICAgICB8IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfTk9UX1RPVUNIX01PREFMCisgICAgICAgICAgICAgICAgICAgIHwgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19XQVRDSF9PVVRTSURFX1RPVUNICisgICAgICAgICAgICAgICAgICAgIHwgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19OT1RfRk9DVVNBQkxFCisgICAgICAgICAgICAgICAgICAgIHwgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19BTFRfRk9DVVNBQkxFX0lNLAorICAgICAgICAgICAgICAgIFBpeGVsRm9ybWF0LlRSQU5TTFVDRU5UKTsKKyAgICAgICAgbHAuZ3Jhdml0eSA9IEdyYXZpdHkuQk9UVE9NIHwgR3Jhdml0eS5DRU5URVJfSE9SSVpPTlRBTDsKKyAgICAgICAgbHAuc2V0VGl0bGUoIlN5c3RlbVBhbmVsIik7CisgICAgICAgIGxwLndpbmRvd0FuaW1hdGlvbnMgPSBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlLkFuaW1hdGlvbl9TbGlkaW5nQ2FyZDsKKworICAgICAgICBXaW5kb3dNYW5hZ2VySW1wbC5nZXREZWZhdWx0KCkuYWRkVmlldyhtU3lzdGVtUGFuZWwsIGxwKTsKKyAgICAgICAgbVN5c3RlbVBhbmVsLnNldEJhcih0aGlzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZSgpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoKTsgLy8gd2lsbCBhZGQgdGhlIG1haW4gYmFyIHZpZXcKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgVmlldyBtYWtlU3RhdHVzQmFyVmlldygpIHsKKyAgICAgICAgUmVzb3VyY2VzIHJlcyA9IGdldFJlc291cmNlcygpOworCisgICAgICAgIG1JY29uU2l6ZSA9IHJlcy5nZXREaW1lbnNpb25QaXhlbFNpemUoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5kaW1lbi5zdGF0dXNfYmFyX2ljb25fc2l6ZSk7CisKKyAgICAgICAgZmluYWwgVmlldyBzYiA9IFZpZXcuaW5mbGF0ZSh0aGlzLCBSLmxheW91dC5zdGF0dXNfYmFyLCBudWxsKTsKKyAgICAgICAgbVN0YXR1c0JhclZpZXcgPSBzYjsKKworICAgICAgICAvLyB0aGUgbW9yZSBub3RpZmljYXRpb25zIGljb24KKyAgICAgICAgbU5vdGlmaWNhdGlvbkljb25BcmVhID0gKE5vdGlmaWNhdGlvbkljb25BcmVhKXNiLmZpbmRWaWV3QnlJZChSLmlkLm5vdGlmaWNhdGlvbkljb25zKTsKKworICAgICAgICAvLyB3aGVyZSB0aGUgaWNvbnMgZ28KKyAgICAgICAgbUljb25MYXlvdXQgPSAoTm90aWZpY2F0aW9uSWNvbkFyZWEuSWNvbkxheW91dCkgc2IuZmluZFZpZXdCeUlkKFIuaWQuaWNvbnMpOworCisgICAgICAgIG1LaWNrZXIgPSBuZXcgS2lja2VyQ29udHJvbGxlcigoQ29udGV4dCl0aGlzLCBtU3RhdHVzQmFyVmlldyk7CisKKyAgICAgICAgLy8gU3lzdGVtIGluZm8gKGNlbnRlcikKKyAgICAgICAgbUJhdHRlcnlNZXRlciA9IChJbWFnZVZpZXcpIHNiLmZpbmRWaWV3QnlJZChSLmlkLmJhdHRlcnkpOworICAgICAgICBtU2lnbmFsTWV0ZXIgPSAoSW1hZ2VWaWV3KSBzYi5maW5kVmlld0J5SWQoUi5pZC5zaWduYWwpOworCisgICAgICAgIC8vIEFkZCB0aGUgd2luZG93cworICAgICAgICBhZGRQYW5lbFdpbmRvd3MoKTsKKworICAgICAgICBtUGlsZSA9IChWaWV3R3JvdXApbU5vdGlmaWNhdGlvblBhbmVsLmZpbmRWaWV3QnlJZChSLmlkLmNvbnRlbnQpOworICAgICAgICBtUGlsZS5yZW1vdmVBbGxWaWV3cygpOworICAgICAgICAKKyAgICAgICAgU2Nyb2xsVmlldyBzY3JvbGxlciA9IChTY3JvbGxWaWV3KW1QaWxlLmdldFBhcmVudCgpOworICAgICAgICBzY3JvbGxlci5zZXRGaWxsVmlld3BvcnQodHJ1ZSk7CisKKyAgICAgICAgbUNsZWFyQnV0dG9uID0gKFRleHRWaWV3KW1Ob3RpZmljYXRpb25QYW5lbC5maW5kVmlld0J5SWQoUi5pZC5jbGVhcl9hbGxfYnV0dG9uKTsKKyAgICAgICAgbUNsZWFyQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihtQ2xlYXJCdXR0b25MaXN0ZW5lcik7CisKKyAgICAgICAgcmV0dXJuIHNiOworICAgIH0KKworICAgIHByb3RlY3RlZCBpbnQgZ2V0U3RhdHVzQmFyR3Jhdml0eSgpIHsKKyAgICAgICAgcmV0dXJuIEdyYXZpdHkuQk9UVE9NIHwgR3Jhdml0eS5GSUxMX0hPUklaT05UQUw7CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBIIGV4dGVuZHMgSGFuZGxlciB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1TR19PUEVOX05PVElGSUNBVElPTl9QQU5FTCA9IDEwMDA7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1TR19DTE9TRV9OT1RJRklDQVRJT05fUEFORUwgPSAxMDAxOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNU0dfT1BFTl9TWVNURU1fUEFORUwgPSAxMDEwOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNU0dfQ0xPU0VfU1lTVEVNX1BBTkVMID0gMTAxMTsKKyAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG0pIHsKKyAgICAgICAgICAgIHN3aXRjaCAobS53aGF0KSB7CisgICAgICAgICAgICAgICAgY2FzZSBNU0dfT1BFTl9OT1RJRklDQVRJT05fUEFORUw6CisgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgU2xvZy5kKFRBRywgIm9wZW5pbmcgbm90aWZpY2F0aW9ucyBwYW5lbCIpOworICAgICAgICAgICAgICAgICAgICBtTm90aWZpY2F0aW9uUGFuZWwuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICAgICAgICAgICAgICBtRXhwYW5kZWRWaXNpYmxlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBNU0dfQ0xPU0VfTk9USUZJQ0FUSU9OX1BBTkVMOgorICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIFNsb2cuZChUQUcsICJjbG9zaW5nIG5vdGlmaWNhdGlvbnMgcGFuZWwiKTsKKyAgICAgICAgICAgICAgICAgICAgbU5vdGlmaWNhdGlvblBhbmVsLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICAgICAgICAgICAgICAgICAgbUV4cGFuZGVkVmlzaWJsZSA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19PUEVOX1NZU1RFTV9QQU5FTDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBTbG9nLmQoVEFHLCAib3BlbmluZyBzeXN0ZW0gcGFuZWwiKTsKKyAgICAgICAgICAgICAgICAgICAgbVN5c3RlbVBhbmVsLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBNU0dfQ0xPU0VfU1lTVEVNX1BBTkVMOgorICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIFNsb2cuZChUQUcsICJjbG9zaW5nIHN5c3RlbSBwYW5lbCIpOworICAgICAgICAgICAgICAgICAgICBtU3lzdGVtUGFuZWwuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXRCYXR0ZXJ5TWV0ZXIoaW50IGxldmVsLCBib29sZWFuIHBsdWdnZWQpIHsKKyAgICAgICAgaWYgKERFQlVHKSBTbG9nLmQoVEFHLCAiYmF0dGVyeT0iICsgbGV2ZWwgKyAocGx1Z2dlZCA/ICIgLSBwbHVnZ2VkIiA6ICIgLSB1bnBsdWdnZWQiKSk7CisgICAgICAgIG1CYXR0ZXJ5TWV0ZXIuc2V0SW1hZ2VSZXNvdXJjZShwbHVnZ2VkID8gUi5kcmF3YWJsZS5iYXR0ZXJ5X2NoYXJnaW5nIDogUi5kcmF3YWJsZS5iYXR0ZXJ5KTsKKyAgICAgICAgbUJhdHRlcnlNZXRlci5zZXRJbWFnZUxldmVsKGxldmVsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRXaWZpTWV0ZXIoaW50IGxldmVsKSB7CisgICAgICAgIGlmIChERUJVRykgU2xvZy5kKFRBRywgIndpZmk9IiArIGxldmVsKTsKKyAgICAgICAgbVNpZ25hbE1ldGVyLnNldEltYWdlUmVzb3VyY2UoUi5kcmF3YWJsZS5zaWduYWwpOworICAgICAgICBtU2lnbmFsTWV0ZXIuc2V0SW1hZ2VMZXZlbChsZXZlbCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkSWNvbihTdHJpbmcgc2xvdCwgaW50IGluZGV4LCBpbnQgdmlld0luZGV4LCBTdGF0dXNCYXJJY29uIGljb24pIHsKKyAgICAgICAgaWYgKERFQlVHKSBTbG9nLmQoVEFHLCAiYWRkSWNvbigiICsgc2xvdCArICIpIC0+ICIgKyBpY29uKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB1cGRhdGVJY29uKFN0cmluZyBzbG90LCBpbnQgaW5kZXgsIGludCB2aWV3SW5kZXgsCisgICAgICAgICAgICBTdGF0dXNCYXJJY29uIG9sZCwgU3RhdHVzQmFySWNvbiBpY29uKSB7CisgICAgICAgIGlmIChERUJVRykgU2xvZy5kKFRBRywgInVwZGF0ZUljb24oIiArIHNsb3QgKyAiKSAtPiAiICsgaWNvbik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVtb3ZlSWNvbihTdHJpbmcgc2xvdCwgaW50IGluZGV4LCBpbnQgdmlld0luZGV4KSB7CisgICAgICAgIGlmIChERUJVRykgU2xvZy5kKFRBRywgInJlbW92ZUljb24oIiArIHNsb3QgKyAiKSIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZE5vdGlmaWNhdGlvbihJQmluZGVyIGtleSwgU3RhdHVzQmFyTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgeworICAgICAgICBpZiAoREVCVUcpIFNsb2cuZChUQUcsICJhZGROb3RpZmljYXRpb24oIiArIGtleSArICIgLT4gIiArIG5vdGlmaWNhdGlvbiArICIpIik7CisgICAgICAgIGFkZE5vdGlmaWNhdGlvblZpZXdzKGtleSwgbm90aWZpY2F0aW9uKTsKKworICAgICAgICBib29sZWFuIGltbWVyc2l2ZSA9IGZhbHNlOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW1tZXJzaXZlID0gQWN0aXZpdHlNYW5hZ2VyTmF0aXZlLmdldERlZmF1bHQoKS5pc1RvcEFjdGl2aXR5SW1tZXJzaXZlKCk7CisgICAgICAgICAgICBTbG9nLmQoVEFHLCAiVG9wIGFjdGl2aXR5IGlzICIgKyAoaW1tZXJzaXZlPyJpbW1lcnNpdmUiOiJub3QgaW1tZXJzaXZlIikpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW1tZXJzaXZlKSB7CisgICAgICAgICAgICAvLyBUT0RPOiBpbW1lcnNpdmUgbW9kZSBwb3B1cHMgZm9yIHRhYmxldAorICAgICAgICB9IGVsc2UgaWYgKG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24uZnVsbFNjcmVlbkludGVudCAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyBub3QgaW1tZXJzaXZlICYgYSBmdWxsLXNjcmVlbiBhbGVydCBzaG91bGQgYmUgc2hvd24KKyAgICAgICAgICAgIFNsb2cuZChUQUcsICJOb3RpZmljYXRpb24gaGFzIGZ1bGxTY3JlZW5JbnRlbnQgYW5kIGFjdGl2aXR5IGlzIG5vdCBpbW1lcnNpdmU7IgorICAgICAgICAgICAgICAgICAgICArICIgc2VuZGluZyBmdWxsU2NyZWVuSW50ZW50Iik7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24uZnVsbFNjcmVlbkludGVudC5zZW5kKCk7CisgICAgICAgICAgICB9IGNhdGNoIChQZW5kaW5nSW50ZW50LkNhbmNlbGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIHRpY2soKQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdXBkYXRlTm90aWZpY2F0aW9uKElCaW5kZXIga2V5LCBTdGF0dXNCYXJOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CisgICAgICAgIGlmIChERUJVRykgU2xvZy5kKFRBRywgInVwZGF0ZU5vdGlmaWNhdGlvbigiICsga2V5ICsgIiAtPiAiICsgbm90aWZpY2F0aW9uICsgIikgLy8gVE9ETyIpOworICAgICAgICAKKyAgICAgICAgZmluYWwgTm90aWZpY2F0aW9uRGF0YS5FbnRyeSBvbGRFbnRyeSA9IG1Ob3Rucy5maW5kQnlLZXkoa2V5KTsKKyAgICAgICAgaWYgKG9sZEVudHJ5ID09IG51bGwpIHsKKyAgICAgICAgICAgIFNsb2cudyhUQUcsICJ1cGRhdGVOb3RpZmljYXRpb24gZm9yIHVua25vd24ga2V5OiAiICsga2V5KTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIFN0YXR1c0Jhck5vdGlmaWNhdGlvbiBvbGROb3RpZmljYXRpb24gPSBvbGRFbnRyeS5ub3RpZmljYXRpb247CisgICAgICAgIGZpbmFsIFJlbW90ZVZpZXdzIG9sZENvbnRlbnRWaWV3ID0gb2xkTm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi5jb250ZW50VmlldzsKKworICAgICAgICBmaW5hbCBSZW1vdGVWaWV3cyBjb250ZW50VmlldyA9IG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24uY29udGVudFZpZXc7CisKKyAgICAgICAgaWYgKGZhbHNlKSB7CisgICAgICAgICAgICBTbG9nLmQoVEFHLCAib2xkIG5vdGlmaWNhdGlvbjogd2hlbj0iICsgb2xkTm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi53aGVuCisgICAgICAgICAgICAgICAgICAgICsgIiBvbmdvaW5nPSIgKyBvbGROb3RpZmljYXRpb24uaXNPbmdvaW5nKCkKKyAgICAgICAgICAgICAgICAgICAgKyAiIGV4cGFuZGVkPSIgKyBvbGRFbnRyeS5leHBhbmRlZAorICAgICAgICAgICAgICAgICAgICArICIgY29udGVudFZpZXc9IiArIG9sZENvbnRlbnRWaWV3KTsKKyAgICAgICAgICAgIFNsb2cuZChUQUcsICJuZXcgbm90aWZpY2F0aW9uOiB3aGVuPSIgKyBub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLndoZW4KKyAgICAgICAgICAgICAgICAgICAgKyAiIG9uZ29pbmc9IiArIG9sZE5vdGlmaWNhdGlvbi5pc09uZ29pbmcoKQorICAgICAgICAgICAgICAgICAgICArICIgY29udGVudFZpZXc9IiArIGNvbnRlbnRWaWV3KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENhbiB3ZSBqdXN0IHJlYXBwbHkgdGhlIFJlbW90ZVZpZXdzIGluIHBsYWNlPyAgSWYgd2hlbiBkaWRuJ3QgY2hhbmdlLCB0aGUgb3JkZXIKKyAgICAgICAgLy8gZGlkbid0IGNoYW5nZS4KKyAgICAgICAgaWYgKG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24ud2hlbiA9PSBvbGROb3RpZmljYXRpb24ubm90aWZpY2F0aW9uLndoZW4KKyAgICAgICAgICAgICAgICAmJiBub3RpZmljYXRpb24uaXNPbmdvaW5nKCkgPT0gb2xkTm90aWZpY2F0aW9uLmlzT25nb2luZygpCisgICAgICAgICAgICAgICAgJiYgb2xkRW50cnkuZXhwYW5kZWQgIT0gbnVsbAorICAgICAgICAgICAgICAgICYmIGNvbnRlbnRWaWV3ICE9IG51bGwKKyAgICAgICAgICAgICAgICAmJiBvbGRDb250ZW50VmlldyAhPSBudWxsCisgICAgICAgICAgICAgICAgJiYgY29udGVudFZpZXcuZ2V0UGFja2FnZSgpICE9IG51bGwKKyAgICAgICAgICAgICAgICAmJiBvbGRDb250ZW50Vmlldy5nZXRQYWNrYWdlKCkgIT0gbnVsbAorICAgICAgICAgICAgICAgICYmIG9sZENvbnRlbnRWaWV3LmdldFBhY2thZ2UoKS5lcXVhbHMoY29udGVudFZpZXcuZ2V0UGFja2FnZSgpKQorICAgICAgICAgICAgICAgICYmIG9sZENvbnRlbnRWaWV3LmdldExheW91dElkKCkgPT0gY29udGVudFZpZXcuZ2V0TGF5b3V0SWQoKSkgeworICAgICAgICAgICAgaWYgKERFQlVHKSBTbG9nLmQoVEFHLCAicmV1c2luZyBub3RpZmljYXRpb24gZm9yIGtleTogIiArIGtleSk7CisgICAgICAgICAgICBvbGRFbnRyeS5ub3RpZmljYXRpb24gPSBub3RpZmljYXRpb247CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIC8vIFJlYXBwbHkgdGhlIFJlbW90ZVZpZXdzCisgICAgICAgICAgICAgICAgY29udGVudFZpZXcucmVhcHBseSh0aGlzLCBvbGRFbnRyeS5jb250ZW50KTsKKyAgICAgICAgICAgICAgICAvLyB1cGRhdGUgdGhlIGNvbnRlbnRJbnRlbnQKKyAgICAgICAgICAgICAgICBmaW5hbCBQZW5kaW5nSW50ZW50IGNvbnRlbnRJbnRlbnQgPSBub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLmNvbnRlbnRJbnRlbnQ7CisgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnRJbnRlbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBvbGRFbnRyeS5jb250ZW50LnNldE9uQ2xpY2tMaXN0ZW5lcihuZXcgTm90aWZpY2F0aW9uQ2xpY2tlcihjb250ZW50SW50ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb24ucGtnLCBub3RpZmljYXRpb24udGFnLCBub3RpZmljYXRpb24uaWQpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBpY29uLgorICAgICAgICAgICAgICAgIGZpbmFsIFN0YXR1c0Jhckljb24gaWMgPSBuZXcgU3RhdHVzQmFySWNvbihub3RpZmljYXRpb24ucGtnLAorICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi5pY29uLCBub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLmljb25MZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24ubnVtYmVyKTsKKyAgICAgICAgICAgICAgICBpZiAoIW9sZEVudHJ5Lmljb24uc2V0KGljKSkgeworICAgICAgICAgICAgICAgICAgICBoYW5kbGVOb3RpZmljYXRpb25FcnJvcihrZXksIG5vdGlmaWNhdGlvbiwgIkNvdWxkbid0IHVwZGF0ZSBpY29uOiAiICsgaWMpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8vIEl0IGZhaWxlZCB0byBhZGQgY2xlYW5seS4gIExvZywgYW5kIHJlbW92ZSB0aGUgdmlldyBmcm9tIHRoZSBwYW5lbC4KKyAgICAgICAgICAgICAgICBTbG9nLncoVEFHLCAiQ291bGRuJ3QgcmVhcHBseSB2aWV3cyBmb3IgcGFja2FnZSAiICsgY29udGVudFZpZXcuZ2V0UGFja2FnZSgpLCBlKTsKKyAgICAgICAgICAgICAgICByZW1vdmVOb3RpZmljYXRpb25WaWV3cyhrZXkpOworICAgICAgICAgICAgICAgIGFkZE5vdGlmaWNhdGlvblZpZXdzKGtleSwgbm90aWZpY2F0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChERUJVRykgU2xvZy5kKFRBRywgIm5vdCByZXVzaW5nIG5vdGlmaWNhdGlvbiBmb3Iga2V5OiAiICsga2V5KTsKKyAgICAgICAgICAgIHJlbW92ZU5vdGlmaWNhdGlvblZpZXdzKGtleSk7CisgICAgICAgICAgICBhZGROb3RpZmljYXRpb25WaWV3cyhrZXksIG5vdGlmaWNhdGlvbik7CisgICAgICAgIH0KKyAgICAgICAgLy8gVE9ETzoga2lja2VyOyBpbW1lcnNpdmUgbW9kZQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlbW92ZU5vdGlmaWNhdGlvbihJQmluZGVyIGtleSkgeworICAgICAgICBpZiAoREVCVUcpIFNsb2cuZChUQUcsICJyZW1vdmVOb3RpZmljYXRpb24oIiArIGtleSArICIpIC8vIFRPRE8iKTsKKyAgICAgICAgcmVtb3ZlTm90aWZpY2F0aW9uVmlld3Moa2V5KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBkaXNhYmxlKGludCBzdGF0ZSkgeworICAgICAgICAvKgorICAgICAgICBmaW5hbCBpbnQgb2xkID0gbURpc2FibGVkOworICAgICAgICBmaW5hbCBpbnQgZGlmZiA9IHN0YXRlIF4gb2xkOworICAgICAgICBtRGlzYWJsZWQgPSBzdGF0ZTsKKworICAgICAgICBpZiAoKGRpZmYgJiBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfRVhQQU5EKSAhPSAwKSB7CisgICAgICAgICAgICBpZiAoKHN0YXRlICYgU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX0VYUEFORCkgIT0gMCkgeworICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJESVNBQkxFX0VYUEFORDogeWVzIik7CisgICAgICAgICAgICAgICAgYW5pbWF0ZUNvbGxhcHNlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKChkaWZmICYgU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX05PVElGSUNBVElPTl9JQ09OUykgIT0gMCkgeworICAgICAgICAgICAgaWYgKChzdGF0ZSAmIFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9OT1RJRklDQVRJT05fSUNPTlMpICE9IDApIHsKKyAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAiRElTQUJMRV9OT1RJRklDQVRJT05fSUNPTlM6IHllcyIpOworICAgICAgICAgICAgICAgIGlmIChtVGlja2luZykgeworICAgICAgICAgICAgICAgICAgICBtS2lja2VyLmhhbHQoKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtTm90aWZpY2F0aW9uSWNvbkFyZWEuc2V0VmlzaWJpbGl0eShWaWV3LklOVklTSUJMRSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAiRElTQUJMRV9OT1RJRklDQVRJT05fSUNPTlM6IG5vIik7CisgICAgICAgICAgICAgICAgaWYgKCFtRXhwYW5kZWRWaXNpYmxlKSB7CisgICAgICAgICAgICAgICAgICAgIG1Ob3RpZmljYXRpb25JY29uQXJlYS5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKChkaWZmICYgU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX05PVElGSUNBVElPTl9USUNLRVIpICE9IDApIHsKKyAgICAgICAgICAgIGlmIChtVGlja2luZyAmJiAoc3RhdGUgJiBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfTk9USUZJQ0FUSU9OX1RJQ0tFUikgIT0gMCkgeworICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJESVNBQkxFX05PVElGSUNBVElPTl9USUNLRVI6IHllcyIpOworICAgICAgICAgICAgICAgIG1LaWNrZXIuaGFsdCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICovCisgICAgfQorCisgICAgdm9pZCBwZXJmb3JtRGlzYWJsZUFjdGlvbnMoaW50IG5ldCkgeworICAgICAgICAvKgorICAgICAgICBpbnQgb2xkID0gbURpc2FibGVkOworICAgICAgICBpbnQgZGlmZiA9IG5ldCBeIG9sZDsKKyAgICAgICAgbURpc2FibGVkID0gbmV0OworCisgICAgICAgIC8vIGFjdCBhY2NvcmRpbmdseQorICAgICAgICBpZiAoKGRpZmYgJiBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfRVhQQU5EKSAhPSAwKSB7CisgICAgICAgICAgICBpZiAoKG5ldCAmIFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9FWFBBTkQpICE9IDApIHsKKyAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAiRElTQUJMRV9FWFBBTkQ6IHllcyIpOworICAgICAgICAgICAgICAgIGFuaW1hdGVDb2xsYXBzZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICgoZGlmZiAmIFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9OT1RJRklDQVRJT05fSUNPTlMpICE9IDApIHsKKyAgICAgICAgICAgIGlmICgobmV0ICYgU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX05PVElGSUNBVElPTl9JQ09OUykgIT0gMCkgeworICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJESVNBQkxFX05PVElGSUNBVElPTl9JQ09OUzogeWVzIik7CisgICAgICAgICAgICAgICAgaWYgKG1UaWNraW5nKSB7CisgICAgICAgICAgICAgICAgICAgIG1Ob3RpZmljYXRpb25JY29uQXJlYS5zZXRWaXNpYmlsaXR5KFZpZXcuSU5WSVNJQkxFKTsKKyAgICAgICAgICAgICAgICAgICAgbUtpY2tlci5oYWx0KCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbU5vdGlmaWNhdGlvbkljb25BcmVhLnNldFZpc2liaWxpdHkoVmlldy5JTlZJU0lCTEUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgIkRJU0FCTEVfTk9USUZJQ0FUSU9OX0lDT05TOiBubyIpOworICAgICAgICAgICAgICAgIGlmICghbUV4cGFuZGVkVmlzaWJsZSkgeworICAgICAgICAgICAgICAgICAgICBtTm90aWZpY2F0aW9uSWNvbkFyZWEuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICgoZGlmZiAmIFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9OT1RJRklDQVRJT05fVElDS0VSKSAhPSAwKSB7CisgICAgICAgICAgICBpZiAobVRpY2tpbmcgJiYgKG5ldCAmIFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9OT1RJRklDQVRJT05fVElDS0VSKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgbUtpY2tlci5oYWx0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgKi8KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdGljayhTdGF0dXNCYXJOb3RpZmljYXRpb24gbikgeworICAgICAgICAvLyBTaG93IHRoZSB0aWNrZXIgaWYgb25lIGlzIHJlcXVlc3RlZC4gQWxzbyBkb24ndCBkbyB0aGlzCisgICAgICAgIC8vIHVudGlsIHN0YXR1cyBiYXIgd2luZG93IGlzIGF0dGFjaGVkIHRvIHRoZSB3aW5kb3cgbWFuYWdlciwKKyAgICAgICAgLy8gYmVjYXVzZS4uLiAgd2VsbCwgd2hhdCdzIHRoZSBwb2ludCBvdGhlcndpc2U/ICBBbmQgdHJ5aW5nIHRvCisgICAgICAgIC8vIHJ1biBhIHRpY2tlciB3aXRob3V0IGJlaW5nIGF0dGFjaGVkIHdpbGwgY3Jhc2ghCisgICAgICAgIGlmIChuLm5vdGlmaWNhdGlvbi50aWNrZXJUZXh0ICE9IG51bGwgJiYgbVN0YXR1c0JhclZpZXcuZ2V0V2luZG93VG9rZW4oKSAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoMCA9PSAobURpc2FibGVkICYgKFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9OT1RJRklDQVRJT05fSUNPTlMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9OT1RJRklDQVRJT05fVElDS0VSKSkpIHsKKyAgICAgICAgICAgICAgICBtS2lja2VyLmFkZEVudHJ5KG4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBLaWNrZXJDb250cm9sbGVyIHsKKyAgICAgICAgVmlldyBtVmlldzsKKyAgICAgICAgSW1hZ2VWaWV3IG1LaWNrZXJJY29uOworICAgICAgICBUZXh0U3dpdGNoZXIgbUtpY2tlclRleHQ7CisKKyAgICAgICAgcHVibGljIEtpY2tlckNvbnRyb2xsZXIoQ29udGV4dCBjb250ZXh0LCBWaWV3IHNiKSB7CisgICAgICAgICAgICBtVmlldyA9IHNiLmZpbmRWaWV3QnlJZChSLmlkLnRpY2tlcik7CisgICAgICAgICAgICBtS2lja2VySWNvbiA9IChJbWFnZVZpZXcpIG1WaWV3LmZpbmRWaWV3QnlJZChSLmlkLnRpY2tlckljb24pOworICAgICAgICAgICAgbUtpY2tlclRleHQgPSAoVGV4dFN3aXRjaGVyKSBtVmlldy5maW5kVmlld0J5SWQoUi5pZC50aWNrZXJUZXh0KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGhhbHQoKSB7CisgICAgICAgICAgICB0aWNrZXJIYWx0aW5nKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBhZGRFbnRyeShTdGF0dXNCYXJOb3RpZmljYXRpb24gbikgeworICAgICAgICAgICAgbUtpY2tlckljb24uc2V0SW1hZ2VSZXNvdXJjZShuLm5vdGlmaWNhdGlvbi5pY29uKTsKKyAgICAgICAgICAgIG1LaWNrZXJUZXh0LnNldEN1cnJlbnRUZXh0KG4ubm90aWZpY2F0aW9uLnRpY2tlclRleHQpOworICAgICAgICAgICAgdGlja2VyU3RhcnRpbmcoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHRpY2tlclN0YXJ0aW5nKCkgeworICAgICAgICAgICAgbVRpY2tpbmcgPSB0cnVlOworICAgICAgICAgICAgbUljb25MYXlvdXQuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworICAgICAgICAgICAgbUtpY2tlclZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdGlja2VyRG9uZSgpIHsKKyAgICAgICAgICAgIG1JY29uTGF5b3V0LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgICAgIG1LaWNrZXJWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICAgICAgICAgIG1UaWNraW5nID0gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB0aWNrZXJIYWx0aW5nKCkgeworICAgICAgICAgICAgbUljb25MYXlvdXQuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICAgICAgbUtpY2tlclZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworICAgICAgICAgICAgbVRpY2tpbmcgPSBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFuaW1hdGVFeHBhbmQoKSB7CisgICAgICAgIG1IYW5kbGVyLnJlbW92ZU1lc3NhZ2VzKEguTVNHX09QRU5fTk9USUZJQ0FUSU9OX1BBTkVMKTsKKyAgICAgICAgbUhhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZShILk1TR19PUEVOX05PVElGSUNBVElPTl9QQU5FTCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYW5pbWF0ZUNvbGxhcHNlKCkgeworICAgICAgICBtSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhILk1TR19DTE9TRV9OT1RJRklDQVRJT05fUEFORUwpOworICAgICAgICBtSGFuZGxlci5zZW5kRW1wdHlNZXNzYWdlKEguTVNHX0NMT1NFX05PVElGSUNBVElPTl9QQU5FTCk7CisgICAgICAgIG1IYW5kbGVyLnJlbW92ZU1lc3NhZ2VzKEguTVNHX0NMT1NFX1NZU1RFTV9QQU5FTCk7CisgICAgICAgIG1IYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2UoSC5NU0dfQ0xPU0VfU1lTVEVNX1BBTkVMKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBub3RpZmljYXRpb25JY29uc0NsaWNrZWQoVmlldyB2KSB7CisgICAgICAgIGlmIChERUJVRykgU2xvZy5kKFRBRywgImNsaWNrZWQgbm90aWZpY2F0aW9uIGljb25zIik7CisgICAgICAgIG1IYW5kbGVyLnJlbW92ZU1lc3NhZ2VzKEguTVNHX0NMT1NFX1NZU1RFTV9QQU5FTCk7CisgICAgICAgIG1IYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2UoSC5NU0dfQ0xPU0VfU1lTVEVNX1BBTkVMKTsKKworICAgICAgICBpbnQgbXNnID0gKG1Ob3RpZmljYXRpb25QYW5lbC5nZXRWaXNpYmlsaXR5KCkgPT0gVmlldy5HT05FKSAKKyAgICAgICAgICAgID8gSC5NU0dfT1BFTl9OT1RJRklDQVRJT05fUEFORUwKKyAgICAgICAgICAgIDogSC5NU0dfQ0xPU0VfTk9USUZJQ0FUSU9OX1BBTkVMOworICAgICAgICBtSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhtc2cpOworICAgICAgICBtSGFuZGxlci5zZW5kRW1wdHlNZXNzYWdlKG1zZyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc3lzdGVtSW5mb0NsaWNrZWQoVmlldyB2KSB7CisgICAgICAgIGlmIChERUJVRykgU2xvZy5kKFRBRywgImNsaWNrZWQgc3lzdGVtIGluZm8iKTsKKyAgICAgICAgbUhhbmRsZXIucmVtb3ZlTWVzc2FnZXMoSC5NU0dfQ0xPU0VfTk9USUZJQ0FUSU9OX1BBTkVMKTsKKyAgICAgICAgbUhhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZShILk1TR19DTE9TRV9OT1RJRklDQVRJT05fUEFORUwpOworCisgICAgICAgIGludCBtc2cgPSAobVN5c3RlbVBhbmVsLmdldFZpc2liaWxpdHkoKSA9PSBWaWV3LkdPTkUpIAorICAgICAgICAgICAgPyBILk1TR19PUEVOX1NZU1RFTV9QQU5FTAorICAgICAgICAgICAgOiBILk1TR19DTE9TRV9TWVNURU1fUEFORUw7CisgICAgICAgIG1IYW5kbGVyLnJlbW92ZU1lc3NhZ2VzKG1zZyk7CisgICAgICAgIG1IYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2UobXNnKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYW5jZWwgdGhpcyBub3RpZmljYXRpb24gYW5kIHRlbGwgdGhlIHN0YXR1cyBiYXIgc2VydmljZSBhYm91dCB0aGUgZmFpbHVyZS4gSG9sZCBubyBsb2Nrcy4KKyAgICAgKi8KKyAgICB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbkVycm9yKElCaW5kZXIga2V5LCBTdGF0dXNCYXJOb3RpZmljYXRpb24gbiwgU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICAgICAgcmVtb3ZlTm90aWZpY2F0aW9uKGtleSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtQmFyU2VydmljZS5vbk5vdGlmaWNhdGlvbkVycm9yKG4ucGtnLCBuLnRhZywgbi5pZCwgbi51aWQsIG4uaW5pdGlhbFBpZCwgbWVzc2FnZSk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgLy8gVGhlIGVuZCBpcyBuaWdoLgorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBWaWV3Lk9uQ2xpY2tMaXN0ZW5lciBtQ2xlYXJCdXR0b25MaXN0ZW5lciA9IG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbUJhclNlcnZpY2Uub25DbGVhckFsbE5vdGlmaWNhdGlvbnMoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIC8vIHN5c3RlbSBwcm9jZXNzIGlzIGRlYWQgaWYgd2UncmUgaGVyZS4KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFuaW1hdGVDb2xsYXBzZSgpOworICAgICAgICB9CisgICAgfTsKKworICAgIHByaXZhdGUgY2xhc3MgTm90aWZpY2F0aW9uQ2xpY2tlciBpbXBsZW1lbnRzIFZpZXcuT25DbGlja0xpc3RlbmVyIHsKKyAgICAgICAgcHJpdmF0ZSBQZW5kaW5nSW50ZW50IG1JbnRlbnQ7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIG1Qa2c7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIG1UYWc7CisgICAgICAgIHByaXZhdGUgaW50IG1JZDsKKworICAgICAgICBOb3RpZmljYXRpb25DbGlja2VyKFBlbmRpbmdJbnRlbnQgaW50ZW50LCBTdHJpbmcgcGtnLCBTdHJpbmcgdGFnLCBpbnQgaWQpIHsKKyAgICAgICAgICAgIG1JbnRlbnQgPSBpbnRlbnQ7CisgICAgICAgICAgICBtUGtnID0gcGtnOworICAgICAgICAgICAgbVRhZyA9IHRhZzsKKyAgICAgICAgICAgIG1JZCA9IGlkOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgLy8gVGhlIGludGVudCB3ZSBhcmUgc2VuZGluZyBpcyBmb3IgdGhlIGFwcGxpY2F0aW9uLCB3aGljaAorICAgICAgICAgICAgICAgIC8vIHdvbid0IGhhdmUgcGVybWlzc2lvbiB0byBpbW1lZGlhdGVseSBzdGFydCBhbiBhY3Rpdml0eSBhZnRlcgorICAgICAgICAgICAgICAgIC8vIHRoZSB1c2VyIHN3aXRjaGVzIHRvIGhvbWUuICBXZSBrbm93IGl0IGlzIHNhZmUgdG8gZG8gYXQgdGhpcworICAgICAgICAgICAgICAgIC8vIHBvaW50LCBzbyBtYWtlIHN1cmUgbmV3IGFjdGl2aXR5IHN3aXRjaGVzIGFyZSBub3cgYWxsb3dlZC4KKyAgICAgICAgICAgICAgICBBY3Rpdml0eU1hbmFnZXJOYXRpdmUuZ2V0RGVmYXVsdCgpLnJlc3VtZUFwcFN3aXRjaGVzKCk7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobUludGVudCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaW50W10gcG9zID0gbmV3IGludFsyXTsKKyAgICAgICAgICAgICAgICB2LmdldExvY2F0aW9uT25TY3JlZW4ocG9zKTsKKyAgICAgICAgICAgICAgICBJbnRlbnQgb3ZlcmxheSA9IG5ldyBJbnRlbnQoKTsKKyAgICAgICAgICAgICAgICBvdmVybGF5LnNldFNvdXJjZUJvdW5kcygKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBSZWN0KHBvc1swXSwgcG9zWzFdLCBwb3NbMF0rdi5nZXRXaWR0aCgpLCBwb3NbMV0rdi5nZXRIZWlnaHQoKSkpOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIG1JbnRlbnQuc2VuZChUYWJsZXRTdGF0dXNCYXJTZXJ2aWNlLnRoaXMsIDAsIG92ZXJsYXkpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFBlbmRpbmdJbnRlbnQuQ2FuY2VsZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAvLyB0aGUgc3RhY2sgdHJhY2UgaXNuJ3QgdmVyeSBoZWxwZnVsIGhlcmUuICBKdXN0IGxvZyB0aGUgZXhjZXB0aW9uIG1lc3NhZ2UuCisgICAgICAgICAgICAgICAgICAgIFNsb2cudyhUQUcsICJTZW5kaW5nIGNvbnRlbnRJbnRlbnQgZmFpbGVkOiAiICsgZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1CYXJTZXJ2aWNlLm9uTm90aWZpY2F0aW9uQ2xpY2sobVBrZywgbVRhZywgbUlkKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIC8vIHN5c3RlbSBwcm9jZXNzIGlzIGRlYWQgaWYgd2UncmUgaGVyZS4KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gY2xvc2UgdGhlIHNoYWRlIGlmIGl0IHdhcyBvcGVuCisgICAgICAgICAgICBhbmltYXRlQ29sbGFwc2UoKTsKKworICAgICAgICAgICAgLy8gSWYgdGhpcyBjbGljayB3YXMgb24gdGhlIGludHJ1ZGVyIGFsZXJ0LCBoaWRlIHRoYXQgaW5zdGVhZAorLy8gICAgICAgICAgICBtSGFuZGxlci5zZW5kRW1wdHlNZXNzYWdlKE1TR19ISURFX0lOVFJVREVSKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIFN0YXR1c0Jhck5vdGlmaWNhdGlvbiByZW1vdmVOb3RpZmljYXRpb25WaWV3cyhJQmluZGVyIGtleSkgeworICAgICAgICBOb3RpZmljYXRpb25EYXRhLkVudHJ5IGVudHJ5ID0gbU5vdG5zLnJlbW92ZShrZXkpOworICAgICAgICBpZiAoZW50cnkgPT0gbnVsbCkgeworICAgICAgICAgICAgU2xvZy53KFRBRywgInJlbW92ZU5vdGlmaWNhdGlvbiBmb3IgdW5rbm93biBrZXk6ICIgKyBrZXkpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgLy8gUmVtb3ZlIHRoZSBleHBhbmRlZCB2aWV3LgorICAgICAgICBWaWV3R3JvdXAgcm93UGFyZW50ID0gKFZpZXdHcm91cCllbnRyeS5yb3cuZ2V0UGFyZW50KCk7CisgICAgICAgIGlmIChyb3dQYXJlbnQgIT0gbnVsbCkgcm93UGFyZW50LnJlbW92ZVZpZXcoZW50cnkucm93KTsKKyAgICAgICAgLy8gUmVtb3ZlIHRoZSBpY29uLgorLy8gICAgICAgIFZpZXdHcm91cCBpY29uUGFyZW50ID0gKFZpZXdHcm91cCllbnRyeS5pY29uLmdldFBhcmVudCgpOworLy8gICAgICAgIGlmIChpY29uUGFyZW50ICE9IG51bGwpIGljb25QYXJlbnQucmVtb3ZlVmlldyhlbnRyeS5pY29uKTsKKyAgICAgICAgcmVmcmVzaEljb25zKCk7CisKKyAgICAgICAgcmV0dXJuIGVudHJ5Lm5vdGlmaWNhdGlvbjsKKyAgICB9CisKKyAgICBTdGF0dXNCYXJJY29uVmlldyBhZGROb3RpZmljYXRpb25WaWV3cyhJQmluZGVyIGtleSwgU3RhdHVzQmFyTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgeworICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgIFNsb2cuZChUQUcsICJhZGROb3RpZmljYXRpb25WaWV3cyhrZXk9IiArIGtleSArICIsIG5vdGlmaWNhdGlvbj0iICsgbm90aWZpY2F0aW9uKTsKKyAgICAgICAgfQorICAgICAgICAvLyBDb25zdHJ1Y3QgdGhlIGljb24uCisgICAgICAgIGZpbmFsIFN0YXR1c0Jhckljb25WaWV3IGljb25WaWV3ID0gbmV3IFN0YXR1c0Jhckljb25WaWV3KHRoaXMsCisgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uLnBrZyArICIvMHgiICsgSW50ZWdlci50b0hleFN0cmluZyhub3RpZmljYXRpb24uaWQpKTsKKyAgICAgICAgaWNvblZpZXcuc2V0U2NhbGVUeXBlKEltYWdlVmlldy5TY2FsZVR5cGUuQ0VOVEVSX0lOU0lERSk7CisKKyAgICAgICAgZmluYWwgU3RhdHVzQmFySWNvbiBpYyA9IG5ldyBTdGF0dXNCYXJJY29uKG5vdGlmaWNhdGlvbi5wa2csCisgICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24uaWNvbiwKKyAgICAgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi5pY29uTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24ubnVtYmVyKTsKKyAgICAgICAgaWYgKCFpY29uVmlldy5zZXQoaWMpKSB7CisgICAgICAgICAgICBoYW5kbGVOb3RpZmljYXRpb25FcnJvcihrZXksIG5vdGlmaWNhdGlvbiwgIkNvdWxkbid0IGF0dGFjaCBTdGF0dXNCYXJJY29uOiAiICsgaWMpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgLy8gQ29uc3RydWN0IHRoZSBleHBhbmRlZCB2aWV3LgorICAgICAgICBOb3RpZmljYXRpb25EYXRhLkVudHJ5IGVudHJ5ID0gbmV3IE5vdGlmaWNhdGlvbkRhdGEuRW50cnkoa2V5LCBub3RpZmljYXRpb24sIGljb25WaWV3KTsKKyAgICAgICAgaWYgKCFpbmZsYXRlVmlld3MoZW50cnksIG1QaWxlKSkgeworICAgICAgICAgICAgaGFuZGxlTm90aWZpY2F0aW9uRXJyb3Ioa2V5LCBub3RpZmljYXRpb24sICJDb3VsZG4ndCBleHBhbmQgUmVtb3RlVmlld3MgZm9yOiAiCisgICAgICAgICAgICAgICAgICAgICsgbm90aWZpY2F0aW9uKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIC8vIEFkZCB0aGUgaWNvbi4KKyAgICAgICAgbU5vdG5zLmFkZChlbnRyeSk7CisgICAgICAgIHJlZnJlc2hJY29ucygpOworCisgICAgICAgIHJldHVybiBpY29uVmlldzsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcmVmcmVzaEljb25zKCkgeworICAgICAgICAvLyBYWFg6IG5lZWQgdG8gaW1wbGVtZW50IGEgbmV3IGxpbWl0ZWQgbGluZWFyIGxheW91dCBjbGFzcworICAgICAgICAvLyB0byBhdm9pZCByZW1vdmluZyAmIHJlYWRkaW5nIGV2ZXJ5dGhpbmcKKworICAgICAgICBpbnQgTiA9IG1Ob3Rucy5zaXplKCk7CisgICAgICAgIExpbmVhckxheW91dC5MYXlvdXRQYXJhbXMgcGFyYW1zID0gbmV3IExpbmVhckxheW91dC5MYXlvdXRQYXJhbXMobUljb25TaXplLCBtSWNvblNpemUpOworCisgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgU2xvZy5kKFRBRywgInJlZnJlc2hpbmcgaWNvbnMgKCIgKyBOICsgIiBub3RpZmljYXRpb25zLCBtSWNvbkxheW91dD0iCisgICAgICAgICAgICAgICAgICAgICsgbUljb25MYXlvdXQgKyAiLCBtUGlsZT0iICsgbVBpbGUpOworICAgICAgICB9CisKKyAgICAgICAgbUljb25MYXlvdXQucmVtb3ZlQWxsVmlld3MoKTsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpPDQ7IGkrKykgeworICAgICAgICAgICAgaWYgKGk+PU4pIGJyZWFrOworICAgICAgICAgICAgbUljb25MYXlvdXQuYWRkVmlldyhtTm90bnMuZ2V0KE4taS0xKS5pY29uLCBpLCBwYXJhbXMpOworICAgICAgICB9CisKKyAgICAgICAgbVBpbGUucmVtb3ZlQWxsVmlld3MoKTsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpPE47IGkrKykgeworICAgICAgICAgICAgbVBpbGUuYWRkVmlldyhtTm90bnMuZ2V0KE4taS0xKS5yb3cpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGluZmxhdGVWaWV3cyhOb3RpZmljYXRpb25EYXRhLkVudHJ5IGVudHJ5LCBWaWV3R3JvdXAgcGFyZW50KSB7CisgICAgICAgIFN0YXR1c0Jhck5vdGlmaWNhdGlvbiBzYm4gPSBlbnRyeS5ub3RpZmljYXRpb247CisgICAgICAgIFJlbW90ZVZpZXdzIHJlbW90ZVZpZXdzID0gc2JuLm5vdGlmaWNhdGlvbi5jb250ZW50VmlldzsKKyAgICAgICAgaWYgKHJlbW90ZVZpZXdzID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGNyZWF0ZSB0aGUgcm93IHZpZXcKKyAgICAgICAgTGF5b3V0SW5mbGF0ZXIgaW5mbGF0ZXIgPSAoTGF5b3V0SW5mbGF0ZXIpZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkxBWU9VVF9JTkZMQVRFUl9TRVJWSUNFKTsKKyAgICAgICAgVmlldyByb3cgPSBpbmZsYXRlci5pbmZsYXRlKFIubGF5b3V0LnN0YXR1c19iYXJfbGF0ZXN0X2V2ZW50LCBwYXJlbnQsIGZhbHNlKTsKKyAgICAgICAgVmlldyB2ZXRvQnV0dG9uID0gcm93LmZpbmRWaWV3QnlJZChSLmlkLnZldG8pOworICAgICAgICBmaW5hbCBTdHJpbmcgX3BrZyA9IHNibi5wa2c7CisgICAgICAgIGZpbmFsIFN0cmluZyBfdGFnID0gc2JuLnRhZzsKKyAgICAgICAgZmluYWwgaW50IF9pZCA9IHNibi5pZDsKKyAgICAgICAgdmV0b0J1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgeyAKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgbUJhclNlcnZpY2Uub25Ob3RpZmljYXRpb25DbGVhcihfcGtnLCBfdGFnLCBfaWQpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN5c3RlbSBwcm9jZXNzIGlzIGRlYWQgaWYgd2UncmUgaGVyZS4KKyAgICAgICAgICAgICAgICAgICAgfQorLy8gICAgICAgICAgICAgICAgICAgIGFuaW1hdGVDb2xsYXBzZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworCisgICAgICAgIC8vIGJpbmQgdGhlIGNsaWNrIGV2ZW50IHRvIHRoZSBjb250ZW50IGFyZWEKKyAgICAgICAgVmlld0dyb3VwIGNvbnRlbnQgPSAoVmlld0dyb3VwKXJvdy5maW5kVmlld0J5SWQoUi5pZC5jb250ZW50KTsKKyAgICAgICAgLy8gWFhYOiB1cGRhdGUgdG8gYWxsb3cgY29udHJvbHMgd2l0aGluIG5vdGlmaWNhdGlvbiB2aWV3cworICAgICAgICBjb250ZW50LnNldERlc2NlbmRhbnRGb2N1c2FiaWxpdHkoVmlld0dyb3VwLkZPQ1VTX0JMT0NLX0RFU0NFTkRBTlRTKTsKKy8vICAgICAgICBjb250ZW50LnNldE9uRm9jdXNDaGFuZ2VMaXN0ZW5lcihtRm9jdXNDaGFuZ2VMaXN0ZW5lcik7CisgICAgICAgIFBlbmRpbmdJbnRlbnQgY29udGVudEludGVudCA9IHNibi5ub3RpZmljYXRpb24uY29udGVudEludGVudDsKKyAgICAgICAgaWYgKGNvbnRlbnRJbnRlbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgY29udGVudC5zZXRPbkNsaWNrTGlzdGVuZXIobmV3IE5vdGlmaWNhdGlvbkNsaWNrZXIoY29udGVudEludGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNibi5wa2csIHNibi50YWcsIHNibi5pZCkpOworICAgICAgICB9CisKKyAgICAgICAgVmlldyBleHBhbmRlZCA9IG51bGw7CisgICAgICAgIEV4Y2VwdGlvbiBleGNlcHRpb24gPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZXhwYW5kZWQgPSByZW1vdGVWaWV3cy5hcHBseSh0aGlzLCBjb250ZW50KTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBleGNlcHRpb24gPSBlOworICAgICAgICB9CisgICAgICAgIGlmIChleHBhbmRlZCA9PSBudWxsKSB7CisgICAgICAgICAgICBTdHJpbmcgaWRlbnQgPSBzYm4ucGtnICsgIi8weCIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKHNibi5pZCk7CisgICAgICAgICAgICBTbG9nLmUoVEFHLCAiY291bGRuJ3QgaW5mbGF0ZSB2aWV3IGZvciBub3RpZmljYXRpb24gIiArIGlkZW50LCBleGNlcHRpb24pOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29udGVudC5hZGRWaWV3KGV4cGFuZGVkKTsKKyAgICAgICAgICAgIHJvdy5zZXREcmF3aW5nQ2FjaGVFbmFibGVkKHRydWUpOworICAgICAgICB9CisKKyAgICAgICAgZW50cnkucm93ID0gcm93OworICAgICAgICBlbnRyeS5jb250ZW50ID0gY29udGVudDsKKyAgICAgICAgZW50cnkuZXhwYW5kZWQgPSBleHBhbmRlZDsKKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9UdHNTZXJ2aWNlL2puaS9BbmRyb2lkLm1rIGIvcGFja2FnZXMvVHRzU2VydmljZS9qbmkvQW5kcm9pZC5tawppbmRleCBiNDE3NTlhLi41ZGMwYzMwIDEwMDc1NQotLS0gYS9wYWNrYWdlcy9UdHNTZXJ2aWNlL2puaS9BbmRyb2lkLm1rCisrKyBiL3BhY2thZ2VzL1R0c1NlcnZpY2Uvam5pL0FuZHJvaWQubWsKQEAgLTUsNiArNSw3IEBACiAJYW5kcm9pZF90dHNfU3ludGhQcm94eS5jcHAKIAogTE9DQUxfQ19JTkNMVURFUyArPSBcCisJZnJhbWV3b3Jrcy9iYXNlL25hdGl2ZS9pbmNsdWRlIFwKIAkkKEpOSV9IX0lOQ0xVREUpCiAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXApkaWZmIC0tZ2l0IGEvcGFja2FnZXMvVHRzU2VydmljZS9qbmkvYW5kcm9pZF90dHNfU3ludGhQcm94eS5jcHAgYi9wYWNrYWdlcy9UdHNTZXJ2aWNlL2puaS9hbmRyb2lkX3R0c19TeW50aFByb3h5LmNwcAppbmRleCAxZDY5MzYxLi44ZGM4OGRiIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9UdHNTZXJ2aWNlL2puaS9hbmRyb2lkX3R0c19TeW50aFByb3h5LmNwcAorKysgYi9wYWNrYWdlcy9UdHNTZXJ2aWNlL2puaS9hbmRyb2lkX3R0c19TeW50aFByb3h5LmNwcApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgR29vZ2xlIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwOS0yMDEwIEdvb2dsZSBJbmMuCiAgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0yMyw3ICsyMyw3IEBACiAjaW5jbHVkZSA8bmF0aXZlaGVscGVyL2puaS5oPgogI2luY2x1ZGUgPG5hdGl2ZWhlbHBlci9KTklIZWxwLmg+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+ZnVuY3MtPmdldFByb3BlcnR5KGVuZ2luZSwicmF0ZSIsIGJ1ZiwgJmJ1ZlNpemUpOwogICAgIH0KICAgICByZXR1cm4gYXRvaShidWYpOwogfQpkaWZmIC0tZ2l0IGEvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9LZXlndWFyZFZpZXdNYW5hZ2VyLmphdmEgYi9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL0tleWd1YXJkVmlld01hbmFnZXIuamF2YQppbmRleCBiYTFkN2Y1Li43MGE0YjIwIDEwMDY0NAotLS0gYS9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL0tleWd1YXJkVmlld01hbmFnZXIuamF2YQorKysgYi9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL0tleWd1YXJkVmlld01hbmFnZXIuamF2YQpAQCAtMTEzLDcgKzExMywxNSBAQAogICAgICAgICAgICAgICAgICAgICBmbGFncywgUGl4ZWxGb3JtYXQuVFJBTlNMVUNFTlQpOwogICAgICAgICAgICAgbHAuc29mdElucHV0TW9kZSA9IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLlNPRlRfSU5QVVRfQURKVVNUX1BBTjsKICAgICAgICAgICAgIGxwLndpbmRvd0FuaW1hdGlvbnMgPSBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlLkFuaW1hdGlvbl9Mb2NrU2NyZWVuOwotICAgICAgICAgICAgbHAuc2NyZWVuT3JpZW50YXRpb24gPSBBY3Rpdml0eUluZm8uU0NSRUVOX09SSUVOVEFUSU9OX05PU0VOU09SOworCisgICAgICAgICAgICBpZiAobUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0Qm9vbGVhbihSLmJvb2wuY29uZmlnX2VuYWJsZUxvY2tTY3JlZW5Sb3RhdGlvbikpIHsKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJSb3RhdGlvbiBzZW5zb3IgZm9yIGxvY2sgc2NyZWVuIE9uISIpOworICAgICAgICAgICAgICAgIGxwLnNjcmVlbk9yaWVudGF0aW9uID0gQWN0aXZpdHlJbmZvLlNDUkVFTl9PUklFTlRBVElPTl9TRU5TT1I7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlJvdGF0aW9uIHNlbnNvciBmb3IgbG9jayBzY3JlZW4gT2ZmISIpOworICAgICAgICAgICAgICAgIGxwLnNjcmVlbk9yaWVudGF0aW9uID0gQWN0aXZpdHlJbmZvLlNDUkVFTl9PUklFTlRBVElPTl9OT1NFTlNPUjsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgbHAuc2V0VGl0bGUoIktleWd1YXJkIik7CiAgICAgICAgICAgICBtV2luZG93TGF5b3V0UGFyYW1zID0gbHA7CiAKZGlmZiAtLWdpdCBhL3BvbGljeS9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvcG9saWN5L2ltcGwvTG9ja1BhdHRlcm5LZXlndWFyZFZpZXcuamF2YSBiL3BvbGljeS9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvcG9saWN5L2ltcGwvTG9ja1BhdHRlcm5LZXlndWFyZFZpZXcuamF2YQppbmRleCAyNzcwNmVmLi44MjJiZTQ2IDEwMDY0NAotLS0gYS9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL0xvY2tQYXR0ZXJuS2V5Z3VhcmRWaWV3LmphdmEKKysrIGIvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9Mb2NrUGF0dGVybktleWd1YXJkVmlldy5qYXZhCkBAIC02NDUsNyArNjQ1LDkgQEAKICAgICAgICAgICAgIC8vIFNob3cgTG9ja1NjcmVlbiBmaXJzdCBmb3IgYW55IHNjcmVlbiBvdGhlciB0aGFuIFBhdHRlcm4gdW5sb2NrLgogICAgICAgICAgICAgZmluYWwgYm9vbGVhbiB1c2luZ0xvY2tQYXR0ZXJuID0gbUxvY2tQYXR0ZXJuVXRpbHMuZ2V0S2V5Z3VhcmRTdG9yZWRQYXNzd29yZFF1YWxpdHkoKQogICAgICAgICAgICAgICAgICAgICA9PSBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfU09NRVRISU5HOwotICAgICAgICAgICAgaWYgKGlzU2VjdXJlKCkgJiYgdXNpbmdMb2NrUGF0dGVybikgeworCisgICAgICAgICAgICBib29sZWFuIHNob3dTbGlkaW5nVGFiID0gZ2V0UmVzb3VyY2VzKCkuZ2V0Qm9vbGVhbihSLmJvb2wuY29uZmlnX2VuYWJsZVNsaWRpbmdUYWJGaXJzdCk7CisgICAgICAgICAgICBpZiAoaXNTZWN1cmUoKSAmJiAodXNpbmdMb2NrUGF0dGVybiB8fCAhc2hvd1NsaWRpbmdUYWIpKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE1vZGUuVW5sb2NrU2NyZWVuOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICByZXR1cm4gTW9kZS5Mb2NrU2NyZWVuOwpAQCAtNjY3LDYgKzY2OSw3IEBACiAgICAgICAgICAgICAgICAgY2FzZSBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfTlVNRVJJQzoKICAgICAgICAgICAgICAgICBjYXNlIERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9BTFBIQUJFVElDOgogICAgICAgICAgICAgICAgIGNhc2UgRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX0FMUEhBTlVNRVJJQzoKKyAgICAgICAgICAgICAgICBjYXNlIERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9DT01QTEVYOgogICAgICAgICAgICAgICAgICAgICBjdXJyZW50TW9kZSA9IFVubG9ja01vZGUuUGFzc3dvcmQ7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX1NPTUVUSElORzoKQEAgLTY4Nyw4ICs2OTAsMTcgQEAKIAogICAgIHByaXZhdGUgdm9pZCBzaG93VGltZW91dERpYWxvZygpIHsKICAgICAgICAgaW50IHRpbWVvdXRJblNlY29uZHMgPSAoaW50KSBMb2NrUGF0dGVyblV0aWxzLkZBSUxFRF9BVFRFTVBUX1RJTUVPVVRfTVMgLyAxMDAwOworICAgICAgICBpbnQgbWVzc2FnZUlkID0gUi5zdHJpbmcubG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2U7CisgICAgICAgIGlmKGdldFVubG9ja01vZGUoKSA9PSBVbmxvY2tNb2RlLlBhc3N3b3JkKSB7CisgICAgICAgICAgICBpZihtTG9ja1BhdHRlcm5VdGlscy5nZXRLZXlndWFyZFN0b3JlZFBhc3N3b3JkUXVhbGl0eSgpID09CisgICAgICAgICAgICAgICAgRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX05VTUVSSUMpIHsKKyAgICAgICAgICAgICAgICBtZXNzYWdlSWQgPSBSLnN0cmluZy5sb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9waW5fYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2U7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1lc3NhZ2VJZCA9IFIuc3RyaW5nLmxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX3Bhc3N3b3JkX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gbUNvbnRleHQuZ2V0U3RyaW5nKAotICAgICAgICAgICAgICAgIFIuc3RyaW5nLmxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlLAorICAgICAgICAgICAgICAgIG1lc3NhZ2VJZCwKICAgICAgICAgICAgICAgICBtVXBkYXRlTW9uaXRvci5nZXRGYWlsZWRBdHRlbXB0cygpLAogICAgICAgICAgICAgICAgIHRpbWVvdXRJblNlY29uZHMpOwogICAgICAgICBmaW5hbCBBbGVydERpYWxvZyBkaWFsb2cgPSBuZXcgQWxlcnREaWFsb2cuQnVpbGRlcihtQ29udGV4dCkKZGlmZiAtLWdpdCBhL3BvbGljeS9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvcG9saWN5L2ltcGwvTG9ja1NjcmVlbi5qYXZhIGIvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9Mb2NrU2NyZWVuLmphdmEKaW5kZXggYTVlZjFmYS4uZjhjMGFiYSAxMDA2NDQKLS0tIGEvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9Mb2NrU2NyZWVuLmphdmEKKysrIGIvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9Mb2NrU2NyZWVuLmphdmEKQEAgLTU5LDEyICs1OSw3IEBACiAgICAgcHJpdmF0ZSBmaW5hbCBLZXlndWFyZFVwZGF0ZU1vbml0b3IgbVVwZGF0ZU1vbml0b3I7CiAgICAgcHJpdmF0ZSBmaW5hbCBLZXlndWFyZFNjcmVlbkNhbGxiYWNrIG1DYWxsYmFjazsKIAotICAgIHByaXZhdGUgVGV4dFZpZXcgbUNhcnJpZXI7CiAgICAgcHJpdmF0ZSBTbGlkaW5nVGFiIG1TZWxlY3RvcjsKLSAgICBwcml2YXRlIFRleHRWaWV3IG1UaW1lOwotICAgIHByaXZhdGUgVGV4dFZpZXcgbURhdGU7Ci0gICAgcHJpdmF0ZSBUZXh0VmlldyBtU3RhdHVzMTsKLSAgICBwcml2YXRlIFRleHRWaWV3IG1TdGF0dXMyOwogICAgIHByaXZhdGUgVGV4dFZpZXcgbVNjcmVlbkxvY2tlZDsKICAgICBwcml2YXRlIFRleHRWaWV3IG1FbWVyZ2VuY3lDYWxsVGV4dDsKICAgICBwcml2YXRlIEJ1dHRvbiBtRW1lcmdlbmN5Q2FsbEJ1dHRvbjsKQEAgLTkzLDYgKzg4LDggQEAKICAgICBwcml2YXRlIGphdmEudGV4dC5EYXRlRm9ybWF0IG1UaW1lRm9ybWF0OwogICAgIHByaXZhdGUgYm9vbGVhbiBtRW5hYmxlTWVudUtleUluTG9ja1NjcmVlbjsKIAorICAgIHByaXZhdGUgU3RhdHVzVmlldyBtU3RhdHVzVmlldzsKKwogICAgIC8qKgogICAgICAqIFRoZSBzdGF0dXMgb2YgdGhpcyBsb2NrIHNjcmVlbi4KICAgICAgKi8KQEAgLTE5NSwxNCArMTkyLDcgQEAKICAgICAgICAgICAgIGluZmxhdGVyLmluZmxhdGUoUi5sYXlvdXQua2V5Z3VhcmRfc2NyZWVuX3RhYl91bmxvY2tfbGFuZCwgdGhpcywgdHJ1ZSk7CiAgICAgICAgIH0KIAotICAgICAgICBtQ2FycmllciA9IChUZXh0VmlldykgZmluZFZpZXdCeUlkKFIuaWQuY2Fycmllcik7Ci0gICAgICAgIC8vIFJlcXVpcmVkIGZvciBNYXJxdWVlIHRvIHdvcmsKLSAgICAgICAgbUNhcnJpZXIuc2V0U2VsZWN0ZWQodHJ1ZSk7Ci0gICAgICAgIG1DYXJyaWVyLnNldFRleHRDb2xvcigweGZmZmZmZmZmKTsKLQotICAgICAgICBtRGF0ZSA9IChUZXh0VmlldykgZmluZFZpZXdCeUlkKFIuaWQuZGF0ZSk7Ci0gICAgICAgIG1TdGF0dXMxID0gKFRleHRWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5zdGF0dXMxKTsKLSAgICAgICAgbVN0YXR1czIgPSAoVGV4dFZpZXcpIGZpbmRWaWV3QnlJZChSLmlkLnN0YXR1czIpOworICAgICAgICBtU3RhdHVzVmlldyA9IG5ldyBTdGF0dXNWaWV3KHRoaXMsIG1VcGRhdGVNb25pdG9yLCBtTG9ja1BhdHRlcm5VdGlscyk7CiAKICAgICAgICAgbVNjcmVlbkxvY2tlZCA9IChUZXh0VmlldykgZmluZFZpZXdCeUlkKFIuaWQuc2NyZWVuTG9ja2VkKTsKICAgICAgICAgbVNlbGVjdG9yID0gKFNsaWRpbmdUYWIpIGZpbmRWaWV3QnlJZChSLmlkLnRhYl9zZWxlY3Rvcik7CkBAIC0yMjAsNyArMjEwLDYgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfSk7CiAKLQogICAgICAgICBzZXRGb2N1c2FibGUodHJ1ZSk7CiAgICAgICAgIHNldEZvY3VzYWJsZUluVG91Y2hNb2RlKHRydWUpOwogICAgICAgICBzZXREZXNjZW5kYW50Rm9jdXNhYmlsaXR5KFZpZXdHcm91cC5GT0NVU19CTE9DS19ERVNDRU5EQU5UUyk7CkBAIC00MjgsMzggKzQxNywxMSBAQAogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCByZWZyZXNoVGltZUFuZERhdGVEaXNwbGF5KCkgewotICAgICAgICBtRGF0ZS5zZXRUZXh0KERhdGVGb3JtYXQuZm9ybWF0KG1EYXRlRm9ybWF0U3RyaW5nLCBuZXcgRGF0ZSgpKSk7CisgICAgICAgIG1TdGF0dXNWaWV3LnJlZnJlc2hUaW1lQW5kRGF0ZURpc3BsYXkoKTsKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgdXBkYXRlU3RhdHVzTGluZXMoKSB7Ci0gICAgICAgIGlmICghbVN0YXR1cy5zaG93U3RhdHVzTGluZXMoKQotICAgICAgICAgICAgICAgIHx8IChtQ2hhcmdpbmcgPT0gbnVsbCAmJiBtTmV4dEFsYXJtID09IG51bGwpKSB7Ci0gICAgICAgICAgICBtU3RhdHVzMS5zZXRWaXNpYmlsaXR5KFZpZXcuSU5WSVNJQkxFKTsKLSAgICAgICAgICAgIG1TdGF0dXMyLnNldFZpc2liaWxpdHkoVmlldy5JTlZJU0lCTEUpOwotICAgICAgICB9IGVsc2UgaWYgKG1DaGFyZ2luZyAhPSBudWxsICYmIG1OZXh0QWxhcm0gPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gY2hhcmdpbmcgb25seQotICAgICAgICAgICAgbVN0YXR1czEuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgbVN0YXR1czIuc2V0VmlzaWJpbGl0eShWaWV3LklOVklTSUJMRSk7Ci0KLSAgICAgICAgICAgIG1TdGF0dXMxLnNldFRleHQobUNoYXJnaW5nKTsKLSAgICAgICAgICAgIG1TdGF0dXMxLnNldENvbXBvdW5kRHJhd2FibGVzV2l0aEludHJpbnNpY0JvdW5kcyhtQ2hhcmdpbmdJY29uLCBudWxsLCBudWxsLCBudWxsKTsKLSAgICAgICAgfSBlbHNlIGlmIChtTmV4dEFsYXJtICE9IG51bGwgJiYgbUNoYXJnaW5nID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIG5leHQgYWxhcm0gb25seQotICAgICAgICAgICAgbVN0YXR1czEuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgbVN0YXR1czIuc2V0VmlzaWJpbGl0eShWaWV3LklOVklTSUJMRSk7Ci0KLSAgICAgICAgICAgIG1TdGF0dXMxLnNldFRleHQobU5leHRBbGFybSk7Ci0gICAgICAgICAgICBtU3RhdHVzMS5zZXRDb21wb3VuZERyYXdhYmxlc1dpdGhJbnRyaW5zaWNCb3VuZHMobUFsYXJtSWNvbiwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0gICAgICAgIH0gZWxzZSBpZiAobUNoYXJnaW5nICE9IG51bGwgJiYgbU5leHRBbGFybSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBib3RoIGNoYXJnaW5nIGFuZCBuZXh0IGFsYXJtCi0gICAgICAgICAgICBtU3RhdHVzMS5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICBtU3RhdHVzMi5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0KLSAgICAgICAgICAgIG1TdGF0dXMxLnNldFRleHQobUNoYXJnaW5nKTsKLSAgICAgICAgICAgIG1TdGF0dXMxLnNldENvbXBvdW5kRHJhd2FibGVzV2l0aEludHJpbnNpY0JvdW5kcyhtQ2hhcmdpbmdJY29uLCBudWxsLCBudWxsLCBudWxsKTsKLSAgICAgICAgICAgIG1TdGF0dXMyLnNldFRleHQobU5leHRBbGFybSk7Ci0gICAgICAgICAgICBtU3RhdHVzMi5zZXRDb21wb3VuZERyYXdhYmxlc1dpdGhJbnRyaW5zaWNCb3VuZHMobUFsYXJtSWNvbiwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0gICAgICAgIH0KKyAgICAgICAgbVN0YXR1c1ZpZXcudXBkYXRlU3RhdHVzTGluZXMobVN0YXR1cy5zaG93U3RhdHVzTGluZXMoKSwgbUNoYXJnaW5nLCBtQ2hhcmdpbmdJY29uLCBtQWxhcm1JY29uKTsKICAgICB9CiAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLwpAQCAtNTA5LDcgKzQ3MSw3IEBACiAgICAgICAgIHN3aXRjaCAoc3RhdHVzKSB7CiAgICAgICAgICAgICBjYXNlIE5vcm1hbDoKICAgICAgICAgICAgICAgICAvLyB0ZXh0Ci0gICAgICAgICAgICAgICAgbUNhcnJpZXIuc2V0VGV4dCgKKyAgICAgICAgICAgICAgICBtU3RhdHVzVmlldy5zZXRDYXJyaWVyVGV4dCgKICAgICAgICAgICAgICAgICAgICAgICAgIGdldENhcnJpZXJTdHJpbmcoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1VcGRhdGVNb25pdG9yLmdldFRlbGVwaG9ueVBsbW4oKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVVwZGF0ZU1vbml0b3IuZ2V0VGVsZXBob255U3BuKCkpKTsKQEAgLTUxOCwxNCArNDgwLDE0IEBACiAgICAgICAgICAgICAgICAgbVNjcmVlbkxvY2tlZC5zZXRUZXh0KCIiKTsKIAogICAgICAgICAgICAgICAgIC8vIGxheW91dAotICAgICAgICAgICAgICAgIG1TY3JlZW5Mb2NrZWQuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICAgICAgICAgIG1TY3JlZW5Mb2NrZWQuc2V0VmlzaWJpbGl0eShWaWV3LklOVklTSUJMRSk7CiAgICAgICAgICAgICAgICAgbVNlbGVjdG9yLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKICAgICAgICAgICAgICAgICBtRW1lcmdlbmN5Q2FsbFRleHQuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBOZXR3b3JrTG9ja2VkOgogICAgICAgICAgICAgICAgIC8vIFRoZSBjYXJyaWVyIHN0cmluZyBzaG93cyBib3RoIHNpbSBjYXJkIHN0YXR1cyAoaS5lLiBObyBTaW0gQ2FyZCkgYW5kCiAgICAgICAgICAgICAgICAgLy8gY2FycmllcidzIG5hbWUgYW5kL29yICJFbWVyZ2VuY3kgQ2FsbHMgT25seSIgc3RhdHVzCi0gICAgICAgICAgICAgICAgbUNhcnJpZXIuc2V0VGV4dCgKKyAgICAgICAgICAgICAgICBtU3RhdHVzVmlldy5zZXRDYXJyaWVyVGV4dCgKICAgICAgICAgICAgICAgICAgICAgICAgIGdldENhcnJpZXJTdHJpbmcoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1VcGRhdGVNb25pdG9yLmdldFRlbGVwaG9ueVBsbW4oKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q29udGV4dCgpLmdldFRleHQoUi5zdHJpbmcubG9ja3NjcmVlbl9uZXR3b3JrX2xvY2tlZF9tZXNzYWdlKSkpOwpAQCAtNTM4LDcgKzUwMCw3IEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIFNpbU1pc3Npbmc6CiAgICAgICAgICAgICAgICAgLy8gdGV4dAotICAgICAgICAgICAgICAgIG1DYXJyaWVyLnNldFRleHQoUi5zdHJpbmcubG9ja3NjcmVlbl9taXNzaW5nX3NpbV9tZXNzYWdlX3Nob3J0KTsKKyAgICAgICAgICAgICAgICBtU3RhdHVzVmlldy5zZXRDYXJyaWVyVGV4dChSLnN0cmluZy5sb2Nrc2NyZWVuX21pc3Npbmdfc2ltX21lc3NhZ2Vfc2hvcnQpOwogICAgICAgICAgICAgICAgIG1TY3JlZW5Mb2NrZWQuc2V0VGV4dChSLnN0cmluZy5sb2Nrc2NyZWVuX21pc3Npbmdfc2ltX2luc3RydWN0aW9ucyk7CiAKICAgICAgICAgICAgICAgICAvLyBsYXlvdXQKQEAgLTU0OSw3ICs1MTEsNyBAQAogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBTaW1NaXNzaW5nTG9ja2VkOgogICAgICAgICAgICAgICAgIC8vIHRleHQKLSAgICAgICAgICAgICAgICBtQ2Fycmllci5zZXRUZXh0KAorICAgICAgICAgICAgICAgIG1TdGF0dXNWaWV3LnNldENhcnJpZXJUZXh0KAogICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q2FycmllclN0cmluZygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVVwZGF0ZU1vbml0b3IuZ2V0VGVsZXBob255UGxtbigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRDb250ZXh0KCkuZ2V0VGV4dChSLnN0cmluZy5sb2Nrc2NyZWVuX21pc3Npbmdfc2ltX21lc3NhZ2Vfc2hvcnQpKSk7CkBAIC01NjMsNyArNTI1LDcgQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgU2ltTG9ja2VkOgogICAgICAgICAgICAgICAgIC8vIHRleHQKLSAgICAgICAgICAgICAgICBtQ2Fycmllci5zZXRUZXh0KAorICAgICAgICAgICAgICAgIG1TdGF0dXNWaWV3LnNldENhcnJpZXJUZXh0KAogICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q2FycmllclN0cmluZygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVVwZGF0ZU1vbml0b3IuZ2V0VGVsZXBob255UGxtbigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRDb250ZXh0KCkuZ2V0VGV4dChSLnN0cmluZy5sb2Nrc2NyZWVuX3NpbV9sb2NrZWRfbWVzc2FnZSkpKTsKQEAgLTU3NSw3ICs1MzcsNyBAQAogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBTaW1QdWtMb2NrZWQ6CiAgICAgICAgICAgICAgICAgLy8gdGV4dAotICAgICAgICAgICAgICAgIG1DYXJyaWVyLnNldFRleHQoCisgICAgICAgICAgICAgICAgbVN0YXR1c1ZpZXcuc2V0Q2FycmllclRleHQoCiAgICAgICAgICAgICAgICAgICAgICAgICBnZXRDYXJyaWVyU3RyaW5nKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVXBkYXRlTW9uaXRvci5nZXRUZWxlcGhvbnlQbG1uKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldENvbnRleHQoKS5nZXRUZXh0KFIuc3RyaW5nLmxvY2tzY3JlZW5fc2ltX3B1a19sb2NrZWRfbWVzc2FnZSkpKTsKQEAgLTY1OCw3ICs2MjAsNiBAQAogICAgIC8qKiB7QGluaGVyaXREb2N9ICovCiAgICAgcHVibGljIHZvaWQgb25SZXN1bWUoKSB7CiAgICAgICAgIHJlc2V0U3RhdHVzSW5mbyhtVXBkYXRlTW9uaXRvcik7Ci0gICAgICAgIG1Mb2NrUGF0dGVyblV0aWxzLnVwZGF0ZUVtZXJnZW5jeUNhbGxCdXR0b25TdGF0ZShtRW1lcmdlbmN5Q2FsbEJ1dHRvbik7CiAgICAgfQogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KQEAgLTY3Niw2ICs2MzcsNSBAQAogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIG9uUGhvbmVTdGF0ZUNoYW5nZWQoU3RyaW5nIG5ld1N0YXRlKSB7Ci0gICAgICAgIG1Mb2NrUGF0dGVyblV0aWxzLnVwZGF0ZUVtZXJnZW5jeUNhbGxCdXR0b25TdGF0ZShtRW1lcmdlbmN5Q2FsbEJ1dHRvbik7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9QYXNzd29yZFVubG9ja1NjcmVlbi5qYXZhIGIvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9QYXNzd29yZFVubG9ja1NjcmVlbi5qYXZhCmluZGV4IDM5ZjI5MTcuLjlkYjg2YWEgMTAwNjQ0Ci0tLSBhL3BvbGljeS9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvcG9saWN5L2ltcGwvUGFzc3dvcmRVbmxvY2tTY3JlZW4uamF2YQorKysgYi9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL1Bhc3N3b3JkVW5sb2NrU2NyZWVuLmphdmEKQEAgLTMwLDYgKzMwLDcgQEAKIGltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5UZWxlcGhvbnlNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQudGV4dC5tZXRob2QuRGlnaXRzS2V5TGlzdGVuZXI7CiBpbXBvcnQgYW5kcm9pZC50ZXh0Lm1ldGhvZC5UZXh0S2V5TGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwpAQCAtNTAsMTkgKzUxLDI1IEBACiBwdWJsaWMgY2xhc3MgUGFzc3dvcmRVbmxvY2tTY3JlZW4gZXh0ZW5kcyBMaW5lYXJMYXlvdXQgaW1wbGVtZW50cyBLZXlndWFyZFNjcmVlbiwKICAgICAgICAgVmlldy5PbkNsaWNrTGlzdGVuZXIsIEtleWd1YXJkVXBkYXRlTW9uaXRvci5JbmZvQ2FsbGJhY2ssIE9uRWRpdG9yQWN0aW9uTGlzdGVuZXIgewogCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJQYXNzd29yZFVubG9ja1NjcmVlbiI7CiAgICAgcHJpdmF0ZSBmaW5hbCBLZXlndWFyZFVwZGF0ZU1vbml0b3IgbVVwZGF0ZU1vbml0b3I7CiAgICAgcHJpdmF0ZSBmaW5hbCBLZXlndWFyZFNjcmVlbkNhbGxiYWNrIG1DYWxsYmFjazsKIAorICAgIHByaXZhdGUgYm9vbGVhbiBtSXNBbHBoYTsKKwogICAgIHByaXZhdGUgRWRpdFRleHQgbVBhc3N3b3JkRW50cnk7CiAgICAgcHJpdmF0ZSBCdXR0b24gbUVtZXJnZW5jeUNhbGxCdXR0b247CiAgICAgcHJpdmF0ZSBMb2NrUGF0dGVyblV0aWxzIG1Mb2NrUGF0dGVyblV0aWxzOwogICAgIHByaXZhdGUgUGFzc3dvcmRFbnRyeUtleWJvYXJkVmlldyBtS2V5Ym9hcmRWaWV3OworICAgIHByaXZhdGUgUGFzc3dvcmRFbnRyeUtleWJvYXJkVmlldyBtS2V5Ym9hcmRWaWV3QWxwaGE7CiAgICAgcHJpdmF0ZSBQYXNzd29yZEVudHJ5S2V5Ym9hcmRIZWxwZXIgbUtleWJvYXJkSGVscGVyOworICAgIHByaXZhdGUgUGFzc3dvcmRFbnRyeUtleWJvYXJkSGVscGVyIG1LZXlib2FyZEhlbHBlckFscGhhOwogCiAgICAgcHJpdmF0ZSBpbnQgbUNyZWF0aW9uT3JpZW50YXRpb247CiAgICAgcHJpdmF0ZSBpbnQgbUNyZWF0aW9uSGFyZEtleWJvYXJkSGlkZGVuOwogICAgIHByaXZhdGUgQ291bnREb3duVGltZXIgbUNvdW50ZG93blRpbWVyOwotICAgIHByaXZhdGUgVGV4dFZpZXcgbVRpdGxlOworCisgICAgcHJpdmF0ZSBTdGF0dXNWaWV3IG1TdGF0dXNWaWV3OwogCiAgICAgLy8gVG8gYXZvaWQgYWNjaWRlbnRhbCBsb2Nrb3V0IGR1ZSB0byBldmVudHMgd2hpbGUgdGhlIGRldmljZSBpbiBpbiB0aGUgcG9ja2V0LCBpZ25vcmUKICAgICAvLyBhbnkgcGFzc3dvcmRzIHdpdGggbGVuZ3RoIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGlzIGxlbmd0aC4KQEAgLTg2LDM2ICs5Myw2NSBAQAogICAgICAgICAgICAgbGF5b3V0SW5mbGF0ZXIuaW5mbGF0ZShSLmxheW91dC5rZXlndWFyZF9zY3JlZW5fcGFzc3dvcmRfbGFuZHNjYXBlLCB0aGlzLCB0cnVlKTsKICAgICAgICAgfQogCisgICAgICAgIG1TdGF0dXNWaWV3ID0gbmV3IFN0YXR1c1ZpZXcodGhpcywgbVVwZGF0ZU1vbml0b3IsIG1Mb2NrUGF0dGVyblV0aWxzKTsKKwogICAgICAgICBmaW5hbCBpbnQgcXVhbGl0eSA9IGxvY2tQYXR0ZXJuVXRpbHMuZ2V0S2V5Z3VhcmRTdG9yZWRQYXNzd29yZFF1YWxpdHkoKTsKLSAgICAgICAgZmluYWwgYm9vbGVhbiBpc0FscGhhID0gRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX0FMUEhBQkVUSUMgPT0gcXVhbGl0eQotICAgICAgICAgICAgICAgIHx8IERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9BTFBIQU5VTUVSSUMgPT0gcXVhbGl0eTsKKyAgICAgICAgbUlzQWxwaGEgPSBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfQUxQSEFCRVRJQyA9PSBxdWFsaXR5CisgICAgICAgICAgICAgICAgfHwgRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX0FMUEhBTlVNRVJJQyA9PSBxdWFsaXR5CisgICAgICAgICAgICAgICAgfHwgRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX0NPTVBMRVggPT0gcXVhbGl0eTsKIAogICAgICAgICBtS2V5Ym9hcmRWaWV3ID0gKFBhc3N3b3JkRW50cnlLZXlib2FyZFZpZXcpIGZpbmRWaWV3QnlJZChSLmlkLmtleWJvYXJkKTsKKyAgICAgICAgbUtleWJvYXJkVmlld0FscGhhID0gKFBhc3N3b3JkRW50cnlLZXlib2FyZFZpZXcpIGZpbmRWaWV3QnlJZChSLmlkLmtleWJvYXJkQWxwaGEpOwogICAgICAgICBtUGFzc3dvcmRFbnRyeSA9IChFZGl0VGV4dCkgZmluZFZpZXdCeUlkKFIuaWQucGFzc3dvcmRFbnRyeSk7CiAgICAgICAgIG1QYXNzd29yZEVudHJ5LnNldE9uRWRpdG9yQWN0aW9uTGlzdGVuZXIodGhpcyk7CiAgICAgICAgIG1FbWVyZ2VuY3lDYWxsQnV0dG9uID0gKEJ1dHRvbikgZmluZFZpZXdCeUlkKFIuaWQuZW1lcmdlbmN5Q2FsbCk7CiAgICAgICAgIG1FbWVyZ2VuY3lDYWxsQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcih0aGlzKTsKICAgICAgICAgbUxvY2tQYXR0ZXJuVXRpbHMudXBkYXRlRW1lcmdlbmN5Q2FsbEJ1dHRvblN0YXRlKG1FbWVyZ2VuY3lDYWxsQnV0dG9uKTsKLSAgICAgICAgbVRpdGxlID0gKFRleHRWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5lbnRlcl9wYXNzd29yZF9sYWJlbCk7CiAKLSAgICAgICAgbUtleWJvYXJkSGVscGVyID0gbmV3IFBhc3N3b3JkRW50cnlLZXlib2FyZEhlbHBlcihjb250ZXh0LCBtS2V5Ym9hcmRWaWV3LCB0aGlzKTsKLSAgICAgICAgbUtleWJvYXJkSGVscGVyLnNldEtleWJvYXJkTW9kZShpc0FscGhhID8gUGFzc3dvcmRFbnRyeUtleWJvYXJkSGVscGVyLktFWUJPQVJEX01PREVfQUxQSEEKLSAgICAgICAgICAgICAgICA6IFBhc3N3b3JkRW50cnlLZXlib2FyZEhlbHBlci5LRVlCT0FSRF9NT0RFX05VTUVSSUMpOworICAgICAgICBtS2V5Ym9hcmRIZWxwZXIgPSBuZXcgUGFzc3dvcmRFbnRyeUtleWJvYXJkSGVscGVyKGNvbnRleHQsIG1LZXlib2FyZFZpZXcsIHRoaXMsIGZhbHNlKTsKKyAgICAgICAgaWYgKG1LZXlib2FyZFZpZXdBbHBoYSA9PSBudWxsIHx8ICFtSXNBbHBoYSkgeworICAgICAgICAgICAgbUtleWJvYXJkSGVscGVyLnNldEtleWJvYXJkTW9kZShtSXNBbHBoYSA/CisgICAgICAgICAgICAgICAgICAgIFBhc3N3b3JkRW50cnlLZXlib2FyZEhlbHBlci5LRVlCT0FSRF9NT0RFX0FMUEhBCisgICAgICAgICAgICAgICAgICAgIDogUGFzc3dvcmRFbnRyeUtleWJvYXJkSGVscGVyLktFWUJPQVJEX01PREVfTlVNRVJJQyk7CisgICAgICAgICAgICBtS2V5Ym9hcmRWaWV3LnNldFZpc2liaWxpdHkoCisgICAgICAgICAgICAgICAgICAgIG1DcmVhdGlvbkhhcmRLZXlib2FyZEhpZGRlbiA9PSBDb25maWd1cmF0aW9uLkhBUkRLRVlCT0FSREhJRERFTl9OTworICAgICAgICAgICAgICAgICAgICA/IFZpZXcuSU5WSVNJQkxFIDogVmlldy5WSVNJQkxFKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1LZXlib2FyZEhlbHBlckFscGhhID0gbmV3IFBhc3N3b3JkRW50cnlLZXlib2FyZEhlbHBlcihjb250ZXh0LCBtS2V5Ym9hcmRWaWV3QWxwaGEsCisgICAgICAgICAgICAgICAgICAgIHRoaXMsIGZhbHNlKTsKKyAgICAgICAgICAgIG1LZXlib2FyZEhlbHBlci5zZXRLZXlib2FyZE1vZGUoUGFzc3dvcmRFbnRyeUtleWJvYXJkSGVscGVyLktFWUJPQVJEX01PREVfTlVNRVJJQyk7CisgICAgICAgICAgICBtS2V5Ym9hcmRIZWxwZXJBbHBoYS5zZXRLZXlib2FyZE1vZGUoUGFzc3dvcmRFbnRyeUtleWJvYXJkSGVscGVyLktFWUJPQVJEX01PREVfQUxQSEEpOworICAgICAgICAgICAgbUtleWJvYXJkVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgICAgICAgICBtS2V5Ym9hcmRWaWV3QWxwaGEuc2V0VmlzaWJpbGl0eSgKKyAgICAgICAgICAgICAgICAgICAgbUNyZWF0aW9uSGFyZEtleWJvYXJkSGlkZGVuID09IENvbmZpZ3VyYXRpb24uSEFSREtFWUJPQVJESElEREVOX05PCisgICAgICAgICAgICAgICAgICAgID8gVmlldy5JTlZJU0lCTEUgOiBWaWV3LlZJU0lCTEUpOworICAgICAgICAgICAgbVBhc3N3b3JkRW50cnkuc2V0V2lkdGgobUtleWJvYXJkVmlld0FscGhhLmdldExheW91dFBhcmFtcygpLndpZHRoKTsKKyAgICAgICAgfQogCi0gICAgICAgIG1LZXlib2FyZFZpZXcuc2V0VmlzaWJpbGl0eShtQ3JlYXRpb25IYXJkS2V5Ym9hcmRIaWRkZW4gPT0gQ29uZmlndXJhdGlvbi5IQVJES0VZQk9BUkRISURERU5fTk8KLSAgICAgICAgICAgICAgICA/IFZpZXcuSU5WSVNJQkxFIDogVmlldy5WSVNJQkxFKTsKKyAgICAgICAgbVBhc3N3b3JkRW50cnkuc2V0Q29tcG91bmREcmF3YWJsZXNXaXRoSW50cmluc2ljQm91bmRzKFIuZHJhd2FibGUuaWNfbG9ja19pZGxlX2xvY2ssIDAsCisgICAgICAgICAgICAgICAgMCwgMCk7CiAgICAgICAgIG1QYXNzd29yZEVudHJ5LnJlcXVlc3RGb2N1cygpOwogCiAgICAgICAgIC8vIFRoaXMgYWxsb3dzIGtleWJvYXJkcyB3aXRoIG92ZXJsYXBwaW5nIHF3ZXJ0eS9udW1lcmljIGtleXMgdG8gY2hvb3NlIGp1c3QgdGhlCiAgICAgICAgIC8vIG51bWVyaWMga2V5cy4KLSAgICAgICAgaWYgKGlzQWxwaGEpIHsKKyAgICAgICAgaWYgKG1Jc0FscGhhKSB7CiAgICAgICAgICAgICBtUGFzc3dvcmRFbnRyeS5zZXRLZXlMaXN0ZW5lcihUZXh0S2V5TGlzdGVuZXIuZ2V0SW5zdGFuY2UoKSk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBtUGFzc3dvcmRFbnRyeS5zZXRLZXlMaXN0ZW5lcihEaWdpdHNLZXlMaXN0ZW5lci5nZXRJbnN0YW5jZSgpKTsKKyAgICAgICAgICAgIG1TdGF0dXNWaWV3LnNldEluc3RydWN0aW9uVGV4dChSLnN0cmluZy5rZXlndWFyZF9wYXNzd29yZF9lbnRlcl9waW5fcGFzc3dvcmRfY29kZSk7CiAgICAgICAgIH0KIAogICAgICAgICBtS2V5Ym9hcmRIZWxwZXIuc2V0VmlicmF0ZVBhdHRlcm4obUxvY2tQYXR0ZXJuVXRpbHMuaXNUYWN0aWxlRmVlZGJhY2tFbmFibGVkKCkgPwogICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYXJyYXkuY29uZmlnX3ZpcnR1YWxLZXlWaWJlUGF0dGVybiA6IDApOworICAgICAgICBpZiAobUtleWJvYXJkSGVscGVyQWxwaGEgIT0gbnVsbCkgeworICAgICAgICAgICAgbUtleWJvYXJkSGVscGVyQWxwaGEuc2V0VmlicmF0ZVBhdHRlcm4obUxvY2tQYXR0ZXJuVXRpbHMuaXNUYWN0aWxlRmVlZGJhY2tFbmFibGVkKCkgPworICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmFycmF5LmNvbmZpZ192aXJ0dWFsS2V5VmliZVBhdHRlcm4gOiAwKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHVudGlsIHdlIGdldCBhbiB1cGRhdGUuLi4KKyAgICAgICAgbVN0YXR1c1ZpZXcuc2V0Q2FycmllclRleHQoTG9ja1NjcmVlbi5nZXRDYXJyaWVyU3RyaW5nKAorICAgICAgICAgICAgICAgICAgICAgICAgbVVwZGF0ZU1vbml0b3IuZ2V0VGVsZXBob255UGxtbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgbVVwZGF0ZU1vbml0b3IuZ2V0VGVsZXBob255U3BuKCkpKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTEzNiw4ICsxNzIsMTIgQEAKIAogICAgIC8qKiB7QGluaGVyaXREb2N9ICovCiAgICAgcHVibGljIHZvaWQgb25SZXN1bWUoKSB7CisgICAgICAgIC8vIHJlc2V0IHN0YXR1cworICAgICAgICBtU3RhdHVzVmlldy5yZXNldFN0YXR1c0luZm8obVVwZGF0ZU1vbml0b3IsIG1Mb2NrUGF0dGVyblV0aWxzKTsKKwogICAgICAgICAvLyBzdGFydCBmcmVzaAogICAgICAgICBtUGFzc3dvcmRFbnRyeS5zZXRUZXh0KCIiKTsKKyAgICAgICAgcmVzZXRTdGF0dXNJbmZvKCk7CiAgICAgICAgIG1QYXNzd29yZEVudHJ5LnJlcXVlc3RGb2N1cygpOwogICAgICAgICBtTG9ja1BhdHRlcm5VdGlscy51cGRhdGVFbWVyZ2VuY3lDYWxsQnV0dG9uU3RhdGUobUVtZXJnZW5jeUNhbGxCdXR0b24pOwogCkBAIC0xNzQsNiArMjE0LDkgQEAKICAgICAgICAgICAgICAgICBsb25nIGRlYWRsaW5lID0gbUxvY2tQYXR0ZXJuVXRpbHMuc2V0TG9ja291dEF0dGVtcHREZWFkbGluZSgpOwogICAgICAgICAgICAgICAgIGhhbmRsZUF0dGVtcHRMb2Nrb3V0KGRlYWRsaW5lKTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1TdGF0dXNWaWV3LnNldEluc3RydWN0aW9uVGV4dChSLnN0cmluZy5sb2Nrc2NyZWVuX3Bhc3N3b3JkX3dyb25nKTsKKyAgICAgICAgfSBlbHNlIGlmIChlbnRyeS5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgIG1TdGF0dXNWaWV3LnNldEluc3RydWN0aW9uVGV4dChSLnN0cmluZy5sb2Nrc2NyZWVuX3Bhc3N3b3JkX3dyb25nKTsKICAgICAgICAgfQogICAgICAgICBtUGFzc3dvcmRFbnRyeS5zZXRUZXh0KCIiKTsKICAgICB9CkBAIC0xOTEsMTQgKzIzNCwxNCBAQAogICAgICAgICAgICAgICAgIFN0cmluZyBpbnN0cnVjdGlvbnMgPSBnZXRDb250ZXh0KCkuZ2V0U3RyaW5nKAogICAgICAgICAgICAgICAgICAgICAgICAgUi5zdHJpbmcubG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfYXR0ZW1wdHNfY291bnRkb3duLAogICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kc1JlbWFpbmluZyk7Ci0gICAgICAgICAgICAgICAgbVRpdGxlLnNldFRleHQoaW5zdHJ1Y3Rpb25zKTsKKyAgICAgICAgICAgICAgICBtU3RhdHVzVmlldy5zZXRJbnN0cnVjdGlvblRleHQoaW5zdHJ1Y3Rpb25zKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkZpbmlzaCgpIHsKICAgICAgICAgICAgICAgICBtUGFzc3dvcmRFbnRyeS5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgICAgIG1UaXRsZS5zZXRUZXh0KFIuc3RyaW5nLmtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bhc3N3b3JkX2NvZGUpOwogICAgICAgICAgICAgICAgIG1LZXlib2FyZFZpZXcuc2V0RW5hYmxlZCh0cnVlKTsKKyAgICAgICAgICAgICAgICByZXNldFN0YXR1c0luZm8oKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfS5zdGFydCgpOwogICAgIH0KQEAgLTI0NCwyNCArMjg3LDQxIEBACiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKKyAgICAvLyAtLS0tLS0tLS0tIEluZm9DYWxsYmFjaworCisgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgICBwdWJsaWMgdm9pZCBvblJlZnJlc2hCYXR0ZXJ5SW5mbyhib29sZWFuIHNob3dCYXR0ZXJ5SW5mbywgYm9vbGVhbiBwbHVnZ2VkSW4sIGludCBiYXR0ZXJ5TGV2ZWwpIHsKKyAgICAgICAgbVN0YXR1c1ZpZXcub25SZWZyZXNoQmF0dGVyeUluZm8oc2hvd0JhdHRlcnlJbmZvLCBwbHVnZ2VkSW4sIGJhdHRlcnlMZXZlbCk7CisgICAgfQorCisgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgICBwdWJsaWMgdm9pZCBvblRpbWVDaGFuZ2VkKCkgeworICAgICAgICBtU3RhdHVzVmlldy5vblRpbWVDaGFuZ2VkKCk7CisgICAgfQorCisgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgICBwdWJsaWMgdm9pZCBvblJlZnJlc2hDYXJyaWVySW5mbyhDaGFyU2VxdWVuY2UgcGxtbiwgQ2hhclNlcXVlbmNlIHNwbikgeworICAgICAgICBtU3RhdHVzVmlldy5vblJlZnJlc2hDYXJyaWVySW5mbyhwbG1uLCBzcG4pOworICAgIH0KKworICAgIC8qKiB7QGluaGVyaXREb2N9ICovCisgICAgcHVibGljIHZvaWQgb25SaW5nZXJNb2RlQ2hhbmdlZChpbnQgc3RhdGUpIHsKKyAgICAgICAgLy8gbm90IGN1cnJlbnRseSB1c2VkCisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLSBTaW1TdGF0ZUNhbGxiYWNrCisKKyAgICAvKioge0Bpbmhlcml0RG9jfSAqLwogICAgIHB1YmxpYyB2b2lkIG9uUGhvbmVTdGF0ZUNoYW5nZWQoU3RyaW5nIG5ld1N0YXRlKSB7CiAgICAgICAgIG1Mb2NrUGF0dGVyblV0aWxzLnVwZGF0ZUVtZXJnZW5jeUNhbGxCdXR0b25TdGF0ZShtRW1lcmdlbmN5Q2FsbEJ1dHRvbik7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgb25SZWZyZXNoQmF0dGVyeUluZm8oYm9vbGVhbiBzaG93QmF0dGVyeUluZm8sIGJvb2xlYW4gcGx1Z2dlZEluLCBpbnQgYmF0dGVyeUxldmVsKSB7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBvblJlZnJlc2hDYXJyaWVySW5mbyhDaGFyU2VxdWVuY2UgcGxtbiwgQ2hhclNlcXVlbmNlIHNwbikgewotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgb25SaW5nZXJNb2RlQ2hhbmdlZChpbnQgc3RhdGUpIHsKLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG9uVGltZUNoYW5nZWQoKSB7Ci0KKyAgICBwcml2YXRlIHZvaWQgcmVzZXRTdGF0dXNJbmZvKCkgeworICAgICAgICBpZihtSXNBbHBoYSkgeworICAgICAgICAgICAgbVN0YXR1c1ZpZXcuc2V0SW5zdHJ1Y3Rpb25UZXh0KFIuc3RyaW5nLmtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bhc3N3b3JkX2NvZGUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVN0YXR1c1ZpZXcuc2V0SW5zdHJ1Y3Rpb25UZXh0KFIuc3RyaW5nLmtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bpbl9wYXNzd29yZF9jb2RlKTsKKyAgICAgICAgfQogICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9QYXR0ZXJuVW5sb2NrU2NyZWVuLmphdmEgYi9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL1BhdHRlcm5VbmxvY2tTY3JlZW4uamF2YQppbmRleCA0MThlMjQzLi4zNWZhM2U1IDEwMDY0NAotLS0gYS9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL1BhdHRlcm5VbmxvY2tTY3JlZW4uamF2YQorKysgYi9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL1BhdHRlcm5VbmxvY2tTY3JlZW4uamF2YQpAQCAtMjUsOSArMjUsNiBAQAogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CiBpbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkJ1dHRvbjsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKLWltcG9ydCBhbmRyb2lkLnRleHQuZm9ybWF0LkRhdGVGb3JtYXQ7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLlI7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkljY0NhcmQ7CkBAIC0zNyw3ICszNCw2IEBACiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0LkxvY2tQYXR0ZXJuVmlldy5DZWxsOwogCiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkRhdGU7CiAKIC8qKgogICogVGhpcyBpcyB0aGUgc2NyZWVuIHRoYXQgc2hvd3MgdGhlIDkgY2lyY2xlIHVubG9jayB3aWRnZXQgYW5kIGluc3RydWN0cwpAQCAtNzUsMjcgKzcxLDcgQEAKICAgICAgKi8KICAgICBwcml2YXRlIGJvb2xlYW4gbUVuYWJsZUZhbGxiYWNrOwogCi0gICAgcHJpdmF0ZSBTdHJpbmcgbURhdGVGb3JtYXRTdHJpbmc7Ci0KLSAgICBwcml2YXRlIFRleHRWaWV3IG1DYXJyaWVyOwotICAgIHByaXZhdGUgVGV4dFZpZXcgbURhdGU7Ci0KLSAgICAvLyBhcmUgd2Ugc2hvd2luZyBiYXR0ZXJ5IGluZm9ybWF0aW9uPwotICAgIHByaXZhdGUgYm9vbGVhbiBtU2hvd2luZ0JhdHRlcnlJbmZvID0gZmFsc2U7Ci0KLSAgICAvLyBsYXN0IGtub3duIHBsdWdnZWQgaW4gc3RhdGUKLSAgICBwcml2YXRlIGJvb2xlYW4gbVBsdWdnZWRJbiA9IGZhbHNlOwotCi0gICAgLy8gbGFzdCBrbm93biBiYXR0ZXJ5IGxldmVsCi0gICAgcHJpdmF0ZSBpbnQgbUJhdHRlcnlMZXZlbCA9IDEwMDsKLQotICAgIHByaXZhdGUgU3RyaW5nIG1OZXh0QWxhcm0gPSBudWxsOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgbUluc3RydWN0aW9ucyA9IG51bGw7Ci0gICAgcHJpdmF0ZSBUZXh0VmlldyBtU3RhdHVzMTsKLSAgICBwcml2YXRlIFRleHRWaWV3IG1TdGF0dXNTZXA7Ci0gICAgcHJpdmF0ZSBUZXh0VmlldyBtU3RhdHVzMjsKLQorICAgIHByaXZhdGUgU3RhdHVzVmlldyBtU3RhdHVzVmlldzsKIAogICAgIHByaXZhdGUgTG9ja1BhdHRlcm5WaWV3IG1Mb2NrUGF0dGVyblZpZXc7CiAKQEAgLTEzMywxNSArMTA5LDE4IEBACiAgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUZvb3RlcihGb290ZXJNb2RlIG1vZGUpIHsKICAgICAgICAgc3dpdGNoIChtb2RlKSB7CiAgICAgICAgICAgICBjYXNlIE5vcm1hbDoKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJtb2RlIG5vcm1hbCIpOwogICAgICAgICAgICAgICAgIG1Gb290ZXJOb3JtYWwuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwogICAgICAgICAgICAgICAgIG1Gb290ZXJGb3Jnb3RQYXR0ZXJuLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgRm9yZ290TG9ja1BhdHRlcm46CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAibW9kZSBGb3Jnb3RMb2NrUGF0dGVybiIpOwogICAgICAgICAgICAgICAgIG1Gb290ZXJOb3JtYWwuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwogICAgICAgICAgICAgICAgIG1Gb290ZXJGb3Jnb3RQYXR0ZXJuLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKICAgICAgICAgICAgICAgICBtRm9yZ290UGF0dGVybkJ1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIFZlcmlmeVVubG9ja2VkOgorICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIm1vZGUgVmVyaWZ5VW5sb2NrZWQiKTsKICAgICAgICAgICAgICAgICBtRm9vdGVyTm9ybWFsLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKICAgICAgICAgICAgICAgICBtRm9vdGVyRm9yZ290UGF0dGVybi5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CiAgICAgICAgIH0KQEAgLTE4MCwyNCArMTU5LDE2IEBACiAgICAgICAgIG1DcmVhdGlvbk9yaWVudGF0aW9uID0gY29uZmlndXJhdGlvbi5vcmllbnRhdGlvbjsKIAogICAgICAgICBMYXlvdXRJbmZsYXRlciBpbmZsYXRlciA9IExheW91dEluZmxhdGVyLmZyb20oY29udGV4dCk7CisKICAgICAgICAgaWYgKG1DcmVhdGlvbk9yaWVudGF0aW9uICE9IENvbmZpZ3VyYXRpb24uT1JJRU5UQVRJT05fTEFORFNDQVBFKSB7CisgICAgICAgICAgICBMb2cuZChUQUcsICJwb3J0cmFpdCBtb2RlIik7CiAgICAgICAgICAgICBpbmZsYXRlci5pbmZsYXRlKFIubGF5b3V0LmtleWd1YXJkX3NjcmVlbl91bmxvY2tfcG9ydHJhaXQsIHRoaXMsIHRydWUpOwogICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTG9nLmQoVEFHLCAibGFuZHNjYXBlIG1vZGUiKTsKICAgICAgICAgICAgIGluZmxhdGVyLmluZmxhdGUoUi5sYXlvdXQua2V5Z3VhcmRfc2NyZWVuX3VubG9ja19sYW5kc2NhcGUsIHRoaXMsIHRydWUpOwogICAgICAgICB9CiAKLSAgICAgICAgbUNhcnJpZXIgPSAoVGV4dFZpZXcpIGZpbmRWaWV3QnlJZChSLmlkLmNhcnJpZXIpOwotICAgICAgICBtRGF0ZSA9IChUZXh0VmlldykgZmluZFZpZXdCeUlkKFIuaWQuZGF0ZSk7Ci0KLSAgICAgICAgbURhdGVGb3JtYXRTdHJpbmcgPSBnZXRDb250ZXh0KCkuZ2V0U3RyaW5nKFIuc3RyaW5nLmZ1bGxfd2RheV9tb250aF9kYXlfbm9feWVhcik7Ci0gICAgICAgIHJlZnJlc2hUaW1lQW5kRGF0ZURpc3BsYXkoKTsKLQotICAgICAgICBtU3RhdHVzMSA9IChUZXh0VmlldykgZmluZFZpZXdCeUlkKFIuaWQuc3RhdHVzMSk7Ci0gICAgICAgIG1TdGF0dXNTZXAgPSAoVGV4dFZpZXcpIGZpbmRWaWV3QnlJZChSLmlkLnN0YXR1c1NlcCk7Ci0gICAgICAgIG1TdGF0dXMyID0gKFRleHRWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5zdGF0dXMyKTsKLQotICAgICAgICByZXNldFN0YXR1c0luZm8oKTsKLQorICAgICAgICBtU3RhdHVzVmlldyA9IG5ldyBTdGF0dXNWaWV3KHRoaXMsIG1VcGRhdGVNb25pdG9yLCBtTG9ja1BhdHRlcm5VdGlscyk7CiAKICAgICAgICAgbUxvY2tQYXR0ZXJuVmlldyA9IChMb2NrUGF0dGVyblZpZXcpIGZpbmRWaWV3QnlJZChSLmlkLmxvY2tQYXR0ZXJuKTsKIApAQCAtMjQ5LDE1ICsyMjAsMTEgQEAKICAgICAgICAgdXBkYXRlTW9uaXRvci5yZWdpc3RlclNpbVN0YXRlQ2FsbGJhY2sodGhpcyk7CiAgICAgICAgIHNldEZvY3VzYWJsZUluVG91Y2hNb2RlKHRydWUpOwogCi0gICAgICAgIC8vIFJlcXVpcmVkIHRvIGdldCBNYXJxdWVlIHRvIHdvcmsuCi0gICAgICAgIG1DYXJyaWVyLnNldFNlbGVjdGVkKHRydWUpOwotICAgICAgICBtQ2Fycmllci5zZXRUZXh0Q29sb3IoMHhmZmZmZmZmZik7Ci0KICAgICAgICAgLy8gdW50aWwgd2UgZ2V0IGFuIHVwZGF0ZS4uLgotICAgICAgICBtQ2Fycmllci5zZXRUZXh0KAotICAgICAgICAgICAgICAgIExvY2tTY3JlZW4uZ2V0Q2FycmllclN0cmluZygKKyAgICAgICAgbVN0YXR1c1ZpZXcuc2V0Q2FycmllclRleHQoTG9ja1NjcmVlbi5nZXRDYXJyaWVyU3RyaW5nKAogICAgICAgICAgICAgICAgICAgICAgICAgbVVwZGF0ZU1vbml0b3IuZ2V0VGVsZXBob255UGxtbigpLAogICAgICAgICAgICAgICAgICAgICAgICAgbVVwZGF0ZU1vbml0b3IuZ2V0VGVsZXBob255U3BuKCkpKTsKKwogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCByZWZyZXNoRW1lcmdlbmN5QnV0dG9uVGV4dCgpIHsKQEAgLTI3MCw4OCArMjM3LDYgQEAKICAgICAgICAgbUVuYWJsZUZhbGxiYWNrID0gc3RhdGU7CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIHJlc2V0U3RhdHVzSW5mbygpIHsKLSAgICAgICAgbUluc3RydWN0aW9ucyA9IG51bGw7Ci0gICAgICAgIG1TaG93aW5nQmF0dGVyeUluZm8gPSBtVXBkYXRlTW9uaXRvci5zaG91bGRTaG93QmF0dGVyeUluZm8oKTsKLSAgICAgICAgbVBsdWdnZWRJbiA9IG1VcGRhdGVNb25pdG9yLmlzRGV2aWNlUGx1Z2dlZEluKCk7Ci0gICAgICAgIG1CYXR0ZXJ5TGV2ZWwgPSBtVXBkYXRlTW9uaXRvci5nZXRCYXR0ZXJ5TGV2ZWwoKTsKLSAgICAgICAgbU5leHRBbGFybSA9IG1Mb2NrUGF0dGVyblV0aWxzLmdldE5leHRBbGFybSgpOwotICAgICAgICB1cGRhdGVTdGF0dXNMaW5lcygpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVTdGF0dXNMaW5lcygpIHsKLSAgICAgICAgaWYgKG1JbnN0cnVjdGlvbnMgIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gaW5zdHJ1Y3Rpb25zIG9ubHkKLSAgICAgICAgICAgIG1TdGF0dXMxLnNldFRleHQobUluc3RydWN0aW9ucyk7Ci0gICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkobUluc3RydWN0aW9ucykpIHsKLSAgICAgICAgICAgICAgICBtU3RhdHVzMS5zZXRDb21wb3VuZERyYXdhYmxlc1dpdGhJbnRyaW5zaWNCb3VuZHMoMCwgMCwgMCwgMCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1TdGF0dXMxLnNldENvbXBvdW5kRHJhd2FibGVzV2l0aEludHJpbnNpY0JvdW5kcygKLSAgICAgICAgICAgICAgICAgICAgICAgIFIuZHJhd2FibGUuaWNfbG9ja19pZGxlX2xvY2ssIDAsIDAsIDApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtU3RhdHVzMS5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICBtU3RhdHVzU2VwLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgIG1TdGF0dXMyLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgfSBlbHNlIGlmIChtU2hvd2luZ0JhdHRlcnlJbmZvICYmIG1OZXh0QWxhcm0gPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gYmF0dGVyeSBvbmx5Ci0gICAgICAgICAgICBpZiAobVBsdWdnZWRJbikgewotICAgICAgICAgICAgICBpZiAobUJhdHRlcnlMZXZlbCA+PSAxMDApIHsKLSAgICAgICAgICAgICAgICBtU3RhdHVzMS5zZXRUZXh0KGdldENvbnRleHQoKS5nZXRTdHJpbmcoUi5zdHJpbmcubG9ja3NjcmVlbl9jaGFyZ2VkKSk7Ci0gICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICBtU3RhdHVzMS5zZXRUZXh0KGdldENvbnRleHQoKS5nZXRTdHJpbmcoUi5zdHJpbmcubG9ja3NjcmVlbl9wbHVnZ2VkX2luLCBtQmF0dGVyeUxldmVsKSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbVN0YXR1czEuc2V0VGV4dChnZXRDb250ZXh0KCkuZ2V0U3RyaW5nKFIuc3RyaW5nLmxvY2tzY3JlZW5fbG93X2JhdHRlcnkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1TdGF0dXMxLnNldENvbXBvdW5kRHJhd2FibGVzV2l0aEludHJpbnNpY0JvdW5kcyhSLmRyYXdhYmxlLmljX2xvY2tfaWRsZV9jaGFyZ2luZywgMCwgMCwgMCk7Ci0KLSAgICAgICAgICAgIG1TdGF0dXMxLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgIG1TdGF0dXNTZXAuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgbVN0YXR1czIuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotCi0gICAgICAgIH0gZWxzZSBpZiAobU5leHRBbGFybSAhPSBudWxsICYmICFtU2hvd2luZ0JhdHRlcnlJbmZvKSB7Ci0gICAgICAgICAgICAvLyBhbGFybSBvbmx5Ci0gICAgICAgICAgICBtU3RhdHVzMS5zZXRUZXh0KG1OZXh0QWxhcm0pOwotICAgICAgICAgICAgbVN0YXR1czEuc2V0Q29tcG91bmREcmF3YWJsZXNXaXRoSW50cmluc2ljQm91bmRzKFIuZHJhd2FibGUuaWNfbG9ja19pZGxlX2FsYXJtLCAwLCAwLCAwKTsKLQotICAgICAgICAgICAgbVN0YXR1czEuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgbVN0YXR1c1NlcC5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICBtU3RhdHVzMi5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgIH0gZWxzZSBpZiAobU5leHRBbGFybSAhPSBudWxsICYmIG1TaG93aW5nQmF0dGVyeUluZm8pIHsKLSAgICAgICAgICAgIC8vIGJvdGggYmF0dGVyeSBhbmQgbmV4dCBhbGFybQotICAgICAgICAgICAgbVN0YXR1czEuc2V0VGV4dChtTmV4dEFsYXJtKTsKLSAgICAgICAgICAgIG1TdGF0dXNTZXAuc2V0VGV4dCgifCIpOwotICAgICAgICAgICAgbVN0YXR1czIuc2V0VGV4dChnZXRDb250ZXh0KCkuZ2V0U3RyaW5nKAotICAgICAgICAgICAgICAgICAgICBSLnN0cmluZy5sb2Nrc2NyZWVuX2JhdHRlcnlfc2hvcnQsCi0gICAgICAgICAgICAgICAgICAgIE1hdGgubWluKDEwMCwgbUJhdHRlcnlMZXZlbCkpKTsKLSAgICAgICAgICAgIG1TdGF0dXMxLnNldENvbXBvdW5kRHJhd2FibGVzV2l0aEludHJpbnNpY0JvdW5kcyhSLmRyYXdhYmxlLmljX2xvY2tfaWRsZV9hbGFybSwgMCwgMCwgMCk7Ci0gICAgICAgICAgICBpZiAobVBsdWdnZWRJbikgewotICAgICAgICAgICAgICAgIG1TdGF0dXMyLnNldENvbXBvdW5kRHJhd2FibGVzV2l0aEludHJpbnNpY0JvdW5kcyhSLmRyYXdhYmxlLmljX2xvY2tfaWRsZV9jaGFyZ2luZywgMCwgMCwgMCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1TdGF0dXMyLnNldENvbXBvdW5kRHJhd2FibGVzV2l0aEludHJpbnNpY0JvdW5kcygwLCAwLCAwLCAwKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbVN0YXR1czEuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgbVN0YXR1c1NlcC5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICBtU3RhdHVzMi5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBub3RoaW5nIHNwZWNpZmljIHRvIHNob3c7IHNob3cgZ2VuZXJhbCBpbnN0cnVjdGlvbnMKLSAgICAgICAgICAgIG1TdGF0dXMxLnNldFRleHQoUi5zdHJpbmcubG9ja3NjcmVlbl9wYXR0ZXJuX2luc3RydWN0aW9ucyk7Ci0gICAgICAgICAgICBtU3RhdHVzMS5zZXRDb21wb3VuZERyYXdhYmxlc1dpdGhJbnRyaW5zaWNCb3VuZHMoUi5kcmF3YWJsZS5pY19sb2NrX2lkbGVfbG9jaywgMCwgMCwgMCk7Ci0KLSAgICAgICAgICAgIG1TdGF0dXMxLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgIG1TdGF0dXNTZXAuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgbVN0YXR1czIuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICBwcml2YXRlIHZvaWQgcmVmcmVzaFRpbWVBbmREYXRlRGlzcGxheSgpIHsKLSAgICAgICAgbURhdGUuc2V0VGV4dChEYXRlRm9ybWF0LmZvcm1hdChtRGF0ZUZvcm1hdFN0cmluZywgbmV3IERhdGUoKSkpOwotICAgIH0KLQotCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gZGlzcGF0Y2hUb3VjaEV2ZW50KE1vdGlvbkV2ZW50IGV2KSB7CiAgICAgICAgIC8vIGFzIGxvbmcgYXMgdGhlIHVzZXIgaXMgZW50ZXJpbmcgYSBwYXR0ZXJuIChpLmUgc2VuZGluZyBhIHRvdWNoCkBAIC0zNjYsMjUgKzI1MSwyMSBAQAogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KIAotCiAgICAgLy8gLS0tLS0tLS0tLSBJbmZvQ2FsbGJhY2sKIAogICAgIC8qKiB7QGluaGVyaXREb2N9ICovCiAgICAgcHVibGljIHZvaWQgb25SZWZyZXNoQmF0dGVyeUluZm8oYm9vbGVhbiBzaG93QmF0dGVyeUluZm8sIGJvb2xlYW4gcGx1Z2dlZEluLCBpbnQgYmF0dGVyeUxldmVsKSB7Ci0gICAgICAgIG1TaG93aW5nQmF0dGVyeUluZm8gPSBzaG93QmF0dGVyeUluZm87Ci0gICAgICAgIG1QbHVnZ2VkSW4gPSBwbHVnZ2VkSW47Ci0gICAgICAgIG1CYXR0ZXJ5TGV2ZWwgPSBiYXR0ZXJ5TGV2ZWw7Ci0gICAgICAgIHVwZGF0ZVN0YXR1c0xpbmVzKCk7CisgICAgICAgIG1TdGF0dXNWaWV3Lm9uUmVmcmVzaEJhdHRlcnlJbmZvKHNob3dCYXR0ZXJ5SW5mbywgcGx1Z2dlZEluLCBiYXR0ZXJ5TGV2ZWwpOwogICAgIH0KIAogICAgIC8qKiB7QGluaGVyaXREb2N9ICovCiAgICAgcHVibGljIHZvaWQgb25UaW1lQ2hhbmdlZCgpIHsKLSAgICAgICAgcmVmcmVzaFRpbWVBbmREYXRlRGlzcGxheSgpOworICAgICAgICBtU3RhdHVzVmlldy5vblRpbWVDaGFuZ2VkKCk7CiAgICAgfQogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KICAgICBwdWJsaWMgdm9pZCBvblJlZnJlc2hDYXJyaWVySW5mbyhDaGFyU2VxdWVuY2UgcGxtbiwgQ2hhclNlcXVlbmNlIHNwbikgewotICAgICAgICBtQ2Fycmllci5zZXRUZXh0KExvY2tTY3JlZW4uZ2V0Q2FycmllclN0cmluZyhwbG1uLCBzcG4pKTsKKyAgICAgICAgbVN0YXR1c1ZpZXcub25SZWZyZXNoQ2FycmllckluZm8ocGxtbiwgc3BuKTsKICAgICB9CiAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLwpAQCAtNDQ0LDggKzMyNSw4IEBACiAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLwogICAgIHB1YmxpYyB2b2lkIG9uUmVzdW1lKCkgewotICAgICAgICAvLyByZXNldCBoZWFkZXIKLSAgICAgICAgcmVzZXRTdGF0dXNJbmZvKCk7CisgICAgICAgIC8vIHJlc2V0IHN0YXR1cworICAgICAgICBtU3RhdHVzVmlldy5yZXNldFN0YXR1c0luZm8obVVwZGF0ZU1vbml0b3IsIG1Mb2NrUGF0dGVyblV0aWxzKTsKIAogICAgICAgICAvLyByZXNldCBsb2NrIHBhdHRlcm4KICAgICAgICAgbUxvY2tQYXR0ZXJuVmlldy5lbmFibGVJbnB1dCgpOwpAQCAtNTE0LDggKzM5NSw4IEBACiAgICAgICAgICAgICBpZiAobUxvY2tQYXR0ZXJuVXRpbHMuY2hlY2tQYXR0ZXJuKHBhdHRlcm4pKSB7CiAgICAgICAgICAgICAgICAgbUxvY2tQYXR0ZXJuVmlldwogICAgICAgICAgICAgICAgICAgICAgICAgLnNldERpc3BsYXlNb2RlKExvY2tQYXR0ZXJuVmlldy5EaXNwbGF5TW9kZS5Db3JyZWN0KTsKLSAgICAgICAgICAgICAgICBtSW5zdHJ1Y3Rpb25zID0gIiI7Ci0gICAgICAgICAgICAgICAgdXBkYXRlU3RhdHVzTGluZXMoKTsKKyAgICAgICAgICAgICAgICBtU3RhdHVzVmlldy5zZXRJbnN0cnVjdGlvbnMoIiIpOworICAgICAgICAgICAgICAgIG1TdGF0dXNWaWV3LnVwZGF0ZVN0YXR1c0xpbmVzKCk7CiAgICAgICAgICAgICAgICAgbUNhbGxiYWNrLmtleWd1YXJkRG9uZSh0cnVlKTsKICAgICAgICAgICAgICAgICBtQ2FsbGJhY2sucmVwb3J0U3VjY2Vzc2Z1bFVubG9ja0F0dGVtcHQoKTsKICAgICAgICAgICAgIH0gZWxzZSB7CkBAIC01MzMsOCArNDE0LDkgQEAKICAgICAgICAgICAgICAgICAgICAgaGFuZGxlQXR0ZW1wdExvY2tvdXQoZGVhZGxpbmUpOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE8gbVVubG9ja0ljb24uc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgICAgICAgICBtSW5zdHJ1Y3Rpb25zID0gZ2V0Q29udGV4dCgpLmdldFN0cmluZyhSLnN0cmluZy5sb2Nrc2NyZWVuX3BhdHRlcm5fd3JvbmcpOwotICAgICAgICAgICAgICAgICAgICB1cGRhdGVTdGF0dXNMaW5lcygpOworICAgICAgICAgICAgICAgICAgICBtU3RhdHVzVmlldy5zZXRJbnN0cnVjdGlvbnMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q29udGV4dCgpLmdldFN0cmluZyhSLnN0cmluZy5sb2Nrc2NyZWVuX3BhdHRlcm5fd3JvbmcpKTsKKyAgICAgICAgICAgICAgICAgICAgbVN0YXR1c1ZpZXcudXBkYXRlU3RhdHVzTGluZXMoKTsKICAgICAgICAgICAgICAgICAgICAgbUxvY2tQYXR0ZXJuVmlldy5wb3N0RGVsYXllZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2FuY2VsUGF0dGVyblJ1bm5hYmxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBVFRFUk5fQ0xFQVJfVElNRU9VVF9NUyk7CkBAIC01NTIsMTcgKzQzNCwxOCBAQAogICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblRpY2sobG9uZyBtaWxsaXNVbnRpbEZpbmlzaGVkKSB7CiAgICAgICAgICAgICAgICAgaW50IHNlY29uZHNSZW1haW5pbmcgPSAoaW50KSAobWlsbGlzVW50aWxGaW5pc2hlZCAvIDEwMDApOwotICAgICAgICAgICAgICAgIG1JbnN0cnVjdGlvbnMgPSBnZXRDb250ZXh0KCkuZ2V0U3RyaW5nKAorICAgICAgICAgICAgICAgIG1TdGF0dXNWaWV3LnNldEluc3RydWN0aW9ucyhnZXRDb250ZXh0KCkuZ2V0U3RyaW5nKAogICAgICAgICAgICAgICAgICAgICAgICAgUi5zdHJpbmcubG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfYXR0ZW1wdHNfY291bnRkb3duLAotICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kc1JlbWFpbmluZyk7Ci0gICAgICAgICAgICAgICAgdXBkYXRlU3RhdHVzTGluZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZHNSZW1haW5pbmcpKTsKKyAgICAgICAgICAgICAgICBtU3RhdHVzVmlldy51cGRhdGVTdGF0dXNMaW5lcygpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uRmluaXNoKCkgewogICAgICAgICAgICAgICAgIG1Mb2NrUGF0dGVyblZpZXcuc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICBtSW5zdHJ1Y3Rpb25zID0gZ2V0Q29udGV4dCgpLmdldFN0cmluZyhSLnN0cmluZy5sb2Nrc2NyZWVuX3BhdHRlcm5faW5zdHJ1Y3Rpb25zKTsKLSAgICAgICAgICAgICAgICB1cGRhdGVTdGF0dXNMaW5lcygpOworICAgICAgICAgICAgICAgIG1TdGF0dXNWaWV3LnNldEluc3RydWN0aW9ucyhnZXRDb250ZXh0KCkuZ2V0U3RyaW5nKAorICAgICAgICAgICAgICAgICAgICAgICAgUi5zdHJpbmcubG9ja3NjcmVlbl9wYXR0ZXJuX2luc3RydWN0aW9ucykpOworICAgICAgICAgICAgICAgIG1TdGF0dXNWaWV3LnVwZGF0ZVN0YXR1c0xpbmVzKCk7CiAgICAgICAgICAgICAgICAgLy8gVE9ETyBtVW5sb2NrSWNvbi5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CiAgICAgICAgICAgICAgICAgbUZhaWxlZFBhdHRlcm5BdHRlbXB0c1NpbmNlTGFzdFRpbWVvdXQgPSAwOwogICAgICAgICAgICAgICAgIGlmIChtRW5hYmxlRmFsbGJhY2spIHsKZGlmZiAtLWdpdCBhL3BvbGljeS9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvcG9saWN5L2ltcGwvUGhvbmVXaW5kb3cuamF2YSBiL3BvbGljeS9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvcG9saWN5L2ltcGwvUGhvbmVXaW5kb3cuamF2YQppbmRleCBiOTIzMmM4Li5jYTlhNDg0IDEwMDY0NAotLS0gYS9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL1Bob25lV2luZG93LmphdmEKKysrIGIvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9QaG9uZVdpbmRvdy5qYXZhCkBAIC0yNCwxMSArMjQsMTUgQEAKIAogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcuQmFzZVN1cmZhY2VIb2xkZXI7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5Sb290Vmlld1N1cmZhY2VUYWtlcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3LlN0YW5kYWxvbmVBY3Rpb25Nb2RlOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5Db250ZXh0TWVudUJ1aWxkZXI7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51Lk1lbnVCdWlsZGVyOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5NZW51RGlhbG9nSGVscGVyOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5NZW51UG9wdXBIZWxwZXI7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51Lk1lbnVWaWV3OwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5TdWJNZW51QnVpbGRlcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuQWN0aW9uQmFyQ29udGV4dFZpZXc7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0LkFjdGlvbkJhclZpZXc7CiAKIGltcG9ydCBhbmRyb2lkLmFwcC5LZXlndWFyZE1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5hcHAuU2VhcmNoTWFuYWdlcjsKQEAgLTUzLDYgKzU3LDcgQEAKIGltcG9ydCBhbmRyb2lkLnV0aWwuRXZlbnRMb2c7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIGltcG9ydCBhbmRyb2lkLnV0aWwuU3BhcnNlQXJyYXk7CitpbXBvcnQgYW5kcm9pZC52aWV3LkFjdGlvbk1vZGU7CiBpbXBvcnQgYW5kcm9pZC52aWV3LkdyYXZpdHk7CiBpbXBvcnQgYW5kcm9pZC52aWV3LkhhcHRpY0ZlZWRiYWNrQ29uc3RhbnRzOwogaW1wb3J0IGFuZHJvaWQudmlldy5JbnB1dFF1ZXVlOwpAQCAtNjYsNiArNzEsNyBAQAogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3U3R1YjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVm9sdW1lUGFuZWw7CiBpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvdzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlcjsKQEAgLTk1LDcgKzEwMSw3IEBACiAgICAgICogU2ltcGxlIGNhbGxiYWNrIHVzZWQgYnkgdGhlIGNvbnRleHQgbWVudSBhbmQgaXRzIHN1Ym1lbnVzLiBUaGUgb3B0aW9ucwogICAgICAqIG1lbnUgc3VibWVudXMgZG8gbm90IHVzZSB0aGlzICh0aGVpciBiZWhhdmlvciBpcyBtb3JlIGNvbXBsZXgpLgogICAgICAqLwotICAgIENvbnRleHRNZW51Q2FsbGJhY2sgbUNvbnRleHRNZW51Q2FsbGJhY2sgPSBuZXcgQ29udGV4dE1lbnVDYWxsYmFjayhGRUFUVVJFX0NPTlRFWFRfTUVOVSk7CisgICAgRGlhbG9nTWVudUNhbGxiYWNrIG1Db250ZXh0TWVudUNhbGxiYWNrID0gbmV3IERpYWxvZ01lbnVDYWxsYmFjayhGRUFUVVJFX0NPTlRFWFRfTUVOVSk7CiAKICAgICAvLyBUaGlzIGlzIHRoZSB0b3AtbGV2ZWwgdmlldyBvZiB0aGUgd2luZG93LCBjb250YWluaW5nIHRoZSB3aW5kb3cgZGVjb3IuCiAgICAgcHJpdmF0ZSBEZWNvclZpZXcgbURlY29yOwpAQCAtMTE0LDYgKzEyMCw4IEBACiAgICAgcHJpdmF0ZSBMYXlvdXRJbmZsYXRlciBtTGF5b3V0SW5mbGF0ZXI7CiAKICAgICBwcml2YXRlIFRleHRWaWV3IG1UaXRsZVZpZXc7CisgICAgCisgICAgcHJpdmF0ZSBBY3Rpb25CYXJWaWV3IG1BY3Rpb25CYXI7CiAKICAgICBwcml2YXRlIERyYXdhYmxlRmVhdHVyZVN0YXRlW10gbURyYXdhYmxlczsKIApAQCAtMTkxLDggKzE5OSwxMiBAQAogICAgICAgICAgICAgLyogQ3VzdG9tIHRpdGxlIGZlYXR1cmUgaXMgZW5hYmxlZCBhbmQgdGhlIHVzZXIgaXMgdHJ5aW5nIHRvIGVuYWJsZSBhbm90aGVyIGZlYXR1cmUgKi8KICAgICAgICAgICAgIHRocm93IG5ldyBBbmRyb2lkUnVudGltZUV4Y2VwdGlvbigiWW91IGNhbm5vdCBjb21iaW5lIGN1c3RvbSB0aXRsZXMgd2l0aCBvdGhlciB0aXRsZSBmZWF0dXJlcyIpOwogICAgICAgICB9Ci0gICAgICAgIGlmIChmZWF0dXJlSWQgPT0gRkVBVFVSRV9PUEVOR0wpIHsKLSAgICAgICAgICAgIGdldEF0dHJpYnV0ZXMoKS5tZW1vcnlUeXBlID0gV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuTUVNT1JZX1RZUEVfR1BVOworICAgICAgICBpZiAoKGZlYXR1cmVzICYgKDEgPDwgRkVBVFVSRV9OT19USVRMRSkpICE9IDAgJiYgZmVhdHVyZUlkID09IEZFQVRVUkVfQUNUSU9OX0JBUikgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBJZ25vcmUuIE5vIHRpdGxlIGRvbWluYXRlcy4KKyAgICAgICAgfQorICAgICAgICBpZiAoKGZlYXR1cmVzICYgKDEgPDwgRkVBVFVSRV9BQ1RJT05fQkFSKSkgIT0gMCAmJiBmZWF0dXJlSWQgPT0gRkVBVFVSRV9OT19USVRMRSkgeworICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBhY3Rpb24gYmFyIGZlYXR1cmUgaWYgd2UgaGF2ZSBubyB0aXRsZS4gTm8gdGl0bGUgZG9taW5hdGVzLgorICAgICAgICAgICAgcmVtb3ZlRmVhdHVyZShGRUFUVVJFX0FDVElPTl9CQVIpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBzdXBlci5yZXF1ZXN0RmVhdHVyZShmZWF0dXJlSWQpOwogICAgIH0KQEAgLTI3Niw2ICsyODgsOCBAQAogICAgIHB1YmxpYyB2b2lkIHNldFRpdGxlKENoYXJTZXF1ZW5jZSB0aXRsZSkgewogICAgICAgICBpZiAobVRpdGxlVmlldyAhPSBudWxsKSB7CiAgICAgICAgICAgICBtVGl0bGVWaWV3LnNldFRleHQodGl0bGUpOworICAgICAgICB9IGVsc2UgaWYgKG1BY3Rpb25CYXIgIT0gbnVsbCkgeworICAgICAgICAgICAgbUFjdGlvbkJhci5zZXRXaW5kb3dUaXRsZSh0aXRsZSk7CiAgICAgICAgIH0KICAgICAgICAgbVRpdGxlID0gdGl0bGU7CiAgICAgfQpAQCAtMzAxLDcgKzMxNSw3IEBACiAgICAgICAgIC8vIEFscmVhZHkgcHJlcGFyZWQgKGlzUHJlcGFyZWQgd2lsbCBiZSByZXNldCB0byBmYWxzZSBsYXRlcikKICAgICAgICAgaWYgKHN0LmlzUHJlcGFyZWQpCiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLQorICAgICAgICAKICAgICAgICAgaWYgKChtUHJlcGFyZWRQYW5lbCAhPSBudWxsKSAmJiAobVByZXBhcmVkUGFuZWwgIT0gc3QpKSB7CiAgICAgICAgICAgICAvLyBBbm90aGVyIFBhbmVsIGlzIHByZXBhcmVkIGFuZCBwb3NzaWJseSBvcGVuLCBzbyBjbG9zZSBpdAogICAgICAgICAgICAgY2xvc2VQYW5lbChtUHJlcGFyZWRQYW5lbCwgZmFsc2UpOwpAQCAtMzE1LDkgKzMyOSwxMSBAQAogCiAgICAgICAgIGlmIChzdC5jcmVhdGVkUGFuZWxWaWV3ID09IG51bGwpIHsKICAgICAgICAgICAgIC8vIEluaXQgdGhlIHBhbmVsIHN0YXRlJ3MgbWVudS0tcmV0dXJuIGZhbHNlIGlmIGluaXQgZmFpbGVkCi0gICAgICAgICAgICBpZiAoc3QubWVudSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFpbml0aWFsaXplUGFuZWxNZW51KHN0KSB8fCAoc3QubWVudSA9PSBudWxsKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBpZiAoc3QubWVudSA9PSBudWxsIHx8IHN0LnJlZnJlc2hNZW51Q29udGVudCkgeworICAgICAgICAgICAgICAgIGlmIChzdC5tZW51ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFpbml0aWFsaXplUGFuZWxNZW51KHN0KSB8fCAoc3QubWVudSA9PSBudWxsKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIC8vIENhbGwgY2FsbGJhY2ssIGFuZCByZXR1cm4gaWYgaXQgZG9lc24ndCB3YW50IHRvIGRpc3BsYXkgbWVudQogICAgICAgICAgICAgICAgIGlmICgoY2IgPT0gbnVsbCkgfHwgIWNiLm9uQ3JlYXRlUGFuZWxNZW51KHN0LmZlYXR1cmVJZCwgc3QubWVudSkpIHsKQEAgLTMyNiw2ICszNDIsMTIgQEAKIAogICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHN0LnJlZnJlc2hNZW51Q29udGVudCA9IGZhbHNlOworCisgICAgICAgICAgICAgICAgaWYgKG1BY3Rpb25CYXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBtQWN0aW9uQmFyLnNldE1lbnUoc3QubWVudSk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvLyBDYWxsYmFjayBhbmQgcmV0dXJuIGlmIHRoZSBjYWxsYmFjayBkb2VzIG5vdCB3YW50IHRvIHNob3cgdGhlIG1lbnUKQEAgLTM0OSwzNiArMzcxLDM3IEBACiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBvbkNvbmZpZ3VyYXRpb25DaGFuZ2VkKENvbmZpZ3VyYXRpb24gbmV3Q29uZmlnKSB7Ci0gICAgICAgIFBhbmVsRmVhdHVyZVN0YXRlIHN0ID0gZ2V0UGFuZWxTdGF0ZShGRUFUVVJFX09QVElPTlNfUEFORUwsIGZhbHNlKTsKLSAgICAgICAgaWYgKChzdCAhPSBudWxsKSAmJiAoc3QubWVudSAhPSBudWxsKSkgewotICAgICAgICAgICAgZmluYWwgTWVudUJ1aWxkZXIgbWVudUJ1aWxkZXIgPSAoTWVudUJ1aWxkZXIpIHN0Lm1lbnU7CisgICAgICAgIC8vIEFjdGlvbiBiYXJzIGhhbmRsZSB0aGVpciBvd24gbWVudSBzdGF0ZQorICAgICAgICBpZiAobUFjdGlvbkJhciA9PSBudWxsKSB7CisgICAgICAgICAgICBQYW5lbEZlYXR1cmVTdGF0ZSBzdCA9IGdldFBhbmVsU3RhdGUoRkVBVFVSRV9PUFRJT05TX1BBTkVMLCBmYWxzZSk7CisgICAgICAgICAgICBpZiAoKHN0ICE9IG51bGwpICYmIChzdC5tZW51ICE9IG51bGwpKSB7CisgICAgICAgICAgICAgICAgZmluYWwgTWVudUJ1aWxkZXIgbWVudUJ1aWxkZXIgPSAoTWVudUJ1aWxkZXIpIHN0Lm1lbnU7CiAKLSAgICAgICAgICAgIGlmIChzdC5pc09wZW4pIHsKLSAgICAgICAgICAgICAgICAvLyBGcmVlemUgc3RhdGUKLSAgICAgICAgICAgICAgICBmaW5hbCBCdW5kbGUgc3RhdGUgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgICAgICAgICAgbWVudUJ1aWxkZXIuc2F2ZUhpZXJhcmNoeVN0YXRlKHN0YXRlKTsKKyAgICAgICAgICAgICAgICBpZiAoc3QuaXNPcGVuKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEZyZWV6ZSBzdGF0ZQorICAgICAgICAgICAgICAgICAgICBmaW5hbCBCdW5kbGUgc3RhdGUgPSBuZXcgQnVuZGxlKCk7CisgICAgICAgICAgICAgICAgICAgIG1lbnVCdWlsZGVyLnNhdmVIaWVyYXJjaHlTdGF0ZShzdGF0ZSk7CiAKLSAgICAgICAgICAgICAgICAvLyBSZW1vdmUgdGhlIG1lbnUgdmlld3Mgc2luY2UgdGhleSBuZWVkIHRvIGJlIHJlY3JlYXRlZAotICAgICAgICAgICAgICAgIC8vIGFjY29yZGluZyB0byB0aGUgbmV3IGNvbmZpZ3VyYXRpb24KLSAgICAgICAgICAgICAgICBjbGVhck1lbnVWaWV3cyhzdCk7CisgICAgICAgICAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgbWVudSB2aWV3cyBzaW5jZSB0aGV5IG5lZWQgdG8gYmUgcmVjcmVhdGVkCisgICAgICAgICAgICAgICAgICAgIC8vIGFjY29yZGluZyB0byB0aGUgbmV3IGNvbmZpZ3VyYXRpb24KKyAgICAgICAgICAgICAgICAgICAgY2xlYXJNZW51Vmlld3Moc3QpOwogCi0gICAgICAgICAgICAgICAgLy8gUmUtb3BlbiB0aGUgc2FtZSBtZW51Ci0gICAgICAgICAgICAgICAgcmVvcGVuTWVudShmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIC8vIFJlLW9wZW4gdGhlIHNhbWUgbWVudQorICAgICAgICAgICAgICAgICAgICByZW9wZW5NZW51KGZhbHNlKTsKIAotICAgICAgICAgICAgICAgIC8vIFJlc3RvcmUgc3RhdGUKLSAgICAgICAgICAgICAgICBtZW51QnVpbGRlci5yZXN0b3JlSGllcmFyY2h5U3RhdGUoc3RhdGUpOworICAgICAgICAgICAgICAgICAgICAvLyBSZXN0b3JlIHN0YXRlCisgICAgICAgICAgICAgICAgICAgIG1lbnVCdWlsZGVyLnJlc3RvcmVIaWVyYXJjaHlTdGF0ZShzdGF0ZSk7CiAKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gQ2xlYXIgbWVudSB2aWV3cyBzbyBvbiBuZXh0IG1lbnUgb3BlbmluZywgaXQgd2lsbCB1c2UKLSAgICAgICAgICAgICAgICAvLyB0aGUgcHJvcGVyIGxheW91dAotICAgICAgICAgICAgICAgIGNsZWFyTWVudVZpZXdzKHN0KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBDbGVhciBtZW51IHZpZXdzIHNvIG9uIG5leHQgbWVudSBvcGVuaW5nLCBpdCB3aWxsIHVzZQorICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcHJvcGVyIGxheW91dAorICAgICAgICAgICAgICAgICAgICBjbGVhck1lbnVWaWV3cyhzdCk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9Ci0KICAgICB9CiAKICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGNsZWFyTWVudVZpZXdzKFBhbmVsRmVhdHVyZVN0YXRlIHN0KSB7Ci0KICAgICAgICAgLy8gVGhpcyBjYW4gYmUgY2FsbGVkIG9uIGNvbmZpZyBjaGFuZ2VzLCBzbyB3ZSBzaG91bGQgbWFrZSBzdXJlCiAgICAgICAgIC8vIHRoZSB2aWV3cyB3aWxsIGJlIHJlY29uc3RydWN0ZWQgYmFzZWQgb24gdGhlIG5ldyBvcmllbnRhdGlvbiwgZXRjLgogCkBAIC0zOTMsNyArNDE2LDEyIEBACiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgZmluYWwgdm9pZCBvcGVuUGFuZWwoaW50IGZlYXR1cmVJZCwgS2V5RXZlbnQgZXZlbnQpIHsKLSAgICAgICAgb3BlblBhbmVsKGdldFBhbmVsU3RhdGUoZmVhdHVyZUlkLCB0cnVlKSwgZXZlbnQpOworICAgICAgICBpZiAoZmVhdHVyZUlkID09IEZFQVRVUkVfT1BUSU9OU19QQU5FTCAmJiBtQWN0aW9uQmFyICE9IG51bGwgJiYKKyAgICAgICAgICAgICAgICBtQWN0aW9uQmFyLmlzT3ZlcmZsb3dSZXNlcnZlZCgpKSB7CisgICAgICAgICAgICBtQWN0aW9uQmFyLnNob3dPdmVyZmxvd01lbnUoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG9wZW5QYW5lbChnZXRQYW5lbFN0YXRlKGZlYXR1cmVJZCwgdHJ1ZSksIGV2ZW50KTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBvcGVuUGFuZWwoUGFuZWxGZWF0dXJlU3RhdGUgc3QsIEtleUV2ZW50IGV2ZW50KSB7CkBAIC00ODQsNyArNTEyLDEwIEBACiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgZmluYWwgdm9pZCBjbG9zZVBhbmVsKGludCBmZWF0dXJlSWQpIHsKLSAgICAgICAgaWYgKGZlYXR1cmVJZCA9PSBGRUFUVVJFX0NPTlRFWFRfTUVOVSkgeworICAgICAgICBpZiAoZmVhdHVyZUlkID09IEZFQVRVUkVfT1BUSU9OU19QQU5FTCAmJiBtQWN0aW9uQmFyICE9IG51bGwgJiYKKyAgICAgICAgICAgICAgICBtQWN0aW9uQmFyLmlzT3ZlcmZsb3dSZXNlcnZlZCgpKSB7CisgICAgICAgICAgICBtQWN0aW9uQmFyLmhpZGVPdmVyZmxvd01lbnUoKTsKKyAgICAgICAgfSBlbHNlIGlmIChmZWF0dXJlSWQgPT0gRkVBVFVSRV9DT05URVhUX01FTlUpIHsKICAgICAgICAgICAgIGNsb3NlQ29udGV4dE1lbnUoKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGNsb3NlUGFuZWwoZ2V0UGFuZWxTdGF0ZShmZWF0dXJlSWQsIHRydWUpLCB0cnVlKTsKQEAgLTU0NSw2ICs1NzYsMjYgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGludmFsaWRhdGVQYW5lbE1lbnUoaW50IGZlYXR1cmVJZCkgeworICAgICAgICBQYW5lbEZlYXR1cmVTdGF0ZSBzdCA9IGdldFBhbmVsU3RhdGUoZmVhdHVyZUlkLCB0cnVlKTsKKyAgICAgICAgaWYgKHN0Lm1lbnUgIT0gbnVsbCkgeworICAgICAgICAgICAgc3QubWVudS5jbGVhcigpOworICAgICAgICB9CisgICAgICAgIHN0LnJlZnJlc2hNZW51Q29udGVudCA9IHRydWU7CisgICAgICAgIHN0LnJlZnJlc2hEZWNvclZpZXcgPSB0cnVlOworICAgICAgICAKKyAgICAgICAgLy8gUHJlcGFyZSB0aGUgb3B0aW9ucyBwYW5lbCBpZiB3ZSBoYXZlIGFuIGFjdGlvbiBiYXIKKyAgICAgICAgaWYgKChmZWF0dXJlSWQgPT0gRkVBVFVSRV9BQ1RJT05fQkFSIHx8IGZlYXR1cmVJZCA9PSBGRUFUVVJFX09QVElPTlNfUEFORUwpCisgICAgICAgICAgICAgICAgJiYgbUFjdGlvbkJhciAhPSBudWxsKSB7CisgICAgICAgICAgICBzdCA9IGdldFBhbmVsU3RhdGUoV2luZG93LkZFQVRVUkVfT1BUSU9OU19QQU5FTCwgZmFsc2UpOworICAgICAgICAgICAgaWYgKHN0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzdC5pc1ByZXBhcmVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgcHJlcGFyZVBhbmVsKHN0LCBudWxsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAKICAgICAvKioKICAgICAgKiBDYWxsZWQgd2hlbiB0aGUgcGFuZWwga2V5IGlzIHB1c2hlZCBkb3duLgogICAgICAqIEBwYXJhbSBmZWF0dXJlSWQgVGhlIGZlYXR1cmUgSUQgb2YgdGhlIHJlbGV2YW50IHBhbmVsIChkZWZhdWx0cyB0byBGRUFUVVJFX09QVElPTlNfUEFORUx9LgpAQCAtNTU4LDcgKzYwOSw3IEBACiAgICAgICAgICAgICAvLyBUaGUgcGFuZWwga2V5IHdhcyBwdXNoZWQsIHNvIHNldCB0aGUgY2hvcmRpbmcga2V5CiAgICAgICAgICAgICBtUGFuZWxDaG9yZGluZ0tleSA9IGtleUNvZGU7CiAgICAgICAgICAgICBtUGFuZWxNYXlMb25nUHJlc3MgPSBmYWxzZTsKLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICBQYW5lbEZlYXR1cmVTdGF0ZSBzdCA9IGdldFBhbmVsU3RhdGUoZmVhdHVyZUlkLCB0cnVlKTsKICAgICAgICAgICAgIGlmICghc3QuaXNPcGVuKSB7CiAgICAgICAgICAgICAgICAgaWYgKGdldENvbnRleHQoKS5nZXRSZXNvdXJjZXMoKS5nZXRDb25maWd1cmF0aW9uKCkua2V5Ym9hcmQKQEAgLTU2Nyw3ICs2MTgsNiBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICByZXR1cm4gcHJlcGFyZVBhbmVsKHN0LCBldmVudCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAKICAgICAgICAgfSBlbHNlIGlmIChtUGFuZWxNYXlMb25nUHJlc3MgJiYgbVBhbmVsQ2hvcmRpbmdLZXkgPT0ga2V5Q29kZQogICAgICAgICAgICAgICAgICYmIChldmVudC5nZXRGbGFncygpJktleUV2ZW50LkZMQUdfTE9OR19QUkVTUykgIT0gMCkgewogICAgICAgICAgICAgLy8gV2UgaGF2ZSBoYWQgYSBsb25nIHByZXNzIHdoaWxlIGluIGEgc3RhdGUgd2hlcmUgdGhpcwpAQCAtNjAyLDI1ICs2NTIsMzggQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIAogICAgICAgICAgICAgYm9vbGVhbiBwbGF5U291bmRFZmZlY3QgPSBmYWxzZTsKLSAgICAgICAgICAgIFBhbmVsRmVhdHVyZVN0YXRlIHN0ID0gZ2V0UGFuZWxTdGF0ZShmZWF0dXJlSWQsIHRydWUpOwotICAgICAgICAgICAgaWYgKHN0LmlzT3BlbiB8fCBzdC5pc0hhbmRsZWQpIHsKKyAgICAgICAgICAgIGZpbmFsIFBhbmVsRmVhdHVyZVN0YXRlIHN0ID0gZ2V0UGFuZWxTdGF0ZShmZWF0dXJlSWQsIHRydWUpOworICAgICAgICAgICAgaWYgKGZlYXR1cmVJZCA9PSBGRUFUVVJFX09QVElPTlNfUEFORUwgJiYgbUFjdGlvbkJhciAhPSBudWxsICYmCisgICAgICAgICAgICAgICAgICAgIG1BY3Rpb25CYXIuaXNPdmVyZmxvd1Jlc2VydmVkKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoIW1BY3Rpb25CYXIuaXNPdmVyZmxvd01lbnVTaG93aW5nKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgQ2FsbGJhY2sgY2IgPSBnZXRDYWxsYmFjaygpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2IgIT0gbnVsbCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNiLm9uUHJlcGFyZVBhbmVsKGZlYXR1cmVJZCwgc3QuY3JlYXRlZFBhbmVsVmlldywgc3QubWVudSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBsYXlTb3VuZEVmZmVjdCA9IG1BY3Rpb25CYXIuc2hvd092ZXJmbG93TWVudSgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcGxheVNvdW5kRWZmZWN0ID0gbUFjdGlvbkJhci5oaWRlT3ZlcmZsb3dNZW51KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoc3QuaXNPcGVuIHx8IHN0LmlzSGFuZGxlZCkgewogCi0gICAgICAgICAgICAgICAgLy8gUGxheSB0aGUgc291bmQgZWZmZWN0IGlmIHRoZSB1c2VyIGNsb3NlZCBhbiBvcGVuIG1lbnUgKGFuZCBub3QgaWYKLSAgICAgICAgICAgICAgICAvLyB0aGV5IGp1c3QgcmVsZWFzZWQgYSBtZW51IHNob3J0Y3V0KQotICAgICAgICAgICAgICAgIHBsYXlTb3VuZEVmZmVjdCA9IHN0LmlzT3BlbjsKKyAgICAgICAgICAgICAgICAgICAgLy8gUGxheSB0aGUgc291bmQgZWZmZWN0IGlmIHRoZSB1c2VyIGNsb3NlZCBhbiBvcGVuIG1lbnUgKGFuZCBub3QgaWYKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhleSBqdXN0IHJlbGVhc2VkIGEgbWVudSBzaG9ydGN1dCkKKyAgICAgICAgICAgICAgICAgICAgcGxheVNvdW5kRWZmZWN0ID0gc3QuaXNPcGVuOwogCi0gICAgICAgICAgICAgICAgLy8gQ2xvc2UgbWVudQotICAgICAgICAgICAgICAgIGNsb3NlUGFuZWwoc3QsIHRydWUpOworICAgICAgICAgICAgICAgICAgICAvLyBDbG9zZSBtZW51CisgICAgICAgICAgICAgICAgICAgIGNsb3NlUGFuZWwoc3QsIHRydWUpOwogCi0gICAgICAgICAgICB9IGVsc2UgaWYgKHN0LmlzUHJlcGFyZWQpIHsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0LmlzUHJlcGFyZWQpIHsKIAotICAgICAgICAgICAgICAgIC8vIFdyaXRlICdtZW51IG9wZW5lZCcgdG8gZXZlbnQgbG9nCi0gICAgICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudCg1MDAwMSwgMCk7CisgICAgICAgICAgICAgICAgICAgIC8vIFdyaXRlICdtZW51IG9wZW5lZCcgdG8gZXZlbnQgbG9nCisgICAgICAgICAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoNTAwMDEsIDApOwogCi0gICAgICAgICAgICAgICAgLy8gU2hvdyBtZW51Ci0gICAgICAgICAgICAgICAgb3BlblBhbmVsKHN0LCBldmVudCk7CisgICAgICAgICAgICAgICAgICAgIC8vIFNob3cgbWVudQorICAgICAgICAgICAgICAgICAgICBvcGVuUGFuZWwoc3QsIGV2ZW50KTsKIAotICAgICAgICAgICAgICAgIHBsYXlTb3VuZEVmZmVjdCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIHBsYXlTb3VuZEVmZmVjdCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAocGxheVNvdW5kRWZmZWN0KSB7CkBAIC03NzcsOCArODQwLDIwIEBACiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogCi0gICAgICAgIC8vIFRoZSB3aW5kb3cgbWFuYWdlciB3aWxsIGdpdmUgdXMgYSB2YWxpZCB3aW5kb3cgdG9rZW4KLSAgICAgICAgbmV3IE1lbnVEaWFsb2dIZWxwZXIoc3ViTWVudSkuc2hvdyhudWxsKTsKKyAgICAgICAgZmluYWwgTWVudSBwYXJlbnRNZW51ID0gc3ViTWVudS5nZXRSb290TWVudSgpOworICAgICAgICBmaW5hbCBQYW5lbEZlYXR1cmVTdGF0ZSBwYW5lbCA9IGZpbmRNZW51UGFuZWwocGFyZW50TWVudSk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogVXNlIHRoZSBwYW5lbCBvcGVuIHN0YXRlIHRvIGRldGVybWluZSB3aGV0aGVyIHRoaXMgaXMgY29taW5nIGZyb20gYW4gb3BlbiBwYW5lbAorICAgICAgICAgKiBvciBhbiBhY3Rpb24gYnV0dG9uLiBJZiBpdCdzIGFuIG9wZW4gcGFuZWwgd2Ugd2FudCB0byB1c2UgTWVudURpYWxvZ0hlbHBlci4KKyAgICAgICAgICogSWYgaXQncyBjbG9zZWQgd2Ugd2FudCB0byBncmFiIHRoZSByZWxldmFudCB2aWV3IGFuZCBjcmVhdGUgYSBwb3B1cCBhbmNob3JlZCB0byBpdC4KKyAgICAgICAgICovCisgICAgICAgIGlmIChwYW5lbC5pc09wZW4pIHsKKyAgICAgICAgICAgIC8vIFRoZSB3aW5kb3cgbWFuYWdlciB3aWxsIGdpdmUgdXMgYSB2YWxpZCB3aW5kb3cgdG9rZW4KKyAgICAgICAgICAgIG5ldyBNZW51RGlhbG9nSGVscGVyKHN1Yk1lbnUpLnNob3cobnVsbCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBuZXcgTWVudVBvcHVwSGVscGVyKGdldENvbnRleHQoKSwgc3ViTWVudSkuc2hvdygpOworICAgICAgICB9CiAKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQpAQCAtNzg4LDYgKzg2MywyMSBAQAogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCByZW9wZW5NZW51KGJvb2xlYW4gdG9nZ2xlTWVudU1vZGUpIHsKKyAgICAgICAgaWYgKG1BY3Rpb25CYXIgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKCFtQWN0aW9uQmFyLmlzT3ZlcmZsb3dNZW51U2hvd2luZygpIHx8ICF0b2dnbGVNZW51TW9kZSkgeworICAgICAgICAgICAgICAgIGZpbmFsIENhbGxiYWNrIGNiID0gZ2V0Q2FsbGJhY2soKTsKKyAgICAgICAgICAgICAgICBpZiAoY2IgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBQYW5lbEZlYXR1cmVTdGF0ZSBzdCA9IGdldFBhbmVsU3RhdGUoRkVBVFVSRV9PUFRJT05TX1BBTkVMLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNiLm9uUHJlcGFyZVBhbmVsKEZFQVRVUkVfT1BUSU9OU19QQU5FTCwgc3QuY3JlYXRlZFBhbmVsVmlldywgc3QubWVudSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1BY3Rpb25CYXIuc2hvd092ZXJmbG93TWVudSgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtQWN0aW9uQmFyLmhpZGVPdmVyZmxvd01lbnUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCiAgICAgICAgIFBhbmVsRmVhdHVyZVN0YXRlIHN0ID0gZ2V0UGFuZWxTdGF0ZShGRUFUVVJFX09QVElPTlNfUEFORUwsIHRydWUpOwogCiAgICAgICAgIC8vIFNhdmUgdGhlIGZ1dHVyZSBleHBhbmRlZCBtb2RlIHN0YXRlIHNpbmNlIGNsb3NlUGFuZWwgd2lsbCByZXNldCBpdApAQCAtMTQzNSw2ICsxNTI1LDcgQEAKICAgICBzdGF0aWMgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgRk9DVVNFRF9JRF9UQUcgPSAiYW5kcm9pZDpmb2N1c2VkVmlld0lkIjsKICAgICBzdGF0aWMgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgVklFV1NfVEFHID0gImFuZHJvaWQ6dmlld3MiOwogICAgIHN0YXRpYyBwcml2YXRlIGZpbmFsIFN0cmluZyBQQU5FTFNfVEFHID0gImFuZHJvaWQ6UGFuZWxzIjsKKyAgICBzdGF0aWMgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgQUNUSU9OX0JBUl9UQUcgPSAiYW5kcm9pZDpBY3Rpb25CYXIiOwogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KICAgICBAT3ZlcnJpZGUKQEAgLTE0NjgsNiArMTU1OSwxMCBAQAogICAgICAgICAgICAgb3V0U3RhdGUucHV0U3BhcnNlUGFyY2VsYWJsZUFycmF5KFBBTkVMU19UQUcsIHBhbmVsU3RhdGVzKTsKICAgICAgICAgfQogCisgICAgICAgIGlmIChtQWN0aW9uQmFyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG91dFN0YXRlLnB1dEJvb2xlYW4oQUNUSU9OX0JBUl9UQUcsIG1BY3Rpb25CYXIuaXNPdmVyZmxvd01lbnVTaG93aW5nKCkpOworICAgICAgICB9CisKICAgICAgICAgcmV0dXJuIG91dFN0YXRlOwogICAgIH0KIApAQCAtMTUwMiw2ICsxNTk3LDEwIEBACiAgICAgICAgIGlmIChwYW5lbFN0YXRlcyAhPSBudWxsKSB7CiAgICAgICAgICAgICByZXN0b3JlUGFuZWxTdGF0ZShwYW5lbFN0YXRlcyk7CiAgICAgICAgIH0KKworICAgICAgICBpZiAobUFjdGlvbkJhciAhPSBudWxsICYmIHNhdmVkSW5zdGFuY2VTdGF0ZS5nZXRCb29sZWFuKEFDVElPTl9CQVJfVEFHKSkgeworICAgICAgICAgICAgbUFjdGlvbkJhci5wb3N0U2hvd092ZXJmbG93TWVudSgpOworICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCkBAIC0xNTkyLDYgKzE2OTEsOSBAQAogICAgICAgICBwcml2YXRlIGJvb2xlYW4gbVdhdGNoaW5nRm9yTWVudTsKICAgICAgICAgcHJpdmF0ZSBpbnQgbURvd25ZOwogCisgICAgICAgIHByaXZhdGUgQWN0aW9uTW9kZSBtQWN0aW9uTW9kZTsKKyAgICAgICAgcHJpdmF0ZSBBY3Rpb25CYXJDb250ZXh0VmlldyBtQWN0aW9uTW9kZVZpZXc7CisKICAgICAgICAgcHVibGljIERlY29yVmlldyhDb250ZXh0IGNvbnRleHQsIGludCBmZWF0dXJlSWQpIHsKICAgICAgICAgICAgIHN1cGVyKGNvbnRleHQpOwogICAgICAgICAgICAgbUZlYXR1cmVJZCA9IGZlYXR1cmVJZDsKQEAgLTE2MDAsNyArMTcwMiw4IEBACiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgYm9vbGVhbiBkaXNwYXRjaEtleUV2ZW50KEtleUV2ZW50IGV2ZW50KSB7CiAgICAgICAgICAgICBmaW5hbCBpbnQga2V5Q29kZSA9IGV2ZW50LmdldEtleUNvZGUoKTsKLSAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNEb3duID0gZXZlbnQuZ2V0QWN0aW9uKCkgPT0gS2V5RXZlbnQuQUNUSU9OX0RPV047CisgICAgICAgICAgICBmaW5hbCBpbnQgYWN0aW9uID0gZXZlbnQuZ2V0QWN0aW9uKCk7CisgICAgICAgICAgICBmaW5hbCBib29sZWFuIGlzRG93biA9IGFjdGlvbiA9PSBLZXlFdmVudC5BQ1RJT05fRE9XTjsKIAogICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAqIElmIHRoZSB1c2VyIGhpdHMgYW5vdGhlciBrZXkgd2l0aGluIHRoZSBwbGF5IHNvdW5kIGRlbGF5LCB0aGVuCkBAIC0xNjU3LDYgKzE3NjAsMTQgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIC8vIEJhY2sgY2FuY2VscyBhY3Rpb24gbW9kZXMgZmlyc3QuCisgICAgICAgICAgICBpZiAobUFjdGlvbk1vZGUgIT0gbnVsbCAmJiBrZXlDb2RlID09IEtleUV2ZW50LktFWUNPREVfQkFDSykgeworICAgICAgICAgICAgICAgIGlmIChhY3Rpb24gPT0gS2V5RXZlbnQuQUNUSU9OX1VQKSB7CisgICAgICAgICAgICAgICAgICAgIG1BY3Rpb25Nb2RlLmZpbmlzaCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgZmluYWwgQ2FsbGJhY2sgY2IgPSBnZXRDYWxsYmFjaygpOwogICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBoYW5kbGVkID0gY2IgIT0gbnVsbCAmJiBtRmVhdHVyZUlkIDwgMCA/IGNiLmRpc3BhdGNoS2V5RXZlbnQoZXZlbnQpCiAgICAgICAgICAgICAgICAgICAgIDogc3VwZXIuZGlzcGF0Y2hLZXlFdmVudChldmVudCk7CkBAIC0xODc5LDYgKzE5OTAsNTUgQEAKICAgICAgICAgICAgIHJldHVybiBtQ29udGV4dE1lbnVIZWxwZXIgIT0gbnVsbDsKICAgICAgICAgfQogCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQWN0aW9uTW9kZSBzdGFydEFjdGlvbk1vZGVGb3JDaGlsZChWaWV3IG9yaWdpbmFsVmlldywKKyAgICAgICAgICAgICAgICBBY3Rpb25Nb2RlLkNhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgICAgICAgICAvLyBvcmlnaW5hbFZpZXcgY2FuIGJlIHVzZWQgaGVyZSB0byBiZSBzdXJlIHRoYXQgd2UgZG9uJ3Qgb2JzY3VyZQorICAgICAgICAgICAgLy8gcmVsZXZhbnQgY29udGVudCB3aXRoIHRoZSBjb250ZXh0IG1vZGUgVUkuCisgICAgICAgICAgICByZXR1cm4gc3RhcnRBY3Rpb25Nb2RlKGNhbGxiYWNrKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQWN0aW9uTW9kZSBzdGFydEFjdGlvbk1vZGUoQWN0aW9uTW9kZS5DYWxsYmFjayBjYWxsYmFjaykgeworICAgICAgICAgICAgaWYgKG1BY3Rpb25Nb2RlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtQWN0aW9uTW9kZS5maW5pc2goKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZmluYWwgQWN0aW9uTW9kZS5DYWxsYmFjayB3cmFwcGVkQ2FsbGJhY2sgPSBuZXcgQWN0aW9uTW9kZUNhbGxiYWNrV3JhcHBlcihjYWxsYmFjayk7CisgICAgICAgICAgICBBY3Rpb25Nb2RlIG1vZGUgPSBnZXRDYWxsYmFjaygpLm9uU3RhcnRBY3Rpb25Nb2RlKHdyYXBwZWRDYWxsYmFjayk7CisgICAgICAgICAgICBpZiAobW9kZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUFjdGlvbk1vZGUgPSBtb2RlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAobUFjdGlvbk1vZGVWaWV3ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGhhc0ZlYXR1cmUoRkVBVFVSRV9BQ1RJT05fTU9ERV9PVkVSTEFZKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbUFjdGlvbk1vZGVWaWV3ID0gbmV3IEFjdGlvbkJhckNvbnRleHRWaWV3KG1Db250ZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZyYW1lTGF5b3V0LkxheW91dFBhcmFtcyBwYXJhbXMgPSBuZXcgRnJhbWVMYXlvdXQuTGF5b3V0UGFyYW1zKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQVRDSF9QQVJFTlQsIFdSQVBfQ09OVEVOVCk7CisgICAgICAgICAgICAgICAgICAgICAgICBhZGRWaWV3KG1BY3Rpb25Nb2RlVmlldywgcGFyYW1zKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFZpZXdTdHViIHN0dWIgPSAoVmlld1N0dWIpIGZpbmRWaWV3QnlJZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5pZC5hY3Rpb25fbW9kZV9iYXJfc3R1Yik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3R1YiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUFjdGlvbk1vZGVWaWV3ID0gKEFjdGlvbkJhckNvbnRleHRWaWV3KSBzdHViLmluZmxhdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChtQWN0aW9uTW9kZVZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBtb2RlID0gbmV3IFN0YW5kYWxvbmVBY3Rpb25Nb2RlKGdldENvbnRleHQoKSwgbUFjdGlvbk1vZGVWaWV3LCB3cmFwcGVkQ2FsbGJhY2spOworICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2sub25DcmVhdGVBY3Rpb25Nb2RlKG1vZGUsIG1vZGUuZ2V0TWVudSgpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbW9kZS5pbnZhbGlkYXRlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtQWN0aW9uTW9kZVZpZXcuaW5pdEZvck1vZGUobW9kZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtQWN0aW9uTW9kZVZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICAgICAgICAgICAgICAgICAgbUFjdGlvbk1vZGUgPSBtb2RlOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbUFjdGlvbk1vZGUgPSBudWxsOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG1BY3Rpb25Nb2RlOworICAgICAgICB9CisKICAgICAgICAgcHVibGljIHZvaWQgc3RhcnRDaGFuZ2luZygpIHsKICAgICAgICAgICAgIG1DaGFuZ2luZyA9IHRydWU7CiAgICAgICAgIH0KQEAgLTIwNTgsNiArMjIxOCwzNyBAQAogICAgICAgICAgICAgaWYgKGtlZXBPbikgUGhvbmVXaW5kb3cudGhpcy5hZGRGbGFncyhXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX0tFRVBfU0NSRUVOX09OKTsKICAgICAgICAgICAgIGVsc2UgUGhvbmVXaW5kb3cudGhpcy5jbGVhckZsYWdzKFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfS0VFUF9TQ1JFRU5fT04pOwogICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENsZWFycyBvdXQgaW50ZXJuYWwgcmVmZXJlbmNlIHdoZW4gdGhlIGFjdGlvbiBtb2RlIGlzIGRlc3Ryb3llZC4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgY2xhc3MgQWN0aW9uTW9kZUNhbGxiYWNrV3JhcHBlciBpbXBsZW1lbnRzIEFjdGlvbk1vZGUuQ2FsbGJhY2sgeworICAgICAgICAgICAgcHJpdmF0ZSBBY3Rpb25Nb2RlLkNhbGxiYWNrIG1XcmFwcGVkOworCisgICAgICAgICAgICBwdWJsaWMgQWN0aW9uTW9kZUNhbGxiYWNrV3JhcHBlcihBY3Rpb25Nb2RlLkNhbGxiYWNrIHdyYXBwZWQpIHsKKyAgICAgICAgICAgICAgICBtV3JhcHBlZCA9IHdyYXBwZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIG9uQ3JlYXRlQWN0aW9uTW9kZShBY3Rpb25Nb2RlIG1vZGUsIE1lbnUgbWVudSkgeworICAgICAgICAgICAgICAgIHJldHVybiBtV3JhcHBlZC5vbkNyZWF0ZUFjdGlvbk1vZGUobW9kZSwgbWVudSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIG9uUHJlcGFyZUFjdGlvbk1vZGUoQWN0aW9uTW9kZSBtb2RlLCBNZW51IG1lbnUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbVdyYXBwZWQub25QcmVwYXJlQWN0aW9uTW9kZShtb2RlLCBtZW51KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gb25BY3Rpb25JdGVtQ2xpY2tlZChBY3Rpb25Nb2RlIG1vZGUsIE1lbnVJdGVtIGl0ZW0pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbVdyYXBwZWQub25BY3Rpb25JdGVtQ2xpY2tlZChtb2RlLCBpdGVtKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgb25EZXN0cm95QWN0aW9uTW9kZShBY3Rpb25Nb2RlIG1vZGUpIHsKKyAgICAgICAgICAgICAgICBtV3JhcHBlZC5vbkRlc3Ryb3lBY3Rpb25Nb2RlKG1vZGUpOworICAgICAgICAgICAgICAgIGlmIChtQWN0aW9uTW9kZVZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBtQWN0aW9uTW9kZVZpZXcucmVtb3ZlQWxsVmlld3MoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbUFjdGlvbk1vZGUgPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgfQogCiAgICAgcHJvdGVjdGVkIERlY29yVmlldyBnZW5lcmF0ZURlY29yKCkgewpAQCAtMjEwNiw2ICsyMjk3LDE3IEBACiAKICAgICAgICAgaWYgKGEuZ2V0Qm9vbGVhbihjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5XaW5kb3dfd2luZG93Tm9UaXRsZSwgZmFsc2UpKSB7CiAgICAgICAgICAgICByZXF1ZXN0RmVhdHVyZShGRUFUVVJFX05PX1RJVExFKTsKKyAgICAgICAgfSBlbHNlIGlmIChhLmdldEJvb2xlYW4oY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuV2luZG93X3dpbmRvd0FjdGlvbkJhciwgZmFsc2UpKSB7CisgICAgICAgICAgICAvLyBEb24ndCBhbGxvdyBhbiBhY3Rpb24gYmFyIGlmIHRoZXJlIGlzIG5vIHRpdGxlLgorICAgICAgICAgICAgcmVxdWVzdEZlYXR1cmUoRkVBVFVSRV9BQ1RJT05fQkFSKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChhLmdldEJvb2xlYW4oY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuV2luZG93X3dpbmRvd0FjdGlvbkJhck92ZXJsYXksIGZhbHNlKSkgeworICAgICAgICAgICAgcmVxdWVzdEZlYXR1cmUoRkVBVFVSRV9BQ1RJT05fQkFSX09WRVJMQVkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGEuZ2V0Qm9vbGVhbihjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5XaW5kb3dfd2luZG93QWN0aW9uTW9kZU92ZXJsYXksIGZhbHNlKSkgeworICAgICAgICAgICAgcmVxdWVzdEZlYXR1cmUoRkVBVFVSRV9BQ1RJT05fTU9ERV9PVkVSTEFZKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChhLmdldEJvb2xlYW4oY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuV2luZG93X3dpbmRvd0Z1bGxzY3JlZW4sIGZhbHNlKSkgewpAQCAtMjE3MCwxMSArMjM3MiwxNSBAQAogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBsYXlvdXRSZXNvdXJjZSA9IGNvbS5hbmRyb2lkLmludGVybmFsLlIubGF5b3V0LnNjcmVlbl90aXRsZV9pY29uczsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFhYWCBSZW1vdmUgdGhpcyBvbmNlIGFjdGlvbiBiYXIgc3VwcG9ydHMgdGhlc2UgZmVhdHVyZXMuCisgICAgICAgICAgICByZW1vdmVGZWF0dXJlKEZFQVRVUkVfQUNUSU9OX0JBUik7CiAgICAgICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlRpdGxlIEljb25zISIpOwogICAgICAgICB9IGVsc2UgaWYgKChmZWF0dXJlcyAmICgoMSA8PCBGRUFUVVJFX1BST0dSRVNTKSB8ICgxIDw8IEZFQVRVUkVfSU5ERVRFUk1JTkFURV9QUk9HUkVTUykpKSAhPSAwKSB7CiAgICAgICAgICAgICAvLyBTcGVjaWFsIGNhc2UgZm9yIGEgd2luZG93IHdpdGggb25seSBhIHByb2dyZXNzIGJhciAoYW5kIHRpdGxlKS4KICAgICAgICAgICAgIC8vIFhYWCBOZWVkIHRvIGhhdmUgYSBuby10aXRsZSB2ZXJzaW9uIG9mIGVtYmVkZGVkIHdpbmRvd3MuCiAgICAgICAgICAgICBsYXlvdXRSZXNvdXJjZSA9IGNvbS5hbmRyb2lkLmludGVybmFsLlIubGF5b3V0LnNjcmVlbl9wcm9ncmVzczsKKyAgICAgICAgICAgIC8vIFhYWCBSZW1vdmUgdGhpcyBvbmNlIGFjdGlvbiBiYXIgc3VwcG9ydHMgdGhlc2UgZmVhdHVyZXMuCisgICAgICAgICAgICByZW1vdmVGZWF0dXJlKEZFQVRVUkVfQUNUSU9OX0JBUik7CiAgICAgICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlByb2dyZXNzISIpOwogICAgICAgICB9IGVsc2UgaWYgKChmZWF0dXJlcyAmICgxIDw8IEZFQVRVUkVfQ1VTVE9NX1RJVExFKSkgIT0gMCkgewogICAgICAgICAgICAgLy8gU3BlY2lhbCBjYXNlIGZvciBhIHdpbmRvdyB3aXRoIGEgY3VzdG9tIHRpdGxlLgpAQCAtMjE4NCwxMSArMjM5MCwxOSBAQAogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBsYXlvdXRSZXNvdXJjZSA9IGNvbS5hbmRyb2lkLmludGVybmFsLlIubGF5b3V0LnNjcmVlbl9jdXN0b21fdGl0bGU7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBYWFggUmVtb3ZlIHRoaXMgb25jZSBhY3Rpb24gYmFyIHN1cHBvcnRzIHRoZXNlIGZlYXR1cmVzLgorICAgICAgICAgICAgcmVtb3ZlRmVhdHVyZShGRUFUVVJFX0FDVElPTl9CQVIpOwogICAgICAgICB9IGVsc2UgaWYgKChmZWF0dXJlcyAmICgxIDw8IEZFQVRVUkVfTk9fVElUTEUpKSA9PSAwKSB7CiAgICAgICAgICAgICAvLyBJZiBubyBvdGhlciBmZWF0dXJlcyBhbmQgbm90IGVtYmVkZGVkLCBvbmx5IG5lZWQgYSB0aXRsZS4KICAgICAgICAgICAgIC8vIElmIHRoZSB3aW5kb3cgaXMgZmxvYXRpbmcsIHdlIG5lZWQgYSBkaWFsb2cgbGF5b3V0CiAgICAgICAgICAgICBpZiAobUlzRmxvYXRpbmcpIHsKICAgICAgICAgICAgICAgICBsYXlvdXRSZXNvdXJjZSA9IGNvbS5hbmRyb2lkLmludGVybmFsLlIubGF5b3V0LmRpYWxvZ190aXRsZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoKGZlYXR1cmVzICYgKDEgPDwgRkVBVFVSRV9BQ1RJT05fQkFSKSkgIT0gMCkgeworICAgICAgICAgICAgICAgIGlmICgoZmVhdHVyZXMgJiAoMSA8PCBGRUFUVVJFX0FDVElPTl9CQVJfT1ZFUkxBWSkpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbGF5b3V0UmVzb3VyY2UgPSBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmxheW91dC5zY3JlZW5fYWN0aW9uX2Jhcl9vdmVybGF5OworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGxheW91dFJlc291cmNlID0gY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5sYXlvdXQuc2NyZWVuX2FjdGlvbl9iYXI7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBsYXlvdXRSZXNvdXJjZSA9IGNvbS5hbmRyb2lkLmludGVybmFsLlIubGF5b3V0LnNjcmVlbl90aXRsZTsKICAgICAgICAgICAgIH0KQEAgLTIyNzMsNiArMjQ4NywyMiBAQAogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIG1UaXRsZVZpZXcuc2V0VGV4dChtVGl0bGUpOwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbUFjdGlvbkJhciA9IChBY3Rpb25CYXJWaWV3KSBmaW5kVmlld0J5SWQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5pZC5hY3Rpb25fYmFyKTsKKyAgICAgICAgICAgICAgICBpZiAobUFjdGlvbkJhciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtQWN0aW9uQmFyLmdldFRpdGxlKCkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbUFjdGlvbkJhci5zZXRXaW5kb3dUaXRsZShtVGl0bGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIFBvc3QgdGhlIHBhbmVsIGludmFsaWRhdGUgZm9yIGxhdGVyOyBhdm9pZCBhcHBsaWNhdGlvbiBvbkNyZWF0ZU9wdGlvbnNNZW51CisgICAgICAgICAgICAgICAgICAgIC8vIGJlaW5nIGNhbGxlZCBpbiB0aGUgbWlkZGxlIG9mIG9uQ3JlYXRlIG9yIHNpbWlsYXIuCisgICAgICAgICAgICAgICAgICAgIG1EZWNvci5wb3N0KG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzRGVzdHJveWVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZVBhbmVsTWVudShGRUFUVVJFX0FDVElPTl9CQVIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtMjYyNiw2ICsyODU2LDggQEAKIAogICAgICAgICBib29sZWFuIHJlZnJlc2hEZWNvclZpZXc7CiAKKyAgICAgICAgYm9vbGVhbiByZWZyZXNoTWVudUNvbnRlbnQ7CisgICAgICAgIAogICAgICAgICBib29sZWFuIHdhc0xhc3RPcGVuOwogICAgICAgICAKICAgICAgICAgYm9vbGVhbiB3YXNMYXN0RXhwYW5kZWQ7CkBAIC0yNzQ4LDExICsyOTgwLDExIEBACiAgICAgICogPGxpPiBDYWxscyBiYWNrIHRvIHRoZSBjYWxsYmFjaydzIG9uTWVudUl0ZW1TZWxlY3RlZCB3aGVuIGFuIGl0ZW0gaXMKICAgICAgKiBzZWxlY3RlZC4KICAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIGNsYXNzIENvbnRleHRNZW51Q2FsbGJhY2sgaW1wbGVtZW50cyBNZW51QnVpbGRlci5DYWxsYmFjayB7CisgICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBEaWFsb2dNZW51Q2FsbGJhY2sgaW1wbGVtZW50cyBNZW51QnVpbGRlci5DYWxsYmFjayB7CiAgICAgICAgIHByaXZhdGUgaW50IG1GZWF0dXJlSWQ7CiAgICAgICAgIHByaXZhdGUgTWVudURpYWxvZ0hlbHBlciBtU3ViTWVudUhlbHBlcjsKIAotICAgICAgICBwdWJsaWMgQ29udGV4dE1lbnVDYWxsYmFjayhpbnQgZmVhdHVyZUlkKSB7CisgICAgICAgIHB1YmxpYyBEaWFsb2dNZW51Q2FsbGJhY2soaW50IGZlYXR1cmVJZCkgewogICAgICAgICAgICAgbUZlYXR1cmVJZCA9IGZlYXR1cmVJZDsKICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL1Bob25lV2luZG93TWFuYWdlci5qYXZhIGIvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9QaG9uZVdpbmRvd01hbmFnZXIuamF2YQppbmRleCAyNzQxMjRiLi5lY2JhMWZlIDEwMDc1NQotLS0gYS9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL1Bob25lV2luZG93TWFuYWdlci5qYXZhCisrKyBiL3BvbGljeS9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvcG9saWN5L2ltcGwvUGhvbmVXaW5kb3dNYW5hZ2VyLmphdmEKQEAgLTE5OCw2ICsxOTgsNyBAQAogICAgIAogICAgIGJvb2xlYW4gbVNhZmVNb2RlOwogICAgIFdpbmRvd1N0YXRlIG1TdGF0dXNCYXIgPSBudWxsOworICAgIGJvb2xlYW4gbVN0YXR1c0JhckNhbkhpZGU7CiAgICAgZmluYWwgQXJyYXlMaXN0PFdpbmRvd1N0YXRlPiBtU3RhdHVzQmFyUGFuZWxzID0gbmV3IEFycmF5TGlzdDxXaW5kb3dTdGF0ZT4oKTsKICAgICBXaW5kb3dTdGF0ZSBtS2V5Z3VhcmQgPSBudWxsOwogICAgIEtleWd1YXJkVmlld01lZGlhdG9yIG1LZXlndWFyZE1lZGlhdG9yOwpAQCAtNTYzLDYgKzU2NCw5IEBACiAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hcnJheS5jb25maWdfc2FmZU1vZGVEaXNhYmxlZFZpYmVQYXR0ZXJuKTsKICAgICAgICAgbVNhZmVNb2RlRW5hYmxlZFZpYmVQYXR0ZXJuID0gZ2V0TG9uZ0ludEFycmF5KG1Db250ZXh0LmdldFJlc291cmNlcygpLAogICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYXJyYXkuY29uZmlnX3NhZmVNb2RlRW5hYmxlZFZpYmVQYXR0ZXJuKTsKKworICAgICAgICAvLyBOb3RlOiB0aGUgQ29uZmlndXJhdGlvbiBpcyBub3Qgc3RhYmxlIGhlcmUsIHNvIHdlIGNhbm5vdCBsb2FkIG1TdGF0dXNCYXJDYW5IaWRlIGZyb20KKyAgICAgICAgLy8gY29uZmlnX3N0YXR1c0JhckNhbkhpZGUgYmVjYXVzZSB0aGUgbGF0dGVyIGRlcGVuZHMgb24gdGhlIHNjcmVlbiBzaXplCiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgdXBkYXRlU2V0dGluZ3MoKSB7CkBAIC05NzUsNiArOTc5LDExIEBACiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBXaW5kb3dNYW5hZ2VySW1wbC5BRERfTVVMVElQTEVfU0lOR0xFVE9OOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBtU3RhdHVzQmFyID0gd2luOworCisgICAgICAgICAgICAgICAgLy8gVGhlIENvbmZpZ3VyYXRpb24gd2lsbCBiZSBzdGFibGUgYnkgbm93LCBzbyB3ZSBjYW4gbG9hZCB0aGlzCisgICAgICAgICAgICAgICAgbVN0YXR1c0JhckNhbkhpZGUgPSBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRCb29sZWFuKAorICAgICAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5ib29sLmNvbmZpZ19zdGF0dXNCYXJDYW5IaWRlKTsKKwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBUWVBFX1NUQVRVU19CQVJfUEFORUw6CiAgICAgICAgICAgICAgICAgbUNvbnRleHQuZW5mb3JjZUNhbGxpbmdPclNlbGZQZXJtaXNzaW9uKApAQCAtMTIzMyw3ICsxMjQyLDcgQEAKICAgICBwdWJsaWMgdm9pZCBnZXRDb250ZW50SW5zZXRIaW50THcoV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMgYXR0cnMsIFJlY3QgY29udGVudEluc2V0KSB7CiAgICAgICAgIGZpbmFsIGludCBmbCA9IGF0dHJzLmZsYWdzOwogICAgICAgICAKLSAgICAgICAgaWYgKChmbCAmCisgICAgICAgIGlmIChtU3RhdHVzQmFyQ2FuSGlkZSAmJiAoZmwgJgogICAgICAgICAgICAgICAgIChGTEFHX0xBWU9VVF9JTl9TQ1JFRU4gfCBGTEFHX0ZVTExTQ1JFRU4gfCBGTEFHX0xBWU9VVF9JTlNFVF9ERUNPUikpCiAgICAgICAgICAgICAgICAgPT0gKEZMQUdfTEFZT1VUX0lOX1NDUkVFTiB8IEZMQUdfTEFZT1VUX0lOU0VUX0RFQ09SKSkgewogICAgICAgICAgICAgY29udGVudEluc2V0LnNldChtQ3VyTGVmdCwgbUN1clRvcCwgbVcgLSBtQ3VyUmlnaHQsIG1IIC0gbUN1ckJvdHRvbSk7CkBAIC0xMjY2LDEwICsxMjc1LDE3IEBACiAgICAgICAgICAgICBpZiAobVN0YXR1c0Jhci5pc1Zpc2libGVMdygpKSB7CiAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHN0YXR1cyBiYXIgaXMgaGlkZGVuLCB3ZSBkb24ndCB3YW50IHRvIGNhdXNlCiAgICAgICAgICAgICAgICAgLy8gd2luZG93cyBiZWhpbmQgaXQgdG8gc2Nyb2xsLgotICAgICAgICAgICAgICAgIG1Eb2NrVG9wID0gbUNvbnRlbnRUb3AgPSBtQ3VyVG9wID0gbVN0YXR1c0Jhci5nZXRGcmFtZUx3KCkuYm90dG9tOwotICAgICAgICAgICAgICAgIGlmIChERUJVR19MQVlPVVQpIExvZy52KFRBRywgIlN0YXR1cyBiYXI6IG1Eb2NrQm90dG9tPSIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgbURvY2tCb3R0b20gKyAiIG1Db250ZW50Qm90dG9tPSIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgbUNvbnRlbnRCb3R0b20gKyAiIG1DdXJCb3R0b209IiArIG1DdXJCb3R0b20pOworICAgICAgICAgICAgICAgIGZpbmFsIFJlY3QgciA9IG1TdGF0dXNCYXIuZ2V0RnJhbWVMdygpOworICAgICAgICAgICAgICAgIGlmIChtRG9ja1RvcCA9PSByLnRvcCkgbURvY2tUb3AgPSByLmJvdHRvbTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChtRG9ja0JvdHRvbSA9PSByLmJvdHRvbSkgbURvY2tCb3R0b20gPSByLnRvcDsKKyAgICAgICAgICAgICAgICBtQ29udGVudFRvcCA9IG1DdXJUb3AgPSBtRG9ja1RvcDsKKyAgICAgICAgICAgICAgICBtQ29udGVudEJvdHRvbSA9IG1DdXJCb3R0b20gPSBtRG9ja0JvdHRvbTsKKyAgICAgICAgICAgICAgICBpZiAoREVCVUdfTEFZT1VUKSBMb2cudihUQUcsICJTdGF0dXMgYmFyOiBtRG9ja1RvcD0iICsgbURvY2tUb3AKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiBtQ29udGVudFRvcD0iICsgbUNvbnRlbnRUb3AKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiBtQ3VyVG9wPSIgKyBtQ3VyVG9wCisgICAgICAgICAgICAgICAgICAgICAgICArICIgbURvY2tCb3R0b209IiArIG1Eb2NrQm90dG9tCisgICAgICAgICAgICAgICAgICAgICAgICArICIgbUNvbnRlbnRCb3R0b209IiArIG1Db250ZW50Qm90dG9tCisgICAgICAgICAgICAgICAgICAgICAgICArICIgbUN1ckJvdHRvbT0iICsgbUN1ckJvdHRvbSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC0xMzU0LDcgKzEzNzAsNyBAQAogICAgICAgICAgICAgYXR0cnMuZ3Jhdml0eSA9IEdyYXZpdHkuQk9UVE9NOwogICAgICAgICAgICAgbURvY2tMYXllciA9IHdpbi5nZXRTdXJmYWNlTGF5ZXIoKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmICgoZmwgJgorICAgICAgICAgICAgaWYgKG1TdGF0dXNCYXJDYW5IaWRlICYmIChmbCAmCiAgICAgICAgICAgICAgICAgICAgIChGTEFHX0xBWU9VVF9JTl9TQ1JFRU4gfCBGTEFHX0ZVTExTQ1JFRU4gfCBGTEFHX0xBWU9VVF9JTlNFVF9ERUNPUikpCiAgICAgICAgICAgICAgICAgICAgID09IChGTEFHX0xBWU9VVF9JTl9TQ1JFRU4gfCBGTEFHX0xBWU9VVF9JTlNFVF9ERUNPUikpIHsKICAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIHRoZSBjYXNlIGZvciBhIG5vcm1hbCBhY3Rpdml0eSB3aW5kb3c6IHdlIHdhbnQgaXQKQEAgLTEzODYsNyArMTQwMiw3IEBACiAgICAgICAgICAgICAgICAgICAgIHZmLnJpZ2h0ID0gbUN1clJpZ2h0OwogICAgICAgICAgICAgICAgICAgICB2Zi5ib3R0b20gPSBtQ3VyQm90dG9tOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoKGZsICYgRkxBR19MQVlPVVRfSU5fU0NSRUVOKSAhPSAwKSB7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1TdGF0dXNCYXJDYW5IaWRlICYmIChmbCAmIEZMQUdfTEFZT1VUX0lOX1NDUkVFTikgIT0gMCkgewogICAgICAgICAgICAgICAgIC8vIEEgd2luZG93IHRoYXQgaGFzIHJlcXVlc3RlZCB0byBmaWxsIHRoZSBlbnRpcmUgc2NyZWVuIGp1c3QKICAgICAgICAgICAgICAgICAvLyBnZXRzIGV2ZXJ5dGhpbmcsIHBlcmlvZC4KICAgICAgICAgICAgICAgICBwZi5sZWZ0ID0gZGYubGVmdCA9IGNmLmxlZnQgPSAwOwpAQCAtMTUzMCw5ICsxNTQ2LDEzIEBACiAgICAgICAgICAgICAgICAgYm9vbGVhbiBoaWRlU3RhdHVzQmFyID0KICAgICAgICAgICAgICAgICAgICAgKGxwLmZsYWdzICYgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19GVUxMU0NSRUVOKSAhPSAwOwogICAgICAgICAgICAgICAgIGlmIChoaWRlU3RhdHVzQmFyKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChERUJVR19MQVlPVVQpIExvZy52KFRBRywgIkhpZGluZyBzdGF0dXMgYmFyIik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtU3RhdHVzQmFyLmhpZGVMdyh0cnVlKSkgY2hhbmdlcyB8PSBGSU5JU0hfTEFZT1VUX1JFRE9fTEFZT1VUOwotICAgICAgICAgICAgICAgICAgICBoaWRpbmcgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBpZiAobVN0YXR1c0JhckNhbkhpZGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVR19MQVlPVVQpIExvZy52KFRBRywgIkhpZGluZyBzdGF0dXMgYmFyIik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVN0YXR1c0Jhci5oaWRlTHcodHJ1ZSkpIGNoYW5nZXMgfD0gRklOSVNIX0xBWU9VVF9SRURPX0xBWU9VVDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGhpZGluZyA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobG9jYWxMT0dWKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cudihUQUcsICJQcmV2ZW50aW5nIHN0YXR1cyBiYXIgZnJvbSBoaWRpbmcgYnkgcG9saWN5Iik7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUdfTEFZT1VUKSBMb2cudihUQUcsICJTaG93aW5nIHN0YXR1cyBiYXIiKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKG1TdGF0dXNCYXIuc2hvd0x3KHRydWUpKSBjaGFuZ2VzIHw9IEZJTklTSF9MQVlPVVRfUkVET19MQVlPVVQ7CmRpZmYgLS1naXQgYS9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL1N0YXR1c1ZpZXcuamF2YSBiL3BvbGljeS9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvcG9saWN5L2ltcGwvU3RhdHVzVmlldy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmMDhjZmQKLS0tIC9kZXYvbnVsbAorKysgYi9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL1N0YXR1c1ZpZXcuamF2YQpAQCAtMCwwICsxLDI1NSBAQAorLy8gQ29weXJpZ2h0IDIwMTAgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC5wb2xpY3kuaW1wbDsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLlI7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0LkxvY2tQYXR0ZXJuVXRpbHM7CisKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKK2ltcG9ydCBhbmRyb2lkLnRleHQuZm9ybWF0LkRhdGVGb3JtYXQ7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKKworY2xhc3MgU3RhdHVzVmlldyB7CisgICAgcHJpdmF0ZSBTdHJpbmcgbURhdGVGb3JtYXRTdHJpbmc7CisKKyAgICBwcml2YXRlIFRleHRWaWV3IG1DYXJyaWVyOworICAgIHByaXZhdGUgVGV4dFZpZXcgbURhdGU7CisKKyAgICAvLyBhcmUgd2Ugc2hvd2luZyBiYXR0ZXJ5IGluZm9ybWF0aW9uPworICAgIHByaXZhdGUgYm9vbGVhbiBtU2hvd2luZ0JhdHRlcnlJbmZvID0gZmFsc2U7CisKKyAgICAvLyBsYXN0IGtub3duIHBsdWdnZWQgaW4gc3RhdGUKKyAgICBwcml2YXRlIGJvb2xlYW4gbVBsdWdnZWRJbiA9IGZhbHNlOworCisgICAgLy8gbGFzdCBrbm93biBiYXR0ZXJ5IGxldmVsCisgICAgcHJpdmF0ZSBpbnQgbUJhdHRlcnlMZXZlbCA9IDEwMDsKKworICAgIHByaXZhdGUgU3RyaW5nIG1OZXh0QWxhcm0gPSBudWxsOworCisgICAgcHJpdmF0ZSBTdHJpbmcgbUluc3RydWN0aW9ucyA9IG51bGw7CisgICAgcHJpdmF0ZSBUZXh0VmlldyBtU3RhdHVzMTsKKyAgICBwcml2YXRlIFRleHRWaWV3IG1TdGF0dXMyOworICAgIHByaXZhdGUgVGV4dFZpZXcgbVByb3BlcnR5T2Y7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gbUhhc1N0YXR1czI7CisgICAgcHJpdmF0ZSBib29sZWFuIG1IYXNDYXJyaWVyOworICAgIHByaXZhdGUgYm9vbGVhbiBtSGFzRGF0ZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gbUhhc1Byb3BlcnR5OworCisgICAgcHJpdmF0ZSBWaWV3IG1WaWV3OworCisgICAgcHJpdmF0ZSBWaWV3IGZpbmRWaWV3QnlJZChpbnQgaWQpIHsKKyAgICAgICAgcmV0dXJuIG1WaWV3LmZpbmRWaWV3QnlJZChpZCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBDb250ZXh0IGdldENvbnRleHQoKSB7CisgICAgICAgIHJldHVybiBtVmlldy5nZXRDb250ZXh0KCk7CisgICAgfQorCisgICAgdm9pZCBzZXRJbnN0cnVjdGlvbnMoU3RyaW5nIGluc3RydWN0aW9ucykgeworICAgICAgICBtSW5zdHJ1Y3Rpb25zID0gaW5zdHJ1Y3Rpb25zOworICAgIH0KKworICAgIHZvaWQgc2V0Q2FycmllclRleHQoQ2hhclNlcXVlbmNlIGNhcnJpZXJUZXh0KSB7CisgICAgICAgIGlmIChtQ2FycmllciAhPSBudWxsKSB7CisgICAgICAgICAgICBtQ2Fycmllci5zZXRUZXh0KGNhcnJpZXJUZXh0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgb25SZWZyZXNoQmF0dGVyeUluZm8oYm9vbGVhbiBzaG93QmF0dGVyeUluZm8sIGJvb2xlYW4gcGx1Z2dlZEluLCBpbnQgYmF0dGVyeUxldmVsKSB7CisgICAgICAgIG1TaG93aW5nQmF0dGVyeUluZm8gPSBzaG93QmF0dGVyeUluZm87CisgICAgICAgIG1QbHVnZ2VkSW4gPSBwbHVnZ2VkSW47CisgICAgICAgIG1CYXR0ZXJ5TGV2ZWwgPSBiYXR0ZXJ5TGV2ZWw7CisgICAgICAgIHVwZGF0ZVN0YXR1c0xpbmVzKCk7CisgICAgfQorCisgICAgdm9pZCBvblRpbWVDaGFuZ2VkKCkgeworICAgICAgICByZWZyZXNoVGltZUFuZERhdGVEaXNwbGF5KCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb25SaW5nZXJNb2RlQ2hhbmdlZChpbnQgc3RhdGUpIHsKKyAgICB9CisKKyAgICB2b2lkIG9uUmVmcmVzaENhcnJpZXJJbmZvKENoYXJTZXF1ZW5jZSBwbG1uLCBDaGFyU2VxdWVuY2Ugc3BuKSB7CisgICAgICAgIHNldENhcnJpZXJUZXh0KExvY2tTY3JlZW4uZ2V0Q2FycmllclN0cmluZyhwbG1uLCBzcG4pKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RhdHVzVmlldyhWaWV3IHZpZXcsIEtleWd1YXJkVXBkYXRlTW9uaXRvciB1cGRhdGVNb25pdG9yLAorICAgICAgICAgICAgICAgICAgTG9ja1BhdHRlcm5VdGlscyBsb2NrUGF0dGVyblV0aWxzKSB7CisgICAgICAgIG1WaWV3ID0gdmlldzsKKyAgICAgICAgbUNhcnJpZXIgPSAoVGV4dFZpZXcpIGZpbmRWaWV3QnlJZChSLmlkLmNhcnJpZXIpOworICAgICAgICBtSGFzQ2FycmllciA9IChtQ2FycmllciAhPSBudWxsKTsKKyAgICAgICAgbURhdGUgPSAoVGV4dFZpZXcpIGZpbmRWaWV3QnlJZChSLmlkLmRhdGUpOworICAgICAgICBtSGFzRGF0ZSA9IChtRGF0ZSAhPSBudWxsKTsKKyAgICAgICAgbURhdGVGb3JtYXRTdHJpbmcgPSBnZXRDb250ZXh0KCkuZ2V0U3RyaW5nKFIuc3RyaW5nLmZ1bGxfd2RheV9tb250aF9kYXlfbm9feWVhcik7CisKKyAgICAgICAgcmVmcmVzaFRpbWVBbmREYXRlRGlzcGxheSgpOworCisgICAgICAgIG1TdGF0dXMxID0gKFRleHRWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5zdGF0dXMxKTsKKyAgICAgICAgbVN0YXR1czIgPSAoVGV4dFZpZXcpIGZpbmRWaWV3QnlJZChSLmlkLnN0YXR1czIpOworICAgICAgICBtSGFzU3RhdHVzMiA9IChtU3RhdHVzMiAhPSBudWxsKTsKKyAgICAgICAgbVByb3BlcnR5T2YgPSAoVGV4dFZpZXcpIGZpbmRWaWV3QnlJZChSLmlkLnByb3BlcnR5T2YpOworICAgICAgICBtSGFzUHJvcGVydHkgPSAobVByb3BlcnR5T2YgIT0gbnVsbCk7CisKKyAgICAgICAgcmVzZXRTdGF0dXNJbmZvKHVwZGF0ZU1vbml0b3IsIGxvY2tQYXR0ZXJuVXRpbHMpOworCisgICAgICAgIC8vIFJlcXVpcmVkIHRvIGdldCBNYXJxdWVlIHRvIHdvcmsuCisgICAgICAgIGlmIChtSGFzQ2FycmllcikgeworICAgICAgICAgICAgbUNhcnJpZXIuc2V0U2VsZWN0ZWQodHJ1ZSk7CisgICAgICAgICAgICBtQ2Fycmllci5zZXRUZXh0Q29sb3IoMHhmZmZmZmZmZik7CisgICAgICAgIH0KKworICAgIH0KKworICAgIHZvaWQgcmVzZXRTdGF0dXNJbmZvKEtleWd1YXJkVXBkYXRlTW9uaXRvciB1cGRhdGVNb25pdG9yLCBMb2NrUGF0dGVyblV0aWxzIGxvY2tQYXR0ZXJuVXRpbHMpIHsKKyAgICAgICAgbUluc3RydWN0aW9ucyA9IG51bGw7CisgICAgICAgIG1TaG93aW5nQmF0dGVyeUluZm8gPSB1cGRhdGVNb25pdG9yLnNob3VsZFNob3dCYXR0ZXJ5SW5mbygpOworICAgICAgICBtUGx1Z2dlZEluID0gdXBkYXRlTW9uaXRvci5pc0RldmljZVBsdWdnZWRJbigpOworICAgICAgICBtQmF0dGVyeUxldmVsID0gdXBkYXRlTW9uaXRvci5nZXRCYXR0ZXJ5TGV2ZWwoKTsKKyAgICAgICAgbU5leHRBbGFybSA9IGxvY2tQYXR0ZXJuVXRpbHMuZ2V0TmV4dEFsYXJtKCk7CisgICAgICAgIHVwZGF0ZVN0YXR1c0xpbmVzKCk7CisgICAgfQorCisgICAgdm9pZCBzZXRJbnN0cnVjdGlvblRleHQoaW50IHN0cmluZ0lkKSB7CisgICAgICAgIG1TdGF0dXMxLnNldFRleHQoc3RyaW5nSWQpOworICAgICAgICBtU3RhdHVzMS5zZXRDb21wb3VuZERyYXdhYmxlc1dpdGhJbnRyaW5zaWNCb3VuZHMoUi5kcmF3YWJsZS5pY19sb2NrX2lkbGVfbG9jaywgMCwgMCwgMCk7CisgICAgICAgIG1TdGF0dXMxLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICB9CisKKyAgICB2b2lkIHNldEluc3RydWN0aW9uVGV4dChTdHJpbmcgc3RyaW5nKSB7CisgICAgICAgIG1TdGF0dXMxLnNldFRleHQoc3RyaW5nKTsKKyAgICAgICAgbVN0YXR1czEuc2V0Q29tcG91bmREcmF3YWJsZXNXaXRoSW50cmluc2ljQm91bmRzKFIuZHJhd2FibGUuaWNfbG9ja19pZGxlX2xvY2ssIDAsIDAsIDApOworICAgICAgICBtU3RhdHVzMS5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgfQorCisgICAgdm9pZCBzZXRDYXJyaWVyVGV4dChpbnQgc3RyaW5nSWQpIHsKKyAgICAgICAgbUNhcnJpZXIuc2V0VGV4dChzdHJpbmdJZCk7CisgICAgfQorICAgIHZvaWQgc2V0Q2FycmllclRleHQoU3RyaW5nIHN0cmluZykgeworICAgICAgICBtQ2Fycmllci5zZXRUZXh0KHN0cmluZyk7CisgICAgfQorCisgICAgLyoqIE9yaWdpbmF0ZWQgZnJvbSBQYXR0ZXJuVW5sb2NrU2NyZWVuICoqLworICAgIHZvaWQgdXBkYXRlU3RhdHVzTGluZXMoKSB7CisgICAgICAgIGlmIChtSGFzUHJvcGVydHkpIHsKKyAgICAgICAgICAgIC8vIFRPRE8gR2V0IGFjdHVhbCBuYW1lICYgZW1haWwKKyAgICAgICAgICAgIFN0cmluZyBuYW1lID0gIkpvaG4gU21pdGgiOworICAgICAgICAgICAgU3RyaW5nIGVtYWlsID0gImpzbWl0aEBnbWFpbC5jb20iOworICAgICAgICAgICAgbVByb3BlcnR5T2Yuc2V0VGV4dCgiUHJvcGVydHkgb2Y6XG4iICsgbmFtZSArICJcbiIgKyBlbWFpbCk7CisgICAgICAgICAgICBtUHJvcGVydHlPZi5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIW1IYXNTdGF0dXMyKSByZXR1cm47CisKKyAgICAgICAgaWYgKG1JbnN0cnVjdGlvbnMgIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gaW5zdHJ1Y3Rpb25zIG9ubHkKKyAgICAgICAgICAgIG1TdGF0dXMxLnNldFRleHQobUluc3RydWN0aW9ucyk7CisgICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkobUluc3RydWN0aW9ucykpIHsKKyAgICAgICAgICAgICAgICBtU3RhdHVzMS5zZXRDb21wb3VuZERyYXdhYmxlc1dpdGhJbnRyaW5zaWNCb3VuZHMoMCwgMCwgMCwgMCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1TdGF0dXMxLnNldENvbXBvdW5kRHJhd2FibGVzV2l0aEludHJpbnNpY0JvdW5kcygKKyAgICAgICAgICAgICAgICAgICAgICAgIFIuZHJhd2FibGUuaWNfbG9ja19pZGxlX2xvY2ssIDAsIDAsIDApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtU3RhdHVzMS5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgICAgICBtU3RhdHVzMi5zZXRWaXNpYmlsaXR5KFZpZXcuSU5WSVNJQkxFKTsKKyAgICAgICAgfSBlbHNlIGlmIChtU2hvd2luZ0JhdHRlcnlJbmZvICYmIG1OZXh0QWxhcm0gPT0gbnVsbCkgeworICAgICAgICAgICAgLy8gYmF0dGVyeSBvbmx5CisgICAgICAgICAgICBpZiAobVBsdWdnZWRJbikgeworICAgICAgICAgICAgICBpZiAobUJhdHRlcnlMZXZlbCA+PSAxMDApIHsKKyAgICAgICAgICAgICAgICBtU3RhdHVzMS5zZXRUZXh0KGdldENvbnRleHQoKS5nZXRTdHJpbmcoUi5zdHJpbmcubG9ja3NjcmVlbl9jaGFyZ2VkKSk7CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICBtU3RhdHVzMS5zZXRUZXh0KGdldENvbnRleHQoKS5nZXRTdHJpbmcoUi5zdHJpbmcubG9ja3NjcmVlbl9wbHVnZ2VkX2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtQmF0dGVyeUxldmVsKSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbVN0YXR1czEuc2V0VGV4dChnZXRDb250ZXh0KCkuZ2V0U3RyaW5nKFIuc3RyaW5nLmxvY2tzY3JlZW5fbG93X2JhdHRlcnkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1TdGF0dXMxLnNldENvbXBvdW5kRHJhd2FibGVzV2l0aEludHJpbnNpY0JvdW5kcyhSLmRyYXdhYmxlLmljX2xvY2tfaWRsZV9jaGFyZ2luZywgMCwKKyAgICAgICAgICAgICAgICAgICAgMCwgMCk7CisKKyAgICAgICAgICAgIG1TdGF0dXMxLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgICAgIG1TdGF0dXMyLnNldFZpc2liaWxpdHkoVmlldy5JTlZJU0lCTEUpOworCisgICAgICAgIH0gZWxzZSBpZiAobU5leHRBbGFybSAhPSBudWxsICYmICFtU2hvd2luZ0JhdHRlcnlJbmZvKSB7CisgICAgICAgICAgICAvLyBhbGFybSBvbmx5CisgICAgICAgICAgICBtU3RhdHVzMS5zZXRUZXh0KG1OZXh0QWxhcm0pOworICAgICAgICAgICAgbVN0YXR1czEuc2V0Q29tcG91bmREcmF3YWJsZXNXaXRoSW50cmluc2ljQm91bmRzKFIuZHJhd2FibGUuaWNfbG9ja19pZGxlX2FsYXJtLCAwLAorICAgICAgICAgICAgICAgICAgICAwLCAwKTsKKworICAgICAgICAgICAgbVN0YXR1czEuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICAgICAgbVN0YXR1czIuc2V0VmlzaWJpbGl0eShWaWV3LklOVklTSUJMRSk7CisgICAgICAgIH0gZWxzZSBpZiAobU5leHRBbGFybSAhPSBudWxsICYmIG1TaG93aW5nQmF0dGVyeUluZm8pIHsKKyAgICAgICAgICAgIC8vIGJvdGggYmF0dGVyeSBhbmQgbmV4dCBhbGFybQorICAgICAgICAgICAgbVN0YXR1czEuc2V0VGV4dChtTmV4dEFsYXJtKTsKKyAgICAgICAgICAgIG1TdGF0dXMyLnNldFRleHQoZ2V0Q29udGV4dCgpLmdldFN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgUi5zdHJpbmcubG9ja3NjcmVlbl9iYXR0ZXJ5X3Nob3J0LAorICAgICAgICAgICAgICAgICAgICBNYXRoLm1pbigxMDAsIG1CYXR0ZXJ5TGV2ZWwpKSk7CisgICAgICAgICAgICBtU3RhdHVzMS5zZXRDb21wb3VuZERyYXdhYmxlc1dpdGhJbnRyaW5zaWNCb3VuZHMoUi5kcmF3YWJsZS5pY19sb2NrX2lkbGVfYWxhcm0sIDAsCisgICAgICAgICAgICAgICAgICAgIDAsIDApOworICAgICAgICAgICAgaWYgKG1QbHVnZ2VkSW4pIHsKKyAgICAgICAgICAgICAgICBtU3RhdHVzMi5zZXRDb21wb3VuZERyYXdhYmxlc1dpdGhJbnRyaW5zaWNCb3VuZHMoUi5kcmF3YWJsZS5pY19sb2NrX2lkbGVfY2hhcmdpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAwKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbVN0YXR1czIuc2V0Q29tcG91bmREcmF3YWJsZXNXaXRoSW50cmluc2ljQm91bmRzKDAsIDAsIDAsIDApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtU3RhdHVzMS5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgICAgICBtU3RhdHVzMi5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBub3RoaW5nIHNwZWNpZmljIHRvIHNob3c7IHNob3cgZ2VuZXJhbCBpbnN0cnVjdGlvbnMKKyAgICAgICAgICAgIG1TdGF0dXMxLnNldFRleHQoUi5zdHJpbmcubG9ja3NjcmVlbl9wYXR0ZXJuX2luc3RydWN0aW9ucyk7CisgICAgICAgICAgICBtU3RhdHVzMS5zZXRDb21wb3VuZERyYXdhYmxlc1dpdGhJbnRyaW5zaWNCb3VuZHMoUi5kcmF3YWJsZS5pY19sb2NrX2lkbGVfbG9jaywgMCwKKyAgICAgICAgICAgICAgICAgICAgMCwgMCk7CisKKyAgICAgICAgICAgIG1TdGF0dXMxLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgICAgIG1TdGF0dXMyLnNldFZpc2liaWxpdHkoVmlldy5JTlZJU0lCTEUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqIE9yaWdpbmF0ZWQgZnJvbSBMb2NrU2NyZWVuICoqLworICAgIC8vIFRPRE8gTWVyZ2Ugd2l0aCBmdW5jdGlvbiBhYm92ZQorICAgIHZvaWQgdXBkYXRlU3RhdHVzTGluZXMoYm9vbGVhbiBzaG93U3RhdHVzTGluZXMsIFN0cmluZyBjaGFyZ2luZywgRHJhd2FibGUgY2hhcmdpbmdJY29uLAorICAgICAgICAgICAgRHJhd2FibGUgYWxhcm1JY29uKSB7CisgICAgICAgIGlmICghc2hvd1N0YXR1c0xpbmVzIHx8IChjaGFyZ2luZyA9PSBudWxsICYmIG1OZXh0QWxhcm0gPT0gbnVsbCkpIHsKKyAgICAgICAgICAgIG1TdGF0dXMxLnNldFZpc2liaWxpdHkoVmlldy5JTlZJU0lCTEUpOworICAgICAgICAgICAgbVN0YXR1czIuc2V0VmlzaWJpbGl0eShWaWV3LklOVklTSUJMRSk7CisgICAgICAgIH0gZWxzZSBpZiAoY2hhcmdpbmcgIT0gbnVsbCAmJiBtTmV4dEFsYXJtID09IG51bGwpIHsKKyAgICAgICAgICAgIC8vIGNoYXJnaW5nIG9ubHkKKyAgICAgICAgICAgIG1TdGF0dXMxLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgICAgIG1TdGF0dXMyLnNldFZpc2liaWxpdHkoVmlldy5JTlZJU0lCTEUpOworCisgICAgICAgICAgICBtU3RhdHVzMS5zZXRUZXh0KGNoYXJnaW5nKTsKKyAgICAgICAgICAgIG1TdGF0dXMxLnNldENvbXBvdW5kRHJhd2FibGVzV2l0aEludHJpbnNpY0JvdW5kcyhjaGFyZ2luZ0ljb24sIG51bGwsIG51bGwsIG51bGwpOworICAgICAgICB9IGVsc2UgaWYgKG1OZXh0QWxhcm0gIT0gbnVsbCAmJiBjaGFyZ2luZyA9PSBudWxsKSB7CisgICAgICAgICAgICAvLyBuZXh0IGFsYXJtIG9ubHkKKyAgICAgICAgICAgIG1TdGF0dXMxLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgICAgIG1TdGF0dXMyLnNldFZpc2liaWxpdHkoVmlldy5JTlZJU0lCTEUpOworCisgICAgICAgICAgICBtU3RhdHVzMS5zZXRUZXh0KG1OZXh0QWxhcm0pOworICAgICAgICAgICAgbVN0YXR1czEuc2V0Q29tcG91bmREcmF3YWJsZXNXaXRoSW50cmluc2ljQm91bmRzKGFsYXJtSWNvbiwgbnVsbCwgbnVsbCwgbnVsbCk7CisgICAgICAgIH0gZWxzZSBpZiAoY2hhcmdpbmcgIT0gbnVsbCAmJiBtTmV4dEFsYXJtICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIGJvdGggY2hhcmdpbmcgYW5kIG5leHQgYWxhcm0KKyAgICAgICAgICAgIG1TdGF0dXMxLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgICAgIG1TdGF0dXMyLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKworICAgICAgICAgICAgbVN0YXR1czEuc2V0VGV4dChjaGFyZ2luZyk7CisgICAgICAgICAgICBtU3RhdHVzMS5zZXRDb21wb3VuZERyYXdhYmxlc1dpdGhJbnRyaW5zaWNCb3VuZHMoY2hhcmdpbmdJY29uLCBudWxsLCBudWxsLCBudWxsKTsKKyAgICAgICAgICAgIG1TdGF0dXMyLnNldFRleHQobU5leHRBbGFybSk7CisgICAgICAgICAgICBtU3RhdHVzMi5zZXRDb21wb3VuZERyYXdhYmxlc1dpdGhJbnRyaW5zaWNCb3VuZHMoYWxhcm1JY29uLCBudWxsLCBudWxsLCBudWxsKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgcmVmcmVzaFRpbWVBbmREYXRlRGlzcGxheSgpIHsKKyAgICAgICAgaWYgKG1IYXNEYXRlKSB7CisgICAgICAgICAgICBtRGF0ZS5zZXRUZXh0KERhdGVGb3JtYXQuZm9ybWF0KG1EYXRlRm9ybWF0U3RyaW5nLCBuZXcgRGF0ZSgpKSk7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3ByZWxvYWRlZC1jbGFzc2VzIGIvcHJlbG9hZGVkLWNsYXNzZXMKaW5kZXggMWQ1ZmJjMDguLjMzMTcyODYgMTAwNjQ0Ci0tLSBhL3ByZWxvYWRlZC1jbGFzc2VzCisrKyBiL3ByZWxvYWRlZC1jbGFzc2VzCkBAIC0xMzgsNyArMTM4LDYgQEAKIGFuZHJvaWQuZGF0YWJhc2UuTWF0cml4Q3Vyc29yCiBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVDbG9zYWJsZQogYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlQ29tcGlsZWRTcWwKLWFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZUNvbnRlbnRIZWxwZXIKIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZUN1cnNvcgogYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2UKIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURlYnVnCkBAIC01NjMsOCArNTYyLDYgQEAKIGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3CiBhbmRyb2lkLndpZGdldC5BcnJheUFkYXB0ZXIKIGFuZHJvaWQud2lkZ2V0LkF1dG9Db21wbGV0ZVRleHRWaWV3Ci1hbmRyb2lkLndpZGdldC5BdXRvQ29tcGxldGVUZXh0VmlldyREcm9wRG93bkl0ZW1DbGlja0xpc3RlbmVyCi1hbmRyb2lkLndpZGdldC5BdXRvQ29tcGxldGVUZXh0VmlldyREcm9wRG93bkxpc3RWaWV3CiBhbmRyb2lkLndpZGdldC5CYXNlQWRhcHRlcgogYW5kcm9pZC53aWRnZXQuQmFzZUV4cGFuZGFibGVMaXN0QWRhcHRlcgogYW5kcm9pZC53aWRnZXQuQ2hlY2tCb3gKQEAgLTU4Miw2ICs1NzksNyBAQAogYW5kcm9pZC53aWRnZXQuSW1hZ2VWaWV3CiBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXckU2NhbGVUeXBlCiBhbmRyb2lkLndpZGdldC5MaW5lYXJMYXlvdXQKK2FuZHJvaWQud2lkZ2V0Lkxpc3RQb3B1cFdpbmRvdwogYW5kcm9pZC53aWRnZXQuTGlzdFZpZXcKIGFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3JFNhdmVkU3RhdGUKIGFuZHJvaWQud2lkZ2V0Lk1lZGlhQ29udHJvbGxlcgpAQCAtNjg1LDcgKzY4Myw2IEBACiBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuTWVudUJ1aWxkZXIKIGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5NZW51SXRlbUltcGwKIGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5TdWJNZW51QnVpbGRlcgotY29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0LkNvbnRhY3RIZWFkZXJXaWRnZXQKIGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5EaWFsb2dUaXRsZQogY29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0LkVkaXRhYmxlSW5wdXRDb25uZWN0aW9uCiBjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuTGluZWFyTGF5b3V0V2l0aERlZmF1bHRUb3VjaFJlY2VwaWVudApAQCAtNzI3LDcgKzcyNCw2IEBACiBqYXZhLmlvLkZpbGUKIGphdmEuaW8uRmlsZURlc2NyaXB0b3IKIGphdmEuaW8uRmlsZUlucHV0U3RyZWFtCi1qYXZhLmlvLkZpbGVJbnB1dFN0cmVhbSRSZXBvc2l0aW9uaW5nTG9jawogamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb24KIGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbQogamF2YS5pby5GaWx0ZXJJbnB1dFN0cmVhbQpAQCAtMTEzMSw3ICsxMTI3LDYgQEAKIG9yZy5hcGFjaGUuaGFybW9ueS5uaW8uRmlsZUNoYW5uZWxGYWN0b3J5CiBvcmcuYXBhY2hlLmhhcm1vbnkubmlvLmludGVybmFsLkRpcmVjdEJ1ZmZlcgogb3JnLmFwYWNoZS5oYXJtb255Lm5pby5pbnRlcm5hbC5GaWxlQ2hhbm5lbEltcGwKLW9yZy5hcGFjaGUuaGFybW9ueS5uaW8uaW50ZXJuYWwuRmlsZUNoYW5uZWxJbXBsJFJlcG9zaXRpb25pbmdMb2NrCiBvcmcuYXBhY2hlLmhhcm1vbnkubmlvLmludGVybmFsLkZpbGVMb2NrSW1wbAogb3JnLmFwYWNoZS5oYXJtb255Lm5pby5pbnRlcm5hbC5Mb2NrTWFuYWdlcgogb3JnLmFwYWNoZS5oYXJtb255Lm5pby5pbnRlcm5hbC5Mb2NrTWFuYWdlciQxCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9Qb2xpY3lNYW5hZ2VyQmFzZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9Qb2xpY3lNYW5hZ2VyQmFzZS5jcHAKaW5kZXggMWQ4N2MwZC4uNDYxNGM4ZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUG9saWN5TWFuYWdlckJhc2UuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1BvbGljeU1hbmFnZXJCYXNlLmNwcApAQCAtMTAwMiw4ICsxMDAyLDggQEAKICNpZmRlZiBBVURJT19QT0xJQ1lfVEVTVAogICAgIFRocmVhZChmYWxzZSksCiAjZW5kaWYgLy9BVURJT19QT0xJQ1lfVEVTVAotICAgIG1QaG9uZVN0YXRlKEF1ZGlvU3lzdGVtOjpNT0RFX05PUk1BTCksIG1SaW5nZXJNb2RlKDApLCBtTXVzaWNTdG9wVGltZSgwKSwKLSAgICBtTGltaXRSaW5ndG9uZVZvbHVtZShmYWxzZSksIG1Ub3RhbEVmZmVjdHNDcHVMb2FkKDApLCBtVG90YWxFZmZlY3RzTWVtb3J5KDApCisgICAgbVBob25lU3RhdGUoQXVkaW9TeXN0ZW06Ok1PREVfTk9STUFMKSwgbVJpbmdlck1vZGUoMCksIG1NdXNpY1N0b3BUaW1lKDApLCBtTGltaXRSaW5ndG9uZVZvbHVtZShmYWxzZSksCisgICAgbUxhc3RWb2ljZVZvbHVtZSgtMS4wZiksIG1Ub3RhbEVmZmVjdHNDcHVMb2FkKDApLCBtVG90YWxFZmZlY3RzTWVtb3J5KDApCiB7CiAgICAgbXBDbGllbnRJbnRlcmZhY2UgPSBjbGllbnRJbnRlcmZhY2U7CiAKQEAgLTE4MjksMjkgKzE4MjksMzggQEAKICAgICB9CiAKICAgICBmbG9hdCB2b2x1bWUgPSBjb21wdXRlVm9sdW1lKHN0cmVhbSwgaW5kZXgsIG91dHB1dCwgZGV2aWNlKTsKLSAgICAvLyBkbyBub3Qgc2V0IHZvbHVtZSBpZiB0aGUgZmxvYXQgdmFsdWUgZGlkIG5vdCBjaGFuZ2UKLSAgICBpZiAodm9sdW1lICE9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dCktPm1DdXJWb2x1bWVbc3RyZWFtXSB8fCBmb3JjZSkgeworICAgIC8vIFdlIGFjdHVhbGx5IGNoYW5nZSB0aGUgdm9sdW1lIGlmOgorICAgIC8vIC0gdGhlIGZsb2F0IHZhbHVlIHJldHVybmVkIGJ5IGNvbXB1dGVWb2x1bWUoKSBjaGFuZ2VkCisgICAgLy8gLSB0aGUgZm9yY2UgZmxhZyBpcyBzZXQKKyAgICBpZiAodm9sdW1lICE9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dCktPm1DdXJWb2x1bWVbc3RyZWFtXSB8fAorICAgICAgICAgICAgZm9yY2UpIHsKICAgICAgICAgbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0KS0+bUN1clZvbHVtZVtzdHJlYW1dID0gdm9sdW1lOwogICAgICAgICBMT0dWKCJzZXRTdHJlYW1Wb2x1bWUoKSBmb3Igb3V0cHV0ICVkIHN0cmVhbSAlZCwgdm9sdW1lICVmLCBkZWxheSAlZCIsIG91dHB1dCwgc3RyZWFtLCB2b2x1bWUsIGRlbGF5TXMpOwogICAgICAgICBpZiAoc3RyZWFtID09IEF1ZGlvU3lzdGVtOjpWT0lDRV9DQUxMIHx8CiAgICAgICAgICAgICBzdHJlYW0gPT0gQXVkaW9TeXN0ZW06OkRUTUYgfHwKICAgICAgICAgICAgIHN0cmVhbSA9PSBBdWRpb1N5c3RlbTo6QkxVRVRPT1RIX1NDTykgewotICAgICAgICAgICAgZmxvYXQgdm9pY2VWb2x1bWUgPSAtMS4wOwogICAgICAgICAgICAgLy8gb2Zmc2V0IHZhbHVlIHRvIHJlZmxlY3QgYWN0dWFsIGhhcmR3YXJlIHZvbHVtZSB0aGF0IG5ldmVyIHJlYWNoZXMgMAogICAgICAgICAgICAgLy8gMSUgY29ycmVzcG9uZHMgcm91Z2hseSB0byBmaXJzdCBzdGVwIGluIFZPSUNFX0NBTEwgc3RyZWFtIHZvbHVtZSBzZXR0aW5nIChzZWUgQXVkaW9TZXJ2aWNlLmphdmEpCiAgICAgICAgICAgICB2b2x1bWUgPSAwLjAxICsgMC45OSAqIHZvbHVtZTsKLSAgICAgICAgICAgIGlmIChzdHJlYW0gPT0gQXVkaW9TeXN0ZW06OlZPSUNFX0NBTEwpIHsKLSAgICAgICAgICAgICAgICB2b2ljZVZvbHVtZSA9IChmbG9hdClpbmRleC8oZmxvYXQpbVN0cmVhbXNbc3RyZWFtXS5tSW5kZXhNYXg7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHN0cmVhbSA9PSBBdWRpb1N5c3RlbTo6QkxVRVRPT1RIX1NDTykgewotICAgICAgICAgICAgICAgIHZvaWNlVm9sdW1lID0gMS4wOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHZvaWNlVm9sdW1lID49IDAgJiYgb3V0cHV0ID09IG1IYXJkd2FyZU91dHB1dCkgewotICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zZXRWb2ljZVZvbHVtZSh2b2ljZVZvbHVtZSwgZGVsYXlNcyk7Ci0gICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFN0cmVhbVZvbHVtZSgoQXVkaW9TeXN0ZW06OnN0cmVhbV90eXBlKXN0cmVhbSwgdm9sdW1lLCBvdXRwdXQsIGRlbGF5TXMpOwogICAgIH0KIAorICAgIGlmIChzdHJlYW0gPT0gQXVkaW9TeXN0ZW06OlZPSUNFX0NBTEwgfHwKKyAgICAgICAgc3RyZWFtID09IEF1ZGlvU3lzdGVtOjpCTFVFVE9PVEhfU0NPKSB7CisgICAgICAgIGZsb2F0IHZvaWNlVm9sdW1lOworICAgICAgICAvLyBGb3JjZSB2b2ljZSB2b2x1bWUgdG8gbWF4IGZvciBibHVldG9vdGggU0NPIGFzIHZvbHVtZSBpcyBtYW5hZ2VkIGJ5IHRoZSBoZWFkc2V0CisgICAgICAgIGlmIChzdHJlYW0gPT0gQXVkaW9TeXN0ZW06OlZPSUNFX0NBTEwpIHsKKyAgICAgICAgICAgIHZvaWNlVm9sdW1lID0gKGZsb2F0KWluZGV4LyhmbG9hdCltU3RyZWFtc1tzdHJlYW1dLm1JbmRleE1heDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHZvaWNlVm9sdW1lID0gMS4wOworICAgICAgICB9CisgICAgICAgIGlmICh2b2ljZVZvbHVtZSAhPSBtTGFzdFZvaWNlVm9sdW1lICYmIG91dHB1dCA9PSBtSGFyZHdhcmVPdXRwdXQpIHsKKyAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zZXRWb2ljZVZvbHVtZSh2b2ljZVZvbHVtZSwgZGVsYXlNcyk7CisgICAgICAgICAgICBtTGFzdFZvaWNlVm9sdW1lID0gdm9pY2VWb2x1bWU7CisgICAgICAgIH0KKyAgICB9CisKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYUhhcmR3YXJlU3R1Yi5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFIYXJkd2FyZVN0dWIuY3BwCmluZGV4IGIzZTBlZTYuLjA3YjVhMzcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYUhhcmR3YXJlU3R1Yi5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhSGFyZHdhcmVTdHViLmNwcApAQCAtMTAxLDkgKzEwMSw5IEBACiAgICAgbUZha2VDYW1lcmEgPSAwOyAvLyBwYXJhbm9pYQogfQogCi1zcDxJTWVtb3J5SGVhcD4gQ2FtZXJhSGFyZHdhcmVTdHViOjpnZXRQcmV2aWV3SGVhcCgpIGNvbnN0CitzdGF0dXNfdCBDYW1lcmFIYXJkd2FyZVN0dWI6OnNldFByZXZpZXdXaW5kb3coY29uc3Qgc3A8QU5hdGl2ZVdpbmRvdz4mIGJ1ZikKIHsKLSAgICByZXR1cm4gbVByZXZpZXdIZWFwOworICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAogc3A8SU1lbW9yeUhlYXA+IENhbWVyYUhhcmR3YXJlU3R1Yjo6Z2V0UmF3SGVhcCgpIGNvbnN0CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFIYXJkd2FyZVN0dWIuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYUhhcmR3YXJlU3R1Yi5oCmluZGV4IGQzNDI3YmEuLjliNjZhNzYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYUhhcmR3YXJlU3R1Yi5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYUhhcmR3YXJlU3R1Yi5oCkBAIC0yOSw3ICsyOSw3IEBACiAKIGNsYXNzIENhbWVyYUhhcmR3YXJlU3R1YiA6IHB1YmxpYyBDYW1lcmFIYXJkd2FyZUludGVyZmFjZSB7CiBwdWJsaWM6Ci0gICAgdmlydHVhbCBzcDxJTWVtb3J5SGVhcD4gZ2V0UHJldmlld0hlYXAoKSBjb25zdDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFByZXZpZXdXaW5kb3coY29uc3Qgc3A8QU5hdGl2ZVdpbmRvdz4mIGJ1Zik7CiAgICAgdmlydHVhbCBzcDxJTWVtb3J5SGVhcD4gZ2V0UmF3SGVhcCgpIGNvbnN0OwogCiAgICAgdmlydHVhbCB2b2lkICAgICAgICBzZXRDYWxsYmFja3Mobm90aWZ5X2NhbGxiYWNrIG5vdGlmeV9jYiwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5jcHAKaW5kZXggZWEyYzVkNC4uYzZhOTkwOSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5jcHAKQEAgLTMzNiwxNiArMzM2LDkgQEAKICAgICBpbnQgY2FsbGluZ1BpZCA9IGdldENhbGxpbmdQaWQoKTsKICAgICBMT0cxKCJDbGllbnQ6On5DbGllbnQgRSAocGlkICVkLCB0aGlzICVwKSIsIGNhbGxpbmdQaWQsIHRoaXMpOwogCi0gICAgaWYgKG1TdXJmYWNlICE9IDAgJiYgIW1Vc2VPdmVybGF5KSB7Ci0gICAgICAgIHB0aHJlYWRfdCB0aHI7Ci0gICAgICAgIC8vIFdlIHVucmVnaXN0ZXIgdGhlIGJ1ZmZlcnMgaW4gYSBkaWZmZXJlbnQgdGhyZWFkIGJlY2F1c2UgYmluZGVyIGRvZXMKLSAgICAgICAgLy8gbm90IGxldCB1cyBtYWtlIHN5Y2hyb25vdXMgdHJhbnNhY3Rpb25zIGluIGEgYmluZGVyIGRlc3RydWN0b3IgKHRoYXQKLSAgICAgICAgLy8gaXMsIHVwb24gb3VyIHJlYWNoaW5nIGEgcmVmY291bnQgb2YgemVyby4pCi0gICAgICAgIHB0aHJlYWRfY3JlYXRlKCZ0aHIsCi0gICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICAvLyBhdHRyCi0gICAgICAgICAgICAgICAgICAgICAgIHVucmVnaXN0ZXJfc3VyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgbVN1cmZhY2UuZ2V0KCkpOwotICAgICAgICBwdGhyZWFkX2pvaW4odGhyLCBOVUxMKTsKKyAgICAvLyBDbGVhbiB1cCB0aGUgQU5hdGl2ZVdpbmRvdworICAgIGlmIChtU3VyZmFjZSAhPSAwKSB7CisgICAgICAgIHNldFByZXZpZXdEaXNwbGF5KDApOwogICAgIH0KIAogICAgIC8vIHNldCBtQ2xpZW50UGlkIHRvIGxldCBkaXNjb25uZXQoKSB0ZWFyIGRvd24gdGhlIGhhcmR3YXJlCkBAIC00NjUsNiArNDU4LDExIEBACiAgICAgaWYgKG1Vc2VPdmVybGF5KSB7CiAgICAgICAgIG1PdmVybGF5UmVmID0gMDsKICAgICB9CisgICAgLy8gUmVsZWFzZSB0aGUgaGVsZCBBTmF0aXZlV2luZG93IHJlc291cmNlcy4KKyAgICBpZiAobVByZXZpZXdXaW5kb3cgIT0gMCkgeworICAgICAgICBtUHJldmlld1dpbmRvdyA9IDA7CisgICAgICAgIG1IYXJkd2FyZS0+c2V0UHJldmlld1dpbmRvdyhtUHJldmlld1dpbmRvdyk7CisgICAgfQogICAgIG1IYXJkd2FyZS5jbGVhcigpOwogCiAgICAgbUNhbWVyYVNlcnZpY2UtPnJlbW92ZUNsaWVudChtQ2FtZXJhQ2xpZW50KTsKQEAgLTQ3NSw4ICs0NzMsOCBAQAogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLS8vIHNldCB0aGUgSVN1cmZhY2UgdGhhdCB0aGUgcHJldmlldyB3aWxsIHVzZQotc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6Q2xpZW50OjpzZXRQcmV2aWV3RGlzcGxheShjb25zdCBzcDxJU3VyZmFjZT4mIHN1cmZhY2UpIHsKKy8vIHNldCB0aGUgU3VyZmFjZSB0aGF0IHRoZSBwcmV2aWV3IHdpbGwgdXNlCitzdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpDbGllbnQ6OnNldFByZXZpZXdEaXNwbGF5KGNvbnN0IHNwPFN1cmZhY2U+JiBzdXJmYWNlKSB7CiAgICAgTE9HMSgic2V0UHJldmlld0Rpc3BsYXkoJXApIChwaWQgJWQpIiwgc3VyZmFjZS5nZXQoKSwgZ2V0Q2FsbGluZ1BpZCgpKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CiAgICAgc3RhdHVzX3QgcmVzdWx0ID0gY2hlY2tQaWRBbmRIYXJkd2FyZSgpOwpAQCAtNDg2LDcgKzQ4NCw3IEBACiAKICAgICAvLyByZXR1cm4gaWYgbm8gY2hhbmdlIGluIHN1cmZhY2UuCiAgICAgLy8gYXNCaW5kZXIoKSBpcyBzYWZlIG9uIE5VTEwgKHJldHVybnMgTlVMTCkKLSAgICBpZiAoc3VyZmFjZS0+YXNCaW5kZXIoKSA9PSBtU3VyZmFjZS0+YXNCaW5kZXIoKSkgeworICAgIGlmIChnZXRJU3VyZmFjZShzdXJmYWNlKS0+YXNCaW5kZXIoKSA9PSBtU3VyZmFjZS0+YXNCaW5kZXIoKSkgewogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KIApAQCAtNDk2LDQ0ICs0OTQsMjggQEAKICAgICAgICAgICAgIC8vIEZvcmNlIHRoZSBkZXN0cnVjdGlvbiBvZiBhbnkgcHJldmlvdXMgb3ZlcmxheQogICAgICAgICAgICAgc3A8T3ZlcmxheT4gZHVtbXk7CiAgICAgICAgICAgICBtSGFyZHdhcmUtPnNldE92ZXJsYXkoZHVtbXkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbVN1cmZhY2UtPnVucmVnaXN0ZXJCdWZmZXJzKCk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgbVN1cmZhY2UgPSBzdXJmYWNlOworICAgIGlmIChzdXJmYWNlICE9IDApIHsKKyAgICAgICAgbVN1cmZhY2UgPSBnZXRJU3VyZmFjZShzdXJmYWNlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtU3VyZmFjZSA9IDA7CisgICAgfQorICAgIG1QcmV2aWV3V2luZG93ID0gc3VyZmFjZTsKICAgICBtT3ZlcmxheVJlZiA9IDA7CiAgICAgLy8gSWYgcHJldmlldyBoYXMgYmVlbiBhbHJlYWR5IHN0YXJ0ZWQsIHNldCBvdmVybGF5IG9yIHJlZ2lzdGVyIHByZXZpZXcKICAgICAvLyBidWZmZXJzIG5vdy4KICAgICBpZiAobUhhcmR3YXJlLT5wcmV2aWV3RW5hYmxlZCgpKSB7CiAgICAgICAgIGlmIChtVXNlT3ZlcmxheSkgewogICAgICAgICAgICAgcmVzdWx0ID0gc2V0T3ZlcmxheSgpOwotICAgICAgICB9IGVsc2UgaWYgKG1TdXJmYWNlICE9IDApIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IHJlZ2lzdGVyUHJldmlld0J1ZmZlcnMoKTsKKyAgICAgICAgfSBlbHNlIGlmIChtUHJldmlld1dpbmRvdyAhPSAwKSB7CisgICAgICAgICAgICByZXN1bHQgPSBtSGFyZHdhcmUtPnNldFByZXZpZXdXaW5kb3cobVByZXZpZXdXaW5kb3cpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAotc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6Q2xpZW50OjpyZWdpc3RlclByZXZpZXdCdWZmZXJzKCkgewotICAgIGludCB3LCBoOwotICAgIENhbWVyYVBhcmFtZXRlcnMgcGFyYW1zKG1IYXJkd2FyZS0+Z2V0UGFyYW1ldGVycygpKTsKLSAgICBwYXJhbXMuZ2V0UHJldmlld1NpemUoJncsICZoKTsKLQotICAgIC8vIEZJWE1FOiBkb24ndCB1c2UgYSBoYXJkY29kZWQgZm9ybWF0IGhlcmUuCi0gICAgSVN1cmZhY2U6OkJ1ZmZlckhlYXAgYnVmZmVycyh3LCBoLCB3LCBoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9ZQ3JDYl80MjBfU1AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtT3JpZW50YXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUhhcmR3YXJlLT5nZXRQcmV2aWV3SGVhcCgpKTsKLQotICAgIHN0YXR1c190IHJlc3VsdCA9IG1TdXJmYWNlLT5yZWdpc3RlckJ1ZmZlcnMoYnVmZmVycyk7Ci0gICAgaWYgKHJlc3VsdCAhPSBOT19FUlJPUikgewotICAgICAgICBMT0dFKCJyZWdpc3RlckJ1ZmZlcnMgZmFpbGVkIHdpdGggc3RhdHVzICVkIiwgcmVzdWx0KTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQogc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6Q2xpZW50OjpzZXRPdmVybGF5KCkgewogICAgIGludCB3LCBoOwogICAgIENhbWVyYVBhcmFtZXRlcnMgcGFyYW1zKG1IYXJkd2FyZS0+Z2V0UGFyYW1ldGVycygpKTsKQEAgLTYyNCwxNCArNjA2LDE0IEBACiAKICAgICBzd2l0Y2gobW9kZSkgewogICAgICAgICBjYXNlIENBTUVSQV9QUkVWSUVXX01PREU6Ci0gICAgICAgICAgICBpZiAobVN1cmZhY2UgPT0gMCkgeworICAgICAgICAgICAgaWYgKG1TdXJmYWNlID09IDAgJiYgbVByZXZpZXdXaW5kb3cgPT0gMCkgewogICAgICAgICAgICAgICAgIExPRzEoIm1TdXJmYWNlIGlzIG5vdCBzZXQgeWV0LiIpOwogICAgICAgICAgICAgICAgIC8vIHN0aWxsIGFibGUgdG8gc3RhcnQgcHJldmlldyBpbiB0aGlzIGNhc2UuCiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gc3RhcnRQcmV2aWV3TW9kZSgpOwogICAgICAgICBjYXNlIENBTUVSQV9SRUNPUkRJTkdfTU9ERToKLSAgICAgICAgICAgIGlmIChtU3VyZmFjZSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgTE9HRSgibVN1cmZhY2UgbXVzdCBiZSBzZXQgYmVmb3JlIHN0YXJ0UmVjb3JkaW5nTW9kZS4iKTsKKyAgICAgICAgICAgIGlmIChtU3VyZmFjZSA9PSAwICYmIG1QcmV2aWV3V2luZG93ID09IDApIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJtU3VyZmFjZSBvciBtUHJldmlld1dpbmRvdyBtdXN0IGJlIHNldCBiZWZvcmUgc3RhcnRSZWNvcmRpbmdNb2RlLiIpOwogICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBzdGFydFJlY29yZGluZ01vZGUoKTsKQEAgLTY1NywxNiArNjM5LDEwIEBACiAgICAgICAgIGlmIChyZXN1bHQgIT0gTk9fRVJST1IpIHJldHVybiByZXN1bHQ7CiAgICAgICAgIHJlc3VsdCA9IG1IYXJkd2FyZS0+c3RhcnRQcmV2aWV3KCk7CiAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gWFhYOiBTZXQgdGhlIG9yaWVudGF0aW9uIG9mIHRoZSBBTmF0aXZlV2luZG93LgorICAgICAgICBtSGFyZHdhcmUtPnNldFByZXZpZXdXaW5kb3cobVByZXZpZXdXaW5kb3cpOwogICAgICAgICBlbmFibGVNc2dUeXBlKENBTUVSQV9NU0dfUFJFVklFV19GUkFNRSk7CiAgICAgICAgIHJlc3VsdCA9IG1IYXJkd2FyZS0+c3RhcnRQcmV2aWV3KCk7Ci0gICAgICAgIGlmIChyZXN1bHQgIT0gTk9fRVJST1IpIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIC8vIElmIHByZXZpZXcgZGlzcGxheSBoYXMgYmVlbiBzZXQsIHJlZ2lzdGVyIHByZXZpZXcgYnVmZmVycyBub3cuCi0gICAgICAgIGlmIChtU3VyZmFjZSAhPSAwKSB7Ci0gICAgICAgICAgIC8vIFVucmVnaXN0ZXIgaGVyZSBiZWNhdXNlIHRoZSBzdXJmYWNlIG1heSBiZSBwcmV2aW91c2x5IHJlZ2lzdGVyZWQKLSAgICAgICAgICAgLy8gd2l0aCB0aGUgcmF3IChzbmFwc2hvdCkgaGVhcC4KLSAgICAgICAgICAgbVN1cmZhY2UtPnVucmVnaXN0ZXJCdWZmZXJzKCk7Ci0gICAgICAgICAgIHJlc3VsdCA9IHJlZ2lzdGVyUHJldmlld0J1ZmZlcnMoKTsKLSAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gcmVzdWx0OwogfQpAQCAtNzA0LDEzICs2ODAsMTAgQEAKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CiAgICAgaWYgKGNoZWNrUGlkQW5kSGFyZHdhcmUoKSAhPSBOT19FUlJPUikgcmV0dXJuOwogCisKICAgICBkaXNhYmxlTXNnVHlwZShDQU1FUkFfTVNHX1BSRVZJRVdfRlJBTUUpOwogICAgIG1IYXJkd2FyZS0+c3RvcFByZXZpZXcoKTsKIAotICAgIGlmIChtU3VyZmFjZSAhPSAwICYmICFtVXNlT3ZlcmxheSkgewotICAgICAgICBtU3VyZmFjZS0+dW5yZWdpc3RlckJ1ZmZlcnMoKTsKLSAgICB9Ci0KICAgICBtUHJldmlld0J1ZmZlci5jbGVhcigpOwogfQogCkBAIC05OTgsMTEgKzk3MSw2IEBACiB2b2lkIENhbWVyYVNlcnZpY2U6OkNsaWVudDo6aGFuZGxlU2h1dHRlcihpbWFnZV9yZWN0X3R5cGUgKnNpemUpIHsKICAgICBtQ2FtZXJhU2VydmljZS0+cGxheVNvdW5kKFNPVU5EX1NIVVRURVIpOwogCi0gICAgLy8gU2NyZWVuIGdvZXMgYmxhY2sgYWZ0ZXIgdGhlIGJ1ZmZlciBpcyB1bnJlZ2lzdGVyZWQuCi0gICAgaWYgKG1TdXJmYWNlICE9IDAgJiYgIW1Vc2VPdmVybGF5KSB7Ci0gICAgICAgIG1TdXJmYWNlLT51bnJlZ2lzdGVyQnVmZmVycygpOwotICAgIH0KLQogICAgIHNwPElDYW1lcmFDbGllbnQ+IGMgPSBtQ2FtZXJhQ2xpZW50OwogICAgIGlmIChjICE9IDApIHsKICAgICAgICAgbUxvY2sudW5sb2NrKCk7CkBAIC0xMDMwLDcgKzk5OCw2IEBACiAgICAgICAgICAgICBIQUxfUElYRUxfRk9STUFUX1lDckNiXzQyMF9TUCwgbU9yaWVudGF0aW9uLCAwLAogICAgICAgICAgICAgbUhhcmR3YXJlLT5nZXRSYXdIZWFwKCkpOwogCi0gICAgICAgIG1TdXJmYWNlLT5yZWdpc3RlckJ1ZmZlcnMoYnVmZmVycyk7CiAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmZsdXNoQ29tbWFuZHMoKTsKICAgICB9CiAKQEAgLTEwNDMsMTIgKzEwMTAsNiBAQAogICAgIHNpemVfdCBzaXplOwogICAgIHNwPElNZW1vcnlIZWFwPiBoZWFwID0gbWVtLT5nZXRNZW1vcnkoJm9mZnNldCwgJnNpemUpOwogCi0gICAgaWYgKCFtVXNlT3ZlcmxheSkgewotICAgICAgICBpZiAobVN1cmZhY2UgIT0gMCkgewotICAgICAgICAgICAgbVN1cmZhY2UtPnBvc3RCdWZmZXIob2Zmc2V0KTsKLSAgICAgICAgfQotICAgIH0KLQogICAgIC8vIGxvY2FsIGNvcHkgb2YgdGhlIGNhbGxiYWNrIGZsYWdzCiAgICAgaW50IGZsYWdzID0gbVByZXZpZXdDYWxsYmFja0ZsYWc7CiAKQEAgLTExMDgsMTEgKzEwNjksNiBAQAogICAgIHNpemVfdCBzaXplOwogICAgIHNwPElNZW1vcnlIZWFwPiBoZWFwID0gbWVtLT5nZXRNZW1vcnkoJm9mZnNldCwgJnNpemUpOwogCi0gICAgLy8gUHV0IHRoZSBZVVYgdmVyc2lvbiBvZiB0aGUgc25hcHNob3QgaW4gdGhlIHByZXZpZXcgZGlzcGxheS4KLSAgICBpZiAobVN1cmZhY2UgIT0gMCAmJiAhbVVzZU92ZXJsYXkpIHsKLSAgICAgICAgbVN1cmZhY2UtPnBvc3RCdWZmZXIob2Zmc2V0KTsKLSAgICB9Ci0KICAgICBzcDxJQ2FtZXJhQ2xpZW50PiBjID0gbUNhbWVyYUNsaWVudDsKICAgICBtTG9jay51bmxvY2soKTsKICAgICBpZiAoYyAhPSAwKSB7CkBAIC0xMjcwLDQgKzEyMjYsMTIgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKK3NwPElTdXJmYWNlPiBDYW1lcmFTZXJ2aWNlOjpnZXRJU3VyZmFjZShjb25zdCBzcDxTdXJmYWNlPiYgc3VyZmFjZSkgeworICAgIGlmIChzdXJmYWNlICE9IDApIHsKKyAgICAgICAgcmV0dXJuIHN1cmZhY2UtPmdldElTdXJmYWNlKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIHNwPElTdXJmYWNlPigwKTsKKyAgICB9Cit9CisKIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmgKaW5kZXggMGQ2OTgzNi4uN2VkMTkyZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuaApAQCAtNzksNiArNzksMTIgQEAKICAgICBzcDxNZWRpYVBsYXllcj4gICAgIG1Tb3VuZFBsYXllcltOVU1fU09VTkRTXTsKICAgICBpbnQgICAgICAgICAgICAgICAgIG1Tb3VuZFJlZjsgIC8vIHJlZmVyZW5jZSBjb3VudCAocmVsZWFzZSBhbGwgTWVkaWFQbGF5ZXIgd2hlbiAwKQogCisgICAgLy8gVXNlZCBieSBDbGllbnQgb2JqZWN0cyB0byBleHRyYWN0IHRoZSBJU3VyZmFjZSBmcm9tIGEgU3VyZmFjZSBvYmplY3QuCisgICAgLy8gVGhpcyBpcyB1c2VkIGJlY2F1c2UgbWFraW5nIENsaWVudCBhIGZyaWVuZCBjbGFzcyBvZiBTdXJmYWNlIHdvdWxkCisgICAgLy8gcmVxdWlyZSBpbmNsdWRpbmcgdGhpcyBoZWFkZXIgaW4gU3VyZmFjZS5oIHNpbmNlIENsaWVudCBpcyBhIG5lc3RlZAorICAgIC8vIGNsYXNzLgorICAgIHN0YXRpYyBzcDxJU3VyZmFjZT4gZ2V0SVN1cmZhY2UoY29uc3Qgc3A8U3VyZmFjZT4mIHN1cmZhY2UpOworCiAgICAgY2xhc3MgQ2xpZW50IDogcHVibGljIEJuQ2FtZXJhCiAgICAgewogICAgIHB1YmxpYzoKQEAgLTg3LDcgKzkzLDcgQEAKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgY29ubmVjdChjb25zdCBzcDxJQ2FtZXJhQ2xpZW50PiYgY2xpZW50KTsKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgbG9jaygpOwogICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICB1bmxvY2soKTsKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc2V0UHJldmlld0Rpc3BsYXkoY29uc3Qgc3A8SVN1cmZhY2U+JiBzdXJmYWNlKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc2V0UHJldmlld0Rpc3BsYXkoY29uc3Qgc3A8U3VyZmFjZT4mIHN1cmZhY2UpOwogICAgICAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICBzZXRQcmV2aWV3Q2FsbGJhY2tGbGFnKGludCBmbGFnKTsKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc3RhcnRQcmV2aWV3KCk7CiAgICAgICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgIHN0b3BQcmV2aWV3KCk7CkBAIC0xNjksNiArMTc1LDcgQEAKICAgICAgICAgLy8gRW5zdXJlcyBhdG9taWNpdHkgYW1vbmcgdGhlIHB1YmxpYyBtZXRob2RzCiAgICAgICAgIG11dGFibGUgTXV0ZXggICAgICAgICAgICAgICAgICAgbUxvY2s7CiAgICAgICAgIHNwPElTdXJmYWNlPiAgICAgICAgICAgICAgICAgICAgbVN1cmZhY2U7CisgICAgICAgIHNwPEFOYXRpdmVXaW5kb3c+ICAgICAgICAgICAgICAgbVByZXZpZXdXaW5kb3c7CiAKICAgICAgICAgLy8gSWYgdGhlIHVzZXIgd2FudCB1cyB0byByZXR1cm4gYSBjb3B5IG9mIHRoZSBwcmV2aWV3IGZyYW1lIChpbnN0ZWFkCiAgICAgICAgIC8vIG9mIHRoZSBvcmlnaW5hbCBvbmUpLCB3ZSBhbGxvY2F0ZSBtUHJldmlld0J1ZmZlciBhbmQgcmV1c2UgaXQgaWYgcG9zc2libGUuCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9BY2Nlc3NpYmlsaXR5TWFuYWdlclNlcnZpY2UuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0FjY2Vzc2liaWxpdHlNYW5hZ2VyU2VydmljZS5qYXZhCmluZGV4IDg3ZGU3OWEuLjgzY2UzZTMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0FjY2Vzc2liaWxpdHlNYW5hZ2VyU2VydmljZS5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0FjY2Vzc2liaWxpdHlNYW5hZ2VyU2VydmljZS5qYXZhCkBAIC0yNjksMTQgKzI2OSwxMCBAQAogICAgICAgICAgICAgfSk7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgYWRkQ2xpZW50KElBY2Nlc3NpYmlsaXR5TWFuYWdlckNsaWVudCBjbGllbnQpIHsKKyAgICBwdWJsaWMgYm9vbGVhbiBhZGRDbGllbnQoSUFjY2Vzc2liaWxpdHlNYW5hZ2VyQ2xpZW50IGNsaWVudCkgewogICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGNsaWVudC5zZXRFbmFibGVkKG1Jc0VuYWJsZWQpOwotICAgICAgICAgICAgICAgIG1DbGllbnRzLmFkZChjbGllbnQpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIHJlKSB7Ci0gICAgICAgICAgICAgICAgU2xvZy53KExPR19UQUcsICJEZWFkIEFjY2Vzc2liaWxpdHlNYW5hZ2VyQ2xpZW50OiAiICsgY2xpZW50LCByZSk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBtQ2xpZW50cy5hZGQoY2xpZW50KTsKKyAgICAgICAgICAgIHJldHVybiBtSXNFbmFibGVkOwogICAgICAgICB9CiAgICAgfQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9BcHBXaWRnZXRTZXJ2aWNlLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9BcHBXaWRnZXRTZXJ2aWNlLmphdmEKaW5kZXggM2VkNmMxMi4uZjgyNWRmOSAxMDA2NDQKLS0tIGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvQXBwV2lkZ2V0U2VydmljZS5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0FwcFdpZGdldFNlcnZpY2UuamF2YQpAQCAtNDI1LDYgKzQyNSw0MCBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcHVibGljIHZvaWQgcGFydGlhbGx5VXBkYXRlQXBwV2lkZ2V0SWRzKGludFtdIGFwcFdpZGdldElkcywgUmVtb3RlVmlld3Mgdmlld3MpIHsKKyAgICAgICAgaWYgKGFwcFdpZGdldElkcyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKGFwcFdpZGdldElkcy5sZW5ndGggPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGZpbmFsIGludCBOID0gYXBwV2lkZ2V0SWRzLmxlbmd0aDsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKG1BcHBXaWRnZXRJZHMpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxOOyBpKyspIHsKKyAgICAgICAgICAgICAgICBBcHBXaWRnZXRJZCBpZCA9IGxvb2t1cEFwcFdpZGdldElkTG9ja2VkKGFwcFdpZGdldElkc1tpXSk7CisgICAgICAgICAgICAgICAgdXBkYXRlQXBwV2lkZ2V0SW5zdGFuY2VMb2NrZWQoaWQsIHZpZXdzLCB0cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG5vdGlmeUFwcFdpZGdldFZpZXdEYXRhQ2hhbmdlZChpbnRbXSBhcHBXaWRnZXRJZHMsIGludCB2aWV3SWQpIHsKKyAgICAgICAgaWYgKGFwcFdpZGdldElkcyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKGFwcFdpZGdldElkcy5sZW5ndGggPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGZpbmFsIGludCBOID0gYXBwV2lkZ2V0SWRzLmxlbmd0aDsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKG1BcHBXaWRnZXRJZHMpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxOOyBpKyspIHsKKyAgICAgICAgICAgICAgICBBcHBXaWRnZXRJZCBpZCA9IGxvb2t1cEFwcFdpZGdldElkTG9ja2VkKGFwcFdpZGdldElkc1tpXSk7CisgICAgICAgICAgICAgICAgbm90aWZ5QXBwV2lkZ2V0Vmlld0RhdGFDaGFuZ2VkSW5zdGFuY2VMb2NrZWQoaWQsIHZpZXdJZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKICAgICBwdWJsaWMgdm9pZCB1cGRhdGVBcHBXaWRnZXRQcm92aWRlcihDb21wb25lbnROYW1lIHByb3ZpZGVyLCBSZW1vdGVWaWV3cyB2aWV3cykgewogICAgICAgICBzeW5jaHJvbml6ZWQgKG1BcHBXaWRnZXRJZHMpIHsKICAgICAgICAgICAgIFByb3ZpZGVyIHAgPSBsb29rdXBQcm92aWRlckxvY2tlZChwcm92aWRlcik7CkBAIC00NDIsMTEgKzQ3NiwxNyBAQAogICAgIH0KIAogICAgIHZvaWQgdXBkYXRlQXBwV2lkZ2V0SW5zdGFuY2VMb2NrZWQoQXBwV2lkZ2V0SWQgaWQsIFJlbW90ZVZpZXdzIHZpZXdzKSB7CisgICAgICAgIHVwZGF0ZUFwcFdpZGdldEluc3RhbmNlTG9ja2VkKGlkLCB2aWV3cywgZmFsc2UpOworICAgIH0KKworICAgIHZvaWQgdXBkYXRlQXBwV2lkZ2V0SW5zdGFuY2VMb2NrZWQoQXBwV2lkZ2V0SWQgaWQsIFJlbW90ZVZpZXdzIHZpZXdzLCBib29sZWFuIGlzUGFydGlhbFVwZGF0ZSkgewogICAgICAgICAvLyBhbGxvdyBmb3Igc3RhbGUgYXBwV2lkZ2V0SWRzIGFuZCBvdGhlciBiYWRuZXNzCiAgICAgICAgIC8vIGxvb2t1cCBhbHNvIGNoZWNrcyB0aGF0IHRoZSBjYWxsaW5nIHByb2Nlc3MgY2FuIGFjY2VzcyB0aGUgYXBwV2lkZ2V0SWQKICAgICAgICAgLy8gZHJvcCB1bmJvdW5kIGFwcFdpZGdldElkcyAoc2hvdWxkbid0IGJlIHBvc3NpYmxlIHVuZGVyIG5vcm1hbCBjaXJjdW1zdGFuY2VzKQogICAgICAgICBpZiAoaWQgIT0gbnVsbCAmJiBpZC5wcm92aWRlciAhPSBudWxsICYmICFpZC5wcm92aWRlci56b21iaWUgJiYgIWlkLmhvc3Quem9tYmllKSB7Ci0gICAgICAgICAgICBpZC52aWV3cyA9IHZpZXdzOworCisgICAgICAgICAgICAvLyBXZSBkbyBub3Qgd2FudCB0byBzYXZlIHRoaXMgUmVtb3RlVmlld3MKKyAgICAgICAgICAgIGlmICghaXNQYXJ0aWFsVXBkYXRlKSBpZC52aWV3cyA9IHZpZXdzOwogCiAgICAgICAgICAgICAvLyBpcyBhbnlvbmUgbGlzdGVuaW5nPwogICAgICAgICAgICAgaWYgKGlkLmhvc3QuY2FsbGJhY2tzICE9IG51bGwpIHsKQEAgLTQ2Miw2ICs1MDIsMjUgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIHZvaWQgbm90aWZ5QXBwV2lkZ2V0Vmlld0RhdGFDaGFuZ2VkSW5zdGFuY2VMb2NrZWQoQXBwV2lkZ2V0SWQgaWQsIGludCB2aWV3SWQpIHsKKyAgICAgICAgLy8gYWxsb3cgZm9yIHN0YWxlIGFwcFdpZGdldElkcyBhbmQgb3RoZXIgYmFkbmVzcworICAgICAgICAvLyBsb29rdXAgYWxzbyBjaGVja3MgdGhhdCB0aGUgY2FsbGluZyBwcm9jZXNzIGNhbiBhY2Nlc3MgdGhlIGFwcFdpZGdldElkCisgICAgICAgIC8vIGRyb3AgdW5ib3VuZCBhcHBXaWRnZXRJZHMgKHNob3VsZG4ndCBiZSBwb3NzaWJsZSB1bmRlciBub3JtYWwgY2lyY3Vtc3RhbmNlcykKKyAgICAgICAgaWYgKGlkICE9IG51bGwgJiYgaWQucHJvdmlkZXIgIT0gbnVsbCAmJiAhaWQucHJvdmlkZXIuem9tYmllICYmICFpZC5ob3N0LnpvbWJpZSkgeworICAgICAgICAgICAgLy8gaXMgYW55b25lIGxpc3RlbmluZz8KKyAgICAgICAgICAgIGlmIChpZC5ob3N0LmNhbGxiYWNrcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGxvY2sgaXMgaGVsZCwgYnV0IHRoaXMgaXMgYSBvbmV3YXkgY2FsbAorICAgICAgICAgICAgICAgICAgICBpZC5ob3N0LmNhbGxiYWNrcy52aWV3RGF0YUNoYW5nZWQoaWQuYXBwV2lkZ2V0SWQsIHZpZXdJZCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gSXQgZmFpbGVkOyByZW1vdmUgdGhlIGNhbGxiYWNrLiBObyBuZWVkIHRvIHBydW5lIGJlY2F1c2UKKyAgICAgICAgICAgICAgICAgICAgLy8gd2Uga25vdyB0aGF0IHRoaXMgaG9zdCBpcyBzdGlsbCByZWZlcmVuY2VkIGJ5IHRoaXMgaW5zdGFuY2UuCisgICAgICAgICAgICAgICAgICAgIGlkLmhvc3QuY2FsbGJhY2tzID0gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKICAgICBwdWJsaWMgaW50W10gc3RhcnRMaXN0ZW5pbmcoSUFwcFdpZGdldEhvc3QgY2FsbGJhY2tzLCBTdHJpbmcgcGFja2FnZU5hbWUsIGludCBob3N0SWQsCiAgICAgICAgICAgICBMaXN0PFJlbW90ZVZpZXdzPiB1cGRhdGVkVmlld3MpIHsKICAgICAgICAgaW50IGNhbGxpbmdVaWQgPSBlbmZvcmNlQ2FsbGluZ1VpZChwYWNrYWdlTmFtZSk7CkBAIC03NDEsNiArODAwLDkgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGluZm8ubGFiZWwgPSBhY3Rpdml0eUluZm8ubG9hZExhYmVsKG1QYWNrYWdlTWFuYWdlcikudG9TdHJpbmcoKTsKICAgICAgICAgICAgIGluZm8uaWNvbiA9IHJpLmdldEljb25SZXNvdXJjZSgpOworICAgICAgICAgICAgaW5mby5wcmV2aWV3SW1hZ2UgPSBzYS5nZXRSZXNvdXJjZUlkKAorICAgICAgICAgICAgCQljb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BcHBXaWRnZXRQcm92aWRlckluZm9fcHJldmlld0ltYWdlLCAwKTsKKwogICAgICAgICAgICAgc2EucmVjeWNsZSgpOwogICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgLy8gT2sgdG8gY2F0Y2ggRXhjZXB0aW9uIGhlcmUsIGJlY2F1c2UgYW55dGhpbmcgZ29pbmcgd3JvbmcgYmVjYXVzZQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvQ2xpcGJvYXJkU2VydmljZS5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvQ2xpcGJvYXJkU2VydmljZS5qYXZhCmluZGV4IGFhOGNkZWQuLjRlNGZjMGMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0NsaXBib2FyZFNlcnZpY2UuamF2YQorKysgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9DbGlwYm9hcmRTZXJ2aWNlLmphdmEKQEAgLTE2LDQyICsxNiw3NyBAQAogCiBwYWNrYWdlIGNvbS5hbmRyb2lkLnNlcnZlcjsKIAotaW1wb3J0IGFuZHJvaWQudGV4dC5JQ2xpcGJvYXJkOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5DbGlwcGVkRGF0YTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSUNsaXBib2FyZDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSU9uUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVDYWxsYmFja0xpc3Q7CitpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CiAKIC8qKgogICogSW1wbGVtZW50YXRpb24gb2YgdGhlIGNsaXBib2FyZCBmb3IgY29weSBhbmQgcGFzdGUuCiAgKi8KIHB1YmxpYyBjbGFzcyBDbGlwYm9hcmRTZXJ2aWNlIGV4dGVuZHMgSUNsaXBib2FyZC5TdHViIHsKLSAgICBwcml2YXRlIENoYXJTZXF1ZW5jZSBtQ2xpcGJvYXJkID0gIiI7CisgICAgcHJpdmF0ZSBDbGlwcGVkRGF0YSBtUHJpbWFyeUNsaXA7CisgICAgcHJpdmF0ZSBmaW5hbCBSZW1vdGVDYWxsYmFja0xpc3Q8SU9uUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXI+IG1QcmltYXJ5Q2xpcExpc3RlbmVycworICAgICAgICAgICAgPSBuZXcgUmVtb3RlQ2FsbGJhY2tMaXN0PElPblByaW1hcnlDbGlwQ2hhbmdlZExpc3RlbmVyPigpOwogCiAgICAgLyoqCiAgICAgICogSW5zdGFudGlhdGVzIHRoZSBjbGlwYm9hcmQuCiAgICAgICovCiAgICAgcHVibGljIENsaXBib2FyZFNlcnZpY2UoQ29udGV4dCBjb250ZXh0KSB7IH0KIAotICAgIC8vIGphdmFkb2MgZnJvbSBpbnRlcmZhY2UKLSAgICBwdWJsaWMgdm9pZCBzZXRDbGlwYm9hcmRUZXh0KENoYXJTZXF1ZW5jZSB0ZXh0KSB7CisgICAgcHVibGljIHZvaWQgc2V0UHJpbWFyeUNsaXAoQ2xpcHBlZERhdGEgY2xpcCkgewogICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLSAgICAgICAgICAgIGlmICh0ZXh0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0ZXh0ID0gIiI7CisgICAgICAgICAgICBpZiAoY2xpcCAhPSBudWxsICYmIGNsaXAuZ2V0SXRlbUNvdW50KCkgPD0gMCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk5vIGl0ZW1zIik7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBtUHJpbWFyeUNsaXAgPSBjbGlwOworICAgICAgICAgICAgZmluYWwgaW50IG4gPSBtUHJpbWFyeUNsaXBMaXN0ZW5lcnMuYmVnaW5Ccm9hZGNhc3QoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgbVByaW1hcnlDbGlwTGlzdGVuZXJzLmdldEJyb2FkY2FzdEl0ZW0oaSkuZGlzcGF0Y2hQcmltYXJ5Q2xpcENoYW5nZWQoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworCisgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBSZW1vdGVDYWxsYmFja0xpc3Qgd2lsbCB0YWtlIGNhcmUgb2YgcmVtb3ZpbmcKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGRlYWQgb2JqZWN0IGZvciB1cy4KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtUHJpbWFyeUNsaXBMaXN0ZW5lcnMuZmluaXNoQnJvYWRjYXN0KCk7CisgICAgICAgIH0KKyAgICB9CiAgICAgCi0gICAgICAgICAgICBtQ2xpcGJvYXJkID0gdGV4dDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIGphdmFkb2MgZnJvbSBpbnRlcmZhY2UKLSAgICBwdWJsaWMgQ2hhclNlcXVlbmNlIGdldENsaXBib2FyZFRleHQoKSB7CisgICAgcHVibGljIENsaXBwZWREYXRhIGdldFByaW1hcnlDbGlwKCkgewogICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLSAgICAgICAgICAgIHJldHVybiBtQ2xpcGJvYXJkOworICAgICAgICAgICAgcmV0dXJuIG1QcmltYXJ5Q2xpcDsKICAgICAgICAgfQogICAgIH0KIAotICAgIC8vIGphdmFkb2MgZnJvbSBpbnRlcmZhY2UKKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNQcmltYXJ5Q2xpcCgpIHsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICByZXR1cm4gbVByaW1hcnlDbGlwICE9IG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRQcmltYXJ5Q2xpcENoYW5nZWRMaXN0ZW5lcihJT25QcmltYXJ5Q2xpcENoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIG1QcmltYXJ5Q2xpcExpc3RlbmVycy5yZWdpc3RlcihsaXN0ZW5lcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZW1vdmVQcmltYXJ5Q2xpcENoYW5nZWRMaXN0ZW5lcihJT25QcmltYXJ5Q2xpcENoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIG1QcmltYXJ5Q2xpcExpc3RlbmVycy51bnJlZ2lzdGVyKGxpc3RlbmVyKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHB1YmxpYyBib29sZWFuIGhhc0NsaXBib2FyZFRleHQoKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewotICAgICAgICAgICAgcmV0dXJuIG1DbGlwYm9hcmQubGVuZ3RoKCkgPiAwOworICAgICAgICAgICAgaWYgKG1QcmltYXJ5Q2xpcCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgQ2hhclNlcXVlbmNlIHRleHQgPSBtUHJpbWFyeUNsaXAuZ2V0SXRlbSgwKS5nZXRUZXh0KCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRleHQgIT0gbnVsbCAmJiB0ZXh0Lmxlbmd0aCgpID4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0Nvbm5lY3Rpdml0eVNlcnZpY2UuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0Nvbm5lY3Rpdml0eVNlcnZpY2UuamF2YQppbmRleCBjNzUxZjNkLi5iZDJhMGVhYTYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0Nvbm5lY3Rpdml0eVNlcnZpY2UuamF2YQorKysgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9Db25uZWN0aXZpdHlTZXJ2aWNlLmphdmEKQEAgLTI2LDEzICsyNiwxNiBAQAogaW1wb3J0IGFuZHJvaWQubmV0LklDb25uZWN0aXZpdHlNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQubmV0Lk1vYmlsZURhdGFTdGF0ZVRyYWNrZXI7CiBpbXBvcnQgYW5kcm9pZC5uZXQuTmV0d29ya0luZm87CitpbXBvcnQgYW5kcm9pZC5uZXQuTmV0d29ya1Byb3BlcnRpZXM7CiBpbXBvcnQgYW5kcm9pZC5uZXQuTmV0d29ya1N0YXRlVHJhY2tlcjsKIGltcG9ydCBhbmRyb2lkLm5ldC53aWZpLldpZmlTdGF0ZVRyYWNrZXI7CitpbXBvcnQgYW5kcm9pZC5uZXQuTmV0d29ya1V0aWxzOwogaW1wb3J0IGFuZHJvaWQub3MuQmluZGVyOwogaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKIGltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5Mb29wZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOworaW1wb3J0IGFuZHJvaWQub3MuUG93ZXJNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQub3MuU2VydmljZU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1Qcm9wZXJ0aWVzOwpAQCAtNDYsOCArNDksMTMgQEAKIGltcG9ydCBjb20uYW5kcm9pZC5zZXJ2ZXIuY29ubmVjdGl2aXR5LlRldGhlcmluZzsKIAogaW1wb3J0IGphdmEuaW8uRmlsZURlc2NyaXB0b3I7CitpbXBvcnQgamF2YS5pby5GaWxlV3JpdGVyOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLm5ldC5JbmV0QWRkcmVzczsKK2ltcG9ydCBqYXZhLm5ldC5Vbmtub3duSG9zdEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCiAvKioKQEAgLTY0LDcgKzcyLDYgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVUV09SS19SRVNUT1JFX0RFTEFZX1BST1BfTkFNRSA9CiAgICAgICAgICAgICAiYW5kcm9pZC50ZWxlcGhvbnkuYXBuLXJlc3RvcmUiOwogCi0KICAgICBwcml2YXRlIFRldGhlcmluZyBtVGV0aGVyaW5nOwogICAgIHByaXZhdGUgYm9vbGVhbiBtVGV0aGVyaW5nQ29uZmlnVmFsaWQgPSBmYWxzZTsKIApAQCAtODEsNiArODgsOCBAQAogICAgICAqLwogICAgIHByaXZhdGUgTGlzdCBtTmV0UmVxdWVzdGVyc1BpZHNbXTsKIAorICAgIHByaXZhdGUgV2lmaVdhdGNoZG9nU2VydmljZSBtV2lmaVdhdGNoZG9nU2VydmljZTsKKwogICAgIC8vIHByaW9yaXR5IG9yZGVyIG9mIHRoZSBuZXR0cmFja2VycwogICAgIC8vIChleGNsdWRpbmcgZHluYW1pY2FsbHkgc2V0IG1OZXR3b3JrUHJlZmVyZW5jZSkKICAgICAvLyBUT0RPIC0gbW92ZSBtTmV0d29ya1R5cGVQcmVmZXJlbmNlIGludG8gdGhpcwpAQCAtMTA0LDYgKzExMywxMSBAQAogICAgIHByaXZhdGUgYm9vbGVhbiBtU3lzdGVtUmVhZHk7CiAgICAgcHJpdmF0ZSBJbnRlbnQgbUluaXRpYWxCcm9hZGNhc3Q7CiAKKyAgICBwcml2YXRlIFBvd2VyTWFuYWdlci5XYWtlTG9jayBtTmV0VHJhbnNpdGlvbldha2VMb2NrOworICAgIHByaXZhdGUgU3RyaW5nIG1OZXRUcmFuc2l0aW9uV2FrZUxvY2tDYXVzZWRCeSA9ICIiOworICAgIHByaXZhdGUgaW50IG1OZXRUcmFuc2l0aW9uV2FrZUxvY2tTZXJpYWxOdW1iZXI7CisgICAgcHJpdmF0ZSBpbnQgbU5ldFRyYW5zaXRpb25XYWtlTG9ja1RpbWVvdXQ7CisKICAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBOZXR3b3JrQXR0cmlidXRlcyB7CiAgICAgICAgIC8qKgogICAgICAgICAgKiBDbGFzcyBmb3IgaG9sZGluZyBzZXR0aW5ncyByZWFkIGZyb20gcmVzb3VyY2VzLgpAQCAtMTk0LDYgKzIwOCwxMiBAQAogICAgICAgICB9CiAKICAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OworCisgICAgICAgIFBvd2VyTWFuYWdlciBwb3dlck1hbmFnZXIgPSAoUG93ZXJNYW5hZ2VyKW1Db250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5QT1dFUl9TRVJWSUNFKTsKKyAgICAgICAgbU5ldFRyYW5zaXRpb25XYWtlTG9jayA9IHBvd2VyTWFuYWdlci5uZXdXYWtlTG9jayhQb3dlck1hbmFnZXIuUEFSVElBTF9XQUtFX0xPQ0ssIFRBRyk7CisgICAgICAgIG1OZXRUcmFuc2l0aW9uV2FrZUxvY2tUaW1lb3V0ID0gbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0SW50ZWdlcigKKyAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmludGVnZXIuY29uZmlnX25ldHdvcmtUcmFuc2l0aW9uVGltZW91dCk7CisKICAgICAgICAgbU5ldFRyYWNrZXJzID0gbmV3IE5ldHdvcmtTdGF0ZVRyYWNrZXJbCiAgICAgICAgICAgICAgICAgQ29ubmVjdGl2aXR5TWFuYWdlci5NQVhfTkVUV09SS19UWVBFKzFdOwogICAgICAgICBtSGFuZGxlciA9IG5ldyBNeUhhbmRsZXIoKTsKQEAgLTI5MywxOCArMzEzLDIxIEBACiAgICAgICAgICAgICBzd2l0Y2ggKG1OZXRBdHRyaWJ1dGVzW25ldFR5cGVdLm1SYWRpbykgewogICAgICAgICAgICAgY2FzZSBDb25uZWN0aXZpdHlNYW5hZ2VyLlRZUEVfV0lGSToKICAgICAgICAgICAgICAgICBpZiAoREJHKSBTbG9nLnYoVEFHLCAiU3RhcnRpbmcgV2lmaSBTZXJ2aWNlLiIpOwotICAgICAgICAgICAgICAgIFdpZmlTdGF0ZVRyYWNrZXIgd3N0ID0gbmV3IFdpZmlTdGF0ZVRyYWNrZXIoY29udGV4dCwgbUhhbmRsZXIpOwotICAgICAgICAgICAgICAgIFdpZmlTZXJ2aWNlIHdpZmlTZXJ2aWNlID0gbmV3IFdpZmlTZXJ2aWNlKGNvbnRleHQsIHdzdCk7CisgICAgICAgICAgICAgICAgV2lmaVN0YXRlVHJhY2tlciB3c3QgPSBuZXcgV2lmaVN0YXRlVHJhY2tlcigpOworICAgICAgICAgICAgICAgIFdpZmlTZXJ2aWNlIHdpZmlTZXJ2aWNlID0gbmV3IFdpZmlTZXJ2aWNlKGNvbnRleHQpOwogICAgICAgICAgICAgICAgIFNlcnZpY2VNYW5hZ2VyLmFkZFNlcnZpY2UoQ29udGV4dC5XSUZJX1NFUlZJQ0UsIHdpZmlTZXJ2aWNlKTsKLSAgICAgICAgICAgICAgICB3aWZpU2VydmljZS5zdGFydFdpZmkoKTsKKyAgICAgICAgICAgICAgICB3aWZpU2VydmljZS5jaGVja0FuZFN0YXJ0V2lmaSgpOwogICAgICAgICAgICAgICAgIG1OZXRUcmFja2Vyc1tDb25uZWN0aXZpdHlNYW5hZ2VyLlRZUEVfV0lGSV0gPSB3c3Q7Ci0gICAgICAgICAgICAgICAgd3N0LnN0YXJ0TW9uaXRvcmluZygpOworICAgICAgICAgICAgICAgIHdzdC5zdGFydE1vbml0b3JpbmcoY29udGV4dCwgbUhhbmRsZXIpOworCisgICAgICAgICAgICAgICAgLy9UT0RPOiBhcyBwYXJ0IG9mIFdXUyByZWZhY3RvciwgY3JlYXRlIG9ubHkgd2hlbiBuZWVkZWQKKyAgICAgICAgICAgICAgICBtV2lmaVdhdGNoZG9nU2VydmljZSA9IG5ldyBXaWZpV2F0Y2hkb2dTZXJ2aWNlKGNvbnRleHQpOwogCiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIENvbm5lY3Rpdml0eU1hbmFnZXIuVFlQRV9NT0JJTEU6Ci0gICAgICAgICAgICAgICAgbU5ldFRyYWNrZXJzW25ldFR5cGVdID0gbmV3IE1vYmlsZURhdGFTdGF0ZVRyYWNrZXIoY29udGV4dCwgbUhhbmRsZXIsCi0gICAgICAgICAgICAgICAgICAgIG5ldFR5cGUsIG1OZXRBdHRyaWJ1dGVzW25ldFR5cGVdLm1OYW1lKTsKLSAgICAgICAgICAgICAgICBtTmV0VHJhY2tlcnNbbmV0VHlwZV0uc3RhcnRNb25pdG9yaW5nKCk7CisgICAgICAgICAgICAgICAgbU5ldFRyYWNrZXJzW25ldFR5cGVdID0gbmV3IE1vYmlsZURhdGFTdGF0ZVRyYWNrZXIobmV0VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1OZXRBdHRyaWJ1dGVzW25ldFR5cGVdLm1OYW1lKTsKKyAgICAgICAgICAgICAgICBtTmV0VHJhY2tlcnNbbmV0VHlwZV0uc3RhcnRNb25pdG9yaW5nKGNvbnRleHQsIG1IYW5kbGVyKTsKICAgICAgICAgICAgICAgICBpZiAobm9Nb2JpbGVEYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChEQkcpIFNsb2cuZChUQUcsICJ0ZWFyaW5nIGRvd24gTW9iaWxlIG5ldHdvcmtzIGR1ZSB0byBzZXR0aW5nIik7CiAgICAgICAgICAgICAgICAgICAgIG1OZXRUcmFja2Vyc1tuZXRUeXBlXS50ZWFyZG93bigpOwpAQCAtMzIxLDcgKzM0NCw4IEBACiAgICAgICAgIG1UZXRoZXJpbmdDb25maWdWYWxpZCA9ICgoKG1OZXRUcmFja2Vyc1tDb25uZWN0aXZpdHlNYW5hZ2VyLlRZUEVfTU9CSUxFX0RVTl0gIT0gbnVsbCkgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhbVRldGhlcmluZy5pc0R1blJlcXVpcmVkKCkpICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobVRldGhlcmluZy5nZXRUZXRoZXJhYmxlVXNiUmVnZXhzKCkubGVuZ3RoICE9IDAgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVGV0aGVyaW5nLmdldFRldGhlcmFibGVXaWZpUmVnZXhzKCkubGVuZ3RoICE9IDApICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRldGhlcmluZy5nZXRUZXRoZXJhYmxlV2lmaVJlZ2V4cygpLmxlbmd0aCAhPSAwIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRldGhlcmluZy5nZXRUZXRoZXJhYmxlQmx1ZXRvb3RoUmVnZXhzKCkubGVuZ3RoICE9IDApICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVGV0aGVyaW5nLmdldFVwc3RyZWFtSWZhY2VSZWdleHMoKS5sZW5ndGggIT0gMCk7CiAKICAgICB9CkBAIC01OTcsMTUgKzYyMSw3IEBACiAgICAgICAgICAgICAgICAgbmV0d29yay5yZWNvbm5lY3QoKTsKICAgICAgICAgICAgICAgICByZXR1cm4gUGhvbmUuQVBOX1JFUVVFU1RfU1RBUlRFRDsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc3luY2hyb25pemVkKHRoaXMpIHsKLSAgICAgICAgICAgICAgICAgICAgbUZlYXR1cmVVc2Vycy5hZGQoZik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1IYW5kbGVyLnNlbmRNZXNzYWdlRGVsYXllZChtSGFuZGxlci5vYnRhaW5NZXNzYWdlKAotICAgICAgICAgICAgICAgICAgICAgICAgTmV0d29ya1N0YXRlVHJhY2tlci5FVkVOVF9SRVNUT1JFX0RFRkFVTFRfTkVUV09SSywKLSAgICAgICAgICAgICAgICAgICAgICAgIGYpLCBnZXRSZXN0b3JlRGVmYXVsdE5ldHdvcmtEZWxheSgpKTsKLQotICAgICAgICAgICAgICAgIHJldHVybiBuZXR3b3JrLnN0YXJ0VXNpbmdOZXR3b3JrRmVhdHVyZShmZWF0dXJlLAotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q2FsbGluZ1BpZCgpLCBnZXRDYWxsaW5nVWlkKCkpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICByZXR1cm4gUGhvbmUuQVBOX1RZUEVfTk9UX0FWQUlMQUJMRTsKQEAgLTcyNCw4ICs3NDAsNyBAQAogICAgICAgICAgICAgdHJhY2tlci50ZWFyZG93bigpOwogICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBkbyBpdCB0aGUgb2xkIGZhc2hpb25lZCB3YXkKLSAgICAgICAgICAgIHJldHVybiB0cmFja2VyLnN0b3BVc2luZ05ldHdvcmtGZWF0dXJlKGZlYXR1cmUsIHBpZCwgdWlkKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgfQogICAgIH0KIApAQCAtNzM2LDYgKzc1MSw3IEBACiAgICAgICogc3BlY2lmaWVkIGhvc3QgaXMgdG8gYmUgcm91dGVkCiAgICAgICogQHBhcmFtIGhvc3RBZGRyZXNzIHRoZSBJUCBhZGRyZXNzIG9mIHRoZSBob3N0IHRvIHdoaWNoIHRoZSByb3V0ZSBpcwogICAgICAqIGRlc2lyZWQKKyAgICAgKiB0b2RvIC0gZGVwcmVjYXRlIChvbmx5IHY0ISkKICAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBvbiBzdWNjZXNzLCB7QGNvZGUgZmFsc2V9IG9uIGZhaWx1cmUKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiByZXF1ZXN0Um91dGVUb0hvc3QoaW50IG5ldHdvcmtUeXBlLCBpbnQgaG9zdEFkZHJlc3MpIHsKQEAgLTc1Miw3ICs3NjgsMzkgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJhY2tlci5yZXF1ZXN0Um91dGVUb0hvc3QoaG9zdEFkZHJlc3MpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgSW5ldEFkZHJlc3MgYWRkciA9IEluZXRBZGRyZXNzLmdldEJ5QWRkcmVzcyhOZXR3b3JrVXRpbHMudjRJbnRUb0FycmF5KGhvc3RBZGRyZXNzKSk7CisgICAgICAgICAgICByZXR1cm4gYWRkSG9zdFJvdXRlKHRyYWNrZXIsIGFkZHIpOworICAgICAgICB9IGNhdGNoIChVbmtub3duSG9zdEV4Y2VwdGlvbiBlKSB7fQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogRW5zdXJlIHRoYXQgYSBuZXR3b3JrIHJvdXRlIGV4aXN0cyB0byBkZWxpdmVyIHRyYWZmaWMgdG8gdGhlIHNwZWNpZmllZAorICAgICAqIGhvc3QgdmlhIHRoZSBtb2JpbGUgZGF0YSBuZXR3b3JrLgorICAgICAqIEBwYXJhbSBob3N0QWRkcmVzcyB0aGUgSVAgYWRkcmVzcyBvZiB0aGUgaG9zdCB0byB3aGljaCB0aGUgcm91dGUgaXMgZGVzaXJlZCwKKyAgICAgKiBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIuCisgICAgICogVE9ETyAtIGRlcHJlY2F0ZQorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IG9uIHN1Y2Nlc3MsIHtAY29kZSBmYWxzZX0gb24gZmFpbHVyZQorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBhZGRIb3N0Um91dGUoTmV0d29ya1N0YXRlVHJhY2tlciBudCwgSW5ldEFkZHJlc3MgaG9zdEFkZHJlc3MpIHsKKyAgICAgICAgaWYgKG50LmdldE5ldHdvcmtJbmZvKCkuZ2V0VHlwZSgpID09IENvbm5lY3Rpdml0eU1hbmFnZXIuVFlQRV9XSUZJKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBOZXR3b3JrUHJvcGVydGllcyBwID0gbnQuZ2V0TmV0d29ya1Byb3BlcnRpZXMoKTsKKyAgICAgICAgaWYgKHAgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOworICAgICAgICBTdHJpbmcgaW50ZXJmYWNlTmFtZSA9IHAuZ2V0SW50ZXJmYWNlTmFtZSgpOworCisgICAgICAgIGlmIChEQkcpIHsKKyAgICAgICAgICAgIFNsb2cuZChUQUcsICJSZXF1ZXN0ZWQgaG9zdCByb3V0ZSB0byAiICsgaG9zdEFkZHJlc3MgKyAiKCIgKyBpbnRlcmZhY2VOYW1lICsgIikiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW50ZXJmYWNlTmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gTmV0d29ya1V0aWxzLmFkZEhvc3RSb3V0ZShpbnRlcmZhY2VOYW1lLCBob3N0QWRkcmVzcykgPT0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChEQkcpIFNsb2cuZShUQUcsICJhZGRIb3N0Um91dGUgZmFpbGVkIGR1ZSB0byBudWxsIGludGVyZmFjZSBuYW1lIik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKQEAgLTg1OSw2ICs5MDcsMTIgQEAKICAgICAgICAgICAgICAgICAiQ29ubmVjdGl2aXR5U2VydmljZSIpOwogICAgIH0KIAorICAgIHByaXZhdGUgdm9pZCBlbmZvcmNlQ29ubmVjdGl2aXR5SW50ZXJuYWxQZXJtaXNzaW9uKCkgeworICAgICAgICBtQ29udGV4dC5lbmZvcmNlQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oCisgICAgICAgICAgICAgICAgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkNPTk5FQ1RJVklUWV9JTlRFUk5BTCwKKyAgICAgICAgICAgICAgICAiQ29ubmVjdGl2aXR5U2VydmljZSIpOworICAgIH0KKwogICAgIC8qKgogICAgICAqIEhhbmRsZSBhIHtAY29kZSBESVNDT05ORUNURUR9IGV2ZW50LiBJZiB0aGlzIHBlcnRhaW5zIHRvIHRoZSBub24tYWN0aXZlCiAgICAgICogbmV0d29yaywgd2UgaWdub3JlIGl0LiBJZiBpdCBpcyBmb3IgdGhlIGFjdGl2ZSBuZXR3b3JrLCB3ZSBzZW5kIG91dCBhCkBAIC0xMTI4LDQ0ICsxMTgyLDMwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICBTbG9nLmUoVEFHLCAiTmV0d29yayBkZWNsaW5lZCB0ZWFyZG93biByZXF1ZXN0Iik7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzRmFpbG92ZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyTmV0LnJlbGVhc2VXYWtlTG9jaygpOwotICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc3luY2hyb25pemVkIChDb25uZWN0aXZpdHlTZXJ2aWNlLnRoaXMpIHsKKyAgICAgICAgICAgICAgICAvLyBoYXZlIGEgbmV3IGRlZmF1bHQgbmV0d29yaywgcmVsZWFzZSB0aGUgdHJhbnNpdGlvbiB3YWtlbG9jayBpbiBhIHNlY29uZAorICAgICAgICAgICAgICAgIC8vIGlmIGl0J3MgaGVsZC4gIFRoZSBzZWNvbmQgcGF1c2UgaXMgdG8gYWxsb3cgYXBwcyB0byByZWNvbm5lY3Qgb3ZlciB0aGUKKyAgICAgICAgICAgICAgICAvLyBuZXcgbmV0d29yaworICAgICAgICAgICAgICAgIGlmIChtTmV0VHJhbnNpdGlvbldha2VMb2NrLmlzSGVsZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIG1IYW5kbGVyLnNlbmRNZXNzYWdlRGVsYXllZChtSGFuZGxlci5vYnRhaW5NZXNzYWdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5ldHdvcmtTdGF0ZVRyYWNrZXIuRVZFTlRfQ0xFQVJfTkVUX1RSQU5TSVRJT05fV0FLRUxPQ0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5ldFRyYW5zaXRpb25XYWtlTG9ja1NlcmlhbE51bWJlciwgMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwMCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgbUFjdGl2ZURlZmF1bHROZXR3b3JrID0gdHlwZTsKICAgICAgICAgfQogICAgICAgICB0aGlzTmV0LnNldFRlYXJkb3duUmVxdWVzdGVkKGZhbHNlKTsKLSAgICAgICAgdGhpc05ldC51cGRhdGVOZXR3b3JrU2V0dGluZ3MoKTsKKyAgICAgICAgdXBkYXRlTmV0d29ya1NldHRpbmdzKHRoaXNOZXQpOwogICAgICAgICBoYW5kbGVDb25uZWN0aXZpdHlDaGFuZ2UodHlwZSk7CiAgICAgICAgIHNlbmRDb25uZWN0ZWRCcm9hZGNhc3QoaW5mbyk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZVNjYW5SZXN1bHRzQXZhaWxhYmxlKE5ldHdvcmtJbmZvIGluZm8pIHsKLSAgICAgICAgaW50IG5ldHdvcmtUeXBlID0gaW5mby5nZXRUeXBlKCk7Ci0gICAgICAgIGlmIChuZXR3b3JrVHlwZSAhPSBDb25uZWN0aXZpdHlNYW5hZ2VyLlRZUEVfV0lGSSkgewotICAgICAgICAgICAgaWYgKERCRykgU2xvZy52KFRBRywgIkdvdCBTY2FuUmVzdWx0c0F2YWlsYWJsZSBmb3IgIiArCi0gICAgICAgICAgICAgICAgICAgIGluZm8uZ2V0VHlwZU5hbWUoKSArICIgbmV0d29yay4gRG9uJ3Qga25vdyBob3cgdG8gaGFuZGxlLiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgbU5ldFRyYWNrZXJzW25ldHdvcmtUeXBlXS5pbnRlcnByZXRTY2FuUmVzdWx0c0F2YWlsYWJsZSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBoYW5kbGVOb3RpZmljYXRpb25DaGFuZ2UoYm9vbGVhbiB2aXNpYmxlLCBpbnQgaWQsCi0gICAgICAgICAgICBOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0gICAgICAgIE5vdGlmaWNhdGlvbk1hbmFnZXIgbm90aWZpY2F0aW9uTWFuYWdlciA9IChOb3RpZmljYXRpb25NYW5hZ2VyKSBtQ29udGV4dAotICAgICAgICAgICAgICAgIC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuTk9USUZJQ0FUSU9OX1NFUlZJQ0UpOwotCi0gICAgICAgIGlmICh2aXNpYmxlKSB7Ci0gICAgICAgICAgICBub3RpZmljYXRpb25NYW5hZ2VyLm5vdGlmeShpZCwgbm90aWZpY2F0aW9uKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG5vdGlmaWNhdGlvbk1hbmFnZXIuY2FuY2VsKGlkKTsKLSAgICAgICAgfQotICAgIH0KLQogICAgIC8qKgotICAgICAqIEFmdGVyIGEgY2hhbmdlIGluIHRoZSBjb25uZWN0aXZpdHkgc3RhdGUgb2YgYW55IG5ldHdvcmssIFdlJ3JlIG1haW5seQotICAgICAqIGNvbmNlcm5lZCB3aXRoIG1ha2luZyBzdXJlIHRoYXQgdGhlIGxpc3Qgb2YgRE5TIHNlcnZlcnMgaXMgc2V0dXB1cAorICAgICAqIEFmdGVyIGEgY2hhbmdlIGluIHRoZSBjb25uZWN0aXZpdHkgc3RhdGUgb2YgYSBuZXR3b3JrLiBXZSdyZSBtYWlubHkKKyAgICAgKiBjb25jZXJuZWQgd2l0aCBtYWtpbmcgc3VyZSB0aGF0IHRoZSBsaXN0IG9mIEROUyBzZXJ2ZXJzIGlzIHNldCB1cAogICAgICAqIGFjY29yZGluZyB0byB3aGljaCBuZXR3b3JrcyBhcmUgY29ubmVjdGVkLCBhbmQgZW5zdXJpbmcgdGhhdCB0aGUKICAgICAgKiByaWdodCByb3V0aW5nIHRhYmxlIGVudHJpZXMgZXhpc3QuCiAgICAgICovCkBAIC0xMTc4LDE5ICsxMjE4LDE1OCBAQAogCiAgICAgICAgIGlmIChtTmV0VHJhY2tlcnNbbmV0VHlwZV0uZ2V0TmV0d29ya0luZm8oKS5pc0Nvbm5lY3RlZCgpKSB7CiAgICAgICAgICAgICBpZiAobU5ldEF0dHJpYnV0ZXNbbmV0VHlwZV0uaXNEZWZhdWx0KCkpIHsKLSAgICAgICAgICAgICAgICBtTmV0VHJhY2tlcnNbbmV0VHlwZV0uYWRkRGVmYXVsdFJvdXRlKCk7CisgICAgICAgICAgICAgICAgYWRkRGVmYXVsdFJvdXRlKG1OZXRUcmFja2Vyc1tuZXRUeXBlXSk7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1OZXRUcmFja2Vyc1tuZXRUeXBlXS5hZGRQcml2YXRlRG5zUm91dGVzKCk7CisgICAgICAgICAgICAgICAgYWRkUHJpdmF0ZURuc1JvdXRlcyhtTmV0VHJhY2tlcnNbbmV0VHlwZV0pOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgaWYgKG1OZXRBdHRyaWJ1dGVzW25ldFR5cGVdLmlzRGVmYXVsdCgpKSB7Ci0gICAgICAgICAgICAgICAgbU5ldFRyYWNrZXJzW25ldFR5cGVdLnJlbW92ZURlZmF1bHRSb3V0ZSgpOworICAgICAgICAgICAgICAgIHJlbW92ZURlZmF1bHRSb3V0ZShtTmV0VHJhY2tlcnNbbmV0VHlwZV0pOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtTmV0VHJhY2tlcnNbbmV0VHlwZV0ucmVtb3ZlUHJpdmF0ZURuc1JvdXRlcygpOworICAgICAgICAgICAgICAgIHJlbW92ZVByaXZhdGVEbnNSb3V0ZXMobU5ldFRyYWNrZXJzW25ldFR5cGVdKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIAorICAgIHByaXZhdGUgdm9pZCBhZGRQcml2YXRlRG5zUm91dGVzKE5ldHdvcmtTdGF0ZVRyYWNrZXIgbnQpIHsKKyAgICAgICAgYm9vbGVhbiBwcml2YXRlRG5zUm91dGVTZXQgPSBudC5pc1ByaXZhdGVEbnNSb3V0ZVNldCgpOworICAgICAgICBOZXR3b3JrUHJvcGVydGllcyBwID0gbnQuZ2V0TmV0d29ya1Byb3BlcnRpZXMoKTsKKyAgICAgICAgaWYgKHAgPT0gbnVsbCkgcmV0dXJuOworICAgICAgICBTdHJpbmcgaW50ZXJmYWNlTmFtZSA9IHAuZ2V0SW50ZXJmYWNlTmFtZSgpOworCisgICAgICAgIGlmIChEQkcpIHsKKyAgICAgICAgICAgIFNsb2cuZChUQUcsICJhZGRQcml2YXRlRG5zUm91dGVzIGZvciAiICsgbnQgKworICAgICAgICAgICAgICAgICAgICAiKCIgKyBpbnRlcmZhY2VOYW1lICsgIikgLSBtUHJpdmF0ZURuc1JvdXRlU2V0ID0gIiArIHByaXZhdGVEbnNSb3V0ZVNldCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGludGVyZmFjZU5hbWUgIT0gbnVsbCAmJiAhcHJpdmF0ZURuc1JvdXRlU2V0KSB7CisgICAgICAgICAgICBDb2xsZWN0aW9uPEluZXRBZGRyZXNzPiBkbnNMaXN0ID0gcC5nZXREbnNlcygpOworICAgICAgICAgICAgZm9yIChJbmV0QWRkcmVzcyBkbnMgOiBkbnNMaXN0KSB7CisgICAgICAgICAgICAgICAgaWYgKERCRykgU2xvZy5kKFRBRywgIiAgYWRkaW5nICIgKyBkbnMpOworICAgICAgICAgICAgICAgIE5ldHdvcmtVdGlscy5hZGRIb3N0Um91dGUoaW50ZXJmYWNlTmFtZSwgZG5zKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG50LnByaXZhdGVEbnNSb3V0ZVNldCh0cnVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZW1vdmVQcml2YXRlRG5zUm91dGVzKE5ldHdvcmtTdGF0ZVRyYWNrZXIgbnQpIHsKKyAgICAgICAgLy8gVE9ETyAtIHdlIHNob3VsZCBkbyB0aGlzIGV4cGxpY2l0bHkgYnV0IHRoZSBOZXRVdGlscyBhcGkgZG9lc250CisgICAgICAgIC8vIHN1cHBvcnQgdGhpcyB5ZXQgLSBtdXN0IHJlbW92ZSBhbGwuICBObyB3b3JzZSB0aGFuIGJlZm9yZQorICAgICAgICBOZXR3b3JrUHJvcGVydGllcyBwID0gbnQuZ2V0TmV0d29ya1Byb3BlcnRpZXMoKTsKKyAgICAgICAgaWYgKHAgPT0gbnVsbCkgcmV0dXJuOworICAgICAgICBTdHJpbmcgaW50ZXJmYWNlTmFtZSA9IHAuZ2V0SW50ZXJmYWNlTmFtZSgpOworICAgICAgICBib29sZWFuIHByaXZhdGVEbnNSb3V0ZVNldCA9IG50LmlzUHJpdmF0ZURuc1JvdXRlU2V0KCk7CisgICAgICAgIGlmIChpbnRlcmZhY2VOYW1lICE9IG51bGwgJiYgcHJpdmF0ZURuc1JvdXRlU2V0KSB7CisgICAgICAgICAgICBpZiAoREJHKSB7CisgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgInJlbW92ZVByaXZhdGVEbnNSb3V0ZXMgZm9yICIgKyBudC5nZXROZXR3b3JrSW5mbygpLmdldFR5cGVOYW1lKCkgKworICAgICAgICAgICAgICAgICAgICAgICAgIiAoIiArIGludGVyZmFjZU5hbWUgKyAiKSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgTmV0d29ya1V0aWxzLnJlbW92ZUhvc3RSb3V0ZXMoaW50ZXJmYWNlTmFtZSk7CisgICAgICAgICAgICBudC5wcml2YXRlRG5zUm91dGVTZXQoZmFsc2UpOworICAgICAgICB9CisgICAgfQorCisKKyAgICBwcml2YXRlIHZvaWQgYWRkRGVmYXVsdFJvdXRlKE5ldHdvcmtTdGF0ZVRyYWNrZXIgbnQpIHsKKyAgICAgICAgTmV0d29ya1Byb3BlcnRpZXMgcCA9IG50LmdldE5ldHdvcmtQcm9wZXJ0aWVzKCk7CisgICAgICAgIGlmIChwID09IG51bGwpIHJldHVybjsKKyAgICAgICAgU3RyaW5nIGludGVyZmFjZU5hbWUgPSBwLmdldEludGVyZmFjZU5hbWUoKTsKKyAgICAgICAgSW5ldEFkZHJlc3MgZGVmYXVsdEdhdGV3YXlBZGRyID0gcC5nZXRHYXRld2F5KCk7CisKKyAgICAgICAgaWYgKChpbnRlcmZhY2VOYW1lICE9IG51bGwpICYmIChkZWZhdWx0R2F0ZXdheUFkZHIgIT0gbnVsbCApKSB7CisgICAgICAgICAgICBpZiAoKE5ldHdvcmtVdGlscy5zZXREZWZhdWx0Um91dGUoaW50ZXJmYWNlTmFtZSwgZGVmYXVsdEdhdGV3YXlBZGRyKSA+PSAwKSAmJiBEQkcpIHsKKyAgICAgICAgICAgICAgICBOZXR3b3JrSW5mbyBuZXR3b3JrSW5mbyA9IG50LmdldE5ldHdvcmtJbmZvKCk7CisgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgImFkZERlZmF1bHRSb3V0ZSBmb3IgIiArIG5ldHdvcmtJbmZvLmdldFR5cGVOYW1lKCkgKworICAgICAgICAgICAgICAgICAgICAgICAgIiAoIiArIGludGVyZmFjZU5hbWUgKyAiKSwgR2F0ZXdheUFkZHI9IiArIGRlZmF1bHRHYXRld2F5QWRkcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHJlbW92ZURlZmF1bHRSb3V0ZShOZXR3b3JrU3RhdGVUcmFja2VyIG50KSB7CisgICAgICAgIE5ldHdvcmtQcm9wZXJ0aWVzIHAgPSBudC5nZXROZXR3b3JrUHJvcGVydGllcygpOworICAgICAgICBpZiAocCA9PSBudWxsKSByZXR1cm47CisgICAgICAgIFN0cmluZyBpbnRlcmZhY2VOYW1lID0gcC5nZXRJbnRlcmZhY2VOYW1lKCk7CisKKyAgICAgICAgaWYgKGludGVyZmFjZU5hbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKChOZXR3b3JrVXRpbHMucmVtb3ZlRGVmYXVsdFJvdXRlKGludGVyZmFjZU5hbWUpID49IDApICYmIERCRykgeworICAgICAgICAgICAgICAgIE5ldHdvcmtJbmZvIG5ldHdvcmtJbmZvID0gbnQuZ2V0TmV0d29ya0luZm8oKTsKKyAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAicmVtb3ZlRGVmYXVsdFJvdXRlIGZvciAiICsgbmV0d29ya0luZm8uZ2V0VHlwZU5hbWUoKSArICIgKCIgKworICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlTmFtZSArICIpIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgIC8qKgorICAgICAqIFJlYWRzIHRoZSBuZXR3b3JrIHNwZWNpZmljIFRDUCBidWZmZXIgc2l6ZXMgZnJvbSBTeXN0ZW1Qcm9wZXJ0aWVzCisgICAgICogbmV0LnRjcC5idWZmZXJzaXplLltkZWZhdWx0fHdpZml8dW10c3xlZGdlfGdwcnNdIGFuZCBzZXQgdGhlbSBmb3Igc3lzdGVtCisgICAgICogd2lkZSB1c2UKKyAgICAgKi8KKyAgIHB1YmxpYyB2b2lkIHVwZGF0ZU5ldHdvcmtTZXR0aW5ncyhOZXR3b3JrU3RhdGVUcmFja2VyIG50KSB7CisgICAgICAgIFN0cmluZyBrZXkgPSBudC5nZXRUY3BCdWZmZXJTaXplc1Byb3BOYW1lKCk7CisgICAgICAgIFN0cmluZyBidWZmZXJTaXplcyA9IFN5c3RlbVByb3BlcnRpZXMuZ2V0KGtleSk7CisKKyAgICAgICAgaWYgKGJ1ZmZlclNpemVzLmxlbmd0aCgpID09IDApIHsKKyAgICAgICAgICAgIFNsb2cuZShUQUcsIGtleSArICIgbm90IGZvdW5kIGluIHN5c3RlbSBwcm9wZXJ0aWVzLiBVc2luZyBkZWZhdWx0cyIpOworCisgICAgICAgICAgICAvLyBTZXR0aW5nIHRvIGRlZmF1bHQgdmFsdWVzIHNvIHdlIHdvbid0IGJlIHN0dWNrIHRvIHByZXZpb3VzIHZhbHVlcworICAgICAgICAgICAga2V5ID0gIm5ldC50Y3AuYnVmZmVyc2l6ZS5kZWZhdWx0IjsKKyAgICAgICAgICAgIGJ1ZmZlclNpemVzID0gU3lzdGVtUHJvcGVydGllcy5nZXQoa2V5KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFNldCB2YWx1ZXMgaW4ga2VybmVsCisgICAgICAgIGlmIChidWZmZXJTaXplcy5sZW5ndGgoKSAhPSAwKSB7CisgICAgICAgICAgICBpZiAoREJHKSB7CisgICAgICAgICAgICAgICAgU2xvZy52KFRBRywgIlNldHRpbmcgVENQIHZhbHVlczogWyIgKyBidWZmZXJTaXplcworICAgICAgICAgICAgICAgICAgICAgICAgKyAiXSB3aGljaCBjb21lcyBmcm9tIFsiICsga2V5ICsgIl0iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldEJ1ZmZlclNpemUoYnVmZmVyU2l6ZXMpOworICAgICAgICB9CisgICAgfQorCisgICAvKioKKyAgICAgKiBXcml0ZXMgVENQIGJ1ZmZlciBzaXplcyB0byAvc3lzL2tlcm5lbC9pcHY0L3RjcF9bci93XW1lbV9bbWluL2RlZi9tYXhdCisgICAgICogd2hpY2ggbWFwcyB0byAvcHJvYy9zeXMvbmV0L2lwdjQvdGNwX3JtZW0gYW5kIHRjcHdtZW0KKyAgICAgKgorICAgICAqIEBwYXJhbSBidWZmZXJTaXplcyBpbiB0aGUgZm9ybWF0IG9mICJyZWFkTWluLCByZWFkSW5pdGlhbCwgcmVhZE1heCwKKyAgICAgKiAgICAgICAgd3JpdGVNaW4sIHdyaXRlSW5pdGlhbCwgd3JpdGVNYXgiCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHNldEJ1ZmZlclNpemUoU3RyaW5nIGJ1ZmZlclNpemVzKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTdHJpbmdbXSB2YWx1ZXMgPSBidWZmZXJTaXplcy5zcGxpdCgiLCIpOworCisgICAgICAgICAgICBpZiAodmFsdWVzLmxlbmd0aCA9PSA2KSB7CisgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwcmVmaXggPSAiL3N5cy9rZXJuZWwvaXB2NC90Y3BfIjsKKyAgICAgICAgICAgICAgICBzdHJpbmdUb0ZpbGUocHJlZml4ICsgInJtZW1fbWluIiwgdmFsdWVzWzBdKTsKKyAgICAgICAgICAgICAgICBzdHJpbmdUb0ZpbGUocHJlZml4ICsgInJtZW1fZGVmIiwgdmFsdWVzWzFdKTsKKyAgICAgICAgICAgICAgICBzdHJpbmdUb0ZpbGUocHJlZml4ICsgInJtZW1fbWF4IiwgdmFsdWVzWzJdKTsKKyAgICAgICAgICAgICAgICBzdHJpbmdUb0ZpbGUocHJlZml4ICsgIndtZW1fbWluIiwgdmFsdWVzWzNdKTsKKyAgICAgICAgICAgICAgICBzdHJpbmdUb0ZpbGUocHJlZml4ICsgIndtZW1fZGVmIiwgdmFsdWVzWzRdKTsKKyAgICAgICAgICAgICAgICBzdHJpbmdUb0ZpbGUocHJlZml4ICsgIndtZW1fbWF4IiwgdmFsdWVzWzVdKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgIkludmFsaWQgYnVmZmVyc2l6ZSBzdHJpbmc6ICIgKyBidWZmZXJTaXplcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFNsb2cuZShUQUcsICJDYW4ndCBzZXQgdGNwIGJ1ZmZlciBzaXplczoiICsgZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgIC8qKgorICAgICAqIFdyaXRlcyBzdHJpbmcgdG8gZmlsZS4gQmFzaWNhbGx5IHNhbWUgYXMgImVjaG8gLW4gJHN0cmluZyA+ICRmaWxlbmFtZSIKKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWxlbmFtZQorICAgICAqIEBwYXJhbSBzdHJpbmcKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHN0cmluZ1RvRmlsZShTdHJpbmcgZmlsZW5hbWUsIFN0cmluZyBzdHJpbmcpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEZpbGVXcml0ZXIgb3V0ID0gbmV3IEZpbGVXcml0ZXIoZmlsZW5hbWUpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgb3V0LndyaXRlKHN0cmluZyk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBvdXQuY2xvc2UoKTsKKyAgICAgICAgfQorICAgIH0KKworCiAgICAgLyoqCiAgICAgICogQWRqdXN0IHRoZSBwZXItcHJvY2VzcyBkbnMgZW50cmllcyAobmV0LmRuczx4Pi48cGlkPikgYmFzZWQKICAgICAgKiBvbiB0aGUgaGlnaGVzdCBwcmlvcml0eSBhY3RpdmUgbmV0IHdoaWNoIHRoaXMgcHJvY2VzcyByZXF1ZXN0ZWQuCkBAIC0xMjA2LDEyICsxMzg1LDE0IEBACiAgICAgICAgICAgICBOZXR3b3JrU3RhdGVUcmFja2VyIG50ID0gbU5ldFRyYWNrZXJzW2ldOwogICAgICAgICAgICAgaWYgKG50LmdldE5ldHdvcmtJbmZvKCkuaXNDb25uZWN0ZWQoKSAmJgogICAgICAgICAgICAgICAgICAgICAhbnQuaXNUZWFyZG93blJlcXVlc3RlZCgpKSB7CisgICAgICAgICAgICAgICAgTmV0d29ya1Byb3BlcnRpZXMgcCA9IG50LmdldE5ldHdvcmtQcm9wZXJ0aWVzKCk7CisgICAgICAgICAgICAgICAgaWYgKHAgPT0gbnVsbCkgY29udGludWU7CiAgICAgICAgICAgICAgICAgTGlzdCBwaWRzID0gbU5ldFJlcXVlc3RlcnNQaWRzW2ldOwogICAgICAgICAgICAgICAgIGZvciAoaW50IGo9MDsgajxwaWRzLnNpemUoKTsgaisrKSB7CiAgICAgICAgICAgICAgICAgICAgIEludGVnZXIgcGlkID0gKEludGVnZXIpcGlkcy5nZXQoaik7CiAgICAgICAgICAgICAgICAgICAgIGlmIChwaWQuaW50VmFsdWUoKSA9PSBteVBpZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gZG5zTGlzdCA9IG50LmdldE5hbWVTZXJ2ZXJzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3cml0ZVBpZERucyhkbnNMaXN0LCBteVBpZCk7CisgICAgICAgICAgICAgICAgICAgICAgICBDb2xsZWN0aW9uPEluZXRBZGRyZXNzPiBkbnNlcyA9IHAuZ2V0RG5zZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlUGlkRG5zKGRuc2VzLCBteVBpZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZG9CdW1wKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVtcERucygpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQpAQCAtMTIzMywxMiArMTQxNCwxMCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIHdyaXRlUGlkRG5zKFN0cmluZ1tdIGRuc0xpc3QsIGludCBwaWQpIHsKKyAgICBwcml2YXRlIHZvaWQgd3JpdGVQaWREbnMoQ29sbGVjdGlvbiA8SW5ldEFkZHJlc3M+IGRuc2VzLCBpbnQgcGlkKSB7CiAgICAgICAgIGludCBqID0gMTsKLSAgICAgICAgZm9yIChTdHJpbmcgZG5zIDogZG5zTGlzdCkgewotICAgICAgICAgICAgaWYgKGRucyAhPSBudWxsICYmICFUZXh0VXRpbHMuZXF1YWxzKGRucywgIjAuMC4wLjAiKSkgewotICAgICAgICAgICAgICAgIFN5c3RlbVByb3BlcnRpZXMuc2V0KCJuZXQuZG5zIiArIGorKyArICIuIiArIHBpZCwgZG5zKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgZm9yIChJbmV0QWRkcmVzcyBkbnMgOiBkbnNlcykgeworICAgICAgICAgICAgU3lzdGVtUHJvcGVydGllcy5zZXQoIm5ldC5kbnMiICsgaisrICsgIi4iICsgcGlkLCBkbnMuZ2V0SG9zdEFkZHJlc3MoKSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTEyNjEsMTcgKzE0NDAsMTcgQEAKICAgICAgICAgLy8gYWRkIGRlZmF1bHQgbmV0J3MgZG5zIGVudHJpZXMKICAgICAgICAgTmV0d29ya1N0YXRlVHJhY2tlciBudCA9IG1OZXRUcmFja2Vyc1tuZXRUeXBlXTsKICAgICAgICAgaWYgKG50ICE9IG51bGwgJiYgbnQuZ2V0TmV0d29ya0luZm8oKS5pc0Nvbm5lY3RlZCgpICYmICFudC5pc1RlYXJkb3duUmVxdWVzdGVkKCkpIHsKLSAgICAgICAgICAgIFN0cmluZ1tdIGRuc0xpc3QgPSBudC5nZXROYW1lU2VydmVycygpOworICAgICAgICAgICAgTmV0d29ya1Byb3BlcnRpZXMgcCA9IG50LmdldE5ldHdvcmtQcm9wZXJ0aWVzKCk7CisgICAgICAgICAgICBpZiAocCA9PSBudWxsKSByZXR1cm47CisgICAgICAgICAgICBDb2xsZWN0aW9uPEluZXRBZGRyZXNzPiBkbnNlcyA9IHAuZ2V0RG5zZXMoKTsKICAgICAgICAgICAgIGlmIChtTmV0QXR0cmlidXRlc1tuZXRUeXBlXS5pc0RlZmF1bHQoKSkgewogICAgICAgICAgICAgICAgIGludCBqID0gMTsKLSAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBkbnMgOiBkbnNMaXN0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkbnMgIT0gbnVsbCAmJiAhVGV4dFV0aWxzLmVxdWFscyhkbnMsICIwLjAuMC4wIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAiYWRkaW5nIGRucyAiICsgZG5zICsgIiBmb3IgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudC5nZXROZXR3b3JrSW5mbygpLmdldFR5cGVOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtUHJvcGVydGllcy5zZXQoIm5ldC5kbnMiICsgaisrLCBkbnMpOworICAgICAgICAgICAgICAgIGZvciAoSW5ldEFkZHJlc3MgZG5zIDogZG5zZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKERCRykgeworICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgImFkZGluZyBkbnMgIiArIGRucyArICIgZm9yICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudC5nZXROZXR3b3JrSW5mbygpLmdldFR5cGVOYW1lKCkpOwogICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIFN5c3RlbVByb3BlcnRpZXMuc2V0KCJuZXQuZG5zIiArIGorKywgZG5zLmdldEhvc3RBZGRyZXNzKCkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBmb3IgKGludCBrPWogOyBrPG1OdW1EbnNFbnRyaWVzOyBrKyspIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKERCRykgU2xvZy5kKFRBRywgImVyYXNpbmcgbmV0LmRucyIgKyBrKTsKQEAgLTEyODMsMTEgKzE0NjIsMTEgQEAKICAgICAgICAgICAgICAgICBMaXN0IHBpZHMgPSBtTmV0UmVxdWVzdGVyc1BpZHNbbmV0VHlwZV07CiAgICAgICAgICAgICAgICAgZm9yIChpbnQgeT0wOyB5PCBwaWRzLnNpemUoKTsgeSsrKSB7CiAgICAgICAgICAgICAgICAgICAgIEludGVnZXIgcGlkID0gKEludGVnZXIpcGlkcy5nZXQoeSk7Ci0gICAgICAgICAgICAgICAgICAgIHdyaXRlUGlkRG5zKGRuc0xpc3QsIHBpZC5pbnRWYWx1ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVQaWREbnMoZG5zZXMsIHBpZC5pbnRWYWx1ZSgpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBidW1wRG5zKCk7CiAgICAgICAgIH0KLSAgICAgICAgYnVtcERucygpOwogICAgIH0KIAogICAgIHByaXZhdGUgaW50IGdldFJlc3RvcmVEZWZhdWx0TmV0d29ya0RlbGF5KCkgewpAQCAtMTM0Miw2ICsxNTIxLDEzIEBACiAgICAgICAgIH0KICAgICAgICAgcHcucHJpbnRsbigpOwogCisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgcHcucHJpbnRsbigiTmV0d29ya1RyYW5zdGlvbldha2VMb2NrIGlzIGN1cnJlbnRseSAiICsKKyAgICAgICAgICAgICAgICAgICAgKG1OZXRUcmFuc2l0aW9uV2FrZUxvY2suaXNIZWxkKCkgPyAiIiA6ICJub3QgIikgKyAiaGVsZC4iKTsKKyAgICAgICAgICAgIHB3LnByaW50bG4oIkl0IHdhcyBsYXN0IHJlcXVlc3RlZCBmb3IgIittTmV0VHJhbnNpdGlvbldha2VMb2NrQ2F1c2VkQnkpOworICAgICAgICB9CisgICAgICAgIHB3LnByaW50bG4oKTsKKwogICAgICAgICBtVGV0aGVyaW5nLmR1bXAoZmQsIHB3LCBhcmdzKTsKICAgICB9CiAKQEAgLTE0MDgsMzQgKzE1OTQsMzAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUNvbm5lY3QoaW5mbyk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE5ldHdvcmtTdGF0ZVRyYWNrZXIuRVZFTlRfU0NBTl9SRVNVTFRTX0FWQUlMQUJMRToKLSAgICAgICAgICAgICAgICAgICAgaW5mbyA9IChOZXR3b3JrSW5mbykgbXNnLm9iajsKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlU2NhblJlc3VsdHNBdmFpbGFibGUoaW5mbyk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBOZXR3b3JrU3RhdGVUcmFja2VyLkVWRU5UX05PVElGSUNBVElPTl9DSEFOR0VEOgotICAgICAgICAgICAgICAgICAgICBoYW5kbGVOb3RpZmljYXRpb25DaGFuZ2UobXNnLmFyZzEgPT0gMSwgbXNnLmFyZzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKE5vdGlmaWNhdGlvbikgbXNnLm9iaik7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCiAgICAgICAgICAgICAgICAgY2FzZSBOZXR3b3JrU3RhdGVUcmFja2VyLkVWRU5UX0NPTkZJR1VSQVRJT05fQ0hBTkdFRDoKKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyAtIG1ha2UgdGhpcyBoYW5kbGUgaXAvcHJveHkvZ2F0ZXdheS9kbnMgY2hhbmdlcwogICAgICAgICAgICAgICAgICAgICBpbmZvID0gKE5ldHdvcmtJbmZvKSBtc2cub2JqOwogICAgICAgICAgICAgICAgICAgICB0eXBlID0gaW5mby5nZXRUeXBlKCk7CiAgICAgICAgICAgICAgICAgICAgIGhhbmRsZURuc0NvbmZpZ3VyYXRpb25DaGFuZ2UodHlwZSk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBOZXR3b3JrU3RhdGVUcmFja2VyLkVWRU5UX1JPQU1JTkdfQ0hBTkdFRDoKLSAgICAgICAgICAgICAgICAgICAgLy8gZmlsbCBtZSBpbgotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTmV0d29ya1N0YXRlVHJhY2tlci5FVkVOVF9ORVRXT1JLX1NVQlRZUEVfQ0hBTkdFRDoKLSAgICAgICAgICAgICAgICAgICAgLy8gZmlsbCBtZSBpbgotICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIE5ldHdvcmtTdGF0ZVRyYWNrZXIuRVZFTlRfUkVTVE9SRV9ERUZBVUxUX05FVFdPUks6CiAgICAgICAgICAgICAgICAgICAgIEZlYXR1cmVVc2VyIHUgPSAoRmVhdHVyZVVzZXIpbXNnLm9iajsKICAgICAgICAgICAgICAgICAgICAgdS5leHBpcmUoKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBOZXR3b3JrU3RhdGVUcmFja2VyLkVWRU5UX0NMRUFSX05FVF9UUkFOU0lUSU9OX1dBS0VMT0NLOgorICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY2F1c2VkQnkgPSBudWxsOworICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKENvbm5lY3Rpdml0eVNlcnZpY2UudGhpcykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1zZy5hcmcxID09IG1OZXRUcmFuc2l0aW9uV2FrZUxvY2tTZXJpYWxOdW1iZXIgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5ldFRyYW5zaXRpb25XYWtlTG9jay5pc0hlbGQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1OZXRUcmFuc2l0aW9uV2FrZUxvY2sucmVsZWFzZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdXNlZEJ5ID0gbU5ldFRyYW5zaXRpb25XYWtlTG9ja0NhdXNlZEJ5OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChjYXVzZWRCeSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAiTmV0VHJhbnNpdGlvbiBXYWtlbG9jayBmb3IgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdXNlZEJ5ICsgIiByZWxlYXNlZCBieSB0aW1lb3V0Iik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC0xNDkyLDYgKzE2NzQsMTUgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRUZXRoZXJhYmxlQmx1ZXRvb3RoUmVnZXhzKCkgeworICAgICAgICBlbmZvcmNlVGV0aGVyQWNjZXNzUGVybWlzc2lvbigpOworICAgICAgICBpZiAoaXNUZXRoZXJpbmdTdXBwb3J0ZWQoKSkgeworICAgICAgICAgICAgcmV0dXJuIG1UZXRoZXJpbmcuZ2V0VGV0aGVyYWJsZUJsdWV0b290aFJlZ2V4cygpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbMF07CisgICAgICAgIH0KKyAgICB9CisKICAgICAvLyBUT0RPIC0gbW92ZSBpZmFjZSBsaXN0aW5nLCBxdWVyaWVzLCBldGMgdG8gbmV3IG1vZHVsZQogICAgIC8vIGphdmFkb2MgZnJvbSBpbnRlcmZhY2UKICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0VGV0aGVyYWJsZUlmYWNlcygpIHsKQEAgLTE1MTksNCArMTcxMCwyMyBAQAogICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5URVRIRVJfU1VQUE9SVEVELCBkZWZhdWx0VmFsKSAhPSAwKTsKICAgICAgICAgcmV0dXJuIHRldGhlckVuYWJsZWRJblNldHRpbmdzICYmIG1UZXRoZXJpbmdDb25maWdWYWxpZDsKICAgICB9CisKKyAgICAvLyBBbiBBUEkgTmV0d29ya1N0YXRlVHJhY2tlcnMgY2FuIGNhbGwgd2hlbiB0aGV5IGxvc2UgdGhlaXIgbmV0d29yay4KKyAgICAvLyBUaGlzIHdpbGwgYXV0b21hdGljYWxseSBiZSBjbGVhcmVkIGFmdGVyIFggc2Vjb25kcyBvciBhIG5ldHdvcmsgYmVjb21lcyBDT05ORUNURUQsCisgICAgLy8gd2hpY2hldmVyIGhhcHBlbnMgZmlyc3QuICBUaGUgdGltZXIgaXMgc3RhcnRlZCBieSB0aGUgZmlyc3QgY2FsbGVyIGFuZCBub3QKKyAgICAvLyByZXN0YXJ0ZWQgYnkgc3Vic2VxdWVudCBjYWxsZXJzLgorICAgIHB1YmxpYyB2b2lkIHJlcXVlc3ROZXR3b3JrVHJhbnNpdGlvbldha2Vsb2NrKFN0cmluZyBmb3JXaG9tKSB7CisgICAgICAgIGVuZm9yY2VDb25uZWN0aXZpdHlJbnRlcm5hbFBlcm1pc3Npb24oKTsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBpZiAobU5ldFRyYW5zaXRpb25XYWtlTG9jay5pc0hlbGQoKSkgcmV0dXJuOworICAgICAgICAgICAgbU5ldFRyYW5zaXRpb25XYWtlTG9ja1NlcmlhbE51bWJlcisrOworICAgICAgICAgICAgbU5ldFRyYW5zaXRpb25XYWtlTG9jay5hY3F1aXJlKCk7CisgICAgICAgICAgICBtTmV0VHJhbnNpdGlvbldha2VMb2NrQ2F1c2VkQnkgPSBmb3JXaG9tOworICAgICAgICB9CisgICAgICAgIG1IYW5kbGVyLnNlbmRNZXNzYWdlRGVsYXllZChtSGFuZGxlci5vYnRhaW5NZXNzYWdlKAorICAgICAgICAgICAgICAgIE5ldHdvcmtTdGF0ZVRyYWNrZXIuRVZFTlRfQ0xFQVJfTkVUX1RSQU5TSVRJT05fV0FLRUxPQ0ssCisgICAgICAgICAgICAgICAgbU5ldFRyYW5zaXRpb25XYWtlTG9ja1NlcmlhbE51bWJlciwgMCksCisgICAgICAgICAgICAgICAgbU5ldFRyYW5zaXRpb25XYWtlTG9ja1RpbWVvdXQpOworICAgICAgICByZXR1cm47CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvQ291bnRyeURldGVjdG9yU2VydmljZS5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvQ291bnRyeURldGVjdG9yU2VydmljZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwODFlYmUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9Db3VudHJ5RGV0ZWN0b3JTZXJ2aWNlLmphdmEKQEAgLTAsMCArMSwyMDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAorICogdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKyAqIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorICogV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCisgKiBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgorICogdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5zZXJ2ZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKKworaW1wb3J0IGNvbS5hbmRyb2lkLnNlcnZlci5sb2NhdGlvbi5Db21wcmVoZW5zaXZlQ291bnRyeURldGVjdG9yOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5sb2NhdGlvbi5Db3VudHJ5OworaW1wb3J0IGFuZHJvaWQubG9jYXRpb24uQ291bnRyeUxpc3RlbmVyOworaW1wb3J0IGFuZHJvaWQubG9jYXRpb24uSUNvdW50cnlEZXRlY3RvcjsKK2ltcG9ydCBhbmRyb2lkLmxvY2F0aW9uLklDb3VudHJ5TGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlByb2Nlc3M7CitpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC51dGlsLlNsb2c7CisKKy8qKgorICogVGhpcyBjbGFzcyBkZXRlY3RzIHRoZSBjb3VudHJ5IHRoYXQgdGhlIHVzZXIgaXMgaW4gdGhyb3VnaAorICoge0BsaW5rIENvbXByZWhlbnNpdmVDb3VudHJ5RGV0ZWN0b3J9LgorICoKKyAqIEBoaWRlCisgKi8KK3B1YmxpYyBjbGFzcyBDb3VudHJ5RGV0ZWN0b3JTZXJ2aWNlIGV4dGVuZHMgSUNvdW50cnlEZXRlY3Rvci5TdHViIGltcGxlbWVudHMgUnVubmFibGUgeworCisgICAgLyoqCisgICAgICogVGhlIGNsYXNzIHJlcHJlc2VudHMgdGhlIHJlbW90ZSBsaXN0ZW5lciwgaXQgd2lsbCBhbHNvIHJlbW92ZXMgaXRzZWxmCisgICAgICogZnJvbSBsaXN0ZW5lciBsaXN0IHdoZW4gdGhlIHJlbW90ZSBwcm9jZXNzIHdhcyBkaWVkLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgY2xhc3MgUmVjZWl2ZXIgaW1wbGVtZW50cyBJQmluZGVyLkRlYXRoUmVjaXBpZW50IHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBJQ291bnRyeUxpc3RlbmVyIG1MaXN0ZW5lcjsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBJQmluZGVyIG1LZXk7CisKKyAgICAgICAgcHVibGljIFJlY2VpdmVyKElDb3VudHJ5TGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgICAgIG1MaXN0ZW5lciA9IGxpc3RlbmVyOworICAgICAgICAgICAgbUtleSA9IGxpc3RlbmVyLmFzQmluZGVyKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBiaW5kZXJEaWVkKCkgeworICAgICAgICAgICAgcmVtb3ZlTGlzdGVuZXIobUtleSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvdGhlck9iaikgeworICAgICAgICAgICAgaWYgKG90aGVyT2JqIGluc3RhbmNlb2YgUmVjZWl2ZXIpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbUtleS5lcXVhbHMoKChSZWNlaXZlcikgb3RoZXJPYmopLm1LZXkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgICAgICByZXR1cm4gbUtleS5oYXNoQ29kZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIElDb3VudHJ5TGlzdGVuZXIgZ2V0TGlzdGVuZXIoKSB7CisgICAgICAgICAgICByZXR1cm4gbUxpc3RlbmVyOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFRBRyA9ICJDb3VudHJ5RGV0ZWN0b3JTZXJ2aWNlIjsKKworICAgIHByaXZhdGUgZmluYWwgSGFzaE1hcDxJQmluZGVyLCBSZWNlaXZlcj4gbVJlY2VpdmVyczsKKyAgICBwcml2YXRlIGZpbmFsIENvbnRleHQgbUNvbnRleHQ7CisgICAgcHJpdmF0ZSBDb21wcmVoZW5zaXZlQ291bnRyeURldGVjdG9yIG1Db3VudHJ5RGV0ZWN0b3I7CisgICAgcHJpdmF0ZSBib29sZWFuIG1TeXN0ZW1SZWFkeTsKKyAgICBwcml2YXRlIEhhbmRsZXIgbUhhbmRsZXI7CisgICAgcHJpdmF0ZSBDb3VudHJ5TGlzdGVuZXIgbUxvY2F0aW9uQmFzZWREZXRlY3Rvckxpc3RlbmVyOworCisgICAgcHVibGljIENvdW50cnlEZXRlY3RvclNlcnZpY2UoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHN1cGVyKCk7CisgICAgICAgIG1SZWNlaXZlcnMgPSBuZXcgSGFzaE1hcDxJQmluZGVyLCBSZWNlaXZlcj4oKTsKKyAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBDb3VudHJ5IGRldGVjdENvdW50cnkoKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFtU3lzdGVtUmVhZHkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSZW1vdGVFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbUNvdW50cnlEZXRlY3Rvci5kZXRlY3RDb3VudHJ5KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIHRoZSBJQ291bnRyeUxpc3RlbmVyIGludG8gdGhlIGxpc3RlbmVyIGxpc3QuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgYWRkQ291bnRyeUxpc3RlbmVyKElDb3VudHJ5TGlzdGVuZXIgbGlzdGVuZXIpIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgICAgICBpZiAoIW1TeXN0ZW1SZWFkeSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJlbW90ZUV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIGFkZExpc3RlbmVyKGxpc3RlbmVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgdGhlIElDb3VudHJ5TGlzdGVuZXIgZnJvbSB0aGUgbGlzdGVuZXIgbGlzdC4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCByZW1vdmVDb3VudHJ5TGlzdGVuZXIoSUNvdW50cnlMaXN0ZW5lciBsaXN0ZW5lcikgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghbVN5c3RlbVJlYWR5KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUmVtb3RlRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgcmVtb3ZlTGlzdGVuZXIobGlzdGVuZXIuYXNCaW5kZXIoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFkZExpc3RlbmVyKElDb3VudHJ5TGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChtUmVjZWl2ZXJzKSB7CisgICAgICAgICAgICBSZWNlaXZlciByID0gbmV3IFJlY2VpdmVyKGxpc3RlbmVyKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbGlzdGVuZXIuYXNCaW5kZXIoKS5saW5rVG9EZWF0aChyLCAwKTsKKyAgICAgICAgICAgICAgICBtUmVjZWl2ZXJzLnB1dChsaXN0ZW5lci5hc0JpbmRlcigpLCByKTsKKyAgICAgICAgICAgICAgICBpZiAobVJlY2VpdmVycy5zaXplKCkgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAiVGhlIGZpcnN0IGxpc3RlbmVyIGlzIGFkZGVkIik7CisgICAgICAgICAgICAgICAgICAgIHNldENvdW50cnlMaXN0ZW5lcihtTG9jYXRpb25CYXNlZERldGVjdG9yTGlzdGVuZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgImxpbmtUb0RlYXRoIGZhaWxlZDoiLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZW1vdmVMaXN0ZW5lcihJQmluZGVyIGtleSkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKG1SZWNlaXZlcnMpIHsKKyAgICAgICAgICAgIG1SZWNlaXZlcnMucmVtb3ZlKGtleSk7CisgICAgICAgICAgICBpZiAobVJlY2VpdmVycy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBzZXRDb3VudHJ5TGlzdGVuZXIobnVsbCk7CisgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgIk5vIGxpc3RlbmVyIGlzIGxlZnQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworCisgICAgcHJvdGVjdGVkIHZvaWQgbm90aWZ5UmVjZWl2ZXJzKENvdW50cnkgY291bnRyeSkgeworICAgICAgICBzeW5jaHJvbml6ZWQobVJlY2VpdmVycykgeworICAgICAgICAgICAgZm9yIChSZWNlaXZlciByZWNlaXZlciA6IG1SZWNlaXZlcnMudmFsdWVzKCkpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICByZWNlaXZlci5nZXRMaXN0ZW5lcigpLm9uQ291bnRyeURldGVjdGVkKGNvdW50cnkpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IFNoYWxsIHdlIHJlbW92ZSB0aGUgcmVjZWl2ZXI/CisgICAgICAgICAgICAgICAgICAgIFNsb2cuZShUQUcsICJub3RpZnlSZWNlaXZlcnMgZmFpbGVkOiIsIGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgc3lzdGVtUmVhZHkoKSB7CisgICAgICAgIC8vIFNoYWxsIHdlIHdhaXQgZm9yIHRoZSBpbml0aWFsaXphdGlvbiBmaW5pc2guCisgICAgICAgIFRocmVhZCB0aHJlYWQgPSBuZXcgVGhyZWFkKHRoaXMsICJDb3VudHJ5RGV0ZWN0b3JTZXJ2aWNlIik7CisgICAgICAgIHRocmVhZC5zdGFydCgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbml0aWFsaXplKCkgeworICAgICAgICBtQ291bnRyeURldGVjdG9yID0gbmV3IENvbXByZWhlbnNpdmVDb3VudHJ5RGV0ZWN0b3IobUNvbnRleHQpOworICAgICAgICBtTG9jYXRpb25CYXNlZERldGVjdG9yTGlzdGVuZXIgPSBuZXcgQ291bnRyeUxpc3RlbmVyKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgb25Db3VudHJ5RGV0ZWN0ZWQoZmluYWwgQ291bnRyeSBjb3VudHJ5KSB7CisgICAgICAgICAgICAgICAgbUhhbmRsZXIucG9zdChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeVJlY2VpdmVycyhjb3VudHJ5KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgUHJvY2Vzcy5zZXRUaHJlYWRQcmlvcml0eShQcm9jZXNzLlRIUkVBRF9QUklPUklUWV9CQUNLR1JPVU5EKTsKKyAgICAgICAgTG9vcGVyLnByZXBhcmUoKTsKKyAgICAgICAgbUhhbmRsZXIgPSBuZXcgSGFuZGxlcigpOworICAgICAgICBpbml0aWFsaXplKCk7CisgICAgICAgIG1TeXN0ZW1SZWFkeSA9IHRydWU7CisgICAgICAgIExvb3Blci5sb29wKCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0Q291bnRyeUxpc3RlbmVyKGZpbmFsIENvdW50cnlMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICBtSGFuZGxlci5wb3N0KG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIG1Db3VudHJ5RGV0ZWN0b3Iuc2V0Q291bnRyeUxpc3RlbmVyKGxpc3RlbmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgLy8gRm9yIHRlc3RpbmcKKyAgICBib29sZWFuIGlzU3lzdGVtUmVhZHkoKSB7CisgICAgICAgIHJldHVybiBtU3lzdGVtUmVhZHk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvRGVtb0RhdGFTZXQuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0RlbW9EYXRhU2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3Nzk4NWYuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvRGVtb0RhdGFTZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zZXJ2ZXI7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Bc3NldE1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwotaW1wb3J0IGFuZHJvaWQub3MuRW52aXJvbm1lbnQ7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0czsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuTWVkaWFTdG9yZS5JbWFnZXM7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkNvbmZpZzsKLWltcG9ydCBhbmRyb2lkLnV0aWwuU2xvZzsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotCi1wdWJsaWMgY2xhc3MgRGVtb0RhdGFTZXQKLXsKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgTE9HX1RBRyA9ICJEZW1vRGF0YVNldCI7Ci0KLSAgICBwcml2YXRlIENvbnRlbnRSZXNvbHZlciBtQ29udGVudFJlc29sdmVyOwotCi0gICAgcHVibGljIGZpbmFsIHZvaWQgYWRkKENvbnRleHQgY29udGV4dCkKLSAgICB7Ci0gICAgICAgIG1Db250ZW50UmVzb2x2ZXIgPSBjb250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpOwotCi0gICAgICAgIC8vIFJlbW92ZSBhbGwgdGhlIG9sZCBkYXRhCi0gICAgICAgIG1Db250ZW50UmVzb2x2ZXIuZGVsZXRlKENvbnRhY3RzLlBlb3BsZS5DT05URU5UX1VSSSwgbnVsbCwgbnVsbCk7Ci0KLSAgICAgICAgLy8gQWRkIHRoZSBuZXcgZGF0YQotICAgICAgICBhZGREZWZhdWx0RGF0YSgpOwotICAgICAgICAKLSAgICAgICAgLy8gQWRkIGltYWdlcyBmcm9tIC9hbmRyb2lkL2ltYWdlcwotICAgICAgICBhZGREZWZhdWx0SW1hZ2VzKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCB2b2lkIGFkZERlZmF1bHRJbWFnZXMoKQotICAgIHsKLSAgICAgICAgRmlsZSByb290RGlyZWN0b3J5ID0gRW52aXJvbm1lbnQuZ2V0Um9vdERpcmVjdG9yeSgpOwotICAgICAgICBTdHJpbmcgW10gZmlsZXMKLSAgICAgICAgICAgID0gbmV3IEZpbGUocm9vdERpcmVjdG9yeSwgImltYWdlcyIpLmxpc3QoKTsKLSAgICAgICAgaW50IGNvdW50ID0gZmlsZXMubGVuZ3RoOwotCi0gICAgICAgIGlmIChjb3VudCA9PSAwKSB7Ci0gICAgICAgICAgICBTbG9nLmkoTE9HX1RBRywgImFkZERlZmF1bHRJbWFnZXM6IG5vIGltYWdlcyBmb3VuZCEiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBmaWxlc1tpXTsKLSAgICAgICAgICAgIFN0cmluZyBwYXRoID0gcm9vdERpcmVjdG9yeSArICIvIiArIG5hbWU7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgSW1hZ2VzLk1lZGlhLmluc2VydEltYWdlKG1Db250ZW50UmVzb2x2ZXIsIHBhdGgsIG5hbWUsIG51bGwpOwotICAgICAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBTbG9nLmUoTE9HX1RBRywgIkZhaWxlZCB0byBpbXBvcnQgaW1hZ2UgIiArIHBhdGgsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgZmluYWwgdm9pZCBhZGREZWZhdWx0RGF0YSgpCi0gICAgewotICAgICAgICBTbG9nLmkoTE9HX1RBRywgIkFkZGluZyBkZWZhdWx0IGRhdGEuLi4iKTsKLQotLy8gICAgICAgYWRkSW1hZ2UoIlZpb2xldCIsICJpbWFnZXMvdmlvbGV0LnBuZyIpOwotLy8gICAgICAgYWRkSW1hZ2UoIkNvcmt5IiwgImltYWdlcy9jb3JreS5wbmciKTsKLQotICAgICAgICAvLyBQRU5ESU5HOiBzaG91bGQgdGhpcyBiZSBkb25lIGhlcmU/IT8hCi0gICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KAotICAgICAgICAgICAgICAgIEludGVudC5BQ1RJT05fQ0FMTCwgVXJpLmZyb21QYXJ0cygidm9pY2VtYWlsIiwgIiIsIG51bGwpKTsKLSAgICAgICAgYWRkU2hvcnRjdXQoIjEiLCBpbnRlbnQpOwotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgVXJpIGFkZEltYWdlKFN0cmluZyBuYW1lLCBVcmkgZmlsZSkKLSAgICB7Ci0gICAgICAgIENvbnRlbnRWYWx1ZXMgaW1hZ2V2ID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKLSAgICAgICAgaW1hZ2V2LnB1dCgibmFtZSIsIG5hbWUpOwotCi0gICAgICAgIFVyaSB1cmwgPSBudWxsOwotCi0gICAgICAgIEFzc2V0TWFuYWdlciBhc3MgPSBBc3NldE1hbmFnZXIuZ2V0U3lzdGVtKCk7Ci0gICAgICAgIElucHV0U3RyZWFtIGluID0gbnVsbDsKLSAgICAgICAgT3V0cHV0U3RyZWFtIG91dCA9IG51bGw7Ci0gICAgICAgIAotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgaW4gPSBhc3Mub3BlbihmaWxlLnRvU3RyaW5nKCkpOwotCi0gICAgICAgICAgICB1cmwgPSBtQ29udGVudFJlc29sdmVyLmluc2VydChJbWFnZXMuTWVkaWEuSU5URVJOQUxfQ09OVEVOVF9VUkksIGltYWdldik7Ci0gICAgICAgICAgICBvdXQgPSBtQ29udGVudFJlc29sdmVyLm9wZW5PdXRwdXRTdHJlYW0odXJsKTsKLQotICAgICAgICAgICAgZmluYWwgaW50IHNpemUgPSA4ICogMTAyNDsKLSAgICAgICAgICAgIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVtzaXplXTsKLQotICAgICAgICAgICAgaW50IGNvdW50ID0gMDsKLSAgICAgICAgICAgIGRvCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY291bnQgPSBpbi5yZWFkKGJ1ZiwgMCwgc2l6ZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGNvdW50ID4gMCkgewotICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGUoYnVmLCAwLCBjb3VudCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSB3aGlsZSAoY291bnQgPiAwKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNsb2cuZShMT0dfVEFHLCAiRmFpbGVkIHRvIGluc2VydCBpbWFnZSAnIiArIGZpbGUgKyAiJyIsIGUpOwotICAgICAgICAgICAgdXJsID0gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB1cmw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBVcmkgYWRkU2hvcnRjdXQoU3RyaW5nIHNob3J0Y3V0LCBJbnRlbnQgaW50ZW50KQotICAgIHsKLSAgICAgICAgaWYgKENvbmZpZy5MT0dWKSBTbG9nLnYoTE9HX1RBRywgImFkZFNob3J0Y3V0OiBzaG9ydGN1dD0iICsgc2hvcnRjdXQgKyAiLCBpbnRlbnQ9IiArIGludGVudCk7Ci0gICAgICAgIHJldHVybiBTZXR0aW5ncy5Cb29rbWFya3MuYWRkKG1Db250ZW50UmVzb2x2ZXIsIGludGVudCwgbnVsbCwgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnRjdXQgIT0gbnVsbCA/IHNob3J0Y3V0LmNoYXJBdCgwKSA6IDAsIDApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0RldmljZVBvbGljeU1hbmFnZXJTZXJ2aWNlLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9EZXZpY2VQb2xpY3lNYW5hZ2VyU2VydmljZS5qYXZhCmluZGV4IDE5ZDE0NmQuLjBjM2EwZTYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0RldmljZVBvbGljeU1hbmFnZXJTZXJ2aWNlLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvRGV2aWNlUG9saWN5TWFuYWdlclNlcnZpY2UuamF2YQpAQCAtMzMsNiArMzMsNyBAQAogaW1wb3J0IGFuZHJvaWQuYXBwLmFkbWluLklEZXZpY2VQb2xpY3lNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Ccm9hZGNhc3RSZWNlaXZlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOwpAQCAtNDYsNiArNDcsOCBAQAogaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQub3MuU2VydmljZU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Qcm94eTsKK2ltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzOwogaW1wb3J0IGFuZHJvaWQudXRpbC5TbG9nOwogaW1wb3J0IGFuZHJvaWQudXRpbC5QcmludFdyaXRlclByaW50ZXI7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlByaW50ZXI7CkBAIC01OCw0NiArNjEsNjYgQEAKIGltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEubmV0LkluZXRTb2NrZXRBZGRyZXNzOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlNldDsKIAogLyoqCiAgKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgZGV2aWNlIHBvbGljeSBBUElzLgogICovCiBwdWJsaWMgY2xhc3MgRGV2aWNlUG9saWN5TWFuYWdlclNlcnZpY2UgZXh0ZW5kcyBJRGV2aWNlUG9saWN5TWFuYWdlci5TdHViIHsKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJEZXZpY2VQb2xpY3lNYW5hZ2VyU2VydmljZSI7Ci0gICAgCisKICAgICBmaW5hbCBDb250ZXh0IG1Db250ZXh0OwogICAgIGZpbmFsIE15UGFja2FnZU1vbml0b3IgbU1vbml0b3I7CiAKICAgICBJUG93ZXJNYW5hZ2VyIG1JUG93ZXJNYW5hZ2VyOwotICAgIAorCiAgICAgaW50IG1BY3RpdmVQYXNzd29yZFF1YWxpdHkgPSBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfVU5TUEVDSUZJRUQ7CiAgICAgaW50IG1BY3RpdmVQYXNzd29yZExlbmd0aCA9IDA7CisgICAgaW50IG1BY3RpdmVQYXNzd29yZFVwcGVyQ2FzZSA9IDA7CisgICAgaW50IG1BY3RpdmVQYXNzd29yZExvd2VyQ2FzZSA9IDA7CisgICAgaW50IG1BY3RpdmVQYXNzd29yZExldHRlcnMgPSAwOworICAgIGludCBtQWN0aXZlUGFzc3dvcmROdW1lcmljID0gMDsKKyAgICBpbnQgbUFjdGl2ZVBhc3N3b3JkU3ltYm9scyA9IDA7CisgICAgaW50IG1BY3RpdmVQYXNzd29yZE5vbkxldHRlciA9IDA7CiAgICAgaW50IG1GYWlsZWRQYXNzd29yZEF0dGVtcHRzID0gMDsKLSAgICAKKwogICAgIGludCBtUGFzc3dvcmRPd25lciA9IC0xOwotICAgIAorCiAgICAgZmluYWwgSGFzaE1hcDxDb21wb25lbnROYW1lLCBBY3RpdmVBZG1pbj4gbUFkbWluTWFwCiAgICAgICAgICAgICA9IG5ldyBIYXNoTWFwPENvbXBvbmVudE5hbWUsIEFjdGl2ZUFkbWluPigpOwogICAgIGZpbmFsIEFycmF5TGlzdDxBY3RpdmVBZG1pbj4gbUFkbWluTGlzdAogICAgICAgICAgICAgPSBuZXcgQXJyYXlMaXN0PEFjdGl2ZUFkbWluPigpOwotICAgIAorCiAgICAgc3RhdGljIGNsYXNzIEFjdGl2ZUFkbWluIHsKICAgICAgICAgZmluYWwgRGV2aWNlQWRtaW5JbmZvIGluZm87Ci0gICAgICAgIAorCiAgICAgICAgIGludCBwYXNzd29yZFF1YWxpdHkgPSBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfVU5TUEVDSUZJRUQ7CiAgICAgICAgIGludCBtaW5pbXVtUGFzc3dvcmRMZW5ndGggPSAwOworICAgICAgICBpbnQgcGFzc3dvcmRIaXN0b3J5TGVuZ3RoID0gMDsKKyAgICAgICAgaW50IG1pbmltdW1QYXNzd29yZFVwcGVyQ2FzZSA9IDA7CisgICAgICAgIGludCBtaW5pbXVtUGFzc3dvcmRMb3dlckNhc2UgPSAwOworICAgICAgICBpbnQgbWluaW11bVBhc3N3b3JkTGV0dGVycyA9IDE7CisgICAgICAgIGludCBtaW5pbXVtUGFzc3dvcmROdW1lcmljID0gMTsKKyAgICAgICAgaW50IG1pbmltdW1QYXNzd29yZFN5bWJvbHMgPSAxOworICAgICAgICBpbnQgbWluaW11bVBhc3N3b3JkTm9uTGV0dGVyID0gMDsKICAgICAgICAgbG9uZyBtYXhpbXVtVGltZVRvVW5sb2NrID0gMDsKICAgICAgICAgaW50IG1heGltdW1GYWlsZWRQYXNzd29yZHNGb3JXaXBlID0gMDsKLSAgICAgICAgCisKKyAgICAgICAgLy8gVE9ETzogcmV2aWV3IGltcGxlbWVudGF0aW9uIGRlY2lzaW9ucyB3aXRoIGZyYW1ld29ya3MgdGVhbQorICAgICAgICBib29sZWFuIHNwZWNpZmllc0dsb2JhbFByb3h5ID0gZmFsc2U7CisgICAgICAgIFN0cmluZyBnbG9iYWxQcm94eVNwZWMgPSBudWxsOworICAgICAgICBTdHJpbmcgZ2xvYmFsUHJveHlFeGNsdXNpb25MaXN0ID0gbnVsbDsKKwogICAgICAgICBBY3RpdmVBZG1pbihEZXZpY2VBZG1pbkluZm8gX2luZm8pIHsKICAgICAgICAgICAgIGluZm8gPSBfaW5mbzsKICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICBpbnQgZ2V0VWlkKCkgeyByZXR1cm4gaW5mby5nZXRBY3Rpdml0eUluZm8oKS5hcHBsaWNhdGlvbkluZm8udWlkOyB9Ci0gICAgICAgIAorCiAgICAgICAgIHZvaWQgd3JpdGVUb1htbChYbWxTZXJpYWxpemVyIG91dCkKICAgICAgICAgICAgICAgICB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLCBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKICAgICAgICAgICAgIG91dC5zdGFydFRhZyhudWxsLCAicG9saWNpZXMiKTsKQEAgLTExMCw3ICsxMzMsNDIgQEAKICAgICAgICAgICAgICAgICBpZiAobWluaW11bVBhc3N3b3JkTGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgICAgICBvdXQuc3RhcnRUYWcobnVsbCwgIm1pbi1wYXNzd29yZC1sZW5ndGgiKTsKICAgICAgICAgICAgICAgICAgICAgb3V0LmF0dHJpYnV0ZShudWxsLCAidmFsdWUiLCBJbnRlZ2VyLnRvU3RyaW5nKG1pbmltdW1QYXNzd29yZExlbmd0aCkpOwotICAgICAgICAgICAgICAgICAgICBvdXQuZW5kVGFnKG51bGwsICJtbi1wYXNzd29yZC1sZW5ndGgiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LmVuZFRhZyhudWxsLCAibWluLXBhc3N3b3JkLWxlbmd0aCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZihwYXNzd29yZEhpc3RvcnlMZW5ndGggPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIG91dC5zdGFydFRhZyhudWxsLCAicGFzc3dvcmQtaGlzdG9yeS1sZW5ndGgiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LmF0dHJpYnV0ZShudWxsLCAidmFsdWUiLCBJbnRlZ2VyLnRvU3RyaW5nKHBhc3N3b3JkSGlzdG9yeUxlbmd0aCkpOworICAgICAgICAgICAgICAgICAgICBvdXQuZW5kVGFnKG51bGwsICJwYXNzd29yZC1oaXN0b3J5LWxlbmd0aCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobWluaW11bVBhc3N3b3JkVXBwZXJDYXNlID4gMCkgeworICAgICAgICAgICAgICAgICAgICBvdXQuc3RhcnRUYWcobnVsbCwgIm1pbi1wYXNzd29yZC11cHBlcmNhc2UiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LmF0dHJpYnV0ZShudWxsLCAidmFsdWUiLCBJbnRlZ2VyLnRvU3RyaW5nKG1pbmltdW1QYXNzd29yZFVwcGVyQ2FzZSkpOworICAgICAgICAgICAgICAgICAgICBvdXQuZW5kVGFnKG51bGwsICJtaW4tcGFzc3dvcmQtdXBwZXJjYXNlIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChtaW5pbXVtUGFzc3dvcmRMb3dlckNhc2UgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIG91dC5zdGFydFRhZyhudWxsLCAibWluLXBhc3N3b3JkLWxvd2VyY2FzZSIpOworICAgICAgICAgICAgICAgICAgICBvdXQuYXR0cmlidXRlKG51bGwsICJ2YWx1ZSIsIEludGVnZXIudG9TdHJpbmcobWluaW11bVBhc3N3b3JkTG93ZXJDYXNlKSk7CisgICAgICAgICAgICAgICAgICAgIG91dC5lbmRUYWcobnVsbCwgIm1pbi1wYXNzd29yZC1sb3dlcmNhc2UiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG1pbmltdW1QYXNzd29yZExldHRlcnMgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIG91dC5zdGFydFRhZyhudWxsLCAibWluLXBhc3N3b3JkLWxldHRlcnMiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LmF0dHJpYnV0ZShudWxsLCAidmFsdWUiLCBJbnRlZ2VyLnRvU3RyaW5nKG1pbmltdW1QYXNzd29yZExldHRlcnMpKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LmVuZFRhZyhudWxsLCAibWluLXBhc3N3b3JkLWxldHRlcnMiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG1pbmltdW1QYXNzd29yZE51bWVyaWMgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIG91dC5zdGFydFRhZyhudWxsLCAibWluLXBhc3N3b3JkLW51bWVyaWMiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LmF0dHJpYnV0ZShudWxsLCAidmFsdWUiLCBJbnRlZ2VyLnRvU3RyaW5nKG1pbmltdW1QYXNzd29yZE51bWVyaWMpKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LmVuZFRhZyhudWxsLCAibWluLXBhc3N3b3JkLW51bWVyaWMiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG1pbmltdW1QYXNzd29yZFN5bWJvbHMgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIG91dC5zdGFydFRhZyhudWxsLCAibWluLXBhc3N3b3JkLXN5bWJvbHMiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LmF0dHJpYnV0ZShudWxsLCAidmFsdWUiLCBJbnRlZ2VyLnRvU3RyaW5nKG1pbmltdW1QYXNzd29yZFN5bWJvbHMpKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LmVuZFRhZyhudWxsLCAibWluLXBhc3N3b3JkLXN5bWJvbHMiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG1pbmltdW1QYXNzd29yZE5vbkxldHRlciA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnN0YXJ0VGFnKG51bGwsICJtaW4tcGFzc3dvcmQtbm9ubGV0dGVyIik7CisgICAgICAgICAgICAgICAgICAgIG91dC5hdHRyaWJ1dGUobnVsbCwgInZhbHVlIiwgSW50ZWdlci50b1N0cmluZyhtaW5pbXVtUGFzc3dvcmROb25MZXR0ZXIpKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LmVuZFRhZyhudWxsLCAibWluLXBhc3N3b3JkLW5vbmxldHRlciIpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChtYXhpbXVtVGltZVRvVW5sb2NrICE9IERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9VTlNQRUNJRklFRCkgewpAQCAtMTIzLDggKzE4MSwyMyBAQAogICAgICAgICAgICAgICAgIG91dC5hdHRyaWJ1dGUobnVsbCwgInZhbHVlIiwgSW50ZWdlci50b1N0cmluZyhtYXhpbXVtRmFpbGVkUGFzc3dvcmRzRm9yV2lwZSkpOwogICAgICAgICAgICAgICAgIG91dC5lbmRUYWcobnVsbCwgIm1heC1mYWlsZWQtcGFzc3dvcmQtd2lwZSIpOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNwZWNpZmllc0dsb2JhbFByb3h5KSB7CisgICAgICAgICAgICAgICAgb3V0LnN0YXJ0VGFnKG51bGwsICJzcGVjaWZpZXMtZ2xvYmFsLXByb3h5Iik7CisgICAgICAgICAgICAgICAgb3V0LmF0dHJpYnV0ZShudWxsLCAidmFsdWUiLCBCb29sZWFuLnRvU3RyaW5nKHNwZWNpZmllc0dsb2JhbFByb3h5KSk7CisgICAgICAgICAgICAgICAgb3V0LmVuZFRhZyhudWxsLCAic3BlY2lmaWVzX2dsb2JhbF9wcm94eSIpOworICAgICAgICAgICAgICAgIGlmIChnbG9iYWxQcm94eVNwZWMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBvdXQuc3RhcnRUYWcobnVsbCwgImdsb2JhbC1wcm94eS1zcGVjIik7CisgICAgICAgICAgICAgICAgICAgIG91dC5hdHRyaWJ1dGUobnVsbCwgInZhbHVlIiwgZ2xvYmFsUHJveHlTcGVjKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LmVuZFRhZyhudWxsLCAiZ2xvYmFsLXByb3h5LXNwZWMiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGdsb2JhbFByb3h5RXhjbHVzaW9uTGlzdCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG91dC5zdGFydFRhZyhudWxsLCAiZ2xvYmFsLXByb3h5LWV4Y2x1c2lvbi1saXN0Iik7CisgICAgICAgICAgICAgICAgICAgIG91dC5hdHRyaWJ1dGUobnVsbCwgInZhbHVlIiwgZ2xvYmFsUHJveHlFeGNsdXNpb25MaXN0KTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LmVuZFRhZyhudWxsLCAiZ2xvYmFsLXByb3h5LWV4Y2x1c2lvbi1saXN0Iik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIHZvaWQgcmVhZEZyb21YbWwoWG1sUHVsbFBhcnNlciBwYXJzZXIpCiAgICAgICAgICAgICAgICAgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKICAgICAgICAgICAgIGludCBvdXRlckRlcHRoID0gcGFyc2VyLmdldERlcHRoKCk7CkBAIC0xNDMsMTkgKzIxNiw0OSBAQAogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIm1pbi1wYXNzd29yZC1sZW5ndGgiLmVxdWFscyh0YWcpKSB7CiAgICAgICAgICAgICAgICAgICAgIG1pbmltdW1QYXNzd29yZExlbmd0aCA9IEludGVnZXIucGFyc2VJbnQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKG51bGwsICJ2YWx1ZSIpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCJwYXNzd29yZC1oaXN0b3J5LWxlbmd0aCIuZXF1YWxzKHRhZykpIHsKKyAgICAgICAgICAgICAgICAgICAgcGFzc3dvcmRIaXN0b3J5TGVuZ3RoID0gSW50ZWdlci5wYXJzZUludCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUobnVsbCwgInZhbHVlIikpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIm1pbi1wYXNzd29yZC11cHBlcmNhc2UiLmVxdWFscyh0YWcpKSB7CisgICAgICAgICAgICAgICAgICAgIG1pbmltdW1QYXNzd29yZFVwcGVyQ2FzZSA9IEludGVnZXIucGFyc2VJbnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKG51bGwsICJ2YWx1ZSIpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCJtaW4tcGFzc3dvcmQtbG93ZXJjYXNlIi5lcXVhbHModGFnKSkgeworICAgICAgICAgICAgICAgICAgICBtaW5pbXVtUGFzc3dvcmRMb3dlckNhc2UgPSBJbnRlZ2VyLnBhcnNlSW50KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCAidmFsdWUiKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgibWluLXBhc3N3b3JkLWxldHRlcnMiLmVxdWFscyh0YWcpKSB7CisgICAgICAgICAgICAgICAgICAgIG1pbmltdW1QYXNzd29yZExldHRlcnMgPSBJbnRlZ2VyLnBhcnNlSW50KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCAidmFsdWUiKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgibWluLXBhc3N3b3JkLW51bWVyaWMiLmVxdWFscyh0YWcpKSB7CisgICAgICAgICAgICAgICAgICAgIG1pbmltdW1QYXNzd29yZE51bWVyaWMgPSBJbnRlZ2VyLnBhcnNlSW50KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCAidmFsdWUiKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgibWluLXBhc3N3b3JkLXN5bWJvbHMiLmVxdWFscyh0YWcpKSB7CisgICAgICAgICAgICAgICAgICAgIG1pbmltdW1QYXNzd29yZFN5bWJvbHMgPSBJbnRlZ2VyLnBhcnNlSW50KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCAidmFsdWUiKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgibWluLXBhc3N3b3JkLW5vbmxldHRlciIuZXF1YWxzKHRhZykpIHsKKyAgICAgICAgICAgICAgICAgICAgbWluaW11bVBhc3N3b3JkTm9uTGV0dGVyID0gSW50ZWdlci5wYXJzZUludCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUobnVsbCwgInZhbHVlIikpOwogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIm1heC10aW1lLXRvLXVubG9jayIuZXF1YWxzKHRhZykpIHsKICAgICAgICAgICAgICAgICAgICAgbWF4aW11bVRpbWVUb1VubG9jayA9IExvbmcucGFyc2VMb25nKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCAidmFsdWUiKSk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgibWF4LWZhaWxlZC1wYXNzd29yZC13aXBlIi5lcXVhbHModGFnKSkgewogICAgICAgICAgICAgICAgICAgICBtYXhpbXVtRmFpbGVkUGFzc3dvcmRzRm9yV2lwZSA9IEludGVnZXIucGFyc2VJbnQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKG51bGwsICJ2YWx1ZSIpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCJzcGVjaWZpZXMtZ2xvYmFsLXByb3h5Ii5lcXVhbHModGFnKSkgeworICAgICAgICAgICAgICAgICAgICBzcGVjaWZpZXNHbG9iYWxQcm94eSA9IEJvb2xlYW4uZ2V0Qm9vbGVhbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUobnVsbCwgInZhbHVlIikpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoImdsb2JhbC1wcm94eS1zcGVjIi5lcXVhbHModGFnKSkgeworICAgICAgICAgICAgICAgICAgICBnbG9iYWxQcm94eVNwZWMgPQorICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKG51bGwsICJ2YWx1ZSIpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoImdsb2JhbC1wcm94eS1leGNsdXNpb24tbGlzdCIuZXF1YWxzKHRhZykpIHsKKyAgICAgICAgICAgICAgICAgICAgZ2xvYmFsUHJveHlFeGNsdXNpb25MaXN0ID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCAidmFsdWUiKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBTbG9nLncoVEFHLCAiVW5rbm93biBhZG1pbiB0YWc6ICIgKyB0YWcpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBYbWxVdGlscy5za2lwQ3VycmVudFRhZyhwYXJzZXIpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIHZvaWQgZHVtcChTdHJpbmcgcHJlZml4LCBQcmludFdyaXRlciBwdykgewogICAgICAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnQoInVpZD0iKTsgcHcucHJpbnRsbihnZXRVaWQoKSk7CiAgICAgICAgICAgICBwdy5wcmludChwcmVmaXgpOyBwdy5wcmludGxuKCJwb2xpY2llczoiKTsKQEAgLTE2NiwyMyArMjY5LDQ3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnQoInBhc3N3b3JkUXVhbGl0eT0weCIpOwotICAgICAgICAgICAgICAgICAgICBwdy5wcmludChJbnRlZ2VyLnRvSGV4U3RyaW5nKHBhc3N3b3JkUXVhbGl0eSkpOwotICAgICAgICAgICAgICAgICAgICBwdy5wcmludCgiIG1pbmltdW1QYXNzd29yZExlbmd0aD0iKTsKKyAgICAgICAgICAgICAgICAgICAgcHcucHJpbnRsbihJbnRlZ2VyLnRvSGV4U3RyaW5nKHBhc3N3b3JkUXVhbGl0eSkpOworICAgICAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnQoIm1pbmltdW1QYXNzd29yZExlbmd0aD0iKTsKICAgICAgICAgICAgICAgICAgICAgcHcucHJpbnRsbihtaW5pbXVtUGFzc3dvcmRMZW5ndGgpOworICAgICAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnQoInBhc3N3b3JkSGlzdG9yeUxlbmd0aD0iKTsKKyAgICAgICAgICAgICAgICAgICAgcHcucHJpbnRsbihwYXNzd29yZEhpc3RvcnlMZW5ndGgpOworICAgICAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnQoIm1pbmltdW1QYXNzd29yZFVwcGVyQ2FzZT0iKTsKKyAgICAgICAgICAgICAgICAgICAgcHcucHJpbnRsbihtaW5pbXVtUGFzc3dvcmRVcHBlckNhc2UpOworICAgICAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnQoIm1pbmltdW1QYXNzd29yZExvd2VyQ2FzZT0iKTsKKyAgICAgICAgICAgICAgICAgICAgcHcucHJpbnRsbihtaW5pbXVtUGFzc3dvcmRMb3dlckNhc2UpOworICAgICAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnQoIm1pbmltdW1QYXNzd29yZExldHRlcnM9Iik7CisgICAgICAgICAgICAgICAgICAgIHB3LnByaW50bG4obWluaW11bVBhc3N3b3JkTGV0dGVycyk7CisgICAgICAgICAgICBwdy5wcmludChwcmVmaXgpOyBwdy5wcmludCgibWluaW11bVBhc3N3b3JkTnVtZXJpYz0iKTsKKyAgICAgICAgICAgICAgICAgICAgcHcucHJpbnRsbihtaW5pbXVtUGFzc3dvcmROdW1lcmljKTsKKyAgICAgICAgICAgIHB3LnByaW50KHByZWZpeCk7IHB3LnByaW50KCJtaW5pbXVtUGFzc3dvcmRTeW1ib2xzPSIpOworICAgICAgICAgICAgICAgICAgICBwdy5wcmludGxuKG1pbmltdW1QYXNzd29yZFN5bWJvbHMpOworICAgICAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnQoIm1pbmltdW1QYXNzd29yZE5vbkxldHRlcj0iKTsKKyAgICAgICAgICAgICAgICAgICAgcHcucHJpbnRsbihtaW5pbXVtUGFzc3dvcmROb25MZXR0ZXIpOwogICAgICAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnQoIm1heGltdW1UaW1lVG9VbmxvY2s9Iik7CiAgICAgICAgICAgICAgICAgICAgIHB3LnByaW50bG4obWF4aW11bVRpbWVUb1VubG9jayk7CiAgICAgICAgICAgICBwdy5wcmludChwcmVmaXgpOyBwdy5wcmludCgibWF4aW11bUZhaWxlZFBhc3N3b3Jkc0ZvcldpcGU9Iik7CiAgICAgICAgICAgICAgICAgICAgIHB3LnByaW50bG4obWF4aW11bUZhaWxlZFBhc3N3b3Jkc0ZvcldpcGUpOworICAgICAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnQoInNwZWNpZmllc0dsb2JhbFByb3h5PSIpOworICAgICAgICAgICAgICAgICAgICBwdy5wcmludGxuKHNwZWNpZmllc0dsb2JhbFByb3h5KTsKKyAgICAgICAgICAgIGlmIChnbG9iYWxQcm94eVNwZWMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHB3LnByaW50KHByZWZpeCk7IHB3LnByaW50KCJnbG9iYWxQcm94eVNwZWM9Iik7CisgICAgICAgICAgICAgICAgICAgICAgICBwdy5wcmludGxuKGdsb2JhbFByb3h5U3BlYyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZ2xvYmFsUHJveHlFeGNsdXNpb25MaXN0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBwdy5wcmludChwcmVmaXgpOyBwdy5wcmludCgiZ2xvYmFsUHJveHlFY2x1c2lvbkxpc3Q9Iik7CisgICAgICAgICAgICAgICAgICAgICAgICBwdy5wcmludGxuKGdsb2JhbFByb3h5RXhjbHVzaW9uTGlzdCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICBjbGFzcyBNeVBhY2thZ2VNb25pdG9yIGV4dGVuZHMgUGFja2FnZU1vbml0b3IgewogICAgICAgICBwdWJsaWMgdm9pZCBvblNvbWVQYWNrYWdlc0NoYW5nZWQoKSB7CiAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKERldmljZVBvbGljeU1hbmFnZXJTZXJ2aWNlLnRoaXMpIHsKICAgICAgICAgICAgICAgICBib29sZWFuIHJlbW92ZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICBmb3IgKGludCBpPW1BZG1pbkxpc3Quc2l6ZSgpLTE7IGk+PTA7IGktLSkgewogICAgICAgICAgICAgICAgICAgICBBY3RpdmVBZG1pbiBhYSA9IG1BZG1pbkxpc3QuZ2V0KGkpOwotICAgICAgICAgICAgICAgICAgICBpbnQgY2hhbmdlID0gaXNQYWNrYWdlRGlzYXBwZWFyaW5nKGFhLmluZm8uZ2V0UGFja2FnZU5hbWUoKSk7IAorICAgICAgICAgICAgICAgICAgICBpbnQgY2hhbmdlID0gaXNQYWNrYWdlRGlzYXBwZWFyaW5nKGFhLmluZm8uZ2V0UGFja2FnZU5hbWUoKSk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChjaGFuZ2UgPT0gUEFDS0FHRV9QRVJNQU5FTlRfQ0hBTkdFCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgY2hhbmdlID09IFBBQ0tBR0VfVEVNUE9SQVJZX0NIQU5HRSkgewogICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgIkFkbWluIHVuZXhwZWN0ZWRseSB1bmluc3RhbGxlZDogIgpAQCAtMjA3LDcgKzMzNCw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBJbnN0YW50aWF0ZXMgdGhlIHNlcnZpY2UuCiAgICAgICovCkBAIC0yMjQsNyArMzUxLDcgQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gbUlQb3dlck1hbmFnZXI7CiAgICAgfQotICAgIAorCiAgICAgQWN0aXZlQWRtaW4gZ2V0QWN0aXZlQWRtaW5VbmNoZWNrZWRMb2NrZWQoQ29tcG9uZW50TmFtZSB3aG8pIHsKICAgICAgICAgQWN0aXZlQWRtaW4gYWRtaW4gPSBtQWRtaW5NYXAuZ2V0KHdobyk7CiAgICAgICAgIGlmIChhZG1pbiAhPSBudWxsCkBAIC0yMzQsNyArMzYxLDcgQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9Ci0gICAgCisKICAgICBBY3RpdmVBZG1pbiBnZXRBY3RpdmVBZG1pbkZvckNhbGxlckxvY2tlZChDb21wb25lbnROYW1lIHdobywgaW50IHJlcVBvbGljeSkKICAgICAgICAgICAgIHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbiB7CiAgICAgICAgIGZpbmFsIGludCBjYWxsaW5nVWlkID0gQmluZGVyLmdldENhbGxpbmdVaWQoKTsKQEAgLTI2NSwxMyArMzkyLDEzIEBACiAgICAgICAgICAgICAgICAgICAgICsgQmluZGVyLmdldENhbGxpbmdVaWQoKSArICIgZm9yIHBvbGljeSAjIiArIHJlcVBvbGljeSk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICB2b2lkIHNlbmRBZG1pbkNvbW1hbmRMb2NrZWQoQWN0aXZlQWRtaW4gYWRtaW4sIFN0cmluZyBhY3Rpb24pIHsKICAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoYWN0aW9uKTsKICAgICAgICAgaW50ZW50LnNldENvbXBvbmVudChhZG1pbi5pbmZvLmdldENvbXBvbmVudCgpKTsKICAgICAgICAgbUNvbnRleHQuc2VuZEJyb2FkY2FzdChpbnRlbnQpOwogICAgIH0KLSAgICAKKwogICAgIHZvaWQgc2VuZEFkbWluQ29tbWFuZExvY2tlZChTdHJpbmcgYWN0aW9uLCBpbnQgcmVxUG9saWN5KSB7CiAgICAgICAgIGZpbmFsIGludCBOID0gbUFkbWluTGlzdC5zaXplKCk7CiAgICAgICAgIGlmIChOID4gMCkgewpAQCAtMjgzLDE5ICs0MTAsMjQgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIHZvaWQgcmVtb3ZlQWN0aXZlQWRtaW5Mb2NrZWQoQ29tcG9uZW50TmFtZSBhZG1pblJlY2VpdmVyKSB7CiAgICAgICAgIEFjdGl2ZUFkbWluIGFkbWluID0gZ2V0QWN0aXZlQWRtaW5VbmNoZWNrZWRMb2NrZWQoYWRtaW5SZWNlaXZlcik7CiAgICAgICAgIGlmIChhZG1pbiAhPSBudWxsKSB7CisgICAgICAgICAgICBib29sZWFuIGRvUHJveHlDbGVhbnVwID0KKyAgICAgICAgICAgICAgICBhZG1pbi5pbmZvLnVzZXNQb2xpY3koRGV2aWNlQWRtaW5JbmZvLlVTRVNfUE9MSUNZX1NFVFNfR0xPQkFMX1BST1hZKTsKICAgICAgICAgICAgIHNlbmRBZG1pbkNvbW1hbmRMb2NrZWQoYWRtaW4sCiAgICAgICAgICAgICAgICAgICAgIERldmljZUFkbWluUmVjZWl2ZXIuQUNUSU9OX0RFVklDRV9BRE1JTl9ESVNBQkxFRCk7CiAgICAgICAgICAgICAvLyBYWFggbmVlZCB0byB3YWl0IGZvciBpdCB0byBjb21wbGV0ZS4KICAgICAgICAgICAgIG1BZG1pbkxpc3QucmVtb3ZlKGFkbWluKTsKICAgICAgICAgICAgIG1BZG1pbk1hcC5yZW1vdmUoYWRtaW5SZWNlaXZlcik7CiAgICAgICAgICAgICB2YWxpZGF0ZVBhc3N3b3JkT3duZXJMb2NrZWQoKTsKKyAgICAgICAgICAgIGlmIChkb1Byb3h5Q2xlYW51cCkgeworICAgICAgICAgICAgICAgIHJlc2V0R2xvYmFsUHJveHkoKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIHB1YmxpYyBEZXZpY2VBZG1pbkluZm8gZmluZEFkbWluKENvbXBvbmVudE5hbWUgYWRtaW5OYW1lKSB7CiAgICAgICAgIEludGVudCByZXNvbHZlSW50ZW50ID0gbmV3IEludGVudCgpOwogICAgICAgICByZXNvbHZlSW50ZW50LnNldENvbXBvbmVudChhZG1pbk5hbWUpOwpAQCAtMzA0LDcgKzQzNiw3IEBACiAgICAgICAgIGlmIChpbmZvcyA9PSBudWxsIHx8IGluZm9zLnNpemUoKSA8PSAwKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbmtub3duIGFkbWluOiAiICsgYWRtaW5OYW1lKTsKICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICB0cnkgewogICAgICAgICAgICAgcmV0dXJuIG5ldyBEZXZpY2VBZG1pbkluZm8obUNvbnRleHQsIGluZm9zLmdldCgwKSk7CiAgICAgICAgIH0gY2F0Y2ggKFhtbFB1bGxQYXJzZXJFeGNlcHRpb24gZSkgewpAQCAtMzE1LDcgKzQ0Nyw3IEBACiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIHByaXZhdGUgc3RhdGljIEpvdXJuYWxlZEZpbGUgbWFrZUpvdXJuYWxlZEZpbGUoKSB7CiAgICAgICAgIGZpbmFsIFN0cmluZyBiYXNlID0gIi9kYXRhL3N5c3RlbS9kZXZpY2VfcG9saWNpZXMueG1sIjsKICAgICAgICAgcmV0dXJuIG5ldyBKb3VybmFsZWRGaWxlKG5ldyBGaWxlKGJhc2UpLCBuZXcgRmlsZShiYXNlICsgIi50bXAiKSk7CkBAIC0zMzEsNyArNDYzLDcgQEAKICAgICAgICAgICAgIG91dC5zdGFydERvY3VtZW50KG51bGwsIHRydWUpOwogCiAgICAgICAgICAgICBvdXQuc3RhcnRUYWcobnVsbCwgInBvbGljaWVzIik7Ci0gICAgICAgICAgICAKKwogICAgICAgICAgICAgZmluYWwgaW50IE4gPSBtQWRtaW5MaXN0LnNpemUoKTsKICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxOOyBpKyspIHsKICAgICAgICAgICAgICAgICBBY3RpdmVBZG1pbiBhcCA9IG1BZG1pbkxpc3QuZ2V0KGkpOwpAQCAtMzQyLDI2ICs0NzQsMzYgQEAKICAgICAgICAgICAgICAgICAgICAgb3V0LmVuZFRhZyhudWxsLCAiYWRtaW4iKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAKKwogICAgICAgICAgICAgaWYgKG1QYXNzd29yZE93bmVyID49IDApIHsKICAgICAgICAgICAgICAgICBvdXQuc3RhcnRUYWcobnVsbCwgInBhc3N3b3JkLW93bmVyIik7CiAgICAgICAgICAgICAgICAgb3V0LmF0dHJpYnV0ZShudWxsLCAidmFsdWUiLCBJbnRlZ2VyLnRvU3RyaW5nKG1QYXNzd29yZE93bmVyKSk7CiAgICAgICAgICAgICAgICAgb3V0LmVuZFRhZyhudWxsLCAicGFzc3dvcmQtb3duZXIiKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICBpZiAobUZhaWxlZFBhc3N3b3JkQXR0ZW1wdHMgIT0gMCkgewogICAgICAgICAgICAgICAgIG91dC5zdGFydFRhZyhudWxsLCAiZmFpbGVkLXBhc3N3b3JkLWF0dGVtcHRzIik7CiAgICAgICAgICAgICAgICAgb3V0LmF0dHJpYnV0ZShudWxsLCAidmFsdWUiLCBJbnRlZ2VyLnRvU3RyaW5nKG1GYWlsZWRQYXNzd29yZEF0dGVtcHRzKSk7CiAgICAgICAgICAgICAgICAgb3V0LmVuZFRhZyhudWxsLCAiZmFpbGVkLXBhc3N3b3JkLWF0dGVtcHRzIik7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChtQWN0aXZlUGFzc3dvcmRRdWFsaXR5ICE9IDAgfHwgbUFjdGl2ZVBhc3N3b3JkTGVuZ3RoICE9IDApIHsKKworICAgICAgICAgICAgaWYgKG1BY3RpdmVQYXNzd29yZFF1YWxpdHkgIT0gMCB8fCBtQWN0aXZlUGFzc3dvcmRMZW5ndGggIT0gMAorICAgICAgICAgICAgICAgICAgICB8fCBtQWN0aXZlUGFzc3dvcmRVcHBlckNhc2UgIT0gMCB8fCBtQWN0aXZlUGFzc3dvcmRMb3dlckNhc2UgIT0gMAorICAgICAgICAgICAgICAgICAgICB8fCBtQWN0aXZlUGFzc3dvcmRMZXR0ZXJzICE9IDAgfHwgbUFjdGl2ZVBhc3N3b3JkTnVtZXJpYyAhPSAwCisgICAgICAgICAgICAgICAgICAgIHx8IG1BY3RpdmVQYXNzd29yZFN5bWJvbHMgIT0gMCB8fCBtQWN0aXZlUGFzc3dvcmROb25MZXR0ZXIgIT0gMCkgewogICAgICAgICAgICAgICAgIG91dC5zdGFydFRhZyhudWxsLCAiYWN0aXZlLXBhc3N3b3JkIik7CiAgICAgICAgICAgICAgICAgb3V0LmF0dHJpYnV0ZShudWxsLCAicXVhbGl0eSIsIEludGVnZXIudG9TdHJpbmcobUFjdGl2ZVBhc3N3b3JkUXVhbGl0eSkpOwogICAgICAgICAgICAgICAgIG91dC5hdHRyaWJ1dGUobnVsbCwgImxlbmd0aCIsIEludGVnZXIudG9TdHJpbmcobUFjdGl2ZVBhc3N3b3JkTGVuZ3RoKSk7CisgICAgICAgICAgICAgICAgb3V0LmF0dHJpYnV0ZShudWxsLCAidXBwZXJjYXNlIiwgSW50ZWdlci50b1N0cmluZyhtQWN0aXZlUGFzc3dvcmRVcHBlckNhc2UpKTsKKyAgICAgICAgICAgICAgICBvdXQuYXR0cmlidXRlKG51bGwsICJsb3dlcmNhc2UiLCBJbnRlZ2VyLnRvU3RyaW5nKG1BY3RpdmVQYXNzd29yZExvd2VyQ2FzZSkpOworICAgICAgICAgICAgICAgIG91dC5hdHRyaWJ1dGUobnVsbCwgImxldHRlcnMiLCBJbnRlZ2VyLnRvU3RyaW5nKG1BY3RpdmVQYXNzd29yZExldHRlcnMpKTsKKyAgICAgICAgICAgICAgICBvdXQuYXR0cmlidXRlKG51bGwsICJudW1lcmljIiwgSW50ZWdlcgorICAgICAgICAgICAgICAgICAgICAgICAgLnRvU3RyaW5nKG1BY3RpdmVQYXNzd29yZE51bWVyaWMpKTsKKyAgICAgICAgICAgICAgICBvdXQuYXR0cmlidXRlKG51bGwsICJzeW1ib2xzIiwgSW50ZWdlci50b1N0cmluZyhtQWN0aXZlUGFzc3dvcmRTeW1ib2xzKSk7CisgICAgICAgICAgICAgICAgb3V0LmF0dHJpYnV0ZShudWxsLCAibm9ubGV0dGVyIiwgSW50ZWdlci50b1N0cmluZyhtQWN0aXZlUGFzc3dvcmROb25MZXR0ZXIpKTsKICAgICAgICAgICAgICAgICBvdXQuZW5kVGFnKG51bGwsICJhY3RpdmUtcGFzc3dvcmQiKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICBvdXQuZW5kVGFnKG51bGwsICJwb2xpY2llcyIpOwogCiAgICAgICAgICAgICBvdXQuZW5kRG9jdW1lbnQoKTsKQEAgLTQzOSw2ICs1ODEsMTggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUobnVsbCwgInF1YWxpdHkiKSk7CiAgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVQYXNzd29yZExlbmd0aCA9IEludGVnZXIucGFyc2VJbnQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKG51bGwsICJsZW5ndGgiKSk7CisgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVQYXNzd29yZFVwcGVyQ2FzZSA9IEludGVnZXIucGFyc2VJbnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKG51bGwsICJ1cHBlcmNhc2UiKSk7CisgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVQYXNzd29yZExvd2VyQ2FzZSA9IEludGVnZXIucGFyc2VJbnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKG51bGwsICJsb3dlcmNhc2UiKSk7CisgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVQYXNzd29yZExldHRlcnMgPSBJbnRlZ2VyLnBhcnNlSW50KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCAibGV0dGVycyIpKTsKKyAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZVBhc3N3b3JkTnVtZXJpYyA9IEludGVnZXIucGFyc2VJbnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKG51bGwsICJudW1lcmljIikpOworICAgICAgICAgICAgICAgICAgICBtQWN0aXZlUGFzc3dvcmRTeW1ib2xzID0gSW50ZWdlci5wYXJzZUludCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUobnVsbCwgInN5bWJvbHMiKSk7CisgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVQYXNzd29yZE5vbkxldHRlciA9IEludGVnZXIucGFyc2VJbnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKG51bGwsICJub25sZXR0ZXIiKSk7CiAgICAgICAgICAgICAgICAgICAgIFhtbFV0aWxzLnNraXBDdXJyZW50VGFnKHBhcnNlcik7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgIlVua25vd24gdGFnOiAiICsgdGFnKTsKQEAgLTQ3NiwxMCArNjMwLDE2IEBACiAgICAgICAgICAgICAgICAgICAgICsgSW50ZWdlci50b0hleFN0cmluZyh1dGlscy5nZXRBY3RpdmVQYXNzd29yZFF1YWxpdHkoKSkpOwogICAgICAgICAgICAgbUFjdGl2ZVBhc3N3b3JkUXVhbGl0eSA9IERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9VTlNQRUNJRklFRDsKICAgICAgICAgICAgIG1BY3RpdmVQYXNzd29yZExlbmd0aCA9IDA7CisgICAgICAgICAgICBtQWN0aXZlUGFzc3dvcmRVcHBlckNhc2UgPSAwOworICAgICAgICAgICAgbUFjdGl2ZVBhc3N3b3JkTG93ZXJDYXNlID0gMDsKKyAgICAgICAgICAgIG1BY3RpdmVQYXNzd29yZExldHRlcnMgPSAwOworICAgICAgICAgICAgbUFjdGl2ZVBhc3N3b3JkTnVtZXJpYyA9IDA7CisgICAgICAgICAgICBtQWN0aXZlUGFzc3dvcmRTeW1ib2xzID0gMDsKKyAgICAgICAgICAgIG1BY3RpdmVQYXNzd29yZE5vbkxldHRlciA9IDA7CiAgICAgICAgIH0KLSAgICAgICAgCisKICAgICAgICAgdmFsaWRhdGVQYXNzd29yZE93bmVyTG9ja2VkKCk7Ci0gICAgICAgIAorCiAgICAgICAgIGxvbmcgdGltZU1zID0gZ2V0TWF4aW11bVRpbWVUb0xvY2sobnVsbCk7CiAgICAgICAgIGlmICh0aW1lTXMgPD0gMCkgewogICAgICAgICAgICAgdGltZU1zID0gSW50ZWdlci5NQVhfVkFMVUU7CkBAIC00OTgsMTIgKzY1OCwxMyBAQAogICAgICAgICAgICAgY2FzZSBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfTlVNRVJJQzoKICAgICAgICAgICAgIGNhc2UgRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX0FMUEhBQkVUSUM6CiAgICAgICAgICAgICBjYXNlIERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9BTFBIQU5VTUVSSUM6CisgICAgICAgICAgICBjYXNlIERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9DT01QTEVYOgogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIHF1YWxpdHkgY29uc3RhbnQ6IDB4IgogICAgICAgICAgICAgICAgICsgSW50ZWdlci50b0hleFN0cmluZyhxdWFsaXR5KSk7CiAgICAgfQotICAgIAorCiAgICAgdm9pZCB2YWxpZGF0ZVBhc3N3b3JkT3duZXJMb2NrZWQoKSB7CiAgICAgICAgIGlmIChtUGFzc3dvcmRPd25lciA+PSAwKSB7CiAgICAgICAgICAgICBib29sZWFuIGhhdmVPd25lciA9IGZhbHNlOwpAQCAtNTIwLDE3ICs2ODEsMTcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIHB1YmxpYyB2b2lkIHN5c3RlbVJlYWR5KCkgewogICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKICAgICAgICAgICAgIGxvYWRTZXR0aW5nc0xvY2tlZCgpOwogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgcHVibGljIHZvaWQgc2V0QWN0aXZlQWRtaW4oQ29tcG9uZW50TmFtZSBhZG1pblJlY2VpdmVyKSB7CiAgICAgICAgIG1Db250ZXh0LmVuZm9yY2VDYWxsaW5nT3JTZWxmUGVybWlzc2lvbigKICAgICAgICAgICAgICAgICBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQklORF9ERVZJQ0VfQURNSU4sIG51bGwpOwotICAgICAgICAKKwogICAgICAgICBEZXZpY2VBZG1pbkluZm8gaW5mbyA9IGZpbmRBZG1pbihhZG1pblJlY2VpdmVyKTsKICAgICAgICAgaWYgKGluZm8gPT0gbnVsbCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQmFkIGFkbWluOiAiICsgYWRtaW5SZWNlaXZlcik7CkBAIC01NTIsMTMgKzcxMywxMyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgcHVibGljIGJvb2xlYW4gaXNBZG1pbkFjdGl2ZShDb21wb25lbnROYW1lIGFkbWluUmVjZWl2ZXIpIHsKICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CiAgICAgICAgICAgICByZXR1cm4gZ2V0QWN0aXZlQWRtaW5VbmNoZWNrZWRMb2NrZWQoYWRtaW5SZWNlaXZlcikgIT0gbnVsbDsKICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIHB1YmxpYyBMaXN0PENvbXBvbmVudE5hbWU+IGdldEFjdGl2ZUFkbWlucygpIHsKICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CiAgICAgICAgICAgICBmaW5hbCBpbnQgTiA9IG1BZG1pbkxpc3Quc2l6ZSgpOwpAQCAtNTcyLDcgKzczMyw3IEBACiAgICAgICAgICAgICByZXR1cm4gcmVzOwogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgcHVibGljIGJvb2xlYW4gcGFja2FnZUhhc0FjdGl2ZUFkbWlucyhTdHJpbmcgcGFja2FnZU5hbWUpIHsKICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CiAgICAgICAgICAgICBmaW5hbCBpbnQgTiA9IG1BZG1pbkxpc3Quc2l6ZSgpOwpAQCAtNTg0LDcgKzc0NSw3IEBACiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICBwdWJsaWMgdm9pZCByZW1vdmVBY3RpdmVBZG1pbihDb21wb25lbnROYW1lIGFkbWluUmVjZWl2ZXIpIHsKICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CiAgICAgICAgICAgICBBY3RpdmVBZG1pbiBhZG1pbiA9IGdldEFjdGl2ZUFkbWluVW5jaGVja2VkTG9ja2VkKGFkbWluUmVjZWl2ZXIpOwpAQCAtNjAzLDEwICs3NjQsMTAgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIHB1YmxpYyB2b2lkIHNldFBhc3N3b3JkUXVhbGl0eShDb21wb25lbnROYW1lIHdobywgaW50IHF1YWxpdHkpIHsKICAgICAgICAgdmFsaWRhdGVRdWFsaXR5Q29uc3RhbnQocXVhbGl0eSk7Ci0gICAgICAgIAorCiAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewogICAgICAgICAgICAgaWYgKHdobyA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJDb21wb25lbnROYW1lIGlzIG51bGwiKTsKQEAgLTYxOSwxNiArNzgwLDE2IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICBwdWJsaWMgaW50IGdldFBhc3N3b3JkUXVhbGl0eShDb21wb25lbnROYW1lIHdobykgewogICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKICAgICAgICAgICAgIGludCBtb2RlID0gRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX1VOU1BFQ0lGSUVEOwotICAgICAgICAgICAgCisKICAgICAgICAgICAgIGlmICh3aG8gIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIEFjdGl2ZUFkbWluIGFkbWluID0gZ2V0QWN0aXZlQWRtaW5VbmNoZWNrZWRMb2NrZWQod2hvKTsKICAgICAgICAgICAgICAgICByZXR1cm4gYWRtaW4gIT0gbnVsbCA/IGFkbWluLnBhc3N3b3JkUXVhbGl0eSA6IG1vZGU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAKKwogICAgICAgICAgICAgZmluYWwgaW50IE4gPSBtQWRtaW5MaXN0LnNpemUoKTsKICAgICAgICAgICAgIGZvciAgKGludCBpPTA7IGk8TjsgaSsrKSB7CiAgICAgICAgICAgICAgICAgQWN0aXZlQWRtaW4gYWRtaW4gPSBtQWRtaW5MaXN0LmdldChpKTsKQEAgLTYzOSw3ICs4MDAsNyBAQAogICAgICAgICAgICAgcmV0dXJuIG1vZGU7CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZE1pbmltdW1MZW5ndGgoQ29tcG9uZW50TmFtZSB3aG8sIGludCBsZW5ndGgpIHsKICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CiAgICAgICAgICAgICBpZiAod2hvID09IG51bGwpIHsKQEAgLTY1MywxNiArODE0LDE2IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICBwdWJsaWMgaW50IGdldFBhc3N3b3JkTWluaW11bUxlbmd0aChDb21wb25lbnROYW1lIHdobykgewogICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKICAgICAgICAgICAgIGludCBsZW5ndGggPSAwOwotICAgICAgICAgICAgCisKICAgICAgICAgICAgIGlmICh3aG8gIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIEFjdGl2ZUFkbWluIGFkbWluID0gZ2V0QWN0aXZlQWRtaW5VbmNoZWNrZWRMb2NrZWQod2hvKTsKICAgICAgICAgICAgICAgICByZXR1cm4gYWRtaW4gIT0gbnVsbCA/IGFkbWluLm1pbmltdW1QYXNzd29yZExlbmd0aCA6IGxlbmd0aDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICBmaW5hbCBpbnQgTiA9IG1BZG1pbkxpc3Quc2l6ZSgpOwogICAgICAgICAgICAgZm9yICAoaW50IGk9MDsgaTxOOyBpKyspIHsKICAgICAgICAgICAgICAgICBBY3RpdmVBZG1pbiBhZG1pbiA9IG1BZG1pbkxpc3QuZ2V0KGkpOwpAQCAtNjczLDE4ICs4MzQsMjY3IEBACiAgICAgICAgICAgICByZXR1cm4gbGVuZ3RoOwogICAgICAgICB9CiAgICAgfQotICAgIAorCisgICAgcHVibGljIHZvaWQgc2V0UGFzc3dvcmRIaXN0b3J5TGVuZ3RoKENvbXBvbmVudE5hbWUgd2hvLCBpbnQgbGVuZ3RoKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgaWYgKHdobyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJDb21wb25lbnROYW1lIGlzIG51bGwiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFjdGl2ZUFkbWluIGFwID0gZ2V0QWN0aXZlQWRtaW5Gb3JDYWxsZXJMb2NrZWQod2hvLAorICAgICAgICAgICAgICAgICAgICBEZXZpY2VBZG1pbkluZm8uVVNFU19QT0xJQ1lfTElNSVRfUEFTU1dPUkQpOworICAgICAgICAgICAgaWYgKGFwLnBhc3N3b3JkSGlzdG9yeUxlbmd0aCAhPSBsZW5ndGgpIHsKKyAgICAgICAgICAgICAgICBhcC5wYXNzd29yZEhpc3RvcnlMZW5ndGggPSBsZW5ndGg7CisgICAgICAgICAgICAgICAgc2F2ZVNldHRpbmdzTG9ja2VkKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFBhc3N3b3JkSGlzdG9yeUxlbmd0aChDb21wb25lbnROYW1lIHdobykgeworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIGludCBsZW5ndGggPSAwOworCisgICAgICAgICAgICBpZiAod2hvICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBBY3RpdmVBZG1pbiBhZG1pbiA9IGdldEFjdGl2ZUFkbWluVW5jaGVja2VkTG9ja2VkKHdobyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGFkbWluICE9IG51bGwgPyBhZG1pbi5wYXNzd29yZEhpc3RvcnlMZW5ndGggOiBsZW5ndGg7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZpbmFsIGludCBOID0gbUFkbWluTGlzdC5zaXplKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE47IGkrKykgeworICAgICAgICAgICAgICAgIEFjdGl2ZUFkbWluIGFkbWluID0gbUFkbWluTGlzdC5nZXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA8IGFkbWluLnBhc3N3b3JkSGlzdG9yeUxlbmd0aCkgeworICAgICAgICAgICAgICAgICAgICBsZW5ndGggPSBhZG1pbi5wYXNzd29yZEhpc3RvcnlMZW5ndGg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGxlbmd0aDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFBhc3N3b3JkTWluaW11bVVwcGVyQ2FzZShDb21wb25lbnROYW1lIHdobywgaW50IGxlbmd0aCkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIGlmICh3aG8gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiQ29tcG9uZW50TmFtZSBpcyBudWxsIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBY3RpdmVBZG1pbiBhcCA9IGdldEFjdGl2ZUFkbWluRm9yQ2FsbGVyTG9ja2VkKHdobywKKyAgICAgICAgICAgICAgICAgICAgRGV2aWNlQWRtaW5JbmZvLlVTRVNfUE9MSUNZX0xJTUlUX1BBU1NXT1JEKTsKKyAgICAgICAgICAgIGlmIChhcC5taW5pbXVtUGFzc3dvcmRVcHBlckNhc2UgIT0gbGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgYXAubWluaW11bVBhc3N3b3JkVXBwZXJDYXNlID0gbGVuZ3RoOworICAgICAgICAgICAgICAgIHNhdmVTZXR0aW5nc0xvY2tlZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRQYXNzd29yZE1pbmltdW1VcHBlckNhc2UoQ29tcG9uZW50TmFtZSB3aG8pIHsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBpbnQgbGVuZ3RoID0gMDsKKworICAgICAgICAgICAgaWYgKHdobyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgQWN0aXZlQWRtaW4gYWRtaW4gPSBnZXRBY3RpdmVBZG1pblVuY2hlY2tlZExvY2tlZCh3aG8pOworICAgICAgICAgICAgICAgIHJldHVybiBhZG1pbiAhPSBudWxsID8gYWRtaW4ubWluaW11bVBhc3N3b3JkVXBwZXJDYXNlIDogbGVuZ3RoOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmaW5hbCBpbnQgTiA9IG1BZG1pbkxpc3Quc2l6ZSgpOworICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPE47IGkrKykgeworICAgICAgICAgICAgICAgIEFjdGl2ZUFkbWluIGFkbWluID0gbUFkbWluTGlzdC5nZXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA8IGFkbWluLm1pbmltdW1QYXNzd29yZFVwcGVyQ2FzZSkgeworICAgICAgICAgICAgICAgICAgICBsZW5ndGggPSBhZG1pbi5taW5pbXVtUGFzc3dvcmRVcHBlckNhc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGxlbmd0aDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFBhc3N3b3JkTWluaW11bUxvd2VyQ2FzZShDb21wb25lbnROYW1lIHdobywgaW50IGxlbmd0aCkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIGlmICh3aG8gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiQ29tcG9uZW50TmFtZSBpcyBudWxsIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBY3RpdmVBZG1pbiBhcCA9IGdldEFjdGl2ZUFkbWluRm9yQ2FsbGVyTG9ja2VkKHdobywKKyAgICAgICAgICAgICAgICAgICAgRGV2aWNlQWRtaW5JbmZvLlVTRVNfUE9MSUNZX0xJTUlUX1BBU1NXT1JEKTsKKyAgICAgICAgICAgIGlmIChhcC5taW5pbXVtUGFzc3dvcmRMb3dlckNhc2UgIT0gbGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgYXAubWluaW11bVBhc3N3b3JkTG93ZXJDYXNlID0gbGVuZ3RoOworICAgICAgICAgICAgICAgIHNhdmVTZXR0aW5nc0xvY2tlZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRQYXNzd29yZE1pbmltdW1Mb3dlckNhc2UoQ29tcG9uZW50TmFtZSB3aG8pIHsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBpbnQgbGVuZ3RoID0gMDsKKworICAgICAgICAgICAgaWYgKHdobyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgQWN0aXZlQWRtaW4gYWRtaW4gPSBnZXRBY3RpdmVBZG1pblVuY2hlY2tlZExvY2tlZCh3aG8pOworICAgICAgICAgICAgICAgIHJldHVybiBhZG1pbiAhPSBudWxsID8gYWRtaW4ubWluaW11bVBhc3N3b3JkTG93ZXJDYXNlIDogbGVuZ3RoOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmaW5hbCBpbnQgTiA9IG1BZG1pbkxpc3Quc2l6ZSgpOworICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPE47IGkrKykgeworICAgICAgICAgICAgICAgIEFjdGl2ZUFkbWluIGFkbWluID0gbUFkbWluTGlzdC5nZXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA8IGFkbWluLm1pbmltdW1QYXNzd29yZExvd2VyQ2FzZSkgeworICAgICAgICAgICAgICAgICAgICBsZW5ndGggPSBhZG1pbi5taW5pbXVtUGFzc3dvcmRMb3dlckNhc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGxlbmd0aDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFBhc3N3b3JkTWluaW11bUxldHRlcnMoQ29tcG9uZW50TmFtZSB3aG8sIGludCBsZW5ndGgpIHsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBpZiAod2hvID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIkNvbXBvbmVudE5hbWUgaXMgbnVsbCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQWN0aXZlQWRtaW4gYXAgPSBnZXRBY3RpdmVBZG1pbkZvckNhbGxlckxvY2tlZCh3aG8sCisgICAgICAgICAgICAgICAgICAgIERldmljZUFkbWluSW5mby5VU0VTX1BPTElDWV9MSU1JVF9QQVNTV09SRCk7CisgICAgICAgICAgICBpZiAoYXAubWluaW11bVBhc3N3b3JkTGV0dGVycyAhPSBsZW5ndGgpIHsKKyAgICAgICAgICAgICAgICBhcC5taW5pbXVtUGFzc3dvcmRMZXR0ZXJzID0gbGVuZ3RoOworICAgICAgICAgICAgICAgIHNhdmVTZXR0aW5nc0xvY2tlZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRQYXNzd29yZE1pbmltdW1MZXR0ZXJzKENvbXBvbmVudE5hbWUgd2hvKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgaW50IGxlbmd0aCA9IDA7CisKKyAgICAgICAgICAgIGlmICh3aG8gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIEFjdGl2ZUFkbWluIGFkbWluID0gZ2V0QWN0aXZlQWRtaW5VbmNoZWNrZWRMb2NrZWQod2hvKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gYWRtaW4gIT0gbnVsbCA/IGFkbWluLm1pbmltdW1QYXNzd29yZExldHRlcnMgOiBsZW5ndGg7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZpbmFsIGludCBOID0gbUFkbWluTGlzdC5zaXplKCk7CisgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8TjsgaSsrKSB7CisgICAgICAgICAgICAgICAgQWN0aXZlQWRtaW4gYWRtaW4gPSBtQWRtaW5MaXN0LmdldChpKTsKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoIDwgYWRtaW4ubWluaW11bVBhc3N3b3JkTGV0dGVycykgeworICAgICAgICAgICAgICAgICAgICBsZW5ndGggPSBhZG1pbi5taW5pbXVtUGFzc3dvcmRMZXR0ZXJzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBsZW5ndGg7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZE1pbmltdW1OdW1lcmljKENvbXBvbmVudE5hbWUgd2hvLCBpbnQgbGVuZ3RoKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgaWYgKHdobyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJDb21wb25lbnROYW1lIGlzIG51bGwiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFjdGl2ZUFkbWluIGFwID0gZ2V0QWN0aXZlQWRtaW5Gb3JDYWxsZXJMb2NrZWQod2hvLAorICAgICAgICAgICAgICAgICAgICBEZXZpY2VBZG1pbkluZm8uVVNFU19QT0xJQ1lfTElNSVRfUEFTU1dPUkQpOworICAgICAgICAgICAgaWYgKGFwLm1pbmltdW1QYXNzd29yZE51bWVyaWMgIT0gbGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgYXAubWluaW11bVBhc3N3b3JkTnVtZXJpYyA9IGxlbmd0aDsKKyAgICAgICAgICAgICAgICBzYXZlU2V0dGluZ3NMb2NrZWQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0UGFzc3dvcmRNaW5pbXVtTnVtZXJpYyhDb21wb25lbnROYW1lIHdobykgeworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIGludCBsZW5ndGggPSAwOworCisgICAgICAgICAgICBpZiAod2hvICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBBY3RpdmVBZG1pbiBhZG1pbiA9IGdldEFjdGl2ZUFkbWluVW5jaGVja2VkTG9ja2VkKHdobyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGFkbWluICE9IG51bGwgPyBhZG1pbi5taW5pbXVtUGFzc3dvcmROdW1lcmljIDogbGVuZ3RoOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmaW5hbCBpbnQgTiA9IG1BZG1pbkxpc3Quc2l6ZSgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyBpKyspIHsKKyAgICAgICAgICAgICAgICBBY3RpdmVBZG1pbiBhZG1pbiA9IG1BZG1pbkxpc3QuZ2V0KGkpOworICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPCBhZG1pbi5taW5pbXVtUGFzc3dvcmROdW1lcmljKSB7CisgICAgICAgICAgICAgICAgICAgIGxlbmd0aCA9IGFkbWluLm1pbmltdW1QYXNzd29yZE51bWVyaWM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGxlbmd0aDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFBhc3N3b3JkTWluaW11bVN5bWJvbHMoQ29tcG9uZW50TmFtZSB3aG8sIGludCBsZW5ndGgpIHsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBpZiAod2hvID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIkNvbXBvbmVudE5hbWUgaXMgbnVsbCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQWN0aXZlQWRtaW4gYXAgPSBnZXRBY3RpdmVBZG1pbkZvckNhbGxlckxvY2tlZCh3aG8sCisgICAgICAgICAgICAgICAgICAgIERldmljZUFkbWluSW5mby5VU0VTX1BPTElDWV9MSU1JVF9QQVNTV09SRCk7CisgICAgICAgICAgICBpZiAoYXAubWluaW11bVBhc3N3b3JkU3ltYm9scyAhPSBsZW5ndGgpIHsKKyAgICAgICAgICAgICAgICBhcC5taW5pbXVtUGFzc3dvcmRTeW1ib2xzID0gbGVuZ3RoOworICAgICAgICAgICAgICAgIHNhdmVTZXR0aW5nc0xvY2tlZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRQYXNzd29yZE1pbmltdW1TeW1ib2xzKENvbXBvbmVudE5hbWUgd2hvKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgaW50IGxlbmd0aCA9IDA7CisKKyAgICAgICAgICAgIGlmICh3aG8gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIEFjdGl2ZUFkbWluIGFkbWluID0gZ2V0QWN0aXZlQWRtaW5VbmNoZWNrZWRMb2NrZWQod2hvKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gYWRtaW4gIT0gbnVsbCA/IGFkbWluLm1pbmltdW1QYXNzd29yZFN5bWJvbHMgOiBsZW5ndGg7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZpbmFsIGludCBOID0gbUFkbWluTGlzdC5zaXplKCk7CisgICAgICAgICAgICBmb3IgIChpbnQgaT0wOyBpPE47IGkrKykgeworICAgICAgICAgICAgICAgIEFjdGl2ZUFkbWluIGFkbWluID0gbUFkbWluTGlzdC5nZXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA8IGFkbWluLm1pbmltdW1QYXNzd29yZFN5bWJvbHMpIHsKKyAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID0gYWRtaW4ubWluaW11bVBhc3N3b3JkU3ltYm9sczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbGVuZ3RoOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UGFzc3dvcmRNaW5pbXVtTm9uTGV0dGVyKENvbXBvbmVudE5hbWUgd2hvLCBpbnQgbGVuZ3RoKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgaWYgKHdobyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJDb21wb25lbnROYW1lIGlzIG51bGwiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFjdGl2ZUFkbWluIGFwID0gZ2V0QWN0aXZlQWRtaW5Gb3JDYWxsZXJMb2NrZWQod2hvLAorICAgICAgICAgICAgICAgICAgICBEZXZpY2VBZG1pbkluZm8uVVNFU19QT0xJQ1lfTElNSVRfUEFTU1dPUkQpOworICAgICAgICAgICAgaWYgKGFwLm1pbmltdW1QYXNzd29yZE5vbkxldHRlciAhPSBsZW5ndGgpIHsKKyAgICAgICAgICAgICAgICBhcC5taW5pbXVtUGFzc3dvcmROb25MZXR0ZXIgPSBsZW5ndGg7CisgICAgICAgICAgICAgICAgc2F2ZVNldHRpbmdzTG9ja2VkKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFBhc3N3b3JkTWluaW11bU5vbkxldHRlcihDb21wb25lbnROYW1lIHdobykgeworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIGludCBsZW5ndGggPSAwOworCisgICAgICAgICAgICBpZiAod2hvICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBBY3RpdmVBZG1pbiBhZG1pbiA9IGdldEFjdGl2ZUFkbWluVW5jaGVja2VkTG9ja2VkKHdobyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGFkbWluICE9IG51bGwgPyBhZG1pbi5taW5pbXVtUGFzc3dvcmROb25MZXR0ZXIgOiBsZW5ndGg7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZpbmFsIGludCBOID0gbUFkbWluTGlzdC5zaXplKCk7CisgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8TjsgaSsrKSB7CisgICAgICAgICAgICAgICAgQWN0aXZlQWRtaW4gYWRtaW4gPSBtQWRtaW5MaXN0LmdldChpKTsKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoIDwgYWRtaW4ubWluaW11bVBhc3N3b3JkTm9uTGV0dGVyKSB7CisgICAgICAgICAgICAgICAgICAgIGxlbmd0aCA9IGFkbWluLm1pbmltdW1QYXNzd29yZE5vbkxldHRlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbGVuZ3RoOworICAgICAgICB9CisgICAgfQorCiAgICAgcHVibGljIGJvb2xlYW4gaXNBY3RpdmVQYXNzd29yZFN1ZmZpY2llbnQoKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewogICAgICAgICAgICAgLy8gVGhpcyBBUEkgY2FuIG9ubHkgYmUgY2FsbGVkIGJ5IGFuIGFjdGl2ZSBkZXZpY2UgYWRtaW4sCiAgICAgICAgICAgICAvLyBzbyB0cnkgdG8gcmV0cmlldmUgaXQgdG8gY2hlY2sgdGhhdCB0aGUgY2FsbGVyIGlzIG9uZS4KICAgICAgICAgICAgIGdldEFjdGl2ZUFkbWluRm9yQ2FsbGVyTG9ja2VkKG51bGwsCiAgICAgICAgICAgICAgICAgICAgIERldmljZUFkbWluSW5mby5VU0VTX1BPTElDWV9MSU1JVF9QQVNTV09SRCk7Ci0gICAgICAgICAgICByZXR1cm4gbUFjdGl2ZVBhc3N3b3JkUXVhbGl0eSA+PSBnZXRQYXNzd29yZFF1YWxpdHkobnVsbCkKLSAgICAgICAgICAgICAgICAgICAgJiYgbUFjdGl2ZVBhc3N3b3JkTGVuZ3RoID49IGdldFBhc3N3b3JkTWluaW11bUxlbmd0aChudWxsKTsKKyAgICAgICAgICAgIGlmIChtQWN0aXZlUGFzc3dvcmRRdWFsaXR5IDwgZ2V0UGFzc3dvcmRRdWFsaXR5KG51bGwpCisgICAgICAgICAgICAgICAgICAgIHx8IG1BY3RpdmVQYXNzd29yZExlbmd0aCA8IGdldFBhc3N3b3JkTWluaW11bUxlbmd0aChudWxsKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKG1BY3RpdmVQYXNzd29yZFF1YWxpdHkgIT0gRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX0NPTVBMRVgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBtQWN0aXZlUGFzc3dvcmRVcHBlckNhc2UgPj0gZ2V0UGFzc3dvcmRNaW5pbXVtVXBwZXJDYXNlKG51bGwpCisgICAgICAgICAgICAgICAgICAgICYmIG1BY3RpdmVQYXNzd29yZExvd2VyQ2FzZSA+PSBnZXRQYXNzd29yZE1pbmltdW1Mb3dlckNhc2UobnVsbCkKKyAgICAgICAgICAgICAgICAgICAgJiYgbUFjdGl2ZVBhc3N3b3JkTGV0dGVycyA+PSBnZXRQYXNzd29yZE1pbmltdW1MZXR0ZXJzKG51bGwpCisgICAgICAgICAgICAgICAgICAgICYmIG1BY3RpdmVQYXNzd29yZE51bWVyaWMgPj0gZ2V0UGFzc3dvcmRNaW5pbXVtTnVtZXJpYyhudWxsKQorICAgICAgICAgICAgICAgICAgICAmJiBtQWN0aXZlUGFzc3dvcmRTeW1ib2xzID49IGdldFBhc3N3b3JkTWluaW11bVN5bWJvbHMobnVsbCkKKyAgICAgICAgICAgICAgICAgICAgJiYgbUFjdGl2ZVBhc3N3b3JkTm9uTGV0dGVyID49IGdldFBhc3N3b3JkTWluaW11bU5vbkxldHRlcihudWxsKTsKICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIHB1YmxpYyBpbnQgZ2V0Q3VycmVudEZhaWxlZFBhc3N3b3JkQXR0ZW1wdHMoKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewogICAgICAgICAgICAgLy8gVGhpcyBBUEkgY2FuIG9ubHkgYmUgY2FsbGVkIGJ5IGFuIGFjdGl2ZSBkZXZpY2UgYWRtaW4sCkBAIC02OTQsNyArMTEwNCw3IEBACiAgICAgICAgICAgICByZXR1cm4gbUZhaWxlZFBhc3N3b3JkQXR0ZW1wdHM7CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICBwdWJsaWMgdm9pZCBzZXRNYXhpbXVtRmFpbGVkUGFzc3dvcmRzRm9yV2lwZShDb21wb25lbnROYW1lIHdobywgaW50IG51bSkgewogICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKICAgICAgICAgICAgIC8vIFRoaXMgQVBJIGNhbiBvbmx5IGJlIGNhbGxlZCBieSBhbiBhY3RpdmUgZGV2aWNlIGFkbWluLApAQCAtNzA5LDE2ICsxMTE5LDE2IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICBwdWJsaWMgaW50IGdldE1heGltdW1GYWlsZWRQYXNzd29yZHNGb3JXaXBlKENvbXBvbmVudE5hbWUgd2hvKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewogICAgICAgICAgICAgaW50IGNvdW50ID0gMDsKLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICBpZiAod2hvICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBBY3RpdmVBZG1pbiBhZG1pbiA9IGdldEFjdGl2ZUFkbWluVW5jaGVja2VkTG9ja2VkKHdobyk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGFkbWluICE9IG51bGwgPyBhZG1pbi5tYXhpbXVtRmFpbGVkUGFzc3dvcmRzRm9yV2lwZSA6IGNvdW50OwogICAgICAgICAgICAgfQotICAgICAgICAgICAgCisKICAgICAgICAgICAgIGZpbmFsIGludCBOID0gbUFkbWluTGlzdC5zaXplKCk7CiAgICAgICAgICAgICBmb3IgIChpbnQgaT0wOyBpPE47IGkrKykgewogICAgICAgICAgICAgICAgIEFjdGl2ZUFkbWluIGFkbWluID0gbUFkbWluTGlzdC5nZXQoaSk7CkBAIC03MzIsNyArMTE0Miw3IEBACiAgICAgICAgICAgICByZXR1cm4gY291bnQ7CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICBwdWJsaWMgYm9vbGVhbiByZXNldFBhc3N3b3JkKFN0cmluZyBwYXNzd29yZCwgaW50IGZsYWdzKSB7CiAgICAgICAgIGludCBxdWFsaXR5OwogICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKQEAgLTc0MywxNCArMTE1MywxNSBAQAogICAgICAgICAgICAgcXVhbGl0eSA9IGdldFBhc3N3b3JkUXVhbGl0eShudWxsKTsKICAgICAgICAgICAgIGlmIChxdWFsaXR5ICE9IERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9VTlNQRUNJRklFRCkgewogICAgICAgICAgICAgICAgIGludCByZWFsUXVhbGl0eSA9IExvY2tQYXR0ZXJuVXRpbHMuY29tcHV0ZVBhc3N3b3JkUXVhbGl0eShwYXNzd29yZCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlYWxRdWFsaXR5IDwgcXVhbGl0eSkgeworICAgICAgICAgICAgICAgIGlmIChyZWFsUXVhbGl0eSA8IHF1YWxpdHkKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIHF1YWxpdHkgIT0gRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX0NPTVBMRVgpIHsKICAgICAgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgInJlc2V0UGFzc3dvcmQ6IHBhc3N3b3JkIHF1YWxpdHkgMHgiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKHF1YWxpdHkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGRvZXMgbm90IG1lZXQgcmVxdWlyZWQgcXVhbGl0eSAweCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIEludGVnZXIudG9IZXhTdHJpbmcocXVhbGl0eSkpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHF1YWxpdHkgPSByZWFsUXVhbGl0eTsKKyAgICAgICAgICAgICAgICBxdWFsaXR5ID0gTWF0aC5tYXgocmVhbFF1YWxpdHksIHF1YWxpdHkpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaW50IGxlbmd0aCA9IGdldFBhc3N3b3JkTWluaW11bUxlbmd0aChudWxsKTsKICAgICAgICAgICAgIGlmIChwYXNzd29yZC5sZW5ndGgoKSA8IGxlbmd0aCkgewpAQCAtNzU4LDE0ICsxMTY5LDg2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICArICIgZG9lcyBub3QgbWVldCByZXF1aXJlZCBsZW5ndGggIiArIGxlbmd0aCk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHF1YWxpdHkgPT0gRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX0NPTVBMRVgpIHsKKyAgICAgICAgICAgICAgICBpbnQgbGV0dGVycyA9IDA7CisgICAgICAgICAgICAgICAgaW50IHVwcGVyY2FzZSA9IDA7CisgICAgICAgICAgICAgICAgaW50IGxvd2VyY2FzZSA9IDA7CisgICAgICAgICAgICAgICAgaW50IG51bWJlcnMgPSAwOworICAgICAgICAgICAgICAgIGludCBzeW1ib2xzID0gMDsKKyAgICAgICAgICAgICAgICBpbnQgbm9ubGV0dGVyID0gMDsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhc3N3b3JkLmxlbmd0aCgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgY2hhciBjID0gcGFzc3dvcmQuY2hhckF0KGkpOworICAgICAgICAgICAgICAgICAgICBpZiAoYyA+PSAnQScgJiYgYyA8PSAnWicpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxldHRlcnMrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVwcGVyY2FzZSsrOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGMgPj0gJ2EnICYmIGMgPD0gJ3onKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsZXR0ZXJzKys7CisgICAgICAgICAgICAgICAgICAgICAgICBsb3dlcmNhc2UrKzsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjID49ICcwJyAmJiBjIDw9ICc5JykgeworICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVycysrOworICAgICAgICAgICAgICAgICAgICAgICAgbm9ubGV0dGVyKys7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzeW1ib2xzKys7CisgICAgICAgICAgICAgICAgICAgICAgICBub25sZXR0ZXIrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbnQgbmVlZGVkTGV0dGVycyA9IGdldFBhc3N3b3JkTWluaW11bUxldHRlcnMobnVsbCk7CisgICAgICAgICAgICAgICAgaWYobGV0dGVycyA8IG5lZWRlZExldHRlcnMpIHsKKyAgICAgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgInJlc2V0UGFzc3dvcmQ6IG51bWJlciBvZiBsZXR0ZXJzICIgKyBsZXR0ZXJzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGRvZXMgbm90IG1lZXQgcmVxdWlyZWQgbnVtYmVyIG9mIGxldHRlcnMgIiArIG5lZWRlZExldHRlcnMpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGludCBuZWVkZWROdW1iZXJzID0gZ2V0UGFzc3dvcmRNaW5pbXVtTnVtZXJpYyhudWxsKTsKKyAgICAgICAgICAgICAgICBpZiAobnVtYmVycyA8IG5lZWRlZE51bWJlcnMpIHsKKyAgICAgICAgICAgICAgICAgICAgU2xvZworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53KFRBRywgInJlc2V0UGFzc3dvcmQ6IG51bWJlciBvZiBudW1lcmljYWwgZGlnaXRzICIgKyBudW1iZXJzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZG9lcyBub3QgbWVldCByZXF1aXJlZCBudW1iZXIgb2YgbnVtZXJpY2FsIGRpZ2l0cyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG5lZWRlZE51bWJlcnMpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGludCBuZWVkZWRMb3dlckNhc2UgPSBnZXRQYXNzd29yZE1pbmltdW1Mb3dlckNhc2UobnVsbCk7CisgICAgICAgICAgICAgICAgaWYgKGxvd2VyY2FzZSA8IG5lZWRlZExvd2VyQ2FzZSkgeworICAgICAgICAgICAgICAgICAgICBTbG9nLncoVEFHLCAicmVzZXRQYXNzd29yZDogbnVtYmVyIG9mIGxvd2VyY2FzZSBsZXR0ZXJzICIgKyBsb3dlcmNhc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZG9lcyBub3QgbWVldCByZXF1aXJlZCBudW1iZXIgb2YgbG93ZXJjYXNlIGxldHRlcnMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbmVlZGVkTG93ZXJDYXNlKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbnQgbmVlZGVkVXBwZXJDYXNlID0gZ2V0UGFzc3dvcmRNaW5pbXVtVXBwZXJDYXNlKG51bGwpOworICAgICAgICAgICAgICAgIGlmICh1cHBlcmNhc2UgPCBuZWVkZWRVcHBlckNhc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgInJlc2V0UGFzc3dvcmQ6IG51bWJlciBvZiB1cHBlcmNhc2UgbGV0dGVycyAiICsgdXBwZXJjYXNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGRvZXMgbm90IG1lZXQgcmVxdWlyZWQgbnVtYmVyIG9mIHVwcGVyY2FzZSBsZXR0ZXJzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG5lZWRlZFVwcGVyQ2FzZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW50IG5lZWRlZFN5bWJvbHMgPSBnZXRQYXNzd29yZE1pbmltdW1TeW1ib2xzKG51bGwpOworICAgICAgICAgICAgICAgIGlmIChzeW1ib2xzIDwgbmVlZGVkU3ltYm9scykgeworICAgICAgICAgICAgICAgICAgICBTbG9nLncoVEFHLCAicmVzZXRQYXNzd29yZDogbnVtYmVyIG9mIHNwZWNpYWwgc3ltYm9scyAiICsgc3ltYm9scworICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBkb2VzIG5vdCBtZWV0IHJlcXVpcmVkIG51bWJlciBvZiBzcGVjaWFsIHN5bWJvbHMgIiArIG5lZWRlZFN5bWJvbHMpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGludCBuZWVkZWROb25MZXR0ZXIgPSBnZXRQYXNzd29yZE1pbmltdW1Ob25MZXR0ZXIobnVsbCk7CisgICAgICAgICAgICAgICAgaWYgKG5vbmxldHRlciA8IG5lZWRlZE5vbkxldHRlcikgeworICAgICAgICAgICAgICAgICAgICBTbG9nLncoVEFHLCAicmVzZXRQYXNzd29yZDogbnVtYmVyIG9mIG5vbi1sZXR0ZXIgY2hhcmFjdGVycyAiICsgbm9ubGV0dGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGRvZXMgbm90IG1lZXQgcmVxdWlyZWQgbnVtYmVyIG9mIG5vbi1sZXR0ZXIgY2hhcmFjdGVycyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBuZWVkZWROb25MZXR0ZXIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBMb2NrUGF0dGVyblV0aWxzIHV0aWxzID0gbmV3IExvY2tQYXR0ZXJuVXRpbHMobUNvbnRleHQpOworICAgICAgICAgICAgaWYodXRpbHMuY2hlY2tQYXNzd29yZEhpc3RvcnkocGFzc3dvcmQpKSB7CisgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgInJlc2V0UGFzc3dvcmQ6IHBhc3N3b3JkIGlzIHRoZSBzYW1lIGFzIG9uZSBvZiB0aGUgbGFzdCAiCisgICAgICAgICAgICAgICAgICAgICAgICArIGdldFBhc3N3b3JkSGlzdG9yeUxlbmd0aChudWxsKSArICIgcGFzc3dvcmRzIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIGludCBjYWxsaW5nVWlkID0gQmluZGVyLmdldENhbGxpbmdVaWQoKTsKICAgICAgICAgaWYgKG1QYXNzd29yZE93bmVyID49IDAgJiYgbVBhc3N3b3JkT3duZXIgIT0gY2FsbGluZ1VpZCkgewogICAgICAgICAgICAgU2xvZy53KFRBRywgInJlc2V0UGFzc3dvcmQ6IGFscmVhZHkgc2V0IGJ5IGFub3RoZXIgdWlkIGFuZCBub3QgZW50ZXJlZCBieSB1c2VyIik7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KLSAgICAgICAgCisKICAgICAgICAgLy8gRG9uJ3QgZG8gdGhpcyB3aXRoIHRoZSBsb2NrIGhlbGQsIGJlY2F1c2UgaXQgaXMgZ29pbmcgdG8gY2FsbAogICAgICAgICAvLyBiYWNrIGluIHRvIHRoZSBzZXJ2aWNlLgogICAgICAgICBsb25nIGlkZW50ID0gQmluZGVyLmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CkBAIC03ODMsMTAgKzEyNjYsMTAgQEAKICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgIEJpbmRlci5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KGlkZW50KTsKICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9Ci0gICAgCisKICAgICBwdWJsaWMgdm9pZCBzZXRNYXhpbXVtVGltZVRvTG9jayhDb21wb25lbnROYW1lIHdobywgbG9uZyB0aW1lTXMpIHsKICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CiAgICAgICAgICAgICBpZiAod2hvID09IG51bGwpIHsKQEAgLTc5NiwxNiArMTI3OSwxNiBAQAogICAgICAgICAgICAgICAgICAgICBEZXZpY2VBZG1pbkluZm8uVVNFU19QT0xJQ1lfRk9SQ0VfTE9DSyk7CiAgICAgICAgICAgICBpZiAoYXAubWF4aW11bVRpbWVUb1VubG9jayAhPSB0aW1lTXMpIHsKICAgICAgICAgICAgICAgICBhcC5tYXhpbXVtVGltZVRvVW5sb2NrID0gdGltZU1zOwotICAgICAgICAgICAgICAgIAorCiAgICAgICAgICAgICAgICAgbG9uZyBpZGVudCA9IEJpbmRlci5jbGVhckNhbGxpbmdJZGVudGl0eSgpOwogICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgIHNhdmVTZXR0aW5nc0xvY2tlZCgpOwotICAgICAgICAgICAgICAgICAgICAKKwogICAgICAgICAgICAgICAgICAgICB0aW1lTXMgPSBnZXRNYXhpbXVtVGltZVRvTG9jayhudWxsKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKHRpbWVNcyA8PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lTXMgPSBJbnRlZ2VyLk1BWF9WQUxVRTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAKKwogICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgZ2V0SVBvd2VyTWFuYWdlcigpLnNldE1heGltdW1TY3JlZW5PZmZUaW1lb3VudCgoaW50KXRpbWVNcyk7CiAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CkBAIC04MTcsMTYgKzEzMDAsMTYgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIHB1YmxpYyBsb25nIGdldE1heGltdW1UaW1lVG9Mb2NrKENvbXBvbmVudE5hbWUgd2hvKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewogICAgICAgICAgICAgbG9uZyB0aW1lID0gMDsKLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICBpZiAod2hvICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBBY3RpdmVBZG1pbiBhZG1pbiA9IGdldEFjdGl2ZUFkbWluVW5jaGVja2VkTG9ja2VkKHdobyk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGFkbWluICE9IG51bGwgPyBhZG1pbi5tYXhpbXVtVGltZVRvVW5sb2NrIDogdGltZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICBmaW5hbCBpbnQgTiA9IG1BZG1pbkxpc3Quc2l6ZSgpOwogICAgICAgICAgICAgZm9yICAoaW50IGk9MDsgaTxOOyBpKyspIHsKICAgICAgICAgICAgICAgICBBY3RpdmVBZG1pbiBhZG1pbiA9IG1BZG1pbkxpc3QuZ2V0KGkpOwpAQCAtODQwLDcgKzEzMjMsNyBAQAogICAgICAgICAgICAgcmV0dXJuIHRpbWU7CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICBwdWJsaWMgdm9pZCBsb2NrTm93KCkgewogICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKICAgICAgICAgICAgIC8vIFRoaXMgQVBJIGNhbiBvbmx5IGJlIGNhbGxlZCBieSBhbiBhY3RpdmUgZGV2aWNlIGFkbWluLApAQCAtODU3LDcgKzEzNDAsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgdm9pZCB3aXBlRGF0YUxvY2tlZChpbnQgZmxhZ3MpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIFJlY292ZXJ5U3lzdGVtLnJlYm9vdFdpcGVVc2VyRGF0YShtQ29udGV4dCk7CkBAIC04NjUsNyArMTM0OCw3IEBACiAgICAgICAgICAgICBTbG9nLncoVEFHLCAiRmFpbGVkIHJlcXVlc3RpbmcgZGF0YSB3aXBlIiwgZSk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICBwdWJsaWMgdm9pZCB3aXBlRGF0YShpbnQgZmxhZ3MpIHsKICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CiAgICAgICAgICAgICAvLyBUaGlzIEFQSSBjYW4gb25seSBiZSBjYWxsZWQgYnkgYW4gYWN0aXZlIGRldmljZSBhZG1pbiwKQEAgLTg4MCwxMSArMTM2MywxMSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgcHVibGljIHZvaWQgZ2V0UmVtb3ZlV2FybmluZyhDb21wb25lbnROYW1lIGNvbXAsIGZpbmFsIFJlbW90ZUNhbGxiYWNrIHJlc3VsdCkgewogICAgICAgICBtQ29udGV4dC5lbmZvcmNlQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oCiAgICAgICAgICAgICAgICAgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJJTkRfREVWSUNFX0FETUlOLCBudWxsKTsKLSAgICAgICAgCisKICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CiAgICAgICAgICAgICBBY3RpdmVBZG1pbiBhZG1pbiA9IGdldEFjdGl2ZUFkbWluVW5jaGVja2VkTG9ja2VkKGNvbXApOwogICAgICAgICAgICAgaWYgKGFkbWluID09IG51bGwpIHsKQEAgLTkwNywyMCArMTM5MCwzMCBAQAogICAgICAgICAgICAgfSwgbnVsbCwgQWN0aXZpdHkuUkVTVUxUX09LLCBudWxsLCBudWxsKTsKICAgICAgICAgfQogICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRBY3RpdmVQYXNzd29yZFN0YXRlKGludCBxdWFsaXR5LCBpbnQgbGVuZ3RoKSB7CisKKyAgICBwdWJsaWMgdm9pZCBzZXRBY3RpdmVQYXNzd29yZFN0YXRlKGludCBxdWFsaXR5LCBpbnQgbGVuZ3RoLCBpbnQgbGV0dGVycywgaW50IHVwcGVyY2FzZSwKKyAgICAgICAgICAgIGludCBsb3dlcmNhc2UsIGludCBudW1iZXJzLCBpbnQgc3ltYm9scywgaW50IG5vbmxldHRlcikgewogICAgICAgICBtQ29udGV4dC5lbmZvcmNlQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oCiAgICAgICAgICAgICAgICAgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJJTkRfREVWSUNFX0FETUlOLCBudWxsKTsKLSAgICAgICAgCisKICAgICAgICAgdmFsaWRhdGVRdWFsaXR5Q29uc3RhbnQocXVhbGl0eSk7Ci0gICAgICAgIAorCiAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewogICAgICAgICAgICAgaWYgKG1BY3RpdmVQYXNzd29yZFF1YWxpdHkgIT0gcXVhbGl0eSB8fCBtQWN0aXZlUGFzc3dvcmRMZW5ndGggIT0gbGVuZ3RoCi0gICAgICAgICAgICAgICAgICAgIHx8IG1GYWlsZWRQYXNzd29yZEF0dGVtcHRzICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgfHwgbUZhaWxlZFBhc3N3b3JkQXR0ZW1wdHMgIT0gMCB8fCBtQWN0aXZlUGFzc3dvcmRMZXR0ZXJzICE9IGxldHRlcnMKKyAgICAgICAgICAgICAgICAgICAgfHwgbUFjdGl2ZVBhc3N3b3JkVXBwZXJDYXNlICE9IHVwcGVyY2FzZQorICAgICAgICAgICAgICAgICAgICB8fCBtQWN0aXZlUGFzc3dvcmRMb3dlckNhc2UgIT0gbG93ZXJjYXNlIHx8IG1BY3RpdmVQYXNzd29yZE51bWVyaWMgIT0gbnVtYmVycworICAgICAgICAgICAgICAgICAgICB8fCBtQWN0aXZlUGFzc3dvcmRTeW1ib2xzICE9IHN5bWJvbHMgfHwgbUFjdGl2ZVBhc3N3b3JkTm9uTGV0dGVyICE9IG5vbmxldHRlcikgewogICAgICAgICAgICAgICAgIGxvbmcgaWRlbnQgPSBCaW5kZXIuY2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICBtQWN0aXZlUGFzc3dvcmRRdWFsaXR5ID0gcXVhbGl0eTsKICAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZVBhc3N3b3JkTGVuZ3RoID0gbGVuZ3RoOworICAgICAgICAgICAgICAgICAgICBtQWN0aXZlUGFzc3dvcmRMZXR0ZXJzID0gbGV0dGVyczsKKyAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZVBhc3N3b3JkTG93ZXJDYXNlID0gbG93ZXJjYXNlOworICAgICAgICAgICAgICAgICAgICBtQWN0aXZlUGFzc3dvcmRVcHBlckNhc2UgPSB1cHBlcmNhc2U7CisgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVQYXNzd29yZE51bWVyaWMgPSBudW1iZXJzOworICAgICAgICAgICAgICAgICAgICBtQWN0aXZlUGFzc3dvcmRTeW1ib2xzID0gc3ltYm9sczsKKyAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZVBhc3N3b3JkTm9uTGV0dGVyID0gbm9ubGV0dGVyOwogICAgICAgICAgICAgICAgICAgICBtRmFpbGVkUGFzc3dvcmRBdHRlbXB0cyA9IDA7CiAgICAgICAgICAgICAgICAgICAgIHNhdmVTZXR0aW5nc0xvY2tlZCgpOwogICAgICAgICAgICAgICAgICAgICBzZW5kQWRtaW5Db21tYW5kTG9ja2VkKERldmljZUFkbWluUmVjZWl2ZXIuQUNUSU9OX1BBU1NXT1JEX0NIQU5HRUQsCkBAIC05MzEsMTEgKzE0MjQsMTEgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIHB1YmxpYyB2b2lkIHJlcG9ydEZhaWxlZFBhc3N3b3JkQXR0ZW1wdCgpIHsKICAgICAgICAgbUNvbnRleHQuZW5mb3JjZUNhbGxpbmdPclNlbGZQZXJtaXNzaW9uKAogICAgICAgICAgICAgICAgIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CSU5EX0RFVklDRV9BRE1JTiwgbnVsbCk7Ci0gICAgICAgIAorCiAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewogICAgICAgICAgICAgbG9uZyBpZGVudCA9IEJpbmRlci5jbGVhckNhbGxpbmdJZGVudGl0eSgpOwogICAgICAgICAgICAgdHJ5IHsKQEAgLTk1MiwxMSArMTQ0NSwxMSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgcHVibGljIHZvaWQgcmVwb3J0U3VjY2Vzc2Z1bFBhc3N3b3JkQXR0ZW1wdCgpIHsKICAgICAgICAgbUNvbnRleHQuZW5mb3JjZUNhbGxpbmdPclNlbGZQZXJtaXNzaW9uKAogICAgICAgICAgICAgICAgIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CSU5EX0RFVklDRV9BRE1JTiwgbnVsbCk7Ci0gICAgICAgIAorCiAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewogICAgICAgICAgICAgaWYgKG1GYWlsZWRQYXNzd29yZEF0dGVtcHRzICE9IDAgfHwgbVBhc3N3b3JkT3duZXIgPj0gMCkgewogICAgICAgICAgICAgICAgIGxvbmcgaWRlbnQgPSBCaW5kZXIuY2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKQEAgLTk3Miw3ICsxNDY1LDk1IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKKyAgICBwdWJsaWMgQ29tcG9uZW50TmFtZSBzZXRHbG9iYWxQcm94eShDb21wb25lbnROYW1lIHdobywgU3RyaW5nIHByb3h5U3BlYywKKyAgICAgICAgICAgIFN0cmluZyBleGNsdXNpb25MaXN0KSB7CisgICAgICAgIHN5bmNocm9uaXplZCh0aGlzKSB7CisgICAgICAgICAgICBpZiAod2hvID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIkNvbXBvbmVudE5hbWUgaXMgbnVsbCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBBY3RpdmVBZG1pbiBhZG1pbiA9IGdldEFjdGl2ZUFkbWluRm9yQ2FsbGVyTG9ja2VkKHdobywKKyAgICAgICAgICAgICAgICAgICAgRGV2aWNlQWRtaW5JbmZvLlVTRVNfUE9MSUNZX1NFVFNfR0xPQkFMX1BST1hZKTsKKworICAgICAgICAgICAgLy8gU2NhbiB0aHJvdWdoIGFjdGl2ZSBhZG1pbnMgYW5kIGZpbmQgaWYgYW55b25lIGhhcyBhbHJlYWR5CisgICAgICAgICAgICAvLyBzZXQgdGhlIGdsb2JhbCBwcm94eS4KKyAgICAgICAgICAgIGZpbmFsIGludCBOID0gbUFkbWluTGlzdC5zaXplKCk7CisgICAgICAgICAgICBTZXQ8Q29tcG9uZW50TmFtZT4gY29tcFNldCA9IG1BZG1pbk1hcC5rZXlTZXQoKTsKKyAgICAgICAgICAgIGZvciAgKENvbXBvbmVudE5hbWUgY29tcG9uZW50IDogY29tcFNldCkgeworICAgICAgICAgICAgICAgIEFjdGl2ZUFkbWluIGFwID0gbUFkbWluTWFwLmdldChjb21wb25lbnQpOworICAgICAgICAgICAgICAgIGlmICgoYXAuc3BlY2lmaWVzR2xvYmFsUHJveHkpICYmICghY29tcG9uZW50LmVxdWFscyh3aG8pKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBBbm90aGVyIGFkbWluIGFscmVhZHkgc2V0cyB0aGUgZ2xvYmFsIHByb3h5CisgICAgICAgICAgICAgICAgICAgIC8vIFJldHVybiBpdCB0byB0aGUgY2FsbGVyLgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29tcG9uZW50OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwcm94eVNwZWMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGFkbWluLnNwZWNpZmllc0dsb2JhbFByb3h5ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgYWRtaW4uZ2xvYmFsUHJveHlTcGVjID0gbnVsbDsKKyAgICAgICAgICAgICAgICBhZG1pbi5nbG9iYWxQcm94eUV4Y2x1c2lvbkxpc3QgPSBudWxsOworICAgICAgICAgICAgfSBlbHNlIHsKKworICAgICAgICAgICAgICAgIGFkbWluLnNwZWNpZmllc0dsb2JhbFByb3h5ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBhZG1pbi5nbG9iYWxQcm94eVNwZWMgPSBwcm94eVNwZWM7CisgICAgICAgICAgICAgICAgYWRtaW4uZ2xvYmFsUHJveHlFeGNsdXNpb25MaXN0ID0gZXhjbHVzaW9uTGlzdDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gUmVzZXQgdGhlIGdsb2JhbCBwcm94eSBhY2NvcmRpbmdseQorICAgICAgICAgICAgLy8gRG8gdGhpcyB1c2luZyBzeXN0ZW0gcGVybWlzc2lvbnMsIGFzIGFwcHMgY2Fubm90IHdyaXRlIHRvIHNlY3VyZSBzZXR0aW5ncworICAgICAgICAgICAgbG9uZyBvcmlnSWQgPSBCaW5kZXIuY2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKKyAgICAgICAgICAgIHJlc2V0R2xvYmFsUHJveHkoKTsKKyAgICAgICAgICAgIEJpbmRlci5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KG9yaWdJZCk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBDb21wb25lbnROYW1lIGdldEdsb2JhbFByb3h5QWRtaW4oKSB7CisgICAgICAgIHN5bmNocm9uaXplZCh0aGlzKSB7CisgICAgICAgICAgICAvLyBTY2FuIHRocm91Z2ggYWN0aXZlIGFkbWlucyBhbmQgZmluZCBpZiBhbnlvbmUgaGFzIGFscmVhZHkKKyAgICAgICAgICAgIC8vIHNldCB0aGUgZ2xvYmFsIHByb3h5LgorICAgICAgICAgICAgZmluYWwgaW50IE4gPSBtQWRtaW5MaXN0LnNpemUoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSsrKSB7CisgICAgICAgICAgICAgICAgQWN0aXZlQWRtaW4gYXAgPSBtQWRtaW5MaXN0LmdldChpKTsKKyAgICAgICAgICAgICAgICBpZiAoYXAuc3BlY2lmaWVzR2xvYmFsUHJveHkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gRGV2aWNlIGFkbWluIHNldHMgdGhlIGdsb2JhbCBwcm94eQorICAgICAgICAgICAgICAgICAgICAvLyBSZXR1cm4gaXQgdG8gdGhlIGNhbGxlci4KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFwLmluZm8uZ2V0Q29tcG9uZW50KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIE5vIGRldmljZSBhZG1pbiBzZXRzIHRoZSBnbG9iYWwgcHJveHkuCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZXNldEdsb2JhbFByb3h5KCkgeworICAgICAgICBmaW5hbCBpbnQgTiA9IG1BZG1pbkxpc3Quc2l6ZSgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE47IGkrKykgeworICAgICAgICAgICAgQWN0aXZlQWRtaW4gYXAgPSBtQWRtaW5MaXN0LmdldChpKTsKKyAgICAgICAgICAgIGlmIChhcC5zcGVjaWZpZXNHbG9iYWxQcm94eSkgeworICAgICAgICAgICAgICAgIHNhdmVHbG9iYWxQcm94eShhcC5nbG9iYWxQcm94eVNwZWMsIGFwLmdsb2JhbFByb3h5RXhjbHVzaW9uTGlzdCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIE5vIGRldmljZSBhZG1pbnMgZGVmaW5pbmcgZ2xvYmFsIHByb3hpZXMgLSByZXNldCBnbG9iYWwgcHJveHkgc2V0dGluZ3MgdG8gbm9uZQorICAgICAgICBzYXZlR2xvYmFsUHJveHkobnVsbCwgbnVsbCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNhdmVHbG9iYWxQcm94eShTdHJpbmcgcHJveHlTcGVjLCBTdHJpbmcgZXhjbHVzaW9uTGlzdCkgeworICAgICAgICBpZiAoZXhjbHVzaW9uTGlzdCA9PSBudWxsKSB7CisgICAgICAgICAgICBleGNsdXNpb25MaXN0ID0gIiI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHByb3h5U3BlYyA9PSBudWxsKSB7CisgICAgICAgICAgICBwcm94eVNwZWMgPSAiIjsKKyAgICAgICAgfQorICAgICAgICAvLyBSZW1vdmUgd2hpdGUgc3BhY2VzCisgICAgICAgIHByb3h5U3BlYyA9IHByb3h5U3BlYy50cmltKCk7CisgICAgICAgIGV4Y2x1c2lvbkxpc3QgPSBleGNsdXNpb25MaXN0LnRyaW0oKTsKKyAgICAgICAgQ29udGVudFJlc29sdmVyIHJlcyA9IG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpOworICAgICAgICBTZXR0aW5ncy5TZWN1cmUucHV0U3RyaW5nKHJlcywgU2V0dGluZ3MuU2VjdXJlLkhUVFBfUFJPWFksIHByb3h5U3BlYyk7CisgICAgICAgIFNldHRpbmdzLlNlY3VyZS5wdXRTdHJpbmcocmVzLCBTZXR0aW5ncy5TZWN1cmUuSFRUUF9QUk9YWV9FWENMVVNJT05fTElTVCwgZXhjbHVzaW9uTGlzdCk7CisgICAgfQorCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgZHVtcChGaWxlRGVzY3JpcHRvciBmZCwgUHJpbnRXcml0ZXIgcHcsIFN0cmluZ1tdIGFyZ3MpIHsKICAgICAgICAgaWYgKG1Db250ZXh0LmNoZWNrQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkRVTVApCkBAIC05ODMsMTIgKzE1NjQsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgKyAiLCB1aWQ9IiArIEJpbmRlci5nZXRDYWxsaW5nVWlkKCkpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIGZpbmFsIFByaW50ZXIgcCA9IG5ldyBQcmludFdyaXRlclByaW50ZXIocHcpOwotICAgICAgICAKKwogICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKICAgICAgICAgICAgIHAucHJpbnRsbigiQ3VycmVudCBEZXZpY2UgUG9saWN5IE1hbmFnZXIgc3RhdGU6Iik7Ci0gICAgICAgICAgICAKKwogICAgICAgICAgICAgcC5wcmludGxuKCIgIEVuYWJsZWQgRGV2aWNlIEFkbWluczoiKTsKICAgICAgICAgICAgIGZpbmFsIGludCBOID0gbUFkbWluTGlzdC5zaXplKCk7CiAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8TjsgaSsrKSB7CkBAIC05OTksMTEgKzE1ODAsMTcgQEAKICAgICAgICAgICAgICAgICAgICAgYXAuZHVtcCgiICAgICIsIHB3KTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAKKwogICAgICAgICAgICAgcHcucHJpbnRsbigiICIpOwogICAgICAgICAgICAgcHcucHJpbnQoIiAgbUFjdGl2ZVBhc3N3b3JkUXVhbGl0eT0weCIpOwogICAgICAgICAgICAgICAgICAgICBwdy5wcmludGxuKEludGVnZXIudG9IZXhTdHJpbmcobUFjdGl2ZVBhc3N3b3JkUXVhbGl0eSkpOwogICAgICAgICAgICAgcHcucHJpbnQoIiAgbUFjdGl2ZVBhc3N3b3JkTGVuZ3RoPSIpOyBwdy5wcmludGxuKG1BY3RpdmVQYXNzd29yZExlbmd0aCk7CisgICAgICAgICAgICBwdy5wcmludCgiICBtQWN0aXZlUGFzc3dvcmRVcHBlckNhc2U9Iik7IHB3LnByaW50bG4obUFjdGl2ZVBhc3N3b3JkVXBwZXJDYXNlKTsKKyAgICAgICAgICAgIHB3LnByaW50KCIgIG1BY3RpdmVQYXNzd29yZExvd2VyQ2FzZT0iKTsgcHcucHJpbnRsbihtQWN0aXZlUGFzc3dvcmRMb3dlckNhc2UpOworICAgICAgICAgICAgcHcucHJpbnQoIiAgbUFjdGl2ZVBhc3N3b3JkTGV0dGVycz0iKTsgcHcucHJpbnRsbihtQWN0aXZlUGFzc3dvcmRMZXR0ZXJzKTsKKyAgICAgICAgICAgIHB3LnByaW50KCIgIG1BY3RpdmVQYXNzd29yZE51bWVyaWM9Iik7IHB3LnByaW50bG4obUFjdGl2ZVBhc3N3b3JkTnVtZXJpYyk7CisgICAgICAgICAgICBwdy5wcmludCgiICBtQWN0aXZlUGFzc3dvcmRTeW1ib2xzPSIpOyBwdy5wcmludGxuKG1BY3RpdmVQYXNzd29yZFN5bWJvbHMpOworICAgICAgICAgICAgcHcucHJpbnQoIiAgbUFjdGl2ZVBhc3N3b3JkTm9uTGV0dGVyPSIpOyBwdy5wcmludGxuKG1BY3RpdmVQYXNzd29yZE5vbkxldHRlcik7CiAgICAgICAgICAgICBwdy5wcmludCgiICBtRmFpbGVkUGFzc3dvcmRBdHRlbXB0cz0iKTsgcHcucHJpbnRsbihtRmFpbGVkUGFzc3dvcmRBdHRlbXB0cyk7CiAgICAgICAgICAgICBwdy5wcmludCgiICBtUGFzc3dvcmRPd25lcj0iKTsgcHcucHJpbnRsbihtUGFzc3dvcmRPd25lcik7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0lucHV0TWV0aG9kTWFuYWdlclNlcnZpY2UuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0lucHV0TWV0aG9kTWFuYWdlclNlcnZpY2UuamF2YQppbmRleCAyZTMzY2YxLi5jNjFiYWFkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9JbnB1dE1ldGhvZE1hbmFnZXJTZXJ2aWNlLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvSW5wdXRNZXRob2RNYW5hZ2VyU2VydmljZS5qYXZhCkBAIC00NzUsOCArNDc1LDEwIEBACiAgICAgICAgICAgICAgICAgbUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCksCiAgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLkVOQUJMRURfSU5QVVRfTUVUSE9EUyk7CiAgICAgICAgIFNsb2cuaShUQUcsICJFbmFibGVkIGlucHV0IG1ldGhvZHM6ICIgKyBlbmFibGVkU3RyKTsKLSAgICAgICAgaWYgKGVuYWJsZWRTdHIgPT0gbnVsbCkgewotICAgICAgICAgICAgU2xvZy5pKFRBRywgIkVuYWJsZWQgaW5wdXQgbWV0aG9kcyBoYXMgbm90IGJlZW4gc2V0LCBlbmFibGluZyBhbGwiKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGRlZmF1bHRJbWUgPSBTZXR0aW5ncy5TZWN1cmUuZ2V0U3RyaW5nKG1Db250ZXh0CisgICAgICAgICAgICAgICAgLmdldENvbnRlbnRSZXNvbHZlcigpLCBTZXR0aW5ncy5TZWN1cmUuREVGQVVMVF9JTlBVVF9NRVRIT0QpOworICAgICAgICBpZiAoZW5hYmxlZFN0ciA9PSBudWxsIHx8IFRleHRVdGlscy5pc0VtcHR5KGRlZmF1bHRJbWUpKSB7CisgICAgICAgICAgICBTbG9nLmkoVEFHLCAiRW5hYmxlZCBpbnB1dCBtZXRob2RzIG9yIGRlZmF1bHQgSU1FIGhhcyBub3QgYmVlbiBzZXQsIGVuYWJsaW5nIGFsbCIpOwogICAgICAgICAgICAgSW5wdXRNZXRob2RJbmZvIGRlZkltID0gbnVsbDsKICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigyNTYpOwogICAgICAgICAgICAgZmluYWwgaW50IE4gPSBtTWV0aG9kTGlzdC5zaXplKCk7CkBAIC05ODEsNyArOTgzLDcgQEAKICAgICB2b2lkIHNldElucHV0TWV0aG9kTG9ja2VkKFN0cmluZyBpZCkgewogICAgICAgICBJbnB1dE1ldGhvZEluZm8gaW5mbyA9IG1NZXRob2RNYXAuZ2V0KGlkKTsKICAgICAgICAgaWYgKGluZm8gPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5rbm93biBpZDogIiArIG1DdXJNZXRob2RJZCk7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbmtub3duIGlkOiAiICsgaWQpOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKGlkLmVxdWFscyhtQ3VyTWV0aG9kSWQpKSB7CkBAIC0xNDc5LDcgKzE0ODEsNyBAQAogCiAgICAgICAgIFN0cmluZyBkZWZhdWx0SW1lID0gU2V0dGluZ3MuU2VjdXJlLmdldFN0cmluZyhtQ29udGV4dAogICAgICAgICAgICAgICAgIC5nZXRDb250ZW50UmVzb2x2ZXIoKSwgU2V0dGluZ3MuU2VjdXJlLkRFRkFVTFRfSU5QVVRfTUVUSE9EKTsKLSAgICAgICAgaWYgKCFtYXAuY29udGFpbnNLZXkoZGVmYXVsdEltZSkpIHsKKyAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShkZWZhdWx0SW1lKSAmJiAhbWFwLmNvbnRhaW5zS2V5KGRlZmF1bHRJbWUpKSB7CiAgICAgICAgICAgICBpZiAoY2hvb3NlTmV3RGVmYXVsdElNRUxvY2tlZCgpKSB7CiAgICAgICAgICAgICAgICAgdXBkYXRlRnJvbVNldHRpbmdzTG9ja2VkKCk7CiAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9Mb2NhdGlvbk1hbmFnZXJTZXJ2aWNlLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9Mb2NhdGlvbk1hbmFnZXJTZXJ2aWNlLmphdmEKaW5kZXggM2JjZjQyNy4uNTY5NzE4MSAxMDA2NDQKLS0tIGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvTG9jYXRpb25NYW5hZ2VyU2VydmljZS5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0xvY2F0aW9uTWFuYWdlclNlcnZpY2UuamF2YQpAQCAtNDY1LDEwICs0NjUsMTEgQEAKICAgICAgICAgbUVuYWJsZWRQcm92aWRlcnMuYWRkKHBhc3NpdmVQcm92aWRlci5nZXROYW1lKCkpOwogCiAgICAgICAgIC8vIGluaXRpYWxpemUgZXh0ZXJuYWwgbmV0d29yayBsb2NhdGlvbiBhbmQgZ2VvY29kZXIgc2VydmljZXMKKyAgICAgICAgUGFja2FnZU1hbmFnZXIgcG0gPSBtQ29udGV4dC4gZ2V0UGFja2FnZU1hbmFnZXIoKTsKICAgICAgICAgUmVzb3VyY2VzIHJlc291cmNlcyA9IG1Db250ZXh0LmdldFJlc291cmNlcygpOwogICAgICAgICBTdHJpbmcgc2VydmljZU5hbWUgPSByZXNvdXJjZXMuZ2V0U3RyaW5nKAogICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3RyaW5nLmNvbmZpZ19uZXR3b3JrTG9jYXRpb25Qcm92aWRlcik7Ci0gICAgICAgIGlmIChzZXJ2aWNlTmFtZSAhPSBudWxsKSB7CisgICAgICAgIGlmIChzZXJ2aWNlTmFtZSAhPSBudWxsICYmIHBtLnJlc29sdmVTZXJ2aWNlKG5ldyBJbnRlbnQoc2VydmljZU5hbWUpLCAwKSAhPSBudWxsKSB7CiAgICAgICAgICAgICBtTmV0d29ya0xvY2F0aW9uUHJvdmlkZXIgPQogICAgICAgICAgICAgICAgIG5ldyBMb2NhdGlvblByb3ZpZGVyUHJveHkobUNvbnRleHQsIExvY2F0aW9uTWFuYWdlci5ORVRXT1JLX1BST1ZJREVSLAogICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZU5hbWUsIG1Mb2NhdGlvbkhhbmRsZXIpOwpAQCAtNDc2LDcgKzQ3Nyw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBzZXJ2aWNlTmFtZSA9IHJlc291cmNlcy5nZXRTdHJpbmcoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcuY29uZmlnX2dlb2NvZGVQcm92aWRlcik7Ci0gICAgICAgIGlmIChzZXJ2aWNlTmFtZSAhPSBudWxsKSB7CisgICAgICAgIGlmIChzZXJ2aWNlTmFtZSAhPSBudWxsICYmIHBtLnJlc29sdmVTZXJ2aWNlKG5ldyBJbnRlbnQoc2VydmljZU5hbWUpLCAwKSAhPSBudWxsKSB7CiAgICAgICAgICAgICBtR2VvY29kZVByb3ZpZGVyID0gbmV3IEdlb2NvZGVyUHJveHkobUNvbnRleHQsIHNlcnZpY2VOYW1lKTsKICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9Nb3VudFNlcnZpY2UuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL01vdW50U2VydmljZS5qYXZhCmluZGV4IGZkZWQ2MjMuLmQ2MDQ4ODYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL01vdW50U2VydmljZS5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL01vdW50U2VydmljZS5qYXZhCkBAIC0xMzUsNiArMTM1LDggQEAKICAgICBwcml2YXRlIGJvb2xlYW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJvb3RlZCA9IGZhbHNlOwogICAgIHByaXZhdGUgYm9vbGVhbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUmVhZHkgPSBmYWxzZTsKICAgICBwcml2YXRlIGJvb2xlYW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNlbmRVbXNDb25uZWN0ZWRPbkJvb3QgPSBmYWxzZTsKKyAgICAvLyB0cnVlIGlmIHdlIHNob3VsZCBmYWtlIE1FRElBX01PVU5URUQgc3RhdGUgZm9yIGV4dGVybmFsIHN0b3JhZ2UKKyAgICBwcml2YXRlIGJvb2xlYW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUVtdWxhdGVFeHRlcm5hbFN0b3JhZ2UgPSBmYWxzZTsKIAogICAgIC8qKgogICAgICAqIFByaXZhdGUgaGFzaCBvZiBjdXJyZW50bHkgbW91bnRlZCBzZWN1cmUgY29udGFpbmVycy4KQEAgLTM5NSw3ICszOTcsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYXRoID0gRW52aXJvbm1lbnQuZ2V0RXh0ZXJuYWxTdG9yYWdlRGlyZWN0b3J5KCkuZ2V0UGF0aCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzdGF0ZSA9IGdldFZvbHVtZVN0YXRlKHBhdGgpOwogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmVxdWFscyhFbnZpcm9ubWVudC5NRURJQV9VTk1PVU5URUQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1FbXVsYXRlRXh0ZXJuYWxTdG9yYWdlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeVZvbHVtZVN0YXRlQ2hhbmdlKG51bGwsIHBhdGgsIFZvbHVtZVN0YXRlLk5vTWVkaWEsIFZvbHVtZVN0YXRlLk1vdW50ZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdGUuZXF1YWxzKEVudmlyb25tZW50Lk1FRElBX1VOTU9VTlRFRCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJjID0gZG9Nb3VudFZvbHVtZShwYXRoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJjICE9IFN0b3JhZ2VSZXN1bHRDb2RlLk9wZXJhdGlvblN1Y2NlZWRlZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgU3RyaW5nLmZvcm1hdCgiQm9vdC10aW1lIG1vdW50IGZhaWxlZCAoJWQpIiwgcmMpKTsKQEAgLTQ2NiwxMSArNDcwLDEzIEBACiAgICAgICAgICAgICBTbG9nLncoVEFHLCBTdHJpbmcuZm9ybWF0KCJEdXBsaWNhdGUgc3RhdGUgdHJhbnNpdGlvbiAoJXMgLT4gJXMpIiwgbUxlZ2FjeVN0YXRlLCBzdGF0ZSkpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0gICAgICAgIC8vIFVwZGF0ZSBzdGF0ZSBvbiBQYWNrYWdlTWFuYWdlcgotICAgICAgICBpZiAoRW52aXJvbm1lbnQuTUVESUFfVU5NT1VOVEVELmVxdWFscyhzdGF0ZSkpIHsKLSAgICAgICAgICAgIG1QbXMudXBkYXRlRXh0ZXJuYWxNZWRpYVN0YXR1cyhmYWxzZSwgZmFsc2UpOwotICAgICAgICB9IGVsc2UgaWYgKEVudmlyb25tZW50Lk1FRElBX01PVU5URUQuZXF1YWxzKHN0YXRlKSkgewotICAgICAgICAgICAgbVBtcy51cGRhdGVFeHRlcm5hbE1lZGlhU3RhdHVzKHRydWUsIGZhbHNlKTsKKyAgICAgICAgLy8gVXBkYXRlIHN0YXRlIG9uIFBhY2thZ2VNYW5hZ2VyLCBidXQgb25seSBvZiByZWFsIGV2ZW50cworICAgICAgICBpZiAoIW1FbXVsYXRlRXh0ZXJuYWxTdG9yYWdlKSB7CisgICAgICAgICAgICBpZiAoRW52aXJvbm1lbnQuTUVESUFfVU5NT1VOVEVELmVxdWFscyhzdGF0ZSkpIHsKKyAgICAgICAgICAgICAgICBtUG1zLnVwZGF0ZUV4dGVybmFsTWVkaWFTdGF0dXMoZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoRW52aXJvbm1lbnQuTUVESUFfTU9VTlRFRC5lcXVhbHMoc3RhdGUpKSB7CisgICAgICAgICAgICAgICAgbVBtcy51cGRhdGVFeHRlcm5hbE1lZGlhU3RhdHVzKHRydWUsIGZhbHNlKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBTdHJpbmcgb2xkU3RhdGUgPSBtTGVnYWN5U3RhdGU7CiAgICAgICAgIG1MZWdhY3lTdGF0ZSA9IHN0YXRlOwpAQCAtOTcwLDYgKzk3NiwxMyBAQAogICAgIHB1YmxpYyBNb3VudFNlcnZpY2UoQ29udGV4dCBjb250ZXh0KSB7CiAgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKIAorICAgICAgICBtRW11bGF0ZUV4dGVybmFsU3RvcmFnZSA9IGNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0Qm9vbGVhbigKKyAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmJvb2wuY29uZmlnX2VtdWxhdGVFeHRlcm5hbFN0b3JhZ2UpOworICAgICAgICBpZiAobUVtdWxhdGVFeHRlcm5hbFN0b3JhZ2UpIHsKKyAgICAgICAgICAgIFNsb2cuZChUQUcsICJ1c2luZyBlbXVsYXRlZCBleHRlcm5hbCBzdG9yYWdlIik7CisgICAgICAgICAgICBtTGVnYWN5U3RhdGUgPSBFbnZpcm9ubWVudC5NRURJQV9NT1VOVEVEOworICAgICAgICB9CisKICAgICAgICAgLy8gWFhYOiBUaGlzIHdpbGwgZ28gYXdheSBzb29uIGluIGZhdm9yIG9mIElNb3VudFNlcnZpY2VPYnNlcnZlcgogICAgICAgICBtUG1zID0gKFBhY2thZ2VNYW5hZ2VyU2VydmljZSkgU2VydmljZU1hbmFnZXIuZ2V0U2VydmljZSgicGFja2FnZSIpOwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9OYXRpdmVEYWVtb25Db25uZWN0b3IuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL05hdGl2ZURhZW1vbkNvbm5lY3Rvci5qYXZhCmluZGV4IGM0NTI1OTAuLjI0OWMzMmIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL05hdGl2ZURhZW1vbkNvbm5lY3Rvci5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL05hdGl2ZURhZW1vbkNvbm5lY3Rvci5qYXZhCkBAIC0xMjgsMTEgKzEyOCwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgU3RyaW5nLmZvcm1hdCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVycm9yIGhhbmRsaW5nICclcyciLCBldmVudCksIGV4KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUmVzcG9uc2VRdWV1ZS5wdXQoZXZlbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNsb2cuZShUQUcsICJGYWlsZWQgdG8gcHV0IHJlc3BvbnNlIG9udG8gcXVldWUiLCBleCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1SZXNwb25zZVF1ZXVlLnB1dChldmVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbG9nLmUoVEFHLCAiRmFpbGVkIHRvIHB1dCByZXNwb25zZSBvbnRvIHF1ZXVlIiwgZXgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5mZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNsb2cudyhUQUcsIFN0cmluZy5mb3JtYXQoIkJhZCBtc2cgKCVzKSIsIGV2ZW50KSk7CkBAIC0yMDksNiArMjEwLDcgQEAKICAgICAgKi8KICAgICBwdWJsaWMgc3luY2hyb25pemVkIEFycmF5TGlzdDxTdHJpbmc+IGRvQ29tbWFuZChTdHJpbmcgY21kKQogICAgICAgICAgICAgdGhyb3dzIE5hdGl2ZURhZW1vbkNvbm5lY3RvckV4Y2VwdGlvbiAgeworICAgICAgICBtUmVzcG9uc2VRdWV1ZS5jbGVhcigpOwogICAgICAgICBzZW5kQ29tbWFuZChjbWQpOwogCiAgICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IHJlc3BvbnNlID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9OZXR3b3JrTWFuYWdlbWVudFNlcnZpY2UuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL05ldHdvcmtNYW5hZ2VtZW50U2VydmljZS5qYXZhCmluZGV4IGMxNTYxNTAuLmNiOGZhMzUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL05ldHdvcmtNYW5hZ2VtZW50U2VydmljZS5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL05ldHdvcmtNYW5hZ2VtZW50U2VydmljZS5qYXZhCkBAIC0yMDMsMTAgKzIwMywxMCBAQAogICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbmtub3duSG9zdEV4Y2VwdGlvbihhZGRyU3RyaW5nKTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaW50IGEgPSBJbnRlZ2VyLnBhcnNlSW50KHBhcnRzWzBdKSAgICAgIDsKLSAgICAgICAgICAgIGludCBiID0gSW50ZWdlci5wYXJzZUludChwYXJ0c1sxXSkgPDwgIDg7Ci0gICAgICAgICAgICBpbnQgYyA9IEludGVnZXIucGFyc2VJbnQocGFydHNbMl0pIDw8IDE2OwotICAgICAgICAgICAgaW50IGQgPSBJbnRlZ2VyLnBhcnNlSW50KHBhcnRzWzNdKSA8PCAyNDsKKyAgICAgICAgICAgIGludCBhID0gSW50ZWdlci5wYXJzZUludChwYXJ0c1swXSkgPDwgMjQ7CisgICAgICAgICAgICBpbnQgYiA9IEludGVnZXIucGFyc2VJbnQocGFydHNbMV0pIDw8IDE2OworICAgICAgICAgICAgaW50IGMgPSBJbnRlZ2VyLnBhcnNlSW50KHBhcnRzWzJdKSA8PCAgODsKKyAgICAgICAgICAgIGludCBkID0gSW50ZWdlci5wYXJzZUludChwYXJ0c1szXSkgICAgICA7CiAKICAgICAgICAgICAgIHJldHVybiBhIHwgYiB8IGMgfCBkOwogICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZXgpIHsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL05vdGlmaWNhdGlvbk1hbmFnZXJTZXJ2aWNlLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9Ob3RpZmljYXRpb25NYW5hZ2VyU2VydmljZS5qYXZhCmluZGV4IGVkOGI5MGIuLjlkMjYyYjYgMTAwNzU1Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL05vdGlmaWNhdGlvbk1hbmFnZXJTZXJ2aWNlLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvTm90aWZpY2F0aW9uTWFuYWdlclNlcnZpY2UuamF2YQpAQCAtNjEsNiArNjEsNyBAQAogaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlFdmVudDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5TWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5Ub2FzdDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5Ub2FzdDsKIAogaW1wb3J0IGphdmEuaW8uRmlsZURlc2NyaXB0b3I7CiBpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKQEAgLTI4MSw2ICsyODIsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uLkZMQUdfRk9SRUdST1VORF9TRVJWSUNFKTsKICAgICAgICAgfQogCisgICAgICAgIHB1YmxpYyB2b2lkIG9uTm90aWZpY2F0aW9uQ2xlYXIoU3RyaW5nIHBrZywgU3RyaW5nIHRhZywgaW50IGlkKSB7CisgICAgICAgICAgICBjYW5jZWxOb3RpZmljYXRpb24ocGtnLCB0YWcsIGlkLCAwLCAwKTsgLy8gbWF5YmUgYWRkIHNvbWUgZmxhZ3M/CisgICAgICAgIH0KKwogICAgICAgICBwdWJsaWMgdm9pZCBvblBhbmVsUmV2ZWFsZWQoKSB7CiAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1Ob3RpZmljYXRpb25MaXN0KSB7CiAgICAgICAgICAgICAgICAgLy8gc291bmQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1BhY2thZ2VNYW5hZ2VyU2VydmljZS5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvUGFja2FnZU1hbmFnZXJTZXJ2aWNlLmphdmEKaW5kZXggMGZmMzNkMS4uOGE4NzZhMiAxMDA2NDQKLS0tIGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvUGFja2FnZU1hbmFnZXJTZXJ2aWNlLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvUGFja2FnZU1hbmFnZXJTZXJ2aWNlLmphdmEKQEAgLTk1OTQsNyArOTU5NCw4IEBACiAgICAgKiBVcGRhdGUgbWVkaWEgc3RhdHVzIG9uIFBhY2thZ2VNYW5hZ2VyLgogICAgICovCiAgICBwdWJsaWMgdm9pZCB1cGRhdGVFeHRlcm5hbE1lZGlhU3RhdHVzKGZpbmFsIGJvb2xlYW4gbWVkaWFTdGF0dXMsIGZpbmFsIGJvb2xlYW4gcmVwb3J0U3RhdHVzKSB7Ci0gICAgICAgaWYgKEJpbmRlci5nZXRDYWxsaW5nVWlkKCkgIT0gUHJvY2Vzcy5TWVNURU1fVUlEKSB7CisgICAgICAgaW50IGNhbGxpbmdVaWQgPSBCaW5kZXIuZ2V0Q2FsbGluZ1VpZCgpOworICAgICAgIGlmIChjYWxsaW5nVWlkICE9IDAgJiYgY2FsbGluZ1VpZCAhPSBQcm9jZXNzLlNZU1RFTV9VSUQpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IFNlY3VyaXR5RXhjZXB0aW9uKCJNZWRpYSBzdGF0dXMgY2FuIG9ubHkgYmUgdXBkYXRlZCBieSB0aGUgc3lzdGVtIik7CiAgICAgICAgfQogICAgICAgIHN5bmNocm9uaXplZCAobVBhY2thZ2VzKSB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9TYW1wbGluZ1Byb2ZpbGVyU2VydmljZS5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvU2FtcGxpbmdQcm9maWxlclNlcnZpY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmFmN2Y3Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvU2FtcGxpbmdQcm9maWxlclNlcnZpY2UuamF2YQpAQCAtMCwwICsxLDExOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc2VydmVyOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkRyb3BCb3hNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQub3MuRmlsZU9ic2VydmVyOworaW1wb3J0IGFuZHJvaWQub3MuQmluZGVyOworCitpbXBvcnQgYW5kcm9pZC51dGlsLlNsb2c7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5Db250ZW50T2JzZXJ2ZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1Qcm9wZXJ0aWVzOworaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3M7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwub3MuU2FtcGxpbmdQcm9maWxlckludGVncmF0aW9uOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZURlc2NyaXB0b3I7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworCitwdWJsaWMgY2xhc3MgU2FtcGxpbmdQcm9maWxlclNlcnZpY2UgZXh0ZW5kcyBCaW5kZXIgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJTYW1wbGluZ1Byb2ZpbGVyU2VydmljZSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBMT0NBTF9MT0dWID0gZmFsc2U7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU05BUFNIT1RfRElSID0gU2FtcGxpbmdQcm9maWxlckludGVncmF0aW9uLlNOQVBTSE9UX0RJUjsKKworICAgIHByaXZhdGUgRmlsZU9ic2VydmVyIHNuYXBzaG90T2JzZXJ2ZXI7CisKKyAgICBwdWJsaWMgU2FtcGxpbmdQcm9maWxlclNlcnZpY2UoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHJlZ2lzdGVyU2V0dGluZ09ic2VydmVyKGNvbnRleHQpOworICAgICAgICBzdGFydFdvcmtpbmcoY29udGV4dCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHN0YXJ0V29ya2luZyhDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgaWYgKExPQ0FMX0xPR1YpIFNsb2cudihUQUcsICJzdGFydGluZyBTYW1wbGluZ1Byb2ZpbGVyU2VydmljZSEiKTsKKworICAgICAgICBmaW5hbCBEcm9wQm94TWFuYWdlciBkcm9wYm94ID0KKyAgICAgICAgICAgICAgICAoRHJvcEJveE1hbmFnZXIpIGNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkRST1BCT1hfU0VSVklDRSk7CisKKyAgICAgICAgLy8gYmVmb3JlIEZpbGVPYnNlcnZlciBpcyByZWFkeSwgdGhlcmUgY291bGQgaGF2ZSBhbHJlYWR5IGJlZW4gc29tZSBzbmFwc2hvdHMKKyAgICAgICAgLy8gaW4gdGhlIGRpcmVjdG9yeSwgd2UgZG9uJ3Qgd2FudCB0byBtaXNzIHRoZW0KKyAgICAgICAgRmlsZVtdIHNuYXBzaG90RmlsZXMgPSBuZXcgRmlsZShTTkFQU0hPVF9ESVIpLmxpc3RGaWxlcygpOworICAgICAgICBmb3IgKGludCBpID0gMDsgc25hcHNob3RGaWxlcyAhPSBudWxsICYmIGkgPCBzbmFwc2hvdEZpbGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBoYW5kbGVTbmFwc2hvdEZpbGUoc25hcHNob3RGaWxlc1tpXSwgZHJvcGJveCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBkZXRlY3QgbmV3IHNuYXBzaG90IGFuZCBwdXQgaXQgaW4gZHJvcGJveAorICAgICAgICAvLyBkZWxldGUgaXQgYWZ0ZXJ3YXJkcyBubyBtYXR0ZXIgd2hhdCBoYXBwZW5lZCBiZWZvcmUKKyAgICAgICAgLy8gTm90ZTogbmVlZHMgbGlzdGVuaW5nIGF0IGV2ZW50IEFUVFJJQiByYXRoZXIgdGhhbiBDTE9TRV9XUklURSwgYmVjYXVzZSB3ZSBzZXQgdGhlCisgICAgICAgIC8vIHJlYWRhYmlsaXR5IG9mIHNuYXBzaG90IGZpbGVzIGFmdGVyIHdyaXRpbmcgdGhlbSEKKyAgICAgICAgc25hcHNob3RPYnNlcnZlciA9IG5ldyBGaWxlT2JzZXJ2ZXIoU05BUFNIT1RfRElSLCBGaWxlT2JzZXJ2ZXIuQVRUUklCKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uRXZlbnQoaW50IGV2ZW50LCBTdHJpbmcgcGF0aCkgeworICAgICAgICAgICAgICAgIGhhbmRsZVNuYXBzaG90RmlsZShuZXcgRmlsZShTTkFQU0hPVF9ESVIsIHBhdGgpLCBkcm9wYm94KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgc25hcHNob3RPYnNlcnZlci5zdGFydFdhdGNoaW5nKCk7CisKKyAgICAgICAgaWYgKExPQ0FMX0xPR1YpIFNsb2cudihUQUcsICJTYW1wbGluZ1Byb2ZpbGVyU2VydmljZSBhY3RpdmF0ZWQiKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaGFuZGxlU25hcHNob3RGaWxlKEZpbGUgZmlsZSwgRHJvcEJveE1hbmFnZXIgZHJvcGJveCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgZHJvcGJveC5hZGRGaWxlKFRBRywgZmlsZSwgMCk7CisgICAgICAgICAgICBpZiAoTE9DQUxfTE9HVikgU2xvZy52KFRBRywgZmlsZS5nZXRQYXRoKCkgKyAiIGFkZGVkIHRvIGRyb3Bib3giKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgU2xvZy5lKFRBRywgIkNhbid0IGFkZCAiICsgZmlsZS5nZXRQYXRoKCkgKyAiIHRvIGRyb3Bib3giLCBlKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGZpbGUuZGVsZXRlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcmVnaXN0ZXJTZXR0aW5nT2JzZXJ2ZXIoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIENvbnRlbnRSZXNvbHZlciBjb250ZW50UmVzb2x2ZXIgPSBjb250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpOworICAgICAgICBjb250ZW50UmVzb2x2ZXIucmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIoCisgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLmdldFVyaUZvcihTZXR0aW5ncy5TZWN1cmUuU0FNUExJTkdfUFJPRklMRVJfSFopLAorICAgICAgICAgICAgICAgIGZhbHNlLCBuZXcgU2FtcGxpbmdQcm9maWxlclNldHRpbmdzT2JzZXJ2ZXIoY29udGVudFJlc29sdmVyKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgZHVtcChGaWxlRGVzY3JpcHRvciBmZCwgUHJpbnRXcml0ZXIgcHcsIFN0cmluZ1tdIGFyZ3MpIHsKKyAgICAgICAgcHcucHJpbnRsbigiU2FtcGxpbmdQcm9maWxlclNlcnZpY2U6Iik7CisgICAgICAgIHB3LnByaW50bG4oIldhdGNoaW5nIGRpcmVjdG9yeTogIiArIFNOQVBTSE9UX0RJUik7CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBTYW1wbGluZ1Byb2ZpbGVyU2V0dGluZ3NPYnNlcnZlciBleHRlbmRzIENvbnRlbnRPYnNlcnZlciB7CisgICAgICAgIHByaXZhdGUgQ29udGVudFJlc29sdmVyIG1Db250ZW50UmVzb2x2ZXI7CisgICAgICAgIHB1YmxpYyBTYW1wbGluZ1Byb2ZpbGVyU2V0dGluZ3NPYnNlcnZlcihDb250ZW50UmVzb2x2ZXIgY29udGVudFJlc29sdmVyKSB7CisgICAgICAgICAgICBzdXBlcihudWxsKTsKKyAgICAgICAgICAgIG1Db250ZW50UmVzb2x2ZXIgPSBjb250ZW50UmVzb2x2ZXI7CisgICAgICAgICAgICBvbkNoYW5nZShmYWxzZSk7CisgICAgICAgIH0KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2hhbmdlKGJvb2xlYW4gc2VsZkNoYW5nZSkgeworICAgICAgICAgICAgSW50ZWdlciBzYW1wbGluZ1Byb2ZpbGVySHogPSBTZXR0aW5ncy5TZWN1cmUuZ2V0SW50KAorICAgICAgICAgICAgICAgICAgICBtQ29udGVudFJlc29sdmVyLCBTZXR0aW5ncy5TZWN1cmUuU0FNUExJTkdfUFJPRklMRVJfSFosIDApOworICAgICAgICAgICAgLy8gc2V0dGluZyB0aGlzIHNlY3VyZSBwcm9wZXJ0eSB3aWxsIHN0YXJ0IG9yIHN0b3Agc2FtcGxpbmcgcHJvZmlsZXIsCisgICAgICAgICAgICAvLyBhcyB3ZWxsIGFzIGFkanVzdCB0aGUgZnJlcXVlbmN5IG9mIHRha2luZyBzbmFwc2hvdHMuCisgICAgICAgICAgICBTeXN0ZW1Qcm9wZXJ0aWVzLnNldCgicGVyc2lzdC5zeXMucHJvZmlsZXJfaHoiLCBzYW1wbGluZ1Byb2ZpbGVySHoudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1N0YXR1c0Jhck1hbmFnZXJTZXJ2aWNlLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9TdGF0dXNCYXJNYW5hZ2VyU2VydmljZS5qYXZhCmluZGV4IDQxNzc0MzIuLjcxN2MzMDkgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1N0YXR1c0Jhck1hbmFnZXJTZXJ2aWNlLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvU3RhdHVzQmFyTWFuYWdlclNlcnZpY2UuamF2YQpAQCAtODQsNiArODQsNyBAQAogICAgICAgICB2b2lkIG9uU2V0RGlzYWJsZWQoaW50IHN0YXR1cyk7CiAgICAgICAgIHZvaWQgb25DbGVhckFsbCgpOwogICAgICAgICB2b2lkIG9uTm90aWZpY2F0aW9uQ2xpY2soU3RyaW5nIHBrZywgU3RyaW5nIHRhZywgaW50IGlkKTsKKyAgICAgICAgdm9pZCBvbk5vdGlmaWNhdGlvbkNsZWFyKFN0cmluZyBwa2csIFN0cmluZyB0YWcsIGludCBpZCk7CiAgICAgICAgIHZvaWQgb25QYW5lbFJldmVhbGVkKCk7CiAgICAgICAgIHZvaWQgb25Ob3RpZmljYXRpb25FcnJvcihTdHJpbmcgcGtnLCBTdHJpbmcgdGFnLCBpbnQgaWQsCiAgICAgICAgICAgICAgICAgaW50IHVpZCwgaW50IGluaXRpYWxQaWQsIFN0cmluZyBtZXNzYWdlKTsKQEAgLTMwMiw2ICszMDMsMTIgQEAKICAgICAgICAgbU5vdGlmaWNhdGlvbkNhbGxiYWNrcy5vbk5vdGlmaWNhdGlvbkVycm9yKHBrZywgdGFnLCBpZCwgdWlkLCBpbml0aWFsUGlkLCBtZXNzYWdlKTsKICAgICB9CiAKKyAgICBwdWJsaWMgdm9pZCBvbk5vdGlmaWNhdGlvbkNsZWFyKFN0cmluZyBwa2csIFN0cmluZyB0YWcsIGludCBpZCkgeworICAgICAgICBlbmZvcmNlU3RhdHVzQmFyU2VydmljZSgpOworCisgICAgICAgIG1Ob3RpZmljYXRpb25DYWxsYmFja3Mub25Ob3RpZmljYXRpb25DbGVhcihwa2csIHRhZywgaWQpOworICAgIH0KKwogICAgIHB1YmxpYyB2b2lkIG9uQ2xlYXJBbGxOb3RpZmljYXRpb25zKCkgewogICAgICAgICBlbmZvcmNlU3RhdHVzQmFyU2VydmljZSgpOwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9TeXN0ZW1TZXJ2ZXIuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1N5c3RlbVNlcnZlci5qYXZhCmluZGV4IDFhMjA5ZTIuLmQ0NGNlOTcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1N5c3RlbVNlcnZlci5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1N5c3RlbVNlcnZlci5qYXZhCkBAIC0yNCwyNiArMjQsMjYgQEAKIGltcG9ydCBkYWx2aWsuc3lzdGVtLlZNUnVudGltZTsKIGltcG9ydCBkYWx2aWsuc3lzdGVtLlp5Z290ZTsKIAoraW1wb3J0IGFuZHJvaWQuYWNjb3VudHMuQWNjb3VudE1hbmFnZXJTZXJ2aWNlOwogaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5TWFuYWdlck5hdGl2ZTsKIGltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhBZGFwdGVyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRTZXJ2aWNlOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLklQYWNrYWdlTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkNvbnRlbnRPYnNlcnZlcjsKLWltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcjsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvU2VydmljZTsKLWltcG9ydCBhbmRyb2lkLm9zLio7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0cy5QZW9wbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5Mb29wZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC5vcy5TZXJ2aWNlTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOworaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtUHJvcGVydGllczsKIGltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzOwogaW1wb3J0IGFuZHJvaWQuc2VydmVyLkJsdWV0b290aEEyZHBTZXJ2aWNlOwogaW1wb3J0IGFuZHJvaWQuc2VydmVyLkJsdWV0b290aFNlcnZpY2U7CiBpbXBvcnQgYW5kcm9pZC5zZXJ2ZXIuc2VhcmNoLlNlYXJjaE1hbmFnZXJTZXJ2aWNlOwogaW1wb3J0IGFuZHJvaWQudXRpbC5FdmVudExvZzsKIGltcG9ydCBhbmRyb2lkLnV0aWwuU2xvZzsKLWltcG9ydCBhbmRyb2lkLmFjY291bnRzLkFjY291bnRNYW5hZ2VyU2VydmljZTsKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLnV0aWwuVGltZXI7CkBAIC01MSwxMSArNTEsOCBAQAogCiBjbGFzcyBTZXJ2ZXJUaHJlYWQgZXh0ZW5kcyBUaHJlYWQgewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiU3lzdGVtU2VydmVyIjsKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBib29sZWFuIElOQ0xVREVfREVNTyA9IGZhbHNlOwogCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IExPR19CT09UX1BST0dSRVNTX1NZU1RFTV9SVU4gPSAzMDEwOwotCi0gICAgcHJpdmF0ZSBDb250ZW50UmVzb2x2ZXIgbUNvbnRlbnRSZXNvbHZlcjsKKyAgICBDb250ZW50UmVzb2x2ZXIgbUNvbnRlbnRSZXNvbHZlcjsKIAogICAgIHByaXZhdGUgY2xhc3MgQWRiU2V0dGluZ3NPYnNlcnZlciBleHRlbmRzIENvbnRlbnRPYnNlcnZlciB7CiAgICAgICAgIHB1YmxpYyBBZGJTZXR0aW5nc09ic2VydmVyKCkgewpAQCAtMjEwLDYgKzIwNyw3IEBACiAgICAgICAgIE5vdGlmaWNhdGlvbk1hbmFnZXJTZXJ2aWNlIG5vdGlmaWNhdGlvbiA9IG51bGw7CiAgICAgICAgIFdhbGxwYXBlck1hbmFnZXJTZXJ2aWNlIHdhbGxwYXBlciA9IG51bGw7CiAgICAgICAgIExvY2F0aW9uTWFuYWdlclNlcnZpY2UgbG9jYXRpb24gPSBudWxsOworICAgICAgICBDb3VudHJ5RGV0ZWN0b3JTZXJ2aWNlIGNvdW50cnlEZXRlY3RvciA9IG51bGw7CiAKICAgICAgICAgaWYgKGZhY3RvcnlUZXN0ICE9IFN5c3RlbVNlcnZlci5GQUNUT1JZX1RFU1RfTE9XX0xFVkVMKSB7CiAgICAgICAgICAgICB0cnkgewpAQCAtMzIwLDYgKzMxOCwxNCBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFNsb2cuaShUQUcsICJDb3VudHJ5IERldGVjdG9yIik7CisgICAgICAgICAgICAgICAgY291bnRyeURldGVjdG9yID0gbmV3IENvdW50cnlEZXRlY3RvclNlcnZpY2UoY29udGV4dCk7CisgICAgICAgICAgICAgICAgU2VydmljZU1hbmFnZXIuYWRkU2VydmljZShDb250ZXh0LkNPVU5UUllfREVURUNUT1IsIGNvdW50cnlEZXRlY3Rvcik7CisgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZSkgeworICAgICAgICAgICAgICAgIFNsb2cuZShUQUcsICJGYWlsdXJlIHN0YXJ0aW5nIENvdW50cnkgRGV0ZWN0b3IiLCBlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICBTbG9nLmkoVEFHLCAiU2VhcmNoIFNlcnZpY2UiKTsKICAgICAgICAgICAgICAgICBTZXJ2aWNlTWFuYWdlci5hZGRTZXJ2aWNlKENvbnRleHQuU0VBUkNIX1NFUlZJQ0UsCiAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU2VhcmNoTWFuYWdlclNlcnZpY2UoY29udGV4dCkpOwpAQCAtMzI3LDExICszMzMsNiBAQAogICAgICAgICAgICAgICAgIFNsb2cuZShUQUcsICJGYWlsdXJlIHN0YXJ0aW5nIFNlYXJjaCBTZXJ2aWNlIiwgZSk7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmIChJTkNMVURFX0RFTU8pIHsKLSAgICAgICAgICAgICAgICBTbG9nLmkoVEFHLCAiSW5zdGFsbGluZyBkZW1vIGRhdGEuLi4iKTsKLSAgICAgICAgICAgICAgICAobmV3IERlbW9UaHJlYWQoY29udGV4dCkpLnN0YXJ0KCk7Ci0gICAgICAgICAgICB9Ci0KICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgU2xvZy5pKFRBRywgIkRyb3BCb3ggU2VydmljZSIpOwogICAgICAgICAgICAgICAgIFNlcnZpY2VNYW5hZ2VyLmFkZFNlcnZpY2UoQ29udGV4dC5EUk9QQk9YX1NFUlZJQ0UsCkBAIC00MTgsMTAgKzQxOSwyMiBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIC8vIG5lZWQgdG8gYWRkIHRoaXMgc2VydmljZSBldmVuIGlmIFNhbXBsaW5nUHJvZmlsZXJJbnRlZ3JhdGlvbi5pc0VuYWJsZWQoKQorICAgICAgICAgICAgICAgIC8vIGlzIGZhbHNlLCBiZWNhdXNlIGl0IGlzIHRoaXMgc2VydmljZSB0aGF0IGRldGVjdHMgc3lzdGVtIHByb3BlcnR5IGNoYW5nZSBhbmQKKyAgICAgICAgICAgICAgICAvLyB0dXJucyBvbiBTYW1wbGluZ1Byb2ZpbGVySW50ZWdyYXRpb24uIFBsdXMsIHdoZW4gc2FtcGxpbmcgcHJvZmlsZXIgZG9lc24ndCB3b3JrLAorICAgICAgICAgICAgICAgIC8vIHRoZXJlIGlzIGxpdHRsZSBvdmVyaGVhZCBmb3IgcnVubmluZyB0aGlzIHNlcnZpY2UuCisgICAgICAgICAgICAgICAgU2xvZy5pKFRBRywgIlNhbXBsaW5nUHJvZmlsZXIgU2VydmljZSIpOworICAgICAgICAgICAgICAgIFNlcnZpY2VNYW5hZ2VyLmFkZFNlcnZpY2UoInNhbXBsaW5ncHJvZmlsZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTYW1wbGluZ1Byb2ZpbGVyU2VydmljZShjb250ZXh0KSk7CisgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZSkgeworICAgICAgICAgICAgICAgIFNsb2cuZShUQUcsICJGYWlsdXJlIHN0YXJ0aW5nIFNhbXBsaW5nUHJvZmlsZXIgU2VydmljZSIsIGUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgIFNsb2cuaShUQUcsICJTaXAgU2VydmljZSIpOwogICAgICAgICAgICAgICAgIFNlcnZpY2VNYW5hZ2VyLmFkZFNlcnZpY2UoInNpcCIsIG5ldyBTaXBTZXJ2aWNlKGNvbnRleHQpKTsKICAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0gICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgIkZhaWx1cmUgc3RhcnRpbmcgRGlza1N0YXRzIFNlcnZpY2UiLCBlKTsKKyAgICAgICAgICAgICAgICBTbG9nLmUoVEFHLCAiRmFpbHVyZSBzdGFydGluZyBTSVAgU2VydmljZSIsIGUpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTQ4Myw2ICs0OTYsNyBAQAogICAgICAgICBmaW5hbCBJbnB1dE1ldGhvZE1hbmFnZXJTZXJ2aWNlIGltbUYgPSBpbW07CiAgICAgICAgIGZpbmFsIFJlY29nbml0aW9uTWFuYWdlclNlcnZpY2UgcmVjb2duaXRpb25GID0gcmVjb2duaXRpb247CiAgICAgICAgIGZpbmFsIExvY2F0aW9uTWFuYWdlclNlcnZpY2UgbG9jYXRpb25GID0gbG9jYXRpb247CisgICAgICAgIGZpbmFsIENvdW50cnlEZXRlY3RvclNlcnZpY2UgY291bnRyeURldGVjdG9yRiA9IGNvdW50cnlEZXRlY3RvcjsKIAogICAgICAgICAvLyBXZSBub3cgdGVsbCB0aGUgYWN0aXZpdHkgbWFuYWdlciBpdCBpcyBva2F5IHRvIHJ1biB0aGlyZCBwYXJ0eQogICAgICAgICAvLyBjb2RlLiAgSXQgd2lsbCBjYWxsIGJhY2sgaW50byB1cyBvbmNlIGl0IGhhcyBnb3R0ZW4gdG8gdGhlIHN0YXRlCkBAIC01MTAsNiArNTI0LDcgQEAKICAgICAgICAgICAgICAgICBpZiAod2FsbHBhcGVyRiAhPSBudWxsKSB3YWxscGFwZXJGLnN5c3RlbVJlYWR5KCk7CiAgICAgICAgICAgICAgICAgaWYgKGltbUYgIT0gbnVsbCkgaW1tRi5zeXN0ZW1SZWFkeSgpOwogICAgICAgICAgICAgICAgIGlmIChsb2NhdGlvbkYgIT0gbnVsbCkgbG9jYXRpb25GLnN5c3RlbVJlYWR5KCk7CisgICAgICAgICAgICAgICAgaWYgKGNvdW50cnlEZXRlY3RvckYgIT0gbnVsbCkgY291bnRyeURldGVjdG9yRi5zeXN0ZW1SZWFkeSgpOwogICAgICAgICAgICAgICAgIGlmICh0aHJvdHRsZUYgIT0gbnVsbCkgdGhyb3R0bGVGLnN5c3RlbVJlYWR5KCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0pOwpAQCAtNTE5LDM3ICs1MzQsNyBAQAogICAgIH0KIH0KIAotY2xhc3MgRGVtb1RocmVhZCBleHRlbmRzIFRocmVhZAotewotICAgIERlbW9UaHJlYWQoQ29udGV4dCBjb250ZXh0KQotICAgIHsKLSAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHJ1bigpCi0gICAgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgQ3Vyc29yIGMgPSBtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKS5xdWVyeShQZW9wbGUuQ09OVEVOVF9VUkksIG51bGwsIG51bGwsIG51bGwsIG51bGwpOwotICAgICAgICAgICAgYm9vbGVhbiBoYXNEYXRhID0gYyAhPSBudWxsICYmIGMubW92ZVRvRmlyc3QoKTsKLSAgICAgICAgICAgIGlmIChjICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjLmRlYWN0aXZhdGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghaGFzRGF0YSkgewotICAgICAgICAgICAgICAgIERlbW9EYXRhU2V0IGRhdGFzZXQgPSBuZXcgRGVtb0RhdGFTZXQoKTsKLSAgICAgICAgICAgICAgICBkYXRhc2V0LmFkZChtQ29udGV4dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0gICAgICAgICAgICBTbG9nLmUoIlN5c3RlbVNlcnZlciIsICJGYWlsdXJlIGluc3RhbGxpbmcgZGVtbyBkYXRhIiwgZSk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIENvbnRleHQgbUNvbnRleHQ7Ci19Ci0KLXB1YmxpYyBjbGFzcyBTeXN0ZW1TZXJ2ZXIKLXsKK3B1YmxpYyBjbGFzcyBTeXN0ZW1TZXJ2ZXIgewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiU3lzdGVtU2VydmVyIjsKIAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZBQ1RPUllfVEVTVF9PRkYgPSAwOwpAQCAtNTczLDcgKzU1OCw3IEBACiAgICAgICAgICAgICB0aW1lci5zY2hlZHVsZShuZXcgVGltZXJUYXNrKCkgewogICAgICAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgU2FtcGxpbmdQcm9maWxlckludGVncmF0aW9uLndyaXRlU25hcHNob3QoInN5c3RlbV9zZXJ2ZXIiKTsKKyAgICAgICAgICAgICAgICAgICAgU2FtcGxpbmdQcm9maWxlckludGVncmF0aW9uLndyaXRlU25hcHNob3QoInN5c3RlbV9zZXJ2ZXIiLCBudWxsKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9LCBTTkFQU0hPVF9JTlRFUlZBTCwgU05BUFNIT1RfSU5URVJWQUwpOwogICAgICAgICB9CkBAIC01ODEsNyArNTY2LDcgQEAKICAgICAgICAgLy8gVGhlIHN5c3RlbSBzZXJ2ZXIgaGFzIHRvIHJ1biBhbGwgb2YgdGhlIHRpbWUsIHNvIGl0IG5lZWRzIHRvIGJlCiAgICAgICAgIC8vIGFzIGVmZmljaWVudCBhcyBwb3NzaWJsZSB3aXRoIGl0cyBtZW1vcnkgdXNhZ2UuCiAgICAgICAgIFZNUnVudGltZS5nZXRSdW50aW1lKCkuc2V0VGFyZ2V0SGVhcFV0aWxpemF0aW9uKDAuOGYpOwotICAgICAgICAKKwogICAgICAgICBTeXN0ZW0ubG9hZExpYnJhcnkoImFuZHJvaWRfc2VydmVycyIpOwogICAgICAgICBpbml0MShhcmdzKTsKICAgICB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9UZWxlcGhvbnlSZWdpc3RyeS5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvVGVsZXBob255UmVnaXN0cnkuamF2YQppbmRleCA3ZTIzNDIyLi43MzIzNGRmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9UZWxlcGhvbnlSZWdpc3RyeS5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1RlbGVwaG9ueVJlZ2lzdHJ5LmphdmEKQEAgLTE5LDcgKzE5LDcgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLm5ldC5OZXR3b3JrVXRpbHM7CitpbXBvcnQgYW5kcm9pZC5uZXQuTmV0d29ya1Byb3BlcnRpZXM7CiBpbXBvcnQgYW5kcm9pZC5vcy5CaW5kZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOwpAQCAtMzUsNiArMzUsNyBAQAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS5pby5GaWxlRGVzY3JpcHRvcjsKIGltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEubmV0Lk5ldHdvcmtJbnRlcmZhY2U7CiAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5hcHAuSUJhdHRlcnlTdGF0czsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuSVRlbGVwaG9ueVJlZ2lzdHJ5OwpAQCAtODksOSArOTAsOSBAQAogCiAgICAgcHJpdmF0ZSBTdHJpbmcgbURhdGFDb25uZWN0aW9uQXBuID0gIiI7CiAKLSAgICBwcml2YXRlIFN0cmluZ1tdIG1EYXRhQ29ubmVjdGlvbkFwblR5cGVzID0gbnVsbDsKKyAgICBwcml2YXRlIEFycmF5TGlzdDxTdHJpbmc+IG1Db25uZWN0ZWRBcG5zOwogCi0gICAgcHJpdmF0ZSBTdHJpbmcgbURhdGFDb25uZWN0aW9uSW50ZXJmYWNlTmFtZSA9ICIiOworICAgIHByaXZhdGUgTmV0d29ya1Byb3BlcnRpZXMgbURhdGFDb25uZWN0aW9uUHJvcGVydGllczsKIAogICAgIHByaXZhdGUgQnVuZGxlIG1DZWxsTG9jYXRpb24gPSBuZXcgQnVuZGxlKCk7CiAKQEAgLTEyMSw2ICsxMjIsNyBAQAogICAgICAgICB9CiAgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKICAgICAgICAgbUJhdHRlcnlTdGF0cyA9IEJhdHRlcnlTdGF0c1NlcnZpY2UuZ2V0U2VydmljZSgpOworICAgICAgICBtQ29ubmVjdGVkQXBucyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIGxpc3RlbihTdHJpbmcgcGtnRm9yRGVidWcsIElQaG9uZVN0YXRlTGlzdGVuZXIgY2FsbGJhY2ssIGludCBldmVudHMsCkBAIC0yMzMsMTkgKzIzNSwyMCBAQAogICAgICAgICBpZiAoIWNoZWNrTm90aWZ5UGVybWlzc2lvbigibm90aWZ5Q2FsbFN0YXRlKCkiKSkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CisgICAgICAgIEFycmF5TGlzdDxJQmluZGVyPiByZW1vdmVMaXN0ID0gbmV3IEFycmF5TGlzdDxJQmluZGVyPigpOwogICAgICAgICBzeW5jaHJvbml6ZWQgKG1SZWNvcmRzKSB7CiAgICAgICAgICAgICBtQ2FsbFN0YXRlID0gc3RhdGU7CiAgICAgICAgICAgICBtQ2FsbEluY29taW5nTnVtYmVyID0gaW5jb21pbmdOdW1iZXI7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gbVJlY29yZHMuc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKLSAgICAgICAgICAgICAgICBSZWNvcmQgciA9IG1SZWNvcmRzLmdldChpKTsKKyAgICAgICAgICAgIGZvciAoUmVjb3JkIHIgOiBtUmVjb3JkcykgewogICAgICAgICAgICAgICAgIGlmICgoci5ldmVudHMgJiBQaG9uZVN0YXRlTGlzdGVuZXIuTElTVEVOX0NBTExfU1RBVEUpICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgIHIuY2FsbGJhY2sub25DYWxsU3RhdGVDaGFuZ2VkKHN0YXRlLCBpbmNvbWluZ051bWJlcik7CiAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlKHIuYmluZGVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUxpc3QuYWRkKHIuYmluZGVyKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoSUJpbmRlciBiIDogcmVtb3ZlTGlzdCkgcmVtb3ZlKGIpOwogICAgICAgICB9CiAgICAgICAgIGJyb2FkY2FzdENhbGxTdGF0ZUNoYW5nZWQoc3RhdGUsIGluY29taW5nTnVtYmVyKTsKICAgICB9CkBAIC0yNTYsOCArMjU5LDcgQEAKICAgICAgICAgfQogICAgICAgICBzeW5jaHJvbml6ZWQgKG1SZWNvcmRzKSB7CiAgICAgICAgICAgICBtU2VydmljZVN0YXRlID0gc3RhdGU7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gbVJlY29yZHMuc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKLSAgICAgICAgICAgICAgICBSZWNvcmQgciA9IG1SZWNvcmRzLmdldChpKTsKKyAgICAgICAgICAgIGZvciAoUmVjb3JkIHIgOiBtUmVjb3JkcykgewogICAgICAgICAgICAgICAgIGlmICgoci5ldmVudHMgJiBQaG9uZVN0YXRlTGlzdGVuZXIuTElTVEVOX1NFUlZJQ0VfU1RBVEUpICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgc2VuZFNlcnZpY2VTdGF0ZShyLCBzdGF0ZSk7CiAgICAgICAgICAgICAgICAgfQpAQCAtMjcwLDEwICsyNzIsMTAgQEAKICAgICAgICAgaWYgKCFjaGVja05vdGlmeVBlcm1pc3Npb24oIm5vdGlmeVNpZ25hbFN0cmVuZ3RoKCkiKSkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CisgICAgICAgIEFycmF5TGlzdDxJQmluZGVyPiByZW1vdmVMaXN0ID0gbmV3IEFycmF5TGlzdDxJQmluZGVyPigpOwogICAgICAgICBzeW5jaHJvbml6ZWQgKG1SZWNvcmRzKSB7CiAgICAgICAgICAgICBtU2lnbmFsU3RyZW5ndGggPSBzaWduYWxTdHJlbmd0aDsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSBtUmVjb3Jkcy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgewotICAgICAgICAgICAgICAgIFJlY29yZCByID0gbVJlY29yZHMuZ2V0KGkpOworICAgICAgICAgICAgZm9yIChSZWNvcmQgciA6IG1SZWNvcmRzKSB7CiAgICAgICAgICAgICAgICAgaWYgKChyLmV2ZW50cyAmIFBob25lU3RhdGVMaXN0ZW5lci5MSVNURU5fU0lHTkFMX1NUUkVOR1RIUykgIT0gMCkgewogICAgICAgICAgICAgICAgICAgICBzZW5kU2lnbmFsU3RyZW5ndGgociwgc2lnbmFsU3RyZW5ndGgpOwogICAgICAgICAgICAgICAgIH0KQEAgLTI4MywxMCArMjg1LDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICByLmNhbGxiYWNrLm9uU2lnbmFsU3RyZW5ndGhDaGFuZ2VkKChnc21TaWduYWxTdHJlbmd0aCA9PSA5OSA/IC0xCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZ3NtU2lnbmFsU3RyZW5ndGgpKTsKICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZW1vdmUoci5iaW5kZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlTGlzdC5hZGQoci5iaW5kZXIpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChJQmluZGVyIGIgOiByZW1vdmVMaXN0KSByZW1vdmUoYik7CiAgICAgICAgIH0KICAgICAgICAgYnJvYWRjYXN0U2lnbmFsU3RyZW5ndGhDaGFuZ2VkKHNpZ25hbFN0cmVuZ3RoKTsKICAgICB9CkBAIC0yOTUsMTggKzI5OCwxOSBAQAogICAgICAgICBpZiAoIWNoZWNrTm90aWZ5UGVybWlzc2lvbigibm90aWZ5TWVzc2FnZVdhaXRpbmdDaGFuZ2VkKCkiKSkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CisgICAgICAgIEFycmF5TGlzdDxJQmluZGVyPiByZW1vdmVMaXN0ID0gbmV3IEFycmF5TGlzdDxJQmluZGVyPigpOwogICAgICAgICBzeW5jaHJvbml6ZWQgKG1SZWNvcmRzKSB7CiAgICAgICAgICAgICBtTWVzc2FnZVdhaXRpbmcgPSBtd2k7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gbVJlY29yZHMuc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKLSAgICAgICAgICAgICAgICBSZWNvcmQgciA9IG1SZWNvcmRzLmdldChpKTsKKyAgICAgICAgICAgIGZvciAoUmVjb3JkIHIgOiBtUmVjb3JkcykgewogICAgICAgICAgICAgICAgIGlmICgoci5ldmVudHMgJiBQaG9uZVN0YXRlTGlzdGVuZXIuTElTVEVOX01FU1NBR0VfV0FJVElOR19JTkRJQ0FUT1IpICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgIHIuY2FsbGJhY2sub25NZXNzYWdlV2FpdGluZ0luZGljYXRvckNoYW5nZWQobXdpKTsKICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZW1vdmUoci5iaW5kZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlTGlzdC5hZGQoci5iaW5kZXIpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChJQmluZGVyIGIgOiByZW1vdmVMaXN0KSByZW1vdmUoYik7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTMxNCwxOCArMzE4LDE5IEBACiAgICAgICAgIGlmICghY2hlY2tOb3RpZnlQZXJtaXNzaW9uKCJub3RpZnlDYWxsRm9yd2FyZGluZ0NoYW5nZWQoKSIpKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KKyAgICAgICAgQXJyYXlMaXN0PElCaW5kZXI+IHJlbW92ZUxpc3QgPSBuZXcgQXJyYXlMaXN0PElCaW5kZXI+KCk7CiAgICAgICAgIHN5bmNocm9uaXplZCAobVJlY29yZHMpIHsKICAgICAgICAgICAgIG1DYWxsRm9yd2FyZGluZyA9IGNmaTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSBtUmVjb3Jkcy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgewotICAgICAgICAgICAgICAgIFJlY29yZCByID0gbVJlY29yZHMuZ2V0KGkpOworICAgICAgICAgICAgZm9yIChSZWNvcmQgciA6IG1SZWNvcmRzKSB7CiAgICAgICAgICAgICAgICAgaWYgKChyLmV2ZW50cyAmIFBob25lU3RhdGVMaXN0ZW5lci5MSVNURU5fQ0FMTF9GT1JXQVJESU5HX0lORElDQVRPUikgIT0gMCkgewogICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgci5jYWxsYmFjay5vbkNhbGxGb3J3YXJkaW5nSW5kaWNhdG9yQ2hhbmdlZChjZmkpOwogICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZShyLmJpbmRlcik7CisgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVMaXN0LmFkZChyLmJpbmRlcik7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKElCaW5kZXIgYiA6IHJlbW92ZUxpc3QpIHJlbW92ZShiKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMzMzLDU3ICszMzgsODEgQEAKICAgICAgICAgaWYgKCFjaGVja05vdGlmeVBlcm1pc3Npb24oIm5vdGlmeURhdGFBY3Rpdml0eSgpIiApKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KKyAgICAgICAgQXJyYXlMaXN0PElCaW5kZXI+IHJlbW92ZUxpc3QgPSBuZXcgQXJyYXlMaXN0PElCaW5kZXI+KCk7CiAgICAgICAgIHN5bmNocm9uaXplZCAobVJlY29yZHMpIHsKICAgICAgICAgICAgIG1EYXRhQWN0aXZpdHkgPSBzdGF0ZTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSBtUmVjb3Jkcy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgewotICAgICAgICAgICAgICAgIFJlY29yZCByID0gbVJlY29yZHMuZ2V0KGkpOworICAgICAgICAgICAgZm9yIChSZWNvcmQgciA6IG1SZWNvcmRzKSB7CiAgICAgICAgICAgICAgICAgaWYgKChyLmV2ZW50cyAmIFBob25lU3RhdGVMaXN0ZW5lci5MSVNURU5fREFUQV9BQ1RJVklUWSkgIT0gMCkgewogICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgci5jYWxsYmFjay5vbkRhdGFBY3Rpdml0eShzdGF0ZSk7CiAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlKHIuYmluZGVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUxpc3QuYWRkKHIuYmluZGVyKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoSUJpbmRlciBiIDogcmVtb3ZlTGlzdCkgcmVtb3ZlKGIpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgbm90aWZ5RGF0YUNvbm5lY3Rpb24oaW50IHN0YXRlLCBib29sZWFuIGlzRGF0YUNvbm5lY3Rpdml0eVBvc3NpYmxlLAotICAgICAgICAgICAgU3RyaW5nIHJlYXNvbiwgU3RyaW5nIGFwbiwgU3RyaW5nW10gYXBuVHlwZXMsIFN0cmluZyBpbnRlcmZhY2VOYW1lLCBpbnQgbmV0d29ya1R5cGUsCi0gICAgICAgICAgICBTdHJpbmcgZ2F0ZXdheSkgeworICAgICAgICAgICAgU3RyaW5nIHJlYXNvbiwgU3RyaW5nIGFwbiwgU3RyaW5nIGFwblR5cGUsIE5ldHdvcmtQcm9wZXJ0aWVzIG5ldHdvcmtQcm9wZXJ0aWVzLAorICAgICAgICAgICAgaW50IG5ldHdvcmtUeXBlKSB7CiAgICAgICAgIGlmICghY2hlY2tOb3RpZnlQZXJtaXNzaW9uKCJub3RpZnlEYXRhQ29ubmVjdGlvbigpIiApKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICAgICAgc3luY2hyb25pemVkIChtUmVjb3JkcykgewotICAgICAgICAgICAgbURhdGFDb25uZWN0aW9uU3RhdGUgPSBzdGF0ZTsKKyAgICAgICAgICAgIGJvb2xlYW4gbW9kaWZpZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIGlmIChzdGF0ZSA9PSBUZWxlcGhvbnlNYW5hZ2VyLkRBVEFfQ09OTkVDVEVEKSB7CisgICAgICAgICAgICAgICAgaWYgKCFtQ29ubmVjdGVkQXBucy5jb250YWlucyhhcG5UeXBlKSkgeworICAgICAgICAgICAgICAgICAgICBtQ29ubmVjdGVkQXBucy5hZGQoYXBuVHlwZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChtRGF0YUNvbm5lY3Rpb25TdGF0ZSAhPSBzdGF0ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbURhdGFDb25uZWN0aW9uU3RhdGUgPSBzdGF0ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbUNvbm5lY3RlZEFwbnMucmVtb3ZlKGFwblR5cGUpOworICAgICAgICAgICAgICAgIGlmIChtQ29ubmVjdGVkQXBucy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbURhdGFDb25uZWN0aW9uU3RhdGUgPSBzdGF0ZTsKKyAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGxlYXZlIG1EYXRhQ29ubmVjdGlvblN0YXRlIGFzIGlzIGFuZAorICAgICAgICAgICAgICAgICAgICAvLyBzZW5kIG91dCB0aGUgbmV3IHN0YXR1cyBmb3IgdGhlIEFQTiBpbiBxdWVzdGlvbi4KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBtRGF0YUNvbm5lY3Rpb25Qb3NzaWJsZSA9IGlzRGF0YUNvbm5lY3Rpdml0eVBvc3NpYmxlOwogICAgICAgICAgICAgbURhdGFDb25uZWN0aW9uUmVhc29uID0gcmVhc29uOwogICAgICAgICAgICAgbURhdGFDb25uZWN0aW9uQXBuID0gYXBuOwotICAgICAgICAgICAgbURhdGFDb25uZWN0aW9uQXBuVHlwZXMgPSBhcG5UeXBlczsKLSAgICAgICAgICAgIG1EYXRhQ29ubmVjdGlvbkludGVyZmFjZU5hbWUgPSBpbnRlcmZhY2VOYW1lOwotICAgICAgICAgICAgbURhdGFDb25uZWN0aW9uTmV0d29ya1R5cGUgPSBuZXR3b3JrVHlwZTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSBtUmVjb3Jkcy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgewotICAgICAgICAgICAgICAgIFJlY29yZCByID0gbVJlY29yZHMuZ2V0KGkpOwotICAgICAgICAgICAgICAgIGlmICgoci5ldmVudHMgJiBQaG9uZVN0YXRlTGlzdGVuZXIuTElTVEVOX0RBVEFfQ09OTkVDVElPTl9TVEFURSkgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgci5jYWxsYmFjay5vbkRhdGFDb25uZWN0aW9uU3RhdGVDaGFuZ2VkKHN0YXRlLCBuZXR3b3JrVHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlKHIuYmluZGVyKTsKKyAgICAgICAgICAgIG1EYXRhQ29ubmVjdGlvblByb3BlcnRpZXMgPSBuZXR3b3JrUHJvcGVydGllczsKKyAgICAgICAgICAgIGlmIChtRGF0YUNvbm5lY3Rpb25OZXR3b3JrVHlwZSAhPSBuZXR3b3JrVHlwZSkgeworICAgICAgICAgICAgICAgIG1EYXRhQ29ubmVjdGlvbk5ldHdvcmtUeXBlID0gbmV0d29ya1R5cGU7CisgICAgICAgICAgICAgICAgbW9kaWZpZWQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1vZGlmaWVkKSB7CisgICAgICAgICAgICAgICAgQXJyYXlMaXN0PElCaW5kZXI+IHJlbW92ZUxpc3QgPSBuZXcgQXJyYXlMaXN0PElCaW5kZXI+KCk7CisgICAgICAgICAgICAgICAgZm9yIChSZWNvcmQgciA6IG1SZWNvcmRzKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICgoci5ldmVudHMgJiBQaG9uZVN0YXRlTGlzdGVuZXIuTElTVEVOX0RBVEFfQ09OTkVDVElPTl9TVEFURSkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByLmNhbGxiYWNrLm9uRGF0YUNvbm5lY3Rpb25TdGF0ZUNoYW5nZWQoc3RhdGUsIG5ldHdvcmtUeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUxpc3QuYWRkKHIuYmluZGVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3IgKElCaW5kZXIgYiA6IHJlbW92ZUxpc3QpIHJlbW92ZShiKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBicm9hZGNhc3REYXRhQ29ubmVjdGlvblN0YXRlQ2hhbmdlZChzdGF0ZSwgaXNEYXRhQ29ubmVjdGl2aXR5UG9zc2libGUsIHJlYXNvbiwgYXBuLAotICAgICAgICAgICAgICAgIGFwblR5cGVzLCBpbnRlcmZhY2VOYW1lLCBnYXRld2F5KTsKKyAgICAgICAgICAgICAgICBhcG5UeXBlLCBuZXR3b3JrUHJvcGVydGllcyk7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgbm90aWZ5RGF0YUNvbm5lY3Rpb25GYWlsZWQoU3RyaW5nIHJlYXNvbikgeworICAgIHB1YmxpYyB2b2lkIG5vdGlmeURhdGFDb25uZWN0aW9uRmFpbGVkKFN0cmluZyByZWFzb24sIFN0cmluZyBhcG5UeXBlKSB7CiAgICAgICAgIGlmICghY2hlY2tOb3RpZnlQZXJtaXNzaW9uKCJub3RpZnlEYXRhQ29ubmVjdGlvbkZhaWxlZCgpIikpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgICAgICAvKgotICAgICAgICAgKiBUaGlzIGlzIGNvbW1lbnRlZCBvdXQgYmVjYXVzZSB0aGVyZSBpcyBvbiBvbkRhdGFDb25uZWN0aW9uRmFpbGVkIGNhbGxiYWNrCi0gICAgICAgICAqIG9uIFBob25lU3RhdGVMaXN0ZW5lci4gVGhlcmUgc2hvdWxkIGJlCisgICAgICAgICAqIFRoaXMgaXMgY29tbWVudGVkIG91dCBiZWNhdXNlIHRoZXJlIGlzIG5vIG9uRGF0YUNvbm5lY3Rpb25GYWlsZWQgY2FsbGJhY2sKKyAgICAgICAgICogaW4gUGhvbmVTdGF0ZUxpc3RlbmVyLiBUaGVyZSBzaG91bGQgYmUuCiAgICAgICAgIHN5bmNocm9uaXplZCAobVJlY29yZHMpIHsKICAgICAgICAgICAgIG1EYXRhQ29ubmVjdGlvbkZhaWxlZFJlYXNvbiA9IHJlYXNvbjsKICAgICAgICAgICAgIGZpbmFsIGludCBOID0gbVJlY29yZHMuc2l6ZSgpOwpAQCAtMzk1LDcgKzQyNCw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgKi8KLSAgICAgICAgYnJvYWRjYXN0RGF0YUNvbm5lY3Rpb25GYWlsZWQocmVhc29uKTsKKyAgICAgICAgYnJvYWRjYXN0RGF0YUNvbm5lY3Rpb25GYWlsZWQocmVhc29uLCBhcG5UeXBlKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBub3RpZnlDZWxsTG9jYXRpb24oQnVuZGxlIGNlbGxMb2NhdGlvbikgewpAQCAtNDA0LDggKzQzMyw3IEBACiAgICAgICAgIH0KICAgICAgICAgc3luY2hyb25pemVkIChtUmVjb3JkcykgewogICAgICAgICAgICAgbUNlbGxMb2NhdGlvbiA9IGNlbGxMb2NhdGlvbjsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSBtUmVjb3Jkcy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgewotICAgICAgICAgICAgICAgIFJlY29yZCByID0gbVJlY29yZHMuZ2V0KGkpOworICAgICAgICAgICAgZm9yIChSZWNvcmQgciA6IG1SZWNvcmRzKSB7CiAgICAgICAgICAgICAgICAgaWYgKChyLmV2ZW50cyAmIFBob25lU3RhdGVMaXN0ZW5lci5MSVNURU5fQ0VMTF9MT0NBVElPTikgIT0gMCkgewogICAgICAgICAgICAgICAgICAgICBzZW5kQ2VsbExvY2F0aW9uKHIsIGNlbGxMb2NhdGlvbik7CiAgICAgICAgICAgICAgICAgfQpAQCAtNDE2LDcgKzQ0NCw3IEBACiAgICAgLyoqCiAgICAgICogQ29weSB0aGUgc2VydmljZSBzdGF0ZSBvYmplY3Qgc28gdGhleSBjYW4ndCBtZXNzIGl0IHVwIGluIHRoZSBsb2NhbCBjYWxscwogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNlbmRTZXJ2aWNlU3RhdGUoUmVjb3JkIHIsIFNlcnZpY2VTdGF0ZSBzdGF0ZSkgeworICAgIHByaXZhdGUgdm9pZCBzZW5kU2VydmljZVN0YXRlKFJlY29yZCByLCBTZXJ2aWNlU3RhdGUgc3RhdGUpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIHIuY2FsbGJhY2sub25TZXJ2aWNlU3RhdGVDaGFuZ2VkKG5ldyBTZXJ2aWNlU3RhdGUoc3RhdGUpKTsKICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7CkBAIC00NjIsMTEgKzQ5MCwxMCBAQAogICAgICAgICAgICAgcHcucHJpbnRsbigiICBtRGF0YUNvbm5lY3Rpb25Qb3NzaWJsZT0iICsgbURhdGFDb25uZWN0aW9uUG9zc2libGUpOwogICAgICAgICAgICAgcHcucHJpbnRsbigiICBtRGF0YUNvbm5lY3Rpb25SZWFzb249IiArIG1EYXRhQ29ubmVjdGlvblJlYXNvbik7CiAgICAgICAgICAgICBwdy5wcmludGxuKCIgIG1EYXRhQ29ubmVjdGlvbkFwbj0iICsgbURhdGFDb25uZWN0aW9uQXBuKTsKLSAgICAgICAgICAgIHB3LnByaW50bG4oIiAgbURhdGFDb25uZWN0aW9uSW50ZXJmYWNlTmFtZT0iICsgbURhdGFDb25uZWN0aW9uSW50ZXJmYWNlTmFtZSk7CisgICAgICAgICAgICBwdy5wcmludGxuKCIgIG1EYXRhQ29ubmVjdGlvblByb3BlcnRpZXM9IiArIG1EYXRhQ29ubmVjdGlvblByb3BlcnRpZXMpOwogICAgICAgICAgICAgcHcucHJpbnRsbigiICBtQ2VsbExvY2F0aW9uPSIgKyBtQ2VsbExvY2F0aW9uKTsKICAgICAgICAgICAgIHB3LnByaW50bG4oInJlZ2lzdHJhdGlvbnM6IGNvdW50PSIgKyByZWNvcmRDb3VudCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlY29yZENvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICBSZWNvcmQgciA9IG1SZWNvcmRzLmdldChpKTsKKyAgICAgICAgICAgIGZvciAoUmVjb3JkIHIgOiBtUmVjb3JkcykgewogICAgICAgICAgICAgICAgIHB3LnByaW50bG4oIiAgIiArIHIucGtnRm9yRGVidWcgKyAiIDB4IiArIEludGVnZXIudG9IZXhTdHJpbmcoci5ldmVudHMpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNTM3LDcgKzU2NCw3IEBACiAKICAgICBwcml2YXRlIHZvaWQgYnJvYWRjYXN0RGF0YUNvbm5lY3Rpb25TdGF0ZUNoYW5nZWQoaW50IHN0YXRlLAogICAgICAgICAgICAgYm9vbGVhbiBpc0RhdGFDb25uZWN0aXZpdHlQb3NzaWJsZSwKLSAgICAgICAgICAgIFN0cmluZyByZWFzb24sIFN0cmluZyBhcG4sIFN0cmluZ1tdIGFwblR5cGVzLCBTdHJpbmcgaW50ZXJmYWNlTmFtZSwgU3RyaW5nIGdhdGV3YXkpIHsKKyAgICAgICAgICAgIFN0cmluZyByZWFzb24sIFN0cmluZyBhcG4sIFN0cmluZyBhcG5UeXBlLCBOZXR3b3JrUHJvcGVydGllcyBuZXR3b3JrUHJvcGVydGllcykgewogICAgICAgICAvLyBOb3RlOiBub3QgcmVwb3J0aW5nIHRvIHRoZSBiYXR0ZXJ5IHN0YXRzIHNlcnZpY2UgaGVyZSwgYmVjYXVzZSB0aGUKICAgICAgICAgLy8gc3RhdHVzIGJhciB0YWtlcyBjYXJlIG9mIHRoYXQgYWZ0ZXIgdGFraW5nIGludG8gYWNjb3VudCBhbGwgb2YgdGhlCiAgICAgICAgIC8vIHJlcXVpcmVkIGluZm8uCkBAIC01NTAsMjkgKzU3NywyMyBAQAogICAgICAgICBpZiAocmVhc29uICE9IG51bGwpIHsKICAgICAgICAgICAgIGludGVudC5wdXRFeHRyYShQaG9uZS5TVEFURV9DSEFOR0VfUkVBU09OX0tFWSwgcmVhc29uKTsKICAgICAgICAgfQotICAgICAgICBpbnRlbnQucHV0RXh0cmEoUGhvbmUuREFUQV9BUE5fS0VZLCBhcG4pOwotICAgICAgICBTdHJpbmcgdHlwZXMgPSBuZXcgU3RyaW5nKCIiKTsKLSAgICAgICAgaWYgKGFwblR5cGVzLmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgIHR5cGVzID0gYXBuVHlwZXNbMF07Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IGFwblR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgdHlwZXMgPSB0eXBlcysiLCIrYXBuVHlwZXNbaV07CisgICAgICAgIGlmIChuZXR3b3JrUHJvcGVydGllcyAhPSBudWxsKSB7CisgICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoUGhvbmUuREFUQV9ORVRXT1JLX1BST1BFUlRJRVNfS0VZLCBuZXR3b3JrUHJvcGVydGllcyk7CisgICAgICAgICAgICBOZXR3b3JrSW50ZXJmYWNlIGlmYWNlID0gbmV0d29ya1Byb3BlcnRpZXMuZ2V0SW50ZXJmYWNlKCk7CisgICAgICAgICAgICBpZiAoaWZhY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGludGVudC5wdXRFeHRyYShQaG9uZS5EQVRBX0lGQUNFX05BTUVfS0VZLCBpZmFjZS5nZXROYW1lKCkpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIGludGVudC5wdXRFeHRyYShQaG9uZS5EQVRBX0FQTl9UWVBFU19LRVksIHR5cGVzKTsKLSAgICAgICAgaW50ZW50LnB1dEV4dHJhKFBob25lLkRBVEFfSUZBQ0VfTkFNRV9LRVksIGludGVyZmFjZU5hbWUpOwotICAgICAgICBpbnQgZ2F0ZXdheUFkZHIgPSAwOwotICAgICAgICBpZiAoZ2F0ZXdheSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBnYXRld2F5QWRkciA9IE5ldHdvcmtVdGlscy52NFN0cmluZ1RvSW50KGdhdGV3YXkpOwotICAgICAgICB9Ci0gICAgICAgIGludGVudC5wdXRFeHRyYShQaG9uZS5EQVRBX0dBVEVXQVlfS0VZLCBnYXRld2F5QWRkcik7Ci0KKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKFBob25lLkRBVEFfQVBOX0tFWSwgYXBuKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKFBob25lLkRBVEFfQVBOX1RZUEVfS0VZLCBhcG5UeXBlKTsKICAgICAgICAgbUNvbnRleHQuc2VuZFN0aWNreUJyb2FkY2FzdChpbnRlbnQpOwogICAgIH0KIAotICAgIHByaXZhdGUgdm9pZCBicm9hZGNhc3REYXRhQ29ubmVjdGlvbkZhaWxlZChTdHJpbmcgcmVhc29uKSB7CisgICAgcHJpdmF0ZSB2b2lkIGJyb2FkY2FzdERhdGFDb25uZWN0aW9uRmFpbGVkKFN0cmluZyByZWFzb24sIFN0cmluZyBhcG5UeXBlKSB7CiAgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KFRlbGVwaG9ueUludGVudHMuQUNUSU9OX0RBVEFfQ09OTkVDVElPTl9GQUlMRUQpOwogICAgICAgICBpbnRlbnQuYWRkRmxhZ3MoSW50ZW50LkZMQUdfUkVDRUlWRVJfUkVQTEFDRV9QRU5ESU5HKTsKICAgICAgICAgaW50ZW50LnB1dEV4dHJhKFBob25lLkZBSUxVUkVfUkVBU09OX0tFWSwgcmVhc29uKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKFBob25lLkRBVEFfQVBOX1RZUEVfS0VZLCBhcG5UeXBlKTsKICAgICAgICAgbUNvbnRleHQuc2VuZFN0aWNreUJyb2FkY2FzdChpbnRlbnQpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvVGhyb3R0bGVTZXJ2aWNlLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9UaHJvdHRsZVNlcnZpY2UuamF2YQppbmRleCBhOTNhNmVlLi5kODQxY2IzIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9UaHJvdHRsZVNlcnZpY2UuamF2YQorKysgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9UaHJvdHRsZVNlcnZpY2UuamF2YQpAQCAtNjAsNiArNjAsOCBAQAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKIGltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXI7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0xvbmc7CiBpbXBvcnQgamF2YS51dGlsLkdyZWdvcmlhbkNhbGVuZGFyOwogaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwogaW1wb3J0IGphdmEudXRpbC5SYW5kb207CkBAIC04Myw4ICs4NSw4IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBURVNUSU5HX1RIUkVTSE9MRCA9IDEgKiAxMDI0ICogMTAyNDsKIAogICAgIHByaXZhdGUgaW50IG1Qb2xpY3lQb2xsUGVyaW9kU2VjOwotICAgIHByaXZhdGUgbG9uZyBtUG9saWN5VGhyZXNob2xkOwotICAgIHByaXZhdGUgaW50IG1Qb2xpY3lUaHJvdHRsZVZhbHVlOworICAgIHByaXZhdGUgQXRvbWljTG9uZyBtUG9saWN5VGhyZXNob2xkOworICAgIHByaXZhdGUgQXRvbWljSW50ZWdlciBtUG9saWN5VGhyb3R0bGVWYWx1ZTsKICAgICBwcml2YXRlIGludCBtUG9saWN5UmVzZXREYXk7IC8vIDEtMjgKICAgICBwcml2YXRlIGludCBtUG9saWN5Tm90aWZpY2F0aW9uc0FsbG93ZWRNYXNrOwogCkBAIC0xMTQsNyArMTE2LDcgQEAKICAgICBwcml2YXRlIEludGVyZmFjZU9ic2VydmVyIG1JbnRlcmZhY2VPYnNlcnZlcjsKICAgICBwcml2YXRlIFNldHRpbmdzT2JzZXJ2ZXIgbVNldHRpbmdzT2JzZXJ2ZXI7CiAKLSAgICBwcml2YXRlIGludCBtVGhyb3R0bGVJbmRleDsgLy8gMCBmb3Igbm9uZSwgMSBmb3IgZmlyc3QgdGhyb3R0bGUgdmFsLCAyIGZvciBuZXh0LCBldGMKKyAgICBwcml2YXRlIEF0b21pY0ludGVnZXIgbVRocm90dGxlSW5kZXg7IC8vIDAgZm9yIG5vbmUsIDEgZm9yIGZpcnN0IHRocm90dGxlIHZhbCwgMiBmb3IgbmV4dCwgZXRjCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRIUk9UVExFX0lOREVYX1VOSU5JVElBTElaRUQgPSAtMTsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVEhST1RUTEVfSU5ERVhfVU5USFJPVFRMRUQgICA9ICAwOwogCkBAIC0xMjYsNiArMTI4LDEwIEBACiAgICAgICAgIGlmIChWREJHKSBTbG9nLnYoVEFHLCAiU3RhcnRpbmcgVGhyb3R0bGVTZXJ2aWNlIik7CiAgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKIAorICAgICAgICBtUG9saWN5VGhyZXNob2xkID0gbmV3IEF0b21pY0xvbmcoKTsKKyAgICAgICAgbVBvbGljeVRocm90dGxlVmFsdWUgPSBuZXcgQXRvbWljSW50ZWdlcigpOworICAgICAgICBtVGhyb3R0bGVJbmRleCA9IG5ldyBBdG9taWNJbnRlZ2VyKCk7CisKICAgICAgICAgbU50cEFjdGl2ZSA9IGZhbHNlOwogCiAgICAgICAgIG1JZmFjZSA9IG1Db250ZXh0LmdldFJlc291cmNlcygpLmdldFN0cmluZyhSLnN0cmluZy5jb25maWdfZGF0YXVzZV9pZmFjZSk7CkBAIC0yMTQsNyArMjIwLDcgQEAKICAgICB9CiAKICAgICBwcml2YXRlIGxvbmcgbnRwVG9XYWxsVGltZShsb25nIG50cFRpbWUpIHsKLSAgICAgICAgbG9uZyBiZXN0Tm93ID0gZ2V0QmVzdFRpbWUoKTsKKyAgICAgICAgbG9uZyBiZXN0Tm93ID0gZ2V0QmVzdFRpbWUodHJ1ZSk7IC8vIGRvIGl0IHF1aWNrbHkKICAgICAgICAgbG9uZyBsb2NhbE5vdyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwogICAgICAgICByZXR1cm4gbG9jYWxOb3cgKyAobnRwVGltZSAtIGJlc3ROb3cpOwogICAgIH0KQEAgLTIyMiw0MCArMjI4LDQyIEBACiAgICAgLy8gVE9ETyAtIGZldGNoIGZvciB0aGUgaWZhY2UKICAgICAvLyByZXR1cm4gdGltZSBpbiB0aGUgbG9jYWwsIHN5c3RlbSB3YWxsIHRpbWUsIGNvcnJlY3RpbmcgZm9yIHRoZSB1c2Ugb2YgbnRwCiAKLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGxvbmcgZ2V0UmVzZXRUaW1lKFN0cmluZyBpZmFjZSkgeworICAgIHB1YmxpYyBsb25nIGdldFJlc2V0VGltZShTdHJpbmcgaWZhY2UpIHsKICAgICAgICAgZW5mb3JjZUFjY2Vzc1Blcm1pc3Npb24oKTsKICAgICAgICAgbG9uZyByZXNldFRpbWUgPSAwOwogICAgICAgICBpZiAobVJlY29yZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJlc2V0VGltZSA9IG50cFRvV2FsbFRpbWUobVJlY29yZGVyLmdldFBlcmlvZEVuZCgpKTsKKyAgICAgICAgICAgIHJlc2V0VGltZSA9IG1SZWNvcmRlci5nZXRQZXJpb2RFbmQoKTsKICAgICAgICAgfQorICAgICAgICByZXNldFRpbWUgPSBudHBUb1dhbGxUaW1lKHJlc2V0VGltZSk7CiAgICAgICAgIHJldHVybiByZXNldFRpbWU7CiAgICAgfQogCiAgICAgLy8gVE9ETyAtIGZldGNoIGZvciB0aGUgaWZhY2UKICAgICAvLyByZXR1cm4gdGltZSBpbiB0aGUgbG9jYWwsIHN5c3RlbSB3YWxsIHRpbWUsIGNvcnJlY3RpbmcgZm9yIHRoZSB1c2Ugb2YgbnRwCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBsb25nIGdldFBlcmlvZFN0YXJ0VGltZShTdHJpbmcgaWZhY2UpIHsKLSAgICAgICAgZW5mb3JjZUFjY2Vzc1Blcm1pc3Npb24oKTsKKyAgICBwdWJsaWMgbG9uZyBnZXRQZXJpb2RTdGFydFRpbWUoU3RyaW5nIGlmYWNlKSB7CiAgICAgICAgIGxvbmcgc3RhcnRUaW1lID0gMDsKKyAgICAgICAgZW5mb3JjZUFjY2Vzc1Blcm1pc3Npb24oKTsKICAgICAgICAgaWYgKG1SZWNvcmRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzdGFydFRpbWUgPSBudHBUb1dhbGxUaW1lKG1SZWNvcmRlci5nZXRQZXJpb2RTdGFydCgpKTsKKyAgICAgICAgICAgIHN0YXJ0VGltZSA9IG1SZWNvcmRlci5nZXRQZXJpb2RTdGFydCgpOwogICAgICAgICB9CisgICAgICAgIHN0YXJ0VGltZSA9IG50cFRvV2FsbFRpbWUoc3RhcnRUaW1lKTsKICAgICAgICAgcmV0dXJuIHN0YXJ0VGltZTsKICAgICB9CiAgICAgLy9UT0RPIC0gYSBiZXR0ZXIgbmFtZT8gIGdldENsaWZmQnl0ZUNvdW50VGhyZXNob2xkPwogICAgIC8vIFRPRE8gLSBmZXRjaCBmb3IgdGhlIGlmYWNlCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBsb25nIGdldENsaWZmVGhyZXNob2xkKFN0cmluZyBpZmFjZSwgaW50IGNsaWZmKSB7CisgICAgcHVibGljIGxvbmcgZ2V0Q2xpZmZUaHJlc2hvbGQoU3RyaW5nIGlmYWNlLCBpbnQgY2xpZmYpIHsKICAgICAgICAgZW5mb3JjZUFjY2Vzc1Blcm1pc3Npb24oKTsKICAgICAgICAgaWYgKGNsaWZmID09IDEpIHsKLSAgICAgICAgICAgIHJldHVybiBtUG9saWN5VGhyZXNob2xkOworICAgICAgICAgICByZXR1cm4gbVBvbGljeVRocmVzaG9sZC5nZXQoKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAgICAgLy8gVE9ETyAtIGEgYmV0dGVyIG5hbWU/IGdldFRocm90dGxlUmF0ZT8KICAgICAvLyBUT0RPIC0gZmV0Y2ggZm9yIHRoZSBpZmFjZQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGdldENsaWZmTGV2ZWwoU3RyaW5nIGlmYWNlLCBpbnQgY2xpZmYpIHsKKyAgICBwdWJsaWMgaW50IGdldENsaWZmTGV2ZWwoU3RyaW5nIGlmYWNlLCBpbnQgY2xpZmYpIHsKICAgICAgICAgZW5mb3JjZUFjY2Vzc1Blcm1pc3Npb24oKTsKICAgICAgICAgaWYgKGNsaWZmID09IDEpIHsKLSAgICAgICAgICAgIHJldHVybiBtUG9saWN5VGhyb3R0bGVWYWx1ZTsKKyAgICAgICAgICAgIHJldHVybiBtUG9saWN5VGhyb3R0bGVWYWx1ZS5nZXQoKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gMDsKICAgICB9CkBAIC0yNjcsMTAgKzI3NSw5IEBACiAgICAgfQogCiAgICAgLy8gVE9ETyAtIGZldGNoIGZvciB0aGUgaWZhY2UKLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGxvbmcgZ2V0Qnl0ZUNvdW50KFN0cmluZyBpZmFjZSwgaW50IGRpciwgaW50IHBlcmlvZCwgaW50IGFnbykgeworICAgIHB1YmxpYyBsb25nIGdldEJ5dGVDb3VudChTdHJpbmcgaWZhY2UsIGludCBkaXIsIGludCBwZXJpb2QsIGludCBhZ28pIHsKICAgICAgICAgZW5mb3JjZUFjY2Vzc1Blcm1pc3Npb24oKTsKLSAgICAgICAgaWYgKChwZXJpb2QgPT0gVGhyb3R0bGVNYW5hZ2VyLlBFUklPRF9DWUNMRSkgJiYKLSAgICAgICAgICAgICAgICAobVJlY29yZGVyICE9IG51bGwpKSB7CisgICAgICAgIGlmICgocGVyaW9kID09IFRocm90dGxlTWFuYWdlci5QRVJJT0RfQ1lDTEUpICYmIChtUmVjb3JkZXIgIT0gbnVsbCkpIHsKICAgICAgICAgICAgIGlmIChkaXIgPT0gVGhyb3R0bGVNYW5hZ2VyLkRJUkVDVElPTl9UWCkgcmV0dXJuIG1SZWNvcmRlci5nZXRQZXJpb2RUeChhZ28pOwogICAgICAgICAgICAgaWYgKGRpciA9PSBUaHJvdHRsZU1hbmFnZXIuRElSRUNUSU9OX1JYKSByZXR1cm4gbVJlY29yZGVyLmdldFBlcmlvZFJ4KGFnbyk7CiAgICAgICAgIH0KQEAgLTI3OSwxMCArMjg2LDEwIEBACiAKICAgICAvLyBUT0RPIC0gYSBiZXR0ZXIgbmFtZSAtIGdldEN1cnJlbnRUaHJvdHRsZVJhdGU/CiAgICAgLy8gVE9ETyAtIGZldGNoIGZvciB0aGUgaWZhY2UKLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGludCBnZXRUaHJvdHRsZShTdHJpbmcgaWZhY2UpIHsKKyAgICBwdWJsaWMgaW50IGdldFRocm90dGxlKFN0cmluZyBpZmFjZSkgewogICAgICAgICBlbmZvcmNlQWNjZXNzUGVybWlzc2lvbigpOwotICAgICAgICBpZiAobVRocm90dGxlSW5kZXggPT0gMSkgewotICAgICAgICAgICAgcmV0dXJuIG1Qb2xpY3lUaHJvdHRsZVZhbHVlOworICAgICAgICBpZiAobVRocm90dGxlSW5kZXguZ2V0KCkgPT0gMSkgeworICAgICAgICAgICAgcmV0dXJuIG1Qb2xpY3lUaHJvdHRsZVZhbHVlLmdldCgpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KQEAgLTMwNSwyMiArMzEyLDYgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9LCBuZXcgSW50ZW50RmlsdGVyKEFDVElPTl9SRVNFVCkpOwogCi0gICAgICAgIC8vIHVzZSBhIG5ldyB0aHJlYWQgYXMgd2UgZG9uJ3Qgd2FudCB0byBzdGFsbCB0aGUgc3lzdGVtIGZvciBmaWxlIHdyaXRlcwotICAgICAgICBtVGhyZWFkID0gbmV3IEhhbmRsZXJUaHJlYWQoVEFHKTsKLSAgICAgICAgbVRocmVhZC5zdGFydCgpOwotICAgICAgICBtSGFuZGxlciA9IG5ldyBNeUhhbmRsZXIobVRocmVhZC5nZXRMb29wZXIoKSk7Ci0gICAgICAgIG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoRVZFTlRfUkVCT09UX1JFQ09WRVJZKS5zZW5kVG9UYXJnZXQoKTsKLQotICAgICAgICBtSW50ZXJmYWNlT2JzZXJ2ZXIgPSBuZXcgSW50ZXJmYWNlT2JzZXJ2ZXIobUhhbmRsZXIsIEVWRU5UX0lGQUNFX1VQLCBtSWZhY2UpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgbU5NU2VydmljZS5yZWdpc3Rlck9ic2VydmVyKG1JbnRlcmZhY2VPYnNlcnZlcik7Ci0gICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBTbG9nLmUoVEFHLCAiQ291bGQgbm90IHJlZ2lzdGVyIEludGVyZmFjZU9ic2VydmVyICIgKyBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1TZXR0aW5nc09ic2VydmVyID0gbmV3IFNldHRpbmdzT2JzZXJ2ZXIobUhhbmRsZXIsIEVWRU5UX1BPTElDWV9DSEFOR0VEKTsKLSAgICAgICAgbVNldHRpbmdzT2JzZXJ2ZXIub2JzZXJ2ZShtQ29udGV4dCk7Ci0KICAgICAgICAgRmlsZUlucHV0U3RyZWFtIHN0cmVhbSA9IG51bGw7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBuZXcgUHJvcGVydGllcygpOwpAQCAtMzM3LDYgKzMyOCwyMiBAQAogICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7fQogICAgICAgICAgICAgfQogICAgICAgICB9CisKKyAgICAgICAgLy8gdXNlIGEgbmV3IHRocmVhZCBhcyB3ZSBkb24ndCB3YW50IHRvIHN0YWxsIHRoZSBzeXN0ZW0gZm9yIGZpbGUgd3JpdGVzCisgICAgICAgIG1UaHJlYWQgPSBuZXcgSGFuZGxlclRocmVhZChUQUcpOworICAgICAgICBtVGhyZWFkLnN0YXJ0KCk7CisgICAgICAgIG1IYW5kbGVyID0gbmV3IE15SGFuZGxlcihtVGhyZWFkLmdldExvb3BlcigpKTsKKyAgICAgICAgbUhhbmRsZXIub2J0YWluTWVzc2FnZShFVkVOVF9SRUJPT1RfUkVDT1ZFUlkpLnNlbmRUb1RhcmdldCgpOworCisgICAgICAgIG1JbnRlcmZhY2VPYnNlcnZlciA9IG5ldyBJbnRlcmZhY2VPYnNlcnZlcihtSGFuZGxlciwgRVZFTlRfSUZBQ0VfVVAsIG1JZmFjZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtTk1TZXJ2aWNlLnJlZ2lzdGVyT2JzZXJ2ZXIobUludGVyZmFjZU9ic2VydmVyKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFNsb2cuZShUQUcsICJDb3VsZCBub3QgcmVnaXN0ZXIgSW50ZXJmYWNlT2JzZXJ2ZXIgIiArIGUpOworICAgICAgICB9CisKKyAgICAgICAgbVNldHRpbmdzT2JzZXJ2ZXIgPSBuZXcgU2V0dGluZ3NPYnNlcnZlcihtSGFuZGxlciwgRVZFTlRfUE9MSUNZX0NIQU5HRUQpOworICAgICAgICBtU2V0dGluZ3NPYnNlcnZlci5vYnNlcnZlKG1Db250ZXh0KTsKICAgICB9CiAKIApAQCAtMzc1LDcgKzM4Miw3IEBACiAgICAgICAgICAgICAvLyBjaGVjayBmb3Igc2ltIGNoYW5nZSBUT0RPCiAgICAgICAgICAgICAvLyByZXJlZ2lzdGVyIGZvciBub3RpZmljYXRpb24gb2YgcG9saWN5IGNoYW5nZQogCi0gICAgICAgICAgICBtVGhyb3R0bGVJbmRleCA9IFRIUk9UVExFX0lOREVYX1VOSU5JVElBTElaRUQ7CisgICAgICAgICAgICBtVGhyb3R0bGVJbmRleC5zZXQoVEhST1RUTEVfSU5ERVhfVU5JTklUSUFMSVpFRCk7CiAKICAgICAgICAgICAgIG1SZWNvcmRlciA9IG5ldyBEYXRhUmVjb3JkZXIobUNvbnRleHQsIFRocm90dGxlU2VydmljZS50aGlzKTsKIApAQCAtNDAzLDE1ICs0MTAsMTYgQEAKICAgICAgICAgICAgICAgICAgICAgUi5pbnRlZ2VyLmNvbmZpZ19kYXRhdXNlX3RocmVzaG9sZF9ieXRlcyk7CiAgICAgICAgICAgICBpbnQgZGVmYXVsdFZhbHVlID0gbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0SW50ZWdlcigKICAgICAgICAgICAgICAgICAgICAgUi5pbnRlZ2VyLmNvbmZpZ19kYXRhdXNlX3Rocm90dGxlX2tiaXRzcHMpOwotICAgICAgICAgICAgc3luY2hyb25pemVkIChUaHJvdHRsZVNlcnZpY2UudGhpcykgewotICAgICAgICAgICAgICAgIG1Qb2xpY3lUaHJlc2hvbGQgPSBTZXR0aW5ncy5TZWN1cmUuZ2V0TG9uZyhtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5USFJPVFRMRV9USFJFU0hPTERfQllURVMsIGRlZmF1bHRUaHJlc2hvbGQpOwotICAgICAgICAgICAgICAgIG1Qb2xpY3lUaHJvdHRsZVZhbHVlID0gU2V0dGluZ3MuU2VjdXJlLmdldEludChtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5USFJPVFRMRV9WQUxVRV9LQklUU1BTLCBkZWZhdWx0VmFsdWUpOwotICAgICAgICAgICAgICAgIGlmICh0ZXN0aW5nKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Qb2xpY3lQb2xsUGVyaW9kU2VjID0gVEVTVElOR19QT0xMSU5HX1BFUklPRF9TRUM7Ci0gICAgICAgICAgICAgICAgICAgIG1Qb2xpY3lUaHJlc2hvbGQgPSBURVNUSU5HX1RIUkVTSE9MRDsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBsb25nIHRocmVzaG9sZCA9IFNldHRpbmdzLlNlY3VyZS5nZXRMb25nKG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLAorICAgICAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuVEhST1RUTEVfVEhSRVNIT0xEX0JZVEVTLCBkZWZhdWx0VGhyZXNob2xkKTsKKyAgICAgICAgICAgIGludCB2YWx1ZSA9IFNldHRpbmdzLlNlY3VyZS5nZXRJbnQobUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCksCisgICAgICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5USFJPVFRMRV9WQUxVRV9LQklUU1BTLCBkZWZhdWx0VmFsdWUpOworCisgICAgICAgICAgICBtUG9saWN5VGhyZXNob2xkLnNldCh0aHJlc2hvbGQpOworICAgICAgICAgICAgbVBvbGljeVRocm90dGxlVmFsdWUuc2V0KHZhbHVlKTsKKyAgICAgICAgICAgIGlmICh0ZXN0aW5nKSB7CisgICAgICAgICAgICAgICAgbVBvbGljeVBvbGxQZXJpb2RTZWMgPSBURVNUSU5HX1BPTExJTkdfUEVSSU9EX1NFQzsKKyAgICAgICAgICAgICAgICBtUG9saWN5VGhyZXNob2xkLnNldChURVNUSU5HX1RIUkVTSE9MRCk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIG1Qb2xpY3lSZXNldERheSA9IFNldHRpbmdzLlNlY3VyZS5nZXRJbnQobUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCksCkBAIC00MjMsMTAgKzQzMSw4IEBACiAgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLnB1dEludChtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwKICAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuVEhST1RUTEVfUkVTRVRfREFZLCBtUG9saWN5UmVzZXREYXkpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgc3luY2hyb25pemVkIChUaHJvdHRsZVNlcnZpY2UudGhpcykgewotICAgICAgICAgICAgICAgIGlmIChtSWZhY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtUG9saWN5VGhyZXNob2xkID0gMDsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobUlmYWNlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtUG9saWN5VGhyZXNob2xkLnNldCgwKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaW50IGRlZmF1bHROb3RpZmljYXRpb25UeXBlID0gbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0SW50ZWdlcigKQEAgLTQzNywxNSArNDQzLDE2IEBACiAgICAgICAgICAgICBtTWF4TnRwQ2FjaGVBZ2VTZWMgPSBTZXR0aW5ncy5TZWN1cmUuZ2V0SW50KG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLAogICAgICAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuVEhST1RUTEVfTUFYX05UUF9DQUNIRV9BR0VfU0VDLCBNQVhfTlRQX0NBQ0hFX0FHRV9TRUMpOwogCi0gICAgICAgICAgICBpZiAoVkRCRyB8fCAobVBvbGljeVRocmVzaG9sZCAhPSAwKSkgeworICAgICAgICAgICAgaWYgKFZEQkcgfHwgKG1Qb2xpY3lUaHJlc2hvbGQuZ2V0KCkgIT0gMCkpIHsKICAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAib25Qb2xpY3lDaGFuZ2VkIHRlc3Rpbmc9IiArIHRlc3RpbmcgKyIsIHBlcmlvZD0iICsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Qb2xpY3lQb2xsUGVyaW9kU2VjICsgIiwgdGhyZXNob2xkPSIgKyBtUG9saWN5VGhyZXNob2xkICsgIiwgdmFsdWU9IiArCi0gICAgICAgICAgICAgICAgICAgICAgICBtUG9saWN5VGhyb3R0bGVWYWx1ZSArICIsIHJlc2V0RGF5PSIgKyBtUG9saWN5UmVzZXREYXkgKyAiLCBub3RlVHlwZT0iICsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Qb2xpY3lOb3RpZmljYXRpb25zQWxsb3dlZE1hc2sgKyAiLCBtYXhOdHBDYWNoZUFnZT0iICsgbU1heE50cENhY2hlQWdlU2VjKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Qb2xpY3lQb2xsUGVyaW9kU2VjICsgIiwgdGhyZXNob2xkPSIgKyBtUG9saWN5VGhyZXNob2xkLmdldCgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICIsIHZhbHVlPSIgKyBtUG9saWN5VGhyb3R0bGVWYWx1ZS5nZXQoKSArICIsIHJlc2V0RGF5PSIgKyBtUG9saWN5UmVzZXREYXkgKworICAgICAgICAgICAgICAgICAgICAgICAgIiwgbm90ZVR5cGU9IiArIG1Qb2xpY3lOb3RpZmljYXRpb25zQWxsb3dlZE1hc2sgKyAiLCBtYXhOdHBDYWNoZUFnZT0iICsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1NYXhOdHBDYWNoZUFnZVNlYyk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8vIGZvcmNlIHVwZGF0ZXMKLSAgICAgICAgICAgIG1UaHJvdHRsZUluZGV4ID0gVEhST1RUTEVfSU5ERVhfVU5JTklUSUFMSVpFRDsKKyAgICAgICAgICAgIG1UaHJvdHRsZUluZGV4LnNldChUSFJPVFRMRV9JTkRFWF9VTklOSVRJQUxJWkVEKTsKIAogICAgICAgICAgICAgb25SZXNldEFsYXJtKCk7CiAKQEAgLTQ4Nyw3ICs0OTQsNyBAQAogICAgICAgICAgICAgbG9uZyBwZXJpb2RSeCA9IG1SZWNvcmRlci5nZXRQZXJpb2RSeCgwKTsKICAgICAgICAgICAgIGxvbmcgcGVyaW9kVHggPSBtUmVjb3JkZXIuZ2V0UGVyaW9kVHgoMCk7CiAgICAgICAgICAgICBsb25nIHRvdGFsID0gcGVyaW9kUnggKyBwZXJpb2RUeDsKLSAgICAgICAgICAgIGlmIChWREJHIHx8IChtUG9saWN5VGhyZXNob2xkICE9IDApKSB7CisgICAgICAgICAgICBpZiAoVkRCRyB8fCAobVBvbGljeVRocmVzaG9sZC5nZXQoKSAhPSAwKSkgewogICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJvblBvbGxBbGFybSAtIHJvYW1pbmcgPSIgKyByb2FtaW5nICsKICAgICAgICAgICAgICAgICAgICAgICAgICIsIHJlYWQgPSIgKyBpbmNSZWFkICsgIiwgd3JpdHRlbiA9IiArIGluY1dyaXRlICsgIiwgbmV3IHRvdGFsID0iICsgdG90YWwpOwogICAgICAgICAgICAgfQpAQCAtNTEwLDExICs1MTcsMTEgQEAKICAgICAgICAgcHJpdmF0ZSB2b2lkIG9uSWZhY2VVcCgpIHsKICAgICAgICAgICAgIC8vIGlmIHdlIHdlcmUgdGhyb3R0bGVkIGJlZm9yZSwgYmUgc3VyZSBhbmQgc2V0IGl0IGFnYWluIC0gdGhlIGlmYWNlIHdlbnQgZG93bgogICAgICAgICAgICAgLy8gKGFuZCBtYXkgaGF2ZSBkaXNhcHBlYXJlZCBhbGwgdG9nZXRoZXIpIGFuZCB0aGVzZSBzZXR0aW5ncyB3ZXJlIGxvc3QKLSAgICAgICAgICAgIGlmIChtVGhyb3R0bGVJbmRleCA9PSAxKSB7CisgICAgICAgICAgICBpZiAobVRocm90dGxlSW5kZXguZ2V0KCkgPT0gMSkgewogICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgIG1OTVNlcnZpY2Uuc2V0SW50ZXJmYWNlVGhyb3R0bGUobUlmYWNlLCAtMSwgLTEpOwogICAgICAgICAgICAgICAgICAgICBtTk1TZXJ2aWNlLnNldEludGVyZmFjZVRocm90dGxlKG1JZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUG9saWN5VGhyb3R0bGVWYWx1ZSwgbVBvbGljeVRocm90dGxlVmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Qb2xpY3lUaHJvdHRsZVZhbHVlLmdldCgpLCBtUG9saWN5VGhyb3R0bGVWYWx1ZS5nZXQoKSk7CiAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgImVycm9yIHNldHRpbmcgVGhyb3R0bGU6ICIgKyBlKTsKICAgICAgICAgICAgICAgICB9CkBAIC01MjMsNyArNTMwLDggQEAKIAogICAgICAgICBwcml2YXRlIHZvaWQgY2hlY2tUaHJvdHRsZUFuZFBvc3ROb3RpZmljYXRpb24obG9uZyBjdXJyZW50VG90YWwpIHsKICAgICAgICAgICAgIC8vIGlzIHRocm90dGxpbmcgZW5hYmxlZD8KLSAgICAgICAgICAgIGlmIChtUG9saWN5VGhyZXNob2xkID09IDApIHsKKyAgICAgICAgICAgIGxvbmcgdGhyZXNob2xkID0gbVBvbGljeVRocmVzaG9sZC5nZXQoKTsKKyAgICAgICAgICAgIGlmICh0aHJlc2hvbGQgPT0gMCkgewogICAgICAgICAgICAgICAgIGNsZWFyVGhyb3R0bGVBbmROb3RpZmljYXRpb24oKTsKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CkBAIC01MzUsMTUgKzU0MywxMyBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvLyBjaGVjayBpZiB3ZSBuZWVkIHRvIHRocm90dGxlCi0gICAgICAgICAgICBpZiAoY3VycmVudFRvdGFsID4gbVBvbGljeVRocmVzaG9sZCkgewotICAgICAgICAgICAgICAgIGlmIChtVGhyb3R0bGVJbmRleCAhPSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAoVGhyb3R0bGVTZXJ2aWNlLnRoaXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1UaHJvdHRsZUluZGV4ID0gMTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoREJHKSBTbG9nLmQoVEFHLCAiVGhyZXNob2xkICIgKyBtUG9saWN5VGhyZXNob2xkICsgIiBleGNlZWRlZCEiKTsKKyAgICAgICAgICAgIGlmIChjdXJyZW50VG90YWwgPiB0aHJlc2hvbGQpIHsKKyAgICAgICAgICAgICAgICBpZiAobVRocm90dGxlSW5kZXguZ2V0KCkgIT0gMSkgeworICAgICAgICAgICAgICAgICAgICBtVGhyb3R0bGVJbmRleC5zZXQoMSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChEQkcpIFNsb2cuZChUQUcsICJUaHJlc2hvbGQgIiArIHRocmVzaG9sZCArICIgZXhjZWVkZWQhIik7CiAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBtTk1TZXJ2aWNlLnNldEludGVyZmFjZVRocm90dGxlKG1JZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBvbGljeVRocm90dGxlVmFsdWUsIG1Qb2xpY3lUaHJvdHRsZVZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBvbGljeVRocm90dGxlVmFsdWUuZ2V0KCksIG1Qb2xpY3lUaHJvdHRsZVZhbHVlLmdldCgpKTsKICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIFNsb2cuZShUQUcsICJlcnJvciBzZXR0aW5nIFRocm90dGxlOiAiICsgZSk7CiAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTU1Niw3ICs1NjIsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbi5GTEFHX09OR09JTkdfRVZFTlQpOwogCiAgICAgICAgICAgICAgICAgICAgIEludGVudCBicm9hZGNhc3QgPSBuZXcgSW50ZW50KFRocm90dGxlTWFuYWdlci5USFJPVFRMRV9BQ1RJT04pOwotICAgICAgICAgICAgICAgICAgICBicm9hZGNhc3QucHV0RXh0cmEoVGhyb3R0bGVNYW5hZ2VyLkVYVFJBX1RIUk9UVExFX0xFVkVMLCBtUG9saWN5VGhyb3R0bGVWYWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIGJyb2FkY2FzdC5wdXRFeHRyYShUaHJvdHRsZU1hbmFnZXIuRVhUUkFfVEhST1RUTEVfTEVWRUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBvbGljeVRocm90dGxlVmFsdWUuZ2V0KCkpOwogICAgICAgICAgICAgICAgICAgICBtQ29udGV4dC5zZW5kU3RpY2t5QnJvYWRjYXN0KGJyb2FkY2FzdCk7CiAKICAgICAgICAgICAgICAgICB9IC8vIGVsc2UgYWxyZWFkeSB1cCEKQEAgLTU3OSw4ICs1ODYsOCBAQAogICAgICAgICAgICAgICAgICAgICBsb25nIHBlcmlvZExlbmd0aCA9IGVuZCAtIHN0YXJ0OwogICAgICAgICAgICAgICAgICAgICBsb25nIG5vdyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwogICAgICAgICAgICAgICAgICAgICBsb25nIHRpbWVVc2VkID0gbm93IC0gc3RhcnQ7Ci0gICAgICAgICAgICAgICAgICAgIGxvbmcgd2FybmluZ1RocmVzaG9sZCA9IDIqbVBvbGljeVRocmVzaG9sZCp0aW1lVXNlZC8odGltZVVzZWQrcGVyaW9kTGVuZ3RoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKChjdXJyZW50VG90YWwgPiB3YXJuaW5nVGhyZXNob2xkKSAmJiAoY3VycmVudFRvdGFsID4gbVBvbGljeVRocmVzaG9sZC80KSkgeworICAgICAgICAgICAgICAgICAgICBsb25nIHdhcm5pbmdUaHJlc2hvbGQgPSAyKnRocmVzaG9sZCp0aW1lVXNlZC8odGltZVVzZWQrcGVyaW9kTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChjdXJyZW50VG90YWwgPiB3YXJuaW5nVGhyZXNob2xkKSAmJiAoY3VycmVudFRvdGFsID4gdGhyZXNob2xkLzQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVdhcm5pbmdOb3RpZmljYXRpb25TZW50ID09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVdhcm5pbmdOb3RpZmljYXRpb25TZW50ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTm90aWZpY2F0aW9uTWFuYWdlci5jYW5jZWwoUi5kcmF3YWJsZS5zdGF0X3N5c190aHJvdHRsZWQpOwpAQCAtNjI1LDExICs2MzIsOSBAQAogICAgICAgICB9CiAKIAotICAgICAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGNsZWFyVGhyb3R0bGVBbmROb3RpZmljYXRpb24oKSB7Ci0gICAgICAgICAgICBpZiAobVRocm90dGxlSW5kZXggIT0gVEhST1RUTEVfSU5ERVhfVU5USFJPVFRMRUQpIHsKLSAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKFRocm90dGxlU2VydmljZS50aGlzKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1UaHJvdHRsZUluZGV4ID0gVEhST1RUTEVfSU5ERVhfVU5USFJPVFRMRUQ7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICBwcml2YXRlIHZvaWQgY2xlYXJUaHJvdHRsZUFuZE5vdGlmaWNhdGlvbigpIHsKKyAgICAgICAgICAgIGlmIChtVGhyb3R0bGVJbmRleC5nZXQoKSAhPSBUSFJPVFRMRV9JTkRFWF9VTlRIUk9UVExFRCkgeworICAgICAgICAgICAgICAgIG1UaHJvdHRsZUluZGV4LnNldChUSFJPVFRMRV9JTkRFWF9VTlRIUk9UVExFRCk7CiAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgbU5NU2VydmljZS5zZXRJbnRlcmZhY2VUaHJvdHRsZShtSWZhY2UsIC0xLCAtMSk7CiAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKQEAgLTY4NywxMiArNjkyLDEyIEBACiAgICAgICAgIH0KIAogICAgICAgICBwcml2YXRlIHZvaWQgb25SZXNldEFsYXJtKCkgewotICAgICAgICAgICAgaWYgKFZEQkcgfHwgKG1Qb2xpY3lUaHJlc2hvbGQgIT0gMCkpIHsKKyAgICAgICAgICAgIGlmIChWREJHIHx8IChtUG9saWN5VGhyZXNob2xkLmdldCgpICE9IDApKSB7CiAgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgIm9uUmVzZXRBbGFybSAtIGxhc3QgcGVyaW9kIGhhZCAiICsgbVJlY29yZGVyLmdldFBlcmlvZFJ4KDApICsKICAgICAgICAgICAgICAgICAgICAgICAgICIgYnl0ZXMgcmVhZCBhbmQgIiArIG1SZWNvcmRlci5nZXRQZXJpb2RUeCgwKSArICIgd3JpdHRlbiIpOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBsb25nIG5vdyA9IGdldEJlc3RUaW1lKCk7CisgICAgICAgICAgICBsb25nIG5vdyA9IGdldEJlc3RUaW1lKGZhbHNlKTsKIAogICAgICAgICAgICAgaWYgKG1OdHBBY3RpdmUgfHwgKG1OdHBTZXJ2ZXIgPT0gbnVsbCkpIHsKICAgICAgICAgICAgICAgICBDYWxlbmRhciBlbmQgPSBjYWxjdWxhdGVQZXJpb2RFbmQobm93KTsKQEAgLTcxOSwyMCArNzI0LDIzIEBACiAKICAgICAgICAgLy8gd2lsbCB0cnkgdG8gZ2V0IHRoZSBudHAgdGltZSBhbmQgc3dpdGNoIHRvIGl0IGlmIGZvdW5kLgogICAgICAgICAvLyB3aWxsIGFsc28gY2FjaGUgdGhlIHRpbWUgc28gd2UgZG9uJ3QgZmV0Y2ggaXQgcmVwZWF0ZWRseS4KLSAgICAgICAgZ2V0QmVzdFRpbWUoKTsKKyAgICAgICAgZ2V0QmVzdFRpbWUoZmFsc2UpOwogICAgIH0KIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfTlRQX0NBQ0hFX0FHRV9TRUMgPSA2MCAqIDYwICogMjQ7IC8vIDEgZGF5Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9OVFBfRkVUQ0hfV0FJVCA9IDEwICogMTAwMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX05UUF9GRVRDSF9XQUlUID0gMjAgKiAxMDAwOwogICAgIHByaXZhdGUgaW50IG1NYXhOdHBDYWNoZUFnZVNlYyA9IE1BWF9OVFBfQ0FDSEVfQUdFX1NFQzsKICAgICBwcml2YXRlIGxvbmcgY2FjaGVkTnRwOwogICAgIHByaXZhdGUgbG9uZyBjYWNoZWROdHBUaW1lc3RhbXA7CiAKLSAgICBwcml2YXRlIGxvbmcgZ2V0QmVzdFRpbWUoKSB7CisgICAgLy8gaWYgdGhlIHJlcXVlc3QgaXMgdGllZCB0byBVSSBhbmQgQU5SJ3MgYXJlIGEgZGFuZ2VyLCByZXF1ZXN0IGEgZmFzdCByZXN1bHQKKyAgICAvLyB0aGUgcmVndWxhciBwb2xsaW5nIHNob3VsZCBoYXZlIHVwZGF0ZWQgdGhlIGNhY2hlZCB0aW1lIHJlY2VudGx5IHVzaW5nIHRoZQorICAgIC8vIHNsb3dlciBtZXRob2QgKCFmYXN0KQorICAgIHByaXZhdGUgbG9uZyBnZXRCZXN0VGltZShib29sZWFuIGZhc3QpIHsKICAgICAgICAgaWYgKG1OdHBTZXJ2ZXIgIT0gbnVsbCkgewogICAgICAgICAgICAgaWYgKG1OdHBBY3RpdmUpIHsKICAgICAgICAgICAgICAgICBsb25nIG50cEFnZSA9IFN5c3RlbUNsb2NrLmVsYXBzZWRSZWFsdGltZSgpIC0gY2FjaGVkTnRwVGltZXN0YW1wOwotICAgICAgICAgICAgICAgIGlmIChudHBBZ2UgPCBtTWF4TnRwQ2FjaGVBZ2VTZWMgKiAxMDAwKSB7CisgICAgICAgICAgICAgICAgaWYgKG50cEFnZSA8IG1NYXhOdHBDYWNoZUFnZVNlYyAqIDEwMDAgfHwgZmFzdCkgewogICAgICAgICAgICAgICAgICAgICBpZiAoVkRCRykgU2xvZy52KFRBRywgInVzaW5nIGNhY2hlZCB0aW1lIik7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWNoZWROdHAgKyBudHBBZ2U7CiAgICAgICAgICAgICAgICAgfQpAQCAtMTAyNSwzOSArMTAzMyw1NyBAQAogICAgICAgICAgICAgICAgIGlmIChEQkcpIFNsb2cuZChUQUcsICJkYXRhIGZpbGUgZW1wdHkiKTsKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1QYXJlbnQpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmdbXSBwYXJzZWQgPSBkYXRhLnNwbGl0KCI6Iik7Ci0gICAgICAgICAgICAgICAgaW50IHBhcnNlZFVzZWQgPSAwOwotICAgICAgICAgICAgICAgIGlmIChwYXJzZWQubGVuZ3RoIDwgNikgewotICAgICAgICAgICAgICAgICAgICBTbG9nLmUoVEFHLCAicmVhZGluZyBkYXRhIGZpbGUgd2l0aCBpbnN1ZmZpY2llbnQgbGVuZ3RoIC0gaWdub3JpbmciKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN0cmluZ1tdIHBhcnNlZCA9IGRhdGEuc3BsaXQoIjoiKTsKKyAgICAgICAgICAgIGludCBwYXJzZWRVc2VkID0gMDsKKyAgICAgICAgICAgIGlmIChwYXJzZWQubGVuZ3RoIDwgNikgeworICAgICAgICAgICAgICAgIFNsb2cuZShUQUcsICJyZWFkaW5nIGRhdGEgZmlsZSB3aXRoIGluc3VmZmljaWVudCBsZW5ndGggLSBpZ25vcmluZyIpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgaW50IHBlcmlvZENvdW50OworICAgICAgICAgICAgbG9uZ1tdIHBlcmlvZFJ4RGF0YTsKKyAgICAgICAgICAgIGxvbmdbXSBwZXJpb2RUeERhdGE7CisgICAgICAgICAgICBpbnQgY3VycmVudFBlcmlvZDsKKyAgICAgICAgICAgIENhbGVuZGFyIHBlcmlvZFN0YXJ0OworICAgICAgICAgICAgQ2FsZW5kYXIgcGVyaW9kRW5kOworICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICBpZiAoSW50ZWdlci5wYXJzZUludChwYXJzZWRbcGFyc2VkVXNlZCsrXSkgIT0gREFUQV9GSUxFX1ZFUlNJT04pIHsKICAgICAgICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgInJlYWRpbmcgZGF0YSBmaWxlIHdpdGggYmFkIHZlcnNpb24gLSBpZ25vcmluZyIpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgbVBlcmlvZENvdW50ID0gSW50ZWdlci5wYXJzZUludChwYXJzZWRbcGFyc2VkVXNlZCsrXSk7Ci0gICAgICAgICAgICAgICAgaWYgKHBhcnNlZC5sZW5ndGggIT0gNSArICgyICogbVBlcmlvZENvdW50KSkgeworICAgICAgICAgICAgICAgIHBlcmlvZENvdW50ID0gSW50ZWdlci5wYXJzZUludChwYXJzZWRbcGFyc2VkVXNlZCsrXSk7CisgICAgICAgICAgICAgICAgaWYgKHBhcnNlZC5sZW5ndGggIT0gNSArICgyICogcGVyaW9kQ291bnQpKSB7CiAgICAgICAgICAgICAgICAgICAgIFNsb2cuZShUQUcsICJyZWFkaW5nIGRhdGEgZmlsZSB3aXRoIGJhZCBsZW5ndGggKCIgKyBwYXJzZWQubGVuZ3RoICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICE9ICIgKyAoNSsoMiptUGVyaW9kQ291bnQpKSArICIpIC0gaWdub3JpbmciKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICE9ICIgKyAoNSArICgyICogcGVyaW9kQ291bnQpKSArICIpIC0gaWdub3JpbmciKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwZXJpb2RSeERhdGEgPSBuZXcgbG9uZ1twZXJpb2RDb3VudF07CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwZXJpb2RDb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIHBlcmlvZFJ4RGF0YVtpXSA9IExvbmcucGFyc2VMb25nKHBhcnNlZFtwYXJzZWRVc2VkKytdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcGVyaW9kVHhEYXRhID0gbmV3IGxvbmdbcGVyaW9kQ291bnRdOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGVyaW9kQ291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBwZXJpb2RUeERhdGFbaV0gPSBMb25nLnBhcnNlTG9uZyhwYXJzZWRbcGFyc2VkVXNlZCsrXSk7CisgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgbVBlcmlvZFJ4RGF0YSA9IG5ldyBsb25nW21QZXJpb2RDb3VudF07Ci0gICAgICAgICAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IG1QZXJpb2RDb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1QZXJpb2RSeERhdGFbaV0gPSBMb25nLnBhcnNlTG9uZyhwYXJzZWRbcGFyc2VkVXNlZCsrXSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1QZXJpb2RUeERhdGEgPSBuZXcgbG9uZ1ttUGVyaW9kQ291bnRdOwotICAgICAgICAgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBtUGVyaW9kQ291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBtUGVyaW9kVHhEYXRhW2ldID0gTG9uZy5wYXJzZUxvbmcocGFyc2VkW3BhcnNlZFVzZWQrK10pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtQ3VycmVudFBlcmlvZCA9IEludGVnZXIucGFyc2VJbnQocGFyc2VkW3BhcnNlZFVzZWQrK10pOwotICAgICAgICAgICAgICAgIG1QZXJpb2RTdGFydCA9IG5ldyBHcmVnb3JpYW5DYWxlbmRhcigpOwotICAgICAgICAgICAgICAgIG1QZXJpb2RTdGFydC5zZXRUaW1lSW5NaWxsaXMoTG9uZy5wYXJzZUxvbmcocGFyc2VkW3BhcnNlZFVzZWQrK10pKTsKLSAgICAgICAgICAgICAgICBtUGVyaW9kRW5kID0gbmV3IEdyZWdvcmlhbkNhbGVuZGFyKCk7Ci0gICAgICAgICAgICAgICAgbVBlcmlvZEVuZC5zZXRUaW1lSW5NaWxsaXMoTG9uZy5wYXJzZUxvbmcocGFyc2VkW3BhcnNlZFVzZWQrK10pKTsKKyAgICAgICAgICAgICAgICBjdXJyZW50UGVyaW9kID0gSW50ZWdlci5wYXJzZUludChwYXJzZWRbcGFyc2VkVXNlZCsrXSk7CisKKyAgICAgICAgICAgICAgICBwZXJpb2RTdGFydCA9IG5ldyBHcmVnb3JpYW5DYWxlbmRhcigpOworICAgICAgICAgICAgICAgIHBlcmlvZFN0YXJ0LnNldFRpbWVJbk1pbGxpcyhMb25nLnBhcnNlTG9uZyhwYXJzZWRbcGFyc2VkVXNlZCsrXSkpOworICAgICAgICAgICAgICAgIHBlcmlvZEVuZCA9IG5ldyBHcmVnb3JpYW5DYWxlbmRhcigpOworICAgICAgICAgICAgICAgIHBlcmlvZEVuZC5zZXRUaW1lSW5NaWxsaXMoTG9uZy5wYXJzZUxvbmcocGFyc2VkW3BhcnNlZFVzZWQrK10pKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgIkVycm9yIHBhcnNpbmcgZGF0YSBmaWxlIC0gaWdub3JpbmciKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1QYXJlbnQpIHsKKyAgICAgICAgICAgICAgICBtUGVyaW9kQ291bnQgPSBwZXJpb2RDb3VudDsKKyAgICAgICAgICAgICAgICBtUGVyaW9kUnhEYXRhID0gcGVyaW9kUnhEYXRhOworICAgICAgICAgICAgICAgIG1QZXJpb2RUeERhdGEgPSBwZXJpb2RUeERhdGE7CisgICAgICAgICAgICAgICAgbUN1cnJlbnRQZXJpb2QgPSBjdXJyZW50UGVyaW9kOworICAgICAgICAgICAgICAgIG1QZXJpb2RTdGFydCA9IHBlcmlvZFN0YXJ0OworICAgICAgICAgICAgICAgIG1QZXJpb2RFbmQgPSBwZXJpb2RFbmQ7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtMTA5MSwxNSArMTExNywxNSBAQAogICAgICAgICB9CiAgICAgICAgIHB3LnByaW50bG4oKTsKIAotICAgICAgICBwdy5wcmludGxuKCJUaGUgdGhyZXNob2xkIGlzICIgKyBtUG9saWN5VGhyZXNob2xkICsKKyAgICAgICAgcHcucHJpbnRsbigiVGhlIHRocmVzaG9sZCBpcyAiICsgbVBvbGljeVRocmVzaG9sZC5nZXQoKSArCiAgICAgICAgICAgICAgICAgIiwgYWZ0ZXIgd2hpY2ggeW91IGV4cGVyaW5jZSB0aHJvdHRsaW5nIHRvICIgKwotICAgICAgICAgICAgICAgIG1Qb2xpY3lUaHJvdHRsZVZhbHVlICsgImticHMiKTsKKyAgICAgICAgICAgICAgICBtUG9saWN5VGhyb3R0bGVWYWx1ZS5nZXQoKSArICJrYnBzIik7CiAgICAgICAgIHB3LnByaW50bG4oIkN1cnJlbnQgcGVyaW9kIGlzICIgKwogICAgICAgICAgICAgICAgIChtUmVjb3JkZXIuZ2V0UGVyaW9kRW5kKCkgLSBtUmVjb3JkZXIuZ2V0UGVyaW9kU3RhcnQoKSkvMTAwMCArICIgc2Vjb25kcyBsb25nICIgKwogICAgICAgICAgICAgICAgICJhbmQgZW5kcyBpbiAiICsgKGdldFJlc2V0VGltZShtSWZhY2UpIC0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpIC8gMTAwMCArCiAgICAgICAgICAgICAgICAgIiBzZWNvbmRzLiIpOwogICAgICAgICBwdy5wcmludGxuKCJQb2xsaW5nIGV2ZXJ5ICIgKyBtUG9saWN5UG9sbFBlcmlvZFNlYyArICIgc2Vjb25kcyIpOwotICAgICAgICBwdy5wcmludGxuKCJDdXJyZW50IFRocm90dGxlIEluZGV4IGlzICIgKyBtVGhyb3R0bGVJbmRleCk7CisgICAgICAgIHB3LnByaW50bG4oIkN1cnJlbnQgVGhyb3R0bGUgSW5kZXggaXMgIiArIG1UaHJvdHRsZUluZGV4LmdldCgpKTsKICAgICAgICAgcHcucHJpbnRsbigiTWF4IE5UUCBDYWNoZSBBZ2UgaXMgIiArIG1NYXhOdHBDYWNoZUFnZVNlYyk7CiAKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtUmVjb3JkZXIuZ2V0UGVyaW9kQ291bnQoKTsgaSsrKSB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9Vc2JPYnNlcnZlci5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvVXNiT2JzZXJ2ZXIuamF2YQppbmRleCBkMDhmZTliLi41NDZlNWY4IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9Vc2JPYnNlcnZlci5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1VzYk9ic2VydmVyLmphdmEKQEAgLTI0LDYgKzI0LDcgQEAKIGltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwogaW1wb3J0IGFuZHJvaWQub3MuVUV2ZW50T2JzZXJ2ZXI7CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5NdHA7CiBpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5nczsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGFuZHJvaWQudXRpbC5TbG9nOwpAQCAtMTQ3LDggKzE0OCw0MyBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBtb25pdG9yVXNiSG9zdEJ1cygpOworCisgICAgLy8gY2FsbGVkIGZyb20gSk5JIGluIG1vbml0b3JVc2JIb3N0QnVzKCkKKyAgICBwcml2YXRlIHZvaWQgdXNiQ2FtZXJhQWRkZWQoaW50IGRldmljZUlEKSB7CisgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KFVzYi5BQ1RJT05fVVNCX0NBTUVSQV9BVFRBQ0hFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwLkRldmljZS5nZXRDb250ZW50VXJpKGRldmljZUlEKSk7CisgICAgICAgIExvZy5kKFRBRywgInVzYkNhbWVyYUFkZGVkLCBzZW5kaW5nICIgKyBpbnRlbnQpOworICAgICAgICBtQ29udGV4dC5zZW5kQnJvYWRjYXN0KGludGVudCk7CisgICAgfQorCisgICAgLy8gY2FsbGVkIGZyb20gSk5JIGluIG1vbml0b3JVc2JIb3N0QnVzKCkKKyAgICBwcml2YXRlIHZvaWQgdXNiQ2FtZXJhUmVtb3ZlZChpbnQgZGV2aWNlSUQpIHsKKyAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoVXNiLkFDVElPTl9VU0JfQ0FNRVJBX0RFVEFDSEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHAuRGV2aWNlLmdldENvbnRlbnRVcmkoZGV2aWNlSUQpKTsKKyAgICAgICAgTG9nLmQoVEFHLCAidXNiQ2FtZXJhUmVtb3ZlZCwgc2VuZGluZyAiICsgaW50ZW50KTsKKyAgICAgICAgbUNvbnRleHQuc2VuZEJyb2FkY2FzdChpbnRlbnQpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbml0SG9zdFN1cHBvcnQoKSB7CisgICAgICAgIC8vIENyZWF0ZSBhIHRocmVhZCB0byBjYWxsIGludG8gbmF0aXZlIGNvZGUgdG8gd2FpdCBmb3IgVVNCIGhvc3QgZXZlbnRzLgorICAgICAgICAvLyBUaGlzIHRocmVhZCB3aWxsIGNhbGwgdXMgYmFjayBvbiB1c2JDYW1lcmFBZGRlZCBhbmQgdXNiQ2FtZXJhUmVtb3ZlZC4KKyAgICAgICAgUnVubmFibGUgcnVubmFibGUgPSBuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgbW9uaXRvclVzYkhvc3RCdXMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgbmV3IFRocmVhZChudWxsLCBydW5uYWJsZSwgIlVzYk9ic2VydmVyIGhvc3QgdGhyZWFkIikuc3RhcnQoKTsKKyAgICB9CisKICAgICB2b2lkIHN5c3RlbVJlYWR5KCkgewogICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIGlmIChtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRCb29sZWFuKAorICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmJvb2wuY29uZmlnX2hhc1VzYkhvc3RTdXBwb3J0KSkgeworICAgICAgICAgICAgICAgIC8vIHN0YXJ0IG1vbml0b3JpbmcgZm9yIGNvbm5lY3RlZCBVU0IgZGV2aWNlcworICAgICAgICAgICAgICAgIGluaXRIb3N0U3VwcG9ydCgpOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICB1cGRhdGUoKTsKICAgICAgICAgICAgIG1TeXN0ZW1SZWFkeSA9IHRydWU7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1dpZmlTZXJ2aWNlLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9XaWZpU2VydmljZS5qYXZhCmluZGV4IDBlY2EwODIuLjhiMDIzNTUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1dpZmlTZXJ2aWNlLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvV2lmaVNlcnZpY2UuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTE2LDE5ICsxNiw5IEBACiAKIHBhY2thZ2UgY29tLmFuZHJvaWQuc2VydmVyOwogCi1pbXBvcnQgc3RhdGljIGFuZHJvaWQubmV0LndpZmkuV2lmaU1hbmFnZXIuV0lGSV9TVEFURV9ESVNBQkxFRDsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlci5XSUZJX1NUQVRFX0RJU0FCTElORzsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlci5XSUZJX1NUQVRFX0VOQUJMRUQ7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQubmV0LndpZmkuV2lmaU1hbmFnZXIuV0lGSV9TVEFURV9FTkFCTElORzsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlci5XSUZJX1NUQVRFX1VOS05PV047Ci0KLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlci5XSUZJX0FQX1NUQVRFX0RJU0FCTEVEOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyLldJRklfQVBfU1RBVEVfRElTQUJMSU5HOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyLldJRklfQVBfU1RBVEVfRU5BQkxFRDsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlci5XSUZJX0FQX1NUQVRFX0VOQUJMSU5HOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyLldJRklfQVBfU1RBVEVfRkFJTEVEOwotCiBpbXBvcnQgYW5kcm9pZC5hcHAuQWxhcm1NYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuYXBwLk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLmFwcC5Ob3RpZmljYXRpb25NYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQ7CiBpbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoQTJkcDsKIGltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhEZXZpY2U7CkBAIC0zOCw2OSArMjgsNjAgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ29udGVudE9ic2VydmVyOwogaW1wb3J0IGFuZHJvaWQubmV0LndpZmkuSVdpZmlNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQubmV0LndpZmkuV2lmaUluZm87CiBpbXBvcnQgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLm5ldC53aWZpLldpZmlOYXRpdmU7Ci1pbXBvcnQgYW5kcm9pZC5uZXQud2lmaS5XaWZpU3RhdGVUcmFja2VyOworaW1wb3J0IGFuZHJvaWQubmV0LndpZmkuV2lmaVN0YXRlTWFjaGluZTsKIGltcG9ydCBhbmRyb2lkLm5ldC53aWZpLlNjYW5SZXN1bHQ7CiBpbXBvcnQgYW5kcm9pZC5uZXQud2lmaS5XaWZpQ29uZmlndXJhdGlvbjsKIGltcG9ydCBhbmRyb2lkLm5ldC53aWZpLlN1cHBsaWNhbnRTdGF0ZTsKIGltcG9ydCBhbmRyb2lkLm5ldC53aWZpLldpZmlDb25maWd1cmF0aW9uLktleU1nbXQ7CiBpbXBvcnQgYW5kcm9pZC5uZXQuQ29ubmVjdGl2aXR5TWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLm5ldC5JbnRlcmZhY2VDb25maWd1cmF0aW9uOwotaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtTdGF0ZVRyYWNrZXI7CiBpbXBvcnQgYW5kcm9pZC5uZXQuRGhjcEluZm87Ci1pbXBvcnQgYW5kcm9pZC5uZXQuTmV0d29ya1V0aWxzOworaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtJbmZvOworaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtJbmZvLlN0YXRlOwogaW1wb3J0IGFuZHJvaWQub3MuQmluZGVyOwogaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKIGltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXJUaHJlYWQ7CiBpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOwogaW1wb3J0IGFuZHJvaWQub3MuSU5ldHdvcmtNYW5hZ2VtZW50U2VydmljZTsKLWltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKIGltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7Ci1pbXBvcnQgYW5kcm9pZC5vcy5Qb3dlck1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5Qcm9jZXNzOwogaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQub3MuU2VydmljZU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5nczsKLWltcG9ydCBhbmRyb2lkLnV0aWwuU2xvZzsKIGltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOworaW1wb3J0IGFuZHJvaWQudXRpbC5TbG9nOwogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQml0U2V0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljQm9vbGVhbjsKIGltcG9ydCBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yOwogaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS5uZXQuVW5rbm93bkhvc3RFeGNlcHRpb247CiAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5hcHAuSUJhdHRlcnlTdGF0czsKLWltcG9ydCBhbmRyb2lkLmFwcC5iYWNrdXAuSUJhY2t1cE1hbmFnZXI7CiBpbXBvcnQgY29tLmFuZHJvaWQuc2VydmVyLmFtLkJhdHRlcnlTdGF0c1NlcnZpY2U7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuUjsKIAogLyoqCiAgKiBXaWZpU2VydmljZSBoYW5kbGVzIHJlbW90ZSBXaUZpIG9wZXJhdGlvbiByZXF1ZXN0cyBieSBpbXBsZW1lbnRpbmcKLSAqIHRoZSBJV2lmaU1hbmFnZXIgaW50ZXJmYWNlLiBJdCBhbHNvIGNyZWF0ZXMgYSBXaWZpTW9uaXRvciB0byBsaXN0ZW4KLSAqIGZvciBXaWZpLXJlbGF0ZWQgZXZlbnRzLgorICogdGhlIElXaWZpTWFuYWdlciBpbnRlcmZhY2UuCiAgKgogICogQGhpZGUKICAqLworLy9UT0RPOiBDbGVhbiB1cCBtdWx0aXBsZSBsb2NrcyBhbmQgaW1wbGVtZW50IFdpZmlTZXJ2aWNlCisvLyBhcyBhIFNNIHRvIHRyYWNrIHNvZnQgQVAvY2xpZW50L2FkaG9jIGJyaW5nIHVwIGJhc2VkCisvLyBvbiBkZXZpY2UgaWRsZSBzdGF0ZSwgYWlycGxhbmUgbW9kZSBhbmQgYm9vdC4KKwogcHVibGljIGNsYXNzIFdpZmlTZXJ2aWNlIGV4dGVuZHMgSVdpZmlNYW5hZ2VyLlN0dWIgewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiV2lmaVNlcnZpY2UiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREJHID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBzY2FuUmVzdWx0UGF0dGVybiA9IFBhdHRlcm4uY29tcGlsZSgiXHQrIik7Ci0gICAgcHJpdmF0ZSBmaW5hbCBXaWZpU3RhdGVUcmFja2VyIG1XaWZpU3RhdGVUcmFja2VyOwotICAgIC8qIFRPRE86IGZldGNoIGEgY29uZmlndXJhYmxlIGludGVyZmFjZSAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTT0ZUQVBfSUZBQ0UgPSAid2wwLjEiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREJHID0gdHJ1ZTsKKworICAgIHByaXZhdGUgZmluYWwgV2lmaVN0YXRlTWFjaGluZSBtV2lmaVN0YXRlTWFjaGluZTsKIAogICAgIHByaXZhdGUgQ29udGV4dCBtQ29udGV4dDsKLSAgICBwcml2YXRlIGludCBtV2lmaUFwU3RhdGU7CiAKICAgICBwcml2YXRlIEFsYXJtTWFuYWdlciBtQWxhcm1NYW5hZ2VyOwogICAgIHByaXZhdGUgUGVuZGluZ0ludGVudCBtSWRsZUludGVudDsKQEAgLTEwOSwxNSArOTAsMTEgQEAKICAgICBwcml2YXRlIGJvb2xlYW4gbURldmljZUlkbGU7CiAgICAgcHJpdmF0ZSBpbnQgbVBsdWdnZWRUeXBlOwogCi0gICAgcHJpdmF0ZSBlbnVtIERyaXZlckFjdGlvbiB7RFJJVkVSX1VOTE9BRCwgTk9fRFJJVkVSX1VOTE9BRH07Ci0KICAgICAvLyB0cnVlIGlmIHRoZSB1c2VyIGVuYWJsZWQgV2lmaSB3aGlsZSBpbiBhaXJwbGFuZSBtb2RlCi0gICAgcHJpdmF0ZSBib29sZWFuIG1BaXJwbGFuZU1vZGVPdmVyd3JpZGRlbjsKKyAgICBwcml2YXRlIEF0b21pY0Jvb2xlYW4gbUFpcnBsYW5lTW9kZU92ZXJ3cmlkZGVuID0gbmV3IEF0b21pY0Jvb2xlYW4oZmFsc2UpOwogCiAgICAgcHJpdmF0ZSBmaW5hbCBMb2NrTGlzdCBtTG9ja3MgPSBuZXcgTG9ja0xpc3QoKTsKICAgICAvLyBzb21lIHdpZmkgbG9jayBzdGF0aXN0aWNzCi0gICAgcHJpdmF0ZSBpbnQgbUZ1bGxIaWdoUGVyZkxvY2tzQWNxdWlyZWQ7Ci0gICAgcHJpdmF0ZSBpbnQgbUZ1bGxIaWdoUGVyZkxvY2tzUmVsZWFzZWQ7CiAgICAgcHJpdmF0ZSBpbnQgbUZ1bGxMb2Nrc0FjcXVpcmVkOwogICAgIHByaXZhdGUgaW50IG1GdWxsTG9ja3NSZWxlYXNlZDsKICAgICBwcml2YXRlIGludCBtU2NhbkxvY2tzQWNxdWlyZWQ7CkBAIC0xMzAsOSArMTA3LDcgQEAKIAogICAgIHByaXZhdGUgZmluYWwgSUJhdHRlcnlTdGF0cyBtQmF0dGVyeVN0YXRzOwogCi0gICAgcHJpdmF0ZSBJTmV0d29ya01hbmFnZW1lbnRTZXJ2aWNlIG53U2VydmljZTsKICAgICBDb25uZWN0aXZpdHlNYW5hZ2VyIG1DbTsKLSAgICBwcml2YXRlIFdpZmlXYXRjaGRvZ1NlcnZpY2UgbVdpZmlXYXRjaGRvZ1NlcnZpY2UgPSBudWxsOwogICAgIHByaXZhdGUgU3RyaW5nW10gbVdpZmlSZWdleHM7CiAKICAgICAvKioKQEAgLTE0NCw2MSArMTE5LDYgQEAKICAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIERFRkFVTFRfSURMRV9NSUxMSVMgPSAxNSAqIDYwICogMTAwMDsgLyogMTUgbWludXRlcyAqLwogCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdBS0VMT0NLX1RBRyA9ICJXaWZpU2VydmljZSI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbWF4aW11bSBhbW91bnQgb2YgdGltZSB0byBob2xkIHRoZSB3YWtlIGxvY2sgYWZ0ZXIgYSBkaXNjb25uZWN0Ci0gICAgICogY2F1c2VkIGJ5IHN0b3BwaW5nIHRoZSBkcml2ZXIuIEVzdGFibGlzaGluZyBhbiBFREdFIGNvbm5lY3Rpb24gaGFzIGJlZW4KLSAgICAgKiBvYnNlcnZlZCB0byB0YWtlIGFib3V0IDUgc2Vjb25kcyB1bmRlciBub3JtYWwgY2lyY3Vtc3RhbmNlcy4gVGhpcwotICAgICAqIHByb3ZpZGVzIGEgYml0IG9mIGV4dHJhIG1hcmdpbi4KLSAgICAgKiA8cD4KLSAgICAgKiBTZWUge0BsaW5rIGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3MuU2VjdXJlI1dJRklfTU9CSUxFX0RBVEFfVFJBTlNJVElPTl9XQUtFTE9DS19USU1FT1VUX01TfS4KLSAgICAgKiBUaGlzIGlzIHRoZSBkZWZhdWx0IHZhbHVlIGlmIGEgU2V0dGluZ3MuU2VjdXJlIHZhbHVlIGlzIG5vdCBwcmVzZW50LgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX1dBS0VMT0NLX1RJTUVPVVQgPSA4MDAwOwotCi0gICAgLy8gV2FrZSBsb2NrIHVzZWQgYnkgZHJpdmVyLXN0b3Agb3BlcmF0aW9uCi0gICAgcHJpdmF0ZSBzdGF0aWMgUG93ZXJNYW5hZ2VyLldha2VMb2NrIHNEcml2ZXJTdG9wV2FrZUxvY2s7Ci0gICAgLy8gV2FrZSBsb2NrIHVzZWQgYnkgb3RoZXIgb3BlcmF0aW9ucwotICAgIHByaXZhdGUgc3RhdGljIFBvd2VyTWFuYWdlci5XYWtlTG9jayBzV2FrZUxvY2s7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUVTU0FHRV9FTkFCTEVfV0lGSSAgICAgICAgPSAwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNRVNTQUdFX0RJU0FCTEVfV0lGSSAgICAgICA9IDE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1FU1NBR0VfU1RPUF9XSUZJICAgICAgICAgID0gMjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUVTU0FHRV9TVEFSVF9XSUZJICAgICAgICAgPSAzOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNRVNTQUdFX1JFTEVBU0VfV0FLRUxPQ0sgICA9IDQ7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1FU1NBR0VfVVBEQVRFX1NUQVRFICAgICAgID0gNTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUVTU0FHRV9TVEFSVF9BQ0NFU1NfUE9JTlQgPSA2OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNRVNTQUdFX1NUT1BfQUNDRVNTX1BPSU5UICA9IDc7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1FU1NBR0VfU0VUX0NIQU5ORUxTICAgICAgID0gODsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUVTU0FHRV9FTkFCTEVfTkVUV09SS1MgICAgPSA5OwotCi0KLSAgICBwcml2YXRlIGZpbmFsICBXaWZpSGFuZGxlciBtV2lmaUhhbmRsZXI7Ci0KLSAgICAvKgotICAgICAqIENhY2hlIG9mIHNjYW4gcmVzdWx0cyBvYmplY3RzIChzaXplIGlzIHNvbWV3aGF0IGFyYml0cmFyeSkKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0NBTl9SRVNVTFRfQ0FDSEVfU0laRSA9IDgwOwotICAgIHByaXZhdGUgZmluYWwgTGlua2VkSGFzaE1hcDxTdHJpbmcsIFNjYW5SZXN1bHQ+IG1TY2FuUmVzdWx0Q2FjaGU7Ci0KLSAgICAvKgotICAgICAqIENoYXJhY3RlciBidWZmZXIgdXNlZCB0byBwYXJzZSBzY2FuIHJlc3VsdHMgKG9wdGltaXphdGlvbikKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0NBTl9SRVNVTFRfQlVGRkVSX1NJWkUgPSA1MTI7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1OZWVkUmVjb25maWc7Ci0KLSAgICAvKgotICAgICAqIExhc3QgVUlEIHRoYXQgYXNrZWQgdG8gZW5hYmxlIFdJRkkuCi0gICAgICovCi0gICAgcHJpdmF0ZSBpbnQgbUxhc3RFbmFibGVVaWQgPSBQcm9jZXNzLm15VWlkKCk7Ci0KLSAgICAvKgotICAgICAqIExhc3QgVUlEIHRoYXQgYXNrZWQgdG8gZW5hYmxlIFdJRkkgQVAuCi0gICAgICovCi0gICAgcHJpdmF0ZSBpbnQgbUxhc3RBcEVuYWJsZVVpZCA9IFByb2Nlc3MubXlVaWQoKTsKLQotCiAgICAgLyoqCiAgICAgICogTnVtYmVyIG9mIGFsbG93ZWQgcmFkaW8gZnJlcXVlbmN5IGNoYW5uZWxzIGluIHZhcmlvdXMgcmVndWxhdG9yeSBkb21haW5zLgogICAgICAqIFRoaXMgbGlzdCBpcyBzdWZmaWNpZW50IGZvciA4MDIuMTFiL2cgbmV0d29ya3MgKDIuNEdIeiByYW5nZSkuCkBAIC0yMDgsNDcgKzEyOCw4MCBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fREVWSUNFX0lETEUgPQogICAgICAgICAgICAgImNvbS5hbmRyb2lkLnNlcnZlci5XaWZpTWFuYWdlci5hY3Rpb24uREVWSUNFX0lETEUiOwogCi0gICAgV2lmaVNlcnZpY2UoQ29udGV4dCBjb250ZXh0LCBXaWZpU3RhdGVUcmFja2VyIHRyYWNrZXIpIHsKKyAgICBwcml2YXRlIGJvb2xlYW4gbUlzUmVjZWl2ZXJSZWdpc3RlcmVkID0gZmFsc2U7CisKKworICAgIE5ldHdvcmtJbmZvIG1OZXR3b3JrSW5mbyA9IG5ldyBOZXR3b3JrSW5mbyhDb25uZWN0aXZpdHlNYW5hZ2VyLlRZUEVfV0lGSSwgMCwgIldJRkkiLCAiIik7CisKKyAgICAvLyBWYXJpYWJsZXMgcmVsYXRpbmcgdG8gdGhlICdhdmFpbGFibGUgbmV0d29ya3MnIG5vdGlmaWNhdGlvbgorICAgIC8qKgorICAgICAqIFRoZSBpY29uIHRvIHNob3cgaW4gdGhlICdhdmFpbGFibGUgbmV0d29ya3MnIG5vdGlmaWNhdGlvbi4gVGhpcyB3aWxsIGFsc28KKyAgICAgKiBiZSB0aGUgSUQgb2YgdGhlIE5vdGlmaWNhdGlvbiBnaXZlbiB0byB0aGUgTm90aWZpY2F0aW9uTWFuYWdlci4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSUNPTl9ORVRXT1JLU19BVkFJTEFCTEUgPQorICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5kcmF3YWJsZS5zdGF0X25vdGlmeV93aWZpX2luX3JhbmdlOworICAgIC8qKgorICAgICAqIFdoZW4gYSBub3RpZmljYXRpb24gaXMgc2hvd24sIHdlIHdhaXQgdGhpcyBhbW91bnQgYmVmb3JlIHBvc3NpYmx5IHNob3dpbmcgaXQgYWdhaW4uCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBsb25nIE5PVElGSUNBVElPTl9SRVBFQVRfREVMQVlfTVM7CisgICAgLyoqCisgICAgICogV2hldGhlciB0aGUgdXNlciBoYXMgc2V0IHRoZSBzZXR0aW5nIHRvIHNob3cgdGhlICdhdmFpbGFibGUgbmV0d29ya3MnIG5vdGlmaWNhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gbU5vdGlmaWNhdGlvbkVuYWJsZWQ7CisgICAgLyoqCisgICAgICogT2JzZXJ2ZXMgdGhlIHVzZXIgc2V0dGluZyB0byBrZWVwIHtAbGluayAjbU5vdGlmaWNhdGlvbkVuYWJsZWR9IGluIHN5bmMuCisgICAgICovCisgICAgcHJpdmF0ZSBOb3RpZmljYXRpb25FbmFibGVkU2V0dGluZ09ic2VydmVyIG1Ob3RpZmljYXRpb25FbmFibGVkU2V0dGluZ09ic2VydmVyOworICAgIC8qKgorICAgICAqIFRoZSB7QGxpbmsgU3lzdGVtI2N1cnJlbnRUaW1lTWlsbGlzKCl9IG11c3QgYmUgYXQgbGVhc3QgdGhpcyB2YWx1ZSBmb3IgdXMKKyAgICAgKiB0byBzaG93IHRoZSBub3RpZmljYXRpb24gYWdhaW4uCisgICAgICovCisgICAgcHJpdmF0ZSBsb25nIG1Ob3RpZmljYXRpb25SZXBlYXRUaW1lOworICAgIC8qKgorICAgICAqIFRoZSBOb3RpZmljYXRpb24gb2JqZWN0IGdpdmVuIHRvIHRoZSBOb3RpZmljYXRpb25NYW5hZ2VyLgorICAgICAqLworICAgIHByaXZhdGUgTm90aWZpY2F0aW9uIG1Ob3RpZmljYXRpb247CisgICAgLyoqCisgICAgICogV2hldGhlciB0aGUgbm90aWZpY2F0aW9uIGlzIGJlaW5nIHNob3duLCBhcyBzZXQgYnkgdXMuIFRoYXQgaXMsIGlmIHRoZQorICAgICAqIHVzZXIgY2FuY2VscyB0aGUgbm90aWZpY2F0aW9uLCB3ZSB3aWxsIG5vdCByZWNlaXZlIHRoZSBjYWxsYmFjayBzbyB0aGlzCisgICAgICogd2lsbCBzdGlsbCBiZSB0cnVlLiBXZSBvbmx5IGd1YXJhbnRlZSBpZiB0aGlzIGlzIGZhbHNlLCB0aGVuIHRoZQorICAgICAqIG5vdGlmaWNhdGlvbiBpcyBub3Qgc2hvd2luZy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gbU5vdGlmaWNhdGlvblNob3duOworICAgIC8qKgorICAgICAqIFRoZSBudW1iZXIgb2YgY29udGludW91cyBzY2FucyB0aGF0IG11c3Qgb2NjdXIgYmVmb3JlIGNvbnNpZGVyIHRoZQorICAgICAqIHN1cHBsaWNhbnQgaW4gYSBzY2FubmluZyBzdGF0ZS4gVGhpcyBhbGxvd3Mgc3VwcGxpY2FudCB0byBhc3NvY2lhdGUgd2l0aAorICAgICAqIHJlbWVtYmVyZWQgbmV0d29ya3MgdGhhdCBhcmUgaW4gdGhlIHNjYW4gcmVzdWx0cy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTlVNX1NDQU5TX0JFRk9SRV9BQ1RVQUxMWV9TQ0FOTklORyA9IDM7CisgICAgLyoqCisgICAgICogVGhlIG51bWJlciBvZiBzY2FucyBzaW5jZSB0aGUgbGFzdCBuZXR3b3JrIHN0YXRlIGNoYW5nZS4gV2hlbiB0aGlzCisgICAgICogZXhjZWVkcyB7QGxpbmsgI05VTV9TQ0FOU19CRUZPUkVfQUNUVUFMTFlfU0NBTk5JTkd9LCB3ZSBjb25zaWRlciB0aGUKKyAgICAgKiBzdXBwbGljYW50IHRvIGFjdHVhbGx5IGJlIHNjYW5uaW5nLiBXaGVuIHRoZSBuZXR3b3JrIHN0YXRlIGNoYW5nZXMgdG8KKyAgICAgKiBzb21ldGhpbmcgb3RoZXIgdGhhbiBzY2FubmluZywgd2UgcmVzZXQgdGhpcyB0byAwLgorICAgICAqLworICAgIHByaXZhdGUgaW50IG1OdW1TY2Fuc1NpbmNlTmV0d29ya1N0YXRlQ2hhbmdlOworCisKKyAgICBXaWZpU2VydmljZShDb250ZXh0IGNvbnRleHQpIHsKICAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OwotICAgICAgICBtV2lmaVN0YXRlVHJhY2tlciA9IHRyYWNrZXI7Ci0gICAgICAgIG1XaWZpU3RhdGVUcmFja2VyLmVuYWJsZVJzc2lQb2xsaW5nKHRydWUpOworICAgICAgICBtV2lmaVN0YXRlTWFjaGluZSA9IG5ldyBXaWZpU3RhdGVNYWNoaW5lKG1Db250ZXh0KTsKKyAgICAgICAgbVdpZmlTdGF0ZU1hY2hpbmUuZW5hYmxlUnNzaVBvbGxpbmcodHJ1ZSk7CiAgICAgICAgIG1CYXR0ZXJ5U3RhdHMgPSBCYXR0ZXJ5U3RhdHNTZXJ2aWNlLmdldFNlcnZpY2UoKTsKIAotICAgICAgICBJQmluZGVyIGIgPSBTZXJ2aWNlTWFuYWdlci5nZXRTZXJ2aWNlKENvbnRleHQuTkVUV09SS01BTkFHRU1FTlRfU0VSVklDRSk7Ci0gICAgICAgIG53U2VydmljZSA9IElOZXR3b3JrTWFuYWdlbWVudFNlcnZpY2UuU3R1Yi5hc0ludGVyZmFjZShiKTsKLQotICAgICAgICBtU2NhblJlc3VsdENhY2hlID0gbmV3IExpbmtlZEhhc2hNYXA8U3RyaW5nLCBTY2FuUmVzdWx0PigKLSAgICAgICAgICAgIFNDQU5fUkVTVUxUX0NBQ0hFX1NJWkUsIDAuNzVmLCB0cnVlKSB7Ci0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgKiBMaW1pdCB0aGUgY2FjaGUgc2l6ZSBieSBTQ0FOX1JFU1VMVF9DQUNIRV9TSVpFCi0gICAgICAgICAgICAgICAgICogZWxlbWVudHMKLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmVFbGRlc3RFbnRyeShNYXAuRW50cnkgZWxkZXN0KSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBTQ0FOX1JFU1VMVF9DQUNIRV9TSVpFIDwgdGhpcy5zaXplKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfTsKLQotICAgICAgICBIYW5kbGVyVGhyZWFkIHdpZmlUaHJlYWQgPSBuZXcgSGFuZGxlclRocmVhZCgiV2lmaVNlcnZpY2UiKTsKLSAgICAgICAgd2lmaVRocmVhZC5zdGFydCgpOwotICAgICAgICBtV2lmaUhhbmRsZXIgPSBuZXcgV2lmaUhhbmRsZXIod2lmaVRocmVhZC5nZXRMb29wZXIoKSk7Ci0KLSAgICAgICAgbVdpZmlTdGF0ZVRyYWNrZXIuc2V0V2lmaVN0YXRlKFdJRklfU1RBVEVfRElTQUJMRUQpOwotICAgICAgICBtV2lmaUFwU3RhdGUgPSBXSUZJX0FQX1NUQVRFX0RJU0FCTEVEOwotCiAgICAgICAgIG1BbGFybU1hbmFnZXIgPSAoQWxhcm1NYW5hZ2VyKW1Db250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5BTEFSTV9TRVJWSUNFKTsKICAgICAgICAgSW50ZW50IGlkbGVJbnRlbnQgPSBuZXcgSW50ZW50KEFDVElPTl9ERVZJQ0VfSURMRSwgbnVsbCk7CiAgICAgICAgIG1JZGxlSW50ZW50ID0gUGVuZGluZ0ludGVudC5nZXRCcm9hZGNhc3QobUNvbnRleHQsIElETEVfUkVRVUVTVCwgaWRsZUludGVudCwgMCk7CiAKLSAgICAgICAgUG93ZXJNYW5hZ2VyIHBvd2VyTWFuYWdlciA9IChQb3dlck1hbmFnZXIpbUNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LlBPV0VSX1NFUlZJQ0UpOwotICAgICAgICBzV2FrZUxvY2sgPSBwb3dlck1hbmFnZXIubmV3V2FrZUxvY2soUG93ZXJNYW5hZ2VyLlBBUlRJQUxfV0FLRV9MT0NLLCBXQUtFTE9DS19UQUcpOwotICAgICAgICBzRHJpdmVyU3RvcFdha2VMb2NrID0gcG93ZXJNYW5hZ2VyLm5ld1dha2VMb2NrKFBvd2VyTWFuYWdlci5QQVJUSUFMX1dBS0VfTE9DSywgV0FLRUxPQ0tfVEFHKTsKKyAgICAgICAgSGFuZGxlclRocmVhZCB3aWZpVGhyZWFkID0gbmV3IEhhbmRsZXJUaHJlYWQoIldpZmlTZXJ2aWNlIik7CisgICAgICAgIHdpZmlUaHJlYWQuc3RhcnQoKTsKIAogICAgICAgICBtQ29udGV4dC5yZWdpc3RlclJlY2VpdmVyKAogICAgICAgICAgICAgICAgIG5ldyBCcm9hZGNhc3RSZWNlaXZlcigpIHsKICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVjZWl2ZShDb250ZXh0IGNvbnRleHQsIEludGVudCBpbnRlbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNsZWFyIG91ciBmbGFnIGluZGljYXRpbmcgdGhlIHVzZXIgaGFzIG92ZXJ3cmlkZGVuIGFpcnBsYW5lIG1vZGUKLSAgICAgICAgICAgICAgICAgICAgICAgIG1BaXJwbGFuZU1vZGVPdmVyd3JpZGRlbiA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgbUFpcnBsYW5lTW9kZU92ZXJ3cmlkZGVuLnNldChmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbiBhaXJwbGFuZSBkaXNhYmxlLCByZXN0b3JlIFdpZmkgaWYgdGhlIHNhdmVkIHN0YXRlIGluZGljYXRlcyBzbwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0FpcnBsYW5lTW9kZU9uKCkgJiYgdGVzdEFuZENsZWFyV2lmaVNhdmVkU3RhdGUoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcnNpc3RXaWZpRW5hYmxlZCh0cnVlKTsKQEAgLTI2MywxNCArMjE2LDUwIEBACiAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25SZWNlaXZlKENvbnRleHQgY29udGV4dCwgSW50ZW50IGludGVudCkgewogCi0gICAgICAgICAgICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBhdmFpbGFibGUgPSBpbnRlbnQuZ2V0U3RyaW5nQXJyYXlMaXN0RXh0cmEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpdml0eU1hbmFnZXIuRVhUUkFfQVZBSUxBQkxFX1RFVEhFUik7Ci0gICAgICAgICAgICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBhY3RpdmUgPSBpbnRlbnQuZ2V0U3RyaW5nQXJyYXlMaXN0RXh0cmEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpdml0eU1hbmFnZXIuRVhUUkFfQUNUSVZFX1RFVEhFUik7Ci0gICAgICAgICAgICAgICAgICB1cGRhdGVUZXRoZXJTdGF0ZShhdmFpbGFibGUsIGFjdGl2ZSk7CisgICAgICAgICAgICAgICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IGF2YWlsYWJsZSA9IGludGVudC5nZXRTdHJpbmdBcnJheUxpc3RFeHRyYSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25uZWN0aXZpdHlNYW5hZ2VyLkVYVFJBX0FWQUlMQUJMRV9URVRIRVIpOworICAgICAgICAgICAgICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBhY3RpdmUgPSBpbnRlbnQuZ2V0U3RyaW5nQXJyYXlMaXN0RXh0cmEoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGl2aXR5TWFuYWdlci5FWFRSQV9BQ1RJVkVfVEVUSEVSKTsKKyAgICAgICAgICAgICAgICAgICAgdXBkYXRlVGV0aGVyU3RhdGUoYXZhaWxhYmxlLCBhY3RpdmUpOwogCiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSxuZXcgSW50ZW50RmlsdGVyKENvbm5lY3Rpdml0eU1hbmFnZXIuQUNUSU9OX1RFVEhFUl9TVEFURV9DSEFOR0VEKSk7CisKKyAgICAgICAgSW50ZW50RmlsdGVyIGZpbHRlciA9IG5ldyBJbnRlbnRGaWx0ZXIoKTsKKyAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihXaWZpTWFuYWdlci5XSUZJX1NUQVRFX0NIQU5HRURfQUNUSU9OKTsKKyAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihXaWZpTWFuYWdlci5ORVRXT1JLX1NUQVRFX0NIQU5HRURfQUNUSU9OKTsKKyAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihXaWZpTWFuYWdlci5TQ0FOX1JFU1VMVFNfQVZBSUxBQkxFX0FDVElPTik7CisKKyAgICAgICAgbUNvbnRleHQucmVnaXN0ZXJSZWNlaXZlcigKKyAgICAgICAgICAgICAgICBuZXcgQnJvYWRjYXN0UmVjZWl2ZXIoKSB7CisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblJlY2VpdmUoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW50ZW50LmdldEFjdGlvbigpLmVxdWFscyhXaWZpTWFuYWdlci5XSUZJX1NUQVRFX0NIQU5HRURfQUNUSU9OKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc2V0ICYgY2xlYXIgbm90aWZpY2F0aW9uIG9uIGFueSB3aWZpIHN0YXRlIGNoYW5nZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2V0Tm90aWZpY2F0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGludGVudC5nZXRBY3Rpb24oKS5lcXVhbHMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlNYW5hZ2VyLk5FVFdPUktfU1RBVEVfQ0hBTkdFRF9BQ1RJT04pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5ldHdvcmtJbmZvID0gKE5ldHdvcmtJbmZvKSBpbnRlbnQuZ2V0UGFyY2VsYWJsZUV4dHJhKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lmaU1hbmFnZXIuRVhUUkFfTkVUV09SS19JTkZPKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXNldCAmIGNsZWFyIG5vdGlmaWNhdGlvbiBvbiBhIG5ldHdvcmsgY29ubmVjdCAmIGRpc2Nvbm5lY3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2gobU5ldHdvcmtJbmZvLmdldERldGFpbGVkU3RhdGUoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENPTk5FQ1RFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBESVNDT05ORUNURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNldE5vdGlmaWNhdGlvbigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpbnRlbnQuZ2V0QWN0aW9uKCkuZXF1YWxzKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWZpTWFuYWdlci5TQ0FOX1JFU1VMVFNfQVZBSUxBQkxFX0FDVElPTikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja0FuZFNldE5vdGlmaWNhdGlvbigpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSwgZmlsdGVyKTsKKworICAgICAgICAvLyBTZXR0aW5nIGlzIGluIHNlY29uZHMKKyAgICAgICAgTk9USUZJQ0FUSU9OX1JFUEVBVF9ERUxBWV9NUyA9IFNldHRpbmdzLlNlY3VyZS5nZXRJbnQoY29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwKKyAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuV0lGSV9ORVRXT1JLU19BVkFJTEFCTEVfUkVQRUFUX0RFTEFZLCA5MDApICogMTAwMGw7CisgICAgICAgIG1Ob3RpZmljYXRpb25FbmFibGVkU2V0dGluZ09ic2VydmVyID0gbmV3IE5vdGlmaWNhdGlvbkVuYWJsZWRTZXR0aW5nT2JzZXJ2ZXIobmV3IEhhbmRsZXIoKSk7CisgICAgICAgIG1Ob3RpZmljYXRpb25FbmFibGVkU2V0dGluZ09ic2VydmVyLnJlZ2lzdGVyKCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0yNzksNyArMjY4LDcgQEAKICAgICAgKgogICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBvbmx5IGF0IGJvb3QgdGltZQogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHN0YXJ0V2lmaSgpIHsKKyAgICBwdWJsaWMgdm9pZCBjaGVja0FuZFN0YXJ0V2lmaSgpIHsKICAgICAgICAgLyogU3RhcnQgaWYgV2ktRmkgaXMgZW5hYmxlZCBvciB0aGUgc2F2ZWQgc3RhdGUgaW5kaWNhdGVzIFdpLUZpIHdhcyBvbiAqLwogICAgICAgICBib29sZWFuIHdpZmlFbmFibGVkID0gIWlzQWlycGxhbmVNb2RlT24oKQogICAgICAgICAgICAgICAgICYmIChnZXRQZXJzaXN0ZWRXaWZpRW5hYmxlZCgpIHx8IHRlc3RBbmRDbGVhcldpZmlTYXZlZFN0YXRlKCkpOwpAQCAtMjk2LDcgKzI4NSwxMCBAQAogICAgICAgICBJQmluZGVyIGIgPSBTZXJ2aWNlTWFuYWdlci5nZXRTZXJ2aWNlKENvbnRleHQuTkVUV09SS01BTkFHRU1FTlRfU0VSVklDRSk7CiAgICAgICAgIElOZXR3b3JrTWFuYWdlbWVudFNlcnZpY2Ugc2VydmljZSA9IElOZXR3b3JrTWFuYWdlbWVudFNlcnZpY2UuU3R1Yi5hc0ludGVyZmFjZShiKTsKIAotICAgICAgICBtQ20gPSAoQ29ubmVjdGl2aXR5TWFuYWdlciltQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuQ09OTkVDVElWSVRZX1NFUlZJQ0UpOworICAgICAgICBpZiAobUNtID09IG51bGwpIHsKKyAgICAgICAgICAgIG1DbSA9IChDb25uZWN0aXZpdHlNYW5hZ2VyKW1Db250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5DT05ORUNUSVZJVFlfU0VSVklDRSk7CisgICAgICAgIH0KKwogICAgICAgICBtV2lmaVJlZ2V4cyA9IG1DbS5nZXRUZXRoZXJhYmxlV2lmaVJlZ2V4cygpOwogCiAgICAgICAgIGZvciAoU3RyaW5nIGludGYgOiBhdmFpbGFibGUpIHsKQEAgLTMxNiwxNyArMzA4LDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBTbG9nLmUoVEFHLCAiRXJyb3IgY29uZmlndXJpbmcgaW50ZXJmYWNlICIgKyBpbnRmICsgIiwgOiIgKyBlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbndTZXJ2aWNlLnN0b3BBY2Nlc3NQb2ludCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGVlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgIkNvdWxkIG5vdCBzdG9wIEFQLCA6IiArIGVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHNldFdpZmlBcEVuYWJsZWRTdGF0ZShXSUZJX0FQX1NUQVRFX0ZBSUxFRCwgMCwgRHJpdmVyQWN0aW9uLkRSSVZFUl9VTkxPQUQpOworICAgICAgICAgICAgICAgICAgICAgICAgc2V0V2lmaUFwRW5hYmxlZChudWxsLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgICAgICBpZihtQ20udGV0aGVyKGludGYpICE9IENvbm5lY3Rpdml0eU1hbmFnZXIuVEVUSEVSX0VSUk9SX05PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTbG9nLmUoVEFHLCAiRXJyb3IgdGV0aGVyaW5nICIraW50Zik7CisgICAgICAgICAgICAgICAgICAgICAgICBTbG9nLmUoVEFHLCAiRXJyb3IgdGV0aGVyaW5nIG9uICIgKyBpbnRmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldFdpZmlBcEVuYWJsZWQobnVsbCwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KQEAgLTM2MiwxOTAgKzM1MSwyMSBAQAogICAgICAgICBTZXR0aW5ncy5TZWN1cmUucHV0SW50KGNyLCBTZXR0aW5ncy5TZWN1cmUuV0lGSV9PTiwgZW5hYmxlZCA/IDEgOiAwKTsKICAgICB9CiAKLSAgICBOZXR3b3JrU3RhdGVUcmFja2VyIGdldE5ldHdvcmtTdGF0ZVRyYWNrZXIoKSB7Ci0gICAgICAgIHJldHVybiBtV2lmaVN0YXRlVHJhY2tlcjsKLSAgICB9Ci0KICAgICAvKioKICAgICAgKiBzZWUge0BsaW5rIGFuZHJvaWQubmV0LndpZmkuV2lmaU1hbmFnZXIjcGluZ1N1cHBsaWNhbnQoKX0KLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcywge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBwaW5nU3VwcGxpY2FudCgpIHsKLSAgICAgICAgZW5mb3JjZUNoYW5nZVBlcm1pc3Npb24oKTsKLQotICAgICAgICByZXR1cm4gbVdpZmlTdGF0ZVRyYWNrZXIucGluZygpOworICAgICAgICBlbmZvcmNlQWNjZXNzUGVybWlzc2lvbigpOworICAgICAgICByZXR1cm4gbVdpZmlTdGF0ZU1hY2hpbmUuc3luY1BpbmdTdXBwbGljYW50KCk7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogc2VlIHtAbGluayBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyI3N0YXJ0U2NhbigpfQotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMKICAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBzdGFydFNjYW4oYm9vbGVhbiBmb3JjZUFjdGl2ZSkgeworICAgIHB1YmxpYyB2b2lkIHN0YXJ0U2Nhbihib29sZWFuIGZvcmNlQWN0aXZlKSB7CiAgICAgICAgIGVuZm9yY2VDaGFuZ2VQZXJtaXNzaW9uKCk7Ci0KLSAgICAgICAgc3dpdGNoIChtV2lmaVN0YXRlVHJhY2tlci5nZXRTdXBwbGljYW50U3RhdGUoKSkgewotICAgICAgICAgICAgY2FzZSBESVNDT05ORUNURUQ6Ci0gICAgICAgICAgICBjYXNlIElOQUNUSVZFOgotICAgICAgICAgICAgY2FzZSBTQ0FOTklORzoKLSAgICAgICAgICAgIGNhc2UgRE9STUFOVDoKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgbVdpZmlTdGF0ZVRyYWNrZXIuc2V0U2NhblJlc3VsdEhhbmRsaW5nKAotICAgICAgICAgICAgICAgICAgICAgICAgV2lmaVN0YXRlVHJhY2tlci5TVVBQTF9TQ0FOX0hBTkRMSU5HX0xJU1RfT05MWSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1XaWZpU3RhdGVUcmFja2VyLnNjYW4oZm9yY2VBY3RpdmUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHNlZSB7QGxpbmsgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlciNzZXRXaWZpRW5hYmxlZChib29sZWFuKX0KLSAgICAgKiBAcGFyYW0gZW5hYmxlIHtAY29kZSB0cnVlfSB0byBlbmFibGUsIHtAY29kZSBmYWxzZX0gdG8gZGlzYWJsZS4KLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgZW5hYmxlL2Rpc2FibGUgb3BlcmF0aW9uIHdhcwotICAgICAqICAgICAgICAgc3RhcnRlZCBvciBpcyBhbHJlYWR5IGluIHRoZSBxdWV1ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBzZXRXaWZpRW5hYmxlZChib29sZWFuIGVuYWJsZSkgewotICAgICAgICBlbmZvcmNlQ2hhbmdlUGVybWlzc2lvbigpOwotICAgICAgICBpZiAobVdpZmlIYW5kbGVyID09IG51bGwpIHJldHVybiBmYWxzZTsKLQotICAgICAgICBzeW5jaHJvbml6ZWQgKG1XaWZpSGFuZGxlcikgewotICAgICAgICAgICAgLy8gY2FsbGVyIG1heSBub3QgaGF2ZSBXQUtFX0xPQ0sgcGVybWlzc2lvbiAtIGl0J3Mgbm90IHJlcXVpcmVkIGhlcmUKLSAgICAgICAgICAgIGxvbmcgaWRlbnQgPSBCaW5kZXIuY2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKLSAgICAgICAgICAgIHNXYWtlTG9jay5hY3F1aXJlKCk7Ci0gICAgICAgICAgICBCaW5kZXIucmVzdG9yZUNhbGxpbmdJZGVudGl0eShpZGVudCk7Ci0KLSAgICAgICAgICAgIG1MYXN0RW5hYmxlVWlkID0gQmluZGVyLmdldENhbGxpbmdVaWQoKTsKLSAgICAgICAgICAgIC8vIHNldCBhIGZsYWcgaWYgdGhlIHVzZXIgaXMgZW5hYmxpbmcgV2lmaSB3aGlsZSBpbiBhaXJwbGFuZSBtb2RlCi0gICAgICAgICAgICBtQWlycGxhbmVNb2RlT3ZlcndyaWRkZW4gPSAoZW5hYmxlICYmIGlzQWlycGxhbmVNb2RlT24oKSAmJiBpc0FpcnBsYW5lVG9nZ2xlYWJsZSgpKTsKLSAgICAgICAgICAgIHNlbmRFbmFibGVNZXNzYWdlKGVuYWJsZSwgdHJ1ZSwgQmluZGVyLmdldENhbGxpbmdVaWQoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFbmFibGVzL2Rpc2FibGVzIFdpLUZpIHN5bmNocm9ub3VzbHkuCi0gICAgICogQHBhcmFtIGVuYWJsZSB7QGNvZGUgdHJ1ZX0gdG8gdHVybiBXaS1GaSBvbiwge0Bjb2RlIGZhbHNlfSB0byB0dXJuIGl0IG9mZi4KLSAgICAgKiBAcGFyYW0gcGVyc2lzdCB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHNldHRpbmcgc2hvdWxkIGJlIHBlcnNpc3RlZC4KLSAgICAgKiBAcGFyYW0gdWlkIFRoZSBVSUQgb2YgdGhlIHByb2Nlc3MgbWFraW5nIHRoZSByZXF1ZXN0LgotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMgKG9yIGlmIHRoZSBleGlzdGluZyBzdGF0ZQotICAgICAqICAgICAgICAgaXMgdGhlIHNhbWUgYXMgdGhlIHJlcXVlc3RlZCBzdGF0ZSkKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gc2V0V2lmaUVuYWJsZWRCbG9ja2luZyhib29sZWFuIGVuYWJsZSwgYm9vbGVhbiBwZXJzaXN0LCBpbnQgdWlkKSB7Ci0gICAgICAgIGZpbmFsIGludCBldmVudHVhbFdpZmlTdGF0ZSA9IGVuYWJsZSA/IFdJRklfU1RBVEVfRU5BQkxFRCA6IFdJRklfU1RBVEVfRElTQUJMRUQ7Ci0gICAgICAgIGZpbmFsIGludCB3aWZpU3RhdGUgPSBtV2lmaVN0YXRlVHJhY2tlci5nZXRXaWZpU3RhdGUoKTsKLQotICAgICAgICBpZiAod2lmaVN0YXRlID09IGV2ZW50dWFsV2lmaVN0YXRlKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZW5hYmxlICYmIGlzQWlycGxhbmVNb2RlT24oKSAmJiAhbUFpcnBsYW5lTW9kZU92ZXJ3cmlkZGVuKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogTXVsdGlwbGUgY2FsbHMgdG8gdW5yZWdpc3RlclJlY2VpdmVyKCkgY2F1c2UgZXhjZXB0aW9uIGFuZCBhIHN5c3RlbSBjcmFzaC4KLSAgICAgICAgICogVGhpcyBjYW4gaGFwcGVuIGlmIGEgc3VwcGxpY2FudCBpcyBsb3N0IChvciBmaXJtd2FyZSBjcmFzaCBvY2N1cnMpIGFuZCB1c2VyIGluZGljYXRlcwotICAgICAgICAgKiBkaXNhYmxlIHdpZmkgYXQgdGhlIHNhbWUgdGltZS4KLSAgICAgICAgICogQXZvaWQgZG9pbmcgYSBkaXNhYmxlIHdoZW4gdGhlIGN1cnJlbnQgV2lmaSBzdGF0ZSBpcyBVTktOT1dOCi0gICAgICAgICAqIFRPRE86IEhhbmRsZSBkcml2ZXIgbG9hZCBmYWlsIGFuZCBzdXBwbGljYW50IGxvc3QgYXMgc2VwZXJhdGUgc3RhdGVzCi0gICAgICAgICAqLwotICAgICAgICBpZiAoKHdpZmlTdGF0ZSA9PSBXSUZJX1NUQVRFX1VOS05PV04pICYmICFlbmFibGUpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBGYWlsIFdpZmkgaWYgQVAgaXMgZW5hYmxlZAotICAgICAgICAgKiBUT0RPOiBEZXByZWNhdGUgV0lGSV9TVEFURV9VTktOT1dOIGFuZCByZW5hbWUgaXQKLSAgICAgICAgICogV0lGSV9TVEFURV9GQUlMRUQKLSAgICAgICAgICovCi0gICAgICAgIGlmICgobVdpZmlBcFN0YXRlID09IFdJRklfQVBfU1RBVEVfRU5BQkxFRCkgJiYgZW5hYmxlKSB7Ci0gICAgICAgICAgICBzZXRXaWZpRW5hYmxlZFN0YXRlKFdJRklfU1RBVEVfVU5LTk9XTiwgdWlkKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHNldFdpZmlFbmFibGVkU3RhdGUoZW5hYmxlID8gV0lGSV9TVEFURV9FTkFCTElORyA6IFdJRklfU1RBVEVfRElTQUJMSU5HLCB1aWQpOwotCi0gICAgICAgIGlmIChlbmFibGUpIHsKLSAgICAgICAgICAgIGlmICghbVdpZmlTdGF0ZVRyYWNrZXIubG9hZERyaXZlcigpKSB7Ci0gICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgIkZhaWxlZCB0byBsb2FkIFdpLUZpIGRyaXZlci4iKTsKLSAgICAgICAgICAgICAgICBzZXRXaWZpRW5hYmxlZFN0YXRlKFdJRklfU1RBVEVfVU5LTk9XTiwgdWlkKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIW1XaWZpU3RhdGVUcmFja2VyLnN0YXJ0U3VwcGxpY2FudCgpKSB7Ci0gICAgICAgICAgICAgICAgbVdpZmlTdGF0ZVRyYWNrZXIudW5sb2FkRHJpdmVyKCk7Ci0gICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgIkZhaWxlZCB0byBzdGFydCBzdXBwbGljYW50IGRhZW1vbi4iKTsKLSAgICAgICAgICAgICAgICBzZXRXaWZpRW5hYmxlZFN0YXRlKFdJRklfU1RBVEVfVU5LTk9XTiwgdWlkKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJlZ2lzdGVyRm9yQnJvYWRjYXN0cygpOwotICAgICAgICAgICAgbVdpZmlTdGF0ZVRyYWNrZXIuc3RhcnRFdmVudExvb3AoKTsKLQotICAgICAgICB9IGVsc2UgewotCi0gICAgICAgICAgICBtQ29udGV4dC51bnJlZ2lzdGVyUmVjZWl2ZXIobVJlY2VpdmVyKTsKLSAgICAgICAgICAgLy8gUmVtb3ZlIG5vdGlmaWNhdGlvbiAoaXQgd2lsbCBuby1vcCBpZiBpdCBpc24ndCB2aXNpYmxlKQotICAgICAgICAgICAgbVdpZmlTdGF0ZVRyYWNrZXIuc2V0Tm90aWZpY2F0aW9uVmlzaWJsZShmYWxzZSwgMCwgZmFsc2UsIDApOwotCi0gICAgICAgICAgICBib29sZWFuIGZhaWxlZFRvU3RvcFN1cHBsaWNhbnRPclVubG9hZERyaXZlciA9IGZhbHNlOwotCi0gICAgICAgICAgICBpZiAoIW1XaWZpU3RhdGVUcmFja2VyLnN0b3BTdXBwbGljYW50KCkpIHsKLSAgICAgICAgICAgICAgICBTbG9nLmUoVEFHLCAiRmFpbGVkIHRvIHN0b3Agc3VwcGxpY2FudCBkYWVtb24uIik7Ci0gICAgICAgICAgICAgICAgc2V0V2lmaUVuYWJsZWRTdGF0ZShXSUZJX1NUQVRFX1VOS05PV04sIHVpZCk7Ci0gICAgICAgICAgICAgICAgZmFpbGVkVG9TdG9wU3VwcGxpY2FudE9yVW5sb2FkRHJpdmVyID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBSZXNldCBjb25uZWN0aW9ucyBhbmQgZGlzYWJsZSBpbnRlcmZhY2UKLSAgICAgICAgICAgICAqIGJlZm9yZSB3ZSB1bmxvYWQgdGhlIGRyaXZlcgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBtV2lmaVN0YXRlVHJhY2tlci5yZXNldENvbm5lY3Rpb25zKHRydWUpOwotCi0gICAgICAgICAgICBpZiAoIW1XaWZpU3RhdGVUcmFja2VyLnVubG9hZERyaXZlcigpKSB7Ci0gICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgIkZhaWxlZCB0byB1bmxvYWQgV2ktRmkgZHJpdmVyLiIpOwotICAgICAgICAgICAgICAgIGlmICghZmFpbGVkVG9TdG9wU3VwcGxpY2FudE9yVW5sb2FkRHJpdmVyKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldFdpZmlFbmFibGVkU3RhdGUoV0lGSV9TVEFURV9VTktOT1dOLCB1aWQpOwotICAgICAgICAgICAgICAgICAgICBmYWlsZWRUb1N0b3BTdXBwbGljYW50T3JVbmxvYWREcml2ZXIgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGZhaWxlZFRvU3RvcFN1cHBsaWNhbnRPclVubG9hZERyaXZlcikgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIFN1Y2Nlc3MhCi0KLSAgICAgICAgaWYgKHBlcnNpc3QpIHsKLSAgICAgICAgICAgIHBlcnNpc3RXaWZpRW5hYmxlZChlbmFibGUpOwotICAgICAgICB9Ci0gICAgICAgIHNldFdpZmlFbmFibGVkU3RhdGUoZXZlbnR1YWxXaWZpU3RhdGUsIHVpZCk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzZXRXaWZpRW5hYmxlZFN0YXRlKGludCB3aWZpU3RhdGUsIGludCB1aWQpIHsKLSAgICAgICAgZmluYWwgaW50IHByZXZpb3VzV2lmaVN0YXRlID0gbVdpZmlTdGF0ZVRyYWNrZXIuZ2V0V2lmaVN0YXRlKCk7Ci0KLSAgICAgICAgbG9uZyBpZGVudCA9IEJpbmRlci5jbGVhckNhbGxpbmdJZGVudGl0eSgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKHdpZmlTdGF0ZSA9PSBXSUZJX1NUQVRFX0VOQUJMRUQpIHsKLSAgICAgICAgICAgICAgICBtQmF0dGVyeVN0YXRzLm5vdGVXaWZpT24odWlkKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAod2lmaVN0YXRlID09IFdJRklfU1RBVEVfRElTQUJMRUQpIHsKLSAgICAgICAgICAgICAgICBtQmF0dGVyeVN0YXRzLm5vdGVXaWZpT2ZmKHVpZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBCaW5kZXIucmVzdG9yZUNhbGxpbmdJZGVudGl0eShpZGVudCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBVcGRhdGUgc3RhdGUKLSAgICAgICAgbVdpZmlTdGF0ZVRyYWNrZXIuc2V0V2lmaVN0YXRlKHdpZmlTdGF0ZSk7Ci0KLSAgICAgICAgLy8gQnJvYWRjYXN0Ci0gICAgICAgIGZpbmFsIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KFdpZmlNYW5hZ2VyLldJRklfU1RBVEVfQ0hBTkdFRF9BQ1RJT04pOwotICAgICAgICBpbnRlbnQuYWRkRmxhZ3MoSW50ZW50LkZMQUdfUkVDRUlWRVJfUkVHSVNURVJFRF9PTkxZX0JFRk9SRV9CT09UKTsKLSAgICAgICAgaW50ZW50LnB1dEV4dHJhKFdpZmlNYW5hZ2VyLkVYVFJBX1dJRklfU1RBVEUsIHdpZmlTdGF0ZSk7Ci0gICAgICAgIGludGVudC5wdXRFeHRyYShXaWZpTWFuYWdlci5FWFRSQV9QUkVWSU9VU19XSUZJX1NUQVRFLCBwcmV2aW91c1dpZmlTdGF0ZSk7Ci0gICAgICAgIG1Db250ZXh0LnNlbmRTdGlja3lCcm9hZGNhc3QoaW50ZW50KTsKKyAgICAgICAgbVdpZmlTdGF0ZU1hY2hpbmUuc3RhcnRTY2FuKGZvcmNlQWN0aXZlKTsKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgZW5mb3JjZUFjY2Vzc1Blcm1pc3Npb24oKSB7CkBAIC01NjYsNiArMzg2LDQ3IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogc2VlIHtAbGluayBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyI3NldFdpZmlFbmFibGVkKGJvb2xlYW4pfQorICAgICAqIEBwYXJhbSBlbmFibGUge0Bjb2RlIHRydWV9IHRvIGVuYWJsZSwge0Bjb2RlIGZhbHNlfSB0byBkaXNhYmxlLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBlbmFibGUvZGlzYWJsZSBvcGVyYXRpb24gd2FzCisgICAgICogICAgICAgICBzdGFydGVkIG9yIGlzIGFscmVhZHkgaW4gdGhlIHF1ZXVlLgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBzZXRXaWZpRW5hYmxlZChib29sZWFuIGVuYWJsZSkgeworICAgICAgICBlbmZvcmNlQ2hhbmdlUGVybWlzc2lvbigpOworCisgICAgICAgIGlmIChEQkcpIHsKKyAgICAgICAgICAgIFNsb2cuZShUQUcsICJJbnZva2luZyBtV2lmaVN0YXRlTWFjaGluZS5zZXRXaWZpRW5hYmxlZFxuIik7CisgICAgICAgIH0KKworICAgICAgICAvLyBzZXQgYSBmbGFnIGlmIHRoZSB1c2VyIGlzIGVuYWJsaW5nIFdpZmkgd2hpbGUgaW4gYWlycGxhbmUgbW9kZQorICAgICAgICBpZiAoZW5hYmxlICYmIGlzQWlycGxhbmVNb2RlT24oKSAmJiBpc0FpcnBsYW5lVG9nZ2xlYWJsZSgpKSB7CisgICAgICAgICAgICBtQWlycGxhbmVNb2RlT3ZlcndyaWRkZW4uc2V0KHRydWUpOworICAgICAgICB9CisKKyAgICAgICAgbVdpZmlTdGF0ZU1hY2hpbmUuc2V0V2lmaUVuYWJsZWQoZW5hYmxlKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBDYWxsZXIgbWlnaHQgbm90IGhhdmUgV1JJVEVfU0VDVVJFX1NFVFRJTkdTLAorICAgICAgICAgKiBvbmx5IENIQU5HRV9XSUZJX1NUQVRFIGlzIGVuZm9yY2VkCisgICAgICAgICAqLworICAgICAgICBsb25nIGlkZW50ID0gQmluZGVyLmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CisgICAgICAgIHBlcnNpc3RXaWZpRW5hYmxlZChlbmFibGUpOworICAgICAgICBCaW5kZXIucmVzdG9yZUNhbGxpbmdJZGVudGl0eShpZGVudCk7CisKKyAgICAgICAgaWYgKGVuYWJsZSkgeworICAgICAgICAgICAgaWYgKCFtSXNSZWNlaXZlclJlZ2lzdGVyZWQpIHsKKyAgICAgICAgICAgICAgICByZWdpc3RlckZvckJyb2FkY2FzdHMoKTsKKyAgICAgICAgICAgICAgICBtSXNSZWNlaXZlclJlZ2lzdGVyZWQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKG1Jc1JlY2VpdmVyUmVnaXN0ZXJlZCl7CisgICAgICAgICAgICBtQ29udGV4dC51bnJlZ2lzdGVyUmVjZWl2ZXIobVJlY2VpdmVyKTsKKyAgICAgICAgICAgIG1Jc1JlY2VpdmVyUmVnaXN0ZXJlZCA9IGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqCiAgICAgICogc2VlIHtAbGluayBXaWZpTWFuYWdlciNnZXRXaWZpU3RhdGUoKX0KICAgICAgKiBAcmV0dXJuIE9uZSBvZiB7QGxpbmsgV2lmaU1hbmFnZXIjV0lGSV9TVEFURV9ESVNBQkxFRH0sCiAgICAgICogICAgICAgICB7QGxpbmsgV2lmaU1hbmFnZXIjV0lGSV9TVEFURV9ESVNBQkxJTkd9LApAQCAtNTc1LDY2ICs0MzYsNTkgQEAKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldFdpZmlFbmFibGVkU3RhdGUoKSB7CiAgICAgICAgIGVuZm9yY2VBY2Nlc3NQZXJtaXNzaW9uKCk7Ci0gICAgICAgIHJldHVybiBtV2lmaVN0YXRlVHJhY2tlci5nZXRXaWZpU3RhdGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBzZWUge0BsaW5rIGFuZHJvaWQubmV0LndpZmkuV2lmaU1hbmFnZXIjZGlzY29ubmVjdCgpfQotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBkaXNjb25uZWN0KCkgewotICAgICAgICBlbmZvcmNlQ2hhbmdlUGVybWlzc2lvbigpOwotCi0gICAgICAgIHJldHVybiBtV2lmaVN0YXRlVHJhY2tlci5kaXNjb25uZWN0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogc2VlIHtAbGluayBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyI3JlY29ubmVjdCgpfQotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiByZWNvbm5lY3QoKSB7Ci0gICAgICAgIGVuZm9yY2VDaGFuZ2VQZXJtaXNzaW9uKCk7Ci0KLSAgICAgICAgcmV0dXJuIG1XaWZpU3RhdGVUcmFja2VyLnJlY29ubmVjdENvbW1hbmQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBzZWUge0BsaW5rIGFuZHJvaWQubmV0LndpZmkuV2lmaU1hbmFnZXIjcmVhc3NvY2lhdGUoKX0KLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gcmVhc3NvY2lhdGUoKSB7Ci0gICAgICAgIGVuZm9yY2VDaGFuZ2VQZXJtaXNzaW9uKCk7Ci0KLSAgICAgICAgcmV0dXJuIG1XaWZpU3RhdGVUcmFja2VyLnJlYXNzb2NpYXRlKCk7CisgICAgICAgIHJldHVybiBtV2lmaVN0YXRlTWFjaGluZS5zeW5jR2V0V2lmaVN0YXRlKCk7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogc2VlIHtAbGluayBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyI3NldFdpZmlBcEVuYWJsZWQoV2lmaUNvbmZpZ3VyYXRpb24sIGJvb2xlYW4pfQogICAgICAqIEBwYXJhbSB3aWZpQ29uZmlnIFNTSUQsIHNlY3VyaXR5IGFuZCBjaGFubmVsIGRldGFpbHMgYXMKICAgICAgKiAgICAgICAgcGFydCBvZiBXaWZpQ29uZmlndXJhdGlvbgotICAgICAqIEBwYXJhbSBlbmFibGVkLCB0cnVlIHRvIGVuYWJsZSBhbmQgZmFsc2UgdG8gZGlzYWJsZQorICAgICAqIEBwYXJhbSBlbmFibGVkIHRydWUgdG8gZW5hYmxlIGFuZCBmYWxzZSB0byBkaXNhYmxlCiAgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHN0YXJ0IG9wZXJhdGlvbiB3YXMKICAgICAgKiAgICAgICAgIHN0YXJ0ZWQgb3IgaXMgYWxyZWFkeSBpbiB0aGUgcXVldWUuCiAgICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gc2V0V2lmaUFwRW5hYmxlZChXaWZpQ29uZmlndXJhdGlvbiB3aWZpQ29uZmlnLCBib29sZWFuIGVuYWJsZWQpIHsKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gc2V0V2lmaUFwRW5hYmxlZChXaWZpQ29uZmlndXJhdGlvbiB3aWZpQ29uZmlnLCBib29sZWFuIGVuYWJsZWQpIHsKICAgICAgICAgZW5mb3JjZUNoYW5nZVBlcm1pc3Npb24oKTsKLSAgICAgICAgaWYgKG1XaWZpSGFuZGxlciA9PSBudWxsKSByZXR1cm4gZmFsc2U7CiAKLSAgICAgICAgc3luY2hyb25pemVkIChtV2lmaUhhbmRsZXIpIHsKLQorICAgICAgICBpZiAoZW5hYmxlZCkgeworICAgICAgICAgICAgLyogVXNlIGRlZmF1bHQgY29uZmlnIGlmIHRoZXJlIGlzIG5vIGV4aXN0aW5nIGNvbmZpZyAqLworICAgICAgICAgICAgaWYgKHdpZmlDb25maWcgPT0gbnVsbCAmJiAoKHdpZmlDb25maWcgPSBnZXRXaWZpQXBDb25maWd1cmF0aW9uKCkpID09IG51bGwpKSB7CisgICAgICAgICAgICAgICAgd2lmaUNvbmZpZyA9IG5ldyBXaWZpQ29uZmlndXJhdGlvbigpOworICAgICAgICAgICAgICAgIHdpZmlDb25maWcuU1NJRCA9IG1Db250ZXh0LmdldFN0cmluZyhSLnN0cmluZy53aWZpX3RldGhlcl9jb25maWd1cmVfc3NpZF9kZWZhdWx0KTsKKyAgICAgICAgICAgICAgICB3aWZpQ29uZmlnLmFsbG93ZWRLZXlNYW5hZ2VtZW50LnNldChLZXlNZ210Lk5PTkUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIENhbGxlciBtaWdodCBub3QgaGF2ZSBXUklURV9TRUNVUkVfU0VUVElOR1MsCisgICAgICAgICAgICAgKiBvbmx5IENIQU5HRV9XSUZJX1NUQVRFIGlzIGVuZm9yY2VkCisgICAgICAgICAgICAgKi8KICAgICAgICAgICAgIGxvbmcgaWRlbnQgPSBCaW5kZXIuY2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKLSAgICAgICAgICAgIHNXYWtlTG9jay5hY3F1aXJlKCk7CisgICAgICAgICAgICBzZXRXaWZpQXBDb25maWd1cmF0aW9uKHdpZmlDb25maWcpOwogICAgICAgICAgICAgQmluZGVyLnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkoaWRlbnQpOwotCi0gICAgICAgICAgICBtTGFzdEFwRW5hYmxlVWlkID0gQmluZGVyLmdldENhbGxpbmdVaWQoKTsKLSAgICAgICAgICAgIHNlbmRBY2Nlc3NQb2ludE1lc3NhZ2UoZW5hYmxlZCwgd2lmaUNvbmZpZywgQmluZGVyLmdldENhbGxpbmdVaWQoKSk7CiAgICAgICAgIH0KIAorICAgICAgICBtV2lmaVN0YXRlTWFjaGluZS5zZXRXaWZpQXBFbmFibGVkKHdpZmlDb25maWcsIGVuYWJsZWQpOworCiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAotICAgIHB1YmxpYyBXaWZpQ29uZmlndXJhdGlvbiBnZXRXaWZpQXBDb25maWd1cmF0aW9uKCkgeworICAgIC8qKgorICAgICAqIHNlZSB7QGxpbmsgV2lmaU1hbmFnZXIjZ2V0V2lmaUFwU3RhdGUoKX0KKyAgICAgKiBAcmV0dXJuIE9uZSBvZiB7QGxpbmsgV2lmaU1hbmFnZXIjV0lGSV9BUF9TVEFURV9ESVNBQkxFRH0sCisgICAgICogICAgICAgICB7QGxpbmsgV2lmaU1hbmFnZXIjV0lGSV9BUF9TVEFURV9ESVNBQkxJTkd9LAorICAgICAqICAgICAgICAge0BsaW5rIFdpZmlNYW5hZ2VyI1dJRklfQVBfU1RBVEVfRU5BQkxFRH0sCisgICAgICogICAgICAgICB7QGxpbmsgV2lmaU1hbmFnZXIjV0lGSV9BUF9TVEFURV9FTkFCTElOR30sCisgICAgICogICAgICAgICB7QGxpbmsgV2lmaU1hbmFnZXIjV0lGSV9BUF9TVEFURV9GQUlMRUR9CisgICAgICovCisgICAgcHVibGljIGludCBnZXRXaWZpQXBFbmFibGVkU3RhdGUoKSB7CiAgICAgICAgIGVuZm9yY2VBY2Nlc3NQZXJtaXNzaW9uKCk7CisgICAgICAgIHJldHVybiBtV2lmaVN0YXRlTWFjaGluZS5zeW5jR2V0V2lmaUFwU3RhdGUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBzZWUge0BsaW5rIFdpZmlNYW5hZ2VyI2dldFdpZmlBcENvbmZpZ3VyYXRpb24oKX0KKyAgICAgKiBAcmV0dXJuIHNvZnQgYWNjZXNzIHBvaW50IGNvbmZpZ3VyYXRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIFdpZmlDb25maWd1cmF0aW9uIGdldFdpZmlBcENvbmZpZ3VyYXRpb24oKSB7CiAgICAgICAgIGZpbmFsIENvbnRlbnRSZXNvbHZlciBjciA9IG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpOwogICAgICAgICBXaWZpQ29uZmlndXJhdGlvbiB3aWZpQ29uZmlnID0gbmV3IFdpZmlDb25maWd1cmF0aW9uKCk7CiAgICAgICAgIGludCBhdXRoVHlwZTsKQEAgLTY1Miw3ICs1MDYsMTEgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIHNldFdpZmlBcENvbmZpZ3VyYXRpb24oV2lmaUNvbmZpZ3VyYXRpb24gd2lmaUNvbmZpZykgeworICAgIC8qKgorICAgICAqIHNlZSB7QGxpbmsgV2lmaU1hbmFnZXIjc2V0V2lmaUFwQ29uZmlndXJhdGlvbihXaWZpQ29uZmlndXJhdGlvbil9CisgICAgICogQHBhcmFtIHdpZmlDb25maWcgV2lmaUNvbmZpZ3VyYXRpb24gZGV0YWlscyBmb3Igc29mdCBhY2Nlc3MgcG9pbnQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0V2lmaUFwQ29uZmlndXJhdGlvbihXaWZpQ29uZmlndXJhdGlvbiB3aWZpQ29uZmlnKSB7CiAgICAgICAgIGVuZm9yY2VDaGFuZ2VQZXJtaXNzaW9uKCk7CiAgICAgICAgIGZpbmFsIENvbnRlbnRSZXNvbHZlciBjciA9IG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpOwogICAgICAgICBib29sZWFuIGlzV3BhOwpAQCAtNjY4LDE0MyArNTI2LDI3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogRW5hYmxlcy9kaXNhYmxlcyBXaS1GaSBBUCBzeW5jaHJvbm91c2x5LiBUaGUgZHJpdmVyIGlzIGxvYWRlZAotICAgICAqIGFuZCBzb2Z0IGFjY2VzcyBwb2ludCBjb25maWd1cmVkIGFzIGEgc2luZ2xlIG9wZXJhdGlvbi4KLSAgICAgKiBAcGFyYW0gZW5hYmxlIHtAY29kZSB0cnVlfSB0byB0dXJuIFdpLUZpIG9uLCB7QGNvZGUgZmFsc2V9IHRvIHR1cm4gaXQgb2ZmLgotICAgICAqIEBwYXJhbSB1aWQgVGhlIFVJRCBvZiB0aGUgcHJvY2VzcyBtYWtpbmcgdGhlIHJlcXVlc3QuCi0gICAgICogQHBhcmFtIHdpZmlDb25maWcgVGhlIFdpZmlDb25maWd1cmF0aW9uIGZvciBBUAotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMgKG9yIGlmIHRoZSBleGlzdGluZyBzdGF0ZQotICAgICAqICAgICAgICAgaXMgdGhlIHNhbWUgYXMgdGhlIHJlcXVlc3RlZCBzdGF0ZSkKKyAgICAgKiBzZWUge0BsaW5rIGFuZHJvaWQubmV0LndpZmkuV2lmaU1hbmFnZXIjZGlzY29ubmVjdCgpfQogICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBzZXRXaWZpQXBFbmFibGVkQmxvY2tpbmcoYm9vbGVhbiBlbmFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB1aWQsIFdpZmlDb25maWd1cmF0aW9uIHdpZmlDb25maWcpIHsKLSAgICAgICAgZmluYWwgaW50IGV2ZW50dWFsV2lmaUFwU3RhdGUgPSBlbmFibGUgPyBXSUZJX0FQX1NUQVRFX0VOQUJMRUQgOiBXSUZJX0FQX1NUQVRFX0RJU0FCTEVEOwotCi0gICAgICAgIGlmIChtV2lmaUFwU3RhdGUgPT0gZXZlbnR1YWxXaWZpQXBTdGF0ZSkgewotICAgICAgICAgICAgLyogQ29uZmlndXJhdGlvbiBjaGFuZ2VkIG9uIGEgcnVubmluZyBhY2Nlc3MgcG9pbnQgKi8KLSAgICAgICAgICAgIGlmKGVuYWJsZSAmJiAod2lmaUNvbmZpZyAhPSBudWxsKSkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIG53U2VydmljZS5zZXRBY2Nlc3NQb2ludCh3aWZpQ29uZmlnLCBtV2lmaVN0YXRlVHJhY2tlci5nZXRJbnRlcmZhY2VOYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT0ZUQVBfSUZBQ0UpOwotICAgICAgICAgICAgICAgICAgICBzZXRXaWZpQXBDb25maWd1cmF0aW9uKHdpZmlDb25maWcpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIFNsb2cuZShUQUcsICJFeGNlcHRpb24gaW4gbndTZXJ2aWNlIGR1cmluZyBBUCByZXN0YXJ0Iik7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBud1NlcnZpY2Uuc3RvcEFjY2Vzc1BvaW50KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgIkNvdWxkIG5vdCBzdG9wIEFQLCA6IiArIGVlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBzZXRXaWZpQXBFbmFibGVkU3RhdGUoV0lGSV9BUF9TVEFURV9GQUlMRUQsIHVpZCwgRHJpdmVyQWN0aW9uLkRSSVZFUl9VTkxPQUQpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBGYWlsIEFQIGlmIFdpZmkgaXMgZW5hYmxlZAotICAgICAgICAgKi8KLSAgICAgICAgaWYgKChtV2lmaVN0YXRlVHJhY2tlci5nZXRXaWZpU3RhdGUoKSA9PSBXSUZJX1NUQVRFX0VOQUJMRUQpICYmIGVuYWJsZSkgewotICAgICAgICAgICAgc2V0V2lmaUFwRW5hYmxlZFN0YXRlKFdJRklfQVBfU1RBVEVfRkFJTEVELCB1aWQsIERyaXZlckFjdGlvbi5OT19EUklWRVJfVU5MT0FEKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHNldFdpZmlBcEVuYWJsZWRTdGF0ZShlbmFibGUgPyBXSUZJX0FQX1NUQVRFX0VOQUJMSU5HIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJRklfQVBfU1RBVEVfRElTQUJMSU5HLCB1aWQsIERyaXZlckFjdGlvbi5OT19EUklWRVJfVU5MT0FEKTsKLQotICAgICAgICBpZiAoZW5hYmxlKSB7Ci0KLSAgICAgICAgICAgIC8qIFVzZSBkZWZhdWx0IGNvbmZpZyBpZiB0aGVyZSBpcyBubyBleGlzdGluZyBjb25maWcgKi8KLSAgICAgICAgICAgIGlmICh3aWZpQ29uZmlnID09IG51bGwgJiYgKCh3aWZpQ29uZmlnID0gZ2V0V2lmaUFwQ29uZmlndXJhdGlvbigpKSA9PSBudWxsKSkgewotICAgICAgICAgICAgICAgIHdpZmlDb25maWcgPSBuZXcgV2lmaUNvbmZpZ3VyYXRpb24oKTsKLSAgICAgICAgICAgICAgICB3aWZpQ29uZmlnLlNTSUQgPSBtQ29udGV4dC5nZXRTdHJpbmcoUi5zdHJpbmcud2lmaV90ZXRoZXJfY29uZmlndXJlX3NzaWRfZGVmYXVsdCk7Ci0gICAgICAgICAgICAgICAgd2lmaUNvbmZpZy5hbGxvd2VkS2V5TWFuYWdlbWVudC5zZXQoS2V5TWdtdC5OT05FKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCFtV2lmaVN0YXRlVHJhY2tlci5sb2FkRHJpdmVyKCkpIHsKLSAgICAgICAgICAgICAgICBTbG9nLmUoVEFHLCAiRmFpbGVkIHRvIGxvYWQgV2ktRmkgZHJpdmVyIGZvciBBUCBtb2RlIik7Ci0gICAgICAgICAgICAgICAgc2V0V2lmaUFwRW5hYmxlZFN0YXRlKFdJRklfQVBfU1RBVEVfRkFJTEVELCB1aWQsIERyaXZlckFjdGlvbi5OT19EUklWRVJfVU5MT0FEKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbndTZXJ2aWNlLnN0YXJ0QWNjZXNzUG9pbnQod2lmaUNvbmZpZywgbVdpZmlTdGF0ZVRyYWNrZXIuZ2V0SW50ZXJmYWNlTmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPRlRBUF9JRkFDRSk7Ci0gICAgICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgIkV4Y2VwdGlvbiBpbiBzdGFydEFjY2Vzc1BvaW50KCkiKTsKLSAgICAgICAgICAgICAgICBzZXRXaWZpQXBFbmFibGVkU3RhdGUoV0lGSV9BUF9TVEFURV9GQUlMRUQsIHVpZCwgRHJpdmVyQWN0aW9uLkRSSVZFUl9VTkxPQUQpOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc2V0V2lmaUFwQ29uZmlndXJhdGlvbih3aWZpQ29uZmlnKTsKLQotICAgICAgICB9IGVsc2UgewotCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG53U2VydmljZS5zdG9wQWNjZXNzUG9pbnQoKTsKLSAgICAgICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBTbG9nLmUoVEFHLCAiRXhjZXB0aW9uIGluIHN0b3BBY2Nlc3NQb2ludCgpIik7Ci0gICAgICAgICAgICAgICAgc2V0V2lmaUFwRW5hYmxlZFN0YXRlKFdJRklfQVBfU1RBVEVfRkFJTEVELCB1aWQsIERyaXZlckFjdGlvbi5EUklWRVJfVU5MT0FEKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghbVdpZmlTdGF0ZVRyYWNrZXIudW5sb2FkRHJpdmVyKCkpIHsKLSAgICAgICAgICAgICAgICBTbG9nLmUoVEFHLCAiRmFpbGVkIHRvIHVubG9hZCBXaS1GaSBkcml2ZXIgZm9yIEFQIG1vZGUiKTsKLSAgICAgICAgICAgICAgICBzZXRXaWZpQXBFbmFibGVkU3RhdGUoV0lGSV9BUF9TVEFURV9GQUlMRUQsIHVpZCwgRHJpdmVyQWN0aW9uLk5PX0RSSVZFUl9VTkxPQUQpOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHNldFdpZmlBcEVuYWJsZWRTdGF0ZShldmVudHVhbFdpZmlBcFN0YXRlLCB1aWQsIERyaXZlckFjdGlvbi5OT19EUklWRVJfVU5MT0FEKTsKLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgcHVibGljIHZvaWQgZGlzY29ubmVjdCgpIHsKKyAgICAgICAgZW5mb3JjZUNoYW5nZVBlcm1pc3Npb24oKTsKKyAgICAgICAgbVdpZmlTdGF0ZU1hY2hpbmUuZGlzY29ubmVjdENvbW1hbmQoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBzZWUge0BsaW5rIFdpZmlNYW5hZ2VyI2dldFdpZmlBcFN0YXRlKCl9Ci0gICAgICogQHJldHVybiBPbmUgb2Yge0BsaW5rIFdpZmlNYW5hZ2VyI1dJRklfQVBfU1RBVEVfRElTQUJMRUR9LAotICAgICAqICAgICAgICAge0BsaW5rIFdpZmlNYW5hZ2VyI1dJRklfQVBfU1RBVEVfRElTQUJMSU5HfSwKLSAgICAgKiAgICAgICAgIHtAbGluayBXaWZpTWFuYWdlciNXSUZJX0FQX1NUQVRFX0VOQUJMRUR9LAotICAgICAqICAgICAgICAge0BsaW5rIFdpZmlNYW5hZ2VyI1dJRklfQVBfU1RBVEVfRU5BQkxJTkd9LAotICAgICAqICAgICAgICAge0BsaW5rIFdpZmlNYW5hZ2VyI1dJRklfQVBfU1RBVEVfRkFJTEVEfQorICAgICAqIHNlZSB7QGxpbmsgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlciNyZWNvbm5lY3QoKX0KICAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldFdpZmlBcEVuYWJsZWRTdGF0ZSgpIHsKLSAgICAgICAgZW5mb3JjZUFjY2Vzc1Blcm1pc3Npb24oKTsKLSAgICAgICAgcmV0dXJuIG1XaWZpQXBTdGF0ZTsKKyAgICBwdWJsaWMgdm9pZCByZWNvbm5lY3QoKSB7CisgICAgICAgIGVuZm9yY2VDaGFuZ2VQZXJtaXNzaW9uKCk7CisgICAgICAgIG1XaWZpU3RhdGVNYWNoaW5lLnJlY29ubmVjdENvbW1hbmQoKTsKICAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgc2V0V2lmaUFwRW5hYmxlZFN0YXRlKGludCB3aWZpQVBTdGF0ZSwgaW50IHVpZCwgRHJpdmVyQWN0aW9uIGZsYWcpIHsKLSAgICAgICAgZmluYWwgaW50IHByZXZpb3VzV2lmaUFwU3RhdGUgPSBtV2lmaUFwU3RhdGU7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFVubG9hZCB0aGUgZHJpdmVyIGlmIGdvaW5nIHRvIGEgZmFpbGVkIHN0YXRlCi0gICAgICAgICAqLwotICAgICAgICBpZiAoKG1XaWZpQXBTdGF0ZSA9PSBXSUZJX0FQX1NUQVRFX0ZBSUxFRCkgJiYgKGZsYWcgPT0gRHJpdmVyQWN0aW9uLkRSSVZFUl9VTkxPQUQpKSB7Ci0gICAgICAgICAgICBtV2lmaVN0YXRlVHJhY2tlci51bmxvYWREcml2ZXIoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGxvbmcgaWRlbnQgPSBCaW5kZXIuY2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmICh3aWZpQVBTdGF0ZSA9PSBXSUZJX0FQX1NUQVRFX0VOQUJMRUQpIHsKLSAgICAgICAgICAgICAgICBtQmF0dGVyeVN0YXRzLm5vdGVXaWZpT24odWlkKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAod2lmaUFQU3RhdGUgPT0gV0lGSV9BUF9TVEFURV9ESVNBQkxFRCkgewotICAgICAgICAgICAgICAgIG1CYXR0ZXJ5U3RhdHMubm90ZVdpZmlPZmYodWlkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIEJpbmRlci5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KGlkZW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFVwZGF0ZSBzdGF0ZQotICAgICAgICBtV2lmaUFwU3RhdGUgPSB3aWZpQVBTdGF0ZTsKLQotICAgICAgICAvLyBCcm9hZGNhc3QKLSAgICAgICAgZmluYWwgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoV2lmaU1hbmFnZXIuV0lGSV9BUF9TVEFURV9DSEFOR0VEX0FDVElPTik7Ci0gICAgICAgIGludGVudC5hZGRGbGFncyhJbnRlbnQuRkxBR19SRUNFSVZFUl9SRUdJU1RFUkVEX09OTFlfQkVGT1JFX0JPT1QpOwotICAgICAgICBpbnRlbnQucHV0RXh0cmEoV2lmaU1hbmFnZXIuRVhUUkFfV0lGSV9BUF9TVEFURSwgd2lmaUFQU3RhdGUpOwotICAgICAgICBpbnRlbnQucHV0RXh0cmEoV2lmaU1hbmFnZXIuRVhUUkFfUFJFVklPVVNfV0lGSV9BUF9TVEFURSwgcHJldmlvdXNXaWZpQXBTdGF0ZSk7Ci0gICAgICAgIG1Db250ZXh0LnNlbmRTdGlja3lCcm9hZGNhc3QoaW50ZW50KTsKKyAgICAvKioKKyAgICAgKiBzZWUge0BsaW5rIGFuZHJvaWQubmV0LndpZmkuV2lmaU1hbmFnZXIjcmVhc3NvY2lhdGUoKX0KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZWFzc29jaWF0ZSgpIHsKKyAgICAgICAgZW5mb3JjZUNoYW5nZVBlcm1pc3Npb24oKTsKKyAgICAgICAgbVdpZmlTdGF0ZU1hY2hpbmUucmVhc3NvY2lhdGVDb21tYW5kKCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC04MTMsMjE3ICs1NTUsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyBMaXN0PFdpZmlDb25maWd1cmF0aW9uPiBnZXRDb25maWd1cmVkTmV0d29ya3MoKSB7CiAgICAgICAgIGVuZm9yY2VBY2Nlc3NQZXJtaXNzaW9uKCk7Ci0gICAgICAgIFN0cmluZyBsaXN0U3RyOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFdlIGRvbid0IGNhY2hlIHRoZSBsaXN0LCBiZWNhdXNlIHdlIHdhbnQgdG8gYWxsb3cKLSAgICAgICAgICogZm9yIHRoZSBwb3NzaWJpbGl0eSB0aGF0IHRoZSBjb25maWd1cmF0aW9uIGZpbGUKLSAgICAgICAgICogaGFzIGJlZW4gbW9kaWZpZWQgdGhyb3VnaCBzb21lIGV4dGVybmFsIG1lYW5zLAotICAgICAgICAgKiBzdWNoIGFzIHRoZSB3cGFfY2xpIGNvbW1hbmQgbGluZSBwcm9ncmFtLgotICAgICAgICAgKi8KLSAgICAgICAgbGlzdFN0ciA9IG1XaWZpU3RhdGVUcmFja2VyLmxpc3ROZXR3b3JrcygpOwotCi0gICAgICAgIExpc3Q8V2lmaUNvbmZpZ3VyYXRpb24+IG5ldHdvcmtzID0KLSAgICAgICAgICAgIG5ldyBBcnJheUxpc3Q8V2lmaUNvbmZpZ3VyYXRpb24+KCk7Ci0gICAgICAgIGlmIChsaXN0U3RyID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbmV0d29ya3M7Ci0KLSAgICAgICAgU3RyaW5nW10gbGluZXMgPSBsaXN0U3RyLnNwbGl0KCJcbiIpOwotICAgICAgICAvLyBTa2lwIHRoZSBmaXJzdCBsaW5lLCB3aGljaCBpcyBhIGhlYWRlcgotICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgU3RyaW5nW10gcmVzdWx0ID0gbGluZXNbaV0uc3BsaXQoIlx0Iik7Ci0gICAgICAgICAgIC8vIG5ldHdvcmstaWQgfCBzc2lkIHwgYnNzaWQgfCBmbGFncwotICAgICAgICAgICBXaWZpQ29uZmlndXJhdGlvbiBjb25maWcgPSBuZXcgV2lmaUNvbmZpZ3VyYXRpb24oKTsKLSAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgIGNvbmZpZy5uZXR3b3JrSWQgPSBJbnRlZ2VyLnBhcnNlSW50KHJlc3VsdFswXSk7Ci0gICAgICAgICAgIH0gY2F0Y2goTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICB9Ci0gICAgICAgICAgIGlmIChyZXN1bHQubGVuZ3RoID4gMykgewotICAgICAgICAgICAgICAgaWYgKHJlc3VsdFszXS5pbmRleE9mKCJbQ1VSUkVOVF0iKSAhPSAtMSkKLSAgICAgICAgICAgICAgICAgICBjb25maWcuc3RhdHVzID0gV2lmaUNvbmZpZ3VyYXRpb24uU3RhdHVzLkNVUlJFTlQ7Ci0gICAgICAgICAgICAgICBlbHNlIGlmIChyZXN1bHRbM10uaW5kZXhPZigiW0RJU0FCTEVEXSIpICE9IC0xKQotICAgICAgICAgICAgICAgICAgIGNvbmZpZy5zdGF0dXMgPSBXaWZpQ29uZmlndXJhdGlvbi5TdGF0dXMuRElTQUJMRUQ7Ci0gICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgY29uZmlnLnN0YXR1cyA9IFdpZmlDb25maWd1cmF0aW9uLlN0YXR1cy5FTkFCTEVEOwotICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgY29uZmlnLnN0YXR1cyA9IFdpZmlDb25maWd1cmF0aW9uLlN0YXR1cy5FTkFCTEVEOwotICAgICAgICAgICB9Ci0gICAgICAgICAgIHJlYWROZXR3b3JrVmFyaWFibGVzKGNvbmZpZyk7Ci0gICAgICAgICAgIG5ldHdvcmtzLmFkZChjb25maWcpOwotICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbmV0d29ya3M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVhZCB0aGUgdmFyaWFibGVzIGZyb20gdGhlIHN1cHBsaWNhbnQgZGFlbW9uIHRoYXQgYXJlIG5lZWRlZCB0bwotICAgICAqIGZpbGwgaW4gdGhlIFdpZmlDb25maWd1cmF0aW9uIG9iamVjdC4KLSAgICAgKiA8cC8+Ci0gICAgICogVGhlIGNhbGxlciBtdXN0IGhvbGQgdGhlIHN5bmNocm9uaXphdGlvbiBtb25pdG9yLgotICAgICAqIEBwYXJhbSBjb25maWcgdGhlIHtAbGluayBXaWZpQ29uZmlndXJhdGlvbn0gb2JqZWN0IHRvIGJlIGZpbGxlZCBpbi4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcmVhZE5ldHdvcmtWYXJpYWJsZXMoV2lmaUNvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0KLSAgICAgICAgaW50IG5ldElkID0gY29uZmlnLm5ldHdvcmtJZDsKLSAgICAgICAgaWYgKG5ldElkIDwgMCkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICAvKgotICAgICAgICAgKiBUT0RPOiBtYXliZSBzaG91bGQgaGF2ZSBhIG5hdGl2ZSBtZXRob2QgdGhhdCB0YWtlcyBhbiBhcnJheSBvZgotICAgICAgICAgKiB2YXJpYWJsZSBuYW1lcyBhbmQgcmV0dXJucyBhbiBhcnJheSBvZiB2YWx1ZXMuIEJ1dCB3ZSdkIHN0aWxsCi0gICAgICAgICAqIGJlIGRvaW5nIGEgcm91bmQgdHJpcCB0byB0aGUgc3VwcGxpY2FudCBkYWVtb24gZm9yIGVhY2ggdmFyaWFibGUuCi0gICAgICAgICAqLwotICAgICAgICBTdHJpbmcgdmFsdWU7Ci0KLSAgICAgICAgdmFsdWUgPSBtV2lmaVN0YXRlVHJhY2tlci5nZXROZXR3b3JrVmFyaWFibGUobmV0SWQsIFdpZmlDb25maWd1cmF0aW9uLnNzaWRWYXJOYW1lKTsKLSAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eSh2YWx1ZSkpIHsKLSAgICAgICAgICAgIGNvbmZpZy5TU0lEID0gdmFsdWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjb25maWcuU1NJRCA9IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICB2YWx1ZSA9IG1XaWZpU3RhdGVUcmFja2VyLmdldE5ldHdvcmtWYXJpYWJsZShuZXRJZCwgV2lmaUNvbmZpZ3VyYXRpb24uYnNzaWRWYXJOYW1lKTsKLSAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eSh2YWx1ZSkpIHsKLSAgICAgICAgICAgIGNvbmZpZy5CU1NJRCA9IHZhbHVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY29uZmlnLkJTU0lEID0gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHZhbHVlID0gbVdpZmlTdGF0ZVRyYWNrZXIuZ2V0TmV0d29ya1ZhcmlhYmxlKG5ldElkLCBXaWZpQ29uZmlndXJhdGlvbi5wcmlvcml0eVZhck5hbWUpOwotICAgICAgICBjb25maWcucHJpb3JpdHkgPSAtMTsKLSAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eSh2YWx1ZSkpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgY29uZmlnLnByaW9yaXR5ID0gSW50ZWdlci5wYXJzZUludCh2YWx1ZSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gaWdub3JlKSB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB2YWx1ZSA9IG1XaWZpU3RhdGVUcmFja2VyLmdldE5ldHdvcmtWYXJpYWJsZShuZXRJZCwgV2lmaUNvbmZpZ3VyYXRpb24uaGlkZGVuU1NJRFZhck5hbWUpOwotICAgICAgICBjb25maWcuaGlkZGVuU1NJRCA9IGZhbHNlOwotICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHZhbHVlKSkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBjb25maWcuaGlkZGVuU1NJRCA9IEludGVnZXIucGFyc2VJbnQodmFsdWUpICE9IDA7Ci0gICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gaWdub3JlKSB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB2YWx1ZSA9IG1XaWZpU3RhdGVUcmFja2VyLmdldE5ldHdvcmtWYXJpYWJsZShuZXRJZCwgV2lmaUNvbmZpZ3VyYXRpb24ud2VwVHhLZXlJZHhWYXJOYW1lKTsKLSAgICAgICAgY29uZmlnLndlcFR4S2V5SW5kZXggPSAtMTsKLSAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eSh2YWx1ZSkpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgY29uZmlnLndlcFR4S2V5SW5kZXggPSBJbnRlZ2VyLnBhcnNlSW50KHZhbHVlKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBpZ25vcmUpIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIEdldCB1cCB0byA0IFdFUCBrZXlzLiBOb3RlIHRoYXQgdGhlIGFjdHVhbCBrZXlzIGFyZSBub3QgcGFzc2VkIGJhY2ssCi0gICAgICAgICAqIGp1c3QgYSAiKiIgaWYgdGhlIGtleSBpcyBzZXQsIG9yIHRoZSBudWxsIHN0cmluZyBvdGhlcndpc2UuCi0gICAgICAgICAqLwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgewotICAgICAgICAgICAgdmFsdWUgPSBtV2lmaVN0YXRlVHJhY2tlci5nZXROZXR3b3JrVmFyaWFibGUobmV0SWQsIFdpZmlDb25maWd1cmF0aW9uLndlcEtleVZhck5hbWVzW2ldKTsKLSAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkodmFsdWUpKSB7Ci0gICAgICAgICAgICAgICAgY29uZmlnLndlcEtleXNbaV0gPSB2YWx1ZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgY29uZmlnLndlcEtleXNbaV0gPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogR2V0IHRoZSBwcml2YXRlIHNoYXJlZCBrZXkuIE5vdGUgdGhhdCB0aGUgYWN0dWFsIGtleXMgYXJlIG5vdCBwYXNzZWQgYmFjaywKLSAgICAgICAgICoganVzdCBhICIqIiBpZiB0aGUga2V5IGlzIHNldCwgb3IgdGhlIG51bGwgc3RyaW5nIG90aGVyd2lzZS4KLSAgICAgICAgICovCi0gICAgICAgIHZhbHVlID0gbVdpZmlTdGF0ZVRyYWNrZXIuZ2V0TmV0d29ya1ZhcmlhYmxlKG5ldElkLCBXaWZpQ29uZmlndXJhdGlvbi5wc2tWYXJOYW1lKTsKLSAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eSh2YWx1ZSkpIHsKLSAgICAgICAgICAgIGNvbmZpZy5wcmVTaGFyZWRLZXkgPSB2YWx1ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNvbmZpZy5wcmVTaGFyZWRLZXkgPSBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgdmFsdWUgPSBtV2lmaVN0YXRlVHJhY2tlci5nZXROZXR3b3JrVmFyaWFibGUoY29uZmlnLm5ldHdvcmtJZCwKLSAgICAgICAgICAgICAgICBXaWZpQ29uZmlndXJhdGlvbi5Qcm90b2NvbC52YXJOYW1lKTsKLSAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eSh2YWx1ZSkpIHsKLSAgICAgICAgICAgIFN0cmluZyB2YWxzW10gPSB2YWx1ZS5zcGxpdCgiICIpOwotICAgICAgICAgICAgZm9yIChTdHJpbmcgdmFsIDogdmFscykgewotICAgICAgICAgICAgICAgIGludCBpbmRleCA9Ci0gICAgICAgICAgICAgICAgICAgIGxvb2t1cFN0cmluZyh2YWwsIFdpZmlDb25maWd1cmF0aW9uLlByb3RvY29sLnN0cmluZ3MpOwotICAgICAgICAgICAgICAgIGlmICgwIDw9IGluZGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbmZpZy5hbGxvd2VkUHJvdG9jb2xzLnNldChpbmRleCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdmFsdWUgPSBtV2lmaVN0YXRlVHJhY2tlci5nZXROZXR3b3JrVmFyaWFibGUoY29uZmlnLm5ldHdvcmtJZCwKLSAgICAgICAgICAgICAgICBXaWZpQ29uZmlndXJhdGlvbi5LZXlNZ210LnZhck5hbWUpOwotICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHZhbHVlKSkgewotICAgICAgICAgICAgU3RyaW5nIHZhbHNbXSA9IHZhbHVlLnNwbGl0KCIgIik7Ci0gICAgICAgICAgICBmb3IgKFN0cmluZyB2YWwgOiB2YWxzKSB7Ci0gICAgICAgICAgICAgICAgaW50IGluZGV4ID0KLSAgICAgICAgICAgICAgICAgICAgbG9va3VwU3RyaW5nKHZhbCwgV2lmaUNvbmZpZ3VyYXRpb24uS2V5TWdtdC5zdHJpbmdzKTsKLSAgICAgICAgICAgICAgICBpZiAoMCA8PSBpbmRleCkgewotICAgICAgICAgICAgICAgICAgICBjb25maWcuYWxsb3dlZEtleU1hbmFnZW1lbnQuc2V0KGluZGV4KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB2YWx1ZSA9IG1XaWZpU3RhdGVUcmFja2VyLmdldE5ldHdvcmtWYXJpYWJsZShjb25maWcubmV0d29ya0lkLAotICAgICAgICAgICAgICAgIFdpZmlDb25maWd1cmF0aW9uLkF1dGhBbGdvcml0aG0udmFyTmFtZSk7Ci0gICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkodmFsdWUpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgdmFsc1tdID0gdmFsdWUuc3BsaXQoIiAiKTsKLSAgICAgICAgICAgIGZvciAoU3RyaW5nIHZhbCA6IHZhbHMpIHsKLSAgICAgICAgICAgICAgICBpbnQgaW5kZXggPQotICAgICAgICAgICAgICAgICAgICBsb29rdXBTdHJpbmcodmFsLCBXaWZpQ29uZmlndXJhdGlvbi5BdXRoQWxnb3JpdGhtLnN0cmluZ3MpOwotICAgICAgICAgICAgICAgIGlmICgwIDw9IGluZGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbmZpZy5hbGxvd2VkQXV0aEFsZ29yaXRobXMuc2V0KGluZGV4KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB2YWx1ZSA9IG1XaWZpU3RhdGVUcmFja2VyLmdldE5ldHdvcmtWYXJpYWJsZShjb25maWcubmV0d29ya0lkLAotICAgICAgICAgICAgICAgIFdpZmlDb25maWd1cmF0aW9uLlBhaXJ3aXNlQ2lwaGVyLnZhck5hbWUpOwotICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHZhbHVlKSkgewotICAgICAgICAgICAgU3RyaW5nIHZhbHNbXSA9IHZhbHVlLnNwbGl0KCIgIik7Ci0gICAgICAgICAgICBmb3IgKFN0cmluZyB2YWwgOiB2YWxzKSB7Ci0gICAgICAgICAgICAgICAgaW50IGluZGV4ID0KLSAgICAgICAgICAgICAgICAgICAgbG9va3VwU3RyaW5nKHZhbCwgV2lmaUNvbmZpZ3VyYXRpb24uUGFpcndpc2VDaXBoZXIuc3RyaW5ncyk7Ci0gICAgICAgICAgICAgICAgaWYgKDAgPD0gaW5kZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgY29uZmlnLmFsbG93ZWRQYWlyd2lzZUNpcGhlcnMuc2V0KGluZGV4KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB2YWx1ZSA9IG1XaWZpU3RhdGVUcmFja2VyLmdldE5ldHdvcmtWYXJpYWJsZShjb25maWcubmV0d29ya0lkLAotICAgICAgICAgICAgICAgIFdpZmlDb25maWd1cmF0aW9uLkdyb3VwQ2lwaGVyLnZhck5hbWUpOwotICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHZhbHVlKSkgewotICAgICAgICAgICAgU3RyaW5nIHZhbHNbXSA9IHZhbHVlLnNwbGl0KCIgIik7Ci0gICAgICAgICAgICBmb3IgKFN0cmluZyB2YWwgOiB2YWxzKSB7Ci0gICAgICAgICAgICAgICAgaW50IGluZGV4ID0KLSAgICAgICAgICAgICAgICAgICAgbG9va3VwU3RyaW5nKHZhbCwgV2lmaUNvbmZpZ3VyYXRpb24uR3JvdXBDaXBoZXIuc3RyaW5ncyk7Ci0gICAgICAgICAgICAgICAgaWYgKDAgPD0gaW5kZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgY29uZmlnLmFsbG93ZWRHcm91cENpcGhlcnMuc2V0KGluZGV4KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKFdpZmlDb25maWd1cmF0aW9uLkVudGVycHJpc2VGaWVsZCBmaWVsZCA6Ci0gICAgICAgICAgICAgICAgY29uZmlnLmVudGVycHJpc2VGaWVsZHMpIHsKLSAgICAgICAgICAgIHZhbHVlID0gbVdpZmlTdGF0ZVRyYWNrZXIuZ2V0TmV0d29ya1ZhcmlhYmxlKG5ldElkLAotICAgICAgICAgICAgICAgICAgICBmaWVsZC52YXJOYW1lKCkpOwotICAgICAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eSh2YWx1ZSkpIHsKLSAgICAgICAgICAgICAgICBpZiAoZmllbGQgIT0gY29uZmlnLmVhcCkgdmFsdWUgPSByZW1vdmVEb3VibGVRdW90ZXModmFsdWUpOwotICAgICAgICAgICAgICAgIGZpZWxkLnNldFZhbHVlKHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyByZW1vdmVEb3VibGVRdW90ZXMoU3RyaW5nIHN0cmluZykgewotICAgICAgICBpZiAoc3RyaW5nLmxlbmd0aCgpIDw9IDIpIHJldHVybiAiIjsKLSAgICAgICAgcmV0dXJuIHN0cmluZy5zdWJzdHJpbmcoMSwgc3RyaW5nLmxlbmd0aCgpIC0gMSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUb1F1b3RlZFN0cmluZyhTdHJpbmcgc3RyaW5nKSB7Ci0gICAgICAgIHJldHVybiAiXCIiICsgc3RyaW5nICsgIlwiIjsKKyAgICAgICAgcmV0dXJuIG1XaWZpU3RhdGVNYWNoaW5lLnN5bmNHZXRDb25maWd1cmVkTmV0d29ya3MoKTsKICAgICB9CiAKICAgICAvKioKQEAgLTEwMzMsMjgwICs1NjUsMTAgQEAKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGFkZE9yVXBkYXRlTmV0d29yayhXaWZpQ29uZmlndXJhdGlvbiBjb25maWcpIHsKICAgICAgICAgZW5mb3JjZUNoYW5nZVBlcm1pc3Npb24oKTsKLQotICAgICAgICAvKgotICAgICAgICAgKiBJZiB0aGUgc3VwcGxpZWQgbmV0d29ya0lkIGlzIC0xLCB3ZSBjcmVhdGUgYSBuZXcgZW1wdHkKLSAgICAgICAgICogbmV0d29yayBjb25maWd1cmF0aW9uLiBPdGhlcndpc2UsIHRoZSBuZXR3b3JrSWQgc2hvdWxkCi0gICAgICAgICAqIHJlZmVyIHRvIGFuIGV4aXN0aW5nIGNvbmZpZ3VyYXRpb24uCi0gICAgICAgICAqLwotICAgICAgICBpbnQgbmV0SWQgPSBjb25maWcubmV0d29ya0lkOwotICAgICAgICBib29sZWFuIG5ld05ldHdvcmsgPSBuZXRJZCA9PSAtMTsKLSAgICAgICAgYm9vbGVhbiBkb1JlY29uZmlnID0gZmFsc2U7Ci0gICAgICAgIC8vIG5ldHdvcmtJZCBvZiAtMSBtZWFucyB3ZSB3YW50IHRvIGNyZWF0ZSBhIG5ldyBuZXR3b3JrCi0gICAgICAgIHN5bmNocm9uaXplZCAobVdpZmlTdGF0ZVRyYWNrZXIpIHsKLSAgICAgICAgICAgIGlmIChuZXdOZXR3b3JrKSB7Ci0gICAgICAgICAgICAgICAgbmV0SWQgPSBtV2lmaVN0YXRlVHJhY2tlci5hZGROZXR3b3JrKCk7Ci0gICAgICAgICAgICAgICAgaWYgKG5ldElkIDwgMCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAiRmFpbGVkIHRvIGFkZCBhIG5ldHdvcmshIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBkb1JlY29uZmlnID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1OZWVkUmVjb25maWcgPSBtTmVlZFJlY29uZmlnIHx8IGRvUmVjb25maWc7Ci0gICAgICAgIH0KLQotICAgICAgICBzZXRWYXJpYWJsZXM6IHsKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBOb3RlIHRoYXQgaWYgYSBuZXR3b3JrSWQgZm9yIGEgbm9uLWV4aXN0ZW50IG5ldHdvcmsKLSAgICAgICAgICAgICAqIHdhcyBzdXBwbGllZCwgdGhlbiB0aGUgZmlyc3Qgc2V0TmV0d29ya1ZhcmlhYmxlKCkKLSAgICAgICAgICAgICAqIHdpbGwgZmFpbCwgc28gd2UgZG9uJ3QgYm90aGVyIHRvIG1ha2UgYSBzZXBhcmF0ZSBjaGVjawotICAgICAgICAgICAgICogZm9yIHRoZSB2YWxpZGl0eSBvZiB0aGUgSUQgdXAgZnJvbnQuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmIChjb25maWcuU1NJRCAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgICAgICFtV2lmaVN0YXRlVHJhY2tlci5zZXROZXR3b3JrVmFyaWFibGUoCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXRJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlDb25maWd1cmF0aW9uLnNzaWRWYXJOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLlNTSUQpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAiZmFpbGVkIHRvIHNldCBTU0lEOiAiK2NvbmZpZy5TU0lEKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWsgc2V0VmFyaWFibGVzOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoY29uZmlnLkJTU0lEICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICAgICAgIW1XaWZpU3RhdGVUcmFja2VyLnNldE5ldHdvcmtWYXJpYWJsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldElkLAotICAgICAgICAgICAgICAgICAgICAgICAgV2lmaUNvbmZpZ3VyYXRpb24uYnNzaWRWYXJOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLkJTU0lEKSkgewotICAgICAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgImZhaWxlZCB0byBzZXQgQlNTSUQ6ICIrY29uZmlnLkJTU0lEKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWsgc2V0VmFyaWFibGVzOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTdHJpbmcgYWxsb3dlZEtleU1hbmFnZW1lbnRTdHJpbmcgPQotICAgICAgICAgICAgICAgIG1ha2VTdHJpbmcoY29uZmlnLmFsbG93ZWRLZXlNYW5hZ2VtZW50LCBXaWZpQ29uZmlndXJhdGlvbi5LZXlNZ210LnN0cmluZ3MpOwotICAgICAgICAgICAgaWYgKGNvbmZpZy5hbGxvd2VkS2V5TWFuYWdlbWVudC5jYXJkaW5hbGl0eSgpICE9IDAgJiYKLSAgICAgICAgICAgICAgICAgICAgIW1XaWZpU3RhdGVUcmFja2VyLnNldE5ldHdvcmtWYXJpYWJsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldElkLAotICAgICAgICAgICAgICAgICAgICAgICAgV2lmaUNvbmZpZ3VyYXRpb24uS2V5TWdtdC52YXJOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dlZEtleU1hbmFnZW1lbnRTdHJpbmcpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAiZmFpbGVkIHRvIHNldCBrZXlfbWdtdDogIisKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd2VkS2V5TWFuYWdlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrIHNldFZhcmlhYmxlczsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU3RyaW5nIGFsbG93ZWRQcm90b2NvbHNTdHJpbmcgPQotICAgICAgICAgICAgICAgIG1ha2VTdHJpbmcoY29uZmlnLmFsbG93ZWRQcm90b2NvbHMsIFdpZmlDb25maWd1cmF0aW9uLlByb3RvY29sLnN0cmluZ3MpOwotICAgICAgICAgICAgaWYgKGNvbmZpZy5hbGxvd2VkUHJvdG9jb2xzLmNhcmRpbmFsaXR5KCkgIT0gMCAmJgotICAgICAgICAgICAgICAgICAgICAhbVdpZmlTdGF0ZVRyYWNrZXIuc2V0TmV0d29ya1ZhcmlhYmxlKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV0SWQsCi0gICAgICAgICAgICAgICAgICAgICAgICBXaWZpQ29uZmlndXJhdGlvbi5Qcm90b2NvbC52YXJOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dlZFByb3RvY29sc1N0cmluZykpIHsKLSAgICAgICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJmYWlsZWQgdG8gc2V0IHByb3RvOiAiKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93ZWRQcm90b2NvbHNTdHJpbmcpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhayBzZXRWYXJpYWJsZXM7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN0cmluZyBhbGxvd2VkQXV0aEFsZ29yaXRobXNTdHJpbmcgPQotICAgICAgICAgICAgICAgIG1ha2VTdHJpbmcoY29uZmlnLmFsbG93ZWRBdXRoQWxnb3JpdGhtcywgV2lmaUNvbmZpZ3VyYXRpb24uQXV0aEFsZ29yaXRobS5zdHJpbmdzKTsKLSAgICAgICAgICAgIGlmIChjb25maWcuYWxsb3dlZEF1dGhBbGdvcml0aG1zLmNhcmRpbmFsaXR5KCkgIT0gMCAmJgotICAgICAgICAgICAgICAgICAgICAhbVdpZmlTdGF0ZVRyYWNrZXIuc2V0TmV0d29ya1ZhcmlhYmxlKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV0SWQsCi0gICAgICAgICAgICAgICAgICAgICAgICBXaWZpQ29uZmlndXJhdGlvbi5BdXRoQWxnb3JpdGhtLnZhck5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBhbGxvd2VkQXV0aEFsZ29yaXRobXNTdHJpbmcpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAiZmFpbGVkIHRvIHNldCBhdXRoX2FsZzogIisKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd2VkQXV0aEFsZ29yaXRobXNTdHJpbmcpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhayBzZXRWYXJpYWJsZXM7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN0cmluZyBhbGxvd2VkUGFpcndpc2VDaXBoZXJzU3RyaW5nID0KLSAgICAgICAgICAgICAgICBtYWtlU3RyaW5nKGNvbmZpZy5hbGxvd2VkUGFpcndpc2VDaXBoZXJzLCBXaWZpQ29uZmlndXJhdGlvbi5QYWlyd2lzZUNpcGhlci5zdHJpbmdzKTsKLSAgICAgICAgICAgIGlmIChjb25maWcuYWxsb3dlZFBhaXJ3aXNlQ2lwaGVycy5jYXJkaW5hbGl0eSgpICE9IDAgJiYKLSAgICAgICAgICAgICAgICAgICAgIW1XaWZpU3RhdGVUcmFja2VyLnNldE5ldHdvcmtWYXJpYWJsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldElkLAotICAgICAgICAgICAgICAgICAgICAgICAgV2lmaUNvbmZpZ3VyYXRpb24uUGFpcndpc2VDaXBoZXIudmFyTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93ZWRQYWlyd2lzZUNpcGhlcnNTdHJpbmcpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAiZmFpbGVkIHRvIHNldCBwYWlyd2lzZTogIisKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd2VkUGFpcndpc2VDaXBoZXJzU3RyaW5nKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWsgc2V0VmFyaWFibGVzOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTdHJpbmcgYWxsb3dlZEdyb3VwQ2lwaGVyc1N0cmluZyA9Ci0gICAgICAgICAgICAgICAgbWFrZVN0cmluZyhjb25maWcuYWxsb3dlZEdyb3VwQ2lwaGVycywgV2lmaUNvbmZpZ3VyYXRpb24uR3JvdXBDaXBoZXIuc3RyaW5ncyk7Ci0gICAgICAgICAgICBpZiAoY29uZmlnLmFsbG93ZWRHcm91cENpcGhlcnMuY2FyZGluYWxpdHkoKSAhPSAwICYmCi0gICAgICAgICAgICAgICAgICAgICFtV2lmaVN0YXRlVHJhY2tlci5zZXROZXR3b3JrVmFyaWFibGUoCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXRJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlDb25maWd1cmF0aW9uLkdyb3VwQ2lwaGVyLnZhck5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBhbGxvd2VkR3JvdXBDaXBoZXJzU3RyaW5nKSkgewotICAgICAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgImZhaWxlZCB0byBzZXQgZ3JvdXA6ICIrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dlZEdyb3VwQ2lwaGVyc1N0cmluZyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrIHNldFZhcmlhYmxlczsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gUHJldmVudCBjbGllbnQgc2NyZXctdXAgYnkgcGFzc2luZyBpbiBhIFdpZmlDb25maWd1cmF0aW9uIHdlIGdhdmUgaXQKLSAgICAgICAgICAgIC8vIGJ5IHByZXZlbnRpbmcgIioiIGFzIGEga2V5LgotICAgICAgICAgICAgaWYgKGNvbmZpZy5wcmVTaGFyZWRLZXkgIT0gbnVsbCAmJiAhY29uZmlnLnByZVNoYXJlZEtleS5lcXVhbHMoIioiKSAmJgotICAgICAgICAgICAgICAgICAgICAhbVdpZmlTdGF0ZVRyYWNrZXIuc2V0TmV0d29ya1ZhcmlhYmxlKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV0SWQsCi0gICAgICAgICAgICAgICAgICAgICAgICBXaWZpQ29uZmlndXJhdGlvbi5wc2tWYXJOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLnByZVNoYXJlZEtleSkpIHsKLSAgICAgICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJmYWlsZWQgdG8gc2V0IHBzazogIitjb25maWcucHJlU2hhcmVkS2V5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWsgc2V0VmFyaWFibGVzOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBib29sZWFuIGhhc1NldEtleSA9IGZhbHNlOwotICAgICAgICAgICAgaWYgKGNvbmZpZy53ZXBLZXlzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbmZpZy53ZXBLZXlzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFByZXZlbnQgY2xpZW50IHNjcmV3LXVwIGJ5IHBhc3NpbmcgaW4gYSBXaWZpQ29uZmlndXJhdGlvbiB3ZSBnYXZlIGl0Ci0gICAgICAgICAgICAgICAgICAgIC8vIGJ5IHByZXZlbnRpbmcgIioiIGFzIGEga2V5LgotICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnLndlcEtleXNbaV0gIT0gbnVsbCAmJiAhY29uZmlnLndlcEtleXNbaV0uZXF1YWxzKCIqIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbVdpZmlTdGF0ZVRyYWNrZXIuc2V0TmV0d29ya1ZhcmlhYmxlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0SWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWZpQ29uZmlndXJhdGlvbi53ZXBLZXlWYXJOYW1lc1tpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy53ZXBLZXlzW2ldKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmFpbGVkIHRvIHNldCB3ZXBfa2V5IitpKyI6ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy53ZXBLZXlzW2ldKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgc2V0VmFyaWFibGVzOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaGFzU2V0S2V5ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGhhc1NldEtleSkgewotICAgICAgICAgICAgICAgIGlmICghbVdpZmlTdGF0ZVRyYWNrZXIuc2V0TmV0d29ya1ZhcmlhYmxlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldElkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlDb25maWd1cmF0aW9uLndlcFR4S2V5SWR4VmFyTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvU3RyaW5nKGNvbmZpZy53ZXBUeEtleUluZGV4KSkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZhaWxlZCB0byBzZXQgd2VwX3R4X2tleWlkeDogIisKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLndlcFR4S2V5SW5kZXgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrIHNldFZhcmlhYmxlczsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghbVdpZmlTdGF0ZVRyYWNrZXIuc2V0TmV0d29ya1ZhcmlhYmxlKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV0SWQsCi0gICAgICAgICAgICAgICAgICAgICAgICBXaWZpQ29uZmlndXJhdGlvbi5wcmlvcml0eVZhck5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvU3RyaW5nKGNvbmZpZy5wcmlvcml0eSkpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCBjb25maWcuU1NJRCArICI6IGZhaWxlZCB0byBzZXQgcHJpb3JpdHk6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArY29uZmlnLnByaW9yaXR5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWsgc2V0VmFyaWFibGVzOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoY29uZmlnLmhpZGRlblNTSUQgJiYgIW1XaWZpU3RhdGVUcmFja2VyLnNldE5ldHdvcmtWYXJpYWJsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldElkLAotICAgICAgICAgICAgICAgICAgICAgICAgV2lmaUNvbmZpZ3VyYXRpb24uaGlkZGVuU1NJRFZhck5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvU3RyaW5nKGNvbmZpZy5oaWRkZW5TU0lEID8gMSA6IDApKSkgewotICAgICAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgY29uZmlnLlNTSUQgKyAiOiBmYWlsZWQgdG8gc2V0IGhpZGRlblNTSUQ6ICIrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLmhpZGRlblNTSUQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhayBzZXRWYXJpYWJsZXM7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZvciAoV2lmaUNvbmZpZ3VyYXRpb24uRW50ZXJwcmlzZUZpZWxkIGZpZWxkCi0gICAgICAgICAgICAgICAgICAgIDogY29uZmlnLmVudGVycHJpc2VGaWVsZHMpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdmFyTmFtZSA9IGZpZWxkLnZhck5hbWUoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBmaWVsZC52YWx1ZSgpOwotICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZCAhPSBjb25maWcuZWFwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9ICh2YWx1ZS5sZW5ndGgoKSA9PSAwKSA/ICJOVUxMIiA6IGNvbnZlcnRUb1F1b3RlZFN0cmluZyh2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFtV2lmaVN0YXRlVHJhY2tlci5zZXROZXR3b3JrVmFyaWFibGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldElkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCBjb25maWcuU1NJRCArICI6IGZhaWxlZCB0byBzZXQgIiArIHZhck5hbWUgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjogIiArIHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIHNldFZhcmlhYmxlczsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBuZXRJZDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIEZvciBhbiB1cGRhdGUsIGlmIG9uZSBvZiB0aGUgc2V0TmV0d29ya1ZhcmlhYmxlIG9wZXJhdGlvbnMgZmFpbHMsCi0gICAgICAgICAqIHdlIG1pZ2h0IHdhbnQgdG8gcm9sbCBiYWNrIGFsbCB0aGUgY2hhbmdlcyBhbHJlYWR5IG1hZGUuIEJ1dCB0aGUKLSAgICAgICAgICogY2hhbmNlcyBhcmUgdGhhdCBpZiBhbnl0aGluZyBpcyBnb2luZyB0byBnbyB3cm9uZywgaXQnbGwgaGFwcGVuCi0gICAgICAgICAqIHRoZSBmaXJzdCB0aW1lIHdlIHRyeSB0byBzZXQgb25lIG9mIHRoZSB2YXJpYWJsZXMuCi0gICAgICAgICAqLwotICAgICAgICBpZiAobmV3TmV0d29yaykgewotICAgICAgICAgICAgcmVtb3ZlTmV0d29yayhuZXRJZCk7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgU2xvZy5kKFRBRywKLSAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gc2V0IGEgbmV0d29yayB2YXJpYWJsZSwgcmVtb3ZlZCBuZXR3b3JrOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICArIG5ldElkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIHJldHVybiBtV2lmaVN0YXRlTWFjaGluZS5zeW5jQWRkT3JVcGRhdGVOZXR3b3JrKGNvbmZpZyk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIG1ha2VTdHJpbmcoQml0U2V0IHNldCwgU3RyaW5nW10gc3RyaW5ncykgewotICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBpbnQgbmV4dFNldEJpdCA9IC0xOwotCi0gICAgICAgIC8qIE1ha2Ugc3VyZSBhbGwgc2V0IGJpdHMgYXJlIGluIFswLCBzdHJpbmdzLmxlbmd0aCkgdG8gYXZvaWQKLSAgICAgICAgICogZ29pbmcgb3V0IG9mIGJvdW5kcyBvbiBzdHJpbmdzLiAgKFNob3VsZG4ndCBoYXBwZW4sIGJ1dC4uLikgKi8KLSAgICAgICAgc2V0ID0gc2V0LmdldCgwLCBzdHJpbmdzLmxlbmd0aCk7Ci0KLSAgICAgICAgd2hpbGUgKChuZXh0U2V0Qml0ID0gc2V0Lm5leHRTZXRCaXQobmV4dFNldEJpdCArIDEpKSAhPSAtMSkgewotICAgICAgICAgICAgYnVmLmFwcGVuZChzdHJpbmdzW25leHRTZXRCaXRdLnJlcGxhY2UoJ18nLCAnLScpKS5hcHBlbmQoJyAnKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHJlbW92ZSB0cmFpbGluZyBzcGFjZQotICAgICAgICBpZiAoc2V0LmNhcmRpbmFsaXR5KCkgPiAwKSB7Ci0gICAgICAgICAgICBidWYuc2V0TGVuZ3RoKGJ1Zi5sZW5ndGgoKSAtIDEpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGludCBsb29rdXBTdHJpbmcoU3RyaW5nIHN0cmluZywgU3RyaW5nW10gc3RyaW5ncykgewotICAgICAgICBpbnQgc2l6ZSA9IHN0cmluZ3MubGVuZ3RoOwotCi0gICAgICAgIHN0cmluZyA9IHN0cmluZy5yZXBsYWNlKCctJywgJ18nKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKLSAgICAgICAgICAgIGlmIChzdHJpbmcuZXF1YWxzKHN0cmluZ3NbaV0pKQotICAgICAgICAgICAgICAgIHJldHVybiBpOwotCi0gICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgIC8vIGlmIHdlIGV2ZXIgZ2V0IGhlcmUsIHdlIHNob3VsZCBwcm9iYWJseSBhZGQgdGhlCi0gICAgICAgICAgICAvLyB2YWx1ZSB0byBXaWZpQ29uZmlndXJhdGlvbiB0byByZWZsZWN0IHRoYXQgaXQncwotICAgICAgICAgICAgLy8gc3VwcG9ydGVkIGJ5IHRoZSBXUEEgc3VwcGxpY2FudAotICAgICAgICAgICAgU2xvZy53KFRBRywgIkZhaWxlZCB0byBsb29rLXVwIGEgc3RyaW5nOiAiICsgc3RyaW5nKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICAvKioKKyAgICAgLyoqCiAgICAgICogU2VlIHtAbGluayBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyI3JlbW92ZU5ldHdvcmsoaW50KX0KICAgICAgKiBAcGFyYW0gbmV0SWQgdGhlIGludGVnZXIgdGhhdCBpZGVudGlmaWVzIHRoZSBuZXR3b3JrIGNvbmZpZ3VyYXRpb24KICAgICAgKiB0byB0aGUgc3VwcGxpY2FudApAQCAtMTMxNCw4ICs1NzYsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZU5ldHdvcmsoaW50IG5ldElkKSB7CiAgICAgICAgIGVuZm9yY2VDaGFuZ2VQZXJtaXNzaW9uKCk7Ci0KLSAgICAgICAgcmV0dXJuIG1XaWZpU3RhdGVUcmFja2VyLnJlbW92ZU5ldHdvcmsobmV0SWQpOworICAgICAgICByZXR1cm4gbVdpZmlTdGF0ZU1hY2hpbmUuc3luY1JlbW92ZU5ldHdvcmsobmV0SWQpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTMyNywxNCArNTg4LDcgQEAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBlbmFibGVOZXR3b3JrKGludCBuZXRJZCwgYm9vbGVhbiBkaXNhYmxlT3RoZXJzKSB7CiAgICAgICAgIGVuZm9yY2VDaGFuZ2VQZXJtaXNzaW9uKCk7Ci0KLSAgICAgICAgU3RyaW5nIGlmbmFtZSA9IG1XaWZpU3RhdGVUcmFja2VyLmdldEludGVyZmFjZU5hbWUoKTsKLSAgICAgICAgTmV0d29ya1V0aWxzLmVuYWJsZUludGVyZmFjZShpZm5hbWUpOwotICAgICAgICBib29sZWFuIHJlc3VsdCA9IG1XaWZpU3RhdGVUcmFja2VyLmVuYWJsZU5ldHdvcmsobmV0SWQsIGRpc2FibGVPdGhlcnMpOwotICAgICAgICBpZiAoIXJlc3VsdCkgewotICAgICAgICAgICAgTmV0d29ya1V0aWxzLmRpc2FibGVJbnRlcmZhY2UoaWZuYW1lKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICByZXR1cm4gbVdpZmlTdGF0ZU1hY2hpbmUuc3luY0VuYWJsZU5ldHdvcmsobmV0SWQsIGRpc2FibGVPdGhlcnMpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTM0NSw4ICs1OTksNyBAQAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGRpc2FibGVOZXR3b3JrKGludCBuZXRJZCkgewogICAgICAgICBlbmZvcmNlQ2hhbmdlUGVybWlzc2lvbigpOwotCi0gICAgICAgIHJldHVybiBtV2lmaVN0YXRlVHJhY2tlci5kaXNhYmxlTmV0d29yayhuZXRJZCk7CisgICAgICAgIHJldHVybiBtV2lmaVN0YXRlTWFjaGluZS5zeW5jRGlzYWJsZU5ldHdvcmsobmV0SWQpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTM1OSw3ICs2MTIsNyBAQAogICAgICAgICAgKiBNYWtlIHN1cmUgd2UgaGF2ZSB0aGUgbGF0ZXN0IGluZm9ybWF0aW9uLCBieSBzZW5kaW5nCiAgICAgICAgICAqIGEgc3RhdHVzIHJlcXVlc3QgdG8gdGhlIHN1cHBsaWNhbnQuCiAgICAgICAgICAqLwotICAgICAgICByZXR1cm4gbVdpZmlTdGF0ZVRyYWNrZXIucmVxdWVzdENvbm5lY3Rpb25JbmZvKCk7CisgICAgICAgIHJldHVybiBtV2lmaVN0YXRlTWFjaGluZS5zeW5jUmVxdWVzdENvbm5lY3Rpb25JbmZvKCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMzY5LDE4MCArNjIyLDE5IEBACiAgICAgICovCiAgICAgcHVibGljIExpc3Q8U2NhblJlc3VsdD4gZ2V0U2NhblJlc3VsdHMoKSB7CiAgICAgICAgIGVuZm9yY2VBY2Nlc3NQZXJtaXNzaW9uKCk7Ci0gICAgICAgIFN0cmluZyByZXBseTsKLQotICAgICAgICByZXBseSA9IG1XaWZpU3RhdGVUcmFja2VyLnNjYW5SZXN1bHRzKCk7Ci0gICAgICAgIGlmIChyZXBseSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIExpc3Q8U2NhblJlc3VsdD4gc2Nhbkxpc3QgPSBuZXcgQXJyYXlMaXN0PFNjYW5SZXN1bHQ+KCk7Ci0KLSAgICAgICAgaW50IGxpbmVDb3VudCA9IDA7Ci0KLSAgICAgICAgaW50IHJlcGx5TGVuID0gcmVwbHkubGVuZ3RoKCk7Ci0gICAgICAgIC8vIFBhcnNlIHRoZSByZXN1bHQgc3RyaW5nLCBrZWVwaW5nIGluIG1pbmQgdGhhdCB0aGUgbGFzdCBsaW5lIGRvZXMKLSAgICAgICAgLy8gbm90IGVuZCB3aXRoIGEgbmV3bGluZS4KLSAgICAgICAgZm9yIChpbnQgbGluZUJlZyA9IDAsIGxpbmVFbmQgPSAwOyBsaW5lRW5kIDw9IHJlcGx5TGVuOyArK2xpbmVFbmQpIHsKLSAgICAgICAgICAgIGlmIChsaW5lRW5kID09IHJlcGx5TGVuIHx8IHJlcGx5LmNoYXJBdChsaW5lRW5kKSA9PSAnXG4nKSB7Ci0gICAgICAgICAgICAgICAgKytsaW5lQ291bnQ7Ci0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgKiBTa2lwIHRoZSBmaXJzdCBsaW5lLCB3aGljaCBpcyBhIGhlYWRlcgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIGlmIChsaW5lQ291bnQgPT0gMSkgewotICAgICAgICAgICAgICAgICAgICBsaW5lQmVnID0gbGluZUVuZCArIDE7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobGluZUVuZCA+IGxpbmVCZWcpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxpbmUgPSByZXBseS5zdWJzdHJpbmcobGluZUJlZywgbGluZUVuZCk7Ci0gICAgICAgICAgICAgICAgICAgIFNjYW5SZXN1bHQgc2NhblJlc3VsdCA9IHBhcnNlU2NhblJlc3VsdChsaW5lKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNjYW5SZXN1bHQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc2Nhbkxpc3QuYWRkKHNjYW5SZXN1bHQpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKERCRykgewotICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgIm1pc2Zvcm1hdHRlZCBzY2FuIHJlc3VsdCBmb3I6ICIgKyBsaW5lKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBsaW5lQmVnID0gbGluZUVuZCArIDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbVdpZmlTdGF0ZVRyYWNrZXIuc2V0U2NhblJlc3VsdHNMaXN0KHNjYW5MaXN0KTsKLSAgICAgICAgcmV0dXJuIHNjYW5MaXN0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBhcnNlIHRoZSBzY2FuIHJlc3VsdCBsaW5lIHBhc3NlZCB0byB1cyBieSB3cGFfc3VwcGxpY2FudCAoaGVscGVyKS4KLSAgICAgKiBAcGFyYW0gbGluZSB0aGUgbGluZSB0byBwYXJzZQotICAgICAqIEByZXR1cm4gdGhlIHtAbGluayBTY2FuUmVzdWx0fSBvYmplY3QKLSAgICAgKi8KLSAgICBwcml2YXRlIFNjYW5SZXN1bHQgcGFyc2VTY2FuUmVzdWx0KFN0cmluZyBsaW5lKSB7Ci0gICAgICAgIFNjYW5SZXN1bHQgc2NhblJlc3VsdCA9IG51bGw7Ci0gICAgICAgIGlmIChsaW5lICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBDYWNoZSBpbXBsZW1lbnRhdGlvbiAoTGlua2VkSGFzaE1hcCkgaXMgbm90IHN5bmNocm9uaXplZCwgdGh1cywKLSAgICAgICAgICAgICAqIG11c3Qgc3luY2hyb25pemVkIGhlcmUhCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVNjYW5SZXN1bHRDYWNoZSkgewotICAgICAgICAgICAgICAgIFN0cmluZ1tdIHJlc3VsdCA9IHNjYW5SZXN1bHRQYXR0ZXJuLnNwbGl0KGxpbmUpOwotICAgICAgICAgICAgICAgIGlmICgzIDw9IHJlc3VsdC5sZW5ndGggJiYgcmVzdWx0Lmxlbmd0aCA8PSA1KSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBic3NpZCA9IHJlc3VsdFswXTsKLSAgICAgICAgICAgICAgICAgICAgLy8gYnNzaWQgfCBmcmVxdWVuY3kgfCBsZXZlbCB8IGZsYWdzIHwgc3NpZAotICAgICAgICAgICAgICAgICAgICBpbnQgZnJlcXVlbmN5OwotICAgICAgICAgICAgICAgICAgICBpbnQgbGV2ZWw7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcmVxdWVuY3kgPSBJbnRlZ2VyLnBhcnNlSW50KHJlc3VsdFsxXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCA9IEludGVnZXIucGFyc2VJbnQocmVzdWx0WzJdKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNvbWUgaW1wbGVtZW50YXRpb25zIGF2b2lkIG5lZ2F0aXZlIHZhbHVlcyBieSBhZGRpbmcgMjU2Ci0gICAgICAgICAgICAgICAgICAgICAgICAgKiBzbyB3ZSBuZWVkIHRvIGFkanVzdCBmb3IgdGhhdCBoZXJlLgotICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobGV2ZWwgPiAwKSBsZXZlbCAtPSAyNTY7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcmVxdWVuY3kgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwgPSAwOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgICAgICogVGhlIGZvcm1hdHRpbmcgb2YgdGhlIHJlc3VsdHMgcmV0dXJuZWQgYnkKLSAgICAgICAgICAgICAgICAgICAgICogd3BhX3N1cHBsaWNhbnQgaXMgaW50ZW5kZWQgdG8gbWFrZSB0aGUgZmllbGRzCi0gICAgICAgICAgICAgICAgICAgICAqIGxpbmUgdXAgbmljZWx5IHdoZW4gcHJpbnRlZCwKLSAgICAgICAgICAgICAgICAgICAgICogbm90IHRvIG1ha2UgdGhlbSBlYXN5IHRvIHBhcnNlLiBTbyB3ZSBoYXZlIHRvCi0gICAgICAgICAgICAgICAgICAgICAqIGFwcGx5IHNvbWUgaGV1cmlzdGljcyB0byBmaWd1cmUgb3V0IHdoaWNoIGZpZWxkCi0gICAgICAgICAgICAgICAgICAgICAqIGlzIHRoZSBTU0lEIGFuZCB3aGljaCBmaWVsZCBpcyB0aGUgZmxhZ3MuCi0gICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc3NpZDsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGZsYWdzOwotICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aCA9PSA0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0WzNdLmNoYXJBdCgwKSA9PSAnWycpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyA9IHJlc3VsdFszXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc2lkID0gIiI7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzID0gIiI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3NpZCA9IHJlc3VsdFszXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXN1bHQubGVuZ3RoID09IDUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzID0gcmVzdWx0WzNdOwotICAgICAgICAgICAgICAgICAgICAgICAgc3NpZCA9IHJlc3VsdFs0XTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhlcmUsIHdlIG11c3QgaGF2ZSAzIGZpZWxkczogbm8gZmxhZ3MgYW5kIHNzaWQKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldAotICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MgPSAiIjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNzaWQgPSAiIjsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8vIGJzc2lkICsgc3NpZCBpcyB0aGUgaGFzaCBrZXkKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGtleSA9IGJzc2lkICsgc3NpZDsKLSAgICAgICAgICAgICAgICAgICAgc2NhblJlc3VsdCA9IG1TY2FuUmVzdWx0Q2FjaGUuZ2V0KGtleSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzY2FuUmVzdWx0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5SZXN1bHQubGV2ZWwgPSBsZXZlbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5SZXN1bHQuU1NJRCA9IHNzaWQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzY2FuUmVzdWx0LmNhcGFiaWxpdGllcyA9IGZsYWdzOwotICAgICAgICAgICAgICAgICAgICAgICAgc2NhblJlc3VsdC5mcmVxdWVuY3kgPSBmcmVxdWVuY3k7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBEbyBub3QgYWRkIHNjYW4gcmVzdWx0cyB0aGF0IGhhdmUgbm8gU1NJRCBzZXQKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgwIDwgc3NpZC50cmltKCkubGVuZ3RoKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FuUmVzdWx0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFNjYW5SZXN1bHQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc2lkLCBic3NpZCwgZmxhZ3MsIGxldmVsLCBmcmVxdWVuY3kpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TY2FuUmVzdWx0Q2FjaGUucHV0KGtleSwgc2NhblJlc3VsdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBTbG9nLncoVEFHLCAiTWlzZm9ybWF0dGVkIHNjYW4gcmVzdWx0IHRleHQgd2l0aCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0Lmxlbmd0aCArICIgZmllbGRzOiAiICsgbGluZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHNjYW5SZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUGFyc2UgdGhlICJmbGFncyIgZmllbGQgcGFzc2VkIGJhY2sgaW4gYSBzY2FuIHJlc3VsdCBieSB3cGFfc3VwcGxpY2FudCwKLSAgICAgKiBhbmQgY29uc3RydWN0IGEge0Bjb2RlIFdpZmlDb25maWd1cmF0aW9ufSB0aGF0IGRlc2NyaWJlcyB0aGUgZW5jcnlwdGlvbiwKLSAgICAgKiBrZXkgbWFuYWdlbWVudCwgYW5kIGF1dGhlbnRpY2Fpb24gY2FwYWJpbGl0aWVzIG9mIHRoZSBhY2Nlc3MgcG9pbnQuCi0gICAgICogQHBhcmFtIGZsYWdzIHRoZSBzdHJpbmcgcmV0dXJuZWQgYnkgd3BhX3N1cHBsaWNhbnQKLSAgICAgKiBAcmV0dXJuIHRoZSB7QGxpbmsgV2lmaUNvbmZpZ3VyYXRpb259IG9iamVjdCwgZmlsbGVkIGluCi0gICAgICovCi0gICAgV2lmaUNvbmZpZ3VyYXRpb24gcGFyc2VTY2FuRmxhZ3MoU3RyaW5nIGZsYWdzKSB7Ci0gICAgICAgIFdpZmlDb25maWd1cmF0aW9uIGNvbmZpZyA9IG5ldyBXaWZpQ29uZmlndXJhdGlvbigpOwotCi0gICAgICAgIGlmIChmbGFncy5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICBjb25maWcuYWxsb3dlZEtleU1hbmFnZW1lbnQuc2V0KFdpZmlDb25maWd1cmF0aW9uLktleU1nbXQuTk9ORSk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gLi4uIHRvIGJlIGltcGxlbWVudGVkCi0gICAgICAgIHJldHVybiBjb25maWc7CisgICAgICAgIHJldHVybiBtV2lmaVN0YXRlTWFjaGluZS5zeW5jR2V0U2NhblJlc3VsdHNMaXN0KCk7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogVGVsbCB0aGUgc3VwcGxpY2FudCB0byBwZXJzaXN0IHRoZSBjdXJyZW50IGxpc3Qgb2YgY29uZmlndXJlZCBuZXR3b3Jrcy4KICAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRlZAorICAgICAqCisgICAgICogVE9ETzogZGVwcmVjYXRlIHRoaXMKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBzYXZlQ29uZmlndXJhdGlvbigpIHsKLSAgICAgICAgYm9vbGVhbiByZXN1bHQ7CisgICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKICAgICAgICAgZW5mb3JjZUNoYW5nZVBlcm1pc3Npb24oKTsKLQotICAgICAgICBzeW5jaHJvbml6ZWQgKG1XaWZpU3RhdGVUcmFja2VyKSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBtV2lmaVN0YXRlVHJhY2tlci5zYXZlQ29uZmlnKCk7Ci0gICAgICAgICAgICBpZiAocmVzdWx0ICYmIG1OZWVkUmVjb25maWcpIHsKLSAgICAgICAgICAgICAgICBtTmVlZFJlY29uZmlnID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gbVdpZmlTdGF0ZVRyYWNrZXIucmVsb2FkQ29uZmlnKCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0KSB7Ci0gICAgICAgICAgICAgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KFdpZmlNYW5hZ2VyLk5FVFdPUktfSURTX0NIQU5HRURfQUNUSU9OKTsKLSAgICAgICAgICAgICAgICAgICAgbUNvbnRleHQuc2VuZEJyb2FkY2FzdChpbnRlbnQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyBJbmZvcm0gdGhlIGJhY2t1cCBtYW5hZ2VyIGFib3V0IGEgZGF0YSBjaGFuZ2UKLSAgICAgICAgSUJhY2t1cE1hbmFnZXIgaWJtID0gSUJhY2t1cE1hbmFnZXIuU3R1Yi5hc0ludGVyZmFjZSgKLSAgICAgICAgICAgICAgICBTZXJ2aWNlTWFuYWdlci5nZXRTZXJ2aWNlKENvbnRleHQuQkFDS1VQX1NFUlZJQ0UpKTsKLSAgICAgICAgaWYgKGlibSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGlibS5kYXRhQ2hhbmdlZCgiY29tLmFuZHJvaWQucHJvdmlkZXJzLnNldHRpbmdzIik7Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIFRyeSBhZ2FpbiBsYXRlcgotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIHJldHVybiBtV2lmaVN0YXRlTWFjaGluZS5zeW5jU2F2ZUNvbmZpZygpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTU1Nyw3ICs2NDksNyBAQAogICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLCBlLmcuLAogICAgICAqIHtAY29kZSBudW1DaGFubmVsc30gaXMgb3V0c2lkZSB0aGUgdmFsaWQgcmFuZ2UuCiAgICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gc2V0TnVtQWxsb3dlZENoYW5uZWxzKGludCBudW1DaGFubmVscywgYm9vbGVhbiBwZXJzaXN0KSB7CisgICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHNldE51bUFsbG93ZWRDaGFubmVscyhpbnQgbnVtQ2hhbm5lbHMsIGJvb2xlYW4gcGVyc2lzdCkgewogICAgICAgICBTbG9nLmkoVEFHLCAiV2lmaVNlcnZpY2UgdHJ5aW5nIHRvIHNldE51bUFsbG93ZWQgdG8gIitudW1DaGFubmVscysKICAgICAgICAgICAgICAgICAiIHdpdGggcGVyc2lzdCBzZXQgdG8gIitwZXJzaXN0KTsKICAgICAgICAgZW5mb3JjZUNoYW5nZVBlcm1pc3Npb24oKTsKQEAgLTE1NzksMjggKzY3MSwxNSBAQAogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKG1XaWZpSGFuZGxlciA9PSBudWxsKSByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgTWVzc2FnZS5vYnRhaW4obVdpZmlIYW5kbGVyLAotICAgICAgICAgICAgICAgIE1FU1NBR0VfU0VUX0NIQU5ORUxTLCBudW1DaGFubmVscywgKHBlcnNpc3QgPyAxIDogMCkpLnNlbmRUb1RhcmdldCgpOwotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHNldHMgdGhlIG51bWJlciBvZiBhbGxvd2VkIHJhZGlvIGZyZXF1ZW5jeSBjaGFubmVscyBzeW5jaHJvbm91c2x5Ci0gICAgICogQHBhcmFtIG51bUNoYW5uZWxzIHRoZSBudW1iZXIgb2YgYWxsb3dlZCBjaGFubmVscy4gTXVzdCBiZSBncmVhdGVyIHRoYW4gMAotICAgICAqIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gMTYuCi0gICAgICogQHBhcmFtIHBlcnNpc3Qge0Bjb2RlIHRydWV9IGlmIHRoZSBzZXR0aW5nIHNob3VsZCBiZSByZW1lbWJlcmVkLgotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIHNldE51bUFsbG93ZWRDaGFubmVsc0Jsb2NraW5nKGludCBudW1DaGFubmVscywgYm9vbGVhbiBwZXJzaXN0KSB7CiAgICAgICAgIGlmIChwZXJzaXN0KSB7CiAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUucHV0SW50KG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLAogICAgICAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuV0lGSV9OVU1fQUxMT1dFRF9DSEFOTkVMUywKICAgICAgICAgICAgICAgICAgICAgbnVtQ2hhbm5lbHMpOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtV2lmaVN0YXRlVHJhY2tlci5zZXROdW1BbGxvd2VkQ2hhbm5lbHMobnVtQ2hhbm5lbHMpOworCisgICAgICAgIG1XaWZpU3RhdGVNYWNoaW5lLnNldE51bUFsbG93ZWRDaGFubmVscyhudW1DaGFubmVscyk7CisKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xNjE4LDcgKzY5Nyw3IEBACiAgICAgICAgICAqIFdpLUZpIGlzIG5vdCBjdXJyZW50bHkgZW5hYmxlZCksIGdldCB0aGUgdmFsdWUgZnJvbQogICAgICAgICAgKiBTZXR0aW5ncy4KICAgICAgICAgICovCi0gICAgICAgIG51bUNoYW5uZWxzID0gbVdpZmlTdGF0ZVRyYWNrZXIuZ2V0TnVtQWxsb3dlZENoYW5uZWxzKCk7CisgICAgICAgIG51bUNoYW5uZWxzID0gbVdpZmlTdGF0ZU1hY2hpbmUuZ2V0TnVtQWxsb3dlZENoYW5uZWxzKCk7CiAgICAgICAgIGlmIChudW1DaGFubmVscyA8IDApIHsKICAgICAgICAgICAgIG51bUNoYW5uZWxzID0gU2V0dGluZ3MuU2VjdXJlLmdldEludChtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwKICAgICAgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLldJRklfTlVNX0FMTE9XRURfQ0hBTk5FTFMsCkBAIC0xNjQ0LDcgKzcyMyw3NiBAQAogICAgICAqLwogICAgIHB1YmxpYyBEaGNwSW5mbyBnZXREaGNwSW5mbygpIHsKICAgICAgICAgZW5mb3JjZUFjY2Vzc1Blcm1pc3Npb24oKTsKLSAgICAgICAgcmV0dXJuIG1XaWZpU3RhdGVUcmFja2VyLmdldERoY3BJbmZvKCk7CisgICAgICAgIHJldHVybiBtV2lmaVN0YXRlTWFjaGluZS5zeW5jR2V0RGhjcEluZm8oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBzZWUge0BsaW5rIGFuZHJvaWQubmV0LndpZmkuV2lmaU1hbmFnZXIjc3RhcnRXaWZpfQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RhcnRXaWZpKCkgeworICAgICAgICBlbmZvcmNlQ2hhbmdlUGVybWlzc2lvbigpOworICAgICAgICAvKiBUT0RPOiBtYXkgYmUgYWRkIHBlcm1pc3Npb25zIGZvciBhY2Nlc3Mgb25seSB0byBjb25uZWN0aXZpdHkgc2VydmljZQorICAgICAgICAgKiBUT0RPOiBpZiBhIHN0YXJ0IGlzc3VlZCwga2VlcCB3aWZpIGFsaXZlIHVudGlsIGEgc3RvcCBpc3N1ZWQgaXJyZXNwZWN0aXZlCisgICAgICAgICAqIG9mIFdpZmlMb2NrICYgZGV2aWNlIGlkbGUgc3RhdHVzIHVubGVzcyB3aWZpIGVuYWJsZWQgc3RhdHVzIGlzIHRvZ2dsZWQKKyAgICAgICAgICovCisKKyAgICAgICAgbVdpZmlTdGF0ZU1hY2hpbmUuc2V0RHJpdmVyU3RhcnQodHJ1ZSk7CisgICAgICAgIG1XaWZpU3RhdGVNYWNoaW5lLnJlY29ubmVjdENvbW1hbmQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBzZWUge0BsaW5rIGFuZHJvaWQubmV0LndpZmkuV2lmaU1hbmFnZXIjc3RvcFdpZml9CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdG9wV2lmaSgpIHsKKyAgICAgICAgZW5mb3JjZUNoYW5nZVBlcm1pc3Npb24oKTsKKyAgICAgICAgLyogVE9ETzogbWF5IGJlIGFkZCBwZXJtaXNzaW9ucyBmb3IgYWNjZXNzIG9ubHkgdG8gY29ubmVjdGl2aXR5IHNlcnZpY2UKKyAgICAgICAgICogVE9ETzogaWYgYSBzdG9wIGlzIGlzc3VlZCwgd2lmaSBpcyBicm91Z2h0IHVwIG9ubHkgYnkgc3RhcnRXaWZpCisgICAgICAgICAqIHVubGVzcyB3aWZpIGVuYWJsZWQgc3RhdHVzIGlzIHRvZ2dsZWQKKyAgICAgICAgICovCisgICAgICAgIG1XaWZpU3RhdGVNYWNoaW5lLnNldERyaXZlclN0YXJ0KGZhbHNlKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIHNlZSB7QGxpbmsgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlciNhZGRUb0JsYWNrbGlzdH0KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFRvQmxhY2tsaXN0KFN0cmluZyBic3NpZCkgeworICAgICAgICBlbmZvcmNlQ2hhbmdlUGVybWlzc2lvbigpOworCisgICAgICAgIG1XaWZpU3RhdGVNYWNoaW5lLmFkZFRvQmxhY2tsaXN0KGJzc2lkKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBzZWUge0BsaW5rIGFuZHJvaWQubmV0LndpZmkuV2lmaU1hbmFnZXIjY2xlYXJCbGFja2xpc3R9CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjbGVhckJsYWNrbGlzdCgpIHsKKyAgICAgICAgZW5mb3JjZUNoYW5nZVBlcm1pc3Npb24oKTsKKworICAgICAgICBtV2lmaVN0YXRlTWFjaGluZS5jbGVhckJsYWNrbGlzdCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNvbm5lY3ROZXR3b3JrV2l0aElkKGludCBuZXR3b3JrSWQpIHsKKyAgICAgICAgZW5mb3JjZUNoYW5nZVBlcm1pc3Npb24oKTsKKyAgICAgICAgbVdpZmlTdGF0ZU1hY2hpbmUuY29ubmVjdE5ldHdvcmsobmV0d29ya0lkKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjb25uZWN0TmV0d29ya1dpdGhDb25maWcoV2lmaUNvbmZpZ3VyYXRpb24gY29uZmlnKSB7CisgICAgICAgIGVuZm9yY2VDaGFuZ2VQZXJtaXNzaW9uKCk7CisgICAgICAgIG1XaWZpU3RhdGVNYWNoaW5lLmNvbm5lY3ROZXR3b3JrKGNvbmZpZyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2F2ZU5ldHdvcmsoV2lmaUNvbmZpZ3VyYXRpb24gY29uZmlnKSB7CisgICAgICAgIGVuZm9yY2VDaGFuZ2VQZXJtaXNzaW9uKCk7CisgICAgICAgIG1XaWZpU3RhdGVNYWNoaW5lLnNhdmVOZXR3b3JrKGNvbmZpZyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZm9yZ2V0TmV0d29yayhpbnQgbmV0SWQpIHsKKyAgICAgICAgZW5mb3JjZUNoYW5nZVBlcm1pc3Npb24oKTsKKyAgICAgICAgbVdpZmlTdGF0ZU1hY2hpbmUuZm9yZ2V0TmV0d29yayhuZXRJZCk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBmaW5hbCBCcm9hZGNhc3RSZWNlaXZlciBtUmVjZWl2ZXIgPSBuZXcgQnJvYWRjYXN0UmVjZWl2ZXIoKSB7CkBAIC0xNjYzLDE3ICs4MTEsMTEgQEAKICAgICAgICAgICAgICAgICBtQWxhcm1NYW5hZ2VyLmNhbmNlbChtSWRsZUludGVudCk7CiAgICAgICAgICAgICAgICAgbURldmljZUlkbGUgPSBmYWxzZTsKICAgICAgICAgICAgICAgICBtU2NyZWVuT2ZmID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgbVdpZmlTdGF0ZVRyYWNrZXIuZW5hYmxlUnNzaVBvbGxpbmcodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgLyogREhDUCBvciBvdGhlciB0ZW1wb3JhcnkgZmFpbHVyZXMgaW4gdGhlIHBhc3QgY2FuIHByZXZlbnQKLSAgICAgICAgICAgICAgICAgKiBhIGRpc2FibGVkIG5ldHdvcmsgZnJvbSBiZWluZyBjb25uZWN0ZWQgdG8sIGVuYWJsZSBvbiBzY3JlZW4gb24KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBpZiAobVdpZmlTdGF0ZVRyYWNrZXIuaXNBbnlOZXR3b3JrRGlzYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBzZW5kRW5hYmxlTmV0d29ya3NNZXNzYWdlKCk7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1XaWZpU3RhdGVNYWNoaW5lLmVuYWJsZVJzc2lQb2xsaW5nKHRydWUpOwogICAgICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24uZXF1YWxzKEludGVudC5BQ1RJT05fU0NSRUVOX09GRikpIHsKICAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAiQUNUSU9OX1NDUkVFTl9PRkYiKTsKICAgICAgICAgICAgICAgICBtU2NyZWVuT2ZmID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBtV2lmaVN0YXRlVHJhY2tlci5lbmFibGVSc3NpUG9sbGluZyhmYWxzZSk7CisgICAgICAgICAgICAgICAgbVdpZmlTdGF0ZU1hY2hpbmUuZW5hYmxlUnNzaVBvbGxpbmcoZmFsc2UpOwogICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgICogU2V0IGEgdGltZXIgdG8gcHV0IFdpLUZpIHRvIHNsZWVwLCBidXQgb25seSBpZiB0aGUgc2NyZWVuIGlzIG9mZgogICAgICAgICAgICAgICAgICAqIEFORCB0aGUgInN0YXkgb24gd2hpbGUgcGx1Z2dlZCBpbiIgc2V0dGluZyBkb2Vzbid0IG1hdGNoIHRoZQpAQCAtMTY4MSwxMSArODIzLDExIEBACiAgICAgICAgICAgICAgICAgICogb3IgcGx1Z2dlZCBpbiB0byBBQykuCiAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgaWYgKCFzaG91bGRXaWZpU3RheUF3YWtlKHN0YXlBd2FrZUNvbmRpdGlvbnMsIG1QbHVnZ2VkVHlwZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgV2lmaUluZm8gaW5mbyA9IG1XaWZpU3RhdGVUcmFja2VyLnJlcXVlc3RDb25uZWN0aW9uSW5mbygpOworICAgICAgICAgICAgICAgICAgICBXaWZpSW5mbyBpbmZvID0gbVdpZmlTdGF0ZU1hY2hpbmUuc3luY1JlcXVlc3RDb25uZWN0aW9uSW5mbygpOwogICAgICAgICAgICAgICAgICAgICBpZiAoaW5mby5nZXRTdXBwbGljYW50U3RhdGUoKSAhPSBTdXBwbGljYW50U3RhdGUuQ09NUExFVEVEKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSB1c2VkIHRvIGdvIHRvIHNsZWVwIGltbWVkaWF0ZWx5LCBidXQgdGhpcyBjYXVzZWQgc29tZSByYWNlIGNvbmRpdGlvbnMKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGRvbid0IGhhdmUgdGltZSB0byB0cmFjayBkb3duIGZvciB0aGlzIHJlbGVhc2UuICBEZWxheSBpbnN0ZWFkLCBidXQgbm90Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBhcyBsb25nIGFzIHdlIHdvdWxkIGlmIGNvbm5lY3RlZCAoYmVsb3cpCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBkb24ndCBoYXZlIHRpbWUgdG8gdHJhY2sgZG93biBmb3IgdGhpcyByZWxlYXNlLiAgRGVsYXkgaW5zdGVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ1dCBub3QgYXMgbG9uZyBhcyB3ZSB3b3VsZCBpZiBjb25uZWN0ZWQgKGJlbG93KQogICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyAtIGZpeCB0aGUgcmFjZSBjb25kaXRpb25zIGFuZCBzd2l0Y2ggYmFjayB0byB0aGUgaW1tZWRpYXRlIHR1cm4tb2ZmCiAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIHRyaWdnZXJUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyAoMio2MCoxMDAwKTsgLy8gMiBtaW4KICAgICAgICAgICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJzZXR0aW5nIEFDVElPTl9ERVZJQ0VfSURMRSB0aW1lciBmb3IgMTIwLDAwMCBtcyIpOwpAQCAtMTczMiw3ICs4NzQsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgaXNCbHVldG9vdGhQbGF5aW5nID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtV2lmaVN0YXRlVHJhY2tlci5zZXRCbHVldG9vdGhTY2FuTW9kZShpc0JsdWV0b290aFBsYXlpbmcpOworICAgICAgICAgICAgICAgIG1XaWZpU3RhdGVNYWNoaW5lLnNldEJsdWV0b290aFNjYW5Nb2RlKGlzQmx1ZXRvb3RoUGxheWluZyk7CiAKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuOwpAQCAtMTc4NCw4NSArOTI2LDM2IEBACiAgICAgICAgIH0KICAgICB9OwogCi0gICAgcHJpdmF0ZSB2b2lkIHNlbmRFbmFibGVNZXNzYWdlKGJvb2xlYW4gZW5hYmxlLCBib29sZWFuIHBlcnNpc3QsIGludCB1aWQpIHsKLSAgICAgICAgTWVzc2FnZSBtc2cgPSBNZXNzYWdlLm9idGFpbihtV2lmaUhhbmRsZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVuYWJsZSA/IE1FU1NBR0VfRU5BQkxFX1dJRkkgOiBNRVNTQUdFX0RJU0FCTEVfV0lGSSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBlcnNpc3QgPyAxIDogMCksIHVpZCk7Ci0gICAgICAgIG1zZy5zZW5kVG9UYXJnZXQoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2VuZFN0YXJ0TWVzc2FnZShpbnQgbG9ja01vZGUpIHsKLSAgICAgICAgTWVzc2FnZS5vYnRhaW4obVdpZmlIYW5kbGVyLCBNRVNTQUdFX1NUQVJUX1dJRkksIGxvY2tNb2RlLCAwKS5zZW5kVG9UYXJnZXQoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2VuZEFjY2Vzc1BvaW50TWVzc2FnZShib29sZWFuIGVuYWJsZSwgV2lmaUNvbmZpZ3VyYXRpb24gd2lmaUNvbmZpZywgaW50IHVpZCkgewotICAgICAgICBNZXNzYWdlLm9idGFpbihtV2lmaUhhbmRsZXIsCi0gICAgICAgICAgICAgICAgKGVuYWJsZSA/IE1FU1NBR0VfU1RBUlRfQUNDRVNTX1BPSU5UIDogTUVTU0FHRV9TVE9QX0FDQ0VTU19QT0lOVCksCi0gICAgICAgICAgICAgICAgdWlkLCAwLCB3aWZpQ29uZmlnKS5zZW5kVG9UYXJnZXQoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2VuZEVuYWJsZU5ldHdvcmtzTWVzc2FnZSgpIHsKLSAgICAgICAgTWVzc2FnZS5vYnRhaW4obVdpZmlIYW5kbGVyLCBNRVNTQUdFX0VOQUJMRV9ORVRXT1JLUykuc2VuZFRvVGFyZ2V0KCk7Ci0gICAgfQotCiAgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVdpZmlTdGF0ZSgpIHsKLSAgICAgICAgLy8gc2VuZCBhIG1lc3NhZ2Ugc28gaXQncyBhbGwgc2VyaWFsaXplZAotICAgICAgICBNZXNzYWdlLm9idGFpbihtV2lmaUhhbmRsZXIsIE1FU1NBR0VfVVBEQVRFX1NUQVRFLCAwLCAwKS5zZW5kVG9UYXJnZXQoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZG9VcGRhdGVXaWZpU3RhdGUoKSB7CiAgICAgICAgIGJvb2xlYW4gd2lmaUVuYWJsZWQgPSBnZXRQZXJzaXN0ZWRXaWZpRW5hYmxlZCgpOwotICAgICAgICBib29sZWFuIGFpcnBsYW5lTW9kZSA9IGlzQWlycGxhbmVNb2RlT24oKSAmJiAhbUFpcnBsYW5lTW9kZU92ZXJ3cmlkZGVuOworICAgICAgICBib29sZWFuIGFpcnBsYW5lTW9kZSA9IGlzQWlycGxhbmVNb2RlT24oKSAmJiAhbUFpcnBsYW5lTW9kZU92ZXJ3cmlkZGVuLmdldCgpOwogICAgICAgICBib29sZWFuIGxvY2tIZWxkID0gbUxvY2tzLmhhc0xvY2tzKCk7Ci0gICAgICAgIGludCBzdHJvbmdlc3RMb2NrTW9kZSA9IFdpZmlNYW5hZ2VyLldJRklfTU9ERV9GVUxMOworICAgICAgICBpbnQgc3Ryb25nZXN0TG9ja01vZGU7CiAgICAgICAgIGJvb2xlYW4gd2lmaVNob3VsZEJlRW5hYmxlZCA9IHdpZmlFbmFibGVkICYmICFhaXJwbGFuZU1vZGU7CiAgICAgICAgIGJvb2xlYW4gd2lmaVNob3VsZEJlU3RhcnRlZCA9ICFtRGV2aWNlSWRsZSB8fCBsb2NrSGVsZDsKLQotICAgICAgICBpZiAobG9ja0hlbGQpIHsKKyAgICAgICAgaWYgKG1EZXZpY2VJZGxlICYmIGxvY2tIZWxkKSB7CiAgICAgICAgICAgICBzdHJvbmdlc3RMb2NrTW9kZSA9IG1Mb2Nrcy5nZXRTdHJvbmdlc3RMb2NrTW9kZSgpOwotICAgICAgICB9Ci0gICAgICAgIC8qIElmIGRldmljZSBpcyBub3QgaWRsZSwgbG9ja21vZGUgY2Fubm90IGJlIHNjYW4gb25seSAqLwotICAgICAgICBpZiAoIW1EZXZpY2VJZGxlICYmIHN0cm9uZ2VzdExvY2tNb2RlID09IFdpZmlNYW5hZ2VyLldJRklfTU9ERV9TQ0FOX09OTFkpIHsKKyAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHN0cm9uZ2VzdExvY2tNb2RlID0gV2lmaU1hbmFnZXIuV0lGSV9NT0RFX0ZVTEw7CiAgICAgICAgIH0KIAotICAgICAgICBzeW5jaHJvbml6ZWQgKG1XaWZpSGFuZGxlcikgewotICAgICAgICAgICAgaWYgKChtV2lmaVN0YXRlVHJhY2tlci5nZXRXaWZpU3RhdGUoKSA9PSBXSUZJX1NUQVRFX0VOQUJMSU5HKSAmJiAhYWlycGxhbmVNb2RlKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQorICAgICAgICAvKiBEaXNhYmxlIHRldGhlcmluZyB3aGVuIGFpcnBsYW5lIG1vZGUgaXMgZW5hYmxlZCAqLworICAgICAgICBpZiAoYWlycGxhbmVNb2RlKSB7CisgICAgICAgICAgICBtV2lmaVN0YXRlTWFjaGluZS5zZXRXaWZpQXBFbmFibGVkKG51bGwsIGZhbHNlKTsKKyAgICAgICAgfQogCi0gICAgICAgICAgICAvKiBEaXNhYmxlIHRldGhlcmluZyB3aGVuIGFpcnBsYW5lIG1vZGUgaXMgZW5hYmxlZCAqLwotICAgICAgICAgICAgaWYgKGFpcnBsYW5lTW9kZSAmJgotICAgICAgICAgICAgICAgIChtV2lmaUFwU3RhdGUgPT0gV0lGSV9BUF9TVEFURV9FTkFCTElORyB8fCBtV2lmaUFwU3RhdGUgPT0gV0lGSV9BUF9TVEFURV9FTkFCTEVEKSkgewotICAgICAgICAgICAgICAgIHNXYWtlTG9jay5hY3F1aXJlKCk7Ci0gICAgICAgICAgICAgICAgc2VuZEFjY2Vzc1BvaW50TWVzc2FnZShmYWxzZSwgbnVsbCwgbUxhc3RBcEVuYWJsZVVpZCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICh3aWZpU2hvdWxkQmVFbmFibGVkKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHdpZmlTaG91bGRCZVN0YXJ0ZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgc1dha2VMb2NrLmFjcXVpcmUoKTsKLSAgICAgICAgICAgICAgICAgICAgc2VuZEVuYWJsZU1lc3NhZ2UodHJ1ZSwgZmFsc2UsIG1MYXN0RW5hYmxlVWlkKTsKLSAgICAgICAgICAgICAgICAgICAgc1dha2VMb2NrLmFjcXVpcmUoKTsKLSAgICAgICAgICAgICAgICAgICAgc2VuZFN0YXJ0TWVzc2FnZShzdHJvbmdlc3RMb2NrTW9kZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghbVdpZmlTdGF0ZVRyYWNrZXIuaXNEcml2ZXJTdG9wcGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IHdha2VMb2NrVGltZW91dCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLmdldEludCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLldJRklfTU9CSUxFX0RBVEFfVFJBTlNJVElPTl9XQUtFTE9DS19USU1FT1VUX01TLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9XQUtFTE9DS19USU1FT1VUKTsKLSAgICAgICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgICAgICogV2UgYXJlIGFzc3VtaW5nIHRoYXQgQ29ubmVjdGl2aXR5U2VydmljZSBjYW4gbWFrZQotICAgICAgICAgICAgICAgICAgICAgKiBhIHRyYW5zaXRpb24gdG8gY2VsbHVsYXIgZGF0YSB3aXRoaW4gd2FrZUxvY2tUaW1lb3V0IHRpbWUuCi0gICAgICAgICAgICAgICAgICAgICAqIFRoZSB3YWtlbG9jayBpcyByZWxlYXNlZCBieSB0aGUgZGVsYXllZCBtZXNzYWdlLgotICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgc0RyaXZlclN0b3BXYWtlTG9jay5hY3F1aXJlKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1XaWZpSGFuZGxlci5zZW5kRW1wdHlNZXNzYWdlKE1FU1NBR0VfU1RPUF9XSUZJKTsKLSAgICAgICAgICAgICAgICAgICAgbVdpZmlIYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2VEZWxheWVkKE1FU1NBR0VfUkVMRUFTRV9XQUtFTE9DSywgd2FrZUxvY2tUaW1lb3V0KTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgIGlmICh3aWZpU2hvdWxkQmVFbmFibGVkKSB7CisgICAgICAgICAgICBpZiAod2lmaVNob3VsZEJlU3RhcnRlZCkgeworICAgICAgICAgICAgICAgIG1XaWZpU3RhdGVNYWNoaW5lLnNldFdpZmlFbmFibGVkKHRydWUpOworICAgICAgICAgICAgICAgIG1XaWZpU3RhdGVNYWNoaW5lLnNldFNjYW5Pbmx5TW9kZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9uZ2VzdExvY2tNb2RlID09IFdpZmlNYW5hZ2VyLldJRklfTU9ERV9TQ0FOX09OTFkpOworICAgICAgICAgICAgICAgIG1XaWZpU3RhdGVNYWNoaW5lLnNldERyaXZlclN0YXJ0KHRydWUpOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzV2FrZUxvY2suYWNxdWlyZSgpOwotICAgICAgICAgICAgICAgIHNlbmRFbmFibGVNZXNzYWdlKGZhbHNlLCBmYWxzZSwgbUxhc3RFbmFibGVVaWQpOworICAgICAgICAgICAgICAgIG1XaWZpU3RhdGVNYWNoaW5lLnJlcXVlc3RDbVdha2VMb2NrKCk7CisgICAgICAgICAgICAgICAgbVdpZmlTdGF0ZU1hY2hpbmUuc2V0RHJpdmVyU3RhcnQoZmFsc2UpOwogICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVdpZmlTdGF0ZU1hY2hpbmUuc2V0V2lmaUVuYWJsZWQoZmFsc2UpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0xOTAwLDgxICs5OTMsNiBAQAogICAgICAgICAgICAgICAgIFNldHRpbmdzLlN5c3RlbS5BSVJQTEFORV9NT0RFX09OLCAwKSA9PSAxOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIEhhbmRsZXIgdGhhdCBhbGxvd3MgcG9zdGluZyB0byB0aGUgV2lmaVRocmVhZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIGNsYXNzIFdpZmlIYW5kbGVyIGV4dGVuZHMgSGFuZGxlciB7Ci0gICAgICAgIHB1YmxpYyBXaWZpSGFuZGxlcihMb29wZXIgbG9vcGVyKSB7Ci0gICAgICAgICAgICBzdXBlcihsb29wZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKLSAgICAgICAgICAgIHN3aXRjaCAobXNnLndoYXQpIHsKLQotICAgICAgICAgICAgICAgIGNhc2UgTUVTU0FHRV9FTkFCTEVfV0lGSToKLSAgICAgICAgICAgICAgICAgICAgc2V0V2lmaUVuYWJsZWRCbG9ja2luZyh0cnVlLCBtc2cuYXJnMSA9PSAxLCBtc2cuYXJnMik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtV2lmaVdhdGNoZG9nU2VydmljZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtV2lmaVdhdGNoZG9nU2VydmljZSA9IG5ldyBXaWZpV2F0Y2hkb2dTZXJ2aWNlKG1Db250ZXh0LCBtV2lmaVN0YXRlVHJhY2tlcik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc1dha2VMb2NrLnJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE1FU1NBR0VfU1RBUlRfV0lGSToKLSAgICAgICAgICAgICAgICAgICAgbVdpZmlTdGF0ZVRyYWNrZXIuc2V0U2Nhbk9ubHlNb2RlKG1zZy5hcmcxID09IFdpZmlNYW5hZ2VyLldJRklfTU9ERV9TQ0FOX09OTFkpOwotICAgICAgICAgICAgICAgICAgICBtV2lmaVN0YXRlVHJhY2tlci5yZXN0YXJ0KCk7Ci0gICAgICAgICAgICAgICAgICAgIG1XaWZpU3RhdGVUcmFja2VyLnNldEhpZ2hQZXJmTW9kZShtc2cuYXJnMSA9PQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlNYW5hZ2VyLldJRklfTU9ERV9GVUxMX0hJR0hfUEVSRik7Ci0gICAgICAgICAgICAgICAgICAgIHNXYWtlTG9jay5yZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBNRVNTQUdFX1VQREFURV9TVEFURToKLSAgICAgICAgICAgICAgICAgICAgZG9VcGRhdGVXaWZpU3RhdGUoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE1FU1NBR0VfRElTQUJMRV9XSUZJOgotICAgICAgICAgICAgICAgICAgICAvLyBhIG5vbi16ZXJvIG1zZy5hcmcxIHZhbHVlIG1lYW5zIHRoZSAiZW5hYmxlZCIgc2V0dGluZwotICAgICAgICAgICAgICAgICAgICAvLyBzaG91bGQgYmUgcGVyc2lzdGVkCi0gICAgICAgICAgICAgICAgICAgIHNldFdpZmlFbmFibGVkQmxvY2tpbmcoZmFsc2UsIG1zZy5hcmcxID09IDEsIG1zZy5hcmcyKTsKLSAgICAgICAgICAgICAgICAgICAgbVdpZmlXYXRjaGRvZ1NlcnZpY2UgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBzV2FrZUxvY2sucmVsZWFzZSgpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTUVTU0FHRV9TVE9QX1dJRkk6Ci0gICAgICAgICAgICAgICAgICAgIG1XaWZpU3RhdGVUcmFja2VyLmRpc2Nvbm5lY3RBbmRTdG9wKCk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGRvbid0IHJlbGVhc2Ugd2FrZWxvY2sKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE1FU1NBR0VfUkVMRUFTRV9XQUtFTE9DSzoKLSAgICAgICAgICAgICAgICAgICAgc0RyaXZlclN0b3BXYWtlTG9jay5yZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBNRVNTQUdFX1NUQVJUX0FDQ0VTU19QT0lOVDoKLSAgICAgICAgICAgICAgICAgICAgc2V0V2lmaUFwRW5hYmxlZEJsb2NraW5nKHRydWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2cuYXJnMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChXaWZpQ29uZmlndXJhdGlvbikgbXNnLm9iaik7Ci0gICAgICAgICAgICAgICAgICAgIHNXYWtlTG9jay5yZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBNRVNTQUdFX1NUT1BfQUNDRVNTX1BPSU5UOgotICAgICAgICAgICAgICAgICAgICBzZXRXaWZpQXBFbmFibGVkQmxvY2tpbmcoZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2cuYXJnMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChXaWZpQ29uZmlndXJhdGlvbikgbXNnLm9iaik7Ci0gICAgICAgICAgICAgICAgICAgIHNXYWtlTG9jay5yZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBNRVNTQUdFX1NFVF9DSEFOTkVMUzoKLSAgICAgICAgICAgICAgICAgICAgc2V0TnVtQWxsb3dlZENoYW5uZWxzQmxvY2tpbmcobXNnLmFyZzEsIG1zZy5hcmcyID09IDEpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTUVTU0FHRV9FTkFCTEVfTkVUV09SS1M6Ci0gICAgICAgICAgICAgICAgICAgIG1XaWZpU3RhdGVUcmFja2VyLmVuYWJsZUFsbE5ldHdvcmtzKGdldENvbmZpZ3VyZWROZXR3b3JrcygpKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIGR1bXAoRmlsZURlc2NyaXB0b3IgZmQsIFByaW50V3JpdGVyIHB3LCBTdHJpbmdbXSBhcmdzKSB7CiAgICAgICAgIGlmIChtQ29udGV4dC5jaGVja0NhbGxpbmdPclNlbGZQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5EVU1QKQpAQCAtMTk4NCwxNyArMTAwMiwxNyBAQAogICAgICAgICAgICAgICAgICAgICArICIsIHVpZD0iICsgQmluZGVyLmdldENhbGxpbmdVaWQoKSk7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KLSAgICAgICAgcHcucHJpbnRsbigiV2ktRmkgaXMgIiArIHN0YXRlTmFtZShtV2lmaVN0YXRlVHJhY2tlci5nZXRXaWZpU3RhdGUoKSkpOworICAgICAgICBwdy5wcmludGxuKCJXaS1GaSBpcyAiICsgbVdpZmlTdGF0ZU1hY2hpbmUuc3luY0dldFdpZmlTdGF0ZUJ5TmFtZSgpKTsKICAgICAgICAgcHcucHJpbnRsbigiU3RheS1hd2FrZSBjb25kaXRpb25zOiAiICsKICAgICAgICAgICAgICAgICBTZXR0aW5ncy5TeXN0ZW0uZ2V0SW50KG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0dGluZ3MuU3lzdGVtLlNUQVlfT05fV0hJTEVfUExVR0dFRF9JTiwgMCkpOwogICAgICAgICBwdy5wcmludGxuKCk7CiAKICAgICAgICAgcHcucHJpbnRsbigiSW50ZXJuYWwgc3RhdGU6Iik7Ci0gICAgICAgIHB3LnByaW50bG4obVdpZmlTdGF0ZVRyYWNrZXIpOworICAgICAgICBwdy5wcmludGxuKG1XaWZpU3RhdGVNYWNoaW5lKTsKICAgICAgICAgcHcucHJpbnRsbigpOwogICAgICAgICBwdy5wcmludGxuKCJMYXRlc3Qgc2NhbiByZXN1bHRzOiIpOwotICAgICAgICBMaXN0PFNjYW5SZXN1bHQ+IHNjYW5SZXN1bHRzID0gbVdpZmlTdGF0ZVRyYWNrZXIuZ2V0U2NhblJlc3VsdHNMaXN0KCk7CisgICAgICAgIExpc3Q8U2NhblJlc3VsdD4gc2NhblJlc3VsdHMgPSBtV2lmaVN0YXRlTWFjaGluZS5zeW5jR2V0U2NhblJlc3VsdHNMaXN0KCk7CiAgICAgICAgIGlmIChzY2FuUmVzdWx0cyAhPSBudWxsICYmIHNjYW5SZXN1bHRzLnNpemUoKSAhPSAwKSB7CiAgICAgICAgICAgICBwdy5wcmludGxuKCIgIEJTU0lEICAgICAgICAgICAgICBGcmVxdWVuY3kgICBSU1NJICBGbGFncyAgICAgICAgICAgICBTU0lEIik7CiAgICAgICAgICAgICBmb3IgKFNjYW5SZXN1bHQgciA6IHNjYW5SZXN1bHRzKSB7CkBAIC0yMDA4LDMzICsxMDI2LDE0IEBACiAgICAgICAgIH0KICAgICAgICAgcHcucHJpbnRsbigpOwogICAgICAgICBwdy5wcmludGxuKCJMb2NrcyBhY3F1aXJlZDogIiArIG1GdWxsTG9ja3NBY3F1aXJlZCArICIgZnVsbCwgIiArCi0gICAgICAgICAgICAgICAgbUZ1bGxIaWdoUGVyZkxvY2tzQWNxdWlyZWQgKyAiIGZ1bGwgaGlnaCBwZXJmLCAiICsKICAgICAgICAgICAgICAgICBtU2NhbkxvY2tzQWNxdWlyZWQgKyAiIHNjYW4iKTsKICAgICAgICAgcHcucHJpbnRsbigiTG9ja3MgcmVsZWFzZWQ6ICIgKyBtRnVsbExvY2tzUmVsZWFzZWQgKyAiIGZ1bGwsICIgKwotICAgICAgICAgICAgICAgIG1GdWxsSGlnaFBlcmZMb2Nrc1JlbGVhc2VkICsgIiBmdWxsIGhpZ2ggcGVyZiwgIiArCiAgICAgICAgICAgICAgICAgbVNjYW5Mb2Nrc1JlbGVhc2VkICsgIiBzY2FuIik7CiAgICAgICAgIHB3LnByaW50bG4oKTsKICAgICAgICAgcHcucHJpbnRsbigiTG9ja3MgaGVsZDoiKTsKICAgICAgICAgbUxvY2tzLmR1bXAocHcpOwogICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBzdGF0ZU5hbWUoaW50IHdpZmlTdGF0ZSkgewotICAgICAgICBzd2l0Y2ggKHdpZmlTdGF0ZSkgewotICAgICAgICAgICAgY2FzZSBXSUZJX1NUQVRFX0RJU0FCTElORzoKLSAgICAgICAgICAgICAgICByZXR1cm4gImRpc2FibGluZyI7Ci0gICAgICAgICAgICBjYXNlIFdJRklfU1RBVEVfRElTQUJMRUQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJkaXNhYmxlZCI7Ci0gICAgICAgICAgICBjYXNlIFdJRklfU1RBVEVfRU5BQkxJTkc6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJlbmFibGluZyI7Ci0gICAgICAgICAgICBjYXNlIFdJRklfU1RBVEVfRU5BQkxFRDoKLSAgICAgICAgICAgICAgICByZXR1cm4gImVuYWJsZWQiOwotICAgICAgICAgICAgY2FzZSBXSUZJX1NUQVRFX1VOS05PV046Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJ1bmtub3duIHN0YXRlIjsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJbaW52YWxpZCBzdGF0ZV0iOwotICAgICAgICB9Ci0gICAgfQotCiAgICAgcHJpdmF0ZSBjbGFzcyBXaWZpTG9jayBleHRlbmRzIERlYXRoUmVjaXBpZW50IHsKICAgICAgICAgV2lmaUxvY2soaW50IGxvY2tNb2RlLCBTdHJpbmcgdGFnLCBJQmluZGVyIGJpbmRlcikgewogICAgICAgICAgICAgc3VwZXIobG9ja01vZGUsIHRhZywgYmluZGVyKTsKQEAgLTIwNjYsMTUgKzEwNjUsMTEgQEAKICAgICAgICAgICAgIGlmIChtTGlzdC5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gV2lmaU1hbmFnZXIuV0lGSV9NT0RFX0ZVTEw7CiAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtRnVsbEhpZ2hQZXJmTG9ja3NBY3F1aXJlZCA+IG1GdWxsSGlnaFBlcmZMb2Nrc1JlbGVhc2VkKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFdpZmlNYW5hZ2VyLldJRklfTU9ERV9GVUxMX0hJR0hfUEVSRjsKKyAgICAgICAgICAgIGZvciAoV2lmaUxvY2sgbCA6IG1MaXN0KSB7CisgICAgICAgICAgICAgICAgaWYgKGwubU1vZGUgPT0gV2lmaU1hbmFnZXIuV0lGSV9NT0RFX0ZVTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFdpZmlNYW5hZ2VyLldJRklfTU9ERV9GVUxMOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1GdWxsTG9ja3NBY3F1aXJlZCA+IG1GdWxsTG9ja3NSZWxlYXNlZCkgewotICAgICAgICAgICAgICAgIHJldHVybiBXaWZpTWFuYWdlci5XSUZJX01PREVfRlVMTDsKLSAgICAgICAgICAgIH0KLQogICAgICAgICAgICAgcmV0dXJuIFdpZmlNYW5hZ2VyLldJRklfTU9ERV9TQ0FOX09OTFk7CiAgICAgICAgIH0KIApAQCAtMjExMywxMSArMTEwOCw3IEBACiAKICAgICBwdWJsaWMgYm9vbGVhbiBhY3F1aXJlV2lmaUxvY2soSUJpbmRlciBiaW5kZXIsIGludCBsb2NrTW9kZSwgU3RyaW5nIHRhZykgewogICAgICAgICBtQ29udGV4dC5lbmZvcmNlQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLldBS0VfTE9DSywgbnVsbCk7Ci0gICAgICAgIGlmIChsb2NrTW9kZSAhPSBXaWZpTWFuYWdlci5XSUZJX01PREVfRlVMTCAmJgotICAgICAgICAgICAgICAgIGxvY2tNb2RlICE9IFdpZmlNYW5hZ2VyLldJRklfTU9ERV9TQ0FOX09OTFkgJiYKLSAgICAgICAgICAgICAgICBsb2NrTW9kZSAhPSBXaWZpTWFuYWdlci5XSUZJX01PREVfRlVMTF9ISUdIX1BFUkYpIHsKLSAgICAgICAgICAgIFNsb2cuZShUQUcsICJJbGxlZ2FsIGFyZ3VtZW50LCBsb2NrTW9kZT0gIiArIGxvY2tNb2RlKTsKLSAgICAgICAgICAgIGlmIChEQkcpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImxvY2tNb2RlPSIgKyBsb2NrTW9kZSk7CisgICAgICAgIGlmIChsb2NrTW9kZSAhPSBXaWZpTWFuYWdlci5XSUZJX01PREVfRlVMTCAmJiBsb2NrTW9kZSAhPSBXaWZpTWFuYWdlci5XSUZJX01PREVfU0NBTl9PTkxZKSB7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgV2lmaUxvY2sgd2lmaUxvY2sgPSBuZXcgV2lmaUxvY2sobG9ja01vZGUsIHRhZywgYmluZGVyKTsKQEAgLTIxMzksMTIgKzExMzAsNiBAQAogICAgICAgICAgICAgICAgICsrbUZ1bGxMb2Nrc0FjcXVpcmVkOwogICAgICAgICAgICAgICAgIG1CYXR0ZXJ5U3RhdHMubm90ZUZ1bGxXaWZpTG9ja0FjcXVpcmVkKHVpZCk7CiAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFdpZmlNYW5hZ2VyLldJRklfTU9ERV9GVUxMX0hJR0hfUEVSRjoKLSAgICAgICAgICAgICAgICArK21GdWxsSGlnaFBlcmZMb2Nrc0FjcXVpcmVkOwotICAgICAgICAgICAgICAgIC8qIFRyZWF0IGhpZ2ggcG93ZXIgYXMgYSBmdWxsIGxvY2sgZm9yIGJhdHRlcnkgc3RhdHMgKi8KLSAgICAgICAgICAgICAgICBtQmF0dGVyeVN0YXRzLm5vdGVGdWxsV2lmaUxvY2tBY3F1aXJlZCh1aWQpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCiAgICAgICAgICAgICBjYXNlIFdpZmlNYW5hZ2VyLldJRklfTU9ERV9TQ0FOX09OTFk6CiAgICAgICAgICAgICAgICAgKyttU2NhbkxvY2tzQWNxdWlyZWQ7CiAgICAgICAgICAgICAgICAgbUJhdHRlcnlTdGF0cy5ub3RlU2NhbldpZmlMb2NrQWNxdWlyZWQodWlkKTsKQEAgLTIxODQsMTAgKzExNjksNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgKyttRnVsbExvY2tzUmVsZWFzZWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICBtQmF0dGVyeVN0YXRzLm5vdGVGdWxsV2lmaUxvY2tSZWxlYXNlZCh1aWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgV2lmaU1hbmFnZXIuV0lGSV9NT0RFX0ZVTExfSElHSF9QRVJGOgotICAgICAgICAgICAgICAgICAgICAgICAgKyttRnVsbEhpZ2hQZXJmTG9ja3NSZWxlYXNlZDsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1CYXR0ZXJ5U3RhdHMubm90ZUZ1bGxXaWZpTG9ja1JlbGVhc2VkKHVpZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgY2FzZSBXaWZpTWFuYWdlci5XSUZJX01PREVfU0NBTl9PTkxZOgogICAgICAgICAgICAgICAgICAgICAgICAgKyttU2NhbkxvY2tzUmVsZWFzZWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICBtQmF0dGVyeVN0YXRzLm5vdGVTY2FuV2lmaUxvY2tSZWxlYXNlZCh1aWQpOwpAQCAtMjI1OCw3ICsxMjM5LDcgQEAKICAgICAgICAgICAgIGlmIChtTXVsdGljYXN0ZXJzLnNpemUoKSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtV2lmaVN0YXRlVHJhY2tlci5zdGFydFBhY2tldEZpbHRlcmluZygpOworICAgICAgICAgICAgICAgIG1XaWZpU3RhdGVNYWNoaW5lLnN0YXJ0UGFja2V0RmlsdGVyaW5nKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC0yMjczLDcgKzEyNTQsNyBAQAogICAgICAgICAgICAgLy8gb3VyIG5ldyBzaXplID09IDEgKGZpcnN0IGNhbGwpLCBidXQgdGhpcyBmdW5jdGlvbiB3b24ndAogICAgICAgICAgICAgLy8gYmUgY2FsbGVkIG9mdGVuIGFuZCBieSBtYWtpbmcgdGhlIHN0b3BQYWNrZXQgY2FsbCBlYWNoCiAgICAgICAgICAgICAvLyB0aW1lIHdlJ3JlIGxlc3MgZnJhZ2lsZSBhbmQgc2VsZi1oZWFsaW5nLgotICAgICAgICAgICAgbVdpZmlTdGF0ZVRyYWNrZXIuc3RvcFBhY2tldEZpbHRlcmluZygpOworICAgICAgICAgICAgbVdpZmlTdGF0ZU1hY2hpbmUuc3RvcFBhY2tldEZpbHRlcmluZygpOwogICAgICAgICB9CiAKICAgICAgICAgaW50IHVpZCA9IEJpbmRlci5nZXRDYWxsaW5nVWlkKCk7CkBAIC0yMzEwLDcgKzEyOTEsNyBAQAogICAgICAgICAgICAgcmVtb3ZlZC51bmxpbmtEZWF0aFJlY2lwaWVudCgpOwogICAgICAgICB9CiAgICAgICAgIGlmIChtTXVsdGljYXN0ZXJzLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICBtV2lmaVN0YXRlVHJhY2tlci5zdGFydFBhY2tldEZpbHRlcmluZygpOworICAgICAgICAgICAgbVdpZmlTdGF0ZU1hY2hpbmUuc3RhcnRQYWNrZXRGaWx0ZXJpbmcoKTsKICAgICAgICAgfQogCiAgICAgICAgIExvbmcgaWRlbnQgPSBCaW5kZXIuY2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKQEAgLTIzMjksNCArMTMxMCwxNDQgQEAKICAgICAgICAgICAgIHJldHVybiAobU11bHRpY2FzdGVycy5zaXplKCkgPiAwKTsKICAgICAgICAgfQogICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjaGVja0FuZFNldE5vdGlmaWNhdGlvbigpIHsKKyAgICAgICAgLy8gSWYgd2Ugc2hvdWxkbid0IHBsYWNlIGEgbm90aWZpY2F0aW9uIG9uIGF2YWlsYWJsZSBuZXR3b3JrcywgdGhlbgorICAgICAgICAvLyBkb24ndCBib3RoZXIgZG9pbmcgYW55IG9mIHRoZSBmb2xsb3dpbmcKKyAgICAgICAgaWYgKCFtTm90aWZpY2F0aW9uRW5hYmxlZCkgcmV0dXJuOworCisgICAgICAgIFN0YXRlIHN0YXRlID0gbU5ldHdvcmtJbmZvLmdldFN0YXRlKCk7CisgICAgICAgIGlmICgoc3RhdGUgPT0gTmV0d29ya0luZm8uU3RhdGUuRElTQ09OTkVDVEVEKQorICAgICAgICAgICAgICAgIHx8IChzdGF0ZSA9PSBOZXR3b3JrSW5mby5TdGF0ZS5VTktOT1dOKSkgeworICAgICAgICAgICAgLy8gTG9vayBmb3IgYW4gb3BlbiBuZXR3b3JrCisgICAgICAgICAgICBMaXN0PFNjYW5SZXN1bHQ+IHNjYW5SZXN1bHRzID0gbVdpZmlTdGF0ZU1hY2hpbmUuc3luY0dldFNjYW5SZXN1bHRzTGlzdCgpOworICAgICAgICAgICAgaWYgKHNjYW5SZXN1bHRzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpbnQgbnVtT3Blbk5ldHdvcmtzID0gMDsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gc2NhblJlc3VsdHMuc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgICAgICAgICAgICAgU2NhblJlc3VsdCBzY2FuUmVzdWx0ID0gc2NhblJlc3VsdHMuZ2V0KGkpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShzY2FuUmVzdWx0LmNhcGFiaWxpdGllcykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bU9wZW5OZXR3b3JrcysrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKG51bU9wZW5OZXR3b3JrcyA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCsrbU51bVNjYW5zU2luY2VOZXR3b3JrU3RhdGVDaGFuZ2UgPj0gTlVNX1NDQU5TX0JFRk9SRV9BQ1RVQUxMWV9TQ0FOTklORykgeworICAgICAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIFdlJ3ZlIHNjYW5uZWQgY29udGludW91c2x5IGF0IGxlYXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgKiBOVU1fU0NBTlNfQkVGT1JFX05PVElGSUNBVElPTiB0aW1lcy4gVGhlIHVzZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIHByb2JhYmx5IGRvZXMgbm90IGhhdmUgYSByZW1lbWJlcmVkIG5ldHdvcmsgaW4gcmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBzaW5jZSBvdGhlcndpc2Ugc3VwcGxpY2FudCB3b3VsZCBoYXZlIHRyaWVkIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBhc3NvY2lhdGUgYW5kIHRodXMgcmVzZXR0aW5nIHRoaXMgY291bnRlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgc2V0Tm90aWZpY2F0aW9uVmlzaWJsZSh0cnVlLCBudW1PcGVuTmV0d29ya3MsIGZhbHNlLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gTm8gb3BlbiBuZXR3b3JrcyBpbiByYW5nZSwgcmVtb3ZlIHRoZSBub3RpZmljYXRpb24KKyAgICAgICAgc2V0Tm90aWZpY2F0aW9uVmlzaWJsZShmYWxzZSwgMCwgZmFsc2UsIDApOworICAgIH0KKworICAgIC8qKgorICAgICAqIENsZWFycyB2YXJpYWJsZXMgcmVsYXRlZCB0byB0cmFja2luZyB3aGV0aGVyIGEgbm90aWZpY2F0aW9uIGhhcyBiZWVuCisgICAgICogc2hvd24gcmVjZW50bHkgYW5kIGNsZWFycyB0aGUgY3VycmVudCBub3RpZmljYXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHJlc2V0Tm90aWZpY2F0aW9uKCkgeworICAgICAgICBtTm90aWZpY2F0aW9uUmVwZWF0VGltZSA9IDA7CisgICAgICAgIG1OdW1TY2Fuc1NpbmNlTmV0d29ya1N0YXRlQ2hhbmdlID0gMDsKKyAgICAgICAgc2V0Tm90aWZpY2F0aW9uVmlzaWJsZShmYWxzZSwgMCwgZmFsc2UsIDApOworICAgIH0KKworICAgIC8qKgorICAgICAqIERpc3BsYXkgb3IgZG9uJ3QgZGlzcGxheSBhIG5vdGlmaWNhdGlvbiB0aGF0IHRoZXJlIGFyZSBvcGVuIFdpLUZpIG5ldHdvcmtzLgorICAgICAqIEBwYXJhbSB2aXNpYmxlIHtAY29kZSB0cnVlfSBpZiBub3RpZmljYXRpb24gc2hvdWxkIGJlIHZpc2libGUsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCisgICAgICogQHBhcmFtIG51bU5ldHdvcmtzIHRoZSBudW1iZXIgbmV0d29ya3Mgc2VlbgorICAgICAqIEBwYXJhbSBmb3JjZSB7QGNvZGUgdHJ1ZX0gdG8gZm9yY2Ugbm90aWZpY2F0aW9uIHRvIGJlIHNob3duL25vdC1zaG93biwKKyAgICAgKiBldmVuIGlmIGl0IGlzIGFscmVhZHkgc2hvd24vbm90LXNob3duLgorICAgICAqIEBwYXJhbSBkZWxheSB0aW1lIGluIG1pbGxpc2Vjb25kcyBhZnRlciB3aGljaCB0aGUgbm90aWZpY2F0aW9uIHNob3VsZCBiZSBtYWRlCisgICAgICogdmlzaWJsZSBvciBpbnZpc2libGUuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHNldE5vdGlmaWNhdGlvblZpc2libGUoYm9vbGVhbiB2aXNpYmxlLCBpbnQgbnVtTmV0d29ya3MsIGJvb2xlYW4gZm9yY2UsCisgICAgICAgICAgICBpbnQgZGVsYXkpIHsKKworICAgICAgICAvLyBTaW5jZSB3ZSB1c2UgYXV0byBjYW5jZWwgb24gdGhlIG5vdGlmaWNhdGlvbiwgd2hlbiB0aGUKKyAgICAgICAgLy8gbU5ldHdvcmtzQXZhaWxhYmxlTm90aWZpY2F0aW9uU2hvd24gaXMgdHJ1ZSwgdGhlIG5vdGlmaWNhdGlvbiBtYXkKKyAgICAgICAgLy8gaGF2ZSBhY3R1YWxseSBiZWVuIGNhbmNlbGVkLiAgSG93ZXZlciwgd2hlbiBpdCBpcyBmYWxzZSB3ZSBrbm93CisgICAgICAgIC8vIGZvciBzdXJlIHRoYXQgaXQgaXMgbm90IGJlaW5nIHNob3duIChpdCB3aWxsIG5vdCBiZSBzaG93biBhbnkgb3RoZXIKKyAgICAgICAgLy8gcGxhY2UgdGhhbiBoZXJlKQorCisgICAgICAgIC8vIElmIGl0IHNob3VsZCBiZSBoaWRkZW4gYW5kIGl0IGlzIGFscmVhZHkgaGlkZGVuLCB0aGVuIG5vb3AKKyAgICAgICAgaWYgKCF2aXNpYmxlICYmICFtTm90aWZpY2F0aW9uU2hvd24gJiYgIWZvcmNlKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBOb3RpZmljYXRpb25NYW5hZ2VyIG5vdGlmaWNhdGlvbk1hbmFnZXIgPSAoTm90aWZpY2F0aW9uTWFuYWdlcikgbUNvbnRleHQKKyAgICAgICAgICAgICAgICAuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0Lk5PVElGSUNBVElPTl9TRVJWSUNFKTsKKworICAgICAgICBNZXNzYWdlIG1lc3NhZ2U7CisgICAgICAgIGlmICh2aXNpYmxlKSB7CisKKyAgICAgICAgICAgIC8vIE5vdCBlbm91Z2ggdGltZSBoYXMgcGFzc2VkIHRvIHNob3cgdGhlIG5vdGlmaWNhdGlvbiBhZ2FpbgorICAgICAgICAgICAgaWYgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIDwgbU5vdGlmaWNhdGlvblJlcGVhdFRpbWUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChtTm90aWZpY2F0aW9uID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAvLyBDYWNoZSB0aGUgTm90aWZpY2F0aW9uIG9iamVjdC4KKyAgICAgICAgICAgICAgICBtTm90aWZpY2F0aW9uID0gbmV3IE5vdGlmaWNhdGlvbigpOworICAgICAgICAgICAgICAgIG1Ob3RpZmljYXRpb24ud2hlbiA9IDA7CisgICAgICAgICAgICAgICAgbU5vdGlmaWNhdGlvbi5pY29uID0gSUNPTl9ORVRXT1JLU19BVkFJTEFCTEU7CisgICAgICAgICAgICAgICAgbU5vdGlmaWNhdGlvbi5mbGFncyA9IE5vdGlmaWNhdGlvbi5GTEFHX0FVVE9fQ0FOQ0VMOworICAgICAgICAgICAgICAgIG1Ob3RpZmljYXRpb24uY29udGVudEludGVudCA9IFBlbmRpbmdJbnRlbnQuZ2V0QWN0aXZpdHkobUNvbnRleHQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgSW50ZW50KFdpZmlNYW5hZ2VyLkFDVElPTl9QSUNLX1dJRklfTkVUV09SSyksIDApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDaGFyU2VxdWVuY2UgdGl0bGUgPSBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRRdWFudGl0eVRleHQoCisgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIucGx1cmFscy53aWZpX2F2YWlsYWJsZSwgbnVtTmV0d29ya3MpOworICAgICAgICAgICAgQ2hhclNlcXVlbmNlIGRldGFpbHMgPSBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRRdWFudGl0eVRleHQoCisgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIucGx1cmFscy53aWZpX2F2YWlsYWJsZV9kZXRhaWxlZCwgbnVtTmV0d29ya3MpOworICAgICAgICAgICAgbU5vdGlmaWNhdGlvbi50aWNrZXJUZXh0ID0gdGl0bGU7CisgICAgICAgICAgICBtTm90aWZpY2F0aW9uLnNldExhdGVzdEV2ZW50SW5mbyhtQ29udGV4dCwgdGl0bGUsIGRldGFpbHMsIG1Ob3RpZmljYXRpb24uY29udGVudEludGVudCk7CisKKyAgICAgICAgICAgIG1Ob3RpZmljYXRpb25SZXBlYXRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyBOT1RJRklDQVRJT05fUkVQRUFUX0RFTEFZX01TOworCisgICAgICAgICAgICBub3RpZmljYXRpb25NYW5hZ2VyLm5vdGlmeShJQ09OX05FVFdPUktTX0FWQUlMQUJMRSwgbU5vdGlmaWNhdGlvbik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBub3RpZmljYXRpb25NYW5hZ2VyLmNhbmNlbChJQ09OX05FVFdPUktTX0FWQUlMQUJMRSk7CisgICAgICAgIH0KKworICAgICAgICBtTm90aWZpY2F0aW9uU2hvd24gPSB2aXNpYmxlOworICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgTm90aWZpY2F0aW9uRW5hYmxlZFNldHRpbmdPYnNlcnZlciBleHRlbmRzIENvbnRlbnRPYnNlcnZlciB7CisKKyAgICAgICAgcHVibGljIE5vdGlmaWNhdGlvbkVuYWJsZWRTZXR0aW5nT2JzZXJ2ZXIoSGFuZGxlciBoYW5kbGVyKSB7CisgICAgICAgICAgICBzdXBlcihoYW5kbGVyKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyKCkgeworICAgICAgICAgICAgQ29udGVudFJlc29sdmVyIGNyID0gbUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCk7CisgICAgICAgICAgICBjci5yZWdpc3RlckNvbnRlbnRPYnNlcnZlcihTZXR0aW5ncy5TZWN1cmUuZ2V0VXJpRm9yKAorICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5XSUZJX05FVFdPUktTX0FWQUlMQUJMRV9OT1RJRklDQVRJT05fT04pLCB0cnVlLCB0aGlzKTsKKyAgICAgICAgICAgIG1Ob3RpZmljYXRpb25FbmFibGVkID0gZ2V0VmFsdWUoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkNoYW5nZShib29sZWFuIHNlbGZDaGFuZ2UpIHsKKyAgICAgICAgICAgIHN1cGVyLm9uQ2hhbmdlKHNlbGZDaGFuZ2UpOworCisgICAgICAgICAgICBtTm90aWZpY2F0aW9uRW5hYmxlZCA9IGdldFZhbHVlKCk7CisgICAgICAgICAgICByZXNldE5vdGlmaWNhdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIGdldFZhbHVlKCkgeworICAgICAgICAgICAgcmV0dXJuIFNldHRpbmdzLlNlY3VyZS5nZXRJbnQobUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCksCisgICAgICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5XSUZJX05FVFdPUktTX0FWQUlMQUJMRV9OT1RJRklDQVRJT05fT04sIDEpID09IDE7CisgICAgICAgIH0KKyAgICB9CisKKwogfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvV2lmaVdhdGNoZG9nU2VydmljZS5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvV2lmaVdhdGNoZG9nU2VydmljZS5qYXZhCmluZGV4IDQ0NWRkMDMuLjQ2ZDZiZWYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1dpZmlXYXRjaGRvZ1NlcnZpY2UuamF2YQorKysgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9XaWZpV2F0Y2hkb2dTZXJ2aWNlLmphdmEKQEAgLTI3LDcgKzI3LDYgQEAKIGltcG9ydCBhbmRyb2lkLm5ldC53aWZpLlNjYW5SZXN1bHQ7CiBpbXBvcnQgYW5kcm9pZC5uZXQud2lmaS5XaWZpSW5mbzsKIGltcG9ydCBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQubmV0LndpZmkuV2lmaVN0YXRlVHJhY2tlcjsKIGltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5Mb29wZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwpAQCAtNzcsNyArNzYsNiBAQAogICAgIAogICAgIHByaXZhdGUgQ29udGV4dCBtQ29udGV4dDsKICAgICBwcml2YXRlIENvbnRlbnRSZXNvbHZlciBtQ29udGVudFJlc29sdmVyOwotICAgIHByaXZhdGUgV2lmaVN0YXRlVHJhY2tlciBtV2lmaVN0YXRlVHJhY2tlcjsKICAgICBwcml2YXRlIFdpZmlNYW5hZ2VyIG1XaWZpTWFuYWdlcjsKICAgICAKICAgICAvKioKQEAgLTEwOCwxMCArMTA2LDkgQEAKICAgICAvKiogV2hldGhlciB0aGUgY3VycmVudCBBUCBjaGVjayBzaG91bGQgYmUgY2FuY2VsZWQuICovCiAgICAgcHJpdmF0ZSBib29sZWFuIG1TaG91bGRDYW5jZWw7CiAgICAgCi0gICAgV2lmaVdhdGNoZG9nU2VydmljZShDb250ZXh0IGNvbnRleHQsIFdpZmlTdGF0ZVRyYWNrZXIgd2lmaVN0YXRlVHJhY2tlcikgeworICAgIFdpZmlXYXRjaGRvZ1NlcnZpY2UoQ29udGV4dCBjb250ZXh0KSB7CiAgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKICAgICAgICAgbUNvbnRlbnRSZXNvbHZlciA9IGNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCk7Ci0gICAgICAgIG1XaWZpU3RhdGVUcmFja2VyID0gd2lmaVN0YXRlVHJhY2tlcjsKICAgICAgICAgbVdpZmlNYW5hZ2VyID0gKFdpZmlNYW5hZ2VyKSBjb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5XSUZJX1NFUlZJQ0UpOwogICAgICAgICAKICAgICAgICAgY3JlYXRlVGhyZWFkKCk7CkBAIC0yNzUsMTIgKzI3MiwxMyBAQAogICAgIC8qKgogICAgICAqIFVucmVnaXN0ZXIgYnJvYWRjYXN0cyBhbmQgcXVpdCB0aGUgd2F0Y2hkb2cgdGhyZWFkCiAgICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHF1aXQoKSB7Ci0gICAgICAgIHVucmVnaXN0ZXJGb3JXaWZpQnJvYWRjYXN0cygpOwotICAgICAgICBtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKS51bnJlZ2lzdGVyQ29udGVudE9ic2VydmVyKG1Db250ZW50T2JzZXJ2ZXIpOwotICAgICAgICBtSGFuZGxlci5yZW1vdmVBbGxBY3Rpb25zKCk7Ci0gICAgICAgIG1IYW5kbGVyLmdldExvb3BlcigpLnF1aXQoKTsKLSAgICB9CisgICAgLy9UT0RPOiBDaGFuZ2UgYmFjayB0byBydW5uaW5nIFdXUyB3aGVuIG5lZWRlZAorLy8gICAgcHJpdmF0ZSB2b2lkIHF1aXQoKSB7CisvLyAgICAgICAgdW5yZWdpc3RlckZvcldpZmlCcm9hZGNhc3RzKCk7CisvLyAgICAgICAgbUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCkudW5yZWdpc3RlckNvbnRlbnRPYnNlcnZlcihtQ29udGVudE9ic2VydmVyKTsKKy8vICAgICAgICBtSGFuZGxlci5yZW1vdmVBbGxBY3Rpb25zKCk7CisvLyAgICAgICAgbUhhbmRsZXIuZ2V0TG9vcGVyKCkucXVpdCgpOworLy8gICAgfQogCiAgICAgLyoqCiAgICAgICogV2FpdHMgZm9yIHRoZSBtYWluIHdhdGNoZG9nIHRocmVhZCB0byBjcmVhdGUgdGhlIGhhbmRsZXIuCkBAIC03NTEsNyArNzQ5LDcgQEAKICAgICAgICAgLy8gQmxhY2sgbGlzdCB0aGlzICJiYWQiIEFQLCB0aGlzIHdpbGwgY2F1c2UgYW4gYXR0ZW1wdCB0byBjb25uZWN0IHRvIGFub3RoZXIKICAgICAgICAgYmxhY2tsaXN0QXAoYXAuYnNzaWQpOwogICAgICAgICAvLyBJbml0aWF0ZSBhbiBhc3NvY2lhdGlvbiB0byBhbiBhbHRlcm5hdGUgQVAKLSAgICAgICAgbVdpZmlTdGF0ZVRyYWNrZXIucmVhc3NvY2lhdGUoKTsKKyAgICAgICAgbVdpZmlNYW5hZ2VyLnJlYXNzb2NpYXRlKCk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIGJsYWNrbGlzdEFwKFN0cmluZyBic3NpZCkgewpAQCAtNzYyLDEwICs3NjAsNyBAQAogICAgICAgICAvLyBCZWZvcmUgdGFraW5nIGFjdGlvbiwgbWFrZSBzdXJlIHdlIHNob3VsZCBub3QgY2FuY2VsIG91ciBwcm9jZXNzaW5nCiAgICAgICAgIGlmIChzaG91bGRDYW5jZWwoKSkgcmV0dXJuOwogICAgICAgICAKLSAgICAgICAgaWYgKCFtV2lmaVN0YXRlVHJhY2tlci5hZGRUb0JsYWNrbGlzdChic3NpZCkpIHsKLSAgICAgICAgICAgIC8vIFRoZXJlJ3MgYSBrbm93biBidWcgd2hlcmUgdGhpcyBtZXRob2QgcmV0dXJucyBmYWlsdXJlIG9uIHN1Y2Nlc3MKLSAgICAgICAgICAgIC8vU2xvZy5lKFRBRywgIkJsYWNrbGlzdGluZyAiICsgYnNzaWQgKyAiIGZhaWxlZCIpOwotICAgICAgICB9CisgICAgICAgIG1XaWZpTWFuYWdlci5hZGRUb0JsYWNrbGlzdChic3NpZCk7CiAKICAgICAgICAgaWYgKEQpIHsKICAgICAgICAgICAgIG15TG9nRCgiQmxhY2tsaXN0aW5nICIgKyBic3NpZCk7CkBAIC04NjAsMTAgKzg1NSw3IEBACiAgICAgICAgICAgICAgKiAoYW5kIGJsYWNrbGlzdGVkIHRoZW0pLiBDbGVhciB0aGUgYmxhY2tsaXN0IHNvIHRoZSBBUCB3aXRoIGJlc3QKICAgICAgICAgICAgICAqIHNpZ25hbCBpcyBjaG9zZW4uCiAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmICghbVdpZmlTdGF0ZVRyYWNrZXIuY2xlYXJCbGFja2xpc3QoKSkgewotICAgICAgICAgICAgICAgIC8vIFRoZXJlJ3MgYSBrbm93biBidWcgd2hlcmUgdGhpcyBtZXRob2QgcmV0dXJucyBmYWlsdXJlIG9uIHN1Y2Nlc3MKLSAgICAgICAgICAgICAgICAvL1Nsb2cuZShUQUcsICJDbGVhcmluZyBibGFja2xpc3QgZmFpbGVkIik7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBtV2lmaU1hbmFnZXIuY2xlYXJCbGFja2xpc3QoKTsKICAgICAgICAgICAgIAogICAgICAgICAgICAgaWYgKFYpIHsKICAgICAgICAgICAgICAgICBteUxvZ1YoImhhbmRsZVNsZWVwOiBTZXQgc3RhdGUgdG8gU0xFRVAgYW5kIGNsZWFyZWQgYmxhY2tsaXN0Iik7CkBAIC05MzQsNyArOTI2LDcgQEAKICAgICAgKiBzaG91bGQgcmV2ZXJ0IGFueXRoaW5nIGRvbmUgYnkgdGhlIHdhdGNoZG9nIG1vbml0b3JpbmcuCiAgICAgICovCiAgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZVJlc2V0KCkgewotICAgICAgICBtV2lmaVN0YXRlVHJhY2tlci5jbGVhckJsYWNrbGlzdCgpOworICAgICAgICBtV2lmaU1hbmFnZXIuY2xlYXJCbGFja2xpc3QoKTsKICAgICAgICAgc2V0SWRsZVN0YXRlKHRydWUpOwogICAgIH0KICAgICAKQEAgLTExNTEsNyArMTE0Myw3IEBACiAKICAgICAgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZVdpZmlTdGF0ZUNoYW5nZWQoaW50IHdpZmlTdGF0ZSkgewogICAgICAgICAgICAgaWYgKHdpZmlTdGF0ZSA9PSBXaWZpTWFuYWdlci5XSUZJX1NUQVRFX0RJU0FCTEVEKSB7Ci0gICAgICAgICAgICAgICAgcXVpdCgpOworICAgICAgICAgICAgICAgIG9uRGlzY29ubmVjdGVkKCk7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKHdpZmlTdGF0ZSA9PSBXaWZpTWFuYWdlci5XSUZJX1NUQVRFX0VOQUJMRUQpIHsKICAgICAgICAgICAgICAgICBvbkVuYWJsZWQoKTsKICAgICAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1dpbmRvd01hbmFnZXJTZXJ2aWNlLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9XaW5kb3dNYW5hZ2VyU2VydmljZS5qYXZhCmluZGV4IDQyMWQxYzQuLmQ1NzUwYzYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1dpbmRvd01hbmFnZXJTZXJ2aWNlLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvV2luZG93TWFuYWdlclNlcnZpY2UuamF2YQpAQCAtMTU4LDcgKzE1OCw2IEBACiAgICAgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUdfU1RBUlRJTkdfV0lORE9XID0gZmFsc2U7CiAgICAgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUdfUkVPUkRFUiA9IGZhbHNlOwogICAgIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHX1dBTExQQVBFUiA9IGZhbHNlOwotICAgIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHX0ZSRUVaRSA9IGZhbHNlOwogICAgIHN0YXRpYyBmaW5hbCBib29sZWFuIFNIT1dfVFJBTlNBQ1RJT05TID0gZmFsc2U7CiAgICAgc3RhdGljIGZpbmFsIGJvb2xlYW4gSElERV9TVEFDS19DUkFXTFMgPSB0cnVlOwogCkBAIC0xNzg4LDE4ICsxNzg3LDExIEBACiAgICAgICAgIGJvb2xlYW4gcmVwb3J0TmV3Q29uZmlnID0gZmFsc2U7CiAgICAgICAgIFdpbmRvd1N0YXRlIGF0dGFjaGVkV2luZG93ID0gbnVsbDsKICAgICAgICAgV2luZG93U3RhdGUgd2luID0gbnVsbDsKKyAgICAgICAgbG9uZyBvcmlnSWQ7CiAKICAgICAgICAgc3luY2hyb25pemVkKG1XaW5kb3dNYXApIHsKLSAgICAgICAgICAgIC8vIEluc3RhbnRpYXRpbmcgYSBEaXNwbGF5IHJlcXVpcmVzIHRhbGtpbmcgd2l0aCB0aGUgc2ltdWxhdG9yLAotICAgICAgICAgICAgLy8gc28gZG9uJ3QgZG8gaXQgdW50aWwgd2Uga25vdyB0aGUgc3lzdGVtIGlzIG1vc3RseSB1cCBhbmQKLSAgICAgICAgICAgIC8vIHJ1bm5pbmcuCiAgICAgICAgICAgICBpZiAobURpc3BsYXkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFdpbmRvd01hbmFnZXIgd20gPSAoV2luZG93TWFuYWdlciltQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuV0lORE9XX1NFUlZJQ0UpOwotICAgICAgICAgICAgICAgIG1EaXNwbGF5ID0gd20uZ2V0RGVmYXVsdERpc3BsYXkoKTsKLSAgICAgICAgICAgICAgICBtSW5pdGlhbERpc3BsYXlXaWR0aCA9IG1EaXNwbGF5LmdldFdpZHRoKCk7Ci0gICAgICAgICAgICAgICAgbUluaXRpYWxEaXNwbGF5SGVpZ2h0ID0gbURpc3BsYXkuZ2V0SGVpZ2h0KCk7Ci0gICAgICAgICAgICAgICAgbUlucHV0TWFuYWdlci5zZXREaXNwbGF5U2l6ZSgwLCBtSW5pdGlhbERpc3BsYXlXaWR0aCwgbUluaXRpYWxEaXNwbGF5SGVpZ2h0KTsKLSAgICAgICAgICAgICAgICByZXBvcnROZXdDb25maWcgPSB0cnVlOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkRpc3BsYXkgaGFzIG5vdCBiZWVuIGluaXRpYWxpYWxpemVkIik7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChtV2luZG93TWFwLmNvbnRhaW5zS2V5KGNsaWVudC5hc0JpbmRlcigpKSkgewpAQCAtMTkwNSw3ICsxODk3LDcgQEAKIAogICAgICAgICAgICAgcmVzID0gV2luZG93TWFuYWdlckltcGwuQUREX09LQVk7CiAKLSAgICAgICAgICAgIGZpbmFsIGxvbmcgb3JpZ0lkID0gQmluZGVyLmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CisgICAgICAgICAgICBvcmlnSWQgPSBCaW5kZXIuY2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKIAogICAgICAgICAgICAgaWYgKGFkZFRva2VuKSB7CiAgICAgICAgICAgICAgICAgbVRva2VuTWFwLnB1dChhdHRycy50b2tlbiwgdG9rZW4pOwpAQCAtMTk4MiwxNCArMTk3NCwxMCBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgLy8gc2VuZE5ld0NvbmZpZ3VyYXRpb24oKSBjaGVja3MgY2FsbGVyIHBlcm1pc3Npb25zIHNvIHdlIG11c3QgY2FsbCBpdCB3aXRoCi0gICAgICAgIC8vIHByaXZpbGVnZS4gIHVwZGF0ZU9yaWVudGF0aW9uRnJvbUFwcFRva2VucygpIGNsZWFycyBhbmQgcmVzZXRzIHRoZSBjYWxsZXIKLSAgICAgICAgLy8gaWRlbnRpdHkgYW55d2F5LCBzbyBpdCdzIHNhZmUgdG8ganVzdCBjbGVhciAmIHJlc3RvcmUgYXJvdW5kIHRoaXMgd2hvbGUKLSAgICAgICAgLy8gYmxvY2suCi0gICAgICAgIGZpbmFsIGxvbmcgb3JpZ0lkID0gQmluZGVyLmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CiAgICAgICAgIGlmIChyZXBvcnROZXdDb25maWcpIHsKICAgICAgICAgICAgIHNlbmROZXdDb25maWd1cmF0aW9uKCk7CiAgICAgICAgIH0KKwogICAgICAgICBCaW5kZXIucmVzdG9yZUNhbGxpbmdJZGVudGl0eShvcmlnSWQpOwogCiAgICAgICAgIHJldHVybiByZXM7CkBAIC0zMTAyLDggKzMwOTAsMTEgQEAKICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgIH0gZWxzZSBpZiAoY3VycmVudENvbmZpZyAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgLy8gTm8gb2J2aW91cyBhY3Rpb24gd2UgbmVlZCB0byB0YWtlLCBidXQgaWYgb3VyIGN1cnJlbnQKLSAgICAgICAgICAgICAgICAvLyBzdGF0ZSBtaXNtYXRjaGVzIHRoZSBhY3Rpdml0eSBtYWFuYWdlcidzLCB1cGRhdGUgaXQKKyAgICAgICAgICAgICAgICAvLyBzdGF0ZSBtaXNtYXRjaGVzIHRoZSBhY3Rpdml0eSBtYW5hZ2VyJ3MsIHVwZGF0ZSBpdCwKKyAgICAgICAgICAgICAgICAvLyBkaXNyZWdhcmRpbmcgZm9udCBzY2FsZSwgd2hpY2ggc2hvdWxkIHJlbWFpbiBzZXQgdG8KKyAgICAgICAgICAgICAgICAvLyB0aGUgdmFsdWUgb2YgdGhlIHByZXZpb3VzIGNvbmZpZ3VyYXRpb24uCiAgICAgICAgICAgICAgICAgbVRlbXBDb25maWd1cmF0aW9uLnNldFRvRGVmYXVsdHMoKTsKKyAgICAgICAgICAgICAgICBtVGVtcENvbmZpZ3VyYXRpb24uZm9udFNjYWxlID0gY3VycmVudENvbmZpZy5mb250U2NhbGU7CiAgICAgICAgICAgICAgICAgaWYgKGNvbXB1dGVOZXdDb25maWd1cmF0aW9uTG9ja2VkKG1UZW1wQ29uZmlndXJhdGlvbikpIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRDb25maWcuZGlmZihtVGVtcENvbmZpZ3VyYXRpb24pICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG1XYWl0aW5nRm9yQ29uZmlnID0gdHJ1ZTsKQEAgLTQ0MjcsOCArNDQxOCw3IEBACiAgICAgICAgICAgICBmaW5hbCBpbnQgTiA9IG1XaW5kb3dzLnNpemUoKTsKICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxOOyBpKyspIHsKICAgICAgICAgICAgICAgICBXaW5kb3dTdGF0ZSB3ID0gbVdpbmRvd3MuZ2V0KGkpOwotICAgICAgICAgICAgICAgIGlmICh3LmlzVmlzaWJsZUx3KCkgJiYgIXcubU9ic2N1cmVkCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAody5tT3JpZW50YXRpb25DaGFuZ2luZyB8fCAhdy5pc0RyYXduTHcoKSkpIHsKKyAgICAgICAgICAgICAgICBpZiAody5pc1Zpc2libGVMdygpICYmICF3Lm1PYnNjdXJlZCAmJiAhdy5pc0RyYXduTHcoKSkgewogICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtNTU5Miw2ICs1NTgyLDIyIEBACiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgc3lzdGVtUmVhZHkoKSB7CisgICAgICAgIHN5bmNocm9uaXplZChtV2luZG93TWFwKSB7CisgICAgICAgICAgICBpZiAobURpc3BsYXkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkRpc3BsYXkgYWxyZWFkeSBpbml0aWFsaXplZCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgV2luZG93TWFuYWdlciB3bSA9IChXaW5kb3dNYW5hZ2VyKW1Db250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5XSU5ET1dfU0VSVklDRSk7CisgICAgICAgICAgICBtRGlzcGxheSA9IHdtLmdldERlZmF1bHREaXNwbGF5KCk7CisgICAgICAgICAgICBtSW5pdGlhbERpc3BsYXlXaWR0aCA9IG1EaXNwbGF5LmdldFdpZHRoKCk7CisgICAgICAgICAgICBtSW5pdGlhbERpc3BsYXlIZWlnaHQgPSBtRGlzcGxheS5nZXRIZWlnaHQoKTsKKyAgICAgICAgICAgIG1JbnB1dE1hbmFnZXIuc2V0RGlzcGxheVNpemUoMCwgbUluaXRpYWxEaXNwbGF5V2lkdGgsIG1Jbml0aWFsRGlzcGxheUhlaWdodCk7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgbUFjdGl2aXR5TWFuYWdlci51cGRhdGVDb25maWd1cmF0aW9uKG51bGwpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIAogICAgICAgICBtUG9saWN5LnN5c3RlbVJlYWR5KCk7CiAgICAgfQogCkBAIC02ODY5LDcgKzY4NzUsNyBAQAogICAgICAgICAgICAgZmluYWwgQXBwV2luZG93VG9rZW4gYXRva2VuID0gbUFwcFRva2VuOwogICAgICAgICAgICAgcmV0dXJuIG1TdXJmYWNlICE9IG51bGwgJiYgIW1BdHRhY2hlZEhpZGRlbgogICAgICAgICAgICAgICAgICAgICAmJiAoYXRva2VuID09IG51bGwgPyBtUG9saWN5VmlzaWJpbGl0eSA6ICFhdG9rZW4uaGlkZGVuUmVxdWVzdGVkKQotICAgICAgICAgICAgICAgICAgICAmJiAobU9yaWVudGF0aW9uQ2hhbmdpbmcgfHwgKCFtRHJhd1BlbmRpbmcgJiYgIW1Db21taXREcmF3UGVuZGluZykpCisgICAgICAgICAgICAgICAgICAgICYmICFtRHJhd1BlbmRpbmcgJiYgIW1Db21taXREcmF3UGVuZGluZwogICAgICAgICAgICAgICAgICAgICAmJiAhbUV4aXRpbmcgJiYgIW1EZXN0cm95aW5nOwogICAgICAgICB9CiAKQEAgLTY5NzMsMTQgKzY5NzksMTIgQEAKIAogICAgICAgICAvKioKICAgICAgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSB3aW5kb3cgaGFzIGEgc3VyZmFjZSB0aGF0IGl0IGhhcyBkcmF3biBhCi0gICAgICAgICAqIGNvbXBsZXRlIFVJIGluIHRvLiAgTm90ZSB0aGF0IHRoaXMgcmV0dXJucyB0cnVlIGlmIHRoZSBvcmllbnRhdGlvbgotICAgICAgICAgKiBpcyBjaGFuZ2luZyBldmVuIGlmIHRoZSB3aW5kb3cgaGFzbid0IHJlZHJhd24gYmVjYXVzZSB3ZSBkb24ndCB3YW50Ci0gICAgICAgICAqIHRvIHN0b3AgdGhpbmdzIGZyb20gZXhlY3V0aW5nIGR1cmluZyB0aGF0IHRpbWUuCisgICAgICAgICAqIGNvbXBsZXRlIFVJIGluIHRvLgogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIGJvb2xlYW4gaXNEcmF3bkx3KCkgewogICAgICAgICAgICAgZmluYWwgQXBwV2luZG93VG9rZW4gYXRva2VuID0gbUFwcFRva2VuOwogICAgICAgICAgICAgcmV0dXJuIG1TdXJmYWNlICE9IG51bGwgJiYgIW1EZXN0cm95aW5nCi0gICAgICAgICAgICAgICAgJiYgKG1PcmllbnRhdGlvbkNoYW5naW5nIHx8ICghbURyYXdQZW5kaW5nICYmICFtQ29tbWl0RHJhd1BlbmRpbmcpKTsKKyAgICAgICAgICAgICAgICAmJiAhbURyYXdQZW5kaW5nICYmICFtQ29tbWl0RHJhd1BlbmRpbmc7CiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgYm9vbGVhbiBmaWxsc1NjcmVlbkx3KGludCBzY3JlZW5XaWR0aCwgaW50IHNjcmVlbkhlaWdodCwKQEAgLTg1MDEsNiArODUwNSwxMSBAQAogCiAgICAgcHJpdmF0ZSBmaW5hbCB2b2lkIHBlcmZvcm1MYXlvdXRBbmRQbGFjZVN1cmZhY2VzTG9ja2VkSW5uZXIoCiAgICAgICAgICAgICBib29sZWFuIHJlY292ZXJpbmdNZW1vcnkpIHsKKyAgICAgICAgaWYgKG1EaXNwbGF5ID09IG51bGwpIHsKKyAgICAgICAgICAgIFNsb2cuaShUQUcsICJza2lwcGluZyBwZXJmb3JtTGF5b3V0QW5kUGxhY2VTdXJmYWNlc0xvY2tlZElubmVyIHdpdGggbm8gbURpc3BsYXkiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCiAgICAgICAgIGZpbmFsIGxvbmcgY3VycmVudFRpbWUgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKICAgICAgICAgZmluYWwgaW50IGR3ID0gbURpc3BsYXkuZ2V0V2lkdGgoKTsKICAgICAgICAgZmluYWwgaW50IGRoID0gbURpc3BsYXkuZ2V0SGVpZ2h0KCk7CkBAIC05Mjg5LDEyICs5Mjk4LDYgQEAKICAgICAgICAgICAgICAgICAgICAgaWYgKHcubUF0dGFjaGVkSGlkZGVuIHx8ICF3LmlzUmVhZHlGb3JEaXNwbGF5KCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdy5tTGFzdEhpZGRlbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZHVtcCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVR19DT05GSUdVUkFUSU9OKSBTbG9nLnYoVEFHLCAiV2luZG93IGhpZGluZzogd2FpdGluZ1RvU2hvdz0iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHcubVJvb3RUb2tlbi53YWl0aW5nVG9TaG93ICsgIiBwb2x2aXM9IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB3Lm1Qb2xpY3lWaXNpYmlsaXR5ICsgIiBhdHRoaWQ9IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB3Lm1BdHRhY2hlZEhpZGRlbiArICIgdG9raGlkPSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdy5tUm9vdFRva2VuLmhpZGRlbiArICIgdmlzPSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdy5tVmlld1Zpc2liaWxpdHkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHcubUxhc3RIaWRkZW4gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChTSE9XX1RSQU5TQUNUSU9OUykgbG9nU3VyZmFjZSh3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhJREUgKHBlcmZvcm1MYXlvdXQpIiwgbnVsbCk7CkBAIC05Njk1LDMwICs5Njk4LDI2IEBACiAgICAgICAgIH0gZWxzZSBpZiAoYW5pbWF0aW5nKSB7CiAgICAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uTG9ja2VkKGN1cnJlbnRUaW1lKygxMDAwLzYwKS1TeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKSk7CiAgICAgICAgIH0KLSAgICAgICAgCisKICAgICAgICAgbUlucHV0TW9uaXRvci51cGRhdGVJbnB1dFdpbmRvd3NMdygpOwotICAgICAgICAKLSAgICAgICAgaWYgKERFQlVHX0ZSRUVaRSkgU2xvZy52KFRBRywgIkxheW91dDogbURpc3BsYXlGcm96ZW49IiArIG1EaXNwbGF5RnJvemVuCi0gICAgICAgICAgICAgICAgKyAiIGhvbGRTY3JlZW49IiArIGhvbGRTY3JlZW4pOwotICAgICAgICBpZiAoIW1EaXNwbGF5RnJvemVuKSB7Ci0gICAgICAgICAgICBzZXRIb2xkU2NyZWVuTG9ja2VkKGhvbGRTY3JlZW4gIT0gbnVsbCk7Ci0gICAgICAgICAgICBpZiAoc2NyZWVuQnJpZ2h0bmVzcyA8IDAgfHwgc2NyZWVuQnJpZ2h0bmVzcyA+IDEuMGYpIHsKLSAgICAgICAgICAgICAgICBtUG93ZXJNYW5hZ2VyLnNldFNjcmVlbkJyaWdodG5lc3NPdmVycmlkZSgtMSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1Qb3dlck1hbmFnZXIuc2V0U2NyZWVuQnJpZ2h0bmVzc092ZXJyaWRlKChpbnQpCi0gICAgICAgICAgICAgICAgICAgICAgICAoc2NyZWVuQnJpZ2h0bmVzcyAqIFBvd2VyLkJSSUdIVE5FU1NfT04pKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChidXR0b25CcmlnaHRuZXNzIDwgMCB8fCBidXR0b25CcmlnaHRuZXNzID4gMS4wZikgewotICAgICAgICAgICAgICAgIG1Qb3dlck1hbmFnZXIuc2V0QnV0dG9uQnJpZ2h0bmVzc092ZXJyaWRlKC0xKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbVBvd2VyTWFuYWdlci5zZXRCdXR0b25CcmlnaHRuZXNzT3ZlcnJpZGUoKGludCkKLSAgICAgICAgICAgICAgICAgICAgICAgIChidXR0b25CcmlnaHRuZXNzICogUG93ZXIuQlJJR0hUTkVTU19PTikpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGhvbGRTY3JlZW4gIT0gbUhvbGRpbmdTY3JlZW5PbikgewotICAgICAgICAgICAgICAgIG1Ib2xkaW5nU2NyZWVuT24gPSBob2xkU2NyZWVuOwotICAgICAgICAgICAgICAgIE1lc3NhZ2UgbSA9IG1ILm9idGFpbk1lc3NhZ2UoSC5IT0xEX1NDUkVFTl9DSEFOR0VELCBob2xkU2NyZWVuKTsKLSAgICAgICAgICAgICAgICBtSC5zZW5kTWVzc2FnZShtKTsKLSAgICAgICAgICAgIH0KKworICAgICAgICBzZXRIb2xkU2NyZWVuTG9ja2VkKGhvbGRTY3JlZW4gIT0gbnVsbCk7CisgICAgICAgIGlmIChzY3JlZW5CcmlnaHRuZXNzIDwgMCB8fCBzY3JlZW5CcmlnaHRuZXNzID4gMS4wZikgeworICAgICAgICAgICAgbVBvd2VyTWFuYWdlci5zZXRTY3JlZW5CcmlnaHRuZXNzT3ZlcnJpZGUoLTEpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVBvd2VyTWFuYWdlci5zZXRTY3JlZW5CcmlnaHRuZXNzT3ZlcnJpZGUoKGludCkKKyAgICAgICAgICAgICAgICAgICAgKHNjcmVlbkJyaWdodG5lc3MgKiBQb3dlci5CUklHSFRORVNTX09OKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJ1dHRvbkJyaWdodG5lc3MgPCAwIHx8IGJ1dHRvbkJyaWdodG5lc3MgPiAxLjBmKSB7CisgICAgICAgICAgICBtUG93ZXJNYW5hZ2VyLnNldEJ1dHRvbkJyaWdodG5lc3NPdmVycmlkZSgtMSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtUG93ZXJNYW5hZ2VyLnNldEJ1dHRvbkJyaWdodG5lc3NPdmVycmlkZSgoaW50KQorICAgICAgICAgICAgICAgICAgICAoYnV0dG9uQnJpZ2h0bmVzcyAqIFBvd2VyLkJSSUdIVE5FU1NfT04pKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaG9sZFNjcmVlbiAhPSBtSG9sZGluZ1NjcmVlbk9uKSB7CisgICAgICAgICAgICBtSG9sZGluZ1NjcmVlbk9uID0gaG9sZFNjcmVlbjsKKyAgICAgICAgICAgIE1lc3NhZ2UgbSA9IG1ILm9idGFpbk1lc3NhZ2UoSC5IT0xEX1NDUkVFTl9DSEFOR0VELCBob2xkU2NyZWVuKTsKKyAgICAgICAgICAgIG1ILnNlbmRNZXNzYWdlKG0pOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKG1UdXJuT25TY3JlZW4pIHsKQEAgLTEwMDA3LDggKzEwMDA2LDYgQEAKICAgICAgICAgICAgIG1GcmVlemVHY1BlbmRpbmcgPSBub3c7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoREVCVUdfRlJFRVpFKSBTbG9nLnYoVEFHLCAiKioqIEZSRUVaSU5HIERJU1BMQVkiLCBuZXcgUnVudGltZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgCiAgICAgICAgIG1EaXNwbGF5RnJvemVuID0gdHJ1ZTsKICAgICAgICAgCiAgICAgICAgIG1JbnB1dE1vbml0b3IuZnJlZXplSW5wdXREaXNwYXRjaGluZ0x3KCk7CkBAIC0xMDAzNSw4ICsxMDAzMiw2IEBACiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICAgICAgCi0gICAgICAgIGlmIChERUJVR19GUkVFWkUpIFNsb2cudihUQUcsICIqKiogVU5GUkVFWklORyBESVNQTEFZIiwgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKSk7Ci0gICAgICAgIAogICAgICAgICBtRGlzcGxheUZyb3plbiA9IGZhbHNlOwogICAgICAgICBtSC5yZW1vdmVNZXNzYWdlcyhILkFQUF9GUkVFWkVfVElNRU9VVCk7CiAgICAgICAgIGlmIChQUk9GSUxFX09SSUVOVEFUSU9OKSB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hbS9BY3Rpdml0eU1hbmFnZXJTZXJ2aWNlLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hbS9BY3Rpdml0eU1hbmFnZXJTZXJ2aWNlLmphdmEKaW5kZXggMjFkZjE0YS4uNTYxNTliNSAxMDA2NDQKLS0tIGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvYW0vQWN0aXZpdHlNYW5hZ2VyU2VydmljZS5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2FtL0FjdGl2aXR5TWFuYWdlclNlcnZpY2UuamF2YQpAQCAtMjM3NSw2ICsyMzc1LDEwIEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAKICAgICAgICAgICAgIGlmIChwcm9jLnRocmVhZCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKHByb2MucGlkID09IFByb2Nlc3MubXlQaWQoKSkgeworICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJjcmFzaEFwcGxpY2F0aW9uOiB0cnlpbmcgdG8gY3Jhc2ggc2VsZiEiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBsb25nIGlkZW50ID0gQmluZGVyLmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CiAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgcHJvYy50aHJlYWQuc2NoZWR1bGVDcmFzaChtZXNzYWdlKTsKQEAgLTExODczLDcgKzExODc3LDY5IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKKyAgICBwdWJsaWMgYm9vbGVhbiBkdW1wSGVhcChTdHJpbmcgcHJvY2VzcywgYm9vbGVhbiBtYW5hZ2VkLAorICAgICAgICAgICAgU3RyaW5nIHBhdGgsIFBhcmNlbEZpbGVEZXNjcmlwdG9yIGZkKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICAgICAgLy8gbm90ZTogaGlqYWNraW5nIFNFVF9BQ1RJVklUWV9XQVRDSEVSLCBidXQgc2hvdWxkIGJlIGNoYW5nZWQgdG8KKyAgICAgICAgICAgICAgICAvLyBpdHMgb3duIHBlcm1pc3Npb24gKHNhbWUgYXMgcHJvZmlsZUNvbnRyb2wpLgorICAgICAgICAgICAgICAgIGlmIChjaGVja0NhbGxpbmdQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5TRVRfQUNUSVZJVFlfV0FUQ0hFUikKKyAgICAgICAgICAgICAgICAgICAgICAgICE9IFBhY2thZ2VNYW5hZ2VyLlBFUk1JU1NJT05fR1JBTlRFRCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2VjdXJpdHlFeGNlcHRpb24oIlJlcXVpcmVzIHBlcm1pc3Npb24gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLlNFVF9BQ1RJVklUWV9XQVRDSEVSKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoZmQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJudWxsIGZkIik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgUHJvY2Vzc1JlY29yZCBwcm9jID0gbnVsbDsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBpbnQgcGlkID0gSW50ZWdlci5wYXJzZUludChwcm9jZXNzKTsKKyAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtUGlkc1NlbGZMb2NrZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb2MgPSBtUGlkc1NlbGZMb2NrZWQuZ2V0KHBpZCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChwcm9jID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgSGFzaE1hcDxTdHJpbmcsIFNwYXJzZUFycmF5PFByb2Nlc3NSZWNvcmQ+PiBhbGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IG1Qcm9jZXNzTmFtZXMuZ2V0TWFwKCk7CisgICAgICAgICAgICAgICAgICAgIFNwYXJzZUFycmF5PFByb2Nlc3NSZWNvcmQ+IHByb2NzID0gYWxsLmdldChwcm9jZXNzKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHByb2NzICE9IG51bGwgJiYgcHJvY3Muc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJvYyA9IHByb2NzLnZhbHVlQXQoMCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAocHJvYyA9PSBudWxsIHx8IHByb2MudGhyZWFkID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5rbm93biBwcm9jZXNzOiAiICsgcHJvY2Vzcyk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYm9vbGVhbiBpc1NlY3VyZSA9ICIxIi5lcXVhbHMoU3lzdGVtUHJvcGVydGllcy5nZXQoU1lTVEVNX1NFQ1VSRSwgIjAiKSk7CisgICAgICAgICAgICAgICAgaWYgKGlzU2VjdXJlKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICgocHJvYy5pbmZvLmZsYWdzJkFwcGxpY2F0aW9uSW5mby5GTEFHX0RFQlVHR0FCTEUpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTZWN1cml0eUV4Y2VwdGlvbigiUHJvY2VzcyBub3QgZGVidWdnYWJsZTogIiArIHByb2MpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJvYy50aHJlYWQuZHVtcEhlYXAobWFuYWdlZCwgcGF0aCwgZmQpOworICAgICAgICAgICAgICAgIGZkID0gbnVsbDsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlByb2Nlc3MgZGlzYXBwZWFyZWQiKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChmZCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgZmQuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCiAgICAgLyoqIEluIHRoaXMgbWV0aG9kIHdlIHRyeSB0byBhY3F1aXJlIG91ciBsb2NrIHRvIG1ha2Ugc3VyZSB0aGF0IHdlIGhhdmUgbm90IGRlYWRsb2NrZWQgKi8KICAgICBwdWJsaWMgdm9pZCBtb25pdG9yKCkgewogICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsgfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvY29ubmVjdGl2aXR5L1RldGhlcmluZy5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvY29ubmVjdGl2aXR5L1RldGhlcmluZy5qYXZhCmluZGV4IGViMGE4YTkuLjUzY2U1YzAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2Nvbm5lY3Rpdml0eS9UZXRoZXJpbmcuamF2YQorKysgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9jb25uZWN0aXZpdHkvVGV0aGVyaW5nLmphdmEKQEAgLTE5LDggKzE5LDggQEAKIGltcG9ydCBhbmRyb2lkLmFwcC5Ob3RpZmljYXRpb247CiBpbXBvcnQgYW5kcm9pZC5hcHAuTm90aWZpY2F0aW9uTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50OworaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aFBhbjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7CkBAIC0zMiw5ICszMiw5IEBACiBpbXBvcnQgYW5kcm9pZC5uZXQuSUNvbm5lY3Rpdml0eU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5uZXQuSU5ldHdvcmtNYW5hZ2VtZW50RXZlbnRPYnNlcnZlcjsKIGltcG9ydCBhbmRyb2lkLm5ldC5OZXR3b3JrSW5mbzsKLWltcG9ydCBhbmRyb2lkLm5ldC5OZXR3b3JrVXRpbHM7CiBpbXBvcnQgYW5kcm9pZC5vcy5CaW5kZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5FbnZpcm9ubWVudDsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyVGhyZWFkOwogaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKIGltcG9ydCBhbmRyb2lkLm9zLklOZXR3b3JrTWFuYWdlbWVudFNlcnZpY2U7CkBAIC01Myw2ICs1Myw3IEBACiBpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwogaW1wb3J0IGphdmEudXRpbC5TZXQ7CiAvKioKICAqIEBoaWRlCkBAIC02NSw3ICs2Niw4IEBACiBwdWJsaWMgY2xhc3MgVGV0aGVyaW5nIGV4dGVuZHMgSU5ldHdvcmtNYW5hZ2VtZW50RXZlbnRPYnNlcnZlci5TdHViIHsKIAogICAgIHByaXZhdGUgQ29udGV4dCBtQ29udGV4dDsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBUQUcgPSAiVGV0aGVyaW5nIjsKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgVEFHID0gIlRldGhlcmluZyI7CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYm9vbGVhbiBERUJVRyA9IGZhbHNlOwogCiAgICAgcHJpdmF0ZSBib29sZWFuIG1Cb290ZWQgPSBmYWxzZTsKICAgICAvL3VzZWQgdG8gcmVtZW1iZXIgaWYgd2UgZ290IGNvbm5lY3RlZCBiZWZvcmUgYm9vdCBmaW5pc2hlZApAQCAtNzQsNiArNzYsNyBAQAogICAgIC8vIFRPRE8gLSByZW1vdmUgYm90aCBvZiB0aGVzZSAtIHNob3VsZCBiZSBwYXJ0IG9mIGludGVyZmFjZSBpbnNwZWN0aW9uL3NlbGVjdGlvbiBzdHVmZgogICAgIHByaXZhdGUgU3RyaW5nW10gbVRldGhlcmFibGVVc2JSZWdleHM7CiAgICAgcHJpdmF0ZSBTdHJpbmdbXSBtVGV0aGVyYWJsZVdpZmlSZWdleHM7CisgICAgcHJpdmF0ZSBTdHJpbmdbXSBtVGV0aGVyYWJsZUJsdWV0b290aFJlZ2V4czsKICAgICBwcml2YXRlIFN0cmluZ1tdIG1VcHN0cmVhbUlmYWNlUmVnZXhzOwogCiAgICAgcHJpdmF0ZSBMb29wZXIgbUxvb3BlcjsKQEAgLTkzLDYgKzk2LDggQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREhDUF9ERUZBVUxUX1JBTkdFMV9TVE9QICA9ICIxOTIuMTY4LjQyLjI1NCI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERIQ1BfREVGQVVMVF9SQU5HRTJfU1RBUlQgPSAiMTkyLjE2OC40My4yIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREhDUF9ERUZBVUxUX1JBTkdFMl9TVE9QICA9ICIxOTIuMTY4LjQzLjI1NCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERIQ1BfREVGQVVMVF9SQU5HRTNfU1RBUlQgPSAiMTkyLjE2OC40NC45IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREhDUF9ERUZBVUxUX1JBTkdFM19TVE9QICA9ICIxOTIuMTY4LjQ0LjI1NCI7CiAKICAgICBwcml2YXRlIFN0cmluZ1tdIG1EbnNTZXJ2ZXJzOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBETlNfREVGQVVMVF9TRVJWRVIxID0gIjguOC44LjgiOwpAQCAtMTEwLDYgKzExNSwxNCBAQAogICAgIHByaXZhdGUgYm9vbGVhbiBtVXNiTWFzc1N0b3JhZ2VPZmY7ICAvLyB0cmFjayB0aGUgc3RhdHVzIG9mIFVTQiBNYXNzIFN0b3JhZ2UKICAgICBwcml2YXRlIGJvb2xlYW4gbVVzYkNvbm5lY3RlZDsgICAgICAgLy8gdHJhY2sgdGhlIHN0YXR1cyBvZiBVU0IgY29ubmVjdGlvbgogCisgICAgLy8gbVVzYkhhbmRsZXIgbWVzc2FnZQorICAgIHN0YXRpYyBmaW5hbCBpbnQgVVNCX1NUQVRFX0NIQU5HRSA9IDE7CisgICAgc3RhdGljIGZpbmFsIGludCBVU0JfRElTQ09OTkVDVEVEID0gMDsKKyAgICBzdGF0aWMgZmluYWwgaW50IFVTQl9DT05ORUNURUQgPSAxOworCisgICAgLy8gVGltZSB0byBkZWxheSBiZWZvcmUgcHJvY2Vzc2luZyBVU0IgZGlzY29ubmVjdCBldmVudHMKKyAgICBzdGF0aWMgZmluYWwgbG9uZyBVU0JfRElTQ09OTkVDVF9ERUxBWSA9IDEwMDA7CisKICAgICBwdWJsaWMgVGV0aGVyaW5nKENvbnRleHQgY29udGV4dCwgTG9vcGVyIGxvb3BlcikgewogICAgICAgICBMb2cuZChUQUcsICJUZXRoZXJpbmcgc3RhcnRpbmciKTsKICAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OwpAQCAtMTUyLDExICsxNjUsMTMgQEAKICAgICAgICAgbURoY3BSYW5nZSA9IGNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0U3RyaW5nQXJyYXkoCiAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hcnJheS5jb25maWdfdGV0aGVyX2RoY3BfcmFuZ2UpOwogICAgICAgICBpZiAoKG1EaGNwUmFuZ2UubGVuZ3RoID09IDApIHx8IChtRGhjcFJhbmdlLmxlbmd0aCAlIDIgPT0xKSkgewotICAgICAgICAgICAgbURoY3BSYW5nZSA9IG5ldyBTdHJpbmdbNF07CisgICAgICAgICAgICBtRGhjcFJhbmdlID0gbmV3IFN0cmluZ1s2XTsKICAgICAgICAgICAgIG1EaGNwUmFuZ2VbMF0gPSBESENQX0RFRkFVTFRfUkFOR0UxX1NUQVJUOwogICAgICAgICAgICAgbURoY3BSYW5nZVsxXSA9IERIQ1BfREVGQVVMVF9SQU5HRTFfU1RPUDsKICAgICAgICAgICAgIG1EaGNwUmFuZ2VbMl0gPSBESENQX0RFRkFVTFRfUkFOR0UyX1NUQVJUOwogICAgICAgICAgICAgbURoY3BSYW5nZVszXSA9IERIQ1BfREVGQVVMVF9SQU5HRTJfU1RPUDsKKyAgICAgICAgICAgIG1EaGNwUmFuZ2VbNF0gPSBESENQX0RFRkFVTFRfUkFOR0UzX1NUQVJUOworICAgICAgICAgICAgbURoY3BSYW5nZVs1XSA9IERIQ1BfREVGQVVMVF9SQU5HRTNfU1RPUDsKICAgICAgICAgfQogICAgICAgICBtRHVuUmVxdWlyZWQgPSBmYWxzZTsgLy8gcmVzYW1wbGUgd2hlbiB3ZSB0dXJuIG9uCiAKQEAgLTE2NCw2ICsxNzksOCBAQAogICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYXJyYXkuY29uZmlnX3RldGhlcl91c2JfcmVnZXhzKTsKICAgICAgICAgbVRldGhlcmFibGVXaWZpUmVnZXhzID0gY29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRTdHJpbmdBcnJheSgKICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmFycmF5LmNvbmZpZ190ZXRoZXJfd2lmaV9yZWdleHMpOworICAgICAgICBtVGV0aGVyYWJsZUJsdWV0b290aFJlZ2V4cyA9IGNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0U3RyaW5nQXJyYXkoCisgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hcnJheS5jb25maWdfdGV0aGVyX2JsdWV0b290aF9yZWdleHMpOwogICAgICAgICBtVXBzdHJlYW1JZmFjZVJlZ2V4cyA9IGNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0U3RyaW5nQXJyYXkoCiAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hcnJheS5jb25maWdfdGV0aGVyX3Vwc3RyZWFtX3JlZ2V4cyk7CiAKQEAgLTE3NCw3ICsxOTEsNyBAQAogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIGludGVyZmFjZUxpbmtTdGF0dXNDaGFuZ2VkKFN0cmluZyBpZmFjZSwgYm9vbGVhbiBsaW5rKSB7Ci0gICAgICAgIExvZy5kKFRBRywgImludGVyZmFjZUxpbmtTdGF0dXNDaGFuZ2VkICIgKyBpZmFjZSArICIsICIgKyBsaW5rKTsKKyAgICAgICAgaWYgKERFQlVHKSBMb2cuZChUQUcsICJpbnRlcmZhY2VMaW5rU3RhdHVzQ2hhbmdlZCAiICsgaWZhY2UgKyAiLCAiICsgbGluayk7CiAgICAgICAgIGJvb2xlYW4gZm91bmQgPSBmYWxzZTsKICAgICAgICAgYm9vbGVhbiB1c2IgPSBmYWxzZTsKICAgICAgICAgaWYgKGlzV2lmaShpZmFjZSkpIHsKQEAgLTE4Miw2ICsxOTksOCBAQAogICAgICAgICB9IGVsc2UgaWYgKGlzVXNiKGlmYWNlKSkgewogICAgICAgICAgICAgZm91bmQgPSB0cnVlOwogICAgICAgICAgICAgdXNiID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIGlmIChpc0JsdWV0b290aChpZmFjZSkpIHsKKyAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKICAgICAgICAgfQogICAgICAgICBpZiAoZm91bmQgPT0gZmFsc2UpIHJldHVybjsKIApAQCAtMjE2LDYgKzIzNSwxMiBAQAogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCisgICAgcHVibGljIGJvb2xlYW4gaXNCbHVldG9vdGgoU3RyaW5nIGlmYWNlKSB7CisgICAgICAgIGZvciAoU3RyaW5nIHJlZ2V4IDogbVRldGhlcmFibGVCbHVldG9vdGhSZWdleHMpIHsKKyAgICAgICAgICAgIGlmIChpZmFjZS5tYXRjaGVzKHJlZ2V4KSkgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KICAgICBwdWJsaWMgdm9pZCBpbnRlcmZhY2VBZGRlZChTdHJpbmcgaWZhY2UpIHsKICAgICAgICAgSUJpbmRlciBiID0gU2VydmljZU1hbmFnZXIuZ2V0U2VydmljZShDb250ZXh0Lk5FVFdPUktNQU5BR0VNRU5UX1NFUlZJQ0UpOwogICAgICAgICBJTmV0d29ya01hbmFnZW1lbnRTZXJ2aWNlIHNlcnZpY2UgPSBJTmV0d29ya01hbmFnZW1lbnRTZXJ2aWNlLlN0dWIuYXNJbnRlcmZhY2UoYik7CkBAIC0yMjgsMjkgKzI1MywzNCBAQAogICAgICAgICAgICAgZm91bmQgPSB0cnVlOwogICAgICAgICAgICAgdXNiID0gdHJ1ZTsKICAgICAgICAgfQorICAgICAgICBpZiAoaXNCbHVldG9vdGgoaWZhY2UpKSB7CisgICAgICAgICAgICBmb3VuZCA9IHRydWU7CisgICAgICAgIH0KICAgICAgICAgaWYgKGZvdW5kID09IGZhbHNlKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsIGlmYWNlICsgIiBpcyBub3QgYSB0ZXRoZXJhYmxlIGlmYWNlLCBpZ25vcmluZyIpOworICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cuZChUQUcsIGlmYWNlICsgIiBpcyBub3QgYSB0ZXRoZXJhYmxlIGlmYWNlLCBpZ25vcmluZyIpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKICAgICAgICAgc3luY2hyb25pemVkIChtSWZhY2VzKSB7CiAgICAgICAgICAgICBUZXRoZXJJbnRlcmZhY2VTTSBzbSA9IG1JZmFjZXMuZ2V0KGlmYWNlKTsKICAgICAgICAgICAgIGlmIChzbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiYWN0aXZlIGlmYWNlICgiICsgaWZhY2UgKyAiKSByZXBvcnRlZCBhcyBhZGRlZCwgaWdub3JpbmciKTsKKyAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy5kKFRBRywgImFjdGl2ZSBpZmFjZSAoIiArIGlmYWNlICsgIikgcmVwb3J0ZWQgYXMgYWRkZWQsIGlnbm9yaW5nIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgc20gPSBuZXcgVGV0aGVySW50ZXJmYWNlU00oaWZhY2UsIG1Mb29wZXIsIHVzYik7CiAgICAgICAgICAgICBtSWZhY2VzLnB1dChpZmFjZSwgc20pOwogICAgICAgICAgICAgc20uc3RhcnQoKTsKICAgICAgICAgfQotICAgICAgICBMb2cuZChUQUcsICJpbnRlcmZhY2VBZGRlZCA6IiArIGlmYWNlKTsKKyAgICAgICAgaWYgKERFQlVHKSBMb2cuZChUQUcsICJpbnRlcmZhY2VBZGRlZCA6IiArIGlmYWNlKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBpbnRlcmZhY2VSZW1vdmVkKFN0cmluZyBpZmFjZSkgewogICAgICAgICBzeW5jaHJvbml6ZWQgKG1JZmFjZXMpIHsKICAgICAgICAgICAgIFRldGhlckludGVyZmFjZVNNIHNtID0gbUlmYWNlcy5nZXQoaWZhY2UpOwogICAgICAgICAgICAgaWYgKHNtID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJhdHRlbXB0aW5nIHRvIHJlbW92ZSB1bmtub3duIGlmYWNlICgiICsgaWZhY2UgKyAiKSwgaWdub3JpbmciKTsKKyAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiYXR0ZW1wdGluZyB0byByZW1vdmUgdW5rbm93biBpZmFjZSAoIiArIGlmYWNlICsgIiksIGlnbm9yaW5nIik7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHNtLnNlbmRNZXNzYWdlKFRldGhlckludGVyZmFjZVNNLkNNRF9JTlRFUkZBQ0VfRE9XTik7CkBAIC0zMjEsMTMgKzM1MSwxNCBAQAogCiAgICAgICAgIGJvb2xlYW4gd2lmaVRldGhlcmVkID0gZmFsc2U7CiAgICAgICAgIGJvb2xlYW4gdXNiVGV0aGVyZWQgPSBmYWxzZTsKKyAgICAgICAgYm9vbGVhbiBibHVldG9vdGhUZXRoZXJlZCA9IGZhbHNlOwogCiAgICAgICAgIHN5bmNocm9uaXplZCAobUlmYWNlcykgewogICAgICAgICAgICAgU2V0IGlmYWNlcyA9IG1JZmFjZXMua2V5U2V0KCk7CiAgICAgICAgICAgICBmb3IgKE9iamVjdCBpZmFjZSA6IGlmYWNlcykgewogICAgICAgICAgICAgICAgIFRldGhlckludGVyZmFjZVNNIHNtID0gbUlmYWNlcy5nZXQoaWZhY2UpOwogICAgICAgICAgICAgICAgIGlmIChzbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKHNtLmlzRXJyb3JlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzbS5pc0Vycm9yZWQoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JlZExpc3QuYWRkKChTdHJpbmcpaWZhY2UpOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNtLmlzQXZhaWxhYmxlKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZUxpc3QuYWRkKChTdHJpbmcpaWZhY2UpOwpAQCAtMzM2LDYgKzM2Nyw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNiVGV0aGVyZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpc1dpZmkoKFN0cmluZylpZmFjZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWZpVGV0aGVyZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNCbHVldG9vdGgoKFN0cmluZylpZmFjZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBibHVldG9vdGhUZXRoZXJlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVMaXN0LmFkZCgoU3RyaW5nKWlmYWNlKTsKICAgICAgICAgICAgICAgICAgICAgfQpAQCAtMzUwLDE3ICszODMsMjUgQEAKICAgICAgICAgYnJvYWRjYXN0LnB1dFN0cmluZ0FycmF5TGlzdEV4dHJhKENvbm5lY3Rpdml0eU1hbmFnZXIuRVhUUkFfRVJST1JFRF9URVRIRVIsCiAgICAgICAgICAgICAgICAgZXJyb3JlZExpc3QpOwogICAgICAgICBtQ29udGV4dC5zZW5kU3RpY2t5QnJvYWRjYXN0KGJyb2FkY2FzdCk7Ci0gICAgICAgIExvZy5kKFRBRywgInNlbmRUZXRoZXJTdGF0ZUNoYW5nZWRCcm9hZGNhc3QgIiArIGF2YWlsYWJsZUxpc3Quc2l6ZSgpICsgIiwgIiArCi0gICAgICAgICAgICAgICAgYWN0aXZlTGlzdC5zaXplKCkgKyAiLCAiICsgZXJyb3JlZExpc3Quc2l6ZSgpKTsKKyAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICBMb2cuZChUQUcsICJzZW5kVGV0aGVyU3RhdGVDaGFuZ2VkQnJvYWRjYXN0ICIgKyBhdmFpbGFibGVMaXN0LnNpemUoKSArICIsICIgKworICAgICAgICAgICAgICAgICAgICBhY3RpdmVMaXN0LnNpemUoKSArICIsICIgKyBlcnJvcmVkTGlzdC5zaXplKCkpOworICAgICAgICB9CiAKICAgICAgICAgaWYgKHVzYlRldGhlcmVkKSB7Ci0gICAgICAgICAgICBpZiAod2lmaVRldGhlcmVkKSB7CisgICAgICAgICAgICBpZiAod2lmaVRldGhlcmVkIHx8IGJsdWV0b290aFRldGhlcmVkKSB7CiAgICAgICAgICAgICAgICAgc2hvd1RldGhlcmVkTm90aWZpY2F0aW9uKGNvbS5hbmRyb2lkLmludGVybmFsLlIuZHJhd2FibGUuc3RhdF9zeXNfdGV0aGVyX2dlbmVyYWwpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBzaG93VGV0aGVyZWROb3RpZmljYXRpb24oY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5kcmF3YWJsZS5zdGF0X3N5c190ZXRoZXJfdXNiKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIGlmICh3aWZpVGV0aGVyZWQpIHsKLSAgICAgICAgICAgIHNob3dUZXRoZXJlZE5vdGlmaWNhdGlvbihjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmRyYXdhYmxlLnN0YXRfc3lzX3RldGhlcl93aWZpKTsKKyAgICAgICAgICAgIGlmIChibHVldG9vdGhUZXRoZXJlZCkgeworICAgICAgICAgICAgICAgIHNob3dUZXRoZXJlZE5vdGlmaWNhdGlvbihjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmRyYXdhYmxlLnN0YXRfc3lzX3RldGhlcl9nZW5lcmFsKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc2hvd1RldGhlcmVkTm90aWZpY2F0aW9uKGNvbS5hbmRyb2lkLmludGVybmFsLlIuZHJhd2FibGUuc3RhdF9zeXNfdGV0aGVyX3dpZmkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGJsdWV0b290aFRldGhlcmVkKSB7CisgICAgICAgICAgICBzaG93VGV0aGVyZWROb3RpZmljYXRpb24oY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5kcmF3YWJsZS5zdGF0X3N5c190ZXRoZXJfYmx1ZXRvb3RoKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGNsZWFyVGV0aGVyZWROb3RpZmljYXRpb24oKTsKICAgICAgICAgfQpAQCAtMzkxLDcgKzQzMiw3IEBACiAgICAgICAgIENoYXJTZXF1ZW5jZSBtZXNzYWdlID0gci5nZXRUZXh0KGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3RyaW5nLgogICAgICAgICAgICAgICAgIHRldGhlcmVkX25vdGlmaWNhdGlvbl9tZXNzYWdlKTsKIAotICAgICAgICBpZihtVGV0aGVyZWROb3RpZmljYXRpb24gPT0gbnVsbCkgeworICAgICAgICBpZiAobVRldGhlcmVkTm90aWZpY2F0aW9uID09IG51bGwpIHsKICAgICAgICAgICAgIG1UZXRoZXJlZE5vdGlmaWNhdGlvbiA9IG5ldyBOb3RpZmljYXRpb24oKTsKICAgICAgICAgICAgIG1UZXRoZXJlZE5vdGlmaWNhdGlvbi53aGVuID0gMDsKICAgICAgICAgfQpAQCAtNDIxLDEyICs0NjIsMjUgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIHByaXZhdGUgSGFuZGxlciBtVXNiSGFuZGxlciA9IG5ldyBIYW5kbGVyKCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG1zZykgeworICAgICAgICAgICAgbVVzYkNvbm5lY3RlZCA9IChtc2cuYXJnMSA9PSBVU0JfQ09OTkVDVEVEKTsKKyAgICAgICAgICAgIHVwZGF0ZVVzYlN0YXR1cygpOworICAgICAgICB9CisgICAgfTsKKwogICAgIHByaXZhdGUgY2xhc3MgU3RhdGVSZWNlaXZlciBleHRlbmRzIEJyb2FkY2FzdFJlY2VpdmVyIHsKICAgICAgICAgcHVibGljIHZvaWQgb25SZWNlaXZlKENvbnRleHQgY29udGVudCwgSW50ZW50IGludGVudCkgewogICAgICAgICAgICAgU3RyaW5nIGFjdGlvbiA9IGludGVudC5nZXRBY3Rpb24oKTsKICAgICAgICAgICAgIGlmIChhY3Rpb24uZXF1YWxzKFVzYi5BQ1RJT05fVVNCX1NUQVRFKSkgewotICAgICAgICAgICAgICAgIG1Vc2JDb25uZWN0ZWQgPSBpbnRlbnQuZ2V0RXh0cmFzKCkuZ2V0Qm9vbGVhbihVc2IuVVNCX0NPTk5FQ1RFRCk7Ci0gICAgICAgICAgICAgICAgdXBkYXRlVXNiU3RhdHVzKCk7CisgICAgICAgICAgICAgICAgLy8gcHJvY2VzcyBjb25uZWN0IGV2ZW50cyBpbW1lZGlhdGVseSwgYnV0IGRlbGF5IGhhbmRsaW5nIGRpc2Nvbm5lY3RzCisgICAgICAgICAgICAgICAgLy8gdG8gZGVib3VuY2UgVVNCIGNvbmZpZ3VyYXRpb24gY2hhbmdlcworICAgICAgICAgICAgICAgIGJvb2xlYW4gY29ubmVjdGVkID0gaW50ZW50LmdldEV4dHJhcygpLmdldEJvb2xlYW4oVXNiLlVTQl9DT05ORUNURUQpOworICAgICAgICAgICAgICAgIE1lc3NhZ2UgbXNnID0gTWVzc2FnZS5vYnRhaW4obVVzYkhhbmRsZXIsIFVTQl9TVEFURV9DSEFOR0UsCisgICAgICAgICAgICAgICAgICAgICAgICAoY29ubmVjdGVkID8gVVNCX0NPTk5FQ1RFRCA6IFVTQl9ESVNDT05ORUNURUQpLCAwKTsKKyAgICAgICAgICAgICAgICBtVXNiSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhVU0JfU1RBVEVfQ0hBTkdFKTsKKyAgICAgICAgICAgICAgICBtVXNiSGFuZGxlci5zZW5kTWVzc2FnZURlbGF5ZWQobXNnLCBjb25uZWN0ZWQgPyAwIDogVVNCX0RJU0NPTk5FQ1RfREVMQVkpOwogICAgICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24uZXF1YWxzKEludGVudC5BQ1RJT05fTUVESUFfU0hBUkVEKSkgewogICAgICAgICAgICAgICAgIG1Vc2JNYXNzU3RvcmFnZU9mZiA9IGZhbHNlOwogICAgICAgICAgICAgICAgIHVwZGF0ZVVzYlN0YXR1cygpOwpAQCAtNDM1LDcgKzQ4OSw3IEBACiAgICAgICAgICAgICAgICAgbVVzYk1hc3NTdG9yYWdlT2ZmID0gdHJ1ZTsKICAgICAgICAgICAgICAgICB1cGRhdGVVc2JTdGF0dXMoKTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uLmVxdWFscyhDb25uZWN0aXZpdHlNYW5hZ2VyLkNPTk5FQ1RJVklUWV9BQ1RJT04pKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiVGV0aGVyaW5nIGdvdCBDT05ORUNUSVZJVFlfQUNUSU9OIik7CisgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cuZChUQUcsICJUZXRoZXJpbmcgZ290IENPTk5FQ1RJVklUWV9BQ1RJT04iKTsKICAgICAgICAgICAgICAgICBtVGV0aGVyTWFzdGVyU00uc2VuZE1lc3NhZ2UoVGV0aGVyTWFzdGVyU00uQ01EX1VQU1RSRUFNX0NIQU5HRUQpOwogICAgICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24uZXF1YWxzKEludGVudC5BQ1RJT05fQk9PVF9DT01QTEVURUQpKSB7CiAgICAgICAgICAgICAgICAgbUJvb3RlZCA9IHRydWU7CkBAIC00NjYsOSArNTIwLDkgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIC8vIHRvZ2dsZWQgd2hlbiB3ZSBlbnRlci9sZWF2ZSB0aGUgZnVsbHkgdGVhdGhlcmVkIHN0YXRlCisgICAgLy8gdG9nZ2xlZCB3aGVuIHdlIGVudGVyL2xlYXZlIHRoZSBmdWxseSB0ZXRoZXJlZCBzdGF0ZQogICAgIHByaXZhdGUgYm9vbGVhbiBlbmFibGVVc2JSbmRpcyhib29sZWFuIGVuYWJsZWQpIHsKLSAgICAgICAgTG9nLmQoVEFHLCAiZW5hYmxlVXNiUm5kaXMoIiArIGVuYWJsZWQgKyAiKSIpOworICAgICAgICBpZiAoREVCVUcpIExvZy5kKFRBRywgImVuYWJsZVVzYlJuZGlzKCIgKyBlbmFibGVkICsgIikiKTsKICAgICAgICAgSUJpbmRlciBiID0gU2VydmljZU1hbmFnZXIuZ2V0U2VydmljZShDb250ZXh0Lk5FVFdPUktNQU5BR0VNRU5UX1NFUlZJQ0UpOwogICAgICAgICAgICAgICAgIElOZXR3b3JrTWFuYWdlbWVudFNlcnZpY2Ugc2VydmljZSA9IElOZXR3b3JrTWFuYWdlbWVudFNlcnZpY2UuU3R1Yi5hc0ludGVyZmFjZShiKTsKIApAQCAtNDkzLDcgKzU0Nyw3IEBACiAKICAgICAvLyBjb25maWd1cmVkIHdoZW4gd2Ugc3RhcnQgdGV0aGVyaW5nIGFuZCB1bmNvbmZpZydkIG9uIGVycm9yIG9yIGNvbmNsdXNpb24KICAgICBwcml2YXRlIGJvb2xlYW4gY29uZmlndXJlVXNiSWZhY2UoYm9vbGVhbiBlbmFibGVkKSB7Ci0gICAgICAgIExvZy5kKFRBRywgImNvbmZpZ3VyZVVzYklmYWNlKCIgKyBlbmFibGVkICsgIikiKTsKKyAgICAgICAgaWYgKERFQlVHKSBMb2cuZChUQUcsICJjb25maWd1cmVVc2JJZmFjZSgiICsgZW5hYmxlZCArICIpIik7CiAKICAgICAgICAgSUJpbmRlciBiID0gU2VydmljZU1hbmFnZXIuZ2V0U2VydmljZShDb250ZXh0Lk5FVFdPUktNQU5BR0VNRU5UX1NFUlZJQ0UpOwogICAgICAgICBJTmV0d29ya01hbmFnZW1lbnRTZXJ2aWNlIHNlcnZpY2UgPSBJTmV0d29ya01hbmFnZW1lbnRTZXJ2aWNlLlN0dWIuYXNJbnRlcmZhY2UoYik7CkBAIC01NDksNiArNjAzLDEwIEBACiAgICAgICAgIHJldHVybiBtVGV0aGVyYWJsZVdpZmlSZWdleHM7CiAgICAgfQogCisgICAgcHVibGljIFN0cmluZ1tdIGdldFRldGhlcmFibGVCbHVldG9vdGhSZWdleHMoKSB7CisgICAgICAgIHJldHVybiBtVGV0aGVyYWJsZUJsdWV0b290aFJlZ2V4czsKKyAgICB9CisKICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0VXBzdHJlYW1JZmFjZVJlZ2V4cygpIHsKICAgICAgICAgcmV0dXJuIG1VcHN0cmVhbUlmYWNlUmVnZXhzOwogICAgIH0KQEAgLTc0MCw3ICs3OTgsNyBAQAogCiAgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIHByb2Nlc3NNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkluaXRpYWxTdGF0ZS5wcm9jZXNzTWVzc2FnZSB3aGF0PSIgKyBtZXNzYWdlLndoYXQpOworICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLmQoVEFHLCAiSW5pdGlhbFN0YXRlLnByb2Nlc3NNZXNzYWdlIHdoYXQ9IiArIG1lc3NhZ2Uud2hhdCk7CiAgICAgICAgICAgICAgICAgYm9vbGVhbiByZXRWYWx1ZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgc3dpdGNoIChtZXNzYWdlLndoYXQpIHsKICAgICAgICAgICAgICAgICAgICAgY2FzZSBDTURfVEVUSEVSX1JFUVVFU1RFRDoKQEAgLTc4MSw3ICs4MzksNyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJTdGFydGluZ1N0YXRlLnByb2Nlc3NNZXNzYWdlIHdoYXQ9IiArIG1lc3NhZ2Uud2hhdCk7CisgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cuZChUQUcsICJTdGFydGluZ1N0YXRlLnByb2Nlc3NNZXNzYWdlIHdoYXQ9IiArIG1lc3NhZ2Uud2hhdCk7CiAgICAgICAgICAgICAgICAgYm9vbGVhbiByZXRWYWx1ZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgc3dpdGNoIChtZXNzYWdlLndoYXQpIHsKICAgICAgICAgICAgICAgICAgICAgLy8gbWF5YmUgYSBwYXJlbnQgY2xhc3M/CkBAIC04MzMsNyArODkxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpZiAobVVzYikgVGV0aGVyaW5nLnRoaXMuZW5hYmxlVXNiUm5kaXModHJ1ZSk7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiVGV0aGVyZWQgIiArIG1JZmFjZU5hbWUpOworICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLmQoVEFHLCAiVGV0aGVyZWQgIiArIG1JZmFjZU5hbWUpOwogICAgICAgICAgICAgICAgIHNldEF2YWlsYWJsZShmYWxzZSk7CiAgICAgICAgICAgICAgICAgc2V0VGV0aGVyZWQodHJ1ZSk7CiAgICAgICAgICAgICAgICAgc2VuZFRldGhlclN0YXRlQ2hhbmdlZEJyb2FkY2FzdCgpOwpAQCAtODQ0LDcgKzkwMiw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIHByb2Nlc3NNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlRldGhlcmVkU3RhdGUucHJvY2Vzc01lc3NhZ2Ugd2hhdD0iICsgbWVzc2FnZS53aGF0KTsKKyAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy5kKFRBRywgIlRldGhlcmVkU3RhdGUucHJvY2Vzc01lc3NhZ2Ugd2hhdD0iICsgbWVzc2FnZS53aGF0KTsKICAgICAgICAgICAgICAgICBib29sZWFuIHJldFZhbHVlID0gdHJ1ZTsKICAgICAgICAgICAgICAgICBib29sZWFuIGVycm9yID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgc3dpdGNoIChtZXNzYWdlLndoYXQpIHsKQEAgLTg4Nyw3ICs5NDUsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtZXNzYWdlLndoYXQgPT0gQ01EX0lOVEVSRkFDRV9ET1dOKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1VbmF2YWlsYWJsZVN0YXRlKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlVudGV0aGVyZWQgIiArIG1JZmFjZU5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cuZChUQUcsICJVbnRldGhlcmVkICIgKyBtSWZhY2VOYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICBjYXNlIENNRF9URVRIRVJfQ09OTkVDVElPTl9DSEFOR0VEOgogICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5ld1Vwc3RyZWFtSWZhY2VOYW1lID0gKFN0cmluZykobWVzc2FnZS5vYmopOwpAQCAtOTYwLDcgKzEwMTgsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGl2aXR5TWFuYWdlci5URVRIRVJfRVJST1JfTUFTVEVSX0VSUk9SKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlRldGhlciBsb3N0IHVwc3RyZWFtIGNvbm5lY3Rpb24gIiArIG1JZmFjZU5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cuZChUQUcsICJUZXRoZXIgbG9zdCB1cHN0cmVhbSBjb25uZWN0aW9uICIgKyBtSWZhY2VOYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRUZXRoZXJTdGF0ZUNoYW5nZWRCcm9hZGNhc3QoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtVXNiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFUZXRoZXJpbmcudGhpcy5jb25maWd1cmVVc2JJZmFjZShmYWxzZSkpIHsKQEAgLTExOTgsOCArMTI1NiwxMCBAQAogICAgICAgICAgICAgICAgIElCaW5kZXIgYiA9IFNlcnZpY2VNYW5hZ2VyLmdldFNlcnZpY2UoQ29udGV4dC5DT05ORUNUSVZJVFlfU0VSVklDRSk7CiAgICAgICAgICAgICAgICAgSUNvbm5lY3Rpdml0eU1hbmFnZXIgY20gPSBJQ29ubmVjdGl2aXR5TWFuYWdlci5TdHViLmFzSW50ZXJmYWNlKGIpOwogICAgICAgICAgICAgICAgIG1Db25uZWN0aW9uUmVxdWVzdGVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiY2hvb3NlVXBzdHJlYW1UeXBlKCIgKyB0cnlDZWxsICsgIiksICBkdW5SZXF1aXJlZCA9IgotICAgICAgICAgICAgICAgICAgICAgICAgKyBtRHVuUmVxdWlyZWQgKyAiLCBpZmFjZT0iICsgaWZhY2UpOworICAgICAgICAgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJjaG9vc2VVcHN0cmVhbVR5cGUoIiArIHRyeUNlbGwgKyAiKSwgIGR1blJlcXVpcmVkID0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtRHVuUmVxdWlyZWQgKyAiLCBpZmFjZT0iICsgaWZhY2UpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpZiAoaWZhY2UgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1EdW5SZXF1aXJlZCkgewpAQCAtMTIwNyw3ICsxMjY3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXR3b3JrSW5mbyBpbmZvID0gY20uZ2V0TmV0d29ya0luZm8oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25uZWN0aXZpdHlNYW5hZ2VyLlRZUEVfTU9CSUxFX0RVTik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZm8uaXNDb25uZWN0ZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJzZXR0aW5nIGR1biBpZmFjZW5hbWUgPSIgKyBpZmFjZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLmQoVEFHLCAic2V0dGluZyBkdW4gaWZhY2VuYW1lID0iICsgaWZhY2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBldmVuIGlmIHdlJ3JlIGFscmVhZHkgY29ubmVjdGVkIC0gaXQgbWF5IGJlIHNvbWVib2R5IGVsc2UncwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWZjb3VudCwgc28gYWRkIG91ciBvd24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHVybk9uTW9iaWxlQ29ubmVjdGlvbigpOwpAQCAtMTIxOSwxMSArMTI3OSwxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJjaGVja2luZyBpZiBoaXByaSBicm91Z2h0IHVzIHRoaXMgY29ubmVjdGlvbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLmQoVEFHLCAiY2hlY2tpbmcgaWYgaGlwcmkgYnJvdWdodCB1cyB0aGlzIGNvbm5lY3Rpb24iKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXR3b3JrSW5mbyBpbmZvID0gY20uZ2V0TmV0d29ya0luZm8oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25uZWN0aXZpdHlNYW5hZ2VyLlRZUEVfTU9CSUxFX0hJUFJJKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5mby5pc0Nvbm5lY3RlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgInllcyAtIGhpcHJpIGluIHVzZSIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy5kKFRBRywgInllcyAtIGhpcHJpIGluIHVzZSIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBldmVuIGlmIHdlJ3JlIGFscmVhZHkgY29ubmVjdGVkIC0gaXQgbWF5IGJlIHNvbWJvZHkgZWxzZSdzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlZmNvdW50LCBzbyBhZGQgb3VyIG93bgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dXJuT25Nb2JpbGVDb25uZWN0aW9uKCk7CkBAIC0xMjQ1LDcgKzEzMDUsNyBAQAogICAgICAgICAgICAgICAgIG5vdGlmeVRldGhlcmVkT2ZOZXdVcHN0cmVhbUlmYWNlKGlmYWNlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIG5vdGlmeVRldGhlcmVkT2ZOZXdVcHN0cmVhbUlmYWNlKFN0cmluZyBpZmFjZU5hbWUpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJub3RpZnlpbmcgdGV0aGVyZWQgd2l0aCBpZmFjZSA9IiArIGlmYWNlTmFtZSk7CisgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cuZChUQUcsICJub3RpZnlpbmcgdGV0aGVyZWQgd2l0aCBpZmFjZSA9IiArIGlmYWNlTmFtZSk7CiAgICAgICAgICAgICAgICAgbVVwc3RyZWFtSWZhY2VOYW1lID0gaWZhY2VOYW1lOwogICAgICAgICAgICAgICAgIGZvciAoT2JqZWN0IG8gOiBtTm90aWZ5TGlzdCkgewogICAgICAgICAgICAgICAgICAgICBUZXRoZXJJbnRlcmZhY2VTTSBzbSA9IChUZXRoZXJJbnRlcmZhY2VTTSlvOwpAQCAtMTI2MiwxOSArMTMyMiwxOSBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJNYXN0ZXJJbml0aWFsU3RhdGUucHJvY2Vzc01lc3NhZ2Ugd2hhdD0iICsgbWVzc2FnZS53aGF0KTsKKyAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy5kKFRBRywgIk1hc3RlckluaXRpYWxTdGF0ZS5wcm9jZXNzTWVzc2FnZSB3aGF0PSIgKyBtZXNzYWdlLndoYXQpOwogICAgICAgICAgICAgICAgIGJvb2xlYW4gcmV0VmFsdWUgPSB0cnVlOwogICAgICAgICAgICAgICAgIHN3aXRjaCAobWVzc2FnZS53aGF0KSB7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ01EX1RFVEhFUl9NT0RFX1JFUVVFU1RFRDoKICAgICAgICAgICAgICAgICAgICAgICAgIG1EdW5SZXF1aXJlZCA9IGlzRHVuUmVxdWlyZWQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIFRldGhlckludGVyZmFjZVNNIHdobyA9IChUZXRoZXJJbnRlcmZhY2VTTSltZXNzYWdlLm9iajsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlRldGhlciBNb2RlIHJlcXVlc3RlZCBieSAiICsgd2hvLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cuZChUQUcsICJUZXRoZXIgTW9kZSByZXF1ZXN0ZWQgYnkgIiArIHdoby50b1N0cmluZygpKTsKICAgICAgICAgICAgICAgICAgICAgICAgIG1Ob3RpZnlMaXN0LmFkZCh3aG8pOwogICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1UZXRoZXJNb2RlQWxpdmVTdGF0ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgY2FzZSBDTURfVEVUSEVSX01PREVfVU5SRVFVRVNURUQ6CiAgICAgICAgICAgICAgICAgICAgICAgICB3aG8gPSAoVGV0aGVySW50ZXJmYWNlU00pbWVzc2FnZS5vYmo7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJUZXRoZXIgTW9kZSB1bnJlcXVlc3RlZCBieSAiICsgd2hvLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cuZChUQUcsICJUZXRoZXIgTW9kZSB1bnJlcXVlc3RlZCBieSAiICsgd2hvLnRvU3RyaW5nKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4ID0gbU5vdGlmeUxpc3QuaW5kZXhPZih3aG8pOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ICE9IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5vdGlmeUxpc3QucmVtb3ZlKHdobyk7CkBAIC0xMzA0LDcgKzEzNjQsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJUZXRoZXJNb2RlQWxpdmVTdGF0ZS5wcm9jZXNzTWVzc2FnZSB3aGF0PSIgKyBtZXNzYWdlLndoYXQpOworICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLmQoVEFHLCAiVGV0aGVyTW9kZUFsaXZlU3RhdGUucHJvY2Vzc01lc3NhZ2Ugd2hhdD0iICsgbWVzc2FnZS53aGF0KTsKICAgICAgICAgICAgICAgICBib29sZWFuIHJldFZhbHVlID0gdHJ1ZTsKICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1lc3NhZ2Uud2hhdCkgewogICAgICAgICAgICAgICAgICAgICBjYXNlIENNRF9URVRIRVJfTU9ERV9SRVFVRVNURUQ6CkBAIC0xMzMyLDggKzEzOTIsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSB3ZSdyZSBzdGlsbCB1c2luZyBhIHJlcXVlc3RlZCBjb25uZWN0aW9uIC0gbWF5IGhhdmUgZm91bmQKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdpZmkgb3Igc29tZXRoaW5nIHNpbmNlIHRoZW4uCiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUNvbm5lY3Rpb25SZXF1ZXN0ZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJyZW5ld2luZyBtb2JpbGUgY29ubmVjdGlvbiAtIHJlcXVldWluZyBmb3IgYW5vdGhlciAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENFTExfQ09OTkVDVElPTl9SRU5FV19NUyArICJtcyIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJyZW5ld2luZyBtb2JpbGUgY29ubmVjdGlvbiAtIHJlcXVldWluZyBmb3IgYW5vdGhlciAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRUxMX0NPTk5FQ1RJT05fUkVORVdfTVMgKyAibXMiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHVybk9uTW9iaWxlQ29ubmVjdGlvbigpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9sb2NhdGlvbi9Db21wcmVoZW5zaXZlQ291bnRyeURldGVjdG9yLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9sb2NhdGlvbi9Db21wcmVoZW5zaXZlQ291bnRyeURldGVjdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTY5MmY4ZAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2xvY2F0aW9uL0NvbXByZWhlbnNpdmVDb3VudHJ5RGV0ZWN0b3IuamF2YQpAQCAtMCwwICsxLDM1OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5zZXJ2ZXIubG9jYXRpb247CisKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmEudXRpbC5UaW1lcjsKK2ltcG9ydCBqYXZhLnV0aWwuVGltZXJUYXNrOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5sb2NhdGlvbi5Db3VudHJ5OworaW1wb3J0IGFuZHJvaWQubG9jYXRpb24uQ291bnRyeUxpc3RlbmVyOworaW1wb3J0IGFuZHJvaWQubG9jYXRpb24uR2VvY29kZXI7CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5nczsKK2ltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5QaG9uZVN0YXRlTGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuU2VydmljZVN0YXRlOworaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlRlbGVwaG9ueU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuU2xvZzsKKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gZGV0ZWN0IHRoZSBjb3VudHJ5IHdoZXJlIHRoZSB1c2VyIGlzLiBUaGUgc291cmNlcyBvZgorICogY291bnRyeSBhcmUgcXVlcmllZCBpbiBvcmRlciBvZiByZWxpYWJpbGl0eSwgbGlrZQorICogPHVsPgorICogPGxpPk1vYmlsZSBuZXR3b3JrPC9saT4KKyAqIDxsaT5Mb2NhdGlvbjwvbGk+CisgKiA8bGk+U0lNJ3MgY291bnRyeTwvbGk+CisgKiA8bGk+UGhvbmUncyBsb2NhbGU8L2xpPgorICogPC91bD4KKyAqIDxwPgorICogQ2FsbCB0aGUge0BsaW5rICNkZXRlY3RDb3VudHJ5KCl9IHRvIGdldCB0aGUgYXZhaWxhYmxlIGNvdW50cnkgaW1tZWRpYXRlbHkuCisgKiA8cD4KKyAqIFRvIGJlIG5vdGlmaWVkIG9mIHRoZSBmdXR1cmUgY291bnRyeSBjaGFuZ2UsIHVzaW5nIHRoZQorICoge0BsaW5rICNzZXRDb3VudHJ5TGlzdGVuZXIoQ291bnRyeUxpc3RlbmVyKX0KKyAqIDxwPgorICogVXNpbmcgdGhlIHtAbGluayAjc3RvcCgpfSB0byBzdG9wIGxpc3RlbmluZyB0byB0aGUgY291bnRyeSBjaGFuZ2UuCisgKiA8cD4KKyAqIFRoZSBjb3VudHJ5IGluZm9ybWF0aW9uIHdpbGwgYmUgcmVmcmVzaGVkIGV2ZXJ5CisgKiB7QGxpbmsgI0xPQ0FUSU9OX1JFRlJFU0hfSU5URVJWQUx9IG9uY2UgdGhlIGxvY2F0aW9uIGJhc2VkIGNvdW50cnkgaXMgdXNlZC4KKyAqCisgKiBAaGlkZQorICovCitwdWJsaWMgY2xhc3MgQ29tcHJlaGVuc2l2ZUNvdW50cnlEZXRlY3RvciBleHRlbmRzIENvdW50cnlEZXRlY3RvckJhc2UgeworCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFRBRyA9ICJDb21wcmVoZW5zaXZlQ291bnRyeURldGVjdG9yIjsKKworICAgIC8qKgorICAgICAqIFRoZSByZWZyZXNoIGludGVydmFsIHdoZW4gdGhlIGxvY2F0aW9uIGJhc2VkIGNvdW50cnkgd2FzIHVzZWQKKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBsb25nIExPQ0FUSU9OX1JFRlJFU0hfSU5URVJWQUwgPSAxMDAwICogNjAgKiA2MCAqIDI0OyAvLyAxIGRheQorCisgICAgcHJvdGVjdGVkIENvdW50cnlEZXRlY3RvckJhc2UgbUxvY2F0aW9uQmFzZWRDb3VudHJ5RGV0ZWN0b3I7CisgICAgcHJvdGVjdGVkIFRpbWVyIG1Mb2NhdGlvblJlZnJlc2hUaW1lcjsKKworICAgIHByaXZhdGUgZmluYWwgaW50IG1QaG9uZVR5cGU7CisgICAgcHJpdmF0ZSBDb3VudHJ5IG1Db3VudHJ5OworICAgIHByaXZhdGUgVGVsZXBob255TWFuYWdlciBtVGVsZXBob255TWFuYWdlcjsKKyAgICBwcml2YXRlIENvdW50cnkgbUNvdW50cnlGcm9tTG9jYXRpb247CisgICAgcHJpdmF0ZSBib29sZWFuIG1TdG9wcGVkID0gZmFsc2U7CisgICAgcHJpdmF0ZSBTZXJ2aWNlU3RhdGUgbUxhc3RTdGF0ZTsKKworICAgIHByaXZhdGUgUGhvbmVTdGF0ZUxpc3RlbmVyIG1QaG9uZVN0YXRlTGlzdGVuZXIgPSBuZXcgUGhvbmVTdGF0ZUxpc3RlbmVyKCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25TZXJ2aWNlU3RhdGVDaGFuZ2VkKFNlcnZpY2VTdGF0ZSBzZXJ2aWNlU3RhdGUpIHsKKyAgICAgICAgICAgIC8vIFRPRE86IEZpbmQgb3V0IGhvdyBvZnRlbiB3ZSB3aWxsIGJlIG5vdGlmaWVkLCBpZiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgdG9vCisgICAgICAgICAgICAvLyBtYW55IHRpbWVzLCBsZXQncyBjb25zaWRlciBxdWVyeWluZyB0aGUgbmV0d29yay4KKyAgICAgICAgICAgIFNsb2cuZChUQUcsICJvblNlcnZpY2VTdGF0ZUNoYW5nZWQiKTsKKyAgICAgICAgICAgIC8vIFdlIG9ubHkgY2FyZSB0aGUgc3RhdGUgY2hhbmdlCisgICAgICAgICAgICBpZiAobUxhc3RTdGF0ZSA9PSBudWxsIHx8IG1MYXN0U3RhdGUuZ2V0U3RhdGUoKSAhPSBzZXJ2aWNlU3RhdGUuZ2V0U3RhdGUoKSkgeworICAgICAgICAgICAgICAgIGRldGVjdENvdW50cnkodHJ1ZSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgbUxhc3RTdGF0ZSA9IG5ldyBTZXJ2aWNlU3RhdGUoc2VydmljZVN0YXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH07CisKKyAgICAvKioKKyAgICAgKiBUaGUgbGlzdGVuZXIgZm9yIHJlY2VpdmluZyB0aGUgbm90aWZpY2F0aW9uIGZyb20gTG9jYXRpb25CYXNlZENvdW50cnlEZXRlY3Rvci4KKyAgICAgKi8KKyAgICBwcml2YXRlIENvdW50cnlMaXN0ZW5lciBtTG9jYXRpb25CYXNlZENvdW50cnlEZXRlY3Rpb25MaXN0ZW5lciA9IG5ldyBDb3VudHJ5TGlzdGVuZXIoKSB7CisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ291bnRyeURldGVjdGVkKENvdW50cnkgY291bnRyeSkgeworICAgICAgICAgICAgbUNvdW50cnlGcm9tTG9jYXRpb24gPSBjb3VudHJ5OworICAgICAgICAgICAgLy8gRG9uJ3Qgc3RhcnQgdGhlIExvY2F0aW9uQmFzZWRDb3VudHJ5RGV0ZWN0b3IuCisgICAgICAgICAgICBkZXRlY3RDb3VudHJ5KHRydWUsIGZhbHNlKTsKKyAgICAgICAgICAgIHN0b3BMb2NhdGlvbkJhc2VkRGV0ZWN0b3IoKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBwdWJsaWMgQ29tcHJlaGVuc2l2ZUNvdW50cnlEZXRlY3RvcihDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCk7CisgICAgICAgIG1UZWxlcGhvbnlNYW5hZ2VyID0gKFRlbGVwaG9ueU1hbmFnZXIpIGNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LlRFTEVQSE9OWV9TRVJWSUNFKTsKKyAgICAgICAgbVBob25lVHlwZSA9IG1UZWxlcGhvbnlNYW5hZ2VyLmdldFBob25lVHlwZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBDb3VudHJ5IGRldGVjdENvdW50cnkoKSB7CisgICAgICAgIC8vIERvbid0IHN0YXJ0IHRoZSBMb2NhdGlvbkJhc2VkQ291bnRyeURldGVjdG9yIGlmIHdlIGhhdmUgYmVlbiBzdG9wcGVkLgorICAgICAgICByZXR1cm4gZGV0ZWN0Q291bnRyeShmYWxzZSwgIW1TdG9wcGVkKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzdG9wKCkgeworICAgICAgICBTbG9nLmkoVEFHLCAiU3RvcCB0aGUgZGV0ZWN0b3IuIik7CisgICAgICAgIGNhbmNlbExvY2F0aW9uUmVmcmVzaCgpOworICAgICAgICByZW1vdmVQaG9uZVN0YXRlTGlzdGVuZXIoKTsKKyAgICAgICAgc3RvcExvY2F0aW9uQmFzZWREZXRlY3RvcigpOworICAgICAgICBtTGlzdGVuZXIgPSBudWxsOworICAgICAgICBtU3RvcHBlZCA9IHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBjb3VudHJ5IGZyb20gZGlmZmVyZW50IHNvdXJjZXMgaW4gb3JkZXIgb2YgdGhlIHJlbGlhYmlsaXR5LgorICAgICAqLworICAgIHByaXZhdGUgQ291bnRyeSBnZXRDb3VudHJ5KCkgeworICAgICAgICBDb3VudHJ5IHJlc3VsdCA9IG51bGw7CisgICAgICAgIHJlc3VsdCA9IGdldE5ldHdvcmtCYXNlZENvdW50cnkoKTsKKyAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXN1bHQgPSBnZXRMYXN0S25vd25Mb2NhdGlvbkJhc2VkQ291bnRyeSgpOworICAgICAgICB9CisgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgeworICAgICAgICAgICAgcmVzdWx0ID0gZ2V0U2ltQmFzZWRDb3VudHJ5KCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXN1bHQgPSBnZXRMb2NhbGVDb3VudHJ5KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBjb3VudHJ5IGZyb20gdGhlIG1vYmlsZSBuZXR3b3JrLgorICAgICAqLworICAgIHByb3RlY3RlZCBDb3VudHJ5IGdldE5ldHdvcmtCYXNlZENvdW50cnkoKSB7CisgICAgICAgIFN0cmluZyBjb3VudHJ5SXNvID0gbnVsbDsKKyAgICAgICAgLy8gVE9ETzogVGhlIGRvY3VtZW50IHNheXMgdGhlIHJlc3VsdCBtYXkgYmUgdW5yZWxpYWJsZSBvbiBDRE1BIG5ldHdvcmtzLiBTaGFsbCB3ZSB1c2UKKyAgICAgICAgLy8gaXQgb24gQ0RNQSBwaG9uZT8gV2UgbWF5IHRlc3QgdGhlIEFuZHJvaWQgcHJpbWFyaWx5IHVzZWQgY291bnRyaWVzLgorICAgICAgICBpZiAobVBob25lVHlwZSA9PSBUZWxlcGhvbnlNYW5hZ2VyLlBIT05FX1RZUEVfR1NNKSB7CisgICAgICAgICAgICBjb3VudHJ5SXNvID0gbVRlbGVwaG9ueU1hbmFnZXIuZ2V0TmV0d29ya0NvdW50cnlJc28oKTsKKyAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkoY291bnRyeUlzbykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENvdW50cnkoY291bnRyeUlzbywgQ291bnRyeS5DT1VOVFJZX1NPVVJDRV9ORVRXT1JLKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBjYWNoZWQgbG9jYXRpb24gYmFzZWQgY291bnRyeS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQ291bnRyeSBnZXRMYXN0S25vd25Mb2NhdGlvbkJhc2VkQ291bnRyeSgpIHsKKyAgICAgICAgcmV0dXJuIG1Db3VudHJ5RnJvbUxvY2F0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIGNvdW50cnkgZnJvbSBTSU0gY2FyZAorICAgICAqLworICAgIHByb3RlY3RlZCBDb3VudHJ5IGdldFNpbUJhc2VkQ291bnRyeSgpIHsKKyAgICAgICAgU3RyaW5nIGNvdW50cnlJc28gPSBudWxsOworICAgICAgICBjb3VudHJ5SXNvID0gbVRlbGVwaG9ueU1hbmFnZXIuZ2V0U2ltQ291bnRyeUlzbygpOworICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KGNvdW50cnlJc28pKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IENvdW50cnkoY291bnRyeUlzbywgQ291bnRyeS5DT1VOVFJZX1NPVVJDRV9TSU0pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIGNvdW50cnkgZnJvbSB0aGUgc3lzdGVtJ3MgbG9jYWxlLgorICAgICAqLworICAgIHByb3RlY3RlZCBDb3VudHJ5IGdldExvY2FsZUNvdW50cnkoKSB7CisgICAgICAgIExvY2FsZSBkZWZhdWx0TG9jYWxlID0gTG9jYWxlLmdldERlZmF1bHQoKTsKKyAgICAgICAgaWYgKGRlZmF1bHRMb2NhbGUgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBDb3VudHJ5KGRlZmF1bHRMb2NhbGUuZ2V0Q291bnRyeSgpLCBDb3VudHJ5LkNPVU5UUllfU09VUkNFX0xPQ0FMRSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBub3RpZnlDaGFuZ2UgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGxpc3RlbmVyIHNob3VsZCBiZSBub3RpZmllZCB0aGUgY2hhbmdlIG9mIHRoZQorICAgICAqIGNvdW50cnkKKyAgICAgKiBAcGFyYW0gc3RhcnRMb2NhdGlvbkJhc2VkRGV0ZWN0aW9uIGluZGljYXRlcyB3aGV0aGVyIHRoZSBMb2NhdGlvbkJhc2VkQ291bnRyeURldGVjdG9yIGNvdWxkCisgICAgICogYmUgc3RhcnRlZCBpZiB0aGUgY3VycmVudCBjb3VudHJ5IHNvdXJjZSBpcyBsZXNzIHJlbGlhYmxlIHRoYW4gdGhlIGxvY2F0aW9uLgorICAgICAqIEByZXR1cm4gdGhlIGN1cnJlbnQgYXZhaWxhYmxlIFVzZXJDb3VudHJ5CisgICAgICovCisgICAgcHJpdmF0ZSBDb3VudHJ5IGRldGVjdENvdW50cnkoYm9vbGVhbiBub3RpZnlDaGFuZ2UsIGJvb2xlYW4gc3RhcnRMb2NhdGlvbkJhc2VkRGV0ZWN0aW9uKSB7CisgICAgICAgIENvdW50cnkgY291bnRyeSA9IGdldENvdW50cnkoKTsKKyAgICAgICAgcnVuQWZ0ZXJEZXRlY3Rpb25Bc3luYyhtQ291bnRyeSAhPSBudWxsID8gbmV3IENvdW50cnkobUNvdW50cnkpIDogbUNvdW50cnksIGNvdW50cnksCisgICAgICAgICAgICAgICAgbm90aWZ5Q2hhbmdlLCBzdGFydExvY2F0aW9uQmFzZWREZXRlY3Rpb24pOworICAgICAgICBtQ291bnRyeSA9IGNvdW50cnk7CisgICAgICAgIHJldHVybiBtQ291bnRyeTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSdW4gdGhlIHRhc2tzIGluIHRoZSBzZXJ2aWNlJ3MgdGhyZWFkLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHJ1bkFmdGVyRGV0ZWN0aW9uQXN5bmMoZmluYWwgQ291bnRyeSBjb3VudHJ5LCBmaW5hbCBDb3VudHJ5IGRldGVjdGVkQ291bnRyeSwKKyAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gbm90aWZ5Q2hhbmdlLCBmaW5hbCBib29sZWFuIHN0YXJ0TG9jYXRpb25CYXNlZERldGVjdGlvbikgeworICAgICAgICBtSGFuZGxlci5wb3N0KG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICBydW5BZnRlckRldGVjdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50cnksIGRldGVjdGVkQ291bnRyeSwgbm90aWZ5Q2hhbmdlLCBzdGFydExvY2F0aW9uQmFzZWREZXRlY3Rpb24pOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRDb3VudHJ5TGlzdGVuZXIoQ291bnRyeUxpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgIENvdW50cnlMaXN0ZW5lciBwcmV2TGlzdGVuZXIgPSBtTGlzdGVuZXI7CisgICAgICAgIG1MaXN0ZW5lciA9IGxpc3RlbmVyOworICAgICAgICBpZiAobUxpc3RlbmVyID09IG51bGwpIHsKKyAgICAgICAgICAgIC8vIFN0b3AgbGlzdGVuaW5nIGFsbCBzZXJ2aWNlcworICAgICAgICAgICAgcmVtb3ZlUGhvbmVTdGF0ZUxpc3RlbmVyKCk7CisgICAgICAgICAgICBzdG9wTG9jYXRpb25CYXNlZERldGVjdG9yKCk7CisgICAgICAgICAgICBjYW5jZWxMb2NhdGlvblJlZnJlc2goKTsKKyAgICAgICAgfSBlbHNlIGlmIChwcmV2TGlzdGVuZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgYWRkUGhvbmVTdGF0ZUxpc3RlbmVyKCk7CisgICAgICAgICAgICBkZXRlY3RDb3VudHJ5KGZhbHNlLCB0cnVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgcnVuQWZ0ZXJEZXRlY3Rpb24oZmluYWwgQ291bnRyeSBjb3VudHJ5LCBmaW5hbCBDb3VudHJ5IGRldGVjdGVkQ291bnRyeSwKKyAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gbm90aWZ5Q2hhbmdlLCBmaW5hbCBib29sZWFuIHN0YXJ0TG9jYXRpb25CYXNlZERldGVjdGlvbikgeworICAgICAgICBpZiAobm90aWZ5Q2hhbmdlKSB7CisgICAgICAgICAgICBub3RpZnlJZkNvdW50cnlDaGFuZ2VkKGNvdW50cnksIGRldGVjdGVkQ291bnRyeSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0YXJ0TG9jYXRpb25CYXNlZERldGVjdGlvbiAmJiAoZGV0ZWN0ZWRDb3VudHJ5ID09IG51bGwKKyAgICAgICAgICAgICAgICB8fCBkZXRlY3RlZENvdW50cnkuZ2V0U291cmNlKCkgPiBDb3VudHJ5LkNPVU5UUllfU09VUkNFX0xPQ0FUSU9OKQorICAgICAgICAgICAgICAgICYmIGlzQWlycGxhbmVNb2RlT2ZmKCkgJiYgbUxpc3RlbmVyICE9IG51bGwgJiYgaXNHZW9Db2RlckltcGxlbWVudGVkKCkpIHsKKyAgICAgICAgICAgIC8vIFN0YXJ0IGZpbmRpbmcgbG9jYXRpb24gd2hlbiB0aGUgc291cmNlIGlzIGxlc3MgcmVsaWFibGUgdGhhbiB0aGUKKyAgICAgICAgICAgIC8vIGxvY2F0aW9uIGFuZCB0aGUgYWlycGxhbmUgbW9kZSBpcyBvZmYgKGFzIGdlb2NvZGVyIHdpbGwgbm90CisgICAgICAgICAgICAvLyB3b3JrKS4KKyAgICAgICAgICAgIC8vIFRPRE8gOiBTaGFsbCB3ZSBnaXZlIHVwIHN0YXJ0aW5nIHRoZSBkZXRlY3RvciB3aXRoaW4gYQorICAgICAgICAgICAgLy8gcGVyaW9kIG9mIHRpbWU/CisgICAgICAgICAgICBzdGFydExvY2F0aW9uQmFzZWREZXRlY3RvcihtTG9jYXRpb25CYXNlZENvdW50cnlEZXRlY3Rpb25MaXN0ZW5lcik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRldGVjdGVkQ291bnRyeSA9PSBudWxsCisgICAgICAgICAgICAgICAgfHwgZGV0ZWN0ZWRDb3VudHJ5LmdldFNvdXJjZSgpID49IENvdW50cnkuQ09VTlRSWV9TT1VSQ0VfTE9DQVRJT04pIHsKKyAgICAgICAgICAgIC8vIFNjaGVkdWxlIHRoZSBsb2NhdGlvbiByZWZyZXNoIGlmIHRoZSBjb3VudHJ5IHNvdXJjZSBpcworICAgICAgICAgICAgLy8gbm90IG1vcmUgcmVsaWFibGUgdGhhbiB0aGUgbG9jYXRpb24gb3Igbm8gY291bnRyeSBpcworICAgICAgICAgICAgLy8gZm91bmQuCisgICAgICAgICAgICAvLyBUT0RPOiBMaXN0ZW4gdG8gdGhlIHByZWZlcmVuY2UgY2hhbmdlIG9mIEdQUywgV2lmaSBldGMsCisgICAgICAgICAgICAvLyBhbmQgc3RhcnQgZGV0ZWN0aW5nIHRoZSBjb3VudHJ5LgorICAgICAgICAgICAgc2NoZWR1bGVMb2NhdGlvblJlZnJlc2goKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIENhbmNlbCB0aGUgbG9jYXRpb24gcmVmcmVzaCBvbmNlIHRoZSBjdXJyZW50IHNvdXJjZSBpcworICAgICAgICAgICAgLy8gbW9yZSByZWxpYWJsZSB0aGFuIHRoZSBsb2NhdGlvbi4KKyAgICAgICAgICAgIGNhbmNlbExvY2F0aW9uUmVmcmVzaCgpOworICAgICAgICAgICAgc3RvcExvY2F0aW9uQmFzZWREZXRlY3RvcigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRmluZCB0aGUgY291bnRyeSBmcm9tIExvY2F0aW9uUHJvdmlkZXIuCisgICAgICovCisgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBzdGFydExvY2F0aW9uQmFzZWREZXRlY3RvcihDb3VudHJ5TGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgaWYgKG1Mb2NhdGlvbkJhc2VkQ291bnRyeURldGVjdG9yICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBtTG9jYXRpb25CYXNlZENvdW50cnlEZXRlY3RvciA9IGNyZWF0ZUxvY2F0aW9uQmFzZWRDb3VudHJ5RGV0ZWN0b3IoKTsKKyAgICAgICAgbUxvY2F0aW9uQmFzZWRDb3VudHJ5RGV0ZWN0b3Iuc2V0Q291bnRyeUxpc3RlbmVyKGxpc3RlbmVyKTsKKyAgICAgICAgbUxvY2F0aW9uQmFzZWRDb3VudHJ5RGV0ZWN0b3IuZGV0ZWN0Q291bnRyeSgpOworICAgIH0KKworICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgc3RvcExvY2F0aW9uQmFzZWREZXRlY3RvcigpIHsKKyAgICAgICAgaWYgKG1Mb2NhdGlvbkJhc2VkQ291bnRyeURldGVjdG9yICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1Mb2NhdGlvbkJhc2VkQ291bnRyeURldGVjdG9yLnN0b3AoKTsKKyAgICAgICAgICAgIG1Mb2NhdGlvbkJhc2VkQ291bnRyeURldGVjdG9yID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCBDb3VudHJ5RGV0ZWN0b3JCYXNlIGNyZWF0ZUxvY2F0aW9uQmFzZWRDb3VudHJ5RGV0ZWN0b3IoKSB7CisgICAgICAgIHJldHVybiBuZXcgTG9jYXRpb25CYXNlZENvdW50cnlEZXRlY3RvcihtQ29udGV4dCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNBaXJwbGFuZU1vZGVPZmYoKSB7CisgICAgICAgIHJldHVybiBTZXR0aW5ncy5TeXN0ZW0uZ2V0SW50KAorICAgICAgICAgICAgICAgIG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLCBTZXR0aW5ncy5TeXN0ZW0uQUlSUExBTkVfTU9ERV9PTiwgMCkgPT0gMDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBOb3RpZnkgdGhlIGNvdW50cnkgY2hhbmdlLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBub3RpZnlJZkNvdW50cnlDaGFuZ2VkKGZpbmFsIENvdW50cnkgY291bnRyeSwgZmluYWwgQ291bnRyeSBkZXRlY3RlZENvdW50cnkpIHsKKyAgICAgICAgaWYgKGRldGVjdGVkQ291bnRyeSAhPSBudWxsICYmIG1MaXN0ZW5lciAhPSBudWxsCisgICAgICAgICAgICAgICAgJiYgKGNvdW50cnkgPT0gbnVsbCB8fCAhY291bnRyeS5lcXVhbHMoZGV0ZWN0ZWRDb3VudHJ5KSkpIHsKKyAgICAgICAgICAgIFNsb2cuZChUQUcsCisgICAgICAgICAgICAgICAgICAgICJUaGUgY291bnRyeSB3YXMgY2hhbmdlZCBmcm9tICIgKyBjb3VudHJ5ICE9IG51bGwgPyBjb3VudHJ5LmdldENvdW50cnlJc28oKSA6CisgICAgICAgICAgICAgICAgICAgICAgICBjb3VudHJ5ICsgIiB0byAiICsgZGV0ZWN0ZWRDb3VudHJ5LmdldENvdW50cnlJc28oKSk7CisgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihkZXRlY3RlZENvdW50cnkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2NoZWR1bGUgdGhlIG5leHQgbG9jYXRpb24gcmVmcmVzaC4gV2Ugd2lsbCBkbyBub3RoaW5nIGlmIHRoZSBzY2hlZHVsZWQgdGFzayBleGlzdHMuCisgICAgICovCisgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBzY2hlZHVsZUxvY2F0aW9uUmVmcmVzaCgpIHsKKyAgICAgICAgaWYgKG1Mb2NhdGlvblJlZnJlc2hUaW1lciAhPSBudWxsKSByZXR1cm47CisgICAgICAgIG1Mb2NhdGlvblJlZnJlc2hUaW1lciA9IG5ldyBUaW1lcigpOworICAgICAgICBtTG9jYXRpb25SZWZyZXNoVGltZXIuc2NoZWR1bGUobmV3IFRpbWVyVGFzaygpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIG1Mb2NhdGlvblJlZnJlc2hUaW1lciA9IG51bGw7CisgICAgICAgICAgICAgICAgZGV0ZWN0Q291bnRyeShmYWxzZSwgdHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0sIExPQ0FUSU9OX1JFRlJFU0hfSU5URVJWQUwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbmNlbCB0aGUgc2NoZWR1bGVkIHJlZnJlc2ggdGFzayBpZiBpdCBleGlzdHMKKyAgICAgKi8KKyAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGNhbmNlbExvY2F0aW9uUmVmcmVzaCgpIHsKKyAgICAgICAgaWYgKG1Mb2NhdGlvblJlZnJlc2hUaW1lciAhPSBudWxsKSB7CisgICAgICAgICAgICBtTG9jYXRpb25SZWZyZXNoVGltZXIuY2FuY2VsKCk7CisgICAgICAgICAgICBtTG9jYXRpb25SZWZyZXNoVGltZXIgPSBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIGFkZFBob25lU3RhdGVMaXN0ZW5lcigpIHsKKyAgICAgICAgaWYgKG1QaG9uZVN0YXRlTGlzdGVuZXIgPT0gbnVsbCAmJiBtUGhvbmVUeXBlID09IFRlbGVwaG9ueU1hbmFnZXIuUEhPTkVfVFlQRV9HU00pIHsKKyAgICAgICAgICAgIG1MYXN0U3RhdGUgPSBudWxsOworICAgICAgICAgICAgbVBob25lU3RhdGVMaXN0ZW5lciA9IG5ldyBQaG9uZVN0YXRlTGlzdGVuZXIoKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25TZXJ2aWNlU3RhdGVDaGFuZ2VkKFNlcnZpY2VTdGF0ZSBzZXJ2aWNlU3RhdGUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogRmluZCBvdXQgaG93IG9mdGVuIHdlIHdpbGwgYmUgbm90aWZpZWQsIGlmIHRoaXMKKyAgICAgICAgICAgICAgICAgICAgLy8gbWV0aG9kIGlzIGNhbGxlZCB0b28KKyAgICAgICAgICAgICAgICAgICAgLy8gbWFueSB0aW1lcywgbGV0J3MgY29uc2lkZXIgcXVlcnlpbmcgdGhlIG5ldHdvcmsuCisgICAgICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJvblNlcnZpY2VTdGF0ZUNoYW5nZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gV2Ugb25seSBjYXJlIHRoZSBzdGF0ZSBjaGFuZ2UKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1MYXN0U3RhdGUgPT0gbnVsbCB8fCBtTGFzdFN0YXRlLmdldFN0YXRlKCkgIT0gc2VydmljZVN0YXRlLmdldFN0YXRlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRldGVjdENvdW50cnkodHJ1ZSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtTGFzdFN0YXRlID0gbmV3IFNlcnZpY2VTdGF0ZShzZXJ2aWNlU3RhdGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIG1UZWxlcGhvbnlNYW5hZ2VyLmxpc3RlbihtUGhvbmVTdGF0ZUxpc3RlbmVyLCBQaG9uZVN0YXRlTGlzdGVuZXIuTElTVEVOX1NFUlZJQ0VfU1RBVEUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIHJlbW92ZVBob25lU3RhdGVMaXN0ZW5lcigpIHsKKyAgICAgICAgaWYgKG1QaG9uZVN0YXRlTGlzdGVuZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgbVRlbGVwaG9ueU1hbmFnZXIubGlzdGVuKG1QaG9uZVN0YXRlTGlzdGVuZXIsIFBob25lU3RhdGVMaXN0ZW5lci5MSVNURU5fTk9ORSk7CisgICAgICAgICAgICBtUGhvbmVTdGF0ZUxpc3RlbmVyID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCBib29sZWFuIGlzR2VvQ29kZXJJbXBsZW1lbnRlZCgpIHsKKyAgICAgICAgcmV0dXJuIEdlb2NvZGVyLmlzSW1wbGVtZW50ZWQoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9sb2NhdGlvbi9Db3VudHJ5RGV0ZWN0b3JCYXNlLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9sb2NhdGlvbi9Db3VudHJ5RGV0ZWN0b3JCYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODMyNmVmOQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2xvY2F0aW9uL0NvdW50cnlEZXRlY3RvckJhc2UuamF2YQpAQCAtMCwwICsxLDcyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnNlcnZlci5sb2NhdGlvbjsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQubG9jYXRpb24uQ291bnRyeTsKK2ltcG9ydCBhbmRyb2lkLmxvY2F0aW9uLkNvdW50cnlMaXN0ZW5lcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CisKKy8qKgorICogVGhpcyBjbGFzcyBkZWZpbmVzIHRoZSBtZXRob2RzIG5lZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgdGhlIGNvdW50cnkKKyAqIGRldGVjdG9yLgorICogPHA+CisgKiBDYWxsaW5nIHtAbGluayAjZGV0ZWN0Q291bnRyeX0gdG8gc3RhcnQgZGV0ZWN0aW5nIHRoZSBjb3VudHJ5LiBUaGUgY291bnRyeQorICogY291bGQgYmUgcmV0dXJuZWQgaW1tZWRpYXRlbHkgaWYgaXQgaXMgYXZhaWxhYmxlLgorICoKKyAqIEBoaWRlCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBDb3VudHJ5RGV0ZWN0b3JCYXNlIHsKKyAgICBwcm90ZWN0ZWQgZmluYWwgSGFuZGxlciBtSGFuZGxlcjsKKyAgICBwcm90ZWN0ZWQgZmluYWwgQ29udGV4dCBtQ29udGV4dDsKKyAgICBwcm90ZWN0ZWQgQ291bnRyeUxpc3RlbmVyIG1MaXN0ZW5lcjsKKyAgICBwcm90ZWN0ZWQgQ291bnRyeSBtRGV0ZWN0ZWRDb3VudHJ5OworCisgICAgcHVibGljIENvdW50cnlEZXRlY3RvckJhc2UoQ29udGV4dCBjdHgpIHsKKyAgICAgICAgbUNvbnRleHQgPSBjdHg7CisgICAgICAgIG1IYW5kbGVyID0gbmV3IEhhbmRsZXIoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdGFydCBkZXRlY3RpbmcgdGhlIGNvdW50cnkgdGhhdCB0aGUgdXNlciBpcyBpbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGNvdW50cnkgaWYgaXQgaXMgYXZhaWxhYmxlIGltbWVkaWF0ZWx5LCBvdGhlcndpc2UgbnVsbCBzaG91bGQKKyAgICAgKiAgICAgICAgIGJlIHJldHVybmVkLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBDb3VudHJ5IGRldGVjdENvdW50cnkoKTsKKworICAgIC8qKgorICAgICAqIFJlZ2lzdGVyIGEgbGlzdGVuZXIgdG8gcmVjZWl2ZSB0aGUgbm90aWZpY2F0aW9uIHdoZW4gdGhlIGNvdW50cnkgaXMgZGV0ZWN0ZWQgb3IgY2hhbmdlZC4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgcHJldmlvdXMgbGlzdGVuZXIgd2lsbCBiZSByZXBsYWNlZCBpZiBpdCBleGlzdHMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q291bnRyeUxpc3RlbmVyKENvdW50cnlMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICBtTGlzdGVuZXIgPSBsaXN0ZW5lcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdG9wIGRldGVjdGluZyB0aGUgY291bnRyeS4gVGhlIGRldGVjdG9yIHNob3VsZCByZWxlYXNlIGFsbCBzeXN0ZW0gc2VydmljZXMgYW5kIGJlIHJlYWR5IHRvCisgICAgICogYmUgZnJlZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzdG9wKCk7CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBub3RpZnlMaXN0ZW5lcihDb3VudHJ5IGNvdW50cnkpIHsKKyAgICAgICAgaWYgKG1MaXN0ZW5lciAhPSBudWxsKSB7CisgICAgICAgICAgICBtTGlzdGVuZXIub25Db3VudHJ5RGV0ZWN0ZWQoY291bnRyeSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9sb2NhdGlvbi9Mb2NhdGlvbkJhc2VkQ291bnRyeURldGVjdG9yLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9sb2NhdGlvbi9Mb2NhdGlvbkJhc2VkQ291bnRyeURldGVjdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMTM5ZjA1ZAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2xvY2F0aW9uL0xvY2F0aW9uQmFzZWRDb3VudHJ5RGV0ZWN0b3IuamF2YQpAQCAtMCwwICsxLDIzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5zZXJ2ZXIubG9jYXRpb247CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlRpbWVyOworaW1wb3J0IGphdmEudXRpbC5UaW1lclRhc2s7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmxvY2F0aW9uLkFkZHJlc3M7CitpbXBvcnQgYW5kcm9pZC5sb2NhdGlvbi5Db3VudHJ5OworaW1wb3J0IGFuZHJvaWQubG9jYXRpb24uR2VvY29kZXI7CitpbXBvcnQgYW5kcm9pZC5sb2NhdGlvbi5Mb2NhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLmxvY2F0aW9uLkxvY2F0aW9uTGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC5sb2NhdGlvbi5Mb2NhdGlvbk1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC51dGlsLlNsb2c7CisKKy8qKgorICogVGhpcyBjbGFzcyBkZXRlY3RzIHdoaWNoIGNvdW50cnkgdGhlIHVzZXIgY3VycmVudGx5IGlzIGluIHRocm91Z2ggdGhlIGVuYWJsZWQKKyAqIGxvY2F0aW9uIHByb3ZpZGVycyBhbmQgdGhlIEdlb0NvZGVyCisgKiA8cD4KKyAqIFVzZSB7QGxpbmsgI2RldGVjdENvdW50cnl9IHRvIHN0YXJ0IHF1ZXJ5aW5nLiBJZiB0aGUgbG9jYXRpb24gY2FuIG5vdCBiZQorICogcmVzb2x2ZWQgd2l0aGluIHRoZSBnaXZlbiB0aW1lLCB0aGUgbGFzdCBrbm93biBsb2NhdGlvbiB3aWxsIGJlIHVzZWQgdG8gZ2V0CisgKiB0aGUgdXNlciBjb3VudHJ5IHRocm91Z2ggdGhlIEdlb0NvZGVyLiBUaGUgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHdpbGwgYmUKKyAqIHRocm93biBpZiB0aGVyZSBpcyBhIG9uZ29pbmcgcXVlcnkuCisgKiA8cD4KKyAqIFRoZSBjdXJyZW50IHF1ZXJ5IGNhbiBiZSBzdG9wcGVkIGJ5IHtAbGluayAjc3RvcCgpfQorICoKKyAqIEBoaWRlCisgKi8KK3B1YmxpYyBjbGFzcyBMb2NhdGlvbkJhc2VkQ291bnRyeURldGVjdG9yIGV4dGVuZHMgQ291bnRyeURldGVjdG9yQmFzZSB7CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFRBRyA9ICJMb2NhdGlvbkJhc2VkQ291bnRyeURldGVjdG9yIjsKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBsb25nIFFVRVJZX0xPQ0FUSU9OX1RJTUVPVVQgPSAxMDAwICogNjAgKiA1OyAvLyA1IG1pbnMKKworICAgIC8qKgorICAgICAqIFVzZWQgZm9yIGNhbmNlbGluZyBsb2NhdGlvbiBxdWVyeQorICAgICAqLworICAgIHByb3RlY3RlZCBUaW1lciBtVGltZXI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdGhyZWFkIHRvIHF1ZXJ5IHRoZSBjb3VudHJ5IGZyb20gdGhlIEdlb0NvZGVyLgorICAgICAqLworICAgIHByb3RlY3RlZCBUaHJlYWQgbVF1ZXJ5VGhyZWFkOworICAgIHByb3RlY3RlZCBMaXN0PExvY2F0aW9uTGlzdGVuZXI+IG1Mb2NhdGlvbkxpc3RlbmVyczsKKworICAgIHByaXZhdGUgTG9jYXRpb25NYW5hZ2VyIG1Mb2NhdGlvbk1hbmFnZXI7CisgICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gbUVuYWJsZWRQcm92aWRlcnM7CisKKyAgICBwdWJsaWMgTG9jYXRpb25CYXNlZENvdW50cnlEZXRlY3RvcihDb250ZXh0IGN0eCkgeworICAgICAgICBzdXBlcihjdHgpOworICAgICAgICBtTG9jYXRpb25NYW5hZ2VyID0gKExvY2F0aW9uTWFuYWdlcikgY3R4LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5MT0NBVElPTl9TRVJWSUNFKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBJU08gMzE2Ni0xIHR3byBsZXR0ZXJzIGNvdW50cnkgY29kZSBmcm9tIHRoZSBsb2NhdGlvbgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q291bnRyeUZyb21Mb2NhdGlvbihMb2NhdGlvbiBsb2NhdGlvbikgeworICAgICAgICBTdHJpbmcgY291bnRyeSA9IG51bGw7CisgICAgICAgIEdlb2NvZGVyIGdlb0NvZGVyID0gbmV3IEdlb2NvZGVyKG1Db250ZXh0KTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIExpc3Q8QWRkcmVzcz4gYWRkcmVzc2VzID0gZ2VvQ29kZXIuZ2V0RnJvbUxvY2F0aW9uKAorICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbi5nZXRMYXRpdHVkZSgpLCBsb2NhdGlvbi5nZXRMb25naXR1ZGUoKSwgMSk7CisgICAgICAgICAgICBpZiAoYWRkcmVzc2VzICE9IG51bGwgJiYgYWRkcmVzc2VzLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgICAgICBjb3VudHJ5ID0gYWRkcmVzc2VzLmdldCgwKS5nZXRDb3VudHJ5Q29kZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBTbG9nLncoVEFHLCAiRXhjZXB0aW9uIG9jY3VycyB3aGVuIGdldHRpbmcgY291bnRyeSBmcm9tIGxvY2F0aW9uIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNvdW50cnk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVnaXN0ZXIgdGhlIGxpc3RlbmVycyB3aXRoIHRoZSBsb2NhdGlvbiBwcm92aWRlcnMKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCByZWdpc3RlckVuYWJsZWRQcm92aWRlcnMoTGlzdDxMb2NhdGlvbkxpc3RlbmVyPiBsaXN0ZW5lcnMpIHsKKyAgICAgICAgaW50IHRvdGFsID0gbGlzdGVuZXJzLnNpemUoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGk8IHRvdGFsOyBpKyspIHsKKyAgICAgICAgICAgIG1Mb2NhdGlvbk1hbmFnZXIucmVxdWVzdExvY2F0aW9uVXBkYXRlcygKKyAgICAgICAgICAgICAgICAgICAgbUVuYWJsZWRQcm92aWRlcnMuZ2V0KGkpLCAwLCAwLCBsaXN0ZW5lcnMuZ2V0KGkpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFVucmVnaXN0ZXIgdGhlIGxpc3RlbmVycyB3aXRoIHRoZSBsb2NhdGlvbiBwcm92aWRlcnMKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCB1bnJlZ2lzdGVyUHJvdmlkZXJzKExpc3Q8TG9jYXRpb25MaXN0ZW5lcj4gbGlzdGVuZXJzKSB7CisgICAgICAgIGZvciAoTG9jYXRpb25MaXN0ZW5lciBsaXN0ZW5lciA6IGxpc3RlbmVycykgeworICAgICAgICAgICAgbUxvY2F0aW9uTWFuYWdlci5yZW1vdmVVcGRhdGVzKGxpc3RlbmVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIGxhc3Qga25vd24gbG9jYXRpb24gZnJvbSBhbGwgcHJvdmlkZXJzCisgICAgICovCisgICAgcHJvdGVjdGVkIExvY2F0aW9uIGdldExhc3RLbm93bkxvY2F0aW9uKCkgeworICAgICAgICBMaXN0PFN0cmluZz4gcHJvdmlkZXJzID0gbUxvY2F0aW9uTWFuYWdlci5nZXRBbGxQcm92aWRlcnMoKTsKKyAgICAgICAgTG9jYXRpb24gYmVzdExvY2F0aW9uID0gbnVsbDsKKyAgICAgICAgZm9yIChTdHJpbmcgcHJvdmlkZXIgOiBwcm92aWRlcnMpIHsKKyAgICAgICAgICAgIExvY2F0aW9uIGxhc3RLbm93bkxvY2F0aW9uID0gbUxvY2F0aW9uTWFuYWdlci5nZXRMYXN0S25vd25Mb2NhdGlvbihwcm92aWRlcik7CisgICAgICAgICAgICBpZiAobGFzdEtub3duTG9jYXRpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChiZXN0TG9jYXRpb24gPT0gbnVsbCB8fCBiZXN0TG9jYXRpb24uZ2V0VGltZSgpIDwgbGFzdEtub3duTG9jYXRpb24uZ2V0VGltZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIGJlc3RMb2NhdGlvbiA9IGxhc3RLbm93bkxvY2F0aW9uOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYmVzdExvY2F0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIHRpbWVvdXQgZm9yIHF1ZXJ5aW5nIHRoZSBsb2NhdGlvbi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgbG9uZyBnZXRRdWVyeUxvY2F0aW9uVGltZW91dCgpIHsKKyAgICAgICAgcmV0dXJuIFFVRVJZX0xPQ0FUSU9OX1RJTUVPVVQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgdG90YWwgbnVtYmVyIG9mIGVuYWJsZWQgbG9jYXRpb24gcHJvdmlkZXJzCisgICAgICovCisgICAgcHJvdGVjdGVkIGludCBnZXRUb3RhbEVuYWJsZWRQcm92aWRlcnMoKSB7CisgICAgICAgIGlmIChtRW5hYmxlZFByb3ZpZGVycyA9PSBudWxsKSB7CisgICAgICAgICAgICBtRW5hYmxlZFByb3ZpZGVycyA9IG1Mb2NhdGlvbk1hbmFnZXIuZ2V0UHJvdmlkZXJzKHRydWUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtRW5hYmxlZFByb3ZpZGVycy5zaXplKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RhcnQgZGV0ZWN0aW5nIHRoZSBjb3VudHJ5LgorICAgICAqIDxwPgorICAgICAqIFF1ZXJpZXMgdGhlIGxvY2F0aW9uIGZyb20gYWxsIGxvY2F0aW9uIHByb3ZpZGVycywgdGhlbiBzdGFydHMgYSB0aHJlYWQgdG8gcXVlcnkgdGhlCisgICAgICogY291bnRyeSBmcm9tIEdlb0NvZGVyLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgQ291bnRyeSBkZXRlY3RDb3VudHJ5KCkgeworICAgICAgICBpZiAobUxvY2F0aW9uTGlzdGVuZXJzICAhPSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgLy8gUmVxdWVzdCB0aGUgbG9jYXRpb24gZnJvbSBhbGwgZW5hYmxlZCBwcm92aWRlcnMuCisgICAgICAgIGludCB0b3RhbFByb3ZpZGVycyA9IGdldFRvdGFsRW5hYmxlZFByb3ZpZGVycygpOworICAgICAgICBpZiAodG90YWxQcm92aWRlcnMgPiAwKSB7CisgICAgICAgICAgICBtTG9jYXRpb25MaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0PExvY2F0aW9uTGlzdGVuZXI+KHRvdGFsUHJvdmlkZXJzKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdG90YWxQcm92aWRlcnM7IGkrKykgeworICAgICAgICAgICAgICAgIExvY2F0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTG9jYXRpb25MaXN0ZW5lciAoKSB7CisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uTG9jYXRpb25DaGFuZ2VkKExvY2F0aW9uIGxvY2F0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYXRpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvY2F0aW9uQmFzZWRDb3VudHJ5RGV0ZWN0b3IudGhpcy5zdG9wKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlDb3VudHJ5Q29kZShsb2NhdGlvbik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25Qcm92aWRlckRpc2FibGVkKFN0cmluZyBwcm92aWRlcikgeworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uUHJvdmlkZXJFbmFibGVkKFN0cmluZyBwcm92aWRlcikgeworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uU3RhdHVzQ2hhbmdlZChTdHJpbmcgcHJvdmlkZXIsIGludCBzdGF0dXMsIEJ1bmRsZSBleHRyYXMpIHsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgbUxvY2F0aW9uTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZWdpc3RlckVuYWJsZWRQcm92aWRlcnMobUxvY2F0aW9uTGlzdGVuZXJzKTsKKyAgICAgICAgICAgIG1UaW1lciA9IG5ldyBUaW1lcigpOworICAgICAgICAgICAgbVRpbWVyLnNjaGVkdWxlKG5ldyBUaW1lclRhc2soKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICBtVGltZXIgPSBudWxsOworICAgICAgICAgICAgICAgICAgICBMb2NhdGlvbkJhc2VkQ291bnRyeURldGVjdG9yLnRoaXMuc3RvcCgpOworICAgICAgICAgICAgICAgICAgICAvLyBMb29rcyBsaWtlIG5vIHByb3ZpZGVyIGNvdWxkIHByb3ZpZGUgdGhlIGxvY2F0aW9uLCBsZXQncyB0cnkgdGhlIGxhc3QKKyAgICAgICAgICAgICAgICAgICAgLy8ga25vd24gbG9jYXRpb24uCisgICAgICAgICAgICAgICAgICAgIHF1ZXJ5Q291bnRyeUNvZGUoZ2V0TGFzdEtub3duTG9jYXRpb24oKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSwgZ2V0UXVlcnlMb2NhdGlvblRpbWVvdXQoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBUaGVyZSBpcyBubyBwcm92aWRlciBlbmFibGVkLgorICAgICAgICAgICAgcXVlcnlDb3VudHJ5Q29kZShnZXRMYXN0S25vd25Mb2NhdGlvbigpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbURldGVjdGVkQ291bnRyeTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdG9wIHRoZSBjdXJyZW50IHF1ZXJ5IHdpdGhvdXQgbm90aWZ5aW5nIHRoZSBsaXN0ZW5lci4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc3RvcCgpIHsKKyAgICAgICAgaWYgKG1Mb2NhdGlvbkxpc3RlbmVycyAhPSBudWxsKSB7CisgICAgICAgICAgICB1bnJlZ2lzdGVyUHJvdmlkZXJzKG1Mb2NhdGlvbkxpc3RlbmVycyk7CisgICAgICAgICAgICBtTG9jYXRpb25MaXN0ZW5lcnMgPSBudWxsOworICAgICAgICB9CisgICAgICAgIGlmIChtVGltZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgbVRpbWVyLmNhbmNlbCgpOworICAgICAgICAgICAgbVRpbWVyID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFN0YXJ0IGEgbmV3IHRocmVhZCB0byBxdWVyeSB0aGUgY291bnRyeSBmcm9tIEdlb2NvZGVyLgorICAgICAqLworICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgcXVlcnlDb3VudHJ5Q29kZShmaW5hbCBMb2NhdGlvbiBsb2NhdGlvbikgeworICAgICAgICBpZiAobG9jYXRpb24gPT0gbnVsbCkgeworICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIobnVsbCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1RdWVyeVRocmVhZCAhPSBudWxsKSByZXR1cm47CisgICAgICAgIG1RdWVyeVRocmVhZCA9IG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIFN0cmluZyBjb3VudHJ5SXNvID0gbnVsbDsKKyAgICAgICAgICAgICAgICBpZiAobG9jYXRpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBjb3VudHJ5SXNvID0gZ2V0Q291bnRyeUZyb21Mb2NhdGlvbihsb2NhdGlvbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChjb3VudHJ5SXNvICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbURldGVjdGVkQ291bnRyeSA9IG5ldyBDb3VudHJ5KGNvdW50cnlJc28sIENvdW50cnkuQ09VTlRSWV9TT1VSQ0VfTE9DQVRJT04pOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1EZXRlY3RlZENvdW50cnkgPSBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihtRGV0ZWN0ZWRDb3VudHJ5KTsKKyAgICAgICAgICAgICAgICBtUXVlcnlUaHJlYWQgPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgICAgbVF1ZXJ5VGhyZWFkLnN0YXJ0KCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvam5pL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9qbmkvQW5kcm9pZC5tawppbmRleCBjZGMwYTZmLi40NTk1NTFkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qbmkvQW5kcm9pZC5taworKysgYi9zZXJ2aWNlcy9qbmkvQW5kcm9pZC5tawpAQCAtOCw2ICs4LDcgQEAKICAgICBjb21fYW5kcm9pZF9zZXJ2ZXJfTGlnaHRzU2VydmljZS5jcHAgXAogICAgIGNvbV9hbmRyb2lkX3NlcnZlcl9Qb3dlck1hbmFnZXJTZXJ2aWNlLmNwcCBcCiAgICAgY29tX2FuZHJvaWRfc2VydmVyX1N5c3RlbVNlcnZlci5jcHAgXAorICAgIGNvbV9hbmRyb2lkX3NlcnZlcl9Vc2JPYnNlcnZlci5jcHAgXAogICAgIGNvbV9hbmRyb2lkX3NlcnZlcl9WaWJyYXRvclNlcnZpY2UuY3BwIFwKIAljb21fYW5kcm9pZF9zZXJ2ZXJfbG9jYXRpb25fR3BzTG9jYXRpb25Qcm92aWRlci5jcHAgXAogICAgIG9ubG9hZC5jcHAKQEAgLTI1LDYgKzI2LDggQEAKIAlsaWJ1dGlscyBcCiAJbGlidWkKIAorTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBsaWJ1c2Job3N0CisKIGlmZXEgKCQoVEFSR0VUX1NJTVVMQVRPUiksdHJ1ZSkKIGlmZXEgKCQoVEFSR0VUX09TKSxsaW51eCkKIGlmZXEgKCQoVEFSR0VUX0FSQ0gpLHg4NikKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2puaS9jb21fYW5kcm9pZF9zZXJ2ZXJfVXNiT2JzZXJ2ZXIuY3BwIGIvc2VydmljZXMvam5pL2NvbV9hbmRyb2lkX3NlcnZlcl9Vc2JPYnNlcnZlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M0NzhkNQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2puaS9jb21fYW5kcm9pZF9zZXJ2ZXJfVXNiT2JzZXJ2ZXIuY3BwCkBAIC0wLDAgKzEsMTc0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJVc2JPYnNlcnZlciIKKyNpbmNsdWRlICJ1dGlscy9Mb2cuaCIKKworI2luY2x1ZGUgImpuaS5oIgorI2luY2x1ZGUgIkpOSUhlbHAuaCIKKyNpbmNsdWRlICJhbmRyb2lkX3J1bnRpbWUvQW5kcm9pZFJ1bnRpbWUuaCIKKyNpbmNsdWRlICJ1dGlscy9WZWN0b3IuaCIKKworI2luY2x1ZGUgPHVzYmhvc3QvdXNiaG9zdC5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLCA2LCAyMCkKKyNpbmNsdWRlIDxsaW51eC91c2IvY2g5Lmg+CisjZWxzZQorI2luY2x1ZGUgPGxpbnV4L3VzYl9jaDkuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKworbmFtZXNwYWNlIGFuZHJvaWQKK3sKKworc3RhdGljIGptZXRob2RJRCBtZXRob2RfdXNiQ2FtZXJhQWRkZWQ7CitzdGF0aWMgam1ldGhvZElEIG1ldGhvZF91c2JDYW1lcmFSZW1vdmVkOworCitWZWN0b3I8aW50PiBtRGV2aWNlTGlzdDsKKworc3RhdGljIHZvaWQgY2hlY2tBbmRDbGVhckV4Y2VwdGlvbkZyb21DYWxsYmFjayhKTklFbnYqIGVudiwgY29uc3QgY2hhciogbWV0aG9kTmFtZSkgeworICAgIGlmIChlbnYtPkV4Y2VwdGlvbkNoZWNrKCkpIHsKKyAgICAgICAgTE9HRSgiQW4gZXhjZXB0aW9uIHdhcyB0aHJvd24gYnkgY2FsbGJhY2sgJyVzJy4iLCBtZXRob2ROYW1lKTsKKyAgICAgICAgTE9HRV9FWChlbnYpOworICAgICAgICBlbnYtPkV4Y2VwdGlvbkNsZWFyKCk7CisgICAgfQorfQorCitzdGF0aWMgaW50IHVzYl9kZXZpY2VfYWRkZWQoY29uc3QgY2hhciAqZGV2bmFtZSwgdm9pZCogY2xpZW50X2RhdGEpIHsKKyAgICAvLyBjaGVjayB0byBzZWUgaWYgaXQgaXMgYSBjYW1lcmEKKyAgICBzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyKiBkZXNjOworICAgIHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9pdGVyIGl0ZXI7CisKKyAgICBzdHJ1Y3QgdXNiX2RldmljZSAqZGV2aWNlID0gdXNiX2RldmljZV9vcGVuKGRldm5hbWUpOworICAgIGlmICghZGV2aWNlKSB7CisgICAgICAgIExPR0UoInVzYl9kZXZpY2Vfb3BlbiBmYWlsZWRcbiIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICB1c2JfZGVzY3JpcHRvcl9pdGVyX2luaXQoZGV2aWNlLCAmaXRlcik7CisKKyAgICB3aGlsZSAoKGRlc2MgPSB1c2JfZGVzY3JpcHRvcl9pdGVyX25leHQoJml0ZXIpKSAhPSBOVUxMKSB7CisgICAgICAgIGlmIChkZXNjLT5iRGVzY3JpcHRvclR5cGUgPT0gVVNCX0RUX0lOVEVSRkFDRSkgeworICAgICAgICAgICAgc3RydWN0IHVzYl9pbnRlcmZhY2VfZGVzY3JpcHRvciAqaW50ZXJmYWNlID0gKHN0cnVjdCB1c2JfaW50ZXJmYWNlX2Rlc2NyaXB0b3IgKilkZXNjOworCisgICAgICAgICAgICBpZiAoaW50ZXJmYWNlLT5iSW50ZXJmYWNlQ2xhc3MgPT0gVVNCX0NMQVNTX1NUSUxMX0lNQUdFICYmCisgICAgICAgICAgICAgICAgaW50ZXJmYWNlLT5iSW50ZXJmYWNlU3ViQ2xhc3MgPT0gMSAmJiAvLyBTdGlsbCBJbWFnZSBDYXB0dXJlCisgICAgICAgICAgICAgICAgaW50ZXJmYWNlLT5iSW50ZXJmYWNlUHJvdG9jb2wgPT0gMSkgICAgIC8vIFBpY3R1cmUgVHJhbnNmZXIgUHJvdG9jb2wgKFBJTUEgMTU0NzApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTE9HRCgiRm91bmQgY2FtZXJhOiBcIiVzXCIgXCIlc1wiXG4iLCB1c2JfZGV2aWNlX2dldF9tYW51ZmFjdHVyZXJfbmFtZShkZXZpY2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgdXNiX2RldmljZV9nZXRfcHJvZHVjdF9uYW1lKGRldmljZSkpOworCisgICAgICAgICAgICAgICAgLy8gaW50ZXJmYWNlIHNob3VsZCBiZSBmb2xsb3dlZCBieSB0aHJlZSBlbmRwb2ludHMKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVwOworICAgICAgICAgICAgICAgIHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZXBfaW5fZGVzYyA9IE5VTEw7CisgICAgICAgICAgICAgICAgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplcF9vdXRfZGVzYyA9IE5VTEw7CisgICAgICAgICAgICAgICAgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplcF9pbnRyX2Rlc2MgPSBOVUxMOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGVwID0gKHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqKXVzYl9kZXNjcmlwdG9yX2l0ZXJfbmV4dCgmaXRlcik7CisgICAgICAgICAgICAgICAgICAgIGlmICghZXAgfHwgZXAtPmJEZXNjcmlwdG9yVHlwZSAhPSBVU0JfRFRfRU5EUE9JTlQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPR0UoImVuZHBvaW50cyBub3QgZm91bmRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgZ290byBkb25lOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChlcC0+Ym1BdHRyaWJ1dGVzID09IFVTQl9FTkRQT0lOVF9YRkVSX0JVTEspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcC0+YkVuZHBvaW50QWRkcmVzcyAmIFVTQl9FTkRQT0lOVF9ESVJfTUFTSykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcF9pbl9kZXNjID0gZXA7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXBfb3V0X2Rlc2MgPSBlcDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlcC0+Ym1BdHRyaWJ1dGVzID09IFVTQl9FTkRQT0lOVF9YRkVSX0lOVCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgZXAtPmJFbmRwb2ludEFkZHJlc3MgJiBVU0JfRU5EUE9JTlRfRElSX01BU0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVwX2ludHJfZGVzYyA9IGVwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICghZXBfaW5fZGVzYyB8fCAhZXBfb3V0X2Rlc2MgfHwgIWVwX2ludHJfZGVzYykgeworICAgICAgICAgICAgICAgICAgICBMT0dFKCJlbmRwb2ludHMgbm90IGZvdW5kXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBkb25lOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIGlmIHdlIGdvdCBoZXJlLCB3ZSBmb3VuZCBhIGNhbWVyYQorICAgICAgICAgICAgICAgIEpOSUVudiogZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgICAgICAgICAgICAgIGpvYmplY3QgdGhpeiA9IChqb2JqZWN0KWNsaWVudF9kYXRhOworCisgICAgICAgICAgICAgICAgaW50IGlkID0gdXNiX2RldmljZV9nZXRfdW5pcXVlX2lkX2Zyb21fbmFtZShkZXZuYW1lKTsKKyAgICAgICAgICAgICAgICBtRGV2aWNlTGlzdC5hZGQoaWQpOworCisgICAgICAgICAgICAgICAgZW52LT5DYWxsVm9pZE1ldGhvZCh0aGl6LCBtZXRob2RfdXNiQ2FtZXJhQWRkZWQsIGlkKTsKKyAgICAgICAgICAgICAgICBjaGVja0FuZENsZWFyRXhjZXB0aW9uRnJvbUNhbGxiYWNrKGVudiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK2RvbmU6CisgICAgdXNiX2RldmljZV9jbG9zZShkZXZpY2UpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHVzYl9kZXZpY2VfcmVtb3ZlZChjb25zdCBjaGFyICpkZXZuYW1lLCB2b2lkKiBjbGllbnRfZGF0YSkgeworICAgIGludCBpZCA9IHVzYl9kZXZpY2VfZ2V0X3VuaXF1ZV9pZF9mcm9tX25hbWUoZGV2bmFtZSk7CisKKyAgICAvLyBzZWUgaWYgaXQgaXMgYSBkZXZpY2Ugd2Uga25vdyBhYm91dAorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbURldmljZUxpc3Quc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKGlkICA9PSBtRGV2aWNlTGlzdFtpXSkgeworICAgICAgICAgICAgbURldmljZUxpc3QucmVtb3ZlQXQoaSk7CisKKyAgICAgICAgICAgIEpOSUVudiogZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgICAgICAgICAgam9iamVjdCB0aGl6ID0gKGpvYmplY3QpY2xpZW50X2RhdGE7CisKKyAgICAgICAgICAgIGVudi0+Q2FsbFZvaWRNZXRob2QodGhpeiwgbWV0aG9kX3VzYkNhbWVyYVJlbW92ZWQsIGlkKTsKKyAgICAgICAgICAgIGNoZWNrQW5kQ2xlYXJFeGNlcHRpb25Gcm9tQ2FsbGJhY2soZW52LCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGFuZHJvaWRfc2VydmVyX1VzYk9ic2VydmVyX21vbml0b3JVc2JIb3N0QnVzKEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXopCit7CisgICAgc3RydWN0IHVzYl9ob3N0X2NvbnRleHQqIGNvbnRleHQgPSB1c2JfaG9zdF9pbml0KCk7CisgICAgaWYgKCFjb250ZXh0KSB7CisgICAgICAgIExPR0UoInVzYl9ob3N0X2luaXQgZmFpbGVkIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgLy8gdGhpcyB3aWxsIG5ldmVyIHJldHVybiBzbyBpdCBpcyBzYWZlIHRvIHBhc3MgdGhpeiBkaXJlY3RseQorICAgIHVzYl9ob3N0X3J1bihjb250ZXh0LCB1c2JfZGV2aWNlX2FkZGVkLCB1c2JfZGV2aWNlX3JlbW92ZWQsIE5VTEwsICh2b2lkICopdGhpeik7Cit9CisKK3N0YXRpYyBKTklOYXRpdmVNZXRob2QgbWV0aG9kX3RhYmxlW10gPSB7CisgICAgeyAibW9uaXRvclVzYkhvc3RCdXMiLCAiKClWIiwgKHZvaWQqKWFuZHJvaWRfc2VydmVyX1VzYk9ic2VydmVyX21vbml0b3JVc2JIb3N0QnVzIH0KK307CisKK2ludCByZWdpc3Rlcl9hbmRyb2lkX3NlcnZlcl9Vc2JPYnNlcnZlcihKTklFbnYgKmVudikKK3sKKyAgICBqY2xhc3MgY2xhenogPSBlbnYtPkZpbmRDbGFzcygiY29tL2FuZHJvaWQvc2VydmVyL1VzYk9ic2VydmVyIik7CisgICAgaWYgKGNsYXp6ID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiQ2FuJ3QgZmluZCBjb20vYW5kcm9pZC9zZXJ2ZXIvVXNiT2JzZXJ2ZXIiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBtZXRob2RfdXNiQ2FtZXJhQWRkZWQgPSBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCAidXNiQ2FtZXJhQWRkZWQiLCAiKEkpViIpOworICAgIGlmIChtZXRob2RfdXNiQ2FtZXJhQWRkZWQgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJDYW4ndCBmaW5kIHVzYkNhbWVyYUFkZGVkIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgbWV0aG9kX3VzYkNhbWVyYVJlbW92ZWQgPSBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCAidXNiQ2FtZXJhUmVtb3ZlZCIsICIoSSlWIik7CisgICAgaWYgKG1ldGhvZF91c2JDYW1lcmFSZW1vdmVkID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiQ2FuJ3QgZmluZCB1c2JDYW1lcmFSZW1vdmVkIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICByZXR1cm4gam5pUmVnaXN0ZXJOYXRpdmVNZXRob2RzKGVudiwgImNvbS9hbmRyb2lkL3NlcnZlci9Vc2JPYnNlcnZlciIsCisgICAgICAgICAgICBtZXRob2RfdGFibGUsIE5FTEVNKG1ldGhvZF90YWJsZSkpOworfQorCit9OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvam5pL2NvbV9hbmRyb2lkX3NlcnZlcl9sb2NhdGlvbl9HcHNMb2NhdGlvblByb3ZpZGVyLmNwcCBiL3NlcnZpY2VzL2puaS9jb21fYW5kcm9pZF9zZXJ2ZXJfbG9jYXRpb25fR3BzTG9jYXRpb25Qcm92aWRlci5jcHAKaW5kZXggNTlkN2NkZS4uOTMwNjhlNiAxMDA3NTUKLS0tIGEvc2VydmljZXMvam5pL2NvbV9hbmRyb2lkX3NlcnZlcl9sb2NhdGlvbl9HcHNMb2NhdGlvblByb3ZpZGVyLmNwcAorKysgYi9zZXJ2aWNlcy9qbmkvY29tX2FuZHJvaWRfc2VydmVyX2xvY2F0aW9uX0dwc0xvY2F0aW9uUHJvdmlkZXIuY3BwCkBAIC0yNDUsOSArMjQ1LDkgQEAKICAgICAgICAgc0FHcHNJbnRlcmZhY2UtPmluaXQoJnNBR3BzQ2FsbGJhY2tzKTsKIAogICAgIGlmICghc0dwc05pSW50ZXJmYWNlKQotICAgICAgIHNHcHNOaUludGVyZmFjZSA9IChjb25zdCBHcHNOaUludGVyZmFjZSopc0dwc0ludGVyZmFjZS0+Z2V0X2V4dGVuc2lvbihHUFNfTklfSU5URVJGQUNFKTsKKyAgICAgICAgc0dwc05pSW50ZXJmYWNlID0gKGNvbnN0IEdwc05pSW50ZXJmYWNlKilzR3BzSW50ZXJmYWNlLT5nZXRfZXh0ZW5zaW9uKEdQU19OSV9JTlRFUkZBQ0UpOwogICAgIGlmIChzR3BzTmlJbnRlcmZhY2UpCi0gICAgICAgc0dwc05pSW50ZXJmYWNlLT5pbml0KCZzR3BzTmlDYWxsYmFja3MpOworICAgICAgICBzR3BzTmlJbnRlcmZhY2UtPmluaXQoJnNHcHNOaUNhbGxiYWNrcyk7CiAKICAgICBpZiAoIXNHcHNEZWJ1Z0ludGVyZmFjZSkKICAgICAgICBzR3BzRGVidWdJbnRlcmZhY2UgPSAoY29uc3QgR3BzRGVidWdJbnRlcmZhY2UqKXNHcHNJbnRlcmZhY2UtPmdldF9leHRlbnNpb24oR1BTX0RFQlVHX0lOVEVSRkFDRSk7CkBAIC00MTMsMTIgKzQxMywxMCBAQAogc3RhdGljIHZvaWQgYW5kcm9pZF9sb2NhdGlvbl9HcHNMb2NhdGlvblByb3ZpZGVyX3NlbmRfbmlfcmVzcG9uc2UoSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqLAogICAgICAgamludCBub3RpZklkLCBqaW50IHJlc3BvbnNlKQogewotICAgIGlmICghc0dwc05pSW50ZXJmYWNlKSB7CisgICAgaWYgKCFzR3BzTmlJbnRlcmZhY2UpCiAgICAgICAgIHNHcHNOaUludGVyZmFjZSA9IChjb25zdCBHcHNOaUludGVyZmFjZSopc0dwc0ludGVyZmFjZS0+Z2V0X2V4dGVuc2lvbihHUFNfTklfSU5URVJGQUNFKTsKLSAgICB9Ci0gICAgaWYgKHNHcHNOaUludGVyZmFjZSkgeworICAgIGlmIChzR3BzTmlJbnRlcmZhY2UpCiAgICAgICAgIHNHcHNOaUludGVyZmFjZS0+cmVzcG9uZChub3RpZklkLCByZXNwb25zZSk7Ci0gICAgfQogfQogCiBzdGF0aWMganN0cmluZyBhbmRyb2lkX2xvY2F0aW9uX0dwc0xvY2F0aW9uUHJvdmlkZXJfZ2V0X2ludGVybmFsX3N0YXRlKEpOSUVudiogZW52LCBqb2JqZWN0IG9iaikKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2puaS9vbmxvYWQuY3BwIGIvc2VydmljZXMvam5pL29ubG9hZC5jcHAKaW5kZXggY2Q0ZjBhNC4uMzUwMmFjYSAxMDA2NDQKLS0tIGEvc2VydmljZXMvam5pL29ubG9hZC5jcHAKKysrIGIvc2VydmljZXMvam5pL29ubG9hZC5jcHAKQEAgLTksNiArOSw3IEBACiBpbnQgcmVnaXN0ZXJfYW5kcm9pZF9zZXJ2ZXJfSW5wdXRNYW5hZ2VyKEpOSUVudiogZW52KTsKIGludCByZWdpc3Rlcl9hbmRyb2lkX3NlcnZlcl9MaWdodHNTZXJ2aWNlKEpOSUVudiogZW52KTsKIGludCByZWdpc3Rlcl9hbmRyb2lkX3NlcnZlcl9Qb3dlck1hbmFnZXJTZXJ2aWNlKEpOSUVudiogZW52KTsKK2ludCByZWdpc3Rlcl9hbmRyb2lkX3NlcnZlcl9Vc2JPYnNlcnZlcihKTklFbnYqIGVudik7CiBpbnQgcmVnaXN0ZXJfYW5kcm9pZF9zZXJ2ZXJfVmlicmF0b3JTZXJ2aWNlKEpOSUVudiogZW52KTsKIGludCByZWdpc3Rlcl9hbmRyb2lkX3NlcnZlcl9TeXN0ZW1TZXJ2ZXIoSk5JRW52KiBlbnYpOwogaW50IHJlZ2lzdGVyX2FuZHJvaWRfc2VydmVyX2xvY2F0aW9uX0dwc0xvY2F0aW9uUHJvdmlkZXIoSk5JRW52KiBlbnYpOwpAQCAtMzIsNiArMzMsNyBAQAogICAgIHJlZ2lzdGVyX2FuZHJvaWRfc2VydmVyX0xpZ2h0c1NlcnZpY2UoZW52KTsKICAgICByZWdpc3Rlcl9hbmRyb2lkX3NlcnZlcl9BbGFybU1hbmFnZXJTZXJ2aWNlKGVudik7CiAgICAgcmVnaXN0ZXJfYW5kcm9pZF9zZXJ2ZXJfQmF0dGVyeVNlcnZpY2UoZW52KTsKKyAgICByZWdpc3Rlcl9hbmRyb2lkX3NlcnZlcl9Vc2JPYnNlcnZlcihlbnYpOwogICAgIHJlZ2lzdGVyX2FuZHJvaWRfc2VydmVyX1ZpYnJhdG9yU2VydmljZShlbnYpOwogICAgIHJlZ2lzdGVyX2FuZHJvaWRfc2VydmVyX1N5c3RlbVNlcnZlcihlbnYpOwogICAgIHJlZ2lzdGVyX2FuZHJvaWRfc2VydmVyX2xvY2F0aW9uX0dwc0xvY2F0aW9uUHJvdmlkZXIoZW52KTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9BbmRyb2lkLm1rCmluZGV4IGExNGJmYjUuLmU0ODI1ZDAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0FuZHJvaWQubWsKKysrIGIvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvQW5kcm9pZC5tawpAQCAtNSw2ICs1LDcgQEAKICAgICBjbHouY3BwLmFybSBcCiAgICAgRGlzcGxheUhhcmR3YXJlL0Rpc3BsYXlIYXJkd2FyZS5jcHAgXAogICAgIERpc3BsYXlIYXJkd2FyZS9EaXNwbGF5SGFyZHdhcmVCYXNlLmNwcCBcCisgICAgRGlzcGxheUhhcmR3YXJlL0hXQ29tcG9zZXIuY3BwIFwKICAgICBCbHVyRmlsdGVyLmNwcC5hcm0gXAogICAgIEdMRXh0ZW5zaW9ucy5jcHAgXAogICAgIExheWVyLmNwcCBcCkBAIC0yMSw3ICsyMiw3IEBACiBMT0NBTF9DRkxBR1MgKz0gLURHTF9HTEVYVF9QUk9UT1RZUEVTIC1ERUdMX0VHTEVYVF9QUk9UT1RZUEVTCiAKIGlmZXEgKCQoVEFSR0VUX0JPQVJEX1BMQVRGT1JNKSwgb21hcDMpCi0JTE9DQUxfQ0ZMQUdTICs9IC1ETk9fUkdCWF84ODg4CisJTE9DQUxfQ0ZMQUdTICs9IC1ETk9fUkdCWF84ODg4IC1ESEFTX1BVU0hfQlVGRkVSUwogZW5kaWYKIAogIyBuZWVkICItbHJ0IiBvbiBMaW51eCBzaW11bGF0b3IgdG8gcGljayB1cCBjbG9ja19nZXR0aW1lCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9EaXNwbGF5SGFyZHdhcmUvRGlzcGxheUhhcmR3YXJlLmNwcCBiL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0Rpc3BsYXlIYXJkd2FyZS9EaXNwbGF5SGFyZHdhcmUuY3BwCmluZGV4IDJlYWMwYTguLjE2NmM1MjggMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0Rpc3BsYXlIYXJkd2FyZS9EaXNwbGF5SGFyZHdhcmUuY3BwCisrKyBiL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0Rpc3BsYXlIYXJkd2FyZS9EaXNwbGF5SGFyZHdhcmUuY3BwCkBAIC0zNiwxMSArMzYsMTEgQEAKIAogI2luY2x1ZGUgIkRpc3BsYXlIYXJkd2FyZS9EaXNwbGF5SGFyZHdhcmUuaCIKIAotI2luY2x1ZGUgPGhhcmR3YXJlL2NvcHliaXQuaD4KICNpbmNsdWRlIDxoYXJkd2FyZS9vdmVybGF5Lmg+CiAjaW5jbHVkZSA8aGFyZHdhcmUvZ3JhbGxvYy5oPgogCiAjaW5jbHVkZSAiR0xFeHRlbnNpb25zLmgiCisjaW5jbHVkZSAiSFdDb21wb3Nlci5oIgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIApAQCAtNzYsNyArNzYsNyBAQAogICAgICAgICBjb25zdCBzcDxTdXJmYWNlRmxpbmdlcj4mIGZsaW5nZXIsCiAgICAgICAgIHVpbnQzMl90IGRweSkKICAgICA6IERpc3BsYXlIYXJkd2FyZUJhc2UoZmxpbmdlciwgZHB5KSwKLSAgICAgIG1GbGFncygwKQorICAgICAgbUZsYWdzKDApLCBtSHdjKDApCiB7CiAgICAgaW5pdChkcHkpOwogfQpAQCAtMjYyLDYgKzI2MiwxNyBAQAogCiAgICAgLy8gVW5iaW5kIHRoZSBjb250ZXh0IGZyb20gdGhpcyB0aHJlYWQKICAgICBlZ2xNYWtlQ3VycmVudChkaXNwbGF5LCBFR0xfTk9fU1VSRkFDRSwgRUdMX05PX1NVUkZBQ0UsIEVHTF9OT19DT05URVhUKTsKKworCisgICAgLy8gaW5pdGlhbGl6ZSB0aGUgSC9XIGNvbXBvc2VyCisgICAgbUh3YyA9IG5ldyBIV0NvbXBvc2VyKCk7CisgICAgaWYgKG1Id2MtPmluaXRDaGVjaygpID09IE5PX0VSUk9SKSB7CisgICAgICAgIG1Id2MtPnNldEZyYW1lQnVmZmVyKG1EaXNwbGF5LCBtU3VyZmFjZSk7CisgICAgfQorfQorCitIV0NvbXBvc2VyJiBEaXNwbGF5SGFyZHdhcmU6OmdldEh3Q29tcG9zZXIoKSBjb25zdCB7CisgICAgcmV0dXJuICptSHdjOwogfQogCiAvKgpAQCAtMzE3LDcgKzMyOCwxMiBAQAogICAgIH0KICAgICAKICAgICBtUGFnZUZsaXBDb3VudCsrOwotICAgIGVnbFN3YXBCdWZmZXJzKGRweSwgc3VyZmFjZSk7CisKKyAgICBpZiAobUh3Yy0+aW5pdENoZWNrKCkgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgbUh3Yy0+Y29tbWl0KCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZWdsU3dhcEJ1ZmZlcnMoZHB5LCBzdXJmYWNlKTsKKyAgICB9CiAgICAgY2hlY2tFR0xFcnJvcnMoImVnbFN3YXBCdWZmZXJzIik7CiAKICAgICAvLyBmb3IgZGVidWdnaW5nCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9EaXNwbGF5SGFyZHdhcmUvRGlzcGxheUhhcmR3YXJlLmggYi9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9EaXNwbGF5SGFyZHdhcmUvRGlzcGxheUhhcmR3YXJlLmgKaW5kZXggNjZiZjUyMS4uZjJjZmQyZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvRGlzcGxheUhhcmR3YXJlL0Rpc3BsYXlIYXJkd2FyZS5oCisrKyBiL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0Rpc3BsYXlIYXJkd2FyZS9EaXNwbGF5SGFyZHdhcmUuaApAQCAtMzQsMTIgKzM0LDExIEBACiAjaW5jbHVkZSAiRGlzcGxheUhhcmR3YXJlL0Rpc3BsYXlIYXJkd2FyZUJhc2UuaCIKIAogc3RydWN0IG92ZXJsYXlfY29udHJvbF9kZXZpY2VfdDsKLXN0cnVjdCBmcmFtZWJ1ZmZlcl9kZXZpY2VfdDsKLXN0cnVjdCBjb3B5Yml0X2ltYWdlX3Q7CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogY2xhc3MgRnJhbWVidWZmZXJOYXRpdmVXaW5kb3c7CitjbGFzcyBIV0NvbXBvc2VyOwogCiBjbGFzcyBEaXNwbGF5SGFyZHdhcmUgOiBwdWJsaWMgRGlzcGxheUhhcmR3YXJlQmFzZQogewpAQCAtODAsNiArNzksOSBAQAogICAgIHVpbnQzMl90IGdldFBhZ2VGbGlwQ291bnQoKSBjb25zdDsKICAgICBFR0xEaXNwbGF5IGdldEVHTERpc3BsYXkoKSBjb25zdCB7IHJldHVybiBtRGlzcGxheTsgfQogICAgIG92ZXJsYXlfY29udHJvbF9kZXZpY2VfdCogZ2V0T3ZlcmxheUVuZ2luZSgpIGNvbnN0IHsgcmV0dXJuIG1PdmVybGF5RW5naW5lOyB9CisKKyAgICAvLyBIYXJkd2FyZSBDb21wb3NlcgorICAgIEhXQ29tcG9zZXImIGdldEh3Q29tcG9zZXIoKSBjb25zdDsKICAgICAKICAgICBzdGF0dXNfdCBjb21wb3NpdGlvbkNvbXBsZXRlKCkgY29uc3Q7CiAgICAgCkBAIC0xMDcsNiArMTA5LDggQEAKICAgICBHTGludCAgICAgICAgICAgbU1heFZpZXdwb3J0RGltczsKICAgICBHTGludCAgICAgICAgICAgbU1heFRleHR1cmVTaXplOwogICAgIAorICAgIEhXQ29tcG9zZXIqICAgICBtSHdjOworCiAgICAgc3A8RnJhbWVidWZmZXJOYXRpdmVXaW5kb3c+IG1OYXRpdmVXaW5kb3c7CiAgICAgb3ZlcmxheV9jb250cm9sX2RldmljZV90KiBtT3ZlcmxheUVuZ2luZTsKIH07CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9EaXNwbGF5SGFyZHdhcmUvSFdDb21wb3Nlci5jcHAgYi9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9EaXNwbGF5SGFyZHdhcmUvSFdDb21wb3Nlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI5MWQ3OAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0Rpc3BsYXlIYXJkd2FyZS9IV0NvbXBvc2VyLmNwcApAQCAtMCwwICsxLDk5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKworI2luY2x1ZGUgPGhhcmR3YXJlL2hhcmR3YXJlLmg+CisKKyNpbmNsdWRlIDxjdXRpbHMvbG9nLmg+CisKKyNpbmNsdWRlIDxFR0wvZWdsLmg+CisKKyNpbmNsdWRlICJIV0NvbXBvc2VyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitIV0NvbXBvc2VyOjpIV0NvbXBvc2VyKCkKKyAgICA6IG1Nb2R1bGUoMCksIG1Id2MoMCksIG1MaXN0KDApLCBtQ2FwYWNpdHkoMCksCisgICAgICBtRHB5KEVHTF9OT19ESVNQTEFZKSwgbVN1cihFR0xfTk9fU1VSRkFDRSkKK3sKKyAgICBpbnQgZXJyID0gaHdfZ2V0X21vZHVsZShIV0NfSEFSRFdBUkVfTU9EVUxFX0lELCAmbU1vZHVsZSk7CisgICAgTE9HV19JRihlcnIsICIlcyBtb2R1bGUgbm90IGZvdW5kIiwgSFdDX0hBUkRXQVJFX01PRFVMRV9JRCk7CisgICAgaWYgKGVyciA9PSAwKSB7CisgICAgICAgIGVyciA9IGh3Y19vcGVuKG1Nb2R1bGUsICZtSHdjKTsKKyAgICAgICAgTE9HRV9JRihlcnIsICIlcyBkZXZpY2UgZmFpbGVkIHRvIGluaXRpYWxpemUgKCVzKSIsCisgICAgICAgICAgICAgICAgSFdDX0hBUkRXQVJFX0NPTVBPU0VSLCBzdHJlcnJvcigtZXJyKSk7CisgICAgfQorfQorCitIV0NvbXBvc2VyOjp+SFdDb21wb3NlcigpIHsKKyAgICBmcmVlKG1MaXN0KTsKKyAgICBpZiAobUh3YykgeworICAgICAgICBod2NfY2xvc2UobUh3Yyk7CisgICAgfQorfQorCitzdGF0dXNfdCBIV0NvbXBvc2VyOjppbml0Q2hlY2soKSBjb25zdCB7CisgICAgcmV0dXJuIG1Id2MgPyBOT19FUlJPUiA6IE5PX0lOSVQ7Cit9CisKK3ZvaWQgSFdDb21wb3Nlcjo6c2V0RnJhbWVCdWZmZXIoRUdMRGlzcGxheSBkcHksIEVHTFN1cmZhY2Ugc3VyKSB7CisgICAgbURweSA9IChod2NfZGlzcGxheV90KWRweTsKKyAgICBtU3VyID0gKGh3Y19zdXJmYWNlX3Qpc3VyOworfQorCitzdGF0dXNfdCBIV0NvbXBvc2VyOjpjcmVhdGVXb3JrTGlzdChzaXplX3QgbnVtTGF5ZXJzKSB7CisgICAgaWYgKG1Id2MpIHsKKyAgICAgICAgaWYgKCFtTGlzdCB8fCBtQ2FwYWNpdHkgPCBudW1MYXllcnMpIHsKKyAgICAgICAgICAgIGZyZWUobUxpc3QpOworICAgICAgICAgICAgc2l6ZV90IHNpemUgPSBzaXplb2YoaHdjX2xheWVyX2xpc3QpICsgbnVtTGF5ZXJzKnNpemVvZihod2NfbGF5ZXJfdCk7CisgICAgICAgICAgICBtTGlzdCA9IChod2NfbGF5ZXJfbGlzdF90KiltYWxsb2Moc2l6ZSk7CisgICAgICAgICAgICBtQ2FwYWNpdHkgPSBudW1MYXllcnM7CisgICAgICAgIH0KKyAgICAgICAgbUxpc3QtPmZsYWdzID0gSFdDX0dFT01FVFJZX0NIQU5HRUQ7CisgICAgICAgIG1MaXN0LT5udW1Id0xheWVycyA9IG51bUxheWVyczsKKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBIV0NvbXBvc2VyOjpwcmVwYXJlKCkgY29uc3QgeworICAgIGludCBlcnIgPSBtSHdjLT5wcmVwYXJlKG1Id2MsIG1MaXN0KTsKKyAgICByZXR1cm4gKHN0YXR1c190KWVycjsKK30KKworc3RhdHVzX3QgSFdDb21wb3Nlcjo6Y29tbWl0KCkgY29uc3QgeworICAgIGludCBlcnIgPSBtSHdjLT5zZXQobUh3YywgbURweSwgbVN1ciwgbUxpc3QpOworICAgIG1MaXN0LT5mbGFncyAmPSB+SFdDX0dFT01FVFJZX0NIQU5HRUQ7CisgICAgcmV0dXJuIChzdGF0dXNfdCllcnI7Cit9CisKK3NpemVfdCBIV0NvbXBvc2VyOjpnZXROdW1MYXllcnMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1MaXN0ID8gbUxpc3QtPm51bUh3TGF5ZXJzIDogMDsKK30KKworaHdjX2xheWVyX3QqIEhXQ29tcG9zZXI6OmdldExheWVycygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUxpc3QgPyBtTGlzdC0+aHdMYXllcnMgOiAwOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9EaXNwbGF5SGFyZHdhcmUvSFdDb21wb3Nlci5oIGIvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvRGlzcGxheUhhcmR3YXJlL0hXQ29tcG9zZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWQ1YzJiCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvRGlzcGxheUhhcmR3YXJlL0hXQ29tcG9zZXIuaApAQCAtMCwwICsxLDY4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1NGX0hXQ09NUE9TRVJfSAorI2RlZmluZSBBTkRST0lEX1NGX0hXQ09NUE9TRVJfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxFR0wvZWdsLmg+CisKKyNpbmNsdWRlIDxoYXJkd2FyZS9od2NvbXBvc2VyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBIV0NvbXBvc2VyCit7CitwdWJsaWM6CisKKyAgICBIV0NvbXBvc2VyKCk7CisgICAgfkhXQ29tcG9zZXIoKTsKKworICAgIHN0YXR1c190IGluaXRDaGVjaygpIGNvbnN0OworCisgICAgLy8gdGVsbHMgdGhlIEhBTCB3aGF0IHRoZSBmcmFtZWJ1ZmZlciBpcworICAgIHZvaWQgc2V0RnJhbWVCdWZmZXIoRUdMRGlzcGxheSBkcHksIEVHTFN1cmZhY2Ugc3VyKTsKKworICAgIC8vIGNyZWF0ZSBhIHdvcmsgbGlzdCBmb3IgbnVtTGF5ZXJzIGxheWVyCisgICAgc3RhdHVzX3QgY3JlYXRlV29ya0xpc3Qoc2l6ZV90IG51bUxheWVycyk7CisKKyAgICAvLyBBc2tzIHRoZSBIQUwgd2hhdCBpdCBjYW4gZG8KKyAgICBzdGF0dXNfdCBwcmVwYXJlKCkgY29uc3Q7CisKKyAgICAvLyBjb21taXRzIHRoZSBsaXN0CisgICAgc3RhdHVzX3QgY29tbWl0KCkgY29uc3Q7CisKKworICAgIHNpemVfdCBnZXROdW1MYXllcnMoKSBjb25zdDsKKyAgICBod2NfbGF5ZXJfdCogZ2V0TGF5ZXJzKCkgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgaHdfbW9kdWxlX3QgY29uc3QqICAgICAgbU1vZHVsZTsKKyAgICBod2NfY29tcG9zZXJfZGV2aWNlX3QqICBtSHdjOworICAgIGh3Y19sYXllcl9saXN0X3QqICAgICAgIG1MaXN0OworICAgIHNpemVfdCAgICAgICAgICAgICAgICAgIG1DYXBhY2l0eTsKKyAgICBod2NfZGlzcGxheV90ICAgICAgICAgICBtRHB5OworICAgIGh3Y19zdXJmYWNlX3QgICAgICAgICAgIG1TdXI7Cit9OworCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfU0ZfSFdDT01QT1NFUl9ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9MYXllci5jcHAgYi9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9MYXllci5jcHAKaW5kZXggNmYzYzY2ZC4uMjEyYzA4YiAxMDA2NDQKLS0tIGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvTGF5ZXIuY3BwCisrKyBiL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0xheWVyLmNwcApAQCAtMzUsNiArMzUsNyBAQAogI2luY2x1ZGUgIkxheWVyLmgiCiAjaW5jbHVkZSAiU3VyZmFjZUZsaW5nZXIuaCIKICNpbmNsdWRlICJEaXNwbGF5SGFyZHdhcmUvRGlzcGxheUhhcmR3YXJlLmgiCisjaW5jbHVkZSAiRGlzcGxheUhhcmR3YXJlL0hXQ29tcG9zZXIuaCIKIAogCiAjZGVmaW5lIERFQlVHX1JFU0laRSAgICAwCkBAIC0xNzcsNiArMTc4LDYyIEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCit2b2lkIExheWVyOjpzZXRHZW9tZXRyeShod2NfbGF5ZXJfdCogaHdjbCkKK3sKKyAgICBod2NsLT5jb21wb3NpdGlvblR5cGUgPSBIV0NfRlJBTUVCVUZGRVI7CisgICAgaHdjbC0+aGludHMgPSAwOworICAgIGh3Y2wtPmZsYWdzID0gMDsKKyAgICBod2NsLT50cmFuc2Zvcm0gPSAwOworICAgIGh3Y2wtPmJsZW5kaW5nID0gSFdDX0JMRU5ESU5HX05PTkU7CisKKyAgICAvLyB3ZSBjYW4ndCBkbyBhbHBoYS1mYWRlIHdpdGggdGhlIGh3YyBIQUwKKyAgICBjb25zdCBTdGF0ZSYgcyhkcmF3aW5nU3RhdGUoKSk7CisgICAgaWYgKHMuYWxwaGEgPCAweEZGKSB7CisgICAgICAgIGh3Y2wtPmZsYWdzID0gSFdDX1NLSVBfTEFZRVI7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyB3ZSBjYW4gb25seSBoYW5kbGUgc2ltcGxlIHRyYW5zZm9ybWF0aW9uCisgICAgaWYgKG1PcmllbnRhdGlvbiAmIFRyYW5zZm9ybTo6Uk9UX0lOVkFMSUQpIHsKKyAgICAgICAgaHdjbC0+ZmxhZ3MgPSBIV0NfU0tJUF9MQVlFUjsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGh3Y2wtPnRyYW5zZm9ybSA9IG1PcmllbnRhdGlvbjsKKworICAgIGlmIChuZWVkc0JsZW5kaW5nKCkpIHsKKyAgICAgICAgaHdjbC0+YmxlbmRpbmcgPSBtUHJlbXVsdGlwbGllZEFscGhhID8KKyAgICAgICAgICAgICAgICBIV0NfQkxFTkRJTkdfUFJFTVVMVCA6IEhXQ19CTEVORElOR19DT1ZFUkFHRTsKKyAgICB9CisKKyAgICBod2NsLT5kaXNwbGF5RnJhbWUubGVmdCAgID0gbVRyYW5zZm9ybWVkQm91bmRzLmxlZnQ7CisgICAgaHdjbC0+ZGlzcGxheUZyYW1lLnRvcCAgICA9IG1UcmFuc2Zvcm1lZEJvdW5kcy50b3A7CisgICAgaHdjbC0+ZGlzcGxheUZyYW1lLnJpZ2h0ICA9IG1UcmFuc2Zvcm1lZEJvdW5kcy5yaWdodDsKKyAgICBod2NsLT5kaXNwbGF5RnJhbWUuYm90dG9tID0gbVRyYW5zZm9ybWVkQm91bmRzLmJvdHRvbTsKKworICAgIGh3Y2wtPnZpc2libGVSZWdpb25TY3JlZW4ucmVjdHMgPQorICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxod2NfcmVjdF90IGNvbnN0ICo+KAorICAgICAgICAgICAgICAgICAgICB2aXNpYmxlUmVnaW9uU2NyZWVuLmdldEFycmF5KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZod2NsLT52aXNpYmxlUmVnaW9uU2NyZWVuLm51bVJlY3RzKSk7Cit9CisKK3ZvaWQgTGF5ZXI6OnNldFBlckZyYW1lRGF0YShod2NfbGF5ZXJfdCogaHdjbCkgeworICAgIHNwPEdyYXBoaWNCdWZmZXI+IGJ1ZmZlcihtQnVmZmVyTWFuYWdlci5nZXRBY3RpdmVCdWZmZXIoKSk7CisgICAgaWYgKGJ1ZmZlciA9PSBOVUxMKSB7CisgICAgICAgIC8vIHRoaXMgc2l0dWF0aW9uIGNhbiBoYXBwZW4gaWYgd2UgcmFuIG91dCBvZiBtZW1vcnkgZm9yIGluc3RhbmNlLgorICAgICAgICAvLyBub3QgbXVjaCB3ZSBjYW4gZG8uIGNvbnRpbnVlIHRvIHVzZSB3aGF0ZXZlciB0ZXh0dXJlIHdhcyBib3VuZAorICAgICAgICAvLyB0byB0aGlzIGNvbnRleHQuCisgICAgICAgIGh3Y2wtPmhhbmRsZSA9IE5VTEw7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaHdjbC0+aGFuZGxlID0gY29uc3RfY2FzdDxuYXRpdmVfaGFuZGxlX3QqPihidWZmZXItPmhhbmRsZSk7CisgICAgLy8gVE9ETzogc2V0IHRoZSBjcm9wIHZhbHVlIHByb3Blcmx5CisgICAgaHdjbC0+c291cmNlQ3JvcC5sZWZ0ICAgPSAwOworICAgIGh3Y2wtPnNvdXJjZUNyb3AudG9wICAgID0gMDsKKyAgICBod2NsLT5zb3VyY2VDcm9wLnJpZ2h0ICA9IGJ1ZmZlci0+d2lkdGg7CisgICAgaHdjbC0+c291cmNlQ3JvcC5ib3R0b20gPSBidWZmZXItPmhlaWdodDsKK30KKwogdm9pZCBMYXllcjo6cmVsb2FkVGV4dHVyZShjb25zdCBSZWdpb24mIGRpcnR5KQogewogICAgIHNwPEdyYXBoaWNCdWZmZXI+IGJ1ZmZlcihtQnVmZmVyTWFuYWdlci5nZXRBY3RpdmVCdWZmZXIoKSk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9MYXllci5oIGIvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvTGF5ZXIuaAppbmRleCBlMWQyODNiLi4xODhkYTZhIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9MYXllci5oCisrKyBiL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0xheWVyLmgKQEAgLTY4LDYgKzY4LDggQEAKICAgICBib29sIGlzRml4ZWRTaXplKCkgY29uc3Q7CiAKICAgICAvLyBMYXllckJhc2UgaW50ZXJmYWNlCisgICAgdmlydHVhbCB2b2lkIHNldEdlb21ldHJ5KGh3Y19sYXllcl90KiBod2NsKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0UGVyRnJhbWVEYXRhKGh3Y19sYXllcl90KiBod2NsKTsKICAgICB2aXJ0dWFsIHZvaWQgb25EcmF3KGNvbnN0IFJlZ2lvbiYgY2xpcCkgY29uc3Q7CiAgICAgdmlydHVhbCB1aW50MzJfdCBkb1RyYW5zYWN0aW9uKHVpbnQzMl90IHRyYW5zYWN0aW9uRmxhZ3MpOwogICAgIHZpcnR1YWwgdm9pZCBsb2NrUGFnZUZsaXAoYm9vbCYgcmVjb21wdXRlVmlzaWJsZVJlZ2lvbnMpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvTGF5ZXJCYXNlLmNwcCBiL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0xheWVyQmFzZS5jcHAKaW5kZXggNmZjNTAxMC4uM2QwNDlhNyAxMDA2NDQKLS0tIGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvTGF5ZXJCYXNlLmNwcAorKysgYi9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9MYXllckJhc2UuY3BwCkBAIC0zMDksNiArMzA5LDE1IEBACiAgICAgfQogfQogCit2b2lkIExheWVyQmFzZTo6c2V0R2VvbWV0cnkoaHdjX2xheWVyX3QqIGh3Y2wpIHsKKyAgICBod2NsLT5mbGFncyB8PSBIV0NfU0tJUF9MQVlFUjsKK30KKwordm9pZCBMYXllckJhc2U6OnNldFBlckZyYW1lRGF0YShod2NfbGF5ZXJfdCogaHdjbCkgeworICAgIGh3Y2wtPmNvbXBvc2l0aW9uVHlwZSA9IEhXQ19GUkFNRUJVRkZFUjsKKyAgICBod2NsLT5oYW5kbGUgPSBOVUxMOworfQorCiB2b2lkIExheWVyQmFzZTo6ZHJhdyhjb25zdCBSZWdpb24mIGNsaXApIGNvbnN0CiB7CiAgICAgLy8gcmVzZXQgR0wgc3RhdGUKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0xheWVyQmFzZS5oIGIvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvTGF5ZXJCYXNlLmgKaW5kZXggOGNiYTI4Ny4uYzY2ZGMzNCAxMDA2NDQKLS0tIGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvTGF5ZXJCYXNlLmgKKysrIGIvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvTGF5ZXJCYXNlLmgKQEAgLTM1LDYgKzM1LDggQEAKIAogI2luY2x1ZGUgPHBpeGVsZmxpbmdlci9waXhlbGZsaW5nZXIuaD4KIAorI2luY2x1ZGUgPGhhcmR3YXJlL2h3Y29tcG9zZXIuaD4KKwogI2luY2x1ZGUgIlRyYW5zZm9ybS5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CkBAIC0xMDgsNiArMTEwLDEwIEBACiAKICAgICB2aXJ0dWFsIGNvbnN0IGNoYXIqIGdldFR5cGVJZCgpIGNvbnN0IHsgcmV0dXJuICJMYXllckJhc2UiOyB9CiAKKyAgICB2aXJ0dWFsIHZvaWQgc2V0R2VvbWV0cnkoaHdjX2xheWVyX3QqIGh3Y2wpOworCisgICAgdmlydHVhbCB2b2lkIHNldFBlckZyYW1lRGF0YShod2NfbGF5ZXJfdCogaHdjbCk7CisKICAgICAvKioKICAgICAgKiBkcmF3IC0gcGVyZm9ybXMgc29tZSBnbG9iYWwgY2xpcHBpbmcgb3B0aW1pemF0aW9ucwogICAgICAqIGFuZCBjYWxscyBvbkRyYXcoKS4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL1N1cmZhY2VGbGluZ2VyLmNwcCBiL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL1N1cmZhY2VGbGluZ2VyLmNwcAppbmRleCA2MzdhZTQ4Li5hNzhkOWI5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9TdXJmYWNlRmxpbmdlci5jcHAKKysrIGIvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvU3VyZmFjZUZsaW5nZXIuY3BwCkBAIC01Miw2ICs1Miw3IEBACiAjaW5jbHVkZSAiU3VyZmFjZUZsaW5nZXIuaCIKIAogI2luY2x1ZGUgIkRpc3BsYXlIYXJkd2FyZS9EaXNwbGF5SGFyZHdhcmUuaCIKKyNpbmNsdWRlICJEaXNwbGF5SGFyZHdhcmUvSFdDb21wb3Nlci5oIgogCiAvKiBpZGVhbGx5IEFJRF9HUkFQSElDUyB3b3VsZCBiZSBpbiBhIHNlbWktcHVibGljIGhlYWRlcgogICogb3IgdGhlcmUgd291bGQgYmUgYSB3YXkgdG8gbWFwIGEgdXNlci9ncm91cCBuYW1lIHRvIGl0cyBpZApAQCAtNzYsNiArNzcsNyBAQAogICAgICAgICBtQWNjZXNzU3VyZmFjZUZsaW5nZXIoImFuZHJvaWQucGVybWlzc2lvbi5BQ0NFU1NfU1VSRkFDRV9GTElOR0VSIiksCiAgICAgICAgIG1EdW1wKCJhbmRyb2lkLnBlcm1pc3Npb24uRFVNUCIpLAogICAgICAgICBtVmlzaWJsZVJlZ2lvbnNEaXJ0eShmYWxzZSksCisgICAgICAgIG1Id1dvcmtMaXN0RGlydHkoZmFsc2UpLAogICAgICAgICBtRGVmZXJSZWxlYXNlQ29uc29sZShmYWxzZSksCiAgICAgICAgIG1GcmVlemVEaXNwbGF5KGZhbHNlKSwKICAgICAgICAgbUZyZWV6ZUNvdW50KDApLApAQCAtMTYzLDcgKzE2NSw3IEBACiB7CiAgICAgY29uc3QgbnNlY3NfdCBub3cgPSBzeXN0ZW1UaW1lKCk7CiAgICAgY29uc3QgbnNlY3NfdCBkdXJhdGlvbiA9IG5vdyAtIG1Cb290VGltZTsKLSAgICBMT0dJKCJCb290IGlzIGZpbmlzaGVkICglbGQgbXMpIiwgbG9uZyhuczJtcyhkdXJhdGlvbikpICk7ICAKKyAgICBMT0dJKCJCb290IGlzIGZpbmlzaGVkICglbGQgbXMpIiwgbG9uZyhuczJtcyhkdXJhdGlvbikpICk7CiAgICAgbUJvb3RGaW5pc2hlZCA9IHRydWU7CiAgICAgcHJvcGVydHlfc2V0KCJjdGwuc3RvcCIsICJib290YW5pbSIpOwogfQpAQCAtMTk5LDEwICsyMDEsMTAgQEAKICAgICBtU2VydmVySGVhcCA9IG5ldyBNZW1vcnlIZWFwQmFzZSg0MDk2LAogICAgICAgICAgICAgTWVtb3J5SGVhcEJhc2U6OlJFQURfT05MWSwgIlN1cmZhY2VGbGluZ2VyIHJlYWQtb25seSBoZWFwIik7CiAgICAgTE9HRV9JRihtU2VydmVySGVhcD09MCwgImNhbid0IGNyZWF0ZSBzaGFyZWQgbWVtb3J5IGRlYWxlciIpOwotICAgIAorCiAgICAgbVNlcnZlckNibGsgPSBzdGF0aWNfY2FzdDxzdXJmYWNlX2ZsaW5nZXJfY2Jsa190Kj4obVNlcnZlckhlYXAtPmdldEJhc2UoKSk7CiAgICAgTE9HRV9JRihtU2VydmVyQ2Jsaz09MCwgImNhbid0IGdldCB0byBzaGFyZWQgY29udHJvbCBibG9jaydzIGFkZHJlc3MiKTsKLSAgICAKKwogICAgIG5ldyhtU2VydmVyQ2Jsaykgc3VyZmFjZV9mbGluZ2VyX2NibGtfdDsKIAogICAgIC8vIGluaXRpYWxpemUgcHJpbWFyeSBzY3JlZW4KQEAgLTIzMSw3ICsyMzMsNyBAQAogCiAgICAgLy8gSW5pdGlhbGl6ZSBPcGVuR0x8RVMKICAgICBnbFBpeGVsU3RvcmVpKEdMX1VOUEFDS19BTElHTk1FTlQsIDQpOwotICAgIGdsUGl4ZWxTdG9yZWkoR0xfUEFDS19BTElHTk1FTlQsIDQpOyAKKyAgICBnbFBpeGVsU3RvcmVpKEdMX1BBQ0tfQUxJR05NRU5ULCA0KTsKICAgICBnbEVuYWJsZUNsaWVudFN0YXRlKEdMX1ZFUlRFWF9BUlJBWSk7CiAgICAgZ2xFbmFibGUoR0xfU0NJU1NPUl9URVNUKTsKICAgICBnbFNoYWRlTW9kZWwoR0xfRkxBVCk7CkBAIC0yNjUsNyArMjY3LDcgQEAKIAogICAgIC8vIHN0YXJ0IGJvb3QgYW5pbWF0aW9uCiAgICAgcHJvcGVydHlfc2V0KCJjdGwuc3RhcnQiLCAiYm9vdGFuaW0iKTsKLSAgICAKKwogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIApAQCAtMzY4LDYgKzM3MCwxMSBAQAogICAgIC8vIHBvc3Qgc3VyZmFjZXMgKGlmIG5lZWRlZCkKICAgICBoYW5kbGVQYWdlRmxpcCgpOwogCisgICAgaWYgKFVOTElLRUxZKG1Id1dvcmtMaXN0RGlydHkpKSB7CisgICAgICAgIC8vIGJ1aWxkIHRoZSBoL3cgd29yayBsaXN0CisgICAgICAgIGhhbmRsZVdvcmtMaXN0KCk7CisgICAgfQorCiAgICAgY29uc3QgRGlzcGxheUhhcmR3YXJlJiBodyhncmFwaGljUGxhbmUoMCkuZGlzcGxheUhhcmR3YXJlKCkpOwogICAgIGlmIChMSUtFTFkoaHcuY2FuRHJhdygpICYmICFpc0Zyb3plbigpKSkgewogICAgICAgICAvLyByZXBhaW50IHRoZSBmcmFtZWJ1ZmZlciAoaWYgbmVlZGVkKQpAQCAtNDQzLDYgKzQ1MCw3IEBACiAgICAgICAgIGhhbmRsZVRyYW5zYWN0aW9uTG9ja2VkKHRyYW5zYWN0aW9uRmxhZ3MsIGRpdGNoZWRMYXllcnMpOwogICAgICAgICBtTGFzdFRyYW5zYWN0aW9uVGltZSA9IHN5c3RlbVRpbWUoKSAtIG5vdzsKICAgICAgICAgbURlYnVnSW5UcmFuc2FjdGlvbiA9IDA7CisgICAgICAgIG1Id1dvcmtMaXN0RGlydHkgPSB0cnVlOwogICAgICAgICAvLyBoZXJlIHRoZSB0cmFuc2FjdGlvbiBoYXMgYmVlbiBjb21taXR0ZWQKICAgICB9CiAKQEAgLTQ1MCw2ICs0NTgsNyBAQAogICAgICAqIENsZWFuLXVwIGFsbCBsYXllcnMgdGhhdCB3ZW50IGF3YXkKICAgICAgKiAoZG8gdGhpcyB3aXRob3V0IHRoZSBsb2NrIGhlbGQpCiAgICAgICovCisKICAgICBjb25zdCBzaXplX3QgY291bnQgPSBkaXRjaGVkTGF5ZXJzLnNpemUoKTsKICAgICBmb3IgKHNpemVfdCBpPTAgOyBpPGNvdW50IDsgaSsrKSB7CiAgICAgICAgIGlmIChkaXRjaGVkTGF5ZXJzW2ldICE9IDApIHsKQEAgLTY1Myw3ICs2NjIsNyBAQAogCiAgICAgICAgIC8vIFVwZGF0ZSBhYm92ZU9wYXF1ZUxheWVycyBmb3IgbmV4dCAobG93ZXIpIGxheWVyCiAgICAgICAgIGFib3ZlT3BhcXVlTGF5ZXJzLm9yU2VsZihvcGFxdWVSZWdpb24pOwotICAgICAgICAKKwogICAgICAgICAvLyBTdG9yZSB0aGUgdmlzaWJsZSByZWdpb24gaXMgc2NyZWVuIHNwYWNlCiAgICAgICAgIGxheWVyLT5zZXRWaXNpYmxlUmVnaW9uKHZpc2libGVSZWdpb24pOwogICAgICAgICBsYXllci0+c2V0Q292ZXJlZFJlZ2lvbihjb3ZlcmVkUmVnaW9uKTsKQEAgLTY4Myw4ICs2OTIsOCBAQAogdm9pZCBTdXJmYWNlRmxpbmdlcjo6aGFuZGxlUGFnZUZsaXAoKQogewogICAgIGJvb2wgdmlzaWJsZVJlZ2lvbnMgPSBtVmlzaWJsZVJlZ2lvbnNEaXJ0eTsKLSAgICBMYXllclZlY3RvciYgY3VycmVudExheWVycyA9IGNvbnN0X2Nhc3Q8TGF5ZXJWZWN0b3ImPigKLSAgICAgICAgICAgIG1EcmF3aW5nU3RhdGUubGF5ZXJzU29ydGVkQnlaKTsKKyAgICBMYXllclZlY3RvciYgY3VycmVudExheWVycygKKyAgICAgICAgICAgIGNvbnN0X2Nhc3Q8TGF5ZXJWZWN0b3ImPihtRHJhd2luZ1N0YXRlLmxheWVyc1NvcnRlZEJ5WikpOwogICAgIHZpc2libGVSZWdpb25zIHw9IGxvY2tQYWdlRmxpcChjdXJyZW50TGF5ZXJzKTsKIAogICAgICAgICBjb25zdCBEaXNwbGF5SGFyZHdhcmUmIGh3ID0gZ3JhcGhpY1BsYW5lKDApLmRpc3BsYXlIYXJkd2FyZSgpOwpAQCAtNzA3LDYgKzcxNiw3IEBACiAKICAgICAgICAgICAgIG1Xb3JtaG9sZVJlZ2lvbiA9IHNjcmVlblJlZ2lvbi5zdWJ0cmFjdChvcGFxdWVSZWdpb24pOwogICAgICAgICAgICAgbVZpc2libGVSZWdpb25zRGlydHkgPSBmYWxzZTsKKyAgICAgICAgICAgIG1Id1dvcmtMaXN0RGlydHkgPSB0cnVlOwogICAgICAgICB9CiAKICAgICB1bmxvY2tQYWdlRmxpcChjdXJyZW50TGF5ZXJzKTsKQEAgLTczNyw2ICs3NDcsMjAgQEAKICAgICB9CiB9CiAKK3ZvaWQgU3VyZmFjZUZsaW5nZXI6OmhhbmRsZVdvcmtMaXN0KCkKK3sKKyAgICBtSHdXb3JrTGlzdERpcnR5ID0gZmFsc2U7CisgICAgSFdDb21wb3NlciYgaHdjKGdyYXBoaWNQbGFuZSgwKS5kaXNwbGF5SGFyZHdhcmUoKS5nZXRId0NvbXBvc2VyKCkpOworICAgIGlmIChod2MuaW5pdENoZWNrKCkgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgY29uc3QgVmVjdG9yPCBzcDxMYXllckJhc2U+ID4mIGN1cnJlbnRMYXllcnMobVZpc2libGVMYXllcnNTb3J0ZWRCeVopOworICAgICAgICBjb25zdCBzaXplX3QgY291bnQgPSBjdXJyZW50TGF5ZXJzLnNpemUoKTsKKyAgICAgICAgaHdjLmNyZWF0ZVdvcmtMaXN0KGNvdW50KTsKKyAgICAgICAgaHdjX2xheWVyX3QqIGNvbnN0IGN1cihod2MuZ2V0TGF5ZXJzKCkpOworICAgICAgICBmb3IgKHNpemVfdCBpPTAgOyBjdXIgJiYgaTxjb3VudCA7IGkrKykgeworICAgICAgICAgICAgY3VycmVudExheWVyc1tpXS0+c2V0R2VvbWV0cnkoJmN1cltpXSk7CisgICAgICAgIH0KKyAgICB9Cit9CiAKIHZvaWQgU3VyZmFjZUZsaW5nZXI6OmhhbmRsZVJlcGFpbnQoKQogewpAQCAtNzU3LDggKzc4MSw4IEBACiAgICAgZ2xMb2FkSWRlbnRpdHkoKTsKIAogICAgIHVpbnQzMl90IGZsYWdzID0gaHcuZ2V0RmxhZ3MoKTsKLSAgICBpZiAoKGZsYWdzICYgRGlzcGxheUhhcmR3YXJlOjpTV0FQX1JFQ1RBTkdMRSkgfHwgCi0gICAgICAgIChmbGFncyAmIERpc3BsYXlIYXJkd2FyZTo6QlVGRkVSX1BSRVNFUlZFRCkpIAorICAgIGlmICgoZmxhZ3MgJiBEaXNwbGF5SGFyZHdhcmU6OlNXQVBfUkVDVEFOR0xFKSB8fAorICAgICAgICAoZmxhZ3MgJiBEaXNwbGF5SGFyZHdhcmU6OkJVRkZFUl9QUkVTRVJWRUQpKQogICAgIHsKICAgICAgICAgLy8gd2UgY2FuIHJlZHJhdyBvbmx5IHdoYXQncyBkaXJ0eSwgYnV0IHNpbmNlIFNXQVBfUkVDVEFOR0xFIG9ubHkKICAgICAgICAgLy8gdGFrZXMgYSByZWN0YW5nbGUsIHdlIG11c3QgbWFrZSBzdXJlIHRvIHVwZGF0ZSB0aGF0IHdob2xlCkBAIC04MDEsOSArODI1LDcyIEBACiAgICAgICAgIC8vIGRyYXcgc29tZXRoaW5nLi4uCiAgICAgICAgIGRyYXdXb3JtaG9sZSgpOwogICAgIH0KKworICAgIHN0YXR1c190IGVyciA9IE5PX0VSUk9SOwogICAgIGNvbnN0IFZlY3Rvcjwgc3A8TGF5ZXJCYXNlPiA+JiBsYXllcnMobVZpc2libGVMYXllcnNTb3J0ZWRCeVopOwotICAgIGNvbnN0IHNpemVfdCBjb3VudCA9IGxheWVycy5zaXplKCk7Ci0gICAgZm9yIChzaXplX3QgaT0wIDsgaTxjb3VudCA7ICsraSkgeworICAgIHNpemVfdCBjb3VudCA9IGxheWVycy5zaXplKCk7CisKKyAgICBjb25zdCBEaXNwbGF5SGFyZHdhcmUmIGh3KGdyYXBoaWNQbGFuZSgwKS5kaXNwbGF5SGFyZHdhcmUoKSk7CisgICAgSFdDb21wb3NlciYgaHdjKGh3LmdldEh3Q29tcG9zZXIoKSk7CisgICAgaHdjX2xheWVyX3QqIGNvbnN0IGN1cihod2MuZ2V0TGF5ZXJzKCkpOworCisgICAgTE9HRV9JRihjdXIgJiYgaHdjLmdldE51bUxheWVycygpICE9IGNvdW50LAorICAgICAgICAgICAgIkhBTCBudW1iZXIgb2YgbGF5ZXJzICglZCkgZG9lc24ndCBtYXRjaCBzdXJmYWNlZmxpbmdlciAoJWQpIiwKKyAgICAgICAgICAgIGh3Yy5nZXROdW1MYXllcnMoKSwgY291bnQpOworCisgICAgLy8ganVzdCB0byBiZSBleHRyYS1zYWZlLCB1c2UgdGhlIHNtYWxsZXN0IGNvdW50CisgICAgaWYgKGh3Yy5pbml0Q2hlY2soKSA9PSBOT19FUlJPUikgeworICAgICAgICBjb3VudCA9IGNvdW50IDwgaHdjLmdldE51bUxheWVycygpID8gY291bnQgOiBod2MuZ2V0TnVtTGF5ZXJzKCk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiAgdXBkYXRlIHRoZSBwZXItZnJhbWUgaC93IGNvbXBvc2VyIGRhdGEgZm9yIGVhY2ggbGF5ZXIKKyAgICAgKiAgYW5kIGJ1aWxkIHRoZSB0cmFuc3BhcmVudCByZWdpb24gb2YgdGhlIEZCCisgICAgICovCisgICAgUmVnaW9uIHRyYW5zcGFyZW50OworICAgIGlmIChjdXIpIHsKKyAgICAgICAgZm9yIChzaXplX3QgaT0wIDsgaTxjb3VudCA7IGkrKykgeworICAgICAgICAgICAgY29uc3Qgc3A8TGF5ZXJCYXNlPiYgbGF5ZXIobGF5ZXJzW2ldKTsKKyAgICAgICAgICAgIGxheWVyLT5zZXRQZXJGcmFtZURhdGEoJmN1cltpXSk7CisgICAgICAgICAgICBpZiAoY3VyW2ldLmhpbnRzICYgSFdDX0hJTlRfQ0xFQVJfRkIpIHsKKyAgICAgICAgICAgICAgICBpZiAoIShsYXllci0+bmVlZHNCbGVuZGluZygpKSkgeworICAgICAgICAgICAgICAgICAgICB0cmFuc3BhcmVudC5vclNlbGYobGF5ZXItPnZpc2libGVSZWdpb25TY3JlZW4pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlcnIgPSBod2MucHJlcGFyZSgpOworICAgICAgICBMT0dFX0lGKGVyciwgIkhXQ29tcG9zZXI6OnByZXBhcmUgZmFpbGVkICglcykiLCBzdHJlcnJvcigtZXJyKSk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiAgY2xlYXIgdGhlIGFyZWEgb2YgdGhlIEZCIHRoYXQgbmVlZCB0byBiZSB0cmFuc3BhcmVudAorICAgICAqLworICAgIHRyYW5zcGFyZW50LmFuZFNlbGYoZGlydHkpOworICAgIGlmICghdHJhbnNwYXJlbnQuaXNFbXB0eSgpKSB7CisgICAgICAgIGdsQ2xlYXJDb2xvcigwLDAsMCwwKTsKKyAgICAgICAgUmVnaW9uOjpjb25zdF9pdGVyYXRvciBpdCA9IHRyYW5zcGFyZW50LmJlZ2luKCk7CisgICAgICAgIFJlZ2lvbjo6Y29uc3RfaXRlcmF0b3IgY29uc3QgZW5kID0gdHJhbnNwYXJlbnQuZW5kKCk7CisgICAgICAgIGNvbnN0IGludDMyX3QgaGVpZ2h0ID0gaHcuZ2V0SGVpZ2h0KCk7CisgICAgICAgIHdoaWxlIChpdCAhPSBlbmQpIHsKKyAgICAgICAgICAgIGNvbnN0IFJlY3QmIHIoKml0KyspOworICAgICAgICAgICAgY29uc3QgR0xpbnQgc3kgPSBoZWlnaHQgLSAoci50b3AgKyByLmhlaWdodCgpKTsKKyAgICAgICAgICAgIGdsU2Npc3NvcihyLmxlZnQsIHN5LCByLndpZHRoKCksIHIuaGVpZ2h0KCkpOworICAgICAgICAgICAgZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoKKyAgICAgKiBhbmQgdGhlbiwgcmVuZGVyIHRoZSBsYXllcnMgdGFyZ2V0ZWQgYXQgdGhlIGZyYW1lYnVmZmVyCisgICAgICovCisgICAgZm9yIChzaXplX3QgaT0wIDsgaTxjb3VudCA7IGkrKykgeworICAgICAgICBpZiAoY3VyKSB7CisgICAgICAgICAgICBpZiAoIShjdXJbaV0uY29tcG9zaXRpb25UeXBlID09IEhXQ19GUkFNRUJVRkZFUikgfHwKKyAgICAgICAgICAgICAgICAgICAgY3VyW2ldLmZsYWdzICYgSFdDX1NLSVBfTEFZRVIpIHsKKyAgICAgICAgICAgICAgICAvLyBza2lwIGxheWVycyBoYW5kbGVkIGJ5IHRoZSBIQUwKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgICAgICBjb25zdCBzcDxMYXllckJhc2U+JiBsYXllcihsYXllcnNbaV0pOwogICAgICAgICBjb25zdCBSZWdpb24gY2xpcChkaXJ0eS5pbnRlcnNlY3QobGF5ZXItPnZpc2libGVSZWdpb25TY3JlZW4pKTsKICAgICAgICAgaWYgKCFjbGlwLmlzRW1wdHkoKSkgewpAQCAtMTA0Miw3ICsxMTI5LDcgQEAKICAgICBpZiAoYW5kcm9pZF9hdG9taWNfZGVjKCZtVHJhbnNhY3Rpb25Db3VudCkgPT0gMSkgewogICAgICAgICBzaWduYWxFdmVudCgpOwogCi0gICAgICAgIC8vIGlmIHRoZXJlIGlzIGEgdHJhbnNhY3Rpb24gd2l0aCBhIHJlc2l6ZSwgd2FpdCBmb3IgaXQgdG8gCisgICAgICAgIC8vIGlmIHRoZXJlIGlzIGEgdHJhbnNhY3Rpb24gd2l0aCBhIHJlc2l6ZSwgd2FpdCBmb3IgaXQgdG8KICAgICAgICAgLy8gdGFrZSBlZmZlY3QgYmVmb3JlIHJldHVybmluZy4KICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1TdGF0ZUxvY2spOwogICAgICAgICB3aGlsZSAobVJlc2l6ZVRyYW5zYXRpb25QZW5kaW5nKSB7CkBAIC0xMDg2LDcgKzExNzMsNyBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotaW50IFN1cmZhY2VGbGluZ2VyOjpzZXRPcmllbnRhdGlvbihEaXNwbGF5SUQgZHB5LCAKK2ludCBTdXJmYWNlRmxpbmdlcjo6c2V0T3JpZW50YXRpb24oRGlzcGxheUlEIGRweSwKICAgICAgICAgaW50IG9yaWVudGF0aW9uLCB1aW50MzJfdCBmbGFncykKIHsKICAgICBpZiAoVU5MSUtFTFkodWludDMyX3QoZHB5KSA+PSBESVNQTEFZX0NPVU5UKSkKQEAgLTExMTksMTQgKzEyMDYsMTcgQEAKICAgICAgICAgICAgICAgICBpbnQodyksIGludChoKSk7CiAgICAgICAgIHJldHVybiBzdXJmYWNlSGFuZGxlOwogICAgIH0KLSAgICAKKwogICAgIC8vTE9HRCgiY3JlYXRlU3VyZmFjZSBmb3IgcGlkICVkICglZCB4ICVkKSIsIHBpZCwgdywgaCk7CiAgICAgc3A8TGF5ZXI+IG5vcm1hbExheWVyOwogICAgIHN3aXRjaCAoZmxhZ3MgJiBlRlhTdXJmYWNlTWFzaykgewogICAgICAgICBjYXNlIGVGWFN1cmZhY2VOb3JtYWw6CisjaWYgSEFTX1BVU0hfQlVGRkVSUwogICAgICAgICAgICAgaWYgKFVOTElLRUxZKGZsYWdzICYgZVB1c2hCdWZmZXJzKSkgewogICAgICAgICAgICAgICAgIGxheWVyID0gY3JlYXRlUHVzaEJ1ZmZlcnNTdXJmYWNlKGNsaWVudCwgZCwgdywgaCwgZmxhZ3MpOwotICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIH0gZWxzZQorI2VuZGlmCisgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgbm9ybWFsTGF5ZXIgPSBjcmVhdGVOb3JtYWxTdXJmYWNlKGNsaWVudCwgZCwgdywgaCwgZmxhZ3MsIGZvcm1hdCk7CiAgICAgICAgICAgICAgICAgbGF5ZXIgPSBub3JtYWxMYXllcjsKICAgICAgICAgICAgIH0KQEAgLTExNDUsNyArMTIzNSw3IEBACiAgICAgICAgIHNzaXplX3QgdG9rZW4gPSBhZGRDbGllbnRMYXllcihjbGllbnQsIGxheWVyKTsKIAogICAgICAgICBzdXJmYWNlSGFuZGxlID0gbGF5ZXItPmdldFN1cmZhY2UoKTsKLSAgICAgICAgaWYgKHN1cmZhY2VIYW5kbGUgIT0gMCkgeyAKKyAgICAgICAgaWYgKHN1cmZhY2VIYW5kbGUgIT0gMCkgewogICAgICAgICAgICAgcGFyYW1zLT50b2tlbiA9IHRva2VuOwogICAgICAgICAgICAgcGFyYW1zLT5pZGVudGl0eSA9IHN1cmZhY2VIYW5kbGUtPmdldElkZW50aXR5KCk7CiAgICAgICAgICAgICBwYXJhbXMtPndpZHRoID0gdzsKQEAgLTEyMjksNyArMTMxOSw3IEBACiAgICAgLyoKICAgICAgKiBjYWxsZWQgYnkgdGhlIHdpbmRvdyBtYW5hZ2VyLCB3aGVuIGEgc3VyZmFjZSBzaG91bGQgYmUgbWFya2VkIGZvcgogICAgICAqIGRlc3RydWN0aW9uLgotICAgICAqIAorICAgICAqCiAgICAgICogVGhlIHN1cmZhY2UgaXMgcmVtb3ZlZCBmcm9tIHRoZSBjdXJyZW50IGFuZCBkcmF3aW5nIGxpc3RzLCBidXQgcGxhY2VkCiAgICAgICogaW4gdGhlIHB1cmdhdG9yeSBxdWV1ZSwgc28gaXQncyBub3QgZGVzdHJveWVkIHJpZ2h0LWF3YXkgKHdlIG5lZWQKICAgICAgKiB0byB3YWl0IGZvciBhbGwgY2xpZW50J3MgcmVmZXJlbmNlcyB0byBnbyBhd2F5IGZpcnN0KS4KQEAgLTEyNTAsNyArMTM0MCw3IEBACiBzdGF0dXNfdCBTdXJmYWNlRmxpbmdlcjo6ZGVzdHJveVN1cmZhY2UoY29uc3Qgc3A8TGF5ZXJCYXNlQ2xpZW50PiYgbGF5ZXIpCiB7CiAgICAgLy8gY2FsbGVkIGJ5IH5JU3VyZmFjZSgpIHdoZW4gYWxsIHJlZmVyZW5jZXMgYXJlIGdvbmUKLSAgICAKKwogICAgIGNsYXNzIE1lc3NhZ2VEZXN0cm95U3VyZmFjZSA6IHB1YmxpYyBNZXNzYWdlQmFzZSB7CiAgICAgICAgIFN1cmZhY2VGbGluZ2VyKiBmbGluZ2VyOwogICAgICAgICBzcDxMYXllckJhc2VDbGllbnQ+IGxheWVyOwpAQCAtMTI2Myw5ICsxMzUzLDkgQEAKICAgICAgICAgICAgIGxheWVyLmNsZWFyKCk7IC8vIGNsZWFyIGl0IG91dHNpZGUgb2YgdGhlIGxvY2s7CiAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2woZmxpbmdlci0+bVN0YXRlTG9jayk7CiAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICogcmVtb3ZlIHRoZSBsYXllciBmcm9tIHRoZSBjdXJyZW50IGxpc3QgLS0gY2hhbmNlcyBhcmUgdGhhdCBpdCdzIAotICAgICAgICAgICAgICogbm90IGluIHRoZSBsaXN0IGFueXdheSwgYmVjYXVzZSBpdCBzaG91bGQgaGF2ZSBiZWVuIHJlbW92ZWQgCi0gICAgICAgICAgICAgKiBhbHJlYWR5IHVwb24gcmVxdWVzdCBvZiB0aGUgY2xpZW50IChlZzogd2luZG93IG1hbmFnZXIpLiAKKyAgICAgICAgICAgICAqIHJlbW92ZSB0aGUgbGF5ZXIgZnJvbSB0aGUgY3VycmVudCBsaXN0IC0tIGNoYW5jZXMgYXJlIHRoYXQgaXQncworICAgICAgICAgICAgICogbm90IGluIHRoZSBsaXN0IGFueXdheSwgYmVjYXVzZSBpdCBzaG91bGQgaGF2ZSBiZWVuIHJlbW92ZWQKKyAgICAgICAgICAgICAqIGFscmVhZHkgdXBvbiByZXF1ZXN0IG9mIHRoZSBjbGllbnQgKGVnOiB3aW5kb3cgbWFuYWdlcikuCiAgICAgICAgICAgICAgKiBIb3dldmVyLCBhIGJ1Z2d5IGNsaWVudCBjb3VsZCBoYXZlIG5vdCBkb25lIHRoYXQuCiAgICAgICAgICAgICAgKiBTaW5jZSB3ZSBrbm93IHdlIGRvbid0IGhhdmUgYW55IG1vcmUgY2xpZW50cywgd2UgZG9uJ3QgbmVlZAogICAgICAgICAgICAgICogdG8gdXNlIHRoZSBwdXJnYXRvcnkuCkBAIC0xMzgwLDcgKzE0NzAsNyBAQAogICAgICAgICB9CiAgICAgICAgIGNvbnN0IGJvb2wgbG9ja2VkKHJldHJ5ID49IDApOwogICAgICAgICBpZiAoIWxvY2tlZCkgewotICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAKKyAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwKICAgICAgICAgICAgICAgICAgICAgIlN1cmZhY2VGbGluZ2VyIGFwcGVhcnMgdG8gYmUgdW5yZXNwb25zaXZlLCAiCiAgICAgICAgICAgICAgICAgICAgICJkdW1waW5nIGFueXdheXMgKG5vIGxvY2tzIGhlbGQpXG4iKTsKICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKQEAgLTE2NTUsMTIgKzE3NDUsMTUgQEAKIHsKICAgICBpbnQzMl90IG5hbWUgPSBOQU1FX05PVF9GT1VORDsKICAgICBzcDxMYXllcj4gbGF5ZXIobUZsaW5nZXItPmdldExheWVyKHN1cikpOwotICAgIGlmIChsYXllciA9PSAwKSByZXR1cm4gbmFtZTsKKyAgICBpZiAobGF5ZXIgPT0gMCkgeworICAgICAgICByZXR1cm4gbmFtZTsKKyAgICB9CiAKICAgICAvLyBpZiB0aGlzIGxheWVyIGFscmVhZHkgaGFzIGEgdG9rZW4sIGp1c3QgcmV0dXJuIGl0CiAgICAgbmFtZSA9IGxheWVyLT5nZXRUb2tlbigpOwotICAgIGlmICgobmFtZSA+PSAwKSAmJiAobGF5ZXItPmdldENsaWVudCgpID09IHRoaXMpKQorICAgIGlmICgobmFtZSA+PSAwKSAmJiAobGF5ZXItPmdldENsaWVudCgpID09IHRoaXMpKSB7CiAgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KIAogICAgIG5hbWUgPSAwOwogICAgIGRvIHsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL1N1cmZhY2VGbGluZ2VyLmggYi9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9TdXJmYWNlRmxpbmdlci5oCmluZGV4IDhlY2ZjMDEuLjhlMjg2ZTUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL1N1cmZhY2VGbGluZ2VyLmgKKysrIGIvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvU3VyZmFjZUZsaW5nZXIuaApAQCAtMjk2LDYgKzI5Niw3IEBACiAgICAgICAgICAgICB2b2lkICAgICAgICBoYW5kbGVQYWdlRmxpcCgpOwogICAgICAgICAgICAgYm9vbCAgICAgICAgbG9ja1BhZ2VGbGlwKGNvbnN0IExheWVyVmVjdG9yJiBjdXJyZW50TGF5ZXJzKTsKICAgICAgICAgICAgIHZvaWQgICAgICAgIHVubG9ja1BhZ2VGbGlwKGNvbnN0IExheWVyVmVjdG9yJiBjdXJyZW50TGF5ZXJzKTsKKyAgICAgICAgICAgIHZvaWQgICAgICAgIGhhbmRsZVdvcmtMaXN0KCk7CiAgICAgICAgICAgICB2b2lkICAgICAgICBoYW5kbGVSZXBhaW50KCk7CiAgICAgICAgICAgICB2b2lkICAgICAgICBwb3N0RnJhbWVidWZmZXIoKTsKICAgICAgICAgICAgIHZvaWQgICAgICAgIGNvbXBvc2VTdXJmYWNlcyhjb25zdCBSZWdpb24mIGRpcnR5KTsKQEAgLTM3MCw2ICszNzEsNyBAQAogICAgICAgICAgICAgICAgIFJlZ2lvbiAgICAgICAgICAgICAgICAgICAgICBtSW52YWxpZFJlZ2lvbjsKICAgICAgICAgICAgICAgICBSZWdpb24gICAgICAgICAgICAgICAgICAgICAgbVdvcm1ob2xlUmVnaW9uOwogICAgICAgICAgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICBtVmlzaWJsZVJlZ2lvbnNEaXJ0eTsKKyAgICAgICAgICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgbUh3V29ya0xpc3REaXJ0eTsKICAgICAgICAgICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgbURlZmVyUmVsZWFzZUNvbnNvbGU7CiAgICAgICAgICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgIG1GcmVlemVEaXNwbGF5OwogICAgICAgICAgICAgICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgICBtRnJlZXplQ291bnQ7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90ZXN0cy9zZXJ2aWNlc3Rlc3RzL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy90ZXN0cy9zZXJ2aWNlc3Rlc3RzL0FuZHJvaWQubWsKaW5kZXggYjA3YTEwYi4uMTg2YjM0OSAxMDA2NDQKLS0tIGEvc2VydmljZXMvdGVzdHMvc2VydmljZXN0ZXN0cy9BbmRyb2lkLm1rCisrKyBiL3NlcnZpY2VzL3Rlc3RzL3NlcnZpY2VzdGVzdHMvQW5kcm9pZC5tawpAQCAtNyw4ICs3LDEwIEBACiAjIEluY2x1ZGUgYWxsIHRlc3QgamF2YSBmaWxlcy4KIExPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKIAorTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGVhc3ltb2NrbGliCiAKIExPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQudGVzdC5ydW5uZXIgc2VydmljZXMKKwogTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEZyYW1ld29ya3NTZXJ2aWNlc1Rlc3RzCiAKIExPQ0FMX0NFUlRJRklDQVRFIDo9IHBsYXRmb3JtCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90ZXN0cy9zZXJ2aWNlc3Rlc3RzL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9zZXJ2aWNlcy90ZXN0cy9zZXJ2aWNlc3Rlc3RzL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggNWNlMTA5Zi4uZjExNWY0MiAxMDA2NDQKLS0tIGEvc2VydmljZXMvdGVzdHMvc2VydmljZXN0ZXN0cy9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL3NlcnZpY2VzL3Rlc3RzL3NlcnZpY2VzdGVzdHMvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMjMsNiArMjMsMTkgQEAKICAgICAKICAgICA8YXBwbGljYXRpb24+CiAgICAgICAgIDx1c2VzLWxpYnJhcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRlc3QucnVubmVyIiAvPgorCisgICAgICAgIDxzZXJ2aWNlIGFuZHJvaWQ6bmFtZT0iY29tLmFuZHJvaWQuc2VydmVyLkFjY2Vzc2liaWxpdHlNYW5hZ2VyU2VydmljZVRlc3QkTXlGaXJzdE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZSI+CisgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5BY2Nlc3NpYmlsaXR5U2VydmljZSIvPgorICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9zZXJ2aWNlPgorCisgICAgICAgIDxzZXJ2aWNlIGFuZHJvaWQ6bmFtZT0iY29tLmFuZHJvaWQuc2VydmVyLkFjY2Vzc2liaWxpdHlNYW5hZ2VyU2VydmljZVRlc3QkTXlTZWNvbmRNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2UiPgorICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuQWNjZXNzaWJpbGl0eVNlcnZpY2UiLz4KKyAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvc2VydmljZT4KKwogICAgIDwvYXBwbGljYXRpb24+CiAKICAgICA8aW5zdHJ1bWVudGF0aW9uCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90ZXN0cy9zZXJ2aWNlc3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvQWNjZXNzaWJpbGl0eU1hbmFnZXJTZXJ2aWNlVGVzdC5qYXZhIGIvc2VydmljZXMvdGVzdHMvc2VydmljZXN0ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL0FjY2Vzc2liaWxpdHlNYW5hZ2VyU2VydmljZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmUzYTgyCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvdGVzdHMvc2VydmljZXN0ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL0FjY2Vzc2liaWxpdHlNYW5hZ2VyU2VydmljZVRlc3QuamF2YQpAQCAtMCwwICsxLDcyOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc2VydmVyOworCitpbXBvcnQgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5BY2Nlc3NpYmlsaXR5U2VydmljZTsKK2ltcG9ydCBhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLkFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbzsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uU2VydmljZUluZm87CitpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLm9zLlNlcnZpY2VNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5nczsKK2ltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOworaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5MYXJnZVRlc3Q7CitpbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eUV2ZW50OworaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LklBY2Nlc3NpYmlsaXR5TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5JQWNjZXNzaWJpbGl0eU1hbmFnZXJDbGllbnQ7CisKKy8qKgorICogVGhpcyB0ZXN0IGV4ZXJjaXNlcyB0aGUKKyAqIHtAbGluayBjb20uYW5kcm9pZC5zZXJ2ZXIuQWNjZXNzaWJpbGl0eU1hbmFnZXJTZXJ2aWNlfSBieSBtb2NraW5nIHRoZQorICoge0BsaW5rIGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlNYW5hZ2VyfSB3aGljaCB0YWxrcyB0byB0byB0aGUKKyAqIHNlcnZpY2UuIFRoZSBzZXJ2aWNlIGl0c2VsZiBpcyBpbnRlcmFjdGluZyB3aXRoIHRoZSBwbGF0Zm9ybS4gTm90ZTogVGVzdGluZworICogdGhlIHNlcnZpY2UgaW4gZnVsbCBpc29sYXRpb24gd291bGQgcmVxdWlyZSBzaWduaWZpY2FudCBhbW91bnQgb2Ygd29yayBmb3IKKyAqIG1vY2tpbmcgYWxsIHN5c3RlbSBpbnRlcmFjdGlvbnMuIEl0IHdvdWxkIGFsc28gcmVxdWlyZSBhIGxvdCBvZiBtb2NraW5nIGNvZGUuCisgKi8KK3B1YmxpYyBjbGFzcyBBY2Nlc3NpYmlsaXR5TWFuYWdlclNlcnZpY2VUZXN0IGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlIHsKKworICAgIC8qKgorICAgICAqIFRpbWVvdXQgcmVxdWlyZWQgZm9yIHBlbmRpbmcgQmluZGVyIGNhbGxzIG9yIGV2ZW50IHByb2Nlc3NpbmcgdG8KKyAgICAgKiBjb21wbGV0ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFRJTUVPVVRfQklOREVSX0NBTEwgPSAxMDA7CisKKyAgICAvKioKKyAgICAgKiBUaW1lb3V0IGluIHdoaWNoIHdlIGFyZSB3YWl0aW5nIGZvciB0aGUgc3lzdGVtIHRvIHN0YXJ0IHRoZSBtb2NrCisgICAgICogYWNjZXNzaWJpbGl0eSBzZXJ2aWNlcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFRJTUVPVVRfU1RBUlRfTU9DS19BQ0NFU1NJQklMSVRZX1NFUlZJQ0VTID0gMzAwOworCisgICAgLyoqCisgICAgICogVGltZW91dCB1c2VkIGZvciB0ZXN0aW5nIHRoYXQgYSBzZXJ2aWNlIGlzIG5vdGlmaWVkIG9ubHkgdXBvbiBhCisgICAgICogbm90aWZpY2F0aW9uIHRpbWVvdXQuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBUSU1FT1VUX1RFU1RfTk9USUZJQ0FUSU9OX1RJTUVPVVQgPSAzMDA7CisKKyAgICAvKioKKyAgICAgKiBUaGUgcGFja2FnZSBuYW1lLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBzUGFja2FnZU5hbWU7CisKKyAgICAvKioKKyAgICAgKiBUaGUgaW50ZXJmYWNlIHVzZWQgdG8gdGFsayB0byB0aGUgdGVzdGVkIHNlcnZpY2UuCisgICAgICovCisgICAgcHJpdmF0ZSBJQWNjZXNzaWJpbGl0eU1hbmFnZXIgbU1hbmFnZXJTZXJ2aWNlOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0Q29udGV4dChDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgc3VwZXIuc2V0Q29udGV4dChjb250ZXh0KTsKKyAgICAgICAgaWYgKHNQYWNrYWdlTmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICBzUGFja2FnZU5hbWUgPSBjb250ZXh0LmdldFBhY2thZ2VOYW1lKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBBY2Nlc3NpYmlsaXR5TWFuYWdlclNlcnZpY2VUZXN0KCkgeworICAgICAgICBJQmluZGVyIGlCaW5kZXIgPSBTZXJ2aWNlTWFuYWdlci5nZXRTZXJ2aWNlKENvbnRleHQuQUNDRVNTSUJJTElUWV9TRVJWSUNFKTsKKyAgICAgICAgbU1hbmFnZXJTZXJ2aWNlID0gSUFjY2Vzc2liaWxpdHlNYW5hZ2VyLlN0dWIuYXNJbnRlcmZhY2UoaUJpbmRlcik7CisgICAgfQorCisgICAgQExhcmdlVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRDbGllbnRfQWNjZXNzaWJpbGl0eURpc2FibGVkVGhlbkVuYWJsZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gbWFrZSBzdXJlIGFjY2Vzc2liaWxpdHkgaXMgZGlzYWJsZWQKKyAgICAgICAgZW5zdXJlQWNjZXNzaWJpbGl0eUVuYWJsZWQobUNvbnRleHQsIGZhbHNlKTsKKworICAgICAgICAvLyBjcmVhdGUgYSBjbGllbnQgbW9jayBpbnN0YW5jZQorICAgICAgICBNeU1vY2tBY2Nlc3NpYmlsaXR5TWFuYWdlckNsaWVudCBtb2NrQ2xpZW50ID0gbmV3IE15TW9ja0FjY2Vzc2liaWxpdHlNYW5hZ2VyQ2xpZW50KCk7CisKKyAgICAgICAgLy8gaW52b2tlIHRoZSBtZXRob2QgdW5kZXIgdGVzdAorICAgICAgICBib29sZWFuIGVuYWJsZWRBY2Nlc3NpYmlsaXR5RGlzYWJsZWQgPSBtTWFuYWdlclNlcnZpY2UuYWRkQ2xpZW50KG1vY2tDbGllbnQpOworCisgICAgICAgIC8vIGNoZWNrIGV4cGVjdGVkIHJlc3VsdAorICAgICAgICBhc3NlcnRGYWxzZSgiVGhlIGNsaWVudCBtdXN0IGJlIGRpc2FibGVkIHNpbmNlIGFjY2Vzc2liaWxpdHkgaXMgZGlzYWJsZWQuIiwKKyAgICAgICAgICAgICAgICBlbmFibGVkQWNjZXNzaWJpbGl0eURpc2FibGVkKTsKKworICAgICAgICAvLyBlbmFibGUgYWNjZXNzaWJpbGl0eQorICAgICAgICBlbnN1cmVBY2Nlc3NpYmlsaXR5RW5hYmxlZChtQ29udGV4dCwgdHJ1ZSk7CisKKyAgICAgICAgLy8gaW52b2tlIHRoZSBtZXRob2QgdW5kZXIgdGVzdAorICAgICAgICBib29sZWFuIGVuYWJsZWRBY2Nlc3NpYmlsaXR5RW5hYmxlZCA9IG1NYW5hZ2VyU2VydmljZS5hZGRDbGllbnQobW9ja0NsaWVudCk7CisKKyAgICAgICAgLy8gY2hlY2sgZXhwZWN0ZWQgcmVzdWx0CisgICAgICAgIGFzc2VydFRydWUoIlRoZSBjbGllbnQgbXVzdCBiZSBlbmFibGVkIHNpbmNlIGFjY2Vzc2liaWxpdHkgaXMgZW5hYmxlZC4iLAorICAgICAgICAgICAgICAgIGVuYWJsZWRBY2Nlc3NpYmlsaXR5RW5hYmxlZCk7CisgICAgfQorCisgICAgQExhcmdlVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRDbGllbnRfQWNjZXNzaWJpbGl0eUVuYWJsZWRUaGVuRGlzYWJsZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gZW5hYmxlIGFjY2Vzc2liaWxpdHkgYmVmb3JlIHJlZ2lzdGVyaW5nIHRoZSBjbGllbnQKKyAgICAgICAgZW5zdXJlQWNjZXNzaWJpbGl0eUVuYWJsZWQobUNvbnRleHQsIHRydWUpOworCisgICAgICAgIC8vIGNyZWF0ZSBhIGNsaWVudCBtb2NrIGluc3RhbmNlCisgICAgICAgIE15TW9ja0FjY2Vzc2liaWxpdHlNYW5hZ2VyQ2xpZW50IG1vY2tDbGllbnQgPSBuZXcgTXlNb2NrQWNjZXNzaWJpbGl0eU1hbmFnZXJDbGllbnQoKTsKKworICAgICAgICAvLyBpbnZva2UgdGhlIG1ldGhvZCB1bmRlciB0ZXN0CisgICAgICAgIGJvb2xlYW4gZW5hYmxlZEFjY2Vzc2liaWxpdHlFbmFibGVkID0gbU1hbmFnZXJTZXJ2aWNlLmFkZENsaWVudChtb2NrQ2xpZW50KTsKKworICAgICAgICAvLyBjaGVjayBleHBlY3RlZCByZXN1bHQKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIGNsaWVudCBtdXN0IGJlIGVuYWJsZWQgc2luY2UgYWNjZXNzaWJpbGl0eSBpcyBlbmFibGVkLiIsCisgICAgICAgICAgICAgICAgZW5hYmxlZEFjY2Vzc2liaWxpdHlFbmFibGVkKTsKKworICAgICAgICAvLyBkaXNhYmxlIGFjY2Vzc2liaWxpdHkKKyAgICAgICAgZW5zdXJlQWNjZXNzaWJpbGl0eUVuYWJsZWQobUNvbnRleHQsIGZhbHNlKTsKKworICAgICAgICAvLyBpbnZva2UgdGhlIG1ldGhvZCB1bmRlciB0ZXN0CisgICAgICAgIGJvb2xlYW4gZW5hYmxlZEFjY2Vzc2liaWxpdHlEaXNhYmxlZCA9IG1NYW5hZ2VyU2VydmljZS5hZGRDbGllbnQobW9ja0NsaWVudCk7CisKKyAgICAgICAgLy8gY2hlY2sgZXhwZWN0ZWQgcmVzdWx0CisgICAgICAgIGFzc2VydEZhbHNlKCJUaGUgY2xpZW50IG11c3QgYmUgZGlzYWJsZWQgc2luY2UgYWNjZXNzaWJpbGl0eSBpcyBkaXNhYmxlZC4iLAorICAgICAgICAgICAgICAgIGVuYWJsZWRBY2Nlc3NpYmlsaXR5RGlzYWJsZWQpOworICAgIH0KKworICAgIEBMYXJnZVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0QWNjZXNzaWJpbGl0eVNlcnZpY2VzTGlzdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBib29sZWFuIGZpcnN0TW9ja1NlcnZpY2VJbnN0YWxsZWQgPSBmYWxzZTsKKyAgICAgICAgYm9vbGVhbiBzZWNvbmRNb2NrU2VydmljZUluc3RhbGxlZCA9IGZhbHNlOworCisgICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSA9IGdldENvbnRleHQoKS5nZXRQYWNrYWdlTmFtZSgpOworICAgICAgICBTdHJpbmcgZmlyc3RNb2NrU2VydmljZUNsYXNzTmFtZSA9IE15Rmlyc3RNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2UuY2xhc3MuZ2V0TmFtZSgpOworICAgICAgICBTdHJpbmcgc2Vjb25kTW9ja1NlcnZpY2VDbGFzc05hbWUgPSBNeVNlY29uZE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5jbGFzcy5nZXROYW1lKCk7CisKKyAgICAgICAgLy8gbG9vayBmb3IgdGhlIHR3byBtb2NrIHNlcnZpY2VzCisgICAgICAgIGZvciAoU2VydmljZUluZm8gc2VydmljZUluZm8gOiBtTWFuYWdlclNlcnZpY2UuZ2V0QWNjZXNzaWJpbGl0eVNlcnZpY2VMaXN0KCkpIHsKKyAgICAgICAgICAgIGlmIChwYWNrYWdlTmFtZS5lcXVhbHMoc2VydmljZUluZm8ucGFja2FnZU5hbWUpKSB7CisgICAgICAgICAgICAgICAgaWYgKGZpcnN0TW9ja1NlcnZpY2VDbGFzc05hbWUuZXF1YWxzKHNlcnZpY2VJbmZvLm5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIGZpcnN0TW9ja1NlcnZpY2VJbnN0YWxsZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2Vjb25kTW9ja1NlcnZpY2VDbGFzc05hbWUuZXF1YWxzKHNlcnZpY2VJbmZvLm5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIHNlY29uZE1vY2tTZXJ2aWNlSW5zdGFsbGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBjaGVjayBleHBlY3RlZCByZXN1bHQKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiRmlyc3QgbW9jayBzZXJ2aWNlIG11c3QgYmUgaW5zdGFsbGVkIiwgZmlyc3RNb2NrU2VydmljZUluc3RhbGxlZCk7CisgICAgICAgIGFzc2VydFRydWUoIlNlY29uZCBtb2NrIHNlcnZpY2UgbXVzdCBiZSBpbnN0YWxsZWQiLCBzZWNvbmRNb2NrU2VydmljZUluc3RhbGxlZCk7CisgICAgfQorCisgICAgQExhcmdlVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZW5kQWNjZXNzaWJpbGl0eUV2ZW50X09uZVNlcnZpY2VfTWF0Y2hpbmdQYWNrYWdlQW5kRXZlbnRUeXBlKCkKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBzZXQgdGhlIGFjY2Vzc2liaWxpdHkgc2V0dGluZyB2YWx1ZQorICAgICAgICBlbnN1cmVBY2Nlc3NpYmlsaXR5RW5hYmxlZChtQ29udGV4dCwgdHJ1ZSk7CisKKyAgICAgICAgLy8gZW5hYmxlIHRoZSBtb2NrIGFjY2Vzc2liaWxpdHkgc2VydmljZQorICAgICAgICBlbnN1cmVPbmx5TW9ja1NlcnZpY2VzRW5hYmxlZChtQ29udGV4dCwgdHJ1ZSwgZmFsc2UpOworCisgICAgICAgIC8vIGNvbmZpZ3VyZSB0aGUgbW9jayBzZXJ2aWNlCisgICAgICAgIE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZSBzZXJ2aWNlID0gTXlGaXJzdE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5zSW5zdGFuY2U7CisgICAgICAgIHNlcnZpY2Uuc2V0U2VydmljZUluZm8oTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLmNyZWF0ZURlZmF1bHRJbmZvKCkpOworCisgICAgICAgIC8vIHdhaXQgZm9yIHRoZSBiaW5kZXIgY2FsbCB0byAjc2V0U2VydmljZSB0byBjb21wbGV0ZQorICAgICAgICBUaHJlYWQuc2xlZXAoVElNRU9VVF9CSU5ERVJfQ0FMTCk7CisKKyAgICAgICAgLy8gY3JlYXRlIGFuZCBwb3B1bGF0ZSBhbiBldmVudCB0byBiZSBzZW50CisgICAgICAgIEFjY2Vzc2liaWxpdHlFdmVudCBzZW50RXZlbnQgPSBBY2Nlc3NpYmlsaXR5RXZlbnQub2J0YWluKCk7CisgICAgICAgIGZ1bGx5UG9wdWxhdGVEZWZhdWx0QWNjZXNzaWJpbGl0eUV2ZW50KHNlbnRFdmVudCk7CisKKyAgICAgICAgLy8gc2V0IGV4cGVjdGF0aW9ucworICAgICAgICBzZXJ2aWNlLmV4cGVjdEV2ZW50KHNlbnRFdmVudCk7CisgICAgICAgIHNlcnZpY2UucmVwbGF5KCk7CisKKyAgICAgICAgLy8gc2VuZCB0aGUgZXZlbnQKKyAgICAgICAgbU1hbmFnZXJTZXJ2aWNlLnNlbmRBY2Nlc3NpYmlsaXR5RXZlbnQoc2VudEV2ZW50KTsKKworICAgICAgICAvLyB2ZXJpZnkgaWYgYWxsIGV4cGVjdGVkIG1ldGhvZHMgaGF2ZSBiZWVuIGNhbGxlZAorICAgICAgICBhc3NlcnRNb2NrU2VydmljZVZlcmlmaWVkV2l0aGluVGltZW91dChzZXJ2aWNlKTsKKyAgICB9CisKKyAgICBATGFyZ2VUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNlbmRBY2Nlc3NpYmlsaXR5RXZlbnRfT25lU2VydmljZV9Ob3RNYXRjaGluZ1BhY2thZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gc2V0IHRoZSBhY2Nlc3NpYmlsaXR5IHNldHRpbmcgdmFsdWUKKyAgICAgICAgZW5zdXJlQWNjZXNzaWJpbGl0eUVuYWJsZWQobUNvbnRleHQsIHRydWUpOworCisgICAgICAgIC8vIGVuYWJsZSB0aGUgbW9jayBhY2Nlc3NpYmlsaXR5IHNlcnZpY2UKKyAgICAgICAgZW5zdXJlT25seU1vY2tTZXJ2aWNlc0VuYWJsZWQobUNvbnRleHQsIHRydWUsIGZhbHNlKTsKKworICAgICAgICAvLyBjb25maWd1cmUgdGhlIG1vY2sgc2VydmljZQorICAgICAgICBNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2Ugc2VydmljZSA9IE15Rmlyc3RNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2Uuc0luc3RhbmNlOworICAgICAgICBzZXJ2aWNlLnNldFNlcnZpY2VJbmZvKE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5jcmVhdGVEZWZhdWx0SW5mbygpKTsKKworICAgICAgICAvLyB3YWl0IGZvciB0aGUgYmluZGVyIGNhbGwgdG8gI3NldFNlcnZpY2UgdG8gY29tcGxldGUKKyAgICAgICAgVGhyZWFkLnNsZWVwKFRJTUVPVVRfQklOREVSX0NBTEwpOworCisgICAgICAgIC8vIGNyZWF0ZSBhbmQgcG9wdWxhdGUgYW4gZXZlbnQgdG8gYmUgc2VudAorICAgICAgICBBY2Nlc3NpYmlsaXR5RXZlbnQgc2VudEV2ZW50ID0gQWNjZXNzaWJpbGl0eUV2ZW50Lm9idGFpbigpOworICAgICAgICBmdWxseVBvcHVsYXRlRGVmYXVsdEFjY2Vzc2liaWxpdHlFdmVudChzZW50RXZlbnQpOworICAgICAgICBzZW50RXZlbnQuc2V0UGFja2FnZU5hbWUoIm5vLnNlcnZpY2UucmVnaXN0ZXJlZC5mb3IudGhpcy5wYWNrYWdlIik7CisKKyAgICAgICAgLy8gc2V0IGV4cGVjdGF0aW9ucworICAgICAgICBzZXJ2aWNlLnJlcGxheSgpOworCisgICAgICAgIC8vIHNlbmQgdGhlIGV2ZW50CisgICAgICAgIG1NYW5hZ2VyU2VydmljZS5zZW5kQWNjZXNzaWJpbGl0eUV2ZW50KHNlbnRFdmVudCk7CisKKyAgICAgICAgLy8gdmVyaWZ5IGlmIGFsbCBleHBlY3RlZCBtZXRob2RzIGhhdmUgYmVlbiBjYWxsZWQKKyAgICAgICAgYXNzZXJ0TW9ja1NlcnZpY2VWZXJpZmllZFdpdGhpblRpbWVvdXQoc2VydmljZSk7CisgICAgfQorCisgICAgQExhcmdlVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZW5kQWNjZXNzaWJpbGl0eUV2ZW50X09uZVNlcnZpY2VfTm90TWF0Y2hpbmdFdmVudFR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gc2V0IHRoZSBhY2Nlc3NpYmlsaXR5IHNldHRpbmcgdmFsdWUKKyAgICAgICAgZW5zdXJlQWNjZXNzaWJpbGl0eUVuYWJsZWQobUNvbnRleHQsIHRydWUpOworCisgICAgICAgIC8vIGVuYWJsZSB0aGUgbW9jayBhY2Nlc3NpYmlsaXR5IHNlcnZpY2UKKyAgICAgICAgZW5zdXJlT25seU1vY2tTZXJ2aWNlc0VuYWJsZWQobUNvbnRleHQsIHRydWUsIGZhbHNlKTsKKworICAgICAgICAvLyBjb25maWd1cmUgdGhlIG1vY2sgc2VydmljZQorICAgICAgICBNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2Ugc2VydmljZSA9IE15Rmlyc3RNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2Uuc0luc3RhbmNlOworICAgICAgICBzZXJ2aWNlLnNldFNlcnZpY2VJbmZvKE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5jcmVhdGVEZWZhdWx0SW5mbygpKTsKKworICAgICAgICAvLyB3YWl0IGZvciB0aGUgYmluZGVyIGNhbGwgdG8gI3NldFNlcnZpY2UgdG8gY29tcGxldGUKKyAgICAgICAgVGhyZWFkLnNsZWVwKFRJTUVPVVRfQklOREVSX0NBTEwpOworCisgICAgICAgIC8vIGNyZWF0ZSBhbmQgcG9wdWxhdGUgYW4gZXZlbnQgdG8gYmUgc2VudAorICAgICAgICBBY2Nlc3NpYmlsaXR5RXZlbnQgc2VudEV2ZW50ID0gQWNjZXNzaWJpbGl0eUV2ZW50Lm9idGFpbigpOworICAgICAgICBmdWxseVBvcHVsYXRlRGVmYXVsdEFjY2Vzc2liaWxpdHlFdmVudChzZW50RXZlbnQpOworICAgICAgICBzZW50RXZlbnQuc2V0RXZlbnRUeXBlKEFjY2Vzc2liaWxpdHlFdmVudC5UWVBFX05PVElGSUNBVElPTl9TVEFURV9DSEFOR0VEKTsKKworICAgICAgICAvLyBzZXQgZXhwZWN0YXRpb25zCisgICAgICAgIHNlcnZpY2UucmVwbGF5KCk7CisKKyAgICAgICAgLy8gc2VuZCB0aGUgZXZlbnQKKyAgICAgICAgbU1hbmFnZXJTZXJ2aWNlLnNlbmRBY2Nlc3NpYmlsaXR5RXZlbnQoc2VudEV2ZW50KTsKKworICAgICAgICAvLyB2ZXJpZnkgaWYgYWxsIGV4cGVjdGVkIG1ldGhvZHMgaGF2ZSBiZWVuIGNhbGxlZAorICAgICAgICBhc3NlcnRNb2NrU2VydmljZVZlcmlmaWVkV2l0aGluVGltZW91dChzZXJ2aWNlKTsKKyAgICB9CisKKyAgICBATGFyZ2VUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNlbmRBY2Nlc3NpYmlsaXR5RXZlbnRfT25lU2VydmljZV9Ob3RpZml2YXRpb25BZnRlclRpbWVvdXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gc2V0IHRoZSBhY2Nlc3NpYmlsaXR5IHNldHRpbmcgdmFsdWUKKyAgICAgICAgZW5zdXJlQWNjZXNzaWJpbGl0eUVuYWJsZWQobUNvbnRleHQsIHRydWUpOworCisgICAgICAgIC8vIGVuYWJsZSB0aGUgbW9jayBhY2Nlc3NpYmlsaXR5IHNlcnZpY2UKKyAgICAgICAgZW5zdXJlT25seU1vY2tTZXJ2aWNlc0VuYWJsZWQobUNvbnRleHQsIHRydWUsIGZhbHNlKTsKKworICAgICAgICAvLyBjb25maWd1cmUgdGhlIG1vY2sgc2VydmljZQorICAgICAgICBNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2Ugc2VydmljZSA9IE15Rmlyc3RNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2Uuc0luc3RhbmNlOworICAgICAgICBBY2Nlc3NpYmlsaXR5U2VydmljZUluZm8gaW5mbyA9IE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5jcmVhdGVEZWZhdWx0SW5mbygpOworICAgICAgICBpbmZvLm5vdGlmaWNhdGlvblRpbWVvdXQgPSBUSU1FT1VUX1RFU1RfTk9USUZJQ0FUSU9OX1RJTUVPVVQ7CisgICAgICAgIHNlcnZpY2Uuc2V0U2VydmljZUluZm8oaW5mbyk7CisKKyAgICAgICAgLy8gd2FpdCBmb3IgdGhlIGJpbmRlciBjYWxsIHRvICNzZXRTZXJ2aWNlIHRvIGNvbXBsZXRlCisgICAgICAgIFRocmVhZC5zbGVlcChUSU1FT1VUX0JJTkRFUl9DQUxMKTsKKworICAgICAgICAvLyBjcmVhdGUgYW5kIHBvcHVsYXRlIHRoZSBmaXJzdCBldmVudCB0byBiZSBzZW50CisgICAgICAgIEFjY2Vzc2liaWxpdHlFdmVudCBmaXJzdEV2ZW50ID0gQWNjZXNzaWJpbGl0eUV2ZW50Lm9idGFpbigpOworICAgICAgICBmdWxseVBvcHVsYXRlRGVmYXVsdEFjY2Vzc2liaWxpdHlFdmVudChmaXJzdEV2ZW50KTsKKworICAgICAgICAvLyBjcmVhdGUgYW5kIHBvcHVsYXRlIHRoZSBzZWNvbmQgZXZlbnQgdG8gYmUgc2VudAorICAgICAgICBBY2Nlc3NpYmlsaXR5RXZlbnQgc2Vjb25kRXZlbnQgPSBBY2Nlc3NpYmlsaXR5RXZlbnQub2J0YWluKCk7CisgICAgICAgIGZ1bGx5UG9wdWxhdGVEZWZhdWx0QWNjZXNzaWJpbGl0eUV2ZW50KHNlY29uZEV2ZW50KTsKKworICAgICAgICAvLyBzZXQgZXhwZWN0YXRpb25zCisgICAgICAgIHNlcnZpY2UuZXhwZWN0RXZlbnQoc2Vjb25kRXZlbnQpOworICAgICAgICBzZXJ2aWNlLnJlcGxheSgpOworCisgICAgICAgIC8vIHNlbmQgdGhlIGV2ZW50cworICAgICAgICBtTWFuYWdlclNlcnZpY2Uuc2VuZEFjY2Vzc2liaWxpdHlFdmVudChmaXJzdEV2ZW50KTsKKyAgICAgICAgbU1hbmFnZXJTZXJ2aWNlLnNlbmRBY2Nlc3NpYmlsaXR5RXZlbnQoc2Vjb25kRXZlbnQpOworCisgICAgICAgIC8vIHdhaXQgZm9yICNzZW5kQWNjZXNzaWJpbGl0eUV2ZW50IHRvIHJlYWNoIHRoZSBiYWNraW5nIHNlcnZpY2UKKyAgICAgICAgVGhyZWFkLnNsZWVwKFRJTUVPVVRfQklOREVSX0NBTEwpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzZXJ2aWNlLnZlcmlmeSgpOworICAgICAgICAgICAgZmFpbCgiTm8gZXZlbnRzIG11c3QgYmUgZGlzcGF0Y2hlZCBiZWZvcmUgdGhlIGV4cGlyYXRpb24gb2YgdGhlIG5vdGlmaWNhdGlvbiB0aW1lb3V0LiIpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaXNlKSB7CisgICAgICAgICAgICAvKiBleHBlY3RlZCAqLworICAgICAgICB9CisKKyAgICAgICAgLy8gd2FpdCBmb3IgdGhlIGNvbmZpZ3VyZWQgbm90aWZpY2F0aW9uIHRpbWVvdXQgdG8gZXhwaXJlCisgICAgICAgIFRocmVhZC5zbGVlcChUSU1FT1VUX1RFU1RfTk9USUZJQ0FUSU9OX1RJTUVPVVQpOworCisgICAgICAgIC8vIHZlcmlmeSBpZiBhbGwgZXhwZWN0ZWQgbWV0aG9kcyBoYXZlIGJlZW4gY2FsbGVkCisgICAgICAgIGFzc2VydE1vY2tTZXJ2aWNlVmVyaWZpZWRXaXRoaW5UaW1lb3V0KHNlcnZpY2UpOworICAgIH0KKworICAgIEBMYXJnZVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2VuZEFjY2Vzc2liaWxpdHlFdmVudF9Ud29TZXJ2aWNlc19NYXRjaGluZ1BhY2thZ2VBbmRFdmVudFR5cGVfRGlmZkZlZWRiYWNrKCkKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBzZXQgdGhlIGFjY2Vzc2liaWxpdHkgc2V0dGluZyB2YWx1ZQorICAgICAgICBlbnN1cmVBY2Nlc3NpYmlsaXR5RW5hYmxlZChtQ29udGV4dCwgdHJ1ZSk7CisKKyAgICAgICAgLy8gZW5hYmxlIHRoZSBtb2NrIGFjY2Vzc2liaWxpdHkgc2VydmljZXMKKyAgICAgICAgZW5zdXJlT25seU1vY2tTZXJ2aWNlc0VuYWJsZWQobUNvbnRleHQsIHRydWUsIHRydWUpOworCisgICAgICAgIC8vIGNvbmZpZ3VyZSB0aGUgZmlyc3QgbW9jayBzZXJ2aWNlCisgICAgICAgIE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZSBmaXJzdFNlcnZpY2UgPSBNeUZpcnN0TW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLnNJbnN0YW5jZTsKKyAgICAgICAgQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvIGZpcnN0SW5mbyA9IE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5jcmVhdGVEZWZhdWx0SW5mbygpOworICAgICAgICBmaXJzdEluZm8uZmVlZGJhY2tUeXBlID0gQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvLkZFRURCQUNLX0FVRElCTEU7CisgICAgICAgIGZpcnN0U2VydmljZS5zZXRTZXJ2aWNlSW5mbyhmaXJzdEluZm8pOworCisgICAgICAgIC8vIGNvbmZpZ3VyZSB0aGUgc2Vjb25kIG1vY2sgc2VydmljZQorICAgICAgICBNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2Ugc2Vjb25kU2VydmljZSA9IE15U2Vjb25kTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLnNJbnN0YW5jZTsKKyAgICAgICAgQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvIHNlY29uZEluZm8gPSBNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2UuY3JlYXRlRGVmYXVsdEluZm8oKTsKKyAgICAgICAgc2Vjb25kSW5mby5mZWVkYmFja1R5cGUgPSBBY2Nlc3NpYmlsaXR5U2VydmljZUluZm8uRkVFREJBQ0tfSEFQVElDOworICAgICAgICBzZWNvbmRTZXJ2aWNlLnNldFNlcnZpY2VJbmZvKHNlY29uZEluZm8pOworCisgICAgICAgIC8vIHdhaXQgZm9yIHRoZSBiaW5kZXIgY2FsbHMgdG8gI3NldFNlcnZpY2UgdG8gY29tcGxldGUKKyAgICAgICAgVGhyZWFkLnNsZWVwKFRJTUVPVVRfQklOREVSX0NBTEwpOworCisgICAgICAgIC8vIGNyZWF0ZSBhbmQgcG9wdWxhdGUgYW4gZXZlbnQgdG8gYmUgc2VudAorICAgICAgICBBY2Nlc3NpYmlsaXR5RXZlbnQgc2VudEV2ZW50ID0gQWNjZXNzaWJpbGl0eUV2ZW50Lm9idGFpbigpOworICAgICAgICBmdWxseVBvcHVsYXRlRGVmYXVsdEFjY2Vzc2liaWxpdHlFdmVudChzZW50RXZlbnQpOworCisgICAgICAgIC8vIHNldCBleHBlY3RhdGlvbnMgZm9yIHRoZSBmaXJzdCBtb2NrIHNlcnZpY2UKKyAgICAgICAgZmlyc3RTZXJ2aWNlLmV4cGVjdEV2ZW50KHNlbnRFdmVudCk7CisgICAgICAgIGZpcnN0U2VydmljZS5yZXBsYXkoKTsKKworICAgICAgICAvLyBzZXQgZXhwZWN0YXRpb25zIGZvciB0aGUgc2Vjb25kIG1vY2sgc2VydmljZQorICAgICAgICBzZWNvbmRTZXJ2aWNlLmV4cGVjdEV2ZW50KHNlbnRFdmVudCk7CisgICAgICAgIHNlY29uZFNlcnZpY2UucmVwbGF5KCk7CisKKyAgICAgICAgLy8gc2VuZCB0aGUgZXZlbnQKKyAgICAgICAgbU1hbmFnZXJTZXJ2aWNlLnNlbmRBY2Nlc3NpYmlsaXR5RXZlbnQoc2VudEV2ZW50KTsKKworICAgICAgICAvLyB2ZXJpZnkgaWYgYWxsIGV4cGVjdGVkIG1ldGhvZHMgaGF2ZSBiZWVuIGNhbGxlZAorICAgICAgICBhc3NlcnRNb2NrU2VydmljZVZlcmlmaWVkV2l0aGluVGltZW91dChmaXJzdFNlcnZpY2UpOworICAgICAgICBhc3NlcnRNb2NrU2VydmljZVZlcmlmaWVkV2l0aGluVGltZW91dChzZWNvbmRTZXJ2aWNlKTsKKyAgICB9CisKKyAgICBATGFyZ2VUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNlbmRBY2Nlc3NpYmlsaXR5RXZlbnRfVHdvU2VydmljZXNfTWF0Y2hpbmdQYWNrYWdlQW5kRXZlbnRUeXBlKCkKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBzZXQgdGhlIGFjY2Vzc2liaWxpdHkgc2V0dGluZyB2YWx1ZQorICAgICAgICBlbnN1cmVBY2Nlc3NpYmlsaXR5RW5hYmxlZChtQ29udGV4dCwgdHJ1ZSk7CisKKyAgICAgICAgLy8gZW5hYmxlIHRoZSBtb2NrIGFjY2Vzc2liaWxpdHkgc2VydmljZXMKKyAgICAgICAgZW5zdXJlT25seU1vY2tTZXJ2aWNlc0VuYWJsZWQobUNvbnRleHQsIHRydWUsIHRydWUpOworCisgICAgICAgIC8vIGNvbmZpZ3VyZSB0aGUgZmlyc3QgbW9jayBzZXJ2aWNlCisgICAgICAgIE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZSBmaXJzdFNlcnZpY2UgPSBNeUZpcnN0TW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLnNJbnN0YW5jZTsKKyAgICAgICAgZmlyc3RTZXJ2aWNlLnNldFNlcnZpY2VJbmZvKE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5jcmVhdGVEZWZhdWx0SW5mbygpKTsKKworICAgICAgICAvLyBjb25maWd1cmUgdGhlIHNlY29uZCBtb2NrIHNlcnZpY2UKKyAgICAgICAgTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlIHNlY29uZFNlcnZpY2UgPSBNeVNlY29uZE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5zSW5zdGFuY2U7CisgICAgICAgIHNlY29uZFNlcnZpY2Uuc2V0U2VydmljZUluZm8oTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLmNyZWF0ZURlZmF1bHRJbmZvKCkpOworCisgICAgICAgIC8vIHdhaXQgZm9yIHRoZSBiaW5kZXIgY2FsbHMgdG8gI3NldFNlcnZpY2UgdG8gY29tcGxldGUKKyAgICAgICAgVGhyZWFkLnNsZWVwKFRJTUVPVVRfQklOREVSX0NBTEwpOworCisgICAgICAgIC8vIGNyZWF0ZSBhbmQgcG9wdWxhdGUgYW4gZXZlbnQgdG8gYmUgc2VudAorICAgICAgICBBY2Nlc3NpYmlsaXR5RXZlbnQgc2VudEV2ZW50ID0gQWNjZXNzaWJpbGl0eUV2ZW50Lm9idGFpbigpOworICAgICAgICBmdWxseVBvcHVsYXRlRGVmYXVsdEFjY2Vzc2liaWxpdHlFdmVudChzZW50RXZlbnQpOworCisgICAgICAgIC8vIHNldCBleHBlY3RhdGlvbnMgZm9yIHRoZSBmaXJzdCBtb2NrIHNlcnZpY2UKKyAgICAgICAgZmlyc3RTZXJ2aWNlLmV4cGVjdEV2ZW50KHNlbnRFdmVudCk7CisgICAgICAgIGZpcnN0U2VydmljZS5yZXBsYXkoKTsKKworICAgICAgICAvLyBzZXQgZXhwZWN0YXRpb25zIGZvciB0aGUgc2Vjb25kIG1vY2sgc2VydmljZQorICAgICAgICBzZWNvbmRTZXJ2aWNlLnJlcGxheSgpOworCisgICAgICAgIC8vIHNlbmQgdGhlIGV2ZW50CisgICAgICAgIG1NYW5hZ2VyU2VydmljZS5zZW5kQWNjZXNzaWJpbGl0eUV2ZW50KHNlbnRFdmVudCk7CisKKyAgICAgICAgLy8gdmVyaWZ5IGlmIGFsbCBleHBlY3RlZCBtZXRob2RzIGhhdmUgYmVlbiBjYWxsZWQKKyAgICAgICAgYXNzZXJ0TW9ja1NlcnZpY2VWZXJpZmllZFdpdGhpblRpbWVvdXQoZmlyc3RTZXJ2aWNlKTsKKyAgICAgICAgYXNzZXJ0TW9ja1NlcnZpY2VWZXJpZmllZFdpdGhpblRpbWVvdXQoc2Vjb25kU2VydmljZSk7CisgICAgfQorCisgICAgQExhcmdlVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZW5kQWNjZXNzaWJpbGl0eUV2ZW50X1R3b1NlcnZpY2VzX01hdGNoaW5nUGFja2FnZUFuZEV2ZW50VHlwZV9PbmVEZWZhdWx0KCkKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBzZXQgdGhlIGFjY2Vzc2liaWxpdHkgc2V0dGluZyB2YWx1ZQorICAgICAgICBlbnN1cmVBY2Nlc3NpYmlsaXR5RW5hYmxlZChtQ29udGV4dCwgdHJ1ZSk7CisKKyAgICAgICAgLy8gZW5hYmxlIHRoZSBtb2NrIGFjY2Vzc2liaWxpdHkgc2VydmljZXMKKyAgICAgICAgZW5zdXJlT25seU1vY2tTZXJ2aWNlc0VuYWJsZWQobUNvbnRleHQsIHRydWUsIHRydWUpOworCisgICAgICAgIC8vIGNvbmZpZ3VyZSB0aGUgZmlyc3QgbW9jayBzZXJ2aWNlCisgICAgICAgIE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZSBmaXJzdFNlcnZpY2UgPSBNeUZpcnN0TW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLnNJbnN0YW5jZTsKKyAgICAgICAgQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvIGZpcnN0SW5mbyA9IE15Rmlyc3RNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2UuY3JlYXRlRGVmYXVsdEluZm8oKTsKKyAgICAgICAgZmlyc3RJbmZvLmZsYWdzID0gQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvLkRFRkFVTFQ7CisgICAgICAgIGZpcnN0U2VydmljZS5zZXRTZXJ2aWNlSW5mbyhmaXJzdEluZm8pOworCisgICAgICAgIC8vIGNvbmZpZ3VyZSB0aGUgc2Vjb25kIG1vY2sgc2VydmljZQorICAgICAgICBNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2Ugc2Vjb25kU2VydmljZSA9IE15U2Vjb25kTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLnNJbnN0YW5jZTsKKyAgICAgICAgc2Vjb25kU2VydmljZS5zZXRTZXJ2aWNlSW5mbyhNeVNlY29uZE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5jcmVhdGVEZWZhdWx0SW5mbygpKTsKKworICAgICAgICAvLyB3YWl0IGZvciB0aGUgYmluZGVyIGNhbGxzIHRvICNzZXRTZXJ2aWNlIHRvIGNvbXBsZXRlCisgICAgICAgIFRocmVhZC5zbGVlcChUSU1FT1VUX0JJTkRFUl9DQUxMKTsKKworICAgICAgICAvLyBjcmVhdGUgYW5kIHBvcHVsYXRlIGFuIGV2ZW50IHRvIGJlIHNlbnQKKyAgICAgICAgQWNjZXNzaWJpbGl0eUV2ZW50IHNlbnRFdmVudCA9IEFjY2Vzc2liaWxpdHlFdmVudC5vYnRhaW4oKTsKKyAgICAgICAgZnVsbHlQb3B1bGF0ZURlZmF1bHRBY2Nlc3NpYmlsaXR5RXZlbnQoc2VudEV2ZW50KTsKKworICAgICAgICAvLyBzZXQgZXhwZWN0YXRpb25zIGZvciB0aGUgZmlyc3QgbW9jayBzZXJ2aWNlCisgICAgICAgIGZpcnN0U2VydmljZS5yZXBsYXkoKTsKKworICAgICAgICAvLyBzZXQgZXhwZWN0YXRpb25zIGZvciB0aGUgc2Vjb25kIG1vY2sgc2VydmljZQorICAgICAgICBzZWNvbmRTZXJ2aWNlLmV4cGVjdEV2ZW50KHNlbnRFdmVudCk7CisgICAgICAgIHNlY29uZFNlcnZpY2UucmVwbGF5KCk7CisKKyAgICAgICAgLy8gc2VuZCB0aGUgZXZlbnQKKyAgICAgICAgbU1hbmFnZXJTZXJ2aWNlLnNlbmRBY2Nlc3NpYmlsaXR5RXZlbnQoc2VudEV2ZW50KTsKKworICAgICAgICAvLyB2ZXJpZnkgaWYgYWxsIGV4cGVjdGVkIG1ldGhvZHMgaGF2ZSBiZWVuIGNhbGxlZAorICAgICAgICBhc3NlcnRNb2NrU2VydmljZVZlcmlmaWVkV2l0aGluVGltZW91dChmaXJzdFNlcnZpY2UpOworICAgICAgICBhc3NlcnRNb2NrU2VydmljZVZlcmlmaWVkV2l0aGluVGltZW91dChzZWNvbmRTZXJ2aWNlKTsKKyAgICB9CisKKyAgICBATGFyZ2VUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNlbmRBY2Nlc3NpYmlsaXR5RXZlbnRfVHdvU2VydmljZXNfTWF0Y2hpbmdQYWNrYWdlQW5kRXZlbnRUeXBlX1R3b0RlZmF1bHQoKQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIHNldCB0aGUgYWNjZXNzaWJpbGl0eSBzZXR0aW5nIHZhbHVlCisgICAgICAgIGVuc3VyZUFjY2Vzc2liaWxpdHlFbmFibGVkKG1Db250ZXh0LCB0cnVlKTsKKworICAgICAgICAvLyBlbmFibGUgdGhlIG1vY2sgYWNjZXNzaWJpbGl0eSBzZXJ2aWNlcworICAgICAgICBlbnN1cmVPbmx5TW9ja1NlcnZpY2VzRW5hYmxlZChtQ29udGV4dCwgdHJ1ZSwgdHJ1ZSk7CisKKyAgICAgICAgLy8gY29uZmlndXJlIHRoZSBmaXJzdCBtb2NrIHNlcnZpY2UKKyAgICAgICAgTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlIGZpcnN0U2VydmljZSA9IE15Rmlyc3RNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2Uuc0luc3RhbmNlOworICAgICAgICBBY2Nlc3NpYmlsaXR5U2VydmljZUluZm8gZmlyc3RJbmZvID0gTXlGaXJzdE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5jcmVhdGVEZWZhdWx0SW5mbygpOworICAgICAgICBmaXJzdEluZm8uZmxhZ3MgPSBBY2Nlc3NpYmlsaXR5U2VydmljZUluZm8uREVGQVVMVDsKKyAgICAgICAgZmlyc3RTZXJ2aWNlLnNldFNlcnZpY2VJbmZvKGZpcnN0SW5mbyk7CisKKyAgICAgICAgLy8gY29uZmlndXJlIHRoZSBzZWNvbmQgbW9jayBzZXJ2aWNlCisgICAgICAgIE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZSBzZWNvbmRTZXJ2aWNlID0gTXlTZWNvbmRNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2Uuc0luc3RhbmNlOworICAgICAgICBBY2Nlc3NpYmlsaXR5U2VydmljZUluZm8gc2Vjb25kSW5mbyA9IE15Rmlyc3RNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2UuY3JlYXRlRGVmYXVsdEluZm8oKTsKKyAgICAgICAgc2Vjb25kSW5mby5mbGFncyA9IEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mby5ERUZBVUxUOworICAgICAgICBzZWNvbmRTZXJ2aWNlLnNldFNlcnZpY2VJbmZvKGZpcnN0SW5mbyk7CisKKyAgICAgICAgLy8gd2FpdCBmb3IgdGhlIGJpbmRlciBjYWxscyB0byAjc2V0U2VydmljZSB0byBjb21wbGV0ZQorICAgICAgICBUaHJlYWQuc2xlZXAoVElNRU9VVF9CSU5ERVJfQ0FMTCk7CisKKyAgICAgICAgLy8gY3JlYXRlIGFuZCBwb3B1bGF0ZSBhbiBldmVudCB0byBiZSBzZW50CisgICAgICAgIEFjY2Vzc2liaWxpdHlFdmVudCBzZW50RXZlbnQgPSBBY2Nlc3NpYmlsaXR5RXZlbnQub2J0YWluKCk7CisgICAgICAgIGZ1bGx5UG9wdWxhdGVEZWZhdWx0QWNjZXNzaWJpbGl0eUV2ZW50KHNlbnRFdmVudCk7CisKKyAgICAgICAgLy8gc2V0IGV4cGVjdGF0aW9ucyBmb3IgdGhlIGZpcnN0IG1vY2sgc2VydmljZQorICAgICAgICBmaXJzdFNlcnZpY2UuZXhwZWN0RXZlbnQoc2VudEV2ZW50KTsKKyAgICAgICAgZmlyc3RTZXJ2aWNlLnJlcGxheSgpOworCisgICAgICAgIC8vIHNldCBleHBlY3RhdGlvbnMgZm9yIHRoZSBzZWNvbmQgbW9jayBzZXJ2aWNlCisgICAgICAgIHNlY29uZFNlcnZpY2UucmVwbGF5KCk7CisKKyAgICAgICAgLy8gc2VuZCB0aGUgZXZlbnQKKyAgICAgICAgbU1hbmFnZXJTZXJ2aWNlLnNlbmRBY2Nlc3NpYmlsaXR5RXZlbnQoc2VudEV2ZW50KTsKKworICAgICAgICAvLyB2ZXJpZnkgaWYgYWxsIGV4cGVjdGVkIG1ldGhvZHMgaGF2ZSBiZWVuIGNhbGxlZAorICAgICAgICBhc3NlcnRNb2NrU2VydmljZVZlcmlmaWVkV2l0aGluVGltZW91dChmaXJzdFNlcnZpY2UpOworICAgICAgICBhc3NlcnRNb2NrU2VydmljZVZlcmlmaWVkV2l0aGluVGltZW91dChzZWNvbmRTZXJ2aWNlKTsKKyAgICB9CisKKyAgICBATGFyZ2VUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEludGVycnVwdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBzZXQgdGhlIGFjY2Vzc2liaWxpdHkgc2V0dGluZyB2YWx1ZQorICAgICAgICBlbnN1cmVBY2Nlc3NpYmlsaXR5RW5hYmxlZChtQ29udGV4dCwgdHJ1ZSk7CisKKyAgICAgICAgLy8gZW5hYmxlIHRoZSBtb2NrIGFjY2Vzc2liaWxpdHkgc2VydmljZXMKKyAgICAgICAgZW5zdXJlT25seU1vY2tTZXJ2aWNlc0VuYWJsZWQobUNvbnRleHQsIHRydWUsIHRydWUpOworCisgICAgICAgIC8vIGNvbmZpZ3VyZSB0aGUgZmlyc3QgbW9jayBzZXJ2aWNlCisgICAgICAgIE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZSBmaXJzdFNlcnZpY2UgPSBNeUZpcnN0TW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLnNJbnN0YW5jZTsKKyAgICAgICAgZmlyc3RTZXJ2aWNlLnNldFNlcnZpY2VJbmZvKE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5jcmVhdGVEZWZhdWx0SW5mbygpKTsKKworICAgICAgICAvLyBjb25maWd1cmUgdGhlIHNlY29uZCBtb2NrIHNlcnZpY2UKKyAgICAgICAgTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlIHNlY29uZFNlcnZpY2UgPSBNeVNlY29uZE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5zSW5zdGFuY2U7CisgICAgICAgIHNlY29uZFNlcnZpY2Uuc2V0U2VydmljZUluZm8oTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLmNyZWF0ZURlZmF1bHRJbmZvKCkpOworCisgICAgICAgIC8vIHdhaXQgZm9yIHRoZSBiaW5kZXIgY2FsbHMgdG8gI3NldFNlcnZpY2UgdG8gY29tcGxldGUKKyAgICAgICAgVGhyZWFkLnNsZWVwKFRJTUVPVVRfQklOREVSX0NBTEwpOworCisgICAgICAgIC8vIHNldCBleHBlY3RhdGlvbnMgZm9yIHRoZSBmaXJzdCBtb2NrIHNlcnZpY2UKKyAgICAgICAgZmlyc3RTZXJ2aWNlLmV4cGVjdEludGVycnVwdCgpOworICAgICAgICBmaXJzdFNlcnZpY2UucmVwbGF5KCk7CisKKyAgICAgICAgLy8gc2V0IGV4cGVjdGF0aW9ucyBmb3IgdGhlIHNlY29uZCBtb2NrIHNlcnZpY2UKKyAgICAgICAgc2Vjb25kU2VydmljZS5leHBlY3RJbnRlcnJ1cHQoKTsKKyAgICAgICAgc2Vjb25kU2VydmljZS5yZXBsYXkoKTsKKworICAgICAgICAvLyBjYWxsIHRoZSBtZXRob2QgdW5kZXIgdGVzdAorICAgICAgICBtTWFuYWdlclNlcnZpY2UuaW50ZXJydXB0KCk7CisKKyAgICAgICAgLy8gdmVyaWZ5IGlmIGFsbCBleHBlY3RlZCBtZXRob2RzIGhhdmUgYmVlbiBjYWxsZWQKKyAgICAgICAgYXNzZXJ0TW9ja1NlcnZpY2VWZXJpZmllZFdpdGhpblRpbWVvdXQoZmlyc3RTZXJ2aWNlKTsKKyAgICAgICAgYXNzZXJ0TW9ja1NlcnZpY2VWZXJpZmllZFdpdGhpblRpbWVvdXQoc2Vjb25kU2VydmljZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRnVsbHkgcG9wdWxhdGVzIHRoZSB7QGxpbmsgQWNjZXNzaWJpbGl0eUV2ZW50fSB0byBtYXJzaGFsLgorICAgICAqCisgICAgICogQHBhcmFtIHNlbnRFdmVudCBUaGUgZXZlbnQgdG8gcG9wdWxhdGUuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGZ1bGx5UG9wdWxhdGVEZWZhdWx0QWNjZXNzaWJpbGl0eUV2ZW50KEFjY2Vzc2liaWxpdHlFdmVudCBzZW50RXZlbnQpIHsKKyAgICAgICAgc2VudEV2ZW50LnNldEFkZGVkQ291bnQoMSk7CisgICAgICAgIHNlbnRFdmVudC5zZXRCZWZvcmVUZXh0KCJCZWZvcmVUZXh0Iik7CisgICAgICAgIHNlbnRFdmVudC5zZXRDaGVja2VkKHRydWUpOworICAgICAgICBzZW50RXZlbnQuc2V0Q2xhc3NOYW1lKCJmb28uYmFyLmJhei5DbGFzcyIpOworICAgICAgICBzZW50RXZlbnQuc2V0Q29udGVudERlc2NyaXB0aW9uKCJDb250ZW50RGVzY3JpcHRpb24iKTsKKyAgICAgICAgc2VudEV2ZW50LnNldEN1cnJlbnRJdGVtSW5kZXgoMSk7CisgICAgICAgIHNlbnRFdmVudC5zZXRFbmFibGVkKHRydWUpOworICAgICAgICBzZW50RXZlbnQuc2V0RXZlbnRUeXBlKEFjY2Vzc2liaWxpdHlFdmVudC5UWVBFX1ZJRVdfQ0xJQ0tFRCk7CisgICAgICAgIHNlbnRFdmVudC5zZXRFdmVudFRpbWUoMTAwMCk7CisgICAgICAgIHNlbnRFdmVudC5zZXRGcm9tSW5kZXgoMSk7CisgICAgICAgIHNlbnRFdmVudC5zZXRGdWxsU2NyZWVuKHRydWUpOworICAgICAgICBzZW50RXZlbnQuc2V0SXRlbUNvdW50KDEpOworICAgICAgICBzZW50RXZlbnQuc2V0UGFja2FnZU5hbWUoImZvby5iYXIuYmF6Iik7CisgICAgICAgIHNlbnRFdmVudC5zZXRQYXJjZWxhYmxlRGF0YShNZXNzYWdlLm9idGFpbihudWxsLCAxLCBudWxsKSk7CisgICAgICAgIHNlbnRFdmVudC5zZXRQYXNzd29yZCh0cnVlKTsKKyAgICAgICAgc2VudEV2ZW50LnNldFJlbW92ZWRDb3VudCgxKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGNsYXNzIGlzIGEgbW9jayB7QGxpbmsgSUFjY2Vzc2liaWxpdHlNYW5hZ2VyQ2xpZW50fS4KKyAgICAgKi8KKyAgICBwdWJsaWMgY2xhc3MgTXlNb2NrQWNjZXNzaWJpbGl0eU1hbmFnZXJDbGllbnQgZXh0ZW5kcyBJQWNjZXNzaWJpbGl0eU1hbmFnZXJDbGllbnQuU3R1YiB7CisgICAgICAgIGJvb2xlYW4gbUlzRW5hYmxlZDsKKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCkgeworICAgICAgICAgICAgbUlzRW5hYmxlZCA9IGVuYWJsZWQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbnN1cmVzIGFjY2Vzc2liaWxpdHkgaXMgaW4gYSBnaXZlbiBzdGF0ZSBieSB3cml0aW5nIHRoZSBzdGF0ZSB0byB0aGUKKyAgICAgKiBzZXR0aW5ncyBhbmQgd2FpdGluZyB1bnRpbCB0aGUgYWNjZXNzaWJpbGl0eSBtYW5hZ2VyIHNlcnZpY2UgcGljayBpdCB1cC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IEEgY29udGV4dCBoYW5kbGUgdG8gYWNjZXNzIHRoZSBzZXR0aW5ncy4KKyAgICAgKiBAcGFyYW0gZW5hYmxlZCBUaGUgYWNjZXNzaWJpbGl0eSBzdGF0ZSB0byB3cml0ZSB0byB0aGUgc2V0dGluZ3MuCisgICAgICogQHRocm93cyBFeGNlcHRpb24gSWYgYW55IGVycm9yIG9jY3Vycy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgZW5zdXJlQWNjZXNzaWJpbGl0eUVuYWJsZWQoQ29udGV4dCBjb250ZXh0LCBib29sZWFuIGVuYWJsZWQpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBib29sZWFuIGlzRW5hYmxlZCA9IChTZXR0aW5ncy5TZWN1cmUuZ2V0SW50KGNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCksCisgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLkFDQ0VTU0lCSUxJVFlfRU5BQkxFRCwgMCkgPT0gMSA/IHRydWUgOiBmYWxzZSk7CisKKyAgICAgICAgaWYgKGlzRW5hYmxlZCA9PSBlbmFibGVkKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBTZXR0aW5ncy5TZWN1cmUucHV0SW50KGNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCksIFNldHRpbmdzLlNlY3VyZS5BQ0NFU1NJQklMSVRZX0VOQUJMRUQsCisgICAgICAgICAgICAgICAgZW5hYmxlZCA/IDEgOiAwKTsKKworICAgICAgICAvLyB3YWl0IHRoZSBhY2Nlc3NpYmlsaXR5IG1hbmFnZXIgc2VydmljZSB0byBwaWNrIHRoZSBjaGFuZ2UgdXAKKyAgICAgICAgVGhyZWFkLnNsZWVwKFRJTUVPVVRfQklOREVSX0NBTEwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEVuc3VyZXMgdGhlIG9ubHkge0BsaW5rIE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZX1zIHdpdGggZ2l2ZW4gY29tcG9uZW50CisgICAgICogbmFtZXMgYXJlIGVuYWJsZWQgYnkgd3JpdGluZyB0byB0aGUgc3lzdGVtIHNldHRpbmdzIGFuZCB3YWl0aW5nIHVudGlsIHRoZQorICAgICAqIGFjY2Vzc2liaWxpdHkgbWFuYWdlciBzZXJ2aWNlIHBpY2tzIHRoYXQgdXAgb3IgdGhlCisgICAgICoge0BsaW5rICNUSU1FT1VUX1NUQVJUX01PQ0tfQUNDRVNTSUJJTElUWV9TRVJWSUNFU30gaXMgZXhjZWVkZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBBIGNvbnRleHQgaGFuZGxlIHRvIGFjY2VzcyB0aGUgc2V0dGluZ3MuCisgICAgICogQHBhcmFtIGZpcnN0TW9ja1NlcnZpY2VFbmFibGVkIElmIHRoZSBmaXJzdCBtb2NrIGFjY2Vzc2liaWxpdHkgc2VydmljZSBpcyBlbmFibGVkLgorICAgICAqIEBwYXJhbSBzZWNvbmRNb2NrU2VydmljZUVuYWJsZWQgSWYgdGhlIHNlY29uZCBtb2NrIGFjY2Vzc2liaWxpdHkgc2VydmljZSBpcyBlbmFibGVkLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIElmIHNvbWUgb2YgdGhlIHJlcXVlc3RlZCBmb3IgZW5hYmxpbmcgbW9jayBzZXJ2aWNlcworICAgICAqICAgICAgICAgaXMgbm90IHByb3Blcmx5IHN0YXJ0ZWQuCisgICAgICogQHRocm93cyBFeGNlcHRpb24gRXhjZXB0aW9uIElmIGFueSBlcnJvciBvY2N1cnMuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGVuc3VyZU9ubHlNb2NrU2VydmljZXNFbmFibGVkKENvbnRleHQgY29udGV4dCwgYm9vbGVhbiBmaXJzdE1vY2tTZXJ2aWNlRW5hYmxlZCwKKyAgICAgICAgICAgIGJvb2xlYW4gc2Vjb25kTW9ja1NlcnZpY2VFbmFibGVkKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGVuYWJsZWRTZXJ2aWNlcyA9IFNldHRpbmdzLlNlY3VyZS5nZXRTdHJpbmcoY29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwKKyAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuRU5BQkxFRF9BQ0NFU1NJQklMSVRZX1NFUlZJQ0VTKTsKKworICAgICAgICBTdHJpbmdCdWlsZGVyIHNlcnZpY2VzVG9FbmFibGUgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBpZiAoZmlyc3RNb2NrU2VydmljZUVuYWJsZWQpIHsKKyAgICAgICAgICAgIHNlcnZpY2VzVG9FbmFibGUuYXBwZW5kKE15Rmlyc3RNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2Uuc0NvbXBvbmVudE5hbWUpLmFwcGVuZCgiOiIpOworICAgICAgICB9CisgICAgICAgIGlmIChzZWNvbmRNb2NrU2VydmljZUVuYWJsZWQpIHsKKyAgICAgICAgICAgIHNlcnZpY2VzVG9FbmFibGUuYXBwZW5kKE15U2Vjb25kTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLnNDb21wb25lbnROYW1lKS5hcHBlbmQoIjoiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzZXJ2aWNlc1RvRW5hYmxlLmVxdWFscyhlbmFibGVkU2VydmljZXMpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBTZXR0aW5ncy5TZWN1cmUucHV0U3RyaW5nKGNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCksCisgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLkVOQUJMRURfQUNDRVNTSUJJTElUWV9TRVJWSUNFUywgc2VydmljZXNUb0VuYWJsZS50b1N0cmluZygpKTsKKworICAgICAgICAvLyB3ZSBoYXZlIGVuYWJsZWQgdGhlIHNlcnZpY2VzIG9mIGludGVyZXN0IGFuZCBuZWVkIHRvIHdhaXQgdW50aWwgdGhleQorICAgICAgICAvLyBhcmUgaW5zdGFudGlhdGVkIGFuZCBzdGFydGVkIChpZiBuZWVkZWQpIGFuZCB0aGUgc3lzdGVtIGJpbmRzIHRvIHRoZW0KKyAgICAgICAgYm9vbGVhbiBmaXJzdE1vY2tTZXJ2aWNlT0sgPSBmYWxzZTsKKyAgICAgICAgYm9vbGVhbiBzZWNvbmRNb2NrU2VydmljZU9LID0gZmFsc2U7CisgICAgICAgIGxvbmcgc3RhcnQgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKKyAgICAgICAgbG9uZyBwb2xsaW5nSW50ZXJ2YWwgPSBUSU1FT1VUX1NUQVJUX01PQ0tfQUNDRVNTSUJJTElUWV9TRVJWSUNFUyAvIDY7CisKKyAgICAgICAgd2hpbGUgKFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpIC0gc3RhcnQgPCBUSU1FT1VUX1NUQVJUX01PQ0tfQUNDRVNTSUJJTElUWV9TRVJWSUNFUykgIHsKKyAgICAgICAgICAgIGZpcnN0TW9ja1NlcnZpY2VPSyA9ICFmaXJzdE1vY2tTZXJ2aWNlRW5hYmxlZAorICAgICAgICAgICAgICAgICAgICB8fCAoTXlGaXJzdE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5zSW5zdGFuY2UgIT0gbnVsbAorICAgICAgICAgICAgICAgICAgICAmJiBNeUZpcnN0TW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLnNJbnN0YW5jZS5pc1N5c3RlbUJvdW5kQXNDbGllbnQoKSk7CisKKyAgICAgICAgICAgIHNlY29uZE1vY2tTZXJ2aWNlT0sgPSAhc2Vjb25kTW9ja1NlcnZpY2VFbmFibGVkCisgICAgICAgICAgICAgICAgICAgIHx8IChNeVNlY29uZE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5zSW5zdGFuY2UgIT0gbnVsbAorICAgICAgICAgICAgICAgICAgICAmJiBNeVNlY29uZE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5zSW5zdGFuY2UuaXNTeXN0ZW1Cb3VuZEFzQ2xpZW50KCkpOworCisgICAgICAgICAgICBpZiAoZmlyc3RNb2NrU2VydmljZU9LICYmIHNlY29uZE1vY2tTZXJ2aWNlT0spIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcChwb2xsaW5nSW50ZXJ2YWwpOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nQnVpbGRlciBtZXNzYWdlID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgbWVzc2FnZS5hcHBlbmQoIk1vY2sgYWNjZXNzaWJpbGl0eSBzZXJ2aWNlcyBub3Qgc3RhcnRlZCBvciBzeXN0ZW0gbm90IGJvdW5kIGFzIGEgY2xpZW50OiAiKTsKKyAgICAgICAgaWYgKCFmaXJzdE1vY2tTZXJ2aWNlT0spIHsKKyAgICAgICAgICAgIG1lc3NhZ2UuYXBwZW5kKE15Rmlyc3RNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2Uuc0NvbXBvbmVudE5hbWUpOworICAgICAgICAgICAgbWVzc2FnZS5hcHBlbmQoIiAiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXNlY29uZE1vY2tTZXJ2aWNlT0spIHsKKyAgICAgICAgICAgIG1lc3NhZ2UuYXBwZW5kKE15U2Vjb25kTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLnNDb21wb25lbnROYW1lKTsKKyAgICAgICAgfQorICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKG1lc3NhZ2UudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXNzZXJ0cyB0aGUgdGhlIG1vY2sgYWNjZXNzaWJpbGl0eSBzZXJ2aWNlIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSB2ZXJpZmllZAorICAgICAqICh3aGljaCBpcyBpdCBoYXMgcmVjZWl2ZWQgdGhlIGV4cGVjdGVkIG1ldGhvZCBjYWxscyB3aXRoIGV4cGVjdGVkCisgICAgICogYXJndW1lbnRzKSB3aXRoaW4gdGhlIHtAbGluayAjVElNRU9VVF9CSU5ERVJfQ0FMTH0uIFRoZSB2ZXJpZmllZCBzdGF0ZSBpcworICAgICAqIGNoZWNrZWQgYnkgcG9sbGluZyB1cG9uIHNtYWxsIGludGVydmFscy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIHZlcmlmeS4KKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiBJZiB0aGUgdmVyaWZpY2F0aW9uIGhhcyBmYWlsZWQgd2l0aCBleGNlcHRpb24gYWZ0ZXIgdGhlCisgICAgICogICAgICAgICAgICAge0BsaW5rICNUSU1FT1VUX0JJTkRFUl9DQUxMfS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgYXNzZXJ0TW9ja1NlcnZpY2VWZXJpZmllZFdpdGhpblRpbWVvdXQoTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlIHNlcnZpY2UpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgRXhjZXB0aW9uIGxhc3RWZXJpZnlFeGNlcHRpb24gPSBudWxsOworICAgICAgICBsb25nIGJlZ2luVGltZSA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOworICAgICAgICBsb25nIHBvbGxUbWVvdXQgPSBUSU1FT1VUX0JJTkRFUl9DQUxMIC8gNTsKKworICAgICAgICAvLyBwb2xsIHVudGlsIHRoZSB0aW1lb3V0IGhhcyBlbGFwc2VkCisgICAgICAgIHdoaWxlIChTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKSAtIGJlZ2luVGltZSA8IFRJTUVPVVRfQklOREVSX0NBTEwpIHsKKyAgICAgICAgICAgIC8vIHNsZWVwIGZpcnN0IHNpbmNlIGltbWVkaWF0ZSBjYWxsIHdpbGwgYWx3YXlzIGZhaWwKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKHBvbGxUbWVvdXQpOworICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKKyAgICAgICAgICAgICAgICAvKiBpZ25vcmUgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIHBvbGwgZm9yIHZlcmlmaWNhdGlvbiBhbmQgaWYgdGhpcyBmYWlscyBzYXZlIHRoZSBleGNlcHRpb24gYW5kCisgICAgICAgICAgICAvLyBrZWVwIHBvbGxpbmcKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgc2VydmljZS52ZXJpZnkoKTsKKyAgICAgICAgICAgICAgICAvLyByZXNldCBzbyBpdCBkb2VzIG5vdCBhY2NlcHQgbW9yZSBldmVudHMKKyAgICAgICAgICAgICAgICBzZXJ2aWNlLnJlc2V0KCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBsYXN0VmVyaWZ5RXhjZXB0aW9uID0gZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIHJlc2V0LCB3ZSBoYXZlIGFscmVhZHkgZmFpbGVkCisgICAgICAgIHNlcnZpY2UucmVzZXQoKTsKKworICAgICAgICAvLyBhbHdheXMgbm90IG51bGwKKyAgICAgICAgdGhyb3cgbGFzdFZlcmlmeUV4Y2VwdGlvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGNsYXNzIGlzIHRoZSBmaXJzdCBtb2NrIHtAbGluayBBY2Nlc3NpYmlsaXR5U2VydmljZX0uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeUZpcnN0TW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlIGV4dGVuZHMgTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlIHsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHNlcnZpY2Uge0BsaW5rIENvbXBvbmVudE5hbWV9IGZsYXR0ZW5lZCBhcyBhIHN0cmluZy4KKyAgICAgICAgICovCisgICAgICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgc0NvbXBvbmVudE5hbWUgPSBuZXcgQ29tcG9uZW50TmFtZSgKKyAgICAgICAgICAgICAgICBzUGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgTXlGaXJzdE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5jbGFzcy5nZXROYW1lKCkKKyAgICAgICAgICAgICAgICApLmZsYXR0ZW5Ub1Nob3J0U3RyaW5nKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEhhbmRsZSB0byB0aGUgc2VydmljZSBpbnN0YW5jZS4KKyAgICAgICAgICovCisgICAgICAgIHN0YXRpYyBNeUZpcnN0TW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlIHNJbnN0YW5jZTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBNeUZpcnN0TW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlKCkgeworICAgICAgICAgICAgc0luc3RhbmNlID0gdGhpczsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgY2xhc3MgaXMgdGhlIGZpcnN0IG1vY2sge0BsaW5rIEFjY2Vzc2liaWxpdHlTZXJ2aWNlfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15U2Vjb25kTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlIGV4dGVuZHMgTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlIHsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHNlcnZpY2Uge0BsaW5rIENvbXBvbmVudE5hbWV9IGZsYXR0ZW5lZCBhcyBhIHN0cmluZy4KKyAgICAgICAgICovCisgICAgICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgc0NvbXBvbmVudE5hbWUgPSBuZXcgQ29tcG9uZW50TmFtZSgKKyAgICAgICAgICAgICAgICBzUGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgTXlTZWNvbmRNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2UuY2xhc3MuZ2V0TmFtZSgpCisgICAgICAgICAgICAgICAgKS5mbGF0dGVuVG9TaG9ydFN0cmluZygpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBIYW5kbGUgdG8gdGhlIHNlcnZpY2UgaW5zdGFuY2UuCisgICAgICAgICAqLworICAgICAgICBzdGF0aWMgTXlTZWNvbmRNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2Ugc0luc3RhbmNlOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIE15U2Vjb25kTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlKCkgeworICAgICAgICAgICAgc0luc3RhbmNlID0gdGhpczsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3Rlc3RzL3NlcnZpY2VzdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9BY2Nlc3NpYmlsaXR5TWFuYWdlclRlc3QuamF2YSBiL3NlcnZpY2VzL3Rlc3RzL3NlcnZpY2VzdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9BY2Nlc3NpYmlsaXR5TWFuYWdlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGZlZDIyCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvdGVzdHMvc2VydmljZXN0ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL0FjY2Vzc2liaWxpdHlNYW5hZ2VyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjU3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5zZXJ2ZXI7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmVhc3ltb2NrLkVhc3lNb2NrLmNyZWF0ZVN0cmljdE1vY2s7CitpbXBvcnQgc3RhdGljIG9yZy5lYXN5bW9jay5FYXN5TW9jay5leHBlY3Q7CitpbXBvcnQgc3RhdGljIG9yZy5lYXN5bW9jay5FYXN5TW9jay5yZXBsYXk7CitpbXBvcnQgc3RhdGljIG9yZy5lYXN5bW9jay5FYXN5TW9jay5yZXBvcnRNYXRjaGVyOworaW1wb3J0IHN0YXRpYyBvcmcuZWFzeW1vY2suRWFzeU1vY2sucmVzZXQ7CitpbXBvcnQgc3RhdGljIG9yZy5lYXN5bW9jay5FYXN5TW9jay52ZXJpZnk7CisKK2ltcG9ydCBvcmcuZWFzeW1vY2suSUFyZ3VtZW50TWF0Y2hlcjsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5TZXJ2aWNlSW5mbzsKK2ltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOworaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5MYXJnZVRlc3Q7CitpbXBvcnQgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5hbm5vdGF0aW9uLk1lZGl1bVRlc3Q7CitpbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eUV2ZW50OworaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LklBY2Nlc3NpYmlsaXR5TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5JQWNjZXNzaWJpbGl0eU1hbmFnZXJDbGllbnQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIFRlc3RzIGZvciB0aGUgQWNjZXNzaWJpbGl0eU1hbmFnZXIgd2hpY2ggbW9ja2luZyB0aGUgYmFja2luZyBzZXJ2aWNlLgorICovCitwdWJsaWMgY2xhc3MgQWNjZXNzaWJpbGl0eU1hbmFnZXJUZXN0IGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlIHsKKworICAgIC8qKgorICAgICAqIFRpbWVvdXQgcmVxdWlyZWQgZm9yIHBlbmRpbmcgQmluZGVyIGNhbGxzIG9yIGV2ZW50IHByb2Nlc3NpbmcgdG8KKyAgICAgKiBjb21wbGV0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgVElNRU9VVF9CSU5ERVJfQ0FMTCA9IDUwOworCisgICAgLyoqCisgICAgICogVGhlIHJldXNhYmxlIG1vY2sge0BsaW5rIElBY2Nlc3NpYmlsaXR5TWFuYWdlcn0uCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBJQWNjZXNzaWJpbGl0eU1hbmFnZXIgbU1vY2tTZXJ2aWNlSW50ZXJmYWNlID0KKyAgICAgICAgY3JlYXRlU3RyaWN0TW9jayhJQWNjZXNzaWJpbGl0eU1hbmFnZXIuY2xhc3MpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgcmVzZXQobU1vY2tTZXJ2aWNlSW50ZXJmYWNlKTsKKyAgICB9CisKKyAgICBATWVkaXVtVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRBY2Nlc3NpYmlsaXR5U2VydmljZUxpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gY3JlYXRlIGEgbGlzdCBvZiBpbnN0YWxsZWQgYWNjZXNzaWJpbGl0eSBzZXJ2aWNlcyB0aGUgbW9jayBzZXJ2aWNlIHJldHVybnMKKyAgICAgICAgTGlzdDxTZXJ2aWNlSW5mbz4gZXhwZWN0ZWRTZXJ2aWNlcyA9IG5ldyBBcnJheUxpc3Q8U2VydmljZUluZm8+KCk7CisgICAgICAgIFNlcnZpY2VJbmZvIHNlcnZpY2VJbmZvID0gbmV3IFNlcnZpY2VJbmZvKCk7CisgICAgICAgIHNlcnZpY2VJbmZvLm5hbWUgPSAiVGVzdFNlcnZpY2VJbmZvTmFtZSI7CisgICAgICAgIGV4cGVjdGVkU2VydmljZXMuYWRkKHNlcnZpY2VJbmZvKTsKKworICAgICAgICAvLyBjb25maWd1cmUgdGhlIG1vY2sgc2VydmljZSBiZWhhdmlvcgorICAgICAgICBJQWNjZXNzaWJpbGl0eU1hbmFnZXIgbW9ja1NlcnZpY2VJbnRlcmZhY2UgPSBtTW9ja1NlcnZpY2VJbnRlcmZhY2U7CisgICAgICAgIGV4cGVjdChtb2NrU2VydmljZUludGVyZmFjZS5hZGRDbGllbnQoYW55SUFjY2Vzc2liaWxpdHlNYW5hZ2VyQ2xpZW50KCkpKS5hbmRSZXR1cm4odHJ1ZSk7CisgICAgICAgIGV4cGVjdChtb2NrU2VydmljZUludGVyZmFjZS5nZXRBY2Nlc3NpYmlsaXR5U2VydmljZUxpc3QoKSkuYW5kUmV0dXJuKGV4cGVjdGVkU2VydmljZXMpOworICAgICAgICByZXBsYXkobW9ja1NlcnZpY2VJbnRlcmZhY2UpOworCisgICAgICAgIC8vIGludm9rZSB0aGUgbWV0aG9kIHVuZGVyIHRlc3QKKyAgICAgICAgQWNjZXNzaWJpbGl0eU1hbmFnZXIgbWFuYWdlciA9IG5ldyBBY2Nlc3NpYmlsaXR5TWFuYWdlcihtQ29udGV4dCwgbW9ja1NlcnZpY2VJbnRlcmZhY2UpOworICAgICAgICBMaXN0PFNlcnZpY2VJbmZvPiByZWNlaXZlZFNlcnZpY2VzID0gbWFuYWdlci5nZXRBY2Nlc3NpYmlsaXR5U2VydmljZUxpc3QoKTsKKworICAgICAgICAvLyBjaGVjayBleHBlY3RlZCByZXN1bHQgKGxpc3QgZXF1YWxzKCkgY29tcGFyZXMgaXQgY29udGVudHMgYXMgd2VsbCkKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJBbGwgZXhwZWN0ZWQgc2VydmljZXMgbXVzdCBiZSByZXR1cm5lZCIsIHJlY2VpdmVkU2VydmljZXMsIGV4cGVjdGVkU2VydmljZXMpOworCisgICAgICAgIC8vIHZlcmlmeSB0aGUgbW9jayBzZXJ2aWNlIHdhcyBwcm9wZXJseSBjYWxsZWQKKyAgICAgICAgdmVyaWZ5KG1vY2tTZXJ2aWNlSW50ZXJmYWNlKTsKKyAgICB9CisKKyAgICBATWVkaXVtVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbnRlcnJ1cHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gY29uZmlndXJlIHRoZSBtb2NrIHNlcnZpY2UgYmVoYXZpb3IKKyAgICAgICAgSUFjY2Vzc2liaWxpdHlNYW5hZ2VyIG1vY2tTZXJ2aWNlSW50ZXJmYWNlID0gbU1vY2tTZXJ2aWNlSW50ZXJmYWNlOworICAgICAgICBleHBlY3QobW9ja1NlcnZpY2VJbnRlcmZhY2UuYWRkQ2xpZW50KGFueUlBY2Nlc3NpYmlsaXR5TWFuYWdlckNsaWVudCgpKSkuYW5kUmV0dXJuKHRydWUpOworICAgICAgICBtb2NrU2VydmljZUludGVyZmFjZS5pbnRlcnJ1cHQoKTsKKyAgICAgICAgcmVwbGF5KG1vY2tTZXJ2aWNlSW50ZXJmYWNlKTsKKworICAgICAgICAvLyBpbnZva2UgdGhlIG1ldGhvZCB1bmRlciB0ZXN0CisgICAgICAgIEFjY2Vzc2liaWxpdHlNYW5hZ2VyIG1hbmFnZXIgPSBuZXcgQWNjZXNzaWJpbGl0eU1hbmFnZXIobUNvbnRleHQsIG1vY2tTZXJ2aWNlSW50ZXJmYWNlKTsKKyAgICAgICAgbWFuYWdlci5pbnRlcnJ1cHQoKTsKKworICAgICAgICAvLyB2ZXJpZnkgdGhlIG1vY2sgc2VydmljZSB3YXMgcHJvcGVybHkgY2FsbGVkCisgICAgICAgIHZlcmlmeShtb2NrU2VydmljZUludGVyZmFjZSk7CisgICAgfQorCisgICAgQExhcmdlVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJc0VuYWJsZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gY29uZmlndXJlIHRoZSBtb2NrIHNlcnZpY2UgYmVoYXZpb3IKKyAgICAgICAgSUFjY2Vzc2liaWxpdHlNYW5hZ2VyIG1vY2tTZXJ2aWNlSW50ZXJmYWNlID0gbU1vY2tTZXJ2aWNlSW50ZXJmYWNlOworICAgICAgICBleHBlY3QobW9ja1NlcnZpY2VJbnRlcmZhY2UuYWRkQ2xpZW50KGFueUlBY2Nlc3NpYmlsaXR5TWFuYWdlckNsaWVudCgpKSkuYW5kUmV0dXJuKHRydWUpOworICAgICAgICByZXBsYXkobW9ja1NlcnZpY2VJbnRlcmZhY2UpOworCisgICAgICAgIC8vIGludm9rZSB0aGUgbWV0aG9kIHVuZGVyIHRlc3QKKyAgICAgICAgQWNjZXNzaWJpbGl0eU1hbmFnZXIgbWFuYWdlciA9IG5ldyBBY2Nlc3NpYmlsaXR5TWFuYWdlcihtQ29udGV4dCwgbW9ja1NlcnZpY2VJbnRlcmZhY2UpOworICAgICAgICBib29sZWFuIGlzRW5hYmxlZFNlcnZpY2VFbmFibGVkID0gbWFuYWdlci5pc0VuYWJsZWQoKTsKKworICAgICAgICAvLyBjaGVjayBleHBlY3RlZCByZXN1bHQKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiTXVzdCBiZSBlbmFibGVkIHNpbmNlIHRoZSBtb2NrIHNlcnZpY2UgaXMgZW5hYmxlZCIsIGlzRW5hYmxlZFNlcnZpY2VFbmFibGVkKTsKKworICAgICAgICAvLyBkaXNhYmxlIGFjY2Vzc2liaWxpdHkKKyAgICAgICAgbWFuYWdlci5nZXRDbGllbnQoKS5zZXRFbmFibGVkKGZhbHNlKTsKKworICAgICAgICAvLyB3YWl0IGZvciB0aGUgYXN5bmNocm9ub3VzIElCaW5kZXIgY2FsbCB0byBjb21wbGV0ZQorICAgICAgICBUaHJlYWQuc2xlZXAoVElNRU9VVF9CSU5ERVJfQ0FMTCk7CisKKyAgICAgICAgLy8gaW52b2tlIHRoZSBtZXRob2QgdW5kZXIgdGVzdAorICAgICAgICBib29sZWFuIGlzRW5hYmxlZFNlcnZjaWVEaXNhYmxlZCA9IG1hbmFnZXIuaXNFbmFibGVkKCk7CisKKyAgICAgICAgLy8gY2hlY2sgZXhwZWN0ZWQgcmVzdWx0CisgICAgICAgIGFzc2VydEZhbHNlKCJNdXN0IGJlIGRpc2FibGVkIHNpbmNlIHRoZSBtb2NrIHNlcnZpY2UgaXMgZGlzYWJsZWQiLAorICAgICAgICAgICAgICAgIGlzRW5hYmxlZFNlcnZjaWVEaXNhYmxlZCk7CisKKyAgICAgICAgLy8gdmVyaWZ5IHRoZSBtb2NrIHNlcnZpY2Ugd2FzIHByb3Blcmx5IGNhbGxlZAorICAgICAgICB2ZXJpZnkobW9ja1NlcnZpY2VJbnRlcmZhY2UpOworICAgIH0KKworICAgIEBNZWRpdW1UZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNlbmRBY2Nlc3NpYmlsaXR5RXZlbnRfQWNjZXNzaWJpbGl0eUVuYWJsZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gY3JlYXRlIGFuIGV2ZW50IHRvIGJlIGRpc3BhdGNoZWQKKyAgICAgICAgQWNjZXNzaWJpbGl0eUV2ZW50IHNlbnRFdmVudCA9IEFjY2Vzc2liaWxpdHlFdmVudC5vYnRhaW4oKTsKKworICAgICAgICAvLyBjb25maWd1cmUgdGhlIG1vY2sgc2VydmljZSBiZWhhdmlvcgorICAgICAgICBJQWNjZXNzaWJpbGl0eU1hbmFnZXIgbW9ja1NlcnZpY2VJbnRlcmZhY2UgPSBtTW9ja1NlcnZpY2VJbnRlcmZhY2U7CisgICAgICAgIGV4cGVjdChtb2NrU2VydmljZUludGVyZmFjZS5hZGRDbGllbnQoYW55SUFjY2Vzc2liaWxpdHlNYW5hZ2VyQ2xpZW50KCkpKS5hbmRSZXR1cm4odHJ1ZSk7CisgICAgICAgIGV4cGVjdChtb2NrU2VydmljZUludGVyZmFjZS5zZW5kQWNjZXNzaWJpbGl0eUV2ZW50KGVxQWNjZXNzaWJpbGl0eUV2ZW50KHNlbnRFdmVudCkpKQorICAgICAgICAgICAgICAgIC5hbmRSZXR1cm4odHJ1ZSk7CisgICAgICAgIGV4cGVjdChtb2NrU2VydmljZUludGVyZmFjZS5zZW5kQWNjZXNzaWJpbGl0eUV2ZW50KGVxQWNjZXNzaWJpbGl0eUV2ZW50KHNlbnRFdmVudCkpKQorICAgICAgICAgICAgICAgIC5hbmRSZXR1cm4oZmFsc2UpOworICAgICAgICByZXBsYXkobW9ja1NlcnZpY2VJbnRlcmZhY2UpOworCisgICAgICAgIC8vIGludm9rZSB0aGUgbWV0aG9kIHVuZGVyIHRlc3QgKG1hbmFnZXIgYW5kIHNlcnZpY2UgaW4gZGlmZmVyZW50IHByb2Nlc3NlcykKKyAgICAgICAgQWNjZXNzaWJpbGl0eU1hbmFnZXIgbWFuYWdlciA9IG5ldyBBY2Nlc3NpYmlsaXR5TWFuYWdlcihtQ29udGV4dCwgbW9ja1NlcnZpY2VJbnRlcmZhY2UpOworICAgICAgICBtYW5hZ2VyLnNlbmRBY2Nlc3NpYmlsaXR5RXZlbnQoc2VudEV2ZW50KTsKKworICAgICAgICAvLyBjaGVjayBleHBlY3RlZCByZXN1bHQKKyAgICAgICAgQWNjZXNzaWJpbGl0eUV2ZW50IG5leHRFdmVudERpZmZlcmVudFByb2Nlc3NlcyA9IEFjY2Vzc2liaWxpdHlFdmVudC5vYnRhaW4oKTsKKyAgICAgICAgYXNzZXJ0U2FtZSgiVGhlIG1hbmFnZXIgYW5kIHRoZSBzZXJ2aWNlIGFyZSBpbiBkaWZmZXJlbnQgcHJvY2Vzc2VzLCBzbyB0aGUgZXZlbnQgbXVzdCBiZSAiICsKKyAgICAgICAgICAgICAgICAicmVjeWNsZWQiLCBzZW50RXZlbnQsIG5leHRFdmVudERpZmZlcmVudFByb2Nlc3Nlcyk7CisKKyAgICAgICAgLy8gaW52b2tlIHRoZSBtZXRob2QgdW5kZXIgdGVzdCAobWFuYWdlciBhbmQgc2VydmljZSBpbiB0aGUgc2FtZSBwcm9jZXNzKQorICAgICAgICBtYW5hZ2VyLnNlbmRBY2Nlc3NpYmlsaXR5RXZlbnQoc2VudEV2ZW50KTsKKworICAgICAgICAvLyBjaGVjayBleHBlY3RlZCByZXN1bHQKKyAgICAgICAgQWNjZXNzaWJpbGl0eUV2ZW50IG5leHRFdmVudFNhbWVQcm9jZXNzID0gQWNjZXNzaWJpbGl0eUV2ZW50Lm9idGFpbigpOworICAgICAgICBhc3NlcnROb3RTYW1lKCJUaGUgbWFuYWdlciBhbmQgdGhlIHNlcnZpY2UgYXJlIGluIHRoZSBzYW1lIHByb2Nlc3MsIHNvIHRoZSBldmVudCBtdXN0IG5vdCIgKworICAgICAgICAgICAgICAgICJiZSByZWN5Y2xlZCIsIHNlbnRFdmVudCwgbmV4dEV2ZW50U2FtZVByb2Nlc3MpOworCisgICAgICAgIC8vIHZlcmlmeSB0aGUgbW9jayBzZXJ2aWNlIHdhcyBwcm9wZXJseSBjYWxsZWQKKyAgICAgICAgdmVyaWZ5KG1vY2tTZXJ2aWNlSW50ZXJmYWNlKTsKKyAgICB9CisKKyAgICBATWVkaXVtVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZW5kQWNjZXNzaWJpbGl0eUV2ZW50X0FjY2Vzc2liaWxpdHlEaXNhYmxlZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBjcmVhdGUgYW4gZXZlbnQgdG8gYmUgZGlzcGF0Y2hlZAorICAgICAgICBBY2Nlc3NpYmlsaXR5RXZlbnQgc2VudEV2ZW50ID0gQWNjZXNzaWJpbGl0eUV2ZW50Lm9idGFpbigpOworCisgICAgICAgIC8vIGNvbmZpZ3VyZSB0aGUgbW9jayBzZXJ2aWNlIGJlaGF2aW9yCisgICAgICAgIElBY2Nlc3NpYmlsaXR5TWFuYWdlciBtb2NrU2VydmljZUludGVyZmFjZSA9IG1Nb2NrU2VydmljZUludGVyZmFjZTsKKyAgICAgICAgZXhwZWN0KG1vY2tTZXJ2aWNlSW50ZXJmYWNlLmFkZENsaWVudChhbnlJQWNjZXNzaWJpbGl0eU1hbmFnZXJDbGllbnQoKSkpLmFuZFJldHVybihmYWxzZSk7CisgICAgICAgIHJlcGxheShtb2NrU2VydmljZUludGVyZmFjZSk7CisKKyAgICAgICAgLy8gaW52b2tlIHRoZSBtZXRob2QgdW5kZXIgdGVzdCAoYWNjZXNzaWJpbGl0eSBkaXNhYmxlZCkKKyAgICAgICAgQWNjZXNzaWJpbGl0eU1hbmFnZXIgbWFuYWdlciA9IG5ldyBBY2Nlc3NpYmlsaXR5TWFuYWdlcihtQ29udGV4dCwgbW9ja1NlcnZpY2VJbnRlcmZhY2UpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgbWFuYWdlci5zZW5kQWNjZXNzaWJpbGl0eUV2ZW50KHNlbnRFdmVudCk7CisgICAgICAgICAgICBmYWlsKCJObyBhY2Nlc3NpYmlsaXR5IGV2ZW50cyBhcmUgc2VudCBpZiBhY2Nlc3NpYmlsaXR5IGlzIGRpc2FibGVkIik7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpc2UpIHsKKyAgICAgICAgICAgIC8vIGNoZWNrIGV4cGVjdGVkIHJlc3VsdAorICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJBY2Nlc3NpYmlsaXR5IG9mZi4gRGlkIHlvdSBmb3JnZXQgdG8gY2hlY2sgdGhhdD8iLCBpc2UuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHZlcmlmeSB0aGUgbW9jayBzZXJ2aWNlIHdhcyBwcm9wZXJseSBjYWxsZWQKKyAgICAgICAgdmVyaWZ5KG1vY2tTZXJ2aWNlSW50ZXJmYWNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZXRlcm1pbmVzIGlmIGFuIHtAbGluayBBY2Nlc3NpYmlsaXR5RXZlbnR9IHBhc3NlZCBhcyBhIG1ldGhvZCBhcmd1bWVudAorICAgICAqIG1hdGNoZXMgZXhwZWN0YXRpb25zLgorICAgICAqCisgICAgICogQHBhcmFtIG1hdGNoZWQgVGhlIGV2ZW50IHRvIGNoZWNrLgorICAgICAqIEByZXR1cm4gVHJ1ZSBpZiBleHBlY3RhdGlvbnMgYXJlIG1hdGNoZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgQWNjZXNzaWJpbGl0eUV2ZW50IGVxQWNjZXNzaWJpbGl0eUV2ZW50KEFjY2Vzc2liaWxpdHlFdmVudCBtYXRjaGVkKSB7CisgICAgICAgIHJlcG9ydE1hdGNoZXIobmV3IEFjY2Vzc2liaWxpdHlFdmVudE1hdGhlcihtYXRjaGVkKSk7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIERldGVybWluZXMgaWYgYW4ge0BsaW5rIElBY2Nlc3NpYmlsaXR5TWFuYWdlckNsaWVudH0gcGFzc2VkIGFzIGEgbWV0aG9kIGFyZ3VtZW50CisgICAgICogbWF0Y2hlcyBleHBlY3RhdGlvbnMgd2hpY2ggaW4gdGhpcyBjYXNlIGFyZSB0aGF0IGFueSBpbnN0YW5jZSBpcyBhY2NlcHRlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgSUFjY2Vzc2liaWxpdHlNYW5hZ2VyQ2xpZW50IGFueUlBY2Nlc3NpYmlsaXR5TWFuYWdlckNsaWVudCgpIHsKKyAgICAgICAgcmVwb3J0TWF0Y2hlcihuZXcgQW55SUFjY2Vzc2liaWxpdHlNYW5hZ2VyQ2xpZW50TWF0aGVyKCkpOworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNYXRjaGVyIGZvciB7QGxpbmsgQWNjZXNzaWJpbGl0eUV2ZW50fXMuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQWNjZXNzaWJpbGl0eUV2ZW50TWF0aGVyIGltcGxlbWVudHMgSUFyZ3VtZW50TWF0Y2hlciB7CisgICAgICAgIHByaXZhdGUgQWNjZXNzaWJpbGl0eUV2ZW50IG1FeHBlY3RlZEV2ZW50OworCisgICAgICAgIHB1YmxpYyBBY2Nlc3NpYmlsaXR5RXZlbnRNYXRoZXIoQWNjZXNzaWJpbGl0eUV2ZW50IGV4cGVjdGVkRXZlbnQpIHsKKyAgICAgICAgICAgIG1FeHBlY3RlZEV2ZW50ID0gZXhwZWN0ZWRFdmVudDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIG1hdGNoZXMoT2JqZWN0IG1hdGNoZWQpIHsKKyAgICAgICAgICAgIGlmICghKG1hdGNoZWQgaW5zdGFuY2VvZiBBY2Nlc3NpYmlsaXR5RXZlbnQpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQWNjZXNzaWJpbGl0eUV2ZW50IHJlY2VpdmVkRXZlbnQgPSAoQWNjZXNzaWJpbGl0eUV2ZW50KSBtYXRjaGVkOworICAgICAgICAgICAgcmV0dXJuIG1FeHBlY3RlZEV2ZW50LmdldEV2ZW50VHlwZSgpID09IHJlY2VpdmVkRXZlbnQuZ2V0RXZlbnRUeXBlKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBhcHBlbmRUbyhTdHJpbmdCdWZmZXIgYnVmZmVyKSB7CisgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCJzZW5kQWNjZXNzaWJpbGl0eUV2ZW50KCkiKTsKKyAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIiB3aXRoIGV2ZW50IHR5cGUgXCIiKTsKKyAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQobUV4cGVjdGVkRXZlbnQuZ2V0RXZlbnRUeXBlKCkpOworICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiXCIiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIE1hdGNoZXIgZm9yIHtAbGluayBJQWNjZXNzaWJpbGl0eU1hbmFnZXJDbGllbnR9cy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBBbnlJQWNjZXNzaWJpbGl0eU1hbmFnZXJDbGllbnRNYXRoZXIgaW1wbGVtZW50cyBJQXJndW1lbnRNYXRjaGVyIHsKKyAgICAgICAgcHVibGljIGJvb2xlYW4gbWF0Y2hlcyhPYmplY3QgbWF0Y2hlZCkgeworICAgICAgICAgICAgaWYgKCEobWF0Y2hlZCBpbnN0YW5jZW9mIElBY2Nlc3NpYmlsaXR5TWFuYWdlckNsaWVudCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGFwcGVuZFRvKFN0cmluZ0J1ZmZlciBidWZmZXIpIHsKKyAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoImFkZENsaWVudCgpIHdpdGggYW55IElBY2Nlc3NpYmlsaXR5TWFuYWdlckNsaWVudCIpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdGVzdHMvc2VydmljZXN0ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL0NvdW50cnlEZXRlY3RvclNlcnZpY2VUZXN0LmphdmEgYi9zZXJ2aWNlcy90ZXN0cy9zZXJ2aWNlc3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvQ291bnRyeURldGVjdG9yU2VydmljZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2ExNTg1Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvdGVzdHMvc2VydmljZXN0ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL0NvdW50cnlEZXRlY3RvclNlcnZpY2VUZXN0LmphdmEKQEAgLTAsMCArMSwxMDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc2VydmVyOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5sb2NhdGlvbi5Db3VudHJ5OworaW1wb3J0IGFuZHJvaWQubG9jYXRpb24uQ291bnRyeUxpc3RlbmVyOworaW1wb3J0IGFuZHJvaWQubG9jYXRpb24uSUNvdW50cnlMaXN0ZW5lcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOworCitwdWJsaWMgY2xhc3MgQ291bnRyeURldGVjdG9yU2VydmljZVRlc3QgZXh0ZW5kcyBBbmRyb2lkVGVzdENhc2UgeworICAgIHByaXZhdGUgY2xhc3MgQ291bnRyeUxpc3RlbmVyVGVzdGVyIGV4dGVuZHMgSUNvdW50cnlMaXN0ZW5lci5TdHViIHsKKyAgICAgICAgcHJpdmF0ZSBDb3VudHJ5IG1Db3VudHJ5OworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkNvdW50cnlEZXRlY3RlZChDb3VudHJ5IGNvdW50cnkpIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgICAgICAgICAgbUNvdW50cnkgPSBjb3VudHJ5OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIENvdW50cnkgZ2V0Q291bnRyeSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtQ291bnRyeTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzTm90aWZpZWQoKSB7CisgICAgICAgICAgICByZXR1cm4gbUNvdW50cnkgIT0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgQ291bnRyeURldGVjdG9yU2VydmljZVRlc3RlciBleHRlbmRzIENvdW50cnlEZXRlY3RvclNlcnZpY2UgeworCisgICAgICAgIHByaXZhdGUgQ291bnRyeUxpc3RlbmVyIG1MaXN0ZW5lcjsKKworICAgICAgICBwdWJsaWMgQ291bnRyeURldGVjdG9yU2VydmljZVRlc3RlcihDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgICAgIHN1cGVyKGNvbnRleHQpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG5vdGlmeVJlY2VpdmVycyhDb3VudHJ5IGNvdW50cnkpIHsKKyAgICAgICAgICAgIHN1cGVyLm5vdGlmeVJlY2VpdmVycyhjb3VudHJ5KTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBzZXRDb3VudHJ5TGlzdGVuZXIoZmluYWwgQ291bnRyeUxpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgICAgICBtTGlzdGVuZXIgPSBsaXN0ZW5lcjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzTGlzdGVuZXJTZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gbUxpc3RlbmVyICE9IG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlTGlzdGVuZXIoKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICAgICAgQ291bnRyeURldGVjdG9yU2VydmljZVRlc3RlciBzZXJ2aWNlVGVzdGVyID0gbmV3IENvdW50cnlEZXRlY3RvclNlcnZpY2VUZXN0ZXIoZ2V0Q29udGV4dCgpKTsKKyAgICAgICAgc2VydmljZVRlc3Rlci5zeXN0ZW1SZWFkeSgpOworICAgICAgICB3YWl0Rm9yU3lzdGVtUmVhZHkoc2VydmljZVRlc3Rlcik7CisgICAgICAgIENvdW50cnlMaXN0ZW5lclRlc3RlciBsaXN0ZW5lclRlc3RlciA9IG5ldyBDb3VudHJ5TGlzdGVuZXJUZXN0ZXIoKTsKKyAgICAgICAgc2VydmljZVRlc3Rlci5hZGRDb3VudHJ5TGlzdGVuZXIobGlzdGVuZXJUZXN0ZXIpOworICAgICAgICBhc3NlcnRUcnVlKHNlcnZpY2VUZXN0ZXIuaXNMaXN0ZW5lclNldCgpKTsKKyAgICAgICAgc2VydmljZVRlc3Rlci5yZW1vdmVDb3VudHJ5TGlzdGVuZXIobGlzdGVuZXJUZXN0ZXIpOworICAgICAgICBhc3NlcnRGYWxzZShzZXJ2aWNlVGVzdGVyLmlzTGlzdGVuZXJTZXQoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE5vdGlmeUxpc3RlbmVycygpIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgICAgICBDb3VudHJ5RGV0ZWN0b3JTZXJ2aWNlVGVzdGVyIHNlcnZpY2VUZXN0ZXIgPSBuZXcgQ291bnRyeURldGVjdG9yU2VydmljZVRlc3RlcihnZXRDb250ZXh0KCkpOworICAgICAgICBDb3VudHJ5TGlzdGVuZXJUZXN0ZXIgbGlzdGVuZXJUZXN0ZXJBID0gbmV3IENvdW50cnlMaXN0ZW5lclRlc3RlcigpOworICAgICAgICBDb3VudHJ5TGlzdGVuZXJUZXN0ZXIgbGlzdGVuZXJUZXN0ZXJCID0gbmV3IENvdW50cnlMaXN0ZW5lclRlc3RlcigpOworICAgICAgICBDb3VudHJ5IGNvdW50cnkgPSBuZXcgQ291bnRyeSgiVVMiLCBDb3VudHJ5LkNPVU5UUllfU09VUkNFX05FVFdPUkspOworICAgICAgICBzZXJ2aWNlVGVzdGVyLnN5c3RlbVJlYWR5KCk7CisgICAgICAgIHdhaXRGb3JTeXN0ZW1SZWFkeShzZXJ2aWNlVGVzdGVyKTsKKyAgICAgICAgc2VydmljZVRlc3Rlci5hZGRDb3VudHJ5TGlzdGVuZXIobGlzdGVuZXJUZXN0ZXJBKTsKKyAgICAgICAgc2VydmljZVRlc3Rlci5hZGRDb3VudHJ5TGlzdGVuZXIobGlzdGVuZXJUZXN0ZXJCKTsKKyAgICAgICAgc2VydmljZVRlc3Rlci5ub3RpZnlSZWNlaXZlcnMoY291bnRyeSk7CisgICAgICAgIGFzc2VydFRydWUoc2VydmljZVRlc3Rlci5pc0xpc3RlbmVyU2V0KCkpOworICAgICAgICBhc3NlcnRUcnVlKGxpc3RlbmVyVGVzdGVyQS5pc05vdGlmaWVkKCkpOworICAgICAgICBhc3NlcnRUcnVlKGxpc3RlbmVyVGVzdGVyQi5pc05vdGlmaWVkKCkpOworICAgICAgICBzZXJ2aWNlVGVzdGVyLnJlbW92ZUNvdW50cnlMaXN0ZW5lcihsaXN0ZW5lclRlc3RlckEpOworICAgICAgICBzZXJ2aWNlVGVzdGVyLnJlbW92ZUNvdW50cnlMaXN0ZW5lcihsaXN0ZW5lclRlc3RlckIpOworICAgICAgICBhc3NlcnRGYWxzZShzZXJ2aWNlVGVzdGVyLmlzTGlzdGVuZXJTZXQoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHdhaXRGb3JTeXN0ZW1SZWFkeShDb3VudHJ5RGV0ZWN0b3JTZXJ2aWNlIHNlcnZpY2UpIHsKKyAgICAgICAgaW50IGNvdW50ID0gNTsKKyAgICAgICAgd2hpbGUgKGNvdW50LS0gPiAwKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCg1MDApOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzZXJ2aWNlLmlzU3lzdGVtUmVhZHkoKSkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiV2FpdCBTeXN0ZW0gUmVhZHkgdGltZW91dCIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3Rlc3RzL3NlcnZpY2VzdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9Nb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2UuamF2YSBiL3NlcnZpY2VzL3Rlc3RzL3NlcnZpY2VzdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9Nb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYmM5Yjg2Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvdGVzdHMvc2VydmljZXN0ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL01vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5qYXZhCkBAIC0wLDAgKzEsMjU2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5zZXJ2ZXI7CisKK2ltcG9ydCBhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLkFjY2Vzc2liaWxpdHlTZXJ2aWNlOworaW1wb3J0IGFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOworaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlFdmVudDsKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuUXVldWU7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKKy8qKgorICogVGhpcyBpcyB0aGUgYmFzZSBjbGFzcyBmb3IgbW9jayB7QGxpbmsgQWNjZXNzaWJpbGl0eVNlcnZpY2V9cy4KKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZSBleHRlbmRzIEFjY2Vzc2liaWxpdHlTZXJ2aWNlIHsKKworICAgIC8qKgorICAgICAqIFRoZSBldmVudCB0aGlzIHNlcnZpY2UgZXhwZWN0cyB0byByZWNlaXZlLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgUXVldWU8QWNjZXNzaWJpbGl0eUV2ZW50PiBtRXhwZWN0ZWRFdmVudHMgPSBuZXcgTGlua2VkTGlzdDxBY2Nlc3NpYmlsaXR5RXZlbnQ+KCk7CisKKyAgICAvKioKKyAgICAgKiBJbnRlcnJ1cHRpb24gY2FsbCB0aGlzIHNlcnZpY2UgZXhwZWN0cyB0byByZWNlaXZlLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBtRXhwZWN0ZWRJbnRlcnJ1cHQ7CisKKyAgICAvKioKKyAgICAgKiBGbGFnIGlmIHRoZSBtb2NrIGlzIGN1cnJlbnRseSByZXBsYXlpbmcuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIG1SZXBsYXlpbmc7CisKKyAgICAvKioKKyAgICAgKiBGbGFnIGlmIHRoZSBzeXN0ZW0gaXMgYm91bmQgYXMgYSBjbGllbnQgdG8gdGhpcyBzZXJ2aWNlLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBtSXNTeXN0ZW1Cb3VuZEFzQ2xpZW50OworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhbiB7QGxpbmsgQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvfSBwb3B1bGF0ZWQgd2l0aCBkZWZhdWx0CisgICAgICogdmFsdWVzLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgZGVmYXVsdCBpbmZvLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvIGNyZWF0ZURlZmF1bHRJbmZvKCkgeworICAgICAgICBBY2Nlc3NpYmlsaXR5U2VydmljZUluZm8gZGVmYXVsdEluZm8gPSBuZXcgQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvKCk7CisgICAgICAgIGRlZmF1bHRJbmZvLmV2ZW50VHlwZXMgPSBBY2Nlc3NpYmlsaXR5RXZlbnQuVFlQRV9WSUVXX0NMSUNLRUQ7CisgICAgICAgIGRlZmF1bHRJbmZvLmZlZWRiYWNrVHlwZSA9IEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mby5GRUVEQkFDS19BVURJQkxFOworICAgICAgICBkZWZhdWx0SW5mby5mbGFncyA9IDA7CisgICAgICAgIGRlZmF1bHRJbmZvLm5vdGlmaWNhdGlvblRpbWVvdXQgPSAwOworICAgICAgICBkZWZhdWx0SW5mby5wYWNrYWdlTmFtZXMgPSBuZXcgU3RyaW5nW10geworICAgICAgICAgICAgImZvby5iYXIuYmF6IgorICAgICAgICB9OworCisgICAgICAgIHJldHVybiBkZWZhdWx0SW5mbzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdGFydHMgcmVwbGF5aW5nIHRoZSBtb2NrLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlcGxheSgpIHsKKyAgICAgICAgbVJlcGxheWluZyA9IHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogVmVyaWZpZXMgaWYgYWxsIGV4cGVjdGVkIHNlcnZpY2UgbWV0aG9kcyBoYXZlIGJlZW4gY2FsbGVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHZlcmlmeSgpIHsKKyAgICAgICAgaWYgKCFtUmVwbGF5aW5nKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJEaWQgeW91IGZvcmdldCB0byBjYWxsIHJlcGxheSgpIik7CisgICAgICAgIH0KKworICAgICAgICBpZiAobUV4cGVjdGVkSW50ZXJydXB0KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJFeHBlY3RlZCBjYWxsIHRvICNpbnRlcnJ1cHQoKSBub3QgcmVjZWl2ZWQiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIW1FeHBlY3RlZEV2ZW50cy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkV4cGVjdGVkIGEgY2FsbCB0byBvbkFjY2Vzc2liaWxpdHlFdmVudCgpIGZvciAiCisgICAgICAgICAgICAgICAgICAgICsgImV2ZW50cyBcIiIgKyBtRXhwZWN0ZWRFdmVudHMgKyAiXCIgbm90IHJlY2VpdmVkIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXNldHMgdGhpcyBpbnN0YW5jZSBzbyBpdCBjYW4gYmUgcmV1c2VkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkgeworICAgICAgICBtRXhwZWN0ZWRFdmVudHMuY2xlYXIoKTsKKyAgICAgICAgbUV4cGVjdGVkSW50ZXJydXB0ID0gZmFsc2U7CisgICAgICAgIG1SZXBsYXlpbmcgPSBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIGFuIGV4cGVjdGVkIGNhbGwgdG8KKyAgICAgKiB7QGxpbmsgI29uQWNjZXNzaWJpbGl0eUV2ZW50KEFjY2Vzc2liaWxpdHlFdmVudCl9IHdpdGggZ2l2ZW4gZXZlbnQgYXMKKyAgICAgKiBhcmd1bWVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBleHBlY3RlZEV2ZW50IFRoZSBleHBlY3RlZCBldmVudCBhcmd1bWVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBleHBlY3RFdmVudChBY2Nlc3NpYmlsaXR5RXZlbnQgZXhwZWN0ZWRFdmVudCkgeworICAgICAgICBtRXhwZWN0ZWRFdmVudHMuYWRkKGV4cGVjdGVkRXZlbnQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgYW4gZXhwZWN0ZWQgY2FsbCBvZiB7QGxpbmsgI29uSW50ZXJydXB0KCl9LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGV4cGVjdEludGVycnVwdCgpIHsKKyAgICAgICAgbUV4cGVjdGVkSW50ZXJydXB0ID0gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkFjY2Vzc2liaWxpdHlFdmVudChBY2Nlc3NpYmlsaXR5RXZlbnQgcmVjZWl2ZWRFdmVudCkgeworICAgICAgICBpZiAoIW1SZXBsYXlpbmcpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtRXhwZWN0ZWRFdmVudHMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJVbmV4cGVjdGVkIGV2ZW50OiAiICsgcmVjZWl2ZWRFdmVudCk7CisgICAgICAgIH0KKworICAgICAgICBBY2Nlc3NpYmlsaXR5RXZlbnQgZXhwZWN0ZWRFdmVudCA9IG1FeHBlY3RlZEV2ZW50cy5wb2xsKCk7CisgICAgICAgIGFzc2VydEVxdWFsc0FjY2Vzc2libGl0eUV2ZW50KGV4cGVjdGVkRXZlbnQsIHJlY2VpdmVkRXZlbnQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uSW50ZXJydXB0KCkgeworICAgICAgICBpZiAoIW1SZXBsYXlpbmcpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghbUV4cGVjdGVkSW50ZXJydXB0KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJVbmV4cGVjdGVkIGNhbGwgdG8gb25JbnRlcnJ1cHQoKSIpOworICAgICAgICB9CisKKyAgICAgICAgbUV4cGVjdGVkSW50ZXJydXB0ID0gZmFsc2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25TZXJ2aWNlQ29ubmVjdGVkKCkgeworICAgICAgICBtSXNTeXN0ZW1Cb3VuZEFzQ2xpZW50ID0gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBvblVuYmluZChJbnRlbnQgaW50ZW50KSB7CisgICAgICAgIG1Jc1N5c3RlbUJvdW5kQXNDbGllbnQgPSBmYWxzZTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgaWYgdGhlIHN5c3RlbSBpcyBib3VuZCBhcyBjbGllbnQgdG8gdGhpcyBzZXJ2aWNlLgorICAgICAqCisgICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBzeXN0ZW0gaXMgYm91bmQsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1N5c3RlbUJvdW5kQXNDbGllbnQoKSB7CisgICAgICAgIHJldHVybiBtSXNTeXN0ZW1Cb3VuZEFzQ2xpZW50OworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbXBhcmVzIGFsbCBwcm9wZXJ0aWVzIG9mIHRoZSA8Y29kZT5leHBlY3RlZEV2ZW50PC9jb2RlPiBhbmQgdGhlCisgICAgICogPGNvZGU+cmVjZXZpZWRFdmVudDwvY29kZT4gdG8gdmVyaWZ5IHRoYXQgdGhlIHJlY2VpdmVkIGV2ZW50IGlzIHRoZSBvbmUKKyAgICAgKiB0aGF0IGlzIGV4cGVjdGVkLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRFcXVhbHNBY2Nlc3NpYmxpdHlFdmVudChBY2Nlc3NpYmlsaXR5RXZlbnQgZXhwZWN0ZWRFdmVudCwKKyAgICAgICAgICAgIEFjY2Vzc2liaWxpdHlFdmVudCByZWNlaXZlZEV2ZW50KSB7CisgICAgICAgIFRlc3RDYXNlLmFzc2VydEVxdWFscygiYWRkZWRDb3VudCBoYXMgaW5jb3JyZWN0IHZhbHVlIiwgZXhwZWN0ZWRFdmVudC5nZXRBZGRlZENvdW50KCksCisgICAgICAgICAgICAgICAgcmVjZWl2ZWRFdmVudC5nZXRBZGRlZENvdW50KCkpOworICAgICAgICBUZXN0Q2FzZS5hc3NlcnRFcXVhbHMoImJlZm9yZVRleHQgaGFzIGluY29ycmVjdCB2YWx1ZSIsIGV4cGVjdGVkRXZlbnQuZ2V0QmVmb3JlVGV4dCgpLAorICAgICAgICAgICAgICAgIHJlY2VpdmVkRXZlbnQuZ2V0QmVmb3JlVGV4dCgpKTsKKyAgICAgICAgVGVzdENhc2UuYXNzZXJ0RXF1YWxzKCJjaGVja2VkIGhhcyBpbmNvcnJlY3QgdmFsdWUiLCBleHBlY3RlZEV2ZW50LmlzQ2hlY2tlZCgpLAorICAgICAgICAgICAgICAgIHJlY2VpdmVkRXZlbnQuaXNDaGVja2VkKCkpOworICAgICAgICBUZXN0Q2FzZS5hc3NlcnRFcXVhbHMoImNsYXNzTmFtZSBoYXMgaW5jb3JyZWN0IHZhbHVlIiwgZXhwZWN0ZWRFdmVudC5nZXRDbGFzc05hbWUoKSwKKyAgICAgICAgICAgICAgICByZWNlaXZlZEV2ZW50LmdldENsYXNzTmFtZSgpKTsKKyAgICAgICAgVGVzdENhc2UuYXNzZXJ0RXF1YWxzKCJjb250ZW50RGVzY3JpcHRpb24gaGFzIGluY29ycmVjdCB2YWx1ZSIsIGV4cGVjdGVkRXZlbnQKKyAgICAgICAgICAgICAgICAuZ2V0Q29udGVudERlc2NyaXB0aW9uKCksIHJlY2VpdmVkRXZlbnQuZ2V0Q29udGVudERlc2NyaXB0aW9uKCkpOworICAgICAgICBUZXN0Q2FzZS5hc3NlcnRFcXVhbHMoImN1cnJlbnRJdGVtSW5kZXggaGFzIGluY29ycmVjdCB2YWx1ZSIsIGV4cGVjdGVkRXZlbnQKKyAgICAgICAgICAgICAgICAuZ2V0Q3VycmVudEl0ZW1JbmRleCgpLCByZWNlaXZlZEV2ZW50LmdldEN1cnJlbnRJdGVtSW5kZXgoKSk7CisgICAgICAgIFRlc3RDYXNlLmFzc2VydEVxdWFscygiZW5hYmxlZCBoYXMgaW5jb3JyZWN0IHZhbHVlIiwgZXhwZWN0ZWRFdmVudC5pc0VuYWJsZWQoKSwKKyAgICAgICAgICAgICAgICByZWNlaXZlZEV2ZW50LmlzRW5hYmxlZCgpKTsKKyAgICAgICAgVGVzdENhc2UuYXNzZXJ0RXF1YWxzKCJldmVudFR5cGUgaGFzIGluY29ycmVjdCB2YWx1ZSIsIGV4cGVjdGVkRXZlbnQuZ2V0RXZlbnRUeXBlKCksCisgICAgICAgICAgICAgICAgcmVjZWl2ZWRFdmVudC5nZXRFdmVudFR5cGUoKSk7CisgICAgICAgIFRlc3RDYXNlLmFzc2VydEVxdWFscygiZnJvbUluZGV4IGhhcyBpbmNvcnJlY3QgdmFsdWUiLCBleHBlY3RlZEV2ZW50LmdldEZyb21JbmRleCgpLAorICAgICAgICAgICAgICAgIHJlY2VpdmVkRXZlbnQuZ2V0RnJvbUluZGV4KCkpOworICAgICAgICBUZXN0Q2FzZS5hc3NlcnRFcXVhbHMoImZ1bGxTY3JlZW4gaGFzIGluY29ycmVjdCB2YWx1ZSIsIGV4cGVjdGVkRXZlbnQuaXNGdWxsU2NyZWVuKCksCisgICAgICAgICAgICAgICAgcmVjZWl2ZWRFdmVudC5pc0Z1bGxTY3JlZW4oKSk7CisgICAgICAgIFRlc3RDYXNlLmFzc2VydEVxdWFscygiaXRlbUNvdW50IGhhcyBpbmNvcnJlY3QgdmFsdWUiLCBleHBlY3RlZEV2ZW50LmdldEl0ZW1Db3VudCgpLAorICAgICAgICAgICAgICAgIHJlY2VpdmVkRXZlbnQuZ2V0SXRlbUNvdW50KCkpOworICAgICAgICBhc3NlcnRFcXVhbHNOb3RpZmljYXRpb25Bc1BhcmNlbGFibGVEYXRhKGV4cGVjdGVkRXZlbnQsIHJlY2VpdmVkRXZlbnQpOworICAgICAgICBUZXN0Q2FzZS5hc3NlcnRFcXVhbHMoInBhc3N3b3JkIGhhcyBpbmNvcnJlY3QgdmFsdWUiLCBleHBlY3RlZEV2ZW50LmlzUGFzc3dvcmQoKSwKKyAgICAgICAgICAgICAgICByZWNlaXZlZEV2ZW50LmlzUGFzc3dvcmQoKSk7CisgICAgICAgIFRlc3RDYXNlLmFzc2VydEVxdWFscygicmVtb3ZlZENvdW50IGhhcyBpbmNvcnJlY3QgdmFsdWUiLCBleHBlY3RlZEV2ZW50LmdldFJlbW92ZWRDb3VudCgpLAorICAgICAgICAgICAgICAgIHJlY2VpdmVkRXZlbnQuZ2V0UmVtb3ZlZENvdW50KCkpOworICAgICAgICBhc3NlcnRFcXVhbHNUZXh0KGV4cGVjdGVkRXZlbnQsIHJlY2VpdmVkRXZlbnQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbXBhcmVzIHRoZSB7QGxpbmsgYW5kcm9pZC5vcy5QYXJjZWxhYmxlfSBkYXRhIG9mIHRoZQorICAgICAqIDxjb2RlPmV4cGVjdGVkRXZlbnQ8L2NvZGU+IGFuZCA8Y29kZT5yZWNlaXZlZEV2ZW50PC9jb2RlPiB0byB2ZXJpZnkgdGhhdAorICAgICAqIHRoZSByZWNlaXZlZCBldmVudCBpcyB0aGUgb25lIHRoYXQgaXMgZXhwZWN0ZWQuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydEVxdWFsc05vdGlmaWNhdGlvbkFzUGFyY2VsYWJsZURhdGEoQWNjZXNzaWJpbGl0eUV2ZW50IGV4cGVjdGVkRXZlbnQsCisgICAgICAgICAgICBBY2Nlc3NpYmlsaXR5RXZlbnQgcmVjZWl2ZWRFdmVudCkgeworICAgICAgICBTdHJpbmcgbWVzc2FnZSA9ICJwYXJjZWxhYmxlRGF0YSBoYXMgaW5jb3JyZWN0IHZhbHVlIjsKKyAgICAgICAgTWVzc2FnZSBleHBlY3RlZE1lc3NhZ2UgPSAoTWVzc2FnZSkgZXhwZWN0ZWRFdmVudC5nZXRQYXJjZWxhYmxlRGF0YSgpOworICAgICAgICBNZXNzYWdlIHJlY2VpdmVkTWVzc2FnZSA9IChNZXNzYWdlKSByZWNlaXZlZEV2ZW50LmdldFBhcmNlbGFibGVEYXRhKCk7CisKKyAgICAgICAgaWYgKGV4cGVjdGVkTWVzc2FnZSA9PSBudWxsKSB7CisgICAgICAgICAgICBpZiAocmVjZWl2ZWRNZXNzYWdlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBUZXN0Q2FzZS5hc3NlcnROb3ROdWxsKG1lc3NhZ2UsIHJlY2VpdmVkTWVzc2FnZSk7CisKKyAgICAgICAgLy8gd2UgZG8gYSB2ZXJ5IHNpbXBsZSBzYW5pdHkgY2hlY2sgc2luY2Ugd2UgZG8gbm90IHRlc3QgTWVzc2FnZQorICAgICAgICBUZXN0Q2FzZS5hc3NlcnRFcXVhbHMobWVzc2FnZSwgZXhwZWN0ZWRNZXNzYWdlLndoYXQsIHJlY2VpdmVkTWVzc2FnZS53aGF0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb21wYXJlcyB0aGUgdGV4dCBvZiB0aGUgPGNvZGU+ZXhwZWN0ZWRFdmVudDwvY29kZT4gYW5kCisgICAgICogPGNvZGU+cmVjZWl2ZWRFdmVudDwvY29kZT4gYnkgY29tcGFyaW5nIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlCisgICAgICogY29ycmVzcG9uZGluZyB7QGxpbmsgQ2hhclNlcXVlbmNlfXMuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydEVxdWFsc1RleHQoQWNjZXNzaWJpbGl0eUV2ZW50IGV4cGVjdGVkRXZlbnQsCisgICAgICAgICAgICBBY2Nlc3NpYmlsaXR5RXZlbnQgcmVjZWl2ZWRFdmVudCkgeworICAgICAgICBTdHJpbmcgbWVzc2FnZSA9ICJ0ZXh0IGhhcyBpbmNvcnJlY3QgdmFsdWUiOworICAgICAgICBMaXN0PENoYXJTZXF1ZW5jZT4gZXhwZWN0ZWRUZXh0ID0gZXhwZWN0ZWRFdmVudC5nZXRUZXh0KCk7CisgICAgICAgIExpc3Q8Q2hhclNlcXVlbmNlPiByZWNlaXZlZFRleHQgPSByZWNlaXZlZEV2ZW50LmdldFRleHQoKTsKKworICAgICAgICBUZXN0Q2FzZS5hc3NlcnRFcXVhbHMobWVzc2FnZSwgZXhwZWN0ZWRUZXh0LnNpemUoKSwgcmVjZWl2ZWRUZXh0LnNpemUoKSk7CisKKyAgICAgICAgSXRlcmF0b3I8Q2hhclNlcXVlbmNlPiBleHBlY3RlZFRleHRJdGVyYXRvciA9IGV4cGVjdGVkVGV4dC5pdGVyYXRvcigpOworICAgICAgICBJdGVyYXRvcjxDaGFyU2VxdWVuY2U+IHJlY2VpdmVkVGV4dEl0ZXJhdG9yID0gcmVjZWl2ZWRUZXh0Lml0ZXJhdG9yKCk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleHBlY3RlZFRleHQuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIC8vIGNvbXBhcmUgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbgorICAgICAgICAgICAgVGVzdENhc2UuYXNzZXJ0RXF1YWxzKG1lc3NhZ2UsIGV4cGVjdGVkVGV4dEl0ZXJhdG9yLm5leHQoKS50b1N0cmluZygpLAorICAgICAgICAgICAgICAgICAgICByZWNlaXZlZFRleHRJdGVyYXRvci5uZXh0KCkudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90ZXN0cy9zZXJ2aWNlc3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvbG9jYXRpb24vQ29tcHJlaGVuc2l2ZUNvdW50cnlEZXRlY3RvclRlc3QuamF2YSBiL3NlcnZpY2VzL3Rlc3RzL3NlcnZpY2VzdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9sb2NhdGlvbi9Db21wcmVoZW5zaXZlQ291bnRyeURldGVjdG9yVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4OTY2YzAKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy90ZXN0cy9zZXJ2aWNlc3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvbG9jYXRpb24vQ29tcHJlaGVuc2l2ZUNvdW50cnlEZXRlY3RvclRlc3QuamF2YQpAQCAtMCwwICsxLDI5OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5zZXJ2ZXIubG9jYXRpb247CisKK2ltcG9ydCBhbmRyb2lkLmxvY2F0aW9uLkNvdW50cnk7CitpbXBvcnQgYW5kcm9pZC5sb2NhdGlvbi5Db3VudHJ5TGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKKworcHVibGljIGNsYXNzIENvbXByZWhlbnNpdmVDb3VudHJ5RGV0ZWN0b3JUZXN0IGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlIHsKKyAgICBwcml2YXRlIGNsYXNzIFRlc3RDb3VudHJ5RGV0ZWN0b3IgZXh0ZW5kcyBDb21wcmVoZW5zaXZlQ291bnRyeURldGVjdG9yIHsKKyAgICAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ09VTlRSWV9JU08gPSAidXMiOworICAgICAgICBwcml2YXRlIGJvb2xlYW4gbUxvY2F0aW9uQmFzZWREZXRlY3RvclN0YXJ0ZWQ7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtTG9jYXRpb25CYXNlZERldGVjdG9yU3RvcHBlZDsKKyAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gbU5vdGlmaWVkOworICAgICAgICBwcml2YXRlIGJvb2xlYW4gbGlzdGVuZXJBZGRlZCA9IGZhbHNlOworCisgICAgICAgIHByaXZhdGUgQ291bnRyeSBtTm90aWZpZWRDb3VudHJ5OworICAgICAgICBwdWJsaWMgVGVzdENvdW50cnlEZXRlY3RvcigpIHsKKyAgICAgICAgICAgIHN1cGVyKGdldENvbnRleHQoKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBub3RpZnlMb2NhdGlvbkJhc2VkTGlzdGVuZXIoQ291bnRyeSBjb3VudHJ5KSB7CisgICAgICAgICAgICBtTm90aWZpZWQgPSB0cnVlOworICAgICAgICAgICAgbU5vdGlmaWVkQ291bnRyeSA9IGNvdW50cnk7CisgICAgICAgICAgICBtTG9jYXRpb25CYXNlZENvdW50cnlEZXRlY3Rvci5ub3RpZnlMaXN0ZW5lcihjb3VudHJ5KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGxvY2F0aW9uQmFzZWREZXRlY3RvclN0YXJ0ZWQoKSB7CisgICAgICAgICAgICByZXR1cm4gbUxvY2F0aW9uQmFzZWRDb3VudHJ5RGV0ZWN0b3IgIT0gbnVsbCAmJiBtTG9jYXRpb25CYXNlZERldGVjdG9yU3RhcnRlZDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGxvY2F0aW9uQmFzZWREZXRlY3RvclN0b3BwZWQoKSB7CisgICAgICAgICAgICByZXR1cm4gbUxvY2F0aW9uQmFzZWRDb3VudHJ5RGV0ZWN0b3IgPT0gbnVsbCAmJiBtTG9jYXRpb25CYXNlZERldGVjdG9yU3RvcHBlZDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGxvY2F0aW9uUmVmcmVzaFN0YXJ0ZWQoKSB7CisgICAgICAgICAgICByZXR1cm4gbUxvY2F0aW9uUmVmcmVzaFRpbWVyICE9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBsb2NhdGlvblJlZnJlc2hDYW5jZWxsZWQoKSB7CisgICAgICAgICAgICByZXR1cm4gbUxvY2F0aW9uUmVmcmVzaFRpbWVyID09IG51bGw7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIENvdW50cnlEZXRlY3RvckJhc2UgY3JlYXRlTG9jYXRpb25CYXNlZENvdW50cnlEZXRlY3RvcigpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQ291bnRyeURldGVjdG9yQmFzZShtQ29udGV4dCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBDb3VudHJ5IGRldGVjdENvdW50cnkoKSB7CisgICAgICAgICAgICAgICAgICAgIG1Mb2NhdGlvbkJhc2VkRGV0ZWN0b3JTdGFydGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc3RvcCgpIHsKKyAgICAgICAgICAgICAgICAgICAgbUxvY2F0aW9uQmFzZWREZXRlY3RvclN0b3BwZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIENvdW50cnkgZ2V0TmV0d29ya0Jhc2VkQ291bnRyeSgpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBDb3VudHJ5IGdldExhc3RLbm93bkxvY2F0aW9uQmFzZWRDb3VudHJ5KCkgeworICAgICAgICAgICAgcmV0dXJuIG1Ob3RpZmllZENvdW50cnk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIENvdW50cnkgZ2V0U2ltQmFzZWRDb3VudHJ5KCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIENvdW50cnkgZ2V0TG9jYWxlQ291bnRyeSgpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIHJ1bkFmdGVyRGV0ZWN0aW9uQXN5bmMoZmluYWwgQ291bnRyeSBjb3VudHJ5LCBmaW5hbCBDb3VudHJ5IGRldGVjdGVkQ291bnRyeSwKKyAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIG5vdGlmeUNoYW5nZSwgZmluYWwgYm9vbGVhbiBzdGFydExvY2F0aW9uQmFzZWREZXRlY3Rpb24pIHsKKyAgICAgICAgICAgIHJ1bkFmdGVyRGV0ZWN0aW9uKGNvdW50cnksIGRldGVjdGVkQ291bnRyeSwgbm90aWZ5Q2hhbmdlLCBzdGFydExvY2F0aW9uQmFzZWREZXRlY3Rpb24pOworICAgICAgICB9OworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0FpcnBsYW5lTW9kZU9mZigpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCBhZGRQaG9uZVN0YXRlTGlzdGVuZXIoKSB7CisgICAgICAgICAgICBsaXN0ZW5lckFkZGVkID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgc3luY2hyb25pemVkIHZvaWQgcmVtb3ZlUGhvbmVTdGF0ZUxpc3RlbmVyKCkgeworICAgICAgICAgICAgbGlzdGVuZXJBZGRlZCA9IGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBib29sZWFuIGlzR2VvQ29kZXJJbXBsZW1lbnRlZCgpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNQaG9uZVN0YXRlTGlzdGVuZXJBZGRlZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBsaXN0ZW5lckFkZGVkOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBDb3VudHJ5TGlzdGVuZXJJbXBsIGltcGxlbWVudHMgQ291bnRyeUxpc3RlbmVyIHsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1Ob3RpZmllZDsKKyAgICAgICAgcHJpdmF0ZSBDb3VudHJ5IG1Db3VudHJ5OworCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ291bnRyeURldGVjdGVkKENvdW50cnkgY291bnRyeSkgeworICAgICAgICAgICAgbU5vdGlmaWVkID0gdHJ1ZTsKKyAgICAgICAgICAgIG1Db3VudHJ5ID0gY291bnRyeTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIG5vdGlmaWVkKCkgeworICAgICAgICAgICAgcmV0dXJuIG1Ob3RpZmllZDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBDb3VudHJ5IGdldENvdW50cnkoKSB7CisgICAgICAgICAgICByZXR1cm4gbUNvdW50cnk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGV0ZWN0TmV0d29ya0Jhc2VkQ291bnRyeSgpIHsKKyAgICAgICAgZmluYWwgQ291bnRyeSByZXN1bHRDb3VudHJ5ID0gbmV3IENvdW50cnkoCisgICAgICAgICAgICAgICAgVGVzdENvdW50cnlEZXRlY3Rvci5DT1VOVFJZX0lTTywgQ291bnRyeS5DT1VOVFJZX1NPVVJDRV9ORVRXT1JLKTsKKyAgICAgICAgVGVzdENvdW50cnlEZXRlY3RvciBjb3VudHJ5RGV0ZWN0b3IgPSBuZXcgVGVzdENvdW50cnlEZXRlY3RvcigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHJvdGVjdGVkIENvdW50cnkgZ2V0TmV0d29ya0Jhc2VkQ291bnRyeSgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0Q291bnRyeTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgQ291bnRyeUxpc3RlbmVySW1wbCBsaXN0ZW5lciA9IG5ldyBDb3VudHJ5TGlzdGVuZXJJbXBsKCk7CisgICAgICAgIGNvdW50cnlEZXRlY3Rvci5zZXRDb3VudHJ5TGlzdGVuZXIobGlzdGVuZXIpOworICAgICAgICBDb3VudHJ5IGNvdW50cnkgPSBjb3VudHJ5RGV0ZWN0b3IuZGV0ZWN0Q291bnRyeSgpOworICAgICAgICBhc3NlcnRUcnVlKHNhbWVDb3VudHJ5KGNvdW50cnksIHJlc3VsdENvdW50cnkpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobGlzdGVuZXIubm90aWZpZWQoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKGNvdW50cnlEZXRlY3Rvci5sb2NhdGlvbkJhc2VkRGV0ZWN0b3JTdGFydGVkKCkpOworICAgICAgICBhc3NlcnRGYWxzZShjb3VudHJ5RGV0ZWN0b3IubG9jYXRpb25SZWZyZXNoU3RhcnRlZCgpKTsKKyAgICAgICAgY291bnRyeURldGVjdG9yLnN0b3AoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGV0ZWN0TG9jYXRpb25CYXNlZENvdW50cnkoKSB7CisgICAgICAgIGZpbmFsIENvdW50cnkgcmVzdWx0Q291bnRyeSA9IG5ldyBDb3VudHJ5KAorICAgICAgICAgICAgICAgIFRlc3RDb3VudHJ5RGV0ZWN0b3IuQ09VTlRSWV9JU08sIENvdW50cnkuQ09VTlRSWV9TT1VSQ0VfU0lNKTsKKyAgICAgICAgZmluYWwgQ291bnRyeSBsb2NhdGlvbkJhc2VkQ291bnRyeSA9IG5ldyBDb3VudHJ5KAorICAgICAgICAgICAgICAgIFRlc3RDb3VudHJ5RGV0ZWN0b3IuQ09VTlRSWV9JU08sIENvdW50cnkuQ09VTlRSWV9TT1VSQ0VfTE9DQVRJT04pOworICAgICAgICBUZXN0Q291bnRyeURldGVjdG9yIGNvdW50cnlEZXRlY3RvciA9IG5ldyBUZXN0Q291bnRyeURldGVjdG9yKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwcm90ZWN0ZWQgQ291bnRyeSBnZXRTaW1CYXNlZENvdW50cnkoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdENvdW50cnk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIENvdW50cnlMaXN0ZW5lckltcGwgbGlzdGVuZXIgPSBuZXcgQ291bnRyeUxpc3RlbmVySW1wbCgpOworICAgICAgICBjb3VudHJ5RGV0ZWN0b3Iuc2V0Q291bnRyeUxpc3RlbmVyKGxpc3RlbmVyKTsKKyAgICAgICAgQ291bnRyeSBjb3VudHJ5ID0gY291bnRyeURldGVjdG9yLmRldGVjdENvdW50cnkoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShzYW1lQ291bnRyeShjb3VudHJ5LCByZXN1bHRDb3VudHJ5KSk7CisgICAgICAgIGFzc2VydFRydWUoY291bnRyeURldGVjdG9yLmxvY2F0aW9uQmFzZWREZXRlY3RvclN0YXJ0ZWQoKSk7CisgICAgICAgIGNvdW50cnlEZXRlY3Rvci5ub3RpZnlMb2NhdGlvbkJhc2VkTGlzdGVuZXIobG9jYXRpb25CYXNlZENvdW50cnkpOworICAgICAgICBhc3NlcnRUcnVlKGxpc3RlbmVyLm5vdGlmaWVkKCkpOworICAgICAgICBhc3NlcnRUcnVlKHNhbWVDb3VudHJ5KGxpc3RlbmVyLmdldENvdW50cnkoKSwgbG9jYXRpb25CYXNlZENvdW50cnkpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb3VudHJ5RGV0ZWN0b3IubG9jYXRpb25CYXNlZERldGVjdG9yU3RvcHBlZCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb3VudHJ5RGV0ZWN0b3IubG9jYXRpb25SZWZyZXNoU3RhcnRlZCgpKTsKKyAgICAgICAgY291bnRyeURldGVjdG9yLnN0b3AoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb3VudHJ5RGV0ZWN0b3IubG9jYXRpb25SZWZyZXNoQ2FuY2VsbGVkKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RMb2NhbGVCYXNlZENvdW50cnkoKSB7CisgICAgICAgIGZpbmFsIENvdW50cnkgcmVzdWx0Q291bnRyeSA9IG5ldyBDb3VudHJ5KAorICAgICAgICAgICAgICAgIFRlc3RDb3VudHJ5RGV0ZWN0b3IuQ09VTlRSWV9JU08sIENvdW50cnkuQ09VTlRSWV9TT1VSQ0VfTE9DQUxFKTsKKyAgICAgICAgVGVzdENvdW50cnlEZXRlY3RvciBjb3VudHJ5RGV0ZWN0b3IgPSBuZXcgVGVzdENvdW50cnlEZXRlY3RvcigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHJvdGVjdGVkIENvdW50cnkgZ2V0TG9jYWxlQ291bnRyeSgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0Q291bnRyeTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgQ291bnRyeUxpc3RlbmVySW1wbCBsaXN0ZW5lciA9IG5ldyBDb3VudHJ5TGlzdGVuZXJJbXBsKCk7CisgICAgICAgIGNvdW50cnlEZXRlY3Rvci5zZXRDb3VudHJ5TGlzdGVuZXIobGlzdGVuZXIpOworICAgICAgICBDb3VudHJ5IGNvdW50cnkgPSBjb3VudHJ5RGV0ZWN0b3IuZGV0ZWN0Q291bnRyeSgpOworICAgICAgICBhc3NlcnRUcnVlKHNhbWVDb3VudHJ5KGNvdW50cnksIHJlc3VsdENvdW50cnkpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobGlzdGVuZXIubm90aWZpZWQoKSk7CisgICAgICAgIGFzc2VydFRydWUoY291bnRyeURldGVjdG9yLmxvY2F0aW9uQmFzZWREZXRlY3RvclN0YXJ0ZWQoKSk7CisgICAgICAgIGFzc2VydFRydWUoY291bnRyeURldGVjdG9yLmxvY2F0aW9uUmVmcmVzaFN0YXJ0ZWQoKSk7CisgICAgICAgIGNvdW50cnlEZXRlY3Rvci5zdG9wKCk7CisgICAgICAgIGFzc2VydFRydWUoY291bnRyeURldGVjdG9yLmxvY2F0aW9uUmVmcmVzaENhbmNlbGxlZCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RvcHBpbmdEZXRlY3RvcigpIHsKKyAgICAgICAgLy8gVGVzdCBzdG9wcGluZyBkZXRlY3RvciB3aGVuIExvY2F0aW9uQmFzZWRDb3VudHJ5RGV0ZWN0b3Igd2FzIHN0YXJ0ZWQKKyAgICAgICAgZmluYWwgQ291bnRyeSByZXN1bHRDb3VudHJ5ID0gbmV3IENvdW50cnkoCisgICAgICAgICAgICAgICAgVGVzdENvdW50cnlEZXRlY3Rvci5DT1VOVFJZX0lTTywgQ291bnRyeS5DT1VOVFJZX1NPVVJDRV9TSU0pOworICAgICAgICBUZXN0Q291bnRyeURldGVjdG9yIGNvdW50cnlEZXRlY3RvciA9IG5ldyBUZXN0Q291bnRyeURldGVjdG9yKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwcm90ZWN0ZWQgQ291bnRyeSBnZXRTaW1CYXNlZENvdW50cnkoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdENvdW50cnk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIENvdW50cnlMaXN0ZW5lckltcGwgbGlzdGVuZXIgPSBuZXcgQ291bnRyeUxpc3RlbmVySW1wbCgpOworICAgICAgICBjb3VudHJ5RGV0ZWN0b3Iuc2V0Q291bnRyeUxpc3RlbmVyKGxpc3RlbmVyKTsKKyAgICAgICAgQ291bnRyeSBjb3VudHJ5ID0gY291bnRyeURldGVjdG9yLmRldGVjdENvdW50cnkoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShzYW1lQ291bnRyeShjb3VudHJ5LCByZXN1bHRDb3VudHJ5KSk7CisgICAgICAgIGFzc2VydFRydWUoY291bnRyeURldGVjdG9yLmxvY2F0aW9uQmFzZWREZXRlY3RvclN0YXJ0ZWQoKSk7CisgICAgICAgIGNvdW50cnlEZXRlY3Rvci5zdG9wKCk7CisgICAgICAgIC8vIFRoZSBMb2NhdGlvbkJhc2VkRGV0ZWN0b3Igc2hvdWxkIGJlIHN0b3BwZWQuCisgICAgICAgIGFzc2VydFRydWUoY291bnRyeURldGVjdG9yLmxvY2F0aW9uQmFzZWREZXRlY3RvclN0b3BwZWQoKSk7CisgICAgICAgIC8vIFRoZSBsb2NhdGlvbiByZWZyZXNoIHNob3VsZCBub3QgcnVubmluZy4KKyAgICAgICAgYXNzZXJ0VHJ1ZShjb3VudHJ5RGV0ZWN0b3IubG9jYXRpb25SZWZyZXNoQ2FuY2VsbGVkKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RMb2NhdGlvbkJhc2VkQ291bnRyeU5vdEZvdW5kKCkgeworICAgICAgICBmaW5hbCBDb3VudHJ5IHJlc3VsdENvdW50cnkgPSBuZXcgQ291bnRyeSgKKyAgICAgICAgICAgICAgICBUZXN0Q291bnRyeURldGVjdG9yLkNPVU5UUllfSVNPLCBDb3VudHJ5LkNPVU5UUllfU09VUkNFX1NJTSk7CisgICAgICAgIFRlc3RDb3VudHJ5RGV0ZWN0b3IgY291bnRyeURldGVjdG9yID0gbmV3IFRlc3RDb3VudHJ5RGV0ZWN0b3IoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHByb3RlY3RlZCBDb3VudHJ5IGdldFNpbUJhc2VkQ291bnRyeSgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0Q291bnRyeTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgQ291bnRyeUxpc3RlbmVySW1wbCBsaXN0ZW5lciA9IG5ldyBDb3VudHJ5TGlzdGVuZXJJbXBsKCk7CisgICAgICAgIGNvdW50cnlEZXRlY3Rvci5zZXRDb3VudHJ5TGlzdGVuZXIobGlzdGVuZXIpOworICAgICAgICBDb3VudHJ5IGNvdW50cnkgPSBjb3VudHJ5RGV0ZWN0b3IuZGV0ZWN0Q291bnRyeSgpOworICAgICAgICBhc3NlcnRUcnVlKHNhbWVDb3VudHJ5KGNvdW50cnksIHJlc3VsdENvdW50cnkpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb3VudHJ5RGV0ZWN0b3IubG9jYXRpb25CYXNlZERldGVjdG9yU3RhcnRlZCgpKTsKKyAgICAgICAgY291bnRyeURldGVjdG9yLm5vdGlmeUxvY2F0aW9uQmFzZWRMaXN0ZW5lcihudWxsKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobGlzdGVuZXIubm90aWZpZWQoKSk7CisgICAgICAgIGFzc2VydFRydWUoc2FtZUNvdW50cnkobGlzdGVuZXIuZ2V0Q291bnRyeSgpLCBudWxsKSk7CisgICAgICAgIGFzc2VydFRydWUoY291bnRyeURldGVjdG9yLmxvY2F0aW9uQmFzZWREZXRlY3RvclN0b3BwZWQoKSk7CisgICAgICAgIGFzc2VydFRydWUoY291bnRyeURldGVjdG9yLmxvY2F0aW9uUmVmcmVzaFN0YXJ0ZWQoKSk7CisgICAgICAgIGNvdW50cnlEZXRlY3Rvci5zdG9wKCk7CisgICAgICAgIGFzc2VydFRydWUoY291bnRyeURldGVjdG9yLmxvY2F0aW9uUmVmcmVzaENhbmNlbGxlZCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9Db3VudHJ5Rm91bmQoKSB7CisgICAgICAgIFRlc3RDb3VudHJ5RGV0ZWN0b3IgY291bnRyeURldGVjdG9yID0gbmV3IFRlc3RDb3VudHJ5RGV0ZWN0b3IoKTsKKyAgICAgICAgQ291bnRyeUxpc3RlbmVySW1wbCBsaXN0ZW5lciA9IG5ldyBDb3VudHJ5TGlzdGVuZXJJbXBsKCk7CisgICAgICAgIGNvdW50cnlEZXRlY3Rvci5zZXRDb3VudHJ5TGlzdGVuZXIobGlzdGVuZXIpOworICAgICAgICBDb3VudHJ5IGNvdW50cnkgPSBjb3VudHJ5RGV0ZWN0b3IuZGV0ZWN0Q291bnRyeSgpOworICAgICAgICBhc3NlcnRUcnVlKHNhbWVDb3VudHJ5KGNvdW50cnksIG51bGwpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb3VudHJ5RGV0ZWN0b3IubG9jYXRpb25CYXNlZERldGVjdG9yU3RhcnRlZCgpKTsKKyAgICAgICAgY291bnRyeURldGVjdG9yLm5vdGlmeUxvY2F0aW9uQmFzZWRMaXN0ZW5lcihudWxsKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobGlzdGVuZXIubm90aWZpZWQoKSk7CisgICAgICAgIGFzc2VydFRydWUoc2FtZUNvdW50cnkobGlzdGVuZXIuZ2V0Q291bnRyeSgpLCBudWxsKSk7CisgICAgICAgIGFzc2VydFRydWUoY291bnRyeURldGVjdG9yLmxvY2F0aW9uQmFzZWREZXRlY3RvclN0b3BwZWQoKSk7CisgICAgICAgIGFzc2VydFRydWUoY291bnRyeURldGVjdG9yLmxvY2F0aW9uUmVmcmVzaFN0YXJ0ZWQoKSk7CisgICAgICAgIGNvdW50cnlEZXRlY3Rvci5zdG9wKCk7CisgICAgICAgIGFzc2VydFRydWUoY291bnRyeURldGVjdG9yLmxvY2F0aW9uUmVmcmVzaENhbmNlbGxlZCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlTGlzdGVuZXIoKSB7CisgICAgICAgIFRlc3RDb3VudHJ5RGV0ZWN0b3IgY291bnRyeURldGVjdG9yID0gbmV3IFRlc3RDb3VudHJ5RGV0ZWN0b3IoKTsKKyAgICAgICAgQ291bnRyeUxpc3RlbmVySW1wbCBsaXN0ZW5lciA9IG5ldyBDb3VudHJ5TGlzdGVuZXJJbXBsKCk7CisgICAgICAgIGNvdW50cnlEZXRlY3Rvci5zZXRDb3VudHJ5TGlzdGVuZXIobGlzdGVuZXIpOworICAgICAgICBhc3NlcnRUcnVlKGNvdW50cnlEZXRlY3Rvci5pc1Bob25lU3RhdGVMaXN0ZW5lckFkZGVkKCkpOworICAgICAgICBhc3NlcnRUcnVlKGNvdW50cnlEZXRlY3Rvci5sb2NhdGlvbkJhc2VkRGV0ZWN0b3JTdGFydGVkKCkpOworICAgICAgICBjb3VudHJ5RGV0ZWN0b3Iuc2V0Q291bnRyeUxpc3RlbmVyKG51bGwpOworICAgICAgICBhc3NlcnRGYWxzZShjb3VudHJ5RGV0ZWN0b3IuaXNQaG9uZVN0YXRlTGlzdGVuZXJBZGRlZCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb3VudHJ5RGV0ZWN0b3IubG9jYXRpb25CYXNlZERldGVjdG9yU3RvcHBlZCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2VvY29kZXJOb3RJbXBsZW1lbnRlZCgpIHsKKyAgICAgICAgVGVzdENvdW50cnlEZXRlY3RvciBjb3VudHJ5RGV0ZWN0b3IgPSBuZXcgVGVzdENvdW50cnlEZXRlY3RvcigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNHZW9Db2RlckltcGxlbWVudGVkKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgQ291bnRyeUxpc3RlbmVySW1wbCBsaXN0ZW5lciA9IG5ldyBDb3VudHJ5TGlzdGVuZXJJbXBsKCk7CisgICAgICAgIGNvdW50cnlEZXRlY3Rvci5zZXRDb3VudHJ5TGlzdGVuZXIobGlzdGVuZXIpOworICAgICAgICBhc3NlcnRUcnVlKGNvdW50cnlEZXRlY3Rvci5pc1Bob25lU3RhdGVMaXN0ZW5lckFkZGVkKCkpOworICAgICAgICBhc3NlcnRGYWxzZShjb3VudHJ5RGV0ZWN0b3IubG9jYXRpb25CYXNlZERldGVjdG9yU3RhcnRlZCgpKTsKKyAgICAgICAgY291bnRyeURldGVjdG9yLnNldENvdW50cnlMaXN0ZW5lcihudWxsKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoY291bnRyeURldGVjdG9yLmlzUGhvbmVTdGF0ZUxpc3RlbmVyQWRkZWQoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIHNhbWVDb3VudHJ5KENvdW50cnkgY291bnRyeTEsIENvdW50cnkgY291bnRyeTIpIHsKKyAgICAgICAgcmV0dXJuIGNvdW50cnkxID09IG51bGwgJiYgY291bnRyeTIgPT0gbnVsbCB8fCBjb3VudHJ5MSAhPSBudWxsICYmIGNvdW50cnkyICE9IG51bGwgJiYKKyAgICAgICAgY291bnRyeTEuZ2V0Q291bnRyeUlzbygpLmVxdWFsc0lnbm9yZUNhc2UoY291bnRyeTIuZ2V0Q291bnRyeUlzbygpKSAmJgorICAgICAgICBjb3VudHJ5MS5nZXRTb3VyY2UoKSA9PSBjb3VudHJ5Mi5nZXRTb3VyY2UoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90ZXN0cy9zZXJ2aWNlc3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvbG9jYXRpb24vTG9jYXRpb25CYXNlZENvdW50cnlEZXRlY3RvclRlc3QuamF2YSBiL3NlcnZpY2VzL3Rlc3RzL3NlcnZpY2VzdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9sb2NhdGlvbi9Mb2NhdGlvbkJhc2VkQ291bnRyeURldGVjdG9yVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjcxZThlMmEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy90ZXN0cy9zZXJ2aWNlc3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvbG9jYXRpb24vTG9jYXRpb25CYXNlZENvdW50cnlEZXRlY3RvclRlc3QuamF2YQpAQCAtMCwwICsxLDMyNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCisgKi8KK3BhY2thZ2UgY29tLmFuZHJvaWQuc2VydmVyLmxvY2F0aW9uOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuVGltZXI7CisKK2ltcG9ydCBhbmRyb2lkLmxvY2F0aW9uLkNvdW50cnk7CitpbXBvcnQgYW5kcm9pZC5sb2NhdGlvbi5Db3VudHJ5TGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC5sb2NhdGlvbi5Mb2NhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLmxvY2F0aW9uLkxvY2F0aW9uTGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKKworcHVibGljIGNsYXNzIExvY2F0aW9uQmFzZWRDb3VudHJ5RGV0ZWN0b3JUZXN0IGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlIHsKKyAgICBwcml2YXRlIGNsYXNzIFRlc3RDb3VudHJ5RGV0ZWN0b3IgZXh0ZW5kcyBMb2NhdGlvbkJhc2VkQ291bnRyeURldGVjdG9yIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVE9UQUxfUFJPVklERVJTID0gMjsKKyAgICAgICAgcHJvdGVjdGVkIE9iamVjdCBjb3VudHJ5Rm91bmRMb2NrZXIgPSBuZXcgT2JqZWN0KCk7CisgICAgICAgIHByb3RlY3RlZCBib29sZWFuIG5vdGlmeUNvdW50cnkgPSBmYWxzZTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBMb2NhdGlvbiBtTG9jYXRpb247CisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1Db3VudHJ5OworICAgICAgICBwcml2YXRlIGZpbmFsIGxvbmcgbVF1ZXJ5TG9jYXRpb25UaW1lb3V0OworICAgICAgICBwcml2YXRlIExpc3Q8TG9jYXRpb25MaXN0ZW5lcj4gbUxpc3RlbmVyczsKKworICAgICAgICBwdWJsaWMgVGVzdENvdW50cnlEZXRlY3RvcihTdHJpbmcgY291bnRyeSwgU3RyaW5nIHByb3ZpZGVyKSB7CisgICAgICAgICAgICB0aGlzKGNvdW50cnksIHByb3ZpZGVyLCAxMDAwICogNjAgKiA1KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUZXN0Q291bnRyeURldGVjdG9yKFN0cmluZyBjb3VudHJ5LCBTdHJpbmcgcHJvdmlkZXIsIGxvbmcgcXVlcnlMb2NhdGlvblRpbWVvdXQpIHsKKyAgICAgICAgICAgIHN1cGVyKGdldENvbnRleHQoKSk7CisgICAgICAgICAgICBtQ291bnRyeSA9IGNvdW50cnk7CisgICAgICAgICAgICBtTG9jYXRpb24gPSBuZXcgTG9jYXRpb24ocHJvdmlkZXIpOworICAgICAgICAgICAgbVF1ZXJ5TG9jYXRpb25UaW1lb3V0ID0gcXVlcnlMb2NhdGlvblRpbWVvdXQ7CisgICAgICAgICAgICBtTGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdDxMb2NhdGlvbkxpc3RlbmVyPigpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q291bnRyeUZyb21Mb2NhdGlvbihMb2NhdGlvbiBsb2NhdGlvbikgeworICAgICAgICAgICAgc3luY2hyb25pemVkIChjb3VudHJ5Rm91bmRMb2NrZXIpIHsKKyAgICAgICAgICAgICAgICBpZiAoIW5vdGlmeUNvdW50cnkpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50cnlGb3VuZExvY2tlci53YWl0KCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtTG9jYXRpb24uZ2V0UHJvdmlkZXIoKS5lbmRzV2l0aChsb2NhdGlvbi5nZXRQcm92aWRlcigpKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBtQ291bnRyeTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIExvY2F0aW9uIGdldExhc3RLbm93bkxvY2F0aW9uKCkgeworICAgICAgICAgICAgcmV0dXJuIG1Mb2NhdGlvbjsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCByZWdpc3RlckVuYWJsZWRQcm92aWRlcnMoTGlzdDxMb2NhdGlvbkxpc3RlbmVyPiBsaXN0ZW5lcnMpIHsKKyAgICAgICAgICAgIG1MaXN0ZW5lcnMuYWRkQWxsKGxpc3RlbmVycyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgdW5yZWdpc3RlclByb3ZpZGVycyhMaXN0PExvY2F0aW9uTGlzdGVuZXI+IGxpc3RlbmVycykgeworICAgICAgICAgICAgZm9yIChMb2NhdGlvbkxpc3RlbmVyIGxpc3RlbmVyIDogbUxvY2F0aW9uTGlzdGVuZXJzKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtTGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcikpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBsb25nIGdldFF1ZXJ5TG9jYXRpb25UaW1lb3V0KCkgeworICAgICAgICAgICAgcmV0dXJuIG1RdWVyeUxvY2F0aW9uVGltZW91dDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgaW50IGdldFRvdGFsRW5hYmxlZFByb3ZpZGVycygpIHsKKyAgICAgICAgICAgIHJldHVybiBUT1RBTF9QUk9WSURFUlM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBub3RpZnlMb2NhdGlvbkZvdW5kKCkgeworICAgICAgICAgICAgLy8gTGlzdGVuZXIgY291bGQgYmUgcmVtb3ZlZCBpbiB0aGUgbm90aWZpY2F0aW9uLgorICAgICAgICAgICAgTG9jYXRpb25MaXN0ZW5lcltdIGxpc3RlbmVycyA9IG5ldyBMb2NhdGlvbkxpc3RlbmVyW21MaXN0ZW5lcnMuc2l6ZSgpXTsKKyAgICAgICAgICAgIG1Mb2NhdGlvbkxpc3RlbmVycy50b0FycmF5KGxpc3RlbmVycyk7CisgICAgICAgICAgICBmb3IgKExvY2F0aW9uTGlzdGVuZXIgbGlzdGVuZXIgOmxpc3RlbmVycykgeworICAgICAgICAgICAgICAgIGxpc3RlbmVyLm9uTG9jYXRpb25DaGFuZ2VkKG1Mb2NhdGlvbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGdldExpc3RlbmVyc0NvdW50KCkgeworICAgICAgICAgICAgcmV0dXJuIG1MaXN0ZW5lcnMuc2l6ZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgbm90aWZ5Q291bnRyeUZvdW5kKCkgeworICAgICAgICAgICAgc3luY2hyb25pemVkIChjb3VudHJ5Rm91bmRMb2NrZXIpIHsKKyAgICAgICAgICAgICAgICBub3RpZnlDb3VudHJ5ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBjb3VudHJ5Rm91bmRMb2NrZXIubm90aWZ5KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVGltZXIgZ2V0VGltZXIoKSB7CisgICAgICAgICAgICByZXR1cm4gbVRpbWVyOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRocmVhZCBnZXRRdWVyeVRocmVhZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtUXVlcnlUaHJlYWQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIENvdW50cnlMaXN0ZW5lckltcGwgaW1wbGVtZW50cyBDb3VudHJ5TGlzdGVuZXIgeworICAgICAgICBwcml2YXRlIGJvb2xlYW4gbU5vdGlmaWVkOworICAgICAgICBwcml2YXRlIFN0cmluZyBtQ291bnRyeUNvZGU7CisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ291bnRyeURldGVjdGVkKENvdW50cnkgY291bnRyeSkgeworICAgICAgICAgICAgbU5vdGlmaWVkID0gdHJ1ZTsKKyAgICAgICAgICAgIGlmIChjb3VudHJ5ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtQ291bnRyeUNvZGUgPSBjb3VudHJ5LmdldENvdW50cnlJc28oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIG5vdGlmaWVkKCkgeworICAgICAgICAgICAgcmV0dXJuIG1Ob3RpZmllZDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q291bnRyeSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtQ291bnRyeUNvZGU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmluZGluZ0NvdW50cnkoKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyBjb3VudHJ5ID0gInVzIjsKKyAgICAgICAgZmluYWwgU3RyaW5nIHByb3ZpZGVyID0gIkdvb2QiOworICAgICAgICBDb3VudHJ5TGlzdGVuZXJJbXBsIGNvdW50cnlMaXN0ZW5lciA9IG5ldyBDb3VudHJ5TGlzdGVuZXJJbXBsKCk7CisgICAgICAgIFRlc3RDb3VudHJ5RGV0ZWN0b3IgZGV0ZWN0b3IgPSBuZXcgVGVzdENvdW50cnlEZXRlY3Rvcihjb3VudHJ5LCBwcm92aWRlcik7CisgICAgICAgIGRldGVjdG9yLnNldENvdW50cnlMaXN0ZW5lcihjb3VudHJ5TGlzdGVuZXIpOworICAgICAgICBkZXRlY3Rvci5kZXRlY3RDb3VudHJ5KCk7CisgICAgICAgIGFzc2VydEVxdWFscyhkZXRlY3Rvci5nZXRMaXN0ZW5lcnNDb3VudCgpLCBUZXN0Q291bnRyeURldGVjdG9yLlRPVEFMX1BST1ZJREVSUyk7CisgICAgICAgIGRldGVjdG9yLm5vdGlmeUxvY2F0aW9uRm91bmQoKTsKKyAgICAgICAgLy8gQWxsIGxpc3RlbmVycyBzaG91bGQgYmUgdW5yZWdpc3RlcmVkCisgICAgICAgIGFzc2VydEVxdWFscyhkZXRlY3Rvci5nZXRMaXN0ZW5lcnNDb3VudCgpLCAwKTsKKyAgICAgICAgYXNzZXJ0TnVsbChkZXRlY3Rvci5nZXRUaW1lcigpKTsKKyAgICAgICAgVGhyZWFkIHF1ZXJ5VGhyZWFkID0gd2FpdEZvclF1ZXJ5VGhyZWFkTGF1bmNoZWQoZGV0ZWN0b3IpOworICAgICAgICBkZXRlY3Rvci5ub3RpZnlDb3VudHJ5Rm91bmQoKTsKKyAgICAgICAgLy8gV2FpdCBmb3IgcXVlcnkgdGhyZWFkIGVuZGluZworICAgICAgICB3YWl0Rm9yVGhyZWFkRW5kaW5nKHF1ZXJ5VGhyZWFkKTsKKyAgICAgICAgLy8gUXVlcnlUaHJlYWQgc2hvdWxkIGJlIHNldCB0byBOVUxMCisgICAgICAgIGFzc2VydE51bGwoZGV0ZWN0b3IuZ2V0UXVlcnlUaHJlYWQoKSk7CisgICAgICAgIGFzc2VydFRydWUoY291bnRyeUxpc3RlbmVyLm5vdGlmaWVkKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoY291bnRyeUxpc3RlbmVyLmdldENvdW50cnkoKSwgY291bnRyeSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEZpbmRpbmdDb3VudHJ5Q2FuY2VsbGVkKCkgeworICAgICAgICBmaW5hbCBTdHJpbmcgY291bnRyeSA9ICJ1cyI7CisgICAgICAgIGZpbmFsIFN0cmluZyBwcm92aWRlciA9ICJHb29kIjsKKyAgICAgICAgQ291bnRyeUxpc3RlbmVySW1wbCBjb3VudHJ5TGlzdGVuZXIgPSBuZXcgQ291bnRyeUxpc3RlbmVySW1wbCgpOworICAgICAgICBUZXN0Q291bnRyeURldGVjdG9yIGRldGVjdG9yID0gbmV3IFRlc3RDb3VudHJ5RGV0ZWN0b3IoY291bnRyeSwgcHJvdmlkZXIpOworICAgICAgICBkZXRlY3Rvci5zZXRDb3VudHJ5TGlzdGVuZXIoY291bnRyeUxpc3RlbmVyKTsKKyAgICAgICAgZGV0ZWN0b3IuZGV0ZWN0Q291bnRyeSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoZGV0ZWN0b3IuZ2V0TGlzdGVuZXJzQ291bnQoKSwgVGVzdENvdW50cnlEZXRlY3Rvci5UT1RBTF9QUk9WSURFUlMpOworICAgICAgICBkZXRlY3Rvci5ub3RpZnlMb2NhdGlvbkZvdW5kKCk7CisgICAgICAgIC8vIEFsbCBsaXN0ZW5lcnMgc2hvdWxkIGJlIHVucmVnaXN0ZXJlZAorICAgICAgICBhc3NlcnRFcXVhbHMoZGV0ZWN0b3IuZ2V0TGlzdGVuZXJzQ291bnQoKSwgMCk7CisgICAgICAgIC8vIFRoZSB0aW1lIHNob3VsZCBiZSBzdG9wcGVkCisgICAgICAgIGFzc2VydE51bGwoZGV0ZWN0b3IuZ2V0VGltZXIoKSk7CisgICAgICAgIFRocmVhZCBxdWVyeVRocmVhZCA9IHdhaXRGb3JRdWVyeVRocmVhZExhdW5jaGVkKGRldGVjdG9yKTsKKyAgICAgICAgZGV0ZWN0b3Iuc3RvcCgpOworICAgICAgICAvLyBUaGVyZSBpcyBubyB3YXkgdG8gc3RvcCB0aGUgdGhyZWFkLCBsZXQncyB0ZXN0IGl0IGNvdWxkIGJlIHN0b3BwZWQsIGFmdGVyIGdldCBjb3VudHJ5CisgICAgICAgIGRldGVjdG9yLm5vdGlmeUNvdW50cnlGb3VuZCgpOworICAgICAgICAvLyBXYWl0IGZvciBxdWVyeSB0aHJlYWQgZW5kaW5nCisgICAgICAgIHdhaXRGb3JUaHJlYWRFbmRpbmcocXVlcnlUaHJlYWQpOworICAgICAgICAvLyBRdWVyeVRocmVhZCBzaG91bGQgYmUgc2V0IHRvIE5VTEwKKyAgICAgICAgYXNzZXJ0TnVsbChkZXRlY3Rvci5nZXRRdWVyeVRocmVhZCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb3VudHJ5TGlzdGVuZXIubm90aWZpZWQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhjb3VudHJ5TGlzdGVuZXIuZ2V0Q291bnRyeSgpLCBjb3VudHJ5KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmluZGluZ0xvY2F0aW9uQ2FuY2VsbGVkKCkgeworICAgICAgICBmaW5hbCBTdHJpbmcgY291bnRyeSA9ICJ1cyI7CisgICAgICAgIGZpbmFsIFN0cmluZyBwcm92aWRlciA9ICJHb29kIjsKKyAgICAgICAgQ291bnRyeUxpc3RlbmVySW1wbCBjb3VudHJ5TGlzdGVuZXIgPSBuZXcgQ291bnRyeUxpc3RlbmVySW1wbCgpOworICAgICAgICBUZXN0Q291bnRyeURldGVjdG9yIGRldGVjdG9yID0gbmV3IFRlc3RDb3VudHJ5RGV0ZWN0b3IoY291bnRyeSwgcHJvdmlkZXIpOworICAgICAgICBkZXRlY3Rvci5zZXRDb3VudHJ5TGlzdGVuZXIoY291bnRyeUxpc3RlbmVyKTsKKyAgICAgICAgZGV0ZWN0b3IuZGV0ZWN0Q291bnRyeSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoZGV0ZWN0b3IuZ2V0TGlzdGVuZXJzQ291bnQoKSwgVGVzdENvdW50cnlEZXRlY3Rvci5UT1RBTF9QUk9WSURFUlMpOworICAgICAgICBkZXRlY3Rvci5zdG9wKCk7CisgICAgICAgIC8vIEFsbCBsaXN0ZW5lcnMgc2hvdWxkIGJlIHVucmVnaXN0ZXJlZAorICAgICAgICBhc3NlcnRFcXVhbHMoZGV0ZWN0b3IuZ2V0TGlzdGVuZXJzQ291bnQoKSwgMCk7CisgICAgICAgIC8vIFRoZSB0aW1lIHNob3VsZCBiZSBzdG9wcGVkCisgICAgICAgIGFzc2VydE51bGwoZGV0ZWN0b3IuZ2V0VGltZXIoKSk7CisgICAgICAgIC8vIFF1ZXJ5VGhyZWFkIHNob3VsZCBzdGlsbCBiZSBOVUxMCisgICAgICAgIGFzc2VydE51bGwoZGV0ZWN0b3IuZ2V0UXVlcnlUaHJlYWQoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKGNvdW50cnlMaXN0ZW5lci5ub3RpZmllZCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmluZGluZ0xvY2F0aW9uRmFpbGVkKCkgeworICAgICAgICBmaW5hbCBTdHJpbmcgY291bnRyeSA9ICJ1cyI7CisgICAgICAgIGZpbmFsIFN0cmluZyBwcm92aWRlciA9ICJHb29kIjsKKyAgICAgICAgbG9uZyB0aW1lb3V0ID0gMTAwMDsKKyAgICAgICAgVGVzdENvdW50cnlEZXRlY3RvciBkZXRlY3RvciA9IG5ldyBUZXN0Q291bnRyeURldGVjdG9yKGNvdW50cnksIHByb3ZpZGVyLCB0aW1lb3V0KSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHByb3RlY3RlZCBMb2NhdGlvbiBnZXRMYXN0S25vd25Mb2NhdGlvbigpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgQ291bnRyeUxpc3RlbmVySW1wbCBjb3VudHJ5TGlzdGVuZXIgPSBuZXcgQ291bnRyeUxpc3RlbmVySW1wbCgpOworICAgICAgICBkZXRlY3Rvci5zZXRDb3VudHJ5TGlzdGVuZXIoY291bnRyeUxpc3RlbmVyKTsKKyAgICAgICAgZGV0ZWN0b3IuZGV0ZWN0Q291bnRyeSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoZGV0ZWN0b3IuZ2V0TGlzdGVuZXJzQ291bnQoKSwgVGVzdENvdW50cnlEZXRlY3Rvci5UT1RBTF9QUk9WSURFUlMpOworICAgICAgICB3YWl0Rm9yVGltZXJSZXNldChkZXRlY3Rvcik7CisgICAgICAgIC8vIEFsbCBsaXN0ZW5lcnMgc2hvdWxkIGJlIHVucmVnaXN0ZXJlZAorICAgICAgICBhc3NlcnRFcXVhbHMoZGV0ZWN0b3IuZ2V0TGlzdGVuZXJzQ291bnQoKSwgMCk7CisgICAgICAgIC8vIFF1ZXJ5VGhyZWFkIHNob3VsZCBzdGlsbCBiZSBOVUxMCisgICAgICAgIGFzc2VydE51bGwoZGV0ZWN0b3IuZ2V0UXVlcnlUaHJlYWQoKSk7CisgICAgICAgIGFzc2VydFRydWUoY291bnRyeUxpc3RlbmVyLm5vdGlmaWVkKCkpOworICAgICAgICBhc3NlcnROdWxsKGNvdW50cnlMaXN0ZW5lci5nZXRDb3VudHJ5KCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RGaW5kaW5nQ291bnRyeUZhaWxlZCgpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGNvdW50cnkgPSAidXMiOworICAgICAgICBmaW5hbCBTdHJpbmcgcHJvdmlkZXIgPSAiR29vZCI7CisgICAgICAgIFRlc3RDb3VudHJ5RGV0ZWN0b3IgZGV0ZWN0b3IgPSBuZXcgVGVzdENvdW50cnlEZXRlY3Rvcihjb3VudHJ5LCBwcm92aWRlcikgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENvdW50cnlGcm9tTG9jYXRpb24oTG9jYXRpb24gbG9jYXRpb24pIHsKKyAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKGNvdW50cnlGb3VuZExvY2tlcikgeworICAgICAgICAgICAgICAgICAgICBpZiAoISBub3RpZnlDb3VudHJ5KSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50cnlGb3VuZExvY2tlci53YWl0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gV2UgZGlkbid0IGZpbmQgY291bnRyeS4KKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgQ291bnRyeUxpc3RlbmVySW1wbCBjb3VudHJ5TGlzdGVuZXIgPSBuZXcgQ291bnRyeUxpc3RlbmVySW1wbCgpOworICAgICAgICBkZXRlY3Rvci5zZXRDb3VudHJ5TGlzdGVuZXIoY291bnRyeUxpc3RlbmVyKTsKKyAgICAgICAgZGV0ZWN0b3IuZGV0ZWN0Q291bnRyeSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoZGV0ZWN0b3IuZ2V0TGlzdGVuZXJzQ291bnQoKSwgVGVzdENvdW50cnlEZXRlY3Rvci5UT1RBTF9QUk9WSURFUlMpOworICAgICAgICBkZXRlY3Rvci5ub3RpZnlMb2NhdGlvbkZvdW5kKCk7CisgICAgICAgIC8vIEFsbCBsaXN0ZW5lcnMgc2hvdWxkIGJlIHVucmVnaXN0ZXJlZAorICAgICAgICBhc3NlcnRFcXVhbHMoZGV0ZWN0b3IuZ2V0TGlzdGVuZXJzQ291bnQoKSwgMCk7CisgICAgICAgIGFzc2VydE51bGwoZGV0ZWN0b3IuZ2V0VGltZXIoKSk7CisgICAgICAgIFRocmVhZCBxdWVyeVRocmVhZCA9IHdhaXRGb3JRdWVyeVRocmVhZExhdW5jaGVkKGRldGVjdG9yKTsKKyAgICAgICAgZGV0ZWN0b3Iubm90aWZ5Q291bnRyeUZvdW5kKCk7CisgICAgICAgIC8vIFdhaXQgZm9yIHF1ZXJ5IHRocmVhZCBlbmRpbmcKKyAgICAgICAgd2FpdEZvclRocmVhZEVuZGluZyhxdWVyeVRocmVhZCk7CisgICAgICAgIC8vIFF1ZXJ5VGhyZWFkIHNob3VsZCBiZSBzZXQgdG8gTlVMTAorICAgICAgICBhc3NlcnROdWxsKGRldGVjdG9yLmdldFF1ZXJ5VGhyZWFkKCkpOworICAgICAgICAvLyBDb3VudHJ5TGlzdGVuZXIgc2hvdWxkIGJlIG5vdGlmaWVkCisgICAgICAgIGFzc2VydFRydWUoY291bnRyeUxpc3RlbmVyLm5vdGlmaWVkKCkpOworICAgICAgICBhc3NlcnROdWxsKGNvdW50cnlMaXN0ZW5lci5nZXRDb3VudHJ5KCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RGaW5kaW5nQ291bnRyeVdpdGhMYXN0S25vd25Mb2NhdGlvbigpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGNvdW50cnkgPSAidXMiOworICAgICAgICBmaW5hbCBTdHJpbmcgcHJvdmlkZXIgPSAiR29vZCI7CisgICAgICAgIGxvbmcgdGltZW91dCA9IDEwMDA7CisgICAgICAgIFRlc3RDb3VudHJ5RGV0ZWN0b3IgZGV0ZWN0b3IgPSBuZXcgVGVzdENvdW50cnlEZXRlY3Rvcihjb3VudHJ5LCBwcm92aWRlciwgdGltZW91dCk7CisgICAgICAgIENvdW50cnlMaXN0ZW5lckltcGwgY291bnRyeUxpc3RlbmVyID0gbmV3IENvdW50cnlMaXN0ZW5lckltcGwoKTsKKyAgICAgICAgZGV0ZWN0b3Iuc2V0Q291bnRyeUxpc3RlbmVyKGNvdW50cnlMaXN0ZW5lcik7CisgICAgICAgIGRldGVjdG9yLmRldGVjdENvdW50cnkoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGRldGVjdG9yLmdldExpc3RlbmVyc0NvdW50KCksIFRlc3RDb3VudHJ5RGV0ZWN0b3IuVE9UQUxfUFJPVklERVJTKTsKKyAgICAgICAgd2FpdEZvclRpbWVyUmVzZXQoZGV0ZWN0b3IpOworICAgICAgICAvLyBBbGwgbGlzdGVuZXJzIHNob3VsZCBiZSB1bnJlZ2lzdGVyZWQKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGRldGVjdG9yLmdldExpc3RlbmVyc0NvdW50KCksIDApOworICAgICAgICBUaHJlYWQgcXVlcnlUaHJlYWQgPSB3YWl0Rm9yUXVlcnlUaHJlYWRMYXVuY2hlZChkZXRlY3Rvcik7CisgICAgICAgIGRldGVjdG9yLm5vdGlmeUNvdW50cnlGb3VuZCgpOworICAgICAgICAvLyBXYWl0IGZvciBxdWVyeSB0aHJlYWQgZW5kaW5nCisgICAgICAgIHdhaXRGb3JUaHJlYWRFbmRpbmcocXVlcnlUaHJlYWQpOworICAgICAgICAvLyBRdWVyeVRocmVhZCBzaG91bGQgYmUgc2V0IHRvIE5VTEwKKyAgICAgICAgYXNzZXJ0TnVsbChkZXRlY3Rvci5nZXRRdWVyeVRocmVhZCgpKTsKKyAgICAgICAgLy8gQ291bnRyeUxpc3RlbmVyIHNob3VsZCBiZSBub3RpZmllZAorICAgICAgICBhc3NlcnRUcnVlKGNvdW50cnlMaXN0ZW5lci5ub3RpZmllZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGNvdW50cnlMaXN0ZW5lci5nZXRDb3VudHJ5KCksIGNvdW50cnkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB3YWl0Rm9yVGltZXJSZXNldChUZXN0Q291bnRyeURldGVjdG9yIGRldGVjdG9yKSB7CisgICAgICAgIGludCBjb3VudCA9IDU7CisgICAgICAgIGxvbmcgaW50ZXJ2YWwgPSAxMDAwOworICAgICAgICB0cnkgeworICAgICAgICAgICAgd2hpbGUgKGNvdW50LS0gPiAwICYmIGRldGVjdG9yLmdldFRpbWVyKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcChpbnRlcnZhbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICBUaW1lciB0aW1lciA9IGRldGVjdG9yLmdldFRpbWVyKCk7CisgICAgICAgIGFzc2VydFRydWUodGltZXIgPT0gbnVsbCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHdhaXRGb3JUaHJlYWRFbmRpbmcoVGhyZWFkIHRocmVhZCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgdGhyZWFkLmpvaW4oNTAwMCk7CisgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIFRocmVhZCB3YWl0Rm9yUXVlcnlUaHJlYWRMYXVuY2hlZChUZXN0Q291bnRyeURldGVjdG9yIGRldGVjdG9yKSB7CisgICAgICAgIGludCBjb3VudCA9IDU7CisgICAgICAgIGxvbmcgaW50ZXJ2YWwgPSAxMDAwOworICAgICAgICB0cnkgeworICAgICAgICAgICAgd2hpbGUgKGNvdW50LS0gPiAwICYmIGRldGVjdG9yLmdldFF1ZXJ5VGhyZWFkKCkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcChpbnRlcnZhbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICBUaHJlYWQgdGhyZWFkID0gZGV0ZWN0b3IuZ2V0UXVlcnlUaHJlYWQoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSh0aHJlYWQgIT0gbnVsbCk7CisgICAgICAgIHJldHVybiB0aHJlYWQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvUGhvbmVOdW1iZXJGb3JtYXR0aW5nVGV4dFdhdGNoZXIuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L1Bob25lTnVtYmVyRm9ybWF0dGluZ1RleHRXYXRjaGVyLmphdmEKaW5kZXggOGE0NzMzOS4uZmZhYmI3YiAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvUGhvbmVOdW1iZXJGb3JtYXR0aW5nVGV4dFdhdGNoZXIuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9QaG9uZU51bWJlckZvcm1hdHRpbmdUZXh0V2F0Y2hlci5qYXZhCkBAIC0xNiw4MyArMTYsMjAwIEBACiAKIHBhY2thZ2UgYW5kcm9pZC50ZWxlcGhvbnk7CiAKK2ltcG9ydCBjb20uZ29vZ2xlLmkxOG4ucGhvbmVudW1iZXJzLkFzWW91VHlwZUZvcm1hdHRlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmkxOG4ucGhvbmVudW1iZXJzLlBob25lTnVtYmVyVXRpbDsKKworaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlBob25lTnVtYmVyVXRpbHM7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LkVkaXRhYmxlOwogaW1wb3J0IGFuZHJvaWQudGV4dC5TZWxlY3Rpb247CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRXYXRjaGVyOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OwogCiBpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKIAogLyoqCi0gKiBXYXRjaGVzIGEge0BsaW5rIFRleHRWaWV3fSBhbmQgaWYgYSBwaG9uZSBudW1iZXIgaXMgZW50ZXJlZCB3aWxsIGZvcm1hdCBpdCB1c2luZwotICoge0BsaW5rIFBob25lTnVtYmVyVXRpbHMjZm9ybWF0TnVtYmVyKEVkaXRhYmxlLCBpbnQpfS4gVGhlIGZvcm1hdHRpbmcgaXMgYmFzZWQgb24KLSAqIHRoZSBjdXJyZW50IHN5c3RlbSBsb2NhbGUgd2hlbiB0aGlzIG9iamVjdCBpcyBjcmVhdGVkIGFuZCBmdXR1cmUgbG9jYWxlIGNoYW5nZXMKLSAqIG1heSBub3QgdGFrZSBlZmZlY3Qgb24gdGhpcyBpbnN0YW5jZS4KKyAqIFdhdGNoZXMgYSB7QGxpbmsgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXd9IGFuZCBpZiBhIHBob25lIG51bWJlciBpcyBlbnRlcmVkCisgKiB3aWxsIGZvcm1hdCBpdC4KKyAqIDxwPgorICogU3RvcCBmb3JtYXR0aW5nIHdoZW4gdGhlIHVzZXIKKyAqIDx1bD4KKyAqIDxsaT5JbnB1dHMgbm9uLWRpYWxhYmxlIGNoYXJhY3RlcnM8L2xpPgorICogPGxpPlJlbW92ZXMgdGhlIHNlcGFyYXRvciBpbiB0aGUgbWlkZGxlIG9mIHN0cmluZy48L2xpPgorICogPC91bD4KKyAqIDxwPgorICogVGhlIGZvcm1hdHRpbmcgd2lsbCBiZSByZXN0YXJ0ZWQgb25jZSB0aGUgdGV4dCBpcyBjbGVhcmVkLgogICovCiBwdWJsaWMgY2xhc3MgUGhvbmVOdW1iZXJGb3JtYXR0aW5nVGV4dFdhdGNoZXIgaW1wbGVtZW50cyBUZXh0V2F0Y2hlciB7CisgICAgLyoqCisgICAgICogT25lIG9yIG1vcmUgY2hhcmFjdGVycyB3ZXJlIHJlbW92ZWQgZnJvbSB0aGUgZW5kLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBTVEFURV9SRU1PVkVfTEFTVCA9IDA7CiAKLSAgICBzdGF0aWMgcHJpdmF0ZSBpbnQgc0Zvcm1hdFR5cGU7Ci0gICAgc3RhdGljIHByaXZhdGUgTG9jYWxlIHNDYWNoZWRMb2NhbGU7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1Gb3JtYXR0aW5nOwotICAgIHByaXZhdGUgYm9vbGVhbiBtRGVsZXRpbmdIeXBoZW47Ci0gICAgcHJpdmF0ZSBpbnQgbUh5cGhlblN0YXJ0OwotICAgIHByaXZhdGUgYm9vbGVhbiBtRGVsZXRpbmdCYWNrd2FyZDsKKyAgICAvKioKKyAgICAgKiBPbmUgb3IgbW9yZSBjaGFyYWN0ZXJzIHdlcmUgYXBwZW5kZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IFNUQVRFX0FQUEVORCA9IDE7CiAKKyAgICAvKioKKyAgICAgKiBPbmUgb3IgbW9yZSBkaWdpdHMgd2VyZSBjaGFuZ2VkIGluIHRoZSBiZWdpbm5pbmcgb3IgdGhlIG1pZGRsZSBvZiB0ZXh0LgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBTVEFURV9NT0RJRllfRElHSVRTID0gMjsKKworICAgIC8qKgorICAgICAqIFRoZSBjaGFuZ2VzIG90aGVyIHRoYW4gdGhlIGFib3ZlLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBTVEFURV9PVEhFUiA9IDM7CisKKyAgICAvKioKKyAgICAgKiBUaGUgc3RhdGUgb2YgdGhpcyBjaGFuZ2UgY291bGQgYmUgb25lIHZhbHVlIG9mIHRoZSBhYm92ZQorICAgICAqLworICAgIHByaXZhdGUgaW50IG1TdGF0ZTsKKworICAgIC8qKgorICAgICAqIEluZGljYXRlcyB0aGUgY2hhbmdlIHdhcyBjYXVzZWQgYnkgb3Vyc2VsdmVzLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBtU2VsZkNoYW5nZSA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIHRoZSBmb3JtYXR0aW5nIGhhcyBiZWVuIHN0b3BwZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIG1TdG9wRm9ybWF0dGluZzsKKworICAgIHByaXZhdGUgQXNZb3VUeXBlRm9ybWF0dGVyIG1Gb3JtYXR0ZXI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgZm9ybWF0dGluZyBpcyBiYXNlZCBvbiB0aGUgY3VycmVudCBzeXN0ZW0gbG9jYWxlIGFuZCBmdXR1cmUgbG9jYWxlIGNoYW5nZXMKKyAgICAgKiBtYXkgbm90IHRha2UgZWZmZWN0IG9uIHRoaXMgaW5zdGFuY2UuCisgICAgICovCiAgICAgcHVibGljIFBob25lTnVtYmVyRm9ybWF0dGluZ1RleHRXYXRjaGVyKCkgewotICAgICAgICBpZiAoc0NhY2hlZExvY2FsZSA9PSBudWxsIHx8IHNDYWNoZWRMb2NhbGUgIT0gTG9jYWxlLmdldERlZmF1bHQoKSkgewotICAgICAgICAgICAgc0NhY2hlZExvY2FsZSA9IExvY2FsZS5nZXREZWZhdWx0KCk7Ci0gICAgICAgICAgICBzRm9ybWF0VHlwZSA9IFBob25lTnVtYmVyVXRpbHMuZ2V0Rm9ybWF0VHlwZUZvckxvY2FsZShzQ2FjaGVkTG9jYWxlKTsKLSAgICAgICAgfQorICAgICAgICB0aGlzKExvY2FsZS5nZXREZWZhdWx0KCkuZ2V0Q291bnRyeSgpKTsKICAgICB9CiAKLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWZ0ZXJUZXh0Q2hhbmdlZChFZGl0YWJsZSB0ZXh0KSB7Ci0gICAgICAgIC8vIE1ha2Ugc3VyZSB0byBpZ25vcmUgY2FsbHMgdG8gYWZ0ZXJUZXh0Q2hhbmdlZCBjYXVzZWQgYnkgdGhlIHdvcmsgZG9uZSBiZWxvdwotICAgICAgICBpZiAoIW1Gb3JtYXR0aW5nKSB7Ci0gICAgICAgICAgICBtRm9ybWF0dGluZyA9IHRydWU7Ci0KLSAgICAgICAgICAgIC8vIElmIGRlbGV0aW5nIHRoZSBoeXBoZW4sIGFsc28gZGVsZXRlIHRoZSBjaGFyIGJlZm9yZSBvciBhZnRlciB0aGF0Ci0gICAgICAgICAgICBpZiAobURlbGV0aW5nSHlwaGVuICYmIG1IeXBoZW5TdGFydCA+IDApIHsKLSAgICAgICAgICAgICAgICBpZiAobURlbGV0aW5nQmFja3dhcmQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1IeXBoZW5TdGFydCAtIDEgPCB0ZXh0Lmxlbmd0aCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0LmRlbGV0ZShtSHlwaGVuU3RhcnQgLSAxLCBtSHlwaGVuU3RhcnQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtSHlwaGVuU3RhcnQgPCB0ZXh0Lmxlbmd0aCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRleHQuZGVsZXRlKG1IeXBoZW5TdGFydCwgbUh5cGhlblN0YXJ0ICsgMSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmZvcm1hdE51bWJlcih0ZXh0LCBzRm9ybWF0VHlwZSk7Ci0KLSAgICAgICAgICAgIG1Gb3JtYXR0aW5nID0gZmFsc2U7Ci0gICAgICAgIH0KKyAgICAvKioKKyAgICAgKiBUaGUgZm9ybWF0dGluZyBpcyBiYXNlZCBvbiB0aGUgZ2l2ZW4gPGNvZGU+Y291bnRyeUNvZGU8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIGNvdW50cnlDb2RlIHRoZSBJU08gMzE2Ni0xIHR3by1sZXR0ZXIgY291bnRyeSBjb2RlIHRoYXQgaW5kaWNhdGVzIHRoZSBjb3VudHJ5L3JlZ2lvbgorICAgICAqIHdoZXJlIHRoZSBwaG9uZSBudW1iZXIgaXMgYmVpbmcgZW50ZXJlZC4KKyAgICAgKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIFBob25lTnVtYmVyRm9ybWF0dGluZ1RleHRXYXRjaGVyKFN0cmluZyBjb3VudHJ5Q29kZSkgeworICAgICAgICBpZiAoY291bnRyeUNvZGUgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICBtRm9ybWF0dGVyID0gUGhvbmVOdW1iZXJVdGlsLmdldEluc3RhbmNlKCkuZ2V0QXNZb3VUeXBlRm9ybWF0dGVyKGNvdW50cnlDb2RlKTsKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBiZWZvcmVUZXh0Q2hhbmdlZChDaGFyU2VxdWVuY2UgcywgaW50IHN0YXJ0LCBpbnQgY291bnQsIGludCBhZnRlcikgewotICAgICAgICAvLyBDaGVjayBpZiB0aGUgdXNlciBpcyBkZWxldGluZyBhIGh5cGhlbgotICAgICAgICBpZiAoIW1Gb3JtYXR0aW5nKSB7Ci0gICAgICAgICAgICAvLyBNYWtlIHN1cmUgdXNlciBpcyBkZWxldGluZyBvbmUgY2hhciwgd2l0aG91dCBhIHNlbGVjdGlvbgotICAgICAgICAgICAgZmluYWwgaW50IHNlbFN0YXJ0ID0gU2VsZWN0aW9uLmdldFNlbGVjdGlvblN0YXJ0KHMpOwotICAgICAgICAgICAgZmluYWwgaW50IHNlbEVuZCA9IFNlbGVjdGlvbi5nZXRTZWxlY3Rpb25FbmQocyk7Ci0gICAgICAgICAgICBpZiAocy5sZW5ndGgoKSA+IDEgLy8gQ2FuIGRlbGV0ZSBhbm90aGVyIGNoYXJhY3RlcgotICAgICAgICAgICAgICAgICAgICAmJiBjb3VudCA9PSAxIC8vIERlbGV0aW5nIG9ubHkgb25lIGNoYXJhY3RlcgotICAgICAgICAgICAgICAgICAgICAmJiBhZnRlciA9PSAwIC8vIERlbGV0aW5nCi0gICAgICAgICAgICAgICAgICAgICYmIHMuY2hhckF0KHN0YXJ0KSA9PSAnLScgLy8gYSBoeXBoZW4KLSAgICAgICAgICAgICAgICAgICAgJiYgc2VsU3RhcnQgPT0gc2VsRW5kKSB7IC8vIG5vIHNlbGVjdGlvbgotICAgICAgICAgICAgICAgIG1EZWxldGluZ0h5cGhlbiA9IHRydWU7Ci0gICAgICAgICAgICAgICAgbUh5cGhlblN0YXJ0ID0gc3RhcnQ7Ci0gICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHVzZXIgaXMgZGVsZXRpbmcgZm9yd2FyZCBvciBiYWNrd2FyZAotICAgICAgICAgICAgICAgIGlmIChzZWxTdGFydCA9PSBzdGFydCArIDEpIHsKLSAgICAgICAgICAgICAgICAgICAgbURlbGV0aW5nQmFja3dhcmQgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG1EZWxldGluZ0JhY2t3YXJkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtRGVsZXRpbmdIeXBoZW4gPSBmYWxzZTsKLSAgICAgICAgICAgIH0KKyAgICBwdWJsaWMgdm9pZCBiZWZvcmVUZXh0Q2hhbmdlZChDaGFyU2VxdWVuY2UgcywgaW50IHN0YXJ0LCBpbnQgY291bnQsCisgICAgICAgICAgICBpbnQgYWZ0ZXIpIHsKKyAgICAgICAgaWYgKG1TZWxmQ2hhbmdlIHx8IG1TdG9wRm9ybWF0dGluZykgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmIChjb3VudCA9PSAwICYmIHMubGVuZ3RoKCkgPT0gc3RhcnQpIHsKKyAgICAgICAgICAgIC8vIEFwcGVuZCBvbmUgb3IgbW9yZSBuZXcgY2hhcnMKKyAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX0FQUEVORDsKKyAgICAgICAgfSBlbHNlIGlmIChhZnRlciA9PSAwICYmIHN0YXJ0ICsgY291bnQgPT0gcy5sZW5ndGgoKSAmJiBjb3VudCA+IDApIHsKKyAgICAgICAgICAgIC8vIFJlbW92ZSBvbmUgb3IgbW9yZSBjaGFycyBmcm9tIHRoZSBlbmQgb2Ygc3RyaW5nLgorICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfUkVNT1ZFX0xBU1Q7CisgICAgICAgIH0gZWxzZSBpZiAoY291bnQgPiAwICYmICFoYXNTZXBhcmF0b3Iocywgc3RhcnQsIGNvdW50KSkgeworICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBkaWFsYWJsZSBjaGFycyBpbiB0aGUgYmVnaW4gb3IgbWlkZGxlIG9mIHRleHQuCisgICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9NT0RJRllfRElHSVRTOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfT1RIRVI7CiAgICAgICAgIH0KICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBvblRleHRDaGFuZ2VkKENoYXJTZXF1ZW5jZSBzLCBpbnQgc3RhcnQsIGludCBiZWZvcmUsIGludCBjb3VudCkgewotICAgICAgICAvLyBEb2VzIG5vdGhpbmcKKyAgICAgICAgaWYgKG1TZWxmQ2hhbmdlIHx8IG1TdG9wRm9ybWF0dGluZykgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmIChtU3RhdGUgPT0gU1RBVEVfT1RIRVIpIHsKKyAgICAgICAgICAgIGlmIChjb3VudCA+IDAgJiYgIWhhc1NlcGFyYXRvcihzLCBzdGFydCwgY291bnQpKSB7CisgICAgICAgICAgICAgICAgLy8gVXNlciBpbnNlcnRlZCB0aGUgZGlhbGFibGUgY2hhcmFjdGVycyBpbiB0aGUgbWlkZGxlIG9mIHRleHQuCisgICAgICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfTU9ESUZZX0RJR0lUUzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBDaGVjayB3aGV0aGVyIHdlIHNob3VsZCBzdG9wIGZvcm1hdHRpbmcuCisgICAgICAgIGlmIChtU3RhdGUgPT0gU1RBVEVfQVBQRU5EICYmIGNvdW50ID4gMCAmJiBoYXNTZXBhcmF0b3Iocywgc3RhcnQsIGNvdW50KSkgeworICAgICAgICAgICAgLy8gVXNlciBhcHBlbmRlZCB0aGUgbm9uLWRpYWxhYmxlIGNoYXJhY3Rlciwgc3RvcCBmb3JtYXR0aW5nLgorICAgICAgICAgICAgc3RvcEZvcm1hdHRpbmcoKTsKKyAgICAgICAgfSBlbHNlIGlmIChtU3RhdGUgPT0gU1RBVEVfT1RIRVIpIHsKKyAgICAgICAgICAgIC8vIFVzZXIgbXVzdCBpbnNlcnQgb3IgcmVtb3ZlIHRoZSBub24tZGlhbGFibGUgY2hhcmFjdGVycyBpbiB0aGUgYmVnaW4gb3IgbWlkZGxlIG9mCisgICAgICAgICAgICAvLyBudW1iZXIsIHN0b3AgZm9ybWF0dGluZy4KKyAgICAgICAgICAgIHN0b3BGb3JtYXR0aW5nKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWZ0ZXJUZXh0Q2hhbmdlZChFZGl0YWJsZSBzKSB7CisgICAgICAgIGlmIChtU3RvcEZvcm1hdHRpbmcpIHsKKyAgICAgICAgICAgIC8vIFJlc3RhcnQgdGhlIGZvcm1hdHRpbmcgd2hlbiBhbGwgdGV4dHMgd2VyZSBjbGVhci4KKyAgICAgICAgICAgIG1TdG9wRm9ybWF0dGluZyA9ICEocy5sZW5ndGgoKSA9PSAwKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAobVNlbGZDaGFuZ2UpIHsKKyAgICAgICAgICAgIC8vIElnbm9yZSB0aGUgY2hhbmdlIGNhdXNlZCBieSBzLnJlcGxhY2UoKS4KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgZm9ybWF0dGVkID0gcmVmb3JtYXQocywgU2VsZWN0aW9uLmdldFNlbGVjdGlvbkVuZChzKSk7CisgICAgICAgIGlmIChmb3JtYXR0ZWQgIT0gbnVsbCkgeworICAgICAgICAgICAgaW50IHJlbWVtYmVyZWRQb3MgPSBtRm9ybWF0dGVyLmdldFJlbWVtYmVyZWRQb3NpdGlvbigpOworICAgICAgICAgICAgbVNlbGZDaGFuZ2UgPSB0cnVlOworICAgICAgICAgICAgcy5yZXBsYWNlKDAsIHMubGVuZ3RoKCksIGZvcm1hdHRlZCwgMCwgZm9ybWF0dGVkLmxlbmd0aCgpKTsKKyAgICAgICAgICAgIC8vIFRoZSB0ZXh0IGNvdWxkIGJlIGNoYW5nZWQgYnkgb3RoZXIgVGV4dFdhdGNoZXIgYWZ0ZXIgd2UgY2hhbmdlZCBpdC4gSWYgd2UgZm91bmQgdGhlCisgICAgICAgICAgICAvLyB0ZXh0IGlzIG5vdCB0aGUgb25lIHdlIHdlcmUgZXhwZWN0aW5nLCBqdXN0IGdpdmUgdXAgY2FsbGluZyBzZXRTZWxlY3Rpb24oKS4KKyAgICAgICAgICAgIGlmIChmb3JtYXR0ZWQuZXF1YWxzKHMudG9TdHJpbmcoKSkpIHsKKyAgICAgICAgICAgICAgICBTZWxlY3Rpb24uc2V0U2VsZWN0aW9uKHMsIHJlbWVtYmVyZWRQb3MpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVNlbGZDaGFuZ2UgPSBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdlbmVyYXRlIHRoZSBmb3JtYXR0ZWQgbnVtYmVyIGJ5IGlnbm9yaW5nIGFsbCBub24tZGlhbGFibGUgY2hhcnMgYW5kIHN0aWNrIHRoZSBjdXJzb3IgdG8gdGhlCisgICAgICogbmVhcmVzdCBkaWFsYWJsZSBjaGFyIHRvIHRoZSBsZWZ0LiBGb3IgaW5zdGFuY2UsIGlmIHRoZSBudW1iZXIgaXMgICg2NTApIDEyMy00NTY3OCBhbmQgJzQnIGlzCisgICAgICogcmVtb3ZlZCB0aGVuIHRoZSBjdXJzb3Igc2hvdWxkIGJlIGJlaGluZCAnMycgaW5zdGVhZCBvZiAnLScuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgcmVmb3JtYXQoQ2hhclNlcXVlbmNlIHMsIGludCBjdXJzb3IpIHsKKyAgICAgICAgLy8gVGhlIGluZGV4IG9mIGNoYXIgdG8gdGhlIGxlZnR3YXJkIG9mIHRoZSBjdXJzb3IuCisgICAgICAgIGludCBjdXJJbmRleCA9IGN1cnNvciAtIDE7CisgICAgICAgIFN0cmluZyBmb3JtYXR0ZWQgPSBudWxsOworICAgICAgICBtRm9ybWF0dGVyLmNsZWFyKCk7CisgICAgICAgIGNoYXIgbGFzdE5vblNlcGFyYXRvciA9IDA7CisgICAgICAgIGJvb2xlYW4gaGFzQ3Vyc29yID0gZmFsc2U7CisgICAgICAgIGludCBsZW4gPSBzLmxlbmd0aCgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICAgICAgICBjaGFyIGMgPSBzLmNoYXJBdChpKTsKKyAgICAgICAgICAgIGlmIChQaG9uZU51bWJlclV0aWxzLmlzTm9uU2VwYXJhdG9yKGMpKSB7CisgICAgICAgICAgICAgICAgaWYgKGxhc3ROb25TZXBhcmF0b3IgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBmb3JtYXR0ZWQgPSBnZXRGb3JtYXR0ZWROdW1iZXIobGFzdE5vblNlcGFyYXRvciwgaGFzQ3Vyc29yKTsKKyAgICAgICAgICAgICAgICAgICAgaGFzQ3Vyc29yID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxhc3ROb25TZXBhcmF0b3IgPSBjOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGkgPT0gY3VySW5kZXgpIHsKKyAgICAgICAgICAgICAgICBoYXNDdXJzb3IgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChsYXN0Tm9uU2VwYXJhdG9yICE9IDApIHsKKyAgICAgICAgICAgIGZvcm1hdHRlZCA9IGdldEZvcm1hdHRlZE51bWJlcihsYXN0Tm9uU2VwYXJhdG9yLCBoYXNDdXJzb3IpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmb3JtYXR0ZWQ7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0Rm9ybWF0dGVkTnVtYmVyKGNoYXIgbGFzdE5vblNlcGFyYXRvciwgYm9vbGVhbiBoYXNDdXJzb3IpIHsKKyAgICAgICAgcmV0dXJuIGhhc0N1cnNvciA/IG1Gb3JtYXR0ZXIuaW5wdXREaWdpdEFuZFJlbWVtYmVyUG9zaXRpb24obGFzdE5vblNlcGFyYXRvcikKKyAgICAgICAgICAgICAgICA6IG1Gb3JtYXR0ZXIuaW5wdXREaWdpdChsYXN0Tm9uU2VwYXJhdG9yKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc3RvcEZvcm1hdHRpbmcoKSB7CisgICAgICAgIG1TdG9wRm9ybWF0dGluZyA9IHRydWU7CisgICAgICAgIG1Gb3JtYXR0ZXIuY2xlYXIoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaGFzU2VwYXJhdG9yKGZpbmFsIENoYXJTZXF1ZW5jZSBzLCBmaW5hbCBpbnQgc3RhcnQsIGZpbmFsIGludCBjb3VudCkgeworICAgICAgICBmb3IgKGludCBpID0gc3RhcnQ7IGkgPCBzdGFydCArIGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIGNoYXIgYyA9IHMuY2hhckF0KGkpOworICAgICAgICAgICAgaWYgKCFQaG9uZU51bWJlclV0aWxzLmlzTm9uU2VwYXJhdG9yKGMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L1Bob25lTnVtYmVyVXRpbHMuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L1Bob25lTnVtYmVyVXRpbHMuamF2YQppbmRleCA3ODI5MDA2Li5iMGZhMGY1IDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9QaG9uZU51bWJlclV0aWxzLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvUGhvbmVOdW1iZXJVdGlscy5qYXZhCkBAIC0xNiw2ICsxNiwxMSBAQAogCiBwYWNrYWdlIGFuZHJvaWQudGVsZXBob255OwogCitpbXBvcnQgY29tLmdvb2dsZS5pMThuLnBob25lbnVtYmVycy5OdW1iZXJQYXJzZUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmkxOG4ucGhvbmVudW1iZXJzLlBob25lTnVtYmVyVXRpbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmkxOG4ucGhvbmVudW1iZXJzLlBob25lTnVtYmVyVXRpbC5QaG9uZU51bWJlckZvcm1hdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmkxOG4ucGhvbmVudW1iZXJzLlBob25lbnVtYmVyLlBob25lTnVtYmVyOworCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcjsKQEAgLTYxNyw3ICs2MjIsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLy8gSW4gdGhlIFVTLCAxLTY1MC01NTUtMTIzNCBtdXN0IGJlIGVxdWFsIHRvIDY1MC01NTUtMTIzNCwKLSAgICAgICAgICAgIC8vIHdoaWxlIDA5MC0xMjM0LTEyMzQgbXVzdCBub3QgYmUgZXF1YWx0IHRvIDkwLTEyMzQtMTIzNCBpbiBKYXBhbi4KKyAgICAgICAgICAgIC8vIHdoaWxlIDA5MC0xMjM0LTEyMzQgbXVzdCBub3QgYmUgZXF1YWwgdG8gOTAtMTIzNC0xMjM0IGluIEphcGFuLgogICAgICAgICAgICAgLy8gVGhpcyByZXF1ZXN0IGV4aXN0cyBqdXN0IGluIFVTICh3aXRoIDEgdHJ1bmsgKE5ERCkgcHJlZml4KS4KICAgICAgICAgICAgIC8vIEluIGFkZGl0aW9uLCAiMDExIDExIDcwMDU1NTQxNDEiIG11c3Qgbm90IGVxdWFsIHRvICIrMTcwMDU1NTQxNDEiLAogICAgICAgICAgICAgLy8gd2hpbGUgIjAxMSAxIDcwMDU1NTQxNDEiIG11c3QgZXF1YWwgdG8gIisxNzAwNTU1NDE0MSIKQEAgLTc3OSwxMCArNzg0LDEwIEBACiAgICAgICAgIGlmIChwcmVwZW5kUGx1cykgewogICAgICAgICAgICAgLy8gVGhpcyBpcyBhbiAiaW50ZXJuYXRpb25hbCBudW1iZXIiIGFuZCBzaG91bGQgaGF2ZQogICAgICAgICAgICAgLy8gYSBwbHVzIHByZXBlbmRlZCB0byB0aGUgZGlhbGluZyBudW1iZXIuIEJ1dCB0aGVyZQotICAgICAgICAgICAgLy8gY2FuIGFsc28gYmUgR3NtIE1NSSBjb2RlcyBhcyBkZWZpbmVkIGluIFRTIDIyLjAzMCA2LjUuMgorICAgICAgICAgICAgLy8gY2FuIGFsc28gYmUgR1NNIE1NSSBjb2RlcyBhcyBkZWZpbmVkIGluIFRTIDIyLjAzMCA2LjUuMgogICAgICAgICAgICAgLy8gc28gd2UgbmVlZCB0byBoYW5kbGUgdGhvc2UgYWxzby4KICAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyBodHRwOi8vd2ViLnRlbGlhLmNvbS9+dTQ3OTA0Nzc2L2dzbWtvZGUuaHRtIGlzIGEKKyAgICAgICAgICAgIC8vIGh0dHA6Ly93ZWIudGVsaWEuY29tL351NDc5MDQ3NzYvZ3Nta29kZS5odG0KICAgICAgICAgICAgIC8vIGhhcyBhIG5pY2UgbGlzdCBvZiBzb21lIG9mIHRoZXNlIEdTTSBjb2Rlcy4KICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAvLyBFeGFtcGxlcyBhcmU6CkBAIC04NzAsMTAgKzg3NSwxMCBAQAogCiAgICAgICAgICAgICAvLyBGSVhNRShta2YpIFRTIDIzLjA0MCA5LjEuMi4zIHNheXMKICAgICAgICAgICAgIC8vICJpZiBhIG1vYmlsZSByZWNlaXZlcyAxMTExIGluIGEgcG9zaXRpb24gcHJpb3IgdG8KLSAgICAgICAgICAgIC8vIHRoZSBsYXN0IHNlbWktb2N0ZXQgdGhlbiBwcm9jZXNzaW5nIHNoYWxsIGNvbW1lbnNlIHdpdGgKKyAgICAgICAgICAgIC8vIHRoZSBsYXN0IHNlbWktb2N0ZXQgdGhlbiBwcm9jZXNzaW5nIHNoYWxsIGNvbW1lbmNlIHdpdGgKICAgICAgICAgICAgIC8vIHRoZSBuZXh0IHNlbWktb2N0ZXQgYW5kIHRoZSBpbnRlcnZlbmluZwogICAgICAgICAgICAgLy8gc2VtaS1vY3RldCBzaGFsbCBiZSBpZ25vcmVkIgotICAgICAgICAgICAgLy8gSG93IGRvZXMgdGhpcyBqaXZlIHdpdGggMjQsMDA4IDEwLjUuNC43CisgICAgICAgICAgICAvLyBIb3cgZG9lcyB0aGlzIGppdmUgd2l0aCAyNC4wMDggMTAuNS40LjcKIAogICAgICAgICAgICAgYiA9IChieXRlKSgoYnl0ZXNbaV0gPj4gNCkgJiAweGYpOwogCkBAIC0xMDA0LDcgKzEwMDksNyBAQAogICAgICAqIENvbnZlcnQgYSBkaWFsaW5nIG51bWJlciB0byBCQ0QgYnl0ZSBhcnJheQogICAgICAqCiAgICAgICogQHBhcmFtIG51bWJlciBkaWFsaW5nIG51bWJlciBzdHJpbmcKLSAgICAgKiAgICAgICAgaWYgdGhlIGRpYWxpbmcgbnVtYmVyIHN0YXJ0cyB3aXRoICcrJywgc2V0IHRvIGludGVybmF0aW9ubCBUT0EKKyAgICAgKiAgICAgICAgaWYgdGhlIGRpYWxpbmcgbnVtYmVyIHN0YXJ0cyB3aXRoICcrJywgc2V0IHRvIGludGVybmF0aW9uYWwgVE9BCiAgICAgICogQHJldHVybiBCQ0QgYnl0ZSBhcnJheQogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgYnl0ZVtdCkBAIC0xMTA4LDEwICsxMTEzLDEwIEBACiAgICAgICoKICAgICAgKiBAcGFyYW0gc291cmNlIHRoZSBwaG9uZSBudW1iZXIgdG8gZm9ybWF0CiAgICAgICogQHBhcmFtIGRlZmF1bHRGb3JtYXR0aW5nVHlwZSBUaGUgZGVmYXVsdCBmb3JtYXR0aW5nIHJ1bGVzIHRvIGFwcGx5IGlmIHRoZSBudW1iZXIgZG9lcwotICAgICAqIG5vdCBiZWdpbiB3aXRoICs8Y291bnRyeV9jb2RlPgorICAgICAqIG5vdCBiZWdpbiB3aXRoICtbY291bnRyeV9jb2RlXQogICAgICAqIEByZXR1cm4gVGhlIHBob25lIG51bWJlciBmb3JtYXR0ZWQgd2l0aCB0aGUgZ2l2ZW4gZm9ybWF0dGluZyB0eXBlLgogICAgICAqCi0gICAgICogQGhpZGUgVE9ETzpTaHVvbGQgYmUgdW5oaWRkZW4uCisgICAgICogQGhpZGUgVE9ETzogU2hvdWxkIGJlIHVuaGlkZGVuLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGZvcm1hdE51bWJlcihTdHJpbmcgc291cmNlLCBpbnQgZGVmYXVsdEZvcm1hdHRpbmdUeXBlKSB7CiAgICAgICAgIFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIgdGV4dCA9IG5ldyBTcGFubmFibGVTdHJpbmdCdWlsZGVyKHNvdXJjZSk7CkBAIC0xMTM4LDcgKzExNDMsNyBAQAogICAgICAqCiAgICAgICogQHBhcmFtIHRleHQgVGhlIG51bWJlciB0byBiZSBmb3JtYXR0ZWQsIHdpbGwgYmUgbW9kaWZpZWQgd2l0aCB0aGUgZm9ybWF0dGluZwogICAgICAqIEBwYXJhbSBkZWZhdWx0Rm9ybWF0dGluZ1R5cGUgVGhlIGRlZmF1bHQgZm9ybWF0dGluZyBydWxlcyB0byBhcHBseSBpZiB0aGUgbnVtYmVyIGRvZXMKLSAgICAgKiBub3QgYmVnaW4gd2l0aCArPGNvdW50cnlfY29kZT4KKyAgICAgKiBub3QgYmVnaW4gd2l0aCArW2NvdW50cnlfY29kZV0KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIHZvaWQgZm9ybWF0TnVtYmVyKEVkaXRhYmxlIHRleHQsIGludCBkZWZhdWx0Rm9ybWF0dGluZ1R5cGUpIHsKICAgICAgICAgaW50IGZvcm1hdFR5cGUgPSBkZWZhdWx0Rm9ybWF0dGluZ1R5cGU7CkBAIC0xMzE5LDYgKzEzMjQsODggQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIC8qKgorICAgICAqIEZvcm1hdCB0aGUgZ2l2ZW4gcGhvbmVOdW1iZXIgdG8gdGhlIEUuMTY0IHJlcHJlc2VudGF0aW9uLgorICAgICAqIDxwPgorICAgICAqIFRoZSBnaXZlbiBwaG9uZSBudW1iZXIgbXVzdCBoYXZlIGFuIGFyZWEgY29kZSBhbmQgY291bGQgaGF2ZSBhIGNvdW50cnkKKyAgICAgKiBjb2RlLgorICAgICAqIDxwPgorICAgICAqIFRoZSBkZWZhdWx0Q291bnRyeUlzbyBpcyB1c2VkIHRvIHZhbGlkYXRlIHRoZSBnaXZlbiBudW1iZXIgYW5kIGdlbmVyYXRlCisgICAgICogdGhlIEUuMTY0IHBob25lIG51bWJlciBpZiB0aGUgZ2l2ZW4gbnVtYmVyIGRvZXNuJ3QgaGF2ZSBhIGNvdW50cnkgY29kZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwaG9uZU51bWJlcgorICAgICAqICAgICAgICAgICAgdGhlIHBob25lIG51bWJlciB0byBmb3JtYXQKKyAgICAgKiBAcGFyYW0gZGVmYXVsdENvdW50cnlJc28KKyAgICAgKiAgICAgICAgICAgIHRoZSBJU08gMzE2Ni0xIHR3byBsZXR0ZXJzIGNvdW50cnkgY29kZQorICAgICAqIEByZXR1cm4gdGhlIEUuMTY0IHJlcHJlc2VudGF0aW9uLCBvciBudWxsIGlmIHRoZSBnaXZlbiBwaG9uZSBudW1iZXIgaXMKKyAgICAgKiAgICAgICAgIG5vdCB2YWxpZC4KKyAgICAgKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZm9ybWF0TnVtYmVyVG9FMTY0KFN0cmluZyBwaG9uZU51bWJlciwgU3RyaW5nIGRlZmF1bHRDb3VudHJ5SXNvKSB7CisgICAgICAgIFBob25lTnVtYmVyVXRpbCB1dGlsID0gUGhvbmVOdW1iZXJVdGlsLmdldEluc3RhbmNlKCk7CisgICAgICAgIFN0cmluZyByZXN1bHQgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgUGhvbmVOdW1iZXIgcG4gPSB1dGlsLnBhcnNlKHBob25lTnVtYmVyLCBkZWZhdWx0Q291bnRyeUlzbyk7CisgICAgICAgICAgICBpZiAodXRpbC5pc1ZhbGlkTnVtYmVyKHBuKSkgeworICAgICAgICAgICAgICAgIHJlc3VsdCA9IHV0aWwuZm9ybWF0KHBuLCBQaG9uZU51bWJlckZvcm1hdC5FMTY0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoTnVtYmVyUGFyc2VFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogRm9ybWF0IGEgcGhvbmUgbnVtYmVyLgorICAgICAqIDxwPgorICAgICAqIElmIHRoZSBnaXZlbiBudW1iZXIgZG9lc24ndCBoYXZlIHRoZSBjb3VudHJ5IGNvZGUsIHRoZSBwaG9uZSB3aWxsIGJlCisgICAgICogZm9ybWF0dGVkIHRvIHRoZSBkZWZhdWx0IGNvdW50cnkncyBjb252ZW50aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIHBob25lTnVtYmVyCisgICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIHRvIGJlIGZvcm1hdHRlZC4KKyAgICAgKiBAcGFyYW0gZGVmYXVsdENvdW50cnlJc28KKyAgICAgKiAgICAgICAgICAgIHRoZSBJU08gMzE2Ni0xIHR3byBsZXR0ZXJzIGNvdW50cnkgY29kZSB3aG9zZSBjb252ZW50aW9uIHdpbGwKKyAgICAgKiAgICAgICAgICAgIGJlIHVzZWQgaWYgdGhlIGdpdmVuIG51bWJlciBkb2Vzbid0IGhhdmUgdGhlIGNvdW50cnkgY29kZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBmb3JtYXR0ZWQgbnVtYmVyLCBvciBudWxsIGlmIHRoZSBnaXZlbiBudW1iZXIgaXMgbm90IHZhbGlkLgorICAgICAqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBmb3JtYXROdW1iZXIoU3RyaW5nIHBob25lTnVtYmVyLCBTdHJpbmcgZGVmYXVsdENvdW50cnlJc28pIHsKKyAgICAgICAgUGhvbmVOdW1iZXJVdGlsIHV0aWwgPSBQaG9uZU51bWJlclV0aWwuZ2V0SW5zdGFuY2UoKTsKKyAgICAgICAgU3RyaW5nIHJlc3VsdCA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBQaG9uZU51bWJlciBwbiA9IHV0aWwucGFyc2UocGhvbmVOdW1iZXIsIGRlZmF1bHRDb3VudHJ5SXNvKTsKKyAgICAgICAgICAgIHJlc3VsdCA9IHV0aWwuZm9ybWF0SW5PcmlnaW5hbEZvcm1hdChwbiwgZGVmYXVsdENvdW50cnlJc28pOworICAgICAgICB9IGNhdGNoIChOdW1iZXJQYXJzZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBOb3JtYWxpemUgYSBwaG9uZSBudW1iZXIgYnkgcmVtb3ZpbmcgdGhlIGNoYXJhY3RlcnMgb3RoZXIgdGhhbiBkaWdpdHMuIElmCisgICAgICogdGhlIGdpdmVuIG51bWJlciBoYXMga2V5cGFkIGxldHRlcnMsIHRoZSBsZXR0ZXJzIHdpbGwgYmUgY29udmVydGVkIHRvCisgICAgICogZGlnaXRzIGZpcnN0LgorICAgICAqCisgICAgICogQHBhcmFtIHBob25lTnVtYmVyCisgICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIHRvIGJlIG5vcm1hbGl6ZWQuCisgICAgICogQHJldHVybiB0aGUgbm9ybWFsaXplZCBudW1iZXIuCisgICAgICoKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIG5vcm1hbGl6ZU51bWJlcihTdHJpbmcgcGhvbmVOdW1iZXIpIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIGludCBsZW4gPSBwaG9uZU51bWJlci5sZW5ndGgoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgICAgICAgICAgY2hhciBjID0gcGhvbmVOdW1iZXIuY2hhckF0KGkpOworICAgICAgICAgICAgaWYgKChpID09IDAgJiYgYyA9PSAnKycpIHx8IFBob25lTnVtYmVyVXRpbHMuaXNJU09EaWdpdChjKSkgeworICAgICAgICAgICAgICAgIHNiLmFwcGVuZChjKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoKGMgPj0gJ2EnICYmIGMgPD0gJ3onKSB8fCAoYyA+PSAnQScgJiYgYyA8PSAnWicpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZU51bWJlcihQaG9uZU51bWJlclV0aWxzLmNvbnZlcnRLZXlwYWRMZXR0ZXJzVG9EaWdpdHMocGhvbmVOdW1iZXIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgICB9CisKICAgICAvLyBUaHJlZSBhbmQgZm91ciBkaWdpdCBwaG9uZSBudW1iZXJzIGZvciBlaXRoZXIgc3BlY2lhbCBzZXJ2aWNlcywKICAgICAvLyBvciAzLTYgZGlnaXQgYWRkcmVzc2VzIGZyb20gdGhlIG5ldHdvcmsgKGVnIGNhcnJpZXItb3JpZ2luYXRlZCBTTVMgbWVzc2FnZXMpIHNob3VsZAogICAgIC8vIG5vdCBtYXRjaC4KQEAgLTE1NDYsNyArMTYzMyw3IEBACiAgICAgICogQGhpZGUKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIFN0cmluZwotICAgIGNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZUJ5TnVtYmVyRm9ybWF0KFN0cmluZyBkaWFsU3RyLGludCBjdXJyRm9ybWF0LGludCBkZWZhdWx0Rm9ybXQpIHsKKyAgICBjZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGVCeU51bWJlckZvcm1hdChTdHJpbmcgZGlhbFN0cixpbnQgY3VyckZvcm1hdCxpbnQgZGVmYXVsdEZvcm1hdCkgewogICAgICAgICBTdHJpbmcgcmV0U3RyID0gZGlhbFN0cjsKIAogICAgICAgICAvLyBDaGVja3MgaWYgdGhlIHBsdXMgc2lnbiBjaGFyYWN0ZXIgaXMgaW4gdGhlIHBhc3NlZC1pbiBkaWFsIHN0cmluZwpAQCAtMTU1NCw3ICsxNjQxLDcgQEAKICAgICAgICAgICAgIGRpYWxTdHIubGFzdEluZGV4T2YoUExVU19TSUdOX1NUUklORykgIT0gLTEpIHsKICAgICAgICAgICAgIC8vIEZvcm1hdCB0aGUgc3RyaW5nIGJhc2VkIG9uIHRoZSBydWxlcyBmb3IgdGhlIGNvdW50cnkgdGhlIG51bWJlciBpcyBmcm9tLAogICAgICAgICAgICAgLy8gYW5kIHRoZSBjdXJyZW50IGNvdW50cnkgdGhlIHBob25lIGlzIGNhbXBlZCBvbi4KLSAgICAgICAgICAgIGlmICgoY3VyckZvcm1hdCA9PSBkZWZhdWx0Rm9ybXQpICYmIChjdXJyRm9ybWF0ID09IEZPUk1BVF9OQU5QKSkgeworICAgICAgICAgICAgaWYgKChjdXJyRm9ybWF0ID09IGRlZmF1bHRGb3JtYXQpICYmIChjdXJyRm9ybWF0ID09IEZPUk1BVF9OQU5QKSkgewogICAgICAgICAgICAgICAgIC8vIEhhbmRsZSBjYXNlIHdoZXJlIGRlZmF1bHQgYW5kIGN1cnJlbnQgdGVsZXBob25lIG51bWJlcmluZyBwbGFucyBhcmUgTkFOUC4KICAgICAgICAgICAgICAgICBTdHJpbmcgcG9zdERpYWxTdHIgPSBudWxsOwogICAgICAgICAgICAgICAgIFN0cmluZyB0ZW1wRGlhbFN0ciA9IGRpYWxTdHI7CkBAIC0xNzQxLDcgKzE4MjgsNyBAQAogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogCi0gICAgLy8gVGhpcyBmdW5jdGlvbiBhcHBlbmRzIHRoZSBub24tZGlhYmxhYmxlIFAvVyBjaGFyYWN0ZXIgdG8gdGhlIG9yaWdpbmFsCisgICAgLy8gVGhpcyBmdW5jdGlvbiBhcHBlbmRzIHRoZSBub24tZGlhbGFibGUgUC9XIGNoYXJhY3RlciB0byB0aGUgb3JpZ2luYWwKICAgICAvLyBkaWFsIHN0cmluZyBiYXNlZCBvbiB0aGUgZGlhbGFibGUgaW5kZXggcGFzc2VkIGluCiAgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nCiAgICAgYXBwZW5kUHdDaGFyQmFja1RvT3JpZ0RpYWxTdHIoaW50IGRpYWxhYmxlSW5kZXgsU3RyaW5nIG9yaWdTdHIsIFN0cmluZyBkaWFsU3RyKSB7CkBAIC0xNzYxLDcgKzE4NDgsNyBAQAogICAgICAgICByZXR1cm4gcmV0U3RyOwogICAgIH0KIAotICAgIC8vPT09PT0gQmVnaW5pbmcgb2YgdXRpbGl0eSBtZXRob2RzIHVzZWQgaW4gY29tcGFyZUxvb3NlbHkoKSA9PT09PQorICAgIC8vPT09PT0gQmVnaW5uaW5nIG9mIHV0aWxpdHkgbWV0aG9kcyB1c2VkIGluIGNvbXBhcmVMb29zZWx5KCkgPT09PT0KIAogICAgIC8qKgogICAgICAqIFBob25lIG51bWJlcnMgYXJlIHN0b3JlZCBpbiAibG9va3VwIiBmb3JtIGluIHRoZSBkYXRhYmFzZQpAQCAtMTg4MywxMiArMTk3MCwxMiBAQAogCiAgICAgLy89PT09PSBFbmQgb2YgdXRpbGl0eSBtZXRob2RzIHVzZWQgb25seSBpbiBjb21wYXJlTG9vc2VseSgpID09PT09CiAKLSAgICAvLz09PT09IEJlZ2dpbmluZyBvZiB1dGlsaXR5IG1ldGhvZHMgdXNlZCBvbmx5IGluIGNvbXBhcmVTdHJpY3RseSgpID09PT0KKyAgICAvLz09PT09IEJlZ2lubmluZyBvZiB1dGlsaXR5IG1ldGhvZHMgdXNlZCBvbmx5IGluIGNvbXBhcmVTdHJpY3RseSgpID09PT0KIAogICAgIC8qCiAgICAgICogSWYgdHJ1ZSwgdGhlIG51bWJlciBpcyBjb3VudHJ5IGNhbGxpbmcgY29kZS4KICAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIENPVU5UTFlfQ0FMTElOR19DQUxMW10gPSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBDT1VOVFJZX0NBTExJTkdfQ0FMTFtdID0gewogICAgICAgICB0cnVlLCB0cnVlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIHRydWUsIGZhbHNlLCBmYWxzZSwKICAgICAgICAgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsCiAgICAgICAgIHRydWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIHRydWUsIHRydWUsIGZhbHNlLApAQCAtMTkwMCwxOCArMTk4NywxOCBAQAogICAgICAgICBmYWxzZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgZmFsc2UsIHRydWUsIGZhbHNlLCBmYWxzZSwgdHJ1ZSwKICAgICAgICAgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCB0cnVlLCBmYWxzZSwKICAgICB9OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDQ0NfTEVOR1RIID0gQ09VTlRMWV9DQUxMSU5HX0NBTEwubGVuZ3RoOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDQ0NfTEVOR1RIID0gQ09VTlRSWV9DQUxMSU5HX0NBTEwubGVuZ3RoOwogCiAgICAgLyoqCiAgICAgICogQHJldHVybiB0cnVlIHdoZW4gaW5wdXQgaXMgdmFsaWQgQ291bnRyeSBDYWxsaW5nIENvZGUuCiAgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0NvdW50cnlDYWxsaW5nQ29kZShpbnQgY291bnRyeUNhbGxpbmdDb2RlQ2FuZGlkYXRlKSB7CiAgICAgICAgIHJldHVybiBjb3VudHJ5Q2FsbGluZ0NvZGVDYW5kaWRhdGUgPiAwICYmIGNvdW50cnlDYWxsaW5nQ29kZUNhbmRpZGF0ZSA8IENDQ19MRU5HVEggJiYKLSAgICAgICAgICAgICAgICBDT1VOVExZX0NBTExJTkdfQ0FMTFtjb3VudHJ5Q2FsbGluZ0NvZGVDYW5kaWRhdGVdOworICAgICAgICAgICAgICAgIENPVU5UUllfQ0FMTElOR19DQUxMW2NvdW50cnlDYWxsaW5nQ29kZUNhbmRpZGF0ZV07CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBpbnRlcmdlciBjb3JyZXNwb25kaW5nIHRvIHRoZSBpbnB1dCBpZiBpbnB1dCAiY2giIGlzCisgICAgICogUmV0dXJucyBpbnRlZ2VyIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGlucHV0IGlmIGlucHV0ICJjaCIgaXMKICAgICAgKiBJU08tTEFUSU4gY2hhcmFjdGVycyAwLTkuCiAgICAgICogUmV0dXJucyAtMSBvdGhlcndpc2UKICAgICAgKi8KQEAgLTIwNDYsNyArMjEzMyw3IEBACiAKICAgICAvKioKICAgICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgcHJlZml4IG9mICJzdHIiIGlzICJpZ25vcmFibGUiLiBIZXJlLCAiaWdub3JhYmxlIiBtZWFucwotICAgICAqIHRoYXQgInN0ciIgaGFzIG9ubHkgb25lIGRpZ2l0IGFuZCBzZXBhcmF0ZXIgY2hhcmFjdGVycy4gVGhlIG9uZSBkaWdpdCBpcworICAgICAqIHRoYXQgInN0ciIgaGFzIG9ubHkgb25lIGRpZ2l0IGFuZCBzZXBhcmF0b3IgY2hhcmFjdGVycy4gVGhlIG9uZSBkaWdpdCBpcwogICAgICAqIGFzc3VtZWQgdG8gYmUgdHJ1bmsgcHJlZml4LgogICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gY2hlY2tQcmVmaXhJc0lnbm9yYWJsZShmaW5hbCBTdHJpbmcgc3RyLApkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvUGhvbmVTdGF0ZUxpc3RlbmVyLmphdmEgYi90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9QaG9uZVN0YXRlTGlzdGVuZXIuamF2YQppbmRleCA4MzBhZjQ3Li4zOGY0NGQ4IDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9QaG9uZVN0YXRlTGlzdGVuZXIuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9QaG9uZVN0YXRlTGlzdGVuZXIuamF2YQpAQCAtMjUsNiArMjUsNyBAQAogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuSVBob25lU3RhdGVMaXN0ZW5lcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuUGhvbmU7CiAKIC8qKgogICogQSBsaXN0ZW5lciBjbGFzcyBmb3IgbW9uaXRvcmluZyBjaGFuZ2VzIGluIHNwZWNpZmljIHRlbGVwaG9ueSBzdGF0ZXMKQEAgLTI4NCw3ICsyODUsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIHZvaWQgb25EYXRhQ29ubmVjdGlvblN0YXRlQ2hhbmdlZChpbnQgc3RhdGUsIGludCBuZXR3b3JrVHlwZSkgewotICAgICAgICAgICAgTWVzc2FnZS5vYnRhaW4obUhhbmRsZXIsIExJU1RFTl9EQVRBX0NPTk5FQ1RJT05fU1RBVEUsIHN0YXRlLCBuZXR3b3JrVHlwZSwgbnVsbCkuCisgICAgICAgICAgICBNZXNzYWdlLm9idGFpbihtSGFuZGxlciwgTElTVEVOX0RBVEFfQ09OTkVDVElPTl9TVEFURSwgc3RhdGUsIG5ldHdvcmtUeXBlKS4KICAgICAgICAgICAgICAgICAgICAgc2VuZFRvVGFyZ2V0KCk7CiAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvU21zTWFuYWdlci5qYXZhIGIvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvU21zTWFuYWdlci5qYXZhCmluZGV4IGY1ZTk3NTEuLjk1MzY5NmIgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L1Ntc01hbmFnZXIuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9TbXNNYW5hZ2VyLmphdmEKQEAgLTIxLDcgKzIxLDYgQEAKIGltcG9ydCBhbmRyb2lkLm9zLlNlcnZpY2VNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CiAKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuRW5jb2RlRXhjZXB0aW9uOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5JU21zOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5JY2NDb25zdGFudHM7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlNtc1Jhd0RhdGE7CkBAIC0zMyw3ICszMiw3IEBACiAvKgogICogVE9ETyhjb2RlIHJldmlldyk6IEN1cmlvdXMgcXVlc3Rpb24uLi4gV2h5IGFyZSBhIGxvdCBvZiB0aGVzZQogICogbWV0aG9kcyBub3QgZGVjbGFyZWQgYXMgc3RhdGljLCBzaW5jZSB0aGV5IGRvIG5vdCBzZWVtIHRvIHJlcXVpcmUKLSAqIGFueSBsb2NhbCBvYmplY3Qgc3RhdGU/ICBBc3N1bWVkbHkgdGhpcyBjYW5ub3QgYmUgY2hhbmdlZCB3aXRob3V0CisgKiBhbnkgbG9jYWwgb2JqZWN0IHN0YXRlPyAgUHJlc3VtYWJseSB0aGlzIGNhbm5vdCBiZSBjaGFuZ2VkIHdpdGhvdXQKICAqIGludGVyZmVyaW5nIHdpdGggdGhlIEFQSS4uLgogICovCiAKQEAgLTQyLDcgKzQxLDggQEAKICAqIEdldCB0aGlzIG9iamVjdCBieSBjYWxsaW5nIHRoZSBzdGF0aWMgbWV0aG9kIFNtc01hbmFnZXIuZ2V0RGVmYXVsdCgpLgogICovCiBwdWJsaWMgZmluYWwgY2xhc3MgU21zTWFuYWdlciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgU21zTWFuYWdlciBzSW5zdGFuY2U7CisgICAgLyoqIFNpbmdsZXRvbiBvYmplY3QgY29uc3RydWN0ZWQgZHVyaW5nIGNsYXNzIGluaXRpYWxpemF0aW9uLiAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNtc01hbmFnZXIgc0luc3RhbmNlID0gbmV3IFNtc01hbmFnZXIoKTsKIAogICAgIC8qKgogICAgICAqIFNlbmQgYSB0ZXh0IGJhc2VkIFNNUy4KQEAgLTUyLDggKzUyLDggQEAKICAgICAgKiAgdGhlIGN1cnJlbnQgZGVmYXVsdCBTTVNDCiAgICAgICogQHBhcmFtIHRleHQgdGhlIGJvZHkgb2YgdGhlIG1lc3NhZ2UgdG8gc2VuZAogICAgICAqIEBwYXJhbSBzZW50SW50ZW50IGlmIG5vdCBOVUxMIHRoaXMgPGNvZGU+UGVuZGluZ0ludGVudDwvY29kZT4gaXMKLSAgICAgKiAgYnJvYWRjYXN0IHdoZW4gdGhlIG1lc3NhZ2UgaXMgc3VjZXNzZnVsbHkgc2VudCwgb3IgZmFpbGVkLgotICAgICAqICBUaGUgcmVzdWx0IGNvZGUgd2lsbCBiZSA8Y29kZT5BY3Rpdml0eS5SRVNVTFRfT0s8Y29kZT4gZm9yIHN1Y2Nlc3MsCisgICAgICogIGJyb2FkY2FzdCB3aGVuIHRoZSBtZXNzYWdlIGlzIHN1Y2Nlc3NmdWxseSBzZW50LCBvciBmYWlsZWQuCisgICAgICogIFRoZSByZXN1bHQgY29kZSB3aWxsIGJlIDxjb2RlPkFjdGl2aXR5LlJFU1VMVF9PSzwvY29kZT4gZm9yIHN1Y2Nlc3MsCiAgICAgICogIG9yIG9uZSBvZiB0aGVzZSBlcnJvcnM6PGJyPgogICAgICAqICA8Y29kZT5SRVNVTFRfRVJST1JfR0VORVJJQ19GQUlMVVJFPC9jb2RlPjxicj4KICAgICAgKiAgPGNvZGU+UkVTVUxUX0VSUk9SX1JBRElPX09GRjwvY29kZT48YnI+CkBAIC0xMTYsNyArMTE2LDcgQEAKICAgICAgKiBAcGFyYW0gc2VudEludGVudHMgaWYgbm90IG51bGwsIGFuIDxjb2RlPkFycmF5TGlzdDwvY29kZT4gb2YKICAgICAgKiAgIDxjb2RlPlBlbmRpbmdJbnRlbnQ8L2NvZGU+cyAob25lIGZvciBlYWNoIG1lc3NhZ2UgcGFydCkgdGhhdCBpcwogICAgICAqICAgYnJvYWRjYXN0IHdoZW4gdGhlIGNvcnJlc3BvbmRpbmcgbWVzc2FnZSBwYXJ0IGhhcyBiZWVuIHNlbnQuCi0gICAgICogICBUaGUgcmVzdWx0IGNvZGUgd2lsbCBiZSA8Y29kZT5BY3Rpdml0eS5SRVNVTFRfT0s8Y29kZT4gZm9yIHN1Y2Nlc3MsCisgICAgICogICBUaGUgcmVzdWx0IGNvZGUgd2lsbCBiZSA8Y29kZT5BY3Rpdml0eS5SRVNVTFRfT0s8L2NvZGU+IGZvciBzdWNjZXNzLAogICAgICAqICAgb3Igb25lIG9mIHRoZXNlIGVycm9yczo8YnI+CiAgICAgICogICA8Y29kZT5SRVNVTFRfRVJST1JfR0VORVJJQ19GQUlMVVJFPC9jb2RlPjxicj4KICAgICAgKiAgIDxjb2RlPlJFU1VMVF9FUlJPUl9SQURJT19PRkY8L2NvZGU+PGJyPgpAQCAtMTI1LDcgKzEyNSw3IEBACiAgICAgICogICB0aGUgZXh0cmEgImVycm9yQ29kZSIgY29udGFpbmluZyBhIHJhZGlvIHRlY2hub2xvZ3kgc3BlY2lmaWMgdmFsdWUsCiAgICAgICogICBnZW5lcmFsbHkgb25seSB1c2VmdWwgZm9yIHRyb3VibGVzaG9vdGluZy48YnI+CiAgICAgICogICBUaGUgcGVyLWFwcGxpY2F0aW9uIGJhc2VkIFNNUyBjb250cm9sIGNoZWNrcyBzZW50SW50ZW50LiBJZiBzZW50SW50ZW50Ci0gICAgICogICBpcyBOVUxMIHRoZSBjYWxsZXIgd2lsbCBiZSBjaGVja2VkIGFnYWluc3QgYWxsIHVua25vd24gYXBwbGljYWl0b25zLAorICAgICAqICAgaXMgTlVMTCB0aGUgY2FsbGVyIHdpbGwgYmUgY2hlY2tlZCBhZ2FpbnN0IGFsbCB1bmtub3duIGFwcGxpY2F0aW9ucywKICAgICAgKiAgIHdoaWNoIGNhdXNlIHNtYWxsZXIgbnVtYmVyIG9mIFNNUyB0byBiZSBzZW50IGluIGNoZWNraW5nIHBlcmlvZC4KICAgICAgKiBAcGFyYW0gZGVsaXZlcnlJbnRlbnRzIGlmIG5vdCBudWxsLCBhbiA8Y29kZT5BcnJheUxpc3Q8L2NvZGU+IG9mCiAgICAgICogICA8Y29kZT5QZW5kaW5nSW50ZW50PC9jb2RlPnMgKG9uZSBmb3IgZWFjaCBtZXNzYWdlIHBhcnQpIHRoYXQgaXMKQEAgLTE3OCw4ICsxNzgsOCBAQAogICAgICAqIEBwYXJhbSBkZXN0aW5hdGlvblBvcnQgdGhlIHBvcnQgdG8gZGVsaXZlciB0aGUgbWVzc2FnZSB0bwogICAgICAqIEBwYXJhbSBkYXRhIHRoZSBib2R5IG9mIHRoZSBtZXNzYWdlIHRvIHNlbmQKICAgICAgKiBAcGFyYW0gc2VudEludGVudCBpZiBub3QgTlVMTCB0aGlzIDxjb2RlPlBlbmRpbmdJbnRlbnQ8L2NvZGU+IGlzCi0gICAgICogIGJyb2FkY2FzdCB3aGVuIHRoZSBtZXNzYWdlIGlzIHN1Y2Vzc2Z1bGx5IHNlbnQsIG9yIGZhaWxlZC4KLSAgICAgKiAgVGhlIHJlc3VsdCBjb2RlIHdpbGwgYmUgPGNvZGU+QWN0aXZpdHkuUkVTVUxUX09LPGNvZGU+IGZvciBzdWNjZXNzLAorICAgICAqICBicm9hZGNhc3Qgd2hlbiB0aGUgbWVzc2FnZSBpcyBzdWNjZXNzZnVsbHkgc2VudCwgb3IgZmFpbGVkLgorICAgICAqICBUaGUgcmVzdWx0IGNvZGUgd2lsbCBiZSA8Y29kZT5BY3Rpdml0eS5SRVNVTFRfT0s8L2NvZGU+IGZvciBzdWNjZXNzLAogICAgICAqICBvciBvbmUgb2YgdGhlc2UgZXJyb3JzOjxicj4KICAgICAgKiAgPGNvZGU+UkVTVUxUX0VSUk9SX0dFTkVSSUNfRkFJTFVSRTwvY29kZT48YnI+CiAgICAgICogIDxjb2RlPlJFU1VMVF9FUlJPUl9SQURJT19PRkY8L2NvZGU+PGJyPgpAQCAtMTg4LDcgKzE4OCw3IEBACiAgICAgICogIHRoZSBleHRyYSAiZXJyb3JDb2RlIiBjb250YWluaW5nIGEgcmFkaW8gdGVjaG5vbG9neSBzcGVjaWZpYyB2YWx1ZSwKICAgICAgKiAgZ2VuZXJhbGx5IG9ubHkgdXNlZnVsIGZvciB0cm91Ymxlc2hvb3RpbmcuPGJyPgogICAgICAqICBUaGUgcGVyLWFwcGxpY2F0aW9uIGJhc2VkIFNNUyBjb250cm9sIGNoZWNrcyBzZW50SW50ZW50LiBJZiBzZW50SW50ZW50Ci0gICAgICogIGlzIE5VTEwgdGhlIGNhbGxlciB3aWxsIGJlIGNoZWNrZWQgYWdhaW5zdCBhbGwgdW5rbm93biBhcHBsaWNhaXRvbnMsCisgICAgICogIGlzIE5VTEwgdGhlIGNhbGxlciB3aWxsIGJlIGNoZWNrZWQgYWdhaW5zdCBhbGwgdW5rbm93biBhcHBsaWNhdGlvbnMsCiAgICAgICogIHdoaWNoIGNhdXNlIHNtYWxsZXIgbnVtYmVyIG9mIFNNUyB0byBiZSBzZW50IGluIGNoZWNraW5nIHBlcmlvZC4KICAgICAgKiBAcGFyYW0gZGVsaXZlcnlJbnRlbnQgaWYgbm90IE5VTEwgdGhpcyA8Y29kZT5QZW5kaW5nSW50ZW50PC9jb2RlPiBpcwogICAgICAqICBicm9hZGNhc3Qgd2hlbiB0aGUgbWVzc2FnZSBpcyBkZWxpdmVyZWQgdG8gdGhlIHJlY2lwaWVudC4gIFRoZQpAQCAtMjI0LDkgKzIyNCw2IEBACiAgICAgICogQHJldHVybiB0aGUgZGVmYXVsdCBpbnN0YW5jZSBvZiB0aGUgU21zTWFuYWdlcgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgU21zTWFuYWdlciBnZXREZWZhdWx0KCkgewotICAgICAgICBpZiAoc0luc3RhbmNlID09IG51bGwpIHsKLSAgICAgICAgICAgIHNJbnN0YW5jZSA9IG5ldyBTbXNNYW5hZ2VyKCk7Ci0gICAgICAgIH0KICAgICAgICAgcmV0dXJuIHNJbnN0YW5jZTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L1Ntc01lc3NhZ2UuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L1Ntc01lc3NhZ2UuamF2YQppbmRleCBhMjg0ZWE1Li5kODk5NDMwIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9TbXNNZXNzYWdlLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvU21zTWVzc2FnZS5qYXZhCkBAIC0yMCw3ICsyMCw2IEBACiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5Hc21BbHBoYWJldDsKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuRW5jb2RlRXhjZXB0aW9uOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5TbXNIZWFkZXI7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlNtc01lc3NhZ2VCYXNlOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5TbXNNZXNzYWdlQmFzZS5TdWJtaXRQZHVCYXNlOwpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvVGVsZXBob255TWFuYWdlci5qYXZhIGIvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvVGVsZXBob255TWFuYWdlci5qYXZhCmluZGV4IDI3ZTA4ZDQuLjIzNzBhZGQgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L1RlbGVwaG9ueU1hbmFnZXIuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9UZWxlcGhvbnlNYW5hZ2VyLmphdmEKQEAgLTkxMiw0ICs5MTIsMjUgQEAKICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICB9CiAgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBjdXJyZW50IGRldmljZSBpcyAidm9pY2UgY2FwYWJsZSIuCisgICAgICogPHA+CisgICAgICogIlZvaWNlIGNhcGFibGUiIG1lYW5zIHRoYXQgdGhpcyBkZXZpY2Ugc3VwcG9ydHMgY2lyY3VpdC1zd2l0Y2hlZAorICAgICAqIChpLmUuIHZvaWNlKSBwaG9uZSBjYWxscyBvdmVyIHRoZSB0ZWxlcGhvbnkgbmV0d29yaywgYW5kIGlzIGFsbG93ZWQKKyAgICAgKiB0byBkaXNwbGF5IHRoZSBpbi1jYWxsIFVJIHdoaWxlIGEgY2VsbHVsYXIgdm9pY2UgY2FsbCBpcyBhY3RpdmUuCisgICAgICogVGhpcyB3aWxsIGJlIGZhbHNlIG9uICJkYXRhIG9ubHkiIGRldmljZXMgd2hpY2ggY2FuJ3QgbWFrZSB2b2ljZQorICAgICAqIGNhbGxzIGFuZCBkb24ndCBzdXBwb3J0IGFueSBpbi1jYWxsIFVJLgorICAgICAqIDxwPgorICAgICAqIE5vdGU6IHRoZSBtZWFuaW5nIG9mIHRoaXMgZmxhZyBpcyBzdWJ0bHkgZGlmZmVyZW50IGZyb20gdGhlCisgICAgICogUGFja2FnZU1hbmFnZXIuRkVBVFVSRV9URUxFUEhPTlkgc3lzdGVtIGZlYXR1cmUsIHdoaWNoIGlzIGF2YWlsYWJsZQorICAgICAqIG9uIGFueSBkZXZpY2Ugd2l0aCBhIHRlbGVwaG9ueSByYWRpbywgZXZlbiBpZiB0aGUgZGV2aWNlIGlzCisgICAgICogZGF0YS1vbmx5LgorICAgICAqCisgICAgICogQGhpZGUgcGVuZGluZyBBUEkgcmV2aWV3CisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNWb2ljZUNhcGFibGUoKSB7CisgICAgICAgIHJldHVybiBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRCb29sZWFuKAorICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYm9vbC5jb25maWdfdm9pY2VfY2FwYWJsZSk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0NvbW1hbmRzSW50ZXJmYWNlLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvQ29tbWFuZHNJbnRlcmZhY2UuamF2YQppbmRleCA1ZGUwNDI2Li4yN2E0ZGNhIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvQ29tbWFuZHNJbnRlcmZhY2UuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvQ29tbWFuZHNJbnRlcmZhY2UuamF2YQpAQCAtMjcsOCArMjcsOCBAQAogICovCiBwdWJsaWMgaW50ZXJmYWNlIENvbW1hbmRzSW50ZXJmYWNlIHsKICAgICBlbnVtIFJhZGlvU3RhdGUgewotICAgICAgICBSQURJT19PRkYsICAgICAgICAgLyogUmFkaW8gZXhwbGljdGx5IHBvd2VyZWQgb2ZmIChlZyBDRlVOPTApICovCi0gICAgICAgIFJBRElPX1VOQVZBSUxBQkxFLCAvKiBSYWRpbyB1bmF2YWlsYWJsZSAoZWcsIHJlc2V0dGluZyBvciBub3QgYm9vdGVkKSAqLworICAgICAgICBSQURJT19PRkYsICAgICAgICAgLyogUmFkaW8gZXhwbGljaXRseSBwb3dlcmVkIG9mZiAoZS5nLiBDRlVOPTApICovCisgICAgICAgIFJBRElPX1VOQVZBSUxBQkxFLCAvKiBSYWRpbyB1bmF2YWlsYWJsZSAoZS5nLiByZXNldHRpbmcgb3Igbm90IGJvb3RlZCkgKi8KICAgICAgICAgU0lNX05PVF9SRUFEWSwgICAgIC8qIFJhZGlvIGlzIG9uLCBidXQgdGhlIFNJTSBpbnRlcmZhY2UgaXMgbm90IHJlYWR5ICovCiAgICAgICAgIFNJTV9MT0NLRURfT1JfQUJTRU5ULCAgLyogU0lNIFBJTiBsb2NrZWQsIFBVSyByZXF1aXJlZCwgbmV0d29yawogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcnNvbmFsaXphdGlvbiwgb3IgU0lNIGFic2VudCAqLwpAQCAtMTIxLDcgKzEyMSw3IEBACiAgICAgLy8gU2VlIDI3LjAwNyArQ0NGQyBvciArQ0xDSwogICAgIHN0YXRpYyBmaW5hbCBpbnQgU0VSVklDRV9DTEFTU19OT05FICAgICA9IDA7IC8vIG5vIHVzZXIgaW5wdXQKICAgICBzdGF0aWMgZmluYWwgaW50IFNFUlZJQ0VfQ0xBU1NfVk9JQ0UgICAgPSAoMSA8PCAwKTsKLSAgICBzdGF0aWMgZmluYWwgaW50IFNFUlZJQ0VfQ0xBU1NfREFUQSAgICAgPSAoMSA8PCAxKTsgLy9zeW5veW0gZm9yIDE2KzMyKzY0KzEyOAorICAgIHN0YXRpYyBmaW5hbCBpbnQgU0VSVklDRV9DTEFTU19EQVRBICAgICA9ICgxIDw8IDEpOyAvL3N5bm9ueW0gZm9yIDE2KzMyKzY0KzEyOAogICAgIHN0YXRpYyBmaW5hbCBpbnQgU0VSVklDRV9DTEFTU19GQVggICAgICA9ICgxIDw8IDIpOwogICAgIHN0YXRpYyBmaW5hbCBpbnQgU0VSVklDRV9DTEFTU19TTVMgICAgICA9ICgxIDw8IDMpOwogICAgIHN0YXRpYyBmaW5hbCBpbnQgU0VSVklDRV9DTEFTU19EQVRBX1NZTkMgPSAoMSA8PCA0KTsKQEAgLTk1MiwxOSArOTUyLDE5IEBACiAgICAgdm9pZCB3cml0ZVNtc1RvUnVpbShpbnQgc3RhdHVzLCBTdHJpbmcgcGR1LCBNZXNzYWdlIHJlc3BvbnNlKTsKIAogICAgIC8qKgotICAgICAqIEBkZXByZWNhdGVkCiAgICAgICogQHBhcmFtIGFwbgogICAgICAqIEBwYXJhbSB1c2VyCiAgICAgICogQHBhcmFtIHBhc3N3b3JkCiAgICAgICogQHBhcmFtIHJlc3BvbnNlCiAgICAgICovCisgICAgQERlcHJlY2F0ZWQKICAgICB2b2lkIHNldHVwRGVmYXVsdFBEUChTdHJpbmcgYXBuLCBTdHJpbmcgdXNlciwgU3RyaW5nIHBhc3N3b3JkLCBNZXNzYWdlIHJlc3BvbnNlKTsKIAogICAgIC8qKgotICAgICAqIEBkZXByZWNhdGVkCiAgICAgICogQHBhcmFtIGNpZAogICAgICAqIEBwYXJhbSByZXNwb25zZQogICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgdm9pZCBkZWFjdGl2YXRlRGVmYXVsdFBEUChpbnQgY2lkLCBNZXNzYWdlIHJlc3BvbnNlKTsKIAogICAgIHZvaWQgc2V0UmFkaW9Qb3dlcihib29sZWFuIG9uLCBNZXNzYWdlIHJlc3BvbnNlKTsKQEAgLTk3NCw3ICs5NzQsNyBAQAogICAgIHZvaWQgYWNrbm93bGVkZ2VMYXN0SW5jb21pbmdDZG1hU21zKGJvb2xlYW4gc3VjY2VzcywgaW50IGNhdXNlLCBNZXNzYWdlIHJlc3BvbnNlKTsKIAogICAgIC8qKgotICAgICAqIHBhcmFtZXRlcnMgZXF1aXZpbGllbnQgdG8gMjcuMDA3IEFUK0NSU00gY29tbWFuZAorICAgICAqIHBhcmFtZXRlcnMgZXF1aXZhbGVudCB0byAyNy4wMDcgQVQrQ1JTTSBjb21tYW5kCiAgICAgICogcmVzcG9uc2Uub2JqIHdpbGwgYmUgYW4gQXN5bmNSZXN1bHQKICAgICAgKiByZXNwb25zZS5vYmoudXNlck9iaiB3aWxsIGJlIGEgSWNjSW9SZXN1bHQgb24gc3VjY2VzcwogICAgICAqLwpAQCAtMTA3OSw3ICsxMDc5LDcgQEAKIAogICAgIC8qKgogICAgICAqIChBc3luY1Jlc3VsdClyZXNwb25zZS5vYmopLnJlc3VsdCB3aWxsIGJlIGFuIEludGVnZXIgcmVwcmVzZW50aW5nCi0gICAgICogdGhlIHN1bSBvZiBlbmFibGVkIHNlcml2aWNlIGNsYXNzZXMgKHN1bSBvZiBTRVJWSUNFX0NMQVNTXyopCisgICAgICogdGhlIHN1bSBvZiBlbmFibGVkIHNlcnZpY2UgY2xhc3NlcyAoc3VtIG9mIFNFUlZJQ0VfQ0xBU1NfKikKICAgICAgKgogICAgICAqIEBwYXJhbSBmYWNpbGl0eSBvbmUgb2YgQ0JfRkFDSUxUWV8qCiAgICAgICogQHBhcmFtIHBhc3N3b3JkIHBhc3N3b3JkIG9yICIiIGlmIG5vdCByZXF1aXJlZApAQCAtMTE1Miw3ICsxMTUyLDcgQEAKIAogICAgIC8qKgogICAgICAqIFJlcXVlc3QgdG8gZW5hYmxlL2Rpc2FibGUgbmV0d29yayBzdGF0ZSBjaGFuZ2Ugbm90aWZpY2F0aW9ucyB3aGVuCi0gICAgICogbG9jYXRpb24gaW5mb3JtYXRlaW9uIChsYWMgYW5kL29yIGNpZCkgaGFzIGNoYW5nZWQuCisgICAgICogbG9jYXRpb24gaW5mb3JtYXRpb24gKGxhYyBhbmQvb3IgY2lkKSBoYXMgY2hhbmdlZC4KICAgICAgKgogICAgICAqIEBwYXJhbSBlbmFibGUgdHJ1ZSB0byBlbmFibGUsIGZhbHNlIHRvIGRpc2FibGUKICAgICAgKiBAcGFyYW0gcmVzcG9uc2UgY2FsbGJhY2sgbWVzc2FnZQpAQCAtMTE4Myw3ICsxMTgzLDcgQEAKIAogICAgIC8qKgogICAgICAqIEluZGljYXRlcyB0byB0aGUgdmVuZG9yIHJpbCB0aGF0IFN0a1NlcnZpY2UgaXMgcnVubmluZwotICAgICAqIHJhbmQgaXMgZWFkeSB0byByZWNlaXZlIFJJTF9VTlNPTF9TVEtfWFhYWCBjb21tYW5kcy4KKyAgICAgKiBhbmQgaXMgcmVhZHkgdG8gcmVjZWl2ZSBSSUxfVU5TT0xfU1RLX1hYWFggY29tbWFuZHMuCiAgICAgICoKICAgICAgKiBAcGFyYW0gcmVzdWx0IGNhbGxiYWNrIG1lc3NhZ2UKICAgICAgKi8KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9EYXRhQ29ubmVjdGlvbi5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0RhdGFDb25uZWN0aW9uLmphdmEKaW5kZXggNjYzNDAxNy4uMTNjNzZlNSAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0RhdGFDb25uZWN0aW9uLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0RhdGFDb25uZWN0aW9uLmphdmEKQEAgLTQxOSwxNyArNDE5LDE0IEBACiAgICAgICAgICAgICBpZiAocmVzcG9uc2UubGVuZ3RoID49IDIpIHsKICAgICAgICAgICAgICAgICBjaWQgPSBJbnRlZ2VyLnBhcnNlSW50KHJlc3BvbnNlWzBdKTsKICAgICAgICAgICAgICAgICBpbnRlcmZhY2VOYW1lID0gcmVzcG9uc2VbMV07CisKKyAgICAgICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gIm5ldC4iICsgaW50ZXJmYWNlTmFtZSArICIuIjsKKyAgICAgICAgICAgICAgICBnYXRld2F5QWRkcmVzcyA9IFN5c3RlbVByb3BlcnRpZXMuZ2V0KHByZWZpeCArICJndyIpOworICAgICAgICAgICAgICAgIGRuc1NlcnZlcnNbMF0gPSBTeXN0ZW1Qcm9wZXJ0aWVzLmdldChwcmVmaXggKyAiZG5zMSIpOworICAgICAgICAgICAgICAgIGRuc1NlcnZlcnNbMV0gPSBTeXN0ZW1Qcm9wZXJ0aWVzLmdldChwcmVmaXggKyAiZG5zMiIpOworCiAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmxlbmd0aCA+IDIpIHsKICAgICAgICAgICAgICAgICAgICAgaXBBZGRyZXNzID0gcmVzcG9uc2VbMl07Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBwcmVmaXggPSAibmV0LiIgKyBpbnRlcmZhY2VOYW1lICsgIi4iOwotICAgICAgICAgICAgICAgICAgICBnYXRld2F5QWRkcmVzcyA9IFN5c3RlbVByb3BlcnRpZXMuZ2V0KHByZWZpeCArICJndyIpOwotICAgICAgICAgICAgICAgICAgICBkbnNTZXJ2ZXJzWzBdID0gU3lzdGVtUHJvcGVydGllcy5nZXQocHJlZml4ICsgImRuczEiKTsKLSAgICAgICAgICAgICAgICAgICAgZG5zU2VydmVyc1sxXSA9IFN5c3RlbVByb3BlcnRpZXMuZ2V0KHByZWZpeCArICJkbnMyIik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZygiaW50ZXJmYWNlPSIgKyBpbnRlcmZhY2VOYW1lICsgIiBpcEFkZHJlc3M9IiArIGlwQWRkcmVzcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBnYXRld2F5PSIgKyBnYXRld2F5QWRkcmVzcyArICIgRE5TMT0iICsgZG5zU2VydmVyc1swXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBETlMyPSIgKyBkbnNTZXJ2ZXJzWzFdKTsKLSAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgICAgIGlmIChpc0Ruc09rKGRuc1NlcnZlcnMpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBTZXR1cFJlc3VsdC5TVUNDRVNTOwpAQCAtNDQ0LDcgKzQ0MSwxNCBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgaWYgKERCRykgbG9nKCJEYXRhQ29ubmVjdGlvbiBzZXR1cCByZXN1bHQ9JyIgKyByZXN1bHQgKyAiJyBvbiBjaWQ9IiArIGNpZCk7CisgICAgICAgIGlmIChEQkcpIHsKKyAgICAgICAgICAgIGxvZygiRGF0YUNvbm5lY3Rpb24gc2V0dXAgcmVzdWx0PSciICsgcmVzdWx0ICsgIicgb24gY2lkPSIgKyBjaWQpOworICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBTZXR1cFJlc3VsdC5TVUNDRVNTKSB7CisgICAgICAgICAgICAgICAgbG9nKCJpbnRlcmZhY2U9IiArIGludGVyZmFjZU5hbWUgKyAiIGlwQWRkcmVzcz0iICsgaXBBZGRyZXNzCisgICAgICAgICAgICAgICAgICAgICAgICArICIgZ2F0ZXdheT0iICsgZ2F0ZXdheUFkZHJlc3MgKyAiIEROUzE9IiArIGRuc1NlcnZlcnNbMF0KKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiBETlMyPSIgKyBkbnNTZXJ2ZXJzWzFdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KIApkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0RhdGFDb25uZWN0aW9uVHJhY2tlci5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0RhdGFDb25uZWN0aW9uVHJhY2tlci5qYXZhCmluZGV4IDNiOWU2Y2MuLjA2ODA3YzYgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9EYXRhQ29ubmVjdGlvblRyYWNrZXIuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvRGF0YUNvbm5lY3Rpb25UcmFja2VyLmphdmEKQEAgLTE3LDYgKzE3LDcgQEAKIHBhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255OwogCiBpbXBvcnQgYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudDsKK2ltcG9ydCBhbmRyb2lkLm5ldC5OZXR3b3JrUHJvcGVydGllczsKIGltcG9ydCBhbmRyb2lkLm9zLkFzeW5jUmVzdWx0OwogaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKIGltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CkBAIC0yNiw2ICsyNywxMCBAQAogaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAoraW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOworaW1wb3J0IGphdmEubmV0Lk5ldHdvcmtJbnRlcmZhY2U7CitpbXBvcnQgamF2YS5uZXQuU29ja2V0RXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVua25vd25Ib3N0RXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiAKIC8qKgpAQCAtMTg4LDcgKzE5MywxMyBAQAogICAgIC8qKiBDSUQgb2YgYWN0aXZlIGRhdGEgY29ubmVjdGlvbiAqLwogICAgIHByb3RlY3RlZCBpbnQgY2lkQWN0aXZlOwogCi0gICAvKioKKyAgICAvKiogaW5kaWNhdGlvbiBvZiBvdXIgYXZhaWxhYmlsaXR5IChwcmVjb25kaXRpb25zIHRvIHRyeXNldHVwRGF0YSBhcmUgbWV0KSAqKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBtQXZhaWxhYmlsaXR5ID0gZmFsc2U7CisKKyAgICAvKiogYWxsIG91ciBuZXR3b3JrIHByb3BlcnRpZXMgKGRucywgZ2F0ZXdheSwgaXAsIGV0YykgKi8KKyAgICBwcm90ZWN0ZWQgTmV0d29ya1Byb3BlcnRpZXMgbU5ldHdvcmtQcm9wZXJ0aWVzOworCisgICAgLyoqCiAgICAgICogRGVmYXVsdCBjb25zdHJ1Y3RvcgogICAgICAqLwogICAgIHByb3RlY3RlZCBEYXRhQ29ubmVjdGlvblRyYWNrZXIoUGhvbmVCYXNlIHBob25lKSB7CkBAIC00MjEsNyArNDMyLDkzIEBACiAKICAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBzZXRTdGF0ZShTdGF0ZSBzKTsKIAotICAgIHByb3RlY3RlZCBzeW5jaHJvbml6ZWQgYm9vbGVhbiBpc0VuYWJsZWQoaW50IGlkKSB7CisgICAgcHJvdGVjdGVkIE5ldHdvcmtQcm9wZXJ0aWVzIGdldE5ldHdvcmtQcm9wZXJ0aWVzKFN0cmluZyBhcG5UeXBlKSB7CisgICAgICAgIGludCBpZCA9IGFwblR5cGVUb0lkKGFwblR5cGUpOworICAgICAgICBpZiAoaXNBcG5JZEVuYWJsZWQoaWQpKSB7CisgICAgICAgICAgICByZXR1cm4gbU5ldHdvcmtQcm9wZXJ0aWVzOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyB0ZWxsIGFsbCBhY3RpdmUgYXBucyBvZiB0aGUgY3VycmVudCBjb25kaXRpb24KKyAgICBwcm90ZWN0ZWQgdm9pZCBub3RpZnlEYXRhQ29ubmVjdGlvbihTdHJpbmcgcmVhc29uKSB7CisgICAgICAgIGZvciAoaW50IGlkID0gMDsgaWQgPCBBUE5fTlVNX1RZUEVTOyBpZCsrKSB7CisgICAgICAgICAgICBpZiAoZGF0YUVuYWJsZWRbaWRdKSB7CisgICAgICAgICAgICAgICAgcGhvbmUubm90aWZ5RGF0YUNvbm5lY3Rpb24ocmVhc29uLCBhcG5JZFRvVHlwZShpZCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG5vdGlmeURhdGFBdmFpbGFiaWxpdHkocmVhc29uKTsKKyAgICB9CisKKyAgICAvLyBhIG5ldyBBUE4gaGFzIGdvbmUgYWN0aXZlIGFuZCBuZWVkcyB0byBzZW5kIGV2ZW50cyB0byBjYXRjaCB1cCB3aXRoIHRoZSBjdXJyZW50IGNvbmRpdGlvbgorICAgIHByaXZhdGUgdm9pZCBub3RpZnlBcG5JZFVwVG9DdXJyZW50KFN0cmluZyByZWFzb24sIGludCBhcG5JZCkgeworICAgICAgICBzd2l0Y2ggKHN0YXRlKSB7CisgICAgICAgICAgICBjYXNlIElETEU6CisgICAgICAgICAgICBjYXNlIElOSVRJTkc6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIENPTk5FQ1RJTkc6CisgICAgICAgICAgICBjYXNlIFNDQU5OSU5HOgorICAgICAgICAgICAgICAgIHBob25lLm5vdGlmeURhdGFDb25uZWN0aW9uKHJlYXNvbiwgYXBuSWRUb1R5cGUoYXBuSWQpLCBQaG9uZS5EYXRhU3RhdGUuQ09OTkVDVElORyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIENPTk5FQ1RFRDoKKyAgICAgICAgICAgIGNhc2UgRElTQ09OTkVDVElORzoKKyAgICAgICAgICAgICAgICBwaG9uZS5ub3RpZnlEYXRhQ29ubmVjdGlvbihyZWFzb24sIGFwbklkVG9UeXBlKGFwbklkKSwgUGhvbmUuRGF0YVN0YXRlLkNPTk5FQ1RJTkcpOworICAgICAgICAgICAgICAgIHBob25lLm5vdGlmeURhdGFDb25uZWN0aW9uKHJlYXNvbiwgYXBuSWRUb1R5cGUoYXBuSWQpLCBQaG9uZS5EYXRhU3RhdGUuQ09OTkVDVEVEKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIHNpbmNlIHdlIG5vcm1hbGx5IGRvbid0IHNlbmQgaW5mbyB0byBhIGRpc2Nvbm5lY3RlZCBBUE4sIHdlIG5lZWQgdG8gZG8gdGhpcyBzcGVjaWFsbHkKKyAgICBwcml2YXRlIHZvaWQgbm90aWZ5QXBuSWREaXNjb25uZWN0ZWQoU3RyaW5nIHJlYXNvbiwgaW50IGFwbklkKSB7CisgICAgICAgIHBob25lLm5vdGlmeURhdGFDb25uZWN0aW9uKHJlYXNvbiwgYXBuSWRUb1R5cGUoYXBuSWQpLCBQaG9uZS5EYXRhU3RhdGUuRElTQ09OTkVDVEVEKTsKKyAgICB9CisKKyAgICAvLyBkaXNhYmxlZCBhcG4ncyBzdGlsbCBuZWVkIGF2YWlsL3VuYXZhaWwgbm90aWZpY2lhdGlvbnMgLSBzZW5kIHRoZW0gb3V0CisgICAgcHJvdGVjdGVkIHZvaWQgbm90aWZ5T2ZmQXBuc09mQXZhaWxhYmlsaXR5KFN0cmluZyByZWFzb24sIGJvb2xlYW4gYXZhaWxhYmlsaXR5KSB7CisgICAgICAgIGlmIChtQXZhaWxhYmlsaXR5ID09IGF2YWlsYWJpbGl0eSkgcmV0dXJuOworICAgICAgICBtQXZhaWxhYmlsaXR5ID0gYXZhaWxhYmlsaXR5OworICAgICAgICBmb3IgKGludCBpZCA9IDA7IGlkIDwgQVBOX05VTV9UWVBFUzsgaWQrKykgeworICAgICAgICAgICAgaWYgKCFpc0FwbklkRW5hYmxlZChpZCkpIHsKKyAgICAgICAgICAgICAgICBub3RpZnlBcG5JZERpc2Nvbm5lY3RlZChyZWFzb24sIGlkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIHdlIGhhZCBhbiBhdmFpbGFiaWxpdHkgY2hhbmdlIC0gdGVsbCB0aGUgbGlzdGVuZXJzCisgICAgcHJvdGVjdGVkIHZvaWQgbm90aWZ5RGF0YUF2YWlsYWJpbGl0eShTdHJpbmcgcmVhc29uKSB7CisgICAgICAgIC8vIG5vdGUgdGhhdCB3ZSBlaXRoZXIganVzdCB0dXJuZWQgYWxsIG9mZiBiZWNhdXNlIHdlIGxvc3QgYXZhaWxhYmlsaXR5CisgICAgICAgIC8vIG9yIGFsbCB3ZXJlIG9mZiBhbmQgY291bGQgbm93IGdvIG9uLCBzbyBvbmx5IGhhdmUgb2ZmIGFwbnMgdG8gd29ycnkgYWJvdXQKKyAgICAgICAgbm90aWZ5T2ZmQXBuc09mQXZhaWxhYmlsaXR5KHJlYXNvbiwgaXNEYXRhUG9zc2libGUoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIG9ubHkgY2lyY3Vtc3RhbmNlcyB1bmRlciB3aGljaCB3ZSByZXBvcnQgdGhhdCBkYXRhIGNvbm5lY3Rpdml0eSBpcyBub3QKKyAgICAgKiBwb3NzaWJsZSBhcmUKKyAgICAgKiA8dWw+CisgICAgICogPGxpPkRhdGEgaXMgZGlzYWxsb3dlZCAocm9hbWluZywgcG93ZXIgc3RhdGUsIHZvaWNlIGNhbGwsIGV0YykuPC9saT4KKyAgICAgKiA8bGk+VGhlIGN1cnJlbnQgZGF0YSBzdGF0ZSBpcyB7QGNvZGUgRElTQ09OTkVDVEVEfSBmb3IgYSByZWFzb24gb3RoZXIgdGhhbgorICAgICAqIGhhdmluZyBleHBsaWNpdGx5IGRpc2FibGVkIGNvbm5lY3Rpdml0eS4gSW4gb3RoZXIgd29yZHMsIGRhdGEgaXMgbm90IGF2YWlsYWJsZQorICAgICAqIGJlY2F1c2UgdGhlIHBob25lIGlzIG91dCBvZiBjb3ZlcmFnZSBvciBzb21lIGxpa2UgcmVhc29uLjwvbGk+CisgICAgICogPC91bD4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiBkYXRhIGNvbm5lY3Rpdml0eSBpcyBwb3NzaWJsZSwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNEYXRhUG9zc2libGUoKSB7CisgICAgICAgIGJvb2xlYW4gcG9zc2libGUgPSAoaXNEYXRhQWxsb3dlZCgpICYmCisgICAgICAgICAgICAhKGdldERhdGFFbmFibGVkKCkgJiYgKHN0YXRlID09IFN0YXRlLkZBSUxFRCB8fCBzdGF0ZSA9PSBTdGF0ZS5JRExFKSkpOworICAgICAgICBpZiAoIXBvc3NpYmxlICYmIERCRyAmJiBpc0RhdGFBbGxvd2VkKCkpIHsKKyAgICAgICAgICAgIGxvZygiRGF0YSBub3QgcG9zc2libGUuICBObyBjb3ZlcmFnZTogZGF0YVN0YXRlID0gIiArIHN0YXRlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcG9zc2libGU7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gaXNEYXRhQWxsb3dlZCgpOworCisgICAgcHVibGljIGJvb2xlYW4gaXNBcG5UeXBlRW5hYmxlZChTdHJpbmcgYXBuVHlwZSkgeworICAgICAgICByZXR1cm4gaXNBcG5JZEVuYWJsZWQoYXBuVHlwZVRvSWQoYXBuVHlwZSkpOworICAgIH0KKworICAgIHByb3RlY3RlZCBzeW5jaHJvbml6ZWQgYm9vbGVhbiBpc0FwbklkRW5hYmxlZChpbnQgaWQpIHsKICAgICAgICAgaWYgKGlkICE9IEFQTl9JTlZBTElEX0lEKSB7CiAgICAgICAgICAgICByZXR1cm4gZGF0YUVuYWJsZWRbaWRdOwogICAgICAgICB9CkBAIC00NDQsMjIgKzU0MSwyMSBAQAogICAgICAgICAgICAgcmV0dXJuIFBob25lLkFQTl9SRVFVRVNUX0ZBSUxFRDsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChEQkcpIExvZy5kKExPR19UQUcsICJlbmFibGVBcG5UeXBlKCIrdHlwZSsiKSwgaXNBcG5UeXBlQWN0aXZlID0gIgotICAgICAgICAgICAgICAgICsgaXNBcG5UeXBlQWN0aXZlKHR5cGUpICsgIiBhbmQgc3RhdGUgPSAiICsgc3RhdGUpOworICAgICAgICBpZiAoREJHKSB7CisgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiZW5hYmxlQXBuVHlwZSgiICsgdHlwZSArICIpLCBpc0FwblR5cGVBY3RpdmUgPSAiCisgICAgICAgICAgICAgICAgICAgICsgaXNBcG5UeXBlQWN0aXZlKHR5cGUpICsgIiwgaXNBcG5JZEVuYWJsZWQgPSIgKyBpc0FwbklkRW5hYmxlZChpZCkgKworICAgICAgICAgICAgICAgICAgICAiIGFuZCBzdGF0ZSA9ICIgKyBzdGF0ZSk7CisgICAgICAgIH0KIAogICAgICAgICBpZiAoIWlzQXBuVHlwZUF2YWlsYWJsZSh0eXBlKSkgewogICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoTE9HX1RBRywgInR5cGUgbm90IGF2YWlsYWJsZSIpOwogICAgICAgICAgICAgcmV0dXJuIFBob25lLkFQTl9UWVBFX05PVF9BVkFJTEFCTEU7CiAgICAgICAgIH0KIAotICAgICAgICAvLyBqdXN0IGJlY2F1c2UgaXQncyBhY3RpdmUgZG9lc24ndCBtZWFuIHdlIGhhZCBpdCBleHBsaWNpdGx5IHJlcXVlc3RlZCBiZWZvcmUKLSAgICAgICAgLy8gKGEgYnJvYWQgZGVmYXVsdCBtYXkgaGFuZGxlIG1hbnkgdHlwZXMpLiAgbWFrZSBzdXJlIHdlIG1hcmsgaXQgZW5hYmxlZAotICAgICAgICAvLyBzbyBpZiB0aGUgZGVmYXVsdCBpcyBkaXNhYmxlZCB3ZSBrZWVwIHRoZSBjb25uZWN0aW9uIGZvciBvdGhlcnMKLSAgICAgICAgc2V0RW5hYmxlZChpZCwgdHJ1ZSk7Ci0KLSAgICAgICAgaWYgKGlzQXBuVHlwZUFjdGl2ZSh0eXBlKSkgewotICAgICAgICAgICAgaWYgKHN0YXRlID09IFN0YXRlLklOSVRJTkcpIHJldHVybiBQaG9uZS5BUE5fUkVRVUVTVF9TVEFSVEVEOwotICAgICAgICAgICAgZWxzZSBpZiAoc3RhdGUgPT0gU3RhdGUuQ09OTkVDVEVEKSByZXR1cm4gUGhvbmUuQVBOX0FMUkVBRFlfQUNUSVZFOworICAgICAgICBpZiAoaXNBcG5JZEVuYWJsZWQoaWQpKSB7CisgICAgICAgICAgICByZXR1cm4gUGhvbmUuQVBOX0FMUkVBRFlfQUNUSVZFOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2V0RW5hYmxlZChpZCwgdHJ1ZSk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIFBob25lLkFQTl9SRVFVRVNUX1NUQVJURUQ7CiAgICAgfQpAQCAtNDc4LDcgKzU3NCw3IEBACiAgICAgICAgIGlmIChpZCA9PSBBUE5fSU5WQUxJRF9JRCkgewogICAgICAgICAgICAgcmV0dXJuIFBob25lLkFQTl9SRVFVRVNUX0ZBSUxFRDsKICAgICAgICAgfQotICAgICAgICBpZiAoaXNFbmFibGVkKGlkKSkgeworICAgICAgICBpZiAoaXNBcG5JZEVuYWJsZWQoaWQpKSB7CiAgICAgICAgICAgICBzZXRFbmFibGVkKGlkLCBmYWxzZSk7CiAgICAgICAgICAgICBpZiAoaXNBcG5UeXBlQWN0aXZlKFBob25lLkFQTl9UWVBFX0RFRkFVTFQpKSB7CiAgICAgICAgICAgICAgICAgaWYgKGRhdGFFbmFibGVkW0FQTl9ERUZBVUxUX0lEXSkgewpAQCAtNDk1LDkgKzU5MSwxMCBAQAogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBzZXRFbmFibGVkKGludCBpZCwgYm9vbGVhbiBlbmFibGUpIHsKLSAgICAgICAgaWYgKERCRykgTG9nLmQoTE9HX1RBRywgInNldEVuYWJsZWQoIiArIGlkICsgIiwgIiArIGVuYWJsZSArICIpIHdpdGggb2xkIHN0YXRlID0gIiArCi0gICAgICAgICAgICAgICAgZGF0YUVuYWJsZWRbaWRdICsgIiBhbmQgZW5hYmxlZENvdW50ID0gIiArIGVuYWJsZWRDb3VudCk7Ci0KKyAgICAgICAgaWYgKERCRykgeworICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgInNldEVuYWJsZWQoIiArIGlkICsgIiwgIiArIGVuYWJsZSArICIpIHdpdGggb2xkIHN0YXRlID0gIgorICAgICAgICAgICAgICAgICAgICArIGRhdGFFbmFibGVkW2lkXSArICIgYW5kIGVuYWJsZWRDb3VudCA9ICIgKyBlbmFibGVkQ291bnQpOworICAgICAgICB9CiAgICAgICAgIE1lc3NhZ2UgbXNnID0gb2J0YWluTWVzc2FnZShFVkVOVF9FTkFCTEVfTkVXX0FQTik7CiAgICAgICAgIG1zZy5hcmcxID0gaWQ7CiAgICAgICAgIG1zZy5hcmcyID0gKGVuYWJsZSA/IEVOQUJMRUQgOiBESVNBQkxFRCk7CkBAIC01MDcsOSArNjA0LDggQEAKICAgICBwcm90ZWN0ZWQgc3luY2hyb25pemVkIHZvaWQgb25FbmFibGVBcG4oaW50IGFwbklkLCBpbnQgZW5hYmxlZCkgewogICAgICAgICBpZiAoREJHKSB7CiAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiRVZFTlRfQVBOX0VOQUJMRV9SRVFVRVNUICIgKyBhcG5JZCArICIsICIgKyBlbmFibGVkKTsKLSAgICAgICAgICAgIExvZy5kKExPR19UQUcsICIgZGF0YUVuYWJsZWQgPSAiICsgZGF0YUVuYWJsZWRbYXBuSWRdICsKLSAgICAgICAgICAgICAgICAgICAgIiwgZW5hYmxlZENvdW50ID0gIiArIGVuYWJsZWRDb3VudCArCi0gICAgICAgICAgICAgICAgICAgICIsIGlzQXBuVHlwZUFjdGl2ZSA9ICIgKyBpc0FwblR5cGVBY3RpdmUoYXBuSWRUb1R5cGUoYXBuSWQpKSk7CisgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiIGRhdGFFbmFibGVkID0gIiArIGRhdGFFbmFibGVkW2FwbklkXSArICIsIGVuYWJsZWRDb3VudCA9ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlbmFibGVkQ291bnQgKyAiLCBpc0FwblR5cGVBY3RpdmUgPSAiICsgaXNBcG5UeXBlQWN0aXZlKGFwbklkVG9UeXBlKGFwbklkKSkpOwogICAgICAgICB9CiAgICAgICAgIGlmIChlbmFibGVkID09IEVOQUJMRUQpIHsKICAgICAgICAgICAgIGlmICghZGF0YUVuYWJsZWRbYXBuSWRdKSB7CkBAIC01MjAsNiArNjE2LDggQEAKICAgICAgICAgICAgIGlmICghaXNBcG5UeXBlQWN0aXZlKHR5cGUpKSB7CiAgICAgICAgICAgICAgICAgbVJlcXVlc3RlZEFwblR5cGUgPSB0eXBlOwogICAgICAgICAgICAgICAgIG9uRW5hYmxlTmV3QXBuKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG5vdGlmeUFwbklkVXBUb0N1cnJlbnQoUGhvbmUuUkVBU09OX0FQTl9TV0lUQ0hFRCwgYXBuSWQpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLy8gZGlzYWJsZQpAQCAtNTI4LDggKzYyNiwxNyBAQAogICAgICAgICAgICAgICAgIGVuYWJsZWRDb3VudC0tOwogICAgICAgICAgICAgICAgIGlmIChlbmFibGVkQ291bnQgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICBvbkNsZWFuVXBDb25uZWN0aW9uKHRydWUsIFBob25lLlJFQVNPTl9EQVRBX0RJU0FCTEVEKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRhdGFFbmFibGVkW0FQTl9ERUZBVUxUX0lEXSA9PSB0cnVlICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAhaXNBcG5UeXBlQWN0aXZlKFBob25lLkFQTl9UWVBFX0RFRkFVTFQpKSB7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gc2VuZCB0aGUgZGlzY29ubmVjdCBtc2cgbWFudWFsbHksIHNpbmNlIHRoZSBub3JtYWwgcm91dGUgd29udCBzZW5kCisgICAgICAgICAgICAgICAgLy8gaXQgKGl0J3Mgbm90IGVuYWJsZWQpCisgICAgICAgICAgICAgICAgbm90aWZ5QXBuSWREaXNjb25uZWN0ZWQoUGhvbmUuUkVBU09OX0RBVEFfRElTQUJMRUQsIGFwbklkKTsKKyAgICAgICAgICAgICAgICBpZiAoZGF0YUVuYWJsZWRbQVBOX0RFRkFVTFRfSURdID09IHRydWUKKyAgICAgICAgICAgICAgICAgICAgICAgICYmICFpc0FwblR5cGVBY3RpdmUoUGhvbmUuQVBOX1RZUEVfREVGQVVMVCkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyAtIHRoaXMgaXMgYW4gdWdseSB3YXkgdG8gcmVzdG9yZSB0aGUgZGVmYXVsdCBjb25uIC0gc2hvdWxkIGJlIGRvbmUKKyAgICAgICAgICAgICAgICAgICAgLy8gYnkgYSByZWFsIGNvbnRlbnRpb24gbWFuYWdlciBhbmQgcG9saWN5IHRoYXQgZGlzY29ubmVjdHMgdGhlIGxvd2VyIHByaQorICAgICAgICAgICAgICAgICAgICAvLyBzdHVmZiBhcyBlbmFibGUgcmVxdWVzdHMgY29tZSBpbiBhbmQgcG9wcyB0aGVtIGJhY2sgb24gYXMgd2UgZGlzYWJsZSBiYWNrCisgICAgICAgICAgICAgICAgICAgIC8vIGRvd24gdG8gdGhlIGxvd2VyIHByaSBzdHVmZgogICAgICAgICAgICAgICAgICAgICBtUmVxdWVzdGVkQXBuVHlwZSA9IFBob25lLkFQTl9UWVBFX0RFRkFVTFQ7CiAgICAgICAgICAgICAgICAgICAgIG9uRW5hYmxlTmV3QXBuKCk7CiAgICAgICAgICAgICAgICAgfQpAQCAtNTc0LDkgKzY4MSw0NyBAQAogICAgICAgICAgICAgICAgIG9uVHJ5U2V0dXBEYXRhKFBob25lLlJFQVNPTl9EQVRBX0VOQUJMRUQpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBvbkNsZWFuVXBDb25uZWN0aW9uKHRydWUsIFBob25lLlJFQVNPTl9EQVRBX0RJU0FCTEVEKTsKLSAgICAgICAgICAgfQorICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCisgICAgcHJvdGVjdGVkIE5ldHdvcmtQcm9wZXJ0aWVzIG1ha2VOZXR3b3JrUHJvcGVydGllcyhEYXRhQ29ubmVjdGlvbiBjb25uZWN0aW9uKSB7CisgICAgICAgIE5ldHdvcmtQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBuZXcgTmV0d29ya1Byb3BlcnRpZXMoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHByb3BlcnRpZXMuc2V0SW50ZXJmYWNlKE5ldHdvcmtJbnRlcmZhY2UuZ2V0QnlOYW1lKGNvbm5lY3Rpb24uZ2V0SW50ZXJmYWNlKCkpKTsKKyAgICAgICAgfSBjYXRjaCAoU29ja2V0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJTb2NrZXRFeGNlcHRpb24gY3JlYXRpbmcgTmV0d29ya0ludGVyZmFjZTogIiArIGUpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiTlBFIHRyeWluZyB0byBtYWtlTmV0d29ya1Byb3BlcnRpZXM6ICIgKyBlKTsKKyAgICAgICAgfQogCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwcm9wZXJ0aWVzLmFkZEFkZHJlc3MoSW5ldEFkZHJlc3MuZ2V0QnlOYW1lKGNvbm5lY3Rpb24uZ2V0SXBBZGRyZXNzKCkpKTsKKyAgICAgICAgfSBjYXRjaCAoVW5rbm93bkhvc3RFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIlVua25vd25Ib3N0RXhjZXB0aW9uIHNldHRpbmcgSXBBZGRyZXNzOiAiICsgZSk7CisgICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJTZWN1cml0eUV4Y2VwdGlvbiBzZXR0aW5nIElwQWRkcmVzczogIiArIGUpOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHByb3BlcnRpZXMuc2V0R2F0ZXdheShJbmV0QWRkcmVzcy5nZXRCeU5hbWUoY29ubmVjdGlvbi5nZXRHYXRld2F5QWRkcmVzcygpKSk7CisgICAgICAgIH0gY2F0Y2ggKFVua25vd25Ib3N0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJVbmtub3duSG9zdEV4Y2VwdGlvbiBzZXR0aW5nIEdhdGV3YXlBZGRyZXNzOiAiICsgZSk7CisgICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJTZWN1cml0eUV4Y2VwdGlvbiBzZXR0aW5nIEdhdGV3YXlBZGRyZXNzOiAiICsgZSk7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgU3RyaW5nW10gZG5zU3RyaW5ncyA9IGNvbm5lY3Rpb24uZ2V0RG5zU2VydmVycygpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGk8ZG5zU3RyaW5ncy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIHByb3BlcnRpZXMuYWRkRG5zKEluZXRBZGRyZXNzLmdldEJ5TmFtZShkbnNTdHJpbmdzW2ldKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKFVua25vd25Ib3N0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJVbmtub3duSG9zdEV4Y2VwdGlvbiBzZXR0aW5nIERuc0FkZHJlc3M6ICIgKyBlKTsKKyAgICAgICAgfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIlNlY3VyaXR5RXhjZXB0aW9uIHNldHRpbmcgRG5zQWRkcmVzczogIiArIGUpOworICAgICAgICB9CisgICAgICAgIC8vIFRPRE8gLSBzZXQgUHJveHkgaW5mbworICAgICAgICByZXR1cm4gcHJvcGVydGllczsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvRGVmYXVsdFBob25lTm90aWZpZXIuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9EZWZhdWx0UGhvbmVOb3RpZmllci5qYXZhCmluZGV4IDA1N2JhMGEuLjM4MmMxOWYgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9EZWZhdWx0UGhvbmVOb3RpZmllci5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9EZWZhdWx0UGhvbmVOb3RpZmllci5qYXZhCkBAIC0xNiw2ICsxNiw3IEBACiAKIHBhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255OwogCitpbXBvcnQgYW5kcm9pZC5uZXQuTmV0d29ya1Byb3BlcnRpZXM7CiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC5vcy5TZXJ2aWNlTWFuYWdlcjsKQEAgLTkyLDI2ICs5Myw0MiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgbm90aWZ5RGF0YUNvbm5lY3Rpb24oUGhvbmUgc2VuZGVyLCBTdHJpbmcgcmVhc29uKSB7CisgICAgcHVibGljIHZvaWQgbm90aWZ5RGF0YUNvbm5lY3Rpb24oUGhvbmUgc2VuZGVyLCBTdHJpbmcgcmVhc29uLCBTdHJpbmcgYXBuVHlwZSkgeworICAgICAgICBkb05vdGlmeURhdGFDb25uZWN0aW9uKHNlbmRlciwgcmVhc29uLCBhcG5UeXBlLCBzZW5kZXIuZ2V0RGF0YUNvbm5lY3Rpb25TdGF0ZShhcG5UeXBlKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbm90aWZ5RGF0YUNvbm5lY3Rpb24oUGhvbmUgc2VuZGVyLCBTdHJpbmcgcmVhc29uLCBTdHJpbmcgYXBuVHlwZSwKKyAgICAgICAgICAgIFBob25lLkRhdGFTdGF0ZSBzdGF0ZSkgeworICAgICAgICBkb05vdGlmeURhdGFDb25uZWN0aW9uKHNlbmRlciwgcmVhc29uLCBhcG5UeXBlLCBzdGF0ZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGRvTm90aWZ5RGF0YUNvbm5lY3Rpb24oUGhvbmUgc2VuZGVyLCBTdHJpbmcgcmVhc29uLCBTdHJpbmcgYXBuVHlwZSwKKyAgICAgICAgICAgIFBob25lLkRhdGFTdGF0ZSBzdGF0ZSkgeworICAgICAgICAvLyBUT0RPCisgICAgICAgIC8vIHVzZSBhcG5UeXBlIGFzIHRoZSBrZXkgdG8gd2hpY2ggY29ubmVjdGlvbiB3ZSdyZSB0YWxraW5nIGFib3V0LgorICAgICAgICAvLyBwYXNzIGFwblR5cGUgYmFjayB1cCB0byBmZXRjaCBwYXJ0aWN1bGFyIGZvciB0aGlzIG9uZS4KICAgICAgICAgVGVsZXBob255TWFuYWdlciB0ZWxlcGhvbnkgPSBUZWxlcGhvbnlNYW5hZ2VyLmdldERlZmF1bHQoKTsKKyAgICAgICAgTmV0d29ya1Byb3BlcnRpZXMgbmV0d29ya1Byb3BlcnRpZXMgPSBudWxsOworICAgICAgICBpZiAoc3RhdGUgPT0gUGhvbmUuRGF0YVN0YXRlLkNPTk5FQ1RFRCkgeworICAgICAgICAgICAgbmV0d29ya1Byb3BlcnRpZXMgPSBzZW5kZXIuZ2V0TmV0d29ya1Byb3BlcnRpZXMoYXBuVHlwZSk7CisgICAgICAgIH0KICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIG1SZWdpc3RyeS5ub3RpZnlEYXRhQ29ubmVjdGlvbigKLSAgICAgICAgICAgICAgICAgICAgY29udmVydERhdGFTdGF0ZShzZW5kZXIuZ2V0RGF0YUNvbm5lY3Rpb25TdGF0ZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgY29udmVydERhdGFTdGF0ZShzdGF0ZSksCiAgICAgICAgICAgICAgICAgICAgIHNlbmRlci5pc0RhdGFDb25uZWN0aXZpdHlQb3NzaWJsZSgpLCByZWFzb24sCiAgICAgICAgICAgICAgICAgICAgIHNlbmRlci5nZXRBY3RpdmVBcG4oKSwKLSAgICAgICAgICAgICAgICAgICAgc2VuZGVyLmdldEFjdGl2ZUFwblR5cGVzKCksCi0gICAgICAgICAgICAgICAgICAgIHNlbmRlci5nZXRJbnRlcmZhY2VOYW1lKG51bGwpLAorICAgICAgICAgICAgICAgICAgICBhcG5UeXBlLAorICAgICAgICAgICAgICAgICAgICBuZXR3b3JrUHJvcGVydGllcywKICAgICAgICAgICAgICAgICAgICAgKCh0ZWxlcGhvbnkhPW51bGwpID8gdGVsZXBob255LmdldE5ldHdvcmtUeXBlKCkgOgotICAgICAgICAgICAgICAgICAgICBUZWxlcGhvbnlNYW5hZ2VyLk5FVFdPUktfVFlQRV9VTktOT1dOKSwKLSAgICAgICAgICAgICAgICAgICAgc2VuZGVyLmdldEdhdGV3YXkobnVsbCkpOworICAgICAgICAgICAgICAgICAgICBUZWxlcGhvbnlNYW5hZ2VyLk5FVFdPUktfVFlQRV9VTktOT1dOKSk7CiAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgewogICAgICAgICAgICAgLy8gc3lzdGVtIHByb2Nlc3MgaXMgZGVhZAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgbm90aWZ5RGF0YUNvbm5lY3Rpb25GYWlsZWQoUGhvbmUgc2VuZGVyLCBTdHJpbmcgcmVhc29uKSB7CisgICAgcHVibGljIHZvaWQgbm90aWZ5RGF0YUNvbm5lY3Rpb25GYWlsZWQoUGhvbmUgc2VuZGVyLCBTdHJpbmcgcmVhc29uLCBTdHJpbmcgYXBuVHlwZSkgewogICAgICAgICB0cnkgewotICAgICAgICAgICAgbVJlZ2lzdHJ5Lm5vdGlmeURhdGFDb25uZWN0aW9uRmFpbGVkKHJlYXNvbik7CisgICAgICAgICAgICBtUmVnaXN0cnkubm90aWZ5RGF0YUNvbm5lY3Rpb25GYWlsZWQocmVhc29uLCBhcG5UeXBlKTsKICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7CiAgICAgICAgICAgICAvLyBzeXN0ZW0gcHJvY2VzcyBpcyBkZWFkCiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9Hc21BbHBoYWJldC5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0dzbUFscGhhYmV0LmphdmEKaW5kZXggN2VkZjA2NS4uNzVlYTExNiAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0dzbUFscGhhYmV0LmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0dzbUFscGhhYmV0LmphdmEKQEAgLTE2LDcgKzE2LDYgQEAKIAogcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnk7CiAKLWltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5TbXNNZXNzYWdlOwogaW1wb3J0IGFuZHJvaWQudXRpbC5TcGFyc2VJbnRBcnJheTsKIAogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CkBAIC0xNzEsNyArMTcwLDcgQEAKICAgICAgKiBhcnJheSBjYW5ub3QgY29udGFpbiBtb3JlIHRoYW4gMjU1IHNlcHRldHMuCiAgICAgICoKICAgICAgKiBAcGFyYW0gZGF0YSBUaGUgdGV4dCBzdHJpbmcgdG8gZW5jb2RlLgotICAgICAqIEBwYXJhbSBoZWFkZXIgT3B0aW9uYWwgaGVhZGVyIChpbmNsdWRlaW5nIGxlbmd0aCBieXRlKSB0aGF0IHByZWNlZGVzCisgICAgICogQHBhcmFtIGhlYWRlciBPcHRpb25hbCBoZWFkZXIgKGluY2x1ZGluZyBsZW5ndGggYnl0ZSkgdGhhdCBwcmVjZWRlcwogICAgICAqIHRoZSBlbmNvZGVkIGRhdGEsIHBhZGRlZCB0byBzZXB0ZXQgYm91bmRhcnkuCiAgICAgICogQHJldHVybiBCeXRlIGFycmF5IGNvbnRhaW5pbmcgaGVhZGVyIGFuZCBlbmNvZGVkIGRhdGEuCiAgICAgICovCkBAIC0yMDQsNyArMjAzLDcgQEAKICAgICAgKiB0aGUgcGFja2VkIHNlcHRldHMuIFRoZSByZXR1cm5lZCBhcnJheSBjYW5ub3QgY29udGFpbiBtb3JlIHRoYW4gMjU1CiAgICAgICogc2VwdGV0cy4KICAgICAgKgotICAgICAqIEBwYXJhbSBkYXRhIHRoZSBkYXRhIHN0cmluZyB0byBlbmRjb2RlCisgICAgICogQHBhcmFtIGRhdGEgdGhlIGRhdGEgc3RyaW5nIHRvIGVuY29kZQogICAgICAqIEB0aHJvd3MgRW5jb2RlRXhjZXB0aW9uIGlmIFN0cmluZyBpcyB0b28gbGFyZ2UgdG8gZW5jb2RlCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBieXRlW10gc3RyaW5nVG9Hc203Qml0UGFja2VkKFN0cmluZyBkYXRhKQpAQCAtMjIzLDcgKzIyMiw3IEBACiAgICAgICoKICAgICAgKiBAcGFyYW0gZGF0YSB0aGUgdGV4dCB0byBjb252ZXJ0IHRvIHNlcHRldHMKICAgICAgKiBAcGFyYW0gc3RhcnRpbmdTZXB0ZXRPZmZzZXQgdGhlIG51bWJlciBvZiBwYWRkaW5nIHNlcHRldHMgdG8gcHV0IGJlZm9yZQotICAgICAqICB0aGUgY2hhcmFjdGVyIGRhdGEgYXQgdGhlIGJlZ2luaW5nIG9mIHRoZSBhcnJheQorICAgICAqICB0aGUgY2hhcmFjdGVyIGRhdGEgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgYXJyYXkKICAgICAgKiBAcGFyYW0gdGhyb3dFeGNlcHRpb24gSWYgdHJ1ZSwgdGhyb3dzIEVuY29kZUV4Y2VwdGlvbiBvbiBpbnZhbGlkIGNoYXIuCiAgICAgICogICBJZiBmYWxzZSwgcmVwbGFjZXMgdW5lbmNvZGFibGUgY2hhciB3aXRoIEdTTSBhbHBoYWJldCBzcGFjZSBjaGFyLgogICAgICAqCkBAIC0yNTcsNyArMjU2LDcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBQYWNrIGEgNy1iaXQgY2hhciBpbnRvIGl0cyBhcHByb3BpcmF0ZSBwbGFjZSBpbiBhIGJ5dGUgYXJyYXkKKyAgICAgKiBQYWNrIGEgNy1iaXQgY2hhciBpbnRvIGl0cyBhcHByb3ByaWF0ZSBwbGFjZSBpbiBhIGJ5dGUgYXJyYXkKICAgICAgKgogICAgICAqIEBwYXJhbSBiaXRPZmZzZXQgdGhlIGJpdCBvZmZzZXQgdGhhdCB0aGUgc2VwdGV0IHNob3VsZCBiZSBwYWNrZWQgYXQKICAgICAgKiAgICAgICAgICAgICAgICAgIChzZXB0ZXQgaW5kZXggKiA3KQpAQCAtMzIwLDcgKzMxOSw3IEBACiAKICAgICAgICAgICAgICAgICBnc21WYWwgPSAoMHg3ZiAmIChwZHVbb2Zmc2V0ICsgYnl0ZU9mZnNldF0gPj4gc2hpZnQpKTsKIAotICAgICAgICAgICAgICAgIC8vIGlmIGl0IGNyb3NzZXMgYSBieXRlIGJvdW5kcnkKKyAgICAgICAgICAgICAgICAvLyBpZiBpdCBjcm9zc2VzIGEgYnl0ZSBib3VuZGFyeQogICAgICAgICAgICAgICAgIGlmIChzaGlmdCA+IDEpIHsKICAgICAgICAgICAgICAgICAgICAgLy8gc2V0IG1zYiBiaXRzIHRvIDAKICAgICAgICAgICAgICAgICAgICAgZ3NtVmFsICY9IDB4N2YgPj4gKHNoaWZ0IC0gMSk7CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvSVRlbGVwaG9ueS5haWRsIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0lUZWxlcGhvbnkuYWlkbAppbmRleCAyMzI4NzE3Li43YTE1ODdiIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvSVRlbGVwaG9ueS5haWRsCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9JVGVsZXBob255LmFpZGwKQEAgLTIzOSw5ICsyMzksMTEgQEAKICAgICBTdHJpbmcgZ2V0Q2RtYUVyaVRleHQoKTsKIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiBDRE1BIHByb3Zpc2lvbmluZyBuZWVkcyB0byBydW4uCisgICAgICogUmV0dXJucyB0cnVlIGlmIE9UQSBzZXJ2aWNlIHByb3Zpc2lvbmluZyBuZWVkcyB0byBydW4uCisgICAgICogT25seSByZWxldmFudCBvbiBzb21lIHRlY2hub2xvZ2llcywgb3RoZXJzIHdpbGwgYWx3YXlzCisgICAgICogcmV0dXJuIGZhbHNlLgogICAgICAqLwotICAgIGJvb2xlYW4gZ2V0Q2RtYU5lZWRzUHJvdmlzaW9uaW5nKCk7CisgICAgYm9vbGVhbiBuZWVkc090YVNlcnZpY2VQcm92aXNpb25pbmcoKTsKIAogICAgIC8qKgogICAgICAgKiBSZXR1cm5zIHRoZSB1bnJlYWQgY291bnQgb2Ygdm9pY2VtYWlscwpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0lUZWxlcGhvbnlSZWdpc3RyeS5haWRsIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0lUZWxlcGhvbnlSZWdpc3RyeS5haWRsCmluZGV4IDg3ZTRiNTIuLmY3YjcwZWUgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9JVGVsZXBob255UmVnaXN0cnkuYWlkbAorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvSVRlbGVwaG9ueVJlZ2lzdHJ5LmFpZGwKQEAgLTE3LDYgKzE3LDcgQEAKIHBhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255OwogCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLm5ldC5OZXR3b3JrUHJvcGVydGllczsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKIGltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5TZXJ2aWNlU3RhdGU7CiBpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuU2lnbmFsU3RyZW5ndGg7CkBAIC0zMiw4ICszMyw4IEBACiAgICAgdm9pZCBub3RpZnlDYWxsRm9yd2FyZGluZ0NoYW5nZWQoYm9vbGVhbiBjZmkpOwogICAgIHZvaWQgbm90aWZ5RGF0YUFjdGl2aXR5KGludCBzdGF0ZSk7CiAgICAgdm9pZCBub3RpZnlEYXRhQ29ubmVjdGlvbihpbnQgc3RhdGUsIGJvb2xlYW4gaXNEYXRhQ29ubmVjdGl2aXR5UG9zc2libGUsCi0gICAgICAgICAgICBTdHJpbmcgcmVhc29uLCBTdHJpbmcgYXBuLCBpbiBTdHJpbmdbXSBhcG5UeXBlcywgU3RyaW5nIGludGVyZmFjZU5hbWUsIGludCBuZXR3b3JrVHlwZSwKLSAgICAgICAgICAgIFN0cmluZyBnYXRld2F5KTsKLSAgICB2b2lkIG5vdGlmeURhdGFDb25uZWN0aW9uRmFpbGVkKFN0cmluZyByZWFzb24pOworICAgICAgICAgICAgU3RyaW5nIHJlYXNvbiwgU3RyaW5nIGFwbiwgU3RyaW5nIGFwblR5cGUsIGluIE5ldHdvcmtQcm9wZXJ0aWVzIG5ldHdvcmtQcm9wZXJ0aWVzLAorICAgICAgICAgICAgaW50IG5ldHdvcmtUeXBlKTsKKyAgICB2b2lkIG5vdGlmeURhdGFDb25uZWN0aW9uRmFpbGVkKFN0cmluZyByZWFzb24sIFN0cmluZyBhcG5UeXBlKTsKICAgICB2b2lkIG5vdGlmeUNlbGxMb2NhdGlvbihpbiBCdW5kbGUgY2VsbExvY2F0aW9uKTsKIH0KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9JY2NTbXNJbnRlcmZhY2VNYW5hZ2VyLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvSWNjU21zSW50ZXJmYWNlTWFuYWdlci5qYXZhCmluZGV4IDhhNWE2YWUuLjVmZWY2ZGUgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9JY2NTbXNJbnRlcmZhY2VNYW5hZ2VyLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0ljY1Ntc0ludGVyZmFjZU1hbmFnZXIuamF2YQpAQCAtNTcsNyArNTcsNyBAQAogICAgICAqIEBwYXJhbSBkZXN0UG9ydCB0aGUgcG9ydCB0byBkZWxpdmVyIHRoZSBtZXNzYWdlIHRvCiAgICAgICogQHBhcmFtIGRhdGEgdGhlIGJvZHkgb2YgdGhlIG1lc3NhZ2UgdG8gc2VuZAogICAgICAqIEBwYXJhbSBzZW50SW50ZW50IGlmIG5vdCBOVUxMIHRoaXMgPGNvZGU+UGVuZGluZ0ludGVudDwvY29kZT4gaXMKLSAgICAgKiAgYnJvYWRjYXN0IHdoZW4gdGhlIG1lc3NhZ2UgaXMgc3VjZXNzZnVsbHkgc2VudCwgb3IgZmFpbGVkLgorICAgICAqICBicm9hZGNhc3Qgd2hlbiB0aGUgbWVzc2FnZSBpcyBzdWNjZXNzZnVsbHkgc2VudCwgb3IgZmFpbGVkLgogICAgICAqICBUaGUgcmVzdWx0IGNvZGUgd2lsbCBiZSA8Y29kZT5BY3Rpdml0eS5SRVNVTFRfT0s8Y29kZT4gZm9yIHN1Y2Nlc3MsCiAgICAgICogIG9yIG9uZSBvZiB0aGVzZSBlcnJvcnM6PGJyPgogICAgICAqICA8Y29kZT5SRVNVTFRfRVJST1JfR0VORVJJQ19GQUlMVVJFPC9jb2RlPjxicj4KQEAgLTY3LDcgKzY3LDcgQEAKICAgICAgKiAgdGhlIGV4dHJhICJlcnJvckNvZGUiIGNvbnRhaW5pbmcgYSByYWRpbyB0ZWNobm9sb2d5IHNwZWNpZmljIHZhbHVlLAogICAgICAqICBnZW5lcmFsbHkgb25seSB1c2VmdWwgZm9yIHRyb3VibGVzaG9vdGluZy48YnI+CiAgICAgICogIFRoZSBwZXItYXBwbGljYXRpb24gYmFzZWQgU01TIGNvbnRyb2wgY2hlY2tzIHNlbnRJbnRlbnQuIElmIHNlbnRJbnRlbnQKLSAgICAgKiAgaXMgTlVMTCB0aGUgY2FsbGVyIHdpbGwgYmUgY2hlY2tlZCBhZ2FpbnN0IGFsbCB1bmtub3duIGFwcGxpY2FpdG9ucywKKyAgICAgKiAgaXMgTlVMTCB0aGUgY2FsbGVyIHdpbGwgYmUgY2hlY2tlZCBhZ2FpbnN0IGFsbCB1bmtub3duIGFwcGxpY2F0aW9ucywKICAgICAgKiAgd2hpY2ggY2F1c2Ugc21hbGxlciBudW1iZXIgb2YgU01TIHRvIGJlIHNlbnQgaW4gY2hlY2tpbmcgcGVyaW9kLgogICAgICAqIEBwYXJhbSBkZWxpdmVyeUludGVudCBpZiBub3QgTlVMTCB0aGlzIDxjb2RlPlBlbmRpbmdJbnRlbnQ8L2NvZGU+IGlzCiAgICAgICogIGJyb2FkY2FzdCB3aGVuIHRoZSBtZXNzYWdlIGlzIGRlbGl2ZXJlZCB0byB0aGUgcmVjaXBpZW50LiAgVGhlCkBAIC05NCw3ICs5NCw3IEBACiAgICAgICogIHRoZSBjdXJyZW50IGRlZmF1bHQgU01TQwogICAgICAqIEBwYXJhbSB0ZXh0IHRoZSBib2R5IG9mIHRoZSBtZXNzYWdlIHRvIHNlbmQKICAgICAgKiBAcGFyYW0gc2VudEludGVudCBpZiBub3QgTlVMTCB0aGlzIDxjb2RlPlBlbmRpbmdJbnRlbnQ8L2NvZGU+IGlzCi0gICAgICogIGJyb2FkY2FzdCB3aGVuIHRoZSBtZXNzYWdlIGlzIHN1Y2Vzc2Z1bGx5IHNlbnQsIG9yIGZhaWxlZC4KKyAgICAgKiAgYnJvYWRjYXN0IHdoZW4gdGhlIG1lc3NhZ2UgaXMgc3VjY2Vzc2Z1bGx5IHNlbnQsIG9yIGZhaWxlZC4KICAgICAgKiAgVGhlIHJlc3VsdCBjb2RlIHdpbGwgYmUgPGNvZGU+QWN0aXZpdHkuUkVTVUxUX09LPGNvZGU+IGZvciBzdWNjZXNzLAogICAgICAqICBvciBvbmUgb2YgdGhlc2UgZXJyb3JzOjxicj4KICAgICAgKiAgPGNvZGU+UkVTVUxUX0VSUk9SX0dFTkVSSUNfRkFJTFVSRTwvY29kZT48YnI+CkBAIC0xNDAsNyArMTQwLDcgQEAKICAgICAgKiAgIDxjb2RlPlJFU1VMVF9FUlJPUl9SQURJT19PRkY8L2NvZGU+CiAgICAgICogICA8Y29kZT5SRVNVTFRfRVJST1JfTlVMTF9QRFU8L2NvZGU+LgogICAgICAqICBUaGUgcGVyLWFwcGxpY2F0aW9uIGJhc2VkIFNNUyBjb250cm9sIGNoZWNrcyBzZW50SW50ZW50LiBJZiBzZW50SW50ZW50Ci0gICAgICogIGlzIE5VTEwgdGhlIGNhbGxlciB3aWxsIGJlIGNoZWNrZWQgYWdhaW5zdCBhbGwgdW5rbm93biBhcHBsaWNhaXRvbnMsCisgICAgICogIGlzIE5VTEwgdGhlIGNhbGxlciB3aWxsIGJlIGNoZWNrZWQgYWdhaW5zdCBhbGwgdW5rbm93biBhcHBsaWNhdGlvbnMsCiAgICAgICogIHdoaWNoIGNhdXNlIHNtYWxsZXIgbnVtYmVyIG9mIFNNUyB0byBiZSBzZW50IGluIGNoZWNraW5nIHBlcmlvZC4KICAgICAgKiBAcGFyYW0gZGVsaXZlcnlJbnRlbnRzIGlmIG5vdCBudWxsLCBhbiA8Y29kZT5BcnJheUxpc3Q8L2NvZGU+IG9mCiAgICAgICogICA8Y29kZT5QZW5kaW5nSW50ZW50PC9jb2RlPnMgKG9uZSBmb3IgZWFjaCBtZXNzYWdlIHBhcnQpIHRoYXQgaXMKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9JY2NVdGlscy5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0ljY1V0aWxzLmphdmEKaW5kZXggOTU3ZWRkZC4uMDA1YWUzNyAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0ljY1V0aWxzLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0ljY1V0aWxzLmphdmEKQEAgLTI2Nyw5ICsyNjcsMTEgQEAKIAogCiAgICAgLyoqCi0gICAgICogQ29udmVydHMgYSBieXRlIGFycmF5IGludG8gYSBTdHJpbmcgaGV4aWRlY2ltYWwgY2hhcmFjdGVycworICAgICAqIENvbnZlcnRzIGEgYnl0ZSBhcnJheSBpbnRvIGEgU3RyaW5nIG9mIGhleGFkZWNpbWFsIGNoYXJhY3RlcnMuCiAgICAgICoKLSAgICAgKiBudWxsIHJldHVybnMgbnVsbAorICAgICAqIEBwYXJhbSBieXRlcyBhbiBhcnJheSBvZiBieXRlcworICAgICAqCisgICAgICogQHJldHVybiBoZXggc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGJ5dGVzIGFycmF5CiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcKICAgICBieXRlc1RvSGV4U3RyaW5nKGJ5dGVbXSBieXRlcykgewpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L01jY1RhYmxlLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvTWNjVGFibGUuamF2YQppbmRleCBiNzNjMmY3Li45YjBhYTNjIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvTWNjVGFibGUuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvTWNjVGFibGUuamF2YQpAQCAtMjMsMzQ2ICsyMywxMyBAQAogaW1wb3J0IGFuZHJvaWQubmV0LndpZmkuV2lmaU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1Qcm9wZXJ0aWVzOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3M7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotLyoqCi0gKiBUaGUgdGFibGUgYmVsb3cgaXMgYnVpbHQgZnJvbSB0d28gcmVzb3VyY2VzOgotICoKLSAqIDEpIElUVSAiTW9iaWxlIE5ldHdvcmsgQ29kZSAoTU5DKSBmb3IgdGhlIGludGVybmF0aW9uYWwKLSAqICAgaWRlbnRpZmljYXRpb24gcGxhbiBmb3IgbW9iaWxlIHRlcm1pbmFscyBhbmQgbW9iaWxlIHVzZXJzIgotICogICB3aGljaCBpcyBhdmFpbGFibGUgYXMgYW4gYW5uZXggdG8gdGhlIElUVSBvcGVyYXRpb25hbCBidWxsZXRpbgotICogICBhdmFpbGFibGUgaGVyZTogaHR0cDovL3d3dy5pdHUuaW50L2l0dS10L2J1bGxldGluL2FubmV4Lmh0bWwKLSAqCi0gKiAyKSBUaGUgSVNPIDMxNjYgY291bnRyeSBjb2RlcyBsaXN0LCBhdmFpbGFibGUgaGVyZToKLSAqICAgIGh0dHA6Ly93d3cuaXNvLm9yZy9pc28vZW4vcHJvZHMtc2VydmljZXMvaXNvMzE2Nm1hLzAyaXNvLTMxNjYtY29kZS1saXN0cy9pbmRleC5odG1sCi0gKgotICogVGhpcyB0YWJsZSB3YXMgdmVyaWZpZWQgKDI4IEF1ZyAyMDA5KSBhZ2FpbnN0Ci0gKiBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0xpc3Rfb2ZfbW9iaWxlX2NvdW50cnlfY29kZXMgd2l0aCB0aGUKLSAqIG9ubHkgdW5yZXNvbHZlZCBkaXNjcmVwYW5jeSBiZWluZyB0aGF0IHRoaXMgbGlzdCBoYXMgYW4gZXh0cmEgZW50cnkKLSAqICg0NjEpIGZvciBDaGluYS4KLSAqCi0gKiBUT0RPOiBDb21wbGV0ZSB0aGUgbWFwcGluZ3MgZm9yIHRpbWV6b25lcyBhbmQgbGFuZ3VhZ2UvbG9jYWxlIGNvZGVzLgotICoKLSAqIFRoZSBhY3R1YWwgdGFibGUgZGF0YSB1c2VkIGluIHRoZSBKYXZhIGNvZGUgaXMgZ2VuZXJhdGVkIGZyb20gdGhlCi0gKiBiZWxvdyBQeXRob24gY29kZSBmb3IgZWZmaWNpZW5jeS4gIFRoZSBpbmZvcm1hdGlvbiBpcyBleHBlY3RlZCB0bwotICogYmUgc3RhdGljLCBidXQgaWYgY2hhbmdlcyBhcmUgcmVxdWlyZWQsIHRoZSB0YWJsZSBpbiB0aGUgcHl0aG9uCi0gKiBjb2RlIGNhbiBiZSBtb2RpZmllZCBhbmQgdGhlIHRyYWlsaW5nIGNvZGUgcnVuIHRvIHJlLWdlbmVyYXRlIHRoZQotICogdGFibGVzIHRoYXQgYXJlIHRvIGJlIHVzZWQgYnkgSmF2YS4KLQotbWNjX3RhYmxlID0gWwotICAoMjAyLCAnZ3InLCAyLCAnR3JlZWNlJyksCi0gICgyMDQsICdubCcsIDIsICdFdXJvcGUvQW1zdGVyZGFtJywgJ25sJywgMTMsICdOZXRoZXJsYW5kcyAoS2luZ2RvbSBvZiB0aGUpJyksCi0gICgyMDYsICdiZScsIDIsICdCZWxnaXVtJyksCi0gICgyMDgsICdmcicsIDIsICdFdXJvcGUvUGFyaXMnLCAnZnInLCAnRnJhbmNlJyksCi0gICgyMTIsICdtYycsIDIsICdNb25hY28gKFByaW5jaXBhbGl0eSBvZiknKSwKLSAgKDIxMywgJ2FkJywgMiwgJ0FuZG9ycmEgKFByaW5jaXBhbGl0eSBvZiknKSwKLSAgKDIxNCwgJ2VzJywgMiwgJ0V1cm9wZS9NYWRyaWQnLCAnZXMnLCAnU3BhaW4nKSwKLSAgKDIxNiwgJ2h1JywgMiwgJ0h1bmdhcnkgKFJlcHVibGljIG9mKScpLAotICAoMjE4LCAnYmEnLCAyLCAnQm9zbmlhIGFuZCBIZXJ6ZWdvdmluYScpLAotICAoMjE5LCAnaHInLCAyLCAnQ3JvYXRpYSAoUmVwdWJsaWMgb2YpJyksCi0gICgyMjAsICdycycsIDIsICdTZXJiaWEgYW5kIE1vbnRlbmVncm8nKSwKLSAgKDIyMiwgJ2l0JywgMiwgJ0V1cm9wZS9Sb21lJywgJ2l0JywgJ0l0YWx5JyksCi0gICgyMjUsICd2YScsIDIsICdFdXJvcGUvUm9tZScsICdpdCcsICdWYXRpY2FuIENpdHkgU3RhdGUnKSwKLSAgKDIyNiwgJ3JvJywgMiwgJ1JvbWFuaWEnKSwKLSAgKDIyOCwgJ2NoJywgMiwgJ0V1cm9wZS9adXJpY2gnLCAnZGUnLCAnU3dpdHplcmxhbmQgKENvbmZlZGVyYXRpb24gb2YpJyksCi0gICgyMzAsICdjeicsIDIsICdFdXJvcGUvUHJhZ3VlJywgJ2NzJywgMTMsICdDemVjaCBSZXB1YmxpYycpLAotICAoMjMxLCAnc2snLCAyLCAnU2xvdmFrIFJlcHVibGljJyksCi0gICgyMzIsICdhdCcsIDIsICdFdXJvcGUvVmllbm5hJywgJ2RlJywgMTMsICdBdXN0cmlhJyksCi0gICgyMzQsICdnYicsIDIsICdFdXJvcGUvTG9uZG9uJywgJ2VuJywgMTMsICdVbml0ZWQgS2luZ2RvbSBvZiBHcmVhdCBCcml0YWluIGFuZCBOb3J0aGVybiBJcmVsYW5kJyksCi0gICgyMzUsICdnYicsIDIsICdFdXJvcGUvTG9uZG9uJywgJ2VuJywgMTMsICdVbml0ZWQgS2luZ2RvbSBvZiBHcmVhdCBCcml0YWluIGFuZCBOb3J0aGVybiBJcmVsYW5kJyksCi0gICgyMzgsICdkaycsIDIsICdEZW5tYXJrJyksCi0gICgyNDAsICdzZScsIDIsICdTd2VkZW4nKSwKLSAgKDI0MiwgJ25vJywgMiwgJ05vcndheScpLAotICAoMjQ0LCAnZmknLCAyLCAnRmlubGFuZCcpLAotICAoMjQ2LCAnbHQnLCAyLCAnTGl0aHVhbmlhIChSZXB1YmxpYyBvZiknKSwKLSAgKDI0NywgJ2x2JywgMiwgJ0xhdHZpYSAoUmVwdWJsaWMgb2YpJyksCi0gICgyNDgsICdlZScsIDIsICdFc3RvbmlhIChSZXB1YmxpYyBvZiknKSwKLSAgKDI1MCwgJ3J1JywgMiwgJ1J1c3NpYW4gRmVkZXJhdGlvbicpLAotICAoMjU1LCAndWEnLCAyLCAnVWtyYWluZScpLAotICAoMjU3LCAnYnknLCAyLCAnQmVsYXJ1cyAoUmVwdWJsaWMgb2YpJyksCi0gICgyNTksICdtZCcsIDIsICdNb2xkb3ZhIChSZXB1YmxpYyBvZiknKSwKLSAgKDI2MCwgJ3BsJywgMiwgJ0V1cm9wZS9XYXJzYXcnLCAnUG9sYW5kIChSZXB1YmxpYyBvZiknKSwKLSAgKDI2MiwgJ2RlJywgMiwgJ0V1cm9wZS9CZXJsaW4nLCAnZGUnLCAxMywgJ0dlcm1hbnkgKEZlZGVyYWwgUmVwdWJsaWMgb2YpJyksCi0gICgyNjYsICdnaScsIDIsICdHaWJyYWx0YXInKSwKLSAgKDI2OCwgJ3B0JywgMiwgJ1BvcnR1Z2FsJyksCi0gICgyNzAsICdsdScsIDIsICdMdXhlbWJvdXJnJyksCi0gICgyNzIsICdpZScsIDIsICdFdXJvcGUvRHVibGluJywgJ2VuJywgJ0lyZWxhbmQnKSwKLSAgKDI3NCwgJ2lzJywgMiwgJ0ljZWxhbmQnKSwKLSAgKDI3NiwgJ2FsJywgMiwgJ0FsYmFuaWEgKFJlcHVibGljIG9mKScpLAotICAoMjc4LCAnbXQnLCAyLCAnTWFsdGEnKSwKLSAgKDI4MCwgJ2N5JywgMiwgJ0N5cHJ1cyAoUmVwdWJsaWMgb2YpJyksCi0gICgyODIsICdnZScsIDIsICdHZW9yZ2lhJyksCi0gICgyODMsICdhbScsIDIsICdBcm1lbmlhIChSZXB1YmxpYyBvZiknKSwKLSAgKDI4NCwgJ2JnJywgMiwgJ0J1bGdhcmlhIChSZXB1YmxpYyBvZiknKSwKLSAgKDI4NiwgJ3RyJywgMiwgJ1R1cmtleScpLAotICAoMjg4LCAnZm8nLCAyLCAnRmFyb2UgSXNsYW5kcycpLAotICAoMjg5LCAnZ2UnLCAyLCAnQWJraGF6aWEgKEdlb3JnaWEpJyksCi0gICgyOTAsICdnbCcsIDIsICdHcmVlbmxhbmQgKERlbm1hcmspJyksCi0gICgyOTIsICdzbScsIDIsICdTYW4gTWFyaW5vIChSZXB1YmxpYyBvZiknKSwKLSAgKDI5MywgJ3NsJywgMiwgJ1Nsb3ZlbmlhIChSZXB1YmxpYyBvZiknKSwKLSAgKDI5NCwgJ21rJywgMiwgJ1RoZSBGb3JtZXIgWXVnb3NsYXYgUmVwdWJsaWMgb2YgTWFjZWRvbmlhJyksCi0gICgyOTUsICdsaScsIDIsICdMaWVjaHRlbnN0ZWluIChQcmluY2lwYWxpdHkgb2YpJyksCi0gICgyOTcsICdtZScsIDIsICdNb250ZW5lZ3JvIChSZXB1YmxpYyBvZiknKSwKLSAgKDMwMiwgJ2NhJywgMywgJycsICcnLCAxMSwgJ0NhbmFkYScpLAotICAoMzA4LCAncG0nLCAyLCAnU2FpbnQgUGllcnJlIGFuZCBNaXF1ZWxvbiAoQ29sbGVjdGl2aXQgdGVycml0b3JpYWxlIGRlIGxhIFJwdWJsaXF1ZSBmcmFuYWlzZSknKSwKLSAgKDMxMCwgJ3VzJywgMywgJycsICdlbicsIDExLCAnVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhJyksCi0gICgzMTEsICd1cycsIDMsICcnLCAnZW4nLCAxMSwgJ1VuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYScpLAotICAoMzEyLCAndXMnLCAzLCAnJywgJ2VuJywgMTEsICdVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EnKSwKLSAgKDMxMywgJ3VzJywgMywgJycsICdlbicsIDExLCAnVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhJyksCi0gICgzMTQsICd1cycsIDMsICcnLCAnZW4nLCAxMSwgJ1VuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYScpLAotICAoMzE1LCAndXMnLCAzLCAnJywgJ2VuJywgMTEsICdVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EnKSwKLSAgKDMxNiwgJ3VzJywgMywgJycsICdlbicsIDExLCAnVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhJyksCi0gICgzMzAsICdwcicsIDIsICdQdWVydG8gUmljbycpLAotICAoMzMyLCAndmknLCAyLCAnVW5pdGVkIFN0YXRlcyBWaXJnaW4gSXNsYW5kcycpLAotICAoMzM0LCAnbXgnLCAzLCAnTWV4aWNvJyksCi0gICgzMzgsICdqbScsIDMsICdKYW1haWNhJyksCi0gICgzNDAsICdncCcsIDIsICdHdWFkZWxvdXBlIChGcmVuY2ggRGVwYXJ0bWVudCBvZiknKSwKLSAgKDM0MiwgJ2JiJywgMywgJ0JhcmJhZG9zJyksCi0gICgzNDQsICdhZycsIDMsICdBbnRpZ3VhIGFuZCBCYXJidWRhJyksCi0gICgzNDYsICdreScsIDMsICdDYXltYW4gSXNsYW5kcycpLAotICAoMzQ4LCAndmcnLCAzLCAnQnJpdGlzaCBWaXJnaW4gSXNsYW5kcycpLAotICAoMzUwLCAnYm0nLCAyLCAnQmVybXVkYScpLAotICAoMzUyLCAnZ2QnLCAyLCAnR3JlbmFkYScpLAotICAoMzU0LCAnbXMnLCAyLCAnTW9udHNlcnJhdCcpLAotICAoMzU2LCAna24nLCAyLCAnU2FpbnQgS2l0dHMgYW5kIE5ldmlzJyksCi0gICgzNTgsICdsYycsIDIsICdTYWludCBMdWNpYScpLAotICAoMzYwLCAndmMnLCAyLCAnU2FpbnQgVmluY2VudCBhbmQgdGhlIEdyZW5hZGluZXMnKSwKLSAgKDM2MiwgJ25sJywgMiwgJ05ldGhlcmxhbmRzIEFudGlsbGVzJyksCi0gICgzNjMsICdhdycsIDIsICdBcnViYScpLAotICAoMzY0LCAnYnMnLCAyLCAnQmFoYW1hcyAoQ29tbW9ud2VhbHRoIG9mIHRoZSknKSwKLSAgKDM2NSwgJ2FpJywgMywgJ0FuZ3VpbGxhJyksCi0gICgzNjYsICdkbScsIDIsICdEb21pbmljYSAoQ29tbW9ud2VhbHRoIG9mKScpLAotICAoMzY4LCAnY3UnLCAyLCAnQ3ViYScpLAotICAoMzcwLCAnZG8nLCAyLCAnRG9taW5pY2FuIFJlcHVibGljJyksCi0gICgzNzIsICdodCcsIDIsICdIYWl0aSAoUmVwdWJsaWMgb2YpJyksCi0gICgzNzQsICd0dCcsIDIsICdUcmluaWRhZCBhbmQgVG9iYWdvJyksCi0gICgzNzYsICd0YycsIDIsICdUdXJrcyBhbmQgQ2FpY29zIElzbGFuZHMnKSwKLSAgKDQwMCwgJ2F6JywgMiwgJ0F6ZXJiYWlqYW5pIFJlcHVibGljJyksCi0gICg0MDEsICdreicsIDIsICdLYXpha2hzdGFuIChSZXB1YmxpYyBvZiknKSwKLSAgKDQwMiwgJ2J0JywgMiwgJ0JodXRhbiAoS2luZ2RvbSBvZiknKSwKLSAgKDQwNCwgJ2luJywgMiwgJ0luZGlhIChSZXB1YmxpYyBvZiknKSwKLSAgKDQwNSwgJ2luJywgMiwgJ0luZGlhIChSZXB1YmxpYyBvZiknKSwKLSAgKDQxMCwgJ3BrJywgMiwgJ1Bha2lzdGFuIChJc2xhbWljIFJlcHVibGljIG9mKScpLAotICAoNDEyLCAnYWYnLCAyLCAnQWZnaGFuaXN0YW4nKSwKLSAgKDQxMywgJ2xrJywgMiwgJ1NyaSBMYW5rYSAoRGVtb2NyYXRpYyBTb2NpYWxpc3QgUmVwdWJsaWMgb2YpJyksCi0gICg0MTQsICdtbScsIDIsICdNeWFubWFyIChVbmlvbiBvZiknKSwKLSAgKDQxNSwgJ2xiJywgMiwgJ0xlYmFub24nKSwKLSAgKDQxNiwgJ2pvJywgMiwgJ0pvcmRhbiAoSGFzaGVtaXRlIEtpbmdkb20gb2YpJyksCi0gICg0MTcsICdzeScsIDIsICdTeXJpYW4gQXJhYiBSZXB1YmxpYycpLAotICAoNDE4LCAnaXEnLCAyLCAnSXJhcSAoUmVwdWJsaWMgb2YpJyksCi0gICg0MTksICdrdycsIDIsICdLdXdhaXQgKFN0YXRlIG9mKScpLAotICAoNDIwLCAnc2EnLCAyLCAnU2F1ZGkgQXJhYmlhIChLaW5nZG9tIG9mKScpLAotICAoNDIxLCAneWUnLCAyLCAnWWVtZW4gKFJlcHVibGljIG9mKScpLAotICAoNDIyLCAnb20nLCAyLCAnT21hbiAoU3VsdGFuYXRlIG9mKScpLAotICAoNDIzLCAncHMnLCAyLCAnUGFsZXN0aW5lJyksCi0gICg0MjQsICdhZScsIDIsICdVbml0ZWQgQXJhYiBFbWlyYXRlcycpLAotICAoNDI1LCAnaWwnLCAyLCAnSXNyYWVsIChTdGF0ZSBvZiknKSwKLSAgKDQyNiwgJ2JoJywgMiwgJ0JhaHJhaW4gKEtpbmdkb20gb2YpJyksCi0gICg0MjcsICdxYScsIDIsICdRYXRhciAoU3RhdGUgb2YpJyksCi0gICg0MjgsICdtbicsIDIsICdNb25nb2xpYScpLAotICAoNDI5LCAnbnAnLCAyLCAnTmVwYWwnKSwKLSAgKDQzMCwgJ2FlJywgMiwgJ1VuaXRlZCBBcmFiIEVtaXJhdGVzJyksCi0gICg0MzEsICdhZScsIDIsICdVbml0ZWQgQXJhYiBFbWlyYXRlcycpLAotICAoNDMyLCAnaXInLCAyLCAnSXJhbiAoSXNsYW1pYyBSZXB1YmxpYyBvZiknKSwKLSAgKDQzNCwgJ3V6JywgMiwgJ1V6YmVraXN0YW4gKFJlcHVibGljIG9mKScpLAotICAoNDM2LCAndGonLCAyLCAnVGFqaWtpc3RhbiAoUmVwdWJsaWMgb2YpJyksCi0gICg0MzcsICdrZycsIDIsICdLeXJneXogUmVwdWJsaWMnKSwKLSAgKDQzOCwgJ3RtJywgMiwgJ1R1cmttZW5pc3RhbicpLAotICAoNDQwLCAnanAnLCAyLCAnQXNpYS9Ub2t5bycsICdqYScsIDE0LCAnSmFwYW4nKSwKLSAgKDQ0MSwgJ2pwJywgMiwgJ0FzaWEvVG9reW8nLCAnamEnLCAxNCwgJ0phcGFuJyksCi0gICg0NTAsICdrcicsIDIsICdLb3JlYSAoUmVwdWJsaWMgb2YpJyksCi0gICg0NTIsICd2bicsIDIsICdWaWV0IE5hbSAoU29jaWFsaXN0IFJlcHVibGljIG9mKScpLAotICAoNDU0LCAnaGsnLCAyLCAnIkhvbmcgS29uZywgQ2hpbmEiJyksCi0gICg0NTUsICdtbycsIDIsICciTWFjYW8sIENoaW5hIicpLAotICAoNDU2LCAna2gnLCAyLCAnQ2FtYm9kaWEgKEtpbmdkb20gb2YpJyksCi0gICg0NTcsICdsYScsIDIsICJMYW8gUGVvcGxlJ3MgRGVtb2NyYXRpYyBSZXB1YmxpYyIpLAotICAoNDYwLCAnY24nLCAyLCAiQXNpYS9CZWlqaW5nIiwgJ3poJywgMTMsICJDaGluYSAoUGVvcGxlJ3MgUmVwdWJsaWMgb2YpIiksCi0gICg0NjEsICdjbicsIDIsICJBc2lhL0JlaWppbmciLCAnemgnLCAxMywgIkNoaW5hIChQZW9wbGUncyBSZXB1YmxpYyBvZikiKSwKLSAgKDQ2NiwgJ3R3JywgMiwgIlRhaXdhbiAoUmVwdWJsaWMgb2YgQ2hpbmEpIiksCi0gICg0NjcsICdrcCcsIDIsICJEZW1vY3JhdGljIFBlb3BsZSdzIFJlcHVibGljIG9mIEtvcmVhIiksCi0gICg0NzAsICdiZCcsIDIsICJCYW5nbGFkZXNoIChQZW9wbGUncyBSZXB1YmxpYyBvZikiKSwKLSAgKDQ3MiwgJ212JywgMiwgJ01hbGRpdmVzIChSZXB1YmxpYyBvZiknKSwKLSAgKDUwMiwgJ215JywgMiwgJ01hbGF5c2lhJyksCi0gICg1MDUsICdhdScsIDIsICdBdXN0cmFsaWEvU3lkbmV5JywgJ2VuJywgMTEsICdBdXN0cmFsaWEnKSwKLSAgKDUxMCwgJ2lkJywgMiwgJ0luZG9uZXNpYSAoUmVwdWJsaWMgb2YpJyksCi0gICg1MTQsICd0bCcsIDIsICdEZW1vY3JhdGljIFJlcHVibGljIG9mIFRpbW9yLUxlc3RlJyksCi0gICg1MTUsICdwaCcsIDIsICdQaGlsaXBwaW5lcyAoUmVwdWJsaWMgb2YgdGhlKScpLAotICAoNTIwLCAndGgnLCAyLCAnVGhhaWxhbmQnKSwKLSAgKDUyNSwgJ3NnJywgMiwgJ0FzaWEvU2luZ2Fwb3JlJywgJ2VuJywgMTEsICdTaW5nYXBvcmUgKFJlcHVibGljIG9mKScpLAotICAoNTI4LCAnYm4nLCAyLCAnQnJ1bmVpIERhcnVzc2FsYW0nKSwKLSAgKDUzMCwgJ256JywgMiwgJ1BhY2lmaWMvQXVja2xhbmQnLCAnZW4nLCAnTmV3IFplYWxhbmQnKSwKLSAgKDUzNCwgJ21wJywgMiwgJ05vcnRoZXJuIE1hcmlhbmEgSXNsYW5kcyAoQ29tbW9ud2VhbHRoIG9mIHRoZSknKSwKLSAgKDUzNSwgJ2d1JywgMiwgJ0d1YW0nKSwKLSAgKDUzNiwgJ25yJywgMiwgJ05hdXJ1IChSZXB1YmxpYyBvZiknKSwKLSAgKDUzNywgJ3BnJywgMiwgJ1BhcHVhIE5ldyBHdWluZWEnKSwKLSAgKDUzOSwgJ3RvJywgMiwgJ1RvbmdhIChLaW5nZG9tIG9mKScpLAotICAoNTQwLCAnc2InLCAyLCAnU29sb21vbiBJc2xhbmRzJyksCi0gICg1NDEsICd2dScsIDIsICdWYW51YXR1IChSZXB1YmxpYyBvZiknKSwKLSAgKDU0MiwgJ2ZqJywgMiwgJ0ZpamkgKFJlcHVibGljIG9mKScpLAotICAoNTQzLCAnd2YnLCAyLCAiV2FsbGlzIGFuZCBGdXR1bmEgKFRlcnJpdG9pcmUgZnJhbmFpcyBkJ291dHJlLW1lcikiKSwKLSAgKDU0NCwgJ2FzJywgMiwgJ0FtZXJpY2FuIFNhbW9hJyksCi0gICg1NDUsICdraScsIDIsICdLaXJpYmF0aSAoUmVwdWJsaWMgb2YpJyksCi0gICg1NDYsICduYycsIDIsICJOZXcgQ2FsZWRvbmlhIChUZXJyaXRvaXJlIGZyYW5haXMgZCdvdXRyZS1tZXIpIiksCi0gICg1NDcsICdwZicsIDIsICJGcmVuY2ggUG9seW5lc2lhIChUZXJyaXRvaXJlIGZyYW5haXMgZCdvdXRyZS1tZXIpIiksCi0gICg1NDgsICdjaycsIDIsICdDb29rIElzbGFuZHMnKSwKLSAgKDU0OSwgJ3dzJywgMiwgJ1NhbW9hIChJbmRlcGVuZGVudCBTdGF0ZSBvZiknKSwKLSAgKDU1MCwgJ2ZtJywgMiwgJ01pY3JvbmVzaWEgKEZlZGVyYXRlZCBTdGF0ZXMgb2YpJyksCi0gICg1NTEsICdtaCcsIDIsICdNYXJzaGFsbCBJc2xhbmRzIChSZXB1YmxpYyBvZiB0aGUpJyksCi0gICg1NTIsICdwdycsIDIsICdQYWxhdSAoUmVwdWJsaWMgb2YpJyksCi0gICg2MDIsICdlZycsIDIsICdFZ3lwdCAoQXJhYiBSZXB1YmxpYyBvZiknKSwKLSAgKDYwMywgJ2R6JywgMiwgIkFsZ2VyaWEgKFBlb3BsZSdzIERlbW9jcmF0aWMgUmVwdWJsaWMgb2YpIiksCi0gICg2MDQsICdtYScsIDIsICdNb3JvY2NvIChLaW5nZG9tIG9mKScpLAotICAoNjA1LCAndG4nLCAyLCAnVHVuaXNpYScpLAotICAoNjA2LCAnbHknLCAyLCAiTGlieWEgKFNvY2lhbGlzdCBQZW9wbGUncyBMaWJ5YW4gQXJhYiBKYW1haGlyaXlhKSIpLAotICAoNjA3LCAnZ20nLCAyLCAnR2FtYmlhIChSZXB1YmxpYyBvZiB0aGUpJyksCi0gICg2MDgsICdzbicsIDIsICdTZW5lZ2FsIChSZXB1YmxpYyBvZiknKSwKLSAgKDYwOSwgJ21yJywgMiwgJ01hdXJpdGFuaWEgKElzbGFtaWMgUmVwdWJsaWMgb2YpJyksCi0gICg2MTAsICdtbCcsIDIsICdNYWxpIChSZXB1YmxpYyBvZiknKSwKLSAgKDYxMSwgJ2duJywgMiwgJ0d1aW5lYSAoUmVwdWJsaWMgb2YpJyksCi0gICg2MTIsICdjaScsIDIsICJDdGUgZCdJdm9pcmUgKFJlcHVibGljIG9mKSIpLAotICAoNjEzLCAnYmYnLCAyLCAnQnVya2luYSBGYXNvJyksCi0gICg2MTQsICduZScsIDIsICdOaWdlciAoUmVwdWJsaWMgb2YgdGhlKScpLAotICAoNjE1LCAndGcnLCAyLCAnVG9nb2xlc2UgUmVwdWJsaWMnKSwKLSAgKDYxNiwgJ2JqJywgMiwgJ0JlbmluIChSZXB1YmxpYyBvZiknKSwKLSAgKDYxNywgJ211JywgMiwgJ01hdXJpdGl1cyAoUmVwdWJsaWMgb2YpJyksCi0gICg2MTgsICdscicsIDIsICdMaWJlcmlhIChSZXB1YmxpYyBvZiknKSwKLSAgKDYxOSwgJ3NsJywgMiwgJ1NpZXJyYSBMZW9uZScpLAotICAoNjIwLCAnZ2gnLCAyLCAnR2hhbmEnKSwKLSAgKDYyMSwgJ25nJywgMiwgJ05pZ2VyaWEgKEZlZGVyYWwgUmVwdWJsaWMgb2YpJyksCi0gICg2MjIsICd0ZCcsIDIsICdDaGFkIChSZXB1YmxpYyBvZiknKSwKLSAgKDYyMywgJ2NmJywgMiwgJ0NlbnRyYWwgQWZyaWNhbiBSZXB1YmxpYycpLAotICAoNjI0LCAnY20nLCAyLCAnQ2FtZXJvb24gKFJlcHVibGljIG9mKScpLAotICAoNjI1LCAnY3YnLCAyLCAnQ2FwZSBWZXJkZSAoUmVwdWJsaWMgb2YpJyksCi0gICg2MjYsICdzdCcsIDIsICdTYW8gVG9tZSBhbmQgUHJpbmNpcGUgKERlbW9jcmF0aWMgUmVwdWJsaWMgb2YpJyksCi0gICg2MjcsICdncScsIDIsICdFcXVhdG9yaWFsIEd1aW5lYSAoUmVwdWJsaWMgb2YpJyksCi0gICg2MjgsICdnYScsIDIsICdHYWJvbmVzZSBSZXB1YmxpYycpLAotICAoNjI5LCAnY2cnLCAyLCAnQ29uZ28gKFJlcHVibGljIG9mIHRoZSknKSwKLSAgKDYzMCwgJ2NnJywgMiwgJ0RlbW9jcmF0aWMgUmVwdWJsaWMgb2YgdGhlIENvbmdvJyksCi0gICg2MzEsICdhbycsIDIsICdBbmdvbGEgKFJlcHVibGljIG9mKScpLAotICAoNjMyLCAnZ3cnLCAyLCAnR3VpbmVhLUJpc3NhdSAoUmVwdWJsaWMgb2YpJyksCi0gICg2MzMsICdzYycsIDIsICdTZXljaGVsbGVzIChSZXB1YmxpYyBvZiknKSwKLSAgKDYzNCwgJ3NkJywgMiwgJ1N1ZGFuIChSZXB1YmxpYyBvZiB0aGUpJyksCi0gICg2MzUsICdydycsIDIsICdSd2FuZGEgKFJlcHVibGljIG9mKScpLAotICAoNjM2LCAnZXQnLCAyLCAnRXRoaW9waWEgKEZlZGVyYWwgRGVtb2NyYXRpYyBSZXB1YmxpYyBvZiknKSwKLSAgKDYzNywgJ3NvJywgMiwgJ1NvbWFsaSBEZW1vY3JhdGljIFJlcHVibGljJyksCi0gICg2MzgsICdkaicsIDIsICdEamlib3V0aSAoUmVwdWJsaWMgb2YpJyksCi0gICg2MzksICdrZScsIDIsICdLZW55YSAoUmVwdWJsaWMgb2YpJyksCi0gICg2NDAsICd0eicsIDIsICdUYW56YW5pYSAoVW5pdGVkIFJlcHVibGljIG9mKScpLAotICAoNjQxLCAndWcnLCAyLCAnVWdhbmRhIChSZXB1YmxpYyBvZiknKSwKLSAgKDY0MiwgJ2JpJywgMiwgJ0J1cnVuZGkgKFJlcHVibGljIG9mKScpLAotICAoNjQzLCAnbXonLCAyLCAnTW96YW1iaXF1ZSAoUmVwdWJsaWMgb2YpJyksCi0gICg2NDUsICd6bScsIDIsICdaYW1iaWEgKFJlcHVibGljIG9mKScpLAotICAoNjQ2LCAnbWcnLCAyLCAnTWFkYWdhc2NhciAoUmVwdWJsaWMgb2YpJyksCi0gICg2NDcsICdyZScsIDIsICdSZXVuaW9uIChGcmVuY2ggRGVwYXJ0bWVudCBvZiknKSwKLSAgKDY0OCwgJ3p3JywgMiwgJ1ppbWJhYndlIChSZXB1YmxpYyBvZiknKSwKLSAgKDY0OSwgJ25hJywgMiwgJ05hbWliaWEgKFJlcHVibGljIG9mKScpLAotICAoNjUwLCAnbXcnLCAyLCAnTWFsYXdpJyksCi0gICg2NTEsICdscycsIDIsICdMZXNvdGhvIChLaW5nZG9tIG9mKScpLAotICAoNjUyLCAnYncnLCAyLCAnQm90c3dhbmEgKFJlcHVibGljIG9mKScpLAotICAoNjUzLCAnc3onLCAyLCAnU3dhemlsYW5kIChLaW5nZG9tIG9mKScpLAotICAoNjU0LCAna20nLCAyLCAnQ29tb3JvcyAoVW5pb24gb2YgdGhlKScpLAotICAoNjU1LCAnemEnLCAyLCAnQWZyaWNhL0pvaGFubmVzYnVyZycsICdlbicsICdTb3V0aCBBZnJpY2EgKFJlcHVibGljIG9mKScpLAotICAoNjU3LCAnZXInLCAyLCAnRXJpdHJlYScpLAotICAoNzAyLCAnYnonLCAyLCAnQmVsaXplJyksCi0gICg3MDQsICdndCcsIDIsICdHdWF0ZW1hbGEgKFJlcHVibGljIG9mKScpLAotICAoNzA2LCAnc3YnLCAyLCAnRWwgU2FsdmFkb3IgKFJlcHVibGljIG9mKScpLAotICAoNzA4LCAnaG4nLCAzLCAnSG9uZHVyYXMgKFJlcHVibGljIG9mKScpLAotICAoNzEwLCAnbmknLCAyLCAnTmljYXJhZ3VhJyksCi0gICg3MTIsICdjcicsIDIsICdDb3N0YSBSaWNhJyksCi0gICg3MTQsICdwYScsIDIsICdQYW5hbWEgKFJlcHVibGljIG9mKScpLAotICAoNzE2LCAncGUnLCAyLCAnUGVydScpLAotICAoNzIyLCAnYXInLCAzLCAnQXJnZW50aW5lIFJlcHVibGljJyksCi0gICg3MjQsICdicicsIDIsICdCcmF6aWwgKEZlZGVyYXRpdmUgUmVwdWJsaWMgb2YpJyksCi0gICg3MzAsICdjbCcsIDIsICdDaGlsZScpLAotICAoNzMyLCAnY28nLCAzLCAnQ29sb21iaWEgKFJlcHVibGljIG9mKScpLAotICAoNzM0LCAndmUnLCAyLCAnVmVuZXp1ZWxhIChCb2xpdmFyaWFuIFJlcHVibGljIG9mKScpLAotICAoNzM2LCAnYm8nLCAyLCAnQm9saXZpYSAoUmVwdWJsaWMgb2YpJyksCi0gICg3MzgsICdneScsIDIsICdHdXlhbmEnKSwKLSAgKDc0MCwgJ2VjJywgMiwgJ0VjdWFkb3InKSwKLSAgKDc0MiwgJ2dmJywgMiwgJ0ZyZW5jaCBHdWlhbmEgKEZyZW5jaCBEZXBhcnRtZW50IG9mKScpLAotICAoNzQ0LCAncHknLCAyLCAnUGFyYWd1YXkgKFJlcHVibGljIG9mKScpLAotICAoNzQ2LCAnc3InLCAyLCAnU3VyaW5hbWUgKFJlcHVibGljIG9mKScpLAotICAoNzQ4LCAndXknLCAyLCAnVXJ1Z3VheSAoRWFzdGVybiBSZXB1YmxpYyBvZiknKSwKLSAgKDc1MCwgJ2ZrJywgMiwgJ0ZhbGtsYW5kIElzbGFuZHMgKE1hbHZpbmFzKScpXQotCi1nZXRfbWNjID0gbGFtYmRhIGVsdDogZWx0WzBdCi1nZXRfaXNvID0gbGFtYmRhIGVsdDogZWx0WzFdCi1nZXRfc2QgPSBsYW1iZGEgZWx0OiBlbHRbMl0KLWdldF90eiA9IGxhbWJkYSBlbHQ6IGxlbihlbHQpID4gNCBhbmQgZWx0WzNdIG9yICcnCi1nZXRfbGFuZyA9IGxhbWJkYSBlbHQ6IGxlbihlbHQpID4gNSBhbmQgZWx0WzRdIG9yICcnCi1nZXRfd2lmaSA9IGxhbWJkYSBlbHQ6IGxlbihlbHQpID4gNiBhbmQgZWx0WzVdIG9yIDAKLQotbWNjX2NvZGVzID0gWycweCUwNHgnICUgZ2V0X21jYyhlbHQpIGZvciBlbHQgaW4gbWNjX3RhYmxlXQotdHpfc2V0ID0gc29ydGVkKHggZm9yIHggaW4gc2V0KGdldF90eihlbHQpIGZvciBlbHQgaW4gbWNjX3RhYmxlKSkKLWxhbmdfc2V0ID0gc29ydGVkKHggZm9yIHggaW4gc2V0KGdldF9sYW5nKGVsdCkgZm9yIGVsdCBpbiBtY2NfdGFibGUpKQotCi1kZWYgbWtfaW5kX2NvZGUoZWx0KToKLSAgaXNvID0gZ2V0X2lzbyhlbHQpCi0gIGlzb19jb2RlID0gKChvcmQoaXNvWzBdKSA8PCA4KSB8IG9yZChpc29bMV0pKSAmIDB4RkZGRiAjIDE2IGJpdHMKLSAgd2lmaSA9IGdldF93aWZpKGVsdCkgJiAweDAwMEYgICAgICAgICAgICAgICAgICAgICAgICAgICMgIDQgYml0cwotICBzZCA9IGdldF9zZChlbHQpICYgMHgwMDAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgMiBiaXRzCi0gIHR6X2luZCA9IHR6X3NldC5pbmRleChnZXRfdHooZWx0KSkgJiAweDAwMUYgICAgICAgICAgICAjICA1IGJpdHMKLSAgbGFuZ19pbmQgPSBsYW5nX3NldC5pbmRleChnZXRfbGFuZyhlbHQpKSAmIDB4MDAwRiAgICAgICMgIDQgYml0cwotICByZXR1cm4gKGlzb19jb2RlIDw8IDE2KSB8ICh3aWZpIDw8IDExKSB8IChzZCA8PCA5KSB8ICh0el9pbmQgPDwgNCkgfCBsYW5nX2luZAotCi1pbmRfY29kZXMgPSBbJzB4JTA4eCcgJSBta19pbmRfY29kZShlbHQpIGZvciBlbHQgaW4gbWNjX3RhYmxlXQotCi1kZWYgZm10X2xpc3QodGl0bGUsIGwsIGJhdGNoX3N6KToKLSAgc2wgPSBbXQotICBmb3IgaSBpbiByYW5nZShsZW4obCkgLyBiYXRjaF9zeiArIChsZW4obCkgJSBiYXRjaF9zeiBhbmQgMSBvciAwKSk6Ci0gICAgaiA9IGkgKiBiYXRjaF9zegotICAgIHNsLmFwcGVuZCgoJyAnICogOCkgKyAnLCAnLmpvaW4obFtqOmogKyBiYXRjaF9zel0pKQotICByZXR1cm4gJyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCAlcyA9IHtcbicgJSB0aXRsZSArICcsXG4nLmpvaW4oc2wpICsgJ1xuICAgIH07XG4nCi0KLWRlZiBkb19hdXRvZ2VuX2NvbW1lbnQoZXh0cmFfZGVzYz1bXSk6Ci0gIHByaW50ICcgICAgLycgKyAnKipcbiAgICAqIEFVVE8gR0VORVJBVEVEIChieSB0aGUgUHl0aG9uIGNvZGUgYWJvdmUpJwotICBmb3IgbGluZSBpbiBleHRyYV9kZXNjOgotICAgIHByaW50ICcgICAgKiAlcycgJSBsaW5lCi0gIHByaW50ICcgICAgKicgKyAnLycKLQotZG9fYXV0b2dlbl9jb21tZW50KCkKLXByaW50IGZtdF9saXN0KCdTdHJpbmdbXSBUWl9TVFJJTkdTJywgWyciJXMiJyAlIHggZm9yIHggaW4gdHpfc2V0XSwgMSkKLWRvX2F1dG9nZW5fY29tbWVudCgpCi1wcmludCBmbXRfbGlzdCgnU3RyaW5nW10gTEFOR19TVFJJTkdTJywgWyciJXMiJyAlIHggZm9yIHggaW4gbGFuZ19zZXRdLCAxMCkKLWRvX2F1dG9nZW5fY29tbWVudChbJ1RoaXMgdGFibGUgaXMgYSBsaXN0IG9mIE1DQyBjb2Rlcy4gIFRoZSBpbmRleCBpbiB0aGlzIHRhYmxlJywKLSAgICAgICAgICAgICAgICAgICAgJ29mIGEgZ2l2ZW4gTUNDIGNvZGUgaXMgdGhlIGluZGV4IG9mIGV4dHJhIGluZm9ybWF0aW9uIGFib3V0JywKLSAgICAgICAgICAgICAgICAgICAgJ3RoYXQgTUNDIGluIHRoZSBJTkRfQ09ERVMgdGFibGUuJ10pCi1wcmludCBmbXRfbGlzdCgnc2hvcnRbXSBNQ0NfQ09ERVMnLCBtY2NfY29kZXMsIDEwKQotZG9fYXV0b2dlbl9jb21tZW50KFsnVGhlIHZhbHVlcyBpbiB0aGlzIHRhYmxlIGFyZSBicm9rZW4gZG93biBhcyBmb2xsb3dzIChtc2IgdG8gbHNiKTonLAotICAgICAgICAgICAgICAgICAgICAnICAgIGlzbyBjb3VudHJ5IGNvZGUgMTYgYml0cycsCi0gICAgICAgICAgICAgICAgICAgICcgICAgKHVudXNlZCkgICAgICAgICAgMSBiaXQnLAotICAgICAgICAgICAgICAgICAgICAnICAgIHdpZmkgY2hhbm5lbCAgICAgIDQgYml0cycsCi0gICAgICAgICAgICAgICAgICAgICcgICAgc21hbGxlZCBkaWdpdCAgICAgMiBiaXRzJywKLSAgICAgICAgICAgICAgICAgICAgJyAgICBkZWZhdWx0IHRpbWV6b25lICA1IGJpdHMnLAotICAgICAgICAgICAgICAgICAgICAnICAgIGRlZmF1bHQgbGFuZ3VhZ2UgIDQgYml0cyddKQotcHJpbnQgZm10X2xpc3QoJ2ludFtdIElORF9DT0RFUycsIGluZF9jb2RlcywgNikKLQotZGVmIHBhcnNlX2luZF9jb2RlKGluZCk6Ci0gIG1jYyA9IGV2YWwobWNjX2NvZGVzW2luZF0pCi0gIGNvZGUgPSBldmFsKGluZF9jb2Rlc1tpbmRdKQotICBpc29fbHNiID0gaW50KChjb2RlID4+IDE2KSAmIDB4MDBGRikKLSAgaXNvX21zYiA9IGludCgoY29kZSA+PiAyNCkgJiAweDAwRkYpCi0gIGlzbyA9ICclcyVzJyAlIChjaHIoaXNvX21zYiksIGNocihpc29fbHNiKSkKLSAgd2lmaSA9IGludCgoY29kZSA+PiAxMSkgJiAweDAwMEYpCi0gIHNkID0gaW50KChjb2RlID4+IDkpICYgMHgwMDAzKQotICB0el9pbmQgPSAoY29kZSA+PiA0KSAmIDB4MDAxRgotICBsYW5nX2luZCA9IChjb2RlID4+IDApICYgMHgwMDBGCi0gIHJldHVybiAobWNjLCBpc28sIHNkLCB0el9zZXRbdHpfaW5kXSwgbGFuZ19zZXRbbGFuZ19pbmRdLCB3aWZpKQotCi1mbXRfc3RyID0gJ21jYyA9ICVzLCBpc28gPSAlcywgc2QgPSAlcywgdHogPSAlcywgbGFuZyA9ICVzLCB3aWZpID0gJXMnCi1vcmlnX3RhYmxlID0gW2ZtdF9zdHIgJSAoZ2V0X21jYyhlbHQpLCBnZXRfaXNvKGVsdCksIGdldF9zZChlbHQpLAotICAgICAgICAgICAgICAgICAgICAgICAgIGdldF90eihlbHQpLCBnZXRfbGFuZyhlbHQpLCBnZXRfd2lmaShlbHQpKQotICAgICAgICAgICAgICBmb3IgZWx0IGluIG1jY190YWJsZV0KLWRlcml2ZWRfdGFibGUgPSBbZm10X3N0ciAlIHBhcnNlX2luZF9jb2RlKGkpIGZvciBpIGluIHJhbmdlKGxlbihpbmRfY29kZXMpKV0KLWZvciBpIGluIHJhbmdlKGxlbihvcmlnX3RhYmxlKSk6Ci0gIGlmIG9yaWdfdGFibGVbaV0gPT0gZGVyaXZlZF90YWJsZVtpXTogY29udGludWUKLSAgcHJpbnQgJ01JU01BVENIIEVSUk9SIDogJywgb3JpZ190YWJsZVtpXSwgIiAhPSAiLCBkZXJpdmVkX3RhYmxlW2ldCi0KLSovCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBsaWJjb3JlLmljdS5UaW1lWm9uZXM7CiAKIC8qKgogICogTW9iaWxlIENvdW50cnkgQ29kZQpAQCAtMzcxLDIwMCArMzgsMTUzIEBACiAgKi8KIHB1YmxpYyBmaW5hbCBjbGFzcyBNY2NUYWJsZQogewotICAgIC8qKgotICAgICAqIEFVVE8gR0VORVJBVEVEIChieSB0aGUgUHl0aG9uIGNvZGUgYWJvdmUpCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gVFpfU1RSSU5HUyA9IHsKLSAgICAgICAgIiIsCi0gICAgICAgICJBZnJpY2EvSm9oYW5uZXNidXJnIiwKLSAgICAgICAgIkFzaWEvQmVpamluZyIsCi0gICAgICAgICJBc2lhL1NpbmdhcG9yZSIsCi0gICAgICAgICJBc2lhL1Rva3lvIiwKLSAgICAgICAgIkF1c3RyYWxpYS9TeWRuZXkiLAotICAgICAgICAiRXVyb3BlL0Ftc3RlcmRhbSIsCi0gICAgICAgICJFdXJvcGUvQmVybGluIiwKLSAgICAgICAgIkV1cm9wZS9EdWJsaW4iLAotICAgICAgICAiRXVyb3BlL0xvbmRvbiIsCi0gICAgICAgICJFdXJvcGUvTWFkcmlkIiwKLSAgICAgICAgIkV1cm9wZS9QYXJpcyIsCi0gICAgICAgICJFdXJvcGUvUHJhZ3VlIiwKLSAgICAgICAgIkV1cm9wZS9Sb21lIiwKLSAgICAgICAgIkV1cm9wZS9WaWVubmEiLAotICAgICAgICAiRXVyb3BlL1dhcnNhdyIsCi0gICAgICAgICJFdXJvcGUvWnVyaWNoIiwKLSAgICAgICAgIlBhY2lmaWMvQXVja2xhbmQiCi0gICAgfTsKLQotICAgIC8qKgotICAgICAqIEFVVE8gR0VORVJBVEVEIChieSB0aGUgUHl0aG9uIGNvZGUgYWJvdmUpCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gTEFOR19TVFJJTkdTID0gewotICAgICAgICAiIiwgImNzIiwgImRlIiwgImVuIiwgImVzIiwgImZyIiwgIml0IiwgImphIiwgIm5sIiwgInpoIgotICAgIH07Ci0KLSAgICAvKioKLSAgICAgKiBBVVRPIEdFTkVSQVRFRCAoYnkgdGhlIFB5dGhvbiBjb2RlIGFib3ZlKQotICAgICAqIFRoaXMgdGFibGUgaXMgYSBsaXN0IG9mIE1DQyBjb2Rlcy4gIFRoZSBpbmRleCBpbiB0aGlzIHRhYmxlCi0gICAgICogb2YgYSBnaXZlbiBNQ0MgY29kZSBpcyB0aGUgaW5kZXggb2YgZXh0cmEgaW5mb3JtYXRpb24gYWJvdXQKLSAgICAgKiB0aGF0IE1DQyBpbiB0aGUgSU5EX0NPREVTIHRhYmxlLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIHNob3J0W10gTUNDX0NPREVTID0gewotICAgICAgICAweDAwY2EsIDB4MDBjYywgMHgwMGNlLCAweDAwZDAsIDB4MDBkNCwgMHgwMGQ1LCAweDAwZDYsIDB4MDBkOCwgMHgwMGRhLCAweDAwZGIsCi0gICAgICAgIDB4MDBkYywgMHgwMGRlLCAweDAwZTEsIDB4MDBlMiwgMHgwMGU0LCAweDAwZTYsIDB4MDBlNywgMHgwMGU4LCAweDAwZWEsIDB4MDBlYiwKLSAgICAgICAgMHgwMGVlLCAweDAwZjAsIDB4MDBmMiwgMHgwMGY0LCAweDAwZjYsIDB4MDBmNywgMHgwMGY4LCAweDAwZmEsIDB4MDBmZiwgMHgwMTAxLAotICAgICAgICAweDAxMDMsIDB4MDEwNCwgMHgwMTA2LCAweDAxMGEsIDB4MDEwYywgMHgwMTBlLCAweDAxMTAsIDB4MDExMiwgMHgwMTE0LCAweDAxMTYsCi0gICAgICAgIDB4MDExOCwgMHgwMTFhLCAweDAxMWIsIDB4MDExYywgMHgwMTFlLCAweDAxMjAsIDB4MDEyMSwgMHgwMTIyLCAweDAxMjQsIDB4MDEyNSwKLSAgICAgICAgMHgwMTI2LCAweDAxMjcsIDB4MDEyOSwgMHgwMTJlLCAweDAxMzQsIDB4MDEzNiwgMHgwMTM3LCAweDAxMzgsIDB4MDEzOSwgMHgwMTNhLAotICAgICAgICAweDAxM2IsIDB4MDEzYywgMHgwMTRhLCAweDAxNGMsIDB4MDE0ZSwgMHgwMTUyLCAweDAxNTQsIDB4MDE1NiwgMHgwMTU4LCAweDAxNWEsCi0gICAgICAgIDB4MDE1YywgMHgwMTVlLCAweDAxNjAsIDB4MDE2MiwgMHgwMTY0LCAweDAxNjYsIDB4MDE2OCwgMHgwMTZhLCAweDAxNmIsIDB4MDE2YywKLSAgICAgICAgMHgwMTZkLCAweDAxNmUsIDB4MDE3MCwgMHgwMTcyLCAweDAxNzQsIDB4MDE3NiwgMHgwMTc4LCAweDAxOTAsIDB4MDE5MSwgMHgwMTkyLAotICAgICAgICAweDAxOTQsIDB4MDE5NSwgMHgwMTlhLCAweDAxOWMsIDB4MDE5ZCwgMHgwMTllLCAweDAxOWYsIDB4MDFhMCwgMHgwMWExLCAweDAxYTIsCi0gICAgICAgIDB4MDFhMywgMHgwMWE0LCAweDAxYTUsIDB4MDFhNiwgMHgwMWE3LCAweDAxYTgsIDB4MDFhOSwgMHgwMWFhLCAweDAxYWIsIDB4MDFhYywKLSAgICAgICAgMHgwMWFkLCAweDAxYWUsIDB4MDFhZiwgMHgwMWIwLCAweDAxYjIsIDB4MDFiNCwgMHgwMWI1LCAweDAxYjYsIDB4MDFiOCwgMHgwMWI5LAotICAgICAgICAweDAxYzIsIDB4MDFjNCwgMHgwMWM2LCAweDAxYzcsIDB4MDFjOCwgMHgwMWM5LCAweDAxY2MsIDB4MDFjZCwgMHgwMWQyLCAweDAxZDMsCi0gICAgICAgIDB4MDFkNiwgMHgwMWQ4LCAweDAxZjYsIDB4MDFmOSwgMHgwMWZlLCAweDAyMDIsIDB4MDIwMywgMHgwMjA4LCAweDAyMGQsIDB4MDIxMCwKLSAgICAgICAgMHgwMjEyLCAweDAyMTYsIDB4MDIxNywgMHgwMjE4LCAweDAyMTksIDB4MDIxYiwgMHgwMjFjLCAweDAyMWQsIDB4MDIxZSwgMHgwMjFmLAotICAgICAgICAweDAyMjAsIDB4MDIyMSwgMHgwMjIyLCAweDAyMjMsIDB4MDIyNCwgMHgwMjI1LCAweDAyMjYsIDB4MDIyNywgMHgwMjI4LCAweDAyNWEsCi0gICAgICAgIDB4MDI1YiwgMHgwMjVjLCAweDAyNWQsIDB4MDI1ZSwgMHgwMjVmLCAweDAyNjAsIDB4MDI2MSwgMHgwMjYyLCAweDAyNjMsIDB4MDI2NCwKLSAgICAgICAgMHgwMjY1LCAweDAyNjYsIDB4MDI2NywgMHgwMjY4LCAweDAyNjksIDB4MDI2YSwgMHgwMjZiLCAweDAyNmMsIDB4MDI2ZCwgMHgwMjZlLAotICAgICAgICAweDAyNmYsIDB4MDI3MCwgMHgwMjcxLCAweDAyNzIsIDB4MDI3MywgMHgwMjc0LCAweDAyNzUsIDB4MDI3NiwgMHgwMjc3LCAweDAyNzgsCi0gICAgICAgIDB4MDI3OSwgMHgwMjdhLCAweDAyN2IsIDB4MDI3YywgMHgwMjdkLCAweDAyN2UsIDB4MDI3ZiwgMHgwMjgwLCAweDAyODEsIDB4MDI4MiwKLSAgICAgICAgMHgwMjgzLCAweDAyODUsIDB4MDI4NiwgMHgwMjg3LCAweDAyODgsIDB4MDI4OSwgMHgwMjhhLCAweDAyOGIsIDB4MDI4YywgMHgwMjhkLAotICAgICAgICAweDAyOGUsIDB4MDI4ZiwgMHgwMjkxLCAweDAyYmUsIDB4MDJjMCwgMHgwMmMyLCAweDAyYzQsIDB4MDJjNiwgMHgwMmM4LCAweDAyY2EsCi0gICAgICAgIDB4MDJjYywgMHgwMmQyLCAweDAyZDQsIDB4MDJkYSwgMHgwMmRjLCAweDAyZGUsIDB4MDJlMCwgMHgwMmUyLCAweDAyZTQsIDB4MDJlNiwKLSAgICAgICAgMHgwMmU4LCAweDAyZWEsIDB4MDJlYywgMHgwMmVlCi0gICAgfTsKLQotICAgIC8qKgotICAgICAqIEFVVE8gR0VORVJBVEVEIChieSB0aGUgUHl0aG9uIGNvZGUgYWJvdmUpCi0gICAgICogVGhlIHZhbHVlcyBpbiB0aGlzIHRhYmxlIGFyZSBicm9rZW4gZG93biBhcyBmb2xsb3dzIChtc2IgdG8gbHNiKToKLSAgICAgKiAgICAgaXNvIGNvdW50cnkgY29kZSAxNiBiaXRzCi0gICAgICogICAgICh1bnVzZWQpICAgICAgICAgIDEgYml0Ci0gICAgICogICAgIHdpZmkgY2hhbm5lbCAgICAgIDQgYml0cwotICAgICAqICAgICBzbWFsbGVkIGRpZ2l0ICAgICAyIGJpdHMKLSAgICAgKiAgICAgZGVmYXVsdCB0aW1lem9uZSAgNSBiaXRzCi0gICAgICogICAgIGRlZmF1bHQgbGFuZ3VhZ2UgIDQgYml0cwotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludFtdIElORF9DT0RFUyA9IHsKLSAgICAgICAgMHg2NzcyMDQwMCwgMHg2ZTZjNmM2OCwgMHg2MjY1MDQwMCwgMHg2NjcyMDRiNSwgMHg2ZDYzMDQwMCwgMHg2MTY0MDQwMCwKLSAgICAgICAgMHg2NTczMDRhNCwgMHg2ODc1MDQwMCwgMHg2MjYxMDQwMCwgMHg2ODcyMDQwMCwgMHg3MjczMDQwMCwgMHg2OTc0MDRkNiwKLSAgICAgICAgMHg3NjYxMDRkNiwgMHg3MjZmMDQwMCwgMHg2MzY4MDUwMiwgMHg2MzdhNmNjMSwgMHg3MzZiMDQwMCwgMHg2MTc0NmNlMiwKLSAgICAgICAgMHg2NzYyNmM5MywgMHg2NzYyNmM5MywgMHg2NDZiMDQwMCwgMHg3MzY1MDQwMCwgMHg2ZTZmMDQwMCwgMHg2NjY5MDQwMCwKLSAgICAgICAgMHg2Yzc0MDQwMCwgMHg2Yzc2MDQwMCwgMHg2NTY1MDQwMCwgMHg3Mjc1MDQwMCwgMHg3NTYxMDQwMCwgMHg2Mjc5MDQwMCwKLSAgICAgICAgMHg2ZDY0MDQwMCwgMHg3MDZjMDRmMCwgMHg2NDY1NmM3MiwgMHg2NzY5MDQwMCwgMHg3MDc0MDQwMCwgMHg2Yzc1MDQwMCwKLSAgICAgICAgMHg2OTY1MDQ4MywgMHg2OTczMDQwMCwgMHg2MTZjMDQwMCwgMHg2ZDc0MDQwMCwgMHg2Mzc5MDQwMCwgMHg2NzY1MDQwMCwKLSAgICAgICAgMHg2MTZkMDQwMCwgMHg2MjY3MDQwMCwgMHg3NDcyMDQwMCwgMHg2NjZmMDQwMCwgMHg2NzY1MDQwMCwgMHg2NzZjMDQwMCwKLSAgICAgICAgMHg3MzZkMDQwMCwgMHg3MzZjMDQwMCwgMHg2ZDZiMDQwMCwgMHg2YzY5MDQwMCwgMHg2ZDY1MDQwMCwgMHg2MzYxNWUwMCwKLSAgICAgICAgMHg3MDZkMDQwMCwgMHg3NTczNWUwMywgMHg3NTczNWUwMywgMHg3NTczNWUwMywgMHg3NTczNWUwMywgMHg3NTczNWUwMywKLSAgICAgICAgMHg3NTczNWUwMywgMHg3NTczNWUwMywgMHg3MDcyMDQwMCwgMHg3NjY5MDQwMCwgMHg2ZDc4MDYwMCwgMHg2YTZkMDYwMCwKLSAgICAgICAgMHg2NzcwMDQwMCwgMHg2MjYyMDYwMCwgMHg2MTY3MDYwMCwgMHg2Yjc5MDYwMCwgMHg3NjY3MDYwMCwgMHg2MjZkMDQwMCwKLSAgICAgICAgMHg2NzY0MDQwMCwgMHg2ZDczMDQwMCwgMHg2YjZlMDQwMCwgMHg2YzYzMDQwMCwgMHg3NjYzMDQwMCwgMHg2ZTZjMDQwMCwKLSAgICAgICAgMHg2MTc3MDQwMCwgMHg2MjczMDQwMCwgMHg2MTY5MDYwMCwgMHg2NDZkMDQwMCwgMHg2Mzc1MDQwMCwgMHg2NDZmMDQwMCwKLSAgICAgICAgMHg2ODc0MDQwMCwgMHg3NDc0MDQwMCwgMHg3NDYzMDQwMCwgMHg2MTdhMDQwMCwgMHg2YjdhMDQwMCwgMHg2Mjc0MDQwMCwKLSAgICAgICAgMHg2OTZlMDQwMCwgMHg2OTZlMDQwMCwgMHg3MDZiMDQwMCwgMHg2MTY2MDQwMCwgMHg2YzZiMDQwMCwgMHg2ZDZkMDQwMCwKLSAgICAgICAgMHg2YzYyMDQwMCwgMHg2YTZmMDQwMCwgMHg3Mzc5MDQwMCwgMHg2OTcxMDQwMCwgMHg2Yjc3MDQwMCwgMHg3MzYxMDQwMCwKLSAgICAgICAgMHg3OTY1MDQwMCwgMHg2ZjZkMDQwMCwgMHg3MDczMDQwMCwgMHg2MTY1MDQwMCwgMHg2OTZjMDQwMCwgMHg2MjY4MDQwMCwKLSAgICAgICAgMHg3MTYxMDQwMCwgMHg2ZDZlMDQwMCwgMHg2ZTcwMDQwMCwgMHg2MTY1MDQwMCwgMHg2MTY1MDQwMCwgMHg2OTcyMDQwMCwKLSAgICAgICAgMHg3NTdhMDQwMCwgMHg3NDZhMDQwMCwgMHg2YjY3MDQwMCwgMHg3NDZkMDQwMCwgMHg2YTcwNzQ0NywgMHg2YTcwNzQ0NywKLSAgICAgICAgMHg2YjcyMDQwMCwgMHg3NjZlMDQwMCwgMHg2ODZiMDQwMCwgMHg2ZDZmMDQwMCwgMHg2YjY4MDQwMCwgMHg2YzYxMDQwMCwKLSAgICAgICAgMHg2MzZlNmMyOSwgMHg2MzZlNmMyOSwgMHg3NDc3MDQwMCwgMHg2YjcwMDQwMCwgMHg2MjY0MDQwMCwgMHg2ZDc2MDQwMCwKLSAgICAgICAgMHg2ZDc5MDQwMCwgMHg2MTc1NWM1MywgMHg2OTY0MDQwMCwgMHg3NDZjMDQwMCwgMHg3MDY4MDQwMCwgMHg3NDY4MDQwMCwKLSAgICAgICAgMHg3MzY3NWMzMywgMHg2MjZlMDQwMCwgMHg2ZTdhMDUxMywgMHg2ZDcwMDQwMCwgMHg2Nzc1MDQwMCwgMHg2ZTcyMDQwMCwKLSAgICAgICAgMHg3MDY3MDQwMCwgMHg3NDZmMDQwMCwgMHg3MzYyMDQwMCwgMHg3Njc1MDQwMCwgMHg2NjZhMDQwMCwgMHg3NzY2MDQwMCwKLSAgICAgICAgMHg2MTczMDQwMCwgMHg2YjY5MDQwMCwgMHg2ZTYzMDQwMCwgMHg3MDY2MDQwMCwgMHg2MzZiMDQwMCwgMHg3NzczMDQwMCwKLSAgICAgICAgMHg2NjZkMDQwMCwgMHg2ZDY4MDQwMCwgMHg3MDc3MDQwMCwgMHg2NTY3MDQwMCwgMHg2NDdhMDQwMCwgMHg2ZDYxMDQwMCwKLSAgICAgICAgMHg3NDZlMDQwMCwgMHg2Yzc5MDQwMCwgMHg2NzZkMDQwMCwgMHg3MzZlMDQwMCwgMHg2ZDcyMDQwMCwgMHg2ZDZjMDQwMCwKLSAgICAgICAgMHg2NzZlMDQwMCwgMHg2MzY5MDQwMCwgMHg2MjY2MDQwMCwgMHg2ZTY1MDQwMCwgMHg3NDY3MDQwMCwgMHg2MjZhMDQwMCwKLSAgICAgICAgMHg2ZDc1MDQwMCwgMHg2YzcyMDQwMCwgMHg3MzZjMDQwMCwgMHg2NzY4MDQwMCwgMHg2ZTY3MDQwMCwgMHg3NDY0MDQwMCwKLSAgICAgICAgMHg2MzY2MDQwMCwgMHg2MzZkMDQwMCwgMHg2Mzc2MDQwMCwgMHg3Mzc0MDQwMCwgMHg2NzcxMDQwMCwgMHg2NzYxMDQwMCwKLSAgICAgICAgMHg2MzY3MDQwMCwgMHg2MzY3MDQwMCwgMHg2MTZmMDQwMCwgMHg2Nzc3MDQwMCwgMHg3MzYzMDQwMCwgMHg3MzY0MDQwMCwKLSAgICAgICAgMHg3Mjc3MDQwMCwgMHg2NTc0MDQwMCwgMHg3MzZmMDQwMCwgMHg2NDZhMDQwMCwgMHg2YjY1MDQwMCwgMHg3NDdhMDQwMCwKLSAgICAgICAgMHg3NTY3MDQwMCwgMHg2MjY5MDQwMCwgMHg2ZDdhMDQwMCwgMHg3YTZkMDQwMCwgMHg2ZDY3MDQwMCwgMHg3MjY1MDQwMCwKLSAgICAgICAgMHg3YTc3MDQwMCwgMHg2ZTYxMDQwMCwgMHg2ZDc3MDQwMCwgMHg2YzczMDQwMCwgMHg2Mjc3MDQwMCwgMHg3MzdhMDQwMCwKLSAgICAgICAgMHg2YjZkMDQwMCwgMHg3YTYxMDQxMywgMHg2NTcyMDQwMCwgMHg2MjdhMDQwMCwgMHg2Nzc0MDQwMCwgMHg3Mzc2MDQwMCwKLSAgICAgICAgMHg2ODZlMDYwMCwgMHg2ZTY5MDQwMCwgMHg2MzcyMDQwMCwgMHg3MDYxMDQwMCwgMHg3MDY1MDQwMCwgMHg2MTcyMDYwMCwKLSAgICAgICAgMHg2MjcyMDQwMCwgMHg2MzZjMDQwMCwgMHg2MzZmMDYwMCwgMHg3NjY1MDQwMCwgMHg2MjZmMDQwMCwgMHg2Nzc5MDQwMCwKLSAgICAgICAgMHg2NTYzMDQwMCwgMHg2NzY2MDQwMCwgMHg3MDc5MDQwMCwgMHg3MzcyMDQwMCwgMHg3NTc5MDQwMCwgMHg2NjZiMDQwMAotICAgIH07Ci0KICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiTWNjVGFibGUiOwogCisgICAgc3RhdGljIEFycmF5TGlzdDxNY2NFbnRyeT4gdGFibGU7CisKKyAgICBzdGF0aWMgY2xhc3MgTWNjRW50cnkgaW1wbGVtZW50cyBDb21wYXJhYmxlPE1jY0VudHJ5PgorICAgIHsKKyAgICAgICAgaW50IG1jYzsKKyAgICAgICAgU3RyaW5nIGlzbzsKKyAgICAgICAgaW50IHNtYWxsZXN0RGlnaXRzTW5jOworICAgICAgICBTdHJpbmcgbGFuZ3VhZ2U7CisgICAgICAgIGludCB3aWZpQ2hhbm5lbHM7CisKKyAgICAgICAgTWNjRW50cnkoaW50IG1uYywgU3RyaW5nIGlzbywgaW50IHNtYWxsZXN0RGlnaXRzTUNDKSB7CisgICAgICAgICAgICB0aGlzKG1uYywgaXNvLCBzbWFsbGVzdERpZ2l0c01DQywgbnVsbCk7CisgICAgICAgIH0KKworICAgICAgICBNY2NFbnRyeShpbnQgbW5jLCBTdHJpbmcgaXNvLCBpbnQgc21hbGxlc3REaWdpdHNNQ0MsIFN0cmluZyBsYW5ndWFnZSkgeworICAgICAgICAgICAgdGhpcyhtbmMsIGlzbywgc21hbGxlc3REaWdpdHNNQ0MsIGxhbmd1YWdlLCAwKTsKKyAgICAgICAgfQorCisgICAgICAgIE1jY0VudHJ5KGludCBtbmMsIFN0cmluZyBpc28sIGludCBzbWFsbGVzdERpZ2l0c01DQywgU3RyaW5nIGxhbmd1YWdlLCBpbnQgd2lmaUNoYW5uZWxzKSB7CisgICAgICAgICAgICB0aGlzLm1jYyA9IG1uYzsKKyAgICAgICAgICAgIHRoaXMuaXNvID0gaXNvOworICAgICAgICAgICAgdGhpcy5zbWFsbGVzdERpZ2l0c01uYyA9IHNtYWxsZXN0RGlnaXRzTUNDOworICAgICAgICAgICAgdGhpcy5sYW5ndWFnZSA9IGxhbmd1YWdlOworICAgICAgICAgICAgdGhpcy53aWZpQ2hhbm5lbHMgPSB3aWZpQ2hhbm5lbHM7CisgICAgICAgIH0KKworCisgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZVRvKE1jY0VudHJ5IG8pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBtY2MgLSBvLm1jYzsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIE1jY0VudHJ5CisgICAgZW50cnlGb3JNY2MoaW50IG1jYykKKyAgICB7CisgICAgICAgIGludCBpbmRleDsKKworICAgICAgICBNY2NFbnRyeSBtOworCisgICAgICAgIG0gPSBuZXcgTWNjRW50cnkobWNjLCBudWxsLCAwKTsKKworICAgICAgICBpbmRleCA9IENvbGxlY3Rpb25zLmJpbmFyeVNlYXJjaCh0YWJsZSwgbSk7CisKKyAgICAgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gdGFibGUuZ2V0KGluZGV4KTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIC8qKgotICAgICAqIEdpdmVuIGEgTW9iaWxlIENvdW50cnkgQ29kZSwgcmV0dXJucyBhIGRlZmF1bHQgdGltZSB6b25lIElECi0gICAgICogaWYgYXZhaWxhYmxlLiAgUmV0dXJucyBudWxsIGlmIHVuYXZhaWxhYmxlLgorICAgICAqIFJldHVybnMgYSBkZWZhdWx0IHRpbWUgem9uZSBJRCBmb3IgdGhlIGdpdmVuIE1DQy4KKyAgICAgKiBAcGFyYW0gbWNjIE1vYmlsZSBDb3VudHJ5IENvZGUKKyAgICAgKiBAcmV0dXJuIGRlZmF1bHQgVGltZVpvbmUgSUQsIG9yIG51bGwgaWYgbm90IHNwZWNpZmllZAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlZmF1bHRUaW1lWm9uZUZvck1jYyhpbnQgbWNjKSB7Ci0gICAgICAgIGludCBpbmRleCA9IEFycmF5cy5iaW5hcnlTZWFyY2goTUNDX0NPREVTLCAoc2hvcnQpbWNjKTsKLSAgICAgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICBNY2NFbnRyeSBlbnRyeTsKKworICAgICAgICBlbnRyeSA9IGVudHJ5Rm9yTWNjKG1jYyk7CisgICAgICAgIGlmIChlbnRyeSA9PSBudWxsIHx8IGVudHJ5LmlzbyA9PSBudWxsKSB7CiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExvY2FsZSBsb2NhbGU7CisgICAgICAgICAgICBpZiAoZW50cnkubGFuZ3VhZ2UgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGxvY2FsZSA9IG5ldyBMb2NhbGUoZW50cnkuaXNvKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbG9jYWxlID0gbmV3IExvY2FsZShlbnRyeS5sYW5ndWFnZSwgZW50cnkuaXNvKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN0cmluZ1tdIHR6ID0gVGltZVpvbmVzLmZvckxvY2FsZShsb2NhbGUpOworICAgICAgICAgICAgaWYgKHR6Lmxlbmd0aCA9PSAwKSByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIHJldHVybiB0elswXTsKICAgICAgICAgfQotICAgICAgICBpbnQgaW5kQ29kZSA9IElORF9DT0RFU1tpbmRleF07Ci0gICAgICAgIGludCB0ekluZCA9IChpbmRDb2RlID4+PiA0KSAmIDB4MDAxRjsKLSAgICAgICAgU3RyaW5nIHR6ID0gVFpfU1RSSU5HU1t0ekluZF07Ci0gICAgICAgIGlmICh0eiA9PSAiIikgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHR6OwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdpdmVuIGEgTW9iaWxlIENvdW50cnkgQ29kZSwgcmV0dXJucyBhbiBJU08gdHdvLWNoYXJhY3RlcgotICAgICAqIGNvdW50cnkgY29kZSBpZiBhdmFpbGFibGUuICBSZXR1cm5zICIiIGlmIHVuYXZhaWxhYmxlLgorICAgICAqIEdpdmVuIGEgR1NNIE1vYmlsZSBDb3VudHJ5IENvZGUsIHJldHVybnMKKyAgICAgKiBhbiBJU08gdHdvLWNoYXJhY3RlciBjb3VudHJ5IGNvZGUgaWYgYXZhaWxhYmxlLgorICAgICAqIFJldHVybnMgIiIgaWYgdW5hdmFpbGFibGUuCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY291bnRyeUNvZGVGb3JNY2MoaW50IG1jYykgewotICAgICAgICBpbnQgaW5kZXggPSBBcnJheXMuYmluYXJ5U2VhcmNoKE1DQ19DT0RFUywgKHNob3J0KW1jYyk7Ci0gICAgICAgIGlmIChpbmRleCA8IDApIHsKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZworICAgIGNvdW50cnlDb2RlRm9yTWNjKGludCBtY2MpCisgICAgeworICAgICAgICBNY2NFbnRyeSBlbnRyeTsKKworICAgICAgICBlbnRyeSA9IGVudHJ5Rm9yTWNjKG1jYyk7CisKKyAgICAgICAgaWYgKGVudHJ5ID09IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybiAiIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBlbnRyeS5pc287CiAgICAgICAgIH0KLSAgICAgICAgaW50IGluZENvZGUgPSBJTkRfQ09ERVNbaW5kZXhdOwotICAgICAgICBieXRlW10gaXNvID0geyhieXRlKSgoaW5kQ29kZSA+Pj4gMjQpICYgMHgwMEZGKSwgKGJ5dGUpKChpbmRDb2RlID4+PiAxNikgJiAweDAwRkYpfTsKLSAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoaXNvKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHaXZlbiBhIEdTTSBNb2JpbGUgQ291bnRyeSBDb2RlLCByZXR1cm5zIGFuIElTTyAyLTMgY2hhcmFjdGVyCi0gICAgICogbGFuZ3VhZ2UgY29kZSBpZiBhdmFpbGFibGUuICBSZXR1cm5zIG51bGwgaWYgdW5hdmFpbGFibGUuCisgICAgICogR2l2ZW4gYSBHU00gTW9iaWxlIENvdW50cnkgQ29kZSwgcmV0dXJucworICAgICAqIGFuIElTTyAyLTMgY2hhcmFjdGVyIGxhbmd1YWdlIGNvZGUgaWYgYXZhaWxhYmxlLgorICAgICAqIFJldHVybnMgbnVsbCBpZiB1bmF2YWlsYWJsZS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBkZWZhdWx0TGFuZ3VhZ2VGb3JNY2MoaW50IG1jYykgewotICAgICAgICBpbnQgaW5kZXggPSBBcnJheXMuYmluYXJ5U2VhcmNoKE1DQ19DT0RFUywgKHNob3J0KW1jYyk7Ci0gICAgICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgTWNjRW50cnkgZW50cnk7CisKKyAgICAgICAgZW50cnkgPSBlbnRyeUZvck1jYyhtY2MpOworCisgICAgICAgIGlmIChlbnRyeSA9PSBudWxsKSB7CiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBlbnRyeS5sYW5ndWFnZTsKICAgICAgICAgfQotICAgICAgICBpbnQgaW5kQ29kZSA9IElORF9DT0RFU1tpbmRleF07Ci0gICAgICAgIGludCBsYW5nSW5kID0gaW5kQ29kZSAmIDB4MDAwRjsKLSAgICAgICAgU3RyaW5nIGxhbmcgPSBMQU5HX1NUUklOR1NbbGFuZ0luZF07Ci0gICAgICAgIGlmIChsYW5nID09ICIiKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbGFuZzsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHaXZlbiBhIEdTTSBNb2JpbGUgQ291bnRyeSBDb2RlLCByZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nCi0gICAgICogc21hbGxlc3QgbnVtYmVyIG9mIGRpZ2l0cyBmaWVsZC4gIFJldHVybnMgMiBpZiB1bmF2YWlsYWJsZS4KKyAgICAgKiBHaXZlbiBhIEdTTSBNb2JpbGUgQ291bnRyeSBDb2RlLCByZXR1cm5zCisgICAgICogdGhlIHNtYWxsZXN0IG51bWJlciBvZiBkaWdpdHMgdGhhdCBNIGlmIGF2YWlsYWJsZS4KKyAgICAgKiBSZXR1cm5zIDIgaWYgdW5hdmFpbGFibGUuCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBpbnQgc21hbGxlc3REaWdpdHNNY2NGb3JNbmMoaW50IG1jYykgewotICAgICAgICBpbnQgaW5kZXggPSBBcnJheXMuYmluYXJ5U2VhcmNoKE1DQ19DT0RFUywgKHNob3J0KW1jYyk7Ci0gICAgICAgIGlmIChpbmRleCA8IDApIHsKKyAgICBwdWJsaWMgc3RhdGljIGludAorICAgIHNtYWxsZXN0RGlnaXRzTWNjRm9yTW5jKGludCBtY2MpCisgICAgeworICAgICAgICBNY2NFbnRyeSBlbnRyeTsKKworICAgICAgICBlbnRyeSA9IGVudHJ5Rm9yTWNjKG1jYyk7CisKKyAgICAgICAgaWYgKGVudHJ5ID09IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybiAyOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGVudHJ5LnNtYWxsZXN0RGlnaXRzTW5jOwogICAgICAgICB9Ci0gICAgICAgIGludCBpbmRDb2RlID0gSU5EX0NPREVTW2luZGV4XTsKLSAgICAgICAgaW50IHNtRGlnID0gKGluZENvZGUgPj4+IDkpICYgMHgwMDAzOwotICAgICAgICByZXR1cm4gc21EaWc7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogR2l2ZW4gYSBHU00gTW9iaWxlIENvdW50cnkgQ29kZSwgcmV0dXJucyB0aGUgbnVtYmVyIG9mIHdpZmkKICAgICAgKiBjaGFubmVscyBhbGxvd2VkIGluIHRoYXQgY291bnRyeS4gIFJldHVybnMgMCBpZiB1bmF2YWlsYWJsZS4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGludCB3aWZpQ2hhbm5lbHNGb3JNY2MoaW50IG1jYykgewotICAgICAgICBpbnQgaW5kZXggPSBBcnJheXMuYmluYXJ5U2VhcmNoKE1DQ19DT0RFUywgKHNob3J0KW1jYyk7Ci0gICAgICAgIGlmIChpbmRleCA8IDApIHsKKyAgICBwdWJsaWMgc3RhdGljIGludAorICAgIHdpZmlDaGFubmVsc0Zvck1jYyhpbnQgbWNjKSB7CisgICAgICAgIE1jY0VudHJ5IGVudHJ5OworCisgICAgICAgIGVudHJ5ID0gZW50cnlGb3JNY2MobWNjKTsKKworICAgICAgICBpZiAoZW50cnkgPT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gZW50cnkud2lmaUNoYW5uZWxzOwogICAgICAgICB9Ci0gICAgICAgIGludCBpbmRDb2RlID0gSU5EX0NPREVTW2luZGV4XTsKLSAgICAgICAgaW50IHdpZmkgPSAoaW5kQ29kZSA+Pj4gMTEpICYgMHgwMDBGOwotICAgICAgICByZXR1cm4gd2lmaTsKICAgICB9CiAKICAgICAvKioKQEAgLTY1Niw0ICsyNzYsMjYyIEBACiAgICAgICAgICAgICB3TS5zZXROdW1BbGxvd2VkQ2hhbm5lbHMod2lmaUNoYW5uZWxzLCB0cnVlKTsKICAgICAgICAgfQogICAgIH0KKworICAgIHN0YXRpYyB7CisgICAgICAgIHRhYmxlID0gbmV3IEFycmF5TGlzdDxNY2NFbnRyeT4oMjQwKTsKKworCisgICAgICAgIC8qCisgICAgICAgICAqIFRoZSB0YWJsZSBiZWxvdyBpcyBidWlsdCBmcm9tIHR3byByZXNvdXJjZXM6CisgICAgICAgICAqCisgICAgICAgICAqIDEpIElUVSAiTW9iaWxlIE5ldHdvcmsgQ29kZSAoTU5DKSBmb3IgdGhlIGludGVybmF0aW9uYWwKKyAgICAgICAgICogICBpZGVudGlmaWNhdGlvbiBwbGFuIGZvciBtb2JpbGUgdGVybWluYWxzIGFuZCBtb2JpbGUgdXNlcnMiCisgICAgICAgICAqICAgd2hpY2ggaXMgYXZhaWxhYmxlIGFzIGFuIGFubmV4IHRvIHRoZSBJVFUgb3BlcmF0aW9uYWwgYnVsbGV0aW4KKyAgICAgICAgICogICBhdmFpbGFibGUgaGVyZTogaHR0cDovL3d3dy5pdHUuaW50L2l0dS10L2J1bGxldGluL2FubmV4Lmh0bWwKKyAgICAgICAgICoKKyAgICAgICAgICogMikgVGhlIElTTyAzMTY2IGNvdW50cnkgY29kZXMgbGlzdCwgYXZhaWxhYmxlIGhlcmU6CisgICAgICAgICAqICAgIGh0dHA6Ly93d3cuaXNvLm9yZy9pc28vZW4vcHJvZHMtc2VydmljZXMvaXNvMzE2Nm1hLzAyaXNvLTMxNjYtY29kZS1saXN0cy9pbmRleC5odG1sCisgICAgICAgICAqCisgICAgICAgICAqIFRoaXMgdGFibGUgaGFzIG5vdCBiZWVuIHZlcmlmaWVkLgorICAgICAgICAgKgorICAgICAgICAgKi8KKworCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDIwMiwiZ3IiLDIpKTsJLy9HcmVlY2UKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyMDQsIm5sIiwyLCJubCIsMTMpKTsJLy9OZXRoZXJsYW5kcyAoS2luZ2RvbSBvZiB0aGUpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjA2LCJiZSIsMikpOwkvL0JlbGdpdW0KKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyMDgsImZyIiwyLCJmciIpKTsJLy9GcmFuY2UKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyMTIsIm1jIiwyKSk7CS8vTW9uYWNvIChQcmluY2lwYWxpdHkgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjEzLCJhZCIsMikpOwkvL0FuZG9ycmEgKFByaW5jaXBhbGl0eSBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyMTQsImVzIiwyLCJlcyIpKTsJLy9TcGFpbgorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDIxNiwiaHUiLDIpKTsJLy9IdW5nYXJ5IChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyMTgsImJhIiwyKSk7CS8vQm9zbmlhIGFuZCBIZXJ6ZWdvdmluYQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDIxOSwiaHIiLDIpKTsJLy9Dcm9hdGlhIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyMjAsInJzIiwyKSk7CS8vU2VyYmlhIGFuZCBNb250ZW5lZ3JvCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjIyLCJpdCIsMiwiaXQiKSk7CS8vSXRhbHkKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyMjUsInZhIiwyLCJpdCIpKTsJLy9WYXRpY2FuIENpdHkgU3RhdGUKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyMjYsInJvIiwyKSk7CS8vUm9tYW5pYQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDIyOCwiY2giLDIsImRlIikpOwkvL1N3aXR6ZXJsYW5kIChDb25mZWRlcmF0aW9uIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDIzMCwiY3oiLDIsImNzIiwxMykpOwkvL0N6ZWNoIFJlcHVibGljCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjMxLCJzayIsMikpOwkvL1Nsb3ZhayBSZXB1YmxpYworCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDIzMiwiYXQiLDIsImRlIiwxMykpOwkvL0F1c3RyaWEKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyMzQsImdiIiwyLCJlbiIsMTMpKTsJLy9Vbml0ZWQgS2luZ2RvbSBvZiBHcmVhdCBCcml0YWluIGFuZCBOb3J0aGVybiBJcmVsYW5kCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjM1LCJnYiIsMiwiZW4iLDEzKSk7CS8vVW5pdGVkIEtpbmdkb20gb2YgR3JlYXQgQnJpdGFpbiBhbmQgTm9ydGhlcm4gSXJlbGFuZAorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDIzOCwiZGsiLDIpKTsJLy9EZW5tYXJrCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjQwLCJzZSIsMikpOwkvL1N3ZWRlbgorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDI0Miwibm8iLDIpKTsJLy9Ob3J3YXkKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyNDQsImZpIiwyKSk7CS8vRmlubGFuZAorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDI0NiwibHQiLDIpKTsJLy9MaXRodWFuaWEgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDI0NywibHYiLDIpKTsJLy9MYXR2aWEgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDI0OCwiZWUiLDIpKTsJLy9Fc3RvbmlhIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyNTAsInJ1IiwyKSk7CS8vUnVzc2lhbiBGZWRlcmF0aW9uCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjU1LCJ1YSIsMikpOwkvL1VrcmFpbmUKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyNTcsImJ5IiwyKSk7CS8vQmVsYXJ1cyAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjU5LCJtZCIsMikpOwkvL01vbGRvdmEgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDI2MCwicGwiLDIpKTsJLy9Qb2xhbmQgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDI2MiwiZGUiLDIsImRlIiwxMykpOwkvL0dlcm1hbnkgKEZlZGVyYWwgUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjY2LCJnaSIsMikpOwkvL0dpYnJhbHRhcgorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDI2OCwicHQiLDIpKTsJLy9Qb3J0dWdhbAorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDI3MCwibHUiLDIpKTsJLy9MdXhlbWJvdXJnCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjcyLCJpZSIsMiwiZW4iKSk7CS8vSXJlbGFuZAorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDI3NCwiaXMiLDIpKTsJLy9JY2VsYW5kCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjc2LCJhbCIsMikpOwkvL0FsYmFuaWEgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDI3OCwibXQiLDIpKTsJLy9NYWx0YQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDI4MCwiY3kiLDIpKTsJLy9DeXBydXMgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDI4MiwiZ2UiLDIpKTsJLy9HZW9yZ2lhCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjgzLCJhbSIsMikpOwkvL0FybWVuaWEgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDI4NCwiYmciLDIpKTsJLy9CdWxnYXJpYSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjg2LCJ0ciIsMikpOwkvL1R1cmtleQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDI4OCwiZm8iLDIpKTsJLy9GYXJvZSBJc2xhbmRzCisgICAgICAgICAgICAgICAgdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyODksImdlIiwyKSk7ICAgIC8vQWJraGF6aWEgKEdlb3JnaWEpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjkwLCJnbCIsMikpOwkvL0dyZWVubGFuZCAoRGVubWFyaykKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyOTIsInNtIiwyKSk7CS8vU2FuIE1hcmlubyAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjkzLCJzbCIsMikpOwkvL1Nsb3ZlbmlhIChSZXB1YmxpYyBvZikKKyAgICAgICAgICAgICAgICB0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDI5NCwibWsiLDIpKTsgICAvL1RoZSBGb3JtZXIgWXVnb3NsYXYgUmVwdWJsaWMgb2YgTWFjZWRvbmlhCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjk1LCJsaSIsMikpOwkvL0xpZWNodGVuc3RlaW4gKFByaW5jaXBhbGl0eSBvZikKKyAgICAgICAgICAgICAgICB0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDI5NywibWUiLDIpKTsgICAgLy9Nb250ZW5lZ3JvIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgzMDIsImNhIiwzLCIiLDExKSk7CS8vQ2FuYWRhCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMzA4LCJwbSIsMikpOwkvL1NhaW50IFBpZXJyZSBhbmQgTWlxdWVsb24gKENvbGxlY3Rpdml0IHRlcnJpdG9yaWFsZSBkZSBsYSBScHVibGlxdWUgZnJhbmFpc2UpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMzEwLCJ1cyIsMywiZW4iLDExKSk7CS8vVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMzExLCJ1cyIsMywiZW4iLDExKSk7CS8vVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMzEyLCJ1cyIsMywiZW4iLDExKSk7CS8vVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMzEzLCJ1cyIsMywiZW4iLDExKSk7CS8vVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMzE0LCJ1cyIsMywiZW4iLDExKSk7CS8vVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMzE1LCJ1cyIsMywiZW4iLDExKSk7CS8vVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMzE2LCJ1cyIsMywiZW4iLDExKSk7CS8vVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMzMwLCJwciIsMikpOwkvL1B1ZXJ0byBSaWNvCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMzMyLCJ2aSIsMikpOwkvL1VuaXRlZCBTdGF0ZXMgVmlyZ2luIElzbGFuZHMKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgzMzQsIm14IiwzKSk7CS8vTWV4aWNvCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMzM4LCJqbSIsMykpOwkvL0phbWFpY2EKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgzNDAsImdwIiwyKSk7CS8vR3VhZGVsb3VwZSAoRnJlbmNoIERlcGFydG1lbnQgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMzQyLCJiYiIsMykpOwkvL0JhcmJhZG9zCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMzQ0LCJhZyIsMykpOwkvL0FudGlndWEgYW5kIEJhcmJ1ZGEKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgzNDYsImt5IiwzKSk7CS8vQ2F5bWFuIElzbGFuZHMKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgzNDgsInZnIiwzKSk7CS8vQnJpdGlzaCBWaXJnaW4gSXNsYW5kcworCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDM1MCwiYm0iLDIpKTsJLy9CZXJtdWRhCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMzUyLCJnZCIsMikpOwkvL0dyZW5hZGEKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgzNTQsIm1zIiwyKSk7CS8vTW9udHNlcnJhdAorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDM1Niwia24iLDIpKTsJLy9TYWludCBLaXR0cyBhbmQgTmV2aXMKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgzNTgsImxjIiwyKSk7CS8vU2FpbnQgTHVjaWEKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgzNjAsInZjIiwyKSk7CS8vU2FpbnQgVmluY2VudCBhbmQgdGhlIEdyZW5hZGluZXMKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgzNjIsIm5sIiwyKSk7CS8vTmV0aGVybGFuZHMgQW50aWxsZXMKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgzNjMsImF3IiwyKSk7CS8vQXJ1YmEKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgzNjQsImJzIiwyKSk7CS8vQmFoYW1hcyAoQ29tbW9ud2VhbHRoIG9mIHRoZSkKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgzNjUsImFpIiwzKSk7CS8vQW5ndWlsbGEKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgzNjYsImRtIiwyKSk7CS8vRG9taW5pY2EgKENvbW1vbndlYWx0aCBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgzNjgsImN1IiwyKSk7CS8vQ3ViYQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDM3MCwiZG8iLDIpKTsJLy9Eb21pbmljYW4gUmVwdWJsaWMKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgzNzIsImh0IiwyKSk7CS8vSGFpdGkgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDM3NCwidHQiLDIpKTsJLy9UcmluaWRhZCBhbmQgVG9iYWdvCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMzc2LCJ0YyIsMikpOwkvL1R1cmtzIGFuZCBDYWljb3MgSXNsYW5kcworCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQwMCwiYXoiLDIpKTsJLy9BemVyYmFpamFuaSBSZXB1YmxpYworCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQwMSwia3oiLDIpKTsJLy9LYXpha2hzdGFuIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0MDIsImJ0IiwyKSk7CS8vQmh1dGFuIChLaW5nZG9tIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQwNCwiaW4iLDIpKTsJLy9JbmRpYSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNDA1LCJpbiIsMikpOwkvL0luZGlhIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0MTAsInBrIiwyKSk7CS8vUGFraXN0YW4gKElzbGFtaWMgUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNDEyLCJhZiIsMikpOwkvL0FmZ2hhbmlzdGFuCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNDEzLCJsayIsMikpOwkvL1NyaSBMYW5rYSAoRGVtb2NyYXRpYyBTb2NpYWxpc3QgUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNDE0LCJtbSIsMikpOwkvL015YW5tYXIgKFVuaW9uIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQxNSwibGIiLDIpKTsJLy9MZWJhbm9uCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNDE2LCJqbyIsMikpOwkvL0pvcmRhbiAoSGFzaGVtaXRlIEtpbmdkb20gb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNDE3LCJzeSIsMikpOwkvL1N5cmlhbiBBcmFiIFJlcHVibGljCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNDE4LCJpcSIsMikpOwkvL0lyYXEgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQxOSwia3ciLDIpKTsJLy9LdXdhaXQgKFN0YXRlIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQyMCwic2EiLDIpKTsJLy9TYXVkaSBBcmFiaWEgKEtpbmdkb20gb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNDIxLCJ5ZSIsMikpOwkvL1llbWVuIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0MjIsIm9tIiwyKSk7CS8vT21hbiAoU3VsdGFuYXRlIG9mKQorICAgICAgICAgICAgICAgIHRhYmxlLmFkZChuZXcgTWNjRW50cnkoNDIzLCJwcyIsMikpOyAgICAvL1BhbGVzdGluZQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQyNCwiYWUiLDIpKTsJLy9Vbml0ZWQgQXJhYiBFbWlyYXRlcworCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQyNSwiaWwiLDIpKTsJLy9Jc3JhZWwgKFN0YXRlIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQyNiwiYmgiLDIpKTsJLy9CYWhyYWluIChLaW5nZG9tIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQyNywicWEiLDIpKTsJLy9RYXRhciAoU3RhdGUgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNDI4LCJtbiIsMikpOwkvL01vbmdvbGlhCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNDI5LCJucCIsMikpOwkvL05lcGFsCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNDMwLCJhZSIsMikpOwkvL1VuaXRlZCBBcmFiIEVtaXJhdGVzCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNDMxLCJhZSIsMikpOwkvL1VuaXRlZCBBcmFiIEVtaXJhdGVzCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNDMyLCJpciIsMikpOwkvL0lyYW4gKElzbGFtaWMgUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNDM0LCJ1eiIsMikpOwkvL1V6YmVraXN0YW4gKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQzNiwidGoiLDIpKTsJLy9UYWppa2lzdGFuIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0MzcsImtnIiwyKSk7CS8vS3lyZ3l6IFJlcHVibGljCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNDM4LCJ0bSIsMikpOwkvL1R1cmttZW5pc3RhbgorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQ0MCwianAiLDIsImphIiwxNCkpOwkvL0phcGFuCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNDQxLCJqcCIsMiwiamEiLDE0KSk7CS8vSmFwYW4KKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0NTAsImtyIiwyLCJrbyIsMTMpKTsJLy9Lb3JlYSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNDUyLCJ2biIsMikpOwkvL1ZpZXQgTmFtIChTb2NpYWxpc3QgUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNDU0LCJoayIsMikpOwkvLyJIb25nIEtvbmcsIENoaW5hIgorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQ1NSwibW8iLDIpKTsJLy8iTWFjYW8sIENoaW5hIgorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQ1Niwia2giLDIpKTsJLy9DYW1ib2RpYSAoS2luZ2RvbSBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0NTcsImxhIiwyKSk7CS8vTGFvIFBlb3BsZSdzIERlbW9jcmF0aWMgUmVwdWJsaWMKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0NjAsImNuIiwyLCJ6aCIsMTMpKTsJLy9DaGluYSAoUGVvcGxlJ3MgUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNDYxLCJjbiIsMiwiemgiLDEzKSk7CS8vQ2hpbmEgKFBlb3BsZSdzIFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQ2NiwidHciLDIpKTsJLy8iVGFpd2FuLCBDaGluYSIKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0NjcsImtwIiwyKSk7CS8vRGVtb2NyYXRpYyBQZW9wbGUncyBSZXB1YmxpYyBvZiBLb3JlYQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQ3MCwiYmQiLDIpKTsJLy9CYW5nbGFkZXNoIChQZW9wbGUncyBSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0NzIsIm12IiwyKSk7CS8vTWFsZGl2ZXMgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDUwMiwibXkiLDIpKTsJLy9NYWxheXNpYQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDUwNSwiYXUiLDIsImVuIiwxMSkpOwkvL0F1c3RyYWxpYQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDUxMCwiaWQiLDIpKTsJLy9JbmRvbmVzaWEgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDUxNCwidGwiLDIpKTsJLy9EZW1vY3JhdGljIFJlcHVibGljIG9mIFRpbW9yLUxlc3RlCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNTE1LCJwaCIsMikpOwkvL1BoaWxpcHBpbmVzIChSZXB1YmxpYyBvZiB0aGUpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNTIwLCJ0aCIsMikpOwkvL1RoYWlsYW5kCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNTI1LCJzZyIsMiwiZW4iLDExKSk7CS8vU2luZ2Fwb3JlIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg1MjgsImJuIiwyKSk7CS8vQnJ1bmVpIERhcnVzc2FsYW0KKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg1MzAsIm56IiwyLCAiZW4iKSk7CS8vTmV3IFplYWxhbmQKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg1MzQsIm1wIiwyKSk7CS8vTm9ydGhlcm4gTWFyaWFuYSBJc2xhbmRzIChDb21tb253ZWFsdGggb2YgdGhlKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDUzNSwiZ3UiLDIpKTsJLy9HdWFtCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNTM2LCJuciIsMikpOwkvL05hdXJ1IChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg1MzcsInBnIiwyKSk7CS8vUGFwdWEgTmV3IEd1aW5lYQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDUzOSwidG8iLDIpKTsJLy9Ub25nYSAoS2luZ2RvbSBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg1NDAsInNiIiwyKSk7CS8vU29sb21vbiBJc2xhbmRzCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNTQxLCJ2dSIsMikpOwkvL1ZhbnVhdHUgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDU0MiwiZmoiLDIpKTsJLy9GaWppIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg1NDMsIndmIiwyKSk7CS8vV2FsbGlzIGFuZCBGdXR1bmEgKFRlcnJpdG9pcmUgZnJhbmFpcyBkJ291dHJlLW1lcikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg1NDQsImFzIiwyKSk7CS8vQW1lcmljYW4gU2Ftb2EKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg1NDUsImtpIiwyKSk7CS8vS2lyaWJhdGkgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDU0NiwibmMiLDIpKTsJLy9OZXcgQ2FsZWRvbmlhIChUZXJyaXRvaXJlIGZyYW5haXMgZCdvdXRyZS1tZXIpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNTQ3LCJwZiIsMikpOwkvL0ZyZW5jaCBQb2x5bmVzaWEgKFRlcnJpdG9pcmUgZnJhbmFpcyBkJ291dHJlLW1lcikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg1NDgsImNrIiwyKSk7CS8vQ29vayBJc2xhbmRzCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNTQ5LCJ3cyIsMikpOwkvL1NhbW9hIChJbmRlcGVuZGVudCBTdGF0ZSBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg1NTAsImZtIiwyKSk7CS8vTWljcm9uZXNpYSAoRmVkZXJhdGVkIFN0YXRlcyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg1NTEsIm1oIiwyKSk7CS8vTWFyc2hhbGwgSXNsYW5kcyAoUmVwdWJsaWMgb2YgdGhlKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDU1MiwicHciLDIpKTsJLy9QYWxhdSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjAyLCJlZyIsMikpOwkvL0VneXB0IChBcmFiIFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDYwMywiZHoiLDIpKTsJLy9BbGdlcmlhIChQZW9wbGUncyBEZW1vY3JhdGljIFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDYwNCwibWEiLDIpKTsJLy9Nb3JvY2NvIChLaW5nZG9tIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDYwNSwidG4iLDIpKTsJLy9UdW5pc2lhCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjA2LCJseSIsMikpOwkvL0xpYnlhIChTb2NpYWxpc3QgUGVvcGxlJ3MgTGlieWFuIEFyYWIgSmFtYWhpcml5YSkKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2MDcsImdtIiwyKSk7CS8vR2FtYmlhIChSZXB1YmxpYyBvZiB0aGUpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjA4LCJzbiIsMikpOwkvL1NlbmVnYWwgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDYwOSwibXIiLDIpKTsJLy9NYXVyaXRhbmlhIChJc2xhbWljIFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDYxMCwibWwiLDIpKTsJLy9NYWxpIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2MTEsImduIiwyKSk7CS8vR3VpbmVhIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2MTIsImNpIiwyKSk7CS8vQ3RlIGQnSXZvaXJlIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2MTMsImJmIiwyKSk7CS8vQnVya2luYSBGYXNvCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjE0LCJuZSIsMikpOwkvL05pZ2VyIChSZXB1YmxpYyBvZiB0aGUpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjE1LCJ0ZyIsMikpOwkvL1RvZ29sZXNlIFJlcHVibGljCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjE2LCJiaiIsMikpOwkvL0JlbmluIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2MTcsIm11IiwyKSk7CS8vTWF1cml0aXVzIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2MTgsImxyIiwyKSk7CS8vTGliZXJpYSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjE5LCJzbCIsMikpOwkvL1NpZXJyYSBMZW9uZQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDYyMCwiZ2giLDIpKTsJLy9HaGFuYQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDYyMSwibmciLDIpKTsJLy9OaWdlcmlhIChGZWRlcmFsIFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDYyMiwidGQiLDIpKTsJLy9DaGFkIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2MjMsImNmIiwyKSk7CS8vQ2VudHJhbCBBZnJpY2FuIFJlcHVibGljCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjI0LCJjbSIsMikpOwkvL0NhbWVyb29uIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2MjUsImN2IiwyKSk7CS8vQ2FwZSBWZXJkZSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjI2LCJzdCIsMikpOwkvL1NhbyBUb21lIGFuZCBQcmluY2lwZSAoRGVtb2NyYXRpYyBSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2MjcsImdxIiwyKSk7CS8vRXF1YXRvcmlhbCBHdWluZWEgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDYyOCwiZ2EiLDIpKTsJLy9HYWJvbmVzZSBSZXB1YmxpYworCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDYyOSwiY2ciLDIpKTsJLy9Db25nbyAoUmVwdWJsaWMgb2YgdGhlKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDYzMCwiY2ciLDIpKTsJLy9EZW1vY3JhdGljIFJlcHVibGljIG9mIHRoZSBDb25nbworCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDYzMSwiYW8iLDIpKTsJLy9BbmdvbGEgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDYzMiwiZ3ciLDIpKTsJLy9HdWluZWEtQmlzc2F1IChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2MzMsInNjIiwyKSk7CS8vU2V5Y2hlbGxlcyAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjM0LCJzZCIsMikpOwkvL1N1ZGFuIChSZXB1YmxpYyBvZiB0aGUpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjM1LCJydyIsMikpOwkvL1J3YW5kYSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjM2LCJldCIsMikpOwkvL0V0aGlvcGlhIChGZWRlcmFsIERlbW9jcmF0aWMgUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjM3LCJzbyIsMikpOwkvL1NvbWFsaSBEZW1vY3JhdGljIFJlcHVibGljCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjM4LCJkaiIsMikpOwkvL0RqaWJvdXRpIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2MzksImtlIiwyKSk7CS8vS2VueWEgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDY0MCwidHoiLDIpKTsJLy9UYW56YW5pYSAoVW5pdGVkIFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDY0MSwidWciLDIpKTsJLy9VZ2FuZGEgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDY0MiwiYmkiLDIpKTsJLy9CdXJ1bmRpIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2NDMsIm16IiwyKSk7CS8vTW96YW1iaXF1ZSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjQ1LCJ6bSIsMikpOwkvL1phbWJpYSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjQ2LCJtZyIsMikpOwkvL01hZGFnYXNjYXIgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDY0NywicmUiLDIpKTsJLy9SZXVuaW9uIChGcmVuY2ggRGVwYXJ0bWVudCBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2NDgsInp3IiwyKSk7CS8vWmltYmFid2UgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDY0OSwibmEiLDIpKTsJLy9OYW1pYmlhIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2NTAsIm13IiwyKSk7CS8vTWFsYXdpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjUxLCJscyIsMikpOwkvL0xlc290aG8gKEtpbmdkb20gb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjUyLCJidyIsMikpOwkvL0JvdHN3YW5hIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2NTMsInN6IiwyKSk7CS8vU3dhemlsYW5kIChLaW5nZG9tIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDY1NCwia20iLDIpKTsJLy9Db21vcm9zIChVbmlvbiBvZiB0aGUpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjU1LCJ6YSIsMiwiZW4iKSk7CS8vU291dGggQWZyaWNhIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2NTcsImVyIiwyKSk7CS8vRXJpdHJlYQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDcwMiwiYnoiLDIpKTsJLy9CZWxpemUKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg3MDQsImd0IiwyKSk7CS8vR3VhdGVtYWxhIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg3MDYsInN2IiwyKSk7CS8vRWwgU2FsdmFkb3IgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDcwOCwiaG4iLDMpKTsJLy9Ib25kdXJhcyAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNzEwLCJuaSIsMikpOwkvL05pY2FyYWd1YQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDcxMiwiY3IiLDIpKTsJLy9Db3N0YSBSaWNhCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNzE0LCJwYSIsMikpOwkvL1BhbmFtYSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNzE2LCJwZSIsMikpOwkvL1BlcnUKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg3MjIsImFyIiwzKSk7CS8vQXJnZW50aW5lIFJlcHVibGljCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNzI0LCJiciIsMikpOwkvL0JyYXppbCAoRmVkZXJhdGl2ZSBSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg3MzAsImNsIiwyKSk7CS8vQ2hpbGUKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg3MzIsImNvIiwzKSk7CS8vQ29sb21iaWEgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDczNCwidmUiLDIpKTsJLy9WZW5lenVlbGEgKEJvbGl2YXJpYW4gUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNzM2LCJibyIsMikpOwkvL0JvbGl2aWEgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDczOCwiZ3kiLDIpKTsJLy9HdXlhbmEKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg3NDAsImVjIiwyKSk7CS8vRWN1YWRvcgorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDc0MiwiZ2YiLDIpKTsJLy9GcmVuY2ggR3VpYW5hIChGcmVuY2ggRGVwYXJ0bWVudCBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg3NDQsInB5IiwyKSk7CS8vUGFyYWd1YXkgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDc0Niwic3IiLDIpKTsJLy9TdXJpbmFtZSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNzQ4LCJ1eSIsMikpOwkvL1VydWd1YXkgKEVhc3Rlcm4gUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNzUwLCJmayIsMikpOwkvL0ZhbGtsYW5kIElzbGFuZHMgKE1hbHZpbmFzKQorICAgICAgICAvL3RhYmxlLmFkZChuZXcgTWNjRW50cnkoOTAxLCIiLDIpKTsJLy8iSW50ZXJuYXRpb25hbCBNb2JpbGUsIHNoYXJlZCBjb2RlIgorCisgICAgICAgIENvbGxlY3Rpb25zLnNvcnQodGFibGUpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9QaG9uZS5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Bob25lLmphdmEKaW5kZXggOWFmYWRlMy4uNzg0ZTg3ZCAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Bob25lLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Bob25lLmphdmEKQEAgLTE4LDYgKzE4LDcgQEAKIAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5TaGFyZWRQcmVmZXJlbmNlczsKK2ltcG9ydCBhbmRyb2lkLm5ldC5OZXR3b3JrUHJvcGVydGllczsKIGltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwogaW1wb3J0IGFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlTWFuYWdlcjsKQEAgLTk5LDExICsxMDAsMTEgQEAKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFBIT05FX05BTUVfS0VZID0gInBob25lTmFtZSI7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBGQUlMVVJFX1JFQVNPTl9LRVkgPSAicmVhc29uIjsKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVRFX0NIQU5HRV9SRUFTT05fS0VZID0gInJlYXNvbiI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRBX0FQTl9UWVBFU19LRVkgPSAiYXBuVHlwZSI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRBX0FQTl9UWVBFX0tFWSA9ICJhcG5UeXBlIjsKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEFfQVBOX0tFWSA9ICJhcG4iOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFUQV9ORVRXT1JLX1BST1BFUlRJRVNfS0VZID0gImRhdGFQcm9wZXJ0aWVzIjsKIAogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFUQV9JRkFDRV9OQU1FX0tFWSA9ICJpZmFjZSI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRBX0dBVEVXQVlfS0VZID0gImdhdGV3YXkiOwogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVUV09SS19VTkFWQUlMQUJMRV9LRVkgPSAibmV0d29ya1VudmFpbGFibGUiOwogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEhPTkVfSU5fRUNNX1NUQVRFID0gInBob25laW5FQ01TdGF0ZSI7CiAKQEAgLTI0MywxMyArMjQ0LDIxIEBACiAgICAgQ2VsbExvY2F0aW9uIGdldENlbGxMb2NhdGlvbigpOwogCiAgICAgLyoqCi0gICAgICogR2V0IHRoZSBjdXJyZW50IERhdGFTdGF0ZS4gTm8gY2hhbmdlIG5vdGlmaWNhdGlvbiBleGlzdHMgYXQgdGhpcwotICAgICAqIGludGVyZmFjZSAtLSB1c2UKKyAgICAgKiBHZXQgdGhlIGN1cnJlbnQgZm9yIHRoZSBkZWZhdWx0IGFwbiBEYXRhU3RhdGUuIE5vIGNoYW5nZSBub3RpZmljYXRpb24KKyAgICAgKiBleGlzdHMgYXQgdGhpcyBpbnRlcmZhY2UgLS0gdXNlCiAgICAgICoge0BsaW5rIGFuZHJvaWQudGVsZXBob255LlBob25lU3RhdGVMaXN0ZW5lcn0gaW5zdGVhZC4KICAgICAgKi8KICAgICBEYXRhU3RhdGUgZ2V0RGF0YUNvbm5lY3Rpb25TdGF0ZSgpOwogCiAgICAgLyoqCisgICAgICogR2V0IHRoZSBjdXJyZW50IERhdGFTdGF0ZS4gTm8gY2hhbmdlIG5vdGlmaWNhdGlvbiBleGlzdHMgYXQgdGhpcworICAgICAqIGludGVyZmFjZSAtLSB1c2UKKyAgICAgKiB7QGxpbmsgYW5kcm9pZC50ZWxlcGhvbnkuUGhvbmVTdGF0ZUxpc3RlbmVyfSBpbnN0ZWFkLgorICAgICAqIEBwYXJhbSBhcG5UeXBlIHNwZWNpZnkgZm9yIHdoaWNoIGFwbiB0byBnZXQgY29ubmVjdGlvbiBzdGF0ZSBpbmZvLgorICAgICAqLworICAgIERhdGFTdGF0ZSBnZXREYXRhQ29ubmVjdGlvblN0YXRlKFN0cmluZyBhcG5UeXBlKTsKKworICAgIC8qKgogICAgICAqIEdldCB0aGUgY3VycmVudCBEYXRhQWN0aXZpdHlTdGF0ZS4gTm8gY2hhbmdlIG5vdGlmaWNhdGlvbiBleGlzdHMgYXQgdGhpcwogICAgICAqIGludGVyZmFjZSAtLSB1c2UKICAgICAgKiB7QGxpbmsgYW5kcm9pZC50ZWxlcGhvbnkuVGVsZXBob255TWFuYWdlcn0gaW5zdGVhZC4KQEAgLTMxMyw2ICszMjIsMTEgQEAKICAgICBTdHJpbmcgZ2V0QWN0aXZlQXBuKCk7CiAKICAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIE5ldHdvcmtQcm9wZXJ0aWVzIGZvciB0aGUgbmFtZWQgYXBuIG9yIG51bGwgaWYgbm90IGF2YWlsYWJsZQorICAgICAqLworICAgIE5ldHdvcmtQcm9wZXJ0aWVzIGdldE5ldHdvcmtQcm9wZXJ0aWVzKFN0cmluZyBhcG5UeXBlKTsKKworICAgIC8qKgogICAgICAqIEdldCBjdXJyZW50IHNpZ25hbCBzdHJlbmd0aC4gTm8gY2hhbmdlIG5vdGlmaWNhdGlvbiBhdmFpbGFibGUgb24gdGhpcwogICAgICAqIGludGVyZmFjZS4gVXNlIDxjb2RlPlBob25lU3RhdGVOb3RpZmllcjwvY29kZT4gb3IgYW4gZXF1aXZhbGVudC4KICAgICAgKiBBbiBBU1UgaXMgMC0zMSBvciAtMSBpZiB1bmtub3duIChmb3IgR1NNLCBkQm0gPSAtMTEzIC0gMiAqIGFzdSkuCkBAIC0xNTM1LDYgKzE1NDksMTEgQEAKICAgICBib29sZWFuIGlzT3RhU3BOdW1iZXIoU3RyaW5nIGRpYWxTdHIpOwogCiAgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIE9UQSBTZXJ2aWNlIFByb3Zpc2lvbmluZyBuZWVkcyB0byBiZSBwZXJmb3JtZWQuCisgICAgICovCisgICAgYm9vbGVhbiBuZWVkc090YVNlcnZpY2VQcm92aXNpb25pbmcoKTsKKworICAgIC8qKgogICAgICAqIFJlZ2lzdGVyIGZvciBub3RpZmljYXRpb25zIHdoZW4gQ0RNQSBjYWxsIHdhaXRpbmcgY29tZXMKICAgICAgKgogICAgICAqIEBwYXJhbSBoIEhhbmRsZXIgdGhhdCByZWNlaXZlcyB0aGUgbm90aWZpY2F0aW9uIG1lc3NhZ2UuCmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvUGhvbmVCYXNlLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvUGhvbmVCYXNlLmphdmEKaW5kZXggNzQ2MDFlNi4uZTU5NjhhNyAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Bob25lQmFzZS5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9QaG9uZUJhc2UuamF2YQpAQCAtMjEsNiArMjEsNyBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuU2hhcmVkUHJlZmVyZW5jZXM7CitpbXBvcnQgYW5kcm9pZC5uZXQuTmV0d29ya1Byb3BlcnRpZXM7CiBpbXBvcnQgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLm9zLkFzeW5jUmVzdWx0OwogaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKQEAgLTczNyw4ICs3MzgsMTMgQEAKICAgICAgICAgbU5vdGlmaWVyLm5vdGlmeU1lc3NhZ2VXYWl0aW5nQ2hhbmdlZCh0aGlzKTsKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBub3RpZnlEYXRhQ29ubmVjdGlvbihTdHJpbmcgcmVhc29uKSB7Ci0gICAgICAgIG1Ob3RpZmllci5ub3RpZnlEYXRhQ29ubmVjdGlvbih0aGlzLCByZWFzb24pOworICAgIHB1YmxpYyB2b2lkIG5vdGlmeURhdGFDb25uZWN0aW9uKFN0cmluZyByZWFzb24sIFN0cmluZyBhcG5UeXBlLAorICAgICAgICAgICAgUGhvbmUuRGF0YVN0YXRlIHN0YXRlKSB7CisgICAgICAgIG1Ob3RpZmllci5ub3RpZnlEYXRhQ29ubmVjdGlvbih0aGlzLCByZWFzb24sIGFwblR5cGUsIHN0YXRlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBub3RpZnlEYXRhQ29ubmVjdGlvbihTdHJpbmcgcmVhc29uLCBTdHJpbmcgYXBuVHlwZSkgeworICAgICAgICBtTm90aWZpZXIubm90aWZ5RGF0YUNvbm5lY3Rpb24odGhpcywgcmVhc29uLCBhcG5UeXBlKTsKICAgICB9CiAKICAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFBob25lTmFtZSgpOwpAQCAtODI0LDkgKzgzMCwxOSBAQAogICAgICAgICBsb2dVbmV4cGVjdGVkQ2RtYU1ldGhvZENhbGwoInVucmVnaXN0ZXJGb3JTdWJzY3JpcHRpb25JbmZvUmVhZHkiKTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgT1RBIFNlcnZpY2UgUHJvdmlzaW9uaW5nIG5lZWRzIHRvIGJlIHBlcmZvcm1lZC4KKyAgICAgKiBJZiBub3Qgb3ZlcnJpZGRlbiByZXR1cm4gZmFsc2UuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gbmVlZHNPdGFTZXJ2aWNlUHJvdmlzaW9uaW5nKCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRydWUgaWYgbnVtYmVyIGlzIGFuIE9UQVNQIG51bWJlci4KKyAgICAgKiBJZiBub3Qgb3ZlcnJpZGRlbiByZXR1cm4gZmFsc2UuCisgICAgICovCiAgICAgcHVibGljICBib29sZWFuIGlzT3RhU3BOdW1iZXIoU3RyaW5nIGRpYWxTdHIpIHsKLSAgICAgICAgLy8gVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgb3ZlcnJpZGRlbiBieSB0aGUgY2xhc3MgQ0RNQVBob25lLiBOb3QgaW1wbGVtZW50ZWQgaW4gR1NNUGhvbmUuCi0gICAgICAgIGxvZ1VuZXhwZWN0ZWRDZG1hTWV0aG9kQ2FsbCgiaXNPdGFTcE51bWJlciIpOwogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCkBAIC05NDAsNiArOTU2LDEwIEBACiAgICAgICAgIHJldHVybiBtRGF0YUNvbm5lY3Rpb24uZ2V0QWN0aXZlQXBuVHlwZXMoKTsKICAgICB9CiAKKyAgICBwdWJsaWMgTmV0d29ya1Byb3BlcnRpZXMgZ2V0TmV0d29ya1Byb3BlcnRpZXMoU3RyaW5nIGFwblR5cGUpIHsKKyAgICAgICAgcmV0dXJuIG1EYXRhQ29ubmVjdGlvbi5nZXROZXR3b3JrUHJvcGVydGllcyhhcG5UeXBlKTsKKyAgICB9CisKICAgICBwdWJsaWMgU3RyaW5nIGdldEFjdGl2ZUFwbigpIHsKICAgICAgICAgcmV0dXJuIG1EYXRhQ29ubmVjdGlvbi5nZXRBY3RpdmVBcG5TdHJpbmcoKTsKICAgICB9CkBAIC05NTIsNiArOTcyLDEwIEBACiAgICAgICAgIHJldHVybiBtRGF0YUNvbm5lY3Rpb24uZGlzYWJsZUFwblR5cGUodHlwZSk7CiAgICAgfQogCisgICAgcHVibGljIGJvb2xlYW4gaXNEYXRhQ29ubmVjdGl2aXR5UG9zc2libGUoKSB7CisgICAgICAgIHJldHVybiAoKG1EYXRhQ29ubmVjdGlvbiAhPSBudWxsKSAmJiAobURhdGFDb25uZWN0aW9uLmlzRGF0YVBvc3NpYmxlKCkpKTsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBzaW11bGF0ZURhdGFDb25uZWN0aW9uCiAgICAgICoKQEAgLTk4MCw3ICsxMDA0LDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIG1EYXRhQ29ubmVjdGlvbi5zZXRTdGF0ZShkY1N0YXRlKTsKLSAgICAgICAgbm90aWZ5RGF0YUNvbm5lY3Rpb24obnVsbCk7CisgICAgICAgIG5vdGlmeURhdGFDb25uZWN0aW9uKG51bGwsIFBob25lLkFQTl9UWVBFX0RFRkFVTFQpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTAyNiw0ICsxMDUwLDggQEAKICAgICAgICAgTG9nLmUoTE9HX1RBRywgIkVycm9yISAiICsgbmFtZSArICIoKSBpbiBQaG9uZUJhc2Ugc2hvdWxkIG5vdCBiZSAiICsKICAgICAgICAgICAgICAgICAiY2FsbGVkLCBDRE1BUGhvbmUgaW5hY3RpdmUuIik7CiAgICAgfQorCisgICAgcHVibGljIERhdGFTdGF0ZSBnZXREYXRhQ29ubmVjdGlvblN0YXRlKCkgeworICAgICAgICByZXR1cm4gZ2V0RGF0YUNvbm5lY3Rpb25TdGF0ZShBUE5fVFlQRV9ERUZBVUxUKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvUGhvbmVOb3RpZmllci5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Bob25lTm90aWZpZXIuamF2YQppbmRleCBlOTZlZWFlLi42OTEyNzFmIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvUGhvbmVOb3RpZmllci5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9QaG9uZU5vdGlmaWVyLmphdmEKQEAgLTMzLDkgKzMzLDEyIEBACiAKICAgICBwdWJsaWMgdm9pZCBub3RpZnlDYWxsRm9yd2FyZGluZ0NoYW5nZWQoUGhvbmUgc2VuZGVyKTsKIAotICAgIHB1YmxpYyB2b2lkIG5vdGlmeURhdGFDb25uZWN0aW9uKFBob25lIHNlbmRlciwgU3RyaW5nIHJlYXNvbik7CisgICAgcHVibGljIHZvaWQgbm90aWZ5RGF0YUNvbm5lY3Rpb24oUGhvbmUgc2VuZGVyLCBTdHJpbmcgcmVhc29uLCBTdHJpbmcgYXBuVHlwZSk7CiAKLSAgICBwdWJsaWMgdm9pZCBub3RpZnlEYXRhQ29ubmVjdGlvbkZhaWxlZChQaG9uZSBzZW5kZXIsIFN0cmluZyByZWFzb24pOworICAgIHB1YmxpYyB2b2lkIG5vdGlmeURhdGFDb25uZWN0aW9uKFBob25lIHNlbmRlciwgU3RyaW5nIHJlYXNvbiwgU3RyaW5nIGFwblR5cGUsCisgICAgICAgICAgICBQaG9uZS5EYXRhU3RhdGUgc3RhdGUpOworCisgICAgcHVibGljIHZvaWQgbm90aWZ5RGF0YUNvbm5lY3Rpb25GYWlsZWQoUGhvbmUgc2VuZGVyLCBTdHJpbmcgcmVhc29uLCBTdHJpbmcgYXBuVHlwZSk7CiAKICAgICBwdWJsaWMgdm9pZCBub3RpZnlEYXRhQWN0aXZpdHkoUGhvbmUgc2VuZGVyKTsKIApkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Bob25lUHJveHkuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9QaG9uZVByb3h5LmphdmEKaW5kZXggZTE1MTFlNi4uZDg0ODU5YyAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Bob25lUHJveHkuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvUGhvbmVQcm94eS5qYXZhCkBAIC0yMSw2ICsyMSw3IEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuU2hhcmVkUHJlZmVyZW5jZXM7CitpbXBvcnQgYW5kcm9pZC5uZXQuTmV0d29ya1Byb3BlcnRpZXM7CiBpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwogaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKIGltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbVByb3BlcnRpZXM7CkBAIC0xNzIsNyArMTczLDExIEBACiAgICAgfQogCiAgICAgcHVibGljIERhdGFTdGF0ZSBnZXREYXRhQ29ubmVjdGlvblN0YXRlKCkgewotICAgICAgICByZXR1cm4gbUFjdGl2ZVBob25lLmdldERhdGFDb25uZWN0aW9uU3RhdGUoKTsKKyAgICAgICAgcmV0dXJuIG1BY3RpdmVQaG9uZS5nZXREYXRhQ29ubmVjdGlvblN0YXRlKFBob25lLkFQTl9UWVBFX0RFRkFVTFQpOworICAgIH0KKworICAgIHB1YmxpYyBEYXRhU3RhdGUgZ2V0RGF0YUNvbm5lY3Rpb25TdGF0ZShTdHJpbmcgYXBuVHlwZSkgeworICAgICAgICByZXR1cm4gbUFjdGl2ZVBob25lLmdldERhdGFDb25uZWN0aW9uU3RhdGUoYXBuVHlwZSk7CiAgICAgfQogCiAgICAgcHVibGljIERhdGFBY3Rpdml0eVN0YXRlIGdldERhdGFBY3Rpdml0eVN0YXRlKCkgewpAQCAtMjA3LDYgKzIxMiwxMCBAQAogICAgICAgICByZXR1cm4gbUFjdGl2ZVBob25lLmdldEFjdGl2ZUFwblR5cGVzKCk7CiAgICAgfQogCisgICAgcHVibGljIE5ldHdvcmtQcm9wZXJ0aWVzIGdldE5ldHdvcmtQcm9wZXJ0aWVzKFN0cmluZyBhcG5UeXBlKSB7CisgICAgICAgIHJldHVybiBtQWN0aXZlUGhvbmUuZ2V0TmV0d29ya1Byb3BlcnRpZXMoYXBuVHlwZSk7CisgICAgfQorCiAgICAgcHVibGljIFN0cmluZyBnZXRBY3RpdmVBcG4oKSB7CiAgICAgICAgIHJldHVybiBtQWN0aXZlUGhvbmUuZ2V0QWN0aXZlQXBuKCk7CiAgICAgfQpAQCAtNzY0LDYgKzc3MywxMCBAQAogICAgICAgICBtQWN0aXZlUGhvbmUuZXhpdEVtZXJnZW5jeUNhbGxiYWNrTW9kZSgpOwogICAgIH0KIAorICAgIHB1YmxpYyBib29sZWFuIG5lZWRzT3RhU2VydmljZVByb3Zpc2lvbmluZygpeworICAgICAgICByZXR1cm4gbUFjdGl2ZVBob25lLm5lZWRzT3RhU2VydmljZVByb3Zpc2lvbmluZygpOworICAgIH0KKwogICAgIHB1YmxpYyBib29sZWFuIGlzT3RhU3BOdW1iZXIoU3RyaW5nIGRpYWxTdHIpewogICAgICAgICByZXR1cm4gbUFjdGl2ZVBob25lLmlzT3RhU3BOdW1iZXIoZGlhbFN0cik7CiAgICAgfQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1JJTC5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1JJTC5qYXZhCmluZGV4IDU2OWFjNWMuLjFhMGRkODkgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9SSUwuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvUklMLmphdmEKQEAgLTI4NSw5ICsyODUsOCBAQAogICAgICAgICB9CiAKIAotICAgICAgICAvLyoqKioqIEhhbmRsZXIgaW1wbGVtZW1lbnRhdGlvbgotCi0gICAgICAgIHB1YmxpYyB2b2lkCisgICAgICAgIC8vKioqKiogSGFuZGxlciBpbXBsZW1lbnRhdGlvbgorICAgICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQKICAgICAgICAgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG1zZykgewogICAgICAgICAgICAgUklMUmVxdWVzdCByciA9IChSSUxSZXF1ZXN0KShtc2cub2JqKTsKICAgICAgICAgICAgIFJJTFJlcXVlc3QgcmVxID0gbnVsbDsKQEAgLTc4MCw3ICs3NzksNyBAQAogICAgICAgICBzZW5kKHJyKTsKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZAorICAgIEBEZXByZWNhdGVkIHB1YmxpYyB2b2lkCiAgICAgZ2V0UERQQ29udGV4dExpc3QoTWVzc2FnZSByZXN1bHQpIHsKICAgICAgICAgZ2V0RGF0YUNhbGxMaXN0KHJlc3VsdCk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1NNU0Rpc3BhdGNoZXIuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9TTVNEaXNwYXRjaGVyLmphdmEKaW5kZXggNjA2YjUyZC4uZjFhNzEwNyAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1NNU0Rpc3BhdGNoZXIuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvU01TRGlzcGF0Y2hlci5qYXZhCkBAIC0yNTUsNiArMjU1LDcgQEAKICAgICAgICAgbUNtLnVucmVnaXN0ZXJGb3JPbih0aGlzKTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpIHsKICAgICAgICAgTG9nLmQoVEFHLCAiU01TRGlzcGF0Y2hlciBmaW5hbGl6ZWQiKTsKICAgICB9CkBAIC02NzksNyArNjgwLDcgQEAKICAgICAgKiAgdGhlIGV4dHJhICJlcnJvckNvZGUiIGNvbnRhaW5pbmcgYSByYWRpbyB0ZWNobm9sb2d5IHNwZWNpZmljIHZhbHVlLAogICAgICAqICBnZW5lcmFsbHkgb25seSB1c2VmdWwgZm9yIHRyb3VibGVzaG9vdGluZy48YnI+CiAgICAgICogIFRoZSBwZXItYXBwbGljYXRpb24gYmFzZWQgU01TIGNvbnRyb2wgY2hlY2tzIHNlbnRJbnRlbnQuIElmIHNlbnRJbnRlbnQKLSAgICAgKiAgaXMgTlVMTCB0aGUgY2FsbGVyIHdpbGwgYmUgY2hlY2tlZCBhZ2FpbnN0IGFsbCB1bmtub3duIGFwcGxpY2FpdG9ucywKKyAgICAgKiAgaXMgTlVMTCB0aGUgY2FsbGVyIHdpbGwgYmUgY2hlY2tlZCBhZ2FpbnN0IGFsbCB1bmtub3duIGFwcGxpY2F0aW9ucywKICAgICAgKiAgd2hpY2ggY2F1c2Ugc21hbGxlciBudW1iZXIgb2YgU01TIHRvIGJlIHNlbnQgaW4gY2hlY2tpbmcgcGVyaW9kLgogICAgICAqIEBwYXJhbSBkZWxpdmVyeUludGVudCBpZiBub3QgTlVMTCB0aGlzIDxjb2RlPlBlbmRpbmdJbnRlbnQ8L2NvZGU+IGlzCiAgICAgICogIGJyb2FkY2FzdCB3aGVuIHRoZSBtZXNzYWdlIGlzIGRlbGl2ZXJlZCB0byB0aGUgcmVjaXBpZW50LiAgVGhlCkBAIC03MzIsNyArNzMzLDcgQEAKICAgICAgKiAgIDxjb2RlPlJFU1VMVF9FUlJPUl9SQURJT19PRkY8L2NvZGU+CiAgICAgICogICA8Y29kZT5SRVNVTFRfRVJST1JfTlVMTF9QRFU8L2NvZGU+LgogICAgICAqICBUaGUgcGVyLWFwcGxpY2F0aW9uIGJhc2VkIFNNUyBjb250cm9sIGNoZWNrcyBzZW50SW50ZW50LiBJZiBzZW50SW50ZW50Ci0gICAgICogIGlzIE5VTEwgdGhlIGNhbGxlciB3aWxsIGJlIGNoZWNrZWQgYWdhaW5zdCBhbGwgdW5rbm93biBhcHBsaWNhaXRvbnMsCisgICAgICogIGlzIE5VTEwgdGhlIGNhbGxlciB3aWxsIGJlIGNoZWNrZWQgYWdhaW5zdCBhbGwgdW5rbm93biBhcHBsaWNhdGlvbnMsCiAgICAgICogIHdoaWNoIGNhdXNlIHNtYWxsZXIgbnVtYmVyIG9mIFNNUyB0byBiZSBzZW50IGluIGNoZWNraW5nIHBlcmlvZC4KICAgICAgKiBAcGFyYW0gZGVsaXZlcnlJbnRlbnRzIGlmIG5vdCBudWxsLCBhbiA8Y29kZT5BcnJheUxpc3Q8L2NvZGU+IG9mCiAgICAgICogICA8Y29kZT5QZW5kaW5nSW50ZW50PC9jb2RlPnMgKG9uZSBmb3IgZWFjaCBtZXNzYWdlIHBhcnQpIHRoYXQgaXMKQEAgLTc0OCw3ICs3NDksNyBAQAogICAgICAqIFNlbmQgYSBTTVMKICAgICAgKgogICAgICAqIEBwYXJhbSBzbXNjIHRoZSBTTVNDIHRvIHNlbmQgdGhlIG1lc3NhZ2UgdGhyb3VnaCwgb3IgTlVMTCBmb3IgdGhlCi0gICAgICogIGRlZmF0dWx0IFNNU0MKKyAgICAgKiAgZGVmYXVsdCBTTVNDCiAgICAgICogQHBhcmFtIHBkdSB0aGUgcmF3IFBEVSB0byBzZW5kCiAgICAgICogQHBhcmFtIHNlbnRJbnRlbnQgaWYgbm90IE5VTEwgdGhpcyA8Y29kZT5JbnRlbnQ8L2NvZGU+IGlzCiAgICAgICogIGJyb2FkY2FzdCB3aGVuIHRoZSBtZXNzYWdlIGlzIHN1Y2Nlc3NmdWxseSBzZW50LCBvciBmYWlsZWQuCkBAIC03NTgsNyArNzU5LDcgQEAKICAgICAgKiAgPGNvZGU+UkVTVUxUX0VSUk9SX1JBRElPX09GRjwvY29kZT4KICAgICAgKiAgPGNvZGU+UkVTVUxUX0VSUk9SX05VTExfUERVPC9jb2RlPi4KICAgICAgKiAgVGhlIHBlci1hcHBsaWNhdGlvbiBiYXNlZCBTTVMgY29udHJvbCBjaGVja3Mgc2VudEludGVudC4gSWYgc2VudEludGVudAotICAgICAqICBpcyBOVUxMIHRoZSBjYWxsZXIgd2lsbCBiZSBjaGVja2VkIGFnYWluc3QgYWxsIHVua25vd24gYXBwbGljYWl0b25zLAorICAgICAqICBpcyBOVUxMIHRoZSBjYWxsZXIgd2lsbCBiZSBjaGVja2VkIGFnYWluc3QgYWxsIHVua25vd24gYXBwbGljYXRpb25zLAogICAgICAqICB3aGljaCBjYXVzZSBzbWFsbGVyIG51bWJlciBvZiBTTVMgdG8gYmUgc2VudCBpbiBjaGVja2luZyBwZXJpb2QuCiAgICAgICogQHBhcmFtIGRlbGl2ZXJ5SW50ZW50IGlmIG5vdCBOVUxMIHRoaXMgPGNvZGU+SW50ZW50PC9jb2RlPiBpcwogICAgICAqICBicm9hZGNhc3Qgd2hlbiB0aGUgbWVzc2FnZSBpcyBkZWxpdmVyZWQgdG8gdGhlIHJlY2lwaWVudC4gIFRoZQpAQCAtOTI3LDE0ICs5MjgsMTQgQEAKICAgICAgKi8KICAgICBzdGF0aWMgcHJvdGVjdGVkIGNsYXNzIFNtc1RyYWNrZXIgewogICAgICAgICAvLyBmaWVsZHMgbmVlZCB0byBiZSBwdWJsaWMgZm9yIGRlcml2ZWQgU21zRGlzcGF0Y2hlcnMKLSAgICAgICAgcHVibGljIEhhc2hNYXAgbURhdGE7CisgICAgICAgIHB1YmxpYyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PiBtRGF0YTsKICAgICAgICAgcHVibGljIGludCBtUmV0cnlDb3VudDsKICAgICAgICAgcHVibGljIGludCBtTWVzc2FnZVJlZjsKIAogICAgICAgICBwdWJsaWMgUGVuZGluZ0ludGVudCBtU2VudEludGVudDsKICAgICAgICAgcHVibGljIFBlbmRpbmdJbnRlbnQgbURlbGl2ZXJ5SW50ZW50OwogCi0gICAgICAgIFNtc1RyYWNrZXIoSGFzaE1hcCBkYXRhLCBQZW5kaW5nSW50ZW50IHNlbnRJbnRlbnQsCisgICAgICAgIFNtc1RyYWNrZXIoSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4gZGF0YSwgUGVuZGluZ0ludGVudCBzZW50SW50ZW50LAogICAgICAgICAgICAgICAgIFBlbmRpbmdJbnRlbnQgZGVsaXZlcnlJbnRlbnQpIHsKICAgICAgICAgICAgIG1EYXRhID0gZGF0YTsKICAgICAgICAgICAgIG1TZW50SW50ZW50ID0gc2VudEludGVudDsKQEAgLTk0Myw3ICs5NDQsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJvdGVjdGVkIFNtc1RyYWNrZXIgU21zVHJhY2tlckZhY3RvcnkoSGFzaE1hcCBkYXRhLCBQZW5kaW5nSW50ZW50IHNlbnRJbnRlbnQsCisgICAgcHJvdGVjdGVkIFNtc1RyYWNrZXIgU21zVHJhY2tlckZhY3RvcnkoSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4gZGF0YSwgUGVuZGluZ0ludGVudCBzZW50SW50ZW50LAogICAgICAgICAgICAgUGVuZGluZ0ludGVudCBkZWxpdmVyeUludGVudCkgewogICAgICAgICByZXR1cm4gbmV3IFNtc1RyYWNrZXIoZGF0YSwgc2VudEludGVudCwgZGVsaXZlcnlJbnRlbnQpOwogICAgIH0KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9TaXBQaG9uZU5vdGlmaWVyLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvU2lwUGhvbmVOb3RpZmllci5qYXZhCmluZGV4IDQwOTJjNjkuLjEyMjlkMTQgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9TaXBQaG9uZU5vdGlmaWVyLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1NpcFBob25lTm90aWZpZXIuamF2YQpAQCAtMTYsNiArMTYsNyBAQAogCiBwYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueTsKIAoraW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtQcm9wZXJ0aWVzOwogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwogaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQub3MuU2VydmljZU1hbmFnZXI7CkBAIC05NCwyNiArOTUsNDIgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIG5vdGlmeURhdGFDb25uZWN0aW9uKFBob25lIHNlbmRlciwgU3RyaW5nIHJlYXNvbikgeworICAgIHB1YmxpYyB2b2lkIG5vdGlmeURhdGFDb25uZWN0aW9uKFBob25lIHNlbmRlciwgU3RyaW5nIHJlYXNvbiwgU3RyaW5nIGFwblR5cGUpIHsKKyAgICAgICAgZG9Ob3RpZnlEYXRhQ29ubmVjdGlvbihzZW5kZXIsIHJlYXNvbiwgYXBuVHlwZSwgc2VuZGVyLmdldERhdGFDb25uZWN0aW9uU3RhdGUoYXBuVHlwZSkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG5vdGlmeURhdGFDb25uZWN0aW9uKFBob25lIHNlbmRlciwgU3RyaW5nIHJlYXNvbiwgU3RyaW5nIGFwblR5cGUsCisgICAgICAgICAgICBQaG9uZS5EYXRhU3RhdGUgc3RhdGUpIHsKKyAgICAgICAgZG9Ob3RpZnlEYXRhQ29ubmVjdGlvbihzZW5kZXIsIHJlYXNvbiwgYXBuVHlwZSwgc3RhdGUpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkb05vdGlmeURhdGFDb25uZWN0aW9uKFBob25lIHNlbmRlciwgU3RyaW5nIHJlYXNvbiwgU3RyaW5nIGFwblR5cGUsCisgICAgICAgICAgICBQaG9uZS5EYXRhU3RhdGUgc3RhdGUpIHsKKyAgICAgICAgLy8gVE9ETworICAgICAgICAvLyB1c2UgYXBuVHlwZSBhcyB0aGUga2V5IHRvIHdoaWNoIGNvbm5lY3Rpb24gd2UncmUgdGFsa2luZyBhYm91dC4KKyAgICAgICAgLy8gcGFzcyBhcG5UeXBlIGJhY2sgdXAgdG8gZmV0Y2ggcGFydGljdWxhciBmb3IgdGhpcyBvbmUuCiAgICAgICAgIFRlbGVwaG9ueU1hbmFnZXIgdGVsZXBob255ID0gVGVsZXBob255TWFuYWdlci5nZXREZWZhdWx0KCk7CisgICAgICAgIE5ldHdvcmtQcm9wZXJ0aWVzIG5ldHdvcmtQcm9wZXJ0aWVzID0gbnVsbDsKKyAgICAgICAgaWYgKHN0YXRlID09IFBob25lLkRhdGFTdGF0ZS5DT05ORUNURUQpIHsKKyAgICAgICAgICAgIG5ldHdvcmtQcm9wZXJ0aWVzID0gc2VuZGVyLmdldE5ldHdvcmtQcm9wZXJ0aWVzKGFwblR5cGUpOworICAgICAgICB9CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBtUmVnaXN0cnkubm90aWZ5RGF0YUNvbm5lY3Rpb24oCi0gICAgICAgICAgICAgICAgICAgIGNvbnZlcnREYXRhU3RhdGUoc2VuZGVyLmdldERhdGFDb25uZWN0aW9uU3RhdGUoKSksCisgICAgICAgICAgICAgICAgICAgIGNvbnZlcnREYXRhU3RhdGUoc3RhdGUpLAogICAgICAgICAgICAgICAgICAgICBzZW5kZXIuaXNEYXRhQ29ubmVjdGl2aXR5UG9zc2libGUoKSwgcmVhc29uLAogICAgICAgICAgICAgICAgICAgICBzZW5kZXIuZ2V0QWN0aXZlQXBuKCksCi0gICAgICAgICAgICAgICAgICAgIHNlbmRlci5nZXRBY3RpdmVBcG5UeXBlcygpLAotICAgICAgICAgICAgICAgICAgICBzZW5kZXIuZ2V0SW50ZXJmYWNlTmFtZShudWxsKSwKKyAgICAgICAgICAgICAgICAgICAgYXBuVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgbmV0d29ya1Byb3BlcnRpZXMsCiAgICAgICAgICAgICAgICAgICAgICgodGVsZXBob255IT1udWxsKSA/IHRlbGVwaG9ueS5nZXROZXR3b3JrVHlwZSgpIDoKLSAgICAgICAgICAgICAgICAgICAgVGVsZXBob255TWFuYWdlci5ORVRXT1JLX1RZUEVfVU5LTk9XTiksCi0gICAgICAgICAgICAgICAgICAgIHNlbmRlci5nZXRHYXRld2F5KG51bGwpKTsKKyAgICAgICAgICAgICAgICAgICAgVGVsZXBob255TWFuYWdlci5ORVRXT1JLX1RZUEVfVU5LTk9XTikpOwogICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKICAgICAgICAgICAgIC8vIHN5c3RlbSBwcm9jZXNzIGlzIGRlYWQKICAgICAgICAgfQogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIG5vdGlmeURhdGFDb25uZWN0aW9uRmFpbGVkKFBob25lIHNlbmRlciwgU3RyaW5nIHJlYXNvbikgeworICAgIHB1YmxpYyB2b2lkIG5vdGlmeURhdGFDb25uZWN0aW9uRmFpbGVkKFBob25lIHNlbmRlciwgU3RyaW5nIHJlYXNvbiwgU3RyaW5nIGFwblR5cGUpIHsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG1SZWdpc3RyeS5ub3RpZnlEYXRhQ29ubmVjdGlvbkZhaWxlZChyZWFzb24pOworICAgICAgICAgICAgbVJlZ2lzdHJ5Lm5vdGlmeURhdGFDb25uZWN0aW9uRmFpbGVkKHJlYXNvbiwgYXBuVHlwZSk7CiAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgewogICAgICAgICAgICAgLy8gc3lzdGVtIHByb2Nlc3MgaXMgZGVhZAogICAgICAgICB9CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvU21zSGVhZGVyLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvU21zSGVhZGVyLmphdmEKaW5kZXggNzg3MmVlYy4uN2E2NTE2MiAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Ntc0hlYWRlci5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9TbXNIZWFkZXIuamF2YQpAQCAtMzAsNyArMzAsNyBAQAogICovCiBwdWJsaWMgY2xhc3MgU21zSGVhZGVyIHsKIAotICAgIC8vIFRPRE8oY2xlYW51cCk6IHRoaXMgZGF0YXN0cnVjdHVyZSBpcyBnZW5lcmFsbHkgcmVmZXJyZWQgdG8gYXMKKyAgICAvLyBUT0RPKGNsZWFudXApOiB0aGlzIGRhdGEgc3RydWN0dXJlIGlzIGdlbmVyYWxseSByZWZlcnJlZCB0byBhcwogICAgIC8vIHRoZSAndXNlciBkYXRhIGhlYWRlcicgb3IgVURILCBhbmQgc28gdGhlIGNsYXNzIG5hbWUgc2hvdWxkCiAgICAgLy8gY2hhbmdlIHRvIHJlZmxlY3QgdGhpcy4uLgogCmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvU21zTWVzc2FnZUJhc2UuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9TbXNNZXNzYWdlQmFzZS5qYXZhCmluZGV4IGFmNmM1ZjguLmNiZDg2MDYgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9TbXNNZXNzYWdlQmFzZS5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9TbXNNZXNzYWdlQmFzZS5qYXZhCkBAIC0xNiw3ICsxNiw2IEBACiAKIHBhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255OwogCi1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuU21zSGVhZGVyOwogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiAKQEAgLTM2NiwxMyArMzY1LDEzIEBACiAgICAgLyoqCiAgICAgICogVHJ5IHRvIHBhcnNlIHRoaXMgbWVzc2FnZSBhcyBhbiBlbWFpbCBnYXRld2F5IG1lc3NhZ2UKICAgICAgKiBUaGVyZSBhcmUgdHdvIHdheXMgc3BlY2lmaWVkIGluIFRTIDIzLjA0MCBTZWN0aW9uIDMuOCA6Ci0gICAgICogIC0gU01TIG1lc3NhZ2UgIm1heSBoYXZlIGl0cyBUUC1QSUQgc2V0IGZvciBpbnRlcm5ldCBlbGVjdHJvbmljIG1haWwgLSBNVAorICAgICAqICAtIFNNUyBtZXNzYWdlICJtYXkgaGF2ZSBpdHMgVFAtUElEIHNldCBmb3IgSW50ZXJuZXQgZWxlY3Ryb25pYyBtYWlsIC0gTVQKICAgICAgKiBTTVMgZm9ybWF0OiBbPGZyb20tYWRkcmVzcz48c3BhY2U+XTxtZXNzYWdlPiAtICJEZXBlbmRpbmcgb24gdGhlCiAgICAgICogbmF0dXJlIG9mIHRoZSBnYXRld2F5LCB0aGUgZGVzdGluYXRpb24vb3JpZ2luYXRpb24gYWRkcmVzcyBpcyBlaXRoZXIKICAgICAgKiBkZXJpdmVkIGZyb20gdGhlIGNvbnRlbnQgb2YgdGhlIFNNUyBUUC1PQSBvciBUUC1EQSBmaWVsZCwgb3IgdGhlCiAgICAgICogVFAtT0EvVFAtREEgZmllbGQgY29udGFpbnMgYSBnZW5lcmljIGdhdGV3YXkgYWRkcmVzcyBhbmQgdGhlIHRvL2Zyb20KICAgICAgKiBhZGRyZXNzIGlzIGFkZGVkIGF0IHRoZSBiZWdpbm5pbmcgYXMgc2hvd24gYWJvdmUuIiAod2hpY2ggaXMgc3VwcG9ydGVkIGhlcmUpCi0gICAgICogLSBNdWx0aXBsZSBhZGRyZXNlcyBzZXBhcmF0ZWQgYnkgY29tbWFzLCBubyBzcGFjZXMsIFN1YmplY3QgZmllbGQgZGVsaW1pdGVkCisgICAgICogLSBNdWx0aXBsZSBhZGRyZXNzZXMgc2VwYXJhdGVkIGJ5IGNvbW1hcywgbm8gc3BhY2VzLCBTdWJqZWN0IGZpZWxkIGRlbGltaXRlZAogICAgICAqIGJ5ICcoKScgb3IgJyMjJyBhbmQgJyMnIFNlY3Rpb24gOS4yLjMuMjQuMTEgKHdoaWNoIGFyZSBOT1Qgc3VwcG9ydGVkIGhlcmUpCiAgICAgICovCiAgICAgcHJvdGVjdGVkIHZvaWQgZXh0cmFjdEVtYWlsQWRkcmVzc0Zyb21NZXNzYWdlQm9keSgpIHsKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9UZWxlcGhvbnlQcm9wZXJ0aWVzLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvVGVsZXBob255UHJvcGVydGllcy5qYXZhCmluZGV4IGExMTM3ODcuLjEzNmQ1YjEgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9UZWxlcGhvbnlQcm9wZXJ0aWVzLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1RlbGVwaG9ueVByb3BlcnRpZXMuamF2YQpAQCAtNDUsNyArNDUsNyBAQAogICAgICAqICBDRE1BIG5ldHdvcmtzLgogICAgICAqLwogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfT1BFUkFUT1JfQUxQSEEgPSAiZ3NtLm9wZXJhdG9yLmFscGhhIjsKLSAgICAvL1RPRE86IG1vc3Qgb2YgdGhlc2UgcHJvcHJpZXRpZXMgYXJlIGdlbmVyaWMsIHN1YnN0aXR1dGUgZ3NtLiB3aXRoIHBob25lLiBidWcgMTg1Njk1OQorICAgIC8vVE9ETzogbW9zdCBvZiB0aGVzZSBwcm9wZXJ0aWVzIGFyZSBnZW5lcmljLCBzdWJzdGl0dXRlIGdzbS4gd2l0aCBwaG9uZS4gYnVnIDE4NTY5NTkKIAogICAgIC8qKiBOdW1lcmljIG5hbWUgKE1DQytNTkMpIG9mIGN1cnJlbnQgcmVnaXN0ZXJlZCBvcGVyYXRvci48cD4KICAgICAgKiAgQXZhaWxhYmlsaXR5OiB3aGVuIHJlZ2lzdGVyZWQgdG8gYSBuZXR3b3JrLiBSZXN1bHQgbWF5IGJlIHVucmVsaWFibGUgb24KQEAgLTgzLDEyICs4MywxMiBAQAogCiAgICAgLyoqIFRoZSBNQ0MrTU5DIChtb2JpbGUgY291bnRyeSBjb2RlK21vYmlsZSBuZXR3b3JrIGNvZGUpIG9mIHRoZQogICAgICAqICBwcm92aWRlciBvZiB0aGUgU0lNLiA1IG9yIDYgZGVjaW1hbCBkaWdpdHMuCi0gICAgICogIEF2YWlsYWJsaXR5OiBTSU0gc3RhdGUgbXVzdCBiZSAiUkVBRFkiCisgICAgICogIEF2YWlsYWJpbGl0eTogU0lNIHN0YXRlIG11c3QgYmUgIlJFQURZIgogICAgICAqLwogICAgIHN0YXRpYyBTdHJpbmcgUFJPUEVSVFlfSUNDX09QRVJBVE9SX05VTUVSSUMgPSAiZ3NtLnNpbS5vcGVyYXRvci5udW1lcmljIjsKIAogICAgIC8qKiBQUk9QRVJUWV9JQ0NfT1BFUkFUT1JfQUxQSEEgaXMgYWxzbyBrbm93biBhcyB0aGUgU1BOLCBvciBTZXJ2aWNlIFByb3ZpZGVyIE5hbWUuCi0gICAgICogIEF2YWlsYWJsaXR5OiBTSU0gc3RhdGUgbXVzdCBiZSAiUkVBRFkiCisgICAgICogIEF2YWlsYWJpbGl0eTogU0lNIHN0YXRlIG11c3QgYmUgIlJFQURZIgogICAgICAqLwogICAgIHN0YXRpYyBTdHJpbmcgUFJPUEVSVFlfSUNDX09QRVJBVE9SX0FMUEhBID0gImdzbS5zaW0ub3BlcmF0b3IuYWxwaGEiOwogCkBAIC0xMjcsNyArMTI3LDcgQEAKICAgICAgICAgInJvLnRlbGVwaG9ueS5jYWxsX3JpbmcubXVsdGlwbGUiOwogCiAgICAgLyoqCi0gICAgICogVGhlIG51bWJlciBvZiBtaWxsaS1zZWNvbmRzIGJldHdlZW4gQ0FMTF9SSU5HIG5vdGlmaWNhdGlvbnMuCisgICAgICogVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgYmV0d2VlbiBDQUxMX1JJTkcgbm90aWZpY2F0aW9ucy4KICAgICAgKi8KICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0NBTExfUklOR19ERUxBWSA9ICJyby50ZWxlcGhvbnkuY2FsbF9yaW5nLmRlbGF5IjsKIApkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvQ0RNQVBob25lLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9DRE1BUGhvbmUuamF2YQppbmRleCA2YWI4OWNkLi5iMzk1NTZhIDEwMDc1NQotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9DRE1BUGhvbmUuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9DRE1BUGhvbmUuamF2YQpAQCAtNTE0LDE0ICs1MTQsNiBAQAogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgcHVibGljIGJvb2xlYW4gaXNEYXRhQ29ubmVjdGl2aXR5UG9zc2libGUoKSB7Ci0gICAgICAgIGJvb2xlYW4gbm9EYXRhID0gbURhdGFDb25uZWN0aW9uLmdldERhdGFFbmFibGVkKCkgJiYKLSAgICAgICAgICAgICAgICBnZXREYXRhQ29ubmVjdGlvblN0YXRlKCkgPT0gRGF0YVN0YXRlLkRJU0NPTk5FQ1RFRDsKLSAgICAgICAgcmV0dXJuICFub0RhdGEgJiYgZ2V0SWNjQ2FyZCgpLmdldFN0YXRlKCkgPT0gSWNjQ2FyZC5TdGF0ZS5SRUFEWSAmJgotICAgICAgICAgICAgICAgIGdldFNlcnZpY2VTdGF0ZSgpLmdldFN0YXRlKCkgPT0gU2VydmljZVN0YXRlLlNUQVRFX0lOX1NFUlZJQ0UgJiYKLSAgICAgICAgICAgICAgICAobURhdGFDb25uZWN0aW9uLmdldERhdGFPblJvYW1pbmdFbmFibGVkKCkgfHwgIWdldFNlcnZpY2VTdGF0ZSgpLmdldFJvYW1pbmcoKSk7Ci0gICAgfQotCiAgICAgLyoqCiAgICAgICogUmVtb3ZlcyB0aGUgZ2l2ZW4gTU1JIGZyb20gdGhlIHBlbmRpbmcgbGlzdCBhbmQgbm90aWZpZXMgcmVnaXN0cmFudHMgdGhhdAogICAgICAqIGl0IGlzIGNvbXBsZXRlLgpAQCAtNjEyLDcgKzYwNCw3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwdWJsaWMgRGF0YVN0YXRlIGdldERhdGFDb25uZWN0aW9uU3RhdGUoKSB7CisgICAgcHVibGljIERhdGFTdGF0ZSBnZXREYXRhQ29ubmVjdGlvblN0YXRlKFN0cmluZyBhcG5UeXBlKSB7CiAgICAgICAgIERhdGFTdGF0ZSByZXQgPSBEYXRhU3RhdGUuRElTQ09OTkVDVEVEOwogCiAgICAgICAgIGlmIChtU1NUID09IG51bGwpIHsKQEAgLTYyNCw2ICs2MTYsOCBAQAogICAgICAgICAgICAgLy8gSWYgd2UncmUgb3V0IG9mIHNlcnZpY2UsIG9wZW4gVENQIHNvY2tldHMgbWF5IHN0aWxsIHdvcmsKICAgICAgICAgICAgIC8vIGJ1dCBubyBkYXRhIHdpbGwgZmxvdwogICAgICAgICAgICAgcmV0ID0gRGF0YVN0YXRlLkRJU0NPTk5FQ1RFRDsKKyAgICAgICAgfSBlbHNlIGlmIChtRGF0YUNvbm5lY3Rpb24uaXNBcG5UeXBlRW5hYmxlZChhcG5UeXBlKSA9PSBmYWxzZSkgeworICAgICAgICAgICAgcmV0ID0gRGF0YVN0YXRlLkRJU0NPTk5FQ1RFRDsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHN3aXRjaCAobURhdGFDb25uZWN0aW9uLmdldFN0YXRlKCkpIHsKICAgICAgICAgICAgICAgICBjYXNlIEZBSUxFRDoKQEAgLTg3NywyNiArODcxLDYgQEAKICAgICAgICAgbVJ1aW1SZWNvcmRzLnNldFZvaWNlTWVzc2FnZVdhaXRpbmcoMSwgbXdpKTsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgQ0RNQSBPVEEgU2VydmljZSBQcm92aXNpb25pbmcgbmVlZHMgdG8gYmUgcGVyZm9ybWVkLgotICAgICAqLwotICAgIC8qIHBhY2thZ2UgKi8gYm9vbGVhbgotICAgIG5lZWRzT3RhU2VydmljZVByb3Zpc2lvbmluZygpIHsKLSAgICAgICAgU3RyaW5nIGNkbWFNaW4gPSBnZXRDZG1hTWluKCk7Ci0gICAgICAgIGJvb2xlYW4gbmVlZHNQcm92aXNpb25pbmc7Ci0gICAgICAgIGlmIChjZG1hTWluID09IG51bGwgfHwgKGNkbWFNaW4ubGVuZ3RoKCkgPCA2KSkgewotICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoTE9HX1RBRywgIm5lZWRzT3RhU2VydmljZVByb3Zpc2lvbmluZzogaWxsZWdhbCBjZG1hTWluPSciCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGNkbWFNaW4gKyAiJyBhc3N1bWUgcHJvdmlzaW9uaW5nIG5lZWRlZC4iKTsKLSAgICAgICAgICAgIG5lZWRzUHJvdmlzaW9uaW5nID0gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG5lZWRzUHJvdmlzaW9uaW5nID0gKGNkbWFNaW4uZXF1YWxzKFVOQUNUSVZBVEVEX01JTl9WQUxVRSkKLSAgICAgICAgICAgICAgICAgICAgfHwgY2RtYU1pbi5zdWJzdHJpbmcoMCw2KS5lcXVhbHMoVU5BQ1RJVkFURURfTUlOMl9WQUxVRSkpCi0gICAgICAgICAgICAgICAgICAgIHx8IFN5c3RlbVByb3BlcnRpZXMuZ2V0Qm9vbGVhbigidGVzdF9jZG1hX3NldHVwIiwgZmFsc2UpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChEQkcpIExvZy5kKExPR19UQUcsICJuZWVkc090YVNlcnZpY2VQcm92aXNpb25pbmc6IHJldD0iICsgbmVlZHNQcm92aXNpb25pbmcpOwotICAgICAgICByZXR1cm4gbmVlZHNQcm92aXNpb25pbmc7Ci0gICAgfQotCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgZXhpdEVtZXJnZW5jeUNhbGxiYWNrTW9kZSgpIHsKICAgICAgICAgaWYgKG1XYWtlTG9jay5pc0hlbGQoKSkgewpAQCAtMTE5MCw2ICsxMTY0LDI2IEBACiAgICAgICAgIG1TTVMuc2V0Q2VsbEJyb2FkY2FzdENvbmZpZyhjb25maWdWYWx1ZXNBcnJheSwgcmVzcG9uc2UpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiBPVEEgU2VydmljZSBQcm92aXNpb25pbmcgbmVlZHMgdG8gYmUgcGVyZm9ybWVkLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIG5lZWRzT3RhU2VydmljZVByb3Zpc2lvbmluZygpIHsKKyAgICAgICAgU3RyaW5nIGNkbWFNaW4gPSBnZXRDZG1hTWluKCk7CisgICAgICAgIGJvb2xlYW4gbmVlZHNQcm92aXNpb25pbmc7CisgICAgICAgIGlmIChjZG1hTWluID09IG51bGwgfHwgKGNkbWFNaW4ubGVuZ3RoKCkgPCA2KSkgeworICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoTE9HX1RBRywgIm5lZWRzT3RhU2VydmljZVByb3Zpc2lvbmluZzogaWxsZWdhbCBjZG1hTWluPSciCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGNkbWFNaW4gKyAiJyBhc3N1bWUgcHJvdmlzaW9uaW5nIG5lZWRlZC4iKTsKKyAgICAgICAgICAgIG5lZWRzUHJvdmlzaW9uaW5nID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG5lZWRzUHJvdmlzaW9uaW5nID0gKGNkbWFNaW4uZXF1YWxzKFVOQUNUSVZBVEVEX01JTl9WQUxVRSkKKyAgICAgICAgICAgICAgICAgICAgfHwgY2RtYU1pbi5zdWJzdHJpbmcoMCw2KS5lcXVhbHMoVU5BQ1RJVkFURURfTUlOMl9WQUxVRSkpCisgICAgICAgICAgICAgICAgICAgIHx8IFN5c3RlbVByb3BlcnRpZXMuZ2V0Qm9vbGVhbigidGVzdF9jZG1hX3NldHVwIiwgZmFsc2UpOworICAgICAgICB9CisgICAgICAgIGlmIChEQkcpIExvZy5kKExPR19UQUcsICJuZWVkc090YVNlcnZpY2VQcm92aXNpb25pbmc6IHJldD0iICsgbmVlZHNQcm92aXNpb25pbmcpOworICAgICAgICByZXR1cm4gbmVlZHNQcm92aXNpb25pbmc7CisgICAgfQorCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElTNjgzQV9GRUFUVVJFX0NPREUgPSAiKjIyOCI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElTNjgzQV9GRUFUVVJFX0NPREVfTlVNX0RJR0lUUyA9IDQ7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElTNjgzQV9TWVNfU0VMX0NPREVfTlVNX0RJR0lUUyA9IDI7CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9DZG1hRGF0YUNvbm5lY3Rpb25UcmFja2VyLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9DZG1hRGF0YUNvbm5lY3Rpb25UcmFja2VyLmphdmEKaW5kZXggOWYyYTQ0Yi4uOGEzYWYzYiAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvQ2RtYURhdGFDb25uZWN0aW9uVHJhY2tlci5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL0NkbWFEYXRhQ29ubmVjdGlvblRyYWNrZXIuamF2YQpAQCAtNTMsNiArNTMsNyBAQAogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5SZXRyeU1hbmFnZXI7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlNlcnZpY2VTdGF0ZVRyYWNrZXI7CiAKK2ltcG9ydCBqYXZhLm5ldC5OZXR3b3JrSW50ZXJmYWNlOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiAKIC8qKgpAQCAtMzA1LDkgKzMwNiw0MCBAQAogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKLSAgICBwcml2YXRlIGJvb2xlYW4gaXNEYXRhQWxsb3dlZCgpIHsKLSAgICAgICAgYm9vbGVhbiByb2FtaW5nID0gcGhvbmUuZ2V0U2VydmljZVN0YXRlKCkuZ2V0Um9hbWluZygpOwotICAgICAgICByZXR1cm4gZ2V0QW55RGF0YUVuYWJsZWQoKSAmJiAoIXJvYW1pbmcgfHwgZ2V0RGF0YU9uUm9hbWluZ0VuYWJsZWQoKSkgJiYgbU1hc3RlckRhdGFFbmFibGVkOworICAgIHByb3RlY3RlZCBib29sZWFuIGlzRGF0YUFsbG93ZWQoKSB7CisgICAgICAgIGludCBwc1N0YXRlID0gbUNkbWFQaG9uZS5tU1NULmdldEN1cnJlbnRDZG1hRGF0YUNvbm5lY3Rpb25TdGF0ZSgpOworICAgICAgICBib29sZWFuIHJvYW1pbmcgPSAocGhvbmUuZ2V0U2VydmljZVN0YXRlKCkuZ2V0Um9hbWluZygpICYmICFnZXREYXRhT25Sb2FtaW5nRW5hYmxlZCgpKTsKKyAgICAgICAgYm9vbGVhbiBkZXNpcmVkUG93ZXJTdGF0ZSA9IG1DZG1hUGhvbmUubVNTVC5nZXREZXNpcmVkUG93ZXJTdGF0ZSgpOworCisgICAgICAgIGJvb2xlYW4gYWxsb3dlZCA9IChwc1N0YXRlID09IFNlcnZpY2VTdGF0ZS5TVEFURV9JTl9TRVJWSUNFICYmCisgICAgICAgICAgICAgICAgKHBob25lLm1DTS5nZXRSYWRpb1N0YXRlKCkgPT0gQ29tbWFuZHNJbnRlcmZhY2UuUmFkaW9TdGF0ZS5OVl9SRUFEWSB8fAorICAgICAgICAgICAgICAgICBtQ2RtYVBob25lLm1SdWltUmVjb3Jkcy5nZXRSZWNvcmRzTG9hZGVkKCkpICYmCisgICAgICAgICAgICAgICAgKG1DZG1hUGhvbmUubVNTVC5pc0NvbmN1cnJlbnRWb2ljZUFuZERhdGEoKSB8fAorICAgICAgICAgICAgICAgICBwaG9uZS5nZXRTdGF0ZSgpID09IFBob25lLlN0YXRlLklETEUpICYmCisgICAgICAgICAgICAgICAgIXJvYW1pbmcgJiYKKyAgICAgICAgICAgICAgICBtTWFzdGVyRGF0YUVuYWJsZWQgJiYKKyAgICAgICAgICAgICAgICBkZXNpcmVkUG93ZXJTdGF0ZSAmJgorICAgICAgICAgICAgICAgICFtUGVuZGluZ1Jlc3RhcnRSYWRpbyAmJgorICAgICAgICAgICAgICAgICFtQ2RtYVBob25lLm5lZWRzT3RhU2VydmljZVByb3Zpc2lvbmluZygpKTsKKyAgICAgICAgaWYgKCFhbGxvd2VkICYmIERCRykgeworICAgICAgICAgICAgU3RyaW5nIHJlYXNvbiA9ICIiOworICAgICAgICAgICAgaWYgKHBzU3RhdGUgIT0gU2VydmljZVN0YXRlLlNUQVRFX0lOX1NFUlZJQ0UpIHJlYXNvbiArPSAiIC0gcHNTdGF0ZT0gIiArIHBzU3RhdGU7CisgICAgICAgICAgICBpZiAocGhvbmUubUNNLmdldFJhZGlvU3RhdGUoKSAhPSBDb21tYW5kc0ludGVyZmFjZS5SYWRpb1N0YXRlLk5WX1JFQURZICYmCisgICAgICAgICAgICAgICAgICAgICFtQ2RtYVBob25lLm1SdWltUmVjb3Jkcy5nZXRSZWNvcmRzTG9hZGVkKCkpIHsKKyAgICAgICAgICAgICAgICByZWFzb24gKz0gIiAtIHJhZGlvU3RhdGU9ICIgKyBwaG9uZS5tQ00uZ2V0UmFkaW9TdGF0ZSgpICsgIiAtIFJVSU0gbm90IGxvYWRlZCI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocGhvbmUuZ2V0U3RhdGUoKSAhPSBQaG9uZS5TdGF0ZS5JRExFICYmCisgICAgICAgICAgICAgICAgICAgIG1DZG1hUGhvbmUubVNTVC5pc0NvbmN1cnJlbnRWb2ljZUFuZERhdGEoKSkgeworICAgICAgICAgICAgICAgIHJlYXNvbiArPSAiIC0gY29uY3VycmVudFZvaWNlQW5kRGF0YSBub3QgYWxsb3dlZCBhbmQgc3RhdGU9ICIgKyBwaG9uZS5nZXRTdGF0ZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHJvYW1pbmcpIHJlYXNvbiArPSAiIC0gUm9hbWluZyI7CisgICAgICAgICAgICBpZiAoIW1NYXN0ZXJEYXRhRW5hYmxlZCkgcmVhc29uICs9ICIgLSBtTWFzdGVyRGF0YUVuYWJsZWQ9IGZhbHNlIjsKKyAgICAgICAgICAgIGlmICghZGVzaXJlZFBvd2VyU3RhdGUpIHJlYXNvbiArPSAiIC0gZGVzaXJlZFBvd2VyU3RhdGU9IGZhbHNlIjsKKyAgICAgICAgICAgIGlmIChtUGVuZGluZ1Jlc3RhcnRSYWRpbykgcmVhc29uICs9ICIgLSBtUGVuZGluZ1Jlc3RhcnRSYWRpbz0gdHJ1ZSI7CisgICAgICAgICAgICBpZiAobUNkbWFQaG9uZS5uZWVkc090YVNlcnZpY2VQcm92aXNpb25pbmcoKSkgcmVhc29uICs9ICIgLSBuZWVkcyBQcm92aXNpb25pbmciOworICAgICAgICAgICAgbG9nKCJEYXRhIG5vdCBhbGxvd2VkIGR1ZSB0byIgKyByZWFzb24pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBhbGxvd2VkOwogICAgIH0KIAogICAgIHByaXZhdGUgYm9vbGVhbiB0cnlTZXR1cERhdGEoU3RyaW5nIHJlYXNvbikgewpAQCAtMzE3LDcgKzM0OSw4IEBACiAgICAgICAgICAgICAvLyBBc3N1bWUgZGF0YSBpcyBjb25uZWN0ZWQgb24gdGhlIHNpbXVsYXRvcgogICAgICAgICAgICAgLy8gRklYTUUgIHRoaXMgY2FuIGJlIGltcHJvdmVkCiAgICAgICAgICAgICBzZXRTdGF0ZShTdGF0ZS5DT05ORUNURUQpOwotICAgICAgICAgICAgcGhvbmUubm90aWZ5RGF0YUNvbm5lY3Rpb24ocmVhc29uKTsKKyAgICAgICAgICAgIG5vdGlmeURhdGFDb25uZWN0aW9uKHJlYXNvbik7CisgICAgICAgICAgICBub3RpZnlPZmZBcG5zT2ZBdmFpbGFiaWxpdHkocmVhc29uLCB0cnVlKTsKIAogICAgICAgICAgICAgTG9nLmkoTE9HX1RBRywgIihmaXg/KSBXZSdyZSBvbiB0aGUgc2ltdWxhdG9yOyBhc3N1bWluZyBkYXRhIGlzIGNvbm5lY3RlZCIpOwogICAgICAgICAgICAgcmV0dXJuIHRydWU7CkBAIC0zMjcsMzYgKzM2MCwxMyBAQAogICAgICAgICBib29sZWFuIHJvYW1pbmcgPSBwaG9uZS5nZXRTZXJ2aWNlU3RhdGUoKS5nZXRSb2FtaW5nKCk7CiAgICAgICAgIGJvb2xlYW4gZGVzaXJlZFBvd2VyU3RhdGUgPSBtQ2RtYVBob25lLm1TU1QuZ2V0RGVzaXJlZFBvd2VyU3RhdGUoKTsKIAotICAgICAgICBpZiAoKHN0YXRlID09IFN0YXRlLklETEUgfHwgc3RhdGUgPT0gU3RhdGUuU0NBTk5JTkcpCi0gICAgICAgICAgICAgICAgJiYgKHBzU3RhdGUgPT0gU2VydmljZVN0YXRlLlNUQVRFX0lOX1NFUlZJQ0UpCi0gICAgICAgICAgICAgICAgJiYgKChwaG9uZS5tQ00uZ2V0UmFkaW9TdGF0ZSgpID09IENvbW1hbmRzSW50ZXJmYWNlLlJhZGlvU3RhdGUuTlZfUkVBRFkpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQ2RtYVBob25lLm1SdWltUmVjb3Jkcy5nZXRSZWNvcmRzTG9hZGVkKCkpCi0gICAgICAgICAgICAgICAgJiYgKG1DZG1hUGhvbmUubVNTVC5pc0NvbmN1cnJlbnRWb2ljZUFuZERhdGEoKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgcGhvbmUuZ2V0U3RhdGUoKSA9PSBQaG9uZS5TdGF0ZS5JRExFICkKLSAgICAgICAgICAgICAgICAmJiBpc0RhdGFBbGxvd2VkKCkKLSAgICAgICAgICAgICAgICAmJiBkZXNpcmVkUG93ZXJTdGF0ZQotICAgICAgICAgICAgICAgICYmICFtUGVuZGluZ1Jlc3RhcnRSYWRpbwotICAgICAgICAgICAgICAgICYmICFtQ2RtYVBob25lLm5lZWRzT3RhU2VydmljZVByb3Zpc2lvbmluZygpKSB7Ci0KLSAgICAgICAgICAgIHJldHVybiBzZXR1cERhdGEocmVhc29uKTsKLQorICAgICAgICBpZiAoKHN0YXRlID09IFN0YXRlLklETEUgfHwgc3RhdGUgPT0gU3RhdGUuU0NBTk5JTkcpICYmCisgICAgICAgICAgICAgICAgaXNEYXRhQWxsb3dlZCgpICYmIGdldEFueURhdGFFbmFibGVkKCkpIHsKKyAgICAgICAgICAgIGJvb2xlYW4gcmV0VmFsdWUgPSBzZXR1cERhdGEocmVhc29uKTsKKyAgICAgICAgICAgIG5vdGlmeU9mZkFwbnNPZkF2YWlsYWJpbGl0eShyZWFzb24sIHJldFZhbHVlKTsKKyAgICAgICAgICAgIHJldHVybiByZXRWYWx1ZTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nKCJ0cnlTZXR1cERhdGE6IE5vdCByZWFkeSBmb3IgZGF0YTogIiArCi0gICAgICAgICAgICAgICAgICAgICIgZGF0YVN0YXRlPSIgKyBzdGF0ZSArCi0gICAgICAgICAgICAgICAgICAgICIgUFMgc3RhdGU9IiArIHBzU3RhdGUgKwotICAgICAgICAgICAgICAgICAgICAiIHJhZGlvIHN0YXRlPSIgKyBwaG9uZS5tQ00uZ2V0UmFkaW9TdGF0ZSgpICsKLSAgICAgICAgICAgICAgICAgICAgIiBydWltPSIgKyBtQ2RtYVBob25lLm1SdWltUmVjb3Jkcy5nZXRSZWNvcmRzTG9hZGVkKCkgKwotICAgICAgICAgICAgICAgICAgICAiIGNvbmN1cnJlbnRWb2ljZSZEYXRhPSIgKyBtQ2RtYVBob25lLm1TU1QuaXNDb25jdXJyZW50Vm9pY2VBbmREYXRhKCkgKwotICAgICAgICAgICAgICAgICAgICAiIHBob25lU3RhdGU9IiArIHBob25lLmdldFN0YXRlKCkgKwotICAgICAgICAgICAgICAgICAgICAiIGRhdGFFbmFibGVkPSIgKyBnZXRBbnlEYXRhRW5hYmxlZCgpICsKLSAgICAgICAgICAgICAgICAgICAgIiByb2FtaW5nPSIgKyByb2FtaW5nICsKLSAgICAgICAgICAgICAgICAgICAgIiBkYXRhT25Sb2FtaW5nRW5hYmxlPSIgKyBnZXREYXRhT25Sb2FtaW5nRW5hYmxlZCgpICsKLSAgICAgICAgICAgICAgICAgICAgIiBkZXNpcmVkUG93ZXJTdGF0ZT0iICsgZGVzaXJlZFBvd2VyU3RhdGUgKwotICAgICAgICAgICAgICAgICAgICAiIFBlbmRpbmdSZXN0YXJ0UmFkaW89IiArIG1QZW5kaW5nUmVzdGFydFJhZGlvICsKLSAgICAgICAgICAgICAgICAgICAgIiBNYXN0ZXJEYXRhRW5hYmxlZD0iICsgbU1hc3RlckRhdGFFbmFibGVkICsKLSAgICAgICAgICAgICAgICAgICAgIiBuZWVkc090YVNlcnZpY2VQcm92aXNpb25pbmc9IiArIG1DZG1hUGhvbmUubmVlZHNPdGFTZXJ2aWNlUHJvdmlzaW9uaW5nKCkpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgbm90aWZ5T2ZmQXBuc09mQXZhaWxhYmlsaXR5KHJlYXNvbiwgZmFsc2UpOwogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgfQpAQCAtMzgyLDYgKzM5Miw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBzZXRTdGF0ZShTdGF0ZS5ESVNDT05ORUNUSU5HKTsKKyAgICAgICAgbm90aWZ5RGF0YUF2YWlsYWJpbGl0eShyZWFzb24pOwogCiAgICAgICAgIGJvb2xlYW4gbm90aWZpY2F0aW9uRGVmZXJyZWQgPSBmYWxzZTsKICAgICAgICAgZm9yIChEYXRhQ29ubmVjdGlvbiBjb25uIDogZGF0YUNvbm5lY3Rpb25MaXN0KSB7CkBAIC00NDAsMTMgKzQ1MSwxMyBAQAogICAgICAgICBjb25uLmNvbm5lY3QobXNnLCBtQWN0aXZlQXBuKTsKIAogICAgICAgICBzZXRTdGF0ZShTdGF0ZS5JTklUSU5HKTsKLSAgICAgICAgcGhvbmUubm90aWZ5RGF0YUNvbm5lY3Rpb24ocmVhc29uKTsKKyAgICAgICAgbm90aWZ5RGF0YUNvbm5lY3Rpb24ocmVhc29uKTsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIG5vdGlmeURlZmF1bHREYXRhKFN0cmluZyByZWFzb24pIHsKICAgICAgICAgc2V0U3RhdGUoU3RhdGUuQ09OTkVDVEVEKTsKLSAgICAgICAgcGhvbmUubm90aWZ5RGF0YUNvbm5lY3Rpb24ocmVhc29uKTsKKyAgICAgICAgbm90aWZ5RGF0YUNvbm5lY3Rpb24ocmVhc29uKTsKICAgICAgICAgc3RhcnROZXRTdGF0UG9sbCgpOwogICAgICAgICBtUmV0cnlNZ3IucmVzZXRSZXRyeUNvdW50KCk7CiAgICAgfQpAQCAtNjIyLDEyICs2MzMsMTMgQEAKIAogICAgIHByaXZhdGUgdm9pZCBub3RpZnlOb0RhdGEoRmFpbENhdXNlIGxhc3RGYWlsQ2F1c2VDb2RlKSB7CiAgICAgICAgIHNldFN0YXRlKFN0YXRlLkZBSUxFRCk7CisgICAgICAgIG5vdGlmeURhdGFBdmFpbGFiaWxpdHkobnVsbCk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIGdvdG9JZGxlQW5kTm90aWZ5RGF0YUNvbm5lY3Rpb24oU3RyaW5nIHJlYXNvbikgewogICAgICAgICBpZiAoREJHKSBsb2coImdvdG9JZGxlQW5kTm90aWZ5RGF0YUNvbm5lY3Rpb246IHJlYXNvbj0iICsgcmVhc29uKTsKICAgICAgICAgc2V0U3RhdGUoU3RhdGUuSURMRSk7Ci0gICAgICAgIHBob25lLm5vdGlmeURhdGFDb25uZWN0aW9uKHJlYXNvbik7CisgICAgICAgIG5vdGlmeURhdGFDb25uZWN0aW9uKHJlYXNvbik7CiAgICAgICAgIG1BY3RpdmVBcG4gPSBudWxsOwogICAgIH0KIApAQCAtNjg3LDExICs2OTksMTMgQEAKICAgICAgICAgICAgIC8vIEFzc3VtZSBkYXRhIGlzIGNvbm5lY3RlZCBvbiB0aGUgc2ltdWxhdG9yCiAgICAgICAgICAgICAvLyBGSVhNRSAgdGhpcyBjYW4gYmUgaW1wcm92ZWQKICAgICAgICAgICAgIHNldFN0YXRlKFN0YXRlLkNPTk5FQ1RFRCk7Ci0gICAgICAgICAgICBwaG9uZS5ub3RpZnlEYXRhQ29ubmVjdGlvbihudWxsKTsKKyAgICAgICAgICAgIG5vdGlmeURhdGFDb25uZWN0aW9uKG51bGwpOwogCiAgICAgICAgICAgICBMb2cuaShMT0dfVEFHLCAiV2UncmUgb24gdGhlIHNpbXVsYXRvcjsgYXNzdW1pbmcgZGF0YSBpcyBjb25uZWN0ZWQiKTsKICAgICAgICAgfQogCisgICAgICAgIG5vdGlmeURhdGFBdmFpbGFiaWxpdHkobnVsbCk7CisKICAgICAgICAgaWYgKHN0YXRlICE9IFN0YXRlLklETEUpIHsKICAgICAgICAgICAgIGNsZWFuVXBDb25uZWN0aW9uKHRydWUsIG51bGwpOwogICAgICAgICB9CkBAIC03MjMsNiArNzM3LDggQEAKICAgICAgICAgfQogCiAgICAgICAgIGlmIChhci5leGNlcHRpb24gPT0gbnVsbCkgeworICAgICAgICAgICAgbU5ldHdvcmtQcm9wZXJ0aWVzID0gbWFrZU5ldHdvcmtQcm9wZXJ0aWVzKG1BY3RpdmVEYXRhQ29ubmVjdGlvbik7CisKICAgICAgICAgICAgIC8vIGV2ZXJ5dGhpbmcgaXMgc2V0dXAKICAgICAgICAgICAgIG5vdGlmeURlZmF1bHREYXRhKHJlYXNvbik7CiAgICAgICAgIH0gZWxzZSB7CkBAIC03NjIsNyArNzc4LDcgQEAKICAgICAgICAgICAgIG9uUmVzdGFydFJhZGlvKCk7CiAgICAgICAgIH0KIAotICAgICAgICBwaG9uZS5ub3RpZnlEYXRhQ29ubmVjdGlvbihyZWFzb24pOworICAgICAgICBub3RpZnlEYXRhQ29ubmVjdGlvbihyZWFzb24pOwogICAgICAgICBtQWN0aXZlQXBuID0gbnVsbDsKICAgICAgICAgaWYgKHJldHJ5QWZ0ZXJEaXNjb25uZWN0ZWQocmVhc29uKSkgewogICAgICAgICAgIHRyeVNldHVwRGF0YShyZWFzb24pOwpAQCAtNzg5LDcgKzgwNSw4IEBACiAgICAgcHJvdGVjdGVkIHZvaWQgb25Wb2ljZUNhbGxTdGFydGVkKCkgewogICAgICAgICBpZiAoc3RhdGUgPT0gU3RhdGUuQ09OTkVDVEVEICYmICFtQ2RtYVBob25lLm1TU1QuaXNDb25jdXJyZW50Vm9pY2VBbmREYXRhKCkpIHsKICAgICAgICAgICAgIHN0b3BOZXRTdGF0UG9sbCgpOwotICAgICAgICAgICAgcGhvbmUubm90aWZ5RGF0YUNvbm5lY3Rpb24oUGhvbmUuUkVBU09OX1ZPSUNFX0NBTExfU1RBUlRFRCk7CisgICAgICAgICAgICBub3RpZnlEYXRhQ29ubmVjdGlvbihQaG9uZS5SRUFTT05fVk9JQ0VfQ0FMTF9TVEFSVEVEKTsKKyAgICAgICAgICAgIG5vdGlmeURhdGFBdmFpbGFiaWxpdHkoUGhvbmUuUkVBU09OX1ZPSUNFX0NBTExfU1RBUlRFRCk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTgwMCwxMSArODE3LDEyIEBACiAgICAgICAgIGlmIChzdGF0ZSA9PSBTdGF0ZS5DT05ORUNURUQpIHsKICAgICAgICAgICAgIGlmICghbUNkbWFQaG9uZS5tU1NULmlzQ29uY3VycmVudFZvaWNlQW5kRGF0YSgpKSB7CiAgICAgICAgICAgICAgICAgc3RhcnROZXRTdGF0UG9sbCgpOwotICAgICAgICAgICAgICAgIHBob25lLm5vdGlmeURhdGFDb25uZWN0aW9uKFBob25lLlJFQVNPTl9WT0lDRV9DQUxMX0VOREVEKTsKKyAgICAgICAgICAgICAgICBub3RpZnlEYXRhQ29ubmVjdGlvbihQaG9uZS5SRUFTT05fVk9JQ0VfQ0FMTF9FTkRFRCk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIC8vIGNsZWFuIHNsYXRlIGFmdGVyIGNhbGwgZW5kLgogICAgICAgICAgICAgICAgIHJlc2V0UG9sbFN0YXRzKCk7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBub3RpZnlEYXRhQXZhaWxhYmlsaXR5KFBob25lLlJFQVNPTl9WT0lDRV9DQUxMX0VOREVEKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIG1SZXRyeU1nci5yZXNldFJldHJ5Q291bnQoKTsKICAgICAgICAgICAgIC8vIGluIGNhc2UgZGF0YSBzZXR1cCB3YXMgYXR0ZW1wdGVkIHdoZW4gd2Ugd2VyZSBvbiBhIHZvaWNlIGNhbGwKQEAgLTgzOCw3ICs4NTYsNyBAQAogICAgIHByaXZhdGUgdm9pZCBvbkNkbWFEYXRhRGV0YWNoZWQoKSB7CiAgICAgICAgIGlmIChzdGF0ZSA9PSBTdGF0ZS5DT05ORUNURUQpIHsKICAgICAgICAgICAgIHN0YXJ0TmV0U3RhdFBvbGwoKTsKLSAgICAgICAgICAgIHBob25lLm5vdGlmeURhdGFDb25uZWN0aW9uKFBob25lLlJFQVNPTl9DRE1BX0RBVEFfREVUQUNIRUQpOworICAgICAgICAgICAgbm90aWZ5RGF0YUNvbm5lY3Rpb24oUGhvbmUuUkVBU09OX0NETUFfREFUQV9ERVRBQ0hFRCk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBpZiAoc3RhdGUgPT0gU3RhdGUuRkFJTEVEKSB7CiAgICAgICAgICAgICAgICAgY2xlYW5VcENvbm5lY3Rpb24oZmFsc2UsIFBob25lLlJFQVNPTl9DRE1BX0RBVEFfREVUQUNIRUQpOwpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvQ2RtYVNNU0Rpc3BhdGNoZXIuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL0NkbWFTTVNEaXNwYXRjaGVyLmphdmEKaW5kZXggOGVhZjRhMi4uNTNkMGYyMCAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvQ2RtYVNNU0Rpc3BhdGNoZXIuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9DZG1hU01TRGlzcGF0Y2hlci5qYXZhCkBAIC03MCw2ICs3MCw3IEBACiAgICAgICogQHBhcmFtIGFyIEFzeW5jUmVzdWx0IHBhc3NlZCBpbnRvIHRoZSBtZXNzYWdlIGhhbmRsZXIuICBhci5yZXN1bHQgc2hvdWxkCiAgICAgICogICAgICAgICAgIGJlIGEgU3RyaW5nIHJlcHJlc2VudGluZyB0aGUgc3RhdHVzIHJlcG9ydCBQRFUsIGFzIEFTQ0lJIGhleC4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVTdGF0dXNSZXBvcnQoQXN5bmNSZXN1bHQgYXIpIHsKICAgICAgICAgTG9nLmQoVEFHLCAiaGFuZGxlU3RhdHVzUmVwb3J0IGlzIGEgc3BlY2lhbCBHU00gZnVuY3Rpb24sIHNob3VsZCBuZXZlciBiZSBjYWxsZWQgaW4gQ0RNQSEiKTsKICAgICB9CkBAIC05Miw2ICs5Myw3IEBACiAgICAgfQogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgaW50IGRpc3BhdGNoTWVzc2FnZShTbXNNZXNzYWdlQmFzZSBzbXNiKSB7CiAKICAgICAgICAgLy8gSWYgc21zIGlzIG51bGwsIG1lYW5zIHRoZXJlIHdhcyBhIHBhcnNpbmcgZXJyb3IuCkBAIC0zMzUsNiArMzM3LDcgQEAKICAgICB9CiAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIHNlbmREYXRhKFN0cmluZyBkZXN0QWRkciwgU3RyaW5nIHNjQWRkciwgaW50IGRlc3RQb3J0LAogICAgICAgICAgICAgYnl0ZVtdIGRhdGEsIFBlbmRpbmdJbnRlbnQgc2VudEludGVudCwgUGVuZGluZ0ludGVudCBkZWxpdmVyeUludGVudCkgewogICAgICAgICBTbXNNZXNzYWdlLlN1Ym1pdFBkdSBwZHUgPSBTbXNNZXNzYWdlLmdldFN1Ym1pdFBkdSgKQEAgLTM0Myw2ICszNDYsNyBAQAogICAgIH0KIAogICAgIC8qKiB7QGluaGVyaXREb2N9ICovCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgc2VuZFRleHQoU3RyaW5nIGRlc3RBZGRyLCBTdHJpbmcgc2NBZGRyLCBTdHJpbmcgdGV4dCwKICAgICAgICAgICAgIFBlbmRpbmdJbnRlbnQgc2VudEludGVudCwgUGVuZGluZ0ludGVudCBkZWxpdmVyeUludGVudCkgewogICAgICAgICBTbXNNZXNzYWdlLlN1Ym1pdFBkdSBwZHUgPSBTbXNNZXNzYWdlLmdldFN1Ym1pdFBkdSgKQEAgLTM1MSw2ICszNTUsNyBAQAogICAgIH0KIAogICAgIC8qKiB7QGluaGVyaXREb2N9ICovCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgc2VuZE11bHRpcGFydFRleHQoU3RyaW5nIGRlc3RBZGRyLCBTdHJpbmcgc2NBZGRyLAogICAgICAgICAgICAgQXJyYXlMaXN0PFN0cmluZz4gcGFydHMsIEFycmF5TGlzdDxQZW5kaW5nSW50ZW50PiBzZW50SW50ZW50cywKICAgICAgICAgICAgIEFycmF5TGlzdDxQZW5kaW5nSW50ZW50PiBkZWxpdmVyeUludGVudHMpIHsKQEAgLTM1OSw3ICszNjQsNyBAQAogICAgICAgICAgKiBUT0RPKGNsZWFudXApOiBUaGVyZSBpcyBubyByZWFsIGNvZGUgZGlmZmVyZW5jZSBiZXR3ZWVuCiAgICAgICAgICAqIHRoaXMgYW5kIHRoZSBHU00gdmVyc2lvbiwgYW5kIGhlbmNlIGl0IHNob3VsZCBiZSBtb3ZlZCB0bwogICAgICAgICAgKiB0aGUgYmFzZSBjbGFzcyBvciBjb25zb2xpZGF0ZWQgc29tZWhvdywgcHJvdmlkZWQgY2FsbGluZwotICAgICAgICAgKiB0aGUgcHJvcGVyIHN1Ym1pdHBkdSBzdHVmZiBjYW4gYmUgYXJyYW5nZWQuCisgICAgICAgICAqIHRoZSBwcm9wZXIgc3VibWl0IHBkdSBzdHVmZiBjYW4gYmUgYXJyYW5nZWQuCiAgICAgICAgICAqLwogCiAgICAgICAgIGludCByZWZOdW1iZXIgPSBnZXROZXh0Q29uY2F0ZW5hdGVkUmVmKCkgJiAweDAwRkY7CkBAIC00MzIsOCArNDM3LDkgQEAKICAgICB9CiAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIHNlbmRTbXMoU21zVHJhY2tlciB0cmFja2VyKSB7Ci0gICAgICAgIEhhc2hNYXAgbWFwID0gdHJhY2tlci5tRGF0YTsKKyAgICAgICAgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4gbWFwID0gdHJhY2tlci5tRGF0YTsKIAogICAgICAgICAvLyBieXRlIHNtc2NbXSA9IChieXRlW10pIG1hcC5nZXQoInNtc2MiKTsgIC8vIHVudXNlZCBmb3IgQ0RNQQogICAgICAgICBieXRlIHBkdVtdID0gKGJ5dGVbXSkgbWFwLmdldCgicGR1Iik7CkBAIC00NDQsMTEgKzQ1MCwxMyBAQAogICAgIH0KIAogICAgICAvKioge0Bpbmhlcml0RG9jfSAqLworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIHNlbmRNdWx0aXBhcnRTbXMgKFNtc1RyYWNrZXIgdHJhY2tlcikgewogICAgICAgICBMb2cuZChUQUcsICJUT0RPOiBDZG1hU01TRGlzcGF0Y2hlci5zZW5kTXVsdGlwYXJ0U21zIG5vdCBpbXBsZW1lbnRlZCIpOwogICAgIH0KIAogICAgIC8qKiB7QGluaGVyaXREb2N9ICovCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgYWNrbm93bGVkZ2VMYXN0SW5jb21pbmdTbXMoYm9vbGVhbiBzdWNjZXNzLCBpbnQgcmVzdWx0LCBNZXNzYWdlIHJlc3BvbnNlKXsKICAgICAgICAgLy8gRklYTUUgdW5pdCB0ZXN0IGxlYXZlcyBjbSA9PSBudWxsLiB0aGlzIHNob3VsZCBjaGFuZ2UKIApAQCAtNDY5LDE2ICs0NzcsMTkgQEAKICAgICB9CiAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIGFjdGl2YXRlQ2VsbEJyb2FkY2FzdFNtcyhpbnQgYWN0aXZhdGUsIE1lc3NhZ2UgcmVzcG9uc2UpIHsKICAgICAgICAgbUNtLnNldENkbWFCcm9hZGNhc3RBY3RpdmF0aW9uKChhY3RpdmF0ZSA9PSAwKSwgcmVzcG9uc2UpOwogICAgIH0KIAogICAgIC8qKiB7QGluaGVyaXREb2N9ICovCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgZ2V0Q2VsbEJyb2FkY2FzdFNtc0NvbmZpZyhNZXNzYWdlIHJlc3BvbnNlKSB7CiAgICAgICAgIG1DbS5nZXRDZG1hQnJvYWRjYXN0Q29uZmlnKHJlc3BvbnNlKTsKICAgICB9CiAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIHNldENlbGxCcm9hZGNhc3RDb25maWcoaW50W10gY29uZmlnVmFsdWVzQXJyYXksIE1lc3NhZ2UgcmVzcG9uc2UpIHsKICAgICAgICAgbUNtLnNldENkbWFCcm9hZGNhc3RDb25maWcoY29uZmlnVmFsdWVzQXJyYXksIHJlc3BvbnNlKTsKICAgICB9CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9DZG1hU2VydmljZVN0YXRlVHJhY2tlci5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvQ2RtYVNlcnZpY2VTdGF0ZVRyYWNrZXIuamF2YQppbmRleCAyY2FkNmNjLi41ZDRkYzU4IDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9DZG1hU2VydmljZVN0YXRlVHJhY2tlci5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL0NkbWFTZXJ2aWNlU3RhdGVUcmFja2VyLmphdmEKQEAgLTExMTksNyArMTExOSw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBpZiAoaGFzQ2RtYURhdGFDb25uZWN0aW9uQ2hhbmdlZCB8fCBoYXNOZXR3b3JrVHlwZUNoYW5nZWQpIHsKLSAgICAgICAgICAgIHBob25lLm5vdGlmeURhdGFDb25uZWN0aW9uKG51bGwpOworICAgICAgICAgICAgcGhvbmUubm90aWZ5RGF0YUNvbm5lY3Rpb24obnVsbCwgbnVsbCk7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoaGFzUm9hbWluZ09uKSB7CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9SdWltU21zSW50ZXJmYWNlTWFuYWdlci5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvUnVpbVNtc0ludGVyZmFjZU1hbmFnZXIuamF2YQppbmRleCBjZmNmZDk4Li5hOWRmMzc1IDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9SdWltU21zSW50ZXJmYWNlTWFuYWdlci5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL1J1aW1TbXNJbnRlcmZhY2VNYW5hZ2VyLmphdmEKQEAgLTY3LDggKzY3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgYXIgPSAoQXN5bmNSZXN1bHQpbXNnLm9iajsKICAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFyLmV4Y2VwdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNtcyAgPSAoTGlzdDxTbXNSYXdEYXRhPikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkVmFsaWRSYXdEYXRhKChBcnJheUxpc3Q8Ynl0ZVtdPikgYXIucmVzdWx0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU21zID0gYnVpbGRWYWxpZFJhd0RhdGEoKEFycmF5TGlzdDxieXRlW10+KSBhci5yZXN1bHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihEQkcpIGxvZygiQ2Fubm90IGxvYWQgU21zIHJlY29yZHMiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVNtcyAhPSBudWxsKQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvU21zTWVzc2FnZS5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvU21zTWVzc2FnZS5qYXZhCmluZGV4IDBmM2I4ZmYuLmU5NWIyZjkgMTAwNzU1Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL1Ntc01lc3NhZ2UuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9TbXNNZXNzYWdlLmphdmEKQEAgLTE4LDExICsxOCw4IEBACiAKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKIGltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbVByb3BlcnRpZXM7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LmZvcm1hdC5UaW1lOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Db25maWc7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuRW5jb2RlRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5Hc21BbHBoYWJldDsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuSWNjVXRpbHM7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlNtc0hlYWRlcjsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuU21zTWVzc2FnZUJhc2U7CkBAIC0zMyw3ICszMCw2IEBACiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmNkbWEuc21zLlVzZXJEYXRhOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnV0aWwuSGV4RHVtcDsKIAotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CkBAIC01OCw3ICs1NCw3IEBACiAvKioKICAqIFRPRE8oY2xlYW51cCk6IGludGVybmFsbHkgcmV0dXJuaW5nIG51bGwgaW4gbWFueSBwbGFjZXMgbWFrZXMKICAqIGRlYnVnZ2luZyB2ZXJ5IGhhcmQgKGFtb25nIG1hbnkgb3RoZXIgcmVhc29ucykgYW5kIHNob3VsZCBiZSBtYWRlCi0gKiBtb3JlIG1lYW5pbmdmdWwgKHJlcGxhY2VkIHdpdGggZXhlY3B0aW9ucyBmb3IgZXhhbXBsZSkuICBOdWxsCisgKiBtb3JlIG1lYW5pbmdmdWwgKHJlcGxhY2VkIHdpdGggZXhjZXB0aW9ucyBmb3IgZXhhbXBsZSkuICBOdWxsCiAgKiByZXR1cm5zIHNob3VsZCBvbmx5IG9jY3VyIGF0IHRoZSB2ZXJ5IG91dHNpZGUgb2YgdGhlIG1vZHVsZS9jbGFzcwogICogc2NvcGUuCiAgKi8KQEAgLTYxNCw3ICs2MTAsNyBAQAogICAgICAqIGluY3JlbWVudGluZyB3aXRoaW4gdGhlIHJhbmdlIDEuLjY1NTM1IHJlbWVtYmVyaW5nIHRoZSBzdGF0ZQogICAgICAqIHZpYSBhIHBlcnNpc3RlbnQgc3lzdGVtIHByb3BlcnR5LiAgKFNlZSBDLlMwMDE1LUIsIHYyLjAsCiAgICAgICogNC4zLjEuNSkgU2luY2UgdGhpcyByb3V0aW5lIGlzIGV4cGVjdGVkIHRvIGJlIGFjY2Vzc2VkIHZpYSB2aWEKLSAgICAgKiBiaW5kZXItY2FsbCwgYW5kIGhlbmNlIHNob3VsZCBiZSB0aHJlYWRzYWZlLCBpdCBoYXMgYmVlbgorICAgICAqIGJpbmRlci1jYWxsLCBhbmQgaGVuY2Ugc2hvdWxkIGJlIHRocmVhZC1zYWZlLCBpdCBoYXMgYmVlbgogICAgICAqIHN5bmNocm9uaXplZC4KICAgICAgKi8KICAgICBwcml2YXRlIHN5bmNocm9uaXplZCBzdGF0aWMgaW50IGdldE5leHRNZXNzYWdlSWQoKSB7CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9zbXMvQmVhcmVyRGF0YS5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvc21zL0JlYXJlckRhdGEuamF2YQppbmRleCBhYjc5ZmU5Li5jZjA2ZGFiIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9zbXMvQmVhcmVyRGF0YS5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL3Ntcy9CZWFyZXJEYXRhLmphdmEKQEAgLTIxLDcgKzIxLDYgQEAKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC50ZWxlcGhvbnkuU21zTWVzc2FnZS5NQVhfVVNFUl9EQVRBX0JZVEVTX1dJVEhfSEVBREVSOwogCiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBhbmRyb2lkLnV0aWwuU3BhcnNlSW50QXJyYXk7CiAKIGltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5TbXNNZXNzYWdlOwogCkBAIC0zMCwxMCArMjksOCBAQAogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5JY2NVdGlsczsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuR3NtQWxwaGFiZXQ7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlNtc0hlYWRlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuY2RtYS5zbXMuVXNlckRhdGE7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlNtc01lc3NhZ2VCYXNlLlRleHRFbmNvZGluZ0RldGFpbHM7CiAKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLkhleER1bXA7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudXRpbC5CaXR3aXNlSW5wdXRTdHJlYW07CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudXRpbC5CaXR3aXNlT3V0cHV0U3RyZWFtOwogCkBAIC00NSwxMyArNDIsMTMgQEAKICAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgTE9HX1RBRyA9ICJTTVMiOwogCiAgICAgLyoqCi0gICAgICogQmVhcmVyIERhdGEgU3VicGFyYW1ldGVyIEluZGVudGlmaWVycworICAgICAqIEJlYXJlciBEYXRhIFN1YnBhcmFtZXRlciBJZGVudGlmaWVycwogICAgICAqIChTZWUgM0dQUDIgQy5TMDAxNS1CLCB2Mi4wLCB0YWJsZSA0LjUtMSkKICAgICAgKiBOT1RFOiBDb21tZW50ZWQgc3VicGFyYW1ldGVyIHR5cGVzIGFyZSBub3QgaW1wbGVtZW50ZWQuCiAgICAgICovCiAgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYnl0ZSBTVUJQQVJBTV9NRVNTQUdFX0lERU5USUZJRVIgICAgICAgICAgICAgICA9IDB4MDA7CiAgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYnl0ZSBTVUJQQVJBTV9VU0VSX0RBVEEgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDE7Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYnl0ZSBTVUJQQVJBTV9VU0VSX1JFUE9OU0VfQ09ERSAgICAgICAgICAgICAgICA9IDB4MDI7CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYnl0ZSBTVUJQQVJBTV9VU0VSX1JFU1BPTlNFX0NPREUgICAgICAgICAgICAgICA9IDB4MDI7CiAgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYnl0ZSBTVUJQQVJBTV9NRVNTQUdFX0NFTlRFUl9USU1FX1NUQU1QICAgICAgICA9IDB4MDM7CiAgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYnl0ZSBTVUJQQVJBTV9WQUxJRElUWV9QRVJJT0RfQUJTT0xVVEUgICAgICAgICA9IDB4MDQ7CiAgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYnl0ZSBTVUJQQVJBTV9WQUxJRElUWV9QRVJJT0RfUkVMQVRJVkUgICAgICAgICA9IDB4MDU7CkBAIC02OTcsNyArNjk0LDcgQEAKICAgICAvKgogICAgICAqIFRPRE8oY2xlYW51cCk6IENkbWFTbXNBZGRyZXNzIGVuY29kaW5nIHNob3VsZCBtYWtlIHVzZSBvZgogICAgICAqIENkbWFTbXNBZGRyZXNzLnBhcnNlIHByb3ZpZGVkIHRoYXQgRFRNRiBlbmNvZGluZyBpcyB1bmlmaWVkLAotICAgICAqIGFuZCB0aGUgZGlmZmVyZW5jZSBpbiA0Yml0IHZzIDhiaXQgaXMgcmVzb2x2ZWQuCisgICAgICogYW5kIHRoZSBkaWZmZXJlbmNlIGluIDQtYml0IHZzLiA4LWJpdCBpcyByZXNvbHZlZC4KICAgICAgKi8KIAogICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZW5jb2RlQ2RtYVNtc0FkZHJlc3MoQ2RtYVNtc0FkZHJlc3MgYWRkcikgdGhyb3dzIENvZGluZ0V4Y2VwdGlvbiB7CkBAIC04MDUsNiArODAyLDcgQEAKICAgICAgKiAoU2VlIDNHUFAyIEMuUjEwMDEtRiwgdjEuMCwgc2VjdGlvbiA0LjUgZm9yIGxheW91dCBkZXRhaWxzKQogICAgICAqCiAgICAgICogQHBhcmFtIGJEYXRhIGFuIGluc3RhbmNlIG9mIEJlYXJlckRhdGEuCisgICAgICoKICAgICAgKiBAcmV0dXJuIGJ5dGUgYXJyYXkgb2YgcmF3IGVuY29kZWQgU01TIGJlYXJlciBkYXRhLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgYnl0ZVtdIGVuY29kZShCZWFyZXJEYXRhIGJEYXRhKSB7CkBAIC05MTUsNyArOTEzLDcgQEAKICAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZGVjb2RlVXRmMTYoYnl0ZVtdIGRhdGEsIGludCBvZmZzZXQsIGludCBudW1GaWVsZHMpCiAgICAgICAgIHRocm93cyBDb2RpbmdFeGNlcHRpb24KICAgICB7Ci0gICAgICAgIC8vIFN0YXJ0IHJlYWRpbmcgZnJvbSB0aGUgbmV4dCAxNi1iaXQgYWxpZ25lZCBib3VuZHJ5IGFmdGVyIG9mZnNldC4KKyAgICAgICAgLy8gU3RhcnQgcmVhZGluZyBmcm9tIHRoZSBuZXh0IDE2LWJpdCBhbGlnbmVkIGJvdW5kYXJ5IGFmdGVyIG9mZnNldC4KICAgICAgICAgaW50IHBhZGRpbmcgPSBvZmZzZXQgJSAyOwogICAgICAgICBudW1GaWVsZHMgLT0gKG9mZnNldCArIHBhZGRpbmcpIC8gMjsKICAgICAgICAgdHJ5IHsKQEAgLTk2MSw3ICs5NTksNyBAQAogICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBkZWNvZGU3Yml0R3NtKGJ5dGVbXSBkYXRhLCBpbnQgb2Zmc2V0LCBpbnQgbnVtRmllbGRzKQogICAgICAgICB0aHJvd3MgQ29kaW5nRXhjZXB0aW9uCiAgICAgewotICAgICAgICAvLyBTdGFydCByZWFkaW5nIGZyb20gdGhlIG5leHQgNy1iaXQgYWxpZ25lZCBib3VuZHJ5IGFmdGVyIG9mZnNldC4KKyAgICAgICAgLy8gU3RhcnQgcmVhZGluZyBmcm9tIHRoZSBuZXh0IDctYml0IGFsaWduZWQgYm91bmRhcnkgYWZ0ZXIgb2Zmc2V0LgogICAgICAgICBpbnQgb2Zmc2V0Qml0cyA9IG9mZnNldCAqIDg7CiAgICAgICAgIGludCBvZmZzZXRTZXB0ZXRzID0gKG9mZnNldEJpdHMgKyA2KSAvIDc7CiAgICAgICAgIG51bUZpZWxkcyAtPSBvZmZzZXRTZXB0ZXRzOwpAQCAtMTU1NCw3ICsxNTUyLDcgQEAKICAgICAgICAgICAgICAgICBjYXNlIFNVQlBBUkFNX1VTRVJfREFUQToKICAgICAgICAgICAgICAgICAgICAgZGVjb2RlU3VjY2VzcyA9IGRlY29kZVVzZXJEYXRhKGJEYXRhLCBpblN0cmVhbSk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgU1VCUEFSQU1fVVNFUl9SRVBPTlNFX0NPREU6CisgICAgICAgICAgICAgICAgY2FzZSBTVUJQQVJBTV9VU0VSX1JFU1BPTlNFX0NPREU6CiAgICAgICAgICAgICAgICAgICAgIGRlY29kZVN1Y2Nlc3MgPSBkZWNvZGVVc2VyUmVzcG9uc2VDb2RlKGJEYXRhLCBpblN0cmVhbSk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgU1VCUEFSQU1fUkVQTFlfT1BUSU9OOgpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvc21zL1Ntc0VudmVsb3BlLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9zbXMvU21zRW52ZWxvcGUuamF2YQppbmRleCAwZGNhY2MxLi5hNjczMjdhIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9zbXMvU21zRW52ZWxvcGUuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9zbXMvU21zRW52ZWxvcGUuamF2YQpAQCAtMTcsNyArMTcsNyBAQAogcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuY2RtYS5zbXM7CiAKIAotcHVibGljIGZpbmFsIGNsYXNzIFNtc0VudmVsb3BleworcHVibGljIGZpbmFsIGNsYXNzIFNtc0VudmVsb3BlIHsKICAgICAvKioKICAgICAgKiBNZXNzYWdlIFR5cGVzCiAgICAgICogKFNlZSAzR1BQMiBDLlMwMDE1LUIgMy40LjEpCmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL0dTTVBob25lLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL0dTTVBob25lLmphdmEKaW5kZXggNjlhN2E1Ny4uMmFlNWEzYyAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9HU01QaG9uZS5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vR1NNUGhvbmUuamF2YQpAQCAtMjkxLDcgKzI5MSw3IEBACiAgICAgICAgIHJldHVybiBtUGVuZGluZ01NSXM7CiAgICAgfQogCi0gICAgcHVibGljIERhdGFTdGF0ZSBnZXREYXRhQ29ubmVjdGlvblN0YXRlKCkgeworICAgIHB1YmxpYyBEYXRhU3RhdGUgZ2V0RGF0YUNvbm5lY3Rpb25TdGF0ZShTdHJpbmcgYXBuVHlwZSkgewogICAgICAgICBEYXRhU3RhdGUgcmV0ID0gRGF0YVN0YXRlLkRJU0NPTk5FQ1RFRDsKIAogICAgICAgICBpZiAobVNTVCA9PSBudWxsKSB7CkBAIC0zMDQsNiArMzA0LDggQEAKICAgICAgICAgICAgIC8vIElmIHdlJ3JlIG91dCBvZiBzZXJ2aWNlLCBvcGVuIFRDUCBzb2NrZXRzIG1heSBzdGlsbCB3b3JrCiAgICAgICAgICAgICAvLyBidXQgbm8gZGF0YSB3aWxsIGZsb3cKICAgICAgICAgICAgIHJldCA9IERhdGFTdGF0ZS5ESVNDT05ORUNURUQ7CisgICAgICAgIH0gZWxzZSBpZiAobURhdGFDb25uZWN0aW9uLmlzQXBuVHlwZUVuYWJsZWQoYXBuVHlwZSkgPT0gZmFsc2UpIHsKKyAgICAgICAgICAgIHJldCA9IERhdGFTdGF0ZS5ESVNDT05ORUNURUQ7CiAgICAgICAgIH0gZWxzZSB7IC8qIG1TU1QuZ3Byc1N0YXRlID09IFNlcnZpY2VTdGF0ZS5TVEFURV9JTl9TRVJWSUNFICovCiAgICAgICAgICAgICBzd2l0Y2ggKG1EYXRhQ29ubmVjdGlvbi5nZXRTdGF0ZSgpKSB7CiAgICAgICAgICAgICAgICAgY2FzZSBGQUlMRUQ6CkBAIC00MDUsOCArNDA3LDggQEAKICAgICB9CiAKICAgICAvKnBhY2thZ2UqLyB2b2lkCi0gICAgbm90aWZ5RGF0YUNvbm5lY3Rpb25GYWlsZWQoU3RyaW5nIHJlYXNvbikgewotICAgICAgICBtTm90aWZpZXIubm90aWZ5RGF0YUNvbm5lY3Rpb25GYWlsZWQodGhpcywgcmVhc29uKTsKKyAgICBub3RpZnlEYXRhQ29ubmVjdGlvbkZhaWxlZChTdHJpbmcgcmVhc29uLCBTdHJpbmcgYXBuVHlwZSkgeworICAgICAgICBtTm90aWZpZXIubm90aWZ5RGF0YUNvbm5lY3Rpb25GYWlsZWQodGhpcywgcmVhc29uLCBhcG5UeXBlKTsKICAgICB9CiAKICAgICAvKnBhY2thZ2UqLyB2b2lkCkBAIC0xMDk1LDI3ICsxMDk3LDYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBUaGUgb25seSBjaXJjdW1zdGFuY2VzIHVuZGVyIHdoaWNoIHdlIHJlcG9ydCB0aGF0IGRhdGEgY29ubmVjdGl2aXR5IGlzIG5vdAotICAgICAqIHBvc3NpYmxlIGFyZQotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+RGF0YSByb2FtaW5nIGlzIGRpc2FsbG93ZWQgYW5kIHdlIGFyZSByb2FtaW5nLjwvbGk+Ci0gICAgICogPGxpPlRoZSBjdXJyZW50IGRhdGEgc3RhdGUgaXMge0Bjb2RlIERJU0NPTk5FQ1RFRH0gZm9yIGEgcmVhc29uIG90aGVyIHRoYW4KLSAgICAgKiBoYXZpbmcgZXhwbGljaXRseSBkaXNhYmxlZCBjb25uZWN0aXZpdHkuIEluIG90aGVyIHdvcmRzLCBkYXRhIGlzIG5vdCBhdmFpbGFibGUKLSAgICAgKiBiZWNhdXNlIHRoZSBwaG9uZSBpcyBvdXQgb2YgY292ZXJhZ2Ugb3Igc29tZSBsaWtlIHJlYXNvbi48L2xpPgotICAgICAqIDwvdWw+Ci0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgZGF0YSBjb25uZWN0aXZpdHkgaXMgcG9zc2libGUsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzRGF0YUNvbm5lY3Rpdml0eVBvc3NpYmxlKCkgewotICAgICAgICAvLyBUT0RPOiBDdXJyZW50bHkgY2hlY2tzIGlmIGFueSBHUFJTIGNvbm5lY3Rpb24gaXMgYWN0aXZlLiBTaG91bGQgaXQgb25seQotICAgICAgICAvLyBjaGVjayBmb3IgImRlZmF1bHQiPwotICAgICAgICBib29sZWFuIG5vRGF0YSA9IG1EYXRhQ29ubmVjdGlvbi5nZXREYXRhRW5hYmxlZCgpICYmCi0gICAgICAgICAgICBnZXREYXRhQ29ubmVjdGlvblN0YXRlKCkgPT0gRGF0YVN0YXRlLkRJU0NPTk5FQ1RFRDsKLSAgICAgICAgcmV0dXJuICFub0RhdGEgJiYgZ2V0SWNjQ2FyZCgpLmdldFN0YXRlKCkgPT0gU2ltQ2FyZC5TdGF0ZS5SRUFEWSAmJgotICAgICAgICAgICAgICAgIGdldFNlcnZpY2VTdGF0ZSgpLmdldFN0YXRlKCkgPT0gU2VydmljZVN0YXRlLlNUQVRFX0lOX1NFUlZJQ0UgJiYKLSAgICAgICAgICAgIChtRGF0YUNvbm5lY3Rpb24uZ2V0RGF0YU9uUm9hbWluZ0VuYWJsZWQoKSB8fCAhZ2V0U2VydmljZVN0YXRlKCkuZ2V0Um9hbWluZygpKTsKLSAgICB9Ci0KLSAgICAvKioKICAgICAgKiBSZW1vdmVzIHRoZSBnaXZlbiBNTUkgZnJvbSB0aGUgcGVuZGluZyBsaXN0IGFuZCBub3RpZmllcwogICAgICAqIHJlZ2lzdHJhbnRzIHRoYXQgaXQgaXMgY29tcGxldGUuCiAgICAgICogQHBhcmFtIG1taSBNTUkgdGhhdCBpcyBkb25lCmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL0dzbURhdGFDb25uZWN0aW9uVHJhY2tlci5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9Hc21EYXRhQ29ubmVjdGlvblRyYWNrZXIuamF2YQppbmRleCBmNmQ0NDkxLi5jNzZkYTgwIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL0dzbURhdGFDb25uZWN0aW9uVHJhY2tlci5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vR3NtRGF0YUNvbm5lY3Rpb25UcmFja2VyLmphdmEKQEAgLTMwLDYgKzMwLDggQEAKIGltcG9ydCBhbmRyb2lkLm5ldC5Db25uZWN0aXZpdHlNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQubmV0LklDb25uZWN0aXZpdHlNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtJbmZvOworaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtQcm9wZXJ0aWVzOworaW1wb3J0IGFuZHJvaWQubmV0LlByb3h5UHJvcGVydGllczsKIGltcG9ydCBhbmRyb2lkLm5ldC5UcmFmZmljU3RhdHM7CiBpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwogaW1wb3J0IGFuZHJvaWQubmV0LndpZmkuV2lmaU1hbmFnZXI7CkBAIC01OCw2ICs2MCw5IEBACiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkRhdGFDb25uZWN0aW9uLkZhaWxDYXVzZTsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7CitpbXBvcnQgamF2YS5uZXQuTmV0d29ya0ludGVyZmFjZTsKK2ltcG9ydCBqYXZhLm5ldC5Vbmtub3duSG9zdEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogCiAvKioKQEAgLTM4OCwxMiArMzkzLDYgQEAKICAgICAgICAgcmV0dXJuIHBkcHM7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzRGF0YUFsbG93ZWQoKSB7Ci0gICAgICAgIGJvb2xlYW4gcm9hbWluZyA9IHBob25lLmdldFNlcnZpY2VTdGF0ZSgpLmdldFJvYW1pbmcoKTsKLSAgICAgICAgcmV0dXJuIGdldEFueURhdGFFbmFibGVkKCkgJiYgKCFyb2FtaW5nIHx8IGdldERhdGFPblJvYW1pbmdFbmFibGVkKCkpICYmCi0gICAgICAgICAgICAgICAgbU1hc3RlckRhdGFFbmFibGVkOwotICAgIH0KLQogICAgIC8vKioqKioqIENhbGxlZCBmcm9tIFNlcnZpY2VTdGF0ZVRyYWNrZXIKICAgICAvKioKICAgICAgKiBJbnZva2VkIHdoZW4gU2VydmljZVN0YXRlVHJhY2tlciBvYnNlcnZlcyBhIHRyYW5zaXRpb24gZnJvbSBHUFJTCkBAIC00MDUsMTMgKzQwNCwxMyBAQAogICAgICAgICAgKiB3aGVuIEdQUlMgZGV0YWNoZXMsIGJ1dCB3ZSBzaG91bGQgc3RvcCB0aGUgbmV0d29yayBwb2xsaW5nLgogICAgICAgICAgKi8KICAgICAgICAgc3RvcE5ldFN0YXRQb2xsKCk7Ci0gICAgICAgIHBob25lLm5vdGlmeURhdGFDb25uZWN0aW9uKFBob25lLlJFQVNPTl9HUFJTX0RFVEFDSEVEKTsKKyAgICAgICAgbm90aWZ5RGF0YUNvbm5lY3Rpb24oUGhvbmUuUkVBU09OX0dQUlNfREVUQUNIRUQpOwogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBvbkdwcnNBdHRhY2hlZCgpIHsKICAgICAgICAgaWYgKHN0YXRlID09IFN0YXRlLkNPTk5FQ1RFRCkgewogICAgICAgICAgICAgc3RhcnROZXRTdGF0UG9sbCgpOwotICAgICAgICAgICAgcGhvbmUubm90aWZ5RGF0YUNvbm5lY3Rpb24oUGhvbmUuUkVBU09OX0dQUlNfQVRUQUNIRUQpOworICAgICAgICAgICAgbm90aWZ5RGF0YUNvbm5lY3Rpb24oUGhvbmUuUkVBU09OX0dQUlNfQVRUQUNIRUQpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgaWYgKHN0YXRlID09IFN0YXRlLkZBSUxFRCkgewogICAgICAgICAgICAgICAgIGNsZWFuVXBDb25uZWN0aW9uKGZhbHNlLCBQaG9uZS5SRUFTT05fR1BSU19BVFRBQ0hFRCk7CkBAIC00MjEsNiArNDIwLDM1IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0RhdGFBbGxvd2VkKCkgeworICAgICAgICBpbnQgZ3Byc1N0YXRlID0gbUdzbVBob25lLm1TU1QuZ2V0Q3VycmVudEdwcnNTdGF0ZSgpOworICAgICAgICBib29sZWFuIGRlc2lyZWRQb3dlclN0YXRlID0gbUdzbVBob25lLm1TU1QuZ2V0RGVzaXJlZFBvd2VyU3RhdGUoKTsKKworICAgICAgICBib29sZWFuIGFsbG93ZWQgPSAoKGdwcnNTdGF0ZSA9PSBTZXJ2aWNlU3RhdGUuU1RBVEVfSU5fU0VSVklDRSB8fCBub0F1dG9BdHRhY2gpICYmCisgICAgICAgICAgICAgICAgbUdzbVBob25lLm1TSU1SZWNvcmRzLmdldFJlY29yZHNMb2FkZWQoKSAmJgorICAgICAgICAgICAgICAgIHBob25lLmdldFN0YXRlKCkgPT0gUGhvbmUuU3RhdGUuSURMRSAmJgorICAgICAgICAgICAgICAgIG1NYXN0ZXJEYXRhRW5hYmxlZCAmJgorICAgICAgICAgICAgICAgICghcGhvbmUuZ2V0U2VydmljZVN0YXRlKCkuZ2V0Um9hbWluZygpIHx8IGdldERhdGFPblJvYW1pbmdFbmFibGVkKCkpICYmCisgICAgICAgICAgICAgICAgIW1Jc1BzUmVzdHJpY3RlZCAmJgorICAgICAgICAgICAgICAgIGRlc2lyZWRQb3dlclN0YXRlKTsKKyAgICAgICAgaWYgKCFhbGxvd2VkICYmIERCRykgeworICAgICAgICAgICAgU3RyaW5nIHJlYXNvbiA9ICIiOworICAgICAgICAgICAgaWYgKGdwcnNTdGF0ZSAhPSBTZXJ2aWNlU3RhdGUuU1RBVEVfSU5fU0VSVklDRSkgcmVhc29uICs9ICIgLSBncHJzPSAiICsgZ3Byc1N0YXRlOworICAgICAgICAgICAgaWYgKCFtR3NtUGhvbmUubVNJTVJlY29yZHMuZ2V0UmVjb3Jkc0xvYWRlZCgpKSByZWFzb24gKz0gIiAtIFNJTSBub3QgbG9hZGVkIjsKKyAgICAgICAgICAgIGlmIChwaG9uZS5nZXRTdGF0ZSgpICE9IFBob25lLlN0YXRlLklETEUpIHsKKyAgICAgICAgICAgICAgICByZWFzb24gKz0gIiAtIFBob25lU3RhdGU9ICIgKyBwaG9uZS5nZXRTdGF0ZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFtTWFzdGVyRGF0YUVuYWJsZWQpIHJlYXNvbiArPSAiIC0gbU1hc3RlckRhdGFFbmFibGVkPSBmYWxzZSI7CisgICAgICAgICAgICBpZiAocGhvbmUuZ2V0U2VydmljZVN0YXRlKCkuZ2V0Um9hbWluZygpICYmIGdldERhdGFPblJvYW1pbmdFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICByZWFzb24gKz0gIiAtIFJvYW1pbmciOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1Jc1BzUmVzdHJpY3RlZCkgcmVhc29uICs9ICIgLSBtSXNQc1Jlc3RyaWN0ZWQ9IHRydWUiOworICAgICAgICAgICAgaWYgKCFkZXNpcmVkUG93ZXJTdGF0ZSkgcmVhc29uICs9ICIgLSBkZXNpcmVkUG93ZXJTdGF0ZT0gZmFsc2UiOworICAgICAgICAgICAgbG9nKCJEYXRhIG5vdCBhbGxvd2VkIGR1ZSB0byIgKyByZWFzb24pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBhbGxvd2VkOworICAgIH0KKwogICAgIHByaXZhdGUgYm9vbGVhbiB0cnlTZXR1cERhdGEoU3RyaW5nIHJlYXNvbikgewogICAgICAgICBpZiAoREJHKSBsb2coIioqKnRyeVNldHVwRGF0YSBkdWUgdG8gIiArIChyZWFzb24gPT0gbnVsbCA/ICIodW5zcGVjaWZpZWQpIiA6IHJlYXNvbikpOwogCkBAIC00MzAsNyArNDU4LDcgQEAKICAgICAgICAgICAgIC8vIEFzc3VtZSBkYXRhIGlzIGNvbm5lY3RlZCBvbiB0aGUgc2ltdWxhdG9yCiAgICAgICAgICAgICAvLyBGSVhNRSAgdGhpcyBjYW4gYmUgaW1wcm92ZWQKICAgICAgICAgICAgIHNldFN0YXRlKFN0YXRlLkNPTk5FQ1RFRCk7Ci0gICAgICAgICAgICBwaG9uZS5ub3RpZnlEYXRhQ29ubmVjdGlvbihyZWFzb24pOworICAgICAgICAgICAgbm90aWZ5RGF0YUNvbm5lY3Rpb24ocmVhc29uKTsKIAogICAgICAgICAgICAgTG9nLmkoTE9HX1RBRywgIihmaXg/KSBXZSdyZSBvbiB0aGUgc2ltdWxhdG9yOyBhc3N1bWluZyBkYXRhIGlzIGNvbm5lY3RlZCIpOwogICAgICAgICAgICAgcmV0dXJuIHRydWU7CkBAIC00MzksMTkgKzQ2NywxNSBAQAogICAgICAgICBpbnQgZ3Byc1N0YXRlID0gbUdzbVBob25lLm1TU1QuZ2V0Q3VycmVudEdwcnNTdGF0ZSgpOwogICAgICAgICBib29sZWFuIGRlc2lyZWRQb3dlclN0YXRlID0gbUdzbVBob25lLm1TU1QuZ2V0RGVzaXJlZFBvd2VyU3RhdGUoKTsKIAotICAgICAgICBpZiAoKHN0YXRlID09IFN0YXRlLklETEUgfHwgc3RhdGUgPT0gU3RhdGUuU0NBTk5JTkcpCi0gICAgICAgICAgICAgICAgJiYgKGdwcnNTdGF0ZSA9PSBTZXJ2aWNlU3RhdGUuU1RBVEVfSU5fU0VSVklDRSB8fCBub0F1dG9BdHRhY2gpCi0gICAgICAgICAgICAgICAgJiYgbUdzbVBob25lLm1TSU1SZWNvcmRzLmdldFJlY29yZHNMb2FkZWQoKQotICAgICAgICAgICAgICAgICYmIHBob25lLmdldFN0YXRlKCkgPT0gUGhvbmUuU3RhdGUuSURMRQotICAgICAgICAgICAgICAgICYmIGlzRGF0YUFsbG93ZWQoKQotICAgICAgICAgICAgICAgICYmICFtSXNQc1Jlc3RyaWN0ZWQKLSAgICAgICAgICAgICAgICAmJiBkZXNpcmVkUG93ZXJTdGF0ZSApIHsKKyAgICAgICAgaWYgKCgoc3RhdGUgPT0gU3RhdGUuSURMRSkgfHwgKHN0YXRlID09IFN0YXRlLlNDQU5OSU5HKSkgJiYKKyAgICAgICAgICAgICAgICBpc0RhdGFBbGxvd2VkKCkgJiYgZ2V0QW55RGF0YUVuYWJsZWQoKSkgewogCiAgICAgICAgICAgICBpZiAoc3RhdGUgPT0gU3RhdGUuSURMRSkgewogICAgICAgICAgICAgICAgIHdhaXRpbmdBcG5zID0gYnVpbGRXYWl0aW5nQXBucygpOwogICAgICAgICAgICAgICAgIGlmICh3YWl0aW5nQXBucy5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKERCRykgbG9nKCJObyBBUE4gZm91bmQiKTsKICAgICAgICAgICAgICAgICAgICAgbm90aWZ5Tm9EYXRhKEdzbURhdGFDb25uZWN0aW9uLkZhaWxDYXVzZS5NSVNTSU5HX1VOS05PV05fQVBOKTsKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5T2ZmQXBuc09mQXZhaWxhYmlsaXR5KHJlYXNvbiwgZmFsc2UpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgbG9nICgiQ3JlYXRlIGZyb20gYWxsQXBucyA6ICIgKyBhcG5MaXN0VG9TdHJpbmcoYWxsQXBucykpOwpAQCAtNDYxLDIyICs0ODUsMTEgQEAKICAgICAgICAgICAgIGlmIChEQkcpIHsKICAgICAgICAgICAgICAgICBsb2cgKCJTZXR1cCB3YWl0bmdBcG5zIDogIiArIGFwbkxpc3RUb1N0cmluZyh3YWl0aW5nQXBucykpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHNldHVwRGF0YShyZWFzb24pOworICAgICAgICAgICAgYm9vbGVhbiByZXRWYWx1ZSA9IHNldHVwRGF0YShyZWFzb24pOworICAgICAgICAgICAgbm90aWZ5T2ZmQXBuc09mQXZhaWxhYmlsaXR5KHJlYXNvbiwgcmV0VmFsdWUpOworICAgICAgICAgICAgcmV0dXJuIHJldFZhbHVlOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKERCRykKLSAgICAgICAgICAgICAgICBsb2coInRyeVNldHVwRGF0YTogTm90IHJlYWR5IGZvciBkYXRhOiAiICsKLSAgICAgICAgICAgICAgICAgICAgIiBkYXRhU3RhdGU9IiArIHN0YXRlICsKLSAgICAgICAgICAgICAgICAgICAgIiBncHJzU3RhdGU9IiArIGdwcnNTdGF0ZSArCi0gICAgICAgICAgICAgICAgICAgICIgc2ltPSIgKyBtR3NtUGhvbmUubVNJTVJlY29yZHMuZ2V0UmVjb3Jkc0xvYWRlZCgpICsKLSAgICAgICAgICAgICAgICAgICAgIiBVTVRTPSIgKyBtR3NtUGhvbmUubVNTVC5pc0NvbmN1cnJlbnRWb2ljZUFuZERhdGEoKSArCi0gICAgICAgICAgICAgICAgICAgICIgcGhvbmVTdGF0ZT0iICsgcGhvbmUuZ2V0U3RhdGUoKSArCi0gICAgICAgICAgICAgICAgICAgICIgaXNEYXRhQWxsb3dlZD0iICsgaXNEYXRhQWxsb3dlZCgpICsKLSAgICAgICAgICAgICAgICAgICAgIiBkYXRhRW5hYmxlZD0iICsgZ2V0QW55RGF0YUVuYWJsZWQoKSArCi0gICAgICAgICAgICAgICAgICAgICIgcm9hbWluZz0iICsgcGhvbmUuZ2V0U2VydmljZVN0YXRlKCkuZ2V0Um9hbWluZygpICsKLSAgICAgICAgICAgICAgICAgICAgIiBkYXRhT25Sb2FtaW5nRW5hYmxlPSIgKyBnZXREYXRhT25Sb2FtaW5nRW5hYmxlZCgpICsKLSAgICAgICAgICAgICAgICAgICAgIiBwcyByZXN0cmljdGVkPSIgKyBtSXNQc1Jlc3RyaWN0ZWQgKwotICAgICAgICAgICAgICAgICAgICAiIGRlc2lyZWRQb3dlclN0YXRlPSIgKyBkZXNpcmVkUG93ZXJTdGF0ZSArCi0gICAgICAgICAgICAgICAgICAgICIgTWFzdGVyRGF0YUVuYWJsZWQ9IiArIG1NYXN0ZXJEYXRhRW5hYmxlZCk7CisgICAgICAgICAgICBub3RpZnlPZmZBcG5zT2ZBdmFpbGFiaWxpdHkocmVhc29uLCBmYWxzZSk7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICB9CkBAIC01OTUsNyArNjA4LDcgQEAKICAgICAgICAgcGRwLmNvbm5lY3QobXNnLCBhcG4pOwogCiAgICAgICAgIHNldFN0YXRlKFN0YXRlLklOSVRJTkcpOwotICAgICAgICBwaG9uZS5ub3RpZnlEYXRhQ29ubmVjdGlvbihyZWFzb24pOworICAgICAgICBub3RpZnlEYXRhQ29ubmVjdGlvbihyZWFzb24pOwogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKQEAgLTc0Niw3ICs3NTksNyBAQAogCiAgICAgcHJpdmF0ZSB2b2lkIG5vdGlmeURlZmF1bHREYXRhKFN0cmluZyByZWFzb24pIHsKICAgICAgICAgc2V0U3RhdGUoU3RhdGUuQ09OTkVDVEVEKTsKLSAgICAgICAgcGhvbmUubm90aWZ5RGF0YUNvbm5lY3Rpb24ocmVhc29uKTsKKyAgICAgICAgbm90aWZ5RGF0YUNvbm5lY3Rpb24ocmVhc29uKTsKICAgICAgICAgc3RhcnROZXRTdGF0UG9sbCgpOwogICAgICAgICAvLyByZXNldCByZWNvbm5lY3QgdGltZXIKICAgICAgICAgbVJldHJ5TWdyLnJlc2V0UmV0cnlDb3VudCgpOwpAQCAtNzU2LDcgKzc2OSw3IEBACiAgICAgcHJpdmF0ZSB2b2lkIGdvdG9JZGxlQW5kTm90aWZ5RGF0YUNvbm5lY3Rpb24oU3RyaW5nIHJlYXNvbikgewogICAgICAgICBpZiAoREJHKSBsb2coImdvdG9JZGxlQW5kTm90aWZ5RGF0YUNvbm5lY3Rpb246IHJlYXNvbj0iICsgcmVhc29uKTsKICAgICAgICAgc2V0U3RhdGUoU3RhdGUuSURMRSk7Ci0gICAgICAgIHBob25lLm5vdGlmeURhdGFDb25uZWN0aW9uKHJlYXNvbik7CisgICAgICAgIG5vdGlmeURhdGFDb25uZWN0aW9uKHJlYXNvbik7CiAgICAgICAgIG1BY3RpdmVBcG4gPSBudWxsOwogICAgIH0KIApAQCAtOTk4LDcgKzEwMTEsNyBAQAogICAgICAgICAgICAgaWYgKCFtUmV0cnlNZ3IuaXNSZXRyeU5lZWRlZCgpKSB7CiAgICAgICAgICAgICAgICAgaWYgKCFtUmVxdWVzdGVkQXBuVHlwZS5lcXVhbHMoUGhvbmUuQVBOX1RZUEVfREVGQVVMVCkpIHsKICAgICAgICAgICAgICAgICAgICAgLy8gaWYgbm8gbW9yZSByZXRyaWVzIG9uIGEgc2Vjb25kYXJ5IEFQTiBhdHRlbXB0LCB0ZWxsIHRoZSB3b3JsZCBhbmQgcmV2ZXJ0LgotICAgICAgICAgICAgICAgICAgICBwaG9uZS5ub3RpZnlEYXRhQ29ubmVjdGlvbihQaG9uZS5SRUFTT05fQVBOX0ZBSUxFRCk7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmeURhdGFDb25uZWN0aW9uKFBob25lLlJFQVNPTl9BUE5fRkFJTEVEKTsKICAgICAgICAgICAgICAgICAgICAgb25FbmFibGVBcG4oYXBuVHlwZVRvSWQobVJlcXVlc3RlZEFwblR5cGUpLCBESVNBQkxFRCk7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICB9CkBAIC0xMDkxLDcgKzExMDQsNyBAQAogICAgICAgICAgICAgLy8gQXNzdW1lIGRhdGEgaXMgY29ubmVjdGVkIG9uIHRoZSBzaW11bGF0b3IKICAgICAgICAgICAgIC8vIEZJWE1FICB0aGlzIGNhbiBiZSBpbXByb3ZlZAogICAgICAgICAgICAgc2V0U3RhdGUoU3RhdGUuQ09OTkVDVEVEKTsKLSAgICAgICAgICAgIHBob25lLm5vdGlmeURhdGFDb25uZWN0aW9uKG51bGwpOworICAgICAgICAgICAgbm90aWZ5RGF0YUNvbm5lY3Rpb24obnVsbCk7CiAKICAgICAgICAgICAgIExvZy5pKExPR19UQUcsICJXZSdyZSBvbiB0aGUgc2ltdWxhdG9yOyBhc3N1bWluZyBkYXRhIGlzIGNvbm5lY3RlZCIpOwogICAgICAgICB9CkBAIC0xMTI1LDYgKzExMzgsMjUgQEAKICAgICAgICAgfQogCiAgICAgICAgIGlmIChhci5leGNlcHRpb24gPT0gbnVsbCkgeworICAgICAgICAgICAgbU5ldHdvcmtQcm9wZXJ0aWVzID0gbWFrZU5ldHdvcmtQcm9wZXJ0aWVzKG1BY3RpdmVQZHApOworCisgICAgICAgICAgICBBcG5TZXR0aW5nIGFwbiA9IG1BY3RpdmVQZHAuZ2V0QXBuKCk7CisgICAgICAgICAgICBpZiAoYXBuLnByb3h5ICE9IG51bGwgJiYgYXBuLnByb3h5Lmxlbmd0aCgpICE9IDApIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBQcm94eVByb3BlcnRpZXMgcHJveHkgPSBuZXcgUHJveHlQcm9wZXJ0aWVzKCk7CisgICAgICAgICAgICAgICAgICAgIHByb3h5LnNldEFkZHJlc3MoSW5ldEFkZHJlc3MuZ2V0QnlOYW1lKGFwbi5wcm94eSkpOworICAgICAgICAgICAgICAgICAgICBwcm94eS5zZXRQb3J0KEludGVnZXIucGFyc2VJbnQoYXBuLnBvcnQpKTsKKyAgICAgICAgICAgICAgICAgICAgbU5ldHdvcmtQcm9wZXJ0aWVzLnNldEh0dHBQcm94eShwcm94eSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoVW5rbm93bkhvc3RFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiVW5rbm93bkhvc3RFeGNlcHRpb24gbWFraW5nIFByb3h5UHJvcGVydGllczogIiArIGUpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIlNlY3VyaXR5RXhjZXB0aW9uIG1ha2luZyBQcm94eVByb3BlcnRpZXM6ICIgKyBlKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG1ha2luZyBQcm94eVByb3BlcnRpZXMgKCIgKyBhcG4ucG9ydCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik6ICIgKyBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIC8vIGV2ZXJ5dGhpbmcgaXMgc2V0dXAKICAgICAgICAgICAgIGlmIChpc0FwblR5cGVBY3RpdmUoUGhvbmUuQVBOX1RZUEVfREVGQVVMVCkpIHsKICAgICAgICAgICAgICAgICBTeXN0ZW1Qcm9wZXJ0aWVzLnNldCgiZ3NtLmRlZmF1bHRwZHBjb250ZXh0LmFjdGl2ZSIsICJ0cnVlIik7CkBAIC0xMTU4LDcgKzExOTAsNyBAQAogICAgICAgICAgICAgaWYgKGNhdXNlLmlzUGVybWFuZW50RmFpbCgpKSB7CiAgICAgICAgICAgICAgICAgbm90aWZ5Tm9EYXRhKGNhdXNlKTsKICAgICAgICAgICAgICAgICBpZiAoIW1SZXF1ZXN0ZWRBcG5UeXBlLmVxdWFscyhQaG9uZS5BUE5fVFlQRV9ERUZBVUxUKSkgewotICAgICAgICAgICAgICAgICAgICBwaG9uZS5ub3RpZnlEYXRhQ29ubmVjdGlvbihQaG9uZS5SRUFTT05fQVBOX0ZBSUxFRCk7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmeURhdGFDb25uZWN0aW9uKFBob25lLlJFQVNPTl9BUE5fRkFJTEVEKTsKICAgICAgICAgICAgICAgICAgICAgb25FbmFibGVBcG4oYXBuVHlwZVRvSWQobVJlcXVlc3RlZEFwblR5cGUpLCBESVNBQkxFRCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHJldHVybjsKQEAgLTExODgsNyArMTIyMCw3IEBACiAgICAgICAgICAgIHJlYXNvbiA9IChTdHJpbmcpIGFyLnVzZXJPYmo7CiAgICAgICAgIH0KICAgICAgICAgc2V0U3RhdGUoU3RhdGUuSURMRSk7Ci0gICAgICAgIHBob25lLm5vdGlmeURhdGFDb25uZWN0aW9uKHJlYXNvbik7CisgICAgICAgIG5vdGlmeURhdGFDb25uZWN0aW9uKHJlYXNvbik7CiAgICAgICAgIG1BY3RpdmVBcG4gPSBudWxsOwogICAgICAgICBpZiAocmV0cnlBZnRlckRpc2Nvbm5lY3RlZChyZWFzb24pKSB7CiAgICAgICAgICAgICB0cnlTZXR1cERhdGEocmVhc29uKTsKQEAgLTEyMTksNyArMTI1MSw3IEBACiAgICAgcHJvdGVjdGVkIHZvaWQgb25Wb2ljZUNhbGxTdGFydGVkKCkgewogICAgICAgICBpZiAoc3RhdGUgPT0gU3RhdGUuQ09OTkVDVEVEICYmICEgbUdzbVBob25lLm1TU1QuaXNDb25jdXJyZW50Vm9pY2VBbmREYXRhKCkpIHsKICAgICAgICAgICAgIHN0b3BOZXRTdGF0UG9sbCgpOwotICAgICAgICAgICAgcGhvbmUubm90aWZ5RGF0YUNvbm5lY3Rpb24oUGhvbmUuUkVBU09OX1ZPSUNFX0NBTExfU1RBUlRFRCk7CisgICAgICAgICAgICBub3RpZnlEYXRhQ29ubmVjdGlvbihQaG9uZS5SRUFTT05fVk9JQ0VfQ0FMTF9TVEFSVEVEKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTIyNyw3ICsxMjU5LDcgQEAKICAgICAgICAgaWYgKHN0YXRlID09IFN0YXRlLkNPTk5FQ1RFRCkgewogICAgICAgICAgICAgaWYgKCFtR3NtUGhvbmUubVNTVC5pc0NvbmN1cnJlbnRWb2ljZUFuZERhdGEoKSkgewogICAgICAgICAgICAgICAgIHN0YXJ0TmV0U3RhdFBvbGwoKTsKLSAgICAgICAgICAgICAgICBwaG9uZS5ub3RpZnlEYXRhQ29ubmVjdGlvbihQaG9uZS5SRUFTT05fVk9JQ0VfQ0FMTF9FTkRFRCk7CisgICAgICAgICAgICAgICAgbm90aWZ5RGF0YUNvbm5lY3Rpb24oUGhvbmUuUkVBU09OX1ZPSUNFX0NBTExfRU5ERUQpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAvLyBjbGVhbiBzbGF0ZSBhZnRlciBjYWxsIGVuZC4KICAgICAgICAgICAgICAgICByZXNldFBvbGxTdGF0cygpOwpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9Hc21TTVNEaXNwYXRjaGVyLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL0dzbVNNU0Rpc3BhdGNoZXIuamF2YQppbmRleCAzMDc5YTY0Li5lZDcwNjZiIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL0dzbVNNU0Rpc3BhdGNoZXIuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL0dzbVNNU0Rpc3BhdGNoZXIuamF2YQpAQCAtNTYsNiArNTYsNyBAQAogICAgICAqIEBwYXJhbSBhciBBc3luY1Jlc3VsdCBwYXNzZWQgaW50byB0aGUgbWVzc2FnZSBoYW5kbGVyLiAgYXIucmVzdWx0IHNob3VsZAogICAgICAqICAgICAgICAgICBiZSBhIFN0cmluZyByZXByZXNlbnRpbmcgdGhlIHN0YXR1cyByZXBvcnQgUERVLCBhcyBBU0NJSSBoZXguCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlU3RhdHVzUmVwb3J0KEFzeW5jUmVzdWx0IGFyKSB7CiAgICAgICAgIFN0cmluZyBwZHVTdHJpbmcgPSAoU3RyaW5nKSBhci5yZXN1bHQ7CiAgICAgICAgIFNtc01lc3NhZ2Ugc21zID0gU21zTWVzc2FnZS5uZXdGcm9tQ0RTKHBkdVN0cmluZyk7CkBAIC04NCw2ICs4NSw3IEBACiAKIAogICAgIC8qKiB7QGluaGVyaXREb2N9ICovCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIGludCBkaXNwYXRjaE1lc3NhZ2UoU21zTWVzc2FnZUJhc2Ugc21zYikgewogCiAgICAgICAgIC8vIElmIHNtcyBpcyBudWxsLCBtZWFucyB0aGVyZSB3YXMgYSBwYXJzaW5nIGVycm9yLgpAQCAtMTUxLDYgKzE1Myw3IEBACiAgICAgfQogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBzZW5kRGF0YShTdHJpbmcgZGVzdEFkZHIsIFN0cmluZyBzY0FkZHIsIGludCBkZXN0UG9ydCwKICAgICAgICAgICAgIGJ5dGVbXSBkYXRhLCBQZW5kaW5nSW50ZW50IHNlbnRJbnRlbnQsIFBlbmRpbmdJbnRlbnQgZGVsaXZlcnlJbnRlbnQpIHsKICAgICAgICAgU21zTWVzc2FnZS5TdWJtaXRQZHUgcGR1ID0gU21zTWVzc2FnZS5nZXRTdWJtaXRQZHUoCkBAIC0xNTksNiArMTYyLDcgQEAKICAgICB9CiAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIHNlbmRUZXh0KFN0cmluZyBkZXN0QWRkciwgU3RyaW5nIHNjQWRkciwgU3RyaW5nIHRleHQsCiAgICAgICAgICAgICBQZW5kaW5nSW50ZW50IHNlbnRJbnRlbnQsIFBlbmRpbmdJbnRlbnQgZGVsaXZlcnlJbnRlbnQpIHsKICAgICAgICAgU21zTWVzc2FnZS5TdWJtaXRQZHUgcGR1ID0gU21zTWVzc2FnZS5nZXRTdWJtaXRQZHUoCkBAIC0xNjcsNiArMTcxLDcgQEAKICAgICB9CiAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIHNlbmRNdWx0aXBhcnRUZXh0KFN0cmluZyBkZXN0aW5hdGlvbkFkZHJlc3MsIFN0cmluZyBzY0FkZHJlc3MsCiAgICAgICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBwYXJ0cywgQXJyYXlMaXN0PFBlbmRpbmdJbnRlbnQ+IHNlbnRJbnRlbnRzLAogICAgICAgICAgICAgQXJyYXlMaXN0PFBlbmRpbmdJbnRlbnQ+IGRlbGl2ZXJ5SW50ZW50cykgewpAQCAtMzA2LDggKzMxMSw5IEBACiAgICAgfQogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBzZW5kU21zKFNtc1RyYWNrZXIgdHJhY2tlcikgewotICAgICAgICBIYXNoTWFwIG1hcCA9IHRyYWNrZXIubURhdGE7CisgICAgICAgIEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+IG1hcCA9IHRyYWNrZXIubURhdGE7CiAKICAgICAgICAgYnl0ZSBzbXNjW10gPSAoYnl0ZVtdKSBtYXAuZ2V0KCJzbXNjIik7CiAgICAgICAgIGJ5dGUgcGR1W10gPSAoYnl0ZVtdKSBtYXAuZ2V0KCJwZHUiKTsKQEAgLTMyMiwxMiArMzI4LDEzIEBACiAgICAgICoKICAgICAgKiBAcGFyYW0gdHJhY2tlciBob2xkcyB0aGUgbXVsdGlwYXJ0IFNtcyB0cmFja2VyIHJlYWR5IHRvIGJlIHNlbnQKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBzZW5kTXVsdGlwYXJ0U21zIChTbXNUcmFja2VyIHRyYWNrZXIpIHsKICAgICAgICAgQXJyYXlMaXN0PFN0cmluZz4gcGFydHM7CiAgICAgICAgIEFycmF5TGlzdDxQZW5kaW5nSW50ZW50PiBzZW50SW50ZW50czsKICAgICAgICAgQXJyYXlMaXN0PFBlbmRpbmdJbnRlbnQ+IGRlbGl2ZXJ5SW50ZW50czsKIAotICAgICAgICBIYXNoTWFwIG1hcCA9IHRyYWNrZXIubURhdGE7CisgICAgICAgIEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+IG1hcCA9IHRyYWNrZXIubURhdGE7CiAKICAgICAgICAgU3RyaW5nIGRlc3RpbmF0aW9uQWRkcmVzcyA9IChTdHJpbmcpIG1hcC5nZXQoImRlc3RpbmF0aW9uIik7CiAgICAgICAgIFN0cmluZyBzY0FkZHJlc3MgPSAoU3RyaW5nKSBtYXAuZ2V0KCJzY2FkZHJlc3MiKTsKQEAgLTM0Miw2ICszNDksNyBAQAogICAgIH0KIAogICAgIC8qKiB7QGluaGVyaXREb2N9ICovCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgYWNrbm93bGVkZ2VMYXN0SW5jb21pbmdTbXMoYm9vbGVhbiBzdWNjZXNzLCBpbnQgcmVzdWx0LCBNZXNzYWdlIHJlc3BvbnNlKXsKICAgICAgICAgLy8gRklYTUUgdW5pdCB0ZXN0IGxlYXZlcyBjbSA9PSBudWxsLiB0aGlzIHNob3VsZCBjaGFuZ2UKICAgICAgICAgaWYgKG1DbSAhPSBudWxsKSB7CkBAIC0zNTAsNiArMzU4LDcgQEAKICAgICB9CiAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIGFjdGl2YXRlQ2VsbEJyb2FkY2FzdFNtcyhpbnQgYWN0aXZhdGUsIE1lc3NhZ2UgcmVzcG9uc2UpIHsKICAgICAgICAgLy8gVW5sZXNzIENCUyBpcyBpbXBsZW1lbnRlZCBmb3IgR1NNLCB0aGlzIHBvaW50IHNob3VsZCBiZSB1bnJlYWNoYWJsZS4KICAgICAgICAgTG9nLmUoVEFHLCAiRXJyb3IhIFRoZSBmdW5jdGlvbmFsaXR5IGNlbGwgYnJvYWRjYXN0IHNtcyBpcyBub3QgaW1wbGVtZW50ZWQgZm9yIEdTTS4iKTsKQEAgLTM1Nyw2ICszNjYsNyBAQAogICAgIH0KIAogICAgIC8qKiB7QGluaGVyaXREb2N9ICovCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgZ2V0Q2VsbEJyb2FkY2FzdFNtc0NvbmZpZyhNZXNzYWdlIHJlc3BvbnNlKXsKICAgICAgICAgLy8gVW5sZXNzIENCUyBpcyBpbXBsZW1lbnRlZCBmb3IgR1NNLCB0aGlzIHBvaW50IHNob3VsZCBiZSB1bnJlYWNoYWJsZS4KICAgICAgICAgTG9nLmUoVEFHLCAiRXJyb3IhIFRoZSBmdW5jdGlvbmFsaXR5IGNlbGwgYnJvYWRjYXN0IHNtcyBpcyBub3QgaW1wbGVtZW50ZWQgZm9yIEdTTS4iKTsKQEAgLTM2NCw2ICszNzQsNyBAQAogICAgIH0KIAogICAgIC8qKiB7QGluaGVyaXREb2N9ICovCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkICB2b2lkIHNldENlbGxCcm9hZGNhc3RDb25maWcoaW50W10gY29uZmlnVmFsdWVzQXJyYXksIE1lc3NhZ2UgcmVzcG9uc2UpIHsKICAgICAgICAgLy8gVW5sZXNzIENCUyBpcyBpbXBsZW1lbnRlZCBmb3IgR1NNLCB0aGlzIHBvaW50IHNob3VsZCBiZSB1bnJlYWNoYWJsZS4KICAgICAgICAgTG9nLmUoVEFHLCAiRXJyb3IhIFRoZSBmdW5jdGlvbmFsaXR5IGNlbGwgYnJvYWRjYXN0IHNtcyBpcyBub3QgaW1wbGVtZW50ZWQgZm9yIEdTTS4iKTsKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vR3NtU2VydmljZVN0YXRlVHJhY2tlci5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9Hc21TZXJ2aWNlU3RhdGVUcmFja2VyLmphdmEKaW5kZXggOTBlY2JkNy4uYjYzOWVlYSAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9Hc21TZXJ2aWNlU3RhdGVUcmFja2VyLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9Hc21TZXJ2aWNlU3RhdGVUcmFja2VyLmphdmEKQEAgLTEwMTgsNyArMTAxOCw4IEBACiAgICAgICAgIH0KIAogICAgICAgICBpZiAoaGFzTmV0d29ya1R5cGVDaGFuZ2VkKSB7Ci0gICAgICAgICAgICBwaG9uZS5ub3RpZnlEYXRhQ29ubmVjdGlvbihudWxsKTsKKyAgICAgICAgICAgIC8vIFRPRE8gLSBkbyB3ZSByZWFsbHkgd2FudCB0aGlzPworICAgICAgICAgICAgcGhvbmUubm90aWZ5RGF0YUNvbm5lY3Rpb24obnVsbCwgbnVsbCk7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoaGFzUm9hbWluZ09uKSB7CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL1NpbVNtc0ludGVyZmFjZU1hbmFnZXIuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vU2ltU21zSW50ZXJmYWNlTWFuYWdlci5qYXZhCmluZGV4IDIwMjhjYTQuLmYwMDBkNzkgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vU2ltU21zSW50ZXJmYWNlTWFuYWdlci5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vU2ltU21zSW50ZXJmYWNlTWFuYWdlci5qYXZhCkBAIC04Niw2ICs4Niw3IEBACiAgICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIHN1cGVyLmZpbmFsaXplKCk7CkBAIC0xOTEsNiArMTkyLDcgQEAKICAgICAgICAgcmV0dXJuIG1TbXM7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgbG9nKFN0cmluZyBtc2cpIHsKICAgICAgICAgTG9nLmQoTE9HX1RBRywgIltTaW1TbXNJbnRlcmZhY2VNYW5hZ2VyXSAiICsgbXNnKTsKICAgICB9CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL1Ntc01lc3NhZ2UuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vU21zTWVzc2FnZS5qYXZhCmluZGV4IDlhM2M0NzYuLmE3NzQ4NGEgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vU21zTWVzc2FnZS5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vU21zTWVzc2FnZS5qYXZhCkBAIC0yNiw3ICsyNiw2IEBACiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkdzbUFscGhhYmV0OwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5TbXNIZWFkZXI7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlNtc01lc3NhZ2VCYXNlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5TbXNNZXNzYWdlQmFzZS5UZXh0RW5jb2RpbmdEZXRhaWxzOwogCiBpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwpAQCAtNDUsNyArNDQsNyBAQAogICogQSBTaG9ydCBNZXNzYWdlIFNlcnZpY2UgbWVzc2FnZS4KICAqCiAgKi8KLXB1YmxpYyBjbGFzcyBTbXNNZXNzYWdlIGV4dGVuZHMgU21zTWVzc2FnZUJhc2V7CitwdWJsaWMgY2xhc3MgU21zTWVzc2FnZSBleHRlbmRzIFNtc01lc3NhZ2VCYXNlIHsKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiR1NNIjsKIAogICAgIHByaXZhdGUgTWVzc2FnZUNsYXNzIG1lc3NhZ2VDbGFzczsKQEAgLTMxMSw3ICszMTAsNyBAQAogICAgICAgICAgICAgLy8gdGhlIHJlY2VpdmVyJ3MgU0lNIGNhcmQuIFlvdSBjYW4gdGhlbiBzZW5kIG1lc3NhZ2VzIHRvIHlvdXJzZWxmCiAgICAgICAgICAgICAvLyAob24gYSBwaG9uZSB3aXRoIHRoaXMgY2hhbmdlKSBhbmQgdGhleSdsbCBlbmQgdXAgb24gdGhlIFNJTSBjYXJkLgogICAgICAgICAgICAgYm8ud3JpdGUoMHgwMCk7Ci0gICAgICAgIH0gZWxzZSB7IC8vYXNzdW1lIFVDUy0yCisgICAgICAgIH0gZWxzZSB7IC8vIGFzc3VtZSBVQ1MtMgogICAgICAgICAgICAgaWYgKCgweGZmICYgdXNlckRhdGFbMF0pID4gTUFYX1VTRVJfREFUQV9CWVRFUykgewogICAgICAgICAgICAgICAgIC8vIE1lc3NhZ2UgdG9vIGxvbmcKICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKQEAgLTM3Nyw3ICszNzYsNyBAQAogICAgICAqIEBwYXJhbSBkZXN0aW5hdGlvbkFkZHJlc3MgdGhlIGFkZHJlc3Mgb2YgdGhlIGRlc3RpbmF0aW9uIGZvciB0aGUgbWVzc2FnZQogICAgICAqIEBwYXJhbSBkZXN0aW5hdGlvblBvcnQgdGhlIHBvcnQgdG8gZGVsaXZlciB0aGUgbWVzc2FnZSB0byBhdCB0aGUKICAgICAgKiAgICAgICAgZGVzdGluYXRpb24KLSAgICAgKiBAcGFyYW0gZGF0YSB0aGUgZGF0IGZvciB0aGUgbWVzc2FnZQorICAgICAqIEBwYXJhbSBkYXRhIHRoZSBkYXRhIGZvciB0aGUgbWVzc2FnZQogICAgICAqIEByZXR1cm4gYSA8Y29kZT5TdWJtaXRQZHU8L2NvZGU+IGNvbnRhaW5pbmcgdGhlIGVuY29kZWQgU0MKICAgICAgKiAgICAgICAgIGFkZHJlc3MsIGlmIGFwcGxpY2FibGUsIGFuZCB0aGUgZW5jb2RlZCBtZXNzYWdlLgogICAgICAqICAgICAgICAgUmV0dXJucyBudWxsIG9uIGVuY29kZSBlcnJvci4KQEAgLTQ4Miw3ICs0ODEsNyBAQAogICAgICAgICByZXR1cm4gYm87CiAgICAgfQogCi0gICAgc3RhdGljIGNsYXNzIFBkdVBhcnNlciB7CisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUGR1UGFyc2VyIHsKICAgICAgICAgYnl0ZSBwZHVbXTsKICAgICAgICAgaW50IGN1cjsKICAgICAgICAgU21zSGVhZGVyIHVzZXJEYXRhSGVhZGVyOwpAQCAtNDkwLDEwICs0ODksNiBAQAogICAgICAgICBpbnQgbVVzZXJEYXRhU2VwdGV0UGFkZGluZzsKICAgICAgICAgaW50IG1Vc2VyRGF0YVNpemU7CiAKLSAgICAgICAgUGR1UGFyc2VyKFN0cmluZyBzKSB7Ci0gICAgICAgICAgICB0aGlzKEljY1V0aWxzLmhleFN0cmluZ1RvQnl0ZXMocykpOwotICAgICAgICB9Ci0KICAgICAgICAgUGR1UGFyc2VyKGJ5dGVbXSBwZHUpIHsKICAgICAgICAgICAgIHRoaXMucGR1ID0gcGR1OwogICAgICAgICAgICAgY3VyID0gMDsKQEAgLTU0NSw3ICs1NDAsNyBAQAogICAgICAgICAgICAgR3NtU21zQWRkcmVzcyByZXQ7CiAKICAgICAgICAgICAgIC8vICJUaGUgQWRkcmVzcy1MZW5ndGggZmllbGQgaXMgYW4gaW50ZWdlciByZXByZXNlbnRhdGlvbiBvZgotICAgICAgICAgICAgLy8gdGhlIG51bWJlciBmaWVsZCwgaS5lLiBleGNsdWRlcyBhbnkgc2VtaSBvY3RldCBjb250YWluaW5nIG9ubHkKKyAgICAgICAgICAgIC8vIHRoZSBudW1iZXIgZmllbGQsIGkuZS4gZXhjbHVkZXMgYW55IHNlbWktb2N0ZXQgY29udGFpbmluZyBvbmx5CiAgICAgICAgICAgICAvLyBmaWxsIGJpdHMuIgogICAgICAgICAgICAgLy8gVGhlIFRPQSBmaWVsZCBpcyBub3QgaW5jbHVkZWQgYXMgcGFydCBvZiB0aGlzCiAgICAgICAgICAgICBpbnQgYWRkcmVzc0xlbmd0aCA9IHBkdVtjdXJdICYgMHhmZjsKQEAgLTU3Myw3ICs1NjgsNyBAQAogICAgICAgICAgICAgaW50IHNlY29uZCA9IEljY1V0aWxzLmdzbUJjZEJ5dGVUb0ludChwZHVbY3VyKytdKTsKIAogICAgICAgICAgICAgLy8gRm9yIHRoZSB0aW1lem9uZSwgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0IG9mIHRoZQotICAgICAgICAgICAgLy8gbGVhc3Qgc2lnbmZpY2FudCBuaWJibGUgaXMgdGhlIHNpZ24gYnl0ZQorICAgICAgICAgICAgLy8gbGVhc3Qgc2lnbmlmaWNhbnQgbmliYmxlIGlzIHRoZSBzaWduIGJ5dGUKICAgICAgICAgICAgIC8vIChtZWFuaW5nIHRoZSBtYXggcmFuZ2Ugb2YgdGhpcyBmaWVsZCBpcyA3OSBxdWFydGVyLWhvdXJzLAogICAgICAgICAgICAgLy8gd2hpY2ggaXMgbW9yZSB0aGFuIGVub3VnaCkKIApAQCAtNjMyLDcgKzYyNyw3IEBACiAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgKiBIZXJlIHdlIGp1c3QgY3JlYXRlIHRoZSB1c2VyIGRhdGEgbGVuZ3RoIHRvIGJlIHRoZSByZW1haW5kZXIgb2YKICAgICAgICAgICAgICAgICAgKiB0aGUgcGR1IG1pbnVzIHRoZSB1c2VyIGRhdGEgaGVhZGVyLCBzaW5jZSB1c2VyRGF0YUxlbmd0aCBtZWFucwotICAgICAgICAgICAgICAgICAqIHRoZSBudW1iZXIgb2YgdW5jb21wcmVzc2VkIHNlcGV0cy4KKyAgICAgICAgICAgICAgICAgKiB0aGUgbnVtYmVyIG9mIHVuY29tcHJlc3NlZCBzZXB0ZXRzLgogICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgIGJ1ZmZlckxlbiA9IHBkdS5sZW5ndGggLSBvZmZzZXQ7CiAgICAgICAgICAgICB9IGVsc2UgewpAQCAtNjcxLDEwICs2NjYsMTAgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgcGFkZGluZyBiaXRzIGF0IHRoZSBiZWdpbmluZyBvZiB0aGUgdXNlciBkYXRhCisgICAgICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBwYWRkaW5nIGJpdHMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgdXNlciBkYXRhCiAgICAgICAgICAqIGFycmF5IGJlZm9yZSB0aGUgc3RhcnQgb2YgdGhlIHNlcHRldHMuCiAgICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBwYWRkaW5nIGJpdHMgYXQgdGhlIGJlZ2luaW5nIG9mIHRoZSB1c2VyIGRhdGEKKyAgICAgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIHBhZGRpbmcgYml0cyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSB1c2VyIGRhdGEKICAgICAgICAgICogYXJyYXkgYmVmb3JlIHRoZSBzdGFydCBvZiB0aGUgc2VwdGV0cwogICAgICAgICAgKi8KICAgICAgICAgaW50IGdldFVzZXJEYXRhU2VwdGV0UGFkZGluZygpIHsKQEAgLTY5NCw3ICs2ODksNyBAQAogICAgICAgICBYWFggTm90IHN1cmUgd2hhdCB0aGlzIG9uZSBpcyBzdXBwb3NlZCB0byBiZSBkb2luZywgYW5kIG5vIG9uZSBpcyB1c2luZwogICAgICAgICBpdC4KICAgICAgICAgU3RyaW5nIGdldFVzZXJEYXRhR1NNOGJpdCgpIHsKLSAgICAgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigicmVtYWluZGVyIG9mIHB1ZDoiICsKKyAgICAgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigicmVtYWluZGVyIG9mIHBkdToiICsKICAgICAgICAgICAgIC8vIEhleER1bXAuZHVtcEhleFN0cmluZyhwZHUsIGN1ciwgcGR1Lmxlbmd0aCAtIGN1cikpOwogICAgICAgICAgICAgaW50IGNvdW50ID0gcGR1W2N1cisrXSAmIDB4ZmY7CiAgICAgICAgICAgICBpbnQgc2l6ZSA9IHBkdVtjdXIrK107CkBAIC04MjcsMTEgKzgyMiwxMyBAQAogICAgIH0KIAogICAgIC8qKiB7QGluaGVyaXREb2N9ICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBnZXRQcm90b2NvbElkZW50aWZpZXIoKSB7CiAgICAgICAgIHJldHVybiBwcm90b2NvbElkZW50aWZpZXI7CiAgICAgfQogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBpc1JlcGxhY2UoKSB7CiAgICAgICAgIHJldHVybiAocHJvdG9jb2xJZGVudGlmaWVyICYgMHhjMCkgPT0gMHg0MAogICAgICAgICAgICAgICAgICYmIChwcm90b2NvbElkZW50aWZpZXIgJiAweDNmKSA+IDAKQEAgLTgzOSwxMiArODM2LDE0IEBACiAgICAgfQogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBpc0NwaHNNd2lNZXNzYWdlKCkgewogICAgICAgICByZXR1cm4gKChHc21TbXNBZGRyZXNzKSBvcmlnaW5hdGluZ0FkZHJlc3MpLmlzQ3Boc1ZvaWNlTWVzc2FnZUNsZWFyKCkKICAgICAgICAgICAgICAgICB8fCAoKEdzbVNtc0FkZHJlc3MpIG9yaWdpbmF0aW5nQWRkcmVzcykuaXNDcGhzVm9pY2VNZXNzYWdlU2V0KCk7CiAgICAgfQogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBpc01XSUNsZWFyTWVzc2FnZSgpIHsKICAgICAgICAgaWYgKGlzTXdpICYmIChtd2lTZW5zZSA9PSBmYWxzZSkpIHsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwpAQCAtODU1LDYgKzg1NCw3IEBACiAgICAgfQogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBpc01XSVNldE1lc3NhZ2UoKSB7CiAgICAgICAgIGlmIChpc013aSAmJiAobXdpU2Vuc2UgPT0gdHJ1ZSkpIHsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwpAQCAtODY1LDYgKzg2NSw3IEBACiAgICAgfQogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBpc013aURvbnRTdG9yZSgpIHsKICAgICAgICAgaWYgKGlzTXdpICYmIG13aURvbnRTdG9yZSkgewogICAgICAgICAgICAgcmV0dXJuIHRydWU7CkBAIC04ODQsMzEgKzg4NSwzNCBAQAogICAgIH0KIAogICAgIC8qKiB7QGluaGVyaXREb2N9ICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBnZXRTdGF0dXMoKSB7CiAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBpc1N0YXR1c1JlcG9ydE1lc3NhZ2UoKSB7CiAgICAgICAgIHJldHVybiBpc1N0YXR1c1JlcG9ydE1lc3NhZ2U7CiAgICAgfQogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBpc1JlcGx5UGF0aFByZXNlbnQoKSB7CiAgICAgICAgIHJldHVybiByZXBseVBhdGhQcmVzZW50OwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFRTIDI3LjAwNSAzLjEsIDxwZHU+IGRlZmluaXRpb24gIkluIHRoZSBjYXNlIG9mIFNNUzogM0dQUCBUUyAyNC4wMTEgWzZdCisgICAgICogVFMgMjcuMDA1IDMuMSwgJmx0O3BkdSZndDsgZGVmaW5pdGlvbiAiSW4gdGhlIGNhc2Ugb2YgU01TOiAzR1BQIFRTIDI0LjAxMSBbNl0KICAgICAgKiBTQyBhZGRyZXNzIGZvbGxvd2VkIGJ5IDNHUFAgVFMgMjMuMDQwIFszXSBUUERVIGluIGhleGFkZWNpbWFsIGZvcm1hdDoKICAgICAgKiBNRS9UQSBjb252ZXJ0cyBlYWNoIG9jdGV0IG9mIFRQIGRhdGEgdW5pdCBpbnRvIHR3byBJUkEgY2hhcmFjdGVyIGxvbmcKLSAgICAgKiBoZXhhZCBudW1iZXIgKGUuZy4gb2N0ZXQgd2l0aCBpbnRlZ2VyIHZhbHVlIDQyIGlzIHByZXNlbnRlZCB0byBURSBhcyB0d28KKyAgICAgKiBoZXggbnVtYmVyIChlLmcuIG9jdGV0IHdpdGggaW50ZWdlciB2YWx1ZSA0MiBpcyBwcmVzZW50ZWQgdG8gVEUgYXMgdHdvCiAgICAgICogY2hhcmFjdGVycyAyQSAoSVJBIDUwIGFuZCA2NSkpIiAuLi5pbiB0aGUgY2FzZSBvZiBjZWxsIGJyb2FkY2FzdCwKICAgICAgKiBzb21ldGhpbmcgZWxzZS4uLgogICAgICAqLwogICAgIHByaXZhdGUgdm9pZCBwYXJzZVBkdShieXRlW10gcGR1KSB7CiAgICAgICAgIG1QZHUgPSBwZHU7Ci0gICAgICAgIC8vIExvZy5kKExPR19UQUcsICJyYXcgc21zIG1lc2FnZToiKTsKKyAgICAgICAgLy8gTG9nLmQoTE9HX1RBRywgInJhdyBzbXMgbWVzc2FnZToiKTsKICAgICAgICAgLy8gTG9nLmQoTE9HX1RBRywgcyk7CiAKICAgICAgICAgUGR1UGFyc2VyIHAgPSBuZXcgUGR1UGFyc2VyKHBkdSk7CkBAIC0xMTYyLDYgKzExNjYsNyBAQAogICAgIC8qKgogICAgICAqIHtAaW5oZXJpdERvY30KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgTWVzc2FnZUNsYXNzIGdldE1lc3NhZ2VDbGFzcygpIHsKICAgICAgICAgcmV0dXJuIG1lc3NhZ2VDbGFzczsKICAgICB9CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL1VzaW1QaG9uZUJvb2tNYW5hZ2VyLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL1VzaW1QaG9uZUJvb2tNYW5hZ2VyLmphdmEKaW5kZXggYjY0MjU0MS4uNDFmM2IyMyAxMDA3NTUKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9Vc2ltUGhvbmVCb29rTWFuYWdlci5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vVXNpbVBob25lQm9va01hbmFnZXIuamF2YQpAQCAtMjcsOCArMjcsNiBAQAogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5JY2NVdGlsczsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuUGhvbmVCYXNlOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkubGFuZy5yZWZsZWN0Lkxpc3RPZlR5cGVzOwotCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L3NpcC9TaXBDb25uZWN0aW9uQmFzZS5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L3NpcC9TaXBDb25uZWN0aW9uQmFzZS5qYXZhCmluZGV4IDZjOTg5YjQuLmY1ZDg0ZWIgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9zaXAvU2lwQ29ubmVjdGlvbkJhc2UuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvc2lwL1NpcENvbm5lY3Rpb25CYXNlLmphdmEKQEAgLTIzOCwxMSArMjM4LDkgQEAKICAgICAgICAgcmV0dXJuIENvbm5lY3Rpb24uUFJFU0VOVEFUSU9OX0FMTE9XRUQ7CiAgICAgfQogCi0gICAgLyoKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgVVVTSW5mbyBnZXRVVVNJbmZvKCkgewogICAgICAgICAvLyBGSVhNRTogd2hhdCdzIHRoaXMgZm9yIFNJUD8KICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQotICAgICovCiB9CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvc2lwL1NpcFBob25lLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvc2lwL1NpcFBob25lLmphdmEKaW5kZXggMTMyNWRkMy4uOWE0NWQzYSAxMDA3NTUKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L3NpcC9TaXBQaG9uZS5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9zaXAvU2lwUGhvbmUuamF2YQpAQCAtNTksNyArNTksNiBAQAogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5QaG9uZVByb3h5OwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5QaG9uZVN1YkluZm87CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlRlbGVwaG9ueVByb3BlcnRpZXM7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlVVU0luZm87CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudGV4dC5QYXJzZUV4Y2VwdGlvbjsKQEAgLTk5LDYgKzk4LDE0IEBACiAgICAgICAgIC8vICAgICAgICBuZXcgSW50ZWdlcihQaG9uZS5QSE9ORV9UWVBFX0dTTSkudG9TdHJpbmcoKSk7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CisgICAgICAgIGlmIChvID09IHRoaXMpIHJldHVybiB0cnVlOworICAgICAgICBpZiAoIShvIGluc3RhbmNlb2YgU2lwUGhvbmUpKSByZXR1cm4gZmFsc2U7CisgICAgICAgIFNpcFBob25lIHRoYXQgPSAoU2lwUGhvbmUpIG87CisgICAgICAgIHJldHVybiBtUHJvZmlsZS5nZXRVcmlTdHJpbmcoKS5lcXVhbHModGhhdC5tUHJvZmlsZS5nZXRVcmlTdHJpbmcoKSk7CisgICAgfQorCiAgICAgcHVibGljIFN0cmluZyBnZXRQaG9uZU5hbWUoKSB7CiAgICAgICAgIHJldHVybiAiU0lQOiIgKyBnZXRVcmlTdHJpbmcobVByb2ZpbGUpOwogICAgIH0KQEAgLTE2OCwxMCArMTc1LDYgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHB1YmxpYyBDb25uZWN0aW9uIGRpYWwoU3RyaW5nIGRpYWxTdHJpbmcsIFVVU0luZm8gdXVzaW5mbykgdGhyb3dzIENhbGxTdGF0ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBkaWFsKGRpYWxTdHJpbmcpOwotICAgIH0KLQogICAgIHB1YmxpYyBDb25uZWN0aW9uIGRpYWwoU3RyaW5nIGRpYWxTdHJpbmcpIHRocm93cyBDYWxsU3RhdGVFeGNlcHRpb24gewogICAgICAgICBzeW5jaHJvbml6ZWQgKFNpcFBob25lLmNsYXNzKSB7CiAgICAgICAgICAgICByZXR1cm4gZGlhbEludGVybmFsKGRpYWxTdHJpbmcpOwpAQCAtNzc4LDEwICs3ODEsNiBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBVVVNJbmZvIGdldFVVU0luZm8oKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQogICAgIH0KIAogICAgIHByaXZhdGUgc3RhdGljIENhbGwuU3RhdGUgZ2V0Q2FsbFN0YXRlRnJvbShTaXBBdWRpb0NhbGwgc2lwQXVkaW9DYWxsKSB7CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvc2lwL1NpcFBob25lQmFzZS5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L3NpcC9TaXBQaG9uZUJhc2UuamF2YQppbmRleCA0YjdlOTkxLi4xZDMzYmU5IDEwMDc1NQotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvc2lwL1NpcFBob25lQmFzZS5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9zaXAvU2lwUGhvbmVCYXNlLmphdmEKQEAgLTE5LDYgKzE5LDcgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlczsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuU2hhcmVkUHJlZmVyZW5jZXM7CitpbXBvcnQgYW5kcm9pZC5uZXQuTmV0d29ya1Byb3BlcnRpZXM7CiBpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwogaW1wb3J0IGFuZHJvaWQub3MuQXN5bmNSZXN1bHQ7CiBpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwpAQCAtNjUsNyArNjYsNyBAQAogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5QaG9uZVByb3h5OwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5QaG9uZVN1YkluZm87CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlRlbGVwaG9ueVByb3BlcnRpZXM7Ci0vL2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuVVVTSW5mbzsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuVVVTSW5mbzsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKQEAgLTEwMiwxMyArMTAzLDExIEBACiAKICAgICBwdWJsaWMgYWJzdHJhY3QgQ2FsbCBnZXRSaW5naW5nQ2FsbCgpOwogCi0gICAgLyoKICAgICBwdWJsaWMgQ29ubmVjdGlvbiBkaWFsKFN0cmluZyBkaWFsU3RyaW5nLCBVVVNJbmZvIHV1c0luZm8pCiAgICAgICAgICAgICB0aHJvd3MgQ2FsbFN0YXRlRXhjZXB0aW9uIHsKICAgICAgICAgLy8gaWdub3JlIFVVU0luZm8KICAgICAgICAgcmV0dXJuIGRpYWwoZGlhbFN0cmluZyk7CiAgICAgfQotICAgICovCiAKICAgICB2b2lkIG1pZ3JhdGVGcm9tKFNpcFBob25lQmFzZSBmcm9tKSB7CiAgICAgICAgIG1pZ3JhdGUobVJpbmdiYWNrUmVnaXN0cmFudHMsIGZyb20ubVJpbmdiYWNrUmVnaXN0cmFudHMpOwpAQCAtNTM0LDYgKzUzMywxOCBAQAogICAgICAgICBMb2cuZShMT0dfVEFHLCAiRXJyb3IhIFRoaXMgZnVuY3Rpb25hbGl0eSBpcyBub3QgaW1wbGVtZW50ZWQgZm9yIFNJUC4iKTsKICAgICB9CiAKKyAgICAvL0BPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIG5lZWRzT3RhU2VydmljZVByb3Zpc2lvbmluZygpIHsKKyAgICAgICAgLy8gRklYTUU6IHdoYXQncyB0aGlzIGZvciBTSVA/CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvL0BPdmVycmlkZQorICAgIHB1YmxpYyBOZXR3b3JrUHJvcGVydGllcyBnZXROZXR3b3JrUHJvcGVydGllcyhTdHJpbmcgYXBuVHlwZSkgeworICAgICAgICAvLyBGSVhNRTogd2hhdCdzIHRoaXMgZm9yIFNJUD8KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCiAgICAgdm9pZCB1cGRhdGVQaG9uZVN0YXRlKCkgewogICAgICAgICBTdGF0ZSBvbGRTdGF0ZSA9IHN0YXRlOwogCmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvdGVzdC9TaW11bGF0ZWRDb21tYW5kcy5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L3Rlc3QvU2ltdWxhdGVkQ29tbWFuZHMuamF2YQppbmRleCA5YzcyZTVhLi5mZGNmNzhkIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvdGVzdC9TaW11bGF0ZWRDb21tYW5kcy5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS90ZXN0L1NpbXVsYXRlZENvbW1hbmRzLmphdmEKQEAgLTE2LDcgKzE2LDYgQEAKIAogcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkudGVzdDsKIAotCiBpbXBvcnQgYW5kcm9pZC5vcy5Bc3luY1Jlc3VsdDsKIGltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXJUaHJlYWQ7CiBpbXBvcnQgYW5kcm9pZC5vcy5Mb29wZXI7CkBAIC0yNyw3ICsyNiw2IEBACiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkNvbW1hbmRFeGNlcHRpb247CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkNvbW1hbmRzSW50ZXJmYWNlOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5EYXRhQ2FsbFN0YXRlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5JY2NDYXJkOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5QaG9uZTsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuVVVTSW5mbzsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLkNhbGxGYWlsQ2F1c2U7CkBAIC0zMzUsNyArMzMzLDcgQEAKIAogICAgIC8qKgogICAgICAqIChBc3luY1Jlc3VsdClyZXNwb25zZS5vYmopLnJlc3VsdCB3aWxsIGJlIGFuIEludGVnZXIgcmVwcmVzZW50aW5nCi0gICAgICogdGhlIHN1bSBvZiBlbmFibGVkIHNlcml2aWNlIGNsYXNzZXMgKHN1bSBvZiBTRVJWSUNFX0NMQVNTXyopCisgICAgICogdGhlIHN1bSBvZiBlbmFibGVkIHNlcnZpY2UgY2xhc3NlcyAoc3VtIG9mIFNFUlZJQ0VfQ0xBU1NfKikKICAgICAgKgogICAgICAqIEBwYXJhbSBmYWNpbGl0eSBvbmUgb2YgQ0JfRkFDSUxUWV8qCiAgICAgICogQHBhcmFtIHBpbiBwYXNzd29yZCBvciAiIiBpZiBub3QgcmVxdWlyZWQKQEAgLTQ0MSw3ICs0MzksNyBAQAogICAgICAqICByZXR1cm5lZCBtZXNzYWdlCiAgICAgICogIHJldE1zZy5vYmogPSBBc3luY1Jlc3VsdCBhcgogICAgICAqICBhci5leGNlcHRpb24gY2FycmllcyBleGNlcHRpb24gb24gZmFpbHVyZQotICAgICAqICBhci51c2VyT2JqZWN0IGNvbnRhaW5zIHRoZSBvcmlnbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKKyAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ2luYWwgdmFsdWUgb2YgcmVzdWx0Lm9iagogICAgICAqICBhci5yZXN1bHQgY29udGFpbnMgYSBMaXN0IG9mIERyaXZlckNhbGwKICAgICAgKiAgICAgIFRoZSBhci5yZXN1bHQgTGlzdCBpcyBzb3J0ZWQgYnkgRHJpdmVyQ2FsbC5pbmRleAogICAgICAqLwpAQCAtNDY4LDcgKzQ2Niw3IEBACiAgICAgICogIHJldHVybmVkIG1lc3NhZ2UKICAgICAgKiAgcmV0TXNnLm9iaiA9IEFzeW5jUmVzdWx0IGFyCiAgICAgICogIGFyLmV4Y2VwdGlvbiBjYXJyaWVzIGV4Y2VwdGlvbiBvbiBmYWlsdXJlCi0gICAgICogIGFyLnVzZXJPYmplY3QgY29udGFpbnMgdGhlIG9yaWduYWwgdmFsdWUgb2YgcmVzdWx0Lm9iagorICAgICAqICBhci51c2VyT2JqZWN0IGNvbnRhaW5zIHRoZSBvcmlnaW5hbCB2YWx1ZSBvZiByZXN1bHQub2JqCiAgICAgICogIGFyLnJlc3VsdCBjb250YWlucyBhIExpc3Qgb2YgRGF0YUNhbGxTdGF0ZQogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGdldERhdGFDYWxsTGlzdChNZXNzYWdlIHJlc3VsdCkgewpAQCAtNDc5LDcgKzQ3Nyw3IEBACiAgICAgICogIHJldHVybmVkIG1lc3NhZ2UKICAgICAgKiAgcmV0TXNnLm9iaiA9IEFzeW5jUmVzdWx0IGFyCiAgICAgICogIGFyLmV4Y2VwdGlvbiBjYXJyaWVzIGV4Y2VwdGlvbiBvbiBmYWlsdXJlCi0gICAgICogIGFyLnVzZXJPYmplY3QgY29udGFpbnMgdGhlIG9yaWduYWwgdmFsdWUgb2YgcmVzdWx0Lm9iagorICAgICAqICBhci51c2VyT2JqZWN0IGNvbnRhaW5zIHRoZSBvcmlnaW5hbCB2YWx1ZSBvZiByZXN1bHQub2JqCiAgICAgICogIGFyLnJlc3VsdCBpcyBudWxsIG9uIHN1Y2Nlc3MgYW5kIGZhaWx1cmUKICAgICAgKgogICAgICAqIENMSVJfREVGQVVMVCAgICAgPT0gb24gInVzZSBzdWJzY3JpcHRpb24gZGVmYXVsdCB2YWx1ZSIKQEAgLTQ5Niw3ICs0OTQsNyBAQAogICAgICAqICByZXR1cm5lZCBtZXNzYWdlCiAgICAgICogIHJldE1zZy5vYmogPSBBc3luY1Jlc3VsdCBhcgogICAgICAqICBhci5leGNlcHRpb24gY2FycmllcyBleGNlcHRpb24gb24gZmFpbHVyZQotICAgICAqICBhci51c2VyT2JqZWN0IGNvbnRhaW5zIHRoZSBvcmlnbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKKyAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ2luYWwgdmFsdWUgb2YgcmVzdWx0Lm9iagogICAgICAqICBhci5yZXN1bHQgaXMgbnVsbCBvbiBzdWNjZXNzIGFuZCBmYWlsdXJlCiAgICAgICoKICAgICAgKiBDTElSX0RFRkFVTFQgICAgID09IG9uICJ1c2Ugc3Vic2NyaXB0aW9uIGRlZmF1bHQgdmFsdWUiCkBAIC01MTMsNyArNTExLDcgQEAKICAgICAgKiAgcmV0dXJuZWQgbWVzc2FnZQogICAgICAqICByZXRNc2cub2JqID0gQXN5bmNSZXN1bHQgYXIKICAgICAgKiAgYXIuZXhjZXB0aW9uIGNhcnJpZXMgZXhjZXB0aW9uIG9uIGZhaWx1cmUKLSAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ25hbCB2YWx1ZSBvZiByZXN1bHQub2JqCisgICAgICogIGFyLnVzZXJPYmplY3QgY29udGFpbnMgdGhlIG9yaWdpbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKICAgICAgKiAgYXIucmVzdWx0IGlzIFN0cmluZyBjb250YWluaW5nIElNU0kgb24gc3VjY2VzcwogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGdldElNU0koTWVzc2FnZSByZXN1bHQpIHsKQEAgLTUyNCw3ICs1MjIsNyBAQAogICAgICAqICByZXR1cm5lZCBtZXNzYWdlCiAgICAgICogIHJldE1zZy5vYmogPSBBc3luY1Jlc3VsdCBhcgogICAgICAqICBhci5leGNlcHRpb24gY2FycmllcyBleGNlcHRpb24gb24gZmFpbHVyZQotICAgICAqICBhci51c2VyT2JqZWN0IGNvbnRhaW5zIHRoZSBvcmlnbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKKyAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ2luYWwgdmFsdWUgb2YgcmVzdWx0Lm9iagogICAgICAqICBhci5yZXN1bHQgaXMgU3RyaW5nIGNvbnRhaW5pbmcgSU1FSSBvbiBzdWNjZXNzCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgZ2V0SU1FSShNZXNzYWdlIHJlc3VsdCkgewpAQCAtNTM1LDcgKzUzMyw3IEBACiAgICAgICogIHJldHVybmVkIG1lc3NhZ2UKICAgICAgKiAgcmV0TXNnLm9iaiA9IEFzeW5jUmVzdWx0IGFyCiAgICAgICogIGFyLmV4Y2VwdGlvbiBjYXJyaWVzIGV4Y2VwdGlvbiBvbiBmYWlsdXJlCi0gICAgICogIGFyLnVzZXJPYmplY3QgY29udGFpbnMgdGhlIG9yaWduYWwgdmFsdWUgb2YgcmVzdWx0Lm9iagorICAgICAqICBhci51c2VyT2JqZWN0IGNvbnRhaW5zIHRoZSBvcmlnaW5hbCB2YWx1ZSBvZiByZXN1bHQub2JqCiAgICAgICogIGFyLnJlc3VsdCBpcyBTdHJpbmcgY29udGFpbmluZyBJTUVJU1Ygb24gc3VjY2VzcwogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGdldElNRUlTVihNZXNzYWdlIHJlc3VsdCkgewpAQCAtNTQ3LDcgKzU0NSw3IEBACiAgICAgICogIHJldHVybmVkIG1lc3NhZ2UKICAgICAgKiAgcmV0TXNnLm9iaiA9IEFzeW5jUmVzdWx0IGFyCiAgICAgICogIGFyLmV4Y2VwdGlvbiBjYXJyaWVzIGV4Y2VwdGlvbiBvbiBmYWlsdXJlCi0gICAgICogIGFyLnVzZXJPYmplY3QgY29udGFpbnMgdGhlIG9yaWduYWwgdmFsdWUgb2YgcmVzdWx0Lm9iagorICAgICAqICBhci51c2VyT2JqZWN0IGNvbnRhaW5zIHRoZSBvcmlnaW5hbCB2YWx1ZSBvZiByZXN1bHQub2JqCiAgICAgICogIGFyLnJlc3VsdCBpcyBudWxsIG9uIHN1Y2Nlc3MgYW5kIGZhaWx1cmUKICAgICAgKgogICAgICAqICAzR1BQIDIyLjAzMCA2LjUuNQpAQCAtNTcyLDcgKzU3MCw3IEBACiAgICAgICogICJSZWxlYXNlcyBhbGwgaGVsZCBjYWxscyBvciBzZXRzIFVzZXIgRGV0ZXJtaW5lZCBVc2VyIEJ1c3kgKFVEVUIpCiAgICAgICogICBmb3IgYSB3YWl0aW5nIGNhbGwuIgogICAgICAqICBhci5leGNlcHRpb24gY2FycmllcyBleGNlcHRpb24gb24gZmFpbHVyZQotICAgICAqICBhci51c2VyT2JqZWN0IGNvbnRhaW5zIHRoZSBvcmlnbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKKyAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ2luYWwgdmFsdWUgb2YgcmVzdWx0Lm9iagogICAgICAqICBhci5yZXN1bHQgaXMgbnVsbCBvbiBzdWNjZXNzIGFuZCBmYWlsdXJlCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgaGFuZ3VwV2FpdGluZ09yQmFja2dyb3VuZCAoTWVzc2FnZSByZXN1bHQpIHsKQEAgLTU5Myw3ICs1OTEsNyBAQAogICAgICAqICB0aGUgb3RoZXIgKGhlbGQgb3Igd2FpdGluZykgY2FsbC4iCiAgICAgICoKICAgICAgKiAgYXIuZXhjZXB0aW9uIGNhcnJpZXMgZXhjZXB0aW9uIG9uIGZhaWx1cmUKLSAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ25hbCB2YWx1ZSBvZiByZXN1bHQub2JqCisgICAgICogIGFyLnVzZXJPYmplY3QgY29udGFpbnMgdGhlIG9yaWdpbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKICAgICAgKiAgYXIucmVzdWx0IGlzIG51bGwgb24gc3VjY2VzcyBhbmQgZmFpbHVyZQogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGhhbmd1cEZvcmVncm91bmRSZXN1bWVCYWNrZ3JvdW5kIChNZXNzYWdlIHJlc3VsdCkgewpAQCAtNjE0LDcgKzYxMiw3IEBACiAgICAgICogIHRoZSBvdGhlciAoaGVsZCBvciB3YWl0aW5nKSBjYWxsLiIKICAgICAgKgogICAgICAqICBhci5leGNlcHRpb24gY2FycmllcyBleGNlcHRpb24gb24gZmFpbHVyZQotICAgICAqICBhci51c2VyT2JqZWN0IGNvbnRhaW5zIHRoZSBvcmlnbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKKyAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ2luYWwgdmFsdWUgb2YgcmVzdWx0Lm9iagogICAgICAqICBhci5yZXN1bHQgaXMgbnVsbCBvbiBzdWNjZXNzIGFuZCBmYWlsdXJlCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc3dpdGNoV2FpdGluZ09ySG9sZGluZ0FuZEFjdGl2ZSAoTWVzc2FnZSByZXN1bHQpIHsKQEAgLTYzNCw3ICs2MzIsNyBAQAogICAgICAqICJBZGRzIGEgaGVsZCBjYWxsIHRvIHRoZSBjb252ZXJzYXRpb24iCiAgICAgICoKICAgICAgKiAgYXIuZXhjZXB0aW9uIGNhcnJpZXMgZXhjZXB0aW9uIG9uIGZhaWx1cmUKLSAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ25hbCB2YWx1ZSBvZiByZXN1bHQub2JqCisgICAgICogIGFyLnVzZXJPYmplY3QgY29udGFpbnMgdGhlIG9yaWdpbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKICAgICAgKiAgYXIucmVzdWx0IGlzIG51bGwgb24gc3VjY2VzcyBhbmQgZmFpbHVyZQogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGNvbmZlcmVuY2UgKE1lc3NhZ2UgcmVzdWx0KSB7CkBAIC02NTQsNyArNjUyLDcgQEAKICAgICAgKiAiQ29ubmVjdHMgdGhlIHR3byBjYWxscyBhbmQgZGlzY29ubmVjdHMgdGhlIHN1YnNjcmliZXIgZnJvbSBib3RoIGNhbGxzIgogICAgICAqCiAgICAgICogIGFyLmV4Y2VwdGlvbiBjYXJyaWVzIGV4Y2VwdGlvbiBvbiBmYWlsdXJlCi0gICAgICogIGFyLnVzZXJPYmplY3QgY29udGFpbnMgdGhlIG9yaWduYWwgdmFsdWUgb2YgcmVzdWx0Lm9iagorICAgICAqICBhci51c2VyT2JqZWN0IGNvbnRhaW5zIHRoZSBvcmlnaW5hbCB2YWx1ZSBvZiByZXN1bHQub2JqCiAgICAgICogIGFyLnJlc3VsdCBpcyBudWxsIG9uIHN1Y2Nlc3MgYW5kIGZhaWx1cmUKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBleHBsaWNpdENhbGxUcmFuc2ZlciAoTWVzc2FnZSByZXN1bHQpIHsKQEAgLTY5MCw3ICs2ODgsNyBAQAogICAgIC8qKgogICAgICAqCiAgICAgICogIGFyLmV4Y2VwdGlvbiBjYXJyaWVzIGV4Y2VwdGlvbiBvbiBmYWlsdXJlCi0gICAgICogIGFyLnVzZXJPYmplY3QgY29udGFpbnMgdGhlIG9yaWduYWwgdmFsdWUgb2YgcmVzdWx0Lm9iagorICAgICAqICBhci51c2VyT2JqZWN0IGNvbnRhaW5zIHRoZSBvcmlnaW5hbCB2YWx1ZSBvZiByZXN1bHQub2JqCiAgICAgICogIGFyLnJlc3VsdCBpcyBudWxsIG9uIHN1Y2Nlc3MgYW5kIGZhaWx1cmUKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBhY2NlcHRDYWxsIChNZXNzYWdlIHJlc3VsdCkgewpAQCAtNzA4LDcgKzcwNiw3IEBACiAgICAgLyoqCiAgICAgICogIGFsc28ga25vd24gYXMgVURVQgogICAgICAqICBhci5leGNlcHRpb24gY2FycmllcyBleGNlcHRpb24gb24gZmFpbHVyZQotICAgICAqICBhci51c2VyT2JqZWN0IGNvbnRhaW5zIHRoZSBvcmlnbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKKyAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ2luYWwgdmFsdWUgb2YgcmVzdWx0Lm9iagogICAgICAqICBhci5yZXN1bHQgaXMgbnVsbCBvbiBzdWNjZXNzIGFuZCBmYWlsdXJlCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgcmVqZWN0Q2FsbCAoTWVzc2FnZSByZXN1bHQpIHsKQEAgLTc4NSw3ICs3ODMsNyBAQAogICAgICAqCiAgICAgICogQHBhcmFtIHJlc3VsdCBpcyBjYWxsYmFjayBtZXNzYWdlCiAgICAgICogICAgICAgICgoQXN5bmNSZXN1bHQpcmVzcG9uc2Uub2JqKS5yZXN1bHQgIGlzIGFuIGludFtdIHdpdGggZXZlcnkKLSAgICAgKiAgICAgICAgZWxlbWVudCByZXByZXNlbnRpbmcgb25lIGF2aWFsYWJsZSBCTV8qX0JBTkQKKyAgICAgKiAgICAgICAgZWxlbWVudCByZXByZXNlbnRpbmcgb25lIGF2YWlsYWJsZSBCTV8qX0JBTkQKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBxdWVyeUF2YWlsYWJsZUJhbmRNb2RlIChNZXNzYWdlIHJlc3VsdCkgewogICAgICAgICBpbnQgcmV0W10gPSBuZXcgaW50IFs0XTsKQEAgLTg5NCw3ICs4OTIsNyBAQAogCiAgICAgLyoqCiAgICAgICogIGFyLmV4Y2VwdGlvbiBjYXJyaWVzIGV4Y2VwdGlvbiBvbiBmYWlsdXJlCi0gICAgICogIGFyLnVzZXJPYmplY3QgY29udGFpbnMgdGhlIG9yaWduYWwgdmFsdWUgb2YgcmVzdWx0Lm9iagorICAgICAqICBhci51c2VyT2JqZWN0IGNvbnRhaW5zIHRoZSBvcmlnaW5hbCB2YWx1ZSBvZiByZXN1bHQub2JqCiAgICAgICogIGFyLnJlc3VsdCBpcyBudWxsIG9uIHN1Y2Nlc3MgYW5kIGZhaWx1cmUKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZW5kRHRtZihjaGFyIGMsIE1lc3NhZ2UgcmVzdWx0KSB7CkBAIC05MDMsNyArOTAxLDcgQEAKIAogICAgIC8qKgogICAgICAqICBhci5leGNlcHRpb24gY2FycmllcyBleGNlcHRpb24gb24gZmFpbHVyZQotICAgICAqICBhci51c2VyT2JqZWN0IGNvbnRhaW5zIHRoZSBvcmlnbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKKyAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ2luYWwgdmFsdWUgb2YgcmVzdWx0Lm9iagogICAgICAqICBhci5yZXN1bHQgaXMgbnVsbCBvbiBzdWNjZXNzIGFuZCBmYWlsdXJlCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc3RhcnREdG1mKGNoYXIgYywgTWVzc2FnZSByZXN1bHQpIHsKQEAgLTkxMiw3ICs5MTAsNyBAQAogCiAgICAgLyoqCiAgICAgICogIGFyLmV4Y2VwdGlvbiBjYXJyaWVzIGV4Y2VwdGlvbiBvbiBmYWlsdXJlCi0gICAgICogIGFyLnVzZXJPYmplY3QgY29udGFpbnMgdGhlIG9yaWduYWwgdmFsdWUgb2YgcmVzdWx0Lm9iagorICAgICAqICBhci51c2VyT2JqZWN0IGNvbnRhaW5zIHRoZSBvcmlnaW5hbCB2YWx1ZSBvZiByZXN1bHQub2JqCiAgICAgICogIGFyLnJlc3VsdCBpcyBudWxsIG9uIHN1Y2Nlc3MgYW5kIGZhaWx1cmUKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzdG9wRHRtZihNZXNzYWdlIHJlc3VsdCkgewpAQCAtOTIxLDcgKzkxOSw3IEBACiAKICAgICAvKioKICAgICAgKiAgYXIuZXhjZXB0aW9uIGNhcnJpZXMgZXhjZXB0aW9uIG9uIGZhaWx1cmUKLSAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ25hbCB2YWx1ZSBvZiByZXN1bHQub2JqCisgICAgICogIGFyLnVzZXJPYmplY3QgY29udGFpbnMgdGhlIG9yaWdpbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKICAgICAgKiAgYXIucmVzdWx0IGlzIG51bGwgb24gc3VjY2VzcyBhbmQgZmFpbHVyZQogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNlbmRCdXJzdER0bWYoU3RyaW5nIGR0bWZTdHJpbmcsIGludCBvbiwgaW50IG9mZiwgTWVzc2FnZSByZXN1bHQpIHsKQEAgLTk1Niw2ICs5NTQsNyBAQAogICAgICAgICB1bmltcGxlbWVudGVkKHJlc3BvbnNlKTsKICAgICB9CiAKKyAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyB2b2lkIHNldHVwRGVmYXVsdFBEUChTdHJpbmcgYXBuLCBTdHJpbmcgdXNlciwgU3RyaW5nIHBhc3N3b3JkLCBNZXNzYWdlIHJlc3VsdCkgewogICAgICAgICB1bmltcGxlbWVudGVkKHJlc3VsdCk7CiAgICAgfQpAQCAtOTY3LDkgKzk2Niw3IEBACiAKICAgICBwdWJsaWMgdm9pZCBkZWFjdGl2YXRlRGF0YUNhbGwoaW50IGNpZCwgTWVzc2FnZSByZXN1bHQpIHt1bmltcGxlbWVudGVkKHJlc3VsdCk7fQogCi0gICAgLyoqCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KKyAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyB2b2lkIGRlYWN0aXZhdGVEZWZhdWx0UERQKGludCBjaWQsIE1lc3NhZ2UgcmVzdWx0KSB7dW5pbXBsZW1lbnRlZChyZXN1bHQpO30KIAogICAgIHB1YmxpYyB2b2lkIHNldFByZWZlcnJlZE5ldHdvcmtUeXBlKGludCBuZXR3b3JrVHlwZSAsIE1lc3NhZ2UgcmVzdWx0KSB7CkBAIC0xMDQ2LDcgKzEwNDMsNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIHBhcmFtZXRlcnMgZXF1aXZpbGllbnQgdG8gMjcuMDA3IEFUK0NSU00gY29tbWFuZAorICAgICAqIHBhcmFtZXRlcnMgZXF1aXZhbGVudCB0byAyNy4wMDcgQVQrQ1JTTSBjb21tYW5kCiAgICAgICogcmVzcG9uc2Uub2JqIHdpbGwgYmUgYW4gQXN5bmNSZXN1bHQKICAgICAgKiByZXNwb25zZS5vYmoudXNlck9iaiB3aWxsIGJlIGEgU2ltSW9SZXN1bHQgb24gc3VjY2VzcwogICAgICAqLwpkaWZmIC0tZ2l0IGEvdGVsZXBob255L21vY2tyaWwvQW5kcm9pZC5tayBiL3RlbGVwaG9ueS9tb2NrcmlsL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTVhZTg0YwotLS0gL2Rldi9udWxsCisrKyBiL3RlbGVwaG9ueS9tb2NrcmlsL0FuZHJvaWQubWsKQEAgLTAsMCArMSwzMCBAQAorIworIyBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIworCitMT0NBTF9QQVRIOj0kKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQorCitMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBjb3JlIGZyYW1ld29yaworCitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gbGlicmlscHJvdG8tamF2YQorCitMT0NBTF9NT0RVTEUgOj0gbW9ja3JpbGNvbnRyb2xsZXIKKworaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19KQVZBX0xJQlJBUlkpCmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvbW9ja3JpbC9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L21vY2tyaWwvTW9ja1JpbENvbnRyb2xsZXIuamF2YSBiL3RlbGVwaG9ueS9tb2NrcmlsL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvbW9ja3JpbC9Nb2NrUmlsQ29udHJvbGxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1MTM5YmQKLS0tIC9kZXYvbnVsbAorKysgYi90ZWxlcGhvbnkvbW9ja3JpbC9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L21vY2tyaWwvTW9ja1JpbENvbnRyb2xsZXIuamF2YQpAQCAtMCwwICsxLDEzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5tb2NrcmlsOworCitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLmNvbW11bmljYXRpb24uTXNnSGVhZGVyOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLmNvbW11bmljYXRpb24uTXNnOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5SaWxDaGFubmVsOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5yaWxfcHJvdG8uUmlsQ3RybENtZHM7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LnJpbF9wcm90by5SaWxDbWRzOworaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYubWljcm8uTWVzc2FnZU1pY3JvOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworLyoqCisgKiBDb250YWluIGEgbGlzdCBvZiBjb21tYW5kcyB0byBjb250cm9sIE1vY2sgUklMLiBCZWZvcmUgdXNpbmcgdGhlc2UgY29tbWFuZHMgdGhlIGRldmljZXMKKyAqIG5lZWRzIHRvIGJlIHNldCB3aXRoIE1vY2sgUklMLiBSZWZlciB0byBoYXJkd2FyZS9yaWwvbW9ja3JpbC9SRUFETUUudHh0IGZvciBkZXRhaWxzLgorICoKKyAqLworcHVibGljIGNsYXNzIE1vY2tSaWxDb250cm9sbGVyIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk1vY2tSSUxDb250cm9sbGVyIjsKKyAgICBwcml2YXRlIFJpbENoYW5uZWwgbVJpbENoYW5uZWwgPSBudWxsOworICAgIHByaXZhdGUgTXNnIG1NZXNzYWdlID0gbnVsbDsKKworICAgIHB1YmxpYyBNb2NrUmlsQ29udHJvbGxlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIG1SaWxDaGFubmVsID0gUmlsQ2hhbm5lbC5tYWtlUmlsQ2hhbm5lbCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENsb3NlIHRoZSBjaGFubmVsIGFmdGVyIHRoZSBjb21tdW5pY2F0aW9uIGlzIGRvbmUuCisgICAgICogVGhpcyBtZXRob2QgaGFzIHRvIGJlIGNhbGxlZCBhZnRlciB0aGUgdGVzdCBpcyBmaW5pc2hlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjbG9zZUNoYW5uZWwoKSB7CisgICAgICAgIG1SaWxDaGFubmVsLmNsb3NlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VuZCBjb21tYW5kcyBhbmQgcmV0dXJuIHRydWUgb24gc3VjY2VzcworICAgICAqIEBwYXJhbSBjbWQgZm9yIE1zZ0hlYWRlcgorICAgICAqIEBwYXJhbSB0b2tlbiBmb3IgTXNnSGVhZGVyCisgICAgICogQHBhcmFtIHN0YXR1cyBmb3IgTXNnSGVhZGVyCisgICAgICogQHBhcmFtIHBiRGF0YSBmb3IgTXNnIGRhdGEKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgY29tbWFuZCBpcyBzZW50IHN1Y2Nlc3NmdWxseSwgZmFsc2UgaWYgaXQgZmFpbHMKKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gc2VuZEN0cmxDb21tYW5kKGludCBjbWQsIGxvbmcgdG9rZW4sIGludCBzdGF0dXMsIE1lc3NhZ2VNaWNybyBwYkRhdGEpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIE1zZy5zZW5kKG1SaWxDaGFubmVsLCBjbWQsIHRva2VuLCBzdGF0dXMsIHBiRGF0YSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy52KFRBRywgInNlbmQgY29tbWFuZCA6ICVkIGZhaWxlZDogIiArIGUuZ2V0U3RhY2tUcmFjZSgpKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgY29udHJvbCByZXNwb25zZQorICAgICAqIEByZXR1cm4gTXNnIGlmIHJlc3BvbnNlIGlzIHJlY2VpdmVkLCBlbHNlIHJldHVybiBudWxsLgorICAgICAqLworICAgIHByaXZhdGUgTXNnIGdldEN0cmxSZXNwb25zZSgpIHsKKyAgICAgICAgTXNnIHJlc3BvbnNlID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlc3BvbnNlID0gTXNnLnJlY3YobVJpbENoYW5uZWwpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cudihUQUcsICJyZWNlaXZlIHJlc3BvbnNlIGZvciBnZXRSYWRpb1N0YXRlKCkgZXJyb3I6ICIgKyBlLmdldFN0YWNrVHJhY2UoKSk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzcG9uc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgcmFkaW8gc3RhdGUgaWYgaXQgaXMgdmFsaWQsIG90aGVyd2lzZSByZXR1cm4gLTEKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFJhZGlvU3RhdGUoKSB7CisgICAgICAgIGlmICghc2VuZEN0cmxDb21tYW5kKFJpbEN0cmxDbWRzLkNUUkxfQ01EX0dFVF9SQURJT19TVEFURSwgMCwgMCwgbnVsbCkpIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBNc2cgcmVzcG9uc2UgPSBnZXRDdHJsUmVzcG9uc2UoKTsKKyAgICAgICAgaWYgKHJlc3BvbnNlID09IG51bGwpIHsKKyAgICAgICAgICAgIExvZy52KFRBRywgImZhaWxlZCB0byBnZXQgcmVzcG9uc2UiKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICByZXNwb25zZS5wcmludEhlYWRlcihUQUcpOworICAgICAgICBSaWxDdHJsQ21kcy5DdHJsUnNwUmFkaW9TdGF0ZSByZXNwID0KKyAgICAgICAgICAgIHJlc3BvbnNlLmdldERhdGFBcyhSaWxDdHJsQ21kcy5DdHJsUnNwUmFkaW9TdGF0ZS5jbGFzcyk7CisgICAgICAgIGludCBzdGF0ZSA9IHJlc3AuZ2V0U3RhdGUoKTsKKyAgICAgICAgaWYgKChzdGF0ZSA+PSBSaWxDbWRzLlJBRElPU1RBVEVfT0ZGKSAmJiAoc3RhdGUgPD0gUmlsQ21kcy5SQURJT1NUQVRFX05WX1JFQURZKSkKKyAgICAgICAgICAgIHJldHVybiBzdGF0ZTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgcmFkaW8gc3RhdGUgb2YgbW9jayByaWwgdG8gdGhlIGdpdmVuIHN0YXRlCisgICAgICogQHBhcmFtIHN0YXRlIGZvciBnaXZlbiByYWRpbyBzdGF0ZQorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgc3RhdGUgaXMgc2V0IHN1Y2Nlc3NmdWwsIGZhbHNlIGlmIGl0IGZhaWxzCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gc2V0UmFkaW9TdGF0ZShpbnQgc3RhdGUpIHsKKyAgICAgICAgUmlsQ3RybENtZHMuQ3RybFJlcVJhZGlvU3RhdGUgcmVxID0gbmV3IFJpbEN0cmxDbWRzLkN0cmxSZXFSYWRpb1N0YXRlKCk7CisgICAgICAgIGlmIChzdGF0ZSA8IDAgfHwgc3RhdGUgPiBSaWxDbWRzLlJBRElPU1RBVEVfTlZfUkVBRFkpIHsKKyAgICAgICAgICAgIExvZy52KFRBRywgInRoZSBnaXZlIHJhZGlvIHN0YXRlIGlzIG5vdCB2YWxpZC4iKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXEuc2V0U3RhdGUoc3RhdGUpOworICAgICAgICBpZiAoIXNlbmRDdHJsQ29tbWFuZChSaWxDdHJsQ21kcy5DVFJMX0NNRF9TRVRfUkFESU9fU1RBVEUsIDAsIDAsIHJlcSkpIHsKKyAgICAgICAgICAgIExvZy52KFRBRywgInNlbmQgc2V0IHJhZGlvIHN0YXRlIHJlcXVlc3QgZmFpbGVkLiIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIE1zZyByZXNwb25zZSA9IGdldEN0cmxSZXNwb25zZSgpOworICAgICAgICBpZiAocmVzcG9uc2UgPT0gbnVsbCkgeworICAgICAgICAgICAgTG9nLnYoVEFHLCAiZmFpbGVkIHRvIGdldCByZXNwb25zZSBmb3Igc2V0UmFkaW9TdGF0ZSIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJlc3BvbnNlLnByaW50SGVhZGVyKFRBRyk7CisgICAgICAgIFJpbEN0cmxDbWRzLkN0cmxSc3BSYWRpb1N0YXRlIHJlc3AgPQorICAgICAgICAgICAgcmVzcG9uc2UuZ2V0RGF0YUFzKFJpbEN0cmxDbWRzLkN0cmxSc3BSYWRpb1N0YXRlLmNsYXNzKTsKKyAgICAgICAgaW50IGN1cnN0YXRlID0gcmVzcC5nZXRTdGF0ZSgpOworICAgICAgICByZXR1cm4gY3Vyc3RhdGUgPT0gc3RhdGU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueW1vY2tyaWx0ZXN0cy9BbmRyb2lkLm1rIGIvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueW1vY2tyaWx0ZXN0cy9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3MzFkMGQKLS0tIC9kZXYvbnVsbAorKysgYi90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255bW9ja3JpbHRlc3RzL0FuZHJvaWQubWsKQEAgLTAsMCArMSwxNCBAQAorTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKKworTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtc3ViZGlyLWphdmEtZmlsZXMpCisKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBtb2NrcmlsY29udHJvbGxlcgorCitMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLnRlc3QucnVubmVyCisKK0xPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBUZWxlcGhvbnlNb2NrUmlsVGVzdHMKKworaW5jbHVkZSAkKEJVSUxEX1BBQ0tBR0UpCmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255bW9ja3JpbHRlc3RzL0FuZHJvaWRNYW5pZmVzdC54bWwgYi90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255bW9ja3JpbHRlc3RzL0FuZHJvaWRNYW5pZmVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjNmNDRhMgotLS0gL2Rldi9udWxsCisrKyBiL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnltb2NrcmlsdGVzdHMvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMCwwICsxLDQwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorCis8IS0tIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgcGFja2FnZT0iY29tLmFuZHJvaWQudGVsZXBob255bW9ja3JpbHRlc3RzIj4KKworICAgIDxhcHBsaWNhdGlvbj4KKyAgICAgICAgPHVzZXMtbGlicmFyeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudGVzdC5ydW5uZXIiIC8+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOmxhYmVsPSJUZWxlcGhvbnlNb2NrUmlsVGVzdCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOm5hbWU9IlRlbGVwaG9ueU1vY2tSaWxUZXN0Ij4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorICAgIDwvYXBwbGljYXRpb24+CisKKyAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iLlRlbGVwaG9ueU1vY2tUZXN0UnVubmVyIgorICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImNvbS5hbmRyb2lkLnRlbGVwaG9ueW1vY2tyaWx0ZXN0cyIKKyAgICAgICAgYW5kcm9pZDpsYWJlbD0iVGVzdCBydW5uZXIgZm9yIFRlbGVwaG9ueSBUZXN0cyBVc2luZyBNb2NrIFJJTCIKKyAgICAvPgorCisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5SRUFEX1BIT05FX1NUQVRFIiAvPgorICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uSU5URVJORVQiIC8+CisKKzwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255bW9ja3JpbHRlc3RzL3NyYy9jb20vYW5kcm9pZC90ZWxlcGhvbnltb2NrcmlsdGVzdHMvVGVsZXBob255TW9ja1Rlc3RSdW5uZXIuamF2YSBiL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnltb2NrcmlsdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3RlbGVwaG9ueW1vY2tyaWx0ZXN0cy9UZWxlcGhvbnlNb2NrVGVzdFJ1bm5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4ZWU3MzgKLS0tIC9kZXYvbnVsbAorKysgYi90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255bW9ja3JpbHRlc3RzL3NyYy9jb20vYW5kcm9pZC90ZWxlcGhvbnltb2NrcmlsdGVzdHMvVGVsZXBob255TW9ja1Rlc3RSdW5uZXIuamF2YQpAQCAtMCwwICsxLDY0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQudGVsZXBob255bW9ja3JpbHRlc3RzOworCitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RSdW5uZXI7CitpbXBvcnQgYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RTdWl0ZTsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkubW9ja3JpbC5Nb2NrUmlsQ29udHJvbGxlcjsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgY29tLmFuZHJvaWQudGVsZXBob255bW9ja3JpbHRlc3RzLmZ1bmN0aW9uYWwuU2ltcGxlVGVzdFVzaW5nTW9ja1JpbDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKKy8qKgorICogVGVzdCBydW5uZXIgZm9yIHRlbGVwaG9ueSB0ZXN0cyB0aGF0IHVzaW5nIE1vY2sgUklMCisgKgorICovCitwdWJsaWMgY2xhc3MgVGVsZXBob255TW9ja1Rlc3RSdW5uZXIgZXh0ZW5kcyBJbnN0cnVtZW50YXRpb25UZXN0UnVubmVyIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHPSJUZWxlcGhvbnlNb2NrVGVzdFJ1bm5lciI7CisgICAgcHVibGljIE1vY2tSaWxDb250cm9sbGVyIG1Db250cm9sbGVyOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFRlc3RTdWl0ZSBnZXRBbGxUZXN0cygpIHsKKyAgICAgICAgVGVzdFN1aXRlIHN1aXRlID0gbmV3IEluc3RydW1lbnRhdGlvblRlc3RTdWl0ZSh0aGlzKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKFNpbXBsZVRlc3RVc2luZ01vY2tSaWwuY2xhc3MpOworICAgICAgICByZXR1cm4gc3VpdGU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25DcmVhdGUoQnVuZGxlIGljaWNsZSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgbUNvbnRyb2xsZXIgPSBuZXcgTW9ja1JpbENvbnRyb2xsZXIoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIFRlc3RDYXNlLmFzc2VydFRydWUoIkNyZWF0ZSBNb2NrIFJJbCBDb250cm9sbGVyIGZhaWxlZCIsIGZhbHNlKTsKKyAgICAgICAgfQorICAgICAgICBUZXN0Q2FzZS5hc3NlcnROb3ROdWxsKG1Db250cm9sbGVyKTsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoaWNpY2xlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBmaW5pc2goaW50IHJlc3VsdENvZGUsIEJ1bmRsZSByZXN1bHRzKSB7CisgICAgICAgIGlmIChtQ29udHJvbGxlciAhPSBudWxsKQorICAgICAgICAgICAgbUNvbnRyb2xsZXIuY2xvc2VDaGFubmVsKCk7CisgICAgICAgIHN1cGVyLmZpbmlzaChyZXN1bHRDb2RlLCByZXN1bHRzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255bW9ja3JpbHRlc3RzL3NyYy9jb20vYW5kcm9pZC90ZWxlcGhvbnltb2NrcmlsdGVzdHMvZnVuY3Rpb25hbC9TaW1wbGVUZXN0VXNpbmdNb2NrUmlsLmphdmEgYi90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255bW9ja3JpbHRlc3RzL3NyYy9jb20vYW5kcm9pZC90ZWxlcGhvbnltb2NrcmlsdGVzdHMvZnVuY3Rpb25hbC9TaW1wbGVUZXN0VXNpbmdNb2NrUmlsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2VhMWNmMgotLS0gL2Rldi9udWxsCisrKyBiL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnltb2NrcmlsdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3RlbGVwaG9ueW1vY2tyaWx0ZXN0cy9mdW5jdGlvbmFsL1NpbXBsZVRlc3RVc2luZ01vY2tSaWwuamF2YQpAQCAtMCwwICsxLDYzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC50ZWxlcGhvbnltb2NrcmlsdGVzdHMuZnVuY3Rpb25hbDsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5tb2NrcmlsLk1vY2tSaWxDb250cm9sbGVyOworaW1wb3J0IGFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0Q2FzZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgY29tLmFuZHJvaWQudGVsZXBob255bW9ja3JpbHRlc3RzLlRlbGVwaG9ueU1vY2tUZXN0UnVubmVyOworCisvKioKKyAqIEEgc2ltcGxlIHRlc3QgdGhhdCB1c2luZyBNb2NrIFJJTCBDb250cm9sbGVyCisgKi8KK3B1YmxpYyBjbGFzcyBTaW1wbGVUZXN0VXNpbmdNb2NrUmlsIGV4dGVuZHMgSW5zdHJ1bWVudGF0aW9uVGVzdENhc2UgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiU2ltcGxlVGVzdFVzaW5nTW9ja1JpbCI7CisgICAgcHJpdmF0ZSBNb2NrUmlsQ29udHJvbGxlciBtTW9ja1JpbEN0cmwgPSBudWxsOworICAgIHByaXZhdGUgVGVsZXBob255TW9ja1Rlc3RSdW5uZXIgbVJ1bm5lcjsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnNldFVwKCk7CisgICAgICAgIG1SdW5uZXIgPSAoVGVsZXBob255TW9ja1Rlc3RSdW5uZXIpZ2V0SW5zdHJ1bWVudGF0aW9uKCk7CisgICAgICAgIG1Nb2NrUmlsQ3RybCA9IG1SdW5uZXIubUNvbnRyb2xsZXI7CisgICAgICAgIGFzc2VydE5vdE51bGwobU1vY2tSaWxDdHJsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGN1cnJlbnQgcmFkaW8gc3RhdGUgb2YgUklMCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEdldFJhZGlvU3RhdGUoKSB7CisgICAgICAgIGludCBzdGF0ZSA9IG1Nb2NrUmlsQ3RybC5nZXRSYWRpb1N0YXRlKCk7CisgICAgICAgIExvZy52KFRBRywgInRlc3RHZXRSYWRpb1N0YXRlOiAiICsgc3RhdGUpOworICAgICAgICBhc3NlcnRUcnVlKHN0YXRlID49IDAgJiYgc3RhdGUgPD0gOSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBjdXJyZW50IHJhZGlvIHN0YXRlIG9mIFJJTAorICAgICAqIGFuZCB2ZXJpZnkgdGhlIHJhZGlvIHN0YXRlIGlzIHNldCBjb3JyZWN0bHkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0UmFkaW9TdGF0ZSgpIHsKKyAgICAgICAgZm9yIChpbnQgc3RhdGUgPSAwOyBzdGF0ZSA8PSA5OyBzdGF0ZSsrKSB7CisgICAgICAgICAgICBMb2cudihUQUcsICJzZXQgcmFkaW8gc3RhdGUgdG8gYmUgIiArIHN0YXRlKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoInNldCByYWRpbyBzdGF0ZTogIiArIHN0YXRlICsgIiBmYWlsZWQuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgbU1vY2tSaWxDdHJsLnNldFJhZGlvU3RhdGUoc3RhdGUpKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRGYWxzZSgidXNlIGFuIGludmFsaWQgcmFkaW8gc3RhdGUiLCBtTW9ja1JpbEN0cmwuc2V0UmFkaW9TdGF0ZSgtMSkpOworICAgICAgICBhc3NlcnRGYWxzZSgidGhlIHJhZGlvIHN0YXRlIGRvZXNuJ3QgZXhpc3QiLCBtTW9ja1JpbEN0cmwuc2V0UmFkaW9TdGF0ZSgxMCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9BbmRyb2lkLm1rIGIvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL0FuZHJvaWQubWsKaW5kZXggNDVlMjY1YS4uOThlNDQwMyAxMDA2NDQKLS0tIGEvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL0FuZHJvaWQubWsKKysrIGIvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL0FuZHJvaWQubWsKQEAgLTUsNiArNSw4IEBACiAKIExPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLXN1YmRpci1qYXZhLWZpbGVzKQogCitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gbGlicmlscHJvdG8tamF2YQorCiBMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLnRlc3QucnVubmVyCiAKIExPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBGcmFtZXdvcmtzVGVsZXBob255VGVzdHMKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9BbmRyb2lkTWFuaWZlc3QueG1sIGIvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggNmE5NzQyMy4uYmExZDk1NyAxMDA2NDQKLS0tIGEvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTMyLDYgKzMyLDEzIEBACiAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iY29tLmFuZHJvaWQuZnJhbWV3b3Jrcy50ZWxlcGhvbnl0ZXN0cyIKICAgICAgICAgYW5kcm9pZDpsYWJlbD0iRnJhbWV3b3JrcyBUZWxlcGhvbnkgVGVzdHMiPgogICAgIDwvaW5zdHJ1bWVudGF0aW9uPgorCisgICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9Ii5UZWxlcGhvbnlNb2NrUmlsVGVzdFJ1bm5lciIKKyAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJjb20uYW5kcm9pZC5mcmFtZXdvcmtzLnRlbGVwaG9ueXRlc3RzIgorICAgICAgICBhbmRyb2lkOmxhYmVsPSJUZXN0IFJ1bm5lciBmb3IgTW9jayBSaWwgVGVzdHMiCisgICAgLz4KKwogICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uUkVBRF9QSE9ORV9TVEFURSIgLz4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLklOVEVSTkVUIiAvPgogCiA8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9hbmRyb2lkL3RlbGVwaG9ueS9QaG9uZU51bWJlclV0aWxzVGVzdC5qYXZhIGIvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9hbmRyb2lkL3RlbGVwaG9ueS9QaG9uZU51bWJlclV0aWxzVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTU5YjgxLi4wMDAwMDAwCi0tLSBhL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvYW5kcm9pZC90ZWxlcGhvbnkvUGhvbmVOdW1iZXJVdGlsc1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnk7Ci0KLWltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOwotaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LlNwYW5uYWJsZVN0cmluZ0J1aWxkZXI7Ci1pbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuUGhvbmVOdW1iZXJVdGlsczsKLWltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5UZWxlcGhvbnlNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1wdWJsaWMgY2xhc3MgUGhvbmVOdW1iZXJVdGlsc1Rlc3QgZXh0ZW5kcyBBbmRyb2lkVGVzdENhc2UgewotCi0gICAgQFNtYWxsVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RFeHRyYWN0TmV0d29ya1BvcnRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICAgICAgICAgICIrMTcwMDU1NTQxNDEiLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdE5ldHdvcmtQb3J0aW9uKCIrMTcwMDU1NTQxNDEiKQotICAgICAgICApOwotCi0gICAgICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgICAgICAgICAiKzE3MDA1NTU0MTQxIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbigiKzEgKDcwMCkuNTU1LTQxNDEiKQotICAgICAgICApOwotCi0gICAgICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgICAgICAgICAiMTcwMDU1NTQxNDEiLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdE5ldHdvcmtQb3J0aW9uKCIxICg3MDApLjU1NS00MTQxIikKLSAgICAgICAgKTsKLQotICAgICAgICAvLyBUaGlzIG1heSBzZWVtIHdyb25nLCBidXQgaXQncyBwcm9iYWJseSBvawotICAgICAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgICAgICAgICAgIjE3MDA1NTU0MTQxKiMiLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdE5ldHdvcmtQb3J0aW9uKCIxICg3MDApLjU1NS00MTQxKiMiKQotICAgICAgICApOwotCi0gICAgICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgICAgICAgICAiMTcwMDU1NTQxTk4iLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdE5ldHdvcmtQb3J0aW9uKCIxICg3MDApLjU1NS00MU5OIikKLSAgICAgICAgKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgICAgICAgICAgIjE3MDA1NTU0MU5OIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbigiMSAoNzAwKS41NTUtNDFOTiwxMjM0IikKLSAgICAgICAgKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgICAgICAgICAgIjE3MDA1NTU0MU5OIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbigiMSAoNzAwKS41NTUtNDFOTjsxMjM0IikKLSAgICAgICAgKTsKLQotICAgICAgICAvLyBBbiBNTUkgc3RyaW5nIGlzIHVucGVydGVyYmVkLCBldmVuIHRob3VnaCBpdCBjb250YWlucyBhCi0gICAgICAgIC8vICh2YWxpZCBpbiB0aGlzIGNhc2UpIGVtYmVkZGVkICsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICAgICAgICAgICIqKjIxKioxNzAwNTU1NDE0MSMiLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdE5ldHdvcmtQb3J0aW9uKCIqKjIxKiorMTcwMDU1NTQxNDEjIikKLSAgICAgICAgICAgICAgICAvL1RPRE8gdGhpcyBpcyB0aGUgY29ycmVjdCByZXN1bHQsIGFsdGhvdWdoIHRoZSBhYm92ZQotICAgICAgICAgICAgICAgIC8vcmVzdWx0IGhhcyBiZWVuIHJldHVybmVkIHNpbmNlIGNoYW5nZSAzMTc3NgotICAgICAgICAgICAgICAgIC8vIioqMjEqKisxNzAwNTU1NDE0MSMiCi0gICAgICAgICk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbigiIikpOwotCi0gICAgICAgIGFzc2VydEVxdWFscygiIiwgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0TmV0d29ya1BvcnRpb24oIiwxMjM0IikpOwotCi0gICAgICAgIGJ5dGUgW10gYiA9IG5ldyBieXRlWzIwXTsKLSAgICAgICAgYlswXSA9IChieXRlKSAweDgxOyBiWzFdID0gKGJ5dGUpIDB4NzE7IGJbMl0gPSAoYnl0ZSkgMHgwMDsgYlszXSA9IChieXRlKSAweDU1OwotICAgICAgICBiWzRdID0gKGJ5dGUpIDB4MDU7IGJbNV0gPSAoYnl0ZSkgMHgyMDsgYls2XSA9IChieXRlKSAweEYwOwotICAgICAgICBhc3NlcnRFcXVhbHMoIjE3MDA1NTUwMDIwIiwKLSAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2FsbGVkUGFydHlCQ0RUb1N0cmluZyhiLCAwLCA3KSk7Ci0KLSAgICAgICAgYlswXSA9IChieXRlKSAweDgwOyBiWzFdID0gKGJ5dGUpIDB4NzE7IGJbMl0gPSAoYnl0ZSkgMHgwMDsgYlszXSA9IChieXRlKSAweDU1OwotICAgICAgICBiWzRdID0gKGJ5dGUpIDB4MDU7IGJbNV0gPSAoYnl0ZSkgMHgyMDsgYls2XSA9IChieXRlKSAweEYwOwotICAgICAgICBhc3NlcnRFcXVhbHMoIjE3MDA1NTUwMDIwIiwKLSAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2FsbGVkUGFydHlCQ0RUb1N0cmluZyhiLCAwLCA3KSk7Ci0KLSAgICAgICAgYlswXSA9IChieXRlKSAweDkwOyBiWzFdID0gKGJ5dGUpIDB4NzE7IGJbMl0gPSAoYnl0ZSkgMHgwMDsgYlszXSA9IChieXRlKSAweDU1OwotICAgICAgICBiWzRdID0gKGJ5dGUpIDB4MDU7IGJbNV0gPSAoYnl0ZSkgMHgyMDsgYls2XSA9IChieXRlKSAweEYwOwotICAgICAgICBhc3NlcnRFcXVhbHMoIisxNzAwNTU1MDAyMCIsCi0gICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNhbGxlZFBhcnR5QkNEVG9TdHJpbmcoYiwgMCwgNykpOwotCi0gICAgICAgIGJbMF0gPSAoYnl0ZSkgMHg5MTsgYlsxXSA9IChieXRlKSAweDcxOyBiWzJdID0gKGJ5dGUpIDB4MDA7IGJbM10gPSAoYnl0ZSkgMHg1NTsKLSAgICAgICAgYls0XSA9IChieXRlKSAweDA1OyBiWzVdID0gKGJ5dGUpIDB4MjA7IGJbNl0gPSAoYnl0ZSkgMHhGMDsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIrMTcwMDU1NTAwMjAiLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2FsbGVkUGFydHlCQ0RUb1N0cmluZyhiLCAwLCA3KSk7Ci0KLSAgICAgICAgYnl0ZVtdIGJSZXQgPSBQaG9uZU51bWJlclV0aWxzLm5ldHdvcmtQb3J0aW9uVG9DYWxsZWRQYXJ0eUJDRCgiKzE3MDA1NTUwMDIwIik7Ci0gICAgICAgIGFzc2VydEVxdWFscyg3LCBiUmV0Lmxlbmd0aCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNzsgaSsrKSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoYltpXSwgYlJldFtpXSk7Ci0gICAgICAgIH0KLQotICAgICAgICBiUmV0ID0gUGhvbmVOdW1iZXJVdGlscy5uZXR3b3JrUG9ydGlvblRvQ2FsbGVkUGFydHlCQ0RXaXRoTGVuZ3RoKCIrMTcwMDU1NTAwMjAiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDgsIGJSZXQubGVuZ3RoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGJSZXRbMF0sIDcpOwotICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IDg7IGkrKykgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGJbaSAtIDFdLCBiUmV0W2ldKTsKLSAgICAgICAgfQotCi0gICAgICAgIGJSZXQgPSBQaG9uZU51bWJlclV0aWxzLm5ldHdvcmtQb3J0aW9uVG9DYWxsZWRQYXJ0eUJDRCgiNzAwNTU1MDAyMCIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIjcwMDU1NTAwMjAiLAotICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jYWxsZWRQYXJ0eUJDRFRvU3RyaW5nKGJSZXQsIDAsIGJSZXQubGVuZ3RoKSk7Ci0KLSAgICAgICAgYlswXSA9IChieXRlKSAweDgxOyBiWzFdID0gKGJ5dGUpIDB4NzE7IGJbMl0gPSAoYnl0ZSkgMHgwMDsgYlszXSA9IChieXRlKSAweDU1OwotICAgICAgICBiWzRdID0gKGJ5dGUpIDB4MDU7IGJbNV0gPSAoYnl0ZSkgMHgyMDsgYls2XSA9IChieXRlKSAweEIwOwotICAgICAgICBhc3NlcnRFcXVhbHMoIjE3MDA1NTUwMDIwIyIsCi0gICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNhbGxlZFBhcnR5QkNEVG9TdHJpbmcoYiwgMCwgNykpOwotCi0gICAgICAgIGJbMF0gPSAoYnl0ZSkgMHg5MTsgYlsxXSA9IChieXRlKSAweDcxOyBiWzJdID0gKGJ5dGUpIDB4MDA7IGJbM10gPSAoYnl0ZSkgMHg1NTsKLSAgICAgICAgYls0XSA9IChieXRlKSAweDA1OyBiWzVdID0gKGJ5dGUpIDB4MjA7IGJbNl0gPSAoYnl0ZSkgMHhCMDsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIrMTcwMDU1NTAwMjAjIiwKLSAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2FsbGVkUGFydHlCQ0RUb1N0cmluZyhiLCAwLCA3KSk7Ci0KLSAgICAgICAgYlswXSA9IChieXRlKSAweDgxOyBiWzFdID0gKGJ5dGUpIDB4MkE7IGJbMl0gPSAoYnl0ZSkgMHhCMTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIqMjEjIiwKLSAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2FsbGVkUGFydHlCQ0RUb1N0cmluZyhiLCAwLCAzKSk7Ci0KLSAgICAgICAgYlswXSA9IChieXRlKSAweDgxOyBiWzFdID0gKGJ5dGUpIDB4MkI7IGJbMl0gPSAoYnl0ZSkgMHhCMTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIjMjEjIiwKLSAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2FsbGVkUGFydHlCQ0RUb1N0cmluZyhiLCAwLCAzKSk7Ci0KLSAgICAgICAgYlswXSA9IChieXRlKSAweDkxOyBiWzFdID0gKGJ5dGUpIDB4MkE7IGJbMl0gPSAoYnl0ZSkgMHhCMTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIqMjEjKyIsCi0gICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNhbGxlZFBhcnR5QkNEVG9TdHJpbmcoYiwgMCwgMykpOwotCi0gICAgICAgIGJbMF0gPSAoYnl0ZSkgMHg4MTsgYlsxXSA9IChieXRlKSAweEFBOyBiWzJdID0gKGJ5dGUpIDB4MTI7IGJbM10gPSAoYnl0ZSkgMHhGQjsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIqKjIxIyIsCi0gICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNhbGxlZFBhcnR5QkNEVG9TdHJpbmcoYiwgMCwgNCkpOwotCi0gICAgICAgIGJbMF0gPSAoYnl0ZSkgMHg5MTsgYlsxXSA9IChieXRlKSAweEFBOyBiWzJdID0gKGJ5dGUpIDB4MTI7IGJbM10gPSAoYnl0ZSkgMHhGQjsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIqKjIxIysiLAotICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jYWxsZWRQYXJ0eUJDRFRvU3RyaW5nKGIsIDAsIDQpKTsKLQotICAgICAgICBiWzBdID0gKGJ5dGUpIDB4ODE7IGJbMV0gPSAoYnl0ZSkgMHg5QTsgYlsyXSA9IChieXRlKSAweEE5OyBiWzNdID0gKGJ5dGUpIDB4NzE7Ci0gICAgICAgIGJbNF0gPSAoYnl0ZSkgMHgwMDsgYls1XSA9IChieXRlKSAweDU1OyBiWzZdID0gKGJ5dGUpIDB4MDU7IGJbN10gPSAoYnl0ZSkgMHgyMDsKLSAgICAgICAgYls4XSA9IChieXRlKSAweEIwOwotICAgICAgICBhc3NlcnRFcXVhbHMoIio5OSoxNzAwNTU1MDAyMCMiLAotICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jYWxsZWRQYXJ0eUJDRFRvU3RyaW5nKGIsIDAsIDkpKTsKLQotICAgICAgICBiWzBdID0gKGJ5dGUpIDB4OTE7IGJbMV0gPSAoYnl0ZSkgMHg5QTsgYlsyXSA9IChieXRlKSAweEE5OyBiWzNdID0gKGJ5dGUpIDB4NzE7Ci0gICAgICAgIGJbNF0gPSAoYnl0ZSkgMHgwMDsgYls1XSA9IChieXRlKSAweDU1OyBiWzZdID0gKGJ5dGUpIDB4MDU7IGJbN10gPSAoYnl0ZSkgMHgyMDsKLSAgICAgICAgYls4XSA9IChieXRlKSAweEIwOwotICAgICAgICBhc3NlcnRFcXVhbHMoIio5OSorMTcwMDU1NTAwMjAjIiwKLSAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2FsbGVkUGFydHlCQ0RUb1N0cmluZyhiLCAwLCA5KSk7Ci0KLSAgICAgICAgYlswXSA9IChieXRlKSAweDgxOyBiWzFdID0gKGJ5dGUpIDB4QUE7IGJbMl0gPSAoYnl0ZSkgMHgxMjsgYlszXSA9IChieXRlKSAweDFBOwotICAgICAgICBiWzRdID0gKGJ5dGUpIDB4MDc7IGJbNV0gPSAoYnl0ZSkgMHg1MDsgYls2XSA9IChieXRlKSAweDU1OyBiWzddID0gKGJ5dGUpIDB4MDA7Ci0gICAgICAgIGJbOF0gPSAoYnl0ZSkgMHgwMjsgYls5XSA9IChieXRlKSAweEZCOwotICAgICAgICBhc3NlcnRFcXVhbHMoIioqMjEqMTcwMDU1NTAwMjAjIiwKLSAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2FsbGVkUGFydHlCQ0RUb1N0cmluZyhiLCAwLCAxMCkpOwotCi0gICAgICAgIGJbMF0gPSAoYnl0ZSkgMHg5MTsgYlsxXSA9IChieXRlKSAweEFBOyBiWzJdID0gKGJ5dGUpIDB4MTI7IGJbM10gPSAoYnl0ZSkgMHgxQTsKLSAgICAgICAgYls0XSA9IChieXRlKSAweDA3OyBiWzVdID0gKGJ5dGUpIDB4NTA7IGJbNl0gPSAoYnl0ZSkgMHg1NTsgYls3XSA9IChieXRlKSAweDAwOwotICAgICAgICBiWzhdID0gKGJ5dGUpIDB4MDI7IGJbOV0gPSAoYnl0ZSkgMHhGQjsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIqKjIxKisxNzAwNTU1MDAyMCMiLAotICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jYWxsZWRQYXJ0eUJDRFRvU3RyaW5nKGIsIDAsIDEwKSk7Ci0KLSAgICAgICAgYlswXSA9IChieXRlKSAweDgxOyBiWzFdID0gKGJ5dGUpIDB4MkE7IGJbMl0gPSAoYnl0ZSkgMHhBMTsgYlszXSA9IChieXRlKSAweDcxOwotICAgICAgICBiWzRdID0gKGJ5dGUpIDB4MDA7IGJbNV0gPSAoYnl0ZSkgMHg1NTsgYls2XSA9IChieXRlKSAweDA1OyBiWzddID0gKGJ5dGUpIDB4MjA7Ci0gICAgICAgIGJbOF0gPSAoYnl0ZSkgMHhGMDsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIqMjEqMTcwMDU1NTAwMjAiLAotICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jYWxsZWRQYXJ0eUJDRFRvU3RyaW5nKGIsIDAsIDkpKTsKLQotICAgICAgICBiWzBdID0gKGJ5dGUpIDB4OTE7IGJbMV0gPSAoYnl0ZSkgMHgyQTsgYlsyXSA9IChieXRlKSAweEIxOyBiWzNdID0gKGJ5dGUpIDB4NzE7Ci0gICAgICAgIGJbNF0gPSAoYnl0ZSkgMHgwMDsgYls1XSA9IChieXRlKSAweDU1OyBiWzZdID0gKGJ5dGUpIDB4MDU7IGJbN10gPSAoYnl0ZSkgMHgyMDsKLSAgICAgICAgYls4XSA9IChieXRlKSAweEYwOwotICAgICAgICBhc3NlcnRFcXVhbHMoIioyMSMrMTcwMDU1NTAwMjAiLAotICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jYWxsZWRQYXJ0eUJDRFRvU3RyaW5nKGIsIDAsIDkpKTsKLQotICAgICAgICBhc3NlcnROdWxsKFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdE5ldHdvcmtQb3J0aW9uKG51bGwpKTsKLSAgICAgICAgYXNzZXJ0TnVsbChQaG9uZU51bWJlclV0aWxzLmV4dHJhY3RQb3N0RGlhbFBvcnRpb24obnVsbCkpOwotICAgICAgICBhc3NlcnRUcnVlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZShudWxsLCBudWxsKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZShudWxsLCAiMTIzIikpOwotICAgICAgICBhc3NlcnRGYWxzZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIjEyMyIsIG51bGwpKTsKLSAgICAgICAgYXNzZXJ0TnVsbChQaG9uZU51bWJlclV0aWxzLnRvQ2FsbGVySURNaW5NYXRjaChudWxsKSk7Ci0gICAgICAgIGFzc2VydE51bGwoUGhvbmVOdW1iZXJVdGlscy5nZXRTdHJpcHBlZFJldmVyc2VkKG51bGwpKTsKLSAgICAgICAgYXNzZXJ0TnVsbChQaG9uZU51bWJlclV0aWxzLnN0cmluZ0Zyb21TdHJpbmdBbmRUT0EobnVsbCwgMSkpOwotICAgIH0KLQotICAgIEBTbWFsbFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RXh0cmFjdE5ldHdvcmtQb3J0aW9uQWx0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgICAgICAgICAiKzE3MDA1NTU0MTQxIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbkFsdCgiKzE3MDA1NTU0MTQxIikKLSAgICAgICAgKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgICAgICAgICAgIisxNzAwNTU1NDE0MSIsCi0gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0TmV0d29ya1BvcnRpb25BbHQoIisxICg3MDApLjU1NS00MTQxIikKLSAgICAgICAgKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgICAgICAgICAgIjE3MDA1NTU0MTQxIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbkFsdCgiMSAoNzAwKS41NTUtNDE0MSIpCi0gICAgICAgICk7Ci0KLSAgICAgICAgLy8gVGhpcyBtYXkgc2VlbSB3cm9uZywgYnV0IGl0J3MgcHJvYmFibHkgb2sKLSAgICAgICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICAgICAgICAgICIxNzAwNTU1NDE0MSojIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbkFsdCgiMSAoNzAwKS41NTUtNDE0MSojIikKLSAgICAgICAgKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgICAgICAgICAgIjE3MDA1NTU0MU5OIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbkFsdCgiMSAoNzAwKS41NTUtNDFOTiIpCi0gICAgICAgICk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICAgICAgICAgICIxNzAwNTU1NDFOTiIsCi0gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0TmV0d29ya1BvcnRpb25BbHQoIjEgKDcwMCkuNTU1LTQxTk4sMTIzNCIpCi0gICAgICAgICk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICAgICAgICAgICIxNzAwNTU1NDFOTiIsCi0gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0TmV0d29ya1BvcnRpb25BbHQoIjEgKDcwMCkuNTU1LTQxTk47MTIzNCIpCi0gICAgICAgICk7Ci0KLSAgICAgICAgLy8gQW4gTU1JIHN0cmluZyBpcyB1bnBlcnRlcmJlZCwgZXZlbiB0aG91Z2ggaXQgY29udGFpbnMgYQotICAgICAgICAvLyAodmFsaWQgaW4gdGhpcyBjYXNlKSBlbWJlZGRlZCArCi0gICAgICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgICAgICAgICAiKioyMSoqKzE3MDA1NTU0MTQxIyIsCi0gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0TmV0d29ya1BvcnRpb25BbHQoIioqMjEqKisxNzAwNTU1NDE0MSMiKQotICAgICAgICApOwotCi0gICAgICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgICAgICAgICAiKjMxIys0NDc5NjYxNjQyMDgiLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdE5ldHdvcmtQb3J0aW9uQWx0KCIqMzEjKzQ0Nzk2NjE2NDIwOCIpCi0gICAgICAgICk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICAgICAgICAgICIqMzEjKzQ0Nzk2NjE2NDIwOCIsCi0gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0TmV0d29ya1BvcnRpb25BbHQoIiozMSMgKCs0NCkgNzkgNjYxNiA0MjA4IikKLSAgICAgICAgKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdE5ldHdvcmtQb3J0aW9uQWx0KCIiKSk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbkFsdCgiLDEyMzQiKSk7Ci0KLSAgICAgICAgYXNzZXJ0TnVsbChQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbkFsdChudWxsKSk7Ci0gICAgfQotCi0gICAgQFNtYWxsVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RCKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGFzc2VydEVxdWFscygiIiwgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0UG9zdERpYWxQb3J0aW9uKCIrMTcwMDU1NTQxNDEiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiIiwgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0UG9zdERpYWxQb3J0aW9uKCIrMSAoNzAwKS41NTUtNDE0MSIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3RQb3N0RGlhbFBvcnRpb24oIisxICg3MDApLjU1NS00MU5OIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIiwxMjM0IiwgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0UG9zdERpYWxQb3J0aW9uKCIrMSAoNzAwKS41NTUtNDFOTiwxMjM0IikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIjsxMjM0IiwgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0UG9zdERpYWxQb3J0aW9uKCIrMSAoNzAwKS41NTUtNDFOTjsxMjM0IikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIjsxMjM0LDtOIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3RQb3N0RGlhbFBvcnRpb24oIisxICg3MDApLjU1NS00MU5OOzEtMi4zNCAsO04iKSk7Ci0gICAgfQotCi0gICAgQFNtYWxsVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RDb21wYXJlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIHRoaXMgaXMgb2RkCi0gICAgICAgIGFzc2VydEZhbHNlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiIiwgIiIpKTsKLQotICAgICAgICBhc3NlcnRUcnVlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiOTExIiwgIjkxMSIpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCI5MTEiLCAiMTgwMDU1NTA5MTEiKSk7Ci0gICAgICAgIGFzc2VydFRydWUoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCI1NTU1IiwgIjU1NTUiKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiNTU1NSIsICIxODAwNTU1NTU1NTUiKSk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIisxNzAwNTU1NDE0MSIsICIrMTcwMDU1NTQxNDEiKSk7Ci0gICAgICAgIGFzc2VydFRydWUoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIrMTcwMDU1NTQxNDEiLCAiKzEgKDcwMCkuNTU1LTQxNDEiKSk7Ci0gICAgICAgIGFzc2VydFRydWUoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIrMTcwMDU1NTQxNDEiLCAiKzEgKDcwMCkuNTU1LTQxNDEsMTIzNCIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIisxNzAwNTU1NDE0MSIsICIxNzAwNTU1NDE0MSIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIisxNzAwNTU1NDE0MSIsICI3MDA1NTU0MTQxIikpOwotICAgICAgICBhc3NlcnRUcnVlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiKzE3MDA1NTU0MTQxIiwgIjU1NTQxNDEiKSk7Ci0gICAgICAgIGFzc2VydFRydWUoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIxNzAwNTU1NDE0MSIsICI1NTU0MTQxIikpOwotICAgICAgICBhc3NlcnRUcnVlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiKzE3MDA1NTU0MTQxIiwgIjAxMTE3MDA1NTU0MTQxIikpOwotICAgICAgICBhc3NlcnRUcnVlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiKzE3MDA1NTU0MTQxIiwgIjAwMTcwMDU1NTQxNDEiKSk7Ci0gICAgICAgIGFzc2VydFRydWUoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIxNzAwNTU1NDE0MSIsICIwMDE3MDA1NTU0MTQxIikpOwotCi0KLSAgICAgICAgYXNzZXJ0VHJ1ZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIisxNzAwNTU1NDE0MSIsICIqKjMxIysxNzAwNTU1NDE0MSIpKTsKLQotICAgICAgICBhc3NlcnRGYWxzZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIisxIDk5OSA3MDA1NTU0MTQxIiwgIisxIDcwMDU1NTQxNDEiKSk7Ci0gICAgICAgIGFzc2VydFRydWUoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIwMTEgMSA3MDA1NTU0MTQxIiwgIjcwMDU1NTQxNDEiKSk7Ci0KLSAgICAgICAgYXNzZXJ0RmFsc2UoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIwMTEgMTEgNzAwNTU1NDE0MSIsICIrMTcwMDU1NTQxNDEiKSk7Ci0KLSAgICAgICAgYXNzZXJ0RmFsc2UoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIrMTcwMDU1NTQxNDEiLCAiNzA4NTg4MjMwMCIpKTsKLQotICAgICAgICBhc3NlcnRUcnVlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiKzQ0IDIwNyA3OTIgMzQ5MCIsICIwIDIwNyA3OTIgMzQ5MCIpKTsKLQotICAgICAgICBhc3NlcnRGYWxzZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIis0NCAyMDcgNzkyIDM0OTAiLCAiMDAgMjA3IDc5MiAzNDkwIikpOwotICAgICAgICBhc3NlcnRGYWxzZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIis0NCAyMDcgNzkyIDM0OTAiLCAiMDExIDIwNyA3OTIgMzQ5MCIpKTsKLQotICAgICAgICAvKioqKiogRklYTUUncyAqKioqKiovCi0gICAgICAgIC8vCi0gICAgICAgIC8vIE1NSSBoZWFkZXIgc2hvdWxkIGJlIGlnbm9yZWQKLSAgICAgICAgYXNzZXJ0RmFsc2UoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIrMTcwMDU1NTQxNDEiLCAiKiozMSMxNzAwNTU1NDE0MSIpKTsKLQotICAgICAgICAvLyBJdCdzIHRvbyBiYWQgdGhpcyBpcyBmYWxzZQotICAgICAgICAvLyArNDQgKDApIDIwNyA3OTIgMzQ5MCBpcyBub3QgYSBkaWFsYWJsZSBudW1iZXIKLSAgICAgICAgLy8gYnV0IGl0IGlzIGNvbW1vbmx5IGhvdyBFdXJvcGVhbiBwaG9uZSBudW1iZXJzIGFyZSB3cml0dGVuCi0gICAgICAgIGFzc2VydEZhbHNlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiKzQ0IDIwNyA3OTIgMzQ5MCIsICIrNDQgKDApIDIwNyA3OTIgMzQ5MCIpKTsKLQotICAgICAgICAvLyBUaGUgamFwYW5lc2UgaW50ZXJuYXRpb25hbCBwcmVmaXgsIGZvciBleGFtcGxlLCBtZXNzZXMgdXMgdXAKLSAgICAgICAgLy8gQnV0IHdobyB1c2VzIGEgR1NNIHBob25lIGluIEphcGFuPwotICAgICAgICBhc3NlcnRGYWxzZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIis0NCAyMDcgNzkyIDM0OTAiLCAiMDEwIDQ0IDIwNyA3OTIgMzQ5MCIpKTsKLQotICAgICAgICAvLyBUaGUgQXVzdHJhbGlhbiBvbmUgbWVzc2VzIHVzIHVwIHRvbwotICAgICAgICBhc3NlcnRGYWxzZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIis0NCAyMDcgNzkyIDM0OTAiLCAiMDAxMSA0NCAyMDcgNzkyIDM0OTAiKSk7Ci0KLSAgICAgICAgLy8gVGhlIFJ1c3NpYW4gdHJ1bmsgcHJlZml4IG1lc3NlcyB1cyB1cCwgYXMgZG9lcyBjdXJyZW50Ci0gICAgICAgIC8vIFJ1c3NpYW4gYXJlYSBjb2RlcyAod2hpY2ggYmVpbiB3aXRoIDApCi0KLSAgICAgICAgYXNzZXJ0RmFsc2UoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIrNygwOTUpOTEwMDc2NiIsICI4KDA5NSk5MTAwNzY2IikpOwotCi0gICAgICAgIC8vIDQ0NCBpcyBub3QgYSB2YWxpZCBjb3VudHJ5IGNvZGUsIGJ1dAotICAgICAgICAvLyBtYXRjaEludGxQcmVmaXhBbmRDQyBkb2VzbnQga25vdyB0aGlzCi0gICAgICAgIGFzc2VydFRydWUoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIrNDQ0IDIwNyA3OTIgMzQ5MCIsICIwIDIwNyA3OTIgMzQ5MCIpKTsKLQotICAgICAgICAvLyBjb21wYXJlIFNNUyBzaG9ydCBjb2RlCi0gICAgICAgIGFzc2VydFRydWUoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCI0MDQtMDQiLCAiNDA0MDQiKSk7Ci0gICAgfQotCi0KLSAgICBAU21hbGxUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFRvQ2FsbGVySURJbmRleGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIxNDE0NTU1IiwgUGhvbmVOdW1iZXJVdGlscy50b0NhbGxlcklETWluTWF0Y2goIjE3MDA1NTU0MTQxIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIjE0MTQ1NTUiLCBQaG9uZU51bWJlclV0aWxzLnRvQ2FsbGVySURNaW5NYXRjaCgiMS03MDAtNTU1LTQxNDEiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiMTQxNDU1NSIsIFBob25lTnVtYmVyVXRpbHMudG9DYWxsZXJJRE1pbk1hdGNoKCIxLTcwMC01NTUtNDE0MSwxMjM0IikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIjE0MTQ1NTUiLCBQaG9uZU51bWJlclV0aWxzLnRvQ2FsbGVySURNaW5NYXRjaCgiMS03MDAtNTU1LTQxNDE7MTIzNCIpKTsKLQotICAgICAgICAvL3RoaXMgc2VlbXMgd3JvbmcsIG9yIGF0IGxlYXN0IHVzZWxlc3MKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJOTjE0NTU1IiwgUGhvbmVOdW1iZXJVdGlscy50b0NhbGxlcklETWluTWF0Y2goIjEtNzAwLTU1NS00MU5OIikpOwotCi0gICAgICAgIC8vPHNocnVnPiAtLSB0aGVzZSBhcmUgYWxsIG5vdCB1c2VmdWwsIGJ1dCBub3QgdGVycmlibHkgd3JvbmcKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBQaG9uZU51bWJlclV0aWxzLnRvQ2FsbGVySURNaW5NYXRjaCgiIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIjAwMzIiLCBQaG9uZU51bWJlclV0aWxzLnRvQ2FsbGVySURNaW5NYXRjaCgiMjMwMCIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIwMDMyKyIsIFBob25lTnVtYmVyVXRpbHMudG9DYWxsZXJJRE1pbk1hdGNoKCIrMjMwMCIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIjMTMwIyoiLCBQaG9uZU51bWJlclV0aWxzLnRvQ2FsbGVySURNaW5NYXRjaCgiKiMwMzEjIikpOwotICAgIH0KLQotICAgIEBTbWFsbFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0SW5kZXhhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGFzc2VydEVxdWFscygiMTQxNDU1NTAwNzEiLCBQaG9uZU51bWJlclV0aWxzLmdldFN0cmlwcGVkUmV2ZXJzZWQoIjEtNzAwLTU1NS00MTQxIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIjE0MTQ1NTUwMDcxIiwgUGhvbmVOdW1iZXJVdGlscy5nZXRTdHJpcHBlZFJldmVyc2VkKCIxLTcwMC01NTUtNDE0MSwxMjM0IikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIjE0MTQ1NTUwMDcxIiwgUGhvbmVOdW1iZXJVdGlscy5nZXRTdHJpcHBlZFJldmVyc2VkKCIxLTcwMC01NTUtNDE0MTsxMjM0IikpOwotCi0gICAgICAgIC8vdGhpcyBzZWVtcyB3cm9uZywgb3IgYXQgbGVhc3QgdXNlbGVzcwotICAgICAgICBhc3NlcnRFcXVhbHMoIk5OMTQ1NTUwMDcxIiwgUGhvbmVOdW1iZXJVdGlscy5nZXRTdHJpcHBlZFJldmVyc2VkKCIxLTcwMC01NTUtNDFOTiIpKTsKLQotICAgICAgICAvLzxzaHJ1Zz4gLS0gdGhlc2UgYXJlIGFsbCBub3QgdXNlZnVsLCBidXQgbm90IHRlcnJpYmx5IHdyb25nCi0gICAgICAgIGFzc2VydEVxdWFscygiIiwgUGhvbmVOdW1iZXJVdGlscy5nZXRTdHJpcHBlZFJldmVyc2VkKCIiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiMDAzMiIsIFBob25lTnVtYmVyVXRpbHMuZ2V0U3RyaXBwZWRSZXZlcnNlZCgiMjMwMCIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIwMDMyKyIsIFBob25lTnVtYmVyVXRpbHMuZ2V0U3RyaXBwZWRSZXZlcnNlZCgiKzIzMDAiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiIzEzMCMqIiwgUGhvbmVOdW1iZXJVdGlscy5nZXRTdHJpcHBlZFJldmVyc2VkKCIqIzAzMSMiKSk7Ci0gICAgfQotCi0gICAgQFNtYWxsVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3ROYW5wRm9ybWF0dGluZygpIHsKLSAgICAgICAgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlciBudW1iZXIgPSBuZXcgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcigpOwotICAgICAgICBudW1iZXIuYXBwZW5kKCI4MDA1NTUxMjEyIik7Ci0gICAgICAgIFBob25lTnVtYmVyVXRpbHMuZm9ybWF0TmFucE51bWJlcihudW1iZXIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIjgwMC01NTUtMTIxMiIsIG51bWJlci50b1N0cmluZygpKTsKLQotICAgICAgICBudW1iZXIuY2xlYXIoKTsKLSAgICAgICAgbnVtYmVyLmFwcGVuZCgiODAwNTU1MTIxIik7Ci0gICAgICAgIFBob25lTnVtYmVyVXRpbHMuZm9ybWF0TmFucE51bWJlcihudW1iZXIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIjgwMC01NTUtMTIxIiwgbnVtYmVyLnRvU3RyaW5nKCkpOwotCi0gICAgICAgIG51bWJlci5jbGVhcigpOwotICAgICAgICBudW1iZXIuYXBwZW5kKCI1NTUtMTIxMiIpOwotICAgICAgICBQaG9uZU51bWJlclV0aWxzLmZvcm1hdE5hbnBOdW1iZXIobnVtYmVyKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCI1NTUtMTIxMiIsIG51bWJlci50b1N0cmluZygpKTsKLQotICAgICAgICBudW1iZXIuY2xlYXIoKTsKLSAgICAgICAgbnVtYmVyLmFwcGVuZCgiODAwLTU1NTEyIik7Ci0gICAgICAgIFBob25lTnVtYmVyVXRpbHMuZm9ybWF0TmFucE51bWJlcihudW1iZXIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIjgwMC01NTUtMTIiLCBudW1iZXIudG9TdHJpbmcoKSk7Ci0KLSAgICAgICAgbnVtYmVyLmNsZWFyKCk7Ci0gICAgICAgIG51bWJlci5hcHBlbmQoIjQ2NjQ1Iik7Ci0gICAgICAgIFBob25lTnVtYmVyVXRpbHMuZm9ybWF0TmFucE51bWJlcihudW1iZXIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIjQ2NjQ1IiwgbnVtYmVyLnRvU3RyaW5nKCkpOwotICAgIH0KLQotICAgIEBTbWFsbFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29udmVydEtleXBhZExldHRlcnNUb0RpZ2l0cygpIHsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIxLTgwMC00NjY0LTQxMSIsCi0gICAgICAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNvbnZlcnRLZXlwYWRMZXR0ZXJzVG9EaWdpdHMoIjEtODAwLUdPT0ctNDExIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIjE4MDA0NjY0NDExIiwKLSAgICAgICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY29udmVydEtleXBhZExldHRlcnNUb0RpZ2l0cygiMTgwMEdPT0c0MTEiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiMS04MDAtNDY2LTQ0MTEiLAotICAgICAgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jb252ZXJ0S2V5cGFkTGV0dGVyc1RvRGlnaXRzKCIxLTgwMC00NjYtNDQxMSIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIxODAwNDY2NDQxMSIsCi0gICAgICAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNvbnZlcnRLZXlwYWRMZXR0ZXJzVG9EaWdpdHMoIjE4MDA0NjY0NDExIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIjIyMi0zMzMtNDQ0LTU1NS02NjYtNzc3Ny04ODgtOTk5OSIsCi0gICAgICAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNvbnZlcnRLZXlwYWRMZXR0ZXJzVG9EaWdpdHMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBQkMtREVGLUdISS1KS0wtTU5PLVBRUlMtVFVWLVdYWVoiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiMjIyLTMzMy00NDQtNTU1LTY2Ni03Nzc3LTg4OC05OTk5IiwKLSAgICAgICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY29udmVydEtleXBhZExldHRlcnNUb0RpZ2l0cygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFiYy1kZWYtZ2hpLWprbC1tbm8tcHFycy10dXYtd3h5eiIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIoODAwKSAyMjItMzMzNCIsCi0gICAgICAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNvbnZlcnRLZXlwYWRMZXR0ZXJzVG9EaWdpdHMoIig4MDApIEFCQy1ERUZHIikpOwotICAgIH0KLQotICAgIC8vIFRvIHJ1biB0aGlzIHRlc3QsIHRoZSBkZXZpY2UgaGFzIHRvIGJlIHJlZ2lzdGVyZWQgd2l0aCBuZXR3b3JrCi0gICAgcHVibGljIHZvaWQgdGVzdENoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCkgewotICAgICAgICBhc3NlcnRFcXVhbHMoIjAxMTg0NzU3OTcwMDAiLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCIrODQ3NTc5NzAwMCIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIxODQ3NTc5NzAwMCIsCi0gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUoIisxODQ3NTc5NzAwMCIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIwMTExMjM0NTY3IiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZSgiKzEyMzQ1NjciKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiMDExMjM0NTY3MDAwMDAiLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCIrMjM0NTY3MDAwMDAiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiMDExMTE4NzU3Njc4MDAiLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCIrMTE4NzU3Njc4MDAiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiODQ3NTc5NzAwMCwxODQ3NTIzMTc1MyIsCi0gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUoIjg0NzU3OTcwMDAsKzE4NDc1MjMxNzUzIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIjAxMTg0NzU3OTcwMDAsMTg0NzUyMzE3NTMiLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCIrODQ3NTc5NzAwMCwrMTg0NzUyMzE3NTMiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiODQ3NTc5NzAwMDswMTE4NDY5MzEyMzQ1IiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZSgiODQ3NTc5NzAwMDsrODQ2OTMxMjM0NSIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCI4NDc1Nzk3MDAwLDAxMTEyMzQ1NjciLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCI4NDc1Nzk3MDAwLCsxMjM0NTY3IikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIjg0NzU5NzAwMDswMTExMTg3NTc2NzAwMCIsCi0gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUoIjg0NzU5NzAwMDsrMTE4NzU3NjcwMDAiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiODQ3NTc5NzAwMCwsMDExODQ2OTMxMjM0NSIsCi0gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUoIjg0NzU3OTcwMDAsLCs4NDY5MzEyMzQ1IikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIjg0NzU3OTcwMDA7LDAxMTg0NjkzMTIzNDUiLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCI4NDc1Nzk3MDAwOywrODQ2OTMxMjM0NSIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCI4NDc1Nzk3MDAwLDsxODQ3NTIzMTc1MyIsCi0gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUoIjg0NzU3OTcwMDAsOysxODQ3NTIzMTc1MyIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCI4NDc1Nzk3MDAwOywwMTExMTg3NTc2NzAwMCIsCi0gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUoIjg0NzU3OTcwMDA7LCsxMTg3NTc2NzAwMCIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCI4NDc1Nzk3MDAwLDswMTExMTg3NTc2NzAwMCIsCi0gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUoIjg0NzU3OTcwMDAsOysxMTg3NTc2NzAwMCIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCI4NDc1Nzk3MDAwLCwsMDExMTE4NzU3NjcwMDAiLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCI4NDc1Nzk3MDAwLCwsKzExODc1NzY3MDAwIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIjg0NzU3OTcwMDA7LCwwMTExMTg3NTc2NzAwMCIsCi0gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUoIjg0NzU3OTcwMDA7LCwrMTE4NzU3NjcwMDAiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiKzssODQ3NTc5NzAwMCIsCi0gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUoIis7LDg0NzU3OTcwMDAiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiODQ3NTc5NzAwMCwiLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCI4NDc1Nzk3MDAwLCIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCI4NDcrNTc5LTcwMDAiLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCI4NDcrNTc5LTcwMDAiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiLDg0NzU3OTcwMDAiLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCIsODQ3NTc5NzAwMCIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCI7Ozg0NzU3OTcwMDAsLCIsCi0gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUoIjs7ODQ3NTc5NzAwMCwsIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIit0aGlzK2lzJHdlaXJkOywrIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZSgiK3RoaXMraXMkd2VpcmQ7LCsiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZSgiIikpOwotICAgICAgICBhc3NlcnROdWxsKFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKG51bGwpKTsKLSAgICB9Ci0KLSAgICBAU21hbGxUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdENoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlQnlOdW1iZXJGb3JtYXQoKSB7Ci0gICAgICAgIGFzc2VydEVxdWFscygiMTg0NzU3OTcwMDAiLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlQnlOdW1iZXJGb3JtYXQoIisxODQ3NTc5NzAwMCIsCi0gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5GT1JNQVRfTkFOUCxQaG9uZU51bWJlclV0aWxzLkZPUk1BVF9OQU5QKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiKzE4NDc1Nzk3MDAwIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZUJ5TnVtYmVyRm9ybWF0KCIrMTg0NzU3OTcwMDAiLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuRk9STUFUX05BTlAsUGhvbmVOdW1iZXJVdGlscy5GT1JNQVRfSkFQQU4pKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIrMTg0NzU3OTcwMDAiLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlQnlOdW1iZXJGb3JtYXQoIisxODQ3NTc5NzAwMCIsCi0gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5GT1JNQVRfTkFOUCxQaG9uZU51bWJlclV0aWxzLkZPUk1BVF9VTktOT1dOKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiKzE4NDc1Nzk3MDAwIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZUJ5TnVtYmVyRm9ybWF0KCIrMTg0NzU3OTcwMDAiLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuRk9STUFUX0pBUEFOLFBob25lTnVtYmVyVXRpbHMuRk9STUFUX0pBUEFOKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiKzE4NDc1Nzk3MDAwIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZUJ5TnVtYmVyRm9ybWF0KCIrMTg0NzU3OTcwMDAiLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuRk9STUFUX1VOS05PV04sUGhvbmVOdW1iZXJVdGlscy5GT1JNQVRfVU5LTk9XTikpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEJhc2ljIGNoZWNrcyBmb3IgdGhlIFZvaWNlTWFpbCBudW1iZXIuCi0gICAgICovCi0gICAgQFNtYWxsVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RXaXRoTnVtYmVyTm90RXF1YWxUb1ZvaWNlTWFpbCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBhc3NlcnRGYWxzZShQaG9uZU51bWJlclV0aWxzLmlzVm9pY2VNYWlsTnVtYmVyKCI5MTEiKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKFBob25lTnVtYmVyVXRpbHMuaXNWb2ljZU1haWxOdW1iZXIoInRlbDo5MTEiKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKFBob25lTnVtYmVyVXRpbHMuaXNWb2ljZU1haWxOdW1iZXIoIisxODAwMTIzNDU2NyIpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoUGhvbmVOdW1iZXJVdGlscy5pc1ZvaWNlTWFpbE51bWJlcigiIikpOwotICAgICAgICBhc3NlcnRGYWxzZShQaG9uZU51bWJlclV0aWxzLmlzVm9pY2VNYWlsTnVtYmVyKG51bGwpKTsKLSAgICAgICAgLy8gVGhpcyB0ZXN0IGZhaWxzIG9uIGEgZGV2aWNlIHdpdGhvdXQgYSBzaW0gY2FyZAotICAgICAgICAvKlRlbGVwaG9ueU1hbmFnZXIgbVRlbGVwaG9ueU1hbmFnZXIgPQotICAgICAgICAgICAgKFRlbGVwaG9ueU1hbmFnZXIpZ2V0Q29udGV4dCgpLmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5URUxFUEhPTllfU0VSVklDRSk7Ci0gICAgICAgIFN0cmluZyBtVm9pY2VNYWlsTnVtYmVyID0gbVRlbGVwaG9ueU1hbmFnZXIuZ2V0RGVmYXVsdCgpLmdldFZvaWNlTWFpbE51bWJlcigpOwotICAgICAgICBhc3NlcnRUcnVlKFBob25lTnVtYmVyVXRpbHMuaXNWb2ljZU1haWxOdW1iZXIobVZvaWNlTWFpbE51bWJlcikpOwotICAgICAgICAqLwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvYW5kcm9pZC90ZWxlcGhvbnkvUGhvbmVOdW1iZXJXYXRjaGVyVGVzdC5qYXZhIGIvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9hbmRyb2lkL3RlbGVwaG9ueS9QaG9uZU51bWJlcldhdGNoZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4ZWFlY2QuLjAwMDAwMDAKLS0tIGEvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9hbmRyb2lkL3RlbGVwaG9ueS9QaG9uZU51bWJlcldhdGNoZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnk7Ci0KLWltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5QaG9uZU51bWJlckZvcm1hdHRpbmdUZXh0V2F0Y2hlcjsKLWltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQudGV4dC5TZWxlY3Rpb247Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LlNwYW5uYWJsZVN0cmluZ0J1aWxkZXI7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRXYXRjaGVyOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1wdWJsaWMgY2xhc3MgUGhvbmVOdW1iZXJXYXRjaGVyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLSAgICBAU21hbGxUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEh5cGhlbmF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIgbnVtYmVyID0gbmV3IFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgVGV4dFdhdGNoZXIgdHcgPSBuZXcgUGhvbmVOdW1iZXJGb3JtYXR0aW5nVGV4dFdhdGNoZXIoKTsKLSAgICAgICAgbnVtYmVyLmFwcGVuZCgiNTU1LTEyMTIiKTsKLSAgICAgICAgLy8gTW92ZSB0aGUgY3Vyc29yIHRvIHRoZSBsZWZ0IGVkZ2UKLSAgICAgICAgU2VsZWN0aW9uLnNldFNlbGVjdGlvbihudW1iZXIsIDApOwotICAgICAgICB0dy5iZWZvcmVUZXh0Q2hhbmdlZChudW1iZXIsIDAsIDAsIDEpOwotICAgICAgICAvLyBJbnNlcnQgYW4gOCBhdCB0aGUgYmVnaW5uaW5nCi0gICAgICAgIG51bWJlci5pbnNlcnQoMCwgIjgiKTsKLSAgICAgICAgdHcuYWZ0ZXJUZXh0Q2hhbmdlZChudW1iZXIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIjg1NS01MTItMTIiLCBudW1iZXIudG9TdHJpbmcoKSk7Ci0gICAgfQotICAgIAotICAgIEBTbWFsbFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0SHlwaGVuRGVsZXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlciBudW1iZXIgPSBuZXcgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcigpOwotICAgICAgICBUZXh0V2F0Y2hlciB0dyA9IG5ldyBQaG9uZU51bWJlckZvcm1hdHRpbmdUZXh0V2F0Y2hlcigpOwotICAgICAgICBudW1iZXIuYXBwZW5kKCI1NTUtMTIxMiIpOwotICAgICAgICAvLyBNb3ZlIHRoZSBjdXJzb3IgdG8gYWZ0ZXIgdGhlIGh5cGhlbgotICAgICAgICBTZWxlY3Rpb24uc2V0U2VsZWN0aW9uKG51bWJlciwgNCk7Ci0gICAgICAgIC8vIERlbGV0ZSB0aGUgaHlwaGVuCi0gICAgICAgIHR3LmJlZm9yZVRleHRDaGFuZ2VkKG51bWJlciwgMywgMSwgMCk7Ci0gICAgICAgIG51bWJlci5kZWxldGUoMywgNCk7Ci0gICAgICAgIHR3LmFmdGVyVGV4dENoYW5nZWQobnVtYmVyKTsKLSAgICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgaXQgZGVsZXRlZCB0aGUgY2hhcmFjdGVyIGJlZm9yZSB0aGUgaHlwaGVuIAotICAgICAgICBhc3NlcnRFcXVhbHMoIjU1MS0yMTIiLCBudW1iZXIudG9TdHJpbmcoKSk7Ci0gICAgICAgIAotICAgICAgICAvLyBNYWtlIHN1cmUgaXQgZGVhbHMgd2l0aCBsZWZ0IGVkZ2UgYm91bmRhcnkgY2FzZQotICAgICAgICBudW1iZXIuaW5zZXJ0KDAsICItIik7Ci0gICAgICAgIFNlbGVjdGlvbi5zZXRTZWxlY3Rpb24obnVtYmVyLCAxKTsKLSAgICAgICAgdHcuYmVmb3JlVGV4dENoYW5nZWQobnVtYmVyLCAwLCAxLCAwKTsKLSAgICAgICAgbnVtYmVyLmRlbGV0ZSgwLCAxKTsKLSAgICAgICAgdHcuYWZ0ZXJUZXh0Q2hhbmdlZChudW1iZXIpOwotICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCBpdCBkZWxldGVkIHRoZSBjaGFyYWN0ZXIgYmVmb3JlIHRoZSBoeXBoZW4gCi0gICAgICAgIGFzc2VydEVxdWFscygiNTUxLTIxMiIsIG51bWJlci50b1N0cmluZygpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2NvbS9hbmRyb2lkL2ZyYW1ld29ya3MvdGVsZXBob255dGVzdHMvVGVsZXBob255TW9ja1JpbFRlc3RSdW5uZXIuamF2YSBiL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvZnJhbWV3b3Jrcy90ZWxlcGhvbnl0ZXN0cy9UZWxlcGhvbnlNb2NrUmlsVGVzdFJ1bm5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxOTJmNTcKLS0tIC9kZXYvbnVsbAorKysgYi90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2NvbS9hbmRyb2lkL2ZyYW1ld29ya3MvdGVsZXBob255dGVzdHMvVGVsZXBob255TW9ja1JpbFRlc3RSdW5uZXIuamF2YQpAQCAtMCwwICsxLDkzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuZnJhbWV3b3Jrcy50ZWxlcGhvbnl0ZXN0czsKKworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworCitpbXBvcnQgYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RSdW5uZXI7CitpbXBvcnQgYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RTdWl0ZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5SaWxDaGFubmVsOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5tb2NrcmlsLk1vY2tSaWxUZXN0OworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKKworcHVibGljIGNsYXNzIFRlbGVwaG9ueU1vY2tSaWxUZXN0UnVubmVyIGV4dGVuZHMgSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lciB7CisKKyAgICBwdWJsaWMgUmlsQ2hhbm5lbCBtTW9ja1JpbENoYW5uZWw7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVGVzdFN1aXRlIGdldEFsbFRlc3RzKCkgeworICAgICAgICBsb2coImdldEFsbFRlc3RzIEUiKTsKKyAgICAgICAgVGVzdFN1aXRlIHN1aXRlID0gbmV3IEluc3RydW1lbnRhdGlvblRlc3RTdWl0ZSh0aGlzKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKE1vY2tSaWxUZXN0LmNsYXNzKTsKKyAgICAgICAgbG9nKCJnZXRBbGxUZXN0cyBYIik7CisgICAgICAgIHJldHVybiBzdWl0ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ2xhc3NMb2FkZXIgZ2V0TG9hZGVyKCkgeworICAgICAgICBsb2coImdldExvYWRlciBFWCIpOworICAgICAgICByZXR1cm4gVGVsZXBob255TW9ja1JpbFRlc3RSdW5uZXIuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZShCdW5kbGUgaWNpY2xlKSB7CisgICAgICAgIGxvZygib25DcmVhdGUgRSIpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgbU1vY2tSaWxDaGFubmVsID0gUmlsQ2hhbm5lbC5tYWtlUmlsQ2hhbm5lbCgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICB9CisgICAgICAgIGxvZygib25DcmVhdGUgWCIpOworCisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKGljaWNsZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25EZXN0cm95KCkgeworICAgICAgICAvLyBJJ3ZlIG5vdCBzZWVuIHRoaXMgY2FsbGVkCisgICAgICAgIGxvZygib25EZXN0cm95IEVYIik7CisgICAgICAgIHN1cGVyLm9uRGVzdHJveSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uU3RhcnQoKSB7CisgICAgICAgIC8vIENhbGxlZCB3aGVuIHRoZSBpbnN0cnVtZW50YXRpb24gdGhyZWFkIGlzIHN0YXJ0ZWQuCisgICAgICAgIC8vIEF0IHRoZSBtb21lbnQgd2UgZG9uJ3QgbmVlZCB0aGUgdGhyZWFkIHNvIHJldHVybgorICAgICAgICAvLyB3aGljaCB3aWxsIHNodXQgZG93biB0aGlzIHVudXNlZCB0aHJlYWQuCisgICAgICAgIGxvZygib25TdGFydCBFWCIpOworICAgICAgICBzdXBlci5vblN0YXJ0KCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZmluaXNoKGludCByZXN1bHRDb2RlLCBCdW5kbGUgcmVzdWx0cykgeworICAgICAgICAvLyBDYWxsZWQgd2hlbiBjb21wbGV0ZSBzbyBJIGFzayB0aGUgbU1vY2tSaWxDaGFubmVsIHRvIHF1aXQuCisgICAgICAgIGxvZygiZmluaXNoIEUiKTsKKyAgICAgICAgbU1vY2tSaWxDaGFubmVsLmNsb3NlKCk7CisgICAgICAgIGxvZygiZmluaXNoIFgiKTsKKyAgICAgICAgc3VwZXIuZmluaXNoKHJlc3VsdENvZGUsIHJlc3VsdHMpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBsb2coU3RyaW5nIHMpIHsKKyAgICAgICAgTG9nLmUoIlRlbGVwaG9ueU1vY2tSaWxUZXN0UnVubmVyIiwgcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvR3NtQWxwaGFiZXRUZXN0LmphdmEgYi90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9Hc21BbHBoYWJldFRlc3QuamF2YQppbmRleCAzYTljNTExLi5hNmI5YTJhIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9Hc21BbHBoYWJldFRlc3QuamF2YQorKysgYi90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9Hc21BbHBoYWJldFRlc3QuamF2YQpAQCAtNTEsNyArNTEsNyBAQAogICAgICAgICAvLyAnQCcgbWFwcyB0byBjaGFyIDAKICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIEdzbUFscGhhYmV0LmNoYXJUb0dzbSgnQCcpKTsKIAotICAgICAgICAvLyBgYSAoYSB3aXRoIGdyYXZlIGFjY2VudCkgbWFwcyB0byBsYXN0IEdTTSBjaGFyYXRlcgorICAgICAgICAvLyBgYSAoYSB3aXRoIGdyYXZlIGFjY2VudCkgbWFwcyB0byBsYXN0IEdTTSBjaGFyYWN0ZXIKICAgICAgICAgYXNzZXJ0RXF1YWxzKDB4N2YsIEdzbUFscGhhYmV0LmNoYXJUb0dzbSgnXHUwMGUwJykpOwogCiAgICAgICAgIC8vCmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9Hc21TbXNUZXN0LmphdmEgYi90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9Hc21TbXNUZXN0LmphdmEKaW5kZXggMzEwM2ZjMS4uMjE1YzZjZSAxMDA2NDQKLS0tIGEvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvR3NtU21zVGVzdC5qYXZhCisrKyBiL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0dzbVNtc1Rlc3QuamF2YQpAQCAtMjQsOCArMjQsNiBAQAogaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7CiBpbXBvcnQgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5hbm5vdGF0aW9uLlNtYWxsVGVzdDsKIAotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KIHB1YmxpYyBjbGFzcyBHc21TbXNUZXN0IGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlIHsKIAogICAgIEBTbWFsbFRlc3QKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L01jY1RhYmxlVGVzdC5qYXZhIGIvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvTWNjVGFibGVUZXN0LmphdmEKaW5kZXggMmQ2OTc3Yy4uN2ViM2RmOCAxMDA2NDQKLS0tIGEvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvTWNjVGFibGVUZXN0LmphdmEKKysrIGIvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvTWNjVGFibGVUZXN0LmphdmEKQEAgLTI4LDcgKzI4LDcgQEAKIAogICAgIEBTbWFsbFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0VGltZVpvbmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKE1jY1RhYmxlLmRlZmF1bHRUaW1lWm9uZUZvck1jYygyMDgpLCAiRXVyb3BlL1BhcmlzIik7CisgICAgICAgIGFzc2VydEVxdWFscyhNY2NUYWJsZS5kZWZhdWx0VGltZVpvbmVGb3JNY2MoMjA4KSwgIkVDVCIpOwogICAgICAgICBhc3NlcnRFcXVhbHMoTWNjVGFibGUuZGVmYXVsdFRpbWVab25lRm9yTWNjKDIzMiksICJFdXJvcGUvVmllbm5hIik7CiAgICAgICAgIGFzc2VydEVxdWFscyhNY2NUYWJsZS5kZWZhdWx0VGltZVpvbmVGb3JNY2MoNjU1KSwgIkFmcmljYS9Kb2hhbm5lc2J1cmciKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKE1jY1RhYmxlLmRlZmF1bHRUaW1lWm9uZUZvck1jYyg0NDApLCAiQXNpYS9Ub2t5byIpOwpkaWZmIC0tZ2l0IGEvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvUGhvbmVOdW1iZXJVdGlsc1Rlc3QuamF2YSBiL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Bob25lTnVtYmVyVXRpbHNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhhYTc4ZWYKLS0tIC9kZXYvbnVsbAorKysgYi90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9QaG9uZU51bWJlclV0aWxzVGVzdC5qYXZhCkBAIC0wLDAgKzEsNTMwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnk7CisKK2ltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOworaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlNwYW5uYWJsZVN0cmluZ0J1aWxkZXI7CitpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuUGhvbmVOdW1iZXJVdGlsczsKK2ltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5UZWxlcGhvbnlNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitwdWJsaWMgY2xhc3MgUGhvbmVOdW1iZXJVdGlsc1Rlc3QgZXh0ZW5kcyBBbmRyb2lkVGVzdENhc2UgeworCisgICAgQFNtYWxsVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFeHRyYWN0TmV0d29ya1BvcnRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgICAgICIrMTcwMDU1NTQxNDEiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdE5ldHdvcmtQb3J0aW9uKCIrMTcwMDU1NTQxNDEiKQorICAgICAgICApOworCisgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgICAgICAiKzE3MDA1NTU0MTQxIiwKKyAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbigiKzEgKDcwMCkuNTU1LTQxNDEiKQorICAgICAgICApOworCisgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgICAgICAiMTcwMDU1NTQxNDEiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdE5ldHdvcmtQb3J0aW9uKCIxICg3MDApLjU1NS00MTQxIikKKyAgICAgICAgKTsKKworICAgICAgICAvLyBUaGlzIG1heSBzZWVtIHdyb25nLCBidXQgaXQncyBwcm9iYWJseSBvaworICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICAgICAgIjE3MDA1NTU0MTQxKiMiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdE5ldHdvcmtQb3J0aW9uKCIxICg3MDApLjU1NS00MTQxKiMiKQorICAgICAgICApOworCisgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgICAgICAiMTcwMDU1NTQxTk4iLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdE5ldHdvcmtQb3J0aW9uKCIxICg3MDApLjU1NS00MU5OIikKKyAgICAgICAgKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICAgICAgIjE3MDA1NTU0MU5OIiwKKyAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbigiMSAoNzAwKS41NTUtNDFOTiwxMjM0IikKKyAgICAgICAgKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICAgICAgIjE3MDA1NTU0MU5OIiwKKyAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbigiMSAoNzAwKS41NTUtNDFOTjsxMjM0IikKKyAgICAgICAgKTsKKworICAgICAgICAvLyBBbiBNTUkgc3RyaW5nIGlzIHVucGVydGVyYmVkLCBldmVuIHRob3VnaCBpdCBjb250YWlucyBhCisgICAgICAgIC8vICh2YWxpZCBpbiB0aGlzIGNhc2UpIGVtYmVkZGVkICsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgICAgICIqKjIxKioxNzAwNTU1NDE0MSMiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdE5ldHdvcmtQb3J0aW9uKCIqKjIxKiorMTcwMDU1NTQxNDEjIikKKyAgICAgICAgICAgICAgICAvL1RPRE8gdGhpcyBpcyB0aGUgY29ycmVjdCByZXN1bHQsIGFsdGhvdWdoIHRoZSBhYm92ZQorICAgICAgICAgICAgICAgIC8vcmVzdWx0IGhhcyBiZWVuIHJldHVybmVkIHNpbmNlIGNoYW5nZSAzMTc3NgorICAgICAgICAgICAgICAgIC8vIioqMjEqKisxNzAwNTU1NDE0MSMiCisgICAgICAgICk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbigiIikpOworCisgICAgICAgIGFzc2VydEVxdWFscygiIiwgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0TmV0d29ya1BvcnRpb24oIiwxMjM0IikpOworCisgICAgICAgIGJ5dGUgW10gYiA9IG5ldyBieXRlWzIwXTsKKyAgICAgICAgYlswXSA9IChieXRlKSAweDgxOyBiWzFdID0gKGJ5dGUpIDB4NzE7IGJbMl0gPSAoYnl0ZSkgMHgwMDsgYlszXSA9IChieXRlKSAweDU1OworICAgICAgICBiWzRdID0gKGJ5dGUpIDB4MDU7IGJbNV0gPSAoYnl0ZSkgMHgyMDsgYls2XSA9IChieXRlKSAweEYwOworICAgICAgICBhc3NlcnRFcXVhbHMoIjE3MDA1NTUwMDIwIiwKKyAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2FsbGVkUGFydHlCQ0RUb1N0cmluZyhiLCAwLCA3KSk7CisKKyAgICAgICAgYlswXSA9IChieXRlKSAweDgwOyBiWzFdID0gKGJ5dGUpIDB4NzE7IGJbMl0gPSAoYnl0ZSkgMHgwMDsgYlszXSA9IChieXRlKSAweDU1OworICAgICAgICBiWzRdID0gKGJ5dGUpIDB4MDU7IGJbNV0gPSAoYnl0ZSkgMHgyMDsgYls2XSA9IChieXRlKSAweEYwOworICAgICAgICBhc3NlcnRFcXVhbHMoIjE3MDA1NTUwMDIwIiwKKyAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2FsbGVkUGFydHlCQ0RUb1N0cmluZyhiLCAwLCA3KSk7CisKKyAgICAgICAgYlswXSA9IChieXRlKSAweDkwOyBiWzFdID0gKGJ5dGUpIDB4NzE7IGJbMl0gPSAoYnl0ZSkgMHgwMDsgYlszXSA9IChieXRlKSAweDU1OworICAgICAgICBiWzRdID0gKGJ5dGUpIDB4MDU7IGJbNV0gPSAoYnl0ZSkgMHgyMDsgYls2XSA9IChieXRlKSAweEYwOworICAgICAgICBhc3NlcnRFcXVhbHMoIisxNzAwNTU1MDAyMCIsCisgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNhbGxlZFBhcnR5QkNEVG9TdHJpbmcoYiwgMCwgNykpOworCisgICAgICAgIGJbMF0gPSAoYnl0ZSkgMHg5MTsgYlsxXSA9IChieXRlKSAweDcxOyBiWzJdID0gKGJ5dGUpIDB4MDA7IGJbM10gPSAoYnl0ZSkgMHg1NTsKKyAgICAgICAgYls0XSA9IChieXRlKSAweDA1OyBiWzVdID0gKGJ5dGUpIDB4MjA7IGJbNl0gPSAoYnl0ZSkgMHhGMDsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIrMTcwMDU1NTAwMjAiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2FsbGVkUGFydHlCQ0RUb1N0cmluZyhiLCAwLCA3KSk7CisKKyAgICAgICAgYnl0ZVtdIGJSZXQgPSBQaG9uZU51bWJlclV0aWxzLm5ldHdvcmtQb3J0aW9uVG9DYWxsZWRQYXJ0eUJDRCgiKzE3MDA1NTUwMDIwIik7CisgICAgICAgIGFzc2VydEVxdWFscyg3LCBiUmV0Lmxlbmd0aCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNzsgaSsrKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoYltpXSwgYlJldFtpXSk7CisgICAgICAgIH0KKworICAgICAgICBiUmV0ID0gUGhvbmVOdW1iZXJVdGlscy5uZXR3b3JrUG9ydGlvblRvQ2FsbGVkUGFydHlCQ0RXaXRoTGVuZ3RoKCIrMTcwMDU1NTAwMjAiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDgsIGJSZXQubGVuZ3RoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGJSZXRbMF0sIDcpOworICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IDg7IGkrKykgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGJbaSAtIDFdLCBiUmV0W2ldKTsKKyAgICAgICAgfQorCisgICAgICAgIGJSZXQgPSBQaG9uZU51bWJlclV0aWxzLm5ldHdvcmtQb3J0aW9uVG9DYWxsZWRQYXJ0eUJDRCgiNzAwNTU1MDAyMCIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjcwMDU1NTAwMjAiLAorICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jYWxsZWRQYXJ0eUJDRFRvU3RyaW5nKGJSZXQsIDAsIGJSZXQubGVuZ3RoKSk7CisKKyAgICAgICAgYlswXSA9IChieXRlKSAweDgxOyBiWzFdID0gKGJ5dGUpIDB4NzE7IGJbMl0gPSAoYnl0ZSkgMHgwMDsgYlszXSA9IChieXRlKSAweDU1OworICAgICAgICBiWzRdID0gKGJ5dGUpIDB4MDU7IGJbNV0gPSAoYnl0ZSkgMHgyMDsgYls2XSA9IChieXRlKSAweEIwOworICAgICAgICBhc3NlcnRFcXVhbHMoIjE3MDA1NTUwMDIwIyIsCisgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNhbGxlZFBhcnR5QkNEVG9TdHJpbmcoYiwgMCwgNykpOworCisgICAgICAgIGJbMF0gPSAoYnl0ZSkgMHg5MTsgYlsxXSA9IChieXRlKSAweDcxOyBiWzJdID0gKGJ5dGUpIDB4MDA7IGJbM10gPSAoYnl0ZSkgMHg1NTsKKyAgICAgICAgYls0XSA9IChieXRlKSAweDA1OyBiWzVdID0gKGJ5dGUpIDB4MjA7IGJbNl0gPSAoYnl0ZSkgMHhCMDsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIrMTcwMDU1NTAwMjAjIiwKKyAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2FsbGVkUGFydHlCQ0RUb1N0cmluZyhiLCAwLCA3KSk7CisKKyAgICAgICAgYlswXSA9IChieXRlKSAweDgxOyBiWzFdID0gKGJ5dGUpIDB4MkE7IGJbMl0gPSAoYnl0ZSkgMHhCMTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIqMjEjIiwKKyAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2FsbGVkUGFydHlCQ0RUb1N0cmluZyhiLCAwLCAzKSk7CisKKyAgICAgICAgYlswXSA9IChieXRlKSAweDgxOyBiWzFdID0gKGJ5dGUpIDB4MkI7IGJbMl0gPSAoYnl0ZSkgMHhCMTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIjMjEjIiwKKyAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2FsbGVkUGFydHlCQ0RUb1N0cmluZyhiLCAwLCAzKSk7CisKKyAgICAgICAgYlswXSA9IChieXRlKSAweDkxOyBiWzFdID0gKGJ5dGUpIDB4MkE7IGJbMl0gPSAoYnl0ZSkgMHhCMTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIqMjEjKyIsCisgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNhbGxlZFBhcnR5QkNEVG9TdHJpbmcoYiwgMCwgMykpOworCisgICAgICAgIGJbMF0gPSAoYnl0ZSkgMHg4MTsgYlsxXSA9IChieXRlKSAweEFBOyBiWzJdID0gKGJ5dGUpIDB4MTI7IGJbM10gPSAoYnl0ZSkgMHhGQjsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIqKjIxIyIsCisgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNhbGxlZFBhcnR5QkNEVG9TdHJpbmcoYiwgMCwgNCkpOworCisgICAgICAgIGJbMF0gPSAoYnl0ZSkgMHg5MTsgYlsxXSA9IChieXRlKSAweEFBOyBiWzJdID0gKGJ5dGUpIDB4MTI7IGJbM10gPSAoYnl0ZSkgMHhGQjsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIqKjIxIysiLAorICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jYWxsZWRQYXJ0eUJDRFRvU3RyaW5nKGIsIDAsIDQpKTsKKworICAgICAgICBiWzBdID0gKGJ5dGUpIDB4ODE7IGJbMV0gPSAoYnl0ZSkgMHg5QTsgYlsyXSA9IChieXRlKSAweEE5OyBiWzNdID0gKGJ5dGUpIDB4NzE7CisgICAgICAgIGJbNF0gPSAoYnl0ZSkgMHgwMDsgYls1XSA9IChieXRlKSAweDU1OyBiWzZdID0gKGJ5dGUpIDB4MDU7IGJbN10gPSAoYnl0ZSkgMHgyMDsKKyAgICAgICAgYls4XSA9IChieXRlKSAweEIwOworICAgICAgICBhc3NlcnRFcXVhbHMoIio5OSoxNzAwNTU1MDAyMCMiLAorICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jYWxsZWRQYXJ0eUJDRFRvU3RyaW5nKGIsIDAsIDkpKTsKKworICAgICAgICBiWzBdID0gKGJ5dGUpIDB4OTE7IGJbMV0gPSAoYnl0ZSkgMHg5QTsgYlsyXSA9IChieXRlKSAweEE5OyBiWzNdID0gKGJ5dGUpIDB4NzE7CisgICAgICAgIGJbNF0gPSAoYnl0ZSkgMHgwMDsgYls1XSA9IChieXRlKSAweDU1OyBiWzZdID0gKGJ5dGUpIDB4MDU7IGJbN10gPSAoYnl0ZSkgMHgyMDsKKyAgICAgICAgYls4XSA9IChieXRlKSAweEIwOworICAgICAgICBhc3NlcnRFcXVhbHMoIio5OSorMTcwMDU1NTAwMjAjIiwKKyAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2FsbGVkUGFydHlCQ0RUb1N0cmluZyhiLCAwLCA5KSk7CisKKyAgICAgICAgYlswXSA9IChieXRlKSAweDgxOyBiWzFdID0gKGJ5dGUpIDB4QUE7IGJbMl0gPSAoYnl0ZSkgMHgxMjsgYlszXSA9IChieXRlKSAweDFBOworICAgICAgICBiWzRdID0gKGJ5dGUpIDB4MDc7IGJbNV0gPSAoYnl0ZSkgMHg1MDsgYls2XSA9IChieXRlKSAweDU1OyBiWzddID0gKGJ5dGUpIDB4MDA7CisgICAgICAgIGJbOF0gPSAoYnl0ZSkgMHgwMjsgYls5XSA9IChieXRlKSAweEZCOworICAgICAgICBhc3NlcnRFcXVhbHMoIioqMjEqMTcwMDU1NTAwMjAjIiwKKyAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2FsbGVkUGFydHlCQ0RUb1N0cmluZyhiLCAwLCAxMCkpOworCisgICAgICAgIGJbMF0gPSAoYnl0ZSkgMHg5MTsgYlsxXSA9IChieXRlKSAweEFBOyBiWzJdID0gKGJ5dGUpIDB4MTI7IGJbM10gPSAoYnl0ZSkgMHgxQTsKKyAgICAgICAgYls0XSA9IChieXRlKSAweDA3OyBiWzVdID0gKGJ5dGUpIDB4NTA7IGJbNl0gPSAoYnl0ZSkgMHg1NTsgYls3XSA9IChieXRlKSAweDAwOworICAgICAgICBiWzhdID0gKGJ5dGUpIDB4MDI7IGJbOV0gPSAoYnl0ZSkgMHhGQjsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIqKjIxKisxNzAwNTU1MDAyMCMiLAorICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jYWxsZWRQYXJ0eUJDRFRvU3RyaW5nKGIsIDAsIDEwKSk7CisKKyAgICAgICAgYlswXSA9IChieXRlKSAweDgxOyBiWzFdID0gKGJ5dGUpIDB4MkE7IGJbMl0gPSAoYnl0ZSkgMHhBMTsgYlszXSA9IChieXRlKSAweDcxOworICAgICAgICBiWzRdID0gKGJ5dGUpIDB4MDA7IGJbNV0gPSAoYnl0ZSkgMHg1NTsgYls2XSA9IChieXRlKSAweDA1OyBiWzddID0gKGJ5dGUpIDB4MjA7CisgICAgICAgIGJbOF0gPSAoYnl0ZSkgMHhGMDsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIqMjEqMTcwMDU1NTAwMjAiLAorICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jYWxsZWRQYXJ0eUJDRFRvU3RyaW5nKGIsIDAsIDkpKTsKKworICAgICAgICBiWzBdID0gKGJ5dGUpIDB4OTE7IGJbMV0gPSAoYnl0ZSkgMHgyQTsgYlsyXSA9IChieXRlKSAweEIxOyBiWzNdID0gKGJ5dGUpIDB4NzE7CisgICAgICAgIGJbNF0gPSAoYnl0ZSkgMHgwMDsgYls1XSA9IChieXRlKSAweDU1OyBiWzZdID0gKGJ5dGUpIDB4MDU7IGJbN10gPSAoYnl0ZSkgMHgyMDsKKyAgICAgICAgYls4XSA9IChieXRlKSAweEYwOworICAgICAgICBhc3NlcnRFcXVhbHMoIioyMSMrMTcwMDU1NTAwMjAiLAorICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jYWxsZWRQYXJ0eUJDRFRvU3RyaW5nKGIsIDAsIDkpKTsKKworICAgICAgICBhc3NlcnROdWxsKFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdE5ldHdvcmtQb3J0aW9uKG51bGwpKTsKKyAgICAgICAgYXNzZXJ0TnVsbChQaG9uZU51bWJlclV0aWxzLmV4dHJhY3RQb3N0RGlhbFBvcnRpb24obnVsbCkpOworICAgICAgICBhc3NlcnRUcnVlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZShudWxsLCBudWxsKSk7CisgICAgICAgIGFzc2VydEZhbHNlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZShudWxsLCAiMTIzIikpOworICAgICAgICBhc3NlcnRGYWxzZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIjEyMyIsIG51bGwpKTsKKyAgICAgICAgYXNzZXJ0TnVsbChQaG9uZU51bWJlclV0aWxzLnRvQ2FsbGVySURNaW5NYXRjaChudWxsKSk7CisgICAgICAgIGFzc2VydE51bGwoUGhvbmVOdW1iZXJVdGlscy5nZXRTdHJpcHBlZFJldmVyc2VkKG51bGwpKTsKKyAgICAgICAgYXNzZXJ0TnVsbChQaG9uZU51bWJlclV0aWxzLnN0cmluZ0Zyb21TdHJpbmdBbmRUT0EobnVsbCwgMSkpOworICAgIH0KKworICAgIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXh0cmFjdE5ldHdvcmtQb3J0aW9uQWx0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgICAgICAiKzE3MDA1NTU0MTQxIiwKKyAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbkFsdCgiKzE3MDA1NTU0MTQxIikKKyAgICAgICAgKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICAgICAgIisxNzAwNTU1NDE0MSIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0TmV0d29ya1BvcnRpb25BbHQoIisxICg3MDApLjU1NS00MTQxIikKKyAgICAgICAgKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICAgICAgIjE3MDA1NTU0MTQxIiwKKyAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbkFsdCgiMSAoNzAwKS41NTUtNDE0MSIpCisgICAgICAgICk7CisKKyAgICAgICAgLy8gVGhpcyBtYXkgc2VlbSB3cm9uZywgYnV0IGl0J3MgcHJvYmFibHkgb2sKKyAgICAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgICAgICIxNzAwNTU1NDE0MSojIiwKKyAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbkFsdCgiMSAoNzAwKS41NTUtNDE0MSojIikKKyAgICAgICAgKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICAgICAgIjE3MDA1NTU0MU5OIiwKKyAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbkFsdCgiMSAoNzAwKS41NTUtNDFOTiIpCisgICAgICAgICk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgICAgICIxNzAwNTU1NDFOTiIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0TmV0d29ya1BvcnRpb25BbHQoIjEgKDcwMCkuNTU1LTQxTk4sMTIzNCIpCisgICAgICAgICk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgICAgICIxNzAwNTU1NDFOTiIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0TmV0d29ya1BvcnRpb25BbHQoIjEgKDcwMCkuNTU1LTQxTk47MTIzNCIpCisgICAgICAgICk7CisKKyAgICAgICAgLy8gQW4gTU1JIHN0cmluZyBpcyB1bnBlcnRlcmJlZCwgZXZlbiB0aG91Z2ggaXQgY29udGFpbnMgYQorICAgICAgICAvLyAodmFsaWQgaW4gdGhpcyBjYXNlKSBlbWJlZGRlZCArCisgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgICAgICAiKioyMSoqKzE3MDA1NTU0MTQxIyIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0TmV0d29ya1BvcnRpb25BbHQoIioqMjEqKisxNzAwNTU1NDE0MSMiKQorICAgICAgICApOworCisgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgICAgICAiKjMxIys0NDc5NjYxNjQyMDgiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdE5ldHdvcmtQb3J0aW9uQWx0KCIqMzEjKzQ0Nzk2NjE2NDIwOCIpCisgICAgICAgICk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgICAgICIqMzEjKzQ0Nzk2NjE2NDIwOCIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0TmV0d29ya1BvcnRpb25BbHQoIiozMSMgKCs0NCkgNzkgNjYxNiA0MjA4IikKKyAgICAgICAgKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdE5ldHdvcmtQb3J0aW9uQWx0KCIiKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbkFsdCgiLDEyMzQiKSk7CisKKyAgICAgICAgYXNzZXJ0TnVsbChQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbkFsdChudWxsKSk7CisgICAgfQorCisgICAgQFNtYWxsVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydEVxdWFscygiIiwgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0UG9zdERpYWxQb3J0aW9uKCIrMTcwMDU1NTQxNDEiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiIiwgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0UG9zdERpYWxQb3J0aW9uKCIrMSAoNzAwKS41NTUtNDE0MSIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3RQb3N0RGlhbFBvcnRpb24oIisxICg3MDApLjU1NS00MU5OIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIiwxMjM0IiwgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0UG9zdERpYWxQb3J0aW9uKCIrMSAoNzAwKS41NTUtNDFOTiwxMjM0IikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjsxMjM0IiwgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0UG9zdERpYWxQb3J0aW9uKCIrMSAoNzAwKS41NTUtNDFOTjsxMjM0IikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjsxMjM0LDtOIiwKKyAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3RQb3N0RGlhbFBvcnRpb24oIisxICg3MDApLjU1NS00MU5OOzEtMi4zNCAsO04iKSk7CisgICAgfQorCisgICAgQFNtYWxsVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb21wYXJlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIHRoaXMgaXMgb2RkCisgICAgICAgIGFzc2VydEZhbHNlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiIiwgIiIpKTsKKworICAgICAgICBhc3NlcnRUcnVlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiOTExIiwgIjkxMSIpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCI5MTEiLCAiMTgwMDU1NTA5MTEiKSk7CisgICAgICAgIGFzc2VydFRydWUoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCI1NTU1IiwgIjU1NTUiKSk7CisgICAgICAgIGFzc2VydEZhbHNlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiNTU1NSIsICIxODAwNTU1NTU1NTUiKSk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIisxNzAwNTU1NDE0MSIsICIrMTcwMDU1NTQxNDEiKSk7CisgICAgICAgIGFzc2VydFRydWUoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIrMTcwMDU1NTQxNDEiLCAiKzEgKDcwMCkuNTU1LTQxNDEiKSk7CisgICAgICAgIGFzc2VydFRydWUoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIrMTcwMDU1NTQxNDEiLCAiKzEgKDcwMCkuNTU1LTQxNDEsMTIzNCIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIisxNzAwNTU1NDE0MSIsICIxNzAwNTU1NDE0MSIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIisxNzAwNTU1NDE0MSIsICI3MDA1NTU0MTQxIikpOworICAgICAgICBhc3NlcnRUcnVlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiKzE3MDA1NTU0MTQxIiwgIjU1NTQxNDEiKSk7CisgICAgICAgIGFzc2VydFRydWUoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIxNzAwNTU1NDE0MSIsICI1NTU0MTQxIikpOworICAgICAgICBhc3NlcnRUcnVlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiKzE3MDA1NTU0MTQxIiwgIjAxMTE3MDA1NTU0MTQxIikpOworICAgICAgICBhc3NlcnRUcnVlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiKzE3MDA1NTU0MTQxIiwgIjAwMTcwMDU1NTQxNDEiKSk7CisgICAgICAgIGFzc2VydFRydWUoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIxNzAwNTU1NDE0MSIsICIwMDE3MDA1NTU0MTQxIikpOworCisKKyAgICAgICAgYXNzZXJ0VHJ1ZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIisxNzAwNTU1NDE0MSIsICIqKjMxIysxNzAwNTU1NDE0MSIpKTsKKworICAgICAgICBhc3NlcnRGYWxzZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIisxIDk5OSA3MDA1NTU0MTQxIiwgIisxIDcwMDU1NTQxNDEiKSk7CisgICAgICAgIGFzc2VydFRydWUoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIwMTEgMSA3MDA1NTU0MTQxIiwgIjcwMDU1NTQxNDEiKSk7CisKKyAgICAgICAgYXNzZXJ0RmFsc2UoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIwMTEgMTEgNzAwNTU1NDE0MSIsICIrMTcwMDU1NTQxNDEiKSk7CisKKyAgICAgICAgYXNzZXJ0RmFsc2UoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIrMTcwMDU1NTQxNDEiLCAiNzA4NTg4MjMwMCIpKTsKKworICAgICAgICBhc3NlcnRUcnVlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiKzQ0IDIwNyA3OTIgMzQ5MCIsICIwIDIwNyA3OTIgMzQ5MCIpKTsKKworICAgICAgICBhc3NlcnRGYWxzZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIis0NCAyMDcgNzkyIDM0OTAiLCAiMDAgMjA3IDc5MiAzNDkwIikpOworICAgICAgICBhc3NlcnRGYWxzZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIis0NCAyMDcgNzkyIDM0OTAiLCAiMDExIDIwNyA3OTIgMzQ5MCIpKTsKKworICAgICAgICAvKioqKiogRklYTUUncyAqKioqKiovCisgICAgICAgIC8vCisgICAgICAgIC8vIE1NSSBoZWFkZXIgc2hvdWxkIGJlIGlnbm9yZWQKKyAgICAgICAgYXNzZXJ0RmFsc2UoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIrMTcwMDU1NTQxNDEiLCAiKiozMSMxNzAwNTU1NDE0MSIpKTsKKworICAgICAgICAvLyBJdCdzIHRvbyBiYWQgdGhpcyBpcyBmYWxzZQorICAgICAgICAvLyArNDQgKDApIDIwNyA3OTIgMzQ5MCBpcyBub3QgYSBkaWFsYWJsZSBudW1iZXIKKyAgICAgICAgLy8gYnV0IGl0IGlzIGNvbW1vbmx5IGhvdyBFdXJvcGVhbiBwaG9uZSBudW1iZXJzIGFyZSB3cml0dGVuCisgICAgICAgIGFzc2VydEZhbHNlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiKzQ0IDIwNyA3OTIgMzQ5MCIsICIrNDQgKDApIDIwNyA3OTIgMzQ5MCIpKTsKKworICAgICAgICAvLyBUaGUgamFwYW5lc2UgaW50ZXJuYXRpb25hbCBwcmVmaXgsIGZvciBleGFtcGxlLCBtZXNzZXMgdXMgdXAKKyAgICAgICAgLy8gQnV0IHdobyB1c2VzIGEgR1NNIHBob25lIGluIEphcGFuPworICAgICAgICBhc3NlcnRGYWxzZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIis0NCAyMDcgNzkyIDM0OTAiLCAiMDEwIDQ0IDIwNyA3OTIgMzQ5MCIpKTsKKworICAgICAgICAvLyBUaGUgQXVzdHJhbGlhbiBvbmUgbWVzc2VzIHVzIHVwIHRvbworICAgICAgICBhc3NlcnRGYWxzZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIis0NCAyMDcgNzkyIDM0OTAiLCAiMDAxMSA0NCAyMDcgNzkyIDM0OTAiKSk7CisKKyAgICAgICAgLy8gVGhlIFJ1c3NpYW4gdHJ1bmsgcHJlZml4IG1lc3NlcyB1cyB1cCwgYXMgZG9lcyBjdXJyZW50CisgICAgICAgIC8vIFJ1c3NpYW4gYXJlYSBjb2RlcyAod2hpY2ggYmVpbiB3aXRoIDApCisKKyAgICAgICAgYXNzZXJ0RmFsc2UoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIrNygwOTUpOTEwMDc2NiIsICI4KDA5NSk5MTAwNzY2IikpOworCisgICAgICAgIC8vIDQ0NCBpcyBub3QgYSB2YWxpZCBjb3VudHJ5IGNvZGUsIGJ1dAorICAgICAgICAvLyBtYXRjaEludGxQcmVmaXhBbmRDQyBkb2VzbnQga25vdyB0aGlzCisgICAgICAgIGFzc2VydFRydWUoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIrNDQ0IDIwNyA3OTIgMzQ5MCIsICIwIDIwNyA3OTIgMzQ5MCIpKTsKKworICAgICAgICAvLyBjb21wYXJlIFNNUyBzaG9ydCBjb2RlCisgICAgICAgIGFzc2VydFRydWUoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCI0MDQtMDQiLCAiNDA0MDQiKSk7CisgICAgfQorCisKKyAgICBAU21hbGxUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFRvQ2FsbGVySURJbmRleGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIxNDE0NTU1IiwgUGhvbmVOdW1iZXJVdGlscy50b0NhbGxlcklETWluTWF0Y2goIjE3MDA1NTU0MTQxIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjE0MTQ1NTUiLCBQaG9uZU51bWJlclV0aWxzLnRvQ2FsbGVySURNaW5NYXRjaCgiMS03MDAtNTU1LTQxNDEiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiMTQxNDU1NSIsIFBob25lTnVtYmVyVXRpbHMudG9DYWxsZXJJRE1pbk1hdGNoKCIxLTcwMC01NTUtNDE0MSwxMjM0IikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjE0MTQ1NTUiLCBQaG9uZU51bWJlclV0aWxzLnRvQ2FsbGVySURNaW5NYXRjaCgiMS03MDAtNTU1LTQxNDE7MTIzNCIpKTsKKworICAgICAgICAvL3RoaXMgc2VlbXMgd3JvbmcsIG9yIGF0IGxlYXN0IHVzZWxlc3MKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJOTjE0NTU1IiwgUGhvbmVOdW1iZXJVdGlscy50b0NhbGxlcklETWluTWF0Y2goIjEtNzAwLTU1NS00MU5OIikpOworCisgICAgICAgIC8vPHNocnVnPiAtLSB0aGVzZSBhcmUgYWxsIG5vdCB1c2VmdWwsIGJ1dCBub3QgdGVycmlibHkgd3JvbmcKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBQaG9uZU51bWJlclV0aWxzLnRvQ2FsbGVySURNaW5NYXRjaCgiIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjAwMzIiLCBQaG9uZU51bWJlclV0aWxzLnRvQ2FsbGVySURNaW5NYXRjaCgiMjMwMCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIwMDMyKyIsIFBob25lTnVtYmVyVXRpbHMudG9DYWxsZXJJRE1pbk1hdGNoKCIrMjMwMCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIjMTMwIyoiLCBQaG9uZU51bWJlclV0aWxzLnRvQ2FsbGVySURNaW5NYXRjaCgiKiMwMzEjIikpOworICAgIH0KKworICAgIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0SW5kZXhhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydEVxdWFscygiMTQxNDU1NTAwNzEiLCBQaG9uZU51bWJlclV0aWxzLmdldFN0cmlwcGVkUmV2ZXJzZWQoIjEtNzAwLTU1NS00MTQxIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjE0MTQ1NTUwMDcxIiwgUGhvbmVOdW1iZXJVdGlscy5nZXRTdHJpcHBlZFJldmVyc2VkKCIxLTcwMC01NTUtNDE0MSwxMjM0IikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjE0MTQ1NTUwMDcxIiwgUGhvbmVOdW1iZXJVdGlscy5nZXRTdHJpcHBlZFJldmVyc2VkKCIxLTcwMC01NTUtNDE0MTsxMjM0IikpOworCisgICAgICAgIC8vdGhpcyBzZWVtcyB3cm9uZywgb3IgYXQgbGVhc3QgdXNlbGVzcworICAgICAgICBhc3NlcnRFcXVhbHMoIk5OMTQ1NTUwMDcxIiwgUGhvbmVOdW1iZXJVdGlscy5nZXRTdHJpcHBlZFJldmVyc2VkKCIxLTcwMC01NTUtNDFOTiIpKTsKKworICAgICAgICAvLzxzaHJ1Zz4gLS0gdGhlc2UgYXJlIGFsbCBub3QgdXNlZnVsLCBidXQgbm90IHRlcnJpYmx5IHdyb25nCisgICAgICAgIGFzc2VydEVxdWFscygiIiwgUGhvbmVOdW1iZXJVdGlscy5nZXRTdHJpcHBlZFJldmVyc2VkKCIiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiMDAzMiIsIFBob25lTnVtYmVyVXRpbHMuZ2V0U3RyaXBwZWRSZXZlcnNlZCgiMjMwMCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIwMDMyKyIsIFBob25lTnVtYmVyVXRpbHMuZ2V0U3RyaXBwZWRSZXZlcnNlZCgiKzIzMDAiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiIzEzMCMqIiwgUGhvbmVOdW1iZXJVdGlscy5nZXRTdHJpcHBlZFJldmVyc2VkKCIqIzAzMSMiKSk7CisgICAgfQorCisgICAgQFNtYWxsVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROYW5wRm9ybWF0dGluZygpIHsKKyAgICAgICAgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlciBudW1iZXIgPSBuZXcgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcigpOworICAgICAgICBudW1iZXIuYXBwZW5kKCI4MDA1NTUxMjEyIik7CisgICAgICAgIFBob25lTnVtYmVyVXRpbHMuZm9ybWF0TmFucE51bWJlcihudW1iZXIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjgwMC01NTUtMTIxMiIsIG51bWJlci50b1N0cmluZygpKTsKKworICAgICAgICBudW1iZXIuY2xlYXIoKTsKKyAgICAgICAgbnVtYmVyLmFwcGVuZCgiODAwNTU1MTIxIik7CisgICAgICAgIFBob25lTnVtYmVyVXRpbHMuZm9ybWF0TmFucE51bWJlcihudW1iZXIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjgwMC01NTUtMTIxIiwgbnVtYmVyLnRvU3RyaW5nKCkpOworCisgICAgICAgIG51bWJlci5jbGVhcigpOworICAgICAgICBudW1iZXIuYXBwZW5kKCI1NTUtMTIxMiIpOworICAgICAgICBQaG9uZU51bWJlclV0aWxzLmZvcm1hdE5hbnBOdW1iZXIobnVtYmVyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCI1NTUtMTIxMiIsIG51bWJlci50b1N0cmluZygpKTsKKworICAgICAgICBudW1iZXIuY2xlYXIoKTsKKyAgICAgICAgbnVtYmVyLmFwcGVuZCgiODAwLTU1NTEyIik7CisgICAgICAgIFBob25lTnVtYmVyVXRpbHMuZm9ybWF0TmFucE51bWJlcihudW1iZXIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjgwMC01NTUtMTIiLCBudW1iZXIudG9TdHJpbmcoKSk7CisKKyAgICAgICAgbnVtYmVyLmNsZWFyKCk7CisgICAgICAgIG51bWJlci5hcHBlbmQoIjQ2NjQ1Iik7CisgICAgICAgIFBob25lTnVtYmVyVXRpbHMuZm9ybWF0TmFucE51bWJlcihudW1iZXIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjQ2NjQ1IiwgbnVtYmVyLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29udmVydEtleXBhZExldHRlcnNUb0RpZ2l0cygpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIxLTgwMC00NjY0LTQxMSIsCisgICAgICAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNvbnZlcnRLZXlwYWRMZXR0ZXJzVG9EaWdpdHMoIjEtODAwLUdPT0ctNDExIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjE4MDA0NjY0NDExIiwKKyAgICAgICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY29udmVydEtleXBhZExldHRlcnNUb0RpZ2l0cygiMTgwMEdPT0c0MTEiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiMS04MDAtNDY2LTQ0MTEiLAorICAgICAgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jb252ZXJ0S2V5cGFkTGV0dGVyc1RvRGlnaXRzKCIxLTgwMC00NjYtNDQxMSIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIxODAwNDY2NDQxMSIsCisgICAgICAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNvbnZlcnRLZXlwYWRMZXR0ZXJzVG9EaWdpdHMoIjE4MDA0NjY0NDExIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjIyMi0zMzMtNDQ0LTU1NS02NjYtNzc3Ny04ODgtOTk5OSIsCisgICAgICAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNvbnZlcnRLZXlwYWRMZXR0ZXJzVG9EaWdpdHMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBQkMtREVGLUdISS1KS0wtTU5PLVBRUlMtVFVWLVdYWVoiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiMjIyLTMzMy00NDQtNTU1LTY2Ni03Nzc3LTg4OC05OTk5IiwKKyAgICAgICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY29udmVydEtleXBhZExldHRlcnNUb0RpZ2l0cygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFiYy1kZWYtZ2hpLWprbC1tbm8tcHFycy10dXYtd3h5eiIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIoODAwKSAyMjItMzMzNCIsCisgICAgICAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNvbnZlcnRLZXlwYWRMZXR0ZXJzVG9EaWdpdHMoIig4MDApIEFCQy1ERUZHIikpOworICAgIH0KKworICAgIC8vIFRvIHJ1biB0aGlzIHRlc3QsIHRoZSBkZXZpY2UgaGFzIHRvIGJlIHJlZ2lzdGVyZWQgd2l0aCBuZXR3b3JrCisgICAgcHVibGljIHZvaWQgdGVzdENoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoIjAxMTg0NzU3OTcwMDAiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCIrODQ3NTc5NzAwMCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIxODQ3NTc5NzAwMCIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUoIisxODQ3NTc5NzAwMCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIwMTExMjM0NTY3IiwKKyAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZSgiKzEyMzQ1NjciKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiMDExMjM0NTY3MDAwMDAiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCIrMjM0NTY3MDAwMDAiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiMDExMTE4NzU3Njc4MDAiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCIrMTE4NzU3Njc4MDAiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiODQ3NTc5NzAwMCwxODQ3NTIzMTc1MyIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUoIjg0NzU3OTcwMDAsKzE4NDc1MjMxNzUzIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjAxMTg0NzU3OTcwMDAsMTg0NzUyMzE3NTMiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCIrODQ3NTc5NzAwMCwrMTg0NzUyMzE3NTMiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiODQ3NTc5NzAwMDswMTE4NDY5MzEyMzQ1IiwKKyAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZSgiODQ3NTc5NzAwMDsrODQ2OTMxMjM0NSIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCI4NDc1Nzk3MDAwLDAxMTEyMzQ1NjciLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCI4NDc1Nzk3MDAwLCsxMjM0NTY3IikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjg0NzU5NzAwMDswMTExMTg3NTc2NzAwMCIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUoIjg0NzU5NzAwMDsrMTE4NzU3NjcwMDAiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiODQ3NTc5NzAwMCwsMDExODQ2OTMxMjM0NSIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUoIjg0NzU3OTcwMDAsLCs4NDY5MzEyMzQ1IikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjg0NzU3OTcwMDA7LDAxMTg0NjkzMTIzNDUiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCI4NDc1Nzk3MDAwOywrODQ2OTMxMjM0NSIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCI4NDc1Nzk3MDAwLDsxODQ3NTIzMTc1MyIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUoIjg0NzU3OTcwMDAsOysxODQ3NTIzMTc1MyIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCI4NDc1Nzk3MDAwOywwMTExMTg3NTc2NzAwMCIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUoIjg0NzU3OTcwMDA7LCsxMTg3NTc2NzAwMCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCI4NDc1Nzk3MDAwLDswMTExMTg3NTc2NzAwMCIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUoIjg0NzU3OTcwMDAsOysxMTg3NTc2NzAwMCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCI4NDc1Nzk3MDAwLCwsMDExMTE4NzU3NjcwMDAiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCI4NDc1Nzk3MDAwLCwsKzExODc1NzY3MDAwIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjg0NzU3OTcwMDA7LCwwMTExMTg3NTc2NzAwMCIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUoIjg0NzU3OTcwMDA7LCwrMTE4NzU3NjcwMDAiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiKzssODQ3NTc5NzAwMCIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUoIis7LDg0NzU3OTcwMDAiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiODQ3NTc5NzAwMCwiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCI4NDc1Nzk3MDAwLCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCI4NDcrNTc5LTcwMDAiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCI4NDcrNTc5LTcwMDAiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiLDg0NzU3OTcwMDAiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCIsODQ3NTc5NzAwMCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCI7Ozg0NzU3OTcwMDAsLCIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUoIjs7ODQ3NTc5NzAwMCwsIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIit0aGlzK2lzJHdlaXJkOywrIiwKKyAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZSgiK3RoaXMraXMkd2VpcmQ7LCsiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiIiwKKyAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZSgiIikpOworICAgICAgICBhc3NlcnROdWxsKFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKG51bGwpKTsKKyAgICB9CisKKyAgICBAU21hbGxUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlQnlOdW1iZXJGb3JtYXQoKSB7CisgICAgICAgIGFzc2VydEVxdWFscygiMTg0NzU3OTcwMDAiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlQnlOdW1iZXJGb3JtYXQoIisxODQ3NTc5NzAwMCIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5GT1JNQVRfTkFOUCxQaG9uZU51bWJlclV0aWxzLkZPUk1BVF9OQU5QKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiKzE4NDc1Nzk3MDAwIiwKKyAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZUJ5TnVtYmVyRm9ybWF0KCIrMTg0NzU3OTcwMDAiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuRk9STUFUX05BTlAsUGhvbmVOdW1iZXJVdGlscy5GT1JNQVRfSkFQQU4pKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIrMTg0NzU3OTcwMDAiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlQnlOdW1iZXJGb3JtYXQoIisxODQ3NTc5NzAwMCIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5GT1JNQVRfTkFOUCxQaG9uZU51bWJlclV0aWxzLkZPUk1BVF9VTktOT1dOKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiKzE4NDc1Nzk3MDAwIiwKKyAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZUJ5TnVtYmVyRm9ybWF0KCIrMTg0NzU3OTcwMDAiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuRk9STUFUX0pBUEFOLFBob25lTnVtYmVyVXRpbHMuRk9STUFUX0pBUEFOKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiKzE4NDc1Nzk3MDAwIiwKKyAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZUJ5TnVtYmVyRm9ybWF0KCIrMTg0NzU3OTcwMDAiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuRk9STUFUX1VOS05PV04sUGhvbmVOdW1iZXJVdGlscy5GT1JNQVRfVU5LTk9XTikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEJhc2ljIGNoZWNrcyBmb3IgdGhlIFZvaWNlTWFpbCBudW1iZXIuCisgICAgICovCisgICAgQFNtYWxsVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RXaXRoTnVtYmVyTm90RXF1YWxUb1ZvaWNlTWFpbCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnRGYWxzZShQaG9uZU51bWJlclV0aWxzLmlzVm9pY2VNYWlsTnVtYmVyKCI5MTEiKSk7CisgICAgICAgIGFzc2VydEZhbHNlKFBob25lTnVtYmVyVXRpbHMuaXNWb2ljZU1haWxOdW1iZXIoInRlbDo5MTEiKSk7CisgICAgICAgIGFzc2VydEZhbHNlKFBob25lTnVtYmVyVXRpbHMuaXNWb2ljZU1haWxOdW1iZXIoIisxODAwMTIzNDU2NyIpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoUGhvbmVOdW1iZXJVdGlscy5pc1ZvaWNlTWFpbE51bWJlcigiIikpOworICAgICAgICBhc3NlcnRGYWxzZShQaG9uZU51bWJlclV0aWxzLmlzVm9pY2VNYWlsTnVtYmVyKG51bGwpKTsKKyAgICAgICAgLy8gVGhpcyB0ZXN0IGZhaWxzIG9uIGEgZGV2aWNlIHdpdGhvdXQgYSBzaW0gY2FyZAorICAgICAgICAvKlRlbGVwaG9ueU1hbmFnZXIgbVRlbGVwaG9ueU1hbmFnZXIgPQorICAgICAgICAgICAgKFRlbGVwaG9ueU1hbmFnZXIpZ2V0Q29udGV4dCgpLmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5URUxFUEhPTllfU0VSVklDRSk7CisgICAgICAgIFN0cmluZyBtVm9pY2VNYWlsTnVtYmVyID0gbVRlbGVwaG9ueU1hbmFnZXIuZ2V0RGVmYXVsdCgpLmdldFZvaWNlTWFpbE51bWJlcigpOworICAgICAgICBhc3NlcnRUcnVlKFBob25lTnVtYmVyVXRpbHMuaXNWb2ljZU1haWxOdW1iZXIobVZvaWNlTWFpbE51bWJlcikpOworICAgICAgICAqLworICAgIH0KKworICAgIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Rm9ybWF0TnVtYmVyVG9FMTY0KCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoIisxNjUwMjkxMDAwMCIsIFBob25lTnVtYmVyVXRpbHMuZm9ybWF0TnVtYmVyVG9FMTY0KCI2NTAgMjkxMDAwMCIsICJ1cyIpKTsKKyAgICAgICAgYXNzZXJ0TnVsbChQaG9uZU51bWJlclV0aWxzLmZvcm1hdE51bWJlclRvRTE2NCgiMTIzNDU2NyIsICJ1cyIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIrMTgwMDQ2NjQxMTQiLCBQaG9uZU51bWJlclV0aWxzLmZvcm1hdE51bWJlclRvRTE2NCgiODAwLUdPT0ctMTE0IiwgInVzIikpOworICAgIH0KKworICAgIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Rm9ybWF0TnVtYmVyKCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoIig2NTApIDI5MS0wMDAwIiwgUGhvbmVOdW1iZXJVdGlscy5mb3JtYXROdW1iZXIoIjY1MCAyOTEwMDAwIiwgInVzIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjEyMy00NTY3IiwgUGhvbmVOdW1iZXJVdGlscy5mb3JtYXROdW1iZXIoIjEyMzQ1NjciLCAidXMiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiKDgwMCkgNDY2LTQxMTQiLCBQaG9uZU51bWJlclV0aWxzLmZvcm1hdE51bWJlcigiODAwLUdPT0ctMTE0IiwgInVzIikpOworCisgICAgfQorCisgICAgQFNtYWxsVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROb3JtYWxpemVOdW1iZXIoKSB7CisgICAgICAgIGFzc2VydEVxdWFscygiNjUwMjkxMDAwMCIsIFBob25lTnVtYmVyVXRpbHMubm9ybWFsaXplTnVtYmVyKCI2NTAgMjkxMDAwMCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIxMjM0NTY3IiwgUGhvbmVOdW1iZXJVdGlscy5ub3JtYWxpemVOdW1iZXIoIjEyLDMjNCo1NjciKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiODAwNDY2NDExNCIsIFBob25lTnVtYmVyVXRpbHMubm9ybWFsaXplTnVtYmVyKCI4MDAtR09PRy0xMTQiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiKzE2NTAyOTEwMDAwIiwgUGhvbmVOdW1iZXJVdGlscy5ub3JtYWxpemVOdW1iZXIoIisxIDY1MCAyOTEwMDAwIikpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvUGhvbmVOdW1iZXJXYXRjaGVyVGVzdC5qYXZhIGIvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvUGhvbmVOdW1iZXJXYXRjaGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyZTU3M2MKLS0tIC9kZXYvbnVsbAorKysgYi90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9QaG9uZU51bWJlcldhdGNoZXJUZXN0LmphdmEKQEAgLTAsMCArMSwyMTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnk7CisKK2ltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5QaG9uZU51bWJlckZvcm1hdHRpbmdUZXh0V2F0Y2hlcjsKK2ltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOworaW1wb3J0IGFuZHJvaWQudGV4dC5FZGl0YWJsZTsKK2ltcG9ydCBhbmRyb2lkLnRleHQuU2VsZWN0aW9uOworaW1wb3J0IGFuZHJvaWQudGV4dC5TcGFubmFibGVTdHJpbmdCdWlsZGVyOworaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0V2F0Y2hlcjsKKworcHVibGljIGNsYXNzIFBob25lTnVtYmVyV2F0Y2hlclRlc3QgZXh0ZW5kcyBBbmRyb2lkVGVzdENhc2UgeworICAgIHB1YmxpYyB2b2lkIHRlc3RBcHBlbmRDaGFycygpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIG11bHRpQ2hhcnMgPSAiNjUwMTIzNDUiOworICAgICAgICBmaW5hbCBTdHJpbmcgZm9ybWF0dGVkMSA9ICIoNjUwKSAxMjMtNDUiOworICAgICAgICBUZXh0V2F0Y2hlciB0ZXh0V2F0Y2hlciA9IGdldFRleHRXYXRjaGVyKCk7CisgICAgICAgIFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIgbnVtYmVyID0gbmV3IFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgLy8gQXBwZW5kIG1vcmUgdGhhbiBvbmUgY2hhcnMKKyAgICAgICAgdGV4dFdhdGNoZXIuYmVmb3JlVGV4dENoYW5nZWQobnVtYmVyLCAwLCAwLCBtdWx0aUNoYXJzLmxlbmd0aCgpKTsKKyAgICAgICAgbnVtYmVyLmFwcGVuZChtdWx0aUNoYXJzKTsKKyAgICAgICAgU2VsZWN0aW9uLnNldFNlbGVjdGlvbihudW1iZXIsIG51bWJlci5sZW5ndGgoKSk7CisgICAgICAgIHRleHRXYXRjaGVyLm9uVGV4dENoYW5nZWQobnVtYmVyLCAwLCAwLCBudW1iZXIubGVuZ3RoKCkpOworICAgICAgICB0ZXh0V2F0Y2hlci5hZnRlclRleHRDaGFuZ2VkKG51bWJlcik7CisgICAgICAgIGFzc2VydEVxdWFscyhmb3JtYXR0ZWQxLCBudW1iZXIudG9TdHJpbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhmb3JtYXR0ZWQxLmxlbmd0aCgpLCBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uRW5kKG51bWJlcikpOworICAgICAgICAvLyBBcHBlbmQgb25lIGNoYXJzCisgICAgICAgIGZpbmFsIGNoYXIgYXBwZW5kQ2hhciA9ICc2JzsKKyAgICAgICAgZmluYWwgU3RyaW5nIGZvcm1hdHRlZDIgPSAiKDY1MCkgMTIzLTQ1NiI7CisgICAgICAgIGludCBsZW4gPSBudW1iZXIubGVuZ3RoKCk7CisgICAgICAgIHRleHRXYXRjaGVyLmJlZm9yZVRleHRDaGFuZ2VkKG51bWJlciwgbnVtYmVyLmxlbmd0aCgpLCAwLCAxKTsKKyAgICAgICAgbnVtYmVyLmFwcGVuZChhcHBlbmRDaGFyKTsKKyAgICAgICAgU2VsZWN0aW9uLnNldFNlbGVjdGlvbihudW1iZXIsIG51bWJlci5sZW5ndGgoKSk7CisgICAgICAgIHRleHRXYXRjaGVyLm9uVGV4dENoYW5nZWQobnVtYmVyLCBsZW4sIDAsIDEpOworICAgICAgICB0ZXh0V2F0Y2hlci5hZnRlclRleHRDaGFuZ2VkKG51bWJlcik7CisgICAgICAgIGFzc2VydEVxdWFscyhmb3JtYXR0ZWQyLCBudW1iZXIudG9TdHJpbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhmb3JtYXR0ZWQyLmxlbmd0aCgpLCBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uRW5kKG51bWJlcikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RSZW1vdmVMYXN0Q2hhcnMoKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyBpbml0ID0gIjY1MDEyMzQ1Njc4IjsKKyAgICAgICAgZmluYWwgU3RyaW5nIHJlc3VsdDEgPSAiKDY1MCkgMTIzLTQ1NjciOworICAgICAgICBUZXh0V2F0Y2hlciB0ZXh0V2F0Y2hlciA9IGdldFRleHRXYXRjaGVyKCk7CisgICAgICAgIC8vIFJlbW92ZSB0aGUgbGFzdCBjaGFyLgorICAgICAgICBTcGFubmFibGVTdHJpbmdCdWlsZGVyIG51bWJlciA9IG5ldyBTcGFubmFibGVTdHJpbmdCdWlsZGVyKGluaXQpOworICAgICAgICBpbnQgbGVuID0gbnVtYmVyLmxlbmd0aCgpOworICAgICAgICB0ZXh0V2F0Y2hlci5iZWZvcmVUZXh0Q2hhbmdlZChudW1iZXIsIGxlbiAtIDEsIDEsIDApOworICAgICAgICBudW1iZXIuZGVsZXRlKGxlbiAtIDEsIGxlbik7CisgICAgICAgIFNlbGVjdGlvbi5zZXRTZWxlY3Rpb24obnVtYmVyLCBudW1iZXIubGVuZ3RoKCkpOworICAgICAgICB0ZXh0V2F0Y2hlci5vblRleHRDaGFuZ2VkKG51bWJlciwgbnVtYmVyLmxlbmd0aCgpIC0gMSwgMSwgMCk7CisgICAgICAgIHRleHRXYXRjaGVyLmFmdGVyVGV4dENoYW5nZWQobnVtYmVyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdDEsIG51bWJlci50b1N0cmluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdDEubGVuZ3RoKCksIFNlbGVjdGlvbi5nZXRTZWxlY3Rpb25FbmQobnVtYmVyKSk7CisgICAgICAgIC8vIFJlbW92ZSBsYXN0IDUgY2hhcnMKKyAgICAgICAgZmluYWwgU3RyaW5nIHJlc3VsdDIgPSAiKDY1MCkgMTIzIjsKKyAgICAgICAgdGV4dFdhdGNoZXIuYmVmb3JlVGV4dENoYW5nZWQobnVtYmVyLCBudW1iZXIubGVuZ3RoKCkgLSA0LCA0LCAwKTsKKyAgICAgICAgbnVtYmVyLmRlbGV0ZShudW1iZXIubGVuZ3RoKCkgLSA1LCBudW1iZXIubGVuZ3RoKCkpOworICAgICAgICBTZWxlY3Rpb24uc2V0U2VsZWN0aW9uKG51bWJlciwgbnVtYmVyLmxlbmd0aCgpKTsKKyAgICAgICAgdGV4dFdhdGNoZXIub25UZXh0Q2hhbmdlZChudW1iZXIsIG51bWJlci5sZW5ndGgoKSwgNCwgMCk7CisgICAgICAgIHRleHRXYXRjaGVyLmFmdGVyVGV4dENoYW5nZWQobnVtYmVyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdDIsIG51bWJlci50b1N0cmluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdDIubGVuZ3RoKCksIFNlbGVjdGlvbi5nZXRTZWxlY3Rpb25FbmQobnVtYmVyKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEluc2VydENoYXJzKCkgeworICAgICAgICBmaW5hbCBTdHJpbmcgaW5pdCA9ICIoNjUwKSAyMyI7CisgICAgICAgIGZpbmFsIFN0cmluZyBleHBlY3RlZDEgPSAiKDY1MCkgMTIzIjsKKyAgICAgICAgVGV4dFdhdGNoZXIgdGV4dFdhdGNoZXIgPSBnZXRUZXh0V2F0Y2hlcigpOworCisgICAgICAgIC8vIEluc2VydCBvbmUgY2hhcgorICAgICAgICBTcGFubmFibGVTdHJpbmdCdWlsZGVyIG51bWJlciA9IG5ldyBTcGFubmFibGVTdHJpbmdCdWlsZGVyKGluaXQpOworICAgICAgICB0ZXh0V2F0Y2hlci5iZWZvcmVUZXh0Q2hhbmdlZChudW1iZXIsIDQsIDAsIDEpOworICAgICAgICBudW1iZXIuaW5zZXJ0KDQsICIxIik7IC8vICg2NTAxKSAyMworICAgICAgICBTZWxlY3Rpb24uc2V0U2VsZWN0aW9uKG51bWJlciwgNSk7IC8vIG1ha2UgdGhlIGN1cnNvciBhdCByaWdodCBvZiAxCisgICAgICAgIHRleHRXYXRjaGVyLm9uVGV4dENoYW5nZWQobnVtYmVyLCA0LCAwLCAxKTsKKyAgICAgICAgdGV4dFdhdGNoZXIuYWZ0ZXJUZXh0Q2hhbmdlZChudW1iZXIpOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQxLCBudW1iZXIudG9TdHJpbmcoKSk7CisgICAgICAgIC8vIHRoZSBjdXJzb3Igc2hvdWxkIHN0aWxsIGF0IHRoZSByaWdodCBvZiAnMScKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDcsIFNlbGVjdGlvbi5nZXRTZWxlY3Rpb25FbmQobnVtYmVyKSk7CisKKyAgICAgICAgLy8gSW5zZXJ0IG11bHRpcGxlIGNoYXJzCisgICAgICAgIGZpbmFsIFN0cmluZyBleHBlY3RlZDIgPSAiKDY1MCkgMTQ1LTY3MjMiOworICAgICAgICB0ZXh0V2F0Y2hlci5iZWZvcmVUZXh0Q2hhbmdlZChudW1iZXIsIDcsIDAsIDQpOworICAgICAgICBudW1iZXIuaW5zZXJ0KDcsICI0NTY3Iik7IC8vIGNoYW5nZSB0byAoNjUwKSAxNDU2NzIzCisgICAgICAgIFNlbGVjdGlvbi5zZXRTZWxlY3Rpb24obnVtYmVyLCAxMSk7IC8vIHRoZSBjdXJzb3IgaXMgYXQgdGhlIHJpZ2h0IG9mICc3Jy4KKyAgICAgICAgdGV4dFdhdGNoZXIub25UZXh0Q2hhbmdlZChudW1iZXIsIDcsIDAsIDQpOworICAgICAgICB0ZXh0V2F0Y2hlci5hZnRlclRleHRDaGFuZ2VkKG51bWJlcik7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZDIsIG51bWJlci50b1N0cmluZygpKTsKKyAgICAgICAgLy8gdGhlIGN1cnNvciBzaG91bGQgYmUgc3RpbGwgYXQgdGhlIHJpZ2h0IG9mICc3JworICAgICAgICBhc3NlcnRFcXVhbHMoMTIsIFNlbGVjdGlvbi5nZXRTZWxlY3Rpb25FbmQobnVtYmVyKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFN0b3BGb3JtYXR0aW5nKCkgeworICAgICAgICBmaW5hbCBTdHJpbmcgaW5pdCA9ICIoNjUwKSAxMjMiOworICAgICAgICBmaW5hbCBTdHJpbmcgZXhwZWN0ZWQxID0gIig2NTApIDEyMyA0IjsKKyAgICAgICAgVGV4dFdhdGNoZXIgdGV4dFdhdGNoZXIgPSBnZXRUZXh0V2F0Y2hlcigpOworCisgICAgICAgIC8vIEFwcGVuZCBzcGFjZQorICAgICAgICBTcGFubmFibGVTdHJpbmdCdWlsZGVyIG51bWJlciA9IG5ldyBTcGFubmFibGVTdHJpbmdCdWlsZGVyKGluaXQpOworICAgICAgICB0ZXh0V2F0Y2hlci5iZWZvcmVUZXh0Q2hhbmdlZChudW1iZXIsIDksIDAsIDIpOworICAgICAgICBudW1iZXIuaW5zZXJ0KDksICIgNCIpOyAvLyAoNjUwMSkgMjMgNAorICAgICAgICBTZWxlY3Rpb24uc2V0U2VsZWN0aW9uKG51bWJlciwgbnVtYmVyLmxlbmd0aCgpKTsgLy8gbWFrZSB0aGUgY3Vyc29yIGF0IHJpZ2h0IG9mIDQKKyAgICAgICAgdGV4dFdhdGNoZXIub25UZXh0Q2hhbmdlZChudW1iZXIsIDksIDAsIDIpOworICAgICAgICB0ZXh0V2F0Y2hlci5hZnRlclRleHRDaGFuZ2VkKG51bWJlcik7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZDEsIG51bWJlci50b1N0cmluZygpKTsKKyAgICAgICAgLy8gdGhlIGN1cnNvciBzaG91bGQgc3RpbGwgYXQgdGhlIHJpZ2h0IG9mICcxJworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQxLmxlbmd0aCgpLCBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uRW5kKG51bWJlcikpOworCisgICAgICAgIC8vIERlbGV0ZSBhICcpJworICAgICAgICBmaW5hbCBTdHJpbmcgZXhwZWN0ZWQyID0iKDY1MCAxMjMiOworICAgICAgICB0ZXh0V2F0Y2hlciA9IGdldFRleHRXYXRjaGVyKCk7CisgICAgICAgIG51bWJlciA9IG5ldyBTcGFubmFibGVTdHJpbmdCdWlsZGVyKGluaXQpOworICAgICAgICB0ZXh0V2F0Y2hlci5iZWZvcmVUZXh0Q2hhbmdlZChudW1iZXIsIDQsIDEsIDApOworICAgICAgICBudW1iZXIuZGVsZXRlKDQsIDUpOyAvLyAoNjUwMSAyMyA0CisgICAgICAgIFNlbGVjdGlvbi5zZXRTZWxlY3Rpb24obnVtYmVyLCA1KTsgLy8gbWFrZSB0aGUgY3Vyc29yIGF0IHJpZ2h0IG9mIDEKKyAgICAgICAgdGV4dFdhdGNoZXIub25UZXh0Q2hhbmdlZChudW1iZXIsIDQsIDEsIDApOworICAgICAgICB0ZXh0V2F0Y2hlci5hZnRlclRleHRDaGFuZ2VkKG51bWJlcik7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZDIsIG51bWJlci50b1N0cmluZygpKTsKKyAgICAgICAgLy8gdGhlIGN1cnNvciBzaG91bGQgc3RpbGwgYXQgdGhlIHJpZ2h0IG9mICcxJworICAgICAgICBhc3NlcnRFcXVhbHMoNSwgU2VsZWN0aW9uLmdldFNlbGVjdGlvbkVuZChudW1iZXIpKTsKKworICAgICAgICAvLyBJbnNlcnQgYSBoeXBoZW4KKyAgICAgICAgZmluYWwgU3RyaW5nIGV4cGVjdGVkMyA9Iig2NTApIDEyLTMiOworICAgICAgICB0ZXh0V2F0Y2hlciA9IGdldFRleHRXYXRjaGVyKCk7CisgICAgICAgIG51bWJlciA9IG5ldyBTcGFubmFibGVTdHJpbmdCdWlsZGVyKGluaXQpOworICAgICAgICB0ZXh0V2F0Y2hlci5iZWZvcmVUZXh0Q2hhbmdlZChudW1iZXIsIDgsIDAsIDEpOworICAgICAgICBudW1iZXIuaW5zZXJ0KDgsICItIik7IC8vICg2NTApIDEyLTMKKyAgICAgICAgU2VsZWN0aW9uLnNldFNlbGVjdGlvbihudW1iZXIsIDkpOyAvLyBtYWtlIHRoZSBjdXJzb3IgYXQgcmlnaHQgb2YgLQorICAgICAgICB0ZXh0V2F0Y2hlci5vblRleHRDaGFuZ2VkKG51bWJlciwgOCwgMCwgMSk7CisgICAgICAgIHRleHRXYXRjaGVyLmFmdGVyVGV4dENoYW5nZWQobnVtYmVyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkMywgbnVtYmVyLnRvU3RyaW5nKCkpOworICAgICAgICAvLyB0aGUgY3Vyc29yIHNob3VsZCBzdGlsbCBhdCB0aGUgcmlnaHQgb2YgJy0nCisgICAgICAgIGFzc2VydEVxdWFscyg5LCBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uRW5kKG51bWJlcikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RSZXN0YXJ0Rm9ybWF0dGluZygpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGluaXQgPSAiKDY1MCkgMTIzIjsKKyAgICAgICAgZmluYWwgU3RyaW5nIGV4cGVjdGVkMSA9ICIoNjUwKSAxMjMgNCI7CisgICAgICAgIFRleHRXYXRjaGVyIHRleHRXYXRjaGVyID0gZ2V0VGV4dFdhdGNoZXIoKTsKKworICAgICAgICAvLyBBcHBlbmQgc3BhY2UKKyAgICAgICAgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlciBudW1iZXIgPSBuZXcgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcihpbml0KTsKKyAgICAgICAgdGV4dFdhdGNoZXIuYmVmb3JlVGV4dENoYW5nZWQobnVtYmVyLCA5LCAwLCAyKTsKKyAgICAgICAgbnVtYmVyLmluc2VydCg5LCAiIDQiKTsgLy8gKDY1MCkgMTIzIDQKKyAgICAgICAgU2VsZWN0aW9uLnNldFNlbGVjdGlvbihudW1iZXIsIG51bWJlci5sZW5ndGgoKSk7IC8vIG1ha2UgdGhlIGN1cnNvciBhdCByaWdodCBvZiA0CisgICAgICAgIHRleHRXYXRjaGVyLm9uVGV4dENoYW5nZWQobnVtYmVyLCA5LCAwLCAyKTsKKyAgICAgICAgdGV4dFdhdGNoZXIuYWZ0ZXJUZXh0Q2hhbmdlZChudW1iZXIpOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQxLCBudW1iZXIudG9TdHJpbmcoKSk7CisgICAgICAgIC8vIHRoZSBjdXJzb3Igc2hvdWxkIHN0aWxsIGF0IHRoZSByaWdodCBvZiAnNCcKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkMS5sZW5ndGgoKSwgU2VsZWN0aW9uLmdldFNlbGVjdGlvbkVuZChudW1iZXIpKTsKKworICAgICAgICAvLyBDbGVhciB0aGUgY3VycmVudCBzdHJpbmcsIGFuZCBzdGFydCBmb3JtYXR0aW5nIGFnYWluLgorICAgICAgICBpbnQgbGVuID0gbnVtYmVyLmxlbmd0aCgpOworICAgICAgICB0ZXh0V2F0Y2hlci5iZWZvcmVUZXh0Q2hhbmdlZChudW1iZXIsIDAsIGxlbiwgMCk7CisgICAgICAgIG51bWJlci5kZWxldGUoMCwgbGVuKTsKKyAgICAgICAgdGV4dFdhdGNoZXIub25UZXh0Q2hhbmdlZChudW1iZXIsIDAsIGxlbiwgMCk7CisgICAgICAgIHRleHRXYXRjaGVyLmFmdGVyVGV4dENoYW5nZWQobnVtYmVyKTsKKworICAgICAgICBmaW5hbCBTdHJpbmcgZXhwZWN0ZWQyID0gIig2NTApIDEyMy00IjsKKyAgICAgICAgbnVtYmVyID0gbmV3IFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIoaW5pdCk7CisgICAgICAgIHRleHRXYXRjaGVyLmJlZm9yZVRleHRDaGFuZ2VkKG51bWJlciwgOSwgMCwgMSk7CisgICAgICAgIG51bWJlci5pbnNlcnQoOSwgIjQiKTsgLy8gKDY1MCkgMTIzNAorICAgICAgICBTZWxlY3Rpb24uc2V0U2VsZWN0aW9uKG51bWJlciwgbnVtYmVyLmxlbmd0aCgpKTsgLy8gbWFrZSB0aGUgY3Vyc29yIGF0IHJpZ2h0IG9mIDQKKyAgICAgICAgdGV4dFdhdGNoZXIub25UZXh0Q2hhbmdlZChudW1iZXIsIDksIDAsIDEpOworICAgICAgICB0ZXh0V2F0Y2hlci5hZnRlclRleHRDaGFuZ2VkKG51bWJlcik7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZDIsIG51bWJlci50b1N0cmluZygpKTsKKyAgICAgICAgLy8gdGhlIGN1cnNvciBzaG91bGQgc3RpbGwgYXQgdGhlIHJpZ2h0IG9mICc0JworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQyLmxlbmd0aCgpLCBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uRW5kKG51bWJlcikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RUZXh0Q2hhbmdlZEJ5T3RoZXJUZXh0V2F0Y2hlcigpIHsKKyAgICAgICAgZmluYWwgVGV4dFdhdGNoZXIgY2xlYW51cFRleHRXYXRjaGVyID0gbmV3IFRleHRXYXRjaGVyKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgYWZ0ZXJUZXh0Q2hhbmdlZChFZGl0YWJsZSBzKSB7CisgICAgICAgICAgICAgICAgcy5jbGVhcigpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBiZWZvcmVUZXh0Q2hhbmdlZChDaGFyU2VxdWVuY2UgcywgaW50IHN0YXJ0LCBpbnQgY291bnQsCisgICAgICAgICAgICAgICAgICAgIGludCBhZnRlcikgeworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblRleHRDaGFuZ2VkKENoYXJTZXF1ZW5jZSBzLCBpbnQgc3RhcnQsIGludCBiZWZvcmUsCisgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCkgeworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBmaW5hbCBTdHJpbmcgaW5pdCA9ICIoNjUwKSAxMjMiOworICAgICAgICBmaW5hbCBTdHJpbmcgZXhwZWN0ZWQxID0gIiI7CisgICAgICAgIFRleHRXYXRjaGVyIHRleHRXYXRjaGVyID0gZ2V0VGV4dFdhdGNoZXIoKTsKKworICAgICAgICBTcGFubmFibGVTdHJpbmdCdWlsZGVyIG51bWJlciA9IG5ldyBTcGFubmFibGVTdHJpbmdCdWlsZGVyKGluaXQpOworICAgICAgICB0ZXh0V2F0Y2hlci5iZWZvcmVUZXh0Q2hhbmdlZChudW1iZXIsIDUsIDAsIDEpOworICAgICAgICBudW1iZXIuaW5zZXJ0KDUsICI0Iik7IC8vICg2NTA0KSAxMjMKKyAgICAgICAgU2VsZWN0aW9uLnNldFNlbGVjdGlvbihudW1iZXIsIDUpOyAvLyBtYWtlIHRoZSBjdXJzb3IgYXQgcmlnaHQgb2YgNAorICAgICAgICB0ZXh0V2F0Y2hlci5vblRleHRDaGFuZ2VkKG51bWJlciwgNSwgMCwgMSk7CisgICAgICAgIG51bWJlci5zZXRTcGFuKGNsZWFudXBUZXh0V2F0Y2hlciwgMCwgbnVtYmVyLmxlbmd0aCgpLCAwKTsKKyAgICAgICAgdGV4dFdhdGNoZXIuYWZ0ZXJUZXh0Q2hhbmdlZChudW1iZXIpOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQxLCBudW1iZXIudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBUZXh0V2F0Y2hlciBnZXRUZXh0V2F0Y2hlcigpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBQaG9uZU51bWJlckZvcm1hdHRpbmdUZXh0V2F0Y2hlcigiVVMiKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9UZXN0UGhvbmVOb3RpZmllci5qYXZhIGIvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvVGVzdFBob25lTm90aWZpZXIuamF2YQppbmRleCA0Mjc3OTViLi44Y2IwNWNjIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9UZXN0UGhvbmVOb3RpZmllci5qYXZhCisrKyBiL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Rlc3RQaG9uZU5vdGlmaWVyLmphdmEKQEAgLTE2LDYgKzE2LDggQEAKIAogcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnk7CiAKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuUGhvbmU7CisKIC8qKgogICogU3R1YiBjbGFzcyB1c2VkIGZvciB1bml0IHRlc3RzCiAgKi8KQEAgLTMyLDcgKzM0LDcgQEAKIAogICAgIHB1YmxpYyB2b2lkIG5vdGlmeUNlbGxMb2NhdGlvbihQaG9uZSBzZW5kZXIpIHsKICAgICB9Ci0gICAgCisKICAgICBwdWJsaWMgdm9pZCBub3RpZnlTaWduYWxTdHJlbmd0aChQaG9uZSBzZW5kZXIpIHsKICAgICB9CiAKQEAgLTQyLDEwICs0NCwxNCBAQAogICAgIHB1YmxpYyB2b2lkIG5vdGlmeUNhbGxGb3J3YXJkaW5nQ2hhbmdlZChQaG9uZSBzZW5kZXIpIHsKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBub3RpZnlEYXRhQ29ubmVjdGlvbihQaG9uZSBzZW5kZXIsIFN0cmluZyByZWFzb24pIHsKKyAgICBwdWJsaWMgdm9pZCBub3RpZnlEYXRhQ29ubmVjdGlvbihQaG9uZSBzZW5kZXIsIFN0cmluZyByZWFzb24sIFN0cmluZyBhcG5UeXBlKSB7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgbm90aWZ5RGF0YUNvbm5lY3Rpb25GYWlsZWQoUGhvbmUgc2VuZGVyLCBTdHJpbmcgcmVhc29uKSB7CisgICAgcHVibGljIHZvaWQgbm90aWZ5RGF0YUNvbm5lY3Rpb24oUGhvbmUgc2VuZGVyLCBTdHJpbmcgcmVhc29uLCBTdHJpbmcgYXBuVHlwZSwKKyAgICAgICAgICAgIFBob25lLkRhdGFTdGF0ZSBzdGF0ZSkgeworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG5vdGlmeURhdGFDb25uZWN0aW9uRmFpbGVkKFBob25lIHNlbmRlciwgU3RyaW5nIHJlYXNvbiwgU3RyaW5nIGFwblR5cGUpIHsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBub3RpZnlEYXRhQWN0aXZpdHkoUGhvbmUgc2VuZGVyKSB7CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vR1NNUGhvbmVUZXN0LmphdmEgYi90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vR1NNUGhvbmVUZXN0LmphdmEKaW5kZXggYjk2NzQzYS4uNDg1NTQyYiAxMDA2NDQKLS0tIGEvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL0dTTVBob25lVGVzdC5qYXZhCisrKyBiL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9HU01QaG9uZVRlc3QuamF2YQpAQCAtMTgsMjcgKzE4LDIxIEBACiAKIGltcG9ydCBhbmRyb2lkLm9zLkFzeW5jUmVzdWx0OwogaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKLWltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXJUaHJlYWQ7Ci1pbXBvcnQgYW5kcm9pZC5vcy5Mb29wZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwotaW1wb3J0IGFuZHJvaWQub3MuUHJvY2VzczsKIGltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5TZXJ2aWNlU3RhdGU7CiBpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKIGltcG9ydCBhbmRyb2lkLnRlc3QuUGVyZm9ybWFuY2VUZXN0Q2FzZTsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkNhbGw7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkNhbGxTdGF0ZUV4Y2VwdGlvbjsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuQ29ubmVjdGlvbjsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuTW1pQ29kZTsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuUGhvbmU7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlRlc3RQaG9uZU5vdGlmaWVyOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uQ2FsbEZhaWxDYXVzZTsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLkdTTVBob25lOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uR1NNVGVzdEhhbmRsZXI7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5Hc21NbWlDb2RlOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uU3VwcFNlcnZpY2VOb3RpZmljYXRpb247Ci1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LnRlc3QuU2ltdWxhdGVkQ29tbWFuZHM7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LnRlc3QuU2ltdWxhdGVkUmFkaW9Db250cm9sOwogCiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9tb2NrcmlsL01vY2tSaWxUZXN0LmphdmEgYi90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9tb2NrcmlsL01vY2tSaWxUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBkNWIzMQotLS0gL2Rldi9udWxsCisrKyBiL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L21vY2tyaWwvTW9ja1JpbFRlc3QuamF2YQpAQCAtMCwwICsxLDE5NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255Lm1vY2tyaWw7CisKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0Q2FzZTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLmNvbW11bmljYXRpb24uTXNnSGVhZGVyOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLmNvbW11bmljYXRpb24uTXNnOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5SaWxDaGFubmVsOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5yaWxfcHJvdG8uUmlsQ3RybENtZHM7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LnJpbF9wcm90by5SaWxDbWRzOworCitpbXBvcnQgY29tLmFuZHJvaWQuZnJhbWV3b3Jrcy50ZWxlcGhvbnl0ZXN0cy5UZWxlcGhvbnlNb2NrUmlsVGVzdFJ1bm5lcjsKK2ltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLm1pY3JvLkludmFsaWRQcm90b2NvbEJ1ZmZlck1pY3JvRXhjZXB0aW9uOworCisvLyBUZXN0IHN1aXRlIGZvciB0ZXN0IHJpbAorcHVibGljIGNsYXNzIE1vY2tSaWxUZXN0IGV4dGVuZHMgSW5zdHJ1bWVudGF0aW9uVGVzdENhc2UgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTW9ja1JpbFRlc3QiOworCisgICAgUmlsQ2hhbm5lbCBtTW9ja1JpbENoYW5uZWw7CisgICAgVGVsZXBob255TW9ja1JpbFRlc3RSdW5uZXIgbVJ1bm5lcjsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnNldFVwKCk7CisgICAgICAgIG1SdW5uZXIgPSAoVGVsZXBob255TW9ja1JpbFRlc3RSdW5uZXIpZ2V0SW5zdHJ1bWVudGF0aW9uKCk7CisgICAgICAgIG1Nb2NrUmlsQ2hhbm5lbCA9IG1SdW5uZXIubU1vY2tSaWxDaGFubmVsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnRlYXJEb3duKCk7CisgICAgfQorCisgICAgc3RhdGljIHZvaWQgbG9nKFN0cmluZyBzKSB7CisgICAgICAgIExvZy52KFRBRywgcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBwcm90b2J1ZiBzZXJpYWxpemF0aW9uIGFuZCBkZXNlcmlhbGl6YXRpb24KKyAgICAgKiBAdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlck1pY3JvRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFByb3RvYnVmU2VyRGVzKCkgdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlck1pY3JvRXhjZXB0aW9uIHsKKyAgICAgICAgbG9nKCJ0ZXN0UHJvdG9idWZTZXJkZXMgRSIpOworCisgICAgICAgIFJpbEN0cmxDbWRzLkN0cmxSc3BSYWRpb1N0YXRlIHJzID0gbmV3IFJpbEN0cmxDbWRzLkN0cmxSc3BSYWRpb1N0YXRlKCk7CisgICAgICAgIGFzc2VydFRydWUoU3RyaW5nLmZvcm1hdCgiZXhwZWN0ZWQgcnMuc3RhdGUgPT0gMCB3YXMgJWQiLCBycy5nZXRTdGF0ZSgpKSwKKyAgICAgICAgICAgICAgICBycy5nZXRTdGF0ZSgpID09IDApOworICAgICAgICBycy5zZXRTdGF0ZSgxKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShTdHJpbmcuZm9ybWF0KCJleHBlY3RlZCBycy5zdGF0ZSA9PSAxIHdhcyAlZCIsIHJzLmdldFN0YXRlKCkpLAorICAgICAgICAgICAgICAgIHJzLmdldFN0YXRlKCkgPT0gMSk7CisKKyAgICAgICAgYnl0ZVtdIHJzX3NlciA9IHJzLnRvQnl0ZUFycmF5KCk7CisgICAgICAgIFJpbEN0cmxDbWRzLkN0cmxSc3BSYWRpb1N0YXRlIHJzTmV3ID0gUmlsQ3RybENtZHMuQ3RybFJzcFJhZGlvU3RhdGUucGFyc2VGcm9tKHJzX3Nlcik7CisgICAgICAgIGFzc2VydFRydWUoU3RyaW5nLmZvcm1hdCgiZXhwZWN0ZWQgcnNOZXcuc3RhdGUgPT0gMSB3YXMgJWQiLCBycy5nZXRTdGF0ZSgpKSwKKyAgICAgICAgICAgICAgICBycy5nZXRTdGF0ZSgpID09IDEpOworCisgICAgICAgIGxvZygidGVzdFByb3RvYnVmU2VyZGVzIFgiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGVjaG8gY29tbWFuZCB3b3JrcyB1c2luZyB3cml0ZU1zZyAmIHJlYWRNc2cKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0RWNob01zZygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGxvZygidGVzdEVjaG9Nc2cgRSIpOworCisgICAgICAgIE1zZ0hlYWRlciBtaCA9IG5ldyBNc2dIZWFkZXIoKTsKKyAgICAgICAgbWguc2V0Q21kKDApOworICAgICAgICBtaC5zZXRUb2tlbigxKTsKKyAgICAgICAgbWguc2V0U3RhdHVzKDIpOworICAgICAgICBCeXRlQnVmZmVyIGRhdGEgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKDMpOworICAgICAgICBkYXRhLnB1dCgoYnl0ZSkzKTsKKyAgICAgICAgZGF0YS5wdXQoKGJ5dGUpNCk7CisgICAgICAgIGRhdGEucHV0KChieXRlKTUpOworICAgICAgICBNc2cuc2VuZChtTW9ja1JpbENoYW5uZWwsIG1oLCBkYXRhKTsKKworICAgICAgICBNc2cgcmVzcE1zZyA9IE1zZy5yZWN2KG1Nb2NrUmlsQ2hhbm5lbCk7CisgICAgICAgIGFzc2VydFRydWUoU3RyaW5nLmZvcm1hdCgiZXhwZWN0ZWQgbWhkLmhlYWRlci5jbWQgPT0gMCB3YXMgJWQiLHJlc3BNc2cuZ2V0Q21kKCkpLAorICAgICAgICAgICAgICAgIHJlc3BNc2cuZ2V0Q21kKCkgPT0gMCk7CisgICAgICAgIGFzc2VydFRydWUoU3RyaW5nLmZvcm1hdCgiZXhwZWN0ZWQgbWhkLmhlYWRlci50b2tlbiA9PSAxIHdhcyAlZCIscmVzcE1zZy5nZXRUb2tlbigpKSwKKyAgICAgICAgICAgICAgICByZXNwTXNnLmdldFRva2VuKCkgPT0gMSk7CisgICAgICAgIGFzc2VydFRydWUoU3RyaW5nLmZvcm1hdCgiZXhwZWN0ZWQgbWhkLmhlYWRlci5zdGF0dXMgPT0gMiB3YXMgJWQiLCByZXNwTXNnLmdldFN0YXR1cygpKSwKKyAgICAgICAgICAgICAgICByZXNwTXNnLmdldFN0YXR1cygpID09IDIpOworICAgICAgICBhc3NlcnRUcnVlKFN0cmluZy5mb3JtYXQoImV4cGVjdGVkIG1oZC5kYXRhWzBdID09IDMgd2FzICVkIiwgcmVzcE1zZy5nZXREYXRhKDApKSwKKyAgICAgICAgICAgICAgICByZXNwTXNnLmdldERhdGEoMCkgPT0gMyk7CisgICAgICAgIGFzc2VydFRydWUoU3RyaW5nLmZvcm1hdCgiZXhwZWN0ZWQgbWhkLmRhdGFbMV0gPT0gNCB3YXMgJWQiLCByZXNwTXNnLmdldERhdGEoMSkpLAorICAgICAgICAgICAgICAgIHJlc3BNc2cuZ2V0RGF0YSgxKSA9PSA0KTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShTdHJpbmcuZm9ybWF0KCJleHBlY3RlZCBtaGQuZGF0YVsyXSA9PSA1IHdhcyAlZCIsIHJlc3BNc2cuZ2V0RGF0YSgyKSksCisgICAgICAgICAgICAgICAgcmVzcE1zZy5nZXREYXRhKDIpID09IDUpOworCisgICAgICAgIGxvZygidGVzdEVjaG9Nc2cgWCIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgZ2V0IGFzCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEdldEFzKCkgeworICAgICAgICBsb2coInRlc3RHZXRBcyBFIik7CisKKyAgICAgICAgLy8gVXNlIGEgbWVzc2FnZSBoZWFkZXIgYXMgdGhlIHByb3RvYnVmIGRhdGEgY29udGVudAorICAgICAgICBNc2dIZWFkZXIgbWggPSBuZXcgTXNnSGVhZGVyKCk7CisgICAgICAgIG1oLnNldENtZCgxMjM0NSk7CisgICAgICAgIG1oLnNldFRva2VuKDk4NzYpOworICAgICAgICBtaC5zZXRTdGF0dXMoNzY1NCk7CisgICAgICAgIG1oLnNldExlbmd0aERhdGEoNDMyMSk7CisgICAgICAgIGJ5dGVbXSBkYXRhID0gbWgudG9CeXRlQXJyYXkoKTsKKyAgICAgICAgTXNnSGVhZGVyIG1oUmVzdWx0ID0gTXNnLmdldEFzKE1zZ0hlYWRlci5jbGFzcywgZGF0YSk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShTdHJpbmcuZm9ybWF0KCJleHBlY3RlZCBjbWQgPT0gMTIzNDUgd2FzICVkIiwgbWhSZXN1bHQuZ2V0Q21kKCkpLAorICAgICAgICAgICAgICAgIG1oUmVzdWx0LmdldENtZCgpID09IDEyMzQ1KTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShTdHJpbmcuZm9ybWF0KCJleHBlY3RlZCB0b2tlbiA9PSA5ODc2IHdhcyAlZCIsIG1oUmVzdWx0LmdldFRva2VuKCkpLAorICAgICAgICAgICAgICAgIG1oUmVzdWx0LmdldFRva2VuKCkgPT0gOTg3Nik7CisgICAgICAgIGFzc2VydFRydWUoU3RyaW5nLmZvcm1hdCgiZXhwZWN0ZWQgc3RhdHVzID09IDc2NTQgd2FzICVkIiwgbWhSZXN1bHQuZ2V0U3RhdHVzKCkpLAorICAgICAgICAgICAgICAgIG1oUmVzdWx0LmdldFN0YXR1cygpID09IDc2NTQpOworICAgICAgICBhc3NlcnRUcnVlKFN0cmluZy5mb3JtYXQoImV4cGVjdGVkIGxlbmd0aERhdGEgPT0gNDMyMSB3YXMgJWQiLCBtaFJlc3VsdC5nZXRMZW5ndGhEYXRhKCkpLAorICAgICAgICAgICAgICAgIG1oUmVzdWx0LmdldExlbmd0aERhdGEoKSA9PSA0MzIxKTsKKworICAgICAgICBNc2cgbXNnID0gTXNnLm9idGFpbigpOworICAgICAgICBtc2cuc2V0RGF0YShCeXRlQnVmZmVyLndyYXAoZGF0YSkpOworCisgICAgICAgIG1oUmVzdWx0ID0gbXNnLmdldERhdGFBcyhNc2dIZWFkZXIuY2xhc3MpOworCisgICAgICAgIGFzc2VydFRydWUoU3RyaW5nLmZvcm1hdCgiZXhwZWN0ZWQgY21kID09IDEyMzQ1IHdhcyAlZCIsIG1oUmVzdWx0LmdldENtZCgpKSwKKyAgICAgICAgICAgICAgICBtaFJlc3VsdC5nZXRDbWQoKSA9PSAxMjM0NSk7CisgICAgICAgIGFzc2VydFRydWUoU3RyaW5nLmZvcm1hdCgiZXhwZWN0ZWQgdG9rZW4gPT0gOTg3NiB3YXMgJWQiLCBtaFJlc3VsdC5nZXRUb2tlbigpKSwKKyAgICAgICAgICAgICAgICBtaFJlc3VsdC5nZXRUb2tlbigpID09IDk4NzYpOworICAgICAgICBhc3NlcnRUcnVlKFN0cmluZy5mb3JtYXQoImV4cGVjdGVkIHN0YXR1cyA9PSA3NjU0IHdhcyAlZCIsIG1oUmVzdWx0LmdldFN0YXR1cygpKSwKKyAgICAgICAgICAgICAgICBtaFJlc3VsdC5nZXRTdGF0dXMoKSA9PSA3NjU0KTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShTdHJpbmcuZm9ybWF0KCJleHBlY3RlZCBsZW5ndGhEYXRhID09IDQzMjEgd2FzICVkIiwgbWhSZXN1bHQuZ2V0TGVuZ3RoRGF0YSgpKSwKKyAgICAgICAgICAgICAgICBtaFJlc3VsdC5nZXRMZW5ndGhEYXRhKCkgPT0gNDMyMSk7CisKKyAgICAgICAgbG9nKCJ0ZXN0R2V0QXMgWCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRSYWRpb1N0YXRlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgbG9nKCJ0ZXN0R2V0UmFkaW9TdGF0ZSBFIik7CisKKyAgICAgICAgTXNnLnNlbmQobU1vY2tSaWxDaGFubmVsLCAxLCA5ODc2LCAwLCBudWxsKTsKKworICAgICAgICBNc2cgcmVzcCA9IE1zZy5yZWN2KG1Nb2NrUmlsQ2hhbm5lbCk7CisgICAgICAgIC8vcmVzcC5wcmludEhlYWRlcigidGVzdEdldFJhZGlvU3RhdGUiKTsKKworICAgICAgICBhc3NlcnRUcnVlKFN0cmluZy5mb3JtYXQoImV4cGVjdGVkIGNtZCA9PSAxIHdhcyAlZCIsIHJlc3AuZ2V0Q21kKCkpLAorICAgICAgICAgICAgICAgIHJlc3AuZ2V0Q21kKCkgPT0gMSk7CisgICAgICAgIGFzc2VydFRydWUoU3RyaW5nLmZvcm1hdCgiZXhwZWN0ZWQgdG9rZW4gPT0gOTg3NiB3YXMgJWQiLCByZXNwLmdldFRva2VuKCkpLAorICAgICAgICAgICAgICAgIHJlc3AuZ2V0VG9rZW4oKSA9PSA5ODc2KTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShTdHJpbmcuZm9ybWF0KCJleHBlY3RlZCBzdGF0dXMgPT0gMCB3YXMgJWQiLCByZXNwLmdldFN0YXR1cygpKSwKKyAgICAgICAgICAgICAgICByZXNwLmdldFN0YXR1cygpID09IDApOworCisgICAgICAgIFJpbEN0cmxDbWRzLkN0cmxSc3BSYWRpb1N0YXRlIHJzcCA9IHJlc3AuZ2V0RGF0YUFzKFJpbEN0cmxDbWRzLkN0cmxSc3BSYWRpb1N0YXRlLmNsYXNzKTsKKworICAgICAgICBpbnQgc3RhdGUgPSByc3AuZ2V0U3RhdGUoKTsKKyAgICAgICAgbG9nKCJ0ZXN0R2V0UmFkaW9TdGF0ZSBzdGF0ZT0iICsgc3RhdGUpOworICAgICAgICBhc3NlcnRUcnVlKFN0cmluZy5mb3JtYXQoImV4cGVjdGVkIFJhZGlvU3RhdGUgPj0gMCAmJiBSYWRpb1N0YXRlIDw9IDkgd2FzICVkIiwgc3RhdGUpLAorICAgICAgICAgICAgICAgICgoc3RhdGUgPj0gMCkgJiYgKHN0YXRlIDw9IDkpKSk7CisKKyAgICAgICAgbG9nKCJ0ZXN0R2V0UmFkaW9TdGF0ZSBYIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFNldFJhZGlvU3RhdGUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBsb2coInRlc3RTZXRSYWRpb1N0YXRlIEUiKTsKKworICAgICAgICBSaWxDdHJsQ21kcy5DdHJsUmVxUmFkaW9TdGF0ZSBjbWRycyA9IG5ldyBSaWxDdHJsQ21kcy5DdHJsUmVxUmFkaW9TdGF0ZSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgY21kcnMuZ2V0U3RhdGUoKSk7CisKKyAgICAgICAgY21kcnMuc2V0U3RhdGUoUmlsQ21kcy5SQURJT1NUQVRFX1NJTV9OT1RfUkVBRFkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgY21kcnMuZ2V0U3RhdGUoKSk7CisKKyAgICAgICAgTXNnLnNlbmQobU1vY2tSaWxDaGFubmVsLCBSaWxDdHJsQ21kcy5DVFJMX0NNRF9TRVRfUkFESU9fU1RBVEUsIDAsIDAsIGNtZHJzKTsKKworICAgICAgICBNc2cgcmVzcCA9IE1zZy5yZWN2KG1Nb2NrUmlsQ2hhbm5lbCk7CisKKyAgICAgICAgUmlsQ3RybENtZHMuQ3RybFJzcFJhZGlvU3RhdGUgcnNwID0gcmVzcC5nZXREYXRhQXMoUmlsQ3RybENtZHMuQ3RybFJzcFJhZGlvU3RhdGUuY2xhc3MpOworCisgICAgICAgIGludCBzdGF0ZSA9IHJzcC5nZXRTdGF0ZSgpOworICAgICAgICBsb2coImdldCByZXNwb25zZSBmb3IgdGVzdFNldFJhZGlvU3RhdGU6ICIgKyBzdGF0ZSk7CisgICAgICAgIGFzc2VydFRydWUoUmlsQ21kcy5SQURJT1NUQVRFX1NJTV9OT1RfUkVBRFkgPT0gc3RhdGUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvTG9hZGVyVGVzdENhc2UuamF2YSBiL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvTG9hZGVyVGVzdENhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmU2NTkwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9Mb2FkZXJUZXN0Q2FzZS5qYXZhCkBAIC0wLDAgKzEsMTAxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKKyAqLworCitwYWNrYWdlIGFuZHJvaWQudGVzdDsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Mb2FkZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkxvYWRlci5PbkxvYWRDb21wbGV0ZUxpc3RlbmVyOworaW1wb3J0IGFuZHJvaWQub3MuQXN5bmNUYXNrOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CisKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5BcnJheUJsb2NraW5nUXVldWU7CisKKy8qKgorICogQSBjb252ZW5pZW5jZSBjbGFzcyBmb3IgdGVzdGluZyB7QGxpbmsgTG9hZGVyfXMuIFRoaXMgdGVzdCBjYXNlCisgKiBwcm92aWRlcyBhIHNpbXBsZSB3YXkgdG8gc3luY2hyb25vdXNseSBnZXQgdGhlIHJlc3VsdCBmcm9tIGEgTG9hZGVyIG1ha2luZworICogaXQgZWFzeSB0byBhc3NlcnQgdGhhdCB0aGUgTG9hZGVyIHJldHVybnMgdGhlIGV4cGVjdGVkIHJlc3VsdC4KKyAqLworcHVibGljIGNsYXNzIExvYWRlclRlc3RDYXNlIGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlIHsKKyAgICBzdGF0aWMgeworICAgICAgICAvLyBGb3JjZSBjbGFzcyBsb2FkaW5nIG9mIEFzeW5jVGFzayBvbiB0aGUgbWFpbiB0aHJlYWQgc28gdGhhdCBpdCdzIGhhbmRsZXJzIGFyZSB0aWVkIHRvCisgICAgICAgIC8vIHRoZSBtYWluIHRocmVhZCBhbmQgcmVzcG9uc2VzIGZyb20gdGhlIHdvcmtlciB0aHJlYWQgZ2V0IGRlbGl2ZXJlZCBvbiB0aGUgbWFpbiB0aHJlYWQuCisgICAgICAgIC8vIFRoZSB0ZXN0cyBhcmUgcnVuIG9uIGFub3RoZXIgdGhyZWFkLCBhbGxvd2luZyB0aGVtIHRvIGJsb2NrIHdhaXRpbmcgb24gYSByZXNwb25zZSBmcm9tCisgICAgICAgIC8vIHRoZSBjb2RlIHJ1bm5pbmcgb24gdGhlIG1haW4gdGhyZWFkLiBUaGUgbWFpbiB0aHJlYWQgY2FuJ3QgYmxvY2sgc2luY2UgdGhlIEF5c25jVGFzaworICAgICAgICAvLyByZXN1bHRzIGNvbWUgaW4gdmlhIHRoZSBldmVudCBsb29wLgorICAgICAgICBuZXcgQXN5bmNUYXNrPFZvaWQsIFZvaWQsIFZvaWQ+KCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwcm90ZWN0ZWQgVm9pZCBkb0luQmFja2dyb3VuZChWb2lkLi4uIGFyZ3MpIHtyZXR1cm4gbnVsbDt9CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uUG9zdEV4ZWN1dGUoVm9pZCByZXN1bHQpIHt9CisgICAgICAgIH07CisgICAgfQorCisgICAgLyoqCisgICAgICogUnVucyBhIExvYWRlciBzeW5jaHJvbm91c2x5IGFuZCByZXR1cm5zIHRoZSByZXN1bHQgb2YgdGhlIGxvYWQuIFRoZSBsb2FkZXIgd2lsbAorICAgICAqIGJlIHN0YXJ0ZWQsIHN0b3BwZWQsIGFuZCBkZXN0cm95ZWQgYnkgdGhpcyBtZXRob2Qgc28gaXQgY2Fubm90IGJlIHJldXNlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsb2FkZXIgVGhlIGxvYWRlciB0byBydW4gc3luY2hyb25vdXNseQorICAgICAqIEByZXR1cm4gVGhlIHJlc3VsdCBmcm9tIHRoZSBsb2FkZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgPFQ+IFQgZ2V0TG9hZGVyUmVzdWx0U3luY2hyb25vdXNseShmaW5hbCBMb2FkZXI8VD4gbG9hZGVyKSB7CisgICAgICAgIC8vIFRoZSB0ZXN0IHRocmVhZCBibG9ja3Mgb24gdGhpcyBxdWV1ZSB1bnRpbCB0aGUgbG9hZGVyIHB1dHMgaXQncyByZXN1bHQgaW4KKyAgICAgICAgZmluYWwgQXJyYXlCbG9ja2luZ1F1ZXVlPFQ+IHF1ZXVlID0gbmV3IEFycmF5QmxvY2tpbmdRdWV1ZTxUPigxKTsKKworICAgICAgICAvLyBUaGlzIGNhbGxiYWNrIHJ1bnMgb24gdGhlICJtYWluIiB0aHJlYWQgYW5kIHVuYmxvY2tzIHRoZSB0ZXN0IHRocmVhZAorICAgICAgICAvLyB3aGVuIGl0IHB1dHMgdGhlIHJlc3VsdCBpbnRvIHRoZSBibG9ja2luZyBxdWV1ZQorICAgICAgICBmaW5hbCBPbkxvYWRDb21wbGV0ZUxpc3RlbmVyPFQ+IGxpc3RlbmVyID0gbmV3IE9uTG9hZENvbXBsZXRlTGlzdGVuZXI8VD4oKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uTG9hZENvbXBsZXRlKExvYWRlcjxUPiBjb21wbGV0ZWRMb2FkZXIsIFQgZGF0YSkgeworICAgICAgICAgICAgICAgIC8vIFNodXQgdGhlIGxvYWRlciBkb3duCisgICAgICAgICAgICAgICAgY29tcGxldGVkTG9hZGVyLnVucmVnaXN0ZXJMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgICAgICAgICBjb21wbGV0ZWRMb2FkZXIuc3RvcExvYWRpbmcoKTsKKyAgICAgICAgICAgICAgICBjb21wbGV0ZWRMb2FkZXIuZGVzdHJveSgpOworCisgICAgICAgICAgICAgICAgLy8gU3RvcmUgdGhlIHJlc3VsdCwgdW5ibG9ja2luZyB0aGUgdGVzdCB0aHJlYWQKKyAgICAgICAgICAgICAgICBxdWV1ZS5hZGQoZGF0YSk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgLy8gVGhpcyBoYW5kbGVyIHJ1bnMgb24gdGhlICJtYWluIiB0aHJlYWQgb2YgdGhlIHByb2Nlc3Mgc2luY2UgQXN5bmNUYXNrCisgICAgICAgIC8vIGlzIGRvY3VtZW50ZWQgYXMgbmVlZGluZyB0byBydW4gb24gdGhlIG1haW4gdGhyZWFkIGFuZCBtYW55IExvYWRlcnMgdXNlCisgICAgICAgIC8vIEFzeW5jVGFzaworICAgICAgICBmaW5hbCBIYW5kbGVyIG1haW5UaHJlYWRIYW5kbGVyID0gbmV3IEhhbmRsZXIoTG9vcGVyLmdldE1haW5Mb29wZXIoKSkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7CisgICAgICAgICAgICAgICAgbG9hZGVyLnJlZ2lzdGVyTGlzdGVuZXIoMCwgbGlzdGVuZXIpOworICAgICAgICAgICAgICAgIGxvYWRlci5zdGFydExvYWRpbmcoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICAvLyBBc2sgdGhlIG1haW4gdGhyZWFkIHRvIHN0YXJ0IHRoZSBsb2FkaW5nIHByb2Nlc3MKKyAgICAgICAgbWFpblRocmVhZEhhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZSgwKTsKKworICAgICAgICAvLyBCbG9jayBvbiB0aGUgcXVldWUgd2FpdGluZyBmb3IgdGhlIHJlc3VsdCBvZiB0aGUgbG9hZCB0byBiZSBpbnNlcnRlZAorICAgICAgICBUIHJlc3VsdDsKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gcXVldWUudGFrZSgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJ3YWl0aW5nIHRocmVhZCBpbnRlcnJ1cHRlZCIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L1Byb3ZpZGVyVGVzdENhc2UuamF2YSBiL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvUHJvdmlkZXJUZXN0Q2FzZS5qYXZhCmluZGV4IGUxMTcyY2YuLjc0Y2ViZWUgMTAwNjQ0Ci0tLSBhL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvUHJvdmlkZXJUZXN0Q2FzZS5qYXZhCisrKyBiL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvUHJvdmlkZXJUZXN0Q2FzZS5qYXZhCkBAIC03Myw2ICs3MywxOCBAQAogICAgICAgICBtUmVzb2x2ZXIuYWRkUHJvdmlkZXIobVByb3ZpZGVyQXV0aG9yaXR5LCBnZXRQcm92aWRlcigpKTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBUZWFycyBkb3duIHRoZSBlbnZpcm9ubWVudCBmb3IgdGhlIHRlc3QgZml4dHVyZS4KKyAgICAgKiA8cD4KKyAgICAgKiBDYWxscyB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRQcm92aWRlciNzaHV0ZG93bigpfSBvbiB0aGUKKyAgICAgKiB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRQcm92aWRlcn0gcmVwcmVzZW50ZWQgYnkgbVByb3ZpZGVyLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG1Qcm92aWRlci5zaHV0ZG93bigpOworICAgICAgICBzdXBlci50ZWFyRG93bigpOworICAgIH0KKwogICAgIHB1YmxpYyBNb2NrQ29udGVudFJlc29sdmVyIGdldE1vY2tDb250ZW50UmVzb2x2ZXIoKSB7CiAgICAgICAgIHJldHVybiBtUmVzb2x2ZXI7CiAgICAgfQpkaWZmIC0tZ2l0IGEvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9Qcm92aWRlclRlc3RDYXNlMi5qYXZhIGIvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9Qcm92aWRlclRlc3RDYXNlMi5qYXZhCmluZGV4IDFmYjU1MzguLjY0ZDExYzUgMTAwNjQ0Ci0tLSBhL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvUHJvdmlkZXJUZXN0Q2FzZTIuamF2YQorKysgYi90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L1Byb3ZpZGVyVGVzdENhc2UyLmphdmEKQEAgLTE0MSw2ICsxNDEsMTggQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBUZWFycyBkb3duIHRoZSBlbnZpcm9ubWVudCBmb3IgdGhlIHRlc3QgZml4dHVyZS4KKyAgICAgKiA8cD4KKyAgICAgKiBDYWxscyB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRQcm92aWRlciNzaHV0ZG93bigpfSBvbiB0aGUKKyAgICAgKiB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRQcm92aWRlcn0gcmVwcmVzZW50ZWQgYnkgbVByb3ZpZGVyLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG1Qcm92aWRlci5zaHV0ZG93bigpOworICAgICAgICBzdXBlci50ZWFyRG93bigpOworICAgIH0KKworICAgIC8qKgogICAgICAqIEdldHMgdGhlIHtAbGluayBNb2NrQ29udGVudFJlc29sdmVyfSBjcmVhdGVkIGJ5IHRoaXMgY2xhc3MgZHVyaW5nIGluaXRpYWxpemF0aW9uLiBZb3UKICAgICAgKiBtdXN0IHVzZSB0aGUgbWV0aG9kcyBvZiB0aGlzIHJlc29sdmVyIHRvIGFjY2VzcyB0aGUgcHJvdmlkZXIgdW5kZXIgdGVzdC4KICAgICAgKgpkaWZmIC0tZ2l0IGEvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9SZW5hbWluZ0RlbGVnYXRpbmdDb250ZXh0LmphdmEgYi90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L1JlbmFtaW5nRGVsZWdhdGluZ0NvbnRleHQuamF2YQppbmRleCA5NzNiOWYyLi5lZWUzYWQ3IDEwMDY0NAotLS0gYS90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L1JlbmFtaW5nRGVsZWdhdGluZ0NvbnRleHQuamF2YQorKysgYi90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L1JlbmFtaW5nRGVsZWdhdGluZ0NvbnRleHQuamF2YQpAQCAtMjEsNiArMjEsNyBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0V3JhcHBlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFByb3ZpZGVyOworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuRGF0YWJhc2VFcnJvckhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2U7CiBpbXBvcnQgYW5kcm9pZC5vcy5GaWxlVXRpbHM7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKQEAgLTE0OCw2ICsxNDksMTcgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU1FMaXRlRGF0YWJhc2Ugb3Blbk9yQ3JlYXRlRGF0YWJhc2UoU3RyaW5nIG5hbWUsCisgICAgICAgICAgICBpbnQgbW9kZSwgU1FMaXRlRGF0YWJhc2UuQ3Vyc29yRmFjdG9yeSBmYWN0b3J5LCBEYXRhYmFzZUVycm9ySGFuZGxlciBlcnJvckhhbmRsZXIpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGludGVybmFsTmFtZSA9IHJlbmFtZWRGaWxlTmFtZShuYW1lKTsKKyAgICAgICAgaWYgKCFtRGF0YWJhc2VOYW1lcy5jb250YWlucyhuYW1lKSkgeworICAgICAgICAgICAgbURhdGFiYXNlTmFtZXMuYWRkKG5hbWUpOworICAgICAgICAgICAgbUZpbGVDb250ZXh0LmRlbGV0ZURhdGFiYXNlKGludGVybmFsTmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1GaWxlQ29udGV4dC5vcGVuT3JDcmVhdGVEYXRhYmFzZShpbnRlcm5hbE5hbWUsIG1vZGUsIGZhY3RvcnksIGVycm9ySGFuZGxlcik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gZGVsZXRlRGF0YWJhc2UoU3RyaW5nIG5hbWUpIHsKICAgICAgICAgaWYgKG1EYXRhYmFzZU5hbWVzLmNvbnRhaW5zKG5hbWUpKSB7CiAgICAgICAgICAgICBtRGF0YWJhc2VOYW1lcy5yZW1vdmUobmFtZSk7CmRpZmYgLS1naXQgYS90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L21vY2svTW9ja0NvbnRlbnRQcm92aWRlci5qYXZhIGIvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9tb2NrL01vY2tDb250ZW50UHJvdmlkZXIuamF2YQppbmRleCAzZmQ3MWM4Li5iNjNmZjNkIDEwMDY0NAotLS0gYS90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L21vY2svTW9ja0NvbnRlbnRQcm92aWRlci5qYXZhCisrKyBiL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvbW9jay9Nb2NrQ29udGVudFByb3ZpZGVyLmphdmEKQEAgLTEyNyw2ICsxMjcsMTYgQEAKICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwogICAgICAgICB9CiAKKyAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRTdHJlYW1UeXBlcyhVcmkgdXJsLCBTdHJpbmcgbWltZVR5cGVGaWx0ZXIpIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgICAgICAgICAgcmV0dXJuIE1vY2tDb250ZW50UHJvdmlkZXIudGhpcy5nZXRTdHJlYW1UeXBlcyh1cmwsIG1pbWVUeXBlRmlsdGVyKTsKKyAgICAgICAgfQorCisgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQorICAgICAgICBwdWJsaWMgQXNzZXRGaWxlRGVzY3JpcHRvciBvcGVuVHlwZWRBc3NldEZpbGUoVXJpIHVybCwgU3RyaW5nIG1pbWVUeXBlLCBCdW5kbGUgb3B0cykKKyAgICAgICAgICAgICAgICB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uLCBGaWxlTm90Rm91bmRFeGNlcHRpb24geworICAgICAgICAgICAgcmV0dXJuIE1vY2tDb250ZW50UHJvdmlkZXIudGhpcy5vcGVuVHlwZWRBc3NldEZpbGUodXJsLCBtaW1lVHlwZSwgb3B0cyk7CisgICAgICAgIH0KICAgICB9CiAgICAgcHJpdmF0ZSBmaW5hbCBJbnZlcnNpb25JQ29udGVudFByb3ZpZGVyIG1JQ29udGVudFByb3ZpZGVyID0gbmV3IEludmVyc2lvbklDb250ZW50UHJvdmlkZXIoKTsKIApAQCAtMjIyLDYgKzIzMiwxNCBAQAogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInVuaW1wbGVtZW50ZWQgbW9jayBtZXRob2QgY2FsbCIpOwogICAgIH0KIAorICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRTdHJlYW1UeXBlcyhVcmkgdXJsLCBTdHJpbmcgbWltZVR5cGVGaWx0ZXIpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJ1bmltcGxlbWVudGVkIG1vY2sgbWV0aG9kIGNhbGwiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQXNzZXRGaWxlRGVzY3JpcHRvciBvcGVuVHlwZWRBc3NldEZpbGUoVXJpIHVybCwgU3RyaW5nIG1pbWVUeXBlLCBCdW5kbGUgb3B0cykgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInVuaW1wbGVtZW50ZWQgbW9jayBtZXRob2QgY2FsbCIpOworICAgIH0KKwogICAgIC8qKgogICAgICAqIFJldHVybnMgSUNvbnRlbnRQcm92aWRlciB3aGljaCBjYWxscyBiYWNrIHNhbWUgbWV0aG9kcyBpbiB0aGlzIGNsYXNzLgogICAgICAqIEJ5IG92ZXJyaWRpbmcgdGhpcyBjbGFzcywgd2UgYXZvaWQgdGhlIG1lY2hhbmlzbSBoaWRkZW4gYmVoaW5kIENvbnRlbnRQcm92aWRlcgpkaWZmIC0tZ2l0IGEvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9tb2NrL01vY2tDb250ZXh0LmphdmEgYi90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L21vY2svTW9ja0NvbnRleHQuamF2YQppbmRleCBmZmQ3NTdjLi5jMzFjOWNjIDEwMDY0NAotLS0gYS90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L21vY2svTW9ja0NvbnRleHQuamF2YQorKysgYi90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L21vY2svTW9ja0NvbnRleHQuamF2YQpAQCAtMjksNiArMjksNyBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkFzc2V0TWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkRhdGFiYXNlRXJyb3JIYW5kbGVyOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7CkBAIC0xODQsNiArMTg1LDEyIEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNRTGl0ZURhdGFiYXNlIG9wZW5PckNyZWF0ZURhdGFiYXNlKFN0cmluZyBmaWxlLCBpbnQgbW9kZSwKKyAgICAgICAgICAgIFNRTGl0ZURhdGFiYXNlLkN1cnNvckZhY3RvcnkgZmFjdG9yeSwgRGF0YWJhc2VFcnJvckhhbmRsZXIgZXJyb3JIYW5kbGVyKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBGaWxlIGdldERhdGFiYXNlUGF0aChTdHJpbmcgbmFtZSkgewogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKICAgICB9CmRpZmYgLS1naXQgYS90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L21vY2svTW9ja0N1cnNvci5qYXZhIGIvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9tb2NrL01vY2tDdXJzb3IuamF2YQppbmRleCA5YjFjMGVmLi5iYWExNTBhIDEwMDY0NAotLS0gYS90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L21vY2svTW9ja0N1cnNvci5qYXZhCisrKyBiL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvbW9jay9Nb2NrQ3Vyc29yLmphdmEKQEAgLTE3OCwzNiArMTc4LDExIEBACiAgICAgfQogCiAgICAgQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKLSAgICBwdWJsaWMgYm9vbGVhbiBjb21taXRVcGRhdGVzKCkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInVuaW1wbGVtZW50ZWQgbW9jayBtZXRob2QiKTsKLSAgICB9Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQotICAgIHB1YmxpYyBib29sZWFuIGNvbW1pdFVwZGF0ZXMoTWFwPD8gZXh0ZW5kcyBMb25nLCA/IGV4dGVuZHMgTWFwPFN0cmluZywgT2JqZWN0Pj4gdmFsdWVzKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigidW5pbXBsZW1lbnRlZCBtb2NrIG1ldGhvZCIpOwotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCi0gICAgcHVibGljIGJvb2xlYW4gaGFzVXBkYXRlcygpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJ1bmltcGxlbWVudGVkIG1vY2sgbWV0aG9kIik7Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKICAgICBwdWJsaWMgdm9pZCBzZXROb3RpZmljYXRpb25VcmkoQ29udGVudFJlc29sdmVyIGNyLCBVcmkgdXJpKSB7CiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigidW5pbXBsZW1lbnRlZCBtb2NrIG1ldGhvZCIpOwogICAgIH0KIAogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCi0gICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNVcGRhdGVzKCkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInVuaW1wbGVtZW50ZWQgbW9jayBtZXRob2QiKTsKLSAgICB9Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQotICAgIHB1YmxpYyBib29sZWFuIGRlbGV0ZVJvdygpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJ1bmltcGxlbWVudGVkIG1vY2sgbWV0aG9kIik7Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKICAgICBwdWJsaWMgdm9pZCB1bnJlZ2lzdGVyQ29udGVudE9ic2VydmVyKENvbnRlbnRPYnNlcnZlciBvYnNlcnZlcikgewogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInVuaW1wbGVtZW50ZWQgbW9jayBtZXRob2QiKTsKICAgICB9CkBAIC0yMTcsNDggKzE5Miw3IEBACiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigidW5pbXBsZW1lbnRlZCBtb2NrIG1ldGhvZCIpOwogICAgIH0KIAotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCi0gICAgcHVibGljIGJvb2xlYW4gdXBkYXRlQmxvYihpbnQgY29sdW1uSW5kZXgsIGJ5dGVbXSB2YWx1ZSkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInVuaW1wbGVtZW50ZWQgbW9jayBtZXRob2QiKTsKLSAgICB9Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQotICAgIHB1YmxpYyBib29sZWFuIHVwZGF0ZURvdWJsZShpbnQgY29sdW1uSW5kZXgsIGRvdWJsZSB2YWx1ZSkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInVuaW1wbGVtZW50ZWQgbW9jayBtZXRob2QiKTsKLSAgICB9Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQotICAgIHB1YmxpYyBib29sZWFuIHVwZGF0ZUZsb2F0KGludCBjb2x1bW5JbmRleCwgZmxvYXQgdmFsdWUpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJ1bmltcGxlbWVudGVkIG1vY2sgbWV0aG9kIik7Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKLSAgICBwdWJsaWMgYm9vbGVhbiB1cGRhdGVJbnQoaW50IGNvbHVtbkluZGV4LCBpbnQgdmFsdWUpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJ1bmltcGxlbWVudGVkIG1vY2sgbWV0aG9kIik7Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKLSAgICBwdWJsaWMgYm9vbGVhbiB1cGRhdGVMb25nKGludCBjb2x1bW5JbmRleCwgbG9uZyB2YWx1ZSkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInVuaW1wbGVtZW50ZWQgbW9jayBtZXRob2QiKTsKLSAgICB9Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQotICAgIHB1YmxpYyBib29sZWFuIHVwZGF0ZVNob3J0KGludCBjb2x1bW5JbmRleCwgc2hvcnQgdmFsdWUpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJ1bmltcGxlbWVudGVkIG1vY2sgbWV0aG9kIik7Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKLSAgICBwdWJsaWMgYm9vbGVhbiB1cGRhdGVTdHJpbmcoaW50IGNvbHVtbkluZGV4LCBTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJ1bmltcGxlbWVudGVkIG1vY2sgbWV0aG9kIik7Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKLSAgICBwdWJsaWMgYm9vbGVhbiB1cGRhdGVUb051bGwoaW50IGNvbHVtbkluZGV4KSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigidW5pbXBsZW1lbnRlZCBtb2NrIG1ldGhvZCIpOwotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCi0gICAgcHVibGljIHZvaWQgYWJvcnRVcGRhdGVzKCkgeworICAgIHB1YmxpYyBpbnQgZ2V0VHlwZShpbnQgY29sdW1uSW5kZXgpIHsKICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJ1bmltcGxlbWVudGVkIG1vY2sgbWV0aG9kIik7CiAgICAgfQogfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvbW9jay9Nb2NrSUNvbnRlbnRQcm92aWRlci5qYXZhIGIvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9tb2NrL01vY2tJQ29udGVudFByb3ZpZGVyLmphdmEKaW5kZXggMGJlNWJlYS4uMTgzYmU0MSAxMDA2NDQKLS0tIGEvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9tb2NrL01vY2tJQ29udGVudFByb3ZpZGVyLmphdmEKKysrIGIvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9tb2NrL01vY2tJQ29udGVudFByb3ZpZGVyLmphdmEKQEAgLTMyLDYgKzMyLDcgQEAKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yOwogaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwogCitpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIAogLyoqCkBAIC0xMDIsNCArMTAzLDEzIEBACiAgICAgcHVibGljIElCaW5kZXIgYXNCaW5kZXIoKSB7CiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigidW5pbXBsZW1lbnRlZCBtb2NrIG1ldGhvZCIpOwogICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRTdHJlYW1UeXBlcyhVcmkgdXJsLCBTdHJpbmcgbWltZVR5cGVGaWx0ZXIpIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInVuaW1wbGVtZW50ZWQgbW9jayBtZXRob2QiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQXNzZXRGaWxlRGVzY3JpcHRvciBvcGVuVHlwZWRBc3NldEZpbGUoVXJpIHVybCwgU3RyaW5nIG1pbWVUeXBlLCBCdW5kbGUgb3B0cykKKyAgICAgICAgICAgIHRocm93cyBSZW1vdGVFeGNlcHRpb24sIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigidW5pbXBsZW1lbnRlZCBtb2NrIG1ldGhvZCIpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3Qvc3VpdGVidWlsZGVyL1Rlc3RHcm91cGluZy5qYXZhIGIvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9zdWl0ZWJ1aWxkZXIvVGVzdEdyb3VwaW5nLmphdmEKaW5kZXggZGY2ZGE3MC4uYTJiOTRmZiAxMDA2NDQKLS0tIGEvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9zdWl0ZWJ1aWxkZXIvVGVzdEdyb3VwaW5nLmphdmEKKysrIGIvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9zdWl0ZWJ1aWxkZXIvVGVzdEdyb3VwaW5nLmphdmEKQEAgLTQ2LDYgKzQ2LDggQEAKICAqLwogcHVibGljIGNsYXNzIFRlc3RHcm91cGluZyB7CiAKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJUZXN0R3JvdXBpbmciOworCiAgICAgU29ydGVkU2V0PENsYXNzPD8gZXh0ZW5kcyBUZXN0Q2FzZT4+IHRlc3RDYXNlQ2xhc3NlczsKIAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29tcGFyYXRvcjxDbGFzczw/IGV4dGVuZHMgVGVzdENhc2U+PiBTT1JUX0JZX1NJTVBMRV9OQU1FCkBAIC0xMTQsNyArMTE2LDcgQEAKICAgICAgICAgZm9yIChTdHJpbmcgcGFja2FnZU5hbWUgOiBwYWNrYWdlTmFtZXMpIHsKICAgICAgICAgICAgIExpc3Q8Q2xhc3M8PyBleHRlbmRzIFRlc3RDYXNlPj4gYWRkZWRDbGFzc2VzID0gdGVzdENhc2VDbGFzc2VzSW5QYWNrYWdlKHBhY2thZ2VOYW1lKTsKICAgICAgICAgICAgIGlmIChhZGRlZENsYXNzZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoIlRlc3RHcm91cGluZyIsICJJbnZhbGlkIFBhY2thZ2U6ICciICsgcGFja2FnZU5hbWUKKyAgICAgICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiSW52YWxpZCBQYWNrYWdlOiAnIiArIHBhY2thZ2VOYW1lCiAgICAgICAgICAgICAgICAgICAgICAgICArICInIGNvdWxkIG5vdCBiZSBmb3VuZCBvciBoYXMgbm8gdGVzdHMiKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHRlc3RDYXNlQ2xhc3Nlcy5hZGRBbGwoYWRkZWRDbGFzc2VzKTsKQEAgLTIzNCw2ICsyMzYsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIExvZy5pKExPR19UQUcsIFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICJUZXN0Q2FzZSBjbGFzcyAlcyBpcyBtaXNzaW5nIGEgcHVibGljIGNvbnN0cnVjdG9yIHdpdGggbm8gcGFyYW1ldGVycyAiICsKKyAgICAgICAgICAgICAgICAgICAgIm9yIGEgc2luZ2xlIFN0cmluZyBwYXJhbWV0ZXIgLSBza2lwcGluZyIsCisgICAgICAgICAgICAgICAgICAgIGFDbGFzcy5nZXROYW1lKCkpKTsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgIH0KZGlmZiAtLWdpdCBhL3Rlc3QtcnVubmVyL3Rlc3RzL3NyYy9hbmRyb2lkL3Rlc3Qvc3VpdGVidWlsZGVyL1Rlc3RHcm91cGluZ1Rlc3QuamF2YSBiL3Rlc3QtcnVubmVyL3Rlc3RzL3NyYy9hbmRyb2lkL3Rlc3Qvc3VpdGVidWlsZGVyL1Rlc3RHcm91cGluZ1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDQ3N2QxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC1ydW5uZXIvdGVzdHMvc3JjL2FuZHJvaWQvdGVzdC9zdWl0ZWJ1aWxkZXIvVGVzdEdyb3VwaW5nVGVzdC5qYXZhCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworLyoqCisgKiBVbml0IHRlc3RzIGZvciB7QGxpbmsgVGVzdEdyb3VwaW5nfQorICovCitwdWJsaWMgY2xhc3MgVGVzdEdyb3VwaW5nVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIHByaXZhdGUgVGVzdEdyb3VwaW5nIG1Hcm91cGluZzsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnNldFVwKCk7CisgICAgICAgIG1Hcm91cGluZyA9IG5ldyBUZXN0R3JvdXBpbmcoVGVzdEdyb3VwaW5nLlNPUlRfQllfU0lNUExFX05BTUUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFZlcmlmaWVzIHRoYXQgVGVzdENhc2VzIHdpdGggbm8gcHVibGljIGNvbnN0cnVjdG9yIGFyZSBub3QgbG9hZGVkLgorICAgICAqIFJlbGllcyBvbiBmaXh0dXJlIGNsYXNzZXMgaW4gYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5leGFtcGxlcy5jb25zdHJ1Y3RvcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRUZXN0c19ub1B1YmxpY0NvbnN0cnVjdG9yKCkgeworICAgICAgICBtR3JvdXBpbmcuYWRkUGFja2FnZXNSZWN1cnNpdmUoImFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuZXhhbXBsZXMuY29uc3RydWN0b3IiKTsKKyAgICAgICAgTGlzdDxUZXN0TWV0aG9kPiB0ZXN0cyA9IG1Hcm91cGluZy5nZXRUZXN0cygpOworICAgICAgICAvLyBvbmx5IHRoZSBQdWJsaWNDb25zdHJ1Y3RvclRlc3QncyB0ZXN0IG1ldGhvZCBzaG91bGQgYmUgcHJlc2VudAorICAgICAgICBhc3NlcnRFcXVhbHMoMSwgdGVzdHMuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXN0UHVibGljQ29uc3RydWN0b3IiLCB0ZXN0cy5nZXQoMCkuZ2V0TmFtZSgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0LXJ1bm5lci90ZXN0cy9zcmMvYW5kcm9pZC90ZXN0L3N1aXRlYnVpbGRlci9leGFtcGxlcy9jb25zdHJ1Y3Rvci9Ob1B1YmxpY0NvbnN0cnVjdG9yVGVzdC5qYXZhIGIvdGVzdC1ydW5uZXIvdGVzdHMvc3JjL2FuZHJvaWQvdGVzdC9zdWl0ZWJ1aWxkZXIvZXhhbXBsZXMvY29uc3RydWN0b3IvTm9QdWJsaWNDb25zdHJ1Y3RvclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzkwOWExCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC1ydW5uZXIvdGVzdHMvc3JjL2FuZHJvaWQvdGVzdC9zdWl0ZWJ1aWxkZXIvZXhhbXBsZXMvY29uc3RydWN0b3IvTm9QdWJsaWNDb25zdHJ1Y3RvclRlc3QuamF2YQpAQCAtMCwwICsxLDM1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmV4YW1wbGVzLmNvbnN0cnVjdG9yOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCisvKioKKyAqIEEge0BsaW5rIFRlc3RDYXNlfSB3aGljaCBzaG91bGQgbm90IGJlIGxvYWRlZCBzaW5jZSBpdCBoYXMgbm9uLXB1YmxpYyBjb25zdHJ1Y3RvcnMgd2l0aCBubyBhcmdzLgorICovCitwdWJsaWMgY2xhc3MgTm9QdWJsaWNDb25zdHJ1Y3RvclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICBOb1B1YmxpY0NvbnN0cnVjdG9yVGVzdCgpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgTm9QdWJsaWNDb25zdHJ1Y3RvclRlc3QoU3RyaW5nIGZvbywgU3RyaW5nIGZvbzIpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm90UnVuKCkgeworICAgICAgICBmYWlsKCJtZXRob2QgaW4gTm9QdWJsaWNDb25zdHJ1Y3RvclRlc3QgcnVuIHVuZXhwZWN0ZWRseSIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QtcnVubmVyL3Rlc3RzL3NyYy9hbmRyb2lkL3Rlc3Qvc3VpdGVidWlsZGVyL2V4YW1wbGVzL2NvbnN0cnVjdG9yL1Byb3RlY3RlZENvbnN0cnVjdG9yVGVzdC5qYXZhIGIvdGVzdC1ydW5uZXIvdGVzdHMvc3JjL2FuZHJvaWQvdGVzdC9zdWl0ZWJ1aWxkZXIvZXhhbXBsZXMvY29uc3RydWN0b3IvUHJvdGVjdGVkQ29uc3RydWN0b3JUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI4NjJmZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QtcnVubmVyL3Rlc3RzL3NyYy9hbmRyb2lkL3Rlc3Qvc3VpdGVidWlsZGVyL2V4YW1wbGVzL2NvbnN0cnVjdG9yL1Byb3RlY3RlZENvbnN0cnVjdG9yVGVzdC5qYXZhCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuZXhhbXBsZXMuY29uc3RydWN0b3I7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKKy8qKgorICogQSBwcm90ZWN0ZWQgY29uc3RydWN0b3IgdGVzdCBjYXNlIHRoYXQgc2hvdWxkIG5vdCBiZSBsb2FkZWQuCisgKi8KK3B1YmxpYyBjbGFzcyBQcm90ZWN0ZWRDb25zdHJ1Y3RvclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICBwcm90ZWN0ZWQgUHJvdGVjdGVkQ29uc3RydWN0b3JUZXN0KCkgeworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3ROb3RSdW4oKSB7CisgICAgICAgIGZhaWwoIm1ldGhvZCBpbiBQcm90ZWN0ZWRDb25zdHJ1Y3RvclRlc3QgcnVuIHVuZXhwZWN0ZWRseSIpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdC1ydW5uZXIvdGVzdHMvc3JjL2FuZHJvaWQvdGVzdC9zdWl0ZWJ1aWxkZXIvZXhhbXBsZXMvY29uc3RydWN0b3IvUHVibGljQ29uc3RydWN0b3JUZXN0LmphdmEgYi90ZXN0LXJ1bm5lci90ZXN0cy9zcmMvYW5kcm9pZC90ZXN0L3N1aXRlYnVpbGRlci9leGFtcGxlcy9jb25zdHJ1Y3Rvci9QdWJsaWNDb25zdHJ1Y3RvclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTFlMjVkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC1ydW5uZXIvdGVzdHMvc3JjL2FuZHJvaWQvdGVzdC9zdWl0ZWJ1aWxkZXIvZXhhbXBsZXMvY29uc3RydWN0b3IvUHVibGljQ29uc3RydWN0b3JUZXN0LmphdmEKQEAgLTAsMCArMSwyOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5leGFtcGxlcy5jb25zdHJ1Y3RvcjsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworLyoqCisgKiBBIHB1YmxpYyBjb25zdHJ1Y3RvciB0ZXN0IGNhc2UgdGhhdCBzaG91bGQgYmUgbG9hZGVkLgorICovCitwdWJsaWMgY2xhc3MgUHVibGljQ29uc3RydWN0b3JUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgcHVibGljIHZvaWQgdGVzdFB1YmxpY0NvbnN0cnVjdG9yKCkgeworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL0Jyb3dzZXJUZXN0UGx1Z2luL2puaS9QbHVnaW5PYmplY3QuaCBiL3Rlc3RzL0Jyb3dzZXJUZXN0UGx1Z2luL2puaS9QbHVnaW5PYmplY3QuaAppbmRleCBhMDU4ZDRhLi4wMzczNjdlIDEwMDY0NAotLS0gYS90ZXN0cy9Ccm93c2VyVGVzdFBsdWdpbi9qbmkvUGx1Z2luT2JqZWN0LmgKKysrIGIvdGVzdHMvQnJvd3NlclRlc3RQbHVnaW4vam5pL1BsdWdpbk9iamVjdC5oCkBAIC02NSw3ICs2NSw3IEBACiBwdWJsaWM6CiAgICAgU3ViUGx1Z2luKE5QUCBpbnN0KSA6IG1faW5zdChpbnN0KSB7fQogICAgIHZpcnR1YWwgflN1YlBsdWdpbigpIHt9Ci0gICAgdmlydHVhbCBpbnQxNiBoYW5kbGVFdmVudChjb25zdCBBTlBFdmVudCogZXZ0KSA9IDA7CisgICAgdmlydHVhbCBpbnQxNl90IGhhbmRsZUV2ZW50KGNvbnN0IEFOUEV2ZW50KiBldnQpID0gMDsKIAogICAgIE5QUCBpbnN0KCkgY29uc3QgeyByZXR1cm4gbV9pbnN0OyB9CiAKZGlmZiAtLWdpdCBhL3Rlc3RzL0Jyb3dzZXJUZXN0UGx1Z2luL2puaS9ldmVudC9FdmVudFBsdWdpbi5jcHAgYi90ZXN0cy9Ccm93c2VyVGVzdFBsdWdpbi9qbmkvZXZlbnQvRXZlbnRQbHVnaW4uY3BwCmluZGV4IDJlZmYzOTQuLjkxZjFiM2QgMTAwNjQ0Ci0tLSBhL3Rlc3RzL0Jyb3dzZXJUZXN0UGx1Z2luL2puaS9ldmVudC9FdmVudFBsdWdpbi5jcHAKKysrIGIvdGVzdHMvQnJvd3NlclRlc3RQbHVnaW4vam5pL2V2ZW50L0V2ZW50UGx1Z2luLmNwcApAQCAtMTM4LDcgKzEzOCw3IEBACiAgICAgYnJvd3Nlci0+bWVtZnJlZShiZWdpbk1lbSk7CiB9CiAKLWludDE2IEV2ZW50UGx1Z2luOjpoYW5kbGVFdmVudChjb25zdCBBTlBFdmVudCogZXZ0KSB7CitpbnQxNl90IEV2ZW50UGx1Z2luOjpoYW5kbGVFdmVudChjb25zdCBBTlBFdmVudCogZXZ0KSB7CiAgICAgc3dpdGNoIChldnQtPmV2ZW50VHlwZSkgewogCiAgICAgICAgIGNhc2Uga0RyYXdfQU5QRXZlbnRUeXBlOiB7CmRpZmYgLS1naXQgYS90ZXN0cy9Ccm93c2VyVGVzdFBsdWdpbi9qbmkvZXZlbnQvRXZlbnRQbHVnaW4uaCBiL3Rlc3RzL0Jyb3dzZXJUZXN0UGx1Z2luL2puaS9ldmVudC9FdmVudFBsdWdpbi5oCmluZGV4IDg4YjdjOWQuLjA0M2JlODUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL0Jyb3dzZXJUZXN0UGx1Z2luL2puaS9ldmVudC9FdmVudFBsdWdpbi5oCisrKyBiL3Rlc3RzL0Jyb3dzZXJUZXN0UGx1Z2luL2puaS9ldmVudC9FdmVudFBsdWdpbi5oCkBAIC0zMiw3ICszMiw3IEBACiBwdWJsaWM6CiAgICAgRXZlbnRQbHVnaW4oTlBQIGluc3QpOwogICAgIHZpcnR1YWwgfkV2ZW50UGx1Z2luKCk7Ci0gICAgdmlydHVhbCBpbnQxNiBoYW5kbGVFdmVudChjb25zdCBBTlBFdmVudCogZXZ0KTsKKyAgICB2aXJ0dWFsIGludDE2X3QgaGFuZGxlRXZlbnQoY29uc3QgQU5QRXZlbnQqIGV2dCk7CiAKIHByaXZhdGU6CiAgICAgdm9pZCBkcmF3UGx1Z2luKGNvbnN0IEFOUEJpdG1hcCYgYml0bWFwLCBjb25zdCBBTlBSZWN0SSYgY2xpcCk7CmRpZmYgLS1naXQgYS90ZXN0cy9Ccm93c2VyVGVzdFBsdWdpbi9qbmkvbWFpbi5jcHAgYi90ZXN0cy9Ccm93c2VyVGVzdFBsdWdpbi9qbmkvbWFpbi5jcHAKaW5kZXggNDAyYTdlMi4uNTExMTgwYyAxMDA2NDQKLS0tIGEvdGVzdHMvQnJvd3NlclRlc3RQbHVnaW4vam5pL21haW4uY3BwCisrKyBiL3Rlc3RzL0Jyb3dzZXJUZXN0UGx1Z2luL2puaS9tYWluLmNwcApAQCAtMzQsMTkgKzM0LDE5IEBACiBOUE5ldHNjYXBlRnVuY3MqIGJyb3dzZXI7CiAjZGVmaW5lIEVYUE9SVCBfX2F0dHJpYnV0ZV9fKCh2aXNpYmlsaXR5KCJkZWZhdWx0IikpKQogCi1OUEVycm9yIE5QUF9OZXcoTlBNSU1FVHlwZSBwbHVnaW5UeXBlLCBOUFAgaW5zdGFuY2UsIHVpbnQxNiBtb2RlLCBpbnQxNiBhcmdjLAorTlBFcnJvciBOUFBfTmV3KE5QTUlNRVR5cGUgcGx1Z2luVHlwZSwgTlBQIGluc3RhbmNlLCB1aW50MTZfdCBtb2RlLCBpbnQxNl90IGFyZ2MsCiAgICAgICAgIGNoYXIqIGFyZ25bXSwgY2hhciogYXJndltdLCBOUFNhdmVkRGF0YSogc2F2ZWQpOwogTlBFcnJvciBOUFBfRGVzdHJveShOUFAgaW5zdGFuY2UsIE5QU2F2ZWREYXRhKiogc2F2ZSk7CiBOUEVycm9yIE5QUF9TZXRXaW5kb3coTlBQIGluc3RhbmNlLCBOUFdpbmRvdyogd2luZG93KTsKIE5QRXJyb3IgTlBQX05ld1N0cmVhbShOUFAgaW5zdGFuY2UsIE5QTUlNRVR5cGUgdHlwZSwgTlBTdHJlYW0qIHN0cmVhbSwKLSAgICAgICAgTlBCb29sIHNlZWthYmxlLCB1aW50MTYqIHN0eXBlKTsKKyAgICAgICAgTlBCb29sIHNlZWthYmxlLCB1aW50MTZfdCogc3R5cGUpOwogTlBFcnJvciBOUFBfRGVzdHJveVN0cmVhbShOUFAgaW5zdGFuY2UsIE5QU3RyZWFtKiBzdHJlYW0sIE5QUmVhc29uIHJlYXNvbik7Ci1pbnQzMiAgIE5QUF9Xcml0ZVJlYWR5KE5QUCBpbnN0YW5jZSwgTlBTdHJlYW0qIHN0cmVhbSk7Ci1pbnQzMiAgIE5QUF9Xcml0ZShOUFAgaW5zdGFuY2UsIE5QU3RyZWFtKiBzdHJlYW0sIGludDMyIG9mZnNldCwgaW50MzIgbGVuLAoraW50MzJfdCAgIE5QUF9Xcml0ZVJlYWR5KE5QUCBpbnN0YW5jZSwgTlBTdHJlYW0qIHN0cmVhbSk7CitpbnQzMl90ICAgTlBQX1dyaXRlKE5QUCBpbnN0YW5jZSwgTlBTdHJlYW0qIHN0cmVhbSwgaW50MzJfdCBvZmZzZXQsIGludDMyX3QgbGVuLAogICAgICAgICB2b2lkKiBidWZmZXIpOwogdm9pZCAgICBOUFBfU3RyZWFtQXNGaWxlKE5QUCBpbnN0YW5jZSwgTlBTdHJlYW0qIHN0cmVhbSwgY29uc3QgY2hhciogZm5hbWUpOwogdm9pZCAgICBOUFBfUHJpbnQoTlBQIGluc3RhbmNlLCBOUFByaW50KiBwbGF0Zm9ybVByaW50KTsKLWludDE2ICAgTlBQX0hhbmRsZUV2ZW50KE5QUCBpbnN0YW5jZSwgdm9pZCogZXZlbnQpOworaW50MTZfdCAgIE5QUF9IYW5kbGVFdmVudChOUFAgaW5zdGFuY2UsIHZvaWQqIGV2ZW50KTsKIHZvaWQgICAgTlBQX1VSTE5vdGlmeShOUFAgaW5zdGFuY2UsIGNvbnN0IGNoYXIqIFVSTCwgTlBSZWFzb24gcmVhc29uLAogICAgICAgICB2b2lkKiBub3RpZnlEYXRhKTsKIE5QRXJyb3IgTlBQX0dldFZhbHVlKE5QUCBpbnN0YW5jZSwgTlBQVmFyaWFibGUgdmFyaWFibGUsIHZvaWQgKnZhbHVlKTsKQEAgLTEyOSw3ICsxMjksNyBAQAogICAgIHJldHVybiAiYXBwbGljYXRpb24veC1icm93c2VydGVzdHBsdWdpbjpidHA6QW5kcm9pZCBCcm93c2VyIFRlc3QgUGx1Z2luIjsKIH0KIAotTlBFcnJvciBOUFBfTmV3KE5QTUlNRVR5cGUgcGx1Z2luVHlwZSwgTlBQIGluc3RhbmNlLCB1aW50MTYgbW9kZSwgaW50MTYgYXJnYywKK05QRXJyb3IgTlBQX05ldyhOUE1JTUVUeXBlIHBsdWdpblR5cGUsIE5QUCBpbnN0YW5jZSwgdWludDE2X3QgbW9kZSwgaW50MTZfdCBhcmdjLAogICAgICAgICAgICAgICAgIGNoYXIqIGFyZ25bXSwgY2hhciogYXJndltdLCBOUFNhdmVkRGF0YSogc2F2ZWQpCiB7CiAKQEAgLTE4OCw3ICsxODgsNyBAQAogICAgIHJldHVybiBOUEVSUl9OT19FUlJPUjsKIH0KIAotTlBFcnJvciBOUFBfTmV3U3RyZWFtKE5QUCBpbnN0YW5jZSwgTlBNSU1FVHlwZSB0eXBlLCBOUFN0cmVhbSogc3RyZWFtLCBOUEJvb2wgc2Vla2FibGUsIHVpbnQxNiogc3R5cGUpCitOUEVycm9yIE5QUF9OZXdTdHJlYW0oTlBQIGluc3RhbmNlLCBOUE1JTUVUeXBlIHR5cGUsIE5QU3RyZWFtKiBzdHJlYW0sIE5QQm9vbCBzZWVrYWJsZSwgdWludDE2X3QqIHN0eXBlKQogewogICAgICpzdHlwZSA9IE5QX0FTRklMRU9OTFk7CiAgICAgcmV0dXJuIE5QRVJSX05PX0VSUk9SOwpAQCAtMTk5LDEyICsxOTksMTIgQEAKICAgICByZXR1cm4gTlBFUlJfTk9fRVJST1I7CiB9CiAKLWludDMyIE5QUF9Xcml0ZVJlYWR5KE5QUCBpbnN0YW5jZSwgTlBTdHJlYW0qIHN0cmVhbSkKK2ludDMyX3QgTlBQX1dyaXRlUmVhZHkoTlBQIGluc3RhbmNlLCBOUFN0cmVhbSogc3RyZWFtKQogewogICAgIHJldHVybiAwOwogfQogCi1pbnQzMiBOUFBfV3JpdGUoTlBQIGluc3RhbmNlLCBOUFN0cmVhbSogc3RyZWFtLCBpbnQzMiBvZmZzZXQsIGludDMyIGxlbiwgdm9pZCogYnVmZmVyKQoraW50MzJfdCBOUFBfV3JpdGUoTlBQIGluc3RhbmNlLCBOUFN0cmVhbSogc3RyZWFtLCBpbnQzMl90IG9mZnNldCwgaW50MzJfdCBsZW4sIHZvaWQqIGJ1ZmZlcikKIHsKICAgICByZXR1cm4gMDsKIH0KQEAgLTIxNyw3ICsyMTcsNyBAQAogewogfQogCi1pbnQxNiBOUFBfSGFuZGxlRXZlbnQoTlBQIGluc3RhbmNlLCB2b2lkKiBldmVudCkKK2ludDE2X3QgTlBQX0hhbmRsZUV2ZW50KE5QUCBpbnN0YW5jZSwgdm9pZCogZXZlbnQpCiB7CiAgICAgUGx1Z2luT2JqZWN0ICpvYmogPSByZWludGVycHJldF9jYXN0PFBsdWdpbk9iamVjdCo+KGluc3RhbmNlLT5wZGF0YSk7CiAgICAgY29uc3QgQU5QRXZlbnQqIGV2dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgQU5QRXZlbnQqPihldmVudCk7CmRpZmYgLS1naXQgYS90ZXN0cy9EdW1wUmVuZGVyVHJlZS9BbmRyb2lkTWFuaWZlc3QueG1sIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCAwM2I3ZTI2Li5jMTUxMjUxIDEwMDY0NAotLS0gYS90ZXN0cy9EdW1wUmVuZGVyVHJlZS9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTE4LDE1ICsxOCwxOCBAQAogICAgIDxhcHBsaWNhdGlvbiBhbmRyb2lkOm5hbWU9IkhUTUxIb3N0QXBwIj4KICAgICAgICAgPHVzZXMtbGlicmFyeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudGVzdC5ydW5uZXIiIC8+CiAgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ik1lbnUiIGFuZHJvaWQ6bGFiZWw9IkR1bXAgUmVuZGVyIFRyZWUiCi0gICAgICAgICAgYW5kcm9pZDpzY3JlZW5PcmllbnRhdGlvbj0icG9ydHJhaXQiPgorICAgICAgICAgIGFuZHJvaWQ6c2NyZWVuT3JpZW50YXRpb249InBvcnRyYWl0IgorICAgICAgICAgIGFuZHJvaWQ6dGhlbWU9IkBhbmRyb2lkOnN0eWxlL1RoZW1lLkxpZ2h0Ij4KICAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgogICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KICAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5URVNUIiAvPgogICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgogICAgICAgICA8L2FjdGl2aXR5PgogICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJUZXN0U2hlbGxBY3Rpdml0eSIgYW5kcm9pZDpsYXVuY2hNb2RlPSJzaW5nbGVUb3AiCi0gICAgICAgICAgYW5kcm9pZDpzY3JlZW5PcmllbnRhdGlvbj0icG9ydHJhaXQiLz4KLSAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iUmVsaWFiaWxpdHlUZXN0QWN0aXZpdHkiIGFuZHJvaWQ6c2NyZWVuT3JpZW50YXRpb249InBvcnRyYWl0Ii8+CisgICAgICAgICAgYW5kcm9pZDpzY3JlZW5PcmllbnRhdGlvbj0icG9ydHJhaXQiCisgICAgICAgICAgYW5kcm9pZDp0aGVtZT0iQGFuZHJvaWQ6c3R5bGUvVGhlbWUuTGlnaHQiLz4KKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iUmVsaWFiaWxpdHlUZXN0QWN0aXZpdHkiIGFuZHJvaWQ6c2NyZWVuT3JpZW50YXRpb249InBvcnRyYWl0IgorICAgICAgICAgIGFuZHJvaWQ6dGhlbWU9IkBhbmRyb2lkOnN0eWxlL1RoZW1lLkxpZ2h0Ii8+CiAgICAgPC9hcHBsaWNhdGlvbj4KIAogICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSIuTGF5b3V0VGVzdHNBdXRvUnVubmVyIgpkaWZmIC0tZ2l0IGEvdGVzdHMvRHVtcFJlbmRlclRyZWUvYXNzZXRzL3J1bl9sYXlvdXRfdGVzdHMucHkgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZS9hc3NldHMvcnVuX2xheW91dF90ZXN0cy5weQppbmRleCBiNmU3YmYzLi5jZWFjNWQyIDEwMDc1NQotLS0gYS90ZXN0cy9EdW1wUmVuZGVyVHJlZS9hc3NldHMvcnVuX2xheW91dF90ZXN0cy5weQorKysgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZS9hc3NldHMvcnVuX2xheW91dF90ZXN0cy5weQpAQCAtMTc2LDcgKzE3Niw3IEBACiAgICMgQ291bnQgY3Jhc2hlZCB0ZXN0cy4KICAgY3Jhc2hlZF90ZXN0cyA9IFtdCiAKLSAgdGltZW91dF9tcyA9ICczMDAwMCcKKyAgdGltZW91dF9tcyA9ICcxNTAwMCcKICAgaWYgb3B0aW9ucy50aW1lX291dF9tczoKICAgICB0aW1lb3V0X21zID0gb3B0aW9ucy50aW1lX291dF9tcwogCmRpZmYgLS1naXQgYS90ZXN0cy9EdW1wUmVuZGVyVHJlZS9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUvQ2FsbGJhY2tQcm94eS5qYXZhIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlL0NhbGxiYWNrUHJveHkuamF2YQppbmRleCA1NzgwYzQzLi43NDBmNTQ0IDEwMDY0NAotLS0gYS90ZXN0cy9EdW1wUmVuZGVyVHJlZS9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUvQ2FsbGJhY2tQcm94eS5qYXZhCisrKyBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZS9DYWxsYmFja1Byb3h5LmphdmEKQEAgLTc0LDYgKzc0LDggQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTEFZT1VUX1NFVF9DQU5fT1BFTl9XSU5ET1dTID0gNDI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNFVF9HRU9MT0NBVElPTl9QRVJNSVNTSU9OID0gNDM7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE9WRVJSSURFX1BSRUZFUkVOQ0UgPSA0NDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTEFZT1VUX0RVTVBfQ0hJTERfRlJBTUVTX1RFWFQgPSA0NTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0VUX1hTU19BVURJVE9SX0VOQUJMRUQgPSA0NjsKICAgICAKICAgICBDYWxsYmFja1Byb3h5KEV2ZW50U2VuZGVyIGV2ZW50U2VuZGVyLCAKICAgICAgICAgICAgIExheW91dFRlc3RDb250cm9sbGVyIGxheW91dFRlc3RDb250cm9sbGVyKSB7CkBAIC0xNzUsNyArMTc3LDExIEBACiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIExBWU9VVF9EVU1QX1RFWFQ6Ci0gICAgICAgICAgICBtTGF5b3V0VGVzdENvbnRyb2xsZXIuZHVtcEFzVGV4dCgpOworICAgICAgICAgICAgbUxheW91dFRlc3RDb250cm9sbGVyLmR1bXBBc1RleHQobXNnLmFyZzEgPT0gMSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIExBWU9VVF9EVU1QX0NISUxEX0ZSQU1FU19URVhUOgorICAgICAgICAgICAgbUxheW91dFRlc3RDb250cm9sbGVyLmR1bXBDaGlsZEZyYW1lc0FzVGV4dCgpOwogICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSBMQVlPVVRfRFVNUF9ISVNUT1JZOgpAQCAtMjczLDYgKzI3OSwxMCBAQAogICAgICAgICAgICAgYm9vbGVhbiB2YWx1ZSA9IG1zZy5nZXREYXRhKCkuZ2V0Qm9vbGVhbigidmFsdWUiKTsKICAgICAgICAgICAgIG1MYXlvdXRUZXN0Q29udHJvbGxlci5vdmVycmlkZVByZWZlcmVuY2Uoa2V5LCB2YWx1ZSk7CiAgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFNFVF9YU1NfQVVESVRPUl9FTkFCTEVEOgorICAgICAgICAgICAgbUxheW91dFRlc3RDb250cm9sbGVyLnNldFhTU0F1ZGl0b3JFbmFibGVkKG1zZy5hcmcxID09IDEpOworICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTM3Nyw3ICszODcsMTUgQEAKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBkdW1wQXNUZXh0KCkgewotICAgICAgICBvYnRhaW5NZXNzYWdlKExBWU9VVF9EVU1QX1RFWFQpLnNlbmRUb1RhcmdldCgpOworICAgICAgICBvYnRhaW5NZXNzYWdlKExBWU9VVF9EVU1QX1RFWFQsIDApLnNlbmRUb1RhcmdldCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGR1bXBBc1RleHQoYm9vbGVhbiBlbmFibGVQaXhlbFRlc3RzKSB7CisgICAgICAgIG9idGFpbk1lc3NhZ2UoTEFZT1VUX0RVTVBfVEVYVCwgZW5hYmxlUGl4ZWxUZXN0cyA/IDEgOiAwKS5zZW5kVG9UYXJnZXQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBkdW1wQ2hpbGRGcmFtZXNBc1RleHQoKSB7CisgICAgICAgIG9idGFpbk1lc3NhZ2UoTEFZT1VUX0RVTVBfQ0hJTERfRlJBTUVTX1RFWFQpLnNlbmRUb1RhcmdldCgpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIGR1bXBCYWNrRm9yd2FyZExpc3QoKSB7CkBAIC00OTIsMTAgKzUxMCwyMiBAQAogICAgICAgICBvYnRhaW5NZXNzYWdlKFNFVF9HRU9MT0NBVElPTl9QRVJNSVNTSU9OLCBhbGxvdyA/IDEgOiAwLCAwKS5zZW5kVG9UYXJnZXQoKTsKICAgICB9CiAKKyAgICBwdWJsaWMgdm9pZCBzZXRNb2NrRGV2aWNlT3JpZW50YXRpb24oYm9vbGVhbiBjYW5Qcm92aWRlQWxwaGEsIGRvdWJsZSBhbHBoYSwKKyAgICAgICAgICAgIGJvb2xlYW4gY2FuUHJvdmlkZUJldGEsIGRvdWJsZSBiZXRhLCBib29sZWFuIGNhblByb3ZpZGVHYW1tYSwgZG91YmxlIGdhbW1hKSB7CisgICAgICAgIC8vIENvbmZpZ3VyYXRpb24gaXMgaW4gV2ViS2l0LCBzbyBzdGF5IG9uIFdlYkNvcmUgdGhyZWFkLCBidXQgZ28gdmlhIHRoZSBUZXN0U2hlbGxBY3Rpdml0eQorICAgICAgICAvLyBhcyB3ZSBuZWVkIGFjY2VzcyB0byB0aGUgV2Vidmlldy4KKyAgICAgICAgbUxheW91dFRlc3RDb250cm9sbGVyLnNldE1vY2tEZXZpY2VPcmllbnRhdGlvbihjYW5Qcm92aWRlQWxwaGEsIGFscGhhLCBjYW5Qcm92aWRlQmV0YSwgYmV0YSwKKyAgICAgICAgICAgICAgICBjYW5Qcm92aWRlR2FtbWEsIGdhbW1hKTsKKyAgICB9CisKICAgICBwdWJsaWMgdm9pZCBvdmVycmlkZVByZWZlcmVuY2UoU3RyaW5nIGtleSwgYm9vbGVhbiB2YWx1ZSkgewogICAgICAgICBNZXNzYWdlIG1lc3NhZ2UgPSBvYnRhaW5NZXNzYWdlKE9WRVJSSURFX1BSRUZFUkVOQ0UpOwogICAgICAgICBtZXNzYWdlLmdldERhdGEoKS5wdXRTdHJpbmcoImtleSIsIGtleSk7CiAgICAgICAgIG1lc3NhZ2UuZ2V0RGF0YSgpLnB1dEJvb2xlYW4oInZhbHVlIiwgdmFsdWUpOwogICAgICAgICBtZXNzYWdlLnNlbmRUb1RhcmdldCgpOwogICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFhTU0F1ZGl0b3JFbmFibGVkKGJvb2xlYW4gZmxhZykgeworICAgICAgICBvYnRhaW5NZXNzYWdlKFNFVF9YU1NfQVVESVRPUl9FTkFCTEVELCBmbGFnID8gMSA6IDAsIDApLnNlbmRUb1RhcmdldCgpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZS9GaWxlRmlsdGVyLmphdmEgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZS9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUvRmlsZUZpbHRlci5qYXZhCmluZGV4IDc3ZmQzZWQuLjRjZmYzZGUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZS9GaWxlRmlsdGVyLmphdmEKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlL0ZpbGVGaWx0ZXIuamF2YQpAQCAtNzMsNDMgKzczLDc0IEBACiAKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nW10gaWdub3JlVGVzdExpc3QgPSB7CiAgICAgICAgICJlZGl0aW5nL3NlbGVjdGlvbi9tb3ZlLWxlZnQtcmlnaHQuaHRtbCIsIC8vIENhdXNlcyBEdW1wUmVuZGVyVHJlZSB0byBoYW5nCisgICAgICAgICJmYXN0L2pzL2V4Y2Vzc2l2ZS1jb21tYS11c2FnZS5odG1sIiwgLy8gVGVzdHMgaHVnZSBpbml0aWFsaXplciBsaXN0LCBjYXVzZXMgT09NLgogICAgICAgICAiZmFzdC9qcy9yZWdleHAtY2hhcmNsYXNzLWNyYXNoLmh0bWwiLCAvLyBSZWdFeHAgaXMgdG9vIGxhcmdlLCBjYXVzaW5nIE9PTQogICAgICAgICAiZmFzdC9yZWdleC90ZXN0MS5odG1sIiwgLy8gQ2F1c2VzIER1bXBSZW5kZXJUcmVlIHRvIGhhbmcgd2l0aCBWOAotICAgICAgICAiZmFzdC9yZWdleC9zbG93Lmh0bWwiIC8vIENhdXNlcyBEdW1wUmVuZGVyVHJlZSB0byBoYW5nIHdpdGggVjgKKyAgICAgICAgImZhc3QvcmVnZXgvc2xvdy5odG1sIiwgLy8gQ2F1c2VzIER1bXBSZW5kZXJUcmVlIHRvIGhhbmcgd2l0aCBWOAorICAgICAgICAiaWV0ZXN0Y2VudGVyL0phdmFzY3JpcHQvMTUuNC40LjE1LTMtMTQuaHRtbCIsIC8vIGhhbmdzIHRoZSBsYXlvdXQgdGVzdHMKKyAgICAgICAgLy8gaHR0cDovL2IvaXNzdWU/aWQ9Mjg4OTU5NQorICAgICAgICAiaWV0ZXN0Y2VudGVyL0phdmFzY3JpcHQvMTUuNC40LjE1LTMtMjkuaHRtbCIsIC8vIGhhbmdzIHRoZSBsYXlvdXQgdGVzdHMKKyAgICAgICAgLy8gaHR0cDovL2IvaXNzdWU/aWQ9Mjg4OTU5NgorICAgICAgICAiaWV0ZXN0Y2VudGVyL0phdmFzY3JpcHQvMTUuNC40LjE1LTMtOC5odG1sIiAvLyBoYW5ncyB0aGUgbGF5b3V0IHRlc3RzCisgICAgICAgIC8vIGh0dHA6Ly9iL2lzc3VlP2lkPTI4ODk1OTgKICAgICB9OwogCiAgICAgc3RhdGljIHZvaWQgZmlsbElnbm9yZVJlc3VsdExpc3QoKSB7Ci0gICAgICAgIC8vIFRoaXMgZmlyc3QgYmxvY2sgb2YgdGVzdHMgYXJlIGZvciBIVE1MNSBmZWF0dXJlcywgZm9yIHdoaWNoIEFuZHJvaWQKKyAgICAgICAgLy8gVGhpcyBmaXJzdCBibG9jayBvZiB0ZXN0cyBhcmUgZm9yIGZlYXR1cmVzIGZvciB3aGljaCBBbmRyb2lkCiAgICAgICAgIC8vIHNob3VsZCBwYXNzIGFsbCB0ZXN0cy4gVGhleSBhcmUgc2tpcHBlZCBvbmx5IHRlbXBvcmFyaWx5LgogICAgICAgICAvLyBUT0RPOiBGaXggdGhlc2UgZmFpbGluZyB0ZXN0cyBhbmQgcmVtb3ZlIHRoZW0gZnJvbSB0aGlzIGxpc3QuCisgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJmYXN0L2V2ZW50cy90b3VjaC9iYXNpYy1tdWx0aS10b3VjaC1ldmVudHMuaHRtbCIpOyAvLyBSZXF1aXJlcyBtdWx0aS10b3VjaAorICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiZmFzdC9ldmVudHMvdG91Y2gvdG91Y2gtdGFyZ2V0Lmh0bWwiKTsgLy8gUmVxdWlyZXMgbXVsdGktdG91Y2gKICAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImh0dHAvdGVzdHMvYXBwY2FjaGUvZW1wdHktbWFuaWZlc3QuaHRtbCIpOyAvLyBmbGFreQorICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiaHR0cC90ZXN0cy9hcHBjYWNoZS9mYWxsYmFjay5odG1sIik7IC8vIGh0dHA6Ly9iL2lzc3VlP2lkPTI3MTMwMDQKICAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImh0dHAvdGVzdHMvYXBwY2FjaGUvZm9yZWlnbi1pZnJhbWUtbWFpbi5odG1sIik7IC8vIGZsYWt5IC0gc2tpcHMgc3RhdGVzCiAgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJodHRwL3Rlc3RzL2FwcGNhY2hlL21hbmlmZXN0LXdpdGgtZW1wdHktZmlsZS5odG1sIik7IC8vIGZsYWt5CisgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJodHRwL3Rlc3RzL2FwcGNhY2hlL29yaWdpbi1xdW90YS5odG1sIik7IC8vIG5lZWRzIGNsZWFyQWxsQXBwbGljYXRpb25DYWNoZXMoKSwgc2VlIGh0dHA6Ly9iL2lzc3VlP2lkPTI5NDQxOTYKICAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoInN0b3JhZ2UvZGF0YWJhc2UtbG9jay1hZnRlci1yZWxvYWQuaHRtbCIpOyAvLyBTdWNjZWVkcyBidXQgRHVtcFJlbmRlclRyZWUgZG9lcyBub3QgcmVhZCByZXN1bHQgY29ycmVjdGx5CiAgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJzdG9yYWdlL2hhc2gtY2hhbmdlLXdpdGgteGhyLmh0bWwiKTsgLy8gU3VjY2VlZHMgYnV0IER1bXBSZW5kZXJUcmVlIGRvZXMgbm90IHJlYWQgcmVzdWx0IGNvcnJlY3RseQorICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgic3RvcmFnZS9vcGVuLWRhdGFiYXNlLWNyZWF0aW9uLWNhbGxiYWNrLWlzb2xhdGVkLXdvcmxkLmh0bWwiKTsgLy8gUmVxdWlyZXMgbGF5b3V0VGVzdENvbnRyb2xsZXIuZXZhbHVhdGVTY3JpcHRJbklzb2xhdGVkV29ybGQoKQorICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgic3RvcmFnZS9zdGF0ZW1lbnQtZXJyb3ItY2FsbGJhY2staXNvbGF0ZWQtd29ybGQuaHRtbCIpOyAvLyBSZXF1aXJlcyBsYXlvdXRUZXN0Q29udHJvbGxlci5ldmFsdWF0ZVNjcmlwdEluSXNvbGF0ZWRXb3JsZCgpCisgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJzdG9yYWdlL3N0YXRlbWVudC1zdWNjZXNzLWNhbGxiYWNrLWlzb2xhdGVkLXdvcmxkLmh0bWwiKTsgLy8gUmVxdWlyZXMgbGF5b3V0VGVzdENvbnRyb2xsZXIuZXZhbHVhdGVTY3JpcHRJbklzb2xhdGVkV29ybGQoKQorICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgic3RvcmFnZS90cmFuc2FjdGlvbi1jYWxsYmFjay1pc29sYXRlZC13b3JsZC5odG1sIik7IC8vIFJlcXVpcmVzIGxheW91dFRlc3RDb250cm9sbGVyLmV2YWx1YXRlU2NyaXB0SW5Jc29sYXRlZFdvcmxkKCkKKyAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoInN0b3JhZ2UvdHJhbnNhY3Rpb24tZXJyb3ItY2FsbGJhY2staXNvbGF0ZWQtd29ybGQuaHRtbCIpOyAvLyBSZXF1aXJlcyBsYXlvdXRUZXN0Q29udHJvbGxlci5ldmFsdWF0ZVNjcmlwdEluSXNvbGF0ZWRXb3JsZCgpCisgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJzdG9yYWdlL3RyYW5zYWN0aW9uLXN1Y2Nlc3MtY2FsbGJhY2staXNvbGF0ZWQtd29ybGQuaHRtbCIpOyAvLyBSZXF1aXJlcyBsYXlvdXRUZXN0Q29udHJvbGxlci5ldmFsdWF0ZVNjcmlwdEluSXNvbGF0ZWRXb3JsZCgpCiAKLSAgICAgICAgLy8gV2lsbCBhbHdheXMgZmFpbAotICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiZG9tL3N2Zy9sZXZlbDMveHBhdGgiKTsgLy8gWFBhdGggbm90IHN1cHBvcnRlZAorICAgICAgICAvLyBFeHBlY3RlZCBmYWlsdXJlcyBkdWUgdG8gdW5zdXBwb3J0ZWQgZmVhdHVyZXMuCisgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJmYXN0L2V2ZW50cy90b3VjaC90b3VjaC1jb29yZHMtaW4tem9vbS1hbmQtc2Nyb2xsLmh0bWwiKTsgLy8gUmVxdWlyZXMgZXZlbnRTZW5kZXIuem9vbVBhZ2VJbigpLHpvb21QYWdlT3V0KCkKICAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImZhc3Qvd29ya2VycyIpOyAvLyB3b3JrZXJzIG5vdCBzdXBwb3J0ZWQKLSAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImZhc3QveHBhdGgiKTsgLy8gWFBhdGggbm90IHN1cHBvcnRlZAogICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiaHR0cC90ZXN0cy9ldmVudHNvdXJjZS93b3JrZXJzIik7IC8vIHdvcmtlcnMgbm90IHN1cHBvcnRlZAogICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiaHR0cC90ZXN0cy93b3JrZXJzIik7IC8vIHdvcmtlcnMgbm90IHN1cHBvcnRlZAogICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiaHR0cC90ZXN0cy94bWxodHRwcmVxdWVzdC93b3JrZXJzIik7IC8vIHdvcmtlcnMgbm90IHN1cHBvcnRlZAogICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgic3RvcmFnZS9kb21zdG9yYWdlL2xvY2Fsc3RvcmFnZS9wcml2YXRlLWJyb3dzaW5nLWFmZmVjdHMtc3RvcmFnZS5odG1sIik7IC8vIHByaXZhdGUgYnJvd3Npbmcgbm90IHN1cHBvcnRlZAogICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgic3RvcmFnZS9kb21zdG9yYWdlL3Nlc3Npb25zdG9yYWdlL3ByaXZhdGUtYnJvd3NpbmctYWZmZWN0cy1zdG9yYWdlLmh0bWwiKTsgLy8gcHJpdmF0ZSBicm93c2luZyBub3Qgc3VwcG9ydGVkCisgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJzdG9yYWdlL2luZGV4ZWRkYiIpOyAvLyBpbmRleGVkZGIgbm90IHN1cHBvcnRlZAogICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgic3RvcmFnZS9wcml2YXRlLWJyb3dzaW5nLXJlYWRvbmx5Lmh0bWwiKTsgLy8gcHJpdmF0ZSBicm93c2luZyBub3Qgc3VwcG9ydGVkCiAgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJ3ZWJzb2NrZXQvdGVzdHMvd29ya2VycyIpOyAvLyB3b3JrZXJzIG5vdCBzdXBwb3J0ZWQKIAorICAgICAgICAvLyBFeHBlY3RlZCBmYWlsdXJlcyBkdWUgdG8gbWlzc2luZyBleHBlY3RlZCByZXN1bHRzCisgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJkb20veGh0bWwvbGV2ZWwzL2NvcmUvY2Fub25pY2FsZm9ybTA4LnhodG1sIik7CisgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJkb20veGh0bWwvbGV2ZWwzL2NvcmUvY2Fub25pY2FsZm9ybTA5LnhodG1sIik7CisgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJkb20veGh0bWwvbGV2ZWwzL2NvcmUvZG9jdW1lbnRnZXRpbnB1dGVuY29kaW5nMDMueGh0bWwiKTsKKyAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImRvbS94aHRtbC9sZXZlbDMvY29yZS9lbnRpdHlnZXRpbnB1dGVuY29kaW5nMDIueGh0bWwiKTsKKyAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImRvbS94aHRtbC9sZXZlbDMvY29yZS9lbnRpdHlnZXR4bWx2ZXJzaW9uMDIueGh0bWwiKTsKKyAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImRvbS94aHRtbC9sZXZlbDMvY29yZS9ub2RlZ2V0YmFzZXVyaTA1LnhodG1sIik7CisgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJkb20veGh0bWwvbGV2ZWwzL2NvcmUvbm9kZWdldGJhc2V1cmkwNy54aHRtbCIpOworICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiZG9tL3hodG1sL2xldmVsMy9jb3JlL25vZGVnZXRiYXNldXJpMDkueGh0bWwiKTsKKyAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImRvbS94aHRtbC9sZXZlbDMvY29yZS9ub2RlZ2V0YmFzZXVyaTEwLnhodG1sIik7CisgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJkb20veGh0bWwvbGV2ZWwzL2NvcmUvbm9kZWdldGJhc2V1cmkxMS54aHRtbCIpOworICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiZG9tL3hodG1sL2xldmVsMy9jb3JlL25vZGVnZXRiYXNldXJpMTUueGh0bWwiKTsKKyAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImRvbS94aHRtbC9sZXZlbDMvY29yZS9ub2RlZ2V0YmFzZXVyaTE3LnhodG1sIik7CisgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJkb20veGh0bWwvbGV2ZWwzL2NvcmUvbm9kZWdldGJhc2V1cmkxOC54aHRtbCIpOworICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiZG9tL3hodG1sL2xldmVsMy9jb3JlL25vZGVsb29rdXBuYW1lc3BhY2V1cmkwMS54aHRtbCIpOworICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiZG9tL3hodG1sL2xldmVsMy9jb3JlL25vZGVsb29rdXBwcmVmaXgxOS54aHRtbCIpOworCiAgICAgICAgIC8vIFRPRE86IFRoZXNlIG5lZWQgdG8gYmUgdHJpYWdlZAogICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiZmFzdC9jc3MvY2FzZS10cmFuc2Zvcm0uaHRtbCIpOyAvLyB3aWxsIG5vdCBmaXggIzYxOTcwNwogICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiZmFzdC9kb20vRWxlbWVudC9vZmZzZXRMZWZ0LW9mZnNldFRvcC1ib2R5LXF1aXJrLmh0bWwiKTsgLy8gZGlmZmVyZW50IHNjcmVlbiBzaXplIHJlc3VsdCBpbiBleHRyYSBzcGFjZXMgaW4gQXBwbGUgY29tcGFyZWQgdG8gdXMKICAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImZhc3QvZG9tL1dpbmRvdy9QbHVnLWlucy5odG1sIik7IC8vIG5lZWQgdGVzdCBwbHVnaW4KLSAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImZhc3QvZG9tL1dpbmRvdy93aW5kb3ctcHJvcGVydGllcy5odG1sIik7IC8vIHhzbHQgYW5kIHhwYXRoIGVsZW1lbnRzIG1pc3NpbmcgZnJvbSBwcm9wZXJ0eSBsaXN0CiAgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJmYXN0L2RvbS9XaW5kb3cvd2luZG93LXNjcmVlbi1wcm9wZXJ0aWVzLmh0bWwiKTsgLy8gcGl4ZWwgZGVwdGgKICAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImZhc3QvZG9tL1dpbmRvdy93aW5kb3cteHktcHJvcGVydGllcy5odG1sIik7IC8vIHJlcXVpcmVzIGV2ZW50U2VuZGVyLm1vdXNlRG93bigpLG1vdXNlVXAoKQogICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiZmFzdC9kb20vYXR0cmlidXRlLW5hbWVzcGFjZXMtZ2V0LXNldC5odG1sIik7IC8vIGh0dHA6Ly9iLzczMzIyOQotICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiZmFzdC9kb20vZ2MtOS5odG1sIik7IC8vIHJlcXVpcmVzIHhwYXRoIHN1cHBvcnQKLSAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImZhc3QvZG9tL2dsb2JhbC1jb25zdHJ1Y3RvcnMuaHRtbCIpOyAvLyByZXF1aXJlcyB4c2x0IGFuZCB4cGF0aCBzdXBwb3J0CiAgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJmYXN0L2RvbS9vYmplY3QtZW1iZWQtcGx1Z2luLXNjcmlwdGluZy5odG1sIik7IC8vIGR5bmFtaWMgcGx1Z2lucyBub3Qgc3VwcG9ydGVkCiAgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJmYXN0L2RvbS90YWJpbmRleC1jbGFtcC5odG1sIik7IC8vIHRoZXJlIGlzIGV4dHJhIHNwYWNpbmcgaW4gdGhlIGZpbGUgZHVlIHRvIG11bHRpcGxlIGlucHV0IGJveGVzIGZpdHRpbmcgb24gb25lIGxpbmUgb24gQXBwbGUsIG91cnMgYXJlIHdyYXBwZWQuIFNwYWNlIGF0IGxpbmUgZW5kcyBhcmUgc3RyaXBwZWQuCiAgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJmYXN0L2V2ZW50cy9hbmNob3ItaW1hZ2Utc2Nyb2xsZWQteC15Lmh0bWwiKTsgLy8gcmVxdWlyZXMgZXZlbnRTZW5kZXIubW91c2VEb3duKCksbW91c2VVcCgpCkBAIC0xNzIsOCArMjAzLDYgQEAKICAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImZhc3QvcmVwbGFjZWQvaW1hZ2UtbWFwLmh0bWwiKTsgLy8gcmVxdWlyZXMgZXZlbnRTZW5kZXIubW91c2VEb3duKCksbW91c2VVcCgpCiAgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJmYXN0L3RleHQvcGxhaW4tdGV4dC1saW5lLWJyZWFrcy5odG1sIik7IC8vIGV4dHJhIHNwYWNpbmcgYmVjYXVzZSBpRnJhbWVzIHJlbmRlcmVkIG5leHQgdG8gZWFjaCBvdGhlciBvbiBBcHBsZQogICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgicHJvZmlsZXIiKTsgLy8gcHJvZmlsZXIgaXMgbm90IHN1cHBvcnRlZAotICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgic3ZnIik7IC8vIHN2ZyBpcyBub3Qgc3VwcG9ydGVkCi0KICAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZS9Gc1V0aWxzLmphdmEgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZS9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUvRnNVdGlscy5qYXZhCmluZGV4IDZjZmNlNDEuLjVkMzRlMjUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZS9Gc1V0aWxzLmphdmEKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlL0ZzVXRpbHMuamF2YQpAQCAtNDksOCArNDksMTMgQEAKICAgICAgICAgLy9ubyBjcmVhdGlvbiBvZiBpbnN0YW5jZXMKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZmluZExheW91dFRlc3RzUmVjdXJzaXZlbHkoQnVmZmVyZWRPdXRwdXRTdHJlYW0gYm9zLAorICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiB0ZXN0cyBpbiB0aGUgbGlzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGludCB3cml0ZUxheW91dFRlc3RMaXN0UmVjdXJzaXZlbHkoQnVmZmVyZWRPdXRwdXRTdHJlYW0gYm9zLAogICAgICAgICAgICAgU3RyaW5nIGRpciwgYm9vbGVhbiBpZ25vcmVSZXN1bHRzSW5EaXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgaW50IHRlc3RDb3VudCA9IDA7CiAgICAgICAgIExvZy52KExPR1RBRywgIlNlYXJjaGluZyB0ZXN0cyB1bmRlciAiICsgZGlyKTsKIAogICAgICAgICBGaWxlIGQgPSBuZXcgRmlsZShkaXIpOwpAQCAtNjgsNyArNzMsNyBAQAogICAgICAgICAgICAgICAgIC8vIElmIHRoaXMgaXMgbm90IGEgdGVzdCBkaXJlY3RvcnksIHdlIGRvbid0IHJlY3Vyc2UgaW50byBpdC4KICAgICAgICAgICAgICAgICBpZiAoIUZpbGVGaWx0ZXIuaXNOb25UZXN0RGlyKHMpKSB7CiAgICAgICAgICAgICAgICAgICAgIExvZy52KExPR1RBRywgIlJlY3Vyc2luZyBvbiAiICsgcyk7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmRMYXlvdXRUZXN0c1JlY3Vyc2l2ZWx5KGJvcywgcywgaWdub3JlUmVzdWx0c0luRGlyKTsKKyAgICAgICAgICAgICAgICAgICAgdGVzdENvdW50ICs9IHdyaXRlTGF5b3V0VGVzdExpc3RSZWN1cnNpdmVseShib3MsIHMsIGlnbm9yZVJlc3VsdHNJbkRpcik7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQpAQCAtNzksNyArODQsOSBAQAogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAoKHMudG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgiLmh0bWwiKSB8fCBzLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoIi54bWwiKSkKKyAgICAgICAgICAgIGlmICgocy50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKCIuaHRtbCIpCisgICAgICAgICAgICAgICAgICAgIHx8IHMudG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgiLnhtbCIpCisgICAgICAgICAgICAgICAgICAgIHx8IHMudG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgiLnhodG1sIikpCiAgICAgICAgICAgICAgICAgICAgICYmICFzLmVuZHNXaXRoKCJURU1QTEFURS5odG1sIikpIHsKICAgICAgICAgICAgICAgICBMb2cudihMT0dUQUcsICJSZWNvcmRpbmcgIiArIHMpOwogICAgICAgICAgICAgICAgIGJvcy53cml0ZShzLmdldEJ5dGVzKCkpOwpAQCAtODgsOCArOTUsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgYm9zLndyaXRlKCgiIElHTk9SRV9SRVNVTFQiKS5nZXRCeXRlcygpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYm9zLndyaXRlKCdcbicpOworICAgICAgICAgICAgICAgIHRlc3RDb3VudCsrOwogICAgICAgICAgICAgfQogICAgICAgICB9CisgICAgICAgIHJldHVybiB0ZXN0Q291bnQ7CiAgICAgfQogCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIHVwZGF0ZVRlc3RTdGF0dXMoU3RyaW5nIHN0YXR1c0ZpbGUsIFN0cmluZyBzKSB7CmRpZmYgLS1naXQgYS90ZXN0cy9EdW1wUmVuZGVyVHJlZS9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUvTGF5b3V0VGVzdENvbnRyb2xsZXIuamF2YSBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZS9MYXlvdXRUZXN0Q29udHJvbGxlci5qYXZhCmluZGV4IDkyMzYzNDUuLjliZTJmMWMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZS9MYXlvdXRUZXN0Q29udHJvbGxlci5qYXZhCisrKyBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZS9MYXlvdXRUZXN0Q29udHJvbGxlci5qYXZhCkBAIC0xOCwyOSArMTgsMzAgQEAKIAogcHVibGljIGludGVyZmFjZSBMYXlvdXRUZXN0Q29udHJvbGxlciB7CiAKLQlwdWJsaWMgdm9pZCBkdW1wQXNUZXh0KCk7Ci0JcHVibGljIHZvaWQgd2FpdFVudGlsRG9uZSgpOwotCXB1YmxpYyB2b2lkIG5vdGlmeURvbmUoKTsKLQkKLQkvLyBGb3JjZSBhIHJlZHJhdyBvZiB0aGUgcGFnZQotCXB1YmxpYyB2b2lkIGRpc3BsYXkoKTsKLQkvLyBVc2VkIHdpdGggcGl4ZWwgZHVtcHMgb2YgY29udGVudAotCXB1YmxpYyB2b2lkIHRlc3RSZXBhaW50KCk7Ci0JCi0JLy8gSWYgdGhlIHBhZ2UgdGl0bGUgY2hhbmdlcywgYWRkIHRoZSBpbmZvcm1hdGlvbiB0byB0aGUgb3V0cHV0LgotCXB1YmxpYyB2b2lkIGR1bXBUaXRsZUNoYW5nZXMoKTsKLQlwdWJsaWMgdm9pZCBkdW1wQmFja0ZvcndhcmRMaXN0KCk7Ci0JcHVibGljIHZvaWQgZHVtcENoaWxkRnJhbWVTY3JvbGxQb3NpdGlvbnMoKTsKLQlwdWJsaWMgdm9pZCBkdW1wRWRpdGluZ0NhbGxiYWNrcygpOwotCQotCS8vIFNob3cvSGlkZSB3aW5kb3cgZm9yIHdpbmRvdy5vbkJsdXIoKSB0ZXN0aW5nCi0JcHVibGljIHZvaWQgc2V0V2luZG93SXNLZXkoYm9vbGVhbiBiKTsKLQkvLyBNYWMgZnVuY3Rpb24sIHVzZWQgdG8gZGlzYWJsZSBldmVudHMgZ29pbmcgdG8gdGhlIHdpbmRvdwotCXB1YmxpYyB2b2lkIHNldE1haW5GcmFtZUlzRmlyc3RSZXNwb25kZXIoYm9vbGVhbiBiKTsKLQkKLQlwdWJsaWMgdm9pZCBkdW1wU2VsZWN0aW9uUmVjdCgpOwotCQotCS8vIGludmFsaWRhdGUgYW5kIGRyYXcgb25lIGxpbmUgYXQgYSB0aW1lIG9mIHRoZSB3ZWIgdmlldy4KKyAgICBwdWJsaWMgdm9pZCBkdW1wQXNUZXh0KGJvb2xlYW4gZW5hYmxlUGl4ZWxUZXN0cyk7CisgICAgcHVibGljIHZvaWQgZHVtcENoaWxkRnJhbWVzQXNUZXh0KCk7CisgICAgcHVibGljIHZvaWQgd2FpdFVudGlsRG9uZSgpOworICAgIHB1YmxpYyB2b2lkIG5vdGlmeURvbmUoKTsKKworICAgIC8vIEZvcmNlIGEgcmVkcmF3IG9mIHRoZSBwYWdlCisgICAgcHVibGljIHZvaWQgZGlzcGxheSgpOworICAgIC8vIFVzZWQgd2l0aCBwaXhlbCBkdW1wcyBvZiBjb250ZW50CisgICAgcHVibGljIHZvaWQgdGVzdFJlcGFpbnQoKTsKKworICAgIC8vIElmIHRoZSBwYWdlIHRpdGxlIGNoYW5nZXMsIGFkZCB0aGUgaW5mb3JtYXRpb24gdG8gdGhlIG91dHB1dC4KKyAgICBwdWJsaWMgdm9pZCBkdW1wVGl0bGVDaGFuZ2VzKCk7CisgICAgcHVibGljIHZvaWQgZHVtcEJhY2tGb3J3YXJkTGlzdCgpOworICAgIHB1YmxpYyB2b2lkIGR1bXBDaGlsZEZyYW1lU2Nyb2xsUG9zaXRpb25zKCk7CisgICAgcHVibGljIHZvaWQgZHVtcEVkaXRpbmdDYWxsYmFja3MoKTsKKworICAgIC8vIFNob3cvSGlkZSB3aW5kb3cgZm9yIHdpbmRvdy5vbkJsdXIoKSB0ZXN0aW5nCisgICAgcHVibGljIHZvaWQgc2V0V2luZG93SXNLZXkoYm9vbGVhbiBiKTsKKyAgICAvLyBNYWMgZnVuY3Rpb24sIHVzZWQgdG8gZGlzYWJsZSBldmVudHMgZ29pbmcgdG8gdGhlIHdpbmRvdworICAgIHB1YmxpYyB2b2lkIHNldE1haW5GcmFtZUlzRmlyc3RSZXNwb25kZXIoYm9vbGVhbiBiKTsKKworICAgIHB1YmxpYyB2b2lkIGR1bXBTZWxlY3Rpb25SZWN0KCk7CisKKyAgICAvLyBpbnZhbGlkYXRlIGFuZCBkcmF3IG9uZSBsaW5lIGF0IGEgdGltZSBvZiB0aGUgd2ViIHZpZXcuCiAgICAgcHVibGljIHZvaWQgcmVwYWludFN3ZWVwSG9yaXpvbnRhbGx5KCk7CiAgICAgCiAgICAgLy8gSGlzdG9yeSB0ZXN0aW5nIGZ1bmN0aW9ucwpAQCAtNjcsNCArNjgsMTEgQEAKICAgICBwdWJsaWMgdm9pZCBzZXRHZW9sb2NhdGlvblBlcm1pc3Npb24oYm9vbGVhbiBhbGxvdyk7CiAKICAgICBwdWJsaWMgdm9pZCBvdmVycmlkZVByZWZlcmVuY2UoU3RyaW5nIGtleSwgYm9vbGVhbiB2YWx1ZSk7CisKKyAgICAvLyBGb3IgWFNTQXVkaXRvciB0ZXN0cworICAgIHB1YmxpYyB2b2lkIHNldFhTU0F1ZGl0b3JFbmFibGVkKGJvb2xlYW4gZmxhZyk7CisKKyAgICAvLyBGb3IgRGV2aWNlT3JpZW50YXRpb24gdGVzdHMKKyAgICBwdWJsaWMgdm9pZCBzZXRNb2NrRGV2aWNlT3JpZW50YXRpb24oYm9vbGVhbiBjYW5Qcm92aWRlQWxwaGEsIGRvdWJsZSBhbHBoYSwKKyAgICAgICAgICAgIGJvb2xlYW4gY2FuUHJvdmlkZUJldGEsIGRvdWJsZSBiZXRhLCBib29sZWFuIGNhblByb3ZpZGVHYW1tYSwgZG91YmxlIGdhbW1hKTsKIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZS9MYXlvdXRUZXN0c0F1dG9UZXN0LmphdmEgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZS9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUvTGF5b3V0VGVzdHNBdXRvVGVzdC5qYXZhCmluZGV4IDljY2Y1NDkuLjEzMmYxN2EgMTAwNjQ0Ci0tLSBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZS9MYXlvdXRUZXN0c0F1dG9UZXN0LmphdmEKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlL0xheW91dFRlc3RzQXV0b1Rlc3QuamF2YQpAQCAtMjAsOSArMjAsNyBAQAogaW1wb3J0IGNvbS5hbmRyb2lkLmR1bXByZW5kZXJ0cmVlLmZvcndhcmRlci5BZGJVdGlsczsKIGltcG9ydCBjb20uYW5kcm9pZC5kdW1wcmVuZGVydHJlZS5mb3J3YXJkZXIuRm9yd2FyZFNlcnZpY2U7CiAKLWltcG9ydCBhbmRyb2lkLmFwcC5JbnN0cnVtZW50YXRpb247CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKIGltcG9ydCBhbmRyb2lkLm9zLkVudmlyb25tZW50OwogaW1wb3J0IGFuZHJvaWQudGVzdC5BY3Rpdml0eUluc3RydW1lbnRhdGlvblRlc3RDYXNlMjsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwpAQCAtMTU4LDE4ICsxNTYsMTEgQEAKICAgICBwcml2YXRlIFN0cmluZyBtSnNFbmdpbmU7CiAgICAgcHJpdmF0ZSBTdHJpbmcgbVRlc3RQYXRoUHJlZml4OwogICAgIHByaXZhdGUgYm9vbGVhbiBtRmluaXNoZWQ7CisgICAgcHJpdmF0ZSBpbnQgbVRlc3RDb3VudDsKKyAgICBwcml2YXRlIGludCBtUmVzdW1lSW5kZXg7CiAKICAgICBwdWJsaWMgTGF5b3V0VGVzdHNBdXRvVGVzdCgpIHsKLSAgICAgIHN1cGVyKCJjb20uYW5kcm9pZC5kdW1wcmVuZGVydHJlZSIsIFRlc3RTaGVsbEFjdGl2aXR5LmNsYXNzKTsKLSAgICB9Ci0KLSAgICAvLyBUaGlzIGZ1bmN0aW9uIHdyaXRlcyB0aGUgcmVzdWx0IG9mIHRoZSBsYXlvdXQgdGVzdCB0bwotICAgIC8vIEFtIHN0YXR1cyBzbyB0aGF0IGl0IGNhbiBiZSBwaWNrZWQgdXAgZnJvbSBhIHNjcmlwdC4KLSAgICBwcml2YXRlIHZvaWQgcGFzc09yRmFpbENhbGxiYWNrKFN0cmluZyBmaWxlLCBib29sZWFuIHJlc3VsdCkgewotICAgICAgSW5zdHJ1bWVudGF0aW9uIGluc3QgPSBnZXRJbnN0cnVtZW50YXRpb24oKTsKLSAgICAgIEJ1bmRsZSBidW5kbGUgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICBidW5kbGUucHV0Qm9vbGVhbihmaWxlLCByZXN1bHQpOwotICAgICAgaW5zdC5zZW5kU3RhdHVzKDAsIGJ1bmRsZSk7CisgICAgICBzdXBlcihUZXN0U2hlbGxBY3Rpdml0eS5jbGFzcyk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIGdldFRlc3RMaXN0KCkgewpAQCAtMTkwLDYgKzE4MSw3IEBACiAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICBMb2cuZShMT0dUQUcsICJFcnJvciB3aGlsZSByZWFkaW5nIHRlc3QgbGlzdCA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CiAgICAgICAgIH0KKyAgICAgICAgbVRlc3RDb3VudCA9IG1UZXN0TGlzdC5zaXplKCk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIHJlc3VtZVRlc3RMaXN0KCkgewpAQCAtMjAwLDYgKzE5Miw3IEBACiAgICAgICAgICAgICAgICAgaWYgKG1UZXN0TGlzdC5lbGVtZW50QXQoaSkuZXF1YWxzKGxpbmUpKSB7CiAgICAgICAgICAgICAgICAgICAgIG1UZXN0TGlzdCA9IG5ldyBWZWN0b3I8U3RyaW5nPihtVGVzdExpc3Quc3ViTGlzdChpKzEsIG1UZXN0TGlzdC5zaXplKCkpKTsKICAgICAgICAgICAgICAgICAgICAgbVRlc3RMaXN0SWdub3JlUmVzdWx0ID0gbmV3IFZlY3RvcjxCb29sZWFuPihtVGVzdExpc3RJZ25vcmVSZXN1bHQuc3ViTGlzdChpKzEsIG1UZXN0TGlzdElnbm9yZVJlc3VsdC5zaXplKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgbVJlc3VtZUluZGV4ID0gaSArIDE7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KQEAgLTIzMiwxNCArMjI1LDIyIEBACiAgICAgICAgIC8vIFRoZSBnZW5lcmljIHJlc3VsdCBpcyBhdCA8cGF0aD4vPG5hbWU+LWV4cGVjdGVkLnR4dAogICAgICAgICAvLyBGaXJzdCB0cnkgdGhlIEFuZHJvaWQtc3BlY2lmaWMgcmVzdWx0IGF0CiAgICAgICAgIC8vIHBsYXRmb3JtL2FuZHJvaWQtPGpzLWVuZ2luZT4vPHBhdGg+LzxuYW1lPi1leHBlY3RlZC50eHQKKyAgICAgICAgLy8gdGhlbgorICAgICAgICAvLyBwbGF0Zm9ybS9hbmRyb2lkLzxwYXRoPi88bmFtZT4tZXhwZWN0ZWQudHh0CiAgICAgICAgIGludCBwb3MgPSB0ZXN0Lmxhc3RJbmRleE9mKCcuJyk7CiAgICAgICAgIGlmIChwb3MgPT0gLTEpCiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgU3RyaW5nIGdlbmVyaWNFeHBlY3RlZFJlc3VsdCA9IHRlc3Quc3Vic3RyaW5nKDAsIHBvcykgKyAiLWV4cGVjdGVkLnR4dCI7CiAgICAgICAgIFN0cmluZyBhbmRyb2lkRXhwZWN0ZWRSZXN1bHRzRGlyID0gInBsYXRmb3JtL2FuZHJvaWQtIiArIG1Kc0VuZ2luZSArICIvIjsKLSAgICAgICAgU3RyaW5nIGFuZHJvaWRFeHBlY3RlZFJlc3VsdCA9Ci0gICAgICAgICAgICBnZW5lcmljRXhwZWN0ZWRSZXN1bHQucmVwbGFjZUZpcnN0KExBWU9VVF9URVNUU19ST09ULCBMQVlPVVRfVEVTVFNfUk9PVCArIGFuZHJvaWRFeHBlY3RlZFJlc3VsdHNEaXIpOworICAgICAgICBTdHJpbmcgYW5kcm9pZEV4cGVjdGVkUmVzdWx0ID0gZ2VuZXJpY0V4cGVjdGVkUmVzdWx0LnJlcGxhY2VGaXJzdChMQVlPVVRfVEVTVFNfUk9PVCwKKyAgICAgICAgICAgICAgICBMQVlPVVRfVEVTVFNfUk9PVCArIGFuZHJvaWRFeHBlY3RlZFJlc3VsdHNEaXIpOwogICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZShhbmRyb2lkRXhwZWN0ZWRSZXN1bHQpOworICAgICAgICBpZiAoZi5leGlzdHMoKSkKKyAgICAgICAgICAgIHJldHVybiBhbmRyb2lkRXhwZWN0ZWRSZXN1bHQ7CisgICAgICAgIGFuZHJvaWRFeHBlY3RlZFJlc3VsdHNEaXIgPSAicGxhdGZvcm0vYW5kcm9pZC8iOworICAgICAgICBhbmRyb2lkRXhwZWN0ZWRSZXN1bHQgPSBnZW5lcmljRXhwZWN0ZWRSZXN1bHQucmVwbGFjZUZpcnN0KExBWU9VVF9URVNUU19ST09ULAorICAgICAgICAgICAgICAgIExBWU9VVF9URVNUU19ST09UICsgYW5kcm9pZEV4cGVjdGVkUmVzdWx0c0Rpcik7CisgICAgICAgIGYgPSBuZXcgRmlsZShhbmRyb2lkRXhwZWN0ZWRSZXN1bHQpOwogICAgICAgICByZXR1cm4gZi5leGlzdHMoKSA/IGFuZHJvaWRFeHBlY3RlZFJlc3VsdCA6IGdlbmVyaWNFeHBlY3RlZFJlc3VsdDsKICAgICB9CiAKQEAgLTMwMCw3ICszMDEsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIHJ1blRlc3RBbmRXYWl0VW50aWxEb25lKFRlc3RTaGVsbEFjdGl2aXR5IGFjdGl2aXR5LCBTdHJpbmcgdGVzdCwgaW50IHRpbWVvdXQsIGJvb2xlYW4gaWdub3JlUmVzdWx0KSB7CisgICAgcHJpdmF0ZSB2b2lkIHJ1blRlc3RBbmRXYWl0VW50aWxEb25lKFRlc3RTaGVsbEFjdGl2aXR5IGFjdGl2aXR5LCBTdHJpbmcgdGVzdCwgaW50IHRpbWVvdXQsIGJvb2xlYW4gaWdub3JlUmVzdWx0LCBpbnQgdGVzdE51bWJlcikgewogICAgICAgICBhY3Rpdml0eS5zZXRDYWxsYmFjayhuZXcgVGVzdFNoZWxsQ2FsbGJhY2soKSB7CiAgICAgICAgICAgICBwdWJsaWMgdm9pZCBmaW5pc2hlZCgpIHsKICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKExheW91dFRlc3RzQXV0b1Rlc3QudGhpcykgewpAQCAtMzM2LDYgKzMzNyw5IEBACiAgICAgICAgIGludGVudC5wdXRFeHRyYShUZXN0U2hlbGxBY3Rpdml0eS5URVNUX1VSTCwgRnNVdGlscy5nZXRUZXN0VXJsKHRlc3QpKTsKICAgICAgICAgaW50ZW50LnB1dEV4dHJhKFRlc3RTaGVsbEFjdGl2aXR5LlJFU1VMVF9GSUxFLCByZXN1bHRGaWxlKTsKICAgICAgICAgaW50ZW50LnB1dEV4dHJhKFRlc3RTaGVsbEFjdGl2aXR5LlRJTUVPVVRfSU5fTUlMTElTLCB0aW1lb3V0KTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKFRlc3RTaGVsbEFjdGl2aXR5LlRPVEFMX1RFU1RfQ09VTlQsIG1UZXN0Q291bnQpOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoVGVzdFNoZWxsQWN0aXZpdHkuQ1VSUkVOVF9URVNUX05VTUJFUiwgdGVzdE51bWJlcik7CisgICAgICAgIGludGVudC5wdXRFeHRyYShUZXN0U2hlbGxBY3Rpdml0eS5TVE9QX09OX1JFRl9FUlJPUiwgdHJ1ZSk7CiAgICAgICAgIGFjdGl2aXR5LnN0YXJ0QWN0aXZpdHkoaW50ZW50KTsKIAogICAgICAgICAvLyBXYWl0IHVudGlsIGRvbmUuCkBAIC0zNzUsOCArMzc5LDggQEAKICAgICAgICAgLy8gUmVhZCBzZXR0aW5ncwogICAgICAgICBtVGVzdFBhdGhQcmVmaXggPSAobmV3IEZpbGUoTEFZT1VUX1RFU1RTX1JPT1QgKyBydW5uZXIubVRlc3RQYXRoKSkuZ2V0QWJzb2x1dGVQYXRoKCk7CiAgICAgICAgIG1SZWJhc2VsaW5lUmVzdWx0cyA9IHJ1bm5lci5tUmViYXNlbGluZTsKLSAgICAgICAgLy8gSlNDIGlzIHRoZSBkZWZhdWx0IEphdmFTY3JpcHQgZW5naW5lLgotICAgICAgICBtSnNFbmdpbmUgPSBydW5uZXIubUpzRW5naW5lID09IG51bGwgPyAianNjIiA6IHJ1bm5lci5tSnNFbmdpbmU7CisgICAgICAgIC8vIFY4IGlzIHRoZSBkZWZhdWx0IEphdmFTY3JpcHQgZW5naW5lLgorICAgICAgICBtSnNFbmdpbmUgPSBydW5uZXIubUpzRW5naW5lID09IG51bGwgPyAidjgiIDogcnVubmVyLm1Kc0VuZ2luZTsKIAogICAgICAgICBpbnQgdGltZW91dCA9IHJ1bm5lci5tVGltZW91dEluTWlsbGlzOwogICAgICAgICBpZiAodGltZW91dCA8PSAwKSB7CkBAIC0zOTMsNyArMzk3LDcgQEAKICAgICAgICAgICAgIHJlc3VtZVRlc3RMaXN0KCk7CiAKICAgICAgICAgVGVzdFNoZWxsQWN0aXZpdHkgYWN0aXZpdHkgPSBnZXRBY3Rpdml0eSgpOwotICAgICAgICBhY3Rpdml0eS5zZXREZWZhdWx0RHVtcERhdGFUeXBlKER1bXBEYXRhVHlwZS5EVU1QX0FTX1RFWFQpOworICAgICAgICBhY3Rpdml0eS5zZXREZWZhdWx0RHVtcERhdGFUeXBlKER1bXBEYXRhVHlwZS5FWFRfUkVQUik7CiAKICAgICAgICAgLy8gUnVuIHRlc3RzLgogICAgICAgICBpbnQgYWRkciA9IC0xOwpAQCAtNDEwLDcgKzQxNCw5IEBACiAgICAgICAgICAgICBib29sZWFuIGlnbm9yZVJlc3VsdCA9IG1UZXN0TGlzdElnbm9yZVJlc3VsdC5lbGVtZW50QXQoaSk7CiAgICAgICAgICAgICBGc1V0aWxzLnVwZGF0ZVRlc3RTdGF0dXMoVEVTVF9TVEFUVVNfRklMRSwgcyk7CiAgICAgICAgICAgICAvLyBSdW4gdGVzdHMKLSAgICAgICAgICAgIHJ1blRlc3RBbmRXYWl0VW50aWxEb25lKGFjdGl2aXR5LCBzLCBydW5uZXIubVRpbWVvdXRJbk1pbGxpcywgaWdub3JlUmVzdWx0KTsKKyAgICAgICAgICAgIC8vIGkgaXMgMCBiYXNlZCwgYnV0IHRlc3QgY291bnQgaXMgMSBiYXNlZCBzbyBhZGQgMSB0byBpIGhlcmUuCisgICAgICAgICAgICBydW5UZXN0QW5kV2FpdFVudGlsRG9uZShhY3Rpdml0eSwgcywgcnVubmVyLm1UaW1lb3V0SW5NaWxsaXMsIGlnbm9yZVJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgaSArIDEgKyBtUmVzdW1lSW5kZXgpOwogICAgICAgICB9CiAKICAgICAgICAgRnNVdGlscy51cGRhdGVUZXN0U3RhdHVzKFRFU1RfU1RBVFVTX0ZJTEUsICIjRE9ORSIpOwpAQCAtNDM1LDcgKzQ0MSw3IEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBGaWxlIHRlc3RzX2xpc3QgPSBuZXcgRmlsZShMQVlPVVRfVEVTVFNfTElTVF9GSUxFKTsKICAgICAgICAgICAgIEJ1ZmZlcmVkT3V0cHV0U3RyZWFtIGJvcyA9IG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbSh0ZXN0c19saXN0LCBmYWxzZSkpOwotICAgICAgICAgICAgRnNVdGlscy5maW5kTGF5b3V0VGVzdHNSZWN1cnNpdmVseShib3MsIGdldFRlc3RQYXRoKCksIGZhbHNlKTsgLy8gRG9uJ3QgaWdub3JlIHJlc3VsdHMKKyAgICAgICAgICAgIEZzVXRpbHMud3JpdGVMYXlvdXRUZXN0TGlzdFJlY3Vyc2l2ZWx5KGJvcywgZ2V0VGVzdFBhdGgoKSwgZmFsc2UpOyAvLyBEb24ndCBpZ25vcmUgcmVzdWx0cwogICAgICAgICAgICAgYm9zLmZsdXNoKCk7CiAgICAgICAgICAgICBib3MuY2xvc2UoKTsKICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewpkaWZmIC0tZ2l0IGEvdGVzdHMvRHVtcFJlbmRlclRyZWUvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlL01lbnUuamF2YSBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZS9NZW51LmphdmEKaW5kZXggOWM0YjU3MjU2Li4wYjAwZDY1IDEwMDY0NAotLS0gYS90ZXN0cy9EdW1wUmVuZGVyVHJlZS9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUvTWVudS5qYXZhCisrKyBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZS9NZW51LmphdmEKQEAgLTUzLDI5ICs1MywzOCBAQAogICAgICAgICBpbnRlbnQuc2V0Q2xhc3ModGhpcywgVGVzdFNoZWxsQWN0aXZpdHkuY2xhc3MpOwogICAgICAgICBpbnRlbnQuYWRkRmxhZ3MoSW50ZW50LkZMQUdfQUNUSVZJVFlfU0lOR0xFX1RPUCk7CiAgICAgICAgIGludGVudC5wdXRFeHRyYShUZXN0U2hlbGxBY3Rpdml0eS5URVNUX1VSTCwgImZpbGU6Ly8iICsgZmlsZW5hbWUpOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoVGVzdFNoZWxsQWN0aXZpdHkuVE9UQUxfVEVTVF9DT1VOVCwgMSk7CisgICAgICAgIGludGVudC5wdXRFeHRyYShUZXN0U2hlbGxBY3Rpdml0eS5DVVJSRU5UX1RFU1RfTlVNQkVSLCAxKTsKICAgICAgICAgc3RhcnRBY3Rpdml0eShpbnRlbnQpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQogICAgIHZvaWQgcHJvY2Vzc0RpcmVjdG9yeShTdHJpbmcgcGF0aCwgYm9vbGVhbiBzZWxlY3Rpb24pIHsKLSAgICAgICAgZ2VuZXJhdGVUZXN0TGlzdChwYXRoKTsKKyAgICAgICAgaW50IHRlc3RDb3VudCA9IGdlbmVyYXRlVGVzdExpc3QocGF0aCk7CiAgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KEludGVudC5BQ1RJT05fVklFVyk7CiAgICAgICAgIGludGVudC5zZXRDbGFzcyh0aGlzLCBUZXN0U2hlbGxBY3Rpdml0eS5jbGFzcyk7CiAgICAgICAgIGludGVudC5hZGRGbGFncyhJbnRlbnQuRkxBR19BQ1RJVklUWV9TSU5HTEVfVE9QKTsKICAgICAgICAgaW50ZW50LnB1dEV4dHJhKFRlc3RTaGVsbEFjdGl2aXR5LlVJX0FVVE9fVEVTVCwgTEFZT1VUX1RFU1RTX0xJU1RfRklMRSk7CisgICAgICAgIGludGVudC5wdXRFeHRyYShUZXN0U2hlbGxBY3Rpdml0eS5UT1RBTF9URVNUX0NPVU5ULCB0ZXN0Q291bnQpOworICAgICAgICAvLyBUZXN0U2hlbGxBY3Rpdml0eSB3aWxsIHByb2Nlc3MgdGhpcyBpbnRlbnQgb25jZSBhbmQgaW5jcmVtZW50IHRoZSB0ZXN0IGluZGV4CisgICAgICAgIC8vIGJlZm9yZSBydW5uaW5nIHRoZSBmaXJzdCB0ZXN0LCBzbyBwYXNzIDAgaGVyZSB0byBhbGxvdyBmb3IgdGhhdC4KKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKFRlc3RTaGVsbEFjdGl2aXR5LkNVUlJFTlRfVEVTVF9OVU1CRVIsIDApOwogICAgICAgICBzdGFydEFjdGl2aXR5KGludGVudCk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIGdlbmVyYXRlVGVzdExpc3QoU3RyaW5nIHBhdGgpIHsKKyAgICBwcml2YXRlIGludCBnZW5lcmF0ZVRlc3RMaXN0KFN0cmluZyBwYXRoKSB7CisgICAgICAgIGludCB0ZXN0Q291bnQgPSAwOwogICAgICAgICB0cnkgewogICAgICAgICAgICAgRmlsZSB0ZXN0c19saXN0ID0gbmV3IEZpbGUoTEFZT1VUX1RFU1RTX0xJU1RfRklMRSk7CiAgICAgICAgICAgICBCdWZmZXJlZE91dHB1dFN0cmVhbSBib3MgPSBuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0odGVzdHNfbGlzdCwgZmFsc2UpKTsKLSAgICAgICAgICAgIEZzVXRpbHMuZmluZExheW91dFRlc3RzUmVjdXJzaXZlbHkoYm9zLCBwYXRoLCBmYWxzZSk7IC8vIERvbid0IGlnbm9yZSByZXN1bHRzCisgICAgICAgICAgICB0ZXN0Q291bnQgPSBGc1V0aWxzLndyaXRlTGF5b3V0VGVzdExpc3RSZWN1cnNpdmVseSgKKyAgICAgICAgICAgICAgICAgICAgYm9zLCBwYXRoLCBmYWxzZSk7IC8vIERvbid0IGlnbm9yZSByZXN1bHRzCiAgICAgICAgICAgICBib3MuZmx1c2goKTsKICAgICAgICAgICAgIGJvcy5jbG9zZSgpOwogICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgIExvZy5lKExPR1RBRywgIkVycm9yIHdoZW4gY3JlYXRpbmcgdGVzdCBsaXN0OiAiICsgZS5nZXRNZXNzYWdlKCkpOwogICAgICAgIH0KKyAgICAgICByZXR1cm4gdGVzdENvdW50OwogICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvdGVzdHMvRHVtcFJlbmRlclRyZWUvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlL1Rlc3RTaGVsbEFjdGl2aXR5LmphdmEgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZS9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUvVGVzdFNoZWxsQWN0aXZpdHkuamF2YQppbmRleCA3NDc1NzE5Li40MGFmOGMwIDEwMDY0NAotLS0gYS90ZXN0cy9EdW1wUmVuZGVyVHJlZS9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUvVGVzdFNoZWxsQWN0aXZpdHkuamF2YQorKysgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZS9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUvVGVzdFNoZWxsQWN0aXZpdHkuamF2YQpAQCAtMzUsNiArMzUsOCBAQAogaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CitpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvdzsKK2ltcG9ydCBhbmRyb2lkLndlYmtpdC5Db25zb2xlTWVzc2FnZTsKIGltcG9ydCBhbmRyb2lkLndlYmtpdC5HZW9sb2NhdGlvblBlcm1pc3Npb25zOwogaW1wb3J0IGFuZHJvaWQud2Via2l0Lkh0dHBBdXRoSGFuZGxlcjsKIGltcG9ydCBhbmRyb2lkLndlYmtpdC5Kc1Byb21wdFJlc3VsdDsKQEAgLTU1LDYgKzU3LDcgQEAKIGltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CiBpbXBvcnQgamF2YS5uZXQuVVJMOwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CiAKQEAgLTk5LDYgKzEwMiw4IEBACiAgICAgICAgIExvZy52KExPR1RBRywgIm1lc3NhZ2Ugc2VudCB0byBXZWJWaWV3IHRvIGR1bXAgdGV4dC4iKTsKICAgICAgICAgc3dpdGNoIChtRHVtcERhdGFUeXBlKSB7CiAgICAgICAgICAgICBjYXNlIERVTVBfQVNfVEVYVDoKKyAgICAgICAgICAgICAgICBjYWxsYmFjay5hcmcxID0gbUR1bXBUb3BGcmFtZUFzVGV4dCA/IDEgOiAwOworICAgICAgICAgICAgICAgIGNhbGxiYWNrLmFyZzIgPSBtRHVtcENoaWxkRnJhbWVzQXNUZXh0ID8gMSA6IDA7CiAgICAgICAgICAgICAgICAgbVdlYlZpZXcuZG9jdW1lbnRBc1RleHQoY2FsbGJhY2spOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBFWFRfUkVQUjoKQEAgLTExNyw2ICsxMjIsNyBAQAogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBpY2ljbGUpIHsKICAgICAgICAgc3VwZXIub25DcmVhdGUoaWNpY2xlKTsKKyAgICAgICAgcmVxdWVzdFdpbmRvd0ZlYXR1cmUoV2luZG93LkZFQVRVUkVfUFJPR1JFU1MpOwogCiAgICAgICAgIExpbmVhckxheW91dCBjb250ZW50VmlldyA9IG5ldyBMaW5lYXJMYXlvdXQodGhpcyk7CiAgICAgICAgIGNvbnRlbnRWaWV3LnNldE9yaWVudGF0aW9uKExpbmVhckxheW91dC5WRVJUSUNBTCk7CkBAIC0xNDUsNiArMTUxLDkgQEAKICAgICAgICAgaWYgKGludGVudCAhPSBudWxsKSB7CiAgICAgICAgICAgICBleGVjdXRlSW50ZW50KGludGVudCk7CiAgICAgICAgIH0KKworICAgICAgICAvLyBUaGlzIGlzIGFzeW5jaHJvbm91cywgYnV0IGl0IGdldHMgcHJvY2Vzc2VkIGJ5IFdlYkNvcmUgYmVmb3JlIGl0IHN0YXJ0cyBsb2FkaW5nIHBhZ2VzLgorICAgICAgICBtV2ViVmlldy51c2VNb2NrRGV2aWNlT3JpZW50YXRpb24oKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTE1OSw2ICsxNjgsOSBAQAogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKKyAgICAgICAgbVRvdGFsVGVzdENvdW50ID0gaW50ZW50LmdldEludEV4dHJhKFRPVEFMX1RFU1RfQ09VTlQsIG1Ub3RhbFRlc3RDb3VudCk7CisgICAgICAgIG1DdXJyZW50VGVzdE51bWJlciA9IGludGVudC5nZXRJbnRFeHRyYShDVVJSRU5UX1RFU1RfTlVNQkVSLCBtQ3VycmVudFRlc3ROdW1iZXIpOworCiAgICAgICAgIG1UZXN0VXJsID0gaW50ZW50LmdldFN0cmluZ0V4dHJhKFRFU1RfVVJMKTsKICAgICAgICAgaWYgKG1UZXN0VXJsID09IG51bGwpIHsKICAgICAgICAgICAgIG1VaUF1dG9UZXN0UGF0aCA9IGludGVudC5nZXRTdHJpbmdFeHRyYShVSV9BVVRPX1RFU1QpOwpAQCAtMTcyLDYgKzE4NCwxMSBAQAogICAgICAgICBtVGltZW91dEluTWlsbGlzID0gaW50ZW50LmdldEludEV4dHJhKFRJTUVPVVRfSU5fTUlMTElTLCAwKTsKICAgICAgICAgbUdldERyYXd0aW1lID0gaW50ZW50LmdldEJvb2xlYW5FeHRyYShHRVRfRFJBV19USU1FLCBmYWxzZSk7CiAgICAgICAgIG1TYXZlSW1hZ2VQYXRoID0gaW50ZW50LmdldFN0cmluZ0V4dHJhKFNBVkVfSU1BR0UpOworICAgICAgICBtU3RvcE9uUmVmRXJyb3IgPSBpbnRlbnQuZ2V0Qm9vbGVhbkV4dHJhKFNUT1BfT05fUkVGX0VSUk9SLCBmYWxzZSk7CisgICAgICAgIHNldFRpdGxlKCJUZXN0ICIgKyBtQ3VycmVudFRlc3ROdW1iZXIgKyAiIG9mICIgKyBtVG90YWxUZXN0Q291bnQpOworICAgICAgICBmbG9hdCByYXRpbyA9IChmbG9hdCltQ3VycmVudFRlc3ROdW1iZXIgLyBtVG90YWxUZXN0Q291bnQ7CisgICAgICAgIGludCBwcm9ncmVzcyA9IChpbnQpKHJhdGlvICogV2luZG93LlBST0dSRVNTX0VORCk7CisgICAgICAgIGdldFdpbmRvdygpLnNldEZlYXR1cmVJbnQoV2luZG93LkZFQVRVUkVfUFJPR1JFU1MsIHByb2dyZXNzKTsKIAogICAgICAgICBMb2cudihMT0dUQUcsICIgIExvYWRpbmcgIiArIG1UZXN0VXJsKTsKICAgICAgICAgbVdlYlZpZXcubG9hZFVybChtVGVzdFVybCk7CkBAIC0yMzcsNiArMjU0LDcgQEAKICAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoSW50ZW50LkFDVElPTl9WSUVXKTsKICAgICAgICAgaW50ZW50LmFkZEZsYWdzKEludGVudC5GTEFHX0FDVElWSVRZX1NJTkdMRV9UT1ApOwogICAgICAgICBpbnRlbnQucHV0RXh0cmEoVGVzdFNoZWxsQWN0aXZpdHkuVEVTVF9VUkwsIEZzVXRpbHMuZ2V0VGVzdFVybCh1cmwpKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKFRlc3RTaGVsbEFjdGl2aXR5LkNVUlJFTlRfVEVTVF9OVU1CRVIsICsrbUN1cnJlbnRUZXN0TnVtYmVyKTsKICAgICAgICAgaW50ZW50LnB1dEV4dHJhKFRJTUVPVVRfSU5fTUlMTElTLCAxMDAwMCk7CiAgICAgICAgIGV4ZWN1dGVJbnRlbnQoaW50ZW50KTsKICAgICB9CkBAIC0zMjksMTQgKzM0NywyOSBAQAogCiAgICAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCiAgICAgLy8gTGF5b3V0VGVzdENvbnRyb2xsZXIgRnVuY3Rpb25zCi0gICAgcHVibGljIHZvaWQgZHVtcEFzVGV4dCgpIHsKKyAgICBwdWJsaWMgdm9pZCBkdW1wQXNUZXh0KGJvb2xlYW4gZW5hYmxlUGl4ZWxUZXN0cykgeworICAgICAgICAvLyBBZGRlZCBhZnRlciB3ZWJraXQgdXBkYXRlIHRvIHI2Mzg1OS4gU2VlIHRyYWMud2Via2l0Lm9yZy9jaGFuZ2VzZXQvNjM3MzAuCisgICAgICAgIGlmIChlbmFibGVQaXhlbFRlc3RzKSB7CisgICAgICAgICAgICBMb2cudihMT0dUQUcsICJkdW1wQXNUZXh0KGVuYWJsZVBpeGVsVGVzdHMgPT0gdHJ1ZSkgbm90IGltcGxlbWVudGVkIG9uIEFuZHJvaWQhIik7CisgICAgICAgIH0KKwogICAgICAgICBtRHVtcERhdGFUeXBlID0gRHVtcERhdGFUeXBlLkRVTVBfQVNfVEVYVDsKKyAgICAgICAgbUR1bXBUb3BGcmFtZUFzVGV4dCA9IHRydWU7CiAgICAgICAgIGlmIChtV2ViVmlldyAhPSBudWxsKSB7CiAgICAgICAgICAgICBTdHJpbmcgdXJsID0gbVdlYlZpZXcuZ2V0VXJsKCk7CiAgICAgICAgICAgICBMb2cudihMT0dUQUcsICJkdW1wQXNUZXh0IGNhbGxlZDogIit1cmwpOwogICAgICAgICB9CiAgICAgfQogCisgICAgcHVibGljIHZvaWQgZHVtcENoaWxkRnJhbWVzQXNUZXh0KCkgeworICAgICAgICBtRHVtcERhdGFUeXBlID0gRHVtcERhdGFUeXBlLkRVTVBfQVNfVEVYVDsKKyAgICAgICAgbUR1bXBDaGlsZEZyYW1lc0FzVGV4dCA9IHRydWU7CisgICAgICAgIGlmIChtV2ViVmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICBTdHJpbmcgdXJsID0gbVdlYlZpZXcuZ2V0VXJsKCk7CisgICAgICAgICAgICBMb2cudihMT0dUQUcsICJkdW1wQ2hpbGRGcmFtZXNBc1RleHQgY2FsbGVkOiAiK3VybCk7CisgICAgICAgIH0KKyAgICB9CisKICAgICBwdWJsaWMgdm9pZCB3YWl0VW50aWxEb25lKCkgewogICAgICAgICBtV2FpdFVudGlsRG9uZSA9IHRydWU7CiAgICAgICAgIFN0cmluZyB1cmwgPSBtV2ViVmlldy5nZXRVcmwoKTsKQEAgLTM0OCw3ICszODEsOSBAQAogICAgICAgICBMb2cudihMT0dUQUcsICJub3RpZnlEb25lIGNhbGxlZDogIiArIHVybCk7CiAgICAgICAgIGlmIChtV2FpdFVudGlsRG9uZSkgewogICAgICAgICAgICAgbVdhaXRVbnRpbERvbmUgPSBmYWxzZTsKLSAgICAgICAgICAgIG1DaHJvbWVDbGllbnQub25Qcm9ncmVzc0NoYW5nZWQobVdlYlZpZXcsIDEwMSk7CisgICAgICAgICAgICBpZiAoIW1SZXF1ZXN0ZWRXZWJLaXREYXRhICYmICFtVGltZWRPdXQgJiYgIWZpbmlzaGVkKCkpIHsKKyAgICAgICAgICAgICAgICByZXF1ZXN0V2ViS2l0RGF0YSgpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCkBAIC00NTksOCArNDk0LDI1IEBACiAgICAgICogU2V0cyB0aGUgR2VvbG9jYXRpb24gcGVybWlzc2lvbiBzdGF0ZSB0byBiZSB1c2VkIGZvciBhbGwgZnV0dXJlIHJlcXVlc3RzLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldEdlb2xvY2F0aW9uUGVybWlzc2lvbihib29sZWFuIGFsbG93KSB7Ci0gICAgICAgIG1HZW9sb2NhdGlvblBlcm1pc3Npb25TZXQgPSB0cnVlOworICAgICAgICBtSXNHZW9sb2NhdGlvblBlcm1pc3Npb25TZXQgPSB0cnVlOwogICAgICAgICBtR2VvbG9jYXRpb25QZXJtaXNzaW9uID0gYWxsb3c7CisKKyAgICAgICAgaWYgKG1QZW5kaW5nR2VvbG9jYXRpb25QZXJtaXNzaW9uQ2FsbGJhY2tzICE9IG51bGwpIHsKKyAgICAgICAgICAgIEl0ZXJhdG9yIGl0ZXIgPSBtUGVuZGluZ0dlb2xvY2F0aW9uUGVybWlzc2lvbkNhbGxiYWNrcy5rZXlTZXQoKS5pdGVyYXRvcigpOworICAgICAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgR2VvbG9jYXRpb25QZXJtaXNzaW9ucy5DYWxsYmFjayBjYWxsYmFjayA9CisgICAgICAgICAgICAgICAgICAgICAgICAoR2VvbG9jYXRpb25QZXJtaXNzaW9ucy5DYWxsYmFjaykgaXRlci5uZXh0KCk7CisgICAgICAgICAgICAgICAgU3RyaW5nIG9yaWdpbiA9IChTdHJpbmcpIG1QZW5kaW5nR2VvbG9jYXRpb25QZXJtaXNzaW9uQ2FsbGJhY2tzLmdldChjYWxsYmFjayk7CisgICAgICAgICAgICAgICAgY2FsbGJhY2suaW52b2tlKG9yaWdpbiwgbUdlb2xvY2F0aW9uUGVybWlzc2lvbiwgZmFsc2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVBlbmRpbmdHZW9sb2NhdGlvblBlcm1pc3Npb25DYWxsYmFja3MgPSBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TW9ja0RldmljZU9yaWVudGF0aW9uKGJvb2xlYW4gY2FuUHJvdmlkZUFscGhhLCBkb3VibGUgYWxwaGEsCisgICAgICAgICAgICBib29sZWFuIGNhblByb3ZpZGVCZXRhLCBkb3VibGUgYmV0YSwgYm9vbGVhbiBjYW5Qcm92aWRlR2FtbWEsIGRvdWJsZSBnYW1tYSkgeworICAgICAgICBtV2ViVmlldy5zZXRNb2NrRGV2aWNlT3JpZW50YXRpb24oY2FuUHJvdmlkZUFscGhhLCBhbHBoYSwgY2FuUHJvdmlkZUJldGEsIGJldGEsCisgICAgICAgICAgICAgICAgY2FuUHJvdmlkZUdhbW1hLCBnYW1tYSk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgb3ZlcnJpZGVQcmVmZXJlbmNlKFN0cmluZyBrZXksIGJvb2xlYW4gdmFsdWUpIHsKQEAgLTQ3Myw2ICs1MjUsMTAgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIHB1YmxpYyB2b2lkIHNldFhTU0F1ZGl0b3JFbmFibGVkIChib29sZWFuIGZsYWcpIHsKKyAgICAgICAgbVdlYlZpZXcuZ2V0U2V0dGluZ3MoKS5zZXRYU1NBdWRpdG9yRW5hYmxlZChmbGFnKTsKKyAgICB9CisKICAgICBwcml2YXRlIGZpbmFsIFdlYlZpZXdDbGllbnQgbVZpZXdDbGllbnQgPSBuZXcgV2ViVmlld0NsaWVudCgpewogICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIHZvaWQgb25QYWdlRmluaXNoZWQoV2ViVmlldyB2aWV3LCBTdHJpbmcgdXJsKSB7CkBAIC00OTAsMTEgKzU0NiwzMCBAQAogICAgICAgICAgICAgICAgICAgICBkcmF3UGFnZVRvRmlsZShtU2F2ZUltYWdlUGF0aCArICIvIiArIG5hbWUgKyAiLnBuZyIsIG1XZWJWaWV3KTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CisKICAgICAgICAgICAgIC8vIENhbGxpbmcgZmluaXNoZWQoKSB3aWxsIGNoZWNrIGlmIHdlJ3ZlIG1ldCBhbGwgdGhlIGNvbmRpdGlvbnMgZm9yIGNvbXBsZXRpbmcKLSAgICAgICAgICAgIC8vIHRoaXMgdGVzdCBhbmQgbW92ZSB0byB0aGUgbmV4dCBvbmUgaWYgd2UgYXJlIHJlYWR5LgorICAgICAgICAgICAgLy8gdGhpcyB0ZXN0IGFuZCBtb3ZlIHRvIHRoZSBuZXh0IG9uZSBpZiB3ZSBhcmUgcmVhZHkuIE90aGVyd2lzZSB3ZSBhc2sgV2ViQ29yZSB0bworICAgICAgICAgICAgLy8gZHVtcCB0aGUgcGFnZS4KICAgICAgICAgICAgIGlmIChmaW5pc2hlZCgpKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIW1XYWl0VW50aWxEb25lICYmICFtUmVxdWVzdGVkV2ViS2l0RGF0YSAmJiAhbVRpbWVkT3V0KSB7CisgICAgICAgICAgICAgICAgcmVxdWVzdFdlYktpdERhdGEoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKG1XYWl0VW50aWxEb25lKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy52KExPR1RBRywgInBhZ2UgZmluaXNoZWQgbG9hZGluZyBidXQgd2FpdGluZyBmb3Igbm90aWZ5RG9uZSB0byBiZSBjYWxsZWQ6ICIgKyB1cmwpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChtUmVxdWVzdGVkV2ViS2l0RGF0YSkgeworICAgICAgICAgICAgICAgICAgICBMb2cudihMT0dUQUcsICJwYWdlIGZpbmlzaGVkIGxvYWRpbmcgYnV0IHdlYmtpdCBkYXRhIGhhcyBhbHJlYWR5IGJlZW4gcmVxdWVzdGVkOiAiICsgdXJsKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobVRpbWVkT3V0KSB7CisgICAgICAgICAgICAgICAgICAgIExvZy52KExPR1RBRywgInBhZ2UgZmluaXNoZWQgbG9hZGluZyBidXQgYWxyZWFkeSB0aW1lZCBvdXQ6ICIgKyB1cmwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgc3VwZXIub25QYWdlRmluaXNoZWQodmlldywgdXJsKTsKICAgICAgICAgfQogCkBAIC01MzYsNDQgKzYxMSw4IEBACiAKICAgICBwcml2YXRlIGZpbmFsIFdlYkNocm9tZUNsaWVudCBtQ2hyb21lQ2xpZW50ID0gbmV3IFdlYkNocm9tZUNsaWVudCgpIHsKICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUHJvZ3Jlc3NDaGFuZ2VkKFdlYlZpZXcgdmlldywgaW50IG5ld1Byb2dyZXNzKSB7Ci0KLSAgICAgICAgICAgIC8vIG5vdGlmeURvbmUgY2FsbHMgdGhpcyB3aXRoIDEwMSUuIFdlIG9ubHkgd2FudCB0byB1cGRhdGUgdGhpcyBmbGFnIGlmIHRoaXMKLSAgICAgICAgICAgIC8vIGlzIHRoZSByZWFsIGNhbGwgZnJvbSBXZWJDb3JlLgotICAgICAgICAgICAgaWYgKG5ld1Byb2dyZXNzID09IDEwMCkgewotICAgICAgICAgICAgICAgIG1PbmVIdW5kcmVkUGVyY2VudENvbXBsZXRlID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gV2l0aCB0aGUgZmxhZyB1cGRhdGVkLCB3ZSBjYW4gbm93IHByb2NlZWQgYXMgbm9ybWFsIHdoZXRoZXIgdGhlIHByb2dyZXNzIHVwZGF0ZSBjYW1lIGZyb20KLSAgICAgICAgICAgIC8vIFdlYkNvcmUgb3Igbm90aWZ5RG9uZS4KLSAgICAgICAgICAgIGlmIChuZXdQcm9ncmVzcyA+PSAxMDApIHsKLSAgICAgICAgICAgICAgICAvLyBmaW5pc2hlZCgpIHdpbGwgY2hlY2sgaWYgd2UgYXJlIHJlYWR5IHRvIG1vdmUgdG8gdGhlIG5leHQgdGVzdCBhbmQgZG8gc28gaWYgd2UgYXJlLgotICAgICAgICAgICAgICAgIGlmIChmaW5pc2hlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoIW1UaW1lZE91dCAmJiAhbVdhaXRVbnRpbERvbmUgJiYgIW1SZXF1ZXN0ZWRXZWJLaXREYXRhKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyB1cmwgPSBtV2ViVmlldy5nZXRVcmwoKTsKLSAgICAgICAgICAgICAgICAgICAgTG9nLnYoTE9HVEFHLCAiRmluaXNoZWQ6ICIrIHVybCk7Ci0gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RXZWJLaXREYXRhKCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHVybCA9IG1XZWJWaWV3LmdldFVybCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAobVRpbWVkT3V0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cudihMT0dUQUcsICJUaW1lZCBvdXQgYmVmb3JlIGZpbmlzaGluZzogIiArIHVybCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobVdhaXRVbnRpbERvbmUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy52KExPR1RBRywgIldhaXRpbmcgZm9yIG5vdGlmeURvbmU6ICIgKyB1cmwpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1SZXF1ZXN0ZWRXZWJLaXREYXRhKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cudihMT0dUQUcsICJSZXF1ZXN0ZWQgd2Via2l0IGRhdGEgcmVhZHk6ICIgKyB1cmwpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVjZWl2ZWRUaXRsZShXZWJWaWV3IHZpZXcsIFN0cmluZyB0aXRsZSkgewotICAgICAgICAgICAgaWYgKHRpdGxlLmxlbmd0aCgpID4gMzApCi0gICAgICAgICAgICAgICAgdGl0bGUgPSAiLi4uIit0aXRsZS5zdWJzdHJpbmcodGl0bGUubGVuZ3RoKCktMzApOwotICAgICAgICAgICAgc2V0VGl0bGUodGl0bGUpOworICAgICAgICAgICAgc2V0VGl0bGUoIlRlc3QgIiArIG1DdXJyZW50VGVzdE51bWJlciArICIgb2YgIiArIG1Ub3RhbFRlc3RDb3VudCArICI6ICIrIHRpdGxlKTsKICAgICAgICAgICAgIGlmIChtRHVtcFRpdGxlQ2hhbmdlcykgewogICAgICAgICAgICAgICAgIG1UaXRsZUNoYW5nZXMuYXBwZW5kKCJUSVRMRSBDSEFOR0VEOiAiKTsKICAgICAgICAgICAgICAgICBtVGl0bGVDaGFuZ2VzLmFwcGVuZCh0aXRsZSk7CkBAIC02NzAsMjEgKzcwOSw0MCBAQAogICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIHZvaWQgb25HZW9sb2NhdGlvblBlcm1pc3Npb25zU2hvd1Byb21wdChTdHJpbmcgb3JpZ2luLAogICAgICAgICAgICAgICAgIEdlb2xvY2F0aW9uUGVybWlzc2lvbnMuQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgICAgIGlmIChtR2VvbG9jYXRpb25QZXJtaXNzaW9uU2V0KSB7CisgICAgICAgICAgICBpZiAobUlzR2VvbG9jYXRpb25QZXJtaXNzaW9uU2V0KSB7CiAgICAgICAgICAgICAgICAgY2FsbGJhY2suaW52b2tlKG9yaWdpbiwgbUdlb2xvY2F0aW9uUGVybWlzc2lvbiwgZmFsc2UpOworICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtUGVuZGluZ0dlb2xvY2F0aW9uUGVybWlzc2lvbkNhbGxiYWNrcyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbVBlbmRpbmdHZW9sb2NhdGlvblBlcm1pc3Npb25DYWxsYmFja3MgPQorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEhhc2hNYXA8R2VvbG9jYXRpb25QZXJtaXNzaW9ucy5DYWxsYmFjaywgU3RyaW5nPigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVBlbmRpbmdHZW9sb2NhdGlvblBlcm1pc3Npb25DYWxsYmFja3MucHV0KGNhbGxiYWNrLCBvcmlnaW4pOwogICAgICAgICB9CiAKICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uQ29uc29sZU1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UsIGludCBsaW5lTnVtYmVyLAotICAgICAgICAgICAgICAgIFN0cmluZyBzb3VyY2VJRCkgeworICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbkNvbnNvbGVNZXNzYWdlKENvbnNvbGVNZXNzYWdlIGNvbnNvbGVNZXNzYWdlKSB7CisgICAgICAgICAgICBTdHJpbmcgbXNnID0gIkNPTlNPTEUgTUVTU0FHRTogbGluZSAiICsgY29uc29sZU1lc3NhZ2UubGluZU51bWJlcigpICsgIjogIgorICAgICAgICAgICAgICAgICAgICArIGNvbnNvbGVNZXNzYWdlLm1lc3NhZ2UoKSArICJcbiI7CiAgICAgICAgICAgICBpZiAobUNvbnNvbGVNZXNzYWdlcyA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgbUNvbnNvbGVNZXNzYWdlcyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFN0cmluZyBjb25zb2xlTWVzc2FnZSA9ICJDT05TT0xFIE1FU1NBR0U6IGxpbmUgIgotICAgICAgICAgICAgICAgICAgICArIGxpbmVOdW1iZXIgKyI6ICIrIG1lc3NhZ2UgKyJcbiI7Ci0gICAgICAgICAgICBtQ29uc29sZU1lc3NhZ2VzLmFwcGVuZChjb25zb2xlTWVzc2FnZSk7Ci0gICAgICAgICAgICBMb2cudihMT0dUQUcsICJMT0c6ICIrY29uc29sZU1lc3NhZ2UpOworICAgICAgICAgICAgbUNvbnNvbGVNZXNzYWdlcy5hcHBlbmQobXNnKTsKKyAgICAgICAgICAgIExvZy52KExPR1RBRywgIkxPRzogIiArIG1zZyk7CisgICAgICAgICAgICAvLyB0aGUgcmF0aW9uYWxlIGhlcmUgaXMgdGhhdCBpZiB0aGVyZSdzIGFuIGVycm9yIG9mIGVpdGhlciB0eXBlLCBhbmQgdGhlIHRlc3Qgd2FzCisgICAgICAgICAgICAvLyB3YWl0aW5nIGZvciAibm90aWZ5RG9uZSIgc2lnbmFsIHRvIGZpbmlzaCwgdGhlbiB0aGVyZSdzIG5vIHBvaW50IGluIHdhaXRpbmcKKyAgICAgICAgICAgIC8vIGFueW1vcmUgYmVjYXVzZSB0aGUgSlMgZXhlY3V0aW9uIGlzIGFscmVhZHkgdGVybWluYXRlZCBhdCB0aGlzIHBvaW50IGFuZCBhCisgICAgICAgICAgICAvLyAibm90aWZ5RG9uZSIgd2lsbCBuZXZlciBjb21lIG91dCBzbyBpdCdzIGp1c3Qgd2FzdGluZyB0aW1lIHRpbGwgdGltZW91dCBraWNrcyBpbgorICAgICAgICAgICAgaWYgKChtc2cuY29udGFpbnMoIlVuY2F1Z2h0IFJlZmVyZW5jZUVycm9yOiIpIHx8IG1zZy5jb250YWlucygiVW5jYXVnaHQgVHlwZUVycm9yOiIpKQorICAgICAgICAgICAgICAgICAgICAmJiBtV2FpdFVudGlsRG9uZSAmJiBtU3RvcE9uUmVmRXJyb3IpIHsKKyAgICAgICAgICAgICAgICBMb2cudyhMT0dUQUcsICJUZXJtaW5hdGluZyB0ZXN0IGNhc2Ugb24gdW5jYXVnaHQgUmVmZXJlbmNlRXJyb3Igb3IgVHlwZUVycm9yLiIpOworICAgICAgICAgICAgICAgIG1IYW5kbGVyLnBvc3REZWxheWVkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5RG9uZSgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSwgNTAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAKICAgICAgICAgQE92ZXJyaWRlCkBAIC03MjMsMTMgKzc4MSwxNSBAQAogCiAgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTmV3V2luZG93V2ViVmlldyBleHRlbmRzIFdlYlZpZXcgewogICAgICAgICBwdWJsaWMgTmV3V2luZG93V2ViVmlldyhDb250ZXh0IGNvbnRleHQsIE1hcDxTdHJpbmcsIE9iamVjdD4ganNJZmFjZXMpIHsKLSAgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIG51bGwsIDAsIGpzSWZhY2VzKTsKKyAgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIG51bGwsIDAsIGpzSWZhY2VzLCBmYWxzZSk7CiAgICAgICAgIH0KICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgcmVzZXRUZXN0U3RhdHVzKCkgewogICAgICAgICBtV2FpdFVudGlsRG9uZSA9IGZhbHNlOwogICAgICAgICBtRHVtcERhdGFUeXBlID0gbURlZmF1bHREdW1wRGF0YVR5cGU7CisgICAgICAgIG1EdW1wVG9wRnJhbWVBc1RleHQgPSBmYWxzZTsKKyAgICAgICAgbUR1bXBDaGlsZEZyYW1lc0FzVGV4dCA9IGZhbHNlOwogICAgICAgICBtVGltZWRPdXQgPSBmYWxzZTsKICAgICAgICAgbUR1bXBUaXRsZUNoYW5nZXMgPSBmYWxzZTsKICAgICAgICAgbVJlcXVlc3RlZFdlYktpdERhdGEgPSBmYWxzZTsKQEAgLTczOSwxMCArNzk5LDEyIEBACiAgICAgICAgIG1FdmVudFNlbmRlci5jbGVhclRvdWNoUG9pbnRzKCk7CiAgICAgICAgIG1FdmVudFNlbmRlci5jbGVhclRvdWNoTWV0YVN0YXRlKCk7CiAgICAgICAgIG1QYWdlRmluaXNoZWQgPSBmYWxzZTsKLSAgICAgICAgbU9uZUh1bmRyZWRQZXJjZW50Q29tcGxldGUgPSBmYWxzZTsKICAgICAgICAgbUR1bXBXZWJLaXREYXRhID0gZmFsc2U7CiAgICAgICAgIG1HZXREcmF3dGltZSA9IGZhbHNlOwogICAgICAgICBtU2F2ZUltYWdlUGF0aCA9IG51bGw7CisgICAgICAgIHNldERlZmF1bHRXZWJTZXR0aW5ncyhtV2ViVmlldyk7CisgICAgICAgIG1Jc0dlb2xvY2F0aW9uUGVybWlzc2lvblNldCA9IGZhbHNlOworICAgICAgICBtUGVuZGluZ0dlb2xvY2F0aW9uUGVybWlzc2lvbkNhbGxiYWNrcyA9IG51bGw7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBsb25nW10gZ2V0RHJhd1dlYlZpZXdUaW1lKFdlYlZpZXcgdmlldywgaW50IGNvdW50KSB7CkBAIC03NzksNyArODQxLDcgQEAKICAgICB9CiAKICAgICBwcml2YXRlIGJvb2xlYW4gY2FuTW92ZVRvTmV4dFRlc3QoKSB7Ci0gICAgICAgIHJldHVybiAobUR1bXBXZWJLaXREYXRhICYmIG1PbmVIdW5kcmVkUGVyY2VudENvbXBsZXRlICYmIG1QYWdlRmluaXNoZWQgJiYgIW1XYWl0VW50aWxEb25lKSB8fCBtVGltZWRPdXQ7CisgICAgICAgIHJldHVybiAobUR1bXBXZWJLaXREYXRhICYmIG1QYWdlRmluaXNoZWQgJiYgIW1XYWl0VW50aWxEb25lKSB8fCBtVGltZWRPdXQ7CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIHNldHVwV2ViVmlld0ZvckxheW91dFRlc3RzKFdlYlZpZXcgd2VidmlldywgQ2FsbGJhY2tQcm94eSBjYWxsYmFja1Byb3h5KSB7CkBAIC03ODcsNiArODQ5LDE5IEBACiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIAorICAgICAgICBzZXREZWZhdWx0V2ViU2V0dGluZ3Mod2Vidmlldyk7CisKKyAgICAgICAgd2Vidmlldy5zZXRXZWJDaHJvbWVDbGllbnQobUNocm9tZUNsaWVudCk7CisgICAgICAgIHdlYnZpZXcuc2V0V2ViVmlld0NsaWVudChtVmlld0NsaWVudCk7CisgICAgICAgIC8vIFNldHRpbmcgYSB0b3VjaCBpbnRlcnZhbCBvZiAtMSBlZmZlY3RpdmVseSBkaXNhYmxlcyB0aGUgb3B0aW1pc2F0aW9uIGluIFdlYlZpZXcKKyAgICAgICAgLy8gdGhhdCBzdG9wcyByZXBlYXRlZCB0b3VjaCBldmVudHMgZmxvb2RpbmcgV2ViQ29yZS4gVGhlIEV2ZW50IFNlbmRlciBvbmx5IHNlbmRzIGEKKyAgICAgICAgLy8gc2luZ2xlIGV2ZW50IHJhdGhlciB0aGFuIGEgc3RyZWFtIG9mIGV2ZW50cyAobGlrZSB3aGF0IHdvdWxkIGdlbmVyYWxseSBoYXBwZW4gaW4KKyAgICAgICAgLy8gYSByZWFsIHVzZSBvZiB0b3VjaCBldmVudHMgaW4gYSBXZWJWaWV3KSAgYW5kIHNvIGlmIHRoZSBXZWJWaWV3IGRyb3BzIHRoZSBldmVudCwKKyAgICAgICAgLy8gdGhlIHRlc3Qgd2lsbCBmYWlsIGFzIHRoZSB0ZXN0IGV4cGVjdHMgb25lIGNhbGxiYWNrIGZvciBldmVyeSB0b3VjaCBpdCBzeW50aGVzaXplcy4KKyAgICAgICAgd2Vidmlldy5zZXRUb3VjaEludGVydmFsKC0xKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0V2ViU2V0dGluZ3MoV2ViVmlldyB3ZWJ2aWV3KSB7CiAgICAgICAgIFdlYlNldHRpbmdzIHNldHRpbmdzID0gd2Vidmlldy5nZXRTZXR0aW5ncygpOwogICAgICAgICBzZXR0aW5ncy5zZXRBcHBDYWNoZUVuYWJsZWQodHJ1ZSk7CiAgICAgICAgIHNldHRpbmdzLnNldEFwcENhY2hlUGF0aChnZXRBcHBsaWNhdGlvbkNvbnRleHQoKS5nZXRDYWNoZURpcigpLmdldFBhdGgoKSk7CkBAIC03OTksMTUgKzg3NCw3IEBACiAgICAgICAgIHNldHRpbmdzLnNldERhdGFiYXNlUGF0aChnZXREaXIoImRhdGFiYXNlcyIsMCkuZ2V0QWJzb2x1dGVQYXRoKCkpOwogICAgICAgICBzZXR0aW5ncy5zZXREb21TdG9yYWdlRW5hYmxlZCh0cnVlKTsKICAgICAgICAgc2V0dGluZ3Muc2V0V29ya2Vyc0VuYWJsZWQoZmFsc2UpOwotCi0gICAgICAgIHdlYnZpZXcuc2V0V2ViQ2hyb21lQ2xpZW50KG1DaHJvbWVDbGllbnQpOwotICAgICAgICB3ZWJ2aWV3LnNldFdlYlZpZXdDbGllbnQobVZpZXdDbGllbnQpOwotICAgICAgICAvLyBTZXR0aW5nIGEgdG91Y2ggaW50ZXJ2YWwgb2YgLTEgZWZmZWN0aXZlbHkgZGlzYWJsZXMgdGhlIG9wdGltaXNhdGlvbiBpbiBXZWJWaWV3Ci0gICAgICAgIC8vIHRoYXQgc3RvcHMgcmVwZWF0ZWQgdG91Y2ggZXZlbnRzIGZsb29kaW5nIFdlYkNvcmUuIFRoZSBFdmVudCBTZW5kZXIgb25seSBzZW5kcyBhCi0gICAgICAgIC8vIHNpbmdsZSBldmVudCByYXRoZXIgdGhhbiBhIHN0cmVhbSBvZiBldmVudHMgKGxpa2Ugd2hhdCB3b3VsZCBnZW5lcmFsbHkgaGFwcGVuIGluCi0gICAgICAgIC8vIGEgcmVhbCB1c2Ugb2YgdG91Y2ggZXZlbnRzIGluIGEgV2ViVmlldykgIGFuZCBzbyBpZiB0aGUgV2ViVmlldyBkcm9wcyB0aGUgZXZlbnQsCi0gICAgICAgIC8vIHRoZSB0ZXN0IHdpbGwgZmFpbCBhcyB0aGUgdGVzdCBleHBlY3RzIG9uZSBjYWxsYmFjayBmb3IgZXZlcnkgdG91Y2ggaXQgc3ludGhlc2l6ZXMuCi0gICAgICAgIHdlYnZpZXcuc2V0VG91Y2hJbnRlcnZhbCgtMSk7CisgICAgICAgIHNldHRpbmdzLnNldFhTU0F1ZGl0b3JFbmFibGVkKGZhbHNlKTsKICAgICB9CiAKICAgICBwcml2YXRlIFdlYlZpZXcgbVdlYlZpZXc7CkBAIC04MjQsNiArODkxLDkgQEAKICAgICBwcml2YXRlIFN0cmluZyBtU2F2ZUltYWdlUGF0aDsKICAgICBwcml2YXRlIEJ1ZmZlcmVkUmVhZGVyIG1UZXN0TGlzdFJlYWRlcjsKICAgICBwcml2YXRlIGJvb2xlYW4gbUdldERyYXd0aW1lOworICAgIHByaXZhdGUgaW50IG1Ub3RhbFRlc3RDb3VudDsKKyAgICBwcml2YXRlIGludCBtQ3VycmVudFRlc3ROdW1iZXI7CisgICAgcHJpdmF0ZSBib29sZWFuIG1TdG9wT25SZWZFcnJvcjsKIAogICAgIC8vIFN0YXRlcwogICAgIHByaXZhdGUgYm9vbGVhbiBtVGltZWRPdXQ7CkBAIC04MzMsNiArOTAzLDggQEAKICAgICAvLyBMYXlvdXQgdGVzdCBjb250cm9sbGVyIHZhcmlhYmxlcy4KICAgICBwcml2YXRlIER1bXBEYXRhVHlwZSBtRHVtcERhdGFUeXBlOwogICAgIHByaXZhdGUgRHVtcERhdGFUeXBlIG1EZWZhdWx0RHVtcERhdGFUeXBlID0gRHVtcERhdGFUeXBlLkVYVF9SRVBSOworICAgIHByaXZhdGUgYm9vbGVhbiBtRHVtcFRvcEZyYW1lQXNUZXh0OworICAgIHByaXZhdGUgYm9vbGVhbiBtRHVtcENoaWxkRnJhbWVzQXNUZXh0OwogICAgIHByaXZhdGUgYm9vbGVhbiBtV2FpdFVudGlsRG9uZTsKICAgICBwcml2YXRlIGJvb2xlYW4gbUR1bXBUaXRsZUNoYW5nZXM7CiAgICAgcHJpdmF0ZSBTdHJpbmdCdWZmZXIgbVRpdGxlQ2hhbmdlczsKQEAgLTg0Niw3ICs5MTgsNiBAQAogCiAgICAgcHJpdmF0ZSBib29sZWFuIG1QYWdlRmluaXNoZWQgPSBmYWxzZTsKICAgICBwcml2YXRlIGJvb2xlYW4gbUR1bXBXZWJLaXREYXRhID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1PbmVIdW5kcmVkUGVyY2VudENvbXBsZXRlID0gZmFsc2U7CiAKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFRJTUVPVVRfU1RSID0gIioqVGVzdCB0aW1lb3V0IjsKIApAQCAtODYxLDExICs5MzIsMTUgQEAKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFVJX0FVVE9fVEVTVCA9ICJVaUF1dG9UZXN0IjsKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEdFVF9EUkFXX1RJTUUgPSAiR2V0RHJhd1RpbWUiOwogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0FWRV9JTUFHRSA9ICJTYXZlSW1hZ2UiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9UQUxfVEVTVF9DT1VOVCA9ICJUZXN0Q291bnQiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VSUkVOVF9URVNUX05VTUJFUiA9ICJUZXN0TnVtYmVyIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFNUT1BfT05fUkVGX0VSUk9SID0gIlN0b3BPblJlZmVyZW5jZUVycm9yIjsKIAogICAgIHN0YXRpYyBmaW5hbCBpbnQgRFJBV19SVU5TID0gNTsKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERSQVdfVElNRV9MT0cgPSBFbnZpcm9ubWVudC5nZXRFeHRlcm5hbFN0b3JhZ2VEaXJlY3RvcnkoKSArCiAgICAgICAgICIvYW5kcm9pZC9wYWdlX2RyYXdfdGltZS50eHQiOwogCi0gICAgcHJpdmF0ZSBib29sZWFuIG1HZW9sb2NhdGlvblBlcm1pc3Npb25TZXQ7CisgICAgcHJpdmF0ZSBib29sZWFuIG1Jc0dlb2xvY2F0aW9uUGVybWlzc2lvblNldDsKICAgICBwcml2YXRlIGJvb2xlYW4gbUdlb2xvY2F0aW9uUGVybWlzc2lvbjsKKyAgICBwcml2YXRlIE1hcCBtUGVuZGluZ0dlb2xvY2F0aW9uUGVybWlzc2lvbkNhbGxiYWNrczsKIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9BbmRyb2lkLm1rIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFmYzYzMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMjkgQEAKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cworCitMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1zdWJkaXItamF2YS1maWxlcykKKworTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC50ZXN0LnJ1bm5lcgorCitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gZGlmZl9tYXRjaF9wYXRjaAorCitMT0NBTF9QQUNLQUdFX05BTUUgOj0gRHVtcFJlbmRlclRyZWUyCisKK2luY2x1ZGUgJChCVUlMRF9QQUNLQUdFKQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9BbmRyb2lkTWFuaWZlc3QueG1sIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL0FuZHJvaWRNYW5pZmVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQwYzRlOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsNTggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCitDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCitMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKK3lvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KK1lvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCitodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKK1dJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiIHBhY2thZ2U9ImNvbS5hbmRyb2lkLmR1bXByZW5kZXJ0cmVlMiI+CisgICAgPGFwcGxpY2F0aW9uPgorICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KKworICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIudWkuRGlyTGlzdEFjdGl2aXR5IgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iRHVtcCBSZW5kZXIgVHJlZSAyIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpjb25maWdDaGFuZ2VzPSJvcmllbnRhdGlvbiI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKKyAgICAgICAgPCEtLSBhbmRyb2lkOmxhdW5jaE1vZGU9InNpbmdsZVRhc2siIGlzIHRoZXJlIHNvIHdlIG9ubHkgaGF2ZSBhIG9uZSBpbnN0YW5jZQorICAgICAgICAgICAgIG9mIHRoaXMgYWN0aXZpdHkuIEhvd2V2ZXIsIGl0IGRvZXNuJ3Qgc2VlbSB0byB3b3JrIGV4YWN0bHkgbGlrZSBkZXNjcmliZWQgaW4gdGhlCisgICAgICAgICAgICAgZG9jdW1lbnRhdGlvbiwgYmVjYXVzZSB0aGUgYmVoYXZpb3VyIG9mIHRoZSBhcHBsaWNhdGlvbiBzdWdnZXN0CisgICAgICAgICAgICAgdGhlcmUgaXMgb25seSBhIHNpbmdsZSB0YXNrIGZvciBhbGwgMyBhY3Rpdml0aWVzLiBXZSBkb24ndCB1bmRlcnN0YW5kCisgICAgICAgICAgICAgaG93IGV4YWN0bHkgaXQgYWxsIHdvcmtzLCBidXQgYXQgdGhlIG1vbWVudCBpdCB3b3JrcyBqdXN0IGZpbmUuCisgICAgICAgICAgICAgSXQgY2FuIGxlYWQgdG8gc29tZSB3ZWlyZCBiZWhhdmlvdXIgaW4gdGhlIGZ1dHVyZS4gLS0+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5UZXN0c0xpc3RBY3Rpdml0eSIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IlRlc3RzJyBsaXN0IGFjdGl2aXR5IgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXVuY2hNb2RlPSJzaW5nbGVUYXNrIj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKworICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuTGF5b3V0VGVzdHNFeGVjdXRvciIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkxheW91dCB0ZXN0cycgZXhlY3V0b3IiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOnByb2Nlc3M9IjpleGVjdXRvciI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKKyAgICAgICAgPHNlcnZpY2UgYW5kcm9pZDpuYW1lPSJNYW5hZ2VyU2VydmljZSI+CisgICAgICAgIDwvc2VydmljZT4KKyAgICA8L2FwcGxpY2F0aW9uPgorCisgICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImNvbS5hbmRyb2lkLmR1bXByZW5kZXJ0cmVlMi5zY3JpcHRzdXBwb3J0LlNjcmlwdFRlc3RSdW5uZXIiCisgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImNvbS5hbmRyb2lkLmR1bXByZW5kZXJ0cmVlMiIKKyAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkxheW91dCB0ZXN0cyBzY3JpcHQgcnVubmVyIiAvPgorCisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5JTlRFUk5FVCIgLz4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLldSSVRFX1NEQ0FSRCIgLz4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLldSSVRFX0VYVEVSTkFMX1NUT1JBR0UiIC8+CisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5XQUtFX0xPQ0siIC8+Cis8L21hbmlmZXN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9hc3NldHMvcnVuX2FwYWNoZTIucHkgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvYXNzZXRzL3J1bl9hcGFjaGUyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmY0MDQwOTAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvYXNzZXRzL3J1bl9hcGFjaGUyLnB5CkBAIC0wLDAgKzEsMTA3IEBACisjIS91c3IvYmluL3B5dGhvbgorIworIyBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKyIiIlN0YXJ0LCBzdG9wLCBvciByZXN0YXJ0IGFwYWNoZTIgc2VydmVyLgorCisgIEFwYWNoZTIgbXVzdCBiZSBpbnN0YWxsZWQgd2l0aCBtb2RfcGhwIQorCisgIFVzYWdlOgorICAgIHJ1bl9hcGFjaGUyLnB5IHN0YXJ0fHN0b3B8cmVzdGFydAorIiIiCisKK2ltcG9ydCBzeXMKK2ltcG9ydCBvcworaW1wb3J0IHN1YnByb2Nlc3MKK2ltcG9ydCBsb2dnaW5nCisKK2RlZiBtYWluKCk6CisgIGlmIGxlbihzeXMuYXJndikgPCAyOgorICAgIHJ1bl9jbWQgPSAiIgorICBlbHNlOgorICAgIHJ1bl9jbWQgPSBzeXMuYXJndlsxXQorCisgICNTZXR1cCBsb2dnaW5nIGNsYXNzCisgIGxvZ2dpbmcuYmFzaWNDb25maWcobGV2ZWw9bG9nZ2luZy5JTkZPLCBmb3JtYXQ9JyUobWVzc2FnZSlzJykKKworICBpZiBub3QgcnVuX2NtZCBpbiAoInN0YXJ0IiwgInN0b3AiLCAicmVzdGFydCIpOgorICAgIGxvZ2dpbmcuaW5mbygiaWxsZWdhbCBhcmd1bWVudDogIiArIHJ1bl9jbWQpCisgICAgbG9nZ2luZy5pbmZvKCJVc2FnZTogcHl0aG9uIHJ1bl9hcGFjaGUyLnB5IHN0YXJ0fHN0b3B8cmVzdGFydCIpCisgICAgcmV0dXJuCisKKyAgI0NyZWF0ZSAvdG1wL1dlYktpdCBpZiBpdCBkb2Vzbid0IGV4aXN0LiBUaGlzIGlzIG5lZWRlZCBmb3IgdmFyaW91cyBmaWxlcyB1c2VkIGJ5IGFwYWNoZTIKKyAgdG1wX1dlYktpdCA9IG9zLnBhdGguam9pbigiL3RtcCIsICJXZWJLaXQiKQorICBpZiBub3Qgb3MucGF0aC5leGlzdHModG1wX1dlYktpdCk6CisgICAgb3MubWtkaXIodG1wX1dlYktpdCkKKworICAjR2V0IHRoZSBwYXRoIHRvIGFuZHJvaWQgdHJlZSByb290IGJhc2VkIG9uIHRoZSBzY3JpcHQgbG9jYXRpb24uCisgICNCYXNpY2FsbHkgd2UgZ28gNSBsZXZlbHMgdXAKKyAgcGFyZW50ID0gb3MucGFyZGlyCisgIHNjcmlwdF9sb2NhdGlvbiA9IG9zLnBhdGguYWJzcGF0aChvcy5wYXRoLmRpcm5hbWUoc3lzLmFyZ3ZbMF0pKQorICBhbmRyb2lkX3RyZWVfcm9vdCA9IG9zLnBhdGguam9pbihzY3JpcHRfbG9jYXRpb24sIHBhcmVudCwgcGFyZW50LCBwYXJlbnQsIHBhcmVudCwgcGFyZW50KQorICBhbmRyb2lkX3RyZWVfcm9vdCA9IG9zLnBhdGgubm9ybXBhdGgoYW5kcm9pZF90cmVlX3Jvb3QpCisKKyAgI1ByZXBhcmUgdGhlIGNvbW1hbmQgdG8gc2V0ICR7QVBBQ0hFX1JVTl9VU0VSfSBhbmQgJHtBUEFDSEVfUlVOX0dST1VQfQorICBlbnZ2YXJzX3BhdGggPSBvcy5wYXRoLmpvaW4oIi9ldGMiLCAiYXBhY2hlMiIsICJlbnZ2YXJzIikKKyAgZXhwb3J0X2VudnZhcnNfY21kID0gInNvdXJjZSAiICsgZW52dmFyc19wYXRoCisKKyAgZXJyb3JfbG9nX3BhdGggPSBvcy5wYXRoLmpvaW4odG1wX1dlYktpdCwgImFwYWNoZTItZXJyb3IubG9nIikKKworICAjUHJlcGFyZSB0aGUgY29tbWFuZCB0byAocmUpc3RhcnQvc3RvcCB0aGUgc2VydmVyIHdpdGggc3BlY2lmaWVkIHNldHRpbmdzCisgIGFwYWNoZTJfcmVzdGFydF9jbWQgPSAiYXBhY2hlMiAtayAiICsgcnVuX2NtZAorICBkaXJlY3RpdmVzICA9ICIgLWMgXCJTZXJ2ZXJSb290ICIgKyBhbmRyb2lkX3RyZWVfcm9vdCArICJcIiIKKyAgZGlyZWN0aXZlcyArPSAiIC1jIFwiRG9jdW1lbnRSb290ICIgKyBvcy5wYXRoLmpvaW4oImV4dGVybmFsIiwgIndlYmtpdCIpICsgIlwiIgorCisgICNUaGlzIGRpcmVjdGl2ZSBpcyBjb21tZW50ZWQgb3V0IGluIGFwYWNoZTItZGViaWFuLWh0dHBkLmNvbmYgZm9yIHNvbWUgcmVhc29uCisgICNIb3dldmVyLCBpdCBpcyB1c2VmdWwgdG8gYnJvd3NlIHRocm91Z2ggdGVzdHMgaW4gdGhlIGJyb3dzZXIsIHNvIGl0J3MgYWRkZWQgaGVyZS4KKyAgI09uZSB0aGluZyB0byBub3RlIGlzIHRoYXQgYmVjYXVzZSBvZiBwcm9ibGVtcyB3aXRoIG1vZF9kaXIgYW5kIHBvcnQgbnVtYmVycywgbW9kX2RpcgorICAjaXMgdHVybmVkIG9mZi4gVGhhdCBtZWFucyB0aGF0IHRoZXJlIF9tdXN0XyBiZSBhIHRyYWlsaW5nIHNsYXNoIGF0IHRoZSBlbmQgb2YgVVJMCisgICNmb3IgYXV0byBpbmRleGVzIHRvIHdvcmsgY29ycmVjdGx5LgorICBkaXJlY3RpdmVzICs9ICIgLWMgXCJMb2FkTW9kdWxlIGF1dG9pbmRleF9tb2R1bGUgL3Vzci9saWIvYXBhY2hlMi9tb2R1bGVzL21vZF9hdXRvaW5kZXguc29cIiIKKworICBkaXJlY3RpdmVzICs9ICIgLWMgXCJFcnJvckxvZyAiICsgZXJyb3JfbG9nX3BhdGggKyJcIiIKKyAgZGlyZWN0aXZlcyArPSAiIC1jIFwiU1NMQ2VydGlmaWNhdGVGaWxlICIgKyBvcy5wYXRoLmpvaW4gKCJleHRlcm5hbCIsICJ3ZWJraXQiLCAiTGF5b3V0VGVzdHMiLAorICAgICJodHRwIiwgImNvbmYiLCAid2Via2l0LWh0dHBkLnBlbSIpICsgIlwiIgorICBkaXJlY3RpdmVzICs9ICIgLWMgXCJVc2VyICR7QVBBQ0hFX1JVTl9VU0VSfVwiIgorICBkaXJlY3RpdmVzICs9ICIgLWMgXCJHcm91cCAke0FQQUNIRV9SVU5fR1JPVVB9XCIiCisgIGRpcmVjdGl2ZXMgKz0gIiAtQyBcIlR5cGVzQ29uZmlnICIgKyBvcy5wYXRoLmpvaW4oIi9ldGMiLCAibWltZS50eXBlcyIpICsgIlwiIgorICBjb25mX2ZpbGVfY21kID0gIiAtZiAiICsgb3MucGF0aC5qb2luKGFuZHJvaWRfdHJlZV9yb290LCAiZXh0ZXJuYWwiLCAid2Via2l0IiwgIkxheW91dFRlc3RzIiwKKyAgICAiaHR0cCIsICJjb25mIiwgImFwYWNoZTItZGViaWFuLWh0dHBkLmNvbmYiKQorCisgICNUcnkgdG8gZXhlY3V0ZSB0aGUgY29tbWFuZHMKKyAgbG9nZ2luZy5pbmZvKCJXaWxsICIgKyBydW5fY21kICsgIiBhcGFjaGUyIHNlcnZlci4iKQorICBjbWQgPSBleHBvcnRfZW52dmFyc19jbWQgKyAiICYmICIgKyBhcGFjaGUyX3Jlc3RhcnRfY21kICsgZGlyZWN0aXZlcyArIGNvbmZfZmlsZV9jbWQKKyAgcCA9IHN1YnByb2Nlc3MuUG9wZW4oY21kLCBzaGVsbD1UcnVlLCBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLCBzdGRlcnI9c3VicHJvY2Vzcy5QSVBFKQorICAob3V0LCBlcnIpID0gcC5jb21tdW5pY2F0ZSgpCisKKyAgI091dHB1dCB0aGUgc3Rkb3V0IGZyb20gdGhlIGNvbW1hbmQgdG8gY29uc29sZQorICBsb2dnaW5nLmluZm8ob3V0KQorCisgICNSZXBvcnQgYW55IGVycm9ycworICBpZiBwLnJldHVybmNvZGUgIT0gMDoKKyAgICBsb2dnaW5nLmluZm8oIiEhIEVSUk9SUzoiKQorCisgICAgaWYgZXJyLmZpbmQoZW52dmFyc19wYXRoKSAhPSAtMToKKyAgICAgIGxvZ2dpbmcuaW5mbyhlcnIpCisgICAgZWxpZiBlcnIuZmluZCgnY29tbWFuZCBub3QgZm91bmQnKSAhPSAtMToKKyAgICAgIGxvZ2dpbmcuaW5mbygiYXBhY2hlMiBpcyBwcm9iYWJseSBub3QgaW5zdGFsbGVkIikKKyAgICBlbHNlOgorICAgICAgbG9nZ2luZy5pbmZvKGVycikKKyAgICAgIGxvZ2dpbmcuaW5mbygiVHJ5IGxvb2tpbmcgaW4gIiArIGVycm9yX2xvZ19wYXRoICsgIiBmb3IgZGV0YWlscyIpCisgIGVsc2U6CisgICAgbG9nZ2luZy5pbmZvKCJPSyIpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgIG1haW4oKTsKZGlmZiAtLWdpdCBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9hc3NldHMvcnVuX2xheW91dF90ZXN0cy5weSBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9hc3NldHMvcnVuX2xheW91dF90ZXN0cy5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iMTNkOGM5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL2Fzc2V0cy9ydW5fbGF5b3V0X3Rlc3RzLnB5CkBAIC0wLDAgKzEsNjUgQEAKKyMhL3Vzci9iaW4vcHl0aG9uCisKKyIiIlJ1biBsYXlvdXQgdGVzdHMgb24gdGhlIGRldmljZS4KKworICBJdCBydW5zIHRoZSBzcGVjaWZpZWQgdGVzdHMgb24gdGhlIGRldmljZSwgZG93bmxvYWRzIHRoZSBzdW1tYXJpZXMgdG8gdGhlIHRlbXBvcmFyeSBkaXJlY3RvcnkKKyAgYW5kIG9wZW5zIGh0bWwgZGV0YWlscyBpbiB0aGUgZGVmYXVsdCBicm93c2VyLgorCisgIFVzYWdlOgorICAgIHJ1bl9sYXlvdXRfdGVzdHMucHkgUEFUSAorIiIiCisKK2ltcG9ydCBzeXMKK2ltcG9ydCBvcworaW1wb3J0IHN1YnByb2Nlc3MKK2ltcG9ydCBsb2dnaW5nCitpbXBvcnQgd2ViYnJvd3NlcgoraW1wb3J0IHRlbXBmaWxlCisKKyNUT0RPOiBUaGVzZSBzaG91bGQgbm90IGJlIGhhcmRjb2RlZAorUkVTVUxUU19BQlNPTFVURV9QQVRIID0gIi9zZGNhcmQvYW5kcm9pZC9MYXlvdXRUZXN0cy1yZXN1bHRzLyIKK0RFVEFJTFNfSFRNTCA9ICJkZXRhaWxzLmh0bWwiCitTVU1NQVJZX1RYVCA9ICJzdW1tYXJ5LnR4dCIKKworZGVmIG1haW4oKToKKyAgaWYgbGVuKHN5cy5hcmd2KSA+IDE6CisgICAgcGF0aCA9IHN5cy5hcmd2WzFdCisgIGVsc2U6CisgICAgcGF0aCA9ICIiCisKKyAgbG9nZ2luZy5iYXNpY0NvbmZpZyhsZXZlbD1sb2dnaW5nLklORk8sIGZvcm1hdD0nJShtZXNzYWdlKXMnKQorCisgIHRtcGRpciA9IHRlbXBmaWxlLmdldHRlbXBkaXIoKQorCisgICMgUnVuIHRoZSB0ZXN0cyBpbiBwYXRoCisgIGNtZCA9ICJhZGIgc2hlbGwgYW0gaW5zdHJ1bWVudCAiCisgIGNtZCArPSAiLWUgY2xhc3MgY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUyLnNjcmlwdHN1cHBvcnQuU3RhcnRlciNzdGFydExheW91dFRlc3RzICIKKyAgY21kICs9ICItZSBwYXRoIFwiIiArIHBhdGggKyAiXCIgIgorICBjbWQgKz0iLXcgY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUyL2NvbS5hbmRyb2lkLmR1bXByZW5kZXJ0cmVlMi5zY3JpcHRzdXBwb3J0LlNjcmlwdFRlc3RSdW5uZXIiCisKKyAgbG9nZ2luZy5pbmZvKCJSdW5uaW5nIHRoZSB0ZXN0cy4uLiIpCisgIHN1YnByb2Nlc3MuUG9wZW4oY21kLCBzaGVsbD1UcnVlLCBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLCBzdGRlcnI9c3VicHJvY2Vzcy5QSVBFKS5jb21tdW5pY2F0ZSgpCisKKyAgbG9nZ2luZy5pbmZvKCJEb3dubG9hZGluZyB0aGUgc3VtbWFyaWVzLi4uIikKKworICAjIERvd25sb2FkIHRoZSB0eHQgc3VtbWFyeSB0byB0bXAgZm9sZGVyCisgIHN1bW1hcnlfdHh0X3RtcF9wYXRoID0gb3MucGF0aC5qb2luKHRtcGRpciwgU1VNTUFSWV9UWFQpCisgIGNtZCA9ICJhZGIgcHVsbCAiICsgUkVTVUxUU19BQlNPTFVURV9QQVRIICsgU1VNTUFSWV9UWFQgKyAiICIgKyBzdW1tYXJ5X3R4dF90bXBfcGF0aAorICBzdWJwcm9jZXNzLlBvcGVuKGNtZCwgc2hlbGw9VHJ1ZSwgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwgc3RkZXJyPXN1YnByb2Nlc3MuUElQRSkuY29tbXVuaWNhdGUoKQorCisgICMgRG93bmxvYWQgdGhlIGh0bWwgc3VtbWFyeSB0byB0bXAgZm9sZGVyCisgIGRldGFpbHNfaHRtbF90bXBfcGF0aCA9IG9zLnBhdGguam9pbih0bXBkaXIsIERFVEFJTFNfSFRNTCkKKyAgY21kID0gImFkYiBwdWxsICIgKyBSRVNVTFRTX0FCU09MVVRFX1BBVEggKyBERVRBSUxTX0hUTUwgKyAiICIgKyBkZXRhaWxzX2h0bWxfdG1wX3BhdGgKKyAgc3VicHJvY2Vzcy5Qb3BlbihjbWQsIHNoZWxsPVRydWUsIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsIHN0ZGVycj1zdWJwcm9jZXNzLlBJUEUpLmNvbW11bmljYXRlKCkKKworICAjIFByaW50IHN1bW1hcnkgdG8gY29uc29sZQorICBsb2dnaW5nLmluZm8oIkFsbCBkb25lLlxuIikKKyAgY21kID0gImNhdCAiICsgc3VtbWFyeV90eHRfdG1wX3BhdGgKKyAgb3Muc3lzdGVtKGNtZCkKKyAgbG9nZ2luZy5pbmZvKCIiKQorCisgICMgT3BlbiB0aGUgYnJvd3NlciB3aXRoIHN1bW1hcnkKKyAgd2ViYnJvd3Nlci5vcGVuKGRldGFpbHNfaHRtbF90bXBfcGF0aCkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgbWFpbigpOwpkaWZmIC0tZ2l0IGEvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3Jlcy9kcmF3YWJsZS9mb2xkZXIucG5nIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3Jlcy9kcmF3YWJsZS9mb2xkZXIucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViM2ZjZWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvcmVzL2RyYXdhYmxlL2ZvbGRlci5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3Jlcy9kcmF3YWJsZS9ydW50ZXN0LnBuZyBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9yZXMvZHJhd2FibGUvcnVudGVzdC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTEwYzY1NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9yZXMvZHJhd2FibGUvcnVudGVzdC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3Jlcy9sYXlvdXQvZGlybGlzdF9yb3cueG1sIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3Jlcy9sYXlvdXQvZGlybGlzdF9yb3cueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1NTc4YTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvcmVzL2xheW91dC9kaXJsaXN0X3Jvdy54bWwKQEAgLTAsMCArMSw0MyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KK0NvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKK0xpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKK2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCitTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCitsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiPgorCisgICAgPEltYWdlVmlldworICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2ljb24iCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSI4MHB4IgorICAgICAgICBhbmRyb2lkOmFkanVzdFZpZXdCb3VuZHM9InRydWUiCisgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjE1cHgiCisgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSIxNXB4IgorICAgICAgICBhbmRyb2lkOnBhZGRpbmdUb3A9IjE1cHgiCisgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0JvdHRvbT0iMTVweCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgLz4KKworICAgIDxUZXh0VmlldworICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2xhYmVsIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOm1pbkhlaWdodD0iNjBweCIKKyAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfdmVydGljYWwiCisgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjE0c3AiCisgICAgLz4KKworPC9MaW5lYXJMYXlvdXQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZmQxZWI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKQEAgLTAsMCArMSwyOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KK0NvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKK0xpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKK2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCitTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCitsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHJlc291cmNlcz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpYWxvZ19ydW5fYWJvcnRfZGlyX3RpdGxlX3ByZWZpeCI+RGlyZWN0b3J5Ojwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGlhbG9nX3J1bl9hYm9ydF9kaXJfbXNnIj5UaGlzIHdpbGwgcnVuIGFsbCB0aGUgdGVzdHMgaW4gdGhpcyBkaXJlY3RvcnkgYW5kIGFsbAorICAgICAgICAgICAgdGhlIHN1YmRpcmVjdG9yaWVzLiBJdCBtYXkgdGFrZSBhIGZldyBob3VycyE8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpYWxvZ19ydW5fYWJvcnRfZGlyX29rX2J1dHRvbiI+UnVuIHRlc3RzITwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGlhbG9nX3J1bl9hYm9ydF9kaXJfYWJvcnRfYnV0dG9uIj5BYm9ydDwvc3RyaW5nPgorCisgICAgPHN0cmluZyBuYW1lPSJkaWFsb2dfcHJvZ3Jlc3NfdGl0bGUiPkxvYWRpbmcgaXRlbXMuPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWFsb2dfcHJvZ3Jlc3NfbXNnIj5QbGVhc2Ugd2FpdC4uLjwvc3RyaW5nPgorCisgICAgPHN0cmluZyBuYW1lPSJydW5uZXJfcHJlbG9hZGluZ190aXRsZSI+UHJlbG9hZGluZyB0ZXN0cy4uLjwvc3RyaW5nPgorPC9yZXNvdXJjZXM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvQWJzdHJhY3RSZXN1bHQuamF2YSBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL0Fic3RyYWN0UmVzdWx0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY4OTMwYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL0Fic3RyYWN0UmVzdWx0LmphdmEKQEAgLTAsMCArMSwxNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmR1bXByZW5kZXJ0cmVlMjsKKworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLndlYmtpdC5XZWJWaWV3OworCisvKioKKyAqIEEgY2xhc3MgdGhhdCByZXByZXNlbnQgYSByZXN1bHQgb2YgdGhlIHRlc3QuIEl0IGlzIHJlc3BvbnNpYmxlIGZvciByZXR1cm5pbmcgdGhlIHJlc3VsdCdzCisgKiByYXcgZGF0YSBhbmQgZ2VuZXJhdGluZyBpdHMgb3duIGRpZmYgaW4gSFRNTCBmb3JtYXQuCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFJlc3VsdCBpbXBsZW1lbnRzIENvbXBhcmFibGU8QWJzdHJhY3RSZXN1bHQ+IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIkFic3RyYWN0UmVzdWx0IjsKKworICAgIHB1YmxpYyBlbnVtIFRlc3RUeXBlIHsKKyAgICAgICAgVEVYVCB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBBYnN0cmFjdFJlc3VsdCBjcmVhdGVSZXN1bHQoQnVuZGxlIGJ1bmRsZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVGV4dFJlc3VsdChidW5kbGUpOworICAgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICBSRU5ERVJfVFJFRSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBBYnN0cmFjdFJlc3VsdCBjcmVhdGVSZXN1bHQoQnVuZGxlIGJ1bmRsZSkgeworICAgICAgICAgICAgICAgIC8qKiBUT0RPOiBSZW5kZXJUcmVlIHRlc3RzIGFyZSBub3QgeWV0IHN1cHBvcnRlZCAqLworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBBYnN0cmFjdFJlc3VsdCBjcmVhdGVSZXN1bHQoQnVuZGxlIGJ1bmRsZSk7CisgICAgfQorCisgICAgcHVibGljIGVudW0gUmVzdWx0Q29kZSB7CisgICAgICAgIFBBU1MoIlBhc3NlZCIpLAorICAgICAgICBGQUlMX1JFU1VMVF9ESUZGRVJTKCJSZXN1bHQgZGlmZmVycyIpLAorICAgICAgICBGQUlMX05PX0VYUEVDVEVEX1JFU1VMVCgiTm8gZXhwZWN0ZWQgcmVzdWx0IiksCisgICAgICAgIEZBSUxfVElNRURfT1VUKCJUaW1lZCBvdXQiKSwKKyAgICAgICAgRkFJTF9DUkFTSEVEKCJDcmFzaGVkIik7CisKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbVRpdGxlOworCisgICAgICAgIHByaXZhdGUgUmVzdWx0Q29kZShTdHJpbmcgdGl0bGUpIHsKKyAgICAgICAgICAgIG1UaXRsZSA9IHRpdGxlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gbVRpdGxlOworICAgICAgICB9CisgICAgfQorCisgICAgU3RyaW5nIG1BZGRpdGlvbmFsVGV4dE91dHB1dFN0cmluZzsKKworICAgIHB1YmxpYyBpbnQgY29tcGFyZVRvKEFic3RyYWN0UmVzdWx0IGFub3RoZXIpIHsKKyAgICAgICAgcmV0dXJuIGdldFJlbGF0aXZlUGF0aCgpLmNvbXBhcmVUbyhhbm90aGVyLmdldFJlbGF0aXZlUGF0aCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRBZGRpdGlvbmFsVGV4dE91dHB1dFN0cmluZyhTdHJpbmcgYWRkaXRpb25hbFRleHRPdXRwdXRTdHJpbmcpIHsKKyAgICAgICAgbUFkZGl0aW9uYWxUZXh0T3V0cHV0U3RyaW5nID0gYWRkaXRpb25hbFRleHRPdXRwdXRTdHJpbmc7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRBZGRpdGlvbmFsVGV4dE91dHB1dFN0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIG1BZGRpdGlvbmFsVGV4dE91dHB1dFN0cmluZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNYWtlcyB0aGUgcmVzdWx0IG9iamVjdCBvYnRhaW4gdGhlIHJlc3VsdHMgb2YgdGhlIHRlc3QgZnJvbSB0aGUgd2VidmlldworICAgICAqIGFuZCBzdG9yZSB0aGVtIGluIHRoZSBmb3JtYXQgdGhhdCBzdWl0cyBpdHNlbGYgYmVzdHMuIFRoaXMgbWV0aG9kIGlzIGFzeW5jaHJvbm91cy4KKyAgICAgKiBUaGUgbWVzc2FnZSBwYXNzZWQgYXMgYSBwYXJhbWV0ZXIgaXMgYSBtZXNzYWdlIHRoYXQgc2hvdWxkIGJlIHNlbnQgdG8gaXRzIHRhcmdldAorICAgICAqIHdoZW4gdGhlIHJlc3VsdCBmaW5pc2hlcyBvYnRhaW5pbmcgdGhlIHJlc3VsdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB3ZWJ2aWV3CisgICAgICogQHBhcmFtIHJlc3VsdE9idGFpbmVkTXNnCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgb2J0YWluQWN0dWFsUmVzdWx0cyhXZWJWaWV3IHdlYnZpZXcsIE1lc3NhZ2UgcmVzdWx0T2J0YWluZWRNc2cpOworCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0RXhwZWN0ZWRJbWFnZVJlc3VsdChieXRlW10gZXhwZWN0ZWRSZXN1bHQpOworCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0RXhwZWN0ZWRUZXh0UmVzdWx0KFN0cmluZyBleHBlY3RlZFJlc3VsdCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHJlc3VsdCdzIGltYWdlIGRhdGEgdGhhdCBjYW4gYmUgd3JpdHRlbiB0byB0aGUgZGlzay4gSXQgY2FuIGJlIG51bGwKKyAgICAgKiBpZiB0aGVyZSBpcyBhbiBlcnJvciBvZiBzb21lIHNvcnQgb3IgZm9yIGV4YW1wbGUgdGhlIHRlc3QgdGltZXMgb3V0LgorICAgICAqCisgICAgICogPHA+IFNvbWUgdGVzdHMgd2lsbCBub3QgcHJvdmlkZSBkYXRhIChsaWtlIHRleHQgdGVzdHMpCisgICAgICoKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgICByZXN1bHRzIGltYWdlIGRhdGEKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgYnl0ZVtdIGdldEFjdHVhbEltYWdlUmVzdWx0KCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHJlc3VsdCdzIHRleHQgZGF0YS4gSXQgY2FuIGJlIG51bGwKKyAgICAgKiBpZiB0aGVyZSBpcyBhbiBlcnJvciBvZiBzb21lIHNvcnQgb3IgZm9yIGV4YW1wbGUgdGhlIHRlc3QgdGltZXMgb3V0LgorICAgICAqCisgICAgICogQHJldHVybgorICAgICAqICAgICAgcmVzdWx0cyB0ZXh0IGRhdGEKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldEFjdHVhbFRleHRSZXN1bHQoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGNvZGUgb2YgdGhpcyByZXN1bHQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgICB0aGUgY29kZSBvZiB0aGlzIHJlc3VsdAorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBSZXN1bHRDb2RlIGdldFJlc3VsdENvZGUoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdHlwZSBvZiB0aGUgcmVzdWx0IGRhdGEuCisgICAgICoKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgICB0aGUgdHlwZSBvZiB0aGUgcmVzdWx0IGRhdGEuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IFRlc3RUeXBlIGdldFR5cGUoKTsKKworICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0UmVsYXRpdmVQYXRoKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgcGllY2Ugb2YgSFRNTCBjb2RlIHRoYXQgcHJlc2VudHMgYSB2aXN1YWwgZGlmZiBiZXR3ZWVuIGEgcmVzdWx0IGFuZAorICAgICAqIHRoZSBleHBlY3RlZCByZXN1bHQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgICBhIHBpZWNlIG9mIEhUTUwgY29kZSB3aXRoIGEgdmlzdWFsIGRpZmYgYmV0d2VlbiB0aGUgcmVzdWx0IGFuZCB0aGUgZXhwZWN0ZWQgcmVzdWx0CisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXREaWZmQXNIdG1sKCk7CisKKyAgICBwdWJsaWMgYWJzdHJhY3QgQnVuZGxlIGdldEJ1bmRsZSgpOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL0FkZGl0aW9uYWxUZXh0T3V0cHV0LmphdmEgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9BZGRpdGlvbmFsVGV4dE91dHB1dC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmY2E2MjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9BZGRpdGlvbmFsVGV4dE91dHB1dC5qYXZhCkBAIC0wLDAgKzEsMTE4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5kdW1wcmVuZGVydHJlZTI7CisKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQud2Via2l0LkNvbnNvbGVNZXNzYWdlOworCitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKKworLyoqCisgKiBBIGNsYXNzIHRoYXQgc3RvcmVzIGNvbnNvbGVzIG1lc3NhZ2VzLCBkYXRhYmFzZSBjYWxsYmFja3MsIGFsZXJ0IG1lc3NhZ2VzLCBldGMuCisgKi8KK3B1YmxpYyBjbGFzcyBBZGRpdGlvbmFsVGV4dE91dHB1dCB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiQWRkaXRpb25hbFRleHRPdXRwdXQiOworCisgICAgLyoqCisgICAgICogT3JkZXJpbmcgb2YgZW51bXMgaXMgaW1wb3J0YW50IGFzIGl0IGRldGVybWluZXMgb3JkZXJpbmcgb2YgdGhlIHRvU3RyaW5nIG1ldGhvZCEKKyAgICAgKiBTdHJpbmdCdWlsZGVycyB3aWxsIGJlIHByaW50ZWQgaW4gdGhlIG9yZGVyIHRoZSBjb3JyZXNwb25kaW5nIHR5cGVzIGFwcGVhciBoZXJlLgorICAgICAqLworICAgIHByaXZhdGUgZW51bSBPdXRwdXRUeXBlIHsKKyAgICAgICAgSlNfRElBTE9HLAorICAgICAgICBFWENFRURFRF9EQl9RVU9UQV9NRVNTQUdFLAorICAgICAgICBDT05TT0xFX01FU1NBR0U7CisgICAgfQorCisgICAgU3RyaW5nQnVpbGRlcltdIG1PdXRwdXRzID0gbmV3IFN0cmluZ0J1aWxkZXJbT3V0cHV0VHlwZS52YWx1ZXMoKS5sZW5ndGhdOworCisgICAgcHJpdmF0ZSBTdHJpbmdCdWlsZGVyIGdldFN0cmluZ0J1aWxkZXJGb3JUeXBlKE91dHB1dFR5cGUgb3V0cHV0VHlwZSkgeworICAgICAgICBpbnQgaW5kZXggPSBvdXRwdXRUeXBlLm9yZGluYWwoKTsKKyAgICAgICAgaWYgKG1PdXRwdXRzW2luZGV4XSA9PSBudWxsKSB7CisgICAgICAgICAgICBtT3V0cHV0c1tpbmRleF0gPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtT3V0cHV0c1tpbmRleF07CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYXBwZW5kRXhjZWVkZWREYlF1b3RhTWVzc2FnZShTdHJpbmcgdXJsU3RyaW5nLCBTdHJpbmcgZGF0YWJhc2VJZGVudGlmaWVyKSB7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgb3V0cHV0ID0gZ2V0U3RyaW5nQnVpbGRlckZvclR5cGUoT3V0cHV0VHlwZS5FWENFRURFRF9EQl9RVU9UQV9NRVNTQUdFKTsKKworICAgICAgICBTdHJpbmcgcHJvdG9jb2wgPSAiIjsKKyAgICAgICAgU3RyaW5nIGhvc3QgPSAiIjsKKyAgICAgICAgaW50IHBvcnQgPSAwOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBVUkwgdXJsID0gbmV3IFVSTCh1cmxTdHJpbmcpOworICAgICAgICAgICAgcHJvdG9jb2wgPSB1cmwuZ2V0UHJvdG9jb2woKTsKKyAgICAgICAgICAgIGhvc3QgPSB1cmwuZ2V0SG9zdCgpOworICAgICAgICAgICAgaWYgKHVybC5nZXRQb3J0KCkgPiAtMSkgeworICAgICAgICAgICAgICAgIHBvcnQgPSB1cmwuZ2V0UG9ydCgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoTE9HX1RBRyArICI6OmFwcGVuZERhdGFiYXNlQ2FsbGJhY2siLCBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgICAgICBvdXRwdXQuYXBwZW5kKCJVSSBERUxFR0FURSBEQVRBQkFTRSBDQUxMQkFDSzogIik7CisgICAgICAgIG91dHB1dC5hcHBlbmQoImV4Y2VlZGVkRGF0YWJhc2VRdW90YUZvclNlY3VyaXR5T3JpZ2luOnsiKTsKKyAgICAgICAgb3V0cHV0LmFwcGVuZChwcm90b2NvbCArICIsICIgKyBob3N0ICsgIiwgIiArIHBvcnQgKyAifSAiKTsKKyAgICAgICAgb3V0cHV0LmFwcGVuZCgiZGF0YWJhc2U6IiArIGRhdGFiYXNlSWRlbnRpZmllciArICJcbiIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFwcGVuZENvbnNvbGVNZXNzYWdlKENvbnNvbGVNZXNzYWdlIGNvbnNvbGVNZXNzYWdlKSB7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgb3V0cHV0ID0gZ2V0U3RyaW5nQnVpbGRlckZvclR5cGUoT3V0cHV0VHlwZS5DT05TT0xFX01FU1NBR0UpOworCisgICAgICAgIG91dHB1dC5hcHBlbmQoIkNPTlNPTEUgTUVTU0FHRTogbGluZSAiICsgY29uc29sZU1lc3NhZ2UubGluZU51bWJlcigpKTsKKyAgICAgICAgb3V0cHV0LmFwcGVuZCgiOiAiICsgY29uc29sZU1lc3NhZ2UubWVzc2FnZSgpICsgIlxuIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYXBwZW5kSnNBbGVydChTdHJpbmcgbWVzc2FnZSkgeworICAgICAgICBTdHJpbmdCdWlsZGVyIG91dHB1dCA9IGdldFN0cmluZ0J1aWxkZXJGb3JUeXBlKE91dHB1dFR5cGUuSlNfRElBTE9HKTsKKworICAgICAgICBvdXRwdXQuYXBwZW5kKCJBTEVSVDogIik7CisgICAgICAgIG91dHB1dC5hcHBlbmQobWVzc2FnZSk7CisgICAgICAgIG91dHB1dC5hcHBlbmQoJ1xuJyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYXBwZW5kSnNDb25maXJtKFN0cmluZyBtZXNzYWdlKSB7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgb3V0cHV0ID0gZ2V0U3RyaW5nQnVpbGRlckZvclR5cGUoT3V0cHV0VHlwZS5KU19ESUFMT0cpOworCisgICAgICAgIG91dHB1dC5hcHBlbmQoIkNPTkZJUk06ICIpOworICAgICAgICBvdXRwdXQuYXBwZW5kKG1lc3NhZ2UpOworICAgICAgICBvdXRwdXQuYXBwZW5kKCdcbicpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFwcGVuZEpzUHJvbXB0KFN0cmluZyBtZXNzYWdlLCBTdHJpbmcgZGVmYXVsdFZhbHVlKSB7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgb3V0cHV0ID0gZ2V0U3RyaW5nQnVpbGRlckZvclR5cGUoT3V0cHV0VHlwZS5KU19ESUFMT0cpOworCisgICAgICAgIG91dHB1dC5hcHBlbmQoIlBST01QVDogIik7CisgICAgICAgIG91dHB1dC5hcHBlbmQobWVzc2FnZSk7CisgICAgICAgIG91dHB1dC5hcHBlbmQoIiwgZGVmYXVsdCB0ZXh0OiAiKTsKKyAgICAgICAgb3V0cHV0LmFwcGVuZChkZWZhdWx0VmFsdWUpOworICAgICAgICBvdXRwdXQuYXBwZW5kKCdcbicpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtT3V0cHV0cy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKG1PdXRwdXRzW2ldICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKG1PdXRwdXRzW2ldLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvQ3Jhc2hlZER1bW15UmVzdWx0LmphdmEgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9DcmFzaGVkRHVtbXlSZXN1bHQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzkzZGFiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvQ3Jhc2hlZER1bW15UmVzdWx0LmphdmEKQEAgLTAsMCArMSw4NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUyOworCitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOworaW1wb3J0IGFuZHJvaWQud2Via2l0LldlYlZpZXc7CisKKy8qKgorICogQSBkdW1teSBjbGFzcyByZXByZXNlbnRpbmcgdGVzdCB0aGF0IGNyYXNoZWQuCisgKi8KK3B1YmxpYyBjbGFzcyBDcmFzaGVkRHVtbXlSZXN1bHQgZXh0ZW5kcyBBYnN0cmFjdFJlc3VsdCB7CisgICAgU3RyaW5nIG1SZWxhdGl2ZVBhdGg7CisKKyAgICBwdWJsaWMgQ3Jhc2hlZER1bW15UmVzdWx0KFN0cmluZyByZWxhdGl2ZVBhdGgpIHsKKyAgICAgICAgbVJlbGF0aXZlUGF0aCA9IHJlbGF0aXZlUGF0aDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYnl0ZVtdIGdldEFjdHVhbEltYWdlUmVzdWx0KCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldEFjdHVhbFRleHRSZXN1bHQoKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBCdW5kbGUgZ2V0QnVuZGxlKCkgeworICAgICAgICAvKiogVE9ETzogICovCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGlmZkFzSHRtbCgpIHsKKyAgICAgICAgLyoqIFRPRE86IFByb2JhYmx5IHNob3cgYXQgbGVhc3QgZXhwZWN0ZWQgcmVzdWx0cyAqLworICAgICAgICByZXR1cm4gIk9vb3BzLCBJIGNyYXNoZWQuLi4iOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVsYXRpdmVQYXRoKCkgeworICAgICAgICByZXR1cm4gbVJlbGF0aXZlUGF0aDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzdWx0Q29kZSBnZXRSZXN1bHRDb2RlKCkgeworICAgICAgICByZXR1cm4gUmVzdWx0Q29kZS5GQUlMX0NSQVNIRUQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFRlc3RUeXBlIGdldFR5cGUoKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9idGFpbkFjdHVhbFJlc3VsdHMoV2ViVmlldyB3ZWJ2aWV3LCBNZXNzYWdlIHJlc3VsdE9idGFpbmVkTXNnKSB7CisgICAgICAgIC8qKiBUaGlzIG1ldGhvZCBpcyBub3QgYXBwbGljYWJsZSBmb3IgdGhpcyB0eXBlIG9mIHJlc3VsdCAqLworICAgICAgICBhc3NlcnQgZmFsc2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0RXhwZWN0ZWRJbWFnZVJlc3VsdChieXRlW10gZXhwZWN0ZWRSZXN1bHQpIHsKKyAgICAgICAgLyoqIFRPRE8gKi8KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRFeHBlY3RlZFRleHRSZXN1bHQoU3RyaW5nIGV4cGVjdGVkUmVzdWx0KSB7CisgICAgICAgIC8qKiBUT0RPICovCisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL0V2ZW50U2VuZGVyLmphdmEgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9FdmVudFNlbmRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViN2NiYzQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9FdmVudFNlbmRlci5qYXZhCkBAIC0wLDAgKzEsMTEwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5kdW1wcmVuZGVydHJlZTI7CisKK2ltcG9ydCBhbmRyb2lkLndlYmtpdC5XZWJWaWV3OworCisvKioKKyAqIEEgY2xhc3MgdGhhdCBhY3RzIGFzIGEgSlMgaW50ZXJmYWNlIGZvciB3ZWJ2aWV3IHRvIG1vY2sgdmFyaW91cyB0b3VjaCBldmVudHMsCisgKiBtb3VzZSBhY3Rpb25zIGFuZCBrZXkgcHJlc3Nlcy4KKyAqCisgKiBUaGUgbWV0aG9kcyBoZXJlIGp1c3QgY2FsbCBjb3JyZXNwb25kaW5nIG1ldGhvZHMgb24gRXZlbnRTZW5kZXJJbXBsCisgKiB0aGF0IGNvbnRhaW5zIHRoZSBsb2dpYyBvZiBob3cgdG8gZXhlY3V0ZSB0aGUgbWV0aG9kcy4KKyAqLworcHVibGljIGNsYXNzIEV2ZW50U2VuZGVyIHsKKyAgICBFdmVudFNlbmRlckltcGwgbUV2ZW50U2VuZGVySW1wbCA9IG5ldyBFdmVudFNlbmRlckltcGwoKTsKKworICAgIHB1YmxpYyB2b2lkIHJlc2V0KFdlYlZpZXcgd2ViVmlldykgeworICAgICAgICBtRXZlbnRTZW5kZXJJbXBsLnJlc2V0KHdlYlZpZXcpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGVuYWJsZURPTVVJRXZlbnRMb2dnaW5nKGludCBkb21Ob2RlKSB7CisgICAgICAgIG1FdmVudFNlbmRlckltcGwuZW5hYmxlRE9NVUlFdmVudExvZ2dpbmcoZG9tTm9kZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZmlyZUtleWJvYXJkRXZlbnRzVG9FbGVtZW50KGludCBkb21Ob2RlKSB7CisgICAgICAgIG1FdmVudFNlbmRlckltcGwuZmlyZUtleWJvYXJkRXZlbnRzVG9FbGVtZW50KGRvbU5vZGUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGtleURvd24oU3RyaW5nIGNoYXJhY3RlciwgU3RyaW5nW10gd2l0aE1vZGlmaWVycykgeworICAgICAgICBtRXZlbnRTZW5kZXJJbXBsLmtleURvd24oY2hhcmFjdGVyLCB3aXRoTW9kaWZpZXJzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBrZXlEb3duKFN0cmluZyBjaGFyYWN0ZXIpIHsKKyAgICAgICAga2V5RG93bihjaGFyYWN0ZXIsIG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGxlYXBGb3J3YXJkKGludCBtaWxsaXNlY29uZHMpIHsKKyAgICAgICAgbUV2ZW50U2VuZGVySW1wbC5sZWFwRm9yd2FyZChtaWxsaXNlY29uZHMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG1vdXNlQ2xpY2soKSB7CisgICAgICAgIG1FdmVudFNlbmRlckltcGwubW91c2VDbGljaygpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG1vdXNlRG93bigpIHsKKyAgICAgICAgbUV2ZW50U2VuZGVySW1wbC5tb3VzZURvd24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBtb3VzZU1vdmVUbyhpbnQgeCwgaW50IHkpIHsKKyAgICAgICAgbUV2ZW50U2VuZGVySW1wbC5tb3VzZU1vdmVUbyh4LCB5KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBtb3VzZVVwKCkgeworICAgICAgICBtRXZlbnRTZW5kZXJJbXBsLm1vdXNlVXAoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0b3VjaFN0YXJ0KCkgeworICAgICAgICBtRXZlbnRTZW5kZXJJbXBsLnRvdWNoU3RhcnQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRUb3VjaFBvaW50KGludCB4LCBpbnQgeSkgeworICAgICAgICBtRXZlbnRTZW5kZXJJbXBsLmFkZFRvdWNoUG9pbnQoeCwgeSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdXBkYXRlVG91Y2hQb2ludChpbnQgaWQsIGludCB4LCBpbnQgeSkgeworICAgICAgICBtRXZlbnRTZW5kZXJJbXBsLnVwZGF0ZVRvdWNoUG9pbnQoaWQsIHgsIHkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFRvdWNoTW9kaWZpZXIoU3RyaW5nIG1vZGlmaWVyLCBib29sZWFuIGVuYWJsZWQpIHsKKyAgICAgICAgbUV2ZW50U2VuZGVySW1wbC5zZXRUb3VjaE1vZGlmaWVyKG1vZGlmaWVyLCBlbmFibGVkKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0b3VjaE1vdmUoKSB7CisgICAgICAgIG1FdmVudFNlbmRlckltcGwudG91Y2hNb3ZlKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVsZWFzZVRvdWNoUG9pbnQoaW50IGlkKSB7CisgICAgICAgIG1FdmVudFNlbmRlckltcGwucmVsZWFzZVRvdWNoUG9pbnQoaWQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRvdWNoRW5kKCkgeworICAgICAgICBtRXZlbnRTZW5kZXJJbXBsLnRvdWNoRW5kKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdG91Y2hDYW5jZWwoKSB7CisgICAgICAgIG1FdmVudFNlbmRlckltcGwudG91Y2hDYW5jZWwoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjbGVhclRvdWNoUG9pbnRzKCkgeworICAgICAgICBtRXZlbnRTZW5kZXJJbXBsLmNsZWFyVG91Y2hQb2ludHMoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjYW5jZWxUb3VjaFBvaW50KGludCBpZCkgeworICAgICAgICBtRXZlbnRTZW5kZXJJbXBsLmNhbmNlbFRvdWNoUG9pbnQoaWQpOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9FdmVudFNlbmRlckltcGwuamF2YSBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL0V2ZW50U2VuZGVySW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzZTYxMzcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9FdmVudFNlbmRlckltcGwuamF2YQpAQCAtMCwwICsxLDU2MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUyOworCitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OworaW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudDsKK2ltcG9ydCBhbmRyb2lkLndlYmtpdC5XZWJWaWV3OworCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgRXZlbnRTZW5kZXIKKyAqLworcHVibGljIGNsYXNzIEV2ZW50U2VuZGVySW1wbCB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiRXZlbnRTZW5kZXJJbXBsIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfRU5BQkxFX0RPTV9VSV9FVkVOVF9MT0dHSU5HID0gMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0ZJUkVfS0VZQk9BUkRfRVZFTlRTX1RPX0VMRU1FTlQgPSAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfTEVBUF9GT1JXQVJEID0gMjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfS0VZX0RPV04gPSAzOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19NT1VTRV9ET1dOID0gNDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX01PVVNFX1VQID0gNTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX01PVVNFX0NMSUNLID0gNjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX01PVVNFX01PVkVfVE8gPSA3OworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19BRERfVE9VQ0hfUE9JTlQgPSA4OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfVE9VQ0hfU1RBUlQgPSA5OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfVVBEQVRFX1RPVUNIX1BPSU5UID0gMTA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19UT1VDSF9NT1ZFID0gMTE7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19DTEVBUl9UT1VDSF9QT0lOVFMgPSAxMjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1RPVUNIX0NBTkNFTCA9IDEzOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfUkVMRUFTRV9UT1VDSF9QT0lOVCA9IDE0OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfVE9VQ0hfRU5EID0gMTU7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19TRVRfVE9VQ0hfTU9ESUZJRVIgPSAxNjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0NBTkNFTF9UT1VDSF9QT0lOVCA9IDE3OworCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUb3VjaFBvaW50IHsKKyAgICAgICAgV2ViVmlldyBtV2ViVmlldzsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbVg7CisgICAgICAgIHByaXZhdGUgaW50IG1ZOworICAgICAgICBwcml2YXRlIGxvbmcgbURvd25UaW1lOworICAgICAgICBwcml2YXRlIGJvb2xlYW4gbVJlbGVhc2VkID0gZmFsc2U7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtTW92ZWQgPSBmYWxzZTsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1DYW5jZWxsZWQgPSBmYWxzZTsKKworICAgICAgICBwdWJsaWMgVG91Y2hQb2ludChXZWJWaWV3IHdlYlZpZXcsIGludCB4LCBpbnQgeSkgeworICAgICAgICAgICAgbVdlYlZpZXcgPSB3ZWJWaWV3OworICAgICAgICAgICAgbVggPSBzY2FsZVgoeCk7CisgICAgICAgICAgICBtWSA9IHNjYWxlWSh5KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0WCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtWDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0WSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtWTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc01vdmVkKCkgeworICAgICAgICAgICAgcmV0dXJuIG1Nb3ZlZDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG1vdmUoaW50IG5ld1gsIGludCBuZXdZKSB7CisgICAgICAgICAgICBtWCA9IHNjYWxlWChuZXdYKTsKKyAgICAgICAgICAgIG1ZID0gc2NhbGVZKG5ld1kpOworICAgICAgICAgICAgbU1vdmVkID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHJlc2V0SGFzTW92ZWQoKSB7CisgICAgICAgICAgICBtTW92ZWQgPSBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBsb25nIGdldERvd25UaW1lKCkgeworICAgICAgICAgICAgcmV0dXJuIG1Eb3duVGltZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldERvd25UaW1lKGxvbmcgZG93blRpbWUpIHsKKyAgICAgICAgICAgIG1Eb3duVGltZSA9IGRvd25UaW1lOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNSZWxlYXNlZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtUmVsZWFzZWQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCByZWxlYXNlKCkgeworICAgICAgICAgICAgbVJlbGVhc2VkID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzQ2FuY2VsbGVkKCkgeworICAgICAgICAgICAgcmV0dXJuIG1DYW5jZWxsZWQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBjYW5jZWwoKSB7CisgICAgICAgICAgICBtQ2FuY2VsbGVkID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgaW50IHNjYWxlWChpbnQgeCkgeworICAgICAgICAgICAgcmV0dXJuIChpbnQpKHggKiBtV2ViVmlldy5nZXRTY2FsZSgpKSAtIG1XZWJWaWV3LmdldFNjcm9sbFgoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgaW50IHNjYWxlWShpbnQgeSkgeworICAgICAgICAgICAgcmV0dXJuIChpbnQpKHkgKiBtV2ViVmlldy5nZXRTY2FsZSgpKSAtIG1XZWJWaWV3LmdldFNjcm9sbFkoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgTGlzdDxUb3VjaFBvaW50PiBtVG91Y2hQb2ludHM7CisgICAgcHJpdmF0ZSBpbnQgbVRvdWNoTWV0YVN0YXRlOworICAgIHByaXZhdGUgaW50IG1Nb3VzZVg7CisgICAgcHJpdmF0ZSBpbnQgbU1vdXNlWTsKKworICAgIHByaXZhdGUgV2ViVmlldyBtV2ViVmlldzsKKworICAgIHByaXZhdGUgSGFuZGxlciBtRXZlbnRTZW5kZXJIYW5kbGVyID0gbmV3IEhhbmRsZXIoKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7CisgICAgICAgICAgICBUb3VjaFBvaW50IHRvdWNoUG9pbnQ7CisgICAgICAgICAgICBCdW5kbGUgYnVuZGxlOworICAgICAgICAgICAgS2V5RXZlbnQgZXZlbnQ7CisKKyAgICAgICAgICAgIHN3aXRjaCAobXNnLndoYXQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19FTkFCTEVfRE9NX1VJX0VWRU5UX0xPR0dJTkc6CisgICAgICAgICAgICAgICAgICAgIC8qKiBUT0RPOiBpbXBsZW1lbnQgKi8KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19GSVJFX0tFWUJPQVJEX0VWRU5UU19UT19FTEVNRU5UOgorICAgICAgICAgICAgICAgICAgICAvKiogVE9ETzogaW1wbGVtZW50ICovCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBNU0dfTEVBUF9GT1JXQVJEOgorICAgICAgICAgICAgICAgICAgICAvKiogVE9ETzogaW1wbGVtZW50ICovCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBNU0dfS0VZX0RPV046CisgICAgICAgICAgICAgICAgICAgIGJ1bmRsZSA9IChCdW5kbGUpbXNnLm9iajsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNoYXJhY3RlciA9IGJ1bmRsZS5nZXRTdHJpbmcoImNoYXJhY3RlciIpOworICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSB3aXRoTW9kaWZpZXJzID0gYnVuZGxlLmdldFN0cmluZ0FycmF5KCJ3aXRoTW9kaWZpZXJzIik7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHdpdGhNb2RpZmllcnMgIT0gbnVsbCAmJiB3aXRoTW9kaWZpZXJzLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgd2l0aE1vZGlmaWVycy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVLZXlFdmVudChLZXlFdmVudC5BQ1RJT05fRE9XTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVyVG9LZXlDb2RlKHdpdGhNb2RpZmllcnNbaV0pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBleGVjdXRlS2V5RXZlbnQoS2V5RXZlbnQuQUNUSU9OX0RPV04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhclRvS2V5Q29kZShjaGFyYWN0ZXIudG9Mb3dlckNhc2UoKS50b0NoYXJBcnJheSgpWzBdKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgLyoqIE1PVVNFICovCisKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19NT1VTRV9ET1dOOgorICAgICAgICAgICAgICAgICAgICAvKiogVE9ETzogSW1wbGVtZW50ICovCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBNU0dfTU9VU0VfVVA6CisgICAgICAgICAgICAgICAgICAgIC8qKiBUT0RPOiBJbXBsZW1lbnQgKi8KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19NT1VTRV9DTElDSzoKKyAgICAgICAgICAgICAgICAgICAgLyoqIFRPRE86IEltcGxlbWVudCAqLworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgTVNHX01PVVNFX01PVkVfVE86CisgICAgICAgICAgICAgICAgICAgIGludCB4ID0gbXNnLmFyZzE7CisgICAgICAgICAgICAgICAgICAgIGludCB5ID0gbXNnLmFyZzI7CisKKyAgICAgICAgICAgICAgICAgICAgZXZlbnQgPSBudWxsOworICAgICAgICAgICAgICAgICAgICBpZiAoeCA+IG1Nb3VzZVgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50ID0gbmV3IEtleUV2ZW50KEtleUV2ZW50LkFDVElPTl9ET1dOLCBLZXlFdmVudC5LRVlDT0RFX0RQQURfUklHSFQpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHggPCBtTW91c2VYKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBldmVudCA9IG5ldyBLZXlFdmVudChLZXlFdmVudC5BQ1RJT05fRE9XTiwgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0xFRlQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChldmVudCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtV2ViVmlldy5vbktleURvd24oZXZlbnQuZ2V0S2V5Q29kZSgpLCBldmVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtV2ViVmlldy5vbktleVVwKGV2ZW50LmdldEtleUNvZGUoKSwgZXZlbnQpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZXZlbnQgPSBudWxsOworICAgICAgICAgICAgICAgICAgICBpZiAoeSA+IG1Nb3VzZVkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50ID0gbmV3IEtleUV2ZW50KEtleUV2ZW50LkFDVElPTl9ET1dOLCBLZXlFdmVudC5LRVlDT0RFX0RQQURfRE9XTik7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoeSA8IG1Nb3VzZVkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50ID0gbmV3IEtleUV2ZW50KEtleUV2ZW50LkFDVElPTl9ET1dOLCBLZXlFdmVudC5LRVlDT0RFX0RQQURfVVApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChldmVudCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtV2ViVmlldy5vbktleURvd24oZXZlbnQuZ2V0S2V5Q29kZSgpLCBldmVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtV2ViVmlldy5vbktleVVwKGV2ZW50LmdldEtleUNvZGUoKSwgZXZlbnQpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgbU1vdXNlWCA9IHg7CisgICAgICAgICAgICAgICAgICAgIG1Nb3VzZVkgPSB5OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIC8qKiBUT1VDSCAqLworCisgICAgICAgICAgICAgICAgY2FzZSBNU0dfQUREX1RPVUNIX1BPSU5UOgorICAgICAgICAgICAgICAgICAgICBnZXRUb3VjaFBvaW50cygpLmFkZChuZXcgVG91Y2hQb2ludChtV2ViVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2cuYXJnMSwgbXNnLmFyZzIpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGdldFRvdWNoUG9pbnRzKCkuc2l6ZSgpID4gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoTE9HX1RBRyArICI6Ok1TR19BRERfVE9VQ0hfUE9JTlQiLCAiQWRkZWQgbW9yZSB0aGFuIG9uZSB0b3VjaCBwb2ludCIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBNU0dfVE9VQ0hfU1RBUlQ6CisgICAgICAgICAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICAgICAgICAgKiBGSVhNRTogQXQgdGhlIG1vbWVudCB3ZSBkb24ndCBzdXBwb3J0IG11bHRpLXRvdWNoLiBIZW5jZSwgd2Ugb25seSBleGFtaW5lCisgICAgICAgICAgICAgICAgICAgICAqIHRoZSBmaXJzdCB0b3VjaCBwb2ludC4gSW4gZnV0dXJlIHRoaXMgbWV0aG9kIHdpbGwgbmVlZCByZXdyaXRpbmcuCisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0VG91Y2hQb2ludHMoKS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB0b3VjaFBvaW50ID0gZ2V0VG91Y2hQb2ludHMoKS5nZXQoMCk7CisKKyAgICAgICAgICAgICAgICAgICAgdG91Y2hQb2ludC5zZXREb3duVGltZShTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKSk7CisgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVUb3VjaEV2ZW50KHRvdWNoUG9pbnQsIE1vdGlvbkV2ZW50LkFDVElPTl9ET1dOKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19VUERBVEVfVE9VQ0hfUE9JTlQ6CisgICAgICAgICAgICAgICAgICAgIGJ1bmRsZSA9IChCdW5kbGUpbXNnLm9iajsKKworICAgICAgICAgICAgICAgICAgICBpbnQgaWQgPSBidW5kbGUuZ2V0SW50KCJpZCIpOworICAgICAgICAgICAgICAgICAgICBpZiAoaWQgPj0gZ2V0VG91Y2hQb2ludHMoKS5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KExPR19UQUcgKyAiOjpNU0dfVVBEQVRFX1RPVUNIX1BPSU5UIiwgIlRvdWNoUG9pbnQgb3V0IG9mIGJvdW5kczogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGlkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZ2V0VG91Y2hQb2ludHMoKS5nZXQoaWQpLm1vdmUoYnVuZGxlLmdldEludCgieCIpLCBidW5kbGUuZ2V0SW50KCJ5IikpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgTVNHX1RPVUNIX01PVkU6CisgICAgICAgICAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICAgICAgICAgKiBGSVhNRTogQXQgdGhlIG1vbWVudCB3ZSBkb24ndCBzdXBwb3J0IG11bHRpLXRvdWNoLiBIZW5jZSwgd2Ugb25seSBleGFtaW5lCisgICAgICAgICAgICAgICAgICAgICAqIHRoZSBmaXJzdCB0b3VjaCBwb2ludC4gSW4gZnV0dXJlIHRoaXMgbWV0aG9kIHdpbGwgbmVlZCByZXdyaXRpbmcuCisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0VG91Y2hQb2ludHMoKS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB0b3VjaFBvaW50ID0gZ2V0VG91Y2hQb2ludHMoKS5nZXQoMCk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCF0b3VjaFBvaW50Lmhhc01vdmVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBleGVjdXRlVG91Y2hFdmVudCh0b3VjaFBvaW50LCBNb3Rpb25FdmVudC5BQ1RJT05fTU9WRSk7CisgICAgICAgICAgICAgICAgICAgIHRvdWNoUG9pbnQucmVzZXRIYXNNb3ZlZCgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgTVNHX0NBTkNFTF9UT1VDSF9QT0lOVDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1zZy5hcmcxID49IGdldFRvdWNoUG9pbnRzKCkuc2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhMT0dfVEFHICsgIjo6TVNHX1JFTEVBU0VfVE9VQ0hfUE9JTlQiLCAiVG91Y2hQb2ludCBvdXQgb2YgYm91bmRzOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbXNnLmFyZzEpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBnZXRUb3VjaFBvaW50cygpLmdldChtc2cuYXJnMSkuY2FuY2VsKCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBNU0dfVE9VQ0hfQ0FOQ0VMOgorICAgICAgICAgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAgICAgICAgICogRklYTUU6IEF0IHRoZSBtb21lbnQgd2UgZG9uJ3Qgc3VwcG9ydCBtdWx0aS10b3VjaC4gSGVuY2UsIHdlIG9ubHkgZXhhbWluZQorICAgICAgICAgICAgICAgICAgICAgKiB0aGUgZmlyc3QgdG91Y2ggcG9pbnQuIEluIGZ1dHVyZSB0aGlzIG1ldGhvZCB3aWxsIG5lZWQgcmV3cml0aW5nLgorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKGdldFRvdWNoUG9pbnRzKCkuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdG91Y2hQb2ludCA9IGdldFRvdWNoUG9pbnRzKCkuZ2V0KDApOworCisgICAgICAgICAgICAgICAgICAgIGlmICh0b3VjaFBvaW50LmlzQ2FuY2VsbGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVUb3VjaEV2ZW50KHRvdWNoUG9pbnQsIE1vdGlvbkV2ZW50LkFDVElPTl9DQU5DRUwpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBNU0dfUkVMRUFTRV9UT1VDSF9QT0lOVDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1zZy5hcmcxID49IGdldFRvdWNoUG9pbnRzKCkuc2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhMT0dfVEFHICsgIjo6TVNHX1JFTEVBU0VfVE9VQ0hfUE9JTlQiLCAiVG91Y2hQb2ludCBvdXQgb2YgYm91bmRzOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbXNnLmFyZzEpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBnZXRUb3VjaFBvaW50cygpLmdldChtc2cuYXJnMSkucmVsZWFzZSgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgTVNHX1RPVUNIX0VORDoKKyAgICAgICAgICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgICAgICAgICAqIEZJWE1FOiBBdCB0aGUgbW9tZW50IHdlIGRvbid0IHN1cHBvcnQgbXVsdGktdG91Y2guIEhlbmNlLCB3ZSBvbmx5IGV4YW1pbmUKKyAgICAgICAgICAgICAgICAgICAgICogdGhlIGZpcnN0IHRvdWNoIHBvaW50LiBJbiBmdXR1cmUgdGhpcyBtZXRob2Qgd2lsbCBuZWVkIHJld3JpdGluZy4KKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIGlmIChnZXRUb3VjaFBvaW50cygpLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHRvdWNoUG9pbnQgPSBnZXRUb3VjaFBvaW50cygpLmdldCgwKTsKKworICAgICAgICAgICAgICAgICAgICBleGVjdXRlVG91Y2hFdmVudCh0b3VjaFBvaW50LCBNb3Rpb25FdmVudC5BQ1RJT05fVVApOworICAgICAgICAgICAgICAgICAgICBpZiAodG91Y2hQb2ludC5pc1JlbGVhc2VkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldFRvdWNoUG9pbnRzKCkucmVtb3ZlKDApOworICAgICAgICAgICAgICAgICAgICAgICAgdG91Y2hQb2ludCA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19TRVRfVE9VQ0hfTU9ESUZJRVI6CisgICAgICAgICAgICAgICAgICAgIGJ1bmRsZSA9IChCdW5kbGUpbXNnLm9iajsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1vZGlmaWVyID0gYnVuZGxlLmdldFN0cmluZygibW9kaWZpZXIiKTsKKyAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBlbmFibGVkID0gYnVuZGxlLmdldEJvb2xlYW4oImVuYWJsZWQiKTsKKworICAgICAgICAgICAgICAgICAgICBpbnQgbWFzayA9IDA7CisgICAgICAgICAgICAgICAgICAgIGlmICgiYWx0Ii5lcXVhbHMobW9kaWZpZXIudG9Mb3dlckNhc2UoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1hc2sgPSBLZXlFdmVudC5NRVRBX0FMVF9PTjsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgic2hpZnQiLmVxdWFscyhtb2RpZmllci50b0xvd2VyQ2FzZSgpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbWFzayA9IEtleUV2ZW50Lk1FVEFfU0hJRlRfT047CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoImN0cmwiLmVxdWFscyhtb2RpZmllci50b0xvd2VyQ2FzZSgpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbWFzayA9IEtleUV2ZW50Lk1FVEFfU1lNX09OOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVuYWJsZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Ub3VjaE1ldGFTdGF0ZSB8PSBtYXNrOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbVRvdWNoTWV0YVN0YXRlICY9IH5tYXNrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19DTEVBUl9UT1VDSF9QT0lOVFM6CisgICAgICAgICAgICAgICAgICAgIGdldFRvdWNoUG9pbnRzKCkuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH07CisKKyAgICBwdWJsaWMgdm9pZCByZXNldChXZWJWaWV3IHdlYlZpZXcpIHsKKyAgICAgICAgbVdlYlZpZXcgPSB3ZWJWaWV3OworICAgICAgICBtVG91Y2hQb2ludHMgPSBudWxsOworICAgICAgICBtVG91Y2hNZXRhU3RhdGUgPSAwOworICAgICAgICBtTW91c2VYID0gMDsKKyAgICAgICAgbU1vdXNlWSA9IDA7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZW5hYmxlRE9NVUlFdmVudExvZ2dpbmcoaW50IGRvbU5vZGUpIHsKKyAgICAgICAgTWVzc2FnZSBtc2cgPSBtRXZlbnRTZW5kZXJIYW5kbGVyLm9idGFpbk1lc3NhZ2UoTVNHX0VOQUJMRV9ET01fVUlfRVZFTlRfTE9HR0lORyk7CisgICAgICAgIG1zZy5hcmcxID0gZG9tTm9kZTsKKyAgICAgICAgbXNnLnNlbmRUb1RhcmdldCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGZpcmVLZXlib2FyZEV2ZW50c1RvRWxlbWVudChpbnQgZG9tTm9kZSkgeworICAgICAgICBNZXNzYWdlIG1zZyA9IG1FdmVudFNlbmRlckhhbmRsZXIub2J0YWluTWVzc2FnZShNU0dfRklSRV9LRVlCT0FSRF9FVkVOVFNfVE9fRUxFTUVOVCk7CisgICAgICAgIG1zZy5hcmcxID0gZG9tTm9kZTsKKyAgICAgICAgbXNnLnNlbmRUb1RhcmdldCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGxlYXBGb3J3YXJkKGludCBtaWxsaXNlY29uZHMpIHsKKyAgICAgICAgTWVzc2FnZSBtc2cgPSBtRXZlbnRTZW5kZXJIYW5kbGVyLm9idGFpbk1lc3NhZ2UoTVNHX0xFQVBfRk9SV0FSRCk7CisgICAgICAgIG1zZy5hcmcxID0gbWlsbGlzZWNvbmRzOworICAgICAgICBtc2cuc2VuZFRvVGFyZ2V0KCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQga2V5RG93bihTdHJpbmcgY2hhcmFjdGVyLCBTdHJpbmdbXSB3aXRoTW9kaWZpZXJzKSB7CisgICAgICAgIEJ1bmRsZSBidW5kbGUgPSBuZXcgQnVuZGxlKCk7CisgICAgICAgIGJ1bmRsZS5wdXRTdHJpbmcoImNoYXJhY3RlciIsIGNoYXJhY3Rlcik7CisgICAgICAgIGJ1bmRsZS5wdXRTdHJpbmdBcnJheSgid2l0aE1vZGlmaWVycyIsIHdpdGhNb2RpZmllcnMpOworICAgICAgICBtRXZlbnRTZW5kZXJIYW5kbGVyLm9idGFpbk1lc3NhZ2UoTVNHX0tFWV9ET1dOLCBidW5kbGUpLnNlbmRUb1RhcmdldCgpOworICAgIH0KKworICAgIC8qKiBNT1VTRSAqLworCisgICAgcHVibGljIHZvaWQgbW91c2VEb3duKCkgeworICAgICAgICBtRXZlbnRTZW5kZXJIYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2UoTVNHX01PVVNFX0RPV04pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG1vdXNlVXAoKSB7CisgICAgICAgIG1FdmVudFNlbmRlckhhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZShNU0dfTU9VU0VfVVApOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG1vdXNlQ2xpY2soKSB7CisgICAgICAgIG1FdmVudFNlbmRlckhhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZShNU0dfTU9VU0VfQ0xJQ0spOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG1vdXNlTW92ZVRvKGludCB4LCBpbnQgeSkgeworICAgICAgICBtRXZlbnRTZW5kZXJIYW5kbGVyLm9idGFpbk1lc3NhZ2UoTVNHX01PVVNFX01PVkVfVE8sIHgsIHkpLnNlbmRUb1RhcmdldCgpOworICAgIH0KKworICAgIC8qKiBUT1VDSCAqLworCisgICAgcHVibGljIHZvaWQgYWRkVG91Y2hQb2ludChpbnQgeCwgaW50IHkpIHsKKyAgICAgICAgbUV2ZW50U2VuZGVySGFuZGxlci5vYnRhaW5NZXNzYWdlKE1TR19BRERfVE9VQ0hfUE9JTlQsIHgsIHkpLnNlbmRUb1RhcmdldCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRvdWNoU3RhcnQoKSB7CisgICAgICAgIG1FdmVudFNlbmRlckhhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZShNU0dfVE9VQ0hfU1RBUlQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHVwZGF0ZVRvdWNoUG9pbnQoaW50IGlkLCBpbnQgeCwgaW50IHkpIHsKKyAgICAgICAgQnVuZGxlIGJ1bmRsZSA9IG5ldyBCdW5kbGUoKTsKKyAgICAgICAgYnVuZGxlLnB1dEludCgiaWQiLCBpZCk7CisgICAgICAgIGJ1bmRsZS5wdXRJbnQoIngiLCB4KTsKKyAgICAgICAgYnVuZGxlLnB1dEludCgieSIsIHkpOworICAgICAgICBtRXZlbnRTZW5kZXJIYW5kbGVyLm9idGFpbk1lc3NhZ2UoTVNHX1VQREFURV9UT1VDSF9QT0lOVCwgYnVuZGxlKS5zZW5kVG9UYXJnZXQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0b3VjaE1vdmUoKSB7CisgICAgICAgIG1FdmVudFNlbmRlckhhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZShNU0dfVE9VQ0hfTU9WRSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2FuY2VsVG91Y2hQb2ludChpbnQgaWQpIHsKKyAgICAgICAgTWVzc2FnZSBtc2cgPSBtRXZlbnRTZW5kZXJIYW5kbGVyLm9idGFpbk1lc3NhZ2UoTVNHX0NBTkNFTF9UT1VDSF9QT0lOVCk7CisgICAgICAgIG1zZy5hcmcxID0gaWQ7CisgICAgICAgIG1zZy5zZW5kVG9UYXJnZXQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0b3VjaENhbmNlbCgpIHsKKyAgICAgICAgbUV2ZW50U2VuZGVySGFuZGxlci5zZW5kRW1wdHlNZXNzYWdlKE1TR19UT1VDSF9DQU5DRUwpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlbGVhc2VUb3VjaFBvaW50KGludCBpZCkgeworICAgICAgICBNZXNzYWdlIG1zZyA9IG1FdmVudFNlbmRlckhhbmRsZXIub2J0YWluTWVzc2FnZShNU0dfUkVMRUFTRV9UT1VDSF9QT0lOVCk7CisgICAgICAgIG1zZy5hcmcxID0gaWQ7CisgICAgICAgIG1zZy5zZW5kVG9UYXJnZXQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0b3VjaEVuZCgpIHsKKyAgICAgICAgbUV2ZW50U2VuZGVySGFuZGxlci5zZW5kRW1wdHlNZXNzYWdlKE1TR19UT1VDSF9FTkQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFRvdWNoTW9kaWZpZXIoU3RyaW5nIG1vZGlmaWVyLCBib29sZWFuIGVuYWJsZWQpIHsKKyAgICAgICAgQnVuZGxlIGJ1bmRsZSA9IG5ldyBCdW5kbGUoKTsKKyAgICAgICAgYnVuZGxlLnB1dFN0cmluZygibW9kaWZpZXIiLCBtb2RpZmllcik7CisgICAgICAgIGJ1bmRsZS5wdXRCb29sZWFuKCJlbmFibGVkIiwgZW5hYmxlZCk7CisgICAgICAgIG1FdmVudFNlbmRlckhhbmRsZXIub2J0YWluTWVzc2FnZShNU0dfU0VUX1RPVUNIX01PRElGSUVSLCBidW5kbGUpLnNlbmRUb1RhcmdldCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNsZWFyVG91Y2hQb2ludHMoKSB7CisgICAgICAgIG1FdmVudFNlbmRlckhhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZShNU0dfQ0xFQVJfVE9VQ0hfUE9JTlRTKTsKKyAgICB9CisKKyAgICBwcml2YXRlIExpc3Q8VG91Y2hQb2ludD4gZ2V0VG91Y2hQb2ludHMoKSB7CisgICAgICAgIGlmIChtVG91Y2hQb2ludHMgPT0gbnVsbCkgeworICAgICAgICAgICAgbVRvdWNoUG9pbnRzID0gbmV3IExpbmtlZExpc3Q8VG91Y2hQb2ludD4oKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBtVG91Y2hQb2ludHM7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGV4ZWN1dGVUb3VjaEV2ZW50KFRvdWNoUG9pbnQgdG91Y2hQb2ludCwgaW50IGFjdGlvbikgeworICAgICAgICBNb3Rpb25FdmVudCBldmVudCA9CisgICAgICAgICAgICAgICAgTW90aW9uRXZlbnQub2J0YWluKHRvdWNoUG9pbnQuZ2V0RG93blRpbWUoKSwgU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCksCisgICAgICAgICAgICAgICAgYWN0aW9uLCB0b3VjaFBvaW50LmdldFgoKSwgdG91Y2hQb2ludC5nZXRZKCksIG1Ub3VjaE1ldGFTdGF0ZSk7CisgICAgICAgIG1XZWJWaWV3Lm9uVG91Y2hFdmVudChldmVudCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGV4ZWN1dGVLZXlFdmVudChpbnQgYWN0aW9uLCBpbnQga2V5Q29kZSkgeworICAgICAgICBLZXlFdmVudCBldmVudCA9IG5ldyBLZXlFdmVudChhY3Rpb24sIGtleUNvZGUpOworICAgICAgICBtV2ViVmlldy5vbktleURvd24oZXZlbnQuZ2V0S2V5Q29kZSgpLCBldmVudCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXNzdW1lcyBsb3dlcmNhc2UgY2hhcnMsIGNhc2UgbmVlZHMgdG8gYmUgaGFuZGxlZCBieSBjYWxsaW5nIGZ1bmN0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGludCBjaGFyVG9LZXlDb2RlKGNoYXIgYykgeworICAgICAgICAvLyBoYW5kbGUgbnVtYmVycworICAgICAgICBpZiAoYyA+PSAnMCcgJiYgYyA8PSAnOScpIHsKKyAgICAgICAgICAgIGludCBvZmZzZXQgPSBjIC0gJzAnOworICAgICAgICAgICAgcmV0dXJuIEtleUV2ZW50LktFWUNPREVfMCArIG9mZnNldDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGhhbmRsZSBjaGFyYWN0ZXJzCisgICAgICAgIGlmIChjID49ICdhJyAmJiBjIDw9ICd6JykgeworICAgICAgICAgICAgaW50IG9mZnNldCA9IGMgLSAnYSc7CisgICAgICAgICAgICByZXR1cm4gS2V5RXZlbnQuS0VZQ09ERV9BICsgb2Zmc2V0OworICAgICAgICB9CisKKyAgICAgICAgLy8gaGFuZGxlIGFsbCBvdGhlcnMKKyAgICAgICAgc3dpdGNoIChjKSB7CisgICAgICAgICAgICBjYXNlICcqJzoKKyAgICAgICAgICAgICAgICByZXR1cm4gS2V5RXZlbnQuS0VZQ09ERV9TVEFSOworCisgICAgICAgICAgICBjYXNlICcjJzoKKyAgICAgICAgICAgICAgICByZXR1cm4gS2V5RXZlbnQuS0VZQ09ERV9QT1VORDsKKworICAgICAgICAgICAgY2FzZSAnLCc6CisgICAgICAgICAgICAgICAgcmV0dXJuIEtleUV2ZW50LktFWUNPREVfQ09NTUE7CisKKyAgICAgICAgICAgIGNhc2UgJy4nOgorICAgICAgICAgICAgICAgIHJldHVybiBLZXlFdmVudC5LRVlDT0RFX1BFUklPRDsKKworICAgICAgICAgICAgY2FzZSAnXHQnOgorICAgICAgICAgICAgICAgIHJldHVybiBLZXlFdmVudC5LRVlDT0RFX1RBQjsKKworICAgICAgICAgICAgY2FzZSAnICc6CisgICAgICAgICAgICAgICAgcmV0dXJuIEtleUV2ZW50LktFWUNPREVfU1BBQ0U7CisKKyAgICAgICAgICAgIGNhc2UgJ1xuJzoKKyAgICAgICAgICAgICAgICByZXR1cm4gS2V5RXZlbnQuS0VZQ09ERV9FTlRFUjsKKworICAgICAgICAgICAgY2FzZSAnXGInOgorICAgICAgICAgICAgY2FzZSAweDdGOgorICAgICAgICAgICAgICAgIHJldHVybiBLZXlFdmVudC5LRVlDT0RFX0RFTDsKKworICAgICAgICAgICAgY2FzZSAnfic6CisgICAgICAgICAgICAgICAgcmV0dXJuIEtleUV2ZW50LktFWUNPREVfR1JBVkU7CisKKyAgICAgICAgICAgIGNhc2UgJy0nOgorICAgICAgICAgICAgICAgIHJldHVybiBLZXlFdmVudC5LRVlDT0RFX01JTlVTOworCisgICAgICAgICAgICBjYXNlICc9JzoKKyAgICAgICAgICAgICAgICByZXR1cm4gS2V5RXZlbnQuS0VZQ09ERV9FUVVBTFM7CisKKyAgICAgICAgICAgIGNhc2UgJygnOgorICAgICAgICAgICAgICAgIHJldHVybiBLZXlFdmVudC5LRVlDT0RFX0xFRlRfQlJBQ0tFVDsKKworICAgICAgICAgICAgY2FzZSAnKSc6CisgICAgICAgICAgICAgICAgcmV0dXJuIEtleUV2ZW50LktFWUNPREVfUklHSFRfQlJBQ0tFVDsKKworICAgICAgICAgICAgY2FzZSAnXFwnOgorICAgICAgICAgICAgICAgIHJldHVybiBLZXlFdmVudC5LRVlDT0RFX0JBQ0tTTEFTSDsKKworICAgICAgICAgICAgY2FzZSAnOyc6CisgICAgICAgICAgICAgICAgcmV0dXJuIEtleUV2ZW50LktFWUNPREVfU0VNSUNPTE9OOworCisgICAgICAgICAgICBjYXNlICdcJyc6CisgICAgICAgICAgICAgICAgcmV0dXJuIEtleUV2ZW50LktFWUNPREVfQVBPU1RST1BIRTsKKworICAgICAgICAgICAgY2FzZSAnLyc6CisgICAgICAgICAgICAgICAgcmV0dXJuIEtleUV2ZW50LktFWUNPREVfU0xBU0g7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIGM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgbW9kaWZpZXJUb0tleUNvZGUoU3RyaW5nIG1vZGlmaWVyKSB7CisgICAgICAgIGlmIChtb2RpZmllci5lcXVhbHMoImN0cmxLZXkiKSkgeworICAgICAgICAgICAgcmV0dXJuIEtleUV2ZW50LktFWUNPREVfQUxUX0xFRlQ7CisgICAgICAgIH0gZWxzZSBpZiAobW9kaWZpZXIuZXF1YWxzKCJzaGlmdEtleSIpKSB7CisgICAgICAgICAgICByZXR1cm4gS2V5RXZlbnQuS0VZQ09ERV9TSElGVF9MRUZUOworICAgICAgICB9IGVsc2UgaWYgKG1vZGlmaWVyLmVxdWFscygiYWx0S2V5IikpIHsKKyAgICAgICAgICAgIHJldHVybiBLZXlFdmVudC5LRVlDT0RFX1NZTTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBLZXlFdmVudC5LRVlDT0RFX1VOS05PV047CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL0ZpbGVGaWx0ZXIuamF2YSBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL0ZpbGVGaWx0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjgyZDI0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvRmlsZUZpbHRlci5qYXZhCkBAIC0wLDAgKzEsMjg4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUyOworCitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uRmlsZVJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCisvKioKKyAqIEEgdXRpbGl0eSB0byBmaWx0ZXIgb3V0IHNvbWUgZmlsZXMvZGlyZWN0b3JpZXMgZnJvbSB0aGUgdmlld3MgYW5kIHRlc3RzIHRoYXQgcnVuLgorICovCitwdWJsaWMgY2xhc3MgRmlsZUZpbHRlciB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiRmlsZUZpbHRlciI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9FWFBFQ1RBVElPTlNfVFhUX1BBVEggPQorICAgICAgICAgICAgInBsYXRmb3JtL2FuZHJvaWQvdGVzdF9leHBlY3RhdGlvbnMudHh0IjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUT0tFTl9TS0lQID0gIlNLSVAiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUT0tFTl9JR05PUkVfUkVTVUxUID0gIklHTk9SRV9SRVNVTFQiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUT0tFTl9TTE9XID0gIlNMT1ciOworCisgICAgcHJpdmF0ZSBmaW5hbCBTZXQ8U3RyaW5nPiBtU2tpcExpc3QgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBTZXQ8U3RyaW5nPiBtSWdub3JlUmVzdWx0TGlzdCA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKKyAgICBwcml2YXRlIGZpbmFsIFNldDxTdHJpbmc+IG1TbG93TGlzdCA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKKworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1Sb290RGlyUGF0aDsKKworICAgIHB1YmxpYyBGaWxlRmlsdGVyKFN0cmluZyByb290RGlyUGF0aCkgeworICAgICAgICAvKiogSXQgbWF5IG9yIG1heSBub3QgY29udGFpbiBhIHRyYWlsaW5nIHNsYXNoICovCisgICAgICAgIHRoaXMubVJvb3REaXJQYXRoID0gcm9vdERpclBhdGg7CisKKyAgICAgICAgcmVsb2FkQ29uZmlndXJhdGlvbigpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyB0cmltVHJhaWxpbmdTbGFzaElmUHJlc2VudChTdHJpbmcgcGF0aCkgeworICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShwYXRoKTsKKyAgICAgICAgcmV0dXJuIGZpbGUuZ2V0UGF0aCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlbG9hZENvbmZpZ3VyYXRpb24oKSB7CisgICAgICAgIEZpbGUgdHh0X2V4cCA9IG5ldyBGaWxlKG1Sb290RGlyUGF0aCwgVEVTVF9FWFBFQ1RBVElPTlNfVFhUX1BBVEgpOworCisgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIGJ1ZmZlcmVkUmVhZGVyOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYnVmZmVyZWRSZWFkZXIgPQorICAgICAgICAgICAgICAgICAgICBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIodHh0X2V4cCkpOworCisgICAgICAgICAgICBTdHJpbmcgbGluZTsKKyAgICAgICAgICAgIFN0cmluZyBlbnRyeTsKKyAgICAgICAgICAgIFN0cmluZ1tdIHBhcnRzOworICAgICAgICAgICAgU3RyaW5nIHBhdGg7CisgICAgICAgICAgICBTZXQ8U3RyaW5nPiB0b2tlbnM7CisgICAgICAgICAgICBCb29sZWFuIHNraXBwZWQ7CisgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgICAgIGxpbmUgPSBidWZmZXJlZFJlYWRlci5yZWFkTGluZSgpOworICAgICAgICAgICAgICAgIGlmIChsaW5lID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyoqIFJlbW92ZSB0aGUgY29tbWVudCBhbmQgdHJpbSAqLworICAgICAgICAgICAgICAgIGVudHJ5ID0gbGluZS5zcGxpdCgiLy8iLCAyKVswXS50cmltKCk7CisKKyAgICAgICAgICAgICAgICAvKiogT21pdCBlbXB0eSBsaW5lcywgYWR2YW5jZSB0byBuZXh0IGxpbmUgKi8KKyAgICAgICAgICAgICAgICBpZiAoZW50cnkuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qKiBTcGxpdCBvbiB3aGl0ZXNwYWNlIGludG8gcGF0aCBwYXJ0IGFuZCB0aGUgcmVzdCAqLworICAgICAgICAgICAgICAgIHBhcnRzID0gZW50cnkuc3BsaXQoIlxccyIsIDIpOworCisgICAgICAgICAgICAgICAgLyoqIEF0IHRoaXMgcG9pbnQgcGFydHMubGVuZ3RoID49IDEgKi8KKyAgICAgICAgICAgICAgICBpZiAocGFydHMubGVuZ3RoID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLncoTE9HX1RBRyArICI6OnJlbG9hZENvbmZpZ3VyYXRpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaGVyZSBhcmUgbm8gb3B0aW9ucyBzcGVjaWZpZWQgZm9yIHRoZSB0ZXN0ISIpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwYXRoID0gdHJpbVRyYWlsaW5nU2xhc2hJZlByZXNlbnQocGFydHNbMF0pOworCisgICAgICAgICAgICAgICAgLyoqIFNwbGl0IG9uIHdoaXRlc3BhY2UgKi8KKyAgICAgICAgICAgICAgICB0b2tlbnMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KEFycmF5cy5hc0xpc3QocGFydHNbMV0uc3BsaXQoIlxccyIsIDApKSk7CisKKyAgICAgICAgICAgICAgICAvKiogQ2hvc2UgdGhlIHJpZ2h0IGNvbGxlY3Rpb25zIHRvIGFkZCB0byAqLworICAgICAgICAgICAgICAgIHNraXBwZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBpZiAodG9rZW5zLmNvbnRhaW5zKFRPS0VOX1NLSVApKSB7CisgICAgICAgICAgICAgICAgICAgIG1Ta2lwTGlzdC5hZGQocGF0aCk7CisgICAgICAgICAgICAgICAgICAgIHNraXBwZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qKiBJZiB0ZXN0IGlzIG9uIHNraXAgbGlzdCB3ZSBpZ25vcmUgYW55IGZ1cnRoZXIgb3B0aW9ucyAqLworICAgICAgICAgICAgICAgIGlmIChza2lwcGVkKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0b2tlbnMuY29udGFpbnMoVE9LRU5fSUdOT1JFX1JFU1VMVCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbUlnbm9yZVJlc3VsdExpc3QuYWRkKHBhdGgpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0b2tlbnMuY29udGFpbnMoVE9LRU5fU0xPVykpIHsKKyAgICAgICAgICAgICAgICAgICAgbVNsb3dMaXN0LmFkZChwYXRoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cudyhMT0dfVEFHICsgIjo6cmVsb2FkQ29uZmlndXJhdGlvbiIsICJGaWxlIG5vdCBmb3VuZDogIiArIHR4dF9leHAuZ2V0UGF0aCgpKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoTE9HX1RBRyArICI6OnJlbG9hZENvbmZpZ3VyYXRpb24iLCAiSU9FeGNlcHRpb246ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVja3MgaWYgdGVzdCBpcyBzdXBwb3NlZCB0byBiZSBza2lwcGVkLgorICAgICAqCisgICAgICogPHA+CisgICAgICogUGF0aCBnaXZlbiBzaG91bGQgcmVsYXRpdmUgd2l0aGluIExheW91dFRlc3RzIGZvbGRlciwgZS5nLiBmYXN0L2RvbS9mb28uaHRtbAorICAgICAqCisgICAgICogQHBhcmFtIHRlc3RQYXRoCisgICAgICogICAgICAgICAgICAtIGEgcmVsYXRpdmUgcGF0aCB3aXRoaW4gTGF5b3V0VGVzdHMgZm9sZGVyCisgICAgICogQHJldHVybiBpZiB0aGUgdGVzdCBpcyBzdXBwb3NlZCB0byBiZSBza2lwcGVkCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNTa2lwKFN0cmluZyB0ZXN0UGF0aCkgeworICAgICAgICBmb3IgKFN0cmluZyBwcmVmaXggOiBnZXRQcmVmaXhlcyh0ZXN0UGF0aCkpIHsKKyAgICAgICAgICAgIGlmIChtU2tpcExpc3QuY29udGFpbnMocHJlZml4KSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrcyBpZiB0ZXN0IHJlc3VsdCBpcyBzdXBwb3NlZCB0byBiZSBpZ25vcmVkLgorICAgICAqCisgICAgICogPHA+CisgICAgICogUGF0aCBnaXZlbiBzaG91bGQgcmVsYXRpdmUgd2l0aGluIExheW91dFRlc3RzIGZvbGRlciwgZS5nLiBmYXN0L2RvbS9mb28uaHRtbAorICAgICAqCisgICAgICogQHBhcmFtIHRlc3RQYXRoCisgICAgICogICAgICAgICAgICAtIGEgcmVsYXRpdmUgcGF0aCB3aXRoaW4gTGF5b3V0VGVzdHMgZm9sZGVyCisgICAgICogQHJldHVybiBpZiB0aGUgdGVzdCByZXN1bHQgaXMgc3VwcG9zZWQgdG8gYmUgaWdub3JlZAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzSWdub3JlUmVzKFN0cmluZyB0ZXN0UGF0aCkgeworICAgICAgICBmb3IgKFN0cmluZyBwcmVmaXggOiBnZXRQcmVmaXhlcyh0ZXN0UGF0aCkpIHsKKyAgICAgICAgICAgIGlmIChtSWdub3JlUmVzdWx0TGlzdC5jb250YWlucyhwcmVmaXgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2tzIGlmIHRlc3QgaXMgc2xvdyBhbmQgc2hvdWxkIGhhdmUgdGltZW91dCBpbmNyZWFzZWQuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBQYXRoIGdpdmVuIHNob3VsZCByZWxhdGl2ZSB3aXRoaW4gTGF5b3V0VGVzdHMgZm9sZGVyLCBlLmcuIGZhc3QvZG9tL2Zvby5odG1sCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGVzdFBhdGgKKyAgICAgKiAgICAgICAgICAgIC0gYSByZWxhdGl2ZSBwYXRoIHdpdGhpbiBMYXlvdXRUZXN0cyBmb2xkZXIKKyAgICAgKiBAcmV0dXJuIGlmIHRoZSB0ZXN0IGlzIHNsb3cgYW5kIHNob3VsZCBoYXZlIHRpbWVvdXQgaW5jcmVhc2VkLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzU2xvdyhTdHJpbmcgdGVzdFBhdGgpIHsKKyAgICAgICAgZm9yIChTdHJpbmcgcHJlZml4IDogZ2V0UHJlZml4ZXModGVzdFBhdGgpKSB7CisgICAgICAgICAgICBpZiAobVNsb3dMaXN0LmNvbnRhaW5zKHByZWZpeCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIGFsbCBwYXRoIHByZWZpeGVzIG9mIHRoZSBnaXZlbiBwYXRoLgorICAgICAqCisgICAgICogPHA+CisgICAgICogZS5nLiB0aGlzL2lzL2EvcGF0aCByZXR1cm5zIHRoZSBsaXN0OiB0aGlzIHRoaXMvaXMgdGhpcy9pcy9hIHRoaXMvaXMvYS9wYXRoCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGF0aAorICAgICAqIEByZXR1cm4gdGhlIGxpc3Qgb2YgYWxsIHBhdGggcHJlZml4ZXMgb2YgdGhlIGdpdmVuIHBhdGguCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxTdHJpbmc+IGdldFByZWZpeGVzKFN0cmluZyBwYXRoKSB7CisgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKHBhdGgpOworICAgICAgICBMaXN0PFN0cmluZz4gcHJlZml4ZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oOCk7CisKKyAgICAgICAgZG8geworICAgICAgICAgICAgcHJlZml4ZXMuYWRkKGZpbGUuZ2V0UGF0aCgpKTsKKyAgICAgICAgICAgIGZpbGUgPSBmaWxlLmdldFBhcmVudEZpbGUoKTsKKyAgICAgICAgfSB3aGlsZSAoZmlsZSAhPSBudWxsKTsKKworICAgICAgICByZXR1cm4gcHJlZml4ZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2tzIGlmIHRoZSBkaXJlY3RvcnkgbWF5IGNvbnRhaW4gdGVzdHMgb3IgY29udGFpbnMganVzdCBoZWxwZXIgZmlsZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGlyTmFtZQorICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgIGlmIHRoZSBkaXJlY3RvcnkgbWF5IGNvbnRhaW4gdGVzdHMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNUZXN0RGlyKFN0cmluZyBkaXJOYW1lKSB7CisgICAgICAgIHJldHVybiAoIWRpck5hbWUuZXF1YWxzKCJzY3JpcHQtdGVzdHMiKQorICAgICAgICAgICAgICAgICYmICFkaXJOYW1lLmVxdWFscygicmVzb3VyY2VzIikgJiYgIWRpck5hbWUuc3RhcnRzV2l0aCgiLiIpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVja3MgaWYgdGhlIGZpbGUgaXMgYSB0ZXN0LgorICAgICAqIEN1cnJlbnRseSB3ZSBydW4gLmh0bWwgYW5kIC54aHRtbCB0ZXN0cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0ZXN0TmFtZQorICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgIGlmIHRoZSBmaWxlIGlzIGEgdGVzdAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1Rlc3RGaWxlKFN0cmluZyB0ZXN0TmFtZSkgeworICAgICAgICByZXR1cm4gdGVzdE5hbWUuZW5kc1dpdGgoIi5odG1sIikgfHwgdGVzdE5hbWUuZW5kc1dpdGgoIi54aHRtbCIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcGF0aCB0byB0aGUgZmlsZSByZWxhdGl2ZSB0byB0aGUgdGVzdHMgcm9vdCBkaXIKKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWxlUGF0aAorICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgIHRoZSBwYXRoIHJlbGF0aXZlIHRvIHRoZSB0ZXN0cyByb290IGRpcgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVsYXRpdmVQYXRoKFN0cmluZyBmaWxlUGF0aCkgeworICAgICAgICBGaWxlIHJvb3REaXIgPSBuZXcgRmlsZShtUm9vdERpclBhdGgpOworICAgICAgICByZXR1cm4gZmlsZVBhdGgucmVwbGFjZUZpcnN0KHJvb3REaXIuZ2V0UGF0aCgpICsgRmlsZS5zZXBhcmF0b3IsICIiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHBhdGggdG8gdGhlIGZpbGUgcmVsYXRpdmUgdG8gdGhlIHRlc3RzIHJvb3QgZGlyCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmlsZVBhdGgKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgICB0aGUgcGF0aCByZWxhdGl2ZSB0byB0aGUgdGVzdHMgcm9vdCBkaXIKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlbGF0aXZlUGF0aChGaWxlIGZpbGUpIHsKKyAgICAgICAgcmV0dXJuIGdldFJlbGF0aXZlUGF0aChmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgRmlsZSBnZXRBYnNvbHV0ZUZpbGUoU3RyaW5nIHJlbGF0aXZlUGF0aCkgeworICAgICAgICByZXR1cm4gbmV3IEZpbGUobVJvb3REaXJQYXRoLCByZWxhdGl2ZVBhdGgpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0QWJvc2x1dGVQYXRoKFN0cmluZyByZWxhdGl2ZVBhdGgpIHsKKyAgICAgICAgcmV0dXJuIGdldEFic29sdXRlRmlsZShyZWxhdGl2ZVBhdGgpLmdldEFic29sdXRlUGF0aCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIElmIHRoZSBwYXRoIGNvbnRhaW5zIGV4dGVuc2lvbiAoZS5nIC5mb28gYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSkgdGhlbiBpdCBjaGFuZ2VzCisgICAgICogdGhpcyAoLmZvbykgaW50byBuZXdFbmRpbmcgKHNvIGl0IGhhcyB0byBjb250YWluIHRoZSBkb3QgaWYgd2Ugd2FudCB0byBwcmVzZXJ2ZSBpdCkuCisgICAgICoKKyAgICAgKiA8cD5JZiB0aGUgcGF0aCBkb2Vzbid0IGNvbnRhaW4gYW4gZXh0ZW5zaW9uLCBpdCBhZGRzIHRoZSBlbmRpbmcgdG8gdGhlIHBhdGguCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVsYXRpdmVQYXRoCisgICAgICogQHBhcmFtIG5ld0VuZGluZworICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgIGEgbmV3IHBhdGgsIGNvbnRhaW5pbmcgdGhlIG5ld0V4dGVuc2lvbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHNldFBhdGhFbmRpbmcoU3RyaW5nIHJlbGF0aXZlUGF0aCwgU3RyaW5nIG5ld0VuZGluZykgeworICAgICAgICBpbnQgZG90UG9zID0gcmVsYXRpdmVQYXRoLmxhc3RJbmRleE9mKCcuJyk7CisgICAgICAgIGlmIChkb3RQb3MgPT0gLTEpIHsKKyAgICAgICAgICAgIHJldHVybiByZWxhdGl2ZVBhdGggKyBuZXdFbmRpbmc7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmVsYXRpdmVQYXRoLnN1YnN0cmluZygwLCBkb3RQb3MpICsgbmV3RW5kaW5nOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9Gc1V0aWxzLmphdmEgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9Gc1V0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjEyYzE4NwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL0ZzVXRpbHMuamF2YQpAQCAtMCwwICsxLDc4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5kdW1wcmVuZGVydHJlZTI7CisKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworCisvKioKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBGc1V0aWxzIHsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIkZzVXRpbHMiOworCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlRGF0YVRvU3RvcmFnZShGaWxlIGZpbGUsIGJ5dGVbXSBieXRlcywgYm9vbGVhbiBhcHBlbmQpIHsKKyAgICAgICAgTG9nLmQoTE9HX1RBRyArICI6OndyaXRlRGF0YVRvU3RvcmFnZSIsIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGZpbGUuZ2V0UGFyZW50RmlsZSgpLm1rZGlycygpOworICAgICAgICAgICAgICAgIGZpbGUuY3JlYXRlTmV3RmlsZSgpOworICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcgKyAiOjp3cml0ZURhdGFUb1N0b3JhZ2UiLCAiRmlsZSBjcmVhdGVkLiIpOworICAgICAgICAgICAgICAgIG91dHB1dFN0cmVhbSA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGUsIGFwcGVuZCk7CisgICAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtLndyaXRlKGJ5dGVzKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgaWYgKG91dHB1dFN0cmVhbSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dFN0cmVhbS5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoTE9HX1RBRyArICI6OndyaXRlRGF0YVRvU3RvcmFnZSIsIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgYnl0ZVtdIHJlYWREYXRhRnJvbVN0b3JhZ2UoRmlsZSBmaWxlKSB7CisgICAgICAgIGlmICghZmlsZS5leGlzdHMoKSkgeworICAgICAgICAgICAgTG9nLmQoTE9HX1RBRyArICI6OnJlYWREYXRhRnJvbVN0b3JhZ2UiLCAiRmlsZSBkb2VzIG5vdCBleGlzdDogIgorICAgICAgICAgICAgICAgICAgICArIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBieXRlW10gYnl0ZXMgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgRmlsZUlucHV0U3RyZWFtIGZpcyA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGZpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSk7CisgICAgICAgICAgICAgICAgYnl0ZXMgPSBuZXcgYnl0ZVsoaW50KSBmaWxlLmxlbmd0aCgpXTsKKyAgICAgICAgICAgICAgICBmaXMucmVhZChieXRlcyk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIGlmIChmaXMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBmaXMuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKExPR19UQUcgKyAiOjpyZWFkRGF0YUZyb21TdG9yYWdlIiwgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGJ5dGVzOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9MYXlvdXRUZXN0Q29udHJvbGxlci5qYXZhIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvTGF5b3V0VGVzdENvbnRyb2xsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGI5NTcxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvTGF5b3V0VGVzdENvbnRyb2xsZXIuamF2YQpAQCAtMCwwICsxLDEwMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUyOworCitpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC53ZWJraXQuTW9ja0dlb2xvY2F0aW9uOworaW1wb3J0IGFuZHJvaWQud2Via2l0LldlYlN0b3JhZ2U7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CisKKy8qKgorICogQSBjbGFzcyB0aGF0IGlzIHJlZ2lzdGVyZWQgYXMgSlMgaW50ZXJmYWNlIGZvciB3ZWJ2aWV3IGluIExheW91dFRlc3RFeGVjdXRvcgorICovCitwdWJsaWMgY2xhc3MgTGF5b3V0VGVzdENvbnRyb2xsZXIgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIkxheW91dFRlc3RDb250cm9sbGVyIjsKKworICAgIExheW91dFRlc3RzRXhlY3V0b3IgbUxheW91dFRlc3RzRXhlY3V0b3I7CisKKyAgICBwdWJsaWMgTGF5b3V0VGVzdENvbnRyb2xsZXIoTGF5b3V0VGVzdHNFeGVjdXRvciBsYXlvdXRUZXN0c0V4ZWN1dG9yKSB7CisgICAgICAgIG1MYXlvdXRUZXN0c0V4ZWN1dG9yID0gbGF5b3V0VGVzdHNFeGVjdXRvcjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3YWl0VW50aWxEb25lKCkgeworICAgICAgICBtTGF5b3V0VGVzdHNFeGVjdXRvci53YWl0VW50aWxEb25lKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbm90aWZ5RG9uZSgpIHsKKyAgICAgICAgbUxheW91dFRlc3RzRXhlY3V0b3Iubm90aWZ5RG9uZSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGR1bXBBc1RleHQoKSB7CisgICAgICAgIGR1bXBBc1RleHQoZmFsc2UpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGR1bXBBc1RleHQoYm9vbGVhbiBlbmFibGVQaXhlbFRlc3QpIHsKKyAgICAgICAgbUxheW91dFRlc3RzRXhlY3V0b3IuZHVtcEFzVGV4dChlbmFibGVQaXhlbFRlc3QpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGR1bXBDaGlsZEZyYW1lc0FzVGV4dCgpIHsKKyAgICAgICAgbUxheW91dFRlc3RzRXhlY3V0b3IuZHVtcENoaWxkRnJhbWVzQXNUZXh0KCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2xlYXJBbGxEYXRhYmFzZXMoKSB7CisgICAgICAgIExvZy53KExPR19UQUcgKyAiOjpjbGVhckFsbERhdGFiYXNlcyIsICJjYWxsZWQiKTsKKyAgICAgICAgV2ViU3RvcmFnZS5nZXRJbnN0YW5jZSgpLmRlbGV0ZUFsbERhdGEoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDYW5PcGVuV2luZG93cygpIHsKKyAgICAgICAgbUxheW91dFRlc3RzRXhlY3V0b3Iuc2V0Q2FuT3BlbldpbmRvd3MoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBkdW1wRGF0YWJhc2VDYWxsYmFja3MoKSB7CisgICAgICAgIG1MYXlvdXRUZXN0c0V4ZWN1dG9yLmR1bXBEYXRhYmFzZUNhbGxiYWNrcygpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldERhdGFiYXNlUXVvdGEobG9uZyBxdW90YSkgeworICAgICAgICAvKiogVE9ETzogUmVzZXQgdGhpcyBiZWZvcmUgZXZlcnkgdGVzdCEgKi8KKyAgICAgICAgTG9nLncoTE9HX1RBRyArICI6OnNldERhdGFiYXNlUXVvdGEiLCAiY2FsbGVkIHdpdGg6ICIgKyBxdW90YSk7CisgICAgICAgIFdlYlN0b3JhZ2UuZ2V0SW5zdGFuY2UoKS5zZXRRdW90YUZvck9yaWdpbihVcmkuZnJvbUZpbGUobmV3IEZpbGUoIiIpKS50b1N0cmluZygpLAorICAgICAgICAgICAgICAgIHF1b3RhKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRHZW9sb2NhdGlvblBlcm1pc3Npb24oYm9vbGVhbiBhbGxvdykgeworICAgICAgICBtTGF5b3V0VGVzdHNFeGVjdXRvci5zZXRHZW9sb2NhdGlvblBlcm1pc3Npb24oYWxsb3cpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE1vY2tHZW9sb2NhdGlvblBvc2l0aW9uKGRvdWJsZSBsYXRpdHVkZSwgZG91YmxlIGxvbmdpdHVkZSwgZG91YmxlIGFjY3VyYWN5KSB7CisgICAgICAgIExvZy53KExPR19UQUcgKyAiOjpzZXRNb2NrR2VvbG9jYXRpb25Qb3NpdGlvbiIsICJsYXRpdHVkZTogIiArIGxhdGl0dWRlICsKKyAgICAgICAgICAgICAgICAiIGxvbmdpdHVkZTogIiArIGxvbmdpdHVkZSArICIgYWNjdXJhY3k6ICIgKyBhY2N1cmFjeSk7CisgICAgICAgIE1vY2tHZW9sb2NhdGlvbi5nZXRJbnN0YW5jZSgpLnNldFBvc2l0aW9uKGxhdGl0dWRlLCBsb25naXR1ZGUsIGFjY3VyYWN5KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRNb2NrR2VvbG9jYXRpb25FcnJvcihpbnQgY29kZSwgU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICAgICAgTG9nLncoTE9HX1RBRyArICI6OnNldE1vY2tHZW9sb2NhdGlvbkVycm9yIiwgImNvZGU6ICIgKyBjb2RlICsgIiBtZXNzYWdlOiAiICsgbWVzc2FnZSk7CisgICAgICAgIE1vY2tHZW9sb2NhdGlvbi5nZXRJbnN0YW5jZSgpLnNldEVycm9yKGNvZGUsIG1lc3NhZ2UpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE1vY2tEZXZpY2VPcmllbnRhdGlvbihib29sZWFuIGNhblByb3ZpZGVBbHBoYSwgZG91YmxlIGFscGhhLAorICAgICAgICAgICAgYm9vbGVhbiBjYW5Qcm92aWRlQmV0YSwgZG91YmxlIGJldGEsIGJvb2xlYW4gY2FuUHJvdmlkZUdhbW1hLCBkb3VibGUgZ2FtbWEpIHsKKyAgICAgICAgLy8gQ29uZmlndXJhdGlvbiBpcyBpbiBXZWJLaXQsIHNvIHN0YXkgb24gV2ViQ29yZSB0aHJlYWQsIGJ1dCBnbyB2aWEgTGF5b3V0VGVzdHNFeGVjdXRvcgorICAgICAgICAvLyBhcyB3ZSBuZWVkIGFjY2VzcyB0byB0aGUgV2Vidmlldy4KKyAgICAgICAgbUxheW91dFRlc3RzRXhlY3V0b3Iuc2V0TW9ja0RldmljZU9yaWVudGF0aW9uKAorICAgICAgICAgICAgICAgIGNhblByb3ZpZGVBbHBoYSwgYWxwaGEsIGNhblByb3ZpZGVCZXRhLCBiZXRhLCBjYW5Qcm92aWRlR2FtbWEsIGdhbW1hKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9MYXlvdXRUZXN0c0V4ZWN1dG9yLmphdmEgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9MYXlvdXRUZXN0c0V4ZWN1dG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDczNzY1NwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL0xheW91dFRlc3RzRXhlY3V0b3IuamF2YQpAQCAtMCwwICsxLDYwMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUyOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuU2VydmljZUNvbm5lY3Rpb247CitpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuRW52aXJvbm1lbnQ7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC5vcy5NZXNzZW5nZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5Qb3dlck1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC5vcy5Qb3dlck1hbmFnZXIuV2FrZUxvY2s7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93OworaW1wb3J0IGFuZHJvaWQud2Via2l0LkNvbnNvbGVNZXNzYWdlOworaW1wb3J0IGFuZHJvaWQud2Via2l0LkpzUHJvbXB0UmVzdWx0OworaW1wb3J0IGFuZHJvaWQud2Via2l0LkpzUmVzdWx0OworaW1wb3J0IGFuZHJvaWQud2Via2l0LldlYkNocm9tZUNsaWVudDsKK2ltcG9ydCBhbmRyb2lkLndlYmtpdC5XZWJTZXR0aW5nczsKK2ltcG9ydCBhbmRyb2lkLndlYmtpdC5XZWJWaWV3OworaW1wb3J0IGFuZHJvaWQud2Via2l0LldlYlZpZXdDbGllbnQ7CitpbXBvcnQgYW5kcm9pZC53ZWJraXQuR2VvbG9jYXRpb25QZXJtaXNzaW9uczsKK2ltcG9ydCBhbmRyb2lkLndlYmtpdC5XZWJTdG9yYWdlLlF1b3RhVXBkYXRlcjsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworLyoqCisgKiBUaGlzIGFjdGl2aXR5IGV4ZWN1dGVzIHRoZSB0ZXN0LiBJdCBjb250YWlucyBXZWJWaWV3IGFuZCBsb2dpYyBvZiBMYXlvdXRUZXN0Q29udHJvbGxlcgorICogZnVuY3Rpb25zLiBJdCBydW5zIGluIGEgc2VwYXJhdGUgcHJvY2VzcyBhbmQgc2VuZHMgdGhlIHJlc3VsdHMgb2YgcnVubmluZyB0aGUgdGVzdAorICogdG8gTWFuYWdlclNlcnZpY2UuIFRoZSByZWFzb24gd2h5IGlzIHRvIGhhbmRsZSBjcmFzaGluZyAodGVzdCB0aGF0IGNyYXNoZXMgYnJpbmdzIGRvd24KKyAqIHdob2xlIHByb2Nlc3Mgd2l0aCBpdCkuCisgKi8KK3B1YmxpYyBjbGFzcyBMYXlvdXRUZXN0c0V4ZWN1dG9yIGV4dGVuZHMgQWN0aXZpdHkgeworCisgICAgcHJpdmF0ZSBlbnVtIEN1cnJlbnRTdGF0ZSB7CisgICAgICAgIElETEUsCisgICAgICAgIFJFTkRFUklOR19QQUdFLAorICAgICAgICBXQUlUSU5HX0ZPUl9BU1lOQ0hST05PVVNfVEVTVCwKKyAgICAgICAgT0JUQUlOSU5HX1JFU1VMVDsKKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1J1bm5pbmdTdGF0ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzID09IEN1cnJlbnRTdGF0ZS5SRU5ERVJJTkdfUEFHRSB8fAorICAgICAgICAgICAgICAgICAgICB0aGlzID09IEN1cnJlbnRTdGF0ZS5XQUlUSU5HX0ZPUl9BU1lOQ0hST05PVVNfVEVTVDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKiBUT0RPOiBtYWtlIGl0IGEgc2V0dGluZyAqLworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVFNfUk9PVF9ESVJfUEFUSCA9CisgICAgICAgICAgICBFbnZpcm9ubWVudC5nZXRFeHRlcm5hbFN0b3JhZ2VEaXJlY3RvcnkoKSArCisgICAgICAgICAgICBGaWxlLnNlcGFyYXRvciArICJhbmRyb2lkIiArCisgICAgICAgICAgICBGaWxlLnNlcGFyYXRvciArICJMYXlvdXRUZXN0cyI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJMYXlvdXRUZXN0RXhlY3V0b3IiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfVEVTVFNfTElTVCA9ICJUZXN0c0xpc3QiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX1RFU1RfSU5ERVggPSAiVGVzdEluZGV4IjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfQUNUVUFMX1JFU1VMVF9PQlRBSU5FRCA9IDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19URVNUX1RJTUVEX09VVCA9IDE7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9USU1FX09VVF9NUyA9IDE1ICogMTAwMDsKKworICAgIC8qKiBBIGxpc3Qgb2YgdGVzdHMgdGhhdCByZW1haW4gdG8gcnVuIHNpbmNlIGxhc3QgY3Jhc2ggKi8KKyAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBtVGVzdHNMaXN0OworCisgICAgLyoqCisgICAgICogVGhpcyBpcyBhIG51bWJlciBvZiBjdXJyZW50bHkgcnVubmluZyB0ZXN0LiBJdCBpcyAwLWJhc2VkIGFuZCBkb2Vzbid0IHJlc2V0IGFmdGVyCisgICAgICogdGhlIGNyYXNoLiBJbml0aWFsIGluZGV4IGlzIHBhc3NlZCB0byBMYXlvdXRUZXN0c0V4ZWN1dGVyIGluIHRoZSBpbnRlbnQgdGhhdCBzdGFydHMKKyAgICAgKiBpdC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBtQ3VycmVudFRlc3RJbmRleDsKKworICAgIC8qKiBUaGUgdG90YWwgbnVtYmVyIG9mIHRlc3RzIHRvIHJ1biwgZG9lc24ndCByZXNldCBhZnRlciBjcmFzaCAqLworICAgIHByaXZhdGUgaW50IG1Ub3RhbFRlc3RDb3VudDsKKworICAgIHByaXZhdGUgV2ViVmlldyBtQ3VycmVudFdlYlZpZXc7CisgICAgcHJpdmF0ZSBTdHJpbmcgbUN1cnJlbnRUZXN0UmVsYXRpdmVQYXRoOworICAgIHByaXZhdGUgU3RyaW5nIG1DdXJyZW50VGVzdFVyaTsKKyAgICBwcml2YXRlIEN1cnJlbnRTdGF0ZSBtQ3VycmVudFN0YXRlID0gQ3VycmVudFN0YXRlLklETEU7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gbUN1cnJlbnRUZXN0VGltZWRPdXQ7CisgICAgcHJpdmF0ZSBBYnN0cmFjdFJlc3VsdCBtQ3VycmVudFJlc3VsdDsKKyAgICBwcml2YXRlIEFkZGl0aW9uYWxUZXh0T3V0cHV0IG1DdXJyZW50QWRkaXRpb25hbFRleHRPdXRwdXQ7CisKKyAgICBwcml2YXRlIExheW91dFRlc3RDb250cm9sbGVyIG1MYXlvdXRUZXN0Q29udHJvbGxlciA9IG5ldyBMYXlvdXRUZXN0Q29udHJvbGxlcih0aGlzKTsKKyAgICBwcml2YXRlIGJvb2xlYW4gbUNhbk9wZW5XaW5kb3dzOworICAgIHByaXZhdGUgYm9vbGVhbiBtRHVtcERhdGFiYXNlQ2FsbGJhY2tzOworICAgIHByaXZhdGUgYm9vbGVhbiBtSXNHZW9sb2NhdGlvblBlcm1pc3Npb25TZXQ7CisgICAgcHJpdmF0ZSBib29sZWFuIG1HZW9sb2NhdGlvblBlcm1pc3Npb247CisgICAgcHJpdmF0ZSBNYXAgbVBlbmRpbmdHZW9sb2NhdGlvblBlcm1pc3Npb25DYWxsYmFja3M7CisKKyAgICBwcml2YXRlIEV2ZW50U2VuZGVyIG1FdmVudFNlbmRlciA9IG5ldyBFdmVudFNlbmRlcigpOworCisgICAgcHJpdmF0ZSBXYWtlTG9jayBtU2NyZWVuRGltTG9jazsKKworICAgIC8qKiBDT01NVU5JQ0FUSU9OIFdJVEggTWFuYWdlclNlcnZpY2UgKi8KKworICAgIHByaXZhdGUgTWVzc2VuZ2VyIG1NYW5hZ2VyU2VydmljZU1lc3NlbmdlcjsKKworICAgIHByaXZhdGUgU2VydmljZUNvbm5lY3Rpb24gbVNlcnZpY2VDb25uZWN0aW9uID0gbmV3IFNlcnZpY2VDb25uZWN0aW9uKCkgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblNlcnZpY2VDb25uZWN0ZWQoQ29tcG9uZW50TmFtZSBuYW1lLCBJQmluZGVyIHNlcnZpY2UpIHsKKyAgICAgICAgICAgIG1NYW5hZ2VyU2VydmljZU1lc3NlbmdlciA9IG5ldyBNZXNzZW5nZXIoc2VydmljZSk7CisgICAgICAgICAgICBzdGFydFRlc3RzKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25TZXJ2aWNlRGlzY29ubmVjdGVkKENvbXBvbmVudE5hbWUgbmFtZSkgeworICAgICAgICAgICAgLyoqIFRPRE8gKi8KKyAgICAgICAgfQorICAgIH07CisKKyAgICBwcml2YXRlIGZpbmFsIEhhbmRsZXIgbVJlc3VsdEhhbmRsZXIgPSBuZXcgSGFuZGxlcigpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKKyAgICAgICAgICAgIHN3aXRjaCAobXNnLndoYXQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19BQ1RVQUxfUkVTVUxUX09CVEFJTkVEOgorICAgICAgICAgICAgICAgICAgICBvbkFjdHVhbFJlc3VsdHNPYnRhaW5lZCgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgTVNHX1RFU1RfVElNRURfT1VUOgorICAgICAgICAgICAgICAgICAgICBvblRlc3RUaW1lZE91dCgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsKKworICAgIC8qKiBXRUJWSUVXIENPTkZJR1VSQVRJT04gKi8KKworICAgIHByaXZhdGUgV2ViVmlld0NsaWVudCBtV2ViVmlld0NsaWVudCA9IG5ldyBXZWJWaWV3Q2xpZW50KCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25QYWdlRmluaXNoZWQoV2ViVmlldyB2aWV3LCBTdHJpbmcgdXJsKSB7CisgICAgICAgICAgICAvKiogU29tZSB0ZXN0cyBmaXJlIHVwIG1hbnkgcGFnZSBsb2Fkcywgd2UgZG9uJ3Qgd2FudCB0byBkZXRlY3QgdGhlbSAqLworICAgICAgICAgICAgaWYgKCF1cmwuZXF1YWxzKG1DdXJyZW50VGVzdFVyaSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChtQ3VycmVudFN0YXRlID09IEN1cnJlbnRTdGF0ZS5SRU5ERVJJTkdfUEFHRSkgeworICAgICAgICAgICAgICAgIG9uVGVzdEZpbmlzaGVkKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9OworCisgICAgcHJpdmF0ZSBXZWJDaHJvbWVDbGllbnQgbVdlYkNocm9tZUNsaWVudCA9IG5ldyBXZWJDaHJvbWVDbGllbnQoKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkV4Y2VlZGVkRGF0YWJhc2VRdW90YShTdHJpbmcgdXJsLCBTdHJpbmcgZGF0YWJhc2VJZGVudGlmaWVyLAorICAgICAgICAgICAgICAgIGxvbmcgY3VycmVudFF1b3RhLCBsb25nIGVzdGltYXRlZFNpemUsIGxvbmcgdG90YWxVc2VkUXVvdGEsCisgICAgICAgICAgICAgICAgUXVvdGFVcGRhdGVyIHF1b3RhVXBkYXRlcikgeworICAgICAgICAgICAgLyoqIFRPRE86IFRoaXMgc2hvdWxkIGJlIHJlY29yZGVkIGFzIHBhcnQgb2YgdGhlIHRleHQgcmVzdWx0ICovCisgICAgICAgICAgICAvKiogVE9ETzogVGhlIHF1b3RhIHNob3VsZCBhbHNvIHByb2JhYmx5IGJlIHJlc2V0IHNvbWVob3cgZm9yIGV2ZXJ5IHRlc3Q/ICovCisgICAgICAgICAgICBpZiAobUR1bXBEYXRhYmFzZUNhbGxiYWNrcykgeworICAgICAgICAgICAgICAgIGdldEN1cnJlbnRBZGRpdGlvbmFsVGV4dE91dHB1dCgpLmFwcGVuZEV4Y2VlZGVkRGJRdW90YU1lc3NhZ2UodXJsLAorICAgICAgICAgICAgICAgICAgICAgICAgZGF0YWJhc2VJZGVudGlmaWVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHF1b3RhVXBkYXRlci51cGRhdGVRdW90YShjdXJyZW50UXVvdGEgKyA1ICogMTAyNCAqIDEwMjQpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIG9uSnNBbGVydChXZWJWaWV3IHZpZXcsIFN0cmluZyB1cmwsIFN0cmluZyBtZXNzYWdlLCBKc1Jlc3VsdCByZXN1bHQpIHsKKyAgICAgICAgICAgIGdldEN1cnJlbnRBZGRpdGlvbmFsVGV4dE91dHB1dCgpLmFwcGVuZEpzQWxlcnQobWVzc2FnZSk7CisgICAgICAgICAgICByZXN1bHQuY29uZmlybSgpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gb25Kc0NvbmZpcm0oV2ViVmlldyB2aWV3LCBTdHJpbmcgdXJsLCBTdHJpbmcgbWVzc2FnZSwgSnNSZXN1bHQgcmVzdWx0KSB7CisgICAgICAgICAgICBnZXRDdXJyZW50QWRkaXRpb25hbFRleHRPdXRwdXQoKS5hcHBlbmRKc0NvbmZpcm0obWVzc2FnZSk7CisgICAgICAgICAgICByZXN1bHQuY29uZmlybSgpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gb25Kc1Byb21wdChXZWJWaWV3IHZpZXcsIFN0cmluZyB1cmwsIFN0cmluZyBtZXNzYWdlLCBTdHJpbmcgZGVmYXVsdFZhbHVlLAorICAgICAgICAgICAgICAgIEpzUHJvbXB0UmVzdWx0IHJlc3VsdCkgeworICAgICAgICAgICAgZ2V0Q3VycmVudEFkZGl0aW9uYWxUZXh0T3V0cHV0KCkuYXBwZW5kSnNQcm9tcHQobWVzc2FnZSwgZGVmYXVsdFZhbHVlKTsKKyAgICAgICAgICAgIHJlc3VsdC5jb25maXJtKCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbkNvbnNvbGVNZXNzYWdlKENvbnNvbGVNZXNzYWdlIGNvbnNvbGVNZXNzYWdlKSB7CisgICAgICAgICAgICBnZXRDdXJyZW50QWRkaXRpb25hbFRleHRPdXRwdXQoKS5hcHBlbmRDb25zb2xlTWVzc2FnZShjb25zb2xlTWVzc2FnZSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbkNyZWF0ZVdpbmRvdyhXZWJWaWV3IHZpZXcsIGJvb2xlYW4gZGlhbG9nLCBib29sZWFuIHVzZXJHZXN0dXJlLAorICAgICAgICAgICAgICAgIE1lc3NhZ2UgcmVzdWx0TXNnKSB7CisgICAgICAgICAgICBXZWJWaWV3LldlYlZpZXdUcmFuc3BvcnQgdHJhbnNwb3J0ID0gKFdlYlZpZXcuV2ViVmlld1RyYW5zcG9ydClyZXN1bHRNc2cub2JqOworICAgICAgICAgICAgLyoqIEJ5IGRlZmF1bHQgd2luZG93cyBjYW5ub3QgYmUgb3BlbmVkLCBzbyBqdXN0IHNlbmQgbnVsbCBiYWNrLiAqLworICAgICAgICAgICAgV2ViVmlldyBuZXdXaW5kb3dXZWJWaWV3ID0gbnVsbDsKKworICAgICAgICAgICAgaWYgKG1DYW5PcGVuV2luZG93cykgeworICAgICAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICAgICAqIFdlIG5ldmVyIGRpc3BsYXkgdGhlIG5ldyB3aW5kb3csIGp1c3QgY3JlYXRlIHRoZSB2aWV3IGFuZCBhbGxvdyBpdCdzIGNvbnRlbnQgdG8KKyAgICAgICAgICAgICAgICAgKiBleGVjdXRlIGFuZCBiZSByZWNvcmRlZCBieSB0aGUgZXhlY3V0b3IuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgbmV3V2luZG93V2ViVmlldyA9IG5ldyBXZWJWaWV3KExheW91dFRlc3RzRXhlY3V0b3IudGhpcyk7CisgICAgICAgICAgICAgICAgc2V0dXBXZWJWaWV3KG5ld1dpbmRvd1dlYlZpZXcpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cmFuc3BvcnQuc2V0V2ViVmlldyhuZXdXaW5kb3dXZWJWaWV3KTsKKyAgICAgICAgICAgIHJlc3VsdE1zZy5zZW5kVG9UYXJnZXQoKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uR2VvbG9jYXRpb25QZXJtaXNzaW9uc1Nob3dQcm9tcHQoU3RyaW5nIG9yaWdpbiwKKyAgICAgICAgICAgICAgICBHZW9sb2NhdGlvblBlcm1pc3Npb25zLkNhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgICAgICAgICBpZiAobUlzR2VvbG9jYXRpb25QZXJtaXNzaW9uU2V0KSB7CisgICAgICAgICAgICAgICAgY2FsbGJhY2suaW52b2tlKG9yaWdpbiwgbUdlb2xvY2F0aW9uUGVybWlzc2lvbiwgZmFsc2UpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtUGVuZGluZ0dlb2xvY2F0aW9uUGVybWlzc2lvbkNhbGxiYWNrcyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbVBlbmRpbmdHZW9sb2NhdGlvblBlcm1pc3Npb25DYWxsYmFja3MgPQorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEhhc2hNYXA8R2VvbG9jYXRpb25QZXJtaXNzaW9ucy5DYWxsYmFjaywgU3RyaW5nPigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVBlbmRpbmdHZW9sb2NhdGlvblBlcm1pc3Npb25DYWxsYmFja3MucHV0KGNhbGxiYWNrLCBvcmlnaW4pOworICAgICAgICB9CisgICAgfTsKKworICAgIC8qKiBJTVBMRU1FTlRBVElPTiAqLworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworCisgICAgICAgIHJlcXVlc3RXaW5kb3dGZWF0dXJlKFdpbmRvdy5GRUFUVVJFX1BST0dSRVNTKTsKKworICAgICAgICBJbnRlbnQgaW50ZW50ID0gZ2V0SW50ZW50KCk7CisgICAgICAgIG1UZXN0c0xpc3QgPSBpbnRlbnQuZ2V0U3RyaW5nQXJyYXlMaXN0RXh0cmEoRVhUUkFfVEVTVFNfTElTVCk7CisgICAgICAgIG1DdXJyZW50VGVzdEluZGV4ID0gaW50ZW50LmdldEludEV4dHJhKEVYVFJBX1RFU1RfSU5ERVgsIC0xKTsKKyAgICAgICAgbVRvdGFsVGVzdENvdW50ID0gbUN1cnJlbnRUZXN0SW5kZXggKyBtVGVzdHNMaXN0LnNpemUoKTsKKworICAgICAgICBQb3dlck1hbmFnZXIgcG0gPSAoUG93ZXJNYW5hZ2VyKWdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5QT1dFUl9TRVJWSUNFKTsKKyAgICAgICAgbVNjcmVlbkRpbUxvY2sgPSBwbS5uZXdXYWtlTG9jayhQb3dlck1hbmFnZXIuU0NSRUVOX0RJTV9XQUtFX0xPQ0sKKyAgICAgICAgICAgICAgICB8IFBvd2VyTWFuYWdlci5PTl9BRlRFUl9SRUxFQVNFLCAiV2FrZUxvY2sgaW4gTGF5b3V0VGVzdGVyIik7CisgICAgICAgIG1TY3JlZW5EaW1Mb2NrLmFjcXVpcmUoKTsKKworICAgICAgICBiaW5kU2VydmljZShuZXcgSW50ZW50KHRoaXMsIE1hbmFnZXJTZXJ2aWNlLmNsYXNzKSwgbVNlcnZpY2VDb25uZWN0aW9uLAorICAgICAgICAgICAgICAgIENvbnRleHQuQklORF9BVVRPX0NSRUFURSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJlc2V0KCkgeworICAgICAgICBXZWJWaWV3IHByZXZpb3VzV2ViVmlldyA9IG1DdXJyZW50V2ViVmlldzsKKworICAgICAgICByZXNldExheW91dFRlc3RDb250cm9sbGVyKCk7CisKKyAgICAgICAgbUN1cnJlbnRUZXN0VGltZWRPdXQgPSBmYWxzZTsKKyAgICAgICAgbUN1cnJlbnRSZXN1bHQgPSBudWxsOworICAgICAgICBtQ3VycmVudEFkZGl0aW9uYWxUZXh0T3V0cHV0ID0gbnVsbDsKKworICAgICAgICBtQ3VycmVudFdlYlZpZXcgPSBuZXcgV2ViVmlldyh0aGlzKTsKKyAgICAgICAgc2V0dXBXZWJWaWV3KG1DdXJyZW50V2ViVmlldyk7CisKKyAgICAgICAgbUV2ZW50U2VuZGVyLnJlc2V0KG1DdXJyZW50V2ViVmlldyk7CisKKyAgICAgICAgc2V0Q29udGVudFZpZXcobUN1cnJlbnRXZWJWaWV3KTsKKyAgICAgICAgaWYgKHByZXZpb3VzV2ViVmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICBMb2cuZChMT0dfVEFHICsgIjo6cmVzZXQiLCAicHJldmlvdXNXZWJWaWV3ICE9IG51bGwiKTsKKyAgICAgICAgICAgIHByZXZpb3VzV2ViVmlldy5kZXN0cm95KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2V0dXBXZWJWaWV3KFdlYlZpZXcgd2ViVmlldykgeworICAgICAgICB3ZWJWaWV3LnNldFdlYlZpZXdDbGllbnQobVdlYlZpZXdDbGllbnQpOworICAgICAgICB3ZWJWaWV3LnNldFdlYkNocm9tZUNsaWVudChtV2ViQ2hyb21lQ2xpZW50KTsKKyAgICAgICAgd2ViVmlldy5hZGRKYXZhc2NyaXB0SW50ZXJmYWNlKG1MYXlvdXRUZXN0Q29udHJvbGxlciwgImxheW91dFRlc3RDb250cm9sbGVyIik7CisgICAgICAgIHdlYlZpZXcuYWRkSmF2YXNjcmlwdEludGVyZmFjZShtRXZlbnRTZW5kZXIsICJldmVudFNlbmRlciIpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXR0aW5nIGEgdG91Y2ggaW50ZXJ2YWwgb2YgLTEgZWZmZWN0aXZlbHkgZGlzYWJsZXMgdGhlIG9wdGltaXNhdGlvbiBpbiBXZWJWaWV3CisgICAgICAgICAqIHRoYXQgc3RvcHMgcmVwZWF0ZWQgdG91Y2ggZXZlbnRzIGZsb29kaW5nIFdlYkNvcmUuIFRoZSBFdmVudCBTZW5kZXIgb25seSBzZW5kcyBhCisgICAgICAgICAqIHNpbmdsZSBldmVudCByYXRoZXIgdGhhbiBhIHN0cmVhbSBvZiBldmVudHMgKGxpa2Ugd2hhdCB3b3VsZCBnZW5lcmFsbHkgaGFwcGVuIGluCisgICAgICAgICAqIGEgcmVhbCB1c2Ugb2YgdG91Y2ggZXZlbnRzIGluIGEgV2ViVmlldykgIGFuZCBzbyBpZiB0aGUgV2ViVmlldyBkcm9wcyB0aGUgZXZlbnQsCisgICAgICAgICAqIHRoZSB0ZXN0IHdpbGwgZmFpbCBhcyB0aGUgdGVzdCBleHBlY3RzIG9uZSBjYWxsYmFjayBmb3IgZXZlcnkgdG91Y2ggaXQgc3ludGhlc2l6ZXMuCisgICAgICAgICAqLworICAgICAgICB3ZWJWaWV3LnNldFRvdWNoSW50ZXJ2YWwoLTEpOworCisgICAgICAgIFdlYlNldHRpbmdzIHdlYlZpZXdTZXR0aW5ncyA9IHdlYlZpZXcuZ2V0U2V0dGluZ3MoKTsKKyAgICAgICAgd2ViVmlld1NldHRpbmdzLnNldEFwcENhY2hlRW5hYmxlZCh0cnVlKTsKKyAgICAgICAgd2ViVmlld1NldHRpbmdzLnNldEFwcENhY2hlUGF0aChnZXRBcHBsaWNhdGlvbkNvbnRleHQoKS5nZXRDYWNoZURpcigpLmdldFBhdGgoKSk7CisgICAgICAgIHdlYlZpZXdTZXR0aW5ncy5zZXRBcHBDYWNoZU1heFNpemUoTG9uZy5NQVhfVkFMVUUpOworICAgICAgICB3ZWJWaWV3U2V0dGluZ3Muc2V0SmF2YVNjcmlwdEVuYWJsZWQodHJ1ZSk7CisgICAgICAgIHdlYlZpZXdTZXR0aW5ncy5zZXRKYXZhU2NyaXB0Q2FuT3BlbldpbmRvd3NBdXRvbWF0aWNhbGx5KHRydWUpOworICAgICAgICB3ZWJWaWV3U2V0dGluZ3Muc2V0U3VwcG9ydE11bHRpcGxlV2luZG93cyh0cnVlKTsKKyAgICAgICAgd2ViVmlld1NldHRpbmdzLnNldExheW91dEFsZ29yaXRobShXZWJTZXR0aW5ncy5MYXlvdXRBbGdvcml0aG0uTk9STUFMKTsKKyAgICAgICAgd2ViVmlld1NldHRpbmdzLnNldERhdGFiYXNlRW5hYmxlZCh0cnVlKTsKKyAgICAgICAgd2ViVmlld1NldHRpbmdzLnNldERhdGFiYXNlUGF0aChnZXREaXIoImRhdGFiYXNlcyIsIDApLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgd2ViVmlld1NldHRpbmdzLnNldERvbVN0b3JhZ2VFbmFibGVkKHRydWUpOworICAgICAgICB3ZWJWaWV3U2V0dGluZ3Muc2V0V29ya2Vyc0VuYWJsZWQoZmFsc2UpOworICAgICAgICB3ZWJWaWV3U2V0dGluZ3Muc2V0WFNTQXVkaXRvckVuYWJsZWQoZmFsc2UpOworCisgICAgICAgIC8vIFRoaXMgaXMgYXN5bmNocm9ub3VzLCBidXQgaXQgZ2V0cyBwcm9jZXNzZWQgYnkgV2ViQ29yZSBiZWZvcmUgaXQgc3RhcnRzIGxvYWRpbmcgcGFnZXMuCisgICAgICAgIG1DdXJyZW50V2ViVmlldy51c2VNb2NrRGV2aWNlT3JpZW50YXRpb24oKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc3RhcnRUZXN0cygpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIE1lc3NhZ2Ugc2VydmljZU1zZyA9CisgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2Uub2J0YWluKG51bGwsIE1hbmFnZXJTZXJ2aWNlLk1TR19GSVJTVF9URVNUKTsKKworICAgICAgICAgICAgQnVuZGxlIGJ1bmRsZSA9IG5ldyBCdW5kbGUoKTsKKyAgICAgICAgICAgIGlmICghbVRlc3RzTGlzdC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBidW5kbGUucHV0U3RyaW5nKCJmaXJzdFRlc3QiLCBtVGVzdHNMaXN0LmdldCgwKSk7CisgICAgICAgICAgICAgICAgYnVuZGxlLnB1dEludCgiaW5kZXgiLCBtQ3VycmVudFRlc3RJbmRleCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNlcnZpY2VNc2cuc2V0RGF0YShidW5kbGUpOworICAgICAgICAgICAgbU1hbmFnZXJTZXJ2aWNlTWVzc2VuZ2VyLnNlbmQoc2VydmljZU1zZyk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShMT0dfVEFHICsgIjo6c3RhcnRUZXN0cyIsIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJ1bk5leHRUZXN0KCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJ1bk5leHRUZXN0KCkgeworICAgICAgICBhc3NlcnQgbUN1cnJlbnRTdGF0ZSA9PSBDdXJyZW50U3RhdGUuSURMRSA6ICJtQ3VycmVudFN0YXRlID0gIiArIG1DdXJyZW50U3RhdGUubmFtZSgpOworCisgICAgICAgIGlmIChtVGVzdHNMaXN0LmlzRW1wdHkoKSkgeworICAgICAgICAgICAgb25BbGxUZXN0c0ZpbmlzaGVkKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBtQ3VycmVudFRlc3RSZWxhdGl2ZVBhdGggPSBtVGVzdHNMaXN0LnJlbW92ZSgwKTsKKyAgICAgICAgTG9nLmQoTE9HX1RBRyArICI6OnJ1bk5leHRUZXN0IiwgIlN0YXJ0OiAiICsgbUN1cnJlbnRUZXN0UmVsYXRpdmVQYXRoICsKKyAgICAgICAgICAgICAgICAiKCIgKyBtQ3VycmVudFRlc3RJbmRleCArICIpIik7CisgICAgICAgIG1DdXJyZW50VGVzdFVyaSA9CisgICAgICAgICAgICAgICAgVXJpLmZyb21GaWxlKG5ldyBGaWxlKFRFU1RTX1JPT1RfRElSX1BBVEgsIG1DdXJyZW50VGVzdFJlbGF0aXZlUGF0aCkpLnRvU3RyaW5nKCk7CisKKyAgICAgICAgcmVzZXQoKTsKKworICAgICAgICAvKiogU3RhcnQgdGltZS1vdXQgY291bnRkb3duIGFuZCB0aGUgdGVzdCAqLworICAgICAgICBtQ3VycmVudFN0YXRlID0gQ3VycmVudFN0YXRlLlJFTkRFUklOR19QQUdFOworICAgICAgICBtUmVzdWx0SGFuZGxlci5zZW5kRW1wdHlNZXNzYWdlRGVsYXllZChNU0dfVEVTVF9USU1FRF9PVVQsIERFRkFVTFRfVElNRV9PVVRfTVMpOworICAgICAgICBtQ3VycmVudFdlYlZpZXcubG9hZFVybChtQ3VycmVudFRlc3RVcmkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBvblRlc3RUaW1lZE91dCgpIHsKKyAgICAgICAgYXNzZXJ0IG1DdXJyZW50U3RhdGUuaXNSdW5uaW5nU3RhdGUoKSA6ICJtQ3VycmVudFN0YXRlID0gIiArIG1DdXJyZW50U3RhdGUubmFtZSgpOworCisgICAgICAgIG1DdXJyZW50VGVzdFRpbWVkT3V0ID0gdHJ1ZTsKKworICAgICAgICAvKioKKyAgICAgICAgICogV2hpbGUgaXQgaXMgdGhlb3JldGljYWxseSBwb3NzaWJsZSB0aGF0IHRoZSB0ZXN0IHRpbWVzIG91dCBiZWNhdXNlCisgICAgICAgICAqIG9mIHdlYnZpZXcgYmVjb21pbmcgdW5yZXNwb25zaXZlLCBpdCBpcyB2ZXJ5IHVubGlrZWx5LiBUaGVyZWZvcmUgaXQncworICAgICAgICAgKiBhc3N1bWVkIHRoYXQgb2J0YWluaW5nIHJlc3VsdHMgKHRoYXQgY2FsbHMgdmFyaW91cyB3ZWJ2aWV3IG1ldGhvZHMpCisgICAgICAgICAqIHdpbGwgbm90IGl0c2VsZiBoYW5nLgorICAgICAgICAgKi8KKyAgICAgICAgb2J0YWluQWN0dWFsUmVzdWx0c0Zyb21XZWJWaWV3KCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIG9uVGVzdEZpbmlzaGVkKCkgeworICAgICAgICBhc3NlcnQgbUN1cnJlbnRTdGF0ZS5pc1J1bm5pbmdTdGF0ZSgpIDogIm1DdXJyZW50U3RhdGUgPSAiICsgbUN1cnJlbnRTdGF0ZS5uYW1lKCk7CisKKyAgICAgICAgb2J0YWluQWN0dWFsUmVzdWx0c0Zyb21XZWJWaWV3KCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIG9idGFpbkFjdHVhbFJlc3VsdHNGcm9tV2ViVmlldygpIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIElmIHRoZSByZXN1bHQgaGFzIG5vdCBiZWVuIHNldCBieSB0aGUgdGltZSB0aGUgdGVzdCBmaW5pc2hlcyB3ZSBjcmVhdGUKKyAgICAgICAgICogYSBkZWZhdWx0IHR5cGUgb2YgcmVzdWx0LgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKG1DdXJyZW50UmVzdWx0ID09IG51bGwpIHsKKyAgICAgICAgICAgIC8qKiBUT0RPOiBEZWZhdWx0IHR5cGUgc2hvdWxkIGJlIFJlbmRlclRyZWVSZXN1bHQuIFdlIGRvbid0IHN1cHBvcnQgaXQgbm93LiAqLworICAgICAgICAgICAgbUN1cnJlbnRSZXN1bHQgPSBuZXcgVGV4dFJlc3VsdChtQ3VycmVudFRlc3RSZWxhdGl2ZVBhdGgpOworICAgICAgICB9CisKKyAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IEN1cnJlbnRTdGF0ZS5PQlRBSU5JTkdfUkVTVUxUOworCisgICAgICAgIG1DdXJyZW50UmVzdWx0Lm9idGFpbkFjdHVhbFJlc3VsdHMobUN1cnJlbnRXZWJWaWV3LAorICAgICAgICAgICAgICAgIG1SZXN1bHRIYW5kbGVyLm9idGFpbk1lc3NhZ2UoTVNHX0FDVFVBTF9SRVNVTFRfT0JUQUlORUQpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgb25BY3R1YWxSZXN1bHRzT2J0YWluZWQoKSB7CisgICAgICAgIGFzc2VydCBtQ3VycmVudFN0YXRlID09IEN1cnJlbnRTdGF0ZS5PQlRBSU5JTkdfUkVTVUxUCisgICAgICAgICAgICAgICAgOiAibUN1cnJlbnRTdGF0ZSA9ICIgKyBtQ3VycmVudFN0YXRlLm5hbWUoKTsKKworICAgICAgICBtQ3VycmVudFN0YXRlID0gQ3VycmVudFN0YXRlLklETEU7CisKKyAgICAgICAgbVJlc3VsdEhhbmRsZXIucmVtb3ZlTWVzc2FnZXMoTVNHX1RFU1RfVElNRURfT1VUKTsKKyAgICAgICAgcmVwb3J0UmVzdWx0VG9TZXJ2aWNlKCk7CisgICAgICAgIG1DdXJyZW50VGVzdEluZGV4Kys7CisgICAgICAgIHVwZGF0ZVByb2dyZXNzQmFyKCk7CisgICAgICAgIHJ1bk5leHRUZXN0KCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJlcG9ydFJlc3VsdFRvU2VydmljZSgpIHsKKyAgICAgICAgaWYgKG1DdXJyZW50QWRkaXRpb25hbFRleHRPdXRwdXQgIT0gbnVsbCkgeworICAgICAgICAgICAgbUN1cnJlbnRSZXN1bHQuc2V0QWRkaXRpb25hbFRleHRPdXRwdXRTdHJpbmcobUN1cnJlbnRBZGRpdGlvbmFsVGV4dE91dHB1dC50b1N0cmluZygpKTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBNZXNzYWdlIHNlcnZpY2VNc2cgPQorICAgICAgICAgICAgICAgICAgICBNZXNzYWdlLm9idGFpbihudWxsLCBNYW5hZ2VyU2VydmljZS5NU0dfUFJPQ0VTU19BQ1RVQUxfUkVTVUxUUyk7CisKKyAgICAgICAgICAgIEJ1bmRsZSBidW5kbGUgPSBtQ3VycmVudFJlc3VsdC5nZXRCdW5kbGUoKTsKKyAgICAgICAgICAgIGJ1bmRsZS5wdXRJbnQoInRlc3RJbmRleCIsIG1DdXJyZW50VGVzdEluZGV4KTsKKyAgICAgICAgICAgIGlmIChtQ3VycmVudFRlc3RUaW1lZE91dCkgeworICAgICAgICAgICAgICAgIGJ1bmRsZS5wdXRTdHJpbmcoInJlc3VsdENvZGUiLCBBYnN0cmFjdFJlc3VsdC5SZXN1bHRDb2RlLkZBSUxfVElNRURfT1VULm5hbWUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIW1UZXN0c0xpc3QuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgYnVuZGxlLnB1dFN0cmluZygibmV4dFRlc3QiLCBtVGVzdHNMaXN0LmdldCgwKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNlcnZpY2VNc2cuc2V0RGF0YShidW5kbGUpOworICAgICAgICAgICAgbU1hbmFnZXJTZXJ2aWNlTWVzc2VuZ2VyLnNlbmQoc2VydmljZU1zZyk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShMT0dfVEFHICsgIjo6cmVwb3J0UmVzdWx0VG9TZXJ2aWNlIiwgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVByb2dyZXNzQmFyKCkgeworICAgICAgICBnZXRXaW5kb3coKS5zZXRGZWF0dXJlSW50KFdpbmRvdy5GRUFUVVJFX1BST0dSRVNTLAorICAgICAgICAgICAgICAgIG1DdXJyZW50VGVzdEluZGV4ICogV2luZG93LlBST0dSRVNTX0VORCAvIG1Ub3RhbFRlc3RDb3VudCk7CisgICAgICAgIHNldFRpdGxlKG1DdXJyZW50VGVzdEluZGV4ICogMTAwIC8gbVRvdGFsVGVzdENvdW50ICsgIiUgIiArCisgICAgICAgICAgICAgICAgIigiICsgbUN1cnJlbnRUZXN0SW5kZXggKyAiLyIgKyBtVG90YWxUZXN0Q291bnQgKyAiKSIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBvbkFsbFRlc3RzRmluaXNoZWQoKSB7CisgICAgICAgIG1TY3JlZW5EaW1Mb2NrLnJlbGVhc2UoKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgTWVzc2FnZSBzZXJ2aWNlTXNnID0KKyAgICAgICAgICAgICAgICAgICAgTWVzc2FnZS5vYnRhaW4obnVsbCwgTWFuYWdlclNlcnZpY2UuTVNHX0FMTF9URVNUU19GSU5JU0hFRCk7CisgICAgICAgICAgICBtTWFuYWdlclNlcnZpY2VNZXNzZW5nZXIuc2VuZChzZXJ2aWNlTXNnKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKExPR19UQUcgKyAiOjpvbkFsbFRlc3RzRmluaXNoZWQiLCBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgICAgICB1bmJpbmRTZXJ2aWNlKG1TZXJ2aWNlQ29ubmVjdGlvbik7CisgICAgfQorCisgICAgcHJpdmF0ZSBBZGRpdGlvbmFsVGV4dE91dHB1dCBnZXRDdXJyZW50QWRkaXRpb25hbFRleHRPdXRwdXQoKSB7CisgICAgICAgIGlmIChtQ3VycmVudEFkZGl0aW9uYWxUZXh0T3V0cHV0ID09IG51bGwpIHsKKyAgICAgICAgICAgIG1DdXJyZW50QWRkaXRpb25hbFRleHRPdXRwdXQgPSBuZXcgQWRkaXRpb25hbFRleHRPdXRwdXQoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbUN1cnJlbnRBZGRpdGlvbmFsVGV4dE91dHB1dDsKKyAgICB9CisKKyAgICAvKiogTEFZT1VUIFRFU1QgQ09OVFJPTExFUiAqLworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19XQUlUX1VOVElMX0RPTkUgPSAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfTk9USUZZX0RPTkUgPSAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfRFVNUF9BU19URVhUID0gMjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0RVTVBfQ0hJTERfRlJBTUVTX0FTX1RFWFQgPSAzOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfU0VUX0NBTl9PUEVOX1dJTkRPV1MgPSA0OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfRFVNUF9EQVRBQkFTRV9DQUxMQkFDS1MgPSA1OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfU0VUX0dFT0xPQ0FUSU9OX1BFUk1JU1NJT04gPSA2OworCisgICAgSGFuZGxlciBtTGF5b3V0VGVzdENvbnRyb2xsZXJIYW5kbGVyID0gbmV3IEhhbmRsZXIoKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7CisgICAgICAgICAgICBhc3NlcnQgbUN1cnJlbnRTdGF0ZS5pc1J1bm5pbmdTdGF0ZSgpIDogIm1DdXJyZW50U3RhdGUgPSAiICsgbUN1cnJlbnRTdGF0ZS5uYW1lKCk7CisKKyAgICAgICAgICAgIHN3aXRjaCAobXNnLndoYXQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19XQUlUX1VOVElMX0RPTkU6CisgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50U3RhdGUgPSBDdXJyZW50U3RhdGUuV0FJVElOR19GT1JfQVNZTkNIUk9OT1VTX1RFU1Q7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBNU0dfTk9USUZZX0RPTkU6CisgICAgICAgICAgICAgICAgICAgIGlmIChtQ3VycmVudFN0YXRlID09IEN1cnJlbnRTdGF0ZS5XQUlUSU5HX0ZPUl9BU1lOQ0hST05PVVNfVEVTVCkgeworICAgICAgICAgICAgICAgICAgICAgICAgb25UZXN0RmluaXNoZWQoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgTVNHX0RVTVBfQVNfVEVYVDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1DdXJyZW50UmVzdWx0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50UmVzdWx0ID0gbmV3IFRleHRSZXN1bHQobUN1cnJlbnRUZXN0UmVsYXRpdmVQYXRoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGFzc2VydCBtQ3VycmVudFJlc3VsdCBpbnN0YW5jZW9mIFRleHRSZXN1bHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJtQ3VycmVudFJlc3VsdCBpbnN0YW5jZW9mIiArIG1DdXJyZW50UmVzdWx0LmdldENsYXNzKCkuZ2V0TmFtZSgpOworCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBNU0dfRFVNUF9DSElMRF9GUkFNRVNfQVNfVEVYVDoKKyAgICAgICAgICAgICAgICAgICAgLyoqIElmIGR1bXBBc1RleHQgd2FzIG5vdCBjYWxsZWQgd2UgYXNzdW1lIHRoYXQgdGhlIHJlc3VsdCBzaG91bGQgYmUgdGV4dCAqLworICAgICAgICAgICAgICAgICAgICBpZiAobUN1cnJlbnRSZXN1bHQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRSZXN1bHQgPSBuZXcgVGV4dFJlc3VsdChtQ3VycmVudFRlc3RSZWxhdGl2ZVBhdGgpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IG1DdXJyZW50UmVzdWx0IGluc3RhbmNlb2YgVGV4dFJlc3VsdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogIm1DdXJyZW50UmVzdWx0IGluc3RhbmNlb2YiICsgbUN1cnJlbnRSZXN1bHQuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7CisKKyAgICAgICAgICAgICAgICAgICAgKChUZXh0UmVzdWx0KW1DdXJyZW50UmVzdWx0KS5zZXREdW1wQ2hpbGRGcmFtZXNBc1RleHQodHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBNU0dfU0VUX0NBTl9PUEVOX1dJTkRPV1M6CisgICAgICAgICAgICAgICAgICAgIG1DYW5PcGVuV2luZG93cyA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBNU0dfRFVNUF9EQVRBQkFTRV9DQUxMQkFDS1M6CisgICAgICAgICAgICAgICAgICAgIG1EdW1wRGF0YWJhc2VDYWxsYmFja3MgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgTVNHX1NFVF9HRU9MT0NBVElPTl9QRVJNSVNTSU9OOgorICAgICAgICAgICAgICAgICAgICBtSXNHZW9sb2NhdGlvblBlcm1pc3Npb25TZXQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBtR2VvbG9jYXRpb25QZXJtaXNzaW9uID0gbXNnLmFyZzEgPT0gMTsKKworICAgICAgICAgICAgICAgICAgICBpZiAobVBlbmRpbmdHZW9sb2NhdGlvblBlcm1pc3Npb25DYWxsYmFja3MgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgSXRlcmF0b3IgaXRlciA9IG1QZW5kaW5nR2VvbG9jYXRpb25QZXJtaXNzaW9uQ2FsbGJhY2tzLmtleVNldCgpLml0ZXJhdG9yKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZW9sb2NhdGlvblBlcm1pc3Npb25zLkNhbGxiYWNrIGNhbGxiYWNrID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChHZW9sb2NhdGlvblBlcm1pc3Npb25zLkNhbGxiYWNrKSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgb3JpZ2luID0gKFN0cmluZykgbVBlbmRpbmdHZW9sb2NhdGlvblBlcm1pc3Npb25DYWxsYmFja3MuZ2V0KGNhbGxiYWNrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5pbnZva2Uob3JpZ2luLCBtR2VvbG9jYXRpb25QZXJtaXNzaW9uLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBtUGVuZGluZ0dlb2xvY2F0aW9uUGVybWlzc2lvbkNhbGxiYWNrcyA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBMb2cudyhMT0dfVEFHICsgIjo6aGFuZGxlTWVzc2FnZSIsICJNZXNzYWdlIGNvZGUgZG9lcyBub3QgZXhpc3Q6ICIgKyBtc2cud2hhdCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsKKworICAgIHByaXZhdGUgdm9pZCByZXNldExheW91dFRlc3RDb250cm9sbGVyKCkgeworICAgICAgICBtQ2FuT3BlbldpbmRvd3MgPSBmYWxzZTsKKyAgICAgICAgbUR1bXBEYXRhYmFzZUNhbGxiYWNrcyA9IGZhbHNlOworICAgICAgICBtSXNHZW9sb2NhdGlvblBlcm1pc3Npb25TZXQgPSBmYWxzZTsKKyAgICAgICAgbVBlbmRpbmdHZW9sb2NhdGlvblBlcm1pc3Npb25DYWxsYmFja3MgPSBudWxsOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdhaXRVbnRpbERvbmUoKSB7CisgICAgICAgIExvZy53KExPR19UQUcgKyAiOjp3YWl0VW50aWxEb25lIiwgImNhbGxlZCIpOworICAgICAgICBtTGF5b3V0VGVzdENvbnRyb2xsZXJIYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2UoTVNHX1dBSVRfVU5USUxfRE9ORSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbm90aWZ5RG9uZSgpIHsKKyAgICAgICAgTG9nLncoTE9HX1RBRyArICI6Om5vdGlmeURvbmUiLCAiY2FsbGVkIik7CisgICAgICAgIG1MYXlvdXRUZXN0Q29udHJvbGxlckhhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZShNU0dfTk9USUZZX0RPTkUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGR1bXBBc1RleHQoYm9vbGVhbiBlbmFibGVQaXhlbFRlc3QpIHsKKyAgICAgICAgTG9nLncoTE9HX1RBRyArICI6OmR1bXBBc1RleHQoIiArIGVuYWJsZVBpeGVsVGVzdCArICIpIiwgImNhbGxlZCIpOworICAgICAgICAvKiogVE9ETzogSW1wbGVtZW50ICovCisgICAgICAgIGlmIChlbmFibGVQaXhlbFRlc3QpIHsKKyAgICAgICAgICAgIExvZy53KExPR19UQUcgKyAiOjpkdW1wQXNUZXh0IiwgImVuYWJsZVBpeGVsVGVzdCBub3QgaW1wbGVtZW50ZWQsIHN3aXRjaGluZyB0byBmYWxzZSIpOworICAgICAgICB9CisgICAgICAgIG1MYXlvdXRUZXN0Q29udHJvbGxlckhhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZShNU0dfRFVNUF9BU19URVhUKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBkdW1wQ2hpbGRGcmFtZXNBc1RleHQoKSB7CisgICAgICAgIExvZy53KExPR19UQUcgKyAiOjpkdW1wQ2hpbGRGcmFtZXNBc1RleHQiLCAiY2FsbGVkIik7CisgICAgICAgIG1MYXlvdXRUZXN0Q29udHJvbGxlckhhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZShNU0dfRFVNUF9DSElMRF9GUkFNRVNfQVNfVEVYVCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q2FuT3BlbldpbmRvd3MoKSB7CisgICAgICAgIExvZy53KExPR19UQUcgKyAiOjpzZXRDYW5PcGVuV2luZG93cyIsICJjYWxsZWQiKTsKKyAgICAgICAgbUxheW91dFRlc3RDb250cm9sbGVySGFuZGxlci5zZW5kRW1wdHlNZXNzYWdlKE1TR19TRVRfQ0FOX09QRU5fV0lORE9XUyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZHVtcERhdGFiYXNlQ2FsbGJhY2tzKCkgeworICAgICAgICBMb2cudyhMT0dfVEFHICsgIjo6ZHVtcERhdGFiYXNlQ2FsbGJhY2tzOiIsICJjYWxsZWQiKTsKKyAgICAgICAgbUxheW91dFRlc3RDb250cm9sbGVySGFuZGxlci5zZW5kRW1wdHlNZXNzYWdlKE1TR19EVU1QX0RBVEFCQVNFX0NBTExCQUNLUyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0R2VvbG9jYXRpb25QZXJtaXNzaW9uKGJvb2xlYW4gYWxsb3cpIHsKKyAgICAgICAgTG9nLncoTE9HX1RBRyArICI6OnNldEdlb2xvY2F0aW9uUGVybWlzc2lvbiIsICJjYWxsZWQiKTsKKyAgICAgICAgTWVzc2FnZSBtc2cgPSBtTGF5b3V0VGVzdENvbnRyb2xsZXJIYW5kbGVyLm9idGFpbk1lc3NhZ2UoTVNHX1NFVF9HRU9MT0NBVElPTl9QRVJNSVNTSU9OKTsKKyAgICAgICAgbXNnLmFyZzEgPSBhbGxvdyA/IDEgOiAwOworICAgICAgICBtc2cuc2VuZFRvVGFyZ2V0KCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TW9ja0RldmljZU9yaWVudGF0aW9uKGJvb2xlYW4gY2FuUHJvdmlkZUFscGhhLCBkb3VibGUgYWxwaGEsCisgICAgICAgICAgICBib29sZWFuIGNhblByb3ZpZGVCZXRhLCBkb3VibGUgYmV0YSwgYm9vbGVhbiBjYW5Qcm92aWRlR2FtbWEsIGRvdWJsZSBnYW1tYSkgeworICAgICAgICBtQ3VycmVudFdlYlZpZXcuc2V0TW9ja0RldmljZU9yaWVudGF0aW9uKGNhblByb3ZpZGVBbHBoYSwgYWxwaGEsIGNhblByb3ZpZGVCZXRhLCBiZXRhLAorICAgICAgICAgICAgICAgIGNhblByb3ZpZGVHYW1tYSwgZ2FtbWEpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL01hbmFnZXJTZXJ2aWNlLmphdmEgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9NYW5hZ2VyU2VydmljZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxMDI2ZDYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9NYW5hZ2VyU2VydmljZS5qYXZhCkBAIC0wLDAgKzEsMjQ5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5kdW1wcmVuZGVydHJlZTI7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5TZXJ2aWNlOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5FbnZpcm9ubWVudDsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLm9zLk1lc3NlbmdlcjsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogQSBzZXJ2aWNlIHRoYXQgaGFuZGxlcyBtYW5hZ2luZyB0aGUgcmVzdWx0cyBvZiB0ZXN0cywgaW5mb3JtaW5nIG9mIGNyYXNoZXMsIGdlbmVyYXRpbmcKKyAqIHN1bW1hcmllcywgZXRjLgorICovCitwdWJsaWMgY2xhc3MgTWFuYWdlclNlcnZpY2UgZXh0ZW5kcyBTZXJ2aWNlIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIk1hbmFnZXJTZXJ2aWNlIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfVEVTVF9DUkFTSEVEID0gMDsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDUkFTSF9USU1FT1VUX01TID0gMjAgKiAxMDAwOworCisgICAgLyoqIFRPRE86IG1ha2UgaXQgYSBzZXR0aW5nICovCisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUU19ST09UX0RJUl9QQVRIID0KKyAgICAgICAgICAgIEVudmlyb25tZW50LmdldEV4dGVybmFsU3RvcmFnZURpcmVjdG9yeSgpICsKKyAgICAgICAgICAgIEZpbGUuc2VwYXJhdG9yICsgImFuZHJvaWQiICsKKyAgICAgICAgICAgIEZpbGUuc2VwYXJhdG9yICsgIkxheW91dFRlc3RzIjsKKworICAgIC8qKiBUT0RPOiBtYWtlIGl0IGEgc2V0dGluZyAqLworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTVUxUU19ST09UX0RJUl9QQVRIID0KKyAgICAgICAgICAgIEVudmlyb25tZW50LmdldEV4dGVybmFsU3RvcmFnZURpcmVjdG9yeSgpICsKKyAgICAgICAgICAgIEZpbGUuc2VwYXJhdG9yICsgImFuZHJvaWQiICsKKyAgICAgICAgICAgIEZpbGUuc2VwYXJhdG9yICsgIkxheW91dFRlc3RzLXJlc3VsdHMiOworCisgICAgLyoqIFRPRE86IE1ha2UgaXQgYSBzZXR0aW5nICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTGlzdDxTdHJpbmc+IEVYUEVDVEVEX1JFU1VMVF9MT0NBVElPTl9SRUxBVElWRV9ESVJfUFJFRklYRVMgPQorICAgICAgICAgICAgbmV3IEFycmF5TGlzdDxTdHJpbmc+KDMpOworICAgIHsKKyAgICAgICAgRVhQRUNURURfUkVTVUxUX0xPQ0FUSU9OX1JFTEFUSVZFX0RJUl9QUkVGSVhFUy5hZGQoInBsYXRmb3JtIiArIEZpbGUuc2VwYXJhdG9yICsKKyAgICAgICAgICAgICAgICAiYW5kcm9pZC12OCIgKyBGaWxlLnNlcGFyYXRvcik7CisgICAgICAgIEVYUEVDVEVEX1JFU1VMVF9MT0NBVElPTl9SRUxBVElWRV9ESVJfUFJFRklYRVMuYWRkKCJwbGF0Zm9ybSIgKyBGaWxlLnNlcGFyYXRvciArCisgICAgICAgICAgICAgICAgImFuZHJvaWQiICsgRmlsZS5zZXBhcmF0b3IpOworICAgICAgICBFWFBFQ1RFRF9SRVNVTFRfTE9DQVRJT05fUkVMQVRJVkVfRElSX1BSRUZJWEVTLmFkZCgiIik7CisgICAgfQorCisgICAgLyoqIFRPRE86IE1ha2UgdGhlc2Ugc2V0dGluZ3MgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9SRVNVTFRfRVhURU5TSU9OID0gInR4dCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElNQUdFX1JFU1VMVF9FWFRFTlNJT04gPSAicG5nIjsKKworICAgIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1BST0NFU1NfQUNUVUFMX1JFU1VMVFMgPSAwOworICAgIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0FMTF9URVNUU19GSU5JU0hFRCA9IDE7CisgICAgc3RhdGljIGZpbmFsIGludCBNU0dfRklSU1RfVEVTVCA9IDI7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGhhbmRsZXIgaXMgcHVyZWx5IGZvciBJUEMuIEl0IGlzIHVzZWQgdG8gY3JlYXRlIG1NZXNzZW5nZXIKKyAgICAgKiB0aGF0IGdlbmVyYXRlcyBhIGJpbmRlciByZXR1cm5lZCBpbiBvbkJpbmQgbWV0aG9kLgorICAgICAqLworICAgIHByaXZhdGUgSGFuZGxlciBtSW5jb21pbmdIYW5kbGVyID0gbmV3IEhhbmRsZXIoKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7CisgICAgICAgICAgICBzd2l0Y2ggKG1zZy53aGF0KSB7CisgICAgICAgICAgICAgICAgY2FzZSBNU0dfRklSU1RfVEVTVDoKKyAgICAgICAgICAgICAgICAgICAgbVN1bW1hcml6ZXIucmVzZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgQnVuZGxlIGJ1bmRsZSA9IG1zZy5nZXREYXRhKCk7CisgICAgICAgICAgICAgICAgICAgIGVuc3VyZU5leHRUZXN0U2V0dXAoYnVuZGxlLmdldFN0cmluZygiZmlyc3RUZXN0IiksIGJ1bmRsZS5nZXRJbnQoImluZGV4IikpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgTVNHX1BST0NFU1NfQUNUVUFMX1JFU1VMVFM6CisgICAgICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcgKyAiLm1JbmNvbWluZ0hhbmRsZXIiLCBtc2cuZ2V0RGF0YSgpLmdldFN0cmluZygicmVsYXRpdmVQYXRoIikpOworICAgICAgICAgICAgICAgICAgICBvbkFjdHVhbFJlc3VsdHNPYnRhaW5lZChtc2cuZ2V0RGF0YSgpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19BTExfVEVTVFNfRklOSVNIRUQ6CisgICAgICAgICAgICAgICAgICAgIG1TdW1tYXJpemVyLnNldFRlc3RzUmVsYXRpdmVQYXRoKG1BbGxUZXN0c1JlbGF0aXZlUGF0aCk7CisgICAgICAgICAgICAgICAgICAgIG1TdW1tYXJpemVyLnN1bW1hcml6ZSgpOworICAgICAgICAgICAgICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChNYW5hZ2VyU2VydmljZS50aGlzLCBUZXN0c0xpc3RBY3Rpdml0eS5jbGFzcyk7CisgICAgICAgICAgICAgICAgICAgIGludGVudC5zZXRBY3Rpb24oSW50ZW50LkFDVElPTl9TSFVURE9XTik7CisgICAgICAgICAgICAgICAgICAgIC8qKiBUaGlzIGZsYWcgaXMgbmVlZGVkIGJlY2F1c2Ugd2Ugc2VuZCB0aGUgaW50ZW50IGZyb20gdGhlIHNlcnZpY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgaW50ZW50LmFkZEZsYWdzKEludGVudC5GTEFHX0FDVElWSVRZX05FV19UQVNLKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhcnRBY3Rpdml0eShpbnRlbnQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH07CisKKyAgICBwcml2YXRlIE1lc3NlbmdlciBtTWVzc2VuZ2VyID0gbmV3IE1lc3NlbmdlcihtSW5jb21pbmdIYW5kbGVyKTsKKworICAgIHByaXZhdGUgSGFuZGxlciBtQ3Jhc2hNZXNzYWdlc0hhbmRsZXIgPSBuZXcgSGFuZGxlcigpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKKyAgICAgICAgICAgIGlmIChtc2cud2hhdCA9PSBNU0dfVEVTVF9DUkFTSEVEKSB7CisgICAgICAgICAgICAgICAgb25UZXN0Q3Jhc2hlZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsKKworICAgIHByaXZhdGUgRmlsZUZpbHRlciBtRmlsZUZpbHRlcjsKKyAgICBwcml2YXRlIFN1bW1hcml6ZXIgbVN1bW1hcml6ZXI7CisKKyAgICBwcml2YXRlIFN0cmluZyBtQ3VycmVudGx5UnVubmluZ1Rlc3Q7CisgICAgcHJpdmF0ZSBpbnQgbUN1cnJlbnRseVJ1bm5pbmdUZXN0SW5kZXg7CisKKyAgICBwcml2YXRlIFN0cmluZyBtQWxsVGVzdHNSZWxhdGl2ZVBhdGg7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZSgpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoKTsKKworICAgICAgICBtRmlsZUZpbHRlciA9IG5ldyBGaWxlRmlsdGVyKFRFU1RTX1JPT1RfRElSX1BBVEgpOworICAgICAgICBtU3VtbWFyaXplciA9IG5ldyBTdW1tYXJpemVyKG1GaWxlRmlsdGVyLCBSRVNVTFRTX1JPT1RfRElSX1BBVEgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgb25TdGFydENvbW1hbmQoSW50ZW50IGludGVudCwgaW50IGZsYWdzLCBpbnQgc3RhcnRJZCkgeworICAgICAgICBtQWxsVGVzdHNSZWxhdGl2ZVBhdGggPSBpbnRlbnQuZ2V0U3RyaW5nRXh0cmEoInBhdGgiKTsKKyAgICAgICAgYXNzZXJ0IG1BbGxUZXN0c1JlbGF0aXZlUGF0aCAhPSBudWxsOworICAgICAgICByZXR1cm4gU1RBUlRfU1RJQ0tZOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBJQmluZGVyIG9uQmluZChJbnRlbnQgaW50ZW50KSB7CisgICAgICAgIHJldHVybiBtTWVzc2VuZ2VyLmdldEJpbmRlcigpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBvbkFjdHVhbFJlc3VsdHNPYnRhaW5lZChCdW5kbGUgYnVuZGxlKSB7CisgICAgICAgIG1DcmFzaE1lc3NhZ2VzSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhNU0dfVEVTVF9DUkFTSEVEKTsKKyAgICAgICAgZW5zdXJlTmV4dFRlc3RTZXR1cChidW5kbGUuZ2V0U3RyaW5nKCJuZXh0VGVzdCIpLCBidW5kbGUuZ2V0SW50KCJ0ZXN0SW5kZXgiKSArIDEpOworCisgICAgICAgIEFic3RyYWN0UmVzdWx0IHJlc3VsdHMgPQorICAgICAgICAgICAgICAgIEFic3RyYWN0UmVzdWx0LlRlc3RUeXBlLnZhbHVlT2YoYnVuZGxlLmdldFN0cmluZygidHlwZSIpKS5jcmVhdGVSZXN1bHQoYnVuZGxlKTsKKworICAgICAgICBoYW5kbGVSZXN1bHRzKHJlc3VsdHMpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBlbnN1cmVOZXh0VGVzdFNldHVwKFN0cmluZyBuZXh0VGVzdCwgaW50IGluZGV4KSB7CisgICAgICAgIGlmIChuZXh0VGVzdCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBtQ3VycmVudGx5UnVubmluZ1Rlc3QgPSBuZXh0VGVzdDsKKyAgICAgICAgbUN1cnJlbnRseVJ1bm5pbmdUZXN0SW5kZXggPSBpbmRleDsKKyAgICAgICAgbUNyYXNoTWVzc2FnZXNIYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2VEZWxheWVkKE1TR19URVNUX0NSQVNIRUQsIENSQVNIX1RJTUVPVVRfTVMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgc2VuZHMgYW4gaW50ZW50IHRvIFRlc3RzTGlzdEFjdGl2aXR5IHRvIHJlc3RhcnQgTGF5b3V0VGVzdHNFeGVjdXRvci4KKyAgICAgKiBUaGUgbW9yZSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiB0aGUgZmxvdyBpcyBpbiB0aGUgY29tbWVudCBvZiBvbk5ld0ludGVudAorICAgICAqIG1ldGhvZCBpbiBUZXN0c0xpc3RBY3Rpdml0eS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgb25UZXN0Q3Jhc2hlZCgpIHsKKyAgICAgICAgaGFuZGxlUmVzdWx0cyhuZXcgQ3Jhc2hlZER1bW15UmVzdWx0KG1DdXJyZW50bHlSdW5uaW5nVGVzdCkpOworCisgICAgICAgIExvZy53KExPR19UQUcgKyAiOjpvblRlc3RDcmFzaGVkIiwgbUN1cnJlbnRseVJ1bm5pbmdUZXN0ICsKKyAgICAgICAgICAgICAgICAiKCIgKyBtQ3VycmVudGx5UnVubmluZ1Rlc3RJbmRleCArICIpIik7CisKKyAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQodGhpcywgVGVzdHNMaXN0QWN0aXZpdHkuY2xhc3MpOworICAgICAgICBpbnRlbnQuc2V0QWN0aW9uKEludGVudC5BQ1RJT05fUkVCT09UKTsKKyAgICAgICAgLyoqIFRoaXMgZmxhZyBpcyBuZWVkZWQgYmVjYXVzZSB3ZSBzZW5kIHRoZSBpbnRlbnQgZnJvbSB0aGUgc2VydmljZSAqLworICAgICAgICBpbnRlbnQuYWRkRmxhZ3MoSW50ZW50LkZMQUdfQUNUSVZJVFlfTkVXX1RBU0spOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoImNyYXNoZWRUZXN0SW5kZXgiLCBtQ3VycmVudGx5UnVubmluZ1Rlc3RJbmRleCk7CisgICAgICAgIHN0YXJ0QWN0aXZpdHkoaW50ZW50KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaGFuZGxlUmVzdWx0cyhBYnN0cmFjdFJlc3VsdCByZXN1bHRzKSB7CisgICAgICAgIFN0cmluZyByZWxhdGl2ZVBhdGggPSByZXN1bHRzLmdldFJlbGF0aXZlUGF0aCgpOworICAgICAgICByZXN1bHRzLnNldEV4cGVjdGVkVGV4dFJlc3VsdChnZXRFeHBlY3RlZFRleHRSZXN1bHQocmVsYXRpdmVQYXRoKSk7CisgICAgICAgIHJlc3VsdHMuc2V0RXhwZWN0ZWRJbWFnZVJlc3VsdChnZXRFeHBlY3RlZEltYWdlUmVzdWx0KHJlbGF0aXZlUGF0aCkpOworCisgICAgICAgIGR1bXBBY3R1YWxUZXh0UmVzdWx0KHJlc3VsdHMpOworICAgICAgICBkdW1wQWN0dWFsSW1hZ2VSZXN1bHQocmVzdWx0cyk7CisKKyAgICAgICAgbVN1bW1hcml6ZXIuYXBwZW5kVGVzdChyZXN1bHRzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZHVtcEFjdHVhbFRleHRSZXN1bHQoQWJzdHJhY3RSZXN1bHQgcmVzdWx0KSB7CisgICAgICAgIFN0cmluZyB0ZXN0UGF0aCA9IHJlc3VsdC5nZXRSZWxhdGl2ZVBhdGgoKTsKKyAgICAgICAgU3RyaW5nIGFjdHVhbFRleHRSZXN1bHQgPSByZXN1bHQuZ2V0QWN0dWFsVGV4dFJlc3VsdCgpOworICAgICAgICBpZiAoYWN0dWFsVGV4dFJlc3VsdCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgcmVzdWx0UGF0aCA9IEZpbGVGaWx0ZXIuc2V0UGF0aEVuZGluZyh0ZXN0UGF0aCwgIi1hY3R1YWwuIiArIFRFWFRfUkVTVUxUX0VYVEVOU0lPTik7CisgICAgICAgIEZzVXRpbHMud3JpdGVEYXRhVG9TdG9yYWdlKG5ldyBGaWxlKFJFU1VMVFNfUk9PVF9ESVJfUEFUSCwgcmVzdWx0UGF0aCksCisgICAgICAgICAgICAgICAgYWN0dWFsVGV4dFJlc3VsdC5nZXRCeXRlcygpLCBmYWxzZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGR1bXBBY3R1YWxJbWFnZVJlc3VsdChBYnN0cmFjdFJlc3VsdCByZXN1bHQpIHsKKyAgICAgICAgU3RyaW5nIHRlc3RQYXRoID0gcmVzdWx0LmdldFJlbGF0aXZlUGF0aCgpOworICAgICAgICBieXRlW10gYWN0dWFsSW1hZ2VSZXN1bHQgPSByZXN1bHQuZ2V0QWN0dWFsSW1hZ2VSZXN1bHQoKTsKKyAgICAgICAgaWYgKGFjdHVhbEltYWdlUmVzdWx0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyByZXN1bHRQYXRoID0gRmlsZUZpbHRlci5zZXRQYXRoRW5kaW5nKHRlc3RQYXRoLAorICAgICAgICAgICAgICAgICItYWN0dWFsLiIgKyBJTUFHRV9SRVNVTFRfRVhURU5TSU9OKTsKKyAgICAgICAgRnNVdGlscy53cml0ZURhdGFUb1N0b3JhZ2UobmV3IEZpbGUoUkVTVUxUU19ST09UX0RJUl9QQVRILCByZXN1bHRQYXRoKSwKKyAgICAgICAgICAgICAgICBhY3R1YWxJbWFnZVJlc3VsdCwgZmFsc2UpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEV4cGVjdGVkVGV4dFJlc3VsdChTdHJpbmcgcmVsYXRpdmVQYXRoKSB7CisgICAgICAgIGJ5dGVbXSByZXN1bHQgPSBnZXRFeHBlY3RlZFJlc3VsdChyZWxhdGl2ZVBhdGgsIFRFWFRfUkVTVUxUX0VYVEVOU0lPTik7CisgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcocmVzdWx0KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGJ5dGVbXSBnZXRFeHBlY3RlZEltYWdlUmVzdWx0KFN0cmluZyByZWxhdGl2ZVBhdGgpIHsKKyAgICAgICAgcmV0dXJuIGdldEV4cGVjdGVkUmVzdWx0KHJlbGF0aXZlUGF0aCwgSU1BR0VfUkVTVUxUX0VYVEVOU0lPTik7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIGdldEV4cGVjdGVkUmVzdWx0KFN0cmluZyByZWxhdGl2ZVBhdGgsIFN0cmluZyBleHRlbnNpb24pIHsKKyAgICAgICAgU3RyaW5nIG9yaWdpbmFsUmVsYXRpdmVQYXRoID0KKyAgICAgICAgICAgICAgICBGaWxlRmlsdGVyLnNldFBhdGhFbmRpbmcocmVsYXRpdmVQYXRoLCAiLWV4cGVjdGVkLiIgKyBleHRlbnNpb24pOworCisgICAgICAgIGJ5dGVbXSBieXRlcyA9IG51bGw7CisgICAgICAgIExpc3Q8U3RyaW5nPiBsb2NhdGlvbnMgPSBFWFBFQ1RFRF9SRVNVTFRfTE9DQVRJT05fUkVMQVRJVkVfRElSX1BSRUZJWEVTOworCisgICAgICAgIGludCBzaXplID0gRVhQRUNURURfUkVTVUxUX0xPQ0FUSU9OX1JFTEFUSVZFX0RJUl9QUkVGSVhFUy5zaXplKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBieXRlcyA9PSBudWxsICYmIGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICAgIHJlbGF0aXZlUGF0aCA9IGxvY2F0aW9ucy5nZXQoaSkgKyBvcmlnaW5hbFJlbGF0aXZlUGF0aDsKKyAgICAgICAgICAgIGJ5dGVzID0gRnNVdGlscy5yZWFkRGF0YUZyb21TdG9yYWdlKG5ldyBGaWxlKFRFU1RTX1JPT1RfRElSX1BBVEgsIHJlbGF0aXZlUGF0aCkpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGJ5dGVzOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9TdW1tYXJpemVyLmphdmEgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9TdW1tYXJpemVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNiYzBiMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL1N1bW1hcml6ZXIuamF2YQpAQCAtMCwwICsxLDM5MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUyOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Bc3NldE1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQub3MuQnVpbGQ7CitpbXBvcnQgYW5kcm9pZC51dGlsLkRpc3BsYXlNZXRyaWNzOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0OworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5EYXRlOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOworaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOworCisvKioKKyAqIEEgY2xhc3MgdGhhdCBjb2xsZWN0cyBpbmZvcm1hdGlvbiBhYm91dCB0ZXN0cyB0aGF0IHJhbiBhbmQgY2FuIGNyZWF0ZSBIVE1MCisgKiBmaWxlcyB3aXRoIHN1bW1hcmllcyBhbmQgZWFzeSBuYXZpZ2F0aW9uLgorICovCitwdWJsaWMgY2xhc3MgU3VtbWFyaXplciB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJTdW1tYXJpemVyIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDU1MgPQorICAgICAgICAgICAgIjxzdHlsZSB0eXBlPVwidGV4dC9jc3NcIj4iICsKKyAgICAgICAgICAgICIqIHsiICsKKyAgICAgICAgICAgICIgICAgICAgZm9udC1mYW1pbHk6IFZlcmRhbmE7IiArCisgICAgICAgICAgICAiICAgICAgIGJvcmRlcjogMDsiICsKKyAgICAgICAgICAgICIgICAgICAgbWFyZ2luOiAwOyIgKworICAgICAgICAgICAgIiAgICAgICBwYWRkaW5nOiAwO30iICsKKyAgICAgICAgICAgICJib2R5IHsiICsKKyAgICAgICAgICAgICIgICAgICAgbWFyZ2luOiAxMHB4O30iICsKKyAgICAgICAgICAgICJoMSB7IiArCisgICAgICAgICAgICAiICAgICAgIGZvbnQtc2l6ZTogMjRweDsiICsKKyAgICAgICAgICAgICIgICAgICAgbWFyZ2luOiA0cHggMCA0cHggMDt9IiArCisgICAgICAgICAgICAiaDIgeyIgKworICAgICAgICAgICAgIiAgICAgICBmb250LXNpemU6MThweDsiICsKKyAgICAgICAgICAgICIgICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsiICsKKyAgICAgICAgICAgICIgICAgICAgbWFyZ2luOiAyMHB4IDAgM3B4IDA7fSIgKworICAgICAgICAgICAgImgzLCBoMyBhIHsiICsKKyAgICAgICAgICAgICIgICAgICAgZm9udC1zaXplOiAxNHB4OyIgKworICAgICAgICAgICAgIiAgICAgICBjb2xvcjogYmxhY2s7IiArCisgICAgICAgICAgICAiICAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsiICsKKyAgICAgICAgICAgICIgICAgICAgbWFyZ2luLWJvdHRvbTogNHB4O30iICsKKyAgICAgICAgICAgICJoMyBhIHNwYW4ucGF0aCB7IiArCisgICAgICAgICAgICAiICAgICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lO30iICsKKyAgICAgICAgICAgICJoMyBzcGFuLnRyaSB7IiArCisgICAgICAgICAgICAiICAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsiICsKKyAgICAgICAgICAgICIgICAgICAgZmxvYXQ6IGxlZnQ7IiArCisgICAgICAgICAgICAiICAgICAgIHdpZHRoOiAyMHB4O30iICsKKyAgICAgICAgICAgICJoMyBzcGFuLnNxciB7IiArCisgICAgICAgICAgICAiICAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsiICsKKyAgICAgICAgICAgICIgICAgICAgY29sb3I6ICM4ZWUxMDA7IiArCisgICAgICAgICAgICAiICAgICAgIGZsb2F0OiBsZWZ0OyIgKworICAgICAgICAgICAgIiAgICAgICB3aWR0aDogMjBweDt9IiArCisgICAgICAgICAgICAiaDMgaW1nIHsiICsKKyAgICAgICAgICAgICIgICAgICAgd2lkdGg6IDhweDsiICsKKyAgICAgICAgICAgICIgICAgICAgbWFyZ2luLXJpZ2h0OiA0cHg7fSIgKworICAgICAgICAgICAgImRpdi5kaWZmIHsiICsKKyAgICAgICAgICAgICIgICAgICAgbWFyZ2luLWJvdHRvbTogMjVweDt9IiArCisgICAgICAgICAgICAiZGl2LmRpZmYgYSB7IiArCisgICAgICAgICAgICAiICAgICAgIGZvbnQtc2l6ZTogMTJweDsiICsKKyAgICAgICAgICAgICIgICAgICAgY29sb3I6ICM4ODg7fSIgKworICAgICAgICAgICAgInRhYmxlLnZpc3VhbF9kaWZmIHsiICsKKyAgICAgICAgICAgICIgICAgICAgYm9yZGVyLWJvdHRvbTogMHB4IHNvbGlkOyIgKworICAgICAgICAgICAgIiAgICAgICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOyIgKworICAgICAgICAgICAgIiAgICAgICB3aWR0aDogMTAwJTsiICsKKyAgICAgICAgICAgICIgICAgICAgbWFyZ2luLWJvdHRvbTogMnB4O30iICsKKyAgICAgICAgICAgICJ0YWJsZS52aXN1YWxfZGlmZiB0ci5oZWFkZXJzIHRkIHsiICsKKyAgICAgICAgICAgICIgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkOyIgKworICAgICAgICAgICAgIiAgICAgICBib3JkZXItdG9wOiAwOyIgKworICAgICAgICAgICAgIiAgICAgICBwYWRkaW5nLWJvdHRvbTogM3B4O30iICsKKyAgICAgICAgICAgICJ0YWJsZS52aXN1YWxfZGlmZiB0ci5yZXN1bHRzIHRkIHsiICsKKyAgICAgICAgICAgICIgICAgICAgYm9yZGVyLXRvcDogMXB4IGRhc2hlZDsiICsKKyAgICAgICAgICAgICIgICAgICAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQ7IiArCisgICAgICAgICAgICAiICAgICAgIGZvbnQtc2l6ZTogMTVweDsiICsKKyAgICAgICAgICAgICIgICAgICAgdmVydGljYWwtYWxpZ246IHRvcDt9IiArCisgICAgICAgICAgICAidGFibGUudmlzdWFsX2RpZmYgdHIucmVzdWx0cyB0ZC5saW5lX2NvdW50IHsiICsKKyAgICAgICAgICAgICIgICAgICAgYmFja2dyb3VuZC1jb2xvcjojYWFhOyIgKworICAgICAgICAgICAgIiAgICAgICBtaW4td2lkdGg6MjBweDsiICsKKyAgICAgICAgICAgICIgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7IiArCisgICAgICAgICAgICAiICAgICAgIGJvcmRlci1yaWdodDogMXB4IHNvbGlkOyIgKworICAgICAgICAgICAgIiAgICAgICBib3JkZXItbGVmdDogMXB4IHNvbGlkOyIgKworICAgICAgICAgICAgIiAgICAgICBwYWRkaW5nOiAycHggMXB4IDJweCAwcHg7fSIgKworICAgICAgICAgICAgInRhYmxlLnZpc3VhbF9kaWZmIHRyLnJlc3VsdHMgdGQubGluZSB7IiArCisgICAgICAgICAgICAiICAgICAgIHBhZGRpbmc6IDJweCAwcHggMnB4IDRweDsiICsKKyAgICAgICAgICAgICIgICAgICAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQ7IiArCisgICAgICAgICAgICAiICAgICAgIHdpZHRoOiA0OS44JTt9IiArCisgICAgICAgICAgICAidGFibGUudmlzdWFsX2RpZmYgdHIuZm9vdGVycyB0ZCB7IiArCisgICAgICAgICAgICAiICAgICAgIGJvcmRlci10b3A6IDFweCBzb2xpZDsiICsKKyAgICAgICAgICAgICIgICAgICAgYm9yZGVyLWJvdHRvbTogMDt9IiArCisgICAgICAgICAgICAidGFibGUudmlzdWFsX2RpZmYgdHIgdGQuc3BhY2UgeyIgKworICAgICAgICAgICAgIiAgICAgICBib3JkZXI6IDA7IiArCisgICAgICAgICAgICAiICAgICAgIHdpZHRoOiAwLjQlfSIgKworICAgICAgICAgICAgImRpdi5zcGFjZSB7IiArCisgICAgICAgICAgICAiICAgICAgIG1hcmdpbi10b3A6NHB4O30iICsKKyAgICAgICAgICAgICJzcGFuLmVxbCB7IiArCisgICAgICAgICAgICAiICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmM2YzZjM7fSIgKworICAgICAgICAgICAgInNwYW4uZGVsIHsiICsKKyAgICAgICAgICAgICIgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmODg4ODsgfSIgKworICAgICAgICAgICAgInNwYW4uaW5zIHsiICsKKyAgICAgICAgICAgICIgICAgICAgYmFja2dyb3VuZC1jb2xvcjogIzg4ZmY4ODsgfSIgKworICAgICAgICAgICAgInNwYW4uZmFpbCB7IiArCisgICAgICAgICAgICAiICAgICAgIGNvbG9yOiByZWQ7fSIgKworICAgICAgICAgICAgInNwYW4ucGFzcyB7IiArCisgICAgICAgICAgICAiICAgICAgIGNvbG9yOiBncmVlbjt9IiArCisgICAgICAgICAgICAic3Bhbi50aW1lX291dCB7IiArCisgICAgICAgICAgICAiICAgICAgIGNvbG9yOiBvcmFuZ2U7fSIgKworICAgICAgICAgICAgInRhYmxlLnN1bW1hcnkgeyIgKworICAgICAgICAgICAgIiAgICAgICBib3JkZXI6IDFweCBzb2xpZCBibGFjazsiICsKKyAgICAgICAgICAgICIgICAgICAgbWFyZ2luLXRvcDogMjBweDt9IiArCisgICAgICAgICAgICAidGFibGUuc3VtbWFyeSB0ZCB7IiArCisgICAgICAgICAgICAiICAgICAgIHBhZGRpbmc6IDNweDt9IiArCisgICAgICAgICAgICAic3Bhbi5saXN0SXRlbSB7IiArCisgICAgICAgICAgICAiICAgICAgIGZvbnQtc2l6ZTogMTFweDsiICsKKyAgICAgICAgICAgICIgICAgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDsiICsKKyAgICAgICAgICAgICIgICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsiICsKKyAgICAgICAgICAgICIgICAgICAgcGFkZGluZzogM3B4OyIgKworICAgICAgICAgICAgIiAgICAgICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDRweDt9IiArCisgICAgICAgICAgICAic3Bhbi4iICsgQWJzdHJhY3RSZXN1bHQuUmVzdWx0Q29kZS5QQVNTLm5hbWUoKSArICJ7IiArCisgICAgICAgICAgICAiICAgICAgIGJhY2tncm91bmQtY29sb3I6ICM4ZWUxMDA7IiArCisgICAgICAgICAgICAiICAgICAgIGNvbG9yOiBibGFjazt9IiArCisgICAgICAgICAgICAic3Bhbi4iICsgQWJzdHJhY3RSZXN1bHQuUmVzdWx0Q29kZS5GQUlMX1JFU1VMVF9ESUZGRVJTLm5hbWUoKSArICJ7IiArCisgICAgICAgICAgICAiICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNjY2M7IiArCisgICAgICAgICAgICAiICAgICAgIGNvbG9yOiBibGFjazt9IiArCisgICAgICAgICAgICAic3Bhbi4iICsgQWJzdHJhY3RSZXN1bHQuUmVzdWx0Q29kZS5GQUlMX05PX0VYUEVDVEVEX1JFU1VMVC5uYW1lKCkgKyAieyIgKworICAgICAgICAgICAgIiAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjYTcwMGU0OyIgKworICAgICAgICAgICAgIiAgICAgICBjb2xvcjogI2ZmZjt9IiArCisgICAgICAgICAgICAic3Bhbi4iICsgQWJzdHJhY3RSZXN1bHQuUmVzdWx0Q29kZS5GQUlMX1RJTUVEX09VVC5uYW1lKCkgKyAieyIgKworICAgICAgICAgICAgIiAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjNjYjAwOyIgKworICAgICAgICAgICAgIiAgICAgICBjb2xvcjogYmxhY2s7fSIgKworICAgICAgICAgICAgInNwYW4uIiArIEFic3RyYWN0UmVzdWx0LlJlc3VsdENvZGUuRkFJTF9DUkFTSEVELm5hbWUoKSArICJ7IiArCisgICAgICAgICAgICAiICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNjMzAwMDA7IiArCisgICAgICAgICAgICAiICAgICAgIGNvbG9yOiAjZmZmO30iICsKKyAgICAgICAgICAgICJzcGFuLm5vTHRjIHsiICsKKyAgICAgICAgICAgICIgICAgICAgYmFja2dyb3VuZC1jb2xvcjogIzk0NDAwMDsiICsKKyAgICAgICAgICAgICIgICAgICAgY29sb3I6ICNmZmY7fSIgKworICAgICAgICAgICAgInNwYW4ubm9FdmVudFNlbmRlciB7IiArCisgICAgICAgICAgICAiICAgICAgIGJhY2tncm91bmQtY29sb3I6ICM4MTU2MDA7IiArCisgICAgICAgICAgICAiICAgICAgIGNvbG9yOiAjZmZmO30iICsKKyAgICAgICAgICAgICI8L3N0eWxlPiI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NSSVBUID0KKyAgICAgICAgICAgICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L2phdmFzY3JpcHRcIj4iICsKKyAgICAgICAgICAgICIgICAgZnVuY3Rpb24gdG9nZ2xlRGlzcGxheShpZCkgeyIgKworICAgICAgICAgICAgIiAgICAgICAgZWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTsiICsKKyAgICAgICAgICAgICIgICAgICAgIHRyaWFuZ2xlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RyaS4nICsgaWQpOyIgKworICAgICAgICAgICAgIiAgICAgICAgaWYgKGVsZW1lbnQuc3R5bGUuZGlzcGxheSA9PSAnbm9uZScpIHsiICsKKyAgICAgICAgICAgICIgICAgICAgICAgICBlbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnaW5saW5lJzsiICsKKyAgICAgICAgICAgICIgICAgICAgICAgICB0cmlhbmdsZS5pbm5lckhUTUwgPSAnJiN4MjViYzsgJzsiICsKKyAgICAgICAgICAgICIgICAgICAgIH0gZWxzZSB7IiArCisgICAgICAgICAgICAiICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOyIgKworICAgICAgICAgICAgIiAgICAgICAgICAgIHRyaWFuZ2xlLmlubmVySFRNTCA9ICcmI3gyNWI2OyAnOyIgKworICAgICAgICAgICAgIiAgICAgICAgfSIgKworICAgICAgICAgICAgIiAgICB9IiArCisgICAgICAgICAgICAiPC9zY3JpcHQ+IjsKKworICAgIC8qKiBUT0RPOiBNYWtlIGl0IGEgc2V0dGluZyAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIVE1MX0RFVEFJTFNfUkVMQVRJVkVfUEFUSCA9ICJkZXRhaWxzLmh0bWwiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUWFRfU1VNTUFSWV9SRUxBVElWRV9QQVRIID0gInN1bW1hcnkudHh0IjsKKworICAgIHByaXZhdGUgaW50IG1DcmFzaGVkVGVzdHNDb3VudCA9IDA7CisgICAgcHJpdmF0ZSBMaXN0PEFic3RyYWN0UmVzdWx0PiBtRmFpbGVkTm90SWdub3JlZFRlc3RzID0gbmV3IEFycmF5TGlzdDxBYnN0cmFjdFJlc3VsdD4oKTsKKyAgICBwcml2YXRlIExpc3Q8QWJzdHJhY3RSZXN1bHQ+IG1JZ25vcmVkVGVzdHMgPSBuZXcgQXJyYXlMaXN0PEFic3RyYWN0UmVzdWx0PigpOworICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IG1QYXNzZWROb3RJZ25vcmVkVGVzdHMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKworICAgIHByaXZhdGUgRmlsZUZpbHRlciBtRmlsZUZpbHRlcjsKKyAgICBwcml2YXRlIFN0cmluZyBtUmVzdWx0c1Jvb3REaXJQYXRoOworCisgICAgcHJpdmF0ZSBTdHJpbmcgbVRlc3RzUmVsYXRpdmVQYXRoOworCisgICAgcHJpdmF0ZSBEYXRlIG1EYXRlOworCisgICAgcHVibGljIFN1bW1hcml6ZXIoRmlsZUZpbHRlciBmaWxlRmlsdGVyLCBTdHJpbmcgcmVzdWx0c1Jvb3REaXJQYXRoKSB7CisgICAgICAgIG1GaWxlRmlsdGVyID0gZmlsZUZpbHRlcjsKKyAgICAgICAgbVJlc3VsdHNSb290RGlyUGF0aCA9IHJlc3VsdHNSb290RGlyUGF0aDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhcHBlbmRUZXN0KEFic3RyYWN0UmVzdWx0IHJlc3VsdCkgeworICAgICAgICBTdHJpbmcgcmVsYXRpdmVQYXRoID0gcmVzdWx0LmdldFJlbGF0aXZlUGF0aCgpOworCisgICAgICAgIGlmIChyZXN1bHQuZ2V0UmVzdWx0Q29kZSgpID09IEFic3RyYWN0UmVzdWx0LlJlc3VsdENvZGUuRkFJTF9DUkFTSEVEKSB7CisgICAgICAgICAgICBtQ3Jhc2hlZFRlc3RzQ291bnQrKzsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtRmlsZUZpbHRlci5pc0lnbm9yZVJlcyhyZWxhdGl2ZVBhdGgpKSB7CisgICAgICAgICAgICBtSWdub3JlZFRlc3RzLmFkZChyZXN1bHQpOworICAgICAgICB9IGVsc2UgaWYgKHJlc3VsdC5nZXRSZXN1bHRDb2RlKCkgPT0gQWJzdHJhY3RSZXN1bHQuUmVzdWx0Q29kZS5QQVNTKSB7CisgICAgICAgICAgICBtUGFzc2VkTm90SWdub3JlZFRlc3RzLmFkZChyZWxhdGl2ZVBhdGgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUZhaWxlZE5vdElnbm9yZWRUZXN0cy5hZGQocmVzdWx0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFRlc3RzUmVsYXRpdmVQYXRoKFN0cmluZyB0ZXN0c1JlbGF0aXZlUGF0aCkgeworICAgICAgICBtVGVzdHNSZWxhdGl2ZVBhdGggPSB0ZXN0c1JlbGF0aXZlUGF0aDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzdW1tYXJpemUoKSB7CisgICAgICAgIGNyZWF0ZUh0bWxEZXRhaWxzKCk7CisgICAgICAgIGNyZWF0ZVR4dFN1bW1hcnkoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZXNldCgpIHsKKyAgICAgICAgbUNyYXNoZWRUZXN0c0NvdW50ID0gMDsKKyAgICAgICAgbUZhaWxlZE5vdElnbm9yZWRUZXN0cy5jbGVhcigpOworICAgICAgICBtSWdub3JlZFRlc3RzLmNsZWFyKCk7CisgICAgICAgIG1QYXNzZWROb3RJZ25vcmVkVGVzdHMuY2xlYXIoKTsKKyAgICAgICAgbURhdGUgPSBuZXcgRGF0ZSgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjcmVhdGVUeHRTdW1tYXJ5KCkgeworICAgICAgICBTdHJpbmdCdWlsZGVyIHR4dCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisKKyAgICAgICAgU2ltcGxlRGF0ZUZvcm1hdCBkYXRlRm9ybWF0ID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoInl5eXkvTU0vZGQgSEg6bW06c3MiKTsKKyAgICAgICAgdHh0LmFwcGVuZChtVGVzdHNSZWxhdGl2ZVBhdGggKyAiXG4iKTsKKyAgICAgICAgdHh0LmFwcGVuZCgiRGF0ZTogIiArIGRhdGVGb3JtYXQuZm9ybWF0KG1EYXRlKSArICJcbiIpOworICAgICAgICB0eHQuYXBwZW5kKCJCdWlsZCBmaW5nZXJwcmludDogIiArIEJ1aWxkLkZJTkdFUlBSSU5UICsgIlxuIik7CisgICAgICAgIHR4dC5hcHBlbmQoIldlYktpdCB2ZXJzaW9uOiAiICsgZ2V0V2ViS2l0VmVyc2lvbkZyb21Vc2VyQWdlbnRTdHJpbmcoKSArICJcbiIpOworCisgICAgICAgIHR4dC5hcHBlbmQoIlRPVEFMOiAgICIgKyBnZXRUb3RhbFRlc3RDb3VudCgpICsgIlxuIik7CisgICAgICAgIGlmIChtQ3Jhc2hlZFRlc3RzQ291bnQgPiAwKSB7CisgICAgICAgICAgICB0eHQuYXBwZW5kKCJDUkFTSEVEICh0b3RhbCBhbW9uZyBhbGwgdGVzdHMpOiAiICsgbUNyYXNoZWRUZXN0c0NvdW50ICsgIlxuIik7CisgICAgICAgICAgICB0eHQuYXBwZW5kKCItLS0tLS0tLS0tLS0tIik7CisgICAgICAgIH0KKyAgICAgICAgdHh0LmFwcGVuZCgiRkFJTEVEOiAgIiArIG1GYWlsZWROb3RJZ25vcmVkVGVzdHMuc2l6ZSgpICsgIlxuIik7CisgICAgICAgIHR4dC5hcHBlbmQoIklHTk9SRUQ6ICIgKyBtSWdub3JlZFRlc3RzLnNpemUoKSArICJcbiIpOworICAgICAgICB0eHQuYXBwZW5kKCJQQVNTRUQ6ICAiICsgbVBhc3NlZE5vdElnbm9yZWRUZXN0cy5zaXplKCkgKyAiXG4iKTsKKworICAgICAgICBGc1V0aWxzLndyaXRlRGF0YVRvU3RvcmFnZShuZXcgRmlsZShtUmVzdWx0c1Jvb3REaXJQYXRoLCBUWFRfU1VNTUFSWV9SRUxBVElWRV9QQVRIKSwKKyAgICAgICAgICAgICAgICB0eHQudG9TdHJpbmcoKS5nZXRCeXRlcygpLCBmYWxzZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUh0bWxEZXRhaWxzKCkgeworICAgICAgICBTdHJpbmdCdWlsZGVyIGh0bWwgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworCisgICAgICAgIGh0bWwuYXBwZW5kKCI8aHRtbD48aGVhZD4iKTsKKyAgICAgICAgaHRtbC5hcHBlbmQoQ1NTKTsKKyAgICAgICAgaHRtbC5hcHBlbmQoU0NSSVBUKTsKKyAgICAgICAgaHRtbC5hcHBlbmQoIjwvaGVhZD48Ym9keT4iKTsKKworICAgICAgICBjcmVhdGVUb3BTdW1tYXJ5VGFibGUoaHRtbCk7CisKKyAgICAgICAgY3JlYXRlUmVzdWx0c0xpc3RXaXRoRGlmZihodG1sLCAiRmFpbGVkIiwgbUZhaWxlZE5vdElnbm9yZWRUZXN0cyk7CisKKyAgICAgICAgY3JlYXRlUmVzdWx0c0xpc3RXaXRoRGlmZihodG1sLCAiSWdub3JlZCIsIG1JZ25vcmVkVGVzdHMpOworCisgICAgICAgIGNyZWF0ZVJlc3VsdHNMaXN0Tm9EaWZmKGh0bWwsICJQYXNzZWQiLCBtUGFzc2VkTm90SWdub3JlZFRlc3RzKTsKKworICAgICAgICBodG1sLmFwcGVuZCgiPC9ib2R5PjwvaHRtbD4iKTsKKworICAgICAgICBGc1V0aWxzLndyaXRlRGF0YVRvU3RvcmFnZShuZXcgRmlsZShtUmVzdWx0c1Jvb3REaXJQYXRoLCBIVE1MX0RFVEFJTFNfUkVMQVRJVkVfUEFUSCksCisgICAgICAgICAgICAgICAgaHRtbC50b1N0cmluZygpLmdldEJ5dGVzKCksIGZhbHNlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGludCBnZXRUb3RhbFRlc3RDb3VudCgpIHsKKyAgICAgICAgcmV0dXJuIG1GYWlsZWROb3RJZ25vcmVkVGVzdHMuc2l6ZSgpICsKKyAgICAgICAgICAgICAgICBtUGFzc2VkTm90SWdub3JlZFRlc3RzLnNpemUoKSArCisgICAgICAgICAgICAgICAgbUlnbm9yZWRUZXN0cy5zaXplKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0V2ViS2l0VmVyc2lvbkZyb21Vc2VyQWdlbnRTdHJpbmcoKSB7CisgICAgICAgIFJlc291cmNlcyByZXNvdXJjZXMgPSBuZXcgUmVzb3VyY2VzKG5ldyBBc3NldE1hbmFnZXIoKSwgbmV3IERpc3BsYXlNZXRyaWNzKCksCisgICAgICAgICAgICAgICAgbmV3IENvbmZpZ3VyYXRpb24oKSk7CisgICAgICAgIFN0cmluZyB1c2VyQWdlbnQgPQorICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRTdHJpbmcoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcud2ViX3VzZXJfYWdlbnQpOworCisgICAgICAgIE1hdGNoZXIgbWF0Y2hlciA9IFBhdHRlcm4uY29tcGlsZSgiQXBwbGVXZWJLaXQvKFswLTldKz9cXC5bMC05XSkiKS5tYXRjaGVyKHVzZXJBZ2VudCk7CisgICAgICAgIGlmIChtYXRjaGVyLmZpbmQoKSkgeworICAgICAgICAgICAgcmV0dXJuIG1hdGNoZXIuZ3JvdXAoMSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICJ1bmtub3duIjsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY3JlYXRlVG9wU3VtbWFyeVRhYmxlKFN0cmluZ0J1aWxkZXIgaHRtbCkgeworICAgICAgICBTaW1wbGVEYXRlRm9ybWF0IGRhdGVGb3JtYXQgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgieXl5eS9NTS9kZCBISDptbTpzcyIpOworICAgICAgICBodG1sLmFwcGVuZCgiPGgxPiIgKyBtVGVzdHNSZWxhdGl2ZVBhdGggKyAiPC9oMT4iKTsKKyAgICAgICAgaHRtbC5hcHBlbmQoIjxoMz4iICsgIkRhdGU6ICIgKyBkYXRlRm9ybWF0LmZvcm1hdChuZXcgRGF0ZSgpKSArICI8L2gzPiIpOworICAgICAgICBodG1sLmFwcGVuZCgiPGgzPiIgKyAiQnVpbGQgZmluZ2VycHJpbnQ6ICIgKyBCdWlsZC5GSU5HRVJQUklOVCArICI8L2gzPiIpOworICAgICAgICBodG1sLmFwcGVuZCgiPGgzPiIgKyAiV2ViS2l0IHZlcnNpb246ICIgKyBnZXRXZWJLaXRWZXJzaW9uRnJvbVVzZXJBZ2VudFN0cmluZygpICsgIjwvaDM+Iik7CisKKyAgICAgICAgaHRtbC5hcHBlbmQoIjx0YWJsZSBjbGFzcz1cInN1bW1hcnlcIj4iKTsKKyAgICAgICAgY3JlYXRlU3VtbWFyeVRhYmxlUm93KGh0bWwsICJUT1RBTCIsIGdldFRvdGFsVGVzdENvdW50KCkpOworICAgICAgICBjcmVhdGVTdW1tYXJ5VGFibGVSb3coaHRtbCwgIkNSQVNIRUQiLCBtQ3Jhc2hlZFRlc3RzQ291bnQpOworICAgICAgICBjcmVhdGVTdW1tYXJ5VGFibGVSb3coaHRtbCwgIkZBSUxFRCIsIG1GYWlsZWROb3RJZ25vcmVkVGVzdHMuc2l6ZSgpKTsKKyAgICAgICAgY3JlYXRlU3VtbWFyeVRhYmxlUm93KGh0bWwsICJJR05PUkVEIiwgbUlnbm9yZWRUZXN0cy5zaXplKCkpOworICAgICAgICBjcmVhdGVTdW1tYXJ5VGFibGVSb3coaHRtbCwgIlBBU1NFRCIsIG1QYXNzZWROb3RJZ25vcmVkVGVzdHMuc2l6ZSgpKTsKKyAgICAgICAgaHRtbC5hcHBlbmQoIjwvdGFibGU+Iik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVN1bW1hcnlUYWJsZVJvdyhTdHJpbmdCdWlsZGVyIGh0bWwsIFN0cmluZyBjYXB0aW9uLCBpbnQgc2l6ZSkgeworICAgICAgICBodG1sLmFwcGVuZCgiPHRyPiIpOworICAgICAgICBodG1sLmFwcGVuZCgiICAgIDx0ZD4iICsgY2FwdGlvbiArICI8L3RkPiIpOworICAgICAgICBodG1sLmFwcGVuZCgiICAgIDx0ZD4iICsgc2l6ZSArICI8L3RkPiIpOworICAgICAgICBodG1sLmFwcGVuZCgiPC90cj4iKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY3JlYXRlUmVzdWx0c0xpc3RXaXRoRGlmZihTdHJpbmdCdWlsZGVyIGh0bWwsIFN0cmluZyB0aXRsZSwKKyAgICAgICAgICAgIExpc3Q8QWJzdHJhY3RSZXN1bHQ+IHJlc3VsdHNMaXN0KSB7CisgICAgICAgIFN0cmluZyByZWxhdGl2ZVBhdGg7CisgICAgICAgIFN0cmluZyBpZCA9ICIiOworICAgICAgICBBYnN0cmFjdFJlc3VsdC5SZXN1bHRDb2RlIHJlc3VsdENvZGU7CisKKyAgICAgICAgQ29sbGVjdGlvbnMuc29ydChyZXN1bHRzTGlzdCk7CisgICAgICAgIGh0bWwuYXBwZW5kKCI8aDI+IiArIHRpdGxlICsgIiBbIiArIHJlc3VsdHNMaXN0LnNpemUoKSArICJdPC9oMj4iKTsKKyAgICAgICAgZm9yIChBYnN0cmFjdFJlc3VsdCByZXN1bHQgOiByZXN1bHRzTGlzdCkgeworICAgICAgICAgICAgcmVsYXRpdmVQYXRoID0gcmVzdWx0LmdldFJlbGF0aXZlUGF0aCgpOworICAgICAgICAgICAgcmVzdWx0Q29kZSA9IHJlc3VsdC5nZXRSZXN1bHRDb2RlKCk7CisKKyAgICAgICAgICAgIGh0bWwuYXBwZW5kKCI8aDM+Iik7CisKKyAgICAgICAgICAgIGlmIChyZXN1bHRDb2RlID09IEFic3RyYWN0UmVzdWx0LlJlc3VsdENvZGUuUEFTUykgeworICAgICAgICAgICAgICAgIGh0bWwuYXBwZW5kKCI8c3BhbiBjbGFzcz1cInNxclwiPiYjeDI1YTA7IDwvc3Bhbj4iKTsKKyAgICAgICAgICAgICAgICBodG1sLmFwcGVuZCgiPHNwYW4gY2xhc3M9XCJwYXRoXCI+IiArIHJlbGF0aXZlUGF0aCArICI8L3NwYW4+Iik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICAgICAqIFRlY2huaWNhbGx5LCB0d28gZGlmZmVyZW50IHBhdGhzIGNvdWxkIGVuZCB1cCBiZWluZyB0aGUgc2FtZSwgYmVjYXVzZQorICAgICAgICAgICAgICAgICAqICc6JyBpcyBhIHZhbGlkICBjaGFyYWN0ZXIgaW4gYSBwYXRoLiBIb3dldmVyLCBpdCBpcyBwcm9iYWJseSBub3QgZ29pbmcKKyAgICAgICAgICAgICAgICAgKiB0byBjYXVzZSBhbnkgcHJvYmxlbXMgaW4gdGhpcyBjYXNlCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgaWQgPSByZWxhdGl2ZVBhdGgucmVwbGFjZShGaWxlLnNlcGFyYXRvciwgIjoiKTsKKyAgICAgICAgICAgICAgICBodG1sLmFwcGVuZCgiPGEgaHJlZj1cIiNcIiBvbkNsaWNrPVwidG9nZ2xlRGlzcGxheSgnIiArIGlkICsgIicpOyIpOworICAgICAgICAgICAgICAgIGh0bWwuYXBwZW5kKCJyZXR1cm4gZmFsc2U7XCI+Iik7CisgICAgICAgICAgICAgICAgaHRtbC5hcHBlbmQoIjxzcGFuIGNsYXNzPVwidHJpXCIgaWQ9XCJ0cmkuIiArIGlkICsgIlwiPiYjeDI1YjY7IDwvc3Bhbj4iKTsKKyAgICAgICAgICAgICAgICBodG1sLmFwcGVuZCgiPHNwYW4gY2xhc3M9XCJwYXRoXCI+IiArIHJlbGF0aXZlUGF0aCArICI8L3NwYW4+Iik7CisgICAgICAgICAgICAgICAgaHRtbC5hcHBlbmQoIjwvYT4iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaHRtbC5hcHBlbmQoIiA8c3BhbiBjbGFzcz1cImxpc3RJdGVtICIgKyByZXN1bHRDb2RlLm5hbWUoKSArICJcIj4iKTsKKyAgICAgICAgICAgIGh0bWwuYXBwZW5kKHJlc3VsdENvZGUudG9TdHJpbmcoKSk7CisgICAgICAgICAgICBodG1sLmFwcGVuZCgiPC9zcGFuPiIpOworCisgICAgICAgICAgICAvKiogRGV0ZWN0IG1pc3NpbmcgTFRDIGZ1bmN0aW9uICovCisgICAgICAgICAgICBTdHJpbmcgYWRkaXRpb25hbFRleHRPdXRwdXRTdHJpbmcgPSByZXN1bHQuZ2V0QWRkaXRpb25hbFRleHRPdXRwdXRTdHJpbmcoKTsKKyAgICAgICAgICAgIGlmIChhZGRpdGlvbmFsVGV4dE91dHB1dFN0cmluZyAhPSBudWxsICYmCisgICAgICAgICAgICAgICAgICAgIGFkZGl0aW9uYWxUZXh0T3V0cHV0U3RyaW5nLmNvbnRhaW5zKCJjb20uYW5kcm9pZC5kdW1wcmVuZGVydHJlZSIpICYmCisgICAgICAgICAgICAgICAgICAgIGFkZGl0aW9uYWxUZXh0T3V0cHV0U3RyaW5nLmNvbnRhaW5zKCJoYXMgbm8gbWV0aG9kIikpIHsKKyAgICAgICAgICAgICAgICBpZiAoYWRkaXRpb25hbFRleHRPdXRwdXRTdHJpbmcuY29udGFpbnMoIkxheW91dFRlc3RDb250cm9sbGVyIikpIHsKKyAgICAgICAgICAgICAgICAgICAgaHRtbC5hcHBlbmQoIiA8c3BhbiBjbGFzcz1cImxpc3RJdGVtIG5vTHRjXCI+TFRDIGZ1bmN0aW9uIG1pc3Npbmc8L3NwYW4+Iik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChhZGRpdGlvbmFsVGV4dE91dHB1dFN0cmluZy5jb250YWlucygiRXZlbnRTZW5kZXIiKSkgeworICAgICAgICAgICAgICAgICAgICBodG1sLmFwcGVuZCgiIDxzcGFuIGNsYXNzPVwibGlzdEl0ZW0gbm9FdmVudFNlbmRlclwiPiIpOworICAgICAgICAgICAgICAgICAgICBodG1sLmFwcGVuZCgiRVMgZnVuY3Rpb24gbWlzc2luZzwvc3Bhbj4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGh0bWwuYXBwZW5kKCI8L2gzPiIpOworCisgICAgICAgICAgICBpZiAocmVzdWx0Q29kZSAhPSBBYnN0cmFjdFJlc3VsdC5SZXN1bHRDb2RlLlBBU1MpIHsKKyAgICAgICAgICAgICAgICBodG1sLmFwcGVuZCgiPGRpdiBjbGFzcz1cImRpZmZcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCIgaWQ9XCIiICsgaWQgKyAiXCI+Iik7CisgICAgICAgICAgICAgICAgaHRtbC5hcHBlbmQocmVzdWx0LmdldERpZmZBc0h0bWwoKSk7CisgICAgICAgICAgICAgICAgaHRtbC5hcHBlbmQoIjxhIGhyZWY9XCIjXCIgb25DbGljaz1cInRvZ2dsZURpc3BsYXkoJyIgKyBpZCArICInKTsiKTsKKyAgICAgICAgICAgICAgICBodG1sLmFwcGVuZCgicmV0dXJuIGZhbHNlO1wiPkhpZGU8L2E+Iik7CisgICAgICAgICAgICAgICAgaHRtbC5hcHBlbmQoIjwvZGl2PiIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBodG1sLmFwcGVuZCgiPGRpdiBjbGFzcz1cInNwYWNlXCI+PC9kaXY+Iik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY3JlYXRlUmVzdWx0c0xpc3ROb0RpZmYoU3RyaW5nQnVpbGRlciBodG1sLCBTdHJpbmcgdGl0bGUsCisgICAgICAgICAgICBMaXN0PFN0cmluZz4gcmVzdWx0c0xpc3QpIHsKKyAgICAgICAgQ29sbGVjdGlvbnMuc29ydChyZXN1bHRzTGlzdCk7CisgICAgICAgIGh0bWwuYXBwZW5kKCI8aDI+UGFzc2VkIFsiICsgcmVzdWx0c0xpc3Quc2l6ZSgpICsgIl08L2gyPiIpOworICAgICAgICBmb3IgKFN0cmluZyByZXN1bHQgOiByZXN1bHRzTGlzdCkgeworICAgICAgICAgICAgaHRtbC5hcHBlbmQoIjxoMz4iKTsKKyAgICAgICAgICAgIGh0bWwuYXBwZW5kKCI8c3BhbiBjbGFzcz1cInNxclwiPiYjeDI1YTA7IDwvc3Bhbj4iKTsKKyAgICAgICAgICAgIGh0bWwuYXBwZW5kKCI8c3BhbiBjbGFzcz1cInBhdGhcIj4iICsgcmVzdWx0ICsgIjwvc3Bhbj4iKTsKKyAgICAgICAgICAgIGh0bWwuYXBwZW5kKCI8L2gzPiIpOworICAgICAgICAgICAgaHRtbC5hcHBlbmQoIjxkaXYgY2xhc3M9XCJzcGFjZVwiPjwvZGl2PiIpOworICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL1Rlc3RzTGlzdEFjdGl2aXR5LmphdmEgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9UZXN0c0xpc3RBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5NjVmZDkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9UZXN0c0xpc3RBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsMTczIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5kdW1wcmVuZGVydHJlZTI7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmFwcC5Qcm9ncmVzc0RpYWxvZzsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvdzsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmR1bXByZW5kZXJ0cmVlMi5zY3JpcHRzdXBwb3J0Lk9uRXZlcnl0aGluZ0ZpbmlzaGVkQ2FsbGJhY2s7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCisvKioKKyAqIEFuIEFjdGl2aXR5IHRoYXQgZ2VuZXJhdGVzIGEgbGlzdCBvZiB0ZXN0cyBhbmQgc2VuZHMgdGhlIGludGVudCB0bworICogTGF5b3V0VGVzdHNFeGVjdXRlciB0byBydW4gdGhlbS4gSXQgYWxzbyByZXN0YXJ0cyB0aGUgTGF5b3V0VGVzdHNFeGVjdXRlcgorICogYWZ0ZXIgaXQgY3Jhc2hlcy4KKyAqLworcHVibGljIGNsYXNzIFRlc3RzTGlzdEFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19URVNUX0xJU1RfUFJFTE9BREVSX0RPTkUgPSAwOworCisgICAgLyoqIENvbnN0YW50cyBmb3IgYWRkaW5nIGV4dHJhcyB0byBhbiBpbnRlbnQgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9URVNUX1BBVEggPSAiVGVzdFBhdGgiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgUHJvZ3Jlc3NEaWFsb2cgc1Byb2dyZXNzRGlhbG9nOworCisgICAgcHJpdmF0ZSBIYW5kbGVyIG1IYW5kbGVyID0gbmV3IEhhbmRsZXIoKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7CisgICAgICAgICAgICBzd2l0Y2ggKG1zZy53aGF0KSB7CisgICAgICAgICAgICAgICAgY2FzZSBNU0dfVEVTVF9MSVNUX1BSRUxPQURFUl9ET05FOgorICAgICAgICAgICAgICAgICAgICBzUHJvZ3Jlc3NEaWFsb2cuZGlzbWlzcygpOworICAgICAgICAgICAgICAgICAgICBtVGVzdHNMaXN0ID0gKEFycmF5TGlzdDxTdHJpbmc+KW1zZy5vYmo7CisgICAgICAgICAgICAgICAgICAgIG1Ub3RhbFRlc3RDb3VudCA9IG1UZXN0c0xpc3Quc2l6ZSgpOworICAgICAgICAgICAgICAgICAgICByZXN0YXJ0RXhlY3V0b3IoMCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsKKworICAgIHByaXZhdGUgQXJyYXlMaXN0PFN0cmluZz4gbVRlc3RzTGlzdDsKKyAgICBwcml2YXRlIGludCBtVG90YWxUZXN0Q291bnQ7CisKKyAgICBwcml2YXRlIE9uRXZlcnl0aGluZ0ZpbmlzaGVkQ2FsbGJhY2sgbU9uRXZlcnl0aGluZ0ZpbmlzaGVkQ2FsbGJhY2s7CisgICAgcHJpdmF0ZSBib29sZWFuIG1FdmVyeXRoaW5nRmluaXNoZWQ7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisKKyAgICAgICAgLyoqIFByZXBhcmUgdGhlIHByb2dyZXNzIGRpYWxvZyAqLworICAgICAgICBzUHJvZ3Jlc3NEaWFsb2cgPSBuZXcgUHJvZ3Jlc3NEaWFsb2coVGVzdHNMaXN0QWN0aXZpdHkudGhpcyk7CisgICAgICAgIHNQcm9ncmVzc0RpYWxvZy5zZXRDYW5jZWxhYmxlKGZhbHNlKTsKKyAgICAgICAgc1Byb2dyZXNzRGlhbG9nLnNldFByb2dyZXNzU3R5bGUoUHJvZ3Jlc3NEaWFsb2cuU1RZTEVfU1BJTk5FUik7CisgICAgICAgIHNQcm9ncmVzc0RpYWxvZy5zZXRUaXRsZShSLnN0cmluZy5kaWFsb2dfcHJvZ3Jlc3NfdGl0bGUpOworICAgICAgICBzUHJvZ3Jlc3NEaWFsb2cuc2V0TWVzc2FnZShnZXRUZXh0KFIuc3RyaW5nLmRpYWxvZ19wcm9ncmVzc19tc2cpKTsKKworICAgICAgICByZXF1ZXN0V2luZG93RmVhdHVyZShXaW5kb3cuRkVBVFVSRV9QUk9HUkVTUyk7CisKKyAgICAgICAgSW50ZW50IGludGVudCA9IGdldEludGVudCgpOworICAgICAgICBpZiAoIWludGVudC5nZXRBY3Rpb24oKS5lcXVhbHMoSW50ZW50LkFDVElPTl9SVU4pKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIHBhdGggPSBpbnRlbnQuZ2V0U3RyaW5nRXh0cmEoRVhUUkFfVEVTVF9QQVRIKTsKKworICAgICAgICBzUHJvZ3Jlc3NEaWFsb2cuc2hvdygpOworICAgICAgICBNZXNzYWdlIGRvbmVNc2cgPSBNZXNzYWdlLm9idGFpbihtSGFuZGxlciwgTVNHX1RFU1RfTElTVF9QUkVMT0FERVJfRE9ORSk7CisKKyAgICAgICAgSW50ZW50IHNlcnZpY2VJbnRlbnQgPSBuZXcgSW50ZW50KHRoaXMsIE1hbmFnZXJTZXJ2aWNlLmNsYXNzKTsKKyAgICAgICAgc2VydmljZUludGVudC5wdXRFeHRyYSgicGF0aCIsIHBhdGgpOworICAgICAgICBzdGFydFNlcnZpY2Uoc2VydmljZUludGVudCk7CisKKyAgICAgICAgbmV3IFRlc3RzTGlzdFByZWxvYWRlclRocmVhZChwYXRoLCBkb25lTXNnKS5zdGFydCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uTmV3SW50ZW50KEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgaWYgKGludGVudC5nZXRBY3Rpb24oKS5lcXVhbHMoSW50ZW50LkFDVElPTl9SRUJPT1QpKSB7CisgICAgICAgICAgICBvbkNyYXNoSW50ZW50KGludGVudCk7CisgICAgICAgIH0gZWxzZSBpZiAoaW50ZW50LmdldEFjdGlvbigpLmVxdWFscyhJbnRlbnQuQUNUSU9OX1NIVVRET1dOKSkgeworICAgICAgICAgICAgb25FdmVyeXRoaW5nRmluaXNoZWRJbnRlbnQoaW50ZW50KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIGhhbmRsZXMgYW4gaW50ZW50IHRoYXQgY29tZXMgZnJvbSBNYW5hZ2VTZXJ2aWNlIHdoZW4gY3Jhc2ggaXMgZGV0ZWN0ZWQuCisgICAgICogVGhlIGludGVudCBjb250YWlucyBhbiBpbmRleCBpbiBtVGVzdHNMaXN0IG9mIHRoZSB0ZXN0IHRoYXQgY3Jhc2hlZC4gVGVzdHNMaXN0QWN0aXZpdHkKKyAgICAgKiByZXN0YXJ0cyB0aGUgTGF5b3V0VGVzdHNFeGVjdXRvciBmcm9tIHRoZSBmb2xsb3dpbmcgdGVzdCBpbiBtVGVzdHNMaXN0LCBieSBzZW5kaW5nCisgICAgICogYW4gaW50ZW50IHRvIGl0LiBUaGlzIG5ldyBpbnRlbnQgY29udGFpbnMgYSBsaXN0IG9mIHJlbWFpbmluZyB0ZXN0cyB0byBydW4sCisgICAgICogdG90YWwgY291bnQgb2YgYWxsIHRlc3RzLCBhbmQgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCB0ZXN0IHRvIHJ1biBhZnRlciByZXN0YXJ0aW5nLgorICAgICAqIExheW91dFRlc3RFeGVjdXRvciBydW5zIHRoZW4gYXMgdXN1YWwsIHNlbmRpbmcgcmVwb3J0cyB0byBNYW5hZ2VyU2VydmljZS4gSWYgaXQKKyAgICAgKiBkZXRlY3RzIHRoZSBjcmFzaCBpdCBzZW5kcyBhIG5ldyBpbnRlbnQgYW5kIHRoZSBmbG93IHJlcGVhdHMuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIG9uQ3Jhc2hJbnRlbnQoSW50ZW50IGludGVudCkgeworICAgICAgICBpbnQgbmV4dFRlc3RUb1J1biA9IGludGVudC5nZXRJbnRFeHRyYSgiY3Jhc2hlZFRlc3RJbmRleCIsIC0xKSArIDE7CisgICAgICAgIGlmIChuZXh0VGVzdFRvUnVuID4gMCAmJiBuZXh0VGVzdFRvUnVuIDw9IG1Ub3RhbFRlc3RDb3VudCkgeworICAgICAgICAgICAgcmVzdGFydEV4ZWN1dG9yKG5leHRUZXN0VG9SdW4pOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVnaXN0ZXJPbkV2ZXJ5dGhpbmdGaW5pc2hlZENhbGxiYWNrKE9uRXZlcnl0aGluZ0ZpbmlzaGVkQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICAgICAgbU9uRXZlcnl0aGluZ0ZpbmlzaGVkQ2FsbGJhY2sgPSBjYWxsYmFjazsKKyAgICAgICAgaWYgKG1FdmVyeXRoaW5nRmluaXNoZWQpIHsKKyAgICAgICAgICAgIG1PbkV2ZXJ5dGhpbmdGaW5pc2hlZENhbGxiYWNrLm9uRmluaXNoZWQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBvbkV2ZXJ5dGhpbmdGaW5pc2hlZEludGVudChJbnRlbnQgaW50ZW50KSB7CisgICAgICAgIC8qKiBUT0RPOiBTaG93IHNvbWUga2luZCBvZiBzdW1tYXJ5IHRvIHRoZSB1c2VyICovCisgICAgICAgIG1FdmVyeXRoaW5nRmluaXNoZWQgPSB0cnVlOworICAgICAgICBpZiAobU9uRXZlcnl0aGluZ0ZpbmlzaGVkQ2FsbGJhY2sgIT0gbnVsbCkgeworICAgICAgICAgICAgbU9uRXZlcnl0aGluZ0ZpbmlzaGVkQ2FsbGJhY2sub25GaW5pc2hlZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25TYXZlSW5zdGFuY2VTdGF0ZShCdW5kbGUgb3V0U3RhdGUpIHsKKyAgICAgICAgb3V0U3RhdGUucHV0U3RyaW5nQXJyYXlMaXN0KCJ0ZXN0c0xpc3QiLCBtVGVzdHNMaXN0KTsKKyAgICAgICAgb3V0U3RhdGUucHV0SW50KCJ0b3RhbENvdW50IiwgbVRvdGFsVGVzdENvdW50KTsKKworICAgICAgICBzdXBlci5vblNhdmVJbnN0YW5jZVN0YXRlKG91dFN0YXRlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvblJlc3RvcmVJbnN0YW5jZVN0YXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25SZXN0b3JlSW5zdGFuY2VTdGF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworCisgICAgICAgIG1UZXN0c0xpc3QgPSBzYXZlZEluc3RhbmNlU3RhdGUuZ2V0U3RyaW5nQXJyYXlMaXN0KCJ0ZXN0c0xpc3QiKTsKKyAgICAgICAgbVRvdGFsVGVzdENvdW50ID0gc2F2ZWRJbnN0YW5jZVN0YXRlLmdldEludCgidG90YWxDb3VudCIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIChSZSlzdGFydHMgdGhlIGV4ZWN1dGVyIGFjdGl2aXR5IGZyb20gdGhlIGdpdmVuIHRlc3QgbnVtYmVyIChpbmNsdXNpdmUsIDAtYmFzZWQpLgorICAgICAqIFRoaXMgbnVtYmVyIGlzIGFuIGluZGV4IGluIG1UZXN0c0xpc3QsIG5vdCB0aGUgc3VibGlzdCBwYXNzZWQgaW4gdGhlIGludGVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdGFydEZyb20KKyAgICAgKiAgICAgIHRlc3QgaW5kZXggaW4gbVRlc3RzTGlzdCB0byBzdGFydCB0aGUgdGVzdHMgZnJvbSAoaW5jbHVzaXZlLCAwLWJhc2VkKQorICAgICAqLworICAgIHByaXZhdGUgdm9pZCByZXN0YXJ0RXhlY3V0b3IoaW50IHN0YXJ0RnJvbSkgeworICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudCgpOworICAgICAgICBpbnRlbnQuc2V0Q2xhc3ModGhpcywgTGF5b3V0VGVzdHNFeGVjdXRvci5jbGFzcyk7CisgICAgICAgIGludGVudC5zZXRBY3Rpb24oSW50ZW50LkFDVElPTl9SVU4pOworCisgICAgICAgIGlmIChzdGFydEZyb20gPCBtVG90YWxUZXN0Q291bnQpIHsKKyAgICAgICAgICAgIGludGVudC5wdXRTdHJpbmdBcnJheUxpc3RFeHRyYShMYXlvdXRUZXN0c0V4ZWN1dG9yLkVYVFJBX1RFU1RTX0xJU1QsCisgICAgICAgICAgICAgICAgICAgIG5ldyBBcnJheUxpc3Q8U3RyaW5nPihtVGVzdHNMaXN0LnN1Ykxpc3Qoc3RhcnRGcm9tLCBtVG90YWxUZXN0Q291bnQpKSk7CisgICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoTGF5b3V0VGVzdHNFeGVjdXRvci5FWFRSQV9URVNUX0lOREVYLCBzdGFydEZyb20pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW50ZW50LnB1dFN0cmluZ0FycmF5TGlzdEV4dHJhKExheW91dFRlc3RzRXhlY3V0b3IuRVhUUkFfVEVTVFNfTElTVCwKKyAgICAgICAgICAgICAgICAgICAgbmV3IEFycmF5TGlzdDxTdHJpbmc+KCkpOworICAgICAgICB9CisKKyAgICAgICAgc3RhcnRBY3Rpdml0eShpbnRlbnQpOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9UZXN0c0xpc3RQcmVsb2FkZXJUaHJlYWQuamF2YSBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL1Rlc3RzTGlzdFByZWxvYWRlclRocmVhZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxNDVhZjcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9UZXN0c0xpc3RQcmVsb2FkZXJUaHJlYWQuamF2YQpAQCAtMCwwICsxLDEyMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUyOworCitpbXBvcnQgYW5kcm9pZC5vcy5FbnZpcm9ubWVudDsKK2ltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworCisvKioKKyAqIEEgVGhyZWFkIHRoYXQgaXMgcmVzcG9uc2libGUgZm9yIGdlbmVyYXRpbmcgYSBsaXN0cyBvZiB0ZXN0cyB0byBydW4uCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0c0xpc3RQcmVsb2FkZXJUaHJlYWQgZXh0ZW5kcyBUaHJlYWQgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiVGVzdHNMaXN0UHJlbG9hZGVyVGhyZWFkIjsKKworICAgIC8qKiBUT0RPOiBtYWtlIGl0IGEgc2V0dGluZyAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUU19ST09UX0RJUl9QQVRIID0KKyAgICAgICAgICAgIEVudmlyb25tZW50LmdldEV4dGVybmFsU3RvcmFnZURpcmVjdG9yeSgpICsKKyAgICAgICAgICAgIEZpbGUuc2VwYXJhdG9yICsgImFuZHJvaWQiICsKKyAgICAgICAgICAgIEZpbGUuc2VwYXJhdG9yICsgIkxheW91dFRlc3RzIjsKKworICAgIC8qKiBBIGxpc3QgY29udGFpbmluZyByZWxhdGl2ZSBwYXRocyBvZiB0ZXN0cyB0byBydW4gKi8KKyAgICBwcml2YXRlIEFycmF5TGlzdDxTdHJpbmc+IG1UZXN0c0xpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKworICAgIHByaXZhdGUgRmlsZUZpbHRlciBtRmlsZUZpbHRlcjsKKworICAgIC8qKgorICAgICAqIEEgcmVsYXRpdmUgcGF0aCB0byB0aGUgZm9sZGVyIHdpdGggdGhlIHRlc3RzIHdlIHdhbnQgdG8gcnVuIG9yIHBhcnRpY3VsYXIgdGVzdC4KKyAgICAgKiBVc2VkIHVwIHRvIGFuZCBpbmNsdWRpbmcgcHJlbG9hZFRlc3RzKCkuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgbVJlbGF0aXZlUGF0aDsKKworICAgIHByaXZhdGUgTWVzc2FnZSBtRG9uZU1zZzsKKworICAgIC8qKgorICAgICAqIFRoZSBnaXZlbiBwYXRoIG11c3QgYmUgcmVsYXRpdmUgdG8gdGhlIHJvb3QgZGlyLgorICAgICAqCisgICAgICogQHBhcmFtIHBhdGgKKyAgICAgKiBAcGFyYW0gZG9uZU1zZworICAgICAqLworICAgIHB1YmxpYyBUZXN0c0xpc3RQcmVsb2FkZXJUaHJlYWQoU3RyaW5nIHBhdGgsIE1lc3NhZ2UgZG9uZU1zZykgeworICAgICAgICBtRmlsZUZpbHRlciA9IG5ldyBGaWxlRmlsdGVyKFRFU1RTX1JPT1RfRElSX1BBVEgpOworICAgICAgICBtUmVsYXRpdmVQYXRoID0gcGF0aDsKKyAgICAgICAgbURvbmVNc2cgPSBkb25lTXNnOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgLyoqIENoZWNrIGlmIHRoZSBwYXRoIGlzIGNvcnJlY3QgKi8KKyAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUoVEVTVFNfUk9PVF9ESVJfUEFUSCwgbVJlbGF0aXZlUGF0aCk7CisgICAgICAgIGlmICghZmlsZS5leGlzdHMoKSkgeworICAgICAgICAgICAgTG9nLmUoTE9HX1RBRyArICI6OnJ1biIsICJQYXRoIGRvZXMgbm90IGV4aXN0OiAiICsgbVJlbGF0aXZlUGF0aCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiogUG9wdWxhdGUgdGhlIHRlc3RzJyBsaXN0IGFjY29yZGluZ2x5ICovCisgICAgICAgICAgICBpZiAoZmlsZS5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgICAgICAgICAgcHJlbG9hZFRlc3RzKG1SZWxhdGl2ZVBhdGgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtVGVzdHNMaXN0LmFkZChtUmVsYXRpdmVQYXRoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIG1Eb25lTXNnLm9iaiA9IG1UZXN0c0xpc3Q7CisgICAgICAgIG1Eb25lTXNnLnNlbmRUb1RhcmdldCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIExvYWRzIGFsbCB0aGUgdGVzdHMgZnJvbSB0aGUgZ2l2ZW4gZm9sZGVycyBhbmQgYWxsIHRoZSBzdWJmb2xkZXJzCisgICAgICogaW50byBtVGVzdHNMaXN0LgorICAgICAqCisgICAgICogQHBhcmFtIGRpclJlbGF0aXZlUGF0aAorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBwcmVsb2FkVGVzdHMoU3RyaW5nIGRpclJlbGF0aXZlUGF0aCkgeworICAgICAgICBMaW5rZWRMaXN0PFN0cmluZz4gZm9sZGVyc0xpc3QgPSBuZXcgTGlua2VkTGlzdDxTdHJpbmc+KCk7CisgICAgICAgIGZvbGRlcnNMaXN0LmFkZChkaXJSZWxhdGl2ZVBhdGgpOworCisgICAgICAgIFN0cmluZyByZWxhdGl2ZVBhdGg7CisgICAgICAgIFN0cmluZyBjdXJyZW50RGlyUmVsYXRpdmVQYXRoOworICAgICAgICBTdHJpbmcgaXRlbU5hbWU7CisgICAgICAgIEZpbGVbXSBpdGVtczsKKyAgICAgICAgd2hpbGUgKCFmb2xkZXJzTGlzdC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIGN1cnJlbnREaXJSZWxhdGl2ZVBhdGggPSBmb2xkZXJzTGlzdC5yZW1vdmVGaXJzdCgpOworICAgICAgICAgICAgaXRlbXMgPSBuZXcgRmlsZShURVNUU19ST09UX0RJUl9QQVRILCBjdXJyZW50RGlyUmVsYXRpdmVQYXRoKS5saXN0RmlsZXMoKTsKKyAgICAgICAgICAgIGZvciAoRmlsZSBpdGVtIDogaXRlbXMpIHsKKyAgICAgICAgICAgICAgICBpdGVtTmFtZSA9IGl0ZW0uZ2V0TmFtZSgpOworICAgICAgICAgICAgICAgIHJlbGF0aXZlUGF0aCA9IGN1cnJlbnREaXJSZWxhdGl2ZVBhdGggKyBGaWxlLnNlcGFyYXRvciArIGl0ZW1OYW1lOworCisgICAgICAgICAgICAgICAgaWYgKGl0ZW0uaXNEaXJlY3RvcnkoKSAmJiBGaWxlRmlsdGVyLmlzVGVzdERpcihpdGVtTmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9sZGVyc0xpc3QuYWRkKHJlbGF0aXZlUGF0aCk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChGaWxlRmlsdGVyLmlzVGVzdEZpbGUoaXRlbU5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghbUZpbGVGaWx0ZXIuaXNTa2lwKHJlbGF0aXZlUGF0aCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1UZXN0c0xpc3QuYWRkKHJlbGF0aXZlUGF0aCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvL21TdW1tYXJpemVyLmFkZFNraXBwZWRUZXN0KHJlbGF0aXZlUGF0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiogVE9ETzogU3VtbWFyaXplciBpcyBub3cgaW4gc2VydmljZSAtIGZpZ3VyZSBvdXQgaG93IHRvIHNlbmQgdGhlIGluZm8gKi8KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9UZXh0UmVzdWx0LmphdmEgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9UZXh0UmVzdWx0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGY4NjRlNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL1RleHRSZXN1bHQuamF2YQpAQCAtMCwwICsxLDIyOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUyOworCitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLndlYmtpdC5XZWJWaWV3OworCitpbXBvcnQgbmFtZS5mcmFzZXIubmVpbC5wbGFpbnRleHQuZGlmZl9tYXRjaF9wYXRjaDsKKworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworCisvKioKKyAqIEEgcmVzdWx0IG9iamVjdCBmb3Igd2hpY2ggdGhlIGV4cGVjdGVkIG91dHB1dCBpcyB0ZXh0LiBJdCBkb2VzIG5vdCBoYXZlIGFuIGltYWdlCisgKiBleHBlY3RlZCByZXN1bHQuCisgKgorICogPHA+Q3JlYXRlZCBpZiBsYXlvdXRUZXN0Q29udHJvbGxlci5kdW1wQXNUZXh0KCkgd2FzIGNhbGxlZC4KKyAqLworcHVibGljIGNsYXNzIFRleHRSZXN1bHQgZXh0ZW5kcyBBYnN0cmFjdFJlc3VsdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0RPQ1VNRU5UX0FTX1RFWFQgPSAwOworCisgICAgcHJpdmF0ZSBTdHJpbmcgbUV4cGVjdGVkUmVzdWx0OworICAgIHByaXZhdGUgU3RyaW5nIG1BY3R1YWxSZXN1bHQ7CisgICAgcHJpdmF0ZSBTdHJpbmcgbVJlbGF0aXZlUGF0aDsKKyAgICBwcml2YXRlIFJlc3VsdENvZGUgbVJlc3VsdENvZGU7CisgICAgcHJpdmF0ZSBNZXNzYWdlIG1SZXN1bHRPYnRhaW5lZE1zZzsKKworICAgIHByaXZhdGUgYm9vbGVhbiBtRHVtcENoaWxkRnJhbWVzQXNUZXh0OworCisgICAgcHJpdmF0ZSBIYW5kbGVyIG1IYW5kbGVyID0gbmV3IEhhbmRsZXIoKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7CisgICAgICAgICAgICBpZiAobXNnLndoYXQgPT0gTVNHX0RPQ1VNRU5UX0FTX1RFWFQpIHsKKyAgICAgICAgICAgICAgICBtQWN0dWFsUmVzdWx0ID0gKFN0cmluZyltc2cub2JqOworICAgICAgICAgICAgICAgIG1SZXN1bHRPYnRhaW5lZE1zZy5zZW5kVG9UYXJnZXQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH07CisKKyAgICBwdWJsaWMgVGV4dFJlc3VsdChTdHJpbmcgcmVsYXRpdmVQYXRoKSB7CisgICAgICAgIG1SZWxhdGl2ZVBhdGggPSByZWxhdGl2ZVBhdGg7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RHVtcENoaWxkRnJhbWVzQXNUZXh0KGJvb2xlYW4gZHVtcENoaWxkRnJhbWVzQXNUZXh0KSB7CisgICAgICAgIG1EdW1wQ2hpbGRGcmFtZXNBc1RleHQgPSBkdW1wQ2hpbGRGcmFtZXNBc1RleHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogVXNlZCB0byByZWNyZWF0ZSB0aGUgUmVzdWx0IHdoZW4gcmVjZWl2ZWQgYnkgdGhlIHNlcnZpY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYnVuZGxlCisgICAgICogICAgICBidW5kbGUgd2l0aCBkYXRhIHVzZWQgdG8gcmVjcmVhdGUgdGhlIHJlc3VsdAorICAgICAqLworICAgIHB1YmxpYyBUZXh0UmVzdWx0KEJ1bmRsZSBidW5kbGUpIHsKKyAgICAgICAgbUV4cGVjdGVkUmVzdWx0ID0gYnVuZGxlLmdldFN0cmluZygiZXhwZWN0ZWRUZXh0dWFsUmVzdWx0Iik7CisgICAgICAgIG1BY3R1YWxSZXN1bHQgPSBidW5kbGUuZ2V0U3RyaW5nKCJhY3R1YWxUZXh0dWFsUmVzdWx0Iik7CisgICAgICAgIHNldEFkZGl0aW9uYWxUZXh0T3V0cHV0U3RyaW5nKGJ1bmRsZS5nZXRTdHJpbmcoImFkZGl0aW9uYWxUZXh0T3V0cHV0U3RyaW5nIikpOworICAgICAgICBtUmVsYXRpdmVQYXRoID0gYnVuZGxlLmdldFN0cmluZygicmVsYXRpdmVQYXRoIik7CisgICAgICAgIFN0cmluZyByZXN1bHRDb2RlID0gYnVuZGxlLmdldFN0cmluZygicmVzdWx0Q29kZSIpOworICAgICAgICBpZiAocmVzdWx0Q29kZSAhPSBudWxsKSB7CisgICAgICAgICAgICBtUmVzdWx0Q29kZSA9IFJlc3VsdENvZGUudmFsdWVPZihyZXN1bHRDb2RlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXN1bHRDb2RlIGdldFJlc3VsdENvZGUoKSB7CisgICAgICAgIGlmIChtUmVzdWx0Q29kZSAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbVJlc3VsdENvZGU7CisgICAgICAgIH0KKworICAgICAgICBpZiAobUV4cGVjdGVkUmVzdWx0ID09IG51bGwpIHsKKyAgICAgICAgICAgIG1SZXN1bHRDb2RlID0gQWJzdHJhY3RSZXN1bHQuUmVzdWx0Q29kZS5GQUlMX05PX0VYUEVDVEVEX1JFU1VMVDsKKyAgICAgICAgfSBlbHNlIGlmICghbUV4cGVjdGVkUmVzdWx0LmVxdWFscyhtQWN0dWFsUmVzdWx0KSkgeworICAgICAgICAgICAgbVJlc3VsdENvZGUgPSBBYnN0cmFjdFJlc3VsdC5SZXN1bHRDb2RlLkZBSUxfUkVTVUxUX0RJRkZFUlM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtUmVzdWx0Q29kZSA9IEFic3RyYWN0UmVzdWx0LlJlc3VsdENvZGUuUEFTUzsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBtUmVzdWx0Q29kZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYnl0ZVtdIGdldEFjdHVhbEltYWdlUmVzdWx0KCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldEFjdHVhbFRleHRSZXN1bHQoKSB7CisgICAgICAgIFN0cmluZyBhZGRpdGlvbmFsVGV4dFJlc3VsdFN0cmluZyA9IGdldEFkZGl0aW9uYWxUZXh0T3V0cHV0U3RyaW5nKCk7CisgICAgICAgIGlmIChhZGRpdGlvbmFsVGV4dFJlc3VsdFN0cmluZyAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gYWRkaXRpb25hbFRleHRSZXN1bHRTdHJpbmcrIG1BY3R1YWxSZXN1bHQ7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbUFjdHVhbFJlc3VsdDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRFeHBlY3RlZEltYWdlUmVzdWx0KGJ5dGVbXSBleHBlY3RlZFJlc3VsdCkgeworICAgICAgICAvKiogVGhpcyBtZXRob2QgaXMgbm90IGFwcGxpY2FibGUgdG8gdGhpcyB0eXBlIG9mIHJlc3VsdCAqLworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldEV4cGVjdGVkVGV4dFJlc3VsdChTdHJpbmcgZXhwZWN0ZWRSZXN1bHQpIHsKKyAgICAgICAgbUV4cGVjdGVkUmVzdWx0ID0gZXhwZWN0ZWRSZXN1bHQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXREaWZmQXNIdG1sKCkgeworICAgICAgICBTdHJpbmdCdWlsZGVyIGh0bWwgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBodG1sLmFwcGVuZCgiPHRhYmxlIGNsYXNzPVwidmlzdWFsX2RpZmZcIj4iKTsKKyAgICAgICAgaHRtbC5hcHBlbmQoIiAgICA8dHIgY2xhc3M9XCJoZWFkZXJzXCI+Iik7CisgICAgICAgIGh0bWwuYXBwZW5kKCIgICAgICAgIDx0ZCBjb2xzcGFuPVwiMlwiPkV4cGVjdGVkIHJlc3VsdDo8L3RkPiIpOworICAgICAgICBodG1sLmFwcGVuZCgiICAgICAgICA8dGQgY2xhc3M9XCJzcGFjZVwiPjwvdGQ+Iik7CisgICAgICAgIGh0bWwuYXBwZW5kKCIgICAgICAgIDx0ZCBjb2xzcGFuPVwiMlwiPkFjdHVhbCByZXN1bHQ6PC90ZD4iKTsKKyAgICAgICAgaHRtbC5hcHBlbmQoIiAgICA8L3RyPiIpOworCisgICAgICAgIGlmIChtRXhwZWN0ZWRSZXN1bHQgPT0gbnVsbCB8fCBtQWN0dWFsUmVzdWx0ID09IG51bGwpIHsKKyAgICAgICAgICAgIGFwcGVuZE51bGxzSHRtbChodG1sKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGFwcGVuZERpZmZIdG1sKGh0bWwpOworICAgICAgICB9CisKKyAgICAgICAgaHRtbC5hcHBlbmQoIiAgICA8dHIgY2xhc3M9XCJmb290ZXJzXCI+Iik7CisgICAgICAgIGh0bWwuYXBwZW5kKCIgICAgICAgIDx0ZCBjb2xzcGFuPVwiMlwiPjwvdGQ+Iik7CisgICAgICAgIGh0bWwuYXBwZW5kKCIgICAgICAgIDx0ZCBjbGFzcz1cInNwYWNlXCI+PC90ZD4iKTsKKyAgICAgICAgaHRtbC5hcHBlbmQoIiAgICAgICAgPHRkIGNvbHNwYW49XCIyXCI+PC90ZD4iKTsKKyAgICAgICAgaHRtbC5hcHBlbmQoIiAgICA8L3RyPiIpOworICAgICAgICBodG1sLmFwcGVuZCgiPC90YWJsZT4iKTsKKworICAgICAgICByZXR1cm4gaHRtbC50b1N0cmluZygpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhcHBlbmREaWZmSHRtbChTdHJpbmdCdWlsZGVyIGh0bWwpIHsKKyAgICAgICAgTGlua2VkTGlzdDxkaWZmX21hdGNoX3BhdGNoLkRpZmY+IGRpZmZzID0KKyAgICAgICAgICAgICAgICBuZXcgZGlmZl9tYXRjaF9wYXRjaCgpLmRpZmZfbWFpbihtRXhwZWN0ZWRSZXN1bHQsIG1BY3R1YWxSZXN1bHQpOworCisgICAgICAgIGRpZmZzID0gVmlzdWFsRGlmZlV0aWxzLnNwbGl0RGlmZnNPbk5ld2xpbmUoZGlmZnMpOworCisgICAgICAgIExpbmtlZExpc3Q8U3RyaW5nPiBleHBlY3RlZExpbmVzID0gbmV3IExpbmtlZExpc3Q8U3RyaW5nPigpOworICAgICAgICBMaW5rZWRMaXN0PEludGVnZXI+IGV4cGVjdGVkTGluZU51bXMgPSBuZXcgTGlua2VkTGlzdDxJbnRlZ2VyPigpOworICAgICAgICBMaW5rZWRMaXN0PFN0cmluZz4gYWN0dWFsTGluZXMgPSBuZXcgTGlua2VkTGlzdDxTdHJpbmc+KCk7CisgICAgICAgIExpbmtlZExpc3Q8SW50ZWdlcj4gYWN0dWFsTGluZU51bXMgPSBuZXcgTGlua2VkTGlzdDxJbnRlZ2VyPigpOworCisgICAgICAgIFZpc3VhbERpZmZVdGlscy5nZW5lcmF0ZUV4cGVjdGVkUmVzdWx0TGluZXMoZGlmZnMsIGV4cGVjdGVkTGluZU51bXMsIGV4cGVjdGVkTGluZXMpOworICAgICAgICBWaXN1YWxEaWZmVXRpbHMuZ2VuZXJhdGVBY3R1YWxSZXN1bHRMaW5lcyhkaWZmcywgYWN0dWFsTGluZU51bXMsIGFjdHVhbExpbmVzKTsKKworICAgICAgICBodG1sLmFwcGVuZChWaXN1YWxEaWZmVXRpbHMuZ2V0SHRtbChleHBlY3RlZExpbmVOdW1zLCBleHBlY3RlZExpbmVzLAorICAgICAgICAgICAgICAgIGFjdHVhbExpbmVOdW1zLCBhY3R1YWxMaW5lcykpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhcHBlbmROdWxsc0h0bWwoU3RyaW5nQnVpbGRlciBodG1sKSB7CisgICAgICAgIC8qKiBUT0RPOiBDcmVhdGUgYSBzZXBhcmF0ZSByb3cgZm9yIGVhY2ggbGluZSBvZiBub3QgbnVsbCByZXN1bHQgKi8KKyAgICAgICAgaHRtbC5hcHBlbmQoIiAgICA8dHIgY2xhc3M9XCJyZXN1bHRzXCI+Iik7CisgICAgICAgIGh0bWwuYXBwZW5kKCIgICAgPHRkIGNsYXNzPVwibGluZV9jb3VudFwiPiIpOworICAgICAgICBodG1sLmFwcGVuZCgiICAgIDwvdGQ+Iik7CisgICAgICAgIGh0bWwuYXBwZW5kKCIgICAgPHRkIGNsYXNzPVwibGluZVwiPiIpOworICAgICAgICBpZiAobUV4cGVjdGVkUmVzdWx0ID09IG51bGwpIHsKKyAgICAgICAgICAgIGh0bWwuYXBwZW5kKCJFeHBlY3RlZCByZXN1bHQgd2FzIE5VTEwiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGh0bWwuYXBwZW5kKG1FeHBlY3RlZFJlc3VsdC5yZXBsYWNlKCJcbiIsICI8YnIgLz4iKSk7CisgICAgICAgIH0KKyAgICAgICAgaHRtbC5hcHBlbmQoIiAgICAgICAgPC90ZD4iKTsKKyAgICAgICAgaHRtbC5hcHBlbmQoIiAgICAgICAgPHRkIGNsYXNzPVwic3BhY2VcIj48L3RkPiIpOworICAgICAgICBodG1sLmFwcGVuZCgiICAgIDx0ZCBjbGFzcz1cImxpbmVfY291bnRcIj4iKTsKKyAgICAgICAgaHRtbC5hcHBlbmQoIiAgICA8L3RkPiIpOworICAgICAgICBodG1sLmFwcGVuZCgiICAgIDx0ZCBjbGFzcz1cImxpbmVcIj4iKTsKKyAgICAgICAgaWYgKG1BY3R1YWxSZXN1bHQgPT0gbnVsbCkgeworICAgICAgICAgICAgaHRtbC5hcHBlbmQoIkFjdHVhbCByZXN1bHQgd2FzIE5VTEwiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGh0bWwuYXBwZW5kKG1BY3R1YWxSZXN1bHQucmVwbGFjZSgiXG4iLCAiPGJyIC8+IikpOworICAgICAgICB9CisgICAgICAgIGh0bWwuYXBwZW5kKCIgICAgICAgIDwvdGQ+Iik7CisgICAgICAgIGh0bWwuYXBwZW5kKCIgICAgPC90cj4iKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVGVzdFR5cGUgZ2V0VHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIFRlc3RUeXBlLlRFWFQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb2J0YWluQWN0dWFsUmVzdWx0cyhXZWJWaWV3IHdlYnZpZXcsIE1lc3NhZ2UgcmVzdWx0T2J0YWluZWRNc2cpIHsKKyAgICAgICAgbVJlc3VsdE9idGFpbmVkTXNnID0gcmVzdWx0T2J0YWluZWRNc2c7CisgICAgICAgIE1lc3NhZ2UgbXNnID0gbUhhbmRsZXIub2J0YWluTWVzc2FnZShNU0dfRE9DVU1FTlRfQVNfVEVYVCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIGFyZzEgLSBzaG91bGQgZHVtcCB0b3AgZnJhbWUgYXMgdGV4dAorICAgICAgICAgKiBhcmcyIC0gc2hvdWxkIGR1bXAgY2hpbGQgZnJhbWVzIGFzIHRleHQKKyAgICAgICAgICovCisgICAgICAgIG1zZy5hcmcxID0gMTsKKyAgICAgICAgbXNnLmFyZzIgPSBtRHVtcENoaWxkRnJhbWVzQXNUZXh0ID8gMSA6IDA7CisgICAgICAgIHdlYnZpZXcuZG9jdW1lbnRBc1RleHQobXNnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQnVuZGxlIGdldEJ1bmRsZSgpIHsKKyAgICAgICAgQnVuZGxlIGJ1bmRsZSA9IG5ldyBCdW5kbGUoKTsKKyAgICAgICAgYnVuZGxlLnB1dFN0cmluZygiZXhwZWN0ZWRUZXh0dWFsUmVzdWx0IiwgbUV4cGVjdGVkUmVzdWx0KTsKKyAgICAgICAgYnVuZGxlLnB1dFN0cmluZygiYWN0dWFsVGV4dHVhbFJlc3VsdCIsIGdldEFjdHVhbFRleHRSZXN1bHQoKSk7CisgICAgICAgIGJ1bmRsZS5wdXRTdHJpbmcoImFkZGl0aW9uYWxUZXh0T3V0cHV0U3RyaW5nIiwgZ2V0QWRkaXRpb25hbFRleHRPdXRwdXRTdHJpbmcoKSk7CisgICAgICAgIGJ1bmRsZS5wdXRTdHJpbmcoInJlbGF0aXZlUGF0aCIsIG1SZWxhdGl2ZVBhdGgpOworICAgICAgICBpZiAobVJlc3VsdENvZGUgIT0gbnVsbCkgeworICAgICAgICAgICAgYnVuZGxlLnB1dFN0cmluZygicmVzdWx0Q29kZSIsIG1SZXN1bHRDb2RlLm5hbWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgYnVuZGxlLnB1dFN0cmluZygidHlwZSIsIGdldFR5cGUoKS5uYW1lKCkpOworICAgICAgICByZXR1cm4gYnVuZGxlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVsYXRpdmVQYXRoKCkgeworICAgICAgICByZXR1cm4gbVJlbGF0aXZlUGF0aDsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvVmlzdWFsRGlmZlV0aWxzLmphdmEgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9WaXN1YWxEaWZmVXRpbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTBiNmJjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvVmlzdWFsRGlmZlV0aWxzLmphdmEKQEAgLTAsMCArMSwyMDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmR1bXByZW5kZXJ0cmVlMjsKKworaW1wb3J0IG5hbWUuZnJhc2VyLm5laWwucGxhaW50ZXh0LmRpZmZfbWF0Y2hfcGF0Y2g7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKKworLyoqCisgKiBIZWxwZXIgbWV0aG9kcyBmbyBUZXh0UmVzdWx0LmdldERpZmZBc0h0bWwoKQorICovCitwdWJsaWMgY2xhc3MgVmlzdWFsRGlmZlV0aWxzIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBET05UX1BSSU5UX0xJTkVfTlVNQkVSID0gLTE7CisKKyAgICAvKioKKyAgICAgKiBQcmVwcm9jZXNzZXMgdGhlIGxpc3Qgb2YgZGlmZnMgc28gdGhhdCBuZXcgbGluZSBjaGFyYWN0ZXJzIGFwcGVhciBvbmx5IGF0IHRoZSBlbmQgb2YKKyAgICAgKiBkaWZmLnRleHQKKyAgICAgKgorICAgICAqIEBwYXJhbSBkaWZmcworICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgIExpbmtlZExpc3Qgb2YgZGlmZnMgd2hlcmUgbmV3IGxpbmUgY2hhcmFjdGVyIGFwcGVhcnMgb25seSBvbiB0aGUgZW5kIG9mCisgICAgICogICAgICBkaWZmLnRleHQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIExpbmtlZExpc3Q8ZGlmZl9tYXRjaF9wYXRjaC5EaWZmPiBzcGxpdERpZmZzT25OZXdsaW5lKAorICAgICAgICAgICAgTGlua2VkTGlzdDxkaWZmX21hdGNoX3BhdGNoLkRpZmY+IGRpZmZzKSB7CisgICAgICAgIExpbmtlZExpc3Q8ZGlmZl9tYXRjaF9wYXRjaC5EaWZmPiBuZXdEaWZmcyA9IG5ldyBMaW5rZWRMaXN0PGRpZmZfbWF0Y2hfcGF0Y2guRGlmZj4oKTsKKworICAgICAgICBTdHJpbmdbXSBwYXJ0czsKKyAgICAgICAgaW50IGxlbmd0aE1pbnVzT25lOworICAgICAgICBmb3IgKGRpZmZfbWF0Y2hfcGF0Y2guRGlmZiBkaWZmIDogZGlmZnMpIHsKKyAgICAgICAgICAgIHBhcnRzID0gZGlmZi50ZXh0LnNwbGl0KCJcbiIsIC0xKTsKKyAgICAgICAgICAgIGlmIChwYXJ0cy5sZW5ndGggPT0gMSkgeworICAgICAgICAgICAgICAgIG5ld0RpZmZzLmFkZChkaWZmKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbGVuZ3RoTWludXNPbmUgPSBwYXJ0cy5sZW5ndGggLSAxOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGhNaW51c09uZTsgaSsrKSB7CisgICAgICAgICAgICAgICAgbmV3RGlmZnMuYWRkKG5ldyBkaWZmX21hdGNoX3BhdGNoLkRpZmYoZGlmZi5vcGVyYXRpb24sIHBhcnRzW2ldICsgIlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFwYXJ0c1tsZW5ndGhNaW51c09uZV0uaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgbmV3RGlmZnMuYWRkKG5ldyBkaWZmX21hdGNoX3BhdGNoLkRpZmYoZGlmZi5vcGVyYXRpb24sIHBhcnRzW2xlbmd0aE1pbnVzT25lXSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG5ld0RpZmZzOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBnZW5lcmF0ZUV4cGVjdGVkUmVzdWx0TGluZXMoTGlua2VkTGlzdDxkaWZmX21hdGNoX3BhdGNoLkRpZmY+IGRpZmZzLAorICAgICAgICAgICAgTGlua2VkTGlzdDxJbnRlZ2VyPiBsaW5lTnVtcywgTGlua2VkTGlzdDxTdHJpbmc+IGxpbmVzKSB7CisgICAgICAgIFN0cmluZyBkZWxTcGFuID0gIjxzcGFuIGNsYXNzPVwiZGVsXCI+IjsKKyAgICAgICAgU3RyaW5nIGVxbFNwYW4gPSAiPHNwYW4gY2xhc3M9XCJlcWxcIj4iOworCisgICAgICAgIFN0cmluZyBsaW5lID0gIiI7CisgICAgICAgIGludCBpID0gMTsKKyAgICAgICAgZm9yIChkaWZmX21hdGNoX3BhdGNoLkRpZmYgZGlmZiA6IGRpZmZzKSB7CisgICAgICAgICAgICBzd2l0Y2ggKGRpZmYub3BlcmF0aW9uKSB7CisgICAgICAgICAgICAgICAgY2FzZSBERUxFVEU6CisgICAgICAgICAgICAgICAgICAgIGxpbmUgPSBwcm9jZXNzRGlmZihkaWZmLCBsaW5lTnVtcywgbGluZXMsIGxpbmUsIGksIGRlbFNwYW4pOworICAgICAgICAgICAgICAgICAgICBpZiAobGluZS5lcXVhbHMoIiIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIElOU0VSVDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRpZmYudGV4dC5lbmRzV2l0aCgiXG4iKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbGluZU51bXMuYWRkKERPTlRfUFJJTlRfTElORV9OVU1CRVIpOworICAgICAgICAgICAgICAgICAgICAgICAgbGluZXMuYWRkKCIiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgRVFVQUw6CisgICAgICAgICAgICAgICAgICAgIGxpbmUgPSBwcm9jZXNzRGlmZihkaWZmLCBsaW5lTnVtcywgbGluZXMsIGxpbmUsIGksIGVxbFNwYW4pOworICAgICAgICAgICAgICAgICAgICBpZiAobGluZS5lcXVhbHMoIiIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWxpbmUuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBsaW5lcy5hZGQobGluZSk7CisgICAgICAgICAgICBsaW5lTnVtcy5hZGQoaSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgZ2VuZXJhdGVBY3R1YWxSZXN1bHRMaW5lcyhMaW5rZWRMaXN0PGRpZmZfbWF0Y2hfcGF0Y2guRGlmZj4gZGlmZnMsCisgICAgICAgICAgICBMaW5rZWRMaXN0PEludGVnZXI+IGxpbmVOdW1zLCBMaW5rZWRMaXN0PFN0cmluZz4gbGluZXMpIHsKKyAgICAgICAgU3RyaW5nIGluc1NwYW4gPSAiPHNwYW4gY2xhc3M9XCJpbnNcIj4iOworICAgICAgICBTdHJpbmcgZXFsU3BhbiA9ICI8c3BhbiBjbGFzcz1cImVxbFwiPiI7CisKKyAgICAgICAgU3RyaW5nIGxpbmUgPSAiIjsKKyAgICAgICAgaW50IGkgPSAxOworICAgICAgICBmb3IgKGRpZmZfbWF0Y2hfcGF0Y2guRGlmZiBkaWZmIDogZGlmZnMpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoZGlmZi5vcGVyYXRpb24pIHsKKyAgICAgICAgICAgICAgICBjYXNlIElOU0VSVDoKKyAgICAgICAgICAgICAgICAgICAgbGluZSA9IHByb2Nlc3NEaWZmKGRpZmYsIGxpbmVOdW1zLCBsaW5lcywgbGluZSwgaSwgaW5zU3Bhbik7CisgICAgICAgICAgICAgICAgICAgIGlmIChsaW5lLmVxdWFscygiIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgREVMRVRFOgorICAgICAgICAgICAgICAgICAgICBpZiAoZGlmZi50ZXh0LmVuZHNXaXRoKCJcbiIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsaW5lTnVtcy5hZGQoRE9OVF9QUklOVF9MSU5FX05VTUJFUik7CisgICAgICAgICAgICAgICAgICAgICAgICBsaW5lcy5hZGQoIiIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBFUVVBTDoKKyAgICAgICAgICAgICAgICAgICAgbGluZSA9IHByb2Nlc3NEaWZmKGRpZmYsIGxpbmVOdW1zLCBsaW5lcywgbGluZSwgaSwgZXFsU3Bhbik7CisgICAgICAgICAgICAgICAgICAgIGlmIChsaW5lLmVxdWFscygiIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICghbGluZS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIGxpbmVzLmFkZChsaW5lKTsKKyAgICAgICAgICAgIGxpbmVOdW1zLmFkZChpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdlbmVyYXRlIG9yIGFwcGVuZCBhIGxpbmUgZm9yIGEgZ2l2ZW4gZGlmZiBhbmQgYWRkIGl0IHRvIGdpdmVuIGNvbGxlY3Rpb25zIGlmIG5lY2Vzc2FyeS4KKyAgICAgKiBJdCBwdXRzIGRpZmZzIGluIEhUTUwgc3BhbnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGlmZgorICAgICAqIEBwYXJhbSBsaW5lTnVtcworICAgICAqIEBwYXJhbSBsaW5lcworICAgICAqIEBwYXJhbSBsaW5lCisgICAgICogQHBhcmFtIGkKKyAgICAgKiBAcGFyYW0gYmVnU3BhbgorICAgICAqIEByZXR1cm4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBwcm9jZXNzRGlmZihkaWZmX21hdGNoX3BhdGNoLkRpZmYgZGlmZiwgTGlua2VkTGlzdDxJbnRlZ2VyPiBsaW5lTnVtcywKKyAgICAgICAgICAgIExpbmtlZExpc3Q8U3RyaW5nPiBsaW5lcywgU3RyaW5nIGxpbmUsIGludCBpLCBTdHJpbmcgYmVnU3BhbikgeworICAgICAgICBTdHJpbmcgZW5kU3BhbiA9ICI8L3NwYW4+IjsKKyAgICAgICAgU3RyaW5nIGJyID0gIiZuYnNwOyI7CisKKyAgICAgICAgaWYgKGRpZmYudGV4dC5lbmRzV2l0aCgiXG4iKSkgeworICAgICAgICAgICAgbGluZU51bXMuYWRkKGkrKyk7CisgICAgICAgICAgICAvKiogVE9ETzogVGhpbmsgb2YgYmV0dGVyIHdheSB0byByZXBsYWNlIHN0dWZmICovCisgICAgICAgICAgICBsaW5lICs9IGJlZ1NwYW4gKyBkaWZmLnRleHQucmVwbGFjZSgiICAiLCAiJm5ic3A7Jm5ic3A7IikKKyAgICAgICAgICAgICAgICAgICAgKyBlbmRTcGFuICsgYnI7CisgICAgICAgICAgICBsaW5lcy5hZGQobGluZSk7CisgICAgICAgICAgICBsaW5lID0gIiI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBsaW5lICs9IGJlZ1NwYW4gKyBkaWZmLnRleHQucmVwbGFjZSgiICAiLCAiJm5ic3A7Jm5ic3A7IikgKyBlbmRTcGFuOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGxpbmU7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0SHRtbChMaW5rZWRMaXN0PEludGVnZXI+IGxpbmVOdW1zMSwgTGlua2VkTGlzdDxTdHJpbmc+IGxpbmVzMSwKKyAgICAgICAgICAgIExpbmtlZExpc3Q8SW50ZWdlcj4gbGluZU51bXMyLCBMaW5rZWRMaXN0PFN0cmluZz4gbGluZXMyKSB7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgaHRtbCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIGludCBsaW5lTnVtOworICAgICAgICBpbnQgc2l6ZSA9IGxpbmVzMS5zaXplKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICBodG1sLmFwcGVuZCgiPHRyIGNsYXNzPVwicmVzdWx0c1wiPiIpOworCisgICAgICAgICAgICBodG1sLmFwcGVuZCgiICAgIDx0ZCBjbGFzcz1cImxpbmVfY291bnRcIj4iKTsKKyAgICAgICAgICAgIGxpbmVOdW0gPSBsaW5lTnVtczEucmVtb3ZlRmlyc3QoKTsKKyAgICAgICAgICAgIGlmIChsaW5lTnVtID4gMCkgeworICAgICAgICAgICAgICAgIGh0bWwuYXBwZW5kKGxpbmVOdW0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaHRtbC5hcHBlbmQoIiAgICA8L3RkPiIpOworCisgICAgICAgICAgICBodG1sLmFwcGVuZCgiICAgIDx0ZCBjbGFzcz1cImxpbmVcIj4iKTsKKyAgICAgICAgICAgIGh0bWwuYXBwZW5kKGxpbmVzMS5yZW1vdmVGaXJzdCgpKTsKKyAgICAgICAgICAgIGh0bWwuYXBwZW5kKCIgICAgPC90ZD4iKTsKKworICAgICAgICAgICAgaHRtbC5hcHBlbmQoIiAgICA8dGQgY2xhc3M9XCJzcGFjZVwiPjwvdGQ+Iik7CisKKyAgICAgICAgICAgIGh0bWwuYXBwZW5kKCIgICAgPHRkIGNsYXNzPVwibGluZV9jb3VudFwiPiIpOworICAgICAgICAgICAgbGluZU51bSA9IGxpbmVOdW1zMi5yZW1vdmVGaXJzdCgpOworICAgICAgICAgICAgaWYgKGxpbmVOdW0gPiAwKSB7CisgICAgICAgICAgICAgICAgaHRtbC5hcHBlbmQobGluZU51bSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBodG1sLmFwcGVuZCgiICAgIDwvdGQ+Iik7CisKKyAgICAgICAgICAgIGh0bWwuYXBwZW5kKCIgICAgPHRkIGNsYXNzPVwibGluZVwiPiIpOworICAgICAgICAgICAgaHRtbC5hcHBlbmQobGluZXMyLnJlbW92ZUZpcnN0KCkpOworICAgICAgICAgICAgaHRtbC5hcHBlbmQoIiAgICA8L3RkPiIpOworCisgICAgICAgICAgICBodG1sLmFwcGVuZCgiPC90cj4iKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaHRtbC50b1N0cmluZygpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL3NjcmlwdHN1cHBvcnQvT25FdmVyeXRoaW5nRmluaXNoZWRDYWxsYmFjay5qYXZhIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvc2NyaXB0c3VwcG9ydC9PbkV2ZXJ5dGhpbmdGaW5pc2hlZENhbGxiYWNrLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTFkNDM2NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL3NjcmlwdHN1cHBvcnQvT25FdmVyeXRoaW5nRmluaXNoZWRDYWxsYmFjay5qYXZhCkBAIC0wLDAgKzEsMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmR1bXByZW5kZXJ0cmVlMi5zY3JpcHRzdXBwb3J0OworCisvKioKKyAqIENhbGxiYWNrIHVzZWQgdG8gaW5mb3JtIHNjcmlwdHN1cHBvcnQuU3RhcnRlciB0aGF0IGV2ZXJ5dGhpbmcgaXMgZmluaXNoZWQgYW5kCisgKiB3ZSBjYW4gZXhpdAorICovCitwdWJsaWMgaW50ZXJmYWNlIE9uRXZlcnl0aGluZ0ZpbmlzaGVkQ2FsbGJhY2sgeworICAgIHB1YmxpYyB2b2lkIG9uRmluaXNoZWQoKTsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9zY3JpcHRzdXBwb3J0L1NjcmlwdFRlc3RSdW5uZXIuamF2YSBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL3NjcmlwdHN1cHBvcnQvU2NyaXB0VGVzdFJ1bm5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4ZjU4ZDUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9zY3JpcHRzdXBwb3J0L1NjcmlwdFRlc3RSdW5uZXIuamF2YQpAQCAtMCwwICsxLDM3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5kdW1wcmVuZGVydHJlZTIuc2NyaXB0c3VwcG9ydDsKKworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyOworCisvKioKKyAqIEV4dGVuZHMgSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lciB0byBhbGxvdyB0aGUgc2NyaXB0IHRvIHBhc3MgYXJndW1lbnRzIHRvIHRoZSBhcHBsaWNhdGlvbgorICovCitwdWJsaWMgY2xhc3MgU2NyaXB0VGVzdFJ1bm5lciBleHRlbmRzIEluc3RydW1lbnRhdGlvblRlc3RSdW5uZXIgeworICAgIFN0cmluZyBtVGVzdHNSZWxhdGl2ZVBhdGg7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZShCdW5kbGUgYXJndW1lbnRzKSB7CisgICAgICAgIG1UZXN0c1JlbGF0aXZlUGF0aCA9IGFyZ3VtZW50cy5nZXRTdHJpbmcoInBhdGgiKTsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoYXJndW1lbnRzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFRlc3RzUmVsYXRpdmVQYXRoKCkgeworICAgICAgICByZXR1cm4gbVRlc3RzUmVsYXRpdmVQYXRoOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9zY3JpcHRzdXBwb3J0L1N0YXJ0ZXIuamF2YSBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL3NjcmlwdHN1cHBvcnQvU3RhcnRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkZmFlNjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9zY3JpcHRzdXBwb3J0L1N0YXJ0ZXIuamF2YQpAQCAtMCwwICsxLDc0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5kdW1wcmVuZGVydHJlZTIuc2NyaXB0c3VwcG9ydDsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC50ZXN0LkFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uVGVzdENhc2UyOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5kdW1wcmVuZGVydHJlZTIuVGVzdHNMaXN0QWN0aXZpdHk7CisKKy8qKgorICogQSBjbGFzcyB3aGljaCBwcm92aWRlcyBtZXRob2RzIHRoYXQgY2FuIGJlIGludm9rZWQgYnkgYSBzY3JpcHQgcnVubmluZyBvbiB0aGUgaG9zdCBtYWNoaW5lIHRvCisgKiBydW4gdGhlIHRlc3RzLgorICoKKyAqIEl0IHN0YXJ0cyBhIFRlc3RzTGlzdEFjdGl2aXR5IGFuZCBkb2VzIG5vdCByZXR1cm4gdW50aWwgYWxsIHRoZSB0ZXN0cyBmaW5pc2ggZXhlY3V0aW5nLgorICovCitwdWJsaWMgY2xhc3MgU3RhcnRlciBleHRlbmRzIEFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uVGVzdENhc2UyPFRlc3RzTGlzdEFjdGl2aXR5PiB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiU3RhcnRlciI7CisgICAgcHJpdmF0ZSBib29sZWFuIG1FdmVyeXRoaW5nRmluaXNoZWQ7CisKKyAgICBwdWJsaWMgU3RhcnRlcigpIHsKKyAgICAgICAgc3VwZXIoVGVzdHNMaXN0QWN0aXZpdHkuY2xhc3MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBmcm9tIGFkYiB0byBzdGFydCBleGVjdXRpbmcgdGhlIHRlc3RzLiBJdCBkb2Vzbid0IHJldHVybgorICAgICAqIHVudGlsIGV2ZXJ5dGhpbmcgaXMgZmluaXNoZWQgc28gdGhhdCB0aGUgc2NyaXB0IGNhbiB3YWl0IGZvciB0aGUgZW5kIGlmIGl0IG5lZWRzCisgICAgICogdG8uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RhcnRMYXlvdXRUZXN0cygpIHsKKyAgICAgICAgU2NyaXB0VGVzdFJ1bm5lciBydW5uZXIgPSAoU2NyaXB0VGVzdFJ1bm5lcilnZXRJbnN0cnVtZW50YXRpb24oKTsKKyAgICAgICAgU3RyaW5nIHJlbGF0aXZlUGF0aCA9IHJ1bm5lci5nZXRUZXN0c1JlbGF0aXZlUGF0aCgpOworCisgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KCk7CisgICAgICAgIGludGVudC5zZXRDbGFzc05hbWUoImNvbS5hbmRyb2lkLmR1bXByZW5kZXJ0cmVlMiIsICJUZXN0c0xpc3RBY3Rpdml0eSIpOworICAgICAgICBpbnRlbnQuc2V0QWN0aW9uKEludGVudC5BQ1RJT05fUlVOKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKFRlc3RzTGlzdEFjdGl2aXR5LkVYVFJBX1RFU1RfUEFUSCwgcmVsYXRpdmVQYXRoKTsKKyAgICAgICAgc2V0QWN0aXZpdHlJbnRlbnQoaW50ZW50KTsKKyAgICAgICAgZ2V0QWN0aXZpdHkoKS5yZWdpc3Rlck9uRXZlcnl0aGluZ0ZpbmlzaGVkQ2FsbGJhY2sobmV3IE9uRXZlcnl0aGluZ0ZpbmlzaGVkQ2FsbGJhY2soKSB7CisgICAgICAgICAgICAvKiogVGhpcyBtZXRob2QgaXMgc2FmZSB0byBjYWxsIG9uIGFueSB0aHJlYWQgKi8KKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25GaW5pc2hlZCgpIHsKKyAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKFN0YXJ0ZXIudGhpcykgeworICAgICAgICAgICAgICAgICAgICBtRXZlcnl0aGluZ0ZpbmlzaGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgU3RhcnRlci50aGlzLm5vdGlmeUFsbCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICB3aGlsZSAoIW1FdmVyeXRoaW5nRmluaXNoZWQpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICB0aGlzLndhaXQoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcgKyAiOjpzdGFydExheW91dFRlc3RzIiwgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi91aS9EaXJMaXN0QWN0aXZpdHkuamF2YSBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL3VpL0Rpckxpc3RBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmMGQ3ZDEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi91aS9EaXJMaXN0QWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDQwNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUyLnVpOworCitpbXBvcnQgY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUyLkZpbGVGaWx0ZXI7CitpbXBvcnQgY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUyLlRlc3RzTGlzdEFjdGl2aXR5OworaW1wb3J0IGNvbS5hbmRyb2lkLmR1bXByZW5kZXJ0cmVlMi5SOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5hcHAuQWxlcnREaWFsb2c7CitpbXBvcnQgYW5kcm9pZC5hcHAuRGlhbG9nOworaW1wb3J0IGFuZHJvaWQuYXBwLkxpc3RBY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmFwcC5Qcm9ncmVzc0RpYWxvZzsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuRGlhbG9nSW50ZXJmYWNlOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuRW52aXJvbm1lbnQ7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5BZGFwdGVyVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5BcnJheUFkYXB0ZXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuSW1hZ2VWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIEFuIEFjdGl2aXR5IHRoYXQgYWxsb3dzIG5hdmlnYXRpbmcgdGhyb3VnaCB0ZXN0cyBmb2xkZXJzIGFuZCBjaG9vc2luZyBmb2xkZXJzIG9yIHRlc3RzIHRvIHJ1bi4KKyAqLworcHVibGljIGNsYXNzIERpckxpc3RBY3Rpdml0eSBleHRlbmRzIExpc3RBY3Rpdml0eSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJEaXJMaXN0QWN0aXZpdHkiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBST09UX0RJUl9QQVRIID0KKyAgICAgICAgICAgIEVudmlyb25tZW50LmdldEV4dGVybmFsU3RvcmFnZURpcmVjdG9yeSgpICsKKyAgICAgICAgICAgIEZpbGUuc2VwYXJhdG9yICsgImFuZHJvaWQiICsKKyAgICAgICAgICAgIEZpbGUuc2VwYXJhdG9yICsgIkxheW91dFRlc3RzIjsKKworICAgIC8qKiBUT0RPOiBUaGlzIGlzIGp1c3QgYSBndWVzcyAtIHRoaW5rIG9mIGEgYmV0dGVyIHdheSB0byBhY2hpZXZlIGl0ICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1FQU5fVElUTEVfQ0hBUl9TSVpFID0gMTM7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUFJPR1JFU1NfRElBTE9HX0RFTEFZX01TID0gMjAwOworCisgICAgLyoqIENvZGUgZm9yIHRoZSBkaWFsb2csIHVzZWQgaW4gc2hvd0RpYWxvZyBhbmQgb25DcmVhdGVEaWFsb2cgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRElBTE9HX1JVTl9BQk9SVF9ESVIgPSAwOworCisgICAgLyoqIE1lc3NhZ2VzIGNvZGVzICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19MT0FERURfSVRFTVMgPSAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfU0hPV19QUk9HUkVTU19ESUFMT0cgPSAxOworCisgICAgLyoqIEluaXRpYWxpemVkIGxhemlseSBiZWZvcmUgZmlyc3Qgc1Byb2dyZXNzRGlhbG9nLnNob3coKSAqLworICAgIHByaXZhdGUgc3RhdGljIFByb2dyZXNzRGlhbG9nIHNQcm9ncmVzc0RpYWxvZzsKKworICAgIHByaXZhdGUgTGlzdFZpZXcgbUxpc3RWaWV3OworCisgICAgLyoqIFRoaXMgaXMgYSByZWxhdGl2ZSBwYXRoISAqLworICAgIHByaXZhdGUgU3RyaW5nIG1DdXJyZW50RGlyUGF0aDsKKworICAgIC8qKgorICAgICAqIFRPRE86IFRoaXMgc2hvdWxkIG5vdCBiZSBhIGNvbnN0YW50LCBidXQgcmF0aGVyIGJlIGNvbmZpZ3VyYWJsZSBmcm9tIHNvbWV3aGVyZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBtUm9vdERpclBhdGggPSBST09UX0RJUl9QQVRIOworCisgICAgcHJpdmF0ZSBGaWxlRmlsdGVyIG1GaWxlRmlsdGVyOworCisgICAgLyoqCisgICAgICogQSB0aHJlYWQgcmVzcG9uc2libGUgZm9yIGxvYWRpbmcgdGhlIGNvbnRlbnRzIG9mIHRoZSBkaXJlY3RvcnkgZnJvbSBzZCBjYXJkCisgICAgICogYW5kIHNlbmRpbmcgdGhlbSB2aWEgTWVzc2FnZSB0byBtYWluIHRocmVhZCB0aGF0IHRoZW4gbG9hZHMgdGhlbSBpbnRvCisgICAgICogTGlzdFZpZXcKKyAgICAgKi8KKyAgICBwcml2YXRlIGNsYXNzIExvYWRMaXN0SXRlbXNUaHJlYWQgZXh0ZW5kcyBUaHJlYWQgeworICAgICAgICBwcml2YXRlIEhhbmRsZXIgbUhhbmRsZXI7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIG1SZWxhdGl2ZVBhdGg7CisKKyAgICAgICAgcHVibGljIExvYWRMaXN0SXRlbXNUaHJlYWQoU3RyaW5nIHJlbGF0aXZlUGF0aCwgSGFuZGxlciBoYW5kbGVyKSB7CisgICAgICAgICAgICBtUmVsYXRpdmVQYXRoID0gcmVsYXRpdmVQYXRoOworICAgICAgICAgICAgbUhhbmRsZXIgPSBoYW5kbGVyOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgIE1lc3NhZ2UgbXNnID0gbUhhbmRsZXIub2J0YWluTWVzc2FnZShNU0dfTE9BREVEX0lURU1TKTsKKyAgICAgICAgICAgIG1zZy5vYmogPSBnZXREaXJMaXN0KG1SZWxhdGl2ZVBhdGgpOworICAgICAgICAgICAgbUhhbmRsZXIuc2VuZE1lc3NhZ2UobXNnKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFZlcnkgc2ltcGxlIG9iamVjdCB0byB1c2UgaW5zaWRlIExpc3RWaWV3IGFzIGFuIGl0ZW0uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTGlzdEl0ZW0gaW1wbGVtZW50cyBDb21wYXJhYmxlPExpc3RJdGVtPiB7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIG1SZWxhdGl2ZVBhdGg7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIG1OYW1lOworICAgICAgICBwcml2YXRlIGJvb2xlYW4gbUlzRGlyZWN0b3J5OworCisgICAgICAgIHB1YmxpYyBMaXN0SXRlbShTdHJpbmcgcmVsYXRpdmVQYXRoLCBib29sZWFuIGlzRGlyZWN0b3J5KSB7CisgICAgICAgICAgICBtUmVsYXRpdmVQYXRoID0gcmVsYXRpdmVQYXRoOworICAgICAgICAgICAgbU5hbWUgPSBuZXcgRmlsZShyZWxhdGl2ZVBhdGgpLmdldE5hbWUoKTsKKyAgICAgICAgICAgIG1Jc0RpcmVjdG9yeSA9IGlzRGlyZWN0b3J5OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNEaXJlY3RvcnkoKSB7CisgICAgICAgICAgICByZXR1cm4gbUlzRGlyZWN0b3J5OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRSZWxhdGl2ZVBhdGgoKSB7CisgICAgICAgICAgICByZXR1cm4gbVJlbGF0aXZlUGF0aDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtTmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmVUbyhMaXN0SXRlbSBhbm90aGVyKSB7CisgICAgICAgICAgICByZXR1cm4gbVJlbGF0aXZlUGF0aC5jb21wYXJlVG8oYW5vdGhlci5nZXRSZWxhdGl2ZVBhdGgoKSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CisgICAgICAgICAgICBpZiAoIShvIGluc3RhbmNlb2YgTGlzdEl0ZW0pKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gbVJlbGF0aXZlUGF0aC5lcXVhbHMoKChMaXN0SXRlbSkgbykuZ2V0UmVsYXRpdmVQYXRoKCkpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgICAgICByZXR1cm4gbVJlbGF0aXZlUGF0aC5oYXNoQ29kZSgpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIGN1c3RvbSBhZGFwdGVyIHRoYXQgc2V0cyB0aGUgcHJvcGVyIGljb24gYW5kIGxhYmVsIGluIHRoZSBsaXN0IHZpZXcuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRGlyTGlzdEFkYXB0ZXIgZXh0ZW5kcyBBcnJheUFkYXB0ZXI8TGlzdEl0ZW0+IHsKKyAgICAgICAgcHJpdmF0ZSBBY3Rpdml0eSBtQ29udGV4dDsKKyAgICAgICAgcHJpdmF0ZSBMaXN0SXRlbVtdIG1JdGVtczsKKworICAgICAgICBwdWJsaWMgRGlyTGlzdEFkYXB0ZXIoQWN0aXZpdHkgY29udGV4dCwgTGlzdEl0ZW1bXSBpdGVtcykgeworICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgUi5sYXlvdXQuZGlybGlzdF9yb3csIGl0ZW1zKTsKKworICAgICAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OworICAgICAgICAgICAgbUl0ZW1zID0gaXRlbXM7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFZpZXcgZ2V0VmlldyhpbnQgcG9zaXRpb24sIFZpZXcgY29udmVydFZpZXcsIFZpZXdHcm91cCBwYXJlbnQpIHsKKyAgICAgICAgICAgIExheW91dEluZmxhdGVyIGluZmxhdGVyID0gbUNvbnRleHQuZ2V0TGF5b3V0SW5mbGF0ZXIoKTsKKyAgICAgICAgICAgIFZpZXcgcm93ID0gaW5mbGF0ZXIuaW5mbGF0ZShSLmxheW91dC5kaXJsaXN0X3JvdywgbnVsbCk7CisKKyAgICAgICAgICAgIFRleHRWaWV3IGxhYmVsID0gKFRleHRWaWV3KSByb3cuZmluZFZpZXdCeUlkKFIuaWQubGFiZWwpOworICAgICAgICAgICAgbGFiZWwuc2V0VGV4dChtSXRlbXNbcG9zaXRpb25dLmdldE5hbWUoKSk7CisKKyAgICAgICAgICAgIEltYWdlVmlldyBpY29uID0gKEltYWdlVmlldykgcm93LmZpbmRWaWV3QnlJZChSLmlkLmljb24pOworICAgICAgICAgICAgaWYgKG1JdGVtc1twb3NpdGlvbl0uaXNEaXJlY3RvcnkoKSkgeworICAgICAgICAgICAgICAgIGljb24uc2V0SW1hZ2VSZXNvdXJjZShSLmRyYXdhYmxlLmZvbGRlcik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGljb24uc2V0SW1hZ2VSZXNvdXJjZShSLmRyYXdhYmxlLnJ1bnRlc3QpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gcm93OworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworCisgICAgICAgIG1GaWxlRmlsdGVyID0gbmV3IEZpbGVGaWx0ZXIoUk9PVF9ESVJfUEFUSCk7CisgICAgICAgIG1MaXN0VmlldyA9IGdldExpc3RWaWV3KCk7CisKKyAgICAgICAgbUxpc3RWaWV3LnNldE9uSXRlbUNsaWNrTGlzdGVuZXIobmV3IEFkYXB0ZXJWaWV3Lk9uSXRlbUNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uSXRlbUNsaWNrKEFkYXB0ZXJWaWV3PD8+IHBhcmVudCwgVmlldyB2aWV3LCBpbnQgcG9zaXRpb24sIGxvbmcgaWQpIHsKKyAgICAgICAgICAgICAgICBMaXN0SXRlbSBpdGVtID0gKExpc3RJdGVtKSBwYXJlbnQuZ2V0SXRlbUF0UG9zaXRpb24ocG9zaXRpb24pOworCisgICAgICAgICAgICAgICAgaWYgKGl0ZW0uaXNEaXJlY3RvcnkoKSkgeworICAgICAgICAgICAgICAgICAgICBzaG93RGlyKGl0ZW0uZ2V0UmVsYXRpdmVQYXRoKCkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8qKiBSdW4gdGhlIHRlc3QgKi8KKyAgICAgICAgICAgICAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgaW50ZW50LnNldENsYXNzKERpckxpc3RBY3Rpdml0eS50aGlzLCBUZXN0c0xpc3RBY3Rpdml0eS5jbGFzcyk7CisgICAgICAgICAgICAgICAgICAgIGludGVudC5zZXRBY3Rpb24oSW50ZW50LkFDVElPTl9SVU4pOworICAgICAgICAgICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoVGVzdHNMaXN0QWN0aXZpdHkuRVhUUkFfVEVTVF9QQVRILCBpdGVtLmdldFJlbGF0aXZlUGF0aCgpKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhcnRBY3Rpdml0eShpbnRlbnQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKyAgICAgICAgbUxpc3RWaWV3LnNldE9uSXRlbUxvbmdDbGlja0xpc3RlbmVyKG5ldyBBZGFwdGVyVmlldy5Pbkl0ZW1Mb25nQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gb25JdGVtTG9uZ0NsaWNrKEFkYXB0ZXJWaWV3PD8+IHBhcmVudCwgVmlldyB2aWV3LCBpbnQgcG9zaXRpb24sIGxvbmcgaWQpIHsKKyAgICAgICAgICAgICAgICBMaXN0SXRlbSBpdGVtID0gKExpc3RJdGVtKSBwYXJlbnQuZ2V0SXRlbUF0UG9zaXRpb24ocG9zaXRpb24pOworCisgICAgICAgICAgICAgICAgaWYgKGl0ZW0uaXNEaXJlY3RvcnkoKSkgeworICAgICAgICAgICAgICAgICAgICBCdW5kbGUgYXJndW1lbnRzID0gbmV3IEJ1bmRsZSgxKTsKKyAgICAgICAgICAgICAgICAgICAgYXJndW1lbnRzLnB1dFN0cmluZygibmFtZSIsIGl0ZW0uZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgYXJndW1lbnRzLnB1dFN0cmluZygicmVsYXRpdmVQYXRoIiwgaXRlbS5nZXRSZWxhdGl2ZVBhdGgoKSk7CisgICAgICAgICAgICAgICAgICAgIHNob3dEaWFsb2coRElBTE9HX1JVTl9BQk9SVF9ESVIsIGFyZ3VtZW50cyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLyoqIFRPRE86IE1heWJlIHNob3cgc29tZSBpbmZvIGFib3V0IGEgdGVzdD8gKi8KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKyAgICAgICAgLyoqIEFsbCB0aGUgcGF0aHMgYXJlIHJlbGF0aXZlIHRvIHRlc3Qgcm9vdCBkaXIgd2hlcmUgcG9zc2libGUgKi8KKyAgICAgICAgc2hvd0RpcigiIik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgLyoqCisgICAgICogTW92ZXMgdG8gdGhlIHBhcmVudCBkaXJlY3RvcnkgaWYgb25lIGV4aXN0cy4gRG9lcyBub3QgYWxsb3cgdG8gbW92ZSBhYm92ZQorICAgICAqIHRoZSB0ZXN0ICdyb290JyBkaXJlY3RvcnkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25CYWNrUHJlc3NlZCgpIHsKKyAgICAgICAgRmlsZSBjdXJyZW50RGlyUGFyZW50ID0gbmV3IEZpbGUobUN1cnJlbnREaXJQYXRoKS5nZXRQYXJlbnRGaWxlKCk7CisgICAgICAgIGlmIChjdXJyZW50RGlyUGFyZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNob3dEaXIoY3VycmVudERpclBhcmVudC5nZXRQYXRoKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2hvd0RpcigiIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcmV2ZW50cyB0aGUgYWN0aXZpdHkgZnJvbSByZWNyZWF0aW5nIG9uIGNoYW5nZSBvZiBvcmllbnRhdGlvbi4gVGhlIHRpdGxlIG5lZWRzIHRvCisgICAgICogYmUgcmVjYWxjdWxhdGVkLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQ29uZmlndXJhdGlvbkNoYW5nZWQoQ29uZmlndXJhdGlvbiBuZXdDb25maWcpIHsKKyAgICAgICAgc3VwZXIub25Db25maWd1cmF0aW9uQ2hhbmdlZChuZXdDb25maWcpOworCisgICAgICAgIHNldFRpdGxlKHNob3J0ZW5UaXRsZShtQ3VycmVudERpclBhdGgpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgRGlhbG9nIG9uQ3JlYXRlRGlhbG9nKGludCBpZCwgZmluYWwgQnVuZGxlIGFyZ3MpIHsKKyAgICAgICAgRGlhbG9nIGRpYWxvZyA9IG51bGw7CisgICAgICAgIEFsZXJ0RGlhbG9nLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBBbGVydERpYWxvZy5CdWlsZGVyKHRoaXMpOworCisgICAgICAgIHN3aXRjaCAoaWQpIHsKKyAgICAgICAgICAgIGNhc2UgRElBTE9HX1JVTl9BQk9SVF9ESVI6CisgICAgICAgICAgICAgICAgYnVpbGRlci5zZXRUaXRsZShnZXRUZXh0KFIuc3RyaW5nLmRpYWxvZ19ydW5fYWJvcnRfZGlyX3RpdGxlX3ByZWZpeCkgKyAiICIgKworICAgICAgICAgICAgICAgICAgICAgICAgYXJncy5nZXRTdHJpbmcoIm5hbWUiKSk7CisgICAgICAgICAgICAgICAgYnVpbGRlci5zZXRNZXNzYWdlKFIuc3RyaW5nLmRpYWxvZ19ydW5fYWJvcnRfZGlyX21zZyk7CisgICAgICAgICAgICAgICAgYnVpbGRlci5zZXRDYW5jZWxhYmxlKHRydWUpOworCisgICAgICAgICAgICAgICAgYnVpbGRlci5zZXRQb3NpdGl2ZUJ1dHRvbihSLnN0cmluZy5kaWFsb2dfcnVuX2Fib3J0X2Rpcl9va19idXR0b24sCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRGlhbG9nSW50ZXJmYWNlLk9uQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soRGlhbG9nSW50ZXJmYWNlIGRpYWxvZywgaW50IHdoaWNoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVEaWFsb2coRElBTE9HX1JVTl9BQk9SVF9ESVIpOworICAgICAgICAgICAgICAgICAgICAgICAgLyoqIFJ1biB0aGUgdGVzdHMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnRlbnQuc2V0Q2xhc3MoRGlyTGlzdEFjdGl2aXR5LnRoaXMsIFRlc3RzTGlzdEFjdGl2aXR5LmNsYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludGVudC5zZXRBY3Rpb24oSW50ZW50LkFDVElPTl9SVU4pOworICAgICAgICAgICAgICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKFRlc3RzTGlzdEFjdGl2aXR5LkVYVFJBX1RFU1RfUEFUSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncy5nZXRTdHJpbmcoInJlbGF0aXZlUGF0aCIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0QWN0aXZpdHkoaW50ZW50KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICAgICAgYnVpbGRlci5zZXROZWdhdGl2ZUJ1dHRvbihSLnN0cmluZy5kaWFsb2dfcnVuX2Fib3J0X2Rpcl9hYm9ydF9idXR0b24sCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRGlhbG9nSW50ZXJmYWNlLk9uQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soRGlhbG9nSW50ZXJmYWNlIGRpYWxvZywgaW50IHdoaWNoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVEaWFsb2coRElBTE9HX1JVTl9BQk9SVF9ESVIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgICAgICBkaWFsb2cgPSBidWlsZGVyLmNyZWF0ZSgpOworICAgICAgICAgICAgICAgIGRpYWxvZy5zZXRPbkNhbmNlbExpc3RlbmVyKG5ldyBEaWFsb2dJbnRlcmZhY2UuT25DYW5jZWxMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2FuY2VsKERpYWxvZ0ludGVyZmFjZSBkaWFsb2cpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZURpYWxvZyhESUFMT0dfUlVOX0FCT1JUX0RJUik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBkaWFsb2c7CisgICAgfQorCisgICAgLyoqCisgICAgICogTG9hZHMgdGhlIGNvbnRlbnRzIG9mIGRpciBpbnRvIHRoZSBsaXN0IHZpZXcuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGlyUGF0aAorICAgICAqICAgICAgZGlyZWN0b3J5IHRvIGxvYWQgaW50byBsaXN0IHZpZXcKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgc2hvd0RpcihTdHJpbmcgZGlyUGF0aCkgeworICAgICAgICBtQ3VycmVudERpclBhdGggPSBkaXJQYXRoOworCisgICAgICAgIC8qKiBTaG93IHByb2dyZXNzIGRpYWxvZyB3aXRoIGEgZGVsYXkgKi8KKyAgICAgICAgZmluYWwgSGFuZGxlciBkZWxheWVkRGlhbG9nSGFuZGxlciA9IG5ldyBIYW5kbGVyKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7CisgICAgICAgICAgICAgICAgaWYgKG1zZy53aGF0ID09IE1TR19TSE9XX1BST0dSRVNTX0RJQUxPRykgeworICAgICAgICAgICAgICAgICAgICBpZiAoc1Byb2dyZXNzRGlhbG9nID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNQcm9ncmVzc0RpYWxvZyA9IG5ldyBQcm9ncmVzc0RpYWxvZyhEaXJMaXN0QWN0aXZpdHkudGhpcyk7CisgICAgICAgICAgICAgICAgICAgICAgICBzUHJvZ3Jlc3NEaWFsb2cuc2V0Q2FuY2VsYWJsZShmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzUHJvZ3Jlc3NEaWFsb2cuc2V0UHJvZ3Jlc3NTdHlsZShQcm9ncmVzc0RpYWxvZy5TVFlMRV9TUElOTkVSKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNQcm9ncmVzc0RpYWxvZy5zZXRUaXRsZShSLnN0cmluZy5kaWFsb2dfcHJvZ3Jlc3NfdGl0bGUpOworICAgICAgICAgICAgICAgICAgICAgICAgc1Byb2dyZXNzRGlhbG9nLnNldE1lc3NhZ2UoZ2V0VGV4dChSLnN0cmluZy5kaWFsb2dfcHJvZ3Jlc3NfbXNnKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc1Byb2dyZXNzRGlhbG9nLnNob3coKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIE1lc3NhZ2UgbXNnU2hvd0RpYWxvZyA9IGRlbGF5ZWREaWFsb2dIYW5kbGVyLm9idGFpbk1lc3NhZ2UoTVNHX1NIT1dfUFJPR1JFU1NfRElBTE9HKTsKKyAgICAgICAgZGVsYXllZERpYWxvZ0hhbmRsZXIuc2VuZE1lc3NhZ2VEZWxheWVkKG1zZ1Nob3dEaWFsb2csIFBST0dSRVNTX0RJQUxPR19ERUxBWV9NUyk7CisKKyAgICAgICAgLyoqIERlbGVnYXRlIGxvYWRpbmcgY29udGVudHMgZnJvbSBTRCBjYXJkIHRvIGEgbmV3IHRocmVhZCAqLworICAgICAgICBuZXcgTG9hZExpc3RJdGVtc1RocmVhZChtQ3VycmVudERpclBhdGgsIG5ldyBIYW5kbGVyKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7CisgICAgICAgICAgICAgICAgaWYgKG1zZy53aGF0ID09IE1TR19MT0FERURfSVRFTVMpIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0TGlzdEFkYXB0ZXIobmV3IERpckxpc3RBZGFwdGVyKERpckxpc3RBY3Rpdml0eS50aGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMaXN0SXRlbVtdKW1zZy5vYmopKTsKKyAgICAgICAgICAgICAgICAgICAgZGVsYXllZERpYWxvZ0hhbmRsZXIucmVtb3ZlTWVzc2FnZXMoTVNHX1NIT1dfUFJPR1JFU1NfRElBTE9HKTsKKyAgICAgICAgICAgICAgICAgICAgc2V0VGl0bGUoc2hvcnRlblRpdGxlKG1DdXJyZW50RGlyUGF0aCkpOworICAgICAgICAgICAgICAgICAgICBpZiAoc1Byb2dyZXNzRGlhbG9nICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNQcm9ncmVzc0RpYWxvZy5kaXNtaXNzKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0pLnN0YXJ0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVE9ETzogZmluZCBhIG5lYXQgd2F5IHRvIGRldGVybWluZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0aGF0IGZpdCBpbiB0aGUgdGl0bGUKKyAgICAgKiBiYXIuCisgICAgICogKi8KKyAgICBwcml2YXRlIFN0cmluZyBzaG9ydGVuVGl0bGUoU3RyaW5nIHRpdGxlKSB7CisgICAgICAgIGlmICh0aXRsZS5lcXVhbHMoIiIpKSB7CisgICAgICAgICAgICByZXR1cm4gIlRlc3RzJyByb290IGRpcjoiOworICAgICAgICB9CisgICAgICAgIGludCBjaGFyQ291bnQgPSBtTGlzdFZpZXcuZ2V0V2lkdGgoKSAvIE1FQU5fVElUTEVfQ0hBUl9TSVpFOworCisgICAgICAgIGlmICh0aXRsZS5sZW5ndGgoKSA+IGNoYXJDb3VudCkgeworICAgICAgICAgICAgcmV0dXJuICIuLi4iICsgdGl0bGUuc3Vic3RyaW5nKHRpdGxlLmxlbmd0aCgpIC0gY2hhckNvdW50KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiB0aXRsZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgYXJyYXkgd2l0aCBjb250ZW50cyBvZiB0aGUgZ2l2ZW4gZGlyZWN0b3J5LgorICAgICAqIEZpcnN0IGl0IGNvbnRhaW5zIHRoZSBzdWJmb2xkZXJzLCB0aGVuIHRoZSBmaWxlcy4gQm90aCBzb3J0ZWQKKyAgICAgKiBhbHBoYWJldGljYWxseS4KKyAgICAgKgorICAgICAqIFRoZSBkaXJQYXRoIGlzIHJlbGF0aXZlLgorICAgICAqLworICAgIHByaXZhdGUgTGlzdEl0ZW1bXSBnZXREaXJMaXN0KFN0cmluZyBkaXJQYXRoKSB7CisgICAgICAgIEZpbGUgZGlyID0gbmV3IEZpbGUobVJvb3REaXJQYXRoLCBkaXJQYXRoKTsKKworICAgICAgICBpZiAoIWRpci5leGlzdHMoKSkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBMaXN0SXRlbVswXTsKKyAgICAgICAgfQorCisgICAgICAgIExpc3Q8TGlzdEl0ZW0+IHN1YkRpcnMgPSBuZXcgQXJyYXlMaXN0PExpc3RJdGVtPigpOworICAgICAgICBMaXN0PExpc3RJdGVtPiBzdWJGaWxlcyA9IG5ldyBBcnJheUxpc3Q8TGlzdEl0ZW0+KCk7CisKKyAgICAgICAgZm9yIChGaWxlIGl0ZW0gOiBkaXIubGlzdEZpbGVzKCkpIHsKKyAgICAgICAgICAgIGlmIChpdGVtLmlzRGlyZWN0b3J5KCkgJiYgRmlsZUZpbHRlci5pc1Rlc3REaXIoaXRlbS5nZXROYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgc3ViRGlycy5hZGQobmV3IExpc3RJdGVtKG1GaWxlRmlsdGVyLmdldFJlbGF0aXZlUGF0aChpdGVtKSwgdHJ1ZSkpOworICAgICAgICAgICAgfSBlbHNlIGlmIChGaWxlRmlsdGVyLmlzVGVzdEZpbGUoaXRlbS5nZXROYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgc3ViRmlsZXMuYWRkKG5ldyBMaXN0SXRlbShtRmlsZUZpbHRlci5nZXRSZWxhdGl2ZVBhdGgoaXRlbSksIGZhbHNlKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KHN1YkRpcnMpOworICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KHN1YkZpbGVzKTsKKworICAgICAgICAvKiogQ29uY2F0ZW5hdGUgdGhlIHR3byBsaXN0cyAqLworICAgICAgICBzdWJEaXJzLmFkZEFsbChzdWJGaWxlcyk7CisKKyAgICAgICAgcmV0dXJuIHN1YkRpcnMudG9BcnJheShuZXcgTGlzdEl0ZW1bc3ViRGlycy5zaXplKCldKTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L0FuZHJvaWQubWsgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDc0M2Y5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L0FuZHJvaWQubWsKQEAgLTAsMCArMSwyNiBAQAorIworIyBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtc3ViZGlyLWphdmEtZmlsZXMpCisKK0xPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBId0FjY2VsZXJhdGlvblRlc3QKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKKworaW5jbHVkZSAkKEJVSUxEX1BBQ0tBR0UpCmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9BbmRyb2lkTWFuaWZlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2NGYxM2UKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMCwwICsxLDIxMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAgCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgIAorICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgcGFja2FnZT0iY29tLmdvb2dsZS5hbmRyb2lkLnRlc3QuaHd1aSI+CisKKyAgICA8YXBwbGljYXRpb24KKyAgICAgICAgYW5kcm9pZDpsYWJlbD0iSHdVaSIKKyAgICAgICAgYW5kcm9pZDpoYXJkd2FyZUFjY2VsZXJhdGVkPSJ0cnVlIj4KKworICAgICAgICA8YWN0aXZpdHkKKyAgICAgICAgICAgICAgICBhbmRyb2lkOm5hbWU9IkFscGhhTGF5ZXJzQWN0aXZpdHkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iX86xTGF5ZXJzIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKyAgICAgICAgCisgICAgICAgIDxhY3Rpdml0eQorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iTGF5ZXJzQWN0aXZpdHkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iX0xheWVycyIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnRoZW1lPSJAYW5kcm9pZDpzdHlsZS9UaGVtZS5UcmFuc2x1Y2VudC5Ob1RpdGxlQmFyIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKworICAgICAgICA8YWN0aXZpdHkKKyAgICAgICAgICAgICAgICBhbmRyb2lkOm5hbWU9IlhmZXJtb2RlQWN0aXZpdHkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iX1hmZXJtb2RlcyIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnRoZW1lPSJAYW5kcm9pZDpzdHlsZS9UaGVtZS5UcmFuc2x1Y2VudC5Ob1RpdGxlQmFyIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKyAgICAgICAgCisgICAgICAgIDxhY3Rpdml0eQorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iQml0bWFwc0FjdGl2aXR5IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9Il9CaXRtYXBzIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGhlbWU9IkBhbmRyb2lkOnN0eWxlL1RoZW1lLlRyYW5zbHVjZW50Lk5vVGl0bGVCYXIiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgIDxhY3Rpdml0eQorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iQml0bWFwc0FscGhhQWN0aXZpdHkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iX0JpdG1hcHNBbHBoYSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnRoZW1lPSJAYW5kcm9pZDpzdHlsZS9UaGVtZS5UcmFuc2x1Y2VudC5Ob1RpdGxlQmFyIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKyAgICAgICAgCisgICAgICAgIDxhY3Rpdml0eQorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iQml0bWFwc1JlY3RBY3Rpdml0eSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJfQml0bWFwc1JlY3QiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0aGVtZT0iQGFuZHJvaWQ6c3R5bGUvVGhlbWUuVHJhbnNsdWNlbnQuTm9UaXRsZUJhciI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisgICAgICAgIAorICAgICAgICA8YWN0aXZpdHkKKyAgICAgICAgICAgICAgICBhbmRyb2lkOm5hbWU9Ik5pbmVQYXRjaGVzQWN0aXZpdHkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iXzlwYXRjaCI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisgICAgICAgIAorICAgICAgICA8YWN0aXZpdHkKKyAgICAgICAgICAgICAgICBhbmRyb2lkOm5hbWU9IlF1aWNrUmVqZWN0QWN0aXZpdHkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iX1F1aWNrUmVqZWN0Ij4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKyAgICAgICAgCisgICAgICAgIDxhY3Rpdml0eQorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iUm90YXRpb25BY3Rpdml0eSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJfUm90YXRpb24iPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgIDxhY3Rpdml0eQorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iU2hhZGVyc0FjdGl2aXR5IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9Il9TaGFkZXJzIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKyAgICAgICAgCisgICAgICAgIDxhY3Rpdml0eQorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iVGV4dEFjdGl2aXR5IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9Il9UZXh0IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGhlbWU9IkBhbmRyb2lkOnN0eWxlL1RoZW1lLk5vVGl0bGVCYXIiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgIDxhY3Rpdml0eQorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iTGlzdEFjdGl2aXR5IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9Il9MaXN0Ij4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKyAgICAgICAgCisgICAgICAgIDxhY3Rpdml0eQorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iTW9yZVNoYWRlcnNBY3Rpdml0eSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJfU2hhZGVyczIiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgIDxhY3Rpdml0eQorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iQ29sb3JGaWx0ZXJzQWN0aXZpdHkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iX0NvbG9yRmlsdGVycyI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKKyAgICAgICAgPGFjdGl2aXR5CisgICAgICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSJMaW5lc0FjdGl2aXR5IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9Il9MaW5lcyIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmhhcmR3YXJlQWNjZWxlcmF0ZWQ9ImZhbHNlIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKworICAgICAgICA8YWN0aXZpdHkKKyAgICAgICAgICAgICAgICBhbmRyb2lkOm5hbWU9IlBhdGhzQWN0aXZpdHkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iX1BhdGhzIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKworICAgICAgICA8YWN0aXZpdHkKKyAgICAgICAgICAgICAgICBhbmRyb2lkOm5hbWU9IlRyYW5zZm9ybTNkQWN0aXZpdHkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iXzNkIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKworICAgICAgICA8YWN0aXZpdHkKKyAgICAgICAgICAgICAgICBhbmRyb2lkOm5hbWU9IlNpbXBsZVBhdGhzQWN0aXZpdHkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iX1NpbXBsZVBhdGhzIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKworICAgICAgICA8YWN0aXZpdHkKKyAgICAgICAgICAgICAgICBhbmRyb2lkOm5hbWU9IkFkdmFuY2VkQmxlbmRBY3Rpdml0eSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJfQWR2YW5jZWRCbGVuZCI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKKyAgICAgICAgPGFjdGl2aXR5CisgICAgICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSJTdGFja0FjdGl2aXR5IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9Il9TdGFja3MiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgPC9hcHBsaWNhdGlvbj4KKzwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2RyYXdhYmxlLWhkcGkvaWNvbi5wbmcgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2RyYXdhYmxlLWhkcGkvaWNvbi5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjBmYmRmNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9yZXMvZHJhd2FibGUtaGRwaS9pY29uLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2RyYXdhYmxlLWhkcGkvc3Vuc2V0MS5qcGcgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2RyYXdhYmxlLWhkcGkvc3Vuc2V0MS5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTI4NTFmMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9yZXMvZHJhd2FibGUtaGRwaS9zdW5zZXQxLmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2RyYXdhYmxlLWhkcGkvc3Vuc2V0Mi5wbmcgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2RyYXdhYmxlLWhkcGkvc3Vuc2V0Mi5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzI1OGVlNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9yZXMvZHJhd2FibGUtaGRwaS9zdW5zZXQyLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2RyYXdhYmxlLWhkcGkvc3Vuc2V0My5wbmcgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2RyYXdhYmxlLWhkcGkvc3Vuc2V0My5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjUwOGIyNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9yZXMvZHJhd2FibGUtaGRwaS9zdW5zZXQzLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2RyYXdhYmxlL2ljb24ucG5nIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3Jlcy9kcmF3YWJsZS9pY29uLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjQwYTE5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3Jlcy9kcmF3YWJsZS9pY29uLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2RyYXdhYmxlL3N1bnNldDEuanBnIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3Jlcy9kcmF3YWJsZS9zdW5zZXQxLmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Mjg1MWYzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3Jlcy9kcmF3YWJsZS9zdW5zZXQxLmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2RyYXdhYmxlL3N1bnNldDIucG5nIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3Jlcy9kcmF3YWJsZS9zdW5zZXQyLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjU4ZWU3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3Jlcy9kcmF3YWJsZS9zdW5zZXQyLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2RyYXdhYmxlL3N1bnNldDMucG5nIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3Jlcy9kcmF3YWJsZS9zdW5zZXQzLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTA4YjI3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3Jlcy9kcmF3YWJsZS9zdW5zZXQzLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2xheW91dC9saXN0X2FjdGl2aXR5LnhtbCBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9yZXMvbGF5b3V0L2xpc3RfYWN0aXZpdHkueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiYmEzNzAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2xheW91dC9saXN0X2FjdGl2aXR5LnhtbApAQCAtMCwwICsxLDc4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50Ij4KKworICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiPgorICAgICAgICAKKyAgICAgICAgPEJ1dHRvbgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjBkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEuMCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iMTBkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iM2RpcCIKKworICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJBZGQiIC8+CisgICAgICAgIAorICAgICAgICA8QnV0dG9uCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMS4wIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSIzZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjEwZGlwIgorCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IlJlbW92ZSIgLz4KKyAgICAgICAgCisgICAgPC9MaW5lYXJMYXlvdXQ+CisgICAgCisgICAgPExpc3RWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvbGlzdCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEuMCIgLz4KKworICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiPgorICAgICAgICAKKyAgICAgICAgPEJ1dHRvbgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjBkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEuMCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iMTBkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iM2RpcCIKKworICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJBZGQiIC8+CisgICAgICAgIAorICAgICAgICA8QnV0dG9uCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMS4wIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSIzZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjEwZGlwIgorCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IlJlbW92ZSIgLz4KKyAgICAgICAgCisgICAgPC9MaW5lYXJMYXlvdXQ+CisKKzwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3Jlcy9sYXlvdXQvc3RhY2sueG1sIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3Jlcy9sYXlvdXQvc3RhY2sueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0ZDJkNzNhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3Jlcy9sYXlvdXQvc3RhY2sueG1sCkBAIC0wLDAgKzEsMzMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxGcmFtZUxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iZmlsbF9wYXJlbnQiCisgICAgYW5kcm9pZDpwYWRkaW5nVG9wPSIwZHAiCisgICAgYW5kcm9pZDpwYWRkaW5nQm90dG9tPSIwZHAiCisgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iMTJkcCIKKyAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iMTJkcCIKKyAgICBhbmRyb2lkOmZvY3VzYWJsZT0idHJ1ZSI+CisgICAgPFN0YWNrVmlldworICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3N0YWNrX3ZpZXciIAorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMzQ4cHgiIAorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjM3NHB4IgorICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJjZW50ZXIiCisgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iIzAwMDAwMDAwIgorICAgICAgICBhbmRyb2lkOmNhY2hlQ29sb3JIaW50PSIjMDAwMDAwMDAiCisgICAgICAgIGFuZHJvaWQ6YXV0b1N0YXJ0PSJ0cnVlIiAvPgorPC9GcmFtZUxheW91dD4KZGlmZiAtLWdpdCBhL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9yZXMvbGF5b3V0L3N0YWNrX2l0ZW0ueG1sIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3Jlcy9sYXlvdXQvc3RhY2tfaXRlbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzUwNDAxOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9yZXMvbGF5b3V0L3N0YWNrX2l0ZW0ueG1sCkBAIC0wLDAgKzEsMzggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxGcmFtZUxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDppZD0iQCtpZC9zdGFja19pdGVtIiAgCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iZmlsbF9wYXJlbnQiPiAKKyAgICA8RnJhbWVMYXlvdXQgIAorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iZmlsbF9wYXJlbnQiPiAKKyAgICAgICAgPEltYWdlVmlldyBhbmRyb2lkOmlkPSJAK2lkL3RleHR2aWV3X2ljb24iCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjI1MGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIyNTBkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJjZW50ZXIiIC8+CisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL21pbmlfdGV4dCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiIAorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiIAorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iY2VudGVyIiAvPgorICAgIDwvRnJhbWVMYXlvdXQ+CisgICAgPFRleHRWaWV3IAorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IiAKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iY2VudGVyIiAvPgorPC9GcmFtZUxheW91dD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9nb29nbGUvYW5kcm9pZC90ZXN0L2h3dWkvQWR2YW5jZWRCbGVuZEFjdGl2aXR5LmphdmEgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9nb29nbGUvYW5kcm9pZC90ZXN0L2h3dWkvQWR2YW5jZWRCbGVuZEFjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM4MGE2ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2dvb2dsZS9hbmRyb2lkL3Rlc3QvaHd1aS9BZHZhbmNlZEJsZW5kQWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDEzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdvb2dsZS5hbmRyb2lkLnRlc3QuaHd1aTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwRmFjdG9yeTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcFNoYWRlcjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ29tcG9zZVNoYWRlcjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkxpbmVhckdyYWRpZW50OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuTWF0cml4OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuU2hhZGVyOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworCitAU3VwcHJlc3NXYXJuaW5ncyh7IlVudXNlZERlY2xhcmF0aW9uIn0pCitwdWJsaWMgY2xhc3MgQWR2YW5jZWRCbGVuZEFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKworICAgICAgICBzZXRDb250ZW50VmlldyhuZXcgU2hhZGVyc1ZpZXcodGhpcykpOworICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBTaGFkZXJzVmlldyBleHRlbmRzIFZpZXcgeworICAgICAgICBwcml2YXRlIEJpdG1hcFNoYWRlciBtU2NhbGVkU2hhZGVyOworICAgICAgICBwcml2YXRlIGludCBtVGV4V2lkdGg7CisgICAgICAgIHByaXZhdGUgaW50IG1UZXhIZWlnaHQ7CisgICAgICAgIHByaXZhdGUgUGFpbnQgbVBhaW50OworICAgICAgICBwcml2YXRlIGZsb2F0IG1EcmF3V2lkdGg7CisgICAgICAgIHByaXZhdGUgZmxvYXQgbURyYXdIZWlnaHQ7CisgICAgICAgIHByaXZhdGUgTGluZWFyR3JhZGllbnQgbUhvckdyYWRpZW50OworICAgICAgICBwcml2YXRlIENvbXBvc2VTaGFkZXIgbUNvbXBvc2VTaGFkZXI7CisgICAgICAgIHByaXZhdGUgQ29tcG9zZVNoYWRlciBtQ29tcG9zZTJTaGFkZXI7CisgICAgICAgIHByaXZhdGUgQ29tcG9zZVNoYWRlciBtQ29tcG9zZTNTaGFkZXI7CisgICAgICAgIHByaXZhdGUgQ29tcG9zZVNoYWRlciBtQ29tcG9zZTRTaGFkZXI7CisgICAgICAgIHByaXZhdGUgQ29tcG9zZVNoYWRlciBtQ29tcG9zZTVTaGFkZXI7CisgICAgICAgIHByaXZhdGUgQ29tcG9zZVNoYWRlciBtQ29tcG9zZTZTaGFkZXI7CisgICAgICAgIHByaXZhdGUgQml0bWFwU2hhZGVyIG1TY2FsZWQyU2hhZGVyOworCisgICAgICAgIFNoYWRlcnNWaWV3KENvbnRleHQgYykgeworICAgICAgICAgICAgc3VwZXIoYyk7CisKKyAgICAgICAgICAgIEJpdG1hcCB0ZXh0dXJlID0gQml0bWFwRmFjdG9yeS5kZWNvZGVSZXNvdXJjZShjLmdldFJlc291cmNlcygpLCBSLmRyYXdhYmxlLnN1bnNldDEpOworICAgICAgICAgICAgbVRleFdpZHRoID0gdGV4dHVyZS5nZXRXaWR0aCgpOworICAgICAgICAgICAgbVRleEhlaWdodCA9IHRleHR1cmUuZ2V0SGVpZ2h0KCk7CisgICAgICAgICAgICBtRHJhd1dpZHRoID0gbVRleFdpZHRoICogMi4yZjsKKyAgICAgICAgICAgIG1EcmF3SGVpZ2h0ID0gbVRleEhlaWdodCAqIDEuMmY7CisKKyAgICAgICAgICAgIG1TY2FsZWRTaGFkZXIgPSBuZXcgQml0bWFwU2hhZGVyKHRleHR1cmUsIFNoYWRlci5UaWxlTW9kZS5NSVJST1IsCisgICAgICAgICAgICAgICAgICAgIFNoYWRlci5UaWxlTW9kZS5NSVJST1IpOworICAgICAgICAgICAgTWF0cml4IG0yID0gbmV3IE1hdHJpeCgpOworICAgICAgICAgICAgbTIuc2V0U2NhbGUoMC41ZiwgMC41Zik7CisgICAgICAgICAgICBtU2NhbGVkU2hhZGVyLnNldExvY2FsTWF0cml4KG0yKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgbVNjYWxlZDJTaGFkZXIgPSBuZXcgQml0bWFwU2hhZGVyKHRleHR1cmUsIFNoYWRlci5UaWxlTW9kZS5NSVJST1IsCisgICAgICAgICAgICAgICAgICAgIFNoYWRlci5UaWxlTW9kZS5NSVJST1IpOworICAgICAgICAgICAgTWF0cml4IG0zID0gbmV3IE1hdHJpeCgpOworICAgICAgICAgICAgbTMuc2V0U2NhbGUoMC4xZiwgMC4xZik7CisgICAgICAgICAgICBtU2NhbGVkMlNoYWRlci5zZXRMb2NhbE1hdHJpeChtMyk7CisKKyAgICAgICAgICAgIG1Ib3JHcmFkaWVudCA9IG5ldyBMaW5lYXJHcmFkaWVudCgwLjBmLCAwLjBmLCBtRHJhd1dpZHRoLCAwLjBmLAorICAgICAgICAgICAgICAgICAgICBDb2xvci5CTEFDSywgQ29sb3IuV0hJVEUsIFNoYWRlci5UaWxlTW9kZS5DTEFNUCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIG1Db21wb3NlU2hhZGVyID0gbmV3IENvbXBvc2VTaGFkZXIobVNjYWxlZFNoYWRlciwgbUhvckdyYWRpZW50LAorICAgICAgICAgICAgICAgICAgICBQb3J0ZXJEdWZmLk1vZGUuREFSS0VOKTsKKyAgICAgICAgICAgIG1Db21wb3NlMlNoYWRlciA9IG5ldyBDb21wb3NlU2hhZGVyKG1TY2FsZWRTaGFkZXIsIG1Ib3JHcmFkaWVudCwKKyAgICAgICAgICAgICAgICAgICAgUG9ydGVyRHVmZi5Nb2RlLkxJR0hURU4pOworICAgICAgICAgICAgbUNvbXBvc2UzU2hhZGVyID0gbmV3IENvbXBvc2VTaGFkZXIobVNjYWxlZFNoYWRlciwgbUhvckdyYWRpZW50LAorICAgICAgICAgICAgICAgICAgICBQb3J0ZXJEdWZmLk1vZGUuTVVMVElQTFkpOworICAgICAgICAgICAgbUNvbXBvc2U0U2hhZGVyID0gbmV3IENvbXBvc2VTaGFkZXIobVNjYWxlZFNoYWRlciwgbUhvckdyYWRpZW50LAorICAgICAgICAgICAgICAgICAgICBQb3J0ZXJEdWZmLk1vZGUuU0NSRUVOKTsKKyAgICAgICAgICAgIG1Db21wb3NlNVNoYWRlciA9IG5ldyBDb21wb3NlU2hhZGVyKG1TY2FsZWRTaGFkZXIsIG1Ib3JHcmFkaWVudCwKKyAgICAgICAgICAgICAgICAgICAgUG9ydGVyRHVmZi5Nb2RlLkFERCk7CisgICAgICAgICAgICBtQ29tcG9zZTZTaGFkZXIgPSBuZXcgQ29tcG9zZVNoYWRlcihtSG9yR3JhZGllbnQsIG1TY2FsZWRTaGFkZXIsCisgICAgICAgICAgICAgICAgICAgIFBvcnRlckR1ZmYuTW9kZS5PVkVSTEFZKTsKKworICAgICAgICAgICAgbVBhaW50ID0gbmV3IFBhaW50KCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25EcmF3KENhbnZhcyBjYW52YXMpIHsKKyAgICAgICAgICAgIHN1cGVyLm9uRHJhdyhjYW52YXMpOworICAgICAgICAgICAgY2FudmFzLmRyYXdSR0IoMjU1LCAyNTUsIDI1NSk7CisKKyAgICAgICAgICAgIGNhbnZhcy5zYXZlKCk7CisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDQwLjBmLCA0MC4wZik7CisKKyAgICAgICAgICAgIG1QYWludC5zZXRTaGFkZXIobUNvbXBvc2VTaGFkZXIpOworICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KDAuMGYsIDAuMGYsIG1EcmF3V2lkdGgsIG1EcmF3SGVpZ2h0LCBtUGFpbnQpOworICAgICAgICAgICAgCisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDAuMGYsIDQwLjBmICsgbURyYXdIZWlnaHQpOworICAgICAgICAgICAgbVBhaW50LnNldFNoYWRlcihtQ29tcG9zZTJTaGFkZXIpOworICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KDAuMGYsIDAuMGYsIG1EcmF3V2lkdGgsIG1EcmF3SGVpZ2h0LCBtUGFpbnQpOworCisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDAuMGYsIDQwLjBmICsgbURyYXdIZWlnaHQpOworICAgICAgICAgICAgbVBhaW50LnNldFNoYWRlcihtQ29tcG9zZTNTaGFkZXIpOworICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KDAuMGYsIDAuMGYsIG1EcmF3V2lkdGgsIG1EcmF3SGVpZ2h0LCBtUGFpbnQpOworCisgICAgICAgICAgICBjYW52YXMucmVzdG9yZSgpOworICAgICAgICAgICAgCisgICAgICAgICAgICBjYW52YXMuc2F2ZSgpOworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSg0MC4wZiArIG1EcmF3V2lkdGggKyA0MC4wZiwgNDAuMGYpOworICAgICAgICAgICAgCisgICAgICAgICAgICBtUGFpbnQuc2V0U2hhZGVyKG1Db21wb3NlNFNoYWRlcik7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QoMC4wZiwgMC4wZiwgbURyYXdXaWR0aCwgbURyYXdIZWlnaHQsIG1QYWludCk7CisKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMC4wZiwgNDAuMGYgKyBtRHJhd0hlaWdodCk7CisgICAgICAgICAgICBtUGFpbnQuc2V0U2hhZGVyKG1Db21wb3NlNVNoYWRlcik7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QoMC4wZiwgMC4wZiwgbURyYXdXaWR0aCwgbURyYXdIZWlnaHQsIG1QYWludCk7CisKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMC4wZiwgNDAuMGYgKyBtRHJhd0hlaWdodCk7CisgICAgICAgICAgICBtUGFpbnQuc2V0U2hhZGVyKG1Db21wb3NlNlNoYWRlcik7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QoMC4wZiwgMC4wZiwgbURyYXdXaWR0aCwgbURyYXdIZWlnaHQsIG1QYWludCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9nb29nbGUvYW5kcm9pZC90ZXN0L2h3dWkvQWxwaGFMYXllcnNBY3Rpdml0eS5qYXZhIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vZ29vZ2xlL2FuZHJvaWQvdGVzdC9od3VpL0FscGhhTGF5ZXJzQWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjE3YTA1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vZ29vZ2xlL2FuZHJvaWQvdGVzdC9od3VpL0FscGhhTGF5ZXJzQWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDE0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdvb2dsZS5hbmRyb2lkLnRlc3QuaHd1aTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuR3Jhdml0eTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFscGhhQW5pbWF0aW9uOworaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkZyYW1lTGF5b3V0OworCitAU3VwcHJlc3NXYXJuaW5ncyh7IlVudXNlZERlY2xhcmF0aW9uIn0pCitwdWJsaWMgY2xhc3MgQWxwaGFMYXllcnNBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJId1VpIjsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKworICAgICAgICBEaXJ0eUJpdG1hcFZpZXcgY29udGFpbmVyID0gbmV3IERpcnR5Qml0bWFwVmlldyh0aGlzKTsKKworICAgICAgICBDb2xvclZpZXcgY29sb3IgPSBuZXcgQ29sb3JWaWV3KHRoaXMpOworICAgICAgICBjb250YWluZXIuYWRkVmlldyhjb2xvciwgbmV3IERpcnR5Qml0bWFwVmlldy5MYXlvdXRQYXJhbXMoCisgICAgICAgICAgICAgICAgZGlwVG9QeCh0aGlzLCAxMDApLCBkaXBUb1B4KHRoaXMsIDEwMCksIEdyYXZpdHkuQ0VOVEVSKSk7CisKKyAgICAgICAgQWxwaGFBbmltYXRpb24gYSA9IG5ldyBBbHBoYUFuaW1hdGlvbigxLjBmLCAwLjBmKTsKKyAgICAgICAgYS5zZXREdXJhdGlvbigyMDAwKTsKKyAgICAgICAgYS5zZXRSZXBlYXRDb3VudChBbmltYXRpb24uSU5GSU5JVEUpOworICAgICAgICBhLnNldFJlcGVhdE1vZGUoQW5pbWF0aW9uLlJFVkVSU0UpOworICAgICAgICBjb2xvci5zdGFydEFuaW1hdGlvbihhKTsKKworICAgICAgICBzZXRDb250ZW50Vmlldyhjb250YWluZXIpOworICAgIH0KKyAgICAKKyAgICBAU3VwcHJlc3NXYXJuaW5ncyh7IlVudXNlZERlY2xhcmF0aW9uIn0pCisgICAgc3RhdGljIGludCBkaXBUb1B4KENvbnRleHQgYywgaW50IGRpcCkgeworICAgICAgICByZXR1cm4gKGludCkgKGMuZ2V0UmVzb3VyY2VzKCkuZ2V0RGlzcGxheU1ldHJpY3MoKS5kZW5zaXR5ICogZGlwICsgMC41Zik7CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIENvbG9yVmlldyBleHRlbmRzIFZpZXcgeworICAgICAgICBDb2xvclZpZXcoQ29udGV4dCBjKSB7CisgICAgICAgICAgICBzdXBlcihjKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvbkRyYXcoQ2FudmFzIGNhbnZhcykgeworICAgICAgICAgICAgc3VwZXIub25EcmF3KGNhbnZhcyk7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JHQigwLCAyNTUsIDApOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIERpcnR5Qml0bWFwVmlldyBleHRlbmRzIEZyYW1lTGF5b3V0IHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBQYWludCBtUGFpbnQ7CisKKyAgICAgICAgRGlydHlCaXRtYXBWaWV3KENvbnRleHQgYykgeworICAgICAgICAgICAgc3VwZXIoYyk7CisgICAgICAgICAgICBtUGFpbnQgPSBuZXcgUGFpbnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBkaXNwYXRjaERyYXcoQ2FudmFzIGNhbnZhcykgeworICAgICAgICAgICAgY2FudmFzLmRyYXdSR0IoMjU1LCAyNTUsIDI1NSk7CisKKyAgICAgICAgICAgIG1QYWludC5zZXRDb2xvcigweGZmZmYwMDAwKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdCgyMDAuMGYsIDAuMGYsIDIyMC4wZiwgMjAuMGYsIG1QYWludCk7CisKKyAgICAgICAgICAgIGNhbnZhcy5zYXZlKCk7CisgICAgICAgICAgICBjYW52YXMuY2xpcFJlY3QoMjAuMGYsIDAuMGYsIDQwLjBmLCAyMC4wZik7CisgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiY2xpcFJlY3QgPSAiICsgY2FudmFzLmdldENsaXBCb3VuZHMoKSk7CisgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAicmVqZWN0ZWQgPSAiICsgY2FudmFzLnF1aWNrUmVqZWN0KDEwMC4wZiwgMTAwLjBmLCAxMTAuMGYsIDExMC4wZiwKKyAgICAgICAgICAgICAgICAgICAgQ2FudmFzLkVkZ2VUeXBlLkJXKSk7CisgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAicmVqZWN0ZWQgPSAiICsgY2FudmFzLnF1aWNrUmVqZWN0KDI1LjBmLCA1LjBmLCAzMC4wZiwgMTAuMGYsCisgICAgICAgICAgICAgICAgICAgIENhbnZhcy5FZGdlVHlwZS5CVykpOworICAgICAgICAgICAgY2FudmFzLnJlc3RvcmUoKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgY2FudmFzLnNhdmUoKTsKKyAgICAgICAgICAgIGNhbnZhcy5zY2FsZSgyLjBmLCAyLjBmKTsKKyAgICAgICAgICAgIGNhbnZhcy5jbGlwUmVjdCgyMC4wZiwgMC4wZiwgNDAuMGYsIDIwLjBmKTsKKyAgICAgICAgICAgIExvZy5kKExPR19UQUcsICJjbGlwUmVjdCA9ICIgKyBjYW52YXMuZ2V0Q2xpcEJvdW5kcygpKTsKKyAgICAgICAgICAgIExvZy5kKExPR19UQUcsICJyZWplY3RlZCA9ICIgKyBjYW52YXMucXVpY2tSZWplY3QoNTAuMGYsIDUwLjBmLCA2MC4wZiwgNjAuMGYsCisgICAgICAgICAgICAgICAgICAgIENhbnZhcy5FZGdlVHlwZS5CVykpOworICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgInJlamVjdGVkID0gIiArIGNhbnZhcy5xdWlja1JlamVjdCgyNS4wZiwgNS4wZiwgMzAuMGYsIDEwLjBmLAorICAgICAgICAgICAgICAgICAgICBDYW52YXMuRWRnZVR5cGUuQlcpKTsKKyAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlKCk7CisKKyAgICAgICAgICAgIGNhbnZhcy5zYXZlKCk7CisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDIwLjBmLCAyMC4wZik7CisgICAgICAgICAgICBjYW52YXMuY2xpcFJlY3QoMjAuMGYsIDAuMGYsIDQwLjBmLCAyMC4wZik7CisgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiY2xpcFJlY3QgPSAiICsgY2FudmFzLmdldENsaXBCb3VuZHMoKSk7CisgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAicmVqZWN0ZWQgPSAiICsgY2FudmFzLnF1aWNrUmVqZWN0KDgwLjBmLCA4MC4wZiwgOTAuMGYsIDkwLjBmLAorICAgICAgICAgICAgICAgICAgICBDYW52YXMuRWRnZVR5cGUuQlcpKTsKKyAgICAgICAgICAgIExvZy5kKExPR19UQUcsICJyZWplY3RlZCA9ICIgKyBjYW52YXMucXVpY2tSZWplY3QoMjUuMGYsIDUuMGYsIDMwLjBmLCAxMC4wZiwKKyAgICAgICAgICAgICAgICAgICAgQ2FudmFzLkVkZ2VUeXBlLkJXKSk7CisgICAgICAgICAgICBjYW52YXMucmVzdG9yZSgpOworCisgICAgICAgICAgICBjYW52YXMuc2F2ZSgpOworICAgICAgICAgICAgY2FudmFzLnNjYWxlKDIuMGYsIDIuMGYpOyAgICAgICAgICAgIAorICAgICAgICAgICAgY2FudmFzLmNsaXBSZWN0KDIwLjBmLCAwLjBmLCA0MC4wZiwgMjAuMGYpOworCisgICAgICAgICAgICBtUGFpbnQuc2V0Q29sb3IoMHhmZjAwZmYwMCk7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QoMC4wZiwgMC4wZiwgMjAuMGYsIDIwLjBmLCBtUGFpbnQpOworICAgICAgICAgICAgCisgICAgICAgICAgICBtUGFpbnQuc2V0Q29sb3IoMHhmZjAwMDBmZik7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QoMjAuMGYsIDAuMGYsIDQwLjBmLCAyMC4wZiwgbVBhaW50KTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgY2FudmFzLnJlc3RvcmUoKTsKKworICAgICAgICAgICAgZmluYWwgaW50IHJlc3RvcmVUbyA9IGNhbnZhcy5zYXZlKCk7CisgICAgICAgICAgICBjYW52YXMuc2F2ZUxheWVyQWxwaGEoMC4wZiwgMTAwLjBmLCBnZXRXaWR0aCgpLCAxNTAuMGYsIDEyNywKKyAgICAgICAgICAgICAgICAgICAgQ2FudmFzLkhBU19BTFBIQV9MQVlFUl9TQVZFX0ZMQUcgfCBDYW52YXMuQ0xJUF9UT19MQVlFUl9TQVZFX0ZMQUcpOworICAgICAgICAgICAgbVBhaW50LnNldENvbG9yKDB4ZmYwMDAwZmYpOworICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KDAuMGYsIDEwMC4wZiwgNDAuMGYsIDE1MC4wZiwgbVBhaW50KTsKKyAgICAgICAgICAgIG1QYWludC5zZXRDb2xvcigweGZmMDBmZmZmKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdCg0MC4wZiwgMTAwLjBmLCAxNDAuMGYsIDE1MC4wZiwgbVBhaW50KTsKKyAgICAgICAgICAgIG1QYWludC5zZXRDb2xvcigweGZmZmYwMGZmKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdCgxNDAuMGYsIDEwMC4wZiwgMjQwLjBmLCAxNTAuMGYsIG1QYWludCk7CisgICAgICAgICAgICBjYW52YXMucmVzdG9yZVRvQ291bnQocmVzdG9yZVRvKTsKKworICAgICAgICAgICAgc3VwZXIuZGlzcGF0Y2hEcmF3KGNhbnZhcyk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9nb29nbGUvYW5kcm9pZC90ZXN0L2h3dWkvQml0bWFwc0FjdGl2aXR5LmphdmEgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9nb29nbGUvYW5kcm9pZC90ZXN0L2h3dWkvQml0bWFwc0FjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZhOGQzYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2dvb2dsZS9hbmRyb2lkL3Rlc3QvaHd1aS9CaXRtYXBzQWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDk2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ29vZ2xlLmFuZHJvaWQudGVzdC5od3VpOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXBGYWN0b3J5OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9ydGVyRHVmZlhmZXJtb2RlOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudmlldy5HcmF2aXR5OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uOworaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uU2NhbGVBbmltYXRpb247CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuRnJhbWVMYXlvdXQ7CisKK0BTdXBwcmVzc1dhcm5pbmdzKHsiVW51c2VkRGVjbGFyYXRpb24ifSkKK3B1YmxpYyBjbGFzcyBCaXRtYXBzQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBmaW5hbCBCaXRtYXBzVmlldyB2aWV3ID0gbmV3IEJpdG1hcHNWaWV3KHRoaXMpOworICAgICAgICBmaW5hbCBGcmFtZUxheW91dCBsYXlvdXQgPSBuZXcgRnJhbWVMYXlvdXQodGhpcyk7CisgICAgICAgIGxheW91dC5hZGRWaWV3KHZpZXcsIG5ldyBGcmFtZUxheW91dC5MYXlvdXRQYXJhbXMoNDgwLCA4MDAsIEdyYXZpdHkuQ0VOVEVSKSk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KGxheW91dCk7CisgICAgICAgIAorICAgICAgICBTY2FsZUFuaW1hdGlvbiBhID0gbmV3IFNjYWxlQW5pbWF0aW9uKDEuMGYsIDIuMGYsIDEuMGYsIDIuMGYsCisgICAgICAgICAgICAgICAgU2NhbGVBbmltYXRpb24uUkVMQVRJVkVfVE9fU0VMRiwgMC41ZiwKKyAgICAgICAgICAgICAgICBTY2FsZUFuaW1hdGlvbi5SRUxBVElWRV9UT19TRUxGLDAuNWYpOworICAgICAgICBhLnNldER1cmF0aW9uKDIwMDApOworICAgICAgICBhLnNldFJlcGVhdENvdW50KEFuaW1hdGlvbi5JTkZJTklURSk7CisgICAgICAgIGEuc2V0UmVwZWF0TW9kZShBbmltYXRpb24uUkVWRVJTRSk7CisgICAgICAgIHZpZXcuc3RhcnRBbmltYXRpb24oYSk7CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIEJpdG1hcHNWaWV3IGV4dGVuZHMgVmlldyB7CisgICAgICAgIHByaXZhdGUgUGFpbnQgbUJpdG1hcFBhaW50OworICAgICAgICBwcml2YXRlIGZpbmFsIEJpdG1hcCBtQml0bWFwMTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBCaXRtYXAgbUJpdG1hcDI7CisgICAgICAgIHByaXZhdGUgZmluYWwgUG9ydGVyRHVmZlhmZXJtb2RlIG1Ec3RJbjsKKworICAgICAgICBCaXRtYXBzVmlldyhDb250ZXh0IGMpIHsKKyAgICAgICAgICAgIHN1cGVyKGMpOworCisgICAgICAgICAgICBtQml0bWFwMSA9IEJpdG1hcEZhY3RvcnkuZGVjb2RlUmVzb3VyY2UoYy5nZXRSZXNvdXJjZXMoKSwgUi5kcmF3YWJsZS5zdW5zZXQxKTsKKyAgICAgICAgICAgIG1CaXRtYXAyID0gQml0bWFwRmFjdG9yeS5kZWNvZGVSZXNvdXJjZShjLmdldFJlc291cmNlcygpLCBSLmRyYXdhYmxlLnN1bnNldDIpOworCisgICAgICAgICAgICBtQml0bWFwUGFpbnQgPSBuZXcgUGFpbnQoKTsKKyAgICAgICAgICAgIG1Ec3RJbiA9IG5ldyBQb3J0ZXJEdWZmWGZlcm1vZGUoUG9ydGVyRHVmZi5Nb2RlLkRTVF9JTik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25EcmF3KENhbnZhcyBjYW52YXMpIHsKKyAgICAgICAgICAgIHN1cGVyLm9uRHJhdyhjYW52YXMpOworCisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDEyMC4wZiwgNTAuMGYpOworICAgICAgICAgICAgY2FudmFzLmRyYXdCaXRtYXAobUJpdG1hcDEsIDAuMGYsIDAuMGYsIG1CaXRtYXBQYWludCk7CisKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMC4wZiwgbUJpdG1hcDEuZ2V0SGVpZ2h0KCkpOworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgwLjBmLCAyNS4wZik7CisgICAgICAgICAgICBjYW52YXMuZHJhd0JpdG1hcChtQml0bWFwMiwgMC4wZiwgMC4wZiwgbnVsbCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIG1CaXRtYXBQYWludC5zZXRBbHBoYSgxMjcpOworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgwLjBmLCBtQml0bWFwMi5nZXRIZWlnaHQoKSk7CisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDAuMGYsIDI1LjBmKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3Qml0bWFwKG1CaXRtYXAxLCAwLjBmLCAwLjBmLCBtQml0bWFwUGFpbnQpOworICAgICAgICAgICAgCisgICAgICAgICAgICBtQml0bWFwUGFpbnQuc2V0QWxwaGEoMjU1KTsKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMC4wZiwgbUJpdG1hcDEuZ2V0SGVpZ2h0KCkpOworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgwLjBmLCAyNS4wZik7CisgICAgICAgICAgICBtQml0bWFwUGFpbnQuc2V0Q29sb3IoMHhmZmZmMDAwMCk7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QoMC4wZiwgMC4wZiwgbUJpdG1hcDIuZ2V0V2lkdGgoKSwgbUJpdG1hcDIuZ2V0SGVpZ2h0KCksIG1CaXRtYXBQYWludCk7CisgICAgICAgICAgICBtQml0bWFwUGFpbnQuc2V0WGZlcm1vZGUobURzdEluKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3Qml0bWFwKG1CaXRtYXAyLCAwLjBmLCAwLjBmLCBtQml0bWFwUGFpbnQpOworCisgICAgICAgICAgICBtQml0bWFwUGFpbnQucmVzZXQoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2dvb2dsZS9hbmRyb2lkL3Rlc3QvaHd1aS9CaXRtYXBzQWxwaGFBY3Rpdml0eS5qYXZhIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vZ29vZ2xlL2FuZHJvaWQvdGVzdC9od3VpL0JpdG1hcHNBbHBoYUFjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZmZDhmZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2dvb2dsZS9hbmRyb2lkL3Rlc3QvaHd1aS9CaXRtYXBzQWxwaGFBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsODIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5nb29nbGUuYW5kcm9pZC50ZXN0Lmh3dWk7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcEZhY3Rvcnk7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5HcmF2aXR5OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkZyYW1lTGF5b3V0OworCitAU3VwcHJlc3NXYXJuaW5ncyh7IlVudXNlZERlY2xhcmF0aW9uIn0pCitwdWJsaWMgY2xhc3MgQml0bWFwc0FscGhhQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBmaW5hbCBCaXRtYXBzVmlldyB2aWV3ID0gbmV3IEJpdG1hcHNWaWV3KHRoaXMpOworICAgICAgICBmaW5hbCBGcmFtZUxheW91dCBsYXlvdXQgPSBuZXcgRnJhbWVMYXlvdXQodGhpcyk7CisgICAgICAgIGxheW91dC5hZGRWaWV3KHZpZXcsIG5ldyBGcmFtZUxheW91dC5MYXlvdXRQYXJhbXMoNDgwLCA4MDAsIEdyYXZpdHkuQ0VOVEVSKSk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KGxheW91dCk7CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIEJpdG1hcHNWaWV3IGV4dGVuZHMgVmlldyB7CisgICAgICAgIHByaXZhdGUgUGFpbnQgbUJpdG1hcFBhaW50OworICAgICAgICBwcml2YXRlIGZpbmFsIEJpdG1hcCBtQml0bWFwMTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBCaXRtYXAgbUJpdG1hcDI7CisgICAgICAgIHByaXZhdGUgQml0bWFwIG1CaXRtYXAzOworCisgICAgICAgIEJpdG1hcHNWaWV3KENvbnRleHQgYykgeworICAgICAgICAgICAgc3VwZXIoYyk7CisKKyAgICAgICAgICAgIExvZy5kKCJPcGVuR0xSZW5kZXJlciIsICJMb2FkaW5nIHN1bnNldDEsIGRlZmF1bHQgb3B0aW9ucyIpOworICAgICAgICAgICAgbUJpdG1hcDEgPSBCaXRtYXBGYWN0b3J5LmRlY29kZVJlc291cmNlKGMuZ2V0UmVzb3VyY2VzKCksIFIuZHJhd2FibGUuc3Vuc2V0MSk7CisgICAgICAgICAgICBMb2cuZCgiT3BlbkdMUmVuZGVyZXIiLCAiTG9hZGluZyBzdW5zZXQyLCBkZWZhdWx0IG9wdGlvbnMiKTsKKyAgICAgICAgICAgIG1CaXRtYXAyID0gQml0bWFwRmFjdG9yeS5kZWNvZGVSZXNvdXJjZShjLmdldFJlc291cmNlcygpLCBSLmRyYXdhYmxlLnN1bnNldDIpOworICAgICAgICAgICAgTG9nLmQoIk9wZW5HTFJlbmRlcmVyIiwgIkxvYWRpbmcgc3Vuc2V0MywgZm9yY2luZyBBUkdCLTg4ODgiKTsKKyAgICAgICAgICAgIEJpdG1hcEZhY3RvcnkuT3B0aW9ucyBvcHRzID0gbmV3IEJpdG1hcEZhY3RvcnkuT3B0aW9ucygpOworICAgICAgICAgICAgb3B0cy5pblByZWZlcnJlZENvbmZpZyA9IEJpdG1hcC5Db25maWcuQVJHQl84ODg4OworICAgICAgICAgICAgbUJpdG1hcDMgPSBCaXRtYXBGYWN0b3J5LmRlY29kZVJlc291cmNlKGMuZ2V0UmVzb3VyY2VzKCksIFIuZHJhd2FibGUuc3Vuc2V0Mywgb3B0cyk7CisgICAgICAgICAgICBMb2cuZCgiT3BlbkdMUmVuZGVyZXIiLCAiICAgIGhhcyBiaXRtYXAgYWxwaGE/ICIgKyBtQml0bWFwMy5oYXNBbHBoYSgpKTsKKworICAgICAgICAgICAgbUJpdG1hcFBhaW50ID0gbmV3IFBhaW50KCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25EcmF3KENhbnZhcyBjYW52YXMpIHsKKyAgICAgICAgICAgIHN1cGVyLm9uRHJhdyhjYW52YXMpOworICAgICAgICAgICAgCisgICAgICAgICAgICBMb2cuZCgiT3BlbkdMUmVuZGVyZXIiLCAiPT09PT09PT09PT09PT09PT0gRHJhdyIpOworCisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDEyMC4wZiwgNTAuMGYpOworICAgICAgICAgICAgY2FudmFzLmRyYXdCaXRtYXAobUJpdG1hcDEsIDAuMGYsIDAuMGYsIG1CaXRtYXBQYWludCk7CisKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMC4wZiwgbUJpdG1hcDEuZ2V0SGVpZ2h0KCkpOworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgwLjBmLCAyNS4wZik7CisgICAgICAgICAgICBjYW52YXMuZHJhd0JpdG1hcChtQml0bWFwMiwgMC4wZiwgMC4wZiwgbnVsbCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMC4wZiwgbUJpdG1hcDIuZ2V0SGVpZ2h0KCkpOworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgwLjBmLCAyNS4wZik7CisgICAgICAgICAgICBjYW52YXMuZHJhd0JpdG1hcChtQml0bWFwMywgMC4wZiwgMC4wZiwgbnVsbCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9nb29nbGUvYW5kcm9pZC90ZXN0L2h3dWkvQml0bWFwc1JlY3RBY3Rpdml0eS5qYXZhIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vZ29vZ2xlL2FuZHJvaWQvdGVzdC9od3VpL0JpdG1hcHNSZWN0QWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODcyNmMyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vZ29vZ2xlL2FuZHJvaWQvdGVzdC9od3VpL0JpdG1hcHNSZWN0QWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDc3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ29vZ2xlLmFuZHJvaWQudGVzdC5od3VpOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXBGYWN0b3J5OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdEY7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CisKK0BTdXBwcmVzc1dhcm5pbmdzKHsiVW51c2VkRGVjbGFyYXRpb24ifSkKK3B1YmxpYyBjbGFzcyBCaXRtYXBzUmVjdEFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICAgICAgZmluYWwgQml0bWFwc1ZpZXcgdmlldyA9IG5ldyBCaXRtYXBzVmlldyh0aGlzKTsKKyAgICAgICAgc2V0Q29udGVudFZpZXcodmlldyk7CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIEJpdG1hcHNWaWV3IGV4dGVuZHMgVmlldyB7CisgICAgICAgIHByaXZhdGUgUGFpbnQgbUJpdG1hcFBhaW50OworICAgICAgICBwcml2YXRlIGZpbmFsIEJpdG1hcCBtQml0bWFwMTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBCaXRtYXAgbUJpdG1hcDI7CisgICAgICAgIHByaXZhdGUgZmluYWwgUmVjdCBtU3JjUmVjdDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBSZWN0RiBtRHN0UmVjdDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBSZWN0RiBtRHN0UmVjdDI7CisKKyAgICAgICAgQml0bWFwc1ZpZXcoQ29udGV4dCBjKSB7CisgICAgICAgICAgICBzdXBlcihjKTsKKworICAgICAgICAgICAgbUJpdG1hcDEgPSBCaXRtYXBGYWN0b3J5LmRlY29kZVJlc291cmNlKGMuZ2V0UmVzb3VyY2VzKCksIFIuZHJhd2FibGUuc3Vuc2V0MSk7CisgICAgICAgICAgICBtQml0bWFwMiA9IEJpdG1hcEZhY3RvcnkuZGVjb2RlUmVzb3VyY2UoYy5nZXRSZXNvdXJjZXMoKSwgUi5kcmF3YWJsZS5zdW5zZXQyKTsKKworICAgICAgICAgICAgbUJpdG1hcFBhaW50ID0gbmV3IFBhaW50KCk7CisgICAgICAgICAgICBtQml0bWFwUGFpbnQuc2V0RmlsdGVyQml0bWFwKHRydWUpOworCisgICAgICAgICAgICBmaW5hbCBmbG9hdCBmb3VydGggPSBtQml0bWFwMS5nZXRXaWR0aCgpIC8gNC4wZjsKKyAgICAgICAgICAgIGZpbmFsIGZsb2F0IGhhbGYgPSBtQml0bWFwMS5nZXRIZWlnaHQoKSAvIDIuMGY7CisgICAgICAgICAgICBtU3JjUmVjdCA9IG5ldyBSZWN0KChpbnQpIGZvdXJ0aCwgKGludCkgKGhhbGYgLSBoYWxmIC8gMi4wZiksCisgICAgICAgICAgICAgICAgICAgIChpbnQpIChmb3VydGggKyBmb3VydGgpLCAoaW50KSAoaGFsZiArIGhhbGYgLyAyLjBmKSk7CisgICAgICAgICAgICBtRHN0UmVjdCA9IG5ldyBSZWN0Rihmb3VydGgsIGhhbGYgLSBoYWxmIC8gMi4wZiwgZm91cnRoICsgZm91cnRoLCBoYWxmICsgaGFsZiAvIDIuMGYpOworICAgICAgICAgICAgbURzdFJlY3QyID0gbmV3IFJlY3RGKGZvdXJ0aCwgaGFsZiAtIGhhbGYgLyAyLjBmLAorICAgICAgICAgICAgICAgICAgICAoZm91cnRoICsgZm91cnRoKSAqIDMuMGYsIChoYWxmICsgaGFsZiAvIDIuMGYpICogMy4wZik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25EcmF3KENhbnZhcyBjYW52YXMpIHsKKyAgICAgICAgICAgIHN1cGVyLm9uRHJhdyhjYW52YXMpOworCisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDEyMC4wZiwgNTAuMGYpOworICAgICAgICAgICAgY2FudmFzLmRyYXdCaXRtYXAobUJpdG1hcDEsIG1TcmNSZWN0LCBtRHN0UmVjdCwgbUJpdG1hcFBhaW50KTsKKworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgwLjBmLCBtQml0bWFwMS5nZXRIZWlnaHQoKSk7CisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKC0xMDAuMGYsIDI1LjBmKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3Qml0bWFwKG1CaXRtYXAxLCBtU3JjUmVjdCwgbURzdFJlY3QyLCBtQml0bWFwUGFpbnQpOworICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2dvb2dsZS9hbmRyb2lkL3Rlc3QvaHd1aS9Db2xvckZpbHRlcnNBY3Rpdml0eS5qYXZhIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vZ29vZ2xlL2FuZHJvaWQvdGVzdC9od3VpL0NvbG9yRmlsdGVyc0FjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDllMWVhYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2dvb2dsZS9hbmRyb2lkL3Rlc3QvaHd1aS9Db2xvckZpbHRlcnNBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsOTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5nb29nbGUuYW5kcm9pZC50ZXN0Lmh3dWk7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcEZhY3Rvcnk7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Db2xvck1hdHJpeDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yTWF0cml4Q29sb3JGaWx0ZXI7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5MaWdodGluZ0NvbG9yRmlsdGVyOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9ydGVyRHVmZkNvbG9yRmlsdGVyOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworCitAU3VwcHJlc3NXYXJuaW5ncyh7IlVudXNlZERlY2xhcmF0aW9uIn0pCitwdWJsaWMgY2xhc3MgQ29sb3JGaWx0ZXJzQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBmaW5hbCBCaXRtYXBzVmlldyB2aWV3ID0gbmV3IEJpdG1hcHNWaWV3KHRoaXMpOworICAgICAgICBzZXRDb250ZW50Vmlldyh2aWV3KTsKKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgQml0bWFwc1ZpZXcgZXh0ZW5kcyBWaWV3IHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBCaXRtYXAgbUJpdG1hcDE7CisgICAgICAgIHByaXZhdGUgZmluYWwgQml0bWFwIG1CaXRtYXAyOworICAgICAgICBwcml2YXRlIGZpbmFsIFBhaW50IG1Db2xvck1hdHJpeFBhaW50OworICAgICAgICBwcml2YXRlIGZpbmFsIFBhaW50IG1MaWdodGluZ1BhaW50OworICAgICAgICBwcml2YXRlIGZpbmFsIFBhaW50IG1CbGVuZFBhaW50OworCisgICAgICAgIEJpdG1hcHNWaWV3KENvbnRleHQgYykgeworICAgICAgICAgICAgc3VwZXIoYyk7CisKKyAgICAgICAgICAgIG1CaXRtYXAxID0gQml0bWFwRmFjdG9yeS5kZWNvZGVSZXNvdXJjZShjLmdldFJlc291cmNlcygpLCBSLmRyYXdhYmxlLnN1bnNldDEpOworICAgICAgICAgICAgbUJpdG1hcDIgPSBCaXRtYXBGYWN0b3J5LmRlY29kZVJlc291cmNlKGMuZ2V0UmVzb3VyY2VzKCksIFIuZHJhd2FibGUuc3Vuc2V0Mik7CisKKyAgICAgICAgICAgIG1Db2xvck1hdHJpeFBhaW50ID0gbmV3IFBhaW50KCk7CisgICAgICAgICAgICBmaW5hbCBDb2xvck1hdHJpeCBjb2xvck1hdHJpeCA9IG5ldyBDb2xvck1hdHJpeCgpOworICAgICAgICAgICAgY29sb3JNYXRyaXguc2V0U2F0dXJhdGlvbigwKTsKKyAgICAgICAgICAgIG1Db2xvck1hdHJpeFBhaW50LnNldENvbG9yRmlsdGVyKG5ldyBDb2xvck1hdHJpeENvbG9yRmlsdGVyKGNvbG9yTWF0cml4KSk7CisKKyAgICAgICAgICAgIG1MaWdodGluZ1BhaW50ID0gbmV3IFBhaW50KCk7CisgICAgICAgICAgICBtTGlnaHRpbmdQYWludC5zZXRDb2xvckZpbHRlcihuZXcgTGlnaHRpbmdDb2xvckZpbHRlcigweDAwNjBmZmZmLCAweDAwMTAxMDMwKSk7CisKKyAgICAgICAgICAgIG1CbGVuZFBhaW50ID0gbmV3IFBhaW50KCk7CisgICAgICAgICAgICBtQmxlbmRQYWludC5zZXRDb2xvckZpbHRlcihuZXcgUG9ydGVyRHVmZkNvbG9yRmlsdGVyKDB4N2Y5OTAwNDAsCisgICAgICAgICAgICAgICAgICAgIFBvcnRlckR1ZmYuTW9kZS5TUkNfT1ZFUikpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uRHJhdyhDYW52YXMgY2FudmFzKSB7CisgICAgICAgICAgICBzdXBlci5vbkRyYXcoY2FudmFzKTsKKworICAgICAgICAgICAgY2FudmFzLmRyYXdBUkdCKDI1NSwgMjU1LCAyNTUsIDI1NSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhbnZhcy5zYXZlKCk7CisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDEyMC4wZiwgNTAuMGYpOworICAgICAgICAgICAgY2FudmFzLmRyYXdCaXRtYXAobUJpdG1hcDEsIDAuMGYsIDAuMGYsIG1Db2xvck1hdHJpeFBhaW50KTsKKworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgwLjBmLCA1MC4wZiArIG1CaXRtYXAxLmdldEhlaWdodCgpKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3Qml0bWFwKG1CaXRtYXAxLCAwLjBmLCAwLjBmLCBtTGlnaHRpbmdQYWludCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMC4wZiwgNTAuMGYgKyBtQml0bWFwMS5nZXRIZWlnaHQoKSk7CisgICAgICAgICAgICBjYW52YXMuZHJhd0JpdG1hcChtQml0bWFwMSwgMC4wZiwgMC4wZiwgbUJsZW5kUGFpbnQpOworICAgICAgICAgICAgY2FudmFzLnJlc3RvcmUoKTsKKworICAgICAgICAgICAgY2FudmFzLnNhdmUoKTsKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMTIwLjBmICsgbUJpdG1hcDEuZ2V0V2lkdGgoKSArIDEyMC4wZiwgNTAuMGYpOworICAgICAgICAgICAgY2FudmFzLmRyYXdCaXRtYXAobUJpdG1hcDIsIDAuMGYsIDAuMGYsIG1Db2xvck1hdHJpeFBhaW50KTsKKworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgwLjBmLCA1MC4wZiArIG1CaXRtYXAyLmdldEhlaWdodCgpKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3Qml0bWFwKG1CaXRtYXAyLCAwLjBmLCAwLjBmLCBtTGlnaHRpbmdQYWludCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMC4wZiwgNTAuMGYgKyBtQml0bWFwMi5nZXRIZWlnaHQoKSk7CisgICAgICAgICAgICBjYW52YXMuZHJhd0JpdG1hcChtQml0bWFwMiwgMC4wZiwgMC4wZiwgbUJsZW5kUGFpbnQpOworICAgICAgICAgICAgY2FudmFzLnJlc3RvcmUoKTsgICAgICAgICAgICAKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2dvb2dsZS9hbmRyb2lkL3Rlc3QvaHd1aS9MYXllcnNBY3Rpdml0eS5qYXZhIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vZ29vZ2xlL2FuZHJvaWQvdGVzdC9od3VpL0xheWVyc0FjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM3Y2QxYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2dvb2dsZS9hbmRyb2lkL3Rlc3QvaHd1aS9MYXllcnNBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsMTEwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ29vZ2xlLmFuZHJvaWQudGVzdC5od3VpOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBvcnRlckR1ZmY7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmWGZlcm1vZGU7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CisKK0BTdXBwcmVzc1dhcm5pbmdzKHsiVW51c2VkRGVjbGFyYXRpb24ifSkKK3B1YmxpYyBjbGFzcyBMYXllcnNBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KG5ldyBMYXllcnNWaWV3KHRoaXMpKTsKKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgTGF5ZXJzVmlldyBleHRlbmRzIFZpZXcgeworICAgICAgICBwcml2YXRlIFBhaW50IG1MYXllclBhaW50OworICAgICAgICBwcml2YXRlIGZpbmFsIFBhaW50IG1SZWN0UGFpbnQ7CisKKyAgICAgICAgTGF5ZXJzVmlldyhDb250ZXh0IGMpIHsKKyAgICAgICAgICAgIHN1cGVyKGMpOworCisgICAgICAgICAgICBtTGF5ZXJQYWludCA9IG5ldyBQYWludCgpOworICAgICAgICAgICAgbVJlY3RQYWludCA9IG5ldyBQYWludCgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uRHJhdyhDYW52YXMgY2FudmFzKSB7CisgICAgICAgICAgICBzdXBlci5vbkRyYXcoY2FudmFzKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgxNDAuMGYsIDEwMC4wZik7CisKKyAgICAgICAgICAgIC8vY2FudmFzLmRyYXdSR0IoMjU1LCAyNTUsIDI1NSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGludCBjb3VudCA9IGNhbnZhcy5zYXZlTGF5ZXIoMC4wZiwgMC4wZiwgMjAwLjBmLCAxMDAuMGYsIG1MYXllclBhaW50LAorICAgICAgICAgICAgICAgICAgICBDYW52YXMuQUxMX1NBVkVfRkxBRyk7CisKKyAgICAgICAgICAgIG1SZWN0UGFpbnQuc2V0Q29sb3IoMHhmZmZmMDAwMCk7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QoMC4wZiwgMC4wZiwgMjAwLjBmLCAxMDAuMGYsIG1SZWN0UGFpbnQpOworCisgICAgICAgICAgICBjYW52YXMucmVzdG9yZVRvQ291bnQoY291bnQpOworICAgICAgICAgICAgCisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDAuMGYsIDEyNS4wZik7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGNvdW50ID0gY2FudmFzLnNhdmVMYXllcigwLjBmLCAwLjBmLCAyMDAuMGYsIDEwMC4wZiwgbUxheWVyUGFpbnQsCisgICAgICAgICAgICAgICAgICAgIENhbnZhcy5BTExfU0FWRV9GTEFHKTsKKworICAgICAgICAgICAgbVJlY3RQYWludC5zZXRDb2xvcigweGZmMDBmZjAwKTsKKyAgICAgICAgICAgIG1SZWN0UGFpbnQuc2V0QWxwaGEoNTApOworICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KDAuMGYsIDAuMGYsIDIwMC4wZiwgMTAwLjBmLCBtUmVjdFBhaW50KTsKKworICAgICAgICAgICAgY2FudmFzLnJlc3RvcmVUb0NvdW50KGNvdW50KTsKKworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgyNS4wZiwgMTI1LjBmKTsKKworICAgICAgICAgICAgbVJlY3RQYWludC5zZXRDb2xvcigweGZmMDAwMGZmKTsKKyAgICAgICAgICAgIG1SZWN0UGFpbnQuc2V0QWxwaGEoMjU1KTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdCgwLjBmLCAwLjBmLCAxMDAuMGYsIDUwLjBmLCBtUmVjdFBhaW50KTsgICAgICAgICAgICAKKyAgICAgICAgICAgIAorICAgICAgICAgICAgbUxheWVyUGFpbnQuc2V0QWxwaGEoMTI3KTsKKyAgICAgICAgICAgIG1MYXllclBhaW50LnNldFhmZXJtb2RlKG5ldyBQb3J0ZXJEdWZmWGZlcm1vZGUoUG9ydGVyRHVmZi5Nb2RlLlNSQ19PVVQpKTsKKyAgICAgICAgICAgIGNvdW50ID0gY2FudmFzLnNhdmVMYXllcig1MC4wZiwgMjUuMGYsIDE1MC4wZiwgNzUuMGYsIG1MYXllclBhaW50LAorICAgICAgICAgICAgICAgICAgICBDYW52YXMuQUxMX1NBVkVfRkxBRyk7CisKKyAgICAgICAgICAgIG1SZWN0UGFpbnQuc2V0Q29sb3IoMHhmZmZmMDAwMCk7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QoNTAuMGYsIDI1LjBmLCAxNTAuMGYsIDc1LjBmLCBtUmVjdFBhaW50KTsKKworICAgICAgICAgICAgY2FudmFzLnJlc3RvcmVUb0NvdW50KGNvdW50KTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgwLjBmLCAxMjUuMGYpOworCisgICAgICAgICAgICBtUmVjdFBhaW50LnNldENvbG9yKDB4ZmYwMDAwZmYpOworICAgICAgICAgICAgbVJlY3RQYWludC5zZXRBbHBoYSgyNTUpOworICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KDAuMGYsIDAuMGYsIDEwMC4wZiwgNTAuMGYsIG1SZWN0UGFpbnQpOyAgICAgICAgICAgIAorICAgICAgICAgICAgCisgICAgICAgICAgICBtTGF5ZXJQYWludC5zZXRDb2xvcigweGZmZmYwMDAwKTsKKyAgICAgICAgICAgIG1MYXllclBhaW50LnNldEFscGhhKDEyNyk7CisgICAgICAgICAgICBtTGF5ZXJQYWludC5zZXRYZmVybW9kZShuZXcgUG9ydGVyRHVmZlhmZXJtb2RlKFBvcnRlckR1ZmYuTW9kZS5EU1RfQVRPUCkpOworICAgICAgICAgICAgY291bnQgPSBjYW52YXMuc2F2ZUxheWVyKDUwLjBmLCAyNS4wZiwgMTUwLjBmLCA3NS4wZiwgbUxheWVyUGFpbnQsCisgICAgICAgICAgICAgICAgICAgIENhbnZhcy5BTExfU0FWRV9GTEFHKTsKKworICAgICAgICAgICAgbVJlY3RQYWludC5zZXRDb2xvcigweGZmZmYwMDAwKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdCg1MC4wZiwgMjUuMGYsIDE1MC4wZiwgNzUuMGYsIG1SZWN0UGFpbnQpOworCisgICAgICAgICAgICBjYW52YXMucmVzdG9yZVRvQ291bnQoY291bnQpOworICAgICAgICAgICAgCisgICAgICAgICAgICBtTGF5ZXJQYWludCA9IG5ldyBQYWludCgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vZ29vZ2xlL2FuZHJvaWQvdGVzdC9od3VpL0xpbmVzQWN0aXZpdHkuamF2YSBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2dvb2dsZS9hbmRyb2lkL3Rlc3QvaHd1aS9MaW5lc0FjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzgwMGQ0MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2dvb2dsZS9hbmRyb2lkL3Rlc3QvaHd1aS9MaW5lc0FjdGl2aXR5LmphdmEKQEAgLTAsMCArMSwxMDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5nb29nbGUuYW5kcm9pZC50ZXN0Lmh3dWk7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcEZhY3Rvcnk7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXBTaGFkZXI7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKKworQFN1cHByZXNzV2FybmluZ3MoeyJVbnVzZWREZWNsYXJhdGlvbiJ9KQorcHVibGljIGNsYXNzIExpbmVzQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBmaW5hbCBMaW5lc1ZpZXcgdmlldyA9IG5ldyBMaW5lc1ZpZXcodGhpcyk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KHZpZXcpOworICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBMaW5lc1ZpZXcgZXh0ZW5kcyBWaWV3IHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBCaXRtYXAgbUJpdG1hcDE7CisgICAgICAgIHByaXZhdGUgZmluYWwgUGFpbnQgbVNtYWxsUGFpbnQ7CisgICAgICAgIHByaXZhdGUgZmluYWwgUGFpbnQgbU1lZGl1bVBhaW50OworICAgICAgICBwcml2YXRlIGZpbmFsIFBhaW50IG1MYXJnZVBhaW50OworICAgICAgICBwcml2YXRlIGZpbmFsIEJpdG1hcFNoYWRlciBtU2hhZGVyOworICAgICAgICBwcml2YXRlIGZpbmFsIGZsb2F0W10gbVBvaW50czsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBQYWludCBtQWxwaGFQYWludDsKKworICAgICAgICBMaW5lc1ZpZXcoQ29udGV4dCBjKSB7CisgICAgICAgICAgICBzdXBlcihjKTsKKworICAgICAgICAgICAgbUJpdG1hcDEgPSBCaXRtYXBGYWN0b3J5LmRlY29kZVJlc291cmNlKGMuZ2V0UmVzb3VyY2VzKCksIFIuZHJhd2FibGUuc3Vuc2V0MSk7CisKKyAgICAgICAgICAgIG1TbWFsbFBhaW50ID0gbmV3IFBhaW50KCk7CisgICAgICAgICAgICBtU21hbGxQYWludC5zZXRBbnRpQWxpYXModHJ1ZSk7CisgICAgICAgICAgICBtU21hbGxQYWludC5zZXRDb2xvcigweGZmZmYwMDAwKTsKKyAgICAgICAgICAgIG1TbWFsbFBhaW50LnNldFN0cm9rZVdpZHRoKDEuMGYpOworCisgICAgICAgICAgICBtTWVkaXVtUGFpbnQgPSBuZXcgUGFpbnQoKTsKKyAgICAgICAgICAgIG1NZWRpdW1QYWludC5zZXRBbnRpQWxpYXModHJ1ZSk7CisgICAgICAgICAgICBtTWVkaXVtUGFpbnQuc2V0Q29sb3IoMHhmZjAwMDBmZik7CisgICAgICAgICAgICBtTWVkaXVtUGFpbnQuc2V0U3Ryb2tlV2lkdGgoNC4wZik7CisKKyAgICAgICAgICAgIG1MYXJnZVBhaW50ID0gbmV3IFBhaW50KCk7CisgICAgICAgICAgICBtTGFyZ2VQYWludC5zZXRBbnRpQWxpYXModHJ1ZSk7CisgICAgICAgICAgICBtTGFyZ2VQYWludC5zZXRDb2xvcigweGZmMDBmZjAwKTsKKyAgICAgICAgICAgIG1MYXJnZVBhaW50LnNldFN0cm9rZVdpZHRoKDE1LjBmKTsKKworICAgICAgICAgICAgbUFscGhhUGFpbnQgPSBuZXcgUGFpbnQoKTsKKyAgICAgICAgICAgIG1BbHBoYVBhaW50LnNldEFudGlBbGlhcyh0cnVlKTsKKyAgICAgICAgICAgIG1BbHBoYVBhaW50LnNldENvbG9yKDB4N2ZmZjAwNTApOworICAgICAgICAgICAgbUFscGhhUGFpbnQuc2V0U3Ryb2tlV2lkdGgoMTAuMGYpOworICAgICAgICAgICAgCisgICAgICAgICAgICBtU2hhZGVyID0gbmV3IEJpdG1hcFNoYWRlcihtQml0bWFwMSwgQml0bWFwU2hhZGVyLlRpbGVNb2RlLk1JUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgQml0bWFwU2hhZGVyLlRpbGVNb2RlLk1JUlJPUik7CisKKyAgICAgICAgICAgIG1Qb2ludHMgPSBuZXcgZmxvYXRbXSB7CisgICAgICAgICAgICAgICAgICAgIDYyLjBmLCAwLjBmLCAzMDIuMGYsIDQwMC4wZiwKKyAgICAgICAgICAgICAgICAgICAgMzAyLjBmLCA0MDAuMGYsIDM1Mi4wZiwgNDAwLjBmLAorICAgICAgICAgICAgICAgICAgICAzNTIuMGYsIDQwMC4wZiwgMzUyLjBmLCA1MDAuMGYKKyAgICAgICAgICAgIH07CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25EcmF3KENhbnZhcyBjYW52YXMpIHsKKyAgICAgICAgICAgIHN1cGVyLm9uRHJhdyhjYW52YXMpOworCisgICAgICAgICAgICBjYW52YXMuZHJhd0FSR0IoMjU1LCAyNTUsIDI1NSwgMjU1KTsKKworICAgICAgICAgICAgY2FudmFzLnNhdmUoKTsKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMTAwLjBmLCAyMC4wZik7CisKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3TGluZSgwLjBmLCAwLjBmLCA0MC4wZiwgNDAwLjBmLCBtU21hbGxQYWludCk7CisgICAgICAgICAgICBjYW52YXMuZHJhd0xpbmUoNS4wZiwgMC4wZiwgOTUuMGYsIDQwMC4wZiwgbU1lZGl1bVBhaW50KTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3TGluZSgyMi4wZiwgMC4wZiwgMTYyLjBmLCA0MDAuMGYsIG1MYXJnZVBhaW50KTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgbUxhcmdlUGFpbnQuc2V0U2hhZGVyKG1TaGFkZXIpOworICAgICAgICAgICAgY2FudmFzLmRyYXdMaW5lKDQyLjBmLCAwLjBmLCAyMjIuMGYsIDQwMC4wZiwgbUxhcmdlUGFpbnQpOworICAgICAgICAgICAgbUxhcmdlUGFpbnQuc2V0U2hhZGVyKG51bGwpOworICAgICAgICAgICAgCisgICAgICAgICAgICBjYW52YXMuZHJhd0xpbmVzKG1Qb2ludHMsIG1BbHBoYVBhaW50KTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgxMjAuMGYsIDAuMGYpOworICAgICAgICAgICAgbUFscGhhUGFpbnQuc2V0U2hhZGVyKG1TaGFkZXIpOyAgICAgICAgICAgIAorICAgICAgICAgICAgY2FudmFzLmRyYXdMaW5lcyhtUG9pbnRzLCBtQWxwaGFQYWludCk7CisgICAgICAgICAgICBtQWxwaGFQYWludC5zZXRTaGFkZXIobnVsbCk7CisKKyAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9nb29nbGUvYW5kcm9pZC90ZXN0L2h3dWkvTGlzdEFjdGl2aXR5LmphdmEgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9nb29nbGUvYW5kcm9pZC90ZXN0L2h3dWkvTGlzdEFjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRiOTM2YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2dvb2dsZS9hbmRyb2lkL3Rlc3QvaHd1aS9MaXN0QWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDExNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdvb2dsZS5hbmRyb2lkLnRlc3QuaHd1aTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudXRpbC5EaXNwbGF5TWV0cmljczsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuQ29udGV4dE1lbnU7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5BcnJheUFkYXB0ZXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGlzdEFkYXB0ZXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGlzdFZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CisKK0BTdXBwcmVzc1dhcm5pbmdzKHsiVW51c2VkRGVjbGFyYXRpb24ifSkKK3B1YmxpYyBjbGFzcyBMaXN0QWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gREFUQV9MSVNUID0geworICAgICAgICAgICAgIkFmZ2hhbmlzdGFuIiwgIkFsYmFuaWEiLCAiQWxnZXJpYSIsICJBbWVyaWNhbiBTYW1vYSIsICJBbmRvcnJhIiwKKyAgICAgICAgICAgICJBbmdvbGEiLCAiQW5ndWlsbGEiLCAiQW50YXJjdGljYSIsICJBbnRpZ3VhIGFuZCBCYXJidWRhIiwgIkFyZ2VudGluYSIsCisgICAgICAgICAgICAiQXJtZW5pYSIsICJBcnViYSIsICJBdXN0cmFsaWEiLCAiQXVzdHJpYSIsICJBemVyYmFpamFuIiwKKyAgICAgICAgICAgICJCYWhyYWluIiwgIkJhbmdsYWRlc2giLCAiQmFyYmFkb3MiLCAiQmVsYXJ1cyIsICJCZWxnaXVtIiwKKyAgICAgICAgICAgICJCZWxpemUiLCAiQmVuaW4iLCAiQmVybXVkYSIsICJCaHV0YW4iLCAiQm9saXZpYSIsCisgICAgICAgICAgICAiQm9zbmlhIGFuZCBIZXJ6ZWdvdmluYSIsICJCb3Rzd2FuYSIsICJCb3V2ZXQgSXNsYW5kIiwgIkJyYXppbCIsCisgICAgICAgICAgICAiQnJpdGlzaCBJbmRpYW4gT2NlYW4gVGVycml0b3J5IiwgIkJyaXRpc2ggVmlyZ2luIElzbGFuZHMiLCAiQnJ1bmVpIiwgIkJ1bGdhcmlhIiwKKyAgICAgICAgICAgICJCdXJraW5hIEZhc28iLCAiQnVydW5kaSIsICJDb3RlIGQnSXZvaXJlIiwgIkNhbWJvZGlhIiwgIkNhbWVyb29uIiwgIkNhbmFkYSIsICJDYXBlIFZlcmRlIiwKKyAgICAgICAgICAgICJDYXltYW4gSXNsYW5kcyIsICJDZW50cmFsIEFmcmljYW4gUmVwdWJsaWMiLCAiQ2hhZCIsICJDaGlsZSIsICJDaGluYSIsCisgICAgICAgICAgICAiQ2hyaXN0bWFzIElzbGFuZCIsICJDb2NvcyAoS2VlbGluZykgSXNsYW5kcyIsICJDb2xvbWJpYSIsICJDb21vcm9zIiwgIkNvbmdvIiwKKyAgICAgICAgICAgICJDb29rIElzbGFuZHMiLCAiQ29zdGEgUmljYSIsICJDcm9hdGlhIiwgIkN1YmEiLCAiQ3lwcnVzIiwgIkN6ZWNoIFJlcHVibGljIiwKKyAgICAgICAgICAgICJEZW1vY3JhdGljIFJlcHVibGljIG9mIHRoZSBDb25nbyIsICJEZW5tYXJrIiwgIkRqaWJvdXRpIiwgIkRvbWluaWNhIiwgIkRvbWluaWNhbiBSZXB1YmxpYyIsCisgICAgICAgICAgICAiRWFzdCBUaW1vciIsICJFY3VhZG9yIiwgIkVneXB0IiwgIkVsIFNhbHZhZG9yIiwgIkVxdWF0b3JpYWwgR3VpbmVhIiwgIkVyaXRyZWEiLAorICAgICAgICAgICAgIkVzdG9uaWEiLCAiRXRoaW9waWEiLCAiRmFlcm9lIElzbGFuZHMiLCAiRmFsa2xhbmQgSXNsYW5kcyIsICJGaWppIiwgIkZpbmxhbmQiLAorICAgICAgICAgICAgIkZvcm1lciBZdWdvc2xhdiBSZXB1YmxpYyBvZiBNYWNlZG9uaWEiLCAiRnJhbmNlIiwgIkZyZW5jaCBHdWlhbmEiLCAiRnJlbmNoIFBvbHluZXNpYSIsCisgICAgICAgICAgICAiRnJlbmNoIFNvdXRoZXJuIFRlcnJpdG9yaWVzIiwgIkdhYm9uIiwgIkdlb3JnaWEiLCAiR2VybWFueSIsICJHaGFuYSIsICJHaWJyYWx0YXIiLAorICAgICAgICAgICAgIkdyZWVjZSIsICJHcmVlbmxhbmQiLCAiR3JlbmFkYSIsICJHdWFkZWxvdXBlIiwgIkd1YW0iLCAiR3VhdGVtYWxhIiwgIkd1aW5lYSIsICJHdWluZWEtQmlzc2F1IiwKKyAgICAgICAgICAgICJHdXlhbmEiLCAiSGFpdGkiLCAiSGVhcmQgSXNsYW5kIGFuZCBNY0RvbmFsZCBJc2xhbmRzIiwgIkhvbmR1cmFzIiwgIkhvbmcgS29uZyIsICJIdW5nYXJ5IiwKKyAgICAgICAgICAgICJJY2VsYW5kIiwgIkluZGlhIiwgIkluZG9uZXNpYSIsICJJcmFuIiwgIklyYXEiLCAiSXJlbGFuZCIsICJJc3JhZWwiLCAiSXRhbHkiLCAiSmFtYWljYSIsCisgICAgICAgICAgICAiSmFwYW4iLCAiSm9yZGFuIiwgIkthemFraHN0YW4iLCAiS2VueWEiLCAiS2lyaWJhdGkiLCAiS3V3YWl0IiwgIkt5cmd5enN0YW4iLCAiTGFvcyIsCisgICAgICAgICAgICAiTGF0dmlhIiwgIkxlYmFub24iLCAiTGVzb3RobyIsICJMaWJlcmlhIiwgIkxpYnlhIiwgIkxpZWNodGVuc3RlaW4iLCAiTGl0aHVhbmlhIiwgIkx1eGVtYm91cmciLAorICAgICAgICAgICAgIk1hY2F1IiwgIk1hZGFnYXNjYXIiLCAiTWFsYXdpIiwgIk1hbGF5c2lhIiwgIk1hbGRpdmVzIiwgIk1hbGkiLCAiTWFsdGEiLCAiTWFyc2hhbGwgSXNsYW5kcyIsCisgICAgICAgICAgICAiTWFydGluaXF1ZSIsICJNYXVyaXRhbmlhIiwgIk1hdXJpdGl1cyIsICJNYXlvdHRlIiwgIk1leGljbyIsICJNaWNyb25lc2lhIiwgIk1vbGRvdmEiLAorICAgICAgICAgICAgIk1vbmFjbyIsICJNb25nb2xpYSIsICJNb250c2VycmF0IiwgIk1vcm9jY28iLCAiTW96YW1iaXF1ZSIsICJNeWFubWFyIiwgIk5hbWliaWEiLAorICAgICAgICAgICAgIk5hdXJ1IiwgIk5lcGFsIiwgIk5ldGhlcmxhbmRzIiwgIk5ldGhlcmxhbmRzIEFudGlsbGVzIiwgIk5ldyBDYWxlZG9uaWEiLCAiTmV3IFplYWxhbmQiLAorICAgICAgICAgICAgIk5pY2FyYWd1YSIsICJOaWdlciIsICJOaWdlcmlhIiwgIk5pdWUiLCAiTm9yZm9sayBJc2xhbmQiLCAiTm9ydGggS29yZWEiLCAiTm9ydGhlcm4gTWFyaWFuYXMiLAorICAgICAgICAgICAgIk5vcndheSIsICJPbWFuIiwgIlBha2lzdGFuIiwgIlBhbGF1IiwgIlBhbmFtYSIsICJQYXB1YSBOZXcgR3VpbmVhIiwgIlBhcmFndWF5IiwgIlBlcnUiLAorICAgICAgICAgICAgIlBoaWxpcHBpbmVzIiwgIlBpdGNhaXJuIElzbGFuZHMiLCAiUG9sYW5kIiwgIlBvcnR1Z2FsIiwgIlB1ZXJ0byBSaWNvIiwgIlFhdGFyIiwKKyAgICAgICAgICAgICJSZXVuaW9uIiwgIlJvbWFuaWEiLCAiUnVzc2lhIiwgIlJ3YW5kYSIsICJTcW8gVG9tZSBhbmQgUHJpbmNpcGUiLCAiU2FpbnQgSGVsZW5hIiwKKyAgICAgICAgICAgICJTYWludCBLaXR0cyBhbmQgTmV2aXMiLCAiU2FpbnQgTHVjaWEiLCAiU2FpbnQgUGllcnJlIGFuZCBNaXF1ZWxvbiIsCisgICAgICAgICAgICAiU2FpbnQgVmluY2VudCBhbmQgdGhlIEdyZW5hZGluZXMiLCAiU2Ftb2EiLCAiU2FuIE1hcmlubyIsICJTYXVkaSBBcmFiaWEiLCAiU2VuZWdhbCIsCisgICAgICAgICAgICAiU2V5Y2hlbGxlcyIsICJTaWVycmEgTGVvbmUiLCAiU2luZ2Fwb3JlIiwgIlNsb3Zha2lhIiwgIlNsb3ZlbmlhIiwgIlNvbG9tb24gSXNsYW5kcyIsCisgICAgICAgICAgICAiU29tYWxpYSIsICJTb3V0aCBBZnJpY2EiLCAiU291dGggR2VvcmdpYSBhbmQgdGhlIFNvdXRoIFNhbmR3aWNoIElzbGFuZHMiLCAiU291dGggS29yZWEiLAorICAgICAgICAgICAgIlNwYWluIiwgIlNyaSBMYW5rYSIsICJTdWRhbiIsICJTdXJpbmFtZSIsICJTdmFsYmFyZCBhbmQgSmFuIE1heWVuIiwgIlN3YXppbGFuZCIsICJTd2VkZW4iLAorICAgICAgICAgICAgIlN3aXR6ZXJsYW5kIiwgIlN5cmlhIiwgIlRhaXdhbiIsICJUYWppa2lzdGFuIiwgIlRhbnphbmlhIiwgIlRoYWlsYW5kIiwgIlRoZSBCYWhhbWFzIiwKKyAgICAgICAgICAgICJUaGUgR2FtYmlhIiwgIlRvZ28iLCAiVG9rZWxhdSIsICJUb25nYSIsICJUcmluaWRhZCBhbmQgVG9iYWdvIiwgIlR1bmlzaWEiLCAiVHVya2V5IiwKKyAgICAgICAgICAgICJUdXJrbWVuaXN0YW4iLCAiVHVya3MgYW5kIENhaWNvcyBJc2xhbmRzIiwgIlR1dmFsdSIsICJWaXJnaW4gSXNsYW5kcyIsICJVZ2FuZGEiLAorICAgICAgICAgICAgIlVrcmFpbmUiLCAiVW5pdGVkIEFyYWIgRW1pcmF0ZXMiLCAiVW5pdGVkIEtpbmdkb20iLAorICAgICAgICAgICAgIlVuaXRlZCBTdGF0ZXMiLCAiVW5pdGVkIFN0YXRlcyBNaW5vciBPdXRseWluZyBJc2xhbmRzIiwgIlVydWd1YXkiLCAiVXpiZWtpc3RhbiIsCisgICAgICAgICAgICAiVmFudWF0dSIsICJWYXRpY2FuIENpdHkiLCAiVmVuZXp1ZWxhIiwgIlZpZXRuYW0iLCAiV2FsbGlzIGFuZCBGdXR1bmEiLCAiV2VzdGVybiBTYWhhcmEiLAorICAgICAgICAgICAgIlllbWVuIiwgIll1Z29zbGF2aWEiLCAiWmFtYmlhIiwgIlppbWJhYndlIgorICAgIH07CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0Lmxpc3RfYWN0aXZpdHkpOworCisgICAgICAgIExpc3RBZGFwdGVyIGFkYXB0ZXIgPSBuZXcgU2ltcGxlTGlzdEFkYXB0ZXIodGhpcyk7CisKKyAgICAgICAgTGlzdFZpZXcgbGlzdCA9IChMaXN0VmlldykgZmluZFZpZXdCeUlkKFIuaWQubGlzdCk7CisgICAgICAgIGxpc3Quc2V0QWRhcHRlcihhZGFwdGVyKTsKKyAgICAgICAgCisgICAgICAgIHJlZ2lzdGVyRm9yQ29udGV4dE1lbnUobGlzdCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25DcmVhdGVDb250ZXh0TWVudShDb250ZXh0TWVudSBtZW51LCBWaWV3IHYsIENvbnRleHRNZW51LkNvbnRleHRNZW51SW5mbyBtZW51SW5mbykgeworICAgICAgICBzdXBlci5vbkNyZWF0ZUNvbnRleHRNZW51KG1lbnUsIHYsIG1lbnVJbmZvKTsKKyAgICAgICAgbWVudS5zZXRIZWFkZXJUaXRsZSgiQ29udGV4dCBtZW51Iik7CisgICAgICAgIG1lbnUuYWRkKCJMaXN0IGl0ZW0gMSIpOworICAgICAgICBtZW51LmFkZCgiTGlzdCBpdGVtIDIiKTsKKyAgICAgICAgbWVudS5hZGQoIkxpc3QgaXRlbSAzIik7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU2ltcGxlTGlzdEFkYXB0ZXIgZXh0ZW5kcyBBcnJheUFkYXB0ZXI8U3RyaW5nPiB7CisgICAgICAgIHB1YmxpYyBTaW1wbGVMaXN0QWRhcHRlcihDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIGFuZHJvaWQuUi5sYXlvdXQuc2ltcGxlX2xpc3RfaXRlbV8xLCBEQVRBX0xJU1QpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBWaWV3IGdldFZpZXcoaW50IHBvc2l0aW9uLCBWaWV3IGNvbnZlcnRWaWV3LCBWaWV3R3JvdXAgcGFyZW50KSB7CisgICAgICAgICAgICBUZXh0VmlldyB2ID0gKFRleHRWaWV3KSBzdXBlci5nZXRWaWV3KHBvc2l0aW9uLCBjb252ZXJ0VmlldywgcGFyZW50KTsKKyAgICAgICAgICAgIGZpbmFsIFJlc291cmNlcyByID0gZ2V0Q29udGV4dCgpLmdldFJlc291cmNlcygpOworICAgICAgICAgICAgZmluYWwgRGlzcGxheU1ldHJpY3MgbWV0cmljcyA9IHIuZ2V0RGlzcGxheU1ldHJpY3MoKTsKKyAgICAgICAgICAgIHYuc2V0Q29tcG91bmREcmF3YWJsZVBhZGRpbmcoKGludCkgKDYgKiBtZXRyaWNzLmRlbnNpdHkgKyAwLjVmKSk7CisgICAgICAgICAgICB2LnNldENvbXBvdW5kRHJhd2FibGVzV2l0aEludHJpbnNpY0JvdW5kcyhyLmdldERyYXdhYmxlKFIuZHJhd2FibGUuaWNvbiksCisgICAgICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIG51bGwpOworICAgICAgICAgICAgcmV0dXJuIHY7CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vZ29vZ2xlL2FuZHJvaWQvdGVzdC9od3VpL01vcmVTaGFkZXJzQWN0aXZpdHkuamF2YSBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2dvb2dsZS9hbmRyb2lkL3Rlc3QvaHd1aS9Nb3JlU2hhZGVyc0FjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQzZWViYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2dvb2dsZS9hbmRyb2lkL3Rlc3QvaHd1aS9Nb3JlU2hhZGVyc0FjdGl2aXR5LmphdmEKQEAgLTAsMCArMSwxNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5nb29nbGUuYW5kcm9pZC50ZXN0Lmh3dWk7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcEZhY3Rvcnk7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXBTaGFkZXI7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Db2xvcjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yRmlsdGVyOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ29tcG9zZVNoYWRlcjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkxpZ2h0aW5nQ29sb3JGaWx0ZXI7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5MaW5lYXJHcmFkaWVudDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLk1hdHJpeDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9ydGVyRHVmZjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlNoYWRlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKKworQFN1cHByZXNzV2FybmluZ3MoeyJVbnVzZWREZWNsYXJhdGlvbiJ9KQorcHVibGljIGNsYXNzIE1vcmVTaGFkZXJzQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworCisgICAgICAgIHNldENvbnRlbnRWaWV3KG5ldyBTaGFkZXJzVmlldyh0aGlzKSk7CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIFNoYWRlcnNWaWV3IGV4dGVuZHMgVmlldyB7CisgICAgICAgIHByaXZhdGUgQml0bWFwU2hhZGVyIG1TY2FsZWRTaGFkZXI7CisgICAgICAgIHByaXZhdGUgaW50IG1UZXhXaWR0aDsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbVRleEhlaWdodDsKKyAgICAgICAgcHJpdmF0ZSBQYWludCBtUGFpbnQ7CisgICAgICAgIHByaXZhdGUgZmxvYXQgbURyYXdXaWR0aDsKKyAgICAgICAgcHJpdmF0ZSBmbG9hdCBtRHJhd0hlaWdodDsKKyAgICAgICAgcHJpdmF0ZSBMaW5lYXJHcmFkaWVudCBtSG9yR3JhZGllbnQ7CisgICAgICAgIHByaXZhdGUgTGluZWFyR3JhZGllbnQgbVZlcnRHcmFkaWVudDsKKyAgICAgICAgcHJpdmF0ZSBDb21wb3NlU2hhZGVyIG1Db21wb3NlU2hhZGVyOworICAgICAgICBwcml2YXRlIENvbXBvc2VTaGFkZXIgbUNvbXBvc2UyU2hhZGVyOworICAgICAgICBwcml2YXRlIFBhaW50IG1MYXJnZVBhaW50OworICAgICAgICBwcml2YXRlIEJpdG1hcFNoYWRlciBtU2NhbGVkMlNoYWRlcjsKKyAgICAgICAgcHJpdmF0ZSBDb2xvckZpbHRlciBtQ29sb3JGaWx0ZXI7CisKKyAgICAgICAgU2hhZGVyc1ZpZXcoQ29udGV4dCBjKSB7CisgICAgICAgICAgICBzdXBlcihjKTsKKworICAgICAgICAgICAgQml0bWFwIHRleHR1cmUgPSBCaXRtYXBGYWN0b3J5LmRlY29kZVJlc291cmNlKGMuZ2V0UmVzb3VyY2VzKCksIFIuZHJhd2FibGUuc3Vuc2V0MSk7CisgICAgICAgICAgICBtVGV4V2lkdGggPSB0ZXh0dXJlLmdldFdpZHRoKCk7CisgICAgICAgICAgICBtVGV4SGVpZ2h0ID0gdGV4dHVyZS5nZXRIZWlnaHQoKTsKKyAgICAgICAgICAgIG1EcmF3V2lkdGggPSBtVGV4V2lkdGggKiAyLjJmOworICAgICAgICAgICAgbURyYXdIZWlnaHQgPSBtVGV4SGVpZ2h0ICogMS4yZjsKKworICAgICAgICAgICAgbVNjYWxlZFNoYWRlciA9IG5ldyBCaXRtYXBTaGFkZXIodGV4dHVyZSwgU2hhZGVyLlRpbGVNb2RlLk1JUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgU2hhZGVyLlRpbGVNb2RlLk1JUlJPUik7CisgICAgICAgICAgICBNYXRyaXggbTIgPSBuZXcgTWF0cml4KCk7CisgICAgICAgICAgICBtMi5zZXRTY2FsZSgwLjVmLCAwLjVmKTsKKyAgICAgICAgICAgIG1TY2FsZWRTaGFkZXIuc2V0TG9jYWxNYXRyaXgobTIpOworICAgICAgICAgICAgCisgICAgICAgICAgICBtU2NhbGVkMlNoYWRlciA9IG5ldyBCaXRtYXBTaGFkZXIodGV4dHVyZSwgU2hhZGVyLlRpbGVNb2RlLk1JUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgU2hhZGVyLlRpbGVNb2RlLk1JUlJPUik7CisgICAgICAgICAgICBNYXRyaXggbTMgPSBuZXcgTWF0cml4KCk7CisgICAgICAgICAgICBtMy5zZXRTY2FsZSgwLjFmLCAwLjFmKTsKKyAgICAgICAgICAgIG1TY2FsZWQyU2hhZGVyLnNldExvY2FsTWF0cml4KG0zKTsKKworICAgICAgICAgICAgbUhvckdyYWRpZW50ID0gbmV3IExpbmVhckdyYWRpZW50KDAuMGYsIDAuMGYsIG1EcmF3V2lkdGgsIDAuMGYsCisgICAgICAgICAgICAgICAgICAgIENvbG9yLlJFRCwgMHg3ZjAwZmYwMCwgU2hhZGVyLlRpbGVNb2RlLkNMQU1QKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgbVZlcnRHcmFkaWVudCA9IG5ldyBMaW5lYXJHcmFkaWVudCgwLjBmLCAwLjBmLCAwLjBmLCBtRHJhd0hlaWdodCAvIDIuMGYsCisgICAgICAgICAgICAgICAgICAgIENvbG9yLllFTExPVywgQ29sb3IuTUFHRU5UQSwgU2hhZGVyLlRpbGVNb2RlLk1JUlJPUik7CisKKyAgICAgICAgICAgIG1Db21wb3NlU2hhZGVyID0gbmV3IENvbXBvc2VTaGFkZXIobVNjYWxlZFNoYWRlciwgbUhvckdyYWRpZW50LAorICAgICAgICAgICAgICAgICAgICBQb3J0ZXJEdWZmLk1vZGUuU1JDX09WRVIpOworICAgICAgICAgICAgbUNvbXBvc2UyU2hhZGVyID0gbmV3IENvbXBvc2VTaGFkZXIobUhvckdyYWRpZW50LCBtU2NhbGVkU2hhZGVyLAorICAgICAgICAgICAgICAgICAgICBQb3J0ZXJEdWZmLk1vZGUuU1JDX09VVCk7CisKKyAgICAgICAgICAgIG1Db2xvckZpbHRlciA9IG5ldyBMaWdodGluZ0NvbG9yRmlsdGVyKDB4MDA2MGZmZmYsIDB4MDAxMDEwMzApOworIAorICAgICAgICAgICAgbUxhcmdlUGFpbnQgPSBuZXcgUGFpbnQoKTsKKyAgICAgICAgICAgIG1MYXJnZVBhaW50LnNldEFudGlBbGlhcyh0cnVlKTsKKyAgICAgICAgICAgIG1MYXJnZVBhaW50LnNldFRleHRTaXplKDM2LjBmKTsKKyAgICAgICAgICAgIG1MYXJnZVBhaW50LnNldENvbG9yKDB4ZmYwMDAwMDApOworICAgICAgICAgICAgCisgICAgICAgICAgICBtUGFpbnQgPSBuZXcgUGFpbnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvbkRyYXcoQ2FudmFzIGNhbnZhcykgeworICAgICAgICAgICAgc3VwZXIub25EcmF3KGNhbnZhcyk7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JHQigyNTUsIDI1NSwgMjU1KTsKKworICAgICAgICAgICAgY2FudmFzLnNhdmUoKTsKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoNDAuMGYsIDQwLjBmKTsKKworICAgICAgICAgICAgbVBhaW50LnNldFNoYWRlcihtQ29tcG9zZVNoYWRlcik7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QoMC4wZiwgMC4wZiwgbURyYXdXaWR0aCwgbURyYXdIZWlnaHQsIG1QYWludCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMC4wZiwgNDAuMGYgKyBtRHJhd0hlaWdodCk7CisgICAgICAgICAgICBtUGFpbnQuc2V0U2hhZGVyKG1Db21wb3NlMlNoYWRlcik7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QoMC4wZiwgMC4wZiwgbURyYXdXaWR0aCwgbURyYXdIZWlnaHQsIG1QYWludCk7CisKKyAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlKCk7CisKKyAgICAgICAgICAgIGNhbnZhcy5zYXZlKCk7CisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDQwLjBmICsgbURyYXdXaWR0aCArIDQwLjBmLCA0MC4wZik7CisKKyAgICAgICAgICAgIG1MYXJnZVBhaW50LnNldFNoYWRlcihtSG9yR3JhZGllbnQpOworICAgICAgICAgICAgY2FudmFzLmRyYXdUZXh0KCJPcGVuR0wgcmVuZGVyaW5nIiwgMC4wZiwgMjAuMGYsIG1MYXJnZVBhaW50KTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgbUxhcmdlUGFpbnQuc2V0U2hhZGVyKG1TY2FsZWQyU2hhZGVyKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3VGV4dCgiT3BlbkdMIHJlbmRlcmluZyIsIDAuMGYsIDYwLjBmLCBtTGFyZ2VQYWludCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIG1MYXJnZVBhaW50LnNldFNoYWRlcihtQ29tcG9zZTJTaGFkZXIpOworICAgICAgICAgICAgbUxhcmdlUGFpbnQuc2V0Q29sb3JGaWx0ZXIobUNvbG9yRmlsdGVyKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3VGV4dCgiT3BlbkdMIHJlbmRlcmluZyIsIDAuMGYsIDEwMC4wZiwgbUxhcmdlUGFpbnQpOworICAgICAgICAgICAgbUxhcmdlUGFpbnQuc2V0Q29sb3JGaWx0ZXIobnVsbCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMC4wZiwgNDAuMGYgKyBtRHJhd0hlaWdodCk7CisgICAgICAgICAgICBtTGFyZ2VQYWludC5zZXRTaGFkZXIobVZlcnRHcmFkaWVudCk7CisgICAgICAgICAgICBjYW52YXMuZHJhd1RleHQoIk9wZW5HTCByZW5kZXJpbmciLCAwLjBmLCAyMC4wZiwgbUxhcmdlUGFpbnQpOworICAgICAgICAgICAgCisgICAgICAgICAgICBjYW52YXMucmVzdG9yZSgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vZ29vZ2xlL2FuZHJvaWQvdGVzdC9od3VpL05pbmVQYXRjaGVzQWN0aXZpdHkuamF2YSBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2dvb2dsZS9hbmRyb2lkL3Rlc3QvaHd1aS9OaW5lUGF0Y2hlc0FjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzI2OGZiZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2dvb2dsZS9hbmRyb2lkL3Rlc3QvaHd1aS9OaW5lUGF0Y2hlc0FjdGl2aXR5LmphdmEKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdvb2dsZS5hbmRyb2lkLnRlc3QuaHd1aTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudmlldy5HcmF2aXR5OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkJ1dHRvbjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5GcmFtZUxheW91dDsKKworQFN1cHByZXNzV2FybmluZ3MoeyJVbnVzZWREZWNsYXJhdGlvbiJ9KQorcHVibGljIGNsYXNzIE5pbmVQYXRjaGVzQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICAKKyAgICAgICAgRnJhbWVMYXlvdXQgbGF5b3V0ID0gbmV3IEZyYW1lTGF5b3V0KHRoaXMpOworICAgICAgICBCdXR0b24gYiA9IG5ldyBCdXR0b24odGhpcyk7CisgICAgICAgIGIuc2V0TGF5b3V0UGFyYW1zKG5ldyBGcmFtZUxheW91dC5MYXlvdXRQYXJhbXMoRnJhbWVMYXlvdXQuTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCwKKyAgICAgICAgICAgICAgICBGcmFtZUxheW91dC5MYXlvdXRQYXJhbXMuV1JBUF9DT05URU5ULCBHcmF2aXR5LkNFTlRFUikpOworICAgICAgICBiLnNldFRleHQoIjkgcGF0Y2hlcyIpOworICAgICAgICBsYXlvdXQuYWRkVmlldyhiKTsKKyAgICAgICAgbGF5b3V0LnNldEJhY2tncm91bmRDb2xvcigweGZmZmZmZmZmKTsKKyAgICAgICAgCisgICAgICAgIHNldENvbnRlbnRWaWV3KGxheW91dCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vZ29vZ2xlL2FuZHJvaWQvdGVzdC9od3VpL1BhdGhzQWN0aXZpdHkuamF2YSBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2dvb2dsZS9hbmRyb2lkL3Rlc3QvaHd1aS9QYXRoc0FjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzlkOTk0MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2dvb2dsZS9hbmRyb2lkL3Rlc3QvaHd1aS9QYXRoc0FjdGl2aXR5LmphdmEKQEAgLTAsMCArMSwxNDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5nb29nbGUuYW5kcm9pZC50ZXN0Lmh3dWk7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcEZhY3Rvcnk7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXBTaGFkZXI7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhdGg7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0RjsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKKworQFN1cHByZXNzV2FybmluZ3MoeyJVbnVzZWREZWNsYXJhdGlvbiJ9KQorcHVibGljIGNsYXNzIFBhdGhzQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBmaW5hbCBQYXRoc1ZpZXcgdmlldyA9IG5ldyBQYXRoc1ZpZXcodGhpcyk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KHZpZXcpOworICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBQYXRoc1ZpZXcgZXh0ZW5kcyBWaWV3IHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBCaXRtYXAgbUJpdG1hcDE7CisgICAgICAgIHByaXZhdGUgZmluYWwgUGFpbnQgbVNtYWxsUGFpbnQ7CisgICAgICAgIHByaXZhdGUgZmluYWwgUGFpbnQgbU1lZGl1bVBhaW50OworICAgICAgICBwcml2YXRlIGZpbmFsIFBhaW50IG1MYXJnZVBhaW50OworICAgICAgICBwcml2YXRlIGZpbmFsIEJpdG1hcFNoYWRlciBtU2hhZGVyOworICAgICAgICBwcml2YXRlIGZpbmFsIFBhdGggbVBhdGg7CisgICAgICAgIHByaXZhdGUgZmluYWwgUmVjdEYgbVBhdGhCb3VuZHM7CisgICAgICAgIHByaXZhdGUgZmluYWwgUGFpbnQgbUJvdW5kc1BhaW50OworICAgICAgICBwcml2YXRlIGZpbmFsIEJpdG1hcCBtQml0bWFwOworICAgICAgICBwcml2YXRlIGZpbmFsIGZsb2F0IG1PZmZzZXQ7CisgICAgICAgIHByaXZhdGUgZmluYWwgUGFpbnQgbUxpbmVQYWludDsKKworICAgICAgICBQYXRoc1ZpZXcoQ29udGV4dCBjKSB7CisgICAgICAgICAgICBzdXBlcihjKTsKKworICAgICAgICAgICAgbUJpdG1hcDEgPSBCaXRtYXBGYWN0b3J5LmRlY29kZVJlc291cmNlKGMuZ2V0UmVzb3VyY2VzKCksIFIuZHJhd2FibGUuc3Vuc2V0MSk7CisKKyAgICAgICAgICAgIG1TbWFsbFBhaW50ID0gbmV3IFBhaW50KCk7CisgICAgICAgICAgICBtU21hbGxQYWludC5zZXRBbnRpQWxpYXModHJ1ZSk7CisgICAgICAgICAgICBtU21hbGxQYWludC5zZXRDb2xvcigweGZmZmYwMDAwKTsKKyAgICAgICAgICAgIG1TbWFsbFBhaW50LnNldFN0cm9rZVdpZHRoKDEuMGYpOworICAgICAgICAgICAgbVNtYWxsUGFpbnQuc2V0U3R5bGUoUGFpbnQuU3R5bGUuU1RST0tFKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgbUxpbmVQYWludCA9IG5ldyBQYWludCgpOworICAgICAgICAgICAgbUxpbmVQYWludC5zZXRBbnRpQWxpYXModHJ1ZSk7CisgICAgICAgICAgICBtTGluZVBhaW50LnNldENvbG9yKDB4ZmZmZjAwZmYpOworICAgICAgICAgICAgbUxpbmVQYWludC5zZXRTdHJva2VXaWR0aCgxLjBmKTsKKyAgICAgICAgICAgIG1MaW5lUGFpbnQuc2V0U3R5bGUoUGFpbnQuU3R5bGUuU1RST0tFKTsKKworICAgICAgICAgICAgbU1lZGl1bVBhaW50ID0gbmV3IFBhaW50KCk7CisgICAgICAgICAgICBtTWVkaXVtUGFpbnQuc2V0QW50aUFsaWFzKHRydWUpOworICAgICAgICAgICAgbU1lZGl1bVBhaW50LnNldENvbG9yKDB4ZmYwMDAwZmYpOworICAgICAgICAgICAgbU1lZGl1bVBhaW50LnNldFN0cm9rZVdpZHRoKDEwLjBmKTsKKyAgICAgICAgICAgIG1NZWRpdW1QYWludC5zZXRTdHlsZShQYWludC5TdHlsZS5TVFJPS0UpOworCisgICAgICAgICAgICBtTGFyZ2VQYWludCA9IG5ldyBQYWludCgpOworICAgICAgICAgICAgbUxhcmdlUGFpbnQuc2V0QW50aUFsaWFzKHRydWUpOworICAgICAgICAgICAgbUxhcmdlUGFpbnQuc2V0Q29sb3IoMHhmZjAwZmYwMCk7CisgICAgICAgICAgICBtTGFyZ2VQYWludC5zZXRTdHJva2VXaWR0aCgxNS4wZik7CisgICAgICAgICAgICBtTGFyZ2VQYWludC5zZXRTdHlsZShQYWludC5TdHlsZS5GSUxMKTsKKworICAgICAgICAgICAgbVNoYWRlciA9IG5ldyBCaXRtYXBTaGFkZXIobUJpdG1hcDEsIEJpdG1hcFNoYWRlci5UaWxlTW9kZS5NSVJST1IsCisgICAgICAgICAgICAgICAgICAgIEJpdG1hcFNoYWRlci5UaWxlTW9kZS5NSVJST1IpOworCisgICAgICAgICAgICBtUGF0aCA9IG5ldyBQYXRoKCk7CisgICAgICAgICAgICBtUGF0aC5tb3ZlVG8oMC4wZiwgMC4wZik7CisgICAgICAgICAgICBtUGF0aC5jdWJpY1RvKDAuMGYsIDAuMGYsIDEwMC4wZiwgMTUwLjBmLCAxMDAuMGYsIDIwMC4wZik7CisgICAgICAgICAgICBtUGF0aC5jdWJpY1RvKDEwMC4wZiwgMjAwLjBmLCA1MC4wZiwgMzAwLjBmLCAtODAuMGYsIDIwMC4wZik7CisgICAgICAgICAgICBtUGF0aC5jdWJpY1RvKC04MC4wZiwgMjAwLjBmLCAxMDAuMGYsIDIwMC4wZiwgMjAwLjBmLCAwLjBmKTsKKworICAgICAgICAgICAgbVBhdGhCb3VuZHMgPSBuZXcgUmVjdEYoKTsKKyAgICAgICAgICAgIG1QYXRoLmNvbXB1dGVCb3VuZHMobVBhdGhCb3VuZHMsIHRydWUpOworCisgICAgICAgICAgICBtQm91bmRzUGFpbnQgPSBuZXcgUGFpbnQoKTsKKyAgICAgICAgICAgIG1Cb3VuZHNQYWludC5zZXRDb2xvcigweDQwMDBmZjAwKTsKKworICAgICAgICAgICAgbU9mZnNldCA9IG1NZWRpdW1QYWludC5nZXRTdHJva2VXaWR0aCgpOworICAgICAgICAgICAgZmluYWwgaW50IHdpZHRoID0gKGludCkgKG1QYXRoQm91bmRzLndpZHRoKCkgKyBtT2Zmc2V0ICogMy4wZiArIDAuNWYpOworICAgICAgICAgICAgZmluYWwgaW50IGhlaWdodCA9IChpbnQpIChtUGF0aEJvdW5kcy5oZWlnaHQoKSArIG1PZmZzZXQgKiAzLjBmICsgMC41Zik7CisgICAgICAgICAgICBtQml0bWFwID0gQml0bWFwLmNyZWF0ZUJpdG1hcCh3aWR0aCwgaGVpZ2h0LCBCaXRtYXAuQ29uZmlnLkFMUEhBXzgpOworICAgICAgICAgICAgQ2FudmFzIGNhbnZhcyA9IG5ldyBDYW52YXMobUJpdG1hcCk7CisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKC1tUGF0aEJvdW5kcy5sZWZ0ICsgbU9mZnNldCAqIDEuNWYsIC1tUGF0aEJvdW5kcy50b3AgKyBtT2Zmc2V0ICogMS41Zik7CisgICAgICAgICAgICBjYW52YXMuZHJhd1BhdGgobVBhdGgsIG1NZWRpdW1QYWludCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25EcmF3KENhbnZhcyBjYW52YXMpIHsKKyAgICAgICAgICAgIHN1cGVyLm9uRHJhdyhjYW52YXMpOworCisgICAgICAgICAgICBjYW52YXMuZHJhd0FSR0IoMjU1LCAyNTUsIDI1NSwgMjU1KTsKKworICAgICAgICAgICAgY2FudmFzLnNhdmUoKTsKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMjAwLjBmLCA2MC4wZik7CisgICAgICAgICAgICBjYW52YXMuZHJhd1BhdGgobVBhdGgsIG1TbWFsbFBhaW50KTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgzNTAuMGYsIDAuMGYpOworICAgICAgICAgICAgY2FudmFzLmRyYXdQYXRoKG1QYXRoLCBtTWVkaXVtUGFpbnQpOworCisgICAgICAgICAgICBtTGFyZ2VQYWludC5zZXRTaGFkZXIobVNoYWRlcik7CisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDM1MC4wZiwgMC4wZik7CisgICAgICAgICAgICBjYW52YXMuZHJhd1BhdGgobVBhdGgsIG1MYXJnZVBhaW50KTsKKyAgICAgICAgICAgIG1MYXJnZVBhaW50LnNldFNoYWRlcihudWxsKTsKKyAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlKCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhbnZhcy5zYXZlKCk7CisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDIwMC4wZiwgMzYwLjBmKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UGF0aChtUGF0aCwgbVNtYWxsUGFpbnQpOworICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KG1QYXRoQm91bmRzLCBtQm91bmRzUGFpbnQpOworICAgICAgICAgICAgCisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDM1MC4wZiwgMC4wZik7CisgICAgICAgICAgICBjYW52YXMuZHJhd0JpdG1hcChtQml0bWFwLCBtUGF0aEJvdW5kcy5sZWZ0IC0gbU9mZnNldCAqIDEuNWYsCisgICAgICAgICAgICAgICAgICAgIG1QYXRoQm91bmRzLnRvcCAtIG1PZmZzZXQgKiAxLjVmLCBudWxsKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdChtUGF0aEJvdW5kcywgbUJvdW5kc1BhaW50KTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3TGluZSgwLjBmLCAtMzYwLjBmLCAwLjBmLCA1MDAuMGYsIG1MaW5lUGFpbnQpOworCisgICAgICAgICAgICBtTGFyZ2VQYWludC5zZXRTaGFkZXIobVNoYWRlcik7CisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDM1MC4wZiwgMC4wZik7CisgICAgICAgICAgICBjYW52YXMuZHJhd1BhdGgobVBhdGgsIG1MYXJnZVBhaW50KTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdChtUGF0aEJvdW5kcywgbUJvdW5kc1BhaW50KTsKKyAgICAgICAgICAgIG1MYXJnZVBhaW50LnNldFNoYWRlcihudWxsKTsKKyAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9nb29nbGUvYW5kcm9pZC90ZXN0L2h3dWkvUXVpY2tSZWplY3RBY3Rpdml0eS5qYXZhIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vZ29vZ2xlL2FuZHJvaWQvdGVzdC9od3VpL1F1aWNrUmVqZWN0QWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYmEyNDlhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vZ29vZ2xlL2FuZHJvaWQvdGVzdC9od3VpL1F1aWNrUmVqZWN0QWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDg5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ29vZ2xlLmFuZHJvaWQudGVzdC5od3VpOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXBGYWN0b3J5OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKKworQFN1cHByZXNzV2FybmluZ3MoeyJVbnVzZWREZWNsYXJhdGlvbiJ9KQorcHVibGljIGNsYXNzIFF1aWNrUmVqZWN0QWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBmaW5hbCBRdWlja1JlamVjdFZpZXcgdmlldyA9IG5ldyBRdWlja1JlamVjdFZpZXcodGhpcyk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KHZpZXcpOworICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBRdWlja1JlamVjdFZpZXcgZXh0ZW5kcyBWaWV3IHsKKyAgICAgICAgcHJpdmF0ZSBQYWludCBtQml0bWFwUGFpbnQ7CisgICAgICAgIHByaXZhdGUgZmluYWwgQml0bWFwIG1CaXRtYXAxOworCisgICAgICAgIFF1aWNrUmVqZWN0VmlldyhDb250ZXh0IGMpIHsKKyAgICAgICAgICAgIHN1cGVyKGMpOworCisgICAgICAgICAgICBtQml0bWFwMSA9IEJpdG1hcEZhY3RvcnkuZGVjb2RlUmVzb3VyY2UoYy5nZXRSZXNvdXJjZXMoKSwgUi5kcmF3YWJsZS5zdW5zZXQxKTsKKworICAgICAgICAgICAgbUJpdG1hcFBhaW50ID0gbmV3IFBhaW50KCk7CisgICAgICAgICAgICBtQml0bWFwUGFpbnQuc2V0RmlsdGVyQml0bWFwKHRydWUpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uRHJhdyhDYW52YXMgY2FudmFzKSB7CisgICAgICAgICAgICBzdXBlci5vbkRyYXcoY2FudmFzKTsKKworICAgICAgICAgICAgaW50IGNvdW50ID0gY2FudmFzLmdldFNhdmVDb3VudCgpOworICAgICAgICAgICAgTG9nLmQoIk9wZW5HTFJlbmRlcmVyIiwgImNvdW50PSIgKyBjb3VudCk7CisgICAgICAgICAgICBjb3VudCA9IGNhbnZhcy5zYXZlKCk7CisgICAgICAgICAgICBMb2cuZCgiT3BlbkdMUmVuZGVyZXIiLCAiY291bnQgYWZ0ZXIgc2F2ZT0iICsgY291bnQpOworICAgICAgICAgICAgY291bnQgPSBjYW52YXMuZ2V0U2F2ZUNvdW50KCk7CisgICAgICAgICAgICBMb2cuZCgiT3BlbkdMUmVuZGVyZXIiLCAiZ2V0U2F2ZUNvdW50IGFmdGVyIHNhdmU9IiArIGNvdW50KTsKKyAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlKCk7CisgICAgICAgICAgICBjb3VudCA9IGNhbnZhcy5nZXRTYXZlQ291bnQoKTsKKyAgICAgICAgICAgIExvZy5kKCJPcGVuR0xSZW5kZXJlciIsICJjb3VudCBhZnRlciByZXN0b3JlPSIgKyBjb3VudCk7CisgICAgICAgICAgICBjYW52YXMuc2F2ZSgpOworICAgICAgICAgICAgTG9nLmQoIk9wZW5HTFJlbmRlcmVyIiwgImNvdW50IGFmdGVyIHNhdmU9IiArIGNhbnZhcy5nZXRTYXZlQ291bnQoKSk7CisgICAgICAgICAgICBjYW52YXMuc2F2ZSgpOworICAgICAgICAgICAgTG9nLmQoIk9wZW5HTFJlbmRlcmVyIiwgImNvdW50IGFmdGVyIHNhdmU9IiArIGNhbnZhcy5nZXRTYXZlQ291bnQoKSk7CisgICAgICAgICAgICBjYW52YXMuc2F2ZSgpOworICAgICAgICAgICAgTG9nLmQoIk9wZW5HTFJlbmRlcmVyIiwgImNvdW50IGFmdGVyIHNhdmU9IiArIGNhbnZhcy5nZXRTYXZlQ291bnQoKSk7CisgICAgICAgICAgICBjYW52YXMucmVzdG9yZVRvQ291bnQoY291bnQpOworICAgICAgICAgICAgY291bnQgPSBjYW52YXMuZ2V0U2F2ZUNvdW50KCk7CisgICAgICAgICAgICBMb2cuZCgiT3BlbkdMUmVuZGVyZXIiLCAiY291bnQgYWZ0ZXIgcmVzdG9yZVRvQ291bnQ9IiArIGNvdW50KTsKKyAgICAgICAgICAgIGNvdW50ID0gY2FudmFzLnNhdmVMYXllcigwLCAwLCAxMCwgMTAsIG1CaXRtYXBQYWludCwgQ2FudmFzLkFMTF9TQVZFX0ZMQUcpOworICAgICAgICAgICAgTG9nLmQoIk9wZW5HTFJlbmRlcmVyIiwgImNvdW50IGFmdGVyIHNhdmVMYXllcj0iICsgY291bnQpOworICAgICAgICAgICAgY291bnQgPSBjYW52YXMuZ2V0U2F2ZUNvdW50KCk7CisgICAgICAgICAgICBMb2cuZCgiT3BlbkdMUmVuZGVyZXIiLCAiZ2V0U2F2ZUNvdW50IGFmdGVyIHNhdmVMYXllcj0iICsgY291bnQpOworICAgICAgICAgICAgY2FudmFzLnJlc3RvcmUoKTsKKyAgICAgICAgICAgIGNvdW50ID0gY2FudmFzLmdldFNhdmVDb3VudCgpOworICAgICAgICAgICAgTG9nLmQoIk9wZW5HTFJlbmRlcmVyIiwgImNvdW50IGFmdGVyIHJlc3RvcmU9IiArIGNvdW50KTsKKworICAgICAgICAgICAgY2FudmFzLnNhdmUoKTsKKyAgICAgICAgICAgIGNhbnZhcy5jbGlwUmVjdCgwLjBmLCAwLjBmLCA0MC4wZiwgNDAuMGYpOworICAgICAgICAgICAgY2FudmFzLmRyYXdCaXRtYXAobUJpdG1hcDEsIDAuMGYsIDAuMGYsIG1CaXRtYXBQYWludCk7CisgICAgICAgICAgICBjYW52YXMuZHJhd0JpdG1hcChtQml0bWFwMSwgLW1CaXRtYXAxLmdldFdpZHRoKCksIDAuMGYsIG1CaXRtYXBQYWludCk7CisgICAgICAgICAgICBjYW52YXMuZHJhd0JpdG1hcChtQml0bWFwMSwgNTAuMGYsIDAuMGYsIG1CaXRtYXBQYWludCk7CisgICAgICAgICAgICBjYW52YXMucmVzdG9yZSgpOworICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2dvb2dsZS9hbmRyb2lkL3Rlc3QvaHd1aS9Sb3RhdGlvbkFjdGl2aXR5LmphdmEgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9nb29nbGUvYW5kcm9pZC90ZXN0L2h3dWkvUm90YXRpb25BY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2MjljYjgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9nb29nbGUvYW5kcm9pZC90ZXN0L2h3dWkvUm90YXRpb25BY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5nb29nbGUuYW5kcm9pZC50ZXN0Lmh3dWk7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworCitAU3VwcHJlc3NXYXJuaW5ncyh7IlVudXNlZERlY2xhcmF0aW9uIn0pCitwdWJsaWMgY2xhc3MgUm90YXRpb25BY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisKKyAgICAgICAgRHJhd2luZ1ZpZXcgY29udGFpbmVyID0gbmV3IERyYXdpbmdWaWV3KHRoaXMpOworCisgICAgICAgIHNldENvbnRlbnRWaWV3KGNvbnRhaW5lcik7CisgICAgfQorICAgIAorICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsiVW51c2VkRGVjbGFyYXRpb24ifSkKKyAgICBzdGF0aWMgaW50IGRpcFRvUHgoQ29udGV4dCBjLCBpbnQgZGlwKSB7CisgICAgICAgIHJldHVybiAoaW50KSAoYy5nZXRSZXNvdXJjZXMoKS5nZXREaXNwbGF5TWV0cmljcygpLmRlbnNpdHkgKiBkaXAgKyAwLjVmKTsKKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgRHJhd2luZ1ZpZXcgZXh0ZW5kcyBWaWV3IHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBQYWludCBtUGFpbnQ7CisKKyAgICAgICAgRHJhd2luZ1ZpZXcoQ29udGV4dCBjKSB7CisgICAgICAgICAgICBzdXBlcihjKTsKKyAgICAgICAgICAgIG1QYWludCA9IG5ldyBQYWludCgpOworICAgICAgICAgICAgbVBhaW50LnNldEFudGlBbGlhcyh0cnVlKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvbkRyYXcoQ2FudmFzIGNhbnZhcykgeworICAgICAgICAgICAgY2FudmFzLnNhdmUoKTsKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoZGlwVG9QeChnZXRDb250ZXh0KCksIDQwMCksIGRpcFRvUHgoZ2V0Q29udGV4dCgpLCAyMDApKTsKKyAgICAgICAgICAgIGNhbnZhcy5yb3RhdGUoNDUuMGYpOworICAgICAgICAgICAgY2FudmFzLmRyYXdSR0IoMjU1LCAyNTUsIDI1NSk7CisgICAgICAgICAgICBtUGFpbnQuc2V0Q29sb3IoMHhmZmZmMDAwMCk7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QoLTgwLjBmLCAtODAuMGYsIDgwLjBmLCA4MC4wZiwgbVBhaW50KTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdCgwLjBmLCAwLjBmLCAyMjAuMGYsIDIyMC4wZiwgbVBhaW50KTsgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9nb29nbGUvYW5kcm9pZC90ZXN0L2h3dWkvU2hhZGVyc0FjdGl2aXR5LmphdmEgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9nb29nbGUvYW5kcm9pZC90ZXN0L2h3dWkvU2hhZGVyc0FjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNkMTQyNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2dvb2dsZS9hbmRyb2lkL3Rlc3QvaHd1aS9TaGFkZXJzQWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDEzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdvb2dsZS5hbmRyb2lkLnRlc3QuaHd1aTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwRmFjdG9yeTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcFNoYWRlcjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuTGluZWFyR3JhZGllbnQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5NYXRyaXg7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlNoYWRlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKKworQFN1cHByZXNzV2FybmluZ3MoeyJVbnVzZWREZWNsYXJhdGlvbiJ9KQorcHVibGljIGNsYXNzIFNoYWRlcnNBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisKKyAgICAgICAgc2V0Q29udGVudFZpZXcobmV3IFNoYWRlcnNWaWV3KHRoaXMpKTsKKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgU2hhZGVyc1ZpZXcgZXh0ZW5kcyBWaWV3IHsKKyAgICAgICAgcHJpdmF0ZSBCaXRtYXBTaGFkZXIgbVJlcGVhdFNoYWRlcjsKKyAgICAgICAgcHJpdmF0ZSBCaXRtYXBTaGFkZXIgbVRyYW5zbGF0ZWRTaGFkZXI7CisgICAgICAgIHByaXZhdGUgQml0bWFwU2hhZGVyIG1TY2FsZWRTaGFkZXI7CisgICAgICAgIHByaXZhdGUgaW50IG1UZXhXaWR0aDsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbVRleEhlaWdodDsKKyAgICAgICAgcHJpdmF0ZSBQYWludCBtUGFpbnQ7CisgICAgICAgIHByaXZhdGUgZmxvYXQgbURyYXdXaWR0aDsKKyAgICAgICAgcHJpdmF0ZSBmbG9hdCBtRHJhd0hlaWdodDsKKyAgICAgICAgcHJpdmF0ZSBMaW5lYXJHcmFkaWVudCBtSG9yR3JhZGllbnQ7CisgICAgICAgIHByaXZhdGUgTGluZWFyR3JhZGllbnQgbURpYWdHcmFkaWVudDsKKyAgICAgICAgcHJpdmF0ZSBMaW5lYXJHcmFkaWVudCBtVmVydEdyYWRpZW50OworCisgICAgICAgIFNoYWRlcnNWaWV3KENvbnRleHQgYykgeworICAgICAgICAgICAgc3VwZXIoYyk7CisKKyAgICAgICAgICAgIEJpdG1hcCB0ZXh0dXJlID0gQml0bWFwRmFjdG9yeS5kZWNvZGVSZXNvdXJjZShjLmdldFJlc291cmNlcygpLCBSLmRyYXdhYmxlLnN1bnNldDEpOworICAgICAgICAgICAgbVRleFdpZHRoID0gdGV4dHVyZS5nZXRXaWR0aCgpOworICAgICAgICAgICAgbVRleEhlaWdodCA9IHRleHR1cmUuZ2V0SGVpZ2h0KCk7CisgICAgICAgICAgICBtRHJhd1dpZHRoID0gbVRleFdpZHRoICogMi4yZjsKKyAgICAgICAgICAgIG1EcmF3SGVpZ2h0ID0gbVRleEhlaWdodCAqIDEuMmY7CisKKyAgICAgICAgICAgIG1SZXBlYXRTaGFkZXIgPSBuZXcgQml0bWFwU2hhZGVyKHRleHR1cmUsIFNoYWRlci5UaWxlTW9kZS5SRVBFQVQsCisgICAgICAgICAgICAgICAgICAgIFNoYWRlci5UaWxlTW9kZS5SRVBFQVQpOworCisgICAgICAgICAgICBtVHJhbnNsYXRlZFNoYWRlciA9IG5ldyBCaXRtYXBTaGFkZXIodGV4dHVyZSwgU2hhZGVyLlRpbGVNb2RlLlJFUEVBVCwKKyAgICAgICAgICAgICAgICAgICAgU2hhZGVyLlRpbGVNb2RlLlJFUEVBVCk7CisgICAgICAgICAgICBNYXRyaXggbTEgPSBuZXcgTWF0cml4KCk7CisgICAgICAgICAgICBtMS5zZXRUcmFuc2xhdGUobVRleFdpZHRoIC8gMi4wZiwgbVRleEhlaWdodCAvIDIuMGYpOworICAgICAgICAgICAgbTEucG9zdFJvdGF0ZSg0NSwgMCwgMCk7CisgICAgICAgICAgICBtVHJhbnNsYXRlZFNoYWRlci5zZXRMb2NhbE1hdHJpeChtMSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIG1TY2FsZWRTaGFkZXIgPSBuZXcgQml0bWFwU2hhZGVyKHRleHR1cmUsIFNoYWRlci5UaWxlTW9kZS5NSVJST1IsCisgICAgICAgICAgICAgICAgICAgIFNoYWRlci5UaWxlTW9kZS5NSVJST1IpOworICAgICAgICAgICAgTWF0cml4IG0yID0gbmV3IE1hdHJpeCgpOworICAgICAgICAgICAgbTIuc2V0U2NhbGUoMC41ZiwgMC41Zik7CisgICAgICAgICAgICBtU2NhbGVkU2hhZGVyLnNldExvY2FsTWF0cml4KG0yKTsKKworICAgICAgICAgICAgbUhvckdyYWRpZW50ID0gbmV3IExpbmVhckdyYWRpZW50KDAuMGYsIDAuMGYsIG1EcmF3V2lkdGgsIDAuMGYsCisgICAgICAgICAgICAgICAgICAgIENvbG9yLlJFRCwgQ29sb3IuR1JFRU4sIFNoYWRlci5UaWxlTW9kZS5DTEFNUCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIG1EaWFnR3JhZGllbnQgPSBuZXcgTGluZWFyR3JhZGllbnQoMC4wZiwgMC4wZiwgbURyYXdXaWR0aCAvIDEuNWYsIG1EcmF3SGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICBDb2xvci5CTFVFLCBDb2xvci5NQUdFTlRBLCBTaGFkZXIuVGlsZU1vZGUuQ0xBTVApOworICAgICAgICAgICAgCisgICAgICAgICAgICBtVmVydEdyYWRpZW50ID0gbmV3IExpbmVhckdyYWRpZW50KDAuMGYsIDAuMGYsIDAuMGYsIG1EcmF3SGVpZ2h0IC8gMi4wZiwKKyAgICAgICAgICAgICAgICAgICAgQ29sb3IuWUVMTE9XLCBDb2xvci5NQUdFTlRBLCBTaGFkZXIuVGlsZU1vZGUuTUlSUk9SKTsKKworICAgICAgICAgICAgbVBhaW50ID0gbmV3IFBhaW50KCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25EcmF3KENhbnZhcyBjYW52YXMpIHsKKyAgICAgICAgICAgIHN1cGVyLm9uRHJhdyhjYW52YXMpOworICAgICAgICAgICAgLy9jYW52YXMuZHJhd1JHQigyNTUsIDI1NSwgMjU1KTsKKworICAgICAgICAgICAgLy8gQml0bWFwIHNoYWRlcnMKKyAgICAgICAgICAgIGNhbnZhcy5zYXZlKCk7CisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDQwLjBmLCA0MC4wZik7CisKKyAgICAgICAgICAgIG1QYWludC5zZXRTaGFkZXIobVJlcGVhdFNoYWRlcik7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QoMC4wZiwgMC4wZiwgbURyYXdXaWR0aCwgbURyYXdIZWlnaHQsIG1QYWludCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMC4wZiwgNDAuMGYgKyBtRHJhd0hlaWdodCk7CisgICAgICAgICAgICBtUGFpbnQuc2V0U2hhZGVyKG1UcmFuc2xhdGVkU2hhZGVyKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdCgwLjBmLCAwLjBmLCBtRHJhd1dpZHRoLCBtRHJhd0hlaWdodCwgbVBhaW50KTsKKworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgwLjBmLCA0MC4wZiArIG1EcmF3SGVpZ2h0KTsKKyAgICAgICAgICAgIG1QYWludC5zZXRTaGFkZXIobVNjYWxlZFNoYWRlcik7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QoMC4wZiwgMC4wZiwgbURyYXdXaWR0aCwgbURyYXdIZWlnaHQsIG1QYWludCk7CisKKyAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlKCk7CisKKyAgICAgICAgICAgIC8vIEdyYWRpZW50cworICAgICAgICAgICAgY2FudmFzLnNhdmUoKTsKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoNDAuMGYgKyBtRHJhd1dpZHRoICsgNDAuMGYsIDQwLjBmKTsKKworICAgICAgICAgICAgbVBhaW50LnNldFNoYWRlcihtSG9yR3JhZGllbnQpOworICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KDAuMGYsIDAuMGYsIG1EcmF3V2lkdGgsIG1EcmF3SGVpZ2h0LCBtUGFpbnQpOworICAgICAgICAgICAgCisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDAuMGYsIDQwLjBmICsgbURyYXdIZWlnaHQpOworICAgICAgICAgICAgbVBhaW50LnNldFNoYWRlcihtRGlhZ0dyYWRpZW50KTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdCgwLjBmLCAwLjBmLCBtRHJhd1dpZHRoLCBtRHJhd0hlaWdodCwgbVBhaW50KTsKKworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgwLjBmLCA0MC4wZiArIG1EcmF3SGVpZ2h0KTsKKyAgICAgICAgICAgIG1QYWludC5zZXRTaGFkZXIobVZlcnRHcmFkaWVudCk7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QoMC4wZiwgMC4wZiwgbURyYXdXaWR0aCwgbURyYXdIZWlnaHQsIG1QYWludCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9nb29nbGUvYW5kcm9pZC90ZXN0L2h3dWkvU2ltcGxlUGF0aHNBY3Rpdml0eS5qYXZhIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vZ29vZ2xlL2FuZHJvaWQvdGVzdC9od3VpL1NpbXBsZVBhdGhzQWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzFhMTE4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vZ29vZ2xlL2FuZHJvaWQvdGVzdC9od3VpL1NpbXBsZVBhdGhzQWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDQwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ29vZ2xlLmFuZHJvaWQudGVzdC5od3VpOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC52aWV3LkdyYXZpdHk7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuRWRpdFRleHQ7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuRnJhbWVMYXlvdXQ7CisKK0BTdXBwcmVzc1dhcm5pbmdzKHsiVW51c2VkRGVjbGFyYXRpb24ifSkKK3B1YmxpYyBjbGFzcyBTaW1wbGVQYXRoc0FjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKworICAgICAgICBGcmFtZUxheW91dCBsYXlvdXQgPSBuZXcgRnJhbWVMYXlvdXQodGhpcyk7CisgICAgICAgIEVkaXRUZXh0IHRleHQgPSBuZXcgRWRpdFRleHQodGhpcyk7CisgICAgICAgIGxheW91dC5hZGRWaWV3KHRleHQsIG5ldyBGcmFtZUxheW91dC5MYXlvdXRQYXJhbXMoNjAwLCAzNTAsIEdyYXZpdHkuQ0VOVEVSKSk7CisgICAgICAgIHRleHQuc2V0VGV4dCgiVGhpcyBpcyBhbiBleGFtcGxlIG9mIGFuIEVkaXRUZXh0IHdpZGdldCBcbiIgKworICAgICAgICAgICAgICAgICJ1c2luZyBzaW1wbGUgcGF0aHMgdG8gY3JlYXRlIHRoZSBzZWxlY3Rpb24uIik7CisgICAgICAgIC8vdGV4dC5zZXRTZWxlY3Rpb24oMCwgdGV4dC5nZXRUZXh0KCkubGVuZ3RoKCkpOworCisgICAgICAgIHNldENvbnRlbnRWaWV3KGxheW91dCk7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2dvb2dsZS9hbmRyb2lkL3Rlc3QvaHd1aS9TdGFja0FjdGl2aXR5LmphdmEgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9nb29nbGUvYW5kcm9pZC90ZXN0L2h3dWkvU3RhY2tBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjOGRiNmUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9nb29nbGUvYW5kcm9pZC90ZXN0L2h3dWkvU3RhY2tBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5nb29nbGUuYW5kcm9pZC50ZXN0Lmh3dWk7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFycmF5QWRhcHRlcjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuU3RhY2tWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OworCitAU3VwcHJlc3NXYXJuaW5ncyh7IlVudXNlZERlY2xhcmF0aW9uIn0pCitwdWJsaWMgY2xhc3MgU3RhY2tBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisKKyAgICAgICAgc2V0Q29udGVudFZpZXcoUi5sYXlvdXQuc3RhY2spOworCisgICAgICAgIFN0YWNrVmlldyBzdGFjayA9IChTdGFja1ZpZXcpIGZpbmRWaWV3QnlJZChSLmlkLnN0YWNrX3ZpZXcpOworICAgICAgICBzdGFjay5zZXRBZGFwdGVyKG5ldyBBcnJheUFkYXB0ZXI8RHJhd2FibGU+KHRoaXMsIGFuZHJvaWQuUi5sYXlvdXQuc2ltcGxlX2xpc3RfaXRlbV8xLAorICAgICAgICAgICAgICAgIGFuZHJvaWQuUi5pZC50ZXh0MSwgbmV3IERyYXdhYmxlW10geworICAgICAgICAgICAgZ2V0UmVzb3VyY2VzKCkuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5zdW5zZXQxKSwKKyAgICAgICAgICAgIGdldFJlc291cmNlcygpLmdldERyYXdhYmxlKFIuZHJhd2FibGUuc3Vuc2V0MiksCisgICAgICAgIH0pIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFZpZXcgZ2V0VmlldyhpbnQgcG9zaXRpb24sIFZpZXcgY29udmVydFZpZXcsIFZpZXdHcm91cCBwYXJlbnQpIHsKKyAgICAgICAgICAgICAgICBWaWV3IGl0ZW0gPSBjb252ZXJ0VmlldzsKKyAgICAgICAgICAgICAgICBpZiAoaXRlbSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGl0ZW0gPSBMYXlvdXRJbmZsYXRlci5mcm9tKGdldENvbnRleHQoKSkuaW5mbGF0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBSLmxheW91dC5zdGFja19pdGVtLCBudWxsLCBmYWxzZSk7ICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgKChJbWFnZVZpZXcpIGl0ZW0uZmluZFZpZXdCeUlkKFIuaWQudGV4dHZpZXdfaWNvbikpLnNldEltYWdlRHJhd2FibGUoCisgICAgICAgICAgICAgICAgICAgICAgICBnZXRJdGVtKHBvc2l0aW9uICUgZ2V0Q291bnQoKSkpOworICAgICAgICAgICAgICAgICgoVGV4dFZpZXcpIGl0ZW0uZmluZFZpZXdCeUlkKFIuaWQubWluaV90ZXh0KSkuc2V0VGV4dCgiIiArIHBvc2l0aW9uKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gaXRlbTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICAgIHN0YWNrLnNldERpc3BsYXllZENoaWxkKDApOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2dvb2dsZS9hbmRyb2lkL3Rlc3QvaHd1aS9UZXh0QWN0aXZpdHkuamF2YSBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2dvb2dsZS9hbmRyb2lkL3Rlc3QvaHd1aS9UZXh0QWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmU5ZDVlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vZ29vZ2xlL2FuZHJvaWQvdGVzdC9od3VpL1RleHRBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsMTA4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ29vZ2xlLmFuZHJvaWQudGVzdC5od3VpOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKKworQFN1cHByZXNzV2FybmluZ3MoeyJVbnVzZWREZWNsYXJhdGlvbiJ9KQorcHVibGljIGNsYXNzIFRleHRBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisKKyAgICAgICAgc2V0Q29udGVudFZpZXcobmV3IEN1c3RvbVRleHRWaWV3KHRoaXMpKTsKKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgQ3VzdG9tVGV4dFZpZXcgZXh0ZW5kcyBWaWV3IHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBQYWludCBtTWVkaXVtUGFpbnQ7CisgICAgICAgIHByaXZhdGUgZmluYWwgUGFpbnQgbUxhcmdlUGFpbnQ7CisgICAgICAgIHByaXZhdGUgZmluYWwgUGFpbnQgbVN0cmlrZVBhaW50OworICAgICAgICBwcml2YXRlIGZpbmFsIFBhaW50IG1TY2FsZWRQYWludDsKKworICAgICAgICBDdXN0b21UZXh0VmlldyhDb250ZXh0IGMpIHsKKyAgICAgICAgICAgIHN1cGVyKGMpOworCisgICAgICAgICAgICBtTWVkaXVtUGFpbnQgPSBuZXcgUGFpbnQoKTsKKyAgICAgICAgICAgIG1NZWRpdW1QYWludC5zZXRBbnRpQWxpYXModHJ1ZSk7CisgICAgICAgICAgICBtTWVkaXVtUGFpbnQuc2V0Q29sb3IoMHhmZmZmMDAwMCk7CisKKyAgICAgICAgICAgIG1MYXJnZVBhaW50ID0gbmV3IFBhaW50KCk7CisgICAgICAgICAgICBtTGFyZ2VQYWludC5zZXRBbnRpQWxpYXModHJ1ZSk7CisgICAgICAgICAgICBtTGFyZ2VQYWludC5zZXRUZXh0U2l6ZSgzNi4wZik7CisKKyAgICAgICAgICAgIG1TdHJpa2VQYWludCA9IG5ldyBQYWludCgpOworICAgICAgICAgICAgbVN0cmlrZVBhaW50LnNldEFudGlBbGlhcyh0cnVlKTsKKyAgICAgICAgICAgIG1TdHJpa2VQYWludC5zZXRUZXh0U2l6ZSgxNi4wZik7CisgICAgICAgICAgICBtU3RyaWtlUGFpbnQuc2V0VW5kZXJsaW5lVGV4dCh0cnVlKTsKKworICAgICAgICAgICAgbVNjYWxlZFBhaW50ID0gbmV3IFBhaW50KCk7CisgICAgICAgICAgICBtU2NhbGVkUGFpbnQuc2V0QW50aUFsaWFzKHRydWUpOworICAgICAgICAgICAgbVNjYWxlZFBhaW50LnNldFRleHRTaXplKDE2LjBmKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvbkRyYXcoQ2FudmFzIGNhbnZhcykgeworICAgICAgICAgICAgc3VwZXIub25EcmF3KGNhbnZhcyk7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JHQigyNTUsIDI1NSwgMjU1KTsKKworICAgICAgICAgICAgY2FudmFzLmRyYXdUZXh0KCJIZWxsbyBPcGVuR0wgcmVuZGVyZXIhIiwgMTAwLCAyMCwgbU1lZGl1bVBhaW50KTsKKyAgICAgICAgICAgIG1NZWRpdW1QYWludC5zZXRUZXh0QWxpZ24oUGFpbnQuQWxpZ24uQ0VOVEVSKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3VGV4dCgiSGVsbG8gT3BlbkdMIHJlbmRlcmVyISIsIDEwMCwgNDAsIG1NZWRpdW1QYWludCk7CisgICAgICAgICAgICBtTWVkaXVtUGFpbnQuc2V0VGV4dEFsaWduKFBhaW50LkFsaWduLlJJR0hUKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3VGV4dCgiSGVsbG8gT3BlbkdMIHJlbmRlcmVyISIsIDEwMCwgNjAsIG1NZWRpdW1QYWludCk7CisgICAgICAgICAgICBtTWVkaXVtUGFpbnQuc2V0VGV4dEFsaWduKFBhaW50LkFsaWduLkxFRlQpOworICAgICAgICAgICAgY2FudmFzLmRyYXdUZXh0KCJIZWxsbyBPcGVuR0wgcmVuZGVyZXIhIiwgMTAwLCAxMDAsIG1NZWRpdW1QYWludCk7CisgICAgICAgICAgICBtTWVkaXVtUGFpbnQuc2V0U2hhZG93TGF5ZXIoMi41ZiwgMC4wZiwgMC4wZiwgMHhmZjAwMDAwMCk7CisgICAgICAgICAgICBjYW52YXMuZHJhd1RleHQoIkhlbGxvIE9wZW5HTCByZW5kZXJlciEiLCAxMDAsIDE1MCwgbU1lZGl1bVBhaW50KTsKKyAgICAgICAgICAgIG1NZWRpdW1QYWludC5jbGVhclNoYWRvd0xheWVyKCk7CisgICAgICAgICAgICBjYW52YXMuZHJhd1RleHQoIkhlbGxvIE9wZW5HTCByZW5kZXJlciEiLCAxMDAsIDIwMCwgbUxhcmdlUGFpbnQpOworCisgICAgICAgICAgICBtTGFyZ2VQYWludC5zZXRTaGFkb3dMYXllcigyLjVmLCAzLjBmLCAzLjBmLCAweGZmMDAwMDAwKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3VGV4dCgiSGVsbG8gT3BlbkdMIHJlbmRlcmVyISIsIDEwMCwgNDAwLCBtTGFyZ2VQYWludCk7CisgICAgICAgICAgICBtTGFyZ2VQYWludC5zZXRTaGFkb3dMYXllcigzLjBmLCAzLjBmLCAzLjBmLCAweGZmMDBmZjAwKTsKKyAgICAgICAgICAgIG1MYXJnZVBhaW50LnNldEFscGhhKDEwMCk7CisgICAgICAgICAgICBjYW52YXMuZHJhd1RleHQoIkhlbGxvIE9wZW5HTCByZW5kZXJlciEiLCAxMDAsIDUwMCwgbUxhcmdlUGFpbnQpOworICAgICAgICAgICAgbUxhcmdlUGFpbnQuc2V0QWxwaGEoMjU1KTsKKyAgICAgICAgICAgIG1MYXJnZVBhaW50LmNsZWFyU2hhZG93TGF5ZXIoKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgY2FudmFzLmRyYXdUZXh0KCJIZWxsbyBPcGVuR0wgcmVuZGVyZXIhIiwgNTAwLCA0MCwgbVN0cmlrZVBhaW50KTsKKyAgICAgICAgICAgIG1TdHJpa2VQYWludC5zZXRTdHJpa2VUaHJ1VGV4dCh0cnVlKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3VGV4dCgiSGVsbG8gT3BlbkdMIHJlbmRlcmVyISIsIDUwMCwgNzAsIG1TdHJpa2VQYWludCk7CisgICAgICAgICAgICBtU3RyaWtlUGFpbnQuc2V0VW5kZXJsaW5lVGV4dChmYWxzZSk7CisgICAgICAgICAgICBjYW52YXMuZHJhd1RleHQoIkhlbGxvIE9wZW5HTCByZW5kZXJlciEiLCA1MDAsIDEwMCwgbVN0cmlrZVBhaW50KTsKKyAgICAgICAgICAgIG1TdHJpa2VQYWludC5zZXRTdHJpa2VUaHJ1VGV4dChmYWxzZSk7CisgICAgICAgICAgICBtU3RyaWtlUGFpbnQuc2V0VW5kZXJsaW5lVGV4dCh0cnVlKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgbVNjYWxlZFBhaW50LnNldFRleHRTY2FsZVgoMC41Zik7CisgICAgICAgICAgICBjYW52YXMuZHJhd1RleHQoIkhlbGxvIE9wZW5HTCByZW5kZXJlciEiLCA1MDAsIDIwMCwgbVNjYWxlZFBhaW50KTsKKyAgICAgICAgICAgIG1TY2FsZWRQYWludC5zZXRUZXh0U2NhbGVYKDIuMGYpOworICAgICAgICAgICAgY2FudmFzLmRyYXdUZXh0KCJIZWxsbyBPcGVuR0wgcmVuZGVyZXIhIiwgNTAwLCAyMzAsIG1TY2FsZWRQYWludCk7CisgICAgICAgICAgICBtU2NhbGVkUGFpbnQuc2V0VGV4dFNjYWxlWCgxLjBmKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3VGV4dCgiSGVsbG8gT3BlbkdMIHJlbmRlcmVyISIsIDUwMCwgMjYwLCBtU2NhbGVkUGFpbnQpOworICAgICAgICAgICAgCisgICAgICAgICAgICBjYW52YXMuc2F2ZSgpOworICAgICAgICAgICAgY2FudmFzLmNsaXBSZWN0KDE1MC4wZiwgMjIwLjBmLCA0NTAuMGYsIDMyMC4wZik7CisgICAgICAgICAgICBjYW52YXMuZHJhd1RleHQoIkhlbGxvIE9wZW5HTCByZW5kZXJlciEiLCAxMDAsIDMwMCwgbUxhcmdlUGFpbnQpOworICAgICAgICAgICAgY2FudmFzLnJlc3RvcmUoKTsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9nb29nbGUvYW5kcm9pZC90ZXN0L2h3dWkvVHJhbnNmb3JtM2RBY3Rpdml0eS5qYXZhIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vZ29vZ2xlL2FuZHJvaWQvdGVzdC9od3VpL1RyYW5zZm9ybTNkQWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTM0Y2RlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vZ29vZ2xlL2FuZHJvaWQvdGVzdC9od3VpL1RyYW5zZm9ybTNkQWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDk3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ29vZ2xlLmFuZHJvaWQudGVzdC5od3VpOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXBGYWN0b3J5OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FtZXJhOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuTWF0cml4OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworCitAU3VwcHJlc3NXYXJuaW5ncyh7IlVudXNlZERlY2xhcmF0aW9uIn0pCitwdWJsaWMgY2xhc3MgVHJhbnNmb3JtM2RBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIGZpbmFsIFRyYW5zZm9ybTNkVmlldyB2aWV3ID0gbmV3IFRyYW5zZm9ybTNkVmlldyh0aGlzKTsKKyAgICAgICAgc2V0Q29udGVudFZpZXcodmlldyk7CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIFRyYW5zZm9ybTNkVmlldyBleHRlbmRzIFZpZXcgeworICAgICAgICBwcml2YXRlIGZpbmFsIEJpdG1hcCBtQml0bWFwMTsKKyAgICAgICAgcHJpdmF0ZSBDYW1lcmEgbUNhbWVyYTsKKyAgICAgICAgcHJpdmF0ZSBNYXRyaXggbU1hdHJpeDsKKworICAgICAgICBUcmFuc2Zvcm0zZFZpZXcoQ29udGV4dCBjKSB7CisgICAgICAgICAgICBzdXBlcihjKTsKKworICAgICAgICAgICAgbUJpdG1hcDEgPSBCaXRtYXBGYWN0b3J5LmRlY29kZVJlc291cmNlKGMuZ2V0UmVzb3VyY2VzKCksIFIuZHJhd2FibGUuc3Vuc2V0MSk7CisgICAgICAgICAgICBtQ2FtZXJhID0gbmV3IENhbWVyYSgpOworICAgICAgICAgICAgbU1hdHJpeCA9IG5ldyBNYXRyaXgoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvbkRyYXcoQ2FudmFzIGNhbnZhcykgeworICAgICAgICAgICAgc3VwZXIub25EcmF3KGNhbnZhcyk7CisKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3QVJHQigyNTUsIDI1NSwgMjU1LCAyNTUpOworCisgICAgICAgICAgICBmaW5hbCBmbG9hdCBjZW50ZXJYID0gZ2V0V2lkdGgoKSAvIDIuMGYgLSBtQml0bWFwMS5nZXRXaWR0aCgpIC8gMi4wZjsKKyAgICAgICAgICAgIGZpbmFsIGZsb2F0IGNlbnRlclkgPSBnZXRIZWlnaHQoKSAvIDIuMGYgLSBtQml0bWFwMS5nZXRIZWlnaHQoKSAvIDIuMGY7CisgICAgICAgICAgICBmaW5hbCBDYW1lcmEgY2FtZXJhID0gbUNhbWVyYTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgZmluYWwgTWF0cml4IG1hdHJpeCA9IG1NYXRyaXg7CisKKyAgICAgICAgICAgIHJvdGF0ZShjZW50ZXJYLCBjZW50ZXJZLCBjYW1lcmEsIG1hdHJpeCwgMzIuMGYpOworICAgICAgICAgICAgZHJhd0JpdG1hcChjYW52YXMsIGNlbnRlclgsIGNlbnRlclksIDAuMGYsIG1hdHJpeCk7CisKKyAgICAgICAgICAgIHJvdGF0ZShjZW50ZXJYLCBjZW50ZXJZLCBjYW1lcmEsIG1hdHJpeCwgMTIuMGYpOworICAgICAgICAgICAgZHJhd0JpdG1hcChjYW52YXMsIGNlbnRlclgsIGNlbnRlclksIC1tQml0bWFwMS5nZXRXaWR0aCgpLCBtYXRyaXgpOworICAgICAgICAgICAgCisgICAgICAgICAgICByb3RhdGUoY2VudGVyWCwgY2VudGVyWSwgY2FtZXJhLCBtYXRyaXgsIDUyLjBmKTsKKyAgICAgICAgICAgIGRyYXdCaXRtYXAoY2FudmFzLCBjZW50ZXJYLCBjZW50ZXJZLCBtQml0bWFwMS5nZXRXaWR0aCgpLCBtYXRyaXgpOworICAgICAgICAgICAgCisgICAgICAgICAgICByb3RhdGUoY2VudGVyWCwgY2VudGVyWSwgY2FtZXJhLCBtYXRyaXgsIDEyMi4wZik7CisgICAgICAgICAgICBkcmF3Qml0bWFwKGNhbnZhcywgY2VudGVyWCwgY2VudGVyWSwgbUJpdG1hcDEuZ2V0V2lkdGgoKSAqIDIuMGYsIG1hdHJpeCk7CisgICAgICAgICAgICAKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBkcmF3Qml0bWFwKENhbnZhcyBjYW52YXMsIGZsb2F0IGNlbnRlclgsIGZsb2F0IGNlbnRlclksIGZsb2F0IG9mZnNldCwKKyAgICAgICAgICAgICAgICBNYXRyaXggbWF0cml4KSB7CisgICAgICAgICAgICBjYW52YXMuc2F2ZSgpOworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZShvZmZzZXQsIDAuMGYpOworICAgICAgICAgICAgY2FudmFzLmNvbmNhdChtYXRyaXgpOworICAgICAgICAgICAgY2FudmFzLmRyYXdCaXRtYXAobUJpdG1hcDEsIGNlbnRlclgsIGNlbnRlclksIG51bGwpOworICAgICAgICAgICAgY2FudmFzLnJlc3RvcmUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCByb3RhdGUoZmxvYXQgY2VudGVyWCwgZmxvYXQgY2VudGVyWSwgQ2FtZXJhIGNhbWVyYSwKKyAgICAgICAgICAgICAgICBNYXRyaXggbWF0cml4LCBmbG9hdCBhbmdsZSkgeworICAgICAgICAgICAgY2FtZXJhLnNhdmUoKTsKKyAgICAgICAgICAgIGNhbWVyYS5yb3RhdGVZKGFuZ2xlKTsKKyAgICAgICAgICAgIGNhbWVyYS5nZXRNYXRyaXgobWF0cml4KTsKKyAgICAgICAgICAgIGNhbWVyYS5yZXN0b3JlKCk7CisKKyAgICAgICAgICAgIG1hdHJpeC5wcmVUcmFuc2xhdGUoLWNlbnRlclgsIC1jZW50ZXJZKTsKKyAgICAgICAgICAgIG1hdHJpeC5wb3N0VHJhbnNsYXRlKGNlbnRlclgsIGNlbnRlclkpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vZ29vZ2xlL2FuZHJvaWQvdGVzdC9od3VpL1hmZXJtb2RlQWN0aXZpdHkuamF2YSBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2dvb2dsZS9hbmRyb2lkL3Rlc3QvaHd1aS9YZmVybW9kZUFjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM4MWYwMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2dvb2dsZS9hbmRyb2lkL3Rlc3QvaHd1aS9YZmVybW9kZUFjdGl2aXR5LmphdmEKQEAgLTAsMCArMSwxMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5nb29nbGUuYW5kcm9pZC50ZXN0Lmh3dWk7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9ydGVyRHVmZjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBvcnRlckR1ZmZYZmVybW9kZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKKworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmdyYXBoaWNzLlBvcnRlckR1ZmYuTW9kZTsKKworQFN1cHByZXNzV2FybmluZ3MoeyJVbnVzZWREZWNsYXJhdGlvbiJ9KQorcHVibGljIGNsYXNzIFhmZXJtb2RlQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICAKKyAgICAgICAgc2V0Q29udGVudFZpZXcobmV3IFhmZXJtb2Rlc1ZpZXcodGhpcykpOworICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBYZmVybW9kZXNWaWV3IGV4dGVuZHMgVmlldyB7CisgICAgICAgIHByaXZhdGUgZmluYWwgUGFpbnQgbUJsdWVQYWludDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBQYWludCBtUmVkUGFpbnQ7CisKKyAgICAgICAgWGZlcm1vZGVzVmlldyhDb250ZXh0IGMpIHsKKyAgICAgICAgICAgIHN1cGVyKGMpOworCisgICAgICAgICAgICBtQmx1ZVBhaW50ID0gbmV3IFBhaW50KCk7CisgICAgICAgICAgICBtQmx1ZVBhaW50LnNldENvbG9yKDB4ZmYwMDAwZmYpOworICAgICAgICAgICAgCisgICAgICAgICAgICBtUmVkUGFpbnQgPSBuZXcgUGFpbnQoKTsKKyAgICAgICAgICAgIG1SZWRQYWludC5zZXRDb2xvcigweDdmZmYwMDAwKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvbkRyYXcoQ2FudmFzIGNhbnZhcykgeworICAgICAgICAgICAgc3VwZXIub25EcmF3KGNhbnZhcyk7CisgICAgICAgICAgICAvL2NhbnZhcy5kcmF3UkdCKDI1NSwgMjU1LCAyNTUpOworCisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDEwMC4wZiwgMTAwLjBmKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gU1JDIG1vZGVzCisgICAgICAgICAgICBjYW52YXMuc2F2ZSgpOworCisgICAgICAgICAgICBkcmF3UmVjdHMoY2FudmFzLCBNb2RlLlNSQ19PVkVSKTsKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMC4wZiwgMTAwLjBmKTsKKworICAgICAgICAgICAgZHJhd1JlY3RzKGNhbnZhcywgTW9kZS5TUkNfSU4pOworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgwLjBmLCAxMDAuMGYpOyAgICAgICAgICAgIAorCisgICAgICAgICAgICBkcmF3UmVjdHMoY2FudmFzLCBNb2RlLlNSQ19PVVQpOworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgwLjBmLCAxMDAuMGYpOworCisgICAgICAgICAgICBkcmF3UmVjdHMoY2FudmFzLCBNb2RlLlNSQ19BVE9QKTsKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMC4wZiwgMTAwLjBmKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgZHJhd1JlY3RzKGNhbnZhcywgTW9kZS5TUkMpOworCisgICAgICAgICAgICBjYW52YXMucmVzdG9yZSgpOworICAgICAgICAgICAgCisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDEwMC4wZiwgMC4wZik7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIERTVCBtb2RlcworICAgICAgICAgICAgY2FudmFzLnNhdmUoKTsKKworICAgICAgICAgICAgZHJhd1JlY3RzKGNhbnZhcywgTW9kZS5EU1RfT1ZFUik7CisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDAuMGYsIDEwMC4wZik7CisKKyAgICAgICAgICAgIGRyYXdSZWN0cyhjYW52YXMsIE1vZGUuRFNUX0lOKTsKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMC4wZiwgMTAwLjBmKTsgICAgICAgICAgICAKKworICAgICAgICAgICAgZHJhd1JlY3RzKGNhbnZhcywgTW9kZS5EU1RfT1VUKTsKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMC4wZiwgMTAwLjBmKTsKKworICAgICAgICAgICAgZHJhd1JlY3RzKGNhbnZhcywgTW9kZS5EU1RfQVRPUCk7CisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDAuMGYsIDEwMC4wZik7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGRyYXdSZWN0cyhjYW52YXMsIE1vZGUuRFNUKTsKKworICAgICAgICAgICAgY2FudmFzLnJlc3RvcmUoKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgxMDAuMGYsIDAuMGYpOworICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBPdGhlciBtb2RlcworICAgICAgICAgICAgY2FudmFzLnNhdmUoKTsKKworICAgICAgICAgICAgZHJhd1JlY3RzKGNhbnZhcywgTW9kZS5DTEVBUik7CisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDAuMGYsIDEwMC4wZik7CisKKyAgICAgICAgICAgIGRyYXdSZWN0cyhjYW52YXMsIE1vZGUuWE9SKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgwLjBmLCAxMDAuMGYpOworICAgICAgICAgICAgCisgICAgICAgICAgICBtQmx1ZVBhaW50LnNldEFscGhhKDEyNyk7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QoMC4wZiwgMC4wZiwgNTAuMGYsIDUwLjBmLCBtQmx1ZVBhaW50KTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgwLjBmLCAxMDAuMGYpOworICAgICAgICAgICAgCisgICAgICAgICAgICBtQmx1ZVBhaW50LnNldEFscGhhKDEwKTsKKyAgICAgICAgICAgIG1CbHVlUGFpbnQuc2V0Q29sb3IoMHg3ZjAwMDBmZik7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QoMC4wZiwgMC4wZiwgNTAuMGYsIDUwLjBmLCBtQmx1ZVBhaW50KTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgbUJsdWVQYWludC5zZXRDb2xvcigweGZmMDAwMGZmKTsKKyAgICAgICAgICAgIG1CbHVlUGFpbnQuc2V0QWxwaGEoMjU1KTsKKworICAgICAgICAgICAgY2FudmFzLnJlc3RvcmUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBkcmF3UmVjdHMoQ2FudmFzIGNhbnZhcywgUG9ydGVyRHVmZi5Nb2RlIG1vZGUpIHsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdCgwLjBmLCAwLjBmLCA1MC4wZiwgNTAuMGYsIG1CbHVlUGFpbnQpOworCisgICAgICAgICAgICBjYW52YXMuc2F2ZSgpOworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgyNS4wZiwgMjUuMGYpOworICAgICAgICAgICAgbVJlZFBhaW50LnNldFhmZXJtb2RlKG5ldyBQb3J0ZXJEdWZmWGZlcm1vZGUobW9kZSkpOworICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KDAuMGYsIDAuMGYsIDUwLjBmLCA1MC4wZiwgbVJlZFBhaW50KTsKKyAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlLWhkcGkvYXBwX2dtYWlsLnBuZyBiL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtaGRwaS9hcHBfZ21haWwucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzZDMzZTUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlLWhkcGkvYXBwX2dtYWlsLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlLWhkcGkvYXBwX3Bob25lLnBuZyBiL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtaGRwaS9hcHBfcGhvbmUucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3MmU3ZDMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlLWhkcGkvYXBwX3Bob25lLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlLWhkcGkvaWNfc3RhdHVzYmFyX2NoYXQucG5nIGIvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX3N0YXR1c2Jhcl9jaGF0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lM2I0ZTJiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX3N0YXR1c2Jhcl9jaGF0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlLWhkcGkvaWNfc3RhdHVzYmFyX2VtYWlsLnBuZyBiL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtaGRwaS9pY19zdGF0dXNiYXJfZW1haWwucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjZWZkMzYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlLWhkcGkvaWNfc3RhdHVzYmFyX2VtYWlsLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlLWhkcGkvaWNfc3RhdHVzYmFyX21pc3NlZGNhbGwucG5nIGIvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX3N0YXR1c2Jhcl9taXNzZWRjYWxsLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmVlYzI4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX3N0YXR1c2Jhcl9taXNzZWRjYWxsLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlLWhkcGkvaWNvbjEucG5nIGIvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1oZHBpL2ljb24xLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDg1MjU3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1oZHBpL2ljb24xLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlLWhkcGkvaWNvbjIucG5nIGIvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1oZHBpL2ljb24yLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjMwOTg2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1oZHBpL2ljb24yLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlLWhkcGkvaWNvbjMucG5nIGIvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1oZHBpL2ljb24zLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDcyYjY2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1oZHBpL2ljb24zLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlLWhkcGkvaWNvbjQucG5nIGIvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1oZHBpL2ljb240LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNGE0MGYyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1oZHBpL2ljb240LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlL2FwcF9nbWFpbC5wbmcgYi90ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlLW1kcGkvYXBwX2dtYWlsLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS9hcHBfZ21haWwucG5nCnJlbmFtZSB0byB0ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlLW1kcGkvYXBwX2dtYWlsLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlL2FwcF9waG9uZS5wbmcgYi90ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlLW1kcGkvYXBwX3Bob25lLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS9hcHBfcGhvbmUucG5nCnJlbmFtZSB0byB0ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlLW1kcGkvYXBwX3Bob25lLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlL2ljX3N0YXR1c2Jhcl9jaGF0LnBuZyBiL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtbWRwaS9pY19zdGF0dXNiYXJfY2hhdC5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUvaWNfc3RhdHVzYmFyX2NoYXQucG5nCnJlbmFtZSB0byB0ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlLW1kcGkvaWNfc3RhdHVzYmFyX2NoYXQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUvaWNfc3RhdHVzYmFyX2VtYWlsLnBuZyBiL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtbWRwaS9pY19zdGF0dXNiYXJfZW1haWwucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlL2ljX3N0YXR1c2Jhcl9lbWFpbC5wbmcKcmVuYW1lIHRvIHRlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtbWRwaS9pY19zdGF0dXNiYXJfZW1haWwucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUvaWNfc3RhdHVzYmFyX21pc3NlZGNhbGwucG5nIGIvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N0YXR1c2Jhcl9taXNzZWRjYWxsLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS9pY19zdGF0dXNiYXJfbWlzc2VkY2FsbC5wbmcKcmVuYW1lIHRvIHRlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtbWRwaS9pY19zdGF0dXNiYXJfbWlzc2VkY2FsbC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS9pY29uMS5wbmcgYi90ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlLW1kcGkvaWNvbjEucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlL2ljb24xLnBuZwpyZW5hbWUgdG8gdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1tZHBpL2ljb24xLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlL2ljb24yLnBuZyBiL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtbWRwaS9pY29uMi5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUvaWNvbjIucG5nCnJlbmFtZSB0byB0ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlLW1kcGkvaWNvbjIucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUvaWNvbjMucG5nIGIvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1tZHBpL2ljb24zLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS9pY29uMy5wbmcKcmVuYW1lIHRvIHRlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtbWRwaS9pY29uMy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS9pY29uNC5wbmcgYi90ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlLW1kcGkvaWNvbjQucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlL2ljb240LnBuZwpyZW5hbWUgdG8gdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1tZHBpL2ljb240LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9TdGF0dXNCYXIvc3JjL2NvbS9hbmRyb2lkL3N0YXR1c2JhcnRlc3QvTm90aWZpY2F0aW9uVGVzdExpc3QuamF2YSBiL3Rlc3RzL1N0YXR1c0Jhci9zcmMvY29tL2FuZHJvaWQvc3RhdHVzYmFydGVzdC9Ob3RpZmljYXRpb25UZXN0TGlzdC5qYXZhCmluZGV4IDM3OTc2ZWUuLjE2YjMwMDEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL1N0YXR1c0Jhci9zcmMvY29tL2FuZHJvaWQvc3RhdHVzYmFydGVzdC9Ob3RpZmljYXRpb25UZXN0TGlzdC5qYXZhCisrKyBiL3Rlc3RzL1N0YXR1c0Jhci9zcmMvY29tL2FuZHJvaWQvc3RhdHVzYmFydGVzdC9Ob3RpZmljYXRpb25UZXN0TGlzdC5qYXZhCkBAIC02MzMsMjAgKzYzMyw2IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0sCiAKLSAgICAgICAgbmV3IFRlc3QoIlRpY2tlciIpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICBOb3RpZmljYXRpb24gbm90ID0gbmV3IE5vdGlmaWNhdGlvbigKLSAgICAgICAgICAgICAgICAgICAgUi5kcmF3YWJsZS5hcHBfZ21haWwsIAotICAgICAgICAgICAgICAgICAgICAiTmV3IG1haWwgZnJvbSBqb2VvQGV4YW1wbGUuY29tLCBvbiB0aGUgdG9waWMgb2YgdmVyeSBsb25nIHRpY2tlciB0ZXh0cyIsCi0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKLSAgICAgICAgICAgICAgICBub3Quc2V0TGF0ZXN0RXZlbnRJbmZvKE5vdGlmaWNhdGlvblRlc3RMaXN0LnRoaXMsCi0gICAgICAgICAgICAgICAgICAgICJBIG5ldyBtZXNzYWdlIGF3YWl0cyIsCi0gICAgICAgICAgICAgICAgICAgICJUaGUgY29udGVudHMgYXJlIHZlcnkgaW50ZXJlc3RpbmcgYW5kIGltcG9ydGFudCIsCi0gICAgICAgICAgICAgICAgICAgIG1ha2VJbnRlbnQoKSk7Ci0gICAgICAgICAgICAgICAgbU5NLm5vdGlmeSgxLCBub3QpOwotICAgICAgICAgICAgfQotICAgICAgICB9LAotCiAgICAgICAgIG5ldyBUZXN0KCJDcmFzaCIpIHsKICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpCiAgICAgICAgICAgICB7CmRpZmYgLS1naXQgYS90b29scy9hYXB0L0NvbW1hbmQuY3BwIGIvdG9vbHMvYWFwdC9Db21tYW5kLmNwcAppbmRleCAzNTEyNGFhLi5hYmNjZjliIDEwMDY0NAotLS0gYS90b29scy9hYXB0L0NvbW1hbmQuY3BwCisrKyBiL3Rvb2xzL2FhcHQvQ29tbWFuZC5jcHAKQEAgLTE5Nyw4ICsxOTcsMTAgQEAKICAgICAgICAgaWYgKCZyZXMgPT0gTlVMTCkgewogICAgICAgICAgICAgcHJpbnRmKCJcbk5vIHJlc291cmNlIHRhYmxlIGZvdW5kLlxuIik7CiAgICAgICAgIH0gZWxzZSB7CisjaWZuZGVmIEhBVkVfQU5EUk9JRF9PUwogICAgICAgICAgICAgcHJpbnRmKCJcblJlc291cmNlIHRhYmxlOlxuIik7CiAgICAgICAgICAgICByZXMucHJpbnQoZmFsc2UpOworI2VuZGlmCiAgICAgICAgIH0KIAogICAgICAgICBBc3NldCogbWFuaWZlc3RBc3NldCA9IGFzc2V0cy5vcGVuTm9uQXNzZXQoIkFuZHJvaWRNYW5pZmVzdC54bWwiLApAQCAtMzg5LDggKzM5MSw5IEBACiAgICAgfQogCiAgICAgaWYgKHN0cmNtcCgicmVzb3VyY2VzIiwgb3B0aW9uKSA9PSAwKSB7CisjaWZuZGVmIEhBVkVfQU5EUk9JRF9PUwogICAgICAgICByZXMucHJpbnQoYnVuZGxlLT5nZXRWYWx1ZXMoKSk7Ci0KKyNlbmRpZgogICAgIH0gZWxzZSBpZiAoc3RyY21wKCJ4bWx0cmVlIiwgb3B0aW9uKSA9PSAwKSB7CiAgICAgICAgIGlmIChidW5kbGUtPmdldEZpbGVTcGVjQ291bnQoKSA8IDMpIHsKICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRVJST1I6IG5vIGR1bXAgeG1sdHJlZSByZXNvdXJjZSBmaWxlIHNwZWNpZmllZFxuIik7CmRpZmYgLS1naXQgYS90b29scy9hYXB0L1BhY2thZ2UuY3BwIGIvdG9vbHMvYWFwdC9QYWNrYWdlLmNwcAppbmRleCA5OTlhNWNmLi4zY2I2MTRmIDEwMDY0NAotLS0gYS90b29scy9hYXB0L1BhY2thZ2UuY3BwCisrKyBiL3Rvb2xzL2FhcHQvUGFja2FnZS5jcHAKQEAgLTQ0MSw3ICs0NDEsNyBAQAogCiBzc2l6ZV90IHByb2Nlc3NKYXJGaWxlcyhCdW5kbGUqIGJ1bmRsZSwgWmlwRmlsZSogemlwKQogewotICAgIHNzaXplX3QgZXJyOworICAgIHN0YXR1c190IGVycjsKICAgICBzc2l6ZV90IGNvdW50ID0gMDsKICAgICBjb25zdCBhbmRyb2lkOjpWZWN0b3I8Y29uc3QgY2hhcio+JiBqYXJzID0gYnVuZGxlLT5nZXRKYXJGaWxlcygpOwogCmRpZmYgLS1naXQgYS90b29scy9hYXB0L1Jlc291cmNlLmNwcCBiL3Rvb2xzL2FhcHQvUmVzb3VyY2UuY3BwCmluZGV4IGJkODRlMjMuLjQ5OGIxOTMgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2FhcHQvUmVzb3VyY2UuY3BwCisrKyBiL3Rvb2xzL2FhcHQvUmVzb3VyY2UuY3BwCkBAIC01NDIsMTEgKzU0MiwxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdEtleWVkVmVjdG9yPEFhcHRHcm91cEVudHJ5LCBzcDxBYXB0RmlsZT4gPiBiYXNlRmlsZXMgPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlR3JvdXAtPmdldEZpbGVzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpPTA7IGkgPCBiYXNlRmlsZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoImJhc2VGaWxlICVsZCBoYXMgZmxhdm9yICVzXG4iLCBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiYmFzZUZpbGUgJWQgaGFzIGZsYXZvciAlc1xuIiwgaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VGaWxlcy5rZXlBdChpKS50b1N0cmluZygpLnN0cmluZygpKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGk9MDsgaSA8IG92ZXJsYXlGaWxlcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50Zigib3ZlcmxheUZpbGUgJWxkIGhhcyBmbGF2b3IgJXNcbiIsIGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJvdmVybGF5RmlsZSAlZCBoYXMgZmxhdm9yICVzXG4iLCBpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmxheUZpbGVzLmtleUF0KGkpLnRvU3RyaW5nKCkuc3RyaW5nKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CkBAIC01NjAsNyArNTYwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5QXQob3ZlcmxheUdyb3VwSW5kZXgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGJhc2VGaWxlSW5kZXggPCBVTktOT1dOX0VSUk9SKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ1bmRsZS0+Z2V0VmVyYm9zZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiZm91bmQgYSBtYXRjaCAoJWxkKSBmb3Igb3ZlcmxheSBmaWxlICVzLCBmb3IgZmxhdm9yICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoImZvdW5kIGEgbWF0Y2ggKCVkKSBmb3Igb3ZlcmxheSBmaWxlICVzLCBmb3IgZmxhdm9yICVzXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VGaWxlSW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmxheUdyb3VwLT5nZXRMZWFmKCkuc3RyaW5nKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmxheUZpbGVzLmtleUF0KG92ZXJsYXlHcm91cEluZGV4KS50b1N0cmluZygpLnN0cmluZygpKTsKQEAgLTIwNzQsMTIgKzIwNzQsMTMgQEAKICAgICAvLyB0YWc6YXR0cmlidXRlIHBhaXJzIHRoYXQgc2hvdWxkIGJlIGNoZWNrZWQgaW4gbGF5b3V0IGZpbGVzLgogICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIE5hbWVzcGFjZUF0dHJpYnV0ZVBhaXI+IGtMYXlvdXRUYWdBdHRyUGFpcnM7CiAgICAgYWRkVGFnQXR0clBhaXIoJmtMYXlvdXRUYWdBdHRyUGFpcnMsICJ2aWV3IiwgTlVMTCwgImNsYXNzIik7CisgICAgYWRkVGFnQXR0clBhaXIoJmtMYXlvdXRUYWdBdHRyUGFpcnMsICJmcmFnbWVudCIsIE5VTEwsICJjbGFzcyIpOwogICAgIGFkZFRhZ0F0dHJQYWlyKCZrTGF5b3V0VGFnQXR0clBhaXJzLCAiZnJhZ21lbnQiLCBSRVNPVVJDRVNfQU5EUk9JRF9OQU1FU1BBQ0UsICJuYW1lIik7CiAKICAgICAvLyB0YWc6YXR0cmlidXRlIHBhaXJzIHRoYXQgc2hvdWxkIGJlIGNoZWNrZWQgaW4geG1sIGZpbGVzLgogICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIE5hbWVzcGFjZUF0dHJpYnV0ZVBhaXI+IGtYbWxUYWdBdHRyUGFpcnM7CiAgICAgYWRkVGFnQXR0clBhaXIoJmtYbWxUYWdBdHRyUGFpcnMsICJQcmVmZXJlbmNlU2NyZWVuIiwgUkVTT1VSQ0VTX0FORFJPSURfTkFNRVNQQUNFLCAiZnJhZ21lbnQiKTsKLSAgICBhZGRUYWdBdHRyUGFpcigma1htbFRhZ0F0dHJQYWlycywgIkhlYWRlciIsIFJFU09VUkNFU19BTkRST0lEX05BTUVTUEFDRSwgImZyYWdtZW50Iik7CisgICAgYWRkVGFnQXR0clBhaXIoJmtYbWxUYWdBdHRyUGFpcnMsICJoZWFkZXIiLCBSRVNPVVJDRVNfQU5EUk9JRF9OQU1FU1BBQ0UsICJmcmFnbWVudCIpOwogCiAgICAgY29uc3QgVmVjdG9yPHNwPEFhcHREaXI+ID4mIGRpcnMgPSBhc3NldHMtPnJlc0RpcnMoKTsKICAgICBjb25zdCBzaXplX3QgSyA9IGRpcnMuc2l6ZSgpOwpkaWZmIC0tZ2l0IGEvdG9vbHMvYWFwdC9SZXNvdXJjZVRhYmxlLmNwcCBiL3Rvb2xzL2FhcHQvUmVzb3VyY2VUYWJsZS5jcHAKaW5kZXggNzU1YjkzYi4uZjQwYTg3NyAxMDA2NDQKLS0tIGEvdG9vbHMvYWFwdC9SZXNvdXJjZVRhYmxlLmNwcAorKysgYi90b29scy9hYXB0L1Jlc291cmNlVGFibGUuY3BwCkBAIC0yMzY2LDcgKzIzNjYsNyBAQAogICAgICAgICBpZiAoY29uZmlnU2V0LmNvdW50KGRlZmF1bHRMb2NhbGUpID09IDApIHsKICAgICAgICAgICAgIGZwcmludGYoc3Rkb3V0LCAiYWFwdDogd2FybmluZzogc3RyaW5nICclcycgaGFzIG5vIGRlZmF1bHQgdHJhbnNsYXRpb24gaW4gJXM7IGZvdW5kOiIsCiAgICAgICAgICAgICAgICAgICAgIFN0cmluZzgobmFtZUl0ZXItPmZpcnN0KS5zdHJpbmcoKSwgbUJ1bmRsZS0+Z2V0UmVzb3VyY2VTb3VyY2VEaXJzKClbMF0pOwotICAgICAgICAgICAgZm9yIChzZXQ8U3RyaW5nOD46Oml0ZXJhdG9yIGxvY2FsZXMgPSBjb25maWdTZXQuYmVnaW4oKTsKKyAgICAgICAgICAgIGZvciAoc2V0PFN0cmluZzg+Ojpjb25zdF9pdGVyYXRvciBsb2NhbGVzID0gY29uZmlnU2V0LmJlZ2luKCk7CiAgICAgICAgICAgICAgICAgIGxvY2FsZXMgIT0gY29uZmlnU2V0LmVuZCgpOwogICAgICAgICAgICAgICAgICBsb2NhbGVzKyspIHsKICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZG91dCwgIiAlcyIsICgqbG9jYWxlcykuc3RyaW5nKCkpOwpkaWZmIC0tZ2l0IGEvdG9vbHMvYWFwdC9TdHJpbmdQb29sLmNwcCBiL3Rvb2xzL2FhcHQvU3RyaW5nUG9vbC5jcHAKaW5kZXggYTA5Y2VjMC4uZTI4YmRmZiAxMDA2NDQKLS0tIGEvdG9vbHMvYWFwdC9TdHJpbmdQb29sLmNwcAorKysgYi90b29scy9hYXB0L1N0cmluZ1Bvb2wuY3BwCkBAIC0zMCw3ICszMCw3IEBACiAgICAgICAgICAgICBzdHIgPSBTdHJpbmc4KHBvb2wtPnN0cmluZ0F0KHMsICZsZW4pKS5zdHJpbmcoKTsKICAgICAgICAgfQogCi0gICAgICAgIHByaW50ZigiU3RyaW5nICMlbGQ6ICVzXG4iLCBzLCBzdHIpOworICAgICAgICBwcmludGYoIlN0cmluZyAjJWQ6ICVzXG4iLCBzLCBzdHIpOwogICAgIH0KIH0KIApkaWZmIC0tZ2l0IGEvdG9vbHMvYWFwdC9YTUxOb2RlLmNwcCBiL3Rvb2xzL2FhcHQvWE1MTm9kZS5jcHAKaW5kZXggODU1MWIwZi4uY2VlODU0NiAxMDA2NDQKLS0tIGEvdG9vbHMvYWFwdC9YTUxOb2RlLmNwcAorKysgYi90b29scy9hYXB0L1hNTE5vZGUuY3BwCkBAIC0yMDMsOSArMjAzLDEzIEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKHhsaWZmRGVwdGggPT0gMCAmJiBwc2V1ZG9sb2NhbGl6ZSkgeworI2lmZGVmIEVOQUJMRV9QU0VVRE9MT0NBTElaRQogICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG9yaWcoU3RyaW5nOCh0ZXh0KS5zdHJpbmcoKSk7CiAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHNldWRvID0gcHNldWRvbG9jYWxpemVfc3RyaW5nKG9yaWcpOwogICAgICAgICAgICAgICAgIGN1clN0cmluZy5hcHBlbmQoU3RyaW5nMTYoU3RyaW5nOChwc2V1ZG8uY19zdHIoKSkpKTsKKyNlbHNlCisgICAgICAgICAgICAgICAgYXNzZXJ0KGZhbHNlKTsKKyNlbmRpZgogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBpZiAoaXNGb3JtYXR0ZWQgJiYgaGFzU3Vic3RpdHV0aW9uRXJyb3JzKGZpbGVOYW1lLCBpblhtbCwgdGV4dCkgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CmRpZmYgLS1naXQgYS90b29scy9hYXB0L1ppcEZpbGUuaCBiL3Rvb2xzL2FhcHQvWmlwRmlsZS5oCmluZGV4IGRiYmQwNzIuLjc4Nzc1NTAgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2FhcHQvWmlwRmlsZS5oCisrKyBiL3Rvb2xzL2FhcHQvWmlwRmlsZS5oCkBAIC01Nyw3ICs1Nyw3IEBACiAgICAgLyoKICAgICAgKiBPcGVuIGEgbmV3IG9yIGV4aXN0aW5nIGFyY2hpdmUuCiAgICAgICovCi0gICAgdHlwZWRlZiBlbnVtIHsKKyAgICBlbnVtIHsKICAgICAgICAga09wZW5SZWFkT25seSAgID0gMHgwMSwKICAgICAgICAga09wZW5SZWFkV3JpdGUgID0gMHgwMiwKICAgICAgICAga09wZW5DcmVhdGUgICAgID0gMHgwNCwgICAgIC8vIGNyZWF0ZSBpZiBpdCBkb2Vzbid0IGV4aXN0CmRpZmYgLS1naXQgYS90b29scy9sYXlvdXRsaWIvUkVBRE1FIGIvdG9vbHMvbGF5b3V0bGliL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZmVhOWJkCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvbGF5b3V0bGliL1JFQURNRQpAQCAtMCwwICsxLDQgQEAKK0xheW91dGxpYiBpcyBhIGN1c3RvbSB2ZXJzaW9uIG9mIHRoZSBhbmRyb2lkIFZpZXcgZnJhbWV3b3JrIGRlc2lnbmVkIHRvIHJ1biBpbnNpZGUgRWNsaXBzZS4KK1RoZSBnb2FsIG9mIHRoZSBsaWJyYXJ5IGlzIHRvIHByb3ZpZGUgbGF5b3V0IHJlbmRlcmluZyBpbiBFY2xpcHNlIHRoYXQgYXJlIHZlcnkgdmVyeSBjbG9zZSB0byB0aGVpciByZW5kZXJpbmcgb24gZGV2aWNlcy4KKworTm9uZSBvZiB0aGUgY29tLmFuZHJvaWQuKiBvciBhbmRyb2lkLiogY2xhc3NlcyBpbiBsYXlvdXRsaWIgcnVuIG9uIGRldmljZXMuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdG9vbHMvbGF5b3V0bGliL2JyaWRnZS9zcmMvYW5kcm9pZC9ncmFwaGljcy9DYW52YXMuamF2YSBiL3Rvb2xzL2xheW91dGxpYi9icmlkZ2Uvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvQ2FudmFzLmphdmEKaW5kZXggZDVkMzE1ZS4uMWUxYWJhOSAxMDA2NDQKLS0tIGEvdG9vbHMvbGF5b3V0bGliL2JyaWRnZS9zcmMvYW5kcm9pZC9ncmFwaGljcy9DYW52YXMuamF2YQorKysgYi90b29scy9sYXlvdXRsaWIvYnJpZGdlL3NyYy9hbmRyb2lkL2dyYXBoaWNzL0NhbnZhcy5qYXZhCkBAIC02OSwxMSArNjksNiBAQAogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIkNhbid0IGNyZWF0ZSBDYW52YXMoaW50KSIpOwogICAgIH0KIAotICAgIHB1YmxpYyBDYW52YXMoamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXMuR0wgZ2wpIHsKLSAgICAgICAgbUxvZ2dlciA9IG51bGw7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiQ2FuJ3QgY3JlYXRlIENhbnZhcyhqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5vcGVuZ2xlcy5HTCkiKTsKLSAgICB9Ci0KICAgICAvLyBjdXN0b20gY29uc3RydWN0b3JzIGZvciBvdXIgdXNlLgogICAgIHB1YmxpYyBDYW52YXMoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBJTGF5b3V0TG9nIGxvZ2dlcikgewogICAgICAgICBtTG9nZ2VyID0gbG9nZ2VyOwpAQCAtMTE3NCwxNSArMTE2OSw2IEBACiAgICAgfQogCiAgICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgYW5kcm9pZC5ncmFwaGljcy5DYW52YXMjZ2V0R0woKQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBHTCBnZXRHTCgpIHsKLSAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgICAgICByZXR1cm4gc3VwZXIuZ2V0R0woKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCiAgICAgICogQHNlZSBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhcyNnZXRNYXRyaXgoKQogICAgICAqLwogICAgIEBPdmVycmlkZQpAQCAtMTI1NywxNSArMTI0Myw2IEBACiAgICAgfQogCiAgICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgYW5kcm9pZC5ncmFwaGljcy5DYW52YXMjc2V0Vmlld3BvcnQoaW50LCBpbnQpCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0Vmlld3BvcnQoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0gICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICAgICAgc3VwZXIuc2V0Vmlld3BvcnQod2lkdGgsIGhlaWdodCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQogICAgICAqIEBzZWUgYW5kcm9pZC5ncmFwaGljcy5DYW52YXMjc2tldyhmbG9hdCwgZmxvYXQpCiAgICAgICovCiAgICAgQE92ZXJyaWRlCmRpZmYgLS1naXQgYS90b29scy9sYXlvdXRsaWIvYnJpZGdlL3NyYy9jb20vYW5kcm9pZC9sYXlvdXRsaWIvYnJpZGdlL0JyaWRnZUNvbnRleHQuamF2YSBiL3Rvb2xzL2xheW91dGxpYi9icmlkZ2Uvc3JjL2NvbS9hbmRyb2lkL2xheW91dGxpYi9icmlkZ2UvQnJpZGdlQ29udGV4dC5qYXZhCmluZGV4IDc0NGJmYmUuLjU4YjFiNmMgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2xheW91dGxpYi9icmlkZ2Uvc3JjL2NvbS9hbmRyb2lkL2xheW91dGxpYi9icmlkZ2UvQnJpZGdlQ29udGV4dC5qYXZhCisrKyBiL3Rvb2xzL2xheW91dGxpYi9icmlkZ2Uvc3JjL2NvbS9hbmRyb2lkL2xheW91dGxpYi9icmlkZ2UvQnJpZGdlQ29udGV4dC5qYXZhCkBAIC0zNyw2ICszNyw3IEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5UeXBlZEFycmF5OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzLlRoZW1lOworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuRGF0YWJhc2VFcnJvckhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2U7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2UuQ3Vyc29yRmFjdG9yeTsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKQEAgLTEwNTksNiArMTA2MCwxMyBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTUUxpdGVEYXRhYmFzZSBvcGVuT3JDcmVhdGVEYXRhYmFzZShTdHJpbmcgYXJnMCwgaW50IGFyZzEsCisgICAgICAgICAgICBDdXJzb3JGYWN0b3J5IGFyZzIsIERhdGFiYXNlRXJyb3JIYW5kbGVyIGFyZzMpIHsKKyAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgRHJhd2FibGUgcGVla1dhbGxwYXBlcigpIHsKICAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgogICAgICAgICByZXR1cm4gbnVsbDsKZGlmZiAtLWdpdCBhL3dpZmkvamF2YS9hbmRyb2lkL25ldC93aWZpL0lXaWZpTWFuYWdlci5haWRsIGIvd2lmaS9qYXZhL2FuZHJvaWQvbmV0L3dpZmkvSVdpZmlNYW5hZ2VyLmFpZGwKaW5kZXggNmUwYmM5ZC4uMTkxM2ZhMCAxMDA2NDQKLS0tIGEvd2lmaS9qYXZhL2FuZHJvaWQvbmV0L3dpZmkvSVdpZmlNYW5hZ2VyLmFpZGwKKysrIGIvd2lmaS9qYXZhL2FuZHJvaWQvbmV0L3dpZmkvSVdpZmlNYW5hZ2VyLmFpZGwKQEAgLTQwLDE1ICs0MCwxNSBAQAogCiAgICAgYm9vbGVhbiBwaW5nU3VwcGxpY2FudCgpOwogCi0gICAgYm9vbGVhbiBzdGFydFNjYW4oYm9vbGVhbiBmb3JjZUFjdGl2ZSk7CisgICAgdm9pZCBzdGFydFNjYW4oYm9vbGVhbiBmb3JjZUFjdGl2ZSk7CiAKICAgICBMaXN0PFNjYW5SZXN1bHQ+IGdldFNjYW5SZXN1bHRzKCk7CiAKLSAgICBib29sZWFuIGRpc2Nvbm5lY3QoKTsKKyAgICB2b2lkIGRpc2Nvbm5lY3QoKTsKIAotICAgIGJvb2xlYW4gcmVjb25uZWN0KCk7CisgICAgdm9pZCByZWNvbm5lY3QoKTsKIAotICAgIGJvb2xlYW4gcmVhc3NvY2lhdGUoKTsKKyAgICB2b2lkIHJlYXNzb2NpYXRlKCk7CiAKICAgICBXaWZpSW5mbyBnZXRDb25uZWN0aW9uSW5mbygpOwogCkBAIC04NSw1ICs4NSwyMSBAQAogICAgIFdpZmlDb25maWd1cmF0aW9uIGdldFdpZmlBcENvbmZpZ3VyYXRpb24oKTsKIAogICAgIHZvaWQgc2V0V2lmaUFwQ29uZmlndXJhdGlvbihpbiBXaWZpQ29uZmlndXJhdGlvbiB3aWZpQ29uZmlnKTsKKworICAgIHZvaWQgc3RhcnRXaWZpKCk7CisKKyAgICB2b2lkIHN0b3BXaWZpKCk7CisKKyAgICB2b2lkIGFkZFRvQmxhY2tsaXN0KFN0cmluZyBic3NpZCk7CisKKyAgICB2b2lkIGNsZWFyQmxhY2tsaXN0KCk7CisKKyAgICB2b2lkIGNvbm5lY3ROZXR3b3JrV2l0aENvbmZpZyhpbiBXaWZpQ29uZmlndXJhdGlvbiB3aWZpQ29uZmlnKTsKKworICAgIHZvaWQgY29ubmVjdE5ldHdvcmtXaXRoSWQoaW50IG5ldHdvcmtJZCk7CisKKyAgICB2b2lkIHNhdmVOZXR3b3JrKGluIFdpZmlDb25maWd1cmF0aW9uIHdpZmlDb25maWcpOworCisgICAgdm9pZCBmb3JnZXROZXR3b3JrKGludCBuZXR3b3JrSWQpOwogfQogCmRpZmYgLS1naXQgYS93aWZpL2phdmEvYW5kcm9pZC9uZXQvd2lmaS9XaWZpQ29uZmlndXJhdGlvbi5qYXZhIGIvd2lmaS9qYXZhL2FuZHJvaWQvbmV0L3dpZmkvV2lmaUNvbmZpZ3VyYXRpb24uamF2YQppbmRleCAwMWJjOTE5Li41NTliZTg1IDEwMDY0NAotLS0gYS93aWZpL2phdmEvYW5kcm9pZC9uZXQvd2lmaS9XaWZpQ29uZmlndXJhdGlvbi5qYXZhCisrKyBiL3dpZmkvamF2YS9hbmRyb2lkL25ldC93aWZpL1dpZmlDb25maWd1cmF0aW9uLmphdmEKQEAgLTQzMiw2ICs0MzIsMzggQEAKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIGNvcHkgb2YgdGhpcyBXaWZpQ29uZmlndXJhdGlvbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYSBjb3B5IG9mIHRoaXMgV2lmaUNvbmZpZ3VyYXRpb24uCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgV2lmaUNvbmZpZ3VyYXRpb24gY2xvbmUoKSB7CisgICAgICAgIFdpZmlDb25maWd1cmF0aW9uIGNvbmZpZyA9IG5ldyBXaWZpQ29uZmlndXJhdGlvbigpOworICAgICAgICBjb25maWcubmV0d29ya0lkID0gbmV0d29ya0lkOworICAgICAgICBjb25maWcuc3RhdHVzID0gc3RhdHVzOworICAgICAgICBjb25maWcuU1NJRCA9IFNTSUQ7CisgICAgICAgIGNvbmZpZy5CU1NJRCA9IEJTU0lEOworICAgICAgICBjb25maWcucHJlU2hhcmVkS2V5ID0gcHJlU2hhcmVkS2V5OworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgd2VwS2V5cy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgIGNvbmZpZy53ZXBLZXlzW2ldID0gd2VwS2V5c1tpXTsKKworICAgICAgICBjb25maWcud2VwVHhLZXlJbmRleCA9IHdlcFR4S2V5SW5kZXg7CisgICAgICAgIGNvbmZpZy5wcmlvcml0eSA9IHByaW9yaXR5OworICAgICAgICBjb25maWcuaGlkZGVuU1NJRCA9IGhpZGRlblNTSUQ7CisgICAgICAgIGNvbmZpZy5hbGxvd2VkS2V5TWFuYWdlbWVudCAgID0gKEJpdFNldCkgYWxsb3dlZEtleU1hbmFnZW1lbnQuY2xvbmUoKTsKKyAgICAgICAgY29uZmlnLmFsbG93ZWRQcm90b2NvbHMgICAgICAgPSAoQml0U2V0KSBhbGxvd2VkUHJvdG9jb2xzLmNsb25lKCk7CisgICAgICAgIGNvbmZpZy5hbGxvd2VkQXV0aEFsZ29yaXRobXMgID0gKEJpdFNldCkgYWxsb3dlZEF1dGhBbGdvcml0aG1zLmNsb25lKCk7CisgICAgICAgIGNvbmZpZy5hbGxvd2VkUGFpcndpc2VDaXBoZXJzID0gKEJpdFNldCkgYWxsb3dlZFBhaXJ3aXNlQ2lwaGVycy5jbG9uZSgpOworICAgICAgICBjb25maWcuYWxsb3dlZEdyb3VwQ2lwaGVycyAgICA9IChCaXRTZXQpIGFsbG93ZWRHcm91cENpcGhlcnMuY2xvbmUoKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVudGVycHJpc2VGaWVsZHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGNvbmZpZy5lbnRlcnByaXNlRmllbGRzW2ldLnNldFZhbHVlKGVudGVycHJpc2VGaWVsZHNbaV0udmFsdWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNvbmZpZzsKKyAgICB9CisKICAgICAvKiogSW1wbGVtZW50IHRoZSBQYXJjZWxhYmxlIGludGVyZmFjZSB7QGhpZGV9ICovCiAgICAgcHVibGljIHZvaWQgd3JpdGVUb1BhcmNlbChQYXJjZWwgZGVzdCwgaW50IGZsYWdzKSB7CiAgICAgICAgIGRlc3Qud3JpdGVJbnQobmV0d29ya0lkKTsKZGlmZiAtLWdpdCBhL3dpZmkvamF2YS9hbmRyb2lkL25ldC93aWZpL1dpZmlNYW5hZ2VyLmphdmEgYi93aWZpL2phdmEvYW5kcm9pZC9uZXQvd2lmaS9XaWZpTWFuYWdlci5qYXZhCmluZGV4IDlkMjE1MjEuLjIxNjcxZjEgMTAwNjQ0Ci0tLSBhL3dpZmkvamF2YS9hbmRyb2lkL25ldC93aWZpL1dpZmlNYW5hZ2VyLmphdmEKKysrIGIvd2lmaS9qYXZhL2FuZHJvaWQvbmV0L3dpZmkvV2lmaU1hbmFnZXIuamF2YQpAQCAtMTY1LDcgKzE2NSw3IEBACiAgICAgICoKICAgICAgKiBAaGlkZQogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdJRklfQVBfU1RBVEVfRElTQUJMSU5HID0gMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXSUZJX0FQX1NUQVRFX0RJU0FCTElORyA9IDEwOwogICAgIC8qKgogICAgICAqIFdpLUZpIEFQIGlzIGRpc2FibGVkLgogICAgICAqCkBAIC0xNzQsNyArMTc0LDcgQEAKICAgICAgKgogICAgICAqIEBoaWRlCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0lGSV9BUF9TVEFURV9ESVNBQkxFRCA9IDE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0lGSV9BUF9TVEFURV9ESVNBQkxFRCA9IDExOwogICAgIC8qKgogICAgICAqIFdpLUZpIEFQIGlzIGN1cnJlbnRseSBiZWluZyBlbmFibGVkLiBUaGUgc3RhdGUgd2lsbCBjaGFuZ2UgdG8KICAgICAgKiB7QGxpbmsgI1dJRklfQVBfU1RBVEVfRU5BQkxFRH0gaWYgaXQgZmluaXNoZXMgc3VjY2Vzc2Z1bGx5LgpAQCAtMTg0LDcgKzE4NCw3IEBACiAgICAgICoKICAgICAgKiBAaGlkZQogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdJRklfQVBfU1RBVEVfRU5BQkxJTkcgPSAyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdJRklfQVBfU1RBVEVfRU5BQkxJTkcgPSAxMjsKICAgICAvKioKICAgICAgKiBXaS1GaSBBUCBpcyBlbmFibGVkLgogICAgICAqCkBAIC0xOTMsNyArMTkzLDcgQEAKICAgICAgKgogICAgICAqIEBoaWRlCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0lGSV9BUF9TVEFURV9FTkFCTEVEID0gMzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXSUZJX0FQX1NUQVRFX0VOQUJMRUQgPSAxMzsKICAgICAvKioKICAgICAgKiBXaS1GaSBBUCBpcyBpbiBhIGZhaWxlZCBzdGF0ZS4gVGhpcyBzdGF0ZSB3aWxsIG9jY3VyIHdoZW4gYW4gZXJyb3Igb2NjdXJzIGR1cmluZwogICAgICAqIGVuYWJsaW5nIG9yIGRpc2FibGluZwpAQCAtMjAzLDcgKzIwMyw3IEBACiAgICAgICoKICAgICAgKiBAaGlkZQogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdJRklfQVBfU1RBVEVfRkFJTEVEID0gNDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXSUZJX0FQX1NUQVRFX0ZBSUxFRCA9IDE0OwogCiAgICAgLyoqCiAgICAgICogQnJvYWRjYXN0IGludGVudCBhY3Rpb24gaW5kaWNhdGluZyB0aGF0IGEgY29ubmVjdGlvbiB0byB0aGUgc3VwcGxpY2FudCBoYXMKQEAgLTI3NCw3ICsyNzQsMTQgQEAKICAgICAgKiBAc2VlICNFUlJPUl9BVVRIRU5USUNBVElORwogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX1NVUFBMSUNBTlRfRVJST1IgPSAic3VwcGxpY2FudEVycm9yIjsKLQorICAgIC8qKgorICAgICAqIEJyb2FkY2FzdCBpbnRlbnQgYWN0aW9uIGluZGljYXRpbmcgdGhhdCB0aGUgc3VwcGxpY2FudCBjb25maWd1cmF0aW9uIGNoYW5nZWQuCisgICAgICogVGhpcyBjYW4gYmUgYXMgYSByZXN1bHQgb2YgYWRkaW5nL3VwZGF0aW5nL2RlbGV0aW5nIGEgbmV0d29yaworICAgICAqIEBoaWRlCisgICAgICovCisgICAgQFNka0NvbnN0YW50KFNka0NvbnN0YW50VHlwZS5CUk9BRENBU1RfSU5URU5UX0FDVElPTikKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVVBQTElDQU5UX0NPTkZJR19DSEFOR0VEX0FDVElPTiA9CisgICAgICAgICJhbmRyb2lkLm5ldC53aWZpLnN1cHBsaWNhbnQuQ09ORklHX0NIQU5HRSI7CiAgICAgLyoqCiAgICAgICogQW4gYWNjZXNzIHBvaW50IHNjYW4gaGFzIGNvbXBsZXRlZCwgYW5kIHJlc3VsdHMgYXJlIGF2YWlsYWJsZSBmcm9tIHRoZSBzdXBwbGljYW50LgogICAgICAqIENhbGwge0BsaW5rICNnZXRTY2FuUmVzdWx0cygpfSB0byBvYnRhaW4gdGhlIHJlc3VsdHMuCkBAIC0yOTMsNiArMzAwLDIxIEBACiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfTkVXX1JTU0kgPSAibmV3UnNzaSI7CiAKICAgICAvKioKKyAgICAgKiBCcm9hZGNhc3QgaW50ZW50IGFjdGlvbiBpbmRpY2F0aW5nIHRoYXQgdGhlIElQIGNvbmZpZ3VyYXRpb24KKyAgICAgKiBjaGFuZ2VkIG9uIHdpZmkuCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBAU2RrQ29uc3RhbnQoU2RrQ29uc3RhbnRUeXBlLkJST0FEQ0FTVF9JTlRFTlRfQUNUSU9OKQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR19DSEFOR0VEX0FDVElPTiA9ICJhbmRyb2lkLm5ldC53aWZpLkNPTkZJR19DSEFOR0VEIjsKKyAgICAvKioKKyAgICAgKiBUaGUgbG9va3VwIGtleSBmb3IgYSB7QGxpbmsgYW5kcm9pZC5uZXQuTmV0d29ya1Byb3BlcnRpZXN9IG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlCisgICAgICogV2ktRmkgbmV0d29yay4gUmV0cmlldmUgd2l0aAorICAgICAqIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuSW50ZW50I2dldFBhcmNlbGFibGVFeHRyYShTdHJpbmcpfS4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX05FVFdPUktfUFJPUEVSVElFUyA9ICJuZXR3b3JrUHJvcGVydGllcyI7CisKKyAgICAvKioKICAgICAgKiBUaGUgbmV0d29yayBJRHMgb2YgdGhlIGNvbmZpZ3VyZWQgbmV0d29ya3MgY291bGQgaGF2ZSBjaGFuZ2VkLgogICAgICAqLwogICAgIEBTZGtDb25zdGFudChTZGtDb25zdGFudFR5cGUuQlJPQURDQVNUX0lOVEVOVF9BQ1RJT04pCkBAIC0zMDcsMTYgKzMyOSw2IEBACiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX1BJQ0tfV0lGSV9ORVRXT1JLID0gImFuZHJvaWQubmV0LndpZmkuUElDS19XSUZJX05FVFdPUksiOwogCiAgICAgLyoqCi0gICAgICogSW4gdGhpcyBXaS1GaSBsb2NrIG1vZGUsIFdpLUZpIHdpbGwgYmVoYXZlIGFzIGluIHRoZSBtb2RlCi0gICAgICoge0BsaW5rICNXSUZJX01PREVfRlVMTH0gYnV0IGl0IG9wZXJhdGVzIGF0IGhpZ2ggcGVyZm9ybWFuY2UKLSAgICAgKiBhdCB0aGUgZXhwZW5zZSBvZiBwb3dlci4gVGhpcyBtb2RlIHNob3VsZCBiZSB1c2VkCi0gICAgICogb25seSB3aGVuIHRoZSB3aWZpIGNvbm5lY3Rpb24gbmVlZHMgdG8gaGF2ZSBtaW5pbXVtIGxvc3MgYW5kIGxvdwotICAgICAqIGxhdGVuY3kgYXMgaXQgY2FuIGltcGFjdCB0aGUgYmF0dGVyeSBsaWZlLgotICAgICAqIEBoaWRlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0lGSV9NT0RFX0ZVTExfSElHSF9QRVJGID0gMzsKLQotICAgIC8qKgogICAgICAqIEluIHRoaXMgV2ktRmkgbG9jayBtb2RlLCBXaS1GaSB3aWxsIGJlIGtlcHQgYWN0aXZlLAogICAgICAqIGFuZCB3aWxsIGJlaGF2ZSBub3JtYWxseSwgaS5lLiwgaXQgd2lsbCBhdHRlbXB0IHRvIGF1dG9tYXRpY2FsbHkKICAgICAgKiBlc3RhYmxpc2ggYSBjb25uZWN0aW9uIHRvIGEgcmVtZW1iZXJlZCBhY2Nlc3MgcG9pbnQgdGhhdCBpcwpAQCAtNTEyLDcgKzUyNCw4IEBACiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gZGlzY29ubmVjdCgpIHsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBtU2VydmljZS5kaXNjb25uZWN0KCk7CisgICAgICAgICAgICBtU2VydmljZS5kaXNjb25uZWN0KCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQpAQCAtNTI2LDcgKzUzOSw4IEBACiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gcmVjb25uZWN0KCkgewogICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLnJlY29ubmVjdCgpOworICAgICAgICAgICAgbVNlcnZpY2UucmVjb25uZWN0KCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQpAQCAtNTQwLDcgKzU1NCw4IEBACiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gcmVhc3NvY2lhdGUoKSB7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gbVNlcnZpY2UucmVhc3NvY2lhdGUoKTsKKyAgICAgICAgICAgIG1TZXJ2aWNlLnJlYXNzb2NpYXRlKCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQpAQCAtNTY5LDcgKzU4NCw4IEBACiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gc3RhcnRTY2FuKCkgewogICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLnN0YXJ0U2NhbihmYWxzZSk7CisgICAgICAgICAgICBtU2VydmljZS5zdGFydFNjYW4oZmFsc2UpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KQEAgLTU4Nyw3ICs2MDMsOCBAQAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIHN0YXJ0U2NhbkFjdGl2ZSgpIHsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBtU2VydmljZS5zdGFydFNjYW4odHJ1ZSk7CisgICAgICAgICAgICBtU2VydmljZS5zdGFydFNjYW4odHJ1ZSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQpAQCAtNzUzLDggKzc3MCw5IEBACiAgICAgICAgIH0gZWxzZSBpZiAocnNzaSA+PSBNQVhfUlNTSSkgewogICAgICAgICAgICAgcmV0dXJuIG51bUxldmVscyAtIDE7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpbnQgcGFydGl0aW9uU2l6ZSA9IChNQVhfUlNTSSAtIE1JTl9SU1NJKSAvIChudW1MZXZlbHMgLSAxKTsKLSAgICAgICAgICAgIHJldHVybiAocnNzaSAtIE1JTl9SU1NJKSAvIHBhcnRpdGlvblNpemU7CisgICAgICAgICAgICBmbG9hdCBpbnB1dFJhbmdlID0gKE1BWF9SU1NJIC0gTUlOX1JTU0kpOworICAgICAgICAgICAgZmxvYXQgb3V0cHV0UmFuZ2UgPSAobnVtTGV2ZWxzIC0gMSk7CisgICAgICAgICAgICByZXR1cm4gKGludCkoKGZsb2F0KShyc3NpIC0gTUlOX1JTU0kpICogb3V0cHV0UmFuZ2UgLyBpbnB1dFJhbmdlKTsKICAgICAgICAgfQogICAgIH0KICAgICAKQEAgLTg0OCw2ICs4NjYsMTY2IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgIC8qKgorICAgICAqIFN0YXJ0IHRoZSBkcml2ZXIgYW5kIGNvbm5lY3QgdG8gbmV0d29yay4KKyAgICAgKgorICAgICAqIFRoaXMgZnVuY3Rpb24gd2lsbCBvdmVyLXJpZGUgV2lmaUxvY2sgYW5kIGRldmljZSBpZGxlIHN0YXR1cy4gRm9yIGV4YW1wbGUsCisgICAgICogZXZlbiBpZiB0aGUgZGV2aWNlIGlzIGlkbGUgb3IgdGhlcmUgaXMgb25seSBhIHNjYW4tb25seSBsb2NrIGhlbGQsCisgICAgICogYSBzdGFydCB3aWZpIHdvdWxkIG1lYW4gdGhhdCB3aWZpIGNvbm5lY3Rpb24gaXMga2VwdCBhY3RpdmUgdW50aWwKKyAgICAgKiBhIHN0b3BXaWZpKCkgaXMgc2VudC4KKyAgICAgKgorICAgICAqIFRoaXMgQVBJIGlzIHVzZWQgYnkgV2lmaVN0YXRlVHJhY2tlcgorICAgICAqCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcyBlbHNlIHtAY29kZSBmYWxzZX0KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHN0YXJ0V2lmaSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1TZXJ2aWNlLnN0YXJ0V2lmaSgpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEaXNjb25uZWN0IGZyb20gYSBuZXR3b3JrIChpZiBhbnkpIGFuZCBzdG9wIHRoZSBkcml2ZXIuCisgICAgICoKKyAgICAgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgb3Zlci1yaWRlIFdpZmlMb2NrIGFuZCBkZXZpY2UgaWRsZSBzdGF0dXMuIFdpLUZpCisgICAgICogc3RheXMgaW5hY3RpdmUgdW50aWwgYSBzdGFydFdpZmkoKSBpcyBpc3N1ZWQuCisgICAgICoKKyAgICAgKiBUaGlzIEFQSSBpcyB1c2VkIGJ5IFdpZmlTdGF0ZVRyYWNrZXIKKyAgICAgKgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMgZWxzZSB7QGNvZGUgZmFsc2V9CisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBzdG9wV2lmaSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1TZXJ2aWNlLnN0b3BXaWZpKCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhIGJzc2lkIHRvIHRoZSBzdXBwbGljYW50IGJsYWNrbGlzdAorICAgICAqCisgICAgICogVGhpcyBBUEkgaXMgdXNlZCBieSBXaWZpV2F0Y2hkb2dTZXJ2aWNlCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzIGVsc2Uge0Bjb2RlIGZhbHNlfQorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gYWRkVG9CbGFja2xpc3QoU3RyaW5nIGJzc2lkKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtU2VydmljZS5hZGRUb0JsYWNrbGlzdChic3NpZCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENsZWFyIHRoZSBzdXBwbGljYW50IGJsYWNrbGlzdAorICAgICAqCisgICAgICogVGhpcyBBUEkgaXMgdXNlZCBieSBXaWZpV2F0Y2hkb2dTZXJ2aWNlCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzIGVsc2Uge0Bjb2RlIGZhbHNlfQorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gY2xlYXJCbGFja2xpc3QoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtU2VydmljZS5jbGVhckJsYWNrbGlzdCgpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBUT0RPOiBkZXByZWNhdGUgc3luY2hyb25vdXMgQVBJIGFuZCBvcGVuIHVwIHRoZSBmb2xsb3dpbmcgQVBJICovCisgICAgLyoqCisgICAgICogQ29ubmVjdCB0byBhIG5ldHdvcmsgd2l0aCB0aGUgZ2l2ZW4gY29uZmlndXJhdGlvbi4gVGhlIG5ldHdvcmsgYWxzbworICAgICAqIGdldHMgYWRkZWQgdG8gdGhlIHN1cHBsaWNhbnQgY29uZmlndXJhdGlvbi4KKyAgICAgKgorICAgICAqIEZvciBhIG5ldyBuZXR3b3JrLCB0aGlzIGZ1bmN0aW9uIGlzIHVzZWQgaW5zdGVhZCBvZiBhCisgICAgICogc2VxdWVuY2Ugb2YgYWRkTmV0d29yaygpLCBlbmFibGVOZXR3b3JrKCksIHNhdmVDb25maWd1cmF0aW9uKCkgYW5kCisgICAgICogcmVjb25uZWN0KCkKKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25maWcgdGhlIHNldCBvZiB2YXJpYWJsZXMgdGhhdCBkZXNjcmliZSB0aGUgY29uZmlndXJhdGlvbiwKKyAgICAgKiAgICAgICAgICAgIGNvbnRhaW5lZCBpbiBhIHtAbGluayBXaWZpQ29uZmlndXJhdGlvbn0gb2JqZWN0LgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHZvaWQgY29ubmVjdE5ldHdvcmsoV2lmaUNvbmZpZ3VyYXRpb24gY29uZmlnKSB7CisgICAgICAgIGlmIChjb25maWcgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtU2VydmljZS5jb25uZWN0TmV0d29ya1dpdGhDb25maWcoY29uZmlnKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENvbm5lY3QgdG8gYSBuZXR3b3JrIHdpdGggdGhlIGdpdmVuIG5ldHdvcmtJZC4KKyAgICAgKgorICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBpbnN0ZWFkIG9mIGEgZW5hYmxlTmV0d29yaygpLCBzYXZlQ29uZmlndXJhdGlvbigpIGFuZAorICAgICAqIHJlY29ubmVjdCgpCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmV0d29ya0lkIHRoZSBuZXR3b3JrIGlkIGlkZW50aWZpeWluZyB0aGUgbmV0d29yayBpbiB0aGUKKyAgICAgKiAgICAgICAgICAgICAgICBzdXBwbGljYW50IGNvbmZpZ3VyYXRpb24gbGlzdAorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHZvaWQgY29ubmVjdE5ldHdvcmsoaW50IG5ldHdvcmtJZCkgeworICAgICAgICBpZiAobmV0d29ya0lkIDwgMCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtU2VydmljZS5jb25uZWN0TmV0d29ya1dpdGhJZChuZXR3b3JrSWQpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeyB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2F2ZSB0aGUgZ2l2ZW4gbmV0d29yayBpbiB0aGUgc3VwcGxpY2FudCBjb25maWcuIElmIHRoZSBuZXR3b3JrIGFscmVhZHkKKyAgICAgKiBleGlzdHMsIHRoZSBjb25maWd1cmF0aW9uIGlzIHVwZGF0ZWQuIEEgbmV3IG5ldHdvcmsgaXMgZW5hYmxlZAorICAgICAqIGJ5IGRlZmF1bHQuCisgICAgICoKKyAgICAgKiBGb3IgYSBuZXcgbmV0d29yaywgdGhpcyBmdW5jdGlvbiBpcyB1c2VkIGluc3RlYWQgb2YgYQorICAgICAqIHNlcXVlbmNlIG9mIGFkZE5ldHdvcmsoKSwgZW5hYmxlTmV0d29yaygpIGFuZCBzYXZlQ29uZmlndXJhdGlvbigpLgorICAgICAqCisgICAgICogRm9yIGFuIGV4aXN0aW5nIG5ldHdvcmssIGl0IGFjY29tcGxpc2hlcyB0aGUgdGFzayBvZiB1cGRhdGVOZXR3b3JrKCkKKyAgICAgKiBhbmQgc2F2ZUNvbmZpZ3VyYXRpb24oKQorICAgICAqCisgICAgICogQHBhcmFtIGNvbmZpZyB0aGUgc2V0IG9mIHZhcmlhYmxlcyB0aGF0IGRlc2NyaWJlIHRoZSBjb25maWd1cmF0aW9uLAorICAgICAqICAgICAgICAgICAgY29udGFpbmVkIGluIGEge0BsaW5rIFdpZmlDb25maWd1cmF0aW9ufSBvYmplY3QuCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzYXZlTmV0d29yayhXaWZpQ29uZmlndXJhdGlvbiBjb25maWcpIHsKKyAgICAgICAgaWYgKGNvbmZpZyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1TZXJ2aWNlLnNhdmVOZXR3b3JrKGNvbmZpZyk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7IH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWxldGUgdGhlIG5ldHdvcmsgaW4gdGhlIHN1cHBsaWNhbnQgY29uZmlnLgorICAgICAqCisgICAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGluc3RlYWQgb2YgYSBzZXF1ZW5jZSBvZiByZW1vdmVOZXR3b3JrKCkKKyAgICAgKiBhbmQgc2F2ZUNvbmZpZ3VyYXRpb24oKS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25maWcgdGhlIHNldCBvZiB2YXJpYWJsZXMgdGhhdCBkZXNjcmliZSB0aGUgY29uZmlndXJhdGlvbiwKKyAgICAgKiAgICAgICAgICAgIGNvbnRhaW5lZCBpbiBhIHtAbGluayBXaWZpQ29uZmlndXJhdGlvbn0gb2JqZWN0LgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHZvaWQgZm9yZ2V0TmV0d29yayhpbnQgbmV0SWQpIHsKKyAgICAgICAgaWYgKG5ldElkIDwgMCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtU2VydmljZS5mb3JnZXROZXR3b3JrKG5ldElkKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsgfQorICAgIH0KKwogICAgIC8qKgogICAgICAqIEFsbG93cyBhbiBhcHBsaWNhdGlvbiB0byBrZWVwIHRoZSBXaS1GaSByYWRpbyBhd2FrZS4KICAgICAgKiBOb3JtYWxseSB0aGUgV2ktRmkgcmFkaW8gbWF5IHR1cm4gb2ZmIHdoZW4gdGhlIHVzZXIgaGFzIG5vdCB1c2VkIHRoZSBkZXZpY2UgaW4gYSB3aGlsZS4KQEAgLTEwMDMsOSArMTE4MSw4IEBACiAgICAgLyoqCiAgICAgICogQ3JlYXRlcyBhIG5ldyBXaWZpTG9jay4KICAgICAgKgotICAgICAqIEBwYXJhbSBsb2NrVHlwZSB0aGUgdHlwZSBvZiBsb2NrIHRvIGNyZWF0ZS4gU2VlIHtAbGluayAjV0lGSV9NT0RFX0ZVTEx9LAotICAgICAqIGFuZCB7QGxpbmsgI1dJRklfTU9ERV9TQ0FOX09OTFl9IGZvciBkZXNjcmlwdGlvbnMgb2YgdGhlIHR5cGVzIG9mIFdpLUZpIGxvY2tzLgotICAgICAqCisgICAgICogQHBhcmFtIGxvY2tUeXBlIHRoZSB0eXBlIG9mIGxvY2sgdG8gY3JlYXRlLiBTZWUge0BsaW5rICNXSUZJX01PREVfRlVMTH0gYW5kCisgICAgICoge0BsaW5rICNXSUZJX01PREVfU0NBTl9PTkxZfSBmb3IgZGVzY3JpcHRpb25zIG9mIHRoZSB0eXBlcyBvZiBXaS1GaSBsb2Nrcy4KICAgICAgKiBAcGFyYW0gdGFnIGEgdGFnIGZvciB0aGUgV2lmaUxvY2sgdG8gaWRlbnRpZnkgaXQgaW4gZGVidWdnaW5nIG1lc3NhZ2VzLiAgVGhpcyBzdHJpbmcgaXMgCiAgICAgICogICAgICAgICAgICBuZXZlciBzaG93biB0byB0aGUgdXNlciB1bmRlciBub3JtYWwgY29uZGl0aW9ucywgYnV0IHNob3VsZCBiZSBkZXNjcmlwdGl2ZSAKICAgICAgKiAgICAgICAgICAgIGVub3VnaCB0byBpZGVudGlmeSB5b3VyIGFwcGxpY2F0aW9uIGFuZCB0aGUgc3BlY2lmaWMgV2lmaUxvY2sgd2l0aGluIGl0LCBpZiBpdApkaWZmIC0tZ2l0IGEvd2lmaS9qYXZhL2FuZHJvaWQvbmV0L3dpZmkvV2lmaU1vbml0b3IuamF2YSBiL3dpZmkvamF2YS9hbmRyb2lkL25ldC93aWZpL1dpZmlNb25pdG9yLmphdmEKaW5kZXggMjY2ZDgwMS4uYWYzMTMyZiAxMDA2NDQKLS0tIGEvd2lmaS9qYXZhL2FuZHJvaWQvbmV0L3dpZmkvV2lmaU1vbml0b3IuamF2YQorKysgYi93aWZpL2phdmEvYW5kcm9pZC9uZXQvd2lmaS9XaWZpTW9uaXRvci5qYXZhCkBAIC0xOSwxNCArMTksMTMgQEAKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Db25maWc7CiBpbXBvcnQgYW5kcm9pZC5uZXQuTmV0d29ya0luZm87Ci1pbXBvcnQgYW5kcm9pZC5uZXQuTmV0d29ya1N0YXRlVHJhY2tlcjsKIAogaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwogaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwogCiAvKioKICAqIExpc3RlbnMgZm9yIGV2ZW50cyBmcm9tIHRoZSB3cGFfc3VwcGxpY2FudCBzZXJ2ZXIsIGFuZCBwYXNzZXMgdGhlbSBvbgotICogdG8gdGhlIHtAbGluayBXaWZpU3RhdGVUcmFja2VyfSBmb3IgaGFuZGxpbmcuIFJ1bnMgaW4gaXRzIG93biB0aHJlYWQuCisgKiB0byB0aGUge0BsaW5rIFdpZmlTdGF0ZU1hY2hpbmV9IGZvciBoYW5kbGluZy4gUnVucyBpbiBpdHMgb3duIHRocmVhZC4KICAqCiAgKiBAaGlkZQogICovCkBAIC0xMTcsNyArMTE2LDcgQEAKICAgICBwcml2YXRlIHN0YXRpYyBQYXR0ZXJuIG1Db25uZWN0ZWRFdmVudFBhdHRlcm4gPQogICAgICAgICBQYXR0ZXJuLmNvbXBpbGUoIigoPzpbMC05YS1mXXsyfTopezV9WzAtOWEtZl17Mn0pIC4qIFxcW2lkPShbMC05XSspICIpOwogCi0gICAgcHJpdmF0ZSBmaW5hbCBXaWZpU3RhdGVUcmFja2VyIG1XaWZpU3RhdGVUcmFja2VyOworICAgIHByaXZhdGUgZmluYWwgV2lmaVN0YXRlTWFjaGluZSBtV2lmaVN0YXRlTWFjaGluZTsKIAogICAgIC8qKgogICAgICAqIFRoaXMgaW5kaWNhdGVzIHRoZSBzdXBwbGljYW50IGNvbm5lY3Rpb24gZm9yIHRoZSBtb25pdG9yIGlzIGNsb3NlZApAQCAtMTM5LDMxICsxMzgsMjcgQEAKICAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1JFQ1ZfRVJST1JTICAgID0gMTA7CiAKLSAgICBwdWJsaWMgV2lmaU1vbml0b3IoV2lmaVN0YXRlVHJhY2tlciB0cmFja2VyKSB7Ci0gICAgICAgIG1XaWZpU3RhdGVUcmFja2VyID0gdHJhY2tlcjsKKyAgICBwdWJsaWMgV2lmaU1vbml0b3IoV2lmaVN0YXRlTWFjaGluZSB3aWZpU3RhdGVNYWNoaW5lKSB7CisgICAgICAgIG1XaWZpU3RhdGVNYWNoaW5lID0gd2lmaVN0YXRlTWFjaGluZTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBzdGFydE1vbml0b3JpbmcoKSB7CiAgICAgICAgIG5ldyBNb25pdG9yVGhyZWFkKCkuc3RhcnQoKTsKICAgICB9CiAKLSAgICBwdWJsaWMgTmV0d29ya1N0YXRlVHJhY2tlciBnZXROZXR3b3JrU3RhdGVUcmFja2VyKCkgewotICAgICAgICByZXR1cm4gbVdpZmlTdGF0ZVRyYWNrZXI7Ci0gICAgfQotCiAgICAgY2xhc3MgTW9uaXRvclRocmVhZCBleHRlbmRzIFRocmVhZCB7CiAgICAgICAgIHB1YmxpYyBNb25pdG9yVGhyZWFkKCkgewogICAgICAgICAgICAgc3VwZXIoIldpZmlNb25pdG9yIik7CiAgICAgICAgIH0KLSAgICAgICAgCisKICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewogCiAgICAgICAgICAgICBpZiAoY29ubmVjdFRvU3VwcGxpY2FudCgpKSB7CiAgICAgICAgICAgICAgICAgLy8gU2VuZCBhIG1lc3NhZ2UgaW5kaWNhdGluZyB0aGF0IGl0IGlzIG5vdyBwb3NzaWJsZSB0byBzZW5kIGNvbW1hbmRzCiAgICAgICAgICAgICAgICAgLy8gdG8gdGhlIHN1cHBsaWNhbnQKLSAgICAgICAgICAgICAgICBtV2lmaVN0YXRlVHJhY2tlci5ub3RpZnlTdXBwbGljYW50Q29ubmVjdGlvbigpOworICAgICAgICAgICAgICAgIG1XaWZpU3RhdGVNYWNoaW5lLm5vdGlmeVN1cHBsaWNhbnRDb25uZWN0aW9uKCk7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1XaWZpU3RhdGVUcmFja2VyLm5vdGlmeVN1cHBsaWNhbnRMb3N0KCk7CisgICAgICAgICAgICAgICAgbVdpZmlTdGF0ZU1hY2hpbmUubm90aWZ5U3VwcGxpY2FudExvc3QoKTsKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CiAKQEAgLTI1OSw3ICsyNTQsNyBAQAogICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgLy8gbm90aWZ5IGFuZCBleGl0Ci0gICAgICAgICAgICAgICAgICAgIG1XaWZpU3RhdGVUcmFja2VyLm5vdGlmeVN1cHBsaWNhbnRMb3N0KCk7CisgICAgICAgICAgICAgICAgICAgIG1XaWZpU3RhdGVNYWNoaW5lLm5vdGlmeVN1cHBsaWNhbnRMb3N0KCk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUV2ZW50KGV2ZW50LCBldmVudERhdGEpOwpAQCAtMjcyLDcgKzI2Nyw3IEBACiAgICAgICAgICAgICBpbnQgY29ubmVjdFRyaWVzID0gMDsKIAogICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgICAgICBpZiAobVdpZmlTdGF0ZVRyYWNrZXIuY29ubmVjdFRvU3VwcGxpY2FudCgpKSB7CisgICAgICAgICAgICAgICAgaWYgKFdpZmlOYXRpdmUuY29ubmVjdFRvU3VwcGxpY2FudCgpKSB7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpZiAoY29ubmVjdFRyaWVzKysgPCAzKSB7CkBAIC0yODUsNyArMjgwLDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIHByaXZhdGUgdm9pZCBoYW5kbGVQYXNzd29yZEtleU1heUJlSW5jb3JyZWN0KCkgewotICAgICAgICAgICAgbVdpZmlTdGF0ZVRyYWNrZXIubm90aWZ5UGFzc3dvcmRLZXlNYXlCZUluY29ycmVjdCgpOworICAgICAgICAgICAgbVdpZmlTdGF0ZU1hY2hpbmUubm90aWZ5UGFzc3dvcmRLZXlNYXlCZUluY29ycmVjdCgpOwogICAgICAgICB9CiAKICAgICAgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZURyaXZlckV2ZW50KFN0cmluZyBzdGF0ZSkgewpAQCAtMjkzLDExICsyODgsMTEgQEAKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoc3RhdGUuZXF1YWxzKCJTVE9QUEVEIikpIHsKLSAgICAgICAgICAgICAgICBtV2lmaVN0YXRlVHJhY2tlci5ub3RpZnlEcml2ZXJTdG9wcGVkKCk7CisgICAgICAgICAgICAgICAgbVdpZmlTdGF0ZU1hY2hpbmUubm90aWZ5RHJpdmVyU3RvcHBlZCgpOwogICAgICAgICAgICAgfSBlbHNlIGlmIChzdGF0ZS5lcXVhbHMoIlNUQVJURUQiKSkgewotICAgICAgICAgICAgICAgIG1XaWZpU3RhdGVUcmFja2VyLm5vdGlmeURyaXZlclN0YXJ0ZWQoKTsKKyAgICAgICAgICAgICAgICBtV2lmaVN0YXRlTWFjaGluZS5ub3RpZnlEcml2ZXJTdGFydGVkKCk7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXRlLmVxdWFscygiSEFOR0VEIikpIHsKLSAgICAgICAgICAgICAgICBtV2lmaVN0YXRlVHJhY2tlci5ub3RpZnlEcml2ZXJIdW5nKCk7CisgICAgICAgICAgICAgICAgbVdpZmlTdGF0ZU1hY2hpbmUubm90aWZ5RHJpdmVySHVuZygpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTMxOCw3ICszMTMsNyBAQAogICAgICAgICAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICAgICAgICAgIGNhc2UgU0NBTl9SRVNVTFRTOgotICAgICAgICAgICAgICAgICAgICBtV2lmaVN0YXRlVHJhY2tlci5ub3RpZnlTY2FuUmVzdWx0c0F2YWlsYWJsZSgpOworICAgICAgICAgICAgICAgICAgICBtV2lmaVN0YXRlTWFjaGluZS5ub3RpZnlTY2FuUmVzdWx0c0F2YWlsYWJsZSgpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICAgICAgICAgIGNhc2UgVU5LTk9XTjoKQEAgLTM3NSw3ICszNzAsNyBAQAogICAgICAgICAgICAgaWYgKG5ld1N1cHBsaWNhbnRTdGF0ZSA9PSBTdXBwbGljYW50U3RhdGUuSU5WQUxJRCkgewogICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkludmFsaWQgc3VwcGxpY2FudCBzdGF0ZTogIiArIG5ld1N0YXRlKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1XaWZpU3RhdGVUcmFja2VyLm5vdGlmeVN0YXRlQ2hhbmdlKG5ldHdvcmtJZCwgQlNTSUQsIG5ld1N1cHBsaWNhbnRTdGF0ZSk7CisgICAgICAgICAgICBtV2lmaVN0YXRlTWFjaGluZS5ub3RpZnlTdXBwbGljYW50U3RhdGVDaGFuZ2UobmV0d29ya0lkLCBCU1NJRCwgbmV3U3VwcGxpY2FudFN0YXRlKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMzk1LDcgKzM5MCw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIG1XaWZpU3RhdGVUcmFja2VyLm5vdGlmeVN0YXRlQ2hhbmdlKG5ld1N0YXRlLCBCU1NJRCwgbmV0d29ya0lkKTsKKyAgICAgICAgbVdpZmlTdGF0ZU1hY2hpbmUubm90aWZ5TmV0d29ya1N0YXRlQ2hhbmdlKG5ld1N0YXRlLCBCU1NJRCwgbmV0d29ya0lkKTsKICAgICB9CiAKICAgICAvKioKZGlmZiAtLWdpdCBhL3dpZmkvamF2YS9hbmRyb2lkL25ldC93aWZpL1dpZmlOYXRpdmUuamF2YSBiL3dpZmkvamF2YS9hbmRyb2lkL25ldC93aWZpL1dpZmlOYXRpdmUuamF2YQppbmRleCAyNWYwNWMwLi40N2Y4ODEzIDEwMDY0NAotLS0gYS93aWZpL2phdmEvYW5kcm9pZC9uZXQvd2lmaS9XaWZpTmF0aXZlLmphdmEKKysrIGIvd2lmaS9qYXZhL2FuZHJvaWQvbmV0L3dpZmkvV2lmaU5hdGl2ZS5qYXZhCkBAIC00MSw2ICs0MSw4IEBACiAgICAgcHVibGljIG5hdGl2ZSBzdGF0aWMgU3RyaW5nIGdldEVycm9yU3RyaW5nKGludCBlcnJvckNvZGUpOwogCiAgICAgcHVibGljIG5hdGl2ZSBzdGF0aWMgYm9vbGVhbiBsb2FkRHJpdmVyKCk7CisKKyAgICBwdWJsaWMgbmF0aXZlIHN0YXRpYyBib29sZWFuIGlzRHJpdmVyTG9hZGVkKCk7CiAgICAgCiAgICAgcHVibGljIG5hdGl2ZSBzdGF0aWMgYm9vbGVhbiB1bmxvYWREcml2ZXIoKTsKIApAQCAtMTQ5LDggKzE1MSw2IEBACiAKICAgICBwdWJsaWMgbmF0aXZlIHN0YXRpYyBTdHJpbmcgZ2V0RGhjcEVycm9yKCk7CiAKLSAgICBwdWJsaWMgbmF0aXZlIHN0YXRpYyBib29sZWFuIHNldFN1c3BlbmRPcHRpbWl6YXRpb25zQ29tbWFuZChib29sZWFuIGVuYWJsZWQpOwotCiAgICAgLyoqCiAgICAgICogV2FpdCBmb3IgdGhlIHN1cHBsaWNhbnQgdG8gc2VuZCBhbiBldmVudCwgcmV0dXJuaW5nIHRoZSBldmVudCBzdHJpbmcuCiAgICAgICogQHJldHVybiB0aGUgZXZlbnQgc3RyaW5nIHNlbnQgYnkgdGhlIHN1cHBsaWNhbnQuCmRpZmYgLS1naXQgYS93aWZpL2phdmEvYW5kcm9pZC9uZXQvd2lmaS9XaWZpU3RhdGVNYWNoaW5lLmphdmEgYi93aWZpL2phdmEvYW5kcm9pZC9uZXQvd2lmaS9XaWZpU3RhdGVNYWNoaW5lLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTczNDk1MwotLS0gL2Rldi9udWxsCisrKyBiL3dpZmkvamF2YS9hbmRyb2lkL25ldC93aWZpL1dpZmlTdGF0ZU1hY2hpbmUuamF2YQpAQCAtMCwwICsxLDM2MTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubmV0LndpZmk7CisKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlci5XSUZJX1NUQVRFX0RJU0FCTEVEOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyLldJRklfU1RBVEVfRElTQUJMSU5HOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyLldJRklfU1RBVEVfRU5BQkxFRDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlci5XSUZJX1NUQVRFX0VOQUJMSU5HOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyLldJRklfU1RBVEVfVU5LTk9XTjsKKworLyoqCisgKiBUT0RPOiBBZGQgc29mdCBBUCBzdGF0ZXMgYXMgcGFydCBvZiBXSUZJX1NUQVRFX1hYWAorICogUmV0YWluIFdJRklfU1RBVEVfRU5BQkxJTkcgdGhhdCBpbmRpY2F0ZXMgZHJpdmVyIGlzIGxvYWRpbmcKKyAqIEFkZCBXSUZJX1NUQVRFX0FQX0VOQUJMRUQgdG8gaW5kaWNhdGUgc29mdCBBUCBoYXMgc3RhcnRlZAorICogYW5kIFdJRklfU1RBVEVfRkFJTEVEIGZvciBmYWlsdXJlCisgKiBEZXByZWNhdGUgV0lGSV9TVEFURV9VTktOT1dOCisgKgorICogRG9pbmcgdGhpcyB3aWxsIHNpbXBsaWZ5IHRoZSBsb2dpYyBmb3Igc2VuZGluZyBicm9hZGNhc3RzCisgKi8KK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlci5XSUZJX0FQX1NUQVRFX0RJU0FCTEVEOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyLldJRklfQVBfU1RBVEVfRElTQUJMSU5HOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyLldJRklfQVBfU1RBVEVfRU5BQkxFRDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlci5XSUZJX0FQX1NUQVRFX0VOQUJMSU5HOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyLldJRklfQVBfU1RBVEVfRkFJTEVEOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHlNYW5hZ2VyTmF0aXZlOworaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtJbmZvOworaW1wb3J0IGFuZHJvaWQubmV0LkRoY3BJbmZvOworaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtVdGlsczsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Db25uZWN0aXZpdHlNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtJbmZvLkRldGFpbGVkU3RhdGU7CitpbXBvcnQgYW5kcm9pZC5uZXQuTmV0d29ya1Byb3BlcnRpZXM7CitpbXBvcnQgYW5kcm9pZC5uZXQud2lmaS5XaWZpQ29uZmlndXJhdGlvbi5TdGF0dXM7CitpbXBvcnQgYW5kcm9pZC5vcy5CaW5kZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsYWJsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOworaW1wb3J0IGFuZHJvaWQub3MuSU5ldHdvcmtNYW5hZ2VtZW50U2VydmljZTsKK2ltcG9ydCBhbmRyb2lkLm9zLlBvd2VyTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbVByb3BlcnRpZXM7CitpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC5vcy5TZXJ2aWNlTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlByb2Nlc3M7CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5nczsKK2ltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOworaW1wb3J0IGFuZHJvaWQudXRpbC5FdmVudExvZzsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudXRpbC5TbG9nOworaW1wb3J0IGFuZHJvaWQuYXBwLmJhY2t1cC5JQmFja3VwTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhEZXZpY2U7CitpbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoSGVhZHNldDsKK2ltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhBMmRwOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkNvbnRlbnRPYnNlcnZlcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5hcHAuSUJhdHRlcnlTdGF0czsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLkhpZXJhcmNoaWNhbFN0YXRlOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnV0aWwuSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lOworCitpbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7CitpbXBvcnQgamF2YS5uZXQuTmV0d29ya0ludGVyZmFjZTsKK2ltcG9ydCBqYXZhLm5ldC5Tb2NrZXRFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVW5rbm93bkhvc3RFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQml0U2V0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0Jvb2xlYW47CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXI7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CisKKy8qKgorICogVHJhY2sgdGhlIHN0YXRlIG9mIFdpZmkgY29ubmVjdGl2aXR5LiBBbGwgZXZlbnQgaGFuZGxpbmcgaXMgZG9uZSBoZXJlLAorICogYW5kIGFsbCBjaGFuZ2VzIGluIGNvbm5lY3Rpdml0eSBzdGF0ZSBhcmUgaW5pdGlhdGVkIGhlcmUuCisgKgorICogQGhpZGUKKyAqLworLy9UT0RPOiB3ZSBzdGlsbCBuZWVkIGZyZXF1ZW50IHNjYW5uaW5nIGZvciB0aGUgY2FzZSB3aGVuCisvLyB3ZSBpc3N1ZSBkaXNjb25uZWN0IGJ1dCBuZWVkIHNjYW4gcmVzdWx0cyBmb3Igb3BlbiBuZXR3b3JrIG5vdGlmaWNhdGlvbgorcHVibGljIGNsYXNzIFdpZmlTdGF0ZU1hY2hpbmUgZXh0ZW5kcyBIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJXaWZpU3RhdGVNYWNoaW5lIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVUV09SS1RZUEUgPSAiV0lGSSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBEQkcgPSBmYWxzZTsKKworICAgIC8qIFRPRE86IGZldGNoIGEgY29uZmlndXJhYmxlIGludGVyZmFjZSAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTT0ZUQVBfSUZBQ0UgPSAid2wwLjEiOworCisgICAgcHJpdmF0ZSBXaWZpTW9uaXRvciBtV2lmaU1vbml0b3I7CisgICAgcHJpdmF0ZSBJTmV0d29ya01hbmFnZW1lbnRTZXJ2aWNlIG53U2VydmljZTsKKyAgICBwcml2YXRlIENvbm5lY3Rpdml0eU1hbmFnZXIgbUNtOworCisgICAgLyogU2NhbiByZXN1bHRzIGhhbmRsaW5nICovCisgICAgcHJpdmF0ZSBMaXN0PFNjYW5SZXN1bHQ+IG1TY2FuUmVzdWx0czsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIHNjYW5SZXN1bHRQYXR0ZXJuID0gUGF0dGVybi5jb21waWxlKCJcdCsiKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0NBTl9SRVNVTFRfQ0FDSEVfU0laRSA9IDgwOworICAgIHByaXZhdGUgZmluYWwgTGlua2VkSGFzaE1hcDxTdHJpbmcsIFNjYW5SZXN1bHQ+IG1TY2FuUmVzdWx0Q2FjaGU7CisKKyAgICBwcml2YXRlIFN0cmluZyBtSW50ZXJmYWNlTmFtZTsKKworICAgIHByaXZhdGUgaW50IG1OdW1BbGxvd2VkQ2hhbm5lbHMgPSAwOworICAgIHByaXZhdGUgaW50IG1MYXN0U2lnbmFsTGV2ZWwgPSAtMTsKKyAgICBwcml2YXRlIFN0cmluZyBtTGFzdEJzc2lkOworICAgIHByaXZhdGUgaW50IG1MYXN0TmV0d29ya0lkOworICAgIHByaXZhdGUgYm9vbGVhbiBtRW5hYmxlUnNzaVBvbGxpbmcgPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gbVBhc3N3b3JkS2V5TWF5QmVJbmNvcnJlY3QgPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gbVVzZVN0YXRpY0lwID0gZmFsc2U7CisgICAgcHJpdmF0ZSBpbnQgbVJlY29ubmVjdENvdW50ID0gMDsKKyAgICBwcml2YXRlIGJvb2xlYW4gbUlzU2Nhbk1vZGUgPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gbUNvbmZpZ0NoYW5nZWQgPSBmYWxzZTsKKyAgICBwcml2YXRlIExpc3Q8V2lmaUNvbmZpZ3VyYXRpb24+IG1Db25maWd1cmVkTmV0d29ya3MgPSBuZXcgQXJyYXlMaXN0PFdpZmlDb25maWd1cmF0aW9uPigpOworCisgICAgLyoqCisgICAgICogSW5zdGFuY2Ugb2YgdGhlIGJsdWV0b290aCBoZWFkc2V0IGhlbHBlci4gVGhpcyBuZWVkcyB0byBiZSBjcmVhdGVkCisgICAgICogZWFybHkgYmVjYXVzZSB0aGVyZSBpcyBhIGRlbGF5IGJlZm9yZSBpdCBhY3R1YWxseSAnY29ubmVjdHMnLCBhcworICAgICAqIG5vdGVkIGJ5IGl0cyBqYXZhZG9jLiBJZiB3ZSBjaGVjayBiZWZvcmUgaXQgaXMgY29ubmVjdGVkLCBpdCB3aWxsIGJlCisgICAgICogaW4gYW4gZXJyb3Igc3RhdGUgYW5kIHdlIHdpbGwgbm90IGRpc2FibGUgY29leGlzdGVuY2UuCisgICAgICovCisgICAgcHJpdmF0ZSBCbHVldG9vdGhIZWFkc2V0IG1CbHVldG9vdGhIZWFkc2V0OworCisgICAgcHJpdmF0ZSBCbHVldG9vdGhBMmRwIG1CbHVldG9vdGhBMmRwOworCisgICAgLyoqCisgICAgICogT2JzZXJ2ZXMgdGhlIHN0YXRpYyBJUCBhZGRyZXNzIHNldHRpbmdzLgorICAgICAqLworICAgIHByaXZhdGUgU2V0dGluZ3NPYnNlcnZlciBtU2V0dGluZ3NPYnNlcnZlcjsKKyAgICBwcml2YXRlIE5ldHdvcmtQcm9wZXJ0aWVzIG1OZXR3b3JrUHJvcGVydGllczsKKworICAgIC8vIEhlbGQgZHVyaW5nIGRyaXZlciBsb2FkIGFuZCB1bmxvYWQKKyAgICBwcml2YXRlIHN0YXRpYyBQb3dlck1hbmFnZXIuV2FrZUxvY2sgc1dha2VMb2NrOworCisgICAgcHJpdmF0ZSBDb250ZXh0IG1Db250ZXh0OworCisgICAgcHJpdmF0ZSBEaGNwSW5mbyBtRGhjcEluZm87CisgICAgcHJpdmF0ZSBXaWZpSW5mbyBtV2lmaUluZm87CisgICAgcHJpdmF0ZSBOZXR3b3JrSW5mbyBtTmV0d29ya0luZm87CisgICAgcHJpdmF0ZSBTdXBwbGljYW50U3RhdGVUcmFja2VyIG1TdXBwbGljYW50U3RhdGVUcmFja2VyOworICAgIC8qIFRyYWNrcyB0aGUgaGlnaGVzdCBwcmlvcml0eSBvZiBjb25maWd1cmVkIG5ldHdvcmtzICovCisgICAgcHJpdmF0ZSBpbnQgbUxhc3RQcmlvcml0eSA9IC0xOworICAgIC8qIFRyYWNrcyBpZiBhbGwgbmV0d29ya3MgbmVlZCB0byBiZSBlbmFibGVkICovCisgICAgcHJpdmF0ZSBib29sZWFuIG1FbmFibGVBbGxOZXR3b3JrcyA9IGZhbHNlOworCisgICAgLy8gRXZlbnQgbG9nIHRhZ3MgKG11c3QgYmUgaW4gc3luYyB3aXRoIGV2ZW50LWxvZy10YWdzKQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVExPR19XSUZJX1NUQVRFX0NIQU5HRUQgICAgICAgID0gNTAwMjE7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVWRU5UTE9HX1dJRklfRVZFTlRfSEFORExFRCAgICAgICAgPSA1MDAyMjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRMT0dfU1VQUExJQ0FOVF9TVEFURV9DSEFOR0VEICA9IDUwMDIzOworCisgICAgLyogTG9hZCB0aGUgZHJpdmVyICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENNRF9MT0FEX0RSSVZFUiAgICAgICAgICAgICAgICAgICAgICA9IDE7CisgICAgLyogVW5sb2FkIHRoZSBkcml2ZXIgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ01EX1VOTE9BRF9EUklWRVIgICAgICAgICAgICAgICAgICAgID0gMjsKKyAgICAvKiBJbmRpY2F0ZXMgZHJpdmVyIGxvYWQgc3VjY2VlZGVkICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENNRF9MT0FEX0RSSVZFUl9TVUNDRVNTICAgICAgICAgICAgICA9IDM7CisgICAgLyogSW5kaWNhdGVzIGRyaXZlciBsb2FkIGZhaWxlZCAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTURfTE9BRF9EUklWRVJfRkFJTFVSRSAgICAgICAgICAgICAgPSA0OworICAgIC8qIEluZGljYXRlcyBkcml2ZXIgdW5sb2FkIHN1Y2NlZWRlZCAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTURfVU5MT0FEX0RSSVZFUl9TVUNDRVNTICAgICAgICAgICAgPSA1OworICAgIC8qIEluZGljYXRlcyBkcml2ZXIgdW5sb2FkIGZhaWxlZCAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTURfVU5MT0FEX0RSSVZFUl9GQUlMVVJFICAgICAgICAgICAgPSA2OworCisgICAgLyogU3RhcnQgdGhlIHN1cHBsaWNhbnQgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ01EX1NUQVJUX1NVUFBMSUNBTlQgICAgICAgICAgICAgICAgID0gMTE7CisgICAgLyogU3RvcCB0aGUgc3VwcGxpY2FudCAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTURfU1RPUF9TVVBQTElDQU5UICAgICAgICAgICAgICAgICAgPSAxMjsKKyAgICAvKiBTdGFydCB0aGUgZHJpdmVyICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENNRF9TVEFSVF9EUklWRVIgICAgICAgICAgICAgICAgICAgICA9IDEzOworICAgIC8qIFN0YXJ0IHRoZSBkcml2ZXIgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ01EX1NUT1BfRFJJVkVSICAgICAgICAgICAgICAgICAgICAgID0gMTQ7CisgICAgLyogSW5kaWNhdGVzIERIQ1Agc3VjY2VkZWQgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ01EX0lQX0NPTkZJR19TVUNDRVNTICAgICAgICAgICAgICAgID0gMTU7CisgICAgLyogSW5kaWNhdGVzIERIQ1AgZmFpbGVkICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENNRF9JUF9DT05GSUdfRkFJTFVSRSAgICAgICAgICAgICAgICA9IDE2OworICAgIC8qIFJlLWNvbmZpZ3VyZSBpbnRlcmZhY2UgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ01EX1JFQ09ORklHVVJFX0lQICAgICAgICAgICAgICAgICAgID0gMTc7CisKKworICAgIC8qIFN0YXJ0IHRoZSBzb2Z0IGFjY2VzcyBwb2ludCAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTURfU1RBUlRfQVAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMTsKKyAgICAvKiBTdG9wIHRoZSBzb2Z0IGFjY2VzcyBwb2ludCAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTURfU1RPUF9BUCAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMjsKKworCisgICAgLyogU3VwcGxpY2FudCBldmVudHMgKi8KKyAgICAvKiBDb25uZWN0aW9uIHRvIHN1cHBsaWNhbnQgZXN0YWJsaXNoZWQgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1VQX0NPTk5FQ1RJT05fRVZFTlQgICAgICAgICAgICAgICAgID0gMzE7CisgICAgLyogQ29ubmVjdGlvbiB0byBzdXBwbGljYW50IGxvc3QgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1VQX0RJU0NPTk5FQ1RJT05fRVZFTlQgICAgICAgICAgICAgID0gMzI7CisgICAgLyogRHJpdmVyIHN0YXJ0IGNvbXBsZXRlZCAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBEUklWRVJfU1RBUlRfRVZFTlQgICAgICAgICAgICAgICAgICAgPSAzMzsKKyAgICAvKiBEcml2ZXIgc3RvcCBjb21wbGV0ZWQgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRFJJVkVSX1NUT1BfRVZFTlQgICAgICAgICAgICAgICAgICAgID0gMzQ7CisgICAgLyogTmV0d29yayBjb25uZWN0aW9uIGNvbXBsZXRlZCAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBORVRXT1JLX0NPTk5FQ1RJT05fRVZFTlQgICAgICAgICAgICAgPSAzNjsKKyAgICAvKiBOZXR3b3JrIGRpc2Nvbm5lY3Rpb24gY29tcGxldGVkICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5FVFdPUktfRElTQ09OTkVDVElPTl9FVkVOVCAgICAgICAgICA9IDM3OworICAgIC8qIFNjYW4gcmVzdWx0cyBhcmUgYXZhaWxhYmxlICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNDQU5fUkVTVUxUU19FVkVOVCAgICAgICAgICAgICAgICAgICA9IDM4OworICAgIC8qIFN1cHBsaWNhdGUgc3RhdGUgY2hhbmdlZCAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVVBQTElDQU5UX1NUQVRFX0NIQU5HRV9FVkVOVCAgICAgICAgPSAzOTsKKyAgICAvKiBQYXNzd29yZCBtYXkgYmUgaW5jb3JyZWN0ICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBBU1NXT1JEX01BWV9CRV9JTkNPUlJFQ1RfRVZFTlQgICAgICA9IDQwOworCisgICAgLyogU3VwcGxpY2FudCBjb21tYW5kcyAqLworICAgIC8qIElzIHN1cHBsaWNhbnQgYWxpdmUgPyAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTURfUElOR19TVVBQTElDQU5UICAgICAgICAgICAgICAgICAgPSA1MTsKKyAgICAvKiBBZGQvdXBkYXRlIGEgbmV0d29yayBjb25maWd1cmF0aW9uICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENNRF9BRERfT1JfVVBEQVRFX05FVFdPUksgICAgICAgICAgICA9IDUyOworICAgIC8qIERlbGV0ZSBhIG5ldHdvcmsgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ01EX1JFTU9WRV9ORVRXT1JLICAgICAgICAgICAgICAgICAgID0gNTM7CisgICAgLyogRW5hYmxlIGEgbmV0d29yay4gVGhlIGRldmljZSB3aWxsIGF0dGVtcHQgYSBjb25uZWN0aW9uIHRvIHRoZSBnaXZlbiBuZXR3b3JrLiAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTURfRU5BQkxFX05FVFdPUksgICAgICAgICAgICAgICAgICAgPSA1NDsKKyAgICAvKiBEaXNhYmxlIGEgbmV0d29yay4gVGhlIGRldmljZSBkb2VzIG5vdCBhdHRlbXB0IGEgY29ubmVjdGlvbiB0byB0aGUgZ2l2ZW4gbmV0d29yay4gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ01EX0RJU0FCTEVfTkVUV09SSyAgICAgICAgICAgICAgICAgID0gNTU7CisgICAgLyogQmxhY2tsaXN0IG5ldHdvcmsuIERlLXByaW9yaXRpemVzIHRoZSBnaXZlbiBCU1NJRCBmb3IgY29ubmVjdGlvbi4gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ01EX0JMQUNLTElTVF9ORVRXT1JLICAgICAgICAgICAgICAgID0gNTY7CisgICAgLyogQ2xlYXIgdGhlIGJsYWNrbGlzdCBuZXR3b3JrIGxpc3QgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ01EX0NMRUFSX0JMQUNLTElTVCAgICAgICAgICAgICAgICAgID0gNTc7CisgICAgLyogU2F2ZSBjb25maWd1cmF0aW9uICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENNRF9TQVZFX0NPTkZJRyAgICAgICAgICAgICAgICAgICAgICA9IDU4OworCisgICAgLyogU3VwcGxpY2FudCBjb21tYW5kcyBhZnRlciBkcml2ZXIgc3RhcnQqLworICAgIC8qIEluaXRpYXRlIGEgc2NhbiAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTURfU1RBUlRfU0NBTiAgICAgICAgICAgICAgICAgICAgICAgPSA3MTsKKyAgICAvKiBTZXQgc2NhbiBtb2RlLiBDT05ORUNUX01PREUgb3IgU0NBTl9PTkxZX01PREUgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ01EX1NFVF9TQ0FOX01PREUgICAgICAgICAgICAgICAgICAgID0gNzI7CisgICAgLyogU2V0IHNjYW4gdHlwZS4gU0NBTl9BQ1RJVkUgb3IgU0NBTl9QQVNTSVZFICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENNRF9TRVRfU0NBTl9UWVBFICAgICAgICAgICAgICAgICAgICA9IDczOworICAgIC8qIERpc2Nvbm5lY3QgZnJvbSBhIG5ldHdvcmsgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ01EX0RJU0NPTk5FQ1QgICAgICAgICAgICAgICAgICAgICAgID0gNzQ7CisgICAgLyogUmVjb25uZWN0IHRvIGEgbmV0d29yayAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTURfUkVDT05ORUNUICAgICAgICAgICAgICAgICAgICAgICAgPSA3NTsKKyAgICAvKiBSZWFzc29jaWF0ZSB0byBhIG5ldHdvcmsgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ01EX1JFQVNTT0NJQVRFICAgICAgICAgICAgICAgICAgICAgID0gNzY7CisgICAgLyogU2V0IHBvd2VyIG1vZGUKKyAgICAgKiBQT1dFUl9NT0RFX0FDVElWRQorICAgICAqIFBPV0VSX01PREVfQVVUTworICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTURfU0VUX1BPV0VSX01PREUgICAgICAgICAgICAgICAgICAgPSA3NzsKKyAgICAvKiBTZXQgYmx1ZXRvb3RoIGNvLWV4aXN0ZW5jZQorICAgICAqIEJMVUVUT09USF9DT0VYSVNURU5DRV9NT0RFX0VOQUJMRUQKKyAgICAgKiBCTFVFVE9PVEhfQ09FWElTVEVOQ0VfTU9ERV9ESVNBQkxFRAorICAgICAqIEJMVUVUT09USF9DT0VYSVNURU5DRV9NT0RFX1NFTlNFCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENNRF9TRVRfQkxVRVRPT1RIX0NPRVhJU1RFTkNFICAgICAgICA9IDc4OworICAgIC8qIEVuYWJsZS9kaXNhYmxlIGJsdWV0b290aCBzY2FuIG1vZGUKKyAgICAgKiB0cnVlKDEpCisgICAgICogZmFsc2UoMCkKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ01EX1NFVF9CTFVFVE9PVEhfU0NBTl9NT0RFICAgICAgICAgID0gNzk7CisgICAgLyogU2V0IG51bWJlciBvZiBhbGxvd2VkIGNoYW5uZWxzICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENNRF9TRVRfTlVNX0FMTE9XRURfQ0hBTk5FTFMgICAgICAgICA9IDgwOworICAgIC8qIFJlcXVlc3QgY29ubmVjdGl2aXR5IG1hbmFnZXIgd2FrZSBsb2NrIGJlZm9yZSBkcml2ZXIgc3RvcCAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTURfUkVRVUVTVF9DTV9XQUtFTE9DSyAgICAgICAgICAgICAgPSA4MTsKKyAgICAvKiBFbmFibGVzIFJTU0kgcG9sbCAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTURfRU5BQkxFX1JTU0lfUE9MTCAgICAgICAgICAgICAgICAgPSA4MjsKKyAgICAvKiBSU1NJIHBvbGwgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ01EX1JTU0lfUE9MTCAgICAgICAgICAgICAgICAgICAgICAgID0gODM7CisgICAgLyogR2V0IGN1cnJlbnQgUlNTSSAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTURfR0VUX1JTU0kgICAgICAgICAgICAgICAgICAgICAgICAgPSA4NDsKKyAgICAvKiBHZXQgYXBwcm94IGN1cnJlbnQgUlNTSSAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTURfR0VUX1JTU0lfQVBQUk9YICAgICAgICAgICAgICAgICAgPSA4NTsKKyAgICAvKiBHZXQgbGluayBzcGVlZCBvbiBjb25uZWN0aW9uICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENNRF9HRVRfTElOS19TUEVFRCAgICAgICAgICAgICAgICAgICA9IDg2OworICAgIC8qIFJhZGlvIG1hYyBhZGRyZXNzICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENNRF9HRVRfTUFDX0FERFIgICAgICAgICAgICAgICAgICAgICA9IDg3OworICAgIC8qIFNldCB1cCBwYWNrZXQgZmlsdGVyaW5nICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENNRF9TVEFSVF9QQUNLRVRfRklMVEVSSU5HICAgICAgICAgICA9IDg4OworICAgIC8qIENsZWFyIHBhY2tldCBmaWx0ZXIgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ01EX1NUT1BfUEFDS0VUX0ZJTFRFUklORyAgICAgICAgICAgID0gODk7CisgICAgLyogQ29ubmVjdCB0byBhIHNwZWNpZmllZCBuZXR3b3JrIChuZXR3b3JrIGlkCisgICAgICogb3IgV2lmaUNvbmZpZ3VyYXRpb24pIFRoaXMgaW52b2x2ZXMgaW5jcmVhc2luZworICAgICAqIHRoZSBwcmlvcml0eSBvZiB0aGUgbmV0d29yaywgZW5hYmxpbmcgdGhlIG5ldHdvcmsKKyAgICAgKiAod2hpbGUgZGlzYWJsaW5nIG90aGVycykgYW5kIGlzc3VpbmcgYSByZWNvbm5lY3QuCisgICAgICogTm90ZSB0aGF0IENNRF9SRUNPTk5FQ1QganVzdCBkb2VzIGEgcmVjb25uZWN0IHRvCisgICAgICogYW4gZXhpc3RpbmcgbmV0d29yay4gQWxsIHRoZSBuZXR3b3JrcyBnZXQgZW5hYmxlZAorICAgICAqIHVwb24gYSBzdWNjZXNzZnVsIGNvbm5lY3Rpb24gb3IgYSBmYWlsdXJlLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTURfQ09OTkVDVF9ORVRXT1JLICAgICAgICAgICAgICAgICAgPSA5MDsKKyAgICAvKiBTYXZlIHRoZSBzcGVjaWZpZWQgbmV0d29yay4gVGhpcyBpbnZvbHZlcyBhZGRpbmcKKyAgICAgKiBhbiBlbmFibGVkIG5ldHdvcmsgKGlmIG5ldykgYW5kIHVwZGF0aW5nIHRoZQorICAgICAqIGNvbmZpZyBhbmQgaXNzdWluZyBhIHNhdmUgb24gc3VwcGxpY2FudCBjb25maWcuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENNRF9TQVZFX05FVFdPUksgICAgICAgICAgICAgICAgICAgICA9IDkxOworICAgIC8qIERlbGV0ZSB0aGUgc3BlY2lmaWVkIG5ldHdvcmsuIFRoaXMgaW52b2x2ZXMKKyAgICAgKiByZW1vdmluZyB0aGUgbmV0d29yayBhbmQgaXNzdWluZyBhIHNhdmUgb24KKyAgICAgKiBzdXBwbGljYW50IGNvbmZpZy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ01EX0ZPUkdFVF9ORVRXT1JLICAgICAgICAgICAgICAgICAgID0gOTI7CisKKworCisgICAgLyoqCisgICAgICogSW50ZXJ2YWwgaW4gbWlsbGlzZWNvbmRzIGJldHdlZW4gcG9sbGluZyBmb3IgY29ubmVjdGlvbgorICAgICAqIHN0YXR1cyBpdGVtcyB0aGF0IGFyZSBub3Qgc2VudCB2aWEgYXN5bmNocm9ub3VzIGV2ZW50cy4KKyAgICAgKiBBbiBleGFtcGxlIGlzIFJTU0kgKHNpZ25hbCBzdHJlbmd0aCkuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBPTExfUlNTSV9JTlRFUlZBTF9NU0VDUyA9IDMwMDA7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ09OTkVDVF9NT0RFICAgPSAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTQ0FOX09OTFlfTU9ERSA9IDI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0NBTl9BQ1RJVkUgPSAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTQ0FOX1BBU1NJVkUgPSAyOworCisgICAgLyoqCisgICAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIHRpbWVzIHdlIHdpbGwgcmV0cnkgYSBjb25uZWN0aW9uIHRvIGFuIGFjY2VzcyBwb2ludAorICAgICAqIGZvciB3aGljaCB3ZSBoYXZlIGZhaWxlZCBpbiBhY3F1aXJpbmcgYW4gSVAgYWRkcmVzcyBmcm9tIERIQ1AuIEEgdmFsdWUgb2YKKyAgICAgKiBOIG1lYW5zIHRoYXQgd2Ugd2lsbCBtYWtlIE4rMSBjb25uZWN0aW9uIGF0dGVtcHRzIGluIGFsbC4KKyAgICAgKiA8cD4KKyAgICAgKiBTZWUge0BsaW5rIFNldHRpbmdzLlNlY3VyZSNXSUZJX01BWF9ESENQX1JFVFJZX0NPVU5UfS4gVGhpcyBpcyB0aGUgZGVmYXVsdAorICAgICAqIHZhbHVlIGlmIGEgU2V0dGluZ3MgdmFsdWUgaXMgbm90IHByZXNlbnQuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfTUFYX0RIQ1BfUkVUUklFUyA9IDk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRFJJVkVSX1BPV0VSX01PREVfQUNUSVZFID0gMTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRFJJVkVSX1BPV0VSX01PREVfQVVUTyA9IDA7CisKKyAgICAvKiBEZWZhdWx0IHBhcmVudCBzdGF0ZSAqLworICAgIHByaXZhdGUgSGllcmFyY2hpY2FsU3RhdGUgbURlZmF1bHRTdGF0ZSA9IG5ldyBEZWZhdWx0U3RhdGUoKTsKKyAgICAvKiBUZW1wb3JhcnkgaW5pdGlhbCBzdGF0ZSAqLworICAgIHByaXZhdGUgSGllcmFyY2hpY2FsU3RhdGUgbUluaXRpYWxTdGF0ZSA9IG5ldyBJbml0aWFsU3RhdGUoKTsKKyAgICAvKiBVbmxvYWRpbmcgdGhlIGRyaXZlciAqLworICAgIHByaXZhdGUgSGllcmFyY2hpY2FsU3RhdGUgbURyaXZlclVubG9hZGluZ1N0YXRlID0gbmV3IERyaXZlclVubG9hZGluZ1N0YXRlKCk7CisgICAgLyogTG9hZGluZyB0aGUgZHJpdmVyICovCisgICAgcHJpdmF0ZSBIaWVyYXJjaGljYWxTdGF0ZSBtRHJpdmVyVW5sb2FkZWRTdGF0ZSA9IG5ldyBEcml2ZXJVbmxvYWRlZFN0YXRlKCk7CisgICAgLyogRHJpdmVyIGxvYWQvdW5sb2FkIGZhaWxlZCAqLworICAgIHByaXZhdGUgSGllcmFyY2hpY2FsU3RhdGUgbURyaXZlckZhaWxlZFN0YXRlID0gbmV3IERyaXZlckZhaWxlZFN0YXRlKCk7CisgICAgLyogRHJpdmVyIGxvYWRpbmcgKi8KKyAgICBwcml2YXRlIEhpZXJhcmNoaWNhbFN0YXRlIG1Ecml2ZXJMb2FkaW5nU3RhdGUgPSBuZXcgRHJpdmVyTG9hZGluZ1N0YXRlKCk7CisgICAgLyogRHJpdmVyIGxvYWRlZCAqLworICAgIHByaXZhdGUgSGllcmFyY2hpY2FsU3RhdGUgbURyaXZlckxvYWRlZFN0YXRlID0gbmV3IERyaXZlckxvYWRlZFN0YXRlKCk7CisgICAgLyogRHJpdmVyIGxvYWRlZCwgd2FpdGluZyBmb3Igc3VwcGxpY2FudCB0byBzdGFydCAqLworICAgIHByaXZhdGUgSGllcmFyY2hpY2FsU3RhdGUgbVdhaXRGb3JTdXBTdGF0ZSA9IG5ldyBXYWl0Rm9yU3VwU3RhdGUoKTsKKworICAgIC8qIERyaXZlciBsb2FkZWQgYW5kIHN1cHBsaWNhbnQgcmVhZHkgKi8KKyAgICBwcml2YXRlIEhpZXJhcmNoaWNhbFN0YXRlIG1Ecml2ZXJTdXBSZWFkeVN0YXRlID0gbmV3IERyaXZlclN1cFJlYWR5U3RhdGUoKTsKKyAgICAvKiBEcml2ZXIgc3RhcnQgaXNzdWVkLCB3YWl0aW5nIGZvciBjb21wbGV0ZWQgZXZlbnQgKi8KKyAgICBwcml2YXRlIEhpZXJhcmNoaWNhbFN0YXRlIG1Ecml2ZXJTdGFydGluZ1N0YXRlID0gbmV3IERyaXZlclN0YXJ0aW5nU3RhdGUoKTsKKyAgICAvKiBEcml2ZXIgc3RhcnRlZCAqLworICAgIHByaXZhdGUgSGllcmFyY2hpY2FsU3RhdGUgbURyaXZlclN0YXJ0ZWRTdGF0ZSA9IG5ldyBEcml2ZXJTdGFydGVkU3RhdGUoKTsKKyAgICAvKiBEcml2ZXIgc3RvcHBpbmcgKi8KKyAgICBwcml2YXRlIEhpZXJhcmNoaWNhbFN0YXRlIG1Ecml2ZXJTdG9wcGluZ1N0YXRlID0gbmV3IERyaXZlclN0b3BwaW5nU3RhdGUoKTsKKyAgICAvKiBEcml2ZXIgc3RvcHBlZCAqLworICAgIHByaXZhdGUgSGllcmFyY2hpY2FsU3RhdGUgbURyaXZlclN0b3BwZWRTdGF0ZSA9IG5ldyBEcml2ZXJTdG9wcGVkU3RhdGUoKTsKKyAgICAvKiBTY2FuIGZvciBuZXR3b3Jrcywgbm8gY29ubmVjdGlvbiB3aWxsIGJlIGVzdGFibGlzaGVkICovCisgICAgcHJpdmF0ZSBIaWVyYXJjaGljYWxTdGF0ZSBtU2Nhbk1vZGVTdGF0ZSA9IG5ldyBTY2FuTW9kZVN0YXRlKCk7CisgICAgLyogQ29ubmVjdGluZyB0byBhbiBhY2Nlc3MgcG9pbnQgKi8KKyAgICBwcml2YXRlIEhpZXJhcmNoaWNhbFN0YXRlIG1Db25uZWN0TW9kZVN0YXRlID0gbmV3IENvbm5lY3RNb2RlU3RhdGUoKTsKKyAgICAvKiBGZXRjaGluZyBJUCBhZnRlciBuZXR3b3JrIGNvbm5lY3Rpb24gKGFzc29jK2F1dGggY29tcGxldGUpICovCisgICAgcHJpdmF0ZSBIaWVyYXJjaGljYWxTdGF0ZSBtQ29ubmVjdGluZ1N0YXRlID0gbmV3IENvbm5lY3RpbmdTdGF0ZSgpOworICAgIC8qIENvbm5lY3RlZCB3aXRoIElQIGFkZHIgKi8KKyAgICBwcml2YXRlIEhpZXJhcmNoaWNhbFN0YXRlIG1Db25uZWN0ZWRTdGF0ZSA9IG5ldyBDb25uZWN0ZWRTdGF0ZSgpOworICAgIC8qIGRpc2Nvbm5lY3QgaXNzdWVkLCB3YWl0aW5nIGZvciBuZXR3b3JrIGRpc2Nvbm5lY3QgY29uZmlybWF0aW9uICovCisgICAgcHJpdmF0ZSBIaWVyYXJjaGljYWxTdGF0ZSBtRGlzY29ubmVjdGluZ1N0YXRlID0gbmV3IERpc2Nvbm5lY3RpbmdTdGF0ZSgpOworICAgIC8qIE5ldHdvcmsgaXMgbm90IGNvbm5lY3RlZCwgc3VwcGxpY2FudCBhc3NvYythdXRoIGlzIG5vdCBjb21wbGV0ZSAqLworICAgIHByaXZhdGUgSGllcmFyY2hpY2FsU3RhdGUgbURpc2Nvbm5lY3RlZFN0YXRlID0gbmV3IERpc2Nvbm5lY3RlZFN0YXRlKCk7CisKKyAgICAvKiBTb2Z0IEFwIGlzIHJ1bm5pbmcgKi8KKyAgICBwcml2YXRlIEhpZXJhcmNoaWNhbFN0YXRlIG1Tb2Z0QXBTdGFydGVkU3RhdGUgPSBuZXcgU29mdEFwU3RhcnRlZFN0YXRlKCk7CisKKworICAgIC8qKgorICAgICAqIE9uZSBvZiAge0BsaW5rIFdpZmlNYW5hZ2VyI1dJRklfU1RBVEVfRElTQUJMRUR9LAorICAgICAqICAgICAgICAge0BsaW5rIFdpZmlNYW5hZ2VyI1dJRklfU1RBVEVfRElTQUJMSU5HfSwKKyAgICAgKiAgICAgICAgIHtAbGluayBXaWZpTWFuYWdlciNXSUZJX1NUQVRFX0VOQUJMRUR9LAorICAgICAqICAgICAgICAge0BsaW5rIFdpZmlNYW5hZ2VyI1dJRklfU1RBVEVfRU5BQkxJTkd9LAorICAgICAqICAgICAgICAge0BsaW5rIFdpZmlNYW5hZ2VyI1dJRklfU1RBVEVfVU5LTk9XTn0KKyAgICAgKgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgQXRvbWljSW50ZWdlciBtV2lmaVN0YXRlID0gbmV3IEF0b21pY0ludGVnZXIoV0lGSV9TVEFURV9ESVNBQkxFRCk7CisKKyAgICAvKioKKyAgICAgKiBPbmUgb2YgIHtAbGluayBXaWZpTWFuYWdlciNXSUZJX0FQX1NUQVRFX0RJU0FCTEVEfSwKKyAgICAgKiAgICAgICAgIHtAbGluayBXaWZpTWFuYWdlciNXSUZJX0FQX1NUQVRFX0RJU0FCTElOR30sCisgICAgICogICAgICAgICB7QGxpbmsgV2lmaU1hbmFnZXIjV0lGSV9BUF9TVEFURV9FTkFCTEVEfSwKKyAgICAgKiAgICAgICAgIHtAbGluayBXaWZpTWFuYWdlciNXSUZJX0FQX1NUQVRFX0VOQUJMSU5HfSwKKyAgICAgKiAgICAgICAgIHtAbGluayBXaWZpTWFuYWdlciNXSUZJX0FQX1NUQVRFX0ZBSUxFRH0KKyAgICAgKgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgQXRvbWljSW50ZWdlciBtV2lmaUFwU3RhdGUgPSBuZXcgQXRvbWljSW50ZWdlcihXSUZJX0FQX1NUQVRFX0RJU0FCTEVEKTsKKworICAgIHByaXZhdGUgZmluYWwgQXRvbWljSW50ZWdlciBtTGFzdEVuYWJsZVVpZCA9IG5ldyBBdG9taWNJbnRlZ2VyKFByb2Nlc3MubXlVaWQoKSk7CisgICAgcHJpdmF0ZSBmaW5hbCBBdG9taWNJbnRlZ2VyIG1MYXN0QXBFbmFibGVVaWQgPSBuZXcgQXRvbWljSW50ZWdlcihQcm9jZXNzLm15VWlkKCkpOworCisgICAgcHJpdmF0ZSBmaW5hbCBJQmF0dGVyeVN0YXRzIG1CYXR0ZXJ5U3RhdHM7CisKKyAgICBwdWJsaWMgV2lmaVN0YXRlTWFjaGluZShDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgc3VwZXIoVEFHKTsKKworICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CisKKyAgICAgICAgbU5ldHdvcmtJbmZvID0gbmV3IE5ldHdvcmtJbmZvKENvbm5lY3Rpdml0eU1hbmFnZXIuVFlQRV9XSUZJLCAwLCBORVRXT1JLVFlQRSwgIiIpOworICAgICAgICBtQmF0dGVyeVN0YXRzID0gSUJhdHRlcnlTdGF0cy5TdHViLmFzSW50ZXJmYWNlKFNlcnZpY2VNYW5hZ2VyLmdldFNlcnZpY2UoImJhdHRlcnlpbmZvIikpOworCisgICAgICAgIElCaW5kZXIgYiA9IFNlcnZpY2VNYW5hZ2VyLmdldFNlcnZpY2UoQ29udGV4dC5ORVRXT1JLTUFOQUdFTUVOVF9TRVJWSUNFKTsKKyAgICAgICAgbndTZXJ2aWNlID0gSU5ldHdvcmtNYW5hZ2VtZW50U2VydmljZS5TdHViLmFzSW50ZXJmYWNlKGIpOworCisgICAgICAgIG1XaWZpTW9uaXRvciA9IG5ldyBXaWZpTW9uaXRvcih0aGlzKTsKKyAgICAgICAgbURoY3BJbmZvID0gbmV3IERoY3BJbmZvKCk7CisgICAgICAgIG1XaWZpSW5mbyA9IG5ldyBXaWZpSW5mbygpOworICAgICAgICBtSW50ZXJmYWNlTmFtZSA9IFN5c3RlbVByb3BlcnRpZXMuZ2V0KCJ3aWZpLmludGVyZmFjZSIsICJ0aXdsYW4wIik7CisgICAgICAgIG1TdXBwbGljYW50U3RhdGVUcmFja2VyID0gbmV3IFN1cHBsaWNhbnRTdGF0ZVRyYWNrZXIoY29udGV4dCwgZ2V0SGFuZGxlcigpKTsKKworICAgICAgICBtQmx1ZXRvb3RoSGVhZHNldCA9IG5ldyBCbHVldG9vdGhIZWFkc2V0KG1Db250ZXh0LCBudWxsKTsKKyAgICAgICAgbU5ldHdvcmtQcm9wZXJ0aWVzID0gbmV3IE5ldHdvcmtQcm9wZXJ0aWVzKCk7CisKKyAgICAgICAgbU5ldHdvcmtJbmZvLnNldElzQXZhaWxhYmxlKGZhbHNlKTsKKyAgICAgICAgbU5ldHdvcmtQcm9wZXJ0aWVzLmNsZWFyKCk7CisgICAgICAgIG1MYXN0QnNzaWQgPSBudWxsOworICAgICAgICBtTGFzdE5ldHdvcmtJZCA9IC0xOworICAgICAgICBtTGFzdFNpZ25hbExldmVsID0gLTE7CisKKyAgICAgICAgbVNjYW5SZXN1bHRDYWNoZSA9IG5ldyBMaW5rZWRIYXNoTWFwPFN0cmluZywgU2NhblJlc3VsdD4oCisgICAgICAgICAgICBTQ0FOX1JFU1VMVF9DQUNIRV9TSVpFLCAwLjc1ZiwgdHJ1ZSkgeworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogTGltaXQgdGhlIGNhY2hlIHNpemUgYnkgU0NBTl9SRVNVTFRfQ0FDSEVfU0laRQorICAgICAgICAgICAgICAgICAqIGVsZW1lbnRzCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlRWxkZXN0RW50cnkoTWFwLkVudHJ5IGVsZGVzdCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gU0NBTl9SRVNVTFRfQ0FDSEVfU0laRSA8IHRoaXMuc2l6ZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICBtU2V0dGluZ3NPYnNlcnZlciA9IG5ldyBTZXR0aW5nc09ic2VydmVyKG5ldyBIYW5kbGVyKCkpOworCisgICAgICAgIFBvd2VyTWFuYWdlciBwb3dlck1hbmFnZXIgPSAoUG93ZXJNYW5hZ2VyKW1Db250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5QT1dFUl9TRVJWSUNFKTsKKyAgICAgICAgc1dha2VMb2NrID0gcG93ZXJNYW5hZ2VyLm5ld1dha2VMb2NrKFBvd2VyTWFuYWdlci5QQVJUSUFMX1dBS0VfTE9DSywgVEFHKTsKKworICAgICAgICBhZGRTdGF0ZShtRGVmYXVsdFN0YXRlKTsKKyAgICAgICAgICAgIGFkZFN0YXRlKG1Jbml0aWFsU3RhdGUsIG1EZWZhdWx0U3RhdGUpOworICAgICAgICAgICAgYWRkU3RhdGUobURyaXZlclVubG9hZGluZ1N0YXRlLCBtRGVmYXVsdFN0YXRlKTsKKyAgICAgICAgICAgIGFkZFN0YXRlKG1Ecml2ZXJVbmxvYWRlZFN0YXRlLCBtRGVmYXVsdFN0YXRlKTsKKyAgICAgICAgICAgICAgICBhZGRTdGF0ZShtRHJpdmVyRmFpbGVkU3RhdGUsIG1Ecml2ZXJVbmxvYWRlZFN0YXRlKTsKKyAgICAgICAgICAgIGFkZFN0YXRlKG1Ecml2ZXJMb2FkaW5nU3RhdGUsIG1EZWZhdWx0U3RhdGUpOworICAgICAgICAgICAgYWRkU3RhdGUobURyaXZlckxvYWRlZFN0YXRlLCBtRGVmYXVsdFN0YXRlKTsKKyAgICAgICAgICAgICAgICBhZGRTdGF0ZShtV2FpdEZvclN1cFN0YXRlLCBtRHJpdmVyTG9hZGVkU3RhdGUpOworICAgICAgICAgICAgYWRkU3RhdGUobURyaXZlclN1cFJlYWR5U3RhdGUsIG1EZWZhdWx0U3RhdGUpOworICAgICAgICAgICAgICAgIGFkZFN0YXRlKG1Ecml2ZXJTdGFydGluZ1N0YXRlLCBtRHJpdmVyU3VwUmVhZHlTdGF0ZSk7CisgICAgICAgICAgICAgICAgYWRkU3RhdGUobURyaXZlclN0YXJ0ZWRTdGF0ZSwgbURyaXZlclN1cFJlYWR5U3RhdGUpOworICAgICAgICAgICAgICAgICAgICBhZGRTdGF0ZShtU2Nhbk1vZGVTdGF0ZSwgbURyaXZlclN0YXJ0ZWRTdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgIGFkZFN0YXRlKG1Db25uZWN0TW9kZVN0YXRlLCBtRHJpdmVyU3RhcnRlZFN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkZFN0YXRlKG1Db25uZWN0aW5nU3RhdGUsIG1Db25uZWN0TW9kZVN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkZFN0YXRlKG1Db25uZWN0ZWRTdGF0ZSwgbUNvbm5lY3RNb2RlU3RhdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgYWRkU3RhdGUobURpc2Nvbm5lY3RpbmdTdGF0ZSwgbUNvbm5lY3RNb2RlU3RhdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgYWRkU3RhdGUobURpc2Nvbm5lY3RlZFN0YXRlLCBtQ29ubmVjdE1vZGVTdGF0ZSk7CisgICAgICAgICAgICAgICAgYWRkU3RhdGUobURyaXZlclN0b3BwaW5nU3RhdGUsIG1Ecml2ZXJTdXBSZWFkeVN0YXRlKTsKKyAgICAgICAgICAgICAgICBhZGRTdGF0ZShtRHJpdmVyU3RvcHBlZFN0YXRlLCBtRHJpdmVyU3VwUmVhZHlTdGF0ZSk7CisgICAgICAgICAgICBhZGRTdGF0ZShtU29mdEFwU3RhcnRlZFN0YXRlLCBtRGVmYXVsdFN0YXRlKTsKKworICAgICAgICBzZXRJbml0aWFsU3RhdGUobUluaXRpYWxTdGF0ZSk7CisKKyAgICAgICAgaWYgKERCRykgc2V0RGJnKHRydWUpOworCisgICAgICAgIC8vc3RhcnQgdGhlIHN0YXRlIG1hY2hpbmUKKyAgICAgICAgc3RhcnQoKTsKKyAgICB9CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICogTWV0aG9kcyBleHBvc2VkIGZvciBwdWJsaWMgdXNlCisgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgLyoqCisgICAgICogVE9ETzogZG9jCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gc3luY1BpbmdTdXBwbGljYW50KCkgeworICAgICAgICByZXR1cm4gc2VuZFN5bmNNZXNzYWdlKENNRF9QSU5HX1NVUFBMSUNBTlQpLmJvb2xWYWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUT0RPOiBkb2MKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdGFydFNjYW4oYm9vbGVhbiBmb3JjZUFjdGl2ZSkgeworICAgICAgICBzZW5kTWVzc2FnZShvYnRhaW5NZXNzYWdlKENNRF9TVEFSVF9TQ0FOLCBmb3JjZUFjdGl2ZSA/CisgICAgICAgICAgICAgICAgU0NBTl9BQ1RJVkUgOiBTQ0FOX1BBU1NJVkUsIDApKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUT0RPOiBkb2MKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRXaWZpRW5hYmxlZChib29sZWFuIGVuYWJsZSkgeworICAgICAgICBtTGFzdEVuYWJsZVVpZC5zZXQoQmluZGVyLmdldENhbGxpbmdVaWQoKSk7CisgICAgICAgIGlmIChlbmFibGUpIHsKKyAgICAgICAgICAgIC8qIEFyZ3VtZW50IGlzIHRoZSBzdGF0ZSB0aGF0IGlzIGVudGVyZWQgcHJpb3IgdG8gbG9hZCAqLworICAgICAgICAgICAgc2VuZE1lc3NhZ2Uob2J0YWluTWVzc2FnZShDTURfTE9BRF9EUklWRVIsIFdJRklfU1RBVEVfRU5BQkxJTkcsIDApKTsKKyAgICAgICAgICAgIHNlbmRNZXNzYWdlKENNRF9TVEFSVF9TVVBQTElDQU5UKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNlbmRNZXNzYWdlKENNRF9TVE9QX1NVUFBMSUNBTlQpOworICAgICAgICAgICAgLyogQXJndW1lbnQgaXMgdGhlIHN0YXRlIHRoYXQgaXMgZW50ZXJlZCB1cG9uIHN1Y2Nlc3MgKi8KKyAgICAgICAgICAgIHNlbmRNZXNzYWdlKG9idGFpbk1lc3NhZ2UoQ01EX1VOTE9BRF9EUklWRVIsIFdJRklfU1RBVEVfRElTQUJMRUQsIDApKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRPRE86IGRvYworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFdpZmlBcEVuYWJsZWQoV2lmaUNvbmZpZ3VyYXRpb24gd2lmaUNvbmZpZywgYm9vbGVhbiBlbmFibGUpIHsKKyAgICAgICAgbUxhc3RBcEVuYWJsZVVpZC5zZXQoQmluZGVyLmdldENhbGxpbmdVaWQoKSk7CisgICAgICAgIGlmIChlbmFibGUpIHsKKyAgICAgICAgICAgIC8qIEFyZ3VtZW50IGlzIHRoZSBzdGF0ZSB0aGF0IGlzIGVudGVyZWQgcHJpb3IgdG8gbG9hZCAqLworICAgICAgICAgICAgc2VuZE1lc3NhZ2Uob2J0YWluTWVzc2FnZShDTURfTE9BRF9EUklWRVIsIFdJRklfQVBfU1RBVEVfRU5BQkxJTkcsIDApKTsKKyAgICAgICAgICAgIHNlbmRNZXNzYWdlKG9idGFpbk1lc3NhZ2UoQ01EX1NUQVJUX0FQLCB3aWZpQ29uZmlnKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzZW5kTWVzc2FnZShDTURfU1RPUF9BUCk7CisgICAgICAgICAgICAvKiBBcmd1bWVudCBpcyB0aGUgc3RhdGUgdGhhdCBpcyBlbnRlcmVkIHVwb24gc3VjY2VzcyAqLworICAgICAgICAgICAgc2VuZE1lc3NhZ2Uob2J0YWluTWVzc2FnZShDTURfVU5MT0FEX0RSSVZFUiwgV0lGSV9BUF9TVEFURV9ESVNBQkxFRCwgMCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVE9ETzogZG9jCisgICAgICovCisgICAgcHVibGljIGludCBzeW5jR2V0V2lmaVN0YXRlKCkgeworICAgICAgICByZXR1cm4gbVdpZmlTdGF0ZS5nZXQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUT0RPOiBkb2MKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHN5bmNHZXRXaWZpU3RhdGVCeU5hbWUoKSB7CisgICAgICAgIHN3aXRjaCAobVdpZmlTdGF0ZS5nZXQoKSkgeworICAgICAgICAgICAgY2FzZSBXSUZJX1NUQVRFX0RJU0FCTElORzoKKyAgICAgICAgICAgICAgICByZXR1cm4gImRpc2FibGluZyI7CisgICAgICAgICAgICBjYXNlIFdJRklfU1RBVEVfRElTQUJMRUQ6CisgICAgICAgICAgICAgICAgcmV0dXJuICJkaXNhYmxlZCI7CisgICAgICAgICAgICBjYXNlIFdJRklfU1RBVEVfRU5BQkxJTkc6CisgICAgICAgICAgICAgICAgcmV0dXJuICJlbmFibGluZyI7CisgICAgICAgICAgICBjYXNlIFdJRklfU1RBVEVfRU5BQkxFRDoKKyAgICAgICAgICAgICAgICByZXR1cm4gImVuYWJsZWQiOworICAgICAgICAgICAgY2FzZSBXSUZJX1NUQVRFX1VOS05PV046CisgICAgICAgICAgICAgICAgcmV0dXJuICJ1bmtub3duIHN0YXRlIjsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuICJbaW52YWxpZCBzdGF0ZV0iOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVE9ETzogZG9jCisgICAgICovCisgICAgcHVibGljIGludCBzeW5jR2V0V2lmaUFwU3RhdGUoKSB7CisgICAgICAgIHJldHVybiBtV2lmaUFwU3RhdGUuZ2V0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVE9ETzogZG9jCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBzeW5jR2V0V2lmaUFwU3RhdGVCeU5hbWUoKSB7CisgICAgICAgIHN3aXRjaCAobVdpZmlBcFN0YXRlLmdldCgpKSB7CisgICAgICAgICAgICBjYXNlIFdJRklfQVBfU1RBVEVfRElTQUJMSU5HOgorICAgICAgICAgICAgICAgIHJldHVybiAiZGlzYWJsaW5nIjsKKyAgICAgICAgICAgIGNhc2UgV0lGSV9BUF9TVEFURV9ESVNBQkxFRDoKKyAgICAgICAgICAgICAgICByZXR1cm4gImRpc2FibGVkIjsKKyAgICAgICAgICAgIGNhc2UgV0lGSV9BUF9TVEFURV9FTkFCTElORzoKKyAgICAgICAgICAgICAgICByZXR1cm4gImVuYWJsaW5nIjsKKyAgICAgICAgICAgIGNhc2UgV0lGSV9BUF9TVEFURV9FTkFCTEVEOgorICAgICAgICAgICAgICAgIHJldHVybiAiZW5hYmxlZCI7CisgICAgICAgICAgICBjYXNlIFdJRklfQVBfU1RBVEVfRkFJTEVEOgorICAgICAgICAgICAgICAgIHJldHVybiAiZmFpbGVkIjsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuICJbaW52YWxpZCBzdGF0ZV0iOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHN0YXR1cyBpbmZvcm1hdGlvbiBmb3IgdGhlIGN1cnJlbnQgY29ubmVjdGlvbiwgaWYgYW55LgorICAgICAqIEByZXR1cm4gYSB7QGxpbmsgV2lmaUluZm99IG9iamVjdCBjb250YWluaW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjdXJyZW50IGNvbm5lY3Rpb24KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBXaWZpSW5mbyBzeW5jUmVxdWVzdENvbm5lY3Rpb25JbmZvKCkgeworICAgICAgICByZXR1cm4gbVdpZmlJbmZvOworICAgIH0KKworICAgIHB1YmxpYyBEaGNwSW5mbyBzeW5jR2V0RGhjcEluZm8oKSB7CisgICAgICAgIHJldHVybiBtRGhjcEluZm87CisgICAgfQorCisgICAgLyoqCisgICAgICogVE9ETzogZG9jCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RHJpdmVyU3RhcnQoYm9vbGVhbiBlbmFibGUpIHsKKyAgICAgIGlmIChlbmFibGUpIHsKKyAgICAgICAgICBzZW5kTWVzc2FnZShDTURfU1RBUlRfRFJJVkVSKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICAgc2VuZE1lc3NhZ2UoQ01EX1NUT1BfRFJJVkVSKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUT0RPOiBkb2MKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTY2FuT25seU1vZGUoYm9vbGVhbiBlbmFibGUpIHsKKyAgICAgIGlmIChlbmFibGUpIHsKKyAgICAgICAgICBzZW5kTWVzc2FnZShvYnRhaW5NZXNzYWdlKENNRF9TRVRfU0NBTl9NT0RFLCBTQ0FOX09OTFlfTU9ERSwgMCkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBzZW5kTWVzc2FnZShvYnRhaW5NZXNzYWdlKENNRF9TRVRfU0NBTl9NT0RFLCBDT05ORUNUX01PREUsIDApKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUT0RPOiBkb2MKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTY2FuVHlwZShib29sZWFuIGFjdGl2ZSkgeworICAgICAgaWYgKGFjdGl2ZSkgeworICAgICAgICAgIHNlbmRNZXNzYWdlKG9idGFpbk1lc3NhZ2UoQ01EX1NFVF9TQ0FOX1RZUEUsIFNDQU5fQUNUSVZFLCAwKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICAgIHNlbmRNZXNzYWdlKG9idGFpbk1lc3NhZ2UoQ01EX1NFVF9TQ0FOX1RZUEUsIFNDQU5fUEFTU0lWRSwgMCkpOworICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRPRE86IGRvYworICAgICAqLworICAgIHB1YmxpYyBMaXN0PFNjYW5SZXN1bHQ+IHN5bmNHZXRTY2FuUmVzdWx0c0xpc3QoKSB7CisgICAgICAgIHJldHVybiBtU2NhblJlc3VsdHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGlzY29ubmVjdCBmcm9tIEFjY2VzcyBQb2ludAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGRpc2Nvbm5lY3RDb21tYW5kKCkgeworICAgICAgICBzZW5kTWVzc2FnZShDTURfRElTQ09OTkVDVCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5pdGlhdGUgYSByZWNvbm5lY3Rpb24gdG8gQVAKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZWNvbm5lY3RDb21tYW5kKCkgeworICAgICAgICBzZW5kTWVzc2FnZShDTURfUkVDT05ORUNUKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbml0aWF0ZSBhIHJlLWFzc29jaWF0aW9uIHRvIEFQCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVhc3NvY2lhdGVDb21tYW5kKCkgeworICAgICAgICBzZW5kTWVzc2FnZShDTURfUkVBU1NPQ0lBVEUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhIG5ldHdvcmsgc3luY2hyb25vdXNseQorICAgICAqCisgICAgICogQHJldHVybiBuZXR3b3JrIGlkIG9mIHRoZSBuZXcgbmV0d29yaworICAgICAqLworICAgIHB1YmxpYyBpbnQgc3luY0FkZE9yVXBkYXRlTmV0d29yayhXaWZpQ29uZmlndXJhdGlvbiBjb25maWcpIHsKKyAgICAgICAgcmV0dXJuIHNlbmRTeW5jTWVzc2FnZShDTURfQUREX09SX1VQREFURV9ORVRXT1JLLCBjb25maWcpLmludFZhbHVlOworICAgIH0KKworICAgIHB1YmxpYyBMaXN0PFdpZmlDb25maWd1cmF0aW9uPiBzeW5jR2V0Q29uZmlndXJlZE5ldHdvcmtzKCkgeworICAgICAgICBMaXN0PFdpZmlDb25maWd1cmF0aW9uPiBuZXR3b3JrcyA9IG5ldyBBcnJheUxpc3Q8V2lmaUNvbmZpZ3VyYXRpb24+KCk7CisgICAgICAgIHN5bmNocm9uaXplZCAobUNvbmZpZ3VyZWROZXR3b3JrcykgeworICAgICAgICAgICAgSXRlcmF0b3I8V2lmaUNvbmZpZ3VyYXRpb24+IGl0ZXJhdG9yID0gbUNvbmZpZ3VyZWROZXR3b3Jrcy5pdGVyYXRvcigpOworICAgICAgICAgICAgd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgbmV0d29ya3MuYWRkKGl0ZXJhdG9yLm5leHQoKS5jbG9uZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV0d29ya3M7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVsZXRlIGEgbmV0d29yaworICAgICAqCisgICAgICogQHBhcmFtIG5ldHdvcmtJZCBpZCBvZiB0aGUgbmV0d29yayB0byBiZSByZW1vdmVkCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gc3luY1JlbW92ZU5ldHdvcmsoaW50IG5ldHdvcmtJZCkgeworICAgICAgICByZXR1cm4gc2VuZFN5bmNNZXNzYWdlKG9idGFpbk1lc3NhZ2UoQ01EX1JFTU9WRV9ORVRXT1JLLCBuZXR3b3JrSWQsIDApKS5ib29sVmFsdWU7CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBFbmFibGVOZXRQYXJhbXMgeworICAgICAgICBwcml2YXRlIGludCBuZXRJZDsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIGRpc2FibGVPdGhlcnM7CisgICAgICAgIEVuYWJsZU5ldFBhcmFtcyhpbnQgbiwgYm9vbGVhbiBiKSB7CisgICAgICAgICAgICBuZXRJZCA9IG47CisgICAgICAgICAgICBkaXNhYmxlT3RoZXJzID0gYjsKKyAgICAgICAgfQorICAgIH0KKyAgICAvKioKKyAgICAgKiBFbmFibGUgYSBuZXR3b3JrCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmV0SWQgbmV0d29yayBpZCBvZiB0aGUgbmV0d29yaworICAgICAqIEBwYXJhbSBkaXNhYmxlT3RoZXJzIHRydWUsIGlmIGFsbCBvdGhlciBuZXR3b3JrcyBoYXZlIHRvIGJlIGRpc2FibGVkCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcywge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBzeW5jRW5hYmxlTmV0d29yayhpbnQgbmV0SWQsIGJvb2xlYW4gZGlzYWJsZU90aGVycykgeworICAgICAgICByZXR1cm4gc2VuZFN5bmNNZXNzYWdlKENNRF9FTkFCTEVfTkVUV09SSywKKyAgICAgICAgICAgICAgICBuZXcgRW5hYmxlTmV0UGFyYW1zKG5ldElkLCBkaXNhYmxlT3RoZXJzKSkuYm9vbFZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIERpc2FibGUgYSBuZXR3b3JrCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmV0SWQgbmV0d29yayBpZCBvZiB0aGUgbmV0d29yaworICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gc3luY0Rpc2FibGVOZXR3b3JrKGludCBuZXRJZCkgeworICAgICAgICByZXR1cm4gc2VuZFN5bmNNZXNzYWdlKG9idGFpbk1lc3NhZ2UoQ01EX0RJU0FCTEVfTkVUV09SSywgbmV0SWQsIDApKS5ib29sVmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQmxhY2tsaXN0IGEgQlNTSUQuIFRoaXMgd2lsbCBhdm9pZCB0aGUgQVAgaWYgdGhlcmUgYXJlCisgICAgICogYWx0ZXJuYXRlIEFQcyB0byBjb25uZWN0CisgICAgICoKKyAgICAgKiBAcGFyYW0gYnNzaWQgQlNTSUQgb2YgdGhlIG5ldHdvcmsKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRUb0JsYWNrbGlzdChTdHJpbmcgYnNzaWQpIHsKKyAgICAgICAgc2VuZE1lc3NhZ2Uob2J0YWluTWVzc2FnZShDTURfQkxBQ0tMSVNUX05FVFdPUkssIGJzc2lkKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xlYXIgdGhlIGJsYWNrbGlzdCBsaXN0CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjbGVhckJsYWNrbGlzdCgpIHsKKyAgICAgICAgc2VuZE1lc3NhZ2Uob2J0YWluTWVzc2FnZShDTURfQ0xFQVJfQkxBQ0tMSVNUKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY29ubmVjdE5ldHdvcmsoaW50IG5ldElkKSB7CisgICAgICAgIHNlbmRNZXNzYWdlKG9idGFpbk1lc3NhZ2UoQ01EX0NPTk5FQ1RfTkVUV09SSywgbmV0SWQsIDApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjb25uZWN0TmV0d29yayhXaWZpQ29uZmlndXJhdGlvbiB3aWZpQ29uZmlnKSB7CisgICAgICAgIHNlbmRNZXNzYWdlKG9idGFpbk1lc3NhZ2UoQ01EX0NPTk5FQ1RfTkVUV09SSywgd2lmaUNvbmZpZykpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNhdmVOZXR3b3JrKFdpZmlDb25maWd1cmF0aW9uIHdpZmlDb25maWcpIHsKKyAgICAgICAgc2VuZE1lc3NhZ2Uob2J0YWluTWVzc2FnZShDTURfU0FWRV9ORVRXT1JLLCB3aWZpQ29uZmlnKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZm9yZ2V0TmV0d29yayhpbnQgbmV0SWQpIHsKKyAgICAgICAgc2VuZE1lc3NhZ2Uob2J0YWluTWVzc2FnZShDTURfRk9SR0VUX05FVFdPUkssIG5ldElkLCAwKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZW5hYmxlUnNzaVBvbGxpbmcoYm9vbGVhbiBlbmFibGVkKSB7CisgICAgICAgc2VuZE1lc3NhZ2Uob2J0YWluTWVzc2FnZShDTURfRU5BQkxFX1JTU0lfUE9MTCwgZW5hYmxlZCA/IDEgOiAwLCAwKSk7CisgICAgfQorICAgIC8qKgorICAgICAqIEdldCBSU1NJIHRvIGN1cnJlbnRseSBjb25uZWN0ZWQgbmV0d29yaworICAgICAqCisgICAgICogQHJldHVybiBSU1NJIHZhbHVlLCAtMSBvbiBmYWlsdXJlCisgICAgICovCisgICAgcHVibGljIGludCBzeW5jR2V0UnNzaSgpIHsKKyAgICAgICAgcmV0dXJuIHNlbmRTeW5jTWVzc2FnZShDTURfR0VUX1JTU0kpLmludFZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBhcHByb3ggUlNTSSB0byBjdXJyZW50bHkgY29ubmVjdGVkIG5ldHdvcmsKKyAgICAgKgorICAgICAqIEByZXR1cm4gUlNTSSB2YWx1ZSwgLTEgb24gZmFpbHVyZQorICAgICAqLworICAgIHB1YmxpYyBpbnQgc3luY0dldFJzc2lBcHByb3goKSB7CisgICAgICAgIHJldHVybiBzZW5kU3luY01lc3NhZ2UoQ01EX0dFVF9SU1NJX0FQUFJPWCkuaW50VmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGxpbmsgc3BlZWQgdG8gY3VycmVudGx5IGNvbm5lY3RlZCBuZXR3b3JrCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGxpbmsgc3BlZWQsIC0xIG9uIGZhaWx1cmUKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IHN5bmNHZXRMaW5rU3BlZWQoKSB7CisgICAgICAgIHJldHVybiBzZW5kU3luY01lc3NhZ2UoQ01EX0dFVF9MSU5LX1NQRUVEKS5pbnRWYWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgTUFDIGFkZHJlc3Mgb2YgcmFkaW8KKyAgICAgKgorICAgICAqIEByZXR1cm4gTUFDIGFkZHJlc3MsIG51bGwgb24gZmFpbHVyZQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgc3luY0dldE1hY0FkZHJlc3MoKSB7CisgICAgICAgIHJldHVybiBzZW5kU3luY01lc3NhZ2UoQ01EX0dFVF9NQUNfQUREUikuc3RyaW5nVmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RhcnQgcGFja2V0IGZpbHRlcmluZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0YXJ0UGFja2V0RmlsdGVyaW5nKCkgeworICAgICAgICBzZW5kTWVzc2FnZShDTURfU1RBUlRfUEFDS0VUX0ZJTFRFUklORyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RvcCBwYWNrZXQgZmlsdGVyaW5nCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RvcFBhY2tldEZpbHRlcmluZygpIHsKKyAgICAgICAgc2VuZE1lc3NhZ2UoQ01EX1NUT1BfUEFDS0VUX0ZJTFRFUklORyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHBvd2VyIG1vZGUKKyAgICAgKiBAcGFyYW0gbW9kZQorICAgICAqICAgICBEUklWRVJfUE9XRVJfTU9ERV9BVVRPCisgICAgICogICAgIERSSVZFUl9QT1dFUl9NT0RFX0FDVElWRQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFBvd2VyTW9kZShpbnQgbW9kZSkgeworICAgICAgICBzZW5kTWVzc2FnZShvYnRhaW5NZXNzYWdlKENNRF9TRVRfUE9XRVJfTU9ERSwgbW9kZSwgMCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgbnVtYmVyIG9mIGFsbG93ZWQgcmFkaW8gZnJlcXVlbmN5IGNoYW5uZWxzIGZyb20gdGhlIHN5c3RlbQorICAgICAqIHNldHRpbmcgdmFsdWUsIGlmIGFueS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXROdW1BbGxvd2VkQ2hhbm5lbHMoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzZXROdW1BbGxvd2VkQ2hhbm5lbHMoCisgICAgICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5nZXRJbnQobUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCksCisgICAgICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5XSUZJX05VTV9BTExPV0VEX0NIQU5ORUxTKSk7CisgICAgICAgIH0gY2F0Y2ggKFNldHRpbmdzLlNldHRpbmdOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBpZiAobU51bUFsbG93ZWRDaGFubmVscyAhPSAwKSB7CisgICAgICAgICAgICAgICAgc2V0TnVtQWxsb3dlZENoYW5uZWxzKG1OdW1BbGxvd2VkQ2hhbm5lbHMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gb3RoZXJ3aXNlLCB1c2UgdGhlIGRyaXZlciBkZWZhdWx0CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIG51bWJlciBvZiByYWRpbyBmcmVxdWVuY3kgY2hhbm5lbHMgdGhhdCBhcmUgYWxsb3dlZCB0byBiZSB1c2VkCisgICAgICogaW4gdGhlIGN1cnJlbnQgcmVndWxhdG9yeSBkb21haW4uCisgICAgICogQHBhcmFtIG51bUNoYW5uZWxzIHRoZSBudW1iZXIgb2YgYWxsb3dlZCBjaGFubmVscy4gTXVzdCBiZSBncmVhdGVyIHRoYW4gMAorICAgICAqIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gMTYuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TnVtQWxsb3dlZENoYW5uZWxzKGludCBudW1DaGFubmVscykgeworICAgICAgICBzZW5kTWVzc2FnZShvYnRhaW5NZXNzYWdlKENNRF9TRVRfTlVNX0FMTE9XRURfQ0hBTk5FTFMsIG51bUNoYW5uZWxzLCAwKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IG51bWJlciBvZiBhbGxvd2VkIGNoYW5uZWxzCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGNoYW5uZWwgY291bnQsIC0xIG9uIGZhaWx1cmUKKyAgICAgKgorICAgICAqIFRPRE86IHRoaXMgaXMgbm90IGEgcHVibGljIEFQSSBhbmQgbmVlZHMgdG8gYmUgcmVtb3ZlZCBpbiBmYXZvcgorICAgICAqIG9mIGFzeW5jaHJvbm91cyByZXBvcnRpbmcuIHVudXNlZCBmb3Igbm93LgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0TnVtQWxsb3dlZENoYW5uZWxzKCkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IGJsdWV0b290aCBjb2V4IG1vZGU6CisgICAgICoKKyAgICAgKiBAcGFyYW0gbW9kZQorICAgICAqICBCTFVFVE9PVEhfQ09FWElTVEVOQ0VfTU9ERV9FTkFCTEVECisgICAgICogIEJMVUVUT09USF9DT0VYSVNURU5DRV9NT0RFX0RJU0FCTEVECisgICAgICogIEJMVUVUT09USF9DT0VYSVNURU5DRV9NT0RFX1NFTlNFCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Qmx1ZXRvb3RoQ29leGlzdGVuY2VNb2RlKGludCBtb2RlKSB7CisgICAgICAgIHNlbmRNZXNzYWdlKG9idGFpbk1lc3NhZ2UoQ01EX1NFVF9CTFVFVE9PVEhfQ09FWElTVEVOQ0UsIG1vZGUsIDApKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbmFibGUgb3IgZGlzYWJsZSBCbHVldG9vdGggY29leGlzdGVuY2Ugc2NhbiBtb2RlLiBXaGVuIHRoaXMgbW9kZSBpcyBvbiwKKyAgICAgKiBzb21lIG9mIHRoZSBsb3ctbGV2ZWwgc2NhbiBwYXJhbWV0ZXJzIHVzZWQgYnkgdGhlIGRyaXZlciBhcmUgY2hhbmdlZCB0bworICAgICAqIHJlZHVjZSBpbnRlcmZlcmVuY2Ugd2l0aCBBMkRQIHN0cmVhbWluZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpc0JsdWV0b290aFBsYXlpbmcgd2hldGhlciB0byBlbmFibGUgb3IgZGlzYWJsZSB0aGlzIG1vZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRCbHVldG9vdGhTY2FuTW9kZShib29sZWFuIGlzQmx1ZXRvb3RoUGxheWluZykgeworICAgICAgICBzZW5kTWVzc2FnZShvYnRhaW5NZXNzYWdlKENNRF9TRVRfQkxVRVRPT1RIX1NDQU5fTU9ERSwgaXNCbHVldG9vdGhQbGF5aW5nID8gMSA6IDAsIDApKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTYXZlIGNvbmZpZ3VyYXRpb24gb24gc3VwcGxpY2FudAorICAgICAqCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcywge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UKKyAgICAgKgorICAgICAqIFRPRE86IGRlcHJlY2F0ZSB0aGlzCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gc3luY1NhdmVDb25maWcoKSB7CisgICAgICAgIHJldHVybiBzZW5kU3luY01lc3NhZ2UoQ01EX1NBVkVfQ09ORklHKS5ib29sVmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogVE9ETzogZG9jCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVxdWVzdENtV2FrZUxvY2soKSB7CisgICAgICAgIHNlbmRNZXNzYWdlKENNRF9SRVFVRVNUX0NNX1dBS0VMT0NLKTsKKyAgICB9CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICogSW50ZXJuYWwgcHJpdmF0ZSBmdW5jdGlvbnMKKyAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBjbGFzcyBTeW5jUmV0dXJuIHsKKyAgICAgICAgYm9vbGVhbiBib29sVmFsdWU7CisgICAgICAgIGludCBpbnRWYWx1ZTsKKyAgICAgICAgU3RyaW5nIHN0cmluZ1ZhbHVlOworICAgICAgICBPYmplY3Qgb2JqVmFsdWU7CisgICAgfQorCisgICAgY2xhc3MgU3luY1BhcmFtcyB7CisgICAgICAgIE9iamVjdCBtUGFyYW1ldGVyOworICAgICAgICBTeW5jUmV0dXJuIG1TeW5jUmV0dXJuOworICAgICAgICBTeW5jUGFyYW1zKCkgeworICAgICAgICAgICAgbVN5bmNSZXR1cm4gPSBuZXcgU3luY1JldHVybigpOworICAgICAgICB9CisgICAgICAgIFN5bmNQYXJhbXMoT2JqZWN0IHApIHsKKyAgICAgICAgICAgIG1QYXJhbWV0ZXIgPSBwOworICAgICAgICAgICAgbVN5bmNSZXR1cm4gPSBuZXcgU3luY1JldHVybigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogbWVzc2FnZS5vYmogaXMgdXNlZCB0byBzdG9yZSBTeW5jUGFyYW1zCisgICAgICovCisgICAgcHJpdmF0ZSBTeW5jUmV0dXJuIHN5bmNlZFNlbmQoTWVzc2FnZSBtc2cpIHsKKyAgICAgICAgU3luY1BhcmFtcyBzeW5jUGFyYW1zID0gKFN5bmNQYXJhbXMpIG1zZy5vYmo7CisgICAgICAgIHN5bmNocm9uaXplZChzeW5jUGFyYW1zKSB7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsICJzeW5jZWRTZW5kICIgKyBtc2cpOworICAgICAgICAgICAgc2VuZE1lc3NhZ2UobXNnKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgc3luY1BhcmFtcy53YWl0KCk7CisgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAic2VuZFN5bmNNZXNzYWdlOiB1bmV4cGVjdGVkIGludGVycnVwdGlvbiBvZiB3YWl0KCkiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3luY1BhcmFtcy5tU3luY1JldHVybjsKKyAgICB9CisKKyAgICBwcml2YXRlIFN5bmNSZXR1cm4gc2VuZFN5bmNNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7CisgICAgICAgIFN5bmNQYXJhbXMgc3luY1BhcmFtcyA9IG5ldyBTeW5jUGFyYW1zKCk7CisgICAgICAgIG1zZy5vYmogPSBzeW5jUGFyYW1zOworICAgICAgICByZXR1cm4gc3luY2VkU2VuZChtc2cpOworICAgIH0KKworICAgIHByaXZhdGUgU3luY1JldHVybiBzZW5kU3luY01lc3NhZ2UoaW50IHdoYXQsIE9iamVjdCBwYXJhbSkgeworICAgICAgICBTeW5jUGFyYW1zIHN5bmNQYXJhbXMgPSBuZXcgU3luY1BhcmFtcyhwYXJhbSk7CisgICAgICAgIE1lc3NhZ2UgbXNnID0gb2J0YWluTWVzc2FnZSh3aGF0LCBzeW5jUGFyYW1zKTsKKyAgICAgICAgcmV0dXJuIHN5bmNlZFNlbmQobXNnKTsKKyAgICB9CisKKworICAgIHByaXZhdGUgU3luY1JldHVybiBzZW5kU3luY01lc3NhZ2UoaW50IHdoYXQpIHsKKyAgICAgICAgcmV0dXJuIHNlbmRTeW5jTWVzc2FnZShvYnRhaW5NZXNzYWdlKHdoYXQpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgbm90aWZ5T25Nc2dPYmplY3QoTWVzc2FnZSBtc2cpIHsKKyAgICAgICAgU3luY1BhcmFtcyBzeW5jUGFyYW1zID0gKFN5bmNQYXJhbXMpIG1zZy5vYmo7CisgICAgICAgIGlmIChzeW5jUGFyYW1zICE9IG51bGwpIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZChzeW5jUGFyYW1zKSB7CisgICAgICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCAibm90aWZ5T25Nc2dPYmplY3QgIiArIG1zZyk7CisgICAgICAgICAgICAgICAgc3luY1BhcmFtcy5ub3RpZnkoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIkVycm9yISBzeW5jUGFyYW1zIGluIG5vdGlmeU9uTXNnT2JqZWN0IGlzIG51bGwiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZXRXaWZpU3RhdGUoaW50IHdpZmlTdGF0ZSkgeworICAgICAgICBmaW5hbCBpbnQgcHJldmlvdXNXaWZpU3RhdGUgPSBtV2lmaVN0YXRlLmdldCgpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAod2lmaVN0YXRlID09IFdJRklfU1RBVEVfRU5BQkxFRCkgeworICAgICAgICAgICAgICAgIG1CYXR0ZXJ5U3RhdHMubm90ZVdpZmlPbihtTGFzdEVuYWJsZVVpZC5nZXQoKSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHdpZmlTdGF0ZSA9PSBXSUZJX1NUQVRFX0RJU0FCTEVEKSB7CisgICAgICAgICAgICAgICAgbUJhdHRlcnlTdGF0cy5ub3RlV2lmaU9mZihtTGFzdEVuYWJsZVVpZC5nZXQoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJGYWlsZWQgdG8gbm90ZSBiYXR0ZXJ5IHN0YXRzIGluIHdpZmkiKTsKKyAgICAgICAgfQorCisgICAgICAgIG1XaWZpU3RhdGUuc2V0KHdpZmlTdGF0ZSk7CisKKyAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCAic2V0V2lmaVN0YXRlOiAiICsgc3luY0dldFdpZmlTdGF0ZUJ5TmFtZSgpKTsKKworICAgICAgICBmaW5hbCBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChXaWZpTWFuYWdlci5XSUZJX1NUQVRFX0NIQU5HRURfQUNUSU9OKTsKKyAgICAgICAgaW50ZW50LmFkZEZsYWdzKEludGVudC5GTEFHX1JFQ0VJVkVSX1JFR0lTVEVSRURfT05MWV9CRUZPUkVfQk9PVCk7CisgICAgICAgIGludGVudC5wdXRFeHRyYShXaWZpTWFuYWdlci5FWFRSQV9XSUZJX1NUQVRFLCB3aWZpU3RhdGUpOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoV2lmaU1hbmFnZXIuRVhUUkFfUFJFVklPVVNfV0lGSV9TVEFURSwgcHJldmlvdXNXaWZpU3RhdGUpOworICAgICAgICBtQ29udGV4dC5zZW5kU3RpY2t5QnJvYWRjYXN0KGludGVudCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNldFdpZmlBcFN0YXRlKGludCB3aWZpQXBTdGF0ZSkgeworICAgICAgICBmaW5hbCBpbnQgcHJldmlvdXNXaWZpQXBTdGF0ZSA9IG1XaWZpQXBTdGF0ZS5nZXQoKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKHdpZmlBcFN0YXRlID09IFdJRklfQVBfU1RBVEVfRU5BQkxFRCkgeworICAgICAgICAgICAgICAgIG1CYXR0ZXJ5U3RhdHMubm90ZVdpZmlPbihtTGFzdEFwRW5hYmxlVWlkLmdldCgpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAod2lmaUFwU3RhdGUgPT0gV0lGSV9BUF9TVEFURV9ESVNBQkxFRCkgeworICAgICAgICAgICAgICAgIG1CYXR0ZXJ5U3RhdHMubm90ZVdpZmlPZmYobUxhc3RBcEVuYWJsZVVpZC5nZXQoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZChUQUcsICJGYWlsZWQgdG8gbm90ZSBiYXR0ZXJ5IHN0YXRzIGluIHdpZmkiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFVwZGF0ZSBzdGF0ZQorICAgICAgICBtV2lmaUFwU3RhdGUuc2V0KHdpZmlBcFN0YXRlKTsKKworICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsICJzZXRXaWZpQXBTdGF0ZTogIiArIHN5bmNHZXRXaWZpQXBTdGF0ZUJ5TmFtZSgpKTsKKworICAgICAgICBmaW5hbCBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChXaWZpTWFuYWdlci5XSUZJX0FQX1NUQVRFX0NIQU5HRURfQUNUSU9OKTsKKyAgICAgICAgaW50ZW50LmFkZEZsYWdzKEludGVudC5GTEFHX1JFQ0VJVkVSX1JFR0lTVEVSRURfT05MWV9CRUZPUkVfQk9PVCk7CisgICAgICAgIGludGVudC5wdXRFeHRyYShXaWZpTWFuYWdlci5FWFRSQV9XSUZJX0FQX1NUQVRFLCB3aWZpQXBTdGF0ZSk7CisgICAgICAgIGludGVudC5wdXRFeHRyYShXaWZpTWFuYWdlci5FWFRSQV9QUkVWSU9VU19XSUZJX0FQX1NUQVRFLCBwcmV2aW91c1dpZmlBcFN0YXRlKTsKKyAgICAgICAgbUNvbnRleHQuc2VuZFN0aWNreUJyb2FkY2FzdChpbnRlbnQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhcnNlIHRoZSBzY2FuIHJlc3VsdCBsaW5lIHBhc3NlZCB0byB1cyBieSB3cGFfc3VwcGxpY2FudCAoaGVscGVyKS4KKyAgICAgKiBAcGFyYW0gbGluZSB0aGUgbGluZSB0byBwYXJzZQorICAgICAqIEByZXR1cm4gdGhlIHtAbGluayBTY2FuUmVzdWx0fSBvYmplY3QKKyAgICAgKi8KKyAgICBwcml2YXRlIFNjYW5SZXN1bHQgcGFyc2VTY2FuUmVzdWx0KFN0cmluZyBsaW5lKSB7CisgICAgICAgIFNjYW5SZXN1bHQgc2NhblJlc3VsdCA9IG51bGw7CisgICAgICAgIGlmIChsaW5lICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBDYWNoZSBpbXBsZW1lbnRhdGlvbiAoTGlua2VkSGFzaE1hcCkgaXMgbm90IHN5bmNocm9uaXplZCwgdGh1cywKKyAgICAgICAgICAgICAqIG11c3Qgc3luY2hyb25pemVkIGhlcmUhCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVNjYW5SZXN1bHRDYWNoZSkgeworICAgICAgICAgICAgICAgIFN0cmluZ1tdIHJlc3VsdCA9IHNjYW5SZXN1bHRQYXR0ZXJuLnNwbGl0KGxpbmUpOworICAgICAgICAgICAgICAgIGlmICgzIDw9IHJlc3VsdC5sZW5ndGggJiYgcmVzdWx0Lmxlbmd0aCA8PSA1KSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBic3NpZCA9IHJlc3VsdFswXTsKKyAgICAgICAgICAgICAgICAgICAgLy8gYnNzaWQgfCBmcmVxdWVuY3kgfCBsZXZlbCB8IGZsYWdzIHwgc3NpZAorICAgICAgICAgICAgICAgICAgICBpbnQgZnJlcXVlbmN5OworICAgICAgICAgICAgICAgICAgICBpbnQgbGV2ZWw7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmcmVxdWVuY3kgPSBJbnRlZ2VyLnBhcnNlSW50KHJlc3VsdFsxXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCA9IEludGVnZXIucGFyc2VJbnQocmVzdWx0WzJdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNvbWUgaW1wbGVtZW50YXRpb25zIGF2b2lkIG5lZ2F0aXZlIHZhbHVlcyBieSBhZGRpbmcgMjU2CisgICAgICAgICAgICAgICAgICAgICAgICAgKiBzbyB3ZSBuZWVkIHRvIGFkanVzdCBmb3IgdGhhdCBoZXJlLgorICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGV2ZWwgPiAwKSBsZXZlbCAtPSAyNTY7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmcmVxdWVuY3kgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwgPSAwOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICogVGhlIGZvcm1hdHRpbmcgb2YgdGhlIHJlc3VsdHMgcmV0dXJuZWQgYnkKKyAgICAgICAgICAgICAgICAgICAgICogd3BhX3N1cHBsaWNhbnQgaXMgaW50ZW5kZWQgdG8gbWFrZSB0aGUgZmllbGRzCisgICAgICAgICAgICAgICAgICAgICAqIGxpbmUgdXAgbmljZWx5IHdoZW4gcHJpbnRlZCwKKyAgICAgICAgICAgICAgICAgICAgICogbm90IHRvIG1ha2UgdGhlbSBlYXN5IHRvIHBhcnNlLiBTbyB3ZSBoYXZlIHRvCisgICAgICAgICAgICAgICAgICAgICAqIGFwcGx5IHNvbWUgaGV1cmlzdGljcyB0byBmaWd1cmUgb3V0IHdoaWNoIGZpZWxkCisgICAgICAgICAgICAgICAgICAgICAqIGlzIHRoZSBTU0lEIGFuZCB3aGljaCBmaWVsZCBpcyB0aGUgZmxhZ3MuCisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc3NpZDsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGZsYWdzOworICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aCA9PSA0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0WzNdLmNoYXJBdCgwKSA9PSAnWycpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyA9IHJlc3VsdFszXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc2lkID0gIiI7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzID0gIiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3NpZCA9IHJlc3VsdFszXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXN1bHQubGVuZ3RoID09IDUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzID0gcmVzdWx0WzNdOworICAgICAgICAgICAgICAgICAgICAgICAgc3NpZCA9IHJlc3VsdFs0XTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhlcmUsIHdlIG11c3QgaGF2ZSAzIGZpZWxkczogbm8gZmxhZ3MgYW5kIHNzaWQKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldAorICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MgPSAiIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNzaWQgPSAiIjsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIGJzc2lkICsgc3NpZCBpcyB0aGUgaGFzaCBrZXkKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGtleSA9IGJzc2lkICsgc3NpZDsKKyAgICAgICAgICAgICAgICAgICAgc2NhblJlc3VsdCA9IG1TY2FuUmVzdWx0Q2FjaGUuZ2V0KGtleSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzY2FuUmVzdWx0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5SZXN1bHQubGV2ZWwgPSBsZXZlbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5SZXN1bHQuU1NJRCA9IHNzaWQ7CisgICAgICAgICAgICAgICAgICAgICAgICBzY2FuUmVzdWx0LmNhcGFiaWxpdGllcyA9IGZsYWdzOworICAgICAgICAgICAgICAgICAgICAgICAgc2NhblJlc3VsdC5mcmVxdWVuY3kgPSBmcmVxdWVuY3k7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBEbyBub3QgYWRkIHNjYW4gcmVzdWx0cyB0aGF0IGhhdmUgbm8gU1NJRCBzZXQKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgwIDwgc3NpZC50cmltKCkubGVuZ3RoKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FuUmVzdWx0ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFNjYW5SZXN1bHQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc2lkLCBic3NpZCwgZmxhZ3MsIGxldmVsLCBmcmVxdWVuY3kpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TY2FuUmVzdWx0Q2FjaGUucHV0KGtleSwgc2NhblJlc3VsdCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJNaXNmb3JtYXR0ZWQgc2NhbiByZXN1bHQgdGV4dCB3aXRoICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQubGVuZ3RoICsgIiBmaWVsZHM6ICIgKyBsaW5lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gc2NhblJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBzY2FuUmVzdWx0cyBpbnB1dCBmb3JtYXQKKyAgICAgKiAwMDpiYjpjYzpkZDpjYzplZSAgICAgICAyNDI3ICAgIDE2NiAgICAgW1dQQS1FQVAtVEtJUF1bV1BBMi1FQVAtQ0NNUF0gICBOZXQxCisgICAgICogMDA6YmI6Y2M6ZGQ6Y2M6ZmYgICAgICAgMjQxMiAgICAxNjUgICAgIFtXUEEtRUFQLVRLSVBdW1dQQTItRUFQLUNDTVBdICAgTmV0MgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzZXRTY2FuUmVzdWx0cyhTdHJpbmcgc2NhblJlc3VsdHMpIHsKKyAgICAgICAgaWYgKHNjYW5SZXN1bHRzID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIExpc3Q8U2NhblJlc3VsdD4gc2Nhbkxpc3QgPSBuZXcgQXJyYXlMaXN0PFNjYW5SZXN1bHQ+KCk7CisKKyAgICAgICAgaW50IGxpbmVDb3VudCA9IDA7CisKKyAgICAgICAgaW50IHNjYW5SZXN1bHRzTGVuID0gc2NhblJlc3VsdHMubGVuZ3RoKCk7CisgICAgICAgIC8vIFBhcnNlIHRoZSByZXN1bHQgc3RyaW5nLCBrZWVwaW5nIGluIG1pbmQgdGhhdCB0aGUgbGFzdCBsaW5lIGRvZXMKKyAgICAgICAgLy8gbm90IGVuZCB3aXRoIGEgbmV3bGluZS4KKyAgICAgICAgZm9yIChpbnQgbGluZUJlZyA9IDAsIGxpbmVFbmQgPSAwOyBsaW5lRW5kIDw9IHNjYW5SZXN1bHRzTGVuOyArK2xpbmVFbmQpIHsKKyAgICAgICAgICAgIGlmIChsaW5lRW5kID09IHNjYW5SZXN1bHRzTGVuIHx8IHNjYW5SZXN1bHRzLmNoYXJBdChsaW5lRW5kKSA9PSAnXG4nKSB7CisgICAgICAgICAgICAgICAgKytsaW5lQ291bnQ7CisKKyAgICAgICAgICAgICAgICBpZiAobGluZUNvdW50ID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgbGluZUJlZyA9IGxpbmVFbmQgKyAxOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGxpbmVFbmQgPiBsaW5lQmVnKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsaW5lID0gc2NhblJlc3VsdHMuc3Vic3RyaW5nKGxpbmVCZWcsIGxpbmVFbmQpOworICAgICAgICAgICAgICAgICAgICBTY2FuUmVzdWx0IHNjYW5SZXN1bHQgPSBwYXJzZVNjYW5SZXN1bHQobGluZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzY2FuUmVzdWx0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5MaXN0LmFkZChzY2FuUmVzdWx0KTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIm1pc2Zvcm1hdHRlZCBzY2FuIHJlc3VsdCBmb3I6ICIgKyBsaW5lKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBsaW5lQmVnID0gbGluZUVuZCArIDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBtU2NhblJlc3VsdHMgPSBzY2FuTGlzdDsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBmZXRjaFNTSUQoKSB7CisgICAgICAgIFN0cmluZyBzdGF0dXMgPSBXaWZpTmF0aXZlLnN0YXR1c0NvbW1hbmQoKTsKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICAvLyBleHRyYWN0IHNzaWQgZnJvbSBhIHNlcmllcyBvZiAibmFtZT12YWx1ZSIKKyAgICAgICAgU3RyaW5nW10gbGluZXMgPSBzdGF0dXMuc3BsaXQoIlxuIik7CisgICAgICAgIGZvciAoU3RyaW5nIGxpbmUgOiBsaW5lcykgeworICAgICAgICAgICAgU3RyaW5nW10gcHJvcCA9IGxpbmUuc3BsaXQoIiAqPSAqIik7CisgICAgICAgICAgICBpZiAocHJvcC5sZW5ndGggPCAyKSBjb250aW51ZTsKKyAgICAgICAgICAgIFN0cmluZyBuYW1lID0gcHJvcFswXTsKKyAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IHByb3BbMV07CisgICAgICAgICAgICBpZiAobmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJzc2lkIikpIHJldHVybiB2YWx1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY29uZmlndXJlTmV0d29ya1Byb3BlcnRpZXMoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtTmV0d29ya1Byb3BlcnRpZXMuc2V0SW50ZXJmYWNlKE5ldHdvcmtJbnRlcmZhY2UuZ2V0QnlOYW1lKG1JbnRlcmZhY2VOYW1lKSk7CisgICAgICAgIH0gY2F0Y2ggKFNvY2tldEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJTb2NrZXRFeGNlcHRpb24gY3JlYXRpbmcgTmV0d29ya0ludGVyZmFjZSBmcm9tICIgKyBtSW50ZXJmYWNlTmFtZSArCisgICAgICAgICAgICAgICAgICAgICIuIGU9IiArIGUpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJOUEUgY3JlYXRpbmcgTmV0d29ya0ludGVyZmFjZS4gZT0iICsgZSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgLy8gVE9ETyAtIGZpeCB0aGlzIGZvciB2NgorICAgICAgICB0cnkgeworICAgICAgICAgICAgbU5ldHdvcmtQcm9wZXJ0aWVzLmFkZEFkZHJlc3MoSW5ldEFkZHJlc3MuZ2V0QnlBZGRyZXNzKAorICAgICAgICAgICAgICAgICAgICBOZXR3b3JrVXRpbHMudjRJbnRUb0FycmF5KG1EaGNwSW5mby5pcEFkZHJlc3MpKSk7CisgICAgICAgIH0gY2F0Y2ggKFVua25vd25Ib3N0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIkV4Y2VwdGlvbiBzZXR0aW5nIElwQWRkcmVzcyB1c2luZyAiICsgbURoY3BJbmZvICsgIiwgZT0iICsgZSk7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgbU5ldHdvcmtQcm9wZXJ0aWVzLnNldEdhdGV3YXkoSW5ldEFkZHJlc3MuZ2V0QnlBZGRyZXNzKE5ldHdvcmtVdGlscy52NEludFRvQXJyYXkoCisgICAgICAgICAgICAgICAgICAgIG1EaGNwSW5mby5nYXRld2F5KSkpOworICAgICAgICB9IGNhdGNoIChVbmtub3duSG9zdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJFeGNlcHRpb24gc2V0dGluZyBHYXRld2F5IHVzaW5nICIgKyBtRGhjcEluZm8gKyAiLCBlPSIgKyBlKTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtTmV0d29ya1Byb3BlcnRpZXMuYWRkRG5zKEluZXRBZGRyZXNzLmdldEJ5QWRkcmVzcygKKyAgICAgICAgICAgICAgICAgICAgTmV0d29ya1V0aWxzLnY0SW50VG9BcnJheShtRGhjcEluZm8uZG5zMSkpKTsKKyAgICAgICAgfSBjYXRjaCAoVW5rbm93bkhvc3RFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiRXhjZXB0aW9uIHNldHRpbmcgRG5zMSB1c2luZyAiICsgbURoY3BJbmZvICsgIiwgZT0iICsgZSk7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1OZXR3b3JrUHJvcGVydGllcy5hZGREbnMoSW5ldEFkZHJlc3MuZ2V0QnlBZGRyZXNzKAorICAgICAgICAgICAgICAgICAgICBOZXR3b3JrVXRpbHMudjRJbnRUb0FycmF5KG1EaGNwSW5mby5kbnMyKSkpOworCisgICAgICAgIH0gY2F0Y2ggKFVua25vd25Ib3N0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIkV4Y2VwdGlvbiBzZXR0aW5nIERuczIgdXNpbmcgIiArIG1EaGNwSW5mbyArICIsIGU9IiArIGUpOworICAgICAgICB9CisgICAgICAgIC8vIFRPRE8gLSBhZGQgcHJveHkgaW5mbworICAgIH0KKworCisgICAgcHJpdmF0ZSB2b2lkIGNoZWNrVXNlU3RhdGljSXAoKSB7CisgICAgICAgIG1Vc2VTdGF0aWNJcCA9IGZhbHNlOworICAgICAgICBmaW5hbCBDb250ZW50UmVzb2x2ZXIgY3IgPSBtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChTZXR0aW5ncy5TeXN0ZW0uZ2V0SW50KGNyLCBTZXR0aW5ncy5TeXN0ZW0uV0lGSV9VU0VfU1RBVElDX0lQKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChTZXR0aW5ncy5TZXR0aW5nTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFN0cmluZyBhZGRyID0gU2V0dGluZ3MuU3lzdGVtLmdldFN0cmluZyhjciwgU2V0dGluZ3MuU3lzdGVtLldJRklfU1RBVElDX0lQKTsKKyAgICAgICAgICAgIGlmIChhZGRyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtRGhjcEluZm8uaXBBZGRyZXNzID0gc3RyaW5nVG9JcEFkZHIoYWRkcik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFkZHIgPSBTZXR0aW5ncy5TeXN0ZW0uZ2V0U3RyaW5nKGNyLCBTZXR0aW5ncy5TeXN0ZW0uV0lGSV9TVEFUSUNfR0FURVdBWSk7CisgICAgICAgICAgICBpZiAoYWRkciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbURoY3BJbmZvLmdhdGV3YXkgPSBzdHJpbmdUb0lwQWRkcihhZGRyKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYWRkciA9IFNldHRpbmdzLlN5c3RlbS5nZXRTdHJpbmcoY3IsIFNldHRpbmdzLlN5c3RlbS5XSUZJX1NUQVRJQ19ORVRNQVNLKTsKKyAgICAgICAgICAgIGlmIChhZGRyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtRGhjcEluZm8ubmV0bWFzayA9IHN0cmluZ1RvSXBBZGRyKGFkZHIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhZGRyID0gU2V0dGluZ3MuU3lzdGVtLmdldFN0cmluZyhjciwgU2V0dGluZ3MuU3lzdGVtLldJRklfU1RBVElDX0ROUzEpOworICAgICAgICAgICAgaWYgKGFkZHIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1EaGNwSW5mby5kbnMxID0gc3RyaW5nVG9JcEFkZHIoYWRkcik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFkZHIgPSBTZXR0aW5ncy5TeXN0ZW0uZ2V0U3RyaW5nKGNyLCBTZXR0aW5ncy5TeXN0ZW0uV0lGSV9TVEFUSUNfRE5TMik7CisgICAgICAgICAgICBpZiAoYWRkciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbURoY3BJbmZvLmRuczIgPSBzdHJpbmdUb0lwQWRkcihhZGRyKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbURoY3BJbmZvLmRuczIgPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChVbmtub3duSG9zdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgbVVzZVN0YXRpY0lwID0gdHJ1ZTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgc3RyaW5nVG9JcEFkZHIoU3RyaW5nIGFkZHJTdHJpbmcpIHRocm93cyBVbmtub3duSG9zdEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTdHJpbmdbXSBwYXJ0cyA9IGFkZHJTdHJpbmcuc3BsaXQoIlxcLiIpOworICAgICAgICAgICAgaWYgKHBhcnRzLmxlbmd0aCAhPSA0KSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVua25vd25Ib3N0RXhjZXB0aW9uKGFkZHJTdHJpbmcpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnQgYSA9IEludGVnZXIucGFyc2VJbnQocGFydHNbMF0pICAgICAgOworICAgICAgICAgICAgaW50IGIgPSBJbnRlZ2VyLnBhcnNlSW50KHBhcnRzWzFdKSA8PCAgODsKKyAgICAgICAgICAgIGludCBjID0gSW50ZWdlci5wYXJzZUludChwYXJ0c1syXSkgPDwgMTY7CisgICAgICAgICAgICBpbnQgZCA9IEludGVnZXIucGFyc2VJbnQocGFydHNbM10pIDw8IDI0OworCisgICAgICAgICAgICByZXR1cm4gYSB8IGIgfCBjIHwgZDsKKyAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5rbm93bkhvc3RFeGNlcHRpb24oYWRkclN0cmluZyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGludCBnZXRNYXhEaGNwUmV0cmllcygpIHsKKyAgICAgICAgcmV0dXJuIFNldHRpbmdzLlNlY3VyZS5nZXRJbnQobUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5XSUZJX01BWF9ESENQX1JFVFJZX0NPVU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX01BWF9ESENQX1JFVFJJRVMpOworICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgU2V0dGluZ3NPYnNlcnZlciBleHRlbmRzIENvbnRlbnRPYnNlcnZlciB7CisgICAgICAgIHB1YmxpYyBTZXR0aW5nc09ic2VydmVyKEhhbmRsZXIgaGFuZGxlcikgeworICAgICAgICAgICAgc3VwZXIoaGFuZGxlcik7CisgICAgICAgICAgICBDb250ZW50UmVzb2x2ZXIgY3IgPSBtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKTsKKyAgICAgICAgICAgIGNyLnJlZ2lzdGVyQ29udGVudE9ic2VydmVyKFNldHRpbmdzLlN5c3RlbS5nZXRVcmlGb3IoCisgICAgICAgICAgICAgICAgU2V0dGluZ3MuU3lzdGVtLldJRklfVVNFX1NUQVRJQ19JUCksIGZhbHNlLCB0aGlzKTsKKyAgICAgICAgICAgIGNyLnJlZ2lzdGVyQ29udGVudE9ic2VydmVyKFNldHRpbmdzLlN5c3RlbS5nZXRVcmlGb3IoCisgICAgICAgICAgICAgICAgU2V0dGluZ3MuU3lzdGVtLldJRklfU1RBVElDX0lQKSwgZmFsc2UsIHRoaXMpOworICAgICAgICAgICAgY3IucmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIoU2V0dGluZ3MuU3lzdGVtLmdldFVyaUZvcigKKyAgICAgICAgICAgICAgICBTZXR0aW5ncy5TeXN0ZW0uV0lGSV9TVEFUSUNfR0FURVdBWSksIGZhbHNlLCB0aGlzKTsKKyAgICAgICAgICAgIGNyLnJlZ2lzdGVyQ29udGVudE9ic2VydmVyKFNldHRpbmdzLlN5c3RlbS5nZXRVcmlGb3IoCisgICAgICAgICAgICAgICAgU2V0dGluZ3MuU3lzdGVtLldJRklfU1RBVElDX05FVE1BU0spLCBmYWxzZSwgdGhpcyk7CisgICAgICAgICAgICBjci5yZWdpc3RlckNvbnRlbnRPYnNlcnZlcihTZXR0aW5ncy5TeXN0ZW0uZ2V0VXJpRm9yKAorICAgICAgICAgICAgICAgIFNldHRpbmdzLlN5c3RlbS5XSUZJX1NUQVRJQ19ETlMxKSwgZmFsc2UsIHRoaXMpOworICAgICAgICAgICAgY3IucmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIoU2V0dGluZ3MuU3lzdGVtLmdldFVyaUZvcigKKyAgICAgICAgICAgICAgICBTZXR0aW5ncy5TeXN0ZW0uV0lGSV9TVEFUSUNfRE5TMiksIGZhbHNlLCB0aGlzKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkNoYW5nZShib29sZWFuIHNlbGZDaGFuZ2UpIHsKKyAgICAgICAgICAgIHN1cGVyLm9uQ2hhbmdlKHNlbGZDaGFuZ2UpOworCisgICAgICAgICAgICBib29sZWFuIHdhc1N0YXRpY0lwID0gbVVzZVN0YXRpY0lwOworICAgICAgICAgICAgaW50IG9JcCwgb0d3LCBvTXNrLCBvRG5zMSwgb0RuczI7CisgICAgICAgICAgICBvSXAgPSBvR3cgPSBvTXNrID0gb0RuczEgPSBvRG5zMiA9IDA7CisgICAgICAgICAgICBpZiAod2FzU3RhdGljSXApIHsKKyAgICAgICAgICAgICAgICBvSXAgPSBtRGhjcEluZm8uaXBBZGRyZXNzOworICAgICAgICAgICAgICAgIG9HdyA9IG1EaGNwSW5mby5nYXRld2F5OworICAgICAgICAgICAgICAgIG9Nc2sgPSBtRGhjcEluZm8ubmV0bWFzazsKKyAgICAgICAgICAgICAgICBvRG5zMSA9IG1EaGNwSW5mby5kbnMxOworICAgICAgICAgICAgICAgIG9EbnMyID0gbURoY3BJbmZvLmRuczI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjaGVja1VzZVN0YXRpY0lwKCk7CisKKyAgICAgICAgICAgIGlmIChtV2lmaUluZm8uZ2V0U3VwcGxpY2FudFN0YXRlKCkgPT0gU3VwcGxpY2FudFN0YXRlLlVOSU5JVElBTElaRUQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJvb2xlYW4gY2hhbmdlZCA9CisgICAgICAgICAgICAgICAgKHdhc1N0YXRpY0lwICE9IG1Vc2VTdGF0aWNJcCkgfHwKKyAgICAgICAgICAgICAgICAgICAgKHdhc1N0YXRpY0lwICYmICgKKyAgICAgICAgICAgICAgICAgICAgICAgIG9JcCAgICE9IG1EaGNwSW5mby5pcEFkZHJlc3MgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIG9HdyAgICE9IG1EaGNwSW5mby5nYXRld2F5IHx8CisgICAgICAgICAgICAgICAgICAgICAgICBvTXNrICAhPSBtRGhjcEluZm8ubmV0bWFzayB8fAorICAgICAgICAgICAgICAgICAgICAgICAgb0RuczEgIT0gbURoY3BJbmZvLmRuczEgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIG9EbnMyICE9IG1EaGNwSW5mby5kbnMyKSk7CisKKyAgICAgICAgICAgIGlmIChjaGFuZ2VkKSB7CisgICAgICAgICAgICAgICAgc2VuZE1lc3NhZ2UoQ01EX1JFQ09ORklHVVJFX0lQKTsKKyAgICAgICAgICAgICAgICBtQ29uZmlnQ2hhbmdlZCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRvIGRpc2FibGUgY29leGlzdGVuY2UgbW9kZSB3aGlsZSBvYnRhaW5pbmcgSVAgYWRkcmVzcy4gVGhpcworICAgICAqIGxvZ2ljIHdpbGwgcmV0dXJuIHRydWUgb25seSBpZiB0aGUgY3VycmVudCBibHVldG9vdGgKKyAgICAgKiBoZWFkc2V0L2hhbmRzZnJlZSBzdGF0ZSBpcyBkaXNjb25uZWN0ZWQuIFRoaXMgbWVhbnMgaWYgaXQgaXMgaW4gYW4KKyAgICAgKiBlcnJvciBzdGF0ZSwgd2Ugd2lsbCBOT1QgZGlzYWJsZSBjb2V4aXN0ZW5jZSBtb2RlIHRvIGVyciBvbiB0aGUgc2lkZQorICAgICAqIG9mIHNhZmV0eS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gV2hldGhlciB0byBkaXNhYmxlIGNvZXhpc3RlbmNlIG1vZGUuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIHNob3VsZERpc2FibGVDb2V4aXN0ZW5jZU1vZGUoKSB7CisgICAgICAgIGludCBzdGF0ZSA9IG1CbHVldG9vdGhIZWFkc2V0LmdldFN0YXRlKG1CbHVldG9vdGhIZWFkc2V0LmdldEN1cnJlbnRIZWFkc2V0KCkpOworICAgICAgICByZXR1cm4gc3RhdGUgPT0gQmx1ZXRvb3RoSGVhZHNldC5TVEFURV9ESVNDT05ORUNURUQ7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNoZWNrSXNCbHVldG9vdGhQbGF5aW5nKCkgeworICAgICAgICBib29sZWFuIGlzQmx1ZXRvb3RoUGxheWluZyA9IGZhbHNlOworICAgICAgICBTZXQ8Qmx1ZXRvb3RoRGV2aWNlPiBjb25uZWN0ZWQgPSBtQmx1ZXRvb3RoQTJkcC5nZXRDb25uZWN0ZWRTaW5rcygpOworCisgICAgICAgIGZvciAoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSA6IGNvbm5lY3RlZCkgeworICAgICAgICAgICAgaWYgKG1CbHVldG9vdGhBMmRwLmdldFNpbmtTdGF0ZShkZXZpY2UpID09IEJsdWV0b290aEEyZHAuU1RBVEVfUExBWUlORykgeworICAgICAgICAgICAgICAgIGlzQmx1ZXRvb3RoUGxheWluZyA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc2V0Qmx1ZXRvb3RoU2Nhbk1vZGUoaXNCbHVldG9vdGhQbGF5aW5nKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2VuZFNjYW5SZXN1bHRzQXZhaWxhYmxlQnJvYWRjYXN0KCkgeworICAgICAgICBpZiAoIUFjdGl2aXR5TWFuYWdlck5hdGl2ZS5pc1N5c3RlbVJlYWR5KCkpIHJldHVybjsKKworICAgICAgICBtQ29udGV4dC5zZW5kQnJvYWRjYXN0KG5ldyBJbnRlbnQoV2lmaU1hbmFnZXIuU0NBTl9SRVNVTFRTX0FWQUlMQUJMRV9BQ1RJT04pKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2VuZFJzc2lDaGFuZ2VCcm9hZGNhc3QoZmluYWwgaW50IG5ld1Jzc2kpIHsKKyAgICAgICAgaWYgKCFBY3Rpdml0eU1hbmFnZXJOYXRpdmUuaXNTeXN0ZW1SZWFkeSgpKSByZXR1cm47CisKKyAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoV2lmaU1hbmFnZXIuUlNTSV9DSEFOR0VEX0FDVElPTik7CisgICAgICAgIGludGVudC5wdXRFeHRyYShXaWZpTWFuYWdlci5FWFRSQV9ORVdfUlNTSSwgbmV3UnNzaSk7CisgICAgICAgIG1Db250ZXh0LnNlbmRCcm9hZGNhc3QoaW50ZW50KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2VuZE5ldHdvcmtTdGF0ZUNoYW5nZUJyb2FkY2FzdChTdHJpbmcgYnNzaWQpIHsKKyAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoV2lmaU1hbmFnZXIuTkVUV09SS19TVEFURV9DSEFOR0VEX0FDVElPTik7CisgICAgICAgIGludGVudC5hZGRGbGFncyhJbnRlbnQuRkxBR19SRUNFSVZFUl9SRUdJU1RFUkVEX09OTFlfQkVGT1JFX0JPT1QKKyAgICAgICAgICAgICAgICB8IEludGVudC5GTEFHX1JFQ0VJVkVSX1JFUExBQ0VfUEVORElORyk7CisgICAgICAgIGludGVudC5wdXRFeHRyYShXaWZpTWFuYWdlci5FWFRSQV9ORVRXT1JLX0lORk8sIG1OZXR3b3JrSW5mbyk7CisgICAgICAgIGludGVudC5wdXRFeHRyYShXaWZpTWFuYWdlci5FWFRSQV9ORVRXT1JLX1BST1BFUlRJRVMsIG1OZXR3b3JrUHJvcGVydGllcyk7CisgICAgICAgIGlmIChic3NpZCAhPSBudWxsKQorICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKFdpZmlNYW5hZ2VyLkVYVFJBX0JTU0lELCBic3NpZCk7CisgICAgICAgIG1Db250ZXh0LnNlbmRTdGlja3lCcm9hZGNhc3QoaW50ZW50KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2VuZENvbmZpZ0NoYW5nZUJyb2FkY2FzdCgpIHsKKyAgICAgICAgaWYgKCFBY3Rpdml0eU1hbmFnZXJOYXRpdmUuaXNTeXN0ZW1SZWFkeSgpKSByZXR1cm47CisgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KFdpZmlNYW5hZ2VyLkNPTkZJR19DSEFOR0VEX0FDVElPTik7CisgICAgICAgIGludGVudC5wdXRFeHRyYShXaWZpTWFuYWdlci5FWFRSQV9ORVRXT1JLX1BST1BFUlRJRVMsIG1OZXR3b3JrUHJvcGVydGllcyk7CisgICAgICAgIG1Db250ZXh0LnNlbmRCcm9hZGNhc3QoaW50ZW50KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2VuZFN1cHBsaWNhbnRTdGF0ZUNoYW5nZWRCcm9hZGNhc3QoU3RhdGVDaGFuZ2VSZXN1bHQgc2MsIGJvb2xlYW4gZmFpbGVkQXV0aCkgeworICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChXaWZpTWFuYWdlci5TVVBQTElDQU5UX1NUQVRFX0NIQU5HRURfQUNUSU9OKTsKKyAgICAgICAgaW50ZW50LmFkZEZsYWdzKEludGVudC5GTEFHX1JFQ0VJVkVSX1JFR0lTVEVSRURfT05MWV9CRUZPUkVfQk9PVAorICAgICAgICAgICAgICAgIHwgSW50ZW50LkZMQUdfUkVDRUlWRVJfUkVQTEFDRV9QRU5ESU5HKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKFdpZmlNYW5hZ2VyLkVYVFJBX05FV19TVEFURSwgKFBhcmNlbGFibGUpc2Muc3RhdGUpOworICAgICAgICBpZiAoZmFpbGVkQXV0aCkgeworICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKAorICAgICAgICAgICAgICAgIFdpZmlNYW5hZ2VyLkVYVFJBX1NVUFBMSUNBTlRfRVJST1IsCisgICAgICAgICAgICAgICAgV2lmaU1hbmFnZXIuRVJST1JfQVVUSEVOVElDQVRJTkcpOworICAgICAgICB9CisgICAgICAgIG1Db250ZXh0LnNlbmRTdGlja3lCcm9hZGNhc3QoaW50ZW50KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdXBkYXRlQ29uZmlnQW5kU2VuZENoYW5nZUJyb2FkY2FzdCgpIHsKKyAgICAgICAgdXBkYXRlQ29uZmlndXJlZE5ldHdvcmtzKCk7CisgICAgICAgIGlmICghQWN0aXZpdHlNYW5hZ2VyTmF0aXZlLmlzU3lzdGVtUmVhZHkoKSkgcmV0dXJuOworICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChXaWZpTWFuYWdlci5TVVBQTElDQU5UX0NPTkZJR19DSEFOR0VEX0FDVElPTik7CisgICAgICAgIG1Db250ZXh0LnNlbmRCcm9hZGNhc3QoaW50ZW50KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2VuZFN1cHBsaWNhbnRDb25uZWN0aW9uQ2hhbmdlZEJyb2FkY2FzdChib29sZWFuIGNvbm5lY3RlZCkgeworICAgICAgICBpZiAoIUFjdGl2aXR5TWFuYWdlck5hdGl2ZS5pc1N5c3RlbVJlYWR5KCkpIHJldHVybjsKKworICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChXaWZpTWFuYWdlci5TVVBQTElDQU5UX0NPTk5FQ1RJT05fQ0hBTkdFX0FDVElPTik7CisgICAgICAgIGludGVudC5wdXRFeHRyYShXaWZpTWFuYWdlci5FWFRSQV9TVVBQTElDQU5UX0NPTk5FQ1RFRCwgY29ubmVjdGVkKTsKKyAgICAgICAgbUNvbnRleHQuc2VuZEJyb2FkY2FzdChpbnRlbnQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlY29yZCB0aGUgZGV0YWlsZWQgc3RhdGUgb2YgYSBuZXR3b3JrLgorICAgICAqIEBwYXJhbSBzdGF0ZSB0aGUgbmV3IEB7Y29kZSBEZXRhaWxlZFN0YXRlfQorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzZXREZXRhaWxlZFN0YXRlKE5ldHdvcmtJbmZvLkRldGFpbGVkU3RhdGUgc3RhdGUpIHsKKyAgICAgICAgTG9nLmQoVEFHLCAic2V0RGV0YWlsZWQgc3RhdGUsIG9sZCA9IgorICAgICAgICAgICAgICAgICsgbU5ldHdvcmtJbmZvLmdldERldGFpbGVkU3RhdGUoKSArICIgYW5kIG5ldyBzdGF0ZT0iICsgc3RhdGUpOworICAgICAgICBpZiAoc3RhdGUgIT0gbU5ldHdvcmtJbmZvLmdldERldGFpbGVkU3RhdGUoKSkgeworICAgICAgICAgICAgbU5ldHdvcmtJbmZvLnNldERldGFpbGVkU3RhdGUoc3RhdGUsIG51bGwsIG51bGwpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHJlbW92ZURvdWJsZVF1b3RlcyhTdHJpbmcgc3RyaW5nKSB7CisgICAgICBpZiAoc3RyaW5nLmxlbmd0aCgpIDw9IDIpIHJldHVybiAiIjsKKyAgICAgIHJldHVybiBzdHJpbmcuc3Vic3RyaW5nKDEsIHN0cmluZy5sZW5ndGgoKSAtIDEpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBjb252ZXJ0VG9RdW90ZWRTdHJpbmcoU3RyaW5nIHN0cmluZykgeworICAgICAgICByZXR1cm4gIlwiIiArIHN0cmluZyArICJcIiI7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIG1ha2VTdHJpbmcoQml0U2V0IHNldCwgU3RyaW5nW10gc3RyaW5ncykgeworICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBpbnQgbmV4dFNldEJpdCA9IC0xOworCisgICAgICAgIC8qIE1ha2Ugc3VyZSBhbGwgc2V0IGJpdHMgYXJlIGluIFswLCBzdHJpbmdzLmxlbmd0aCkgdG8gYXZvaWQKKyAgICAgICAgICogZ29pbmcgb3V0IG9mIGJvdW5kcyBvbiBzdHJpbmdzLiAgKFNob3VsZG4ndCBoYXBwZW4sIGJ1dC4uLikgKi8KKyAgICAgICAgc2V0ID0gc2V0LmdldCgwLCBzdHJpbmdzLmxlbmd0aCk7CisKKyAgICAgICAgd2hpbGUgKChuZXh0U2V0Qml0ID0gc2V0Lm5leHRTZXRCaXQobmV4dFNldEJpdCArIDEpKSAhPSAtMSkgeworICAgICAgICAgICAgYnVmLmFwcGVuZChzdHJpbmdzW25leHRTZXRCaXRdLnJlcGxhY2UoJ18nLCAnLScpKS5hcHBlbmQoJyAnKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHJlbW92ZSB0cmFpbGluZyBzcGFjZQorICAgICAgICBpZiAoc2V0LmNhcmRpbmFsaXR5KCkgPiAwKSB7CisgICAgICAgICAgICBidWYuc2V0TGVuZ3RoKGJ1Zi5sZW5ndGgoKSAtIDEpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGludCBsb29rdXBTdHJpbmcoU3RyaW5nIHN0cmluZywgU3RyaW5nW10gc3RyaW5ncykgeworICAgICAgICBpbnQgc2l6ZSA9IHN0cmluZ3MubGVuZ3RoOworCisgICAgICAgIHN0cmluZyA9IHN0cmluZy5yZXBsYWNlKCctJywgJ18nKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKKyAgICAgICAgICAgIGlmIChzdHJpbmcuZXF1YWxzKHN0cmluZ3NbaV0pKQorICAgICAgICAgICAgICAgIHJldHVybiBpOworCisgICAgICAgIC8vIGlmIHdlIGV2ZXIgZ2V0IGhlcmUsIHdlIHNob3VsZCBwcm9iYWJseSBhZGQgdGhlCisgICAgICAgIC8vIHZhbHVlIHRvIFdpZmlDb25maWd1cmF0aW9uIHRvIHJlZmxlY3QgdGhhdCBpdCdzCisgICAgICAgIC8vIHN1cHBvcnRlZCBieSB0aGUgV1BBIHN1cHBsaWNhbnQKKyAgICAgICAgTG9nLncoVEFHLCAiRmFpbGVkIHRvIGxvb2stdXAgYSBzdHJpbmc6ICIgKyBzdHJpbmcpOworCisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZW5hYmxlQWxsTmV0d29ya3MoKSB7CisgICAgICAgIGlmIChtRW5hYmxlQWxsTmV0d29ya3MpIHsKKyAgICAgICAgICAgIG1FbmFibGVBbGxOZXR3b3JrcyA9IGZhbHNlOworICAgICAgICAgICAgZm9yIChXaWZpQ29uZmlndXJhdGlvbiBjb25maWcgOiBtQ29uZmlndXJlZE5ldHdvcmtzKSB7CisgICAgICAgICAgICAgICAgaWYoY29uZmlnICE9IG51bGwgJiYgY29uZmlnLnN0YXR1cyA9PSBTdGF0dXMuRElTQUJMRUQpIHsKKyAgICAgICAgICAgICAgICAgICAgV2lmaU5hdGl2ZS5lbmFibGVOZXR3b3JrQ29tbWFuZChjb25maWcubmV0d29ya0lkLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgV2lmaU5hdGl2ZS5zYXZlQ29uZmlnQ29tbWFuZCgpOworICAgICAgICAgICAgdXBkYXRlQ29uZmlnQW5kU2VuZENoYW5nZUJyb2FkY2FzdCgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnQgYWRkT3JVcGRhdGVOZXR3b3JrTmF0aXZlKFdpZmlDb25maWd1cmF0aW9uIGNvbmZpZykgeworICAgICAgICAvKgorICAgICAgICAgKiBJZiB0aGUgc3VwcGxpZWQgbmV0d29ya0lkIGlzIC0xLCB3ZSBjcmVhdGUgYSBuZXcgZW1wdHkKKyAgICAgICAgICogbmV0d29yayBjb25maWd1cmF0aW9uLiBPdGhlcndpc2UsIHRoZSBuZXR3b3JrSWQgc2hvdWxkCisgICAgICAgICAqIHJlZmVyIHRvIGFuIGV4aXN0aW5nIGNvbmZpZ3VyYXRpb24uCisgICAgICAgICAqLworICAgICAgICBpbnQgbmV0SWQgPSBjb25maWcubmV0d29ya0lkOworICAgICAgICBib29sZWFuIG5ld05ldHdvcmsgPSBuZXRJZCA9PSAtMTsKKyAgICAgICAgLy8gbmV0d29ya0lkIG9mIC0xIG1lYW5zIHdlIHdhbnQgdG8gY3JlYXRlIGEgbmV3IG5ldHdvcmsKKworICAgICAgICBpZiAobmV3TmV0d29yaykgeworICAgICAgICAgICAgbmV0SWQgPSBXaWZpTmF0aXZlLmFkZE5ldHdvcmtDb21tYW5kKCk7CisgICAgICAgICAgICBpZiAobmV0SWQgPCAwKSB7CisgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiRmFpbGVkIHRvIGFkZCBhIG5ldHdvcmshIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHNldFZhcmlhYmxlczogeworCisgICAgICAgICAgICBpZiAoY29uZmlnLlNTSUQgIT0gbnVsbCAmJgorICAgICAgICAgICAgICAgICAgICAhV2lmaU5hdGl2ZS5zZXROZXR3b3JrVmFyaWFibGVDb21tYW5kKAorICAgICAgICAgICAgICAgICAgICAgICAgbmV0SWQsCisgICAgICAgICAgICAgICAgICAgICAgICBXaWZpQ29uZmlndXJhdGlvbi5zc2lkVmFyTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5TU0lEKSkgeworICAgICAgICAgICAgICAgIExvZy5kKFRBRywgImZhaWxlZCB0byBzZXQgU1NJRDogIitjb25maWcuU1NJRCk7CisgICAgICAgICAgICAgICAgYnJlYWsgc2V0VmFyaWFibGVzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoY29uZmlnLkJTU0lEICE9IG51bGwgJiYKKyAgICAgICAgICAgICAgICAgICAgIVdpZmlOYXRpdmUuc2V0TmV0d29ya1ZhcmlhYmxlQ29tbWFuZCgKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldElkLAorICAgICAgICAgICAgICAgICAgICAgICAgV2lmaUNvbmZpZ3VyYXRpb24uYnNzaWRWYXJOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLkJTU0lEKSkgeworICAgICAgICAgICAgICAgIExvZy5kKFRBRywgImZhaWxlZCB0byBzZXQgQlNTSUQ6ICIrY29uZmlnLkJTU0lEKTsKKyAgICAgICAgICAgICAgICBicmVhayBzZXRWYXJpYWJsZXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFN0cmluZyBhbGxvd2VkS2V5TWFuYWdlbWVudFN0cmluZyA9CisgICAgICAgICAgICAgICAgbWFrZVN0cmluZyhjb25maWcuYWxsb3dlZEtleU1hbmFnZW1lbnQsIFdpZmlDb25maWd1cmF0aW9uLktleU1nbXQuc3RyaW5ncyk7CisgICAgICAgICAgICBpZiAoY29uZmlnLmFsbG93ZWRLZXlNYW5hZ2VtZW50LmNhcmRpbmFsaXR5KCkgIT0gMCAmJgorICAgICAgICAgICAgICAgICAgICAhV2lmaU5hdGl2ZS5zZXROZXR3b3JrVmFyaWFibGVDb21tYW5kKAorICAgICAgICAgICAgICAgICAgICAgICAgbmV0SWQsCisgICAgICAgICAgICAgICAgICAgICAgICBXaWZpQ29uZmlndXJhdGlvbi5LZXlNZ210LnZhck5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd2VkS2V5TWFuYWdlbWVudFN0cmluZykpIHsKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJmYWlsZWQgdG8gc2V0IGtleV9tZ210OiAiKworICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dlZEtleU1hbmFnZW1lbnRTdHJpbmcpOworICAgICAgICAgICAgICAgIGJyZWFrIHNldFZhcmlhYmxlczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU3RyaW5nIGFsbG93ZWRQcm90b2NvbHNTdHJpbmcgPQorICAgICAgICAgICAgICAgIG1ha2VTdHJpbmcoY29uZmlnLmFsbG93ZWRQcm90b2NvbHMsIFdpZmlDb25maWd1cmF0aW9uLlByb3RvY29sLnN0cmluZ3MpOworICAgICAgICAgICAgaWYgKGNvbmZpZy5hbGxvd2VkUHJvdG9jb2xzLmNhcmRpbmFsaXR5KCkgIT0gMCAmJgorICAgICAgICAgICAgICAgICAgICAhV2lmaU5hdGl2ZS5zZXROZXR3b3JrVmFyaWFibGVDb21tYW5kKAorICAgICAgICAgICAgICAgICAgICAgICAgbmV0SWQsCisgICAgICAgICAgICAgICAgICAgICAgICBXaWZpQ29uZmlndXJhdGlvbi5Qcm90b2NvbC52YXJOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dlZFByb3RvY29sc1N0cmluZykpIHsKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJmYWlsZWQgdG8gc2V0IHByb3RvOiAiKworICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dlZFByb3RvY29sc1N0cmluZyk7CisgICAgICAgICAgICAgICAgYnJlYWsgc2V0VmFyaWFibGVzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTdHJpbmcgYWxsb3dlZEF1dGhBbGdvcml0aG1zU3RyaW5nID0KKyAgICAgICAgICAgICAgICBtYWtlU3RyaW5nKGNvbmZpZy5hbGxvd2VkQXV0aEFsZ29yaXRobXMsIFdpZmlDb25maWd1cmF0aW9uLkF1dGhBbGdvcml0aG0uc3RyaW5ncyk7CisgICAgICAgICAgICBpZiAoY29uZmlnLmFsbG93ZWRBdXRoQWxnb3JpdGhtcy5jYXJkaW5hbGl0eSgpICE9IDAgJiYKKyAgICAgICAgICAgICAgICAgICAgIVdpZmlOYXRpdmUuc2V0TmV0d29ya1ZhcmlhYmxlQ29tbWFuZCgKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldElkLAorICAgICAgICAgICAgICAgICAgICAgICAgV2lmaUNvbmZpZ3VyYXRpb24uQXV0aEFsZ29yaXRobS52YXJOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dlZEF1dGhBbGdvcml0aG1zU3RyaW5nKSkgeworICAgICAgICAgICAgICAgIExvZy5kKFRBRywgImZhaWxlZCB0byBzZXQgYXV0aF9hbGc6ICIrCisgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd2VkQXV0aEFsZ29yaXRobXNTdHJpbmcpOworICAgICAgICAgICAgICAgIGJyZWFrIHNldFZhcmlhYmxlczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU3RyaW5nIGFsbG93ZWRQYWlyd2lzZUNpcGhlcnNTdHJpbmcgPQorICAgICAgICAgICAgICAgICAgICBtYWtlU3RyaW5nKGNvbmZpZy5hbGxvd2VkUGFpcndpc2VDaXBoZXJzLAorICAgICAgICAgICAgICAgICAgICBXaWZpQ29uZmlndXJhdGlvbi5QYWlyd2lzZUNpcGhlci5zdHJpbmdzKTsKKyAgICAgICAgICAgIGlmIChjb25maWcuYWxsb3dlZFBhaXJ3aXNlQ2lwaGVycy5jYXJkaW5hbGl0eSgpICE9IDAgJiYKKyAgICAgICAgICAgICAgICAgICAgIVdpZmlOYXRpdmUuc2V0TmV0d29ya1ZhcmlhYmxlQ29tbWFuZCgKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldElkLAorICAgICAgICAgICAgICAgICAgICAgICAgV2lmaUNvbmZpZ3VyYXRpb24uUGFpcndpc2VDaXBoZXIudmFyTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93ZWRQYWlyd2lzZUNpcGhlcnNTdHJpbmcpKSB7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiZmFpbGVkIHRvIHNldCBwYWlyd2lzZTogIisKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93ZWRQYWlyd2lzZUNpcGhlcnNTdHJpbmcpOworICAgICAgICAgICAgICAgIGJyZWFrIHNldFZhcmlhYmxlczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU3RyaW5nIGFsbG93ZWRHcm91cENpcGhlcnNTdHJpbmcgPQorICAgICAgICAgICAgICAgIG1ha2VTdHJpbmcoY29uZmlnLmFsbG93ZWRHcm91cENpcGhlcnMsIFdpZmlDb25maWd1cmF0aW9uLkdyb3VwQ2lwaGVyLnN0cmluZ3MpOworICAgICAgICAgICAgaWYgKGNvbmZpZy5hbGxvd2VkR3JvdXBDaXBoZXJzLmNhcmRpbmFsaXR5KCkgIT0gMCAmJgorICAgICAgICAgICAgICAgICAgICAhV2lmaU5hdGl2ZS5zZXROZXR3b3JrVmFyaWFibGVDb21tYW5kKAorICAgICAgICAgICAgICAgICAgICAgICAgbmV0SWQsCisgICAgICAgICAgICAgICAgICAgICAgICBXaWZpQ29uZmlndXJhdGlvbi5Hcm91cENpcGhlci52YXJOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dlZEdyb3VwQ2lwaGVyc1N0cmluZykpIHsKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJmYWlsZWQgdG8gc2V0IGdyb3VwOiAiKworICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dlZEdyb3VwQ2lwaGVyc1N0cmluZyk7CisgICAgICAgICAgICAgICAgYnJlYWsgc2V0VmFyaWFibGVzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBQcmV2ZW50IGNsaWVudCBzY3Jldy11cCBieSBwYXNzaW5nIGluIGEgV2lmaUNvbmZpZ3VyYXRpb24gd2UgZ2F2ZSBpdAorICAgICAgICAgICAgLy8gYnkgcHJldmVudGluZyAiKiIgYXMgYSBrZXkuCisgICAgICAgICAgICBpZiAoY29uZmlnLnByZVNoYXJlZEtleSAhPSBudWxsICYmICFjb25maWcucHJlU2hhcmVkS2V5LmVxdWFscygiKiIpICYmCisgICAgICAgICAgICAgICAgICAgICFXaWZpTmF0aXZlLnNldE5ldHdvcmtWYXJpYWJsZUNvbW1hbmQoCisgICAgICAgICAgICAgICAgICAgICAgICBuZXRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlDb25maWd1cmF0aW9uLnBza1Zhck5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcucHJlU2hhcmVkS2V5KSkgeworICAgICAgICAgICAgICAgIExvZy5kKFRBRywgImZhaWxlZCB0byBzZXQgcHNrOiAiK2NvbmZpZy5wcmVTaGFyZWRLZXkpOworICAgICAgICAgICAgICAgIGJyZWFrIHNldFZhcmlhYmxlczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYm9vbGVhbiBoYXNTZXRLZXkgPSBmYWxzZTsKKyAgICAgICAgICAgIGlmIChjb25maWcud2VwS2V5cyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb25maWcud2VwS2V5cy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAvLyBQcmV2ZW50IGNsaWVudCBzY3Jldy11cCBieSBwYXNzaW5nIGluIGEgV2lmaUNvbmZpZ3VyYXRpb24gd2UgZ2F2ZSBpdAorICAgICAgICAgICAgICAgICAgICAvLyBieSBwcmV2ZW50aW5nICIqIiBhcyBhIGtleS4KKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy53ZXBLZXlzW2ldICE9IG51bGwgJiYgIWNvbmZpZy53ZXBLZXlzW2ldLmVxdWFscygiKiIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIVdpZmlOYXRpdmUuc2V0TmV0d29ya1ZhcmlhYmxlQ29tbWFuZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lmaUNvbmZpZ3VyYXRpb24ud2VwS2V5VmFyTmFtZXNbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcud2VwS2V5c1tpXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmFpbGVkIHRvIHNldCB3ZXBfa2V5IitpKyI6ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLndlcEtleXNbaV0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIHNldFZhcmlhYmxlczsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGhhc1NldEtleSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChoYXNTZXRLZXkpIHsKKyAgICAgICAgICAgICAgICBpZiAoIVdpZmlOYXRpdmUuc2V0TmV0d29ya1ZhcmlhYmxlQ29tbWFuZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWZpQ29uZmlndXJhdGlvbi53ZXBUeEtleUlkeFZhck5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWdlci50b1N0cmluZyhjb25maWcud2VwVHhLZXlJbmRleCkpKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmFpbGVkIHRvIHNldCB3ZXBfdHhfa2V5aWR4OiAiKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy53ZXBUeEtleUluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsgc2V0VmFyaWFibGVzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFXaWZpTmF0aXZlLnNldE5ldHdvcmtWYXJpYWJsZUNvbW1hbmQoCisgICAgICAgICAgICAgICAgICAgICAgICBuZXRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlDb25maWd1cmF0aW9uLnByaW9yaXR5VmFyTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEludGVnZXIudG9TdHJpbmcoY29uZmlnLnByaW9yaXR5KSkpIHsKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsIGNvbmZpZy5TU0lEICsgIjogZmFpbGVkIHRvIHNldCBwcmlvcml0eTogIgorICAgICAgICAgICAgICAgICAgICAgICAgK2NvbmZpZy5wcmlvcml0eSk7CisgICAgICAgICAgICAgICAgYnJlYWsgc2V0VmFyaWFibGVzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoY29uZmlnLmhpZGRlblNTSUQgJiYgIVdpZmlOYXRpdmUuc2V0TmV0d29ya1ZhcmlhYmxlQ29tbWFuZCgKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldElkLAorICAgICAgICAgICAgICAgICAgICAgICAgV2lmaUNvbmZpZ3VyYXRpb24uaGlkZGVuU1NJRFZhck5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvU3RyaW5nKGNvbmZpZy5oaWRkZW5TU0lEID8gMSA6IDApKSkgeworICAgICAgICAgICAgICAgIExvZy5kKFRBRywgY29uZmlnLlNTSUQgKyAiOiBmYWlsZWQgdG8gc2V0IGhpZGRlblNTSUQ6ICIrCisgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcuaGlkZGVuU1NJRCk7CisgICAgICAgICAgICAgICAgYnJlYWsgc2V0VmFyaWFibGVzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKFdpZmlDb25maWd1cmF0aW9uLkVudGVycHJpc2VGaWVsZCBmaWVsZAorICAgICAgICAgICAgICAgICAgICA6IGNvbmZpZy5lbnRlcnByaXNlRmllbGRzKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHZhck5hbWUgPSBmaWVsZC52YXJOYW1lKCk7CisgICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gZmllbGQudmFsdWUoKTsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQgIT0gY29uZmlnLmVhcCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSAodmFsdWUubGVuZ3RoKCkgPT0gMCkgPyAiTlVMTCIgOiBjb252ZXJ0VG9RdW90ZWRTdHJpbmcodmFsdWUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICghV2lmaU5hdGl2ZS5zZXROZXR3b3JrVmFyaWFibGVDb21tYW5kKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsIGNvbmZpZy5TU0lEICsgIjogZmFpbGVkIHRvIHNldCAiICsgdmFyTmFtZSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI6ICIgKyB2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhayBzZXRWYXJpYWJsZXM7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbmV0SWQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAobmV3TmV0d29yaykgeworICAgICAgICAgICAgV2lmaU5hdGl2ZS5yZW1vdmVOZXR3b3JrQ29tbWFuZChuZXRJZCk7CisgICAgICAgICAgICBMb2cuZChUQUcsCisgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gc2V0IGEgbmV0d29yayB2YXJpYWJsZSwgcmVtb3ZlZCBuZXR3b3JrOiAiCisgICAgICAgICAgICAgICAgICAgICsgbmV0SWQpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB1cGRhdGVDb25maWd1cmVkTmV0d29ya3MoKSB7CisgICAgICAgIFN0cmluZyBsaXN0U3RyID0gV2lmaU5hdGl2ZS5saXN0TmV0d29ya3NDb21tYW5kKCk7CisgICAgICAgIG1MYXN0UHJpb3JpdHkgPSAwOworCisgICAgICAgIHN5bmNocm9uaXplZCAobUNvbmZpZ3VyZWROZXR3b3JrcykgeworICAgICAgICAgICAgbUNvbmZpZ3VyZWROZXR3b3Jrcy5jbGVhcigpOworCisgICAgICAgICAgICBpZiAobGlzdFN0ciA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgU3RyaW5nW10gbGluZXMgPSBsaXN0U3RyLnNwbGl0KCJcbiIpOworICAgICAgICAgICAgLy8gU2tpcCB0aGUgZmlyc3QgbGluZSwgd2hpY2ggaXMgYSBoZWFkZXIKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBTdHJpbmdbXSByZXN1bHQgPSBsaW5lc1tpXS5zcGxpdCgiXHQiKTsKKyAgICAgICAgICAgICAgICAvLyBuZXR3b3JrLWlkIHwgc3NpZCB8IGJzc2lkIHwgZmxhZ3MKKyAgICAgICAgICAgICAgICBXaWZpQ29uZmlndXJhdGlvbiBjb25maWcgPSBuZXcgV2lmaUNvbmZpZ3VyYXRpb24oKTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBjb25maWcubmV0d29ya0lkID0gSW50ZWdlci5wYXJzZUludChyZXN1bHRbMF0pOworICAgICAgICAgICAgICAgIH0gY2F0Y2goTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChyZXN1bHQubGVuZ3RoID4gMykgeworICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0WzNdLmluZGV4T2YoIltDVVJSRU5UXSIpICE9IC0xKQorICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLnN0YXR1cyA9IFdpZmlDb25maWd1cmF0aW9uLlN0YXR1cy5DVVJSRU5UOworICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChyZXN1bHRbM10uaW5kZXhPZigiW0RJU0FCTEVEXSIpICE9IC0xKQorICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLnN0YXR1cyA9IFdpZmlDb25maWd1cmF0aW9uLlN0YXR1cy5ESVNBQkxFRDsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLnN0YXR1cyA9IFdpZmlDb25maWd1cmF0aW9uLlN0YXR1cy5FTkFCTEVEOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5zdGF0dXMgPSBXaWZpQ29uZmlndXJhdGlvbi5TdGF0dXMuRU5BQkxFRDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmVhZE5ldHdvcmtWYXJpYWJsZXMoY29uZmlnKTsKKyAgICAgICAgICAgICAgICBpZiAoY29uZmlnLnByaW9yaXR5ID4gbUxhc3RQcmlvcml0eSkgeworICAgICAgICAgICAgICAgICAgICBtTGFzdFByaW9yaXR5ID0gY29uZmlnLnByaW9yaXR5OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtQ29uZmlndXJlZE5ldHdvcmtzLmFkZChjb25maWcpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZWFkIHRoZSB2YXJpYWJsZXMgZnJvbSB0aGUgc3VwcGxpY2FudCBkYWVtb24gdGhhdCBhcmUgbmVlZGVkIHRvCisgICAgICogZmlsbCBpbiB0aGUgV2lmaUNvbmZpZ3VyYXRpb24gb2JqZWN0LgorICAgICAqCisgICAgICogQHBhcmFtIGNvbmZpZyB0aGUge0BsaW5rIFdpZmlDb25maWd1cmF0aW9ufSBvYmplY3QgdG8gYmUgZmlsbGVkIGluLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCByZWFkTmV0d29ya1ZhcmlhYmxlcyhXaWZpQ29uZmlndXJhdGlvbiBjb25maWcpIHsKKworICAgICAgICBpbnQgbmV0SWQgPSBjb25maWcubmV0d29ya0lkOworICAgICAgICBpZiAobmV0SWQgPCAwKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIC8qCisgICAgICAgICAqIFRPRE86IG1heWJlIHNob3VsZCBoYXZlIGEgbmF0aXZlIG1ldGhvZCB0aGF0IHRha2VzIGFuIGFycmF5IG9mCisgICAgICAgICAqIHZhcmlhYmxlIG5hbWVzIGFuZCByZXR1cm5zIGFuIGFycmF5IG9mIHZhbHVlcy4gQnV0IHdlJ2Qgc3RpbGwKKyAgICAgICAgICogYmUgZG9pbmcgYSByb3VuZCB0cmlwIHRvIHRoZSBzdXBwbGljYW50IGRhZW1vbiBmb3IgZWFjaCB2YXJpYWJsZS4KKyAgICAgICAgICovCisgICAgICAgIFN0cmluZyB2YWx1ZTsKKworICAgICAgICB2YWx1ZSA9IFdpZmlOYXRpdmUuZ2V0TmV0d29ya1ZhcmlhYmxlQ29tbWFuZChuZXRJZCwgV2lmaUNvbmZpZ3VyYXRpb24uc3NpZFZhck5hbWUpOworICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHZhbHVlKSkgeworICAgICAgICAgICAgY29uZmlnLlNTSUQgPSByZW1vdmVEb3VibGVRdW90ZXModmFsdWUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29uZmlnLlNTSUQgPSBudWxsOworICAgICAgICB9CisKKyAgICAgICAgdmFsdWUgPSBXaWZpTmF0aXZlLmdldE5ldHdvcmtWYXJpYWJsZUNvbW1hbmQobmV0SWQsIFdpZmlDb25maWd1cmF0aW9uLmJzc2lkVmFyTmFtZSk7CisgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkodmFsdWUpKSB7CisgICAgICAgICAgICBjb25maWcuQlNTSUQgPSB2YWx1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNvbmZpZy5CU1NJRCA9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICB2YWx1ZSA9IFdpZmlOYXRpdmUuZ2V0TmV0d29ya1ZhcmlhYmxlQ29tbWFuZChuZXRJZCwgV2lmaUNvbmZpZ3VyYXRpb24ucHJpb3JpdHlWYXJOYW1lKTsKKyAgICAgICAgY29uZmlnLnByaW9yaXR5ID0gLTE7CisgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkodmFsdWUpKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGNvbmZpZy5wcmlvcml0eSA9IEludGVnZXIucGFyc2VJbnQodmFsdWUpOworICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdmFsdWUgPSBXaWZpTmF0aXZlLmdldE5ldHdvcmtWYXJpYWJsZUNvbW1hbmQobmV0SWQsIFdpZmlDb25maWd1cmF0aW9uLmhpZGRlblNTSURWYXJOYW1lKTsKKyAgICAgICAgY29uZmlnLmhpZGRlblNTSUQgPSBmYWxzZTsKKyAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eSh2YWx1ZSkpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgY29uZmlnLmhpZGRlblNTSUQgPSBJbnRlZ2VyLnBhcnNlSW50KHZhbHVlKSAhPSAwOworICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdmFsdWUgPSBXaWZpTmF0aXZlLmdldE5ldHdvcmtWYXJpYWJsZUNvbW1hbmQobmV0SWQsIFdpZmlDb25maWd1cmF0aW9uLndlcFR4S2V5SWR4VmFyTmFtZSk7CisgICAgICAgIGNvbmZpZy53ZXBUeEtleUluZGV4ID0gLTE7CisgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkodmFsdWUpKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGNvbmZpZy53ZXBUeEtleUluZGV4ID0gSW50ZWdlci5wYXJzZUludCh2YWx1ZSk7CisgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICAgICAgdmFsdWUgPSBXaWZpTmF0aXZlLmdldE5ldHdvcmtWYXJpYWJsZUNvbW1hbmQobmV0SWQsCisgICAgICAgICAgICAgICAgICAgIFdpZmlDb25maWd1cmF0aW9uLndlcEtleVZhck5hbWVzW2ldKTsKKyAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkodmFsdWUpKSB7CisgICAgICAgICAgICAgICAgY29uZmlnLndlcEtleXNbaV0gPSB2YWx1ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY29uZmlnLndlcEtleXNbaV0gPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdmFsdWUgPSBXaWZpTmF0aXZlLmdldE5ldHdvcmtWYXJpYWJsZUNvbW1hbmQobmV0SWQsIFdpZmlDb25maWd1cmF0aW9uLnBza1Zhck5hbWUpOworICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHZhbHVlKSkgeworICAgICAgICAgICAgY29uZmlnLnByZVNoYXJlZEtleSA9IHZhbHVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29uZmlnLnByZVNoYXJlZEtleSA9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICB2YWx1ZSA9IFdpZmlOYXRpdmUuZ2V0TmV0d29ya1ZhcmlhYmxlQ29tbWFuZChjb25maWcubmV0d29ya0lkLAorICAgICAgICAgICAgICAgIFdpZmlDb25maWd1cmF0aW9uLlByb3RvY29sLnZhck5hbWUpOworICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHZhbHVlKSkgeworICAgICAgICAgICAgU3RyaW5nIHZhbHNbXSA9IHZhbHVlLnNwbGl0KCIgIik7CisgICAgICAgICAgICBmb3IgKFN0cmluZyB2YWwgOiB2YWxzKSB7CisgICAgICAgICAgICAgICAgaW50IGluZGV4ID0KKyAgICAgICAgICAgICAgICAgICAgbG9va3VwU3RyaW5nKHZhbCwgV2lmaUNvbmZpZ3VyYXRpb24uUHJvdG9jb2wuc3RyaW5ncyk7CisgICAgICAgICAgICAgICAgaWYgKDAgPD0gaW5kZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgY29uZmlnLmFsbG93ZWRQcm90b2NvbHMuc2V0KGluZGV4KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB2YWx1ZSA9IFdpZmlOYXRpdmUuZ2V0TmV0d29ya1ZhcmlhYmxlQ29tbWFuZChjb25maWcubmV0d29ya0lkLAorICAgICAgICAgICAgICAgIFdpZmlDb25maWd1cmF0aW9uLktleU1nbXQudmFyTmFtZSk7CisgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkodmFsdWUpKSB7CisgICAgICAgICAgICBTdHJpbmcgdmFsc1tdID0gdmFsdWUuc3BsaXQoIiAiKTsKKyAgICAgICAgICAgIGZvciAoU3RyaW5nIHZhbCA6IHZhbHMpIHsKKyAgICAgICAgICAgICAgICBpbnQgaW5kZXggPQorICAgICAgICAgICAgICAgICAgICBsb29rdXBTdHJpbmcodmFsLCBXaWZpQ29uZmlndXJhdGlvbi5LZXlNZ210LnN0cmluZ3MpOworICAgICAgICAgICAgICAgIGlmICgwIDw9IGluZGV4KSB7CisgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5hbGxvd2VkS2V5TWFuYWdlbWVudC5zZXQoaW5kZXgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHZhbHVlID0gV2lmaU5hdGl2ZS5nZXROZXR3b3JrVmFyaWFibGVDb21tYW5kKGNvbmZpZy5uZXR3b3JrSWQsCisgICAgICAgICAgICAgICAgV2lmaUNvbmZpZ3VyYXRpb24uQXV0aEFsZ29yaXRobS52YXJOYW1lKTsKKyAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eSh2YWx1ZSkpIHsKKyAgICAgICAgICAgIFN0cmluZyB2YWxzW10gPSB2YWx1ZS5zcGxpdCgiICIpOworICAgICAgICAgICAgZm9yIChTdHJpbmcgdmFsIDogdmFscykgeworICAgICAgICAgICAgICAgIGludCBpbmRleCA9CisgICAgICAgICAgICAgICAgICAgIGxvb2t1cFN0cmluZyh2YWwsIFdpZmlDb25maWd1cmF0aW9uLkF1dGhBbGdvcml0aG0uc3RyaW5ncyk7CisgICAgICAgICAgICAgICAgaWYgKDAgPD0gaW5kZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgY29uZmlnLmFsbG93ZWRBdXRoQWxnb3JpdGhtcy5zZXQoaW5kZXgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHZhbHVlID0gV2lmaU5hdGl2ZS5nZXROZXR3b3JrVmFyaWFibGVDb21tYW5kKGNvbmZpZy5uZXR3b3JrSWQsCisgICAgICAgICAgICAgICAgV2lmaUNvbmZpZ3VyYXRpb24uUGFpcndpc2VDaXBoZXIudmFyTmFtZSk7CisgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkodmFsdWUpKSB7CisgICAgICAgICAgICBTdHJpbmcgdmFsc1tdID0gdmFsdWUuc3BsaXQoIiAiKTsKKyAgICAgICAgICAgIGZvciAoU3RyaW5nIHZhbCA6IHZhbHMpIHsKKyAgICAgICAgICAgICAgICBpbnQgaW5kZXggPQorICAgICAgICAgICAgICAgICAgICBsb29rdXBTdHJpbmcodmFsLCBXaWZpQ29uZmlndXJhdGlvbi5QYWlyd2lzZUNpcGhlci5zdHJpbmdzKTsKKyAgICAgICAgICAgICAgICBpZiAoMCA8PSBpbmRleCkgeworICAgICAgICAgICAgICAgICAgICBjb25maWcuYWxsb3dlZFBhaXJ3aXNlQ2lwaGVycy5zZXQoaW5kZXgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHZhbHVlID0gV2lmaU5hdGl2ZS5nZXROZXR3b3JrVmFyaWFibGVDb21tYW5kKGNvbmZpZy5uZXR3b3JrSWQsCisgICAgICAgICAgICAgICAgV2lmaUNvbmZpZ3VyYXRpb24uR3JvdXBDaXBoZXIudmFyTmFtZSk7CisgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkodmFsdWUpKSB7CisgICAgICAgICAgICBTdHJpbmcgdmFsc1tdID0gdmFsdWUuc3BsaXQoIiAiKTsKKyAgICAgICAgICAgIGZvciAoU3RyaW5nIHZhbCA6IHZhbHMpIHsKKyAgICAgICAgICAgICAgICBpbnQgaW5kZXggPQorICAgICAgICAgICAgICAgICAgICBsb29rdXBTdHJpbmcodmFsLCBXaWZpQ29uZmlndXJhdGlvbi5Hcm91cENpcGhlci5zdHJpbmdzKTsKKyAgICAgICAgICAgICAgICBpZiAoMCA8PSBpbmRleCkgeworICAgICAgICAgICAgICAgICAgICBjb25maWcuYWxsb3dlZEdyb3VwQ2lwaGVycy5zZXQoaW5kZXgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvciAoV2lmaUNvbmZpZ3VyYXRpb24uRW50ZXJwcmlzZUZpZWxkIGZpZWxkIDoKKyAgICAgICAgICAgICAgICBjb25maWcuZW50ZXJwcmlzZUZpZWxkcykgeworICAgICAgICAgICAgdmFsdWUgPSBXaWZpTmF0aXZlLmdldE5ldHdvcmtWYXJpYWJsZUNvbW1hbmQobmV0SWQsCisgICAgICAgICAgICAgICAgICAgIGZpZWxkLnZhck5hbWUoKSk7CisgICAgICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHZhbHVlKSkgeworICAgICAgICAgICAgICAgIGlmIChmaWVsZCAhPSBjb25maWcuZWFwKSB2YWx1ZSA9IHJlbW92ZURvdWJsZVF1b3Rlcyh2YWx1ZSk7CisgICAgICAgICAgICAgICAgZmllbGQuc2V0VmFsdWUodmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQb2xsIGZvciBpbmZvIG5vdCByZXBvcnRlZCB2aWEgZXZlbnRzCisgICAgICogUlNTSSAmIExpbmtzcGVlZAorICAgICAqLworICAgIHByaXZhdGUgdm9pZCByZXF1ZXN0UG9sbGVkSW5mbygpIHsKKyAgICAgICAgaW50IG5ld1Jzc2kgPSBXaWZpTmF0aXZlLmdldFJzc2lDb21tYW5kKCk7CisgICAgICAgIGlmIChuZXdSc3NpICE9IC0xICYmIC0yMDAgPCBuZXdSc3NpICYmIG5ld1Jzc2kgPCAyNTYpIHsgLy8gc2NyZWVuIG91dCBpbnZhbGlkIHZhbHVlcworICAgICAgICAgICAgLyogc29tZSBpbXBsZW1lbnRhdGlvbnMgYXZvaWQgbmVnYXRpdmUgdmFsdWVzIGJ5IGFkZGluZyAyNTYKKyAgICAgICAgICAgICAqIHNvIHdlIG5lZWQgdG8gYWRqdXN0IGZvciB0aGF0IGhlcmUuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChuZXdSc3NpID4gMCkgbmV3UnNzaSAtPSAyNTY7CisgICAgICAgICAgICBtV2lmaUluZm8uc2V0UnNzaShuZXdSc3NpKTsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBSYXRoZXIgdGhlbiBzZW5kaW5nIHRoZSByYXcgUlNTSSBvdXQgZXZlcnkgdGltZSBpdAorICAgICAgICAgICAgICogY2hhbmdlcywgd2UgcHJlY2FsY3VsYXRlIHRoZSBzaWduYWwgbGV2ZWwgdGhhdCB3b3VsZAorICAgICAgICAgICAgICogYmUgZGlzcGxheWVkIGluIHRoZSBzdGF0dXMgYmFyLCBhbmQgb25seSBzZW5kIHRoZQorICAgICAgICAgICAgICogYnJvYWRjYXN0IGlmIHRoYXQgbXVjaCBtb3JlIGNvYXJzZS1ncmFpbmVkIG51bWJlcgorICAgICAgICAgICAgICogY2hhbmdlcy4gVGhpcyBjdXRzIGRvd24gZ3JlYXRseSBvbiB0aGUgbnVtYmVyIG9mCisgICAgICAgICAgICAgKiBicm9hZGNhc3RzLCBhdCB0aGUgY29zdCBvZiBub3QgbVdpZmlJbmZvcm1pbmcgb3RoZXJzCisgICAgICAgICAgICAgKiBpbnRlcmVzdGVkIGluIFJTU0kgb2YgYWxsIHRoZSBjaGFuZ2VzIGluIHNpZ25hbAorICAgICAgICAgICAgICogbGV2ZWwuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIC8vIFRPRE86IFRoZSBzZWNvbmQgYXJnIHRvIHRoZSBjYWxsIGJlbG93IG5lZWRzIHRvIGJlIGEgc3ltYm9sIHNvbWV3aGVyZSwgYnV0CisgICAgICAgICAgICAvLyBpdCdzIGFjdHVhbGx5IHRoZSBzaXplIG9mIGFuIGFycmF5IG9mIGljb25zIHRoYXQncyBwcml2YXRlCisgICAgICAgICAgICAvLyB0byBTdGF0dXNCYXIgUG9saWN5LgorICAgICAgICAgICAgaW50IG5ld1NpZ25hbExldmVsID0gV2lmaU1hbmFnZXIuY2FsY3VsYXRlU2lnbmFsTGV2ZWwobmV3UnNzaSwgNCk7CisgICAgICAgICAgICBpZiAobmV3U2lnbmFsTGV2ZWwgIT0gbUxhc3RTaWduYWxMZXZlbCkgeworICAgICAgICAgICAgICAgIHNlbmRSc3NpQ2hhbmdlQnJvYWRjYXN0KG5ld1Jzc2kpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUxhc3RTaWduYWxMZXZlbCA9IG5ld1NpZ25hbExldmVsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVdpZmlJbmZvLnNldFJzc2koLTIwMCk7CisgICAgICAgIH0KKyAgICAgICAgaW50IG5ld0xpbmtTcGVlZCA9IFdpZmlOYXRpdmUuZ2V0TGlua1NwZWVkQ29tbWFuZCgpOworICAgICAgICBpZiAobmV3TGlua1NwZWVkICE9IC0xKSB7CisgICAgICAgICAgICBtV2lmaUluZm8uc2V0TGlua1NwZWVkKG5ld0xpbmtTcGVlZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXNldHMgdGhlIFdpLUZpIENvbm5lY3Rpb25zIGJ5IGNsZWFyaW5nIGFueSBzdGF0ZSwgcmVzZXR0aW5nIGFueSBzb2NrZXRzCisgICAgICogdXNpbmcgdGhlIGludGVyZmFjZSwgc3RvcHBpbmcgREhDUCAmIGRpc2FibGluZyBpbnRlcmZhY2UKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgaGFuZGxlTmV0d29ya0Rpc2Nvbm5lY3QoKSB7CisgICAgICAgIExvZy5kKFRBRywgIlJlc2V0IGNvbm5lY3Rpb25zIGFuZCBzdG9wcGluZyBESENQIik7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogUmVzZXQgY29ubmVjdGlvbnMgJiBzdG9wIERIQ1AKKyAgICAgICAgICovCisgICAgICAgIE5ldHdvcmtVdGlscy5yZXNldENvbm5lY3Rpb25zKG1JbnRlcmZhY2VOYW1lKTsKKworICAgICAgICBpZiAoIU5ldHdvcmtVdGlscy5zdG9wRGhjcChtSW50ZXJmYWNlTmFtZSkpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIkNvdWxkIG5vdCBzdG9wIERIQ1AiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIERpc2FibGUgaW50ZXJmYWNlICovCisgICAgICAgIE5ldHdvcmtVdGlscy5kaXNhYmxlSW50ZXJmYWNlKG1JbnRlcmZhY2VOYW1lKTsKKworICAgICAgICAvKiBzZW5kIGV2ZW50IHRvIENNICYgbmV0d29yayBjaGFuZ2UgYnJvYWRjYXN0ICovCisgICAgICAgIHNldERldGFpbGVkU3RhdGUoRGV0YWlsZWRTdGF0ZS5ESVNDT05ORUNURUQpOworICAgICAgICBzZW5kTmV0d29ya1N0YXRlQ2hhbmdlQnJvYWRjYXN0KG1MYXN0QnNzaWQpOworCisgICAgICAgIC8qIFJlc2V0IGRhdGEgc3RydWN0dXJlcyAqLworICAgICAgICBtV2lmaUluZm8uc2V0SXBBZGRyZXNzKDApOworICAgICAgICBtV2lmaUluZm8uc2V0QlNTSUQobnVsbCk7CisgICAgICAgIG1XaWZpSW5mby5zZXRTU0lEKG51bGwpOworICAgICAgICBtV2lmaUluZm8uc2V0TmV0d29ya0lkKC0xKTsKKworICAgICAgICAvKiBDbGVhciBuZXR3b3JrIHByb3BlcnRpZXMgKi8KKyAgICAgICAgbU5ldHdvcmtQcm9wZXJ0aWVzLmNsZWFyKCk7CisKKyAgICAgICAgbUxhc3RCc3NpZD0gbnVsbDsKKyAgICAgICAgbUxhc3ROZXR3b3JrSWQgPSAtMTsKKworICAgIH0KKworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAqIE5vdGlmaWNhdGlvbnMgZnJvbSBXaWZpTW9uaXRvcgorICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIC8qKgorICAgICAqIEEgc3RydWN0dXJlIGZvciBzdXBwbHlpbmcgaW5mb3JtYXRpb24gYWJvdXQgYSBzdXBwbGljYW50IHN0YXRlCisgICAgICogY2hhbmdlIGluIHRoZSBTVEFURV9DSEFOR0UgZXZlbnQgbWVzc2FnZSB0aGF0IGNvbWVzIGZyb20gdGhlCisgICAgICogV2lmaU1vbml0b3IKKyAgICAgKiB0aHJlYWQuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU3RhdGVDaGFuZ2VSZXN1bHQgeworICAgICAgICBTdGF0ZUNoYW5nZVJlc3VsdChpbnQgbmV0d29ya0lkLCBTdHJpbmcgQlNTSUQsIE9iamVjdCBzdGF0ZSkgeworICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IHN0YXRlOworICAgICAgICAgICAgdGhpcy5CU1NJRCA9IEJTU0lEOworICAgICAgICAgICAgdGhpcy5uZXR3b3JrSWQgPSBuZXR3b3JrSWQ7CisgICAgICAgIH0KKyAgICAgICAgaW50IG5ldHdvcmtJZDsKKyAgICAgICAgU3RyaW5nIEJTU0lEOworICAgICAgICBPYmplY3Qgc3RhdGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VuZCB0aGUgdHJhY2tlciBhIG5vdGlmaWNhdGlvbiB0aGF0IGEgdXNlci1lbnRlcmVkIHBhc3N3b3JkIGtleQorICAgICAqIG1heSBiZSBpbmNvcnJlY3QgKGkuZS4sIGNhdXNlZCBhdXRoZW50aWNhdGlvbiB0byBmYWlsKS4KKyAgICAgKi8KKyAgICB2b2lkIG5vdGlmeVBhc3N3b3JkS2V5TWF5QmVJbmNvcnJlY3QoKSB7CisgICAgICAgIHNlbmRNZXNzYWdlKFBBU1NXT1JEX01BWV9CRV9JTkNPUlJFQ1RfRVZFTlQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNlbmQgdGhlIHRyYWNrZXIgYSBub3RpZmljYXRpb24gdGhhdCBhIGNvbm5lY3Rpb24gdG8gdGhlIHN1cHBsaWNhbnQKKyAgICAgKiBkYWVtb24gaGFzIGJlZW4gZXN0YWJsaXNoZWQuCisgICAgICovCisgICAgdm9pZCBub3RpZnlTdXBwbGljYW50Q29ubmVjdGlvbigpIHsKKyAgICAgICAgc2VuZE1lc3NhZ2UoU1VQX0NPTk5FQ1RJT05fRVZFTlQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNlbmQgdGhlIHRyYWNrZXIgYSBub3RpZmljYXRpb24gdGhhdCBhIGNvbm5lY3Rpb24gdG8gdGhlIHN1cHBsaWNhbnQKKyAgICAgKiBkYWVtb24gaGFzIGJlZW4gZXN0YWJsaXNoZWQuCisgICAgICovCisgICAgdm9pZCBub3RpZnlTdXBwbGljYW50TG9zdCgpIHsKKyAgICAgICAgc2VuZE1lc3NhZ2UoU1VQX0RJU0NPTk5FQ1RJT05fRVZFTlQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNlbmQgdGhlIHRyYWNrZXIgYSBub3RpZmljYXRpb24gdGhhdCB0aGUgc3RhdGUgb2YgV2lmaSBjb25uZWN0aXZpdHkKKyAgICAgKiBoYXMgY2hhbmdlZC4KKyAgICAgKiBAcGFyYW0gbmV0d29ya0lkIHRoZSBjb25maWd1cmVkIG5ldHdvcmsgb24gd2hpY2ggdGhlIHN0YXRlIGNoYW5nZSBvY2N1cnJlZAorICAgICAqIEBwYXJhbSBuZXdTdGF0ZSB0aGUgbmV3IG5ldHdvcmsgc3RhdGUKKyAgICAgKiBAcGFyYW0gQlNTSUQgd2hlbiB0aGUgbmV3IHN0YXRlIGlzIHtAbGluayBEZXRhaWxlZFN0YXRlI0NPTk5FQ1RFRAorICAgICAqIE5ldHdvcmtJbmZvLkRldGFpbGVkU3RhdGUuQ09OTkVDVEVEfSwKKyAgICAgKiB0aGlzIGlzIHRoZSBNQUMgYWRkcmVzcyBvZiB0aGUgYWNjZXNzIHBvaW50LiBPdGhlcndpc2UsIGl0CisgICAgICogaXMge0Bjb2RlIG51bGx9LgorICAgICAqLworICAgIHZvaWQgbm90aWZ5TmV0d29ya1N0YXRlQ2hhbmdlKERldGFpbGVkU3RhdGUgbmV3U3RhdGUsIFN0cmluZyBCU1NJRCwgaW50IG5ldHdvcmtJZCkgeworICAgICAgICBpZiAobmV3U3RhdGUgPT0gTmV0d29ya0luZm8uRGV0YWlsZWRTdGF0ZS5DT05ORUNURUQpIHsKKyAgICAgICAgICAgIHNlbmRNZXNzYWdlKG9idGFpbk1lc3NhZ2UoTkVUV09SS19DT05ORUNUSU9OX0VWRU5ULAorICAgICAgICAgICAgICAgICAgICBuZXcgU3RhdGVDaGFuZ2VSZXN1bHQobmV0d29ya0lkLCBCU1NJRCwgbmV3U3RhdGUpKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzZW5kTWVzc2FnZShvYnRhaW5NZXNzYWdlKE5FVFdPUktfRElTQ09OTkVDVElPTl9FVkVOVCwKKyAgICAgICAgICAgICAgICAgICAgbmV3IFN0YXRlQ2hhbmdlUmVzdWx0KG5ldHdvcmtJZCwgQlNTSUQsIG5ld1N0YXRlKSkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VuZCB0aGUgdHJhY2tlciBhIG5vdGlmaWNhdGlvbiB0aGF0IHRoZSBzdGF0ZSBvZiB0aGUgc3VwcGxpY2FudAorICAgICAqIGhhcyBjaGFuZ2VkLgorICAgICAqIEBwYXJhbSBuZXR3b3JrSWQgdGhlIGNvbmZpZ3VyZWQgbmV0d29yayBvbiB3aGljaCB0aGUgc3RhdGUgY2hhbmdlIG9jY3VycmVkCisgICAgICogQHBhcmFtIG5ld1N0YXRlIHRoZSBuZXcge0Bjb2RlIFN1cHBsaWNhbnRTdGF0ZX0KKyAgICAgKi8KKyAgICB2b2lkIG5vdGlmeVN1cHBsaWNhbnRTdGF0ZUNoYW5nZShpbnQgbmV0d29ya0lkLCBTdHJpbmcgQlNTSUQsIFN1cHBsaWNhbnRTdGF0ZSBuZXdTdGF0ZSkgeworICAgICAgICBzZW5kTWVzc2FnZShvYnRhaW5NZXNzYWdlKFNVUFBMSUNBTlRfU1RBVEVfQ0hBTkdFX0VWRU5ULAorICAgICAgICAgICAgICAgIG5ldyBTdGF0ZUNoYW5nZVJlc3VsdChuZXR3b3JrSWQsIEJTU0lELCBuZXdTdGF0ZSkpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZW5kIHRoZSB0cmFja2VyIGEgbm90aWZpY2F0aW9uIHRoYXQgYSBzY2FuIGhhcyBjb21wbGV0ZWQsIGFuZCByZXN1bHRzCisgICAgICogYXJlIGF2YWlsYWJsZS4KKyAgICAgKi8KKyAgICB2b2lkIG5vdGlmeVNjYW5SZXN1bHRzQXZhaWxhYmxlKCkgeworICAgICAgICAvKioKKyAgICAgICAgICogU3dpdGNoIHNjYW4gbW9kZSBvdmVyIHRvIHBhc3NpdmUuCisgICAgICAgICAqIFR1cm5pbmcgb2ZmIHNjYW4tb25seSBtb2RlIGhhcHBlbnMgb25seSBpbiAiQ29ubmVjdCIgbW9kZQorICAgICAgICAgKi8KKyAgICAgICAgc2V0U2NhblR5cGUoZmFsc2UpOworICAgICAgICBzZW5kTWVzc2FnZShTQ0FOX1JFU1VMVFNfRVZFTlQpOworICAgIH0KKworICAgIHZvaWQgbm90aWZ5RHJpdmVyU3RhcnRlZCgpIHsKKyAgICAgICAgc2VuZE1lc3NhZ2UoRFJJVkVSX1NUQVJUX0VWRU5UKTsKKyAgICB9CisKKyAgICB2b2lkIG5vdGlmeURyaXZlclN0b3BwZWQoKSB7CisgICAgICAgIHNlbmRNZXNzYWdlKERSSVZFUl9TVE9QX0VWRU5UKTsKKyAgICB9CisKKyAgICB2b2lkIG5vdGlmeURyaXZlckh1bmcoKSB7CisgICAgICAgIHNldFdpZmlFbmFibGVkKGZhbHNlKTsKKyAgICAgICAgc2V0V2lmaUVuYWJsZWQodHJ1ZSk7CisgICAgfQorCisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgKiBIU00gc3RhdGVzCisgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBjbGFzcyBEZWZhdWx0U3RhdGUgZXh0ZW5kcyBIaWVyYXJjaGljYWxTdGF0ZSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKKyAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgbWVzc2FnZS50b1N0cmluZygpICsgIlxuIik7CisgICAgICAgICAgICBTeW5jUGFyYW1zIHN5bmNQYXJhbXM7CisgICAgICAgICAgICBzd2l0Y2ggKG1lc3NhZ2Uud2hhdCkgeworICAgICAgICAgICAgICAgICAgICAvKiBTeW5jaHJvbm91cyBjYWxsIHJldHVybnMgKi8KKyAgICAgICAgICAgICAgICBjYXNlIENNRF9QSU5HX1NVUFBMSUNBTlQ6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfUkVNT1ZFX05FVFdPUks6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfRU5BQkxFX05FVFdPUks6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfRElTQUJMRV9ORVRXT1JLOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX0FERF9PUl9VUERBVEVfTkVUV09SSzoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9HRVRfUlNTSToKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9HRVRfUlNTSV9BUFBST1g6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfR0VUX0xJTktfU1BFRUQ6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfR0VUX01BQ19BRERSOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NBVkVfQ09ORklHOgorICAgICAgICAgICAgICAgICAgICBzeW5jUGFyYW1zID0gKFN5bmNQYXJhbXMpIG1lc3NhZ2Uub2JqOworICAgICAgICAgICAgICAgICAgICBzeW5jUGFyYW1zLm1TeW5jUmV0dXJuLmJvb2xWYWx1ZSA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBzeW5jUGFyYW1zLm1TeW5jUmV0dXJuLmludFZhbHVlID0gLTE7CisgICAgICAgICAgICAgICAgICAgIHN5bmNQYXJhbXMubVN5bmNSZXR1cm4uc3RyaW5nVmFsdWUgPSBudWxsOworICAgICAgICAgICAgICAgICAgICBub3RpZnlPbk1zZ09iamVjdChtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfRU5BQkxFX1JTU0lfUE9MTDoKKyAgICAgICAgICAgICAgICAgICAgbUVuYWJsZVJzc2lQb2xsaW5nID0gKG1lc3NhZ2UuYXJnMSA9PSAxKTsKKyAgICAgICAgICAgICAgICAgICAgbVN1cHBsaWNhbnRTdGF0ZVRyYWNrZXIuc2VuZE1lc3NhZ2UoQ01EX0VOQUJMRV9SU1NJX1BPTEwpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgLyogRGlzY2FyZCAqLworICAgICAgICAgICAgICAgIGNhc2UgQ01EX0xPQURfRFJJVkVSOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1VOTE9BRF9EUklWRVI6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RBUlRfU1VQUExJQ0FOVDoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVE9QX1NVUFBMSUNBTlQ6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RBUlRfRFJJVkVSOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUT1BfRFJJVkVSOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUQVJUX0FQOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUT1BfQVA6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RBUlRfU0NBTjoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9ESVNDT05ORUNUOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1JFQ09OTkVDVDoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9SRUFTU09DSUFURToKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9SRUNPTkZJR1VSRV9JUDoKKyAgICAgICAgICAgICAgICBjYXNlIFNVUF9DT05ORUNUSU9OX0VWRU5UOgorICAgICAgICAgICAgICAgIGNhc2UgU1VQX0RJU0NPTk5FQ1RJT05fRVZFTlQ6CisgICAgICAgICAgICAgICAgY2FzZSBEUklWRVJfU1RBUlRfRVZFTlQ6CisgICAgICAgICAgICAgICAgY2FzZSBEUklWRVJfU1RPUF9FVkVOVDoKKyAgICAgICAgICAgICAgICBjYXNlIE5FVFdPUktfQ09OTkVDVElPTl9FVkVOVDoKKyAgICAgICAgICAgICAgICBjYXNlIE5FVFdPUktfRElTQ09OTkVDVElPTl9FVkVOVDoKKyAgICAgICAgICAgICAgICBjYXNlIFNDQU5fUkVTVUxUU19FVkVOVDoKKyAgICAgICAgICAgICAgICBjYXNlIFNVUFBMSUNBTlRfU1RBVEVfQ0hBTkdFX0VWRU5UOgorICAgICAgICAgICAgICAgIGNhc2UgUEFTU1dPUkRfTUFZX0JFX0lOQ09SUkVDVF9FVkVOVDoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9CTEFDS0xJU1RfTkVUV09SSzoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9DTEVBUl9CTEFDS0xJU1Q6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX1NDQU5fTU9ERToKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TRVRfU0NBTl9UWVBFOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NFVF9QT1dFUl9NT0RFOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NFVF9CTFVFVE9PVEhfQ09FWElTVEVOQ0U6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX0JMVUVUT09USF9TQ0FOX01PREU6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX05VTV9BTExPV0VEX0NIQU5ORUxTOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1JFUVVFU1RfQ01fV0FLRUxPQ0s6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfQ09OTkVDVF9ORVRXT1JLOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NBVkVfTkVUV09SSzoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9GT1JHRVRfTkVUV09SSzoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiRXJyb3IhIHVuaGFuZGxlZCBtZXNzYWdlIiArIG1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBIQU5ETEVEOworICAgICAgICB9CisgICAgfQorCisgICAgY2xhc3MgSW5pdGlhbFN0YXRlIGV4dGVuZHMgSGllcmFyY2hpY2FsU3RhdGUgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgLy9UT0RPOiBjb3VsZCBtb3ZlIGxvZ2dpbmcgaW50byBhIGNvbW1vbiBjbGFzcworICAgICAgICBwdWJsaWMgdm9pZCBlbnRlcigpIHsKKyAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgIlxuIik7CisgICAgICAgICAgICAvLyBbMzEtOF0gUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UKKyAgICAgICAgICAgIC8vIFs3IC0gMF0gSFNNIHN0YXRlIGNoYW5nZQorICAgICAgICAgICAgLy8gNTAwMjEgd2lmaV9zdGF0ZV9jaGFuZ2VkIChjdXN0b218MXw1KQorICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19XSUZJX1NUQVRFX0NIQU5HRUQsIGdldE5hbWUoKSk7CisKKyAgICAgICAgICAgIGlmIChXaWZpTmF0aXZlLmlzRHJpdmVyTG9hZGVkKCkpIHsKKyAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obURyaXZlckxvYWRlZFN0YXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtRHJpdmVyVW5sb2FkZWRTdGF0ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGFzcyBEcml2ZXJMb2FkaW5nU3RhdGUgZXh0ZW5kcyBIaWVyYXJjaGljYWxTdGF0ZSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBlbnRlcigpIHsKKyAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgIlxuIik7CisgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UTE9HX1dJRklfU1RBVEVfQ0hBTkdFRCwgZ2V0TmFtZSgpKTsKKworICAgICAgICAgICAgZmluYWwgTWVzc2FnZSBtZXNzYWdlID0gbmV3IE1lc3NhZ2UoKTsKKyAgICAgICAgICAgIG1lc3NhZ2UuY29weUZyb20oZ2V0Q3VycmVudE1lc3NhZ2UoKSk7CisgICAgICAgICAgICAvKiBUT0RPOiBhZGQgYSB0aW1lb3V0IHRvIGZhaWwgd2hlbiBkcml2ZXIgbG9hZCBpcyBodW5nLgorICAgICAgICAgICAgICogU2ltaWxhcmx5IGZvciBkcml2ZXIgdW5sb2FkLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIHNXYWtlTG9jay5hY3F1aXJlKCk7CisgICAgICAgICAgICAgICAgICAgIC8vZW5hYmxpbmcgc3RhdGUKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoKG1lc3NhZ2UuYXJnMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBXSUZJX1NUQVRFX0VOQUJMSU5HOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFdpZmlTdGF0ZShXSUZJX1NUQVRFX0VOQUJMSU5HKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgV0lGSV9BUF9TVEFURV9FTkFCTElORzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRXaWZpQXBTdGF0ZShXSUZJX0FQX1NUQVRFX0VOQUJMSU5HKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmKFdpZmlOYXRpdmUubG9hZERyaXZlcigpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJEcml2ZXIgbG9hZCBzdWNjZXNzZnVsIik7CisgICAgICAgICAgICAgICAgICAgICAgICBzZW5kTWVzc2FnZShDTURfTE9BRF9EUklWRVJfU1VDQ0VTUyk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJGYWlsZWQgdG8gbG9hZCBkcml2ZXIhIik7CisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2gobWVzc2FnZS5hcmcxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBXSUZJX1NUQVRFX0VOQUJMSU5HOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRXaWZpU3RhdGUoV0lGSV9TVEFURV9VTktOT1dOKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBXSUZJX0FQX1NUQVRFX0VOQUJMSU5HOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRXaWZpQXBTdGF0ZShXSUZJX0FQX1NUQVRFX0ZBSUxFRCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgc2VuZE1lc3NhZ2UoQ01EX0xPQURfRFJJVkVSX0ZBSUxVUkUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHNXYWtlTG9jay5yZWxlYXNlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSkuc3RhcnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKKyAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgbWVzc2FnZS50b1N0cmluZygpICsgIlxuIik7CisgICAgICAgICAgICBzd2l0Y2ggKG1lc3NhZ2Uud2hhdCkgeworICAgICAgICAgICAgICAgIGNhc2UgQ01EX0xPQURfRFJJVkVSX1NVQ0NFU1M6CisgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtRHJpdmVyTG9hZGVkU3RhdGUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9MT0FEX0RSSVZFUl9GQUlMVVJFOgorICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obURyaXZlckZhaWxlZFN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfTE9BRF9EUklWRVI6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfVU5MT0FEX0RSSVZFUjoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVEFSVF9TVVBQTElDQU5UOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUT1BfU1VQUExJQ0FOVDoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVEFSVF9BUDoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVE9QX0FQOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUQVJUX0RSSVZFUjoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVE9QX0RSSVZFUjoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TRVRfU0NBTl9NT0RFOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NFVF9TQ0FOX1RZUEU6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX1BPV0VSX01PREU6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX0JMVUVUT09USF9DT0VYSVNURU5DRToKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TRVRfQkxVRVRPT1RIX1NDQU5fTU9ERToKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TRVRfTlVNX0FMTE9XRURfQ0hBTk5FTFM6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RBUlRfUEFDS0VUX0ZJTFRFUklORzoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVE9QX1BBQ0tFVF9GSUxURVJJTkc6CisgICAgICAgICAgICAgICAgICAgIGRlZmVyTWVzc2FnZShtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5PVF9IQU5ETEVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19XSUZJX0VWRU5UX0hBTkRMRUQsIG1lc3NhZ2Uud2hhdCk7CisgICAgICAgICAgICByZXR1cm4gSEFORExFRDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsYXNzIERyaXZlckxvYWRlZFN0YXRlIGV4dGVuZHMgSGllcmFyY2hpY2FsU3RhdGUgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZW50ZXIoKSB7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArICJcbiIpOworICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19XSUZJX1NUQVRFX0NIQU5HRUQsIGdldE5hbWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIHByb2Nlc3NNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkgeworICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBnZXROYW1lKCkgKyBtZXNzYWdlLnRvU3RyaW5nKCkgKyAiXG4iKTsKKyAgICAgICAgICAgIHN3aXRjaChtZXNzYWdlLndoYXQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9VTkxPQURfRFJJVkVSOgorICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obURyaXZlclVubG9hZGluZ1N0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RBUlRfU1VQUExJQ0FOVDoKKyAgICAgICAgICAgICAgICAgICAgaWYoV2lmaU5hdGl2ZS5zdGFydFN1cHBsaWNhbnQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiU3VwcGxpY2FudCBzdGFydCBzdWNjZXNzZnVsIik7CisgICAgICAgICAgICAgICAgICAgICAgICBtV2lmaU1vbml0b3Iuc3RhcnRNb25pdG9yaW5nKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXRXaWZpU3RhdGUoV0lGSV9TVEFURV9FTkFCTEVEKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtV2FpdEZvclN1cFN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkZhaWxlZCB0byBzdGFydCBzdXBwbGljYW50ISIpOworICAgICAgICAgICAgICAgICAgICAgICAgc2VuZE1lc3NhZ2Uob2J0YWluTWVzc2FnZShDTURfVU5MT0FEX0RSSVZFUiwgV0lGSV9TVEFURV9VTktOT1dOLCAwKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RBUlRfQVA6CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBud1NlcnZpY2Uuc3RhcnRBY2Nlc3NQb2ludCgoV2lmaUNvbmZpZ3VyYXRpb24pIG1lc3NhZ2Uub2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUludGVyZmFjZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT0ZUQVBfSUZBQ0UpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJFeGNlcHRpb24gaW4gc3RhcnRBY2Nlc3NQb2ludCgpIik7CisgICAgICAgICAgICAgICAgICAgICAgICBzZW5kTWVzc2FnZShvYnRhaW5NZXNzYWdlKENNRF9VTkxPQURfRFJJVkVSLCBXSUZJX0FQX1NUQVRFX0ZBSUxFRCwgMCkpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiU29mdCBBUCBzdGFydCBzdWNjZXNzZnVsIik7CisgICAgICAgICAgICAgICAgICAgIHNldFdpZmlBcFN0YXRlKFdJRklfQVBfU1RBVEVfRU5BQkxFRCk7CisgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtU29mdEFwU3RhcnRlZFN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5PVF9IQU5ETEVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19XSUZJX0VWRU5UX0hBTkRMRUQsIG1lc3NhZ2Uud2hhdCk7CisgICAgICAgICAgICByZXR1cm4gSEFORExFRDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsYXNzIERyaXZlclVubG9hZGluZ1N0YXRlIGV4dGVuZHMgSGllcmFyY2hpY2FsU3RhdGUgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZW50ZXIoKSB7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArICJcbiIpOworICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19XSUZJX1NUQVRFX0NIQU5HRUQsIGdldE5hbWUoKSk7CisKKyAgICAgICAgICAgIGZpbmFsIE1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBNZXNzYWdlKCk7CisgICAgICAgICAgICBtZXNzYWdlLmNvcHlGcm9tKGdldEN1cnJlbnRNZXNzYWdlKCkpOworICAgICAgICAgICAgbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArIG1lc3NhZ2UudG9TdHJpbmcoKSArICJcbiIpOworICAgICAgICAgICAgICAgICAgICBzV2FrZUxvY2suYWNxdWlyZSgpOworICAgICAgICAgICAgICAgICAgICBpZihXaWZpTmF0aXZlLnVubG9hZERyaXZlcigpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJEcml2ZXIgdW5sb2FkIHN1Y2Nlc3NmdWwiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRNZXNzYWdlKENNRF9VTkxPQURfRFJJVkVSX1NVQ0NFU1MpOworCisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2gobWVzc2FnZS5hcmcxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBXSUZJX1NUQVRFX0RJU0FCTEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgV0lGSV9TVEFURV9VTktOT1dOOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRXaWZpU3RhdGUobWVzc2FnZS5hcmcxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBXSUZJX0FQX1NUQVRFX0RJU0FCTEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgV0lGSV9BUF9TVEFURV9GQUlMRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFdpZmlBcFN0YXRlKG1lc3NhZ2UuYXJnMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiRmFpbGVkIHRvIHVubG9hZCBkcml2ZXIhIik7CisgICAgICAgICAgICAgICAgICAgICAgICBzZW5kTWVzc2FnZShDTURfVU5MT0FEX0RSSVZFUl9GQUlMVVJFKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoKG1lc3NhZ2UuYXJnMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgV0lGSV9TVEFURV9ESVNBQkxFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFdJRklfU1RBVEVfVU5LTk9XTjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0V2lmaVN0YXRlKFdJRklfU1RBVEVfVU5LTk9XTik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgV0lGSV9BUF9TVEFURV9ESVNBQkxFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFdJRklfQVBfU1RBVEVfRkFJTEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRXaWZpQXBTdGF0ZShXSUZJX0FQX1NUQVRFX0ZBSUxFRCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHNXYWtlTG9jay5yZWxlYXNlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSkuc3RhcnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKKyAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgbWVzc2FnZS50b1N0cmluZygpICsgIlxuIik7CisgICAgICAgICAgICBzd2l0Y2ggKG1lc3NhZ2Uud2hhdCkgeworICAgICAgICAgICAgICAgIGNhc2UgQ01EX1VOTE9BRF9EUklWRVJfU1VDQ0VTUzoKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1Ecml2ZXJVbmxvYWRlZFN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfVU5MT0FEX0RSSVZFUl9GQUlMVVJFOgorICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obURyaXZlckZhaWxlZFN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfTE9BRF9EUklWRVI6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfVU5MT0FEX0RSSVZFUjoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVEFSVF9TVVBQTElDQU5UOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUT1BfU1VQUExJQ0FOVDoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVEFSVF9BUDoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVE9QX0FQOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUQVJUX0RSSVZFUjoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVE9QX0RSSVZFUjoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TRVRfU0NBTl9NT0RFOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NFVF9TQ0FOX1RZUEU6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX1BPV0VSX01PREU6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX0JMVUVUT09USF9DT0VYSVNURU5DRToKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TRVRfQkxVRVRPT1RIX1NDQU5fTU9ERToKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TRVRfTlVNX0FMTE9XRURfQ0hBTk5FTFM6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RBUlRfUEFDS0VUX0ZJTFRFUklORzoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVE9QX1BBQ0tFVF9GSUxURVJJTkc6CisgICAgICAgICAgICAgICAgICAgIGRlZmVyTWVzc2FnZShtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5PVF9IQU5ETEVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19XSUZJX0VWRU5UX0hBTkRMRUQsIG1lc3NhZ2Uud2hhdCk7CisgICAgICAgICAgICByZXR1cm4gSEFORExFRDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsYXNzIERyaXZlclVubG9hZGVkU3RhdGUgZXh0ZW5kcyBIaWVyYXJjaGljYWxTdGF0ZSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBlbnRlcigpIHsKKyAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgIlxuIik7CisgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UTE9HX1dJRklfU1RBVEVfQ0hBTkdFRCwgZ2V0TmFtZSgpKTsKKyAgICAgICAgfQorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gcHJvY2Vzc01lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKSB7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArIG1lc3NhZ2UudG9TdHJpbmcoKSArICJcbiIpOworICAgICAgICAgICAgc3dpdGNoIChtZXNzYWdlLndoYXQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9MT0FEX0RSSVZFUjoKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1Ecml2ZXJMb2FkaW5nU3RhdGUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTk9UX0hBTkRMRUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UTE9HX1dJRklfRVZFTlRfSEFORExFRCwgbWVzc2FnZS53aGF0KTsKKyAgICAgICAgICAgIHJldHVybiBIQU5ETEVEOworICAgICAgICB9CisgICAgfQorCisgICAgY2xhc3MgRHJpdmVyRmFpbGVkU3RhdGUgZXh0ZW5kcyBIaWVyYXJjaGljYWxTdGF0ZSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBlbnRlcigpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgZ2V0TmFtZSgpICsgIlxuIik7CisgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UTE9HX1dJRklfU1RBVEVfQ0hBTkdFRCwgZ2V0TmFtZSgpKTsKKyAgICAgICAgfQorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gcHJvY2Vzc01lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKSB7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArIG1lc3NhZ2UudG9TdHJpbmcoKSArICJcbiIpOworICAgICAgICAgICAgcmV0dXJuIE5PVF9IQU5ETEVEOworICAgICAgICB9CisgICAgfQorCisKKyAgICBjbGFzcyBXYWl0Rm9yU3VwU3RhdGUgZXh0ZW5kcyBIaWVyYXJjaGljYWxTdGF0ZSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBlbnRlcigpIHsKKyAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgIlxuIik7CisgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UTE9HX1dJRklfU1RBVEVfQ0hBTkdFRCwgZ2V0TmFtZSgpKTsKKyAgICAgICAgfQorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gcHJvY2Vzc01lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKSB7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArIG1lc3NhZ2UudG9TdHJpbmcoKSArICJcbiIpOworICAgICAgICAgICAgc3dpdGNoKG1lc3NhZ2Uud2hhdCkgeworICAgICAgICAgICAgICAgIGNhc2UgU1VQX0NPTk5FQ1RJT05fRVZFTlQ6CisgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlN1cHBsaWNhbnQgY29ubmVjdGlvbiBlc3RhYmxpc2hlZCIpOworICAgICAgICAgICAgICAgICAgICBtU3VwcGxpY2FudFN0YXRlVHJhY2tlci5yZXNldFN1cHBsaWNhbnRTdGF0ZSgpOworICAgICAgICAgICAgICAgICAgICAvKiBJbml0aWFsaXplIGRhdGEgc3RydWN0dXJlcyAqLworICAgICAgICAgICAgICAgICAgICBtTGFzdEJzc2lkID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgbUxhc3ROZXR3b3JrSWQgPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgbUxhc3RTaWduYWxMZXZlbCA9IC0xOworCisgICAgICAgICAgICAgICAgICAgIG1XaWZpSW5mby5zZXRNYWNBZGRyZXNzKFdpZmlOYXRpdmUuZ2V0TWFjQWRkcmVzc0NvbW1hbmQoKSk7CisKKyAgICAgICAgICAgICAgICAgICAgdXBkYXRlQ29uZmlnQW5kU2VuZENoYW5nZUJyb2FkY2FzdCgpOworCisgICAgICAgICAgICAgICAgICAgIC8vVE9ETzogaW5pdGlhbGl6ZSBhbmQgZml4IG11bHRpY2FzdCBmaWx0ZXJpbmcKKyAgICAgICAgICAgICAgICAgICAgLy9tV00uaW5pdGlhbGl6ZU11bHRpY2FzdEZpbHRlcmluZygpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChtQmx1ZXRvb3RoQTJkcCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtQmx1ZXRvb3RoQTJkcCA9IG5ldyBCbHVldG9vdGhBMmRwKG1Db250ZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjaGVja0lzQmx1ZXRvb3RoUGxheWluZygpOworCisgICAgICAgICAgICAgICAgICAgIGNoZWNrVXNlU3RhdGljSXAoKTsKKyAgICAgICAgICAgICAgICAgICAgc2VuZFN1cHBsaWNhbnRDb25uZWN0aW9uQ2hhbmdlZEJyb2FkY2FzdCh0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1Ecml2ZXJTdXBSZWFkeVN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RPUF9TVVBQTElDQU5UOgorICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJTdG9wIHN1cHBsaWNhbnQgcmVjZWl2ZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgV2lmaU5hdGl2ZS5zdG9wU3VwcGxpY2FudCgpOworICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obURyaXZlckxvYWRlZFN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIC8qIEZhaWwgc29mdCBhcCB3aGVuIHdhaXRpbmcgZm9yIHN1cHBsaWNhbnQgc3RhcnQgKi8KKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVEFSVF9BUDoKKyAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiRmFpbGVkIHRvIHN0YXJ0IHNvZnQgQVAgd2l0aCBhIHJ1bm5pbmcgc3VwcGxpY2FudCIpOworICAgICAgICAgICAgICAgICAgICBzZXRXaWZpQXBTdGF0ZShXSUZJX0FQX1NUQVRFX0ZBSUxFRCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUQVJUX0RSSVZFUjoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVE9QX0RSSVZFUjoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TRVRfU0NBTl9NT0RFOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NFVF9TQ0FOX1RZUEU6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX1BPV0VSX01PREU6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX0JMVUVUT09USF9DT0VYSVNURU5DRToKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TRVRfQkxVRVRPT1RIX1NDQU5fTU9ERToKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TRVRfTlVNX0FMTE9XRURfQ0hBTk5FTFM6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RBUlRfUEFDS0VUX0ZJTFRFUklORzoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVE9QX1BBQ0tFVF9GSUxURVJJTkc6CisgICAgICAgICAgICAgICAgICAgIGRlZmVyTWVzc2FnZShtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RPUF9BUDoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVEFSVF9TVVBQTElDQU5UOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1VOTE9BRF9EUklWRVI6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOT1RfSEFORExFRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRVZFTlRMT0dfV0lGSV9FVkVOVF9IQU5ETEVELCBtZXNzYWdlLndoYXQpOworICAgICAgICAgICAgcmV0dXJuIEhBTkRMRUQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGFzcyBEcml2ZXJTdXBSZWFkeVN0YXRlIGV4dGVuZHMgSGllcmFyY2hpY2FsU3RhdGUgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZW50ZXIoKSB7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArICJcbiIpOworICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19XSUZJX1NUQVRFX0NIQU5HRUQsIGdldE5hbWUoKSk7CisgICAgICAgICAgICAvKiBJbml0aWFsaXplIGZvciBjb25uZWN0IG1vZGUgb3BlcmF0aW9uIGF0IHN0YXJ0ICovCisgICAgICAgICAgICBtSXNTY2FuTW9kZSA9IGZhbHNlOworICAgICAgICB9CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKKyAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgbWVzc2FnZS50b1N0cmluZygpICsgIlxuIik7CisgICAgICAgICAgICBTeW5jUGFyYW1zIHN5bmNQYXJhbXM7CisgICAgICAgICAgICBXaWZpQ29uZmlndXJhdGlvbiBjb25maWc7CisgICAgICAgICAgICBzd2l0Y2gobWVzc2FnZS53aGF0KSB7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RPUF9TVVBQTElDQU5UOiAgIC8qIFN1cHBsaWNhbnQgc3RvcHBlZCBieSB1c2VyICovCisgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlN0b3Agc3VwcGxpY2FudCByZWNlaXZlZCIpOworICAgICAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLnN0b3BTdXBwbGljYW50KCk7CisgICAgICAgICAgICAgICAgICAgIC8vJEZBTEwtVEhST1VHSCQKKyAgICAgICAgICAgICAgICBjYXNlIFNVUF9ESVNDT05ORUNUSU9OX0VWRU5UOiAgLyogU3VwcGxpY2FudCBkaWVkICovCisgICAgICAgICAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRVZFTlRMT0dfV0lGSV9FVkVOVF9IQU5ETEVELCBtZXNzYWdlLndoYXQpOworICAgICAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLmNsb3NlU3VwcGxpY2FudENvbm5lY3Rpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgaGFuZGxlTmV0d29ya0Rpc2Nvbm5lY3QoKTsKKyAgICAgICAgICAgICAgICAgICAgc2VuZFN1cHBsaWNhbnRDb25uZWN0aW9uQ2hhbmdlZEJyb2FkY2FzdChmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIG1TdXBwbGljYW50U3RhdGVUcmFja2VyLnJlc2V0U3VwcGxpY2FudFN0YXRlKCk7CisgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtRHJpdmVyTG9hZGVkU3RhdGUpOworCisgICAgICAgICAgICAgICAgICAgIC8qIFdoZW4gc3VwcGxpY2FudCBkaWVzLCB1bmxvYWQgZHJpdmVyIGFuZCBlbnRlciBmYWlsZWQgc3RhdGUgKi8KKyAgICAgICAgICAgICAgICAgICAgLy9UT0RPOiBjb25zaWRlciBicmluZ2luZyB1cCBzdXBwbGljYW50IGFnYWluCisgICAgICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLndoYXQgPT0gU1VQX0RJU0NPTk5FQ1RJT05fRVZFTlQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlN1cHBsaWNhbnQgZGllZCwgdW5sb2FkaW5nIGRyaXZlciIpOworICAgICAgICAgICAgICAgICAgICAgICAgc2VuZE1lc3NhZ2Uob2J0YWluTWVzc2FnZShDTURfVU5MT0FEX0RSSVZFUiwgV0lGSV9TVEFURV9VTktOT1dOLCAwKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RBUlRfRFJJVkVSOgorICAgICAgICAgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UTE9HX1dJRklfRVZFTlRfSEFORExFRCwgbWVzc2FnZS53aGF0KTsKKyAgICAgICAgICAgICAgICAgICAgV2lmaU5hdGl2ZS5zdGFydERyaXZlckNvbW1hbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1Ecml2ZXJTdGFydGluZ1N0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTQ0FOX1JFU1VMVFNfRVZFTlQ6CisgICAgICAgICAgICAgICAgICAgIHNldFNjYW5SZXN1bHRzKFdpZmlOYXRpdmUuc2NhblJlc3VsdHNDb21tYW5kKCkpOworICAgICAgICAgICAgICAgICAgICBzZW5kU2NhblJlc3VsdHNBdmFpbGFibGVCcm9hZGNhc3QoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfUElOR19TVVBQTElDQU5UOgorICAgICAgICAgICAgICAgICAgICBzeW5jUGFyYW1zID0gKFN5bmNQYXJhbXMpIG1lc3NhZ2Uub2JqOworICAgICAgICAgICAgICAgICAgICBzeW5jUGFyYW1zLm1TeW5jUmV0dXJuLmJvb2xWYWx1ZSA9IFdpZmlOYXRpdmUucGluZ0NvbW1hbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5T25Nc2dPYmplY3QobWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ01EX0FERF9PUl9VUERBVEVfTkVUV09SSzoKKyAgICAgICAgICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19XSUZJX0VWRU5UX0hBTkRMRUQsIG1lc3NhZ2Uud2hhdCk7CisgICAgICAgICAgICAgICAgICAgIHN5bmNQYXJhbXMgPSAoU3luY1BhcmFtcykgbWVzc2FnZS5vYmo7CisgICAgICAgICAgICAgICAgICAgIGNvbmZpZyA9IChXaWZpQ29uZmlndXJhdGlvbikgc3luY1BhcmFtcy5tUGFyYW1ldGVyOworICAgICAgICAgICAgICAgICAgICBzeW5jUGFyYW1zLm1TeW5jUmV0dXJuLmludFZhbHVlID0gYWRkT3JVcGRhdGVOZXR3b3JrTmF0aXZlKGNvbmZpZyk7CisgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUNvbmZpZ0FuZFNlbmRDaGFuZ2VCcm9hZGNhc3QoKTsKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5T25Nc2dPYmplY3QobWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ01EX1JFTU9WRV9ORVRXT1JLOgorICAgICAgICAgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UTE9HX1dJRklfRVZFTlRfSEFORExFRCwgbWVzc2FnZS53aGF0KTsKKyAgICAgICAgICAgICAgICAgICAgc3luY1BhcmFtcyA9IChTeW5jUGFyYW1zKSBtZXNzYWdlLm9iajsKKyAgICAgICAgICAgICAgICAgICAgc3luY1BhcmFtcy5tU3luY1JldHVybi5ib29sVmFsdWUgPSBXaWZpTmF0aXZlLnJlbW92ZU5ldHdvcmtDb21tYW5kKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuYXJnMSk7CisgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUNvbmZpZ0FuZFNlbmRDaGFuZ2VCcm9hZGNhc3QoKTsKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5T25Nc2dPYmplY3QobWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ01EX0VOQUJMRV9ORVRXT1JLOgorICAgICAgICAgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UTE9HX1dJRklfRVZFTlRfSEFORExFRCwgbWVzc2FnZS53aGF0KTsKKyAgICAgICAgICAgICAgICAgICAgc3luY1BhcmFtcyA9IChTeW5jUGFyYW1zKSBtZXNzYWdlLm9iajsKKyAgICAgICAgICAgICAgICAgICAgRW5hYmxlTmV0UGFyYW1zIGVuYWJsZU5ldFBhcmFtcyA9IChFbmFibGVOZXRQYXJhbXMpIHN5bmNQYXJhbXMubVBhcmFtZXRlcjsKKyAgICAgICAgICAgICAgICAgICAgc3luY1BhcmFtcy5tU3luY1JldHVybi5ib29sVmFsdWUgPSBXaWZpTmF0aXZlLmVuYWJsZU5ldHdvcmtDb21tYW5kKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZU5ldFBhcmFtcy5uZXRJZCwgZW5hYmxlTmV0UGFyYW1zLmRpc2FibGVPdGhlcnMpOworICAgICAgICAgICAgICAgICAgICB1cGRhdGVDb25maWdBbmRTZW5kQ2hhbmdlQnJvYWRjYXN0KCk7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmeU9uTXNnT2JqZWN0KG1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9ESVNBQkxFX05FVFdPUks6CisgICAgICAgICAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRVZFTlRMT0dfV0lGSV9FVkVOVF9IQU5ETEVELCBtZXNzYWdlLndoYXQpOworICAgICAgICAgICAgICAgICAgICBzeW5jUGFyYW1zID0gKFN5bmNQYXJhbXMpIG1lc3NhZ2Uub2JqOworICAgICAgICAgICAgICAgICAgICBzeW5jUGFyYW1zLm1TeW5jUmV0dXJuLmJvb2xWYWx1ZSA9IFdpZmlOYXRpdmUuZGlzYWJsZU5ldHdvcmtDb21tYW5kKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuYXJnMSk7CisgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUNvbmZpZ0FuZFNlbmRDaGFuZ2VCcm9hZGNhc3QoKTsKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5T25Nc2dPYmplY3QobWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ01EX0JMQUNLTElTVF9ORVRXT1JLOgorICAgICAgICAgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UTE9HX1dJRklfRVZFTlRfSEFORExFRCwgbWVzc2FnZS53aGF0KTsKKyAgICAgICAgICAgICAgICAgICAgV2lmaU5hdGl2ZS5hZGRUb0JsYWNrbGlzdENvbW1hbmQoKFN0cmluZyltZXNzYWdlLm9iaik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ01EX0NMRUFSX0JMQUNLTElTVDoKKyAgICAgICAgICAgICAgICAgICAgV2lmaU5hdGl2ZS5jbGVhckJsYWNrbGlzdENvbW1hbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0FWRV9DT05GSUc6CisgICAgICAgICAgICAgICAgICAgIHN5bmNQYXJhbXMgPSAoU3luY1BhcmFtcykgbWVzc2FnZS5vYmo7CisgICAgICAgICAgICAgICAgICAgIHN5bmNQYXJhbXMubVN5bmNSZXR1cm4uYm9vbFZhbHVlID0gV2lmaU5hdGl2ZS5zYXZlQ29uZmlnQ29tbWFuZCgpOworICAgICAgICAgICAgICAgICAgICBub3RpZnlPbk1zZ09iamVjdChtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gSW5mb3JtIHRoZSBiYWNrdXAgbWFuYWdlciBhYm91dCBhIGRhdGEgY2hhbmdlCisgICAgICAgICAgICAgICAgICAgIElCYWNrdXBNYW5hZ2VyIGlibSA9IElCYWNrdXBNYW5hZ2VyLlN0dWIuYXNJbnRlcmZhY2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VydmljZU1hbmFnZXIuZ2V0U2VydmljZShDb250ZXh0LkJBQ0tVUF9TRVJWSUNFKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChpYm0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpYm0uZGF0YUNoYW5nZWQoImNvbS5hbmRyb2lkLnByb3ZpZGVycy5zZXR0aW5ncyIpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUcnkgYWdhaW4gbGF0ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9HRVRfTUFDX0FERFI6CisgICAgICAgICAgICAgICAgICAgIHN5bmNQYXJhbXMgPSAoU3luY1BhcmFtcykgbWVzc2FnZS5vYmo7CisgICAgICAgICAgICAgICAgICAgIHN5bmNQYXJhbXMubVN5bmNSZXR1cm4uc3RyaW5nVmFsdWUgPSBXaWZpTmF0aXZlLmdldE1hY0FkZHJlc3NDb21tYW5kKCk7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmeU9uTXNnT2JqZWN0KG1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgLyogQ2Fubm90IHN0YXJ0IHNvZnQgQVAgd2hpbGUgaW4gY2xpZW50IG1vZGUgKi8KKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVEFSVF9BUDoKKyAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiRmFpbGVkIHRvIHN0YXJ0IHNvZnQgQVAgd2l0aCBhIHJ1bm5pbmcgc3VwcGxpY2FudCIpOworICAgICAgICAgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UTE9HX1dJRklfRVZFTlRfSEFORExFRCwgbWVzc2FnZS53aGF0KTsKKyAgICAgICAgICAgICAgICAgICAgc2V0V2lmaUFwU3RhdGUoV0lGSV9BUF9TVEFURV9GQUlMRUQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TRVRfU0NBTl9NT0RFOgorICAgICAgICAgICAgICAgICAgICBtSXNTY2FuTW9kZSA9IChtZXNzYWdlLmFyZzEgPT0gU0NBTl9PTkxZX01PREUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TQVZFX05FVFdPUks6CisgICAgICAgICAgICAgICAgICAgIGNvbmZpZyA9IChXaWZpQ29uZmlndXJhdGlvbikgbWVzc2FnZS5vYmo7CisgICAgICAgICAgICAgICAgICAgIGludCBuZXRJZCA9IGFkZE9yVXBkYXRlTmV0d29ya05hdGl2ZShjb25maWcpOworICAgICAgICAgICAgICAgICAgICAvKiBlbmFibGUgYSBuZXcgbmV0d29yayAqLworICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnLm5ldHdvcmtJZCA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUuZW5hYmxlTmV0d29ya0NvbW1hbmQobmV0SWQsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLnNhdmVDb25maWdDb21tYW5kKCk7CisgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUNvbmZpZ0FuZFNlbmRDaGFuZ2VCcm9hZGNhc3QoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfRk9SR0VUX05FVFdPUks6CisgICAgICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUucmVtb3ZlTmV0d29ya0NvbW1hbmQobWVzc2FnZS5hcmcxKTsKKyAgICAgICAgICAgICAgICAgICAgV2lmaU5hdGl2ZS5zYXZlQ29uZmlnQ29tbWFuZCgpOworICAgICAgICAgICAgICAgICAgICB1cGRhdGVDb25maWdBbmRTZW5kQ2hhbmdlQnJvYWRjYXN0KCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOT1RfSEFORExFRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBIQU5ETEVEOworICAgICAgICB9CisgICAgfQorCisgICAgY2xhc3MgRHJpdmVyU3RhcnRpbmdTdGF0ZSBleHRlbmRzIEhpZXJhcmNoaWNhbFN0YXRlIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGVudGVyKCkgeworICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBnZXROYW1lKCkgKyAiXG4iKTsKKyAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRVZFTlRMT0dfV0lGSV9TVEFURV9DSEFOR0VELCBnZXROYW1lKCkpOworICAgICAgICB9CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKKyAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgbWVzc2FnZS50b1N0cmluZygpICsgIlxuIik7CisgICAgICAgICAgICBzd2l0Y2gobWVzc2FnZS53aGF0KSB7CisgICAgICAgICAgICAgICAgY2FzZSBEUklWRVJfU1RBUlRfRVZFTlQ6CisgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtRHJpdmVyU3RhcnRlZFN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIC8qIFF1ZXVlIGRyaXZlciBjb21tYW5kcyAmIGNvbm5lY3Rpb24gZXZlbnRzICovCisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RBUlRfRFJJVkVSOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUT1BfRFJJVkVSOgorICAgICAgICAgICAgICAgIGNhc2UgU1VQUExJQ0FOVF9TVEFURV9DSEFOR0VfRVZFTlQ6CisgICAgICAgICAgICAgICAgY2FzZSBORVRXT1JLX0NPTk5FQ1RJT05fRVZFTlQ6CisgICAgICAgICAgICAgICAgY2FzZSBORVRXT1JLX0RJU0NPTk5FQ1RJT05fRVZFTlQ6CisgICAgICAgICAgICAgICAgY2FzZSBQQVNTV09SRF9NQVlfQkVfSU5DT1JSRUNUX0VWRU5UOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NFVF9TQ0FOX1RZUEU6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX1BPV0VSX01PREU6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX0JMVUVUT09USF9DT0VYSVNURU5DRToKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TRVRfQkxVRVRPT1RIX1NDQU5fTU9ERToKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TRVRfTlVNX0FMTE9XRURfQ0hBTk5FTFM6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RBUlRfUEFDS0VUX0ZJTFRFUklORzoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVE9QX1BBQ0tFVF9GSUxURVJJTkc6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RBUlRfU0NBTjoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9ESVNDT05ORUNUOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1JFQVNTT0NJQVRFOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1JFQ09OTkVDVDoKKyAgICAgICAgICAgICAgICAgICAgZGVmZXJNZXNzYWdlKG1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTk9UX0hBTkRMRUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UTE9HX1dJRklfRVZFTlRfSEFORExFRCwgbWVzc2FnZS53aGF0KTsKKyAgICAgICAgICAgIHJldHVybiBIQU5ETEVEOworICAgICAgICB9CisgICAgfQorCisgICAgY2xhc3MgRHJpdmVyU3RhcnRlZFN0YXRlIGV4dGVuZHMgSGllcmFyY2hpY2FsU3RhdGUgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZW50ZXIoKSB7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArICJcbiIpOworICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19XSUZJX1NUQVRFX0NIQU5HRUQsIGdldE5hbWUoKSk7CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbUJhdHRlcnlTdGF0cy5ub3RlV2lmaVJ1bm5pbmcoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBpZ25vcmUpIHt9CisKKyAgICAgICAgICAgIC8qIEluaXRpYWxpemUgY2hhbm5lbCBjb3VudCAqLworICAgICAgICAgICAgc2V0TnVtQWxsb3dlZENoYW5uZWxzKCk7CisKKyAgICAgICAgICAgIGlmIChtSXNTY2FuTW9kZSkgeworICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUuc2V0U2NhblJlc3VsdEhhbmRsaW5nQ29tbWFuZChTQ0FOX09OTFlfTU9ERSk7CisgICAgICAgICAgICAgICAgV2lmaU5hdGl2ZS5kaXNjb25uZWN0Q29tbWFuZCgpOworICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtU2Nhbk1vZGVTdGF0ZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUuc2V0U2NhblJlc3VsdEhhbmRsaW5nQ29tbWFuZChDT05ORUNUX01PREUpOworICAgICAgICAgICAgICAgIC8qIElmIHN1cHBsaWNhbnQgaGFzIGFscmVhZHkgY29ubmVjdGVkLCBiZWZvcmUgd2UgY291bGQgZmluaXNoIGVzdGFibGlzaGluZworICAgICAgICAgICAgICAgICAqIHRoZSBjb250cm9sIGNoYW5uZWwgY29ubmVjdGlvbiwgd2UgbWlzcyBhbGwgdGhlIHN1cHBsaWNhbnQgZXZlbnRzLgorICAgICAgICAgICAgICAgICAqIERpc2Nvbm5lY3QgYW5kIHJlY29ubmVjdCB3aGVuIGRyaXZlciBoYXMgc3RhcnRlZCB0byBlbnN1cmUgd2UgcmVjZWl2ZQorICAgICAgICAgICAgICAgICAqIGFsbCBzdXBwbGljYW50IGV2ZW50cy4KKyAgICAgICAgICAgICAgICAgKgorICAgICAgICAgICAgICAgICAqIFRPRE86IFRoaXMgaXMgYSBiaXQgdW5jbGVhbiwgaWRlYWxseSB0aGUgc3VwcGxpY2FudCBzaG91bGQgbmV2ZXIKKyAgICAgICAgICAgICAgICAgKiBjb25uZWN0IHVudGlsIHRvbGQgdG8gZG8gc28gYnkgdGhlIGZyYW1ld29yaworICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUuZGlzY29ubmVjdENvbW1hbmQoKTsKKyAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLnJlY29ubmVjdENvbW1hbmQoKTsKKyAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obUNvbm5lY3RNb2RlU3RhdGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKKyAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgbWVzc2FnZS50b1N0cmluZygpICsgIlxuIik7CisgICAgICAgICAgICBTeW5jUGFyYW1zIHN5bmNQYXJhbXM7CisgICAgICAgICAgICBzd2l0Y2gobWVzc2FnZS53aGF0KSB7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX1NDQU5fVFlQRToKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UuYXJnMSA9PSBTQ0FOX0FDVElWRSkgeworICAgICAgICAgICAgICAgICAgICAgICAgV2lmaU5hdGl2ZS5zZXRTY2FuTW9kZUNvbW1hbmQodHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLnNldFNjYW5Nb2RlQ29tbWFuZChmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX1BPV0VSX01PREU6CisgICAgICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUuc2V0UG93ZXJNb2RlQ29tbWFuZChtZXNzYWdlLmFyZzEpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TRVRfQkxVRVRPT1RIX0NPRVhJU1RFTkNFOgorICAgICAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLnNldEJsdWV0b290aENvZXhpc3RlbmNlTW9kZUNvbW1hbmQobWVzc2FnZS5hcmcxKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX0JMVUVUT09USF9TQ0FOX01PREU6CisgICAgICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUuc2V0Qmx1ZXRvb3RoQ29leGlzdGVuY2VTY2FuTW9kZUNvbW1hbmQobWVzc2FnZS5hcmcxID09IDEpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TRVRfTlVNX0FMTE9XRURfQ0hBTk5FTFM6CisgICAgICAgICAgICAgICAgICAgIG1OdW1BbGxvd2VkQ2hhbm5lbHMgPSBtZXNzYWdlLmFyZzE7CisgICAgICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUuc2V0TnVtQWxsb3dlZENoYW5uZWxzQ29tbWFuZChtZXNzYWdlLmFyZzEpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVEFSVF9EUklWRVI6CisgICAgICAgICAgICAgICAgICAgIC8qIElnbm9yZSBhbm90aGVyIGRyaXZlciBzdGFydCAqLworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVE9QX0RSSVZFUjoKKyAgICAgICAgICAgICAgICAgICAgV2lmaU5hdGl2ZS5zdG9wRHJpdmVyQ29tbWFuZCgpOworICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obURyaXZlclN0b3BwaW5nU3RhdGUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9SRVFVRVNUX0NNX1dBS0VMT0NLOgorICAgICAgICAgICAgICAgICAgICBpZiAobUNtID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1DbSA9IChDb25uZWN0aXZpdHlNYW5hZ2VyKW1Db250ZXh0LmdldFN5c3RlbVNlcnZpY2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRleHQuQ09OTkVDVElWSVRZX1NFUlZJQ0UpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1DbS5yZXF1ZXN0TmV0d29ya1RyYW5zaXRpb25XYWtlbG9jayhUQUcpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVEFSVF9QQUNLRVRfRklMVEVSSU5HOgorICAgICAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLnN0YXJ0UGFja2V0RmlsdGVyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUT1BfUEFDS0VUX0ZJTFRFUklORzoKKyAgICAgICAgICAgICAgICAgICAgV2lmaU5hdGl2ZS5zdG9wUGFja2V0RmlsdGVyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOT1RfSEFORExFRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRVZFTlRMT0dfV0lGSV9FVkVOVF9IQU5ETEVELCBtZXNzYWdlLndoYXQpOworICAgICAgICAgICAgcmV0dXJuIEhBTkRMRUQ7CisgICAgICAgIH0KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGV4aXQoKSB7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArICJcbiIpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtQmF0dGVyeVN0YXRzLm5vdGVXaWZpU3RvcHBlZCgpOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGlnbm9yZSkgeyB9CisgICAgICAgICAgICBtU2NhblJlc3VsdHMgPSBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgY2xhc3MgRHJpdmVyU3RvcHBpbmdTdGF0ZSBleHRlbmRzIEhpZXJhcmNoaWNhbFN0YXRlIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGVudGVyKCkgeworICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBnZXROYW1lKCkgKyAiXG4iKTsKKyAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRVZFTlRMT0dfV0lGSV9TVEFURV9DSEFOR0VELCBnZXROYW1lKCkpOworICAgICAgICB9CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKKyAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgbWVzc2FnZS50b1N0cmluZygpICsgIlxuIik7CisgICAgICAgICAgICBzd2l0Y2gobWVzc2FnZS53aGF0KSB7CisgICAgICAgICAgICAgICAgY2FzZSBEUklWRVJfU1RPUF9FVkVOVDoKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1Ecml2ZXJTdG9wcGVkU3RhdGUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgLyogUXVldWUgZHJpdmVyIGNvbW1hbmRzICovCisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RBUlRfRFJJVkVSOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUT1BfRFJJVkVSOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NFVF9TQ0FOX1RZUEU6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX1BPV0VSX01PREU6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX0JMVUVUT09USF9DT0VYSVNURU5DRToKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TRVRfQkxVRVRPT1RIX1NDQU5fTU9ERToKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TRVRfTlVNX0FMTE9XRURfQ0hBTk5FTFM6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RBUlRfUEFDS0VUX0ZJTFRFUklORzoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVE9QX1BBQ0tFVF9GSUxURVJJTkc6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RBUlRfU0NBTjoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9ESVNDT05ORUNUOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1JFQVNTT0NJQVRFOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1JFQ09OTkVDVDoKKyAgICAgICAgICAgICAgICAgICAgZGVmZXJNZXNzYWdlKG1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTk9UX0hBTkRMRUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UTE9HX1dJRklfRVZFTlRfSEFORExFRCwgbWVzc2FnZS53aGF0KTsKKyAgICAgICAgICAgIHJldHVybiBIQU5ETEVEOworICAgICAgICB9CisgICAgfQorCisgICAgY2xhc3MgRHJpdmVyU3RvcHBlZFN0YXRlIGV4dGVuZHMgSGllcmFyY2hpY2FsU3RhdGUgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZW50ZXIoKSB7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArICJcbiIpOworICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19XSUZJX1NUQVRFX0NIQU5HRUQsIGdldE5hbWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIHByb2Nlc3NNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkgeworICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBnZXROYW1lKCkgKyBtZXNzYWdlLnRvU3RyaW5nKCkgKyAiXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBOT1RfSEFORExFRDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsYXNzIFNjYW5Nb2RlU3RhdGUgZXh0ZW5kcyBIaWVyYXJjaGljYWxTdGF0ZSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBlbnRlcigpIHsKKyAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgIlxuIik7CisgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UTE9HX1dJRklfU1RBVEVfQ0hBTkdFRCwgZ2V0TmFtZSgpKTsKKyAgICAgICAgfQorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gcHJvY2Vzc01lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKSB7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArIG1lc3NhZ2UudG9TdHJpbmcoKSArICJcbiIpOworICAgICAgICAgICAgU3luY1BhcmFtcyBzeW5jUGFyYW1zOworICAgICAgICAgICAgc3dpdGNoKG1lc3NhZ2Uud2hhdCkgeworICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NFVF9TQ0FOX01PREU6CisgICAgICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLmFyZzEgPT0gU0NBTl9PTkxZX01PREUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIElnbm9yZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEhBTkRMRUQ7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLnNldFNjYW5SZXN1bHRIYW5kbGluZ0NvbW1hbmQobWVzc2FnZS5hcmcxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUucmVjb25uZWN0Q29tbWFuZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgbUlzU2Nhbk1vZGUgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtRGlzY29ubmVjdGVkU3RhdGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUQVJUX1NDQU46CisgICAgICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUuc2NhbkNvbW1hbmQobWVzc2FnZS5hcmcxID09IFNDQU5fQUNUSVZFKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIC8qIElnbm9yZSAqLworICAgICAgICAgICAgICAgIGNhc2UgQ01EX0RJU0NPTk5FQ1Q6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfUkVDT05ORUNUOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1JFQVNTT0NJQVRFOgorICAgICAgICAgICAgICAgIGNhc2UgU1VQUExJQ0FOVF9TVEFURV9DSEFOR0VfRVZFTlQ6CisgICAgICAgICAgICAgICAgY2FzZSBORVRXT1JLX0NPTk5FQ1RJT05fRVZFTlQ6CisgICAgICAgICAgICAgICAgY2FzZSBORVRXT1JLX0RJU0NPTk5FQ1RJT05fRVZFTlQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOT1RfSEFORExFRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRVZFTlRMT0dfV0lGSV9FVkVOVF9IQU5ETEVELCBtZXNzYWdlLndoYXQpOworICAgICAgICAgICAgcmV0dXJuIEhBTkRMRUQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGFzcyBDb25uZWN0TW9kZVN0YXRlIGV4dGVuZHMgSGllcmFyY2hpY2FsU3RhdGUgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZW50ZXIoKSB7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArICJcbiIpOworICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19XSUZJX1NUQVRFX0NIQU5HRUQsIGdldE5hbWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIHByb2Nlc3NNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkgeworICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBnZXROYW1lKCkgKyBtZXNzYWdlLnRvU3RyaW5nKCkgKyAiXG4iKTsKKyAgICAgICAgICAgIFN5bmNQYXJhbXMgc3luY1BhcmFtczsKKyAgICAgICAgICAgIFN0YXRlQ2hhbmdlUmVzdWx0IHN0YXRlQ2hhbmdlUmVzdWx0OworICAgICAgICAgICAgc3dpdGNoKG1lc3NhZ2Uud2hhdCkgeworICAgICAgICAgICAgICAgIGNhc2UgUEFTU1dPUkRfTUFZX0JFX0lOQ09SUkVDVF9FVkVOVDoKKyAgICAgICAgICAgICAgICAgICAgbVBhc3N3b3JkS2V5TWF5QmVJbmNvcnJlY3QgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNVUFBMSUNBTlRfU1RBVEVfQ0hBTkdFX0VWRU5UOgorICAgICAgICAgICAgICAgICAgICBzdGF0ZUNoYW5nZVJlc3VsdCA9IChTdGF0ZUNoYW5nZVJlc3VsdCkgbWVzc2FnZS5vYmo7CisgICAgICAgICAgICAgICAgICAgIG1TdXBwbGljYW50U3RhdGVUcmFja2VyLmhhbmRsZUV2ZW50KHN0YXRlQ2hhbmdlUmVzdWx0KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RBUlRfU0NBTjoKKyAgICAgICAgICAgICAgICAgICAgLyogV2UgbmVlZCB0byBzZXQgc2NhbiB0eXBlIGluIGNvbXBsZXRlZCBzdGF0ZSAqLworICAgICAgICAgICAgICAgICAgICBNZXNzYWdlIG5ld01zZyA9IG9idGFpbk1lc3NhZ2UoKTsKKyAgICAgICAgICAgICAgICAgICAgbmV3TXNnLmNvcHlGcm9tKG1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgICBtU3VwcGxpY2FudFN0YXRlVHJhY2tlci5zZW5kTWVzc2FnZShuZXdNc2cpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgLyogRG8gYSByZWR1bmRhbnQgZGlzY29ubmVjdCB3aXRob3V0IHRyYW5zaXRpb24gKi8KKyAgICAgICAgICAgICAgICBjYXNlIENNRF9ESVNDT05ORUNUOgorICAgICAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLmRpc2Nvbm5lY3RDb21tYW5kKCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ01EX1JFQ09OTkVDVDoKKyAgICAgICAgICAgICAgICAgICAgV2lmaU5hdGl2ZS5yZWNvbm5lY3RDb21tYW5kKCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ01EX1JFQVNTT0NJQVRFOgorICAgICAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLnJlYXNzb2NpYXRlQ29tbWFuZCgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9DT05ORUNUX05FVFdPUks6CisgICAgICAgICAgICAgICAgICAgIGludCBuZXRJZCA9IG1lc3NhZ2UuYXJnMTsKKyAgICAgICAgICAgICAgICAgICAgV2lmaUNvbmZpZ3VyYXRpb24gY29uZmlnID0gKFdpZmlDb25maWd1cmF0aW9uKSBtZXNzYWdlLm9iajsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXRJZCA9IGFkZE9yVXBkYXRlTmV0d29ya05hdGl2ZShjb25maWcpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIFJlc2V0IHRoZSBwcmlvcml0eSBvZiBlYWNoIG5ldHdvcmsgYXQgc3RhcnQgb3IgaWYgaXQgZ29lcyB0b28gaGlnaC4KKyAgICAgICAgICAgICAgICAgICAgaWYgKG1MYXN0UHJpb3JpdHkgPT0gLTEgfHwgbUxhc3RQcmlvcml0eSA+IDEwMDAwMDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoV2lmaUNvbmZpZ3VyYXRpb24gY29uZiA6IG1Db25maWd1cmVkTmV0d29ya3MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uZi5uZXR3b3JrSWQgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZi5wcmlvcml0eSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZE9yVXBkYXRlTmV0d29ya05hdGl2ZShjb25mKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBtTGFzdFByaW9yaXR5ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIFNldCB0byB0aGUgaGlnaGVzdCBwcmlvcml0eSBhbmQgc2F2ZSB0aGUgY29uZmlndXJhdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgY29uZmlnID0gbmV3IFdpZmlDb25maWd1cmF0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5uZXR3b3JrSWQgPSBuZXRJZDsKKyAgICAgICAgICAgICAgICAgICAgY29uZmlnLnByaW9yaXR5ID0gKyttTGFzdFByaW9yaXR5OworCisgICAgICAgICAgICAgICAgICAgIGFkZE9yVXBkYXRlTmV0d29ya05hdGl2ZShjb25maWcpOworICAgICAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLnNhdmVDb25maWdDb21tYW5kKCk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gQ29ubmVjdCB0byBuZXR3b3JrIGJ5IGRpc2FibGluZyBvdGhlcnMuCisgICAgICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUuZW5hYmxlTmV0d29ya0NvbW1hbmQobmV0SWQsIHRydWUpOworICAgICAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLnJlY29ubmVjdENvbW1hbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgbUVuYWJsZUFsbE5ldHdvcmtzID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgLyogdXBkYXRlIHRoZSBjb25maWd1cmVkIG5ldHdvcmtzIGJ1dCBub3Qgc2VuZCBhCisgICAgICAgICAgICAgICAgICAgICAqIGJyb2FkY2FzdCB0byBhdm9pZCBhIGZldGNoIGZyb20gc2V0dGluZ3MKKyAgICAgICAgICAgICAgICAgICAgICogZHVyaW5nIHRoaXMgdGVtcG9yYXJ5IGRpc2FibGluZyBvZiBuZXR3b3JrcworICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgdXBkYXRlQ29uZmlndXJlZE5ldHdvcmtzKCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU0NBTl9SRVNVTFRTX0VWRU5UOgorICAgICAgICAgICAgICAgICAgICAvKiBTZXQgdGhlIHNjYW4gc2V0dGluZyBiYWNrIHRvICJjb25uZWN0IiBtb2RlICovCisgICAgICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUuc2V0U2NhblJlc3VsdEhhbmRsaW5nQ29tbWFuZChDT05ORUNUX01PREUpOworICAgICAgICAgICAgICAgICAgICAvKiBIYW5kbGUgc2NhbiByZXN1bHRzICovCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOT1RfSEFORExFRDsKKyAgICAgICAgICAgICAgICBjYXNlIE5FVFdPUktfQ09OTkVDVElPTl9FVkVOVDoKKyAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCJOZXR3b3JrIGNvbm5lY3Rpb24gZXN0YWJsaXNoZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhdGVDaGFuZ2VSZXN1bHQgPSAoU3RhdGVDaGFuZ2VSZXN1bHQpIG1lc3NhZ2Uub2JqOworCisgICAgICAgICAgICAgICAgICAgIC8vVE9ETzogbWFrZSBzdXBwbGljYW50IG1vZGlmaWNhdGlvbiB0byBwdXNoIHRoaXMgaW4gZXZlbnRzCisgICAgICAgICAgICAgICAgICAgIG1XaWZpSW5mby5zZXRTU0lEKGZldGNoU1NJRCgpKTsKKyAgICAgICAgICAgICAgICAgICAgbVdpZmlJbmZvLnNldEJTU0lEKG1MYXN0QnNzaWQgPSBzdGF0ZUNoYW5nZVJlc3VsdC5CU1NJRCk7CisgICAgICAgICAgICAgICAgICAgIG1XaWZpSW5mby5zZXROZXR3b3JrSWQoc3RhdGVDaGFuZ2VSZXN1bHQubmV0d29ya0lkKTsKKyAgICAgICAgICAgICAgICAgICAgbUxhc3ROZXR3b3JrSWQgPSBzdGF0ZUNoYW5nZVJlc3VsdC5uZXR3b3JrSWQ7CisgICAgICAgICAgICAgICAgICAgIGVuYWJsZUFsbE5ldHdvcmtzKCk7CisgICAgICAgICAgICAgICAgICAgIC8qIHNlbmQgZXZlbnQgdG8gQ00gJiBuZXR3b3JrIGNoYW5nZSBicm9hZGNhc3QgKi8KKyAgICAgICAgICAgICAgICAgICAgc2V0RGV0YWlsZWRTdGF0ZShEZXRhaWxlZFN0YXRlLk9CVEFJTklOR19JUEFERFIpOworICAgICAgICAgICAgICAgICAgICBzZW5kTmV0d29ya1N0YXRlQ2hhbmdlQnJvYWRjYXN0KG1MYXN0QnNzaWQpOworCisgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtQ29ubmVjdGluZ1N0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBORVRXT1JLX0RJU0NPTk5FQ1RJT05fRVZFTlQ6CisgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywiTmV0d29yayBjb25uZWN0aW9uIGxvc3QiKTsKKyAgICAgICAgICAgICAgICAgICAgZW5hYmxlQWxsTmV0d29ya3MoKTsKKyAgICAgICAgICAgICAgICAgICAgaGFuZGxlTmV0d29ya0Rpc2Nvbm5lY3QoKTsKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1EaXNjb25uZWN0ZWRTdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ01EX0dFVF9SU1NJOgorICAgICAgICAgICAgICAgICAgICBzeW5jUGFyYW1zID0gKFN5bmNQYXJhbXMpIG1lc3NhZ2Uub2JqOworICAgICAgICAgICAgICAgICAgICBzeW5jUGFyYW1zLm1TeW5jUmV0dXJuLmludFZhbHVlID0gV2lmaU5hdGl2ZS5nZXRSc3NpQ29tbWFuZCgpOworICAgICAgICAgICAgICAgICAgICBub3RpZnlPbk1zZ09iamVjdChtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfR0VUX1JTU0lfQVBQUk9YOgorICAgICAgICAgICAgICAgICAgICBzeW5jUGFyYW1zID0gKFN5bmNQYXJhbXMpIG1lc3NhZ2Uub2JqOworICAgICAgICAgICAgICAgICAgICBzeW5jUGFyYW1zLm1TeW5jUmV0dXJuLmludFZhbHVlID0gV2lmaU5hdGl2ZS5nZXRSc3NpQXBwcm94Q29tbWFuZCgpOworICAgICAgICAgICAgICAgICAgICBub3RpZnlPbk1zZ09iamVjdChtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfR0VUX0xJTktfU1BFRUQ6CisgICAgICAgICAgICAgICAgICAgIHN5bmNQYXJhbXMgPSAoU3luY1BhcmFtcykgbWVzc2FnZS5vYmo7CisgICAgICAgICAgICAgICAgICAgIHN5bmNQYXJhbXMubVN5bmNSZXR1cm4uaW50VmFsdWUgPSBXaWZpTmF0aXZlLmdldExpbmtTcGVlZENvbW1hbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5T25Nc2dPYmplY3QobWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOT1RfSEFORExFRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRVZFTlRMT0dfV0lGSV9FVkVOVF9IQU5ETEVELCBtZXNzYWdlLndoYXQpOworICAgICAgICAgICAgcmV0dXJuIEhBTkRMRUQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGFzcyBDb25uZWN0aW5nU3RhdGUgZXh0ZW5kcyBIaWVyYXJjaGljYWxTdGF0ZSB7CisgICAgICAgIGJvb2xlYW4gbW9kaWZpZWRCbHVldG9vdGhDb2V4aXN0ZW5jZU1vZGU7CisgICAgICAgIGludCBwb3dlck1vZGU7CisgICAgICAgIFRocmVhZCBtRGhjcFRocmVhZDsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZW50ZXIoKSB7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArICJcbiIpOworICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19XSUZJX1NUQVRFX0NIQU5HRUQsIGdldE5hbWUoKSk7CisKKyAgICAgICAgICAgIGlmICghbVVzZVN0YXRpY0lwKSB7CisKKyAgICAgICAgICAgICAgICBtRGhjcFRocmVhZCA9IG51bGw7CisgICAgICAgICAgICAgICAgbW9kaWZpZWRCbHVldG9vdGhDb2V4aXN0ZW5jZU1vZGUgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBwb3dlck1vZGUgPSBEUklWRVJfUE9XRVJfTU9ERV9BVVRPOworCisgICAgICAgICAgICAgICAgaWYgKHNob3VsZERpc2FibGVDb2V4aXN0ZW5jZU1vZGUoKSkgeworICAgICAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgICAgKiBUaGVyZSBhcmUgcHJvYmxlbXMgc2V0dGluZyB0aGUgV2ktRmkgZHJpdmVyJ3MgcG93ZXIKKyAgICAgICAgICAgICAgICAgICAgICogbW9kZSB0byBhY3RpdmUgd2hlbiBibHVldG9vdGggY29leGlzdGVuY2UgbW9kZSBpcworICAgICAgICAgICAgICAgICAgICAgKiBlbmFibGVkIG9yIHNlbnNlLgorICAgICAgICAgICAgICAgICAgICAgKiA8cD4KKyAgICAgICAgICAgICAgICAgICAgICogV2Ugc2V0IFdpLUZpIHRvIGFjdGl2ZSBtb2RlIHdoZW4KKyAgICAgICAgICAgICAgICAgICAgICogb2J0YWluaW5nIGFuIElQIGFkZHJlc3MgYmVjYXVzZSB3ZSd2ZSBmb3VuZAorICAgICAgICAgICAgICAgICAgICAgKiBjb21wYXRpYmlsaXR5IGlzc3VlcyB3aXRoIHNvbWUgcm91dGVycyB3aXRoIGxvdyBwb3dlcgorICAgICAgICAgICAgICAgICAgICAgKiBtb2RlLgorICAgICAgICAgICAgICAgICAgICAgKiA8cD4KKyAgICAgICAgICAgICAgICAgICAgICogSW4gb3JkZXIgZm9yIHRoaXMgYWN0aXZlIHBvd2VyIG1vZGUgdG8gcHJvcGVybHkgYmUgc2V0LAorICAgICAgICAgICAgICAgICAgICAgKiB3ZSBkaXNhYmxlIGNvZXhpc3RlbmNlIG1vZGUgdW50aWwgd2UncmUgZG9uZSB3aXRoCisgICAgICAgICAgICAgICAgICAgICAqIG9idGFpbmluZyBhbiBJUCBhZGRyZXNzLiAgT25lIGV4Y2VwdGlvbiBpcyBpZiB3ZQorICAgICAgICAgICAgICAgICAgICAgKiBhcmUgY3VycmVudGx5IGNvbm5lY3RlZCB0byBhIGhlYWRzZXQsIHNpbmNlIGRpc2FibGluZworICAgICAgICAgICAgICAgICAgICAgKiBjb2V4aXN0ZW5jZSB3b3VsZCBpbnRlcnJ1cHQgdGhhdCBjb25uZWN0aW9uLgorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWRCbHVldG9vdGhDb2V4aXN0ZW5jZU1vZGUgPSB0cnVlOworCisgICAgICAgICAgICAgICAgICAgIC8vIERpc2FibGUgdGhlIGNvZXhpc3RlbmNlIG1vZGUKKyAgICAgICAgICAgICAgICAgICAgV2lmaU5hdGl2ZS5zZXRCbHVldG9vdGhDb2V4aXN0ZW5jZU1vZGVDb21tYW5kKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUuQkxVRVRPT1RIX0NPRVhJU1RFTkNFX01PREVfRElTQUJMRUQpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHBvd2VyTW9kZSA9ICBXaWZpTmF0aXZlLmdldFBvd2VyTW9kZUNvbW1hbmQoKTsKKyAgICAgICAgICAgICAgICBpZiAocG93ZXJNb2RlIDwgMCkgeworICAgICAgICAgICAgICAgICAgLy8gSGFuZGxlIHRoZSBjYXNlIHdoZXJlIHN1cHBsaWNhbnQgZHJpdmVyIGRvZXMgbm90IHN1cHBvcnQKKyAgICAgICAgICAgICAgICAgIC8vIGdldFBvd2VyTW9kZUNvbW1hbmQuCisgICAgICAgICAgICAgICAgICAgIHBvd2VyTW9kZSA9IERSSVZFUl9QT1dFUl9NT0RFX0FVVE87CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChwb3dlck1vZGUgIT0gRFJJVkVSX1BPV0VSX01PREVfQUNUSVZFKSB7CisgICAgICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUuc2V0UG93ZXJNb2RlQ29tbWFuZChEUklWRVJfUE9XRVJfTU9ERV9BQ1RJVkUpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkRIQ1AgcmVxdWVzdCBzdGFydGVkIik7CisgICAgICAgICAgICAgICAgbURoY3BUaHJlYWQgPSBuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE5ldHdvcmtVdGlscy5ydW5EaGNwKG1JbnRlcmZhY2VOYW1lLCBtRGhjcEluZm8pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiREhDUCByZXF1ZXN0IHN1Y2NlZWRlZCIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRNZXNzYWdlKENNRF9JUF9DT05GSUdfU1VDQ0VTUyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkRIQ1AgcmVxdWVzdCBmYWlsZWQ6ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV0d29ya1V0aWxzLmdldERoY3BFcnJvcigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kTWVzc2FnZShDTURfSVBfQ09ORklHX0ZBSUxVUkUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgbURoY3BUaHJlYWQuc3RhcnQoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKE5ldHdvcmtVdGlscy5jb25maWd1cmVJbnRlcmZhY2UobUludGVyZmFjZU5hbWUsIG1EaGNwSW5mbykpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAiU3RhdGljIElQIGNvbmZpZ3VyYXRpb24gc3VjY2VlZGVkIik7CisgICAgICAgICAgICAgICAgICAgIHNlbmRNZXNzYWdlKENNRF9JUF9DT05GSUdfU1VDQ0VTUyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAiU3RhdGljIElQIGNvbmZpZ3VyYXRpb24gZmFpbGVkIik7CisgICAgICAgICAgICAgICAgICAgIHNlbmRNZXNzYWdlKENNRF9JUF9DT05GSUdfRkFJTFVSRSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKKyAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArIG1lc3NhZ2UudG9TdHJpbmcoKSArICJcbiIpOworCisgICAgICAgICAgc3dpdGNoKG1lc3NhZ2Uud2hhdCkgeworICAgICAgICAgICAgICBjYXNlIENNRF9JUF9DT05GSUdfU1VDQ0VTUzoKKyAgICAgICAgICAgICAgICAgIG1SZWNvbm5lY3RDb3VudCA9IDA7CisgICAgICAgICAgICAgICAgICBtTGFzdFNpZ25hbExldmVsID0gLTE7IC8vIGZvcmNlIHVwZGF0ZSBvZiBzaWduYWwgc3RyZW5ndGgKKyAgICAgICAgICAgICAgICAgIG1XaWZpSW5mby5zZXRJcEFkZHJlc3MobURoY3BJbmZvLmlwQWRkcmVzcyk7CisgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJJUCBjb25maWd1cmF0aW9uOiAiICsgbURoY3BJbmZvKTsKKyAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyZU5ldHdvcmtQcm9wZXJ0aWVzKCk7CisgICAgICAgICAgICAgICAgICBzZXREZXRhaWxlZFN0YXRlKERldGFpbGVkU3RhdGUuQ09OTkVDVEVEKTsKKyAgICAgICAgICAgICAgICAgIHNlbmROZXR3b3JrU3RhdGVDaGFuZ2VCcm9hZGNhc3QobUxhc3RCc3NpZCk7CisgICAgICAgICAgICAgICAgICAvL1RPRE86IHdlIGNvdWxkIGFsc28gZGV0ZWN0IGFuIElQIGNvbmZpZyBjaGFuZ2UKKyAgICAgICAgICAgICAgICAgIC8vIGZyb20gYSBESENQIHJlbmV3YWwgYW5kIHNlbmQgb3V0IGEgY29uZmlnIGNoYW5nZQorICAgICAgICAgICAgICAgICAgLy8gYnJvYWRjYXN0CisgICAgICAgICAgICAgICAgICBpZiAobUNvbmZpZ0NoYW5nZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICBzZW5kQ29uZmlnQ2hhbmdlQnJvYWRjYXN0KCk7CisgICAgICAgICAgICAgICAgICAgICAgbUNvbmZpZ0NoYW5nZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtQ29ubmVjdGVkU3RhdGUpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgQ01EX0lQX0NPTkZJR19GQUlMVVJFOgorICAgICAgICAgICAgICAgICAgbVdpZmlJbmZvLnNldElwQWRkcmVzcygwKTsKKworICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiSVAgY29uZmlndXJhdGlvbiBmYWlsZWQiKTsKKyAgICAgICAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICAgICAgICogSWYgd2UndmUgZXhjZWVkZWQgdGhlIG1heGltdW0gbnVtYmVyIG9mIHJldHJpZXMgZm9yIERIQ1AKKyAgICAgICAgICAgICAgICAgICAqIHRvIGEgZ2l2ZW4gbmV0d29yaywgZGlzYWJsZSB0aGUgbmV0d29yaworICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICBpZiAoKyttUmVjb25uZWN0Q291bnQgPiBnZXRNYXhEaGNwUmV0cmllcygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkZhaWxlZCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUmVjb25uZWN0Q291bnQgKyAiIHRpbWVzLCBEaXNhYmxpbmcgIiArIG1MYXN0TmV0d29ya0lkKTsKKyAgICAgICAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLmRpc2FibGVOZXR3b3JrQ29tbWFuZChtTGFzdE5ldHdvcmtJZCk7CisgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlQ29uZmlnQW5kU2VuZENoYW5nZUJyb2FkY2FzdCgpOworICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAvKiBESENQIHRpbWVzIG91dCBhZnRlciBhYm91dCAzMCBzZWNvbmRzLCB3ZSBkbyBhCisgICAgICAgICAgICAgICAgICAgKiBkaXNjb25uZWN0IGFuZCBhbiBpbW1lZGlhdGUgcmVjb25uZWN0IHRvIHRyeSBhZ2FpbgorICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLmRpc2Nvbm5lY3RDb21tYW5kKCk7CisgICAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLnJlY29ubmVjdENvbW1hbmQoKTsKKyAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtRGlzY29ubmVjdGluZ1N0YXRlKTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIENNRF9ESVNDT05ORUNUOgorICAgICAgICAgICAgICAgICAgV2lmaU5hdGl2ZS5kaXNjb25uZWN0Q29tbWFuZCgpOworICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1EaXNjb25uZWN0aW5nU3RhdGUpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAvKiBJZ25vcmUgKi8KKyAgICAgICAgICAgICAgY2FzZSBORVRXT1JLX0NPTk5FQ1RJT05fRVZFTlQ6CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSBDTURfU1RPUF9EUklWRVI6CisgICAgICAgICAgICAgICAgICBzZW5kTWVzc2FnZShDTURfRElTQ09OTkVDVCk7CisgICAgICAgICAgICAgICAgICBkZWZlck1lc3NhZ2UobWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX1NDQU5fTU9ERToKKyAgICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLmFyZzEgPT0gU0NBTl9PTkxZX01PREUpIHsKKyAgICAgICAgICAgICAgICAgICAgICBzZW5kTWVzc2FnZShDTURfRElTQ09OTkVDVCk7CisgICAgICAgICAgICAgICAgICAgICAgZGVmZXJNZXNzYWdlKG1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgQ01EX1JFQ09ORklHVVJFX0lQOgorICAgICAgICAgICAgICAgICAgZGVmZXJNZXNzYWdlKG1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIE5PVF9IQU5ETEVEOworICAgICAgICAgIH0KKyAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UTE9HX1dJRklfRVZFTlRfSEFORExFRCwgbWVzc2FnZS53aGF0KTsKKyAgICAgICAgICByZXR1cm4gSEFORExFRDsKKyAgICAgIH0KKworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgdm9pZCBleGl0KCkgeworICAgICAgICAgIC8qIHJlc2V0IHBvd2VyIHN0YXRlICYgYmx1ZXRvb3RoIGNvZXhpc3RlbmNlIGlmIG9uIERIQ1AgKi8KKyAgICAgICAgICBpZiAoIW1Vc2VTdGF0aWNJcCkgeworICAgICAgICAgICAgICBpZiAocG93ZXJNb2RlICE9IERSSVZFUl9QT1dFUl9NT0RFX0FDVElWRSkgeworICAgICAgICAgICAgICAgICAgV2lmaU5hdGl2ZS5zZXRQb3dlck1vZGVDb21tYW5kKHBvd2VyTW9kZSk7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBpZiAobW9kaWZpZWRCbHVldG9vdGhDb2V4aXN0ZW5jZU1vZGUpIHsKKyAgICAgICAgICAgICAgICAgIC8vIFNldCB0aGUgY29leGlzdGVuY2UgbW9kZSBiYWNrIHRvIGl0cyBkZWZhdWx0IHZhbHVlCisgICAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLnNldEJsdWV0b290aENvZXhpc3RlbmNlTW9kZUNvbW1hbmQoCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUuQkxVRVRPT1RIX0NPRVhJU1RFTkNFX01PREVfU0VOU0UpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICB9CisgICAgfQorCisgICAgY2xhc3MgQ29ubmVjdGVkU3RhdGUgZXh0ZW5kcyBIaWVyYXJjaGljYWxTdGF0ZSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBlbnRlcigpIHsKKyAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgIlxuIik7CisgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UTE9HX1dJRklfU1RBVEVfQ0hBTkdFRCwgZ2V0TmFtZSgpKTsKKyAgICAgICAgfQorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gcHJvY2Vzc01lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKSB7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArIG1lc3NhZ2UudG9TdHJpbmcoKSArICJcbiIpOworICAgICAgICAgICAgc3dpdGNoIChtZXNzYWdlLndoYXQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9ESVNDT05ORUNUOgorICAgICAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLmRpc2Nvbm5lY3RDb21tYW5kKCk7CisgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtRGlzY29ubmVjdGluZ1N0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfUkVDT05GSUdVUkVfSVA6CisgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywiUmVjb25maWd1cmluZyBJUCBvbiBjb25uZWN0aW9uIik7CisgICAgICAgICAgICAgICAgICAgIE5ldHdvcmtVdGlscy5yZXNldENvbm5lY3Rpb25zKG1JbnRlcmZhY2VOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1Db25uZWN0aW5nU3RhdGUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVE9QX0RSSVZFUjoKKyAgICAgICAgICAgICAgICAgICAgc2VuZE1lc3NhZ2UoQ01EX0RJU0NPTk5FQ1QpOworICAgICAgICAgICAgICAgICAgICBkZWZlck1lc3NhZ2UobWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NFVF9TQ0FOX01PREU6CisgICAgICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLmFyZzEgPT0gU0NBTl9PTkxZX01PREUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRNZXNzYWdlKENNRF9ESVNDT05ORUNUKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVyTWVzc2FnZShtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgLyogSWdub3JlICovCisgICAgICAgICAgICAgICAgY2FzZSBORVRXT1JLX0NPTk5FQ1RJT05fRVZFTlQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOT1RfSEFORExFRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRVZFTlRMT0dfV0lGSV9FVkVOVF9IQU5ETEVELCBtZXNzYWdlLndoYXQpOworICAgICAgICAgICAgcmV0dXJuIEhBTkRMRUQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGFzcyBEaXNjb25uZWN0aW5nU3RhdGUgZXh0ZW5kcyBIaWVyYXJjaGljYWxTdGF0ZSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBlbnRlcigpIHsKKyAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgIlxuIik7CisgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UTE9HX1dJRklfU1RBVEVfQ0hBTkdFRCwgZ2V0TmFtZSgpKTsKKyAgICAgICAgfQorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gcHJvY2Vzc01lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKSB7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArIG1lc3NhZ2UudG9TdHJpbmcoKSArICJcbiIpOworICAgICAgICAgICAgc3dpdGNoIChtZXNzYWdlLndoYXQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVE9QX0RSSVZFUjogLyogU3RvcCBkcml2ZXIgb25seSBhZnRlciBkaXNjb25uZWN0IGhhbmRsZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgZGVmZXJNZXNzYWdlKG1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TRVRfU0NBTl9NT0RFOgorICAgICAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5hcmcxID09IFNDQU5fT05MWV9NT0RFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZlck1lc3NhZ2UobWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5PVF9IQU5ETEVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19XSUZJX0VWRU5UX0hBTkRMRUQsIG1lc3NhZ2Uud2hhdCk7CisgICAgICAgICAgICByZXR1cm4gSEFORExFRDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsYXNzIERpc2Nvbm5lY3RlZFN0YXRlIGV4dGVuZHMgSGllcmFyY2hpY2FsU3RhdGUgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZW50ZXIoKSB7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArICJcbiIpOworICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19XSUZJX1NUQVRFX0NIQU5HRUQsIGdldE5hbWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIHByb2Nlc3NNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkgeworICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBnZXROYW1lKCkgKyBtZXNzYWdlLnRvU3RyaW5nKCkgKyAiXG4iKTsKKyAgICAgICAgICAgIHN3aXRjaCAobWVzc2FnZS53aGF0KSB7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX1NDQU5fTU9ERToKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UuYXJnMSA9PSBTQ0FOX09OTFlfTU9ERSkgeworICAgICAgICAgICAgICAgICAgICAgICAgV2lmaU5hdGl2ZS5zZXRTY2FuUmVzdWx0SGFuZGxpbmdDb21tYW5kKG1lc3NhZ2UuYXJnMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAvL1N1cHBsaWNhbnQgZGlzY29ubmVjdCB0byBwcmV2ZW50IGZ1cnRoZXIgY29ubmVjdHMKKyAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUuZGlzY29ubmVjdENvbW1hbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Jc1NjYW5Nb2RlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtU2Nhbk1vZGVTdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIC8qIElnbm9yZSBuZXR3b3JrIGRpc2Nvbm5lY3QgKi8KKyAgICAgICAgICAgICAgICBjYXNlIE5FVFdPUktfRElTQ09OTkVDVElPTl9FVkVOVDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5PVF9IQU5ETEVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19XSUZJX0VWRU5UX0hBTkRMRUQsIG1lc3NhZ2Uud2hhdCk7CisgICAgICAgICAgICByZXR1cm4gSEFORExFRDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsYXNzIFNvZnRBcFN0YXJ0ZWRTdGF0ZSBleHRlbmRzIEhpZXJhcmNoaWNhbFN0YXRlIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGVudGVyKCkgeworICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBnZXROYW1lKCkgKyAiXG4iKTsKKyAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRVZFTlRMT0dfV0lGSV9TVEFURV9DSEFOR0VELCBnZXROYW1lKCkpOworICAgICAgICB9CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKKyAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgbWVzc2FnZS50b1N0cmluZygpICsgIlxuIik7CisgICAgICAgICAgICBzd2l0Y2gobWVzc2FnZS53aGF0KSB7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RPUF9BUDoKKyAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCJTdG9wcGluZyBTb2Z0IEFQIik7CisgICAgICAgICAgICAgICAgICAgIHNldFdpZmlBcFN0YXRlKFdJRklfQVBfU1RBVEVfRElTQUJMSU5HKTsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG53U2VydmljZS5zdG9wQWNjZXNzUG9pbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiRXhjZXB0aW9uIGluIHN0b3BBY2Nlc3NQb2ludCgpIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1Ecml2ZXJMb2FkZWRTdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUQVJUX0FQOgorICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsIlNvZnRBUCBzZXQgb24gYSBydW5uaW5nIGFjY2VzcyBwb2ludCIpOworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgbndTZXJ2aWNlLnNldEFjY2Vzc1BvaW50KChXaWZpQ29uZmlndXJhdGlvbikgbWVzc2FnZS5vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW50ZXJmYWNlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPRlRBUF9JRkFDRSk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkV4Y2VwdGlvbiBpbiBud1NlcnZpY2UgZHVyaW5nIHNvZnQgQVAgc2V0Iik7CisgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG53U2VydmljZS5zdG9wQWNjZXNzUG9pbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNsb2cuZShUQUcsICJDb3VsZCBub3Qgc3RvcCBBUCwgOiIgKyBlZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBzZW5kTWVzc2FnZShvYnRhaW5NZXNzYWdlKENNRF9VTkxPQURfRFJJVkVSLCBXSUZJX0FQX1NUQVRFX0ZBSUxFRCwgMCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIC8qIEZhaWwgY2xpZW50IG1vZGUgb3BlcmF0aW9uIHdoZW4gc29mdCBBUCBpcyBlbmFibGVkICovCisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RBUlRfU1VQUExJQ0FOVDoKKyAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCJDYW5ub3Qgc3RhcnQgc3VwcGxpY2FudCB3aXRoIGEgcnVubmluZyBzb2Z0IEFQIik7CisgICAgICAgICAgICAgICAgICAgIHNldFdpZmlTdGF0ZShXSUZJX1NUQVRFX1VOS05PV04pOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTk9UX0hBTkRMRUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UTE9HX1dJRklfRVZFTlRfSEFORExFRCwgbWVzc2FnZS53aGF0KTsKKyAgICAgICAgICAgIHJldHVybiBIQU5ETEVEOworICAgICAgICB9CisgICAgfQorCisKKyAgICBjbGFzcyBTdXBwbGljYW50U3RhdGVUcmFja2VyIGV4dGVuZHMgSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lIHsKKworICAgICAgICBwcml2YXRlIGludCBtUnNzaVBvbGxUb2tlbiA9IDA7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBtYXggbnVtYmVyIG9mIHRoZSBXUEEgc3VwcGxpY2FudCBsb29wIGl0ZXJhdGlvbnMgYmVmb3JlIHdlCisgICAgICAgICAqIGRlY2lkZSB0aGF0IHRoZSBsb29wIHNob3VsZCBiZSB0ZXJtaW5hdGVkOgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9TVVBQTElDQU5UX0xPT1BfSVRFUkFUSU9OUyA9IDQ7CisgICAgICAgIHByaXZhdGUgaW50IG1Mb29wRGV0ZWN0SW5kZXggPSAwOworICAgICAgICBwcml2YXRlIGludCBtTG9vcERldGVjdENvdW50ID0gMDsKKworICAgICAgICAvKioKKyAgICAgICAgICogIFN1cHBsaWNhbnQgc3RhdGUgY2hhbmdlIGNvbW1hbmRzIGZvbGxvdworICAgICAgICAgKiAgdGhlIG9yZGluYWwgdmFsdWVzIGRlZmluZWQgaW4gU3VwcGxpY2FudFN0YXRlLmphdmEKKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBESVNDT05ORUNURUQgICAgICAgICAgID0gMDsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElOQUNUSVZFICAgICAgICAgICAgICAgPSAxOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0NBTk5JTkcgICAgICAgICAgICAgICA9IDI7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBU1NPQ0lBVElORyAgICAgICAgICAgID0gMzsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFTU09DSUFURUQgICAgICAgICAgICAgPSA0OworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRk9VUl9XQVlfSEFORFNIQUtFICAgICA9IDU7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBHUk9VUF9IQU5EU0hBS0UgICAgICAgID0gNjsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENPTVBMRVRFRCAgICAgICAgICAgICAgPSA3OworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRE9STUFOVCAgICAgICAgICAgICAgICA9IDg7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBVTklOSVRJQUxJWkVEICAgICAgICAgID0gOTsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElOVkFMSUQgICAgICAgICAgICAgICAgPSAxMDsKKworICAgICAgICBwcml2YXRlIEhpZXJhcmNoaWNhbFN0YXRlIG1VbmluaXRpYWxpemVkU3RhdGUgPSBuZXcgVW5pbml0aWFsaXplZFN0YXRlKCk7CisgICAgICAgIHByaXZhdGUgSGllcmFyY2hpY2FsU3RhdGUgbUluaXRpYWxpemVkU3RhdGUgPSBuZXcgSW5pdGlhbGl6ZWRTdGF0ZSgpOzsKKyAgICAgICAgcHJpdmF0ZSBIaWVyYXJjaGljYWxTdGF0ZSBtSW5hY3RpdmVTdGF0ZSA9IG5ldyBJbmFjdGl2ZVN0YXRlKCk7CisgICAgICAgIHByaXZhdGUgSGllcmFyY2hpY2FsU3RhdGUgbURpc2Nvbm5lY3RTdGF0ZSA9IG5ldyBEaXNjb25uZWN0ZWRTdGF0ZSgpOworICAgICAgICBwcml2YXRlIEhpZXJhcmNoaWNhbFN0YXRlIG1TY2FuU3RhdGUgPSBuZXcgU2NhblN0YXRlKCk7CisgICAgICAgIHByaXZhdGUgSGllcmFyY2hpY2FsU3RhdGUgbUNvbm5lY3RTdGF0ZSA9IG5ldyBDb25uZWN0U3RhdGUoKTsKKyAgICAgICAgcHJpdmF0ZSBIaWVyYXJjaGljYWxTdGF0ZSBtSGFuZHNoYWtlU3RhdGUgPSBuZXcgSGFuZHNoYWtlU3RhdGUoKTsKKyAgICAgICAgcHJpdmF0ZSBIaWVyYXJjaGljYWxTdGF0ZSBtQ29tcGxldGVkU3RhdGUgPSBuZXcgQ29tcGxldGVkU3RhdGUoKTsKKyAgICAgICAgcHJpdmF0ZSBIaWVyYXJjaGljYWxTdGF0ZSBtRG9ybWFudFN0YXRlID0gbmV3IERvcm1hbnRTdGF0ZSgpOworCisgICAgICAgIHB1YmxpYyBTdXBwbGljYW50U3RhdGVUcmFja2VyKENvbnRleHQgY29udGV4dCwgSGFuZGxlciB0YXJnZXQpIHsKKyAgICAgICAgICAgIHN1cGVyKFRBRywgdGFyZ2V0LmdldExvb3BlcigpKTsKKworICAgICAgICAgICAgYWRkU3RhdGUobVVuaW5pdGlhbGl6ZWRTdGF0ZSk7CisgICAgICAgICAgICBhZGRTdGF0ZShtSW5pdGlhbGl6ZWRTdGF0ZSk7CisgICAgICAgICAgICAgICAgYWRkU3RhdGUobUluYWN0aXZlU3RhdGUsIG1Jbml0aWFsaXplZFN0YXRlKTsKKyAgICAgICAgICAgICAgICBhZGRTdGF0ZShtRGlzY29ubmVjdFN0YXRlLCBtSW5pdGlhbGl6ZWRTdGF0ZSk7CisgICAgICAgICAgICAgICAgYWRkU3RhdGUobVNjYW5TdGF0ZSwgbUluaXRpYWxpemVkU3RhdGUpOworICAgICAgICAgICAgICAgIGFkZFN0YXRlKG1Db25uZWN0U3RhdGUsIG1Jbml0aWFsaXplZFN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgYWRkU3RhdGUobUhhbmRzaGFrZVN0YXRlLCBtQ29ubmVjdFN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgYWRkU3RhdGUobUNvbXBsZXRlZFN0YXRlLCBtQ29ubmVjdFN0YXRlKTsKKyAgICAgICAgICAgICAgICBhZGRTdGF0ZShtRG9ybWFudFN0YXRlLCBtSW5pdGlhbGl6ZWRTdGF0ZSk7CisKKyAgICAgICAgICAgIHNldEluaXRpYWxTdGF0ZShtVW5pbml0aWFsaXplZFN0YXRlKTsKKworICAgICAgICAgICAgLy9zdGFydCB0aGUgc3RhdGUgbWFjaGluZQorICAgICAgICAgICAgc3RhcnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KFN0YXRlQ2hhbmdlUmVzdWx0IHN0YXRlQ2hhbmdlUmVzdWx0KSB7CisgICAgICAgICAgICBTdXBwbGljYW50U3RhdGUgbmV3U3RhdGUgPSAoU3VwcGxpY2FudFN0YXRlKSBzdGF0ZUNoYW5nZVJlc3VsdC5zdGF0ZTsKKworICAgICAgICAgICAgLy8gU3VwcGxpY2FudCBzdGF0ZSBjaGFuZ2UKKyAgICAgICAgICAgIC8vIFszMS0xM10gUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UKKyAgICAgICAgICAgIC8vIFs4IC0gMF0gU3VwcGxpY2FudCBzdGF0ZSAoYXMgZGVmaW5lZCBpbiBTdXBwbGljYW50U3RhdGUuamF2YSkKKyAgICAgICAgICAgIC8vIDUwMDIzIHN1cHBsaWNhbnRfc3RhdGVfY2hhbmdlZCAoY3VzdG9tfDF8NSkKKyAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRVZFTlRMT0dfU1VQUExJQ0FOVF9TVEFURV9DSEFOR0VELCBuZXdTdGF0ZS5vcmRpbmFsKCkpOworCisgICAgICAgICAgICBzZW5kTWVzc2FnZShvYnRhaW5NZXNzYWdlKG5ld1N0YXRlLm9yZGluYWwoKSwgc3RhdGVDaGFuZ2VSZXN1bHQpKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHJlc2V0U3VwcGxpY2FudFN0YXRlKCkgeworICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1VbmluaXRpYWxpemVkU3RhdGUpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIHJlc2V0TG9vcERldGVjdGlvbigpIHsKKyAgICAgICAgICAgIG1Mb29wRGV0ZWN0Q291bnQgPSAwOworICAgICAgICAgICAgbUxvb3BEZXRlY3RJbmRleCA9IDA7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGJvb2xlYW4gaGFuZGxlVHJhbnNpdGlvbihNZXNzYWdlIG1zZykgeworICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBnZXROYW1lKCkgKyBtc2cudG9TdHJpbmcoKSArICJcbiIpOworICAgICAgICAgICAgc3dpdGNoIChtc2cud2hhdCkgeworICAgICAgICAgICAgICAgIGNhc2UgRElTQ09OTkVDVEVEOgorICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obURpc2Nvbm5lY3RTdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU0NBTk5JTkc6CisgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtU2NhblN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBBU1NPQ0lBVElORzoKKyAgICAgICAgICAgICAgICAgICAgU3RhdGVDaGFuZ2VSZXN1bHQgc3RhdGVDaGFuZ2VSZXN1bHQgPSAoU3RhdGVDaGFuZ2VSZXN1bHQpIG1zZy5vYmo7CisgICAgICAgICAgICAgICAgICAgIC8qIEJTU0lEIGlzIHZhbGlkIG9ubHkgaW4gQVNTT0NJQVRJTkcgc3RhdGUgKi8KKyAgICAgICAgICAgICAgICAgICAgbVdpZmlJbmZvLnNldEJTU0lEKHN0YXRlQ2hhbmdlUmVzdWx0LkJTU0lEKTsKKyAgICAgICAgICAgICAgICAgICAgLy8kRkFMTC1USFJPVUdIJAorICAgICAgICAgICAgICAgIGNhc2UgQVNTT0NJQVRFRDoKKyAgICAgICAgICAgICAgICBjYXNlIEZPVVJfV0FZX0hBTkRTSEFLRToKKyAgICAgICAgICAgICAgICBjYXNlIEdST1VQX0hBTkRTSEFLRToKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1IYW5kc2hha2VTdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obUNvbXBsZXRlZFN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBET1JNQU5UOgorICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obURvcm1hbnRTdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgSU5BQ1RJVkU6CisgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtSW5hY3RpdmVTdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgVU5JTklUSUFMSVpFRDoKKyAgICAgICAgICAgICAgICBjYXNlIElOVkFMSUQ6CisgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtVW5pbml0aWFsaXplZFN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5PVF9IQU5ETEVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU3RhdGVDaGFuZ2VSZXN1bHQgc3RhdGVDaGFuZ2VSZXN1bHQgPSAoU3RhdGVDaGFuZ2VSZXN1bHQpIG1zZy5vYmo7CisgICAgICAgICAgICBTdXBwbGljYW50U3RhdGUgc3VwU3RhdGUgPSAoU3VwcGxpY2FudFN0YXRlKSBzdGF0ZUNoYW5nZVJlc3VsdC5zdGF0ZTsKKyAgICAgICAgICAgIHNldERldGFpbGVkU3RhdGUoV2lmaUluZm8uZ2V0RGV0YWlsZWRTdGF0ZU9mKHN1cFN0YXRlKSk7CisgICAgICAgICAgICBtV2lmaUluZm8uc2V0U3VwcGxpY2FudFN0YXRlKHN1cFN0YXRlKTsKKyAgICAgICAgICAgIG1XaWZpSW5mby5zZXROZXR3b3JrSWQoc3RhdGVDaGFuZ2VSZXN1bHQubmV0d29ya0lkKTsKKyAgICAgICAgICAgIHJldHVybiBIQU5ETEVEOworICAgICAgICB9CisKKyAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAqIEhTTSBzdGF0ZXMKKyAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICAgICAgY2xhc3MgSW5pdGlhbGl6ZWRTdGF0ZSBleHRlbmRzIEhpZXJhcmNoaWNhbFN0YXRlIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGVudGVyKCkgeworICAgICAgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArICJcbiIpOworICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gcHJvY2Vzc01lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKSB7CisgICAgICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBnZXROYW1lKCkgKyBtZXNzYWdlLnRvU3RyaW5nKCkgKyAiXG4iKTsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKG1lc3NhZ2Uud2hhdCkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIENNRF9TVEFSVF9TQ0FOOgorICAgICAgICAgICAgICAgICAgICAgICAgV2lmaU5hdGl2ZS5zY2FuQ29tbWFuZChtZXNzYWdlLmFyZzEgPT0gU0NBTl9BQ1RJVkUpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREJHKSBMb2cudyhUQUcsICJJZ25vcmluZyAiICsgbWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIEhBTkRMRUQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBjbGFzcyBVbmluaXRpYWxpemVkU3RhdGUgZXh0ZW5kcyBIaWVyYXJjaGljYWxTdGF0ZSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICBwdWJsaWMgdm9pZCBlbnRlcigpIHsKKyAgICAgICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBnZXROYW1lKCkgKyAiXG4iKTsKKyAgICAgICAgICAgICAgICAgbU5ldHdvcmtJbmZvLnNldElzQXZhaWxhYmxlKGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgcmVzZXRMb29wRGV0ZWN0aW9uKCk7CisgICAgICAgICAgICAgICAgIG1QYXNzd29yZEtleU1heUJlSW5jb3JyZWN0ID0gZmFsc2U7CisgICAgICAgICAgICAgfQorICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2gobWVzc2FnZS53aGF0KSB7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWhhbmRsZVRyYW5zaXRpb24obWVzc2FnZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREJHKSBMb2cudyhUQUcsICJJZ25vcmluZyAiICsgbWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIEhBTkRMRUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGV4aXQoKSB7CisgICAgICAgICAgICAgICAgbU5ldHdvcmtJbmZvLnNldElzQXZhaWxhYmxlKHRydWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgY2xhc3MgSW5hY3RpdmVTdGF0ZSBleHRlbmRzIEhpZXJhcmNoaWNhbFN0YXRlIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGVudGVyKCkgeworICAgICAgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArICJcbiIpOworICAgICAgICAgICAgICAgICBNZXNzYWdlIG1lc3NhZ2UgPSBnZXRDdXJyZW50TWVzc2FnZSgpOworICAgICAgICAgICAgICAgICBTdGF0ZUNoYW5nZVJlc3VsdCBzdGF0ZUNoYW5nZVJlc3VsdCA9IChTdGF0ZUNoYW5nZVJlc3VsdCkgbWVzc2FnZS5vYmo7CisKKyAgICAgICAgICAgICAgICAgbU5ldHdvcmtJbmZvLnNldElzQXZhaWxhYmxlKGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgcmVzZXRMb29wRGV0ZWN0aW9uKCk7CisgICAgICAgICAgICAgICAgIG1QYXNzd29yZEtleU1heUJlSW5jb3JyZWN0ID0gZmFsc2U7CisKKyAgICAgICAgICAgICAgICAgc2VuZFN1cHBsaWNhbnRTdGF0ZUNoYW5nZWRCcm9hZGNhc3Qoc3RhdGVDaGFuZ2VSZXN1bHQsIGZhbHNlKTsKKyAgICAgICAgICAgICB9CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIHByb2Nlc3NNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBoYW5kbGVUcmFuc2l0aW9uKG1lc3NhZ2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBleGl0KCkgeworICAgICAgICAgICAgICAgIG1OZXR3b3JrSW5mby5zZXRJc0F2YWlsYWJsZSh0cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisKKyAgICAgICAgY2xhc3MgRGlzY29ubmVjdGVkU3RhdGUgZXh0ZW5kcyBIaWVyYXJjaGljYWxTdGF0ZSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICBwdWJsaWMgdm9pZCBlbnRlcigpIHsKKyAgICAgICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBnZXROYW1lKCkgKyAiXG4iKTsKKyAgICAgICAgICAgICAgICAgTWVzc2FnZSBtZXNzYWdlID0gZ2V0Q3VycmVudE1lc3NhZ2UoKTsKKyAgICAgICAgICAgICAgICAgU3RhdGVDaGFuZ2VSZXN1bHQgc3RhdGVDaGFuZ2VSZXN1bHQgPSAoU3RhdGVDaGFuZ2VSZXN1bHQpIG1lc3NhZ2Uub2JqOworCisgICAgICAgICAgICAgICAgIHJlc2V0TG9vcERldGVjdGlvbigpOworCisgICAgICAgICAgICAgICAgIC8qIElmIGEgZGlzY29ubmVjdCBldmVudCBoYXBwZW5zIGFmdGVyIGEgcGFzc3dvcmQga2V5IGZhaWx1cmUKKyAgICAgICAgICAgICAgICAgICogZXZlbnQsIGRpc2FibGUgdGhlIG5ldHdvcmsKKyAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgIGlmIChtUGFzc3dvcmRLZXlNYXlCZUluY29ycmVjdCkgeworICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiRmFpbGVkIHRvIGF1dGhlbnRpY2F0ZSwgZGlzYWJsaW5nIG5ldHdvcmsgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1XaWZpSW5mby5nZXROZXR3b3JrSWQoKSk7CisgICAgICAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLmRpc2FibGVOZXR3b3JrQ29tbWFuZChtV2lmaUluZm8uZ2V0TmV0d29ya0lkKCkpOworICAgICAgICAgICAgICAgICAgICAgbVBhc3N3b3JkS2V5TWF5QmVJbmNvcnJlY3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgIHNlbmRTdXBwbGljYW50U3RhdGVDaGFuZ2VkQnJvYWRjYXN0KHN0YXRlQ2hhbmdlUmVzdWx0LCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUNvbmZpZ0FuZFNlbmRDaGFuZ2VCcm9hZGNhc3QoKTsKKyAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgIHNlbmRTdXBwbGljYW50U3RhdGVDaGFuZ2VkQnJvYWRjYXN0KHN0YXRlQ2hhbmdlUmVzdWx0LCBmYWxzZSk7CisgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICB9CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIHByb2Nlc3NNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBoYW5kbGVUcmFuc2l0aW9uKG1lc3NhZ2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgY2xhc3MgU2NhblN0YXRlIGV4dGVuZHMgSGllcmFyY2hpY2FsU3RhdGUgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgcHVibGljIHZvaWQgZW50ZXIoKSB7CisgICAgICAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgIlxuIik7CisgICAgICAgICAgICAgICAgIE1lc3NhZ2UgbWVzc2FnZSA9IGdldEN1cnJlbnRNZXNzYWdlKCk7CisgICAgICAgICAgICAgICAgIFN0YXRlQ2hhbmdlUmVzdWx0IHN0YXRlQ2hhbmdlUmVzdWx0ID0gKFN0YXRlQ2hhbmdlUmVzdWx0KSBtZXNzYWdlLm9iajsKKworICAgICAgICAgICAgICAgICBtUGFzc3dvcmRLZXlNYXlCZUluY29ycmVjdCA9IGZhbHNlOworICAgICAgICAgICAgICAgICByZXNldExvb3BEZXRlY3Rpb24oKTsKKyAgICAgICAgICAgICAgICAgc2VuZFN1cHBsaWNhbnRTdGF0ZUNoYW5nZWRCcm9hZGNhc3Qoc3RhdGVDaGFuZ2VSZXN1bHQsIGZhbHNlKTsKKyAgICAgICAgICAgICB9CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIHByb2Nlc3NNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBoYW5kbGVUcmFuc2l0aW9uKG1lc3NhZ2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgY2xhc3MgQ29ubmVjdFN0YXRlIGV4dGVuZHMgSGllcmFyY2hpY2FsU3RhdGUgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgcHVibGljIHZvaWQgZW50ZXIoKSB7CisgICAgICAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgIlxuIik7CisgICAgICAgICAgICAgfQorICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKG1lc3NhZ2Uud2hhdCkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIENNRF9TVEFSVF9TQ0FOOgorICAgICAgICAgICAgICAgICAgICAgICAgV2lmaU5hdGl2ZS5zZXRTY2FuUmVzdWx0SGFuZGxpbmdDb21tYW5kKFNDQU5fT05MWV9NT0RFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUuc2NhbkNvbW1hbmQobWVzc2FnZS5hcmcxID09IFNDQU5fQUNUSVZFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5PVF9IQU5ETEVEOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gSEFORExFRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGNsYXNzIEhhbmRzaGFrZVN0YXRlIGV4dGVuZHMgSGllcmFyY2hpY2FsU3RhdGUgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgcHVibGljIHZvaWQgZW50ZXIoKSB7CisgICAgICAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgIlxuIik7CisgICAgICAgICAgICAgICAgIGZpbmFsIE1lc3NhZ2UgbWVzc2FnZSA9IGdldEN1cnJlbnRNZXNzYWdlKCk7CisgICAgICAgICAgICAgICAgIFN0YXRlQ2hhbmdlUmVzdWx0IHN0YXRlQ2hhbmdlUmVzdWx0ID0gKFN0YXRlQ2hhbmdlUmVzdWx0KSBtZXNzYWdlLm9iajsKKworICAgICAgICAgICAgICAgICBpZiAobUxvb3BEZXRlY3RJbmRleCA+IG1lc3NhZ2Uud2hhdCkgeworICAgICAgICAgICAgICAgICAgICAgbUxvb3BEZXRlY3RDb3VudCsrOworICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgIGlmIChtTG9vcERldGVjdENvdW50ID4gTUFYX1NVUFBMSUNBTlRfTE9PUF9JVEVSQVRJT05TKSB7CisgICAgICAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLmRpc2FibGVOZXR3b3JrQ29tbWFuZChzdGF0ZUNoYW5nZVJlc3VsdC5uZXR3b3JrSWQpOworICAgICAgICAgICAgICAgICAgICAgdXBkYXRlQ29uZmlnQW5kU2VuZENoYW5nZUJyb2FkY2FzdCgpOworICAgICAgICAgICAgICAgICAgICAgbUxvb3BEZXRlY3RDb3VudCA9IDA7CisgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICBtTG9vcERldGVjdEluZGV4ID0gbWVzc2FnZS53aGF0OworCisgICAgICAgICAgICAgICAgIG1QYXNzd29yZEtleU1heUJlSW5jb3JyZWN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgIHNlbmRTdXBwbGljYW50U3RhdGVDaGFuZ2VkQnJvYWRjYXN0KHN0YXRlQ2hhbmdlUmVzdWx0LCBmYWxzZSk7CisgICAgICAgICAgICAgfQorICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlVHJhbnNpdGlvbihtZXNzYWdlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGNsYXNzIENvbXBsZXRlZFN0YXRlIGV4dGVuZHMgSGllcmFyY2hpY2FsU3RhdGUgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgcHVibGljIHZvaWQgZW50ZXIoKSB7CisgICAgICAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgIlxuIik7CisgICAgICAgICAgICAgICAgIE1lc3NhZ2UgbWVzc2FnZSA9IGdldEN1cnJlbnRNZXNzYWdlKCk7CisgICAgICAgICAgICAgICAgIFN0YXRlQ2hhbmdlUmVzdWx0IHN0YXRlQ2hhbmdlUmVzdWx0ID0gKFN0YXRlQ2hhbmdlUmVzdWx0KSBtZXNzYWdlLm9iajsKKworICAgICAgICAgICAgICAgICBtUnNzaVBvbGxUb2tlbisrOworICAgICAgICAgICAgICAgICBpZiAobUVuYWJsZVJzc2lQb2xsaW5nKSB7CisgICAgICAgICAgICAgICAgICAgICBzZW5kTWVzc2FnZURlbGF5ZWQob2J0YWluTWVzc2FnZShDTURfUlNTSV9QT0xMLCBtUnNzaVBvbGxUb2tlbiwgMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBPTExfUlNTSV9JTlRFUlZBTF9NU0VDUyk7CisgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICByZXNldExvb3BEZXRlY3Rpb24oKTsKKworICAgICAgICAgICAgICAgICBtUGFzc3dvcmRLZXlNYXlCZUluY29ycmVjdCA9IGZhbHNlOworICAgICAgICAgICAgICAgICBzZW5kU3VwcGxpY2FudFN0YXRlQ2hhbmdlZEJyb2FkY2FzdChzdGF0ZUNoYW5nZVJlc3VsdCwgZmFsc2UpOworICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gcHJvY2Vzc01lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKSB7CisgICAgICAgICAgICAgICAgc3dpdGNoKG1lc3NhZ2Uud2hhdCkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIEFTU09DSUFUSU5HOgorICAgICAgICAgICAgICAgICAgICBjYXNlIEFTU09DSUFURUQ6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgRk9VUl9XQVlfSEFORFNIQUtFOgorICAgICAgICAgICAgICAgICAgICBjYXNlIEdST1VQX0hBTkRTSEFLRToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDTURfUlNTSV9QT0xMOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UuYXJnMSA9PSBtUnNzaVBvbGxUb2tlbikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdldCBJbmZvIGFuZCBjb250aW51ZSBwb2xsaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFBvbGxlZEluZm8oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kTWVzc2FnZURlbGF5ZWQob2J0YWluTWVzc2FnZShDTURfUlNTSV9QT0xMLCBtUnNzaVBvbGxUb2tlbiwgMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQT0xMX1JTU0lfSU5URVJWQUxfTVNFQ1MpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQb2xsaW5nIGhhcyBjb21wbGV0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIENNRF9FTkFCTEVfUlNTSV9QT0xMOgorICAgICAgICAgICAgICAgICAgICAgICAgbVJzc2lQb2xsVG9rZW4rKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtRW5hYmxlUnNzaVBvbGxpbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmaXJzdCBwb2xsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFBvbGxlZEluZm8oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kTWVzc2FnZURlbGF5ZWQob2J0YWluTWVzc2FnZShDTURfUlNTSV9QT0xMLCBtUnNzaVBvbGxUb2tlbiwgMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQT0xMX1JTU0lfSU5URVJWQUxfTVNFQ1MpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlVHJhbnNpdGlvbihtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIEhBTkRMRUQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBjbGFzcyBEb3JtYW50U3RhdGUgZXh0ZW5kcyBIaWVyYXJjaGljYWxTdGF0ZSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGVudGVyKCkgeworICAgICAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgIlxuIik7CisgICAgICAgICAgICAgICAgTWVzc2FnZSBtZXNzYWdlID0gZ2V0Q3VycmVudE1lc3NhZ2UoKTsKKyAgICAgICAgICAgICAgICBTdGF0ZUNoYW5nZVJlc3VsdCBzdGF0ZUNoYW5nZVJlc3VsdCA9IChTdGF0ZUNoYW5nZVJlc3VsdCkgbWVzc2FnZS5vYmo7CisKKyAgICAgICAgICAgICAgICByZXNldExvb3BEZXRlY3Rpb24oKTsKKyAgICAgICAgICAgICAgICBtUGFzc3dvcmRLZXlNYXlCZUluY29ycmVjdCA9IGZhbHNlOworCisgICAgICAgICAgICAgICAgc2VuZFN1cHBsaWNhbnRTdGF0ZUNoYW5nZWRCcm9hZGNhc3Qoc3RhdGVDaGFuZ2VSZXN1bHQsIGZhbHNlKTsKKworICAgICAgICAgICAgICAgIC8qIFRPRE86IHJlY29ubmVjdCBpcyBub3cgYmVpbmcgaGFuZGxlZCBhdCBESENQIGZhaWx1cmUgaGFuZGxpbmcKKyAgICAgICAgICAgICAgICAgKiBJZiB3ZSBydW4gaW50byBpc3N1ZXMgd2l0aCBzdGF5aW5nIGluIERvcm1hbnQgc3RhdGUsIG1pZ2h0CisgICAgICAgICAgICAgICAgICogbmVlZCBhIHJlY29ubmVjdCBoZXJlCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIHByb2Nlc3NNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBoYW5kbGVUcmFuc2l0aW9uKG1lc3NhZ2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvd2lmaS9qYXZhL2FuZHJvaWQvbmV0L3dpZmkvV2lmaVN0YXRlVHJhY2tlci5qYXZhIGIvd2lmaS9qYXZhL2FuZHJvaWQvbmV0L3dpZmkvV2lmaVN0YXRlVHJhY2tlci5qYXZhCmluZGV4IDU5ZjIzMTIuLjE0N2UyZGMgMTAwNjQ0Ci0tLSBhL3dpZmkvamF2YS9hbmRyb2lkL25ldC93aWZpL1dpZmlTdGF0ZVRyYWNrZXIuamF2YQorKysgYi93aWZpL2phdmEvYW5kcm9pZC9uZXQvd2lmaS9XaWZpU3RhdGVUcmFja2VyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0xNiw0NTAgKzE2LDExMCBAQAogCiBwYWNrYWdlIGFuZHJvaWQubmV0LndpZmk7CiAKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlci5XSUZJX1NUQVRFX0RJU0FCTEVEOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyLldJRklfU1RBVEVfRElTQUJMSU5HOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyLldJRklfU1RBVEVfRU5BQkxFRDsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlci5XSUZJX1NUQVRFX0VOQUJMSU5HOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyLldJRklfU1RBVEVfVU5LTk9XTjsKIAotaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5TWFuYWdlck5hdGl2ZTsKLWltcG9ydCBhbmRyb2lkLm5ldC5OZXR3b3JrSW5mbzsKLWltcG9ydCBhbmRyb2lkLm5ldC5OZXR3b3JrU3RhdGVUcmFja2VyOwotaW1wb3J0IGFuZHJvaWQubmV0LkRoY3BJbmZvOwotaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtVdGlsczsKLWltcG9ydCBhbmRyb2lkLm5ldC5Db25uZWN0aXZpdHlNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtJbmZvLkRldGFpbGVkU3RhdGU7Ci1pbXBvcnQgYW5kcm9pZC5uZXQuTmV0d29ya0luZm8uU3RhdGU7Ci1pbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwotaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsYWJsZTsKLWltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyVGhyZWFkOwotaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtUHJvcGVydGllczsKLWltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKLWltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLm9zLlNlcnZpY2VNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3M7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKLWltcG9ydCBhbmRyb2lkLnV0aWwuRXZlbnRMb2c7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBhbmRyb2lkLnV0aWwuQ29uZmlnOwotaW1wb3J0IGFuZHJvaWQuYXBwLk5vdGlmaWNhdGlvbjsKLWltcG9ydCBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50OwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aERldmljZTsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhIZWFkc2V0OwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aEEyZHA7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ29udGVudE9ic2VydmVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLmFwcC5JQmF0dGVyeVN0YXRzOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudEZpbHRlcjsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Db25uZWN0aXZpdHlNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtJbmZvOworaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtQcm9wZXJ0aWVzOworaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtTdGF0ZVRyYWNrZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKIAotaW1wb3J0IGphdmEubmV0LlVua25vd25Ib3N0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljSW50ZWdlcjsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljQm9vbGVhbjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljSW50ZWdlcjsKIAogLyoqCi0gKiBUcmFjayB0aGUgc3RhdGUgb2YgV2lmaSBjb25uZWN0aXZpdHkuIEFsbCBldmVudCBoYW5kbGluZyBpcyBkb25lIGhlcmUsCi0gKiBhbmQgYWxsIGNoYW5nZXMgaW4gY29ubmVjdGl2aXR5IHN0YXRlIGFyZSBpbml0aWF0ZWQgaGVyZS4KKyAqIFRyYWNrIHRoZSBzdGF0ZSBvZiB3aWZpIGZvciBjb25uZWN0aXZpdHkgc2VydmljZS4KICAqCiAgKiBAaGlkZQogICovCi1wdWJsaWMgY2xhc3MgV2lmaVN0YXRlVHJhY2tlciBleHRlbmRzIE5ldHdvcmtTdGF0ZVRyYWNrZXIgeworcHVibGljIGNsYXNzIFdpZmlTdGF0ZVRyYWNrZXIgaW1wbGVtZW50cyBOZXR3b3JrU3RhdGVUcmFja2VyIHsKIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gTE9DQUxfTE9HRCA9IENvbmZpZy5MT0dEIHx8IGZhbHNlOwotICAgIAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBORVRXT1JLVFlQRSA9ICJXSUZJIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIldpZmlTdGF0ZVRyYWNrZXIiOwogCi0gICAgLy8gRXZlbnQgbG9nIHRhZ3MgKG11c3QgYmUgaW4gc3luYyB3aXRoIGV2ZW50LWxvZy10YWdzKQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVExPR19ORVRXT1JLX1NUQVRFX0NIQU5HRUQgPSA1MDAyMTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRMT0dfU1VQUExJQ0FOVF9TVEFURV9DSEFOR0VEID0gNTAwMjI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVWRU5UTE9HX0RSSVZFUl9TVEFURV9DSEFOR0VEID0gNTAwMjM7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVWRU5UTE9HX0lOVEVSRkFDRV9DT05GSUdVUkFUSU9OX1NUQVRFX0NIQU5HRUQgPSA1MDAyNDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRMT0dfU1VQUExJQ0FOVF9DT05ORUNUSU9OX1NUQVRFX0NIQU5HRUQgPSA1MDAyNTsKKyAgICBwcml2YXRlIEF0b21pY0Jvb2xlYW4gbVRlYXJkb3duUmVxdWVzdGVkID0gbmV3IEF0b21pY0Jvb2xlYW4oZmFsc2UpOworICAgIHByaXZhdGUgQXRvbWljQm9vbGVhbiBtUHJpdmF0ZURuc1JvdXRlU2V0ID0gbmV3IEF0b21pY0Jvb2xlYW4oZmFsc2UpOworICAgIHByaXZhdGUgQXRvbWljSW50ZWdlciBtRGVmYXVsdEdhdGV3YXlBZGRyID0gbmV3IEF0b21pY0ludGVnZXIoMCk7CisgICAgcHJpdmF0ZSBBdG9taWNCb29sZWFuIG1EZWZhdWx0Um91dGVTZXQgPSBuZXcgQXRvbWljQm9vbGVhbihmYWxzZSk7CiAKLSAgICAvLyBFdmVudCBjb2RlcwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVF9TVVBQTElDQU5UX0NPTk5FQ1RJT04gICAgICAgICAgICAgPSAxOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVF9TVVBQTElDQU5UX0RJU0NPTk5FQ1QgICAgICAgICAgICAgPSAyOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVF9TVVBQTElDQU5UX1NUQVRFX0NIQU5HRUQgICAgICAgICAgPSAzOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVF9ORVRXT1JLX1NUQVRFX0NIQU5HRUQgICAgICAgICAgICAgPSA0OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVF9TQ0FOX1JFU1VMVFNfQVZBSUxBQkxFICAgICAgICAgICAgPSA1OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVF9JTlRFUkZBQ0VfQ09ORklHVVJBVElPTl9TVUNDRUVERUQgPSA2OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVF9JTlRFUkZBQ0VfQ09ORklHVVJBVElPTl9GQUlMRUQgICAgPSA3OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVF9QT0xMX0lOVEVSVkFMICAgICAgICAgICAgICAgICAgICAgPSA4OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVF9ESENQX1NUQVJUICAgICAgICAgICAgICAgICAgICAgICAgPSA5OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVF9ERUZFUlJFRF9ESVNDT05ORUNUICAgICAgICAgICAgICAgPSAxMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfREVGRVJSRURfUkVDT05ORUNUICAgICAgICAgICAgICAgID0gMTE7Ci0gICAgLyoqCi0gICAgICogVGhlIGRyaXZlciBpcyBzdGFydGVkIG9yIHN0b3BwZWQuIFRoZSBvYmplY3Qgd2lsbCBiZSB0aGUgc3RhdGU6IHRydWUgZm9yCi0gICAgICogc3RhcnRlZCwgZmFsc2UgZm9yIHN0b3BwZWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVWRU5UX0RSSVZFUl9TVEFURV9DSEFOR0VEICAgICAgICAgICAgICA9IDEyOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVF9QQVNTV09SRF9LRVlfTUFZX0JFX0lOQ09SUkVDVCAgICAgPSAxMzsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfTUFZQkVfU1RBUlRfU0NBTl9QT1NUX0RJU0NPTk5FQ1QgID0gMTQ7CisgICAgcHJpdmF0ZSBOZXR3b3JrUHJvcGVydGllcyBtTmV0d29ya1Byb3BlcnRpZXM7CisgICAgcHJpdmF0ZSBOZXR3b3JrSW5mbyBtTmV0d29ya0luZm87CiAKLSAgICAvKioKLSAgICAgKiBUaGUgZHJpdmVyIHN0YXRlIGluZGljYXRpb24uCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERSSVZFUl9TVEFSVEVEICAgICAgICAgICAgICAgICAgICAgICAgICA9IDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERSSVZFUl9TVE9QUEVEICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERSSVZFUl9IVU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI7CisgICAgLyogRm9yIHNlbmRpbmcgZXZlbnRzIHRvIGNvbm5lY3Rpdml0eSBzZXJ2aWNlIGhhbmRsZXIgKi8KKyAgICBwcml2YXRlIEhhbmRsZXIgbUNzSGFuZGxlcjsKKyAgICBwcml2YXRlIENvbnRleHQgbUNvbnRleHQ7CisgICAgcHJpdmF0ZSBCcm9hZGNhc3RSZWNlaXZlciBtV2lmaVN0YXRlUmVjZWl2ZXI7CisgICAgcHJpdmF0ZSBXaWZpTWFuYWdlciBtV2lmaU1hbmFnZXI7CiAKLSAgICAvKioKLSAgICAgKiBJbnRlcnZhbCBpbiBtaWxsaXNlY29uZHMgYmV0d2VlbiBwb2xsaW5nIGZvciBjb25uZWN0aW9uCi0gICAgICogc3RhdHVzIGl0ZW1zIHRoYXQgYXJlIG5vdCBzZW50IHZpYSBhc3luY2hyb25vdXMgZXZlbnRzLgotICAgICAqIEFuIGV4YW1wbGUgaXMgUlNTSSAoc2lnbmFsIHN0cmVuZ3RoKS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUE9MTF9TVEFUVVNfSU5URVJWQUxfTVNFQ1MgPSAzMDAwOworICAgIHB1YmxpYyBXaWZpU3RhdGVUcmFja2VyKCkgeworICAgICAgICBtTmV0d29ya0luZm8gPSBuZXcgTmV0d29ya0luZm8oQ29ubmVjdGl2aXR5TWFuYWdlci5UWVBFX1dJRkksIDAsIE5FVFdPUktUWVBFLCAiIik7CisgICAgICAgIG1OZXR3b3JrUHJvcGVydGllcyA9IG5ldyBOZXR3b3JrUHJvcGVydGllcygpOwogCi0gICAgLyoqCi0gICAgICogVGhlIG1heCBudW1iZXIgb2YgdGhlIFdQQSBzdXBwbGljYW50IGxvb3AgaXRlcmF0aW9ucyBiZWZvcmUgd2UKLSAgICAgKiBkZWNpZGUgdGhhdCB0aGUgbG9vcCBzaG91bGQgYmUgdGVybWluYXRlZDoKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1NVUFBMSUNBTlRfTE9PUF9JVEVSQVRJT05TID0gNDsKKyAgICAgICAgbU5ldHdvcmtJbmZvLnNldElzQXZhaWxhYmxlKGZhbHNlKTsKKyAgICAgICAgbU5ldHdvcmtQcm9wZXJ0aWVzLmNsZWFyKCk7CisgICAgICAgIHNldFRlYXJkb3duUmVxdWVzdGVkKGZhbHNlKTsKKyAgICB9CiAKLSAgICAvKioKLSAgICAgKiBXaGVuIGEgRElTQ09OTkVDVCBldmVudCBpcyByZWNlaXZlZCwgd2UgZGVmZXIgaGFuZGxpbmcgaXQgdG8KLSAgICAgKiBhbGxvdyBmb3IgdGhlIHBvc3NpYmlsaXR5IHRoYXQgdGhlIERJU0NPTk5FQ1QgaXMgYWJvdXQgdG8KLSAgICAgKiBiZSBmb2xsb3dlZCBzaG9ydGx5IGJ5IGEgQ09OTkVDVCB0byB0aGUgc2FtZSBuZXR3b3JrIHdlIHdlcmUKLSAgICAgKiBqdXN0IGNvbm5lY3RlZCB0by4gSW4gc3VjaCBhIGNhc2UsIHdlIGRvbid0IHdhbnQgdG8gcmVwb3J0Ci0gICAgICogdGhlIG5ldHdvcmsgYXMgZG93biwgbm9yIGRvIHdlIHdhbnQgdG8gcmVjb25maWd1cmUgdGhlIG5ldHdvcmsKLSAgICAgKiBpbnRlcmZhY2UsIGV0Yy4gSWYgd2UgZ2V0IGEgQ09OTkVDVCBldmVudCBmb3IgYW5vdGhlciBuZXR3b3JrCi0gICAgICogd2l0aGluIHRoZSBkZWxheSB3aW5kb3csIHdlIGltbWVkaWF0ZWx5IGhhbmRsZSB0aGUgcGVuZGluZwotICAgICAqIGRpc2Nvbm5lY3QgYmVmb3JlIHByb2Nlc3NpbmcgdGhlIENPTk5FQ1QuPHAvPgotICAgICAqIFRoZSBmaXZlIHNlY29uZCBkZWxheSBpcyBjaG9zZW4gc29tZXdoYXQgYXJiaXRyYXJpbHksIGJ1dCBpcwotICAgICAqIG1lYW50IHRvIGNvdmVyIG1vc3Qgb2YgdGhlIGNhc2VzIHdoZXJlIGEgRElTQ09OTkVDVC9DT05ORUNUCi0gICAgICogaGFwcGVucyB0byBhIG5ldHdvcmsuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERJU0NPTk5FQ1RfREVMQVlfTVNFQ1MgPSA1MDAwOwotICAgIC8qKgotICAgICAqIFdoZW4gdGhlIHN1cHBsaWNhbnQgZ29lcyBpZGxlIGFmdGVyIHdlIGRvIGFuIGV4cGxpY2l0IGRpc2Nvbm5lY3QKLSAgICAgKiBmb2xsb3dpbmcgYSBESENQIGZhaWx1cmUsIHdlIG5lZWQgdG8ga2ljayB0aGUgc3VwcGxpY2FudCBpbnRvCi0gICAgICogdHJ5aW5nIHRvIGFzc29jaWF0ZSB3aXRoIGFjY2VzcyBwb2ludHMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJFQ09OTkVDVF9ERUxBWV9NU0VDUyA9IDIwMDA7CiAKLSAgICAvKioKLSAgICAgKiBXaGVuIHRoZSBzdXBwbGljYW50IGRpc2Nvbm5lY3RzIGZyb20gYW4gQVAgaXQgc29tZXRpbWVzIGZvcmdldHMKLSAgICAgKiB0byByZXN0YXJ0IHNjYW5uaW5nLiAgV2FpdCB0aGlzIGRlbGF5IGJlZm9yZSBhc2tpbmcgaXQgdG8gc3RhcnQKLSAgICAgKiBzY2FubmluZyAoaW4gY2FzZSBpdCBmb3Jnb3QpLiAgMTUgc2VjIGlzIHRoZSBzdGFuZGFyZCBkZWxheSBiZXR3ZWVuCi0gICAgICogc2NhbnMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEtJQ0tTVEFSVF9TQ0FOTklOR19ERUxBWV9NU0VDUyA9IDE1MDAwOworICAgIHB1YmxpYyB2b2lkIHNldFRlYXJkb3duUmVxdWVzdGVkKGJvb2xlYW4gaXNSZXF1ZXN0ZWQpIHsKKyAgICAgICAgbVRlYXJkb3duUmVxdWVzdGVkLnNldChpc1JlcXVlc3RlZCk7CisgICAgfQogCi0gICAgLyoqCi0gICAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIHRpbWVzIHdlIHdpbGwgcmV0cnkgYSBjb25uZWN0aW9uIHRvIGFuIGFjY2VzcyBwb2ludAotICAgICAqIGZvciB3aGljaCB3ZSBoYXZlIGZhaWxlZCBpbiBhY3F1aXJpbmcgYW4gSVAgYWRkcmVzcyBmcm9tIERIQ1AuIEEgdmFsdWUgb2YKLSAgICAgKiBOIG1lYW5zIHRoYXQgd2Ugd2lsbCBtYWtlIE4rMSBjb25uZWN0aW9uIGF0dGVtcHRzIGluIGFsbC4KLSAgICAgKiA8cD4KLSAgICAgKiBTZWUge0BsaW5rIFNldHRpbmdzLlNlY3VyZSNXSUZJX01BWF9ESENQX1JFVFJZX0NPVU5UfS4gVGhpcyBpcyB0aGUgZGVmYXVsdAotICAgICAqIHZhbHVlIGlmIGEgU2V0dGluZ3MgdmFsdWUgaXMgbm90IHByZXNlbnQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfTUFYX0RIQ1BfUkVUUklFUyA9IDk7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRFJJVkVSX1BPV0VSX01PREVfQVVUTyA9IDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERSSVZFUl9QT1dFUl9NT0RFX0FDVElWRSA9IDE7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY3VycmVudCBXUEEgc3VwcGxpY2FudCBsb29wIHN0YXRlICh1c2VkIHRvIGRldGVjdCBsb29waW5nIGJlaGF2aW9yKToKLSAgICAgKi8KLSAgICBwcml2YXRlIFN1cHBsaWNhbnRTdGF0ZSBtU3VwcGxpY2FudExvb3BTdGF0ZSA9IFN1cHBsaWNhbnRTdGF0ZS5ESVNDT05ORUNURUQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY3VycmVudCBudW1iZXIgb2YgV1BBIHN1cHBsaWNhbnQgbG9vcCBpdGVyYXRpb25zOgotICAgICAqLwotICAgIHByaXZhdGUgaW50IG1OdW1TdXBwbGljYW50TG9vcEl0ZXJhdGlvbnMgPSAwOwotCi0gICAgLyoqCi0gICAgICogVGhlIGN1cnJlbnQgbnVtYmVyIG9mIHN1cHBsaWNhbnQgc3RhdGUgY2hhbmdlcy4gIFRoaXMgaXMgdXNlZCB0byBkZXRlcm1pbmUKLSAgICAgKiBpZiB3ZSd2ZSByZWNlaXZlZCBhbnkgbmV3IGluZm8gc2luY2Ugd2UgZm91bmQgb3V0IGl0IHdhcyBESVNDT05ORUNURUQgb3IKLSAgICAgKiBJTkFDVElWRS4gIElmIHdlIGhhdmVuJ3QgZm9yIFggbXMsIHdlIHRoZW4gcmVxdWVzdCBhIHNjYW4gLSBpdCBzaG91bGQgaGF2ZQotICAgICAqIGRvbmUgdGhhdCBhdXRvbWF0aWNhbGx5LCBidXQgc29tZXRpbWVzIHNvbWUgZmlybXdhcmUgZG9lcyBub3QuCi0gICAgICovCi0gICAgcHJpdmF0ZSBpbnQgbU51bVN1cHBsaWNhbnRTdGF0ZUNoYW5nZXMgPSAwOwotCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiB3ZSByZWNlaXZlZCBhbiBldmVudCB0aGF0IHRoYXQgYSBwYXNzd29yZC1rZXkgbWF5IGJlIGluY29ycmVjdC4KLSAgICAgKiBJZiB0aGUgbmV4dCBpbmNvbWluZyBzdXBwbGljYW50IHN0YXRlIGNoYW5nZSBldmVudCBpcyBESVNDT05ORUNULAotICAgICAqIGJyb2FkY2FzdCBhIG1lc3NhZ2UgdGhhdCB3ZSBoYXZlIGEgcG9zc2libGUgcGFzc3dvcmQgZXJyb3IgYW5kIGRpc2FibGUKLSAgICAgKiB0aGUgbmV0d29yay4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gbVBhc3N3b3JkS2V5TWF5QmVJbmNvcnJlY3QgPSBmYWxzZTsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNVUFBMX1NDQU5fSEFORExJTkdfTk9STUFMID0gMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVVBQTF9TQ0FOX0hBTkRMSU5HX0xJU1RfT05MWSA9IDI7Ci0KLSAgICBwcml2YXRlIFdpZmlNb25pdG9yIG1XaWZpTW9uaXRvcjsKLSAgICBwcml2YXRlIFdpZmlJbmZvIG1XaWZpSW5mbzsKLSAgICBwcml2YXRlIExpc3Q8U2NhblJlc3VsdD4gbVNjYW5SZXN1bHRzOwotICAgIHByaXZhdGUgV2lmaU1hbmFnZXIgbVdNOwotICAgIHByaXZhdGUgYm9vbGVhbiBtSGF2ZUlwQWRkcmVzczsKLSAgICBwcml2YXRlIGJvb2xlYW4gbU9idGFpbmluZ0lwQWRkcmVzczsKLSAgICBwcml2YXRlIGJvb2xlYW4gbVRvcm5Eb3duQnlDb25uTWdyOwotICAgIC8qKgotICAgICAqIEEgRElTQ09OTkVDVCBldmVudCBoYXMgYmVlbiByZWNlaXZlZCwgYnV0IHByb2Nlc3NpbmcgaXQKLSAgICAgKiBpcyBiZWluZyBkZWZlcnJlZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gbURpc2Nvbm5lY3RQZW5kaW5nOwotICAgIC8qKgotICAgICAqIEFuIG9wZXJhdGlvbiBoYXMgYmVlbiBwZXJmb3JtZWQgYXMgYSByZXN1bHQgb2Ygd2hpY2ggd2UgZXhwZWN0IHRoZSBuZXh0IGV2ZW50Ci0gICAgICogd2lsbCBiZSBhIERJU0NPTk5FQ1QuCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIG1EaXNjb25uZWN0RXhwZWN0ZWQ7Ci0gICAgcHJpdmF0ZSBEaGNwSGFuZGxlciBtRGhjcFRhcmdldDsKLSAgICBwcml2YXRlIERoY3BJbmZvIG1EaGNwSW5mbzsKLSAgICBwcml2YXRlIGludCBtTGFzdFNpZ25hbExldmVsID0gLTE7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbUxhc3RCc3NpZDsKLSAgICBwcml2YXRlIFN0cmluZyBtTGFzdFNzaWQ7Ci0gICAgcHJpdmF0ZSBpbnQgbUxhc3ROZXR3b3JrSWQgPSAtMTsKLSAgICBwcml2YXRlIGJvb2xlYW4gbVVzZVN0YXRpY0lwID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBpbnQgbVJlY29ubmVjdENvdW50OwotCi0gICAgLyogVHJhY2tzIGlmIGFueSBuZXR3b3JrIGluIHRoZSBjb25maWd1cmF0aW9uIGlzIGRpc2FibGVkICovCi0gICAgcHJpdmF0ZSBBdG9taWNCb29sZWFuIG1Jc0FueU5ldHdvcmtEaXNhYmxlZCA9IG5ldyBBdG9taWNCb29sZWFuKGZhbHNlKTsKLQotICAgIC8vIHVzZWQgdG8gc3RvcmUgdGhlIChub24tcGVyc2lzdGVkKSBudW0gZGV0ZXJtaW5lZCBkdXJpbmcgZGV2aWNlIGJvb3QgCi0gICAgLy8gKGZyb20gbWNjIG9yIG90aGVyIHBob25lIGluZm8pIGJlZm9yZSB0aGUgZHJpdmVyIGlzIHN0YXJ0ZWQuCi0gICAgcHJpdmF0ZSBpbnQgbU51bUFsbG93ZWRDaGFubmVscyA9IDA7Ci0KLSAgICAvLyBWYXJpYWJsZXMgcmVsYXRpbmcgdG8gdGhlICdhdmFpbGFibGUgbmV0d29ya3MnIG5vdGlmaWNhdGlvbgotICAgIAotICAgIC8qKgotICAgICAqIFRoZSBpY29uIHRvIHNob3cgaW4gdGhlICdhdmFpbGFibGUgbmV0d29ya3MnIG5vdGlmaWNhdGlvbi4gVGhpcyB3aWxsIGFsc28KLSAgICAgKiBiZSB0aGUgSUQgb2YgdGhlIE5vdGlmaWNhdGlvbiBnaXZlbiB0byB0aGUgTm90aWZpY2F0aW9uTWFuYWdlci4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSUNPTl9ORVRXT1JLU19BVkFJTEFCTEUgPQotICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5kcmF3YWJsZS5zdGF0X25vdGlmeV93aWZpX2luX3JhbmdlOwotICAgIC8qKgotICAgICAqIFdoZW4gYSBub3RpZmljYXRpb24gaXMgc2hvd24sIHdlIHdhaXQgdGhpcyBhbW91bnQgYmVmb3JlIHBvc3NpYmx5IHNob3dpbmcgaXQgYWdhaW4uCi0gICAgICovCi0gICAgcHJpdmF0ZSBmaW5hbCBsb25nIE5PVElGSUNBVElPTl9SRVBFQVRfREVMQVlfTVM7Ci0gICAgLyoqCi0gICAgICogV2hldGhlciB0aGUgdXNlciBoYXMgc2V0IHRoZSBzZXR0aW5nIHRvIHNob3cgdGhlICdhdmFpbGFibGUgbmV0d29ya3MnIG5vdGlmaWNhdGlvbi4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gbU5vdGlmaWNhdGlvbkVuYWJsZWQ7Ci0gICAgLyoqCi0gICAgICogT2JzZXJ2ZXMgdGhlIHVzZXIgc2V0dGluZyB0byBrZWVwIHtAbGluayAjbU5vdGlmaWNhdGlvbkVuYWJsZWR9IGluIHN5bmMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBOb3RpZmljYXRpb25FbmFibGVkU2V0dGluZ09ic2VydmVyIG1Ob3RpZmljYXRpb25FbmFibGVkU2V0dGluZ09ic2VydmVyOwotICAgIC8qKgotICAgICAqIFRoZSB7QGxpbmsgU3lzdGVtI2N1cnJlbnRUaW1lTWlsbGlzKCl9IG11c3QgYmUgYXQgbGVhc3QgdGhpcyB2YWx1ZSBmb3IgdXMKLSAgICAgKiB0byBzaG93IHRoZSBub3RpZmljYXRpb24gYWdhaW4uCi0gICAgICovCi0gICAgcHJpdmF0ZSBsb25nIG1Ob3RpZmljYXRpb25SZXBlYXRUaW1lOwotICAgIC8qKgotICAgICAqIFRoZSBOb3RpZmljYXRpb24gb2JqZWN0IGdpdmVuIHRvIHRoZSBOb3RpZmljYXRpb25NYW5hZ2VyLgotICAgICAqLwotICAgIHByaXZhdGUgTm90aWZpY2F0aW9uIG1Ob3RpZmljYXRpb247Ci0gICAgLyoqCi0gICAgICogV2hldGhlciB0aGUgbm90aWZpY2F0aW9uIGlzIGJlaW5nIHNob3duLCBhcyBzZXQgYnkgdXMuIFRoYXQgaXMsIGlmIHRoZQotICAgICAqIHVzZXIgY2FuY2VscyB0aGUgbm90aWZpY2F0aW9uLCB3ZSB3aWxsIG5vdCByZWNlaXZlIHRoZSBjYWxsYmFjayBzbyB0aGlzCi0gICAgICogd2lsbCBzdGlsbCBiZSB0cnVlLiBXZSBvbmx5IGd1YXJhbnRlZSBpZiB0aGlzIGlzIGZhbHNlLCB0aGVuIHRoZQotICAgICAqIG5vdGlmaWNhdGlvbiBpcyBub3Qgc2hvd2luZy4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gbU5vdGlmaWNhdGlvblNob3duOwotICAgIC8qKgotICAgICAqIFRoZSBudW1iZXIgb2YgY29udGludW91cyBzY2FucyB0aGF0IG11c3Qgb2NjdXIgYmVmb3JlIGNvbnNpZGVyIHRoZQotICAgICAqIHN1cHBsaWNhbnQgaW4gYSBzY2FubmluZyBzdGF0ZS4gVGhpcyBhbGxvd3Mgc3VwcGxpY2FudCB0byBhc3NvY2lhdGUgd2l0aAotICAgICAqIHJlbWVtYmVyZWQgbmV0d29ya3MgdGhhdCBhcmUgaW4gdGhlIHNjYW4gcmVzdWx0cy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTlVNX1NDQU5TX0JFRk9SRV9BQ1RVQUxMWV9TQ0FOTklORyA9IDM7Ci0gICAgLyoqCi0gICAgICogVGhlIG51bWJlciBvZiBzY2FucyBzaW5jZSB0aGUgbGFzdCBuZXR3b3JrIHN0YXRlIGNoYW5nZS4gV2hlbiB0aGlzCi0gICAgICogZXhjZWVkcyB7QGxpbmsgI05VTV9TQ0FOU19CRUZPUkVfQUNUVUFMTFlfU0NBTk5JTkd9LCB3ZSBjb25zaWRlciB0aGUKLSAgICAgKiBzdXBwbGljYW50IHRvIGFjdHVhbGx5IGJlIHNjYW5uaW5nLiBXaGVuIHRoZSBuZXR3b3JrIHN0YXRlIGNoYW5nZXMgdG8KLSAgICAgKiBzb21ldGhpbmcgb3RoZXIgdGhhbiBzY2FubmluZywgd2UgcmVzZXQgdGhpcyB0byAwLgotICAgICAqLwotICAgIHByaXZhdGUgaW50IG1OdW1TY2Fuc1NpbmNlTmV0d29ya1N0YXRlQ2hhbmdlOwotICAgIC8qKgotICAgICAqIE9ic2VydmVzIHRoZSBzdGF0aWMgSVAgYWRkcmVzcyBzZXR0aW5ncy4KLSAgICAgKi8KLSAgICBwcml2YXRlIFNldHRpbmdzT2JzZXJ2ZXIgbVNldHRpbmdzT2JzZXJ2ZXI7Ci0gICAgCi0gICAgcHJpdmF0ZSBib29sZWFuIG1Jc1NjYW5Nb2RlQWN0aXZlOwotICAgIHByaXZhdGUgYm9vbGVhbiBtRW5hYmxlUnNzaVBvbGxpbmc7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1Jc0hpZ2hQZXJmRW5hYmxlZDsKLSAgICBwcml2YXRlIGludCBtUG93ZXJNb2RlUmVmQ291bnQgPSAwOwotICAgIHByaXZhdGUgaW50IG1PcHRpbWl6YXRpb25zRGlzYWJsZWRSZWZDb3VudCA9IDA7Ci0KLSAgICAvKioKLSAgICAgKiBPbmUgb2YgIHtAbGluayBXaWZpTWFuYWdlciNXSUZJX1NUQVRFX0RJU0FCTEVEfSwKLSAgICAgKiAgICAgICAgIHtAbGluayBXaWZpTWFuYWdlciNXSUZJX1NUQVRFX0RJU0FCTElOR30sCi0gICAgICogICAgICAgICB7QGxpbmsgV2lmaU1hbmFnZXIjV0lGSV9TVEFURV9FTkFCTEVEfSwKLSAgICAgKiAgICAgICAgIHtAbGluayBXaWZpTWFuYWdlciNXSUZJX1NUQVRFX0VOQUJMSU5HfSwKLSAgICAgKiAgICAgICAgIHtAbGluayBXaWZpTWFuYWdlciNXSUZJX1NUQVRFX1VOS05PV059Ci0gICAgICoKLSAgICAgKiBnZXRXaWZpU3RhdGUoKSBpcyBub3Qgc3luY2hyb25pemVkIHRvIG1ha2Ugc3VyZSBpdCdzIGFsd2F5cyBmYXN0LAotICAgICAqIGV2ZW4gd2hlbiB0aGUgaW5zdGFuY2UgbG9jayBpcyBoZWxkIG9uIG90aGVyIHNsb3cgb3BlcmF0aW9ucy4KLSAgICAgKiBVc2UgYSBhdG9taWMgdmFyaWFibGUgZm9yIHN0YXRlLgotICAgICAqLwotICAgIHByaXZhdGUgZmluYWwgQXRvbWljSW50ZWdlciBtV2lmaVN0YXRlID0gbmV3IEF0b21pY0ludGVnZXIoV0lGSV9TVEFURV9VTktOT1dOKTsKLQotICAgIC8vIFdpLUZpIHJ1biBzdGF0ZXM6Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJVTl9TVEFURV9TVEFSVElORyA9IDE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJVTl9TVEFURV9SVU5OSU5HICA9IDI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJVTl9TVEFURV9TVE9QUElORyA9IDM7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJVTl9TVEFURV9TVE9QUEVEICA9IDQ7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgbVJ1blN0YXRlTmFtZXNbXSA9IHsKLSAgICAgICAgICAgICJTdGFydGluZyIsCi0gICAgICAgICAgICAiUnVubmluZyIsCi0gICAgICAgICAgICAiU3RvcHBpbmciLAotICAgICAgICAgICAgIlN0b3BwZWQiCi0gICAgfTsKLSAgICBwcml2YXRlIGludCBtUnVuU3RhdGU7Ci0KLSAgICBwcml2YXRlIGZpbmFsIElCYXR0ZXJ5U3RhdHMgbUJhdHRlcnlTdGF0czsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBtSXNTY2FuT25seTsKLQotICAgIHByaXZhdGUgQmx1ZXRvb3RoQTJkcCBtQmx1ZXRvb3RoQTJkcDsKLQotICAgIHByaXZhdGUgU3RyaW5nIG1JbnRlcmZhY2VOYW1lOwotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBMUyA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsKLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZ1tdIHNEbnNQcm9wTmFtZXM7Ci0gICAgcHJpdmF0ZSBSdW5uYWJsZSBtUmVsZWFzZVdha2VMb2NrQ2FsbGJhY2s7Ci0KLSAgICAvKioKLSAgICAgKiBBIHN0cnVjdHVyZSBmb3Igc3VwcGx5aW5nIGluZm9ybWF0aW9uIGFib3V0IGEgc3VwcGxpY2FudCBzdGF0ZQotICAgICAqIGNoYW5nZSBpbiB0aGUgU1RBVEVfQ0hBTkdFIGV2ZW50IG1lc3NhZ2UgdGhhdCBjb21lcyBmcm9tIHRoZQotICAgICAqIFdpZmlNb25pdG9yCi0gICAgICogdGhyZWFkLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFN1cHBsaWNhbnRTdGF0ZUNoYW5nZVJlc3VsdCB7Ci0gICAgICAgIFN1cHBsaWNhbnRTdGF0ZUNoYW5nZVJlc3VsdChpbnQgbmV0d29ya0lkLCBTdHJpbmcgQlNTSUQsIFN1cHBsaWNhbnRTdGF0ZSBzdGF0ZSkgewotICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IHN0YXRlOwotICAgICAgICAgICAgdGhpcy5CU1NJRCA9IEJTU0lEOwotICAgICAgICAgICAgdGhpcy5uZXR3b3JrSWQgPSBuZXR3b3JrSWQ7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IG5ldHdvcmtJZDsKLSAgICAgICAgU3RyaW5nIEJTU0lEOwotICAgICAgICBTdXBwbGljYW50U3RhdGUgc3RhdGU7CisgICAgcHVibGljIGJvb2xlYW4gaXNUZWFyZG93blJlcXVlc3RlZCgpIHsKKyAgICAgICAgcmV0dXJuIG1UZWFyZG93blJlcXVlc3RlZC5nZXQoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBBIHN0cnVjdHVyZSBmb3Igc3VwcGx5aW5nIGluZm9ybWF0aW9uIGFib3V0IGEgY29ubmVjdGlvbiBpbgotICAgICAqIHRoZSBDT05ORUNURUQgZXZlbnQgbWVzc2FnZSB0aGF0IGNvbWVzIGZyb20gdGhlIFdpZmlNb25pdG9yCi0gICAgICogdGhyZWFkLgorICAgICAqIEJlZ2luIG1vbml0b3Jpbmcgd2lmaSBjb25uZWN0aXZpdHkKICAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBOZXR3b3JrU3RhdGVDaGFuZ2VSZXN1bHQgewotICAgICAgICBOZXR3b3JrU3RhdGVDaGFuZ2VSZXN1bHQoRGV0YWlsZWRTdGF0ZSBzdGF0ZSwgU3RyaW5nIEJTU0lELCBpbnQgbmV0d29ya0lkKSB7Ci0gICAgICAgICAgICB0aGlzLnN0YXRlID0gc3RhdGU7Ci0gICAgICAgICAgICB0aGlzLkJTU0lEID0gQlNTSUQ7Ci0gICAgICAgICAgICB0aGlzLm5ldHdvcmtJZCA9IG5ldHdvcmtJZDsKLSAgICAgICAgfQotICAgICAgICBEZXRhaWxlZFN0YXRlIHN0YXRlOwotICAgICAgICBTdHJpbmcgQlNTSUQ7Ci0gICAgICAgIGludCBuZXR3b3JrSWQ7Ci0gICAgfQorICAgIHB1YmxpYyB2b2lkIHN0YXJ0TW9uaXRvcmluZyhDb250ZXh0IGNvbnRleHQsIEhhbmRsZXIgdGFyZ2V0KSB7CisgICAgICAgIG1Dc0hhbmRsZXIgPSB0YXJnZXQ7CisgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKIAotICAgIHB1YmxpYyBXaWZpU3RhdGVUcmFja2VyKENvbnRleHQgY29udGV4dCwgSGFuZGxlciB0YXJnZXQpIHsKLSAgICAgICAgc3VwZXIoY29udGV4dCwgdGFyZ2V0LCBDb25uZWN0aXZpdHlNYW5hZ2VyLlRZUEVfV0lGSSwgMCwgIldJRkkiLCAiIik7Ci0gICAgICAgIAotICAgICAgICBtV2lmaUluZm8gPSBuZXcgV2lmaUluZm8oKTsKLSAgICAgICAgbVdpZmlNb25pdG9yID0gbmV3IFdpZmlNb25pdG9yKHRoaXMpOwotICAgICAgICBtSGF2ZUlwQWRkcmVzcyA9IGZhbHNlOwotICAgICAgICBtT2J0YWluaW5nSXBBZGRyZXNzID0gZmFsc2U7Ci0gICAgICAgIHNldFRvcm5Eb3duQnlDb25uTWdyKGZhbHNlKTsKLSAgICAgICAgbURpc2Nvbm5lY3RQZW5kaW5nID0gZmFsc2U7Ci0gICAgICAgIG1TY2FuUmVzdWx0cyA9IG5ldyBBcnJheUxpc3Q8U2NhblJlc3VsdD4oKTsKLSAgICAgICAgLy8gQWxsb2NhdGUgREhDUCBpbmZvIG9iamVjdCBvbmNlLCBhbmQgZmlsbCBpdCBpbiBvbiBlYWNoIHJlcXVlc3QKLSAgICAgICAgbURoY3BJbmZvID0gbmV3IERoY3BJbmZvKCk7Ci0gICAgICAgIG1SdW5TdGF0ZSA9IFJVTl9TVEFURV9TVEFSVElORzsKKyAgICAgICAgbVdpZmlNYW5hZ2VyID0gKFdpZmlNYW5hZ2VyKSBtQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuV0lGSV9TRVJWSUNFKTsKKyAgICAgICAgSW50ZW50RmlsdGVyIGZpbHRlciA9IG5ldyBJbnRlbnRGaWx0ZXIoKTsKKyAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihXaWZpTWFuYWdlci5XSUZJX1NUQVRFX0NIQU5HRURfQUNUSU9OKTsKKyAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihXaWZpTWFuYWdlci5ORVRXT1JLX1NUQVRFX0NIQU5HRURfQUNUSU9OKTsKKyAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihXaWZpTWFuYWdlci5DT05GSUdfQ0hBTkdFRF9BQ1RJT04pOworICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKFdpZmlNYW5hZ2VyLlNDQU5fUkVTVUxUU19BVkFJTEFCTEVfQUNUSU9OKTsKIAotICAgICAgICAvLyBTZXR0aW5nIGlzIGluIHNlY29uZHMKLSAgICAgICAgTk9USUZJQ0FUSU9OX1JFUEVBVF9ERUxBWV9NUyA9IFNldHRpbmdzLlNlY3VyZS5nZXRJbnQoY29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwgCi0gICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLldJRklfTkVUV09SS1NfQVZBSUxBQkxFX1JFUEVBVF9ERUxBWSwgOTAwKSAqIDEwMDBsOwotICAgICAgICBtTm90aWZpY2F0aW9uRW5hYmxlZFNldHRpbmdPYnNlcnZlciA9IG5ldyBOb3RpZmljYXRpb25FbmFibGVkU2V0dGluZ09ic2VydmVyKG5ldyBIYW5kbGVyKCkpOwotICAgICAgICBtTm90aWZpY2F0aW9uRW5hYmxlZFNldHRpbmdPYnNlcnZlci5yZWdpc3RlcigpOwotCi0gICAgICAgIG1TZXR0aW5nc09ic2VydmVyID0gbmV3IFNldHRpbmdzT2JzZXJ2ZXIobmV3IEhhbmRsZXIoKSk7Ci0KLSAgICAgICAgbUludGVyZmFjZU5hbWUgPSBTeXN0ZW1Qcm9wZXJ0aWVzLmdldCgid2lmaS5pbnRlcmZhY2UiLCAidGl3bGFuMCIpOwotICAgICAgICBzRG5zUHJvcE5hbWVzID0gbmV3IFN0cmluZ1tdIHsKLSAgICAgICAgICAgICJkaGNwLiIgKyBtSW50ZXJmYWNlTmFtZSArICIuZG5zMSIsCi0gICAgICAgICAgICAiZGhjcC4iICsgbUludGVyZmFjZU5hbWUgKyAiLmRuczIiCi0gICAgICAgIH07Ci0gICAgICAgIG1CYXR0ZXJ5U3RhdHMgPSBJQmF0dGVyeVN0YXRzLlN0dWIuYXNJbnRlcmZhY2UoU2VydmljZU1hbmFnZXIuZ2V0U2VydmljZSgiYmF0dGVyeWluZm8iKSk7Ci0KKyAgICAgICAgbVdpZmlTdGF0ZVJlY2VpdmVyID0gbmV3IFdpZmlTdGF0ZVJlY2VpdmVyKCk7CisgICAgICAgIG1Db250ZXh0LnJlZ2lzdGVyUmVjZWl2ZXIobVdpZmlTdGF0ZVJlY2VpdmVyLCBmaWx0ZXIpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEhlbHBlciBtZXRob2Q6IHNldHMgdGhlIHN1cHBsaWNhbnQgc3RhdGUgYW5kIGtlZXBzIHRoZSBuZXR3b3JrCi0gICAgICogaW5mbyB1cGRhdGVkLgotICAgICAqIEBwYXJhbSBzdGF0ZSB0aGUgbmV3IHN0YXRlCisgICAgICogRGlzYWJsZSBjb25uZWN0aXZpdHkgdG8gYSBuZXR3b3JrCisgICAgICogVE9ETzogZG8gYXdheSB3aXRoIHJldHVybiB2YWx1ZSBhZnRlciBtYWtpbmcgTW9iaWxlRGF0YVN0YXRlVHJhY2tlciBhc3luYwogICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzZXRTdXBwbGljYW50U3RhdGUoU3VwcGxpY2FudFN0YXRlIHN0YXRlKSB7Ci0gICAgICAgIG1XaWZpSW5mby5zZXRTdXBwbGljYW50U3RhdGUoc3RhdGUpOwotICAgICAgICB1cGRhdGVOZXR3b3JrSW5mbygpOwotICAgICAgICBjaGVja1BvbGxUaW1lcigpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdXBwbGljYW50U3RhdGUgZ2V0U3VwcGxpY2FudFN0YXRlKCkgewotICAgICAgICByZXR1cm4gbVdpZmlJbmZvLmdldFN1cHBsaWNhbnRTdGF0ZSgpOworICAgIHB1YmxpYyBib29sZWFuIHRlYXJkb3duKCkgeworICAgICAgICBtVGVhcmRvd25SZXF1ZXN0ZWQuc2V0KHRydWUpOworICAgICAgICBtV2lmaU1hbmFnZXIuc3RvcFdpZmkoKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogSGVscGVyIG1ldGhvZDogc2V0cyB0aGUgc3VwcGxpY2FudCBzdGF0ZSBhbmQga2VlcHMgdGhlIG5ldHdvcmsKLSAgICAgKiBpbmZvIHVwZGF0ZWQgKHN0cmluZyB2ZXJzaW9uKS4KLSAgICAgKiBAcGFyYW0gc3RhdGVOYW1lIHRoZSBzdHJpbmcgbmFtZSBvZiB0aGUgbmV3IHN0YXRlCisgICAgICogUmUtZW5hYmxlIGNvbm5lY3Rpdml0eSB0byBhIG5ldHdvcmsgYWZ0ZXIgYSB7QGxpbmsgI3RlYXJkb3duKCl9LgorICAgICAqIFRPRE86IGRvIGF3YXkgd2l0aCByZXR1cm4gdmFsdWUgYWZ0ZXIgbWFraW5nIE1vYmlsZURhdGFTdGF0ZVRyYWNrZXIgYXN5bmMKICAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2V0U3VwcGxpY2FudFN0YXRlKFN0cmluZyBzdGF0ZU5hbWUpIHsKLSAgICAgICAgbVdpZmlJbmZvLnNldFN1cHBsaWNhbnRTdGF0ZShzdGF0ZU5hbWUpOwotICAgICAgICB1cGRhdGVOZXR3b3JrSW5mbygpOwotICAgICAgICBjaGVja1BvbGxUaW1lcigpOworICAgIHB1YmxpYyBib29sZWFuIHJlY29ubmVjdCgpIHsKKyAgICAgICAgbVRlYXJkb3duUmVxdWVzdGVkLnNldChmYWxzZSk7CisgICAgICAgIG1XaWZpTWFuYWdlci5zdGFydFdpZmkoKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogSGVscGVyIG1ldGhvZDogc2V0cyB0aGUgYm9vbGVhbiBpbmRpY2F0aW5nIHRoYXQgdGhlIGNvbm5lY3Rpb24KLSAgICAgKiBtYW5hZ2VyIGFza2VkIHRoZSBuZXR3b3JrIHRvIGJlIHRvcm4gZG93biAoYW5kIHNvIG9ubHkgdGhlIGNvbm5lY3Rpb24KLSAgICAgKiBtYW5hZ2VyIGNhbiBzZXQgaXQgdXAgYWdhaW4pLgotICAgICAqIG5ldHdvcmsgaW5mbyB1cGRhdGVkLgotICAgICAqIEBwYXJhbSBmbGFnIHtAY29kZSB0cnVlfSBpZiBleHBsaWNpdGx5IGRpc2FibGVkLgorICAgICAqIFR1cm4gdGhlIHdpcmVsZXNzIHJhZGlvIG9mZiBmb3IgYSBuZXR3b3JrLgorICAgICAqIEBwYXJhbSB0dXJuT24ge0Bjb2RlIHRydWV9IHRvIHR1cm4gdGhlIHJhZGlvIG9uLCB7QGNvZGUgZmFsc2V9CisgICAgICogVE9ETzogZG8gYXdheSB3aXRoIHJldHVybiB2YWx1ZSBhZnRlciBtYWtpbmcgTW9iaWxlRGF0YVN0YXRlVHJhY2tlciBhc3luYwogICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzZXRUb3JuRG93bkJ5Q29ubk1ncihib29sZWFuIGZsYWcpIHsKLSAgICAgICAgbVRvcm5Eb3duQnlDb25uTWdyID0gZmxhZzsKLSAgICAgICAgdXBkYXRlTmV0d29ya0luZm8oKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIElQIGFkZHJlc3NlcyBvZiB0aGUgRE5TIHNlcnZlcnMgYXZhaWxhYmxlIGZvciB0aGUgV0xBTgotICAgICAqIG5ldHdvcmsgaW50ZXJmYWNlLgotICAgICAqIEByZXR1cm4gYSBsaXN0IG9mIEROUyBhZGRyZXNzZXMsIHdpdGggbm8gaG9sZXMuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZ1tdIGdldE5hbWVTZXJ2ZXJzKCkgewotICAgICAgICByZXR1cm4gZ2V0TmFtZVNlcnZlckxpc3Qoc0Ruc1Byb3BOYW1lcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBuYW1lIG9mIG91ciBXTEFOIG5ldHdvcmsgaW50ZXJmYWNlLgotICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2Ygb3VyIGludGVyZmFjZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEludGVyZmFjZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBtSW50ZXJmYWNlTmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIHN5c3RlbSBwcm9wZXJ0aWVzIG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoZSB0Y3AgYnVmZmVyIHNpemVzCi0gICAgICogZm9yIHRoaXMgbmV0d29yay4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRjcEJ1ZmZlclNpemVzUHJvcE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiAibmV0LnRjcC5idWZmZXJzaXplLndpZmkiOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHN0YXJ0TW9uaXRvcmluZygpIHsKLSAgICAgICAgLyoKLSAgICAgICAgICogR2V0IGEgaGFuZGxlIG9uIHRoZSBXaWZpTWFuYWdlci4gVGhpcyBjYW5ub3QgYmUgZG9uZSBpbiBvdXIKLSAgICAgICAgICogY29uc3RydWN0b3IsIGJlY2F1c2UgdGhlIFdpZmkgc2VydmljZSBpcyBub3QgeWV0IHJlZ2lzdGVyZWQuCi0gICAgICAgICAqLwotICAgICAgICBtV00gPSAoV2lmaU1hbmFnZXIpbUNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LldJRklfU0VSVklDRSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc3RhcnRFdmVudExvb3AoKSB7Ci0gICAgICAgIG1XaWZpTW9uaXRvci5zdGFydE1vbml0b3JpbmcoKTsKKyAgICBwdWJsaWMgYm9vbGVhbiBzZXRSYWRpbyhib29sZWFuIHR1cm5PbikgeworICAgICAgICBtV2lmaU1hbmFnZXIuc2V0V2lmaUVuYWJsZWQodHVybk9uKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCiAgICAgLyoqCkBAIC00NzEsMjE3MiArMTMxLDExOCBAQAogICAgICAqIHVuYXZhaWxhYmxlLgogICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIFdpLUZpIGNvbm5lY3Rpb25zIGFyZSBwb3NzaWJsZQogICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBpc0F2YWlsYWJsZSgpIHsKLSAgICAgICAgLyoKLSAgICAgICAgICogVE9ETzogTmVlZCB0byBhbHNvIGxvb2sgYXQgc2NhbiByZXN1bHRzIHRvIHNlZSB3aGV0aGVyIHdlJ3JlCi0gICAgICAgICAqIGluIHJhbmdlIG9mIGFueSBhY2Nlc3MgcG9pbnRzLiBJZiB3ZSBoYXZlIHNjYW4gcmVzdWx0cyB0aGF0Ci0gICAgICAgICAqIGFyZSBubyBtb3JlIHRoYW4gTiBzZWNvbmRzIG9sZCwgdXNlIHRob3NlLCBvdGhlcndpc2UsIGluaXRpYXRlCi0gICAgICAgICAqIGEgc2NhbiBhbmQgd2FpdCBmb3IgdGhlIHJlc3VsdHMuIFRoaXMgb25seSBtYXR0ZXJzIGlmIHdlCi0gICAgICAgICAqIGFsbG93IG1vYmlsZSB0byBiZSB0aGUgcHJlZmVycmVkIG5ldHdvcmsuCi0gICAgICAgICAqLwotICAgICAgICBTdXBwbGljYW50U3RhdGUgc3VwcFN0YXRlID0gbVdpZmlJbmZvLmdldFN1cHBsaWNhbnRTdGF0ZSgpOwotICAgICAgICByZXR1cm4gc3VwcFN0YXRlICE9IFN1cHBsaWNhbnRTdGF0ZS5VTklOSVRJQUxJWkVEICYmCi0gICAgICAgICAgICAgICAgc3VwcFN0YXRlICE9IFN1cHBsaWNhbnRTdGF0ZS5JTkFDVElWRSAmJgotICAgICAgICAgICAgICAgIChtVG9ybkRvd25CeUNvbm5NZ3IgfHwgIWlzRHJpdmVyU3RvcHBlZCgpKTsKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0F2YWlsYWJsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1OZXR3b3JrSW5mby5pc0F2YWlsYWJsZSgpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKiBUaGVyZSBhcmUgY3VycmVudGx5IG5vIGRlZmluZWQgV2ktRmkgc3VidHlwZXMuCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXROZXR3b3JrU3VidHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSGVscGVyIG1ldGhvZDogdXBkYXRlcyB0aGUgbmV0d29yayBpbmZvIG9iamVjdCB0byBrZWVwIGl0IGluIHN5bmMgd2l0aAotICAgICAqIHRoZSBXaS1GaSBzdGF0ZSB0cmFja2VyLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVOZXR3b3JrSW5mbygpIHsKLSAgICAgICAgbU5ldHdvcmtJbmZvLnNldElzQXZhaWxhYmxlKGlzQXZhaWxhYmxlKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlcG9ydCB3aGV0aGVyIHRoZSBXaS1GaSBjb25uZWN0aW9uIGlzIGZ1bGx5IGNvbmZpZ3VyZWQgZm9yIGRhdGEuCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHtAbGluayBTdXBwbGljYW50U3RhdGV9IGlzCi0gICAgICoge0BsaW5rIGFuZHJvaWQubmV0LndpZmkuU3VwcGxpY2FudFN0YXRlI0NPTVBMRVRFRCBDT01QTEVURUR9LgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzQ29ubmVjdGlvbkNvbXBsZXRlZCgpIHsKLSAgICAgICAgcmV0dXJuIG1XaWZpSW5mby5nZXRTdXBwbGljYW50U3RhdGUoKSA9PSBTdXBwbGljYW50U3RhdGUuQ09NUExFVEVEOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlcG9ydCB3aGV0aGVyIHRoZSBXaS1GaSBjb25uZWN0aW9uIGhhcyBzdWNjZXNzZnVsbHkgYWNxdWlyZWQgYW4gSVAgYWRkcmVzcy4KLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgV2ktRmkgY29ubmVjdGlvbiBoYXMgYmVlbiBhc3NpZ25lZCBhbiBJUCBhZGRyZXNzLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGhhc0lwQWRkcmVzcygpIHsKLSAgICAgICAgcmV0dXJuIG1IYXZlSXBBZGRyZXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlbmQgdGhlIHRyYWNrZXIgYSBub3RpZmljYXRpb24gdGhhdCBhIHVzZXItZW50ZXJlZCBwYXNzd29yZCBrZXkKLSAgICAgKiBtYXkgYmUgaW5jb3JyZWN0IChpLmUuLCBjYXVzZWQgYXV0aGVudGljYXRpb24gdG8gZmFpbCkuCi0gICAgICovCi0gICAgdm9pZCBub3RpZnlQYXNzd29yZEtleU1heUJlSW5jb3JyZWN0KCkgewotICAgICAgICBzZW5kRW1wdHlNZXNzYWdlKEVWRU5UX1BBU1NXT1JEX0tFWV9NQVlfQkVfSU5DT1JSRUNUKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZW5kIHRoZSB0cmFja2VyIGEgbm90aWZpY2F0aW9uIHRoYXQgYSBjb25uZWN0aW9uIHRvIHRoZSBzdXBwbGljYW50Ci0gICAgICogZGFlbW9uIGhhcyBiZWVuIGVzdGFibGlzaGVkLgotICAgICAqLwotICAgIHZvaWQgbm90aWZ5U3VwcGxpY2FudENvbm5lY3Rpb24oKSB7Ci0gICAgICAgIHNlbmRFbXB0eU1lc3NhZ2UoRVZFTlRfU1VQUExJQ0FOVF9DT05ORUNUSU9OKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZW5kIHRoZSB0cmFja2VyIGEgbm90aWZpY2F0aW9uIHRoYXQgdGhlIHN0YXRlIG9mIHRoZSBzdXBwbGljYW50Ci0gICAgICogaGFzIGNoYW5nZWQuCi0gICAgICogQHBhcmFtIG5ldHdvcmtJZCB0aGUgY29uZmlndXJlZCBuZXR3b3JrIG9uIHdoaWNoIHRoZSBzdGF0ZSBjaGFuZ2Ugb2NjdXJyZWQKLSAgICAgKiBAcGFyYW0gbmV3U3RhdGUgdGhlIG5ldyB7QGNvZGUgU3VwcGxpY2FudFN0YXRlfQotICAgICAqLwotICAgIHZvaWQgbm90aWZ5U3RhdGVDaGFuZ2UoaW50IG5ldHdvcmtJZCwgU3RyaW5nIEJTU0lELCBTdXBwbGljYW50U3RhdGUgbmV3U3RhdGUpIHsKLSAgICAgICAgTWVzc2FnZSBtc2cgPSBNZXNzYWdlLm9idGFpbigKLSAgICAgICAgICAgIHRoaXMsIEVWRU5UX1NVUFBMSUNBTlRfU1RBVEVfQ0hBTkdFRCwKLSAgICAgICAgICAgIG5ldyBTdXBwbGljYW50U3RhdGVDaGFuZ2VSZXN1bHQobmV0d29ya0lkLCBCU1NJRCwgbmV3U3RhdGUpKTsKLSAgICAgICAgbXNnLnNlbmRUb1RhcmdldCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlbmQgdGhlIHRyYWNrZXIgYSBub3RpZmljYXRpb24gdGhhdCB0aGUgc3RhdGUgb2YgV2lmaSBjb25uZWN0aXZpdHkKLSAgICAgKiBoYXMgY2hhbmdlZC4KLSAgICAgKiBAcGFyYW0gbmV0d29ya0lkIHRoZSBjb25maWd1cmVkIG5ldHdvcmsgb24gd2hpY2ggdGhlIHN0YXRlIGNoYW5nZSBvY2N1cnJlZAotICAgICAqIEBwYXJhbSBuZXdTdGF0ZSB0aGUgbmV3IG5ldHdvcmsgc3RhdGUKLSAgICAgKiBAcGFyYW0gQlNTSUQgd2hlbiB0aGUgbmV3IHN0YXRlIGlzIHtAbGluayBEZXRhaWxlZFN0YXRlI0NPTk5FQ1RFRAotICAgICAqIE5ldHdvcmtJbmZvLkRldGFpbGVkU3RhdGUuQ09OTkVDVEVEfSwKLSAgICAgKiB0aGlzIGlzIHRoZSBNQUMgYWRkcmVzcyBvZiB0aGUgYWNjZXNzIHBvaW50LiBPdGhlcndpc2UsIGl0Ci0gICAgICogaXMge0Bjb2RlIG51bGx9LgotICAgICAqLwotICAgIHZvaWQgbm90aWZ5U3RhdGVDaGFuZ2UoRGV0YWlsZWRTdGF0ZSBuZXdTdGF0ZSwgU3RyaW5nIEJTU0lELCBpbnQgbmV0d29ya0lkKSB7Ci0gICAgICAgIE1lc3NhZ2UgbXNnID0gTWVzc2FnZS5vYnRhaW4oCi0gICAgICAgICAgICB0aGlzLCBFVkVOVF9ORVRXT1JLX1NUQVRFX0NIQU5HRUQsCi0gICAgICAgICAgICBuZXcgTmV0d29ya1N0YXRlQ2hhbmdlUmVzdWx0KG5ld1N0YXRlLCBCU1NJRCwgbmV0d29ya0lkKSk7Ci0gICAgICAgIG1zZy5zZW5kVG9UYXJnZXQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZW5kIHRoZSB0cmFja2VyIGEgbm90aWZpY2F0aW9uIHRoYXQgYSBzY2FuIGhhcyBjb21wbGV0ZWQsIGFuZCByZXN1bHRzCi0gICAgICogYXJlIGF2YWlsYWJsZS4KLSAgICAgKi8KLSAgICB2b2lkIG5vdGlmeVNjYW5SZXN1bHRzQXZhaWxhYmxlKCkgewotICAgICAgICAvLyByZXNldCB0aGUgc3VwcGxpY2FudCdzIGhhbmRsaW5nIG9mIHNjYW4gcmVzdWx0cyB0byAibm9ybWFsIiBtb2RlCi0gICAgICAgIHNldFNjYW5SZXN1bHRIYW5kbGluZyhTVVBQTF9TQ0FOX0hBTkRMSU5HX05PUk1BTCk7Ci0gICAgICAgIHNlbmRFbXB0eU1lc3NhZ2UoRVZFTlRfU0NBTl9SRVNVTFRTX0FWQUlMQUJMRSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VuZCB0aGUgdHJhY2tlciBhIG5vdGlmaWNhdGlvbiB0aGF0IHdlIGNhbiBubyBsb25nZXIgY29tbXVuaWNhdGUgd2l0aAotICAgICAqIHRoZSBzdXBwbGljYW50IGRhZW1vbi4KLSAgICAgKi8KLSAgICB2b2lkIG5vdGlmeVN1cHBsaWNhbnRMb3N0KCkgewotICAgICAgICBzZW5kRW1wdHlNZXNzYWdlKEVWRU5UX1NVUFBMSUNBTlRfRElTQ09OTkVDVCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VuZCB0aGUgdHJhY2tlciBhIG5vdGlmaWNhdGlvbiB0aGF0IHRoZSBXaS1GaSBkcml2ZXIgaGFzIGJlZW4gc3RvcHBlZC4KLSAgICAgKi8KLSAgICB2b2lkIG5vdGlmeURyaXZlclN0b3BwZWQoKSB7Ci0gICAgICAgIG1SdW5TdGF0ZSA9IFJVTl9TVEFURV9TVE9QUEVEOwotCi0gICAgICAgIC8vIFNlbmQgYSBkcml2ZXIgc3RvcHBlZCBtZXNzYWdlIHRvIG91ciBoYW5kbGVyCi0gICAgICAgIE1lc3NhZ2Uub2J0YWluKHRoaXMsIEVWRU5UX0RSSVZFUl9TVEFURV9DSEFOR0VELCBEUklWRVJfU1RPUFBFRCwgMCkuc2VuZFRvVGFyZ2V0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VuZCB0aGUgdHJhY2tlciBhIG5vdGlmaWNhdGlvbiB0aGF0IHRoZSBXaS1GaSBkcml2ZXIgaGFzIGJlZW4gcmVzdGFydGVkIGFmdGVyCi0gICAgICogaGF2aW5nIGJlZW4gc3RvcHBlZC4KLSAgICAgKi8KLSAgICB2b2lkIG5vdGlmeURyaXZlclN0YXJ0ZWQoKSB7Ci0gICAgICAgIC8vIFNlbmQgYSBkcml2ZXIgc3RhcnRlZCBtZXNzYWdlIHRvIG91ciBoYW5kbGVyCi0gICAgICAgIE1lc3NhZ2Uub2J0YWluKHRoaXMsIEVWRU5UX0RSSVZFUl9TVEFURV9DSEFOR0VELCBEUklWRVJfU1RBUlRFRCwgMCkuc2VuZFRvVGFyZ2V0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VuZCB0aGUgdHJhY2tlciBhIG5vdGlmaWNhdGlvbiB0aGF0IHRoZSBXaS1GaSBkcml2ZXIgaGFzIGh1bmcgYW5kIG5lZWRzIHJlc3RhcnRpbmcuCi0gICAgICovCi0gICAgdm9pZCBub3RpZnlEcml2ZXJIdW5nKCkgewotICAgICAgICAvLyBTZW5kIGEgZHJpdmVyIGhhbmdlZCBtZXNzYWdlIHRvIG91ciBoYW5kbGVyCi0gICAgICAgIE1lc3NhZ2Uub2J0YWluKHRoaXMsIEVWRU5UX0RSSVZFUl9TVEFURV9DSEFOR0VELCBEUklWRVJfSFVORywgMCkuc2VuZFRvVGFyZ2V0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBpbnRlcnZhbCB0aW1lciBmb3IgcG9sbGluZyBjb25uZWN0aW9uIGluZm9ybWF0aW9uCi0gICAgICogdGhhdCBpcyBub3QgZGVsaXZlcmVkIGFzeW5jaHJvbm91c2x5LgotICAgICAqLwotICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgY2hlY2tQb2xsVGltZXIoKSB7Ci0gICAgICAgIGlmIChtRW5hYmxlUnNzaVBvbGxpbmcgJiYKLSAgICAgICAgICAgICAgICBtV2lmaUluZm8uZ2V0U3VwcGxpY2FudFN0YXRlKCkgPT0gU3VwcGxpY2FudFN0YXRlLkNPTVBMRVRFRCAmJgotICAgICAgICAgICAgICAgICFoYXNNZXNzYWdlcyhFVkVOVF9QT0xMX0lOVEVSVkFMKSkgewotICAgICAgICAgICAgc2VuZEVtcHR5TWVzc2FnZURlbGF5ZWQoRVZFTlRfUE9MTF9JTlRFUlZBTCwgUE9MTF9TVEFUVVNfSU5URVJWQUxfTVNFQ1MpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVE9ETzogbVJ1blN0YXRlIGlzIG5vdCBzeW5jaHJvbml6ZWQgaW4gc29tZSBwbGFjZXMKLSAgICAgKiBhZGRyZXNzIHRoaXMgYXMgcGFydCBvZiByZS1hcmNoaXRlY3QuCi0gICAgICoKLSAgICAgKiBUT0RPOiBXZSBhcmUgZXhwb3NpbmcgYW4gYWRkaXRpb25hbCBwdWJsaWMgc3luY2hyb25pemVkIGNhbGwKLSAgICAgKiBmb3IgYSB3YWtlbG9jayBvcHRpbWl6YXRpb24gaW4gV2lmaVNlcnZpY2UuIFJlbW92ZSBpdAotICAgICAqIHdoZW4gd2UgaGFuZGxlIHRoZSB3YWtlbG9jayBpbiBDb25uZWN0aXZpdHlTZXJ2aWNlLgotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBpc0RyaXZlclN0b3BwZWQoKSB7Ci0gICAgICAgIHJldHVybiBtUnVuU3RhdGUgPT0gUlVOX1NUQVRFX1NUT1BQRUQgfHwgbVJ1blN0YXRlID09IFJVTl9TVEFURV9TVE9QUElORzsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgbm90ZVJ1blN0YXRlKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKG1SdW5TdGF0ZSA9PSBSVU5fU1RBVEVfUlVOTklORykgewotICAgICAgICAgICAgICAgIG1CYXR0ZXJ5U3RhdHMubm90ZVdpZmlSdW5uaW5nKCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1SdW5TdGF0ZSA9PSBSVU5fU1RBVEVfU1RPUFBFRCkgewotICAgICAgICAgICAgICAgIG1CYXR0ZXJ5U3RhdHMubm90ZVdpZmlTdG9wcGVkKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBpZ25vcmUpIHsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgcnVuIHN0YXRlIHRvIGVpdGhlciAibm9ybWFsIiBvciAic2Nhbi1vbmx5Ii4KLSAgICAgKiBAcGFyYW0gc2Nhbk9ubHlNb2RlIHRydWUgaWYgdGhlIG5ldyBtb2RlIHNob3VsZCBiZSBzY2FuLW9ubHkuCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldFNjYW5Pbmx5TW9kZShib29sZWFuIHNjYW5Pbmx5TW9kZSkgewotICAgICAgICAvLyBkbyBub3RoaW5nIHVubGVzcyBzY2FuLW9ubHkgbW9kZSBpcyBjaGFuZ2luZwotICAgICAgICBpZiAobUlzU2Nhbk9ubHkgIT0gc2Nhbk9ubHlNb2RlKSB7Ci0gICAgICAgICAgICBpbnQgc2NhblR5cGUgPSAoc2Nhbk9ubHlNb2RlID8KLSAgICAgICAgICAgICAgICAgICAgU1VQUExfU0NBTl9IQU5ETElOR19MSVNUX09OTFkgOiBTVVBQTF9TQ0FOX0hBTkRMSU5HX05PUk1BTCk7Ci0gICAgICAgICAgICBpZiAoTE9DQUxfTE9HRCkgTG9nLnYoVEFHLCAiU2Nhbi1vbmx5IG1vZGUgY2hhbmdpbmcgdG8gIiArIHNjYW5Pbmx5TW9kZSArICIgc2NhblR5cGU9IiArIHNjYW5UeXBlKTsKLSAgICAgICAgICAgIGlmIChzZXRTY2FuUmVzdWx0SGFuZGxpbmcoc2NhblR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgbUlzU2Nhbk9ubHkgPSBzY2FuT25seU1vZGU7Ci0gICAgICAgICAgICAgICAgaWYgKCFpc0RyaXZlclN0b3BwZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoc2Nhbk9ubHlNb2RlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkaXNjb25uZWN0KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZWNvbm5lY3RDb21tYW5kKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgc3VzcGVuZCBtb2RlIG9wdGltaXphdGlvbnMuIFRoZXNlIGluY2x1ZGU6Ci0gICAgICogLSBwYWNrZXQgZmlsdGVyaW5nCi0gICAgICogLSB0dXJuIG9mZiByb2FtaW5nCi0gICAgICogLSBEVElNIHNldHRpbmdzCi0gICAgICoKLSAgICAgKiBVc2VzIHJlZmVyZW5jZSBjb3VudGluZyB0byBrZWVwIHRoZSBzdXNwZW5kIG9wdGltaXphdGlvbnMgZGlzYWJsZWQKLSAgICAgKiBhcyBsb25nIGFzIG9uZSBlbnRpdHkgd2FudHMgb3B0aW1pemF0aW9ucyBkaXNhYmxlZC4KLSAgICAgKgotICAgICAqIEZvciBleGFtcGxlLCBXaWZpTG9jayBjYW4ga2VlcCBzdXNwZW5kIG9wdGltaXphdGlvbnMgZGlzYWJsZWQKLSAgICAgKiBvciB0aGUgdXNlciBzZXR0aW5nICh3aWZpIG5ldmVyIHNsZWVwcykgY2FuIGtlZXAgc3VzcGVuZCBvcHRpbWl6YXRpb25zCi0gICAgICogZGlzYWJsZWQuIEFzIGxvbmcgYXMgb25lIGVudGl0eSB3YW50cyBpdCBkaXNhYmxlZCwgaXQgc2hvdWxkIHN0YXkKLSAgICAgKiB0aGF0IHdheQotICAgICAqCi0gICAgICogQHBhcmFtIGVuYWJsZWQgdHJ1ZSBpZiBvcHRpbWl6YXRpb25zIG5lZWQgZW5hYmxlZCwgZmFsc2Ugb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldFN1c3BlbmRNb2RlT3B0aW1pemF0aW9ucyhib29sZWFuIGVuYWJsZWQpIHsKLQotICAgICAgICAvKiBJdCBpcyBnb29kIHRvIHBsdW1iIHN1c3BlbmQgb3B0aW1pemF0aW9uIGVuYWJsZQotICAgICAgICAgKiBvciBkaXNhYmxlIGV2ZW4gaWYgcmVmIGNvdW50IGluZGljYXRlcyBhbHJlYWR5IGRvbmUKLSAgICAgICAgICogc2luY2Ugd2UgY291bGQgaGF2ZSBhIGNhc2Ugb2YgcHJldmlvdXMgZmFpbHVyZS4KLSAgICAgICAgICovCi0gICAgICAgIGlmICghZW5hYmxlZCkgewotICAgICAgICAgICAgbU9wdGltaXphdGlvbnNEaXNhYmxlZFJlZkNvdW50Kys7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtT3B0aW1pemF0aW9uc0Rpc2FibGVkUmVmQ291bnQtLTsKLSAgICAgICAgICAgIGlmIChtT3B0aW1pemF0aW9uc0Rpc2FibGVkUmVmQ291bnQgPiAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvKiBLZWVwIHJlZmNvdW50IGZyb20gYmVjb21pbmcgbmVnYXRpdmUgKi8KLSAgICAgICAgICAgICAgICBtT3B0aW1pemF0aW9uc0Rpc2FibGVkUmVmQ291bnQgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1XaWZpU3RhdGUuZ2V0KCkgIT0gV0lGSV9TVEFURV9FTkFCTEVEIHx8IGlzRHJpdmVyU3RvcHBlZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBXaWZpTmF0aXZlLnNldFN1c3BlbmRPcHRpbWl6YXRpb25zQ29tbWFuZChlbmFibGVkKTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFNldCBoaWdoIHBlcmZvcm1hbmNlIG1vZGUgb2Ygb3BlcmF0aW9uLiBUaGlzIHdvdWxkIG1lYW4KLSAgICAgKiB1c2UgYWN0aXZlIHBvd2VyIG1vZGUgYW5kIGRpc2FibGUgc3VzcGVuZCBvcHRpbWl6YXRpb25zCi0gICAgICogQHBhcmFtIGVuYWJsZWQgdHJ1ZSBpZiBlbmFibGVkLCBmYWxzZSBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0SGlnaFBlcmZNb2RlKGJvb2xlYW4gZW5hYmxlZCkgewotICAgICAgICBpZiAobUlzSGlnaFBlcmZFbmFibGVkICE9IGVuYWJsZWQpIHsKLSAgICAgICAgICAgIGlmIChlbmFibGVkKSB7Ci0gICAgICAgICAgICAgICAgc2V0UG93ZXJNb2RlKERSSVZFUl9QT1dFUl9NT0RFX0FDVElWRSk7Ci0gICAgICAgICAgICAgICAgc2V0U3VzcGVuZE1vZGVPcHRpbWl6YXRpb25zKGZhbHNlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc2V0UG93ZXJNb2RlKERSSVZFUl9QT1dFUl9NT0RFX0FVVE8pOwotICAgICAgICAgICAgICAgIHNldFN1c3BlbmRNb2RlT3B0aW1pemF0aW9ucyh0cnVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1Jc0hpZ2hQZXJmRW5hYmxlZCA9IGVuYWJsZWQ7Ci0gICAgICAgICAgICBMb2cuZChUQUcsImhpZ2ggcGVyZm9ybWFuY2UgbW9kZTogIiArIGVuYWJsZWQpOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tJc0JsdWV0b290aFBsYXlpbmcoKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNCbHVldG9vdGhQbGF5aW5nID0gZmFsc2U7Ci0gICAgICAgIFNldDxCbHVldG9vdGhEZXZpY2U+IGNvbm5lY3RlZCA9IG1CbHVldG9vdGhBMmRwLmdldENvbm5lY3RlZFNpbmtzKCk7Ci0KLSAgICAgICAgZm9yIChCbHVldG9vdGhEZXZpY2UgZGV2aWNlIDogY29ubmVjdGVkKSB7Ci0gICAgICAgICAgICBpZiAobUJsdWV0b290aEEyZHAuZ2V0U2lua1N0YXRlKGRldmljZSkgPT0gQmx1ZXRvb3RoQTJkcC5TVEFURV9QTEFZSU5HKSB7Ci0gICAgICAgICAgICAgICAgaXNCbHVldG9vdGhQbGF5aW5nID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBzZXRCbHVldG9vdGhTY2FuTW9kZShpc0JsdWV0b290aFBsYXlpbmcpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGVuYWJsZVJzc2lQb2xsaW5nKGJvb2xlYW4gZW5hYmxlKSB7Ci0gICAgICAgIGlmIChtRW5hYmxlUnNzaVBvbGxpbmcgIT0gZW5hYmxlKSB7Ci0gICAgICAgICAgICBtRW5hYmxlUnNzaVBvbGxpbmcgPSBlbmFibGU7Ci0gICAgICAgICAgICBjaGVja1BvbGxUaW1lcigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV2UgcmVsZWFzZSB0aGUgd2FrZWxvY2sgaW4gV2lmaVNlcnZpY2UKLSAgICAgKiB1c2luZyBhIHRpbWVyLgotICAgICAqCi0gICAgICogVE9ETzoKLSAgICAgKiBSZWxlYXNpbmcgd2FrZWxvY2sgdXNpbmcgYm90aCB0aW1lciBhbmQKLSAgICAgKiBhIGNhbGwgZnJvbSBDb25uZWN0aXZpdHlTZXJ2aWNlIHJlcXVpcmVzCi0gICAgICogYSByZXRoaW5rLiBXZSBoYWQgcHJvYmxlbXMgd2hlcmUgV2lmaVNlcnZpY2UKLSAgICAgKiBjb3VsZCBrZWVwIGEgd2FrZWxvY2sgZm9yZXZlciBpZiB3ZSBkZWxldGUKLSAgICAgKiBtZXNzYWdlcyBpbiB0aGUgYXN5bmNocm9ub3VzIGNhbGwKLSAgICAgKiBmcm9tIENvbm5lY3Rpdml0eVNlcnZpY2UKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCByZWxlYXNlV2FrZUxvY2soKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVHJhY2tzIHRoZSBXUEEgc3VwcGxpY2FudCBzdGF0ZXMgdG8gZGV0ZWN0ICJsb29wIiBzaXR1YXRpb25zLgotICAgICAqIEBwYXJhbSBuZXdTdXBwbGljYW50U3RhdGUgVGhlIG5ldyBXUEEgc3VwcGxpY2FudCBzdGF0ZS4KLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgc3VwcGxpY2FudCBsb29wIHNob3VsZCBiZSBzdG9wcGVkCi0gICAgICogYW5kIHtAY29kZSBmYWxzZX0gaWYgaXQgc2hvdWxkIGNvbnRpbnVlLgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBpc1N1cHBsaWNhbnRMb29waW5nKFN1cHBsaWNhbnRTdGF0ZSBuZXdTdXBwbGljYW50U3RhdGUpIHsKLSAgICAgICAgaWYgKFN1cHBsaWNhbnRTdGF0ZS5BU1NPQ0lBVElORy5vcmRpbmFsKCkgPD0gbmV3U3VwcGxpY2FudFN0YXRlLm9yZGluYWwoKQotICAgICAgICAgICAgJiYgbmV3U3VwcGxpY2FudFN0YXRlLm9yZGluYWwoKSA8IFN1cHBsaWNhbnRTdGF0ZS5DT01QTEVURUQub3JkaW5hbCgpKSB7Ci0gICAgICAgICAgICBpZiAobVN1cHBsaWNhbnRMb29wU3RhdGUgIT0gbmV3U3VwcGxpY2FudFN0YXRlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG5ld1N1cHBsaWNhbnRTdGF0ZS5vcmRpbmFsKCkgPCBtU3VwcGxpY2FudExvb3BTdGF0ZS5vcmRpbmFsKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgKyttTnVtU3VwcGxpY2FudExvb3BJdGVyYXRpb25zOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIG1TdXBwbGljYW50TG9vcFN0YXRlID0gbmV3U3VwcGxpY2FudFN0YXRlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKG5ld1N1cHBsaWNhbnRTdGF0ZSA9PSBTdXBwbGljYW50U3RhdGUuQ09NUExFVEVEKSB7Ci0gICAgICAgICAgICByZXNldFN1cHBsaWNhbnRMb29wU3RhdGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBtTnVtU3VwcGxpY2FudExvb3BJdGVyYXRpb25zID49IE1BWF9TVVBQTElDQU5UX0xPT1BfSVRFUkFUSU9OUzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXNldHMgdGhlIFdQQSBzdXBwbGljYW50IGxvb3Agc3RhdGUuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHJlc2V0U3VwcGxpY2FudExvb3BTdGF0ZSgpIHsKLSAgICAgICAgbU51bVN1cHBsaWNhbnRMb29wSXRlcmF0aW9ucyA9IDA7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG1zZykgewotICAgICAgICBJbnRlbnQgaW50ZW50OwotCi0gICAgICAgIHN3aXRjaCAobXNnLndoYXQpIHsKLSAgICAgICAgICAgIGNhc2UgRVZFTlRfU1VQUExJQ0FOVF9DT05ORUNUSU9OOgotICAgICAgICAgICAgICAgIG1SdW5TdGF0ZSA9IFJVTl9TVEFURV9SVU5OSU5HOwotICAgICAgICAgICAgICAgIG5vdGVSdW5TdGF0ZSgpOwotICAgICAgICAgICAgICAgIGNoZWNrVXNlU3RhdGljSXAoKTsKLSAgICAgICAgICAgICAgICAvKiBSZXNldCBub3RpZmljYXRpb24gc3RhdGUgb24gbmV3IGNvbm5lY3Rpb24gKi8KLSAgICAgICAgICAgICAgICByZXNldE5vdGlmaWNhdGlvblRpbWVyKCk7Ci0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgKiBESENQIHJlcXVlc3RzIGFyZSBibG9ja2luZywgc28gcnVuIHRoZW0gaW4gYSBzZXBhcmF0ZSB0aHJlYWQuCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgSGFuZGxlclRocmVhZCBkaGNwVGhyZWFkID0gbmV3IEhhbmRsZXJUaHJlYWQoIkRIQ1AgSGFuZGxlciBUaHJlYWQiKTsKLSAgICAgICAgICAgICAgICBkaGNwVGhyZWFkLnN0YXJ0KCk7Ci0gICAgICAgICAgICAgICAgbURoY3BUYXJnZXQgPSBuZXcgRGhjcEhhbmRsZXIoZGhjcFRocmVhZC5nZXRMb29wZXIoKSwgdGhpcyk7Ci0gICAgICAgICAgICAgICAgbUlzU2Nhbk1vZGVBY3RpdmUgPSB0cnVlOwotICAgICAgICAgICAgICAgIG1Jc0hpZ2hQZXJmRW5hYmxlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIG1PcHRpbWl6YXRpb25zRGlzYWJsZWRSZWZDb3VudCA9IDA7Ci0gICAgICAgICAgICAgICAgbVBvd2VyTW9kZVJlZkNvdW50ID0gMDsKLSAgICAgICAgICAgICAgICBtVG9ybkRvd25CeUNvbm5NZ3IgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBtTGFzdEJzc2lkID0gbnVsbDsKLSAgICAgICAgICAgICAgICBtTGFzdFNzaWQgPSBudWxsOwotICAgICAgICAgICAgICAgIG1Jc0FueU5ldHdvcmtEaXNhYmxlZC5zZXQoZmFsc2UpOwotICAgICAgICAgICAgICAgIHJlcXVlc3RDb25uZWN0aW9uSW5mbygpOwotICAgICAgICAgICAgICAgIFN1cHBsaWNhbnRTdGF0ZSBzdXBwbFN0YXRlID0gbVdpZmlJbmZvLmdldFN1cHBsaWNhbnRTdGF0ZSgpOwotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIFRoZSBNQUMgYWRkcmVzcyBpc24ndCBnb2luZyB0byBjaGFuZ2UsIHNvIGp1c3QgcmVxdWVzdCBpdAotICAgICAgICAgICAgICAgICAqIG9uY2UgaGVyZS4KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBTdHJpbmcgbWFjYWRkciA9IGdldE1hY0FkZHJlc3MoKTsKLQotICAgICAgICAgICAgICAgIGlmIChtYWNhZGRyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbVdpZmlJbmZvLnNldE1hY0FkZHJlc3MobWFjYWRkcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChMT0NBTF9MT0dEKSBMb2cudihUQUcsICJDb25uZWN0aW9uIHRvIHN1cHBsaWNhbnQgZXN0YWJsaXNoZWQsIHN0YXRlPSIgKwotICAgICAgICAgICAgICAgICAgICBzdXBwbFN0YXRlKTsKLSAgICAgICAgICAgICAgICAvLyBXaS1GaSBzdXBwbGljYW50IGNvbm5lY3Rpb24gc3RhdGUgY2hhbmdlZDoKLSAgICAgICAgICAgICAgICAvLyBbMzEtIDJdIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlCi0gICAgICAgICAgICAgICAgLy8gWyAxLSAwXSBDb25uZWN0ZWQgdG8gc3VwcGxpY2FudCAoMSksIGRpc2Nvbm5lY3RlZCBmcm9tIHN1cHBsaWNhbnQgKDApICwKLSAgICAgICAgICAgICAgICAvLyAgICAgICAgIG9yIHN1cHBsaWNhbnQgZGllZCAoMikKLSAgICAgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UTE9HX1NVUFBMSUNBTlRfQ09OTkVDVElPTl9TVEFURV9DSEFOR0VELCAxKTsKLSAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAqIFRoZSBDT01QTEVURUQgc3RhdGUgY2hhbmdlIGZyb20gdGhlIHN1cHBsaWNhbnQgbWF5IGhhdmUgb2NjdXJyZWQKLSAgICAgICAgICAgICAgICAgKiBpbiBiZXR3ZWVuIHBvbGxpbmcgZm9yIHN1cHBsaWNhbnQgYXZhaWxhYmlsaXR5LCBpbiB3aGljaCBjYXNlCi0gICAgICAgICAgICAgICAgICogd2UgZGlkbid0IHBlcmZvcm0gYSBESENQIHJlcXVlc3QgdG8gZ2V0IGFuIElQIGFkZHJlc3MuCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgaWYgKHN1cHBsU3RhdGUgPT0gU3VwcGxpY2FudFN0YXRlLkNPTVBMRVRFRCkgewotICAgICAgICAgICAgICAgICAgICBtTGFzdEJzc2lkID0gbVdpZmlJbmZvLmdldEJTU0lEKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1MYXN0U3NpZCA9IG1XaWZpSW5mby5nZXRTU0lEKCk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyZUludGVyZmFjZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoQWN0aXZpdHlNYW5hZ2VyTmF0aXZlLmlzU3lzdGVtUmVhZHkoKSkgewotICAgICAgICAgICAgICAgICAgICBpbnRlbnQgPSBuZXcgSW50ZW50KFdpZmlNYW5hZ2VyLlNVUFBMSUNBTlRfQ09OTkVDVElPTl9DSEFOR0VfQUNUSU9OKTsKLSAgICAgICAgICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKFdpZmlNYW5hZ2VyLkVYVFJBX1NVUFBMSUNBTlRfQ09OTkVDVEVELCB0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgbUNvbnRleHQuc2VuZEJyb2FkY2FzdChpbnRlbnQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoc3VwcGxTdGF0ZSA9PSBTdXBwbGljYW50U3RhdGUuQ09NUExFVEVEICYmIG1IYXZlSXBBZGRyZXNzKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldERldGFpbGVkU3RhdGUoRGV0YWlsZWRTdGF0ZS5DT05ORUNURUQpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldERldGFpbGVkU3RhdGUoV2lmaUluZm8uZ2V0RGV0YWlsZWRTdGF0ZU9mKHN1cHBsU3RhdGUpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgKiBGaWx0ZXIgb3V0IG11bHRpY2FzdCBwYWNrZXRzLiBUaGlzIHNhdmVzIGJhdHRlcnkgcG93ZXIsIHNpbmNlCi0gICAgICAgICAgICAgICAgICogdGhlIENQVSBkb2Vzbid0IGhhdmUgdG8gc3BlbmQgdGltZSBwcm9jZXNzaW5nIHBhY2tldHMgdGhhdAotICAgICAgICAgICAgICAgICAqIGFyZSBnb2luZyB0byBlbmQgdXAgYmVpbmcgdGhyb3duIGF3YXkuCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgbVdNLmluaXRpYWxpemVNdWx0aWNhc3RGaWx0ZXJpbmcoKTsKLQotICAgICAgICAgICAgICAgIGlmIChtQmx1ZXRvb3RoQTJkcCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1CbHVldG9vdGhBMmRwID0gbmV3IEJsdWV0b290aEEyZHAobUNvbnRleHQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjaGVja0lzQmx1ZXRvb3RoUGxheWluZygpOwotCi0gICAgICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZSB0aGlzIGFmdGVyIHRoZSBzdXBwbGljYW50IGlzIGFsaXZlCi0gICAgICAgICAgICAgICAgc2V0TnVtQWxsb3dlZENoYW5uZWxzKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgRVZFTlRfU1VQUExJQ0FOVF9ESVNDT05ORUNUOgotICAgICAgICAgICAgICAgIG1SdW5TdGF0ZSA9IFJVTl9TVEFURV9TVE9QUEVEOwotICAgICAgICAgICAgICAgIG5vdGVSdW5TdGF0ZSgpOwotICAgICAgICAgICAgICAgIGJvb2xlYW4gZGllZCA9IG1XaWZpU3RhdGUuZ2V0KCkgIT0gV0lGSV9TVEFURV9ESVNBQkxFRCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1XaWZpU3RhdGUuZ2V0KCkgIT0gV0lGSV9TVEFURV9ESVNBQkxJTkc7Ci0gICAgICAgICAgICAgICAgaWYgKGRpZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKExPQ0FMX0xPR0QpIExvZy52KFRBRywgIlN1cHBsaWNhbnQgZGllZCB1bmV4cGVjdGVkbHkiKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAoTE9DQUxfTE9HRCkgTG9nLnYoVEFHLCAiQ29ubmVjdGlvbiB0byBzdXBwbGljYW50IGxvc3QiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gV2ktRmkgc3VwcGxpY2FudCBjb25uZWN0aW9uIHN0YXRlIGNoYW5nZWQ6Ci0gICAgICAgICAgICAgICAgLy8gWzMxLSAyXSBSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZQotICAgICAgICAgICAgICAgIC8vIFsgMS0gMF0gQ29ubmVjdGVkIHRvIHN1cHBsaWNhbnQgKDEpLCBkaXNjb25uZWN0ZWQgZnJvbSBzdXBwbGljYW50ICgwKSAsCi0gICAgICAgICAgICAgICAgLy8gICAgICAgICBvciBzdXBwbGljYW50IGRpZWQgKDIpCi0gICAgICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19TVVBQTElDQU5UX0NPTk5FQ1RJT05fU1RBVEVfQ0hBTkdFRCwgZGllZCA/IDIgOiAwKTsKLSAgICAgICAgICAgICAgICBjbG9zZVN1cHBsaWNhbnRDb25uZWN0aW9uKCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoZGllZCkgewotICAgICAgICAgICAgICAgICAgICByZXNldENvbm5lY3Rpb25zKHRydWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBXaGVuIHN1cHBsaWNhbnQgZGllcywga2lsbCB0aGUgREhDUCB0aHJlYWQKLSAgICAgICAgICAgICAgICBpZiAobURoY3BUYXJnZXQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtRGhjcFRhcmdldC5nZXRMb29wZXIoKS5xdWl0KCk7Ci0gICAgICAgICAgICAgICAgICAgIG1EaGNwVGFyZ2V0ID0gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUNvbnRleHQucmVtb3ZlU3RpY2t5QnJvYWRjYXN0KG5ldyBJbnRlbnQoV2lmaU1hbmFnZXIuTkVUV09SS19TVEFURV9DSEFOR0VEX0FDVElPTikpOwotICAgICAgICAgICAgICAgIGlmIChBY3Rpdml0eU1hbmFnZXJOYXRpdmUuaXNTeXN0ZW1SZWFkeSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludGVudCA9IG5ldyBJbnRlbnQoV2lmaU1hbmFnZXIuU1VQUExJQ0FOVF9DT05ORUNUSU9OX0NIQU5HRV9BQ1RJT04pOwotICAgICAgICAgICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoV2lmaU1hbmFnZXIuRVhUUkFfU1VQUExJQ0FOVF9DT05ORUNURUQsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgbUNvbnRleHQuc2VuZEJyb2FkY2FzdChpbnRlbnQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzZXREZXRhaWxlZFN0YXRlKERldGFpbGVkU3RhdGUuRElTQ09OTkVDVEVEKTsKLSAgICAgICAgICAgICAgICBzZXRTdXBwbGljYW50U3RhdGUoU3VwcGxpY2FudFN0YXRlLlVOSU5JVElBTElaRUQpOwotICAgICAgICAgICAgICAgIG1IYXZlSXBBZGRyZXNzID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgbU9idGFpbmluZ0lwQWRkcmVzcyA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGlmIChkaWVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1XTS5zZXRXaWZpRW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIEVWRU5UX01BWUJFX1NUQVJUX1NDQU5fUE9TVF9ESVNDT05ORUNUOgotICAgICAgICAgICAgICAgIC8vIE9ubHkgZG8gdGhpcyBpZiB3ZSBoYXZlbid0IGdvdHRlbiBhIG5ldyBzdXBwbGljYW50IHN0YXR1cyBzaW5jZSB0aGUgdGltZXIKLSAgICAgICAgICAgICAgICAvLyBzdGFydGVkCi0gICAgICAgICAgICAgICAgaWYgKG1OdW1TdXBwbGljYW50U3RhdGVDaGFuZ2VzID09IG1zZy5hcmcxKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNjYW4oZmFsc2UpOyAvLyBkbyBhIHBhc3NpdmUgc2NhbgotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBFVkVOVF9TVVBQTElDQU5UX1NUQVRFX0NIQU5HRUQ6Ci0gICAgICAgICAgICAgICAgbU51bVN1cHBsaWNhbnRTdGF0ZUNoYW5nZXMrKzsKLSAgICAgICAgICAgICAgICBTdXBwbGljYW50U3RhdGVDaGFuZ2VSZXN1bHQgc3VwcGxpY2FudFN0YXRlUmVzdWx0ID0KLSAgICAgICAgICAgICAgICAgICAgKFN1cHBsaWNhbnRTdGF0ZUNoYW5nZVJlc3VsdCkgbXNnLm9iajsKLSAgICAgICAgICAgICAgICBTdXBwbGljYW50U3RhdGUgbmV3U3RhdGUgPSBzdXBwbGljYW50U3RhdGVSZXN1bHQuc3RhdGU7Ci0gICAgICAgICAgICAgICAgU3VwcGxpY2FudFN0YXRlIGN1cnJlbnRTdGF0ZSA9IG1XaWZpSW5mby5nZXRTdXBwbGljYW50U3RhdGUoKTsKLQotICAgICAgICAgICAgICAgIC8vIFdpLUZpIHN1cHBsaWNhbnQgc3RhdGUgY2hhbmdlZDoKLSAgICAgICAgICAgICAgICAvLyBbMzEtIDZdIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlCi0gICAgICAgICAgICAgICAgLy8gWyA1LSAwXSBTdXBwbGljYW50IHN0YXRlIG9yZGluYWwgKGFzIGRlZmluZWQgYnkgU3VwcGxpY2FudFN0YXRlKQotICAgICAgICAgICAgICAgIGludCBldmVudExvZ1BhcmFtID0gKG5ld1N0YXRlLm9yZGluYWwoKSAmIDB4M2YpOwotICAgICAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRVZFTlRMT0dfU1VQUExJQ0FOVF9TVEFURV9DSEFOR0VELCBldmVudExvZ1BhcmFtKTsKLQotICAgICAgICAgICAgICAgIGlmIChMT0NBTF9MT0dEKSBMb2cudihUQUcsICJDaGFuZ2luZyBzdXBwbGljYW50IHN0YXRlOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgY3VycmVudFN0YXRlICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiA9PT4gIiArIG5ld1N0YXRlKTsKLQotICAgICAgICAgICAgICAgIGludCBuZXR3b3JrSWQgPSBzdXBwbGljYW50U3RhdGVSZXN1bHQubmV0d29ya0lkOwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogVGhlIFN1cHBsaWNhbnRTdGF0ZSBCU1NJRCB2YWx1ZSBpcyB2YWxpZCBpbiBBU1NPQ0lBVElORyBzdGF0ZSBvbmx5LgotICAgICAgICAgICAgICAgICAqIFRoZSBOZXR3b3JrU3RhdGUgQlNTSUQgdmFsdWUgY29tZXMgdXBvbiBhIHN1Y2Nlc3NmdWwgY29ubmVjdGlvbi4KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBpZiAoc3VwcGxpY2FudFN0YXRlUmVzdWx0LnN0YXRlID09IFN1cHBsaWNhbnRTdGF0ZS5BU1NPQ0lBVElORykgewotICAgICAgICAgICAgICAgICAgICBtTGFzdEJzc2lkID0gc3VwcGxpY2FudFN0YXRlUmVzdWx0LkJTU0lEOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAqIElmIHdlIGdldCBkaXNjb25uZWN0IG9yIGluYWN0aXZlIHdlIG5lZWQgdG8gc3RhcnQgb3VyCi0gICAgICAgICAgICAgICAgICogd2F0Y2hkb2cgdGltZXIgdG8gc3RhcnQgYSBzY2FuCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgaWYgKG5ld1N0YXRlID09IFN1cHBsaWNhbnRTdGF0ZS5ESVNDT05ORUNURUQgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ld1N0YXRlID09IFN1cHBsaWNhbnRTdGF0ZS5JTkFDVElWRSkgewotICAgICAgICAgICAgICAgICAgICBzZW5kTWVzc2FnZURlbGF5ZWQob2J0YWluTWVzc2FnZShFVkVOVF9NQVlCRV9TVEFSVF9TQ0FOX1BPU1RfRElTQ09OTkVDVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTnVtU3VwcGxpY2FudFN0YXRlQ2hhbmdlcywgMCksIEtJQ0tTVEFSVF9TQ0FOTklOR19ERUxBWV9NU0VDUyk7Ci0gICAgICAgICAgICAgICAgfQotCi0KLSAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAqIERpZCB3ZSBnZXQgdG8gRElTQ09OTkVDVEVEIHN0YXRlIGR1ZSB0byBhbgotICAgICAgICAgICAgICAgICAqIGF1dGhlbnRpY2F0aW9uIChwYXNzd29yZCkgZmFpbHVyZT8KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBib29sZWFuIGZhaWxlZFRvQXV0aGVudGljYXRlID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgaWYgKG5ld1N0YXRlID09IFN1cHBsaWNhbnRTdGF0ZS5ESVNDT05ORUNURUQpIHsKLSAgICAgICAgICAgICAgICAgICAgZmFpbGVkVG9BdXRoZW50aWNhdGUgPSBtUGFzc3dvcmRLZXlNYXlCZUluY29ycmVjdDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbVBhc3N3b3JkS2V5TWF5QmVJbmNvcnJlY3QgPSBmYWxzZTsKLQotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICogS2VlcCB0cmFjayBvZiB0aGUgc3VwcGxpY2FudCBzdGF0ZSBhbmQgY2hlY2sgaWYgd2Ugc2hvdWxkCi0gICAgICAgICAgICAgICAgICogZGlzYWJsZSB0aGUgbmV0d29yawotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIGJvb2xlYW4gZGlzYWJsZWROZXR3b3JrID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgaWYgKGlzU3VwcGxpY2FudExvb3BpbmcobmV3U3RhdGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChMT0NBTF9MT0dEKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cudihUQUcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU3RvcCBXUEEgc3VwcGxpY2FudCBsb29wIGFuZCBkaXNhYmxlIG5ldHdvcmsiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZE5ldHdvcmsgPSB3aWZpTWFuYWdlckRpc2FibGVOZXR3b3JrKG5ldHdvcmtJZCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGRpc2FibGVkTmV0d29yaykgewotICAgICAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAgICAgKiBSZXNldCB0aGUgbG9vcCBzdGF0ZSBpZiB3ZSBkaXNhYmxlZCB0aGUgbmV0d29yawotICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgcmVzZXRTdXBwbGljYW50TG9vcFN0YXRlKCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuZXdTdGF0ZSAhPSBjdXJyZW50U3RhdGUgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIChuZXdTdGF0ZSA9PSBTdXBwbGljYW50U3RhdGUuRElTQ09OTkVDVEVEICYmIGlzRHJpdmVyU3RvcHBlZCgpKSkgewotICAgICAgICAgICAgICAgICAgICBzZXRTdXBwbGljYW50U3RhdGUobmV3U3RhdGUpOwotICAgICAgICAgICAgICAgICAgICBpZiAobmV3U3RhdGUgPT0gU3VwcGxpY2FudFN0YXRlLkRPUk1BTlQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIERldGFpbGVkU3RhdGUgbmV3RGV0YWlsZWRTdGF0ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgcmVjb25uZWN0TXNnID0gb2J0YWluTWVzc2FnZShFVkVOVF9ERUZFUlJFRF9SRUNPTk5FQ1QsIG1MYXN0QnNzaWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1Jc1NjYW5Pbmx5IHx8IG1SdW5TdGF0ZSA9PSBSVU5fU1RBVEVfU1RPUFBJTkcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdEZXRhaWxlZFN0YXRlID0gRGV0YWlsZWRTdGF0ZS5JRExFOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdEZXRhaWxlZFN0YXRlID0gRGV0YWlsZWRTdGF0ZS5GQUlMRUQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVEaXNjb25uZWN0ZWRTdGF0ZShuZXdEZXRhaWxlZFN0YXRlLCB0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICogSWYgd2Ugd2VyZSBhc3NvY2lhdGVkIHdpdGggYSBuZXR3b3JrIChuZXR3b3JrSWQgIT0gLTEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICogYXNzdW1lIHdlIHJlYWNoZWQgdGhpcyBzdGF0ZSBiZWNhdXNlIG9mIGEgZmFpbGVkIGF0dGVtcHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIHRvIGFjcXVpcmUgYW4gSVAgYWRkcmVzcywgYW5kIGF0dGVtcHQgYW5vdGhlciBjb25uZWN0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiBhbmQgSVAgYWRkcmVzcyBhY3F1aXNpdGlvbiBpbiBSRUNPTk5FQ1RfREVMQVlfTVNFQ1MKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIG1pbGxpc2Vjb25kcy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1SdW5TdGF0ZSA9PSBSVU5fU1RBVEVfUlVOTklORyAmJiAhbUlzU2Nhbk9ubHkgJiYgbmV0d29ya0lkICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZE1lc3NhZ2VEZWxheWVkKHJlY29ubmVjdE1zZywgUkVDT05ORUNUX0RFTEFZX01TRUNTKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobVJ1blN0YXRlID09IFJVTl9TVEFURV9TVE9QUElORykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3BEcml2ZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobVJ1blN0YXRlID09IFJVTl9TVEFURV9TVEFSVElORyAmJiAhbUlzU2Nhbk9ubHkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNvbm5lY3RDb21tYW5kKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobmV3U3RhdGUgPT0gU3VwcGxpY2FudFN0YXRlLkRJU0NPTk5FQ1RFRCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUhhdmVJcEFkZHJlc3MgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0RyaXZlclN0b3BwZWQoKSB8fCBtRGlzY29ubmVjdEV4cGVjdGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlRGlzY29ubmVjdGVkU3RhdGUoRGV0YWlsZWRTdGF0ZS5ESVNDT05ORUNURUQsIHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2hlZHVsZURpc2Nvbm5lY3QoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuZXdTdGF0ZSAhPSBTdXBwbGljYW50U3RhdGUuQ09NUExFVEVEICYmICFtRGlzY29ubmVjdFBlbmRpbmcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICogSWdub3JlIGV2ZW50cyB0aGF0IGRvbid0IGNoYW5nZSB0aGUgY29ubmVjdGl2aXR5IHN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICogc3VjaCBhcyBXUEEgcmVrZXlpbmcgb3BlcmF0aW9ucy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoY3VycmVudFN0YXRlID09IFN1cHBsaWNhbnRTdGF0ZS5DT01QTEVURUQgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmV3U3RhdGUgPT0gU3VwcGxpY2FudFN0YXRlLkFTU09DSUFUSU5HIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1N0YXRlID09IFN1cHBsaWNhbnRTdGF0ZS5BU1NPQ0lBVEVEIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1N0YXRlID09IFN1cHBsaWNhbnRTdGF0ZS5GT1VSX1dBWV9IQU5EU0hBS0UgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3U3RhdGUgPT0gU3VwcGxpY2FudFN0YXRlLkdST1VQX0hBTkRTSEFLRSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0RGV0YWlsZWRTdGF0ZShXaWZpSW5mby5nZXREZXRhaWxlZFN0YXRlT2YobmV3U3RhdGUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIG1EaXNjb25uZWN0RXhwZWN0ZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgaW50ZW50ID0gbmV3IEludGVudChXaWZpTWFuYWdlci5TVVBQTElDQU5UX1NUQVRFX0NIQU5HRURfQUNUSU9OKTsKLSAgICAgICAgICAgICAgICAgICAgaW50ZW50LmFkZEZsYWdzKEludGVudC5GTEFHX1JFQ0VJVkVSX1JFR0lTVEVSRURfT05MWV9CRUZPUkVfQk9PVAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgSW50ZW50LkZMQUdfUkVDRUlWRVJfUkVQTEFDRV9QRU5ESU5HKTsKLSAgICAgICAgICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKFdpZmlNYW5hZ2VyLkVYVFJBX05FV19TVEFURSwgKFBhcmNlbGFibGUpbmV3U3RhdGUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZmFpbGVkVG9BdXRoZW50aWNhdGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChMT0NBTF9MT0dEKSBMb2cuZChUQUcsICJGYWlsZWQgdG8gYXV0aGVudGljYXRlLCBkaXNhYmxpbmcgbmV0d29yayAiICsgbmV0d29ya0lkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdpZmlNYW5hZ2VyRGlzYWJsZU5ldHdvcmsobmV0d29ya0lkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludGVudC5wdXRFeHRyYSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWZpTWFuYWdlci5FWFRSQV9TVVBQTElDQU5UX0VSUk9SLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlNYW5hZ2VyLkVSUk9SX0FVVEhFTlRJQ0FUSU5HKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtQ29udGV4dC5zZW5kU3RpY2t5QnJvYWRjYXN0KGludGVudCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIEVWRU5UX05FVFdPUktfU1RBVEVfQ0hBTkdFRDoKLSAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAqIEVhY2ggQ09OTkVDVCBvciBESVNDT05ORUNUIGdlbmVyYXRlcyBhIHBhaXIgb2YgZXZlbnRzLgotICAgICAgICAgICAgICAgICAqIE9uZSBpcyBhIHN1cHBsaWNhbnQgc3RhdGUgY2hhbmdlIGV2ZW50LCBhbmQgdGhlIG90aGVyCi0gICAgICAgICAgICAgICAgICogaXMgYSBuZXR3b3JrIHN0YXRlIGNoYW5nZSBldmVudC4gRm9yIGNvbm5lY3RzLCB0aGUKLSAgICAgICAgICAgICAgICAgKiBzdXBwbGljYW50IGV2ZW50IGFsd2F5cyBhcnJpdmVzIGZpcnN0LCBmb2xsb3dlZCBieQotICAgICAgICAgICAgICAgICAqIHRoZSBuZXR3b3JrIHN0YXRlIGNoYW5nZSBldmVudC4gT25seSB0aGUgbGF0dGVyIGV2ZW50Ci0gICAgICAgICAgICAgICAgICogaGFzIHRoZSBCU1NJRCwgd2hpY2ggd2UgYXJlIGludGVyZXN0ZWQgaW4gY2FwdHVyaW5nLgotICAgICAgICAgICAgICAgICAqIEZvciBkaXNjb25uZWN0cywgdGhlIG9yZGVyIGlzIHRoZSBvcHBvc2l0ZSAtLSB0aGUKLSAgICAgICAgICAgICAgICAgKiBuZXR3b3JrIHN0YXRlIGNoYW5nZSBldmVudCBjb21lcyBmaXJzdCwgZm9sbG93ZWQgYnkKLSAgICAgICAgICAgICAgICAgKiB0aGUgc3VwcGxpY2FudCBzdGF0ZSBjaGFuZ2UgZXZlbnQuCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgTmV0d29ya1N0YXRlQ2hhbmdlUmVzdWx0IHJlc3VsdCA9Ci0gICAgICAgICAgICAgICAgICAgIChOZXR3b3JrU3RhdGVDaGFuZ2VSZXN1bHQpIG1zZy5vYmo7Ci0KLSAgICAgICAgICAgICAgICAvLyBXaS1GaSBuZXR3b3JrIHN0YXRlIGNoYW5nZWQ6Ci0gICAgICAgICAgICAgICAgLy8gWzMxLSA2XSBSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZQotICAgICAgICAgICAgICAgIC8vIFsgNS0gMF0gRGV0YWlsZWQgc3RhdGUgb3JkaW5hbCAoYXMgZGVmaW5lZCBieSBOZXR3b3JrSW5mby5EZXRhaWxlZFN0YXRlKSAgIAotICAgICAgICAgICAgICAgIGV2ZW50TG9nUGFyYW0gPSAocmVzdWx0LnN0YXRlLm9yZGluYWwoKSAmIDB4M2YpOwotICAgICAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRVZFTlRMT0dfTkVUV09SS19TVEFURV9DSEFOR0VELCBldmVudExvZ1BhcmFtKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAoTE9DQUxfTE9HRCkgTG9nLnYoVEFHLCAiTmV3IG5ldHdvcmsgc3RhdGUgaXMgIiArIHJlc3VsdC5zdGF0ZSk7Ci0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgKiBJZiB3ZSdyZSBpbiBzY2FuLW9ubHkgbW9kZSwgZG9uJ3QgYWR2YW5jZSB0aGUgc3RhdGUgbWFjaGluZSwgYW5kCi0gICAgICAgICAgICAgICAgICogZG9uJ3QgcmVwb3J0IHRoZSBzdGF0ZSBjaGFuZ2UgdG8gY2xpZW50cy4KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBpZiAobUlzU2Nhbk9ubHkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKExPQ0FMX0xPR0QpIExvZy52KFRBRywgIkRyb3BwaW5nIGV2ZW50IGluIHNjYW4tb25seSBtb2RlIik7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0LnN0YXRlICE9IERldGFpbGVkU3RhdGUuU0NBTk5JTkcpIHsKLSAgICAgICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgICAgICogUmVzZXQgdGhlIHNjYW4gY291bnQgc2luY2UgdGhlcmUgd2FzIGEgbmV0d29yayBzdGF0ZQotICAgICAgICAgICAgICAgICAgICAgKiBjaGFuZ2UuIFRoaXMgY291bGQgYmUgZnJvbSBzdXBwbGljYW50IHRyeWluZyB0byBhc3NvY2lhdGUKLSAgICAgICAgICAgICAgICAgICAgICogd2l0aCBhIG5ldHdvcmsuCi0gICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICBtTnVtU2NhbnNTaW5jZU5ldHdvcmtTdGF0ZUNoYW5nZSA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICogSWYgdGhlIHN1cHBsaWNhbnQgc2VudCB1cyBhIENPTk5FQ1RFRCBldmVudCwgd2UgZG9uJ3QKLSAgICAgICAgICAgICAgICAgKiB3YW50IHRvIHNlbmQgb3V0IGFuIGluZGljYXRpb24gb2Ygb3ZlcmFsbCBuZXR3b3JrCi0gICAgICAgICAgICAgICAgICogY29ubmVjdGl2aXR5IHVudGlsIHdlIGhhdmUgb3VyIElQIGFkZHJlc3MuIElmIHRoZQotICAgICAgICAgICAgICAgICAqIHN1cHBsaWNhbnQgc2VudCB1cyBhIERJU0NPTk5FQ1RFRCBldmVudCwgd2UgZGVsYXkKLSAgICAgICAgICAgICAgICAgKiBzZW5kaW5nIGEgbm90aWZpY2F0aW9uIGluIGNhc2UgYSByZWNvbm5lY3Rpb24gdG8KLSAgICAgICAgICAgICAgICAgKiB0aGUgc2FtZSBhY2Nlc3MgcG9pbnQgb2NjdXJzIHdpdGhpbiBhIHNob3J0IHRpbWUuCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5zdGF0ZSA9PSBEZXRhaWxlZFN0YXRlLkRJU0NPTk5FQ1RFRCkgewotICAgICAgICAgICAgICAgICAgICBpZiAobVdpZmlJbmZvLmdldFN1cHBsaWNhbnRTdGF0ZSgpICE9IFN1cHBsaWNhbnRTdGF0ZS5ET1JNQU5UKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzY2hlZHVsZURpc2Nvbm5lY3QoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmVxdWVzdENvbm5lY3Rpb25TdGF0dXMobVdpZmlJbmZvKTsKLSAgICAgICAgICAgICAgICBpZiAoIShyZXN1bHQuc3RhdGUgPT0gRGV0YWlsZWRTdGF0ZS5DT05ORUNURUQgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICghbUhhdmVJcEFkZHJlc3MgfHwgbURpc2Nvbm5lY3RQZW5kaW5nKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgc2V0RGV0YWlsZWRTdGF0ZShyZXN1bHQuc3RhdGUpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuc3RhdGUgPT0gRGV0YWlsZWRTdGF0ZS5DT05ORUNURUQpIHsKLSAgICAgICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgICAgICogUmVtb3ZlIHRoZSAnYXZhaWxhYmxlIG5ldHdvcmtzJyBub3RpZmljYXRpb24gd2hlbiB3ZQotICAgICAgICAgICAgICAgICAgICAgKiBzdWNjZXNzZnVsbHkgY29ubmVjdCB0byBhIG5ldHdvcmsuCi0gICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICBzZXROb3RpZmljYXRpb25WaXNpYmxlKGZhbHNlLCAwLCBmYWxzZSwgMCk7Ci0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gd2FzRGlzY29ubmVjdFBlbmRpbmcgPSBtRGlzY29ubmVjdFBlbmRpbmc7Ci0gICAgICAgICAgICAgICAgICAgIGNhbmNlbERpc2Nvbm5lY3QoKTsKLSAgICAgICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgICAgICogVGhlIGNvbm5lY3Rpb24gaXMgZnVsbHkgY29uZmlndXJlZCBhcyBmYXIgYXMgbGluay1sZXZlbAotICAgICAgICAgICAgICAgICAgICAgKiBjb25uZWN0aXZpdHkgaXMgY29uY2VybmVkLCBidXQgd2UgbWF5IHN0aWxsIG5lZWQgdG8gb2J0YWluCi0gICAgICAgICAgICAgICAgICAgICAqIGFuIElQIGFkZHJlc3MuCi0gICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICBpZiAod2FzRGlzY29ubmVjdFBlbmRpbmcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIERldGFpbGVkU3RhdGUgc2F2ZVN0YXRlID0gZ2V0TmV0d29ya0luZm8oKS5nZXREZXRhaWxlZFN0YXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVEaXNjb25uZWN0ZWRTdGF0ZShEZXRhaWxlZFN0YXRlLkRJU0NPTk5FQ1RFRCwgZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2V0RGV0YWlsZWRTdGF0ZUludGVybmFsKHNhdmVTdGF0ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBjb25maWd1cmVJbnRlcmZhY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgbUxhc3RCc3NpZCA9IHJlc3VsdC5CU1NJRDsKLSAgICAgICAgICAgICAgICAgICAgbUxhc3RTc2lkID0gbVdpZmlJbmZvLmdldFNTSUQoKTsKLSAgICAgICAgICAgICAgICAgICAgbUxhc3ROZXR3b3JrSWQgPSByZXN1bHQubmV0d29ya0lkOwotICAgICAgICAgICAgICAgICAgICBpZiAobUhhdmVJcEFkZHJlc3MpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldERldGFpbGVkU3RhdGUoRGV0YWlsZWRTdGF0ZS5DT05ORUNURUQpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgc2V0RGV0YWlsZWRTdGF0ZShEZXRhaWxlZFN0YXRlLk9CVEFJTklOR19JUEFERFIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNlbmROZXR3b3JrU3RhdGVDaGFuZ2VCcm9hZGNhc3QobVdpZmlJbmZvLmdldEJTU0lEKCkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIEVWRU5UX1NDQU5fUkVTVUxUU19BVkFJTEFCTEU6Ci0gICAgICAgICAgICAgICAgaWYgKEFjdGl2aXR5TWFuYWdlck5hdGl2ZS5pc1N5c3RlbVJlYWR5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbUNvbnRleHQuc2VuZEJyb2FkY2FzdChuZXcgSW50ZW50KFdpZmlNYW5hZ2VyLlNDQU5fUkVTVUxUU19BVkFJTEFCTEVfQUNUSU9OKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNlbmRTY2FuUmVzdWx0c0F2YWlsYWJsZSgpOwotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIE9uIHJlY2VpdmluZyB0aGUgZmlyc3Qgc2NhbiByZXN1bHRzIGFmdGVyIGNvbm5lY3RpbmcgdG8KLSAgICAgICAgICAgICAgICAgKiB0aGUgc3VwcGxpY2FudCwgc3dpdGNoIHNjYW4gbW9kZSBvdmVyIHRvIHBhc3NpdmUuCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgc2V0U2Nhbk1vZGUoZmFsc2UpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIEVWRU5UX1BPTExfSU5URVJWQUw6Ci0gICAgICAgICAgICAgICAgaWYgKG1XaWZpSW5mby5nZXRTdXBwbGljYW50U3RhdGUoKSAhPSBTdXBwbGljYW50U3RhdGUuVU5JTklUSUFMSVpFRCkgewotICAgICAgICAgICAgICAgICAgICByZXF1ZXN0UG9sbGVkSW5mbyhtV2lmaUluZm8sIHRydWUpOwotICAgICAgICAgICAgICAgICAgICBjaGVja1BvbGxUaW1lcigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgY2FzZSBFVkVOVF9ERUZFUlJFRF9ESVNDT05ORUNUOgotICAgICAgICAgICAgICAgIGlmIChtV2lmaUluZm8uZ2V0U3VwcGxpY2FudFN0YXRlKCkgIT0gU3VwcGxpY2FudFN0YXRlLlVOSU5JVElBTElaRUQpIHsKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlRGlzY29ubmVjdGVkU3RhdGUoRGV0YWlsZWRTdGF0ZS5ESVNDT05ORUNURUQsIHRydWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBFVkVOVF9ERUZFUlJFRF9SRUNPTk5FQ1Q6Ci0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogbUxhc3RCc3NpZCBjYW4gYmUgbnVsbCB3aGVuIHRoZXJlIGlzIGEgcmVjb25uZWN0Ci0gICAgICAgICAgICAgICAgICogcmVxdWVzdCBvbiB0aGUgZmlyc3QgQlNTSUQgd2UgY29ubmVjdCB0bwotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIFN0cmluZyBCU1NJRCA9IChtc2cub2JqICE9IG51bGwpID8gbXNnLm9iai50b1N0cmluZygpIDogbnVsbDsKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiBJZiB3ZSd2ZSBleGNlZWRlZCB0aGUgbWF4aW11bSBudW1iZXIgb2YgcmV0cmllcyBmb3IgcmVjb25uZWN0aW5nCi0gICAgICAgICAgICAgICAgICogdG8gYSBnaXZlbiBuZXR3b3JrLCBkaXNhYmxlIHRoZSBuZXR3b3JrCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgaWYgKG1XaWZpSW5mby5nZXRTdXBwbGljYW50U3RhdGUoKSAhPSBTdXBwbGljYW50U3RhdGUuVU5JTklUSUFMSVpFRCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoKyttUmVjb25uZWN0Q291bnQgPiBnZXRNYXhEaGNwUmV0cmllcygpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoTE9DQUxfTE9HRCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkZhaWxlZCByZWNvbm5lY3QgY291bnQ6ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJlY29ubmVjdENvdW50ICsgIiBEaXNhYmxpbmcgIiArIEJTU0lEKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1XTS5kaXNhYmxlTmV0d29yayhtTGFzdE5ldHdvcmtJZCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmVjb25uZWN0Q29tbWFuZCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBFVkVOVF9JTlRFUkZBQ0VfQ09ORklHVVJBVElPTl9TVUNDRUVERUQ6Ci0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogU2luY2UgdGhpcyBldmVudCBpcyBzZW50IGZyb20gYW5vdGhlciB0aHJlYWQsIGl0IG1pZ2h0IGhhdmUgYmVlbgotICAgICAgICAgICAgICAgICAqIHNlbnQgYWZ0ZXIgd2UgY2xvc2VkIG91ciBjb25uZWN0aW9uIHRvIHRoZSBzdXBwbGljYW50IGluIHRoZSBjb3Vyc2UKLSAgICAgICAgICAgICAgICAgKiBvZiBkaXNhYmxpbmcgV2ktRmkuIEluIHRoYXQgY2FzZSwgd2Ugc2hvdWxkIGp1c3QgaWdub3JlIHRoZSBldmVudC4KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBpZiAobVdpZmlJbmZvLmdldFN1cHBsaWNhbnRTdGF0ZSgpID09IFN1cHBsaWNhbnRTdGF0ZS5VTklOSVRJQUxJWkVEKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtUmVjb25uZWN0Q291bnQgPSAwOwotICAgICAgICAgICAgICAgIG1IYXZlSXBBZGRyZXNzID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBtT2J0YWluaW5nSXBBZGRyZXNzID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgbVdpZmlJbmZvLnNldElwQWRkcmVzcyhtRGhjcEluZm8uaXBBZGRyZXNzKTsKLSAgICAgICAgICAgICAgICBtTGFzdFNpZ25hbExldmVsID0gLTE7IC8vIGZvcmNlIHVwZGF0ZSBvZiBzaWduYWwgc3RyZW5ndGgKLSAgICAgICAgICAgICAgICBpZiAobU5ldHdvcmtJbmZvLmdldERldGFpbGVkU3RhdGUoKSAhPSBEZXRhaWxlZFN0YXRlLkNPTk5FQ1RFRCkgewotICAgICAgICAgICAgICAgICAgICBzZXREZXRhaWxlZFN0YXRlKERldGFpbGVkU3RhdGUuQ09OTkVDVEVEKTsKLSAgICAgICAgICAgICAgICAgICAgc2VuZE5ldHdvcmtTdGF0ZUNoYW5nZUJyb2FkY2FzdChtV2lmaUluZm8uZ2V0QlNTSUQoKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbXNnID0gbVRhcmdldC5vYnRhaW5NZXNzYWdlKEVWRU5UX0NPTkZJR1VSQVRJT05fQ0hBTkdFRCwgbU5ldHdvcmtJbmZvKTsKLSAgICAgICAgICAgICAgICAgICAgbXNnLnNlbmRUb1RhcmdldCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoTE9DQUxfTE9HRCkgTG9nLnYoVEFHLCAiSVAgY29uZmlndXJhdGlvbjogIiArIG1EaGNwSW5mbyk7Ci0gICAgICAgICAgICAgICAgLy8gV2ktRmkgaW50ZXJmYWNlIGNvbmZpZ3VyYXRpb24gc3RhdGUgY2hhbmdlZDoKLSAgICAgICAgICAgICAgICAvLyBbMzEtIDFdIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlCi0gICAgICAgICAgICAgICAgLy8gWyAwLSAwXSBJbnRlcmZhY2UgY29uZmlndXJhdGlvbiBzdWNjZWVkZWQgKDEpIG9yIGZhaWxlZCAoMCkgICAKLSAgICAgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UTE9HX0lOVEVSRkFDRV9DT05GSUdVUkFUSU9OX1NUQVRFX0NIQU5HRUQsIDEpOwotCi0gICAgICAgICAgICAgICAgLy8gV2UndmUgY29ubmVjdGVkIHN1Y2Nlc3NmdWxseSwgc28gYWxsb3cgdGhlIG5vdGlmaWNhdGlvbiBhZ2FpbiBpbiB0aGUgZnV0dXJlCi0gICAgICAgICAgICAgICAgcmVzZXROb3RpZmljYXRpb25UaW1lcigpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIEVWRU5UX0lOVEVSRkFDRV9DT05GSUdVUkFUSU9OX0ZBSUxFRDoKLSAgICAgICAgICAgICAgICBpZiAobVdpZmlJbmZvLmdldFN1cHBsaWNhbnRTdGF0ZSgpICE9IFN1cHBsaWNhbnRTdGF0ZS5VTklOSVRJQUxJWkVEKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFdpLUZpIGludGVyZmFjZSBjb25maWd1cmF0aW9uIHN0YXRlIGNoYW5nZWQ6Ci0gICAgICAgICAgICAgICAgICAgIC8vIFszMS0gMV0gUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UKLSAgICAgICAgICAgICAgICAgICAgLy8gWyAwLSAwXSBJbnRlcmZhY2UgY29uZmlndXJhdGlvbiBzdWNjZWVkZWQgKDEpIG9yIGZhaWxlZCAoMCkKLSAgICAgICAgICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19JTlRFUkZBQ0VfQ09ORklHVVJBVElPTl9TVEFURV9DSEFOR0VELCAwKTsKLSAgICAgICAgICAgICAgICAgICAgbUhhdmVJcEFkZHJlc3MgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgbVdpZmlJbmZvLnNldElwQWRkcmVzcygwKTsKLSAgICAgICAgICAgICAgICAgICAgbU9idGFpbmluZ0lwQWRkcmVzcyA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBkaXNjb25uZWN0KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIEVWRU5UX0RSSVZFUl9TVEFURV9DSEFOR0VEOgotICAgICAgICAgICAgICAgIC8vIFdpLUZpIGRyaXZlciBzdGF0ZSBjaGFuZ2VkOgotICAgICAgICAgICAgICAgIC8vIDAgU1RBUlRFRAotICAgICAgICAgICAgICAgIC8vIDEgU1RPUFBFRAotICAgICAgICAgICAgICAgIC8vIDIgSFVORwotICAgICAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRVZFTlRMT0dfRFJJVkVSX1NUQVRFX0NIQU5HRUQsIG1zZy5hcmcxKTsKLQotICAgICAgICAgICAgICAgIHN3aXRjaCAobXNnLmFyZzEpIHsKLSAgICAgICAgICAgICAgICBjYXNlIERSSVZFUl9TVEFSVEVEOgotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICogU2V0IHRoZSBudW1iZXIgb2YgYWxsb3dlZCByYWRpbyBjaGFubmVscyBhY2NvcmRpbmcKLSAgICAgICAgICAgICAgICAgICAgICogdG8gdGhlIHN5c3RlbSBzZXR0aW5nLCBzaW5jZSBpdCBnZXRzIHJlc2V0IGJ5IHRoZQotICAgICAgICAgICAgICAgICAgICAgKiBkcml2ZXIgdXBvbiBjaGFuZ2luZyB0byB0aGUgU1RBUlRFRCBzdGF0ZS4KLSAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgIHNldE51bUFsbG93ZWRDaGFubmVscygpOwotICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtUnVuU3RhdGUgPT0gUlVOX1NUQVRFX1NUQVJUSU5HKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJ1blN0YXRlID0gUlVOX1NUQVRFX1JVTk5JTkc7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtSXNTY2FuT25seSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNvbm5lY3RDb21tYW5kKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW4gc29tZSBzaXR1YXRpb25zLCBzdXBwbGljYW50IG5lZWRzIHRvIGJlIGtpY2tzdGFydGVkIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0YXJ0IHRoZSBiYWNrZ3JvdW5kIHNjYW5uaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYW4odHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgRFJJVkVSX0hVTkc6Ci0gICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIldpZmkgRHJpdmVyIHJlcG9ydHMgSFVORyAtIHJlbG9hZGluZy4iKTsKLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAqIHJlc3RhcnQgdGhlIGRyaXZlciAtIHRvZ2dsZSBvZmYgYW5kIG9uCi0gICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICBtV00uc2V0V2lmaUVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICBtV00uc2V0V2lmaUVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBub3RlUnVuU3RhdGUoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBFVkVOVF9QQVNTV09SRF9LRVlfTUFZX0JFX0lOQ09SUkVDVDoKLSAgICAgICAgICAgICAgICBtUGFzc3dvcmRLZXlNYXlCZUluY29ycmVjdCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gd2lmaU1hbmFnZXJEaXNhYmxlTmV0d29yayhpbnQgbmV0d29ya0lkKSB7Ci0gICAgICAgIGJvb2xlYW4gZGlzYWJsZWROZXR3b3JrID0gZmFsc2U7Ci0gICAgICAgIGlmICgwIDw9IG5ldHdvcmtJZCkgewotICAgICAgICAgICAgZGlzYWJsZWROZXR3b3JrID0gbVdNLmRpc2FibGVOZXR3b3JrKG5ldHdvcmtJZCk7Ci0gICAgICAgICAgICBpZiAoTE9DQUxfTE9HRCkgewotICAgICAgICAgICAgICAgIGlmIChkaXNhYmxlZE5ldHdvcmspIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAiRGlzYWJsZWQgbmV0d29yazogIiArIG5ldHdvcmtJZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChMT0NBTF9MT0dEKSB7Ci0gICAgICAgICAgICBpZiAoIWRpc2FibGVkTmV0d29yaykgewotICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkZhaWxlZCB0byBkaXNhYmxlIG5ldHdvcms6IiArCi0gICAgICAgICAgICAgICAgICAgICAgIiBpbnZhbGlkIG5ldHdvcmsgaWQ6ICIgKyBuZXR3b3JrSWQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBkaXNhYmxlZE5ldHdvcms7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNvbmZpZ3VyZUludGVyZmFjZSgpIHsKLSAgICAgICAgY2hlY2tQb2xsVGltZXIoKTsKLSAgICAgICAgbUxhc3RTaWduYWxMZXZlbCA9IC0xOwotICAgICAgICBpZiAoIW1Vc2VTdGF0aWNJcCkgewotICAgICAgICAgICAgaWYgKCFtSGF2ZUlwQWRkcmVzcyAmJiAhbU9idGFpbmluZ0lwQWRkcmVzcykgewotICAgICAgICAgICAgICAgIG1PYnRhaW5pbmdJcEFkZHJlc3MgPSB0cnVlOwotICAgICAgICAgICAgICAgIG1EaGNwVGFyZ2V0LnNlbmRFbXB0eU1lc3NhZ2UoRVZFTlRfREhDUF9TVEFSVCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpbnQgZXZlbnQ7Ci0gICAgICAgICAgICBpZiAoTmV0d29ya1V0aWxzLmNvbmZpZ3VyZUludGVyZmFjZShtSW50ZXJmYWNlTmFtZSwgbURoY3BJbmZvKSkgewotICAgICAgICAgICAgICAgIG1IYXZlSXBBZGRyZXNzID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBldmVudCA9IEVWRU5UX0lOVEVSRkFDRV9DT05GSUdVUkFUSU9OX1NVQ0NFRURFRDsKLSAgICAgICAgICAgICAgICBpZiAoTE9DQUxfTE9HRCkgTG9nLnYoVEFHLCAiU3RhdGljIElQIGNvbmZpZ3VyYXRpb24gc3VjY2VlZGVkIik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1IYXZlSXBBZGRyZXNzID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgZXZlbnQgPSBFVkVOVF9JTlRFUkZBQ0VfQ09ORklHVVJBVElPTl9GQUlMRUQ7Ci0gICAgICAgICAgICAgICAgaWYgKExPQ0FMX0xPR0QpIExvZy52KFRBRywgIlN0YXRpYyBJUCBjb25maWd1cmF0aW9uIGZhaWxlZCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2VuZEVtcHR5TWVzc2FnZShldmVudCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXNldCBvdXIgSVAgc3RhdGUgYW5kIHNlbmQgb3V0IGJyb2FkY2FzdHMgZm9sbG93aW5nIGEgZGlzY29ubmVjdC4KLSAgICAgKiBAcGFyYW0gbmV3U3RhdGUgdGhlIHtAY29kZSBEZXRhaWxlZFN0YXRlfSB0byBzZXQuIFNob3VsZCBiZSBlaXRoZXIKLSAgICAgKiB7QGNvZGUgRElTQ09OTkVDVEVEfSBvciB7QGNvZGUgRkFJTEVEfS4KLSAgICAgKiBAcGFyYW0gZGlzYWJsZUludGVyZmFjZSBpbmRpY2F0ZXMgd2hldGhlciB0aGUgaW50ZXJmYWNlIHNob3VsZAotICAgICAqIGJlIGRpc2FibGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZURpc2Nvbm5lY3RlZFN0YXRlKERldGFpbGVkU3RhdGUgbmV3U3RhdGUsIGJvb2xlYW4gZGlzYWJsZUludGVyZmFjZSkgewotICAgICAgICBpZiAobURpc2Nvbm5lY3RQZW5kaW5nKSB7Ci0gICAgICAgICAgICBjYW5jZWxEaXNjb25uZWN0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgbURpc2Nvbm5lY3RFeHBlY3RlZCA9IGZhbHNlOwotICAgICAgICByZXNldENvbm5lY3Rpb25zKGRpc2FibGVJbnRlcmZhY2UpOwotICAgICAgICBzZXREZXRhaWxlZFN0YXRlKG5ld1N0YXRlKTsKLSAgICAgICAgc2VuZE5ldHdvcmtTdGF0ZUNoYW5nZUJyb2FkY2FzdChtTGFzdEJzc2lkKTsKLSAgICAgICAgbVdpZmlJbmZvLnNldEJTU0lEKG51bGwpOwotICAgICAgICBtTGFzdEJzc2lkID0gbnVsbDsKLSAgICAgICAgbUxhc3RTc2lkID0gbnVsbDsKLSAgICAgICAgbURpc2Nvbm5lY3RQZW5kaW5nID0gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVzZXRzIHRoZSBXaS1GaSBDb25uZWN0aW9ucyBieSBjbGVhcmluZyBhbnkgc3RhdGUsIHJlc2V0dGluZyBhbnkgc29ja2V0cwotICAgICAqIHVzaW5nIHRoZSBpbnRlcmZhY2UsIHN0b3BwaW5nIERIQ1AsIGFuZCBkaXNhYmxpbmcgdGhlIGludGVyZmFjZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZXNldENvbm5lY3Rpb25zKGJvb2xlYW4gZGlzYWJsZUludGVyZmFjZSkgewotICAgICAgICBpZiAoTE9DQUxfTE9HRCkgTG9nLmQoVEFHLCAiUmVzZXQgY29ubmVjdGlvbnMgYW5kIHN0b3BwaW5nIERIQ1AiKTsKLSAgICAgICAgbUhhdmVJcEFkZHJlc3MgPSBmYWxzZTsKLSAgICAgICAgbU9idGFpbmluZ0lwQWRkcmVzcyA9IGZhbHNlOwotICAgICAgICBtV2lmaUluZm8uc2V0SXBBZGRyZXNzKDApOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFJlc2V0IGNvbm5lY3Rpb24gZGVwZW5kcyBvbiBib3RoIHRoZSBpbnRlcmZhY2UgYW5kIHRoZSBJUCBhc3NpZ25lZCwKLSAgICAgICAgICogc28gaXQgc2hvdWxkIGJlIGRvbmUgYmVmb3JlIGFueSBjaGFuY2Ugb2YgdGhlIElQIGJlaW5nIGxvc3QuCi0gICAgICAgICAqLwotICAgICAgICBOZXR3b3JrVXRpbHMucmVzZXRDb25uZWN0aW9ucyhtSW50ZXJmYWNlTmFtZSk7Ci0KLSAgICAgICAgLy8gU3RvcCBESENQCi0gICAgICAgIGlmIChtRGhjcFRhcmdldCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtRGhjcFRhcmdldC5zZXRDYW5jZWxDYWxsYmFjayh0cnVlKTsKLSAgICAgICAgICAgIG1EaGNwVGFyZ2V0LnJlbW92ZU1lc3NhZ2VzKEVWRU5UX0RIQ1BfU1RBUlQpOwotICAgICAgICB9Ci0gICAgICAgIGlmICghTmV0d29ya1V0aWxzLnN0b3BEaGNwKG1JbnRlcmZhY2VOYW1lKSkgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAiQ291bGQgbm90IHN0b3AgREhDUCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEludGVyZmFjZSBpcyByZS1lbmFibGVkIGluIHRoZSBzdXBwbGljYW50Ci0gICAgICAgICAqIHdoZW4gbW92aW5nIG91dCBvZiBBU1NPQ0lBVElORyBzdGF0ZQotICAgICAgICAgKi8KLSAgICAgICAgaWYoZGlzYWJsZUludGVyZmFjZSkgewotICAgICAgICAgICAgaWYgKExPQ0FMX0xPR0QpIExvZy5kKFRBRywgIkRpc2FibGluZyBpbnRlcmZhY2UiKTsKLSAgICAgICAgICAgIE5ldHdvcmtVdGlscy5kaXNhYmxlSW50ZXJmYWNlKG1JbnRlcmZhY2VOYW1lKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSBzdXBwbGljYW50IGlzIHJlcG9ydGluZyB0aGF0IHdlIGFyZSBkaXNjb25uZWN0ZWQgZnJvbSB0aGUgY3VycmVudAotICAgICAqIGFjY2VzcyBwb2ludC4gT2Z0ZW4sIGhvd2V2ZXIsIGEgZGlzY29ubmVjdCB3aWxsIGJlIGZvbGxvd2VkIHZlcnkgc2hvcnRseQotICAgICAqIGJ5IGEgcmVjb25uZWN0IHRvIHRoZSBzYW1lIGFjY2VzcyBwb2ludC4gVGhlcmVmb3JlLCB3ZSBkZWxheSByZXNldHRpbmcKLSAgICAgKiB0aGUgY29ubmVjdGlvbidzIElQIHN0YXRlIGZvciBhIGJpdC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2NoZWR1bGVEaXNjb25uZWN0KCkgewotICAgICAgICBtRGlzY29ubmVjdFBlbmRpbmcgPSB0cnVlOwotICAgICAgICBpZiAoIWhhc01lc3NhZ2VzKEVWRU5UX0RFRkVSUkVEX0RJU0NPTk5FQ1QpKSB7Ci0gICAgICAgICAgICBzZW5kRW1wdHlNZXNzYWdlRGVsYXllZChFVkVOVF9ERUZFUlJFRF9ESVNDT05ORUNULCBESVNDT05ORUNUX0RFTEFZX01TRUNTKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjYW5jZWxEaXNjb25uZWN0KCkgewotICAgICAgICBtRGlzY29ubmVjdFBlbmRpbmcgPSBmYWxzZTsKLSAgICAgICAgcmVtb3ZlTWVzc2FnZXMoRVZFTlRfREVGRVJSRURfRElTQ09OTkVDVCk7Ci0gICAgfQotCi0gICAgcHVibGljIERoY3BJbmZvIGdldERoY3BJbmZvKCkgewotICAgICAgICByZXR1cm4gbURoY3BJbmZvOwotICAgIH0KLQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgTGlzdDxTY2FuUmVzdWx0PiBnZXRTY2FuUmVzdWx0c0xpc3QoKSB7Ci0gICAgICAgIHJldHVybiBtU2NhblJlc3VsdHM7Ci0gICAgfQotCi0gICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldFNjYW5SZXN1bHRzTGlzdChMaXN0PFNjYW5SZXN1bHQ+IHNjYW5MaXN0KSB7Ci0gICAgICAgIG1TY2FuUmVzdWx0cyA9IHNjYW5MaXN0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBzdGF0dXMgaW5mb3JtYXRpb24gZm9yIHRoZSBjdXJyZW50IGNvbm5lY3Rpb24sIGlmIGFueS4KLSAgICAgKiBAcmV0dXJuIGEge0BsaW5rIFdpZmlJbmZvfSBvYmplY3QgY29udGFpbmluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY3VycmVudCBjb25uZWN0aW9uCi0gICAgICovCi0gICAgcHVibGljIFdpZmlJbmZvIHJlcXVlc3RDb25uZWN0aW9uSW5mbygpIHsKLSAgICAgICAgcmVxdWVzdENvbm5lY3Rpb25TdGF0dXMobVdpZmlJbmZvKTsKLSAgICAgICAgcmVxdWVzdFBvbGxlZEluZm8obVdpZmlJbmZvLCBmYWxzZSk7Ci0gICAgICAgIHJldHVybiBtV2lmaUluZm87Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHJlcXVlc3RDb25uZWN0aW9uU3RhdHVzKFdpZmlJbmZvIGluZm8pIHsKLSAgICAgICAgU3RyaW5nIHJlcGx5ID0gc3RhdHVzKCk7Ci0gICAgICAgIGlmIChyZXBseSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgLyoKLSAgICAgICAgICogUGFyc2UgdGhlIHJlcGx5IGZyb20gdGhlIHN1cHBsaWNhbnQgdG8gdGhlIHN0YXR1cyBjb21tYW5kLCBhbmQgdXBkYXRlCi0gICAgICAgICAqIGxvY2FsIHN0YXRlIGFjY29yZGluZ2x5LiBUaGUgcmVwbHkgaXMgYSBzZXJpZXMgb2YgbGluZXMgb2YgdGhlIGZvcm0KLSAgICAgICAgICogIm5hbWU9dmFsdWUiLgotICAgICAgICAgKi8KLSAgICAgICAgU3RyaW5nIFNTSUQgPSBudWxsOwotICAgICAgICBTdHJpbmcgQlNTSUQgPSBudWxsOwotICAgICAgICBTdHJpbmcgc3VwcFN0YXRlID0gbnVsbDsKLSAgICAgICAgaW50IG5ldElkID0gLTE7Ci0gICAgICAgIFN0cmluZ1tdIGxpbmVzID0gcmVwbHkuc3BsaXQoIlxuIik7Ci0gICAgICAgIGZvciAoU3RyaW5nIGxpbmUgOiBsaW5lcykgewotICAgICAgICAgICAgU3RyaW5nW10gcHJvcCA9IGxpbmUuc3BsaXQoIiAqPSAqIiwgMik7Ci0gICAgICAgICAgICBpZiAocHJvcC5sZW5ndGggPCAyKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBwcm9wWzBdOwotICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gcHJvcFsxXTsKLSAgICAgICAgICAgIGlmIChuYW1lLmVxdWFsc0lnbm9yZUNhc2UoImlkIikpCi0gICAgICAgICAgICAgICAgbmV0SWQgPSBJbnRlZ2VyLnBhcnNlSW50KHZhbHVlKTsKLSAgICAgICAgICAgIGVsc2UgaWYgKG5hbWUuZXF1YWxzSWdub3JlQ2FzZSgic3NpZCIpKQotICAgICAgICAgICAgICAgIFNTSUQgPSB2YWx1ZTsKLSAgICAgICAgICAgIGVsc2UgaWYgKG5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiYnNzaWQiKSkKLSAgICAgICAgICAgICAgICBCU1NJRCA9IHZhbHVlOwotICAgICAgICAgICAgZWxzZSBpZiAobmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJ3cGFfc3RhdGUiKSkKLSAgICAgICAgICAgICAgICBzdXBwU3RhdGUgPSB2YWx1ZTsKLSAgICAgICAgfQotICAgICAgICBpbmZvLnNldE5ldHdvcmtJZChuZXRJZCk7Ci0gICAgICAgIGluZm8uc2V0U1NJRChTU0lEKTsKLSAgICAgICAgaW5mby5zZXRCU1NJRChCU1NJRCk7Ci0gICAgICAgIC8qCi0gICAgICAgICAqIFdlIG9ubHkgc2V0IHRoZSBzdXBwbGljYW50IHN0YXRlIGlmIHRoZSBwcmV2aW91cyBzdGF0ZSB3YXMKLSAgICAgICAgICogVU5JTklUSUFMSVpFRC4gVGhpcyBzaG91bGQgb25seSBoYXBwZW4gd2hlbiB3ZSBmaXJzdCBjb25uZWN0IHRvCi0gICAgICAgICAqIHRoZSBzdXBwbGljYW50LiBPbmNlIHdlJ3JlIGNvbm5lY3RlZCwgd2Ugc2hvdWxkIGFsd2F5cyByZWNlaXZlCi0gICAgICAgICAqIGFuIGV2ZW50IHVwb24gYW55IHN0YXRlIGNoYW5nZSwgYnV0IGluIHRoaXMgY2FzZSwgd2Ugd2FudCB0bwotICAgICAgICAgKiBtYWtlIHN1cmUgYW55IGxpc3RlbmVycyBhcmUgbWFkZSBhd2FyZSBvZiB0aGUgc3RhdGUgY2hhbmdlLgotICAgICAgICAgKi8KLSAgICAgICAgaWYgKG1XaWZpSW5mby5nZXRTdXBwbGljYW50U3RhdGUoKSA9PSBTdXBwbGljYW50U3RhdGUuVU5JTklUSUFMSVpFRCAmJiBzdXBwU3RhdGUgIT0gbnVsbCkKLSAgICAgICAgICAgIHNldFN1cHBsaWNhbnRTdGF0ZShzdXBwU3RhdGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgZHluYW1pYyBpbmZvcm1hdGlvbiB0aGF0IGlzIG5vdCByZXBvcnRlZCB2aWEgZXZlbnRzLgotICAgICAqIEBwYXJhbSBpbmZvIHRoZSBvYmplY3QgaW50byB3aGljaCB0aGUgaW5mb3JtYXRpb24gc2hvdWxkIGJlIGNhcHR1cmVkLgotICAgICAqLwotICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgcmVxdWVzdFBvbGxlZEluZm8oV2lmaUluZm8gaW5mbywgYm9vbGVhbiBwb2xsaW5nKQotICAgIHsKLSAgICAgICAgaW50IG5ld1Jzc2kgPSAocG9sbGluZyA/IGdldFJzc2lBcHByb3goKSA6IGdldFJzc2koKSk7Ci0gICAgICAgIGlmIChuZXdSc3NpICE9IC0xICYmIC0yMDAgPCBuZXdSc3NpICYmIG5ld1Jzc2kgPCAyNTYpIHsgLy8gc2NyZWVuIG91dCBpbnZhbGlkIHZhbHVlcwotICAgICAgICAgICAgLyogc29tZSBpbXBsZW1lbnRhdGlvbnMgYXZvaWQgbmVnYXRpdmUgdmFsdWVzIGJ5IGFkZGluZyAyNTYKLSAgICAgICAgICAgICAqIHNvIHdlIG5lZWQgdG8gYWRqdXN0IGZvciB0aGF0IGhlcmUuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmIChuZXdSc3NpID4gMCkgbmV3UnNzaSAtPSAyNTY7Ci0gICAgICAgICAgICBpbmZvLnNldFJzc2kobmV3UnNzaSk7Ci0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogUmF0aGVyIHRoZW4gc2VuZGluZyB0aGUgcmF3IFJTU0kgb3V0IGV2ZXJ5IHRpbWUgaXQKLSAgICAgICAgICAgICAqIGNoYW5nZXMsIHdlIHByZWNhbGN1bGF0ZSB0aGUgc2lnbmFsIGxldmVsIHRoYXQgd291bGQKLSAgICAgICAgICAgICAqIGJlIGRpc3BsYXllZCBpbiB0aGUgc3RhdHVzIGJhciwgYW5kIG9ubHkgc2VuZCB0aGUKLSAgICAgICAgICAgICAqIGJyb2FkY2FzdCBpZiB0aGF0IG11Y2ggbW9yZSBjb2Fyc2UtZ3JhaW5lZCBudW1iZXIKLSAgICAgICAgICAgICAqIGNoYW5nZXMuIFRoaXMgY3V0cyBkb3duIGdyZWF0bHkgb24gdGhlIG51bWJlciBvZgotICAgICAgICAgICAgICogYnJvYWRjYXN0cywgYXQgdGhlIGNvc3Qgb2Ygbm90IGluZm9ybWluZyBvdGhlcnMKLSAgICAgICAgICAgICAqIGludGVyZXN0ZWQgaW4gUlNTSSBvZiBhbGwgdGhlIGNoYW5nZXMgaW4gc2lnbmFsCi0gICAgICAgICAgICAgKiBsZXZlbC4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgLy8gVE9ETzogVGhlIHNlY29uZCBhcmcgdG8gdGhlIGNhbGwgYmVsb3cgbmVlZHMgdG8gYmUgYSBzeW1ib2wgc29tZXdoZXJlLCBidXQKLSAgICAgICAgICAgIC8vIGl0J3MgYWN0dWFsbHkgdGhlIHNpemUgb2YgYW4gYXJyYXkgb2YgaWNvbnMgdGhhdCdzIHByaXZhdGUKLSAgICAgICAgICAgIC8vIHRvIFN0YXR1c0JhciBQb2xpY3kuCi0gICAgICAgICAgICBpbnQgbmV3U2lnbmFsTGV2ZWwgPSBXaWZpTWFuYWdlci5jYWxjdWxhdGVTaWduYWxMZXZlbChuZXdSc3NpLCA0KTsKLSAgICAgICAgICAgIGlmIChuZXdTaWduYWxMZXZlbCAhPSBtTGFzdFNpZ25hbExldmVsKSB7Ci0gICAgICAgICAgICAgICAgc2VuZFJzc2lDaGFuZ2VCcm9hZGNhc3QobmV3UnNzaSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtTGFzdFNpZ25hbExldmVsID0gbmV3U2lnbmFsTGV2ZWw7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpbmZvLnNldFJzc2koLTIwMCk7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IG5ld0xpbmtTcGVlZCA9IGdldExpbmtTcGVlZCgpOwotICAgICAgICBpZiAobmV3TGlua1NwZWVkICE9IC0xKSB7Ci0gICAgICAgICAgICBpbmZvLnNldExpbmtTcGVlZChuZXdMaW5rU3BlZWQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNlbmRSc3NpQ2hhbmdlQnJvYWRjYXN0KGZpbmFsIGludCBuZXdSc3NpKSB7Ci0gICAgICAgIGlmIChBY3Rpdml0eU1hbmFnZXJOYXRpdmUuaXNTeXN0ZW1SZWFkeSgpKSB7Ci0gICAgICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChXaWZpTWFuYWdlci5SU1NJX0NIQU5HRURfQUNUSU9OKTsKLSAgICAgICAgICAgIGludGVudC5wdXRFeHRyYShXaWZpTWFuYWdlci5FWFRSQV9ORVdfUlNTSSwgbmV3UnNzaSk7Ci0gICAgICAgICAgICBtQ29udGV4dC5zZW5kQnJvYWRjYXN0KGludGVudCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2VuZE5ldHdvcmtTdGF0ZUNoYW5nZUJyb2FkY2FzdChTdHJpbmcgYnNzaWQpIHsKLSAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoV2lmaU1hbmFnZXIuTkVUV09SS19TVEFURV9DSEFOR0VEX0FDVElPTik7Ci0gICAgICAgIGludGVudC5hZGRGbGFncyhJbnRlbnQuRkxBR19SRUNFSVZFUl9SRUdJU1RFUkVEX09OTFlfQkVGT1JFX0JPT1QKLSAgICAgICAgICAgICAgICB8IEludGVudC5GTEFHX1JFQ0VJVkVSX1JFUExBQ0VfUEVORElORyk7Ci0gICAgICAgIGludGVudC5wdXRFeHRyYShXaWZpTWFuYWdlci5FWFRSQV9ORVRXT1JLX0lORk8sIG1OZXR3b3JrSW5mbyk7Ci0gICAgICAgIGlmIChic3NpZCAhPSBudWxsKQotICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKFdpZmlNYW5hZ2VyLkVYVFJBX0JTU0lELCBic3NpZCk7Ci0gICAgICAgIG1Db250ZXh0LnNlbmRTdGlja3lCcm9hZGNhc3QoaW50ZW50KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEaXNhYmxlIFdpLUZpIGNvbm5lY3Rpdml0eSBieSBzdG9wcGluZyB0aGUgZHJpdmVyLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHRlYXJkb3duKCkgewotICAgICAgICBpZiAoIW1Ub3JuRG93bkJ5Q29ubk1ncikgewotICAgICAgICAgICAgaWYgKGRpc2Nvbm5lY3RBbmRTdG9wKCkpIHsKLSAgICAgICAgICAgICAgICBzZXRUb3JuRG93bkJ5Q29ubk1ncih0cnVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWVuYWJsZSBXaS1GaSBjb25uZWN0aXZpdHkgYnkgcmVzdGFydGluZyB0aGUgZHJpdmVyLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHJlY29ubmVjdCgpIHsKLSAgICAgICAgaWYgKG1Ub3JuRG93bkJ5Q29ubk1ncikgewotICAgICAgICAgICAgaWYgKHJlc3RhcnQoKSkgewotICAgICAgICAgICAgICAgIHNldFRvcm5Eb3duQnlDb25uTWdyKGZhbHNlKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXZSB3YW50IHRvIHN0b3AgdGhlIGRyaXZlciwgYnV0IGlmIHdlJ3JlIGNvbm5lY3RlZCB0byBhIG5ldHdvcmssCi0gICAgICogd2UgZmlyc3Qgd2FudCB0byBkaXNjb25uZWN0LCBzbyB0aGF0IHRoZSBzdXBwbGljYW50IGlzIGFsd2F5cyBpbgotICAgICAqIGEga25vd24gc3RhdGUgKERJU0NPTk5FQ1RFRCkgd2hlbiB0aGUgZHJpdmVyIGlzIHN0b3BwZWQuCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcywgd2hpY2ggbWVhbnMgdGhhdCB0aGUKLSAgICAgKiBkaXNjb25uZWN0IG9yIHN0b3AgY29tbWFuZCB3YXMgaW5pdGlhdGVkLgotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBkaXNjb25uZWN0QW5kU3RvcCgpIHsKLSAgICAgICAgYm9vbGVhbiByZXQgPSB0cnVlOzsKLSAgICAgICAgaWYgKG1SdW5TdGF0ZSAhPSBSVU5fU1RBVEVfU1RPUFBJTkcgJiYgbVJ1blN0YXRlICE9IFJVTl9TVEFURV9TVE9QUEVEKSB7Ci0gICAgICAgICAgICAvLyBUYWtlIGRvd24gYW55IG9wZW4gbmV0d29yayBub3RpZmljYXRpb25zCi0gICAgICAgICAgICBzZXROb3RpZmljYXRpb25WaXNpYmxlKGZhbHNlLCAwLCBmYWxzZSwgMCk7Ci0KLSAgICAgICAgICAgIGlmIChtV2lmaUluZm8uZ2V0U3VwcGxpY2FudFN0YXRlKCkgPT0gU3VwcGxpY2FudFN0YXRlLkRPUk1BTlQpIHsKLSAgICAgICAgICAgICAgICByZXQgPSBzdG9wRHJpdmVyKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldCA9IGRpc2Nvbm5lY3QoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1SdW5TdGF0ZSA9IFJVTl9TVEFURV9TVE9QUElORzsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiByZXN0YXJ0KCkgewotICAgICAgICBpZiAobVJ1blN0YXRlID09IFJVTl9TVEFURV9TVE9QUEVEKSB7Ci0gICAgICAgICAgICBtUnVuU3RhdGUgPSBSVU5fU1RBVEVfU1RBUlRJTkc7Ci0gICAgICAgICAgICByZXNldENvbm5lY3Rpb25zKHRydWUpOwotICAgICAgICAgICAgcmV0dXJuIHN0YXJ0RHJpdmVyKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAobVJ1blN0YXRlID09IFJVTl9TVEFURV9TVE9QUElORykgewotICAgICAgICAgICAgbVJ1blN0YXRlID0gUlVOX1NUQVRFX1NUQVJUSU5HOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0V2lmaVN0YXRlKCkgewotICAgICAgICByZXR1cm4gbVdpZmlTdGF0ZS5nZXQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRXaWZpU3RhdGUoaW50IHdpZmlTdGF0ZSkgewotICAgICAgICBtV2lmaVN0YXRlLnNldCh3aWZpU3RhdGUpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzQW55TmV0d29ya0Rpc2FibGVkKCkgewotICAgICAgICByZXR1cm4gbUlzQW55TmV0d29ya0Rpc2FibGVkLmdldCgpOwotICAgIH0KLQotICAgLyoqCi0gICAgICogVGhlIFdpZmlOYXRpdmUgaW50ZXJmYWNlIGZ1bmN0aW9ucyBhcmUgbGlzdGVkIGJlbG93LgotICAgICAqIFRoZSBvbmx5IG5hdGl2ZSBjYWxsIHRoYXQgaXMgbm90IHN5bmNocm9uaXplZCBvbgotICAgICAqIFdpZmlTdGF0ZVRyYWNrZXIgaXMgd2FpdEZvckV2ZW50KCkgd2hpY2ggd2FpdHMgb24gYQotICAgICAqIHNlcGVyYXRlIG1vbml0b3IgY2hhbm5lbC4KLSAgICAgKgotICAgICAqIEFsbCBzdXBwbGljYW50IGNvbW1hbmRzIG5lZWQgdGhlIHdpZmkgdG8gYmUgaW4gYW4KLSAgICAgKiBlbmFibGVkIHN0YXRlLiBUaGlzIGNhbiBiZSBkb25lIGJ5IGNoZWNraW5nIHRoZQotICAgICAqIG1XaWZpU3RhdGUgdG8gYmUgV0lGSV9TVEFURV9FTkFCTEVELgotICAgICAqCi0gICAgICogQWxsIGNvbW1hbmRzIHRoYXQgY2FuIGNhdXNlIGNvbW1hbmRzIHRvIGRyaXZlcgotICAgICAqIGluaXRpYXRlZCBuZWVkIHRoZSBkcml2ZXIgc3RhdGUgdG8gYmUgc3RhcnRlZC4KLSAgICAgKiBUaGlzIGlzIGRvbmUgYnkgY2hlY2tpbmcgaXNEcml2ZXJTdG9wcGVkKCkgdG8KLSAgICAgKiBiZSBmYWxzZS4KLSAgICAgKi8KLQotICAgIC8qKgotICAgICAqIExvYWQgdGhlIGRyaXZlciBhbmQgZmlybXdhcmUKLSAgICAgKgotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGxvYWREcml2ZXIoKSB7Ci0gICAgICAgIHJldHVybiBXaWZpTmF0aXZlLmxvYWREcml2ZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVbmxvYWQgdGhlIGRyaXZlciBhbmQgZmlybXdhcmUKLSAgICAgKgotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHVubG9hZERyaXZlcigpIHsKLSAgICAgICAgcmV0dXJuIFdpZmlOYXRpdmUudW5sb2FkRHJpdmVyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2sgdGhlIHN1cHBsaWNhbnQgY29uZmlnIGFuZAotICAgICAqIHN0YXJ0IHRoZSBzdXBwbGljYW50IGRhZW1vbgotICAgICAqCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcywge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gc3RhcnRTdXBwbGljYW50KCkgewotICAgICAgICByZXR1cm4gV2lmaU5hdGl2ZS5zdGFydFN1cHBsaWNhbnQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTdG9wIHRoZSBzdXBwbGljYW50IGRhZW1vbgotICAgICAqCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcywge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gc3RvcFN1cHBsaWNhbnQoKSB7Ci0gICAgICAgIHJldHVybiBXaWZpTmF0aXZlLnN0b3BTdXBwbGljYW50KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRXN0YWJsaXNoZXMgdHdvIGNoYW5uZWxzIC0gY29udHJvbCBjaGFubmVsIGZvciBjb21tYW5kcwotICAgICAqIGFuZCBtb25pdG9yIGNoYW5uZWwgZm9yIG5vdGlmeWluZyBXaWZpTW9uaXRvcgotICAgICAqCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcywge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gY29ubmVjdFRvU3VwcGxpY2FudCgpIHsKLSAgICAgICAgcmV0dXJuIFdpZmlOYXRpdmUuY29ubmVjdFRvU3VwcGxpY2FudCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENsb3NlIHRoZSBjb250cm9sL21vbml0b3IgY2hhbm5lbHMgdG8gc3VwcGxpY2FudAotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBjbG9zZVN1cHBsaWNhbnRDb25uZWN0aW9uKCkgewotICAgICAgICBXaWZpTmF0aXZlLmNsb3NlU3VwcGxpY2FudENvbm5lY3Rpb24oKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVjayBpZiB0aGUgc3VwcGxpY2FudCBpcyBhbGl2ZQotICAgICAqCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcywge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gcGluZygpIHsKLSAgICAgICAgaWYgKG1XaWZpU3RhdGUuZ2V0KCkgIT0gV0lGSV9TVEFURV9FTkFCTEVEKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFdpZmlOYXRpdmUucGluZ0NvbW1hbmQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBpbml0aWF0ZSBhbiBhY3RpdmUgb3IgcGFzc2l2ZSBzY2FuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZm9yY2VBY3RpdmUgdHJ1ZSBpZiBpdCBpcyBhIGFjdGl2ZSBzY2FuCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcywge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gc2Nhbihib29sZWFuIGZvcmNlQWN0aXZlKSB7Ci0gICAgICAgIGlmIChtV2lmaVN0YXRlLmdldCgpICE9IFdJRklfU1RBVEVfRU5BQkxFRCB8fCBpc0RyaXZlclN0b3BwZWQoKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBXaWZpTmF0aXZlLnNjYW5Db21tYW5kKGZvcmNlQWN0aXZlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTcGVjaWZpZXMgd2hldGhlciB0aGUgc3VwcGxpY2FudCBvciBkcml2ZXIKLSAgICAgKiB0YWtlIGNhcmUgb2YgaW5pdGlhdGluZyBzY2FuIGFuZCBkb2luZyBBUCBzZWxlY3Rpb24KLSAgICAgKgotICAgICAqIEBwYXJhbSBtb2RlCi0gICAgICogICAgU1VQUExfU0NBTl9IQU5ETElOR19OT1JNQUwKLSAgICAgKiAgICBTVVBQTF9TQ0FOX0hBTkRMSU5HX0xJU1RfT05MWQotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHNldFNjYW5SZXN1bHRIYW5kbGluZyhpbnQgbW9kZSkgewotICAgICAgICBpZiAobVdpZmlTdGF0ZS5nZXQoKSAhPSBXSUZJX1NUQVRFX0VOQUJMRUQpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gV2lmaU5hdGl2ZS5zZXRTY2FuUmVzdWx0SGFuZGxpbmdDb21tYW5kKG1vZGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZldGNoIHRoZSBzY2FuIHJlc3VsdHMgZnJvbSB0aGUgc3VwcGxpY2FudAotICAgICAqCi0gICAgICogQHJldHVybiBleGFtcGxlIHJlc3VsdCBzdHJpbmcKLSAgICAgKiAwMDpiYjpjYzpkZDpjYzplZSAgICAgICAyNDI3ICAgIDE2NiAgICAgW1dQQS1FQVAtVEtJUF1bV1BBMi1FQVAtQ0NNUF0gICBOZXQxCi0gICAgICogMDA6YmI6Y2M6ZGQ6Y2M6ZmYgICAgICAgMjQxMiAgICAxNjUgICAgIFtXUEEtRUFQLVRLSVBdW1dQQTItRUFQLUNDTVBdICAgTmV0MgotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgU3RyaW5nIHNjYW5SZXN1bHRzKCkgewotICAgICAgICBpZiAobVdpZmlTdGF0ZS5nZXQoKSAhPSBXSUZJX1NUQVRFX0VOQUJMRUQgfHwgaXNEcml2ZXJTdG9wcGVkKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBXaWZpTmF0aXZlLnNjYW5SZXN1bHRzQ29tbWFuZCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgc2NhbiBtb2RlIC0gYWN0aXZlIG9yIHBhc3NpdmUKLSAgICAgKgotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHNldFNjYW5Nb2RlKGJvb2xlYW4gaXNTY2FuTW9kZUFjdGl2ZSkgewotICAgICAgICBpZiAobVdpZmlTdGF0ZS5nZXQoKSAhPSBXSUZJX1NUQVRFX0VOQUJMRUQgfHwgaXNEcml2ZXJTdG9wcGVkKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBpZiAobUlzU2Nhbk1vZGVBY3RpdmUgIT0gaXNTY2FuTW9kZUFjdGl2ZSkgewotICAgICAgICAgICAgcmV0dXJuIFdpZmlOYXRpdmUuc2V0U2Nhbk1vZGVDb21tYW5kKG1Jc1NjYW5Nb2RlQWN0aXZlID0gaXNTY2FuTW9kZUFjdGl2ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGlzY29ubmVjdCBmcm9tIEFjY2VzcyBQb2ludAotICAgICAqCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcywge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gZGlzY29ubmVjdCgpIHsKLSAgICAgICAgaWYgKG1XaWZpU3RhdGUuZ2V0KCkgIT0gV0lGSV9TVEFURV9FTkFCTEVEIHx8IGlzRHJpdmVyU3RvcHBlZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFdpZmlOYXRpdmUuZGlzY29ubmVjdENvbW1hbmQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbml0aWF0ZSBhIHJlY29ubmVjdGlvbiB0byBBUAotICAgICAqCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcywge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gcmVjb25uZWN0Q29tbWFuZCgpIHsKLSAgICAgICAgaWYgKG1XaWZpU3RhdGUuZ2V0KCkgIT0gV0lGSV9TVEFURV9FTkFCTEVEIHx8IGlzRHJpdmVyU3RvcHBlZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFdpZmlOYXRpdmUucmVjb25uZWN0Q29tbWFuZCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZCBhIG5ldHdvcmsKLSAgICAgKgotICAgICAqIEByZXR1cm4gbmV0d29yayBpZCBvZiB0aGUgbmV3IG5ldHdvcmsKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGludCBhZGROZXR3b3JrKCkgewotICAgICAgICBpZiAobVdpZmlTdGF0ZS5nZXQoKSAhPSBXSUZJX1NUQVRFX0VOQUJMRUQpIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gV2lmaU5hdGl2ZS5hZGROZXR3b3JrQ29tbWFuZCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERlbGV0ZSBhIG5ldHdvcmsKLSAgICAgKgotICAgICAqIEBwYXJhbSBuZXR3b3JrSWQgaWQgb2YgdGhlIG5ldHdvcmsgdG8gYmUgcmVtb3ZlZAotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHJlbW92ZU5ldHdvcmsoaW50IG5ldHdvcmtJZCkgewotICAgICAgICBpZiAobVdpZmlTdGF0ZS5nZXQoKSAhPSBXSUZJX1NUQVRFX0VOQUJMRUQpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbURpc2Nvbm5lY3RFeHBlY3RlZCA9IFdpZmlOYXRpdmUucmVtb3ZlTmV0d29ya0NvbW1hbmQobmV0d29ya0lkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFbmFibGUgYSBuZXR3b3JrCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmV0SWQgbmV0d29yayBpZCBvZiB0aGUgbmV0d29yawotICAgICAqIEBwYXJhbSBkaXNhYmxlT3RoZXJzIHRydWUsIGlmIGFsbCBvdGhlciBuZXR3b3JrcyBoYXZlIHRvIGJlIGRpc2FibGVkCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcywge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gZW5hYmxlTmV0d29yayhpbnQgbmV0SWQsIGJvb2xlYW4gZGlzYWJsZU90aGVycykgewotICAgICAgICBpZiAobVdpZmlTdGF0ZS5nZXQoKSAhPSBXSUZJX1NUQVRFX0VOQUJMRUQpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZGlzYWJsZU90aGVycykgbUlzQW55TmV0d29ya0Rpc2FibGVkLnNldCh0cnVlKTsKLSAgICAgICAgcmV0dXJuIFdpZmlOYXRpdmUuZW5hYmxlTmV0d29ya0NvbW1hbmQobmV0SWQsIGRpc2FibGVPdGhlcnMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEVuYWJsZSBhbGwgbmV0d29ya3MKLSAgICAgKgotICAgICAqIEBwYXJhbSBuZXR3b3JrcyBsaXN0IG9mIGNvbmZpZ3VyZWQgbmV0d29ya3MKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgZW5hYmxlQWxsTmV0d29ya3MoTGlzdDxXaWZpQ29uZmlndXJhdGlvbj4gbmV0d29ya3MpIHsKLSAgICAgICAgaWYgKG1XaWZpU3RhdGUuZ2V0KCkgIT0gV0lGSV9TVEFURV9FTkFCTEVEKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgbUlzQW55TmV0d29ya0Rpc2FibGVkLnNldChmYWxzZSk7Ci0gICAgICAgIGZvciAoV2lmaUNvbmZpZ3VyYXRpb24gY29uZmlnIDogbmV0d29ya3MpIHsKLSAgICAgICAgICAgIGlmIChjb25maWcuc3RhdHVzID09IFdpZmlDb25maWd1cmF0aW9uLlN0YXR1cy5ESVNBQkxFRCkgewotICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUuZW5hYmxlTmV0d29ya0NvbW1hbmQoY29uZmlnLm5ldHdvcmtJZCwgZmFsc2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGlzYWJsZSBhIG5ldHdvcmsKLSAgICAgKgotICAgICAqIEBwYXJhbSBuZXRJZCBuZXR3b3JrIGlkIG9mIHRoZSBuZXR3b3JrCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcywge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gZGlzYWJsZU5ldHdvcmsoaW50IG5ldElkKSB7Ci0gICAgICAgIGlmIChtV2lmaVN0YXRlLmdldCgpICE9IFdJRklfU1RBVEVfRU5BQkxFRCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIG1Jc0FueU5ldHdvcmtEaXNhYmxlZC5zZXQodHJ1ZSk7Ci0gICAgICAgIHJldHVybiBXaWZpTmF0aXZlLmRpc2FibGVOZXR3b3JrQ29tbWFuZChuZXRJZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5pdGlhdGUgYSByZS1hc3NvY2lhdGlvbiBpbiBzdXBwbGljYW50Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZQotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiByZWFzc29jaWF0ZSgpIHsKLSAgICAgICAgaWYgKG1XaWZpU3RhdGUuZ2V0KCkgIT0gV0lGSV9TVEFURV9FTkFCTEVEIHx8IGlzRHJpdmVyU3RvcHBlZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFdpZmlOYXRpdmUucmVhc3NvY2lhdGVDb21tYW5kKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQmxhY2tsaXN0IGEgQlNTSUQuIFRoaXMgd2lsbCBhdm9pZCB0aGUgQVAgaWYgdGhlcmUgYXJlCi0gICAgICogYWx0ZXJuYXRlIEFQcyB0byBjb25uZWN0Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gYnNzaWQgQlNTSUQgb2YgdGhlIG5ldHdvcmsKLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZQotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBhZGRUb0JsYWNrbGlzdChTdHJpbmcgYnNzaWQpIHsKLSAgICAgICAgaWYgKG1XaWZpU3RhdGUuZ2V0KCkgIT0gV0lGSV9TVEFURV9FTkFCTEVEKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFdpZmlOYXRpdmUuYWRkVG9CbGFja2xpc3RDb21tYW5kKGJzc2lkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDbGVhciB0aGUgYmxhY2tsaXN0IGxpc3QKLSAgICAgKgotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGNsZWFyQmxhY2tsaXN0KCkgewotICAgICAgICBpZiAobVdpZmlTdGF0ZS5nZXQoKSAhPSBXSUZJX1NUQVRFX0VOQUJMRUQpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gV2lmaU5hdGl2ZS5jbGVhckJsYWNrbGlzdENvbW1hbmQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBMaXN0IGFsbCBjb25maWd1cmVkIG5ldHdvcmtzCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGxpc3Qgb2YgbmV0d29ya3Mgb3IgbnVsbCBvbiBmYWlsdXJlCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBTdHJpbmcgbGlzdE5ldHdvcmtzKCkgewotICAgICAgICBpZiAobVdpZmlTdGF0ZS5nZXQoKSAhPSBXSUZJX1NUQVRFX0VOQUJMRUQpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBXaWZpTmF0aXZlLmxpc3ROZXR3b3Jrc0NvbW1hbmQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgbmV0d29yayBzZXR0aW5nIGJ5IG5hbWUKLSAgICAgKgotICAgICAqIEBwYXJhbSBuZXRJZCBuZXR3b3JrIGlkIG9mIHRoZSBuZXR3b3JrCi0gICAgICogQHBhcmFtIG5hbWUgbmV0d29yayB2YXJpYWJsZSBrZXkKLSAgICAgKiBAcmV0dXJuIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8ga2V5Ci0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBTdHJpbmcgZ2V0TmV0d29ya1ZhcmlhYmxlKGludCBuZXRJZCwgU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgaWYgKG1XaWZpU3RhdGUuZ2V0KCkgIT0gV0lGSV9TVEFURV9FTkFCTEVEKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gV2lmaU5hdGl2ZS5nZXROZXR3b3JrVmFyaWFibGVDb21tYW5kKG5ldElkLCBuYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgbmV0d29yayBzZXR0aW5nIGJ5IG5hbWUKLSAgICAgKgotICAgICAqIEBwYXJhbSBuZXRJZCBuZXR3b3JrIGlkIG9mIHRoZSBuZXR3b3JrCi0gICAgICogQHBhcmFtIG5hbWUgbmV0d29yayB2YXJpYWJsZSBrZXkKLSAgICAgKiBAcGFyYW0gdmFsdWUgbmV0d29yayB2YXJpYWJsZSB2YWx1ZQotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHNldE5ldHdvcmtWYXJpYWJsZShpbnQgbmV0SWQsIFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgaWYgKG1XaWZpU3RhdGUuZ2V0KCkgIT0gV0lGSV9TVEFURV9FTkFCTEVEKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFdpZmlOYXRpdmUuc2V0TmV0d29ya1ZhcmlhYmxlQ29tbWFuZChuZXRJZCwgbmFtZSwgdmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBkZXRhaWxlZCBzdGF0dXMgb2YgdGhlIGNvbm5lY3Rpb24KLSAgICAgKgotICAgICAqIEByZXR1cm4gRXhhbXBsZSBzdGF0dXMgcmVzdWx0Ci0gICAgICogIGJzc2lkPWFhOmJiOmNjOmRkOmVlOmZmCi0gICAgICogIHNzaWQ9VGVzdE5ldAotICAgICAqICBpZD0zCi0gICAgICogIHBhaXJ3aXNlX2NpcGhlcj1OT05FCi0gICAgICogIGdyb3VwX2NpcGhlcj1OT05FCi0gICAgICogIGtleV9tZ210PU5PTkUKLSAgICAgKiAgd3BhX3N0YXRlPUNPTVBMRVRFRAotICAgICAqICBpcF9hZGRyZXNzPVguWC5YLlgKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIFN0cmluZyBzdGF0dXMoKSB7Ci0gICAgICAgIGlmIChtV2lmaVN0YXRlLmdldCgpICE9IFdJRklfU1RBVEVfRU5BQkxFRCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFdpZmlOYXRpdmUuc3RhdHVzQ29tbWFuZCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBSU1NJIHRvIGN1cnJlbnRseSBjb25uZWN0ZWQgbmV0d29yawotICAgICAqCi0gICAgICogQHJldHVybiBSU1NJIHZhbHVlLCAtMSBvbiBmYWlsdXJlCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBpbnQgZ2V0UnNzaSgpIHsKLSAgICAgICAgaWYgKG1XaWZpU3RhdGUuZ2V0KCkgIT0gV0lGSV9TVEFURV9FTkFCTEVEIHx8IGlzRHJpdmVyU3RvcHBlZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFdpZmlOYXRpdmUuZ2V0UnNzaUFwcHJveENvbW1hbmQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgYXBwcm94IFJTU0kgdG8gY3VycmVudGx5IGNvbm5lY3RlZCBuZXR3b3JrCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFJTU0kgdmFsdWUsIC0xIG9uIGZhaWx1cmUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGludCBnZXRSc3NpQXBwcm94KCkgewotICAgICAgICBpZiAobVdpZmlTdGF0ZS5nZXQoKSAhPSBXSUZJX1NUQVRFX0VOQUJMRUQgfHwgaXNEcml2ZXJTdG9wcGVkKCkpIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gV2lmaU5hdGl2ZS5nZXRSc3NpQXBwcm94Q29tbWFuZCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBsaW5rIHNwZWVkIHRvIGN1cnJlbnRseSBjb25uZWN0ZWQgbmV0d29yawotICAgICAqCi0gICAgICogQHJldHVybiBsaW5rIHNwZWVkLCAtMSBvbiBmYWlsdXJlCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBpbnQgZ2V0TGlua1NwZWVkKCkgewotICAgICAgICBpZiAobVdpZmlTdGF0ZS5nZXQoKSAhPSBXSUZJX1NUQVRFX0VOQUJMRUQgfHwgaXNEcml2ZXJTdG9wcGVkKCkpIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gV2lmaU5hdGl2ZS5nZXRMaW5rU3BlZWRDb21tYW5kKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IE1BQyBhZGRyZXNzIG9mIHJhZGlvCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIE1BQyBhZGRyZXNzLCBudWxsIG9uIGZhaWx1cmUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIFN0cmluZyBnZXRNYWNBZGRyZXNzKCkgewotICAgICAgICBpZiAobVdpZmlTdGF0ZS5nZXQoKSAhPSBXSUZJX1NUQVRFX0VOQUJMRUQgfHwgaXNEcml2ZXJTdG9wcGVkKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBXaWZpTmF0aXZlLmdldE1hY0FkZHJlc3NDb21tYW5kKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3RhcnQgZHJpdmVyCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZQotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBzdGFydERyaXZlcigpIHsKLSAgICAgICAgaWYgKG1XaWZpU3RhdGUuZ2V0KCkgIT0gV0lGSV9TVEFURV9FTkFCTEVEKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFdpZmlOYXRpdmUuc3RhcnREcml2ZXJDb21tYW5kKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3RvcCBkcml2ZXIKLSAgICAgKgotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHN0b3BEcml2ZXIoKSB7Ci0gICAgICAgIC8qIERyaXZlciBzdG9wIHNob3VsZCBub3QgaGFwcGVuIG9ubHkgd2hlbiBzdXBwbGljYW50IGV2ZW50Ci0gICAgICAgICAqIERSSVZFUl9TVE9QUEVEIGhhcyBhbHJlYWR5IGJlZW4gaGFuZGxlZCAqLwotICAgICAgICBpZiAobVdpZmlTdGF0ZS5nZXQoKSAhPSBXSUZJX1NUQVRFX0VOQUJMRUQgfHwgbVJ1blN0YXRlID09IFJVTl9TVEFURV9TVE9QUEVEKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFdpZmlOYXRpdmUuc3RvcERyaXZlckNvbW1hbmQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTdGFydCBwYWNrZXQgZmlsdGVyaW5nCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZQotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBzdGFydFBhY2tldEZpbHRlcmluZygpIHsKLSAgICAgICAgaWYgKG1XaWZpU3RhdGUuZ2V0KCkgIT0gV0lGSV9TVEFURV9FTkFCTEVEIHx8IGlzRHJpdmVyU3RvcHBlZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFdpZmlOYXRpdmUuc3RhcnRQYWNrZXRGaWx0ZXJpbmcoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTdG9wIHBhY2tldCBmaWx0ZXJpbmcKLSAgICAgKgotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHN0b3BQYWNrZXRGaWx0ZXJpbmcoKSB7Ci0gICAgICAgIGlmIChtV2lmaVN0YXRlLmdldCgpICE9IFdJRklfU1RBVEVfRU5BQkxFRCB8fCBpc0RyaXZlclN0b3BwZWQoKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBXaWZpTmF0aXZlLnN0b3BQYWNrZXRGaWx0ZXJpbmcoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgcG93ZXIgbW9kZQotICAgICAqIEByZXR1cm4gcG93ZXIgbW9kZQotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGdldFBvd2VyTW9kZSgpIHsKLSAgICAgICAgaWYgKG1XaWZpU3RhdGUuZ2V0KCkgIT0gV0lGSV9TVEFURV9FTkFCTEVEICYmICFpc0RyaXZlclN0b3BwZWQoKSkgewotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBXaWZpTmF0aXZlLmdldFBvd2VyTW9kZUNvbW1hbmQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgcG93ZXIgbW9kZQotICAgICAqIEBwYXJhbSBtb2RlCi0gICAgICogICAgIERSSVZFUl9QT1dFUl9NT0RFX0FVVE8KLSAgICAgKiAgICAgRFJJVkVSX1BPV0VSX01PREVfQUNUSVZFCi0gICAgICoKLSAgICAgKiBVc2VzIHJlZmVyZW5jZSBjb3VudGluZyB0byBrZWVwIHBvd2VyIG1vZGUgYWN0aXZlCi0gICAgICogYXMgbG9uZyBhcyBvbmUgZW50aXR5IHdhbnRzIHBvd2VyIG1vZGUgdG8gYmUgYWN0aXZlLgotICAgICAqCi0gICAgICogRm9yIGV4YW1wbGUsIFdpZmlMb2NrIGhpZ2ggcGVyZiBtb2RlIGNhbiBrZWVwIHBvd2VyIG1vZGUgYWN0aXZlCi0gICAgICogb3IgYSBESENQIHNlc3Npb24gY2FuIGtlZXAgaXQgYWN0aXZlLiBBcyBsb25nIGFzIG9uZSBlbnRpdHkgd2FudHMKLSAgICAgKiBpdCBlbmFibGVkLCBpdCBzaG91bGQgc3RheSB0aGF0IHdheQotICAgICAqCi0gICAgICovCi0gICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBzZXRQb3dlck1vZGUoaW50IG1vZGUpIHsKLQotICAgICAgICAvKiBJdCBpcyBnb29kIHRvIHBsdW1iIHBvd2VyIG1vZGUgY2hhbmdlCi0gICAgICAgICAqIGV2ZW4gaWYgcmVmIGNvdW50IGluZGljYXRlcyBhbHJlYWR5IGRvbmUKLSAgICAgICAgICogc2luY2Ugd2UgY291bGQgaGF2ZSBhIGNhc2Ugb2YgcHJldmlvdXMgZmFpbHVyZS4KLSAgICAgICAgICovCi0gICAgICAgIHN3aXRjaChtb2RlKSB7Ci0gICAgICAgICAgICBjYXNlIERSSVZFUl9QT1dFUl9NT0RFX0FDVElWRToKLSAgICAgICAgICAgICAgICBtUG93ZXJNb2RlUmVmQ291bnQrKzsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgRFJJVkVSX1BPV0VSX01PREVfQVVUTzoKLSAgICAgICAgICAgICAgICBtUG93ZXJNb2RlUmVmQ291bnQtLTsKLSAgICAgICAgICAgICAgICBpZiAobVBvd2VyTW9kZVJlZkNvdW50ID4gMCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLyogS2VlcCByZWZjb3VudCBmcm9tIGJlY29taW5nIG5lZ2F0aXZlICovCi0gICAgICAgICAgICAgICAgICAgIG1Qb3dlck1vZGVSZWZDb3VudCA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1XaWZpU3RhdGUuZ2V0KCkgIT0gV0lGSV9TVEFURV9FTkFCTEVEIHx8IGlzRHJpdmVyU3RvcHBlZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBXaWZpTmF0aXZlLnNldFBvd2VyTW9kZUNvbW1hbmQobW9kZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBudW1iZXIgb2YgYWxsb3dlZCByYWRpbyBmcmVxdWVuY3kgY2hhbm5lbHMgZnJvbSB0aGUgc3lzdGVtCi0gICAgICogc2V0dGluZyB2YWx1ZSwgaWYgYW55LgotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLCBlLmcuLAotICAgICAqIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgaXMgaW52YWxpZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gc2V0TnVtQWxsb3dlZENoYW5uZWxzKCkgewotICAgICAgICBpZiAobVdpZmlTdGF0ZS5nZXQoKSAhPSBXSUZJX1NUQVRFX0VOQUJMRUQgfHwgaXNEcml2ZXJTdG9wcGVkKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIHNldE51bUFsbG93ZWRDaGFubmVscygKLSAgICAgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLmdldEludChtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwKLSAgICAgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLldJRklfTlVNX0FMTE9XRURfQ0hBTk5FTFMpKTsKLSAgICAgICAgfSBjYXRjaCAoU2V0dGluZ3MuU2V0dGluZ05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGlmIChtTnVtQWxsb3dlZENoYW5uZWxzICE9IDApIHsKLSAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLnNldE51bUFsbG93ZWRDaGFubmVsc0NvbW1hbmQobU51bUFsbG93ZWRDaGFubmVscyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBvdGhlcndpc2UsIHVzZSB0aGUgZHJpdmVyIGRlZmF1bHQKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIG51bWJlciBvZiByYWRpbyBmcmVxdWVuY3kgY2hhbm5lbHMgdGhhdCBhcmUgYWxsb3dlZCB0byBiZSB1c2VkCi0gICAgICogaW4gdGhlIGN1cnJlbnQgcmVndWxhdG9yeSBkb21haW4uCi0gICAgICogQHBhcmFtIG51bUNoYW5uZWxzIHRoZSBudW1iZXIgb2YgYWxsb3dlZCBjaGFubmVscy4gTXVzdCBiZSBncmVhdGVyIHRoYW4gMAotICAgICAqIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gMTYuCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcywge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UsIGUuZy4sCi0gICAgICoge0Bjb2RlIG51bUNoYW5uZWxzfSBpcyBvdXRzaWRlIHRoZSB2YWxpZCByYW5nZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gc2V0TnVtQWxsb3dlZENoYW5uZWxzKGludCBudW1DaGFubmVscykgewotICAgICAgICBpZiAobVdpZmlTdGF0ZS5nZXQoKSAhPSBXSUZJX1NUQVRFX0VOQUJMRUQgfHwgaXNEcml2ZXJTdG9wcGVkKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBtTnVtQWxsb3dlZENoYW5uZWxzID0gbnVtQ2hhbm5lbHM7Ci0gICAgICAgIHJldHVybiBXaWZpTmF0aXZlLnNldE51bUFsbG93ZWRDaGFubmVsc0NvbW1hbmQobnVtQ2hhbm5lbHMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBudW1iZXIgb2YgYWxsb3dlZCBjaGFubmVscwotICAgICAqCi0gICAgICogQHJldHVybiBjaGFubmVsIGNvdW50LCAtMSBvbiBmYWlsdXJlCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBpbnQgZ2V0TnVtQWxsb3dlZENoYW5uZWxzKCkgewotICAgICAgICBpZiAobVdpZmlTdGF0ZS5nZXQoKSAhPSBXSUZJX1NUQVRFX0VOQUJMRUQgfHwgaXNEcml2ZXJTdG9wcGVkKCkpIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gV2lmaU5hdGl2ZS5nZXROdW1BbGxvd2VkQ2hhbm5lbHNDb21tYW5kKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IGJsdWV0b290aCBjb2V4IG1vZGU6Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gbW9kZQotICAgICAqICBCTFVFVE9PVEhfQ09FWElTVEVOQ0VfTU9ERV9FTkFCTEVECi0gICAgICogIEJMVUVUT09USF9DT0VYSVNURU5DRV9NT0RFX0RJU0FCTEVECi0gICAgICogIEJMVUVUT09USF9DT0VYSVNURU5DRV9NT0RFX1NFTlNFCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcywge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gc2V0Qmx1ZXRvb3RoQ29leGlzdGVuY2VNb2RlKGludCBtb2RlKSB7Ci0gICAgICAgIGlmIChtV2lmaVN0YXRlLmdldCgpICE9IFdJRklfU1RBVEVfRU5BQkxFRCB8fCBpc0RyaXZlclN0b3BwZWQoKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBXaWZpTmF0aXZlLnNldEJsdWV0b290aENvZXhpc3RlbmNlTW9kZUNvbW1hbmQobW9kZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRW5hYmxlIG9yIGRpc2FibGUgQmx1ZXRvb3RoIGNvZXhpc3RlbmNlIHNjYW4gbW9kZS4gV2hlbiB0aGlzIG1vZGUgaXMgb24sCi0gICAgICogc29tZSBvZiB0aGUgbG93LWxldmVsIHNjYW4gcGFyYW1ldGVycyB1c2VkIGJ5IHRoZSBkcml2ZXIgYXJlIGNoYW5nZWQgdG8KLSAgICAgKiByZWR1Y2UgaW50ZXJmZXJlbmNlIHdpdGggQTJEUCBzdHJlYW1pbmcuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaXNCbHVldG9vdGhQbGF5aW5nIHdoZXRoZXIgdG8gZW5hYmxlIG9yIGRpc2FibGUgdGhpcyBtb2RlCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldEJsdWV0b290aFNjYW5Nb2RlKGJvb2xlYW4gaXNCbHVldG9vdGhQbGF5aW5nKSB7Ci0gICAgICAgIGlmIChtV2lmaVN0YXRlLmdldCgpICE9IFdJRklfU1RBVEVfRU5BQkxFRCB8fCBpc0RyaXZlclN0b3BwZWQoKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIFdpZmlOYXRpdmUuc2V0Qmx1ZXRvb3RoQ29leGlzdGVuY2VTY2FuTW9kZUNvbW1hbmQoaXNCbHVldG9vdGhQbGF5aW5nKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTYXZlIGNvbmZpZ3VyYXRpb24gb24gc3VwcGxpY2FudAotICAgICAqCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcywge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gc2F2ZUNvbmZpZygpIHsKLSAgICAgICAgaWYgKG1XaWZpU3RhdGUuZ2V0KCkgIT0gV0lGSV9TVEFURV9FTkFCTEVEKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFdpZmlOYXRpdmUuc2F2ZUNvbmZpZ0NvbW1hbmQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWxvYWQgdGhlIGNvbmZpZ3VyYXRpb24gZnJvbSBmaWxlCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZQotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiByZWxvYWRDb25maWcoKSB7Ci0gICAgICAgIGlmIChtV2lmaVN0YXRlLmdldCgpICE9IFdJRklfU1RBVEVfRU5BQkxFRCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBXaWZpTmF0aXZlLnJlbG9hZENvbmZpZ0NvbW1hbmQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBzZXRSYWRpbyhib29sZWFuIHR1cm5PbikgewotICAgICAgICByZXR1cm4gbVdNLnNldFdpZmlFbmFibGVkKHR1cm5Pbik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqIFRoZXJlIGFyZSBjdXJyZW50bHkgbm8gV2ktRmktc3BlY2lmaWMgZmVhdHVyZXMgc3VwcG9ydGVkLgotICAgICAqIEBwYXJhbSBmZWF0dXJlIHRoZSBuYW1lIG9mIHRoZSBmZWF0dXJlCi0gICAgICogQHJldHVybiB7QGNvZGUgLTF9IGluZGljYXRpbmcgZmFpbHVyZSwgYWx3YXlzCisgICAgICogVGVsbHMgdGhlIHVuZGVybHlpbmcgbmV0d29ya2luZyBzeXN0ZW0gdGhhdCB0aGUgY2FsbGVyIHdhbnRzIHRvCisgICAgICogYmVnaW4gdXNpbmcgdGhlIG5hbWVkIGZlYXR1cmUuIFRoZSBpbnRlcnByZXRhdGlvbiBvZiB7QGNvZGUgZmVhdHVyZX0KKyAgICAgKiBpcyBjb21wbGV0ZWx5IHVwIHRvIGVhY2ggbmV0d29ya2luZyBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKiBAcGFyYW0gZmVhdHVyZSB0aGUgbmFtZSBvZiB0aGUgZmVhdHVyZSB0byBiZSB1c2VkCisgICAgICogQHBhcmFtIGNhbGxpbmdQaWQgdGhlIHByb2Nlc3MgSUQgb2YgdGhlIHByb2Nlc3MgdGhhdCBpcyBpc3N1aW5nIHRoaXMgcmVxdWVzdAorICAgICAqIEBwYXJhbSBjYWxsaW5nVWlkIHRoZSB1c2VyIElEIG9mIHRoZSBwcm9jZXNzIHRoYXQgaXMgaXNzdWluZyB0aGlzIHJlcXVlc3QKKyAgICAgKiBAcmV0dXJuIGFuIGludGVnZXIgdmFsdWUgcmVwcmVzZW50aW5nIHRoZSBvdXRjb21lIG9mIHRoZSByZXF1ZXN0LgorICAgICAqIFRoZSBpbnRlcnByZXRhdGlvbiBvZiB0aGlzIHZhbHVlIGlzIHNwZWNpZmljIHRvIGVhY2ggbmV0d29ya2luZworICAgICAqIGltcGxlbWVudGF0aW9uK2ZlYXR1cmUgY29tYmluYXRpb24sIGV4Y2VwdCB0aGF0IHRoZSB2YWx1ZSB7QGNvZGUgLTF9CisgICAgICogYWx3YXlzIGluZGljYXRlcyBmYWlsdXJlLgorICAgICAqIFRPRE86IG5lZWRzIHRvIGdvIGF3YXkKICAgICAgKi8KICAgICBwdWJsaWMgaW50IHN0YXJ0VXNpbmdOZXR3b3JrRmVhdHVyZShTdHJpbmcgZmVhdHVyZSwgaW50IGNhbGxpbmdQaWQsIGludCBjYWxsaW5nVWlkKSB7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICogVGhlcmUgYXJlIGN1cnJlbnRseSBubyBXaS1GaS1zcGVjaWZpYyBmZWF0dXJlcyBzdXBwb3J0ZWQuCi0gICAgICogQHBhcmFtIGZlYXR1cmUgdGhlIG5hbWUgb2YgdGhlIGZlYXR1cmUKLSAgICAgKiBAcmV0dXJuIHtAY29kZSAtMX0gaW5kaWNhdGluZyBmYWlsdXJlLCBhbHdheXMKKyAgICAgKiBUZWxscyB0aGUgdW5kZXJseWluZyBuZXR3b3JraW5nIHN5c3RlbSB0aGF0IHRoZSBjYWxsZXIgaXMgZmluaXNoZWQKKyAgICAgKiB1c2luZyB0aGUgbmFtZWQgZmVhdHVyZS4gVGhlIGludGVycHJldGF0aW9uIG9mIHtAY29kZSBmZWF0dXJlfQorICAgICAqIGlzIGNvbXBsZXRlbHkgdXAgdG8gZWFjaCBuZXR3b3JraW5nIGltcGxlbWVudGF0aW9uLgorICAgICAqIEBwYXJhbSBmZWF0dXJlIHRoZSBuYW1lIG9mIHRoZSBmZWF0dXJlIHRoYXQgaXMgbm8gbG9uZ2VyIG5lZWRlZC4KKyAgICAgKiBAcGFyYW0gY2FsbGluZ1BpZCB0aGUgcHJvY2VzcyBJRCBvZiB0aGUgcHJvY2VzcyB0aGF0IGlzIGlzc3VpbmcgdGhpcyByZXF1ZXN0CisgICAgICogQHBhcmFtIGNhbGxpbmdVaWQgdGhlIHVzZXIgSUQgb2YgdGhlIHByb2Nlc3MgdGhhdCBpcyBpc3N1aW5nIHRoaXMgcmVxdWVzdAorICAgICAqIEByZXR1cm4gYW4gaW50ZWdlciB2YWx1ZSByZXByZXNlbnRpbmcgdGhlIG91dGNvbWUgb2YgdGhlIHJlcXVlc3QuCisgICAgICogVGhlIGludGVycHJldGF0aW9uIG9mIHRoaXMgdmFsdWUgaXMgc3BlY2lmaWMgdG8gZWFjaCBuZXR3b3JraW5nCisgICAgICogaW1wbGVtZW50YXRpb24rZmVhdHVyZSBjb21iaW5hdGlvbiwgZXhjZXB0IHRoYXQgdGhlIHZhbHVlIHtAY29kZSAtMX0KKyAgICAgKiBhbHdheXMgaW5kaWNhdGVzIGZhaWx1cmUuCisgICAgICogVE9ETzogbmVlZHMgdG8gZ28gYXdheQogICAgICAqLwogICAgIHB1YmxpYyBpbnQgc3RvcFVzaW5nTmV0d29ya0ZlYXR1cmUoU3RyaW5nIGZlYXR1cmUsIGludCBjYWxsaW5nUGlkLCBpbnQgY2FsbGluZ1VpZCkgewogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgaW50ZXJwcmV0U2NhblJlc3VsdHNBdmFpbGFibGUoKSB7Ci0KLSAgICAgICAgLy8gSWYgd2Ugc2hvdWxkbid0IHBsYWNlIGEgbm90aWZpY2F0aW9uIG9uIGF2YWlsYWJsZSBuZXR3b3JrcywgdGhlbgotICAgICAgICAvLyBkb24ndCBib3RoZXIgZG9pbmcgYW55IG9mIHRoZSBmb2xsb3dpbmcKLSAgICAgICAgaWYgKCFtTm90aWZpY2F0aW9uRW5hYmxlZCkgcmV0dXJuOwotCi0gICAgICAgIE5ldHdvcmtJbmZvIG5ldHdvcmtJbmZvID0gZ2V0TmV0d29ya0luZm8oKTsKLQotICAgICAgICBTdGF0ZSBzdGF0ZSA9IG5ldHdvcmtJbmZvLmdldFN0YXRlKCk7Ci0gICAgICAgIGlmICgoc3RhdGUgPT0gTmV0d29ya0luZm8uU3RhdGUuRElTQ09OTkVDVEVEKQotICAgICAgICAgICAgICAgIHx8IChzdGF0ZSA9PSBOZXR3b3JrSW5mby5TdGF0ZS5VTktOT1dOKSkgewotCi0gICAgICAgICAgICAvLyBMb29rIGZvciBhbiBvcGVuIG5ldHdvcmsKLSAgICAgICAgICAgIExpc3Q8U2NhblJlc3VsdD4gc2NhblJlc3VsdHMgPSBnZXRTY2FuUmVzdWx0c0xpc3QoKTsKLSAgICAgICAgICAgIGlmIChzY2FuUmVzdWx0cyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaW50IG51bU9wZW5OZXR3b3JrcyA9IDA7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IHNjYW5SZXN1bHRzLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0gICAgICAgICAgICAgICAgICAgIFNjYW5SZXN1bHQgc2NhblJlc3VsdCA9IHNjYW5SZXN1bHRzLmdldChpKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkoc2NhblJlc3VsdC5jYXBhYmlsaXRpZXMpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBudW1PcGVuTmV0d29ya3MrKzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChudW1PcGVuTmV0d29ya3MgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgrK21OdW1TY2Fuc1NpbmNlTmV0d29ya1N0YXRlQ2hhbmdlID49IE5VTV9TQ0FOU19CRUZPUkVfQUNUVUFMTFlfU0NBTk5JTkcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiBXZSd2ZSBzY2FubmVkIGNvbnRpbnVvdXNseSBhdCBsZWFzdAotICAgICAgICAgICAgICAgICAgICAgICAgICogTlVNX1NDQU5TX0JFRk9SRV9OT1RJRklDQVRJT04gdGltZXMuIFRoZSB1c2VyCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiBwcm9iYWJseSBkb2VzIG5vdCBoYXZlIGEgcmVtZW1iZXJlZCBuZXR3b3JrIGluIHJhbmdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICogc2luY2Ugb3RoZXJ3aXNlIHN1cHBsaWNhbnQgd291bGQgaGF2ZSB0cmllZCB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICogYXNzb2NpYXRlIGFuZCB0aHVzIHJlc2V0dGluZyB0aGlzIGNvdW50ZXIuCi0gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHNldE5vdGlmaWNhdGlvblZpc2libGUodHJ1ZSwgbnVtT3Blbk5ldHdvcmtzLCBmYWxzZSwgMCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gTm8gb3BlbiBuZXR3b3JrcyBpbiByYW5nZSwgcmVtb3ZlIHRoZSBub3RpZmljYXRpb24KLSAgICAgICAgc2V0Tm90aWZpY2F0aW9uVmlzaWJsZShmYWxzZSwgMCwgZmFsc2UsIDApOworICAgIC8qKgorICAgICAqIENoZWNrIGlmIHByaXZhdGUgRE5TIHJvdXRlIGlzIHNldCBmb3IgdGhlIG5ldHdvcmsKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1ByaXZhdGVEbnNSb3V0ZVNldCgpIHsKKyAgICAgICAgcmV0dXJuIG1Qcml2YXRlRG5zUm91dGVTZXQuZ2V0KCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogRGlzcGxheSBvciBkb24ndCBkaXNwbGF5IGEgbm90aWZpY2F0aW9uIHRoYXQgdGhlcmUgYXJlIG9wZW4gV2ktRmkgbmV0d29ya3MuCi0gICAgICogQHBhcmFtIHZpc2libGUge0Bjb2RlIHRydWV9IGlmIG5vdGlmaWNhdGlvbiBzaG91bGQgYmUgdmlzaWJsZSwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UKLSAgICAgKiBAcGFyYW0gbnVtTmV0d29ya3MgdGhlIG51bWJlciBuZXR3b3JrcyBzZWVuCi0gICAgICogQHBhcmFtIGZvcmNlIHtAY29kZSB0cnVlfSB0byBmb3JjZSBub3RpZmljYXRpb24gdG8gYmUgc2hvd24vbm90LXNob3duLAotICAgICAqIGV2ZW4gaWYgaXQgaXMgYWxyZWFkeSBzaG93bi9ub3Qtc2hvd24uCi0gICAgICogQHBhcmFtIGRlbGF5IHRpbWUgaW4gbWlsbGlzZWNvbmRzIGFmdGVyIHdoaWNoIHRoZSBub3RpZmljYXRpb24gc2hvdWxkIGJlIG1hZGUKLSAgICAgKiB2aXNpYmxlIG9yIGludmlzaWJsZS4KKyAgICAgKiBTZXQgYSBmbGFnIGluZGljYXRpbmcgcHJpdmF0ZSBETlMgcm91dGUgaXMgc2V0CiAgICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Tm90aWZpY2F0aW9uVmlzaWJsZShib29sZWFuIHZpc2libGUsIGludCBudW1OZXR3b3JrcywgYm9vbGVhbiBmb3JjZSwgaW50IGRlbGF5KSB7Ci0gICAgICAgIAotICAgICAgICAvLyBTaW5jZSB3ZSB1c2UgYXV0byBjYW5jZWwgb24gdGhlIG5vdGlmaWNhdGlvbiwgd2hlbiB0aGUKLSAgICAgICAgLy8gbU5ldHdvcmtzQXZhaWxhYmxlTm90aWZpY2F0aW9uU2hvd24gaXMgdHJ1ZSwgdGhlIG5vdGlmaWNhdGlvbiBtYXkKLSAgICAgICAgLy8gaGF2ZSBhY3R1YWxseSBiZWVuIGNhbmNlbGVkLiAgSG93ZXZlciwgd2hlbiBpdCBpcyBmYWxzZSB3ZSBrbm93Ci0gICAgICAgIC8vIGZvciBzdXJlIHRoYXQgaXQgaXMgbm90IGJlaW5nIHNob3duIChpdCB3aWxsIG5vdCBiZSBzaG93biBhbnkgb3RoZXIKLSAgICAgICAgLy8gcGxhY2UgdGhhbiBoZXJlKQotICAgICAgICAKLSAgICAgICAgLy8gSWYgaXQgc2hvdWxkIGJlIGhpZGRlbiBhbmQgaXQgaXMgYWxyZWFkeSBoaWRkZW4sIHRoZW4gbm9vcAotICAgICAgICBpZiAoIXZpc2libGUgJiYgIW1Ob3RpZmljYXRpb25TaG93biAmJiAhZm9yY2UpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIE1lc3NhZ2UgbWVzc2FnZTsKLSAgICAgICAgaWYgKHZpc2libGUpIHsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gTm90IGVub3VnaCB0aW1lIGhhcyBwYXNzZWQgdG8gc2hvdyB0aGUgbm90aWZpY2F0aW9uIGFnYWluCi0gICAgICAgICAgICBpZiAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgPCBtTm90aWZpY2F0aW9uUmVwZWF0VGltZSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKG1Ob3RpZmljYXRpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIENhY2hlIHRoZSBOb3RpZmljYXRpb24gbWFpbmx5IHNvIHdlIGNhbiByZW1vdmUgdGhlCi0gICAgICAgICAgICAgICAgLy8gRVZFTlRfTk9USUZJQ0FUSU9OX0NIQU5HRUQgbWVzc2FnZSB3aXRoIHRoaXMgTm90aWZpY2F0aW9uIGZyb20KLSAgICAgICAgICAgICAgICAvLyB0aGUgcXVldWUgbGF0ZXIKLSAgICAgICAgICAgICAgICBtTm90aWZpY2F0aW9uID0gbmV3IE5vdGlmaWNhdGlvbigpOwotICAgICAgICAgICAgICAgIG1Ob3RpZmljYXRpb24ud2hlbiA9IDA7Ci0gICAgICAgICAgICAgICAgbU5vdGlmaWNhdGlvbi5pY29uID0gSUNPTl9ORVRXT1JLU19BVkFJTEFCTEU7Ci0gICAgICAgICAgICAgICAgbU5vdGlmaWNhdGlvbi5mbGFncyA9IE5vdGlmaWNhdGlvbi5GTEFHX0FVVE9fQ0FOQ0VMOwotICAgICAgICAgICAgICAgIG1Ob3RpZmljYXRpb24uY29udGVudEludGVudCA9IFBlbmRpbmdJbnRlbnQuZ2V0QWN0aXZpdHkobUNvbnRleHQsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgSW50ZW50KFdpZmlNYW5hZ2VyLkFDVElPTl9QSUNLX1dJRklfTkVUV09SSyksIDApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBDaGFyU2VxdWVuY2UgdGl0bGUgPSBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRRdWFudGl0eVRleHQoCi0gICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIucGx1cmFscy53aWZpX2F2YWlsYWJsZSwgbnVtTmV0d29ya3MpOwotICAgICAgICAgICAgQ2hhclNlcXVlbmNlIGRldGFpbHMgPSBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRRdWFudGl0eVRleHQoCi0gICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIucGx1cmFscy53aWZpX2F2YWlsYWJsZV9kZXRhaWxlZCwgbnVtTmV0d29ya3MpOwotICAgICAgICAgICAgbU5vdGlmaWNhdGlvbi50aWNrZXJUZXh0ID0gdGl0bGU7Ci0gICAgICAgICAgICBtTm90aWZpY2F0aW9uLnNldExhdGVzdEV2ZW50SW5mbyhtQ29udGV4dCwgdGl0bGUsIGRldGFpbHMsIG1Ob3RpZmljYXRpb24uY29udGVudEludGVudCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIG1Ob3RpZmljYXRpb25SZXBlYXRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyBOT1RJRklDQVRJT05fUkVQRUFUX0RFTEFZX01TOwotCi0gICAgICAgICAgICBtZXNzYWdlID0gbVRhcmdldC5vYnRhaW5NZXNzYWdlKEVWRU5UX05PVElGSUNBVElPTl9DSEFOR0VELCAxLAotICAgICAgICAgICAgICAgICAgICBJQ09OX05FVFdPUktTX0FWQUlMQUJMRSwgbU5vdGlmaWNhdGlvbik7Ci0gICAgICAgICAgICAKLSAgICAgICAgfSBlbHNlIHsKLQotICAgICAgICAgICAgLy8gUmVtb3ZlIGFueSBwZW5kaW5nIG1lc3NhZ2VzIHRvIHNob3cgdGhlIG5vdGlmaWNhdGlvbgotICAgICAgICAgICAgbVRhcmdldC5yZW1vdmVNZXNzYWdlcyhFVkVOVF9OT1RJRklDQVRJT05fQ0hBTkdFRCwgbU5vdGlmaWNhdGlvbik7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIG1lc3NhZ2UgPSBtVGFyZ2V0Lm9idGFpbk1lc3NhZ2UoRVZFTlRfTk9USUZJQ0FUSU9OX0NIQU5HRUQsIDAsIElDT05fTkVUV09SS1NfQVZBSUxBQkxFKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1UYXJnZXQuc2VuZE1lc3NhZ2VEZWxheWVkKG1lc3NhZ2UsIGRlbGF5KTsKLSAgICAgICAgCi0gICAgICAgIG1Ob3RpZmljYXRpb25TaG93biA9IHZpc2libGU7CisgICAgcHVibGljIHZvaWQgcHJpdmF0ZURuc1JvdXRlU2V0KGJvb2xlYW4gZW5hYmxlZCkgeworICAgICAgICBtUHJpdmF0ZURuc1JvdXRlU2V0LnNldChlbmFibGVkKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDbGVhcnMgdmFyaWFibGVzIHJlbGF0ZWQgdG8gdHJhY2tpbmcgd2hldGhlciBhIG5vdGlmaWNhdGlvbiBoYXMgYmVlbgotICAgICAqIHNob3duIHJlY2VudGx5LgotICAgICAqIDxwPgotICAgICAqIEFmdGVyIGNhbGxpbmcgdGhpcyBtZXRob2QsIHRoZSB0aW1lciB0aGF0IHByZXZlbnRzIG5vdGlmaWNhdGlvbnMgZnJvbQotICAgICAqIGJlaW5nIHNob3duIHRvbyBvZnRlbiB3aWxsIGJlIGNsZWFyZWQuCisgICAgICogRmV0Y2ggTmV0d29ya0luZm8gZm9yIHRoZSBuZXR3b3JrCiAgICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHJlc2V0Tm90aWZpY2F0aW9uVGltZXIoKSB7Ci0gICAgICAgIG1Ob3RpZmljYXRpb25SZXBlYXRUaW1lID0gMDsKLSAgICAgICAgbU51bVNjYW5zU2luY2VOZXR3b3JrU3RhdGVDaGFuZ2UgPSAwOwotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIHNiLmFwcGVuZCgiaW50ZXJmYWNlICIpLmFwcGVuZChtSW50ZXJmYWNlTmFtZSk7Ci0gICAgICAgIHNiLmFwcGVuZCgiIHJ1blN0YXRlPSIpOwotICAgICAgICBpZiAobVJ1blN0YXRlID49IDEgJiYgbVJ1blN0YXRlIDw9IG1SdW5TdGF0ZU5hbWVzLmxlbmd0aCkgewotICAgICAgICAgICAgc2IuYXBwZW5kKG1SdW5TdGF0ZU5hbWVzW21SdW5TdGF0ZS0xXSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzYi5hcHBlbmQobVJ1blN0YXRlKTsKLSAgICAgICAgfQotICAgICAgICBzYi5hcHBlbmQoTFMpLmFwcGVuZChtV2lmaUluZm8pLmFwcGVuZChMUyk7Ci0gICAgICAgIHNiLmFwcGVuZChtRGhjcEluZm8pLmFwcGVuZChMUyk7Ci0gICAgICAgIHNiLmFwcGVuZCgiaGF2ZUlwQWRkcmVzcz0iKS5hcHBlbmQobUhhdmVJcEFkZHJlc3MpLgotICAgICAgICAgICAgICAgIGFwcGVuZCgiLCBvYnRhaW5pbmdJcEFkZHJlc3M9IikuYXBwZW5kKG1PYnRhaW5pbmdJcEFkZHJlc3MpLgotICAgICAgICAgICAgICAgIGFwcGVuZCgiLCBzY2FuTW9kZUFjdGl2ZT0iKS5hcHBlbmQobUlzU2Nhbk1vZGVBY3RpdmUpLmFwcGVuZChMUykuCi0gICAgICAgICAgICAgICAgYXBwZW5kKCJsYXN0U2lnbmFsTGV2ZWw9IikuYXBwZW5kKG1MYXN0U2lnbmFsTGV2ZWwpLgotICAgICAgICAgICAgICAgIGFwcGVuZCgiLCBleHBsaWNpdGx5RGlzYWJsZWQ9IikuYXBwZW5kKG1Ub3JuRG93bkJ5Q29ubk1ncik7Ci0gICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOworICAgIHB1YmxpYyBOZXR3b3JrSW5mbyBnZXROZXR3b3JrSW5mbygpIHsKKyAgICAgICAgcmV0dXJuIG1OZXR3b3JrSW5mbzsKICAgICB9CiAKLSAgICBwcml2YXRlIGNsYXNzIERoY3BIYW5kbGVyIGV4dGVuZHMgSGFuZGxlciB7Ci0KLSAgICAgICAgcHJpdmF0ZSBIYW5kbGVyIG1UYXJnZXQ7Ci0gICAgICAgIAotICAgICAgICAvKioKLSAgICAgICAgICogV2hldGhlciB0byBza2lwIHRoZSBESENQIHJlc3VsdCBjYWxsYmFjayB0byB0aGUgdGFyZ2V0LiBGb3IgZXhhbXBsZSwKLSAgICAgICAgICogdGhpcyBjb3VsZCBiZSBzZXQgaWYgdGhlIG5ldHdvcmsgd2Ugd2VyZSByZXF1ZXN0aW5nIGFuIElQIGZvciBoYXMKLSAgICAgICAgICogc2luY2UgYmVlbiBkaXNjb25uZWN0ZWQuCi0gICAgICAgICAqIDxwPgotICAgICAgICAgKiBOb3RlOiBUaGVyZSBpcyBzdGlsbCBhIGNoYW5jZSB3aGVyZSB0aGUgY2xpZW50J3MgaW50ZW5kZWQgREhDUAotICAgICAgICAgKiByZXF1ZXN0IG5vdCBiZWluZyBjYW5jZWxlZC4gRm9yIGV4YW1wbGUsIHdlIGFyZSByZXF1ZXN0IGZvciBJUCBvbgotICAgICAgICAgKiBBLCBhbmQgaGUgcXVldWVzIHJlcXVlc3QgZm9yIElQIG9uIEIsIGFuZCB0aGVuIGNhbmNlbHMgdGhlIHJlcXVlc3Qgb24KLSAgICAgICAgICogQiB3aGlsZSB3ZSdyZSBzdGlsbCByZXF1ZXN0aW5nIGZyb20gQS4KLSAgICAgICAgICovCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBtQ2FuY2VsQ2FsbGJhY2s7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEluc3RhbmNlIG9mIHRoZSBibHVldG9vdGggaGVhZHNldCBoZWxwZXIuIFRoaXMgbmVlZHMgdG8gYmUgY3JlYXRlZAotICAgICAgICAgKiBlYXJseSBiZWNhdXNlIHRoZXJlIGlzIGEgZGVsYXkgYmVmb3JlIGl0IGFjdHVhbGx5ICdjb25uZWN0cycsIGFzCi0gICAgICAgICAqIG5vdGVkIGJ5IGl0cyBqYXZhZG9jLiBJZiB3ZSBjaGVjayBiZWZvcmUgaXQgaXMgY29ubmVjdGVkLCBpdCB3aWxsIGJlCi0gICAgICAgICAqIGluIGFuIGVycm9yIHN0YXRlIGFuZCB3ZSB3aWxsIG5vdCBkaXNhYmxlIGNvZXhpc3RlbmNlLgotICAgICAgICAgKi8KLSAgICAgICAgcHJpdmF0ZSBCbHVldG9vdGhIZWFkc2V0IG1CbHVldG9vdGhIZWFkc2V0OwotICAgICAgICAKLSAgICAgICAgcHVibGljIERoY3BIYW5kbGVyKExvb3BlciBsb29wZXIsIEhhbmRsZXIgdGFyZ2V0KSB7Ci0gICAgICAgICAgICBzdXBlcihsb29wZXIpOwotICAgICAgICAgICAgbVRhcmdldCA9IHRhcmdldDsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgbUJsdWV0b290aEhlYWRzZXQgPSBuZXcgQmx1ZXRvb3RoSGVhZHNldChtQ29udGV4dCwgbnVsbCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7Ci0gICAgICAgICAgICBpbnQgZXZlbnQ7Ci0KLSAgICAgICAgICAgIHN3aXRjaCAobXNnLndoYXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIEVWRU5UX0RIQ1BfU1RBUlQ6Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBib29sZWFuIG1vZGlmaWVkQmx1ZXRvb3RoQ29leGlzdGVuY2VNb2RlID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIGludCBwb3dlck1vZGUgPSBEUklWRVJfUE9XRVJfTU9ERV9BVVRPOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChzaG91bGREaXNhYmxlQ29leGlzdGVuY2VNb2RlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiBUaGVyZSBhcmUgcHJvYmxlbXMgc2V0dGluZyB0aGUgV2ktRmkgZHJpdmVyJ3MgcG93ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIG1vZGUgdG8gYWN0aXZlIHdoZW4gYmx1ZXRvb3RoIGNvZXhpc3RlbmNlIG1vZGUgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIGVuYWJsZWQgb3Igc2Vuc2UuCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiA8cD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAqIFdlIHNldCBXaS1GaSB0byBhY3RpdmUgbW9kZSB3aGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiBvYnRhaW5pbmcgYW4gSVAgYWRkcmVzcyBiZWNhdXNlIHdlJ3ZlIGZvdW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiBjb21wYXRpYmlsaXR5IGlzc3VlcyB3aXRoIHNvbWUgcm91dGVycyB3aXRoIGxvdyBwb3dlcgotICAgICAgICAgICAgICAgICAgICAgICAgICogbW9kZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAqIDxwPgotICAgICAgICAgICAgICAgICAgICAgICAgICogSW4gb3JkZXIgZm9yIHRoaXMgYWN0aXZlIHBvd2VyIG1vZGUgdG8gcHJvcGVybHkgYmUgc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICogd2UgZGlzYWJsZSBjb2V4aXN0ZW5jZSBtb2RlIHVudGlsIHdlJ3JlIGRvbmUgd2l0aAotICAgICAgICAgICAgICAgICAgICAgICAgICogb2J0YWluaW5nIGFuIElQIGFkZHJlc3MuICBPbmUgZXhjZXB0aW9uIGlzIGlmIHdlCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiBhcmUgY3VycmVudGx5IGNvbm5lY3RlZCB0byBhIGhlYWRzZXQsIHNpbmNlIGRpc2FibGluZwotICAgICAgICAgICAgICAgICAgICAgICAgICogY29leGlzdGVuY2Ugd291bGQgaW50ZXJydXB0IHRoYXQgY29ubmVjdGlvbi4KLSAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWRCbHVldG9vdGhDb2V4aXN0ZW5jZU1vZGUgPSB0cnVlOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBEaXNhYmxlIHRoZSBjb2V4aXN0ZW5jZSBtb2RlCi0gICAgICAgICAgICAgICAgICAgICAgICBzZXRCbHVldG9vdGhDb2V4aXN0ZW5jZU1vZGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUuQkxVRVRPT1RIX0NPRVhJU1RFTkNFX01PREVfRElTQUJMRUQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBwb3dlck1vZGUgPSBnZXRQb3dlck1vZGUoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBvd2VyTW9kZSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAvLyBIYW5kbGUgdGhlIGNhc2Ugd2hlcmUgc3VwcGxpY2FudCBkcml2ZXIgZG9lcyBub3Qgc3VwcG9ydAotICAgICAgICAgICAgICAgICAgICAgIC8vIGdldFBvd2VyTW9kZUNvbW1hbmQuCi0gICAgICAgICAgICAgICAgICAgICAgICBwb3dlck1vZGUgPSBEUklWRVJfUE9XRVJfTU9ERV9BVVRPOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwb3dlck1vZGUgIT0gRFJJVkVSX1BPV0VSX01PREVfQUNUSVZFKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXRQb3dlck1vZGUoRFJJVkVSX1BPV0VSX01PREVfQUNUSVZFKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBuZXcgcmVxdWVzdCBpcyBiZWluZyBtYWRlLCBzbyBhc3N1bWUgd2Ugd2lsbCBjYWxsYmFjawotICAgICAgICAgICAgICAgICAgICAgICAgbUNhbmNlbENhbGxiYWNrID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiRGhjcEhhbmRsZXI6IERIQ1AgcmVxdWVzdCBzdGFydGVkIik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChOZXR3b3JrVXRpbHMucnVuRGhjcChtSW50ZXJmYWNlTmFtZSwgbURoY3BJbmZvKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQgPSBFVkVOVF9JTlRFUkZBQ0VfQ09ORklHVVJBVElPTl9TVUNDRUVERUQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoTE9DQUxfTE9HRCkgTG9nLnYoVEFHLCAiRGhjcEhhbmRsZXI6IERIQ1AgcmVxdWVzdCBzdWNjZWVkZWQiKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50ID0gRVZFTlRfSU5URVJGQUNFX0NPTkZJR1VSQVRJT05fRkFJTEVEOwotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiRGhjcEhhbmRsZXI6IERIQ1AgcmVxdWVzdCBmYWlsZWQ6ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5ldHdvcmtVdGlscy5nZXREaGNwRXJyb3IoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAocG93ZXJNb2RlICE9IERSSVZFUl9QT1dFUl9NT0RFX0FDVElWRSkgewotICAgICAgICAgICAgICAgICAgICAgICAgc2V0UG93ZXJNb2RlKHBvd2VyTW9kZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAobW9kaWZpZWRCbHVldG9vdGhDb2V4aXN0ZW5jZU1vZGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNldCB0aGUgY29leGlzdGVuY2UgbW9kZSBiYWNrIHRvIGl0cyBkZWZhdWx0IHZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICBzZXRCbHVldG9vdGhDb2V4aXN0ZW5jZU1vZGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUuQkxVRVRPT1RIX0NPRVhJU1RFTkNFX01PREVfU0VOU0UpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1DYW5jZWxDYWxsYmFjaykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1UYXJnZXQuc2VuZEVtcHR5TWVzc2FnZShldmVudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0Q2FuY2VsQ2FsbGJhY2soYm9vbGVhbiBjYW5jZWxDYWxsYmFjaykgewotICAgICAgICAgICAgbUNhbmNlbENhbGxiYWNrID0gY2FuY2VsQ2FsbGJhY2s7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogV2hldGhlciB0byBkaXNhYmxlIGNvZXhpc3RlbmNlIG1vZGUgd2hpbGUgb2J0YWluaW5nIElQIGFkZHJlc3MuIFRoaXMKLSAgICAgICAgICogbG9naWMgd2lsbCByZXR1cm4gdHJ1ZSBvbmx5IGlmIHRoZSBjdXJyZW50IGJsdWV0b290aAotICAgICAgICAgKiBoZWFkc2V0L2hhbmRzZnJlZSBzdGF0ZSBpcyBkaXNjb25uZWN0ZWQuIFRoaXMgbWVhbnMgaWYgaXQgaXMgaW4gYW4KLSAgICAgICAgICogZXJyb3Igc3RhdGUsIHdlIHdpbGwgTk9UIGRpc2FibGUgY29leGlzdGVuY2UgbW9kZSB0byBlcnIgb24gdGhlIHNpZGUKLSAgICAgICAgICogb2Ygc2FmZXR5LgotICAgICAgICAgKiAKLSAgICAgICAgICogQHJldHVybiBXaGV0aGVyIHRvIGRpc2FibGUgY29leGlzdGVuY2UgbW9kZS4KLSAgICAgICAgICovCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBzaG91bGREaXNhYmxlQ29leGlzdGVuY2VNb2RlKCkgewotICAgICAgICAgICAgaW50IHN0YXRlID0gbUJsdWV0b290aEhlYWRzZXQuZ2V0U3RhdGUobUJsdWV0b290aEhlYWRzZXQuZ2V0Q3VycmVudEhlYWRzZXQoKSk7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdGUgPT0gQmx1ZXRvb3RoSGVhZHNldC5TVEFURV9ESVNDT05ORUNURUQ7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrVXNlU3RhdGljSXAoKSB7Ci0gICAgICAgIG1Vc2VTdGF0aWNJcCA9IGZhbHNlOwotICAgICAgICBmaW5hbCBDb250ZW50UmVzb2x2ZXIgY3IgPSBtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChTZXR0aW5ncy5TeXN0ZW0uZ2V0SW50KGNyLCBTZXR0aW5ncy5TeXN0ZW0uV0lGSV9VU0VfU1RBVElDX0lQKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChTZXR0aW5ncy5TZXR0aW5nTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFN0cmluZyBhZGRyID0gU2V0dGluZ3MuU3lzdGVtLmdldFN0cmluZyhjciwgU2V0dGluZ3MuU3lzdGVtLldJRklfU1RBVElDX0lQKTsKLSAgICAgICAgICAgIGlmIChhZGRyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtRGhjcEluZm8uaXBBZGRyZXNzID0gc3RyaW5nVG9JcEFkZHIoYWRkcik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFkZHIgPSBTZXR0aW5ncy5TeXN0ZW0uZ2V0U3RyaW5nKGNyLCBTZXR0aW5ncy5TeXN0ZW0uV0lGSV9TVEFUSUNfR0FURVdBWSk7Ci0gICAgICAgICAgICBpZiAoYWRkciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbURoY3BJbmZvLmdhdGV3YXkgPSBzdHJpbmdUb0lwQWRkcihhZGRyKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYWRkciA9IFNldHRpbmdzLlN5c3RlbS5nZXRTdHJpbmcoY3IsIFNldHRpbmdzLlN5c3RlbS5XSUZJX1NUQVRJQ19ORVRNQVNLKTsKLSAgICAgICAgICAgIGlmIChhZGRyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtRGhjcEluZm8ubmV0bWFzayA9IHN0cmluZ1RvSXBBZGRyKGFkZHIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhZGRyID0gU2V0dGluZ3MuU3lzdGVtLmdldFN0cmluZyhjciwgU2V0dGluZ3MuU3lzdGVtLldJRklfU1RBVElDX0ROUzEpOwotICAgICAgICAgICAgaWYgKGFkZHIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1EaGNwSW5mby5kbnMxID0gc3RyaW5nVG9JcEFkZHIoYWRkcik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFkZHIgPSBTZXR0aW5ncy5TeXN0ZW0uZ2V0U3RyaW5nKGNyLCBTZXR0aW5ncy5TeXN0ZW0uV0lGSV9TVEFUSUNfRE5TMik7Ci0gICAgICAgICAgICBpZiAoYWRkciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbURoY3BJbmZvLmRuczIgPSBzdHJpbmdUb0lwQWRkcihhZGRyKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbURoY3BJbmZvLmRuczIgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChVbmtub3duSG9zdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgbVVzZVN0YXRpY0lwID0gdHJ1ZTsKKyAgICAvKioKKyAgICAgKiBGZXRjaCBOZXR3b3JrUHJvcGVydGllcyBmb3IgdGhlIG5ldHdvcmsKKyAgICAgKi8KKyAgICBwdWJsaWMgTmV0d29ya1Byb3BlcnRpZXMgZ2V0TmV0d29ya1Byb3BlcnRpZXMoKSB7CisgICAgICAgIHJldHVybiBtTmV0d29ya1Byb3BlcnRpZXM7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IHN0cmluZ1RvSXBBZGRyKFN0cmluZyBhZGRyU3RyaW5nKSB0aHJvd3MgVW5rbm93bkhvc3RFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgU3RyaW5nW10gcGFydHMgPSBhZGRyU3RyaW5nLnNwbGl0KCJcXC4iKTsKLSAgICAgICAgICAgIGlmIChwYXJ0cy5sZW5ndGggIT0gNCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbmtub3duSG9zdEV4Y2VwdGlvbihhZGRyU3RyaW5nKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaW50IGEgPSBJbnRlZ2VyLnBhcnNlSW50KHBhcnRzWzBdKSAgICAgIDsKLSAgICAgICAgICAgIGludCBiID0gSW50ZWdlci5wYXJzZUludChwYXJ0c1sxXSkgPDwgIDg7Ci0gICAgICAgICAgICBpbnQgYyA9IEludGVnZXIucGFyc2VJbnQocGFydHNbMl0pIDw8IDE2OwotICAgICAgICAgICAgaW50IGQgPSBJbnRlZ2VyLnBhcnNlSW50KHBhcnRzWzNdKSA8PCAyNDsKLQotICAgICAgICAgICAgcmV0dXJuIGEgfCBiIHwgYyB8IGQ7Ci0gICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFVua25vd25Ib3N0RXhjZXB0aW9uKGFkZHJTdHJpbmcpOwotICAgICAgICB9CisgICAgLyoqCisgICAgICogRmV0Y2ggZGVmYXVsdCBnYXRld2F5IGFkZHJlc3MgZm9yIHRoZSBuZXR3b3JrCisgICAgICovCisgICAgcHVibGljIGludCBnZXREZWZhdWx0R2F0ZXdheUFkZHIoKSB7CisgICAgICAgIHJldHVybiBtRGVmYXVsdEdhdGV3YXlBZGRyLmdldCgpOwogICAgIH0KIAotICAgIHByaXZhdGUgaW50IGdldE1heERoY3BSZXRyaWVzKCkgewotICAgICAgICByZXR1cm4gU2V0dGluZ3MuU2VjdXJlLmdldEludChtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLldJRklfTUFYX0RIQ1BfUkVUUllfQ09VTlQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfTUFYX0RIQ1BfUkVUUklFUyk7CisgICAgLyoqCisgICAgICogQ2hlY2sgaWYgZGVmYXVsdCByb3V0ZSBpcyBzZXQKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHRSb3V0ZVNldCgpIHsKKyAgICAgICAgcmV0dXJuIG1EZWZhdWx0Um91dGVTZXQuZ2V0KCk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBjbGFzcyBTZXR0aW5nc09ic2VydmVyIGV4dGVuZHMgQ29udGVudE9ic2VydmVyIHsKLSAgICAgICAgcHVibGljIFNldHRpbmdzT2JzZXJ2ZXIoSGFuZGxlciBoYW5kbGVyKSB7Ci0gICAgICAgICAgICBzdXBlcihoYW5kbGVyKTsKLSAgICAgICAgICAgIENvbnRlbnRSZXNvbHZlciBjciA9IG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpOwotICAgICAgICAgICAgY3IucmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIoU2V0dGluZ3MuU3lzdGVtLmdldFVyaUZvcigKLSAgICAgICAgICAgICAgICBTZXR0aW5ncy5TeXN0ZW0uV0lGSV9VU0VfU1RBVElDX0lQKSwgZmFsc2UsIHRoaXMpOwotICAgICAgICAgICAgY3IucmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIoU2V0dGluZ3MuU3lzdGVtLmdldFVyaUZvcigKLSAgICAgICAgICAgICAgICBTZXR0aW5ncy5TeXN0ZW0uV0lGSV9TVEFUSUNfSVApLCBmYWxzZSwgdGhpcyk7Ci0gICAgICAgICAgICBjci5yZWdpc3RlckNvbnRlbnRPYnNlcnZlcihTZXR0aW5ncy5TeXN0ZW0uZ2V0VXJpRm9yKAotICAgICAgICAgICAgICAgIFNldHRpbmdzLlN5c3RlbS5XSUZJX1NUQVRJQ19HQVRFV0FZKSwgZmFsc2UsIHRoaXMpOwotICAgICAgICAgICAgY3IucmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIoU2V0dGluZ3MuU3lzdGVtLmdldFVyaUZvcigKLSAgICAgICAgICAgICAgICBTZXR0aW5ncy5TeXN0ZW0uV0lGSV9TVEFUSUNfTkVUTUFTSyksIGZhbHNlLCB0aGlzKTsKLSAgICAgICAgICAgIGNyLnJlZ2lzdGVyQ29udGVudE9ic2VydmVyKFNldHRpbmdzLlN5c3RlbS5nZXRVcmlGb3IoCi0gICAgICAgICAgICAgICAgU2V0dGluZ3MuU3lzdGVtLldJRklfU1RBVElDX0ROUzEpLCBmYWxzZSwgdGhpcyk7Ci0gICAgICAgICAgICBjci5yZWdpc3RlckNvbnRlbnRPYnNlcnZlcihTZXR0aW5ncy5TeXN0ZW0uZ2V0VXJpRm9yKAotICAgICAgICAgICAgICAgIFNldHRpbmdzLlN5c3RlbS5XSUZJX1NUQVRJQ19ETlMyKSwgZmFsc2UsIHRoaXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgb25DaGFuZ2UoYm9vbGVhbiBzZWxmQ2hhbmdlKSB7Ci0gICAgICAgICAgICBzdXBlci5vbkNoYW5nZShzZWxmQ2hhbmdlKTsKLQotICAgICAgICAgICAgYm9vbGVhbiB3YXNTdGF0aWNJcCA9IG1Vc2VTdGF0aWNJcDsKLSAgICAgICAgICAgIGludCBvSXAsIG9Hdywgb01zaywgb0RuczEsIG9EbnMyOwotICAgICAgICAgICAgb0lwID0gb0d3ID0gb01zayA9IG9EbnMxID0gb0RuczIgPSAwOwotICAgICAgICAgICAgaWYgKHdhc1N0YXRpY0lwKSB7Ci0gICAgICAgICAgICAgICAgb0lwID0gbURoY3BJbmZvLmlwQWRkcmVzczsKLSAgICAgICAgICAgICAgICBvR3cgPSBtRGhjcEluZm8uZ2F0ZXdheTsKLSAgICAgICAgICAgICAgICBvTXNrID0gbURoY3BJbmZvLm5ldG1hc2s7Ci0gICAgICAgICAgICAgICAgb0RuczEgPSBtRGhjcEluZm8uZG5zMTsKLSAgICAgICAgICAgICAgICBvRG5zMiA9IG1EaGNwSW5mby5kbnMyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2hlY2tVc2VTdGF0aWNJcCgpOwotCi0gICAgICAgICAgICBpZiAobVdpZmlJbmZvLmdldFN1cHBsaWNhbnRTdGF0ZSgpID09IFN1cHBsaWNhbnRTdGF0ZS5VTklOSVRJQUxJWkVEKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBib29sZWFuIGNoYW5nZWQgPQotICAgICAgICAgICAgICAgICh3YXNTdGF0aWNJcCAhPSBtVXNlU3RhdGljSXApIHx8Ci0gICAgICAgICAgICAgICAgICAgICh3YXNTdGF0aWNJcCAmJiAoCi0gICAgICAgICAgICAgICAgICAgICAgICBvSXAgICAhPSBtRGhjcEluZm8uaXBBZGRyZXNzIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICBvR3cgICAhPSBtRGhjcEluZm8uZ2F0ZXdheSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgb01zayAgIT0gbURoY3BJbmZvLm5ldG1hc2sgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIG9EbnMxICE9IG1EaGNwSW5mby5kbnMxIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICBvRG5zMiAhPSBtRGhjcEluZm8uZG5zMikpOwotCi0gICAgICAgICAgICBpZiAoY2hhbmdlZCkgewotICAgICAgICAgICAgICAgIHJlc2V0Q29ubmVjdGlvbnModHJ1ZSk7Ci0gICAgICAgICAgICAgICAgY29uZmlndXJlSW50ZXJmYWNlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKG1Vc2VTdGF0aWNJcCkgewotICAgICAgICAgICAgICAgICAgICBNZXNzYWdlIG1zZyA9IG1UYXJnZXQub2J0YWluTWVzc2FnZShFVkVOVF9DT05GSUdVUkFUSU9OX0NIQU5HRUQsIG1OZXR3b3JrSW5mbyk7Ci0gICAgICAgICAgICAgICAgICAgIG1zZy5zZW5kVG9UYXJnZXQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICAvKioKKyAgICAgKiBTZXQgYSBmbGFnIGluZGljYXRpbmcgZGVmYXVsdCByb3V0ZSBpcyBzZXQgZm9yIHRoZSBuZXR3b3JrCisgICAgICovCisgICAgcHVibGljIHZvaWQgZGVmYXVsdFJvdXRlU2V0KGJvb2xlYW4gZW5hYmxlZCkgeworICAgICAgICBtRGVmYXVsdFJvdXRlU2V0LnNldChlbmFibGVkKTsKICAgICB9CiAKLSAgICBwcml2YXRlIGNsYXNzIE5vdGlmaWNhdGlvbkVuYWJsZWRTZXR0aW5nT2JzZXJ2ZXIgZXh0ZW5kcyBDb250ZW50T2JzZXJ2ZXIgeworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc3lzdGVtIHByb3BlcnRpZXMgbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhlIHRjcCBidWZmZXIgc2l6ZXMKKyAgICAgKiBmb3IgdGhpcyBuZXR3b3JrLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGNwQnVmZmVyU2l6ZXNQcm9wTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuICJuZXQudGNwLmJ1ZmZlcnNpemUud2lmaSI7CisgICAgfQogCi0gICAgICAgIHB1YmxpYyBOb3RpZmljYXRpb25FbmFibGVkU2V0dGluZ09ic2VydmVyKEhhbmRsZXIgaGFuZGxlcikgewotICAgICAgICAgICAgc3VwZXIoaGFuZGxlcik7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCByZWdpc3RlcigpIHsKLSAgICAgICAgICAgIENvbnRlbnRSZXNvbHZlciBjciA9IG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpOwotICAgICAgICAgICAgY3IucmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIoU2V0dGluZ3MuU2VjdXJlLmdldFVyaUZvcigKLSAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuV0lGSV9ORVRXT1JLU19BVkFJTEFCTEVfTk9USUZJQ0FUSU9OX09OKSwgdHJ1ZSwgdGhpcyk7Ci0gICAgICAgICAgICBtTm90aWZpY2F0aW9uRW5hYmxlZCA9IGdldFZhbHVlKCk7Ci0gICAgICAgIH0KLQorICAgIHByaXZhdGUgY2xhc3MgV2lmaVN0YXRlUmVjZWl2ZXIgZXh0ZW5kcyBCcm9hZGNhc3RSZWNlaXZlciB7CiAgICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbkNoYW5nZShib29sZWFuIHNlbGZDaGFuZ2UpIHsKLSAgICAgICAgICAgIHN1cGVyLm9uQ2hhbmdlKHNlbGZDaGFuZ2UpOwotCi0gICAgICAgICAgICBtTm90aWZpY2F0aW9uRW5hYmxlZCA9IGdldFZhbHVlKCk7Ci0gICAgICAgICAgICBpZiAoIW1Ob3RpZmljYXRpb25FbmFibGVkKSB7Ci0gICAgICAgICAgICAgICAgLy8gUmVtb3ZlIGFueSBub3RpZmljYXRpb24gdGhhdCBtYXkgYmUgc2hvd2luZwotICAgICAgICAgICAgICAgIHNldE5vdGlmaWNhdGlvblZpc2libGUoZmFsc2UsIDAsIHRydWUsIDApOworICAgICAgICBwdWJsaWMgdm9pZCBvblJlY2VpdmUoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50KSB7CisgICAgICAgICAgIGlmIChpbnRlbnQuZ2V0QWN0aW9uKCkuZXF1YWxzKFdpZmlNYW5hZ2VyLk5FVFdPUktfU1RBVEVfQ0hBTkdFRF9BQ1RJT04pKSB7CisgICAgICAgICAgICAgICAgbU5ldHdvcmtJbmZvID0gKE5ldHdvcmtJbmZvKSBpbnRlbnQuZ2V0UGFyY2VsYWJsZUV4dHJhKAorICAgICAgICAgICAgICAgICAgICAgICAgV2lmaU1hbmFnZXIuRVhUUkFfTkVUV09SS19JTkZPKTsKKyAgICAgICAgICAgICAgICBtTmV0d29ya1Byb3BlcnRpZXMgPSAoTmV0d29ya1Byb3BlcnRpZXMpIGludGVudC5nZXRQYXJjZWxhYmxlRXh0cmEoCisgICAgICAgICAgICAgICAgICAgICAgICBXaWZpTWFuYWdlci5FWFRSQV9ORVRXT1JLX1BST1BFUlRJRVMpOworICAgICAgICAgICAgICAgIE1lc3NhZ2UgbXNnID0gbUNzSGFuZGxlci5vYnRhaW5NZXNzYWdlKEVWRU5UX1NUQVRFX0NIQU5HRUQsIG1OZXR3b3JrSW5mbyk7CisgICAgICAgICAgICAgICAgbXNnLnNlbmRUb1RhcmdldCgpOworICAgICAgICAgICAgfSBlbHNlIGlmIChpbnRlbnQuZ2V0QWN0aW9uKCkuZXF1YWxzKFdpZmlNYW5hZ2VyLkNPTkZJR19DSEFOR0VEX0FDVElPTikpIHsKKyAgICAgICAgICAgICAgICBtTmV0d29ya1Byb3BlcnRpZXMgPSAoTmV0d29ya1Byb3BlcnRpZXMpIGludGVudC5nZXRQYXJjZWxhYmxlRXh0cmEoCisgICAgICAgICAgICAgICAgICAgICAgICBXaWZpTWFuYWdlci5FWFRSQV9ORVRXT1JLX1BST1BFUlRJRVMpOworICAgICAgICAgICAgICAgIE1lc3NhZ2UgbXNnID0gbUNzSGFuZGxlci5vYnRhaW5NZXNzYWdlKEVWRU5UX0NPTkZJR1VSQVRJT05fQ0hBTkdFRCwgbU5ldHdvcmtJbmZvKTsKKyAgICAgICAgICAgICAgICBtc2cuc2VuZFRvVGFyZ2V0KCk7CiAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJlc2V0Tm90aWZpY2F0aW9uVGltZXIoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBnZXRWYWx1ZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBTZXR0aW5ncy5TZWN1cmUuZ2V0SW50KG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLAotICAgICAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuV0lGSV9ORVRXT1JLU19BVkFJTEFCTEVfTk9USUZJQ0FUSU9OX09OLCAxKSA9PSAxOwogICAgICAgICB9CiAgICAgfQorCiB9Cg==